ZGlmZiAtLWdpdCBhL3NyYy9iYXNlL2Jhc2VfcGF0aHNfc3RhcmJvYXJkLmNjIGIvc3JjL2Jhc2UvYmFzZV9wYXRoc19zdGFyYm9hcmQuY2MKaW5kZXggZmJhZDE3Ny4uMTVlN2IyMCAxMDA2NDQKLS0tIGEvc3JjL2Jhc2UvYmFzZV9wYXRoc19zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2Jhc2UvYmFzZV9wYXRoc19zdGFyYm9hcmQuY2MKQEAgLTkxLDcgKzkxLDYgQEAKICAgICAgIHJldHVybiBQYXRoUHJvdmlkZXJTdGFyYm9hcmQoYmFzZTo6RElSX0NBQ0hFLCByZXN1bHQpOwogICB9CiAKLSAgRExPRyhFUlJPUikgPDwgIkNvdWxkIG5vdCByZXNvbHZlIHBhdGggZm9yIGtleSA9ICIgPDwga2V5OwogICByZXR1cm4gZmFsc2U7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9iYXNlL3JhbmRfdXRpbC5jYyBiL3NyYy9iYXNlL3JhbmRfdXRpbC5jYwppbmRleCBhOWJjOTYxLi4wODEwMTQ5IDEwMDY0NAotLS0gYS9zcmMvYmFzZS9yYW5kX3V0aWwuY2MKKysrIGIvc3JjL2Jhc2UvcmFuZF91dGlsLmNjCkBAIC0xMSw2ICsxMSw3IEBACiAjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCiAKIG5hbWVzcGFjZSBiYXNlIHsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHkuZ3lwIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHkuZ3lwCmluZGV4IDE0OWQyNmYuLjUwZGU1MTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5Lmd5cAorKysgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvYWNjZXNzaWJpbGl0eS5neXAKQEAgLTIxLDggKzIxLDggQEAKICAgICAgICAgJ2ludGVybmFsL2xpdmVfcmVnaW9uLmgnLAogICAgICAgICAnaW50ZXJuYWwvdGV4dF9hbHRlcm5hdGl2ZV9oZWxwZXIuY2MnLAogICAgICAgICAnaW50ZXJuYWwvdGV4dF9hbHRlcm5hdGl2ZV9oZWxwZXIuaCcsCi0gICAgICAgICdmb2N1c19vYnNlcnZlci5jYycsCi0gICAgICAgICdmb2N1c19vYnNlcnZlci5oJywKKyAgICAgICAgJ3NjcmVlbl9yZWFkZXIuY2MnLAorICAgICAgICAnc2NyZWVuX3JlYWRlci5oJywKICAgICAgICAgJ3N0YXJib2FyZF90dHNfZW5naW5lLmNjJywKICAgICAgICAgJ3N0YXJib2FyZF90dHNfZW5naW5lLmgnLAogICAgICAgICAndGV4dF9hbHRlcm5hdGl2ZS5jYycsCkBAIC0zMiw2ICszMiw3IEBACiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbScsCiAgICAgICBdLAogICAgIH0sCiAgIF0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9hY2Nlc3NpYmlsaXR5X3Rlc3QuZ3lwIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHlfdGVzdC5neXAKaW5kZXggZTI4YThmMS4uOGRiOGU3OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHlfdGVzdC5neXAKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2FjY2Vzc2liaWxpdHlfdGVzdC5neXAKQEAgLTE3LDcgKzE3LDcgQEAKICAgICAgICd0YXJnZXRfbmFtZSc6ICdhY2Nlc3NpYmlsaXR5X3Rlc3QnLAogICAgICAgJ3R5cGUnOiAnPChndGVzdF90YXJnZXRfdHlwZSknLAogICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICd0ZXh0X2FsdGVybmF0aXZlX3Rlc3RzLmNjJywKKyAgICAgICAgJ3NjcmVlbl9yZWFkZXJfdGVzdHMuY2MnLAogICAgICAgICAnaW50ZXJuYWwvbGl2ZV9yZWdpb25fdGVzdC5jYycsCiAgICAgICAgICdpbnRlcm5hbC90ZXh0X2FsdGVybmF0aXZlX2hlbHBlcl90ZXN0LmNjJywKICAgICAgIF0sCkBAIC00MSw3ICs0MSw3IEBACiAgICAgICAgICAgICAnaW5wdXRfZmlsZXMnOiBbCiAgICAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS8nLAogICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICdvdXRwdXRfZGlyJzogJ2NvYmFsdC9hY2Nlc3NpYmlsaXR5X3Rlc3QnLAorICAgICAgICAgICAgJ291dHB1dF9kaXInOiAnY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvJywKICAgICAgICAgICB9LAogICAgICAgICAgICdpbmNsdWRlcyc6IFsnLi4vYnVpbGQvY29weV90ZXN0X2RhdGEuZ3lwaSddLAogICAgICAgICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvZm9jdXNfb2JzZXJ2ZXIuY2MgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvZm9jdXNfb2JzZXJ2ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ4ODRhMWYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ZvY3VzX29ic2VydmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L2ZvY3VzX29ic2VydmVyLmgiCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXh0X2FsdGVybmF0aXZlLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGFjY2Vzc2liaWxpdHkgewotRm9jdXNPYnNlcnZlcjo6Rm9jdXNPYnNlcnZlcihkb206OkRvY3VtZW50KiBkb2N1bWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxUVFNFbmdpbmU+IHR0c19lbmdpbmUpCi0gICAgOiBkb2N1bWVudF8oZG9jdW1lbnQpLCB0dHNfZW5naW5lXyh0dHNfZW5naW5lLlBhc3MoKSkgewotICBkb2N1bWVudF8tPkFkZE9ic2VydmVyKHRoaXMpOwotfQotCi1Gb2N1c09ic2VydmVyOjp+Rm9jdXNPYnNlcnZlcigpIHsgZG9jdW1lbnRfLT5SZW1vdmVPYnNlcnZlcih0aGlzKTsgfQotCi12b2lkIEZvY3VzT2JzZXJ2ZXI6Ok9uRm9jdXNDaGFuZ2VkKCkgewotICAvLyBUT0RPOiBPbmx5IHV0dGVyIHRleHQgaWYgdGV4dC10by1zcGVlY2ggaXMgZW5hYmxlZC4KLSAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IGVsZW1lbnQgPSBkb2N1bWVudF8tPmFjdGl2ZV9lbGVtZW50KCk7Ci0gIGlmIChlbGVtZW50KSB7Ci0gICAgc3RkOjpzdHJpbmcgdGV4dF9hbHRlcm5hdGl2ZSA9IENvbXB1dGVUZXh0QWx0ZXJuYXRpdmUoZWxlbWVudCk7Ci0gICAgdHRzX2VuZ2luZV8tPlNwZWFrTm93KHRleHRfYWx0ZXJuYXRpdmUpOwotICB9Ci19Ci19ICAvLyBuYW1lc3BhY2UgYWNjZXNzaWJpbGl0eQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ZvY3VzX29ic2VydmVyLmggYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvZm9jdXNfb2JzZXJ2ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2IwMDM0Zi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvZm9jdXNfb2JzZXJ2ZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDUwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ09CQUxUX0FDQ0VTU0lCSUxJVFlfRk9DVVNfT0JTRVJWRVJfSF8KLSNkZWZpbmUgQ09CQUxUX0FDQ0VTU0lCSUxJVFlfRk9DVVNfT0JTRVJWRVJfSF8KLQotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS90dHNfZW5naW5lLmgiCi0jaW5jbHVkZSAiY29iYWx0L2RvbS9kb2N1bWVudC5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBhY2Nlc3NpYmlsaXR5IHsKLS8vIEZvY3VzT2JzZXJ2ZXIgcmVnaXN0ZXJzIGFuIG9ic2VydmVyIG9uIHRoZSBkb2N1bWVudCBzdWNoIHRoYXQgaXQgY2FuIGJlCi0vLyBub3RpZmllZCB3aGVuZXZlciB0aGUgZG9jdW1lbnQncyBmb2N1c2VkIGVsZW1lbnQgY2hhbmdlcy4gVXBvbiBjaGFuZ2Ugb2YgdGhlCi0vLyBmb2N1c2VkIGVsZW1lbnQsIEZvY3VzT2JzZXJ2ZXIgd2lsbCBjYWxjdWxhdGUgdGhlIHRleHQgY29udGVudHMgb2YgdGhlIG5ld2x5Ci0vLyBmb2N1c2VkIGVsZW1lbnQgYW5kIHNlbmQgdGhhdCBzdHJpbmcgdG8gYSBUVFNFbmdpbmUuCi1jbGFzcyBGb2N1c09ic2VydmVyIDogcHVibGljIGRvbTo6RG9jdW1lbnRPYnNlcnZlciB7Ci0gcHVibGljOgotICBGb2N1c09ic2VydmVyKGRvbTo6RG9jdW1lbnQqIGRvY3VtZW50LCBzY29wZWRfcHRyPFRUU0VuZ2luZT4gdHRzX2VuZ2luZSk7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIH5Gb2N1c09ic2VydmVyKCk7Ci0gIHZvaWQgT25Mb2FkKCkgT1ZFUlJJREUge30KLSAgdm9pZCBPbk11dGF0aW9uKCkgT1ZFUlJJREUge30KLSAgdm9pZCBPbkZvY3VzQ2hhbmdlZCgpIE9WRVJSSURFOwotCi0gcHJpdmF0ZToKLSAgZG9tOjpEb2N1bWVudCogZG9jdW1lbnRfOwotICBzY29wZWRfcHRyPFRUU0VuZ2luZT4gdHRzX2VuZ2luZV87Ci0KLSAgZnJpZW5kIGNsYXNzIHNjb3BlZF9wdHI8Rm9jdXNPYnNlcnZlcj47Ci0gIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihGb2N1c09ic2VydmVyKTsKLX07Ci19ICAvLyBuYW1lc3BhY2UgYWNjZXNzaWJpbGl0eQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIENPQkFMVF9BQ0NFU1NJQklMSVRZX0ZPQ1VTX09CU0VSVkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvaW50ZXJuYWwvbGl2ZV9yZWdpb24uY2MgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvaW50ZXJuYWwvbGl2ZV9yZWdpb24uY2MKaW5kZXggZmI5Y2I2OC4uMmI5NDViMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL2xpdmVfcmVnaW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC9saXZlX3JlZ2lvbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC9saXZlX3JlZ2lvbi5oIgogCkBAIC0yMiw2ICsyMCw3IEBACiAjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdfc3BsaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2VsZW1lbnQuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgYWNjZXNzaWJpbGl0eSB7CkBAIC02OSwxNSArNjgsMTYgQEAKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyBzdGF0aWMKLXNjb3BlZF9wdHI8TGl2ZVJlZ2lvbj4gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvckVsZW1lbnQoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+JiBlbGVtZW50KSB7Ci0gIGlmICghZWxlbWVudCkgeworc2NvcGVkX3B0cjxMaXZlUmVnaW9uPiBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZSgKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6Tm9kZT4mIG5vZGUpIHsKKyAgaWYgKCFub2RlKSB7CiAgICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxMaXZlUmVnaW9uPihOVUxMKTsKICAgfQotICBpZiAoSGFzVmFsaWRMaXZlUmVnaW9uUHJvcGVydHkoZWxlbWVudCkpIHsKKyAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IGVsZW1lbnQgPSBub2RlLT5Bc0VsZW1lbnQoKTsKKyAgaWYgKGVsZW1lbnQgJiYgSGFzVmFsaWRMaXZlUmVnaW9uUHJvcGVydHkoZWxlbWVudCkpIHsKICAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyKG5ldyBMaXZlUmVnaW9uKGVsZW1lbnQpKTsKICAgfQotICByZXR1cm4gR2V0TGl2ZVJlZ2lvbkZvckVsZW1lbnQoZWxlbWVudC0+cGFyZW50X2VsZW1lbnQoKSk7CisgIHJldHVybiBHZXRMaXZlUmVnaW9uRm9yTm9kZShub2RlLT5wYXJlbnRfbm9kZSgpKTsKIH0KIAogYm9vbCBMaXZlUmVnaW9uOjpJc0Fzc2VydGl2ZSgpIGNvbnN0IHsKQEAgLTk1LDI5ICs5NSwzMSBAQAogICByZXR1cm4gYml0c2V0LnRlc3QobXV0YXRpb25fdHlwZSk7CiB9CiAKLWJvb2wgTGl2ZVJlZ2lvbjo6SXNBdG9taWMoY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+JiBlbGVtZW50KSBjb25zdCB7Citib29sIExpdmVSZWdpb246OklzQXRvbWljKGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpOb2RlPiYgbm9kZSkgY29uc3QgewogICAvLyBTdG9wIHNlYXJjaGluZyBpZiB3ZSBnbyBwYXN0IHRoZSBsaXZlIHJlZ2lvbidzIHJvb3Qgbm9kZS4gVGhlIGRlZmF1bHQgaXMKICAgLy8gbm9uLWF0b21pYy4KLSAgaWYgKCFlbGVtZW50IHx8IGVsZW1lbnQgPT0gcm9vdF8tPnBhcmVudF9lbGVtZW50KCkpIHsKKyAgaWYgKCFub2RlIHx8IG5vZGUgPT0gcm9vdF8tPnBhcmVudF9ub2RlKCkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQotICAvLyBTZWFyY2ggYW5jZXN0b3JzIG9mIHRoZSBjaGFuZ2VkIGVsZW1lbnQgdG8gZGV0ZXJtaW5lIGlmIHRoaXMgY2hhbmdlIGlzCi0gIC8vIGF0b21pYyBvciBub3QsIHBlciB0aGUgYWxnb3JpdGhtIGRlc2NyaWJlZCBpbiB0aGUgc3BlYy4KLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhL3N0YXRlc19hbmRfcHJvcGVydGllcyNhcmlhLWF0b21pYwotICBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4gYXJpYV9hdG9taWNfYXR0cmlidXRlID0KLSAgICAgIGVsZW1lbnQtPkdldEF0dHJpYnV0ZShiYXNlOjpUb2tlbnM6OmFyaWFfYXRvbWljKCkuY19zdHIoKSk7Ci0gIGlmIChhcmlhX2F0b21pY19hdHRyaWJ1dGUpIHsKLSAgICBpZiAoKmFyaWFfYXRvbWljX2F0dHJpYnV0ZSA9PSBiYXNlOjpUb2tlbnM6OnRydWVfdG9rZW4oKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIGlmICgqYXJpYV9hdG9taWNfYXR0cmlidXRlID09IGJhc2U6OlRva2Vuczo6ZmFsc2VfdG9rZW4oKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBETE9HKFdBUk5JTkcpIDw8ICJVbmV4cGVjdGVkIHRva2VuIGZvciBhcmlhLWF0b21pYzogIgotICAgICAgICAgICAgICAgICAgICA8PCAqYXJpYV9hdG9taWNfYXR0cmlidXRlOworICBpZiAobm9kZS0+SXNFbGVtZW50KCkpIHsKKyAgICBzY29wZWRfcmVmcHRyPGRvbTo6RWxlbWVudD4gZWxlbWVudCA9IG5vZGUtPkFzRWxlbWVudCgpOworICAgIC8vIFNlYXJjaCBhbmNlc3RvcnMgb2YgdGhlIGNoYW5nZWQgZWxlbWVudCB0byBkZXRlcm1pbmUgaWYgdGhpcyBjaGFuZ2UgaXMKKyAgICAvLyBhdG9taWMgb3Igbm90LCBwZXIgdGhlIGFsZ29yaXRobSBkZXNjcmliZWQgaW4gdGhlIHNwZWMuCisgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dhaS1hcmlhL3N0YXRlc19hbmRfcHJvcGVydGllcyNhcmlhLWF0b21pYworICAgIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBhcmlhX2F0b21pY19hdHRyaWJ1dGUgPQorICAgICAgICBlbGVtZW50LT5HZXRBdHRyaWJ1dGUoYmFzZTo6VG9rZW5zOjphcmlhX2F0b21pYygpLmNfc3RyKCkpOworICAgIGlmIChhcmlhX2F0b21pY19hdHRyaWJ1dGUpIHsKKyAgICAgIGlmICgqYXJpYV9hdG9taWNfYXR0cmlidXRlID09IGJhc2U6OlRva2Vuczo6dHJ1ZV90b2tlbigpKSB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmICgqYXJpYV9hdG9taWNfYXR0cmlidXRlID09IGJhc2U6OlRva2Vuczo6ZmFsc2VfdG9rZW4oKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJVbmV4cGVjdGVkIHRva2VuIGZvciBhcmlhLWF0b21pYzogIgorICAgICAgICAgICAgICAgICAgICAgIDw8ICphcmlhX2F0b21pY19hdHRyaWJ1dGU7CisgICAgICB9CiAgICAgfQogICB9Ci0gIHJldHVybiBJc0F0b21pYyhlbGVtZW50LT5wYXJlbnRfZWxlbWVudCgpKTsKKyAgcmV0dXJuIElzQXRvbWljKG5vZGUtPnBhcmVudF9ub2RlKCkpOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC9saXZlX3JlZ2lvbi5oIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL2xpdmVfcmVnaW9uLmgKaW5kZXggZDM5Y2EyYi4uNTJkNDBlZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL2xpdmVfcmVnaW9uLmgKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL2xpdmVfcmVnaW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BQ0NFU1NJQklMSVRZX0lOVEVSTkFMX0xJVkVfUkVHSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9BQ0NFU1NJQklMSVRZX0lOVEVSTkFMX0xJVkVfUkVHSU9OX0hfCkBAIC0yMCw3ICsxOCw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgotI2luY2x1ZGUgImNvYmFsdC9kb20vZWxlbWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vbm9kZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBhY2Nlc3NpYmlsaXR5IHsKQEAgLTQ1LDggKzQzLDggQEAKICAgLy8KICAgLy8gU2VhcmNoZXMgdGhlIGVsZW1lbnQncyBhbmNlc3RvcnMgbG9va2luZyBmb3IgdGhlIGZpcnN0IGVsZW1lbnQgd2l0aCBhCiAgIC8vIHZhbGlkIGFyaWEtbGl2ZSBhdHRyaWJ1dGUuCi0gIHN0YXRpYyBzY29wZWRfcHRyPExpdmVSZWdpb24+IEdldExpdmVSZWdpb25Gb3JFbGVtZW50KAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+JiBlbGVtZW50KTsKKyAgc3RhdGljIHNjb3BlZF9wdHI8TGl2ZVJlZ2lvbj4gR2V0TGl2ZVJlZ2lvbkZvck5vZGUoCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6Tm9kZT4mIG5vZGUpOwogCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgdmFsdWUgb2YgYXJpYS1saXZlIGlzICJhc3NlcnRpdmUiLgogICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMS9DUi13YWktYXJpYS0yMDExMDExOC9zdGF0ZXNfYW5kX3Byb3BlcnRpZXMjYXJpYS1saXZlCkBAIC01OCwxMiArNTYsMTIgQEAKICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTEvQ1Itd2FpLWFyaWEtMjAxMTAxMTgvc3RhdGVzX2FuZF9wcm9wZXJ0aWVzI2FyaWEtcmVsZXZhbnQKICAgYm9vbCBJc011dGF0aW9uUmVsZXZhbnQoTXV0YXRpb25UeXBlIG11dGF0aW9uX3R5cGUpIGNvbnN0OwogCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBjaGFuZ2VzIHRvIHRoaXMgZWxlbWVudCBzaG91bGQgcmVzdWx0IGluIGFuIGF0b21pYyB1cGRhdGUKKyAgLy8gUmV0dXJucyB0cnVlIGlmIGNoYW5nZXMgdG8gdGhpcyBub2RlIHNob3VsZCByZXN1bHQgaW4gYW4gYXRvbWljIHVwZGF0ZQogICAvLyB0byBpdHMgbGl2ZSByZWdpb24sIGFjY29yZGluZyB0byB0aGUgdmFsdWUgb2YgdGhlIGFyaWEtYXRvbWljIHByb3BlcnR5IHNldAotICAvLyBvbiB0aGlzIGVsZW1lbnQgb3IgaXRzIGFuY2VzdG9ycywgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgbGl2ZSByZWdpb24gcm9vdC4KKyAgLy8gb24gdGhpcyBub2RlIG9yIGl0cyBhbmNlc3RvcnMsIHVwIHRvIGFuZCBpbmNsdWRpbmcgdGhlIGxpdmUgcmVnaW9uIHJvb3QuCiAgIC8vCiAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDExL0NSLXdhaS1hcmlhLTIwMTEwMTE4L3N0YXRlc19hbmRfcHJvcGVydGllcyNhcmlhLWF0b21pYwotICBib29sIElzQXRvbWljKGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpFbGVtZW50PiYgZWxlbWVudCkgY29uc3Q7CisgIGJvb2wgSXNBdG9taWMoY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206Ok5vZGU+JiBub2RlKSBjb25zdDsKIAogICAvLyBSZXR1cm5zIHRoZSByb290IG9mIHRoZSBsaXZlIHJlZ2lvbiAoaS5lLikgdGhlIGVsZW1lbnQgdGhhdCBoYXMgdGhlCiAgIC8vIGFyaWEtbGl2ZSBwcm9wZXJ0eSBzZXQgb24gaXQuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvaW50ZXJuYWwvbGl2ZV9yZWdpb25fdGVzdC5jYyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC9saXZlX3JlZ2lvbl90ZXN0LmNjCmluZGV4IGNmYjkyMzAuLjZjYjhjMDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC9saXZlX3JlZ2lvbl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC9saXZlX3JlZ2lvbl90ZXN0LmNjCkBAIC0xLDIyICsxLDIxIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL2xpdmVfcmVnaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbGVtZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3Rlc3QvZW1wdHlfZG9jdW1lbnQuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKQEAgLTQ1LDIxICs0NCwyMSBAQAogICAgICAgQ3JlYXRlTGl2ZVJlZ2lvbihiYXNlOjpUb2tlbnM6OnBvbGl0ZSgpLmNfc3RyKCkpOwogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbl9lbGVtZW50KTsKIAotICAvLyBHZXRMaXZlUmVnaW9uRm9yRWxlbWVudCB3aXRoIHRoZSBsaXZlIHJlZ2lvbiByb290LgotICBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JFbGVtZW50KGxpdmVfcmVnaW9uX2VsZW1lbnQpOworICAvLyBHZXRMaXZlUmVnaW9uRm9yTm9kZSB3aXRoIHRoZSBsaXZlIHJlZ2lvbiByb290LgorICBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JOb2RlKGxpdmVfcmVnaW9uX2VsZW1lbnQpOwogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbik7CiAgIEVYUEVDVF9FUShsaXZlX3JlZ2lvbi0+cm9vdCgpLCBsaXZlX3JlZ2lvbl9lbGVtZW50KTsKIAotICAvLyBHZXRMaXZlUmVnaW9uRm9yRWxlbWVudCB3aXRoIGEgZGVzY2VuZGVudCBub2RlIG9mIGEgbGl2ZSByZWdpb24uCisgIC8vIEdldExpdmVSZWdpb25Gb3JOb2RlIHdpdGggYSBkZXNjZW5kZW50IG5vZGUgb2YgYSBsaXZlIHJlZ2lvbi4KICAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IGNoaWxkID0gZG9jdW1lbnQoKS0+Q3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgIGxpdmVfcmVnaW9uX2VsZW1lbnQtPkFwcGVuZENoaWxkKGNoaWxkKTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChjaGlsZCk7CisgIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvck5vZGUoY2hpbGQpOwogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbik7CiAgIEVYUEVDVF9FUShsaXZlX3JlZ2lvbi0+cm9vdCgpLCBsaXZlX3JlZ2lvbl9lbGVtZW50KTsKIAogICAvLyBFbGVtZW50IHRoYXQgaXMgbm90IGluIGEgbGl2ZSByZWdpb24uCiAgIHNjb3BlZF9yZWZwdHI8ZG9tOjpFbGVtZW50PiBub3RfbGl2ZSA9IGRvY3VtZW50KCktPkNyZWF0ZUVsZW1lbnQoImRpdiIpOwotICBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JFbGVtZW50KG5vdF9saXZlKTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShub3RfbGl2ZSk7CiAgIEVYUEVDVF9GQUxTRShsaXZlX3JlZ2lvbik7CiB9CiAKQEAgLTc2LDE1ICs3NSwxNCBAQAogICAvLyBUaGUgY2xvc2VzdCBhbmNlc3RvciBsaXZlIHJlZ2lvbiBpcyB0aGlzIGVsZW1lbnQncyBsaXZlIHJlZ2lvbi4KICAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IGNoaWxkID0gZG9jdW1lbnQoKS0+Q3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgIG5lc3RlZF9yZWdpb25fZWxlbWVudC0+QXBwZW5kQ2hpbGQoY2hpbGQpOwotICBzY29wZWRfcHRyPExpdmVSZWdpb24+IGxpdmVfcmVnaW9uID0KLSAgICAgIExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JFbGVtZW50KGNoaWxkKTsKKyAgc2NvcGVkX3B0cjxMaXZlUmVnaW9uPiBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JOb2RlKGNoaWxkKTsKICAgQVNTRVJUX1RSVUUobGl2ZV9yZWdpb24pOwogICBFWFBFQ1RfRVEobGl2ZV9yZWdpb24tPnJvb3QoKSwgbmVzdGVkX3JlZ2lvbl9lbGVtZW50KTsKIAogICAvLyBJZ25vcmUgbGl2ZSByZWdpb25zIHRoYXQgYXJlIG5vdCBhY3RpdmUuCiAgIG5lc3RlZF9yZWdpb25fZWxlbWVudC0+U2V0QXR0cmlidXRlKGJhc2U6OlRva2Vuczo6YXJpYV9saXZlKCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VG9rZW5zOjpvZmYoKS5jX3N0cigpKTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChjaGlsZCk7CisgIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvck5vZGUoY2hpbGQpOwogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbik7CiAgIEVYUEVDVF9FUShsaXZlX3JlZ2lvbi0+cm9vdCgpLCBsaXZlX3JlZ2lvbl9lbGVtZW50KTsKIH0KQEAgLTk2LDcgKzk0LDcgQEAKICAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IHBvbGl0ZV9lbGVtZW50ID0KICAgICAgIENyZWF0ZUxpdmVSZWdpb24oYmFzZTo6VG9rZW5zOjpwb2xpdGUoKS5jX3N0cigpKTsKICAgQVNTRVJUX1RSVUUocG9saXRlX2VsZW1lbnQpOwotICBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JFbGVtZW50KHBvbGl0ZV9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShwb2xpdGVfZWxlbWVudCk7CiAgIEFTU0VSVF9UUlVFKGxpdmVfcmVnaW9uKTsKICAgRVhQRUNUX0ZBTFNFKGxpdmVfcmVnaW9uLT5Jc0Fzc2VydGl2ZSgpKTsKIApAQCAtMTA0LDcgKzEwMiw3IEBACiAgIHNjb3BlZF9yZWZwdHI8ZG9tOjpFbGVtZW50PiBhc3NlcnRpdmVfZWxlbWVudCA9CiAgICAgICBDcmVhdGVMaXZlUmVnaW9uKGJhc2U6OlRva2Vuczo6YXNzZXJ0aXZlKCkuY19zdHIoKSk7CiAgIEFTU0VSVF9UUlVFKGFzc2VydGl2ZV9lbGVtZW50KTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChhc3NlcnRpdmVfZWxlbWVudCk7CisgIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvck5vZGUoYXNzZXJ0aXZlX2VsZW1lbnQpOwogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbik7CiAgIEVYUEVDVF9UUlVFKGxpdmVfcmVnaW9uLT5Jc0Fzc2VydGl2ZSgpKTsKIApAQCAtMTEyLDEzICsxMTAsMTMgQEAKICAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IG9mZl9lbGVtZW50ID0KICAgICAgIENyZWF0ZUxpdmVSZWdpb24oYmFzZTo6VG9rZW5zOjpvZmYoKS5jX3N0cigpKTsKICAgQVNTRVJUX1RSVUUob2ZmX2VsZW1lbnQpOwotICBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JFbGVtZW50KG9mZl9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShvZmZfZWxlbWVudCk7CiAgIEVYUEVDVF9GQUxTRShsaXZlX3JlZ2lvbik7CiAKICAgLy8gYXJpYS1saXZlPTxpbnZhbGlkIHRva2VuPgogICBzY29wZWRfcmVmcHRyPGRvbTo6RWxlbWVudD4gaW52YWxpZF9lbGVtZW50ID0gQ3JlYXRlTGl2ZVJlZ2lvbigiYmFuYW5hIik7CiAgIEFTU0VSVF9UUlVFKGludmFsaWRfZWxlbWVudCk7Ci0gIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvckVsZW1lbnQoaW52YWxpZF9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShpbnZhbGlkX2VsZW1lbnQpOwogICBFWFBFQ1RfRkFMU0UobGl2ZV9yZWdpb24pOwogfQogCkBAIC0xMjcsOSArMTI1LDkgQEAKICAgICAgIENyZWF0ZUxpdmVSZWdpb24oYmFzZTo6VG9rZW5zOjpwb2xpdGUoKS5jX3N0cigpKTsKICAgQVNTRVJUX1RSVUUobGl2ZV9yZWdpb25fZWxlbWVudCk7CiAKLSAgLy8gR2V0TGl2ZVJlZ2lvbkZvckVsZW1lbnQgd2l0aCB0aGUgbGl2ZSByZWdpb24gcm9vdC4KKyAgLy8gR2V0TGl2ZVJlZ2lvbkZvck5vZGUgd2l0aCB0aGUgbGl2ZSByZWdpb24gcm9vdC4KICAgc2NvcGVkX3B0cjxMaXZlUmVnaW9uPiBsaXZlX3JlZ2lvbiA9Ci0gICAgICBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChsaXZlX3JlZ2lvbl9lbGVtZW50KTsKKyAgICAgIExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JOb2RlKGxpdmVfcmVnaW9uX2VsZW1lbnQpOwogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbik7CiAgIC8vIERlZmF1bHQgaXMgdGhhdCBhZGRpdGlvbnMgYW5kIHRleHQgYXJlIHJlbGV2YW50LgogICBFWFBFQ1RfVFJVRSgKQEAgLTE0MSw3ICsxMzksNyBAQAogICAvLyBPbmx5IHJlbW92YWxzIGFyZSByZWxldmFudC4KICAgbGl2ZV9yZWdpb25fZWxlbWVudC0+U2V0QXR0cmlidXRlKGJhc2U6OlRva2Vuczo6YXJpYV9yZWxldmFudCgpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVtb3ZhbHMiKTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChsaXZlX3JlZ2lvbl9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShsaXZlX3JlZ2lvbl9lbGVtZW50KTsKICAgQVNTRVJUX1RSVUUobGl2ZV9yZWdpb24pOwogICBFWFBFQ1RfRkFMU0UoCiAgICAgICBsaXZlX3JlZ2lvbi0+SXNNdXRhdGlvblJlbGV2YW50KExpdmVSZWdpb246OmtNdXRhdGlvblR5cGVBZGRpdGlvbikpOwpAQCAtMTUyLDcgKzE1MCw3IEBACiAgIC8vIFJlbW92YWxzIGFuZCBhZGRpdGlvbnMgYXJlIHJlbGV2YW50LgogICBsaXZlX3JlZ2lvbl9lbGVtZW50LT5TZXRBdHRyaWJ1dGUoYmFzZTo6VG9rZW5zOjphcmlhX3JlbGV2YW50KCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZW1vdmFscyBhZGRpdGlvbnMiKTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChsaXZlX3JlZ2lvbl9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShsaXZlX3JlZ2lvbl9lbGVtZW50KTsKICAgQVNTRVJUX1RSVUUobGl2ZV9yZWdpb24pOwogICBFWFBFQ1RfVFJVRSgKICAgICAgIGxpdmVfcmVnaW9uLT5Jc011dGF0aW9uUmVsZXZhbnQoTGl2ZVJlZ2lvbjo6a011dGF0aW9uVHlwZUFkZGl0aW9uKSk7CkBAIC0xNjMsNyArMTYxLDcgQEAKICAgLy8gQW4gaW52YWxpZCB0b2tlbi4KICAgbGl2ZV9yZWdpb25fZWxlbWVudC0+U2V0QXR0cmlidXRlKGJhc2U6OlRva2Vuczo6YXJpYV9yZWxldmFudCgpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dCBkb2cgYWRkaXRpb25zIik7Ci0gIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvckVsZW1lbnQobGl2ZV9yZWdpb25fZWxlbWVudCk7CisgIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvck5vZGUobGl2ZV9yZWdpb25fZWxlbWVudCk7CiAgIEFTU0VSVF9UUlVFKGxpdmVfcmVnaW9uKTsKICAgRVhQRUNUX1RSVUUoCiAgICAgICBsaXZlX3JlZ2lvbi0+SXNNdXRhdGlvblJlbGV2YW50KExpdmVSZWdpb246OmtNdXRhdGlvblR5cGVBZGRpdGlvbikpOwpAQCAtMTc0LDcgKzE3Miw3IEBACiAgIC8vICJhbGwiIHRva2VuLgogICBsaXZlX3JlZ2lvbl9lbGVtZW50LT5TZXRBdHRyaWJ1dGUoYmFzZTo6VG9rZW5zOjphcmlhX3JlbGV2YW50KCkuY19zdHIoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbGwiKTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChsaXZlX3JlZ2lvbl9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShsaXZlX3JlZ2lvbl9lbGVtZW50KTsKICAgQVNTRVJUX1RSVUUobGl2ZV9yZWdpb24pOwogICBFWFBFQ1RfVFJVRSgKICAgICAgIGxpdmVfcmVnaW9uLT5Jc011dGF0aW9uUmVsZXZhbnQoTGl2ZVJlZ2lvbjo6a011dGF0aW9uVHlwZUFkZGl0aW9uKSk7CkBAIC0xOTEsMjEgKzE4OSwyMSBAQAogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbl9lbGVtZW50KTsKIAogICAvLyBEZWZhdWx0IGlzIG5vbi1hdG9taWMuCi0gIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvckVsZW1lbnQobGl2ZV9yZWdpb25fZWxlbWVudCk7CisgIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvck5vZGUobGl2ZV9yZWdpb25fZWxlbWVudCk7CiAgIEFTU0VSVF9UUlVFKGxpdmVfcmVnaW9uKTsKICAgRVhQRUNUX0ZBTFNFKGxpdmVfcmVnaW9uLT5Jc0F0b21pYyhsaXZlX3JlZ2lvbl9lbGVtZW50KSk7CiAKICAgLy8gYXJpYS1hdG9taWM9dHJ1ZQogICBsaXZlX3JlZ2lvbl9lbGVtZW50LT5TZXRBdHRyaWJ1dGUoYmFzZTo6VG9rZW5zOjphcmlhX2F0b21pYygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ1ZSIpOwotICBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JFbGVtZW50KGxpdmVfcmVnaW9uX2VsZW1lbnQpOworICBsaXZlX3JlZ2lvbiA9IExpdmVSZWdpb246OkdldExpdmVSZWdpb25Gb3JOb2RlKGxpdmVfcmVnaW9uX2VsZW1lbnQpOwogICBBU1NFUlRfVFJVRShsaXZlX3JlZ2lvbik7CiAgIEVYUEVDVF9UUlVFKGxpdmVfcmVnaW9uLT5Jc0F0b21pYyhsaXZlX3JlZ2lvbl9lbGVtZW50KSk7CiAKICAgLy8gYXJpYS1hdG9taWM9ZmFsc2UKICAgbGl2ZV9yZWdpb25fZWxlbWVudC0+U2V0QXR0cmlidXRlKGJhc2U6OlRva2Vuczo6YXJpYV9hdG9taWMoKS5jX3N0cigpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZhbHNlIik7Ci0gIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvckVsZW1lbnQobGl2ZV9yZWdpb25fZWxlbWVudCk7CisgIGxpdmVfcmVnaW9uID0gTGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvck5vZGUobGl2ZV9yZWdpb25fZWxlbWVudCk7CiAgIEFTU0VSVF9UUlVFKGxpdmVfcmVnaW9uKTsKICAgRVhQRUNUX0ZBTFNFKGxpdmVfcmVnaW9uLT5Jc0F0b21pYyhsaXZlX3JlZ2lvbl9lbGVtZW50KSk7CiAKQEAgLTIxNCw3ICsyMTIsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRydWUiKTsKICAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IGNoaWxkID0gZG9jdW1lbnQoKS0+Q3JlYXRlRWxlbWVudCgiZGl2Iik7CiAgIGxpdmVfcmVnaW9uX2VsZW1lbnQtPkFwcGVuZENoaWxkKGNoaWxkKTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChsaXZlX3JlZ2lvbl9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShsaXZlX3JlZ2lvbl9lbGVtZW50KTsKICAgQVNTRVJUX1RSVUUobGl2ZV9yZWdpb24pOwogICBFWFBFQ1RfVFJVRShsaXZlX3JlZ2lvbi0+SXNBdG9taWMoY2hpbGQpKTsKICAgRVhQRUNUX1RSVUUobGl2ZV9yZWdpb24tPklzQXRvbWljKGxpdmVfcmVnaW9uX2VsZW1lbnQpKTsKQEAgLTIyMyw3ICsyMjEsNyBAQAogICBsaXZlX3JlZ2lvbl9lbGVtZW50LT5TZXRBdHRyaWJ1dGUoYmFzZTo6VG9rZW5zOjphcmlhX2F0b21pYygpLmNfc3RyKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidHJ1ZSIpOwogICBjaGlsZC0+U2V0QXR0cmlidXRlKGJhc2U6OlRva2Vuczo6YXJpYV9hdG9taWMoKS5jX3N0cigpLCAiZmFsc2UiKTsKLSAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yRWxlbWVudChsaXZlX3JlZ2lvbl9lbGVtZW50KTsKKyAgbGl2ZV9yZWdpb24gPSBMaXZlUmVnaW9uOjpHZXRMaXZlUmVnaW9uRm9yTm9kZShsaXZlX3JlZ2lvbl9lbGVtZW50KTsKICAgQVNTRVJUX1RSVUUobGl2ZV9yZWdpb24pOwogICBFWFBFQ1RfRkFMU0UobGl2ZV9yZWdpb24tPklzQXRvbWljKGNoaWxkKSk7CiAgIEVYUEVDVF9UUlVFKGxpdmVfcmVnaW9uLT5Jc0F0b21pYyhsaXZlX3JlZ2lvbl9lbGVtZW50KSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvaW50ZXJuYWwvdGV4dF9hbHRlcm5hdGl2ZV9oZWxwZXIuY2MgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvaW50ZXJuYWwvdGV4dF9hbHRlcm5hdGl2ZV9oZWxwZXIuY2MKaW5kZXggNTNhYWE4ZC4uYzY5Y2FiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL3RleHRfYWx0ZXJuYXRpdmVfaGVscGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC90ZXh0X2FsdGVybmF0aXZlX2hlbHBlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC90ZXh0X2FsdGVybmF0aXZlX2hlbHBlci5oIgogCkBAIC04MSw4ICs3OSwyNiBAQAogfSAgLy8gbmFtZXNwYWNlCiAKIHZvaWQgVGV4dEFsdGVybmF0aXZlSGVscGVyOjpBcHBlbmRUZXh0QWx0ZXJuYXRpdmUoCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+JiBlbGVtZW50KSB7Ci0gIERDSEVDSyhlbGVtZW50KTsKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6Tm9kZT4mIG5vZGUpIHsKKyAgRENIRUNLKG5vZGUpOworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNC9SRUMtd2FpLWFyaWEtaW1wbGVtZW50YXRpb24tMjAxNDAzMjAvI21hcHBpbmdfYWRkaXRpb25hbF9uZF90ZQorICAvLyA1LjYuMS4zLiBUZXh0IEFsdGVybmF0aXZlIENvbXB1dGF0aW9uCisKKyAgaWYgKG5vZGUtPklzVGV4dCgpKSB7CisgICAgLy8gUnVsZSAzRAorICAgIC8vIEdldCB0aGUgY29udGVudHMgb2YgdGhlIHRleHQgbm9kZS4KKyAgICBpZiAobm9kZS0+dGV4dF9jb250ZW50KCkpIHsKKyAgICAgIEFwcGVuZFRleHRJZk5vbkVtcHR5KCpub2RlLT50ZXh0X2NvbnRlbnQoKSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIHNjb3BlZF9yZWZwdHI8ZG9tOjpFbGVtZW50PiBlbGVtZW50ID0gbm9kZS0+QXNFbGVtZW50KCk7CisgIGlmICghZWxlbWVudCkgeworICAgIC8vIFNpbmNlIHRoaXMgaXMgbmVpdGhlciBhIFRleHQgb3IgRWxlbWVudCwgaWdub3JlIGl0LgorICAgIHJldHVybjsKKyAgfQorCiAgIGlmICh2aXNpdGVkX2VsZW1lbnRfaWRzXy5maW5kKGVsZW1lbnQtPmlkKCkpICE9IHZpc2l0ZWRfZWxlbWVudF9pZHNfLmVuZCgpKSB7CiAgICAgRExPRyhJTkZPKSA8PCAiU2tpcHBpbmcgZWxlbWVudCB0byBwcmV2ZW50IHJlZmVyZW5jZSBsb29wOiAiCiAgICAgICAgICAgICAgICA8PCBlbGVtZW50LT5pZCgpOwpAQCAtOTEsOSArMTA3LDYgQEAKIAogICBTY29wZWRJZFNldE1lbWJlciBzY29wZWRfaWRfc2V0X21lbWJlcigmdmlzaXRlZF9lbGVtZW50X2lkc18sIGVsZW1lbnQtPmlkKCkpOwogCi0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE0L1JFQy13YWktYXJpYS1pbXBsZW1lbnRhdGlvbi0yMDE0MDMyMC8jbWFwcGluZ19hZGRpdGlvbmFsX25kX3RlCi0gIC8vIDUuNi4xLjMuIFRleHQgQWx0ZXJuYXRpdmUgQ29tcHV0YXRpb24KLQogICAvLyBSdWxlIDEKICAgLy8gU2tpcCBoaWRkZW4gZWxlbWVudHMgdW5sZXNzIHRoZSBhdXRob3Igc3BlY2lmaWVzIHRvIHVzZSB0aGVtIHZpYSBhbgogICAvLyBhcmlhLWxhYmVsbGVkYnkgb3IgYXJpYS1kZXNjcmliZWRieSBiZWluZyB1c2VkIGluIHRoZSBjdXJyZW50IGNvbXB1dGF0aW9uLgpAQCAtMTY1LDE1ICsxNzgsNyBAQAogICBzY29wZWRfcmVmcHRyPGRvbTo6Tm9kZUxpc3Q+IGNoaWxkcmVuID0gZWxlbWVudC0+Y2hpbGRfbm9kZXMoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjaGlsZHJlbi0+bGVuZ3RoKCk7ICsraSkgewogICAgIHNjb3BlZF9yZWZwdHI8ZG9tOjpOb2RlPiBjaGlsZCA9IGNoaWxkcmVuLT5JdGVtKGkpOwotICAgIGlmIChjaGlsZC0+SXNFbGVtZW50KCkpIHsKLSAgICAgIEFwcGVuZFRleHRBbHRlcm5hdGl2ZShjaGlsZC0+QXNFbGVtZW50KCkpOwotICAgIH0gZWxzZSBpZiAoY2hpbGQtPklzVGV4dCgpKSB7Ci0gICAgICAvLyBSdWxlIDNECi0gICAgICAvLyBHZXQgdGhlIGNvbnRlbnRzIG9mIHRoZSB0ZXh0IG5vZGUuCi0gICAgICBpZiAoY2hpbGQtPnRleHRfY29udGVudCgpKSB7Ci0gICAgICAgIEFwcGVuZFRleHRJZk5vbkVtcHR5KCpjaGlsZC0+dGV4dF9jb250ZW50KCkpOwotICAgICAgfQotICAgIH0KKyAgICBBcHBlbmRUZXh0QWx0ZXJuYXRpdmUoY2hpbGQpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC90ZXh0X2FsdGVybmF0aXZlX2hlbHBlci5oIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL3RleHRfYWx0ZXJuYXRpdmVfaGVscGVyLmgKaW5kZXggOGI5MzVhNC4uNzIxYTU4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL3RleHRfYWx0ZXJuYXRpdmVfaGVscGVyLmgKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL3RleHRfYWx0ZXJuYXRpdmVfaGVscGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BQ0NFU1NJQklMSVRZX0lOVEVSTkFMX1RFWFRfQUxURVJOQVRJVkVfSEVMUEVSX0hfCiAjZGVmaW5lIENPQkFMVF9BQ0NFU1NJQklMSVRZX0lOVEVSTkFMX1RFWFRfQUxURVJOQVRJVkVfSEVMUEVSX0hfCkBAIC0zNCw3ICszMiw3IEBACiBjbGFzcyBUZXh0QWx0ZXJuYXRpdmVIZWxwZXIgewogIHB1YmxpYzoKICAgVGV4dEFsdGVybmF0aXZlSGVscGVyKCkgOiBpbl9sYWJlbGxlZF9ieV8oZmFsc2UpIHt9Ci0gIHZvaWQgQXBwZW5kVGV4dEFsdGVybmF0aXZlKGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpFbGVtZW50PiYgZWxlbWVudCk7CisgIHZvaWQgQXBwZW5kVGV4dEFsdGVybmF0aXZlKGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpOb2RlPiYgbm9kZSk7CiAKICAgLy8gUmV0dXJuIHRoZSBhY2N1bXVsYXRlZCBhbHRlcm5hdGl2ZXMgam9pbmVkIGJ5IGEgc2luZ2xlIHNwYWNlIGNoYXJhY3Rlci4KICAgc3RkOjpzdHJpbmcgR2V0VGV4dEFsdGVybmF0aXZlKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvaW50ZXJuYWwvdGV4dF9hbHRlcm5hdGl2ZV9oZWxwZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC90ZXh0X2FsdGVybmF0aXZlX2hlbHBlcl90ZXN0LmNjCmluZGV4IDE2ODZkZjguLjVjZTk4MGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC90ZXh0X2FsdGVybmF0aXZlX2hlbHBlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9pbnRlcm5hbC90ZXh0X2FsdGVybmF0aXZlX2hlbHBlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3NjcmVlbl9yZWFkZXIuY2MgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvc2NyZWVuX3JlYWRlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjRiNWU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3NjcmVlbl9yZWFkZXIuY2MKQEAgLTAsMCArMSwxNTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS9zY3JlZW5fcmVhZGVyLmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L2ludGVybmFsL2xpdmVfcmVnaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2FjY2Vzc2liaWxpdHkvdGV4dF9hbHRlcm5hdGl2ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZWxlbWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9ib2R5X2VsZW1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL25vZGVfbGlzdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBhY2Nlc3NpYmlsaXR5IHsKK25hbWVzcGFjZSB7CisvLyBXaGVuIHRleHQgaXMgcmVtb3ZlZCBmcm9tIGEgbGl2ZSByZWdpb24sIGFkZCB0aGUgd29yZCAiUmVtb3ZlZCIgdG8gaW5kaWNhdGUKKy8vIHRoYXQgdGhlIHRleHQgaGFzIGJlZW4gcmVtb3ZlZC4KKy8vIFRPRE86IFN1cHBvcnQgb3RoZXIgbGFuZ3VhZ2VzLgorY29uc3QgY2hhciBrUmVtb3ZlZEZvcm1hdFN0cmluZ1tdID0gIlJlbW92ZWQuICVzIjsKK30KKworU2NyZWVuUmVhZGVyOjpTY3JlZW5SZWFkZXIoZG9tOjpEb2N1bWVudCogZG9jdW1lbnQsIFRUU0VuZ2luZSogdHRzX2VuZ2luZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbTo6TXV0YXRpb25PYnNlcnZlclRhc2tNYW5hZ2VyKiB0YXNrX21hbmFnZXIpCisgICAgOiBkb2N1bWVudF8oZG9jdW1lbnQpLCB0dHNfZW5naW5lXyh0dHNfZW5naW5lKSB7CisgIGRvY3VtZW50Xy0+QWRkT2JzZXJ2ZXIodGhpcyk7CisgIGxpdmVfcmVnaW9uX29ic2VydmVyXyA9IG5ldyBkb206Ok11dGF0aW9uT2JzZXJ2ZXIoCisgICAgICBiYXNlOjpCaW5kKCZTY3JlZW5SZWFkZXI6Ok11dGF0aW9uT2JzZXJ2ZXJDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICB0YXNrX21hbmFnZXIpOworfQorCitTY3JlZW5SZWFkZXI6On5TY3JlZW5SZWFkZXIoKSB7CisgIGxpdmVfcmVnaW9uX29ic2VydmVyXy0+RGlzY29ubmVjdCgpOworICBkb2N1bWVudF8tPlJlbW92ZU9ic2VydmVyKHRoaXMpOworfQorCit2b2lkIFNjcmVlblJlYWRlcjo6T25Mb2FkKCkgeworICBkb206Ok11dGF0aW9uT2JzZXJ2ZXJJbml0IGluaXQ7CisgIGluaXQuc2V0X3N1YnRyZWUodHJ1ZSk7CisgIC8vIFRyYWNrIGNoYXJhY3RlciBkYXRhIGFuZCBub2RlIGFkZGl0aW9uL3JlbW92YWwgZm9yIGxpdmUgcmVnaW9ucy4KKyAgaW5pdC5zZXRfY2hhcmFjdGVyX2RhdGEodHJ1ZSk7CisgIGluaXQuc2V0X2NoaWxkX2xpc3QodHJ1ZSk7CisKKyAgbGl2ZV9yZWdpb25fb2JzZXJ2ZXJfLT5PYnNlcnZlKGRvY3VtZW50Xy0+Ym9keSgpLCBpbml0KTsKK30KKwordm9pZCBTY3JlZW5SZWFkZXI6Ok9uRm9jdXNDaGFuZ2VkKCkgeworICAvLyBUT0RPOiBPbmx5IHV0dGVyIHRleHQgaWYgdGV4dC10by1zcGVlY2ggaXMgZW5hYmxlZC4KKyAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IGVsZW1lbnQgPSBkb2N1bWVudF8tPmFjdGl2ZV9lbGVtZW50KCk7CisgIGlmIChlbGVtZW50KSB7CisgICAgc3RkOjpzdHJpbmcgdGV4dF9hbHRlcm5hdGl2ZSA9IENvbXB1dGVUZXh0QWx0ZXJuYXRpdmUoZWxlbWVudCk7CisgICAgdHRzX2VuZ2luZV8tPlNwZWFrTm93KHRleHRfYWx0ZXJuYXRpdmUpOworICB9Cit9CisKKy8vIE11dGF0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgZm9yIHRyYWNraW5nIHRoZSBjcmVhdGlvbmcgYW5kIGRlc3RydWN0aW9uIG9mCisvLyBsaXZlIHJlZ2lvbnMuCit2b2lkIFNjcmVlblJlYWRlcjo6TXV0YXRpb25PYnNlcnZlckNhbGxiYWNrKAorICAgIGNvbnN0IE11dGF0aW9uUmVjb3JkU2VxdWVuY2UmIHNlcXVlbmNlLAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpNdXRhdGlvbk9ic2VydmVyPiYgb2JzZXJ2ZXIpIHsKKyAgLy8gVE9ETzogT25seSBjaGVjayBsaXZlIHJlZ2lvbnMgaWYgdGV4dC10by1zcGVlY2ggaXMgZW5hYmxlZC4KKyAgRENIRUNLX0VRKG9ic2VydmVyLCBsaXZlX3JlZ2lvbl9vYnNlcnZlcl8pOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNlcXVlbmNlLnNpemUoKTsgKytpKSB7CisgICAgc2NvcGVkX3JlZnB0cjxkb206Ok11dGF0aW9uUmVjb3JkPiByZWNvcmQgPSBzZXF1ZW5jZS5hdChpKTsKKworICAgIC8vIENoZWNrIGlmIHRoZSB0YXJnZXQgbm9kZSBpcyBwYXJ0IG9mIGEgbGl2ZSByZWdpb24uCisgICAgc2NvcGVkX3B0cjxpbnRlcm5hbDo6TGl2ZVJlZ2lvbj4gbGl2ZV9yZWdpb24gPQorICAgICAgICBpbnRlcm5hbDo6TGl2ZVJlZ2lvbjo6R2V0TGl2ZVJlZ2lvbkZvck5vZGUocmVjb3JkLT50YXJnZXQoKSk7CisgICAgaWYgKCFsaXZlX3JlZ2lvbikgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgY29uc3QgY2hhciogZm9ybWF0X3N0cmluZyA9IE5VTEw7CisgICAgLy8gR2V0IGEgbGlzdCBvZiBjaGFuZ2VkIG5vZGVzLCBiYXNlZCBvbiB0aGUgdHlwZSBvZiBjaGFuZ2UgdGhpcyB3YXMgYW5kCisgICAgLy8gd2hldGhlciBvciBub3QgdGhlIGxpdmUgcmVnaW9uIGNhcmVzIGFib3V0IHRoaXMgdHlwZSBvZiBjaGFuZ2UuCisgICAgc2NvcGVkX3JlZnB0cjxkb206Ok5vZGVMaXN0PiBjaGFuZ2VkX25vZGVzOworICAgIGlmIChyZWNvcmQtPnR5cGUoKSA9PSBiYXNlOjpUb2tlbnM6OmNoYXJhY3RlckRhdGEoKSAmJgorICAgICAgICBsaXZlX3JlZ2lvbi0+SXNNdXRhdGlvblJlbGV2YW50KAorICAgICAgICAgICAgaW50ZXJuYWw6OkxpdmVSZWdpb246OmtNdXRhdGlvblR5cGVUZXh0KSkgeworICAgICAgY2hhbmdlZF9ub2RlcyA9IG5ldyBkb206Ok5vZGVMaXN0KCk7CisgICAgICBjaGFuZ2VkX25vZGVzLT5BcHBlbmROb2RlKHJlY29yZC0+dGFyZ2V0KCkpOworICAgIH0gZWxzZSBpZiAocmVjb3JkLT50eXBlKCkgPT0gYmFzZTo6VG9rZW5zOjpjaGlsZExpc3QoKSkgeworICAgICAgaWYgKHJlY29yZC0+YWRkZWRfbm9kZXMoKSAmJgorICAgICAgICAgIGxpdmVfcmVnaW9uLT5Jc011dGF0aW9uUmVsZXZhbnQoCisgICAgICAgICAgICAgIGludGVybmFsOjpMaXZlUmVnaW9uOjprTXV0YXRpb25UeXBlQWRkaXRpb24pKSB7CisgICAgICAgIGNoYW5nZWRfbm9kZXMgPSByZWNvcmQtPmFkZGVkX25vZGVzKCk7CisgICAgICB9CisgICAgICBpZiAocmVjb3JkLT5yZW1vdmVkX25vZGVzKCkgJiYKKyAgICAgICAgICBsaXZlX3JlZ2lvbi0+SXNNdXRhdGlvblJlbGV2YW50KAorICAgICAgICAgICAgICBpbnRlcm5hbDo6TGl2ZVJlZ2lvbjo6a011dGF0aW9uVHlwZVJlbW92YWwpKSB7CisgICAgICAgIGNoYW5nZWRfbm9kZXMgPSByZWNvcmQtPnJlbW92ZWRfbm9kZXMoKTsKKyAgICAgICAgZm9ybWF0X3N0cmluZyA9IGtSZW1vdmVkRm9ybWF0U3RyaW5nOworICAgICAgfQorICAgIH0KKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGNoYW5nZWQgbm9kZXMsIHRoYXQgbWVhbnMgdGhhdCB0aGUgY2hhbmdlIHdhcyBub3QKKyAgICAvLyByZWxldmFudCB0byB0aGlzIGxpdmUgcmVnaW9uLgorICAgIGlmICghY2hhbmdlZF9ub2RlcyB8fCAoY2hhbmdlZF9ub2Rlcy0+bGVuZ3RoKCkgPD0gMCkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIGFueSBvZiB0aGUgY2hhbmdlZCBub2RlcyBzaG91bGQgdXBkYXRlIHRoZSBsaXZlIHJlZ2lvbgorICAgIC8vIGF0b21pY2FsbHkuCisgICAgYm9vbCBpc19hdG9taWMgPSBmYWxzZTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5nZWRfbm9kZXMtPmxlbmd0aCgpOyArK2kpIHsKKyAgICAgIGlmIChsaXZlX3JlZ2lvbi0+SXNBdG9taWMoY2hhbmdlZF9ub2Rlcy0+SXRlbShpKSkpIHsKKyAgICAgICAgaXNfYXRvbWljID0gdHJ1ZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorCisgICAgc3RkOjpzdHJpbmcgdGV4dF9hbHRlcm5hdGl2ZTsKKyAgICBpZiAoaXNfYXRvbWljKSB7CisgICAgICAvLyBJZiB0aGUgbGl2ZSByZWdpb24gdXBkYXRlcyBhdG9taWNhbGx5LCB0aGVuIGlnbm9yZSBjaGFuZ2VkX25vZGVzCisgICAgICAvLyBhbmQganVzdCBnZXQgdGhlIHRleHQgYWx0ZXJuYXRpdmUgZnJvbSB0aGUgZW50aXJlIHJlZ2lvbi4KKyAgICAgIHRleHRfYWx0ZXJuYXRpdmUgPSBDb21wdXRlVGV4dEFsdGVybmF0aXZlKGxpdmVfcmVnaW9uLT5yb290KCkpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UgYXBwZW5kIGFsbCB0aGUgdGV4dCBhbHRlcm5hdGl2ZXMgZm9yIGVhY2ggbm9kZS4KKyAgICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY2hhbmdlZF9ub2Rlcy0+bGVuZ3RoKCk7ICsraSkgeworICAgICAgICB0ZXh0X2FsdGVybmF0aXZlICs9IENvbXB1dGVUZXh0QWx0ZXJuYXRpdmUoY2hhbmdlZF9ub2Rlcy0+SXRlbShpKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gSWYgd2Ugc3RpbGwgZG9uJ3QgaGF2ZSBhIHRleHRfYWx0ZXJuYXRpdmUgdG8gc3BlYWssIGNvbnRpbnVlIHRvIHRoZSBuZXh0CisgICAgLy8gbXV0YXRpb24uCisgICAgaWYgKHRleHRfYWx0ZXJuYXRpdmUuZW1wdHkoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gUHJvdmlkZSBhZGRpdGlvbmFsIGNvbnRleHQgdGhyb3VnaCBhIGZvcm1hdCBzdHJpbmcsIGlmIG5lY2Vzc2FyeS4KKyAgICBpZiAoZm9ybWF0X3N0cmluZykgeworICAgICAgdGV4dF9hbHRlcm5hdGl2ZSA9IFN0cmluZ1ByaW50Zihmb3JtYXRfc3RyaW5nLCB0ZXh0X2FsdGVybmF0aXZlLmNfc3RyKCkpOworICAgIH0KKworICAgIC8vIFV0dGVyIHRoZSB0ZXh0IGFjY29yZGluZyB0byB3aGV0aGVyIHRoaXMgbGl2ZSByZWdpb24gaXMgYXNzZXJ0aXZlIG9yIG5vdC4KKyAgICBpZiAobGl2ZV9yZWdpb24tPklzQXNzZXJ0aXZlKCkpIHsKKyAgICAgIHR0c19lbmdpbmVfLT5TcGVha05vdyh0ZXh0X2FsdGVybmF0aXZlKTsKKyAgICB9IGVsc2UgeworICAgICAgdHRzX2VuZ2luZV8tPlNwZWFrKHRleHRfYWx0ZXJuYXRpdmUpOworICAgIH0KKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYWNjZXNzaWJpbGl0eQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3NjcmVlbl9yZWFkZXIuaCBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zY3JlZW5fcmVhZGVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2Y3NDBhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zY3JlZW5fcmVhZGVyLmgKQEAgLTAsMCArMSw2MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfQUNDRVNTSUJJTElUWV9TQ1JFRU5fUkVBREVSX0hfCisjZGVmaW5lIENPQkFMVF9BQ0NFU1NJQklMSVRZX1NDUkVFTl9SRUFERVJfSF8KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfdmVjdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L2FjY2Vzc2liaWxpdHkvdHRzX2VuZ2luZS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9jdW1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYWNjZXNzaWJpbGl0eSB7CisvLyBTY3JlZW5SZWFkZXIgdHJhY2tzIGNoYW5nZXMgaW4gdGhlIHN0YXRlIG9mIHRoZSBEb2N1bWVudCBhbmQgcHJvdmlkZXMgc3BlZWNoCisvLyB1dHRlcmFuY2VzIHRvIGEgVFRTRW5naW5lLiBUaGUgbWFpbiB1c2UgY2FzZXMgY292ZXJlZCBhcmUgd2hlbiB0aGUgZG9jdW1lbnQncworLy8gZm9jdXNlZCBlbGVtZW50IGNoYW5nZXMsIHVzdWFsbHkgaW4gcmVzcG9uc2UgdG8gdXNlciBpbnB1dCwgb3IgaWYgdGhlcmUgaXMKKy8vIGFuIGFzeW5jaHJvbm91cyBjaGFuZ2UgdG8gImxpdmUgcmVnaW9uIiB0aGF0IHNob3VsZCBiZSBjb21tdW5pY2F0ZWQgdG8gdGhlCisvLyB1c2VyLgorY2xhc3MgU2NyZWVuUmVhZGVyIDogcHVibGljIGRvbTo6RG9jdW1lbnRPYnNlcnZlciB7CisgcHVibGljOgorICBTY3JlZW5SZWFkZXIoZG9tOjpEb2N1bWVudCogZG9jdW1lbnQsIFRUU0VuZ2luZSogdHRzX2VuZ2luZSwKKyAgICAgICAgICAgICAgIGRvbTo6TXV0YXRpb25PYnNlcnZlclRhc2tNYW5hZ2VyKiB0YXNrX21hbmFnZXIpOworCisgcHJvdGVjdGVkOgorICB+U2NyZWVuUmVhZGVyKCk7CisgIC8vIGRvbTo6RG9jdW1lbnRPYnNlcnZlciBvdmVycmlkZXMuCisgIHZvaWQgT25Mb2FkKCkgT1ZFUlJJREU7CisgIHZvaWQgT25NdXRhdGlvbigpIE9WRVJSSURFIHt9CisgIHZvaWQgT25Gb2N1c0NoYW5nZWQoKSBPVkVSUklERTsKKworIHByaXZhdGU6CisgIHR5cGVkZWYgc2NyaXB0OjpTZXF1ZW5jZTxzY29wZWRfcmVmcHRyPGRvbTo6TXV0YXRpb25SZWNvcmQ+ID4KKyAgICAgIE11dGF0aW9uUmVjb3JkU2VxdWVuY2U7CisgIC8vIE11dGF0aW9uT2JzZXJ2ZXIgY2FsbGJhY2sgZm9yIHRyYWNraW5nIGxpdmUgcmVnaW9ucy4KKyAgdm9pZCBNdXRhdGlvbk9ic2VydmVyQ2FsbGJhY2soCisgICAgICBjb25zdCBNdXRhdGlvblJlY29yZFNlcXVlbmNlJiBzZXF1ZW5jZSwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpNdXRhdGlvbk9ic2VydmVyPiYgb2JzZXJ2ZXIpOworCisgIGRvbTo6RG9jdW1lbnQqIGRvY3VtZW50XzsKKyAgVFRTRW5naW5lKiB0dHNfZW5naW5lXzsKKyAgc2NvcGVkX3JlZnB0cjxkb206Ok11dGF0aW9uT2JzZXJ2ZXI+IGxpdmVfcmVnaW9uX29ic2VydmVyXzsKKworICBmcmllbmQgY2xhc3Mgc2NvcGVkX3B0cjxTY3JlZW5SZWFkZXI+OworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2NyZWVuUmVhZGVyKTsKK307Cit9ICAvLyBuYW1lc3BhY2UgYWNjZXNzaWJpbGl0eQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9BQ0NFU1NJQklMSVRZX1NDUkVFTl9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zY3JlZW5fcmVhZGVyX3Rlc3RzLmNjIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3NjcmVlbl9yZWFkZXJfdGVzdHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhMzdlYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zY3JlZW5fcmVhZGVyX3Rlc3RzLmNjCkBAIC0wLDAgKzEsMTU3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvYmFzZV9wYXRocy5oIgorI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCisjaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgorI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS90dHNfZW5naW5lLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZWxlbWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC90ZXN0L2RvY3VtZW50X2xvYWRlci5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6Ol87CisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGFjY2Vzc2liaWxpdHkgeworbmFtZXNwYWNlIHsKK3N0cnVjdCBUZXN0SW5mbyB7CisgIFRlc3RJbmZvKGNvbnN0IHN0ZDo6c3RyaW5nJiBodG1sX2ZpbGVfbmFtZSwKKyAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkX3Jlc3VsdCkKKyAgICAgIDogaHRtbF9maWxlX25hbWUoaHRtbF9maWxlX25hbWUpLCBleHBlY3RlZF9yZXN1bHQoZXhwZWN0ZWRfcmVzdWx0KSB7fQorICBzdGQ6OnN0cmluZyBodG1sX2ZpbGVfbmFtZTsKKyAgc3RkOjpzdHJpbmcgZXhwZWN0ZWRfcmVzdWx0OworfTsKKworLy8gRW51bWVyYXRlIHRoZSAqLmh0bWwgZmlsZXMgaW4gdGhlIGFjY2Vzc2liaWxpdHlfdGVzdCBkaXJlY3RvcnkgYW5kIGJ1aWxkCisvLyBhIGxpc3Qgb2YgaW5wdXQgLmh0bWwgZmlsZXMgYW5kIGV4cGVjdGVkIHJlc3VsdHMuCitzdGQ6OnZlY3RvcjxUZXN0SW5mbz4gRW51bWVyYXRlVGVzdHMoY29uc3Qgc3RkOjpzdHJpbmcmIHN1YmRpcikgeworICBzdGQ6OnZlY3RvcjxUZXN0SW5mbz4gaW5mb3M7CisgIEZpbGVQYXRoIHJvb3RfZGlyZWN0b3J5OworICBQYXRoU2VydmljZTo6R2V0KGJhc2U6OkRJUl9TT1VSQ0VfUk9PVCwgJnJvb3RfZGlyZWN0b3J5KTsKKyAgcm9vdF9kaXJlY3RvcnkgPSByb290X2RpcmVjdG9yeS5BcHBlbmQoImNvYmFsdCIpCisgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoImFjY2Vzc2liaWxpdHkiKQorICAgICAgICAgICAgICAgICAgICAgICAuQXBwZW5kKCJ0ZXN0ZGF0YSIpCisgICAgICAgICAgICAgICAgICAgICAgIC5BcHBlbmQoc3ViZGlyKTsKKyAgZmlsZV91dGlsOjpGaWxlRW51bWVyYXRvciBlbnVtZXJhdG9yKHJvb3RfZGlyZWN0b3J5LCBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfdXRpbDo6RmlsZUVudW1lcmF0b3I6OkZJTEVTKTsKKyAgZm9yIChGaWxlUGF0aCBodG1sX2ZpbGUgPSBlbnVtZXJhdG9yLk5leHQoKTsgIWh0bWxfZmlsZS5lbXB0eSgpOworICAgICAgIGh0bWxfZmlsZSA9IGVudW1lcmF0b3IuTmV4dCgpKSB7CisgICAgaWYgKGh0bWxfZmlsZS5FeHRlbnNpb24oKSA9PSAiLmh0bWwiKSB7CisgICAgICBGaWxlUGF0aCBleHBlY3RlZF9yZXN1bHRzX2ZpbGUgPSBodG1sX2ZpbGUuUmVwbGFjZUV4dGVuc2lvbigiLmV4cGVjdGVkIik7CisgICAgICBzdGQ6OnN0cmluZyByZXN1bHRzOworICAgICAgaWYgKCFmaWxlX3V0aWw6OlJlYWRGaWxlVG9TdHJpbmcoZXhwZWN0ZWRfcmVzdWx0c19maWxlLCAmcmVzdWx0cykpIHsKKyAgICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRmFpbGVkIHRvIHJlYWQgcmVzdWx0cyBmcm9tIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICAgICA8PCBleHBlY3RlZF9yZXN1bHRzX2ZpbGUudmFsdWUoKTsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CisgICAgICBUcmltV2hpdGVzcGFjZUFTQ0lJKHJlc3VsdHMsIFRSSU1fQUxMLCAmcmVzdWx0cyk7CisgICAgICBpbmZvcy5wdXNoX2JhY2soVGVzdEluZm8oaHRtbF9maWxlLkJhc2VOYW1lKCkudmFsdWUoKSwgcmVzdWx0cykpOworICAgIH0KKyAgfQorICByZXR1cm4gaW5mb3M7Cit9CisKK2NsYXNzIE1vY2tUVFNFbmdpbmUgOiBwdWJsaWMgVFRTRW5naW5lIHsKKyBwdWJsaWM6CisgIE1PQ0tfTUVUSE9EMShTcGVhaywgdm9pZChjb25zdCBzdGQ6OnN0cmluZyYpKTsKKyAgTU9DS19NRVRIT0QxKFNwZWFrTm93LCB2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJikpOworfTsKKworY2xhc3MgVGV4dEFsdGVybmF0aXZlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VGVzdEluZm8+IHsKKyBwcm90ZWN0ZWQ6CisgIHRlc3Q6OkRvY3VtZW50TG9hZGVyIGRvY3VtZW50X2xvYWRlcl87Cit9OworCitjbGFzcyBMaXZlUmVnaW9uTXV0YXRpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdFdpdGhQYXJhbTxUZXN0SW5mbz4geworIHB1YmxpYzoKKyAgTGl2ZVJlZ2lvbk11dGF0aW9uVGVzdCgpIDogcXVpdF9ldmVudF8odHJ1ZSwgZmFsc2UpIHt9CisgIHZvaWQgT25FcnJvcihjb25zdCBHVVJMJiwgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yKSB7CisgICAgRExPRyhFUlJPUikgPDwgZXJyb3I7CisgICAgUXVpdCgpOworICB9CisgIHZvaWQgUXVpdCgpIHsgcXVpdF9ldmVudF8uU2lnbmFsKCk7IH0KKyAgc3RhdGljIHZvaWQgT25SZW5kZXJUcmVlUHJvZHVjZWRTdHViKAorICAgICAgY29uc3QgYnJvd3Nlcjo6V2ViTW9kdWxlOjpMYXlvdXRSZXN1bHRzJikge30KKworIHByb3RlY3RlZDoKKyAgTW9ja1RUU0VuZ2luZSB0dHNfZW5naW5lXzsKKyAgYmFzZTo6V2FpdGFibGVFdmVudCBxdWl0X2V2ZW50XzsKK307Cit9ICAvLyBuYW1lc3BhY2UKKworVEVTVF9QKFRleHRBbHRlcm5hdGl2ZVRlc3QsIFRleHRBbHRlcm5hdGl2ZVRlc3QpIHsKKyAgR1VSTCB1cmwoCisgICAgICBzdGQ6OnN0cmluZygiZmlsZTovLy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0X2FsdGVybmF0aXZlLyIgKworICAgICAgICAgICAgICAgICAgR2V0UGFyYW0oKS5odG1sX2ZpbGVfbmFtZSkpOworICBkb2N1bWVudF9sb2FkZXJfLkxvYWQodXJsKTsKKyAgQVNTRVJUX1RSVUUoZG9jdW1lbnRfbG9hZGVyXy5kb2N1bWVudCgpKTsKKyAgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+IGVsZW1lbnQgPQorICAgICAgZG9jdW1lbnRfbG9hZGVyXy5kb2N1bWVudCgpLT5HZXRFbGVtZW50QnlJZCgiZWxlbWVudF90b190ZXN0Iik7CisgIEFTU0VSVF9UUlVFKGVsZW1lbnQpOworICBFWFBFQ1RfRVEoR2V0UGFyYW0oKS5leHBlY3RlZF9yZXN1bHQsIENvbXB1dGVUZXh0QWx0ZXJuYXRpdmUoZWxlbWVudCkpOworfQorCitURVNUX1AoTGl2ZVJlZ2lvbk11dGF0aW9uVGVzdCwgTGl2ZVJlZ2lvbk11dGF0aW9uVGVzdCkgeworICBHVVJMIHVybChzdGQ6OnN0cmluZygiZmlsZTovLy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9saXZlX3JlZ2lvbi8iICsKKyAgICAgICAgICAgICAgICAgICAgICAgR2V0UGFyYW0oKS5odG1sX2ZpbGVfbmFtZSkpOworICBjb25zdCBtYXRoOjpTaXplIGtEZWZhdWx0Vmlld3BvcnRTaXplKDEyODAsIDcyMCk7CisgIGNvbnN0IGZsb2F0IGtSZWZyZXNoUmF0ZSA9IDYwLjBmOworCisgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUgbmV0d29ya19tb2R1bGUoKG5ldHdvcms6Ok5ldHdvcmtNb2R1bGU6Ok9wdGlvbnMoKSkpOworICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlclN0dWIgcmVzb3VyY2VfcHJvdmlkZXI7CisKKyAgLy8gVXNlIHRlc3QgcnVubmVyIG1vZGUgdG8gYWxsb3cgdGhlIGNvbnRlbnQgaXRzZWxmIHRvIGRpY3RhdGUgd2hlbiBpdCBpcworICAvLyByZWFkeSBmb3IgbGF5b3V0IHNob3VsZCBiZSBwZXJmb3JtZWQuICBTZWUgY29iYWx0L2RvbS90ZXN0X3J1bm5lci5oLgorICBicm93c2VyOjpXZWJNb2R1bGU6Ok9wdGlvbnMgd2ViX21vZHVsZV9vcHRpb25zOworICB3ZWJfbW9kdWxlX29wdGlvbnMudHRzX2VuZ2luZSA9ICZ0dHNfZW5naW5lXzsKKworICAvLyBTZXQgZXhwZWN0ZWQgcmVzdWx0IGZyb20gbXV0YXRpb24uCisgIHN0ZDo6c3RyaW5nIGV4cGVjdGVkX3NwZWVjaCA9IEdldFBhcmFtKCkuZXhwZWN0ZWRfcmVzdWx0OworICBpZiAoZXhwZWN0ZWRfc3BlZWNoLmVtcHR5KCkpIHsKKyAgICBFWFBFQ1RfQ0FMTCh0dHNfZW5naW5lXywgU3BlYWsoXykpLlRpbWVzKDApOworICB9IGVsc2UgeworICAgIEVYUEVDVF9DQUxMKHR0c19lbmdpbmVfLCBTcGVhayhleHBlY3RlZF9zcGVlY2gpKTsKKyAgfQorCisgIC8vIENyZWF0ZSB0aGUgd2VibW9kdWxlIGFuZCBsZXQgaXQgcnVuLgorICBETE9HKElORk8pIDw8IHVybC5zcGVjKCk7CisgIGJyb3dzZXI6OldlYk1vZHVsZSB3ZWJfbW9kdWxlKAorICAgICAgdXJsLCBiYXNlOjpCaW5kKCZMaXZlUmVnaW9uTXV0YXRpb25UZXN0OjpPblJlbmRlclRyZWVQcm9kdWNlZFN0dWIpLAorICAgICAgYmFzZTo6QmluZCgmTGl2ZVJlZ2lvbk11dGF0aW9uVGVzdDo6T25FcnJvciwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICBiYXNlOjpCaW5kKCZMaXZlUmVnaW9uTXV0YXRpb25UZXN0OjpRdWl0LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKKyAgICAgIE5VTEwgLyogbWVkaWFfbW9kdWxlICovLCAmbmV0d29ya19tb2R1bGUsIGtEZWZhdWx0Vmlld3BvcnRTaXplLAorICAgICAgJnJlc291cmNlX3Byb3ZpZGVyLCBOVUxMIC8qIHN5c3RlbV93aW5kb3cgKi8sIGtSZWZyZXNoUmF0ZSwKKyAgICAgIHdlYl9tb2R1bGVfb3B0aW9ucyk7CisKKyAgLy8gV2FpdCBmb3IgdGhlIHRlc3QgdG8gcXVpdC4KKyAgcXVpdF9ldmVudF8uV2FpdCgpOworfQorCitJTlNUQU5USUFURV9URVNUX0NBU0VfUCgKKyAgICBUZXh0QWx0ZXJuYXRpdmVUZXN0LCBUZXh0QWx0ZXJuYXRpdmVUZXN0LAorICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oRW51bWVyYXRlVGVzdHMoInRleHRfYWx0ZXJuYXRpdmUiKSkpOworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChMaXZlUmVnaW9uTXV0YXRpb25UZXN0LCBMaXZlUmVnaW9uTXV0YXRpb25UZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgOjp0ZXN0aW5nOjpWYWx1ZXNJbihFbnVtZXJhdGVUZXN0cygibGl2ZV9yZWdpb24iKSkpOworfSAgLy8gbmFtZXNwYWNlIGFjY2Vzc2liaWxpdHkKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zdGFyYm9hcmRfdHRzX2VuZ2luZS5jYyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zdGFyYm9hcmRfdHRzX2VuZ2luZS5jYwppbmRleCAwOWQ3MTdkLi5kMjc4OGZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvc3RhcmJvYXJkX3R0c19lbmdpbmUuY2MKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3N0YXJib2FyZF90dHNfZW5naW5lLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L3N0YXJib2FyZF90dHNfZW5naW5lLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS9zdGFyYm9hcmRfdHRzX2VuZ2luZS5oIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3N0YXJib2FyZF90dHNfZW5naW5lLmgKaW5kZXggYTU1OWNmOC4uMTQwZGYyMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3N0YXJib2FyZF90dHNfZW5naW5lLmgKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3N0YXJib2FyZF90dHNfZW5naW5lLmgKQEAgLTEsMjQgKzEsMjMgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BQ0NFU1NJQklMSVRZX1NUQVJCT0FSRF9UVFNfRU5HSU5FX0hfCiAjZGVmaW5lIENPQkFMVF9BQ0NFU1NJQklMSVRZX1NUQVJCT0FSRF9UVFNfRU5HSU5FX0hfCiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKKyNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCiAjaW5jbHVkZSAiY29iYWx0L2FjY2Vzc2liaWxpdHkvdHRzX2VuZ2luZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9saXZlX3JlZ2lvbi9hZGQtY2hpbGQuZXhwZWN0ZWQgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vYWRkLWNoaWxkLmV4cGVjdGVkCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3MDZkYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vYWRkLWNoaWxkLmV4cGVjdGVkCkBAIC0wLDAgKzEgQEAKK05ldyBjaGlsZCB0ZXh0IGNvbnRlbnRzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vYWRkLWNoaWxkLmh0bWwgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vYWRkLWNoaWxkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzIyZjVkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9saXZlX3JlZ2lvbi9hZGQtY2hpbGQuaHRtbApAQCAtMCwwICsxLDE5IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdD4KK3ZhciBkb011dGF0aW9uID0gZnVuY3Rpb24oKSB7CisgIHZhciByZWdpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9fbXV0YXRlIik7CisgIHZhciBuZXdfY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgbmV3X2NoaWxkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJOZXcgY2hpbGQgdGV4dCBjb250ZW50cyIpKTsKKyAgcmVnaW9uLmFwcGVuZENoaWxkKG5ld19jaGlsZCk7CisgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB3aW5kb3cuY2xvc2UoKTsgfSApOworfQord2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBkb011dGF0aW9uKTsKKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJ0b19tdXRhdGUiIGFyaWEtbGl2ZT0icG9saXRlIiBhcmlhLXJlbGV2YW50PSJhZGRpdGlvbnMiIGFyaWEtYXRvbWljPSJmYWxzZSI+CisgICBPcmlnaW5hbCBjb250ZW50cy4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL2F0b21pYy11cGRhdGUuZXhwZWN0ZWQgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vYXRvbWljLXVwZGF0ZS5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNDM5NWRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL2F0b21pYy11cGRhdGUuZXhwZWN0ZWQKQEAgLTAsMCArMSBAQAorT3JpZ2luYWwgY29udGVudHMuIE5ldyBjaGlsZCB0ZXh0IGNvbnRlbnRzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vYXRvbWljLXVwZGF0ZS5odG1sIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL2F0b21pYy11cGRhdGUuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTlhOWNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL2F0b21pYy11cGRhdGUuaHRtbApAQCAtMCwwICsxLDE5IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdD4KK3ZhciBkb011dGF0aW9uID0gZnVuY3Rpb24oKSB7CisgIHZhciByZWdpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9fbXV0YXRlIik7CisgIHZhciBuZXdfY2hpbGQgPSBkb2N1bWVudC5jcmVhdGVFbGVtZW50KCJkaXYiKTsKKyAgbmV3X2NoaWxkLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJOZXcgY2hpbGQgdGV4dCBjb250ZW50cyIpKTsKKyAgcmVnaW9uLmFwcGVuZENoaWxkKG5ld19jaGlsZCk7CisgIHdpbmRvdy5zZXRUaW1lb3V0KGZ1bmN0aW9uKCkgeyB3aW5kb3cuY2xvc2UoKTsgfSApOworfQord2luZG93LmFkZEV2ZW50TGlzdGVuZXIoImxvYWQiLCBkb011dGF0aW9uKTsKKzwvc2NyaXB0PgorPC9oZWFkPgorPGJvZHk+Cis8ZGl2IGlkPSJ0b19tdXRhdGUiIGFyaWEtbGl2ZT0icG9saXRlIiBhcmlhLXJlbGV2YW50PSJhZGRpdGlvbnMiIGFyaWEtYXRvbWljPSJ0cnVlIj4KKyAgIE9yaWdpbmFsIGNvbnRlbnRzLgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vbXV0YXRlLXRleHQtY29udGVudHMuZXhwZWN0ZWQgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vbXV0YXRlLXRleHQtY29udGVudHMuZXhwZWN0ZWQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGExY2Q3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9saXZlX3JlZ2lvbi9tdXRhdGUtdGV4dC1jb250ZW50cy5leHBlY3RlZApAQCAtMCwwICsxIEBACitOZXcgdGV4dCBjb250ZW50cwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL211dGF0ZS10ZXh0LWNvbnRlbnRzLmh0bWwgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vbXV0YXRlLXRleHQtY29udGVudHMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41M2U1YWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL211dGF0ZS10ZXh0LWNvbnRlbnRzLmh0bWwKQEAgLTAsMCArMSwxOCBAQAorPGh0bWw+Cis8aGVhZD4KKzxzY3JpcHQ+Cit2YXIgZG9NdXRhdGlvbiA9IGZ1bmN0aW9uKCkgeworICB2YXIgcmVnaW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRvX211dGF0ZSIpOworICByZWdpb24uZmlyc3RDaGlsZC50ZXh0Q29udGVudCA9ICJOZXcgdGV4dCBjb250ZW50cyI7CisKKyAgd2luZG93LnNldFRpbWVvdXQoZnVuY3Rpb24oKSB7IHdpbmRvdy5jbG9zZSgpOyB9ICk7Cit9Cit3aW5kb3cuYWRkRXZlbnRMaXN0ZW5lcigibG9hZCIsIGRvTXV0YXRpb24pOworPC9zY3JpcHQ+Cis8L2hlYWQ+Cis8Ym9keT4KKzxkaXYgaWQ9InRvX211dGF0ZSIgYXJpYS1saXZlPSJwb2xpdGUiIGFyaWEtcmVsZXZhbnQ9InRleHQiIGFyaWEtYXRvbWljPSJmYWxzZSI+CisgICBPcmlnaW5hbCBjb250ZW50cy4KKzwvZGl2PgorPC9ib2R5PgorPC9odG1sPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fX2luaXRfXy5weSBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9saXZlX3JlZ2lvbi9ub24tcmVsZXZhbnQtbXV0YXRpb25zLmV4cGVjdGVkCm9sZCBtb2RlIDEwMDc1NQpuZXcgbW9kZSAxMDA2NDQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX19pbml0X18ucHkKcmVuYW1lIHRvIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9saXZlX3JlZ2lvbi9ub24tcmVsZXZhbnQtbXV0YXRpb25zLmV4cGVjdGVkCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vbm9uLXJlbGV2YW50LW11dGF0aW9ucy5odG1sIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL25vbi1yZWxldmFudC1tdXRhdGlvbnMuaHRtbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzE1MjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL25vbi1yZWxldmFudC1tdXRhdGlvbnMuaHRtbApAQCAtMCwwICsxLDM5IEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdD4KK3ZhciBkb011dGF0aW9uID0gZnVuY3Rpb24oKSB7CisgIHZhciB0ZXh0X29ubHlfcmVnaW9uID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRfb25seSIpOworICB2YXIgdG9fcmVtb3ZlID0gZG9jdW1lbnQuZ2V0RWxlbWVudEJ5SWQoInRleHRfb25seV90b19yZW1vdmUiKTsKKyAgdGV4dF9vbmx5X3JlZ2lvbi5yZW1vdmVDaGlsZCh0b19yZW1vdmUpOworICB0ZXh0X29ubHlfcmVnaW9uLmFwcGVuZENoaWxkKGRvY3VtZW50LmNyZWF0ZVRleHROb2RlKCJJcnJlbGV2YW50IikpCisKKyAgdmFyIGFkZGl0aW9uc19vbmx5X3JlZ2lvbiA9IGRvY3VtZW50LmdldEVsZW1lbnRCeUlkKCJhZGRpdGlvbnNfb25seSIpOworICB0b19yZW1vdmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWRkaXRpb25zX29ubHlfdG9fcmVtb3ZlIik7CisgIGFkZGl0aW9uc19vbmx5X3JlZ2lvbi5yZW1vdmVDaGlsZCh0b19yZW1vdmUpOworCisgIHZhciB0b19tdXRhdGUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgiYWRkaXRpb25zX29ubHlfdG9fbXV0YXRlIik7CisgIHRvX211dGF0ZS5maXJzdENoaWxkLnRleHRDb250ZW50ID0gIk5ldyBDb250ZW50IjsKKworICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsgd2luZG93LmNsb3NlKCk7IH0gKTsKK30KK3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZG9NdXRhdGlvbik7Cis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBpZD0idGV4dF9vbmx5IiBhcmlhLWxpdmU9InBvbGl0ZSIgYXJpYS1yZWxldmFudD0idGV4dCIgYXJpYS1hdG9taWM9ImZhbHNlIj4KKyAgU29tZSBjb250ZW50cworICA8ZGl2IGlkPSJ0ZXh0X29ubHlfdG9fcmVtb3ZlIj4KKyAgICBDb250ZW50cyB0byBiZSByZW1vdmVkCisgIDwvZGl2PgorPGRpdj4KKzxkaXYgaWQ9ImFkZGl0aW9uc19vbmx5IiBhcmlhLWxpdmU9InBvbGl0ZSIgYXJpYS1yZWxldmFudD0iYWRkaXRpb25zIiBhcmlhLWF0b21pYz0iZmFsc2UiPgorICBTb21lIGNvbnRlbnRzCisgIDxkaXYgaWQ9ImFkZGl0aW9uc19vbmx5X3RvX3JlbW92ZSI+CisgICAgQ29udGVudHMgdG8gYmUgcmVtb3ZlZAorICA8L2Rpdj4KKyAgPGRpdiBpZD0iYWRkaXRpb25zX29ubHlfdG9fbXV0YXRlIj4KKyAgICBPbGQgdGV4dCBjb250ZW50cworICA8L2Rpdj4KKzxkaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vcmVtb3ZlLWNoaWxkLmV4cGVjdGVkIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL3JlbW92ZS1jaGlsZC5leHBlY3RlZApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDhkZmRiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL2xpdmVfcmVnaW9uL3JlbW92ZS1jaGlsZC5leHBlY3RlZApAQCAtMCwwICsxIEBACitSZW1vdmVkLiBDb250ZW50cyB0byBiZSByZW1vdmVkCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vcmVtb3ZlLWNoaWxkLmh0bWwgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvbGl2ZV9yZWdpb24vcmVtb3ZlLWNoaWxkLmh0bWwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA3MjdlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9saXZlX3JlZ2lvbi9yZW1vdmUtY2hpbGQuaHRtbApAQCAtMCwwICsxLDIxIEBACis8aHRtbD4KKzxoZWFkPgorPHNjcmlwdD4KK3ZhciBkb011dGF0aW9uID0gZnVuY3Rpb24oKSB7CisgIHZhciByZWdpb24gPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9fbXV0YXRlIik7CisgIHZhciB0b19yZW1vdmUgPSBkb2N1bWVudC5nZXRFbGVtZW50QnlJZCgidG9fcmVtb3ZlIik7CisgIHJlZ2lvbi5yZW1vdmVDaGlsZCh0b19yZW1vdmUpOworICB3aW5kb3cuc2V0VGltZW91dChmdW5jdGlvbigpIHsgd2luZG93LmNsb3NlKCk7IH0gKTsKK30KK3dpbmRvdy5hZGRFdmVudExpc3RlbmVyKCJsb2FkIiwgZG9NdXRhdGlvbik7Cis8L3NjcmlwdD4KKzwvaGVhZD4KKzxib2R5PgorPGRpdiBpZD0idG9fbXV0YXRlIiBhcmlhLWxpdmU9InBvbGl0ZSIgYXJpYS1yZWxldmFudD0icmVtb3ZhbHMiIGFyaWEtYXRvbWljPSJmYWxzZSI+CisgIFNvbWUgY29udGVudHMKKyAgPGRpdiBpZD0idG9fcmVtb3ZlIj4KKyAgICBDb250ZW50cyB0byBiZSByZW1vdmVkCisgIDwvZGl2PgorPC9kaXY+Cis8L2JvZHk+Cis8L2h0bWw+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvaGlkZGVuLWJ5LXBhcmVudC5leHBlY3RlZCBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0X2FsdGVybmF0aXZlL2hpZGRlbi1ieS1wYXJlbnQuZXhwZWN0ZWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9oaWRkZW4tYnktcGFyZW50LmV4cGVjdGVkCnJlbmFtZSB0byBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvdGV4dF9hbHRlcm5hdGl2ZS9oaWRkZW4tYnktcGFyZW50LmV4cGVjdGVkCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvaGlkZGVuLWJ5LXBhcmVudC5odG1sIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL3RleHRfYWx0ZXJuYXRpdmUvaGlkZGVuLWJ5LXBhcmVudC5odG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvaGlkZGVuLWJ5LXBhcmVudC5odG1sCnJlbmFtZSB0byBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvdGV4dF9hbHRlcm5hdGl2ZS9oaWRkZW4tYnktcGFyZW50Lmh0bWwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9oaWRkZW4tbGFiZWxsZWRieS5leHBlY3RlZCBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0X2FsdGVybmF0aXZlL2hpZGRlbi1sYWJlbGxlZGJ5LmV4cGVjdGVkCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvaGlkZGVuLWxhYmVsbGVkYnkuZXhwZWN0ZWQKcmVuYW1lIHRvIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0X2FsdGVybmF0aXZlL2hpZGRlbi1sYWJlbGxlZGJ5LmV4cGVjdGVkCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvaGlkZGVuLWxhYmVsbGVkYnkuaHRtbCBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0X2FsdGVybmF0aXZlL2hpZGRlbi1sYWJlbGxlZGJ5Lmh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9oaWRkZW4tbGFiZWxsZWRieS5odG1sCnJlbmFtZSB0byBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvdGV4dF9hbHRlcm5hdGl2ZS9oaWRkZW4tbGFiZWxsZWRieS5odG1sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvc2VsZi1yZWZlcmVuY2UtbGFiZWxsZWRieS5leHBlY3RlZCBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0X2FsdGVybmF0aXZlL3NlbGYtcmVmZXJlbmNlLWxhYmVsbGVkYnkuZXhwZWN0ZWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS9zZWxmLXJlZmVyZW5jZS1sYWJlbGxlZGJ5LmV4cGVjdGVkCnJlbmFtZSB0byBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvdGV4dF9hbHRlcm5hdGl2ZS9zZWxmLXJlZmVyZW5jZS1sYWJlbGxlZGJ5LmV4cGVjdGVkCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvc2VsZi1yZWZlcmVuY2UtbGFiZWxsZWRieS5odG1sIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL3RleHRfYWx0ZXJuYXRpdmUvc2VsZi1yZWZlcmVuY2UtbGFiZWxsZWRieS5odG1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvc2VsZi1yZWZlcmVuY2UtbGFiZWxsZWRieS5odG1sCnJlbmFtZSB0byBzcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvdGV4dF9hbHRlcm5hdGl2ZS9zZWxmLXJlZmVyZW5jZS1sYWJlbGxlZGJ5Lmh0bWwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0LWNvbnRlbnQuZXhwZWN0ZWQgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGVzdGRhdGEvdGV4dF9hbHRlcm5hdGl2ZS90ZXh0LWNvbnRlbnQuZXhwZWN0ZWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0LWNvbnRlbnQuZXhwZWN0ZWQKcmVuYW1lIHRvIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0X2FsdGVybmF0aXZlL3RleHQtY29udGVudC5leHBlY3RlZApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL3RleHQtY29udGVudC5odG1sIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL3RleHRfYWx0ZXJuYXRpdmUvdGV4dC1jb250ZW50Lmh0bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXN0ZGF0YS90ZXh0LWNvbnRlbnQuaHRtbApyZW5hbWUgdG8gc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3Rlc3RkYXRhL3RleHRfYWx0ZXJuYXRpdmUvdGV4dC1jb250ZW50Lmh0bWwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXh0X2FsdGVybmF0aXZlLmNjIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmUuY2MKaW5kZXggOTFjMzhkYy4uYmNhMjE4NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmUuY2MKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmUuY2MKQEAgLTEsMzQgKzEsMzQgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2FjY2Vzc2liaWxpdHkvdGV4dF9hbHRlcm5hdGl2ZS5oIgogCiAjaW5jbHVkZSAiY29iYWx0L2FjY2Vzc2liaWxpdHkvaW50ZXJuYWwvdGV4dF9hbHRlcm5hdGl2ZV9oZWxwZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvY3VtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9lbGVtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXh0LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGFjY2Vzc2liaWxpdHkgewotc3RkOjpzdHJpbmcgQ29tcHV0ZVRleHRBbHRlcm5hdGl2ZShjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RWxlbWVudD4mIGVsZW1lbnQpIHsKK3N0ZDo6c3RyaW5nIENvbXB1dGVUZXh0QWx0ZXJuYXRpdmUoY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206Ok5vZGU+JiBub2RlKSB7CiAgIC8vIFVwZGF0ZSB0aGUgY29tcHV0ZWQgc3R5bGVzIGZpcnN0IHRvIGVuc3VyZSB0aGF0IGFueSBDU1MgdGhhdCB3b3VsZCBtb2RpZnkKICAgLy8gdGhlIHRleHQgY29udGVudHMgaGFzIGJlZW4gYXBwbGllZCAoc3VjaCBhcyA6YmVmb3JlIGFuZCA6YWZ0ZXIpLgotICBEQ0hFQ0soZWxlbWVudC0+bm9kZV9kb2N1bWVudCgpKTsKLSAgZWxlbWVudC0+bm9kZV9kb2N1bWVudCgpLT5VcGRhdGVDb21wdXRlZFN0eWxlcygpOwotCisgIGlmIChub2RlLT5ub2RlX2RvY3VtZW50KCkpIHsKKyAgICBub2RlLT5ub2RlX2RvY3VtZW50KCktPlVwZGF0ZUNvbXB1dGVkU3R5bGVzKCk7CisgIH0KICAgaW50ZXJuYWw6OlRleHRBbHRlcm5hdGl2ZUhlbHBlciBoZWxwZXI7Ci0gIGhlbHBlci5BcHBlbmRUZXh0QWx0ZXJuYXRpdmUoZWxlbWVudCk7CisgIGhlbHBlci5BcHBlbmRUZXh0QWx0ZXJuYXRpdmUobm9kZSk7CiAgIHJldHVybiBoZWxwZXIuR2V0VGV4dEFsdGVybmF0aXZlKCk7CiB9CiB9ICAvLyBuYW1lc3BhY2UgYWNjZXNzaWJpbGl0eQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmUuaCBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXh0X2FsdGVybmF0aXZlLmgKaW5kZXggZWE0YmU4ZC4uMDQyOTA4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmUuaAorKysgYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdGV4dF9hbHRlcm5hdGl2ZS5oCkBAIC0xLDMyICsxLDMwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQUNDRVNTSUJJTElUWV9URVhUX0FMVEVSTkFUSVZFX0hfCiAjZGVmaW5lIENPQkFMVF9BQ0NFU1NJQklMSVRZX1RFWFRfQUxURVJOQVRJVkVfSF8KIAogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgImNvYmFsdC9kb20vZWxlbWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vbm9kZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBhY2Nlc3NpYmlsaXR5IHsKIAotLy8gQ29tcHV0ZSB0aGUgVGV4dCBBbHRlcm5hdGl2ZSBmb3IgdGhlIGVsZW1lbnQgcGVyIHRoZSB3YWktYXJpYSBzcGVjaWZpY2F0aW9uOgorLy8gQ29tcHV0ZSB0aGUgVGV4dCBBbHRlcm5hdGl2ZSBmb3IgdGhlIG5vZGUgcGVyIHRoZSB3YWktYXJpYSBzcGVjaWZpY2F0aW9uOgogLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvUkVDLXdhaS1hcmlhLWltcGxlbWVudGF0aW9uLTIwMTQwMzIwLyNtYXBwaW5nX2FkZGl0aW9uYWxfbmRfdGUKLXN0ZDo6c3RyaW5nIENvbXB1dGVUZXh0QWx0ZXJuYXRpdmUoY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206OkVsZW1lbnQ+JiBlbGVtZW50KTsKK3N0ZDo6c3RyaW5nIENvbXB1dGVUZXh0QWx0ZXJuYXRpdmUoY29uc3Qgc2NvcGVkX3JlZnB0cjxkb206Ok5vZGU+JiBub2RlKTsKIAogfSAgLy8gbmFtZXNwYWNlIGFjY2Vzc2liaWxpdHkKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90ZXh0X2FsdGVybmF0aXZlX3Rlc3RzLmNjIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmVfdGVzdHMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViMmNiMzYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmVfdGVzdHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2UvYmFzZV9wYXRocy5oIgotI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCi0jaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKLSNpbmNsdWRlICJiYXNlL3BhdGhfc2VydmljZS5oIgotI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L3RleHRfYWx0ZXJuYXRpdmUuaCIKLSNpbmNsdWRlICJjb2JhbHQvdGVzdC9kb2N1bWVudF9sb2FkZXIuaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKLSNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYWNjZXNzaWJpbGl0eSB7Ci1uYW1lc3BhY2Ugewotc3RydWN0IFRlc3RJbmZvIHsKLSAgVGVzdEluZm8oY29uc3Qgc3RkOjpzdHJpbmcmIGh0bWxfZmlsZV9uYW1lLAotICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXhwZWN0ZWRfcmVzdWx0KQotICAgICAgOiBodG1sX2ZpbGVfbmFtZShodG1sX2ZpbGVfbmFtZSksIGV4cGVjdGVkX3Jlc3VsdChleHBlY3RlZF9yZXN1bHQpIHt9Ci0gIHN0ZDo6c3RyaW5nIGh0bWxfZmlsZV9uYW1lOwotICBzdGQ6OnN0cmluZyBleHBlY3RlZF9yZXN1bHQ7Ci19OwotCi0vLyBFbnVtZXJhdGUgdGhlICouaHRtbCBmaWxlcyBpbiB0aGUgYWNjZXNzaWJpbGl0eV90ZXN0IGRpcmVjdG9yeSBhbmQgYnVpbGQKLS8vIGEgbGlzdCBvZiBpbnB1dCAuaHRtbCBmaWxlcyBhbmQgZXhwZWN0ZWQgcmVzdWx0cy4KLXN0ZDo6dmVjdG9yPFRlc3RJbmZvPiBFbnVtZXJhdGVUZXN0cygpIHsKLSAgc3RkOjp2ZWN0b3I8VGVzdEluZm8+IGluZm9zOwotICBGaWxlUGF0aCByb290X2RpcmVjdG9yeTsKLSAgUGF0aFNlcnZpY2U6OkdldChiYXNlOjpESVJfU09VUkNFX1JPT1QsICZyb290X2RpcmVjdG9yeSk7Ci0gIHJvb3RfZGlyZWN0b3J5ID0gcm9vdF9kaXJlY3RvcnkuQXBwZW5kKCJjb2JhbHQiKS5BcHBlbmQoImFjY2Vzc2liaWxpdHlfdGVzdCIpOwotICBmaWxlX3V0aWw6OkZpbGVFbnVtZXJhdG9yIGVudW1lcmF0b3Iocm9vdF9kaXJlY3RvcnksIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV91dGlsOjpGaWxlRW51bWVyYXRvcjo6RklMRVMpOwotICBmb3IgKEZpbGVQYXRoIGh0bWxfZmlsZSA9IGVudW1lcmF0b3IuTmV4dCgpOyAhaHRtbF9maWxlLmVtcHR5KCk7Ci0gICAgICAgaHRtbF9maWxlID0gZW51bWVyYXRvci5OZXh0KCkpIHsKLSAgICBpZiAoaHRtbF9maWxlLkV4dGVuc2lvbigpID09ICIuaHRtbCIpIHsKLSAgICAgIEZpbGVQYXRoIGV4cGVjdGVkX3Jlc3VsdHNfZmlsZSA9IGh0bWxfZmlsZS5SZXBsYWNlRXh0ZW5zaW9uKCIuZXhwZWN0ZWQiKTsKLSAgICAgIHN0ZDo6c3RyaW5nIHJlc3VsdHM7Ci0gICAgICBpZiAoIWZpbGVfdXRpbDo6UmVhZEZpbGVUb1N0cmluZyhleHBlY3RlZF9yZXN1bHRzX2ZpbGUsICZyZXN1bHRzKSkgewotICAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsZWQgdG8gcmVhZCByZXN1bHRzIGZyb20gZmlsZTogIgotICAgICAgICAgICAgICAgICAgICAgIDw8IGV4cGVjdGVkX3Jlc3VsdHNfZmlsZS52YWx1ZSgpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIFRyaW1XaGl0ZXNwYWNlQVNDSUkocmVzdWx0cywgVFJJTV9BTEwsICZyZXN1bHRzKTsKLSAgICAgIGluZm9zLnB1c2hfYmFjayhUZXN0SW5mbyhodG1sX2ZpbGUuQmFzZU5hbWUoKS52YWx1ZSgpLCByZXN1bHRzKSk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBpbmZvczsKLX0KLQotY2xhc3MgVGV4dEFsdGVybmF0aXZlVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08VGVzdEluZm8+IHsKLSBwcm90ZWN0ZWQ6Ci0gIHRlc3Q6OkRvY3VtZW50TG9hZGVyIGRvY3VtZW50X2xvYWRlcl87Ci19OwotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1RfUChUZXh0QWx0ZXJuYXRpdmVUZXN0LCBUZXh0QWx0ZXJuYXRpdmVUZXN0KSB7Ci0gIEdVUkwgdXJsKHN0ZDo6c3RyaW5nKCJmaWxlOi8vL2NvYmFsdC9hY2Nlc3NpYmlsaXR5X3Rlc3QvIiArCi0gICAgICAgICAgICAgICAgICAgICAgIEdldFBhcmFtKCkuaHRtbF9maWxlX25hbWUpKTsKLSAgZG9jdW1lbnRfbG9hZGVyXy5Mb2FkKHVybCk7Ci0gIEFTU0VSVF9UUlVFKGRvY3VtZW50X2xvYWRlcl8uZG9jdW1lbnQoKSk7Ci0gIHNjb3BlZF9yZWZwdHI8ZG9tOjpFbGVtZW50PiBlbGVtZW50ID0KLSAgICAgIGRvY3VtZW50X2xvYWRlcl8uZG9jdW1lbnQoKS0+R2V0RWxlbWVudEJ5SWQoImVsZW1lbnRfdG9fdGVzdCIpOwotICBBU1NFUlRfVFJVRShlbGVtZW50KTsKLSAgRVhQRUNUX0VRKEdldFBhcmFtKCkuZXhwZWN0ZWRfcmVzdWx0LCBDb21wdXRlVGV4dEFsdGVybmF0aXZlKGVsZW1lbnQpKTsKLX0KLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFRleHRBbHRlcm5hdGl2ZVRlc3QsIFRleHRBbHRlcm5hdGl2ZVRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICA6OnRlc3Rpbmc6OlZhbHVlc0luKEVudW1lcmF0ZVRlc3RzKCkpKTsKLX0gIC8vIG5hbWVzcGFjZSBhY2Nlc3NpYmlsaXR5Ci19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdHRzX2VuZ2luZS5oIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3R0c19lbmdpbmUuaAppbmRleCAxYTlkMTQxLi5mODk2MzMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdHRzX2VuZ2luZS5oCisrKyBiL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90dHNfZW5naW5lLmgKQEAgLTEsMjYgKzEsMjIgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BQ0NFU1NJQklMSVRZX1RUU19FTkdJTkVfSF8KICNkZWZpbmUgQ09CQUxUX0FDQ0VTU0lCSUxJVFlfVFRTX0VOR0lORV9IXwogCiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSAiY29iYWx0L2RvbS9kb2N1bWVudC5oIgotCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBhY2Nlc3NpYmlsaXR5IHsKIC8vIEludGVyZmFjZSBmb3IgYSBUVFMgKHRleHQtdG8tc3BlZWNoKSBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90dHNfbG9nZ2VyLmggYi9zcmMvY29iYWx0L2FjY2Vzc2liaWxpdHkvdHRzX2xvZ2dlci5oCmluZGV4IGU0OGFjNmMuLjlkOWVhM2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYWNjZXNzaWJpbGl0eS90dHNfbG9nZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9hY2Nlc3NpYmlsaXR5L3R0c19sb2dnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0FDQ0VTU0lCSUxJVFlfVFRTX0xPR0dFUl9IXwogI2RlZmluZSBDT0JBTFRfQUNDRVNTSUJJTElUWV9UVFNfTE9HR0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY291bnQvYWNjb3VudF9ldmVudC5oIGIvc3JjL2NvYmFsdC9hY2NvdW50L2FjY291bnRfZXZlbnQuaAppbmRleCAzN2JjZGU4Li42MjllNWU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2FjY291bnQvYWNjb3VudF9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvYWNjb3VudC9hY2NvdW50X2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BQ0NPVU5UX0FDQ09VTlRfRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0FDQ09VTlRfQUNDT1VOVF9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oIGIvc3JjL2NvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oCmluZGV4IDNiZGRmZWEuLjZjNWNkNjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYWNjb3VudC9hY2NvdW50X21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L2FjY291bnQvYWNjb3VudF9tYW5hZ2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BQ0NPVU5UX0FDQ09VTlRfTUFOQUdFUl9IXwogI2RlZmluZSBDT0JBTFRfQUNDT1VOVF9BQ0NPVU5UX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjb3VudC9hY2NvdW50X21hbmFnZXJfc3R1Yi5jYyBiL3NyYy9jb2JhbHQvYWNjb3VudC9hY2NvdW50X21hbmFnZXJfc3R1Yi5jYwppbmRleCA0NjM0YzhlLi5jMWQxODJhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2FjY291bnQvYWNjb3VudF9tYW5hZ2VyX3N0dWIuY2MKKysrIGIvc3JjL2NvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlcl9zdHViLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlcl9zdHViLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYWNjb3VudC9hY2NvdW50X21hbmFnZXJfc3R1Yi5oIGIvc3JjL2NvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlcl9zdHViLmgKaW5kZXggYmExY2RlYS4uNDk1NWQxMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlcl9zdHViLmgKKysrIGIvc3JjL2NvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlcl9zdHViLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BQ0NPVU5UX0FDQ09VTlRfTUFOQUdFUl9TVFVCX0hfCiAjZGVmaW5lIENPQkFMVF9BQ0NPVU5UX0FDQ09VTlRfTUFOQUdFUl9TVFVCX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY291bnQvc3RhcmJvYXJkL2FjY291bnRfbWFuYWdlci5jYyBiL3NyYy9jb2JhbHQvYWNjb3VudC9zdGFyYm9hcmQvYWNjb3VudF9tYW5hZ2VyLmNjCmluZGV4IDNhNTQ2YmIuLjI5MmU1NjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYWNjb3VudC9zdGFyYm9hcmQvYWNjb3VudF9tYW5hZ2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvYWNjb3VudC9zdGFyYm9hcmQvYWNjb3VudF9tYW5hZ2VyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2FjY291bnQvd2luL2FjY291bnRfbWFuYWdlci5jYyBiL3NyYy9jb2JhbHQvYWNjb3VudC93aW4vYWNjb3VudF9tYW5hZ2VyLmNjCmluZGV4IDI3N2E0NzIuLjY1MjI1ZDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYWNjb3VudC93aW4vYWNjb3VudF9tYW5hZ2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvYWNjb3VudC93aW4vYWNjb3VudF9tYW5hZ2VyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hY2NvdW50L2FjY291bnRfbWFuYWdlcl9zdHViLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vQXVkaW9CdWZmZXIuaWRsIGIvc3JjL2NvYmFsdC9hdWRpby9BdWRpb0J1ZmZlci5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwNjI5MzIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9BdWRpb0J1ZmZlci5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvQnVmZmVyCi0KLWludGVyZmFjZSBBdWRpb0J1ZmZlciB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBzYW1wbGVSYXRlOwotICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBsZW5ndGg7Ci0KLSAgLy8gaW4gc2Vjb25kcwotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGR1cmF0aW9uOwotICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBudW1iZXJPZkNoYW5uZWxzOwotCi0gIFtSYWlzZXNFeGNlcHRpb25dIEZsb2F0MzJBcnJheSBnZXRDaGFubmVsRGF0YSh1bnNpZ25lZCBsb25nIGNoYW5uZWwpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmlkbCBiL3NyYy9jb2JhbHQvYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkwNjQ0Zi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL0F1ZGlvQnVmZmVyU291cmNlTm9kZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvQnVmZmVyU291cmNlTm9kZQotCi1pbnRlcmZhY2UgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIDogQXVkaW9Ob2RlIHsKLSAgYXR0cmlidXRlIEF1ZGlvQnVmZmVyPyBidWZmZXI7Ci0KLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzdGFydChvcHRpb25hbCBkb3VibGUgd2hlbiA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZG91YmxlIG9mZnNldCA9IDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZG91YmxlIGR1cmF0aW9uKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzdG9wKG9wdGlvbmFsIGRvdWJsZSB3aGVuID0gMCk7Ci0KLSAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmVuZGVkOwotfTsKLQotdHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL0F1ZGlvQ29udGV4dC5pZGwgYi9zcmMvY29iYWx0L2F1ZGlvL0F1ZGlvQ29udGV4dC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwYTM4ZTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9BdWRpb0NvbnRleHQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLyNBdWRpb0NvbnRleHQtc2VjdGlvbgotCi1bQ29uc3RydWN0b3JdCi1pbnRlcmZhY2UgQXVkaW9Db250ZXh0IDogRXZlbnRUYXJnZXQgewotICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9EZXN0aW5hdGlvbk5vZGUgZGVzdGluYXRpb247Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBzYW1wbGVSYXRlOwotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGN1cnJlbnRUaW1lOwotCi0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSB2b2lkIGRlY29kZUF1ZGlvRGF0YSgKLSAgICAgIEFycmF5QnVmZmVyIGF1ZGlvRGF0YSwgRGVjb2RlU3VjY2Vzc0NhbGxiYWNrIHN1Y2Nlc3NDYWxsYmFjaywKLSAgICAgIG9wdGlvbmFsIERlY29kZUVycm9yQ2FsbGJhY2sgZXJyb3JDYWxsYmFjayk7Ci0KLSAgLy8gQXVkaW9Ob2RlIGNyZWF0aW9uCi0gIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBjcmVhdGVCdWZmZXJTb3VyY2UoKTsKLX07Ci0KLWNhbGxiYWNrIERlY29kZVN1Y2Nlc3NDYWxsYmFjayA9IHZvaWQoQXVkaW9CdWZmZXIgZGVjb2RlZERhdGEpOwotY2FsbGJhY2sgRGVjb2RlRXJyb3JDYWxsYmFjayA9IHZvaWQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vQXVkaW9EZXN0aW5hdGlvbk5vZGUuaWRsIGIvc3JjL2NvYmFsdC9hdWRpby9BdWRpb0Rlc3RpbmF0aW9uTm9kZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmY2VlM2UuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9BdWRpb0Rlc3RpbmF0aW9uTm9kZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvRGVzdGluYXRpb25Ob2RlCi0KLWludGVyZmFjZSBBdWRpb0Rlc3RpbmF0aW9uTm9kZSA6IEF1ZGlvTm9kZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIG1heENoYW5uZWxDb3VudDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL0F1ZGlvTm9kZS5pZGwgYi9zcmMvY29iYWx0L2F1ZGlvL0F1ZGlvTm9kZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlMDhjNzQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9BdWRpb05vZGUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLyNBdWRpb05vZGUtc2VjdGlvbgotCi1lbnVtIENoYW5uZWxDb3VudE1vZGUgewotICAibWF4IiwKLSAgImNsYW1wZWQtbWF4IiwKLSAgImV4cGxpY2l0IgotfTsKLQotZW51bSBDaGFubmVsSW50ZXJwcmV0YXRpb24gewotICAic3BlYWtlcnMiLAotICAiZGlzY3JldGUiCi19OwotCi1pbnRlcmZhY2UgQXVkaW9Ob2RlIDogRXZlbnRUYXJnZXQgewotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGNvbm5lY3QoQXVkaW9Ob2RlIGRlc3RpbmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBvdXRwdXQgPSAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBpbnB1dCA9IDApOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGRpc2Nvbm5lY3Qob3B0aW9uYWwgdW5zaWduZWQgbG9uZyBvdXRwdXQgPSAwKTsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9Db250ZXh0IGNvbnRleHQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIG51bWJlck9mSW5wdXRzOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBudW1iZXJPZk91dHB1dHM7Ci0KLSAgLy8gQ2hhbm5lbCB1cC1taXhpbmcgYW5kIGRvd24tbWl4aW5nIHJ1bGVzIGZvciBhbGwgaW5wdXRzLgotICBbUmFpc2VzRXhjZXB0aW9uPVNldHRlcl0gYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgY2hhbm5lbENvdW50OwotICBhdHRyaWJ1dGUgQ2hhbm5lbENvdW50TW9kZSBjaGFubmVsQ291bnRNb2RlOwotICBhdHRyaWJ1dGUgQ2hhbm5lbEludGVycHJldGF0aW9uIGNoYW5uZWxJbnRlcnByZXRhdGlvbjsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuY2MKaW5kZXggMmFhN2E2Mi4uYWFjNDBjOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hc3luY19hdWRpb19kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXN5bmNfYXVkaW9fZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXN5bmNfYXVkaW9fZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2FzeW5jX2F1ZGlvX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXN5bmNfYXVkaW9fZGVjb2Rlci5oCmluZGV4IDM4MjcyNjAuLmI4MmMwZGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXN5bmNfYXVkaW9fZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXN5bmNfYXVkaW9fZGVjb2Rlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQVVESU9fQVNZTkNfQVVESU9fREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfQVVESU9fQVNZTkNfQVVESU9fREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpby5neXAgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cAppbmRleCAzNTBhNTk5Li4wOWZjYmRhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cApAQCAtNTgsOCArNTgsOCBAQAogICAgICAgICAnYXVkaW9fbm9kZV9pbnB1dF9vdXRwdXRfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2F1ZGlvL2F1ZGlvLmd5cDphdWRpbycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICBdLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXIuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5jYwppbmRleCBhOTNlYmEyLi4zODk4MGM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5jYworKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmggYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5oCmluZGV4IGM1OGZlZjUuLjBhOTA3MWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0FVRElPX0FVRElPX0JVRkZFUl9IXwogI2RlZmluZSBDT0JBTFRfQVVESU9fQVVESU9fQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5pZGwgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNmOWUwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyLmlkbApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvQnVmZmVyCisKK2ludGVyZmFjZSBBdWRpb0J1ZmZlciB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBzYW1wbGVSYXRlOworICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBsZW5ndGg7CisKKyAgLy8gaW4gc2Vjb25kcworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGR1cmF0aW9uOworICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBudW1iZXJPZkNoYW5uZWxzOworCisgIFtSYWlzZXNFeGNlcHRpb25dIEZsb2F0MzJBcnJheSBnZXRDaGFubmVsRGF0YSh1bnNpZ25lZCBsb25nIGNoYW5uZWwpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuY2MKaW5kZXggMjIyYWI3YS4uZTU4ODY1MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19idWZmZXJfc291cmNlX25vZGUuaAppbmRleCBjZTRmNDJmLi4xMzdjOTVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19CVUZGRVJfU09VUkNFX05PREVfSF8KICNkZWZpbmUgQ09CQUxUX0FVRElPX0FVRElPX0JVRkZFUl9TT1VSQ0VfTk9ERV9IXwpAQCAtNjQsMTAgKzYyLDEwIEBACiAgIC8vIGRpc3BhdGNoZWQgdG8gQXVkaW9CdWZmZXJTb3VyY2VOb2RlIG5vZGUgdHlwZXMuIFdoZW4gdGhlIHBsYXliYWNrIG9mIHRoZQogICAvLyBidWZmZXIgZm9yIGFuIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBpcyBmaW5pc2hlZCwgYW4gZXZlbnQgb2YgdHlwZSBFdmVudAogICAvLyB3aWxsIGJlIGRpc3BhdGNoZWQgdG8gdGhlIGV2ZW50IGhhbmRsZXIuCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9uZW5kZWQoKSBjb25zdCB7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25lbmRlZCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmVuZGVkKCkpOwogICB9Ci0gIHZvaWQgc2V0X29uZW5kZWQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgZXZlbnRfbGlzdGVuZXIpIHsKKyAgdm9pZCBzZXRfb25lbmRlZChjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKSB7CiAgICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmVuZGVkKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5pZGwgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2J1ZmZlcl9zb3VyY2Vfbm9kZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjAzNzhmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmlkbApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvQnVmZmVyU291cmNlTm9kZQorCitpbnRlcmZhY2UgQXVkaW9CdWZmZXJTb3VyY2VOb2RlIDogQXVkaW9Ob2RlIHsKKyAgYXR0cmlidXRlIEF1ZGlvQnVmZmVyPyBidWZmZXI7CisKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzdGFydChvcHRpb25hbCBkb3VibGUgd2hlbiA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZG91YmxlIG9mZnNldCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgZG91YmxlIGR1cmF0aW9uKTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzdG9wKG9wdGlvbmFsIGRvdWJsZSB3aGVuID0gMCk7CisKKyAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmVuZGVkOworfTsKKwordHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2NvbnRleHQuY2MKaW5kZXggMDk2Mjk3Ny4uYjBjMmRkZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2NvbnRleHQuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5oCmluZGV4IDliM2FjNmYuLjJmYjMxMGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQVVESU9fQVVESU9fQ09OVEVYVF9IXwogI2RlZmluZSBDT0JBTFRfQVVESU9fQVVESU9fQ09OVEVYVF9IXwpAQCAtMzMsNyArMzEsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZW52aXJvbm1lbnRfc2V0dGluZ3MuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBhdWRpbyB7CkBAIC04MiwxMSArODAsMTEgQEAKICAgLy8gVGhlIEF1ZGlvQnVmZmVyIGlzIHJlcHJlc2VudGluZyB0aGUgZGVjb2RlZCBQQ00gYXVkaW8gZGF0YS4KICAgdHlwZWRlZiBzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb248dm9pZCgKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+JiBkZWNvZGVkX2RhdGEpPiBEZWNvZGVTdWNjZXNzQ2FsbGJhY2s7Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8RGVjb2RlU3VjY2Vzc0NhbGxiYWNrPiBEZWNvZGVTdWNjZXNzQ2FsbGJhY2tBcmc7CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxEZWNvZGVTdWNjZXNzQ2FsbGJhY2s+IERlY29kZVN1Y2Nlc3NDYWxsYmFja0FyZzsKICAgdHlwZWRlZiBEZWNvZGVTdWNjZXNzQ2FsbGJhY2tBcmc6OlJlZmVyZW5jZSBEZWNvZGVTdWNjZXNzQ2FsbGJhY2tSZWZlcmVuY2U7CiAKICAgdHlwZWRlZiBzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb248dm9pZCgpPiBEZWNvZGVFcnJvckNhbGxiYWNrOwotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PERlY29kZUVycm9yQ2FsbGJhY2s+IERlY29kZUVycm9yQ2FsbGJhY2tBcmc7CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxEZWNvZGVFcnJvckNhbGxiYWNrPiBEZWNvZGVFcnJvckNhbGxiYWNrQXJnOwogICB0eXBlZGVmIERlY29kZUVycm9yQ2FsbGJhY2tBcmc6OlJlZmVyZW5jZSBEZWNvZGVFcnJvckNhbGxiYWNrUmVmZXJlbmNlOwogCiAgIEF1ZGlvQ29udGV4dCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19jb250ZXh0LmlkbCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWYzYmY0NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fY29udGV4dC5pZGwKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYmF1ZGlvLyNBdWRpb0NvbnRleHQtc2VjdGlvbgorCitbQ29uc3RydWN0b3JdCitpbnRlcmZhY2UgQXVkaW9Db250ZXh0IDogRXZlbnRUYXJnZXQgeworICByZWFkb25seSBhdHRyaWJ1dGUgQXVkaW9EZXN0aW5hdGlvbk5vZGUgZGVzdGluYXRpb247CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBzYW1wbGVSYXRlOworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGN1cnJlbnRUaW1lOworCisgIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSB2b2lkIGRlY29kZUF1ZGlvRGF0YSgKKyAgICAgIEFycmF5QnVmZmVyIGF1ZGlvRGF0YSwgRGVjb2RlU3VjY2Vzc0NhbGxiYWNrIHN1Y2Nlc3NDYWxsYmFjaywKKyAgICAgIG9wdGlvbmFsIERlY29kZUVycm9yQ2FsbGJhY2sgZXJyb3JDYWxsYmFjayk7CisKKyAgLy8gQXVkaW9Ob2RlIGNyZWF0aW9uCisgIEF1ZGlvQnVmZmVyU291cmNlTm9kZSBjcmVhdGVCdWZmZXJTb3VyY2UoKTsKK307CisKK2NhbGxiYWNrIERlY29kZVN1Y2Nlc3NDYWxsYmFjayA9IHZvaWQoQXVkaW9CdWZmZXIgZGVjb2RlZERhdGEpOworY2FsbGJhY2sgRGVjb2RlRXJyb3JDYWxsYmFjayA9IHZvaWQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGVzdGluYXRpb25fbm9kZS5jYyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGVzdGluYXRpb25fbm9kZS5jYwppbmRleCBlMGVkYTJiLi43OGQ0MTRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2Rlc3RpbmF0aW9uX25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGVzdGluYXRpb25fbm9kZS5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmgKaW5kZXggNTBiZmU3ZS4uZGZiMzgyNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19ERVNUSU5BVElPTl9OT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9BVURJT19BVURJT19ERVNUSU5BVElPTl9OT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2Rlc3RpbmF0aW9uX25vZGUuaWRsIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NGNlZjAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmlkbApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvRGVzdGluYXRpb25Ob2RlCisKK2ludGVyZmFjZSBBdWRpb0Rlc3RpbmF0aW9uTm9kZSA6IEF1ZGlvTm9kZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIG1heENoYW5uZWxDb3VudDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2RldmljZS5jYyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmNjCmluZGV4IGU2NjY5NzAuLjIwNWQzYzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19kZXZpY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXZpY2UuaCBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZGV2aWNlLmgKaW5kZXggNmI3NTA2MS4uMDZlOTQ2OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19kZXZpY2UuaAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2RldmljZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQVVESU9fQVVESU9fREVWSUNFX0hfCiAjZGVmaW5lIENPQkFMVF9BVURJT19BVURJT19ERVZJQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXIuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyLmNjCmluZGV4IGE4NTg3ODkuLjA4Y2EyYzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlci5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlci5oCmluZGV4IDJkMzVhMjUuLmI3Yzk1Y2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXIuaAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19GSUxFX1JFQURFUl9IXwogI2RlZmluZSBDT0JBTFRfQVVESU9fQVVESU9fRklMRV9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXJfd2F2LmNjIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlcl93YXYuY2MKaW5kZXggZDA4NzVmMi4uNDQzYzEwMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlcl93YXYuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlcl93YXYuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19maWxlX3JlYWRlcl93YXYuaAppbmRleCBkYzM2OTlhLi4yYzcxODVlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2ZpbGVfcmVhZGVyX3dhdi5oCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fZmlsZV9yZWFkZXJfd2F2LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19GSUxFX1JFQURFUl9XQVZfSF8KICNkZWZpbmUgQ09CQUxUX0FVRElPX0FVRElPX0ZJTEVfUkVBREVSX1dBVl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19oZWxwZXJzLmggYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaAppbmRleCAyZjBjMDZhLi4wN2I2MGM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX2hlbHBlcnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0FVRElPX0FVRElPX0hFTFBFUlNfSF8KICNkZWZpbmUgQ09CQUxUX0FVRElPX0FVRElPX0hFTFBFUlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZS5jYyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZS5jYwppbmRleCBhNzQ3OGNhLi45NjFiODYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19ub2RlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZS5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlLmgKaW5kZXggMDFhNTc4ZC4uYTY5ZjViYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19OT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9BVURJT19BVURJT19OT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGUuaWRsIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZmJiNzMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlLmlkbApAQCAtMCwwICsxLDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2ViYXVkaW8vI0F1ZGlvTm9kZS1zZWN0aW9uCisKK2VudW0gQ2hhbm5lbENvdW50TW9kZSB7CisgICJtYXgiLAorICAiY2xhbXBlZC1tYXgiLAorICAiZXhwbGljaXQiCit9OworCitlbnVtIENoYW5uZWxJbnRlcnByZXRhdGlvbiB7CisgICJzcGVha2VycyIsCisgICJkaXNjcmV0ZSIKK307CisKK2ludGVyZmFjZSBBdWRpb05vZGUgOiBFdmVudFRhcmdldCB7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgY29ubmVjdChBdWRpb05vZGUgZGVzdGluYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCB1bnNpZ25lZCBsb25nIG91dHB1dCA9IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGlucHV0ID0gMCk7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgZGlzY29ubmVjdChvcHRpb25hbCB1bnNpZ25lZCBsb25nIG91dHB1dCA9IDApOworCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBdWRpb0NvbnRleHQgY29udGV4dDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZJbnB1dHM7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIG51bWJlck9mT3V0cHV0czsKKworICAvLyBDaGFubmVsIHVwLW1peGluZyBhbmQgZG93bi1taXhpbmcgcnVsZXMgZm9yIGFsbCBpbnB1dHMuCisgIFtSYWlzZXNFeGNlcHRpb249U2V0dGVyXSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBjaGFubmVsQ291bnQ7CisgIGF0dHJpYnV0ZSBDaGFubmVsQ291bnRNb2RlIGNoYW5uZWxDb3VudE1vZGU7CisgIGF0dHJpYnV0ZSBDaGFubmVsSW50ZXJwcmV0YXRpb24gY2hhbm5lbEludGVycHJldGF0aW9uOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dC5jYyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dC5jYwppbmRleCBiN2FjMDg2Li45NDVmY2I4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXQuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dC5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0LmgKaW5kZXggMWVkM2MyMS4uY2UxY2RhOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0LmgKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19OT0RFX0lOUFVUX0hfCiAjZGVmaW5lIENPQkFMVF9BVURJT19BVURJT19OT0RFX0lOUFVUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXRfb3V0cHV0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfaW5wdXRfb3V0cHV0X3Rlc3QuY2MKaW5kZXggMDk1MjE3Zi4uYmZmN2RlMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX2lucHV0X291dHB1dF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9pbnB1dF9vdXRwdXRfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2F1ZGlvL2F1ZGlvX2NvbnRleHQuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9vdXRwdXQuY2MgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfb3V0cHV0LmNjCmluZGV4IDc0N2JjMDEuLjQzZmI5YWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9vdXRwdXQuY2MKKysrIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX291dHB1dC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9vdXRwdXQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX291dHB1dC5oIGIvc3JjL2NvYmFsdC9hdWRpby9hdWRpb19ub2RlX291dHB1dC5oCmluZGV4IGRlY2Q1NGMuLmNiY2E0NDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYXVkaW8vYXVkaW9fbm9kZV9vdXRwdXQuaAorKysgYi9zcmMvY29iYWx0L2F1ZGlvL2F1ZGlvX25vZGVfb3V0cHV0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9BVURJT19BVURJT19OT0RFX09VVFBVVF9IXwogI2RlZmluZSBDT0JBTFRfQVVESU9fQVVESU9fTk9ERV9PVVRQVVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9hZGRyZXNzX3Nhbml0aXplci5oIGIvc3JjL2NvYmFsdC9iYXNlL2FkZHJlc3Nfc2FuaXRpemVyLmgKaW5kZXggZTQ0M2NjOS4uYWVmNmExZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2FkZHJlc3Nfc2FuaXRpemVyLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2FkZHJlc3Nfc2FuaXRpemVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX0FERFJFU1NfU0FOSVRJWkVSX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0FERFJFU1NfU0FOSVRJWkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvYmFzZS5neXAgYi9zcmMvY29iYWx0L2Jhc2UvYmFzZS5neXAKaW5kZXggODFiMGIwZS4uZDQ1Mzg1NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9iYXNlLmd5cApAQCAtMTA0LDcgKzEwNCw3IEBACiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJ2Jhc2UnLAotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICBdLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2NfdmFsLmNjIGIvc3JjL2NvYmFsdC9iYXNlL2NfdmFsLmNjCmluZGV4IDgxMjQzM2IuLmNjNDFhYjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbC5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvY192YWwuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2NfdmFsLmgiCiAKICNpbmNsdWRlIDxzc3RyZWFtPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2NfdmFsLmggYi9zcmMvY29iYWx0L2Jhc2UvY192YWwuaAppbmRleCBlMDdiNTQzLi44MjllM2QzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY192YWwuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvY192YWwuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9CQVNFX0NfVkFMX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0NfVkFMX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF9jb2xsZWN0aW9uX2VudHJ5X3N0YXRzLmggYi9zcmMvY29iYWx0L2Jhc2UvY192YWxfY29sbGVjdGlvbl9lbnRyeV9zdGF0cy5oCmluZGV4IGMxZGQ4MDcuLjI4Y2Q5MzggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF9jb2xsZWN0aW9uX2VudHJ5X3N0YXRzLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX2NvbGxlY3Rpb25fZW50cnlfc3RhdHMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9CQVNFX0NfVkFMX0NPTExFQ1RJT05fRU5UUllfU1RBVFNfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfQ19WQUxfQ09MTEVDVElPTl9FTlRSWV9TVEFUU19IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfY29sbGVjdGlvbl9lbnRyeV9zdGF0c190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX2NvbGxlY3Rpb25fZW50cnlfc3RhdHNfdGVzdC5jYwppbmRleCAzYTE3MTg5Li5jNTg3MWFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfY29sbGVjdGlvbl9lbnRyeV9zdGF0c190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF9jb2xsZWN0aW9uX2VudHJ5X3N0YXRzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8c3RyaW5nPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfY29sbGVjdGlvbl90aW1lcl9zdGF0cy5oIGIvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX2NvbGxlY3Rpb25fdGltZXJfc3RhdHMuaAppbmRleCBhZmYyYzAyLi5lZGE5NmI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfY29sbGVjdGlvbl90aW1lcl9zdGF0cy5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF9jb2xsZWN0aW9uX3RpbWVyX3N0YXRzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfQkFTRV9DX1ZBTF9DT0xMRUNUSU9OX1RJTUVSX1NUQVRTX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0NfVkFMX0NPTExFQ1RJT05fVElNRVJfU1RBVFNfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX2NvbGxlY3Rpb25fdGltZXJfc3RhdHNfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF9jb2xsZWN0aW9uX3RpbWVyX3N0YXRzX3Rlc3QuY2MKaW5kZXggOGIwZjZmMy4uYjAwN2QyNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX2NvbGxlY3Rpb25fdGltZXJfc3RhdHNfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvY192YWxfY29sbGVjdGlvbl90aW1lcl9zdGF0c190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPHN0cmluZz4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGVzdC5jYwppbmRleCBhZGZiYjYxLi4zZGM0MTZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxsaW1pdHM+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF90aW1lX2ludGVydmFsX2VudHJ5X3N0YXRzLmggYi9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGltZV9pbnRlcnZhbF9lbnRyeV9zdGF0cy5oCmluZGV4IGQ1M2IzNzcuLjI5NzA1Y2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF90aW1lX2ludGVydmFsX2VudHJ5X3N0YXRzLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX3RpbWVfaW50ZXJ2YWxfZW50cnlfc3RhdHMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9CQVNFX0NfVkFMX1RJTUVfSU5URVJWQUxfRU5UUllfU1RBVFNfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfQ19WQUxfVElNRV9JTlRFUlZBTF9FTlRSWV9TVEFUU19IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGltZV9pbnRlcnZhbF9lbnRyeV9zdGF0c190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX3RpbWVfaW50ZXJ2YWxfZW50cnlfc3RhdHNfdGVzdC5jYwppbmRleCBjZDRjZWYwLi5jNGEyZWZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGltZV9pbnRlcnZhbF9lbnRyeV9zdGF0c190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF90aW1lX2ludGVydmFsX2VudHJ5X3N0YXRzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8c3RyaW5nPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGltZV9pbnRlcnZhbF90aW1lcl9zdGF0cy5oIGIvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX3RpbWVfaW50ZXJ2YWxfdGltZXJfc3RhdHMuaAppbmRleCAwMGQ5OTJhLi43ZWEyOTI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGltZV9pbnRlcnZhbF90aW1lcl9zdGF0cy5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF90aW1lX2ludGVydmFsX3RpbWVyX3N0YXRzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfQkFTRV9DX1ZBTF9USU1FX0lOVEVSVkFMX1RJTUVSX1NUQVRTX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0NfVkFMX1RJTUVfSU5URVJWQUxfVElNRVJfU1RBVFNfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX3RpbWVfaW50ZXJ2YWxfdGltZXJfc3RhdHNfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmFzZS9jX3ZhbF90aW1lX2ludGVydmFsX3RpbWVyX3N0YXRzX3Rlc3QuY2MKaW5kZXggNWFiMGE2Ny4uNGE2NmFmOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2NfdmFsX3RpbWVfaW50ZXJ2YWxfdGltZXJfc3RhdHNfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvY192YWxfdGltZV9pbnRlcnZhbF90aW1lcl9zdGF0c190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPHN0cmluZz4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2Nsb2NrLmggYi9zcmMvY29iYWx0L2Jhc2UvY2xvY2suaAppbmRleCAyYjliNTZkLi4wMWQ1NDQyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY2xvY2suaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvY2xvY2suaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfQ0xPQ0tfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfQ0xPQ0tfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9jb2JhbHRfcGF0aHMuaCBiL3NyYy9jb2JhbHQvYmFzZS9jb2JhbHRfcGF0aHMuaAppbmRleCAzOTcwOWI1Li5mMmY0MThjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY29iYWx0X3BhdGhzLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2NvYmFsdF9wYXRocy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9DT0JBTFRfUEFUSFNfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfQ09CQUxUX1BBVEhTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvY29tcGlsZXIuaCBiL3NyYy9jb2JhbHQvYmFzZS9jb21waWxlci5oCmluZGV4IGE3ZDdmOWUuLmI5ZDkyNjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9jb21waWxlci5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9jb21waWxlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9DT01QSUxFUl9IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9DT01QSUxFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2NvbnNvbGVfY29tbWFuZHMuY2MgYi9zcmMvY29iYWx0L2Jhc2UvY29uc29sZV9jb21tYW5kcy5jYwppbmRleCA3M2U0ZjFiLi45MzM5ZjY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvY29uc29sZV9jb21tYW5kcy5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvY29uc29sZV9jb21tYW5kcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9jb25zb2xlX2NvbW1hbmRzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9jb25zb2xlX2NvbW1hbmRzLmggYi9zcmMvY29iYWx0L2Jhc2UvY29uc29sZV9jb21tYW5kcy5oCmluZGV4IGYxMjExM2UuLjQ5NzNhNjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9jb25zb2xlX2NvbW1hbmRzLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2NvbnNvbGVfY29tbWFuZHMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfQ09OU09MRV9DT01NQU5EU19IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9DT05TT0xFX0NPTU1BTkRTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvZGVlcF9saW5rX2V2ZW50LmggYi9zcmMvY29iYWx0L2Jhc2UvZGVlcF9saW5rX2V2ZW50LmgKaW5kZXggYjVjMmFmYS4uZDcwYzdkZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2RlZXBfbGlua19ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9kZWVwX2xpbmtfZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfREVFUF9MSU5LX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0RFRVBfTElOS19FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2VuYWJsZV9pZi5oIGIvc3JjL2NvYmFsdC9iYXNlL2VuYWJsZV9pZi5oCmluZGV4IGM0OGE3M2IuLmM3ZmQ1MTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9lbmFibGVfaWYuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvZW5hYmxlX2lmLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX0VOQUJMRV9JRl9IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9FTkFCTEVfSUZfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9ldmVudC5oIGIvc3JjL2NvYmFsdC9iYXNlL2V2ZW50LmgKaW5kZXggNzIxZDFiMC4uYjhiYTZhNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvZXZlbnRfZGlzcGF0Y2hlci5jYyBiL3NyYy9jb2JhbHQvYmFzZS9ldmVudF9kaXNwYXRjaGVyLmNjCmluZGV4IGJlYTBjNjUuLjZmZjZhYjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9ldmVudF9kaXNwYXRjaGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9ldmVudF9kaXNwYXRjaGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2V2ZW50X2Rpc3BhdGNoZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2V2ZW50X2Rpc3BhdGNoZXIuaCBiL3NyYy9jb2JhbHQvYmFzZS9ldmVudF9kaXNwYXRjaGVyLmgKaW5kZXggMTNmZGRhNi4uNDUxNzllNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2V2ZW50X2Rpc3BhdGNoZXIuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvZXZlbnRfZGlzcGF0Y2hlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9FVkVOVF9ESVNQQVRDSEVSX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0VWRU5UX0RJU1BBVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9maXhlZF9zaXplX2xydV9jYWNoZS5oIGIvc3JjL2NvYmFsdC9iYXNlL2ZpeGVkX3NpemVfbHJ1X2NhY2hlLmgKaW5kZXggMTdlNTNiOC4uOGExZmFhOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2ZpeGVkX3NpemVfbHJ1X2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2ZpeGVkX3NpemVfbHJ1X2NhY2hlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfQkFTRV9GSVhFRF9TSVpFX0xSVV9DQUNIRV9IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9GSVhFRF9TSVpFX0xSVV9DQUNIRV9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvZml4ZWRfc2l6ZV9scnVfY2FjaGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmFzZS9maXhlZF9zaXplX2xydV9jYWNoZV90ZXN0LmNjCmluZGV4IDZmZWExN2YuLmYxMWJmNTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9maXhlZF9zaXplX2xydV9jYWNoZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9maXhlZF9zaXplX2xydV9jYWNoZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2ZpeGVkX3NpemVfbHJ1X2NhY2hlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9nZW5lcmF0ZWRfcmVzb3VyY2VzX3R5cGVzLmggYi9zcmMvY29iYWx0L2Jhc2UvZ2VuZXJhdGVkX3Jlc291cmNlc190eXBlcy5oCmluZGV4IGZlY2IzMmMuLjYwMjVjMTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9nZW5lcmF0ZWRfcmVzb3VyY2VzX3R5cGVzLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2dlbmVyYXRlZF9yZXNvdXJjZXNfdHlwZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfR0VORVJBVEVEX1JFU09VUkNFU19UWVBFU19IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9HRU5FUkFURURfUkVTT1VSQ0VTX1RZUEVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvaW5pdF9jb2JhbHQuY2MgYi9zcmMvY29iYWx0L2Jhc2UvaW5pdF9jb2JhbHQuY2MKaW5kZXggNjgwNmQyOS4uZDRhZjAyZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2luaXRfY29iYWx0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9pbml0X2NvYmFsdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9pbml0X2NvYmFsdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvaW5pdF9jb2JhbHQuaCBiL3NyYy9jb2JhbHQvYmFzZS9pbml0X2NvYmFsdC5oCmluZGV4IDFiYTljZGYuLmQ3MzgzOWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9pbml0X2NvYmFsdC5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9pbml0X2NvYmFsdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9JTklUX0NPQkFMVF9IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9JTklUX0NPQkFMVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2xhbmd1YWdlLmNjIGIvc3JjL2NvYmFsdC9iYXNlL2xhbmd1YWdlLmNjCmluZGV4IGE2ODFkN2UuLjkzODY5YTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9sYW5ndWFnZS5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvbGFuZ3VhZ2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvbGFuZ3VhZ2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2xhbmd1YWdlLmggYi9zcmMvY29iYWx0L2Jhc2UvbGFuZ3VhZ2UuaAppbmRleCBjNGQzZDI1Li4xNzQwMzVmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvbGFuZ3VhZ2UuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvbGFuZ3VhZ2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfTEFOR1VBR0VfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfTEFOR1VBR0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9sb2NhbGl6ZWRfc3RyaW5ncy5jYyBiL3NyYy9jb2JhbHQvYmFzZS9sb2NhbGl6ZWRfc3RyaW5ncy5jYwppbmRleCBkYjY1NjIxLi5kNjAxZGNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvbG9jYWxpemVkX3N0cmluZ3MuY2MKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2xvY2FsaXplZF9zdHJpbmdzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2xvY2FsaXplZF9zdHJpbmdzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9sb2NhbGl6ZWRfc3RyaW5ncy5oIGIvc3JjL2NvYmFsdC9iYXNlL2xvY2FsaXplZF9zdHJpbmdzLmgKaW5kZXggY2Y3ODgwNS4uNjBmZWNhZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2xvY2FsaXplZF9zdHJpbmdzLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL2xvY2FsaXplZF9zdHJpbmdzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX0xPQ0FMSVpFRF9TVFJJTkdTX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0xPQ0FMSVpFRF9TVFJJTkdTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvbG9nX21lc3NhZ2VfaGFuZGxlci5jYyBiL3NyYy9jb2JhbHQvYmFzZS9sb2dfbWVzc2FnZV9oYW5kbGVyLmNjCmluZGV4IDQ1MTE0ZGIuLjJmMDZkMDAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9sb2dfbWVzc2FnZV9oYW5kbGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9sb2dfbWVzc2FnZV9oYW5kbGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2xvZ19tZXNzYWdlX2hhbmRsZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL2xvZ19tZXNzYWdlX2hhbmRsZXIuaCBiL3NyYy9jb2JhbHQvYmFzZS9sb2dfbWVzc2FnZV9oYW5kbGVyLmgKaW5kZXggZDY2NTk5Zi4uNTVhMGRmYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL2xvZ19tZXNzYWdlX2hhbmRsZXIuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvbG9nX21lc3NhZ2VfaGFuZGxlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9MT0dfTUVTU0FHRV9IQU5ETEVSX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX0xPR19NRVNTQUdFX0hBTkRMRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmNjIGIvc3JjL2NvYmFsdC9iYXNlL21hdGguY2MKaW5kZXggOWM2ZWNjZC4uZDMzNTQ5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL21hdGguY2MKKysrIGIvc3JjL2NvYmFsdC9iYXNlL21hdGguY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvbWF0aC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oIGIvc3JjL2NvYmFsdC9iYXNlL21hdGguaAppbmRleCA2YTMwMzE0Li43ZWIxZjUzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvbWF0aC5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9tYXRoLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX01BVEhfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfTUFUSF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL21lc3NhZ2VfcXVldWUuaCBiL3NyYy9jb2JhbHQvYmFzZS9tZXNzYWdlX3F1ZXVlLmgKaW5kZXggM2M3YWQ3OC4uMjZkMDYxOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL21lc3NhZ2VfcXVldWUuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvbWVzc2FnZV9xdWV1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9NRVNTQUdFX1FVRVVFX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX01FU1NBR0VfUVVFVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9wYXRoX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9iYXNlL3BhdGhfcHJvdmlkZXIuY2MKaW5kZXggMTE0NzE3Yi4uODMwMzFhMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3BhdGhfcHJvdmlkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3BhdGhfcHJvdmlkZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcGF0aF9wcm92aWRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvcGF0aF9wcm92aWRlci5oIGIvc3JjL2NvYmFsdC9iYXNlL3BhdGhfcHJvdmlkZXIuaAppbmRleCAzNjNlNjJjLi41MDMyZmU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvcGF0aF9wcm92aWRlci5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9wYXRoX3Byb3ZpZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX1BBVEhfUFJPVklERVJfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfUEFUSF9QUk9WSURFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3BvbGxlci5oIGIvc3JjL2NvYmFsdC9iYXNlL3BvbGxlci5oCmluZGV4IDhhYWRlYjAuLmI2M2ZmOWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9wb2xsZXIuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvcG9sbGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX1BPTExFUl9IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9QT0xMRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIGIvc3JjL2NvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgKaW5kZXggYWQ0OTI1Ny4uYzU2MWNkNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX1BPTFlNT1JQSElDX0RPV05DQVNUX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX1BPTFlNT1JQSElDX0RPV05DQVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZXF1YXRhYmxlLmggYi9zcmMvY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZXF1YXRhYmxlLmgKaW5kZXggNDJmZTlhMi4uZjc0YmI3YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3BvbHltb3JwaGljX2VxdWF0YWJsZS5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19lcXVhdGFibGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfUE9MWU1PUlBISUNfRVFVQVRBQkxFX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX1BPTFlNT1JQSElDX0VRVUFUQUJMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3NvdXJjZV9sb2NhdGlvbi5oIGIvc3JjL2NvYmFsdC9iYXNlL3NvdXJjZV9sb2NhdGlvbi5oCmluZGV4IGM3MjViMzguLjFlZGQ3NTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS9zb3VyY2VfbG9jYXRpb24uaAorKysgYi9zcmMvY29iYWx0L2Jhc2Uvc291cmNlX2xvY2F0aW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX1NPVVJDRV9MT0NBVElPTl9IXwogI2RlZmluZSBDT0JBTFRfQkFTRV9TT1VSQ0VfTE9DQVRJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS9zdG9wX3dhdGNoLmNjIGIvc3JjL2NvYmFsdC9iYXNlL3N0b3Bfd2F0Y2guY2MKaW5kZXggZDc4MTRmZS4uZDVkYTkyYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3N0b3Bfd2F0Y2guY2MKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3N0b3Bfd2F0Y2guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2Uvc3RvcF93YXRjaC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2Uvc3RvcF93YXRjaC5oIGIvc3JjL2NvYmFsdC9iYXNlL3N0b3Bfd2F0Y2guaAppbmRleCA5N2ZlZmQzLi41OWI2YzcyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2Uvc3RvcF93YXRjaC5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS9zdG9wX3dhdGNoLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX1NUT1BfV0FUQ0hfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfU1RPUF9XQVRDSF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3Rva2VuLmNjIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2VuLmNjCmluZGV4IDUxNThhMGIuLmFiM2QyYzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS90b2tlbi5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW4uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3Rva2VuLmggYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uaAppbmRleCBhZjBhNmNhLi4wOWFiODExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW4uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfVE9LRU5fSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfVE9LRU5fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS90b2tlbl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2VuX3Rlc3QuY2MKaW5kZXggM2ZjYjMxMy4uOTU2NjZjMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3Rva2VuX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3Rva2VuX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW4uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3Rva2Vucy5jYyBiL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuY2MKaW5kZXggMjZkOGJkNC4uODRmYzliYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3Rva2Vucy5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmggYi9zcmMvY29iYWx0L2Jhc2UvdG9rZW5zLmgKaW5kZXggM2FlMWNkYy4uZTJiZTU1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3Rva2Vucy5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS90b2tlbnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfVE9LRU5TX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX1RPS0VOU19IXwpAQCAtMjUsMTYgKzIzLDE4IEBACiAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAjZGVmaW5lIFRPS0VOU19GT1JfRUFDSF9XSVRIX05BTUVfT05MWShNYWNyb09wV2l0aE5hbWVPbmx5KSAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFkZHNvdXJjZWJ1ZmZlcikgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYWRkdHJhY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShhYm9ydCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFkZGl0aW9ucykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShhbGwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGFsdCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYW5pbWF0aW9uZW5kKSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShhc3NlcnRpdmUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGF0dHJpYnV0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoYXR0cmlidXRlcykgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShibHVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNhbnBsYXkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoY2FucGxheXRocm91Z2gpICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTWFjcm9PcFdpdGhOYW1lT25seShjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KGNoYXJhY3RlckRhdGEpICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkoY2hpbGRMaXN0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShjbG9zZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTY5LDYgKzY5LDcgQEAKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlYWR5c3RhdGVjaGFuZ2UpICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkocmVtb3ZhbHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShyZW1vdmVzb3VyY2VidWZmZXIpICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHJlbW92ZXRyYWNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkocmVzdWx0KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seShzZWN1cml0eXBvbGljeXZpb2xhdGlvbikgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHNlZWtlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtODYsNiArODcsOSBAQAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkodGltZXVwZGF0ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seSh0cmFuc2l0aW9uZW5kKSAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHVubG9hZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkodXBkYXRlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgTWFjcm9PcFdpdGhOYW1lT25seSh1cGRhdGVlbmQpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBNYWNyb09wV2l0aE5hbWVPbmx5KHVwZGF0ZXN0YXJ0KSAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIE1hY3JvT3BXaXRoTmFtZU9ubHkodm9sdW1lY2hhbmdlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgTWFjcm9PcFdpdGhOYW1lT25seSh3YWl0aW5nKQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvdHlwZV9pZC5oIGIvc3JjL2NvYmFsdC9iYXNlL3R5cGVfaWQuaAppbmRleCA2N2FiMWJlLi5kZTYwMzZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvdHlwZV9pZC5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS90eXBlX2lkLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CQVNFX1RZUEVfSURfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfVFlQRV9JRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3VuaWNvZGUvY2hhcmFjdGVyLmNjIGIvc3JjL2NvYmFsdC9iYXNlL3VuaWNvZGUvY2hhcmFjdGVyLmNjCmluZGV4IDY2YTE4ODAuLmE1ZmI2YWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS91bmljb2RlL2NoYXJhY3Rlci5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvdW5pY29kZS9jaGFyYWN0ZXIuY2MKQEAgLTEsMzIgKzEsMzAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS91bmljb2RlL2NoYXJhY3Rlci5oIGIvc3JjL2NvYmFsdC9iYXNlL3VuaWNvZGUvY2hhcmFjdGVyLmgKaW5kZXggYmE4ZmY5YS4uZGFlMWIxYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3VuaWNvZGUvY2hhcmFjdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3VuaWNvZGUvY2hhcmFjdGVyLmgKQEAgLTEsMzIgKzEsMzAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgKEMpIDIwMTYgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLworLy8gQ29weXJpZ2h0IChDKSAyMDE2IEdvb2dsZSBJbmMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfVU5JQ09ERV9DSEFSQUNURVJfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfVU5JQ09ERV9DSEFSQUNURVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS91bmljb2RlL2NoYXJhY3Rlcl92YWx1ZXMuaCBiL3NyYy9jb2JhbHQvYmFzZS91bmljb2RlL2NoYXJhY3Rlcl92YWx1ZXMuaAppbmRleCAwNTE4ZDg3Li41OGI3MTRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvdW5pY29kZS9jaGFyYWN0ZXJfdmFsdWVzLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3VuaWNvZGUvY2hhcmFjdGVyX3ZhbHVlcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9VTklDT0RFX0NIQVJBQ1RFUl9WQUxVRVNfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfVU5JQ09ERV9DSEFSQUNURVJfVkFMVUVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jhc2UvdW51c2VkLmggYi9zcmMvY29iYWx0L2Jhc2UvdW51c2VkLmgKaW5kZXggMjVkOTk4Yy4uODVlZGZhNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3VudXNlZC5oCisrKyBiL3NyYy9jb2JhbHQvYmFzZS91bnVzZWQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfVU5VU0VEX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX1VOVVNFRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3VzZXJfbG9nLmNjIGIvc3JjL2NvYmFsdC9iYXNlL3VzZXJfbG9nLmNjCmluZGV4IDRkOTE3NjguLjljZTBmNzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmFzZS91c2VyX2xvZy5jYworKysgYi9zcmMvY29iYWx0L2Jhc2UvdXNlcl9sb2cuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdXNlcl9sb2cuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3VzZXJfbG9nLmggYi9zcmMvY29iYWx0L2Jhc2UvdXNlcl9sb2cuaAppbmRleCA1YzQ3OTEwLi4wMTRmNzM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2UvdXNlcl9sb2cuaAorKysgYi9zcmMvY29iYWx0L2Jhc2UvdXNlcl9sb2cuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JBU0VfVVNFUl9MT0dfSF8KICNkZWZpbmUgQ09CQUxUX0JBU0VfVVNFUl9MT0dfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmFzZS93cmFwX21haW4uaCBiL3NyYy9jb2JhbHQvYmFzZS93cmFwX21haW4uaAppbmRleCAxOTNlMzc5Li44NjExNGU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jhc2Uvd3JhcF9tYWluLmgKKysrIGIvc3JjL2NvYmFsdC9iYXNlL3dyYXBfbWFpbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8gVGhpcyBoZWFkZXIgZGVmaW5lcyB0d28gbWFjcm9zLCBDT0JBTFRfV1JBUF9TSU1QTEVfTUFJTigpIGFuZAogLy8gQ09CQUxUX1dSQVBfQkFTRV9NQUlOKCkuIFNpbXBsZSBtYWluIGlzIGZvciBwcm9ncmFtcyB0aGF0IGFyZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iYXNlL3dyYXBfbWFpbl9zdGFyYm9hcmQuaCBiL3NyYy9jb2JhbHQvYmFzZS93cmFwX21haW5fc3RhcmJvYXJkLmgKaW5kZXggZGFkMzcwOC4uMTdkOGQ0MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iYXNlL3dyYXBfbWFpbl9zdGFyYm9hcmQuaAorKysgYi9zcmMvY29iYWx0L2Jhc2Uvd3JhcF9tYWluX3N0YXJib2FyZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQkFTRV9XUkFQX01BSU5fU1RBUkJPQVJEX0hfCiAjZGVmaW5lIENPQkFMVF9CQVNFX1dSQVBfTUFJTl9TVEFSQk9BUkRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvYmluZGluZ3MuZ3lwaSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvYmluZGluZ3MuZ3lwaQppbmRleCAzZTc2NzMzLi4yZGI4YmI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2JpbmRpbmdzLmd5cGkKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9iaW5kaW5ncy5neXBpCkBAIC0xOCwxMCArMTgsOSBAQAogIyB0YXJnZXQgd2hpY2ggd2lsbCBiZSBkZWZpbmVkIGluIHRoaXMgZ3lwIGZpbGUuCiAjCiAjIElucHV0IHZhcmlhYmxlczoKLSMgICBiaW5kaW5nc19vdXRwdXRfZGlyOiBUaGUgYmFzZSBwYXRoIGludG8gd2hpY2ggYWxsIGdlbmVyYXRlZCBmaWxlcyB3aWxsCi0jICAgICAgIGJlIGNyZWF0ZWQuCiAjICAgc291cmNlX2lkbF9maWxlczogQWxsIElETCBmaWxlcyBmb3Igd2hpY2ggYSBiaW5kaW5ncyB3cmFwcGVyIHNob3VsZCBiZQogIyAgICAgICBjcmVhdGVkLgorIyAgIGRpY3Rpb25hcnlfaWRsX2ZpbGVzOiBBbGwgSURMIGZpbGVzIGZvciBJREwgZGljdGlvbmFyaWVzLgogIyAgIGRlcGVuZGVuY3lfaWRsX2ZpbGVzOiBJREwgZmlsZXMgdGhhdCBhcmUgZGVwZW5kZW5jaWVzIG9mIG90aGVyIElETHMsIGJ1dCBubwogIyAgICAgICBiaW5kaW5ncyB3cmFwcGVyIHdpbGwgYmUgY3JlYXRlZC4gRm9yIGV4YW1wbGUsIHBhcnRpYWwgaW50ZXJmYWNlcyBhbmQKICMgICAgICAgdGhlIHJpZ2h0LWhhbmQtc2lkZSBvZiBpbXBsZW1lbnRzIHN0YXRlbWVudHMuCkBAIC0zMSw4ICszMCwxMSBAQAogIyBzZWN0aW9uIGJlbG93LgogIwogIyBPdXRwdXQ6Ci0jICAgYmluZGluZ3M6IEEgZ3lwIHRhcmdldCB0aGF0IHdpbGwgYnVpbGQgYSBzdGF0aWMgbGlicmFyeSBjb250YWluaW5nIGFsbCB0aGUKLSMgICAgICAgZ2VuZXJhdGVkIGJpbmRpbmdzLgorIyAgIGdlbmVyYXRlZF9iaW5kaW5nczogQSBneXAgdGFyZ2V0IHRoYXQgd2lsbCBnZW5lcmF0ZSBhbGwgYmluZGluZ3Mgc291cmNlCisjICAgICAgIGZpbGVzLiBBdCBtb3N0IG9uZSB0YXJnZXQgY2FuIGRlY2xhcmUgZ2VuZXJhdGVkX2JpbmRpbmdzIGFzIGEKKyMgICAgICAgZGVwZW5kZW5jeS4gVGhlIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gZ2VuZXJhdGVkX2JpbmRpbmdzIHdpbGwgY29tcGlsZQorIyAgICAgICB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMsIHNpbmNlIGdlbmVyYXRlZF9iaW5kaW5ncyB3aWxsIGV4cG9ydCB0aGUgcmVxdWlyZWQKKyMgICAgICAgZ3lwIHZhcmlhYmxlcyB0byBpdHMgZGVwZW5kZW50LgogIwogIyBCYXNpYyBmbG93IG9mIGRhdGE6CiAjICAgW0FsbCBTdGF0aWMgZmlsZXNdIC0+IEdsb2JhbE9iamVjdHNQaWNrbGUKQEAgLTcyLDYgKzc0LDcgQEAKIAogICAgICMgVGVtcGxhdGVzIHRoYXQgYXJlIHNoYXJlZCBieSB0aGUgY29kZSBnZW5lcmF0aW9uIGZvciBtdWx0aXBsZSBlbmdpbmVzLgogICAgICdzaGFyZWRfdGVtcGxhdGVfZmlsZXMnOiBbCisgICAgICAndGVtcGxhdGVzL2RpY3Rpb25hcnkuaC50ZW1wbGF0ZScsCiAgICAgICAndGVtcGxhdGVzL2ludGVyZmFjZS1iYXNlLmNjLnRlbXBsYXRlJywKICAgICAgICd0ZW1wbGF0ZXMvaW50ZXJmYWNlLWJhc2UuaC50ZW1wbGF0ZScsCiAgICAgICAndGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS1iYXNlLmNjLnRlbXBsYXRlJywKQEAgLTg1LDYgKzg4LDEyIEBACiAgICAgIyBkaXJlY3Rvcnkgb2YgZWFjaCBJREwuCiAgICAgJ3NvdXJjZV9pZGxfZmlsZXMnOiBbXSwKIAorICAgICMgQSBjbGFzcyBkZWZpbml0aW9uIHRoYXQgbWF0Y2hlcyB0aGUgZGljdGlvbmFyeSBkZWZpbml0aW9uIGFuZCBpcworICAgICMgc3VpdGFibGUgdG8gYmUgaW5jbHVkZWQgYW5kIHVzZWQgaW4gQ29iYWx0IGNvZGUgd2lsbCBiZSBnZW5lcmF0ZWQsIGFzIHdlbGwKKyAgICAjIGFzIGEgY29udmVyc2lvbiBmdW5jdGlvbiBiZXR3ZWVuIGFuIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgYW5kIGEgSlMKKyAgICAjIG9iamVjdC4KKyAgICAnZGljdGlvbmFyeV9pZGxfZmlsZXMnOiBbXSwKKwogICAgICMgUGFydGlhbCBpbnRlcmZhY2VzIGFuZCB0aGUgcmlnaHQtc2lkZSBvZiAiaW1wbGVtZW50cyIKICAgICAjIENvZGUgd2lsbCBub3QgZ2V0IGdlbmVyYXRlZCBmb3IgdGhlc2UgaW50ZXJmYWNlczsgdGhleSBhcmUgdXNlZCB0byBhZGQKICAgICAjIGZ1bmN0aW9uYWxpdHkgdG8gb3RoZXIgaW50ZXJmYWNlcy4KQEAgLTE0Myw5ICsxNTIsNiBAQAogICAgICMgZG9lcyBub3QgaGF2ZSB0aGlzIHByb2JsZW0uCiAgICAgJ3dyaXRlX2ZpbGVfb25seV9pZl9jaGFuZ2VkJzogMSwKIAotICAgICMgR2VuZXJhdGVkIGNvZGUgd2lsbCBiZSBjcmVhdGVkIGhlcmUuCi0gICAgJ2JpbmRpbmdzX3NvdXJjZV9vdXRwdXRfZGlyJzogJzwoYmluZGluZ3Nfb3V0cHV0X2Rpcikvc291cmNlJywKLQogICAgICMgQ2FjaGVzIGFuZCBpbnRlcm1lZGlhdGUgc3RydWN0dXJlcy4KICAgICAnYmluZGluZ3Nfc2NyaXB0c19vdXRwdXRfZGlyJzogJzwoYmluZGluZ3Nfb3V0cHV0X2Rpcikvc2NyaXB0cycsCiAKQEAgLTE2NywyNCArMTczLDI3IEBACiAKICAgICAjIEFsbCBzb3VyY2UgZmlsZXMgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBmcm9tIHRoZSBzb3VyY2UgSURMIGZpbGVzLgogICAgICdnZW5lcmF0ZWRfc291cmNlcyc6Ci0gICAgICAgIFsnPCFAcHltb2RfZG9fbWFpbihwYXRoX2NvbnZlcnNpb24gLXMnCi0gICAgICAgICAnIC0tb3V0cHV0X2RpcmVjdG9yeSA8KGJpbmRpbmdzX3NvdXJjZV9vdXRwdXRfZGlyKScKLSAgICAgICAgICcgLS1vdXRwdXRfZXh0ZW5zaW9uIGNjIC0tb3V0cHV0X3ByZWZpeCA8KHByZWZpeCknCisgICAgICAgIFsnPCFAcHltb2RfZG9fbWFpbihjb2JhbHQuYnVpbGQucGF0aF9jb252ZXJzaW9uIC1zJworICAgICAgICAgJyAtLW91dHB1dF9kaXJlY3RvcnkgPChTSEFSRURfSU5URVJNRURJQVRFX0RJUiknCisgICAgICAgICAnIC0tb3V0cHV0X2V4dGVuc2lvbiBjYyAtLW91dHB1dF9wcmVmaXggPChwcmVmaXgpXycKKyAgICAgICAgICcgLS1iYXNlX2RpcmVjdG9yeSA8KERFUFRIKScKICAgICAgICAgICcgPEAoc291cmNlX2lkbF9maWxlcykpJ10sCiAKICAgICAjIEdlbmVyYXRlZCBJREwgZmlsZSB0aGF0IHdpbGwgZGVmaW5lIGFsbCB0aGUgY29uc3RydWN0b3JzIHRoYXQgc2hvdWxkIGJlCiAgICAgIyBvbiB0aGUgV2luZG93IG9iamVjdAogICAgICdnbG9iYWxfY29uc3RydWN0b3JzX2dlbmVyYXRlZF9pZGxfZmlsZSc6Ci0gICAgICAgICc8KGdlbmVyYXRlZF9pZGxzX291dHB1dF9kaXIpLzwod2luZG93X2NvbXBvbmVudCkvV2luZG93Q29uc3RydWN0b3JzLmlkbCcsCisgICAgICAgICc8KGdlbmVyYXRlZF9pZGxzX291dHB1dF9kaXIpLzwod2luZG93X2NvbXBvbmVudCkvd2luZG93X2NvbnN0cnVjdG9ycy5pZGwnLAogCiAgICAgIyBEdW1teSBoZWFkZXIgZmlsZSB3aGljaCBpcyBnZW5lcmF0ZWQgYmVjYXVzZSB0aGUgaWRsIGNvbXBpbGVyIGFzc3VtZXMKICAgICAjIHRoZXJlIGlzIGEgaGVhZGVyIGZvciBlYWNoIElETC4KICAgICAnZ2xvYmFsX2NvbnN0cnVjdG9yc19nZW5lcmF0ZWRfaGVhZGVyX2ZpbGUnOgotICAgICAgICAnPChnZW5lcmF0ZWRfaWRsc19vdXRwdXRfZGlyKS88KHdpbmRvd19jb21wb25lbnQpL1dpbmRvd0NvbnN0cnVjdG9ycy5oJywKKyAgICAgICAgJzwoZ2VuZXJhdGVkX2lkbHNfb3V0cHV0X2RpcikvPCh3aW5kb3dfY29tcG9uZW50KS93aW5kb3dfY29uc3RydWN0b3JzLmgnLAogICB9LAogCiAgICd0YXJnZXRzJzogWwogICAgIHsKKyAgICAgICMgQ3JlYXRlIGEgdGFyZ2V0IHRoYXQgZGVwZW5kcyBvbiB0aGlzIHRhcmdldCB0byBjb21waWxlIHRoZSBnZW5lcmF0ZWQKKyAgICAgICMgc291cmNlIGZpbGVzLiBUaGVyZSBzaG91bGQgYmUgb25seSBvbmUgc3VjaCB0YXJnZXQuCiAgICAgICAjIEJhc2VkIG9uIGJsaW5rL1NvdXJjZS9iaW5kaW5ncy9jb3JlL3Y4L2dlbmVyYXRlZC5neXA6YmluZGluZ3NfY29yZV92OF9nZW5lcmF0ZWRfaW5kaXZpZHVhbAogICAgICAgJ3RhcmdldF9uYW1lJzogJ2dlbmVyYXRlZF9iaW5kaW5ncycsCiAgICAgICAndHlwZSc6ICdub25lJywKQEAgLTE5NCw4ICsyMDMsMTMgQEAKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICdjYWNoZWRfamluamFfdGVtcGxhdGVzJywKICAgICAgICAgJ2NhY2hlZF9sZXhfeWFjY190YWJsZXMnLAorICAgICAgICAnZ2VuZXJhdGVkX2RpY3Rpb25hcmllcycsCiAgICAgICAgICdnbG9iYWxfY29uc3RydWN0b3JzX2lkbHMnLAogICAgICAgICAnaW50ZXJmYWNlc19pbmZvX292ZXJhbGwnLAorICAgICAgICAnPEAoYmluZGluZ3NfZGVwZW5kZW5jaWVzKScsCisgICAgICBdLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICc8QChiaW5kaW5nc19kZXBlbmRlbmNpZXMpJywKICAgICAgIF0sCiAgICAgICAnc291cmNlcyc6IFsKICAgICAgICAgJzxAKHNvdXJjZV9pZGxfZmlsZXMpJywKQEAgLTIzMiw4ICsyNDYsMTAgQEAKICAgICAgICAgICAnPChleHRlbmRlZF9hdHRyaWJ1dGVzX2ZpbGUpJywKICAgICAgICAgXSwKICAgICAgICAgJ291dHB1dHMnOiBbCi0gICAgICAgICAgJzwoYmluZGluZ3Nfc291cmNlX291dHB1dF9kaXIpLzwocHJlZml4KTwoUlVMRV9JTlBVVF9ST09UKS5jYycsCi0gICAgICAgICAgJzwoYmluZGluZ3Nfc291cmNlX291dHB1dF9kaXIpLzwocHJlZml4KTwoUlVMRV9JTlBVVF9ST09UKS5oJywKKyAgICAgICAgICAnPCFAcHltb2RfZG9fbWFpbihjb2JhbHQuYnVpbGQucGF0aF9jb252ZXJzaW9uIC1zIC1wIDwocHJlZml4KV8gJworICAgICAgICAgICAgICAnLWUgY2MgLWQgPChTSEFSRURfSU5URVJNRURJQVRFX0RJUikgLWIgPChERVBUSCkgPChSVUxFX0lOUFVUX0RJUk5BTUUpLzwoUlVMRV9JTlBVVF9ST09UKSknLAorICAgICAgICAgICc8IUBweW1vZF9kb19tYWluKGNvYmFsdC5idWlsZC5wYXRoX2NvbnZlcnNpb24gLXMgLXAgPChwcmVmaXgpXyAnCisgICAgICAgICAgICAgICctZSBoIC1kIDwoU0hBUkVEX0lOVEVSTUVESUFURV9ESVIpIC1iIDwoREVQVEgpIDwoUlVMRV9JTlBVVF9ESVJOQU1FKS88KFJVTEVfSU5QVVRfUk9PVCkpJwogICAgICAgICBdLAogICAgICAgICAnYWN0aW9uJzogWwogICAgICAgICAgICdweXRob24nLApAQCAtMjQxLDcgKzI1Nyw3IEBACiAgICAgICAgICAgJy0tY2FjaGUtZGlyJywKICAgICAgICAgICAnPChiaW5kaW5nc19zY3JpcHRzX291dHB1dF9kaXIpJywKICAgICAgICAgICAnLS1vdXRwdXQtZGlyJywKLSAgICAgICAgICAnPChiaW5kaW5nc19zb3VyY2Vfb3V0cHV0X2RpciknLAorICAgICAgICAgICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKScsCiAgICAgICAgICAgJy0taW50ZXJmYWNlcy1pbmZvJywKICAgICAgICAgICAnPChpbnRlcmZhY2VzX2luZm9fY29tYmluZWRfcGlja2xlKScsCiAgICAgICAgICAgJy0tZXh0ZW5kZWQtYXR0cmlidXRlcycsCkBAIC0yNTIsNiArMjY4LDk0IEBACiAgICAgICAgIF0sCiAgICAgICAgICdtZXNzYWdlJzogJ0dlbmVyYXRpbmcgYmluZGluZyBmcm9tIDwoUlVMRV9JTlBVVF9QQVRIKScsCiAgICAgICB9XSwKKyAgICAgICMgVGhlIHRhcmdldCB0aGF0IGRlcGVuZHMgb24gdGhpcyB3aWxsIGJ1aWxkIHRoZSBiaW5kaW5ncyBzb3VyY2UuCisgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2RlZmluZXMnOiBbICc8QChiaW5kaW5nc19kZWZpbmVzKScgXSwKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAnPEAoYmluZGluZ3NfaW5jbHVkZV9kaXJzKScsCisgICAgICAgICAgJzwoU0hBUkVEX0lOVEVSTUVESUFURV9ESVIpJywKKyAgICAgICAgXSwKKyAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgJzxAKGdlbmVyYXRlZF9zb3VyY2VzKScsCisgICAgICAgIF0sCisgICAgICAgICdkZWZpbmVzJzogWyAnPEAoYmluZGluZ3NfZGVmaW5lcyknXSwKKyAgICAgIH0KKyAgICB9LAorCisgICAgeworICAgICAgIyBCYXNlZCBvbiB0aGUgZ2VuZXJhdGVkX2JpbmRpbmdzIHRhcmdldCBhYm92ZS4gTWFpbiBkaWZmZXJlbmNlIGlzIHRoYXQKKyAgICAgICMgdGhpcyBwcm9kdWNlcyB0d28gLmggZmlsZXMsIGFuZCB0YWtlcyB0aGUgZGljdGlvbmFyeSBpZGwgZmlsZXMgYXMgaW5wdXQuCisgICAgICAndGFyZ2V0X25hbWUnOiAnZ2VuZXJhdGVkX2RpY3Rpb25hcmllcycsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICdoYXJkX2RlcGVuZGVuY3knOiAxLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJ2NhY2hlZF9qaW5qYV90ZW1wbGF0ZXMnLAorICAgICAgICAnY2FjaGVkX2xleF95YWNjX3RhYmxlcycsCisgICAgICAgICdnbG9iYWxfY29uc3RydWN0b3JzX2lkbHMnLAorICAgICAgICAnaW50ZXJmYWNlc19pbmZvX292ZXJhbGwnLAorICAgICAgXSwKKyAgICAgICdzb3VyY2VzJzogWworICAgICAgICAnPEAoZGljdGlvbmFyeV9pZGxfZmlsZXMpJywKKyAgICAgIF0sCisgICAgICAnYWxsX2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKKyAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKKyAgICAgICAgICAnPChTSEFSRURfSU5URVJNRURJQVRFX0RJUiknLAorICAgICAgICBdCisgICAgICB9LAorICAgICAgJ3J1bGVzJzogW3sKKyAgICAgICAgJ3J1bGVfbmFtZSc6ICdiaW5kaW5nJywKKyAgICAgICAgJ2V4dGVuc2lvbic6ICdpZGwnLAorICAgICAgICAnbXN2c19leHRlcm5hbF9ydWxlJzogMSwKKyAgICAgICAgJ2lucHV0cyc6IFsKKyAgICAgICAgICAjIFNjcmlwdCBzb3VyY2UgZmlsZXMsIGV0Yy4KKyAgICAgICAgICAnPEAoYmluZGluZ3NfZXh0cmFfaW5wdXRzKScsCisKKyAgICAgICAgICAjIFRoaXMgZmlsZSBpcyBnbG9iYWwsIHNvIGlmIGl0IGNoYW5nZXMgYWxsIGZpbGVzIGFyZSByZWJ1aWx0LgorICAgICAgICAgICMgSG93ZXZlciwgdGhpcyBmaWxlIHdpbGwgb25seSBjaGFuZ2Ugd2hlbiBkZXBlbmRlbmN5IHN0cnVjdHVyZQorICAgICAgICAgICMgY2hhbmdlcywgc28gc2hvdWxkbid0IGNoYW5nZSB0b28gbXVjaC4KKyAgICAgICAgICAjIFNlZSBibGluay9Tb3VyY2UvYmluZGluZ3MvY29yZS92OC9nZW5lcmF0ZWQuZ3lwIGZvciBtb3JlIGluZm8KKyAgICAgICAgICAnPChpbnRlcmZhY2VzX2luZm9fY29tYmluZWRfcGlja2xlKScsCisKKyAgICAgICAgICAjIFNpbWlsYXJseSwgYWxsIGZpbGVzIGFyZSByZWJ1aWx0IGlmIGEgcGFydGlhbCBpbnRlcmZhY2Ugb3IKKyAgICAgICAgICAjIHJpZ2h0IHNpZGUgb2YgJ2ltcGxlbWVudHMnIGNoYW5nZXMuCisgICAgICAgICAgIyBTZWUgYmxpbmsvU291cmNlL2JpbmRpbmdzL2NvcmUvdjgvZ2VuZXJhdGVkLmd5cCBmb3IgbW9yZSBpbmZvCisgICAgICAgICAgJzxAKGRlcGVuZGVuY3lfaWRsX2ZpbGVzKScsCisKKyAgICAgICAgICAjIEFsc28gYWRkIGFzIGEgZGVwZW5kZW5jeSB0aGUgc2V0IG9mIHVuc3VwcG9ydGVkIElETCBmaWxlcy4KKyAgICAgICAgICAnPEAodW5zdXBwb3J0ZWRfaW50ZXJmYWNlX2lkbF9maWxlcyknLAorCisgICAgICAgICAgIyBUaGUgZ2VuZXJhdGVkIGNvbnN0cnVjdG9ycyBJREwgaXMgYWxzbyBhIHBhcnRpYWwgaW50ZXJmYWNlLCBhbmQKKyAgICAgICAgICAjIHdlIG5lZWQgdG8gcmVidWlsZCBpZiBpdCBpcyBtb2RpZmllZC4KKyAgICAgICAgICAnPChnbG9iYWxfY29uc3RydWN0b3JzX2dlbmVyYXRlZF9pZGxfZmlsZSknLAorCisgICAgICAgICAgIyBUaGUgd2hpdGVsaXN0IG9mIHdoYXQgZXh0ZW5kZWQgYXR0cmlidXRlcyB3ZSBzdXBwb3J0LiBJZiBhbiBhdHRyaWJ1dGUKKyAgICAgICAgICAjIG5vdCBpbiB0aGlzIGxpc3QgaXMgZW5jb3VudGVyZWQsIGl0IHdpbGwgY2F1c2UgYW4gZXJyb3IgaW4gdGhlCisgICAgICAgICAgIyBwaXBlbGluZS4KKyAgICAgICAgICAnPChleHRlbmRlZF9hdHRyaWJ1dGVzX2ZpbGUpJywKKyAgICAgICAgXSwKKyAgICAgICAgJ291dHB1dHMnOiBbCisgICAgICAgICAgJzwhQHB5bW9kX2RvX21haW4oY29iYWx0LmJ1aWxkLnBhdGhfY29udmVyc2lvbiAtcyAnCisgICAgICAgICAgICAgICctZSBoIC1kIDwoU0hBUkVEX0lOVEVSTUVESUFURV9ESVIpIC1iIDwoREVQVEgpIDwoUlVMRV9JTlBVVF9ESVJOQU1FKS88KFJVTEVfSU5QVVRfUk9PVCkpJywKKyAgICAgICAgICAnPCFAcHltb2RfZG9fbWFpbihjb2JhbHQuYnVpbGQucGF0aF9jb252ZXJzaW9uIC1zIC1wIDwocHJlZml4KV8gJworICAgICAgICAgICAgICAnLWUgaCAtZCA8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKSAtYiA8KERFUFRIKSA8KFJVTEVfSU5QVVRfRElSTkFNRSkvPChSVUxFX0lOUFVUX1JPT1QpKScKKyAgICAgICAgXSwKKyAgICAgICAgJ2FjdGlvbic6IFsKKyAgICAgICAgICAncHl0aG9uJywKKyAgICAgICAgICAnPChpZGxfY29tcGlsZXJfc2NyaXB0KScsCisgICAgICAgICAgJy0tY2FjaGUtZGlyJywKKyAgICAgICAgICAnPChiaW5kaW5nc19zY3JpcHRzX291dHB1dF9kaXIpJywKKyAgICAgICAgICAnLS1vdXRwdXQtZGlyJywKKyAgICAgICAgICAnPChTSEFSRURfSU5URVJNRURJQVRFX0RJUiknLAorICAgICAgICAgICctLWludGVyZmFjZXMtaW5mbycsCisgICAgICAgICAgJzwoaW50ZXJmYWNlc19pbmZvX2NvbWJpbmVkX3BpY2tsZSknLAorICAgICAgICAgICctLWV4dGVuZGVkLWF0dHJpYnV0ZXMnLAorICAgICAgICAgICc8KGV4dGVuZGVkX2F0dHJpYnV0ZXNfZmlsZSknLAorICAgICAgICAgICctLXdyaXRlLWZpbGUtb25seS1pZi1jaGFuZ2VkJywKKyAgICAgICAgICAnPCh3cml0ZV9maWxlX29ubHlfaWZfY2hhbmdlZCknLAorICAgICAgICAgICc8KFJVTEVfSU5QVVRfUEFUSCknLAorICAgICAgICBdLAorICAgICAgICAnbWVzc2FnZSc6ICdHZW5lcmF0aW5nIGRpY3Rpb25hcnkgZnJvbSA8KFJVTEVfSU5QVVRfUEFUSCknLAorICAgICAgfV0sCiAgICAgfSwKIAogICAgIHsKQEAgLTI1OSw3ICszNjMsNyBAQAogICAgICAgJ3RhcmdldF9uYW1lJzogJ2dsb2JhbF9vYmplY3RzJywKICAgICAgICd2YXJpYWJsZXMnOiB7CiAgICAgICAgICdpZGxfZmlsZXMnOiBbCi0gICAgICAgICAgJzxAKHNvdXJjZV9pZGxfZmlsZXMpJywKKyAgICAgICAgICAnPEAoc291cmNlX2lkbF9maWxlcyknLCAnPEAoZGljdGlvbmFyeV9pZGxfZmlsZXMpJwogICAgICAgICBdLAogICAgICAgICAnb3V0cHV0X2ZpbGUnOiAnPChiaW5kaW5nc19zY3JpcHRzX291dHB1dF9kaXIpL0dsb2JhbE9iamVjdHMucGlja2xlJywKICAgICAgIH0sCkBAIC0zMDAsNyArNDA0LDcgQEAKICAgICAgIF0sCiAgICAgICAndmFyaWFibGVzJzogewogICAgICAgICAnc3RhdGljX2lkbF9maWxlcyc6IFsKLSAgICAgICAgICAnPEAoc291cmNlX2lkbF9maWxlcyknLAorICAgICAgICAgICc8QChzb3VyY2VfaWRsX2ZpbGVzKScsICc8QChkaWN0aW9uYXJ5X2lkbF9maWxlcyknLAogICAgICAgICAgICc8QChkZXBlbmRlbmN5X2lkbF9maWxlcyknLAogICAgICAgICAgICc8QCh1bnN1cHBvcnRlZF9pbnRlcmZhY2VfaWRsX2ZpbGVzKSddLAogICAgICAgICAnZ2VuZXJhdGVkX2lkbF9maWxlcyc6IFsnPChnbG9iYWxfY29uc3RydWN0b3JzX2dlbmVyYXRlZF9pZGxfZmlsZSknXSwKQEAgLTM3MywyMCArNDc3LDUgQEAKICAgICAgICAgJ21lc3NhZ2UnOiAnQ2FjaGluZyBieXRlY29kZSBvZiBKaW5qYSB0ZW1wbGF0ZXMnLAogICAgICAgfV0sCiAgICAgfSwKLSAgICB7Ci0gICAgICAndGFyZ2V0X25hbWUnOiAnYmluZGluZ3MnLAotICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgJ2RlZmluZXMnOiBbICc8QChiaW5kaW5nc19kZWZpbmVzKScgXSwKLSAgICAgICdpbmNsdWRlX2RpcnMnOiBbICc8QChiaW5kaW5nc19pbmNsdWRlX2RpcnMpJyBdLAotICAgICAgJ3NvdXJjZXMnOiBbCi0gICAgICAgICc8QChnZW5lcmF0ZWRfc291cmNlcyknLAotICAgICAgXSwKLSAgICAgICdkZWZpbmVzJzogWyAnPEAoYmluZGluZ3NfZGVmaW5lcyknXSwKLSAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICMgZ2VuZXJhdGVkX2JpbmRpbmdzIHRhcmdldCBpcyBkZWZpbmVkIGluIGJpbmRpbmdzX2dlbi5neXBpCi0gICAgICAgICdnZW5lcmF0ZWRfYmluZGluZ3MnLAotICAgICAgICAnPEAoYmluZGluZ3NfZGVwZW5kZW5jaWVzKScKLSAgICAgIF0sCi0gICAgfSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvYm9vdHN0cmFwX3BhdGgucHkgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2Jvb3RzdHJhcF9wYXRoLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjljOGRlY2YKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2Jvb3RzdHJhcF9wYXRoLnB5CkBAIC0wLDAgKzEsMzcgQEAKKyMKKyMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyMKKyIiIlV0aWxpdHkgdG8gcHJlcGVuZCB0aGUgdG9wLWxldmVsIHNvdXJjZSBkaXJlY3RvcnkgdG8gc3lzLnBhdGguCisKK1NpbmNlIHRoaXMgbWF5IGJlIHVzZWQgb3V0c2lkZSBvZiBnY2xpZW50IG9yIGdpdCBlbnZpcm9ubWVudCAoc3VjaCBhcyBwYXJ0IG9mIGEKK3RhcmJhbGwpLCB0aGUgcGF0aCB0byB0aGUgcm9vdCBtdXN0IGJlIGhhcmRjb2RlZC4KKyIiIgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworCitkZWYgX0dldFNyY1Jvb3QoKToKKyAgIiIiRmluZHMgdGhlIGZpcnN0IGRpcmVjdG9yeSBuYW1lZCAnc3JjJyB0aGF0IHRoaXMgbW9kdWxlIGlzIGluLiIiIgorICBjdXJyZW50X3BhdGggPSBvcy5wYXRoLm5vcm1wYXRoKF9fZmlsZV9fKQorICB3aGlsZSBvcy5wYXRoLmJhc2VuYW1lKGN1cnJlbnRfcGF0aCkgIT0gJ3NyYyc6CisgICAgbmV4dF9wYXRoID0gb3MucGF0aC5kaXJuYW1lKGN1cnJlbnRfcGF0aCkKKyAgICBpZiBuZXh0X3BhdGggPT0gY3VycmVudF9wYXRoOgorICAgICAgcmFpc2UgUnVudGltZUVycm9yKCdDb3VsZCBub3QgZmluZCBzcmMgZGlyZWN0b3J5LicpCisgICAgY3VycmVudF9wYXRoID0gbmV4dF9wYXRoCisgIHJldHVybiBvcy5wYXRoLmFic3BhdGgoY3VycmVudF9wYXRoKQorCisKK3N5cy5wYXRoLmluc2VydCgwLCBfR2V0U3JjUm9vdCgpKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weQppbmRleCAyYWE2OTRhLi5kYzQzYmYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weQpAQCAtMjIsMTkgKzIyLDI1IEBACiBpbXBvcnQgb3MKIGltcG9ydCBzeXMKIAoraW1wb3J0IGJvb3RzdHJhcF9wYXRoICAjIHB5bGludDogZGlzYWJsZT1nLWJhZC1pbXBvcnQtb3JkZXIsdW51c2VkLWltcG9ydAorCiAjIEFkZCBibGluaydzIGJpbmRpbmcgc2NyaXB0cyB0byB0aGUgcGF0aCwgc28gd2UgY2FuIGltcG9ydAogbW9kdWxlX3BhdGgsIG1vZHVsZV9maWxlbmFtZSA9IG9zLnBhdGguc3BsaXQob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpCi1ibGlua19zY3JpcHRfZGlyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oCi0gICAgbW9kdWxlX3BhdGgsIG9zLnBhcmRpciwgb3MucGFyZGlyLCAndGhpcmRfcGFydHknLCAnYmxpbmsnLCAnU291cmNlJykpCitibGlua19zY3JpcHRfZGlyID0gb3MucGF0aC5ub3JtcGF0aCgKKyAgICBvcy5wYXRoLmpvaW4obW9kdWxlX3BhdGgsIG9zLnBhcmRpciwgb3MucGFyZGlyLCAndGhpcmRfcGFydHknLCAnYmxpbmsnLAorICAgICAgICAgICAgICAgICAnU291cmNlJykpCiBzeXMucGF0aC5hcHBlbmQoYmxpbmtfc2NyaXB0X2RpcikKIAogZnJvbSBiaW5kaW5ncy5zY3JpcHRzLmNvZGVfZ2VuZXJhdG9yX3Y4IGltcG9ydCBDb2RlR2VuZXJhdG9yQmFzZSAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAorCisjIHRoZSBjb2RlX2dlbmVyYXRvcl92OCBtb2R1bGUgaW1wb3J0IGluIHRoZSBsaW5lIGFib3ZlIHVwZGF0ZXMgc3lzLnBhdGgsIHNvCisjIHRoYXQgd2UgY2FuIGltcG9ydCB0aGUgamluamEyIGluIHRoaXJkX3BhcnR5LgoraW1wb3J0IGppbmphMiAgIyBweWxpbnQ6IGRpc2FibGU9Zy1iYWQtaW1wb3J0LW9yZGVyCisKIGZyb20gYmluZGluZ3Muc2NyaXB0cy5pZGxfdHlwZXMgaW1wb3J0IElkbFR5cGUKLWZyb20gYmluZGluZ3Muc2NyaXB0cy5pZGxfdHlwZXMgaW1wb3J0IGluaGVyaXRzX2ludGVyZmFjZQotaW1wb3J0IGNvbnRleHRzCi1pbXBvcnQgamluamEyCi1mcm9tIG5hbWVfY29udmVyc2lvbiBpbXBvcnQgY29udmVydF90b19jb2JhbHRfbmFtZQotZnJvbSBuYW1lX2NvbnZlcnNpb24gaW1wb3J0IGdldF9pbnRlcmZhY2VfbmFtZQorZnJvbSBjb2JhbHQuYmluZGluZ3MgaW1wb3J0IGNvbnRleHRzCitmcm9tIGNvYmFsdC5iaW5kaW5ncyBpbXBvcnQgcGF0aF9nZW5lcmF0b3IKK2Zyb20gY29iYWx0LmJpbmRpbmdzLm5hbWVfY29udmVyc2lvbiBpbXBvcnQgZ2V0X2ludGVyZmFjZV9uYW1lCiAKIG1vZHVsZV9wYXRoLCBtb2R1bGVfZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQogCkBAIC00OCw2ICs1NCw5IEBACiAgICIiIkluaXRpYWxpemUgdGhlIEppbmphMiBlbnZpcm9ubWVudC4iIiIKICAgYXNzZXJ0IG9zLnBhdGguaXNhYnModGVtcGxhdGVzX2RpcikKICAgYXNzZXJ0IG9zLnBhdGguaXNhYnMoU0hBUkVEX1RFTVBMQVRFU19ESVIpCisgICMgRW5zdXJlIHRoYXQgd2UgYXJlIHVzaW5nIHRoZSB2ZXJzaW9uIG9mIGppbmphIHRoYXQncyBjaGVja2VkIGluIHRvCisgICMgdGhpcmRfcGFydHkuCisgIGFzc2VydCBqaW5qYTIuX192ZXJzaW9uX18gPT0gJzIuNy4xJwogICBqaW5qYV9lbnYgPSBqaW5qYTIuRW52aXJvbm1lbnQoCiAgICAgICBsb2FkZXI9amluamEyLkZpbGVTeXN0ZW1Mb2FkZXIoW3RlbXBsYXRlc19kaXIsIFNIQVJFRF9URU1QTEFURVNfRElSXSksCiAgICAgICBleHRlbnNpb25zPVsnamluamEyLmV4dC5kbyddLCAgIyBkbyBzdGF0ZW1lbnQKQEAgLTY3LDMzICs3Niw2IEBACiAgICAgcmV0dXJuIHBhdGgKIAogCi1kZWYgZ2V0X2ltcGxlbWVudGF0aW9uX2hlYWRlcl9wYXRoKGludGVyZmFjZV9pbmZvKToKLSAgIiIiR2V0IHRoZSBwYXRoIHRvIHRoZSBpbXBsZW1lbnRhdGlvbiBoZWFkZXIgZmlsZS4KLQotICBUaGUgaW50ZXJmYWNlIGZpbGUgbXVzdCBiZSB1bmRlciBjb2JhbHQvLi4uCi0KLSAgQXJnczoKLSAgICBpbnRlcmZhY2VfaW5mbzogKGRpY3QpIENvbnRhaW5zIHRoZSBpbmZvcm1hdGlvbiBhYm91dCBhbiBpbnRlcmZhY2UKLSAgICAgIGRlZmluZWQgaW4gYW4gSURMLCBhcyBnZW5lcmF0ZWQgYnkgYmxpbmsncwotICAgICAgY29tcHV0ZV9pbnRlcmZhY2VzX2luZm9faW5kaXZpZHVhbC5weSBzY3JpcHQKLSAgUmV0dXJuczoKLSAgICAoc3RyKSBUaGUgcGF0aCB0byB0aGUgY29ycmVzcG9uZGluZyBpbXBsZW1lbnRhdGlvbiBoZWFkZXIgZmlsZSwgc3RhcnRpbmcKLSAgICAgIHdpdGggdGhlICdjb2JhbHQnIGRpcmVjdG9yeS4KLSAgIiIiCi0gIGltcGxlbWVudGF0aW9uX2hlYWRlcl9hYnNkaXIsIGZpbGVuYW1lID0gb3MucGF0aC5zcGxpdChpbnRlcmZhY2VfaW5mb1sKLSAgICAgICdmdWxsX3BhdGgnXSkKLQotICBpbXBsZW1lbnRhdGlvbl9oZWFkZXJfcmVsZGlyID0gb3MucGF0aC5yZWxwYXRoKGltcGxlbWVudGF0aW9uX2hlYWRlcl9hYnNkaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29iYWx0X2RpcikKLSAgYXNzZXJ0IG5vdCBvcy5wYXRoLmlzYWJzKGltcGxlbWVudGF0aW9uX2hlYWRlcl9yZWxkaXIpCi0gIGFzc2VydCBvcy5wYXJkaXIgbm90IGluIGltcGxlbWVudGF0aW9uX2hlYWRlcl9yZWxkaXIuc3BsaXQob3Muc2VwKQotCi0gIHJvb3QsIF8gPSBvcy5wYXRoLnNwbGl0ZXh0KGZpbGVuYW1lKQotICBoZWFkZXJfZmlsZW5hbWUgPSBjb252ZXJ0X3RvX2NvYmFsdF9uYW1lKHJvb3QpICsgJy5oJwotICByZXR1cm4gbm9ybWFsaXplX3NsYXNoZXMob3MucGF0aC5qb2luKCdjb2JhbHQnLCBpbXBsZW1lbnRhdGlvbl9oZWFkZXJfcmVsZGlyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlYWRlcl9maWxlbmFtZSkpCi0KLQogZGVmIGlzX2dsb2JhbF9pbnRlcmZhY2UoaW50ZXJmYWNlKToKICAgcmV0dXJuICgoJ1ByaW1hcnlHbG9iYWwnIGluIGludGVyZmFjZS5leHRlbmRlZF9hdHRyaWJ1dGVzKSBvcgogICAgICAgICAgICgnR2xvYmFsJyBpbiBpbnRlcmZhY2UuZXh0ZW5kZWRfYXR0cmlidXRlcykpCkBAIC0xMDIsMTEgKzg0LDExIEBACiBkZWYgZ2V0X2luZGV4ZWRfc3BlY2lhbF9vcGVyYXRpb24oaW50ZXJmYWNlLCBzcGVjaWFsKToKICAgc3BlY2lhbF9vcGVyYXRpb25zID0gbGlzdCgKICAgICAgIG9wZXJhdGlvbiBmb3Igb3BlcmF0aW9uIGluIGludGVyZmFjZS5vcGVyYXRpb25zCi0gICAgICBpZiAoc3BlY2lhbCBpbiBvcGVyYXRpb24uc3BlY2lhbHMgYW5kIG9wZXJhdGlvbi5hcmd1bWVudHMgYW5kIHN0cigKLSAgICAgICAgICBvcGVyYXRpb24uYXJndW1lbnRzWzBdLmlkbF90eXBlKSA9PSAndW5zaWduZWQgbG9uZycpKQorICAgICAgaWYgKHNwZWNpYWwgaW4gb3BlcmF0aW9uLnNwZWNpYWxzIGFuZCBvcGVyYXRpb24uYXJndW1lbnRzIGFuZAorICAgICAgICAgIHN0cihvcGVyYXRpb24uYXJndW1lbnRzWzBdLmlkbF90eXBlKSA9PSAndW5zaWduZWQgbG9uZycpKQogICBhc3NlcnQgbGVuKHNwZWNpYWxfb3BlcmF0aW9ucykgPD0gMSwgKAotICAgICAgJ011bHRpcGxlIGluZGV4ZWQgJXNzIGRlZmluZWQgb24gaW50ZXJmYWNlOiAlcycgJQotICAgICAgKHNwZWNpYWwsIGludGVyZmFjZS5uYW1lKSkKKyAgICAgICdNdWx0aXBsZSBpbmRleGVkICVzcyBkZWZpbmVkIG9uIGludGVyZmFjZTogJXMnICUgKHNwZWNpYWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2UubmFtZSkpCiAgIHJldHVybiBzcGVjaWFsX29wZXJhdGlvbnNbMF0gaWYgbGVuKHNwZWNpYWxfb3BlcmF0aW9ucykgZWxzZSBOb25lCiAKIApAQCAtMTMxLDggKzExMyw4IEBACiBkZWYgZ2V0X25hbWVkX3NwZWNpYWxfb3BlcmF0aW9uKGludGVyZmFjZSwgc3BlY2lhbCk6CiAgIHNwZWNpYWxfb3BlcmF0aW9ucyA9IGxpc3QoCiAgICAgICBvcGVyYXRpb24gZm9yIG9wZXJhdGlvbiBpbiBpbnRlcmZhY2Uub3BlcmF0aW9ucwotICAgICAgaWYgKHNwZWNpYWwgaW4gb3BlcmF0aW9uLnNwZWNpYWxzIGFuZCBvcGVyYXRpb24uYXJndW1lbnRzIGFuZCBzdHIoCi0gICAgICAgICAgb3BlcmF0aW9uLmFyZ3VtZW50c1swXS5pZGxfdHlwZSkgPT0gJ0RPTVN0cmluZycpKQorICAgICAgaWYgKHNwZWNpYWwgaW4gb3BlcmF0aW9uLnNwZWNpYWxzIGFuZCBvcGVyYXRpb24uYXJndW1lbnRzIGFuZAorICAgICAgICAgIHN0cihvcGVyYXRpb24uYXJndW1lbnRzWzBdLmlkbF90eXBlKSA9PSAnRE9NU3RyaW5nJykpCiAgIGFzc2VydCBsZW4oc3BlY2lhbF9vcGVyYXRpb25zKSA8PSAxLCAoCiAgICAgICAnTXVsdGlwbGUgbmFtZWQgJXNzIGRlZmluZWQgb24gaW50ZXJmYWNlOiAlcycgJSAoc3BlY2lhbCwgaW50ZXJmYWNlLm5hbWUpKQogICByZXR1cm4gc3BlY2lhbF9vcGVyYXRpb25zWzBdIGlmIGxlbihzcGVjaWFsX29wZXJhdGlvbnMpIGVsc2UgTm9uZQpAQCAtMTYxLDYgKzE0Myw4IEBACiAgICAgaWYgaWRsX3R5cGU6CiAgICAgICBpZiBpZGxfdHlwZS5pc19pbnRlcmZhY2VfdHlwZToKICAgICAgICAgeWllbGQgZ2V0X2ludGVyZmFjZV9uYW1lKGlkbF90eXBlKQorICAgICAgaWYgaWRsX3R5cGUuaXNfZGljdGlvbmFyeToKKyAgICAgICAgeWllbGQgaWRsX3R5cGUubmFtZQogICAgICAgZWxpZiBpZGxfdHlwZS5pc191bmlvbl90eXBlOgogICAgICAgICBmb3IgaW50ZXJmYWNlX25hbWUgaW4gZ2V0X2ludGVyZmFjZV90eXBlX25hbWVzX2Zyb21faWRsX3R5cGVzKAogICAgICAgICAgICAgaWRsX3R5cGUubWVtYmVyX3R5cGVzKToKQEAgLTIwOCw2ICsxOTIsOCBAQAogICAgICMgY2FjaGUgd2FzIHByZXBvcHVsYXRlZC4KICAgICBzZWxmLmppbmphX2VudiA9IGluaXRpYWxpemVfamluamFfZW52KGNhY2hlX2RpciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9zLnBhdGguYWJzcGF0aCh0ZW1wbGF0ZXNfZGlyKSkKKyAgICBzZWxmLnBhdGhfYnVpbGRlciA9IHBhdGhfZ2VuZXJhdG9yLlBhdGhCdWlsZGVyKAorICAgICAgICBzZWxmLmdlbmVyYXRlZF9maWxlX3ByZWZpeCwgaW50ZXJmYWNlc19pbmZvLCBjb2JhbHRfZGlyLCBvdXRwdXRfZGlyKQogCiAgIEBhYmMuYWJzdHJhY3Rwcm9wZXJ0eQogICBkZWYgZ2VuZXJhdGVkX2ZpbGVfcHJlZml4KHNlbGYpOgpAQCAtMjE5LDUwICsyMDUsMTEgQEAKICAgICAiIiJBbiBpbnN0YW5jZSB0aGF0IGltcGxlbWVudHMgdGhlIEV4cHJlc3Npb25HZW5lcmF0b3IgY2xhc3MuIiIiCiAgICAgcGFzcwogCi0gIGRlZiB3cmFwcGVyX2NsYXNzX2Zyb21faW50ZXJmYWNlX25hbWUoc2VsZiwgaW50ZXJmYWNlX25hbWUpOgotICAgIHJldHVybiBzZWxmLmdlbmVyYXRlZF9maWxlX3ByZWZpeCArIGludGVyZmFjZV9uYW1lCi0KLSAgZGVmIHdyYXBwZXJfaGVhZGVyX2Zyb21faW50ZXJmYWNlX25hbWUoc2VsZiwgaW50ZXJmYWNlX25hbWUpOgotICAgIGF0dHJpYnV0ZV93cmFwcGVyX2NsYXNzID0gc2VsZi53cmFwcGVyX2NsYXNzX2Zyb21faW50ZXJmYWNlX25hbWUoCi0gICAgICAgIGludGVyZmFjZV9uYW1lKQotICAgIHJldHVybiBub3JtYWxpemVfc2xhc2hlcyhhdHRyaWJ1dGVfd3JhcHBlcl9jbGFzcyArICcuaCcpCi0KLSAgZGVmIG91dHB1dF9wYXRocyhzZWxmLCBjbGFzc19uYW1lKToKLSAgICAiIiJDb25zdHJ1Y3QgdGhlIGZpbGVuYW1lcyBmb3IgYSBnZW5lcmF0ZWQgc291cmNlIGZpbGUuCi0KLSAgICBDb25zdHJ1Y3QgdGhlIGhlYWRlciBhbmQgY2Mgc291cmNlIGZpbGUgcGF0aHMgYmFzZWQgb24gdGhlCi0gICAgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzLgotCi0gICAgQXJnczoKLSAgICAgIGNsYXNzX25hbWU6IEEgc3RyaW5nIHRoYXQgaXMgdGhlIG5hbWUgb2YgdGhlIGludGVyZmFjZSBhcyBkZWZpbmVkCi0gICAgICAgIGluIHRoZSBJREwKLQotICAgIFJldHVybnM6Ci0gICAgICAoc3RyLCBzdHIpOiBBIHR1cGxlIG9mIHR3byBzdHJpbmdzIHJlcHJlc2VudGluZyB0aGUgZnVsbCBwYXRoIG9mCi0gICAgICAgIHRoZSAoLmgsIC5jcHApIGZpbGUgdGhhdCB3aWxsIGJlIGdlbmVyYXRlZCBmb3IgdGhpcyBpbnRlcmZhY2UKLSAgICAiIiIKLQotICAgIGhlYWRlcl9wYXRoID0gb3MucGF0aC5qb2luKHNlbGYub3V0cHV0X2RpciwgY2xhc3NfbmFtZSArICcuaCcpCi0gICAgY2NfcGF0aCA9IG9zLnBhdGguam9pbihzZWxmLm91dHB1dF9kaXIsIGNsYXNzX25hbWUgKyAnLmNjJykKLSAgICByZXR1cm4gaGVhZGVyX3BhdGgsIGNjX3BhdGgKLQotICBkZWYgcmVuZGVyX3RlbXBsYXRlKHNlbGYsIGhlYWRlcl90ZW1wbGF0ZV9maWxlbmFtZSwgY2NfdGVtcGxhdGVfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgdGVtcGxhdGVfY29udGV4dCk6Ci0gICAgaGVhZGVyX3RlbXBsYXRlID0gc2VsZi5qaW5qYV9lbnYuZ2V0X3RlbXBsYXRlKGhlYWRlcl90ZW1wbGF0ZV9maWxlbmFtZSkKLSAgICBjY190ZW1wbGF0ZSA9IHNlbGYuamluamFfZW52LmdldF90ZW1wbGF0ZShjY190ZW1wbGF0ZV9maWxlbmFtZSkKLSAgICAjIE1ha2Ugc3VyZSBleHRlbnNpb24gaXMgLnB5LCBub3QgLnB5YyBvciAucHlvLCBzbyBkb2Vzbid0IGRlcGVuZCBvbiBjYWNoaW5nCi0gICAgbW9kdWxlX3BhdGhfcHluYW1lID0gb3MucGF0aC5qb2luKAotICAgICAgICBtb2R1bGVfcGF0aCwgb3MucGF0aC5zcGxpdGV4dChtb2R1bGVfZmlsZW5hbWUpWzBdICsgJy5weScpCi0gICAgIyBFbnN1cmUgdGhhdCBwb3NpeCBmb3J3YXJkIHNsYXNoZXMgYXJlIHVzZWQKLSAgICB0ZW1wbGF0ZV9jb250ZXh0Wydjb2RlX2dlbmVyYXRvciddID0gbm9ybWFsaXplX3NsYXNoZXMob3MucGF0aC5yZWxwYXRoKAotICAgICAgICBtb2R1bGVfcGF0aF9weW5hbWUsIGNvYmFsdF9kaXIpKQotICAgIHRlbXBsYXRlX2NvbnRleHRbJ2hlYWRlcl90ZW1wbGF0ZV9wYXRoJ10gPSBub3JtYWxpemVfc2xhc2hlcygKLSAgICAgICAgb3MucGF0aC5yZWxwYXRoKGhlYWRlcl90ZW1wbGF0ZS5maWxlbmFtZSwgY29iYWx0X2RpcikpCi0gICAgdGVtcGxhdGVfY29udGV4dFsnY2NfdGVtcGxhdGVfcGF0aCddID0gbm9ybWFsaXplX3NsYXNoZXMob3MucGF0aC5yZWxwYXRoKAotICAgICAgICBjY190ZW1wbGF0ZS5maWxlbmFtZSwgY29iYWx0X2RpcikpCi0gICAgaGVhZGVyX3RleHQgPSBoZWFkZXJfdGVtcGxhdGUucmVuZGVyKHRlbXBsYXRlX2NvbnRleHQpCi0gICAgY2NfdGV4dCA9IGNjX3RlbXBsYXRlLnJlbmRlcih0ZW1wbGF0ZV9jb250ZXh0KQotICAgIHJldHVybiBoZWFkZXJfdGV4dCwgY2NfdGV4dAorICBkZWYgcmVuZGVyX3RlbXBsYXRlKHNlbGYsIHRlbXBsYXRlX2ZpbGVuYW1lLCB0ZW1wbGF0ZV9jb250ZXh0KToKKyAgICB0ZW1wbGF0ZSA9IHNlbGYuamluamFfZW52LmdldF90ZW1wbGF0ZSh0ZW1wbGF0ZV9maWxlbmFtZSkKKyAgICB0ZW1wbGF0ZV9jb250ZXh0LnVwZGF0ZShzZWxmLmNvbW1vbl9jb250ZXh0KHRlbXBsYXRlKSkKKyAgICByZW5kZXJlZF90ZXh0ID0gdGVtcGxhdGUucmVuZGVyKHRlbXBsYXRlX2NvbnRleHQpCisgICAgcmV0dXJuIHJlbmRlcmVkX3RleHQKIAogICBkZWYgZ2VuZXJhdGVfY29kZV9pbnRlcm5hbChzZWxmLCBkZWZpbml0aW9ucywgZGVmaW5pdGlvbl9uYW1lKToKICAgICBpZiBkZWZpbml0aW9uX25hbWUgaW4gZGVmaW5pdGlvbnMuaW50ZXJmYWNlczoKQEAgLTI4OCw4NyArMjM1LDE2MCBAQAogCiAgICAgdGVtcGxhdGVfY29udGV4dCA9IHNlbGYuYnVpbGRfaW50ZXJmYWNlX2NvbnRleHQoaW50ZXJmYWNlLCBpbnRlcmZhY2VfaW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZpbml0aW9ucykKLSAgICBoZWFkZXJfdGV4dCwgY2NfdGV4dCA9IHNlbGYucmVuZGVyX3RlbXBsYXRlKGhlYWRlcl90ZW1wbGF0ZV9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNwcF90ZW1wbGF0ZV9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQpCi0gICAgaGVhZGVyX3BhdGgsIGNjX3BhdGggPSBzZWxmLm91dHB1dF9wYXRocyh0ZW1wbGF0ZV9jb250ZXh0WydiaW5kaW5nX2NsYXNzJ10pCi0gICAgcmV0dXJuICgoaGVhZGVyX3BhdGgsIGhlYWRlcl90ZXh0KSwKLSAgICAgICAgICAgIChjY19wYXRoLCBjY190ZXh0KSwpCisgICAgaGVhZGVyX3RleHQgPSBzZWxmLnJlbmRlcl90ZW1wbGF0ZShoZWFkZXJfdGVtcGxhdGVfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0KQorICAgIGNjX3RleHQgPSBzZWxmLnJlbmRlcl90ZW1wbGF0ZShjcHBfdGVtcGxhdGVfZmlsZW5hbWUsIHRlbXBsYXRlX2NvbnRleHQpCisgICAgaGVhZGVyX3BhdGggPSBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0hlYWRlckZ1bGxQYXRoKGludGVyZmFjZV9uYW1lKQorICAgIGNjX3BhdGggPSBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0ltcGxlbWVudGF0aW9uUGF0aChpbnRlcmZhY2VfbmFtZSkKKyAgICByZXR1cm4gKChoZWFkZXJfcGF0aCwgaGVhZGVyX3RleHQpLCAoY2NfcGF0aCwgY2NfdGV4dCksKQogCiAgIGRlZiBnZW5lcmF0ZV9kaWN0aW9uYXJ5X2NvZGUoc2VsZiwgZGVmaW5pdGlvbnMsIGRpY3Rpb25hcnlfbmFtZSwgZGljdGlvbmFyeSk6Ci0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcignRGljdGlvbmFyaWVzIG5vdCBpbXBsZW1lbnRlZCcpCisgICAgaGVhZGVyX3RlbXBsYXRlX2ZpbGVuYW1lID0gJ2RpY3Rpb25hcnkuaC50ZW1wbGF0ZScKKyAgICBjb252ZXJzaW9uX3RlbXBsYXRlX2ZpbGVuYW1lID0gJ2RpY3Rpb25hcnktY29udmVyc2lvbi5oLnRlbXBsYXRlJworICAgIHRlbXBsYXRlX2NvbnRleHQgPSBzZWxmLmJ1aWxkX2RpY3Rpb25hcnlfY29udGV4dChkaWN0aW9uYXJ5LCBkZWZpbml0aW9ucykKIAotICBkZWYgZ2V0X2ludGVyZmFjZV9jb21wb25lbnRzKHNlbGYsIGlkbF90eXBlX25hbWUpOgotICAgICIiIkdldCB0aGUgaW50ZXJmYWNlJ3MgbmFtZXNwYWNlIGFzIGEgbGlzdCBvZiBuYW1lc3BhY2UgY29tcG9uZW50cy4iIiIKLSAgICBpZGxfZmlsZW5hbWUgPSBzZWxmLmludGVyZmFjZXNfaW5mb1tpZGxfdHlwZV9uYW1lXS5nZXQoJ2Z1bGxfcGF0aCcpCi0gICAgIyBHZXQgdGhlIElETCBmaWxlbmFtZSByZWxhdGl2ZSB0byB0aGUgY29iYWx0IGRpcmVjdG9yeSwgYW5kIHNwbGl0IHRoZQotICAgICMgZGlyZWN0b3J5IHRvIGdldCB0aGUgbGlzdCBvZiBuYW1lc3BhY2UgY29tcG9uZW50cy4KLSAgICBpZGxfZmlsZW5hbWUgPSBvcy5wYXRoLnJlbHBhdGgoaWRsX2ZpbGVuYW1lLCBjb2JhbHRfZGlyKQotICAgIGNvbXBvbmVudHMgPSBvcy5wYXRoLmRpcm5hbWUoaWRsX2ZpbGVuYW1lKS5zcGxpdChvcy5zZXApCi0gICAgcmV0dXJuIGNvbXBvbmVudHMKKyAgICBoZWFkZXJfdGV4dCA9IHNlbGYucmVuZGVyX3RlbXBsYXRlKGhlYWRlcl90ZW1wbGF0ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlbXBsYXRlX2NvbnRleHQpCisgICAgY29udmVyc2lvbl90ZXh0ID0gc2VsZi5yZW5kZXJfdGVtcGxhdGUoY29udmVyc2lvbl90ZW1wbGF0ZV9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZW1wbGF0ZV9jb250ZXh0KQogCi0gIGRlZiByZWZlcmVuY2VkX2ludGVyZmFjZV9jb250ZXh0cyhzZWxmLCBpbnRlcmZhY2VfbmFtZSk6Ci0gICAgIiIiWWllbGRzIGluZm9ybWF0aW9uIGZvciBpbmNsdWRpbmcgYW5kIGRlY2xhcmluZyB0aGlzIGludGVyZmFjZSdzIGNsYXNzZXMuCisgICAgaGVhZGVyX3BhdGggPSBzZWxmLnBhdGhfYnVpbGRlci5EaWN0aW9uYXJ5SGVhZGVyRnVsbFBhdGgoZGljdGlvbmFyeV9uYW1lKQorICAgIGNvbnZlcnNpb25faGVhZGVyX3BhdGggPSAoCisgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkRpY3Rpb25hcnlDb252ZXJzaW9uSGVhZGVyRnVsbFBhdGgoZGljdGlvbmFyeV9uYW1lKSkKKyAgICByZXR1cm4gKChoZWFkZXJfcGF0aCwgaGVhZGVyX3RleHQpLCAoY29udmVyc2lvbl9oZWFkZXJfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udmVyc2lvbl90ZXh0KSwpCisKKyAgZGVmIHJlZmVyZW5jZWRfY2xhc3NfY29udGV4dHMoc2VsZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX25hbWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBsZW1lbnRhdGlvbl9vbmx5PUZhbHNlKToKKyAgICAiIiJSZXR1cm5zIGEgbGlzdCBvZiBqaW5qYSBjb250ZXh0cyBkZXNjcmliaW5nIHJlZmVyZW5jZWQgQysrIGNsYXNzZXMuCiAKICAgICBBcmdzOgotICAgICAgaW50ZXJmYWNlX25hbWU6IFRoZSBuYW1lIG9mIHRoZSBpbnRlcmZhY2UuCi0gICAgWWllbGRzOgotICAgICAgZGljdCB3aXRoIHRoZSBmb2xsb3dpbmcga2V5czoKKyAgICAgIGludGVyZmFjZV9uYW1lczogQSBsaXN0IG9mIGludGVyZmFjZXMuCisgICAgICBpbXBsZW1lbnRhdGlvbl9vbmx5OiBPbmx5IGluY2x1ZGUgaW1wbGVtZXRhdGlvbiBoZWFkZXJzLgorICAgIFJldHVybnM6CisgICAgICBsaXN0KCkgb2YgamluamEgY29udGV4dHMgKHB5dGhvbiBkaWN0cykgd2l0aCBpbmZvcm1hdGlvbiBhYm91dCBDKysgY2xhc3NlcworICAgICAgcmVsYXRlZCB0byB0aGUgaW50ZXJmYWNlcyBpbiB8aW50ZXJmYWNlX25hbWVzfC4gZGljdCBoYXMgdGhlIGZvbGxvd2luZworICAgICAga2V5czoKICAgICAgICAgICBmdWxseV9xdWFsaWZpZWRfbmFtZTogRnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGNsYXNzLgogICAgICAgICAgIGluY2x1ZGU6IFBhdGggdG8gdGhlIGhlYWRlciB0aGF0IGRlZmluZXMgdGhlIGNsYXNzLgogICAgICAgICAgIGNvbmRpdGlvbmFsOiBTeW1ib2wgb24gd2hpY2ggdGhpcyBpbnRlcmZhY2UgaXMgY29uZGl0aW9uYWwgY29tcGlsZWQuCiAgICAgICAgICAgaXNfY2FsbGJhY2tfaW50ZXJmYWNlOiBUcnVlIGlmZiB0aGlzIGlzIGEgY2FsbGJhY2sgaW50ZXJmYWNlLgogICAgICIiIgorICAgIHJlZmVyZW5jZWRfY2xhc3NlcyA9IFtdCisgICAgIyBJdGVyYXRlIG92ZXIgaXQgYXMgYSBzZXQgdG8gdW5pcXVpZnkgdGhlIGxpc3QuCisgICAgZm9yIGludGVyZmFjZV9uYW1lIGluIHNldChpbnRlcmZhY2VfbmFtZXMpOgorICAgICAgaW50ZXJmYWNlX2luZm8gPSBzZWxmLmludGVyZmFjZXNfaW5mb1tpbnRlcmZhY2VfbmFtZV0KKyAgICAgIGlzX2RpY3Rpb25hcnkgPSBpbnRlcmZhY2VfaW5mb1snaXNfZGljdGlvbmFyeSddCisgICAgICBuYW1lc3BhY2UgPSAnOjonLmpvaW4oCisgICAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuTmFtZXNwYWNlQ29tcG9uZW50cyhpbnRlcmZhY2VfbmFtZSkpCisgICAgICBjb25kaXRpb25hbCA9IGludGVyZmFjZV9pbmZvWydjb25kaXRpb25hbCddCisgICAgICBpc19jYWxsYmFja19pbnRlcmZhY2UgPSBpbnRlcmZhY2VfbmFtZSBpbiBJZGxUeXBlLmNhbGxiYWNrX2ludGVyZmFjZXMKIAotICAgIGNvbmRpdGlvbmFsID0gc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdWydjb25kaXRpb25hbCddCi0gICAgbmFtZXNwYWNlID0gJzo6Jy5qb2luKHNlbGYuZ2V0X2ludGVyZmFjZV9jb21wb25lbnRzKGludGVyZmFjZV9uYW1lKSkKLSAgICBmdWxsX25hbWUgPSAnY29iYWx0Ojolczo6JXMnICUgKG5hbWVzcGFjZSwgaW50ZXJmYWNlX25hbWUpCisgICAgICAjIEluZm9ybWF0aW9uIGFib3V0IHRoZSBDb2JhbHQgaW1wbGVtZW50YXRpb24gY2xhc3MuCisgICAgICBpZiBpc19kaWN0aW9uYXJ5OgorICAgICAgICByZWZlcmVuY2VkX2NsYXNzZXMuYXBwZW5kKHsKKyAgICAgICAgICAgICdmdWxseV9xdWFsaWZpZWRfbmFtZSc6CisgICAgICAgICAgICAgICAgJyVzOjolcycgJSAobmFtZXNwYWNlLCBpbnRlcmZhY2VfbmFtZSksCisgICAgICAgICAgICAnaW5jbHVkZSc6CisgICAgICAgICAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuQmluZGluZ3NIZWFkZXJJbmNsdWRlUGF0aChpbnRlcmZhY2VfbmFtZSksCisgICAgICAgICAgICAnY29uZGl0aW9uYWwnOgorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsLAorICAgICAgICAgICAgJ2lzX2NhbGxiYWNrX2ludGVyZmFjZSc6CisgICAgICAgICAgICAgICAgaXNfY2FsbGJhY2tfaW50ZXJmYWNlLAorICAgICAgICB9KQorICAgICAgZWxzZToKKyAgICAgICAgcmVmZXJlbmNlZF9jbGFzc2VzLmFwcGVuZCh7CisgICAgICAgICAgICAnZnVsbHlfcXVhbGlmaWVkX25hbWUnOgorICAgICAgICAgICAgICAgICclczo6JXMnICUgKG5hbWVzcGFjZSwgaW50ZXJmYWNlX25hbWUpLAorICAgICAgICAgICAgJ2luY2x1ZGUnOgorICAgICAgICAgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkltcGxlbWVudGF0aW9uSGVhZGVyUGF0aChpbnRlcmZhY2VfbmFtZSksCisgICAgICAgICAgICAnY29uZGl0aW9uYWwnOgorICAgICAgICAgICAgICAgIGNvbmRpdGlvbmFsLAorICAgICAgICAgICAgJ2lzX2NhbGxiYWNrX2ludGVyZmFjZSc6CisgICAgICAgICAgICAgICAgaXNfY2FsbGJhY2tfaW50ZXJmYWNlLAorICAgICAgICB9KQorICAgICAgICBpZiBub3QgaW1wbGVtZW50YXRpb25fb25seToKKyAgICAgICAgICByZWZlcmVuY2VkX2NsYXNzZXMuYXBwZW5kKHsKKyAgICAgICAgICAgICAgJ2Z1bGx5X3F1YWxpZmllZF9uYW1lJzoKKyAgICAgICAgICAgICAgICAgICclczo6JXMnICUgKG5hbWVzcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkJpbmRpbmdzQ2xhc3MoaW50ZXJmYWNlX25hbWUpKSwKKyAgICAgICAgICAgICAgJ2luY2x1ZGUnOgorICAgICAgICAgICAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuQmluZGluZ3NIZWFkZXJJbmNsdWRlUGF0aChpbnRlcmZhY2VfbmFtZSksCisgICAgICAgICAgICAgICdjb25kaXRpb25hbCc6CisgICAgICAgICAgICAgICAgICBjb25kaXRpb25hbCwKKyAgICAgICAgICAgICAgJ2lzX2NhbGxiYWNrX2ludGVyZmFjZSc6CisgICAgICAgICAgICAgICAgICBpc19jYWxsYmFja19pbnRlcmZhY2UsCisgICAgICAgICAgfSkKKyAgICByZXR1cm4gcmVmZXJlbmNlZF9jbGFzc2VzCiAKLSAgICAjIEluZm9ybWF0aW9uIGFib3V0IHRoZSBDb2JhbHQgaW1wbGVtZW50YXRpb24gY2xhc3MuCi0gICAgeWllbGQgewotICAgICAgICAnZnVsbHlfcXVhbGlmaWVkX25hbWUnOiBmdWxsX25hbWUsCi0gICAgICAgICdpbmNsdWRlJzogZ2V0X2ltcGxlbWVudGF0aW9uX2hlYWRlcl9wYXRoKHNlbGYuaW50ZXJmYWNlc19pbmZvWwotICAgICAgICAgICAgaW50ZXJmYWNlX25hbWVdKSwKLSAgICAgICAgJ2NvbmRpdGlvbmFsJzogY29uZGl0aW9uYWwsCi0gICAgICAgICdpc19jYWxsYmFja19pbnRlcmZhY2UnOiBpbnRlcmZhY2VfbmFtZSBpbiBJZGxUeXBlLmNhbGxiYWNrX2ludGVyZmFjZXMsCisgIGRlZiBjb21tb25fY29udGV4dChzZWxmLCB0ZW1wbGF0ZSk6CisgICAgIiIiU2hhcmVkIHN0dWZmLiIiIgorICAgICMgTWFrZSBzdXJlIGV4dGVuc2lvbiBpcyAucHksIG5vdCAucHljIG9yIC5weW8sIHNvIGRvZXNuJ3QgZGVwZW5kIG9uIGNhY2hpbmcKKyAgICBtb2R1bGVfcGF0aF9weW5hbWUgPSBvcy5wYXRoLmpvaW4oCisgICAgICAgIG1vZHVsZV9wYXRoLCBvcy5wYXRoLnNwbGl0ZXh0KG1vZHVsZV9maWxlbmFtZSlbMF0gKyAnLnB5JykKKworICAgICMgRW5zdXJlIHRoYXQgcG9zaXggZm9yd2FyZCBzbGFzaGVzIGFyZSB1c2VkCisgICAgY29udGV4dCA9IHsKKyAgICAgICAgJ3RvZGF5JzoKKyAgICAgICAgICAgIGRhdGUudG9kYXkoKSwKKyAgICAgICAgJ2NvZGVfZ2VuZXJhdG9yJzoKKyAgICAgICAgICAgIG5vcm1hbGl6ZV9zbGFzaGVzKG9zLnBhdGgucmVscGF0aChtb2R1bGVfcGF0aF9weW5hbWUsIGNvYmFsdF9kaXIpKSwKKyAgICAgICAgJ3RlbXBsYXRlX3BhdGgnOgorICAgICAgICAgICAgbm9ybWFsaXplX3NsYXNoZXMob3MucGF0aC5yZWxwYXRoKHRlbXBsYXRlLmZpbGVuYW1lLCBjb2JhbHRfZGlyKSksCiAgICAgfQotICAgIHlpZWxkIHsKLSAgICAgICAgJ2Z1bGx5X3F1YWxpZmllZF9uYW1lJzogJ2NvYmFsdDo6JXM6OiVzJyAlICgKLSAgICAgICAgICAgIG5hbWVzcGFjZSwgc2VsZi53cmFwcGVyX2NsYXNzX2Zyb21faW50ZXJmYWNlX25hbWUoaW50ZXJmYWNlX25hbWUpKSwKLSAgICAgICAgJ2luY2x1ZGUnOiBzZWxmLndyYXBwZXJfaGVhZGVyX2Zyb21faW50ZXJmYWNlX25hbWUoaW50ZXJmYWNlX25hbWUpLAotICAgICAgICAnY29uZGl0aW9uYWwnOiBjb25kaXRpb25hbCwKLSAgICAgICAgJ2lzX2NhbGxiYWNrX2ludGVyZmFjZSc6IGludGVyZmFjZV9uYW1lIGluIElkbFR5cGUuY2FsbGJhY2tfaW50ZXJmYWNlcywKKyAgICByZXR1cm4gY29udGV4dAorCisgIGRlZiBidWlsZF9kaWN0aW9uYXJ5X2NvbnRleHQoc2VsZiwgZGljdGlvbmFyeSwgZGVmaW5pdGlvbnMpOgorICAgIGNvbnRleHQgPSB7CisgICAgICAgICdjbGFzc19uYW1lJzoKKyAgICAgICAgICAgIGRpY3Rpb25hcnkubmFtZSwKKyAgICAgICAgJ2hlYWRlcl9maWxlJzoKKyAgICAgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkRpY3Rpb25hcnlIZWFkZXJJbmNsdWRlUGF0aChkaWN0aW9uYXJ5Lm5hbWUpLAorICAgICAgICAnbWVtYmVycyc6IFsKKyAgICAgICAgICAgIGNvbnRleHRzLmdldF9kaWN0aW9uYXJ5X21lbWJlcl9jb250ZXh0KGRpY3Rpb25hcnksIG1lbWJlcikKKyAgICAgICAgICAgIGZvciBtZW1iZXIgaW4gZGljdGlvbmFyeS5tZW1iZXJzCisgICAgICAgIF0KICAgICB9CisgICAgcmVmZXJlbmNlZF9pbnRlcmZhY2VfbmFtZXMgPSBzZXQoCisgICAgICAgIGdldF9pbnRlcmZhY2VfdHlwZV9uYW1lc19mcm9tX3R5cGVkX29iamVjdHMoZGljdGlvbmFyeS5tZW1iZXJzKSkKKyAgICByZWZlcmVuY2VkX2NsYXNzX2NvbnRleHRzID0gc2VsZi5yZWZlcmVuY2VkX2NsYXNzX2NvbnRleHRzKAorICAgICAgICByZWZlcmVuY2VkX2ludGVyZmFjZV9uYW1lcywgVHJ1ZSkKKyAgICBjb250ZXh0WydpbmNsdWRlcyddID0gc29ydGVkKChpbnRlcmZhY2VbJ2luY2x1ZGUnXQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBpbnRlcmZhY2UgaW4gcmVmZXJlbmNlZF9jbGFzc19jb250ZXh0cykpCisgICAgY29udGV4dFsnZm9yd2FyZF9kZWNsYXJhdGlvbnMnXSA9IHNvcnRlZCgKKyAgICAgICAgcmVmZXJlbmNlZF9jbGFzc19jb250ZXh0cywga2V5PWxhbWJkYSB4OiB4WydmdWxseV9xdWFsaWZpZWRfbmFtZSddKQorICAgIGNvbnRleHRbJ2NvbXBvbmVudHMnXSA9IHNlbGYucGF0aF9idWlsZGVyLk5hbWVzcGFjZUNvbXBvbmVudHMoCisgICAgICAgIGRpY3Rpb25hcnkubmFtZSkKKyAgICByZXR1cm4gY29udGV4dAogCiAgIGRlZiBidWlsZF9pbnRlcmZhY2VfY29udGV4dChzZWxmLCBpbnRlcmZhY2UsIGludGVyZmFjZV9pbmZvLCBkZWZpbml0aW9ucyk6Ci0gICAgd3JhcHBlcl9jbGFzc19uYW1lID0gc2VsZi53cmFwcGVyX2NsYXNzX2Zyb21faW50ZXJmYWNlX25hbWUoaW50ZXJmYWNlLm5hbWUpCi0gICAgaGVhZGVyLCBfID0gc2VsZi5vdXRwdXRfcGF0aHMod3JhcHBlcl9jbGFzc19uYW1lKQotICAgIGdlbmVyYXRlZF9oZWFkZXJfcmVsYXRpdmVfcGF0aCA9IG9zLnBhdGgucmVscGF0aChoZWFkZXIsIHNlbGYub3V0cHV0X2RpcikKLSAgICBhc3NlcnQgbm90IG9zLnBhdGguaXNhYnMoZ2VuZXJhdGVkX2hlYWRlcl9yZWxhdGl2ZV9wYXRoKQotICAgIGFzc2VydCBvcy5wYXJkaXIgbm90IGluIGdlbmVyYXRlZF9oZWFkZXJfcmVsYXRpdmVfcGF0aC5zcGxpdChvcy5zZXApCi0KLSAgICBpbnRlcmZhY2VfY29tcG9uZW50cyA9ICgKLSAgICAgICAgc2VsZi5nZXRfaW50ZXJmYWNlX2NvbXBvbmVudHMoaW50ZXJmYWNlLmlkbF90eXBlLm5hbWUpKQogICAgIGNvbnRleHQgPSB7CiAgICAgICAgICMgUGFyYW1ldGVycyB1c2VkIGZvciB0ZW1wbGF0ZSByZW5kZXJpbmcuCi0gICAgICAgICd0b2RheSc6IGRhdGUudG9kYXkoKSwKLSAgICAgICAgJ2JpbmRpbmdfY2xhc3MnOiB3cmFwcGVyX2NsYXNzX25hbWUsCi0gICAgICAgICdmdWxseV9xdWFsaWZpZWRfYmluZGluZ19jbGFzcyc6ICgKLSAgICAgICAgICAgICc6Oicuam9pbihpbnRlcmZhY2VfY29tcG9uZW50cyArIFt3cmFwcGVyX2NsYXNzX25hbWVdKSksCi0gICAgICAgICdoZWFkZXJfZmlsZSc6IG5vcm1hbGl6ZV9zbGFzaGVzKGdlbmVyYXRlZF9oZWFkZXJfcmVsYXRpdmVfcGF0aCksCi0gICAgICAgICdpbXBsX2NsYXNzJzogaW50ZXJmYWNlLm5hbWUsCi0gICAgICAgICdmdWxseV9xdWFsaWZpZWRfaW1wbF9jbGFzcyc6ICgKLSAgICAgICAgICAgICc6Oicuam9pbihpbnRlcmZhY2VfY29tcG9uZW50cyArIFtpbnRlcmZhY2UubmFtZV0pKSwKLSAgICAgICAgJ2ludGVyZmFjZV9uYW1lJzogaW50ZXJmYWNlLm5hbWUsCi0gICAgICAgICdpc19ldmVudF9pbnRlcmZhY2UnOiBpbmhlcml0c19pbnRlcmZhY2UoaW50ZXJmYWNlLm5hbWUsICdFdmVudCcpLAotICAgICAgICAnaXNfZ2xvYmFsX2ludGVyZmFjZSc6IGlzX2dsb2JhbF9pbnRlcmZhY2UoaW50ZXJmYWNlKSwKLSAgICAgICAgJ2hhc19pbnRlcmZhY2Vfb2JqZWN0JzoKLSAgICAgICAgICAgICgnTm9JbnRlcmZhY2VPYmplY3QnIG5vdCBpbiBpbnRlcmZhY2UuZXh0ZW5kZWRfYXR0cmlidXRlcyksCi0gICAgICAgICdjb25kaXRpb25hbCc6IGludGVyZmFjZS5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnQ29uZGl0aW9uYWwnLCBOb25lKSwKLSAgICAgICAgJ2FkZF9vcGFxdWVfcm9vdHMnOiBpbnRlcmZhY2UuZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ0FkZE9wYXF1ZVJvb3RzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTm9uZSksCi0gICAgICAgICdnZXRfb3BhcXVlX3Jvb3QnOiBpbnRlcmZhY2UuZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ0dldE9wYXF1ZVJvb3QnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vbmUpLAorICAgICAgICAndG9kYXknOgorICAgICAgICAgICAgZGF0ZS50b2RheSgpLAorICAgICAgICAnYmluZGluZ19jbGFzcyc6CisgICAgICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0NsYXNzKGludGVyZmFjZS5uYW1lKSwKKyAgICAgICAgJ2Z1bGx5X3F1YWxpZmllZF9iaW5kaW5nX2NsYXNzJzoKKyAgICAgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkZ1bGxCaW5kaW5nc0NsYXNzTmFtZShpbnRlcmZhY2UubmFtZSksCisgICAgICAgICdoZWFkZXJfZmlsZSc6CisgICAgICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0hlYWRlckluY2x1ZGVQYXRoKGludGVyZmFjZS5uYW1lKSwKKyAgICAgICAgJ2ltcGxfY2xhc3MnOgorICAgICAgICAgICAgaW50ZXJmYWNlLm5hbWUsCisgICAgICAgICdmdWxseV9xdWFsaWZpZWRfaW1wbF9jbGFzcyc6CisgICAgICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5GdWxsQ2xhc3NOYW1lKGludGVyZmFjZS5uYW1lKSwKKyAgICAgICAgJ2ludGVyZmFjZV9uYW1lJzoKKyAgICAgICAgICAgIGludGVyZmFjZS5uYW1lLAorICAgICAgICAnaXNfZ2xvYmFsX2ludGVyZmFjZSc6CisgICAgICAgICAgICBpc19nbG9iYWxfaW50ZXJmYWNlKGludGVyZmFjZSksCisgICAgICAgICdoYXNfaW50ZXJmYWNlX29iamVjdCc6ICgKKyAgICAgICAgICAgICdOb0ludGVyZmFjZU9iamVjdCcgbm90IGluIGludGVyZmFjZS5leHRlbmRlZF9hdHRyaWJ1dGVzKSwKKyAgICAgICAgJ2NvbmRpdGlvbmFsJzoKKyAgICAgICAgICAgIGludGVyZmFjZS5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnQ29uZGl0aW9uYWwnLCBOb25lKSwKKyAgICAgICAgJ2FkZF9vcGFxdWVfcm9vdHMnOgorICAgICAgICAgICAgaW50ZXJmYWNlLmV4dGVuZGVkX2F0dHJpYnV0ZXMuZ2V0KCdBZGRPcGFxdWVSb290cycsIE5vbmUpLAorICAgICAgICAnZ2V0X29wYXF1ZV9yb290JzoKKyAgICAgICAgICAgIGludGVyZmFjZS5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnR2V0T3BhcXVlUm9vdCcsIE5vbmUpLAogICAgIH0KICAgICBpZiBpc19nbG9iYWxfaW50ZXJmYWNlKGludGVyZmFjZSk6CiAgICAgICAjIEdsb2JhbCBpbnRlcmZhY2UgcmVmZXJlbmNlcyBhbGwgaW50ZXJmYWNlcy4KQEAgLTM3Niw3ICszOTYsOCBAQAogICAgICAgICAgIGludGVyZmFjZV9uYW1lCiAgICAgICAgICAgZm9yIGludGVyZmFjZV9uYW1lIGluIHNlbGYuaW50ZXJmYWNlc19pbmZvWydhbGxfaW50ZXJmYWNlcyddCiAgICAgICAgICAgaWYgbm90IHNlbGYuaW50ZXJmYWNlc19pbmZvW2ludGVyZmFjZV9uYW1lXVsndW5zdXBwb3J0ZWQnXSBhbmQKLSAgICAgICAgICBub3Qgc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdWydpc19jYWxsYmFja19pbnRlcmZhY2UnXSkKKyAgICAgICAgICBub3Qgc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdWydpc19jYWxsYmFja19pbnRlcmZhY2UnXSBhbmQKKyAgICAgICAgICBub3Qgc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdWydpc19kaWN0aW9uYXJ5J10pCiAgICAgICByZWZlcmVuY2VkX2ludGVyZmFjZV9uYW1lcy51cGRhdGUoSWRsVHlwZS5jYWxsYmFja19pbnRlcmZhY2VzKQogICAgIGVsc2U6CiAgICAgICAjIEJ1aWxkIHRoZSBzZXQgb2YgcmVmZXJlbmNlZCBpbnRlcmZhY2VzIGZyb20gdGhpcyBpbnRlcmZhY2UncyBtZW1iZXJzLgpAQCAtMzk1LDEyICs0MTYsMTYgQEAKICAgICAjIHRvIGF2b2lkIGNpcmN1bGFyIGRlcGVuZGVuY3kgcHJvYmxlbXMuCiAgICAgaGVhZGVyX2luY2x1ZGVzID0gc2V0KCkKICAgICBpZiBpbnRlcmZhY2UucGFyZW50OgotICAgICAgaGVhZGVyX2luY2x1ZGVzLmFkZChzZWxmLndyYXBwZXJfaGVhZGVyX2Zyb21faW50ZXJmYWNlX25hbWUoCi0gICAgICAgICAgaW50ZXJmYWNlLnBhcmVudCkpCi0gICAgaGVhZGVyX2luY2x1ZGVzLmFkZChnZXRfaW1wbGVtZW50YXRpb25faGVhZGVyX3BhdGgoaW50ZXJmYWNlX2luZm8pKQorICAgICAgaGVhZGVyX2luY2x1ZGVzLmFkZCgKKyAgICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0hlYWRlckluY2x1ZGVQYXRoKGludGVyZmFjZS5wYXJlbnQpKQorICAgICAgcmVmZXJlbmNlZF9pbnRlcmZhY2VfbmFtZXMuYWRkKGludGVyZmFjZS5wYXJlbnQpCisgICAgaGVhZGVyX2luY2x1ZGVzLmFkZCgKKyAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuSW1wbGVtZW50YXRpb25IZWFkZXJQYXRoKGludGVyZmFjZS5uYW1lKSkKIAotICAgIGF0dHJpYnV0ZXMgPSBbY29udGV4dHMuYXR0cmlidXRlX2NvbnRleHQoaW50ZXJmYWNlLCBhdHRyaWJ1dGUsIGRlZmluaXRpb25zKQotICAgICAgICAgICAgICAgICAgZm9yIGF0dHJpYnV0ZSBpbiBpbnRlcmZhY2UuYXR0cmlidXRlc10KKyAgICBhdHRyaWJ1dGVzID0gWworICAgICAgICBjb250ZXh0cy5hdHRyaWJ1dGVfY29udGV4dChpbnRlcmZhY2UsIGF0dHJpYnV0ZSwgZGVmaW5pdGlvbnMpCisgICAgICAgIGZvciBhdHRyaWJ1dGUgaW4gaW50ZXJmYWNlLmF0dHJpYnV0ZXMKKyAgICBdCiAgICAgY29uc3RydWN0b3IgPSBjb250ZXh0cy5nZXRfY29uc3RydWN0b3JfY29udGV4dChzZWxmLmV4cHJlc3Npb25fZ2VuZXJhdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlKQogICAgIG1ldGhvZHMgPSBjb250ZXh0cy5nZXRfbWV0aG9kX2NvbnRleHRzKHNlbGYuZXhwcmVzc2lvbl9nZW5lcmF0b3IsIGludGVyZmFjZSkKQEAgLTQxNSwzMSArNDQwLDIxIEBACiAgICAgICAgIGNvbnN0YW50cykKIAogICAgICMgQnVpbGQgYSBzZXQgb2YgYWxsIGludGVyZmFjZXMgcmVmZXJlbmNlZCBieSB0aGlzIGludGVyZmFjZS4KLSAgICByZWZlcmVuY2VkX2ludGVyZmFjZXMgPSB7fQotICAgIGZvciBpbnRlcmZhY2VfbmFtZSBpbiByZWZlcmVuY2VkX2ludGVyZmFjZV9uYW1lczoKLSAgICAgICMgR2V0IGluZm9ybWF0aW9uIGZvciBjbGFzc2VzIHJlbGF0ZWQgdG8gdGhpcyBpbnRlcmZhY2UuCi0gICAgICBmb3IgcmVmZXJlbmNlZF9pbnRlcmZhY2VfY29udGV4dCBpbiBzZWxmLnJlZmVyZW5jZWRfaW50ZXJmYWNlX2NvbnRleHRzKAotICAgICAgICAgIGludGVyZmFjZV9uYW1lKToKLSAgICAgICAgIyBTdG9yZSBpdCBpbiB0aGUgZGljdGlvbmFyeSB1c2luZyBmdWxseV9xdWFsaWZpZWRfbmFtZSBhcyB0aGUga2V5IHNvCi0gICAgICAgICMgd2UgY2FuIGF2b2lkIGR1cGxpY2F0ZXMKLSAgICAgICAga2V5ID0gcmVmZXJlbmNlZF9pbnRlcmZhY2VfY29udGV4dFsnZnVsbHlfcXVhbGlmaWVkX25hbWUnXQotICAgICAgICByZWZlcmVuY2VkX2ludGVyZmFjZXNba2V5XSA9IHJlZmVyZW5jZWRfaW50ZXJmYWNlX2NvbnRleHQKLSAgICAjIE5vdyB0aGF0IHdlIGhhdmUgYWxsIHRoZSByZWZlcmVuY2VkIGludGVyZmFjZXMgYXQgbW9zdCBvbmNlLCBqdXN0IGdldAotICAgICMgdGhlIHZhbHVlcygpLCBzaW5jZSB0aGUga2V5IGlzIGR1cGxpY2F0ZWQgdGhlcmUgYW5kIHdlIG5vIGxvbmdlciBuZWVkCi0gICAgIyB0byBsb29rdXAgYnkgbmFtZS4KLSAgICByZWZlcmVuY2VkX2ludGVyZmFjZXMgPSByZWZlcmVuY2VkX2ludGVyZmFjZXMudmFsdWVzKCkKKyAgICByZWZlcmVuY2VkX2NsYXNzX2NvbnRleHRzID0gc2VsZi5yZWZlcmVuY2VkX2NsYXNzX2NvbnRleHRzKAorICAgICAgICByZWZlcmVuY2VkX2ludGVyZmFjZV9uYW1lcykKIAogICAgIGFsbF9pbnRlcmZhY2VzID0gW10KICAgICBmb3IgaW50ZXJmYWNlX25hbWUgaW4gcmVmZXJlbmNlZF9pbnRlcmZhY2VfbmFtZXM6Ci0gICAgICBpZiBpbnRlcmZhY2VfbmFtZSBub3QgaW4gSWRsVHlwZS5jYWxsYmFja19pbnRlcmZhY2VzIGFuZCBub3QgKAotICAgICAgICAgIHNlbGYuaW50ZXJmYWNlc19pbmZvW2ludGVyZmFjZV9uYW1lXVsndW5zdXBwb3J0ZWQnXSk6CisgICAgICBpZiAoaW50ZXJmYWNlX25hbWUgbm90IGluIElkbFR5cGUuY2FsbGJhY2tfaW50ZXJmYWNlcyBhbmQKKyAgICAgICAgICBub3Qgc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdWyd1bnN1cHBvcnRlZCddIGFuZAorICAgICAgICAgIG5vdCBzZWxmLmludGVyZmFjZXNfaW5mb1tpbnRlcmZhY2VfbmFtZV1bJ2lzX2RpY3Rpb25hcnknXSk6CiAgICAgICAgIGFsbF9pbnRlcmZhY2VzLmFwcGVuZCh7CiAgICAgICAgICAgICAnbmFtZSc6IGludGVyZmFjZV9uYW1lLAogICAgICAgICAgICAgJ2NvbmRpdGlvbmFsJzogc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdWydjb25kaXRpb25hbCddLAogICAgICAgICB9KQogCiAgICAgY29udGV4dFsnaW1wbGVtZW50YXRpb25faW5jbHVkZXMnXSA9IHNvcnRlZCgKLSAgICAgICAgKGludGVyZmFjZVsnaW5jbHVkZSddIGZvciBpbnRlcmZhY2UgaW4gcmVmZXJlbmNlZF9pbnRlcmZhY2VzKSkKKyAgICAgICAgKGludGVyZmFjZVsnaW5jbHVkZSddIGZvciBpbnRlcmZhY2UgaW4gcmVmZXJlbmNlZF9jbGFzc19jb250ZXh0cykpCiAgICAgY29udGV4dFsnaGVhZGVyX2luY2x1ZGVzJ10gPSBzb3J0ZWQoaGVhZGVyX2luY2x1ZGVzKQogICAgIGNvbnRleHRbJ2F0dHJpYnV0ZXMnXSA9IFthIGZvciBhIGluIGF0dHJpYnV0ZXMgaWYgbm90IGFbJ2lzX3N0YXRpYyddXQogICAgIGNvbnRleHRbJ3N0YXRpY19hdHRyaWJ1dGVzJ10gPSBbYSBmb3IgYSBpbiBhdHRyaWJ1dGVzIGlmIGFbJ2lzX3N0YXRpYyddXQpAQCAtNDU2LDIxICs0NzEsMTkgQEAKICAgICBjb250ZXh0Wyd1bnN1cHBvcnRlZF9jb25zdHJ1Y3Rvcl9wcm9wZXJ0aWVzJ10gPSBzZXQoCiAgICAgICAgIHVuc3VwcG9ydGVkX2NvbnN0YW50X25hbWVzKQogICAgIGlmIGludGVyZmFjZS5wYXJlbnQ6Ci0gICAgICBjb250ZXh0WydwYXJlbnRfaW50ZXJmYWNlJ10gPSAoCi0gICAgICAgICAgJzo6Jy5qb2luKHNlbGYuZ2V0X2ludGVyZmFjZV9jb21wb25lbnRzKGludGVyZmFjZS5wYXJlbnQpKSArICc6OiVzJyAlCi0gICAgICAgICAgc2VsZi53cmFwcGVyX2NsYXNzX2Zyb21faW50ZXJmYWNlX25hbWUoaW50ZXJmYWNlLnBhcmVudCkpCisgICAgICBjb250ZXh0WydwYXJlbnRfaW50ZXJmYWNlJ10gPSBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0NsYXNzKAorICAgICAgICAgIGludGVyZmFjZS5wYXJlbnQpCiAgICAgY29udGV4dFsnaXNfZXhjZXB0aW9uX2ludGVyZmFjZSddID0gaW50ZXJmYWNlLmlzX2V4Y2VwdGlvbgotICAgIGNvbnRleHRbJ2NvbXBvbmVudHMnXSA9IHNlbGYuZ2V0X2ludGVyZmFjZV9jb21wb25lbnRzKAotICAgICAgICBpbnRlcmZhY2UuaWRsX3R5cGUubmFtZSkKICAgICBjb250ZXh0Wydmb3J3YXJkX2RlY2xhcmF0aW9ucyddID0gc29ydGVkKAotICAgICAgICByZWZlcmVuY2VkX2ludGVyZmFjZXMsCi0gICAgICAgIGtleT1sYW1iZGEgeDogeFsnZnVsbHlfcXVhbGlmaWVkX25hbWUnXSkKKyAgICAgICAgcmVmZXJlbmNlZF9jbGFzc19jb250ZXh0cywga2V5PWxhbWJkYSB4OiB4WydmdWxseV9xdWFsaWZpZWRfbmFtZSddKQogICAgIGNvbnRleHRbJ2FsbF9pbnRlcmZhY2VzJ10gPSBzb3J0ZWQoYWxsX2ludGVyZmFjZXMsIGtleT1sYW1iZGEgeDogeFsnbmFtZSddKQogICAgIGNvbnRleHRbJ2NhbGxiYWNrX2Z1bmN0aW9ucyddID0gZGVmaW5pdGlvbnMuY2FsbGJhY2tfZnVuY3Rpb25zLnZhbHVlcygpCiAgICAgY29udGV4dFsnZW51bWVyYXRpb25zJ10gPSBbCiAgICAgICAgIGNvbnRleHRzLmVudW1lcmF0aW9uX2NvbnRleHQoZW51bWVyYXRpb24pCiAgICAgICAgIGZvciBlbnVtZXJhdGlvbiBpbiBkZWZpbml0aW9ucy5lbnVtZXJhdGlvbnMudmFsdWVzKCkKICAgICBdCisgICAgY29udGV4dFsnY29tcG9uZW50cyddID0gc2VsZi5wYXRoX2J1aWxkZXIuTmFtZXNwYWNlQ29tcG9uZW50cygKKyAgICAgICAgaW50ZXJmYWNlLm5hbWUpCiAKICAgICBjb250ZXh0WydzdHJpbmdpZmllciddID0gY29udGV4dHMuc3RyaW5naWZpZXJfY29udGV4dChpbnRlcmZhY2UpCiAgICAgY29udGV4dFsnaW5kZXhlZF9wcm9wZXJ0eV9nZXR0ZXInXSA9IGNvbnRleHRzLnNwZWNpYWxfbWV0aG9kX2NvbnRleHQoCkBAIC00OTUsNiArNTA4LDcgQEAKIAogICAgIHJldHVybiBjb250ZXh0CiAKKwogIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKIAogCkBAIC01MDgsNiArNTIyLDE0IEBACiAgICAgcHJpbnQgJ1VzYWdlOiAlcyBDQUNIRV9ESVIgVEVNUExBVEVTX0RJUiBEVU1NWV9GSUxFTkFNRScgJSBhcmd2WzBdCiAgICAgcmV0dXJuIDEKIAorICAjIERlbGV0ZSBhbGwgamluamEyIC5jYWNoZSBmaWxlcywgc2luY2UgdGhleSB3aWxsIGdldCByZWdlbmVyYXRlZCBhbnl3YXlzLgorICBmb3IgZmlsZW5hbWUgaW4gb3MubGlzdGRpcihjYWNoZV9kaXIpOgorICAgIGlmIG9zLnBhdGguc3BsaXRleHQoZmlsZW5hbWUpWzFdID09ICcuY2FjaGUnOgorICAgICAgIyBXZSBleHBlY3QgdGhhdCB0aGUgb25seSAuY2FjaGUgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnkgYXJlIGZvciBqaW5qYTIKKyAgICAgICMgYW5kIHRoZXkgaGF2ZSBhIF9famluamEyXyBwcmVmaXguCisgICAgICBhc3NlcnQgZmlsZW5hbWUuc3RhcnRzd2l0aCgnX19qaW5qYTJfJykKKyAgICAgIG9zLnJlbW92ZShvcy5wYXRoLmpvaW4oY2FjaGVfZGlyLCBmaWxlbmFtZSkpCisKICAgIyBDYWNoZSB0ZW1wbGF0ZXMuCiAgICMgV2hldGhlciB0aGUgcGF0aCBpcyBhYnNvbHV0ZSBvciByZWxhdGl2ZSBhZmZlY3RzIHRoZSBjYWNoZSBmaWxlIG5hbWUuIFVzZQogICAjIHRoZSBhYnNvbHV0ZSBwYXRoIHRvIGVuc3VyZSB0aGF0IHRoZSBzYW1lIHBhdGggaXMgdXNlZCB3aGVuIHdlIHBvcHVsYXRlIHRoZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9jb250ZXh0cy5weSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvY29udGV4dHMucHkKaW5kZXggZmMyZWM5OC4uZDczOWU4MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9jb250ZXh0cy5weQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2NvbnRleHRzLnB5CkBAIC0xNDQsNiArMTQ0LDggQEAKICAgICBjb2JhbHRfdHlwZSA9ICd2b2lkJwogICBlbGlmIGlzX29iamVjdF90eXBlKGlkbF90eXBlKToKICAgICBjb2JhbHRfdHlwZSA9ICdPcGFxdWVIYW5kbGUnCisgIGVsaWYgaWRsX3R5cGUuaXNfZGljdGlvbmFyeToKKyAgICBjb2JhbHRfdHlwZSA9IGdldF9pbnRlcmZhY2VfbmFtZShpZGxfdHlwZSkKIAogICBhc3NlcnQgY29iYWx0X3R5cGUsICdVbnN1cHBvcnRlZCBpZGxfdHlwZSAlcycgJSBpZGxfdHlwZQogCkBAIC0yMDQsOCArMjA2LDggQEAKICAgaWYgaWRsX3R5cGUuaXNfc3RyaW5nX3R5cGU6CiAgICAgaWYgdHlwZWRfb2JqZWN0LmV4dGVuZGVkX2F0dHJpYnV0ZXMuZ2V0KCdUcmVhdE51bGxBcycsICcnKSA9PSAnRW1wdHlTdHJpbmcnOgogICAgICAgZmxhZ3MuYXBwZW5kKCdrQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nJykKLSAgICBlbGlmICh0eXBlZF9vYmplY3QuZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ1RyZWF0VW5kZWZpbmVkQXMnLCAnJykgPT0KLSAgICAgICAgICAnRW1wdHlTdHJpbmcnKToKKyAgICBlbGlmICh0eXBlZF9vYmplY3QuZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ1RyZWF0VW5kZWZpbmVkQXMnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnJykgPT0gJ0VtcHR5U3RyaW5nJyk6CiAgICAgICBmbGFncy5hcHBlbmQoJ2tDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZycpCiAKICAgaWYgZmxhZ3M6CkBAIC0yMTcsMjMgKzIxOSwzMyBAQAogZGVmIGFyZ3VtZW50X2NvbnRleHQoaW50ZXJmYWNlLCBhcmd1bWVudCk6CiAgICIiIkNyZWF0ZSB0ZW1wbGF0ZSB2YWx1ZXMgZm9yIG1ldGhvZC9jb25zdHJ1Y3RvciBhcmd1bWVudHMuIiIiCiAgIHJldHVybiB7Ci0gICAgICAnaWRsX3R5cGVfb2JqZWN0JzogYXJndW1lbnQuaWRsX3R5cGUsCi0gICAgICAnbmFtZSc6IGFyZ3VtZW50Lm5hbWUsCi0gICAgICAndHlwZSc6IHR5cGVkX29iamVjdF90b19jb2JhbHRfdHlwZShpbnRlcmZhY2UsIGFyZ3VtZW50KSwKLSAgICAgICdhcmdfdHlwZSc6IHR5cGVkX29iamVjdF90b19hcmdfdHlwZShpbnRlcmZhY2UsIGFyZ3VtZW50KSwKLSAgICAgICdjb252ZXJzaW9uX2ZsYWdzJzogZ2V0X2NvbnZlcnNpb25fZmxhZ3MoYXJndW1lbnQpLAotICAgICAgJ2lzX29wdGlvbmFsJzogYXJndW1lbnQuaXNfb3B0aW9uYWwsCi0gICAgICAnaXNfdmFyaWFkaWMnOiBhcmd1bWVudC5pc192YXJpYWRpYywKLSAgICAgICdkZWZhdWx0X3ZhbHVlJzogaWRsX2xpdGVyYWxfdG9fY29iYWx0X2xpdGVyYWwoYXJndW1lbnQuaWRsX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LmRlZmF1bHRfdmFsdWUpIGlmCi0gICAgICAgICAgICAgICAgICAgICAgIGFyZ3VtZW50LmRlZmF1bHRfdmFsdWUgZWxzZSBOb25lLAorICAgICAgJ2lkbF90eXBlX29iamVjdCc6CisgICAgICAgICAgYXJndW1lbnQuaWRsX3R5cGUsCisgICAgICAnbmFtZSc6CisgICAgICAgICAgYXJndW1lbnQubmFtZSwKKyAgICAgICd0eXBlJzoKKyAgICAgICAgICB0eXBlZF9vYmplY3RfdG9fY29iYWx0X3R5cGUoaW50ZXJmYWNlLCBhcmd1bWVudCksCisgICAgICAnYXJnX3R5cGUnOgorICAgICAgICAgIHR5cGVkX29iamVjdF90b19hcmdfdHlwZShpbnRlcmZhY2UsIGFyZ3VtZW50KSwKKyAgICAgICdjb252ZXJzaW9uX2ZsYWdzJzoKKyAgICAgICAgICBnZXRfY29udmVyc2lvbl9mbGFncyhhcmd1bWVudCksCisgICAgICAnaXNfb3B0aW9uYWwnOgorICAgICAgICAgIGFyZ3VtZW50LmlzX29wdGlvbmFsLAorICAgICAgJ2lzX3ZhcmlhZGljJzoKKyAgICAgICAgICBhcmd1bWVudC5pc192YXJpYWRpYywKKyAgICAgICdkZWZhdWx0X3ZhbHVlJzoKKyAgICAgICAgICBpZGxfbGl0ZXJhbF90b19jb2JhbHRfbGl0ZXJhbChhcmd1bWVudC5pZGxfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudC5kZWZhdWx0X3ZhbHVlKQorICAgICAgICAgIGlmIGFyZ3VtZW50LmRlZmF1bHRfdmFsdWUgZWxzZSBOb25lLAogICB9CiAKIAogZGVmIGdldF9ub25fb3B0aW9uYWxfYXJndW1lbnRzKGFyZ3VtZW50cyk6CiAgICIiIkNyZWF0ZSBub24gb3B0aW9uYWwgYXJndW1lbnRzIGxpc3QuIiIiCi0gIHJldHVybiBbYXJndW1lbnQgZm9yIGFyZ3VtZW50IGluIGFyZ3VtZW50cwotICAgICAgICAgIGlmIG5vdCBhcmd1bWVudFsnaXNfb3B0aW9uYWwnXSBhbmQgbm90IGFyZ3VtZW50Wydpc192YXJpYWRpYyddXQorICByZXR1cm4gWworICAgICAgYXJndW1lbnQgZm9yIGFyZ3VtZW50IGluIGFyZ3VtZW50cworICAgICAgaWYgbm90IGFyZ3VtZW50Wydpc19vcHRpb25hbCddIGFuZCBub3QgYXJndW1lbnRbJ2lzX3ZhcmlhZGljJ10KKyAgXQogCiAKIGRlZiBnZXRfb3B0aW9uYWxfYXJndW1lbnRzKGFyZ3VtZW50cyk6CkBAIC0yNjgsMjEgKzI4MCwyNiBAQAogICBvcHRpb25hbF9hcmd1bWVudHMgPSBnZXRfb3B0aW9uYWxfYXJndW1lbnRzKGFyZ3VtZW50cykKICAgbnVtX2RlZmF1bHRfYXJndW1lbnRzID0gZ2V0X251bV9kZWZhdWx0X2FyZ3VtZW50cyhvcHRpb25hbF9hcmd1bWVudHMpCiAgIHJldHVybiB7Ci0gICAgICAnYXJndW1lbnRzJzogYXJndW1lbnRzLAotICAgICAgJ25vbl9vcHRpb25hbF9hcmd1bWVudHMnOiBnZXRfbm9uX29wdGlvbmFsX2FyZ3VtZW50cyhhcmd1bWVudHMpLAotICAgICAgJ29wdGlvbmFsX2FyZ3VtZW50cyc6IG9wdGlvbmFsX2FyZ3VtZW50cywKLSAgICAgICdudW1fZGVmYXVsdF9hcmd1bWVudHMnOiBudW1fZGVmYXVsdF9hcmd1bWVudHMsCi0gICAgICAndmFyaWFkaWNfYXJndW1lbnQnOiBnZXRfdmFyaWFkaWNfYXJndW1lbnQoYXJndW1lbnRzKSwKLSAgICAgICdoYXNfbm9uX2RlZmF1bHRfb3B0aW9uYWxfYXJndW1lbnRzJzogbGVuKG9wdGlvbmFsX2FyZ3VtZW50cykgPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fZGVmYXVsdF9hcmd1bWVudHMsCisgICAgICAnYXJndW1lbnRzJzoKKyAgICAgICAgICBhcmd1bWVudHMsCisgICAgICAnbm9uX29wdGlvbmFsX2FyZ3VtZW50cyc6CisgICAgICAgICAgZ2V0X25vbl9vcHRpb25hbF9hcmd1bWVudHMoYXJndW1lbnRzKSwKKyAgICAgICdvcHRpb25hbF9hcmd1bWVudHMnOgorICAgICAgICAgIG9wdGlvbmFsX2FyZ3VtZW50cywKKyAgICAgICdudW1fZGVmYXVsdF9hcmd1bWVudHMnOgorICAgICAgICAgIG51bV9kZWZhdWx0X2FyZ3VtZW50cywKKyAgICAgICd2YXJpYWRpY19hcmd1bWVudCc6CisgICAgICAgICAgZ2V0X3ZhcmlhZGljX2FyZ3VtZW50KGFyZ3VtZW50cyksCisgICAgICAnaGFzX25vbl9kZWZhdWx0X29wdGlvbmFsX2FyZ3VtZW50cyc6CisgICAgICAgICAgbGVuKG9wdGlvbmFsX2FyZ3VtZW50cykgPiBudW1fZGVmYXVsdF9hcmd1bWVudHMsCiAgIH0KIAogCiBkZWYgY29uc3RydWN0b3JfY29udGV4dChpbnRlcmZhY2UsIGNvbnN0cnVjdG9yKToKICAgIiIiQ3JlYXRlIHRlbXBsYXRlIHZhbHVlcyBmb3IgZ2VuZXJhdGluZyBjb25zdHJ1Y3RvciBiaW5kaW5ncy4iIiIKICAgY29udGV4dCA9IHsKLSAgICAgICdjYWxsX3dpdGgnOiBpbnRlcmZhY2UuZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ0NvbnN0cnVjdG9yQ2FsbFdpdGgnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb25lKSwKKyAgICAgICdjYWxsX3dpdGgnOgorICAgICAgICAgIGludGVyZmFjZS5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnQ29uc3RydWN0b3JDYWxsV2l0aCcsIE5vbmUpLAogICAgICAgJ3JhaXNlc19leGNlcHRpb24nOiAoaW50ZXJmYWNlLmV4dGVuZGVkX2F0dHJpYnV0ZXMuZ2V0KAogICAgICAgICAgICdSYWlzZXNFeGNlcHRpb24nLCBOb25lKSA9PSAnQ29uc3RydWN0b3InKSwKICAgfQpAQCAtMjk0LDE1ICszMTEsMjIgQEAKIGRlZiBtZXRob2RfY29udGV4dChpbnRlcmZhY2UsIG9wZXJhdGlvbik6CiAgICIiIkNyZWF0ZSB0ZW1wbGF0ZSB2YWx1ZXMgZm9yIGdlbmVyYXRpbmcgbWV0aG9kIGJpbmRpbmdzLiIiIgogICBjb250ZXh0ID0gewotICAgICAgJ2lkbF9uYW1lJzogb3BlcmF0aW9uLm5hbWUsCi0gICAgICAnbmFtZSc6IGNhcGl0YWxpemVfZnVuY3Rpb25fbmFtZShvcGVyYXRpb24ubmFtZSksCi0gICAgICAndHlwZSc6IHR5cGVkX29iamVjdF90b19jb2JhbHRfdHlwZShpbnRlcmZhY2UsIG9wZXJhdGlvbiksCi0gICAgICAnaXNfc3RhdGljJzogb3BlcmF0aW9uLmlzX3N0YXRpYywKLSAgICAgICdjYWxsX3dpdGgnOiBvcGVyYXRpb24uZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ0NhbGxXaXRoJywgTm9uZSksCisgICAgICAnaWRsX25hbWUnOgorICAgICAgICAgIG9wZXJhdGlvbi5uYW1lLAorICAgICAgJ25hbWUnOgorICAgICAgICAgIGNhcGl0YWxpemVfZnVuY3Rpb25fbmFtZShvcGVyYXRpb24ubmFtZSksCisgICAgICAndHlwZSc6CisgICAgICAgICAgdHlwZWRfb2JqZWN0X3RvX2NvYmFsdF90eXBlKGludGVyZmFjZSwgb3BlcmF0aW9uKSwKKyAgICAgICdpc19zdGF0aWMnOgorICAgICAgICAgIG9wZXJhdGlvbi5pc19zdGF0aWMsCisgICAgICAnY2FsbF93aXRoJzoKKyAgICAgICAgICBvcGVyYXRpb24uZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ0NhbGxXaXRoJywgTm9uZSksCiAgICAgICAncmFpc2VzX2V4Y2VwdGlvbic6CiAgICAgICAgICAgb3BlcmF0aW9uLmV4dGVuZGVkX2F0dHJpYnV0ZXMuaGFzX2tleSgnUmFpc2VzRXhjZXB0aW9uJyksCi0gICAgICAnY29uZGl0aW9uYWwnOiBvcGVyYXRpb24uZXh0ZW5kZWRfYXR0cmlidXRlcy5nZXQoJ0NvbmRpdGlvbmFsJywgTm9uZSksCi0gICAgICAndW5zdXBwb3J0ZWQnOiAnTm90U3VwcG9ydGVkJyBpbiBvcGVyYXRpb24uZXh0ZW5kZWRfYXR0cmlidXRlcywKKyAgICAgICdjb25kaXRpb25hbCc6CisgICAgICAgICAgb3BlcmF0aW9uLmV4dGVuZGVkX2F0dHJpYnV0ZXMuZ2V0KCdDb25kaXRpb25hbCcsIE5vbmUpLAorICAgICAgJ3Vuc3VwcG9ydGVkJzoKKyAgICAgICAgICAnTm90U3VwcG9ydGVkJyBpbiBvcGVyYXRpb24uZXh0ZW5kZWRfYXR0cmlidXRlcywKICAgfQogCiAgIGNvbnRleHQudXBkYXRlKHBhcnRpYWxfY29udGV4dChpbnRlcmZhY2UsIG9wZXJhdGlvbikpCkBAIC0zMTksNyArMzQzLDkgQEAKICAgICBjb2JhbHRfbmFtZSA9IGNhcGl0YWxpemVfZnVuY3Rpb25fbmFtZShpbnRlcmZhY2Uuc3RyaW5naWZpZXIub3BlcmF0aW9uLm5hbWUpCiAgIGVsc2U6CiAgICAgY29iYWx0X25hbWUgPSAnQW5vbnltb3VzU3RyaW5naWZpZXInCi0gIHJldHVybiB7J25hbWUnOiBjb2JhbHRfbmFtZSx9CisgIHJldHVybiB7CisgICAgICAnbmFtZSc6IGNvYmFsdF9uYW1lLAorICB9CiAKIAogZGVmIHNwZWNpYWxfbWV0aG9kX2NvbnRleHQoaW50ZXJmYWNlLCBvcGVyYXRpb24pOgpAQCAtMzUwLDcgKzM3Niw4IEBACiAgICAgY29iYWx0X25hbWUgPSAnQW5vbnltb3VzTmFtZWQlcycgJSBmdW5jdGlvbl9zdWZmaXhbc3BlY2lhbF90eXBlXQogCiAgIGNvbnRleHQgPSB7Ci0gICAgICAnbmFtZSc6IGNvYmFsdF9uYW1lLAorICAgICAgJ25hbWUnOgorICAgICAgICAgIGNvYmFsdF9uYW1lLAogICAgICAgJ3JhaXNlc19leGNlcHRpb24nOgogICAgICAgICAgIG9wZXJhdGlvbi5leHRlbmRlZF9hdHRyaWJ1dGVzLmhhc19rZXkoJ1JhaXNlc0V4Y2VwdGlvbicpLAogICB9CkBAIC0zNjgsMTggKzM5NSwyOCBAQAogZGVmIGF0dHJpYnV0ZV9jb250ZXh0KGludGVyZmFjZSwgYXR0cmlidXRlLCBkZWZpbml0aW9ucyk6CiAgICIiIkNyZWF0ZSB0ZW1wbGF0ZSB2YWx1ZXMgZm9yIGF0dHJpYnV0ZSBiaW5kaW5ncy4iIiIKICAgY29udGV4dCA9IHsKLSAgICAgICdpZGxfbmFtZSc6IGF0dHJpYnV0ZS5uYW1lLAotICAgICAgJ2dldHRlcl9mdW5jdGlvbl9uYW1lJzogY29udmVydF90b19jb2JhbHRfbmFtZShhdHRyaWJ1dGUubmFtZSksCi0gICAgICAnc2V0dGVyX2Z1bmN0aW9uX25hbWUnOiAnc2V0XycgKyBjb252ZXJ0X3RvX2NvYmFsdF9uYW1lKGF0dHJpYnV0ZS5uYW1lKSwKLSAgICAgICd0eXBlJzogdHlwZWRfb2JqZWN0X3RvX2NvYmFsdF90eXBlKGludGVyZmFjZSwgYXR0cmlidXRlKSwKLSAgICAgICdpc19zdGF0aWMnOiBhdHRyaWJ1dGUuaXNfc3RhdGljLAotICAgICAgJ2lzX3JlYWRfb25seSc6IGF0dHJpYnV0ZS5pc19yZWFkX29ubHksCi0gICAgICAnY2FsbF93aXRoJzogYXR0cmlidXRlLmV4dGVuZGVkX2F0dHJpYnV0ZXMuZ2V0KCdDYWxsV2l0aCcsIE5vbmUpLAorICAgICAgJ2lkbF9uYW1lJzoKKyAgICAgICAgICBhdHRyaWJ1dGUubmFtZSwKKyAgICAgICdnZXR0ZXJfZnVuY3Rpb25fbmFtZSc6CisgICAgICAgICAgY29udmVydF90b19jb2JhbHRfbmFtZShhdHRyaWJ1dGUubmFtZSksCisgICAgICAnc2V0dGVyX2Z1bmN0aW9uX25hbWUnOgorICAgICAgICAgICdzZXRfJyArIGNvbnZlcnRfdG9fY29iYWx0X25hbWUoYXR0cmlidXRlLm5hbWUpLAorICAgICAgJ3R5cGUnOgorICAgICAgICAgIHR5cGVkX29iamVjdF90b19jb2JhbHRfdHlwZShpbnRlcmZhY2UsIGF0dHJpYnV0ZSksCisgICAgICAnaXNfc3RhdGljJzoKKyAgICAgICAgICBhdHRyaWJ1dGUuaXNfc3RhdGljLAorICAgICAgJ2lzX3JlYWRfb25seSc6CisgICAgICAgICAgYXR0cmlidXRlLmlzX3JlYWRfb25seSwKKyAgICAgICdjYWxsX3dpdGgnOgorICAgICAgICAgIGF0dHJpYnV0ZS5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnQ2FsbFdpdGgnLCBOb25lKSwKICAgICAgICdyYWlzZXNfZXhjZXB0aW9uJzoKICAgICAgICAgICBhdHRyaWJ1dGUuZXh0ZW5kZWRfYXR0cmlidXRlcy5oYXNfa2V5KCdSYWlzZXNFeGNlcHRpb24nKSwKLSAgICAgICdjb252ZXJzaW9uX2ZsYWdzJzogZ2V0X2NvbnZlcnNpb25fZmxhZ3MoYXR0cmlidXRlKSwKLSAgICAgICdjb25kaXRpb25hbCc6IGF0dHJpYnV0ZS5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnQ29uZGl0aW9uYWwnLCBOb25lKSwKLSAgICAgICd1bnN1cHBvcnRlZCc6ICdOb3RTdXBwb3J0ZWQnIGluIGF0dHJpYnV0ZS5leHRlbmRlZF9hdHRyaWJ1dGVzLAorICAgICAgJ2NvbnZlcnNpb25fZmxhZ3MnOgorICAgICAgICAgIGdldF9jb252ZXJzaW9uX2ZsYWdzKGF0dHJpYnV0ZSksCisgICAgICAnY29uZGl0aW9uYWwnOgorICAgICAgICAgIGF0dHJpYnV0ZS5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnQ29uZGl0aW9uYWwnLCBOb25lKSwKKyAgICAgICd1bnN1cHBvcnRlZCc6CisgICAgICAgICAgJ05vdFN1cHBvcnRlZCcgaW4gYXR0cmlidXRlLmV4dGVuZGVkX2F0dHJpYnV0ZXMsCiAgIH0KICAgZm9yd2FyZGVkX2F0dHJpYnV0ZV9uYW1lID0gYXR0cmlidXRlLmV4dGVuZGVkX2F0dHJpYnV0ZXMuZ2V0KCdQdXRGb3J3YXJkcycpCiAgIGlmIGZvcndhcmRlZF9hdHRyaWJ1dGVfbmFtZToKQEAgLTM4OSwxMiArNDI2LDEzIEBACiAgICAgICAgICdQdXRGb3J3YXJkcyBtdXN0IGJlIG9uIGEgcmVhZG9ubHkgYXR0cmlidXRlLicpCiAgICAgZm9yd2FyZGVkX2ludGVyZmFjZSA9IGRlZmluaXRpb25zLmludGVyZmFjZXNbZ2V0X2ludGVyZmFjZV9uYW1lKAogICAgICAgICBhdHRyaWJ1dGUuaWRsX3R5cGUpXQotICAgIG1hdGNoaW5nX2F0dHJpYnV0ZXMgPSBbYSBmb3IgYSBpbiBmb3J3YXJkZWRfaW50ZXJmYWNlLmF0dHJpYnV0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGEubmFtZSA9PSBmb3J3YXJkZWRfYXR0cmlidXRlX25hbWVdCisgICAgbWF0Y2hpbmdfYXR0cmlidXRlcyA9IFsKKyAgICAgICAgYSBmb3IgYSBpbiBmb3J3YXJkZWRfaW50ZXJmYWNlLmF0dHJpYnV0ZXMKKyAgICAgICAgaWYgYS5uYW1lID09IGZvcndhcmRlZF9hdHRyaWJ1dGVfbmFtZQorICAgIF0KICAgICBhc3NlcnQgbGVuKG1hdGNoaW5nX2F0dHJpYnV0ZXMpID09IDEKLSAgICBjb250ZXh0WydwdXRfZm9yd2FyZHMnXSA9IGF0dHJpYnV0ZV9jb250ZXh0KGZvcndhcmRlZF9pbnRlcmZhY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXRjaGluZ19hdHRyaWJ1dGVzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5pdGlvbnMpCisgICAgY29udGV4dFsncHV0X2ZvcndhcmRzJ10gPSBhdHRyaWJ1dGVfY29udGV4dCgKKyAgICAgICAgZm9yd2FyZGVkX2ludGVyZmFjZSwgbWF0Y2hpbmdfYXR0cmlidXRlc1swXSwgZGVmaW5pdGlvbnMpCiAgIGNvbnRleHRbJ2hhc19zZXR0ZXInXSA9IG5vdCBhdHRyaWJ1dGUuaXNfcmVhZF9vbmx5IG9yIGZvcndhcmRlZF9hdHRyaWJ1dGVfbmFtZQogICBpZiBpc19jb25zdHJ1Y3Rvcl9hdHRyaWJ1dGUoYXR0cmlidXRlKToKICAgICBjb250ZXh0Wydpc19jb25zdHJ1Y3Rvcl9hdHRyaWJ1dGUnXSA9IFRydWUKQEAgLTQwOSw5ICs0NDcsMTAgQEAKIGRlZiBlbnVtZXJhdGlvbl9jb250ZXh0KGVudW1lcmF0aW9uKToKICAgIiIiQ3JlYXRlIHRlbXBsYXRlIHZhbHVlcyBmb3IgSURMIGVudW1lcmF0aW9uIHR5cGUgYmluZGluZ3MuIiIiCiAgIHJldHVybiB7Ci0gICAgICAnbmFtZSc6IGVudW1lcmF0aW9uLm5hbWUsCi0gICAgICAndmFsdWVfcGFpcnMnOiBbKGNvbnZlcnRfdG9fY29iYWx0X2VudW1lcmF0aW9uX3ZhbHVlKHZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsKSBmb3IgdmFsdWUgaW4gZW51bWVyYXRpb24udmFsdWVzXSwKKyAgICAgICduYW1lJzoKKyAgICAgICAgICBlbnVtZXJhdGlvbi5uYW1lLAorICAgICAgJ3ZhbHVlX3BhaXJzJzogWyhjb252ZXJ0X3RvX2NvYmFsdF9lbnVtZXJhdGlvbl92YWx1ZSh2YWx1ZSksIHZhbHVlLCkKKyAgICAgICAgICAgICAgICAgICAgICBmb3IgdmFsdWUgaW4gZW51bWVyYXRpb24udmFsdWVzXSwKICAgfQogCiAKQEAgLTQ1MSwxNiArNDkwLDE2IEBACiAgICMgQ3JlYXRlIG92ZXJsb2FkIHNldHMgZm9yIHN0YXRpYyBhbmQgbm9uLXN0YXRpYyBtZXRob2RzIHNlcGVyYXRlbHkuCiAgICMgRWFjaCBpdGVtIGluIHRoZSBsaXN0IGlzIGEgcGFpciBvZiAobmFtZSwgW21ldGhvZF9jb250ZXh0c10pIHdoZXJlIGZvcgogICAjIGVhY2ggbWV0aG9kX2NvbnRleHQgbSBpbiB0aGUgbGlzdCwgbVsnbmFtZSddID09IG5hbWUuCi0gIHN0YXRpY19tZXRob2Rfb3ZlcmxvYWRzID0gbWV0aG9kX292ZXJsb2Fkc19ieV9uYW1lKFttIGZvciBtIGluIG1ldGhvZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIG1bJ2lzX3N0YXRpYyddXSkKKyAgc3RhdGljX21ldGhvZF9vdmVybG9hZHMgPSBtZXRob2Rfb3ZlcmxvYWRzX2J5X25hbWUoCisgICAgICBbbSBmb3IgbSBpbiBtZXRob2RzIGlmIG1bJ2lzX3N0YXRpYyddXSkKICAgbm9uX3N0YXRpY19tZXRob2Rfb3ZlcmxvYWRzID0gbWV0aG9kX292ZXJsb2Fkc19ieV9uYW1lKAogICAgICAgW20gZm9yIG0gaW4gbWV0aG9kcyBpZiBub3QgbVsnaXNfc3RhdGljJ11dKQotICBzdGF0aWNfb3ZlcmxvYWRfY29udGV4dHMgPSBnZXRfb3ZlcmxvYWRfY29udGV4dHMoCi0gICAgICBleHByZXNzaW9uX2dlbmVyYXRvciwgW2NvbnRleHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBfLCBjb250ZXh0cyBpbiBzdGF0aWNfbWV0aG9kX292ZXJsb2Fkc10pCi0gIG5vbl9zdGF0aWNfb3ZlcmxvYWRfY29udGV4dHMgPSBnZXRfb3ZlcmxvYWRfY29udGV4dHMoCi0gICAgICBleHByZXNzaW9uX2dlbmVyYXRvciwgW2NvbnRleHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBfLCBjb250ZXh0cyBpbiBub25fc3RhdGljX21ldGhvZF9vdmVybG9hZHNdKQorICBzdGF0aWNfb3ZlcmxvYWRfY29udGV4dHMgPSBnZXRfb3ZlcmxvYWRfY29udGV4dHMoZXhwcmVzc2lvbl9nZW5lcmF0b3IsIFsKKyAgICAgIGNvbnRleHRzIGZvciBfLCBjb250ZXh0cyBpbiBzdGF0aWNfbWV0aG9kX292ZXJsb2FkcworICBdKQorICBub25fc3RhdGljX292ZXJsb2FkX2NvbnRleHRzID0gZ2V0X292ZXJsb2FkX2NvbnRleHRzKGV4cHJlc3Npb25fZ2VuZXJhdG9yLCBbCisgICAgICBjb250ZXh0cyBmb3IgXywgY29udGV4dHMgaW4gbm9uX3N0YXRpY19tZXRob2Rfb3ZlcmxvYWRzCisgIF0pCiAKICAgIyBTZXQgaXNfc3RhdGljIG9uIGVhY2ggb2YgdGhlc2UgYXBwcm9wcmlhdGVseS4KICAgZm9yIGNvbnRleHQgaW4gc3RhdGljX292ZXJsb2FkX2NvbnRleHRzOgpAQCAtNTE0LDMgKzU1MywzMCBAQAogICAgIGFzc2VydCBsZW4ob3ZlcmxvYWRfY29udGV4dHMpID09IDEsICgKICAgICAgICAgJ0V4cGVjdGVkIGV4YWN0bHkgb25lIG92ZXJsb2FkIGNvbnRleHQgZm9yIGNvbnN0cnVjdG9yLicpCiAgICAgcmV0dXJuIG92ZXJsb2FkX2NvbnRleHRzWzBdCisKKworZGVmIGdldF9kaWN0aW9uYXJ5X21lbWJlcl9jb250ZXh0KGRpY3Rpb25hcnksIGRpY3Rpb25hcnlfbWVtYmVyKToKKyAgIiIiUmV0dXJucyBhIGppbmphIGNvbnRleHQgZm9yIGEgZGljdGlvbmFyeSBtZW1iZXIuCisKKyAgQXJndW1lbnRzOgorICAgICAgZGljdGlvbmFyeTogQW4gSWRsRGljdGlvbmFyeSBvYmplY3QKKyAgICAgIGRpY3Rpb25hcnlfbWVtYmVyOiBBbiBJZGxEaWN0aW9uYXJ5TWVtYmVyIG9iamVjdC4KKyAgUmV0dXJuczoKKyAgICBkaWN0aW9uYXJ5X21lbWJlcl9jb250ZXh0IChkaWN0KQorICAiIiIKKyAgcmV0dXJuIHsKKyAgICAgICdpZGxfdHlwZV9vYmplY3QnOgorICAgICAgICAgIGRpY3Rpb25hcnlfbWVtYmVyLmlkbF90eXBlLAorICAgICAgJ25hbWUnOgorICAgICAgICAgIGNvbnZlcnRfdG9fY29iYWx0X25hbWUoZGljdGlvbmFyeV9tZW1iZXIubmFtZSksCisgICAgICAnaWRsX25hbWUnOgorICAgICAgICAgIGRpY3Rpb25hcnlfbWVtYmVyLm5hbWUsCisgICAgICAndHlwZSc6CisgICAgICAgICAgdHlwZWRfb2JqZWN0X3RvX2NvYmFsdF90eXBlKGRpY3Rpb25hcnksIGRpY3Rpb25hcnlfbWVtYmVyKSwKKyAgICAgICdhcmdfdHlwZSc6CisgICAgICAgICAgdHlwZWRfb2JqZWN0X3RvX2FyZ190eXBlKGRpY3Rpb25hcnksIGRpY3Rpb25hcnlfbWVtYmVyKSwKKyAgICAgICdkZWZhdWx0X3ZhbHVlJzoKKyAgICAgICAgICBpZGxfbGl0ZXJhbF90b19jb2JhbHRfbGl0ZXJhbChkaWN0aW9uYXJ5X21lbWJlci5pZGxfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5X21lbWJlci5kZWZhdWx0X3ZhbHVlKQorICAgICAgICAgIGlmIGRpY3Rpb25hcnlfbWVtYmVyLmRlZmF1bHRfdmFsdWUgZWxzZSBOb25lLAorICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDk3NWFhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgcmV0dXJuIGluZGV4IDwgaW1wbC0+bGVuZ3RoKCk7Ci19Ci0KLXZvaWQgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHVpbnQzMl90IGtOdW1JbmRleGVkUHJvcGVydGllcyA9IGltcGwtPmxlbmd0aCgpOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga051bUluZGV4ZWRQcm9wZXJ0aWVzOyArK2kpIHsKLSAgICBwcm9wZXJ0aWVzLT5hcHBlbmQoSU5UX1RPX0pTSUQoaSkpOwotICB9Ci19Ci0KLWJvb2wgR2V0SW5kZXhlZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICB1aW50MzJfdCBpbmRleDsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNJbmRleGVkR2V0dGVyKGluZGV4KSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKLSAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+QW5vbnltb3VzSW5kZXhlZFNldHRlcihpbmRleCwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBvYmplY3Rfb3BfcmVzdWx0LnN1Y2NlZWQoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotY2xhc3MgTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eSwKLSAgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcywKLSAgR2V0SW5kZXhlZFByb3BlcnR5LAotICBTZXRJbmRleGVkUHJvcGVydHksCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X2xlbmd0aCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAibGVuZ3RoIiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9sZW5ndGgsIE5VTEwgfSB9LAotICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGI1YzE3ZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA0OTYxNi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotYm9vbCBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbXBsLT5DYW5RdWVyeU5hbWVkUHJvcGVydHkocHJvcGVydHlfbmFtZSk7Ci19Ci0KLXZvaWQgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOwotICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOwotfQotCi1ib29sIEdldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+QW5vbnltb3VzTmFtZWRHZXR0ZXIocHJvcGVydHlfbmFtZSksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLQotfQotCi1ib29sIFNldE5hbWVkUHJvcGVydHkoCi0gIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlM6Ok9iamVjdE9wUmVzdWx0JiBvYmplY3Rfb3BfcmVzdWx0KSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkFub255bW91c05hbWVkU2V0dGVyKHByb3BlcnR5X25hbWUsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBvYmplY3Rfb3BfcmVzdWx0LnN1Y2NlZWQoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotY2xhc3MgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHksCi0gIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzLAotICBHZXROYW1lZFByb3BlcnR5LAotICBTZXROYW1lZFByb3BlcnR5LAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjhhYzk3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiOWNhNzIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU4NiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1ib29sIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOwotICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOwotfQotCi1ib29sIEdldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNOYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotCi19Ci0KLWJvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKLSAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Bbm9ueW1vdXNOYW1lZFNldHRlcihwcm9wZXJ0eV9uYW1lLCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgewotICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7Ci0gIH0KLX0KLQotYm9vbCBHZXRJbmRleGVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICB1aW50MzJfdCBpbmRleDsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNJbmRleGVkR2V0dGVyKGluZGV4KSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKLSAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICB1aW50MzJfdCBpbmRleDsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkFub255bW91c0luZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNsYXNzIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAotICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKLSAgR2V0TmFtZWRQcm9wZXJ0eSwKLSAgU2V0TmFtZWRQcm9wZXJ0eSwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eSwKLSAgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcywKLSAgR2V0SW5kZXhlZFByb3BlcnR5LAotICBTZXRJbmRleGVkUHJvcGVydHksCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGdldF9sZW5ndGgoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bGVuZ3RoKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgImxlbmd0aCIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfbGVuZ3RoLCBOVUxMIH0gfSwKLSAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQ3Yjg0YS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0FyYml0cmFyeUludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzMxZDRiMC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNBcmJpdHJhcnlJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNBcmJpdHJhcnlJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0FyYml0cmFyeUludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOwotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQXJiaXRyYXJ5SW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkFyYml0cmFyeUludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQXJiaXRyYXJ5SW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBDb25zdHJ1Y3RvciwKLX07Ci0KLWJvb2wgZ2V0X2FyYml0cmFyeVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFyYml0cmFyeUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFyYml0cmFyeUludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBcmJpdHJhcnlJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmFyYml0cmFyeV9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X2FyYml0cmFyeVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBcmJpdHJhcnlJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QXJiaXRyYXJ5SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2FyYml0cmFyeV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9hcmJpdHJhcnlGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQXJiaXRyYXJ5SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFyYml0cmFyeUludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5BcmJpdHJhcnlGdW5jdGlvbigpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAiYXJiaXRyYXJ5UHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2FyYml0cmFyeVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9hcmJpdHJhcnlQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoCi0gICAgICAiYXJiaXRyYXJ5RnVuY3Rpb24iLCBmY25fYXJiaXRyYXJ5RnVuY3Rpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQXJiaXRyYXJ5SW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsIGxlbmd0aF92YWx1ZSwKLSAgICAgIEpTUFJPUF9SRUFET05MWSwgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gbmV3X29iamVjdCA9Ci0gICAgICBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKLSAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKLSAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkYzdiMGQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0FyYml0cmFyeUludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNBcmJpdHJhcnlJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0FyYml0cmFyeUludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0FyYml0cmFyeUludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNBcmJpdHJhcnlJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Jhc2VJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQmFzZUludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRiOTgzZS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQmFzZUludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0Jhc2VJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0Jhc2VJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0Jhc2VJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNCYXNlSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNCYXNlSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNCYXNlSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOwotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQmFzZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkJhc2VJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQmFzZUludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQmFzZUludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgQ29uc3RydWN0b3IsCi19OwotCi1ib29sIGdldF9iYXNlQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJhc2VJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBCYXNlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJhc2VJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmJhc2VfYXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1ib29sIGZjbl9iYXNlT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxCYXNlSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQmFzZUludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxCYXNlSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPkJhc2VPcGVyYXRpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAiYmFzZUF0dHJpYnV0ZSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfYmFzZUF0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZOU1BFQygKLSAgICAgICJiYXNlT3BlcmF0aW9uIiwgZmNuX2Jhc2VPcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQmFzZUludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLCBsZW5ndGhfdmFsdWUsCi0gICAgICBKU1BST1BfUkVBRE9OTFksIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQmFzZUludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Jhc2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Jhc2VJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Jhc2VJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLWJvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotCi0gIHNjb3BlZF9yZWZwdHI8QmFzZUludGVyZmFjZT4gbmV3X29iamVjdCA9Ci0gICAgICBuZXcgQmFzZUludGVyZmFjZSgpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdChyZXN1bHRfdmFsdWUudG9PYmplY3QoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Jhc2VJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNCYXNlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4NDU0NzAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Jhc2VJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQmFzZUludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzQmFzZUludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iYXNlX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNCYXNlSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0Jhc2VJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRiYTI5ZjguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDUzNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotYm9vbCBnZXRfYm9vbGVhblByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmJvb2xlYW5fcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9ib29sZWFuUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9ib29sZWFuX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2Jvb2xlYW5Bcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Cb29sZWFuQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9ib29sZWFuUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Cb29sZWFuUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAiYm9vbGVhblByb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9ib29sZWFuUHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X2Jvb2xlYW5Qcm9wZXJ0eSwgTlVMTCB9IH0sCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoCi0gICAgICAiYm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uIiwgZmNuX2Jvb2xlYW5Bcmd1bWVudE9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiYm9vbGVhblJldHVybk9wZXJhdGlvbiIsIGZjbl9ib29sZWFuUmV0dXJuT3BlcmF0aW9uLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZkZjVhMTcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzIwMzZhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X2NhbGxiYWNrQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmNhbGxiYWNrX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X2NhbGxiYWNrQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlZvaWRGdW5jdGlvbiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9jYWxsYmFja19hdHRyaWJ1dGUodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9jYWxsYmFja19hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9udWxsYWJsZUNhbGxiYWNrQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlZvaWRGdW5jdGlvbiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfbnVsbGFibGVfY2FsbGJhY2tfYXR0cmlidXRlKHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3Rha2VzRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nID46OkNvbnZlcnNpb25UeXBlIGNiOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlRha2VzRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyhjYik7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl90YWtlc0Z1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMgPjo6Q29udmVyc2lvblR5cGUgY2I7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZjYik7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMoY2IpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyID46OkNvbnZlcnNpb25UeXBlIGNiOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyKGNiKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3Rha2VzRnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMgPjo6Q29udmVyc2lvblR5cGUgY2I7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZjYik7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VGFrZXNGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycyhjYik7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl90YWtlc1ZvaWRGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpWb2lkRnVuY3Rpb24gPjo6Q29udmVyc2lvblR5cGUgY2I7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZjYik7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VGFrZXNWb2lkRnVuY3Rpb24oY2IpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAiY2FsbGJhY2tBdHRyaWJ1dGUiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2NhbGxiYWNrQXR0cmlidXRlLCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9jYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAibnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoCi0gICAgICAidGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nIiwgZmNuX3Rha2VzRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZywgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAidGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMiLCBmY25fdGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyIiwgZmNuX3Rha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJ0YWtlc0Z1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzIiwgZmNuX3Rha2VzRnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInRha2VzVm9pZEZ1bmN0aW9uIiwgZmNuX3Rha2VzVm9pZEZ1bmN0aW9uLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MDEzNzVkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjYjcyYzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGdldF9jYWxsYmFja0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5jYWxsYmFja19hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9jYWxsYmFja0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxDYWxsYmFja0ludGVyZmFjZVRyYWl0czxTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfY2FsbGJhY2tfYXR0cmlidXRlKHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3JlZ2lzdGVyQ2FsbGJhY2soCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM8U2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlID4gPjo6Q29udmVyc2lvblR5cGUgY2FsbGJhY2tfaW50ZXJmYWNlOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2FsbGJhY2tfaW50ZXJmYWNlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5SZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrX2ludGVyZmFjZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9zb21lT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPlNvbWVPcGVyYXRpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImNhbGxiYWNrQXR0cmlidXRlIiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9jYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfY2FsbGJhY2tBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgInJlZ2lzdGVyQ2FsbGJhY2siLCBmY25fcmVnaXN0ZXJDYWxsYmFjaywgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAic29tZU9wZXJhdGlvbiIsIGZjbl9zb21lT3BlcmF0aW9uLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBlYTc3ZS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmE3Y2I4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDb25kaXRpb25hbEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDYwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi0KLSNpbmNsdWRlICJNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uZGl0aW9uYWxJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNDb25kaXRpb25hbEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNDb25kaXRpb25hbEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQ29uZGl0aW9uYWxJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQ29uZGl0aW9uYWxJbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkNvbmRpdGlvbmFsSW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQotYm9vbCBnZXRfZW5hYmxlZEF0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5lbmFibGVkX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X2VuYWJsZWRBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9lbmFibGVkX2F0dHJpYnV0ZSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0jZW5kaWYgIC8vIEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQotYm9vbCBnZXRfZGlzYWJsZWRBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDb25kaXRpb25hbEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25kaXRpb25hbEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+ZGlzYWJsZWRfYXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfZGlzYWJsZWRBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9kaXNhYmxlZF9hdHRyaWJ1dGUodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotI2VuZGlmICAvLyBOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKLSNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKLWJvb2wgZmNuX2Rpc2FibGVkT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPkRpc2FibGVkT3BlcmF0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0jZW5kaWYgIC8vIE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQotI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQotYm9vbCBmY25fZW5hYmxlZE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDb25kaXRpb25hbEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25kaXRpb25hbEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5FbmFibGVkT3BlcmF0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0jZW5kaWYgIC8vIEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0jaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAiZW5hYmxlZEF0dHJpYnV0ZSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfZW5hYmxlZEF0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfZW5hYmxlZEF0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gIH0sCi0jZW5kaWYgIC8vIEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImRpc2FibGVkQXR0cmlidXRlIiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9kaXNhYmxlZEF0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfZGlzYWJsZWRBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICB9LAotI2VuZGlmICAvLyBOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0KLSNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKLQotICBKU19GTlNQRUMoCi0gICAgICAiZGlzYWJsZWRPcGVyYXRpb24iLCBmY25fZGlzYWJsZWRPcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSNlbmRpZiAgLy8gTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCi0KLSNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKLQotICBKU19GTlNQRUMoCi0gICAgICAiZW5hYmxlZE9wZXJhdGlvbiIsIGZjbl9lbmFibGVkT3BlcmF0aW9uLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0jZW5kaWYgIC8vIEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJDb25kaXRpb25hbEludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLSNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ29uZGl0aW9uYWxJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTU0NzJiMi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ29uZGl0aW9uYWxJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlX2gKLQotI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNDb25kaXRpb25hbEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotCi0jZW5kaWYgIC8vIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0YW50c0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDb25zdGFudHNJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM4MzZiNmMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0YW50c0ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0NvbnN0YW50c0ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0YW50c0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RhbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0NvbnN0YW50c0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ29uc3RhbnRzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNDb25zdGFudHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0NvbnN0YW50c0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBnZXRfSU5URUdFUl9DT05TVEFOVCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgQ09NUElMRV9BU1NFUlQoQ29uc3RhbnRzSW50ZXJmYWNlOjprSW50ZWdlckNvbnN0YW50ID09IDUsCi0gICAgICAgICAgICAgICAgIFZhbHVlRm9yQ29uc3RhbnRzSW50ZXJmYWNlX2tJbnRlZ2VyQ29uc3RhbnREb2VzTm90TWF0Y2hJREwpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgNSwgJnJlc3VsdF92YWx1ZSk7Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfRE9VQkxFX0NPTlNUQU5UKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBEQ0hFQ0tfRVEoMi43MTgsIENvbnN0YW50c0ludGVyZmFjZTo6a0RvdWJsZUNvbnN0YW50KSA8PAotICAgICAgIlRoZSB2YWx1ZSBmb3IgQ29uc3RhbnRzSW50ZXJmYWNlOjprRG91YmxlQ29uc3RhbnQgZG9lcyBub3QgbWF0Y2ggIgotICAgICAgInRoZSB2YWx1ZSBpbiB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb24uIjsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIDIuNzE4LCAmcmVzdWx0X3ZhbHVlKTsKLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNDb25zdGFudHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJDb25zdGFudHNJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiQ29uc3RhbnRzSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJDb25zdGFudHNJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgewotICAgICAgIklOVEVHRVJfQ09OU1RBTlQiLAotICAgICAgSlNQUk9QX1BFUk1BTkVOVCB8IEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgeyB7ICZnZXRfSU5URUdFUl9DT05TVEFOVCwgTlVMTCB9IH0sCi0gICAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpCi0gIH0sCi0gIHsKLSAgICAgICJET1VCTEVfQ09OU1RBTlQiLAotICAgICAgSlNQUk9QX1BFUk1BTkVOVCB8IEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgeyB7ICZnZXRfRE9VQkxFX0NPTlNUQU5ULCBOVUxMIH0gfSwKLSAgICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCkKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsKLSAgICAiSU5URUdFUl9DT05TVEFOVCIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfSU5URUdFUl9DT05TVEFOVCwgTlVMTCB9IH0sCi0gICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKLSAgfSwKLQotICB7Ci0gICAgIkRPVUJMRV9DT05TVEFOVCIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfRE9VQkxFX0NPTlNUQU5ULCBOVUxMIH0gfSwKLSAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAotICB9LAotCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkNvbnN0YW50c0ludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25zdGFudHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNDb25zdGFudHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NvbnN0YW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ29uc3RhbnRzSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ29uc3RhbnRzSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5YjM1M2IuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0YW50c0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNDb25zdGFudHNJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0NvbnN0YW50c0ludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0NvbnN0YW50c0ludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNDb25zdGFudHNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YWNlMWFlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Ci1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkNvbnN0cnVjdG9ySW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkNvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJDb25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgQ29uc3RydWN0b3IsCi19OwotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkNvbnN0cnVjdG9ySW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsIGxlbmd0aF92YWx1ZSwKLSAgICAgIEpTUFJPUF9SRUFET05MWSwgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLWJvb2wgQ29uc3RydWN0b3IxKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPENvbnN0cnVjdG9ySW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KLSAgICAgIG5ldyBDb25zdHJ1Y3RvckludGVyZmFjZSgpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdChyZXN1bHRfdmFsdWUudG9PYmplY3QoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbnN0cnVjdG9yMigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8Q29uc3RydWN0b3JJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IENvbnN0cnVjdG9ySW50ZXJmYWNlKGFyZyk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKLSAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKLSAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIHN3aXRjaChhcmdjKSB7Ci0gICAgY2FzZSgwKTogewotICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgotICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gICAgICBpZiAodHJ1ZSkgewotICAgICAgICByZXR1cm4gQ29uc3RydWN0b3IxKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UoMSk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCi0gIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCi0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvckludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwYzE5NTguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZDJmZmQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkNvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkNvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgQ29uc3RydWN0b3IsCi19OwotCi1ib29sIGdldF9sb25nQXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmxvbmdfYXJnKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1ib29sIGdldF9ib29sZWFuQXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmJvb2xlYW5fYXJnKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1ib29sIGdldF9zdHJpbmdBcmcoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+c3RyaW5nX2FyZygpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQotICAgICJsb25nQXJnIiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9sb25nQXJnLCBOVUxMIH0gfSwKLSAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAotICB9LAotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAiYm9vbGVhbkFyZyIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfYm9vbGVhbkFyZywgTlVMTCB9IH0sCi0gICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgInN0cmluZ0FyZyIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfc3RyaW5nQXJnLCBOVUxMIH0gfSwKLSAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDIpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsIGxlbmd0aF92YWx1ZSwKLSAgICAgIEpTUFJPUF9SRUFET05MWSwgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0gIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotICAvLyBPcHRpb25hbCBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIGRlZmF1bHRfYXJnID0KLSAgICAgICJkZWZhdWx0IjsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCi0gICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMik7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHNpemVfdCBudW1fc2V0X2FyZ3VtZW50cyA9IDM7Ci0gIGlmIChhcmdzLmxlbmd0aCgpID4gMikgewotICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTAoCi0gICAgICAgIGNvbnRleHQsIGFyZ3NbMl0pOwotICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICZkZWZhdWx0X2FyZyk7Ci0gICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBzY29wZWRfcmVmcHRyPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4gbmV3X29iamVjdCA9Ci0gICAgICBuZXcgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlKGFyZzEsIGFyZzIsIGRlZmF1bHRfYXJnKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QocmVzdWx0X3ZhbHVlLnRvT2JqZWN0KCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q3ZjNiYi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcyNGE3YjMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MzYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RE9NU3RyaW5nVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiRE9NU3RyaW5nVGVzdEludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiRE9NU3RyaW5nVGVzdEludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X3Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnByb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfcHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfcmVhZE9ubHlQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5yZWFkX29ubHlfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWJvb2wgZ2V0X3JlYWRPbmx5VG9rZW5Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5yZWFkX29ubHlfdG9rZW5fcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWJvb2wgZ2V0X251bGxJc0VtcHR5UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bnVsbF9pc19lbXB0eV9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X251bGxJc0VtcHR5UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfbnVsbF9pc19lbXB0eV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGdldF91bmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+dW5kZWZpbmVkX2lzX2VtcHR5X3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfdW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5kZWZpbmVkX2lzX2VtcHR5X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX3VuZGVmaW5lZF9pc19lbXB0eV9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSB8IGtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZyksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX3VuZGVmaW5lZF9pc19lbXB0eV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJwcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfcHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X3Byb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgInJlYWRPbmx5UHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X3JlYWRPbmx5UHJvcGVydHksIE5VTEwgfSB9LAotICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCi0gIH0sCi0gIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQotICAgICJyZWFkT25seVRva2VuUHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X3JlYWRPbmx5VG9rZW5Qcm9wZXJ0eSwgTlVMTCB9IH0sCi0gICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJudWxsSXNFbXB0eVByb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9udWxsSXNFbXB0eVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9udWxsSXNFbXB0eVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJ1bmRlZmluZWRJc0VtcHR5UHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X3VuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfdW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJudWxsYWJsZVVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfbnVsbGFibGVVbmRlZmluZWRJc0VtcHR5UHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YTdlMmM1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2E3MDQ5NC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDgzNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1ib29sIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbXBsLT5DYW5RdWVyeU5hbWVkUHJvcGVydHkocHJvcGVydHlfbmFtZSk7Ci19Ci0KLXZvaWQgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKLSAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKLX0KLQotYm9vbCBHZXROYW1lZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNOYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotCi19Ci0KLWJvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKLSAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkFub255bW91c05hbWVkU2V0dGVyKHByb3BlcnR5X25hbWUsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBvYmplY3Rfb3BfcmVzdWx0LnN1Y2NlZWQoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICByZXR1cm4gaW5kZXggPCBpbXBsLT5sZW5ndGgoKTsKLX0KLQotdm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgewotICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7Ci0gIH0KLX0KLQotYm9vbCBHZXRJbmRleGVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkRlcml2ZWRJbmRleGVkR2V0dGVyKGluZGV4KSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKLSAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+RGVyaXZlZEluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNsYXNzIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAotICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKLSAgR2V0TmFtZWRQcm9wZXJ0eSwKLSAgU2V0TmFtZWRQcm9wZXJ0eSwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCi0gIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCi0gIEdldEluZGV4ZWRQcm9wZXJ0eSwKLSAgU2V0SW5kZXhlZFByb3BlcnR5LAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGdldF9sZW5ndGgoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bGVuZ3RoKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1ib29sIGdldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnByb3BlcnR5X29uX2Rlcml2ZWRfY2xhc3MoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfcHJvcGVydHlfb25fZGVyaXZlZF9jbGFzcyh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9kZXJpdmVkSW5kZXhlZEdldHRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBpbmRleDsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+RGVyaXZlZEluZGV4ZWRHZXR0ZXIoaW5kZXgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2Rlcml2ZWRJbmRleGVkU2V0dGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OwotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCi0gICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkRlcml2ZWRJbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9vcGVyYXRpb25PbkRlcml2ZWRDbGFzcygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5PcGVyYXRpb25PbkRlcml2ZWRDbGFzcygpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQotICAgICJsZW5ndGgiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2xlbmd0aCwgTlVMTCB9IH0sCi0gICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJwcm9wZXJ0eU9uRGVyaXZlZENsYXNzIiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzLCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzLCBOVUxMIH0gfSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZOU1BFQygKLSAgICAgICJkZXJpdmVkSW5kZXhlZEdldHRlciIsIGZjbl9kZXJpdmVkSW5kZXhlZEdldHRlciwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiZGVyaXZlZEluZGV4ZWRTZXR0ZXIiLCBmY25fZGVyaXZlZEluZGV4ZWRTZXR0ZXIsIE5VTEwsCi0gICAgICAyLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgIm9wZXJhdGlvbk9uRGVyaXZlZENsYXNzIiwgZmNuX29wZXJhdGlvbk9uRGVyaXZlZENsYXNzLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmN2MxZWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNEZXJpdmVkSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Rlcml2ZWRJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwOTVlMDcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Rlcml2ZWRJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNEZXJpdmVkSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGVyaXZlZEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGVyaXZlZEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNEZXJpdmVkSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNEZXJpdmVkSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJEZXJpdmVkSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkRlcml2ZWRJbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkRlcml2ZWRJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIENvbnN0cnVjdG9yLAotfTsKLQotYm9vbCBnZXRfZGVyaXZlZEF0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5kZXJpdmVkX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotYm9vbCBmY25fZGVyaXZlZE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5EZXJpdmVkT3BlcmF0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgImRlcml2ZWRBdHRyaWJ1dGUiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2Rlcml2ZWRBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoCi0gICAgICAiZGVyaXZlZE9wZXJhdGlvbiIsIGZjbl9kZXJpdmVkT3BlcmF0aW9uLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkRlcml2ZWRJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKLSAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgotICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOwotICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAotICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNEZXJpdmVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNEZXJpdmVkSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNEZXJpdmVkSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPERlcml2ZWRJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IERlcml2ZWRJbnRlcmZhY2UoKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QocmVzdWx0X3ZhbHVlLnRvT2JqZWN0KCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNEZXJpdmVkSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRGVyaXZlZEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NmFkMDRkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNEZXJpdmVkSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0Rlcml2ZWRJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiTW96anNCYXNlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRGVyaXZlZEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNEZXJpdmVkSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNEaXNhYmxlZEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNEaXNhYmxlZEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmE3Yjg0OS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRGlzYWJsZWRJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotCi0jaW5jbHVkZSAiTW96anNEaXNhYmxlZEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRpc2FibGVkSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEaXNhYmxlZEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNEaXNhYmxlZEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNEaXNhYmxlZEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Rpc2FibGVkSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNEaXNhYmxlZEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkRpc2FibGVkSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkRpc2FibGVkSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJEaXNhYmxlZEludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X2Rpc2FibGVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGlzYWJsZWRJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEaXNhYmxlZEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEaXNhYmxlZEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+ZGlzYWJsZWRfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9kaXNhYmxlZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEaXNhYmxlZEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERpc2FibGVkSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERpc2FibGVkSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfZGlzYWJsZWRfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fZGlzYWJsZWRGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGlzYWJsZWRJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEaXNhYmxlZEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEaXNhYmxlZEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5EaXNhYmxlZEZ1bmN0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJkaXNhYmxlZFByb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9kaXNhYmxlZFByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9kaXNhYmxlZFByb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZOU1BFQygKLSAgICAgICJkaXNhYmxlZEZ1bmN0aW9uIiwgZmNuX2Rpc2FibGVkRnVuY3Rpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiRGlzYWJsZWRJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNEaXNhYmxlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0jZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNEaXNhYmxlZEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Rpc2FibGVkSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAxZDQ4YzguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0Rpc2FibGVkSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNEaXNhYmxlZEludGVyZmFjZV9oCi0KLSNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaXNhYmxlZF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRGlzYWJsZWRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLQotI2VuZGlmICAvLyBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNFbnVtZXJhdGlvbkludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNFbnVtZXJhdGlvbkludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlMDJlZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRW51bWVyYXRpb25JbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNFbnVtZXJhdGlvbkludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkVudW1lcmF0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFbnVtZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotLy8gRGVjbGFyZSBhbmQgZGVmaW5lIHRoZXNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZSB0aGF0IHRoZSBvdGhlciBvdmVybG9hZHMKLS8vIHdlcmUgYnJvdWdodCBpbnRvIHdpdGggdGhlIHVzaW5nIGRlY2xhcmF0aW9uLgotdm9pZCBUb0pTVmFsdWUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSBpbl9lbnVtLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKTsKLXZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCi0gICAgICAgICAgICAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzLCBFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbkludGVyZmFjZTo6VGVzdEVudW0qIG91dF9lbnVtKTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzRW51bWVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNFbnVtZXJhdGlvbkludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiRW51bWVyYXRpb25JbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiRW51bWVyYXRpb25JbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkVudW1lcmF0aW9uSW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBDb25zdHJ1Y3RvciwKLX07Ci0KLWJvb2wgZ2V0X2VudW1Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFbnVtZXJhdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEVudW1lcmF0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEVudW1lcmF0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5lbnVtX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfZW51bVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFbnVtZXJhdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEVudW1lcmF0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEVudW1lcmF0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9lbnVtX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImVudW1Qcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfZW51bVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9lbnVtUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiRW51bWVyYXRpb25JbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKLSAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgotICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOwotICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAotICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxFbnVtZXJhdGlvbkludGVyZmFjZT4gbmV3X29iamVjdCA9Ci0gICAgICBuZXcgRW51bWVyYXRpb25JbnRlcmZhY2UoKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QocmVzdWx0X3ZhbHVlLnRvT2JqZWN0KCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotbmFtZXNwYWNlIHsKLQotaW5saW5lIHZvaWQgVG9KU1ZhbHVlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBFbnVtZXJhdGlvbkludGVyZmFjZTo6VGVzdEVudW0gaW5fZW51bSwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgewotCi0gIHN3aXRjaCAoaW5fZW51bSkgewotICAgIGNhc2UgRW51bWVyYXRpb25JbnRlcmZhY2U6OmtBbHBoYToKLSAgICAgIFRvSlNWYWx1ZShjb250ZXh0LCBzdGQ6OnN0cmluZygiYWxwaGEiKSwgb3V0X3ZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIEVudW1lcmF0aW9uSW50ZXJmYWNlOjprQmV0YToKLSAgICAgIFRvSlNWYWx1ZShjb250ZXh0LCBzdGQ6OnN0cmluZygiYmV0YSIpLCBvdXRfdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgRW51bWVyYXRpb25JbnRlcmZhY2U6OmtHYW1tYToKLSAgICAgIFRvSlNWYWx1ZShjb250ZXh0LCBzdGQ6OnN0cmluZygiZ2FtbWEiKSwgb3V0X3ZhbHVlKTsKLSAgICAgIHJldHVybjsKLSAgICBkZWZhdWx0OgotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgb3V0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCi0gICAgICAgICAgICAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzLCBFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbkludGVyZmFjZTo6VGVzdEVudW0qIG91dF9lbnVtKSB7Ci0gIERDSEVDS19FUSgwLCBjb252ZXJzaW9uX2ZsYWdzKSA8PCAiVW5leHBlY3RlZCBjb252ZXJzaW9uIGZsYWdzLiI7Ci0gIC8vIEpTVmFsdWUgLT4gSURMIGVudW0gYWxnb3JpdGhtIGRlc2NyaWJlZCBoZXJlOgotICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2VzLWVudW1lcmF0aW9uCi0gIC8vIDEuIExldCBTIGJlIHRoZSByZXN1bHQgb2YgY2FsbGluZyBUb1N0cmluZyhWKS4KLSAgSlM6OlJvb3RlZFN0cmluZyByb290ZWRfc3RyaW5nKGNvbnRleHQsIEpTOjpUb1N0cmluZyhjb250ZXh0LCB2YWx1ZSkpOwotCi0gIGJvb2wgbWF0Y2ggPSBmYWxzZTsKLS8vIDMuIFJldHVybiB0aGUgZW51bWVyYXRpb24gdmFsdWUgb2YgdHlwZSBFIHRoYXQgaXMgZXF1YWwgdG8gUy4KLWlmIChKU19TdHJpbmdFcXVhbHNBc2NpaSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9zdHJpbmcsICJhbHBoYSIsICZtYXRjaCkKLSAgICAgICYmIG1hdGNoKSB7Ci0gICAgKm91dF9lbnVtID0gRW51bWVyYXRpb25JbnRlcmZhY2U6OmtBbHBoYTsKLSAgfSBlbHNlIGlmIChKU19TdHJpbmdFcXVhbHNBc2NpaSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9zdHJpbmcsICJiZXRhIiwgJm1hdGNoKQotICAgICAgJiYgbWF0Y2gpIHsKLSAgICAqb3V0X2VudW0gPSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0JldGE7Ci0gIH0gZWxzZSBpZiAoSlNfU3RyaW5nRXF1YWxzQXNjaWkoCi0gICAgICBjb250ZXh0LCByb290ZWRfc3RyaW5nLCAiZ2FtbWEiLCAmbWF0Y2gpCi0gICAgICAmJiBtYXRjaCkgewotICAgICpvdXRfZW51bSA9IEVudW1lcmF0aW9uSW50ZXJmYWNlOjprR2FtbWE7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gMi4gSWYgUyBpcyBub3Qgb25lIG9mIEUncyBlbnVtZXJhdGlvbiB2YWx1ZXMsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCi0gICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oY29iYWx0OjpzY3JpcHQ6OmtDb252ZXJ0VG9FbnVtRmFpbGVkKTsKLSAgICByZXR1cm47Ci0gIH0KLX0KLX0gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRW51bWVyYXRpb25JbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTRmZTIzMi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRW51bWVyYXRpb25JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNFbnVtZXJhdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTBjNDcwMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDM2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2V4bi5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGdldF9lcnJvcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5lcnJvcigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotYm9vbCBnZXRfbWVzc2FnZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5tZXNzYWdlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgImVycm9yIiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9lcnJvciwgTlVMTCB9IH0sCi0gICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgIm1lc3NhZ2UiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X21lc3NhZ2UsIE5VTEwgfSB9LAotICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gR2V0IEVycm9yIHByb3RvdHlwZS4KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKGNvbnRleHQpOwotICBib29sIHN1Y2Nlc3NfY2hlY2sgPSBKU19HZXRDbGFzc1Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIGpzOjpHZXRFeGNlcHRpb25Qcm90b0tleShKU0VYTl9FUlIpLCAmcGFyZW50X3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzX2NoZWNrKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2IxZTNkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNFeGNlcHRpb25zSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZmZhZTdiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNFeGNlcHRpb25zSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzRXhjZXB0aW9uc0ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbnNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Ci1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiRXhjZXB0aW9uc0ludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJFeGNlcHRpb25zSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJFeGNlcHRpb25zSW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBDb25zdHJ1Y3RvciwKLX07Ci0KLWJvb2wgZ2V0X2F0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25zSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRXhjZXB0aW9uc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeGNlcHRpb25zSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5hdHRyaWJ1dGVfdGhyb3dzX2V4Y2VwdGlvbigmZXhjZXB0aW9uX3N0YXRlKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9hdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFeGNlcHRpb25zSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9hdHRyaWJ1dGVfdGhyb3dzX2V4Y2VwdGlvbih2YWx1ZSwgJmV4Y2VwdGlvbl9zdGF0ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9mdW5jdGlvblRocm93c0V4Y2VwdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RXhjZXB0aW9uc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEV4Y2VwdGlvbnNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uc0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5GdW5jdGlvblRocm93c0V4Y2VwdGlvbigmZXhjZXB0aW9uX3N0YXRlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImF0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbiIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfYXR0cmlidXRlVGhyb3dzRXhjZXB0aW9uLCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9hdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24sIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgImZ1bmN0aW9uVGhyb3dzRXhjZXB0aW9uIiwgZmNuX2Z1bmN0aW9uVGhyb3dzRXhjZXB0aW9uLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkV4Y2VwdGlvbnNJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKLSAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgotICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOwotICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAotICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPEV4Y2VwdGlvbnNJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IEV4Y2VwdGlvbnNJbnRlcmZhY2UoJmV4Y2VwdGlvbl9zdGF0ZSk7Ci0gIC8vIEluIGNhc2UgdGhhdCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gY29uc3RydWN0b3IuCi0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKLSAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKLSAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGU0NjdmZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQ3YjBkNi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzk2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGZjbl9jYWxsV2l0aFNldHRpbmdzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlPigpLmdldCgpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBjYWxsd2l0aF9nbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLQotICBpbXBsLT5DYWxsV2l0aFNldHRpbmdzKGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudC0+R2V0RW52aXJvbm1lbnRTZXR0aW5ncygpKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgImNhbGxXaXRoU2V0dGluZ3MiLCBmY25fY2FsbFdpdGhTZXR0aW5ncywgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTM2YTkxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2M2RhNzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotV3JhcHBhYmxlKiBHZXRPcGFxdWVSb290RnJvbVdyYXBwYWJsZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKj4od3JhcHBhYmxlLmdldCgpKTsKLSAgcmV0dXJuIGltcGwtPkdldEhlYWQoKTsKLX0KLQotY2xhc3MgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Ci1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIENvbnN0cnVjdG9yLAotfTsKLQotYm9vbCBnZXRfcHJldmlvdXMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+cHJldmlvdXMoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9wcmV2aW91cygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3ByZXZpb3VzKHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X25leHQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bmV4dCgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X25leHQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9uZXh0KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgInByZXZpb3VzIiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9wcmV2aW91cywgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfcHJldmlvdXMsIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgIm5leHQiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X25leHQsIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X25leHQsIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsIGxlbmd0aF92YWx1ZSwKLSAgICAgIEpTUFJPUF9SRUFET05MWSwgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkdldE9wYXF1ZVJvb3RGdW5jdGlvbiBnZXRfcm9vdDsKLSAgV3JhcHBlclByaXZhdGU6OkdldFJlYWNoYWJsZVdyYXBwYWJsZXNGdW5jdGlvbiBnZXRfcmVhY2hhYmxlX3dyYXBwYWJsZXM7Ci0gIGdldF9yb290ID0gYmFzZTo6QmluZCgmR2V0T3BhcXVlUm9vdEZyb21XcmFwcGFibGUpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoCi0gICAgICBjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlLCBnZXRfcm9vdCwgZ2V0X3JlYWNoYWJsZV93cmFwcGFibGVzKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSgpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdChyZXN1bHRfdmFsdWUudG9PYmplY3QoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYzMyOTRlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDFhN2YzZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM5OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHZXRPcGFxdWVSb290SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1XcmFwcGFibGUqIEdldE9wYXF1ZVJvb3RGcm9tV3JhcHBhYmxlKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8R2V0T3BhcXVlUm9vdEludGVyZmFjZSo+KHdyYXBwYWJsZS5nZXQoKSk7Ci0gIHJldHVybiBpbXBsLT5nZXRfb3BhcXVlX3Jvb3RfZnVuY3Rpb25fbmFtZSgpOwotfQotCi12b2lkIEdldFJlYWNoYWJsZVdyYXBwYWJsZXMoY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUsCi0gICAgV3JhcHBlclByaXZhdGU6OldyYXBwYWJsZVZlY3RvciogcmVhY2hhYmxlKSB7Ci0gIERDSEVDSyhyZWFjaGFibGUpOwotICBHZXRPcGFxdWVSb290SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqPih3cmFwcGFibGUuZ2V0KCkpOwotICBXcmFwcGFibGUqIHJlYWNoYWJsZV8wID0gaW1wbC0+YWRkX29wYXF1ZV9yb290X2Z1bmN0aW9uX25hbWUoKTsKLSAgaWYgKHJlYWNoYWJsZV8wKSB7Ci0gICAgcmVhY2hhYmxlLT5wdXNoX2JhY2socmVhY2hhYmxlXzApOwotICB9Ci19Ci0KLWNsYXNzIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Ci1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiR2V0T3BhcXVlUm9vdEludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJHZXRPcGFxdWVSb290SW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJHZXRPcGFxdWVSb290SW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBDb25zdHJ1Y3RvciwKLX07Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiR2V0T3BhcXVlUm9vdEludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLCBsZW5ndGhfdmFsdWUsCi0gICAgICBKU1BST1BfUkVBRE9OTFksIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6R2V0T3BhcXVlUm9vdEZ1bmN0aW9uIGdldF9yb290OwotICBXcmFwcGVyUHJpdmF0ZTo6R2V0UmVhY2hhYmxlV3JhcHBhYmxlc0Z1bmN0aW9uIGdldF9yZWFjaGFibGVfd3JhcHBhYmxlczsKLSAgZ2V0X3Jvb3QgPSBiYXNlOjpCaW5kKCZHZXRPcGFxdWVSb290RnJvbVdyYXBwYWJsZSk7Ci0gIGdldF9yZWFjaGFibGVfd3JhcHBhYmxlcyA9IGJhc2U6OkJpbmQoJkdldFJlYWNoYWJsZVdyYXBwYWJsZXMpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoCi0gICAgICBjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlLCBnZXRfcm9vdCwgZ2V0X3JlYWNoYWJsZV93cmFwcGFibGVzKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxHZXRPcGFxdWVSb290SW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KLSAgICAgIG5ldyBHZXRPcGFxdWVSb290SW50ZXJmYWNlKCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKLSAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKLSAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU1NTQ2ZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc3OTE2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHbG9iYWxJbnRlcmZhY2VQYXJlbnQ7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50SGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkdsb2JhbEludGVyZmFjZVBhcmVudCIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJHbG9iYWxJbnRlcmZhY2VQYXJlbnRQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkdsb2JhbEludGVyZmFjZVBhcmVudENvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZmNuX3BhcmVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2xvYmFsSW50ZXJmYWNlUGFyZW50PigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgR2xvYmFsSW50ZXJmYWNlUGFyZW50KiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdsb2JhbEludGVyZmFjZVBhcmVudD4oKS5nZXQoKTsKLQotICBpbXBsLT5QYXJlbnRPcGVyYXRpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgInBhcmVudE9wZXJhdGlvbiIsIGZjbl9wYXJlbnRPcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiR2xvYmFsSW50ZXJmYWNlUGFyZW50IjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjIxNTI5Yi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50LmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudF9oCi0jZGVmaW5lIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50X2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudCB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzSW5kZXhlZEdldHRlckludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODU5YTY2Mi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzSW5kZXhlZEdldHRlckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDY5NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1ib29sIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCB1aW50MzJfdCBrTnVtSW5kZXhlZFByb3BlcnRpZXMgPSBpbXBsLT5sZW5ndGgoKTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtOdW1JbmRleGVkUHJvcGVydGllczsgKytpKSB7Ci0gICAgcHJvcGVydGllcy0+YXBwZW5kKElOVF9UT19KU0lEKGkpKTsKLSAgfQotfQotCi1ib29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgdWludDMyX3QgaW5kZXg7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+SW5kZXhlZEdldHRlcihpbmRleCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBTZXRJbmRleGVkUHJvcGVydHkoCi0gIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlM6Ok9iamVjdE9wUmVzdWx0JiBvYmplY3Rfb3BfcmVzdWx0KSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICB1aW50MzJfdCBpbmRleDsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgRGVsZXRlSW5kZXhlZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIHVpbnQzMl90IGluZGV4KSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPkluZGV4ZWREZWxldGVyKGluZGV4KTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWNsYXNzIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCi0gIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCi0gIEdldEluZGV4ZWRQcm9wZXJ0eSwKLSAgU2V0SW5kZXhlZFByb3BlcnR5LAotICBEZWxldGVJbmRleGVkUHJvcGVydHksCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiSW5kZXhlZEdldHRlckludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiSW5kZXhlZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X2xlbmd0aCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWJvb2wgZmNuX2luZGV4ZWREZWxldGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkluZGV4ZWREZWxldGVyKGluZGV4KTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2luZGV4ZWRHZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkluZGV4ZWRHZXR0ZXIoaW5kZXgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2luZGV4ZWRTZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7Ci0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+SW5kZXhlZFNldHRlcihpbmRleCwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQotICAgICJsZW5ndGgiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2xlbmd0aCwgTlVMTCB9IH0sCi0gICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZOU1BFQygKLSAgICAgICJpbmRleGVkRGVsZXRlciIsIGZjbl9pbmRleGVkRGVsZXRlciwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiaW5kZXhlZEdldHRlciIsIGZjbl9pbmRleGVkR2V0dGVyLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJpbmRleGVkU2V0dGVyIiwgZmNuX2luZGV4ZWRTZXR0ZXIsIE5VTEwsCi0gICAgICAyLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiSW5kZXhlZEdldHRlckludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE3YThlMmIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxNmZhZjguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIkludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc1Byb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0NvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X3N1cHBvcnRlZEF0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5zdXBwb3J0ZWRfYXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgInN1cHBvcnRlZEF0dHJpYnV0ZSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfc3VwcG9ydGVkQXR0cmlidXRlLCBOVUxMIH0gfSwKLSAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiM2M1OWIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc19oCi0jZGVmaW5lIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc19oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc19oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTY1MDc0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzc2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Ci1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBDb25zdHJ1Y3RvciwKLX07Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiU29tZU5hbWVkQ29uc3RydWN0b3IiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKLSAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgotICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOwotICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAotICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPE5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IE5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UoKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QocmVzdWx0X3ZhbHVlLnRvT2JqZWN0KCkpOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDg4NTM0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOGRlY2YuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjU5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKLSAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKLX0KLQotYm9vbCBHZXROYW1lZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPk5hbWVkR2V0dGVyKHByb3BlcnR5X25hbWUpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci0KLX0KLQotYm9vbCBTZXROYW1lZFByb3BlcnR5KAotICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTOjpPYmplY3RPcFJlc3VsdCYgb2JqZWN0X29wX3Jlc3VsdCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5OYW1lZFNldHRlcihwcm9wZXJ0eV9uYW1lLCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgRGVsZXRlTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+TmFtZWREZWxldGVyKHByb3BlcnR5X25hbWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotY2xhc3MgTW96anNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHksCi0gIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzLAotICBHZXROYW1lZFByb3BlcnR5LAotICBTZXROYW1lZFByb3BlcnR5LAotICBEZWxldGVOYW1lZFByb3BlcnR5LAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk5hbWVkR2V0dGVySW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk5hbWVkR2V0dGVySW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOYW1lZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZmNuX25hbWVkRGVsZXRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+TmFtZWREZWxldGVyKG5hbWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fbmFtZWRHZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgbmFtZTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJm5hbWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5OYW1lZEdldHRlcihuYW1lKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9uYW1lZFNldHRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+TmFtZWRTZXR0ZXIobmFtZSwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoCi0gICAgICAibmFtZWREZWxldGVyIiwgZmNuX25hbWVkRGVsZXRlciwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAibmFtZWRHZXR0ZXIiLCBmY25fbmFtZWRHZXR0ZXIsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgIm5hbWVkU2V0dGVyIiwgZmNuX25hbWVkU2V0dGVyLCBOVUxMLAotICAgICAgMiwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIk5hbWVkR2V0dGVySW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMxZjIzNC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkNTY5NDEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1ib29sIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOwotICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOwotfQotCi1ib29sIEdldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5OYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotCi19Ci0KLWJvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKLSAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5OYW1lZFNldHRlcihwcm9wZXJ0eV9uYW1lLCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgewotICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7Ci0gIH0KLX0KLQotYm9vbCBHZXRJbmRleGVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICB1aW50MzJfdCBpbmRleDsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5JbmRleGVkR2V0dGVyKGluZGV4KSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKLSAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICB1aW50MzJfdCBpbmRleDsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWNsYXNzIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAotICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKLSAgR2V0TmFtZWRQcm9wZXJ0eSwKLSAgU2V0TmFtZWRQcm9wZXJ0eSwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eSwKLSAgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcywKLSAgR2V0SW5kZXhlZFByb3BlcnR5LAotICBTZXRJbmRleGVkUHJvcGVydHksCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGdldF9sZW5ndGgoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bGVuZ3RoKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1ib29sIGdldF9wcm9wZXJ0eU9uQmFzZUNsYXNzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnByb3BlcnR5X29uX2Jhc2VfY2xhc3MoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9wcm9wZXJ0eU9uQmFzZUNsYXNzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfcHJvcGVydHlfb25fYmFzZV9jbGFzcyh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9pbmRleGVkR2V0dGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5JbmRleGVkR2V0dGVyKGluZGV4KSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9pbmRleGVkU2V0dGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OwotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCi0gICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX25hbWVkR2V0dGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIG5hbWU7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZuYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TmFtZWRHZXR0ZXIobmFtZSksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fbmFtZWRTZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgbmFtZTsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJm5hbWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCi0gICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk5hbWVkU2V0dGVyKG5hbWUsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX29wZXJhdGlvbk9uQmFzZUNsYXNzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPk9wZXJhdGlvbk9uQmFzZUNsYXNzKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgImxlbmd0aCIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfbGVuZ3RoLCBOVUxMIH0gfSwKLSAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgInByb3BlcnR5T25CYXNlQ2xhc3MiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MsIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MsIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgImluZGV4ZWRHZXR0ZXIiLCBmY25faW5kZXhlZEdldHRlciwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiaW5kZXhlZFNldHRlciIsIGZjbl9pbmRleGVkU2V0dGVyLCBOVUxMLAotICAgICAgMiwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJuYW1lZEdldHRlciIsIGZjbl9uYW1lZEdldHRlciwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAibmFtZWRTZXR0ZXIiLCBmY25fbmFtZWRTZXR0ZXIsIE5VTEwsCi0gICAgICAyLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgIm9wZXJhdGlvbk9uQmFzZUNsYXNzIiwgZmNuX29wZXJhdGlvbk9uQmFzZUNsYXNzLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIk5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjQyOWIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2MDJmMzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpQdXRGb3J3YXJkc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X25lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bmVzdGVkX2ZvcndhcmRpbmdfYXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfbmVzdGVkRm9yd2FyZGluZ0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZT4oKS5nZXQoKTsKLSAgeyAvLyBCZWdpbiBzY29wZSBvZiBzY29wZWRfcmVmcHRyPFB1dEZvcndhcmRzSW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KLSAgICBzY29wZWRfcmVmcHRyPFB1dEZvcndhcmRzSW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbCA9Ci0gICAgICAgaW1wbC0+bmVzdGVkX2ZvcndhcmRpbmdfYXR0cmlidXRlKCk7Ci0gICAgaWYgKCFmb3J3YXJkZWRfaW1wbCkgewotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgeyAvLyBCZWdpbiBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsLgotICAgIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfZm9yd2FyZGVkX2ltcGwgPQotICAgICAgIGZvcndhcmRlZF9pbXBsLT5mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpOwotICAgIGlmICghZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsKSB7Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsLT5zZXRfYXJiaXRyYXJ5X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0gICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICB9IC8vIEVuZCBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsLgotfQotICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgfSAvLyBFbmQgc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxQdXRGb3J3YXJkc0ludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCi19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgIm5lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X25lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X25lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZTBhYmUyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTI2YmMwNy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiTm9Db25zdHJ1Y3RvckludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOb0NvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOb0NvbnN0cnVjdG9ySW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJOb0NvbnN0cnVjdG9ySW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDZlMjZjOS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNDQ1YTk5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Tm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzA3YmI1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2FjYzRhOC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDc4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X251bGxhYmxlQm9vbGVhblByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX2Jvb2xlYW5fcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxib29sID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX2Jvb2xlYW5fcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfbnVsbGFibGVOdW1lcmljUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfbnVtZXJpY19wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X251bGxhYmxlTnVtZXJpY1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGludDMyX3QgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfbnVsbGFibGVfbnVtZXJpY19wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGdldF9udWxsYWJsZVN0cmluZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX3N0cmluZ19wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X251bGxhYmxlU3RyaW5nUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfbnVsbGFibGVfc3RyaW5nX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X251bGxhYmxlT2JqZWN0UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfb2JqZWN0X3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfbnVsbGFibGVPYmplY3RQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX29iamVjdF9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9udWxsYWJsZUJvb2xlYW5Bcmd1bWVudCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxib29sID4gPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+TnVsbGFibGVCb29sZWFuQXJndW1lbnQoYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX251bGxhYmxlQm9vbGVhbk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TnVsbGFibGVCb29sZWFuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fbnVsbGFibGVOdW1lcmljQXJndW1lbnQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8aW50MzJfdCA+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk51bGxhYmxlTnVtZXJpY0FyZ3VtZW50KGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9udWxsYWJsZU51bWVyaWNPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPk51bGxhYmxlTnVtZXJpY09wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX251bGxhYmxlT2JqZWN0QXJndW1lbnQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk51bGxhYmxlT2JqZWN0QXJndW1lbnQoYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX251bGxhYmxlT2JqZWN0T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5OdWxsYWJsZU9iamVjdE9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX251bGxhYmxlU3RyaW5nQXJndW1lbnQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5OdWxsYWJsZVN0cmluZ0FyZ3VtZW50KGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9udWxsYWJsZVN0cmluZ09wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TnVsbGFibGVTdHJpbmdPcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJudWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfbnVsbGFibGVCb29sZWFuUHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X251bGxhYmxlQm9vbGVhblByb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJudWxsYWJsZU51bWVyaWNQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfbnVsbGFibGVOdW1lcmljUHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X251bGxhYmxlTnVtZXJpY1Byb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJudWxsYWJsZVN0cmluZ1Byb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9udWxsYWJsZVN0cmluZ1Byb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9udWxsYWJsZVN0cmluZ1Byb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJudWxsYWJsZU9iamVjdFByb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9udWxsYWJsZU9iamVjdFByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9udWxsYWJsZU9iamVjdFByb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZOU1BFQygKLSAgICAgICJudWxsYWJsZUJvb2xlYW5Bcmd1bWVudCIsIGZjbl9udWxsYWJsZUJvb2xlYW5Bcmd1bWVudCwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAibnVsbGFibGVCb29sZWFuT3BlcmF0aW9uIiwgZmNuX251bGxhYmxlQm9vbGVhbk9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAibnVsbGFibGVOdW1lcmljQXJndW1lbnQiLCBmY25fbnVsbGFibGVOdW1lcmljQXJndW1lbnQsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgIm51bGxhYmxlTnVtZXJpY09wZXJhdGlvbiIsIGZjbl9udWxsYWJsZU51bWVyaWNPcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgIm51bGxhYmxlT2JqZWN0QXJndW1lbnQiLCBmY25fbnVsbGFibGVPYmplY3RBcmd1bWVudCwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAibnVsbGFibGVPYmplY3RPcGVyYXRpb24iLCBmY25fbnVsbGFibGVPYmplY3RPcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgIm51bGxhYmxlU3RyaW5nQXJndW1lbnQiLCBmY25fbnVsbGFibGVTdHJpbmdBcmd1bWVudCwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAibnVsbGFibGVTdHJpbmdPcGVyYXRpb24iLCBmY25fbnVsbGFibGVTdHJpbmdPcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYjM2MjUzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmNzA0ZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X2J5dGVQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5ieXRlX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfYnl0ZVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGludDhfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9ieXRlX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X29jdGV0UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+b2N0ZXRfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9vY3RldFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHVpbnQ4X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfb2N0ZXRfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfc2hvcnRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5zaG9ydF9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X3Nob3J0UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8aW50MTZfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9zaG9ydF9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGdldF91bnNpZ25lZFNob3J0UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+dW5zaWduZWRfc2hvcnRfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF91bnNpZ25lZFNob3J0UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8dWludDE2X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5zaWduZWRfc2hvcnRfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfbG9uZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmxvbmdfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9sb25nUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9sb25nX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X3Vuc2lnbmVkTG9uZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnVuc2lnbmVkX2xvbmdfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF91bnNpZ25lZExvbmdQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF91bnNpZ25lZF9sb25nX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X2xvbmdMb25nUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bG9uZ19sb25nX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfbG9uZ0xvbmdQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxpbnQ2NF90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2xvbmdfbG9uZ19wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGdldF91bnNpZ25lZExvbmdMb25nUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+dW5zaWduZWRfbG9uZ19sb25nX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfdW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHVpbnQ2NF90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3Vuc2lnbmVkX2xvbmdfbG9uZ19wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGdldF9kb3VibGVQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5kb3VibGVfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9kb3VibGVQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfZG91YmxlX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnVucmVzdHJpY3RlZF9kb3VibGVfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF91bnJlc3RyaWN0ZWREb3VibGVQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5yZXN0cmljdGVkX2RvdWJsZV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9ieXRlQXJndW1lbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8aW50OF90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5CeXRlQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9ieXRlUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5CeXRlUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fZG91YmxlQXJndW1lbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZCksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Eb3VibGVBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2RvdWJsZVJldHVybk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+RG91YmxlUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fbG9uZ0FyZ3VtZW50T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkxvbmdBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2xvbmdMb25nQXJndW1lbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8aW50NjRfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+TG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2xvbmdMb25nUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Mb25nTG9uZ1JldHVybk9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2xvbmdSZXR1cm5PcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkxvbmdSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9vY3RldEFyZ3VtZW50T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQ4X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk9jdGV0QXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9vY3RldFJldHVybk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+T2N0ZXRSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9zaG9ydEFyZ3VtZW50T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDE2X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlNob3J0QXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9zaG9ydFJldHVybk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+U2hvcnRSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl91bnJlc3RyaWN0ZWREb3VibGVBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlVucmVzdHJpY3RlZERvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fdW5yZXN0cmljdGVkRG91YmxlUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5VbnJlc3RyaWN0ZWREb3VibGVSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl91bnNpZ25lZExvbmdBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VW5zaWduZWRMb25nQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl91bnNpZ25lZExvbmdMb25nQXJndW1lbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8dWludDY0X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlVuc2lnbmVkTG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3Vuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPlVuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl91bnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPlVuc2lnbmVkTG9uZ1JldHVybk9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3Vuc2lnbmVkU2hvcnRBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50MTZfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VW5zaWduZWRTaG9ydEFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fdW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+VW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImJ5dGVQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfYnl0ZVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9ieXRlUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgIm9jdGV0UHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X29jdGV0UHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X29jdGV0UHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgInNob3J0UHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X3Nob3J0UHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X3Nob3J0UHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgInVuc2lnbmVkU2hvcnRQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfdW5zaWduZWRTaG9ydFByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF91bnNpZ25lZFNob3J0UHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImxvbmdQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfbG9uZ1Byb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9sb25nUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgInVuc2lnbmVkTG9uZ1Byb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF91bnNpZ25lZExvbmdQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfdW5zaWduZWRMb25nUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImxvbmdMb25nUHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2xvbmdMb25nUHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X2xvbmdMb25nUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgInVuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfdW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF91bnNpZ25lZExvbmdMb25nUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImRvdWJsZVByb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9kb3VibGVQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfZG91YmxlUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgInVucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF91bnJlc3RyaWN0ZWREb3VibGVQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfdW5yZXN0cmljdGVkRG91YmxlUHJvcGVydHksIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgImJ5dGVBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl9ieXRlQXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgImJ5dGVSZXR1cm5PcGVyYXRpb24iLCBmY25fYnl0ZVJldHVybk9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiZG91YmxlQXJndW1lbnRPcGVyYXRpb24iLCBmY25fZG91YmxlQXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgImRvdWJsZVJldHVybk9wZXJhdGlvbiIsIGZjbl9kb3VibGVSZXR1cm5PcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgImxvbmdBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl9sb25nQXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgImxvbmdMb25nQXJndW1lbnRPcGVyYXRpb24iLCBmY25fbG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAibG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24iLCBmY25fbG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgImxvbmdSZXR1cm5PcGVyYXRpb24iLCBmY25fbG9uZ1JldHVybk9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAib2N0ZXRBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl9vY3RldEFyZ3VtZW50T3BlcmF0aW9uLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJvY3RldFJldHVybk9wZXJhdGlvbiIsIGZjbl9vY3RldFJldHVybk9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAic2hvcnRBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl9zaG9ydEFyZ3VtZW50T3BlcmF0aW9uLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJzaG9ydFJldHVybk9wZXJhdGlvbiIsIGZjbl9zaG9ydFJldHVybk9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAidW5yZXN0cmljdGVkRG91YmxlQXJndW1lbnRPcGVyYXRpb24iLCBmY25fdW5yZXN0cmljdGVkRG91YmxlQXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInVucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbiIsIGZjbl91bnJlc3RyaWN0ZWREb3VibGVSZXR1cm5PcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInVuc2lnbmVkTG9uZ0FyZ3VtZW50T3BlcmF0aW9uIiwgZmNuX3Vuc2lnbmVkTG9uZ0FyZ3VtZW50T3BlcmF0aW9uLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJ1bnNpZ25lZExvbmdMb25nQXJndW1lbnRPcGVyYXRpb24iLCBmY25fdW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJ1bnNpZ25lZExvbmdMb25nUmV0dXJuT3BlcmF0aW9uIiwgZmNuX3Vuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInVuc2lnbmVkTG9uZ1JldHVybk9wZXJhdGlvbiIsIGZjbl91bnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInVuc2lnbmVkU2hvcnRBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl91bnNpZ25lZFNob3J0QXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInVuc2lnbmVkU2hvcnRSZXR1cm5PcGVyYXRpb24iLCBmY25fdW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkyM2M4My4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNGQwZjc5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0Jhc2VJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0Rlcml2ZWRJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGVyaXZlZEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotYm9vbCBnZXRfYXJiaXRyYXJ5T2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmFyYml0cmFyeV9vYmplY3QoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9hcmJpdHJhcnlPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2FyYml0cmFyeV9vYmplY3QodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfYmFzZUludGVyZmFjZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5iYXNlX2ludGVyZmFjZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotYm9vbCBnZXRfZGVyaXZlZEludGVyZmFjZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5kZXJpdmVkX2ludGVyZmFjZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X2Rlcml2ZWRJbnRlcmZhY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxEZXJpdmVkSW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9kZXJpdmVkX2ludGVyZmFjZSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGdldF9vYmplY3RQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5vYmplY3RfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9vYmplY3RQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxPcGFxdWVIYW5kbGUgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X29iamVjdF9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJhcmJpdHJhcnlPYmplY3QiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2FyYml0cmFyeU9iamVjdCwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfYXJiaXRyYXJ5T2JqZWN0LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgImJhc2VJbnRlcmZhY2UiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2Jhc2VJbnRlcmZhY2UsIE5VTEwgfSB9LAotICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAiZGVyaXZlZEludGVyZmFjZSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfZGVyaXZlZEludGVyZmFjZSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfZGVyaXZlZEludGVyZmFjZSwgTlVMTCB9IH0sCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAib2JqZWN0UHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X29iamVjdFByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF9vYmplY3RQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDFlOWJiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMjEyYjg5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3MzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIk9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotYm9vbCBmY25fbG9uZ0Z1bmN0aW9uTm9BcmdzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Mb25nRnVuY3Rpb25Ob0FyZ3MoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9vYmplY3RGdW5jdGlvbk5vQXJncygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+T2JqZWN0RnVuY3Rpb25Ob0FyZ3MoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9vcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIC8vIE9wdGlvbmFsIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIGFyZzEgPQotICAgICAgMi43MTg7Ci0gIHNpemVfdCBudW1fc2V0X2FyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpID4gMCkgewotICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTAoCi0gICAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwKLSAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICZhcmcxKTsKLSAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGltcGwtPk9wdGlvbmFsQXJndW1lbnRXaXRoRGVmYXVsdChhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX29wdGlvbmFsQXJndW1lbnRzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLSAgLy8gT3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzaXplX3QgbnVtX3NldF9hcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA+IDEpIHsKLSAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUwKAotICAgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAmYXJnMik7Ci0gICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKytudW1fc2V0X2FyZ3VtZW50czsKLSAgfQotICBpZiAoYXJncy5sZW5ndGgoKSA+IDIpIHsKLSAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUxKAotICAgICAgICBjb250ZXh0LCBhcmdzWzJdKTsKLSAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAmYXJnMyk7Ci0gICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKytudW1fc2V0X2FyZ3VtZW50czsKLSAgfQotICBzd2l0Y2ggKG51bV9zZXRfYXJndW1lbnRzKSB7Ci0gICAgY2FzZSAxOgotICAgICAgewotICAgICAgICAgIGltcGwtPk9wdGlvbmFsQXJndW1lbnRzKGFyZzEpOwotICAgICAgICAgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgICAgICAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDI6Ci0gICAgICB7Ci0gICAgICAgICAgaW1wbC0+T3B0aW9uYWxBcmd1bWVudHMoYXJnMSwgYXJnMik7Ci0gICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgMzoKLSAgICAgIHsKLSAgICAgICAgICBpbXBsLT5PcHRpb25hbEFyZ3VtZW50cyhhcmcxLCBhcmcyLCBhcmczKTsKLSAgICAgICAgICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gICAgICAgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIGZjbl9vcHRpb25hbE51bGxhYmxlQXJndW1lbnRzV2l0aERlZmF1bHRzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICAvLyBPcHRpb25hbCBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmcxID0KLSAgICAgIGJhc2U6Om51bGxvcHQ7Ci0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIGFyZzIgPQotICAgICAgTlVMTDsKLSAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMjsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAwKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKLSAgICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwKLSAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICZhcmcxKTsKLSAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICBpZiAoYXJncy5sZW5ndGgoKSA+IDEpIHsKLSAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUxKAotICAgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJmFyZzIpOwotICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaW1wbC0+T3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cyhhcmcxLCBhcmcyKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjEoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24yKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMzsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzM7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAotICAgICAgY29udGV4dCwgYXJnc1sxXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzIpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgyLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTIoCi0gICAgICBjb250ZXh0LCBhcmdzWzJdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMiwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uNSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAzOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmczOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAotICAgICAgY29udGV4dCwgYXJnc1syXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk92ZXJsb2FkZWRGdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBzd2l0Y2goYXJnYykgewotICAgIGNhc2UoMCk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24xKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UoMSk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzBdKTsKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKLSAgICAgICAgb2JqZWN0ID0gSlM6OlJvb3RlZE9iamVjdChjb250ZXh0LCAmYXJnLnRvT2JqZWN0KCkpOwotICAgICAgfQotICAgICAgaWYgKGFyZy5pc051bWJlcigpKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMygKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlKDMpOiB7Ci0gICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6Ci0gICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgICAgIEpTOjpSb290ZWRWYWx1ZSBhcmcoY29udGV4dCwgYXJnc1syXSk7Ci0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7Ci0gICAgICAgIG9iamVjdCA9IEpTOjpSb290ZWRPYmplY3QoY29udGV4dCwgJmFyZy50b09iamVjdCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChhcmcuaXNPYmplY3QoKSA/IHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSA6Ci0gICAgICAgICAgICAgIGZhbHNlKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uNSgKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uNCgKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCi0gIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCi0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+T3ZlcmxvYWRlZE51bGxhYmxlKGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9vdmVybG9hZGVkTnVsbGFibGUyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5PdmVybG9hZGVkTnVsbGFibGUoYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX292ZXJsb2FkZWROdWxsYWJsZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBzd2l0Y2goYXJnYykgewotICAgIGNhc2UoMSk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzBdKTsKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKLSAgICAgICAgb2JqZWN0ID0gSlM6OlJvb3RlZE9iamVjdChjb250ZXh0LCAmYXJnLnRvT2JqZWN0KCkpOwotICAgICAgfQotICAgICAgaWYgKGFyZy5pc051bGxPclVuZGVmaW5lZCgpKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMSgKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCi0gIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCi0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBmY25fc3RyaW5nRnVuY3Rpb25Ob0FyZ3MoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPlN0cmluZ0Z1bmN0aW9uTm9BcmdzKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fdmFyaWFkaWNQcmltaXRpdmVBcmd1bWVudHMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIC8vIFZhcmlhZGljIGFyZ3VtZW50Ci0gIFR5cGVUcmFpdHM8c3RkOjp2ZWN0b3I8aW50MzJfdD4gPjo6Q29udmVyc2lvblR5cGUgYm9vbHM7Ci0KLSAgLy8gR2V0IHZhcmlhZGljIGFyZ3VtZW50cy4KLSAgY29uc3Qgc2l6ZV90IGtGaXJzdFZhcmlhZGljQXJnSW5kZXggPSAwOwotICBpZiAoYXJncy5sZW5ndGgoKSA+IGtGaXJzdFZhcmlhZGljQXJnSW5kZXgpIHsKLSAgICBib29scy5yZXNpemUoYXJncy5sZW5ndGgoKSAtIGtGaXJzdFZhcmlhZGljQXJnSW5kZXgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpICsga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCA8IGFyZ3MubGVuZ3RoKCk7ICsraSkgewotICAgICAgSlM6OlJvb3RlZFZhbHVlIHZhcmlhZGljX2FyZ3VtZW50X3ZhbHVlKAotICAgICAgICAgIGNvbnRleHQsIGFyZ3NbaSArIGtGaXJzdFZhcmlhZGljQXJnSW5kZXhdKTsKLSAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICB2YXJpYWRpY19hcmd1bWVudF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAmYm9vbHNbaV0pOwotICAgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGltcGwtPlZhcmlhZGljUHJpbWl0aXZlQXJndW1lbnRzKGJvb2xzKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3ZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICAvLyBPcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIG9wdGlvbmFsX2FyZzsKLSAgLy8gVmFyaWFkaWMgYXJndW1lbnQKLSAgVHlwZVRyYWl0czxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPjo6Q29udmVyc2lvblR5cGUgc3RyaW5nczsKLSAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMDsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAwKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKLSAgICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJm9wdGlvbmFsX2FyZyk7Ci0gICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKytudW1fc2V0X2FyZ3VtZW50czsKLSAgfQotCi0gIC8vIEdldCB2YXJpYWRpYyBhcmd1bWVudHMuCi0gIGNvbnN0IHNpemVfdCBrTGFzdE9wdGlvbmFsQXJnSW5kZXggPSAxOwotICBpZiAobnVtX3NldF9hcmd1bWVudHMgPT0ga0xhc3RPcHRpb25hbEFyZ0luZGV4KSB7Ci0gICAgLy8gSWYgdGhlIGxhc3Qgb3B0aW9uYWwgYXJndW1lbnQgaGFzIGJlZW4gc2V0LCB3ZSB3aWxsIGNhbGwgdGhlIG92ZXJsb2FkCi0gICAgLy8gdGhhdCB0YWtlcyB0aGUgdmFyaWFkaWMgYXJndW1lbnQsIHBvc3NpYmx5IHdpdGggYW4gZW1wdHkgdmVjdG9yIGluIHRoZQotICAgIC8vIGNhc2UgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBhcmd1bWVudHMgbGVmdC4KLSAgICArK251bV9zZXRfYXJndW1lbnRzOwotICB9Ci0gIGNvbnN0IHNpemVfdCBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4ID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4KSB7Ci0gICAgc3RyaW5ncy5yZXNpemUoYXJncy5sZW5ndGgoKSAtIGtGaXJzdFZhcmlhZGljQXJnSW5kZXgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpICsga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCA8IGFyZ3MubGVuZ3RoKCk7ICsraSkgewotICAgICAgSlM6OlJvb3RlZFZhbHVlIHZhcmlhZGljX2FyZ3VtZW50X3ZhbHVlKAotICAgICAgICAgIGNvbnRleHQsIGFyZ3NbaSArIGtGaXJzdFZhcmlhZGljQXJnSW5kZXhdKTsKLSAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICB2YXJpYWRpY19hcmd1bWVudF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAmc3RyaW5nc1tpXSk7Ci0gICAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHN3aXRjaCAobnVtX3NldF9hcmd1bWVudHMpIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0gICAgICAgICAgaW1wbC0+VmFyaWFkaWNTdHJpbmdBcmd1bWVudHNBZnRlck9wdGlvbmFsQXJndW1lbnQoKTsKLSAgICAgICAgICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gICAgICAgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgewotICAgICAgICAgIGltcGwtPlZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KG9wdGlvbmFsX2FyZywgc3RyaW5ncyk7Ci0gICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBmY25fdm9pZEZ1bmN0aW9uTG9uZ0FyZygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+Vm9pZEZ1bmN0aW9uTG9uZ0FyZyhhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fdm9pZEZ1bmN0aW9uTm9BcmdzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPlZvaWRGdW5jdGlvbk5vQXJncygpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fdm9pZEZ1bmN0aW9uT2JqZWN0QXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlZvaWRGdW5jdGlvbk9iamVjdEFyZyhhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fdm9pZEZ1bmN0aW9uU3RyaW5nQXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+Vm9pZEZ1bmN0aW9uU3RyaW5nQXJnKGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHN0YXRpY2Zjbl9vdmVybG9hZGVkRnVuY3Rpb24xKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6Ok92ZXJsb2FkZWRGdW5jdGlvbihhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZCksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZzEsIGFyZzIpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIHN3aXRjaChhcmdjKSB7Ci0gICAgY2FzZSgxKTogewotICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgotICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gICAgICBpZiAodHJ1ZSkgewotICAgICAgICByZXR1cm4gc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjEoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSgyKTogewotICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgotICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gICAgICBpZiAodHJ1ZSkgewotICAgICAgICByZXR1cm4gc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjIoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncwotICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgImxvbmdGdW5jdGlvbk5vQXJncyIsIGZjbl9sb25nRnVuY3Rpb25Ob0FyZ3MsIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgIm9iamVjdEZ1bmN0aW9uTm9BcmdzIiwgZmNuX29iamVjdEZ1bmN0aW9uTm9BcmdzLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJvcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQiLCBmY25fb3B0aW9uYWxBcmd1bWVudFdpdGhEZWZhdWx0LCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJvcHRpb25hbEFyZ3VtZW50cyIsIGZjbl9vcHRpb25hbEFyZ3VtZW50cywgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAib3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cyIsIGZjbl9vcHRpb25hbE51bGxhYmxlQXJndW1lbnRzV2l0aERlZmF1bHRzLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJvdmVybG9hZGVkRnVuY3Rpb24iLCBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJvdmVybG9hZGVkTnVsbGFibGUiLCBmY25fb3ZlcmxvYWRlZE51bGxhYmxlLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJzdHJpbmdGdW5jdGlvbk5vQXJncyIsIGZjbl9zdHJpbmdGdW5jdGlvbk5vQXJncywgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAidmFyaWFkaWNQcmltaXRpdmVBcmd1bWVudHMiLCBmY25fdmFyaWFkaWNQcmltaXRpdmVBcmd1bWVudHMsIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50IiwgZmNuX3ZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50LCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJ2b2lkRnVuY3Rpb25Mb25nQXJnIiwgZmNuX3ZvaWRGdW5jdGlvbkxvbmdBcmcsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInZvaWRGdW5jdGlvbk5vQXJncyIsIGZjbl92b2lkRnVuY3Rpb25Ob0FyZ3MsIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInZvaWRGdW5jdGlvbk9iamVjdEFyZyIsIGZjbl92b2lkRnVuY3Rpb25PYmplY3RBcmcsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInZvaWRGdW5jdGlvblN0cmluZ0FyZyIsIGZjbl92b2lkRnVuY3Rpb25TdHJpbmdBcmcsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoCi0gICAgICAib3ZlcmxvYWRlZEZ1bmN0aW9uIiwgc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbiwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZDczYjZlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhNzBiMGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTA1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpQdXRGb3J3YXJkc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlB1dEZvcndhcmRzSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlB1dEZvcndhcmRzSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJQdXRGb3J3YXJkc0ludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZ2V0X2ZvcndhcmRpbmdBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8UHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBQdXRGb3J3YXJkc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxQdXRGb3J3YXJkc0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+Zm9yd2FyZGluZ19hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHNldF9mb3J3YXJkaW5nQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxQdXRGb3J3YXJkc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFB1dEZvcndhcmRzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpLmdldCgpOwotICB7IC8vIEJlZ2luIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KLSAgICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwgPQotICAgICAgIGltcGwtPmZvcndhcmRpbmdfYXR0cmlidXRlKCk7Ci0gICAgaWYgKCFmb3J3YXJkZWRfaW1wbCkgewotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvcndhcmRlZF9pbXBsLT5zZXRfYXJiaXRyYXJ5X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0gICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICB9IC8vIEVuZCBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCi19Ci0KLWJvb2wgc3RhdGljZ2V0X3N0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIFB1dEZvcndhcmRzSW50ZXJmYWNlOjpzdGF0aWNfZm9yd2FyZGluZ19hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHN0YXRpY3NldF9zdGF0aWNGb3J3YXJkaW5nQXR0cmlidXRlKAotICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgeyAvLyBCZWdpbiBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCi0gICAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsID0KLSAgICAgICBQdXRGb3J3YXJkc0ludGVyZmFjZTo6c3RhdGljX2ZvcndhcmRpbmdfYXR0cmlidXRlKCk7Ci0gICAgaWYgKCFmb3J3YXJkZWRfaW1wbCkgewotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZvcndhcmRlZF9pbXBsLT5zZXRfYXJiaXRyYXJ5X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0gICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICB9IC8vIEVuZCBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCi19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgImZvcndhcmRpbmdBdHRyaWJ1dGUiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X2ZvcndhcmRpbmdBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X2ZvcndhcmRpbmdBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gU3RhdGljIHJlYWQvd3JpdGUgYXR0cmlidXRlLgotICAgICAgInN0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUiLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICB7IHsgJnN0YXRpY2dldF9zdGF0aWNGb3J3YXJkaW5nQXR0cmlidXRlLCBOVUxMIH0gfSwKLSAgICAgIHsgeyAmc3RhdGljc2V0X3N0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJQdXRGb3J3YXJkc0ludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxZTM1ZTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTZXF1ZW5jZVVzZXIuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU2VxdWVuY2VVc2VyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2M2ZmI3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTZXF1ZW5jZVVzZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTA0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzU2VxdWVuY2VVc2VyLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U2VxdWVuY2VVc2VyOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTZXF1ZW5jZVVzZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzU2VxdWVuY2VVc2VySGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNTZXF1ZW5jZVVzZXJIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNTZXF1ZW5jZVVzZXJIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1NlcXVlbmNlVXNlckhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzU2VxdWVuY2VVc2VySGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOwotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzU2VxdWVuY2VVc2VyOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiU2VxdWVuY2VVc2VyIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlNlcXVlbmNlVXNlclByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiU2VxdWVuY2VVc2VyQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBDb25zdHJ1Y3RvciwKLX07Ci0KLWJvb2wgZmNuX2dldEludGVyZmFjZVNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRJbnRlcmZhY2VTZXF1ZW5jZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX2dldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU2VxdWVuY2VVc2VyKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+R2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fZ2V0TG9uZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRMb25nU2VxdWVuY2UoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9nZXRTdHJpbmdTZXF1ZW5jZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU2VxdWVuY2VVc2VyKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+R2V0U3RyaW5nU2VxdWVuY2UoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9nZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9nZXRVbmlvblNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRVbmlvblNlcXVlbmNlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fc2V0SW50ZXJmYWNlU2VxdWVuY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFNlcXVlbmNlVXNlciogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+U2V0SW50ZXJmYWNlU2VxdWVuY2UoZWxlbWVudHMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+ID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoZWxlbWVudHMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fc2V0TG9uZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IGludDMyX3QgPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TZXRMb25nU2VxdWVuY2UoZWxlbWVudHMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fc2V0U3RyaW5nU2VxdWVuY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFNlcXVlbmNlVXNlciogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgc3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TZXRTdHJpbmdTZXF1ZW5jZShlbGVtZW50cyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl9zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKGVsZW1lbnRzKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3NldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU2VxdWVuY2VVc2VyKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxzY3JpcHQ6OlVuaW9uVHlwZTI8c3RkOjpzdHJpbmcsIHNjcmlwdDo6U2VxdWVuY2U8IHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoZWxlbWVudHMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBmY25fc2V0VW5pb25TZXF1ZW5jZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU2VxdWVuY2VVc2VyKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxzY3JpcHQ6OlNlcXVlbmNlPCBzY3JpcHQ6OlVuaW9uVHlwZTI8c3RkOjpzdHJpbmcsIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+U2V0VW5pb25TZXF1ZW5jZShlbGVtZW50cyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZOU1BFQygKLSAgICAgICJnZXRJbnRlcmZhY2VTZXF1ZW5jZSIsIGZjbl9nZXRJbnRlcmZhY2VTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlIiwgZmNuX2dldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiZ2V0TG9uZ1NlcXVlbmNlIiwgZmNuX2dldExvbmdTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiZ2V0U3RyaW5nU2VxdWVuY2UiLCBmY25fZ2V0U3RyaW5nU2VxdWVuY2UsIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgImdldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UiLCBmY25fZ2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlIiwgZmNuX2dldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAiZ2V0VW5pb25TZXF1ZW5jZSIsIGZjbl9nZXRVbmlvblNlcXVlbmNlLCBOVUxMLAotICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZOU1BFQygKLSAgICAgICJzZXRJbnRlcmZhY2VTZXF1ZW5jZSIsIGZjbl9zZXRJbnRlcmZhY2VTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAic2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlIiwgZmNuX3NldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAic2V0TG9uZ1NlcXVlbmNlIiwgZmNuX3NldExvbmdTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAic2V0U3RyaW5nU2VxdWVuY2UiLCBmY25fc2V0U3RyaW5nU2VxdWVuY2UsIE5VTEwsCi0gICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRk5TUEVDKAotICAgICAgInNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UiLCBmY25fc2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAic2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlIiwgZmNuX3NldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSwgTlVMTCwKLSAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAic2V0VW5pb25TZXF1ZW5jZSIsIGZjbl9zZXRVbmlvblNlcXVlbmNlLCBOVUxMLAotICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIlNlcXVlbmNlVXNlciI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLCBsZW5ndGhfdmFsdWUsCi0gICAgICBKU1BST1BfUkVBRE9OTFksIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU2VxdWVuY2VVc2VyOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTZXF1ZW5jZVVzZXI6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1NlcXVlbmNlVXNlcjo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxTZXF1ZW5jZVVzZXI+IG5ld19vYmplY3QgPQotICAgICAgbmV3IFNlcXVlbmNlVXNlcigpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdChyZXN1bHRfdmFsdWUudG9PYmplY3QoKSk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1NlcXVlbmNlVXNlci5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1NlcXVlbmNlVXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZGMyZjVmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTZXF1ZW5jZVVzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzU2VxdWVuY2VVc2VyX2gKLSNkZWZpbmUgTW96anNTZXF1ZW5jZVVzZXJfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VxdWVuY2VfdXNlci5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNTZXF1ZW5jZVVzZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzU2VxdWVuY2VVc2VyX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZDNhZTE4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLQotI2luY2x1ZGUgIk1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2xvZ2dpbmdfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdXRpbC9leGNlcHRpb25faGVscGVycy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2NudHh0LmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6TG9nZ2luZ0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6R2V0Q2FsbGFibGVGb3JDYWxsYmFja0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjp1dGlsOjpHZXRFeGNlcHRpb25TdHJpbmc7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1Nb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTo6TW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgaW1wbGVtZW50aW5nX29iamVjdCkKLSAgICA6IGNvbnRleHRfKGNvbnRleHQpLAotICAgICAgaW1wbGVtZW50aW5nX29iamVjdF8oY29udGV4dCwgaW1wbGVtZW50aW5nX29iamVjdCkgeyB9Ci0KLWJhc2U6Om9wdGlvbmFsPGludDMyX3QgPiBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTo6SGFuZGxlQ2FsbGJhY2soCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIGNhbGxiYWNrX3RoaXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+JiB2YWx1ZSwKLSAgICBib29sKiBoYWRfZXhjZXB0aW9uKSBjb25zdCB7Ci0gIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICBiYXNlOjpvcHRpb25hbDxpbnQzMl90ID4gY29iYWx0X3JldHVybl92YWx1ZTsKLSAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICBKU0V4Y2VwdGlvblN0YXRlKiBwcmV2aW91c19leGNlcHRpb25fc3RhdGUgPSBKU19TYXZlRXhjZXB0aW9uU3RhdGUoY29udGV4dF8pOwotCi0gIC8vIFRoaXMgY291bGQgYmUgc2V0IHRvIE5VTEwgaWYgaXQgd2FzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBKUzo6Um9vdGVkT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3QoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3RfLkdldCgpKTsKLSAgRExPR19JRihXQVJOSU5HLCAhaW1wbGVtZW50aW5nX29iamVjdCkgPDwgIkltcGxlbWVudGluZyBvYmplY3QgaXMgTlVMTC4iOwotICBpZiAoaW1wbGVtZW50aW5nX29iamVjdCkgewotICAgIEpTQXV0b0NvbXBhcnRtZW50IGF1dG9fY29tcGFydG1lbnQoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3QpOwotCi0gICAgLy8gR2V0IGNhbGxhYmxlIG9iamVjdC4KLSAgICBKUzo6Um9vdGVkVmFsdWUgY2FsbGFibGUoY29udGV4dF8pOwotICAgIGlmIChHZXRDYWxsYWJsZUZvckNhbGxiYWNrSW50ZXJmYWNlKGNvbnRleHRfLCBpbXBsZW1lbnRpbmdfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGVDYWxsYmFjayIsICZjYWxsYWJsZSkpIHsKLSAgICAgIC8vIENvbnZlcnQgdGhlIGNhbGxiYWNrX3RoaXMgdG8gYSBKU1ZhbHVlLgotICAgICAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dF8pOwotICAgICAgVG9KU1ZhbHVlKGNvbnRleHRfLCBjYWxsYmFja190aGlzLCAmdGhpc192YWx1ZSk7Ci0KLSAgICAgIC8vIENvbnZlcnQgYXJndW1lbnRzLgotICAgICAgY29uc3QgaW50IGtOdW1Bcmd1bWVudHMgPSAxOwotICAgICAgSlM6OkF1dG9WYWx1ZUFycmF5PGtOdW1Bcmd1bWVudHM+IGFyZ3MoY29udGV4dF8pOwotCi0gICAgICBUb0pTVmFsdWUoY29udGV4dF8sIHZhbHVlLCBhcmdzWzBdKTsKLQotICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24uCi0gICAgICBKUzo6Um9vdGVkVmFsdWUgcmV0dXJuX3ZhbHVlKGNvbnRleHRfKTsKLSAgICAgIEpTOjpSb290ZWRGdW5jdGlvbiBmdW5jdGlvbigKLSAgICAgICAgICBjb250ZXh0XywgSlNfVmFsdWVUb0Z1bmN0aW9uKGNvbnRleHRfLCBjYWxsYWJsZSkpOwotICAgICAgRENIRUNLKGZ1bmN0aW9uKTsKLSAgICAgIHN1Y2Nlc3MgPSBKUzo6Q2FsbChjb250ZXh0XywgdGhpc192YWx1ZSwgZnVuY3Rpb24sIGFyZ3MsICZyZXR1cm5fdmFsdWUpOwotICAgICAgRExPR19JRihXQVJOSU5HLCAhc3VjY2VzcykgPDwgIkV4Y2VwdGlvbiBpbiBjYWxsYmFjazogIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgR2V0RXhjZXB0aW9uU3RyaW5nKGNvbnRleHRfKTsKLSAgICAgIGlmIChzdWNjZXNzKSB7Ci0gICAgICAgIExvZ2dpbmdFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGU7Ci0gICAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHRfLCByZXR1cm5fdmFsdWUsIDAsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICZjb2JhbHRfcmV0dXJuX3ZhbHVlKTsKLSAgICAgICAgc3VjY2VzcyA9ICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gICpoYWRfZXhjZXB0aW9uID0gIXN1Y2Nlc3M7Ci0gIEpTX1Jlc3RvcmVFeGNlcHRpb25TdGF0ZShjb250ZXh0XywgcHJldmlvdXNfZXhjZXB0aW9uX3N0YXRlKTsKLSAgcmV0dXJuIGNvYmFsdF9yZXR1cm5fdmFsdWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWE0OTM2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDY1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19pbnRlcmZhY2VfdHJhaXRzLmgiCi0vLyBIZWFkZXJzIGZvciBvdGhlciBiaW5kaW5ncyB3cmFwcGVyIGNsYXNzZXMKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93ZWFrX2hlYXBfb2JqZWN0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgOiBwdWJsaWMgU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIEJhc2VUeXBlOwotCi0gIE1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3QpOwotICBiYXNlOjpvcHRpb25hbDxpbnQzMl90ID4gSGFuZGxlQ2FsbGJhY2soCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgY2FsbGJhY2tfdGhpcywKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiYgdmFsdWUsCi0gICAgICBib29sKiBoYWRfZXhjZXB0aW9uKSBjb25zdCBPVkVSUklERTsKLSAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGltcGxlbWVudGluZ19vYmplY3RfLkdldCgpOyB9Ci0KLSBwcml2YXRlOgotICBKU0NvbnRleHQqIGNvbnRleHRfOwotICBzY3JpcHQ6Om1vempzOjpXZWFrSGVhcE9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0XzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLW5hbWVzcGFjZSBzY3JpcHQgewotLy8gRXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBDYWxsYmFja0ludGVyZmFjZVRyYWl0cyBzdHJ1Y3Qgc28gd2UgY2FuIGluZmVyCi0vLyB0aGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGZyb20gdGhlIHR5cGUgb2YgdGhlIGNhbGxiYWNrIGludGVyZmFjZS4KLXRlbXBsYXRlPD4KLXN0cnVjdCBDYWxsYmFja0ludGVyZmFjZVRyYWl0czxiaW5kaW5nczo6dGVzdGluZzo6U2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlPiB7Ci0gIHR5cGVkZWYgYmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VDbGFzczsKLX07Ci19ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Ci19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTdmOWNiZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLWJvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VQcm90b3R5cGUiLAotfTsKLQotY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIHN0YXRpY2dldF9zdGF0aWNBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OnN0YXRpY19hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHN0YXRpY3NldF9zdGF0aWNBdHRyaWJ1dGUoCi0gIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6c2V0X3N0YXRpY19hdHRyaWJ1dGUodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24xKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0KLSAgU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6U3RhdGljRnVuY3Rpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpTdGF0aWNGdW5jdGlvbihhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24zKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpTdGF0aWNGdW5jdGlvbihhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb240KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMzsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzM7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAotICAgICAgY29udGV4dCwgYXJnc1sxXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzIpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgyLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTIoCi0gICAgICBjb250ZXh0LCBhcmdzWzJdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMiwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6U3RhdGljRnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAzOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmczOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAotICAgICAgY29udGV4dCwgYXJnc1syXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgc3dpdGNoKGFyZ2MpIHsKLSAgICBjYXNlKDApOiB7Ci0gICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6Ci0gICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24xKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UoMSk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzBdKTsKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKLSAgICAgICAgb2JqZWN0ID0gSlM6OlJvb3RlZE9iamVjdChjb250ZXh0LCAmYXJnLnRvT2JqZWN0KCkpOwotICAgICAgfQotICAgICAgaWYgKGFyZy5pc051bWJlcigpKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24yKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjMoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBpZiAodHJ1ZSkgewotICAgICAgICByZXR1cm4gc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlKDMpOiB7Ci0gICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6Ci0gICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgICAgIEpTOjpSb290ZWRWYWx1ZSBhcmcoY29udGV4dCwgYXJnc1syXSk7Ci0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7Ci0gICAgICAgIG9iamVjdCA9IEpTOjpSb290ZWRPYmplY3QoY29udGV4dCwgJmFyZy50b09iamVjdCgpKTsKLSAgICAgIH0KLSAgICAgIGlmIChhcmcuaXNPYmplY3QoKSA/IHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSA6Ci0gICAgICAgICAgICAgIGZhbHNlKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb241KAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjQoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncwotICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gU3RhdGljIHJlYWQvd3JpdGUgYXR0cmlidXRlLgotICAgICAgInN0YXRpY0F0dHJpYnV0ZSIsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIHsgeyAmc3RhdGljZ2V0X3N0YXRpY0F0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gICAgICB7IHsgJnN0YXRpY3NldF9zdGF0aWNBdHRyaWJ1dGUsIE5VTEwgfSB9LAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZOU1BFQygKLSAgICAgICJzdGF0aWNGdW5jdGlvbiIsIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiU3RhdGljUHJvcGVydGllc0ludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5MzE3ZjUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzYjgyMS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzODcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLQotYm9vbCBTdHJpbmdpZmllcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotCi0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGlmICghaW1wbCkgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oY29iYWx0OjpzY3JpcHQ6OmtTdHJpbmdpZmllclByb2JsZW0pOwotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgc3RyaW5naWZpZWQgPSBpbXBsLT5Bbm9ueW1vdXNTdHJpbmdpZmllcigpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LAotICAgICAgSlNfTmV3U3RyaW5nQ29weU4oY29udGV4dCwgc3RyaW5naWZpZWQuY19zdHIoKSwgc3RyaW5naWZpZWQubGVuZ3RoKCkpKTsKLSAgYXJncy5ydmFsKCkuc2V0KEpTOjpTdHJpbmdWYWx1ZShyb290ZWRfc3RyaW5nKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoInRvU3RyaW5nIiwgU3RyaW5naWZpZXIsIE5VTEwsIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiNmY5MWEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4NmZkNmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZVByb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGdldF90aGVTdHJpbmdpZmllckF0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT50aGVfc3RyaW5naWZpZXJfYXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdGhlX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWJvb2wgU3RyaW5naWZpZXIoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLQotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpLmdldCgpOwotICBpZiAoIWltcGwpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKGNvYmFsdDo6c2NyaXB0OjprU3RyaW5naWZpZXJQcm9ibGVtKTsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN0ZDo6c3RyaW5nIHN0cmluZ2lmaWVkID0gaW1wbC0+dGhlX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZSgpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LAotICAgICAgSlNfTmV3U3RyaW5nQ29weU4oY29udGV4dCwgc3RyaW5naWZpZWQuY19zdHIoKSwgc3RyaW5naWZpZWQubGVuZ3RoKCkpKTsKLSAgYXJncy5ydmFsKCkuc2V0KEpTOjpTdHJpbmdWYWx1ZShyb290ZWRfc3RyaW5nKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAidGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X3RoZVN0cmluZ2lmaWVyQXR0cmlidXRlLCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF90aGVTdHJpbmdpZmllckF0dHJpYnV0ZSwgTlVMTCB9IH0sCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoInRvU3RyaW5nIiwgU3RyaW5naWZpZXIsIE5VTEwsIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy8gc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzMjFkYWUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU1YTg0MS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlIiwKLSAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQotICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKLSAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIiwKLSAgICAwLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgTlVMTCwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICAmSGFzSW5zdGFuY2UsCi0gICAgTlVMTCwKLX07Ci0KLWJvb2wgZmNuX3RoZVN0cmluZ2lmaWVyT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5UaGVTdHJpbmdpZmllck9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotYm9vbCBTdHJpbmdpZmllcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotCi0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGlmICghaW1wbCkgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oY29iYWx0OjpzY3JpcHQ6OmtTdHJpbmdpZmllclByb2JsZW0pOwotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgc3RyaW5naWZpZWQgPSBpbXBsLT5UaGVTdHJpbmdpZmllck9wZXJhdGlvbigpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LAotICAgICAgSlNfTmV3U3RyaW5nQ29weU4oY29udGV4dCwgc3RyaW5naWZpZWQuY19zdHIoKSwgc3RyaW5naWZpZWQubGVuZ3RoKCkpKTsKLSAgYXJncy5ydmFsKCkuc2V0KEpTOjpTdHJpbmdWYWx1ZShyb290ZWRfc3RyaW5nKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GTlNQRUMoInRvU3RyaW5nIiwgU3RyaW5naWZpZXIsIE5VTEwsIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAidGhlU3RyaW5naWZpZXJPcGVyYXRpb24iLCBmY25fdGhlU3RyaW5naWZpZXJPcGVyYXRpb24sIE5VTEwsCi0gICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCi0gICk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUsCi0gICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0KLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NWYzOTdjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzVGFyZ2V0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1RhcmdldEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTg1YWU5YS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzVGFyZ2V0SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDM0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzVGFyZ2V0SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VGFyZ2V0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNUYXJnZXRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzVGFyZ2V0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNUYXJnZXRJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNUYXJnZXRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1RhcmdldEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzVGFyZ2V0SW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNUYXJnZXRJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJUYXJnZXRJbnRlcmZhY2UiLAotICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAotICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQotICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKLSAgICBOVUxMLCAgLy8gcmVzb2x2ZQotICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCi0gICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCi0gICAgTlVMTCwgIC8vIGNvbnN0cnVjdAotICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQotfTsKLQotY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiVGFyZ2V0SW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJUYXJnZXRJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCi0gICAgMCwKLSAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKLSAgICBOVUxMLCAgLy8gZW51bWVyYXRlCi0gICAgTlVMTCwgIC8vIHJlc29sdmUKLSAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQotICAgIE5VTEwsICAvLyBmaW5hbGl6ZQotICAgIE5VTEwsICAvLyBjYWxsCi0gICAgJkhhc0luc3RhbmNlLAotICAgIE5VTEwsCi19OwotCi1ib29sIGZjbl9pbXBsZW1lbnRlZEludGVyZmFjZUZ1bmN0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxUYXJnZXRJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBUYXJnZXRJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VGFyZ2V0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPkltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZmNuX3BhcnRpYWxJbnRlcmZhY2VGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VGFyZ2V0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVGFyZ2V0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFRhcmdldEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5QYXJ0aWFsSW50ZXJmYWNlRnVuY3Rpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgImltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24iLCBmY25faW1wbGVtZW50ZWRJbnRlcmZhY2VGdW5jdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAicGFydGlhbEludGVyZmFjZUZ1bmN0aW9uIiwgZmNuX3BhcnRpYWxJbnRlcmZhY2VGdW5jdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJUYXJnZXRJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKLSAgICAgIE5VTEwsIE5VTEwpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKLSAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vLyBzdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNUYXJnZXRJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1RhcmdldEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1RhcmdldEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1RhcmdldEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDA3NTMzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNUYXJnZXRJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzVGFyZ2V0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNUYXJnZXRJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGFyZ2V0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNUYXJnZXRJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzVGFyZ2V0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNVbmlvblR5cGVzSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg2MWI1OTAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNVbmlvblR5cGVzSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotI2luY2x1ZGUgIk1vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNCYXNlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpVbmlvblR5cGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNVbmlvblR5cGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QmFzZUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1ib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiVW5pb25UeXBlc0ludGVyZmFjZSIsCi0gICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCi19OwotCi1jb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJVbmlvblR5cGVzSW50ZXJmYWNlUHJvdG90eXBlIiwKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0gewotICAgICJVbmlvblR5cGVzSW50ZXJmYWNlQ29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotYm9vbCBnZXRfdW5pb25Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT51bmlvbl9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X3VuaW9uUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c2NyaXB0OjpVbmlvblR5cGU0PHN0ZDo6c3RyaW5nLCBib29sLCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4sIGludDMyX3QgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF91bmlvbl9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGdldF91bmlvbldpdGhOdWxsYWJsZU1lbWJlclByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnVuaW9uX3dpdGhfbnVsbGFibGVfbWVtYmVyX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLQotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzY3JpcHQ6OlVuaW9uVHlwZTI8ZG91YmxlLCBzdGQ6OnN0cmluZyA+ID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5pb25fd2l0aF9udWxsYWJsZV9tZW1iZXJfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfbnVsbGFibGVVbmlvblByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX3VuaW9uX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfbnVsbGFibGVVbmlvblByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHNjcmlwdDo6VW5pb25UeXBlMjxkb3VibGUsIHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfbnVsbGFibGVfdW5pb25fcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBnZXRfdW5pb25CYXNlUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+dW5pb25fYmFzZV9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgc2V0X3VuaW9uQmFzZVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotCi0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHNjcmlwdDo6VW5pb25UeXBlMjxzY29wZWRfcmVmcHRyPEJhc2VJbnRlcmZhY2U+LCBzdGQ6OnN0cmluZyA+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3VuaW9uX2Jhc2VfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAidW5pb25Qcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfdW5pb25Qcm9wZXJ0eSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfdW5pb25Qcm9wZXJ0eSwgTlVMTCB9IH0sCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAidW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gICAgeyB7ICZzZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAibnVsbGFibGVVbmlvblByb3BlcnR5IiwKLSAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICB7IHsgJmdldF9udWxsYWJsZVVuaW9uUHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X251bGxhYmxlVW5pb25Qcm9wZXJ0eSwgTlVMTCB9IH0sCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAidW5pb25CYXNlUHJvcGVydHkiLAotICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgIHsgeyAmZ2V0X3VuaW9uQmFzZVByb3BlcnR5LCBOVUxMIH0gfSwKLSAgICB7IHsgJnNldF91bmlvbkJhc2VQcm9wZXJ0eSwgTlVMTCB9IH0sCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKLSAgKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKLSAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLQotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJVbmlvblR5cGVzSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCi0gICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBOVUxMLCBOVUxMKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAotICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzVW5pb25UeXBlc0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzZmZThmOS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzVW5pb25UeXBlc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1dpbmRvdy5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvTW96anNXaW5kb3cuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NGI4MDMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1dpbmRvdy5jYworKysgL2Rldi9udWxsCkBAIC0xLDk5MCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc1dpbmRvdy5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQmFzZUludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0NvbnN0YW50c0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQ29uc3RydWN0b3JJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRGVyaXZlZEludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRGlzYWJsZWRJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuaCIKLSNpbmNsdWRlICJNb3pqc0ltcGxlbWVudGVkSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNOYW1lZEdldHRlckludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzU2VxdWVuY2VVc2VyLmgiCi0jaW5jbHVkZSAiTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc1RhcmdldEludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzVW5pb25UeXBlc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzV2luZG93LmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iYXNlX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jvb2xlYW5fdHlwZV90ZXN0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25kaXRpb25hbF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rlcml2ZWRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGlzYWJsZWRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uc19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbXBsZW1lbnRlZF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcXVlbmNlX3VzZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy90YXJnZXRfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvd2luZG93LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpXaW5kb3c7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1dpbmRvdzsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkJhc2VJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U7Ci0jaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uZGl0aW9uYWxJbnRlcmZhY2U7Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0YW50c0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RE9NU3RyaW5nVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpEZXJpdmVkSW50ZXJmYWNlOwotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRpc2FibGVkSW50ZXJmYWNlOwotI2VuZGlmICAvLyBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFbnVtZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbk9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbnNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHZXRPcGFxdWVSb290SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2xvYmFsSW50ZXJmYWNlUGFyZW50OwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW1wbGVtZW50ZWRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOwotI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U7Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RhbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdHJ1Y3RvckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkSW50ZXJmYWNlOwotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGlzYWJsZWRJbnRlcmZhY2U7Ci0jZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRW51bWVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXhjZXB0aW9uc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW1wbGVtZW50ZWRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTZXF1ZW5jZVVzZXI7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzVGFyZ2V0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNVbmlvblR5cGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNXaW5kb3c7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TmFtZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5vQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6UHV0Rm9yd2FyZHNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTZXF1ZW5jZVVzZXI7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VGFyZ2V0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VW5pb25UeXBlc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OldpbmRvdzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotSlNPYmplY3QqIER1bW15RnVuY3RvcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc1dpbmRvd0hhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzV2luZG93SGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzV2luZG93SGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNXaW5kb3dIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1dpbmRvd0hhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzV2luZG93OjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiV2luZG93IiwKLSAgICBKU0NMQVNTX0dMT0JBTF9GTEFHUyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCi0gICAgTlVMTCwgIC8vIGNhbGwKLSAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKLSAgICBOVUxMLCAgLy8gY29uc3RydWN0Ci0gICAgSlNfR2xvYmFsT2JqZWN0VHJhY2VIb29rLCAgLy8gdHJhY2UKLX07Ci0KLWNvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7Ci0gICAgIldpbmRvd1Byb3RvdHlwZSIsCi19OwotCi1jb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKLSAgICAiV2luZG93Q29uc3RydWN0b3IiLAotICAgIDAsCi0gICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGdldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIHNldFByb3BlcnR5Ci0gICAgTlVMTCwgIC8vIGVudW1lcmF0ZQotICAgIE5VTEwsICAvLyByZXNvbHZlCi0gICAgTlVMTCwgIC8vIG1heVJlc29sdmUKLSAgICBOVUxMLCAgLy8gZmluYWxpemUKLSAgICBOVUxMLCAgLy8gY2FsbAotICAgICZIYXNJbnN0YW5jZSwKLSAgICBOVUxMLAotfTsKLQotYm9vbCBnZXRfd2luZG93UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8V2luZG93PigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgV2luZG93KiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFdpbmRvdz4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+d2luZG93X3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBzZXRfd2luZG93UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0KLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotCi0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFdpbmRvdyogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfd2luZG93X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgZ2V0X3dpbmRvdygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOwotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxXaW5kb3c+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBXaW5kb3cqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8V2luZG93PigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT53aW5kb3coKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWJvb2wgZmNuX2dldFN0YWNrVHJhY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFdpbmRvdyogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRTdGFja1RyYWNlKGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudC0+R2V0U3RhY2tUcmFjZSgpKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIGZjbl93aW5kb3dPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFdpbmRvdyogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+V2luZG93T3BlcmF0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICJ3aW5kb3dQcm9wZXJ0eSIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfd2luZG93UHJvcGVydHksIE5VTEwgfSB9LAotICAgIHsgeyAmc2V0X3dpbmRvd1Byb3BlcnR5LCBOVUxMIH0gfSwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgIndpbmRvdyIsCi0gICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgeyB7ICZnZXRfd2luZG93LCBOVUxMIH0gfSwKLSAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRk5TUEVDKAotICAgICAgImdldFN0YWNrVHJhY2UiLCBmY25fZ2V0U3RhY2tUcmFjZSwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GTlNQRUMoCi0gICAgICAid2luZG93T3BlcmF0aW9uIiwgZmNuX3dpbmRvd09wZXJhdGlvbiwgTlVMTCwKLSAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgYmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQotICApOwotCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfcHJvdG90eXBlLAotICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotCi0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIldpbmRvdyI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAotICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgTlVMTCwgTlVMTCk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotSlNPYmplY3QqIE1vempzV2luZG93OjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX05ld0dsb2JhbE9iamVjdChjb250ZXh0LAotICAgICAgICAgICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBOVUxMLAotICAgICAgICAgIEpTOjpGaXJlT25OZXdHbG9iYWxIb29rLAotICAgICAgICAgIEpTOjpDb21wYXJ0bWVudE9wdGlvbnMoKS5zZXRUcmFjZShXcmFwcGVyUHJpdmF0ZTo6VHJhY2UpKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICAvLyBJbml0aWFsaXplIHN0YW5kYXJkIEpTIGNvbnN0cnVjdG9ycyBwcm90b3R5cGVzIGFuZCB0b3AtbGV2ZWwgZnVuY3Rpb25zIHN1Y2gKLSAgLy8gYXMgT2JqZWN0LCBpc05hbiwgZXRjLgotICBKU0F1dG9Db21wYXJ0bWVudCBhdXRvX2NvbXBhcnRtZW50KGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICBib29sIHN1Y2Nlc3MgPSBKU19Jbml0U3RhbmRhcmRDbGFzc2VzKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc1dpbmRvdzo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTX1NldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0LCBwcm90b3R5cGUpOwotCi0gIEpTX1NldEltbXV0YWJsZVByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0LCAmc3VjY2Vzcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgb3duIHByb3BlcnRpZXMuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIGdsb2JhbF9vYmplY3QsIG93bl9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCi0gICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIGdsb2JhbF9vYmplY3QsIHByb3RvdHlwZSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0KLSAgLy8gU2V0IHRoZSBnbG9iYWwgb2JqZWN0IHByb3h5IHBvaW50ZXIsIHNvIHdlIGNhbiBhY2Nlc3MgdGhlIHN0YW5kYXJkIGNsYXNzZXMKLSAgLy8gc3VjaCBhcyB0aGUgYmFzZSBPYmplY3QgcHJvdG90eXBlIHdoZW4gbG9va2luZyB1cCBvdXIgcHJvdG90eXBlLgotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgZ2xvYmFsX2Vudmlyb25tZW50LT5TZXRHbG9iYWxPYmplY3RQcm94eUFuZFdyYXBwZXIocHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLS8vIHN0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNXaW5kb3c6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1dpbmRvdzo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzV2luZG93OjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi0KLW5hbWVzcGFjZSBzY3JpcHQgewotCi10ZW1wbGF0ZTw+Ci12b2lkIEdsb2JhbEVudmlyb25tZW50OjpDcmVhdGVHbG9iYWxPYmplY3Q8V2luZG93PigKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPFdpbmRvdz4mIGdsb2JhbF9pbnRlcmZhY2UsCi0gICAgRW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogbW96anNfZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPih0aGlzKTsKLSAgSlNDb250ZXh0KiBjb250ZXh0ID0gbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LT5jb250ZXh0KCk7Ci0KLSAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dCk7Ci0gIE1vempzV2luZG93OjpDcmVhdGVQcm94eSgKLSAgICAgIGNvbnRleHQsIGdsb2JhbF9pbnRlcmZhY2UpOwotICBtb3pqc19nbG9iYWxfZW52aXJvbm1lbnQtPlNldEVudmlyb25tZW50U2V0dGluZ3MoZW52aXJvbm1lbnRfc2V0dGluZ3MpOwotCi0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPQotICAgICAgbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBBcmJpdHJhcnlJbnRlcmZhY2U6OkFyYml0cmFyeUludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQmFzZUludGVyZmFjZTo6QmFzZUludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNCYXNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQmFzZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQ29uZGl0aW9uYWxJbnRlcmZhY2U6OkNvbmRpdGlvbmFsSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBDb25zdGFudHNJbnRlcmZhY2U6OkNvbnN0YW50c0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNDb25zdGFudHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNDb25zdGFudHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNvbnN0cnVjdG9ySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBEZXJpdmVkSW50ZXJmYWNlOjpEZXJpdmVkSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNEZXJpdmVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBEaXNhYmxlZEludGVyZmFjZTo6RGlzYWJsZWRJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNEaXNhYmxlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpFbnVtZXJhdGlvbkludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBFeGNlcHRpb25zSW50ZXJmYWNlOjpFeGNlcHRpb25zSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6RXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0T3BhcXVlUm9vdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6Okdsb2JhbEludGVyZmFjZVBhcmVudFdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgSW1wbGVtZW50ZWRJbnRlcmZhY2U6OkltcGxlbWVudGVkSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0ltcGxlbWVudGVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzSW1wbGVtZW50ZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgSW5kZXhlZEdldHRlckludGVyZmFjZTo6SW5kZXhlZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U6Ok5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgTmFtZWRHZXR0ZXJJbnRlcmZhY2U6Ok5hbWVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE5vQ29uc3RydWN0b3JJbnRlcmZhY2U6Ok5vQ29uc3RydWN0b3JJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6Ok5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6Ok51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6Ok9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6Ok9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlB1dEZvcndhcmRzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgU2VxdWVuY2VVc2VyOjpTZXF1ZW5jZVVzZXJXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzU2VxdWVuY2VVc2VyOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OlN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OlN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgVGFyZ2V0SW50ZXJmYWNlOjpUYXJnZXRJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzVGFyZ2V0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzVGFyZ2V0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFVuaW9uVHlwZXNJbnRlcmZhY2U6OlVuaW9uVHlwZXNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgV2luZG93OjpXaW5kb3dXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKER1bW15RnVuY3RvciksCi0gICAgICBiYXNlOjpCaW5kKE1vempzV2luZG93OjpQcm90b3R5cGVDbGFzcykpOwotCi19Ci0KLS8vIE1TVlMgY29tcGlsZXIgZG9lcyBub3QgbmVlZCB0aGlzIGV4cGxpY2l0IGluc3RhbnRpYXRpb24sIGFuZCBnZW5lcmF0ZXMgYQotLy8gY29tcGlsZXIgZXJyb3IuCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpCi0vLyBFeHBsaWNpdGx5IGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdGVtcGxhdGUgdHlwZSBXaW5kb3cKLS8vIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgbGluayBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSB0aGUgdGVtcGxhdGUKLS8vIGluc3RhbnRpYXRpb24uCi10ZW1wbGF0ZQotdm9pZCBHbG9iYWxFbnZpcm9ubWVudDo6Q3JlYXRlR2xvYmFsT2JqZWN0PFdpbmRvdz4oCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxXaW5kb3c+JiBnbG9iYWxfaW50ZXJmYWNlLAotICAgIEVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzKTsKLSNlbmRpZgotCi19ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Ci19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzV2luZG93LmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL01vempzV2luZG93LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMwYzQ4MDIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9Nb3pqc1dpbmRvdy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNXaW5kb3dfaAotI2RlZmluZSBNb3pqc1dpbmRvd19oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3dpbmRvdy5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNXaW5kb3cgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzV2luZG93X2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45N2Y3ZjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDk3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitib29sIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOworfQorCit2b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCB1aW50MzJfdCBrTnVtSW5kZXhlZFByb3BlcnRpZXMgPSBpbXBsLT5sZW5ndGgoKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtOdW1JbmRleGVkUHJvcGVydGllczsgKytpKSB7CisgICAgcHJvcGVydGllcy0+YXBwZW5kKElOVF9UT19KU0lEKGkpKTsKKyAgfQorfQorCitib29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+QW5vbnltb3VzSW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBTZXRJbmRleGVkUHJvcGVydHkoCisgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlM6Ok9iamVjdE9wUmVzdWx0JiBvYmplY3Rfb3BfcmVzdWx0KSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICB1aW50MzJfdCBpbmRleDsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkFub255bW91c0luZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2NsYXNzIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCisgIEdldEluZGV4ZWRQcm9wZXJ0eSwKKyAgU2V0SW5kZXhlZFByb3BlcnR5LAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGdldF9sZW5ndGgoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAibGVuZ3RoIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9sZW5ndGgsIE5VTEwgfSB9LAorICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJmNTUwM2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWNjNzE5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0NTAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOworfQorCit2b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKKyAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKK30KKworYm9vbCBHZXROYW1lZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkFub255bW91c05hbWVkR2V0dGVyKHByb3BlcnR5X25hbWUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKKyAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+QW5vbnltb3VzTmFtZWRTZXR0ZXIocHJvcGVydHlfbmFtZSwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIG9iamVjdF9vcF9yZXN1bHQuc3VjY2VlZCgpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitjbGFzcyBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eSwKKyAgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMsCisgIEdldE5hbWVkUHJvcGVydHksCisgIFNldE5hbWVkUHJvcGVydHksCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTAzZWQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJmN2FlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTk0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgcmV0dXJuIGltcGwtPkNhblF1ZXJ5TmFtZWRQcm9wZXJ0eShwcm9wZXJ0eV9uYW1lKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKKyAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKK30KKworYm9vbCBHZXROYW1lZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+QW5vbnltb3VzTmFtZWRHZXR0ZXIocHJvcGVydHlfbmFtZSksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBTZXROYW1lZFByb3BlcnR5KAorICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTOjpPYmplY3RPcFJlc3VsdCYgb2JqZWN0X29wX3Jlc3VsdCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkFub255bW91c05hbWVkU2V0dGVyKHByb3BlcnR5X25hbWUsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBvYmplY3Rfb3BfcmVzdWx0LnN1Y2NlZWQoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgcmV0dXJuIGluZGV4IDwgaW1wbC0+bGVuZ3RoKCk7Cit9CisKK3ZvaWQgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCB1aW50MzJfdCBrTnVtSW5kZXhlZFByb3BlcnRpZXMgPSBpbXBsLT5sZW5ndGgoKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtOdW1JbmRleGVkUHJvcGVydGllczsgKytpKSB7CisgICAgcHJvcGVydGllcy0+YXBwZW5kKElOVF9UT19KU0lEKGkpKTsKKyAgfQorfQorCitib29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHVpbnQzMl90IGluZGV4OworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkFub255bW91c0luZGV4ZWRHZXR0ZXIoaW5kZXgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgU2V0SW5kZXhlZFByb3BlcnR5KAorICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTOjpPYmplY3RPcFJlc3VsdCYgb2JqZWN0X29wX3Jlc3VsdCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHVpbnQzMl90IGluZGV4OworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+QW5vbnltb3VzSW5kZXhlZFNldHRlcihpbmRleCwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBvYmplY3Rfb3BfcmVzdWx0LnN1Y2NlZWQoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworY2xhc3MgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzLAorICBHZXROYW1lZFByb3BlcnR5LAorICBTZXROYW1lZFByb3BlcnR5LAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5LAorICBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzLAorICBHZXRJbmRleGVkUHJvcGVydHksCisgIFNldEluZGV4ZWRQcm9wZXJ0eSwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgTlVMTCwKK307CisKK2Jvb2wgZ2V0X2xlbmd0aCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bGVuZ3RoKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgImxlbmd0aCIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbGVuZ3RoLCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdmZjliZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYXJiaXRyYXJ5X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYXJiaXRyYXJ5X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODgzZjNlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTIxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNBcmJpdHJhcnlJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0FyYml0cmFyeUludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0FyYml0cmFyeUludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQXJiaXRyYXJ5SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNBcmJpdHJhcnlJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Citib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJBcmJpdHJhcnlJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQXJiaXRyYXJ5SW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJBcmJpdHJhcnlJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIENvbnN0cnVjdG9yLAorfTsKKworYm9vbCBnZXRfYXJiaXRyYXJ5UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFyYml0cmFyeUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFyYml0cmFyeUludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBcmJpdHJhcnlJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmFyYml0cmFyeV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X2FyYml0cmFyeVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQXJiaXRyYXJ5SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFyYml0cmFyeUludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9hcmJpdHJhcnlfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fYXJiaXRyYXJ5RnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBcmJpdHJhcnlJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QXJiaXRyYXJ5SW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkFyYml0cmFyeUZ1bmN0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICJhcmJpdHJhcnlQcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfYXJiaXRyYXJ5UHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X2FyYml0cmFyeVByb3BlcnR5LCBOVUxMIH0gfSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJhcmJpdHJhcnlGdW5jdGlvbiIsIGZjbl9hcmJpdHJhcnlGdW5jdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJBcmJpdHJhcnlJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgorICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOworICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAorICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworCisgIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KKyAgICAgIG5ldyBBcmJpdHJhcnlJbnRlcmZhY2UoKTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOworICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOworICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QocmVzdWx0X3ZhbHVlLnRvT2JqZWN0KCkpOworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYXJiaXRyYXJ5X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjY0MjJkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYXJiaXRyYXJ5X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNBcmJpdHJhcnlJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNBcmJpdHJhcnlJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYmFzZV9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyMjE1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDc0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkJhc2VJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Jhc2VJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNCYXNlSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNCYXNlSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQmFzZUludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQmFzZUludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQmFzZUludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0Jhc2VJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJCYXNlSW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkJhc2VJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkJhc2VJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIENvbnN0cnVjdG9yLAorfTsKKworYm9vbCBnZXRfYmFzZUF0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Jhc2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJhc2VJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBCYXNlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJhc2VJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmJhc2VfYXR0cmlidXRlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitib29sIGZjbl9iYXNlT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Jhc2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJhc2VJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBCYXNlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJhc2VJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+QmFzZU9wZXJhdGlvbigpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJiYXNlQXR0cmlidXRlIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9iYXNlQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgImJhc2VPcGVyYXRpb24iLCBmY25fYmFzZU9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJCYXNlSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KKyAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKKyAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsIGxlbmd0aF92YWx1ZSwKKyAgICAgIEpTUFJPUF9SRUFET05MWSwgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNCYXNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQmFzZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQmFzZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQmFzZUludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisKKyAgc2NvcGVkX3JlZnB0cjxCYXNlSW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KKyAgICAgIG5ldyBCYXNlSW50ZXJmYWNlKCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGU0ZGYyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYmFzZV9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0Jhc2VJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Jhc2VJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQmFzZUludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNCYXNlSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjNhZTI1ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTczIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfYm9vbGVhblByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5ib29sZWFuX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfYm9vbGVhblByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2Jvb2xlYW5fcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fYm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5Cb29sZWFuQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9ib29sZWFuUmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+Qm9vbGVhblJldHVybk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgImJvb2xlYW5Qcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfYm9vbGVhblByb3BlcnR5LCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9ib29sZWFuUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgImJvb2xlYW5Bcmd1bWVudE9wZXJhdGlvbiIsIGZjbl9ib29sZWFuQXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgImJvb2xlYW5SZXR1cm5PcGVyYXRpb24iLCBmY25fYm9vbGVhblJldHVybk9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjkxZjZjZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRlMjZhNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDg4OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgTlVMTCwKK307CisKK2Jvb2wgZ2V0X2NhbGxiYWNrQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+Y2FsbGJhY2tfYXR0cmlidXRlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfY2FsbGJhY2tBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpWb2lkRnVuY3Rpb24gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfY2FsbGJhY2tfYXR0cmlidXRlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X251bGxhYmxlQ2FsbGJhY2tBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9jYWxsYmFja19hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9udWxsYWJsZUNhbGxiYWNrQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9udWxsYWJsZV9jYWxsYmFja19hdHRyaWJ1dGUodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBjYjsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmNiKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5UYWtlc0Z1bmN0aW9uVGhhdFJldHVybnNTdHJpbmcoY2IpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMgPjo6Q29udmVyc2lvblR5cGUgY2I7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZjYik7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+VGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMoY2IpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIgPjo6Q29udmVyc2lvblR5cGUgY2I7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZjYik7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+VGFrZXNGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIoY2IpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkZ1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzID46OkNvbnZlcnNpb25UeXBlIGNiOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlRha2VzRnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMoY2IpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdGFrZXNWb2lkRnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpWb2lkRnVuY3Rpb24gPjo6Q29udmVyc2lvblR5cGUgY2I7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZjYik7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+VGFrZXNWb2lkRnVuY3Rpb24oY2IpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiY2FsbGJhY2tBdHRyaWJ1dGUiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X2NhbGxiYWNrQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9jYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAibnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GTlNQRUMoCisgICAgICAidGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nIiwgZmNuX3Rha2VzRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZywgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAidGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMiLCBmY25fdGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMsIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyIiwgZmNuX3Rha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyLCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJ0YWtlc0Z1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzIiwgZmNuX3Rha2VzRnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMsIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInRha2VzVm9pZEZ1bmN0aW9uIiwgZmNuX3Rha2VzVm9pZEZ1bmN0aW9uLCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5YmM0ZjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZV9oCisjZGVmaW5lIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19mdW5jdGlvbl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTEyYzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTcxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGdldF9jYWxsYmFja0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5jYWxsYmFja19hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9jYWxsYmFja0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxDYWxsYmFja0ludGVyZmFjZVRyYWl0czxTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfY2FsbGJhY2tfYXR0cmlidXRlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3JlZ2lzdGVyQ2FsbGJhY2soCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM8U2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlID4gPjo6Q29udmVyc2lvblR5cGUgY2FsbGJhY2tfaW50ZXJmYWNlOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2FsbGJhY2tfaW50ZXJmYWNlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5SZWdpc3RlckNhbGxiYWNrKGNhbGxiYWNrX2ludGVyZmFjZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9zb21lT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPlNvbWVPcGVyYXRpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgImNhbGxiYWNrQXR0cmlidXRlIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9jYWxsYmFja0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfY2FsbGJhY2tBdHRyaWJ1dGUsIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgInJlZ2lzdGVyQ2FsbGJhY2siLCBmY25fcmVnaXN0ZXJDYWxsYmFjaywgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAic29tZU9wZXJhdGlvbiIsIGZjbl9zb21lT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTQ2ZTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZV9oCisjZGVmaW5lIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgwZjM5MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDY2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uZGl0aW9uYWxJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDb25kaXRpb25hbEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJDb25kaXRpb25hbEludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJDb25kaXRpb25hbEludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQ29uZGl0aW9uYWxJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCitib29sIGdldF9lbmFibGVkQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmVuYWJsZWRfYXR0cmlidXRlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfZW5hYmxlZEF0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDb25kaXRpb25hbEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25kaXRpb25hbEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2VuYWJsZWRfYXR0cmlidXRlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKyNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCitib29sIGdldF9kaXNhYmxlZEF0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5kaXNhYmxlZF9hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9kaXNhYmxlZEF0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDb25kaXRpb25hbEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25kaXRpb25hbEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2Rpc2FibGVkX2F0dHJpYnV0ZSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisjZW5kaWYgIC8vIE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQorI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQorYm9vbCBmY25fZGlzYWJsZWRPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+RGlzYWJsZWRPcGVyYXRpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKyNlbmRpZiAgLy8gTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCitib29sIGZjbl9lbmFibGVkT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkVuYWJsZWRPcGVyYXRpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKyNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICJlbmFibGVkQXR0cmlidXRlIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9lbmFibGVkQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9lbmFibGVkQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgfSwKKyNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiZGlzYWJsZWRBdHRyaWJ1dGUiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X2Rpc2FibGVkQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9kaXNhYmxlZEF0dHJpYnV0ZSwgTlVMTCB9IH0sCisgIH0sCisjZW5kaWYgIC8vIE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKworI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQorCisgIEpTX0ZOU1BFQygKKyAgICAgICJkaXNhYmxlZE9wZXJhdGlvbiIsIGZjbl9kaXNhYmxlZE9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorI2VuZGlmICAvLyBOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKKworI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQorCisgIEpTX0ZOU1BFQygKKyAgICAgICJlbmFibGVkT3BlcmF0aW9uIiwgZmNuX2VuYWJsZWRPcGVyYXRpb24sIE5VTEwsCisgICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkNvbmRpdGlvbmFsSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25kaXRpb25hbF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMWE4NGM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25kaXRpb25hbF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNDb25kaXRpb25hbEludGVyZmFjZV9oCisKKyNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25kaXRpb25hbF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKKworI2VuZGlmICAvLyBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RhbnRzX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RhbnRzX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjY0NTQyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdGFudHNfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDEwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdGFudHNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RhbnRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdGFudHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNDb25zdGFudHNJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0NvbnN0YW50c0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NvbnN0YW50c0ludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQ29uc3RhbnRzSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDb25zdGFudHNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgZ2V0X0lOVEVHRVJfQ09OU1RBTlQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIENPTVBJTEVfQVNTRVJUKENvbnN0YW50c0ludGVyZmFjZTo6a0ludGVnZXJDb25zdGFudCA9PSA1LAorICAgICAgICAgICAgICAgICBWYWx1ZUZvckNvbnN0YW50c0ludGVyZmFjZV9rSW50ZWdlckNvbnN0YW50RG9lc05vdE1hdGNoSURMKTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIDUsICZyZXN1bHRfdmFsdWUpOworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X0RPVUJMRV9DT05TVEFOVCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgRENIRUNLX0VRKDIuNzE4LCBDb25zdGFudHNJbnRlcmZhY2U6OmtEb3VibGVDb25zdGFudCkgPDwKKyAgICAgICJUaGUgdmFsdWUgZm9yIENvbnN0YW50c0ludGVyZmFjZTo6a0RvdWJsZUNvbnN0YW50IGRvZXMgbm90IG1hdGNoICIKKyAgICAgICJ0aGUgdmFsdWUgaW4gdGhlIGludGVyZmFjZSBkZWZpbml0aW9uLiI7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCAyLjcxOCwgJnJlc3VsdF92YWx1ZSk7CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQ29uc3RhbnRzSW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkNvbnN0YW50c0ludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQ29uc3RhbnRzSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsKKyAgICAgICJJTlRFR0VSX0NPTlNUQU5UIiwKKyAgICAgIEpTUFJPUF9QRVJNQU5FTlQgfCBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIHsgeyAmZ2V0X0lOVEVHRVJfQ09OU1RBTlQsIE5VTEwgfSB9LAorICAgICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKQorICB9LAorICB7CisgICAgICAiRE9VQkxFX0NPTlNUQU5UIiwKKyAgICAgIEpTUFJPUF9QRVJNQU5FTlQgfCBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIHsgeyAmZ2V0X0RPVUJMRV9DT05TVEFOVCwgTlVMTCB9IH0sCisgICAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICB7CisgICAgIklOVEVHRVJfQ09OU1RBTlQiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X0lOVEVHRVJfQ09OU1RBTlQsIE5VTEwgfSB9LAorICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCisgIH0sCisKKyAgeworICAgICJET1VCTEVfQ09OU1RBTlQiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X0RPVUJMRV9DT05TVEFOVCwgTlVMTCB9IH0sCisgICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKKyAgfSwKKworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJDb25zdGFudHNJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDb25zdGFudHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbnN0YW50c0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdGFudHNfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0YW50c19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWM3NWMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdGFudHNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNDb25zdGFudHNJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0NvbnN0YW50c0ludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0NvbnN0YW50c0ludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNDb25zdGFudHNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjYzNmQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0MzggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdHJ1Y3RvckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Citib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkNvbnN0cnVjdG9ySW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkNvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJDb25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgQ29uc3RydWN0b3IsCit9OworCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkNvbnN0cnVjdG9ySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KKyAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKKyAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsIGxlbmd0aF92YWx1ZSwKKyAgICAgIEpTUFJPUF9SRUFET05MWSwgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK2Jvb2wgQ29uc3RydWN0b3IxKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPENvbnN0cnVjdG9ySW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KKyAgICAgIG5ldyBDb25zdHJ1Y3RvckludGVyZmFjZSgpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7CisgIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7CisgIGFyZ3MucnZhbCgpLnNldE9iamVjdChyZXN1bHRfdmFsdWUudG9PYmplY3QoKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIENvbnN0cnVjdG9yMigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNjb3BlZF9yZWZwdHI8Q29uc3RydWN0b3JJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IENvbnN0cnVjdG9ySW50ZXJmYWNlKGFyZyk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIHN3aXRjaChhcmdjKSB7CisgICAgY2FzZSgwKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gQ29uc3RydWN0b3IxKAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UoMSk6IHsKKyAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKKyAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIENvbnN0cnVjdG9yMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCisgIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3JfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlMDQwN2UKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNDb25zdHJ1Y3RvckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjYWQ1YmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDU2OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Citib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIENvbnN0cnVjdG9yLAorfTsKKworYm9vbCBnZXRfbG9uZ0FyZygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bG9uZ19hcmcoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2Jvb2wgZ2V0X2Jvb2xlYW5BcmcoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmJvb2xlYW5fYXJnKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitib29sIGdldF9zdHJpbmdBcmcoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnN0cmluZ19hcmcoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAibG9uZ0FyZyIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbG9uZ0FyZywgTlVMTCB9IH0sCisgICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKKyAgfSwKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgImJvb2xlYW5BcmciLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X2Jvb2xlYW5BcmcsIE5VTEwgfSB9LAorICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCisgIH0sCisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJzdHJpbmdBcmciLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3N0cmluZ0FyZywgTlVMTCB9IH0sCisgICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkNvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigyKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLCBsZW5ndGhfdmFsdWUsCisgICAgICBKU1BST1BfUkVBRE9OTFksIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKKyAgLy8gT3B0aW9uYWwgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBkZWZhdWx0X2FyZyA9CisgICAgICAiZGVmYXVsdCI7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzIpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzaXplX3QgbnVtX3NldF9hcmd1bWVudHMgPSAzOworICBpZiAoYXJncy5sZW5ndGgoKSA+IDIpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUwKAorICAgICAgICBjb250ZXh0LCBhcmdzWzJdKTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAmZGVmYXVsdF9hcmcpOworICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgc2NvcGVkX3JlZnB0cjxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZShhcmcxLCBhcmcyLCBkZWZhdWx0X2FyZyk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lY2EwNGQ4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZV9oCisjZGVmaW5lIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNTI3ZjMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsODk4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgcmV0dXJuIGltcGwtPkNhblF1ZXJ5TmFtZWRQcm9wZXJ0eShwcm9wZXJ0eV9uYW1lKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOworICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOworfQorCitib29sIEdldE5hbWVkUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkFub255bW91c05hbWVkR2V0dGVyKHByb3BlcnR5X25hbWUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKKyAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkFub255bW91c05hbWVkU2V0dGVyKHByb3BlcnR5X25hbWUsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBvYmplY3Rfb3BfcmVzdWx0LnN1Y2NlZWQoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW5kZXggPCBpbXBsLT5sZW5ndGgoKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgeworICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7CisgIH0KK30KKworYm9vbCBHZXRJbmRleGVkUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHVpbnQzMl90IGluZGV4OworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkRlcml2ZWRJbmRleGVkR2V0dGVyKGluZGV4KSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKKyAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHVpbnQzMl90IGluZGV4OworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+RGVyaXZlZEluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gb2JqZWN0X29wX3Jlc3VsdC5zdWNjZWVkKCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2NsYXNzIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAorICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKKyAgR2V0TmFtZWRQcm9wZXJ0eSwKKyAgU2V0TmFtZWRQcm9wZXJ0eSwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCisgIEdldEluZGV4ZWRQcm9wZXJ0eSwKKyAgU2V0SW5kZXhlZFByb3BlcnR5LAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGdldF9sZW5ndGgoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2Jvb2wgZ2V0X3Byb3BlcnR5T25EZXJpdmVkQ2xhc3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5wcm9wZXJ0eV9vbl9kZXJpdmVkX2NsYXNzKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfcHJvcGVydHlPbkRlcml2ZWRDbGFzcygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfcHJvcGVydHlfb25fZGVyaXZlZF9jbGFzcyh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9kZXJpdmVkSW5kZXhlZEdldHRlcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5EZXJpdmVkSW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fZGVyaXZlZEluZGV4ZWRTZXR0ZXIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBpbmRleDsKKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5EZXJpdmVkSW5kZXhlZFNldHRlcihpbmRleCwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fb3BlcmF0aW9uT25EZXJpdmVkQ2xhc3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5PcGVyYXRpb25PbkRlcml2ZWRDbGFzcygpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJsZW5ndGgiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X2xlbmd0aCwgTlVMTCB9IH0sCisgICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICJwcm9wZXJ0eU9uRGVyaXZlZENsYXNzIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzLCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzLCBOVUxMIH0gfSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJkZXJpdmVkSW5kZXhlZEdldHRlciIsIGZjbl9kZXJpdmVkSW5kZXhlZEdldHRlciwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiZGVyaXZlZEluZGV4ZWRTZXR0ZXIiLCBmY25fZGVyaXZlZEluZGV4ZWRTZXR0ZXIsIE5VTEwsCisgICAgICAyLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgIm9wZXJhdGlvbk9uRGVyaXZlZENsYXNzIiwgZmNuX29wZXJhdGlvbk9uRGVyaXZlZENsYXNzLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOWIxNjQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJiZDIyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0NzggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rlcml2ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Citib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNEZXJpdmVkSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiRGVyaXZlZEludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJEZXJpdmVkSW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJEZXJpdmVkSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBDb25zdHJ1Y3RvciwKK307CisKK2Jvb2wgZ2V0X2Rlcml2ZWRBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5kZXJpdmVkX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworYm9vbCBmY25fZGVyaXZlZE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkSW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkRlcml2ZWRPcGVyYXRpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAiZGVyaXZlZEF0dHJpYnV0ZSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfZGVyaXZlZEF0dHJpYnV0ZSwgTlVMTCB9IH0sCisgICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJkZXJpdmVkT3BlcmF0aW9uIiwgZmNuX2Rlcml2ZWRPcGVyYXRpb24sIE5VTEwsCisgICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQmFzZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJEZXJpdmVkSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KKyAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKKyAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsIGxlbmd0aF92YWx1ZSwKKyAgICAgIEpTUFJPUF9SRUFET05MWSwgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEZXJpdmVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzRGVyaXZlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGVyaXZlZEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGVyaXZlZEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisKKyAgc2NvcGVkX3JlZnB0cjxEZXJpdmVkSW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KKyAgICAgIG5ldyBEZXJpdmVkSW50ZXJmYWNlKCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyYmQyNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Rlcml2ZWRJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNEZXJpdmVkSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Rlcml2ZWRJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGljdGlvbmFyeV9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTU1YjcwMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGljdGlvbmFyeV9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0MjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RpY3Rpb25hcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdGVzdF9kaWN0aW9uYXJ5LmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGljdGlvbmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGljdGlvbmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlRlc3REaWN0aW9uYXJ5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzRGljdGlvbmFyeUludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRGljdGlvbmFyeUludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJEaWN0aW9uYXJ5SW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkRpY3Rpb25hcnlJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkRpY3Rpb25hcnlJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGZjbl9kaWN0aW9uYXJ5T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERpY3Rpb25hcnlJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEaWN0aW9uYXJ5SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERpY3Rpb25hcnlJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8VGVzdERpY3Rpb25hcnkgPjo6Q29udmVyc2lvblR5cGUgZGljdGlvbmFyeTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmRpY3Rpb25hcnkpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkRpY3Rpb25hcnlPcGVyYXRpb24oZGljdGlvbmFyeSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJkaWN0aW9uYXJ5T3BlcmF0aW9uIiwgZmNuX2RpY3Rpb25hcnlPcGVyYXRpb24sIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiRGljdGlvbmFyeUludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzRGljdGlvbmFyeUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGljdGlvbmFyeUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGljdGlvbmFyeUludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU0ZjFkNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RpY3Rpb25hcnlfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RpY3Rpb25hcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzRGljdGlvbmFyeUludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkZmUyMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDUwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGlzYWJsZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rpc2FibGVkSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNEaXNhYmxlZEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJEaXNhYmxlZEludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJEaXNhYmxlZEludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiRGlzYWJsZWRJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGdldF9kaXNhYmxlZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERpc2FibGVkSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGlzYWJsZWRJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGlzYWJsZWRJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmRpc2FibGVkX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfZGlzYWJsZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEaXNhYmxlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGlzYWJsZWRJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEaXNhYmxlZEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEaXNhYmxlZEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2Rpc2FibGVkX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX2Rpc2FibGVkRnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERpc2FibGVkSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGlzYWJsZWRJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGlzYWJsZWRJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+RGlzYWJsZWRGdW5jdGlvbigpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiZGlzYWJsZWRQcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfZGlzYWJsZWRQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfZGlzYWJsZWRQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GTlNQRUMoCisgICAgICAiZGlzYWJsZWRGdW5jdGlvbiIsIGZjbl9kaXNhYmxlZEZ1bmN0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkRpc2FibGVkSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEaXNhYmxlZEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorI2VuZGlmICAvLyBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaXNhYmxlZF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDAyNTg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaXNhYmxlZF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDU2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNEaXNhYmxlZEludGVyZmFjZV9oCisKKyNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaXNhYmxlZF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRGlzYWJsZWRJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKKworI2VuZGlmICAvLyBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjBkN2I1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsODM1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RE9NU3RyaW5nVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiRE9NU3RyaW5nVGVzdEludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJET01TdHJpbmdUZXN0SW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJET01TdHJpbmdUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfcHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X3Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBnZXRfcmVhZE9ubHlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnJlYWRfb25seV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworYm9vbCBnZXRfcmVhZE9ubHlUb2tlblByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+cmVhZF9vbmx5X3Rva2VuX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitib29sIGdldF9udWxsSXNFbXB0eVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bnVsbF9pc19lbXB0eV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X251bGxJc0VtcHR5UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmcpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9udWxsX2lzX2VtcHR5X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X3VuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnVuZGVmaW5lZF9pc19lbXB0eV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X3VuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfdW5kZWZpbmVkX2lzX2VtcHR5X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfdW5kZWZpbmVkX2lzX2VtcHR5X3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfbnVsbGFibGVVbmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZyA+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUgfCBrQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmcpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9udWxsYWJsZV91bmRlZmluZWRfaXNfZW1wdHlfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAicHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3Byb3BlcnR5LCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9wcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJyZWFkT25seVByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9yZWFkT25seVByb3BlcnR5LCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAicmVhZE9ubHlUb2tlblByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9yZWFkT25seVRva2VuUHJvcGVydHksIE5VTEwgfSB9LAorICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAibnVsbElzRW1wdHlQcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbnVsbElzRW1wdHlQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfbnVsbElzRW1wdHlQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAidW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF91bmRlZmluZWRJc0VtcHR5UHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X3VuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAibnVsbGFibGVVbmRlZmluZWRJc0VtcHR5UHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5LCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9udWxsYWJsZVVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJET01TdHJpbmdUZXN0SW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNjOTJiNTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19lbnVtZXJhdGlvbl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2VudW1lcmF0aW9uX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMmZmMDc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19lbnVtZXJhdGlvbl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw1MzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2VudW1lcmF0aW9uX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkVudW1lcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFbnVtZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7CisvLyBEZWNsYXJlIGFuZCBkZWZpbmUgdGhlc2UgaW4gdGhlIHNhbWUgbmFtZXNwYWNlIHRoYXQgdGhlIG90aGVyIG92ZXJsb2FkcworLy8gd2VyZSBicm91Z2h0IGludG8gd2l0aCB0aGUgdXNpbmcgZGVjbGFyYXRpb24uCit2b2lkIFRvSlNWYWx1ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgRW51bWVyYXRpb25JbnRlcmZhY2U6OlRlc3RFbnVtIGluX2VudW0sCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpOwordm9pZCBGcm9tSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3MsIEV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSogb3V0X2VudW0pOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNFbnVtZXJhdGlvbkludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzRW51bWVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJFbnVtZXJhdGlvbkludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJFbnVtZXJhdGlvbkludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiRW51bWVyYXRpb25JbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIENvbnN0cnVjdG9yLAorfTsKKworYm9vbCBnZXRfZW51bVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEVudW1lcmF0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRW51bWVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RW51bWVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmVudW1fcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9lbnVtUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEVudW1lcmF0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRW51bWVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RW51bWVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8RW51bWVyYXRpb25JbnRlcmZhY2U6OlRlc3RFbnVtID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2VudW1fcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiZW51bVByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9lbnVtUHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X2VudW1Qcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJFbnVtZXJhdGlvbkludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLCBsZW5ndGhfdmFsdWUsCisgICAgICBKU1BST1BfUkVBRE9OTFksIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Citib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPEVudW1lcmF0aW9uSW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KKyAgICAgIG5ldyBFbnVtZXJhdGlvbkludGVyZmFjZSgpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7CisgIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7CisgIGFyZ3MucnZhbCgpLnNldE9iamVjdChyZXN1bHRfdmFsdWUudG9PYmplY3QoKSk7CisgIHJldHVybiB0cnVlOworfQorfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCituYW1lc3BhY2UgeworCitpbmxpbmUgdm9pZCBUb0pTVmFsdWUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSBpbl9lbnVtLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKSB7CisKKyAgc3dpdGNoIChpbl9lbnVtKSB7CisgICAgY2FzZSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0FscGhhOgorICAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIHN0ZDo6c3RyaW5nKCJhbHBoYSIpLCBvdXRfdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgRW51bWVyYXRpb25JbnRlcmZhY2U6OmtCZXRhOgorICAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIHN0ZDo6c3RyaW5nKCJiZXRhIiksIG91dF92YWx1ZSk7CisgICAgICByZXR1cm47CisgICAgY2FzZSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0dhbW1hOgorICAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIHN0ZDo6c3RyaW5nKCJnYW1tYSIpLCBvdXRfdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICBvdXRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBGcm9tSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3MsIEV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSogb3V0X2VudW0pIHsKKyAgRENIRUNLX0VRKDAsIGNvbnZlcnNpb25fZmxhZ3MpIDw8ICJVbmV4cGVjdGVkIGNvbnZlcnNpb24gZmxhZ3MuIjsKKyAgLy8gSlNWYWx1ZSAtPiBJREwgZW51bSBhbGdvcml0aG0gZGVzY3JpYmVkIGhlcmU6CisgIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZXMtZW51bWVyYXRpb24KKyAgLy8gMS4gTGV0IFMgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvU3RyaW5nKFYpLgorICBKUzo6Um9vdGVkU3RyaW5nIHJvb3RlZF9zdHJpbmcoY29udGV4dCwgSlM6OlRvU3RyaW5nKGNvbnRleHQsIHZhbHVlKSk7CisKKyAgYm9vbCBtYXRjaCA9IGZhbHNlOworLy8gMy4gUmV0dXJuIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZSBvZiB0eXBlIEUgdGhhdCBpcyBlcXVhbCB0byBTLgoraWYgKEpTX1N0cmluZ0VxdWFsc0FzY2lpKAorICAgICAgY29udGV4dCwgcm9vdGVkX3N0cmluZywgImFscGhhIiwgJm1hdGNoKQorICAgICAgJiYgbWF0Y2gpIHsKKyAgICAqb3V0X2VudW0gPSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0FscGhhOworICB9IGVsc2UgaWYgKEpTX1N0cmluZ0VxdWFsc0FzY2lpKAorICAgICAgY29udGV4dCwgcm9vdGVkX3N0cmluZywgImJldGEiLCAmbWF0Y2gpCisgICAgICAmJiBtYXRjaCkgeworICAgICpvdXRfZW51bSA9IEVudW1lcmF0aW9uSW50ZXJmYWNlOjprQmV0YTsKKyAgfSBlbHNlIGlmIChKU19TdHJpbmdFcXVhbHNBc2NpaSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9zdHJpbmcsICJnYW1tYSIsICZtYXRjaCkKKyAgICAgICYmIG1hdGNoKSB7CisgICAgKm91dF9lbnVtID0gRW51bWVyYXRpb25JbnRlcmZhY2U6OmtHYW1tYTsKKyAgfSBlbHNlIHsKKyAgICAvLyAyLiBJZiBTIGlzIG5vdCBvbmUgb2YgRSdzIGVudW1lcmF0aW9uIHZhbHVlcywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci4KKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihjb2JhbHQ6OnNjcmlwdDo6a0NvbnZlcnRUb0VudW1GYWlsZWQpOworICAgIHJldHVybjsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2VudW1lcmF0aW9uX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNzBmZGYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzk0OTYzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0NTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2V4bi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkV4Y2VwdGlvbk9iamVjdEludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkV4Y2VwdGlvbk9iamVjdEludGVyZmFjZUNvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgTlVMTCwKK307CisKK2Jvb2wgZ2V0X2Vycm9yKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5lcnJvcigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworYm9vbCBnZXRfbWVzc2FnZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bWVzc2FnZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJlcnJvciIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfZXJyb3IsIE5VTEwgfSB9LAorICAgIEpTTkFUSVZFX1dSQVBQRVIoTlVMTCksCisgIH0sCisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJtZXNzYWdlIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9tZXNzYWdlLCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIC8vIEdldCBFcnJvciBwcm90b3R5cGUuCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZShjb250ZXh0KTsKKyAgYm9vbCBzdWNjZXNzX2NoZWNrID0gSlNfR2V0Q2xhc3NQcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBqczo6R2V0RXhjZXB0aW9uUHJvdG9LZXkoSlNFWE5fRVJSKSwgJnBhcmVudF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzc19jaGVjayk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YTY4NDdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25zX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNDhiNjQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25zX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDUyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeGNlcHRpb25zSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeGNlcHRpb25zSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Citib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiRXhjZXB0aW9uc0ludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJFeGNlcHRpb25zSW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJFeGNlcHRpb25zSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBDb25zdHJ1Y3RvciwKK307CisKK2Jvb2wgZ2V0X2F0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBFeGNlcHRpb25zSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmF0dHJpYnV0ZV90aHJvd3NfZXhjZXB0aW9uKCZleGNlcHRpb25fc3RhdGUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X2F0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25zSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRXhjZXB0aW9uc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeGNlcHRpb25zSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfYXR0cmlidXRlX3Rocm93c19leGNlcHRpb24odmFsdWUsICZleGNlcHRpb25fc3RhdGUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fZnVuY3Rpb25UaHJvd3NFeGNlcHRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RXhjZXB0aW9uc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEV4Y2VwdGlvbnNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uc0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5GdW5jdGlvblRocm93c0V4Y2VwdGlvbigmZXhjZXB0aW9uX3N0YXRlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgImF0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbiIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfYXR0cmlidXRlVGhyb3dzRXhjZXB0aW9uLCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9hdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24sIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgImZ1bmN0aW9uVGhyb3dzRXhjZXB0aW9uIiwgZmNuX2Z1bmN0aW9uVGhyb3dzRXhjZXB0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkV4Y2VwdGlvbnNJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgorICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOworICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAorICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Citib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPEV4Y2VwdGlvbnNJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IEV4Y2VwdGlvbnNJbnRlcmZhY2UoJmV4Y2VwdGlvbl9zdGF0ZSk7CisgIC8vIEluIGNhc2UgdGhhdCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gY29uc3RydWN0b3IuCisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI5ZTFiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uc19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNFeGNlcHRpb25zSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjU0ZWYzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDA1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBmY25fY2FsbFdpdGhTZXR0aW5ncygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworCisgIGltcGwtPkNhbGxXaXRoU2V0dGluZ3MoY2FsbHdpdGhfZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRFbnZpcm9ubWVudFNldHRpbmdzKCkpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GTlNQRUMoCisgICAgICAiY2FsbFdpdGhTZXR0aW5ncyIsIGZjbl9jYWxsV2l0aFNldHRpbmdzLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4dGVuZGVkX2lkbF9hdHRyaWJ1dGVzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzY2MDVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZV9oCisjZGVmaW5lIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4dGVuZGVkX2lkbF9hdHRyaWJ1dGVzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzNjJjOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTgyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK1dyYXBwYWJsZSogR2V0T3BhcXVlUm9vdEZyb21XcmFwcGFibGUoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSo+KHdyYXBwYWJsZS5nZXQoKSk7CisgIHJldHVybiBpbXBsLT5HZXRIZWFkKCk7Cit9CisKK2NsYXNzIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBDb25zdHJ1Y3RvciwKK307CisKK2Jvb2wgZ2V0X3ByZXZpb3VzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5wcmV2aW91cygpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X3ByZXZpb3VzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3ByZXZpb3VzKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X25leHQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPm5leHQoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9uZXh0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X25leHQodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAicHJldmlvdXMiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3ByZXZpb3VzLCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9wcmV2aW91cywgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAibmV4dCIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbmV4dCwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfbmV4dCwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgorICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOworICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAorICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6R2V0T3BhcXVlUm9vdEZ1bmN0aW9uIGdldF9yb290OworICBXcmFwcGVyUHJpdmF0ZTo6R2V0UmVhY2hhYmxlV3JhcHBhYmxlc0Z1bmN0aW9uIGdldF9yZWFjaGFibGVfd3JhcHBhYmxlczsKKyAgZ2V0X3Jvb3QgPSBiYXNlOjpCaW5kKCZHZXRPcGFxdWVSb290RnJvbVdyYXBwYWJsZSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YSgKKyAgICAgIGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUsIGdldF9yb290LCBnZXRfcmVhY2hhYmxlX3dyYXBwYWJsZXMpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Citib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gbmV3X29iamVjdCA9CisgICAgICBuZXcgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmEwYTgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MTk5NzgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMzk4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2V0T3BhcXVlUm9vdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitXcmFwcGFibGUqIEdldE9wYXF1ZVJvb3RGcm9tV3JhcHBhYmxlKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8R2V0T3BhcXVlUm9vdEludGVyZmFjZSo+KHdyYXBwYWJsZS5nZXQoKSk7CisgIHJldHVybiBpbXBsLT5nZXRfb3BhcXVlX3Jvb3RfZnVuY3Rpb25fbmFtZSgpOworfQorCit2b2lkIEdldFJlYWNoYWJsZVdyYXBwYWJsZXMoY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUsCisgICAgV3JhcHBlclByaXZhdGU6OldyYXBwYWJsZVZlY3RvciogcmVhY2hhYmxlKSB7CisgIERDSEVDSyhyZWFjaGFibGUpOworICBHZXRPcGFxdWVSb290SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqPih3cmFwcGFibGUuZ2V0KCkpOworICBXcmFwcGFibGUqIHJlYWNoYWJsZV8wID0gaW1wbC0+YWRkX29wYXF1ZV9yb290X2Z1bmN0aW9uX25hbWUoKTsKKyAgaWYgKHJlYWNoYWJsZV8wKSB7CisgICAgcmVhY2hhYmxlLT5wdXNoX2JhY2socmVhY2hhYmxlXzApOworICB9Cit9CisKK2NsYXNzIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Citib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiR2V0T3BhcXVlUm9vdEludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJHZXRPcGFxdWVSb290SW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJHZXRPcGFxdWVSb290SW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBDb25zdHJ1Y3RvciwKK307CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiR2V0T3BhcXVlUm9vdEludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLCBsZW5ndGhfdmFsdWUsCisgICAgICBKU1BST1BfUkVBRE9OTFksIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6R2V0T3BhcXVlUm9vdEZ1bmN0aW9uIGdldF9yb290OworICBXcmFwcGVyUHJpdmF0ZTo6R2V0UmVhY2hhYmxlV3JhcHBhYmxlc0Z1bmN0aW9uIGdldF9yZWFjaGFibGVfd3JhcHBhYmxlczsKKyAgZ2V0X3Jvb3QgPSBiYXNlOjpCaW5kKCZHZXRPcGFxdWVSb290RnJvbVdyYXBwYWJsZSk7CisgIGdldF9yZWFjaGFibGVfd3JhcHBhYmxlcyA9IGJhc2U6OkJpbmQoJkdldFJlYWNoYWJsZVdyYXBwYWJsZXMpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoCisgICAgICBjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlLCBnZXRfcm9vdCwgZ2V0X3JlYWNoYWJsZV93cmFwcGFibGVzKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisKKyAgc2NvcGVkX3JlZnB0cjxHZXRPcGFxdWVSb290SW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KKyAgICAgIG5ldyBHZXRPcGFxdWVSb290SW50ZXJmYWNlKCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KHJlc3VsdF92YWx1ZS50b09iamVjdCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2MmI4YTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nbG9iYWxfaW50ZXJmYWNlX3BhcmVudC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGM2ZTJlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuY2MKQEAgLTAsMCArMSw0MDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2xvYmFsSW50ZXJmYWNlUGFyZW50OwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50SGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkdsb2JhbEludGVyZmFjZVBhcmVudCIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJHbG9iYWxJbnRlcmZhY2VQYXJlbnRQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkdsb2JhbEludGVyZmFjZVBhcmVudENvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgTlVMTCwKK307CisKK2Jvb2wgZmNuX3BhcmVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdsb2JhbEludGVyZmFjZVBhcmVudD4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEdsb2JhbEludGVyZmFjZVBhcmVudCogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxHbG9iYWxJbnRlcmZhY2VQYXJlbnQ+KCkuZ2V0KCk7CisKKyAgaW1wbC0+UGFyZW50T3BlcmF0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJwYXJlbnRPcGVyYXRpb24iLCBmY25fcGFyZW50T3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkdsb2JhbEludGVyZmFjZVBhcmVudCI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJiMDY3YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudF9oCisjZGVmaW5lIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50X2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudCB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTllMWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw3MzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW5kZXggPCBpbXBsLT5sZW5ndGgoKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgeworICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7CisgIH0KK30KKworYm9vbCBHZXRJbmRleGVkUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHVpbnQzMl90IGluZGV4OworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkluZGV4ZWRHZXR0ZXIoaW5kZXgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgU2V0SW5kZXhlZFByb3BlcnR5KAorICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTOjpPYmplY3RPcFJlc3VsdCYgb2JqZWN0X29wX3Jlc3VsdCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5JbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIG9iamVjdF9vcF9yZXN1bHQuc3VjY2VlZCgpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIERlbGV0ZUluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCB1aW50MzJfdCBpbmRleCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5JbmRleGVkRGVsZXRlcihpbmRleCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitjbGFzcyBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5LAorICBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzLAorICBHZXRJbmRleGVkUHJvcGVydHksCisgIFNldEluZGV4ZWRQcm9wZXJ0eSwKKyAgRGVsZXRlSW5kZXhlZFByb3BlcnR5LAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJJbmRleGVkR2V0dGVySW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGdldF9sZW5ndGgoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2Jvb2wgZmNuX2luZGV4ZWREZWxldGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+SW5kZXhlZERlbGV0ZXIoaW5kZXgpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25faW5kZXhlZEdldHRlcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5JbmRleGVkR2V0dGVyKGluZGV4KSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9pbmRleGVkU2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7CisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+SW5kZXhlZFNldHRlcihpbmRleCwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJsZW5ndGgiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X2xlbmd0aCwgTlVMTCB9IH0sCisgICAgSlNOQVRJVkVfV1JBUFBFUihOVUxMKSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJpbmRleGVkRGVsZXRlciIsIGZjbl9pbmRleGVkRGVsZXRlciwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiaW5kZXhlZEdldHRlciIsIGZjbl9pbmRleGVkR2V0dGVyLCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJpbmRleGVkU2V0dGVyIiwgZmNuX2luZGV4ZWRTZXR0ZXIsIE5VTEwsCisgICAgICAyLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiSW5kZXhlZEdldHRlckludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjg0NjgyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmMjIxOTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuY2MKQEAgLTAsMCArMSw0MDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIkludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGdldF9zdXBwb3J0ZWRBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5zdXBwb3J0ZWRfYXR0cmlidXRlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgInN1cHBvcnRlZEF0dHJpYnV0ZSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfc3VwcG9ydGVkQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MzRjNTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKKyNkZWZpbmUgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUzNzM2YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMzc1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7Citib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBDb25zdHJ1Y3RvciwKK307CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiU29tZU5hbWVkQ29uc3RydWN0b3IiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgorICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOworICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwgbGVuZ3RoX3ZhbHVlLAorICAgICAgSlNQUk9QX1JFQURPTkxZLCBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Citib29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPE5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IE5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UoKTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOworICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOworICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QocmVzdWx0X3ZhbHVlLnRvT2JqZWN0KCkpOworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhOGMzMGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZV9oCisjZGVmaW5lIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYmViZjk4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNjg3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2Jvb2wgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOworfQorCit2b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKKyAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKK30KKworYm9vbCBHZXROYW1lZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk5hbWVkR2V0dGVyKHByb3BlcnR5X25hbWUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKKyAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKUzo6T2JqZWN0T3BSZXN1bHQmIG9iamVjdF9vcF9yZXN1bHQpIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TmFtZWRTZXR0ZXIocHJvcGVydHlfbmFtZSwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIG9iamVjdF9vcF9yZXN1bHQuc3VjY2VlZCgpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIERlbGV0ZU5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPk5hbWVkRGVsZXRlcihwcm9wZXJ0eV9uYW1lKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2NsYXNzIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAorICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKKyAgR2V0TmFtZWRQcm9wZXJ0eSwKKyAgU2V0TmFtZWRQcm9wZXJ0eSwKKyAgRGVsZXRlTmFtZWRQcm9wZXJ0eSwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOYW1lZEdldHRlckludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOYW1lZEdldHRlckludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTmFtZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGZjbl9uYW1lZERlbGV0ZXIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgbmFtZTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJm5hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk5hbWVkRGVsZXRlcihuYW1lKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX25hbWVkR2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIG5hbWU7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZuYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+TmFtZWRHZXR0ZXIobmFtZSksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fbmFtZWRTZXR0ZXIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgbmFtZTsKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJm5hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCisgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk5hbWVkU2V0dGVyKG5hbWUsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgIm5hbWVkRGVsZXRlciIsIGZjbl9uYW1lZERlbGV0ZXIsIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgIm5hbWVkR2V0dGVyIiwgZmNuX25hbWVkR2V0dGVyLCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJuYW1lZFNldHRlciIsIGZjbl9uYW1lZFNldHRlciwgTlVMTCwKKyAgICAgIDIsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJOYW1lZEdldHRlckludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyNTkxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NThhZjFjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxMDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitib29sIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOworfQorCit2b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOworICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOworfQorCitib29sIEdldE5hbWVkUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgJmlkX3ZhbHVlKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5OYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIFNldE5hbWVkUHJvcGVydHkoCisgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlM6Ok9iamVjdE9wUmVzdWx0JiBvYmplY3Rfb3BfcmVzdWx0KSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TmFtZWRTZXR0ZXIocHJvcGVydHlfbmFtZSwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIG9iamVjdF9vcF9yZXN1bHQuc3VjY2VlZCgpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW5kZXggPCBpbXBsLT5sZW5ndGgoKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHVpbnQzMl90IGtOdW1JbmRleGVkUHJvcGVydGllcyA9IGltcGwtPmxlbmd0aCgpOworICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga051bUluZGV4ZWRQcm9wZXJ0aWVzOyArK2kpIHsKKyAgICBwcm9wZXJ0aWVzLT5hcHBlbmQoSU5UX1RPX0pTSUQoaSkpOworICB9Cit9CisKK2Jvb2wgR2V0SW5kZXhlZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+SW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBTZXRJbmRleGVkUHJvcGVydHkoCisgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlM6Ok9iamVjdE9wUmVzdWx0JiBvYmplY3Rfb3BfcmVzdWx0KSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsICZpZF92YWx1ZSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5JbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIG9iamVjdF9vcF9yZXN1bHQuc3VjY2VlZCgpOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitjbGFzcyBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eSwKKyAgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMsCisgIEdldE5hbWVkUHJvcGVydHksCisgIFNldE5hbWVkUHJvcGVydHksCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCisgIEdldEluZGV4ZWRQcm9wZXJ0eSwKKyAgU2V0SW5kZXhlZFByb3BlcnR5LAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIk5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfbGVuZ3RoKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2Jvb2wgZ2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnByb3BlcnR5X29uX2Jhc2VfY2xhc3MoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9wcm9wZXJ0eU9uQmFzZUNsYXNzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Byb3BlcnR5X29uX2Jhc2VfY2xhc3ModmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25faW5kZXhlZEdldHRlcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkluZGV4ZWRHZXR0ZXIoaW5kZXgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX2luZGV4ZWRTZXR0ZXIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCisgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX25hbWVkR2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk5hbWVkR2V0dGVyKG5hbWUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX25hbWVkU2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TmFtZWRTZXR0ZXIobmFtZSwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fb3BlcmF0aW9uT25CYXNlQ2xhc3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPk9wZXJhdGlvbk9uQmFzZUNsYXNzKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgImxlbmd0aCIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbGVuZ3RoLCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgInByb3BlcnR5T25CYXNlQ2xhc3MiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MsIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MsIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgImluZGV4ZWRHZXR0ZXIiLCBmY25faW5kZXhlZEdldHRlciwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiaW5kZXhlZFNldHRlciIsIGZjbl9pbmRleGVkU2V0dGVyLCBOVUxMLAorICAgICAgMiwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJuYW1lZEdldHRlciIsIGZjbl9uYW1lZEdldHRlciwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAibmFtZWRTZXR0ZXIiLCBmY25fbmFtZWRTZXR0ZXIsIE5VTEwsCisgICAgICAyLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgIm9wZXJhdGlvbk9uQmFzZUNsYXNzIiwgZmNuX29wZXJhdGlvbk9uQmFzZUNsYXNzLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIk5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYTg2MWExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCisjZGVmaW5lIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZDI2ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDc1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlB1dEZvcndhcmRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGdldF9uZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPm5lc3RlZF9mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X25lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHsgLy8gQmVnaW4gc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxQdXRGb3J3YXJkc0ludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCisgICAgc2NvcGVkX3JlZnB0cjxQdXRGb3J3YXJkc0ludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwgPQorICAgICAgIGltcGwtPm5lc3RlZF9mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpOworICAgIGlmICghZm9yd2FyZGVkX2ltcGwpIHsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgIHsgLy8gQmVnaW4gc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9mb3J3YXJkZWRfaW1wbC4KKyAgICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsID0KKyAgICAgICBmb3J3YXJkZWRfaW1wbC0+Zm9yd2FyZGluZ19hdHRyaWJ1dGUoKTsKKyAgICBpZiAoIWZvcndhcmRlZF9mb3J3YXJkZWRfaW1wbCkgeworICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvcndhcmRlZF9mb3J3YXJkZWRfaW1wbC0+c2V0X2FyYml0cmFyeV9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKKyAgfSAvLyBFbmQgc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9mb3J3YXJkZWRfaW1wbC4KK30KKyAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgIH0gLy8gRW5kIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8UHV0Rm9yd2FyZHNJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsLgorfQorCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICJuZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9uZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9uZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlLCBOVUxMIH0gfSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIk5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZDE2YzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZV9oCisjZGVmaW5lIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mM2RlNzk5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwzNTMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5vQ29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIk5vQ29uc3RydWN0b3JJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTm9Db25zdHJ1Y3RvckludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTm9Db25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgTlVMTCwKK307CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiTm9Db25zdHJ1Y3RvckludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ0Njc5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19pbnRlcmZhY2Vfb2JqZWN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzZGI0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwzMDIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Tm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGU3OGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19pbnRlcmZhY2Vfb2JqZWN0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjMzMjlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDEyMzcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIk51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfbnVsbGFibGVCb29sZWFuUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfYm9vbGVhbl9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X251bGxhYmxlQm9vbGVhblByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfbnVsbGFibGVfYm9vbGVhbl9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGdldF9udWxsYWJsZU51bWVyaWNQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9udW1lcmljX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfbnVsbGFibGVOdW1lcmljUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8aW50MzJfdCA+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9udWxsYWJsZV9udW1lcmljX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X251bGxhYmxlU3RyaW5nUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfc3RyaW5nX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfbnVsbGFibGVTdHJpbmdQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZyA+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9udWxsYWJsZV9zdHJpbmdfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBnZXRfbnVsbGFibGVPYmplY3RQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9vYmplY3RfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9udWxsYWJsZU9iamVjdFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfbnVsbGFibGVfb2JqZWN0X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX251bGxhYmxlQm9vbGVhbkFyZ3VtZW50KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5OdWxsYWJsZUJvb2xlYW5Bcmd1bWVudChhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fbnVsbGFibGVCb29sZWFuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5OdWxsYWJsZUJvb2xlYW5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9udWxsYWJsZU51bWVyaWNBcmd1bWVudCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxpbnQzMl90ID4gPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TnVsbGFibGVOdW1lcmljQXJndW1lbnQoYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX251bGxhYmxlTnVtZXJpY09wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+TnVsbGFibGVOdW1lcmljT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fbnVsbGFibGVPYmplY3RBcmd1bWVudCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TnVsbGFibGVPYmplY3RBcmd1bWVudChhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fbnVsbGFibGVPYmplY3RPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk51bGxhYmxlT2JqZWN0T3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fbnVsbGFibGVTdHJpbmdBcmd1bWVudCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZyA+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk51bGxhYmxlU3RyaW5nQXJndW1lbnQoYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX251bGxhYmxlU3RyaW5nT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5OdWxsYWJsZVN0cmluZ09wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgIm51bGxhYmxlQm9vbGVhblByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfbnVsbGFibGVCb29sZWFuUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgIm51bGxhYmxlTnVtZXJpY1Byb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9udWxsYWJsZU51bWVyaWNQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfbnVsbGFibGVOdW1lcmljUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgIm51bGxhYmxlU3RyaW5nUHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X251bGxhYmxlU3RyaW5nUHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X251bGxhYmxlU3RyaW5nUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgIm51bGxhYmxlT2JqZWN0UHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X251bGxhYmxlT2JqZWN0UHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X251bGxhYmxlT2JqZWN0UHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgIm51bGxhYmxlQm9vbGVhbkFyZ3VtZW50IiwgZmNuX251bGxhYmxlQm9vbGVhbkFyZ3VtZW50LCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJudWxsYWJsZUJvb2xlYW5PcGVyYXRpb24iLCBmY25fbnVsbGFibGVCb29sZWFuT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJudWxsYWJsZU51bWVyaWNBcmd1bWVudCIsIGZjbl9udWxsYWJsZU51bWVyaWNBcmd1bWVudCwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAibnVsbGFibGVOdW1lcmljT3BlcmF0aW9uIiwgZmNuX251bGxhYmxlTnVtZXJpY09wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAibnVsbGFibGVPYmplY3RBcmd1bWVudCIsIGZjbl9udWxsYWJsZU9iamVjdEFyZ3VtZW50LCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJudWxsYWJsZU9iamVjdE9wZXJhdGlvbiIsIGZjbl9udWxsYWJsZU9iamVjdE9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAibnVsbGFibGVTdHJpbmdBcmd1bWVudCIsIGZjbl9udWxsYWJsZVN0cmluZ0FyZ3VtZW50LCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJudWxsYWJsZVN0cmluZ09wZXJhdGlvbiIsIGZjbl9udWxsYWJsZVN0cmluZ09wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICBjb250ZXh0LCAmcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUKKyAgKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSwKKyAgICAgIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCByb290ZWRfcHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZjFiNDhiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYWFmMDFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMjU1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIk51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUNvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgTlVMTCwKK307CisKK2Jvb2wgZ2V0X2J5dGVQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmJ5dGVfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9ieXRlUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQ4X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfYnl0ZV9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGdldF9vY3RldFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+b2N0ZXRfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9vY3RldFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8dWludDhfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9vY3RldF9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGdldF9zaG9ydFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+c2hvcnRfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9zaG9ydFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8aW50MTZfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9zaG9ydF9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGdldF91bnNpZ25lZFNob3J0UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT51bnNpZ25lZF9zaG9ydF9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X3Vuc2lnbmVkU2hvcnRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHVpbnQxNl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Vuc2lnbmVkX3Nob3J0X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X2xvbmdQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmxvbmdfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9sb25nUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2xvbmdfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBnZXRfdW5zaWduZWRMb25nUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT51bnNpZ25lZF9sb25nX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfdW5zaWduZWRMb25nUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF91bnNpZ25lZF9sb25nX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X2xvbmdMb25nUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5sb25nX2xvbmdfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9sb25nTG9uZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8aW50NjRfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9sb25nX2xvbmdfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBnZXRfdW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+dW5zaWduZWRfbG9uZ19sb25nX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfdW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8dWludDY0X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfdW5zaWduZWRfbG9uZ19sb25nX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X2RvdWJsZVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+ZG91YmxlX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfZG91YmxlUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfZG91YmxlX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+dW5yZXN0cmljdGVkX2RvdWJsZV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3VucmVzdHJpY3RlZF9kb3VibGVfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fYnl0ZUFyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50OF90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5CeXRlQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9ieXRlUmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkJ5dGVSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9kb3VibGVBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+RG91YmxlQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9kb3VibGVSZXR1cm5PcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+RG91YmxlUmV0dXJuT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fbG9uZ0FyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TG9uZ0FyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fbG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDY0X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkxvbmdMb25nQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9sb25nTG9uZ1JldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5Mb25nTG9uZ1JldHVybk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX2xvbmdSZXR1cm5PcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+TG9uZ1JldHVybk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX29jdGV0QXJndW1lbnRPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czx1aW50OF90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5PY3RldEFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fb2N0ZXRSZXR1cm5PcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+T2N0ZXRSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9zaG9ydEFyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MTZfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+U2hvcnRBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3Nob3J0UmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPlNob3J0UmV0dXJuT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdW5yZXN0cmljdGVkRG91YmxlQXJndW1lbnRPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlVucmVzdHJpY3RlZERvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdW5yZXN0cmljdGVkRG91YmxlUmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPlVucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3Vuc2lnbmVkTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlVuc2lnbmVkTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDY0X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlVuc2lnbmVkTG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3Vuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+VW5zaWduZWRMb25nTG9uZ1JldHVybk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3Vuc2lnbmVkTG9uZ1JldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5VbnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl91bnNpZ25lZFNob3J0QXJndW1lbnRPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czx1aW50MTZfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+VW5zaWduZWRTaG9ydEFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5VbnNpZ25lZFNob3J0UmV0dXJuT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiYnl0ZVByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9ieXRlUHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X2J5dGVQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAib2N0ZXRQcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfb2N0ZXRQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfb2N0ZXRQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAic2hvcnRQcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfc2hvcnRQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfc2hvcnRQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAidW5zaWduZWRTaG9ydFByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF91bnNpZ25lZFNob3J0UHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X3Vuc2lnbmVkU2hvcnRQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAibG9uZ1Byb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9sb25nUHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X2xvbmdQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAidW5zaWduZWRMb25nUHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3Vuc2lnbmVkTG9uZ1Byb3BlcnR5LCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF91bnNpZ25lZExvbmdQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAibG9uZ0xvbmdQcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbG9uZ0xvbmdQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfbG9uZ0xvbmdQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAidW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF91bnNpZ25lZExvbmdMb25nUHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X3Vuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiZG91YmxlUHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X2RvdWJsZVByb3BlcnR5LCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9kb3VibGVQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAidW5yZXN0cmljdGVkRG91YmxlUHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5LCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF91bnJlc3RyaWN0ZWREb3VibGVQcm9wZXJ0eSwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GTlNQRUMoCisgICAgICAiYnl0ZUFyZ3VtZW50T3BlcmF0aW9uIiwgZmNuX2J5dGVBcmd1bWVudE9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiYnl0ZVJldHVybk9wZXJhdGlvbiIsIGZjbl9ieXRlUmV0dXJuT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJkb3VibGVBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl9kb3VibGVBcmd1bWVudE9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiZG91YmxlUmV0dXJuT3BlcmF0aW9uIiwgZmNuX2RvdWJsZVJldHVybk9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAibG9uZ0FyZ3VtZW50T3BlcmF0aW9uIiwgZmNuX2xvbmdBcmd1bWVudE9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAibG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl9sb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uLCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJsb25nTG9uZ1JldHVybk9wZXJhdGlvbiIsIGZjbl9sb25nTG9uZ1JldHVybk9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAibG9uZ1JldHVybk9wZXJhdGlvbiIsIGZjbl9sb25nUmV0dXJuT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJvY3RldEFyZ3VtZW50T3BlcmF0aW9uIiwgZmNuX29jdGV0QXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgIm9jdGV0UmV0dXJuT3BlcmF0aW9uIiwgZmNuX29jdGV0UmV0dXJuT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJzaG9ydEFyZ3VtZW50T3BlcmF0aW9uIiwgZmNuX3Nob3J0QXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInNob3J0UmV0dXJuT3BlcmF0aW9uIiwgZmNuX3Nob3J0UmV0dXJuT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJ1bnJlc3RyaWN0ZWREb3VibGVBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl91bnJlc3RyaWN0ZWREb3VibGVBcmd1bWVudE9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAidW5yZXN0cmljdGVkRG91YmxlUmV0dXJuT3BlcmF0aW9uIiwgZmNuX3VucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAidW5zaWduZWRMb25nQXJndW1lbnRPcGVyYXRpb24iLCBmY25fdW5zaWduZWRMb25nQXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInVuc2lnbmVkTG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbiIsIGZjbl91bnNpZ25lZExvbmdMb25nQXJndW1lbnRPcGVyYXRpb24sIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInVuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24iLCBmY25fdW5zaWduZWRMb25nTG9uZ1JldHVybk9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAidW5zaWduZWRMb25nUmV0dXJuT3BlcmF0aW9uIiwgZmNuX3Vuc2lnbmVkTG9uZ1JldHVybk9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAidW5zaWduZWRTaG9ydEFyZ3VtZW50T3BlcmF0aW9uIiwgZmNuX3Vuc2lnbmVkU2hvcnRBcmd1bWVudE9wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAidW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbiIsIGZjbl91bnNpZ25lZFNob3J0UmV0dXJuT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIk51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNlZDVmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE5Njc3ZjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDcwMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYmFzZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QmFzZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQmFzZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGVyaXZlZEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIk9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfYXJiaXRyYXJ5T2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5hcmJpdHJhcnlfb2JqZWN0KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfYXJiaXRyYXJ5T2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfYXJiaXRyYXJ5X29iamVjdCh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGdldF9iYXNlSW50ZXJmYWNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5iYXNlX2ludGVyZmFjZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworYm9vbCBnZXRfZGVyaXZlZEludGVyZmFjZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+ZGVyaXZlZF9pbnRlcmZhY2UoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9kZXJpdmVkSW50ZXJmYWNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPERlcml2ZWRJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2Rlcml2ZWRfaW50ZXJmYWNlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X29iamVjdFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5vYmplY3RfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF9vYmplY3RQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8T3BhcXVlSGFuZGxlID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9vYmplY3RfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiYXJiaXRyYXJ5T2JqZWN0IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9hcmJpdHJhcnlPYmplY3QsIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X2FyYml0cmFyeU9iamVjdCwgTlVMTCB9IH0sCisgIH0sCisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICJiYXNlSW50ZXJmYWNlIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9iYXNlSW50ZXJmYWNlLCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgImRlcml2ZWRJbnRlcmZhY2UiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X2Rlcml2ZWRJbnRlcmZhY2UsIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X2Rlcml2ZWRJbnRlcmZhY2UsIE5VTEwgfSB9LAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgIm9iamVjdFByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF9vYmplY3RQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfb2JqZWN0UHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICAgICAgY29udGV4dCwgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoCisgICAgICAgICAgY29udGV4dCwgcHJveHlfaGFuZGxlci5Qb2ludGVyKCksIG5ld19vYmplY3QsIHByb3RvdHlwZSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZjNjMDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzZjYTIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29wZXJhdGlvbnNfdGVzdF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxOTI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpPcGVyYXRpb25zVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIk9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBmY25fbG9uZ0Z1bmN0aW9uTm9BcmdzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5Mb25nRnVuY3Rpb25Ob0FyZ3MoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9vYmplY3RGdW5jdGlvbk5vQXJncygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+T2JqZWN0RnVuY3Rpb25Ob0FyZ3MoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9vcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIC8vIE9wdGlvbmFsIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzCisgIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIGFyZzEgPQorICAgICAgMi43MTg7CisgIHNpemVfdCBudW1fc2V0X2FyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpID4gMCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTAoCisgICAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwKKyAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICZhcmcxKTsKKyAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGltcGwtPk9wdGlvbmFsQXJndW1lbnRXaXRoRGVmYXVsdChhcmcxKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX29wdGlvbmFsQXJndW1lbnRzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKyAgLy8gT3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzaXplX3QgbnVtX3NldF9hcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA+IDEpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUwKAorICAgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAmYXJnMik7CisgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKytudW1fc2V0X2FyZ3VtZW50czsKKyAgfQorICBpZiAoYXJncy5sZW5ndGgoKSA+IDIpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUxKAorICAgICAgICBjb250ZXh0LCBhcmdzWzJdKTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMSwKKyAgICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAmYXJnMyk7CisgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKytudW1fc2V0X2FyZ3VtZW50czsKKyAgfQorICBzd2l0Y2ggKG51bV9zZXRfYXJndW1lbnRzKSB7CisgICAgY2FzZSAxOgorICAgICAgeworICAgICAgICAgIGltcGwtPk9wdGlvbmFsQXJndW1lbnRzKGFyZzEpOworICAgICAgICAgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgICAgICAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBjYXNlIDI6CisgICAgICB7CisgICAgICAgICAgaW1wbC0+T3B0aW9uYWxBcmd1bWVudHMoYXJnMSwgYXJnMik7CisgICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMzoKKyAgICAgIHsKKyAgICAgICAgICBpbXBsLT5PcHRpb25hbEFyZ3VtZW50cyhhcmcxLCBhcmcyLCBhcmczKTsKKyAgICAgICAgICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgICAgICAgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIGZjbl9vcHRpb25hbE51bGxhYmxlQXJndW1lbnRzV2l0aERlZmF1bHRzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICAvLyBPcHRpb25hbCBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmcxID0KKyAgICAgIGJhc2U6Om51bGxvcHQ7CisgIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIGFyZzIgPQorICAgICAgTlVMTDsKKyAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMjsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAwKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKKyAgICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwKKyAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICZhcmcxKTsKKyAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBpZiAoYXJncy5sZW5ndGgoKSA+IDEpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUxKAorICAgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMSwKKyAgICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAorICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgJmFyZzIpOworICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgaW1wbC0+T3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cyhhcmcxLCBhcmcyKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjEoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24yKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjMoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMzsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzIpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgyLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTIoCisgICAgICBjb250ZXh0LCBhcmdzWzJdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMiwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uNSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAzOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmczOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAorICAgICAgY29udGV4dCwgYXJnc1syXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk92ZXJsb2FkZWRGdW5jdGlvbihhcmcxLCBhcmcyLCBhcmczKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBzd2l0Y2goYXJnYykgeworICAgIGNhc2UoMCk6IHsKKyAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKKyAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24xKAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UoMSk6IHsKKyAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKKyAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzBdKTsKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKKyAgICAgICAgb2JqZWN0ID0gSlM6OlJvb3RlZE9iamVjdChjb250ZXh0LCAmYXJnLnRvT2JqZWN0KCkpOworICAgICAgfQorICAgICAgaWYgKGFyZy5pc051bWJlcigpKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMygKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlKDMpOiB7CisgICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6CisgICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgICAgIEpTOjpSb290ZWRWYWx1ZSBhcmcoY29udGV4dCwgYXJnc1syXSk7CisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7CisgICAgICAgIG9iamVjdCA9IEpTOjpSb290ZWRPYmplY3QoY29udGV4dCwgJmFyZy50b09iamVjdCgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSA/IHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSA6CisgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uNSgKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uNCgKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCisgIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+T3ZlcmxvYWRlZE51bGxhYmxlKGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9vdmVybG9hZGVkTnVsbGFibGUyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5PdmVybG9hZGVkTnVsbGFibGUoYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX292ZXJsb2FkZWROdWxsYWJsZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBzd2l0Y2goYXJnYykgeworICAgIGNhc2UoMSk6IHsKKyAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKKyAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzBdKTsKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKKyAgICAgICAgb2JqZWN0ID0gSlM6OlJvb3RlZE9iamVjdChjb250ZXh0LCAmYXJnLnRvT2JqZWN0KCkpOworICAgICAgfQorICAgICAgaWYgKGFyZy5pc051bGxPclVuZGVmaW5lZCgpKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMSgKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCisgIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBmY25fc3RyaW5nRnVuY3Rpb25Ob0FyZ3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPlN0cmluZ0Z1bmN0aW9uTm9BcmdzKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdmFyaWFkaWNQcmltaXRpdmVBcmd1bWVudHMoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIC8vIFZhcmlhZGljIGFyZ3VtZW50CisgIFR5cGVUcmFpdHM8c3RkOjp2ZWN0b3I8aW50MzJfdD4gPjo6Q29udmVyc2lvblR5cGUgYm9vbHM7CisKKyAgLy8gR2V0IHZhcmlhZGljIGFyZ3VtZW50cy4KKyAgY29uc3Qgc2l6ZV90IGtGaXJzdFZhcmlhZGljQXJnSW5kZXggPSAwOworICBpZiAoYXJncy5sZW5ndGgoKSA+IGtGaXJzdFZhcmlhZGljQXJnSW5kZXgpIHsKKyAgICBib29scy5yZXNpemUoYXJncy5sZW5ndGgoKSAtIGtGaXJzdFZhcmlhZGljQXJnSW5kZXgpOworICAgIGZvciAoaW50IGkgPSAwOyBpICsga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCA8IGFyZ3MubGVuZ3RoKCk7ICsraSkgeworICAgICAgSlM6OlJvb3RlZFZhbHVlIHZhcmlhZGljX2FyZ3VtZW50X3ZhbHVlKAorICAgICAgICAgIGNvbnRleHQsIGFyZ3NbaSArIGtGaXJzdFZhcmlhZGljQXJnSW5kZXhdKTsKKyAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICB2YXJpYWRpY19hcmd1bWVudF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgICAmYm9vbHNbaV0pOworICAgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGltcGwtPlZhcmlhZGljUHJpbWl0aXZlQXJndW1lbnRzKGJvb2xzKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3ZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICAvLyBPcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIG9wdGlvbmFsX2FyZzsKKyAgLy8gVmFyaWFkaWMgYXJndW1lbnQKKyAgVHlwZVRyYWl0czxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPjo6Q29udmVyc2lvblR5cGUgc3RyaW5nczsKKyAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMDsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAwKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKKyAgICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgJm9wdGlvbmFsX2FyZyk7CisgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgKytudW1fc2V0X2FyZ3VtZW50czsKKyAgfQorCisgIC8vIEdldCB2YXJpYWRpYyBhcmd1bWVudHMuCisgIGNvbnN0IHNpemVfdCBrTGFzdE9wdGlvbmFsQXJnSW5kZXggPSAxOworICBpZiAobnVtX3NldF9hcmd1bWVudHMgPT0ga0xhc3RPcHRpb25hbEFyZ0luZGV4KSB7CisgICAgLy8gSWYgdGhlIGxhc3Qgb3B0aW9uYWwgYXJndW1lbnQgaGFzIGJlZW4gc2V0LCB3ZSB3aWxsIGNhbGwgdGhlIG92ZXJsb2FkCisgICAgLy8gdGhhdCB0YWtlcyB0aGUgdmFyaWFkaWMgYXJndW1lbnQsIHBvc3NpYmx5IHdpdGggYW4gZW1wdHkgdmVjdG9yIGluIHRoZQorICAgIC8vIGNhc2UgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBhcmd1bWVudHMgbGVmdC4KKyAgICArK251bV9zZXRfYXJndW1lbnRzOworICB9CisgIGNvbnN0IHNpemVfdCBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4ID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPiBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4KSB7CisgICAgc3RyaW5ncy5yZXNpemUoYXJncy5sZW5ndGgoKSAtIGtGaXJzdFZhcmlhZGljQXJnSW5kZXgpOworICAgIGZvciAoaW50IGkgPSAwOyBpICsga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCA8IGFyZ3MubGVuZ3RoKCk7ICsraSkgeworICAgICAgSlM6OlJvb3RlZFZhbHVlIHZhcmlhZGljX2FyZ3VtZW50X3ZhbHVlKAorICAgICAgICAgIGNvbnRleHQsIGFyZ3NbaSArIGtGaXJzdFZhcmlhZGljQXJnSW5kZXhdKTsKKyAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgICB2YXJpYWRpY19hcmd1bWVudF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgICAmc3RyaW5nc1tpXSk7CisgICAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisgIHN3aXRjaCAobnVtX3NldF9hcmd1bWVudHMpIHsKKyAgICBjYXNlIDA6CisgICAgICB7CisgICAgICAgICAgaW1wbC0+VmFyaWFkaWNTdHJpbmdBcmd1bWVudHNBZnRlck9wdGlvbmFsQXJndW1lbnQoKTsKKyAgICAgICAgICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgICAgICAgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAyOgorICAgICAgeworICAgICAgICAgIGltcGwtPlZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KG9wdGlvbmFsX2FyZywgc3RyaW5ncyk7CisgICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworYm9vbCBmY25fdm9pZEZ1bmN0aW9uTG9uZ0FyZygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+Vm9pZEZ1bmN0aW9uTG9uZ0FyZyhhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdm9pZEZ1bmN0aW9uTm9BcmdzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPlZvaWRGdW5jdGlvbk5vQXJncygpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdm9pZEZ1bmN0aW9uT2JqZWN0QXJnKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlZvaWRGdW5jdGlvbk9iamVjdEFyZyhhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fdm9pZEZ1bmN0aW9uU3RyaW5nQXJnKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+Vm9pZEZ1bmN0aW9uU3RyaW5nQXJnKGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHN0YXRpY2Zjbl9vdmVybG9hZGVkRnVuY3Rpb24xKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6Ok92ZXJsb2FkZWRGdW5jdGlvbihhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZCksCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZzEsIGFyZzIpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIHN3aXRjaChhcmdjKSB7CisgICAgY2FzZSgxKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjEoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSgyKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjIoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncworICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgImxvbmdGdW5jdGlvbk5vQXJncyIsIGZjbl9sb25nRnVuY3Rpb25Ob0FyZ3MsIE5VTEwsCisgICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgIm9iamVjdEZ1bmN0aW9uTm9BcmdzIiwgZmNuX29iamVjdEZ1bmN0aW9uTm9BcmdzLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJvcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQiLCBmY25fb3B0aW9uYWxBcmd1bWVudFdpdGhEZWZhdWx0LCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJvcHRpb25hbEFyZ3VtZW50cyIsIGZjbl9vcHRpb25hbEFyZ3VtZW50cywgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAib3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cyIsIGZjbl9vcHRpb25hbE51bGxhYmxlQXJndW1lbnRzV2l0aERlZmF1bHRzLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJvdmVybG9hZGVkRnVuY3Rpb24iLCBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJvdmVybG9hZGVkTnVsbGFibGUiLCBmY25fb3ZlcmxvYWRlZE51bGxhYmxlLCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJzdHJpbmdGdW5jdGlvbk5vQXJncyIsIGZjbl9zdHJpbmdGdW5jdGlvbk5vQXJncywgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAidmFyaWFkaWNQcmltaXRpdmVBcmd1bWVudHMiLCBmY25fdmFyaWFkaWNQcmltaXRpdmVBcmd1bWVudHMsIE5VTEwsCisgICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50IiwgZmNuX3ZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50LCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJ2b2lkRnVuY3Rpb25Mb25nQXJnIiwgZmNuX3ZvaWRGdW5jdGlvbkxvbmdBcmcsIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInZvaWRGdW5jdGlvbk5vQXJncyIsIGZjbl92b2lkRnVuY3Rpb25Ob0FyZ3MsIE5VTEwsCisgICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInZvaWRGdW5jdGlvbk9iamVjdEFyZyIsIGZjbl92b2lkRnVuY3Rpb25PYmplY3RBcmcsIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInZvaWRGdW5jdGlvblN0cmluZ0FyZyIsIGZjbl92b2lkRnVuY3Rpb25TdHJpbmdBcmcsIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GTlNQRUMoCisgICAgICAib3ZlcmxvYWRlZEZ1bmN0aW9uIiwgc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbiwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29wZXJhdGlvbnNfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI2Y2NlNWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29wZXJhdGlvbnNfdGVzdF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZThiNjgzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpQdXRGb3J3YXJkc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiUHV0Rm9yd2FyZHNJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiUHV0Rm9yd2FyZHNJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIlB1dEZvcndhcmRzSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfZm9yd2FyZGluZ0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxQdXRGb3J3YXJkc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFB1dEZvcndhcmRzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X2ZvcndhcmRpbmdBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgUHV0Rm9yd2FyZHNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8UHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHsgLy8gQmVnaW4gc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsLgorICAgIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbCA9CisgICAgICAgaW1wbC0+Zm9yd2FyZGluZ19hdHRyaWJ1dGUoKTsKKyAgICBpZiAoIWZvcndhcmRlZF9pbXBsKSB7CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZm9yd2FyZGVkX2ltcGwtPnNldF9hcmJpdHJhcnlfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKyAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgIH0gLy8gRW5kIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KK30KKworYm9vbCBzdGF0aWNnZXRfc3RhdGljRm9yd2FyZGluZ0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OnN0YXRpY19mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc3RhdGljc2V0X3N0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUoCisgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICB7IC8vIEJlZ2luIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KKyAgICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwgPQorICAgICAgIFB1dEZvcndhcmRzSW50ZXJmYWNlOjpzdGF0aWNfZm9yd2FyZGluZ19hdHRyaWJ1dGUoKTsKKyAgICBpZiAoIWZvcndhcmRlZF9pbXBsKSB7CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZm9yd2FyZGVkX2ltcGwtPnNldF9hcmJpdHJhcnlfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKyAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgIH0gLy8gRW5kIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAiZm9yd2FyZGluZ0F0dHJpYnV0ZSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfZm9yd2FyZGluZ0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfZm9yd2FyZGluZ0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICB7ICAvLyBTdGF0aWMgcmVhZC93cml0ZSBhdHRyaWJ1dGUuCisgICAgICAic3RhdGljRm9yd2FyZGluZ0F0dHJpYnV0ZSIsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIHsgeyAmc3RhdGljZ2V0X3N0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUsIE5VTEwgfSB9LAorICAgICAgeyB7ICZzdGF0aWNzZXRfc3RhdGljRm9yd2FyZGluZ0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIlB1dEZvcndhcmRzSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmRiNzkzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZV9oCisjZGVmaW5lIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzU1Yzg0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2VxdWVuY2VfdXNlci5jYwpAQCAtMCwwICsxLDEyNDMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTZXF1ZW5jZVVzZXI7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NlcXVlbmNlVXNlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc1NlcXVlbmNlVXNlckhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzU2VxdWVuY2VVc2VySGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzU2VxdWVuY2VVc2VySGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNTZXF1ZW5jZVVzZXJIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1NlcXVlbmNlVXNlckhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1NlcXVlbmNlVXNlcjo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIlNlcXVlbmNlVXNlciIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJTZXF1ZW5jZVVzZXJQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIlNlcXVlbmNlVXNlckNvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgQ29uc3RydWN0b3IsCit9OworCitib29sIGZjbl9nZXRJbnRlcmZhY2VTZXF1ZW5jZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFNlcXVlbmNlVXNlciogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkdldEludGVyZmFjZVNlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+R2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fZ2V0TG9uZ1NlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+R2V0TG9uZ1NlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fZ2V0U3RyaW5nU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRTdHJpbmdTZXF1ZW5jZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX2dldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+R2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fZ2V0VW5pb25TZXF1ZW5jZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFNlcXVlbmNlVXNlciogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkdldFVuaW9uU2VxdWVuY2UoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9zZXRJbnRlcmZhY2VTZXF1ZW5jZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFNlcXVlbmNlVXNlciogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+U2V0SW50ZXJmYWNlU2VxdWVuY2UoZWxlbWVudHMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBmY25fc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzY3JpcHQ6OlNlcXVlbmNlPCBzY3JpcHQ6OlNlcXVlbmNlPCBzY3JpcHQ6OlNlcXVlbmNlPCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPiA+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+U2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKGVsZW1lbnRzKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3NldExvbmdTZXF1ZW5jZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFNlcXVlbmNlVXNlciogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgaW50MzJfdCA+ID46OkNvbnZlcnNpb25UeXBlIGVsZW1lbnRzOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmZWxlbWVudHMpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlNldExvbmdTZXF1ZW5jZShlbGVtZW50cyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9zZXRTdHJpbmdTZXF1ZW5jZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFNlcXVlbmNlVXNlciogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgc3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5TZXRTdHJpbmdTZXF1ZW5jZShlbGVtZW50cyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzY3JpcHQ6OlNlcXVlbmNlPCBzY3JpcHQ6OlNlcXVlbmNlPCBzdGQ6OnN0cmluZyA+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+U2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZShlbGVtZW50cyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9zZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHNjcmlwdDo6VW5pb25UeXBlMjxzdGQ6OnN0cmluZywgc2NyaXB0OjpTZXF1ZW5jZTwgc3RkOjpzdHJpbmcgPiA+ID46OkNvbnZlcnNpb25UeXBlIGVsZW1lbnRzOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmZWxlbWVudHMpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZShlbGVtZW50cyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9zZXRVbmlvblNlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzY3JpcHQ6OlNlcXVlbmNlPCBzY3JpcHQ6OlVuaW9uVHlwZTI8c3RkOjpzdHJpbmcsIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+U2V0VW5pb25TZXF1ZW5jZShlbGVtZW50cyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJnZXRJbnRlcmZhY2VTZXF1ZW5jZSIsIGZjbl9nZXRJbnRlcmZhY2VTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlIiwgZmNuX2dldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiZ2V0TG9uZ1NlcXVlbmNlIiwgZmNuX2dldExvbmdTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiZ2V0U3RyaW5nU2VxdWVuY2UiLCBmY25fZ2V0U3RyaW5nU2VxdWVuY2UsIE5VTEwsCisgICAgICAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgImdldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UiLCBmY25fZ2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlIiwgZmNuX2dldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAiZ2V0VW5pb25TZXF1ZW5jZSIsIGZjbl9nZXRVbmlvblNlcXVlbmNlLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJzZXRJbnRlcmZhY2VTZXF1ZW5jZSIsIGZjbl9zZXRJbnRlcmZhY2VTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAic2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlIiwgZmNuX3NldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAic2V0TG9uZ1NlcXVlbmNlIiwgZmNuX3NldExvbmdTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAic2V0U3RyaW5nU2VxdWVuY2UiLCBmY25fc2V0U3RyaW5nU2VxdWVuY2UsIE5VTEwsCisgICAgICAxLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UiLCBmY25fc2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAic2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlIiwgZmNuX3NldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSwgTlVMTCwKKyAgICAgIDEsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAic2V0VW5pb25TZXF1ZW5jZSIsIGZjbl9zZXRVbmlvblNlcXVlbmNlLCBOVUxMLAorICAgICAgMSwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIlNlcXVlbmNlVXNlciI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLCBsZW5ndGhfdmFsdWUsCisgICAgICBKU1BST1BfUkVBRE9OTFksIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU2VxdWVuY2VVc2VyOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKHByb3RvdHlwZSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTZXF1ZW5jZVVzZXI6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1NlcXVlbmNlVXNlcjo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworYm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisKKyAgc2NvcGVkX3JlZnB0cjxTZXF1ZW5jZVVzZXI+IG5ld19vYmplY3QgPQorICAgICAgbmV3IFNlcXVlbmNlVXNlcigpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7CisgIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7CisgIGFyZ3MucnZhbCgpLnNldE9iamVjdChyZXN1bHRfdmFsdWUudG9PYmplY3QoKSk7CisgIHJldHVybiB0cnVlOworfQorfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zZXF1ZW5jZV91c2VyLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGU5OGVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zZXF1ZW5jZV91c2VyLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNTZXF1ZW5jZVVzZXJfaAorI2RlZmluZSBNb3pqc1NlcXVlbmNlVXNlcl9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXF1ZW5jZV91c2VyLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc1NlcXVlbmNlVXNlciB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNTZXF1ZW5jZVVzZXJfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNmNzg4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxMTUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9sb2dnaW5nX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNjbnR4dC5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkxvZ2dpbmdFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkdldENhbGxhYmxlRm9yQ2FsbGJhY2tJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6dXRpbDo6R2V0RXhjZXB0aW9uU3RyaW5nOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3QpCisgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICAgIGltcGxlbWVudGluZ19vYmplY3RfKGNvbnRleHQsIGltcGxlbWVudGluZ19vYmplY3QpIHsgfQorCitNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTo6TW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVWYWx1ZSBpbXBsZW1lbnRpbmdfb2JqZWN0X3ZhbHVlKQorICAgIDogY29udGV4dF8oY29udGV4dCksCisgICAgICBpbXBsZW1lbnRpbmdfb2JqZWN0Xyhjb250ZXh0LCBpbXBsZW1lbnRpbmdfb2JqZWN0X3ZhbHVlKSB7IH0KKworYmFzZTo6b3B0aW9uYWw8aW50MzJfdCA+IE1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlOjpIYW5kbGVDYWxsYmFjaygKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgY2FsbGJhY2tfdGhpcywKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4mIHZhbHVlLAorICAgIGJvb2wqIGhhZF9leGNlcHRpb24pIGNvbnN0IHsKKyAgYm9vbCBzdWNjZXNzID0gZmFsc2U7CisgIGJhc2U6Om9wdGlvbmFsPGludDMyX3QgPiBjb2JhbHRfcmV0dXJuX3ZhbHVlOworICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7CisgIEpTRXhjZXB0aW9uU3RhdGUqIHByZXZpb3VzX2V4Y2VwdGlvbl9zdGF0ZSA9IEpTX1NhdmVFeGNlcHRpb25TdGF0ZShjb250ZXh0Xyk7CisKKyAgLy8gVGhpcyBjb3VsZCBiZSBzZXQgdG8gTlVMTCBpZiBpdCB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIEpTOjpSb290ZWRPYmplY3QgaW1wbGVtZW50aW5nX29iamVjdChjb250ZXh0XywgaW1wbGVtZW50aW5nX29iamVjdF8uR2V0T2JqZWN0KCkpOworICBETE9HX0lGKFdBUk5JTkcsICFpbXBsZW1lbnRpbmdfb2JqZWN0KSA8PCAiSW1wbGVtZW50aW5nIG9iamVjdCBpcyBOVUxMLiI7CisgIGlmIChpbXBsZW1lbnRpbmdfb2JqZWN0KSB7CisgICAgSlNBdXRvQ29tcGFydG1lbnQgYXV0b19jb21wYXJ0bWVudChjb250ZXh0XywgaW1wbGVtZW50aW5nX29iamVjdCk7CisKKyAgICAvLyBHZXQgY2FsbGFibGUgb2JqZWN0LgorICAgIEpTOjpSb290ZWRWYWx1ZSBjYWxsYWJsZShjb250ZXh0Xyk7CisgICAgaWYgKEdldENhbGxhYmxlRm9yQ2FsbGJhY2tJbnRlcmZhY2UoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhbmRsZUNhbGxiYWNrIiwgJmNhbGxhYmxlKSkgeworICAgICAgLy8gQ29udmVydCB0aGUgY2FsbGJhY2tfdGhpcyB0byBhIEpTVmFsdWUuCisgICAgICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0Xyk7CisgICAgICBUb0pTVmFsdWUoY29udGV4dF8sIGNhbGxiYWNrX3RoaXMsICZ0aGlzX3ZhbHVlKTsKKworICAgICAgLy8gQ29udmVydCBhcmd1bWVudHMuCisgICAgICBjb25zdCBpbnQga051bUFyZ3VtZW50cyA9IDE7CisgICAgICBKUzo6QXV0b1ZhbHVlQXJyYXk8a051bUFyZ3VtZW50cz4gYXJncyhjb250ZXh0Xyk7CisKKyAgICAgIFRvSlNWYWx1ZShjb250ZXh0XywgdmFsdWUsIGFyZ3NbMF0pOworCisgICAgICAvLyBDYWxsIHRoZSBmdW5jdGlvbi4KKyAgICAgIEpTOjpSb290ZWRWYWx1ZSByZXR1cm5fdmFsdWUoY29udGV4dF8pOworICAgICAgSlM6OlJvb3RlZEZ1bmN0aW9uIGZ1bmN0aW9uKAorICAgICAgICAgIGNvbnRleHRfLCBKU19WYWx1ZVRvRnVuY3Rpb24oY29udGV4dF8sIGNhbGxhYmxlKSk7CisgICAgICBEQ0hFQ0soZnVuY3Rpb24pOworICAgICAgc3VjY2VzcyA9IEpTOjpDYWxsKGNvbnRleHRfLCB0aGlzX3ZhbHVlLCBmdW5jdGlvbiwgYXJncywgJnJldHVybl92YWx1ZSk7CisgICAgICBETE9HX0lGKFdBUk5JTkcsICFzdWNjZXNzKSA8PCAiRXhjZXB0aW9uIGluIGNhbGxiYWNrOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRFeGNlcHRpb25TdHJpbmcoY29udGV4dF8pOworICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgTG9nZ2luZ0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZTsKKyAgICAgICAgRnJvbUpTVmFsdWUoY29udGV4dF8sIHJldHVybl92YWx1ZSwgMCwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgJmNvYmFsdF9yZXR1cm5fdmFsdWUpOworICAgICAgICBzdWNjZXNzID0gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgKmhhZF9leGNlcHRpb24gPSAhc3VjY2VzczsKKyAgSlNfUmVzdG9yZUV4Y2VwdGlvblN0YXRlKGNvbnRleHRfLCBwcmV2aW91c19leGNlcHRpb25fc3RhdGUpOworICByZXR1cm4gY29iYWx0X3JldHVybl92YWx1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjA4MDg3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZV9oCisjZGVmaW5lIE1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfaW50ZXJmYWNlX3RyYWl0cy5oIgorLy8gSGVhZGVycyBmb3Igb3RoZXIgYmluZGluZ3Mgd3JhcHBlciBjbGFzc2VzCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIDogcHVibGljIFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZSBCYXNlVHlwZTsKKworICBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZSgKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0KTsKKyAgTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBpbXBsZW1lbnRpbmdfb2JqZWN0X3ZhbHVlKTsKKyAgYmFzZTo6b3B0aW9uYWw8aW50MzJfdCA+IEhhbmRsZUNhbGxiYWNrKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIGNhbGxiYWNrX3RoaXMsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4mIHZhbHVlLAorICAgICAgYm9vbCogaGFkX2V4Y2VwdGlvbikgY29uc3QgT1ZFUlJJREU7CisgIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBpbXBsZW1lbnRpbmdfb2JqZWN0Xy5HZXRPYmplY3QoKTsgfQorICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gaW1wbGVtZW50aW5nX29iamVjdF8uR2V0VmFsdWUoKTsgfQorICBib29sIFdhc0NvbGxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxlbWVudGluZ19vYmplY3RfLldhc0NvbGxlY3RlZCgpOyB9CisKKyBwcml2YXRlOgorICBKU0NvbnRleHQqIGNvbnRleHRfOworICBzY3JpcHQ6Om1vempzOjpXZWFrSGVhcE9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNjcmlwdCB7CisvLyBFeHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzIHN0cnVjdCBzbyB3ZSBjYW4gaW5mZXIKKy8vIHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgZnJvbSB0aGUgdHlwZSBvZiB0aGUgY2FsbGJhY2sgaW50ZXJmYWNlLgordGVtcGxhdGU8Pgorc3RydWN0IENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzPGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlNpbmdsZU9wZXJhdGlvbkludGVyZmFjZT4geworICB0eXBlZGVmIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VDbGFzczsKK307Cit9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTVjYzRmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw2NTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RhdGljUHJvcGVydGllc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlIiwKKyAgICAwIHwgSlNDTEFTU19IQVNfUFJJVkFURSwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgIE5VTEwsICAvLyBoYXNJbnN0YW5jZQorICAgIE5VTEwsICAvLyBjb25zdHJ1Y3QKKyAgICAmV3JhcHBlclByaXZhdGU6OlRyYWNlLCAgLy8gdHJhY2UKK307CisKK2NvbnN0IEpTQ2xhc3MgcHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIHN0YXRpY2dldF9zdGF0aWNBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OnN0YXRpY19hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHN0YXRpY3NldF9zdGF0aWNBdHRyaWJ1dGUoCisgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6c2V0X3N0YXRpY19hdHRyaWJ1dGUodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24xKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisKKyAgU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6U3RhdGljRnVuY3Rpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpTdGF0aWNGdW5jdGlvbihhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24zKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpTdGF0aWNGdW5jdGlvbihhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb240KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMzsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzIpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgyLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTIoCisgICAgICBjb250ZXh0LCBhcmdzWzJdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMiwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6U3RhdGljRnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAzOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmczOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAorICAgICAgY29udGV4dCwgYXJnc1syXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgc3dpdGNoKGFyZ2MpIHsKKyAgICBjYXNlKDApOiB7CisgICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6CisgICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24xKAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UoMSk6IHsKKyAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKKyAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzBdKTsKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKKyAgICAgICAgb2JqZWN0ID0gSlM6OlJvb3RlZE9iamVjdChjb250ZXh0LCAmYXJnLnRvT2JqZWN0KCkpOworICAgICAgfQorICAgICAgaWYgKGFyZy5pc051bWJlcigpKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24yKAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjMoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlKDMpOiB7CisgICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6CisgICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgICAgIEpTOjpSb290ZWRWYWx1ZSBhcmcoY29udGV4dCwgYXJnc1syXSk7CisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7CisgICAgICAgIG9iamVjdCA9IEpTOjpSb290ZWRPYmplY3QoY29udGV4dCwgJmFyZy50b09iamVjdCgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSA/IHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSA6CisgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb241KAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjQoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncworICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gU3RhdGljIHJlYWQvd3JpdGUgYXR0cmlidXRlLgorICAgICAgInN0YXRpY0F0dHJpYnV0ZSIsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIHsgeyAmc3RhdGljZ2V0X3N0YXRpY0F0dHJpYnV0ZSwgTlVMTCB9IH0sCisgICAgICB7IHsgJnN0YXRpY3NldF9zdGF0aWNBdHRyaWJ1dGUsIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZOU1BFQygKKyAgICAgICJzdGF0aWNGdW5jdGlvbiIsIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiU3RhdGljUHJvcGVydGllc0ludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjVmMTZkYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGUyMWU2YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwzODYgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCisKK2Jvb2wgU3RyaW5naWZpZXIoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlPigpLmdldCgpOworICBpZiAoIWltcGwpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKGNvYmFsdDo6c2NyaXB0OjprU3RyaW5naWZpZXJQcm9ibGVtKTsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHN0ZDo6c3RyaW5nIHN0cmluZ2lmaWVkID0gaW1wbC0+QW5vbnltb3VzU3RyaW5naWZpZXIoKTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkU3RyaW5nIHJvb3RlZF9zdHJpbmcoY29udGV4dCwKKyAgICAgIEpTX05ld1N0cmluZ0NvcHlOKGNvbnRleHQsIHN0cmluZ2lmaWVkLmNfc3RyKCksIHN0cmluZ2lmaWVkLmxlbmd0aCgpKSk7CisgIGFyZ3MucnZhbCgpLnNldChKUzo6U3RyaW5nVmFsdWUocm9vdGVkX3N0cmluZykpOworICByZXR1cm4gdHJ1ZTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKCJ0b1N0cmluZyIsIFN0cmluZ2lmaWVyLCBOVUxMLCAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTA3ZTkwOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTE0MzNkNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQ4MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIlN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+dGhlX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X3RoZVN0cmluZ2lmaWVyQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworCisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBpZiAoYXJncy5sZW5ndGgoKSAhPSAxKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBGcm9tSlNWYWx1ZShjb250ZXh0LCBhcmdzWzBdLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3RoZV9zdHJpbmdpZmllcl9hdHRyaWJ1dGUodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitib29sIFN0cmluZ2lmaWVyKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZT4oKS5nZXQoKTsKKyAgaWYgKCFpbXBsKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihjb2JhbHQ6OnNjcmlwdDo6a1N0cmluZ2lmaWVyUHJvYmxlbSk7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBzdGQ6OnN0cmluZyBzdHJpbmdpZmllZCA9IGltcGwtPnRoZV9zdHJpbmdpZmllcl9hdHRyaWJ1dGUoKTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkU3RyaW5nIHJvb3RlZF9zdHJpbmcoY29udGV4dCwKKyAgICAgIEpTX05ld1N0cmluZ0NvcHlOKGNvbnRleHQsIHN0cmluZ2lmaWVkLmNfc3RyKCksIHN0cmluZ2lmaWVkLmxlbmd0aCgpKSk7CisgIGFyZ3MucnZhbCgpLnNldChKUzo6U3RyaW5nVmFsdWUocm9vdGVkX3N0cmluZykpOworICByZXR1cm4gdHJ1ZTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgInRoZVN0cmluZ2lmaWVyQXR0cmlidXRlIiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF90aGVTdHJpbmdpZmllckF0dHJpYnV0ZSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUsIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKCJ0b1N0cmluZyIsIFN0cmluZ2lmaWVyLCBOVUxMLCAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0eSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsIEpTUFJPUF9SRUFET05MWSwKKyAgICAgIE5VTEwsIE5VTEwpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyYzA1Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNGNiMWEzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDQyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworYm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBib29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZVByb3RvdHlwZSIsCit9OworCitjb25zdCBKU0NsYXNzIGludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGZjbl90aGVTdHJpbmdpZmllck9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+VGhlU3RyaW5naWZpZXJPcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2Jvb2wgU3RyaW5naWZpZXIoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlPigpLmdldCgpOworICBpZiAoIWltcGwpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKGNvYmFsdDo6c2NyaXB0OjprU3RyaW5naWZpZXJQcm9ibGVtKTsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHN0ZDo6c3RyaW5nIHN0cmluZ2lmaWVkID0gaW1wbC0+VGhlU3RyaW5naWZpZXJPcGVyYXRpb24oKTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkU3RyaW5nIHJvb3RlZF9zdHJpbmcoY29udGV4dCwKKyAgICAgIEpTX05ld1N0cmluZ0NvcHlOKGNvbnRleHQsIHN0cmluZ2lmaWVkLmNfc3RyKCksIHN0cmluZ2lmaWVkLmxlbmd0aCgpKSk7CisgIGFyZ3MucnZhbCgpLnNldChKUzo6U3RyaW5nVmFsdWUocm9vdGVkX3N0cmluZykpOworICByZXR1cm4gdHJ1ZTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKCJ0b1N0cmluZyIsIFN0cmluZ2lmaWVyLCBOVUxMLCAwLCBKU1BST1BfRU5VTUVSQVRFLCBOVUxMKSwKKyAgSlNfRk5TUEVDKAorICAgICAgInRoZVN0cmluZ2lmaWVyT3BlcmF0aW9uIiwgZmNuX3RoZVN0cmluZ2lmaWVyT3BlcmF0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45OWNmODhiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZV9oCisjZGVmaW5lIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgxNDQ2MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdGFyZ2V0X2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQ1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdGFyZ2V0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlRhcmdldEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzVGFyZ2V0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzVGFyZ2V0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNUYXJnZXRJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNUYXJnZXRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1RhcmdldEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzVGFyZ2V0SW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNUYXJnZXRJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworY29uc3QgSlNDbGFzcyBpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJUYXJnZXRJbnRlcmZhY2UiLAorICAgIDAgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2UsICAvLyB0cmFjZQorfTsKKworY29uc3QgSlNDbGFzcyBwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiVGFyZ2V0SW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJUYXJnZXRJbnRlcmZhY2VDb25zdHJ1Y3RvciIsCisgICAgMCwKKyAgICBOVUxMLCAgLy8gYWRkUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZGVsUHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZ2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gc2V0UHJvcGVydHkKKyAgICBOVUxMLCAgLy8gZW51bWVyYXRlCisgICAgTlVMTCwgIC8vIHJlc29sdmUKKyAgICBOVUxMLCAgLy8gbWF5UmVzb2x2ZQorICAgIE5VTEwsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgJkhhc0luc3RhbmNlLAorICAgIE5VTEwsCit9OworCitib29sIGZjbl9pbXBsZW1lbnRlZEludGVyZmFjZUZ1bmN0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1RhcmdldEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VGFyZ2V0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVGFyZ2V0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFRhcmdldEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5JbXBsZW1lbnRlZEludGVyZmFjZUZ1bmN0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGZjbl9wYXJ0aWFsSW50ZXJmYWNlRnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgJm9iamVjdCkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxUYXJnZXRJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBUYXJnZXRJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VGFyZ2V0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPlBhcnRpYWxJbnRlcmZhY2VGdW5jdGlvbigpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GTlNQRUMoCisgICAgICAiaW1wbGVtZW50ZWRJbnRlcmZhY2VGdW5jdGlvbiIsIGZjbl9pbXBsZW1lbnRlZEludGVyZmFjZUZ1bmN0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZOU1BFQygKKyAgICAgICJwYXJ0aWFsSW50ZXJmYWNlRnVuY3Rpb24iLCBmY25fcGFydGlhbEludGVyZmFjZUZ1bmN0aW9uLCBOVUxMLAorICAgICAgMCwgSlNQUk9QX0VOVU1FUkFURSwgTlVMTCksCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgIGNvbnRleHQsICZwcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZQorICApOworCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfcHJvdG90eXBlLAorICAgICAgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworCisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIlRhcmdldEludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNUYXJnZXRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgICAgIGNvbnRleHQsICZpbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KAorICAgICAgICAgIGNvbnRleHQsIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpLCBuZXdfb2JqZWN0LCBwcm90b3R5cGUpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vIHN0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNUYXJnZXRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MocHJvdG90eXBlKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1RhcmdldEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdGFyZ2V0X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU4MjYwZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1RhcmdldEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzVGFyZ2V0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzVGFyZ2V0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1RhcmdldEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3Rlc3RfZGljdGlvbmFyeS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190ZXN0X2RpY3Rpb25hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZWY5MTIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190ZXN0X2RpY3Rpb25hcnkuaApAQCAtMCwwICsxLDI1MyBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2RpY3Rpb25hcnktY29udmVyc2lvbi5oLnRlbXBsYXRlCisKKyNpZm5kZWYgVGVzdERpY3Rpb25hcnlfY29udmVyc2lvbl9oCisjZGVmaW5lIFRlc3REaWN0aW9uYXJ5X2NvbnZlcnNpb25faAorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGVzdF9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNjbnR4dC5oIgorCit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpUZXN0RGljdGlvbmFyeTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc2NyaXB0IHsKK25hbWVzcGFjZSBtb3pqcyB7CisKK2lubGluZSB2b2lkIFRvSlNWYWx1ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgY29uc3QgVGVzdERpY3Rpb25hcnkmIGluX2RpY3Rpb25hcnksCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKKyAgLy8gQ3JlYXRlIGEgbmV3IG9iamVjdCB0aGF0IHdpbGwgaG9sZCB0aGUgZGljdGlvbmFyeSB2YWx1ZXMuCisgIEpTOjpSb290ZWRPYmplY3QgZGljdGlvbmFyeV9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19OZXdPYmplY3QoY29udGV4dCwgbnVsbHB0cikpOworICBjb25zdCBpbnQga1Byb3BlcnR5QXR0cmlidXRlcyA9IEpTUFJPUF9FTlVNRVJBVEU7CisgIGlmIChpbl9kaWN0aW9uYXJ5Lmhhc19ib29sZWFuX21lbWJlcigpKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG1lbWJlcl92YWx1ZShjb250ZXh0KTsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwgaW5fZGljdGlvbmFyeS5ib29sZWFuX21lbWJlcigpLCAmbWVtYmVyX3ZhbHVlKTsKKyAgICBpZiAoIUpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImJvb2xlYW5NZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLCBrUHJvcGVydHlBdHRyaWJ1dGVzLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgLy8gU29tZSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4KKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKGluX2RpY3Rpb25hcnkuaGFzX2xvbmdfbWVtYmVyKCkpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgbWVtYmVyX3ZhbHVlKGNvbnRleHQpOworICAgIFRvSlNWYWx1ZShjb250ZXh0LCBpbl9kaWN0aW9uYXJ5LmxvbmdfbWVtYmVyKCksICZtZW1iZXJfdmFsdWUpOworICAgIGlmICghSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibG9uZ01lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfdmFsdWUsIGtQcm9wZXJ0eUF0dHJpYnV0ZXMsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAvLyBTb21lIGludGVybmFsIGVycm9yIG9jY3VycmVkLgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZiAoaW5fZGljdGlvbmFyeS5oYXNfZG91YmxlX21lbWJlcigpKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG1lbWJlcl92YWx1ZShjb250ZXh0KTsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwgaW5fZGljdGlvbmFyeS5kb3VibGVfbWVtYmVyKCksICZtZW1iZXJfdmFsdWUpOworICAgIGlmICghSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiZG91YmxlTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcl92YWx1ZSwga1Byb3BlcnR5QXR0cmlidXRlcywgbnVsbHB0ciwgbnVsbHB0cikpIHsKKyAgICAgIC8vIFNvbWUgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuCisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmIChpbl9kaWN0aW9uYXJ5Lmhhc19zdHJpbmdfbWVtYmVyKCkpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgbWVtYmVyX3ZhbHVlKGNvbnRleHQpOworICAgIFRvSlNWYWx1ZShjb250ZXh0LCBpbl9kaWN0aW9uYXJ5LnN0cmluZ19tZW1iZXIoKSwgJm1lbWJlcl92YWx1ZSk7CisgICAgaWYgKCFKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLCBrUHJvcGVydHlBdHRyaWJ1dGVzLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgLy8gU29tZSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4KKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKGluX2RpY3Rpb25hcnkuaGFzX2ludGVyZmFjZV9tZW1iZXIoKSkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBtZW1iZXJfdmFsdWUoY29udGV4dCk7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsIGluX2RpY3Rpb25hcnkuaW50ZXJmYWNlX21lbWJlcigpLCAmbWVtYmVyX3ZhbHVlKTsKKyAgICBpZiAoIUpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImludGVyZmFjZU1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfdmFsdWUsIGtQcm9wZXJ0eUF0dHJpYnV0ZXMsIG51bGxwdHIsIG51bGxwdHIpKSB7CisgICAgICAvLyBTb21lIGludGVybmFsIGVycm9yIG9jY3VycmVkLgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZiAoaW5fZGljdGlvbmFyeS5oYXNfbWVtYmVyX3dpdGhfZGVmYXVsdCgpKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG1lbWJlcl92YWx1ZShjb250ZXh0KTsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwgaW5fZGljdGlvbmFyeS5tZW1iZXJfd2l0aF9kZWZhdWx0KCksICZtZW1iZXJfdmFsdWUpOworICAgIGlmICghSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVtYmVyV2l0aERlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLCBrUHJvcGVydHlBdHRyaWJ1dGVzLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgLy8gU29tZSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4KKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKGluX2RpY3Rpb25hcnkuaGFzX25vbl9kZWZhdWx0X21lbWJlcigpKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG1lbWJlcl92YWx1ZShjb250ZXh0KTsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwgaW5fZGljdGlvbmFyeS5ub25fZGVmYXVsdF9tZW1iZXIoKSwgJm1lbWJlcl92YWx1ZSk7CisgICAgaWYgKCFKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJub25EZWZhdWx0TWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcl92YWx1ZSwga1Byb3BlcnR5QXR0cmlidXRlcywgbnVsbHB0ciwgbnVsbHB0cikpIHsKKyAgICAgIC8vIFNvbWUgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuCisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIG91dF92YWx1ZS5zZXRPYmplY3QoKmRpY3Rpb25hcnlfb2JqZWN0KTsKK30KKworaW5saW5lIHZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCisgICAgICAgICAgICAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzLCBFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICBUZXN0RGljdGlvbmFyeSogb3V0X2RpY3Rpb25hcnkpIHsKKyAgRENIRUNLX0VRKDAsIGNvbnZlcnNpb25fZmxhZ3MpIDw8ICJVbmV4cGVjdGVkIGNvbnZlcnNpb24gZmxhZ3MuIjsKKyAgLy8gaHR0cHM6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZXMtZGljdGlvbmFyeQorCisgIGlmICh2YWx1ZS5pc1VuZGVmaW5lZCgpIHx8IHZhbHVlLmlzTnVsbCgpKSB7CisgICAgLy8gVGhlIGRlZmF1bHQgY29uc3RydWN0b3Igd2lsbCBhc3NpZ24gYXBwcm9wcmlhdGUgdmFsdWVzIHRvIGRpY3Rpb25hcnkKKyAgICAvLyBtZW1iZXJzIHdpdGggZGVmYXVsdCB2YWx1ZXMgYW5kIGxlYXZlIHRoZSBvdGhlcnMgdW5zZXQuCisgICAgKm91dF9kaWN0aW9uYXJ5ID0gVGVzdERpY3Rpb25hcnkoKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCF2YWx1ZS5pc09iamVjdCgpKSB7CisgICAgLy8gMS4gSWYgVHlwZShWKSBpcyBub3QgVW5kZWZpbmVkLCBOdWxsIG9yIE9iamVjdCwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci4KKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrTm90T2JqZWN0VHlwZSk7CisgICAgcmV0dXJuOworICB9CisgIEpTOjpSb290ZWRPYmplY3QgZGljdGlvbmFyeV9vYmplY3QoY29udGV4dCwgJnZhbHVlLnRvT2JqZWN0KCkpOworICBKUzo6Um9vdGVkVmFsdWUgYm9vbGVhbl9tZW1iZXIoY29udGV4dCk7CisgIGlmICghSlNfR2V0UHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgImJvb2xlYW5NZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICZib29sZWFuX21lbWJlcikpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrU2ltcGxlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWJvb2xlYW5fbWVtYmVyLmlzVW5kZWZpbmVkKCkpIHsKKyAgICBib29sIGNvbnZlcnRlZF92YWx1ZTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCBib29sZWFuX21lbWJlciwgMCwgZXhjZXB0aW9uX3N0YXRlLCAmY29udmVydGVkX3ZhbHVlKTsKKyAgICBpZiAoY29udGV4dC0+aXNFeGNlcHRpb25QZW5kaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X2RpY3Rpb25hcnktPnNldF9ib29sZWFuX21lbWJlcihjb252ZXJ0ZWRfdmFsdWUpOworICB9CisgIEpTOjpSb290ZWRWYWx1ZSBsb25nX21lbWJlcihjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAibG9uZ01lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgJmxvbmdfbWVtYmVyKSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtTaW1wbGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbG9uZ19tZW1iZXIuaXNVbmRlZmluZWQoKSkgeworICAgIGludDMyX3QgY29udmVydGVkX3ZhbHVlOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGxvbmdfbWVtYmVyLCAwLCBleGNlcHRpb25fc3RhdGUsICZjb252ZXJ0ZWRfdmFsdWUpOworICAgIGlmIChjb250ZXh0LT5pc0V4Y2VwdGlvblBlbmRpbmcoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvdXRfZGljdGlvbmFyeS0+c2V0X2xvbmdfbWVtYmVyKGNvbnZlcnRlZF92YWx1ZSk7CisgIH0KKyAgSlM6OlJvb3RlZFZhbHVlIGRvdWJsZV9tZW1iZXIoY29udGV4dCk7CisgIGlmICghSlNfR2V0UHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZU1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgJmRvdWJsZV9tZW1iZXIpKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa1NpbXBsZUVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFkb3VibGVfbWVtYmVyLmlzVW5kZWZpbmVkKCkpIHsKKyAgICBkb3VibGUgY29udmVydGVkX3ZhbHVlOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGRvdWJsZV9tZW1iZXIsIDAsIGV4Y2VwdGlvbl9zdGF0ZSwgJmNvbnZlcnRlZF92YWx1ZSk7CisgICAgaWYgKGNvbnRleHQtPmlzRXhjZXB0aW9uUGVuZGluZygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG91dF9kaWN0aW9uYXJ5LT5zZXRfZG91YmxlX21lbWJlcihjb252ZXJ0ZWRfdmFsdWUpOworICB9CisgIEpTOjpSb290ZWRWYWx1ZSBzdHJpbmdfbWVtYmVyKGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICJzdHJpbmdNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICZzdHJpbmdfbWVtYmVyKSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtTaW1wbGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghc3RyaW5nX21lbWJlci5pc1VuZGVmaW5lZCgpKSB7CisgICAgc3RkOjpzdHJpbmcgY29udmVydGVkX3ZhbHVlOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHN0cmluZ19tZW1iZXIsIDAsIGV4Y2VwdGlvbl9zdGF0ZSwgJmNvbnZlcnRlZF92YWx1ZSk7CisgICAgaWYgKGNvbnRleHQtPmlzRXhjZXB0aW9uUGVuZGluZygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG91dF9kaWN0aW9uYXJ5LT5zZXRfc3RyaW5nX21lbWJlcihjb252ZXJ0ZWRfdmFsdWUpOworICB9CisgIEpTOjpSb290ZWRWYWx1ZSBpbnRlcmZhY2VfbWVtYmVyKGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2VNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmZhY2VfbWVtYmVyKSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtTaW1wbGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghaW50ZXJmYWNlX21lbWJlci5pc1VuZGVmaW5lZCgpKSB7CisgICAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGNvbnZlcnRlZF92YWx1ZTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpbnRlcmZhY2VfbWVtYmVyLCAwLCBleGNlcHRpb25fc3RhdGUsICZjb252ZXJ0ZWRfdmFsdWUpOworICAgIGlmIChjb250ZXh0LT5pc0V4Y2VwdGlvblBlbmRpbmcoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvdXRfZGljdGlvbmFyeS0+c2V0X2ludGVyZmFjZV9tZW1iZXIoY29udmVydGVkX3ZhbHVlKTsKKyAgfQorICBKUzo6Um9vdGVkVmFsdWUgbWVtYmVyX3dpdGhfZGVmYXVsdChjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAibWVtYmVyV2l0aERlZmF1bHQiLAorICAgICAgICAgICAgICAgICAgICAgICZtZW1iZXJfd2l0aF9kZWZhdWx0KSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtTaW1wbGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbWVtYmVyX3dpdGhfZGVmYXVsdC5pc1VuZGVmaW5lZCgpKSB7CisgICAgaW50MzJfdCBjb252ZXJ0ZWRfdmFsdWU7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgbWVtYmVyX3dpdGhfZGVmYXVsdCwgMCwgZXhjZXB0aW9uX3N0YXRlLCAmY29udmVydGVkX3ZhbHVlKTsKKyAgICBpZiAoY29udGV4dC0+aXNFeGNlcHRpb25QZW5kaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X2RpY3Rpb25hcnktPnNldF9tZW1iZXJfd2l0aF9kZWZhdWx0KGNvbnZlcnRlZF92YWx1ZSk7CisgIH0KKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9kZWZhdWx0X21lbWJlcihjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAibm9uRGVmYXVsdE1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgJm5vbl9kZWZhdWx0X21lbWJlcikpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrU2ltcGxlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIW5vbl9kZWZhdWx0X21lbWJlci5pc1VuZGVmaW5lZCgpKSB7CisgICAgaW50MzJfdCBjb252ZXJ0ZWRfdmFsdWU7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgbm9uX2RlZmF1bHRfbWVtYmVyLCAwLCBleGNlcHRpb25fc3RhdGUsICZjb252ZXJ0ZWRfdmFsdWUpOworICAgIGlmIChjb250ZXh0LT5pc0V4Y2VwdGlvblBlbmRpbmcoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvdXRfZGljdGlvbmFyeS0+c2V0X25vbl9kZWZhdWx0X21lbWJlcihjb252ZXJ0ZWRfdmFsdWUpOworICB9Cit9CisKK30KK30KK30KKworI2VuZGlmICAvLyBUZXN0RGljdGlvbmFyeV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3VuaW9uX3R5cGVzX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdW5pb25fdHlwZXNfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJkNGU3YTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3VuaW9uX3R5cGVzX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDc0NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VW5pb25UeXBlc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzVW5pb25UeXBlc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkJhc2VJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQmFzZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitib29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIGJvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2NvbnN0IEpTQ2xhc3MgaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiA9IHsKKyAgICAiVW5pb25UeXBlc0ludGVyZmFjZSIsCisgICAgMCB8IEpTQ0xBU1NfSEFTX1BSSVZBVEUsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplciwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICBOVUxMLCAgLy8gaGFzSW5zdGFuY2UKKyAgICBOVUxMLCAgLy8gY29uc3RydWN0CisgICAgJldyYXBwZXJQcml2YXRlOjpUcmFjZSwgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJVbmlvblR5cGVzSW50ZXJmYWNlUHJvdG90eXBlIiwKK307CisKK2NvbnN0IEpTQ2xhc3MgaW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uID0geworICAgICJVbmlvblR5cGVzSW50ZXJmYWNlQ29uc3RydWN0b3IiLAorICAgIDAsCisgICAgTlVMTCwgIC8vIGFkZFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGRlbFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGdldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIHNldFByb3BlcnR5CisgICAgTlVMTCwgIC8vIGVudW1lcmF0ZQorICAgIE5VTEwsICAvLyByZXNvbHZlCisgICAgTlVMTCwgIC8vIG1heVJlc29sdmUKKyAgICBOVUxMLCAgLy8gZmluYWxpemUKKyAgICBOVUxMLCAgLy8gY2FsbAorICAgICZIYXNJbnN0YW5jZSwKKyAgICBOVUxMLAorfTsKKworYm9vbCBnZXRfdW5pb25Qcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnVuaW9uX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfdW5pb25Qcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHNjcmlwdDo6VW5pb25UeXBlNDxzdGQ6OnN0cmluZywgYm9vbCwgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+LCBpbnQzMl90ID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfdW5pb25fcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBnZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnVuaW9uX3dpdGhfbnVsbGFibGVfbWVtYmVyX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHNjcmlwdDo6VW5pb25UeXBlMjxkb3VibGUsIHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF91bmlvbl93aXRoX251bGxhYmxlX21lbWJlcl9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIGdldF9udWxsYWJsZVVuaW9uUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV91bmlvbl9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgc2V0X251bGxhYmxlVW5pb25Qcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHNjcmlwdDo6VW5pb25UeXBlMjxkb3VibGUsIHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfbnVsbGFibGVfdW5pb25fcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBnZXRfdW5pb25CYXNlUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCwgJmFyZ3MudGhpc3YoKS50b09iamVjdCgpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT51bmlvbl9iYXNlX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBzZXRfdW5pb25CYXNlUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworCisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzY3JpcHQ6OlVuaW9uVHlwZTI8c2NvcGVkX3JlZnB0cjxCYXNlSW50ZXJmYWNlPiwgc3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgIT0gMSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgYXJnc1swXSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF91bmlvbl9iYXNlX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgInVuaW9uUHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3VuaW9uUHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X3VuaW9uUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgInVuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHkiLAorICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgIHsgeyAmZ2V0X3VuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X3VuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgIm51bGxhYmxlVW5pb25Qcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfbnVsbGFibGVVbmlvblByb3BlcnR5LCBOVUxMIH0gfSwKKyAgICB7IHsgJnNldF9udWxsYWJsZVVuaW9uUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgInVuaW9uQmFzZVByb3BlcnR5IiwKKyAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICB7IHsgJmdldF91bmlvbkJhc2VQcm9wZXJ0eSwgTlVMTCB9IH0sCisgICAgeyB7ICZzZXRfdW5pb25CYXNlUHJvcGVydHksIE5VTEwgfSB9LAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiVW5pb25UeXBlc0ludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnR5KAorICAgICAgY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgTlVMTCwgTlVMTCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgICAgICBjb250ZXh0LCAmaW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgbmV3X29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvLyBzdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc191bmlvbl90eXBlc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDljMWM5YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3dpbmRvdy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Mzk0M2QzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuY2MKQEAgLTAsMCArMSwxMDQ5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaWN0aW9uYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rpc2FibGVkX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW1wbGVtZW50ZWRfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYmFzZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19mdW5jdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RhbnRzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RpY3Rpb25hcnlfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2VudW1lcmF0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbXBsZW1lbnRlZF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190YXJnZXRfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfd2luZG93LmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcXVlbmNlX3VzZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy90YXJnZXRfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvd2luZG93LmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6V2luZG93OwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNXaW5kb3c7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOworI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbmRpdGlvbmFsSW50ZXJmYWNlOworI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDb25zdGFudHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDb25zdHJ1Y3RvckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGVyaXZlZEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRpY3Rpb25hcnlJbnRlcmZhY2U7CisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGlzYWJsZWRJbnRlcmZhY2U7CisjZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkVudW1lcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RXhjZXB0aW9uc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkdldE9wYXF1ZVJvb3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHbG9iYWxJbnRlcmZhY2VQYXJlbnQ7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpJbXBsZW1lbnRlZEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Jhc2VJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U7CisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25kaXRpb25hbEludGVyZmFjZTsKKyNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdGFudHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rlcml2ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U7CisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEaXNhYmxlZEludGVyZmFjZTsKKyNlbmRpZiAgLy8gZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFbnVtZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeGNlcHRpb25zSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNJbXBsZW1lbnRlZEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NlcXVlbmNlVXNlcjsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNUYXJnZXRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1dpbmRvdzsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Tm9Db25zdHJ1Y3RvckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpQdXRGb3J3YXJkc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlNlcXVlbmNlVXNlcjsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlNpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpUYXJnZXRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpVbmlvblR5cGVzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6V2luZG93OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK0pTT2JqZWN0KiBEdW1teUZ1bmN0b3IoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBOT1RSRUFDSEVEKCk7CisgIHJldHVybiBOVUxMOworfQorfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNXaW5kb3dIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc1dpbmRvd0hhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1dpbmRvd0hhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzV2luZG93SGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNXaW5kb3dIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK2Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgYm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1dpbmRvdzo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU0NsYXNzIGluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIldpbmRvdyIsCisgICAgSlNDTEFTU19HTE9CQUxfRkxBR1MgfCBKU0NMQVNTX0hBU19QUklWQVRFLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXIsICAvLyBmaW5hbGl6ZQorICAgIE5VTEwsICAvLyBjYWxsCisgICAgTlVMTCwgIC8vIGhhc0luc3RhbmNlCisgICAgTlVMTCwgIC8vIGNvbnN0cnVjdAorICAgIEpTX0dsb2JhbE9iamVjdFRyYWNlSG9vaywgIC8vIHRyYWNlCit9OworCitjb25zdCBKU0NsYXNzIHByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uID0geworICAgICJXaW5kb3dQcm90b3R5cGUiLAorfTsKKworY29uc3QgSlNDbGFzcyBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24gPSB7CisgICAgIldpbmRvd0NvbnN0cnVjdG9yIiwKKyAgICAwLAorICAgIE5VTEwsICAvLyBhZGRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBkZWxQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBnZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBzZXRQcm9wZXJ0eQorICAgIE5VTEwsICAvLyBlbnVtZXJhdGUKKyAgICBOVUxMLCAgLy8gcmVzb2x2ZQorICAgIE5VTEwsICAvLyBtYXlSZXNvbHZlCisgICAgTlVMTCwgIC8vIGZpbmFsaXplCisgICAgTlVMTCwgIC8vIGNhbGwKKyAgICAmSGFzSW5zdGFuY2UsCisgICAgTlVMTCwKK307CisKK2Jvb2wgZ2V0X3dpbmRvd1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzV2luZG93OjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxXaW5kb3c+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBXaW5kb3cqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8V2luZG93PigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT53aW5kb3dfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIHNldF93aW5kb3dQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsICZhcmdzLnRoaXN2KCkudG9PYmplY3QoKSk7CisKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNXaW5kb3c6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFdpbmRvdyogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIGlmIChhcmdzLmxlbmd0aCgpICE9IDEpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGFyZ3NbMF0sIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfd2luZG93X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZ2V0X3dpbmRvdygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCAmYXJncy50aGlzdigpLnRvT2JqZWN0KCkpOworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1dpbmRvdzo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8V2luZG93PigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgV2luZG93KiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFdpbmRvdz4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+d2luZG93KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitib29sIGZjbl9nZXRTdGFja1RyYWNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsICZvYmplY3QpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1dpbmRvdzo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8V2luZG93PigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgV2luZG93KiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFdpbmRvdz4oKS5nZXQoKTsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogY2FsbHdpdGhfZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkdldFN0YWNrVHJhY2UoY2FsbHdpdGhfZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRTdGFja1RyYWNlKCkpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgZmNuX3dpbmRvd09wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCAmb2JqZWN0KSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNXaW5kb3c6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFdpbmRvdyogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7CisKKyAgaW1wbC0+V2luZG93T3BlcmF0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICJ3aW5kb3dQcm9wZXJ0eSIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfd2luZG93UHJvcGVydHksIE5VTEwgfSB9LAorICAgIHsgeyAmc2V0X3dpbmRvd1Byb3BlcnR5LCBOVUxMIH0gfSwKKyAgfSwKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgIndpbmRvdyIsCisgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgeyB7ICZnZXRfd2luZG93LCBOVUxMIH0gfSwKKyAgICBKU05BVElWRV9XUkFQUEVSKE5VTEwpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRk5TUEVDKAorICAgICAgImdldFN0YWNrVHJhY2UiLCBmY25fZ2V0U3RhY2tUcmFjZSwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GTlNQRUMoCisgICAgICAid2luZG93T3BlcmF0aW9uIiwgZmNuX3dpbmRvd09wZXJhdGlvbiwgTlVMTCwKKyAgICAgIDAsIEpTUFJPUF9FTlVNRVJBVEUsIE5VTEwpLAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgY29udGV4dCwgJnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlCisgICk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUsCisgICAgICBwcm90b3R5cGVfcHJvcGVydGllcyk7CisKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgcm9vdGVkX3Byb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiV2luZG93IjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydHkoCisgICAgICBjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLCBKU1BST1BfUkVBRE9OTFksCisgICAgICBOVUxMLCBOVUxMKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitKU09iamVjdCogTW96anNXaW5kb3c6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfTmV3R2xvYmFsT2JqZWN0KGNvbnRleHQsCisgICAgICAgICAgJmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIE5VTEwsCisgICAgICAgICAgSlM6OkZpcmVPbk5ld0dsb2JhbEhvb2ssCisgICAgICAgICAgSlM6OkNvbXBhcnRtZW50T3B0aW9ucygpLnNldFRyYWNlKFdyYXBwZXJQcml2YXRlOjpUcmFjZSkpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIC8vIEluaXRpYWxpemUgc3RhbmRhcmQgSlMgY29uc3RydWN0b3JzIHByb3RvdHlwZXMgYW5kIHRvcC1sZXZlbCBmdW5jdGlvbnMgc3VjaAorICAvLyBhcyBPYmplY3QsIGlzTmFuLCBldGMuCisgIEpTQXV0b0NvbXBhcnRtZW50IGF1dG9fY29tcGFydG1lbnQoY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0luaXRTdGFuZGFyZENsYXNzZXMoY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzV2luZG93OjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlNfU2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QsIHByb3RvdHlwZSk7CisKKyAgSlNfU2V0SW1tdXRhYmxlUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QsICZzdWNjZXNzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCBvd24gcHJvcGVydGllcy4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgZ2xvYmFsX29iamVjdCwgb3duX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eSgKKyAgICAgICAgICBjb250ZXh0LCBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSwgZ2xvYmFsX29iamVjdCwgcHJvdG90eXBlKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKworICAvLyBTZXQgdGhlIGdsb2JhbCBvYmplY3QgcHJveHkgcG9pbnRlciwgc28gd2UgY2FuIGFjY2VzcyB0aGUgc3RhbmRhcmQgY2xhc3NlcworICAvLyBzdWNoIGFzIHRoZSBiYXNlIE9iamVjdCBwcm90b3R5cGUgd2hlbiBsb29raW5nIHVwIG91ciBwcm90b3R5cGUuCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBnbG9iYWxfZW52aXJvbm1lbnQtPlNldEdsb2JhbE9iamVjdFByb3h5QW5kV3JhcHBlcihwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorLy8gc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc1dpbmRvdzo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcyhwcm90b3R5cGUpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzV2luZG93OjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNXaW5kb3c6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc2NyaXB0IHsKKwordGVtcGxhdGU8Pgordm9pZCBHbG9iYWxFbnZpcm9ubWVudDo6Q3JlYXRlR2xvYmFsT2JqZWN0PFdpbmRvdz4oCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxXaW5kb3c+JiBnbG9iYWxfaW50ZXJmYWNlLAorICAgIEVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzKSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIG1vempzX2dsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4odGhpcyk7CisgIEpTQ29udGV4dCogY29udGV4dCA9IG1vempzX2dsb2JhbF9lbnZpcm9ubWVudC0+Y29udGV4dCgpOworCisgIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHQpOworICBNb3pqc1dpbmRvdzo6Q3JlYXRlUHJveHkoCisgICAgICBjb250ZXh0LCBnbG9iYWxfaW50ZXJmYWNlKTsKKyAgbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LT5TZXRFbnZpcm9ubWVudFNldHRpbmdzKGVudmlyb25tZW50X3NldHRpbmdzKTsKKworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0KKyAgICAgIG1vempzX2dsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQXJiaXRyYXJ5SW50ZXJmYWNlOjpBcmJpdHJhcnlJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEJhc2VJbnRlcmZhY2U6OkJhc2VJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQmFzZUludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Jhc2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIENvbmRpdGlvbmFsSW50ZXJmYWNlOjpDb25kaXRpb25hbEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQ29uc3RhbnRzSW50ZXJmYWNlOjpDb25zdGFudHNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIENvbnN0cnVjdG9ySW50ZXJmYWNlOjpDb25zdHJ1Y3RvckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpET01TdHJpbmdUZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgRGVyaXZlZEludGVyZmFjZTo6RGVyaXZlZEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNEZXJpdmVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzRGVyaXZlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBEaWN0aW9uYXJ5SW50ZXJmYWNlOjpEaWN0aW9uYXJ5SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBEaXNhYmxlZEludGVyZmFjZTo6RGlzYWJsZWRJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNEaXNhYmxlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpFbnVtZXJhdGlvbkludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBFeGNlcHRpb25zSW50ZXJmYWNlOjpFeGNlcHRpb25zSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6RXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0T3BhcXVlUm9vdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6Okdsb2JhbEludGVyZmFjZVBhcmVudFdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgSW1wbGVtZW50ZWRJbnRlcmZhY2U6OkltcGxlbWVudGVkSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0ltcGxlbWVudGVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzSW1wbGVtZW50ZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgSW5kZXhlZEdldHRlckludGVyZmFjZTo6SW5kZXhlZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIE5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U6Ok5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTmFtZWRHZXR0ZXJJbnRlcmZhY2U6Ok5hbWVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIE5vQ29uc3RydWN0b3JJbnRlcmZhY2U6Ok5vQ29uc3RydWN0b3JJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6Ok5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6Ok51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6Ok9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6Ok9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlB1dEZvcndhcmRzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgU2VxdWVuY2VVc2VyOjpTZXF1ZW5jZVVzZXJXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzU2VxdWVuY2VVc2VyOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OlN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OlN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgVGFyZ2V0SW50ZXJmYWNlOjpUYXJnZXRJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzVGFyZ2V0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzVGFyZ2V0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIFVuaW9uVHlwZXNJbnRlcmZhY2U6OlVuaW9uVHlwZXNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgV2luZG93OjpXaW5kb3dXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKER1bW15RnVuY3RvciksCisgICAgICBiYXNlOjpCaW5kKE1vempzV2luZG93OjpQcm90b3R5cGVDbGFzcykpOworCit9CisKKy8vIE1TVlMgY29tcGlsZXIgZG9lcyBub3QgbmVlZCB0aGlzIGV4cGxpY2l0IGluc3RhbnRpYXRpb24sIGFuZCBnZW5lcmF0ZXMgYQorLy8gY29tcGlsZXIgZXJyb3IuCisjaWYgIWRlZmluZWQoX01TQ19WRVIpCisvLyBFeHBsaWNpdGx5IGluc3RhbnRpYXRlIHRoZSB0ZW1wbGF0ZSBmdW5jdGlvbiBmb3IgdGVtcGxhdGUgdHlwZSBXaW5kb3cKKy8vIFRoaXMgaXMgbmVlZGVkIHRvIHByZXZlbnQgbGluayBlcnJvcnMgd2hlbiB0cnlpbmcgdG8gcmVzb2x2ZSB0aGUgdGVtcGxhdGUKKy8vIGluc3RhbnRpYXRpb24uCit0ZW1wbGF0ZQordm9pZCBHbG9iYWxFbnZpcm9ubWVudDo6Q3JlYXRlR2xvYmFsT2JqZWN0PFdpbmRvdz4oCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxXaW5kb3c+JiBnbG9iYWxfaW50ZXJmYWNlLAorICAgIEVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzKTsKKyNlbmRpZgorCit9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy00NS90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3dpbmRvdy5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYTZhY2I2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1dpbmRvd19oCisjZGVmaW5lIE1vempzV2luZG93X2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvd2luZG93LmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc1dpbmRvdyB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNXaW5kb3dfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMtNDUvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy90ZXN0X2RpY3Rpb25hcnkuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGVzdF9kaWN0aW9uYXJ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzhkODE3OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzLTQ1L3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGVzdF9kaWN0aW9uYXJ5LmgKQEAgLTAsMCArMSwxNTggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL3RlbXBsYXRlcy9kaWN0aW9uYXJ5LmgudGVtcGxhdGUKKworI2lmbmRlZiBUZXN0RGljdGlvbmFyeV9oCisjZGVmaW5lIFRlc3REaWN0aW9uYXJ5X2gKKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgVGVzdERpY3Rpb25hcnkgeworIHB1YmxpYzoKKyAgVGVzdERpY3Rpb25hcnkoKSB7CisgICAgaGFzX2Jvb2xlYW5fbWVtYmVyXyA9IGZhbHNlOworICAgIGJvb2xlYW5fbWVtYmVyXyA9IGJvb2woKTsKKyAgICBoYXNfbG9uZ19tZW1iZXJfID0gZmFsc2U7CisgICAgbG9uZ19tZW1iZXJfID0gaW50MzJfdCgpOworICAgIGhhc19kb3VibGVfbWVtYmVyXyA9IGZhbHNlOworICAgIGRvdWJsZV9tZW1iZXJfID0gZG91YmxlKCk7CisgICAgaGFzX3N0cmluZ19tZW1iZXJfID0gZmFsc2U7CisgICAgc3RyaW5nX21lbWJlcl8gPSBzdGQ6OnN0cmluZygpOworICAgIGhhc19pbnRlcmZhY2VfbWVtYmVyXyA9IGZhbHNlOworICAgIGludGVyZmFjZV9tZW1iZXJfID0gc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+KCk7CisgICAgaGFzX21lbWJlcl93aXRoX2RlZmF1bHRfID0gdHJ1ZTsKKyAgICBtZW1iZXJfd2l0aF9kZWZhdWx0XyA9IDU7CisgICAgaGFzX25vbl9kZWZhdWx0X21lbWJlcl8gPSBmYWxzZTsKKyAgICBub25fZGVmYXVsdF9tZW1iZXJfID0gaW50MzJfdCgpOworICB9CisKKyAgYm9vbCBoYXNfYm9vbGVhbl9tZW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19ib29sZWFuX21lbWJlcl87CisgIH0KKyAgYm9vbCBib29sZWFuX21lbWJlcigpIGNvbnN0IHsKKyAgICBEQ0hFQ0soaGFzX2Jvb2xlYW5fbWVtYmVyXyk7CisgICAgcmV0dXJuIGJvb2xlYW5fbWVtYmVyXzsKKyAgfQorICB2b2lkIHNldF9ib29sZWFuX21lbWJlcihib29sIHZhbHVlKSB7CisgICAgaGFzX2Jvb2xlYW5fbWVtYmVyXyA9IHRydWU7CisgICAgYm9vbGVhbl9tZW1iZXJfID0gdmFsdWU7CisgIH0KKworICBib29sIGhhc19sb25nX21lbWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzX2xvbmdfbWVtYmVyXzsKKyAgfQorICBpbnQzMl90IGxvbmdfbWVtYmVyKCkgY29uc3QgeworICAgIERDSEVDSyhoYXNfbG9uZ19tZW1iZXJfKTsKKyAgICByZXR1cm4gbG9uZ19tZW1iZXJfOworICB9CisgIHZvaWQgc2V0X2xvbmdfbWVtYmVyKGludDMyX3QgdmFsdWUpIHsKKyAgICBoYXNfbG9uZ19tZW1iZXJfID0gdHJ1ZTsKKyAgICBsb25nX21lbWJlcl8gPSB2YWx1ZTsKKyAgfQorCisgIGJvb2wgaGFzX2RvdWJsZV9tZW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19kb3VibGVfbWVtYmVyXzsKKyAgfQorICBkb3VibGUgZG91YmxlX21lbWJlcigpIGNvbnN0IHsKKyAgICBEQ0hFQ0soaGFzX2RvdWJsZV9tZW1iZXJfKTsKKyAgICByZXR1cm4gZG91YmxlX21lbWJlcl87CisgIH0KKyAgdm9pZCBzZXRfZG91YmxlX21lbWJlcihkb3VibGUgdmFsdWUpIHsKKyAgICBoYXNfZG91YmxlX21lbWJlcl8gPSB0cnVlOworICAgIGRvdWJsZV9tZW1iZXJfID0gdmFsdWU7CisgIH0KKworICBib29sIGhhc19zdHJpbmdfbWVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBoYXNfc3RyaW5nX21lbWJlcl87CisgIH0KKyAgc3RkOjpzdHJpbmcgc3RyaW5nX21lbWJlcigpIGNvbnN0IHsKKyAgICBEQ0hFQ0soaGFzX3N0cmluZ19tZW1iZXJfKTsKKyAgICByZXR1cm4gc3RyaW5nX21lbWJlcl87CisgIH0KKyAgdm9pZCBzZXRfc3RyaW5nX21lbWJlcihjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgICBoYXNfc3RyaW5nX21lbWJlcl8gPSB0cnVlOworICAgIHN0cmluZ19tZW1iZXJfID0gdmFsdWU7CisgIH0KKworICBib29sIGhhc19pbnRlcmZhY2VfbWVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBoYXNfaW50ZXJmYWNlX21lbWJlcl87CisgIH0KKyAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGludGVyZmFjZV9tZW1iZXIoKSBjb25zdCB7CisgICAgRENIRUNLKGhhc19pbnRlcmZhY2VfbWVtYmVyXyk7CisgICAgcmV0dXJuIGludGVyZmFjZV9tZW1iZXJfOworICB9CisgIHZvaWQgc2V0X2ludGVyZmFjZV9tZW1iZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+JiB2YWx1ZSkgeworICAgIGhhc19pbnRlcmZhY2VfbWVtYmVyXyA9IHRydWU7CisgICAgaW50ZXJmYWNlX21lbWJlcl8gPSB2YWx1ZTsKKyAgfQorCisgIGJvb2wgaGFzX21lbWJlcl93aXRoX2RlZmF1bHQoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19tZW1iZXJfd2l0aF9kZWZhdWx0XzsKKyAgfQorICBpbnQzMl90IG1lbWJlcl93aXRoX2RlZmF1bHQoKSBjb25zdCB7CisgICAgRENIRUNLKGhhc19tZW1iZXJfd2l0aF9kZWZhdWx0Xyk7CisgICAgcmV0dXJuIG1lbWJlcl93aXRoX2RlZmF1bHRfOworICB9CisgIHZvaWQgc2V0X21lbWJlcl93aXRoX2RlZmF1bHQoaW50MzJfdCB2YWx1ZSkgeworICAgIGhhc19tZW1iZXJfd2l0aF9kZWZhdWx0XyA9IHRydWU7CisgICAgbWVtYmVyX3dpdGhfZGVmYXVsdF8gPSB2YWx1ZTsKKyAgfQorCisgIGJvb2wgaGFzX25vbl9kZWZhdWx0X21lbWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzX25vbl9kZWZhdWx0X21lbWJlcl87CisgIH0KKyAgaW50MzJfdCBub25fZGVmYXVsdF9tZW1iZXIoKSBjb25zdCB7CisgICAgRENIRUNLKGhhc19ub25fZGVmYXVsdF9tZW1iZXJfKTsKKyAgICByZXR1cm4gbm9uX2RlZmF1bHRfbWVtYmVyXzsKKyAgfQorICB2b2lkIHNldF9ub25fZGVmYXVsdF9tZW1iZXIoaW50MzJfdCB2YWx1ZSkgeworICAgIGhhc19ub25fZGVmYXVsdF9tZW1iZXJfID0gdHJ1ZTsKKyAgICBub25fZGVmYXVsdF9tZW1iZXJfID0gdmFsdWU7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wgaGFzX2Jvb2xlYW5fbWVtYmVyXzsKKyAgYm9vbCBib29sZWFuX21lbWJlcl87CisgIGJvb2wgaGFzX2xvbmdfbWVtYmVyXzsKKyAgaW50MzJfdCBsb25nX21lbWJlcl87CisgIGJvb2wgaGFzX2RvdWJsZV9tZW1iZXJfOworICBkb3VibGUgZG91YmxlX21lbWJlcl87CisgIGJvb2wgaGFzX3N0cmluZ19tZW1iZXJfOworICBzdGQ6OnN0cmluZyBzdHJpbmdfbWVtYmVyXzsKKyAgYm9vbCBoYXNfaW50ZXJmYWNlX21lbWJlcl87CisgIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBpbnRlcmZhY2VfbWVtYmVyXzsKKyAgYm9vbCBoYXNfbWVtYmVyX3dpdGhfZGVmYXVsdF87CisgIGludDMyX3QgbWVtYmVyX3dpdGhfZGVmYXVsdF87CisgIGJvb2wgaGFzX25vbl9kZWZhdWx0X21lbWJlcl87CisgIGludDMyX3Qgbm9uX2RlZmF1bHRfbWVtYmVyXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKKworI2VuZGlmICAvLyBUZXN0RGljdGlvbmFyeV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5OWY0MzM0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDkzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1ib29sIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCB1aW50MzJfdCBrTnVtSW5kZXhlZFByb3BlcnRpZXMgPSBpbXBsLT5sZW5ndGgoKTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtOdW1JbmRleGVkUHJvcGVydGllczsgKytpKSB7Ci0gICAgcHJvcGVydGllcy0+YXBwZW5kKElOVF9UT19KU0lEKGkpKTsKLSAgfQotfQotCi1KU0Jvb2wgR2V0SW5kZXhlZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICB1aW50MzJfdCBpbmRleDsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkFub255bW91c0luZGV4ZWRHZXR0ZXIoaW5kZXgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBTZXRJbmRleGVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Bbm9ueW1vdXNJbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1jbGFzcyBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5LAotICBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzLAotICBHZXRJbmRleGVkUHJvcGVydHksCi0gIFNldEluZGV4ZWRQcm9wZXJ0eSwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2xlbmd0aCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQotICAgICAgImxlbmd0aCIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2xlbmd0aCksCi0gICAgICBKU09QX05VTExXUkFQUEVSLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTllOTYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwNTgyZDguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDU2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1ib29sIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgcmV0dXJuIGltcGwtPkNhblF1ZXJ5TmFtZWRQcm9wZXJ0eShwcm9wZXJ0eV9uYW1lKTsKLX0KLQotdm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIE1vempzUHJvcGVydHlFbnVtZXJhdG9yIGVudW1lcmF0b3IoY29udGV4dCwgcHJvcGVydGllcyk7Ci0gIGltcGwtPkVudW1lcmF0ZU5hbWVkUHJvcGVydGllcygmZW51bWVyYXRvcik7Ci19Ci0KLUpTQm9vbCBHZXROYW1lZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkFub255bW91c05hbWVkR2V0dGVyKHByb3BlcnR5X25hbWUpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBTZXROYW1lZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+QW5vbnltb3VzTmFtZWRTZXR0ZXIocHJvcGVydHlfbmFtZSwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotY2xhc3MgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHksCi0gIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzLAotICBHZXROYW1lZFByb3BlcnR5LAotICBTZXROYW1lZFByb3BlcnR5LAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTZiNGU5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIwYzY2OTUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU4NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotYm9vbCBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgcmV0dXJuIGltcGwtPkNhblF1ZXJ5TmFtZWRQcm9wZXJ0eShwcm9wZXJ0eV9uYW1lKTsKLX0KLQotdm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKLSAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKLX0KLQotSlNCb29sIEdldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7Ci0gIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNOYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+QW5vbnltb3VzTmFtZWRTZXR0ZXIocHJvcGVydHlfbmFtZSwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgcmV0dXJuIGluZGV4IDwgaW1wbC0+bGVuZ3RoKCk7Ci19Ci0KLXZvaWQgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCB1aW50MzJfdCBrTnVtSW5kZXhlZFByb3BlcnRpZXMgPSBpbXBsLT5sZW5ndGgoKTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtOdW1JbmRleGVkUHJvcGVydGllczsgKytpKSB7Ci0gICAgcHJvcGVydGllcy0+YXBwZW5kKElOVF9UT19KU0lEKGkpKTsKLSAgfQotfQotCi1KU0Jvb2wgR2V0SW5kZXhlZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgdWludDMyX3QgaW5kZXg7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNJbmRleGVkR2V0dGVyKGluZGV4KSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgU2V0SW5kZXhlZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgdWludDMyX3QgaW5kZXg7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkFub255bW91c0luZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWNsYXNzIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAotICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKLSAgR2V0TmFtZWRQcm9wZXJ0eSwKLSAgU2V0TmFtZWRQcm9wZXJ0eSwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eSwKLSAgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcywKLSAgR2V0SW5kZXhlZFByb3BlcnR5LAotICBTZXRJbmRleGVkUHJvcGVydHksCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBnZXRfbGVuZ3RoKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmxlbmd0aCgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAibGVuZ3RoIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbGVuZ3RoKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjQ3ODEwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZjQ3ODRkZi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0FyYml0cmFyeUludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQXJiaXRyYXJ5SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNBcmJpdHJhcnlJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0FyYml0cmFyeUludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOwotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJBcmJpdHJhcnlJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJBcmJpdHJhcnlJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJBcmJpdHJhcnlJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29uc3RydWN0ID0gQ29uc3RydWN0b3I7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9hcmJpdHJhcnlQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBcmJpdHJhcnlJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QXJiaXRyYXJ5SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5hcmJpdHJhcnlfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X2FyYml0cmFyeVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFyYml0cmFyeUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEFyYml0cmFyeUludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBcmJpdHJhcnlJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2FyYml0cmFyeV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2FyYml0cmFyeUZ1bmN0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBBcmJpdHJhcnlJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QXJiaXRyYXJ5SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPkFyYml0cmFyeUZ1bmN0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJhcmJpdHJhcnlQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2FyYml0cmFyeVByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2FyYml0cmFyeVByb3BlcnR5KSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIHsKLSAgICAgICJhcmJpdHJhcnlGdW5jdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9hcmJpdHJhcnlGdW5jdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJBcmJpdHJhcnlJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IEFyYml0cmFyeUludGVyZmFjZSgpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0FyYml0cmFyeUludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNGRkYjI1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNBcmJpdHJhcnlJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNBcmJpdHJhcnlJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCYXNlSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Jhc2VJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEzMmIwNzUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Jhc2VJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNCYXNlSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkJhc2VJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Jhc2VJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzQmFzZUludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQmFzZUludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Jhc2VJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Jhc2VJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Jhc2VJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNCYXNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkJhc2VJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJCYXNlSW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiQmFzZUludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2Jhc2VBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QmFzZUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEJhc2VJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QmFzZUludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+YmFzZV9hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2Jhc2VPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJhc2VJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBCYXNlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJhc2VJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+QmFzZU9wZXJhdGlvbigpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAgICJiYXNlQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfYmFzZUF0dHJpYnV0ZSksCi0gICAgICBKU09QX05VTExXUkFQUEVSLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgImJhc2VPcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fYmFzZU9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJCYXNlSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Jhc2VJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Jhc2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQmFzZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQmFzZUludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPEJhc2VJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IEJhc2VJbnRlcmZhY2UoKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCYXNlSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQmFzZUludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMDg1NjA4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCYXNlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0Jhc2VJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0Jhc2VJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzQmFzZUludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNCYXNlSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDEwZmVkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1NDUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBnZXRfYm9vbGVhblByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmJvb2xlYW5fcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X2Jvb2xlYW5Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2Jvb2xlYW5fcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9ib29sZWFuQXJndW1lbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+Qm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9ib29sZWFuUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Cb29sZWFuUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAiYm9vbGVhblByb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfYm9vbGVhblByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2Jvb2xlYW5Qcm9wZXJ0eSksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICB7Ci0gICAgICAiYm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2Jvb2xlYW5Bcmd1bWVudE9wZXJhdGlvbiksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJib29sZWFuUmV0dXJuT3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2Jvb2xlYW5SZXR1cm5PcGVyYXRpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmMxYWI1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWEwOTZkMC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDgxNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2NhbGxiYWNrQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmNhbGxiYWNrX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfY2FsbGJhY2tBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpWb2lkRnVuY3Rpb24gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2NhbGxiYWNrX2F0dHJpYnV0ZSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZ2V0X251bGxhYmxlQ2FsbGJhY2tBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfY2FsbGJhY2tfYXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF9udWxsYWJsZUNhbGxiYWNrQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfbnVsbGFibGVfY2FsbGJhY2tfYXR0cmlidXRlKHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fdGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkZ1bmN0aW9uVGhhdFJldHVybnNTdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgY2I7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZjYik7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKGNiKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25XaXRoTnVsbGFibGVQYXJhbWV0ZXJzID46OkNvbnZlcnNpb25UeXBlIGNiOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlRha2VzRnVuY3Rpb25XaXRoTnVsbGFibGVQYXJhbWV0ZXJzKGNiKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyID46OkNvbnZlcnNpb25UeXBlIGNiOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyKGNiKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycyA+OjpDb252ZXJzaW9uVHlwZSBjYjsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmNiKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5UYWtlc0Z1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzKGNiKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fdGFrZXNWb2lkRnVuY3Rpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uID46OkNvbnZlcnNpb25UeXBlIGNiOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlRha2VzVm9pZEZ1bmN0aW9uKGNiKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgImNhbGxiYWNrQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfY2FsbGJhY2tBdHRyaWJ1dGUpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfY2FsbGJhY2tBdHRyaWJ1dGUpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAibnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X251bGxhYmxlQ2FsbGJhY2tBdHRyaWJ1dGUpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICB7Ci0gICAgICAidGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Rha2VzRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJ0YWtlc0Z1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycyIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl90YWtlc0Z1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycyksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJ0YWtlc0Z1bmN0aW9uV2l0aE9uZVBhcmFtZXRlciIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl90YWtlc0Z1bmN0aW9uV2l0aE9uZVBhcmFtZXRlciksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJ0YWtlc0Z1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Rha2VzRnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAidGFrZXNWb2lkRnVuY3Rpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdGFrZXNWb2lkRnVuY3Rpb24pLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWU5ZTlmYi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDhjOTAwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotI2luY2x1ZGUgIk1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlNpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9jYWxsYmFja0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5jYWxsYmFja19hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X2NhbGxiYWNrQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM8U2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9jYWxsYmFja19hdHRyaWJ1dGUodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9yZWdpc3RlckNhbGxiYWNrKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzPFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZSA+ID46OkNvbnZlcnNpb25UeXBlIGNhbGxiYWNrX2ludGVyZmFjZTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmNhbGxiYWNrX2ludGVyZmFjZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+UmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja19pbnRlcmZhY2UpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9zb21lT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPlNvbWVPcGVyYXRpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgImNhbGxiYWNrQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfY2FsbGJhY2tBdHRyaWJ1dGUpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfY2FsbGJhY2tBdHRyaWJ1dGUpLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgInJlZ2lzdGVyQ2FsbGJhY2siLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fcmVnaXN0ZXJDYWxsYmFjayksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJzb21lT3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3NvbWVPcGVyYXRpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxZGJhYWMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25kaXRpb25hbEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25kaXRpb25hbEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjIxMmJhNC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uZGl0aW9uYWxJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MDggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotCi0jaW5jbHVkZSAiTW96anNDb25kaXRpb25hbEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDb25kaXRpb25hbEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDb25kaXRpb25hbEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkNvbmRpdGlvbmFsSW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQ29uZGl0aW9uYWxJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJDb25kaXRpb25hbEludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLSNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKLUpTQm9vbCBnZXRfZW5hYmxlZEF0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5lbmFibGVkX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfZW5hYmxlZEF0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2VuYWJsZWRfYXR0cmlidXRlKHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLSNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCi0jaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCi1KU0Jvb2wgZ2V0X2Rpc2FibGVkQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmRpc2FibGVkX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfZGlzYWJsZWRBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBDb25kaXRpb25hbEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25kaXRpb25hbEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9kaXNhYmxlZF9hdHRyaWJ1dGUodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotI2VuZGlmICAvLyBOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKLSNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKLUpTQm9vbCBmY25fZGlzYWJsZWRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+RGlzYWJsZWRPcGVyYXRpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLSNlbmRpZiAgLy8gTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCi0jaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCi1KU0Jvb2wgZmNuX2VuYWJsZWRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+RW5hYmxlZE9wZXJhdGlvbigpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotI2VuZGlmICAvLyBFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgImVuYWJsZWRBdHRyaWJ1dGUiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9lbmFibGVkQXR0cmlidXRlKSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2VuYWJsZWRBdHRyaWJ1dGUpLAotICB9LAotI2VuZGlmICAvLyBFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKLSNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgImRpc2FibGVkQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZGlzYWJsZWRBdHRyaWJ1dGUpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfZGlzYWJsZWRBdHRyaWJ1dGUpLAotICB9LAotI2VuZGlmICAvLyBOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0jaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCi0gIHsKLSAgICAgICJkaXNhYmxlZE9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9kaXNhYmxlZE9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0jZW5kaWYgIC8vIE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQotI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQotICB7Ci0gICAgICAiZW5hYmxlZE9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9lbmFibGVkT3BlcmF0aW9uKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJDb25kaXRpb25hbEludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uZGl0aW9uYWxJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25kaXRpb25hbEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmU3MjM5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25kaXRpb25hbEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNDb25kaXRpb25hbEludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VfaAotCi0jaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi0KLSNlbmRpZiAgLy8gTW96anNDb25kaXRpb25hbEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RhbnRzSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0YW50c0ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjNDE5Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RhbnRzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDE4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQ29uc3RhbnRzSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0YW50c0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RhbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0NvbnN0YW50c0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ29uc3RhbnRzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNDb25zdGFudHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0NvbnN0YW50c0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIGdldF9JTlRFR0VSX0NPTlNUQU5UKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIENPTVBJTEVfQVNTRVJUKENvbnN0YW50c0ludGVyZmFjZTo6a0ludGVnZXJDb25zdGFudCA9PSA1LAotICAgICAgICAgICAgICAgICBWYWx1ZUZvckNvbnN0YW50c0ludGVyZmFjZV9rSW50ZWdlckNvbnN0YW50RG9lc05vdE1hdGNoSURMKTsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCA1LCAmcmVzdWx0X3ZhbHVlKTsKLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZ2V0X0RPVUJMRV9DT05TVEFOVCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBEQ0hFQ0tfRVEoMi43MTgsIENvbnN0YW50c0ludGVyZmFjZTo6a0RvdWJsZUNvbnN0YW50KSA8PAotICAgICAgIlRoZSB2YWx1ZSBmb3IgQ29uc3RhbnRzSW50ZXJmYWNlOjprRG91YmxlQ29uc3RhbnQgZG9lcyBub3QgbWF0Y2ggIgotICAgICAgInRoZSB2YWx1ZSBpbiB0aGUgaW50ZXJmYWNlIGRlZmluaXRpb24uIjsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCAyLjcxOCwgJnJlc3VsdF92YWx1ZSk7Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0NvbnN0YW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJDb25zdGFudHNJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJDb25zdGFudHNJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJDb25zdGFudHNJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsKLSAgICAgICJJTlRFR0VSX0NPTlNUQU5UIiwgMCwKLSAgICAgIEpTUFJPUF9QRVJNQU5FTlQgfCBKU1BST1BfUkVBRE9OTFkgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfSU5URUdFUl9DT05TVEFOVCksCi0gICAgICBKU09QX05VTExXUkFQUEVSLAotICB9LAotICB7Ci0gICAgICAiRE9VQkxFX0NPTlNUQU5UIiwgMCwKLSAgICAgIEpTUFJPUF9QRVJNQU5FTlQgfCBKU1BST1BfUkVBRE9OTFkgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfRE9VQkxFX0NPTlNUQU5UKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICB7Ci0gICAgICAiSU5URUdFUl9DT05TVEFOVCIsIDAsCi0gICAgICBKU1BST1BfUEVSTUFORU5UIHwgSlNQUk9QX1JFQURPTkxZIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X0lOVEVHRVJfQ09OU1RBTlQpLAotICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKLSAgfSwKLSAgewotICAgICAgIkRPVUJMRV9DT05TVEFOVCIsIDAsCi0gICAgICBKU1BST1BfUEVSTUFORU5UIHwgSlNQUk9QX1JFQURPTkxZIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X0RPVUJMRV9DT05TVEFOVCksCi0gICAgICBKU09QX05VTExXUkFQUEVSLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQ29uc3RhbnRzSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25zdGFudHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0NvbnN0YW50c0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25zdGFudHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NvbnN0YW50c0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0YW50c0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0YW50c0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NWQ4MGFmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25zdGFudHNJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNDb25zdGFudHNJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RhbnRzX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNDb25zdGFudHNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvckludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJjNmFjOC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RydWN0b3JJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNDb25zdHJ1Y3RvckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDb25zdHJ1Y3RvckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOwotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkNvbnN0cnVjdG9ySW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQ29uc3RydWN0b3JJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQ29uc3RydWN0b3JJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotSlNCb29sIENvbnN0cnVjdG9yMSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxDb25zdHJ1Y3RvckludGVyZmFjZT4gbmV3X29iamVjdCA9Ci0gICAgICBuZXcgQ29uc3RydWN0b3JJbnRlcmZhY2UoKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSlNCb29sIENvbnN0cnVjdG9yMigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8Q29uc3RydWN0b3JJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IENvbnN0cnVjdG9ySW50ZXJmYWNlKGFyZyk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKLSAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByZXN1bHRfb2JqZWN0KGNvbnRleHQsIEpTVkFMX1RPX09CSkVDVChyZXN1bHRfdmFsdWUpKTsKLSAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KCpyZXN1bHRfb2JqZWN0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgc3dpdGNoKGFyZ2MpIHsKLSAgICBjYXNlKDApOiB7Ci0gICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6Ci0gICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjEoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSgxKTogewotICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgotICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gICAgICBpZiAodHJ1ZSkgewotICAgICAgICByZXR1cm4gQ29uc3RydWN0b3IyKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIC8vIEludmFsaWQgbnVtYmVyIG9mIGFyZ3MKLSAgLy8gaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgLy8gNC4gSWYgUyBpcyBlbXB0eSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci4KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RydWN0b3JJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBjMDc0Ny4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RydWN0b3JJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNDb25zdHJ1Y3RvckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBlMThiZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQ3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOwotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29uc3RydWN0ID0gQ29uc3RydWN0b3I7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9sb25nQXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmxvbmdfYXJnKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9ib29sZWFuQXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmJvb2xlYW5fYXJnKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9zdHJpbmdBcmcoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+c3RyaW5nX2FyZygpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAibG9uZ0FyZyIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2xvbmdBcmcpLAotICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAiYm9vbGVhbkFyZyIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2Jvb2xlYW5BcmcpLAotICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAic3RyaW5nQXJnIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfc3RyaW5nQXJnKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigyKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci1KU0Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLSAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIGFyZzI7Ci0gIC8vIE9wdGlvbmFsIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgZGVmYXVsdF9hcmcgPQotICAgICAgImRlZmF1bHQiOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMzsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAyKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKLSAgICAgICAgY29udGV4dCwgYXJnc1syXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJmRlZmF1bHRfYXJnKTsKLSAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KLSAgICAgIG5ldyBDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UoYXJnMSwgYXJnMiwgZGVmYXVsdF9hcmcpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjdhZTEyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiZDRkZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDcxMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RE9NU3RyaW5nVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiRE9NU3RyaW5nVGVzdEludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJET01TdHJpbmdUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9wcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfcHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9yZWFkT25seVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnJlYWRfb25seV9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfcmVhZE9ubHlUb2tlblByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnJlYWRfb25seV90b2tlbl9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfbnVsbElzRW1wdHlQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5udWxsX2lzX2VtcHR5X3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF9udWxsSXNFbXB0eVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZyksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxfaXNfZW1wdHlfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF91bmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+dW5kZWZpbmVkX2lzX2VtcHR5X3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF91bmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmcpLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF91bmRlZmluZWRfaXNfZW1wdHlfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9udWxsYWJsZVVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV91bmRlZmluZWRfaXNfZW1wdHlfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSB8IGtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZyksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX3VuZGVmaW5lZF9pc19lbXB0eV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJwcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3Byb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3Byb3BlcnR5KSwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAicmVhZE9ubHlQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3JlYWRPbmx5UHJvcGVydHkpLAotICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKLSAgfSwKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAicmVhZE9ubHlUb2tlblByb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcmVhZE9ubHlUb2tlblByb3BlcnR5KSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJudWxsSXNFbXB0eVByb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbnVsbElzRW1wdHlQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9udWxsSXNFbXB0eVByb3BlcnR5KSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgInVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3VuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF91bmRlZmluZWRJc0VtcHR5UHJvcGVydHkpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAibnVsbGFibGVVbmRlZmluZWRJc0VtcHR5UHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9udWxsYWJsZVVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9udWxsYWJsZVVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiRE9NU3RyaW5nVGVzdEludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2YwMGI2Ny4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NzVlMWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4MzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgcmV0dXJuIGltcGwtPkNhblF1ZXJ5TmFtZWRQcm9wZXJ0eShwcm9wZXJ0eV9uYW1lKTsKLX0KLQotdm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOwotICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOwotfQotCi1KU0Jvb2wgR2V0TmFtZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+QW5vbnltb3VzTmFtZWRHZXR0ZXIocHJvcGVydHlfbmFtZSksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIFNldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55Ci0gICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+QW5vbnltb3VzTmFtZWRTZXR0ZXIocHJvcGVydHlfbmFtZSwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICByZXR1cm4gaW5kZXggPCBpbXBsLT5sZW5ndGgoKTsKLX0KLQotdm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgewotICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7Ci0gIH0KLX0KLQotSlNCb29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgdWludDMyX3QgaW5kZXg7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5EZXJpdmVkSW5kZXhlZEdldHRlcihpbmRleCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgdWludDMyX3QgaW5kZXg7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkRlcml2ZWRJbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1jbGFzcyBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eSwKLSAgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMsCi0gIEdldE5hbWVkUHJvcGVydHksCi0gIFNldE5hbWVkUHJvcGVydHksCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5LAotICBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzLAotICBHZXRJbmRleGVkUHJvcGVydHksCi0gIFNldEluZGV4ZWRQcm9wZXJ0eSwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2xlbmd0aCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZ2V0X3Byb3BlcnR5T25EZXJpdmVkQ2xhc3MoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+cHJvcGVydHlfb25fZGVyaXZlZF9jbGFzcygpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfcHJvcGVydHlPbkRlcml2ZWRDbGFzcygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3Byb3BlcnR5X29uX2Rlcml2ZWRfY2xhc3ModmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9kZXJpdmVkSW5kZXhlZEdldHRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBpbmRleDsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+RGVyaXZlZEluZGV4ZWRHZXR0ZXIoaW5kZXgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZGVyaXZlZEluZGV4ZWRTZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7Ci0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+RGVyaXZlZEluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fb3BlcmF0aW9uT25EZXJpdmVkQ2xhc3MoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+T3BlcmF0aW9uT25EZXJpdmVkQ2xhc3MoKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAibGVuZ3RoIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbGVuZ3RoKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJwcm9wZXJ0eU9uRGVyaXZlZENsYXNzIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcHJvcGVydHlPbkRlcml2ZWRDbGFzcyksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIHsKLSAgICAgICJkZXJpdmVkSW5kZXhlZEdldHRlciIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9kZXJpdmVkSW5kZXhlZEdldHRlciksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJkZXJpdmVkSW5kZXhlZFNldHRlciIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9kZXJpdmVkSW5kZXhlZFNldHRlciksCi0gICAgICAyLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJvcGVyYXRpb25PbkRlcml2ZWRDbGFzcyIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9vcGVyYXRpb25PbkRlcml2ZWRDbGFzcyksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMjQ2YzEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEZXJpdmVkSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIwOGRhMDcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rlcml2ZWRJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNEZXJpdmVkSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rlcml2ZWRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNEZXJpdmVkSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkRlcml2ZWRJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJEZXJpdmVkSW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiRGVyaXZlZEludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2Rlcml2ZWRBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGVyaXZlZEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERlcml2ZWRJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+ZGVyaXZlZF9hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2Rlcml2ZWRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEZXJpdmVkSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+RGVyaXZlZE9wZXJhdGlvbigpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAgICJkZXJpdmVkQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZGVyaXZlZEF0dHJpYnV0ZSksCi0gICAgICBKU09QX05VTExXUkFQUEVSLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgImRlcml2ZWRPcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZGVyaXZlZE9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJEZXJpdmVkSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGVyaXZlZEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGVyaXZlZEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPERlcml2ZWRJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IERlcml2ZWRJbnRlcmZhY2UoKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEZXJpdmVkSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRGVyaXZlZEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmODEzMDZiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEZXJpdmVkSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0Rlcml2ZWRJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiTW96anNCYXNlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRGVyaXZlZEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNEZXJpdmVkSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEaXNhYmxlZEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNEaXNhYmxlZEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM3NTgyOS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRGlzYWJsZWRJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotCi0jaW5jbHVkZSAiTW96anNEaXNhYmxlZEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpEaXNhYmxlZEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGlzYWJsZWRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0Rpc2FibGVkSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNEaXNhYmxlZEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkRpc2FibGVkSW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiRGlzYWJsZWRJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJEaXNhYmxlZEludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBnZXRfZGlzYWJsZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEaXNhYmxlZEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERpc2FibGVkSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERpc2FibGVkSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5kaXNhYmxlZF9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfZGlzYWJsZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEaXNhYmxlZEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIERpc2FibGVkSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERpc2FibGVkSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2Rpc2FibGVkX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZGlzYWJsZWRGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGlzYWJsZWRJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBEaXNhYmxlZEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEaXNhYmxlZEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5EaXNhYmxlZEZ1bmN0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJkaXNhYmxlZFByb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZGlzYWJsZWRQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9kaXNhYmxlZFByb3BlcnR5KSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIHsKLSAgICAgICJkaXNhYmxlZEZ1bmN0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2Rpc2FibGVkRnVuY3Rpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiRGlzYWJsZWRJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNEaXNhYmxlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNEaXNhYmxlZEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLSNlbmRpZiAgLy8gZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0Rpc2FibGVkSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRGlzYWJsZWRJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGU1MThkZi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRGlzYWJsZWRJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzRGlzYWJsZWRJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlX2gKLQotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rpc2FibGVkX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNEaXNhYmxlZEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotCi0jZW5kaWYgIC8vIE1vempzRGlzYWJsZWRJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2OWQwMWM0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFbnVtZXJhdGlvbkludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDUyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkVudW1lcmF0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFbnVtZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotLy8gRGVjbGFyZSBhbmQgZGVmaW5lIHRoZXNlIGluIHRoZSBzYW1lIG5hbWVzcGFjZSB0aGF0IHRoZSBvdGhlciBvdmVybG9hZHMKLS8vIHdlcmUgYnJvdWdodCBpbnRvIHdpdGggdGhlIHVzaW5nIGRlY2xhcmF0aW9uLgotdm9pZCBUb0pTVmFsdWUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSBpbl9lbnVtLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKTsKLXZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCi0gICAgICAgICAgICAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzLCBFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICBFbnVtZXJhdGlvbkludGVyZmFjZTo6VGVzdEVudW0qIG91dF9lbnVtKTsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzRW51bWVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNFbnVtZXJhdGlvbkludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOwotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkVudW1lcmF0aW9uSW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiRW51bWVyYXRpb25JbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJFbnVtZXJhdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2VudW1Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFbnVtZXJhdGlvbkludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEVudW1lcmF0aW9uSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEVudW1lcmF0aW9uSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5lbnVtX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF9lbnVtUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RW51bWVyYXRpb25JbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFbnVtZXJhdGlvbkludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFbnVtZXJhdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxFbnVtZXJhdGlvbkludGVyZmFjZTo6VGVzdEVudW0gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2VudW1fcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAiZW51bVByb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZW51bVByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2VudW1Qcm9wZXJ0eSksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiRW51bWVyYXRpb25JbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPEVudW1lcmF0aW9uSW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KLSAgICAgIG5ldyBFbnVtZXJhdGlvbkludGVyZmFjZSgpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi1uYW1lc3BhY2UgewotCi1pbmxpbmUgdm9pZCBUb0pTVmFsdWUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSBpbl9lbnVtLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKSB7Ci0KLSAgc3dpdGNoIChpbl9lbnVtKSB7Ci0gICAgY2FzZSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0FscGhhOgotICAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIHN0ZDo6c3RyaW5nKCJhbHBoYSIpLCBvdXRfdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgRW51bWVyYXRpb25JbnRlcmZhY2U6OmtCZXRhOgotICAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIHN0ZDo6c3RyaW5nKCJiZXRhIiksIG91dF92YWx1ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0dhbW1hOgotICAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIHN0ZDo6c3RyaW5nKCJnYW1tYSIpLCBvdXRfdmFsdWUpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICBvdXRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKLSAgfQotfQotCi0KLWlubGluZSB2b2lkIEZyb21KU1ZhbHVlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIHZhbHVlLAotICAgICAgICAgICAgICAgICBpbnQgY29udmVyc2lvbl9mbGFncywgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgRW51bWVyYXRpb25JbnRlcmZhY2U6OlRlc3RFbnVtKiBvdXRfZW51bSkgewotICBEQ0hFQ0tfRVEoMCwgY29udmVyc2lvbl9mbGFncykgPDwgIlVuZXhwZWN0ZWQgY29udmVyc2lvbiBmbGFncy4iOwotICAvLyBKU1ZhbHVlIC0+IElETCBlbnVtIGFsZ29yaXRobSBkZXNjcmliZWQgaGVyZToKLSAgLy8gaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNlcy1lbnVtZXJhdGlvbgotICAvLyAxLiBMZXQgUyBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgVG9TdHJpbmcoVikuCi0gIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LCBKU19WYWx1ZVRvU3RyaW5nKGNvbnRleHQsIHZhbHVlKSk7Ci0KLSAgSlNCb29sIG1hdGNoID0gSlNfRkFMU0U7Ci0vLyAzLiBSZXR1cm4gdGhlIGVudW1lcmF0aW9uIHZhbHVlIG9mIHR5cGUgRSB0aGF0IGlzIGVxdWFsIHRvIFMuCi1pZiAoSlNfU3RyaW5nRXF1YWxzQXNjaWkoCi0gICAgICBjb250ZXh0LCByb290ZWRfc3RyaW5nLCAiYWxwaGEiLCAmbWF0Y2gpCi0gICAgICAmJiBtYXRjaCkgewotICAgICpvdXRfZW51bSA9IEVudW1lcmF0aW9uSW50ZXJmYWNlOjprQWxwaGE7Ci0gIH0gZWxzZSBpZiAoSlNfU3RyaW5nRXF1YWxzQXNjaWkoCi0gICAgICBjb250ZXh0LCByb290ZWRfc3RyaW5nLCAiYmV0YSIsICZtYXRjaCkKLSAgICAgICYmIG1hdGNoKSB7Ci0gICAgKm91dF9lbnVtID0gRW51bWVyYXRpb25JbnRlcmZhY2U6OmtCZXRhOwotICB9IGVsc2UgaWYgKEpTX1N0cmluZ0VxdWFsc0FzY2lpKAotICAgICAgY29udGV4dCwgcm9vdGVkX3N0cmluZywgImdhbW1hIiwgJm1hdGNoKQotICAgICAgJiYgbWF0Y2gpIHsKLSAgICAqb3V0X2VudW0gPSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0dhbW1hOwotICB9IGVsc2UgewotICAgIC8vIDIuIElmIFMgaXMgbm90IG9uZSBvZiBFJ3MgZW51bWVyYXRpb24gdmFsdWVzLCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgotICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGNvYmFsdDo6c2NyaXB0OjprQ29udmVydFRvRW51bUZhaWxlZCk7Ci0gICAgcmV0dXJuOwotICB9Ci19Ci19ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFbnVtZXJhdGlvbkludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5ZjBlYzQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNWIzZTQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZXhuLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9lcnJvcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5lcnJvcigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfbWVzc2FnZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5tZXNzYWdlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAgICJlcnJvciIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2Vycm9yKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQotICAgICAgIm1lc3NhZ2UiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUgfCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9tZXNzYWdlKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gR2V0IEVycm9yIHByb3RvdHlwZS4KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKGNvbnRleHQpOwotICBib29sIHN1Y2Nlc3NfY2hlY2sgPSBqc19HZXRDbGFzc1Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEdldEV4Y2VwdGlvblByb3RvS2V5KEpTRVhOX0VSUiksICZwYXJlbnRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3NfY2hlY2spOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYWZiNjUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNFeGNlcHRpb25zSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk5ZDBiZDQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNFeGNlcHRpb25zSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbnNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkV4Y2VwdGlvbnNJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJFeGNlcHRpb25zSW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uc0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2F0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25zSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRXhjZXB0aW9uc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeGNlcHRpb25zSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5hdHRyaWJ1dGVfdGhyb3dzX2V4Y2VwdGlvbigmZXhjZXB0aW9uX3N0YXRlKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X2F0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeGNlcHRpb25zSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgRXhjZXB0aW9uc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeGNlcHRpb25zSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2F0dHJpYnV0ZV90aHJvd3NfZXhjZXB0aW9uKHZhbHVlLCAmZXhjZXB0aW9uX3N0YXRlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZnVuY3Rpb25UaHJvd3NFeGNlcHRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBFeGNlcHRpb25zSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+RnVuY3Rpb25UaHJvd3NFeGNlcHRpb24oJmV4Y2VwdGlvbl9zdGF0ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJhdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24iLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9hdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24pLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfYXR0cmlidXRlVGhyb3dzRXhjZXB0aW9uKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIHsKLSAgICAgICJmdW5jdGlvblRocm93c0V4Y2VwdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9mdW5jdGlvblRocm93c0V4Y2VwdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJFeGNlcHRpb25zSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPEV4Y2VwdGlvbnNJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IEV4Y2VwdGlvbnNJbnRlcmZhY2UoJmV4Y2VwdGlvbl9zdGF0ZSk7Ci0gIC8vIEluIGNhc2UgdGhhdCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gY29uc3RydWN0b3IuCi0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKLSAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByZXN1bHRfb2JqZWN0KGNvbnRleHQsIEpTVkFMX1RPX09CSkVDVChyZXN1bHRfdmFsdWUpKTsKLSAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KCpyZXN1bHRfb2JqZWN0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE0OWQ3YS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXhjZXB0aW9uc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjM3YmQyZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZmNuX2NhbGxXaXRoU2V0dGluZ3MoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotCi0gIGltcGwtPkNhbGxXaXRoU2V0dGluZ3MoY2FsbHdpdGhfZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRFbnZpcm9ubWVudFNldHRpbmdzKCkpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgImNhbGxXaXRoU2V0dGluZ3MiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fY2FsbFdpdGhTZXR0aW5ncyksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjZmUzNDkuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2YWMzMS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotI2luY2x1ZGUgIk1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotV3JhcHBhYmxlKiBHZXRPcGFxdWVSb290RnJvbVdyYXBwYWJsZSgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKj4od3JhcHBhYmxlLmdldCgpKTsKLSAgcmV0dXJuIGltcGwtPkdldEhlYWQoKTsKLX0KLQotY2xhc3MgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnN0cnVjdCA9IENvbnN0cnVjdG9yOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBnZXRfcHJldmlvdXMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+cHJldmlvdXMoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X3ByZXZpb3VzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfcHJldmlvdXModmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9uZXh0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm5leHQoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X25leHQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9uZXh0KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgInByZXZpb3VzIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcHJldmlvdXMpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfcHJldmlvdXMpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAibmV4dCIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X25leHQpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfbmV4dCksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQotICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCi0gIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7Ci0gIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCi0gICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6R2V0T3BhcXVlUm9vdEZ1bmN0aW9uIGdldF9yb290OwotICBXcmFwcGVyUHJpdmF0ZTo6R2V0UmVhY2hhYmxlV3JhcHBhYmxlc0Z1bmN0aW9uIGdldF9yZWFjaGFibGVfd3JhcHBhYmxlczsKLSAgZ2V0X3Jvb3QgPSBiYXNlOjpCaW5kKCZHZXRPcGFxdWVSb290RnJvbVdyYXBwYWJsZSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YSgKLSAgICAgIGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUsIGdldF9yb290LCBnZXRfcmVhY2hhYmxlX3dyYXBwYWJsZXMpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gbmV3X29iamVjdCA9Ci0gICAgICBuZXcgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0gIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKLSAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByZXN1bHRfb2JqZWN0KGNvbnRleHQsIEpTVkFMX1RPX09CSkVDVChyZXN1bHRfdmFsdWUpKTsKLSAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KCpyZXN1bHRfb2JqZWN0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUwNTk4ZWUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDBiMDg2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHZXRPcGFxdWVSb290SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1XcmFwcGFibGUqIEdldE9wYXF1ZVJvb3RGcm9tV3JhcHBhYmxlKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8R2V0T3BhcXVlUm9vdEludGVyZmFjZSo+KHdyYXBwYWJsZS5nZXQoKSk7Ci0gIHJldHVybiBpbXBsLT5nZXRfb3BhcXVlX3Jvb3RfZnVuY3Rpb25fbmFtZSgpOwotfQotCi12b2lkIEdldFJlYWNoYWJsZVdyYXBwYWJsZXMoY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUsCi0gICAgV3JhcHBlclByaXZhdGU6OldyYXBwYWJsZVZlY3RvciogcmVhY2hhYmxlKSB7Ci0gIERDSEVDSyhyZWFjaGFibGUpOwotICBHZXRPcGFxdWVSb290SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqPih3cmFwcGFibGUuZ2V0KCkpOwotICBXcmFwcGFibGUqIHJlYWNoYWJsZV8wID0gaW1wbC0+YWRkX29wYXF1ZV9yb290X2Z1bmN0aW9uX25hbWUoKTsKLSAgaWYgKHJlYWNoYWJsZV8wKSB7Ci0gICAgcmVhY2hhYmxlLT5wdXNoX2JhY2socmVhY2hhYmxlXzApOwotICB9Ci19Ci0KLWNsYXNzIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkdldE9wYXF1ZVJvb3RJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJHZXRPcGFxdWVSb290SW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiR2V0T3BhcXVlUm9vdEludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiR2V0T3BhcXVlUm9vdEludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKLSAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgotICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOwotICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLAotICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZhbHVlLCBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpHZXRPcGFxdWVSb290RnVuY3Rpb24gZ2V0X3Jvb3Q7Ci0gIFdyYXBwZXJQcml2YXRlOjpHZXRSZWFjaGFibGVXcmFwcGFibGVzRnVuY3Rpb24gZ2V0X3JlYWNoYWJsZV93cmFwcGFibGVzOwotICBnZXRfcm9vdCA9IGJhc2U6OkJpbmQoJkdldE9wYXF1ZVJvb3RGcm9tV3JhcHBhYmxlKTsKLSAgZ2V0X3JlYWNoYWJsZV93cmFwcGFibGVzID0gYmFzZTo6QmluZCgmR2V0UmVhY2hhYmxlV3JhcHBhYmxlcyk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YSgKLSAgICAgIGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUsIGdldF9yb290LCBnZXRfcmVhY2hhYmxlX3dyYXBwYWJsZXMpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLQotICBzY29wZWRfcmVmcHRyPEdldE9wYXF1ZVJvb3RJbnRlcmZhY2U+IG5ld19vYmplY3QgPQotICAgICAgbmV3IEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UoKTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLSAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOwotICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOwotICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOwotICByZXR1cm4gdHJ1ZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YWMyMzJiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwOGZlMWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudC5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHbG9iYWxJbnRlcmZhY2VQYXJlbnQ7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50SGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiR2xvYmFsSW50ZXJmYWNlUGFyZW50IjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiR2xvYmFsSW50ZXJmYWNlUGFyZW50UHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiR2xvYmFsSW50ZXJmYWNlUGFyZW50Q29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGZjbl9wYXJlbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdsb2JhbEludGVyZmFjZVBhcmVudD4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEdsb2JhbEludGVyZmFjZVBhcmVudCogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxHbG9iYWxJbnRlcmZhY2VQYXJlbnQ+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+UGFyZW50T3BlcmF0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICB7Ci0gICAgICAicGFyZW50T3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3BhcmVudE9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJHbG9iYWxJbnRlcmZhY2VQYXJlbnQiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50LmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNDg5ZjAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudC5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRfaAotI2RlZmluZSBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudF9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nbG9iYWxfaW50ZXJmYWNlX3BhcmVudC5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50X2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMzA4NDEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MTIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgcmV0dXJuIGluZGV4IDwgaW1wbC0+bGVuZ3RoKCk7Ci19Ci0KLXZvaWQgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHVpbnQzMl90IGtOdW1JbmRleGVkUHJvcGVydGllcyA9IGltcGwtPmxlbmd0aCgpOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwga051bUluZGV4ZWRQcm9wZXJ0aWVzOyArK2kpIHsKLSAgICBwcm9wZXJ0aWVzLT5hcHBlbmQoSU5UX1RPX0pTSUQoaSkpOwotICB9Ci19Ci0KLUpTQm9vbCBHZXRJbmRleGVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+SW5kZXhlZEdldHRlcihpbmRleCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgdWludDMyX3QgaW5kZXg7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgRGVsZXRlSW5kZXhlZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIHVpbnQzMl90IGluZGV4KSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPkluZGV4ZWREZWxldGVyKGluZGV4KTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWNsYXNzIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCi0gIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCi0gIEdldEluZGV4ZWRQcm9wZXJ0eSwKLSAgU2V0SW5kZXhlZFByb3BlcnR5LAotICBEZWxldGVJbmRleGVkUHJvcGVydHksCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiSW5kZXhlZEdldHRlckludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJJbmRleGVkR2V0dGVySW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9sZW5ndGgoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bGVuZ3RoKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9pbmRleGVkRGVsZXRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBpbmRleDsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5JbmRleGVkRGVsZXRlcihpbmRleCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2luZGV4ZWRHZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkluZGV4ZWRHZXR0ZXIoaW5kZXgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25faW5kZXhlZFNldHRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBpbmRleDsKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAotICAgICAgY29udGV4dCwgYXJnc1sxXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5JbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQotICAgICAgImxlbmd0aCIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2xlbmd0aCksCi0gICAgICBKU09QX05VTExXUkFQUEVSLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgImluZGV4ZWREZWxldGVyIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2luZGV4ZWREZWxldGVyKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgImluZGV4ZWRHZXR0ZXIiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25faW5kZXhlZEdldHRlciksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJpbmRleGVkU2V0dGVyIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2luZGV4ZWRTZXR0ZXIpLAotICAgICAgMiwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiSW5kZXhlZEdldHRlckludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzSW5kZXhlZEdldHRlckludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxM2UyMC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzSW5kZXhlZEdldHRlckludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTZlYjg5NC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcy5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc0hhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9zdXBwb3J0ZWRBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcz4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIEludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcz4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+c3VwcG9ydGVkX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAic3VwcG9ydGVkQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfc3VwcG9ydGVkQXR0cmlidXRlKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcy5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWRkYmJiYy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKLSNkZWZpbmUgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5YzI1ZWUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIk5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiU29tZU5hbWVkQ29uc3RydWN0b3IiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci1KU0Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgewotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotCi0gIHNjb3BlZF9yZWZwdHI8TmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZT4gbmV3X29iamVjdCA9Ci0gICAgICBuZXcgTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZSgpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU4Yzc1NGQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEdldHRlckludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEdldHRlckludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzkzMjdjYS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2NzUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNOYW1lZEdldHRlckludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKLSAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKLX0KLQotSlNCb29sIEdldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TmFtZWRHZXR0ZXIocHJvcGVydHlfbmFtZSksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIFNldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5OYW1lZFNldHRlcihwcm9wZXJ0eV9uYW1lLCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1ib29sIERlbGV0ZU5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgewotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPk5hbWVkRGVsZXRlcihwcm9wZXJ0eV9uYW1lKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWNsYXNzIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAotICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKLSAgR2V0TmFtZWRQcm9wZXJ0eSwKLSAgU2V0TmFtZWRQcm9wZXJ0eSwKLSAgRGVsZXRlTmFtZWRQcm9wZXJ0eSwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIk5hbWVkR2V0dGVySW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiTmFtZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOYW1lZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBmY25fbmFtZWREZWxldGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIG5hbWU7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZuYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5OYW1lZERlbGV0ZXIobmFtZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX25hbWVkR2V0dGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIG5hbWU7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZuYW1lKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TmFtZWRHZXR0ZXIobmFtZSksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9uYW1lZFNldHRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOwotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+TmFtZWRTZXR0ZXIobmFtZSwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgIm5hbWVkRGVsZXRlciIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9uYW1lZERlbGV0ZXIpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAibmFtZWRHZXR0ZXIiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbmFtZWRHZXR0ZXIpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAibmFtZWRTZXR0ZXIiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbmFtZWRTZXR0ZXIpLAotICAgICAgMiwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiTmFtZWRHZXR0ZXJJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEdldHRlckludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YzhiNmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNOYW1lZEdldHRlckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTRjNDJlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWJvb2wgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbXBsLT5DYW5RdWVyeU5hbWVkUHJvcGVydHkocHJvcGVydHlfbmFtZSk7Ci19Ci0KLXZvaWQgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIE1vempzUHJvcGVydHlFbnVtZXJhdG9yIGVudW1lcmF0b3IoY29udGV4dCwgcHJvcGVydGllcyk7Ci0gIGltcGwtPkVudW1lcmF0ZU5hbWVkUHJvcGVydGllcygmZW51bWVyYXRvcik7Ci19Ci0KLUpTQm9vbCBHZXROYW1lZFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKLSAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TmFtZWRHZXR0ZXIocHJvcGVydHlfbmFtZSksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIFNldE5hbWVkUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7Ci0gIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCi0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk5hbWVkU2V0dGVyKHByb3BlcnR5X25hbWUsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLWJvb2wgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkgewotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOwotfQotCi12b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgewotICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7Ci0gIH0KLX0KLQotSlNCb29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+SW5kZXhlZEdldHRlcihpbmRleCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7Ci0gIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIHVpbnQzMl90IGluZGV4OwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5JbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1jbGFzcyBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eSwKLSAgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMsCi0gIEdldE5hbWVkUHJvcGVydHksCi0gIFNldE5hbWVkUHJvcGVydHksCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCi0gIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCi0gIEdldEluZGV4ZWRQcm9wZXJ0eSwKLSAgU2V0SW5kZXhlZFByb3BlcnR5LAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2xlbmd0aCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZ2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+cHJvcGVydHlfb25fYmFzZV9jbGFzcygpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfcHJvcGVydHlPbkJhc2VDbGFzcygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3Byb3BlcnR5X29uX2Jhc2VfY2xhc3ModmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9pbmRleGVkR2V0dGVyKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5JbmRleGVkR2V0dGVyKGluZGV4KSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2luZGV4ZWRTZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7Ci0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+SW5kZXhlZFNldHRlcihpbmRleCwgdmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9uYW1lZEdldHRlcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPk5hbWVkR2V0dGVyKG5hbWUpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fbmFtZWRTZXR0ZXIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMjsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgbmFtZTsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJm5hbWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCi0gICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk5hbWVkU2V0dGVyKG5hbWUsIHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fb3BlcmF0aW9uT25CYXNlQ2xhc3MoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaW1wbC0+T3BlcmF0aW9uT25CYXNlQ2xhc3MoKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCi0gICAgICAibGVuZ3RoIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbGVuZ3RoKSwKLSAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJwcm9wZXJ0eU9uQmFzZUNsYXNzIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcHJvcGVydHlPbkJhc2VDbGFzcyksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9wcm9wZXJ0eU9uQmFzZUNsYXNzKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIHsKLSAgICAgICJpbmRleGVkR2V0dGVyIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2luZGV4ZWRHZXR0ZXIpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAiaW5kZXhlZFNldHRlciIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9pbmRleGVkU2V0dGVyKSwKLSAgICAgIDIsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgIm5hbWVkR2V0dGVyIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX25hbWVkR2V0dGVyKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgIm5hbWVkU2V0dGVyIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX25hbWVkU2V0dGVyKSwKLSAgICAgIDIsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgIm9wZXJhdGlvbk9uQmFzZUNsYXNzIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX29wZXJhdGlvbk9uQmFzZUNsYXNzKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIk5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmVkNmM1Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2MyYTBkMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpQdXRGb3J3YXJkc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIk5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9uZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm5lc3RlZF9mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfbmVzdGVkRm9yd2FyZGluZ0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlPigpLmdldCgpOwotICB7IC8vIEJlZ2luIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8UHV0Rm9yd2FyZHNJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsLgotICAgIHNjb3BlZF9yZWZwdHI8UHV0Rm9yd2FyZHNJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsID0KLSAgICAgICBpbXBsLT5uZXN0ZWRfZm9yd2FyZGluZ19hdHRyaWJ1dGUoKTsKLSAgICBpZiAoIWZvcndhcmRlZF9pbXBsKSB7Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICB7IC8vIEJlZ2luIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfZm9yd2FyZGVkX2ltcGwuCi0gICAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9mb3J3YXJkZWRfaW1wbCA9Ci0gICAgICAgZm9yd2FyZGVkX2ltcGwtPmZvcndhcmRpbmdfYXR0cmlidXRlKCk7Ci0gICAgaWYgKCFmb3J3YXJkZWRfZm9yd2FyZGVkX2ltcGwpIHsKLSAgICAgIE5PVFJFQUNIRUQoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsLT5zZXRfYXJiaXRyYXJ5X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0gICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICB9IC8vIEVuZCBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsLgotfQotICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgfSAvLyBFbmQgc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxQdXRGb3J3YXJkc0ludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCi19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgIm5lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9uZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlKSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X25lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUpLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIk5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTE3N2U1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmRhOTRmZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDM2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Tm9Db25zdHJ1Y3RvckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiTm9Db25zdHJ1Y3RvckludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIk5vQ29uc3RydWN0b3JJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOb0NvbnN0cnVjdG9ySW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIk5vQ29uc3RydWN0b3JJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2N2JkMWYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRjMzQ2Mi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIk5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzYTMyYTcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19pbnRlcmZhY2Vfb2JqZWN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODRkMGRhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwODkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VIYW5kbGVyKCkKLSAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKLSAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Ci19OwotCi1Qcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcwotTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcj4KLSAgICBwcm94eV9oYW5kbGVyOwotCi1KU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZVByb3RvdHlwZSI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOwotICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLQotICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KLSAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIk51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9ib29sZWFuX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX2Jvb2xlYW5fcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9udWxsYWJsZU51bWVyaWNQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9udW1lcmljX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF9udWxsYWJsZU51bWVyaWNQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGludDMyX3QgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX251bWVyaWNfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9udWxsYWJsZVN0cmluZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX3N0cmluZ19wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfbnVsbGFibGVTdHJpbmdQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9udWxsYWJsZV9zdHJpbmdfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9udWxsYWJsZU9iamVjdFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX29iamVjdF9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfbnVsbGFibGVPYmplY3RQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX29iamVjdF9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX251bGxhYmxlQm9vbGVhbkFyZ3VtZW50KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5OdWxsYWJsZUJvb2xlYW5Bcmd1bWVudChhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9udWxsYWJsZUJvb2xlYW5PcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPk51bGxhYmxlQm9vbGVhbk9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fbnVsbGFibGVOdW1lcmljQXJndW1lbnQoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8aW50MzJfdCA+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk51bGxhYmxlTnVtZXJpY0FyZ3VtZW50KGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX251bGxhYmxlTnVtZXJpY09wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TnVsbGFibGVOdW1lcmljT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9udWxsYWJsZU9iamVjdEFyZ3VtZW50KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5OdWxsYWJsZU9iamVjdEFyZ3VtZW50KGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX251bGxhYmxlT2JqZWN0T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5OdWxsYWJsZU9iamVjdE9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fbnVsbGFibGVTdHJpbmdBcmd1bWVudCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZyA+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk51bGxhYmxlU3RyaW5nQXJndW1lbnQoYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fbnVsbGFibGVTdHJpbmdPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPk51bGxhYmxlU3RyaW5nT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAibnVsbGFibGVCb29sZWFuUHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSksCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJudWxsYWJsZU51bWVyaWNQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X251bGxhYmxlTnVtZXJpY1Byb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlTnVtZXJpY1Byb3BlcnR5KSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgIm51bGxhYmxlU3RyaW5nUHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9udWxsYWJsZVN0cmluZ1Byb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlU3RyaW5nUHJvcGVydHkpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAibnVsbGFibGVPYmplY3RQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X251bGxhYmxlT2JqZWN0UHJvcGVydHkpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfbnVsbGFibGVPYmplY3RQcm9wZXJ0eSksCi0gIH0sCi0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICB7Ci0gICAgICAibnVsbGFibGVCb29sZWFuQXJndW1lbnQiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVCb29sZWFuQXJndW1lbnQpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAibnVsbGFibGVCb29sZWFuT3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX251bGxhYmxlQm9vbGVhbk9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJudWxsYWJsZU51bWVyaWNBcmd1bWVudCIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9udWxsYWJsZU51bWVyaWNBcmd1bWVudCksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJudWxsYWJsZU51bWVyaWNPcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVOdW1lcmljT3BlcmF0aW9uKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgIm51bGxhYmxlT2JqZWN0QXJndW1lbnQiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVPYmplY3RBcmd1bWVudCksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJudWxsYWJsZU9iamVjdE9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9udWxsYWJsZU9iamVjdE9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJudWxsYWJsZVN0cmluZ0FyZ3VtZW50IiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX251bGxhYmxlU3RyaW5nQXJndW1lbnQpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAibnVsbGFibGVTdHJpbmdPcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVTdHJpbmdPcGVyYXRpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMWRkZjMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNjkyNDZiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE2NSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIk51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF9ieXRlUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+Ynl0ZV9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfYnl0ZVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8aW50OF90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9ieXRlX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfb2N0ZXRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5vY3RldF9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfb2N0ZXRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHVpbnQ4X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X29jdGV0X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfc2hvcnRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5zaG9ydF9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfc2hvcnRQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGludDE2X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3Nob3J0X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfdW5zaWduZWRTaG9ydFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnVuc2lnbmVkX3Nob3J0X3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF91bnNpZ25lZFNob3J0UHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czx1aW50MTZfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5zaWduZWRfc2hvcnRfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9sb25nUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bG9uZ19wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfbG9uZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfbG9uZ19wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZ2V0X3Vuc2lnbmVkTG9uZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnVuc2lnbmVkX2xvbmdfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X3Vuc2lnbmVkTG9uZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3Vuc2lnbmVkX2xvbmdfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9sb25nTG9uZ1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmxvbmdfbG9uZ19wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfbG9uZ0xvbmdQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGludDY0X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2xvbmdfbG9uZ19wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZ2V0X3Vuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT51bnNpZ25lZF9sb25nX2xvbmdfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X3Vuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHVpbnQ2NF90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF91bnNpZ25lZF9sb25nX2xvbmdfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9kb3VibGVQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5kb3VibGVfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X2RvdWJsZVByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAmdmFsdWUpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPnNldF9kb3VibGVfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF91bnJlc3RyaWN0ZWREb3VibGVQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT51bnJlc3RyaWN0ZWRfZG91YmxlX3Byb3BlcnR5KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF91bnJlc3RyaWN0ZWREb3VibGVQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5yZXN0cmljdGVkX2RvdWJsZV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2J5dGVBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQ4X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPkJ5dGVBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fYnl0ZVJldHVybk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+Qnl0ZVJldHVybk9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZG91YmxlQXJndW1lbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZCksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Eb3VibGVBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZG91YmxlUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Eb3VibGVSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2xvbmdBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Mb25nQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2xvbmdMb25nQXJndW1lbnRPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8aW50NjRfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+TG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fbG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkxvbmdMb25nUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9sb25nUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5Mb25nUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9vY3RldEFyZ3VtZW50T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQ4X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk9jdGV0QXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX29jdGV0UmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5PY3RldFJldHVybk9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fc2hvcnRBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQxNl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TaG9ydEFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9zaG9ydFJldHVybk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+U2hvcnRSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3VucmVzdHJpY3RlZERvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VW5yZXN0cmljdGVkRG91YmxlQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3VucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+VW5yZXN0cmljdGVkRG91YmxlUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl91bnNpZ25lZExvbmdBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VW5zaWduZWRMb25nQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3Vuc2lnbmVkTG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czx1aW50NjRfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+VW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl91bnNpZ25lZExvbmdMb25nUmV0dXJuT3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5VbnNpZ25lZExvbmdMb25nUmV0dXJuT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl91bnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPlVuc2lnbmVkTG9uZ1JldHVybk9wZXJhdGlvbigpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fdW5zaWduZWRTaG9ydEFyZ3VtZW50T3BlcmF0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHVpbnQxNl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5VbnNpZ25lZFNob3J0QXJndW1lbnRPcGVyYXRpb24oYXJnMSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3Vuc2lnbmVkU2hvcnRSZXR1cm5PcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPlVuc2lnbmVkU2hvcnRSZXR1cm5PcGVyYXRpb24oKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJieXRlUHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9ieXRlUHJvcGVydHkpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfYnl0ZVByb3BlcnR5KSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgIm9jdGV0UHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9vY3RldFByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X29jdGV0UHJvcGVydHkpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAic2hvcnRQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3Nob3J0UHJvcGVydHkpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfc2hvcnRQcm9wZXJ0eSksCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJ1bnNpZ25lZFNob3J0UHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF91bnNpZ25lZFNob3J0UHJvcGVydHkpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfdW5zaWduZWRTaG9ydFByb3BlcnR5KSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgImxvbmdQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2xvbmdQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9sb25nUHJvcGVydHkpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAidW5zaWduZWRMb25nUHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF91bnNpZ25lZExvbmdQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF91bnNpZ25lZExvbmdQcm9wZXJ0eSksCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJsb25nTG9uZ1Byb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbG9uZ0xvbmdQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9sb25nTG9uZ1Byb3BlcnR5KSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgInVuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3Vuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF91bnNpZ25lZExvbmdMb25nUHJvcGVydHkpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAiZG91YmxlUHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF9kb3VibGVQcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9kb3VibGVQcm9wZXJ0eSksCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJ1bnJlc3RyaWN0ZWREb3VibGVQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5KSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIHsKLSAgICAgICJieXRlQXJndW1lbnRPcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fYnl0ZUFyZ3VtZW50T3BlcmF0aW9uKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgImJ5dGVSZXR1cm5PcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fYnl0ZVJldHVybk9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJkb3VibGVBcmd1bWVudE9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9kb3VibGVBcmd1bWVudE9wZXJhdGlvbiksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJkb3VibGVSZXR1cm5PcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZG91YmxlUmV0dXJuT3BlcmF0aW9uKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgImxvbmdBcmd1bWVudE9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9sb25nQXJndW1lbnRPcGVyYXRpb24pLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAibG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9sb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgImxvbmdMb25nUmV0dXJuT3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2xvbmdMb25nUmV0dXJuT3BlcmF0aW9uKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgImxvbmdSZXR1cm5PcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbG9uZ1JldHVybk9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJvY3RldEFyZ3VtZW50T3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX29jdGV0QXJndW1lbnRPcGVyYXRpb24pLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAib2N0ZXRSZXR1cm5PcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fb2N0ZXRSZXR1cm5PcGVyYXRpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAic2hvcnRBcmd1bWVudE9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9zaG9ydEFyZ3VtZW50T3BlcmF0aW9uKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInNob3J0UmV0dXJuT3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Nob3J0UmV0dXJuT3BlcmF0aW9uKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInVucmVzdHJpY3RlZERvdWJsZUFyZ3VtZW50T3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3VucmVzdHJpY3RlZERvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInVucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl91bnJlc3RyaWN0ZWREb3VibGVSZXR1cm5PcGVyYXRpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAidW5zaWduZWRMb25nQXJndW1lbnRPcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdW5zaWduZWRMb25nQXJndW1lbnRPcGVyYXRpb24pLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAidW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Vuc2lnbmVkTG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbiksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJ1bnNpZ25lZExvbmdMb25nUmV0dXJuT3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Vuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAidW5zaWduZWRMb25nUmV0dXJuT3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Vuc2lnbmVkTG9uZ1JldHVybk9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJ1bnNpZ25lZFNob3J0QXJndW1lbnRPcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdW5zaWduZWRTaG9ydEFyZ3VtZW50T3BlcmF0aW9uKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInVuc2lnbmVkU2hvcnRSZXR1cm5PcGVyYXRpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTkzNzA1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlZTcxODEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDYxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQmFzZUludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRGVyaXZlZEludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iYXNlX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rlcml2ZWRfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGVyaXZlZEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X2FyYml0cmFyeU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5hcmJpdHJhcnlfb2JqZWN0KCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF9hcmJpdHJhcnlPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X2FyYml0cmFyeV9vYmplY3QodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9iYXNlSW50ZXJmYWNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmJhc2VfaW50ZXJmYWNlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9kZXJpdmVkSW50ZXJmYWNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPmRlcml2ZWRfaW50ZXJmYWNlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHNldF9kZXJpdmVkSW50ZXJmYWNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxEZXJpdmVkSW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfZGVyaXZlZF9pbnRlcmZhY2UodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9vYmplY3RQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5vYmplY3RfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X29iamVjdFByb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8T3BhcXVlSGFuZGxlID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfb2JqZWN0X3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgImFyYml0cmFyeU9iamVjdCIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2FyYml0cmFyeU9iamVjdCksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9hcmJpdHJhcnlPYmplY3QpLAotICB9LAotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAgICJiYXNlSW50ZXJmYWNlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfYmFzZUludGVyZmFjZSksCi0gICAgICBKU09QX05VTExXUkFQUEVSLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAiZGVyaXZlZEludGVyZmFjZSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2Rlcml2ZWRJbnRlcmZhY2UpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfZGVyaXZlZEludGVyZmFjZSksCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJvYmplY3RQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X29iamVjdFByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X29iamVjdFByb3BlcnR5KSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJiYzA0ZGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3OTA2YTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTgwNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotI2luY2x1ZGUgIk1vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJPcGVyYXRpb25zVGVzdEludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIk9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZmNuX2xvbmdGdW5jdGlvbk5vQXJncygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+TG9uZ0Z1bmN0aW9uTm9BcmdzKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9vYmplY3RGdW5jdGlvbk5vQXJncygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+T2JqZWN0RnVuY3Rpb25Ob0FyZ3MoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX29wdGlvbmFsQXJndW1lbnRXaXRoRGVmYXVsdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgLy8gT3B0aW9uYWwgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMKLSAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgYXJnMSA9Ci0gICAgICAyLjcxODsKLSAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAwKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKLSAgICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJmFyZzEpOwotICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaW1wbC0+T3B0aW9uYWxBcmd1bWVudFdpdGhEZWZhdWx0KGFyZzEpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9vcHRpb25hbEFyZ3VtZW50cygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0gIC8vIE9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzM7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAxKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKLSAgICAgICAgY29udGV4dCwgYXJnc1sxXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJmFyZzIpOwotICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgICsrbnVtX3NldF9hcmd1bWVudHM7Ci0gIH0KLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAyKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMSgKLSAgICAgICAgY29udGV4dCwgYXJnc1syXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTEsCi0gICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJmFyZzMpOwotICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgICsrbnVtX3NldF9hcmd1bWVudHM7Ci0gIH0KLSAgc3dpdGNoIChudW1fc2V0X2FyZ3VtZW50cykgewotICAgIGNhc2UgMToKLSAgICAgIHsKLSAgICAgICAgICBpbXBsLT5PcHRpb25hbEFyZ3VtZW50cyhhcmcxKTsKLSAgICAgICAgICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gICAgICAgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgewotICAgICAgICAgIGltcGwtPk9wdGlvbmFsQXJndW1lbnRzKGFyZzEsIGFyZzIpOwotICAgICAgICAgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgICAgICAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDM6Ci0gICAgICB7Ci0gICAgICAgICAgaW1wbC0+T3B0aW9uYWxBcmd1bWVudHMoYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotSlNCb29sIGZjbl9vcHRpb25hbE51bGxhYmxlQXJndW1lbnRzV2l0aERlZmF1bHRzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICAvLyBPcHRpb25hbCBhcmd1bWVudHMgd2l0aCBkZWZhdWx0IHZhbHVlcwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmcxID0KLSAgICAgIGJhc2U6Om51bGxvcHQ7Ci0gIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIGFyZzIgPQotICAgICAgTlVMTDsKLSAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMjsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAwKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKLSAgICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwKLSAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICZhcmcxKTsKLSAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICBpZiAoYXJncy5sZW5ndGgoKSA+IDEpIHsKLSAgICBKUzo6Um9vdGVkVmFsdWUgb3B0aW9uYWxfdmFsdWUxKAotICAgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICAgIG9wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJmFyZzIpOwotICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaW1wbC0+T3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cyhhcmcxLCBhcmcyKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uNCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAzOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCi0gICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMik7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDIsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMigKLSAgICAgIGNvbnRleHQsIGFyZ3NbMl0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUyLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmczKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMzsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKLSAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgYXJnMzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCi0gICAgICBjb250ZXh0LCBhcmdzWzFdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMik7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDIsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMigKLSAgICAgIGNvbnRleHQsIGFyZ3NbMl0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUyLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmczKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5PdmVybG9hZGVkRnVuY3Rpb24oYXJnMSwgYXJnMiwgYXJnMyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBzd2l0Y2goYXJnYykgewotICAgIGNhc2UoMCk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24xKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UoMSk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzBdKTsKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKLSAgICAgICAgb2JqZWN0ID0gSlNWQUxfVE9fT0JKRUNUKGFyZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoYXJnLmlzTnVtYmVyKCkpIHsKLSAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24yKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24zKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24yKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UoMyk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgSlM6OlJvb3RlZFZhbHVlIGFyZyhjb250ZXh0LCBhcmdzWzJdKTsKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgICAgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICAgICAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gICAgICBpZiAoYXJnLmlzT2JqZWN0KCkpIHsKLSAgICAgICAgb2JqZWN0ID0gSlNWQUxfVE9fT0JKRUNUKGFyZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoYXJnLmlzT2JqZWN0KCkgPyB3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFyYml0cmFyeUludGVyZmFjZT4oKSkgOgotICAgICAgICAgICAgICBmYWxzZSkgewotICAgICAgICByZXR1cm4gZmNuX292ZXJsb2FkZWRGdW5jdGlvbjUoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBpZiAodHJ1ZSkgewotICAgICAgICByZXR1cm4gZmNuX292ZXJsb2FkZWRGdW5jdGlvbjQoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncwotICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUpTQm9vbCBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+T3ZlcmxvYWRlZE51bGxhYmxlKGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX292ZXJsb2FkZWROdWxsYWJsZTIoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8Ym9vbCA+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPk92ZXJsb2FkZWROdWxsYWJsZShhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9vdmVybG9hZGVkTnVsbGFibGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgc3dpdGNoKGFyZ2MpIHsKLSAgICBjYXNlKDEpOiB7Ci0gICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6Ci0gICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgICAgIEpTOjpSb290ZWRWYWx1ZSBhcmcoY29udGV4dCwgYXJnc1swXSk7Ci0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7Ci0gICAgICAgIG9iamVjdCA9IEpTVkFMX1RPX09CSkVDVChhcmcpOwotICAgICAgfQotICAgICAgaWYgKGFyZy5pc051bGxPclVuZGVmaW5lZCgpKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZE51bGxhYmxlMSgKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCi0gIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCi0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotSlNCb29sIGZjbl9zdHJpbmdGdW5jdGlvbk5vQXJncygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+U3RyaW5nRnVuY3Rpb25Ob0FyZ3MoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3ZhcmlhZGljUHJpbWl0aXZlQXJndW1lbnRzKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICAvLyBWYXJpYWRpYyBhcmd1bWVudAotICBUeXBlVHJhaXRzPHN0ZDo6dmVjdG9yPGludDMyX3Q+ID46OkNvbnZlcnNpb25UeXBlIGJvb2xzOwotCi0gIC8vIEdldCB2YXJpYWRpYyBhcmd1bWVudHMuCi0gIGNvbnN0IHNpemVfdCBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4ID0gMDsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4KSB7Ci0gICAgYm9vbHMucmVzaXplKGFyZ3MubGVuZ3RoKCkgLSBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSArIGtGaXJzdFZhcmlhZGljQXJnSW5kZXggPCBhcmdzLmxlbmd0aCgpOyArK2kpIHsKLSAgICAgIEpTOjpSb290ZWRWYWx1ZSB2YXJpYWRpY19hcmd1bWVudF92YWx1ZSgKLSAgICAgICAgICBjb250ZXh0LCBhcmdzW2kgKyBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4XSk7Ci0gICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICAgICAgdmFyaWFkaWNfYXJndW1lbnRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICAgJmJvb2xzW2ldKTsKLSAgICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpbXBsLT5WYXJpYWRpY1ByaW1pdGl2ZUFyZ3VtZW50cyhib29scyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3ZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICAvLyBPcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIG9wdGlvbmFsX2FyZzsKLSAgLy8gVmFyaWFkaWMgYXJndW1lbnQKLSAgVHlwZVRyYWl0czxzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gPjo6Q29udmVyc2lvblR5cGUgc3RyaW5nczsKLSAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMDsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAwKSB7Ci0gICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKLSAgICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gICAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgJm9wdGlvbmFsX2FyZyk7Ci0gICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKytudW1fc2V0X2FyZ3VtZW50czsKLSAgfQotCi0gIC8vIEdldCB2YXJpYWRpYyBhcmd1bWVudHMuCi0gIGNvbnN0IHNpemVfdCBrTGFzdE9wdGlvbmFsQXJnSW5kZXggPSAxOwotICBpZiAobnVtX3NldF9hcmd1bWVudHMgPT0ga0xhc3RPcHRpb25hbEFyZ0luZGV4KSB7Ci0gICAgLy8gSWYgdGhlIGxhc3Qgb3B0aW9uYWwgYXJndW1lbnQgaGFzIGJlZW4gc2V0LCB3ZSB3aWxsIGNhbGwgdGhlIG92ZXJsb2FkCi0gICAgLy8gdGhhdCB0YWtlcyB0aGUgdmFyaWFkaWMgYXJndW1lbnQsIHBvc3NpYmx5IHdpdGggYW4gZW1wdHkgdmVjdG9yIGluIHRoZQotICAgIC8vIGNhc2UgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSBhcmd1bWVudHMgbGVmdC4KLSAgICArK251bV9zZXRfYXJndW1lbnRzOwotICB9Ci0gIGNvbnN0IHNpemVfdCBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4ID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPiBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4KSB7Ci0gICAgc3RyaW5ncy5yZXNpemUoYXJncy5sZW5ndGgoKSAtIGtGaXJzdFZhcmlhZGljQXJnSW5kZXgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpICsga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCA8IGFyZ3MubGVuZ3RoKCk7ICsraSkgewotICAgICAgSlM6OlJvb3RlZFZhbHVlIHZhcmlhZGljX2FyZ3VtZW50X3ZhbHVlKAotICAgICAgICAgIGNvbnRleHQsIGFyZ3NbaSArIGtGaXJzdFZhcmlhZGljQXJnSW5kZXhdKTsKLSAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICB2YXJpYWRpY19hcmd1bWVudF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAmc3RyaW5nc1tpXSk7Ci0gICAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHN3aXRjaCAobnVtX3NldF9hcmd1bWVudHMpIHsKLSAgICBjYXNlIDA6Ci0gICAgICB7Ci0gICAgICAgICAgaW1wbC0+VmFyaWFkaWNTdHJpbmdBcmd1bWVudHNBZnRlck9wdGlvbmFsQXJndW1lbnQoKTsKLSAgICAgICAgICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gICAgICAgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgewotICAgICAgICAgIGltcGwtPlZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KG9wdGlvbmFsX2FyZywgc3RyaW5ncyk7Ci0gICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotSlNCb29sIGZjbl92b2lkRnVuY3Rpb25Mb25nQXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Wb2lkRnVuY3Rpb25Mb25nQXJnKGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3ZvaWRGdW5jdGlvbk5vQXJncygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpbXBsLT5Wb2lkRnVuY3Rpb25Ob0FyZ3MoKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fdm9pZEZ1bmN0aW9uT2JqZWN0QXJnKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlZvaWRGdW5jdGlvbk9iamVjdEFyZyhhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl92b2lkRnVuY3Rpb25TdHJpbmdBcmcoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5Wb2lkRnVuY3Rpb25TdHJpbmdBcmcoYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZCksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpPdmVybG9hZGVkRnVuY3Rpb24oYXJnKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOwotICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZCksCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZzEsIGFyZzIpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHN0YXRpY2Zjbl9vdmVybG9hZGVkRnVuY3Rpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgc3dpdGNoKGFyZ2MpIHsKLSAgICBjYXNlKDEpOiB7Ci0gICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6Ci0gICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMSgKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlKDIpOiB7Ci0gICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6Ci0gICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICAvLyBJbnZhbGlkIG51bWJlciBvZiBhcmdzCi0gIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gIC8vIDQuIElmIFMgaXMgZW1wdHksIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCi0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgImxvbmdGdW5jdGlvbk5vQXJncyIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9sb25nRnVuY3Rpb25Ob0FyZ3MpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAib2JqZWN0RnVuY3Rpb25Ob0FyZ3MiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fb2JqZWN0RnVuY3Rpb25Ob0FyZ3MpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAib3B0aW9uYWxBcmd1bWVudFdpdGhEZWZhdWx0IiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX29wdGlvbmFsQXJndW1lbnRXaXRoRGVmYXVsdCksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJvcHRpb25hbEFyZ3VtZW50cyIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9vcHRpb25hbEFyZ3VtZW50cyksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJvcHRpb25hbE51bGxhYmxlQXJndW1lbnRzV2l0aERlZmF1bHRzIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX29wdGlvbmFsTnVsbGFibGVBcmd1bWVudHNXaXRoRGVmYXVsdHMpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAib3ZlcmxvYWRlZEZ1bmN0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX292ZXJsb2FkZWRGdW5jdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJvdmVybG9hZGVkTnVsbGFibGUiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fb3ZlcmxvYWRlZE51bGxhYmxlKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInN0cmluZ0Z1bmN0aW9uTm9BcmdzIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3N0cmluZ0Z1bmN0aW9uTm9BcmdzKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInZhcmlhZGljUHJpbWl0aXZlQXJndW1lbnRzIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3ZhcmlhZGljUHJpbWl0aXZlQXJndW1lbnRzKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50IiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3ZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInZvaWRGdW5jdGlvbkxvbmdBcmciLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdm9pZEZ1bmN0aW9uTG9uZ0FyZyksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJ2b2lkRnVuY3Rpb25Ob0FyZ3MiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdm9pZEZ1bmN0aW9uTm9BcmdzKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInZvaWRGdW5jdGlvbk9iamVjdEFyZyIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl92b2lkRnVuY3Rpb25PYmplY3RBcmcpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAidm9pZEZ1bmN0aW9uU3RyaW5nQXJnIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3ZvaWRGdW5jdGlvblN0cmluZ0FyZyksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgIm92ZXJsb2FkZWRGdW5jdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJnN0YXRpY2Zjbl9vdmVybG9hZGVkRnVuY3Rpb24pLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIk9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmMyYmRmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZDAyOGMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTAwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6UHV0Rm9yd2FyZHNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlB1dEZvcndhcmRzSW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiUHV0Rm9yd2FyZHNJbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJQdXRGb3J3YXJkc0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBnZXRfZm9yd2FyZGluZ0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxQdXRGb3J3YXJkc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFB1dEZvcndhcmRzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfZm9yd2FyZGluZ0F0dHJpYnV0ZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxQdXRGb3J3YXJkc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFB1dEZvcndhcmRzSW50ZXJmYWNlKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpLmdldCgpOwotICB7IC8vIEJlZ2luIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KLSAgICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwgPQotICAgICAgIGltcGwtPmZvcndhcmRpbmdfYXR0cmlidXRlKCk7Ci0gICAgaWYgKCFmb3J3YXJkZWRfaW1wbCkgewotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmb3J3YXJkZWRfaW1wbC0+c2V0X2FyYml0cmFyeV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgfSAvLyBFbmQgc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsLgotfQotCi1KU0Jvb2wgc3RhdGljZ2V0X3N0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIFB1dEZvcndhcmRzSW50ZXJmYWNlOjpzdGF0aWNfZm9yd2FyZGluZ19hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc3RhdGljc2V0X3N0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgeyAvLyBCZWdpbiBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCi0gICAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsID0KLSAgICAgICBQdXRGb3J3YXJkc0ludGVyZmFjZTo6c3RhdGljX2ZvcndhcmRpbmdfYXR0cmlidXRlKCk7Ci0gICAgaWYgKCFmb3J3YXJkZWRfaW1wbCkgewotICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmb3J3YXJkZWRfaW1wbC0+c2V0X2FyYml0cmFyeV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLSAgfSAvLyBFbmQgc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsLgotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJmb3J3YXJkaW5nQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZm9yd2FyZGluZ0F0dHJpYnV0ZSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF9mb3J3YXJkaW5nQXR0cmlidXRlKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFN0YXRpYyByZWFkL3dyaXRlIGF0dHJpYnV0ZS4KLSAgICAgICJzdGF0aWNGb3J3YXJkaW5nQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZzdGF0aWNnZXRfc3RhdGljRm9yd2FyZGluZ0F0dHJpYnV0ZSksCi0gICAgICBKU09QX1dSQVBQRVIoJnN0YXRpY3NldF9zdGF0aWNGb3J3YXJkaW5nQXR0cmlidXRlKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIlB1dEZvcndhcmRzSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOwotICBEQ0hFQ0sobmV3X29iamVjdCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLQotLy9zdGF0aWMKLWNvbnN0IEpTQ2xhc3MqIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OwotfQotCi0KLW5hbWVzcGFjZSB7Ci19ICAvLyBuYW1lc3BhY2UKLQotCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmIxZWQ2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU2VxdWVuY2VVc2VyLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1NlcXVlbmNlVXNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYxMmM2Yy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU2VxdWVuY2VVc2VyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTE3NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc1NlcXVlbmNlVXNlci5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTZXF1ZW5jZVVzZXI7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NlcXVlbmNlVXNlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNTZXF1ZW5jZVVzZXJIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc1NlcXVlbmNlVXNlckhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1NlcXVlbmNlVXNlckhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzU2VxdWVuY2VVc2VySGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTZXF1ZW5jZVVzZXJIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNTZXF1ZW5jZVVzZXI6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiU2VxdWVuY2VVc2VyIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiU2VxdWVuY2VVc2VyUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiU2VxdWVuY2VVc2VyQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnN0cnVjdCA9IENvbnN0cnVjdG9yOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBmY25fZ2V0SW50ZXJmYWNlU2VxdWVuY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFNlcXVlbmNlVXNlciogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkdldEludGVyZmFjZVNlcXVlbmNlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFNlcXVlbmNlVXNlciogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZ2V0TG9uZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRMb25nU2VxdWVuY2UoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2dldFN0cmluZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRTdHJpbmdTZXF1ZW5jZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZ2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU2VxdWVuY2VVc2VyKiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+R2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2dldFVuaW9uU2VxdWVuY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFNlcXVlbmNlVXNlciogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPkdldFVuaW9uU2VxdWVuY2UoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3NldEludGVyZmFjZVNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+ID46OkNvbnZlcnNpb25UeXBlIGVsZW1lbnRzOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmZWxlbWVudHMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlNldEludGVyZmFjZVNlcXVlbmNlKGVsZW1lbnRzKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+ID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoZWxlbWVudHMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9zZXRMb25nU2VxdWVuY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFNlcXVlbmNlVXNlciogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgaW50MzJfdCA+ID46OkNvbnZlcnNpb25UeXBlIGVsZW1lbnRzOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmZWxlbWVudHMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlNldExvbmdTZXF1ZW5jZShlbGVtZW50cyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3NldFN0cmluZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHN0ZDo6c3RyaW5nID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+U2V0U3RyaW5nU2VxdWVuY2UoZWxlbWVudHMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGZjbl9zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKLQotICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAotICAgICAgY29udGV4dCwgYXJnc1swXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5TZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKGVsZW1lbnRzKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTZXF1ZW5jZVVzZXIqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOwotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPHNjcmlwdDo6VW5pb25UeXBlMjxzdGQ6OnN0cmluZywgc2NyaXB0OjpTZXF1ZW5jZTwgc3RkOjpzdHJpbmcgPiA+ID46OkNvbnZlcnNpb25UeXBlIGVsZW1lbnRzOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmZWxlbWVudHMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZShlbGVtZW50cyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3NldFVuaW9uU2VxdWVuY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFNlcXVlbmNlVXNlciogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7Ci0gIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKLSAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCi0gIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgc2NyaXB0OjpVbmlvblR5cGUyPHN0ZDo6c3RyaW5nLCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPiA+ID46OkNvbnZlcnNpb25UeXBlIGVsZW1lbnRzOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmZWxlbWVudHMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGltcGwtPlNldFVuaW9uU2VxdWVuY2UoZWxlbWVudHMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgImdldEludGVyZmFjZVNlcXVlbmNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldEludGVyZmFjZVNlcXVlbmNlKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgImdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAiZ2V0TG9uZ1NlcXVlbmNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldExvbmdTZXF1ZW5jZSksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJnZXRTdHJpbmdTZXF1ZW5jZSIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl9nZXRTdHJpbmdTZXF1ZW5jZSksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJnZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAiZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJnZXRVbmlvblNlcXVlbmNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldFVuaW9uU2VxdWVuY2UpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAic2V0SW50ZXJmYWNlU2VxdWVuY2UiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2V0SW50ZXJmYWNlU2VxdWVuY2UpLAotICAgICAgMSwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAic2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3NldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJzZXRMb25nU2VxdWVuY2UiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2V0TG9uZ1NlcXVlbmNlKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInNldFN0cmluZ1NlcXVlbmNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3NldFN0cmluZ1NlcXVlbmNlKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJzZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKSwKLSAgICAgIDEsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgewotICAgICAgInNldFVuaW9uU2VxdWVuY2UiLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2V0VW5pb25TZXF1ZW5jZSksCi0gICAgICAxLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJTZXF1ZW5jZVVzZXIiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCi0gIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KLSAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKLSAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU2VxdWVuY2VVc2VyOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU2VxdWVuY2VVc2VyOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTZXF1ZW5jZVVzZXI6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLUpTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxTZXF1ZW5jZVVzZXI+IG5ld19vYmplY3QgPQotICAgICAgbmV3IFNlcXVlbmNlVXNlcigpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7Ci0gIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7Ci0gIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7Ci0gIHJldHVybiB0cnVlOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1NlcXVlbmNlVXNlci5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1NlcXVlbmNlVXNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTQxZDk2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTZXF1ZW5jZVVzZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzU2VxdWVuY2VVc2VyX2gKLSNkZWZpbmUgTW96anNTZXF1ZW5jZVVzZXJfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VxdWVuY2VfdXNlci5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNTZXF1ZW5jZVVzZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzU2VxdWVuY2VVc2VyX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2ZhOWUyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLQotI2luY2x1ZGUgIk1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNBcmJpdHJhcnlJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2xvZ2dpbmdfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2NudHh0LmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6TG9nZ2luZ0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6R2V0Q2FsbGFibGVGb3JDYWxsYmFja0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjp1dGlsOjpHZXRFeGNlcHRpb25TdHJpbmc7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1Nb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTo6TW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgaW1wbGVtZW50aW5nX29iamVjdCkKLSAgICA6IGNvbnRleHRfKGNvbnRleHQpLAotICAgICAgaW1wbGVtZW50aW5nX29iamVjdF8oY29udGV4dCwgaW1wbGVtZW50aW5nX29iamVjdCkgeyB9Ci0KLWJhc2U6Om9wdGlvbmFsPGludDMyX3QgPiBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTo6SGFuZGxlQ2FsbGJhY2soCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIGNhbGxiYWNrX3RoaXMsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+JiB2YWx1ZSwKLSAgICBib29sKiBoYWRfZXhjZXB0aW9uKSBjb25zdCB7Ci0gIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwotICBiYXNlOjpvcHRpb25hbDxpbnQzMl90ID4gY29iYWx0X3JldHVybl92YWx1ZTsKLSAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICBKU0V4Y2VwdGlvblN0YXRlKiBwcmV2aW91c19leGNlcHRpb25fc3RhdGUgPSBKU19TYXZlRXhjZXB0aW9uU3RhdGUoY29udGV4dF8pOwotCi0gIC8vIFRoaXMgY291bGQgYmUgc2V0IHRvIE5VTEwgaWYgaXQgd2FzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBKUzo6Um9vdGVkT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3QoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3RfLkdldCgpKTsKLSAgRExPR19JRihXQVJOSU5HLCAhaW1wbGVtZW50aW5nX29iamVjdCkgPDwgIkltcGxlbWVudGluZyBvYmplY3QgaXMgTlVMTC4iOwotICBpZiAoaW1wbGVtZW50aW5nX29iamVjdCkgewotICAgIEpTQXV0b0NvbXBhcnRtZW50IGF1dG9fY29tcGFydG1lbnQoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3QpOwotCi0gICAgLy8gR2V0IGNhbGxhYmxlIG9iamVjdC4KLSAgICBKUzo6Um9vdGVkVmFsdWUgY2FsbGFibGUoY29udGV4dF8pOwotICAgIGlmIChHZXRDYWxsYWJsZUZvckNhbGxiYWNrSW50ZXJmYWNlKGNvbnRleHRfLCBpbXBsZW1lbnRpbmdfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGVDYWxsYmFjayIsICZjYWxsYWJsZSkpIHsKLSAgICAgIC8vIENvbnZlcnQgdGhlIGNhbGxiYWNrX3RoaXMgdG8gYSBKU1ZhbHVlLgotICAgICAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dF8pOwotICAgICAgVG9KU1ZhbHVlKGNvbnRleHRfLCBjYWxsYmFja190aGlzLCAmdGhpc192YWx1ZSk7Ci0KLSAgICAgIC8vIENvbnZlcnQgYXJndW1lbnRzLgotICAgICAgY29uc3QgaW50IGtOdW1Bcmd1bWVudHMgPSAxOwotICAgICAgSlM6OlZhbHVlIGFyZ3Nba051bUFyZ3VtZW50c107Ci0gICAgICBqczo6U2V0VmFsdWVSYW5nZVRvTnVsbChhcmdzLCBrTnVtQXJndW1lbnRzKTsKLSAgICAgIGpzOjpBdXRvVmFsdWVBcnJheSBhdXRvX2FycmF5X3Jvb3Rlcihjb250ZXh0XywgYXJncywga051bUFyZ3VtZW50cyk7Ci0gICAgICBUb0pTVmFsdWUoY29udGV4dF8sIHZhbHVlLAotICAgICAgICAgICAgICAgIGF1dG9fYXJyYXlfcm9vdGVyLmhhbmRsZUF0KDApKTsKLQotICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24uCi0gICAgICBKUzo6Um9vdGVkVmFsdWUgcmV0dXJuX3ZhbHVlKGNvbnRleHRfKTsKLSAgICAgIEpTOjpSb290ZWRGdW5jdGlvbiBmdW5jdGlvbigKLSAgICAgICAgICBjb250ZXh0XywgSlNfVmFsdWVUb0Z1bmN0aW9uKGNvbnRleHRfLCBjYWxsYWJsZSkpOwotICAgICAgRENIRUNLKGZ1bmN0aW9uKTsKLSAgICAgIHN1Y2Nlc3MgPSBKUzo6Q2FsbChjb250ZXh0XywgdGhpc192YWx1ZSwgZnVuY3Rpb24sIGtOdW1Bcmd1bWVudHMsIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlLmFkZHJlc3MoKSk7Ci0gICAgICBETE9HX0lGKFdBUk5JTkcsICFzdWNjZXNzKSA8PCAiRXhjZXB0aW9uIGluIGNhbGxiYWNrOiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRFeGNlcHRpb25TdHJpbmcoY29udGV4dF8pOwotICAgICAgaWYgKHN1Y2Nlc3MpIHsKLSAgICAgICAgTG9nZ2luZ0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZTsKLSAgICAgICAgRnJvbUpTVmFsdWUoY29udGV4dF8sIHJldHVybl92YWx1ZSwgMCwgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgJmNvYmFsdF9yZXR1cm5fdmFsdWUpOwotICAgICAgICBzdWNjZXNzID0gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgKmhhZF9leGNlcHRpb24gPSAhc3VjY2VzczsKLSAgSlNfUmVzdG9yZUV4Y2VwdGlvblN0YXRlKGNvbnRleHRfLCBwcmV2aW91c19leGNlcHRpb25fc3RhdGUpOwotICByZXR1cm4gY29iYWx0X3JldHVybl92YWx1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkOWU4MmUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuaC50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpZm5kZWYgTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2ludGVyZmFjZV90cmFpdHMuaCIKLS8vIEhlYWRlcnMgZm9yIG90aGVyIGJpbmRpbmdzIHdyYXBwZXIgY2xhc3NlcwotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dlYWtfaGVhcF9vYmplY3QuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZSA6IHB1YmxpYyBTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgQmFzZVR5cGU7Ci0KLSAgTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgaW1wbGVtZW50aW5nX29iamVjdCk7Ci0gIGJhc2U6Om9wdGlvbmFsPGludDMyX3QgPiBIYW5kbGVDYWxsYmFjaygKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiBjYWxsYmFja190aGlzLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+JiB2YWx1ZSwKLSAgICAgIGJvb2wqIGhhZF9leGNlcHRpb24pIGNvbnN0IE9WRVJSSURFOwotICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaW1wbGVtZW50aW5nX29iamVjdF8uR2V0KCk7IH0KLQotIHByaXZhdGU6Ci0gIEpTQ29udGV4dCogY29udGV4dF87Ci0gIHNjcmlwdDo6bW96anM6OldlYWtIZWFwT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3RfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotbmFtZXNwYWNlIHNjcmlwdCB7Ci0vLyBFeHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzIHN0cnVjdCBzbyB3ZSBjYW4gaW5mZXIKLS8vIHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgZnJvbSB0aGUgdHlwZSBvZiB0aGUgY2FsbGJhY2sgaW50ZXJmYWNlLgotdGVtcGxhdGU8Pgotc3RydWN0IENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzPGJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U+IHsKLSAgdHlwZWRlZiBiaW5kaW5nczo6dGVzdGluZzo6TW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgTW96anNDYWxsYmFja0ludGVyZmFjZUNsYXNzOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBzY3JpcHQKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwODNiZTkzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjY3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBzdGF0aWNnZXRfc3RhdGljQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpzdGF0aWNfYXR0cmlidXRlKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHN0YXRpY3NldF9zdGF0aWNBdHRyaWJ1dGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpzZXRfc3RhdGljX2F0dHJpYnV0ZSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotCi0gIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKCk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpTdGF0aWNGdW5jdGlvbihhcmcpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjMoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBhcmc7Ci0KLSAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZyk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uNCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDM7Ci0gIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cwotICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzI7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmczOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAotICAgICAgY29udGV4dCwgYXJnc1syXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAzOwotICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKLSAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKLSAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7Ci0gIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOwotICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmczOwotCi0gIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCi0gICAgICBjb250ZXh0LCBhcmdzWzBdKTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKLSAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAotICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOwotICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKLSAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOwotICBGcm9tSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAotICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCi0gICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAotICAgICAgY29udGV4dCwgYXJnc1syXSk7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCi0gICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKLSAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOwotICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBzd2l0Y2goYXJnYykgewotICAgIGNhc2UoMCk6IHsKLSAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKLSAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjEoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSgxKTogewotICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgotICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gICAgICBKUzo6Um9vdGVkVmFsdWUgYXJnKGNvbnRleHQsIGFyZ3NbMF0pOwotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgewotICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKLSAgICAgIH0KLSAgICAgIGlmIChhcmcuaXNOdW1iZXIoKSkgewotICAgICAgICByZXR1cm4gc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKLSAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKLSAgICAgIH0KLSAgICAgIGlmICh0cnVlKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24zKAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjIoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSgzKTogewotICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgotICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCi0gICAgICBKUzo6Um9vdGVkVmFsdWUgYXJnKGNvbnRleHQsIGFyZ3NbMl0pOwotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgewotICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKLSAgICAgIH0KLSAgICAgIGlmIChhcmcuaXNPYmplY3QoKSA/IHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSA6Ci0gICAgICAgICAgICAgIGZhbHNlKSB7Ci0gICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb241KAotICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOwotICAgICAgfQotICAgICAgaWYgKHRydWUpIHsKLSAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjQoCi0gICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncwotICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQotICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFN0YXRpYyByZWFkL3dyaXRlIGF0dHJpYnV0ZS4KLSAgICAgICJzdGF0aWNBdHRyaWJ1dGUiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJnN0YXRpY2dldF9zdGF0aWNBdHRyaWJ1dGUpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzdGF0aWNzZXRfc3RhdGljQXR0cmlidXRlKSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICB7Ci0gICAgICAic3RhdGljRnVuY3Rpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24pLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzZmVhY2MuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmY4ZGJkNS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLQotSlNCb29sIFN0cmluZ2lmaWVyKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIGlmICghaW1wbCkgewotICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oY29iYWx0OjpzY3JpcHQ6OmtTdHJpbmdpZmllclByb2JsZW0pOwotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgc3RkOjpzdHJpbmcgc3RyaW5naWZpZWQgPSBpbXBsLT5Bbm9ueW1vdXNTdHJpbmdpZmllcigpOwotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LAotICAgICAgSlNfTmV3U3RyaW5nQ29weU4oY29udGV4dCwgc3RyaW5naWZpZWQuY19zdHIoKSwgc3RyaW5naWZpZWQubGVuZ3RoKCkpKTsKLSAgYXJncy5ydmFsKCkuc2V0KEpTOjpTdHJpbmdWYWx1ZShyb290ZWRfc3RyaW5nKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgInRvU3RyaW5nIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmU3RyaW5naWZpZXIpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9QRVJNQU5FTlQsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4MDcyMDEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotY2xhc3MgTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZSB7Ci0gcHVibGljOgotICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOwotICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MWZjZTUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCi0KLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgotCi1uYW1lc3BhY2UgewotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0T2JqZWN0OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLQotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgewotIHB1YmxpYzoKLSAgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotCi1zdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOwotICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSI7Ci0gIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7Ci0gIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOwotICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCi0gIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7Ci0KLSAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKLSAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIlN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VDb25zdHJ1Y3RvciI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi1KU0Jvb2wgZ2V0X3RoZVN0cmluZ2lmaWVyQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPnRoZV9zdHJpbmdpZmllcl9hdHRyaWJ1dGUoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X3RoZVN0cmluZ2lmaWVyQXR0cmlidXRlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3RoZV9zdHJpbmdpZmllcl9hdHRyaWJ1dGUodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1KU0Jvb2wgU3RyaW5naWZpZXIoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZT4oKS5nZXQoKTsKLSAgaWYgKCFpbXBsKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihjb2JhbHQ6OnNjcmlwdDo6a1N0cmluZ2lmaWVyUHJvYmxlbSk7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdGQ6OnN0cmluZyBzdHJpbmdpZmllZCA9IGltcGwtPnRoZV9zdHJpbmdpZmllcl9hdHRyaWJ1dGUoKTsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICBKUzo6Um9vdGVkU3RyaW5nIHJvb3RlZF9zdHJpbmcoY29udGV4dCwKLSAgICAgIEpTX05ld1N0cmluZ0NvcHlOKGNvbnRleHQsIHN0cmluZ2lmaWVkLmNfc3RyKCksIHN0cmluZ2lmaWVkLmxlbmd0aCgpKSk7Ci0gIGFyZ3MucnZhbCgpLnNldChKUzo6U3RyaW5nVmFsdWUocm9vdGVkX3N0cmluZykpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgInRoZVN0cmluZ2lmaWVyQXR0cmlidXRlIiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUpLAotICB9LAotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgInRvU3RyaW5nIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmU3RyaW5naWZpZXIpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9QRVJNQU5FTlQsCi0gICAgICBOVUxMLAotICB9LAotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi12b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKLSAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOwotCi0gIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKLSAgICAgIE5VTEwpOwotICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKLSAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCi0gICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOwotCi0gIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCi0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOwotICBjb25zdCBjaGFyIG5hbWVbXSA9Ci0gICAgICAiU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UiOwotICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7Ci0gIHN1Y2Nlc3MgPQotICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLQotICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCi0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAotICAgICAgY29udGV4dCwKLSAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLX0KLQotSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCi0gIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgotICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOwotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOwotICBpZiAoIWludGVyZmFjZV9kYXRhKSB7Ci0gICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7Ci0gICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKLSAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKLSAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKLSAgfQotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKLSAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCi0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMTYzNjcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlX2gKLSNkZWZpbmUgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZV9oCi0KLSNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWE0Y2NkYS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaW5jbHVkZSAiTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VQcm90b3R5cGUiOwotICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKLSAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0KLSAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9Ci0gICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBmY25fdGhlU3RyaW5naWZpZXJPcGVyYXRpb24oCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7Ci0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgVG9KU1ZhbHVlKGNvbnRleHQsCi0gICAgICAgICAgICAgIGltcGwtPlRoZVN0cmluZ2lmaWVyT3BlcmF0aW9uKCksCi0gICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOwotICB9Ci0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOwotICB9Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1KU0Jvb2wgU3RyaW5naWZpZXIoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKLSAgaWYgKCFpbXBsKSB7Ci0gICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihjb2JhbHQ6OnNjcmlwdDo6a1N0cmluZ2lmaWVyUHJvYmxlbSk7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdGQ6OnN0cmluZyBzdHJpbmdpZmllZCA9IGltcGwtPlRoZVN0cmluZ2lmaWVyT3BlcmF0aW9uKCk7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgSlM6OlJvb3RlZFN0cmluZyByb290ZWRfc3RyaW5nKGNvbnRleHQsCi0gICAgICBKU19OZXdTdHJpbmdDb3B5Tihjb250ZXh0LCBzdHJpbmdpZmllZC5jX3N0cigpLCBzdHJpbmdpZmllZC5sZW5ndGgoKSkpOwotICBhcmdzLnJ2YWwoKS5zZXQoSlM6OlN0cmluZ1ZhbHVlKHJvb3RlZF9zdHJpbmcpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0gewotICB7Ci0gICAgICAidG9TdHJpbmciLAotICAgICAgSlNPUF9XUkFQUEVSKCZTdHJpbmdpZmllciksCi0gICAgICAwLAotICAgICAgSlNQUk9QX1BFUk1BTkVOVCwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJ0aGVTdHJpbmdpZmllck9wZXJhdGlvbiIsCi0gICAgICBKU09QX1dSQVBQRVIoJmZjbl90aGVTdHJpbmdpZmllck9wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socHJvdG90eXBlKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAotICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKLSAgRENIRUNLKG5ld19vYmplY3QpOwotICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCi0gICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKLSAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOwotICByZXR1cm4gcHJveHk7Ci19Ci0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODkyNDA4NS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1RhcmdldEludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNUYXJnZXRJbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZDdmY2YuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1RhcmdldEludGVyZmFjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQotCi0vLyBjbGFuZy1mb3JtYXQgb2ZmCi0KLSNpbmNsdWRlICJNb3pqc1RhcmdldEludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpUYXJnZXRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1RhcmdldEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotfSAgLy8gbmFtZXNwYWNlCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGJpbmRpbmdzIHsKLW5hbWVzcGFjZSB0ZXN0aW5nIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW96anNUYXJnZXRJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7Ci0gcHVibGljOgotICBNb3pqc1RhcmdldEludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1RhcmdldEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLVByb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKLU1vempzVGFyZ2V0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci0KLXN0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNUYXJnZXRJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNUYXJnZXRJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCi0gIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCi0gIGJvb2wgaXNfZGVsZWdhdGU7Ci0gIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7Ci0gICAgKnN1Y2Nlc3MgPSBmYWxzZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOwotCi0gIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOwotICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiVGFyZ2V0SW50ZXJmYWNlIjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiVGFyZ2V0SW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiVGFyZ2V0SW50ZXJmYWNlQ29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGZjbl9pbXBsZW1lbnRlZEludGVyZmFjZUZ1bmN0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxUYXJnZXRJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBUYXJnZXRJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VGFyZ2V0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPkltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBmY25fcGFydGlhbEludGVyZmFjZUZ1bmN0aW9uKAotICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgewotICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7Ci0gIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KLSAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKLSAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCi0gIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOwotICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxUYXJnZXRJbnRlcmZhY2U+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBUYXJnZXRJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VGFyZ2V0SW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGltcGwtPlBhcnRpYWxJbnRlcmZhY2VGdW5jdGlvbigpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLWNvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKLSAgewotICAgICAgImltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25faW1wbGVtZW50ZWRJbnRlcmZhY2VGdW5jdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIHsKLSAgICAgICJwYXJ0aWFsSW50ZXJmYWNlRnVuY3Rpb24iLAotICAgICAgSlNPUF9XUkFQUEVSKCZmY25fcGFydGlhbEludGVyZmFjZUZ1bmN0aW9uKSwKLSAgICAgIDAsCi0gICAgICBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgTlVMTCwKLSAgfSwKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0gewotICBKU19GU19FTkQKLX07Ci0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotdm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIlRhcmdldEludGVyZmFjZSI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNUYXJnZXRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOwotICByZXR1cm4gcHJvdG9fY2xhc3M7Ci19Ci0KLS8vIHN0YXRpYwotSlNPYmplY3QqIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgewotICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKLSAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAotICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7Ci0gIH0KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNUYXJnZXRJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNUYXJnZXRJbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNUYXJnZXRJbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNlYjA3Yi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzVGFyZ2V0SW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc1RhcmdldEludGVyZmFjZV9oCi0jZGVmaW5lIE1vempzVGFyZ2V0SW50ZXJmYWNlX2gKLQotI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgotI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzVGFyZ2V0SW50ZXJmYWNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc1RhcmdldEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzVW5pb25UeXBlc0ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNVbmlvblR5cGVzSW50ZXJmYWNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzYxNzg5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNVbmlvblR5cGVzSW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzVW5pb25UeXBlc0ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKLSNpbmNsdWRlICJNb3pqc0FyYml0cmFyeUludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQmFzZUludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iYXNlX2ludGVyZmFjZS5oIgotCi0jaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKLQotbmFtZXNwYWNlIHsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlVuaW9uVHlwZXNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Jhc2VJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRPYmplY3Q7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwotCi11c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLX0gIC8vIG5hbWVzcGFjZQotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE1vempzVW5pb25UeXBlc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzVW5pb25UeXBlc0ludGVyZmFjZUhhbmRsZXIoKQotICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9Ci0KLSBwcml2YXRlOgotICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOwotICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKLX07Ci0KLVByb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLX07Ci1Qcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCi1Nb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VIYW5kbGVyPgotICAgIHByb3h5X2hhbmRsZXI7Ci0KLUpTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotCi0gIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgotICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgotICBib29sIGlzX2RlbGVnYXRlOwotICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgewotICAgICpzdWNjZXNzID0gZmFsc2U7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOwotICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAotICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKLQotICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKLSAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7Ci0gIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlVuaW9uVHlwZXNJbnRlcmZhY2UiOwotICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOwotICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKLSAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgotICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOwotCi0gIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247Ci0gIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJVbmlvblR5cGVzSW50ZXJmYWNlUHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiVW5pb25UeXBlc0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Ci19Ci0KLUpTQm9vbCBnZXRfdW5pb25Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT51bmlvbl9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfdW5pb25Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPHNjcmlwdDo6VW5pb25UeXBlNDxzdGQ6OnN0cmluZywgYm9vbCwgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+LCBpbnQzMl90ID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3VuaW9uX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT51bmlvbl93aXRoX251bGxhYmxlX21lbWJlcl9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHNjcmlwdDo6VW5pb25UeXBlMjxkb3VibGUsIHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5pb25fd2l0aF9udWxsYWJsZV9tZW1iZXJfcHJvcGVydHkodmFsdWUpOwotICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7Ci0gIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKLX0KLQotSlNCb29sIGdldF9udWxsYWJsZVVuaW9uUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfdW5pb25fcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X251bGxhYmxlVW5pb25Qcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOwotICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHNjcmlwdDo6VW5pb25UeXBlMjxkb3VibGUsIHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X251bGxhYmxlX3VuaW9uX3Byb3BlcnR5KHZhbHVlKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBnZXRfdW5pb25CYXNlUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKLQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICBUb0pTVmFsdWUoY29udGV4dCwKLSAgICAgICAgICAgICAgaW1wbC0+dW5pb25fYmFzZV9wcm9wZXJ0eSgpLAotICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKLSAgfQotICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKLSAgfQotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLUpTQm9vbCBzZXRfdW5pb25CYXNlUHJvcGVydHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAotICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKLSAgVHlwZVRyYWl0czxzY3JpcHQ6OlVuaW9uVHlwZTI8c2NvcGVkX3JlZnB0cjxCYXNlSW50ZXJmYWNlPiwgc3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKLSAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKLSAgICAgICAgICAgICAgJnZhbHVlKTsKLSAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbXBsLT5zZXRfdW5pb25fYmFzZV9wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi0KLWNvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7Ci0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJ1bmlvblByb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfdW5pb25Qcm9wZXJ0eSksCi0gICAgICBKU09QX1dSQVBQRVIoJnNldF91bmlvblByb3BlcnR5KSwKLSAgfSwKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgInVuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHkiLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF91bmlvbldpdGhOdWxsYWJsZU1lbWJlclByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3VuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHkpLAotICB9LAotICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5Ci0gICAgICAibnVsbGFibGVVbmlvblByb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbnVsbGFibGVVbmlvblByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlVW5pb25Qcm9wZXJ0eSksCi0gIH0sCi0gIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKLSAgICAgICJ1bmlvbkJhc2VQcm9wZXJ0eSIsIDAsCi0gICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3VuaW9uQmFzZVByb3BlcnR5KSwKLSAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3VuaW9uQmFzZVByb3BlcnR5KSwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgotICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAotICAgICAgTlVMTCk7Ci0gIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCi0gICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOwotICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCi0gICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7Ci0KLSAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KLSAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7Ci0gIGNvbnN0IGNoYXIgbmFtZVtdID0KLSAgICAgICJVbmlvblR5cGVzSW50ZXJmYWNlIjsKLSAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOwotICBzdWNjZXNzID0KLSAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0KLSAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKLSAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsCi0gICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgIHJvb3RlZF9wcm90b3R5cGUpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci19Ci0KLUludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQotICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KLSAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgewotICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOwotICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7Ci0gICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7Ci0gICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7Ci0gIH0KLSAgcmV0dXJuIGludGVyZmFjZV9kYXRhOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsCi0gICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKLSAgRENIRUNLKGdsb2JhbF9vYmplY3QpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKHByb3RvdHlwZSk7Ci0gIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7Ci0gIERDSEVDSyhuZXdfb2JqZWN0KTsKLSAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAotICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7Ci0gIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKLSAgcmV0dXJuIHByb3h5OwotfQotCi0vL3N0YXRpYwotY29uc3QgSlNDbGFzcyogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKLSAgICAgIEpTQ29udGV4dCogY29udGV4dCkgewotICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOwotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LAotICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOwotICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKLSAgcmV0dXJuIHByb3RvX2NsYXNzOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgewotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Ci19Ci0KLQotbmFtZXNwYWNlIHsKLX0gIC8vIG5hbWVzcGFjZQotCi0KLX0gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCi19ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNVbmlvblR5cGVzSW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzVW5pb25UeXBlc0ludGVyZmFjZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODA4ZmNiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNVbmlvblR5cGVzSW50ZXJmYWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2lmbmRlZiBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VfaAotI2RlZmluZSBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2VfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgiCi0KLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1jbGFzcyBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKLSAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLSAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCi19ICAvLyBuYW1lc3BhY2UgdGVzdGluZwotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAotCi0jZW5kaWYgIC8vIE1vempzVW5pb25UeXBlc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzV2luZG93LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1dpbmRvdy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWNiMzA1My4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL01vempzV2luZG93LmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTk1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCi0KLS8vIGNsYW5nLWZvcm1hdCBvZmYKLQotI2luY2x1ZGUgIk1vempzV2luZG93LmgiCi0KLSNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgotI2luY2x1ZGUgIk1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQXJiaXRyYXJ5SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNCYXNlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNDb25kaXRpb25hbEludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQ29uc3RhbnRzSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNDb25zdHJ1Y3RvckludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNEZXJpdmVkSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNEaXNhYmxlZEludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRW51bWVyYXRpb25JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRXhjZXB0aW9uc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudC5oIgotI2luY2x1ZGUgIk1vempzSW1wbGVtZW50ZWRJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNTZXF1ZW5jZVVzZXIuaCIKLSNpbmNsdWRlICJNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5oIgotI2luY2x1ZGUgIk1vempzVGFyZ2V0SW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNVbmlvblR5cGVzSW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiTW96anNXaW5kb3cuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaXNhYmxlZF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZW51bWVyYXRpb25faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25zX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4dGVuZGVkX2lkbF9hdHRyaWJ1dGVzX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nbG9iYWxfaW50ZXJmYWNlX3BhcmVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ltcGxlbWVudGVkX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19pbnRlcmZhY2Vfb2JqZWN0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29wZXJhdGlvbnNfdGVzdF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VxdWVuY2VfdXNlci5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlc19pbnRlcmZhY2UuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy93aW5kb3cuaCIKLQotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCi0KLW5hbWVzcGFjZSB7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpXaW5kb3c7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1dpbmRvdzsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkJhc2VJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U7Ci0jaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uZGl0aW9uYWxJbnRlcmZhY2U7Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0YW50c0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RE9NU3RyaW5nVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpEZXJpdmVkSW50ZXJmYWNlOwotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRpc2FibGVkSW50ZXJmYWNlOwotI2VuZGlmICAvLyBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFbnVtZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbk9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbnNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHZXRPcGFxdWVSb290SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2xvYmFsSW50ZXJmYWNlUGFyZW50OwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW1wbGVtZW50ZWRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpJbmRleGVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOwotI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U7Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RhbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdHJ1Y3RvckludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkSW50ZXJmYWNlOwotI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGlzYWJsZWRJbnRlcmZhY2U7Ci0jZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRW51bWVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXhjZXB0aW9uc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW1wbGVtZW50ZWRJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTZXF1ZW5jZVVzZXI7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzVGFyZ2V0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNVbmlvblR5cGVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNXaW5kb3c7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TmFtZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5vQ29uc3RydWN0b3JJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6UHV0Rm9yd2FyZHNJbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTZXF1ZW5jZVVzZXI7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Ci11c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VGFyZ2V0SW50ZXJmYWNlOwotdXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VW5pb25UeXBlc0ludGVyZmFjZTsKLXVzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OldpbmRvdzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Ci0KLXVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOwotSlNPYmplY3QqIER1bW15RnVuY3RvcigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7Ci0gIE5PVFJFQUNIRUQoKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotbmFtZXNwYWNlIGNvYmFsdCB7Ci1uYW1lc3BhY2UgYmluZGluZ3MgewotbmFtZXNwYWNlIHRlc3RpbmcgewotCi1uYW1lc3BhY2UgewotCi1jbGFzcyBNb3pqc1dpbmRvd0hhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIE1vempzV2luZG93SGFuZGxlcigpCi0gICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7Ci0gIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOwotfTsKLQotUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKLU1vempzV2luZG93SGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7Ci0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi19OwotUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcwotTW96anNXaW5kb3dIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0gewotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotICBOVUxMLAotfTsKLQotc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1dpbmRvd0hhbmRsZXI+Ci0gICAgcHJveHlfaGFuZGxlcjsKLQotSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAotICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgewotICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCi0gICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBNb3pqc1dpbmRvdzo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLQotICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKLSAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KLSAgYm9vbCBpc19kZWxlZ2F0ZTsKLSAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKLSAgICAqc3VjY2VzcyA9IGZhbHNlOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1JbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKLSAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCi0gICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7Ci0gIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKLSAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7Ci0KLSAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247Ci0gIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSBKU0NMQVNTX0dMT0JBTF9GTEFHUzsKLSAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiV2luZG93IjsKLSAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKLSAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKLSAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KLSAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7Ci0gIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KLSAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKLQotICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOwotICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiV2luZG93UHJvdG90eXBlIjsKLSAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7Ci0gIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKLSAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOwotCi0gIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQotICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiV2luZG93Q29uc3RydWN0b3IiOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOwotICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7Ci0gIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKLSAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotSlNCb29sIGdldF93aW5kb3dQcm9wZXJ0eSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxXaW5kb3c+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBXaW5kb3cqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8V2luZG93PigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT53aW5kb3dfcHJvcGVydHkoKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgc2V0X3dpbmRvd1Byb3BlcnR5KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKLSAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFdpbmRvdyogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7Ci0gIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7Ci0gIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICZ2YWx1ZSk7Ci0gIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW1wbC0+c2V0X3dpbmRvd19wcm9wZXJ0eSh2YWx1ZSk7Ci0gIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZ2V0X3dpbmRvdygKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAotICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxXaW5kb3c+KCkpKSB7Ci0gICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7Ci0gICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7Ci0KLSAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9Ci0gICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOwotICBXaW5kb3cqIGltcGwgPQotICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8V2luZG93PigpLmdldCgpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT53aW5kb3coKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX2dldFN0YWNrVHJhY2UoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7Ci0gIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKLSAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgotICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOwotICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KLSAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7Ci0gIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7Ci0gICAgTk9UUkVBQ0hFRCgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKLSAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCi0gICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKLSAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKLSAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKLQotICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KLSAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7Ci0gIFdpbmRvdyogaW1wbCA9Ci0gICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwotCi0gIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgIFRvSlNWYWx1ZShjb250ZXh0LAotICAgICAgICAgICAgICBpbXBsLT5HZXRTdGFja1RyYWNlKGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudC0+R2V0U3RhY2tUcmFjZSgpKSwKLSAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7Ci0gICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7Ci0gIH0KLSAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotfQotCi1KU0Jvb2wgZmNuX3dpbmRvd09wZXJhdGlvbigKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKLSAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOwotICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCi0gIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7Ci0gIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKLSAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKLSAgICBOT1RSRUFDSEVEKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgewotICAgIE5PVFJFQUNIRUQoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KLSAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOwotICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKLSAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8V2luZG93PigpKSkgewotICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOwotICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOwotICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOwotCi0gIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQotICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKLSAgV2luZG93KiBpbXBsID0KLSAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFdpbmRvdz4oKS5nZXQoKTsKLQotICBpbXBsLT5XaW5kb3dPcGVyYXRpb24oKTsKLSAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOwotICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Ci19Ci0KLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKLSAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQotICAgICAgIndpbmRvd1Byb3BlcnR5IiwgMCwKLSAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAotICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfd2luZG93UHJvcGVydHkpLAotICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfd2luZG93UHJvcGVydHkpLAotICB9LAotICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKLSAgICAgICJ3aW5kb3ciLCAwLAotICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUgfCBKU1BST1BfUkVBRE9OTFksCi0gICAgICBKU09QX1dSQVBQRVIoJmdldF93aW5kb3cpLAotICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKLSAgfSwKLSAgSlNfUFNfRU5ECi19OwotCi1jb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7Ci0gIHsKLSAgICAgICJnZXRTdGFja1RyYWNlIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldFN0YWNrVHJhY2UpLAotICAgICAgMCwKLSAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCi0gICAgICBOVUxMLAotICB9LAotICB7Ci0gICAgICAid2luZG93T3BlcmF0aW9uIiwKLSAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3dpbmRvd09wZXJhdGlvbiksCi0gICAgICAwLAotICAgICAgSlNQUk9QX0VOVU1FUkFURSwKLSAgICAgIE5VTEwsCi0gIH0sCi0gIEpTX0ZTX0VORAotfTsKLQotY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7Ci0gIEpTX1BTX0VORAotfTsKLQotY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKLSAgSlNfRlNfRU5ECi19OwotCi1jb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0gewotICBKU19QU19FTkQKLX07Ci0KLXZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAotICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCi0gICAgICBjb250ZXh0LCBiaW5kaW5nczo6dGVzdGluZzo6TW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKLQotICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCi0gIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCi0gICAgICBOVUxMKTsKLSAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKLSAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKLSAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7Ci0gIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KLSAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKLSAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAotICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKLQotICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAotICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOwotICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKLSAgY29uc3QgY2hhciBuYW1lW10gPQotICAgICAgIldpbmRvdyI7Ci0gIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKLSAgc3VjY2VzcyA9Ci0gICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCi0gICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0KLSAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOwotICBEQ0hFQ0soc3VjY2Vzcyk7Ci0gIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KLSAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7Ci0gIERDSEVDSyhzdWNjZXNzKTsKLQotCi0gIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKLSAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOwotICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCi0gICAgICBjb250ZXh0LAotICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCi0gICAgICByb290ZWRfcHJvdG90eXBlKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotfQotCi1JbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgewotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKLSAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCi0gIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7Ci0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7Ci0gIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKLSAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKLSAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOwotICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOwotICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOwotICB9Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUpTT2JqZWN0KiBNb3pqc1dpbmRvdzo6Q3JlYXRlUHJveHkoCi0gICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgewotICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7Ci0gIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKLSAgICAgIGNvbnRleHQsIEpTX05ld0dsb2JhbE9iamVjdChjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7Ci0gIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKLQotICAvLyBJbml0aWFsaXplIHN0YW5kYXJkIEpTIGNvbnN0cnVjdG9ycyBwcm90b3R5cGVzIGFuZCB0b3AtbGV2ZWwgZnVuY3Rpb25zIHN1Y2gKLSAgLy8gYXMgT2JqZWN0LCBpc05hbiwgZXRjLgotICBKU0F1dG9Db21wYXJ0bWVudCBhdXRvX2NvbXBhcnRtZW50KGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICBib29sIHN1Y2Nlc3MgPSBKU19Jbml0U3RhbmRhcmRDbGFzc2VzKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAotICAgICAgY29udGV4dCwgTW96anNXaW5kb3c6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7Ci0gIERDSEVDSyhwcm90b3R5cGUpOwotICBKU19TZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCwgcHJvdG90eXBlKTsKLQotICAvLyBBZGQgb3duIHByb3BlcnRpZXMuCi0gIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIGdsb2JhbF9vYmplY3QsIG93bl9wcm9wZXJ0aWVzKTsKLSAgRENIRUNLKHN1Y2Nlc3MpOwotCi0gIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKLSAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgZ2xvYmFsX29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOwotICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7Ci0KLSAgLy8gU2V0IHRoZSBnbG9iYWwgb2JqZWN0IHByb3h5IHBvaW50ZXIsIHNvIHdlIGNhbiBhY2Nlc3MgdGhlIHN0YW5kYXJkIGNsYXNzZXMKLSAgLy8gc3VjaCBhcyB0aGUgYmFzZSBPYmplY3QgcHJvdG90eXBlIHdoZW4gbG9va2luZyB1cCBvdXIgcHJvdG90eXBlLgotICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQotICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKLSAgZ2xvYmFsX2Vudmlyb25tZW50LT5TZXRHbG9iYWxPYmplY3RQcm94eUFuZFdyYXBwZXIocHJveHksIHdyYXBwYWJsZSk7Ci0gIHJldHVybiBwcm94eTsKLX0KLS8vc3RhdGljCi1jb25zdCBKU0NsYXNzKiBNb3pqc1dpbmRvdzo6UHJvdG90eXBlQ2xhc3MoCi0gICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKLSAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKLSAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAotICAgICAgY29udGV4dCwKLSAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOwotICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7Ci0KLSAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKLSAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7Ci0gIHJldHVybiBwcm90b19jbGFzczsKLX0KLQotLy8gc3RhdGljCi1KU09iamVjdCogTW96anNXaW5kb3c6OkdldFByb3RvdHlwZSgKLSAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgewotICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOwotCi0gIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKLSAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7Ci0gICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcwotICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCi0gICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKLSAgfQotICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOwotfQotCi0vLyBzdGF0aWMKLUpTT2JqZWN0KiBNb3pqc1dpbmRvdzo6R2V0SW50ZXJmYWNlT2JqZWN0KAotICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7Ci0gIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7Ci0KLSAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOwotICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7Ci0gICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKLSAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOwotICB9Ci0gIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7Ci0gIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKLX0KLQotCi1uYW1lc3BhY2UgewotfSAgLy8gbmFtZXNwYWNlCi0KLQotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotCi1uYW1lc3BhY2Ugc2NyaXB0IHsKLQotdGVtcGxhdGU8Pgotdm9pZCBHbG9iYWxFbnZpcm9ubWVudDo6Q3JlYXRlR2xvYmFsT2JqZWN0PFdpbmRvdz4oCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxXaW5kb3c+JiBnbG9iYWxfaW50ZXJmYWNlLAotICAgIEVudmlyb25tZW50U2V0dGluZ3MqIGVudmlyb25tZW50X3NldHRpbmdzKSB7Ci0gIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIG1vempzX2dsb2JhbF9lbnZpcm9ubWVudCA9Ci0gICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4odGhpcyk7Ci0gIEpTQ29udGV4dCogY29udGV4dCA9IG1vempzX2dsb2JhbF9lbnZpcm9ubWVudC0+Y29udGV4dCgpOwotCi0gIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHQpOwotICBNb3pqc1dpbmRvdzo6Q3JlYXRlUHJveHkoCi0gICAgICBjb250ZXh0LCBnbG9iYWxfaW50ZXJmYWNlKTsKLSAgbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LT5TZXRFbnZpcm9ubWVudFNldHRpbmdzKGVudmlyb25tZW50X3NldHRpbmdzKTsKLSAgbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LT5FdmFsdWF0ZUF1dG9tYXRpY3MoKTsKLQotICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0KLSAgICAgIG1vempzX2dsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQXJiaXRyYXJ5SW50ZXJmYWNlOjpBcmJpdHJhcnlJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEJhc2VJbnRlcmZhY2U6OkJhc2VJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQmFzZUludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Jhc2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0jaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIENvbmRpdGlvbmFsSW50ZXJmYWNlOjpDb25kaXRpb25hbEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgQ29uc3RhbnRzSW50ZXJmYWNlOjpDb25zdGFudHNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIENvbnN0cnVjdG9ySW50ZXJmYWNlOjpDb25zdHJ1Y3RvckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpET01TdHJpbmdUZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgRGVyaXZlZEludGVyZmFjZTo6RGVyaXZlZEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNEZXJpdmVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRGVyaXZlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSNpZiBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCi0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgRGlzYWJsZWRJbnRlcmZhY2U6OkRpc2FibGVkSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0jZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBFbnVtZXJhdGlvbkludGVyZmFjZTo6RW51bWVyYXRpb25JbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkV4Y2VwdGlvbk9iamVjdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgRXhjZXB0aW9uc0ludGVyZmFjZTo6RXhjZXB0aW9uc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OkV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEdldE9wYXF1ZVJvb3RJbnRlcmZhY2U6OkdldE9wYXF1ZVJvb3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpHbG9iYWxJbnRlcmZhY2VQYXJlbnRXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEltcGxlbWVudGVkSW50ZXJmYWNlOjpJbXBsZW1lbnRlZEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNJbXBsZW1lbnRlZEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0ltcGxlbWVudGVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc1dyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE5hbWVkR2V0dGVySW50ZXJmYWNlOjpOYW1lZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpOb0NvbnN0cnVjdG9ySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6Ok51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7Ci0gIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAotICAgICAgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCi0gICAgICBiYXNlOjpCaW5kKE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCi0gICAgICBiYXNlOjpCaW5kKE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpPcGVyYXRpb25zVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFB1dEZvcndhcmRzSW50ZXJmYWNlOjpQdXRGb3J3YXJkc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFNlcXVlbmNlVXNlcjo6U2VxdWVuY2VVc2VyV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1NlcXVlbmNlVXNlcjo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFRhcmdldEludGVyZmFjZTo6VGFyZ2V0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1RhcmdldEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1RhcmdldEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKLSAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCi0gICAgICBVbmlvblR5cGVzSW50ZXJmYWNlOjpVbmlvblR5cGVzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKLSAgICAgIGJhc2U6OkJpbmQoTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOwotICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKLSAgICAgIFdpbmRvdzo6V2luZG93V3JhcHBhYmxlVHlwZSgpLAotICAgICAgYmFzZTo6QmluZChEdW1teUZ1bmN0b3IpLAotICAgICAgYmFzZTo6QmluZChNb3pqc1dpbmRvdzo6UHJvdG90eXBlQ2xhc3MpKTsKLQotfQotCi0vLyBNU1ZTIGNvbXBpbGVyIGRvZXMgbm90IG5lZWQgdGhpcyBleHBsaWNpdCBpbnN0YW50aWF0aW9uLCBhbmQgZ2VuZXJhdGVzIGEKLS8vIGNvbXBpbGVyIGVycm9yLgotI2lmICFkZWZpbmVkKF9NU0NfVkVSKQotLy8gRXhwbGljaXRseSBpbnN0YW50aWF0ZSB0aGUgdGVtcGxhdGUgZnVuY3Rpb24gZm9yIHRlbXBsYXRlIHR5cGUgV2luZG93Ci0vLyBUaGlzIGlzIG5lZWRlZCB0byBwcmV2ZW50IGxpbmsgZXJyb3JzIHdoZW4gdHJ5aW5nIHRvIHJlc29sdmUgdGhlIHRlbXBsYXRlCi0vLyBpbnN0YW50aWF0aW9uLgotdGVtcGxhdGUKLXZvaWQgR2xvYmFsRW52aXJvbm1lbnQ6OkNyZWF0ZUdsb2JhbE9iamVjdDxXaW5kb3c+KAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V2luZG93PiYgZ2xvYmFsX2ludGVyZmFjZSwKLSAgICBFbnZpcm9ubWVudFNldHRpbmdzKiBlbnZpcm9ubWVudF9zZXR0aW5ncyk7Ci0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1dpbmRvdy5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9Nb3pqc1dpbmRvdy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5M2MxZTg2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvTW96anNXaW5kb3cuaAorKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKLQotLy8gY2xhbmctZm9ybWF0IG9mZgotCi0jaWZuZGVmIE1vempzV2luZG93X2gKLSNkZWZpbmUgTW96anNXaW5kb3dfaAotCi0jaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgotI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgotI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCi0jaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCi0jaW5jbHVkZSAiTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy93aW5kb3cuaCIKLQotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBiaW5kaW5ncyB7Ci1uYW1lc3BhY2UgdGVzdGluZyB7Ci0KLWNsYXNzIE1vempzV2luZG93IHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7Ci0gIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOwotICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Ci0gIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwotfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBNb3pqc1dpbmRvd19oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzk5OTRlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDUwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW5kZXggPCBpbXBsLT5sZW5ndGgoKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgeworICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7CisgIH0KK30KKworSlNCb29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+QW5vbnltb3VzSW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkFub255bW91c0luZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2NsYXNzIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCisgIEdldEluZGV4ZWRQcm9wZXJ0eSwKKyAgU2V0SW5kZXhlZFByb3BlcnR5LAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK0pTQm9vbCBnZXRfbGVuZ3RoKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bGVuZ3RoKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAgICJsZW5ndGgiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUgfCBKU1BST1BfUkVBRE9OTFksCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9sZW5ndGgpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAwZjQyOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCisjZGVmaW5lIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYjgyNGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQ1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHJldHVybiBpbXBsLT5DYW5RdWVyeU5hbWVkUHJvcGVydHkocHJvcGVydHlfbmFtZSk7Cit9CisKK3ZvaWQgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOworICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOworfQorCitKU0Jvb2wgR2V0TmFtZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNOYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5Bbm9ueW1vdXNOYW1lZFNldHRlcihwcm9wZXJ0eV9uYW1lLCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitjbGFzcyBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eSwKKyAgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMsCisgIEdldE5hbWVkUHJvcGVydHksCisgIFNldE5hbWVkUHJvcGVydHksCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDg0ZDQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNjRjNTNiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTkzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgcmV0dXJuIGltcGwtPkNhblF1ZXJ5TmFtZWRQcm9wZXJ0eShwcm9wZXJ0eV9uYW1lKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKKyAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKK30KKworSlNCb29sIEdldE5hbWVkUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5Bbm9ueW1vdXNOYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkFub255bW91c05hbWVkU2V0dGVyKHByb3BlcnR5X25hbWUsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBpbmRleCkgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOworfQorCit2b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgeworICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7CisgIH0KK30KKworSlNCb29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHVpbnQzMl90IGluZGV4OworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkFub255bW91c0luZGV4ZWRHZXR0ZXIoaW5kZXgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBTZXRJbmRleGVkUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICB1aW50MzJfdCBpbmRleDsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKKyAgaWYoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+QW5vbnltb3VzSW5kZXhlZFNldHRlcihpbmRleCwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworY2xhc3MgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzLAorICBHZXROYW1lZFByb3BlcnR5LAorICBTZXROYW1lZFByb3BlcnR5LAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5LAorICBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzLAorICBHZXRJbmRleGVkUHJvcGVydHksCisgIFNldEluZGV4ZWRQcm9wZXJ0eSwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9sZW5ndGgoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmxlbmd0aCgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAibGVuZ3RoIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbGVuZ3RoKSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Fub255bW91c19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNjE1YzQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNBbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc1YmJkYjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw1MzAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0FyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0FyYml0cmFyeUludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQXJiaXRyYXJ5SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNBcmJpdHJhcnlJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0FyYml0cmFyeUludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJBcmJpdHJhcnlJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJBcmJpdHJhcnlJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJBcmJpdHJhcnlJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29uc3RydWN0ID0gQ29uc3RydWN0b3I7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9hcmJpdHJhcnlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQXJiaXRyYXJ5SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFyYml0cmFyeUludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+YXJiaXRyYXJ5X3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9hcmJpdHJhcnlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0FyYml0cmFyeUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQXJiaXRyYXJ5SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEFyYml0cmFyeUludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfYXJiaXRyYXJ5X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fYXJiaXRyYXJ5RnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBBcmJpdHJhcnlJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QXJiaXRyYXJ5SW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkFyYml0cmFyeUZ1bmN0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJhcmJpdHJhcnlQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2FyYml0cmFyeVByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2FyYml0cmFyeVByb3BlcnR5KSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJhcmJpdHJhcnlGdW5jdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9hcmJpdHJhcnlGdW5jdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJBcmJpdHJhcnlJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KKyAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKKyAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisKKyAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IEFyYml0cmFyeUludGVyZmFjZSgpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7CisgIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7CisgIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7CisgIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7CisgIHJldHVybiB0cnVlOworfQorfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODhlODdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNBcmJpdHJhcnlJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0FyYml0cmFyeUludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0FyYml0cmFyeUludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNBcmJpdHJhcnlJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYmFzZV9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTBlMThlOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYmFzZV9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0ODkgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QmFzZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQmFzZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0Jhc2VJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0Jhc2VJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNCYXNlSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNCYXNlSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNCYXNlSW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCk7CitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQmFzZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJCYXNlSW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQmFzZUludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkJhc2VJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29uc3RydWN0ID0gQ29uc3RydWN0b3I7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9iYXNlQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQmFzZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QmFzZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEJhc2VJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QmFzZUludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+YmFzZV9hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2Jhc2VPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQmFzZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QmFzZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEJhc2VJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8QmFzZUludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5CYXNlT3BlcmF0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICAgImJhc2VBdHRyaWJ1dGUiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUgfCBKU1BST1BfUkVBRE9OTFksCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9iYXNlQXR0cmlidXRlKSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAiYmFzZU9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9iYXNlT3BlcmF0aW9uKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkJhc2VJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KKyAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKKyAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQmFzZUludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQmFzZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNCYXNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNCYXNlSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7CitKU0Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworCisgIHNjb3BlZF9yZWZwdHI8QmFzZUludGVyZmFjZT4gbmV3X29iamVjdCA9CisgICAgICBuZXcgQmFzZUludGVyZmFjZSgpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7CisgIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7CisgIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7CisgIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7CisgIHJldHVybiB0cnVlOworfQorfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczNTY1OGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNCYXNlSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNCYXNlSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0Jhc2VJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzQmFzZUludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jvb2xlYW5fdHlwZV90ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmMGQ3NmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jvb2xlYW5fdHlwZV90ZXN0X2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDU4MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9ib29sZWFuUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmJvb2xlYW5fcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X2Jvb2xlYW5Qcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9ib29sZWFuX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fYm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEJvb2xlYW5UeXBlVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5Cb29sZWFuQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2Jvb2xlYW5SZXR1cm5PcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Qm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5Cb29sZWFuUmV0dXJuT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAiYm9vbGVhblByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfYm9vbGVhblByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2Jvb2xlYW5Qcm9wZXJ0eSksCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAiYm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2Jvb2xlYW5Bcmd1bWVudE9wZXJhdGlvbiksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJib29sZWFuUmV0dXJuT3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2Jvb2xlYW5SZXR1cm5PcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMThlMzA3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwNWEwMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDkwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9jYWxsYmFja0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmNhbGxiYWNrX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfY2FsbGJhY2tBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlZvaWRGdW5jdGlvbiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfY2FsbGJhY2tfYXR0cmlidXRlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX2NhbGxiYWNrX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfbnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfbnVsbGFibGVfY2FsbGJhY2tfYXR0cmlidXRlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fdGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBjYjsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmNiKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5UYWtlc0Z1bmN0aW9uVGhhdFJldHVybnNTdHJpbmcoY2IpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl90YWtlc0Z1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkZ1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycyA+OjpDb252ZXJzaW9uVHlwZSBjYjsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmNiKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5UYWtlc0Z1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycyhjYik7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3Rha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyID46OkNvbnZlcnNpb25UeXBlIGNiOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyKGNiKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fdGFrZXNGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkZ1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzID46OkNvbnZlcnNpb25UeXBlIGNiOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmY2IpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlRha2VzRnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMoY2IpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl90YWtlc1ZvaWRGdW5jdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlZvaWRGdW5jdGlvbiA+OjpDb252ZXJzaW9uVHlwZSBjYjsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmNiKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5UYWtlc1ZvaWRGdW5jdGlvbihjYik7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJjYWxsYmFja0F0dHJpYnV0ZSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2NhbGxiYWNrQXR0cmlidXRlKSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2NhbGxiYWNrQXR0cmlidXRlKSwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgIm51bGxhYmxlQ2FsbGJhY2tBdHRyaWJ1dGUiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9udWxsYWJsZUNhbGxiYWNrQXR0cmlidXRlKSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlQ2FsbGJhY2tBdHRyaWJ1dGUpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgeworICAgICAgInRha2VzRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl90YWtlc0Z1bmN0aW9uVGhhdFJldHVybnNTdHJpbmcpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidGFrZXNGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdGFrZXNGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidGFrZXNGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycyIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl90YWtlc0Z1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgInRha2VzVm9pZEZ1bmN0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Rha2VzVm9pZEZ1bmN0aW9uKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19mdW5jdGlvbl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGEzNDc0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY0ZDE0NjIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw1ODEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkNhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9jYWxsYmFja0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5jYWxsYmFja19hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X2NhbGxiYWNrQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM8U2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9jYWxsYmFja19hdHRyaWJ1dGUodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9yZWdpc3RlckNhbGxiYWNrKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzPFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZSA+ID46OkNvbnZlcnNpb25UeXBlIGNhbGxiYWNrX2ludGVyZmFjZTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmNhbGxiYWNrX2ludGVyZmFjZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+UmVnaXN0ZXJDYWxsYmFjayhjYWxsYmFja19pbnRlcmZhY2UpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9zb21lT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPlNvbWVPcGVyYXRpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgImNhbGxiYWNrQXR0cmlidXRlIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfY2FsbGJhY2tBdHRyaWJ1dGUpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfY2FsbGJhY2tBdHRyaWJ1dGUpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgeworICAgICAgInJlZ2lzdGVyQ2FsbGJhY2siLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fcmVnaXN0ZXJDYWxsYmFjayksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJzb21lT3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3NvbWVPcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhOGI0NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25kaXRpb25hbF9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NzljZWFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25kaXRpb25hbF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw2NjYgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbmRpdGlvbmFsSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25kaXRpb25hbEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNDb25kaXRpb25hbEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNDb25kaXRpb25hbEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJDb25kaXRpb25hbEludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkNvbmRpdGlvbmFsSW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiQ29uZGl0aW9uYWxJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCitKU0Jvb2wgZ2V0X2VuYWJsZWRBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDb25kaXRpb25hbEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25kaXRpb25hbEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+ZW5hYmxlZF9hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X2VuYWJsZWRBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDb25kaXRpb25hbEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxDb25kaXRpb25hbEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9lbmFibGVkX2F0dHJpYnV0ZSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisjZW5kaWYgIC8vIEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQorI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQorSlNCb29sIGdldF9kaXNhYmxlZEF0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5kaXNhYmxlZF9hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X2Rpc2FibGVkQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ29uZGl0aW9uYWxJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uZGl0aW9uYWxJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfZGlzYWJsZWRfYXR0cmlidXRlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKyNlbmRpZiAgLy8gTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCitKU0Jvb2wgZmNuX2Rpc2FibGVkT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkRpc2FibGVkT3BlcmF0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisjZW5kaWYgIC8vIE5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQorI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQorSlNCb29sIGZjbl9lbmFibGVkT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25kaXRpb25hbEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIENvbmRpdGlvbmFsSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbmRpdGlvbmFsSW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkVuYWJsZWRPcGVyYXRpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKyNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJlbmFibGVkQXR0cmlidXRlIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZW5hYmxlZEF0dHJpYnV0ZSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9lbmFibGVkQXR0cmlidXRlKSwKKyAgfSwKKyNlbmRpZiAgLy8gRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkpCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJkaXNhYmxlZEF0dHJpYnV0ZSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2Rpc2FibGVkQXR0cmlidXRlKSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2Rpc2FibGVkQXR0cmlidXRlKSwKKyAgfSwKKyNlbmRpZiAgLy8gTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZKQorICB7CisgICAgICAiZGlzYWJsZWRPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZGlzYWJsZWRPcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorI2VuZGlmICAvLyBOT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFkKKyNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWSkKKyAgeworICAgICAgImVuYWJsZWRPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZW5hYmxlZE9wZXJhdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisjZW5kaWYgIC8vIEVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWQorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQ29uZGl0aW9uYWxJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDb25kaXRpb25hbEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKyNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25kaXRpb25hbF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQxMzI5MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNDb25kaXRpb25hbEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2VfaAorCisjaWYgZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCisKKyNlbmRpZiAgLy8gTW96anNDb25kaXRpb25hbEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0YW50c19pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0YW50c19pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTNkNWU4YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RhbnRzX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RhbnRzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNvbnN0YW50c0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RhbnRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNDb25zdGFudHNJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNDb25zdGFudHNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NvbnN0YW50c0ludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzQ29uc3RhbnRzSW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgZ2V0X0lOVEVHRVJfQ09OU1RBTlQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgQ09NUElMRV9BU1NFUlQoQ29uc3RhbnRzSW50ZXJmYWNlOjprSW50ZWdlckNvbnN0YW50ID09IDUsCisgICAgICAgICAgICAgICAgIFZhbHVlRm9yQ29uc3RhbnRzSW50ZXJmYWNlX2tJbnRlZ2VyQ29uc3RhbnREb2VzTm90TWF0Y2hJREwpOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIDUsICZyZXN1bHRfdmFsdWUpOworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfRE9VQkxFX0NPTlNUQU5UKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIERDSEVDS19FUSgyLjcxOCwgQ29uc3RhbnRzSW50ZXJmYWNlOjprRG91YmxlQ29uc3RhbnQpIDw8CisgICAgICAiVGhlIHZhbHVlIGZvciBDb25zdGFudHNJbnRlcmZhY2U6OmtEb3VibGVDb25zdGFudCBkb2VzIG5vdCBtYXRjaCAiCisgICAgICAidGhlIHZhbHVlIGluIHRoZSBpbnRlcmZhY2UgZGVmaW5pdGlvbi4iOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIDIuNzE4LCAmcmVzdWx0X3ZhbHVlKTsKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkNvbnN0YW50c0ludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkNvbnN0YW50c0ludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkNvbnN0YW50c0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeworICAgICAgIklOVEVHRVJfQ09OU1RBTlQiLCAwLAorICAgICAgSlNQUk9QX1BFUk1BTkVOVCB8IEpTUFJPUF9SRUFET05MWSB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9JTlRFR0VSX0NPTlNUQU5UKSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIHsKKyAgICAgICJET1VCTEVfQ09OU1RBTlQiLCAwLAorICAgICAgSlNQUk9QX1BFUk1BTkVOVCB8IEpTUFJPUF9SRUFET05MWSB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9ET1VCTEVfQ09OU1RBTlQpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIHsKKyAgICAgICJJTlRFR0VSX0NPTlNUQU5UIiwgMCwKKyAgICAgIEpTUFJPUF9QRVJNQU5FTlQgfCBKU1BST1BfUkVBRE9OTFkgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfSU5URUdFUl9DT05TVEFOVCksCisgICAgICBKU09QX05VTExXUkFQUEVSLAorICB9LAorICB7CisgICAgICAiRE9VQkxFX0NPTlNUQU5UIiwgMCwKKyAgICAgIEpTUFJPUF9QRVJNQU5FTlQgfCBKU1BST1BfUkVBRE9OTFkgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfRE9VQkxFX0NPTlNUQU5UKSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJDb25zdGFudHNJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbnN0YW50c0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbnN0YW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0YW50c19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RhbnRzX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiYzg2YmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0YW50c19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0NvbnN0YW50c0ludGVyZmFjZV9oCisjZGVmaW5lIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQ29uc3RhbnRzSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0NvbnN0YW50c0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzODU5OTEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQ1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkNvbnN0cnVjdG9ySW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiQ29uc3RydWN0b3JJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQ29uc3RydWN0b3JJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KKyAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKKyAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNDb25zdHJ1Y3RvckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworSlNCb29sIENvbnN0cnVjdG9yMSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisKKyAgc2NvcGVkX3JlZnB0cjxDb25zdHJ1Y3RvckludGVyZmFjZT4gbmV3X29iamVjdCA9CisgICAgICBuZXcgQ29uc3RydWN0b3JJbnRlcmZhY2UoKTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOworICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOworICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOworICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOworICByZXR1cm4gdHJ1ZTsKK30KKworSlNCb29sIENvbnN0cnVjdG9yMigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNjb3BlZF9yZWZwdHI8Q29uc3RydWN0b3JJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IENvbnN0cnVjdG9ySW50ZXJmYWNlKGFyZyk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByZXN1bHRfb2JqZWN0KGNvbnRleHQsIEpTVkFMX1RPX09CSkVDVChyZXN1bHRfdmFsdWUpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KCpyZXN1bHRfb2JqZWN0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgc3dpdGNoKGFyZ2MpIHsKKyAgICBjYXNlKDApOiB7CisgICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6CisgICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBDb25zdHJ1Y3RvcjEoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSgxKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gQ29uc3RydWN0b3IyKAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8vIEludmFsaWQgbnVtYmVyIG9mIGFyZ3MKKyAgLy8gaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgLy8gNC4gSWYgUyBpcyBlbXB0eSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci4KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNmNGExMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNDb25zdHJ1Y3RvckludGVyZmFjZV9oCisjZGVmaW5lIE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTZkYzBiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNTc1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29uc3RydWN0ID0gQ29uc3RydWN0b3I7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9sb25nQXJnKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5sb25nX2FyZygpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfYm9vbGVhbkFyZygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+Ym9vbGVhbl9hcmcoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZ2V0X3N0cmluZ0FyZygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPENvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+c3RyaW5nX2FyZygpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAibG9uZ0FyZyIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2xvbmdBcmcpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAiYm9vbGVhbkFyZyIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2Jvb2xlYW5BcmcpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAic3RyaW5nQXJnIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfc3RyaW5nQXJnKSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigyKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7CitKU0Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIGFyZzI7CisgIC8vIE9wdGlvbmFsIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzCisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgZGVmYXVsdF9hcmcgPQorICAgICAgImRlZmF1bHQiOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc2l6ZV90IG51bV9zZXRfYXJndW1lbnRzID0gMzsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAyKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMCgKKyAgICAgICAgY29udGV4dCwgYXJnc1syXSk7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgJmRlZmF1bHRfYXJnKTsKKyAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHNjb3BlZF9yZWZwdHI8Q29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlPiBuZXdfb2JqZWN0ID0KKyAgICAgIG5ldyBDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UoYXJnMSwgYXJnMiwgZGVmYXVsdF9hcmcpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7CisgIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7CisgIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7CisgIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7CisgIHJldHVybiB0cnVlOworfQorfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDU4ZDZjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0NvbnN0cnVjdG9yV2l0aEFyZ3VtZW50c0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDEzZmQzYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDkwMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitib29sIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHJldHVybiBpbXBsLT5DYW5RdWVyeU5hbWVkUHJvcGVydHkocHJvcGVydHlfbmFtZSk7Cit9CisKK3ZvaWQgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgTW96anNQcm9wZXJ0eUVudW1lcmF0b3IgZW51bWVyYXRvcihjb250ZXh0LCBwcm9wZXJ0aWVzKTsKKyAgaW1wbC0+RW51bWVyYXRlTmFtZWRQcm9wZXJ0aWVzKCZlbnVtZXJhdG9yKTsKK30KKworSlNCb29sIEdldE5hbWVkUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkFub255bW91c05hbWVkR2V0dGVyKHByb3BlcnR5X25hbWUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBTZXROYW1lZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5Bbm9ueW1vdXNOYW1lZFNldHRlcihwcm9wZXJ0eV9uYW1lLCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIElzU3VwcG9ydGVkSW5kZXhQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHJldHVybiBpbmRleCA8IGltcGwtPmxlbmd0aCgpOworfQorCit2b2lkIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yKiBwcm9wZXJ0aWVzKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCB1aW50MzJfdCBrTnVtSW5kZXhlZFByb3BlcnRpZXMgPSBpbXBsLT5sZW5ndGgoKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtOdW1JbmRleGVkUHJvcGVydGllczsgKytpKSB7CisgICAgcHJvcGVydGllcy0+YXBwZW5kKElOVF9UT19KU0lEKGkpKTsKKyAgfQorfQorCitKU0Jvb2wgR2V0SW5kZXhlZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICB1aW50MzJfdCBpbmRleDsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5EZXJpdmVkSW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkRlcml2ZWRJbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitjbGFzcyBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eSwKKyAgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMsCisgIEdldE5hbWVkUHJvcGVydHksCisgIFNldE5hbWVkUHJvcGVydHksCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgSXNTdXBwb3J0ZWRJbmRleFByb3BlcnR5LAorICBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzLAorICBHZXRJbmRleGVkUHJvcGVydHksCisgIFNldEluZGV4ZWRQcm9wZXJ0eSwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkRlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZ2V0X2xlbmd0aCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmxlbmd0aCgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfcHJvcGVydHlPbkRlcml2ZWRDbGFzcygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnByb3BlcnR5X29uX2Rlcml2ZWRfY2xhc3MoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3Byb3BlcnR5T25EZXJpdmVkQ2xhc3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Byb3BlcnR5X29uX2Rlcml2ZWRfY2xhc3ModmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9kZXJpdmVkSW5kZXhlZEdldHRlcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5EZXJpdmVkSW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9kZXJpdmVkSW5kZXhlZFNldHRlcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCisgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkRlcml2ZWRJbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX29wZXJhdGlvbk9uRGVyaXZlZENsYXNzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+T3BlcmF0aW9uT25EZXJpdmVkQ2xhc3MoKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAibGVuZ3RoIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbGVuZ3RoKSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJwcm9wZXJ0eU9uRGVyaXZlZENsYXNzIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcHJvcGVydHlPbkRlcml2ZWRDbGFzcyksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9wcm9wZXJ0eU9uRGVyaXZlZENsYXNzKSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJkZXJpdmVkSW5kZXhlZEdldHRlciIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9kZXJpdmVkSW5kZXhlZEdldHRlciksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJkZXJpdmVkSW5kZXhlZFNldHRlciIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9kZXJpdmVkSW5kZXhlZFNldHRlciksCisgICAgICAyLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJvcGVyYXRpb25PbkRlcml2ZWRDbGFzcyIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9vcGVyYXRpb25PbkRlcml2ZWRDbGFzcyksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkMjVjN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzFjZWRjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0OTMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rlcml2ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRGVyaXZlZEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0Rlcml2ZWRJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNEZXJpdmVkSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkRlcml2ZWRJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJEZXJpdmVkSW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiRGVyaXZlZEludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZ2V0X2Rlcml2ZWRBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5kZXJpdmVkX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fZGVyaXZlZE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEZXJpdmVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEZXJpdmVkSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRGVyaXZlZEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEZXJpdmVkSW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkRlcml2ZWRPcGVyYXRpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAiZGVyaXZlZEF0dHJpYnV0ZSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2Rlcml2ZWRBdHRyaWJ1dGUpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJkZXJpdmVkT3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2Rlcml2ZWRPcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNCYXNlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJEZXJpdmVkSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGVyaXZlZEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGVyaXZlZEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPERlcml2ZWRJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IERlcml2ZWRJbnRlcmZhY2UoKTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOworICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOworICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOworICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmQyY2E0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzRGVyaXZlZEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzRGVyaXZlZEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0Rlcml2ZWRJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzRGVyaXZlZEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RpY3Rpb25hcnlfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZTIzYTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQzNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGljdGlvbmFyeV9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190ZXN0X2RpY3Rpb25hcnkuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpEaWN0aW9uYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VGVzdERpY3Rpb25hcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzRGljdGlvbmFyeUludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzRGljdGlvbmFyeUludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRGljdGlvbmFyeUludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiRGljdGlvbmFyeUludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkRpY3Rpb25hcnlJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJEaWN0aW9uYXJ5SW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGZjbl9kaWN0aW9uYXJ5T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERpY3Rpb25hcnlJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEaWN0aW9uYXJ5SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERpY3Rpb25hcnlJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8VGVzdERpY3Rpb25hcnkgPjo6Q29udmVyc2lvblR5cGUgZGljdGlvbmFyeTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmRpY3Rpb25hcnkpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkRpY3Rpb25hcnlPcGVyYXRpb24oZGljdGlvbmFyeSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAiZGljdGlvbmFyeU9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9kaWN0aW9uYXJ5T3BlcmF0aW9uKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkRpY3Rpb25hcnlJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGljdGlvbmFyeUludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGljdGlvbmFyeUludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmZGQ1NGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RpY3Rpb25hcnlfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RpY3Rpb25hcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzRGljdGlvbmFyeUludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlZDVmZDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDUwOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGlzYWJsZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzRGlzYWJsZWRJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0Rpc2FibGVkSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNEaXNhYmxlZEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkRpc2FibGVkSW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiRGlzYWJsZWRJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJEaXNhYmxlZEludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK0pTQm9vbCBnZXRfZGlzYWJsZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEaXNhYmxlZEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERpc2FibGVkSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERpc2FibGVkSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5kaXNhYmxlZF9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfZGlzYWJsZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxEaXNhYmxlZEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERpc2FibGVkSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERpc2FibGVkSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2Rpc2FibGVkX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fZGlzYWJsZWRGdW5jdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNEaXNhYmxlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RGlzYWJsZWRJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBEaXNhYmxlZEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxEaXNhYmxlZEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5EaXNhYmxlZEZ1bmN0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJkaXNhYmxlZFByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZGlzYWJsZWRQcm9wZXJ0eSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9kaXNhYmxlZFByb3BlcnR5KSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJkaXNhYmxlZEZ1bmN0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2Rpc2FibGVkRnVuY3Rpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiRGlzYWJsZWRJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNEaXNhYmxlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNEaXNhYmxlZEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRGlzYWJsZWRJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKyNlbmRpZiAgLy8gZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaXNhYmxlZF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzA1NzRhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGlzYWJsZWRfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNEaXNhYmxlZEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzRGlzYWJsZWRJbnRlcmZhY2VfaAorCisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGlzYWJsZWRfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0Rpc2FibGVkSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCisKKyNlbmRpZiAgLy8gTW96anNEaXNhYmxlZEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmE2MGYxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDgwOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiRE9NU3RyaW5nVGVzdEludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJET01TdHJpbmdUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9wcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnByb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9wcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfcmVhZE9ubHlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnJlYWRfb25seV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfcmVhZE9ubHlUb2tlblByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+cmVhZF9vbmx5X3Rva2VuX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF9udWxsSXNFbXB0eVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bnVsbF9pc19lbXB0eV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfbnVsbElzRW1wdHlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZyksICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X251bGxfaXNfZW1wdHlfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF91bmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT51bmRlZmluZWRfaXNfZW1wdHlfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3VuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBET01TdHJpbmdUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfdW5kZWZpbmVkX2lzX2VtcHR5X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfbnVsbGFibGVVbmRlZmluZWRJc0VtcHR5UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRE9NU3RyaW5nVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxET01TdHJpbmdUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV91bmRlZmluZWRfaXNfZW1wdHlfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RE9NU3RyaW5nVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZyA+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlIHwga0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfbnVsbGFibGVfdW5kZWZpbmVkX2lzX2VtcHR5X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgInByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcHJvcGVydHkpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfcHJvcGVydHkpLAorICB9LAorICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAgICJyZWFkT25seVByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcmVhZE9ubHlQcm9wZXJ0eSksCisgICAgICBKU09QX05VTExXUkFQUEVSLAorICB9LAorICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAgICJyZWFkT25seVRva2VuUHJvcGVydHkiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUgfCBKU1BST1BfUkVBRE9OTFksCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9yZWFkT25seVRva2VuUHJvcGVydHkpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgIm51bGxJc0VtcHR5UHJvcGVydHkiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9udWxsSXNFbXB0eVByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxJc0VtcHR5UHJvcGVydHkpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAidW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfdW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3VuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJudWxsYWJsZVVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5KSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJET01TdHJpbmdUZXN0SW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODE0NTU3MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2VudW1lcmF0aW9uX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZW51bWVyYXRpb25faW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDQ0MGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2VudW1lcmF0aW9uX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDU0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZW51bWVyYXRpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RW51bWVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKKy8vIERlY2xhcmUgYW5kIGRlZmluZSB0aGVzZSBpbiB0aGUgc2FtZSBuYW1lc3BhY2UgdGhhdCB0aGUgb3RoZXIgb3ZlcmxvYWRzCisvLyB3ZXJlIGJyb3VnaHQgaW50byB3aXRoIHRoZSB1c2luZyBkZWNsYXJhdGlvbi4KK3ZvaWQgVG9KU1ZhbHVlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBFbnVtZXJhdGlvbkludGVyZmFjZTo6VGVzdEVudW0gaW5fZW51bSwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSk7Cit2b2lkIEZyb21KU1ZhbHVlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIHZhbHVlLAorICAgICAgICAgICAgICAgICBpbnQgY29udmVyc2lvbl9mbGFncywgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgRW51bWVyYXRpb25JbnRlcmZhY2U6OlRlc3RFbnVtKiBvdXRfZW51bSk7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNFbnVtZXJhdGlvbkludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJFbnVtZXJhdGlvbkludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkVudW1lcmF0aW9uSW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiRW51bWVyYXRpb25JbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29uc3RydWN0ID0gQ29uc3RydWN0b3I7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9lbnVtUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RW51bWVyYXRpb25JbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBFbnVtZXJhdGlvbkludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFbnVtZXJhdGlvbkludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+ZW51bV9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfZW51bVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEVudW1lcmF0aW9uSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRW51bWVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RW51bWVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8RW51bWVyYXRpb25JbnRlcmZhY2U6OlRlc3RFbnVtID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9lbnVtX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgImVudW1Qcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2VudW1Qcm9wZXJ0eSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9lbnVtUHJvcGVydHkpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkVudW1lcmF0aW9uSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFbnVtZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisKKyAgc2NvcGVkX3JlZnB0cjxFbnVtZXJhdGlvbkludGVyZmFjZT4gbmV3X29iamVjdCA9CisgICAgICBuZXcgRW51bWVyYXRpb25JbnRlcmZhY2UoKTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOworICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOworICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOworICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworbmFtZXNwYWNlIHsKKworaW5saW5lIHZvaWQgVG9KU1ZhbHVlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBFbnVtZXJhdGlvbkludGVyZmFjZTo6VGVzdEVudW0gaW5fZW51bSwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgeworCisgIHN3aXRjaCAoaW5fZW51bSkgeworICAgIGNhc2UgRW51bWVyYXRpb25JbnRlcmZhY2U6OmtBbHBoYToKKyAgICAgIFRvSlNWYWx1ZShjb250ZXh0LCBzdGQ6OnN0cmluZygiYWxwaGEiKSwgb3V0X3ZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIEVudW1lcmF0aW9uSW50ZXJmYWNlOjprQmV0YToKKyAgICAgIFRvSlNWYWx1ZShjb250ZXh0LCBzdGQ6OnN0cmluZygiYmV0YSIpLCBvdXRfdmFsdWUpOworICAgICAgcmV0dXJuOworICAgIGNhc2UgRW51bWVyYXRpb25JbnRlcmZhY2U6OmtHYW1tYToKKyAgICAgIFRvSlNWYWx1ZShjb250ZXh0LCBzdGQ6OnN0cmluZygiZ2FtbWEiKSwgb3V0X3ZhbHVlKTsKKyAgICAgIHJldHVybjsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgb3V0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkVmFsdWUoKSk7CisgIH0KK30KKworCitpbmxpbmUgdm9pZCBGcm9tSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3MsIEV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgIEVudW1lcmF0aW9uSW50ZXJmYWNlOjpUZXN0RW51bSogb3V0X2VudW0pIHsKKyAgRENIRUNLX0VRKDAsIGNvbnZlcnNpb25fZmxhZ3MpIDw8ICJVbmV4cGVjdGVkIGNvbnZlcnNpb24gZmxhZ3MuIjsKKyAgLy8gSlNWYWx1ZSAtPiBJREwgZW51bSBhbGdvcml0aG0gZGVzY3JpYmVkIGhlcmU6CisgIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZXMtZW51bWVyYXRpb24KKyAgLy8gMS4gTGV0IFMgYmUgdGhlIHJlc3VsdCBvZiBjYWxsaW5nIFRvU3RyaW5nKFYpLgorICBKUzo6Um9vdGVkU3RyaW5nIHJvb3RlZF9zdHJpbmcoY29udGV4dCwgSlNfVmFsdWVUb1N0cmluZyhjb250ZXh0LCB2YWx1ZSkpOworCisgIEpTQm9vbCBtYXRjaCA9IEpTX0ZBTFNFOworLy8gMy4gUmV0dXJuIHRoZSBlbnVtZXJhdGlvbiB2YWx1ZSBvZiB0eXBlIEUgdGhhdCBpcyBlcXVhbCB0byBTLgoraWYgKEpTX1N0cmluZ0VxdWFsc0FzY2lpKAorICAgICAgY29udGV4dCwgcm9vdGVkX3N0cmluZywgImFscGhhIiwgJm1hdGNoKQorICAgICAgJiYgbWF0Y2gpIHsKKyAgICAqb3V0X2VudW0gPSBFbnVtZXJhdGlvbkludGVyZmFjZTo6a0FscGhhOworICB9IGVsc2UgaWYgKEpTX1N0cmluZ0VxdWFsc0FzY2lpKAorICAgICAgY29udGV4dCwgcm9vdGVkX3N0cmluZywgImJldGEiLCAmbWF0Y2gpCisgICAgICAmJiBtYXRjaCkgeworICAgICpvdXRfZW51bSA9IEVudW1lcmF0aW9uSW50ZXJmYWNlOjprQmV0YTsKKyAgfSBlbHNlIGlmIChKU19TdHJpbmdFcXVhbHNBc2NpaSgKKyAgICAgIGNvbnRleHQsIHJvb3RlZF9zdHJpbmcsICJnYW1tYSIsICZtYXRjaCkKKyAgICAgICYmIG1hdGNoKSB7CisgICAgKm91dF9lbnVtID0gRW51bWVyYXRpb25JbnRlcmZhY2U6OmtHYW1tYTsKKyAgfSBlbHNlIHsKKyAgICAvLyAyLiBJZiBTIGlzIG5vdCBvbmUgb2YgRSdzIGVudW1lcmF0aW9uIHZhbHVlcywgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci4KKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihjb2JhbHQ6OnNjcmlwdDo6a0NvbnZlcnRUb0VudW1GYWlsZWQpOworICAgIHJldHVybjsKKyAgfQorfQorfSAgLy8gbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2VudW1lcmF0aW9uX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzBmZTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNFbnVtZXJhdGlvbkludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzRW51bWVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNiZjY2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0NjEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2V4bi5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9lcnJvcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+ZXJyb3IoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZ2V0X21lc3NhZ2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPm1lc3NhZ2UoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICAgImVycm9yIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfZXJyb3IpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAibWVzc2FnZSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X21lc3NhZ2UpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICAvLyBHZXQgRXJyb3IgcHJvdG90eXBlLgorICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoY29udGV4dCk7CisgIGJvb2wgc3VjY2Vzc19jaGVjayA9IGpzX0dldENsYXNzUHJvdG90eXBlKAorICAgICAgY29udGV4dCwgR2V0RXhjZXB0aW9uUHJvdG9LZXkoSlNFWE5fRVJSKSwgJnBhcmVudF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzc19jaGVjayk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkV4Y2VwdGlvbk9iamVjdEludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZjM4ZmJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25zX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MGUyZmVmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25zX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDUzNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeGNlcHRpb25zSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNFeGNlcHRpb25zSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNFeGNlcHRpb25zSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkV4Y2VwdGlvbnNJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJFeGNlcHRpb25zSW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiRXhjZXB0aW9uc0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZ2V0X2F0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBFeGNlcHRpb25zSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmF0dHJpYnV0ZV90aHJvd3NfZXhjZXB0aW9uKCZleGNlcHRpb25fc3RhdGUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfYXR0cmlidXRlVGhyb3dzRXhjZXB0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8RXhjZXB0aW9uc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEV4Y2VwdGlvbnNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXhjZXB0aW9uc0ludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxib29sID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9hdHRyaWJ1dGVfdGhyb3dzX2V4Y2VwdGlvbih2YWx1ZSwgJmV4Y2VwdGlvbl9zdGF0ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2Z1bmN0aW9uVGhyb3dzRXhjZXB0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBFeGNlcHRpb25zSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEV4Y2VwdGlvbnNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+RnVuY3Rpb25UaHJvd3NFeGNlcHRpb24oJmV4Y2VwdGlvbl9zdGF0ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJhdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24iLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9hdHRyaWJ1dGVUaHJvd3NFeGNlcHRpb24pLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfYXR0cmlidXRlVGhyb3dzRXhjZXB0aW9uKSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJmdW5jdGlvblRocm93c0V4Y2VwdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9mdW5jdGlvblRocm93c0V4Y2VwdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJFeGNlcHRpb25zSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPEV4Y2VwdGlvbnNJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IEV4Y2VwdGlvbnNJbnRlcmZhY2UoJmV4Y2VwdGlvbl9zdGF0ZSk7CisgIC8vIEluIGNhc2UgdGhhdCBhbiBleGNlcHRpb24gaXMgdGhyb3duIGZyb20gY29uc3RydWN0b3IuCisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByZXN1bHRfb2JqZWN0KGNvbnRleHQsIEpTVkFMX1RPX09CSkVDVChyZXN1bHRfdmFsdWUpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KCpyZXN1bHRfb2JqZWN0KTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDlmOWEyNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXhjZXB0aW9uc19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRXhjZXB0aW9uc0ludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNFeGNlcHRpb25zSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE0OTA1OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZmNuX2NhbGxXaXRoU2V0dGluZ3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8RXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlPigpLmdldCgpOworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBjYWxsd2l0aF9nbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKworICBpbXBsLT5DYWxsV2l0aFNldHRpbmdzKGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudC0+R2V0RW52aXJvbm1lbnRTZXR0aW5ncygpKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJjYWxsV2l0aFNldHRpbmdzIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2NhbGxXaXRoU2V0dGluZ3MpLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmQ2NzZmYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc0V4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5OGE2NmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDU3OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitXcmFwcGFibGUqIEdldE9wYXF1ZVJvb3RGcm9tV3JhcHBhYmxlKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UqPih3cmFwcGFibGUuZ2V0KCkpOworICByZXR1cm4gaW1wbC0+R2V0SGVhZCgpOworfQorCitjbGFzcyBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApOworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29uc3RydWN0ID0gQ29uc3RydWN0b3I7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9wcmV2aW91cygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+cHJldmlvdXMoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3ByZXZpb3VzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3ByZXZpb3VzKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfbmV4dCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bmV4dCgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfbmV4dCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9uZXh0KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgInByZXZpb3VzIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfcHJldmlvdXMpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfcHJldmlvdXMpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAibmV4dCIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X25leHQpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfbmV4dCksCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5sZW5ndGggcHJvcGVydHkuIEl0IGlzIHNldCB0byB0aGUgbGVuZ3RoIG9mIHRoZQorICAvLyBzaG9ydGVzdCBhcmd1bWVudCBsaXN0IG9mIGFsbCBvdmVybG9hZCBjb25zdHJ1Y3RvcnMuCisgIEpTOjpSb290ZWRWYWx1ZSBsZW5ndGhfdmFsdWUoY29udGV4dCk7CisgIGxlbmd0aF92YWx1ZS5zZXRJbnQzMigwKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgImxlbmd0aCIsCisgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGhfdmFsdWUsIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6R2V0T3BhcXVlUm9vdEZ1bmN0aW9uIGdldF9yb290OworICBXcmFwcGVyUHJpdmF0ZTo6R2V0UmVhY2hhYmxlV3JhcHBhYmxlc0Z1bmN0aW9uIGdldF9yZWFjaGFibGVfd3JhcHBhYmxlczsKKyAgZ2V0X3Jvb3QgPSBiYXNlOjpCaW5kKCZHZXRPcGFxdWVSb290RnJvbVdyYXBwYWJsZSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YSgKKyAgICAgIGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUsIGdldF9yb290LCBnZXRfcmVhY2hhYmxlX3dyYXBwYWJsZXMpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT4gbmV3X29iamVjdCA9CisgICAgICBuZXcgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlKCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByZXN1bHRfb2JqZWN0KGNvbnRleHQsIEpTVkFMX1RPX09CSkVDVChyZXN1bHRfdmFsdWUpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KCpyZXN1bHRfb2JqZWN0KTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZGVjNzIyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYmVjYmM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDExIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2V0T3BhcXVlUm9vdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitXcmFwcGFibGUqIEdldE9wYXF1ZVJvb3RGcm9tV3JhcHBhYmxlKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8R2V0T3BhcXVlUm9vdEludGVyZmFjZSo+KHdyYXBwYWJsZS5nZXQoKSk7CisgIHJldHVybiBpbXBsLT5nZXRfb3BhcXVlX3Jvb3RfZnVuY3Rpb25fbmFtZSgpOworfQorCit2b2lkIEdldFJlYWNoYWJsZVdyYXBwYWJsZXMoY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUsCisgICAgV3JhcHBlclByaXZhdGU6OldyYXBwYWJsZVZlY3RvciogcmVhY2hhYmxlKSB7CisgIERDSEVDSyhyZWFjaGFibGUpOworICBHZXRPcGFxdWVSb290SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UqPih3cmFwcGFibGUuZ2V0KCkpOworICBXcmFwcGFibGUqIHJlYWNoYWJsZV8wID0gaW1wbC0+YWRkX29wYXF1ZV9yb290X2Z1bmN0aW9uX25hbWUoKTsKKyAgaWYgKHJlYWNoYWJsZV8wKSB7CisgICAgcmVhY2hhYmxlLT5wdXNoX2JhY2socmVhY2hhYmxlXzApOworICB9Cit9CisKK2NsYXNzIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIkdldE9wYXF1ZVJvb3RJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJHZXRPcGFxdWVSb290SW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiR2V0T3BhcXVlUm9vdEludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiR2V0T3BhcXVlUm9vdEludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgorICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOworICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZhbHVlLCBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpHZXRPcGFxdWVSb290RnVuY3Rpb24gZ2V0X3Jvb3Q7CisgIFdyYXBwZXJQcml2YXRlOjpHZXRSZWFjaGFibGVXcmFwcGFibGVzRnVuY3Rpb24gZ2V0X3JlYWNoYWJsZV93cmFwcGFibGVzOworICBnZXRfcm9vdCA9IGJhc2U6OkJpbmQoJkdldE9wYXF1ZVJvb3RGcm9tV3JhcHBhYmxlKTsKKyAgZ2V0X3JlYWNoYWJsZV93cmFwcGFibGVzID0gYmFzZTo6QmluZCgmR2V0UmVhY2hhYmxlV3JhcHBhYmxlcyk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YSgKKyAgICAgIGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUsIGdldF9yb290LCBnZXRfcmVhY2hhYmxlX3dyYXBwYWJsZXMpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPEdldE9wYXF1ZVJvb3RJbnRlcmZhY2U+IG5ld19vYmplY3QgPQorICAgICAgbmV3IEdldE9wYXF1ZVJvb3RJbnRlcmZhY2UoKTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKyAgVG9KU1ZhbHVlKGNvbnRleHQsIG5ld19vYmplY3QsICZyZXN1bHRfdmFsdWUpOworICBEQ0hFQ0socmVzdWx0X3ZhbHVlLmlzT2JqZWN0KCkpOworICBKUzo6Um9vdGVkT2JqZWN0IHJlc3VsdF9vYmplY3QoY29udGV4dCwgSlNWQUxfVE9fT0JKRUNUKHJlc3VsdF92YWx1ZSkpOworICBhcmdzLnJ2YWwoKS5zZXRPYmplY3QoKnJlc3VsdF9vYmplY3QpOworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2I2MGYzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzR2V0T3BhcXVlUm9vdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nbG9iYWxfaW50ZXJmYWNlX3BhcmVudC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDJjMmQ1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19nbG9iYWxfaW50ZXJmYWNlX3BhcmVudC5jYwpAQCAtMCwwICsxLDQxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHbG9iYWxJbnRlcmZhY2VQYXJlbnQ7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50SGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50SGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudEhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJHbG9iYWxJbnRlcmZhY2VQYXJlbnQiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJHbG9iYWxJbnRlcmZhY2VQYXJlbnRQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJHbG9iYWxJbnRlcmZhY2VQYXJlbnRDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZmNuX3BhcmVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEdsb2JhbEludGVyZmFjZVBhcmVudD4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEdsb2JhbEludGVyZmFjZVBhcmVudCogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxHbG9iYWxJbnRlcmZhY2VQYXJlbnQ+KCkuZ2V0KCk7CisKKyAgaW1wbC0+UGFyZW50T3BlcmF0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAicGFyZW50T3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3BhcmVudE9wZXJhdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJHbG9iYWxJbnRlcmZhY2VQYXJlbnQiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50OjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2MDYzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudF9oCisjZGVmaW5lIE1vempzR2xvYmFsSW50ZXJmYWNlUGFyZW50X2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudCB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnRfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNzcyZGU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw3NTAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW5kZXggPCBpbXBsLT5sZW5ndGgoKTsKK30KKwordm9pZCBFbnVtZXJhdGVTdXBwb3J0ZWRJbmRleGVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3QgdWludDMyX3Qga051bUluZGV4ZWRQcm9wZXJ0aWVzID0gaW1wbC0+bGVuZ3RoKCk7CisgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBrTnVtSW5kZXhlZFByb3BlcnRpZXM7ICsraSkgeworICAgIHByb3BlcnRpZXMtPmFwcGVuZChJTlRfVE9fSlNJRChpKSk7CisgIH0KK30KKworSlNCb29sIEdldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+SW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8SW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2Jvb2wgRGVsZXRlSW5kZXhlZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIHVpbnQzMl90IGluZGV4KSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkluZGV4ZWREZWxldGVyKGluZGV4KTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2NsYXNzIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCisgIEdldEluZGV4ZWRQcm9wZXJ0eSwKKyAgU2V0SW5kZXhlZFByb3BlcnR5LAorICBEZWxldGVJbmRleGVkUHJvcGVydHksCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiSW5kZXhlZEdldHRlckludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIkluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJJbmRleGVkR2V0dGVySW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9sZW5ndGgoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5sZW5ndGgoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2luZGV4ZWREZWxldGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+SW5kZXhlZERlbGV0ZXIoaW5kZXgpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9pbmRleGVkR2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgaW5kZXg7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkluZGV4ZWRHZXR0ZXIoaW5kZXgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25faW5kZXhlZFNldHRlcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGluZGV4OworICBUeXBlVHJhaXRzPHVpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCisgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkluZGV4ZWRTZXR0ZXIoaW5kZXgsIHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAibGVuZ3RoIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbGVuZ3RoKSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAiaW5kZXhlZERlbGV0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25faW5kZXhlZERlbGV0ZXIpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAiaW5kZXhlZEdldHRlciIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9pbmRleGVkR2V0dGVyKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgImluZGV4ZWRTZXR0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25faW5kZXhlZFNldHRlciksCisgICAgICAyLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MzExZmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCisjZGVmaW5lIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzSW5kZXhlZEdldHRlckludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjViM2YxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmNjCkBAIC0wLDAgKzEsNDEwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc1Byb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIkludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZ2V0X3N1cHBvcnRlZEF0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPEludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPEludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnN1cHBvcnRlZF9hdHRyaWJ1dGUoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWRvbmx5IGF0dHJpYnV0ZQorICAgICAgInN1cHBvcnRlZEF0dHJpYnV0ZSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSB8IEpTUFJPUF9SRUFET05MWSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3N1cHBvcnRlZEF0dHJpYnV0ZSksCisgICAgICBKU09QX05VTExXUkFQUEVSLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIkludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjIxNDVhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKKyNkZWZpbmUgTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTE4MjQzYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMzg4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIk5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb25zdHJ1Y3QgPSBDb25zdHJ1Y3RvcjsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiU29tZU5hbWVkQ29uc3RydWN0b3IiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lmxlbmd0aCBwcm9wZXJ0eS4gSXQgaXMgc2V0IHRvIHRoZSBsZW5ndGggb2YgdGhlCisgIC8vIHNob3J0ZXN0IGFyZ3VtZW50IGxpc3Qgb2YgYWxsIG92ZXJsb2FkIGNvbnN0cnVjdG9ycy4KKyAgSlM6OlJvb3RlZFZhbHVlIGxlbmd0aF92YWx1ZShjb250ZXh0KTsKKyAgbGVuZ3RoX3ZhbHVlLnNldEludDMyKDApOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibGVuZ3RoIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aF92YWx1ZSwgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7CitKU0Jvb2wgQ29uc3RydWN0b3IoSlNDb250ZXh0KiBjb250ZXh0LCB1bnNpZ25lZCBpbnQgYXJnYywgSlM6OlZhbHVlKiB2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworCisgIHNjb3BlZF9yZWZwdHI8TmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZT4gbmV3X29iamVjdCA9CisgICAgICBuZXcgTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZSgpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworICBUb0pTVmFsdWUoY29udGV4dCwgbmV3X29iamVjdCwgJnJlc3VsdF92YWx1ZSk7CisgIERDSEVDSyhyZXN1bHRfdmFsdWUuaXNPYmplY3QoKSk7CisgIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QocmVzdWx0X3ZhbHVlKSk7CisgIGFyZ3MucnZhbCgpLnNldE9iamVjdCgqcmVzdWx0X29iamVjdCk7CisgIHJldHVybiB0cnVlOworfQorfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJhNTgwNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2NThiYzgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw3MDQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworYm9vbCBJc1N1cHBvcnRlZE5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm9wZXJ0eV9uYW1lKSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHJldHVybiBpbXBsLT5DYW5RdWVyeU5hbWVkUHJvcGVydHkocHJvcGVydHlfbmFtZSk7Cit9CisKK3ZvaWQgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciogcHJvcGVydGllcykgeworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOworICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOworfQorCitKU0Jvb2wgR2V0TmFtZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5OYW1lZEdldHRlcihwcm9wZXJ0eV9uYW1lKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgU2V0TmFtZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5OYW1lZFNldHRlcihwcm9wZXJ0eV9uYW1lLCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitib29sIERlbGV0ZU5hbWVkUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcHJvcGVydHlfbmFtZSkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPk5hbWVkRGVsZXRlcihwcm9wZXJ0eV9uYW1lKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK2NsYXNzIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgSXNTdXBwb3J0ZWROYW1lZFByb3BlcnR5LAorICBFbnVtZXJhdGVTdXBwb3J0ZWROYW1lcywKKyAgR2V0TmFtZWRQcm9wZXJ0eSwKKyAgU2V0TmFtZWRQcm9wZXJ0eSwKKyAgRGVsZXRlTmFtZWRQcm9wZXJ0eSwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNOYW1lZEdldHRlckludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIk5hbWVkR2V0dGVySW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiTmFtZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOYW1lZEdldHRlckludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK0pTQm9vbCBmY25fbmFtZWREZWxldGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIG5hbWU7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZuYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5OYW1lZERlbGV0ZXIobmFtZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX25hbWVkR2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEdldHRlckludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIG5hbWU7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZuYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+TmFtZWRHZXR0ZXIobmFtZSksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9uYW1lZFNldHRlcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TmFtZWRTZXR0ZXIobmFtZSwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgeworICAgICAgIm5hbWVkRGVsZXRlciIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9uYW1lZERlbGV0ZXIpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibmFtZWRHZXR0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbmFtZWRHZXR0ZXIpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibmFtZWRTZXR0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbmFtZWRTZXR0ZXIpLAorICAgICAgMiwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiTmFtZWRHZXR0ZXJJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTg5ZDVkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOWE3NGU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxMDU5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitib29sIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHByb3BlcnR5X25hbWUpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICByZXR1cm4gaW1wbC0+Q2FuUXVlcnlOYW1lZFByb3BlcnR5KHByb3BlcnR5X25hbWUpOworfQorCit2b2lkIEVudW1lcmF0ZVN1cHBvcnRlZE5hbWVzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBNb3pqc1Byb3BlcnR5RW51bWVyYXRvciBlbnVtZXJhdG9yKGNvbnRleHQsIHByb3BlcnRpZXMpOworICBpbXBsLT5FbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoJmVudW1lcmF0b3IpOworfQorCitKU0Jvb2wgR2V0TmFtZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk5hbWVkR2V0dGVyKHByb3BlcnR5X25hbWUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBTZXROYW1lZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+TmFtZWRTZXR0ZXIocHJvcGVydHlfbmFtZSwgdmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworYm9vbCBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGluZGV4KSB7CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgcmV0dXJuIGluZGV4IDwgaW1wbC0+bGVuZ3RoKCk7Cit9CisKK3ZvaWQgRW51bWVyYXRlU3VwcG9ydGVkSW5kZXhlcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3IqIHByb3BlcnRpZXMpIHsKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCB1aW50MzJfdCBrTnVtSW5kZXhlZFByb3BlcnRpZXMgPSBpbXBsLT5sZW5ndGgoKTsKKyAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGtOdW1JbmRleGVkUHJvcGVydGllczsgKytpKSB7CisgICAgcHJvcGVydGllcy0+YXBwZW5kKElOVF9UT19KU0lEKGkpKTsKKyAgfQorfQorCitKU0Jvb2wgR2V0SW5kZXhlZFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19JZFRvVmFsdWUoY29udGV4dCwgaWQsIGlkX3ZhbHVlLmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgdWludDMyX3QgaW5kZXg7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsICZpbmRleCk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+SW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIFNldEluZGV4ZWRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBKUzo6Um9vdGVkVmFsdWUgaWRfdmFsdWUoY29udGV4dCk7CisgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHVpbnQzMl90IGluZGV4OworICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOworICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKKyAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5JbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitjbGFzcyBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIElzU3VwcG9ydGVkTmFtZWRQcm9wZXJ0eSwKKyAgRW51bWVyYXRlU3VwcG9ydGVkTmFtZXMsCisgIEdldE5hbWVkUHJvcGVydHksCisgIFNldE5hbWVkUHJvcGVydHksCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBJc1N1cHBvcnRlZEluZGV4UHJvcGVydHksCisgIEVudW1lcmF0ZVN1cHBvcnRlZEluZGV4ZXMsCisgIEdldEluZGV4ZWRQcm9wZXJ0eSwKKyAgU2V0SW5kZXhlZFByb3BlcnR5LAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZ2V0X2xlbmd0aCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bGVuZ3RoKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF9wcm9wZXJ0eU9uQmFzZUNsYXNzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5wcm9wZXJ0eV9vbl9iYXNlX2NsYXNzKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9wcm9wZXJ0eU9uQmFzZUNsYXNzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJvb2wgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Byb3BlcnR5X29uX2Jhc2VfY2xhc3ModmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9pbmRleGVkR2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBpbmRleDsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+SW5kZXhlZEdldHRlcihpbmRleCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9pbmRleGVkU2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBpbmRleDsKKyAgVHlwZVRyYWl0czx1aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmluZGV4KTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5JbmRleGVkU2V0dGVyKGluZGV4LCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX25hbWVkR2V0dGVyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBuYW1lOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmbmFtZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk5hbWVkR2V0dGVyKG5hbWUpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fbmFtZWRTZXR0ZXIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDI7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIG5hbWU7CisgIFR5cGVUcmFpdHM8c3RkOjpzdHJpbmcgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZuYW1lKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5OYW1lZFNldHRlcihuYW1lLCB2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX29wZXJhdGlvbk9uQmFzZUNsYXNzKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5PcGVyYXRpb25PbkJhc2VDbGFzcygpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAgICJsZW5ndGgiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUgfCBKU1BST1BfUkVBRE9OTFksCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9sZW5ndGgpLAorICAgICAgSlNPUF9OVUxMV1JBUFBFUiwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgInByb3BlcnR5T25CYXNlQ2xhc3MiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9wcm9wZXJ0eU9uQmFzZUNsYXNzKSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3Byb3BlcnR5T25CYXNlQ2xhc3MpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgeworICAgICAgImluZGV4ZWRHZXR0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25faW5kZXhlZEdldHRlciksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJpbmRleGVkU2V0dGVyIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2luZGV4ZWRTZXR0ZXIpLAorICAgICAgMiwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibmFtZWRHZXR0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbmFtZWRHZXR0ZXIpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibmFtZWRTZXR0ZXIiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbmFtZWRTZXR0ZXIpLAorICAgICAgMiwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAib3BlcmF0aW9uT25CYXNlQ2xhc3MiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fb3BlcmF0aW9uT25CYXNlQ2xhc3MpLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYyNzkzZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZjkxMzdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQ3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpQdXRGb3J3YXJkc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIk5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZ2V0X25lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bmVzdGVkX2ZvcndhcmRpbmdfYXR0cmlidXRlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9uZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHsgLy8gQmVnaW4gc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxQdXRGb3J3YXJkc0ludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCisgICAgc2NvcGVkX3JlZnB0cjxQdXRGb3J3YXJkc0ludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwgPQorICAgICAgIGltcGwtPm5lc3RlZF9mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpOworICAgIGlmICghZm9yd2FyZGVkX2ltcGwpIHsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgIHsgLy8gQmVnaW4gc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9mb3J3YXJkZWRfaW1wbC4KKyAgICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ZvcndhcmRlZF9pbXBsID0KKyAgICAgICBmb3J3YXJkZWRfaW1wbC0+Zm9yd2FyZGluZ19hdHRyaWJ1dGUoKTsKKyAgICBpZiAoIWZvcndhcmRlZF9mb3J3YXJkZWRfaW1wbCkgeworICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBmb3J3YXJkZWRfZm9yd2FyZGVkX2ltcGwtPnNldF9hcmJpdHJhcnlfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKyAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgIH0gLy8gRW5kIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfZm9yd2FyZGVkX2ltcGwuCit9CisgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworICB9IC8vIEVuZCBzY29wZSBvZiBzY29wZWRfcmVmcHRyPFB1dEZvcndhcmRzSW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAibmVzdGVkRm9yd2FyZGluZ0F0dHJpYnV0ZSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X25lc3RlZEZvcndhcmRpbmdBdHRyaWJ1dGUpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfbmVzdGVkRm9yd2FyZGluZ0F0dHJpYnV0ZSksCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWViMjM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmRkNDU5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMzYzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIk5vQ29uc3RydWN0b3JJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOb0NvbnN0cnVjdG9ySW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiTm9Db25zdHJ1Y3RvckludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJOb0NvbnN0cnVjdG9ySW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc05vQ29uc3RydWN0b3JJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NmJiZmMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZV9oCisjZGVmaW5lIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMwZTVmNmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMzA5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19ub19pbnRlcmZhY2Vfb2JqZWN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIk5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2ZjZjQwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19pbnRlcmZhY2Vfb2JqZWN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzk5MGMzYgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSwxMjQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIk51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9ib29sZWFuX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X251bGxhYmxlX2Jvb2xlYW5fcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF9udWxsYWJsZU51bWVyaWNQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5udWxsYWJsZV9udW1lcmljX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9udWxsYWJsZU51bWVyaWNQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGludDMyX3QgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X251bGxhYmxlX251bWVyaWNfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF9udWxsYWJsZVN0cmluZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX3N0cmluZ19wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfbnVsbGFibGVTdHJpbmdQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9udWxsYWJsZV9zdHJpbmdfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF9udWxsYWJsZU9iamVjdFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPm51bGxhYmxlX29iamVjdF9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfbnVsbGFibGVPYmplY3RQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X251bGxhYmxlX29iamVjdF9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX251bGxhYmxlQm9vbGVhbkFyZ3VtZW50KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5OdWxsYWJsZUJvb2xlYW5Bcmd1bWVudChhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9udWxsYWJsZUJvb2xlYW5PcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk51bGxhYmxlQm9vbGVhbk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fbnVsbGFibGVOdW1lcmljQXJndW1lbnQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8aW50MzJfdCA+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk51bGxhYmxlTnVtZXJpY0FyZ3VtZW50KGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX251bGxhYmxlTnVtZXJpY09wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+TnVsbGFibGVOdW1lcmljT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9udWxsYWJsZU9iamVjdEFyZ3VtZW50KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5OdWxsYWJsZU9iamVjdEFyZ3VtZW50KGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX251bGxhYmxlT2JqZWN0T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5OdWxsYWJsZU9iamVjdE9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fbnVsbGFibGVTdHJpbmdBcmd1bWVudCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZyA+ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk51bGxhYmxlU3RyaW5nQXJndW1lbnQoYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fbnVsbGFibGVTdHJpbmdPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk51bGxhYmxlU3RyaW5nT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAibnVsbGFibGVCb29sZWFuUHJvcGVydHkiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9udWxsYWJsZUJvb2xlYW5Qcm9wZXJ0eSksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJudWxsYWJsZU51bWVyaWNQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X251bGxhYmxlTnVtZXJpY1Byb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlTnVtZXJpY1Byb3BlcnR5KSwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgIm51bGxhYmxlU3RyaW5nUHJvcGVydHkiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9udWxsYWJsZVN0cmluZ1Byb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlU3RyaW5nUHJvcGVydHkpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAibnVsbGFibGVPYmplY3RQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X251bGxhYmxlT2JqZWN0UHJvcGVydHkpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfbnVsbGFibGVPYmplY3RQcm9wZXJ0eSksCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAibnVsbGFibGVCb29sZWFuQXJndW1lbnQiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVCb29sZWFuQXJndW1lbnQpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibnVsbGFibGVCb29sZWFuT3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX251bGxhYmxlQm9vbGVhbk9wZXJhdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJudWxsYWJsZU51bWVyaWNBcmd1bWVudCIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9udWxsYWJsZU51bWVyaWNBcmd1bWVudCksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJudWxsYWJsZU51bWVyaWNPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVOdW1lcmljT3BlcmF0aW9uKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgIm51bGxhYmxlT2JqZWN0QXJndW1lbnQiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVPYmplY3RBcmd1bWVudCksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJudWxsYWJsZU9iamVjdE9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9udWxsYWJsZU9iamVjdE9wZXJhdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJudWxsYWJsZVN0cmluZ0FyZ3VtZW50IiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX251bGxhYmxlU3RyaW5nQXJndW1lbnQpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibnVsbGFibGVTdHJpbmdPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbnVsbGFibGVTdHJpbmdPcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYWM1MGJmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjRhNjdlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMjU2MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIk51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9ieXRlUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5ieXRlX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9ieXRlUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGludDhfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfYnl0ZV9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZ2V0X29jdGV0UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5vY3RldF9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfb2N0ZXRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8dWludDhfdCA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfb2N0ZXRfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF9zaG9ydFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+c2hvcnRfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3Nob3J0UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPGludDE2X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Nob3J0X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfdW5zaWduZWRTaG9ydFByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+dW5zaWduZWRfc2hvcnRfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3Vuc2lnbmVkU2hvcnRQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8dWludDE2X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Vuc2lnbmVkX3Nob3J0X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfbG9uZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bG9uZ19wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfbG9uZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9sb25nX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfdW5zaWduZWRMb25nUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT51bnNpZ25lZF9sb25nX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF91bnNpZ25lZExvbmdQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Vuc2lnbmVkX2xvbmdfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF9sb25nTG9uZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bG9uZ19sb25nX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9sb25nTG9uZ1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxpbnQ2NF90ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9sb25nX2xvbmdfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF91bnNpZ25lZExvbmdMb25nUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT51bnNpZ25lZF9sb25nX2xvbmdfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3Vuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8dWludDY0X3QgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3Vuc2lnbmVkX2xvbmdfbG9uZ19wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZ2V0X2RvdWJsZVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+ZG91YmxlX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9kb3VibGVQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9kb3VibGVfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF91bnJlc3RyaWN0ZWREb3VibGVQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnVucmVzdHJpY3RlZF9kb3VibGVfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3VucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3VucmVzdHJpY3RlZF9kb3VibGVfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9ieXRlQXJndW1lbnRPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQ4X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkJ5dGVBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fYnl0ZVJldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5CeXRlUmV0dXJuT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9kb3VibGVBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+RG91YmxlQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2RvdWJsZVJldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5Eb3VibGVSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2xvbmdBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkxvbmdBcmd1bWVudE9wZXJhdGlvbihhcmcxKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fbG9uZ0xvbmdBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDY0X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPkxvbmdMb25nQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2xvbmdMb25nUmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkxvbmdMb25nUmV0dXJuT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9sb25nUmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkxvbmdSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX29jdGV0QXJndW1lbnRPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czx1aW50OF90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5PY3RldEFyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9vY3RldFJldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5PY3RldFJldHVybk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fc2hvcnRBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDE2X3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlNob3J0QXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3Nob3J0UmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPlNob3J0UmV0dXJuT3BlcmF0aW9uKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl91bnJlc3RyaWN0ZWREb3VibGVBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGRvdWJsZSA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+VW5yZXN0cmljdGVkRG91YmxlQXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3VucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5VbnJlc3RyaWN0ZWREb3VibGVSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3Vuc2lnbmVkTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8dWludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPlVuc2lnbmVkTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl91bnNpZ25lZExvbmdMb25nQXJndW1lbnRPcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czx1aW50NjRfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+VW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKGFyZzEpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl91bnNpZ25lZExvbmdMb25nUmV0dXJuT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPlVuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3Vuc2lnbmVkTG9uZ1JldHVybk9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5VbnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24oKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3Vuc2lnbmVkU2hvcnRBcmd1bWVudE9wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHVpbnQxNl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5VbnNpZ25lZFNob3J0QXJndW1lbnRPcGVyYXRpb24oYXJnMSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3Vuc2lnbmVkU2hvcnRSZXR1cm5PcGVyYXRpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+VW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgImJ5dGVQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2J5dGVQcm9wZXJ0eSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9ieXRlUHJvcGVydHkpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAib2N0ZXRQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X29jdGV0UHJvcGVydHkpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfb2N0ZXRQcm9wZXJ0eSksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJzaG9ydFByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfc2hvcnRQcm9wZXJ0eSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9zaG9ydFByb3BlcnR5KSwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgInVuc2lnbmVkU2hvcnRQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3Vuc2lnbmVkU2hvcnRQcm9wZXJ0eSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF91bnNpZ25lZFNob3J0UHJvcGVydHkpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAibG9uZ1Byb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbG9uZ1Byb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2xvbmdQcm9wZXJ0eSksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJ1bnNpZ25lZExvbmdQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3Vuc2lnbmVkTG9uZ1Byb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3Vuc2lnbmVkTG9uZ1Byb3BlcnR5KSwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgImxvbmdMb25nUHJvcGVydHkiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9sb25nTG9uZ1Byb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2xvbmdMb25nUHJvcGVydHkpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAidW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfdW5zaWduZWRMb25nTG9uZ1Byb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3Vuc2lnbmVkTG9uZ0xvbmdQcm9wZXJ0eSksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJkb3VibGVQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2RvdWJsZVByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2RvdWJsZVByb3BlcnR5KSwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgInVucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfdW5yZXN0cmljdGVkRG91YmxlUHJvcGVydHkpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfdW5yZXN0cmljdGVkRG91YmxlUHJvcGVydHkpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgeworICAgICAgImJ5dGVBcmd1bWVudE9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9ieXRlQXJndW1lbnRPcGVyYXRpb24pLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAiYnl0ZVJldHVybk9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9ieXRlUmV0dXJuT3BlcmF0aW9uKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgImRvdWJsZUFyZ3VtZW50T3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2RvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgImRvdWJsZVJldHVybk9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9kb3VibGVSZXR1cm5PcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibG9uZ0FyZ3VtZW50T3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2xvbmdBcmd1bWVudE9wZXJhdGlvbiksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJsb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2xvbmdMb25nQXJndW1lbnRPcGVyYXRpb24pLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAibG9uZ1JldHVybk9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9sb25nUmV0dXJuT3BlcmF0aW9uKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgIm9jdGV0QXJndW1lbnRPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fb2N0ZXRBcmd1bWVudE9wZXJhdGlvbiksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJvY3RldFJldHVybk9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9vY3RldFJldHVybk9wZXJhdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJzaG9ydEFyZ3VtZW50T3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3Nob3J0QXJndW1lbnRPcGVyYXRpb24pLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAic2hvcnRSZXR1cm5PcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2hvcnRSZXR1cm5PcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidW5yZXN0cmljdGVkRG91YmxlQXJndW1lbnRPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdW5yZXN0cmljdGVkRG91YmxlQXJndW1lbnRPcGVyYXRpb24pLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidW5yZXN0cmljdGVkRG91YmxlUmV0dXJuT3BlcmF0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3VucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJ1bnNpZ25lZExvbmdBcmd1bWVudE9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl91bnNpZ25lZExvbmdBcmd1bWVudE9wZXJhdGlvbiksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJ1bnNpZ25lZExvbmdMb25nQXJndW1lbnRPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgInVuc2lnbmVkTG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdW5zaWduZWRMb25nTG9uZ1JldHVybk9wZXJhdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJ1bnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdW5zaWduZWRMb25nUmV0dXJuT3BlcmF0aW9uKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgInVuc2lnbmVkU2hvcnRBcmd1bWVudE9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl91bnNpZ25lZFNob3J0QXJndW1lbnRPcGVyYXRpb24pLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidW5zaWduZWRTaG9ydFJldHVybk9wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl91bnNpZ25lZFNob3J0UmV0dXJuT3BlcmF0aW9uKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIk51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZmRhYmJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWFmZTM1OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNjg2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rlcml2ZWRfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGVyaXZlZEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIk9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIk9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIk9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK0pTQm9vbCBnZXRfYXJiaXRyYXJ5T2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5hcmJpdHJhcnlfb2JqZWN0KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9hcmJpdHJhcnlPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF9hcmJpdHJhcnlfb2JqZWN0KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfYmFzZUludGVyZmFjZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+YmFzZV9pbnRlcmZhY2UoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZ2V0X2Rlcml2ZWRJbnRlcmZhY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmRlcml2ZWRfaW50ZXJmYWNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9kZXJpdmVkSW50ZXJmYWNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8RGVyaXZlZEludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X2Rlcml2ZWRfaW50ZXJmYWNlKHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfb2JqZWN0UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPm9iamVjdF9wcm9wZXJ0eSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfb2JqZWN0UHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8T3BhcXVlSGFuZGxlID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfb2JqZWN0X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgImFyYml0cmFyeU9iamVjdCIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2FyYml0cmFyeU9iamVjdCksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF9hcmJpdHJhcnlPYmplY3QpLAorICB9LAorICB7ICAvLyBSZWFkb25seSBhdHRyaWJ1dGUKKyAgICAgICJiYXNlSW50ZXJmYWNlIiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfYmFzZUludGVyZmFjZSksCisgICAgICBKU09QX05VTExXUkFQUEVSLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAiZGVyaXZlZEludGVyZmFjZSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X2Rlcml2ZWRJbnRlcmZhY2UpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzZXRfZGVyaXZlZEludGVyZmFjZSksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJvYmplY3RQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X29iamVjdFByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X29iamVjdFByb3BlcnR5KSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTQ3NWI0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZV9oCisjZGVmaW5lIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNPYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40N2I0NWQzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsMTk5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJPcGVyYXRpb25zVGVzdEludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIk9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGZjbl9sb25nRnVuY3Rpb25Ob0FyZ3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPkxvbmdGdW5jdGlvbk5vQXJncygpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fb2JqZWN0RnVuY3Rpb25Ob0FyZ3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPk9iamVjdEZ1bmN0aW9uTm9BcmdzKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9vcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIC8vIE9wdGlvbmFsIGFyZ3VtZW50cyB3aXRoIGRlZmF1bHQgdmFsdWVzCisgIFR5cGVUcmFpdHM8ZG91YmxlID46OkNvbnZlcnNpb25UeXBlIGFyZzEgPQorICAgICAgMi43MTg7CisgIHNpemVfdCBudW1fc2V0X2FyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpID4gMCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTAoCisgICAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwKKyAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICZhcmcxKTsKKyAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGltcGwtPk9wdGlvbmFsQXJndW1lbnRXaXRoRGVmYXVsdChhcmcxKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fb3B0aW9uYWxBcmd1bWVudHMoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworICAvLyBPcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzI7CisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmczOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHNpemVfdCBudW1fc2V0X2FyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpID4gMSkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTAoCisgICAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICZhcmcyKTsKKyAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICArK251bV9zZXRfYXJndW1lbnRzOworICB9CisgIGlmIChhcmdzLmxlbmd0aCgpID4gMikgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTEoCisgICAgICAgIGNvbnRleHQsIGFyZ3NbMl0pOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICZhcmczKTsKKyAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICArK251bV9zZXRfYXJndW1lbnRzOworICB9CisgIHN3aXRjaCAobnVtX3NldF9hcmd1bWVudHMpIHsKKyAgICBjYXNlIDE6CisgICAgICB7CisgICAgICAgICAgaW1wbC0+T3B0aW9uYWxBcmd1bWVudHMoYXJnMSk7CisgICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHsKKyAgICAgICAgICBpbXBsLT5PcHRpb25hbEFyZ3VtZW50cyhhcmcxLCBhcmcyKTsKKyAgICAgICAgICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgICAgICAgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSAzOgorICAgICAgeworICAgICAgICAgIGltcGwtPk9wdGlvbmFsQXJndW1lbnRzKGFyZzEsIGFyZzIsIGFyZzMpOworICAgICAgICAgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgICAgICAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK0pTQm9vbCBmY25fb3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgLy8gT3B0aW9uYWwgYXJndW1lbnRzIHdpdGggZGVmYXVsdCB2YWx1ZXMKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxib29sID4gPjo6Q29udmVyc2lvblR5cGUgYXJnMSA9CisgICAgICBiYXNlOjpudWxsb3B0OworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmcyID0KKyAgICAgIE5VTEw7CisgIHNpemVfdCBudW1fc2V0X2FyZ3VtZW50cyA9IDI7CisgIGlmIChhcmdzLmxlbmd0aCgpID4gMCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTAoCisgICAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdOdWxsYWJsZSksCisgICAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAmYXJnMSk7CisgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPiAxKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG9wdGlvbmFsX3ZhbHVlMSgKKyAgICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICBvcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwKKyAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICZhcmcyKTsKKyAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIGltcGwtPk9wdGlvbmFsTnVsbGFibGVBcmd1bWVudHNXaXRoRGVmYXVsdHMoYXJnMSwgYXJnMik7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjEoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk92ZXJsb2FkZWRGdW5jdGlvbihhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24zKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX292ZXJsb2FkZWRGdW5jdGlvbjQoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMzsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcxOworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzIpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgyLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTIoCisgICAgICBjb250ZXh0LCBhcmdzWzJdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMiwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9vdmVybG9hZGVkRnVuY3Rpb241KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDM7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzI7CisgIFR5cGVUcmFpdHM8c2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID46OkNvbnZlcnNpb25UeXBlIGFyZzM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcxKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMSwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUxKAorICAgICAgY29udGV4dCwgYXJnc1sxXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTEsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzIpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgyLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTIoCisgICAgICBjb250ZXh0LCBhcmdzWzJdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMiwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9vdmVybG9hZGVkRnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgc3dpdGNoKGFyZ2MpIHsKKyAgICBjYXNlKDApOiB7CisgICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6CisgICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMSgKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlKDEpOiB7CisgICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6CisgICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgICAgIEpTOjpSb290ZWRWYWx1ZSBhcmcoY29udGV4dCwgYXJnc1swXSk7CisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7CisgICAgICAgIG9iamVjdCA9IEpTVkFMX1RPX09CSkVDVChhcmcpOworICAgICAgfQorICAgICAgaWYgKGFyZy5pc051bWJlcigpKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMygKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlKDMpOiB7CisgICAgICAvLyBPdmVybG9hZCByZXNvbHV0aW9uIGFsZ29yaXRobSBkZXRhaWxzIGZvdW5kIGhlcmU6CisgICAgICAvLyAgICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgICAgIEpTOjpSb290ZWRWYWx1ZSBhcmcoY29udGV4dCwgYXJnc1syXSk7CisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICAgICAgaWYgKGFyZy5pc09iamVjdCgpKSB7CisgICAgICAgIG9iamVjdCA9IEpTVkFMX1RPX09CSkVDVChhcmcpOworICAgICAgfQorICAgICAgaWYgKGFyZy5pc09iamVjdCgpID8gd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxBcmJpdHJhcnlJbnRlcmZhY2U+KCkpIDoKKyAgICAgICAgICAgICAgZmFsc2UpIHsKKyAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb241KAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIGZjbl9vdmVybG9hZGVkRnVuY3Rpb240KAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIC8vIEludmFsaWQgbnVtYmVyIG9mIGFyZ3MKKyAgLy8gaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNkZm4tb3ZlcmxvYWQtcmVzb2x1dGlvbi1hbGdvcml0aG0KKyAgLy8gNC4gSWYgUyBpcyBlbXB0eSwgdGhlbiB0aHJvdyBhIFR5cGVFcnJvci4KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCitKU0Jvb2wgZmNuX292ZXJsb2FkZWROdWxsYWJsZTEoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPk92ZXJsb2FkZWROdWxsYWJsZShhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9vdmVybG9hZGVkTnVsbGFibGUyKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGJhc2U6Om9wdGlvbmFsPGJvb2wgPiA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAoa0NvbnZlcnNpb25GbGFnTnVsbGFibGUpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5PdmVybG9hZGVkTnVsbGFibGUoYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fb3ZlcmxvYWRlZE51bGxhYmxlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIHN3aXRjaChhcmdjKSB7CisgICAgY2FzZSgxKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBKUzo6Um9vdGVkVmFsdWUgYXJnKGNvbnRleHQsIGFyZ3NbMF0pOworICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgeworICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKKyAgICAgIH0KKyAgICAgIGlmIChhcmcuaXNOdWxsT3JVbmRlZmluZWQoKSkgeworICAgICAgICByZXR1cm4gZmNuX292ZXJsb2FkZWROdWxsYWJsZTIoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gZmNuX292ZXJsb2FkZWROdWxsYWJsZTEoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncworICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKK0pTQm9vbCBmY25fc3RyaW5nRnVuY3Rpb25Ob0FyZ3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPlN0cmluZ0Z1bmN0aW9uTm9BcmdzKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl92YXJpYWRpY1ByaW1pdGl2ZUFyZ3VtZW50cygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgLy8gVmFyaWFkaWMgYXJndW1lbnQKKyAgVHlwZVRyYWl0czxzdGQ6OnZlY3RvcjxpbnQzMl90PiA+OjpDb252ZXJzaW9uVHlwZSBib29sczsKKworICAvLyBHZXQgdmFyaWFkaWMgYXJndW1lbnRzLgorICBjb25zdCBzaXplX3Qga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCA9IDA7CisgIGlmIChhcmdzLmxlbmd0aCgpID4ga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCkgeworICAgIGJvb2xzLnJlc2l6ZShhcmdzLmxlbmd0aCgpIC0ga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgKyBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4IDwgYXJncy5sZW5ndGgoKTsgKytpKSB7CisgICAgICBKUzo6Um9vdGVkVmFsdWUgdmFyaWFkaWNfYXJndW1lbnRfdmFsdWUoCisgICAgICAgICAgY29udGV4dCwgYXJnc1tpICsga0ZpcnN0VmFyaWFkaWNBcmdJbmRleF0pOworICAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIHZhcmlhZGljX2FyZ3VtZW50X3ZhbHVlLAorICAgICAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICZib29sc1tpXSk7CisgICAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaW1wbC0+VmFyaWFkaWNQcmltaXRpdmVBcmd1bWVudHMoYm9vbHMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl92YXJpYWRpY1N0cmluZ0FyZ3VtZW50c0FmdGVyT3B0aW9uYWxBcmd1bWVudCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgLy8gT3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8Ym9vbCA+OjpDb252ZXJzaW9uVHlwZSBvcHRpb25hbF9hcmc7CisgIC8vIFZhcmlhZGljIGFyZ3VtZW50CisgIFR5cGVUcmFpdHM8c3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+ID46OkNvbnZlcnNpb25UeXBlIHN0cmluZ3M7CisgIHNpemVfdCBudW1fc2V0X2FyZ3VtZW50cyA9IDA7CisgIGlmIChhcmdzLmxlbmd0aCgpID4gMCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvcHRpb25hbF92YWx1ZTAoCisgICAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgICAgb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICZvcHRpb25hbF9hcmcpOworICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgICsrbnVtX3NldF9hcmd1bWVudHM7CisgIH0KKworICAvLyBHZXQgdmFyaWFkaWMgYXJndW1lbnRzLgorICBjb25zdCBzaXplX3Qga0xhc3RPcHRpb25hbEFyZ0luZGV4ID0gMTsKKyAgaWYgKG51bV9zZXRfYXJndW1lbnRzID09IGtMYXN0T3B0aW9uYWxBcmdJbmRleCkgeworICAgIC8vIElmIHRoZSBsYXN0IG9wdGlvbmFsIGFyZ3VtZW50IGhhcyBiZWVuIHNldCwgd2Ugd2lsbCBjYWxsIHRoZSBvdmVybG9hZAorICAgIC8vIHRoYXQgdGFrZXMgdGhlIHZhcmlhZGljIGFyZ3VtZW50LCBwb3NzaWJseSB3aXRoIGFuIGVtcHR5IHZlY3RvciBpbiB0aGUKKyAgICAvLyBjYXNlIHRoYXQgdGhlcmUgYXJlIG5vIG1vcmUgYXJndW1lbnRzIGxlZnQuCisgICAgKytudW1fc2V0X2FyZ3VtZW50czsKKyAgfQorICBjb25zdCBzaXplX3Qga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpID4ga0ZpcnN0VmFyaWFkaWNBcmdJbmRleCkgeworICAgIHN0cmluZ3MucmVzaXplKGFyZ3MubGVuZ3RoKCkgLSBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4KTsKKyAgICBmb3IgKGludCBpID0gMDsgaSArIGtGaXJzdFZhcmlhZGljQXJnSW5kZXggPCBhcmdzLmxlbmd0aCgpOyArK2kpIHsKKyAgICAgIEpTOjpSb290ZWRWYWx1ZSB2YXJpYWRpY19hcmd1bWVudF92YWx1ZSgKKyAgICAgICAgICBjb250ZXh0LCBhcmdzW2kgKyBrRmlyc3RWYXJpYWRpY0FyZ0luZGV4XSk7CisgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICAgICAgdmFyaWFkaWNfYXJndW1lbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAgICAgJnN0cmluZ3NbaV0pOworICAgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorICBzd2l0Y2ggKG51bV9zZXRfYXJndW1lbnRzKSB7CisgICAgY2FzZSAwOgorICAgICAgeworICAgICAgICAgIGltcGwtPlZhcmlhZGljU3RyaW5nQXJndW1lbnRzQWZ0ZXJPcHRpb25hbEFyZ3VtZW50KCk7CisgICAgICAgICAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICAgICAgICAgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMjoKKyAgICAgIHsKKyAgICAgICAgICBpbXBsLT5WYXJpYWRpY1N0cmluZ0FyZ3VtZW50c0FmdGVyT3B0aW9uYWxBcmd1bWVudChvcHRpb25hbF9hcmcsIHN0cmluZ3MpOworICAgICAgICAgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgICAgICAgICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK0pTQm9vbCBmY25fdm9pZEZ1bmN0aW9uTG9uZ0FyZygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+Vm9pZEZ1bmN0aW9uTG9uZ0FyZyhhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl92b2lkRnVuY3Rpb25Ob0FyZ3MoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaW1wbC0+Vm9pZEZ1bmN0aW9uTm9BcmdzKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3ZvaWRGdW5jdGlvbk9iamVjdEFyZygKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5Wb2lkRnVuY3Rpb25PYmplY3RBcmcoYXJnKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fdm9pZEZ1bmN0aW9uU3RyaW5nQXJnKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxPcGVyYXRpb25zVGVzdEludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPE9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIGFyZzsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+Vm9pZEZ1bmN0aW9uU3RyaW5nQXJnKGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjEoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6T3ZlcmxvYWRlZEZ1bmN0aW9uKGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjIoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAyOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKyAgVHlwZVRyYWl0czxkb3VibGUgPjo6Q29udmVyc2lvblR5cGUgYXJnMjsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIChrQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkKSwKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzEpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDS19MVCgxLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTEoCisgICAgICBjb250ZXh0LCBhcmdzWzFdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMSwKKyAgICAgICAgICAgICAgKGtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQpLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMik7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6Ok92ZXJsb2FkZWRGdW5jdGlvbihhcmcxLCBhcmcyKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIHN3aXRjaChhcmdjKSB7CisgICAgY2FzZSgxKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjEoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSgyKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBpZiAodHJ1ZSkgeworICAgICAgICByZXR1cm4gc3RhdGljZmNuX292ZXJsb2FkZWRGdW5jdGlvbjIoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncworICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJsb25nRnVuY3Rpb25Ob0FyZ3MiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fbG9uZ0Z1bmN0aW9uTm9BcmdzKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgIm9iamVjdEZ1bmN0aW9uTm9BcmdzIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX29iamVjdEZ1bmN0aW9uTm9BcmdzKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgIm9wdGlvbmFsQXJndW1lbnRXaXRoRGVmYXVsdCIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9vcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQpLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAib3B0aW9uYWxBcmd1bWVudHMiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fb3B0aW9uYWxBcmd1bWVudHMpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAib3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cyIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9vcHRpb25hbE51bGxhYmxlQXJndW1lbnRzV2l0aERlZmF1bHRzKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgIm92ZXJsb2FkZWRGdW5jdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9vdmVybG9hZGVkRnVuY3Rpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAib3ZlcmxvYWRlZE51bGxhYmxlIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX292ZXJsb2FkZWROdWxsYWJsZSksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJzdHJpbmdGdW5jdGlvbk5vQXJncyIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9zdHJpbmdGdW5jdGlvbk5vQXJncyksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJ2YXJpYWRpY1ByaW1pdGl2ZUFyZ3VtZW50cyIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl92YXJpYWRpY1ByaW1pdGl2ZUFyZ3VtZW50cyksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJ2YXJpYWRpY1N0cmluZ0FyZ3VtZW50c0FmdGVyT3B0aW9uYWxBcmd1bWVudCIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl92YXJpYWRpY1N0cmluZ0FyZ3VtZW50c0FmdGVyT3B0aW9uYWxBcmd1bWVudCksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJ2b2lkRnVuY3Rpb25Mb25nQXJnIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3ZvaWRGdW5jdGlvbkxvbmdBcmcpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidm9pZEZ1bmN0aW9uTm9BcmdzIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3ZvaWRGdW5jdGlvbk5vQXJncyksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJ2b2lkRnVuY3Rpb25PYmplY3RBcmciLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdm9pZEZ1bmN0aW9uT2JqZWN0QXJnKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgInZvaWRGdW5jdGlvblN0cmluZ0FyZyIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl92b2lkRnVuY3Rpb25TdHJpbmdBcmcpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJvdmVybG9hZGVkRnVuY3Rpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZzdGF0aWNmY25fb3ZlcmxvYWRlZEZ1bmN0aW9uKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJPcGVyYXRpb25zVGVzdEludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc09wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX29wZXJhdGlvbnNfdGVzdF9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTY3ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2MyMzJlMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDUxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6UHV0Rm9yd2FyZHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlSGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiUHV0Rm9yd2FyZHNJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJQdXRGb3J3YXJkc0ludGVyZmFjZVByb3RvdHlwZSI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZmxhZ3MgPSAwOworICBwcm90b3R5cGVfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKworICBKU0NsYXNzKiBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzID0KKyAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5uYW1lID0gIlB1dEZvcndhcmRzSW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF9mb3J3YXJkaW5nQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgUHV0Rm9yd2FyZHNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8UHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPmZvcndhcmRpbmdfYXR0cmlidXRlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF9mb3J3YXJkaW5nQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFB1dEZvcndhcmRzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgUHV0Rm9yd2FyZHNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8UHV0Rm9yd2FyZHNJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIHsgLy8gQmVnaW4gc2NvcGUgb2Ygc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGZvcndhcmRlZF9pbXBsLgorICAgIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbCA9CisgICAgICAgaW1wbC0+Zm9yd2FyZGluZ19hdHRyaWJ1dGUoKTsKKyAgICBpZiAoIWZvcndhcmRlZF9pbXBsKSB7CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvcndhcmRlZF9pbXBsLT5zZXRfYXJiaXRyYXJ5X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworICB9IC8vIEVuZCBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCit9CisKK0pTQm9vbCBzdGF0aWNnZXRfc3RhdGljRm9yd2FyZGluZ0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OnN0YXRpY19mb3J3YXJkaW5nX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzdGF0aWNzZXRfc3RhdGljRm9yd2FyZGluZ0F0dHJpYnV0ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICB7IC8vIEJlZ2luIHNjb3BlIG9mIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBmb3J3YXJkZWRfaW1wbC4KKyAgICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwgPQorICAgICAgIFB1dEZvcndhcmRzSW50ZXJmYWNlOjpzdGF0aWNfZm9yd2FyZGluZ19hdHRyaWJ1dGUoKTsKKyAgICBpZiAoIWZvcndhcmRlZF9pbXBsKSB7CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGZvcndhcmRlZF9pbXBsLT5zZXRfYXJiaXRyYXJ5X3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisgICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworICB9IC8vIEVuZCBzY29wZSBvZiBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gZm9yd2FyZGVkX2ltcGwuCit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgImZvcndhcmRpbmdBdHRyaWJ1dGUiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF9mb3J3YXJkaW5nQXR0cmlidXRlKSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X2ZvcndhcmRpbmdBdHRyaWJ1dGUpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgeyAgLy8gU3RhdGljIHJlYWQvd3JpdGUgYXR0cmlidXRlLgorICAgICAgInN0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJnN0YXRpY2dldF9zdGF0aWNGb3J3YXJkaW5nQXR0cmlidXRlKSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc3RhdGljc2V0X3N0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGUpLAorICB9LAorICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiUHV0Rm9yd2FyZHNJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjZjNiNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zZXF1ZW5jZV91c2VyLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zZXF1ZW5jZV91c2VyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNjOWE5YzIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuY2MKQEAgLTAsMCArMSwxMzEyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zZXF1ZW5jZV91c2VyLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U2VxdWVuY2VVc2VyOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTZXF1ZW5jZVVzZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNTZXF1ZW5jZVVzZXJIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc1NlcXVlbmNlVXNlckhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1NlcXVlbmNlVXNlckhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzU2VxdWVuY2VVc2VySGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTZXF1ZW5jZVVzZXJIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBDb25zdHJ1Y3RvcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGludCBhcmdjLCBKUzo6VmFsdWUqIHZwKTsKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNTZXF1ZW5jZVVzZXI6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiU2VxdWVuY2VVc2VyIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiU2VxdWVuY2VVc2VyUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiU2VxdWVuY2VVc2VyQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnN0cnVjdCA9IENvbnN0cnVjdG9yOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK0pTQm9vbCBmY25fZ2V0SW50ZXJmYWNlU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRJbnRlcmZhY2VTZXF1ZW5jZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+R2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9nZXRMb25nU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRMb25nU2VxdWVuY2UoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2dldFN0cmluZ1NlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+R2V0U3RyaW5nU2VxdWVuY2UoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2dldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9nZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX2dldFVuaW9uU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRVbmlvblNlcXVlbmNlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIGFyZ3MucnZhbCgpLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9zZXRJbnRlcmZhY2VTZXF1ZW5jZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFNlcXVlbmNlVXNlciogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+U2V0SW50ZXJmYWNlU2VxdWVuY2UoZWxlbWVudHMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+ID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5TZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoZWxlbWVudHMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9zZXRMb25nU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IGludDMyX3QgPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5TZXRMb25nU2VxdWVuY2UoZWxlbWVudHMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9zZXRTdHJpbmdTZXF1ZW5jZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFNlcXVlbmNlVXNlcj4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFNlcXVlbmNlVXNlciogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTZXF1ZW5jZVVzZXI+KCkuZ2V0KCk7CisgIGNvbnN0IHNpemVfdCBrTWluQXJndW1lbnRzID0gMTsKKyAgaWYgKGFyZ3MubGVuZ3RoKCkgPCBrTWluQXJndW1lbnRzKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBOb24tb3B0aW9uYWwgYXJndW1lbnRzCisgIFR5cGVUcmFpdHM8c2NyaXB0OjpTZXF1ZW5jZTwgc3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5TZXRTdHJpbmdTZXF1ZW5jZShlbGVtZW50cyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3NldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzU2VxdWVuY2VVc2VyOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTZXF1ZW5jZVVzZXI+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTZXF1ZW5jZVVzZXIqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U2VxdWVuY2VVc2VyPigpLmdldCgpOworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPHNjcmlwdDo6U2VxdWVuY2U8IHNjcmlwdDo6U2VxdWVuY2U8IHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5TZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKGVsZW1lbnRzKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzY3JpcHQ6OlVuaW9uVHlwZTI8c3RkOjpzdHJpbmcsIHNjcmlwdDo6U2VxdWVuY2U8IHN0ZDo6c3RyaW5nID4gPiA+OjpDb252ZXJzaW9uVHlwZSBlbGVtZW50czsKKworICBEQ0hFQ0tfTFQoMCwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUwKAorICAgICAgY29udGV4dCwgYXJnc1swXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTAsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmVsZW1lbnRzKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5TZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoZWxlbWVudHMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGZjbl9zZXRVbmlvblNlcXVlbmNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U2VxdWVuY2VVc2VyPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU2VxdWVuY2VVc2VyKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFNlcXVlbmNlVXNlcj4oKS5nZXQoKTsKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzY3JpcHQ6OlNlcXVlbmNlPCBzY3JpcHQ6OlVuaW9uVHlwZTI8c3RkOjpzdHJpbmcsIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+ID4gPjo6Q29udmVyc2lvblR5cGUgZWxlbWVudHM7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZlbGVtZW50cyk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+U2V0VW5pb25TZXF1ZW5jZShlbGVtZW50cyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAiZ2V0SW50ZXJmYWNlU2VxdWVuY2UiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZ2V0SW50ZXJmYWNlU2VxdWVuY2UpLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAiZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJnZXRMb25nU2VxdWVuY2UiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZ2V0TG9uZ1NlcXVlbmNlKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgImdldFN0cmluZ1NlcXVlbmNlIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2dldFN0cmluZ1NlcXVlbmNlKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgImdldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZ2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJnZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgImdldFVuaW9uU2VxdWVuY2UiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fZ2V0VW5pb25TZXF1ZW5jZSksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJzZXRJbnRlcmZhY2VTZXF1ZW5jZSIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9zZXRJbnRlcmZhY2VTZXF1ZW5jZSksCisgICAgICAxLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIHsKKyAgICAgICJzZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgInNldExvbmdTZXF1ZW5jZSIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9zZXRMb25nU2VxdWVuY2UpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAic2V0U3RyaW5nU2VxdWVuY2UiLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fc2V0U3RyaW5nU2VxdWVuY2UpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAic2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgInNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9zZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UpLAorICAgICAgMSwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAic2V0VW5pb25TZXF1ZW5jZSIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9zZXRVbmlvblNlcXVlbmNlKSwKKyAgICAgIDEsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIlNlcXVlbmNlVXNlciI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubGVuZ3RoIHByb3BlcnR5LiBJdCBpcyBzZXQgdG8gdGhlIGxlbmd0aCBvZiB0aGUKKyAgLy8gc2hvcnRlc3QgYXJndW1lbnQgbGlzdCBvZiBhbGwgb3ZlcmxvYWQgY29uc3RydWN0b3JzLgorICBKUzo6Um9vdGVkVmFsdWUgbGVuZ3RoX3ZhbHVlKGNvbnRleHQpOworICBsZW5ndGhfdmFsdWUuc2V0SW50MzIoMCk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJsZW5ndGgiLAorICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoX3ZhbHVlLCBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTZXF1ZW5jZVVzZXI6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc1NlcXVlbmNlVXNlcjo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTZXF1ZW5jZVVzZXI6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1NlcXVlbmNlVXNlcjo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworSlNCb29sIENvbnN0cnVjdG9yKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgaW50IGFyZ2MsIEpTOjpWYWx1ZSogdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKworICBzY29wZWRfcmVmcHRyPFNlcXVlbmNlVXNlcj4gbmV3X29iamVjdCA9CisgICAgICBuZXcgU2VxdWVuY2VVc2VyKCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisgIFRvSlNWYWx1ZShjb250ZXh0LCBuZXdfb2JqZWN0LCAmcmVzdWx0X3ZhbHVlKTsKKyAgRENIRUNLKHJlc3VsdF92YWx1ZS5pc09iamVjdCgpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByZXN1bHRfb2JqZWN0KGNvbnRleHQsIEpTVkFMX1RPX09CSkVDVChyZXN1bHRfdmFsdWUpKTsKKyAgYXJncy5ydmFsKCkuc2V0T2JqZWN0KCpyZXN1bHRfb2JqZWN0KTsKKyAgcmV0dXJuIHRydWU7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2VxdWVuY2VfdXNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyODMzMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NlcXVlbmNlX3VzZXIuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1NlcXVlbmNlVXNlcl9oCisjZGVmaW5lIE1vempzU2VxdWVuY2VVc2VyX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcXVlbmNlX3VzZXIuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzU2VxdWVuY2VVc2VyIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1NlcXVlbmNlVXNlcl9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YTBmMTlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDEyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2xvZ2dpbmdfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzY250eHQuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlNpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpMb2dnaW5nRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpHZXRDYWxsYWJsZUZvckNhbGxiYWNrSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OnV0aWw6OkdldEV4Y2VwdGlvblN0cmluZzsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK01vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlOjpNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0KQorICAgIDogY29udGV4dF8oY29udGV4dCksCisgICAgICBpbXBsZW1lbnRpbmdfb2JqZWN0Xyhjb250ZXh0LCBpbXBsZW1lbnRpbmdfb2JqZWN0KSB7IH0KKworTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlVmFsdWUgaW1wbGVtZW50aW5nX29iamVjdF92YWx1ZSkKKyAgICA6IGNvbnRleHRfKGNvbnRleHQpLAorICAgICAgaW1wbGVtZW50aW5nX29iamVjdF8oY29udGV4dCwgaW1wbGVtZW50aW5nX29iamVjdF92YWx1ZSkgeyB9CisKK2Jhc2U6Om9wdGlvbmFsPGludDMyX3QgPiBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTo6SGFuZGxlQ2FsbGJhY2soCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIGNhbGxiYWNrX3RoaXMsCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+JiB2YWx1ZSwKKyAgICBib29sKiBoYWRfZXhjZXB0aW9uKSBjb25zdCB7CisgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOworICBiYXNlOjpvcHRpb25hbDxpbnQzMl90ID4gY29iYWx0X3JldHVybl92YWx1ZTsKKyAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOworICBKU0V4Y2VwdGlvblN0YXRlKiBwcmV2aW91c19leGNlcHRpb25fc3RhdGUgPSBKU19TYXZlRXhjZXB0aW9uU3RhdGUoY29udGV4dF8pOworICBFTkFCTEVfSlNfU1RBQ0tfVFJBQ0VfSU5fU0NPUEUoY29udGV4dF8pOworCisgIC8vIFRoaXMgY291bGQgYmUgc2V0IHRvIE5VTEwgaWYgaXQgd2FzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBKUzo6Um9vdGVkT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3QoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3RfLkdldE9iamVjdCgpKTsKKyAgRExPR19JRihXQVJOSU5HLCAhaW1wbGVtZW50aW5nX29iamVjdCkgPDwgIkltcGxlbWVudGluZyBvYmplY3QgaXMgTlVMTC4iOworICBpZiAoaW1wbGVtZW50aW5nX29iamVjdCkgeworICAgIEpTQXV0b0NvbXBhcnRtZW50IGF1dG9fY29tcGFydG1lbnQoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3QpOworCisgICAgLy8gR2V0IGNhbGxhYmxlIG9iamVjdC4KKyAgICBKUzo6Um9vdGVkVmFsdWUgY2FsbGFibGUoY29udGV4dF8pOworICAgIGlmIChHZXRDYWxsYWJsZUZvckNhbGxiYWNrSW50ZXJmYWNlKGNvbnRleHRfLCBpbXBsZW1lbnRpbmdfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJoYW5kbGVDYWxsYmFjayIsICZjYWxsYWJsZSkpIHsKKyAgICAgIC8vIENvbnZlcnQgdGhlIGNhbGxiYWNrX3RoaXMgdG8gYSBKU1ZhbHVlLgorICAgICAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dF8pOworICAgICAgVG9KU1ZhbHVlKGNvbnRleHRfLCBjYWxsYmFja190aGlzLCAmdGhpc192YWx1ZSk7CisKKyAgICAgIC8vIENvbnZlcnQgYXJndW1lbnRzLgorICAgICAgY29uc3QgaW50IGtOdW1Bcmd1bWVudHMgPSAxOworICAgICAgSlM6OlZhbHVlIGFyZ3Nba051bUFyZ3VtZW50c107CisgICAgICBqczo6U2V0VmFsdWVSYW5nZVRvTnVsbChhcmdzLCBrTnVtQXJndW1lbnRzKTsKKyAgICAgIGpzOjpBdXRvVmFsdWVBcnJheSBhdXRvX2FycmF5X3Jvb3Rlcihjb250ZXh0XywgYXJncywga051bUFyZ3VtZW50cyk7CisgICAgICBUb0pTVmFsdWUoY29udGV4dF8sIHZhbHVlLAorICAgICAgICAgICAgICAgIGF1dG9fYXJyYXlfcm9vdGVyLmhhbmRsZUF0KDApKTsKKworICAgICAgLy8gQ2FsbCB0aGUgZnVuY3Rpb24uCisgICAgICBKUzo6Um9vdGVkVmFsdWUgcmV0dXJuX3ZhbHVlKGNvbnRleHRfKTsKKyAgICAgIEpTOjpSb290ZWRGdW5jdGlvbiBmdW5jdGlvbigKKyAgICAgICAgICBjb250ZXh0XywgSlNfVmFsdWVUb0Z1bmN0aW9uKGNvbnRleHRfLCBjYWxsYWJsZSkpOworICAgICAgRENIRUNLKGZ1bmN0aW9uKTsKKyAgICAgIHN1Y2Nlc3MgPSBKUzo6Q2FsbChjb250ZXh0XywgdGhpc192YWx1ZSwgZnVuY3Rpb24sIGtOdW1Bcmd1bWVudHMsIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuX3ZhbHVlLmFkZHJlc3MoKSk7CisgICAgICBETE9HX0lGKFdBUk5JTkcsICFzdWNjZXNzKSA8PCAiRXhjZXB0aW9uIGluIGNhbGxiYWNrOiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA8PCBHZXRFeGNlcHRpb25TdHJpbmcoY29udGV4dF8pOworICAgICAgaWYgKHN1Y2Nlc3MpIHsKKyAgICAgICAgTG9nZ2luZ0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZTsKKyAgICAgICAgRnJvbUpTVmFsdWUoY29udGV4dF8sIHJldHVybl92YWx1ZSwgMCwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgJmNvYmFsdF9yZXR1cm5fdmFsdWUpOworICAgICAgICBzdWNjZXNzID0gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7CisgICAgICB9CisgICAgfQorICB9CisKKyAgKmhhZF9leGNlcHRpb24gPSAhc3VjY2VzczsKKyAgSlNfUmVzdG9yZUV4Y2VwdGlvblN0YXRlKGNvbnRleHRfLCBwcmV2aW91c19leGNlcHRpb25fc3RhdGUpOworICByZXR1cm4gY29iYWx0X3JldHVybl92YWx1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODdmYmNkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDY5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZV9oCisjZGVmaW5lIE1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfaW50ZXJmYWNlX3RyYWl0cy5oIgorLy8gSGVhZGVycyBmb3Igb3RoZXIgYmluZGluZ3Mgd3JhcHBlciBjbGFzc2VzCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd2Vha19oZWFwX29iamVjdC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIDogcHVibGljIFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZSB7CisgcHVibGljOgorICB0eXBlZGVmIFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZSBCYXNlVHlwZTsKKworICBNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZSgKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0KTsKKyAgTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBpbXBsZW1lbnRpbmdfb2JqZWN0X3ZhbHVlKTsKKyAgYmFzZTo6b3B0aW9uYWw8aW50MzJfdCA+IEhhbmRsZUNhbGxiYWNrKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIGNhbGxiYWNrX3RoaXMsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4mIHZhbHVlLAorICAgICAgYm9vbCogaGFkX2V4Y2VwdGlvbikgY29uc3QgT1ZFUlJJREU7CisgIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBpbXBsZW1lbnRpbmdfb2JqZWN0Xy5HZXRPYmplY3QoKTsgfQorICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gaW1wbGVtZW50aW5nX29iamVjdF8uR2V0VmFsdWUoKTsgfQorICBib29sIFdhc0NvbGxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxlbWVudGluZ19vYmplY3RfLldhc0NvbGxlY3RlZCgpOyB9CisKKyBwcml2YXRlOgorICBKU0NvbnRleHQqIGNvbnRleHRfOworICBzY3JpcHQ6Om1vempzOjpXZWFrSGVhcE9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNjcmlwdCB7CisvLyBFeHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzIHN0cnVjdCBzbyB3ZSBjYW4gaW5mZXIKKy8vIHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgZnJvbSB0aGUgdHlwZSBvZiB0aGUgY2FsbGJhY2sgaW50ZXJmYWNlLgordGVtcGxhdGU8Pgorc3RydWN0IENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzPGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlNpbmdsZU9wZXJhdGlvbkludGVyZmFjZT4geworICB0eXBlZGVmIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VDbGFzczsKK307Cit9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MTZiOTYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw2NjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RhdGljUHJvcGVydGllc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFyYml0cmFyeUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiU3RhdGljUHJvcGVydGllc0ludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK0pTQm9vbCBzdGF0aWNnZXRfc3RhdGljQXR0cmlidXRlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpzdGF0aWNfYXR0cmlidXRlKCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHN0YXRpY3NldF9zdGF0aWNBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpzZXRfc3RhdGljX2F0dHJpYnV0ZSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworCisgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDE7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpTdGF0aWNGdW5jdGlvbihhcmcpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjMoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAxOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSBhcmc7CisKKyAgRENIRUNLX0xUKDAsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMCgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMF0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUwLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZyk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uNCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBjb25zdCBzaXplX3Qga01pbkFyZ3VtZW50cyA9IDM7CisgIGlmIChhcmdzLmxlbmd0aCgpIDwga01pbkFyZ3VtZW50cykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprSW52YWxpZE51bWJlck9mQXJndW1lbnRzKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gTm9uLW9wdGlvbmFsIGFyZ3VtZW50cworICBUeXBlVHJhaXRzPGludDMyX3QgPjo6Q29udmVyc2lvblR5cGUgYXJnMTsKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzI7CisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmczOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAorICAgICAgY29udGV4dCwgYXJnc1syXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgY29uc3Qgc2l6ZV90IGtNaW5Bcmd1bWVudHMgPSAzOworICBpZiAoYXJncy5sZW5ndGgoKSA8IGtNaW5Bcmd1bWVudHMpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0ludmFsaWROdW1iZXJPZkFyZ3VtZW50cyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIE5vbi1vcHRpb25hbCBhcmd1bWVudHMKKyAgVHlwZVRyYWl0czxpbnQzMl90ID46OkNvbnZlcnNpb25UeXBlIGFyZzE7CisgIFR5cGVUcmFpdHM8aW50MzJfdCA+OjpDb252ZXJzaW9uVHlwZSBhcmcyOworICBUeXBlVHJhaXRzPHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+OjpDb252ZXJzaW9uVHlwZSBhcmczOworCisgIERDSEVDS19MVCgwLCBhcmdzLmxlbmd0aCgpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5vbl9vcHRpb25hbF92YWx1ZTAoCisgICAgICBjb250ZXh0LCBhcmdzWzBdKTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgbm9uX29wdGlvbmFsX3ZhbHVlMCwKKyAgICAgICAgICAgICAga05vQ29udmVyc2lvbkZsYWdzLAorICAgICAgICAgICAgICAmZXhjZXB0aW9uX3N0YXRlLCAmYXJnMSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgRENIRUNLX0xUKDEsIGFyZ3MubGVuZ3RoKCkpOworICBKUzo6Um9vdGVkVmFsdWUgbm9uX29wdGlvbmFsX3ZhbHVlMSgKKyAgICAgIGNvbnRleHQsIGFyZ3NbMV0pOworICBGcm9tSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBub25fb3B0aW9uYWxfdmFsdWUxLAorICAgICAgICAgICAgICBrTm9Db252ZXJzaW9uRmxhZ3MsCisgICAgICAgICAgICAgICZleGNlcHRpb25fc3RhdGUsICZhcmcyKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0tfTFQoMiwgYXJncy5sZW5ndGgoKSk7CisgIEpTOjpSb290ZWRWYWx1ZSBub25fb3B0aW9uYWxfdmFsdWUyKAorICAgICAgY29udGV4dCwgYXJnc1syXSk7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIG5vbl9vcHRpb25hbF92YWx1ZTIsCisgICAgICAgICAgICAgIGtOb0NvbnZlcnNpb25GbGFncywKKyAgICAgICAgICAgICAgJmV4Y2VwdGlvbl9zdGF0ZSwgJmFyZzMpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlN0YXRpY0Z1bmN0aW9uKGFyZzEsIGFyZzIsIGFyZzMpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICBzd2l0Y2goYXJnYykgeworICAgIGNhc2UoMCk6IHsKKyAgICAgIC8vIE92ZXJsb2FkIHJlc29sdXRpb24gYWxnb3JpdGhtIGRldGFpbHMgZm91bmQgaGVyZToKKyAgICAgIC8vICAgICBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjEoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSgxKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBKUzo6Um9vdGVkVmFsdWUgYXJnKGNvbnRleHQsIGFyZ3NbMF0pOworICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgeworICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKKyAgICAgIH0KKyAgICAgIGlmIChhcmcuaXNOdW1iZXIoKSkgeworICAgICAgICByZXR1cm4gc3RhdGljZmNuX3N0YXRpY0Z1bmN0aW9uMigKKyAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGFyZ2MsIHZwKTsKKyAgICAgIH0KKyAgICAgIGlmICh0cnVlKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24zKAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjIoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSgzKTogeworICAgICAgLy8gT3ZlcmxvYWQgcmVzb2x1dGlvbiBhbGdvcml0aG0gZGV0YWlscyBmb3VuZCBoZXJlOgorICAgICAgLy8gICAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZGZuLW92ZXJsb2FkLXJlc29sdXRpb24tYWxnb3JpdGhtCisgICAgICBKUzo6Um9vdGVkVmFsdWUgYXJnKGNvbnRleHQsIGFyZ3NbMl0pOworICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgICAgICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSkgeworICAgICAgICBvYmplY3QgPSBKU1ZBTF9UT19PQkpFQ1QoYXJnKTsKKyAgICAgIH0KKyAgICAgIGlmIChhcmcuaXNPYmplY3QoKSA/IHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8QXJiaXRyYXJ5SW50ZXJmYWNlPigpKSA6CisgICAgICAgICAgICAgIGZhbHNlKSB7CisgICAgICAgIHJldHVybiBzdGF0aWNmY25fc3RhdGljRnVuY3Rpb241KAorICAgICAgICAgICAgICAgICAgY29udGV4dCwgYXJnYywgdnApOworICAgICAgfQorICAgICAgaWYgKHRydWUpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY2Zjbl9zdGF0aWNGdW5jdGlvbjQoCisgICAgICAgICAgICAgICAgICBjb250ZXh0LCBhcmdjLCB2cCk7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgLy8gSW52YWxpZCBudW1iZXIgb2YgYXJncworICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2Rmbi1vdmVybG9hZC1yZXNvbHV0aW9uLWFsZ29yaXRobQorICAvLyA0LiBJZiBTIGlzIGVtcHR5LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgZXhjZXB0aW9uX3N0YXRlLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtJbnZhbGlkTnVtYmVyT2ZBcmd1bWVudHMpOworICByZXR1cm4gZmFsc2U7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFN0YXRpYyByZWFkL3dyaXRlIGF0dHJpYnV0ZS4KKyAgICAgICJzdGF0aWNBdHRyaWJ1dGUiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJnN0YXRpY2dldF9zdGF0aWNBdHRyaWJ1dGUpLAorICAgICAgSlNPUF9XUkFQUEVSKCZzdGF0aWNzZXRfc3RhdGljQXR0cmlidXRlKSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAic3RhdGljRnVuY3Rpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZzdGF0aWNmY25fc3RhdGljRnVuY3Rpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIG93bl9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKwordm9pZCBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIERDSEVDSyghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEpTOjpSb290ZWRPYmplY3QgcGFyZW50X3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldE9iamVjdFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIlN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIEpTQ2xhc3MqIHByb3RvX2NsYXNzID0gSlNfR2V0Q2xhc3MoKnByb3RvdHlwZS5hZGRyZXNzKCkpOworICByZXR1cm4gcHJvdG9fY2xhc3M7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGE3YWRiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlX2gKKyNkZWZpbmUgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1N0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDFkNDU0MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0MDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlN0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKKworSlNCb29sIFN0cmluZ2lmaWVyKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGlmICghaW1wbCkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oY29iYWx0OjpzY3JpcHQ6OmtTdHJpbmdpZmllclByb2JsZW0pOworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjpzdHJpbmcgc3RyaW5naWZpZWQgPSBpbXBsLT5Bbm9ueW1vdXNTdHJpbmdpZmllcigpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LAorICAgICAgSlNfTmV3U3RyaW5nQ29weU4oY29udGV4dCwgc3RyaW5naWZpZWQuY19zdHIoKSwgc3RyaW5naWZpZWQubGVuZ3RoKCkpKTsKKyAgYXJncy5ydmFsKCkuc2V0KEpTOjpTdHJpbmdWYWx1ZShyb290ZWRfc3RyaW5nKSk7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgeworICAgICAgInRvU3RyaW5nIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmU3RyaW5naWZpZXIpLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9QRVJNQU5FTlQsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZTMzNjIxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1N0cmluZ2lmaWVyQW5vbnltb3VzT3BlcmF0aW9uSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMmNiYjQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmNjCkBAIC0wLDAgKzEsNDg5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3VzZXJfb2JqZWN0X2hvbGRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2ZyaWVuZGFwaS5oIgorCituYW1lc3BhY2UgewordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Okdsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6U2NyaXB0VmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOworCit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VIYW5kbGVyIDogcHVibGljIFByb3h5SGFuZGxlciB7CisgcHVibGljOgorICBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlSGFuZGxlcjo6aW5kZXhlZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CisKK3N0YXRpYyBiYXNlOjpMYXp5SW5zdGFuY2U8TW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IDA7CisgIGluc3RhbmNlX2NsYXNzLT5uYW1lID0gIlN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlIjsKKyAgaW5zdGFuY2VfY2xhc3MtPmZsYWdzID0ga0dsb2JhbEZsYWdzIHwgSlNDTEFTU19IQVNfUFJJVkFURTsKKyAgaW5zdGFuY2VfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgLy8gRnVuY3Rpb24gdG8gYmUgY2FsbGVkIGJlZm9yZSBvbiBvYmplY3Qgb2YgdGhpcyBjbGFzcyBpcyBnYXJiYWdlIGNvbGxlY3RlZC4KKyAgaW5zdGFuY2VfY2xhc3MtPmZpbmFsaXplID0gJldyYXBwZXJQcml2YXRlOjpGaW5hbGl6ZXI7CisgIC8vIENhbGxlZCB0byB0cmFjZSBvYmplY3RzIHRoYXQgY2FuIGJlIHJlZmVyZW5jZWQgZnJvbSB0aGlzIG9iamVjdC4KKyAgaW5zdGFuY2VfY2xhc3MtPnRyYWNlID0gJldyYXBwZXJQcml2YXRlOjpUcmFjZTsKKworICBKU0NsYXNzKiBwcm90b3R5cGVfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uOworICBwcm90b3R5cGVfY2xhc3MtPm5hbWUgPSAiU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZUNvbnN0cnVjdG9yIjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZmxhZ3MgPSAwOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmhhc0luc3RhbmNlID0gJkhhc0luc3RhbmNlOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK0pTQm9vbCBnZXRfdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+dGhlX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZSgpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBzZXRfdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzdGQ6OnN0cmluZyA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfdGhlX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK0pTQm9vbCBTdHJpbmdpZmllcihKU0NvbnRleHQqIGNvbnRleHQsIHVuc2lnbmVkIGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlPigpLmdldCgpOworICBpZiAoIWltcGwpIHsKKyAgICBleGNlcHRpb25fc3RhdGUuU2V0U2ltcGxlRXhjZXB0aW9uKGNvYmFsdDo6c2NyaXB0OjprU3RyaW5naWZpZXJQcm9ibGVtKTsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHN0ZDo6c3RyaW5nIHN0cmluZ2lmaWVkID0gaW1wbC0+dGhlX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZSgpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LAorICAgICAgSlNfTmV3U3RyaW5nQ29weU4oY29udGV4dCwgc3RyaW5naWZpZWQuY19zdHIoKSwgc3RyaW5naWZpZWQubGVuZ3RoKCkpKTsKKyAgYXJncy5ydmFsKCkuc2V0KEpTOjpTdHJpbmdWYWx1ZShyb290ZWRfc3RyaW5nKSk7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAidGhlU3RyaW5naWZpZXJBdHRyaWJ1dGUiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF90aGVTdHJpbmdpZmllckF0dHJpYnV0ZSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF90aGVTdHJpbmdpZmllckF0dHJpYnV0ZSksCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAidG9TdHJpbmciLAorICAgICAgSlNPUF9XUkFQUEVSKCZTdHJpbmdpZmllciksCisgICAgICAwLAorICAgICAgSlNQUk9QX1BFUk1BTkVOVCwKKyAgICAgIE5VTEwsCisgIH0sCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBuZXdfb2JqZWN0KGNvbnRleHQsIEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCBwcm90b3R5cGUsIE5VTEwpKTsKKyAgRENIRUNLKG5ld19vYmplY3QpOworICBKUzo6Um9vdGVkT2JqZWN0IHByb3h5KGNvbnRleHQsCisgICAgICBQcm94eUhhbmRsZXI6Ok5ld1Byb3h5KGNvbnRleHQsIG5ld19vYmplY3QsIHByb3RvdHlwZSwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJveHlfaGFuZGxlci5Qb2ludGVyKCkpKTsKKyAgV3JhcHBlclByaXZhdGU6OkFkZFByaXZhdGVEYXRhKGNvbnRleHQsIHByb3h5LCB3cmFwcGFibGUpOworICByZXR1cm4gcHJveHk7Cit9CisKKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOjpHZXRQcm90b3R5cGUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSkgeworICAgIC8vIENyZWF0ZSBuZXcgcHJvdG90eXBlIHRoYXQgaGFzIGFsbCB0aGUgcHJvcHMgYW5kIG1ldGhvZHMKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZTsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTZmOTc3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmgKQEAgLTAsMCArMSw1MiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlCisKKyNpZm5kZWYgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZV9oCisjZGVmaW5lIE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworY2xhc3MgTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWMxOGFiZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5jYwpAQCAtMCwwICsxLDQ2MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUhhbmRsZXIoKQorICAgICAgOiBQcm94eUhhbmRsZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rcywgbmFtZWRfcHJvcGVydHlfaG9va3MpIHt9CisKKyBwcml2YXRlOgorICBzdGF0aWMgTmFtZWRQcm9wZXJ0eUhvb2tzIG5hbWVkX3Byb3BlcnR5X2hvb2tzOworICBzdGF0aWMgSW5kZXhlZFByb3BlcnR5SG9va3MgaW5kZXhlZF9wcm9wZXJ0eV9ob29rczsKK307CisKK1Byb3h5SGFuZGxlcjo6TmFtZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VIYW5kbGVyPgorICAgIHByb3h5X2hhbmRsZXI7CisKK0pTQm9vbCBIYXNJbnN0YW5jZShKU0NvbnRleHQgKmNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdHlwZSwKKyAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwLCBKU0Jvb2wgKnN1Y2Nlc3MpIHsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfR2V0R2xvYmFsRm9yT2JqZWN0KGNvbnRleHQsIHR5cGUpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlUHJvdG90eXBlIjsKKyAgcHJvdG90eXBlX2NsYXNzLT5mbGFncyA9IDA7CisgIHByb3RvdHlwZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZGVsUHJvcGVydHkgPSBKU19EZWxldGVQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+ZW51bWVyYXRlID0gSlNfRW51bWVyYXRlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIHByb3RvdHlwZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworCisgIEpTQ2xhc3MqIGludGVyZmFjZV9vYmplY3RfY2xhc3MgPQorICAgICAgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb247CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPm5hbWUgPSAiU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZmNuX3RoZVN0cmluZ2lmaWVyT3BlcmF0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlPigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5UaGVTdHJpbmdpZmllck9wZXJhdGlvbigpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBhcmdzLnJ2YWwoKS5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworSlNCb29sIFN0cmluZ2lmaWVyKEpTQ29udGV4dCogY29udGV4dCwgdW5zaWduZWQgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8U3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U+KCkuZ2V0KCk7CisgIGlmICghaW1wbCkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS5TZXRTaW1wbGVFeGNlcHRpb24oY29iYWx0OjpzY3JpcHQ6OmtTdHJpbmdpZmllclByb2JsZW0pOworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjpzdHJpbmcgc3RyaW5naWZpZWQgPSBpbXBsLT5UaGVTdHJpbmdpZmllck9wZXJhdGlvbigpOworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIEpTOjpSb290ZWRTdHJpbmcgcm9vdGVkX3N0cmluZyhjb250ZXh0LAorICAgICAgSlNfTmV3U3RyaW5nQ29weU4oY29udGV4dCwgc3RyaW5naWZpZWQuY19zdHIoKSwgc3RyaW5naWZpZWQubGVuZ3RoKCkpKTsKKyAgYXJncy5ydmFsKCkuc2V0KEpTOjpTdHJpbmdWYWx1ZShyb290ZWRfc3RyaW5nKSk7CisgIHJldHVybiB0cnVlOworfQorCitjb25zdCBKU1Byb3BlcnR5U3BlYyBwcm90b3R5cGVfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIHByb3RvdHlwZV9mdW5jdGlvbnNbXSA9IHsKKyAgeworICAgICAgInRvU3RyaW5nIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmU3RyaW5naWZpZXIpLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9QRVJNQU5FTlQsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAidGhlU3RyaW5naWZpZXJPcGVyYXRpb24iLAorICAgICAgSlNPUF9XUkFQUEVSKCZmY25fdGhlU3RyaW5naWZpZXJPcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0T2JqZWN0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHBhcmVudF9wcm90b3R5cGUpOworCisgIC8vIENyZWF0ZSB0aGUgUHJvdG90eXBlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgcGFyZW50X3Byb3RvdHlwZSwKKyAgICAgIE5VTEwpOworICBib29sIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb25fcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgSlNfR2V0RnVuY3Rpb25Qcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0soZnVuY3Rpb25fcHJvdG90eXBlKTsKKyAgLy8gQ3JlYXRlIHRoZSBJbnRlcmZhY2Ugb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCA9IEpTX05ld09iamVjdFdpdGhHaXZlblByb3RvKAorICAgICAgY29udGV4dCwgJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sCisgICAgICBmdW5jdGlvbl9wcm90b3R5cGUsIE5VTEwpOworCisgIC8vIEFkZCB0aGUgSW50ZXJmYWNlT2JqZWN0Lm5hbWUgcHJvcGVydHkuCisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIEpTOjpSb290ZWRWYWx1ZSBuYW1lX3ZhbHVlKGNvbnRleHQpOworICBjb25zdCBjaGFyIG5hbWVbXSA9CisgICAgICAiU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYzZTA0OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VfaAorI2RlZmluZSBNb3pqc1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UgeworIHB1YmxpYzoKKyAgc3RhdGljIEpTT2JqZWN0KiBDcmVhdGVQcm94eShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiYgd3JhcHBhYmxlKTsKKyAgc3RhdGljIGNvbnN0IEpTQ2xhc3MqIFByb3RvdHlwZUNsYXNzKEpTQ29udGV4dCogY29udGV4dCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0UHJvdG90eXBlKEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRJbnRlcmZhY2VPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190YXJnZXRfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190YXJnZXRfaW50ZXJmYWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjNDE0OTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw0NzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzZnJpZW5kYXBpLmgiCisKK25hbWVzcGFjZSB7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpUYXJnZXRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1RhcmdldEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7Cit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCituYW1lc3BhY2UgeworCitjbGFzcyBNb3pqc1RhcmdldEludGVyZmFjZUhhbmRsZXIgOiBwdWJsaWMgUHJveHlIYW5kbGVyIHsKKyBwdWJsaWM6CisgIE1vempzVGFyZ2V0SW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzVGFyZ2V0SW50ZXJmYWNlSGFuZGxlcjo6bmFtZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworUHJveHlIYW5kbGVyOjpJbmRleGVkUHJvcGVydHlIb29rcworTW96anNUYXJnZXRJbnRlcmZhY2VIYW5kbGVyOjppbmRleGVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKKworc3RhdGljIGJhc2U6OkxhenlJbnN0YW5jZTxNb3pqc1RhcmdldEludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1RhcmdldEludGVyZmFjZTo6R2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKworICAvLyB8SXNEZWxlZ2F0ZXwgd2Fsa3MgdGhlIHByb3RvdHlwZSBjaGFpbiBvZiBhbiBvYmplY3QgcmV0dXJuaW5nIHRydWUgaWYKKyAgLy8gLnByb3RvdHlwZSBpcyBmb3VuZC4KKyAgYm9vbCBpc19kZWxlZ2F0ZTsKKyAgaWYgKCFJc0RlbGVnYXRlKGNvbnRleHQsIHByb3RvdHlwZSwgdnAsICZpc19kZWxlZ2F0ZSkpIHsKKyAgICAqc3VjY2VzcyA9IGZhbHNlOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgICpzdWNjZXNzID0gaXNfZGVsZWdhdGU7CisgIHJldHVybiB0cnVlOworfQorCitJbnRlcmZhY2VEYXRhKiBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IG5ldyBJbnRlcmZhY2VEYXRhKCk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uKSk7CisKKyAgSlNDbGFzcyogaW5zdGFuY2VfY2xhc3MgPSAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb247CisgIGNvbnN0IGludCBrR2xvYmFsRmxhZ3MgPSAwOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJUYXJnZXRJbnRlcmZhY2UiOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJUYXJnZXRJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJUYXJnZXRJbnRlcmZhY2VDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZmNuX2ltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCB1aW50MzJfdCBhcmdjLCBKUzo6VmFsdWUgKnZwKSB7CisgIEpTOjpDYWxsQXJncyBhcmdzID0gSlM6OkNhbGxBcmdzRnJvbVZwKGFyZ2MsIHZwKTsKKyAgLy8gQ29tcHV0ZSB0aGUgJ3RoaXMnIHZhbHVlLgorICBKUzo6Um9vdGVkVmFsdWUgdGhpc192YWx1ZShjb250ZXh0LCBKU19Db21wdXRlVGhpcyhjb250ZXh0LCB2cCkpOworICAvLyAndGhpcycgc2hvdWxkIGJlIGFuIG9iamVjdC4KKyAgSlM6OlJvb3RlZE9iamVjdCBvYmplY3QoY29udGV4dCk7CisgIGlmIChKU19UeXBlT2ZWYWx1ZShjb250ZXh0LCB0aGlzX3ZhbHVlKSAhPSBKU1RZUEVfT0JKRUNUKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdGhpc192YWx1ZSwgb2JqZWN0LmFkZHJlc3MoKSkpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxUYXJnZXRJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBUYXJnZXRJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VGFyZ2V0SW50ZXJmYWNlPigpLmdldCgpOworCisgIGltcGwtPkltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fcGFydGlhbEludGVyZmFjZUZ1bmN0aW9uKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgdWludDMyX3QgYXJnYywgSlM6OlZhbHVlICp2cCkgeworICBKUzo6Q2FsbEFyZ3MgYXJncyA9IEpTOjpDYWxsQXJnc0Zyb21WcChhcmdjLCB2cCk7CisgIC8vIENvbXB1dGUgdGhlICd0aGlzJyB2YWx1ZS4KKyAgSlM6OlJvb3RlZFZhbHVlIHRoaXNfdmFsdWUoY29udGV4dCwgSlNfQ29tcHV0ZVRoaXMoY29udGV4dCwgdnApKTsKKyAgLy8gJ3RoaXMnIHNob3VsZCBiZSBhbiBvYmplY3QuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQpOworICBpZiAoSlNfVHlwZU9mVmFsdWUoY29udGV4dCwgdGhpc192YWx1ZSkgIT0gSlNUWVBFX09CSkVDVCkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFKU19WYWx1ZVRvT2JqZWN0KGNvbnRleHQsIHRoaXNfdmFsdWUsIG9iamVjdC5hZGRyZXNzKCkpKSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1RhcmdldEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VGFyZ2V0SW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVGFyZ2V0SW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFRhcmdldEludGVyZmFjZT4oKS5nZXQoKTsKKworICBpbXBsLT5QYXJ0aWFsSW50ZXJmYWNlRnVuY3Rpb24oKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgcHJvdG90eXBlX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIHsKKyAgICAgICJpbXBsZW1lbnRlZEludGVyZmFjZUZ1bmN0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX2ltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICB7CisgICAgICAicGFydGlhbEludGVyZmFjZUZ1bmN0aW9uIiwKKyAgICAgIEpTT1BfV1JBUFBFUigmZmNuX3BhcnRpYWxJbnRlcmZhY2VGdW5jdGlvbiksCisgICAgICAwLAorICAgICAgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIE5VTEwsCisgIH0sCisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJUYXJnZXRJbnRlcmZhY2UiOworICBuYW1lX3ZhbHVlLnNldFN0cmluZyhKU19OZXdTdHJpbmdDb3B5Wihjb250ZXh0LCBuYW1lKSk7CisgIHN1Y2Nlc3MgPQorICAgICAgSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsICJuYW1lIiwgbmFtZV92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTX1Byb3BlcnR5U3R1YiwgSlNfU3RyaWN0UHJvcGVydHlTdHViLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNQUk9QX1JFQURPTkxZKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IHByb3BlcnRpZXMgKGluY2x1ZGluZyBjb25zdGFudHMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBmdW5jdGlvbnMgKHN0YXRpYykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVGdW5jdGlvbnMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKworICAvLyBTZXQgdGhlIFByb3RvdHlwZS5jb25zdHJ1Y3RvciBhbmQgQ29uc3RydWN0b3IucHJvdG90eXBlIHByb3BlcnRpZXMuCisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfcHJvdG90eXBlKGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBzdWNjZXNzID0gSlNfTGlua0NvbnN0cnVjdG9yQW5kUHJvdG90eXBlKAorICAgICAgY29udGV4dCwKKyAgICAgIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgcm9vdGVkX3Byb3RvdHlwZSk7CisgIERDSEVDSyhzdWNjZXNzKTsKK30KKworSW50ZXJmYWNlRGF0YSogR2V0SW50ZXJmYWNlRGF0YShKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIC8vIFVzZSB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvcGVydGllcyBkZWZpbml0aW9uIGZvciB0aGlzIGludGVyZmFjZSBhcyBhCisgIC8vIHVuaXF1ZSBrZXkgZm9yIGxvb2tpbmcgdXAgdGhlIEludGVyZmFjZURhdGEgZm9yIHRoaXMgaW50ZXJmYWNlLgorICBpbnRwdHJfdCBrZXkgPSByZWludGVycHJldF9jYXN0PGludHB0cl90Pigmb3duX3Byb3BlcnRpZXMpOworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpOworICBpZiAoIWludGVyZmFjZV9kYXRhKSB7CisgICAgaW50ZXJmYWNlX2RhdGEgPSBDcmVhdGVDYWNoZWRJbnRlcmZhY2VEYXRhKCk7CisgICAgRENIRUNLKGludGVyZmFjZV9kYXRhKTsKKyAgICBnbG9iYWxfZW52aXJvbm1lbnQtPkNhY2hlSW50ZXJmYWNlRGF0YShrZXksIGludGVyZmFjZV9kYXRhKTsKKyAgICBEQ0hFQ0tfRVEoaW50ZXJmYWNlX2RhdGEsIGdsb2JhbF9lbnZpcm9ubWVudC0+R2V0SW50ZXJmYWNlRGF0YShrZXkpKTsKKyAgfQorICByZXR1cm4gaW50ZXJmYWNlX2RhdGE7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1RhcmdldEludGVyZmFjZTo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKGNvbnRleHQsIEdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IG5ld19vYmplY3QoY29udGV4dCwgSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmluc3RhbmNlX2NsYXNzX2RlZmluaXRpb24sIHByb3RvdHlwZSwgTlVMTCkpOworICBEQ0hFQ0sobmV3X29iamVjdCk7CisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgbmV3X29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKworLy9zdGF0aWMKK2NvbnN0IEpTQ2xhc3MqIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1RhcmdldEludGVyZmFjZTo6R2V0UHJvdG90eXBlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpIHsKKyAgICAvLyBDcmVhdGUgbmV3IHByb3RvdHlwZSB0aGF0IGhhcyBhbGwgdGhlIHByb3BzIGFuZCBtZXRob2RzCisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGU7Cit9CisKKy8vIHN0YXRpYworSlNPYmplY3QqIE1vempzVGFyZ2V0SW50ZXJmYWNlOjpHZXRJbnRlcmZhY2VPYmplY3QoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpIHsKKyAgICBJbml0aWFsaXplUHJvdG90eXBlQW5kSW50ZXJmYWNlT2JqZWN0KAorICAgICAgICBpbnRlcmZhY2VfZGF0YSwgY29udGV4dCwgZ2xvYmFsX29iamVjdCk7CisgIH0KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0OworfQorCisKK25hbWVzcGFjZSB7Cit9ICAvLyBuYW1lc3BhY2UKKworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdGFyZ2V0X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzYzk5YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3RhcmdldF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBjbGFuZy1mb3JtYXQgb2ZmCisKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSBiaW5kaW5ncy9jb2RlX2dlbmVyYXRvcl9jb2JhbHQucHkuIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiBiaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmgudGVtcGxhdGUKKworI2lmbmRlZiBNb3pqc1RhcmdldEludGVyZmFjZV9oCisjZGVmaW5lIE1vempzVGFyZ2V0SW50ZXJmYWNlX2gKKworI2luY2x1ZGUgImJhc2UvaGFzaF90YWJsZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xhenlfaW5zdGFuY2UuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzVGFyZ2V0SW50ZXJmYWNlIHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1RhcmdldEludGVyZmFjZV9oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3Rlc3RfZGljdGlvbmFyeS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190ZXN0X2RpY3Rpb25hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NTdkZmYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc190ZXN0X2RpY3Rpb25hcnkuaApAQCAtMCwwICsxLDI1MiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2RpY3Rpb25hcnktY29udmVyc2lvbi5oLnRlbXBsYXRlCisKKyNpZm5kZWYgVGVzdERpY3Rpb25hcnlfY29udmVyc2lvbl9oCisjZGVmaW5lIFRlc3REaWN0aW9uYXJ5X2NvbnZlcnNpb25faAorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGVzdF9kaWN0aW9uYXJ5LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VGVzdERpY3Rpb25hcnk7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7CisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNjcmlwdCB7CituYW1lc3BhY2UgbW96anMgeworCitpbmxpbmUgdm9pZCBUb0pTVmFsdWUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIGNvbnN0IFRlc3REaWN0aW9uYXJ5JiBpbl9kaWN0aW9uYXJ5LAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKSB7CisgIC8vIENyZWF0ZSBhIG5ldyBvYmplY3QgdGhhdCB3aWxsIGhvbGQgdGhlIGRpY3Rpb25hcnkgdmFsdWVzLgorICBKUzo6Um9vdGVkT2JqZWN0IGRpY3Rpb25hcnlfb2JqZWN0KAorICAgICAgY29udGV4dCwgSlNfTmV3T2JqZWN0KGNvbnRleHQsIE5VTEwsIE5VTEwsIE5VTEwpKTsKKyAgY29uc3QgaW50IGtQcm9wZXJ0eUF0dHJpYnV0ZXMgPSBKU1BST1BfRU5VTUVSQVRFOworICBpZiAoaW5fZGljdGlvbmFyeS5oYXNfYm9vbGVhbl9tZW1iZXIoKSkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBtZW1iZXJfdmFsdWUoY29udGV4dCk7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsIGluX2RpY3Rpb25hcnkuYm9vbGVhbl9tZW1iZXIoKSwgJm1lbWJlcl92YWx1ZSk7CisgICAgaWYgKCFKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcl92YWx1ZSwgTlVMTCwgTlVMTCwga1Byb3BlcnR5QXR0cmlidXRlcykpIHsKKyAgICAgIC8vIFNvbWUgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuCisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmIChpbl9kaWN0aW9uYXJ5Lmhhc19sb25nX21lbWJlcigpKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG1lbWJlcl92YWx1ZShjb250ZXh0KTsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwgaW5fZGljdGlvbmFyeS5sb25nX21lbWJlcigpLCAmbWVtYmVyX3ZhbHVlKTsKKyAgICBpZiAoIUpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImxvbmdNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLCBOVUxMLCBOVUxMLCBrUHJvcGVydHlBdHRyaWJ1dGVzKSkgeworICAgICAgLy8gU29tZSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4KKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKGluX2RpY3Rpb25hcnkuaGFzX2RvdWJsZV9tZW1iZXIoKSkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBtZW1iZXJfdmFsdWUoY29udGV4dCk7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsIGluX2RpY3Rpb25hcnkuZG91YmxlX21lbWJlcigpLCAmbWVtYmVyX3ZhbHVlKTsKKyAgICBpZiAoIUpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgImRvdWJsZU1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfdmFsdWUsIE5VTEwsIE5VTEwsIGtQcm9wZXJ0eUF0dHJpYnV0ZXMpKSB7CisgICAgICAvLyBTb21lIGludGVybmFsIGVycm9yIG9jY3VycmVkLgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBpZiAoaW5fZGljdGlvbmFyeS5oYXNfc3RyaW5nX21lbWJlcigpKSB7CisgICAgSlM6OlJvb3RlZFZhbHVlIG1lbWJlcl92YWx1ZShjb250ZXh0KTsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwgaW5fZGljdGlvbmFyeS5zdHJpbmdfbWVtYmVyKCksICZtZW1iZXJfdmFsdWUpOworICAgIGlmICghSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcl92YWx1ZSwgTlVMTCwgTlVMTCwga1Byb3BlcnR5QXR0cmlidXRlcykpIHsKKyAgICAgIC8vIFNvbWUgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuCisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmIChpbl9kaWN0aW9uYXJ5Lmhhc19pbnRlcmZhY2VfbWVtYmVyKCkpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgbWVtYmVyX3ZhbHVlKGNvbnRleHQpOworICAgIFRvSlNWYWx1ZShjb250ZXh0LCBpbl9kaWN0aW9uYXJ5LmludGVyZmFjZV9tZW1iZXIoKSwgJm1lbWJlcl92YWx1ZSk7CisgICAgaWYgKCFKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbnRlcmZhY2VNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLCBOVUxMLCBOVUxMLCBrUHJvcGVydHlBdHRyaWJ1dGVzKSkgeworICAgICAgLy8gU29tZSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4KKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKyAgaWYgKGluX2RpY3Rpb25hcnkuaGFzX21lbWJlcl93aXRoX2RlZmF1bHQoKSkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBtZW1iZXJfdmFsdWUoY29udGV4dCk7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsIGluX2RpY3Rpb25hcnkubWVtYmVyX3dpdGhfZGVmYXVsdCgpLCAmbWVtYmVyX3ZhbHVlKTsKKyAgICBpZiAoIUpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lbWJlcldpdGhEZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbWJlcl92YWx1ZSwgTlVMTCwgTlVMTCwga1Byb3BlcnR5QXR0cmlidXRlcykpIHsKKyAgICAgIC8vIFNvbWUgaW50ZXJuYWwgZXJyb3Igb2NjdXJyZWQuCisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisgIGlmIChpbl9kaWN0aW9uYXJ5Lmhhc19ub25fZGVmYXVsdF9tZW1iZXIoKSkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBtZW1iZXJfdmFsdWUoY29udGV4dCk7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsIGluX2RpY3Rpb25hcnkubm9uX2RlZmF1bHRfbWVtYmVyKCksICZtZW1iZXJfdmFsdWUpOworICAgIGlmICghSlNfRGVmaW5lUHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAibm9uRGVmYXVsdE1lbWJlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfdmFsdWUsIE5VTEwsIE5VTEwsIGtQcm9wZXJ0eUF0dHJpYnV0ZXMpKSB7CisgICAgICAvLyBTb21lIGludGVybmFsIGVycm9yIG9jY3VycmVkLgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorICBvdXRfdmFsdWUuc2V0KE9CSkVDVF9UT19KU1ZBTChkaWN0aW9uYXJ5X29iamVjdCkpOworfQorCitpbmxpbmUgdm9pZCBGcm9tSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3MsIEV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgIFRlc3REaWN0aW9uYXJ5KiBvdXRfZGljdGlvbmFyeSkgeworICBEQ0hFQ0tfRVEoMCwgY29udmVyc2lvbl9mbGFncykgPDwgIlVuZXhwZWN0ZWQgY29udmVyc2lvbiBmbGFncy4iOworICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNlcy1kaWN0aW9uYXJ5CisKKyAgaWYgKHZhbHVlLmlzVW5kZWZpbmVkKCkgfHwgdmFsdWUuaXNOdWxsKCkpIHsKKyAgICAvLyBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aWxsIGFzc2lnbiBhcHByb3ByaWF0ZSB2YWx1ZXMgdG8gZGljdGlvbmFyeQorICAgIC8vIG1lbWJlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgbGVhdmUgdGhlIG90aGVycyB1bnNldC4KKyAgICAqb3V0X2RpY3Rpb25hcnkgPSBUZXN0RGljdGlvbmFyeSgpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXZhbHVlLmlzT2JqZWN0KCkpIHsKKyAgICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBVbmRlZmluZWQsIE51bGwgb3IgT2JqZWN0LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgorICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtOb3RPYmplY3RUeXBlKTsKKyAgICByZXR1cm47CisgIH0KKyAgSlM6OlJvb3RlZE9iamVjdCBkaWN0aW9uYXJ5X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QodmFsdWUpKTsKKyAgSlM6OlJvb3RlZFZhbHVlIGJvb2xlYW5fbWVtYmVyKGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICJib29sZWFuTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICBib29sZWFuX21lbWJlci5hZGRyZXNzKCkpKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa1NpbXBsZUVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFib29sZWFuX21lbWJlci5pc1VuZGVmaW5lZCgpKSB7CisgICAgYm9vbCBjb252ZXJ0ZWRfdmFsdWU7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgYm9vbGVhbl9tZW1iZXIsIDAsIGV4Y2VwdGlvbl9zdGF0ZSwgJmNvbnZlcnRlZF92YWx1ZSk7CisgICAgaWYgKGNvbnRleHQtPmlzRXhjZXB0aW9uUGVuZGluZygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG91dF9kaWN0aW9uYXJ5LT5zZXRfYm9vbGVhbl9tZW1iZXIoY29udmVydGVkX3ZhbHVlKTsKKyAgfQorICBKUzo6Um9vdGVkVmFsdWUgbG9uZ19tZW1iZXIoY29udGV4dCk7CisgIGlmICghSlNfR2V0UHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgImxvbmdNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgIGxvbmdfbWVtYmVyLmFkZHJlc3MoKSkpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrU2ltcGxlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWxvbmdfbWVtYmVyLmlzVW5kZWZpbmVkKCkpIHsKKyAgICBpbnQzMl90IGNvbnZlcnRlZF92YWx1ZTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCBsb25nX21lbWJlciwgMCwgZXhjZXB0aW9uX3N0YXRlLCAmY29udmVydGVkX3ZhbHVlKTsKKyAgICBpZiAoY29udGV4dC0+aXNFeGNlcHRpb25QZW5kaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X2RpY3Rpb25hcnktPnNldF9sb25nX21lbWJlcihjb252ZXJ0ZWRfdmFsdWUpOworICB9CisgIEpTOjpSb290ZWRWYWx1ZSBkb3VibGVfbWVtYmVyKGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICJkb3VibGVNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZV9tZW1iZXIuYWRkcmVzcygpKSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtTaW1wbGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghZG91YmxlX21lbWJlci5pc1VuZGVmaW5lZCgpKSB7CisgICAgZG91YmxlIGNvbnZlcnRlZF92YWx1ZTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCBkb3VibGVfbWVtYmVyLCAwLCBleGNlcHRpb25fc3RhdGUsICZjb252ZXJ0ZWRfdmFsdWUpOworICAgIGlmIChjb250ZXh0LT5pc0V4Y2VwdGlvblBlbmRpbmcoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvdXRfZGljdGlvbmFyeS0+c2V0X2RvdWJsZV9tZW1iZXIoY29udmVydGVkX3ZhbHVlKTsKKyAgfQorICBKUzo6Um9vdGVkVmFsdWUgc3RyaW5nX21lbWJlcihjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAic3RyaW5nTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfbWVtYmVyLmFkZHJlc3MoKSkpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrU2ltcGxlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXN0cmluZ19tZW1iZXIuaXNVbmRlZmluZWQoKSkgeworICAgIHN0ZDo6c3RyaW5nIGNvbnZlcnRlZF92YWx1ZTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCBzdHJpbmdfbWVtYmVyLCAwLCBleGNlcHRpb25fc3RhdGUsICZjb252ZXJ0ZWRfdmFsdWUpOworICAgIGlmIChjb250ZXh0LT5pc0V4Y2VwdGlvblBlbmRpbmcoKSkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBvdXRfZGljdGlvbmFyeS0+c2V0X3N0cmluZ19tZW1iZXIoY29udmVydGVkX3ZhbHVlKTsKKyAgfQorICBKUzo6Um9vdGVkVmFsdWUgaW50ZXJmYWNlX21lbWJlcihjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCBkaWN0aW9uYXJ5X29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAiaW50ZXJmYWNlTWVtYmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2VfbWVtYmVyLmFkZHJlc3MoKSkpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrU2ltcGxlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIWludGVyZmFjZV9tZW1iZXIuaXNVbmRlZmluZWQoKSkgeworICAgIHNjb3BlZF9yZWZwdHI8QXJiaXRyYXJ5SW50ZXJmYWNlPiBjb252ZXJ0ZWRfdmFsdWU7CisgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgaW50ZXJmYWNlX21lbWJlciwgMCwgZXhjZXB0aW9uX3N0YXRlLCAmY29udmVydGVkX3ZhbHVlKTsKKyAgICBpZiAoY29udGV4dC0+aXNFeGNlcHRpb25QZW5kaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X2RpY3Rpb25hcnktPnNldF9pbnRlcmZhY2VfbWVtYmVyKGNvbnZlcnRlZF92YWx1ZSk7CisgIH0KKyAgSlM6OlJvb3RlZFZhbHVlIG1lbWJlcl93aXRoX2RlZmF1bHQoY29udGV4dCk7CisgIGlmICghSlNfR2V0UHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgIm1lbWJlcldpdGhEZWZhdWx0IiwKKyAgICAgICAgICAgICAgICAgICAgICBtZW1iZXJfd2l0aF9kZWZhdWx0LmFkZHJlc3MoKSkpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrU2ltcGxlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIW1lbWJlcl93aXRoX2RlZmF1bHQuaXNVbmRlZmluZWQoKSkgeworICAgIGludDMyX3QgY29udmVydGVkX3ZhbHVlOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIG1lbWJlcl93aXRoX2RlZmF1bHQsIDAsIGV4Y2VwdGlvbl9zdGF0ZSwgJmNvbnZlcnRlZF92YWx1ZSk7CisgICAgaWYgKGNvbnRleHQtPmlzRXhjZXB0aW9uUGVuZGluZygpKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIG91dF9kaWN0aW9uYXJ5LT5zZXRfbWVtYmVyX3dpdGhfZGVmYXVsdChjb252ZXJ0ZWRfdmFsdWUpOworICB9CisgIEpTOjpSb290ZWRWYWx1ZSBub25fZGVmYXVsdF9tZW1iZXIoY29udGV4dCk7CisgIGlmICghSlNfR2V0UHJvcGVydHkoY29udGV4dCwgZGljdGlvbmFyeV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgIm5vbkRlZmF1bHRNZW1iZXIiLAorICAgICAgICAgICAgICAgICAgICAgIG5vbl9kZWZhdWx0X21lbWJlci5hZGRyZXNzKCkpKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa1NpbXBsZUVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKCFub25fZGVmYXVsdF9tZW1iZXIuaXNVbmRlZmluZWQoKSkgeworICAgIGludDMyX3QgY29udmVydGVkX3ZhbHVlOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIG5vbl9kZWZhdWx0X21lbWJlciwgMCwgZXhjZXB0aW9uX3N0YXRlLCAmY29udmVydGVkX3ZhbHVlKTsKKyAgICBpZiAoY29udGV4dC0+aXNFeGNlcHRpb25QZW5kaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X2RpY3Rpb25hcnktPnNldF9ub25fZGVmYXVsdF9tZW1iZXIoY29udmVydGVkX3ZhbHVlKTsKKyAgfQorfQorCit9Cit9Cit9CisKKyNlbmRpZiAgLy8gVGVzdERpY3Rpb25hcnlfaApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc191bmlvbl90eXBlc19pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3VuaW9uX3R5cGVzX2ludGVyZmFjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ZGNhYzJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc191bmlvbl90eXBlc19pbnRlcmZhY2UuY2MKQEAgLTAsMCArMSw3MjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKworI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iYXNlX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19iYXNlX2ludGVyZmFjZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlVuaW9uVHlwZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNBcmJpdHJhcnlJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Jhc2VJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Ok9wYXF1ZUhhbmRsZUhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CisKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrSW50ZXJmYWNlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6RnJvbUpTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkludGVyZmFjZURhdGE7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzQ2FsbGJhY2tGdW5jdGlvbjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNQcm9wZXJ0eUVudW1lcmF0b3I7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzVXNlck9iamVjdEhvbGRlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6UHJveHlIYW5kbGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUb0pTVmFsdWU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlR5cGVUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyUHJpdmF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnTnVsbGFibGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1Jlc3RyaWN0ZWQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0TnVsbEFzRW1wdHlTdHJpbmc7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ1RyZWF0VW5kZWZpbmVkQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a05vQ29udmVyc2lvbkZsYWdzOworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlSGFuZGxlcigpCisgICAgICA6IFByb3h5SGFuZGxlcihpbmRleGVkX3Byb3BlcnR5X2hvb2tzLCBuYW1lZF9wcm9wZXJ0eV9ob29rcykge30KKworIHByaXZhdGU6CisgIHN0YXRpYyBOYW1lZFByb3BlcnR5SG9va3MgbmFtZWRfcHJvcGVydHlfaG9va3M7CisgIHN0YXRpYyBJbmRleGVkUHJvcGVydHlIb29rcyBpbmRleGVkX3Byb3BlcnR5X2hvb2tzOworfTsKKworUHJveHlIYW5kbGVyOjpOYW1lZFByb3BlcnR5SG9va3MKK01vempzVW5pb25UeXBlc0ludGVyZmFjZUhhbmRsZXI6Om5hbWVkX3Byb3BlcnR5X2hvb2tzID0geworICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorICBOVUxMLAorfTsKK1Byb3h5SGFuZGxlcjo6SW5kZXhlZFByb3BlcnR5SG9va3MKK01vempzVW5pb25UeXBlc0ludGVyZmFjZUhhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzVW5pb25UeXBlc0ludGVyZmFjZUhhbmRsZXI+CisgICAgcHJveHlfaGFuZGxlcjsKKworSlNCb29sIEhhc0luc3RhbmNlKEpTQ29udGV4dCAqY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB0eXBlLAorICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnAsIEpTQm9vbCAqc3VjY2VzcykgeworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LCBKU19HZXRHbG9iYWxGb3JPYmplY3QoY29udGV4dCwgdHlwZSkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisKKyAgLy8gfElzRGVsZWdhdGV8IHdhbGtzIHRoZSBwcm90b3R5cGUgY2hhaW4gb2YgYW4gb2JqZWN0IHJldHVybmluZyB0cnVlIGlmCisgIC8vIC5wcm90b3R5cGUgaXMgZm91bmQuCisgIGJvb2wgaXNfZGVsZWdhdGU7CisgIGlmICghSXNEZWxlZ2F0ZShjb250ZXh0LCBwcm90b3R5cGUsIHZwLCAmaXNfZGVsZWdhdGUpKSB7CisgICAgKnN1Y2Nlc3MgPSBmYWxzZTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAqc3VjY2VzcyA9IGlzX2RlbGVnYXRlOworICByZXR1cm4gdHJ1ZTsKK30KKworSW50ZXJmYWNlRGF0YSogQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpIHsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBuZXcgSW50ZXJmYWNlRGF0YSgpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uKSk7CisgIG1lbXNldCgmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24sIDAsCisgICAgICAgICBzaXplb2YoaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbikpOworCisgIEpTQ2xhc3MqIGluc3RhbmNlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5pbnN0YW5jZV9jbGFzc19kZWZpbml0aW9uOworICBjb25zdCBpbnQga0dsb2JhbEZsYWdzID0gMDsKKyAgaW5zdGFuY2VfY2xhc3MtPm5hbWUgPSAiVW5pb25UeXBlc0ludGVyZmFjZSI7CisgIGluc3RhbmNlX2NsYXNzLT5mbGFncyA9IGtHbG9iYWxGbGFncyB8IEpTQ0xBU1NfSEFTX1BSSVZBVEU7CisgIGluc3RhbmNlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisgIC8vIEZ1bmN0aW9uIHRvIGJlIGNhbGxlZCBiZWZvcmUgb24gb2JqZWN0IG9mIHRoaXMgY2xhc3MgaXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCisgIGluc3RhbmNlX2NsYXNzLT5maW5hbGl6ZSA9ICZXcmFwcGVyUHJpdmF0ZTo6RmluYWxpemVyOworICAvLyBDYWxsZWQgdG8gdHJhY2Ugb2JqZWN0cyB0aGF0IGNhbiBiZSByZWZlcmVuY2VkIGZyb20gdGhpcyBvYmplY3QuCisgIGluc3RhbmNlX2NsYXNzLT50cmFjZSA9ICZXcmFwcGVyUHJpdmF0ZTo6VHJhY2U7CisKKyAgSlNDbGFzcyogcHJvdG90eXBlX2NsYXNzID0gJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbjsKKyAgcHJvdG90eXBlX2NsYXNzLT5uYW1lID0gIlVuaW9uVHlwZXNJbnRlcmZhY2VQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJVbmlvblR5cGVzSW50ZXJmYWNlQ29uc3RydWN0b3IiOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5mbGFncyA9IDA7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmFkZFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Z2V0UHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnNldFByb3BlcnR5ID0gSlNfU3RyaWN0UHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5yZXNvbHZlID0gSlNfUmVzb2x2ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmNvbnZlcnQgPSBKU19Db252ZXJ0U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+aGFzSW5zdGFuY2UgPSAmSGFzSW5zdGFuY2U7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworSlNCb29sIGdldF91bmlvblByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+dW5pb25fcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3VuaW9uUHJvcGVydHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTQm9vbCBzdHJpY3QsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxVbmlvblR5cGVzSW50ZXJmYWNlPigpKSkgeworICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uKGNvbnRleHQpOworICAgIGV4Y2VwdGlvbi5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICBKUzo6Um9vdGVkVmFsdWUgcmVzdWx0X3ZhbHVlKGNvbnRleHQpOworCisgIFdyYXBwZXJQcml2YXRlKiB3cmFwcGVyX3ByaXZhdGUgPQorICAgICAgV3JhcHBlclByaXZhdGU6OkdldEZyb21PYmplY3QoY29udGV4dCwgb2JqZWN0KTsKKyAgVW5pb25UeXBlc0ludGVyZmFjZSogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxVbmlvblR5cGVzSW50ZXJmYWNlPigpLmdldCgpOworICBUeXBlVHJhaXRzPHNjcmlwdDo6VW5pb25UeXBlNDxzdGQ6OnN0cmluZywgYm9vbCwgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+LCBpbnQzMl90ID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3VuaW9uX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfdW5pb25XaXRoTnVsbGFibGVNZW1iZXJQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnVuaW9uX3dpdGhfbnVsbGFibGVfbWVtYmVyX3Byb3BlcnR5KCksCisgICAgICAgICAgICAgICZyZXN1bHRfdmFsdWUpOworICB9CisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHZwLnNldChyZXN1bHRfdmFsdWUpOworICB9CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIHNldF91bmlvbldpdGhOdWxsYWJsZU1lbWJlclByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxiYXNlOjpvcHRpb25hbDxzY3JpcHQ6OlVuaW9uVHlwZTI8ZG91YmxlLCBzdGQ6OnN0cmluZyA+ID4gPjo6Q29udmVyc2lvblR5cGUgdmFsdWU7CisgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZwLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICZ2YWx1ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaW1wbC0+c2V0X3VuaW9uX3dpdGhfbnVsbGFibGVfbWVtYmVyX3Byb3BlcnR5KHZhbHVlKTsKKyAgcmVzdWx0X3ZhbHVlLnNldChKUzo6VW5kZWZpbmVkSGFuZGxlVmFsdWUpOworICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBnZXRfbnVsbGFibGVVbmlvblByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKKworICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICBUb0pTVmFsdWUoY29udGV4dCwKKyAgICAgICAgICAgICAgaW1wbC0+bnVsbGFibGVfdW5pb25fcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X251bGxhYmxlVW5pb25Qcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlNCb29sIHN0cmljdCwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7CisgIFR5cGVUcmFpdHM8YmFzZTo6b3B0aW9uYWw8c2NyaXB0OjpVbmlvblR5cGUyPGRvdWJsZSwgc3RkOjpzdHJpbmcgPiA+ID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwgKGtDb252ZXJzaW9uRmxhZ051bGxhYmxlKSwgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfbnVsbGFibGVfdW5pb25fcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF91bmlvbkJhc2VQcm9wZXJ0eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCkgeworICBjb25zdCBKU0NsYXNzKiBwcm90b19jbGFzcyA9CisgICAgICBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBVbmlvblR5cGVzSW50ZXJmYWNlKiBpbXBsID0KKyAgICAgIHdyYXBwZXJfcHJpdmF0ZS0+d3JhcHBhYmxlPFVuaW9uVHlwZXNJbnRlcmZhY2U+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPnVuaW9uX2Jhc2VfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3VuaW9uQmFzZVByb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MoY29udGV4dCk7CisgIGlmIChwcm90b19jbGFzcyA9PSBKU19HZXRDbGFzcyhvYmplY3QpKSB7CisgICAgLy8gU2ltcGx5IHJldHVybnMgdHJ1ZSBpZiB0aGUgb2JqZWN0IGlzIHRoaXMgY2xhc3MncyBwcm90b3R5cGUgb2JqZWN0LgorICAgIC8vIFRoZXJlIGlzIG5vIG5lZWQgdG8gcmV0dXJuIGFueSB2YWx1ZSBkdWUgdG8gdGhlIG9iamVjdCBpcyBub3QgYSBwbGF0Zm9ybQorICAgIC8vIG9iamVjdC4gVGhlIGV4ZWN1dGlvbiByZWFjaGVzIGhlcmUgd2hlbiBPYmplY3QuZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yCisgICAgLy8gZ2V0cyBjYWxsZWQgb24gbmF0aXZlIG9iamVjdCBwcm90b3R5cGVzLgorICAgIHJldHVybiB0cnVlOworICB9CisKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPSBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpOworICBpZiAoIXdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKKyAgICAgICAgb2JqZWN0LCBiYXNlOjpHZXRUeXBlSWQ8VW5pb25UeXBlc0ludGVyZmFjZT4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFVuaW9uVHlwZXNJbnRlcmZhY2UqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8VW5pb25UeXBlc0ludGVyZmFjZT4oKS5nZXQoKTsKKyAgVHlwZVRyYWl0czxzY3JpcHQ6OlVuaW9uVHlwZTI8c2NvcGVkX3JlZnB0cjxCYXNlSW50ZXJmYWNlPiwgc3RkOjpzdHJpbmcgPiA+OjpDb252ZXJzaW9uVHlwZSB2YWx1ZTsKKyAgRnJvbUpTVmFsdWUoY29udGV4dCwgdnAsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgJnZhbHVlKTsKKyAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpbXBsLT5zZXRfdW5pb25fYmFzZV9wcm9wZXJ0eSh2YWx1ZSk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJ1bmlvblByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfdW5pb25Qcm9wZXJ0eSksCisgICAgICBKU09QX1dSQVBQRVIoJnNldF91bmlvblByb3BlcnR5KSwKKyAgfSwKKyAgeyAgLy8gUmVhZC9Xcml0ZSBwcm9wZXJ0eQorICAgICAgInVuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHkiLCAwLAorICAgICAgSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBKU09QX1dSQVBQRVIoJmdldF91bmlvbldpdGhOdWxsYWJsZU1lbWJlclByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3VuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHkpLAorICB9LAorICB7ICAvLyBSZWFkL1dyaXRlIHByb3BlcnR5CisgICAgICAibnVsbGFibGVVbmlvblByb3BlcnR5IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfbnVsbGFibGVVbmlvblByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X251bGxhYmxlVW5pb25Qcm9wZXJ0eSksCisgIH0sCisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJ1bmlvbkJhc2VQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3VuaW9uQmFzZVByb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3VuaW9uQmFzZVByb3BlcnR5KSwKKyAgfSwKKyAgSlNfUFNfRU5ECit9OworCitjb25zdCBKU0Z1bmN0aW9uU3BlYyBwcm90b3R5cGVfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgaW50ZXJmYWNlX29iamVjdF9wcm9wZXJ0aWVzW10gPSB7CisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgaW50ZXJmYWNlX29iamVjdF9mdW5jdGlvbnNbXSA9IHsKKyAgSlNfRlNfRU5ECit9OworCitjb25zdCBKU1Byb3BlcnR5U3BlYyBvd25fcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK3ZvaWQgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSwgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBEQ0hFQ0soIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKEpTX0lzR2xvYmFsT2JqZWN0KGdsb2JhbF9vYmplY3QpKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHBhcmVudF9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRPYmplY3RQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBEQ0hFQ0socGFyZW50X3Byb3RvdHlwZSk7CisKKyAgLy8gQ3JlYXRlIHRoZSBQcm90b3R5cGUgb2JqZWN0LgorICBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZV9jbGFzc19kZWZpbml0aW9uLCBwYXJlbnRfcHJvdG90eXBlLAorICAgICAgTlVMTCk7CisgIGJvb2wgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoCisgICAgICBjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlLCBwcm90b3R5cGVfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9mdW5jdGlvbnMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbl9wcm90b3R5cGUoCisgICAgICBjb250ZXh0LCBKU19HZXRGdW5jdGlvblByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhmdW5jdGlvbl9wcm90b3R5cGUpOworICAvLyBDcmVhdGUgdGhlIEludGVyZmFjZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0ID0gSlNfTmV3T2JqZWN0V2l0aEdpdmVuUHJvdG8oCisgICAgICBjb250ZXh0LCAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgIGZ1bmN0aW9uX3Byb3RvdHlwZSwgTlVMTCk7CisKKyAgLy8gQWRkIHRoZSBJbnRlcmZhY2VPYmplY3QubmFtZSBwcm9wZXJ0eS4KKyAgSlM6OlJvb3RlZE9iamVjdCByb290ZWRfaW50ZXJmYWNlX29iamVjdCgKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIG5hbWVfdmFsdWUoY29udGV4dCk7CisgIGNvbnN0IGNoYXIgbmFtZVtdID0KKyAgICAgICJVbmlvblR5cGVzSW50ZXJmYWNlIjsKKyAgbmFtZV92YWx1ZS5zZXRTdHJpbmcoSlNfTmV3U3RyaW5nQ29weVooY29udGV4dCwgbmFtZSkpOworICBzdWNjZXNzID0KKyAgICAgIEpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LCAibmFtZSIsIG5hbWVfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICBKU19Qcm9wZXJ0eVN0dWIsIEpTX1N0cmljdFByb3BlcnR5U3R1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgIEpTUFJPUF9SRUFET05MWSk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICAvLyBEZWZpbmUgaW50ZXJmYWNlIG9iamVjdCBwcm9wZXJ0aWVzIChpbmNsdWRpbmcgY29uc3RhbnRzKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZVByb3BlcnRpZXMoY29udGV4dCwgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllcyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgZnVuY3Rpb25zIChzdGF0aWMpLgorICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisKKyAgLy8gU2V0IHRoZSBQcm90b3R5cGUuY29uc3RydWN0b3IgYW5kIENvbnN0cnVjdG9yLnByb3RvdHlwZSBwcm9wZXJ0aWVzLgorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3Qgcm9vdGVkX3Byb3RvdHlwZShjb250ZXh0LCBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgc3VjY2VzcyA9IEpTX0xpbmtDb25zdHJ1Y3RvckFuZFByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsCisgICAgICByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgIHJvb3RlZF9wcm90b3R5cGUpOworICBEQ0hFQ0soc3VjY2Vzcyk7Cit9CisKK0ludGVyZmFjZURhdGEqIEdldEludGVyZmFjZURhdGEoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICAvLyBVc2UgdGhlIGFkZHJlc3Mgb2YgdGhlIHByb3BlcnRpZXMgZGVmaW5pdGlvbiBmb3IgdGhpcyBpbnRlcmZhY2UgYXMgYQorICAvLyB1bmlxdWUga2V5IGZvciBsb29raW5nIHVwIHRoZSBJbnRlcmZhY2VEYXRhIGZvciB0aGlzIGludGVyZmFjZS4KKyAgaW50cHRyX3Qga2V5ID0gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4oJm93bl9wcm9wZXJ0aWVzKTsKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YSkgeworICAgIGludGVyZmFjZV9kYXRhID0gQ3JlYXRlQ2FjaGVkSW50ZXJmYWNlRGF0YSgpOworICAgIERDSEVDSyhpbnRlcmZhY2VfZGF0YSk7CisgICAgZ2xvYmFsX2Vudmlyb25tZW50LT5DYWNoZUludGVyZmFjZURhdGEoa2V5LCBpbnRlcmZhY2VfZGF0YSk7CisgICAgRENIRUNLX0VRKGludGVyZmFjZV9kYXRhLCBnbG9iYWxfZW52aXJvbm1lbnQtPkdldEludGVyZmFjZURhdGEoa2V5KSk7CisgIH0KKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjb3BlZF9yZWZwdHI8V3JhcHBhYmxlPiYgd3JhcHBhYmxlKSB7CisgIERDSEVDSyhNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KSk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsCisgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KS0+Z2xvYmFsX29iamVjdCgpKTsKKyAgRENIRUNLKGdsb2JhbF9vYmplY3QpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKHByb3RvdHlwZSk7CisgIEpTOjpSb290ZWRPYmplY3QgbmV3X29iamVjdChjb250ZXh0LCBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgcHJvdG90eXBlLCBOVUxMKSk7CisgIERDSEVDSyhuZXdfb2JqZWN0KTsKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm94eShjb250ZXh0LAorICAgICAgUHJveHlIYW5kbGVyOjpOZXdQcm94eShjb250ZXh0LCBuZXdfb2JqZWN0LCBwcm90b3R5cGUsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3h5X2hhbmRsZXIuUG9pbnRlcigpKSk7CisgIFdyYXBwZXJQcml2YXRlOjpBZGRQcml2YXRlRGF0YShjb250ZXh0LCBwcm94eSwgd3JhcHBhYmxlKTsKKyAgcmV0dXJuIHByb3h5OworfQorCisvL3N0YXRpYworY29uc3QgSlNDbGFzcyogTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcygKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCkgeworICBEQ0hFQ0soTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbF9vYmplY3QoCisgICAgICBjb250ZXh0LAorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCktPmdsb2JhbF9vYmplY3QoKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZShjb250ZXh0LCBHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworICBKU0NsYXNzKiBwcm90b19jbGFzcyA9IEpTX0dldENsYXNzKCpwcm90b3R5cGUuYWRkcmVzcygpKTsKKyAgcmV0dXJuIHByb3RvX2NsYXNzOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1VuaW9uVHlwZXNJbnRlcmZhY2U6OkdldEludGVyZmFjZU9iamVjdCgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCkgeworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICByZXR1cm4gaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3Q7Cit9CisKKworbmFtZXNwYWNlIHsKK30gIC8vIG5hbWVzcGFjZQorCisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdW5pb25fdHlwZXNfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5ZDExYzYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oCkBAIC0wLDAgKzEsNTIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzVW5pb25UeXBlc0ludGVyZmFjZV9oCisjZGVmaW5lIE1vempzVW5pb25UeXBlc0ludGVyZmFjZV9oCisKKyNpbmNsdWRlICJiYXNlL2hhc2hfdGFibGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlc19pbnRlcmZhY2UuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzVW5pb25UeXBlc0ludGVyZmFjZSB7CisgcHVibGljOgorICBzdGF0aWMgSlNPYmplY3QqIENyZWF0ZVByb3h5KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+JiB3cmFwcGFibGUpOworICBzdGF0aWMgY29uc3QgSlNDbGFzcyogUHJvdG90eXBlQ2xhc3MoSlNDb250ZXh0KiBjb250ZXh0KTsKKyAgc3RhdGljIEpTT2JqZWN0KiBHZXRQcm90b3R5cGUoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpOworICBzdGF0aWMgSlNPYmplY3QqIEdldEludGVyZmFjZU9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gTW96anNVbmlvblR5cGVzSW50ZXJmYWNlX2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfd2luZG93LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc193aW5kb3cuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTZmOWFlZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfd2luZG93LmNjCkBAIC0wLDAgKzEsMTA1MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQorCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfd2luZG93LmgiCisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iYXNlX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jvb2xlYW5fdHlwZV90ZXN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25kaXRpb25hbF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rlcml2ZWRfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGljdGlvbmFyeV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaXNhYmxlZF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZW51bWVyYXRpb25faW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25zX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4dGVuZGVkX2lkbF9hdHRyaWJ1dGVzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nbG9iYWxfaW50ZXJmYWNlX3BhcmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ltcGxlbWVudGVkX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Jhc2VfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2NvbnN0YW50c19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZGVyaXZlZF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19kaWN0aW9uYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2Rpc2FibGVkX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW1wbGVtZW50ZWRfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zZXF1ZW5jZV91c2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9tb3pqc19zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfdGFyZ2V0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3dpbmRvdy5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXF1ZW5jZV91c2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGFyZ2V0X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3dpbmRvdy5oIgorCisjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNmcmllbmRhcGkuaCIKKworbmFtZXNwYWNlIHsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OldpbmRvdzsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzV2luZG93OwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6QmFzZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkNhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTsKKyNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDb25kaXRpb25hbEludGVyZmFjZTsKKyNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RhbnRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6Q29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpET01TdHJpbmdUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRlcml2ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpEaWN0aW9uYXJ5SW50ZXJmYWNlOworI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkRpc2FibGVkSW50ZXJmYWNlOworI2VuZGlmICAvLyBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFbnVtZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbk9iamVjdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OkV4Y2VwdGlvbnNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpHZXRPcGFxdWVSb290SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6R2xvYmFsSW50ZXJmYWNlUGFyZW50OwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW1wbGVtZW50ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpJbmRleGVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6SW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQXJiaXRyYXJ5SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCYXNlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlOworI2lmIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U7CisjZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RhbnRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNDb25zdHJ1Y3RvckludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNET01TdHJpbmdUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEZXJpdmVkSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNEaWN0aW9uYXJ5SW50ZXJmYWNlOworI2lmIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRGlzYWJsZWRJbnRlcmZhY2U7CisjZW5kaWYgIC8vIGRlZmluZWQoTk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRW51bWVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXhjZXB0aW9uc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzSW1wbGVtZW50ZWRJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05hbWVkR2V0dGVySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1B1dEZvcndhcmRzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTZXF1ZW5jZVVzZXI7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpNb3pqc1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok1vempzVGFyZ2V0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNVbmlvblR5cGVzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TW96anNXaW5kb3c7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TmFtZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok5vQ29uc3RydWN0b3JJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6TnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6Ok9wZXJhdGlvbnNUZXN0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6UHV0Rm9yd2FyZHNJbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTZXF1ZW5jZVVzZXI7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U7Cit1c2luZyBjb2JhbHQ6OmJpbmRpbmdzOjp0ZXN0aW5nOjpTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OlN0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VGFyZ2V0SW50ZXJmYWNlOwordXNpbmcgY29iYWx0OjpiaW5kaW5nczo6dGVzdGluZzo6VW5pb25UeXBlc0ludGVyZmFjZTsKK3VzaW5nIGNvYmFsdDo6YmluZGluZ3M6OnRlc3Rpbmc6OldpbmRvdzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdFZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKKwordXNpbmcgY29iYWx0OjpzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tJbnRlcmZhY2VUcmFpdHM7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6RXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6V3JhcHBhYmxlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpGcm9tSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1Byb3BlcnR5RW51bWVyYXRvcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNVc2VyT2JqZWN0SG9sZGVyOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlckZhY3Rvcnk7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJQcml2YXRlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdOdWxsYWJsZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnUmVzdHJpY3RlZDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXROdWxsQXNFbXB0eVN0cmluZzsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6a0NvbnZlcnNpb25GbGFnVHJlYXRVbmRlZmluZWRBc0VtcHR5U3RyaW5nOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprTm9Db252ZXJzaW9uRmxhZ3M7CitKU09iamVjdCogRHVtbXlGdW5jdG9yKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxXcmFwcGFibGU+JiB3cmFwcGFibGUpIHsKKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gTlVMTDsKK30KK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK25hbWVzcGFjZSB7CisKK2NsYXNzIE1vempzV2luZG93SGFuZGxlciA6IHB1YmxpYyBQcm94eUhhbmRsZXIgeworIHB1YmxpYzoKKyAgTW96anNXaW5kb3dIYW5kbGVyKCkKKyAgICAgIDogUHJveHlIYW5kbGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3MsIG5hbWVkX3Byb3BlcnR5X2hvb2tzKSB7fQorCisgcHJpdmF0ZToKKyAgc3RhdGljIE5hbWVkUHJvcGVydHlIb29rcyBuYW1lZF9wcm9wZXJ0eV9ob29rczsKKyAgc3RhdGljIEluZGV4ZWRQcm9wZXJ0eUhvb2tzIGluZGV4ZWRfcHJvcGVydHlfaG9va3M7Cit9OworCitQcm94eUhhbmRsZXI6Ok5hbWVkUHJvcGVydHlIb29rcworTW96anNXaW5kb3dIYW5kbGVyOjpuYW1lZF9wcm9wZXJ0eV9ob29rcyA9IHsKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKKyAgTlVMTCwKK307CitQcm94eUhhbmRsZXI6OkluZGV4ZWRQcm9wZXJ0eUhvb2tzCitNb3pqc1dpbmRvd0hhbmRsZXI6OmluZGV4ZWRfcHJvcGVydHlfaG9va3MgPSB7CisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCisgIE5VTEwsCit9OworCitzdGF0aWMgYmFzZTo6TGF6eUluc3RhbmNlPE1vempzV2luZG93SGFuZGxlcj4KKyAgICBwcm94eV9oYW5kbGVyOworCitKU0Jvb2wgSGFzSW5zdGFuY2UoSlNDb250ZXh0ICpjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHR5cGUsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSB2cCwgSlNCb29sICpzdWNjZXNzKSB7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX0dldEdsb2JhbEZvck9iamVjdChjb250ZXh0LCB0eXBlKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICBKUzo6Um9vdGVkT2JqZWN0IHByb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIE1vempzV2luZG93OjpHZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCkpOworCisgIC8vIHxJc0RlbGVnYXRlfCB3YWxrcyB0aGUgcHJvdG90eXBlIGNoYWluIG9mIGFuIG9iamVjdCByZXR1cm5pbmcgdHJ1ZSBpZgorICAvLyAucHJvdG90eXBlIGlzIGZvdW5kLgorICBib29sIGlzX2RlbGVnYXRlOworICBpZiAoIUlzRGVsZWdhdGUoY29udGV4dCwgcHJvdG90eXBlLCB2cCwgJmlzX2RlbGVnYXRlKSkgeworICAgICpzdWNjZXNzID0gZmFsc2U7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgKnN1Y2Nlc3MgPSBpc19kZWxlZ2F0ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK0ludGVyZmFjZURhdGEqIENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKSB7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gbmV3IEludGVyZmFjZURhdGEoKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbikpOworICBtZW1zZXQoJmludGVyZmFjZV9kYXRhLT5wcm90b3R5cGVfY2xhc3NfZGVmaW5pdGlvbiwgMCwKKyAgICAgICAgIHNpemVvZihpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24pKTsKKyAgbWVtc2V0KCZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLCAwLAorICAgICAgICAgc2l6ZW9mKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0X2NsYXNzX2RlZmluaXRpb24pKTsKKworICBKU0NsYXNzKiBpbnN0YW5jZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbjsKKyAgY29uc3QgaW50IGtHbG9iYWxGbGFncyA9IEpTQ0xBU1NfR0xPQkFMX0ZMQUdTOworICBpbnN0YW5jZV9jbGFzcy0+bmFtZSA9ICJXaW5kb3ciOworICBpbnN0YW5jZV9jbGFzcy0+ZmxhZ3MgPSBrR2xvYmFsRmxhZ3MgfCBKU0NMQVNTX0hBU19QUklWQVRFOworICBpbnN0YW5jZV9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgaW5zdGFuY2VfY2xhc3MtPmdldFByb3BlcnR5ID0gSlNfUHJvcGVydHlTdHViOworICBpbnN0YW5jZV9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGluc3RhbmNlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+cmVzb2x2ZSA9IEpTX1Jlc29sdmVTdHViOworICBpbnN0YW5jZV9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICAvLyBGdW5jdGlvbiB0byBiZSBjYWxsZWQgYmVmb3JlIG9uIG9iamVjdCBvZiB0aGlzIGNsYXNzIGlzIGdhcmJhZ2UgY29sbGVjdGVkLgorICBpbnN0YW5jZV9jbGFzcy0+ZmluYWxpemUgPSAmV3JhcHBlclByaXZhdGU6OkZpbmFsaXplcjsKKyAgLy8gQ2FsbGVkIHRvIHRyYWNlIG9iamVjdHMgdGhhdCBjYW4gYmUgcmVmZXJlbmNlZCBmcm9tIHRoaXMgb2JqZWN0LgorICBpbnN0YW5jZV9jbGFzcy0+dHJhY2UgPSAmV3JhcHBlclByaXZhdGU6OlRyYWNlOworCisgIEpTQ2xhc3MqIHByb3RvdHlwZV9jbGFzcyA9ICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb247CisgIHByb3RvdHlwZV9jbGFzcy0+bmFtZSA9ICJXaW5kb3dQcm90b3R5cGUiOworICBwcm90b3R5cGVfY2xhc3MtPmZsYWdzID0gMDsKKyAgcHJvdG90eXBlX2NsYXNzLT5hZGRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5kZWxQcm9wZXJ0eSA9IEpTX0RlbGV0ZVByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5zZXRQcm9wZXJ0eSA9IEpTX1N0cmljdFByb3BlcnR5U3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5lbnVtZXJhdGUgPSBKU19FbnVtZXJhdGVTdHViOworICBwcm90b3R5cGVfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgcHJvdG90eXBlX2NsYXNzLT5jb252ZXJ0ID0gSlNfQ29udmVydFN0dWI7CisKKyAgSlNDbGFzcyogaW50ZXJmYWNlX29iamVjdF9jbGFzcyA9CisgICAgICAmaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3RfY2xhc3NfZGVmaW5pdGlvbjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+bmFtZSA9ICJXaW5kb3dDb25zdHJ1Y3RvciI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmZsYWdzID0gMDsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+YWRkUHJvcGVydHkgPSBKU19Qcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmRlbFByb3BlcnR5ID0gSlNfRGVsZXRlUHJvcGVydHlTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5nZXRQcm9wZXJ0eSA9IEpTX1Byb3BlcnR5U3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+c2V0UHJvcGVydHkgPSBKU19TdHJpY3RQcm9wZXJ0eVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPmVudW1lcmF0ZSA9IEpTX0VudW1lcmF0ZVN0dWI7CisgIGludGVyZmFjZV9vYmplY3RfY2xhc3MtPnJlc29sdmUgPSBKU19SZXNvbHZlU3R1YjsKKyAgaW50ZXJmYWNlX29iamVjdF9jbGFzcy0+Y29udmVydCA9IEpTX0NvbnZlcnRTdHViOworICBpbnRlcmZhY2Vfb2JqZWN0X2NsYXNzLT5oYXNJbnN0YW5jZSA9ICZIYXNJbnN0YW5jZTsKKyAgcmV0dXJuIGludGVyZmFjZV9kYXRhOworfQorCitKU0Jvb2wgZ2V0X3dpbmRvd1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzV2luZG93OjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxXaW5kb3c+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBXaW5kb3cqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8V2luZG93PigpLmdldCgpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT53aW5kb3dfcHJvcGVydHkoKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgc2V0X3dpbmRvd1Byb3BlcnR5KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU0Jvb2wgc3RyaWN0LCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIHZwKSB7CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIE1vempzV2luZG93OjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisgIGlmICghd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAorICAgICAgICBvYmplY3QsIGJhc2U6OkdldFR5cGVJZDxXaW5kb3c+KCkpKSB7CisgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb24oY29udGV4dCk7CisgICAgZXhjZXB0aW9uLlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtEb2VzTm90SW1wbGVtZW50SW50ZXJmYWNlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7CisgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dCk7CisKKyAgV3JhcHBlclByaXZhdGUqIHdyYXBwZXJfcHJpdmF0ZSA9CisgICAgICBXcmFwcGVyUHJpdmF0ZTo6R2V0RnJvbU9iamVjdChjb250ZXh0LCBvYmplY3QpOworICBXaW5kb3cqIGltcGwgPQorICAgICAgd3JhcHBlcl9wcml2YXRlLT53cmFwcGFibGU8V2luZG93PigpLmdldCgpOworICBUeXBlVHJhaXRzPHN0ZDo6c3RyaW5nID46OkNvbnZlcnNpb25UeXBlIHZhbHVlOworICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2cCwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAorICAgICAgICAgICAgICAmdmFsdWUpOworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGltcGwtPnNldF93aW5kb3dfcHJvcGVydHkodmFsdWUpOworICByZXN1bHRfdmFsdWUuc2V0KEpTOjpVbmRlZmluZWRIYW5kbGVWYWx1ZSk7CisgIHJldHVybiAhZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKTsKK30KKworSlNCb29sIGdldF93aW5kb3coCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgdnApIHsKKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNXaW5kb3c6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFdpbmRvdyogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7CisKKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgVG9KU1ZhbHVlKGNvbnRleHQsCisgICAgICAgICAgICAgIGltcGwtPndpbmRvdygpLAorICAgICAgICAgICAgICAmcmVzdWx0X3ZhbHVlKTsKKyAgfQorICBpZiAoIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKKyAgICB2cC5zZXQocmVzdWx0X3ZhbHVlKTsKKyAgfQorICByZXR1cm4gIWV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCk7Cit9CisKK0pTQm9vbCBmY25fZ2V0U3RhY2tUcmFjZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNXaW5kb3c6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFdpbmRvdyogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7CisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworCisgIGlmICghZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgIFRvSlNWYWx1ZShjb250ZXh0LAorICAgICAgICAgICAgICBpbXBsLT5HZXRTdGFja1RyYWNlKGNhbGx3aXRoX2dsb2JhbF9lbnZpcm9ubWVudC0+R2V0U3RhY2tUcmFjZSgpKSwKKyAgICAgICAgICAgICAgJnJlc3VsdF92YWx1ZSk7CisgIH0KKyAgaWYgKCFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgYXJncy5ydmFsKCkuc2V0KHJlc3VsdF92YWx1ZSk7CisgIH0KKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCitKU0Jvb2wgZmNuX3dpbmRvd09wZXJhdGlvbigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIHVpbnQzMl90IGFyZ2MsIEpTOjpWYWx1ZSAqdnApIHsKKyAgSlM6OkNhbGxBcmdzIGFyZ3MgPSBKUzo6Q2FsbEFyZ3NGcm9tVnAoYXJnYywgdnApOworICAvLyBDb21wdXRlIHRoZSAndGhpcycgdmFsdWUuCisgIEpTOjpSb290ZWRWYWx1ZSB0aGlzX3ZhbHVlKGNvbnRleHQsIEpTX0NvbXB1dGVUaGlzKGNvbnRleHQsIHZwKSk7CisgIC8vICd0aGlzJyBzaG91bGQgYmUgYW4gb2JqZWN0LgorICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0KTsKKyAgaWYgKEpTX1R5cGVPZlZhbHVlKGNvbnRleHQsIHRoaXNfdmFsdWUpICE9IEpTVFlQRV9PQkpFQ1QpIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB0aGlzX3ZhbHVlLCBvYmplY3QuYWRkcmVzcygpKSkgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAgTW96anNXaW5kb3c6OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CisgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOworICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgaWYgKCF3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCisgICAgICAgIG9iamVjdCwgYmFzZTo6R2V0VHlwZUlkPFdpbmRvdz4oKSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a0RvZXNOb3RJbXBsZW1lbnRJbnRlcmZhY2UpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgSlM6OlJvb3RlZFZhbHVlIHJlc3VsdF92YWx1ZShjb250ZXh0KTsKKworICBXcmFwcGVyUHJpdmF0ZSogd3JhcHBlcl9wcml2YXRlID0KKyAgICAgIFdyYXBwZXJQcml2YXRlOjpHZXRGcm9tT2JqZWN0KGNvbnRleHQsIG9iamVjdCk7CisgIFdpbmRvdyogaW1wbCA9CisgICAgICB3cmFwcGVyX3ByaXZhdGUtPndyYXBwYWJsZTxXaW5kb3c+KCkuZ2V0KCk7CisKKyAgaW1wbC0+V2luZG93T3BlcmF0aW9uKCk7CisgIHJlc3VsdF92YWx1ZS5zZXQoSlM6OlVuZGVmaW5lZEhhbmRsZVZhbHVlKTsKKyAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOworfQorCisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIHByb3RvdHlwZV9wcm9wZXJ0aWVzW10gPSB7CisgIHsgIC8vIFJlYWQvV3JpdGUgcHJvcGVydHkKKyAgICAgICJ3aW5kb3dQcm9wZXJ0eSIsIDAsCisgICAgICBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURSwKKyAgICAgIEpTT1BfV1JBUFBFUigmZ2V0X3dpbmRvd1Byb3BlcnR5KSwKKyAgICAgIEpTT1BfV1JBUFBFUigmc2V0X3dpbmRvd1Byb3BlcnR5KSwKKyAgfSwKKyAgeyAgLy8gUmVhZG9ubHkgYXR0cmlidXRlCisgICAgICAid2luZG93IiwgMCwKKyAgICAgIEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFIHwgSlNQUk9QX1JFQURPTkxZLAorICAgICAgSlNPUF9XUkFQUEVSKCZnZXRfd2luZG93KSwKKyAgICAgIEpTT1BfTlVMTFdSQVBQRVIsCisgIH0sCisgIEpTX1BTX0VORAorfTsKKworY29uc3QgSlNGdW5jdGlvblNwZWMgcHJvdG90eXBlX2Z1bmN0aW9uc1tdID0geworICB7CisgICAgICAiZ2V0U3RhY2tUcmFjZSIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl9nZXRTdGFja1RyYWNlKSwKKyAgICAgIDAsCisgICAgICBKU1BST1BfRU5VTUVSQVRFLAorICAgICAgTlVMTCwKKyAgfSwKKyAgeworICAgICAgIndpbmRvd09wZXJhdGlvbiIsCisgICAgICBKU09QX1dSQVBQRVIoJmZjbl93aW5kb3dPcGVyYXRpb24pLAorICAgICAgMCwKKyAgICAgIEpTUFJPUF9FTlVNRVJBVEUsCisgICAgICBOVUxMLAorICB9LAorICBKU19GU19FTkQKK307CisKK2NvbnN0IEpTUHJvcGVydHlTcGVjIGludGVyZmFjZV9vYmplY3RfcHJvcGVydGllc1tdID0geworICBKU19QU19FTkQKK307CisKK2NvbnN0IEpTRnVuY3Rpb25TcGVjIGludGVyZmFjZV9vYmplY3RfZnVuY3Rpb25zW10gPSB7CisgIEpTX0ZTX0VORAorfTsKKworY29uc3QgSlNQcm9wZXJ0eVNwZWMgb3duX3Byb3BlcnRpZXNbXSA9IHsKKyAgSlNfUFNfRU5ECit9OworCit2b2lkIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEsIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlT2JqZWN0IGdsb2JhbF9vYmplY3QpIHsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKTsKKyAgRENIRUNLKCFpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwYXJlbnRfcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNHbG9iYWxJbnRlcmZhY2VQYXJlbnQ6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwYXJlbnRfcHJvdG90eXBlKTsKKworICAvLyBDcmVhdGUgdGhlIFByb3RvdHlwZSBvYmplY3QuCisgIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlX2NsYXNzX2RlZmluaXRpb24sIHBhcmVudF9wcm90b3R5cGUsCisgICAgICBOVUxMKTsKKyAgYm9vbCBzdWNjZXNzID0gSlNfRGVmaW5lUHJvcGVydGllcygKKyAgICAgIGNvbnRleHQsIGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUsIHByb3RvdHlwZV9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworICBzdWNjZXNzID0gSlNfRGVmaW5lRnVuY3Rpb25zKAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSwgcHJvdG90eXBlX2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uX3Byb3RvdHlwZSgKKyAgICAgIGNvbnRleHQsIEpTX0dldEZ1bmN0aW9uUHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgRENIRUNLKGZ1bmN0aW9uX3Byb3RvdHlwZSk7CisgIC8vIENyZWF0ZSB0aGUgSW50ZXJmYWNlIG9iamVjdC4KKyAgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QgPSBKU19OZXdPYmplY3RXaXRoR2l2ZW5Qcm90bygKKyAgICAgIGNvbnRleHQsICZpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdF9jbGFzc19kZWZpbml0aW9uLAorICAgICAgZnVuY3Rpb25fcHJvdG90eXBlLCBOVUxMKTsKKworICAvLyBBZGQgdGhlIEludGVyZmFjZU9iamVjdC5uYW1lIHByb3BlcnR5LgorICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0KAorICAgICAgY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPmludGVyZmFjZV9vYmplY3QpOworICBKUzo6Um9vdGVkVmFsdWUgbmFtZV92YWx1ZShjb250ZXh0KTsKKyAgY29uc3QgY2hhciBuYW1lW10gPQorICAgICAgIldpbmRvdyI7CisgIG5hbWVfdmFsdWUuc2V0U3RyaW5nKEpTX05ld1N0cmluZ0NvcHlaKGNvbnRleHQsIG5hbWUpKTsKKyAgc3VjY2VzcyA9CisgICAgICBKU19EZWZpbmVQcm9wZXJ0eShjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwgIm5hbWUiLCBuYW1lX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgSlNfUHJvcGVydHlTdHViLCBKU19TdHJpY3RQcm9wZXJ0eVN0dWIsCisgICAgICAgICAgICAgICAgICAgICAgICBKU1BST1BfUkVBRE9OTFkpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisKKyAgLy8gRGVmaW5lIGludGVyZmFjZSBvYmplY3QgcHJvcGVydGllcyAoaW5jbHVkaW5nIGNvbnN0YW50cykuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIHJvb3RlZF9pbnRlcmZhY2Vfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X3Byb3BlcnRpZXMpOworICBEQ0hFQ0soc3VjY2Vzcyk7CisgIC8vIERlZmluZSBpbnRlcmZhY2Ugb2JqZWN0IGZ1bmN0aW9ucyAoc3RhdGljKS4KKyAgc3VjY2VzcyA9IEpTX0RlZmluZUZ1bmN0aW9ucyhjb250ZXh0LCByb290ZWRfaW50ZXJmYWNlX29iamVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcmZhY2Vfb2JqZWN0X2Z1bmN0aW9ucyk7CisgIERDSEVDSyhzdWNjZXNzKTsKKworCisgIC8vIFNldCB0aGUgUHJvdG90eXBlLmNvbnN0cnVjdG9yIGFuZCBDb25zdHJ1Y3Rvci5wcm90b3R5cGUgcHJvcGVydGllcy4KKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KTsKKyAgRENIRUNLKGludGVyZmFjZV9kYXRhLT5wcm90b3R5cGUpOworICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9wcm90b3R5cGUoY29udGV4dCwgaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHN1Y2Nlc3MgPSBKU19MaW5rQ29uc3RydWN0b3JBbmRQcm90b3R5cGUoCisgICAgICBjb250ZXh0LAorICAgICAgcm9vdGVkX2ludGVyZmFjZV9vYmplY3QsCisgICAgICByb290ZWRfcHJvdG90eXBlKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworfQorCitJbnRlcmZhY2VEYXRhKiBHZXRJbnRlcmZhY2VEYXRhKEpTQ29udGV4dCogY29udGV4dCkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgLy8gVXNlIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm9wZXJ0aWVzIGRlZmluaXRpb24gZm9yIHRoaXMgaW50ZXJmYWNlIGFzIGEKKyAgLy8gdW5pcXVlIGtleSBmb3IgbG9va2luZyB1cCB0aGUgSW50ZXJmYWNlRGF0YSBmb3IgdGhpcyBpbnRlcmZhY2UuCisgIGludHB0cl90IGtleSA9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KCZvd25fcHJvcGVydGllcyk7CisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSk7CisgIGlmICghaW50ZXJmYWNlX2RhdGEpIHsKKyAgICBpbnRlcmZhY2VfZGF0YSA9IENyZWF0ZUNhY2hlZEludGVyZmFjZURhdGEoKTsKKyAgICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEpOworICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+Q2FjaGVJbnRlcmZhY2VEYXRhKGtleSwgaW50ZXJmYWNlX2RhdGEpOworICAgIERDSEVDS19FUShpbnRlcmZhY2VfZGF0YSwgZ2xvYmFsX2Vudmlyb25tZW50LT5HZXRJbnRlcmZhY2VEYXRhKGtleSkpOworICB9CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKK0pTT2JqZWN0KiBNb3pqc1dpbmRvdzo6Q3JlYXRlUHJveHkoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY29wZWRfcmVmcHRyPFdyYXBwYWJsZT4mIHdyYXBwYWJsZSkgeworICBJbnRlcmZhY2VEYXRhKiBpbnRlcmZhY2VfZGF0YSA9IEdldEludGVyZmFjZURhdGEoY29udGV4dCk7CisgIEpTOjpSb290ZWRPYmplY3QgZ2xvYmFsX29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX05ld0dsb2JhbE9iamVjdChjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZpbnRlcmZhY2VfZGF0YS0+aW5zdGFuY2VfY2xhc3NfZGVmaW5pdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSk7CisgIERDSEVDSyhnbG9iYWxfb2JqZWN0KTsKKworICAvLyBJbml0aWFsaXplIHN0YW5kYXJkIEpTIGNvbnN0cnVjdG9ycyBwcm90b3R5cGVzIGFuZCB0b3AtbGV2ZWwgZnVuY3Rpb25zIHN1Y2gKKyAgLy8gYXMgT2JqZWN0LCBpc05hbiwgZXRjLgorICBKU0F1dG9Db21wYXJ0bWVudCBhdXRvX2NvbXBhcnRtZW50KGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICBib29sIHN1Y2Nlc3MgPSBKU19Jbml0U3RhbmRhcmRDbGFzc2VzKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJvdG90eXBlKAorICAgICAgY29udGV4dCwgTW96anNXaW5kb3c6OkdldFByb3RvdHlwZShjb250ZXh0LCBnbG9iYWxfb2JqZWN0KSk7CisgIERDSEVDSyhwcm90b3R5cGUpOworICBKU19TZXRQcm90b3R5cGUoY29udGV4dCwgZ2xvYmFsX29iamVjdCwgcHJvdG90eXBlKTsKKworICAvLyBBZGQgb3duIHByb3BlcnRpZXMuCisgIHN1Y2Nlc3MgPSBKU19EZWZpbmVQcm9wZXJ0aWVzKGNvbnRleHQsIGdsb2JhbF9vYmplY3QsIG93bl9wcm9wZXJ0aWVzKTsKKyAgRENIRUNLKHN1Y2Nlc3MpOworCisgIEpTOjpSb290ZWRPYmplY3QgcHJveHkoY29udGV4dCwKKyAgICAgIFByb3h5SGFuZGxlcjo6TmV3UHJveHkoY29udGV4dCwgZ2xvYmFsX29iamVjdCwgcHJvdG90eXBlLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm94eV9oYW5kbGVyLlBvaW50ZXIoKSkpOworICBXcmFwcGVyUHJpdmF0ZTo6QWRkUHJpdmF0ZURhdGEoY29udGV4dCwgcHJveHksIHdyYXBwYWJsZSk7CisKKyAgLy8gU2V0IHRoZSBnbG9iYWwgb2JqZWN0IHByb3h5IHBvaW50ZXIsIHNvIHdlIGNhbiBhY2Nlc3MgdGhlIHN0YW5kYXJkIGNsYXNzZXMKKyAgLy8gc3VjaCBhcyB0aGUgYmFzZSBPYmplY3QgcHJvdG90eXBlIHdoZW4gbG9va2luZyB1cCBvdXIgcHJvdG90eXBlLgorICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKKyAgZ2xvYmFsX2Vudmlyb25tZW50LT5TZXRHbG9iYWxPYmplY3RQcm94eUFuZFdyYXBwZXIocHJveHksIHdyYXBwYWJsZSk7CisgIHJldHVybiBwcm94eTsKK30KKy8vc3RhdGljCitjb25zdCBKU0NsYXNzKiBNb3pqc1dpbmRvdzo6UHJvdG90eXBlQ2xhc3MoCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQpIHsKKyAgRENIRUNLKE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBnbG9iYWxfb2JqZWN0KAorICAgICAgY29udGV4dCwKKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpLT5nbG9iYWxfb2JqZWN0KCkpOworICBEQ0hFQ0soZ2xvYmFsX29iamVjdCk7CisKKyAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCwgR2V0UHJvdG90eXBlKGNvbnRleHQsIGdsb2JhbF9vYmplY3QpKTsKKyAgSlNDbGFzcyogcHJvdG9fY2xhc3MgPSBKU19HZXRDbGFzcygqcHJvdG90eXBlLmFkZHJlc3MoKSk7CisgIHJldHVybiBwcm90b19jbGFzczsKK30KKworLy8gc3RhdGljCitKU09iamVjdCogTW96anNXaW5kb3c6OkdldFByb3RvdHlwZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCkgeworICBEQ0hFQ0soSlNfSXNHbG9iYWxPYmplY3QoZ2xvYmFsX29iamVjdCkpOworCisgIEludGVyZmFjZURhdGEqIGludGVyZmFjZV9kYXRhID0gR2V0SW50ZXJmYWNlRGF0YShjb250ZXh0KTsKKyAgaWYgKCFpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlKSB7CisgICAgLy8gQ3JlYXRlIG5ldyBwcm90b3R5cGUgdGhhdCBoYXMgYWxsIHRoZSBwcm9wcyBhbmQgbWV0aG9kcworICAgIEluaXRpYWxpemVQcm90b3R5cGVBbmRJbnRlcmZhY2VPYmplY3QoCisgICAgICAgIGludGVyZmFjZV9kYXRhLCBjb250ZXh0LCBnbG9iYWxfb2JqZWN0KTsKKyAgfQorICBEQ0hFQ0soaW50ZXJmYWNlX2RhdGEtPnByb3RvdHlwZSk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+cHJvdG90eXBlOworfQorCisvLyBzdGF0aWMKK0pTT2JqZWN0KiBNb3pqc1dpbmRvdzo6R2V0SW50ZXJmYWNlT2JqZWN0KAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KSB7CisgIERDSEVDSyhKU19Jc0dsb2JhbE9iamVjdChnbG9iYWxfb2JqZWN0KSk7CisKKyAgSW50ZXJmYWNlRGF0YSogaW50ZXJmYWNlX2RhdGEgPSBHZXRJbnRlcmZhY2VEYXRhKGNvbnRleHQpOworICBpZiAoIWludGVyZmFjZV9kYXRhLT5pbnRlcmZhY2Vfb2JqZWN0KSB7CisgICAgSW5pdGlhbGl6ZVByb3RvdHlwZUFuZEludGVyZmFjZU9iamVjdCgKKyAgICAgICAgaW50ZXJmYWNlX2RhdGEsIGNvbnRleHQsIGdsb2JhbF9vYmplY3QpOworICB9CisgIERDSEVDSyhpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdCk7CisgIHJldHVybiBpbnRlcmZhY2VfZGF0YS0+aW50ZXJmYWNlX29iamVjdDsKK30KKworCituYW1lc3BhY2UgeworfSAgLy8gbmFtZXNwYWNlCisKKworfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKK30gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzY3JpcHQgeworCit0ZW1wbGF0ZTw+Cit2b2lkIEdsb2JhbEVudmlyb25tZW50OjpDcmVhdGVHbG9iYWxPYmplY3Q8V2luZG93PigKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFdpbmRvdz4mIGdsb2JhbF9pbnRlcmZhY2UsCisgICAgRW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogbW96anNfZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPih0aGlzKTsKKyAgSlNDb250ZXh0KiBjb250ZXh0ID0gbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LT5jb250ZXh0KCk7CisKKyAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dCk7CisgIE1vempzV2luZG93OjpDcmVhdGVQcm94eSgKKyAgICAgIGNvbnRleHQsIGdsb2JhbF9pbnRlcmZhY2UpOworICBtb3pqc19nbG9iYWxfZW52aXJvbm1lbnQtPlNldEVudmlyb25tZW50U2V0dGluZ3MoZW52aXJvbm1lbnRfc2V0dGluZ3MpOworICBtb3pqc19nbG9iYWxfZW52aXJvbm1lbnQtPkV2YWx1YXRlQXV0b21hdGljcygpOworCisgIFdyYXBwZXJGYWN0b3J5KiB3cmFwcGVyX2ZhY3RvcnkgPQorICAgICAgbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEFub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c05hbWVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6QW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBBcmJpdHJhcnlJbnRlcmZhY2U6OkFyYml0cmFyeUludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNBcmJpdHJhcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQmFzZUludGVyZmFjZTo6QmFzZUludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNCYXNlSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQmFzZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkJvb2xlYW5UeXBlVGVzdEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Q2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6Q2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyNpZiBkZWZpbmVkKEVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQ29uZGl0aW9uYWxJbnRlcmZhY2U6OkNvbmRpdGlvbmFsSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NvbmRpdGlvbmFsSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ29uZGl0aW9uYWxJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisjZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRSkKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBDb25zdGFudHNJbnRlcmZhY2U6OkNvbnN0YW50c0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNDb25zdGFudHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNDb25zdGFudHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQ29uc3RydWN0b3JJbnRlcmZhY2U6OkNvbnN0cnVjdG9ySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RydWN0b3JJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OkRPTVN0cmluZ1Rlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzRE9NU3RyaW5nVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6RGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBEZXJpdmVkSW50ZXJmYWNlOjpEZXJpdmVkSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Rlcml2ZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNEZXJpdmVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIERpY3Rpb25hcnlJbnRlcmZhY2U6OkRpY3Rpb25hcnlJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzRGljdGlvbmFyeUludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0RpY3Rpb25hcnlJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisjaWYgZGVmaW5lZChOT19FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFKQorICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIERpc2FibGVkSW50ZXJmYWNlOjpEaXNhYmxlZEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNEaXNhYmxlZEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0Rpc2FibGVkSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworI2VuZGlmICAvLyBkZWZpbmVkKE5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0UpCisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgRW51bWVyYXRpb25JbnRlcmZhY2U6OkVudW1lcmF0aW9uSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0VudW1lcmF0aW9uSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzRW51bWVyYXRpb25JbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpFeGNlcHRpb25PYmplY3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzRXhjZXB0aW9uT2JqZWN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEV4Y2VwdGlvbnNJbnRlcmZhY2U6OkV4Y2VwdGlvbnNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzRXhjZXB0aW9uc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0V4Y2VwdGlvbnNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpFeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6R2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0dhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpHZXRPcGFxdWVSb290SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0dldE9wYXF1ZVJvb3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNHZXRPcGFxdWVSb290SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEdsb2JhbEludGVyZmFjZVBhcmVudDo6R2xvYmFsSW50ZXJmYWNlUGFyZW50V3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0dsb2JhbEludGVyZmFjZVBhcmVudDo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBJbXBsZW1lbnRlZEludGVyZmFjZTo6SW1wbGVtZW50ZWRJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzSW1wbGVtZW50ZWRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNJbXBsZW1lbnRlZEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpJbmRleGVkR2V0dGVySW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNJbmRleGVkR2V0dGVySW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIEludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OkludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXNXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllczo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc0ludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXM6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6TmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBOYW1lZEdldHRlckludGVyZmFjZTo6TmFtZWRHZXR0ZXJJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzTmFtZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOYW1lZEdldHRlckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6Ok5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6Ok5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6Tm9Db25zdHJ1Y3RvckludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOb0NvbnN0cnVjdG9ySW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzTm9Db25zdHJ1Y3RvckludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6Tm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOb0ludGVyZmFjZU9iamVjdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6TnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNOdW1lcmljVHlwZXNUZXN0SW50ZXJmYWNlOjpQcm90b3R5cGVDbGFzcykpOworICB3cmFwcGVyX2ZhY3RvcnktPlJlZ2lzdGVyV3JhcHBhYmxlVHlwZSgKKyAgICAgIE9iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6T2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlV3JhcHBhYmxlVHlwZSgpLAorICAgICAgYmFzZTo6QmluZChNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6Q3JlYXRlUHJveHkpLAorICAgICAgYmFzZTo6QmluZChNb3pqc09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6T3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNPcGVyYXRpb25zVGVzdEludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBQdXRGb3J3YXJkc0ludGVyZmFjZTo6UHV0Rm9yd2FyZHNJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzUHV0Rm9yd2FyZHNJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNQdXRGb3J3YXJkc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBTZXF1ZW5jZVVzZXI6OlNlcXVlbmNlVXNlcldyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNTZXF1ZW5jZVVzZXI6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNTZXF1ZW5jZVVzZXI6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6U3RhdGljUHJvcGVydGllc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RhdGljUHJvcGVydGllc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6U3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6U3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6U3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2VXcmFwcGFibGVUeXBlKCksCisgICAgICBiYXNlOjpCaW5kKE1vempzU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBUYXJnZXRJbnRlcmZhY2U6OlRhcmdldEludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNUYXJnZXRJbnRlcmZhY2U6OkNyZWF0ZVByb3h5KSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNUYXJnZXRJbnRlcmZhY2U6OlByb3RvdHlwZUNsYXNzKSk7CisgIHdyYXBwZXJfZmFjdG9yeS0+UmVnaXN0ZXJXcmFwcGFibGVUeXBlKAorICAgICAgVW5pb25UeXBlc0ludGVyZmFjZTo6VW5pb25UeXBlc0ludGVyZmFjZVdyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNVbmlvblR5cGVzSW50ZXJmYWNlOjpDcmVhdGVQcm94eSksCisgICAgICBiYXNlOjpCaW5kKE1vempzVW5pb25UeXBlc0ludGVyZmFjZTo6UHJvdG90eXBlQ2xhc3MpKTsKKyAgd3JhcHBlcl9mYWN0b3J5LT5SZWdpc3RlcldyYXBwYWJsZVR5cGUoCisgICAgICBXaW5kb3c6OldpbmRvd1dyYXBwYWJsZVR5cGUoKSwKKyAgICAgIGJhc2U6OkJpbmQoRHVtbXlGdW5jdG9yKSwKKyAgICAgIGJhc2U6OkJpbmQoTW96anNXaW5kb3c6OlByb3RvdHlwZUNsYXNzKSk7CisKK30KKworLy8gTVNWUyBjb21waWxlciBkb2VzIG5vdCBuZWVkIHRoaXMgZXhwbGljaXQgaW5zdGFudGlhdGlvbiwgYW5kIGdlbmVyYXRlcyBhCisvLyBjb21waWxlciBlcnJvci4KKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikKKy8vIEV4cGxpY2l0bHkgaW5zdGFudGlhdGUgdGhlIHRlbXBsYXRlIGZ1bmN0aW9uIGZvciB0ZW1wbGF0ZSB0eXBlIFdpbmRvdworLy8gVGhpcyBpcyBuZWVkZWQgdG8gcHJldmVudCBsaW5rIGVycm9ycyB3aGVuIHRyeWluZyB0byByZXNvbHZlIHRoZSB0ZW1wbGF0ZQorLy8gaW5zdGFudGlhdGlvbi4KK3RlbXBsYXRlCit2b2lkIEdsb2JhbEVudmlyb25tZW50OjpDcmVhdGVHbG9iYWxPYmplY3Q8V2luZG93PigKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFdpbmRvdz4mIGdsb2JhbF9pbnRlcmZhY2UsCisgICAgRW52aXJvbm1lbnRTZXR0aW5ncyogZW52aXJvbm1lbnRfc2V0dGluZ3MpOworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBzY3JpcHQKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvZ2VuZXJhdGVkL21vempzL3Rlc3RpbmcvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfd2luZG93LmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3dpbmRvdy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwYjM5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL21vempzX3dpbmRvdy5oCkBAIC0wLDAgKzEsNTMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IGJpbmRpbmdzL2NvZGVfZ2VuZXJhdG9yX2NvYmFsdC5weS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IGJpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZQorCisjaWZuZGVmIE1vempzV2luZG93X2gKKyNkZWZpbmUgTW96anNXaW5kb3dfaAorCisjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgorI2luY2x1ZGUgImJhc2UvbGF6eV9pbnN0YW5jZS5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbW96anNfZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy93aW5kb3cuaCIKKworI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIE1vempzV2luZG93IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBKU09iamVjdCogQ3JlYXRlUHJveHkoSlNDb250ZXh0KiBjb250ZXh0LAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxzY3JpcHQ6OldyYXBwYWJsZT4mIHdyYXBwYWJsZSk7CisgIHN0YXRpYyBjb25zdCBKU0NsYXNzKiBQcm90b3R5cGVDbGFzcyhKU0NvbnRleHQqIGNvbnRleHQpOworICBzdGF0aWMgSlNPYmplY3QqIEdldFByb3RvdHlwZShKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgZ2xvYmFsX29iamVjdCk7CisgIHN0YXRpYyBKU09iamVjdCogR2V0SW50ZXJmYWNlT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCBnbG9iYWxfb2JqZWN0KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB0ZXN0aW5nCit9ICAvLyBuYW1lc3BhY2UgYmluZGluZ3MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBNb3pqc1dpbmRvd19oCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL2dlbmVyYXRlZC9tb3pqcy90ZXN0aW5nL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Rlc3RfZGljdGlvbmFyeS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy90ZXN0X2RpY3Rpb25hcnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOGQ4MTc4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9nZW5lcmF0ZWQvbW96anMvdGVzdGluZy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy90ZXN0X2RpY3Rpb25hcnkuaApAQCAtMCwwICsxLDE1OCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkgYmluZGluZ3MvY29kZV9nZW5lcmF0b3JfY29iYWx0LnB5LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZTogYmluZGluZ3MvdGVtcGxhdGVzL2RpY3Rpb25hcnkuaC50ZW1wbGF0ZQorCisjaWZuZGVmIFRlc3REaWN0aW9uYXJ5X2gKKyNkZWZpbmUgVGVzdERpY3Rpb25hcnlfaAorCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgYmluZGluZ3MgeworbmFtZXNwYWNlIHRlc3RpbmcgeworCitjbGFzcyBUZXN0RGljdGlvbmFyeSB7CisgcHVibGljOgorICBUZXN0RGljdGlvbmFyeSgpIHsKKyAgICBoYXNfYm9vbGVhbl9tZW1iZXJfID0gZmFsc2U7CisgICAgYm9vbGVhbl9tZW1iZXJfID0gYm9vbCgpOworICAgIGhhc19sb25nX21lbWJlcl8gPSBmYWxzZTsKKyAgICBsb25nX21lbWJlcl8gPSBpbnQzMl90KCk7CisgICAgaGFzX2RvdWJsZV9tZW1iZXJfID0gZmFsc2U7CisgICAgZG91YmxlX21lbWJlcl8gPSBkb3VibGUoKTsKKyAgICBoYXNfc3RyaW5nX21lbWJlcl8gPSBmYWxzZTsKKyAgICBzdHJpbmdfbWVtYmVyXyA9IHN0ZDo6c3RyaW5nKCk7CisgICAgaGFzX2ludGVyZmFjZV9tZW1iZXJfID0gZmFsc2U7CisgICAgaW50ZXJmYWNlX21lbWJlcl8gPSBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4oKTsKKyAgICBoYXNfbWVtYmVyX3dpdGhfZGVmYXVsdF8gPSB0cnVlOworICAgIG1lbWJlcl93aXRoX2RlZmF1bHRfID0gNTsKKyAgICBoYXNfbm9uX2RlZmF1bHRfbWVtYmVyXyA9IGZhbHNlOworICAgIG5vbl9kZWZhdWx0X21lbWJlcl8gPSBpbnQzMl90KCk7CisgIH0KKworICBib29sIGhhc19ib29sZWFuX21lbWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzX2Jvb2xlYW5fbWVtYmVyXzsKKyAgfQorICBib29sIGJvb2xlYW5fbWVtYmVyKCkgY29uc3QgeworICAgIERDSEVDSyhoYXNfYm9vbGVhbl9tZW1iZXJfKTsKKyAgICByZXR1cm4gYm9vbGVhbl9tZW1iZXJfOworICB9CisgIHZvaWQgc2V0X2Jvb2xlYW5fbWVtYmVyKGJvb2wgdmFsdWUpIHsKKyAgICBoYXNfYm9vbGVhbl9tZW1iZXJfID0gdHJ1ZTsKKyAgICBib29sZWFuX21lbWJlcl8gPSB2YWx1ZTsKKyAgfQorCisgIGJvb2wgaGFzX2xvbmdfbWVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBoYXNfbG9uZ19tZW1iZXJfOworICB9CisgIGludDMyX3QgbG9uZ19tZW1iZXIoKSBjb25zdCB7CisgICAgRENIRUNLKGhhc19sb25nX21lbWJlcl8pOworICAgIHJldHVybiBsb25nX21lbWJlcl87CisgIH0KKyAgdm9pZCBzZXRfbG9uZ19tZW1iZXIoaW50MzJfdCB2YWx1ZSkgeworICAgIGhhc19sb25nX21lbWJlcl8gPSB0cnVlOworICAgIGxvbmdfbWVtYmVyXyA9IHZhbHVlOworICB9CisKKyAgYm9vbCBoYXNfZG91YmxlX21lbWJlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzX2RvdWJsZV9tZW1iZXJfOworICB9CisgIGRvdWJsZSBkb3VibGVfbWVtYmVyKCkgY29uc3QgeworICAgIERDSEVDSyhoYXNfZG91YmxlX21lbWJlcl8pOworICAgIHJldHVybiBkb3VibGVfbWVtYmVyXzsKKyAgfQorICB2b2lkIHNldF9kb3VibGVfbWVtYmVyKGRvdWJsZSB2YWx1ZSkgeworICAgIGhhc19kb3VibGVfbWVtYmVyXyA9IHRydWU7CisgICAgZG91YmxlX21lbWJlcl8gPSB2YWx1ZTsKKyAgfQorCisgIGJvb2wgaGFzX3N0cmluZ19tZW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19zdHJpbmdfbWVtYmVyXzsKKyAgfQorICBzdGQ6OnN0cmluZyBzdHJpbmdfbWVtYmVyKCkgY29uc3QgeworICAgIERDSEVDSyhoYXNfc3RyaW5nX21lbWJlcl8pOworICAgIHJldHVybiBzdHJpbmdfbWVtYmVyXzsKKyAgfQorICB2b2lkIHNldF9zdHJpbmdfbWVtYmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGhhc19zdHJpbmdfbWVtYmVyXyA9IHRydWU7CisgICAgc3RyaW5nX21lbWJlcl8gPSB2YWx1ZTsKKyAgfQorCisgIGJvb2wgaGFzX2ludGVyZmFjZV9tZW1iZXIoKSBjb25zdCB7CisgICAgcmV0dXJuIGhhc19pbnRlcmZhY2VfbWVtYmVyXzsKKyAgfQorICBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4gaW50ZXJmYWNlX21lbWJlcigpIGNvbnN0IHsKKyAgICBEQ0hFQ0soaGFzX2ludGVyZmFjZV9tZW1iZXJfKTsKKyAgICByZXR1cm4gaW50ZXJmYWNlX21lbWJlcl87CisgIH0KKyAgdm9pZCBzZXRfaW50ZXJmYWNlX21lbWJlcihjb25zdCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4mIHZhbHVlKSB7CisgICAgaGFzX2ludGVyZmFjZV9tZW1iZXJfID0gdHJ1ZTsKKyAgICBpbnRlcmZhY2VfbWVtYmVyXyA9IHZhbHVlOworICB9CisKKyAgYm9vbCBoYXNfbWVtYmVyX3dpdGhfZGVmYXVsdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gaGFzX21lbWJlcl93aXRoX2RlZmF1bHRfOworICB9CisgIGludDMyX3QgbWVtYmVyX3dpdGhfZGVmYXVsdCgpIGNvbnN0IHsKKyAgICBEQ0hFQ0soaGFzX21lbWJlcl93aXRoX2RlZmF1bHRfKTsKKyAgICByZXR1cm4gbWVtYmVyX3dpdGhfZGVmYXVsdF87CisgIH0KKyAgdm9pZCBzZXRfbWVtYmVyX3dpdGhfZGVmYXVsdChpbnQzMl90IHZhbHVlKSB7CisgICAgaGFzX21lbWJlcl93aXRoX2RlZmF1bHRfID0gdHJ1ZTsKKyAgICBtZW1iZXJfd2l0aF9kZWZhdWx0XyA9IHZhbHVlOworICB9CisKKyAgYm9vbCBoYXNfbm9uX2RlZmF1bHRfbWVtYmVyKCkgY29uc3QgeworICAgIHJldHVybiBoYXNfbm9uX2RlZmF1bHRfbWVtYmVyXzsKKyAgfQorICBpbnQzMl90IG5vbl9kZWZhdWx0X21lbWJlcigpIGNvbnN0IHsKKyAgICBEQ0hFQ0soaGFzX25vbl9kZWZhdWx0X21lbWJlcl8pOworICAgIHJldHVybiBub25fZGVmYXVsdF9tZW1iZXJfOworICB9CisgIHZvaWQgc2V0X25vbl9kZWZhdWx0X21lbWJlcihpbnQzMl90IHZhbHVlKSB7CisgICAgaGFzX25vbl9kZWZhdWx0X21lbWJlcl8gPSB0cnVlOworICAgIG5vbl9kZWZhdWx0X21lbWJlcl8gPSB2YWx1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgYm9vbCBoYXNfYm9vbGVhbl9tZW1iZXJfOworICBib29sIGJvb2xlYW5fbWVtYmVyXzsKKyAgYm9vbCBoYXNfbG9uZ19tZW1iZXJfOworICBpbnQzMl90IGxvbmdfbWVtYmVyXzsKKyAgYm9vbCBoYXNfZG91YmxlX21lbWJlcl87CisgIGRvdWJsZSBkb3VibGVfbWVtYmVyXzsKKyAgYm9vbCBoYXNfc3RyaW5nX21lbWJlcl87CisgIHN0ZDo6c3RyaW5nIHN0cmluZ19tZW1iZXJfOworICBib29sIGhhc19pbnRlcmZhY2VfbWVtYmVyXzsKKyAgc2NvcGVkX3JlZnB0cjxBcmJpdHJhcnlJbnRlcmZhY2U+IGludGVyZmFjZV9tZW1iZXJfOworICBib29sIGhhc19tZW1iZXJfd2l0aF9kZWZhdWx0XzsKKyAgaW50MzJfdCBtZW1iZXJfd2l0aF9kZWZhdWx0XzsKKyAgYm9vbCBoYXNfbm9uX2RlZmF1bHRfbWVtYmVyXzsKKyAgaW50MzJfdCBub25fZGVmYXVsdF9tZW1iZXJfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworCisjZW5kaWYgIC8vIFRlc3REaWN0aW9uYXJ5X2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvaWRsX2NvbXBpbGVyX2NvYmFsdC5weSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvaWRsX2NvbXBpbGVyX2NvYmFsdC5weQppbmRleCA4OWYzZjRhLi5mODZlZjgzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL2lkbF9jb21waWxlcl9jb2JhbHQucHkKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9pZGxfY29tcGlsZXJfY29iYWx0LnB5CkBAIC0yMCwxMCArMjAsMTMgQEAKIGltcG9ydCBvcwogaW1wb3J0IHN5cwogCitpbXBvcnQgYm9vdHN0cmFwX3BhdGggICMgcHlsaW50OiBkaXNhYmxlPWctYmFkLWltcG9ydC1vcmRlcix1bnVzZWQtaW1wb3J0CisKIG1vZHVsZV9wYXRoLCBtb2R1bGVfZmlsZW5hbWUgPSBvcy5wYXRoLnNwbGl0KG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKQogIyBBZGRpbmcgdGhpcyB0byB0aGUgcGF0aCBhbGxvd3MgdXMgdG8gaW1wb3J0IGZyb20gYmxpbmsncyBiaW5kaW5ncy5zY3JpcHRzCi1ibGlua19zb3VyY2VfZGlyID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oCi0gICAgbW9kdWxlX3BhdGgsIG9zLnBhcmRpciwgb3MucGFyZGlyLCAndGhpcmRfcGFydHknLCAnYmxpbmsnLCAnU291cmNlJykpCitibGlua19zb3VyY2VfZGlyID0gb3MucGF0aC5ub3JtcGF0aCgKKyAgICBvcy5wYXRoLmpvaW4obW9kdWxlX3BhdGgsIG9zLnBhcmRpciwgb3MucGFyZGlyLCAndGhpcmRfcGFydHknLCAnYmxpbmsnLAorICAgICAgICAgICAgICAgICAnU291cmNlJykpCiBzeXMucGF0aC5hcHBlbmQoYmxpbmtfc291cmNlX2RpcikKIAogZnJvbSBiaW5kaW5ncy5zY3JpcHRzLmlkbF9jb21waWxlciBpbXBvcnQgSWRsQ29tcGlsZXIgICMgcHlsaW50OiBkaXNhYmxlPWctaW1wb3J0LW5vdC1hdC10b3AKQEAgLTM0LDkgKzM3LDggQEAKIAogICBkZWYgX19pbml0X18oc2VsZiwgY29kZV9nZW5lcmF0b3JfY2xhc3MsICphcmdzLCAqKmt3YXJncyk6CiAgICAgSWRsQ29tcGlsZXIuX19pbml0X18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQotICAgIHNlbGYuY29kZV9nZW5lcmF0b3IgPSBjb2RlX2dlbmVyYXRvcl9jbGFzcyhzZWxmLmludGVyZmFjZXNfaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5jYWNoZV9kaXJlY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYub3V0cHV0X2RpcmVjdG9yeSkKKyAgICBzZWxmLmNvZGVfZ2VuZXJhdG9yID0gY29kZV9nZW5lcmF0b3JfY2xhc3MoCisgICAgICAgIHNlbGYuaW50ZXJmYWNlc19pbmZvLCBzZWxmLmNhY2hlX2RpcmVjdG9yeSwgc2VsZi5vdXRwdXRfZGlyZWN0b3J5KQogCiAgIGRlZiBjb21waWxlX2ZpbGUoc2VsZiwgaWRsX2ZpbGVuYW1lKToKICAgICBzZWxmLmNvbXBpbGVfYW5kX3dyaXRlKGlkbF9maWxlbmFtZSkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvY29kZV9nZW5lcmF0b3IucHkgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzLTQ1L2NvZGVfZ2VuZXJhdG9yLnB5CmluZGV4IDM5NDc2NmYuLjMzNzliYWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvY29kZV9nZW5lcmF0b3IucHkKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS9jb2RlX2dlbmVyYXRvci5weQpAQCAtNjAsNyArNjAsNyBAQAogCiAgIEBwcm9wZXJ0eQogICBkZWYgZ2VuZXJhdGVkX2ZpbGVfcHJlZml4KHNlbGYpOgotICAgIHJldHVybiAnTW96anMnCisgICAgcmV0dXJuICdtb3pqcycKIAogICBAcHJvcGVydHkKICAgZGVmIGV4cHJlc3Npb25fZ2VuZXJhdG9yKHNlbGYpOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmNjLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmNjLnRlbXBsYXRlCmluZGV4IGU2MWVhNGEuLjMwODc3ODUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS5jYy50ZW1wbGF0ZQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuY2MudGVtcGxhdGUKQEAgLTM1LDcgKzM1LDYgQEAKIHslIGVuZGJsb2NrIHVzaW5nX2RpcmVjdGl2ZXMgJX0KIAogeyUgYmxvY2sgaW1wbGVtZW50YXRpb24gJX0KLW5hbWVzcGFjZSBjb2JhbHQgewogeyUgZm9yIGNvbXBvbmVudCBpbiBjb21wb25lbnRzICV9CiBuYW1lc3BhY2Uge3tjb21wb25lbnR9fSB7CiB7JSBlbmRmb3IgJX0KQEAgLTQ2LDYgKzQ1LDEyIEBACiAgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwKICAgICAgIGltcGxlbWVudGluZ19vYmplY3RfKGNvbnRleHQsIGltcGxlbWVudGluZ19vYmplY3QpIHsgfQogCit7e2JpbmRpbmdfY2xhc3N9fTo6e3tiaW5kaW5nX2NsYXNzfX0oCisgICAgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIEpTOjpIYW5kbGVWYWx1ZSBpbXBsZW1lbnRpbmdfb2JqZWN0X3ZhbHVlKQorICAgIDogY29udGV4dF8oY29udGV4dCksCisgICAgICBpbXBsZW1lbnRpbmdfb2JqZWN0Xyhjb250ZXh0LCBpbXBsZW1lbnRpbmdfb2JqZWN0X3ZhbHVlKSB7IH0KKwogeyUgZm9yIG9wZXJhdGlvbiBpbiBvcGVyYXRpb25zICV9CiB7JSBmb3Igb3ZlcmxvYWQgaW4gb3BlcmF0aW9uLm92ZXJsb2FkcyAlfQoge3tvdmVybG9hZC50eXBlfX0ge3tiaW5kaW5nX2NsYXNzfX06Ont7b3ZlcmxvYWQubmFtZX19KApAQCAtNjIsNyArNjcsNyBAQAogICBKU0V4Y2VwdGlvblN0YXRlKiBwcmV2aW91c19leGNlcHRpb25fc3RhdGUgPSBKU19TYXZlRXhjZXB0aW9uU3RhdGUoY29udGV4dF8pOwogCiAgIC8vIFRoaXMgY291bGQgYmUgc2V0IHRvIE5VTEwgaWYgaXQgd2FzIGdhcmJhZ2UgY29sbGVjdGVkLgotICBKUzo6Um9vdGVkT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3QoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3RfLkdldCgpKTsKKyAgSlM6OlJvb3RlZE9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0KGNvbnRleHRfLCBpbXBsZW1lbnRpbmdfb2JqZWN0Xy5HZXRPYmplY3QoKSk7CiAgIERMT0dfSUYoV0FSTklORywgIWltcGxlbWVudGluZ19vYmplY3QpIDw8ICJJbXBsZW1lbnRpbmcgb2JqZWN0IGlzIE5VTEwuIjsKICAgaWYgKGltcGxlbWVudGluZ19vYmplY3QpIHsKICAgICBKU0F1dG9Db21wYXJ0bWVudCBhdXRvX2NvbXBhcnRtZW50KGNvbnRleHRfLCBpbXBsZW1lbnRpbmdfb2JqZWN0KTsKQEAgLTExMSw4ICsxMTYsNyBAQAogeyUgZW5kZm9yICV9CiB7JSBlbmRmb3IgJX0KIAoteyUgZm9yIGNvbXBvbmVudCBpbiBjb21wb25lbnRzICV9Cit7JSBmb3IgY29tcG9uZW50IGluIGNvbXBvbmVudHN8cmV2ZXJzZSAlfQogfSAgLy8gbmFtZXNwYWNlIHt7Y29tcG9uZW50fX0KIHslIGVuZGZvciAlfQotfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAogeyUgZW5kYmxvY2sgaW1wbGVtZW50YXRpb24gJX0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS5oLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUKaW5kZXggODcxMDZkNS4uODQ4YzExMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUKQEAgLTIyLDcgKzIyLDYgQEAKIHslIGVuZGJsb2NrIGluY2x1ZGVzICV9CiAKIHslIGJsb2NrIGltcGxlbWVudGF0aW9uICV9Ci1uYW1lc3BhY2UgY29iYWx0IHsKIHslIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50cyAlfQogbmFtZXNwYWNlIHt7Y29tcG9uZW50fX0gewogeyUgZW5kZm9yICV9CkBAIC0zMyw2ICszMiw4IEBACiAKICAge3tiaW5kaW5nX2NsYXNzfX0oCiAgICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgaW1wbGVtZW50aW5nX29iamVjdCk7CisgIHt7YmluZGluZ19jbGFzc319KAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgaW1wbGVtZW50aW5nX29iamVjdF92YWx1ZSk7CiB7JSBmb3Igb3BlcmF0aW9uIGluIG9wZXJhdGlvbnMgJX0KIHslIGZvciBvdmVybG9hZCBpbiBvcGVyYXRpb24ub3ZlcmxvYWRzICV9CiAgIHt7b3ZlcmxvYWQudHlwZX19IHt7b3ZlcmxvYWQubmFtZX19KApAQCAtNDMsMTYgKzQ0LDE5IEBACiAgICAgICBib29sKiBoYWRfZXhjZXB0aW9uKSBjb25zdCBPVkVSUklERTsKIHslIGVuZGZvciAlfQogeyUgZW5kZm9yICV9Ci0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBpbXBsZW1lbnRpbmdfb2JqZWN0Xy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaW1wbGVtZW50aW5nX29iamVjdF8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIGltcGxlbWVudGluZ19vYmplY3RfLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiBpbXBsZW1lbnRpbmdfb2JqZWN0Xy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKICAgc2NyaXB0Ojptb3pqczo6V2Vha0hlYXBPYmplY3QgaW1wbGVtZW50aW5nX29iamVjdF87CiB9OwogCi17JSBmb3IgY29tcG9uZW50IGluIGNvbXBvbmVudHMgJX0KK3slIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50c3xyZXZlcnNlICV9CiB9ICAvLyBuYW1lc3BhY2Uge3tjb21wb25lbnR9fQogeyUgZW5kZm9yICV9CituYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzY3JpcHQgewogLy8gRXhwbGljaXQgaW5zdGFudGlhdGlvbiBvZiBDYWxsYmFja0ludGVyZmFjZVRyYWl0cyBzdHJ1Y3Qgc28gd2UgY2FuIGluZmVyCiAvLyB0aGUgdHlwZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIGZyb20gdGhlIHR5cGUgb2YgdGhlIGNhbGxiYWNrIGludGVyZmFjZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2RpY3Rpb25hcnktY29udmVyc2lvbi5oLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvZGljdGlvbmFyeS1jb252ZXJzaW9uLmgudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzMmY0ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2RpY3Rpb25hcnktY29udmVyc2lvbi5oLnRlbXBsYXRlCkBAIC0wLDAgKzEsMTM3IEBACit7IworICMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAjCisgIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICMKKyAjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAjCisgIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAjfQorLyoKKyAqIENvcHlyaWdodCB7e3RvZGF5LnllYXJ9fSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IHt7Y29kZV9nZW5lcmF0b3J9fS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IHt7dGVtcGxhdGVfcGF0aH19CisKKyNpZm5kZWYge3tjbGFzc19uYW1lfX1fY29udmVyc2lvbl9oCisjZGVmaW5lIHt7Y2xhc3NfbmFtZX19X2NvbnZlcnNpb25faAorCit7JSBpZiBjb25kaXRpb25hbCAlfQorI2lmIGRlZmluZWQoe3tjb25kaXRpb25hbH19KQorCit7JSBlbmRpZiAlfQoreyUgYmxvY2sgaW5jbHVkZXMgJX0KKyNpbmNsdWRlICJ7e2hlYWRlcl9maWxlfX0iCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNjbnR4dC5oIgoreyUgZm9yIGluY2x1ZGUgaW4gaGVhZGVyX2luY2x1ZGVzICV9CisjaW5jbHVkZSAie3tpbmNsdWRlfX0iCit7JSBlbmRmb3IgJX0KK3slIGVuZGJsb2NrIGluY2x1ZGVzICV9CisKK3VzaW5nIHt7Y29tcG9uZW50c3xqb2luKCc6OicpfX06Ont7Y2xhc3NfbmFtZX19OworeyUgZm9yIHVzZWRfY2xhc3MgaW4gZm9yd2FyZF9kZWNsYXJhdGlvbnMgJX0KK3slIGlmIHVzZWRfY2xhc3MuY29uZGl0aW9uYWwgJX0KKyNpZiBkZWZpbmVkKHt7dXNlZF9jbGFzcy5jb25kaXRpb25hbH19KQoreyUgZW5kaWYgJX0KK3VzaW5nIHt7dXNlZF9jbGFzcy5mdWxseV9xdWFsaWZpZWRfbmFtZX19OworeyUgaWYgdXNlZF9jbGFzcy5jb25kaXRpb25hbCAlfQorI2VuZGlmICAvLyBkZWZpbmVkKHt7dXNlZF9jbGFzcy5jb25kaXRpb25hbH19KQoreyUgZW5kaWYgJX0KK3slIGVuZGZvciAlfQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzY3JpcHQgeworbmFtZXNwYWNlIG1vempzIHsKKworaW5saW5lIHZvaWQgVG9KU1ZhbHVlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBjb25zdCB7e2NsYXNzX25hbWV9fSYgaW5fZGljdGlvbmFyeSwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgeworICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHRoYXQgd2lsbCBob2xkIHRoZSBkaWN0aW9uYXJ5IHZhbHVlcy4KKyAgSlM6OlJvb3RlZE9iamVjdCBkaWN0aW9uYXJ5X29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX05ld09iamVjdChjb250ZXh0LCBudWxscHRyKSk7CisgIGNvbnN0IGludCBrUHJvcGVydHlBdHRyaWJ1dGVzID0gSlNQUk9QX0VOVU1FUkFURTsKK3slIGZvciBtZW1iZXIgaW4gbWVtYmVycyAlfQorICBpZiAoaW5fZGljdGlvbmFyeS5oYXNfe3ttZW1iZXIubmFtZX19KCkpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgbWVtYmVyX3ZhbHVlKGNvbnRleHQpOworICAgIFRvSlNWYWx1ZShjb250ZXh0LCBpbl9kaWN0aW9uYXJ5Lnt7bWVtYmVyLm5hbWV9fSgpLCAmbWVtYmVyX3ZhbHVlKTsKKyAgICBpZiAoIUpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInt7bWVtYmVyLmlkbF9uYW1lfX0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLCBrUHJvcGVydHlBdHRyaWJ1dGVzLCBudWxscHRyLCBudWxscHRyKSkgeworICAgICAgLy8gU29tZSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4KKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK3slIGVuZGZvciAlfQorICBvdXRfdmFsdWUuc2V0T2JqZWN0KCpkaWN0aW9uYXJ5X29iamVjdCk7Cit9CisKK2lubGluZSB2b2lkIEZyb21KU1ZhbHVlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIHZhbHVlLAorICAgICAgICAgICAgICAgICBpbnQgY29udmVyc2lvbl9mbGFncywgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAge3tjbGFzc19uYW1lfX0qIG91dF9kaWN0aW9uYXJ5KSB7CisgIERDSEVDS19FUSgwLCBjb252ZXJzaW9uX2ZsYWdzKSA8PCAiVW5leHBlY3RlZCBjb252ZXJzaW9uIGZsYWdzLiI7CisgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2VzLWRpY3Rpb25hcnkKKworICBpZiAodmFsdWUuaXNVbmRlZmluZWQoKSB8fCB2YWx1ZS5pc051bGwoKSkgeworICAgIC8vIFRoZSBkZWZhdWx0IGNvbnN0cnVjdG9yIHdpbGwgYXNzaWduIGFwcHJvcHJpYXRlIHZhbHVlcyB0byBkaWN0aW9uYXJ5CisgICAgLy8gbWVtYmVycyB3aXRoIGRlZmF1bHQgdmFsdWVzIGFuZCBsZWF2ZSB0aGUgb3RoZXJzIHVuc2V0LgorICAgICpvdXRfZGljdGlvbmFyeSA9IHt7Y2xhc3NfbmFtZX19KCk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghdmFsdWUuaXNPYmplY3QoKSkgeworICAgIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IFVuZGVmaW5lZCwgTnVsbCBvciBPYmplY3QsIHRoZW4gdGhyb3cgYSBUeXBlRXJyb3IuCisgICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa05vdE9iamVjdFR5cGUpOworICAgIHJldHVybjsKKyAgfQorICBKUzo6Um9vdGVkT2JqZWN0IGRpY3Rpb25hcnlfb2JqZWN0KGNvbnRleHQsICZ2YWx1ZS50b09iamVjdCgpKTsKK3slIGZvciBtZW1iZXIgaW4gbWVtYmVycyAlfQorICBKUzo6Um9vdGVkVmFsdWUge3ttZW1iZXIubmFtZX19KGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICJ7e21lbWJlci5pZGxfbmFtZX19IiwKKyAgICAgICAgICAgICAgICAgICAgICAme3ttZW1iZXIubmFtZX19KSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtTaW1wbGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghe3ttZW1iZXIubmFtZX19LmlzVW5kZWZpbmVkKCkpIHsKKyAgICB7e21lbWJlci50eXBlfX0gY29udmVydGVkX3ZhbHVlOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHt7bWVtYmVyLm5hbWV9fSwgMCwgZXhjZXB0aW9uX3N0YXRlLCAmY29udmVydGVkX3ZhbHVlKTsKKyAgICBpZiAoY29udGV4dC0+aXNFeGNlcHRpb25QZW5kaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X2RpY3Rpb25hcnktPnNldF97e21lbWJlci5uYW1lfX0oY29udmVydGVkX3ZhbHVlKTsKKyAgfQoreyUgZW5kZm9yICV9Cit9CisKK30KK30KK30KKworeyUgaWYgY29uZGl0aW9uYWwgJX0KKyNlbmRpZiAgLy8gZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCisKK3slIGVuZGlmICV9CisjZW5kaWYgIC8vIHt7Y2xhc3NfbmFtZX19X2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQppbmRleCAyZjY3MzY0Li40ZTI4MzliIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCkBAIC0yNywxMSArMjcsMTEgQEAKIHslIGJsb2NrIGluY2x1ZGVzICV9CiB7eyBzdXBlcigpIH19CiAjaW5jbHVkZSAiYmFzZS9sYXp5X2luc3RhbmNlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKQEAgLTQxLDYgKzQxLDcgQEAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgogeyUgaWYgaXNfZXhjZXB0aW9uX2ludGVyZmFjZSAlfQogI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2V4bi5oIgpAQCAtNTIsMjQgKzUzLDI0IEBACiB1c2luZyBjb2JhbHQ6OnNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjsKIHVzaW5nIGNvYmFsdDo6c2NyaXB0OjpDYWxsYmFja0ludGVyZmFjZVRyYWl0czsKIHVzaW5nIGNvYmFsdDo6c2NyaXB0OjpFeGNlcHRpb25TdGF0ZTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CiB1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OkZyb21KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpJbnRlcmZhY2VEYXRhOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0NhbGxiYWNrRnVuY3Rpb247Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzRXhjZXB0aW9uU3RhdGU7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzR2xvYmFsRW52aXJvbm1lbnQ7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Cit1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlByb3h5SGFuZGxlcjsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VG9KU1ZhbHVlOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpUeXBlVHJhaXRzOwordXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpXcmFwcGVyRmFjdG9yeTsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7CiB1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtDb252ZXJzaW9uRmxhZ051bGxhYmxlOwogdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdSZXN0cmljdGVkOwogdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdE51bGxBc0VtcHR5U3RyaW5nOwogdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjprQ29udmVyc2lvbkZsYWdUcmVhdFVuZGVmaW5lZEFzRW1wdHlTdHJpbmc7CiB1c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OmtOb0NvbnZlcnNpb25GbGFnczsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6SW50ZXJmYWNlRGF0YTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6TW96anNDYWxsYmFja0Z1bmN0aW9uOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc0dsb2JhbEVudmlyb25tZW50OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpNb3pqc1VzZXJPYmplY3RIb2xkZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6Ok1vempzUHJvcGVydHlFbnVtZXJhdG9yOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6Om1vempzOjpQcm94eUhhbmRsZXI7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OlRvSlNWYWx1ZTsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6VHlwZVRyYWl0czsKLXVzaW5nIGNvYmFsdDo6c2NyaXB0Ojptb3pqczo6V3JhcHBlclByaXZhdGU7Ci11c2luZyBjb2JhbHQ6OnNjcmlwdDo6bW96anM6OldyYXBwZXJGYWN0b3J5OwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OldyYXBwYWJsZTsKIHslIGVuZGJsb2NrIHVzaW5nX2RpcmVjdGl2ZXMgJX0KIHslIGJsb2NrIGVudW1lcmF0aW9uX2RlY2xhcmF0aW9ucyAlfQogeyUgaWYgZW51bWVyYXRpb25zfGxlbmd0aCAlfQpAQCAtMTY0LDcgKzE2NSw2IEBACiAgICAgdnAuc2V0KHJlc3VsdF92YWx1ZSk7CiAgIH0KICAgcmV0dXJuICFleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpOwotCiB9CiAKIHslIGVuZGlmICV9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9tYWNyb3MuY2MudGVtcGxhdGUgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9tYWNyb3MuY2MudGVtcGxhdGUKaW5kZXggNTVhNGEwMy4uNmFkYmFiNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvbWFjcm9zLmNjLnRlbXBsYXRlCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL21hY3Jvcy5jYy50ZW1wbGF0ZQpAQCAtMTgsNiArMTgsMTYgQEAKICAjIENoZWNrcyBpZiBvYmplY3QgaW1wbGVtZW50cyBpbnRlcmZhY2UuCiAgI30KIHslIG1hY3JvIGNoZWNrX2lmX29iamVjdF9pbXBsZW1lbnRzX2ludGVyZmFjZSgpICV9CisgIGNvbnN0IEpTQ2xhc3MqIHByb3RvX2NsYXNzID0KKyAgICAgIHt7YmluZGluZ19jbGFzc319OjpQcm90b3R5cGVDbGFzcyhjb250ZXh0KTsKKyAgaWYgKHByb3RvX2NsYXNzID09IEpTX0dldENsYXNzKG9iamVjdCkpIHsKKyAgICAvLyBTaW1wbHkgcmV0dXJucyB0cnVlIGlmIHRoZSBvYmplY3QgaXMgdGhpcyBjbGFzcydzIHByb3RvdHlwZSBvYmplY3QuCisgICAgLy8gVGhlcmUgaXMgbm8gbmVlZCB0byByZXR1cm4gYW55IHZhbHVlIGR1ZSB0byB0aGUgb2JqZWN0IGlzIG5vdCBhIHBsYXRmb3JtCisgICAgLy8gb2JqZWN0LiBUaGUgZXhlY3V0aW9uIHJlYWNoZXMgaGVyZSB3aGVuIE9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IKKyAgICAvLyBnZXRzIGNhbGxlZCBvbiBuYXRpdmUgb2JqZWN0IHByb3RvdHlwZXMuCisgICAgcmV0dXJuIHRydWU7CisgIH0KKwogICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQogICAgICAgc3RhdGljX2Nhc3Q8TW96anNHbG9iYWxFbnZpcm9ubWVudCo+KEpTX0dldENvbnRleHRQcml2YXRlKGNvbnRleHQpKTsKICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9IGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL2NvZGVfZ2VuZXJhdG9yLnB5IGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy9jb2RlX2dlbmVyYXRvci5weQppbmRleCA4OTZmMTY5Li5mYWQ0YjY5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL2NvZGVfZ2VuZXJhdG9yLnB5CisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvY29kZV9nZW5lcmF0b3IucHkKQEAgLTYwLDcgKzYwLDcgQEAKIAogICBAcHJvcGVydHkKICAgZGVmIGdlbmVyYXRlZF9maWxlX3ByZWZpeChzZWxmKToKLSAgICByZXR1cm4gJ01vempzJworICAgIHJldHVybiAnbW96anMnCiAKICAgQHByb3BlcnR5CiAgIGRlZiBleHByZXNzaW9uX2dlbmVyYXRvcihzZWxmKToKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS5jYy50ZW1wbGF0ZSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS5jYy50ZW1wbGF0ZQppbmRleCA4OTVlNDUzLi4wZDIyNzJjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuY2MudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmNjLnRlbXBsYXRlCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzY250eHQuaCIKIHslIGVuZGJsb2NrIGluY2x1ZGVzICV9CkBAIC0zNSw3ICszNiw2IEBACiB7JSBlbmRibG9jayB1c2luZ19kaXJlY3RpdmVzICV9CiAKIHslIGJsb2NrIGltcGxlbWVudGF0aW9uICV9Ci1uYW1lc3BhY2UgY29iYWx0IHsKIHslIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50cyAlfQogbmFtZXNwYWNlIHt7Y29tcG9uZW50fX0gewogeyUgZW5kZm9yICV9CkBAIC00Niw2ICs0NiwxMiBAQAogICAgIDogY29udGV4dF8oY29udGV4dCksCiAgICAgICBpbXBsZW1lbnRpbmdfb2JqZWN0Xyhjb250ZXh0LCBpbXBsZW1lbnRpbmdfb2JqZWN0KSB7IH0KIAore3tiaW5kaW5nX2NsYXNzfX06Ont7YmluZGluZ19jbGFzc319KAorICAgIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBKUzo6SGFuZGxlVmFsdWUgaW1wbGVtZW50aW5nX29iamVjdF92YWx1ZSkKKyAgICA6IGNvbnRleHRfKGNvbnRleHQpLAorICAgICAgaW1wbGVtZW50aW5nX29iamVjdF8oY29udGV4dCwgaW1wbGVtZW50aW5nX29iamVjdF92YWx1ZSkgeyB9CisKIHslIGZvciBvcGVyYXRpb24gaW4gb3BlcmF0aW9ucyAlfQogeyUgZm9yIG92ZXJsb2FkIGluIG9wZXJhdGlvbi5vdmVybG9hZHMgJX0KIHt7b3ZlcmxvYWQudHlwZX19IHt7YmluZGluZ19jbGFzc319Ojp7e292ZXJsb2FkLm5hbWV9fSgKQEAgLTYwLDkgKzY2LDEwIEBACiB7JSBlbmRpZiAlfQogICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7CiAgIEpTRXhjZXB0aW9uU3RhdGUqIHByZXZpb3VzX2V4Y2VwdGlvbl9zdGF0ZSA9IEpTX1NhdmVFeGNlcHRpb25TdGF0ZShjb250ZXh0Xyk7CisgIEVOQUJMRV9KU19TVEFDS19UUkFDRV9JTl9TQ09QRShjb250ZXh0Xyk7CiAKICAgLy8gVGhpcyBjb3VsZCBiZSBzZXQgdG8gTlVMTCBpZiBpdCB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuCi0gIEpTOjpSb290ZWRPYmplY3QgaW1wbGVtZW50aW5nX29iamVjdChjb250ZXh0XywgaW1wbGVtZW50aW5nX29iamVjdF8uR2V0KCkpOworICBKUzo6Um9vdGVkT2JqZWN0IGltcGxlbWVudGluZ19vYmplY3QoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3RfLkdldE9iamVjdCgpKTsKICAgRExPR19JRihXQVJOSU5HLCAhaW1wbGVtZW50aW5nX29iamVjdCkgPDwgIkltcGxlbWVudGluZyBvYmplY3QgaXMgTlVMTC4iOwogICBpZiAoaW1wbGVtZW50aW5nX29iamVjdCkgewogICAgIEpTQXV0b0NvbXBhcnRtZW50IGF1dG9fY29tcGFydG1lbnQoY29udGV4dF8sIGltcGxlbWVudGluZ19vYmplY3QpOwpAQCAtMTE0LDggKzEyMSw3IEBACiB7JSBlbmRmb3IgJX0KIHslIGVuZGZvciAlfQogCi17JSBmb3IgY29tcG9uZW50IGluIGNvbXBvbmVudHMgJX0KK3slIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50c3xyZXZlcnNlICV9CiB9ICAvLyBuYW1lc3BhY2Uge3tjb21wb25lbnR9fQogeyUgZW5kZm9yICV9Ci19ICAvLyBuYW1lc3BhY2UgY29iYWx0CiB7JSBlbmRibG9jayBpbXBsZW1lbnRhdGlvbiAlfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuaC50ZW1wbGF0ZQppbmRleCAwMzY0Yjk4Li5hOWEzNzA3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuaC50ZW1wbGF0ZQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuaC50ZW1wbGF0ZQpAQCAtMjIsNyArMjIsNiBAQAogeyUgZW5kYmxvY2sgaW5jbHVkZXMgJX0KIAogeyUgYmxvY2sgaW1wbGVtZW50YXRpb24gJX0KLW5hbWVzcGFjZSBjb2JhbHQgewogeyUgZm9yIGNvbXBvbmVudCBpbiBjb21wb25lbnRzICV9CiBuYW1lc3BhY2Uge3tjb21wb25lbnR9fSB7CiB7JSBlbmRmb3IgJX0KQEAgLTMzLDYgKzMyLDggQEAKIAogICB7e2JpbmRpbmdfY2xhc3N9fSgKICAgICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0KTsKKyAge3tiaW5kaW5nX2NsYXNzfX0oCisgICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBpbXBsZW1lbnRpbmdfb2JqZWN0X3ZhbHVlKTsKIHslIGZvciBvcGVyYXRpb24gaW4gb3BlcmF0aW9ucyAlfQogeyUgZm9yIG92ZXJsb2FkIGluIG9wZXJhdGlvbi5vdmVybG9hZHMgJX0KICAge3tvdmVybG9hZC50eXBlfX0ge3tvdmVybG9hZC5uYW1lfX0oCkBAIC00MywxNiArNDQsMTkgQEAKICAgICAgIGJvb2wqIGhhZF9leGNlcHRpb24pIGNvbnN0IE9WRVJSSURFOwogeyUgZW5kZm9yICV9CiB7JSBlbmRmb3IgJX0KLSAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGltcGxlbWVudGluZ19vYmplY3RfLkdldCgpOyB9CisgIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBpbXBsZW1lbnRpbmdfb2JqZWN0Xy5HZXRPYmplY3QoKTsgfQorICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gaW1wbGVtZW50aW5nX29iamVjdF8uR2V0VmFsdWUoKTsgfQorICBib29sIFdhc0NvbGxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIGltcGxlbWVudGluZ19vYmplY3RfLldhc0NvbGxlY3RlZCgpOyB9CiAKICBwcml2YXRlOgogICBKU0NvbnRleHQqIGNvbnRleHRfOwogICBzY3JpcHQ6Om1vempzOjpXZWFrSGVhcE9iamVjdCBpbXBsZW1lbnRpbmdfb2JqZWN0XzsKIH07CiAKLXslIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50cyAlfQoreyUgZm9yIGNvbXBvbmVudCBpbiBjb21wb25lbnRzfHJldmVyc2UgJX0KIH0gIC8vIG5hbWVzcGFjZSB7e2NvbXBvbmVudH19CiB7JSBlbmRmb3IgJX0KK25hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNjcmlwdCB7CiAvLyBFeHBsaWNpdCBpbnN0YW50aWF0aW9uIG9mIENhbGxiYWNrSW50ZXJmYWNlVHJhaXRzIHN0cnVjdCBzbyB3ZSBjYW4gaW5mZXIKIC8vIHRoZSB0eXBlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3MgZnJvbSB0aGUgdHlwZSBvZiB0aGUgY2FsbGJhY2sgaW50ZXJmYWNlLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvZGljdGlvbmFyeS1jb252ZXJzaW9uLmgudGVtcGxhdGUgYi9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9kaWN0aW9uYXJ5LWNvbnZlcnNpb24uaC50ZW1wbGF0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZWVmN2QwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvZGljdGlvbmFyeS1jb252ZXJzaW9uLmgudGVtcGxhdGUKQEAgLTAsMCArMSwxMzYgQEAKK3sjCisgIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICMKKyAjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgIworICMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICMKKyAjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICN9CisvKgorICogQ29weXJpZ2h0IHt7dG9kYXkueWVhcn19IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gY2xhbmctZm9ybWF0IG9mZgorCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkge3tjb2RlX2dlbmVyYXRvcn19LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZToge3t0ZW1wbGF0ZV9wYXRofX0KKworI2lmbmRlZiB7e2NsYXNzX25hbWV9fV9jb252ZXJzaW9uX2gKKyNkZWZpbmUge3tjbGFzc19uYW1lfX1fY29udmVyc2lvbl9oCisKK3slIGlmIGNvbmRpdGlvbmFsICV9CisjaWYgZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCisKK3slIGVuZGlmICV9Cit7JSBibG9jayBpbmNsdWRlcyAlfQorI2luY2x1ZGUgInt7aGVhZGVyX2ZpbGV9fSIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgoreyUgZm9yIGluY2x1ZGUgaW4gaGVhZGVyX2luY2x1ZGVzICV9CisjaW5jbHVkZSAie3tpbmNsdWRlfX0iCit7JSBlbmRmb3IgJX0KK3slIGVuZGJsb2NrIGluY2x1ZGVzICV9CisKK3VzaW5nIHt7Y29tcG9uZW50c3xqb2luKCc6OicpfX06Ont7Y2xhc3NfbmFtZX19OworeyUgZm9yIHVzZWRfY2xhc3MgaW4gZm9yd2FyZF9kZWNsYXJhdGlvbnMgJX0KK3slIGlmIHVzZWRfY2xhc3MuY29uZGl0aW9uYWwgJX0KKyNpZiBkZWZpbmVkKHt7dXNlZF9jbGFzcy5jb25kaXRpb25hbH19KQoreyUgZW5kaWYgJX0KK3VzaW5nIHt7dXNlZF9jbGFzcy5mdWxseV9xdWFsaWZpZWRfbmFtZX19OworeyUgaWYgdXNlZF9jbGFzcy5jb25kaXRpb25hbCAlfQorI2VuZGlmICAvLyBkZWZpbmVkKHt7dXNlZF9jbGFzcy5jb25kaXRpb25hbH19KQoreyUgZW5kaWYgJX0KK3slIGVuZGZvciAlfQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBzY3JpcHQgeworbmFtZXNwYWNlIG1vempzIHsKKworaW5saW5lIHZvaWQgVG9KU1ZhbHVlKAorICAgIEpTQ29udGV4dCogY29udGV4dCwKKyAgICBjb25zdCB7e2NsYXNzX25hbWV9fSYgaW5fZGljdGlvbmFyeSwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgeworICAvLyBDcmVhdGUgYSBuZXcgb2JqZWN0IHRoYXQgd2lsbCBob2xkIHRoZSBkaWN0aW9uYXJ5IHZhbHVlcy4KKyAgSlM6OlJvb3RlZE9iamVjdCBkaWN0aW9uYXJ5X29iamVjdCgKKyAgICAgIGNvbnRleHQsIEpTX05ld09iamVjdChjb250ZXh0LCBOVUxMLCBOVUxMLCBOVUxMKSk7CisgIGNvbnN0IGludCBrUHJvcGVydHlBdHRyaWJ1dGVzID0gSlNQUk9QX0VOVU1FUkFURTsKK3slIGZvciBtZW1iZXIgaW4gbWVtYmVycyAlfQorICBpZiAoaW5fZGljdGlvbmFyeS5oYXNfe3ttZW1iZXIubmFtZX19KCkpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgbWVtYmVyX3ZhbHVlKGNvbnRleHQpOworICAgIFRvSlNWYWx1ZShjb250ZXh0LCBpbl9kaWN0aW9uYXJ5Lnt7bWVtYmVyLm5hbWV9fSgpLCAmbWVtYmVyX3ZhbHVlKTsKKyAgICBpZiAoIUpTX0RlZmluZVByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgInt7bWVtYmVyLmlkbF9uYW1lfX0iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtYmVyX3ZhbHVlLCBOVUxMLCBOVUxMLCBrUHJvcGVydHlBdHRyaWJ1dGVzKSkgeworICAgICAgLy8gU29tZSBpbnRlcm5hbCBlcnJvciBvY2N1cnJlZC4KKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KK3slIGVuZGZvciAlfQorICBvdXRfdmFsdWUuc2V0KE9CSkVDVF9UT19KU1ZBTChkaWN0aW9uYXJ5X29iamVjdCkpOworfQorCitpbmxpbmUgdm9pZCBGcm9tSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgaW50IGNvbnZlcnNpb25fZmxhZ3MsIEV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgIHt7Y2xhc3NfbmFtZX19KiBvdXRfZGljdGlvbmFyeSkgeworICBEQ0hFQ0tfRVEoMCwgY29udmVyc2lvbl9mbGFncykgPDwgIlVuZXhwZWN0ZWQgY29udmVyc2lvbiBmbGFncy4iOworICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNlcy1kaWN0aW9uYXJ5CisKKyAgaWYgKHZhbHVlLmlzVW5kZWZpbmVkKCkgfHwgdmFsdWUuaXNOdWxsKCkpIHsKKyAgICAvLyBUaGUgZGVmYXVsdCBjb25zdHJ1Y3RvciB3aWxsIGFzc2lnbiBhcHByb3ByaWF0ZSB2YWx1ZXMgdG8gZGljdGlvbmFyeQorICAgIC8vIG1lbWJlcnMgd2l0aCBkZWZhdWx0IHZhbHVlcyBhbmQgbGVhdmUgdGhlIG90aGVycyB1bnNldC4KKyAgICAqb3V0X2RpY3Rpb25hcnkgPSB7e2NsYXNzX25hbWV9fSgpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIXZhbHVlLmlzT2JqZWN0KCkpIHsKKyAgICAvLyAxLiBJZiBUeXBlKFYpIGlzIG5vdCBVbmRlZmluZWQsIE51bGwgb3IgT2JqZWN0LCB0aGVuIHRocm93IGEgVHlwZUVycm9yLgorICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtOb3RPYmplY3RUeXBlKTsKKyAgICByZXR1cm47CisgIH0KKyAgSlM6OlJvb3RlZE9iamVjdCBkaWN0aW9uYXJ5X29iamVjdChjb250ZXh0LCBKU1ZBTF9UT19PQkpFQ1QodmFsdWUpKTsKK3slIGZvciBtZW1iZXIgaW4gbWVtYmVycyAlfQorICBKUzo6Um9vdGVkVmFsdWUge3ttZW1iZXIubmFtZX19KGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5KGNvbnRleHQsIGRpY3Rpb25hcnlfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICJ7e21lbWJlci5pZGxfbmFtZX19IiwKKyAgICAgICAgICAgICAgICAgICAgICB7e21lbWJlci5uYW1lfX0uYWRkcmVzcygpKSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtTaW1wbGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIGlmICghe3ttZW1iZXIubmFtZX19LmlzVW5kZWZpbmVkKCkpIHsKKyAgICB7e21lbWJlci50eXBlfX0gY29udmVydGVkX3ZhbHVlOworICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHt7bWVtYmVyLm5hbWV9fSwgMCwgZXhjZXB0aW9uX3N0YXRlLCAmY29udmVydGVkX3ZhbHVlKTsKKyAgICBpZiAoY29udGV4dC0+aXNFeGNlcHRpb25QZW5kaW5nKCkpIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X2RpY3Rpb25hcnktPnNldF97e21lbWJlci5uYW1lfX0oY29udmVydGVkX3ZhbHVlKTsKKyAgfQoreyUgZW5kZm9yICV9Cit9CisKK30KK30KK30KKworeyUgaWYgY29uZGl0aW9uYWwgJX0KKyNlbmRpZiAgLy8gZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCisKK3slIGVuZGlmICV9CisjZW5kaWYgIC8vIHt7Y2xhc3NfbmFtZX19X2gKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2ludGVyZmFjZS5jYy50ZW1wbGF0ZQppbmRleCAwNmMyM2MzLi5hYzQyOGZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlCkBAIC0xNDYsMTEgKzE0NiwxMiBAQAogICAgIE5PVFJFQUNIRUQoKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKwoge3sgbm9uc3RhdGljX2Z1bmN0aW9uX3Byb2xvZ3VlKGltcGxfY2xhc3MpIH19CiAgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CiAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCiAgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKLSAgaWYoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewogICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CiAgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KICAgICBOT1RSRUFDSEVEKCk7CkBAIC0xODAsNyArMTgxLDcgQEAKICAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKICAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKICAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CiAgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKICAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgogICAgIE5PVFJFQUNIRUQoKTsKQEAgLTIzOSw3ICsyNDAsNyBAQAoge3sgbm9uc3RhdGljX2Z1bmN0aW9uX3Byb2xvZ3VlKGltcGxfY2xhc3MpIH19CiAgIHVpbnQzMl90IGluZGV4OwogICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLCAmaW5kZXgpOwotICBpZihleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CiAgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKICAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgogICAgIE5PVFJFQUNIRUQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL21hY3Jvcy5jYy50ZW1wbGF0ZSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL21hY3Jvcy5jYy50ZW1wbGF0ZQppbmRleCA1OGI1NjY5Li40NDM2NDc1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9tYWNyb3MuY2MudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvbWFjcm9zLmNjLnRlbXBsYXRlCkBAIC0xOCw2ICsxOCwxNiBAQAogICMgQ2hlY2tzIGlmIG9iamVjdCBpbXBsZW1lbnRzIGludGVyZmFjZS4KICAjfQogeyUgbWFjcm8gY2hlY2tfaWZfb2JqZWN0X2ltcGxlbWVudHNfaW50ZXJmYWNlKCkgJX0KKyAgY29uc3QgSlNDbGFzcyogcHJvdG9fY2xhc3MgPQorICAgICAge3tiaW5kaW5nX2NsYXNzfX06OlByb3RvdHlwZUNsYXNzKGNvbnRleHQpOworICBpZiAocHJvdG9fY2xhc3MgPT0gSlNfR2V0Q2xhc3Mob2JqZWN0KSkgeworICAgIC8vIFNpbXBseSByZXR1cm5zIHRydWUgaWYgdGhlIG9iamVjdCBpcyB0aGlzIGNsYXNzJ3MgcHJvdG90eXBlIG9iamVjdC4KKyAgICAvLyBUaGVyZSBpcyBubyBuZWVkIHRvIHJldHVybiBhbnkgdmFsdWUgZHVlIHRvIHRoZSBvYmplY3QgaXMgbm90IGEgcGxhdGZvcm0KKyAgICAvLyBvYmplY3QuIFRoZSBleGVjdXRpb24gcmVhY2hlcyBoZXJlIHdoZW4gT2JqZWN0LmdldE93blByb3BlcnR5RGVzY3JpcHRvcgorICAgIC8vIGdldHMgY2FsbGVkIG9uIG5hdGl2ZSBvYmplY3QgcHJvdG90eXBlcy4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCiAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICBzdGF0aWNfY2FzdDxNb3pqc0dsb2JhbEVudmlyb25tZW50Kj4oSlNfR2V0Q29udGV4dFByaXZhdGUoY29udGV4dCkpOwogICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5ID0gZ2xvYmFsX2Vudmlyb25tZW50LT53cmFwcGVyX2ZhY3RvcnkoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvbmFtZV9jb252ZXJzaW9uLnB5IGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9uYW1lX2NvbnZlcnNpb24ucHkKaW5kZXggZmIwYzliMS4uMTY3ODI0MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9uYW1lX2NvbnZlcnNpb24ucHkKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9uYW1lX2NvbnZlcnNpb24ucHkKQEAgLTExLDcgKzExLDYgQEAKICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCiAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KICIiIlV0aWxpdGllcyBmb3IgY29udmVydGluZyBiZXR3ZWVuIElETCBhbmQgQ29iYWx0IG5hbWluZyBjb252ZW50aW9ucy4iIiIKIAogaW1wb3J0IHJlCkBAIC0zOSw5ICszOCwxMSBAQAogZGVmIGNvbnZlcnRfdG9fY29iYWx0X25hbWUoY2xhc3NfbmFtZSk6CiAgIGNvYmFsdF9uYW1lID0gdGl0bGVjYXNlX3dvcmRfZGVsaW1pdGVyX3JlLnN1YignXycsIGNsYXNzX25hbWUpLmxvd2VyKCkKICAgZm9yIHRlcm0gaW4gd29yZF9saXN0OgotICAgIHJlcGxhY2VtZW50ID0gW3Rva2VuIGZvciB0b2tlbiBpbgotICAgICAgICAgICAgICAgICAgIHJlLnNwbGl0KCdfPyglcylfPycgJSB0ZXJtLCBjb2JhbHRfbmFtZSwgcmUuSUdOT1JFQ0FTRSkKLSAgICAgICAgICAgICAgICAgICBpZiB0b2tlbl0KKyAgICByZXBsYWNlbWVudCA9IFsKKyAgICAgICAgdG9rZW4KKyAgICAgICAgZm9yIHRva2VuIGluIHJlLnNwbGl0KCdfPyglcylfPycgJSB0ZXJtLCBjb2JhbHRfbmFtZSwgcmUuSUdOT1JFQ0FTRSkKKyAgICAgICAgaWYgdG9rZW4KKyAgICBdCiAgICAgY29iYWx0X25hbWUgPSAnXycuam9pbihyZXBsYWNlbWVudCkKICAgcmV0dXJuIGNvYmFsdF9uYW1lCiAKQEAgLTUxLDIxICs1MiwyMCBAQAogCiAKIGRlZiBjb252ZXJ0X3RvX2NvYmFsdF9jb25zdGFudF9uYW1lKGNvbnN0YW50X25hbWUpOgotICByZXR1cm4gJ2snICsgJycuam9pbigKLSAgICAgICh0b2tlbi5jYXBpdGFsaXplKCkgZm9yIHRva2VuIGluIGNvbnN0YW50X25hbWUuc3BsaXQoJ18nKSkpCisgIHJldHVybiAnaycgKyAnJy5qb2luKCh0b2tlbi5jYXBpdGFsaXplKCkKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciB0b2tlbiBpbiBjb25zdGFudF9uYW1lLnNwbGl0KCdfJykpKQogCiAKIGRlZiBjb252ZXJ0X3RvX2NvYmFsdF9lbnVtZXJhdGlvbl92YWx1ZShlbnVtX3ZhbHVlKToKLSAgcmV0dXJuICdrJyArICcnLmpvaW4oKAotICAgICAgdG9rZW4uY2FwaXRhbGl6ZSgpCi0gICAgICBmb3IgdG9rZW4gaW4gZW51bWVyYXRpb25fdmFsdWVfd29yZF9kZWxpbWV0ZXJfcmUuc3BsaXQoCi0gICAgICAgICAgZW51bV92YWx1ZSkpKQorICByZXR1cm4gJ2snICsgJycuam9pbigKKyAgICAgICh0b2tlbi5jYXBpdGFsaXplKCkKKyAgICAgICBmb3IgdG9rZW4gaW4gZW51bWVyYXRpb25fdmFsdWVfd29yZF9kZWxpbWV0ZXJfcmUuc3BsaXQoZW51bV92YWx1ZSkpKQogCiAKIGRlZiBnZXRfaW50ZXJmYWNlX25hbWUoaWRsX3R5cGUpOgogICAiIiJHZXQgdGhlIHVuZGVybHlpbmcgaW50ZXJmYWNlIG5hbWUgZnJvbSBhbiBpZGxfdHlwZS4iIiIKLSAgYXNzZXJ0IChpZGxfdHlwZS5pc19pbnRlcmZhY2VfdHlwZSBvcgotICAgICAgICAgIGlkbF90eXBlLmlzX2NhbGxiYWNrX2Z1bmN0aW9uIG9yIGlkbF90eXBlLmlzX2VudW0pCisgIGFzc2VydCAoaWRsX3R5cGUuaXNfaW50ZXJmYWNlX3R5cGUgb3IgaWRsX3R5cGUuaXNfY2FsbGJhY2tfZnVuY3Rpb24gb3IKKyAgICAgICAgICBpZGxfdHlwZS5pc19lbnVtIG9yIGlkbF90eXBlLmlzX2RpY3Rpb25hcnkpCiAgIGlmIGlkbF90eXBlLmlzX251bGxhYmxlOgogICAgIHJldHVybiBpZGxfdHlwZS5pbm5lcl90eXBlLm5hbWUKICAgZWxpZiBpZGxfdHlwZS5uYW1lLmVuZHN3aXRoKCdDb25zdHJ1Y3RvckNvbnN0cnVjdG9yJyk6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3BhdGhfZ2VuZXJhdG9yLnB5IGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9wYXRoX2dlbmVyYXRvci5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZjNhMDg5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9wYXRoX2dlbmVyYXRvci5weQpAQCAtMCwwICsxLDEyNiBAQAorIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorIiIiSGVscGVyIGNsYXNzIGZvciBnZXR0aW5nIG5hbWVzIGFuZCBwYXRocyByZWxhdGVkIHRvIGludGVyZmFjZXMuIiIiCisKK2ltcG9ydCBvcworCitmcm9tIGNvYmFsdC5idWlsZC5wYXRoX2NvbnZlcnNpb24gaW1wb3J0IENvbnZlcnRQYXRoCisKKworZGVmIF9Ob3JtYWxpemVTbGFzaGVzKHBhdGgpOgorICBpZiBvcy5wYXRoLnNlcCA9PSAnXFwnOgorICAgIHJldHVybiBwYXRoLnJlcGxhY2UoJ1xcJywgJy8nKQorICBlbHNlOgorICAgIHJldHVybiBwYXRoCisKKworY2xhc3MgUGF0aEJ1aWxkZXIob2JqZWN0KToKKyAgIiIiUHJvdmlkZXMgaGVscGVyIGZ1bmN0aW9ucyBmb3IgZ2V0dGluZyBwYXRocyByZWxhdGVkIHRvIGFuIGludGVyZmFjZS4iIiIKKworICBkZWYgX19pbml0X18oc2VsZiwgZW5naW5lX3ByZWZpeCwgaW50ZXJmYWNlc19pbmZvLCBpbnRlcmZhY2VzX3Jvb3QsCisgICAgICAgICAgICAgICBnZW5lcmF0ZWRfcm9vdF9kaXJlY3RvcnkpOgorICAgIHNlbGYuaW50ZXJmYWNlc19yb290ID0gX05vcm1hbGl6ZVNsYXNoZXMoaW50ZXJmYWNlc19yb290KQorICAgIHNlbGYuZ2VuZXJhdGVkX3Jvb3QgPSBfTm9ybWFsaXplU2xhc2hlcyhnZW5lcmF0ZWRfcm9vdF9kaXJlY3RvcnkpCisgICAgc2VsZi5lbmdpbmVfcHJlZml4ID0gZW5naW5lX3ByZWZpeAorICAgIHNlbGYuaW50ZXJmYWNlc19pbmZvID0gaW50ZXJmYWNlc19pbmZvCisKKyAgZGVmIE5hbWVzcGFjZUNvbXBvbmVudHMoc2VsZiwgaW50ZXJmYWNlX25hbWUpOgorICAgICIiIkdldCB0aGUgaW50ZXJmYWNlJ3MgbmFtZXNwYWNlIGFzIGEgbGlzdCBvZiBuYW1lc3BhY2UgY29tcG9uZW50cy4iIiIKKyAgICAjIEdldCB0aGUgSURMIGZpbGVuYW1lIHJlbGF0aXZlIHRvIHRoZSBjb2JhbHQgZGlyZWN0b3J5LCBhbmQgc3BsaXQgdGhlCisgICAgIyBkaXJlY3RvcnkgdG8gZ2V0IHRoZSBsaXN0IG9mIG5hbWVzcGFjZSBjb21wb25lbnRzLgorICAgIGludGVyZmFjZV9pbmZvID0gc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdCisgICAgaWRsX3BhdGggPSBpbnRlcmZhY2VfaW5mb1snZnVsbF9wYXRoJ10KKworICAgIGlkbF9wYXRoID0gb3MucGF0aC5yZWxwYXRoKGlkbF9wYXRoLCBzZWxmLmludGVyZmFjZXNfcm9vdCkKKyAgICBjb21wb25lbnRzID0gb3MucGF0aC5kaXJuYW1lKGlkbF9wYXRoKS5zcGxpdChvcy5zZXApCisgICAgcmV0dXJuIFtvcy5wYXRoLmJhc2VuYW1lKHNlbGYuaW50ZXJmYWNlc19yb290KV0gKyBjb21wb25lbnRzCisKKyAgZGVmIEJpbmRpbmdzQ2xhc3Moc2VsZiwgaW50ZXJmYWNlX25hbWUpOgorICAgICIiIkdldCB0aGUgbmFtZSBvZiB0aGUgZ2VuZXJhdGVkIGJpbmRpbmdzIGNsYXNzLiIiIgorICAgIHJldHVybiBzZWxmLmVuZ2luZV9wcmVmaXguY2FwaXRhbGl6ZSgpICsgaW50ZXJmYWNlX25hbWUKKworICBkZWYgRnVsbEJpbmRpbmdzQ2xhc3NOYW1lKHNlbGYsIGludGVyZmFjZV9uYW1lKToKKyAgICAiIiJHZXQgdGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoZSBnZW5lcmF0ZWQgYmluZGluZ3MgY2xhc3MuIiIiCisgICAgY29tcG9uZW50cyA9IHNlbGYuTmFtZXNwYWNlQ29tcG9uZW50cyhpbnRlcmZhY2VfbmFtZSkKKyAgICByZXR1cm4gJzo6Jy5qb2luKGNvbXBvbmVudHMgKyBbc2VsZi5CaW5kaW5nc0NsYXNzKGludGVyZmFjZV9uYW1lKV0pCisKKyAgZGVmIEZ1bGxDbGFzc05hbWUoc2VsZiwgaW50ZXJmYWNlX25hbWUpOgorICAgICIiIkdldCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLiIiIgorICAgIGNvbXBvbmVudHMgPSBzZWxmLk5hbWVzcGFjZUNvbXBvbmVudHMoaW50ZXJmYWNlX25hbWUpCisgICAgcmV0dXJuICc6Oicuam9pbihjb21wb25lbnRzICsgW2ludGVyZmFjZV9uYW1lXSkKKworICBkZWYgSW1wbGVtZW50YXRpb25IZWFkZXJQYXRoKHNlbGYsIGludGVyZmFjZV9uYW1lKToKKyAgICAiIiJHZXQgYW4gI2luY2x1ZGUgcGF0aCB0byB0aGUgaW50ZXJmYWNlJ3MgaW1wbGVtZW50YXRpb24gLmggZmlsZS4iIiIKKyAgICBpbnRlcmZhY2VfaW5mbyA9IHNlbGYuaW50ZXJmYWNlc19pbmZvW2ludGVyZmFjZV9uYW1lXQorICAgIHBhdGggPSBDb252ZXJ0UGF0aCgKKyAgICAgICAgaW50ZXJmYWNlX2luZm9bJ2Z1bGxfcGF0aCddLCBmb3J3YXJkX3NsYXNoZXM9VHJ1ZSwgb3V0cHV0X2V4dGVuc2lvbj0naCcpCisgICAgcmV0dXJuIG9zLnBhdGgucmVscGF0aChwYXRoLCBvcy5wYXRoLmRpcm5hbWUoc2VsZi5pbnRlcmZhY2VzX3Jvb3QpKQorCisgIGRlZiBCaW5kaW5nc0hlYWRlckluY2x1ZGVQYXRoKHNlbGYsIGludGVyZmFjZV9uYW1lKToKKyAgICAiIiJHZXQgYW4gI2luY2x1ZGUgcGF0aCB0byB0aGUgaW50ZXJmYWNlJ3MgZ2VuZXJhdGVkIC5oIGZpbGUuIiIiCisgICAgcGF0aCA9IHNlbGYuQmluZGluZ3NIZWFkZXJGdWxsUGF0aChpbnRlcmZhY2VfbmFtZSkKKyAgICByZXR1cm4gb3MucGF0aC5yZWxwYXRoKHBhdGgsIHNlbGYuZ2VuZXJhdGVkX3Jvb3QpCisKKyAgZGVmIEJpbmRpbmdzSGVhZGVyRnVsbFBhdGgoc2VsZiwgaW50ZXJmYWNlX25hbWUpOgorICAgICIiIkdldCB0aGUgZnVsbCBwYXRoIHRvIHRoZSBpbnRlcmZhY2UncyBpbXBsZW1lbnRhdGlvbiAuaCBmaWxlLiIiIgorICAgIGludGVyZmFjZV9pbmZvID0gc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdCisgICAgcmV0dXJuIENvbnZlcnRQYXRoKAorICAgICAgICBpbnRlcmZhY2VfaW5mb1snZnVsbF9wYXRoJ10sCisgICAgICAgIGZvcndhcmRfc2xhc2hlcz1UcnVlLAorICAgICAgICBvdXRwdXRfZGlyZWN0b3J5PXNlbGYuZ2VuZXJhdGVkX3Jvb3QsCisgICAgICAgIG91dHB1dF9wcmVmaXg9JyVzXycgJSBzZWxmLmVuZ2luZV9wcmVmaXgsCisgICAgICAgIG91dHB1dF9leHRlbnNpb249J2gnLAorICAgICAgICBiYXNlX2RpcmVjdG9yeT1vcy5wYXRoLmRpcm5hbWUoc2VsZi5pbnRlcmZhY2VzX3Jvb3QpKQorCisgIGRlZiBCaW5kaW5nc0ltcGxlbWVudGF0aW9uUGF0aChzZWxmLCBpbnRlcmZhY2VfbmFtZSk6CisgICAgIiIiR2V0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGludGVyZmFjZSdzIGltcGxlbWVudGF0aW9uIC5jYyBmaWxlLiIiIgorICAgIGludGVyZmFjZV9pbmZvID0gc2VsZi5pbnRlcmZhY2VzX2luZm9baW50ZXJmYWNlX25hbWVdCisgICAgcmV0dXJuIENvbnZlcnRQYXRoKAorICAgICAgICBpbnRlcmZhY2VfaW5mb1snZnVsbF9wYXRoJ10sCisgICAgICAgIGZvcndhcmRfc2xhc2hlcz1UcnVlLAorICAgICAgICBvdXRwdXRfZGlyZWN0b3J5PXNlbGYuZ2VuZXJhdGVkX3Jvb3QsCisgICAgICAgIG91dHB1dF9wcmVmaXg9JyVzXycgJSBzZWxmLmVuZ2luZV9wcmVmaXgsCisgICAgICAgIG91dHB1dF9leHRlbnNpb249J2NjJywKKyAgICAgICAgYmFzZV9kaXJlY3Rvcnk9b3MucGF0aC5kaXJuYW1lKHNlbGYuaW50ZXJmYWNlc19yb290KSkKKworICBkZWYgRGljdGlvbmFyeUhlYWRlckluY2x1ZGVQYXRoKHNlbGYsIGRpY3Rpb25hcnlfbmFtZSk6CisgICAgIiIiR2V0IHRoZSAjaW5jbHVkZSBwYXRoIHRvIHRoZSBkaWN0aW9uYXJ5J3MgaGVhZGVyLiIiIgorICAgIHBhdGggPSBzZWxmLkRpY3Rpb25hcnlIZWFkZXJGdWxsUGF0aChkaWN0aW9uYXJ5X25hbWUpCisgICAgcmV0dXJuIG9zLnBhdGgucmVscGF0aChwYXRoLCBzZWxmLmdlbmVyYXRlZF9yb290KQorCisgIGRlZiBEaWN0aW9uYXJ5SGVhZGVyRnVsbFBhdGgoc2VsZiwgZGljdGlvbmFyeV9uYW1lKToKKyAgICAiIiJHZXQgdGhlIGZ1bGwgcGF0aCB0byB0aGUgZGljdGlvbmFyeSdzIGdlbmVyYXRlZCBpbXBsZW1lbnRhdGlvbiBoZWFkZXIuIiIiCisgICAgaW50ZXJmYWNlX2luZm8gPSBzZWxmLmludGVyZmFjZXNfaW5mb1tkaWN0aW9uYXJ5X25hbWVdCisgICAgcmV0dXJuIENvbnZlcnRQYXRoKAorICAgICAgICBpbnRlcmZhY2VfaW5mb1snZnVsbF9wYXRoJ10sCisgICAgICAgIGZvcndhcmRfc2xhc2hlcz1UcnVlLAorICAgICAgICBvdXRwdXRfZGlyZWN0b3J5PXNlbGYuZ2VuZXJhdGVkX3Jvb3QsCisgICAgICAgIG91dHB1dF9leHRlbnNpb249J2gnLAorICAgICAgICBiYXNlX2RpcmVjdG9yeT1vcy5wYXRoLmRpcm5hbWUoc2VsZi5pbnRlcmZhY2VzX3Jvb3QpKQorCisgIGRlZiBEaWN0aW9uYXJ5Q29udmVyc2lvbkhlYWRlckluY2x1ZGVQYXRoKHNlbGYsIGRpY3Rpb25hcnlfbmFtZSk6CisgICAgIiIiR2V0IHRoZSAjaW5jbHVkZSBwYXRoIHRvIHRoZSBkaWN0aW9uYXJ5J3MgY29udmVyc2lvbiBoZWFkZXIuIiIiCisgICAgcGF0aCA9IHNlbGYuQmluZGluZ3NIZWFkZXJGdWxsUGF0aChkaWN0aW9uYXJ5X25hbWUpCisgICAgcmV0dXJuIG9zLnBhdGgucmVscGF0aChwYXRoLCBzZWxmLmdlbmVyYXRlZF9yb290KQorCisgIGRlZiBEaWN0aW9uYXJ5Q29udmVyc2lvbkhlYWRlckZ1bGxQYXRoKHNlbGYsIGRpY3Rpb25hcnlfbmFtZSk6CisgICAgIiIiR2V0IHRoZSBmdWxsIHBhdGggdG8gdGhlIGRpY3Rpb25hcnkncyBjb252ZXJzaW9uIGhlYWRlci4iIiIKKyAgICBpbnRlcmZhY2VfaW5mbyA9IHNlbGYuaW50ZXJmYWNlc19pbmZvW2RpY3Rpb25hcnlfbmFtZV0KKyAgICByZXR1cm4gQ29udmVydFBhdGgoCisgICAgICAgIGludGVyZmFjZV9pbmZvWydmdWxsX3BhdGgnXSwKKyAgICAgICAgZm9yd2FyZF9zbGFzaGVzPVRydWUsCisgICAgICAgIG91dHB1dF9kaXJlY3Rvcnk9c2VsZi5nZW5lcmF0ZWRfcm9vdCwKKyAgICAgICAgb3V0cHV0X3ByZWZpeD0nJXNfJyAlIHNlbGYuZW5naW5lX3ByZWZpeCwKKyAgICAgICAgb3V0cHV0X2V4dGVuc2lvbj0naCcsCisgICAgICAgIGJhc2VfZGlyZWN0b3J5PW9zLnBhdGguZGlybmFtZShzZWxmLmludGVyZmFjZXNfcm9vdCkpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3BhdGhfZ2VuZXJhdG9yX3Rlc3QucHkgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3BhdGhfZ2VuZXJhdG9yX3Rlc3QucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWUwYmJiOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvcGF0aF9nZW5lcmF0b3JfdGVzdC5weQpAQCAtMCwwICsxLDk0IEBACisjIS91c3IvYmluL2VudiBweXRob24KKyMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW1wb3J0IHVuaXR0ZXN0CisKK2ltcG9ydCBib290c3RyYXBfcGF0aCAgIyBweWxpbnQ6IGRpc2FibGU9dW51c2VkLWltcG9ydAorZnJvbSBjb2JhbHQuYmluZGluZ3MucGF0aF9nZW5lcmF0b3IgaW1wb3J0IFBhdGhCdWlsZGVyCisKKworY2xhc3MgUGF0aEJ1aWxkZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgc2VsZi5pbnRlcmZhY2VzX2luZm8gPSB7CisgICAgICAgICdUZXN0SW50ZXJmYWNlJzogeworICAgICAgICAgICAgJ2Z1bGxfcGF0aCc6ICcvc29tZS9wYXRoL3Jvb3QvdGhpcy9pcy9hL3Rlc3RfaW50ZXJmYWNlLmlkbCcKKyAgICAgICAgfQorICAgIH0KKyAgICBzZWxmLnBhdGhfYnVpbGRlciA9IFBhdGhCdWlsZGVyKCdwcmUnLCBzZWxmLmludGVyZmFjZXNfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcvc29tZS9wYXRoL3Jvb3QnLCAnL3BhdGgvdG8vZ2VuZXJhdGVkJykKKworICBkZWYgdGVzdE5hbWVzcGFjZUNvbXBvbmVudHMoc2VsZik6CisgICAgc2VsZi5hc3NlcnRMaXN0RXF1YWwoCisgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLk5hbWVzcGFjZUNvbXBvbmVudHMoJ1Rlc3RJbnRlcmZhY2UnKSwKKyAgICAgICAgWydyb290JywgJ3RoaXMnLCAnaXMnLCAnYSddKQorCisgIGRlZiB0ZXN0QmluZGluZ3NDbGFzcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuQmluZGluZ3NDbGFzcygnVGVzdEludGVyZmFjZScpLCAnUHJlVGVzdEludGVyZmFjZScpCisKKyAgZGVmIHRlc3RGdWxsQmluZGluZ3NDbGFzcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuRnVsbEJpbmRpbmdzQ2xhc3NOYW1lKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICdyb290Ojp0aGlzOjppczo6YTo6UHJlVGVzdEludGVyZmFjZScpCisKKyAgZGVmIHRlc3RGdWxsQ2xhc3Moc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkZ1bGxDbGFzc05hbWUoJ1Rlc3RJbnRlcmZhY2UnKSwKKyAgICAgICAgJ3Jvb3Q6OnRoaXM6OmlzOjphOjpUZXN0SW50ZXJmYWNlJykKKworICBkZWYgdGVzdEltcGxlbWVudGF0aW9uSGVhZGVySW5jbHVkZVBhdGgoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkltcGxlbWVudGF0aW9uSGVhZGVyUGF0aCgnVGVzdEludGVyZmFjZScpLAorICAgICAgICAncm9vdC90aGlzL2lzL2EvdGVzdF9pbnRlcmZhY2UuaCcpCisKKyAgZGVmIHRlc3RCaW5kaW5nc0hlYWRlckluY2x1ZGVQYXRoKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0hlYWRlckluY2x1ZGVQYXRoKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICdyb290L3RoaXMvaXMvYS9wcmVfdGVzdF9pbnRlcmZhY2UuaCcpCisKKyAgZGVmIHRlc3RCaW5kaW5nc0hlYWRlckZ1bGxQYXRoKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0hlYWRlckZ1bGxQYXRoKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICcvcGF0aC90by9nZW5lcmF0ZWQvcm9vdC90aGlzL2lzL2EvcHJlX3Rlc3RfaW50ZXJmYWNlLmgnKQorCisgIGRlZiB0ZXN0QmluZGluZ3NJbXBsZW1lbnRhdGlvblBhdGgoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIHNlbGYucGF0aF9idWlsZGVyLkJpbmRpbmdzSW1wbGVtZW50YXRpb25QYXRoKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICcvcGF0aC90by9nZW5lcmF0ZWQvcm9vdC90aGlzL2lzL2EvcHJlX3Rlc3RfaW50ZXJmYWNlLmNjJykKKworICBkZWYgdGVzdERpY3Rpb25hcnlIZWFkZXJJbmNsdWRlUGF0aChzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuRGljdGlvbmFyeUhlYWRlckluY2x1ZGVQYXRoKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICdyb290L3RoaXMvaXMvYS90ZXN0X2ludGVyZmFjZS5oJykKKworICBkZWYgdGVzdERpY3Rpb25hcnlIZWFkZXJGdWxsUGF0aChzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgc2VsZi5wYXRoX2J1aWxkZXIuRGljdGlvbmFyeUhlYWRlckZ1bGxQYXRoKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICcvcGF0aC90by9nZW5lcmF0ZWQvcm9vdC90aGlzL2lzL2EvdGVzdF9pbnRlcmZhY2UuaCcpCisKKyAgZGVmIHRlc3REaWN0aW9uYXJ5Q29udmVyc2lvbkhlYWRlckluY2x1ZGVQYXRoKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0hlYWRlckluY2x1ZGVQYXRoKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICdyb290L3RoaXMvaXMvYS9wcmVfdGVzdF9pbnRlcmZhY2UuaCcpCisKKyAgZGVmIHRlc3REaWN0aW9uYXJ5Q29udmVyc2lvbkhlYWRlckZ1bGxQYXRoKHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBzZWxmLnBhdGhfYnVpbGRlci5CaW5kaW5nc0hlYWRlckZ1bGxQYXRoKCdUZXN0SW50ZXJmYWNlJyksCisgICAgICAgICcvcGF0aC90by9nZW5lcmF0ZWQvcm9vdC90aGlzL2lzL2EvcHJlX3Rlc3RfaW50ZXJmYWNlLmgnKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy9ydW5fY29iYWx0X2JpbmRpbmdzX3Rlc3RzLnB5IGIvc3JjL2NvYmFsdC9iaW5kaW5ncy9ydW5fY29iYWx0X2JpbmRpbmdzX3Rlc3RzLnB5CmluZGV4IGEzNjQxOTEuLjVlMDI0MzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvcnVuX2NvYmFsdF9iaW5kaW5nc190ZXN0cy5weQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3J1bl9jb2JhbHRfYmluZGluZ3NfdGVzdHMucHkKQEAgLTk3LDEyICs5NywxMiBAQAogICAgICAgIyB0ZXN0aW5nLmd5cC4KICAgICAgICdkZXBlbmRlbmN5X2lkbF9maWxlcyc6CiAgICAgICAgICAgZnJvemVuc2V0KFsKLSAgICAgICAgICAgICAgJ0ltcGxlbWVudGVkSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICAgICAgICdQYXJ0aWFsSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICAgICAgICdJbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX3BhcnRpYWwuaWRsJywKLSAgICAgICAgICAgICAgIyBVbnN1cHBvcnRlZEludGVyZmFjZSBpcyBub3QgYWN0dWFsbHkgYSBkZXBlbmRlbmN5IElETCwgYnV0CisgICAgICAgICAgICAgICdpbXBsZW1lbnRlZF9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgICAgICAgJ3BhcnRpYWxfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICAgICAgICdpbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzX3BhcnRpYWwuaWRsJywKKyAgICAgICAgICAgICAgIyB1bnN1cHBvcnRlZF9pbnRlcmZhY2UgaXMgbm90IGFjdHVhbGx5IGEgZGVwZW5kZW5jeSBJREwsIGJ1dAogICAgICAgICAgICAgICAjIHRoaXMgd2lsbCBwcmV2ZW50IGNvZGUgZnJvbSBiZWluZyBnZW5lcmF0ZWQgZm9yIGl0LgotICAgICAgICAgICAgICAnVW5zdXBwb3J0ZWRJbnRlcmZhY2UuaWRsJywKKyAgICAgICAgICAgICAgJ3Vuc3VwcG9ydGVkX2ludGVyZmFjZS5pZGwnLAogICAgICAgICAgIF0pLAogICAgICAgIyAuaWRsIGZpbGVzIHRoYXQgYXJlIG5vdCB2YWxpZCBibGluayBJRExzCiAgICAgICAnaWdub3JlX2lkbF9maWxlcyc6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UtYmFzZS5jYy50ZW1wbGF0ZSBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS1iYXNlLmNjLnRlbXBsYXRlCmluZGV4IGI0MjUwMzAuLjllNTg4ZTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS1iYXNlLmNjLnRlbXBsYXRlCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS1iYXNlLmNjLnRlbXBsYXRlCkBAIC0xMywyNyArMTMsMjUgQEAKICAjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKICAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogICN9Ci0vKgotICogQ29weXJpZ2h0IHt7dG9kYXkueWVhcn19IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IHt7Y29kZV9nZW5lcmF0b3J9fS4gRE8gTk9UIE1PRElGWSEKLS8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IHt7aGVhZGVyX3RlbXBsYXRlX3BhdGh9fQorLy8gQ29weXJpZ2h0IHt7dG9kYXkueWVhcn19IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKIAorLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IHt7Y29kZV9nZW5lcmF0b3J9fS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IHt7dGVtcGxhdGVfcGF0aH19CisKIHslIGlmIGNvbmRpdGlvbmFsICV9CiAjaWYgZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCiAKQEAgLTQ4LDggKzQ2LDggQEAKIAogbmFtZXNwYWNlIHsKIHslIGJsb2NrIHVzaW5nX2RpcmVjdGl2ZXMgJX0KLXVzaW5nIGNvYmFsdDo6e3tjb21wb25lbnRzfGpvaW4oJzo6Jyl9fTo6e3tpbXBsX2NsYXNzfX07Ci11c2luZyBjb2JhbHQ6Ont7Y29tcG9uZW50c3xqb2luKCc6OicpfX06Ont7YmluZGluZ19jbGFzc319OwordXNpbmcge3tjb21wb25lbnRzfGpvaW4oJzo6Jyl9fTo6e3tpbXBsX2NsYXNzfX07Cit1c2luZyB7e2NvbXBvbmVudHN8am9pbignOjonKX19Ojp7e2JpbmRpbmdfY2xhc3N9fTsKIHslIGZvciB1c2VkX2NsYXNzIGluIGZvcndhcmRfZGVjbGFyYXRpb25zICV9CiB7JSBpZiB1c2VkX2NsYXNzLmNvbmRpdGlvbmFsICV9CiAjaWYgZGVmaW5lZCh7e3VzZWRfY2xhc3MuY29uZGl0aW9uYWx9fSkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS1iYXNlLmgudGVtcGxhdGUgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UtYmFzZS5oLnRlbXBsYXRlCmluZGV4IDU5ZDY4MjYuLjA0YTdhYzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS1iYXNlLmgudGVtcGxhdGUKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLWJhc2UuaC50ZW1wbGF0ZQpAQCAtMTMsMjcgKzEzLDI1IEBACiAgIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAjfQotLyoKLSAqIENvcHlyaWdodCB7e3RvZGF5LnllYXJ9fSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSB7e2NvZGVfZ2VuZXJhdG9yfX0uIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiB7e2hlYWRlcl90ZW1wbGF0ZV9wYXRofX0KKy8vIENvcHlyaWdodCB7e3RvZGF5LnllYXJ9fSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAKKy8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSB7e2NvZGVfZ2VuZXJhdG9yfX0uIERPIE5PVCBNT0RJRlkhCisvLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiB7e3RlbXBsYXRlX3BhdGh9fQorCiAjaWZuZGVmIHt7YmluZGluZ19jbGFzc319X2gKICNkZWZpbmUge3tiaW5kaW5nX2NsYXNzfX1faAogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9kaWN0aW9uYXJ5LmgudGVtcGxhdGUgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9kaWN0aW9uYXJ5LmgudGVtcGxhdGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGI2YWJjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2RpY3Rpb25hcnkuaC50ZW1wbGF0ZQpAQCAtMCwwICsxLDk4IEBACit7IworICMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAjCisgIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICMKKyAjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAjCisgIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAjfQorLyoKKyAqIENvcHlyaWdodCB7e3RvZGF5LnllYXJ9fSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGNsYW5nLWZvcm1hdCBvZmYKKworLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IHt7Y29kZV9nZW5lcmF0b3J9fS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IHt7dGVtcGxhdGVfcGF0aH19CisKKyNpZm5kZWYge3tjbGFzc19uYW1lfX1faAorI2RlZmluZSB7e2NsYXNzX25hbWV9fV9oCisKK3slIGlmIGNvbmRpdGlvbmFsICV9CisjaWYgZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCisKK3slIGVuZGlmICV9CisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgoreyUgZm9yIGluY2x1ZGUgaW4gaW5jbHVkZXMgJX0KKyNpbmNsdWRlICJ7e2luY2x1ZGV9fSIKK3slIGVuZGZvciAlfQorCit7JSBmb3IgY29tcG9uZW50IGluIGNvbXBvbmVudHMgJX0KK25hbWVzcGFjZSB7e2NvbXBvbmVudH19IHsKK3slIGVuZGZvciAlfQorCitjbGFzcyB7e2NsYXNzX25hbWV9fSB7CisgcHVibGljOgorICB7e2NsYXNzX25hbWV9fSgpIHsKK3slIGZvciBtZW1iZXIgaW4gbWVtYmVycyAlfQoreyUgaWYgbWVtYmVyLmRlZmF1bHRfdmFsdWUgJX0KKyAgICBoYXNfe3ttZW1iZXIubmFtZX19XyA9IHRydWU7CisgICAge3ttZW1iZXIubmFtZX19XyA9IHt7bWVtYmVyLmRlZmF1bHRfdmFsdWV9fTsKK3slIGVsc2UgJX0KKyAgICBoYXNfe3ttZW1iZXIubmFtZX19XyA9IGZhbHNlOworICAgIHt7bWVtYmVyLm5hbWV9fV8gPSB7e21lbWJlci50eXBlfX0oKTsKK3slIGVuZGlmICV9Cit7JSBlbmRmb3IgJX0KKyAgfQorCit7JSBmb3IgbWVtYmVyIGluIG1lbWJlcnMgJX0KKyAgYm9vbCBoYXNfe3ttZW1iZXIubmFtZX19KCkgY29uc3QgeworICAgIHJldHVybiBoYXNfe3ttZW1iZXIubmFtZX19XzsKKyAgfQorICB7e21lbWJlci50eXBlfX0ge3ttZW1iZXIubmFtZX19KCkgY29uc3QgeworICAgIERDSEVDSyhoYXNfe3ttZW1iZXIubmFtZX19Xyk7CisgICAgcmV0dXJuIHt7bWVtYmVyLm5hbWV9fV87CisgIH0KKyAgdm9pZCBzZXRfe3ttZW1iZXIubmFtZX19KHt7bWVtYmVyLmFyZ190eXBlfX0gdmFsdWUpIHsKKyAgICBoYXNfe3ttZW1iZXIubmFtZX19XyA9IHRydWU7CisgICAge3ttZW1iZXIubmFtZX19XyA9IHZhbHVlOworICB9CisKK3slIGVuZGZvciAlfQorIHByaXZhdGU6Cit7JSBmb3IgbWVtYmVyIGluIG1lbWJlcnMgJX0KKyAgYm9vbCBoYXNfe3ttZW1iZXIubmFtZX19XzsKKyAge3ttZW1iZXIudHlwZX19IHt7bWVtYmVyLm5hbWV9fV87Cit7JSBlbmRmb3IgJX0KK307CisKK3slIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50cyAlfQorfSAgLy8gbmFtZXNwYWNlIHt7Y29tcG9uZW50fX0KK3slIGVuZGZvciAlfQorCit7JSBpZiBjb25kaXRpb25hbCAlfQorI2VuZGlmICAvLyBkZWZpbmVkKHt7Y29uZGl0aW9uYWx9fSkKKworeyUgZW5kaWYgJX0KKyNlbmRpZiAgLy8ge3tjbGFzc19uYW1lfX1faApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZW1wbGF0ZXMvaW50ZXJmYWNlLWJhc2UuY2MudGVtcGxhdGUgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9pbnRlcmZhY2UtYmFzZS5jYy50ZW1wbGF0ZQppbmRleCBjZDBiM2JhLi45NjZmNjI1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9pbnRlcmZhY2UtYmFzZS5jYy50ZW1wbGF0ZQorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9pbnRlcmZhY2UtYmFzZS5jYy50ZW1wbGF0ZQpAQCAtMTMsMjcgKzEzLDI1IEBACiAgIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCiAgIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICAjfQotLyoKLSAqIENvcHlyaWdodCB7e3RvZGF5LnllYXJ9fSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIFRoaXMgZmlsZSBoYXMgYmVlbiBhdXRvLWdlbmVyYXRlZCBieSB7e2NvZGVfZ2VuZXJhdG9yfX0uIERPIE5PVCBNT0RJRlkhCi0vLyBBdXRvLWdlbmVyYXRlZCBmcm9tIHRlbXBsYXRlOiB7e2NjX3RlbXBsYXRlX3BhdGh9fQorLy8gQ29weXJpZ2h0IHt7dG9kYXkueWVhcn19IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKIAorLy8gVGhpcyBmaWxlIGhhcyBiZWVuIGF1dG8tZ2VuZXJhdGVkIGJ5IHt7Y29kZV9nZW5lcmF0b3J9fS4gRE8gTk9UIE1PRElGWSEKKy8vIEF1dG8tZ2VuZXJhdGVkIGZyb20gdGVtcGxhdGU6IHt7dGVtcGxhdGVfcGF0aH19CisKIHslIGlmIGNvbmRpdGlvbmFsICV9CiAjaWYgZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCiAKQEAgLTQ1LDcgKzQzLDcgQEAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKIHslIGZvciBpbmNsdWRlIGluIGltcGxlbWVudGF0aW9uX2luY2x1ZGVzICV9CiAjaW5jbHVkZSAie3tpbmNsdWRlfX0iCiB7JSBlbmRmb3IgJX0KQEAgLTUzLDggKzUxLDggQEAKIAogbmFtZXNwYWNlIHsKIHslIGJsb2NrIHVzaW5nX2RpcmVjdGl2ZXMgJX0KLXVzaW5nIGNvYmFsdDo6e3tjb21wb25lbnRzfGpvaW4oJzo6Jyl9fTo6e3tpbXBsX2NsYXNzfX07Ci11c2luZyBjb2JhbHQ6Ont7Y29tcG9uZW50c3xqb2luKCc6OicpfX06Ont7YmluZGluZ19jbGFzc319OwordXNpbmcge3tjb21wb25lbnRzfGpvaW4oJzo6Jyl9fTo6e3tpbXBsX2NsYXNzfX07Cit1c2luZyB7e2NvbXBvbmVudHN8am9pbignOjonKX19Ojp7e2JpbmRpbmdfY2xhc3N9fTsKIHslIGZvciB1c2VkX2NsYXNzIGluIGZvcndhcmRfZGVjbGFyYXRpb25zICV9CiB7JSBpZiB1c2VkX2NsYXNzLmNvbmRpdGlvbmFsICV9CiAjaWYgZGVmaW5lZCh7e3VzZWRfY2xhc3MuY29uZGl0aW9uYWx9fSkKQEAgLTY4LDcgKzY2LDcgQEAKIHVzaW5nIGNvYmFsdDo6c2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudDsKIHVzaW5nIGNvYmFsdDo6c2NyaXB0OjpPcGFxdWVIYW5kbGU7CiB1c2luZyBjb2JhbHQ6OnNjcmlwdDo6T3BhcXVlSGFuZGxlSG9sZGVyOwotdXNpbmcgY29iYWx0OjpzY3JpcHQ6OlNjcmlwdE9iamVjdDsKK3VzaW5nIGNvYmFsdDo6c2NyaXB0OjpTY3JpcHRWYWx1ZTsKIHVzaW5nIGNvYmFsdDo6c2NyaXB0OjpXcmFwcGFibGU7CiB7JSBlbmRibG9jayB1c2luZ19kaXJlY3RpdmVzICV9CiB7JSBpZiBlbnVtZXJhdGlvbnN8bGVuZ3RoICV9CkBAIC03OSw3ICs3Nyw2IEBACiB7JSBlbmRibG9jayB0b3BfbGV2ZWxfdW5uYW1lZF9uYW1lc3BhY2UgJX0KIH0gIC8vIG5hbWVzcGFjZQogCi1uYW1lc3BhY2UgY29iYWx0IHsKIHslIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50cyAlfQogbmFtZXNwYWNlIHt7Y29tcG9uZW50fX0gewogeyUgZW5kZm9yICV9CkBAIC05Miw2ICs4OSw3IEBACiB7JSBlbmRmb3IgJX0KIHslIGlmIGlzX2dsb2JhbF9pbnRlcmZhY2UgJX0KIAorbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugc2NyaXB0IHsKIAogdGVtcGxhdGU8PgpAQCAtMTE1LDggKzExMyw4IEBACiAjZW5kaWYKIAogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAoteyUgZW5kaWYgJX0KIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKK3slIGVuZGlmICV9CiB7JSBpZiBlbnVtZXJhdGlvbnN8bGVuZ3RoICV9CiAKIG5hbWVzcGFjZSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9pbnRlcmZhY2UtYmFzZS5oLnRlbXBsYXRlIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZW1wbGF0ZXMvaW50ZXJmYWNlLWJhc2UuaC50ZW1wbGF0ZQppbmRleCA5YjQ4NTg4Li41YjhkZDNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3RlbXBsYXRlcy9pbnRlcmZhY2UtYmFzZS5oLnRlbXBsYXRlCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVtcGxhdGVzL2ludGVyZmFjZS1iYXNlLmgudGVtcGxhdGUKQEAgLTEzLDI3ICsxMywyNSBAQAogICMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAgI30KLS8qCi0gKiBDb3B5cmlnaHQge3t0b2RheS55ZWFyfX0gR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkge3tjb2RlX2dlbmVyYXRvcn19LiBETyBOT1QgTU9ESUZZIQotLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZToge3toZWFkZXJfdGVtcGxhdGVfcGF0aH19CisvLyBDb3B5cmlnaHQge3t0b2RheS55ZWFyfX0gR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8gY2xhbmctZm9ybWF0IG9mZgogCisvLyBUaGlzIGZpbGUgaGFzIGJlZW4gYXV0by1nZW5lcmF0ZWQgYnkge3tjb2RlX2dlbmVyYXRvcn19LiBETyBOT1QgTU9ESUZZIQorLy8gQXV0by1nZW5lcmF0ZWQgZnJvbSB0ZW1wbGF0ZToge3t0ZW1wbGF0ZV9wYXRofX0KKwogI2lmbmRlZiB7e2JpbmRpbmdfY2xhc3N9fV9oCiAjZGVmaW5lIHt7YmluZGluZ19jbGFzc319X2gKIApAQCAtNTUsNyArNTMsNiBAQAogeyUgZW5kZm9yICV9CiB7JSBlbmRibG9jayBpbmNsdWRlcyAlfQogCi1uYW1lc3BhY2UgY29iYWx0IHsKIHslIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50cyAlfQogbmFtZXNwYWNlIHt7Y29tcG9uZW50fX0gewogeyUgZW5kZm9yICV9CkBAIC02MywxMCArNjAsOSBAQAogeyUgYmxvY2sgaW1wbGVtZW50YXRpb24gJX0KIHslIGVuZGJsb2NrIGltcGxlbWVudGF0aW9uICV9CiAKLXslIGZvciBjb21wb25lbnQgaW4gY29tcG9uZW50cyAlfQoreyUgZm9yIGNvbXBvbmVudCBpbiBjb21wb25lbnRzfHJldmVyc2UgJX0KIH0gIC8vIG5hbWVzcGFjZSB7e2NvbXBvbmVudH19CiB7JSBlbmRmb3IgJX0KLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKIAogeyUgaWYgY29uZGl0aW9uYWwgJX0KICNlbmRpZiAgLy8gZGVmaW5lZCh7e2NvbmRpdGlvbmFsfX0pCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZGZmYzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0Fub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIEFub255bW91c0luZGV4ZWRHZXR0ZXJJbnRlcmZhY2UgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGdldHRlciB1bnNpZ25lZCBsb25nICh1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgc2V0dGVyIHZvaWQgKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Bbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZmQ0OGYyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Bbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UgewotICBnZXR0ZXIgRE9NU3RyaW5nIChET01TdHJpbmcgbmFtZSk7Ci0gIHNldHRlciB2b2lkIChET01TdHJpbmcgbmFtZSwgRE9NU3RyaW5nIHZhbHVlKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Bbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MmQ4ZjUxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Bbm9ueW1vdXNOYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIEFub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgZ2V0dGVyIHVuc2lnbmVkIGxvbmcgKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotICBzZXR0ZXIgdm9pZCAodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7Ci0gIGdldHRlciBET01TdHJpbmcgKERPTVN0cmluZyBuYW1lKTsKLSAgc2V0dGVyIHZvaWQgKERPTVN0cmluZyBuYW1lLCBET01TdHJpbmcgdmFsdWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9BcmJpdHJhcnlJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0FyYml0cmFyeUludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwZGY1MDEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0FyYml0cmFyeUludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotW0NvbnN0cnVjdG9yXQotaW50ZXJmYWNlIEFyYml0cmFyeUludGVyZmFjZSB7Ci0gIHZvaWQgYXJiaXRyYXJ5RnVuY3Rpb24oKTsKLSAgYXR0cmlidXRlIERPTVN0cmluZyBhcmJpdHJhcnlQcm9wZXJ0eTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQmFzZUludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQmFzZUludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4ODljY2UuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0Jhc2VJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotW0NvbnN0cnVjdG9yXQotaW50ZXJmYWNlIEJhc2VJbnRlcmZhY2UgewotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJhc2VBdHRyaWJ1dGU7Ci0gIHZvaWQgYmFzZU9wZXJhdGlvbigpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Cb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOGQ3NzEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0Jvb2xlYW5UeXBlVGVzdEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIHsKLSAgYm9vbGVhbiBib29sZWFuUmV0dXJuT3BlcmF0aW9uKCk7Ci0gIHZvaWQgYm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uKGJvb2xlYW4gYXJnMSk7Ci0gIGF0dHJpYnV0ZSBib29sZWFuIGJvb2xlYW5Qcm9wZXJ0eTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViNmE3ZmUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UgewotICB2b2lkIHRha2VzVm9pZEZ1bmN0aW9uKFZvaWRGdW5jdGlvbiBjYik7Ci0gIHZvaWQgdGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKEZ1bmN0aW9uVGhhdFJldHVybnNTdHJpbmcgY2IpOwotICB2b2lkIHRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyKEZ1bmN0aW9uV2l0aE9uZVBhcmFtZXRlciBjYik7Ci0gIHZvaWQgdGFrZXNGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycyhGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycyBjYik7Ci0gIHZvaWQgdGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMoRnVuY3Rpb25XaXRoTnVsbGFibGVQYXJhbWV0ZXJzIGNiKTsKLQotICBhdHRyaWJ1dGUgVm9pZEZ1bmN0aW9uIGNhbGxiYWNrQXR0cmlidXRlOwotICBhdHRyaWJ1dGUgVm9pZEZ1bmN0aW9uPyBudWxsYWJsZUNhbGxiYWNrQXR0cmlidXRlOwotfTsKLQotY2FsbGJhY2sgVm9pZEZ1bmN0aW9uID0gdm9pZCgpOwotY2FsbGJhY2sgRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyA9IERPTVN0cmluZygpOwotY2FsbGJhY2sgRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyID0gdm9pZChsb25nIHBhcmFtKTsKLWNhbGxiYWNrIEZ1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzID0gdm9pZChkb3VibGUgcGFyYW0xLCBET01TdHJpbmcgcGFyYW0yLCBBcmJpdHJhcnlJbnRlcmZhY2UgcGFyYW0zKTsKLWNhbGxiYWNrIEZ1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycyA9IHZvaWQoYm9vbGVhbj8gcGFyYW0xLCBET01TdHJpbmc/IHBhcmFtMiwgQXJiaXRyYXJ5SW50ZXJmYWNlPyBwYXJhbTMpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9DYWxsYmFja0ludGVyZmFjZUludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2ZTBmZWIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZSB7Ci0gIHZvaWQgcmVnaXN0ZXJDYWxsYmFjayhTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgY2FsbGJhY2tfaW50ZXJmYWNlKTsKLSAgYXR0cmlidXRlIFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZT8gY2FsbGJhY2tBdHRyaWJ1dGU7Ci0KLSAgdm9pZCBzb21lT3BlcmF0aW9uKCk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0NvbmRpdGlvbmFsSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Db25kaXRpb25hbEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ0NGExMDAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0NvbmRpdGlvbmFsSW50ZXJmYWNlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLVtDb25kaXRpb25hbD1FTkFCTEVfQ09ORElUSU9OQUxfSU5URVJGQUNFXQotaW50ZXJmYWNlIENvbmRpdGlvbmFsSW50ZXJmYWNlIHsKLSAgW0NvbmRpdGlvbmFsPUVOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWV0gdm9pZCBlbmFibGVkT3BlcmF0aW9uKCk7Ci0gIFtDb25kaXRpb25hbD1OT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFldIHZvaWQgZGlzYWJsZWRPcGVyYXRpb24oKTsKLQotICBbQ29uZGl0aW9uYWw9RU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZXSBhdHRyaWJ1dGUgbG9uZyBlbmFibGVkQXR0cmlidXRlOwotICBbQ29uZGl0aW9uYWw9Tk9fRU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZXSBhdHRyaWJ1dGUgbG9uZyBkaXNhYmxlZEF0dHJpYnV0ZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQ29uc3RhbnRzSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Db25zdGFudHNJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNjcwNzZiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Db25zdGFudHNJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIENvbnN0YW50c0ludGVyZmFjZSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGxvbmcgSU5URUdFUl9DT05TVEFOVCA9IDU7Ci0gIGNvbnN0IGRvdWJsZSBET1VCTEVfQ09OU1RBTlQgPSAyLjcxODsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQ29uc3RydWN0b3JJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0NvbnN0cnVjdG9ySW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjAyNGY1Mi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQ29uc3RydWN0b3JJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotWwotICBDb25zdHJ1Y3RvciwKLSAgQ29uc3RydWN0b3IoYm9vbGVhbiBhcmcpLAotXQotaW50ZXJmYWNlIENvbnN0cnVjdG9ySW50ZXJmYWNlIHsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Db25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTczYzk0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Db25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLVtDb25zdHJ1Y3Rvcihsb25nIGFyZzEsIGJvb2xlYW4gYXJnMiwgb3B0aW9uYWwgRE9NU3RyaW5nIGRlZmF1bHRfYXJnID0gImRlZmF1bHQiKV0KLWludGVyZmFjZSBDb25zdHJ1Y3RvcldpdGhBcmd1bWVudHNJbnRlcmZhY2UgewotICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBsb25nQXJnOwotICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBib29sZWFuQXJnOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHN0cmluZ0FyZzsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRE9NU3RyaW5nVGVzdEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRE9NU3RyaW5nVGVzdEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNjY3ZWIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0RPTVN0cmluZ1Rlc3RJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIERPTVN0cmluZ1Rlc3RJbnRlcmZhY2UgewotICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHByb3BlcnR5OwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlYWRPbmx5UHJvcGVydHk7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcmVhZE9ubHlUb2tlblByb3BlcnR5OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgbnVsbElzRW1wdHlQcm9wZXJ0eTsKLSAgW1RyZWF0VW5kZWZpbmVkQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgdW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5OwotICBbVHJlYXRVbmRlZmluZWRBcz1FbXB0eVN0cmluZ10gYXR0cmlidXRlIERPTVN0cmluZz8gbnVsbGFibGVVbmRlZmluZWRJc0VtcHR5UHJvcGVydHk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0Rlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGRkZTkxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9EZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlIDogTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBnZXR0ZXIgdW5zaWduZWQgbG9uZyBkZXJpdmVkSW5kZXhlZEdldHRlcih1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgc2V0dGVyIHZvaWQgZGVyaXZlZEluZGV4ZWRTZXR0ZXIodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7Ci0KLSAgZ2V0dGVyIERPTVN0cmluZyAoRE9NU3RyaW5nIG5hbWUpOwotICBzZXR0ZXIgdm9pZCAoRE9NU3RyaW5nIG5hbWUsIERPTVN0cmluZyB2YWx1ZSk7Ci0KLSAgYXR0cmlidXRlIGJvb2xlYW4gcHJvcGVydHlPbkRlcml2ZWRDbGFzczsKLSAgdm9pZCBvcGVyYXRpb25PbkRlcml2ZWRDbGFzcygpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9EZXJpdmVkSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9EZXJpdmVkSW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEwZDMzMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRGVyaXZlZEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1bQ29uc3RydWN0b3JdCi1pbnRlcmZhY2UgRGVyaXZlZEludGVyZmFjZSA6IEJhc2VJbnRlcmZhY2UgewotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGRlcml2ZWRBdHRyaWJ1dGU7Ci0gIHZvaWQgZGVyaXZlZE9wZXJhdGlvbigpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9EaXNhYmxlZEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRGlzYWJsZWRJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMGQ0N2FkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9EaXNhYmxlZEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1bQ29uZGl0aW9uYWw9Tk9fRU5BQkxFX0NPTkRJVElPTkFMX0lOVEVSRkFDRV0KLWludGVyZmFjZSBEaXNhYmxlZEludGVyZmFjZSB7Ci0gIHZvaWQgZGlzYWJsZWRGdW5jdGlvbigpOwotICBhdHRyaWJ1dGUgbG9uZyBkaXNhYmxlZFByb3BlcnR5OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9FbnVtZXJhdGlvbkludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRW51bWVyYXRpb25JbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWIyMTllLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9FbnVtZXJhdGlvbkludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1lbnVtIFRlc3RFbnVtIHsKLSAgImFscGhhIiwKLSAgImJldGEiLAotICAiZ2FtbWEiCi19OwotCi1bQ29uc3RydWN0b3JdCi1pbnRlcmZhY2UgRW51bWVyYXRpb25JbnRlcmZhY2UgewotICBhdHRyaWJ1dGUgVGVzdEVudW0gZW51bVByb3BlcnR5OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9FeGNlcHRpb25PYmplY3RJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVmMGZhNTcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotZXhjZXB0aW9uIEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgZXJyb3I7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbWVzc2FnZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRXhjZXB0aW9uc0ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRXhjZXB0aW9uc0ludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4NTJiZmEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0V4Y2VwdGlvbnNJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLVsKLSAgQ29uc3RydWN0b3IsCi0gIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvcgotXQotaW50ZXJmYWNlIEV4Y2VwdGlvbnNJbnRlcmZhY2UgewotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGZ1bmN0aW9uVGhyb3dzRXhjZXB0aW9uKCk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBib29sZWFuIGF0dHJpYnV0ZVRocm93c0V4Y2VwdGlvbjsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9FeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk5NWY3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9FeHRlbmRlZElETEF0dHJpYnV0ZXNJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIEV4dGVuZGVkSURMQXR0cmlidXRlc0ludGVyZmFjZSB7Ci0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSB2b2lkIGNhbGxXaXRoU2V0dGluZ3MoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9HYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTM1N2QyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9HYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLVsKLSAgQ29uc3RydWN0b3IsCi0gIC8vIFRoZSBoZWFkIG9mIHRoZSBsaXN0IGlzIHRoZSAib3BhcXVlIHJvb3QiIG9mIGFsbCBub2RlcyBpbiB0aGUgbGlzdC4KLSAgR2V0T3BhcXVlUm9vdD1HZXRIZWFkLAotXQotaW50ZXJmYWNlIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSB7Ci0gIC8vIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBzaW1wbGUgbGlua2VkLWxpc3QgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IKLSAgLy8gdGVzdHMgYXJvdW5kIHJlYWNoYWJpbGl0eSBvZiBvYmplY3RzIGZyb20gb3BhcXVlIHJvb3RzLgotICBhdHRyaWJ1dGUgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPyBwcmV2aW91czsKLSAgYXR0cmlidXRlIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT8gbmV4dDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvR2V0T3BhcXVlUm9vdEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvR2V0T3BhcXVlUm9vdEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI2YTJhOGEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL0dldE9wYXF1ZVJvb3RJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQ29uc3RydWN0b3IgYXR0cmlidXRlIGlzIGFkZGVkIGZvciB0ZXN0IHB1cnBvc2VzLgotWwotICBDb25zdHJ1Y3RvciwKLSAgQWRkT3BhcXVlUm9vdHM9KGFkZF9vcGFxdWVfcm9vdF9mdW5jdGlvbl9uYW1lKSwKLSAgR2V0T3BhcXVlUm9vdD1nZXRfb3BhcXVlX3Jvb3RfZnVuY3Rpb25fbmFtZQotXQotaW50ZXJmYWNlIEdldE9wYXF1ZVJvb3RJbnRlcmZhY2Uge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvR2xvYmFsSW50ZXJmYWNlUGFyZW50LmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9HbG9iYWxJbnRlcmZhY2VQYXJlbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmEyMDZhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9HbG9iYWxJbnRlcmZhY2VQYXJlbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWludGVyZmFjZSBHbG9iYWxJbnRlcmZhY2VQYXJlbnQgewotICB2b2lkIHBhcmVudE9wZXJhdGlvbigpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbXBsZW1lbnRlZEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvSW1wbGVtZW50ZWRJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YzhhYmM5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbXBsZW1lbnRlZEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgSW1wbGVtZW50ZWRJbnRlcmZhY2UgewotICB2b2lkIGltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24oKTsKLX07Ci1UYXJnZXRJbnRlcmZhY2UgaW1wbGVtZW50cyBJbXBsZW1lbnRlZEludGVyZmFjZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbmRleGVkR2V0dGVySW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbmRleGVkR2V0dGVySW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmQwY2MwNS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvSW5kZXhlZEdldHRlckludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgSW5kZXhlZEdldHRlckludGVyZmFjZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgZ2V0dGVyIHVuc2lnbmVkIGxvbmcgaW5kZXhlZEdldHRlcih1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgc2V0dGVyIHZvaWQgaW5kZXhlZFNldHRlcih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKLSAgZGVsZXRlciB2b2lkIGluZGV4ZWREZWxldGVyKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY5NDBmZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIHN1cHBvcnRlZEF0dHJpYnV0ZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc19wYXJ0aWFsLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX3BhcnRpYWwuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MWJmZTI1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9JbnRlcmZhY2VXaXRoVW5zdXBwb3J0ZWRQcm9wZXJ0aWVzX3BhcnRpYWwuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFydGlhbCBpbnRlcmZhY2UgSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyB7Ci0gIFtOb3RTdXBwb3J0ZWRdIGNvbnN0IGxvbmcgVU5TVVBQT1JURURfQ09OU1RBTlQgPSAwOwotICBbTm90U3VwcG9ydGVkXSBhdHRyaWJ1dGUgbG9uZyB1bnN1cHBvcnRlZEF0dHJpYnV0ZTsKLSAgW05vdFN1cHBvcnRlZF0gdm9pZCB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9OYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9OYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjA2ZGQ0YS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1bCi0gIE5hbWVkQ29uc3RydWN0b3I9U29tZU5hbWVkQ29uc3RydWN0b3IoKSwKLV0KLWludGVyZmFjZSBOYW1lZENvbnN0cnVjdG9ySW50ZXJmYWNlIHsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL05hbWVkR2V0dGVySW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkzOTVkOS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIE5hbWVkR2V0dGVySW50ZXJmYWNlIHsKLSAgZ2V0dGVyIERPTVN0cmluZyBuYW1lZEdldHRlcihET01TdHJpbmcgbmFtZSk7Ci0gIHNldHRlciB2b2lkIG5hbWVkU2V0dGVyKERPTVN0cmluZyBuYW1lLCBET01TdHJpbmcgdmFsdWUpOwotICBkZWxldGVyIHZvaWQgbmFtZWREZWxldGVyKERPTVN0cmluZyBuYW1lKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9OYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZGE2MzY2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9OYW1lZEluZGV4ZWRHZXR0ZXJJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgZ2V0dGVyIHVuc2lnbmVkIGxvbmcgaW5kZXhlZEdldHRlcih1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgc2V0dGVyIHZvaWQgaW5kZXhlZFNldHRlcih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKLSAgZ2V0dGVyIERPTVN0cmluZyBuYW1lZEdldHRlcihET01TdHJpbmcgbmFtZSk7Ci0gIHNldHRlciB2b2lkIG5hbWVkU2V0dGVyKERPTVN0cmluZyBuYW1lLCBET01TdHJpbmcgdmFsdWUpOwotCi0gIC8vIERlcml2ZWRHZXR0ZXJTZXR0ZXJJbnRlcmZhY2UgaW5oZXJpdHMgZnJvbSB0aGlzIGNsYXNzLgotICAvLyBUaGVzZSBwcm9wZXJ0aWVzIGFyZSB1c2VkIHRvIGNoZWNrIHRoYXQgbmFtZWQgZ2V0dGVycy9zZXR0ZXJzIGRvIG5vdAotICAvLyBvdmVycmlkZSB0aGVzZSBwcm9wZXJ0aWVzCi0gIGF0dHJpYnV0ZSBib29sZWFuIHByb3BlcnR5T25CYXNlQ2xhc3M7Ci0gIHZvaWQgb3BlcmF0aW9uT25CYXNlQ2xhc3MoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL05lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUzNDA0NC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWludGVyZmFjZSBOZXN0ZWRQdXRGb3J3YXJkc0ludGVyZmFjZSB7Ci0gIFtQdXRGb3J3YXJkcz1mb3J3YXJkaW5nQXR0cmlidXRlXQotICByZWFkb25seSBhdHRyaWJ1dGUgUHV0Rm9yd2FyZHNJbnRlcmZhY2UgbmVzdGVkRm9yd2FyZGluZ0F0dHJpYnV0ZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTm9Db25zdHJ1Y3RvckludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTm9Db25zdHJ1Y3RvckludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0YmZhNjEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL05vQ29uc3RydWN0b3JJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIE5vQ29uc3RydWN0b3JJbnRlcmZhY2UgewotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Ob0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0N2E1NmQ4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9Ob0ludGVyZmFjZU9iamVjdEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotW05vSW50ZXJmYWNlT2JqZWN0XQotaW50ZXJmYWNlIE5vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlIHsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL051bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjg1Y2MyMS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIE51bGxhYmxlVHlwZXNUZXN0SW50ZXJmYWNlIHsKLSAgYXR0cmlidXRlIGJvb2xlYW4/IG51bGxhYmxlQm9vbGVhblByb3BlcnR5OwotICBhdHRyaWJ1dGUgbG9uZz8gbnVsbGFibGVOdW1lcmljUHJvcGVydHk7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmc/IG51bGxhYmxlU3RyaW5nUHJvcGVydHk7Ci0gIGF0dHJpYnV0ZSBBcmJpdHJhcnlJbnRlcmZhY2U/IG51bGxhYmxlT2JqZWN0UHJvcGVydHk7Ci0KLSAgYm9vbGVhbj8gbnVsbGFibGVCb29sZWFuT3BlcmF0aW9uKCk7Ci0gIGxvbmc/IG51bGxhYmxlTnVtZXJpY09wZXJhdGlvbigpOwotICBET01TdHJpbmc/IG51bGxhYmxlU3RyaW5nT3BlcmF0aW9uKCk7Ci0gIEFyYml0cmFyeUludGVyZmFjZT8gbnVsbGFibGVPYmplY3RPcGVyYXRpb24oKTsKLQotICB2b2lkIG51bGxhYmxlQm9vbGVhbkFyZ3VtZW50KGJvb2xlYW4/IGFyZyk7Ci0gIHZvaWQgbnVsbGFibGVOdW1lcmljQXJndW1lbnQobG9uZz8gYXJnKTsKLSAgdm9pZCBudWxsYWJsZVN0cmluZ0FyZ3VtZW50KERPTVN0cmluZz8gYXJnKTsKLSAgdm9pZCBudWxsYWJsZU9iamVjdEFyZ3VtZW50KEFyYml0cmFyeUludGVyZmFjZT8gYXJnKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2ZDliZDYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL051bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UgewotICBieXRlIGJ5dGVSZXR1cm5PcGVyYXRpb24oKTsKLSAgdm9pZCBieXRlQXJndW1lbnRPcGVyYXRpb24oYnl0ZSBhcmcxKTsKLSAgYXR0cmlidXRlIGJ5dGUgYnl0ZVByb3BlcnR5OwotCi0gIG9jdGV0IG9jdGV0UmV0dXJuT3BlcmF0aW9uKCk7Ci0gIHZvaWQgb2N0ZXRBcmd1bWVudE9wZXJhdGlvbihvY3RldCBhcmcxKTsKLSAgYXR0cmlidXRlIG9jdGV0IG9jdGV0UHJvcGVydHk7Ci0KLSAgc2hvcnQgc2hvcnRSZXR1cm5PcGVyYXRpb24oKTsKLSAgdm9pZCBzaG9ydEFyZ3VtZW50T3BlcmF0aW9uKHNob3J0IGFyZzEpOwotICBhdHRyaWJ1dGUgc2hvcnQgc2hvcnRQcm9wZXJ0eTsKLQotICB1bnNpZ25lZCBzaG9ydCB1bnNpZ25lZFNob3J0UmV0dXJuT3BlcmF0aW9uKCk7Ci0gIHZvaWQgdW5zaWduZWRTaG9ydEFyZ3VtZW50T3BlcmF0aW9uKHVuc2lnbmVkIHNob3J0IGFyZzEpOwotICBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgdW5zaWduZWRTaG9ydFByb3BlcnR5OwotCi0gIGxvbmcgbG9uZ1JldHVybk9wZXJhdGlvbigpOwotICB2b2lkIGxvbmdBcmd1bWVudE9wZXJhdGlvbihsb25nIGFyZzEpOwotICBhdHRyaWJ1dGUgbG9uZyBsb25nUHJvcGVydHk7Ci0KLSAgdW5zaWduZWQgbG9uZyB1bnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24oKTsKLSAgdm9pZCB1bnNpZ25lZExvbmdBcmd1bWVudE9wZXJhdGlvbih1bnNpZ25lZCBsb25nIGFyZzEpOwotICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB1bnNpZ25lZExvbmdQcm9wZXJ0eTsKLQotICBsb25nIGxvbmcgbG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24oKTsKLSAgdm9pZCBsb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKGxvbmcgbG9uZyBhcmcxKTsKLSAgYXR0cmlidXRlIGxvbmcgbG9uZyBsb25nTG9uZ1Byb3BlcnR5OwotCi0gIHVuc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZExvbmdMb25nUmV0dXJuT3BlcmF0aW9uKCk7Ci0gIHZvaWQgdW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBhcmcxKTsKLSAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZExvbmdMb25nUHJvcGVydHk7Ci0KLSAgZG91YmxlIGRvdWJsZVJldHVybk9wZXJhdGlvbigpOwotICB2b2lkIGRvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKGRvdWJsZSBhcmcxKTsKLSAgYXR0cmlidXRlIGRvdWJsZSBkb3VibGVQcm9wZXJ0eTsKLQotICB1bnJlc3RyaWN0ZWQgZG91YmxlIHVucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbigpOwotICB2b2lkIHVucmVzdHJpY3RlZERvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKHVucmVzdHJpY3RlZCBkb3VibGUgYXJnMSk7Ci0gIGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIHVucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9PYmplY3RUeXBlQmluZGluZ3NJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxMTlhMTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL09iamVjdFR5cGVCaW5kaW5nc0ludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlIHsKLSAgYXR0cmlidXRlIEFyYml0cmFyeUludGVyZmFjZSBhcmJpdHJhcnlPYmplY3Q7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBCYXNlSW50ZXJmYWNlIGJhc2VJbnRlcmZhY2U7Ci0gIGF0dHJpYnV0ZSBEZXJpdmVkSW50ZXJmYWNlIGRlcml2ZWRJbnRlcmZhY2U7Ci0gIGF0dHJpYnV0ZSBvYmplY3Q/IG9iamVjdFByb3BlcnR5OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9PcGVyYXRpb25zVGVzdEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNjRmMzllLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9PcGVyYXRpb25zVGVzdEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UgewotICB2b2lkIHZvaWRGdW5jdGlvbk5vQXJncygpOwotICBET01TdHJpbmcgc3RyaW5nRnVuY3Rpb25Ob0FyZ3MoKTsKLSAgbG9uZyBsb25nRnVuY3Rpb25Ob0FyZ3MoKTsKLSAgQXJiaXRyYXJ5SW50ZXJmYWNlIG9iamVjdEZ1bmN0aW9uTm9BcmdzKCk7Ci0gIHZvaWQgdm9pZEZ1bmN0aW9uU3RyaW5nQXJnKERPTVN0cmluZyBhcmcpOwotICB2b2lkIHZvaWRGdW5jdGlvbkxvbmdBcmcobG9uZyBhcmcpOwotICB2b2lkIHZvaWRGdW5jdGlvbk9iamVjdEFyZyhBcmJpdHJhcnlJbnRlcmZhY2UgYXJnKTsKLSAgdm9pZCBvcHRpb25hbEFyZ3VtZW50cyhsb25nIGFyZzEsIG9wdGlvbmFsIGxvbmcgYXJnMiwgb3B0aW9uYWwgbG9uZyBhcmczKTsKLSAgdm9pZCBvcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQob3B0aW9uYWwgZG91YmxlIGFyZzEgPSAyLjcxOCk7Ci0gIHZvaWQgb3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cygKLSAgICAgIG9wdGlvbmFsIGJvb2xlYW4/IGFyZzEgPSBudWxsLAotICAgICAgb3B0aW9uYWwgQXJiaXRyYXJ5SW50ZXJmYWNlPyBhcmcyID0gbnVsbCk7Ci0KLSAgdm9pZCB2YXJpYWRpY1ByaW1pdGl2ZUFyZ3VtZW50cyhsb25nLi4uIGJvb2xzKTsKLSAgdm9pZCB2YXJpYWRpY1N0cmluZ0FyZ3VtZW50c0FmdGVyT3B0aW9uYWxBcmd1bWVudCgKLSAgICAgIG9wdGlvbmFsIGJvb2xlYW4gb3B0aW9uYWxfYXJnLCBET01TdHJpbmcuLi4gc3RyaW5ncyk7Ci0KLSAgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24oKTsKLSAgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24obG9uZyBhcmcpOwotICB2b2lkIG92ZXJsb2FkZWRGdW5jdGlvbihET01TdHJpbmcgYXJnKTsKLSAgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24obG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMyk7Ci0gIHZvaWQgb3ZlcmxvYWRlZEZ1bmN0aW9uKGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBBcmJpdHJhcnlJbnRlcmZhY2UgYXJnMyk7Ci0KLSAgLy8gZG91YmxlIGFuZCBsb25nIGFyZSBub3QgZGlzdGluZ3Vpc2hhYmxlLCBidXQgYmVjYXVzZSB0aGlzIGlzIGEgc3RhdGljCi0gIC8vIGZ1bmN0aW9uIGl0IGlzIHBhcnQgb2YgdGhlIHNhbWUgb3ZlcmxvYWQgc2V0IGFzIHRoZSBvbmUgdGhhdCB0YWtlcyBsb25nLgotICBzdGF0aWMgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24oZG91YmxlIGFyZyk7Ci0gIHN0YXRpYyB2b2lkIG92ZXJsb2FkZWRGdW5jdGlvbihkb3VibGUgYXJnMSwgZG91YmxlIGFyZzIpOwotCi0gIHZvaWQgb3ZlcmxvYWRlZE51bGxhYmxlKGxvbmcgYXJnKTsKLSAgdm9pZCBvdmVybG9hZGVkTnVsbGFibGUoYm9vbGVhbj8gYXJnKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvUGFydGlhbEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvUGFydGlhbEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGRmOGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1BhcnRpYWxJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotcGFydGlhbCBpbnRlcmZhY2UgVGFyZ2V0SW50ZXJmYWNlIHsKLSAgdm9pZCBwYXJ0aWFsSW50ZXJmYWNlRnVuY3Rpb24oKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1B1dEZvcndhcmRzSW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhiZjhhYi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLWludGVyZmFjZSBQdXRGb3J3YXJkc0ludGVyZmFjZSB7Ci0gIFtQdXRGb3J3YXJkcz1hcmJpdHJhcnlQcm9wZXJ0eV0KLSAgcmVhZG9ubHkgYXR0cmlidXRlIEFyYml0cmFyeUludGVyZmFjZSBmb3J3YXJkaW5nQXR0cmlidXRlOwotICBbUHV0Rm9yd2FyZHM9YXJiaXRyYXJ5UHJvcGVydHldCi0gIHN0YXRpYyByZWFkb25seSBhdHRyaWJ1dGUgQXJiaXRyYXJ5SW50ZXJmYWNlIHN0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1NlcXVlbmNlVXNlci5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvU2VxdWVuY2VVc2VyLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWM1ODkyNy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvU2VxdWVuY2VVc2VyLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLVsgQ29uc3RydWN0b3IgXQotaW50ZXJmYWNlIFNlcXVlbmNlVXNlciB7Ci0gIHNlcXVlbmNlPEFyYml0cmFyeUludGVyZmFjZT4gZ2V0SW50ZXJmYWNlU2VxdWVuY2UoKTsKLSAgc2VxdWVuY2U8c2VxdWVuY2U8c2VxdWVuY2U8QXJiaXRyYXJ5SW50ZXJmYWNlPj4+Ci0gIGdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpOwotICBzZXF1ZW5jZTxsb25nPiBnZXRMb25nU2VxdWVuY2UoKTsKLSAgc2VxdWVuY2U8RE9NU3RyaW5nPiBnZXRTdHJpbmdTZXF1ZW5jZSgpOwotICBzZXF1ZW5jZTxzZXF1ZW5jZTxET01TdHJpbmc+PiBnZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCk7Ci0gIChET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPikgZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCk7Ci0gIHNlcXVlbmNlPChET01TdHJpbmcgb3IgQXJiaXRyYXJ5SW50ZXJmYWNlKT4gZ2V0VW5pb25TZXF1ZW5jZSgpOwotCi0gIHZvaWQgc2V0SW50ZXJmYWNlU2VxdWVuY2Uoc2VxdWVuY2U8QXJiaXRyYXJ5SW50ZXJmYWNlPiBlbGVtZW50cyk7Ci0gIHZvaWQgc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKAotICAgICAgc2VxdWVuY2U8c2VxdWVuY2U8c2VxdWVuY2U8QXJiaXRyYXJ5SW50ZXJmYWNlPj4+IGVsZW1lbnRzKTsKLSAgdm9pZCBzZXRMb25nU2VxdWVuY2Uoc2VxdWVuY2U8bG9uZz4gZWxlbWVudHMpOwotICB2b2lkIHNldFN0cmluZ1NlcXVlbmNlKHNlcXVlbmNlPERPTVN0cmluZz4gZWxlbWVudHMpOwotICB2b2lkIHNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2Uoc2VxdWVuY2U8c2VxdWVuY2U8RE9NU3RyaW5nPj4gZWxlbWVudHMpOwotICB2b2lkIHNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgKLSAgICAgIChET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPikgZWxlbWVudHMpOwotICB2b2lkIHNldFVuaW9uU2VxdWVuY2Uoc2VxdWVuY2U8KERPTVN0cmluZyBvciBBcmJpdHJhcnlJbnRlcmZhY2UpPiBlbGVtZW50cyk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1NpbmdsZU9wZXJhdGlvbkludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzdiZjZmYi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWNhbGxiYWNrIGludGVyZmFjZSBTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgewotICBsb25nPyBoYW5kbGVDYWxsYmFjayhBcmJpdHJhcnlJbnRlcmZhY2UgdmFsdWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9TdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9TdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmE3M2RhOC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvU3RhdGljUHJvcGVydGllc0ludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotaW50ZXJmYWNlIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UgewotICBzdGF0aWMgdm9pZCBzdGF0aWNGdW5jdGlvbigpOwotICBzdGF0aWMgdm9pZCBzdGF0aWNGdW5jdGlvbihsb25nIGFyZyk7Ci0gIHN0YXRpYyB2b2lkIHN0YXRpY0Z1bmN0aW9uKERPTVN0cmluZyBhcmcpOwotICBzdGF0aWMgdm9pZCBzdGF0aWNGdW5jdGlvbihsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczKTsKLSAgc3RhdGljIHZvaWQgc3RhdGljRnVuY3Rpb24obG9uZyBhcmcxLCBsb25nIGFyZzIsIEFyYml0cmFyeUludGVyZmFjZSBhcmczKTsKLSAgc3RhdGljIGF0dHJpYnV0ZSBET01TdHJpbmcgc3RhdGljQXR0cmlidXRlOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9TdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjNlZDdmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9TdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UgewotICBzdHJpbmdpZmllciBET01TdHJpbmcgKCk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9TdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1OGQ5YmIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1N0cmluZ2lmaWVyQXR0cmlidXRlSW50ZXJmYWNlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSB7Ci0gIHN0cmluZ2lmaWVyIGF0dHJpYnV0ZSBET01TdHJpbmcgdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9TdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlMzg4OWMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBTdHJpbmdpZmllck9wZXJhdGlvbkludGVyZmFjZSB7Ci0gIHN0cmluZ2lmaWVyIERPTVN0cmluZyB0aGVTdHJpbmdpZmllck9wZXJhdGlvbigpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9UYXJnZXRJbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1RhcmdldEludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwNTE5ZGEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1RhcmdldEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgVGFyZ2V0SW50ZXJmYWNlIHsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvVW5pb25UeXBlc0ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvVW5pb25UeXBlc0ludGVyZmFjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1M2IwMzQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1VuaW9uVHlwZXNJbnRlcmZhY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIFVuaW9uVHlwZXNJbnRlcmZhY2UgewotICBhdHRyaWJ1dGUgKERPTVN0cmluZyBvciBib29sZWFuIG9yIEFyYml0cmFyeUludGVyZmFjZSBvciBsb25nKSB1bmlvblByb3BlcnR5OwotICBhdHRyaWJ1dGUgKGRvdWJsZSBvciBET01TdHJpbmc/KSB1bmlvbldpdGhOdWxsYWJsZU1lbWJlclByb3BlcnR5OwotICBhdHRyaWJ1dGUgKGRvdWJsZSBvciBET01TdHJpbmcpPyBudWxsYWJsZVVuaW9uUHJvcGVydHk7Ci0gIGF0dHJpYnV0ZSAoQmFzZUludGVyZmFjZSBvciBET01TdHJpbmcpIHVuaW9uQmFzZVByb3BlcnR5OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9VbnN1cHBvcnRlZEludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvVW5zdXBwb3J0ZWRJbnRlcmZhY2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGU0MTE2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9VbnN1cHBvcnRlZEludGVyZmFjZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1bIE5vdFN1cHBvcnRlZCBdCi1pbnRlcmZhY2UgVW5zdXBwb3J0ZWRJbnRlcmZhY2UgewotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9XaW5kb3cuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1dpbmRvdy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2MTI2NmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL1dpbmRvdy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotW1ByaW1hcnlHbG9iYWxdCi1pbnRlcmZhY2UgV2luZG93IDogR2xvYmFsSW50ZXJmYWNlUGFyZW50IHsKLSAgdm9pZCB3aW5kb3dPcGVyYXRpb24oKTsKLSAgYXR0cmlidXRlIERPTVN0cmluZyB3aW5kb3dQcm9wZXJ0eTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIFdpbmRvdyB3aW5kb3c7Ci0gIFtDYWxsV2l0aD1TdGFja1RyYWNlXSBET01TdHJpbmcgZ2V0U3RhY2tUcmFjZSgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCmluZGV4IGRmNTNhNjUuLjRiNzcyZTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQU5PTllNT1VTX0lOREVYRURfR0VUVEVSX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19BTk9OWU1PVVNfSU5ERVhFRF9HRVRURVJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGVlOTUwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIHVuc2lnbmVkIGxvbmcgKHVuc2lnbmVkIGxvbmcgaW5kZXgpOworICBzZXR0ZXIgdm9pZCAodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgbG9uZyB2YWx1ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaAppbmRleCA2ZjE3ZDQ3Li5jMjMyYjMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQU5PTllNT1VTX05BTUVEX0dFVFRFUl9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQU5PTllNT1VTX05BTUVEX0dFVFRFUl9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyNTQ1MjAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludGVyZmFjZSBBbm9ueW1vdXNOYW1lZEdldHRlckludGVyZmFjZSB7CisgIGdldHRlciBET01TdHJpbmcgKERPTVN0cmluZyBuYW1lKTsKKyAgc2V0dGVyIHZvaWQgKERPTVN0cmluZyBuYW1lLCBET01TdHJpbmcgdmFsdWUpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCmluZGV4IGRiYzdlYjkuLjU0ZGFjNDAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Fub255bW91c19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQU5PTllNT1VTX05BTUVEX0lOREVYRURfR0VUVEVSX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19BTk9OWU1PVVNfTkFNRURfSU5ERVhFRF9HRVRURVJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjg5YzVjNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hbm9ueW1vdXNfbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgQW5vbnltb3VzTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBnZXR0ZXIgdW5zaWduZWQgbG9uZyAodW5zaWduZWQgbG9uZyBpbmRleCk7CisgIHNldHRlciB2b2lkICh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKyAgZ2V0dGVyIERPTVN0cmluZyAoRE9NU3RyaW5nIG5hbWUpOworICBzZXR0ZXIgdm9pZCAoRE9NU3RyaW5nIG5hbWUsIERPTVN0cmluZyB2YWx1ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgKaW5kZXggNjE5MjY0YS4uYWM3NzQwMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19BUkJJVFJBUllfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0FSQklUUkFSWV9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGIxN2Q0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitbQ29uc3RydWN0b3JdCitpbnRlcmZhY2UgQXJiaXRyYXJ5SW50ZXJmYWNlIHsKKyAgdm9pZCBhcmJpdHJhcnlGdW5jdGlvbigpOworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGFyYml0cmFyeVByb3BlcnR5OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iYXNlX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgKaW5kZXggNWExM2ZlMi4uZWVhYzkwMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0JBU0VfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0JBU0VfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjEzODlkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jhc2VfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitbQ29uc3RydWN0b3JdCitpbnRlcmZhY2UgQmFzZUludGVyZmFjZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgYmFzZUF0dHJpYnV0ZTsKKyAgdm9pZCBiYXNlT3BlcmF0aW9uKCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3NhbmRib3hfbWFpbi5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc19zYW5kYm94X21haW4uY2MKaW5kZXggYzhmZTdhZC4uZjJkNGM3ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3NhbmRib3hfbWFpbi5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3Nfc2FuZGJveF9tYWluLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPGlvc3RyZWFtPgogI2luY2x1ZGUgPHN0cmluZz4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaAppbmRleCBmNjM0Njk5Li4xN2VhMWUxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19CSU5ESU5HU19URVNUX0JBU0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQklORElOR1NfVEVTVF9CQVNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX2JpbmRpbmdzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX2JpbmRpbmdzX3Rlc3QuY2MKaW5kZXggMTM0MDdiNi4uNGM5ZjU1ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jvb2xlYW5fdHlwZV9iaW5kaW5nc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfYmluZGluZ3NfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaAppbmRleCA4NzRmNDQ5Li5iMzUxMTdkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Jvb2xlYW5fdHlwZV90ZXN0X2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19CT09MRUFOX1RZUEVfVEVTVF9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQk9PTEVBTl9UWVBFX1RFU1RfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1NGM3NzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYm9vbGVhbl90eXBlX3Rlc3RfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgQm9vbGVhblR5cGVUZXN0SW50ZXJmYWNlIHsKKyAgYm9vbGVhbiBib29sZWFuUmV0dXJuT3BlcmF0aW9uKCk7CisgIHZvaWQgYm9vbGVhbkFyZ3VtZW50T3BlcmF0aW9uKGJvb2xlYW4gYXJnMSk7CisgIGF0dHJpYnV0ZSBib29sZWFuIGJvb2xlYW5Qcm9wZXJ0eTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmgKaW5kZXggOTQ5OGY5OC4uZWUyYTdmNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19mdW5jdGlvbl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQ0FMTEJBQ0tfRlVOQ1RJT05fSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0NBTExCQUNLX0ZVTkNUSU9OX0lOVEVSRkFDRV9IXwpAQCAtMjMsNyArMjEsNyBAQAogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKIApAQCAtNDQsMjcgKzQyLDI3IEBACiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPEFyYml0cmFyeUludGVyZmFjZT4mKT4gRnVuY3Rpb25XaXRoTnVsbGFibGVQYXJhbWV0ZXJzOwogCiAgIE1PQ0tfTUVUSE9EMShUYWtlc1ZvaWRGdW5jdGlvbiwKLSAgICAgICAgICAgICAgIHZvaWQoY29uc3Qgc2NyaXB0OjpTY3JpcHRPYmplY3Q8Vm9pZEZ1bmN0aW9uPiYpKTsKKyAgICAgICAgICAgICAgIHZvaWQoY29uc3Qgc2NyaXB0OjpTY3JpcHRWYWx1ZTxWb2lkRnVuY3Rpb24+JikpOwogICBNT0NLX01FVEhPRDEoVGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nLAotICAgICAgICAgICAgICAgdm9pZChjb25zdCBzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nPiYpKTsKKyAgICAgICAgICAgICAgIHZvaWQoY29uc3Qgc2NyaXB0OjpTY3JpcHRWYWx1ZTxGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nPiYpKTsKICAgTU9DS19NRVRIT0QxKFRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyLAotICAgICAgICAgICAgICAgdm9pZChjb25zdCBzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXI+JikpOworICAgICAgICAgICAgICAgdm9pZChjb25zdCBzY3JpcHQ6OlNjcmlwdFZhbHVlPEZ1bmN0aW9uV2l0aE9uZVBhcmFtZXRlcj4mKSk7CiAgIE1PQ0tfTUVUSE9EMSgKICAgICAgIFRha2VzRnVuY3Rpb25XaXRoU2V2ZXJhbFBhcmFtZXRlcnMsCi0gICAgICB2b2lkKGNvbnN0IHNjcmlwdDo6U2NyaXB0T2JqZWN0PEZ1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzPiYpKTsKKyAgICAgIHZvaWQoY29uc3Qgc2NyaXB0OjpTY3JpcHRWYWx1ZTxGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycz4mKSk7CiAgIE1PQ0tfTUVUSE9EMSgKICAgICAgIFRha2VzRnVuY3Rpb25XaXRoTnVsbGFibGVQYXJhbWV0ZXJzLAotICAgICAgdm9pZChjb25zdCBzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnM+JikpOworICAgICAgdm9pZChjb25zdCBzY3JpcHQ6OlNjcmlwdFZhbHVlPEZ1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycz4mKSk7CiAKICAgTU9DS19NRVRIT0QwKGNhbGxiYWNrX2F0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdDo6U2NyaXB0T2JqZWN0PFZvaWRGdW5jdGlvbj4qKHZvaWQpKTsKKyAgICAgICAgICAgICAgIGNvbnN0IHNjcmlwdDo6U2NyaXB0VmFsdWU8Vm9pZEZ1bmN0aW9uPioodm9pZCkpOwogICBNT0NLX01FVEhPRDEoc2V0X2NhbGxiYWNrX2F0dHJpYnV0ZSwKLSAgICAgICAgICAgICAgIHZvaWQoY29uc3Qgc2NyaXB0OjpTY3JpcHRPYmplY3Q8Vm9pZEZ1bmN0aW9uPiYpKTsKKyAgICAgICAgICAgICAgIHZvaWQoY29uc3Qgc2NyaXB0OjpTY3JpcHRWYWx1ZTxWb2lkRnVuY3Rpb24+JikpOwogCiAgIE1PQ0tfTUVUSE9EMChudWxsYWJsZV9jYWxsYmFja19hdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICBjb25zdCBzY3JpcHQ6OlNjcmlwdE9iamVjdDxWb2lkRnVuY3Rpb24+Kih2b2lkKSk7CisgICAgICAgICAgICAgICBjb25zdCBzY3JpcHQ6OlNjcmlwdFZhbHVlPFZvaWRGdW5jdGlvbj4qKHZvaWQpKTsKICAgTU9DS19NRVRIT0QxKHNldF9udWxsYWJsZV9jYWxsYmFja19hdHRyaWJ1dGUsCi0gICAgICAgICAgICAgICB2b2lkKGNvbnN0IHNjcmlwdDo6U2NyaXB0T2JqZWN0PFZvaWRGdW5jdGlvbj4mKSk7CisgICAgICAgICAgICAgICB2b2lkKGNvbnN0IHNjcmlwdDo6U2NyaXB0VmFsdWU8Vm9pZEZ1bmN0aW9uPiYpKTsKIAogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZSk7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25faW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNmYzMjg4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UgeworICB2b2lkIHRha2VzVm9pZEZ1bmN0aW9uKFZvaWRGdW5jdGlvbiBjYik7CisgIHZvaWQgdGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKEZ1bmN0aW9uVGhhdFJldHVybnNTdHJpbmcgY2IpOworICB2b2lkIHRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyKEZ1bmN0aW9uV2l0aE9uZVBhcmFtZXRlciBjYik7CisgIHZvaWQgdGFrZXNGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycyhGdW5jdGlvbldpdGhTZXZlcmFsUGFyYW1ldGVycyBjYik7CisgIHZvaWQgdGFrZXNGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMoRnVuY3Rpb25XaXRoTnVsbGFibGVQYXJhbWV0ZXJzIGNiKTsKKworICBhdHRyaWJ1dGUgVm9pZEZ1bmN0aW9uIGNhbGxiYWNrQXR0cmlidXRlOworICBhdHRyaWJ1dGUgVm9pZEZ1bmN0aW9uPyBudWxsYWJsZUNhbGxiYWNrQXR0cmlidXRlOworfTsKKworY2FsbGJhY2sgVm9pZEZ1bmN0aW9uID0gdm9pZCgpOworY2FsbGJhY2sgRnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyA9IERPTVN0cmluZygpOworY2FsbGJhY2sgRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyID0gdm9pZChsb25nIHBhcmFtKTsKK2NhbGxiYWNrIEZ1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzID0gdm9pZChkb3VibGUgcGFyYW0xLCBET01TdHJpbmcgcGFyYW0yLCBBcmJpdHJhcnlJbnRlcmZhY2UgcGFyYW0zKTsKK2NhbGxiYWNrIEZ1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycyA9IHZvaWQoYm9vbGVhbj8gcGFyYW0xLCBET01TdHJpbmc/IHBhcmFtMiwgQXJiaXRyYXJ5SW50ZXJmYWNlPyBwYXJhbTMpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2Z1bmN0aW9uX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25fdGVzdC5jYwppbmRleCA5ZmUyN2JkLi4zNmI4ZmMyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25fdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfZnVuY3Rpb25fdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19mdW5jdGlvbl9pbnRlcmZhY2UuaCIKQEAgLTQwLDcgKzM4LDcgQEAKICAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInZhciB3YXNfY2FsbGVkID0gZmFsc2U7IiwgTlVMTCkpOwogCiAgIHR5cGVkZWYgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uIEZ1bmN0aW9uVHlwZTsKLSAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKKyAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdFZhbHVlPEZ1bmN0aW9uVHlwZT4gPiBGdW5jdGlvbk93bmVyOwogICBGdW5jdGlvbk93bmVyIGZ1bmN0aW9uX293bmVyKCZ0ZXN0X21vY2soKSk7CiAgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBUYWtlc1ZvaWRGdW5jdGlvbihfKSkKICAgICAgIC5XaWxsT25jZShJbnZva2UoJmZ1bmN0aW9uX293bmVyLCAmRnVuY3Rpb25Pd25lcjo6VGFrZU93bmVyc2hpcCkpOwpAQCAtNTUsNyArNTMsNyBAQAogCiBURVNUX0YoQ2FsbGJhY2tGdW5jdGlvblRlc3QsIFNjcmlwdENhbGxiYWNrV2l0aFJldHVyblZhbHVlKSB7CiAgIHR5cGVkZWYgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyBGdW5jdGlvblR5cGU7Ci0gIHR5cGVkZWYgU2NyaXB0T2JqZWN0T3duZXI8c2NyaXB0OjpTY3JpcHRPYmplY3Q8RnVuY3Rpb25UeXBlPiA+IEZ1bmN0aW9uT3duZXI7CisgIHR5cGVkZWYgU2NyaXB0T2JqZWN0T3duZXI8c2NyaXB0OjpTY3JpcHRWYWx1ZTxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKICAgRnVuY3Rpb25Pd25lciBmdW5jdGlvbl9vd25lcigmdGVzdF9tb2NrKCkpOwogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgVGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKF8pKQogICAgICAgLldpbGxPbmNlKEludm9rZSgmZnVuY3Rpb25fb3duZXIsICZGdW5jdGlvbk93bmVyOjpUYWtlT3duZXJzaGlwKSk7CkBAIC03MCw3ICs2OCw3IEBACiAKIFRFU1RfRihDYWxsYmFja0Z1bmN0aW9uVGVzdCwgU2NyaXB0Q2FsbGJhY2tXaXRoRXhjZXB0aW9uKSB7CiAgIHR5cGVkZWYgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6RnVuY3Rpb25UaGF0UmV0dXJuc1N0cmluZyBGdW5jdGlvblR5cGU7Ci0gIHR5cGVkZWYgU2NyaXB0T2JqZWN0T3duZXI8c2NyaXB0OjpTY3JpcHRPYmplY3Q8RnVuY3Rpb25UeXBlPiA+IEZ1bmN0aW9uT3duZXI7CisgIHR5cGVkZWYgU2NyaXB0T2JqZWN0T3duZXI8c2NyaXB0OjpTY3JpcHRWYWx1ZTxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKICAgRnVuY3Rpb25Pd25lciBmdW5jdGlvbl9vd25lcigmdGVzdF9tb2NrKCkpOwogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgVGFrZXNGdW5jdGlvblRoYXRSZXR1cm5zU3RyaW5nKF8pKQogICAgICAgLldpbGxPbmNlKEludm9rZSgmZnVuY3Rpb25fb3duZXIsICZGdW5jdGlvbk93bmVyOjpUYWtlT3duZXJzaGlwKSk7CkBAIC04Nyw3ICs4NSw3IEBACiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ2YXIgbnVtX2NhbGxlZCA9IDA7IiwgTlVMTCkpOwogCiAgIHR5cGVkZWYgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uIEZ1bmN0aW9uVHlwZTsKLSAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKKyAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdFZhbHVlPEZ1bmN0aW9uVHlwZT4gPiBGdW5jdGlvbk93bmVyOwogICBGdW5jdGlvbk93bmVyIGZ1bmN0aW9uX293bmVyKCZ0ZXN0X21vY2soKSk7CiAgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBUYWtlc1ZvaWRGdW5jdGlvbihfKSkKICAgICAgIC5XaWxsT25jZShJbnZva2UoJmZ1bmN0aW9uX293bmVyLCAmRnVuY3Rpb25Pd25lcjo6VGFrZU93bmVyc2hpcCkpOwpAQCAtMTE1LDcgKzExMyw3IEBACiAKICAgLy8gU3RvcmUgYSBoYW5kbGUgdG8gdGhlIGNhbGxiYWNrIHBhc3NlZCBmcm9tIHNjcmlwdC4KICAgdHlwZWRlZiBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpGdW5jdGlvbldpdGhPbmVQYXJhbWV0ZXIgRnVuY3Rpb25UeXBlOwotICB0eXBlZGVmIFNjcmlwdE9iamVjdE93bmVyPHNjcmlwdDo6U2NyaXB0T2JqZWN0PEZ1bmN0aW9uVHlwZT4gPiBGdW5jdGlvbk93bmVyOworICB0eXBlZGVmIFNjcmlwdE9iamVjdE93bmVyPHNjcmlwdDo6U2NyaXB0VmFsdWU8RnVuY3Rpb25UeXBlPiA+IEZ1bmN0aW9uT3duZXI7CiAgIEZ1bmN0aW9uT3duZXIgZnVuY3Rpb25fb3duZXIoJnRlc3RfbW9jaygpKTsKICAgRVhQRUNUX0NBTEwodGVzdF9tb2NrKCksIFRha2VzRnVuY3Rpb25XaXRoT25lUGFyYW1ldGVyKF8pKQogICAgICAgLldpbGxPbmNlKEludm9rZSgmZnVuY3Rpb25fb3duZXIsICZGdW5jdGlvbk93bmVyOjpUYWtlT3duZXJzaGlwKSk7CkBAIC0xNDAsNyArMTM4LDcgQEAKIAogICAvLyBTdG9yZSBhIGhhbmRsZSB0byB0aGUgY2FsbGJhY2sgcGFzc2VkIGZyb20gc2NyaXB0LgogICB0eXBlZGVmIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OkZ1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzIEZ1bmN0aW9uVHlwZTsKLSAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKKyAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdFZhbHVlPEZ1bmN0aW9uVHlwZT4gPiBGdW5jdGlvbk93bmVyOwogICBGdW5jdGlvbk93bmVyIGZ1bmN0aW9uX293bmVyKCZ0ZXN0X21vY2soKSk7CiAgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBUYWtlc0Z1bmN0aW9uV2l0aFNldmVyYWxQYXJhbWV0ZXJzKF8pKQogICAgICAgLldpbGxPbmNlKEludm9rZSgmZnVuY3Rpb25fb3duZXIsICZGdW5jdGlvbk93bmVyOjpUYWtlT3duZXJzaGlwKSk7CkBAIC0xNzgsNyArMTc2LDcgQEAKICAgLy8gU3RvcmUgYSBoYW5kbGUgdG8gdGhlIGNhbGxiYWNrIHBhc3NlZCBmcm9tIHNjcmlwdC4KICAgdHlwZWRlZiBDYWxsYmFja0Z1bmN0aW9uSW50ZXJmYWNlOjpGdW5jdGlvbldpdGhOdWxsYWJsZVBhcmFtZXRlcnMKICAgICAgIEZ1bmN0aW9uVHlwZTsKLSAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKKyAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdFZhbHVlPEZ1bmN0aW9uVHlwZT4gPiBGdW5jdGlvbk93bmVyOwogICBGdW5jdGlvbk93bmVyIGZ1bmN0aW9uX293bmVyKCZ0ZXN0X21vY2soKSk7CiAgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBUYWtlc0Z1bmN0aW9uV2l0aE51bGxhYmxlUGFyYW1ldGVycyhfKSkKICAgICAgIC5XaWxsT25jZShJbnZva2UoJmZ1bmN0aW9uX293bmVyLCAmRnVuY3Rpb25Pd25lcjo6VGFrZU93bmVyc2hpcCkpOwpAQCAtMjEyLDcgKzIxMCw3IEBACiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ2YXIgbnVtX2NhbGxlZCA9IDA7IiwgTlVMTCkpOwogCiAgIHR5cGVkZWYgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uIEZ1bmN0aW9uVHlwZTsKLSAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdE9iamVjdDxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKKyAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdFZhbHVlPEZ1bmN0aW9uVHlwZT4gPiBGdW5jdGlvbk93bmVyOwogICBGdW5jdGlvbk93bmVyIGZ1bmN0aW9uX293bmVyKCZ0ZXN0X21vY2soKSk7CiAgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBzZXRfY2FsbGJhY2tfYXR0cmlidXRlKF8pKQogICAgICAgLldpbGxPbmNlKEludm9rZSgmZnVuY3Rpb25fb3duZXIsICZGdW5jdGlvbk93bmVyOjpUYWtlT3duZXJzaGlwKSk7CkBAIC0yMzAsMTQgKzIyOCwxNCBAQAogCiAgIC8vIENoZWNrIHRoYXQgdGhlIGdldHRlciByZWZlcmVuY2VzIHRoZSBzYW1lIG9iamVjdAogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgY2FsbGJhY2tfYXR0cmlidXRlKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCZmdW5jdGlvbl9vd25lci5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX29iamVjdCgpKSk7CisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCZmdW5jdGlvbl9vd25lci5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX3ZhbHVlKCkpKTsKICAgRVhQRUNUX1RSVUUoCiAgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5jYWxsYmFja0F0dHJpYnV0ZSA9PT0gY2FsbGJhY2tfZnVuY3Rpb247IiwgJnJlc3VsdCkpOwogICBFWFBFQ1RfU1RSRVEoInRydWUiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgLy8gR2V0IHRoZSBjYWxsYmFjayBhbmQgZXhlY3V0ZSBpdAogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgY2FsbGJhY2tfYXR0cmlidXRlKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCZmdW5jdGlvbl9vd25lci5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX29iamVjdCgpKSk7CisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCZmdW5jdGlvbl9vd25lci5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX3ZhbHVlKCkpKTsKICAgRVhQRUNUX1RSVUUoCiAgICAgICBFdmFsdWF0ZVNjcmlwdCgidmFyIGNhbGxiYWNrX2Z1bmN0aW9uMiA9IHRlc3QuY2FsbGJhY2tBdHRyaWJ1dGU7IiwgTlVMTCkpOwogICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgiY2FsbGJhY2tfZnVuY3Rpb24yKCk7IiwgTlVMTCkpOwpAQCAtMjUwLDcgKzI0OCw3IEBACiAKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICB0eXBlZGVmIENhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2U6OlZvaWRGdW5jdGlvbiBGdW5jdGlvblR5cGU7Ci0gIHR5cGVkZWYgU2NyaXB0T2JqZWN0T3duZXI8c2NyaXB0OjpTY3JpcHRPYmplY3Q8RnVuY3Rpb25UeXBlPiA+IEZ1bmN0aW9uT3duZXI7CisgIHR5cGVkZWYgU2NyaXB0T2JqZWN0T3duZXI8c2NyaXB0OjpTY3JpcHRWYWx1ZTxGdW5jdGlvblR5cGU+ID4gRnVuY3Rpb25Pd25lcjsKICAgRnVuY3Rpb25Pd25lciBmdW5jdGlvbl9vd25lcigmdGVzdF9tb2NrKCkpOwogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgc2V0X251bGxhYmxlX2NhbGxiYWNrX2F0dHJpYnV0ZShfKSkKICAgICAgIC5XaWxsT25jZShJbnZva2UoJmZ1bmN0aW9uX293bmVyLCAmRnVuY3Rpb25Pd25lcjo6VGFrZU93bmVyc2hpcCkpOwpAQCAtMjY5LDcgKzI2Nyw3IEBACiAKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgbnVsbGFibGVfY2FsbGJhY2tfYXR0cmlidXRlKCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKHN0YXRpY19jYXN0PHNjcmlwdDo6U2NyaXB0T2JqZWN0PAorICAgICAgLldpbGxPbmNlKFJldHVybihzdGF0aWNfY2FzdDxzY3JpcHQ6OlNjcmlwdFZhbHVlPAogICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2FsbGJhY2tGdW5jdGlvbkludGVyZmFjZTo6Vm9pZEZ1bmN0aW9uPio+KE5VTEwpKSk7CiAgIEVYUEVDVF9UUlVFKAogICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QubnVsbGFibGVDYWxsYmFja0F0dHJpYnV0ZSA9PSBudWxsOyIsICZyZXN1bHQpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5oCmluZGV4IDBhODJmMjMuLmQ4YWFlZDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2ludGVyZmFjZV9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQ0FMTEJBQ0tfSU5URVJGQUNFX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19DQUxMQkFDS19JTlRFUkZBQ0VfSU5URVJGQUNFX0hfCkBAIC0yMyw3ICsyMSw3IEBACiAjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKIApAQCAtMzMsNyArMzEsNyBAQAogCiBjbGFzcyBDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZSA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CiAgcHVibGljOgotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZT4KKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZT4KICAgICAgIFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZUhvbGRlcjsKIAogICBNT0NLX01FVEhPRDEoUmVnaXN0ZXJDYWxsYmFjaywgdm9pZChjb25zdCBTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2VIb2xkZXImKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNTg4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19pbnRlcmZhY2VfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgQ2FsbGJhY2tJbnRlcmZhY2VJbnRlcmZhY2UgeworICB2b2lkIHJlZ2lzdGVyQ2FsbGJhY2soU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlIGNhbGxiYWNrX2ludGVyZmFjZSk7CisgIGF0dHJpYnV0ZSBTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U/IGNhbGxiYWNrQXR0cmlidXRlOworCisgIHZvaWQgc29tZU9wZXJhdGlvbigpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19pbnRlcmZhY2VfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jYWxsYmFja19pbnRlcmZhY2VfdGVzdC5jYwppbmRleCAwNmRjODlmLi4xMDJjNmQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY2FsbGJhY2tfaW50ZXJmYWNlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NhbGxiYWNrX2ludGVyZmFjZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKQEAgLTM1LDcgKzMzLDcgQEAKIGNsYXNzIENhbGxiYWNrSW50ZXJmYWNlVGVzdAogICAgIDogcHVibGljIEludGVyZmFjZUJpbmRpbmdzVGVzdDxDYWxsYmFja0ludGVyZmFjZUludGVyZmFjZT4gewogIHB1YmxpYzoKLSAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdE9iamVjdDxTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2U+ID4KKyAgdHlwZWRlZiBTY3JpcHRPYmplY3RPd25lcjxzY3JpcHQ6OlNjcmlwdFZhbHVlPFNpbmdsZU9wZXJhdGlvbkludGVyZmFjZT4gPgogICAgICAgSW50ZXJmYWNlT3duZXI7CiAgIENhbGxiYWNrSW50ZXJmYWNlVGVzdCgpCiAgICAgICA6IGNhbGxiYWNrX2FyZ18obmV3IEFyYml0cmFyeUludGVyZmFjZSgpKSwgaGFkX2V4Y2VwdGlvbl8odHJ1ZSkge30KQEAgLTIxMSw4ICsyMDksOCBAQAogICBBU1NFUlRfVFJVRShpbnRlcmZhY2Vfb3duZXJfZmlyc3QuSXNTZXQoKSk7CiAgIEFTU0VSVF9UUlVFKGludGVyZmFjZV9vd25lcl9zZWNvbmQuSXNTZXQoKSk7CiAKLSAgRVhQRUNUX1RSVUUoaW50ZXJmYWNlX293bmVyX2ZpcnN0LnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfb2JqZWN0KCkuRXF1YWxUbygKLSAgICAgIGludGVyZmFjZV9vd25lcl9zZWNvbmQucmVmZXJlbmNlKCkucmVmZXJlbmNlZF9vYmplY3QoKSkpOworICBFWFBFQ1RfVFJVRShpbnRlcmZhY2Vfb3duZXJfZmlyc3QucmVmZXJlbmNlKCkucmVmZXJlbmNlZF92YWx1ZSgpLkVxdWFsVG8oCisgICAgICBpbnRlcmZhY2Vfb3duZXJfc2Vjb25kLnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfdmFsdWUoKSkpOwogfQogCiBURVNUX0YoQ2FsbGJhY2tJbnRlcmZhY2VUZXN0LCBGdW5jdGlvbnNBcmVOb3RFcXVhbCkgewpAQCAtMjM0LDggKzIzMiw4IEBACiAgIEFTU0VSVF9UUlVFKGludGVyZmFjZV9vd25lcl9maXJzdC5Jc1NldCgpKTsKICAgQVNTRVJUX1RSVUUoaW50ZXJmYWNlX293bmVyX3NlY29uZC5Jc1NldCgpKTsKIAotICBFWFBFQ1RfRkFMU0UoaW50ZXJmYWNlX293bmVyX2ZpcnN0LnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfb2JqZWN0KCkuRXF1YWxUbygKLSAgICAgIGludGVyZmFjZV9vd25lcl9zZWNvbmQucmVmZXJlbmNlKCkucmVmZXJlbmNlZF9vYmplY3QoKSkpOworICBFWFBFQ1RfRkFMU0UoaW50ZXJmYWNlX293bmVyX2ZpcnN0LnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfdmFsdWUoKS5FcXVhbFRvKAorICAgICAgaW50ZXJmYWNlX293bmVyX3NlY29uZC5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX3ZhbHVlKCkpKTsKIH0KIAogVEVTVF9GKENhbGxiYWNrSW50ZXJmYWNlVGVzdCwgT2JqZWN0c0FyZUVxdWFsKSB7CkBAIC0yNTYsOCArMjU0LDggQEAKICAgQVNTRVJUX1RSVUUoaW50ZXJmYWNlX293bmVyX2ZpcnN0LklzU2V0KCkpOwogICBBU1NFUlRfVFJVRShpbnRlcmZhY2Vfb3duZXJfc2Vjb25kLklzU2V0KCkpOwogCi0gIEVYUEVDVF9UUlVFKGludGVyZmFjZV9vd25lcl9maXJzdC5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX29iamVjdCgpLkVxdWFsVG8oCi0gICAgICBpbnRlcmZhY2Vfb3duZXJfc2Vjb25kLnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfb2JqZWN0KCkpKTsKKyAgRVhQRUNUX1RSVUUoaW50ZXJmYWNlX293bmVyX2ZpcnN0LnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfdmFsdWUoKS5FcXVhbFRvKAorICAgICAgaW50ZXJmYWNlX293bmVyX3NlY29uZC5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX3ZhbHVlKCkpKTsKIH0KIAogVEVTVF9GKENhbGxiYWNrSW50ZXJmYWNlVGVzdCwgT2JqZWN0c0FyZU5vdEVxdWFsKSB7CkBAIC0yNzksOCArMjc3LDggQEAKICAgQVNTRVJUX1RSVUUoaW50ZXJmYWNlX293bmVyX2ZpcnN0LklzU2V0KCkpOwogICBBU1NFUlRfVFJVRShpbnRlcmZhY2Vfb3duZXJfc2Vjb25kLklzU2V0KCkpOwogCi0gIEVYUEVDVF9GQUxTRShpbnRlcmZhY2Vfb3duZXJfZmlyc3QucmVmZXJlbmNlKCkucmVmZXJlbmNlZF9vYmplY3QoKS5FcXVhbFRvKAotICAgICAgaW50ZXJmYWNlX293bmVyX3NlY29uZC5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX29iamVjdCgpKSk7CisgIEVYUEVDVF9GQUxTRShpbnRlcmZhY2Vfb3duZXJfZmlyc3QucmVmZXJlbmNlKCkucmVmZXJlbmNlZF92YWx1ZSgpLkVxdWFsVG8oCisgICAgICBpbnRlcmZhY2Vfb3duZXJfc2Vjb25kLnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfdmFsdWUoKSkpOwogfQogCiBURVNUX0YoQ2FsbGJhY2tJbnRlcmZhY2VUZXN0LCBHZXRBbmRTZXRBdHRyaWJ1dGUpIHsKQEAgLTI5OCw3ICsyOTYsNyBAQAogCiAgIC8vIEdldCB0aGUgYXR0cmlidXRlIHZhbHVlIGFuZCBjaGVjayB0aGF0IGl0J3MgZXF1YWwuCiAgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBjYWxsYmFja19hdHRyaWJ1dGUoKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oJmludGVyZmFjZV9vd25lci5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX29iamVjdCgpKSk7CisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCZpbnRlcmZhY2Vfb3duZXIucmVmZXJlbmNlKCkucmVmZXJlbmNlZF92YWx1ZSgpKSk7CiAgIEVYUEVDVF9UUlVFKAogICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuY2FsbGJhY2tBdHRyaWJ1dGUgPT09IGltcGxlbWVudGVyOyIsICZyZXN1bHQpKTsKICAgRVhQRUNUX1NUUkVRKCJ0cnVlIiwgcmVzdWx0LmNfc3RyKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2F0dHJpYnV0ZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2F0dHJpYnV0ZV90ZXN0LmNjCmluZGV4IDM5NTg2NDkuLjNkZmUyNDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25kaXRpb25hbF9hdHRyaWJ1dGVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uZGl0aW9uYWxfYXR0cmlidXRlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uZGl0aW9uYWxfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uZGl0aW9uYWxfaW50ZXJmYWNlLmgKaW5kZXggYjRjZmU1Mi4uNDgwYTMwNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25kaXRpb25hbF9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfQ09ORElUSU9OQUxfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0NPTkRJVElPTkFMX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uZGl0aW9uYWxfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yM2I4OTE1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbmRpdGlvbmFsX2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworW0NvbmRpdGlvbmFsPUVOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0VdCitpbnRlcmZhY2UgQ29uZGl0aW9uYWxJbnRlcmZhY2UgeworICBbQ29uZGl0aW9uYWw9RU5BQkxFX0NPTkRJVElPTkFMX1BST1BFUlRZXSB2b2lkIGVuYWJsZWRPcGVyYXRpb24oKTsKKyAgW0NvbmRpdGlvbmFsPU5PX0VOQUJMRV9DT05ESVRJT05BTF9QUk9QRVJUWV0gdm9pZCBkaXNhYmxlZE9wZXJhdGlvbigpOworCisgIFtDb25kaXRpb25hbD1FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFldIGF0dHJpYnV0ZSBsb25nIGVuYWJsZWRBdHRyaWJ1dGU7CisgIFtDb25kaXRpb25hbD1OT19FTkFCTEVfQ09ORElUSU9OQUxfUFJPUEVSVFldIGF0dHJpYnV0ZSBsb25nIGRpc2FibGVkQXR0cmlidXRlOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfYmluZGluZ3NfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfYmluZGluZ3NfdGVzdC5jYwppbmRleCA4YmMyYjNmLi5iZGM3MzQ4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RhbnRzX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19iaW5kaW5nc190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3dpbmRvd19tb2NrLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RhbnRzX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmNjCmluZGV4IGYzYjU5ZjcuLjJkZDJlZTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19pbnRlcmZhY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmgKaW5kZXggMzZiOWEyNi4uYjgxMjYwNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RhbnRzX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19DT05TVEFOVFNfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0NPTlNUQU5UU19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdGFudHNfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOWZiMjE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0YW50c19pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludGVyZmFjZSBDb25zdGFudHNJbnRlcmZhY2UgeworICBjb25zdCB1bnNpZ25lZCBsb25nIElOVEVHRVJfQ09OU1RBTlQgPSA1OworICBjb25zdCBkb3VibGUgRE9VQkxFX0NPTlNUQU5UID0gMi43MTg7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX2JpbmRpbmdzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfYmluZGluZ3NfdGVzdC5jYwppbmRleCBhMWMzNmY1Li4wMmMwOWIzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfYmluZGluZ3NfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfYmluZGluZ3NfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjCmluZGV4IGYxNjkxNWIuLjYzZmMwZTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX2ludGVyZmFjZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCmluZGV4IGI1MjA3ZDUuLmJhMTU4ZDkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0NPTlNUUlVDVE9SX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19DT05TVFJVQ1RPUl9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTllM2I5NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1sKKyAgQ29uc3RydWN0b3IsCisgIENvbnN0cnVjdG9yKGJvb2xlYW4gYXJnKSwKK10KK2ludGVyZmFjZSBDb25zdHJ1Y3RvckludGVyZmFjZSB7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5oCmluZGV4IDhlYzI2MWIuLjBmZGFhZDAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvY29uc3RydWN0b3Jfd2l0aF9hcmd1bWVudHNfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0NPTlNUUlVDVE9SX1dJVEhfQVJHVU1FTlRTX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19DT05TVFJVQ1RPUl9XSVRIX0FSR1VNRU5UU19JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzgwYjdlNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9jb25zdHJ1Y3Rvcl93aXRoX2FyZ3VtZW50c19pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitbQ29uc3RydWN0b3IobG9uZyBhcmcxLCBib29sZWFuIGFyZzIsIG9wdGlvbmFsIERPTVN0cmluZyBkZWZhdWx0X2FyZyA9ICJkZWZhdWx0IildCitpbnRlcmZhY2UgQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGxvbmcgbG9uZ0FyZzsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gYm9vbGVhbkFyZzsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzdHJpbmdBcmc7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RlcGVuZGVudF9pbnRlcmZhY2VfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXBlbmRlbnRfaW50ZXJmYWNlX3Rlc3QuY2MKaW5kZXggYzdlODg4ZS4uMjU0MDY2MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RlcGVuZGVudF9pbnRlcmZhY2VfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVwZW5kZW50X2ludGVyZmFjZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5oCmluZGV4IDYyOTJkN2UuLjg1MDVkZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rlcml2ZWRfZ2V0dGVyX3NldHRlcl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfREVSSVZFRF9HRVRURVJfU0VUVEVSX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19ERVJJVkVEX0dFVFRFUl9TRVRURVJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjk4NmZkMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2dldHRlcl9zZXR0ZXJfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSA6IE5hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIHVuc2lnbmVkIGxvbmcgZGVyaXZlZEluZGV4ZWRHZXR0ZXIodW5zaWduZWQgbG9uZyBpbmRleCk7CisgIHNldHRlciB2b2lkIGRlcml2ZWRJbmRleGVkU2V0dGVyKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisgIGdldHRlciBET01TdHJpbmcgKERPTVN0cmluZyBuYW1lKTsKKyAgc2V0dGVyIHZvaWQgKERPTVN0cmluZyBuYW1lLCBET01TdHJpbmcgdmFsdWUpOworCisgIGF0dHJpYnV0ZSBib29sZWFuIHByb3BlcnR5T25EZXJpdmVkQ2xhc3M7CisgIHZvaWQgb3BlcmF0aW9uT25EZXJpdmVkQ2xhc3MoKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGVyaXZlZF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5oCmluZGV4IDRmMDk0ZWMuLjNjYzM4OTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19ERVJJVkVEX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19ERVJJVkVEX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rlcml2ZWRfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGRhNDU4MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kZXJpdmVkX2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworW0NvbnN0cnVjdG9yXQoraW50ZXJmYWNlIERlcml2ZWRJbnRlcmZhY2UgOiBCYXNlSW50ZXJmYWNlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBkZXJpdmVkQXR0cmlidXRlOworICB2b2lkIGRlcml2ZWRPcGVyYXRpb24oKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGljdGlvbmFyeV9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaWN0aW9uYXJ5X2ludGVyZmFjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ1YmFkNDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGljdGlvbmFyeV9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDQyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0RJQ1RJT05BUllfSU5URVJGQUNFX0hfCisjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0RJQ1RJT05BUllfSU5URVJGQUNFX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy90ZXN0X2RpY3Rpb25hcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBiaW5kaW5ncyB7CituYW1lc3BhY2UgdGVzdGluZyB7CisKK2NsYXNzIERpY3Rpb25hcnlJbnRlcmZhY2UgOiBwdWJsaWMgc2NyaXB0OjpXcmFwcGFibGUgeworIHB1YmxpYzoKKyAgTU9DS19NRVRIT0QxKERpY3Rpb25hcnlPcGVyYXRpb24sCisgICAgICAgICAgICAgICB2b2lkKGNvbnN0IFRlc3REaWN0aW9uYXJ5JiB0ZXN0X2RpY3Rpb25hcnkpKTsKKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoRGljdGlvbmFyeUludGVyZmFjZSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfRElDVElPTkFSWV9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaWN0aW9uYXJ5X2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGljdGlvbmFyeV9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3ZjI0Y2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGljdGlvbmFyeV9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKK2ludGVyZmFjZSBEaWN0aW9uYXJ5SW50ZXJmYWNlIHsKKyAgdm9pZCBkaWN0aW9uYXJ5T3BlcmF0aW9uKFRlc3REaWN0aW9uYXJ5IGRpY3Rpb25hcnkpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaWN0aW9uYXJ5X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGljdGlvbmFyeV90ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlkMTliZmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGljdGlvbmFyeV90ZXN0LmNjCkBAIC0wLDAgKzEsNjggQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaWN0aW9uYXJ5X2ludGVyZmFjZS5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7CisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGJpbmRpbmdzIHsKK25hbWVzcGFjZSB0ZXN0aW5nIHsKKworbmFtZXNwYWNlIHsKK3R5cGVkZWYgSW50ZXJmYWNlQmluZGluZ3NUZXN0PERpY3Rpb25hcnlJbnRlcmZhY2U+IERpY3Rpb25hcnlUZXN0OworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1RfRihEaWN0aW9uYXJ5VGVzdCwgTm9WYWx1ZXNTZXQpIHsKKyAgVGVzdERpY3Rpb25hcnkgZGljdGlvbmFyeTsKKyAgRVhQRUNUX0NBTEwodGVzdF9tb2NrKCksIERpY3Rpb25hcnlPcGVyYXRpb24oXykpCisgICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmZGljdGlvbmFyeSkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5kaWN0aW9uYXJ5T3BlcmF0aW9uKHt9KTsiLCBOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShkaWN0aW9uYXJ5Lmhhc19ub25fZGVmYXVsdF9tZW1iZXIoKSk7CisgIEVYUEVDVF9UUlVFKGRpY3Rpb25hcnkuaGFzX21lbWJlcl93aXRoX2RlZmF1bHQoKSk7CisgIEVYUEVDVF9FUSg1LCBkaWN0aW9uYXJ5Lm1lbWJlcl93aXRoX2RlZmF1bHQoKSk7CisKKyAgRVhQRUNUX0NBTEwodGVzdF9tb2NrKCksIERpY3Rpb25hcnlPcGVyYXRpb24oXykpCisgICAgICAuV2lsbE9uY2UoU2F2ZUFyZzwwPigmZGljdGlvbmFyeSkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5kaWN0aW9uYXJ5T3BlcmF0aW9uKHVuZGVmaW5lZCk7IiwgTlVMTCkpOworICBFWFBFQ1RfRkFMU0UoZGljdGlvbmFyeS5oYXNfbm9uX2RlZmF1bHRfbWVtYmVyKCkpOworICBFWFBFQ1RfVFJVRShkaWN0aW9uYXJ5Lmhhc19tZW1iZXJfd2l0aF9kZWZhdWx0KCkpOworICBFWFBFQ1RfRVEoNSwgZGljdGlvbmFyeS5tZW1iZXJfd2l0aF9kZWZhdWx0KCkpOworCisgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBEaWN0aW9uYXJ5T3BlcmF0aW9uKF8pKQorICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJmRpY3Rpb25hcnkpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZGljdGlvbmFyeU9wZXJhdGlvbihudWxsKTsiLCBOVUxMKSk7CisgIEVYUEVDVF9GQUxTRShkaWN0aW9uYXJ5Lmhhc19ub25fZGVmYXVsdF9tZW1iZXIoKSk7CisgIEVYUEVDVF9UUlVFKGRpY3Rpb25hcnkuaGFzX21lbWJlcl93aXRoX2RlZmF1bHQoKSk7CisgIEVYUEVDVF9FUSg1LCBkaWN0aW9uYXJ5Lm1lbWJlcl93aXRoX2RlZmF1bHQoKSk7Cit9CisKK1RFU1RfRihEaWN0aW9uYXJ5VGVzdCwgT3ZlcnJpZGVEZWZhdWx0KSB7CisgIFRlc3REaWN0aW9uYXJ5IGRpY3Rpb25hcnk7CisgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBEaWN0aW9uYXJ5T3BlcmF0aW9uKF8pKQorICAgICAgLldpbGxPbmNlKFNhdmVBcmc8MD4oJmRpY3Rpb25hcnkpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoCisgICAgICAidGVzdC5kaWN0aW9uYXJ5T3BlcmF0aW9uKCB7bWVtYmVyV2l0aERlZmF1bHQgOiAyMH0gKTsiLCBOVUxMKSk7CisgIEVYUEVDVF9FUSgyMCwgZGljdGlvbmFyeS5tZW1iZXJfd2l0aF9kZWZhdWx0KCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdGVzdGluZworfSAgLy8gbmFtZXNwYWNlIGJpbmRpbmdzCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGlzYWJsZWRfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGlzYWJsZWRfaW50ZXJmYWNlLmgKaW5kZXggYTIyZDBmMC4uZDdjZjhhYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rpc2FibGVkX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kaXNhYmxlZF9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfRElTQUJMRURfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0RJU0FCTEVEX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rpc2FibGVkX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZGlzYWJsZWRfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNGZiZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2Rpc2FibGVkX2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworW0NvbmRpdGlvbmFsPU5PX0VOQUJMRV9DT05ESVRJT05BTF9JTlRFUkZBQ0VdCitpbnRlcmZhY2UgRGlzYWJsZWRJbnRlcmZhY2UgeworICB2b2lkIGRpc2FibGVkRnVuY3Rpb24oKTsKKyAgYXR0cmlidXRlIGxvbmcgZGlzYWJsZWRQcm9wZXJ0eTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZG9tX3N0cmluZ19iaW5kaW5nc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RvbV9zdHJpbmdfYmluZGluZ3NfdGVzdC5jYwppbmRleCA0ZTk5YzFjLi5kZTk1MDVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZG9tX3N0cmluZ19iaW5kaW5nc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kb21fc3RyaW5nX2JpbmRpbmdzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmgKaW5kZXggN2JjZDA1ZC4uYzQ3OTQ0MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZG9tX3N0cmluZ190ZXN0X2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19ET01fU1RSSU5HX1RFU1RfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0RPTV9TVFJJTkdfVEVTVF9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9kb21fc3RyaW5nX3Rlc3RfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDU4M2ZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludGVyZmFjZSBET01TdHJpbmdUZXN0SW50ZXJmYWNlIHsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBwcm9wZXJ0eTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyByZWFkT25seVByb3BlcnR5OworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlYWRPbmx5VG9rZW5Qcm9wZXJ0eTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG51bGxJc0VtcHR5UHJvcGVydHk7CisgIFtUcmVhdFVuZGVmaW5lZEFzPUVtcHR5U3RyaW5nXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHVuZGVmaW5lZElzRW1wdHlQcm9wZXJ0eTsKKyAgW1RyZWF0VW5kZWZpbmVkQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmc/IG51bGxhYmxlVW5kZWZpbmVkSXNFbXB0eVByb3BlcnR5OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9lbnVtZXJhdGlvbl9iaW5kaW5nc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2JpbmRpbmdzX3Rlc3QuY2MKaW5kZXggNDE5MDY5Zi4uOWVkNWM3OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2JpbmRpbmdzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZW51bWVyYXRpb25faW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZW51bWVyYXRpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZW51bWVyYXRpb25faW50ZXJmYWNlLmgKaW5kZXggYzBjMTBlYS4uZTZjMGQxNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9lbnVtZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfRU5VTUVSQVRJT05fSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0VOVU1FUkFUSU9OX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZW51bWVyYXRpb25faW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNTZkZTU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2VudW1lcmF0aW9uX2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworZW51bSBUZXN0RW51bSB7CisgICJhbHBoYSIsCisgICJiZXRhIiwKKyAgImdhbW1hIgorfTsKKworW0NvbnN0cnVjdG9yXQoraW50ZXJmYWNlIEVudW1lcmF0aW9uSW50ZXJmYWNlIHsKKyAgYXR0cmlidXRlIFRlc3RFbnVtIGVudW1Qcm9wZXJ0eTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXZhbHVhdGVfc2NyaXB0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXZhbHVhdGVfc2NyaXB0X3Rlc3QuY2MKaW5kZXggNjFkNzRmYS4uZTIxNzUyZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V2YWx1YXRlX3NjcmlwdF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ldmFsdWF0ZV9zY3JpcHRfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCkBAIC02Myw3ICs2MSw4IEBACiAgICAgICAiICAgIHJldHVybiBmaWIobiAtIDEpICsgZmliKG4gLSAyKTtcbiIKICAgICAgICIgIH1cbiIKICAgICAgICJ9XG4iCi0gICAgICAiZmliKDgpIjsKKyAgICAgIC8vIEJveCB0aGUgcmVzdWx0IHNvIGl0IGNhbiBiZSByZXR1cm5lZCBuYXR1cmFsbHkgZnJvbSBhbiBvYmplY3QgcHJvcGVydHkuCisgICAgICAibmV3IE51bWJlcihmaWIoOCkpIjsKIAogICAvLyBDYWxsIHdpdGggbnVsbCBvdXQgaGFuZGxlLgogICBzY29wZWRfcmVmcHRyPFN0cmljdE1vY2s8QXJiaXRyYXJ5SW50ZXJmYWNlPiA+IGFyYml0cmFyeV9pbnRlcmZhY2VfbW9jaygKQEAgLTczLDEwICs3MiwxMCBAQAogICAvLyBDYWxsIHdpdGggbm9uLW51bGwsIGJ1dCB1bnNldCBvcHRpb25hbCBoYW5kbGUuCiAgIGJhc2U6Om9wdGlvbmFsPE9wYXF1ZUhhbmRsZUhvbGRlcjo6UmVmZXJlbmNlPiBvcGFxdWVfaGFuZGxlOwogICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdChzY3JpcHQsIGFyYml0cmFyeV9pbnRlcmZhY2VfbW9jaywgJm9wYXF1ZV9oYW5kbGUpKTsKLSAgQVNTRVJUX0ZBTFNFKG9wYXF1ZV9oYW5kbGUtPnJlZmVyZW5jZWRfb2JqZWN0KCkuSXNOdWxsKCkpOworICBBU1NFUlRfRkFMU0Uob3BhcXVlX2hhbmRsZS0+cmVmZXJlbmNlZF92YWx1ZSgpLklzTnVsbCgpKTsKIAogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgb2JqZWN0X3Byb3BlcnR5KCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCZvcGFxdWVfaGFuZGxlLT5yZWZlcmVuY2VkX29iamVjdCgpKSk7CisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCZvcGFxdWVfaGFuZGxlLT5yZWZlcmVuY2VkX3ZhbHVlKCkpKTsKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5vYmplY3RQcm9wZXJ0eSA9PSAyMTsiLCAmcmVzdWx0KSk7CiAgIEVYUEVDVF9TVFJFUSgidHJ1ZSIsIHJlc3VsdC5jX3N0cigpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25fb2JqZWN0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmgKaW5kZXggOWU5ZTM4ZS4uMjdhNzhkYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0VYQ0VQVElPTl9PQkpFQ1RfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0VYQ0VQVElPTl9PQkpFQ1RfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NzU5NjM2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbl9vYmplY3RfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorZXhjZXB0aW9uIEV4Y2VwdGlvbk9iamVjdEludGVyZmFjZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgZXJyb3I7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbWVzc2FnZTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uc19iaW5kaW5nc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfYmluZGluZ3NfdGVzdC5jYwppbmRleCA3MWVmNDM3Li4wOTJiN2IyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uc19iaW5kaW5nc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25zX2JpbmRpbmdzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKQEAgLTYxLDExICs1OSwxMiBAQAogICBzY29wZWRfcmVmcHRyPHNjcmlwdDo6U2NyaXB0RXhjZXB0aW9uPiBleGNlcHRpb25fb2JqZWN0XzsKIH07CiAKLXN0ZDo6c3RyaW5nIEdldEV4Y2VwdGlvbk1lc3NhZ2VTdHJpbmcoc2NyaXB0OjpNZXNzYWdlVHlwZSBtZXNzYWdlX3R5cGUsIC4uLikgeworc3RkOjpzdHJpbmcgR2V0RXhjZXB0aW9uTWVzc2FnZVN0cmluZygKKyAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlOjpNZXNzYWdlVHlwZVZhciBtZXNzYWdlX3R5cGUsIC4uLikgewogICB2YV9saXN0IGFyZ3VtZW50czsKICAgdmFfc3RhcnQoYXJndW1lbnRzLCBtZXNzYWdlX3R5cGUpOwotICBzdGQ6OnN0cmluZyBlcnJvcl9zdHJpbmcgPQotICAgICAgYmFzZTo6U3RyaW5nUHJpbnRWKEdldEV4Y2VwdGlvbk1lc3NhZ2VGb3JtYXQobWVzc2FnZV90eXBlKSwgYXJndW1lbnRzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3Jfc3RyaW5nID0gYmFzZTo6U3RyaW5nUHJpbnRWKAorICAgICAgR2V0RXhjZXB0aW9uTWVzc2FnZUZvcm1hdChtZXNzYWdlX3R5cGUudmFsdWUpLCBhcmd1bWVudHMpOwogICB2YV9lbmQoYXJndW1lbnRzKTsKICAgcmV0dXJuIGVycm9yX3N0cmluZzsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25zX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25zX2ludGVyZmFjZS5jYwppbmRleCA1NjZhY2M0Li5jNGM1MWVkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uc19pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leGNlcHRpb25zX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgKaW5kZXggYTM0MmUxZC4uMWM1ODdhOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0VYQ0VQVElPTlNfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0VYQ0VQVElPTlNfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXhjZXB0aW9uc19pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODkyYmRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorWworICBDb25zdHJ1Y3RvciwKKyAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yCitdCitpbnRlcmZhY2UgRXhjZXB0aW9uc0ludGVyZmFjZSB7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgZnVuY3Rpb25UaHJvd3NFeGNlcHRpb24oKTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIGJvb2xlYW4gYXR0cmlidXRlVGhyb3dzRXhjZXB0aW9uOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9hdHRyaWJ1dGVzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXh0ZW5kZWRfYXR0cmlidXRlc190ZXN0LmNjCmluZGV4IGU1ODdhMWYuLjU2NDQyMTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9hdHRyaWJ1dGVzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4dGVuZGVkX2F0dHJpYnV0ZXNfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaAppbmRleCA1Zjk0ODgxLi42ODkxMzA5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2V4dGVuZGVkX2lkbF9hdHRyaWJ1dGVzX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19FWFRFTkRFRF9JRExfQVRUUklCVVRFU19JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfRVhURU5ERURfSURMX0FUVFJJQlVURVNfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9leHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVjZjQ0NWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZXh0ZW5kZWRfaWRsX2F0dHJpYnV0ZXNfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlIHsKKyAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHZvaWQgY2FsbFdpdGhTZXR0aW5ncygpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdC5jYwppbmRleCAyYzk5MmE5Li4wM2E2MWU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuY2MKaW5kZXggNmY1MTVlYi4uMmJjMDE3NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmgKaW5kZXggZTBlMDU3MS4uYjk3NjA0MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nYXJiYWdlX2NvbGxlY3Rpb25fdGVzdF9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfR0FSQkFHRV9DT0xMRUNUSU9OX1RFU1RfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0dBUkJBR0VfQ09MTEVDVElPTl9URVNUX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2FyYmFnZV9jb2xsZWN0aW9uX3Rlc3RfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODA2MTAwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK1sKKyAgQ29uc3RydWN0b3IsCisgIC8vIFRoZSBoZWFkIG9mIHRoZSBsaXN0IGlzIHRoZSAib3BhcXVlIHJvb3QiIG9mIGFsbCBub2RlcyBpbiB0aGUgbGlzdC4KKyAgR2V0T3BhcXVlUm9vdD1HZXRIZWFkLAorXQoraW50ZXJmYWNlIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZSB7CisgIC8vIFRoaXMgaW50ZXJmYWNlIHJlcHJlc2VudHMgYSBzaW1wbGUgbGlua2VkLWxpc3QgaW1wbGVtZW50YXRpb24gdXNlZCBmb3IKKyAgLy8gdGVzdHMgYXJvdW5kIHJlYWNoYWJpbGl0eSBvZiBvYmplY3RzIGZyb20gb3BhcXVlIHJvb3RzLgorICBhdHRyaWJ1dGUgR2FyYmFnZUNvbGxlY3Rpb25UZXN0SW50ZXJmYWNlPyBwcmV2aW91czsKKyAgYXR0cmlidXRlIEdhcmJhZ2VDb2xsZWN0aW9uVGVzdEludGVyZmFjZT8gbmV4dDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaAppbmRleCBiOTZjNDVjLi40Yzc0YzNkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0dFVF9PUEFRVUVfUk9PVF9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfR0VUX09QQVFVRV9ST09UX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vcGFxdWVfcm9vdF9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkY2E1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gQ29uc3RydWN0b3IgYXR0cmlidXRlIGlzIGFkZGVkIGZvciB0ZXN0IHB1cnBvc2VzLgorWworICBDb25zdHJ1Y3RvciwKKyAgQWRkT3BhcXVlUm9vdHM9KGFkZF9vcGFxdWVfcm9vdF9mdW5jdGlvbl9uYW1lKSwKKyAgR2V0T3BhcXVlUm9vdD1nZXRfb3BhcXVlX3Jvb3RfZnVuY3Rpb25fbmFtZQorXQoraW50ZXJmYWNlIEdldE9wYXF1ZVJvb3RJbnRlcmZhY2Uge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X29wYXF1ZV9yb290X3Rlc3QuY2MKaW5kZXggZTYwZGI0Mi4uZTQ2YTExZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vcGFxdWVfcm9vdF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nZXRfb3BhcXVlX3Jvb3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nZXRfb3BhcXVlX3Jvb3RfaW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X293bl9wcm9wZXJ0eV9kZXNjcmlwdG9yLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldF9vd25fcHJvcGVydHlfZGVzY3JpcHRvci5jYwppbmRleCAxMDVlYmJkLi40MWRhN2ZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0X293bl9wcm9wZXJ0eV9kZXNjcmlwdG9yLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nZXRfb3duX3Byb3BlcnR5X2Rlc2NyaXB0b3IuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgpAQCAtNDMsNiArNDEsMjIgQEAKICAgRVhQRUNUX0VRKHJlc3VsdCwgIiIpOwogfQogCitURVNUX0YoR2V0T3duUHJvcGVydHlEZXNjcmlwdG9yVGVzdCwgR2V0UHJvcGVydHlEZXNjcmlwdG9yRnJvbVByb3RvdHlwZSkgeworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIEV2YWx1YXRlU2NyaXB0KAorICAgICAgInZhciBkZXNjcmlwdG9yID0gIgorICAgICAgIk9iamVjdC5nZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoQXJiaXRyYXJ5SW50ZXJmYWNlLnByb3RvdHlwZSwgIgorICAgICAgIlwiYXJiaXRyYXJ5UHJvcGVydHlcIikiLAorICAgICAgJnJlc3VsdCk7CisgIEVYUEVDVF9FUShyZXN1bHQsICJ1bmRlZmluZWQiKTsKKyAgRXZhbHVhdGVTY3JpcHQoImRlc2NyaXB0b3IuY29uZmlndXJhYmxlIiwgJnJlc3VsdCk7CisgIEVYUEVDVF9FUShyZXN1bHQsICJ0cnVlIik7CisgIEV2YWx1YXRlU2NyaXB0KCJkZXNjcmlwdG9yLmVudW1lcmFibGUiLCAmcmVzdWx0KTsKKyAgRVhQRUNUX0VRKHJlc3VsdCwgInRydWUiKTsKKyAgRXZhbHVhdGVTY3JpcHQoImRlc2NyaXB0b3IuX19wcm90b19fIiwgJnJlc3VsdCk7CisgIEVYUEVDVF9FUShyZXN1bHQsICJbb2JqZWN0IE9iamVjdF0iKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHRlc3RpbmcKIH0gIC8vIG5hbWVzcGFjZSBiaW5kaW5ncwogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldHRlcl9zZXR0ZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nZXR0ZXJfc2V0dGVyX3Rlc3QuY2MKaW5kZXggOTRmYTRiNi4uMWRiMjk2OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dldHRlcl9zZXR0ZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2V0dGVyX3NldHRlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oIgpAQCAtOTgsNiArOTYsMTUgQEAKICAgRVhQRUNUX1NUUkVRKCI2IiwgcmVzdWx0LmNfc3RyKCkpOwogfQogCitURVNUX0YoSW5kZXhlZEdldHRlckJpbmRpbmdzVGVzdCwgSW5kZXhJc093blByb3BlcnR5KSB7CisgIE9OX0NBTEwodGVzdF9tb2NrKCksIGxlbmd0aCgpKS5XaWxsQnlEZWZhdWx0KFJldHVybigxMCkpOworICBJblNlcXVlbmNlIGR1bW15OworCisgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuaGFzT3duUHJvcGVydHkoNCk7IiwgJnJlc3VsdCkpOworICBFWFBFQ1RfU1RSRVEoInRydWUiLCByZXN1bHQuY19zdHIoKSk7Cit9CisKIFRFU1RfRihJbmRleGVkR2V0dGVyQmluZGluZ3NUZXN0LCBJbmRleGVkR2V0dGVyT3V0T2ZSYW5nZSkgewogICBPTl9DQUxMKHRlc3RfbW9jaygpLCBsZW5ndGgoKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oMTApKTsKICAgT05fQ0FMTCh0ZXN0X21vY2soKSwgSW5kZXhlZEdldHRlcihfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm5Bcmc8MD4oKSk7CkBAIC0xNjgsNiArMTc1LDE2IEBACiAgIEVYUEVDVF9TVFJFUSgiZm9vIiwgcmVzdWx0LmNfc3RyKCkpOwogfQogCitURVNUX0YoTmFtZWRHZXR0ZXJCaW5kaW5nc1Rlc3QsIE5hbWVkUHJvcGVydHlJc093blByb3BlcnR5KSB7CisgIE9OX0NBTEwodGVzdF9tb2NrKCksIENhblF1ZXJ5TmFtZWRQcm9wZXJ0eShzdGQ6OnN0cmluZygiZm9vIikpKQorICAgICAgLldpbGxCeURlZmF1bHQoUmV0dXJuKHRydWUpKTsKKyAgSW5TZXF1ZW5jZSBkdW1teTsKKworICBzdGQ6OnN0cmluZyByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0Lmhhc093blByb3BlcnR5KFwiZm9vXCIpOyIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1NUUkVRKCJ0cnVlIiwgcmVzdWx0LmNfc3RyKCkpOworfQorCiBURVNUX0YoTmFtZWRHZXR0ZXJCaW5kaW5nc1Rlc3QsIE5hbWVkR2V0dGVyVW5zdXBwb3J0ZWROYW1lKSB7CiAgIE9OX0NBTEwodGVzdF9tb2NrKCksIENhblF1ZXJ5TmFtZWRQcm9wZXJ0eShfKSkuV2lsbEJ5RGVmYXVsdChSZXR1cm4oZmFsc2UpKTsKICAgSW5TZXF1ZW5jZSBkdW1teTsKQEAgLTI1Niw2ICsyNzMsNyBAQAogICBPTl9DQUxMKHRlc3RfbW9jaygpLCBFbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoXykpCiAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoCiAgICAgICAgICAgJmVudW1lcmF0b3IsICZOYW1lZFByb3BlcnRpZXNFbnVtZXJhdG9yOjpFbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMpKTsKKyAgT05fQ0FMTCh0ZXN0X21vY2soKSwgQ2FuUXVlcnlOYW1lZFByb3BlcnR5KF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7CiAKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICBFWFBFQ1RfVFJVRSgKQEAgLTMwNyw2ICszMjUsNyBAQAogICBPTl9DQUxMKHRlc3RfbW9jaygpLCBFbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMoXykpCiAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2UoCiAgICAgICAgICAgJmVudW1lcmF0b3IsICZOYW1lZFByb3BlcnRpZXNFbnVtZXJhdG9yOjpFbnVtZXJhdGVOYW1lZFByb3BlcnRpZXMpKTsKKyAgT05fQ0FMTCh0ZXN0X21vY2soKSwgQ2FuUXVlcnlOYW1lZFByb3BlcnR5KF8pKS5XaWxsQnlEZWZhdWx0KFJldHVybih0cnVlKSk7CiAKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogICBFWFBFQ1RfVFJVRSgKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nbG9iYWxfaW50ZXJmYWNlX2JpbmRpbmdzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2xvYmFsX2ludGVyZmFjZV9iaW5kaW5nc190ZXN0LmNjCmluZGV4IDVmNTBkNjEuLjRjOWFjNTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nbG9iYWxfaW50ZXJmYWNlX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dsb2JhbF9pbnRlcmZhY2VfYmluZGluZ3NfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2dsb2JhbF9pbnRlcmZhY2VfcGFyZW50LmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaAppbmRleCBmYTFmN2Y3Li41ZjQ2ZmFmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfR0xPQkFMX0lOVEVSRkFDRV9QQVJFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfR0xPQkFMX0lOVEVSRkFDRV9QQVJFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9nbG9iYWxfaW50ZXJmYWNlX3BhcmVudC5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxOTZiMmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaWRsCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitpbnRlcmZhY2UgR2xvYmFsSW50ZXJmYWNlUGFyZW50IHsKKyAgdm9pZCBwYXJlbnRPcGVyYXRpb24oKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW1wbGVtZW50ZWRfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbXBsZW1lbnRlZF9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3ZWE2ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW1wbGVtZW50ZWRfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgSW1wbGVtZW50ZWRJbnRlcmZhY2UgeworICB2b2lkIGltcGxlbWVudGVkSW50ZXJmYWNlRnVuY3Rpb24oKTsKK307CitUYXJnZXRJbnRlcmZhY2UgaW1wbGVtZW50cyBJbXBsZW1lbnRlZEludGVyZmFjZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaAppbmRleCA1OTc5ZThmLi42YTdlYjFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19JTkRFWEVEX0dFVFRFUl9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfSU5ERVhFRF9HRVRURVJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE3MDY1OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgSW5kZXhlZEdldHRlckludGVyZmFjZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIHVuc2lnbmVkIGxvbmcgaW5kZXhlZEdldHRlcih1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgc2V0dGVyIHZvaWQgaW5kZXhlZFNldHRlcih1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKKyAgZGVsZXRlciB2b2lkIGluZGV4ZWREZWxldGVyKHVuc2lnbmVkIGxvbmcgaW5kZXgpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbnRlcmZhY2Vfb2JqZWN0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW50ZXJmYWNlX29iamVjdF90ZXN0LmNjCmluZGV4IDQ4MTA2Y2MuLjE5ZTYxMjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbnRlcmZhY2Vfb2JqZWN0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV9vYmplY3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaAppbmRleCAxNTEzYTIzLi4zMGFhNTcyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9pbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX0lOVEVSRkFDRV9XSVRIX1VOU1VQUE9SVEVEX1BST1BFUlRJRVNfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfSU5URVJGQUNFX1dJVEhfVU5TVVBQT1JURURfUFJPUEVSVElFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2MjUyZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5pZGwKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEludGVyZmFjZVdpdGhVbnN1cHBvcnRlZFByb3BlcnRpZXMgeworICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBzdXBwb3J0ZWRBdHRyaWJ1dGU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXNfcGFydGlhbC5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllc19wYXJ0aWFsLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGZjMWI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXNfcGFydGlhbC5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworcGFydGlhbCBpbnRlcmZhY2UgSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcyB7CisgIFtOb3RTdXBwb3J0ZWRdIGNvbnN0IGxvbmcgVU5TVVBQT1JURURfQ09OU1RBTlQgPSAwOworICBbTm90U3VwcG9ydGVkXSBhdHRyaWJ1dGUgbG9uZyB1bnN1cHBvcnRlZEF0dHJpYnV0ZTsKKyAgW05vdFN1cHBvcnRlZF0gdm9pZCB1bnN1cHBvcnRlZE9wZXJhdGlvbigpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmNjCmluZGV4IDlkMDA2MzEuLjQwMjAzMzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCmluZGV4IDU2Y2ZlMjYuLmQ2Y2VjNmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX05BTUVEX0NPTlNUUlVDVE9SX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19OQU1FRF9DT05TVFJVQ1RPUl9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmI2N2U0NgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1sKKyAgTmFtZWRDb25zdHJ1Y3Rvcj1Tb21lTmFtZWRDb25zdHJ1Y3RvcigpLAorXQoraW50ZXJmYWNlIE5hbWVkQ29uc3RydWN0b3JJbnRlcmZhY2UgeworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5oCmluZGV4IDE3OTY5OWYuLmViNDgxY2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfTkFNRURfR0VUVEVSX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19OQU1FRF9HRVRURVJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA5NDM5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgTmFtZWRHZXR0ZXJJbnRlcmZhY2UgeworICBnZXR0ZXIgRE9NU3RyaW5nIG5hbWVkR2V0dGVyKERPTVN0cmluZyBuYW1lKTsKKyAgc2V0dGVyIHZvaWQgbmFtZWRTZXR0ZXIoRE9NU3RyaW5nIG5hbWUsIERPTVN0cmluZyB2YWx1ZSk7CisgIGRlbGV0ZXIgdm9pZCBuYW1lZERlbGV0ZXIoRE9NU3RyaW5nIG5hbWUpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaAppbmRleCAwZTQxNmVhLi4wYzQ1NmYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25hbWVkX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19OQU1FRF9JTkRFWEVEX0dFVFRFUl9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfTkFNRURfSU5ERVhFRF9HRVRURVJfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAyYzVkMzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmFtZWRfaW5kZXhlZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgTmFtZWRJbmRleGVkR2V0dGVySW50ZXJmYWNlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBnZXR0ZXIgdW5zaWduZWQgbG9uZyBpbmRleGVkR2V0dGVyKHVuc2lnbmVkIGxvbmcgaW5kZXgpOworICBzZXR0ZXIgdm9pZCBpbmRleGVkU2V0dGVyKHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworICBnZXR0ZXIgRE9NU3RyaW5nIG5hbWVkR2V0dGVyKERPTVN0cmluZyBuYW1lKTsKKyAgc2V0dGVyIHZvaWQgbmFtZWRTZXR0ZXIoRE9NU3RyaW5nIG5hbWUsIERPTVN0cmluZyB2YWx1ZSk7CisKKyAgLy8gRGVyaXZlZEdldHRlclNldHRlckludGVyZmFjZSBpbmhlcml0cyBmcm9tIHRoaXMgY2xhc3MuCisgIC8vIFRoZXNlIHByb3BlcnRpZXMgYXJlIHVzZWQgdG8gY2hlY2sgdGhhdCBuYW1lZCBnZXR0ZXJzL3NldHRlcnMgZG8gbm90CisgIC8vIG92ZXJyaWRlIHRoZXNlIHByb3BlcnRpZXMKKyAgYXR0cmlidXRlIGJvb2xlYW4gcHJvcGVydHlPbkJhc2VDbGFzczsKKyAgdm9pZCBvcGVyYXRpb25PbkJhc2VDbGFzcygpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9uZXN0ZWRfcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgKaW5kZXggYWM3NGQ0ZS4uMzJiZGM5OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX05FU1RFRF9QVVRfRk9SV0FSRFNfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX05FU1RFRF9QVVRfRk9SV0FSRFNfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbmVzdGVkX3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjA5ZDE4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoraW50ZXJmYWNlIE5lc3RlZFB1dEZvcndhcmRzSW50ZXJmYWNlIHsKKyAgW1B1dEZvcndhcmRzPWZvcndhcmRpbmdBdHRyaWJ1dGVdCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBQdXRGb3J3YXJkc0ludGVyZmFjZSBuZXN0ZWRGb3J3YXJkaW5nQXR0cmlidXRlOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaAppbmRleCA4ZTljNjUxLi42MzkzMmFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25vX2NvbnN0cnVjdG9yX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19OT19DT05TVFJVQ1RPUl9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfTk9fQ09OU1RSVUNUT1JfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3Y2RmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9fY29uc3RydWN0b3JfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgTm9Db25zdHJ1Y3RvckludGVyZmFjZSB7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaAppbmRleCBlMWU2NGFmLi5jNDIwMTI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfTk9fSU5URVJGQUNFX09CSkVDVF9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfTk9fSU5URVJGQUNFX09CSkVDVF9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9ub19pbnRlcmZhY2Vfb2JqZWN0X2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyN2IxZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvbm9faW50ZXJmYWNlX29iamVjdF9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTYgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitbTm9JbnRlcmZhY2VPYmplY3RdCitpbnRlcmZhY2UgTm9JbnRlcmZhY2VPYmplY3RJbnRlcmZhY2UgeworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udWxsYWJsZV90eXBlc19iaW5kaW5nc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX2JpbmRpbmdzX3Rlc3QuY2MKaW5kZXggOWI3MzFiMC4uMDllMGFiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX2JpbmRpbmdzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgKaW5kZXggMTYzZjU4Ni4uOTZjOWNlMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX05VTExBQkxFX1RZUEVTX1RFU1RfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX05VTExBQkxFX1RZUEVTX1RFU1RfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVsbGFibGVfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MmIzNGI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bGxhYmxlX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgTnVsbGFibGVUeXBlc1Rlc3RJbnRlcmZhY2UgeworICBhdHRyaWJ1dGUgYm9vbGVhbj8gbnVsbGFibGVCb29sZWFuUHJvcGVydHk7CisgIGF0dHJpYnV0ZSBsb25nPyBudWxsYWJsZU51bWVyaWNQcm9wZXJ0eTsKKyAgYXR0cmlidXRlIERPTVN0cmluZz8gbnVsbGFibGVTdHJpbmdQcm9wZXJ0eTsKKyAgYXR0cmlidXRlIEFyYml0cmFyeUludGVyZmFjZT8gbnVsbGFibGVPYmplY3RQcm9wZXJ0eTsKKworICBib29sZWFuPyBudWxsYWJsZUJvb2xlYW5PcGVyYXRpb24oKTsKKyAgbG9uZz8gbnVsbGFibGVOdW1lcmljT3BlcmF0aW9uKCk7CisgIERPTVN0cmluZz8gbnVsbGFibGVTdHJpbmdPcGVyYXRpb24oKTsKKyAgQXJiaXRyYXJ5SW50ZXJmYWNlPyBudWxsYWJsZU9iamVjdE9wZXJhdGlvbigpOworCisgIHZvaWQgbnVsbGFibGVCb29sZWFuQXJndW1lbnQoYm9vbGVhbj8gYXJnKTsKKyAgdm9pZCBudWxsYWJsZU51bWVyaWNBcmd1bWVudChsb25nPyBhcmcpOworICB2b2lkIG51bGxhYmxlU3RyaW5nQXJndW1lbnQoRE9NU3RyaW5nPyBhcmcpOworICB2b2lkIG51bGxhYmxlT2JqZWN0QXJndW1lbnQoQXJiaXRyYXJ5SW50ZXJmYWNlPyBhcmcpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVfYmluZGluZ3NfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVfYmluZGluZ3NfdGVzdC5jYwppbmRleCBhYjA1NDZhLi44NDhjNmJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVtZXJpY190eXBlX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZV9iaW5kaW5nc190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPGNtYXRoPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaAppbmRleCA1NzMwNjYyLi4yYTVjZjI1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9udW1lcmljX3R5cGVzX3Rlc3RfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX05VTUVSSUNfVFlQRVNfVEVTVF9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfTlVNRVJJQ19UWVBFU19URVNUX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL251bWVyaWNfdHlwZXNfdGVzdF9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRjMmUwMzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIE51bWVyaWNUeXBlc1Rlc3RJbnRlcmZhY2UgeworICBieXRlIGJ5dGVSZXR1cm5PcGVyYXRpb24oKTsKKyAgdm9pZCBieXRlQXJndW1lbnRPcGVyYXRpb24oYnl0ZSBhcmcxKTsKKyAgYXR0cmlidXRlIGJ5dGUgYnl0ZVByb3BlcnR5OworCisgIG9jdGV0IG9jdGV0UmV0dXJuT3BlcmF0aW9uKCk7CisgIHZvaWQgb2N0ZXRBcmd1bWVudE9wZXJhdGlvbihvY3RldCBhcmcxKTsKKyAgYXR0cmlidXRlIG9jdGV0IG9jdGV0UHJvcGVydHk7CisKKyAgc2hvcnQgc2hvcnRSZXR1cm5PcGVyYXRpb24oKTsKKyAgdm9pZCBzaG9ydEFyZ3VtZW50T3BlcmF0aW9uKHNob3J0IGFyZzEpOworICBhdHRyaWJ1dGUgc2hvcnQgc2hvcnRQcm9wZXJ0eTsKKworICB1bnNpZ25lZCBzaG9ydCB1bnNpZ25lZFNob3J0UmV0dXJuT3BlcmF0aW9uKCk7CisgIHZvaWQgdW5zaWduZWRTaG9ydEFyZ3VtZW50T3BlcmF0aW9uKHVuc2lnbmVkIHNob3J0IGFyZzEpOworICBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgdW5zaWduZWRTaG9ydFByb3BlcnR5OworCisgIGxvbmcgbG9uZ1JldHVybk9wZXJhdGlvbigpOworICB2b2lkIGxvbmdBcmd1bWVudE9wZXJhdGlvbihsb25nIGFyZzEpOworICBhdHRyaWJ1dGUgbG9uZyBsb25nUHJvcGVydHk7CisKKyAgdW5zaWduZWQgbG9uZyB1bnNpZ25lZExvbmdSZXR1cm5PcGVyYXRpb24oKTsKKyAgdm9pZCB1bnNpZ25lZExvbmdBcmd1bWVudE9wZXJhdGlvbih1bnNpZ25lZCBsb25nIGFyZzEpOworICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB1bnNpZ25lZExvbmdQcm9wZXJ0eTsKKworICBsb25nIGxvbmcgbG9uZ0xvbmdSZXR1cm5PcGVyYXRpb24oKTsKKyAgdm9pZCBsb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKGxvbmcgbG9uZyBhcmcxKTsKKyAgYXR0cmlidXRlIGxvbmcgbG9uZyBsb25nTG9uZ1Byb3BlcnR5OworCisgIHVuc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZExvbmdMb25nUmV0dXJuT3BlcmF0aW9uKCk7CisgIHZvaWQgdW5zaWduZWRMb25nTG9uZ0FyZ3VtZW50T3BlcmF0aW9uKHVuc2lnbmVkIGxvbmcgbG9uZyBhcmcxKTsKKyAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbG9uZyB1bnNpZ25lZExvbmdMb25nUHJvcGVydHk7CisKKyAgZG91YmxlIGRvdWJsZVJldHVybk9wZXJhdGlvbigpOworICB2b2lkIGRvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKGRvdWJsZSBhcmcxKTsKKyAgYXR0cmlidXRlIGRvdWJsZSBkb3VibGVQcm9wZXJ0eTsKKworICB1bnJlc3RyaWN0ZWQgZG91YmxlIHVucmVzdHJpY3RlZERvdWJsZVJldHVybk9wZXJhdGlvbigpOworICB2b2lkIHVucmVzdHJpY3RlZERvdWJsZUFyZ3VtZW50T3BlcmF0aW9uKHVucmVzdHJpY3RlZCBkb3VibGUgYXJnMSk7CisgIGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIHVucmVzdHJpY3RlZERvdWJsZVByb3BlcnR5OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaAppbmRleCBiNzBmNGNhLi4yM2ExY2QyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29iamVjdF90eXBlX2JpbmRpbmdzX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19PQkpFQ1RfVFlQRV9CSU5ESU5HU19JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfT0JKRUNUX1RZUEVfQklORElOR1NfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vYmplY3RfdHlwZV9iaW5kaW5nc19pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmYWU4ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlIHsKKyAgYXR0cmlidXRlIEFyYml0cmFyeUludGVyZmFjZSBhcmJpdHJhcnlPYmplY3Q7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBCYXNlSW50ZXJmYWNlIGJhc2VJbnRlcmZhY2U7CisgIGF0dHJpYnV0ZSBEZXJpdmVkSW50ZXJmYWNlIGRlcml2ZWRJbnRlcmZhY2U7CisgIGF0dHJpYnV0ZSBvYmplY3Q/IG9iamVjdFByb3BlcnR5OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vYmplY3RfdHlwZV9iaW5kaW5nc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29iamVjdF90eXBlX2JpbmRpbmdzX3Rlc3QuY2MKaW5kZXggZTRmNjJkOC4uYTY4OTJiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29iamVjdF90eXBlX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29iamVjdF90eXBlX2JpbmRpbmdzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmFzZV9pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKQEAgLTIwMSw3ICsxOTksNyBAQAogCiAgIC8vIFJldHVybiBpdCBiYWNrIHRvIEpTIGFzIHRoZSBvcmlnaW5hbCB0eXBlLgogICBFWFBFQ1RfQ0FMTCh0ZXN0X21vY2soKSwgb2JqZWN0X3Byb3BlcnR5KCkpCi0gICAgICAuV2lsbE9uY2UoUmV0dXJuKCZvYmplY3Rfb3duZXIucmVmZXJlbmNlKCkucmVmZXJlbmNlZF9vYmplY3QoKSkpOworICAgICAgLldpbGxPbmNlKFJldHVybigmb2JqZWN0X293bmVyLnJlZmVyZW5jZSgpLnJlZmVyZW5jZWRfdmFsdWUoKSkpOwogICBFWFBFQ1RfVFJVRSgKICAgICAgIEV2YWx1YXRlU2NyaXB0KCJPYmplY3QuZ2V0UHJvdG90eXBlT2YodGVzdC5vYmplY3RQcm9wZXJ0eSkgPT09ICIKICAgICAgICAgICAgICAgICAgICAgICJBcmJpdHJhcnlJbnRlcmZhY2UucHJvdG90eXBlOyIsCkBAIC0yMTksNyArMjE3LDcgQEAKICAgQVNTRVJUX1RSVUUob2JqZWN0X293bmVyLklzU2V0KCkpOwogCiAgIEVYUEVDVF9DQUxMKHRlc3RfbW9jaygpLCBvYmplY3RfcHJvcGVydHkoKSkKLSAgICAgIC5XaWxsT25jZShSZXR1cm4oJm9iamVjdF9vd25lci5yZWZlcmVuY2UoKS5yZWZlcmVuY2VkX29iamVjdCgpKSk7CisgICAgICAuV2lsbE9uY2UoUmV0dXJuKCZvYmplY3Rfb3duZXIucmVmZXJlbmNlKCkucmVmZXJlbmNlZF92YWx1ZSgpKSk7CiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0Lm9iamVjdFByb3BlcnR5ID09PSBvYmo7IiwgTlVMTCkpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc19iaW5kaW5nc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29wZXJhdGlvbnNfYmluZGluZ3NfdGVzdC5jYwppbmRleCBhODc1YzQ1Li4xOTczZGVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc19iaW5kaW5nc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX2JpbmRpbmdzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYXJiaXRyYXJ5X2ludGVyZmFjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29wZXJhdGlvbnNfdGVzdF9pbnRlcmZhY2UuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5jYwppbmRleCBkYTI1OTEzLi4wZGE0NzFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5oCmluZGV4IDA1YjRlN2UuLjBlMjIzYmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29wZXJhdGlvbnNfdGVzdF9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfT1BFUkFUSU9OU19URVNUX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19PUEVSQVRJT05TX1RFU1RfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3BlcmF0aW9uc190ZXN0X2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDhiNWI4YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDQ2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgT3BlcmF0aW9uc1Rlc3RJbnRlcmZhY2UgeworICB2b2lkIHZvaWRGdW5jdGlvbk5vQXJncygpOworICBET01TdHJpbmcgc3RyaW5nRnVuY3Rpb25Ob0FyZ3MoKTsKKyAgbG9uZyBsb25nRnVuY3Rpb25Ob0FyZ3MoKTsKKyAgQXJiaXRyYXJ5SW50ZXJmYWNlIG9iamVjdEZ1bmN0aW9uTm9BcmdzKCk7CisgIHZvaWQgdm9pZEZ1bmN0aW9uU3RyaW5nQXJnKERPTVN0cmluZyBhcmcpOworICB2b2lkIHZvaWRGdW5jdGlvbkxvbmdBcmcobG9uZyBhcmcpOworICB2b2lkIHZvaWRGdW5jdGlvbk9iamVjdEFyZyhBcmJpdHJhcnlJbnRlcmZhY2UgYXJnKTsKKyAgdm9pZCBvcHRpb25hbEFyZ3VtZW50cyhsb25nIGFyZzEsIG9wdGlvbmFsIGxvbmcgYXJnMiwgb3B0aW9uYWwgbG9uZyBhcmczKTsKKyAgdm9pZCBvcHRpb25hbEFyZ3VtZW50V2l0aERlZmF1bHQob3B0aW9uYWwgZG91YmxlIGFyZzEgPSAyLjcxOCk7CisgIHZvaWQgb3B0aW9uYWxOdWxsYWJsZUFyZ3VtZW50c1dpdGhEZWZhdWx0cygKKyAgICAgIG9wdGlvbmFsIGJvb2xlYW4/IGFyZzEgPSBudWxsLAorICAgICAgb3B0aW9uYWwgQXJiaXRyYXJ5SW50ZXJmYWNlPyBhcmcyID0gbnVsbCk7CisKKyAgdm9pZCB2YXJpYWRpY1ByaW1pdGl2ZUFyZ3VtZW50cyhsb25nLi4uIGJvb2xzKTsKKyAgdm9pZCB2YXJpYWRpY1N0cmluZ0FyZ3VtZW50c0FmdGVyT3B0aW9uYWxBcmd1bWVudCgKKyAgICAgIG9wdGlvbmFsIGJvb2xlYW4gb3B0aW9uYWxfYXJnLCBET01TdHJpbmcuLi4gc3RyaW5ncyk7CisKKyAgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24oKTsKKyAgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24obG9uZyBhcmcpOworICB2b2lkIG92ZXJsb2FkZWRGdW5jdGlvbihET01TdHJpbmcgYXJnKTsKKyAgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24obG9uZyBhcmcxLCBsb25nIGFyZzIsIGxvbmcgYXJnMyk7CisgIHZvaWQgb3ZlcmxvYWRlZEZ1bmN0aW9uKGxvbmcgYXJnMSwgbG9uZyBhcmcyLCBBcmJpdHJhcnlJbnRlcmZhY2UgYXJnMyk7CisKKyAgLy8gZG91YmxlIGFuZCBsb25nIGFyZSBub3QgZGlzdGluZ3Vpc2hhYmxlLCBidXQgYmVjYXVzZSB0aGlzIGlzIGEgc3RhdGljCisgIC8vIGZ1bmN0aW9uIGl0IGlzIHBhcnQgb2YgdGhlIHNhbWUgb3ZlcmxvYWQgc2V0IGFzIHRoZSBvbmUgdGhhdCB0YWtlcyBsb25nLgorICBzdGF0aWMgdm9pZCBvdmVybG9hZGVkRnVuY3Rpb24oZG91YmxlIGFyZyk7CisgIHN0YXRpYyB2b2lkIG92ZXJsb2FkZWRGdW5jdGlvbihkb3VibGUgYXJnMSwgZG91YmxlIGFyZzIpOworCisgIHZvaWQgb3ZlcmxvYWRlZE51bGxhYmxlKGxvbmcgYXJnKTsKKyAgdm9pZCBvdmVybG9hZGVkTnVsbGFibGUoYm9vbGVhbj8gYXJnKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3B0aW9uYWxfYXJndW1lbnRzX2JpbmRpbmdzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvb3B0aW9uYWxfYXJndW1lbnRzX2JpbmRpbmdzX3Rlc3QuY2MKaW5kZXggYmI4Yzc5Zi4uZjVkM2NjZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL29wdGlvbmFsX2FyZ3VtZW50c19iaW5kaW5nc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9vcHRpb25hbF9hcmd1bWVudHNfYmluZGluZ3NfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcGFydGlhbF9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3BhcnRpYWxfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MzBhZjgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3BhcnRpYWxfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitwYXJ0aWFsIGludGVyZmFjZSBUYXJnZXRJbnRlcmZhY2UgeworICB2b2lkIHBhcnRpYWxJbnRlcmZhY2VGdW5jdGlvbigpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuY2MKaW5kZXggY2ZlODJiMS4uMzdmY2Y3YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaAppbmRleCBhOTFlZjE5Li42NDdlMjcwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1BVVF9GT1JXQVJEU19JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfUFVUX0ZPUldBUkRTX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc19pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlZmFjZDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KK2ludGVyZmFjZSBQdXRGb3J3YXJkc0ludGVyZmFjZSB7CisgIFtQdXRGb3J3YXJkcz1hcmJpdHJhcnlQcm9wZXJ0eV0KKyAgcmVhZG9ubHkgYXR0cmlidXRlIEFyYml0cmFyeUludGVyZmFjZSBmb3J3YXJkaW5nQXR0cmlidXRlOworICBbUHV0Rm9yd2FyZHM9YXJiaXRyYXJ5UHJvcGVydHldCisgIHN0YXRpYyByZWFkb25seSBhdHRyaWJ1dGUgQXJiaXRyYXJ5SW50ZXJmYWNlIHN0YXRpY0ZvcndhcmRpbmdBdHRyaWJ1dGU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3B1dF9mb3J3YXJkc190ZXN0LmNjCmluZGV4IGM5ZDEzNTkuLjVkZGQ4YTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9wdXRfZm9yd2FyZHNfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvcHV0X2ZvcndhcmRzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9hcmJpdHJhcnlfaW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2NyaXB0X29iamVjdF9vd25lci5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NjcmlwdF9vYmplY3Rfb3duZXIuaAppbmRleCAwYmYzMzJlLi5jOWQ0ZjE4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2NyaXB0X29iamVjdF9vd25lci5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zY3JpcHRfb2JqZWN0X293bmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1NDUklQVF9PQkpFQ1RfT1dORVJfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfU0NSSVBUX09CSkVDVF9PV05FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcXVlbmNlX2JpbmRpbmdzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VxdWVuY2VfYmluZGluZ3NfdGVzdC5jYwppbmRleCA0MGZhZThhLi5mNTUyOGYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VxdWVuY2VfYmluZGluZ3NfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VxdWVuY2VfYmluZGluZ3NfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKIApAQCAtMzUsOCArMzMsMTAgQEAKIFRFU1RfRihTZXF1ZW5jZUJpbmRpbmdzVGVzdCwgSW50ZXJmYWNlU2VxdWVuY2UpIHsKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwogCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlKFtdKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldEludGVyZmFjZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoCkBAIC00NCw0NyArNDQsNTkgQEAKICAgICAgICAgICAgICAgICAgICAgICIgICAgWyBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCksICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgICBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCksICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgICBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCldKSIsCi0gICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldEludGVyZmFjZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoCiAgICAgICAiW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdLFtvYmplY3QgQXJiaXRyYXJ5SW50ZXJmYWNlXSwiCiAgICAgICAiW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdIiwKICAgICAgIHJlc3VsdC5jX3N0cigpKTsKIAotICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2UoNykiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZSg3KSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAotICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2UodW5kZWZpbmVkKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlKHVuZGVmaW5lZCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlKG51bGwpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2UobnVsbCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlKFsxXSkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZShbMV0pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCi0gIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZShbJ29uZSddKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlKFsnb25lJ10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIEVYUEVDVF9GQUxTRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlKFtuZXcgT2JqZWN0KCldKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlKFtuZXcgT2JqZWN0KCldKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoCi0gICAgICAidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZShbbmV3IEJhc2VJbnRlcmZhY2UoKV0pIiwgJnJlc3VsdCkpOworICAgICAgInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2UoW25ldyBCYXNlSW50ZXJmYWNlKCldKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICAvLyBBZnRlciBhbGwgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHVuY2hhbmdlZCwgYmVjYXVzZSB0aGUgZnVuY3Rpb24gd29uJ3QgYmUKICAgLy8gY2FsbGVkLgotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0sW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdLCIKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0iLAogICAgICAgcmVzdWx0LmNfc3RyKCkpOwogCiAgIC8vIFdlIHNob3VsZCBiZSBhYmxlIHRvIGNsZWFyIGl0IG91dCB0aGlzIHdheS4KLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZShbXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIH0KIApAQCAtOTIsOSArMTA0LDExIEBACiAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKIAogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZShbXSkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIAogICBFWFBFQ1RfVFJVRSgKQEAgLTEwMiwxNyArMTE2LDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAiICAgIFtbWyBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCksICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIG5ldyBBcmJpdHJhcnlJbnRlcmZhY2UoKSwgIgogICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgbmV3IEFyYml0cmFyeUludGVyZmFjZSgpIF1dXSkiLAotICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoCiAgICAgICAiW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdLFtvYmplY3QgQXJiaXRyYXJ5SW50ZXJmYWNlXSwiCiAgICAgICAiW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdIiwKICAgICAgIHJlc3VsdC5jX3N0cigpKTsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKFtdKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoCkBAIC0xMjAsMTcgKzEzOCwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgIiAgICBbW1sgbmV3IEFyYml0cmFyeUludGVyZmFjZSgpIF0sICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgICBbIG5ldyBBcmJpdHJhcnlJbnRlcmZhY2UoKSBdLCAiCiAgICAgICAgICAgICAgICAgICAgICAiICAgICAgWyBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCkgXV1dKSIsCi0gICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0sW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdLCIKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0iLAogICAgICAgcmVzdWx0LmNfc3RyKCkpOwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZShbXSkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIAogICBFWFBFQ1RfVFJVRSgKQEAgLTEzOCwxNyArMTYwLDIxIEBACiAgICAgICAgICAgICAgICAgICAgICAiICAgIFtbWyBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCksICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgIG5ldyBBcmJpdHJhcnlJbnRlcmZhY2UoKSBdLCAiCiAgICAgICAgICAgICAgICAgICAgICAiICAgICAgWyBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCkgXV1dKSIsCi0gICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0sW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdLCIKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0iLAogICAgICAgcmVzdWx0LmNfc3RyKCkpOwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZShbXSkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIAogICBFWFBFQ1RfVFJVRSgKQEAgLTE1Niw0NyArMTgyLDU3IEBACiAgICAgICAgICAgICAgICAgICAgICAiICAgIFtbWyBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCkgXV0sICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgIFtbIG5ldyBBcmJpdHJhcnlJbnRlcmZhY2UoKSBdLCAiCiAgICAgICAgICAgICAgICAgICAgICAiICAgICAgWyBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCkgXV1dKSIsCi0gICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0sW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdLCIKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0iLAogICAgICAgcmVzdWx0LmNfc3RyKCkpOwogCiAgIEVYUEVDVF9GQUxTRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSg3KSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSg3KSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoCi0gICAgICAidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UodW5kZWZpbmVkKSIsICZyZXN1bHQpKTsKKyAgICAgICJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSh1bmRlZmluZWQpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UobnVsbCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoWzFdKSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKICAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KAotICAgICAgInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKFsnb25lJ10pIiwgJnJlc3VsdCkpOworICAgICAgInRlc3Quc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKFsnb25lJ10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgKLSAgICAgICJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZShbbmV3IE9iamVjdCgpXSkiLCAmcmVzdWx0KSk7CisgICAgICAidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoW25ldyBPYmplY3QoKV0pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgKICAgICAgICJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZShbbmV3IEJhc2VJbnRlcmZhY2UoKV0pIiwKLSAgICAgICZyZXN1bHQpKTsKKyAgICAgICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICAvLyBBZnRlciBhbGwgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHVuY2hhbmdlZCwgYmVjYXVzZSB0aGUgZnVuY3Rpb24gd29uJ3QgYmUKICAgLy8gY2FsbGVkLgogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKAogICAgICAgIltvYmplY3QgQXJiaXRyYXJ5SW50ZXJmYWNlXSxbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0sIgogICAgICAgIltvYmplY3QgQXJiaXRyYXJ5SW50ZXJmYWNlXSIsCkBAIC0yMDQsMjQ1ICsyNDAsMzI3IEBACiAKICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gY2xlYXIgaXQgb3V0IHRoaXMgd2F5LgogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZShbXSkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRJbnRlcmZhY2VTZXF1ZW5jZVNlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIH0KIAogVEVTVF9GKFNlcXVlbmNlQmluZGluZ3NUZXN0LCBMb25nU2VxdWVuY2UpIHsKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRMb25nU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0TG9uZ1NlcXVlbmNlKFtdKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRMb25nU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIAotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoWzk5LCA4OCwgNzddKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0TG9uZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldExvbmdTZXF1ZW5jZShbOTksIDg4LCA3N10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldExvbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiOTksODgsNzciLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoWzUwMCwgMTAwMCwgMTAwMDBdKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0TG9uZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoWzUwMCwgMTAwMCwgMTAwMDBdKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRMb25nU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIjUwMCwxMDAwLDEwMDAwIiwgcmVzdWx0LmNfc3RyKCkpOwogCi0gIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoNykiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoNykiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldExvbmdTZXF1ZW5jZSh1bmRlZmluZWQpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0TG9uZ1NlcXVlbmNlKHVuZGVmaW5lZCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldExvbmdTZXF1ZW5jZShudWxsKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldExvbmdTZXF1ZW5jZShudWxsKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICAvLyBBZnRlciBhbGwgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHVuY2hhbmdlZC4KLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0TG9uZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldExvbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiNTAwLDEwMDAsMTAwMDAiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgLy8gVGhpcyBpcyB0cnVlIGJlY2F1c2UgYSBzdHJpbmcgY29lcmNlcyBpbnRvIGEgbnVtYmVyLgotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoWyczMjEnXSkiLCAmcmVzdWx0KSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldExvbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoWyczMjEnXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0TG9uZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIzMjEiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgLy8gV2Ugc2hvdWxkIGJlIGFibGUgdG8gY2xlYXIgaXQgb3V0IHRoaXMgd2F5LgotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRMb25nU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRMb25nU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0TG9uZ1NlcXVlbmNlKFtdKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRMb25nU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIH0KIAogVEVTVF9GKFNlcXVlbmNlQmluZGluZ3NUZXN0LCBTdHJpbmdTZXF1ZW5jZSkgewogICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlKFtdKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0U3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIiLCByZXN1bHQuY19zdHIoKSk7CiAKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoWydhJ10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShbJ2EnXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0U3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoImEiLCByZXN1bHQuY19zdHIoKSk7CiAKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoWydhJywgJ2InXSkiLCAmcmVzdWx0KSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlKFsnYScsICdiJ10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCJhLGIiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShbJ2EnLCAnYicsICdjJ10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoWydhJywgJ2InLCAnYyddKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiYSxiLGMiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShbJyEnLCAnQCcsICcjJ10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoWychJywgJ0AnLCAnIyddKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiISxALCMiLCByZXN1bHQuY19zdHIoKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlKDcpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoNykiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlKHVuZGVmaW5lZCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZSh1bmRlZmluZWQpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCi0gIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShudWxsKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlKG51bGwpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIC8vIEFmdGVyIGFsbCB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUgdW5jaGFuZ2VkLCBiZWNhdXNlIHRoZSBmdW5jdGlvbiB3b24ndCBiZQogICAvLyBjYWxsZWQuCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIhLEAsIyIsIHJlc3VsdC5jX3N0cigpKTsKIAogICAvLyBUaGVzZSBhcmUgdHJ1ZSBiZWNhdXNlIHByZXR0eSBtdWNoIGV2ZXJ5dGhpbmcgY29lcmNlcyBpbnRvIGEgc3RyaW5nLgotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShbMV0pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShbMV0pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIxIiwgcmVzdWx0LmNfc3RyKCkpOwogCiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoW25ldyBPYmplY3QoKV0pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoW25ldyBPYmplY3QoKV0pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCJbb2JqZWN0IE9iamVjdF0iLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoCi0gICAgICAidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShbbmV3IEFyYml0cmFyeUludGVyZmFjZSgpXSkiLCAmcmVzdWx0KSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICAidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZShbbmV3IEFyYml0cmFyeUludGVyZmFjZSgpXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0U3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIltvYmplY3QgQXJiaXRyYXJ5SW50ZXJmYWNlXSIsIHJlc3VsdC5jX3N0cigpKTsKIAogICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBjbGVhciBpdCBvdXQgdGhpcyB3YXkuCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlKFtdKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0U3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIiLCByZXN1bHQuY19zdHIoKSk7CiB9CiAKIFRFU1RfRihTZXF1ZW5jZUJpbmRpbmdzVGVzdCwgU3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSkgewogICBzdGQ6OnN0cmluZyByZXN1bHQ7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIAogICBFWFBFQ1RfRkFMU0UoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKFsnYSddKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoWydhJ10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZShbWydhJ11dKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZShbWydhJ11dKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCJhIiwgcmVzdWx0LmNfc3RyKCkpOwogCiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoW1snYSddLCBbJ2InXV0pIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCJhLGIiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoCi0gICAgICAidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKFtbJ2EnLCAnYiddLCBbJ2MnXV0pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICAidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKFtbJ2EnLCAnYiddLCBbJ2MnXV0pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoImEsYixjIiwgcmVzdWx0LmNfc3RyKCkpOwogCiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KAotICAgICAgInRlc3Quc2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZShbWychJywgJ0AnLCAnIyddXSkiLCAmcmVzdWx0KSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgICAgICJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoW1snIScsICdAJywgJyMnXV0pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiEsQCwjIiwgcmVzdWx0LmNfc3RyKCkpOwogCi0gIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKDcpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSg3KSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICBFWFBFQ1RfRkFMU0UoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKHVuZGVmaW5lZCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKHVuZGVmaW5lZCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2UobnVsbCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKG51bGwpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCi0gIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKFsxXSkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKFsxXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKICAgLy8gQWZ0ZXIgYWxsIHRoYXQgdGhlIHZhbHVlIHNob3VsZCBiZSB1bmNoYW5nZWQsIGJlY2F1c2UgdGhlIGZ1bmN0aW9uIHdvbid0IGJlCiAgIC8vIGNhbGxlZC4KLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0U3RyaW5nU2VxdWVuY2VTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIhLEAsIyIsIHJlc3VsdC5jX3N0cigpKTsKIAogICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBjbGVhciBpdCBvdXQgdGhpcyB3YXkuCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFN0cmluZ1NlcXVlbmNlKFtdKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0U3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0U3RyaW5nU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIiLCByZXN1bHQuY19zdHIoKSk7CiB9CiAKIFRFU1RfRihTZXF1ZW5jZUJpbmRpbmdzVGVzdCwgVW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKSB7CiAgIHN0ZDo6c3RyaW5nIHJlc3VsdDsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoJycpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCcnKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoWydhJ10pIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKFsnYSddKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCJhIiwgcmVzdWx0LmNfc3RyKCkpOwogCiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCdkJykiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoJ2QnKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCJkIiwgcmVzdWx0LmNfc3RyKCkpOwogCiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KAotICAgICAgInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKFsnYScsICdiJ10pIiwgJnJlc3VsdCkpOworICAgICAgInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKFsnYScsICdiJ10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoImEsYiIsIHJlc3VsdC5jX3N0cigpKTsKIAogICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgKLSAgICAgICJ0ZXN0LnNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZShbJ2EnLCAnYicsICdjJ10pIiwgJnJlc3VsdCkpOworICAgICAgInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKFsnYScsICdiJywgJ2MnXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiYSxiLGMiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgLy8gVGhpcyB3b3JrcyBiZWNhdXNlIG51bWJlcnMgY29lcmNlIHRvIHN0cmluZ3MuCiAgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KAotICAgICAgInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKFsxLCAyLCAzXSkiLCAmcmVzdWx0KSk7CisgICAgICAidGVzdC5zZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoWzEsIDIsIDNdKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIxLDIsMyIsIHJlc3VsdC5jX3N0cigpKTsKIAogICAvLyBDb252ZXJzaW9uIGZhaWx1cmUgY2FzZXMuCiAgIEVYUEVDVF9GQUxTRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSg3KSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSg3KSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICBFWFBFQ1RfRkFMU0UoRXZhbHVhdGVTY3JpcHQoCi0gICAgICAidGVzdC5zZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UodW5kZWZpbmVkKSIsICZyZXN1bHQpKTsKKyAgICAgICJ0ZXN0LnNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSh1bmRlZmluZWQpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIEVYUEVDVF9GQUxTRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZShudWxsKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZShudWxsKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfVEhBVChyZXN1bHQuY19zdHIoKSwgQ29udGFpbnNSZWdleCgiVHlwZUVycm9yOiIpKTsKIAogICAvLyBBZnRlciBhbGwgdGhhdCB0aGUgdmFsdWUgc2hvdWxkIGJlIHVuY2hhbmdlZCwgYmVjYXVzZSB0aGUgZnVuY3Rpb24gd29uJ3QgYmUKICAgLy8gY2FsbGVkLgogICBFWFBFQ1RfVFJVRSgKLSAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIxLDIsMyIsIHJlc3VsdC5jX3N0cigpKTsKIAogICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBjbGVhciBpdCBvdXQgdGhpcyB3YXkuCiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKFtdKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZShbXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RSVUUoCi0gICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvbk9mU3RyaW5nQW5kU3RyaW5nU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgICAgIEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiIiwgcmVzdWx0LmNfc3RyKCkpOwogfQogCiBURVNUX0YoU2VxdWVuY2VCaW5kaW5nc1Rlc3QsIFNlcXVlbmNlVW5pb24pIHsKICAgc3RkOjpzdHJpbmcgcmVzdWx0OwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKFtdKSIsICZyZXN1bHQpKTsKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25TZXF1ZW5jZSgpIiwgJnJlc3VsdCkpOworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKFtdKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvblNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCIiLCByZXN1bHQuY19zdHIoKSk7CiAKLSAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0VW5pb25TZXF1ZW5jZShbJ2EnXSkiLCAmcmVzdWx0KSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0VW5pb25TZXF1ZW5jZShbJ2EnXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25TZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiYSIsIHJlc3VsdC5jX3N0cigpKTsKIAotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKFsnYScsICdiJ10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvblNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uU2VxdWVuY2UoWydhJywgJ2InXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25TZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiYSxiIiwgcmVzdWx0LmNfc3RyKCkpOwogCiAgIEVYUEVDVF9UUlVFKAotICAgICAgRXZhbHVhdGVTY3JpcHQoInRlc3Quc2V0VW5pb25TZXF1ZW5jZShbJ2EnLCAnYicsICdjJ10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvblNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICBFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKFsnYScsICdiJywgJ2MnXSkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25TZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiYSxiLGMiLCByZXN1bHQuY19zdHIoKSk7CiAKICAgRVhQRUNUX1RSVUUoCkBAIC00NTAsOCArNTY4LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICAiICAgIFsgbmV3IEFyYml0cmFyeUludGVyZmFjZSgpLCAiCiAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbmV3IEFyYml0cmFyeUludGVyZmFjZSgpLCAiCiAgICAgICAgICAgICAgICAgICAgICAiICAgICAgbmV3IEFyYml0cmFyeUludGVyZmFjZSgpXSkiLAotICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvblNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25TZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0sW29iamVjdCBBcmJpdHJhcnlJbnRlcmZhY2VdLCIKICAgICAgICJbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0iLApAQCAtNDYyLDI4ICs1ODIsMzYgQEAKICAgICAgICAgICAgICAgICAgICAgICIgICAgWyAnYScsICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgICBuZXcgQXJiaXRyYXJ5SW50ZXJmYWNlKCksICIKICAgICAgICAgICAgICAgICAgICAgICIgICAgICAnYyddKSIsCi0gICAgICAgICAgICAgICAgICAgICAmcmVzdWx0KSk7Ci0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgICAgICAgICAgICAgICAgICAgICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OworICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvblNlcXVlbmNlKCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1NUUkVRKCJhLFtvYmplY3QgQXJiaXRyYXJ5SW50ZXJmYWNlXSxjIiwgcmVzdWx0LmNfc3RyKCkpOwogCiAgIC8vIENvbnZlcnNpb24gZmFpbHVyZSBjYXNlcy4KLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uU2VxdWVuY2UoNykiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKDcpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCi0gIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKHVuZGVmaW5lZCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKHVuZGVmaW5lZCkiLCAmcmVzdWx0KSkKKyAgICAgIDw8IHJlc3VsdDsKICAgRVhQRUNUX1RIQVQocmVzdWx0LmNfc3RyKCksIENvbnRhaW5zUmVnZXgoIlR5cGVFcnJvcjoiKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uU2VxdWVuY2UobnVsbCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9GQUxTRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5zZXRVbmlvblNlcXVlbmNlKG51bGwpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9USEFUKHJlc3VsdC5jX3N0cigpLCBDb250YWluc1JlZ2V4KCJUeXBlRXJyb3I6IikpOwogCiAgIC8vIEFmdGVyIGFsbCB0aGF0IHRoZSB2YWx1ZSBzaG91bGQgYmUgdW5jaGFuZ2VkLCBiZWNhdXNlIHRoZSBmdW5jdGlvbiB3b24ndCBiZQogICAvLyBjYWxsZWQuCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uU2VxdWVuY2UoKSIsICZyZXN1bHQpKTsKKyAgRVhQRUNUX1RSVUUoRXZhbHVhdGVTY3JpcHQoInRlc3QuZ2V0VW5pb25TZXF1ZW5jZSgpIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CiAgIEVYUEVDVF9TVFJFUSgiYSxbb2JqZWN0IEFyYml0cmFyeUludGVyZmFjZV0sYyIsIHJlc3VsdC5jX3N0cigpKTsKIAogICAvLyBXZSBzaG91bGQgYmUgYWJsZSB0byBjbGVhciBpdCBvdXQgdGhpcyB3YXkuCi0gIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpOwotICBFWFBFQ1RfVFJVRShFdmFsdWF0ZVNjcmlwdCgidGVzdC5nZXRVbmlvblNlcXVlbmNlKCkiLCAmcmVzdWx0KSk7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LnNldFVuaW9uU2VxdWVuY2UoW10pIiwgJnJlc3VsdCkpCisgICAgICA8PCByZXN1bHQ7CisgIEVYUEVDVF9UUlVFKEV2YWx1YXRlU2NyaXB0KCJ0ZXN0LmdldFVuaW9uU2VxdWVuY2UoKSIsICZyZXN1bHQpKQorICAgICAgPDwgcmVzdWx0OwogICBFWFBFQ1RfU1RSRVEoIiIsIHJlc3VsdC5jX3N0cigpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcXVlbmNlX3VzZXIuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXF1ZW5jZV91c2VyLmgKaW5kZXggOWE0ODBiOC4uNjZkMTU4YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcXVlbmNlX3VzZXIuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2VxdWVuY2VfdXNlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19TRVFVRU5DRV9VU0VSX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1NFUVVFTkNFX1VTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXF1ZW5jZV91c2VyLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zZXF1ZW5jZV91c2VyLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kZDFkOGM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NlcXVlbmNlX3VzZXIuaWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1sgQ29uc3RydWN0b3IgXQoraW50ZXJmYWNlIFNlcXVlbmNlVXNlciB7CisgIHNlcXVlbmNlPEFyYml0cmFyeUludGVyZmFjZT4gZ2V0SW50ZXJmYWNlU2VxdWVuY2UoKTsKKyAgc2VxdWVuY2U8c2VxdWVuY2U8c2VxdWVuY2U8QXJiaXRyYXJ5SW50ZXJmYWNlPj4+CisgIGdldEludGVyZmFjZVNlcXVlbmNlU2VxdWVuY2VTZXF1ZW5jZSgpOworICBzZXF1ZW5jZTxsb25nPiBnZXRMb25nU2VxdWVuY2UoKTsKKyAgc2VxdWVuY2U8RE9NU3RyaW5nPiBnZXRTdHJpbmdTZXF1ZW5jZSgpOworICBzZXF1ZW5jZTxzZXF1ZW5jZTxET01TdHJpbmc+PiBnZXRTdHJpbmdTZXF1ZW5jZVNlcXVlbmNlKCk7CisgIChET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPikgZ2V0VW5pb25PZlN0cmluZ0FuZFN0cmluZ1NlcXVlbmNlKCk7CisgIHNlcXVlbmNlPChET01TdHJpbmcgb3IgQXJiaXRyYXJ5SW50ZXJmYWNlKT4gZ2V0VW5pb25TZXF1ZW5jZSgpOworCisgIHZvaWQgc2V0SW50ZXJmYWNlU2VxdWVuY2Uoc2VxdWVuY2U8QXJiaXRyYXJ5SW50ZXJmYWNlPiBlbGVtZW50cyk7CisgIHZvaWQgc2V0SW50ZXJmYWNlU2VxdWVuY2VTZXF1ZW5jZVNlcXVlbmNlKAorICAgICAgc2VxdWVuY2U8c2VxdWVuY2U8c2VxdWVuY2U8QXJiaXRyYXJ5SW50ZXJmYWNlPj4+IGVsZW1lbnRzKTsKKyAgdm9pZCBzZXRMb25nU2VxdWVuY2Uoc2VxdWVuY2U8bG9uZz4gZWxlbWVudHMpOworICB2b2lkIHNldFN0cmluZ1NlcXVlbmNlKHNlcXVlbmNlPERPTVN0cmluZz4gZWxlbWVudHMpOworICB2b2lkIHNldFN0cmluZ1NlcXVlbmNlU2VxdWVuY2Uoc2VxdWVuY2U8c2VxdWVuY2U8RE9NU3RyaW5nPj4gZWxlbWVudHMpOworICB2b2lkIHNldFVuaW9uT2ZTdHJpbmdBbmRTdHJpbmdTZXF1ZW5jZSgKKyAgICAgIChET01TdHJpbmcgb3Igc2VxdWVuY2U8RE9NU3RyaW5nPikgZWxlbWVudHMpOworICB2b2lkIHNldFVuaW9uU2VxdWVuY2Uoc2VxdWVuY2U8KERPTVN0cmluZyBvciBBcmJpdHJhcnlJbnRlcmZhY2UpPiBlbGVtZW50cyk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3NpbmdsZV9vcGVyYXRpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaAppbmRleCA3MjIxYWQ5Li43OGM4MjE5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfU0lOR0xFX09QRVJBVElPTl9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfU0lOR0xFX09QRVJBVElPTl9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNTQyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc2luZ2xlX29wZXJhdGlvbl9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2NhbGxiYWNrIGludGVyZmFjZSBTaW5nbGVPcGVyYXRpb25JbnRlcmZhY2UgeworICBsb25nPyBoYW5kbGVDYWxsYmFjayhBcmJpdHJhcnlJbnRlcmZhY2UgdmFsdWUpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGFja190cmFjZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YWNrX3RyYWNlX3Rlc3QuY2MKaW5kZXggYjhjMTMwNC4uOGRiZGIzNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YWNrX3RyYWNlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YWNrX3RyYWNlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19iaW5kaW5nc190ZXN0LmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2JpbmRpbmdzX3Rlc3QuY2MKaW5kZXggNTFmZTE4MS4uM2M2Y2YzOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2JpbmRpbmdzX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvYmluZGluZ3NfdGVzdF9iYXNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmNjIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5jYwppbmRleCBmYjY3NzAyLi45MjFkNDZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaAppbmRleCA1YWJkNDdhLi5hOTcxMjkwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0YXRpY19wcm9wZXJ0aWVzX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19TVEFUSUNfUFJPUEVSVElFU19JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfU1RBVElDX1BST1BFUlRJRVNfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdGF0aWNfcHJvcGVydGllc19pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlNmMyMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgoraW50ZXJmYWNlIFN0YXRpY1Byb3BlcnRpZXNJbnRlcmZhY2UgeworICBzdGF0aWMgdm9pZCBzdGF0aWNGdW5jdGlvbigpOworICBzdGF0aWMgdm9pZCBzdGF0aWNGdW5jdGlvbihsb25nIGFyZyk7CisgIHN0YXRpYyB2b2lkIHN0YXRpY0Z1bmN0aW9uKERPTVN0cmluZyBhcmcpOworICBzdGF0aWMgdm9pZCBzdGF0aWNGdW5jdGlvbihsb25nIGFyZzEsIGxvbmcgYXJnMiwgbG9uZyBhcmczKTsKKyAgc3RhdGljIHZvaWQgc3RhdGljRnVuY3Rpb24obG9uZyBhcmcxLCBsb25nIGFyZzIsIEFyYml0cmFyeUludGVyZmFjZSBhcmczKTsKKyAgc3RhdGljIGF0dHJpYnV0ZSBET01TdHJpbmcgc3RhdGljQXR0cmlidXRlOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgKaW5kZXggMTgyZWJjZC4uZDMxOTFhNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1NUUklOR0lGSUVSX0FOT05ZTU9VU19PUEVSQVRJT05fSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1NUUklOR0lGSUVSX0FOT05ZTU9VU19PUEVSQVRJT05fSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYW5vbnltb3VzX29wZXJhdGlvbl9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGQ0ZTczCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2Fub255bW91c19vcGVyYXRpb25faW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgU3RyaW5naWZpZXJBbm9ueW1vdXNPcGVyYXRpb25JbnRlcmZhY2UgeworICBzdHJpbmdpZmllciBET01TdHJpbmcgKCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmgKaW5kZXggMzQ1ODliOS4uZmU4ODdmMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19TVFJJTkdJRklFUl9BVFRSSUJVVEVfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1NUUklOR0lGSUVSX0FUVFJJQlVURV9JTlRFUkZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9hdHRyaWJ1dGVfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTVmZGZkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2F0dHJpYnV0ZV9pbnRlcmZhY2UuaWRsCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludGVyZmFjZSBTdHJpbmdpZmllckF0dHJpYnV0ZUludGVyZmFjZSB7CisgIHN0cmluZ2lmaWVyIGF0dHJpYnV0ZSBET01TdHJpbmcgdGhlU3RyaW5naWZpZXJBdHRyaWJ1dGU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX2JpbmRpbmdzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYmluZGluZ3NfdGVzdC5jYwppbmRleCAxNTJmODI0Li42MTI5M2I0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYmluZGluZ3NfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfYmluZGluZ3NfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmggYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5oCmluZGV4IDVlNmI1YmIuLmE1MzBhNzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3N0cmluZ2lmaWVyX29wZXJhdGlvbl9pbnRlcmZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfU1RSSU5HSUZJRVJfT1BFUkFUSU9OX0lOVEVSRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfQklORElOR1NfVEVTVElOR19TVFJJTkdJRklFUl9PUEVSQVRJT05fSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEyMjMwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy9zdHJpbmdpZmllcl9vcGVyYXRpb25faW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgU3RyaW5naWZpZXJPcGVyYXRpb25JbnRlcmZhY2UgeworICBzdHJpbmdpZmllciBET01TdHJpbmcgdGhlU3RyaW5naWZpZXJPcGVyYXRpb24oKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGFyZ2V0X2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaAppbmRleCAwZmU2M2Y2Li5hNjM5MDg1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGFyZ2V0X2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy90YXJnZXRfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1RBUkdFVF9JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfVEFSR0VUX0lOVEVSRkFDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaWRsIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3RhcmdldF9pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFiYjc4NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGFyZ2V0X2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwxNiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIFRhcmdldEludGVyZmFjZSB7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Rlc3RfZGljdGlvbmFyeS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGVzdF9kaWN0aW9uYXJ5LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YjZjNjI2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Rlc3RfZGljdGlvbmFyeS5pZGwKQEAgLTAsMCArMSwyNiBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworZGljdGlvbmFyeSBUZXN0RGljdGlvbmFyeSB7CisgIGJvb2xlYW4gYm9vbGVhbk1lbWJlcjsKKyAgbG9uZyBsb25nTWVtYmVyOworICBkb3VibGUgZG91YmxlTWVtYmVyOworICBET01TdHJpbmcgc3RyaW5nTWVtYmVyOworICBBcmJpdHJhcnlJbnRlcmZhY2UgaW50ZXJmYWNlTWVtYmVyOworCisgIGxvbmcgbWVtYmVyV2l0aERlZmF1bHQgPSA1OworICBsb25nIG5vbkRlZmF1bHRNZW1iZXI7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Rlc3RpbmcuZ3lwIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Rlc3RpbmcuZ3lwCmluZGV4IGI3NmE4NDUuLjNkNmIwOTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy90ZXN0aW5nLmd5cAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdGVzdGluZy5neXAKQEAgLTI1LDY0ICsyNSw2OSBAQAogICAgICMgYmUgYW4gaW1wbGVtZW50YXRpb24gZGVjbGFyZWQgaW4gYSBoZWFkZXIgdGhhdCBsaXZlcyBpbiB0aGUgc2FtZQogICAgICMgZGlyZWN0b3J5IG9mIGVhY2ggSURMLgogICAgICdzb3VyY2VfaWRsX2ZpbGVzJzogWwotICAgICAgICAnQW5vbnltb3VzSW5kZXhlZEdldHRlckludGVyZmFjZS5pZGwnLAotICAgICAgICAnQW5vbnltb3VzTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ0Fub255bW91c05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5pZGwnLAotICAgICAgICAnQXJiaXRyYXJ5SW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdCYXNlSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdCb29sZWFuVHlwZVRlc3RJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ0NhbGxiYWNrRnVuY3Rpb25JbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ0NhbGxiYWNrSW50ZXJmYWNlSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdDb25kaXRpb25hbEludGVyZmFjZS5pZGwnLAotICAgICAgICAnQ29uc3RhbnRzSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdDb25zdHJ1Y3RvckludGVyZmFjZS5pZGwnLAotICAgICAgICAnQ29uc3RydWN0b3JXaXRoQXJndW1lbnRzSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdEZXJpdmVkR2V0dGVyU2V0dGVySW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdEZXJpdmVkSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdEaXNhYmxlZEludGVyZmFjZS5pZGwnLAotICAgICAgICAnRE9NU3RyaW5nVGVzdEludGVyZmFjZS5pZGwnLAotICAgICAgICAnRW51bWVyYXRpb25JbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ0V4Y2VwdGlvbk9iamVjdEludGVyZmFjZS5pZGwnLAotICAgICAgICAnRXhjZXB0aW9uc0ludGVyZmFjZS5pZGwnLAotICAgICAgICAnRXh0ZW5kZWRJRExBdHRyaWJ1dGVzSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdHYXJiYWdlQ29sbGVjdGlvblRlc3RJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ0dldE9wYXF1ZVJvb3RJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ0dsb2JhbEludGVyZmFjZVBhcmVudC5pZGwnLAotICAgICAgICAnSW5kZXhlZEdldHRlckludGVyZmFjZS5pZGwnLAotICAgICAgICAnSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllcy5pZGwnLAotICAgICAgICAnTmFtZWRDb25zdHJ1Y3RvckludGVyZmFjZS5pZGwnLAotICAgICAgICAnTmFtZWRHZXR0ZXJJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ05hbWVkSW5kZXhlZEdldHRlckludGVyZmFjZS5pZGwnLAotICAgICAgICAnTmVzdGVkUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ05vQ29uc3RydWN0b3JJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ05vSW50ZXJmYWNlT2JqZWN0SW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdOdWxsYWJsZVR5cGVzVGVzdEludGVyZmFjZS5pZGwnLAotICAgICAgICAnTnVtZXJpY1R5cGVzVGVzdEludGVyZmFjZS5pZGwnLAotICAgICAgICAnT2JqZWN0VHlwZUJpbmRpbmdzSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdPcGVyYXRpb25zVGVzdEludGVyZmFjZS5pZGwnLAotICAgICAgICAnUHV0Rm9yd2FyZHNJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ1NlcXVlbmNlVXNlci5pZGwnLAotICAgICAgICAnU2luZ2xlT3BlcmF0aW9uSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdTdGF0aWNQcm9wZXJ0aWVzSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdTdHJpbmdpZmllckFub255bW91c09wZXJhdGlvbkludGVyZmFjZS5pZGwnLAotICAgICAgICAnU3RyaW5naWZpZXJBdHRyaWJ1dGVJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ1N0cmluZ2lmaWVyT3BlcmF0aW9uSW50ZXJmYWNlLmlkbCcsCi0gICAgICAgICdUYXJnZXRJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ1VuaW9uVHlwZXNJbnRlcmZhY2UuaWRsJywKLSAgICAgICAgJ1dpbmRvdy5pZGwnLAorICAgICAgICAnYW5vbnltb3VzX2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnYW5vbnltb3VzX25hbWVkX2dldHRlcl9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2Fub255bW91c19uYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2FyYml0cmFyeV9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2Jhc2VfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdib29sZWFuX3R5cGVfdGVzdF9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2NhbGxiYWNrX2Z1bmN0aW9uX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnY2FsbGJhY2tfaW50ZXJmYWNlX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnY29uZGl0aW9uYWxfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdjb25zdGFudHNfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdjb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2NvbnN0cnVjdG9yX3dpdGhfYXJndW1lbnRzX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnZGVyaXZlZF9nZXR0ZXJfc2V0dGVyX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnZGVyaXZlZF9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2RpY3Rpb25hcnlfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdkaXNhYmxlZF9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2RvbV9zdHJpbmdfdGVzdF9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2VudW1lcmF0aW9uX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnZXhjZXB0aW9uX29iamVjdF9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2V4Y2VwdGlvbnNfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdleHRlbmRlZF9pZGxfYXR0cmlidXRlc19pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ2dhcmJhZ2VfY29sbGVjdGlvbl90ZXN0X2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnZ2V0X29wYXF1ZV9yb290X2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnZ2xvYmFsX2ludGVyZmFjZV9wYXJlbnQuaWRsJywKKyAgICAgICAgJ2luZGV4ZWRfZ2V0dGVyX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnaW50ZXJmYWNlX3dpdGhfdW5zdXBwb3J0ZWRfcHJvcGVydGllcy5pZGwnLAorICAgICAgICAnbmFtZWRfY29uc3RydWN0b3JfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICduYW1lZF9nZXR0ZXJfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICduYW1lZF9pbmRleGVkX2dldHRlcl9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ25lc3RlZF9wdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdub19jb25zdHJ1Y3Rvcl9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ25vX2ludGVyZmFjZV9vYmplY3RfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdudWxsYWJsZV90eXBlc190ZXN0X2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnbnVtZXJpY190eXBlc190ZXN0X2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnb2JqZWN0X3R5cGVfYmluZGluZ3NfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdvcGVyYXRpb25zX3Rlc3RfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdwdXRfZm9yd2FyZHNfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdzZXF1ZW5jZV91c2VyLmlkbCcsCisgICAgICAgICdzaW5nbGVfb3BlcmF0aW9uX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnc3RhdGljX3Byb3BlcnRpZXNfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdzdHJpbmdpZmllcl9hbm9ueW1vdXNfb3BlcmF0aW9uX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnc3RyaW5naWZpZXJfYXR0cmlidXRlX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAnc3RyaW5naWZpZXJfb3BlcmF0aW9uX2ludGVyZmFjZS5pZGwnLAorICAgICAgICAndGFyZ2V0X2ludGVyZmFjZS5pZGwnLAorICAgICAgICAndW5pb25fdHlwZXNfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICd3aW5kb3cuaWRsJywKKyAgICBdLAorCisgICAgJ2RpY3Rpb25hcnlfaWRsX2ZpbGVzJzogWworICAgICAgICAndGVzdF9kaWN0aW9uYXJ5LmlkbCcsCiAgICAgXSwKIAogICAgICMgUGFydGlhbCBpbnRlcmZhY2VzIGFuZCB0aGUgcmlnaHQtc2lkZSBvZiAiaW1wbGVtZW50cyIKICAgICAjIENvZGUgd2lsbCBub3QgZ2V0IGdlbmVyYXRlZCBmb3IgdGhlc2UgaW50ZXJmYWNlczsgdGhleSBhcmUgdXNlZCB0byBhZGQKICAgICAjIGZ1bmN0aW9uYWxpdHkgdG8gb3RoZXIgaW50ZXJmYWNlcy4KICAgICAnZGVwZW5kZW5jeV9pZGxfZmlsZXMnOiBbCi0gICAgICAgICdJbXBsZW1lbnRlZEludGVyZmFjZS5pZGwnLAotICAgICAgICAnUGFydGlhbEludGVyZmFjZS5pZGwnLAotICAgICAgICAnSW50ZXJmYWNlV2l0aFVuc3VwcG9ydGVkUHJvcGVydGllc19wYXJ0aWFsLmlkbCcsCisgICAgICAgICdpbXBsZW1lbnRlZF9pbnRlcmZhY2UuaWRsJywKKyAgICAgICAgJ3BhcnRpYWxfaW50ZXJmYWNlLmlkbCcsCisgICAgICAgICdpbnRlcmZhY2Vfd2l0aF91bnN1cHBvcnRlZF9wcm9wZXJ0aWVzX3BhcnRpYWwuaWRsJywKICAgICBdLAogCiAgICAgJ3Vuc3VwcG9ydGVkX2ludGVyZmFjZV9pZGxfZmlsZXMnOiBbCi0gICAgICAnVW5zdXBwb3J0ZWRJbnRlcmZhY2UuaWRsJywKKyAgICAgICd1bnN1cHBvcnRlZF9pbnRlcmZhY2UuaWRsJywKICAgICBdLAogCiAgICAgIyBTcGVjaWZ5IGNvbXBvbmVudCBmb3IgZ2VuZXJhdGVkIHdpbmRvdyBJREwuCkBAIC05OCw2ICsxMDMsMTQgQEAKIAogICAndGFyZ2V0cyc6IFsKICAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnYmluZGluZ3MnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgIyBUaGUgZ2VuZXJhdGVkX2JpbmRpbmdzIHRhcmdldCBjb21lcyBmcm9tIGJpbmRpbmdzLmd5cGkuCisgICAgICAgICdnZW5lcmF0ZWRfYmluZGluZ3MnLAorICAgICAgXSwKKyAgICB9LAorICAgIHsKICAgICAgICd0YXJnZXRfbmFtZSc6ICdiaW5kaW5nc190ZXN0X2ltcGxlbWVudGF0aW9uJywKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdzb3VyY2VzJzogWwpAQCAtMTI4LDYgKzE0MSw3IEBACiAgICAgICAgICdjb25zdGFudHNfYmluZGluZ3NfdGVzdC5jYycsCiAgICAgICAgICdjb25zdHJ1Y3Rvcl9iaW5kaW5nc190ZXN0LmNjJywKICAgICAgICAgJ2RlcGVuZGVudF9pbnRlcmZhY2VfdGVzdC5jYycsCisgICAgICAgICdkaWN0aW9uYXJ5X3Rlc3QuY2MnLAogICAgICAgICAnZG9tX3N0cmluZ19iaW5kaW5nc190ZXN0LmNjJywKICAgICAgICAgJ2VudW1lcmF0aW9uX2JpbmRpbmdzX3Rlc3QuY2MnLAogICAgICAgICAnZXZhbHVhdGVfc2NyaXB0X3Rlc3QuY2MnLApAQCAtMTU1LDkgKzE2OSw5IEBACiAgICAgICBdLAogICAgICAgJ2RlZmluZXMnOiBbICc8QChiaW5kaW5nc19kZWZpbmVzKSddLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc2NyaXB0L2VuZ2luZS5neXA6ZW5naW5lJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ2JpbmRpbmdzJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlX2JpbmRpbmdzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5pb25fdHlwZV9iaW5kaW5nc190ZXN0LmNjCmluZGV4IGU0NTkzYTIuLjkzM2E3MzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3VuaW9uX3R5cGVfYmluZGluZ3NfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlc19pbnRlcmZhY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlc19pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlc19pbnRlcmZhY2UuaAppbmRleCA3ZDBmN2MxLi5mM2RhMDFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5pb25fdHlwZXNfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3VuaW9uX3R5cGVzX2ludGVyZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19VTklPTl9UWVBFU19JTlRFUkZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfVU5JT05fVFlQRVNfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5pb25fdHlwZXNfaW50ZXJmYWNlLmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bmlvbl90eXBlc19pbnRlcmZhY2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4MTA3MWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5pb25fdHlwZXNfaW50ZXJmYWNlLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgVW5pb25UeXBlc0ludGVyZmFjZSB7CisgIGF0dHJpYnV0ZSAoRE9NU3RyaW5nIG9yIGJvb2xlYW4gb3IgQXJiaXRyYXJ5SW50ZXJmYWNlIG9yIGxvbmcpIHVuaW9uUHJvcGVydHk7CisgIGF0dHJpYnV0ZSAoZG91YmxlIG9yIERPTVN0cmluZz8pIHVuaW9uV2l0aE51bGxhYmxlTWVtYmVyUHJvcGVydHk7CisgIGF0dHJpYnV0ZSAoZG91YmxlIG9yIERPTVN0cmluZyk/IG51bGxhYmxlVW5pb25Qcm9wZXJ0eTsKKyAgYXR0cmlidXRlIChCYXNlSW50ZXJmYWNlIG9yIERPTVN0cmluZykgdW5pb25CYXNlUHJvcGVydHk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Vuc3VwcG9ydGVkX2ludGVyZmFjZS5pZGwgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5zdXBwb3J0ZWRfaW50ZXJmYWNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZmM5NWNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3Vuc3VwcG9ydGVkX2ludGVyZmFjZS5pZGwKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworWyBOb3RTdXBwb3J0ZWQgXQoraW50ZXJmYWNlIFVuc3VwcG9ydGVkSW50ZXJmYWNlIHsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdW5zdXBwb3J0ZWRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bnN1cHBvcnRlZF90ZXN0LmNjCmluZGV4IDg2M2IzZGEuLjZmMDAxNTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bnN1cHBvcnRlZF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy91bnN1cHBvcnRlZF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2JpbmRpbmdzX3Rlc3RfYmFzZS5oIgogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2ludGVyZmFjZV93aXRoX3Vuc3VwcG9ydGVkX3Byb3BlcnRpZXMuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92YXJpYWRpY19hcmd1bWVudHNfYmluZGluZ3NfdGVzdC5jYyBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy92YXJpYWRpY19hcmd1bWVudHNfYmluZGluZ3NfdGVzdC5jYwppbmRleCA5NWZkYzgyLi4wMmY5NDE3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3RpbmcvdmFyaWFkaWNfYXJndW1lbnRzX2JpbmRpbmdzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3ZhcmlhZGljX2FyZ3VtZW50c19iaW5kaW5nc190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL2FyYml0cmFyeV9pbnRlcmZhY2UuaCIKICNpbmNsdWRlICJjb2JhbHQvYmluZGluZ3MvdGVzdGluZy9iaW5kaW5nc190ZXN0X2Jhc2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy93aW5kb3cuaCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy93aW5kb3cuaAppbmRleCBiNjgwZDlkLi5mNzZmYjI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvd2luZG93LmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3dpbmRvdy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQklORElOR1NfVEVTVElOR19XSU5ET1dfSF8KICNkZWZpbmUgQ09CQUxUX0JJTkRJTkdTX1RFU1RJTkdfV0lORE9XX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvd2luZG93LmlkbCBiL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy93aW5kb3cuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg1ZTM3MDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2JpbmRpbmdzL3Rlc3Rpbmcvd2luZG93LmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorW1ByaW1hcnlHbG9iYWxdCitpbnRlcmZhY2UgV2luZG93IDogR2xvYmFsSW50ZXJmYWNlUGFyZW50IHsKKyAgdm9pZCB3aW5kb3dPcGVyYXRpb24oKTsKKyAgYXR0cmlidXRlIERPTVN0cmluZyB3aW5kb3dQcm9wZXJ0eTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIFdpbmRvdyB3aW5kb3c7CisgIFtDYWxsV2l0aD1TdGFja1RyYWNlXSBET01TdHJpbmcgZ2V0U3RhY2tUcmFjZSgpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYmluZGluZ3MvdGVzdGluZy93aW5kb3dfbW9jay5oIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3dpbmRvd19tb2NrLmgKaW5kZXggNWVmYjBlYi4uNTU3ZjM4MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3dpbmRvd19tb2NrLmgKKysrIGIvc3JjL2NvYmFsdC9iaW5kaW5ncy90ZXN0aW5nL3dpbmRvd19tb2NrLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1dJTkRPV19NT0NLX0hfCiAjZGVmaW5lIENPQkFMVF9CSU5ESU5HU19URVNUSU5HX1dJTkRPV19NT0NLX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uY2MKaW5kZXggMGY2ZWIxOC4uNjE5NDM3NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5oCmluZGV4IGQzZjJhNDEuLjdiN2FhOGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9hcHBsaWNhdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9BUFBMSUNBVElPTl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9BUFBMSUNBVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXIuZ3lwIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXIuZ3lwCmluZGV4IDc1NWQ4NWYuLmRlMTk5ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXAKQEAgLTczLDcgKzczLDcgQEAKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9pbnB1dC9pbnB1dC5neXA6aW5wdXQnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2xheW91dC9sYXlvdXQuZ3lwOmxheW91dCcsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWF0aC9tYXRoLmd5cDptYXRoJywKLSAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYS9tZWRpYS5neXA6bWVkaWEnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5neXA6bWVkaWFfc2Vzc2lvbicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbmV0d29yay9uZXR3b3JrLmd5cDpuZXR3b3JrJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXA6cmVuZGVyZXInLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9lbmdpbmUuZ3lwOmVuZ2luZScsCkBAIC04OCw2ICs4OCwxOCBAQAogICAgICAgICAnYnJvd3Nlcl9iaW5kaW5ncy5neXA6YmluZGluZ3MnLAogICAgICAgICAnc2NyZWVuX3Nob3Rfd3JpdGVyJywKICAgICAgIF0sCisgICAgICAjIFRoaXMgdGFyZ2V0IGRvZXNuJ3QgZ2VuZXJhdGUgYW55IGhlYWRlcnMsIGJ1dCBpdCBleHBvc2VzIGdlbmVyYXRlZAorICAgICAgIyBoZWFkZXIgZmlsZXMgKGZvciBpZGwgZGljdGlvbmFyaWVzKSB0aHJvdWdoIHRoaXMgbW9kdWxlJ3MgcHVibGljIGhlYWRlcgorICAgICAgIyBmaWxlcy4gU28gbWFyayB0aGlzIHRhcmdldCBhcyBhIGhhcmQgZGVwZW5kZW5jeSB0byBlbnN1cmUgdGhhdCBhbnkKKyAgICAgICMgZGVwZW5kZW50IHRhcmdldHMgd2FpdCB1bnRpbCB0aGlzIHRhcmdldCAoYW5kIGl0cyBoYXJkIGRlcGVuZGVuY2llcykgYXJlCisgICAgICAjIGJ1aWx0LgorICAgICAgIydoYXJkX2RlcGVuZGVuY3knOiAxLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICMgQWRkaXRpb25hbGx5LCBlbnN1cmUgdGhhdCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgZ2VuZXJhdGVkCisgICAgICAgICMgaGVhZGVycyBhcmUgcHV0IG9uIHRoZSBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciB0YXJnZXRzIHRoYXQgZGVwZW5kCisgICAgICAgICMgb24gdGhpcyBvbmUuCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbS5neXA6ZG9tJywKKyAgICAgIF0sCiAgICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgICAgWydlbmFibGVfYWJvdXRfc2NoZW1lID09IDEnLCB7CiAgICAgICAgICAgJ2RlZmluZXMnOiBbICdFTkFCTEVfQUJPVVRfU0NIRU1FJyBdLApAQCAtOTUsNiArMTA3LDE1IEBACiAgICAgICAgIFsnZW5hYmxlX210bSA9PSAxJywgewogICAgICAgICAgICdkZWZpbmVzJyA6IFsnRU5BQkxFX01UTSddLAogICAgICAgICB9XSwKKyAgICAgICAgWydjb2JhbHRfbWVkaWFfc291cmNlXzIwMTY9PTEnLCB7CisgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWEvbWVkaWEyLmd5cDptZWRpYTInLAorICAgICAgICAgIF0sCisgICAgICAgIH0sIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYS9tZWRpYS5neXA6bWVkaWEnLAorICAgICAgICAgIF0sCisgICAgICAgIH1dLAogICAgICAgXSwKICAgICB9LAogCkBAIC0xMzQsMTIgKzE1NSwxMiBAQAogICAgICAgICAnbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbF90ZXN0LmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb20nLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L25ldHdvcmsvbmV0d29yay5neXA6bmV0d29yaycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlLmd5cDpzdG9yYWdlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2UuZ3lwOnN0b3JhZ2VfdXBncmFkZV9jb3B5X3Rlc3RfZGF0YScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdicm93c2VyJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzLmd5cCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzLmd5cAppbmRleCA4MDJiODAzLi41MjFiM2U5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5ncy5neXAKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3MuZ3lwCkBAIC0xMywyMTcgKzEzLDE3IEBACiAjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiB7Ci0gICdpbmNsdWRlcyc6IFsKLSAgICAnLi4vYmluZGluZ3MvYmluZGluZ3MuZ3lwaScsCisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdiaW5kaW5ncycsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAnLi4vaDV2Y2MvaDV2Y2MuZ3lwOmg1dmNjJywKKyAgICAgICAgJy4uL3dlYmRyaXZlci93ZWJkcml2ZXIuZ3lwOndlYmRyaXZlcicsCisgICAgICAgICMgVGhlIGdlbmVyYXRlZF9iaW5kaW5ncyB0YXJnZXQgd2lsbCBhZGQgYWxsIG5lY2Vzc2FyeSBzb3VyY2VzIHRvIHRoaXMKKyAgICAgICAgIyB0YXJnZXQuCisgICAgICAgICdicm93c2VyX2JpbmRpbmdzX2dlbi5neXA6Z2VuZXJhdGVkX2JpbmRpbmdzJywKKyAgICAgIF0sCisgICAgfSwKICAgXSwKLSAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAjIEJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggZ2VuZXJhdGVkIHNvdXJjZXMgYW5kIGludGVybWVkaWF0ZSBmaWxlcyBzaG91bGQKLSAgICAjIGJlIGdlbmVyYXRlZC4KLSAgICAnYmluZGluZ3Nfb3V0cHV0X2Rpcic6ICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9iaW5kaW5ncy9icm93c2VyJywKLQotICAgICdiaW5kaW5nc19kZXBlbmRlbmNpZXMnOiBbCi0gICAgICAnLi4vaDV2Y2MvaDV2Y2MuZ3lwOmg1dmNjJywKLSAgICAgICcuLi93ZWJkcml2ZXIvd2ViZHJpdmVyLmd5cDp3ZWJkcml2ZXInLAotICAgIF0sCi0KLSAgICAjIEJpbmRpbmdzIGZvciB0aGUgaW50ZXJmYWNlcyBpbiB0aGlzIGxpc3Qgd2lsbCBiZSBnZW5lcmF0ZWQsIGFuZCB0aGVyZSBtdXN0Ci0gICAgIyBiZSBhbiBpbXBsZW1lbnRhdGlvbiBkZWNsYXJlZCBpbiBhIGhlYWRlciB0aGF0IGxpdmVzIGluIHRoZSBzYW1lCi0gICAgIyBkaXJlY3Rvcnkgb2YgZWFjaCBJREwuCi0gICAgJ3NvdXJjZV9pZGxfZmlsZXMnOiBbCi0gICAgICAgICcuLi9hdWRpby9BdWRpb0J1ZmZlci5pZGwnLAotICAgICAgICAnLi4vYXVkaW8vQXVkaW9CdWZmZXJTb3VyY2VOb2RlLmlkbCcsCi0gICAgICAgICcuLi9hdWRpby9BdWRpb0NvbnRleHQuaWRsJywKLSAgICAgICAgJy4uL2F1ZGlvL0F1ZGlvRGVzdGluYXRpb25Ob2RlLmlkbCcsCi0gICAgICAgICcuLi9hdWRpby9BdWRpb05vZGUuaWRsJywKLQotICAgICAgICAnLi4vY3Nzb20vQ1NTLmlkbCcsCi0gICAgICAgICcuLi9jc3NvbS9DU1NDb25kaXRpb25SdWxlLmlkbCcsCi0gICAgICAgICcuLi9jc3NvbS9DU1NHcm91cGluZ1J1bGUuaWRsJywKLSAgICAgICAgJy4uL2Nzc29tL0NTU0ZvbnRGYWNlUnVsZS5pZGwnLAotICAgICAgICAnLi4vY3Nzb20vQ1NTTWVkaWFSdWxlLmlkbCcsCi0gICAgICAgICcuLi9jc3NvbS9DU1NLZXlmcmFtZVJ1bGUuaWRsJywKLSAgICAgICAgJy4uL2Nzc29tL0NTU0tleWZyYW1lc1J1bGUuaWRsJywKLSAgICAgICAgJy4uL2Nzc29tL0NTU1J1bGUuaWRsJywKLSAgICAgICAgJy4uL2Nzc29tL0NTU1J1bGVMaXN0LmlkbCcsCi0gICAgICAgICcuLi9jc3NvbS9DU1NTdHlsZURlY2xhcmF0aW9uLmlkbCcsCi0gICAgICAgICcuLi9jc3NvbS9DU1NTdHlsZVJ1bGUuaWRsJywKLSAgICAgICAgJy4uL2Nzc29tL0NTU1N0eWxlU2hlZXQuaWRsJywKLSAgICAgICAgJy4uL2Nzc29tL01lZGlhTGlzdC5pZGwnLAotICAgICAgICAnLi4vY3Nzb20vU3R5bGVTaGVldC5pZGwnLAotICAgICAgICAnLi4vY3Nzb20vU3R5bGVTaGVldExpc3QuaWRsJywKLQotICAgICAgICAnLi4vZGVidWcvRGVidWdIdWIuaWRsJywKLSAgICAgICAgJy4uL2RlYnVnL0RlYnVnZ2VyLmlkbCcsCi0gICAgICAgICcuLi9kZWJ1Zy9EZWJ1Z2dlckV2ZW50VGFyZ2V0LmlkbCcsCi0gICAgICAgICcuLi9kZWJ1Zy9EZWJ1Z1NjcmlwdFJ1bm5lci5pZGwnLAotCi0gICAgICAgICcuLi9kb20vQW5pbWF0aW9uRXZlbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9BcnJheUJ1ZmZlci5pZGwnLAotICAgICAgICAnLi4vZG9tL0FycmF5QnVmZmVyVmlldy5pZGwnLAotICAgICAgICAnLi4vZG9tL0F0dHIuaWRsJywKLSAgICAgICAgJy4uL2RvbS9CbG9iLmlkbCcsCi0gICAgICAgICcuLi9kb20vQ0RBVEFTZWN0aW9uLmlkbCcsCi0gICAgICAgICcuLi9kb20vQ2hhcmFjdGVyRGF0YS5pZGwnLAotICAgICAgICAnLi4vZG9tL0NvbW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9Db25zb2xlLmlkbCcsCi0gICAgICAgICcuLi9kb20vQ3J5cHRvLmlkbCcsCi0gICAgICAgICcuLi9kb20vRGF0YVZpZXcuaWRsJywKLSAgICAgICAgJy4uL2RvbS9Eb2N1bWVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0RvY3VtZW50VGltZWxpbmUuaWRsJywKLSAgICAgICAgJy4uL2RvbS9Eb2N1bWVudFR5cGUuaWRsJywKLSAgICAgICAgJy4uL2RvbS9ET01FeGNlcHRpb24uaWRsJywKLSAgICAgICAgJy4uL2RvbS9ET01JbXBsZW1lbnRhdGlvbi5pZGwnLAotICAgICAgICAnLi4vZG9tL0RPTVBhcnNlci5pZGwnLAotICAgICAgICAnLi4vZG9tL0RPTVJlY3QuaWRsJywKLSAgICAgICAgJy4uL2RvbS9ET01SZWN0TGlzdC5pZGwnLAotICAgICAgICAnLi4vZG9tL0RPTVJlY3RSZWFkT25seS5pZGwnLAotICAgICAgICAnLi4vZG9tL0RPTVN0cmluZ01hcC5pZGwnLAotICAgICAgICAnLi4vZG9tL0RPTVRva2VuTGlzdC5pZGwnLAotICAgICAgICAnLi4vZG9tL0VsZW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9FdmVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0V2ZW50TGlzdGVuZXIuaWRsJywKLSAgICAgICAgJy4uL2RvbS9FdmVudFRhcmdldC5pZGwnLAotICAgICAgICAnLi4vZG9tL0Zsb2F0MzJBcnJheS5pZGwnLAotICAgICAgICAnLi4vZG9tL0Zsb2F0NjRBcnJheS5pZGwnLAotICAgICAgICAnLi4vZG9tL0ZvY3VzRXZlbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9IaXN0b3J5LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTEFuY2hvckVsZW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9IVE1MQm9keUVsZW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9IVE1MQlJFbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTENvbGxlY3Rpb24uaWRsJywKLSAgICAgICAgJy4uL2RvbS9IVE1MRGl2RWxlbWVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0hUTUxFbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTEhlYWRFbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTEhlYWRpbmdFbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTEh0bWxFbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTEltYWdlRWxlbWVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0hUTUxMaW5rRWxlbWVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0hUTUxNZWRpYUVsZW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9IVE1MTWV0YUVsZW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9IVE1MUGFyYWdyYXBoRWxlbWVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0hUTUxTY3JpcHRFbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTFNwYW5FbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTFN0eWxlRWxlbWVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0hUTUxUaXRsZUVsZW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9IVE1MVW5rbm93bkVsZW1lbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9IVE1MVmlkZW9FbGVtZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vS2V5Ym9hcmRFdmVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL0xvY2F0aW9uLmlkbCcsCi0gICAgICAgICcuLi9kb20vTWVkaWFFcnJvci5pZGwnLAotICAgICAgICAnLi4vZG9tL01lZGlhS2V5Q29tcGxldGVFdmVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL01lZGlhS2V5RXJyb3IuaWRsJywKLSAgICAgICAgJy4uL2RvbS9NZWRpYUtleUVycm9yRXZlbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9NZWRpYUtleU1lc3NhZ2VFdmVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL01lZGlhS2V5TmVlZGVkRXZlbnQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9NZWRpYVF1ZXJ5TGlzdC5pZGwnLAotICAgICAgICAnLi4vZG9tL01lZGlhU291cmNlLmlkbCcsCi0gICAgICAgICcuLi9kb20vTWVtb3J5SW5mby5pZGwnLAotICAgICAgICAnLi4vZG9tL01pbWVUeXBlQXJyYXkuaWRsJywKLSAgICAgICAgJy4uL2RvbS9OYW1lZE5vZGVNYXAuaWRsJywKLSAgICAgICAgJy4uL2RvbS9OYXZpZ2F0b3IuaWRsJywKLSAgICAgICAgJy4uL2RvbS9Ob2RlLmlkbCcsCi0gICAgICAgICcuLi9kb20vTm9kZUxpc3QuaWRsJywKLSAgICAgICAgJy4uL2RvbS9QZXJmb3JtYW5jZS5pZGwnLAotICAgICAgICAnLi4vZG9tL1BlcmZvcm1hbmNlVGltaW5nLmlkbCcsCi0gICAgICAgICcuLi9kb20vUGx1Z2luQXJyYXkuaWRsJywKLSAgICAgICAgJy4uL2RvbS9Qcm9ncmVzc0V2ZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vU2NyZWVuLmlkbCcsCi0gICAgICAgICcuLi9kb20vU2VjdXJpdHlQb2xpY3lWaW9sYXRpb25FdmVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL1NvdXJjZUJ1ZmZlci5pZGwnLAotICAgICAgICAnLi4vZG9tL1NvdXJjZUJ1ZmZlckxpc3QuaWRsJywKLSAgICAgICAgJy4uL2RvbS9TdG9yYWdlLmlkbCcsCi0gICAgICAgICcuLi9kb20vU3RvcmFnZUV2ZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vVGVzdFJ1bm5lci5pZGwnLAotICAgICAgICAnLi4vZG9tL1RleHQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9UaW1lUmFuZ2VzLmlkbCcsCi0gICAgICAgICcuLi9kb20vVHJhbnNpdGlvbkV2ZW50LmlkbCcsCi0gICAgICAgICcuLi9kb20vVUlFdmVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL1VpbnQxNkFycmF5LmlkbCcsCi0gICAgICAgICcuLi9kb20vVWludDMyQXJyYXkuaWRsJywKLSAgICAgICAgJy4uL2RvbS9VaW50OEFycmF5LmlkbCcsCi0gICAgICAgICcuLi9kb20vVVJMLmlkbCcsCi0gICAgICAgICcuLi9kb20vVmlkZW9QbGF5YmFja1F1YWxpdHkuaWRsJywKLSAgICAgICAgJy4uL2RvbS9XaW5kb3cuaWRsJywKLSAgICAgICAgJy4uL2RvbS9YTUxEb2N1bWVudC5pZGwnLAotICAgICAgICAnLi4vZG9tL1hNTFNlcmlhbGl6ZXIuaWRsJywKLQotICAgICAgICAnLi4vaDV2Y2MvZGlhbC9EaWFsSHR0cFJlcXVlc3QuaWRsJywKLSAgICAgICAgJy4uL2g1dmNjL2RpYWwvRGlhbEh0dHBSZXNwb25zZS5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvZGlhbC9EaWFsU2VydmVyLmlkbCcsCi0gICAgICAgICcuLi9oNXZjYy9INXZjYy5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NBY2NvdW50SW5mby5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NBY2NvdW50TWFuYWdlci5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NBdWRpb0NvbmZpZy5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NBdWRpb0NvbmZpZ0FycmF5LmlkbCcsCi0gICAgICAgICcuLi9oNXZjYy9INXZjY0NWYWwuaWRsJywKLSAgICAgICAgJy4uL2g1dmNjL0g1dmNjQ1ZhbEtleUxpc3QuaWRsJywKLSAgICAgICAgJy4uL2g1dmNjL0g1dmNjRGVlcExpbmtFdmVudFRhcmdldC5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NSdW50aW1lLmlkbCcsCi0gICAgICAgICcuLi9oNXZjYy9INXZjY1J1bnRpbWVFdmVudFRhcmdldC5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NTZXR0aW5ncy5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NTdG9yYWdlLmlkbCcsCi0gICAgICAgICcuLi9oNXZjYy9INXZjY1N5c3RlbS5pZGwnLAotICAgICAgICAnLi4vaDV2Y2MvSDV2Y2NUcmFjZUV2ZW50LmlkbCcsCi0KLSAgICAgICAgJy4uL3NwZWVjaC9TcGVlY2hSZWNvZ25pdGlvbi5pZGwnLAotICAgICAgICAnLi4vc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUuaWRsJywKLSAgICAgICAgJy4uL3NwZWVjaC9TcGVlY2hSZWNvZ25pdGlvbkVycm9yLmlkbCcsCi0gICAgICAgICcuLi9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25FdmVudC5pZGwnLAotICAgICAgICAnLi4vc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uUmVzdWx0LmlkbCcsCi0gICAgICAgICcuLi9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25SZXN1bHRMaXN0LmlkbCcsCi0KLSAgICAgICAgJy4uL3dlYl9hbmltYXRpb25zL0FuaW1hdGFibGUuaWRsJywKLSAgICAgICAgJy4uL3dlYl9hbmltYXRpb25zL0FuaW1hdGlvbi5pZGwnLAotICAgICAgICAnLi4vd2ViX2FuaW1hdGlvbnMvQW5pbWF0aW9uRWZmZWN0UmVhZE9ubHkuaWRsJywKLSAgICAgICAgJy4uL3dlYl9hbmltYXRpb25zL0FuaW1hdGlvbkVmZmVjdFRpbWluZ1JlYWRPbmx5LmlkbCcsCi0gICAgICAgICcuLi93ZWJfYW5pbWF0aW9ucy9BbmltYXRpb25UaW1lbGluZS5pZGwnLAotICAgICAgICAnLi4vd2ViX2FuaW1hdGlvbnMvS2V5ZnJhbWUuaWRsJywKLSAgICAgICAgJy4uL3dlYl9hbmltYXRpb25zL0tleWZyYW1lRWZmZWN0UmVhZE9ubHkuaWRsJywKLQotICAgICAgICAnLi4vd2ViZHJpdmVyL1NjcmlwdEV4ZWN1dG9yLmlkbCcsCi0gICAgICAgICcuLi93ZWJkcml2ZXIvU2NyaXB0RXhlY3V0b3JQYXJhbXMuaWRsJywKLSAgICAgICAgJy4uL3dlYmRyaXZlci9TY3JpcHRFeGVjdXRvclJlc3VsdC5pZGwnLAotCi0gICAgICAgICcuLi93ZWJzb2NrZXQvV2ViU29ja2V0LmlkbCcsCi0KLSAgICAgICAgJy4uL3hoci9YTUxIdHRwUmVxdWVzdC5pZGwnLAotICAgICAgICAnLi4veGhyL1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQuaWRsJywKLSAgICAgICAgJy4uL3hoci9YTUxIdHRwUmVxdWVzdFVwbG9hZC5pZGwnLAotICAgIF0sCi0KLSAgICAjIFBhcnRpYWwgaW50ZXJmYWNlcyBhbmQgdGhlIHJpZ2h0LXNpZGUgb2YgImltcGxlbWVudHMiLiBBbHNvIGluY2x1ZGVzCi0gICAgIyBjYWxsYmFjayBpbnRlcmZhY2VzLgotICAgICMgQ29kZSB3aWxsIG5vdCBnZXQgZ2VuZXJhdGVkIGZvciB0aGVzZSBpbnRlcmZhY2VzOyB0aGV5IGFyZSB1c2VkIHRvIGFkZAotICAgICMgZnVuY3Rpb25hbGl0eSB0byBvdGhlciBpbnRlcmZhY2VzLgotICAgICdkZXBlbmRlbmN5X2lkbF9maWxlcyc6IFsKLSAgICAgICAgJy4uL2Nzc29tL0xpbmtTdHlsZS5pZGwnLAotCi0gICAgICAgICcuLi9kb20vRG9jdW1lbnRfQ1NTT00uaWRsJywKLSAgICAgICAgJy4uL2RvbS9Eb2N1bWVudF9IVE1MNS5pZGwnLAotICAgICAgICAnLi4vZG9tL0RvY3VtZW50X1dlYkFuaW1hdGlvbnNBUEkuaWRsJywKLSAgICAgICAgJy4uL2RvbS9FbGVtZW50X0NTU09NVmlldy5pZGwnLAotICAgICAgICAnLi4vZG9tL0VsZW1lbnRfRE9NUGFyc2luZ0FuZFNlcmlhbGl6YXRpb24uaWRsJywKLSAgICAgICAgJy4uL2RvbS9FbGVtZW50Q1NTSW5saW5lU3R5bGUuaWRsJywKLSAgICAgICAgJy4uL2RvbS9HbG9iYWxDcnlwdG8uaWRsJywKLSAgICAgICAgJy4uL2RvbS9HbG9iYWxFdmVudEhhbmRsZXJzLmlkbCcsCi0gICAgICAgICcuLi9kb20vSFRNTEVsZW1lbnRfQ1NTT01WaWV3LmlkbCcsCi0gICAgICAgICcuLi9kb20vTmF2aWdhdG9ySUQuaWRsJywKLSAgICAgICAgJy4uL2RvbS9OYXZpZ2F0b3JMYW5ndWFnZS5pZGwnLAotICAgICAgICAnLi4vZG9tL05hdmlnYXRvclBsdWdpbnMuaWRsJywKLSAgICAgICAgJy4uL2RvbS9OYXZpZ2F0b3JTdG9yYWdlVXRpbHMuaWRsJywKLSAgICAgICAgJy4uL2RvbS9Ob25Eb2N1bWVudFR5cGVDaGlsZE5vZGUuaWRsJywKLSAgICAgICAgJy4uL2RvbS9Ob25FbGVtZW50UGFyZW50Tm9kZS5pZGwnLAotICAgICAgICAnLi4vZG9tL1BhcmVudE5vZGUuaWRsJywKLSAgICAgICAgJy4uL2RvbS9QZXJmb3JtYW5jZV9IaWdoUmVzb2x1dGlvblRpbWUuaWRsJywKLSAgICAgICAgJy4uL2RvbS9VUkxVdGlscy5pZGwnLAotICAgICAgICAnLi4vZG9tL1dpbmRvd19BbmltYXRpb25UaW1pbmcuaWRsJywKLSAgICAgICAgJy4uL2RvbS9XaW5kb3dfQ1NTT00uaWRsJywKLSAgICAgICAgJy4uL2RvbS9XaW5kb3dfQ1NTT01WaWV3LmlkbCcsCi0gICAgICAgICcuLi9kb20vV2luZG93X1BlcmZvcm1hbmNlLmlkbCcsCi0gICAgICAgICcuLi9kb20vV2luZG93RXZlbnRIYW5kbGVycy5pZGwnLAotICAgICAgICAnLi4vZG9tL1dpbmRvd0xvY2FsU3RvcmFnZS5pZGwnLAotICAgICAgICAnLi4vZG9tL1dpbmRvd1Nlc3Npb25TdG9yYWdlLmlkbCcsCi0gICAgICAgICcuLi9kb20vV2luZG93VGltZXJzLmlkbCcsCi0gICAgXSwKLSAgfSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXAgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyNGEwZmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9iaW5kaW5nc19nZW4uZ3lwCkBAIC0wLDAgKzEsMjQ1IEBACisjIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ2luY2x1ZGVzJzogWworICAgICcuLi9iaW5kaW5ncy9iaW5kaW5ncy5neXBpJywKKyAgXSwKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAjIEJhc2UgZGlyZWN0b3J5IGludG8gd2hpY2ggZ2VuZXJhdGVkIHNvdXJjZXMgYW5kIGludGVybWVkaWF0ZSBmaWxlcyBzaG91bGQKKyAgICAjIGJlIGdlbmVyYXRlZC4KKyAgICAnYmluZGluZ3Nfb3V0cHV0X2Rpcic6ICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKS9iaW5kaW5ncy9icm93c2VyJywKKworICAgICMgQmluZGluZ3MgZm9yIHRoZSBpbnRlcmZhY2VzIGluIHRoaXMgbGlzdCB3aWxsIGJlIGdlbmVyYXRlZCwgYW5kIHRoZXJlIG11c3QKKyAgICAjIGJlIGFuIGltcGxlbWVudGF0aW9uIGRlY2xhcmVkIGluIGEgaGVhZGVyIHRoYXQgbGl2ZXMgaW4gdGhlIHNhbWUKKyAgICAjIGRpcmVjdG9yeSBvZiBlYWNoIElETC4KKyAgICAnc291cmNlX2lkbF9maWxlcyc6IFsKKyAgICAgICAgJy4uL2F1ZGlvL2F1ZGlvX2J1ZmZlci5pZGwnLAorICAgICAgICAnLi4vYXVkaW8vYXVkaW9fYnVmZmVyX3NvdXJjZV9ub2RlLmlkbCcsCisgICAgICAgICcuLi9hdWRpby9hdWRpb19jb250ZXh0LmlkbCcsCisgICAgICAgICcuLi9hdWRpby9hdWRpb19kZXN0aW5hdGlvbl9ub2RlLmlkbCcsCisgICAgICAgICcuLi9hdWRpby9hdWRpb19ub2RlLmlkbCcsCisKKyAgICAgICAgJy4uL2Nzc29tL2Nzcy5pZGwnLAorICAgICAgICAnLi4vY3Nzb20vY3NzX2NvbmRpdGlvbl9ydWxlLmlkbCcsCisgICAgICAgICcuLi9jc3NvbS9jc3NfZ3JvdXBpbmdfcnVsZS5pZGwnLAorICAgICAgICAnLi4vY3Nzb20vY3NzX2ZvbnRfZmFjZV9ydWxlLmlkbCcsCisgICAgICAgICcuLi9jc3NvbS9jc3NfbWVkaWFfcnVsZS5pZGwnLAorICAgICAgICAnLi4vY3Nzb20vY3NzX2tleWZyYW1lX3J1bGUuaWRsJywKKyAgICAgICAgJy4uL2Nzc29tL2Nzc19rZXlmcmFtZXNfcnVsZS5pZGwnLAorICAgICAgICAnLi4vY3Nzb20vY3NzX3J1bGUuaWRsJywKKyAgICAgICAgJy4uL2Nzc29tL2Nzc19ydWxlX2xpc3QuaWRsJywKKyAgICAgICAgJy4uL2Nzc29tL2Nzc19zdHlsZV9kZWNsYXJhdGlvbi5pZGwnLAorICAgICAgICAnLi4vY3Nzb20vY3NzX3N0eWxlX3J1bGUuaWRsJywKKyAgICAgICAgJy4uL2Nzc29tL2Nzc19zdHlsZV9zaGVldC5pZGwnLAorICAgICAgICAnLi4vY3Nzb20vbWVkaWFfbGlzdC5pZGwnLAorICAgICAgICAnLi4vY3Nzb20vc3R5bGVfc2hlZXQuaWRsJywKKyAgICAgICAgJy4uL2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuaWRsJywKKworICAgICAgICAnLi4vZGVidWcvZGVidWdfaHViLmlkbCcsCisgICAgICAgICcuLi9kZWJ1Zy9kZWJ1Z2dlci5pZGwnLAorICAgICAgICAnLi4vZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmlkbCcsCisgICAgICAgICcuLi9kZWJ1Zy9kZWJ1Z19zY3JpcHRfcnVubmVyLmlkbCcsCisKKyAgICAgICAgJy4uL2RvbS9hbmltYXRpb25fZXZlbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9hcnJheV9idWZmZXIuaWRsJywKKyAgICAgICAgJy4uL2RvbS9hcnJheV9idWZmZXJfdmlldy5pZGwnLAorICAgICAgICAnLi4vZG9tL2F0dHIuaWRsJywKKyAgICAgICAgJy4uL2RvbS9hdWRpb190cmFjay5pZGwnLAorICAgICAgICAnLi4vZG9tL2F1ZGlvX3RyYWNrX2xpc3QuaWRsJywKKyAgICAgICAgJy4uL2RvbS9ibG9iLmlkbCcsCisgICAgICAgICcuLi9kb20vY2RhdGFfc2VjdGlvbi5pZGwnLAorICAgICAgICAnLi4vZG9tL2NoYXJhY3Rlcl9kYXRhLmlkbCcsCisgICAgICAgICcuLi9kb20vY29tbWVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2NvbnNvbGUuaWRsJywKKyAgICAgICAgJy4uL2RvbS9jcnlwdG8uaWRsJywKKyAgICAgICAgJy4uL2RvbS9kYXRhX3ZpZXcuaWRsJywKKyAgICAgICAgJy4uL2RvbS9kb2N1bWVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2RvY3VtZW50X3RpbWVsaW5lLmlkbCcsCisgICAgICAgICcuLi9kb20vZG9jdW1lbnRfdHlwZS5pZGwnLAorICAgICAgICAnLi4vZG9tL2RvbV9leGNlcHRpb24uaWRsJywKKyAgICAgICAgJy4uL2RvbS9kb21faW1wbGVtZW50YXRpb24uaWRsJywKKyAgICAgICAgJy4uL2RvbS9kb21fcGFyc2VyLmlkbCcsCisgICAgICAgICcuLi9kb20vZG9tX3JlY3QuaWRsJywKKyAgICAgICAgJy4uL2RvbS9kb21fcmVjdF9saXN0LmlkbCcsCisgICAgICAgICcuLi9kb20vZG9tX3JlY3RfcmVhZF9vbmx5LmlkbCcsCisgICAgICAgICcuLi9kb20vZG9tX3N0cmluZ19tYXAuaWRsJywKKyAgICAgICAgJy4uL2RvbS9kb21fdG9rZW5fbGlzdC5pZGwnLAorICAgICAgICAnLi4vZG9tL2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2V2ZW50X2xpc3RlbmVyLmlkbCcsCisgICAgICAgICcuLi9kb20vZXZlbnRfdGFyZ2V0LmlkbCcsCisgICAgICAgICcuLi9kb20vZmxvYXQzMl9hcnJheS5pZGwnLAorICAgICAgICAnLi4vZG9tL2Zsb2F0NjRfYXJyYXkuaWRsJywKKyAgICAgICAgJy4uL2RvbS9mb2N1c19ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2hpc3RvcnkuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX2FuY2hvcl9lbGVtZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vaHRtbF9ib2R5X2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX2JyX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX2NvbGxlY3Rpb24uaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX2Rpdl9lbGVtZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vaHRtbF9lbGVtZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vaHRtbF9oZWFkX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX2hlYWRpbmdfZWxlbWVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2h0bWxfaHRtbF9lbGVtZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vaHRtbF9saW5rX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX21ldGFfZWxlbWVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2h0bWxfcGFyYWdyYXBoX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vaHRtbF9zcGFuX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX3N0eWxlX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9odG1sX3Vua25vd25fZWxlbWVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2h0bWxfdmlkZW9fZWxlbWVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL2tleWJvYXJkX2V2ZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vbG9jYXRpb24uaWRsJywKKyAgICAgICAgJy4uL2RvbS9tZWRpYV9lcnJvci5pZGwnLAorICAgICAgICAnLi4vZG9tL21lZGlhX2tleV9jb21wbGV0ZV9ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL21lZGlhX2tleV9lcnJvci5pZGwnLAorICAgICAgICAnLi4vZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50LmlkbCcsCisgICAgICAgICcuLi9kb20vbWVkaWFfa2V5X25lZWRlZF9ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL21lZGlhX3F1ZXJ5X2xpc3QuaWRsJywKKyAgICAgICAgJy4uL2RvbS9tZWRpYV9zb3VyY2UuaWRsJywKKyAgICAgICAgJy4uL2RvbS9tZW1vcnlfaW5mby5pZGwnLAorCScuLi9kb20vbWVzc2FnZV9ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL21pbWVfdHlwZV9hcnJheS5pZGwnLAorICAgICAgICAnLi4vZG9tL211dGF0aW9uX29ic2VydmVyLmlkbCcsCisgICAgICAgICcuLi9kb20vbXV0YXRpb25fcmVjb3JkLmlkbCcsCisgICAgICAgICcuLi9kb20vbmFtZWRfbm9kZV9tYXAuaWRsJywKKyAgICAgICAgJy4uL2RvbS9uYXZpZ2F0b3IuaWRsJywKKyAgICAgICAgJy4uL2RvbS9ub2RlLmlkbCcsCisgICAgICAgICcuLi9kb20vbm9kZV9saXN0LmlkbCcsCisgICAgICAgICcuLi9kb20vcGVyZm9ybWFuY2UuaWRsJywKKyAgICAgICAgJy4uL2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaWRsJywKKyAgICAgICAgJy4uL2RvbS9wbHVnaW5fYXJyYXkuaWRsJywKKyAgICAgICAgJy4uL2RvbS9wcm9ncmVzc19ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL3NjcmVlbi5pZGwnLAorICAgICAgICAnLi4vZG9tL3NlY3VyaXR5X3BvbGljeV92aW9sYXRpb25fZXZlbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS9zb3VyY2VfYnVmZmVyLmlkbCcsCisgICAgICAgICcuLi9kb20vc291cmNlX2J1ZmZlcl9saXN0LmlkbCcsCisgICAgICAgICcuLi9kb20vc3RvcmFnZS5pZGwnLAorICAgICAgICAnLi4vZG9tL3N0b3JhZ2VfZXZlbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS90ZXN0X3J1bm5lci5pZGwnLAorICAgICAgICAnLi4vZG9tL3RleHQuaWRsJywKKyAgICAgICAgJy4uL2RvbS90aW1lX3Jhbmdlcy5pZGwnLAorICAgICAgICAnLi4vZG9tL3RyYWNrX2RlZmF1bHQuaWRsJywKKyAgICAgICAgJy4uL2RvbS90cmFja19kZWZhdWx0X2xpc3QuaWRsJywKKyAgICAgICAgJy4uL2RvbS90cmFja19ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL3RyYW5zaXRpb25fZXZlbnQuaWRsJywKKyAgICAgICAgJy4uL2RvbS91aV9ldmVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL3VpbnQxNl9hcnJheS5pZGwnLAorICAgICAgICAnLi4vZG9tL3VpbnQzMl9hcnJheS5pZGwnLAorICAgICAgICAnLi4vZG9tL3VpbnQ4X2FycmF5LmlkbCcsCisgICAgICAgICcuLi9kb20vdXJsLmlkbCcsCisgICAgICAgICcuLi9kb20vdmlkZW9fcGxheWJhY2tfcXVhbGl0eS5pZGwnLAorICAgICAgICAnLi4vZG9tL3ZpZGVvX3RyYWNrLmlkbCcsCisgICAgICAgICcuLi9kb20vdmlkZW9fdHJhY2tfbGlzdC5pZGwnLAorICAgICAgICAnLi4vZG9tL3dpbmRvdy5pZGwnLAorICAgICAgICAnLi4vZG9tL3htbF9kb2N1bWVudC5pZGwnLAorICAgICAgICAnLi4vZG9tL3htbF9zZXJpYWxpemVyLmlkbCcsCisKKyAgICAgICAgJy4uL2g1dmNjL2RpYWwvZGlhbF9odHRwX3JlcXVlc3QuaWRsJywKKyAgICAgICAgJy4uL2g1dmNjL2RpYWwvZGlhbF9odHRwX3Jlc3BvbnNlLmlkbCcsCisgICAgICAgICcuLi9oNXZjYy9kaWFsL2RpYWxfc2VydmVyLmlkbCcsCisgICAgICAgICcuLi9oNXZjYy9oNXZjYy5pZGwnLAorICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfYWNjZXNzaWJpbGl0eS5pZGwnLAorICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfYWNjb3VudF9pbmZvLmlkbCcsCisgICAgICAgICcuLi9oNXZjYy9oNXZjY19hY2NvdW50X21hbmFnZXIuaWRsJywKKyAgICAgICAgJy4uL2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZy5pZGwnLAorICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnX2FycmF5LmlkbCcsCisgICAgICAgICcuLi9oNXZjYy9oNXZjY19jX3ZhbC5pZGwnLAorICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfY192YWxfa2V5X2xpc3QuaWRsJywKKyAgICAgICAgJy4uL2g1dmNjL2g1dmNjX2NyYXNoX2xvZy5pZGwnLAorICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfZGVlcF9saW5rX2V2ZW50X3RhcmdldC5pZGwnLAorICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfcnVudGltZS5pZGwnLAorICAgICAgICAnLi4vaDV2Y2MvaDV2Y2NfcnVudGltZV9ldmVudF90YXJnZXQuaWRsJywKKyAgICAgICAgJy4uL2g1dmNjL2g1dmNjX3NldHRpbmdzLmlkbCcsCisgICAgICAgICcuLi9oNXZjYy9oNXZjY19zdG9yYWdlLmlkbCcsCisgICAgICAgICcuLi9oNXZjYy9oNXZjY19zeXN0ZW0uaWRsJywKKyAgICAgICAgJy4uL2g1dmNjL2g1dmNjX3RyYWNlX2V2ZW50LmlkbCcsCisKKyAgICAgICAgJy4uL21lZGlhX3Nlc3Npb24vbWVkaWFfbWV0YWRhdGEuaWRsJywKKyAgICAgICAgJy4uL21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5pZGwnLAorCisgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uLmlkbCcsCisgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmlkbCcsCisgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmlkbCcsCisgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2V2ZW50LmlkbCcsCisgICAgICAgICcuLi9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdC5pZGwnLAorICAgICAgICAnLi4vc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHRfbGlzdC5pZGwnLAorCisgICAgICAgICcuLi93ZWJfYW5pbWF0aW9ucy9hbmltYXRhYmxlLmlkbCcsCisgICAgICAgICcuLi93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uaWRsJywKKyAgICAgICAgJy4uL3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9lZmZlY3RfcmVhZF9vbmx5LmlkbCcsCisgICAgICAgICcuLi93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3RpbWluZ19yZWFkX29ubHkuaWRsJywKKyAgICAgICAgJy4uL3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl90aW1lbGluZS5pZGwnLAorICAgICAgICAnLi4vd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWUuaWRsJywKKyAgICAgICAgJy4uL3dlYl9hbmltYXRpb25zL2tleWZyYW1lX2VmZmVjdF9yZWFkX29ubHkuaWRsJywKKworICAgICAgICAnLi4vd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvci5pZGwnLAorICAgICAgICAnLi4vd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvcl9wYXJhbXMuaWRsJywKKyAgICAgICAgJy4uL3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3JfcmVzdWx0LmlkbCcsCisKKyAgICAgICAgJy4uL3dlYnNvY2tldC93ZWJfc29ja2V0LmlkbCcsCisKKyAgICAgICAgJy4uL3hoci94bWxfaHR0cF9yZXF1ZXN0LmlkbCcsCisgICAgICAgICcuLi94aHIveG1sX2h0dHBfcmVxdWVzdF9ldmVudF90YXJnZXQuaWRsJywKKyAgICAgICAgJy4uL3hoci94bWxfaHR0cF9yZXF1ZXN0X3VwbG9hZC5pZGwnLAorICAgIF0sCisKKyAgICAnZGljdGlvbmFyeV9pZGxfZmlsZXMnOiBbCisgICAgICAgICcuLi9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfaW5pdC5pZGwnLAorICAgICAgICAnLi4vbWVkaWFfc2Vzc2lvbi9tZWRpYV9tZXRhZGF0YV9pbml0LmlkbCcsCisgICAgXSwKKworICAgICMgUGFydGlhbCBpbnRlcmZhY2VzIGFuZCB0aGUgcmlnaHQtc2lkZSBvZiAiaW1wbGVtZW50cyIuIEFsc28gaW5jbHVkZXMKKyAgICAjIGNhbGxiYWNrIGludGVyZmFjZXMuCisgICAgIyBDb2RlIHdpbGwgbm90IGdldCBnZW5lcmF0ZWQgZm9yIHRoZXNlIGludGVyZmFjZXM7IHRoZXkgYXJlIHVzZWQgdG8gYWRkCisgICAgIyBmdW5jdGlvbmFsaXR5IHRvIG90aGVyIGludGVyZmFjZXMuCisgICAgJ2RlcGVuZGVuY3lfaWRsX2ZpbGVzJzogWworICAgICAgICAnLi4vY3Nzb20vbGlua19zdHlsZS5pZGwnLAorCisgICAgICAgICcuLi9kb20vZG9jdW1lbnRfY3Nzb20uaWRsJywKKyAgICAgICAgJy4uL2RvbS9kb2N1bWVudF9odG1sNS5pZGwnLAorICAgICAgICAnLi4vZG9tL2RvY3VtZW50X193ZWJfYW5pbWF0aW9uc19hcGkuaWRsJywKKyAgICAgICAgJy4uL2RvbS9lbGVtZW50X2Nzc29tX3ZpZXcuaWRsJywKKyAgICAgICAgJy4uL2RvbS9lbGVtZW50X2RvbV9wYXJzaW5nX2FuZF9zZXJpYWxpemF0aW9uLmlkbCcsCisgICAgICAgICcuLi9kb20vZWxlbWVudF9jc3NfaW5saW5lX3N0eWxlLmlkbCcsCisgICAgICAgICcuLi9kb20vZ2xvYmFsX2NyeXB0by5pZGwnLAorICAgICAgICAnLi4vZG9tL2dsb2JhbF9ldmVudF9oYW5kbGVycy5pZGwnLAorICAgICAgICAnLi4vZG9tL2h0bWxfZWxlbWVudF9jc3NvbV92aWV3LmlkbCcsCisgICAgICAgICcuLi9kb20vbmF2aWdhdG9yX2lkLmlkbCcsCisgICAgICAgICcuLi9kb20vbmF2aWdhdG9yX2xhbmd1YWdlLmlkbCcsCisgICAgICAgICcuLi9kb20vbmF2aWdhdG9yX3BsdWdpbnMuaWRsJywKKyAgICAgICAgJy4uL2RvbS9uYXZpZ2F0b3Jfc3RvcmFnZV91dGlscy5pZGwnLAorICAgICAgICAnLi4vZG9tL25vbl9kb2N1bWVudF90eXBlX2NoaWxkX25vZGUuaWRsJywKKyAgICAgICAgJy4uL2RvbS9ub25fZWxlbWVudF9wYXJlbnRfbm9kZS5pZGwnLAorICAgICAgICAnLi4vZG9tL3BhcmVudF9ub2RlLmlkbCcsCisgICAgICAgICcuLi9kb20vcGVyZm9ybWFuY2VfX2hpZ2hfcmVzb2x1dGlvbl90aW1lLmlkbCcsCisgICAgICAgICcuLi9kb20vdXJsX3V0aWxzLmlkbCcsCisgICAgICAgICcuLi9kb20vd2luZG93X19hbmltYXRpb25fdGltaW5nLmlkbCcsCisgICAgICAgICcuLi9kb20vd2luZG93X2Nzc29tLmlkbCcsCisgICAgICAgICcuLi9kb20vd2luZG93X2Nzc29tX3ZpZXcuaWRsJywKKyAgICAgICAgJy4uL2RvbS93aW5kb3dfX3BlcmZvcm1hbmNlLmlkbCcsCisgICAgICAgICcuLi9kb20vd2luZG93X2V2ZW50X2hhbmRsZXJzLmlkbCcsCisgICAgICAgICcuLi9kb20vd2luZG93X2xvY2FsX3N0b3JhZ2UuaWRsJywKKyAgICAgICAgJy4uL2RvbS93aW5kb3dfc2Vzc2lvbl9zdG9yYWdlLmlkbCcsCisgICAgICAgICcuLi9kb20vd2luZG93X3RpbWVycy5pZGwnLAorICAgICAgICAnLi4vbWVkaWFfc2Vzc2lvbi9uYXZpZ2F0b3JfbWVkaWFfc2Vzc2lvbi5pZGwnLAorICAgIF0sCisgIH0sCit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuY2MKaW5kZXggMWJjZGMzYy4uYmZkNThiNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfbW9kdWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oIgogCkBAIC0xOTEsNyArMTg5LDggQEAKICAgICAgIHdlYl9tb2R1bGVfb3B0aW9uc18ob3B0aW9ucy53ZWJfbW9kdWxlX29wdGlvbnMpLAogICAgICAgaGFzX3Jlc3VtZWRfKHRydWUsIGZhbHNlKSwKICAgICAgIHdpbGxfcXVpdF8oZmFsc2UpLAotICAgICAgc3VzcGVuZGVkXyhmYWxzZSkgeworICAgICAgc3VzcGVuZGVkXyhmYWxzZSksCisgICAgICBzeXN0ZW1fd2luZG93XyhzeXN0ZW1fd2luZG93KSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwgIkJyb3dzZXJNb2R1bGU6OkJyb3dzZXJNb2R1bGUoKSIpOwogICAvLyBBbGwgYWxsb2NhdGlvbnMgZm9yIG1lZGlhIHdpbGwgYmUgdHJhY2tlZCBieSAiTWVkaWEiIG1lbW9yeSBzY29wZS4KICAgewpAQCAtMzM2LDcgKzMzNSw3IEBACiAgICAgICBiYXNlOjpCaW5kKCZCcm93c2VyTW9kdWxlOjpPbkVycm9yLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKICAgICAgIGJhc2U6OkJpbmQoJkJyb3dzZXJNb2R1bGU6Ok9uV2luZG93Q2xvc2UsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAogICAgICAgbWVkaWFfbW9kdWxlXy5nZXQoKSwgJm5ldHdvcmtfbW9kdWxlXywgdmlld3BvcnRfc2l6ZSwKLSAgICAgIHJlbmRlcmVyX21vZHVsZV8ucGlwZWxpbmUoKS0+R2V0UmVzb3VyY2VQcm92aWRlcigpLAorICAgICAgcmVuZGVyZXJfbW9kdWxlXy5waXBlbGluZSgpLT5HZXRSZXNvdXJjZVByb3ZpZGVyKCksIHN5c3RlbV93aW5kb3dfLAogICAgICAga0xheW91dE1heFJlZnJlc2hGcmVxdWVuY3lJbkh6LCBvcHRpb25zKSk7CiAgIGlmICghd2ViX21vZHVsZV9yZWNyZWF0ZWRfY2FsbGJhY2tfLmlzX251bGwoKSkgewogICAgIHdlYl9tb2R1bGVfcmVjcmVhdGVkX2NhbGxiYWNrXy5SdW4oKTsKQEAgLTM0Niw3ICszNDUsNyBAQAogdm9pZCBCcm93c2VyTW9kdWxlOjpPbkxvYWQoKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0Ojpicm93c2VyIiwgIkJyb3dzZXJNb2R1bGU6Ok9uTG9hZCgpIik7CiAgIC8vIFJlcG9zdCB0byBvdXIgb3duIG1lc3NhZ2UgbG9vcCBpZiBuZWNlc3NhcnkuIFRoaXMgYWxzbyBwcmV2ZW50cwotICAvLyBhc3luY2hvbnJvdXMgYWNjZXNzIHRvIHRoaXMgb2JqZWN0IGJ5IHx3ZWJfbW9kdWxlX3wgZHVyaW5nIGRlc3RydWN0aW9uLgorICAvLyBhc3luY2hyb25vdXMgYWNjZXNzIHRvIHRoaXMgb2JqZWN0IGJ5IHx3ZWJfbW9kdWxlX3wgZHVyaW5nIGRlc3RydWN0aW9uLgogICBpZiAoTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSAhPSBzZWxmX21lc3NhZ2VfbG9vcF8pIHsKICAgICBzZWxmX21lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAogICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJkJyb3dzZXJNb2R1bGU6Ok9uTG9hZCwgd2Vha190aGlzXykpOwpAQCAtMzU0LDYgKzM1MywxMSBAQAogICB9CiAKICAgRGVzdHJveVNwbGFzaFNjcmVlbigpOworCisgIC8vIFRoaXMgbG9nIGlzIHJlbGllZCBvbiBieSB0aGUgd2ViZHJpdmVyIGJlbmNobWFyayB0ZXN0cywgc28gaXQgc2hvdWxkbid0IGJlCisgIC8vIGNoYW5nZWQgdW5sZXNzIHRoZSBjb3JyZXNwb25kaW5nIGJlbmNobWFyayBsb2dpYyBpcyBjaGFuZ2VkIGFzIHdlbGwuCisgIExPRyhJTkZPKSA8PCAiTG9hZGVkIFdlYk1vZHVsZSI7CisKICAgd2ViX21vZHVsZV9sb2FkZWRfLlNpZ25hbCgpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlcl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCmluZGV4IGUyNzVkNTUuLjRkNGQyNjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9icm93c2VyX21vZHVsZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9CUk9XU0VSX01PRFVMRV9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9CUk9XU0VSX01PRFVMRV9IXwpAQCAtMzM2LDYgKzMzNCw4IEBACiAgIGJhc2U6OkxvY2sgcXVpdF9sb2NrXzsKIAogICBib29sIHN1c3BlbmRlZF87CisKKyAgc3lzdGVtX3dpbmRvdzo6U3lzdGVtV2luZG93KiBzeXN0ZW1fd2luZG93XzsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBicm93c2VyCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmNjCmluZGV4IDMzMmVlYmIuLmZmMjJkMmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCiAKQEAgLTE4NCw3ICsxODIsNyBAQAogICAgICAgYmFzZTo6QmluZCgmRGVidWdDb25zb2xlOjpPbkVycm9yLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKICAgICAgIGJhc2U6OkNsb3N1cmUoKSwgLyogd2luZG93X2Nsb3NlX2NhbGxiYWNrICovCiAgICAgICBtZWRpYV9tb2R1bGUsIG5ldHdvcmtfbW9kdWxlLCB3aW5kb3dfZGltZW5zaW9ucywgcmVzb3VyY2VfcHJvdmlkZXIsCi0gICAgICBsYXlvdXRfcmVmcmVzaF9yYXRlLCB3ZWJfbW9kdWxlX29wdGlvbnMpKTsKKyAgICAgIG1lZGlhX21vZHVsZS0+c3lzdGVtX3dpbmRvdygpLCBsYXlvdXRfcmVmcmVzaF9yYXRlLCB3ZWJfbW9kdWxlX29wdGlvbnMpKTsKIH0KIAogRGVidWdDb25zb2xlOjp+RGVidWdDb25zb2xlKCkge30KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS5oCmluZGV4IDUyNzI5OGQuLmZhODM4MjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JST1dTRVJfREVCVUdfQ09OU09MRV9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9ERUJVR19DT05TT0xFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9jb21tYW5kX2lucHV0LmpzIGIvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUvY29tbWFuZF9pbnB1dC5qcwppbmRleCA2ZWNhOWQwLi4wOGMxOGI0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9jb21tYW5kX2lucHV0LmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2NvbW1hbmRfaW5wdXQuanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAKIGZ1bmN0aW9uIENvbW1hbmRJbnB1dChlbGVtKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9jb25zb2xlX3ZhbHVlcy5qcyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2NvbnNvbGVfdmFsdWVzLmpzCmluZGV4IDY4MzMwOWQuLmIwYTdjNzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2NvbnNvbGVfdmFsdWVzLmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2NvbnNvbGVfdmFsdWVzLmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8gQ29uc29sZSB2YWx1ZXMgY29uc3RydWN0b3IKIGZ1bmN0aW9uIENvbnNvbGVWYWx1ZXMoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9kZWJ1Z19jb21tYW5kcy5qcyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2RlYnVnX2NvbW1hbmRzLmpzCmluZGV4IGM4M2MzYTcuLmU1MjAxZDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2RlYnVnX2NvbW1hbmRzLmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2RlYnVnX2NvbW1hbmRzLmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogZnVuY3Rpb24gaW5pdERlYnVnQ29tbWFuZHMoKSB7CiAgIGRlYnVnID0gbmV3IE9iamVjdCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUvZGVidWdfY29uc29sZS5qcyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2RlYnVnX2NvbnNvbGUuanMKaW5kZXggNmY1Njk2Mi4uZWQ2NWI5ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUvZGVidWdfY29uc29sZS5qcworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9kZWJ1Z19jb25zb2xlLmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogCiAvLyBUZXh0IHRoZSB1c2VyIGhhcyB0eXBlZCBzaW5jZSBsYXN0IGhpdHRpbmcgRW50ZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2RlYnVnZ2VyX2NsaWVudC5qcyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9kZWJ1Z19jb25zb2xlL2RlYnVnZ2VyX2NsaWVudC5qcwppbmRleCAyNTM4NjQ3Li4wYmYwNGM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9kZWJ1Z2dlcl9jbGllbnQuanMKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUvZGVidWdnZXJfY2xpZW50LmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogZnVuY3Rpb24gRGVidWdnZXJDbGllbnQoKSB7CiAgIHRoaXMuREVCVUdHRVJfREVUQUNIRUQgPSAwOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL2RlYnVnX2NvbnNvbGUvbWVzc2FnZV9sb2cuanMgYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9tZXNzYWdlX2xvZy5qcwppbmRleCAzNWM1Y2I1Li4yNmMxNjJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9tZXNzYWdlX2xvZy5qcworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvZGVidWdfY29uc29sZS9tZXNzYWdlX2xvZy5qcwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIAogLy8gVGhlIE1lc3NhZ2VMb2cgY2xhc3MgbWFuYWdlcyB0aGUgc3RvcmFnZSBhbmQgZGlzcGxheSBvZiBhbGwgbG9nIG1lc3NhZ2VzIGluCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvaDV2Y2NfdXJsX2hhbmRsZXIuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvaDV2Y2NfdXJsX2hhbmRsZXIuY2MKaW5kZXggMThiYTBjNi4uY2U0ODAyNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL2g1dmNjX3VybF9oYW5kbGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvaDV2Y2NfdXJsX2hhbmRsZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5oCmluZGV4IDVkOGRlZTIuLjAzZjJlNjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9oNXZjY191cmxfaGFuZGxlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9INVZDQ19VUkxfSEFORExFUl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9INVZDQ19VUkxfSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL21haW4uY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWFpbi5jYwppbmRleCA2YjVmZWYyLi45YjRmN2EzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWFpbi5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWFpbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvYnVmZmVyZWRfZmlsZV93cml0ZXIuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvYnVmZmVyZWRfZmlsZV93cml0ZXIuY2MKaW5kZXggNzc0ODQ2Ny4uM2E4NTU1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL2J1ZmZlcmVkX2ZpbGVfd3JpdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9idWZmZXJlZF9maWxlX3dyaXRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9idWZmZXJlZF9maWxlX3dyaXRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvYnVmZmVyZWRfZmlsZV93cml0ZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9idWZmZXJlZF9maWxlX3dyaXRlci5oCmluZGV4IGQ5ZDk3NTkuLjYzYzI1ZTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9idWZmZXJlZF9maWxlX3dyaXRlci5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9idWZmZXJlZF9maWxlX3dyaXRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9NRU1PUllfVFJBQ0tFUl9CVUZGRVJFRF9GSUxFX1dSSVRFUl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9NRU1PUllfVFJBQ0tFUl9CVUZGRVJFRF9GSUxFX1dSSVRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL21lbW9yeV90cmFja2VyX3Rvb2wuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbC5jYwppbmRleCA2ODdjMjFkLi5mMjFiNTQ0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbC5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbC5jYwpAQCAtMSwyMSArMSwyMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sLmgiCiAKKyNpbmNsdWRlIDxjc3RkbGliPgogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKQEAgLTIzLDEyICsyMiwyNyBAQAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sX2ltcGwuaCIKICNpbmNsdWRlICJuYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaGVscGVycy5oIgorI2luY2x1ZGUgIm5iL2xleGljYWxfY2FzdC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgYnJvd3NlciB7CiBuYW1lc3BhY2UgbWVtb3J5X3RyYWNrZXIgewogCisjaWYgIWRlZmluZWQoU1RBUkJPQVJEX0FMTE9XU19NRU1PUllfVFJBQ0tJTkcpCisvLyBOdWxsIGltcGxlbWVudGF0aW9uIGZvciBtZW1vcnkgdHJhY2tlciB0b29sLgorY2xhc3MgTWVtb3J5VHJhY2tlclRvb2xOdWxsIDogcHVibGljIE1lbW9yeVRyYWNrZXJUb29sIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgfk1lbW9yeVRyYWNrZXJUb29sTnVsbCgpIHt9Cit9OworCisvLyBJbnN0YW50aWF0ZXMgdGhlIG1lbW9yeSB0cmFja2VyIHRvb2wgZnJvbSB0aGUgY29tbWFuZCBhcmd1bWVudC4KK3Njb3BlZF9wdHI8TWVtb3J5VHJhY2tlclRvb2w+IENyZWF0ZU1lbW9yeVRyYWNrZXJUb29sKGNvbnN0IHN0ZDo6c3RyaW5nJikgeworICByZXR1cm4gc2NvcGVkX3B0cjxNZW1vcnlUcmFja2VyVG9vbD4obmV3IE1lbW9yeVRyYWNrZXJUb29sTnVsbCk7Cit9CisKKyNlbHNlCisKIHVzaW5nIG5iOjphbmFseXRpY3M6Ok1lbW9yeVRyYWNrZXI7CiAKIG5hbWVzcGFjZSB7CkBAIC0zOSw2ICs1Myw4IEBACiAgIGtDb21wcmVzc2VkVGltZXNlcmllcywKICAga0Jpbm5lckFuYWx5dGljcywKICAga0FsbG9jYXRpb25Mb2dnZXIsCisgIGtMZWFrVHJhY2VyLAorICBrSmF2YXNjcmlwdExlYWtUcmFjZXIsCiB9OwogCiBzdHJ1Y3QgU3dpdGNoVmFsIHsKQEAgLTExNiw3ICsxMzIsNyBAQAogICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBTd2l0Y2hWYWw+IFN3aXRjaE1hcDsKIAogICBTd2l0Y2hWYWwgc3RhcnR1cF90b29sKAotICAgICAgInN0YXJ0dXAiLCAgLy8gTmFtZSBvZiB0b29sLgorICAgICAgInN0YXJ0dXAobnVtX21pbnM9MSkiLCAgLy8gTmFtZSBvZiB0b29sLgogICAgICAgIlJlY29yZHMgaGlnaC1mcmVxdWVuY3kgbWVtb3J5IG1ldHJpY3MgZm9yIHRoZSBmaXJzdCA2MCAiCiAgICAgICAic2Vjb25kcyBvZiBwcm9ncmFtIGxhdW5jaCBhbmQgdGhlbiBkdW1wcyBpdCBvdXQgaW4gQ1NWIGZvcm1hdCAiCiAgICAgICAidG8gc3Rkb3V0LiIsCkBAIC0xMzgsNyArMTU0LDcgQEAKICAgICAgIGtDb21wcmVzc2VkVGltZXNlcmllcyk7CiAKICAgU3dpdGNoVmFsIGJpbm5lcl90b29sKAotICAgICAgImJpbm5lciIsCisgICAgICAiYmlubmVyKHJlZ2lvbj1OVUxMKSIsCiAgICAgICAiRHVtcHMgbWVtb3J5IHN0YXRpc3RpY3Mgb25jZSBhIHNlY29uZCBpbiBDU1YgZm9ybWF0IHRvIHN0ZG91dC4gIgogICAgICAgIlRoZSBkZWZhdWx0IG1lbW9yeSByZWdpb24gaXMgYWxsIG1lbW9yeSByZWdpb25zLiBQYXNzIHRoZSAiCiAgICAgICAibmFtZSBvZiB0aGUgbWVtb3J5IHJlZ2lvbiB0byBzcGVjaWZ5IHRoYXQgb25seSB0aGF0IG1lbW9yeSByZWdpb24gIgpAQCAtMTUzLDEyICsxNjksMjggQEAKICAgICAgICJieSBrU2JTeXN0ZW1QYXRoRGVidWdPdXRwdXREaXJlY3RvcnkuIiwKICAgICAgIGtBbGxvY2F0aW9uTG9nZ2VyKTsKIAorICBTd2l0Y2hWYWwgbGVha190cmFjaW5nX3Rvb2woCisgICAgICAibGVha190cmFjZXIiLAorICAgICAgIkF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBsZWFrcyBhbmQgcmVwb3J0cyB0aGVtIGluIENTViBmb3JtYXQuIiwKKyAgICAgIGtMZWFrVHJhY2VyKTsKKworICBTd2l0Y2hWYWwganNfbGVha190cmFjaW5nX3Rvb2woCisgICAgICAianNfbGVha190cmFjZXIiLAorICAgICAgIkF1dG9tYXRpY2FsbHkgZGV0ZWN0cyBKYXZhc2NyaXB0IGxlYWtzIGFuZCByZXBvcnRzIHRoZW0gaW4gQ1NWIGZvcm1hdC4iLAorICAgICAga0phdmFzY3JpcHRMZWFrVHJhY2VyKTsKKwogICBTd2l0Y2hNYXAgc3dpdGNoX21hcDsKLSAgc3dpdGNoX21hcFtzdGFydHVwX3Rvb2wudG9vbF9uYW1lXSA9IHN0YXJ0dXBfdG9vbDsKLSAgc3dpdGNoX21hcFtjb250aW51b3VzX3ByaW50ZXJfdG9vbC50b29sX25hbWVdID0gY29udGludW91c19wcmludGVyX3Rvb2w7Ci0gIHN3aXRjaF9tYXBbY29tcHJlc3NlZF90aW1lc2VyaWVzX3Rvb2wudG9vbF9uYW1lXSA9IGNvbXByZXNzZWRfdGltZXNlcmllc190b29sOwotICBzd2l0Y2hfbWFwW2Jpbm5lcl90b29sLnRvb2xfbmFtZV0gPSBiaW5uZXJfdG9vbDsKLSAgc3dpdGNoX21hcFthbGxvY2F0aW9uX2xvZ2dlcl90b29sLnRvb2xfbmFtZV0gPSBhbGxvY2F0aW9uX2xvZ2dlcl90b29sOworICBzd2l0Y2hfbWFwW1BhcnNlVG9vbE5hbWUoc3RhcnR1cF90b29sLnRvb2xfbmFtZSldID0gc3RhcnR1cF90b29sOworICBzd2l0Y2hfbWFwW1BhcnNlVG9vbE5hbWUoY29udGludW91c19wcmludGVyX3Rvb2wudG9vbF9uYW1lKV0gPQorICAgICAgY29udGludW91c19wcmludGVyX3Rvb2w7CisgIHN3aXRjaF9tYXBbUGFyc2VUb29sTmFtZShjb21wcmVzc2VkX3RpbWVzZXJpZXNfdG9vbC50b29sX25hbWUpXSA9CisgICAgICBjb21wcmVzc2VkX3RpbWVzZXJpZXNfdG9vbDsKKyAgc3dpdGNoX21hcFtQYXJzZVRvb2xOYW1lKGJpbm5lcl90b29sLnRvb2xfbmFtZSldID0gYmlubmVyX3Rvb2w7CisgIHN3aXRjaF9tYXBbUGFyc2VUb29sTmFtZShhbGxvY2F0aW9uX2xvZ2dlcl90b29sLnRvb2xfbmFtZSldID0KKyAgICAgIGFsbG9jYXRpb25fbG9nZ2VyX3Rvb2w7CisgIHN3aXRjaF9tYXBbUGFyc2VUb29sTmFtZShsZWFrX3RyYWNpbmdfdG9vbC50b29sX25hbWUpXSA9IGxlYWtfdHJhY2luZ190b29sOworICBzd2l0Y2hfbWFwW1BhcnNlVG9vbE5hbWUoanNfbGVha190cmFjaW5nX3Rvb2wudG9vbF9uYW1lKV0gPQorICAgICAganNfbGVha190cmFjaW5nX3Rvb2w7CiAKICAgc3RkOjpzdHJpbmcgdG9vbF9uYW1lID0gUGFyc2VUb29sTmFtZShjb21tYW5kX2FyZyk7CiAgIHN0ZDo6c3RyaW5nIHRvb2xfYXJnID0gUGFyc2VUb29sQXJnKGNvbW1hbmRfYXJnKTsKQEAgLTIxNywxMSArMjQ5LDQ3IEBACiAgICAgICBicmVhazsKICAgICB9CiAgICAgY2FzZSBrU3RhcnR1cDogeworICAgICAgZG91YmxlIG51bV9taW5zID0gMS4wOworICAgICAgaWYgKCF0b29sX2FyZy5lbXB0eSgpKSB7CisgICAgICAgIG51bV9taW5zID0gbmI6OmxleGljYWxfY2FzdDxkb3VibGU+KHRvb2xfYXJnLmNfc3RyKCkpOworICAgICAgICBpZiAoKG51bV9taW5zID4gMCkgPT0gZmFsc2UpIHsgIC8vIEFjY291bnRzIGZvciBOYU4uCisgICAgICAgICAgbnVtX21pbnMgPSAxLjA7CisgICAgICAgIH0KKyAgICAgIH0KICAgICAgIG1lbW9yeV90cmFja2VyID0gTWVtb3J5VHJhY2tlcjo6R2V0KCk7CiAgICAgICBtZW1vcnlfdHJhY2tlci0+SW5zdGFsbEdsb2JhbFRyYWNraW5nSG9va3MoKTsKKworICAgICAgLy8gQ29udmVydHMgbWludXRlcyBpbnRvIFNhbXBsaW5nIGludGVydmFsIGFuZCBhbHNvIHRvdGFsIHNhbXBsaW5nIHRpbWUuCisgICAgICAvLyBUbyBrZWVwIHRoZSBhbW91bnQgb2YgZWxlbWVudHMgaW4gdGhlIG91dHB1dCBzdGF0aWMsIHdlIGFkanVzdCB0aGUKKyAgICAgIC8vIHNhbXBsaW5nLgorICAgICAgLy8KKyAgICAgIC8vIFRoZSBudW1iZXIgb2Ygc2FtcGxlcyBwcm9kdWNlZCBpcyBoZWxkIGNvbnN0YW50cyBhbmQgaXM6CisgICAgICAvLyAgIGtOdW1TYW1wbGVzID0gRjo6VG90YWxTYW1wbGluZ1RpbWUobnVtX21pbnMpIC8KKyAgICAgIC8vICAgICAgICAgICAgICAgICBGOjpTYW1wbGluZ0ludGVydmFsTXMobnVtX21pbnMpCisgICAgICBzdHJ1Y3QgRiB7CisgICAgICAgIHN0YXRpYyBpbnQgU2FtcGxpbmdJbnRlcnZhbE1zKGRvdWJsZSBtaW5zKSB7CisgICAgICAgICAgLy8ga051bVNhbXBsZXMgaXMgY2hvc2VuIHN1Y2ggdGhhdCBTYW1wbGluZ0ludGVydmFsTXMoMSkgb3V0cHV0cworICAgICAgICAgIC8vIDI0MG1zLgorICAgICAgICAgIHN0YXRpYyBjb25zdCBkb3VibGUga051bVNhbXBsZXMgPSAyNTAuOworICAgICAgICAgIGNvbnN0IGludCBzYW1wbGVfdGltZV9tcyA9CisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oVG9NaWxsaXNlY29uZHMobWlucykgLyBrTnVtU2FtcGxlcyk7CisgICAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oc2FtcGxlX3RpbWVfbXMpOworICAgICAgICB9CisKKyAgICAgICAgLy8gVG90YWxTYW1wbGluZ1RpbWUoMSkgb3V0cHV0cyA2MCwwMDAgbWlsbGlzZWNvbmRzLCBvciAxIG1pbnV0ZS4KKyAgICAgICAgc3RhdGljIGludCBUb01pbGxpc2Vjb25kcyhkb3VibGUgbWlucykgeworICAgICAgICAgIGNvbnN0IGRvdWJsZSBtaWxsc2Vjb25kcyA9IG1pbnMgKiA2MC4gKiAxMDAwLjsKKyAgICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihtaWxsc2Vjb25kcyk7CisgICAgICAgIH0KKyAgICAgIH07CisKKyAgICAgIC8vIFNhbXBsZSB0aW1lIGluY3JlYXNlcyB3aXRoIHRoZSBudW1iZXIgb2Ygc2Vjb25kcy4gQXQgb25lIHNlY29uZCB3ZQorICAgICAgLy8gc2FtcGxlIDQgdGltZXMgYSBzZWNvbmQuIFRoaXMga2VlcHMgdGhlIG51bWJlciBvZiBzYW1wbGVzIGNvbnN0YW50CisgICAgICAvLyByZWdhcmRsZXNzIG9mIGlucHV0IHRpbWUuCisgICAgICBpbnQgc2FtcGxpbmdfaW50ZXJ2YWxfbXMgPSBGOjpTYW1wbGluZ0ludGVydmFsTXMobnVtX21pbnMpOworICAgICAgLy8gVGltZSB1bnRpbCBvdXRwdXQgaXMgdHJpZ2dlcmVkLgorICAgICAgaW50IHNhbXBsaW5nX3RpbWVfbXMgPSBGOjpUb01pbGxpc2Vjb25kcyhudW1fbWlucyk7CiAgICAgICAvLyBDcmVhdGUgYSB0aHJlYWQgdGhhdCB3aWxsIGdhdGhlciBtZW1vcnkgbWV0cmljcyBmb3Igc3RhcnR1cC4KLSAgICAgIGludCBzYW1wbGluZ19pbnRlcnZhbF9tcyA9IDEwMDA7ICAgLy8gU2FtcGxlIG9uY2UgYSBzZWNvbmQuCi0gICAgICBpbnQgc2FtcGxpbmdfdGltZV9tcyA9IDYwICogMTAwMDsgIC8vIE91dHB1dCBhZnRlciA2MCBzZWNvbmRzCiAgICAgICB0b29sX3B0ci5yZXNldCgKICAgICAgICAgICBuZXcgTWVtb3J5VHJhY2tlclByaW50Q1NWKHNhbXBsaW5nX2ludGVydmFsX21zLCBzYW1wbGluZ190aW1lX21zKSk7CiAgICAgICBicmVhazsKQEAgLTI1NCw2ICszMjIsMjYgQEAKICAgICAgIHRvb2xfcHRyLnJlc2V0KGRpc2tfd3JpdGVyX3Rvb2wucmVsZWFzZSgpKTsKICAgICAgIGJyZWFrOwogICAgIH0KKyAgICBjYXNlIGtMZWFrVHJhY2VyOiB7CisgICAgICBzY29wZWRfcHRyPE1lbW9yeVRyYWNrZXJMZWFrRmluZGVyPiBsZWFrX2ZpbmRlcigKKyAgICAgICAgICBuZXcgTWVtb3J5VHJhY2tlckxlYWtGaW5kZXIoTWVtb3J5VHJhY2tlckxlYWtGaW5kZXI6OmtDUGx1c1BsdXMpKTsKKworICAgICAgbWVtb3J5X3RyYWNrZXIgPSBNZW1vcnlUcmFja2VyOjpHZXQoKTsKKyAgICAgIG1lbW9yeV90cmFja2VyLT5JbnN0YWxsR2xvYmFsVHJhY2tpbmdIb29rcygpOworICAgICAgbWVtb3J5X3RyYWNrZXItPlNldE1lbW9yeVRyYWNrZXJEZWJ1Z0NhbGxiYWNrKGxlYWtfZmluZGVyLmdldCgpKTsKKyAgICAgIHRvb2xfcHRyLnJlc2V0KGxlYWtfZmluZGVyLnJlbGVhc2UoKSk7CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBrSmF2YXNjcmlwdExlYWtUcmFjZXI6IHsKKyAgICAgIHNjb3BlZF9wdHI8TWVtb3J5VHJhY2tlckxlYWtGaW5kZXI+IGxlYWtfZmluZGVyKAorICAgICAgICAgIG5ldyBNZW1vcnlUcmFja2VyTGVha0ZpbmRlcihNZW1vcnlUcmFja2VyTGVha0ZpbmRlcjo6a0phdmFzY3JpcHQpKTsKKworICAgICAgbWVtb3J5X3RyYWNrZXIgPSBNZW1vcnlUcmFja2VyOjpHZXQoKTsKKyAgICAgIG1lbW9yeV90cmFja2VyLT5JbnN0YWxsR2xvYmFsVHJhY2tpbmdIb29rcygpOworICAgICAgbWVtb3J5X3RyYWNrZXItPlNldE1lbW9yeVRyYWNrZXJEZWJ1Z0NhbGxiYWNrKGxlYWtfZmluZGVyLmdldCgpKTsKKyAgICAgIHRvb2xfcHRyLnJlc2V0KGxlYWtfZmluZGVyLnJlbGVhc2UoKSk7CisgICAgICBicmVhazsKKyAgICB9CiAgICAgZGVmYXVsdDogewogICAgICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJVbmhhbmRsZWQgY2FzZS4iOwogICAgICAgYnJlYWs7CkBAIC0yNzAsNiArMzU4LDggQEAKICAgfQogfQogCisjZW5kaWYgIC8vICFkZWZpbmVkKFNUQVJCT0FSRF9BTExPV1NfTUVNT1JZX1RSQUNLSU5HKQorCiB9ICAvLyBuYW1lc3BhY2UgbWVtb3J5X3RyYWNrZXIKIH0gIC8vIG5hbWVzcGFjZSBicm93c2VyCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbC5oIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL21lbW9yeV90cmFja2VyX3Rvb2wuaAppbmRleCAwN2U3ZDgwLi44ZDE3ZDlmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbC5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CUk9XU0VSX01FTU9SWV9UUkFDS0VSX01FTU9SWV9UUkFDS0VSX1RPT0xfSF8KICNkZWZpbmUgQ09CQUxUX0JST1dTRVJfTUVNT1JZX1RSQUNLRVJfTUVNT1JZX1RSQUNLRVJfVE9PTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL21lbW9yeV90cmFja2VyX3Rvb2xfaW1wbC5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sX2ltcGwuY2MKaW5kZXggOTFiMzRmMy4uZDg0NjFlOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL21lbW9yeV90cmFja2VyX3Rvb2xfaW1wbC5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbF9pbXBsLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL21lbW9yeV90cmFja2VyX3Rvb2xfaW1wbC5oIgogCkBAIC0yMywxMiArMjEsMTcgQEAKICNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlICJiYXNlL3RpbWUuaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9idWZmZXJlZF9maWxlX3dyaXRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmgiCiAjaW5jbHVkZSAibmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyLmgiCiAjaW5jbHVkZSAibmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJuYi9jb25jdXJyZW50X21hcC5oIgorI2luY2x1ZGUgIm5iL21lbW9yeV9zY29wZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2VtYXBob3JlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvZmlsZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKQEAgLTE2OCwxMSArMTcxLDEyIEBACiBjbGFzcyBUaW1lciB7CiAgcHVibGljOgogICBleHBsaWNpdCBUaW1lcihiYXNlOjpUaW1lRGVsdGEgZHQpCi0gICAgICA6IHN0YXJ0X3RpbWVfKGJhc2U6OlRpbWU6Ok5vd0Zyb21TeXN0ZW1UaW1lKCkpLAotICAgICAgICB0aW1lX2JlZm9yZV9leHBpcmF0aW9uXyhkdCkge30KKyAgICAgIDogc3RhcnRfdGltZV8oYmFzZTo6VGltZVRpY2tzOjpOb3coKSksIHRpbWVfYmVmb3JlX2V4cGlyYXRpb25fKGR0KSB7fQorCisgIHZvaWQgUmVzdGFydCgpIHsgc3RhcnRfdGltZV8gPSBiYXNlOjpUaW1lVGlja3M6Ok5vdygpOyB9CiAKICAgYm9vbCBVcGRhdGVBbmRJc0V4cGlyZWQoKSB7Ci0gICAgYmFzZTo6VGltZSBub3dfdGltZSA9IGJhc2U6OlRpbWU6Ok5vd0Zyb21TeXN0ZW1UaW1lKCk7CisgICAgYmFzZTo6VGltZVRpY2tzIG5vd190aW1lID0gYmFzZTo6VGltZVRpY2tzOjpOb3coKTsKICAgICBiYXNlOjpUaW1lRGVsdGEgZHQgPSBub3dfdGltZSAtIHN0YXJ0X3RpbWVfOwogICAgIGlmIChkdCA+IHRpbWVfYmVmb3JlX2V4cGlyYXRpb25fKSB7CiAgICAgICBzdGFydF90aW1lXyA9IG5vd190aW1lOwpAQCAtMTgzLDEwICsxODcsOTUgQEAKICAgfQogCiAgcHJpdmF0ZToKLSAgYmFzZTo6VGltZSBzdGFydF90aW1lXzsKKyAgYmFzZTo6VGltZVRpY2tzIHN0YXJ0X3RpbWVfOwogICBiYXNlOjpUaW1lRGVsdGEgdGltZV9iZWZvcmVfZXhwaXJhdGlvbl87CiB9OwogCisvLyBSZXR1cm5zIHRydWUgaWYgbGluZWFyIGZpdCB3YXMgY2FsY3VsYXRlZC4gRmFsc2Ugb3RoZXJ3aXNlLiBSZWFzb25zIGZvcgorLy8gcmV0dXJuaW5nIGZhbHNlIGluY2x1ZGUgcGFzc2luZyBpbiBhbiBlbXB0eSByYW5nZSwgc3VjaCB0aGF0CisvLyBiZWdpbl9pdCA9PSBlbmRfaXQsIG9yIGFsbCB4LXZhbHVlcyBiZWluZyB0aGUgc2FtZS4KKy8vCisvLyBBbGdvcml0aG0gYWRhcHRlZCBmcm9tOgorLy8gaHR0cHM6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvU2ltcGxlX2xpbmVhcl9yZWdyZXNzaW9uI0ZpdHRpbmdfdGhlX3JlZ3Jlc3Npb25fbGluZQorLy8gRXhhbXBsZToKKy8vICAgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIGludD4gPiBkYXRhOworLy8gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisvLyAgICAgIGRhdGEucHVzaF9iYWNrKHN0ZDo6cGFpcjxpbnQsIGludD4oaSsxLCAyKmkpKTsKKy8vICAgIH0KKy8vICAgIGRvdWJsZSBzbG9wZSA9IDA7CisvLyAgICBkb3VibGUgeV9pbnRlcmNlcHQgPSAwOworLy8gICAgR2V0TGluZWFyRml0KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgJnNsb3BlLCAmeV9pbnRlcmNlcHQpOworLy8gICAgc3RkOjpjb3V0IDw8ICJzbG9wZTogIiA8PCBzbG9wZSA8PCAiXG4iOworLy8gICAgc3RkOjpjb3V0IDw8ICJ5X2ludGVyY2VwdDogIiA8PCB5X2ludGVyY2VwdDw8ICJcbiI7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgUGFpckl0ZXJhdG9yPgorYm9vbCBHZXRMaW5lYXJGaXQoUGFpckl0ZXJhdG9yIGJlZ2luX2l0LCBQYWlySXRlcmF0b3IgZW5kX2l0LCBkb3VibGUqIG91dF9zbG9wZSwKKyAgICAgICAgICAgICAgICAgIGRvdWJsZSogb3V0X3lpbnRlcmNlcHQpIHsKKyAgaWYgKGJlZ2luX2l0ID09IGVuZF9pdCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNpemVfdCBuID0gMDsKKyAgZG91YmxlIHhfYXZnID0gMDsKKyAgZG91YmxlIHlfYXZnID0gMDsKKworICBmb3IgKFBhaXJJdGVyYXRvciBpdCA9IGJlZ2luX2l0OyBpdCAhPSBlbmRfaXQ7ICsraXQpIHsKKyAgICB4X2F2ZyArPSBpdC0+Zmlyc3Q7CisgICAgeV9hdmcgKz0gaXQtPnNlY29uZDsKKyAgICBuKys7CisgIH0KKworICB4X2F2ZyAvPSBuOworICB5X2F2ZyAvPSBuOworCisgIGRvdWJsZSBudW1lcmF0b3IgPSAwOworICBkb3VibGUgZGVub21pbmF0b3IgPSAwOworCisgIGZvciAoUGFpckl0ZXJhdG9yIGl0ID0gYmVnaW5faXQ7IGl0ICE9IGVuZF9pdDsgKytpdCkgeworICAgIGRvdWJsZSB4X3ZhcmlhbmNlID0gaXQtPmZpcnN0IC0geF9hdmc7CisgICAgZG91YmxlIHlfdmFyaWFuY2UgPSBpdC0+c2Vjb25kIC0geV9hdmc7CisgICAgbnVtZXJhdG9yICs9ICh4X3ZhcmlhbmNlICogeV92YXJpYW5jZSk7CisgICAgZGVub21pbmF0b3IgKz0gKHhfdmFyaWFuY2UgKiB4X3ZhcmlhbmNlKTsKKyAgfQorCisgIGlmIChkZW5vbWluYXRvciA9PSAwLjApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBkb3VibGUgc2xvcGUgPSBudW1lcmF0b3IgLyBkZW5vbWluYXRvcjsKKyAgZG91YmxlIHlpbnRlcmNlcHQgPSB5X2F2ZyAtIHNsb3BlICogeF9hdmc7CisKKyAgKm91dF9zbG9wZSA9IHNsb3BlOworICAqb3V0X3lpbnRlcmNlcHQgPSB5aW50ZXJjZXB0OworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gUmV0dXJucyBhIHN1YnN0cmluZyB3aXRoIHRoZSBkaXJlY3RvcnkgcGF0aCByZW1vdmVkIGZyb20gdGhlIGZpbGVuYW1lLgorLy8gRXhhbXBsZToKKy8vICAgRjo6QmFzZU5hbWVGYXN0KCJkaXJlY3RvcnkvZmlsZW5hbWUuY2MiKSA9PiAiZmlsZW5hbWUuY2MiCisvLyAgIEY6OkJhc2VOYW1lRmFzdCgiZGlyZWN0b3J5XGZpbGVuYW1lLmNjIikgPT4gImZpbGVuYW1lLmNjIgorLy8KKy8vIE5vdGUgdGhhdCBiYXNlOjpGaWxlUGF0aDo6QmFzZU5hbWUoKSBpc24ndCB1c2VkIGJlY2F1c2Ugb2YgcGVyZm9ybWFuY2UKKy8vIHJlYXNvbnMuCitjb25zdCBjaGFyKiBCYXNlTmFtZUZhc3QoY29uc3QgY2hhciogZmlsZV9uYW1lKSB7CisgIGNvbnN0IGNoYXIqIGVuZF9wb3MgPSBmaWxlX25hbWUgKyBzdHJsZW4oZmlsZV9uYW1lKTsKKyAgY29uc3QgY2hhciogbGFzdF9mb3J3YXJkX3NsYXNoID0gU2JTdHJpbmdGaW5kTGFzdENoYXJhY3RlcihmaWxlX25hbWUsICcvJyk7CisgIGlmIChsYXN0X2ZvcndhcmRfc2xhc2gpIHsKKyAgICBpZiAoZW5kX3BvcyAhPSBsYXN0X2ZvcndhcmRfc2xhc2gpIHsKKyAgICAgICsrbGFzdF9mb3J3YXJkX3NsYXNoOworICAgIH0KKyAgICByZXR1cm4gbGFzdF9mb3J3YXJkX3NsYXNoOworICB9CisKKyAgY29uc3QgY2hhciogbGFzdF9iYWNrd2FyZF9zbGFzaCA9IFNiU3RyaW5nRmluZExhc3RDaGFyYWN0ZXIoZmlsZV9uYW1lLCAnXFwnKTsKKyAgaWYgKGxhc3RfYmFja3dhcmRfc2xhc2gpIHsKKyAgICBpZiAoZW5kX3BvcyAhPSBsYXN0X2JhY2t3YXJkX3NsYXNoKSB7CisgICAgICArK2xhc3RfYmFja3dhcmRfc2xhc2g7CisgICAgfQorICAgIHJldHVybiBsYXN0X2JhY2t3YXJkX3NsYXNoOworICB9CisgIHJldHVybiBmaWxlX25hbWU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZQogCiBjbGFzcyBQYXJhbXMgewpAQCAtMTk4LDcgKzI4NywxMyBAQAogICAgICAgICBsb2dnZXJfKGxvZ2dlciksCiAgICAgICAgIHRpbWVyXyhzdGFydF90aW1lKSB7fQogICBib29sIGZpbmlzaGVkKCkgY29uc3QgeyByZXR1cm4gZmluaXNoZWRfOyB9Ci0gIHZvaWQgc2V0X2ZpbmlzaGVkKGJvb2wgdmFsKSB7IGZpbmlzaGVkXyA9IHZhbDsgfQorICBib29sIHdhaXRfZm9yX2ZpbmlzaF9zaWduYWwoU2JUaW1lIHdhaXRfdXMpIHsKKyAgICByZXR1cm4gZmluaXNoZWRfc2VtYXBob3JlXy5UYWtlV2FpdCh3YWl0X3VzKTsKKyAgfQorICB2b2lkIHNldF9maW5pc2hlZChib29sIHZhbCkgeworICAgIGZpbmlzaGVkXyA9IHZhbDsKKyAgICBmaW5pc2hlZF9zZW1hcGhvcmVfLlB1dCgpOworICB9CiAKICAgbmI6OmFuYWx5dGljczo6TWVtb3J5VHJhY2tlciogbWVtb3J5X3RyYWNrZXIoKSBjb25zdCB7CiAgICAgcmV0dXJuIG1lbW9yeV90cmFja2VyXzsKQEAgLTIwOSw4ICszMDQsOCBAQAogICB9CiAgIHN0ZDo6c3RyaW5nIFRpbWVJbk1pbnV0ZXNTdHJpbmcoKSBjb25zdCB7CiAgICAgYmFzZTo6VGltZURlbHRhIGRlbHRhX3QgPSB0aW1lX3NpbmNlX3N0YXJ0KCk7Ci0gICAgZmxvYXQgc2Vjb25kcyA9IHN0YXRpY19jYXN0PGZsb2F0PihkZWx0YV90LkluTWlsbGlzZWNvbmRzKCkpIC8gMTAwMC4wZjsKLSAgICBmbG9hdCB0aW1lX21pbnMgPSBzZWNvbmRzIC8gNjAuZjsKKyAgICBpbnQ2NCBzZWNvbmRzID0gZGVsdGFfdC5JblNlY29uZHMoKTsKKyAgICBmbG9hdCB0aW1lX21pbnMgPSBzdGF0aWNfY2FzdDxmbG9hdD4oc2Vjb25kcykgLyA2MC5mOwogICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOwogCiAgICAgc3MgPDwgdGltZV9taW5zOwpAQCAtMjIyLDYgKzMxNyw3IEBACiAgIGJvb2wgZmluaXNoZWRfOwogICBzY29wZWRfcHRyPEFic3RyYWN0TG9nZ2VyPiBsb2dnZXJfOwogICBiYXNlOjpUaW1lIHRpbWVyXzsKKyAgc3RhcmJvYXJkOjpTZW1hcGhvcmUgZmluaXNoZWRfc2VtYXBob3JlXzsKIH07CiAKIE1lbW9yeVRyYWNrZXJUb29sVGhyZWFkOjpNZW1vcnlUcmFja2VyVG9vbFRocmVhZCgKQEAgLTI1Miw3ICszNDgsNyBAQAogfQogCiBOb01lbW9yeVRyYWNraW5nOjpOb01lbW9yeVRyYWNraW5nKG5iOjphbmFseXRpY3M6Ok1lbW9yeVRyYWNrZXIqIG93bmVyKQotICAgIDogb3duZXJfKG93bmVyKSB7CisgICAgOiAgcHJldl92YWxfKGZhbHNlKSwgb3duZXJfKG93bmVyKSB7CiAgIGlmIChvd25lcl8pIHsKICAgICBwcmV2X3ZhbF8gPSBvd25lcl8tPklzTWVtb3J5VHJhY2tpbmdFbmFibGVkKCk7CiAgICAgb3duZXJfLT5TZXRNZW1vcnlUcmFja2luZ0VuYWJsZWQoZmFsc2UpOwpAQCAtNjA4LDI1ICs3MDQsNDEgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogTWVtb3J5VHJhY2tlckNvbXByZXNzZWRUaW1lU2VyaWVzOjpNZW1vcnlUcmFja2VyQ29tcHJlc3NlZFRpbWVTZXJpZXMoKQotICAgIDogc2FtcGxlX2ludGVydmFsX21zXygxMDApLCBudW1iZXJfc2FtcGxlc18oNDAwKSB7fQorICAgIDogbnVtYmVyX3NhbXBsZXNfKDQwMCkge30KIAogdm9pZCBNZW1vcnlUcmFja2VyQ29tcHJlc3NlZFRpbWVTZXJpZXM6OlJ1bihQYXJhbXMqIHBhcmFtcykgewogICBUaW1lU2VyaWVzIHRpbWVzZXJpZXM7Ci0gIFRpbWVyIHRpbWVyKGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMikpOwotICB3aGlsZSAoIXBhcmFtcy0+ZmluaXNoZWQoKSkgeworICBUaW1lciB0aW1lcl9zdGF0dXNfbWVzc2FnZShiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEpKTsKKworICAvLyBPdXRwdXRzIENTViBvbmNlIGV2ZXJ5IG1pbnV0ZS4KKyAgVGltZXIgdGltZXJfb3V0cHV0X2NzdihiYXNlOjpUaW1lRGVsdGE6OkZyb21NaW51dGVzKDEpKTsKKworICAvLyBJbml0aWFsIHNhbXBsZSB0aW1lIGlzIGV2ZXJ5IDUwIG1pbGxpc2Vjb25kcy4KKyAgYmFzZTo6VGltZURlbHRhIGN1cnJlbnRfc2FtcGxlX2ludGVydmFsID0KKyAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyg1MCk7CisKKyAgd2hpbGUgKCFwYXJhbXMtPndhaXRfZm9yX2ZpbmlzaF9zaWduYWwoY3VycmVudF9zYW1wbGVfaW50ZXJ2YWwuVG9TYlRpbWUoKSkpIHsKICAgICBBY3F1aXJlU2FtcGxlKHBhcmFtcy0+bWVtb3J5X3RyYWNrZXIoKSwgJnRpbWVzZXJpZXMsCiAgICAgICAgICAgICAgICAgICBwYXJhbXMtPnRpbWVfc2luY2Vfc3RhcnQoKSk7CisKICAgICBpZiAoSXNGdWxsKHRpbWVzZXJpZXMsIG51bWJlcl9zYW1wbGVzXykpIHsKKyAgICAgIENvbXByZXNzKCZ0aW1lc2VyaWVzKTsgICAgICAgICAgIC8vIFJlbW92ZSBldmVyeSBvdGhlciBlbGVtZW50LgorICAgICAgY3VycmVudF9zYW1wbGVfaW50ZXJ2YWwgKj0gMjsgICAgLy8gRG91YmxlIHRoZSBzYW1wbGUgdGltZS4KKyAgICAgIHRpbWVyX3N0YXR1c19tZXNzYWdlLlJlc3RhcnQoKTsgIC8vIFNraXAgc3RhdHVzIG1lc3NhZ2UuCisgICAgfQorCisgICAgaWYgKHRpbWVyX291dHB1dF9jc3YuVXBkYXRlQW5kSXNFeHBpcmVkKCkpIHsKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nIHN0ciA9IFRvQ3N2U3RyaW5nKHRpbWVzZXJpZXMpOwotICAgICAgQ29tcHJlc3MoJnRpbWVzZXJpZXMpOwogICAgICAgcGFyYW1zLT5sb2dnZXIoKS0+T3V0cHV0KHN0ci5jX3N0cigpKTsKLSAgICB9IGVsc2UgaWYgKHRpbWVyLlVwZGF0ZUFuZElzRXhwaXJlZCgpKSB7CisgICAgICB0aW1lcl9zdGF0dXNfbWVzc2FnZS5SZXN0YXJ0KCk7ICAvLyBTa2lwIHN0YXR1cyBtZXNzYWdlLgorICAgIH0KKworICAgIC8vIFByaW50IHN0YXR1cyBtZXNzYWdlLgorICAgIGlmICh0aW1lcl9zdGF0dXNfbWVzc2FnZS5VcGRhdGVBbmRJc0V4cGlyZWQoKSkgewogICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CiAgICAgICBzcyA8PCB0b29sX25hbWUoKSA8PCAiIGlzIHJ1bm5pbmcuLi4iIDw8IGtOZXdMaW5lOwogICAgICAgcGFyYW1zLT5sb2dnZXIoKS0+T3V0cHV0KHNzLnN0cigpLmNfc3RyKCkpOwogICAgIH0KLSAgICBiYXNlOjpQbGF0Zm9ybVRocmVhZDo6U2xlZXAoCi0gICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcyhzYW1wbGVfaW50ZXJ2YWxfbXNfKSk7CiAgIH0KIH0KIApAQCAtNzMwLDcgKzg0Miw3IEBACiAgIH0KICAgc3MgPDwgIi8vIEVORCBDU1Ygb2YgQ09VTlQgb2YgYWxsb2NhdGlvbnMgcGVyIHJlZ2lvbi4iIDw8IGtOZXdMaW5lOwogICBzcyA8PCAiLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLyI7Ci0gIHNzIDw8IGtOZXdMaW5lOworICBzcyA8PCBrTmV3TGluZSA8PCBrTmV3TGluZTsKIAogICBzdGQ6OnN0cmluZyBvdXRwdXQgPSBzcy5zdHIoKTsKICAgcmV0dXJuIG91dHB1dDsKQEAgLTc5MSwxNCArOTAzLDYgQEAKICAgcmV0dXJuIHRpbWVzZXJpZXMudGltZV9zdGFtcHNfLnNpemUoKSA+PSBzYW1wbGVzX2xpbWl0OwogfQogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmVjdG9yVD4KLXZvaWQgRG9Db21wcmVzc2lvbihWZWN0b3JUKiBzYW1wbGVzKSB7Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpICogMiA8IHNhbXBsZXMtPnNpemUoKTsgKytpKSB7Ci0gICAgKCpzYW1wbGVzKVtpXSA9ICgqc2FtcGxlcylbaSAqIDJdOwotICB9Ci0gIHNhbXBsZXMtPnJlc2l6ZShzYW1wbGVzLT5zaXplKCkgLyAyKTsKLX0KLQogdm9pZCBNZW1vcnlUcmFja2VyQ29tcHJlc3NlZFRpbWVTZXJpZXM6OkNvbXByZXNzKFRpbWVTZXJpZXMqIHRpbWVzZXJpZXMpIHsKICAgdHlwZWRlZiBNYXBBbGxvY2F0aW9uU2FtcGxlczo6aXRlcmF0b3IgTWFwSXQ7CiAgIE1hcEFsbG9jYXRpb25TYW1wbGVzJiBzYW1wbGVzID0gdGltZXNlcmllcy0+c2FtcGxlc187CkBAIC0xMTk5LDYgKzEzMDMsNDQyIEBACiAgIFNiTWVtb3J5U2V0UmVwb3J0ZXIobWVtb3J5X3JlcG9ydGVyXy5nZXQoKSk7CiB9CiAKK01lbW9yeVRyYWNrZXJMZWFrRmluZGVyOjpNZW1vcnlUcmFja2VyTGVha0ZpbmRlcihTdGFja1RyYWNlTW9kZSBtb2RlKQorICAgIDogc3RyaW5nX3Bvb2xfKDEyOCksCisgICAgICBmcmFtZV9tYXBfKDEyOCksCisgICAgICBjYWxsZnJhbWVfbWFwXygxMjgpLAorICAgICAgc3RhY2tfdHJhY2VfbW9kZV8obW9kZSkgeworICBkZWZhdWx0X2NhbGxmcmFtZV9zdHJfID0gJnN0cmluZ19wb29sXy5JbnRlcm4oIjxVbmtub3duPiIpOworfQorCitNZW1vcnlUcmFja2VyTGVha0ZpbmRlcjo6fk1lbW9yeVRyYWNrZXJMZWFrRmluZGVyKCkgeworICBmcmFtZV9tYXBfLkNsZWFyKCk7CisgIGNhbGxmcmFtZV9tYXBfLkNsZWFyKCk7Cit9CisKK2Jvb2wgTWVtb3J5VHJhY2tlckxlYWtGaW5kZXI6OklzSmF2YXNjcmlwdFNjb3BlKAorICAgIGNvbnN0IG5iOjphbmFseXRpY3M6OkNhbGxTdGFjayYgY2FsbHN0YWNrKSB7CisgIC8vIE1hcmNoIHRocm91Z2ggYWxsIE1lbW9yeVNjb3BlcyBpbiB0aGUgY2FsbHN0YWNrIGFuZCBjaGVjayBpZiBhbnkgb2YgdGhlbQorICAvLyBjb250YWlucyBhIGphdmFzY3JpcHQgc2NvcGUuIElmIGl0IGRvZXMgcmV0dXJuIHRydWUuCisgIGZvciAobmI6OmFuYWx5dGljczo6Q2FsbFN0YWNrOjpjb25zdF9pdGVyYXRvciBpdCA9IGNhbGxzdGFjay5iZWdpbigpOworICAgICAgIGl0ICE9IGNhbGxzdGFjay5lbmQoKTsgKytpdCkgeworICAgIGNvbnN0IE5iTWVtb3J5U2NvcGVJbmZvKiBtZW1vcnlfc2NvcGUgPSAqaXQ7CisgICAgY29uc3QgYm9vbCBpc19qYXZhc2NyaXB0X3Njb3BlID0KKyAgICAgICAgU2JTdHJpbmdGaW5kU3RyaW5nKG1lbW9yeV9zY29wZS0+bWVtb3J5X3Njb3BlX25hbWVfLCAiSmF2YXNjcmlwdCIpOworICAgIGlmIChpc19qYXZhc2NyaXB0X3Njb3BlKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIE1lbW9yeVRyYWNrZXJMZWFrRmluZGVyOjpPbk1lbW9yeUFsbG9jYXRpb24oCisgICAgY29uc3Qgdm9pZCogbWVtb3J5X2Jsb2NrLCBjb25zdCBuYjo6YW5hbHl0aWNzOjpBbGxvY2F0aW9uUmVjb3JkJiByZWNvcmQsCisgICAgY29uc3QgbmI6OmFuYWx5dGljczo6Q2FsbFN0YWNrJiBjYWxsc3RhY2spIHsKKyAgLy8gV2hlbiBpbiBqYXZhc2NyaXB0IG1vZGUsIGZpbHRlciBvbmx5IGFsbG9jYXRpb25zIHdpdGggIkphdmFzY3JpcHQiIGluCisgIC8vIHRoZSBtZW1vcnkgc2NvcGUgbmFtZS4KKyAgaWYgKHN0YWNrX3RyYWNlX21vZGVfID09IGtKYXZhc2NyaXB0KSB7CisgICAgaWYgKCFJc0phdmFzY3JpcHRTY29wZShjYWxsc3RhY2spKSB7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gc3ltYm9sX3N0ciBjYW4gYmUgdXNlZCBhcyBhIHVuaXF1ZSBrZXkuIFRoZSBzYW1lIHZhbHVlIG9mIGNhbGxzdGFjayB3aWxsCisgIC8vIGFsd2F5cyBwcm9kdWNlIHRoZSBzYW1lIHN0cmluZyBwb2ludGVyLgorICBjb25zdCBzdGQ6OnN0cmluZyogc3ltYm9sX3N0ciA9IEdldE9yQ3JlYXRlU3ltYm9sKGNhbGxzdGFjayk7CisgIC8vIFRyYWNrIHRoZSBhbGxvY2F0aW9uLgorICBpZiAoIWNhbGxmcmFtZV9tYXBfLlNldElmTWlzc2luZyhtZW1vcnlfYmxvY2ssIHN5bWJvbF9zdHIpKSB7CisgICAgQ2FsbEZyYW1lTWFwOjpFbnRyeUhhbmRsZSBlbnRyeV9oYW5kbGU7CisgICAgY2FsbGZyYW1lX21hcF8uR2V0KG1lbW9yeV9ibG9jaywgJmVudHJ5X2hhbmRsZSk7CisKKyAgICBjb25zdCB2b2lkKiBwdHIgPSBlbnRyeV9oYW5kbGUuVmFsaWQoKSA/IGVudHJ5X2hhbmRsZS5LZXkoKSA6IE5VTEw7CisgICAgZW50cnlfaGFuZGxlLlJlbGVhc2VMb2NrQW5kSW52YWxpZGF0ZSgpOworCisgICAgRENIRUNLKGZhbHNlKSA8PCAiVW5leHBlY3RlZCBtZW1vcnkgYmxvY2sgYXQgIiA8PCBtZW1vcnlfYmxvY2sKKyAgICAgICAgICAgICAgICAgIDw8ICIgYWxyZWFkeSBleGlzdGVkIGFzOiAiIDw8IHB0cjsKKyAgfQorCisgIEFsbG9jYXRpb25GcmFtZU1hcDo6RW50cnlIYW5kbGUgZW50cnlfaGFuZGxlOworICBmcmFtZV9tYXBfLkdldE9yQ3JlYXRlKHN5bWJvbF9zdHIsICZlbnRyeV9oYW5kbGUpOworCisgIC8vIFdoaWxlIHRoaXMgZW50cnlfaGFuZGxlIGlzIGluIHVzZSwgbm8gb3RoZXIgdGhyZWFkcworICAvLyBjYW4gbW9kaWZ5IHRoaXMgZW50cnkuCisgIEFsbG9jUmVjJiBhbGxvY19yZWMgPSBlbnRyeV9oYW5kbGUuVmFsdWVNdXRhYmxlKCk7CisgIGFsbG9jX3JlYy50b3RhbF9ieXRlcyArPSByZWNvcmQuc2l6ZTsKKyAgYWxsb2NfcmVjLm51bV9hbGxvY3MrKzsKK30KKwordm9pZCBNZW1vcnlUcmFja2VyTGVha0ZpbmRlcjo6T25NZW1vcnlEZWFsbG9jYXRpb24oCisgICAgY29uc3Qgdm9pZCogbWVtb3J5X2Jsb2NrLCBjb25zdCBuYjo6YW5hbHl0aWNzOjpBbGxvY2F0aW9uUmVjb3JkJiByZWNvcmQsCisgICAgY29uc3QgbmI6OmFuYWx5dGljczo6Q2FsbFN0YWNrJiBjYWxsc3RhY2spIHsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihjYWxsc3RhY2spOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBzeW1ib2xfc3RyID0gTlVMTDsKKworICB7CisgICAgQ2FsbEZyYW1lTWFwOjpFbnRyeUhhbmRsZSBlbnRyeV9oYW5kbGU7CisgICAgaWYgKCFjYWxsZnJhbWVfbWFwXy5HZXQobWVtb3J5X2Jsb2NrLCAmZW50cnlfaGFuZGxlKSkgeworICAgICAgLy8gVGhpcyBoYXBwZW5zIGlmIHRoZSBhbGxvY2F0aW9uIGhhcHBlbmVkIGJlZm9yZSB0aGlzIHRvb2wgYXR0YWNoZWQKKyAgICAgIC8vIHRvIHRoZSBtZW1vcnkgdHJhY2tlciBvciBpZiB0aGUgbWVtb3J5IGFsbG9jYXRpb24gd2FzIGZpbHRlcmVkIGFuZAorICAgICAgLy8gdGhlcmVmb3JlIGlzbid0IGJlaW5nIHRyYWNrZWQuCisgICAgICByZXR1cm47CisgICAgfQorICAgIHN5bWJvbF9zdHIgPSBlbnRyeV9oYW5kbGUuVmFsdWUoKTsKKyAgICBjYWxsZnJhbWVfbWFwXy5SZW1vdmUoJmVudHJ5X2hhbmRsZSk7CisgIH0KKworICAvLyBUaGlzIGNhc2UgY2FuIGhhcHBlbiBpZiB0aGUgbWVtb3J5IHRyYWNrZXIgYXR0YWNoZXMgYWZ0ZXIgdGhlIGFsbG9jYXRpb24uCisgIGlmICghc3ltYm9sX3N0cikgeworICAgIHJldHVybjsKKyAgfQorCisgIEFsbG9jYXRpb25GcmFtZU1hcDo6RW50cnlIYW5kbGUgZW50cnlfaGFuZGxlOworICBmcmFtZV9tYXBfLkdldE9yQ3JlYXRlKHN5bWJvbF9zdHIsICZlbnRyeV9oYW5kbGUpOworCisgIC8vIFdoaWxlIGVudHJ5X2hhbmRsZSBpcyBpbiB1c2UsIG5vIG90aGVyIGVsZW1lbnQgY2FuIG1vZGlmeQorICAvLyB0aGlzIGVsZW1lbnQuCisgIEFsbG9jUmVjJiBhbGxvY19yZWMgPSBlbnRyeV9oYW5kbGUuVmFsdWVNdXRhYmxlKCk7CisgIGFsbG9jX3JlYy50b3RhbF9ieXRlcyAtPSByZWNvcmQuc2l6ZTsKKyAgYWxsb2NfcmVjLm51bV9hbGxvY3MtLTsKK30KKworc3RkOjpzdHJpbmcgTWVtb3J5VHJhY2tlckxlYWtGaW5kZXI6OnRvb2xfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuICJNZW1vcnlUcmFja2VyTGVha0ZpbmRlciI7Cit9CisKK3ZvaWQgTWVtb3J5VHJhY2tlckxlYWtGaW5kZXI6OlJ1bihQYXJhbXMqIHBhcmFtcykgeworICAvLyBSdW4gZnVuY3Rpb24gZG9lcyBhbG1vc3Qgbm90aGluZy4KKyAgcGFyYW1zLT5sb2dnZXIoKS0+T3V0cHV0KCJNZW1vcnlUcmFja2VyTGVha0ZpbmRlciBydW5uaW5nLi4uIik7CisKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4U2FtcGxlcyA9IDQwMDsKKworICAvLyBUaGlzIHZhbHVlIHdpbGwgZGVjYXkgd2hlbmV2ZXIgdGhlIGJ1ZmZlciBmaWxscyB1cCBhbmQgaXMgY29tcHJlc3NlZCB2aWEKKyAgLy8gc2FtcGxlIGVsaW1pbmF0aW9uLgorICBTYlRpbWUgc2FtcGxlX3RpbWUgPSA1MDsgIC8vIDUwIG1pY3Jvc2Vjb25kcy4KKworICBzdGQ6OnZlY3RvcjxiYXNlOjpUaW1lRGVsdGE+IHRpbWVfdmFsdWVzOworICBzdGQ6Om1hcDxjb25zdCBzdGQ6OnN0cmluZyosIHN0ZDo6dmVjdG9yPEFsbG9jUmVjPiA+IG1hcF9hbGxvY2F0aW9uczsKKworICBTYlRpbWUgc3RhcnRfdGltZSA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworICBUaW1lciBvdXRwdXRfdHJpZ2dlcihiYXNlOjpUaW1lRGVsdGE6OkZyb21NaW51dGVzKDEpKTsKKworICBjb25zdCBkb3VibGUgcmVjb3JkaW5nX2RlbGF5X21pbnMgPSA1LjA7CisKKyAgLy8gQ29udHJvbHMgaG93IG9mdGVuIGFuIHVwZGF0ZSBzdGF0dXMgbWVzc2FnZSBpcyBzZW50IHRvIG91dHB1dC4KKyAgVGltZXIgb3V0cHV0X3N0YXR1c190aW1lcihiYXNlOjpUaW1lRGVsdGE6OkZyb21TZWNvbmRzKDEpKTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGlmIChwYXJhbXMtPndhaXRfZm9yX2ZpbmlzaF9zaWduYWwoc2FtcGxlX3RpbWUpKSB7CisgICAgICBicmVhazsgIC8vIEZpbmlzaCByZWNlaXZlZCwgYnJlYWsuCisgICAgfQorICAgIFNiVGltZSBub3dfdGltZSA9IFNiVGltZUdldE1vbm90b25pY05vdygpOworCisgICAgY29uc3QgYmFzZTo6VGltZURlbHRhIHRpbWVfc2luY2Vfc3RhcnQgPQorICAgICAgICBiYXNlOjpUaW1lOjpGcm9tU2JUaW1lKG5vd190aW1lKSAtIGJhc2U6OlRpbWU6OkZyb21TYlRpbWUoc3RhcnRfdGltZSk7CisKKyAgICAvLyBERUxBWSBSRUNPUkRJTkcgQVMgU1RBUlRVUCBNRU1PUlkgSVMgSU5JVElBTElaRUQKKyAgICAvLyBDbGVhbmVyIGdyYXBocyBpZiB3ZSB3YWl0IHVudGlsIGFmdGVyIHN0YXJ0dXAuCisgICAgLy8KKyAgICBjb25zdCBkb3VibGUgdGltZXNfc2luY2Vfc3RhcnRfbWlucyA9IHRpbWVfc2luY2Vfc3RhcnQuSW5TZWNvbmRzRigpIC8gNjAuMDsKKyAgICBpZiAodGltZXNfc2luY2Vfc3RhcnRfbWlucyA8IHJlY29yZGluZ19kZWxheV9taW5zKSB7CisgICAgICBpZiAob3V0cHV0X3N0YXR1c190aW1lci5VcGRhdGVBbmRJc0V4cGlyZWQoKSkgeworICAgICAgICBkb3VibGUgcmVtYWluaW5nX3RpbWVfbWlucyA9CisgICAgICAgICAgICAocmVjb3JkaW5nX2RlbGF5X21pbnMgLSB0aW1lc19zaW5jZV9zdGFydF9taW5zKTsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIHNzIDw8ICJNZW1vcnlUcmFja2VyTGVha0ZpbmRlciBzdGFydGluZyBpbiAiIDw8IHJlbWFpbmluZ190aW1lX21pbnMKKyAgICAgICAgICAgPDwgIiBtaW51dGVzLlxuIjsKKyAgICAgICAgcGFyYW1zLT5sb2dnZXIoKS0+T3V0cHV0KHNzLnN0cigpLmNfc3RyKCkpOworICAgICAgfQorICAgICAgY29udGludWU7CisgICAgfQorCisgICAgdGltZV92YWx1ZXMucHVzaF9iYWNrKHRpbWVfc2luY2Vfc3RhcnQpOworCisgICAgLy8gVG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgbWFrZSBhIGNvcHkgb2YgdGhlIHZhbHVlcyB0byBhIHZlY3RvciBvbgorICAgIC8vIHRoZSBzdGFjay4KKyAgICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8Y29uc3Qgc3RkOjpzdHJpbmcqLCBBbGxvY1JlYz4gPiBzYW1wbGVzOworICAgIFNhbXBsZVNuYXBzaG90KCZzYW1wbGVzKTsKKworICAgIC8vIFRha2UgYSBzbmFwc2hvdC4KKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHN0ZDo6cGFpcjxjb25zdCBzdGQ6OnN0cmluZyosIEFsbG9jUmVjPiBzYW1wbGUgPSBzYW1wbGVzW2ldOworICAgICAgc3RkOjp2ZWN0b3I8QWxsb2NSZWM+JiBzYW1wbGVfaGlzdG9yeSA9IG1hcF9hbGxvY2F0aW9uc1tzYW1wbGUuZmlyc3RdOworCisgICAgICBzYW1wbGVfaGlzdG9yeS5yZXNpemUodGltZV92YWx1ZXMuc2l6ZSgpKTsKKyAgICAgIHNhbXBsZV9oaXN0b3J5LmJhY2soKSA9IHNhbXBsZS5zZWNvbmQ7CisgICAgfQorCisgICAgaWYgKG91dHB1dF90cmlnZ2VyLlVwZGF0ZUFuZElzRXhwaXJlZCgpICYmIHRpbWVfdmFsdWVzLnNpemUoKSA+IDEwKSB7CisgICAgICAvLyBUaW1lciBleHBpcmVkIHNvIGR1bXAgdGhlIGN1cnJlbnQgaW5mb3JtYXRpb24gb3V0cHV0LgorCisgICAgICBzdGQ6OnZlY3RvcjxBbGxvY2F0aW9uUHJvZmlsZT4gYWxsb2NfcHJvZmlsZXM7CisgICAgICBHZW5lcmF0ZVRvcExlYWtpbmdBbGxvY2F0aW9uUHJvZmlsZXModGltZV92YWx1ZXMsIG1hcF9hbGxvY2F0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxsb2NfcHJvZmlsZXMpOworCisgICAgICBpZiAoYWxsb2NfcHJvZmlsZXMuZW1wdHkoKSkgeworICAgICAgICBwYXJhbXMtPmxvZ2dlcigpLT5PdXRwdXQoCisgICAgICAgICAgICAiTWVtb3J5VHJhY2tlckxlYWtGaW5kZXI6IGFsbG9jX3Byb2ZpbGVzIHdhcyAiCisgICAgICAgICAgICAiZW1wdHkgYW5kIG5vdGhpbmcgaXMgd3JpdHRlbi4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGlmIChhbGxvY19wcm9maWxlcy5zaXplKCkgPiAyMCkgeworICAgICAgICAgIGFsbG9jX3Byb2ZpbGVzLnJlc2l6ZSgyMCk7CisgICAgICAgIH0KKworICAgICAgICBzdGQ6OnN0cmluZyBjc3Zfc3RyID0gR2VuZXJhdGVDU1YodGltZV92YWx1ZXMsIGFsbG9jX3Byb2ZpbGVzKTsKKyAgICAgICAgcGFyYW1zLT5sb2dnZXIoKS0+T3V0cHV0KGNzdl9zdHIuY19zdHIoKSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gQ29tcHJlc3MgdGhlIGJ1ZmZlciwgYW5kIG1vZGlmeSBzYW1wbGVfdGltZSBzbyB0aGF0IGl0J3MgdHdpY2UgYXMgc2xvdy4KKyAgICBpZiAodGltZV92YWx1ZXMuc2l6ZSgpID49IGtNYXhTYW1wbGVzKSB7CisgICAgICBzYW1wbGVfdGltZSAqPSAyOyAgLy8gRG91YmxlIHRoZSB0aW1lIHRoYXQgaXQgdGFrZXMgdG8gdHJpZ2dlciBhIHNhbXBsZS4KKyAgICAgIC8vIFJlbW92ZSBldmVyeSBvdGhlciBlbGVtZW50IGluIHRpbWVfdmFsdWVzLgorICAgICAgUmVtb3ZlT2RkRWxlbWVudHMoJnRpbWVfdmFsdWVzKTsKKworICAgICAgLy8gUmVtb3ZlIGV2ZXJ5IG90aGVyIGVsZW1lbnQgaW4gdGhlIHNhbXBsZXMuCisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgICAgc3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nKiwgQWxsb2NSZWM+IHNhbXBsZSA9IHNhbXBsZXNbaV07CisgICAgICAgIHN0ZDo6dmVjdG9yPEFsbG9jUmVjPiYgc2FtcGxlX2hpc3RvcnkgPSBtYXBfYWxsb2NhdGlvbnNbc2FtcGxlLmZpcnN0XTsKKyAgICAgICAgUmVtb3ZlT2RkRWxlbWVudHMoJnNhbXBsZV9oaXN0b3J5KTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworY29uc3Qgc3RkOjpzdHJpbmcqIE1lbW9yeVRyYWNrZXJMZWFrRmluZGVyOjpHZXRPckNyZWF0ZVN5bWJvbCgKKyAgICBjb25zdCBuYjo6YW5hbHl0aWNzOjpDYWxsU3RhY2smIGNhbGxzdGFjaykgeworICBjb25zdCBzdGQ6OnN0cmluZyogc3ltYm9sX3N0ciA9IE5VTEw7CisKKyAgLy8gSW4gamF2YXNjcmlwdCBtb2RlIHdlIHRyeSBhbmQgZ2V0IHRoZSBqYXZhc2NyaXB0IHN5bWJvbC4gT3RoZXJ3aXNlCisgIC8vIGZhbGxiYWNrIHRvIEMrKyBzeW1ib2wuCisgIGlmIChzdGFja190cmFjZV9tb2RlXyA9PSBrSmF2YXNjcmlwdCkgeworICAgIHN5bWJvbF9zdHIgPSBUcnlHZXRKYXZhc2NyaXB0U3ltYm9sKCk7CisgICAgaWYgKHN5bWJvbF9zdHIpIHsKKyAgICAgIHJldHVybiBzeW1ib2xfc3RyOworICAgIH0KKyAgfQorCisgIHN5bWJvbF9zdHIgPSBHZXRPckNyZWF0ZUNwbHVzUGx1c1N5bWJvbChjYWxsc3RhY2spOworICByZXR1cm4gc3ltYm9sX3N0cjsKK30KKworY29uc3Qgc3RkOjpzdHJpbmcqIE1lbW9yeVRyYWNrZXJMZWFrRmluZGVyOjpHZXRPckNyZWF0ZUNwbHVzUGx1c1N5bWJvbCgKKyAgICBjb25zdCBuYjo6YW5hbHl0aWNzOjpDYWxsU3RhY2smIGNhbGxzdGFjaykgeworICBpZiAoY2FsbHN0YWNrLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9jYWxsZnJhbWVfc3RyXzsKKyAgfSBlbHNlIHsKKyAgICBjb25zdCBOYk1lbW9yeVNjb3BlSW5mbyogbWVtb3J5X3Njb3BlID0gY2FsbHN0YWNrLmJhY2soKTsKKworICAgIGNvbnN0IGJvb2wgc2tpcCA9CisgICAgICAgIFNiU3RyaW5nRmluZFN0cmluZyhtZW1vcnlfc2NvcGUtPmZ1bmN0aW9uX25hbWVfLCAianNfbWFsbG9jIikgfHwKKyAgICAgICAgU2JTdHJpbmdGaW5kU3RyaW5nKG1lbW9yeV9zY29wZS0+ZnVuY3Rpb25fbmFtZV8sICJqc19yZWFsbG9jIikgfHwKKyAgICAgICAgU2JTdHJpbmdGaW5kU3RyaW5nKG1lbW9yeV9zY29wZS0+ZnVuY3Rpb25fbmFtZV8sICJuZXdfIik7CisKKyAgICAvLyBTa2lwIHVwIG9uZSBjYWxsc3RhY2sgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIHRyYWNrIGNhbGxzIHRvCisgICAgLy8gYWxsb2NhdGlvbiBmdW5jdGlvbnMuCisgICAgaWYgKHNraXAgJiYgY2FsbHN0YWNrLnNpemUoKSA+IDEpIHsKKyAgICAgIG1lbW9yeV9zY29wZSA9IGNhbGxzdGFja1tjYWxsc3RhY2suc2l6ZSgpIC0gMl07CisgICAgfQorCisgICAgY29uc3QgY2hhciogZmlsZV9uYW1lID0gQmFzZU5hbWVGYXN0KG1lbW9yeV9zY29wZS0+ZmlsZV9uYW1lXyk7CisKKyAgICAvLyBHZW5lcmF0ZXMgYSBzeW1ib2wuCisgICAgLy8gRXhhbXBsZToKKyAgICAvLyAgICJKYXZhc2NyaXB0OkludGVycHJldGVyLmNwcCg0MTUpOlJ1blNjcmlwdCgpIgorICAgIGNoYXIgc3ltYm9sX2J1ZmZbMTI4XTsKKyAgICBTYlN0cmluZ0Zvcm1hdEYoc3ltYm9sX2J1ZmYsIHNpemVvZihzeW1ib2xfYnVmZiksICIlczolcyglZCk6OiVzKCkiLAorICAgICAgICAgICAgICAgICAgICBtZW1vcnlfc2NvcGUtPm1lbW9yeV9zY29wZV9uYW1lXywgZmlsZV9uYW1lLAorICAgICAgICAgICAgICAgICAgICBtZW1vcnlfc2NvcGUtPmxpbmVfbnVtYmVyXywgbWVtb3J5X3Njb3BlLT5mdW5jdGlvbl9uYW1lXyk7CisKKyAgICAvLyBHZXQncyBhIHVuaXF1ZSBwb2ludGVyIHRvIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHN5bWJvbC4gSWYgdGhlIHN5bWJvbAorICAgIC8vIHdhcyBwcmV2aW91c2x5IGdlbmVyYXRlZCB0aGVuIHRoZSBwcmV2aW91cyBzeW1ib2wgaXMgcmV0dXJuZWQuCisgICAgcmV0dXJuICZzdHJpbmdfcG9vbF8uSW50ZXJuKHN5bWJvbF9idWZmKTsKKyAgfQorfQorCitjb25zdCBzdGQ6OnN0cmluZyogTWVtb3J5VHJhY2tlckxlYWtGaW5kZXI6OlRyeUdldEphdmFzY3JpcHRTeW1ib2woKSB7CisgIHNjcmlwdDo6bW96anM6OnV0aWw6OlN0YWNrVHJhY2VHZW5lcmF0b3IqIGpzX3N0YWNrX2dlbiA9CisgICAgICBzY3JpcHQ6Om1vempzOjp1dGlsOjpHZXRUaHJlYWRMb2NhbFN0YWNrVHJhY2VHZW5lcmF0b3IoKTsKKyAgaWYgKCFqc19zdGFja19nZW4gfHwgIWpzX3N0YWNrX2dlbi0+VmFsaWQoKSkgcmV0dXJuIE5VTEw7CisKKyAgLy8gT25seSBnZXQgb25lIHN5bWJvbC4KKyAgc3RkOjpzdHJpbmcgc3ltYm9sOworICBpZiAoIWpzX3N0YWNrX2dlbi0+R2VuZXJhdGVTdGFja1RyYWNlU3RyaW5nKDEsICZzeW1ib2wpKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc3ltYm9sID0gUmVtb3ZlU3RyaW5nKHN5bWJvbCwga05ld0xpbmUpOworICBjb25zdCBjaGFyKiBmaWxlX25hbWUgPSBCYXNlTmFtZUZhc3Qoc3ltYm9sLmNfc3RyKCkpOworICByZXR1cm4gJnN0cmluZ19wb29sXy5JbnRlcm4oZmlsZV9uYW1lKTsKK30KKwordm9pZCBNZW1vcnlUcmFja2VyTGVha0ZpbmRlcjo6U2FtcGxlU25hcHNob3QoCisgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nKiwgQWxsb2NSZWM+ID4qIGRlc3RpbmF0aW9uKSB7CisgIGRlc3RpbmF0aW9uLT5lcmFzZShkZXN0aW5hdGlvbi0+YmVnaW4oKSwgZGVzdGluYXRpb24tPmVuZCgpKTsKKworICBjb25zdCBzaXplX3Qgc2FtcGxlX3NpemUgPSBmcmFtZV9tYXBfLkdldFNpemUoKTsKKworICAvLyBEbyB0aGlzIGxvY2FsbHkuCisgIGRlc3RpbmF0aW9uLT5yZXNlcnZlKHNhbXBsZV9zaXplICsgMTApOworICBmcmFtZV9tYXBfLkNvcHlUb1N0ZFZlY3RvcihkZXN0aW5hdGlvbik7Cit9CisKK3N0ZDo6c3RyaW5nIE1lbW9yeVRyYWNrZXJMZWFrRmluZGVyOjpHZW5lcmF0ZUNTVigKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxiYXNlOjpUaW1lRGVsdGE+JiB0aW1lX3ZhbHVlcywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxBbGxvY2F0aW9uUHJvZmlsZT4mIGRhdGEpIHsKKyAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgIHNzIDw8IHN0ZDo6Zml4ZWQ7ICAvLyBUdXJuIG9mZiBzY2llbnRpZmljIG5vdGF0aW9uIGZvciBDU1YgdmFsdWVzLgorICBzcyA8PCBzdGQ6OnNldHByZWNpc2lvbigzKTsKKyAgc3MgPDwga05ld0xpbmUgPDwga05ld0xpbmU7CisKKyAgLy8gSEVBREVSCisgIHNzIDw8ICIvLyBBbGxvY2F0aW9uIGluIG1lZ2FieXRlcy4iIDw8IGtOZXdMaW5lOworICBzcyA8PCBrUXVvdGUgPDwgIlRpbWUobWluKSIgPDwga1F1b3RlIDw8IGtEZWxpbWl0ZXI7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgZGF0YS5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEFsbG9jYXRpb25Qcm9maWxlJiBhbGxvY19wcm9maWxlID0gZGF0YVtpXTsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSA9ICphbGxvY19wcm9maWxlLm5hbWVfOworICAgIHNzIDw8IGtRdW90ZSA8PCBuYW1lIDw8IGtRdW90ZSA8PCBrRGVsaW1pdGVyOworICB9CisgIHNzIDw8IGtOZXdMaW5lOworCisgIC8vIEJPRFkKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aW1lX3ZhbHVlcy5zaXplKCk7ICsraSkgeworICAgIGZvciAoc2l6ZV90IGogPSAwOyBqIDwgZGF0YS5zaXplKCk7ICsraikgeworICAgICAgaWYgKGogPT0gMCkgeworICAgICAgICBkb3VibGUgbWlucyA9IHRpbWVfdmFsdWVzW2ldLkluU2Vjb25kc0YoKSAvIDYwLmY7CisgICAgICAgIGlmIChtaW5zIDwgLjAwMSkgeworICAgICAgICAgIG1pbnMgPSAwOworICAgICAgICB9CisgICAgICAgIHNzIDw8IG1pbnMgPDwga0RlbGltaXRlcjsKKyAgICAgIH0KKworICAgICAgY29uc3QgQWxsb2NhdGlvblByb2ZpbGUmIGFsbG9jX3Byb2ZpbGUgPSBkYXRhW2pdOworICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QWxsb2NSZWM+JiBhbGxvY19oaXN0b3J5ID0KKyAgICAgICAgICAqYWxsb2NfcHJvZmlsZS5hbGxvY19oaXN0b3J5XzsKKworICAgICAgZG91YmxlIG1lZ2FieXRlcyA9IHN0YXRpY19jYXN0PGRvdWJsZT4oYWxsb2NfaGlzdG9yeVtpXS50b3RhbF9ieXRlcykgLworICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGRvdWJsZT4oMTAyNCAqIDEwMjQpOworCisgICAgICBEQ0hFQ0tfRVEoYWxsb2NfaGlzdG9yeS5zaXplKCksIHRpbWVfdmFsdWVzLnNpemUoKSk7CisgICAgICBzcyA8PCBtZWdhYnl0ZXMgPDwga0RlbGltaXRlcjsKKyAgICB9CisgICAgc3MgPDwga05ld0xpbmU7CisgIH0KKyAgc3MgPDwga05ld0xpbmUgPDwga05ld0xpbmU7CisgIHNzIDw8ICIvLyBPYmplY3QgY291bnRzLiIgPDwga05ld0xpbmU7CisgIHNzIDw8IGtRdW90ZSA8PCAiVGltZShtaW4pIiA8PCBrUXVvdGUgPDwga0RlbGltaXRlcjsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBkYXRhLnNpemUoKTsgKytpKSB7CisgICAgY29uc3QgQWxsb2NhdGlvblByb2ZpbGUmIGFsbG9jX3Byb2ZpbGUgPSBkYXRhW2ldOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lID0gKmFsbG9jX3Byb2ZpbGUubmFtZV87CisgICAgc3MgPDwga1F1b3RlIDw8IG5hbWUgPDwga1F1b3RlIDw8IGtEZWxpbWl0ZXI7CisgIH0KKyAgc3MgPDwga05ld0xpbmU7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdGltZV92YWx1ZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGRhdGEuc2l6ZSgpOyArK2opIHsKKyAgICAgIGlmIChqID09IDApIHsKKyAgICAgICAgZG91YmxlIG1pbnMgPSB0aW1lX3ZhbHVlc1tpXS5JblNlY29uZHNGKCkgLyA2MC5mOworICAgICAgICBpZiAobWlucyA8IC4wMDEpIHsKKyAgICAgICAgICBtaW5zID0gMDsKKyAgICAgICAgfQorICAgICAgICBzcyA8PCBtaW5zIDw8IGtEZWxpbWl0ZXI7CisgICAgICB9CisgICAgICBjb25zdCBBbGxvY2F0aW9uUHJvZmlsZSYgYWxsb2NfcHJvZmlsZSA9IGRhdGFbal07CisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBbGxvY1JlYz4mIGFsbG9jX2hpc3RvcnkgPQorICAgICAgICAgICphbGxvY19wcm9maWxlLmFsbG9jX2hpc3RvcnlfOworICAgICAgRENIRUNLX0VRKGFsbG9jX2hpc3Rvcnkuc2l6ZSgpLCB0aW1lX3ZhbHVlcy5zaXplKCkpOworICAgICAgc3MgPDwgYWxsb2NfaGlzdG9yeVtpXS5udW1fYWxsb2NzIDw8IGtEZWxpbWl0ZXI7CisgICAgfQorICAgIHNzIDw8IGtOZXdMaW5lOworICB9CisKKyAgc3MgPDwga05ld0xpbmUgPDwga05ld0xpbmU7CisgIHJldHVybiBzcy5zdHIoKTsKK30KKwordm9pZCBNZW1vcnlUcmFja2VyTGVha0ZpbmRlcjo6R2VuZXJhdGVUb3BMZWFraW5nQWxsb2NhdGlvblByb2ZpbGVzKAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJhc2U6OlRpbWVEZWx0YT4mIHRpbWVfdmFsdWVzLCBjb25zdCBNYXBTYW1wbGVzJiBzYW1wbGVzLAorICAgIHN0ZDo6dmVjdG9yPEFsbG9jYXRpb25Qcm9maWxlPiogZGVzdGluYXRpb24pIHsKKyAgLy8gR0VORVJBVEUgTElORUFSIFJFR1JFU1NJT04gTElORQorICAvLyBmaXJzdCB2YWx1ZSBpcyB0aW1lIGluIG1pY3Jvc2Vjb25kcy4KKyAgLy8gc2Vjb25kIHZhbHVlIGlzIHRvdGFsX2J5dGVzLgorICBzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8aW50NjRfdCwgaW50NjRfdD4gPiBzYW1wbGVfZGF0YTsKKworICB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IHN0ZDo6c3RyaW5nKiwgU2xvcGVZSW50ZXJjZXB0PiBMaW5lYXJSZWdyZXNzaW9uTWFwOworICBMaW5lYXJSZWdyZXNzaW9uTWFwIGxpbmVhcl9yZWdyZXNzaW9uX21hcDsKKworICBzdGQ6OnZlY3RvcjxBbGxvY2F0aW9uUHJvZmlsZT4gYWxsb2NhdGlvbl9wcm9maWxlczsKKworICBmb3IgKE1hcFNhbXBsZXM6OmNvbnN0X2l0ZXJhdG9yIGl0ID0gc2FtcGxlcy5iZWdpbigpOyBpdCAhPSBzYW1wbGVzLmVuZCgpOworICAgICAgICsraXQpIHsKKyAgICBjb25zdCBzdGQ6OnN0cmluZyogYWxsb2NhdGlvbl9uYW1lID0gaXQtPmZpcnN0OworICAgIGNvbnN0IHN0ZDo6dmVjdG9yPEFsbG9jUmVjPiYgYWxsb2NhdGlvbl9zYW1wbGVzID0gaXQtPnNlY29uZDsKKworICAgIGlmIChhbGxvY2F0aW9uX3NhbXBsZXMuZW1wdHkoKSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gRmlsdGVyIG91dCBhbGxvY2F0aW9ucyByZWNvcmRzIHRoYXQgaGF2ZSBsb3cgbnVtYmVyIG9mIGFsbG9jYXRpb25zLgorICAgIGlmIChhbGxvY2F0aW9uX3NhbXBsZXMuYmFjaygpLm51bV9hbGxvY3MgPCAxMCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gRmlsdGVyIG91dCBhbGxvY2F0aW9ucyB0aGF0IGFyZSBpbnNpZ25pZmljYW50LgorICAgIGludDY0X3QgbGFyZ2VzdF9hbGxvY2F0aW9uX3NhbXBsZSA9IDA7CisgICAgY29uc3QgaW50NjRfdCBrTWluQWxsb2NhdGlvblNpemUgPSAxMDI0ICogNjQ7CisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBhbGxvY2F0aW9uX3NhbXBsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGludDY0X3QgYnl0ZXMgPSBhbGxvY2F0aW9uX3NhbXBsZXNbaV0udG90YWxfYnl0ZXM7CisgICAgICBsYXJnZXN0X2FsbG9jYXRpb25fc2FtcGxlID0gc3RkOjptYXgobGFyZ2VzdF9hbGxvY2F0aW9uX3NhbXBsZSwgYnl0ZXMpOworICAgIH0KKyAgICBpZiAobGFyZ2VzdF9hbGxvY2F0aW9uX3NhbXBsZSA8IGtNaW5BbGxvY2F0aW9uU2l6ZSkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgLy8gRmlsdGVyIG91dCBhbGxvY2F0aW9ucyB3aGVyZSB0aGVyZSBpcyBubyBncm93dGggYmV0d2VlbiBmaXJzdCBxdWFydGlsZQorICAgIC8vIGFuZCBmaW5hbCBvdXRwdXQuCisgICAgY29uc3QgQWxsb2NSZWMmIGZpcnN0X3F1YXJ0aWxlX3NhbXBsZSA9CisgICAgICAgIGFsbG9jYXRpb25fc2FtcGxlc1thbGxvY2F0aW9uX3NhbXBsZXMuc2l6ZSgpIC8gNF07CisgICAgY29uc3QgQWxsb2NSZWMmIGZpbmFsX3NhbXBsZSA9IGFsbG9jYXRpb25fc2FtcGxlcy5iYWNrKCk7CisKKyAgICBjb25zdCBkb3VibGUgaW5jcmVhc2VfcmF0aW8gPQorICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGZpbmFsX3NhbXBsZS50b3RhbF9ieXRlcykgLworICAgICAgICBzdGF0aWNfY2FzdDxkb3VibGU+KGZpcnN0X3F1YXJ0aWxlX3NhbXBsZS50b3RhbF9ieXRlcyk7CisKKyAgICAvLyA1JSB0aHJlc2hvbGQgb2YgaW5jcmVhc2UgdG8gYmUgcXVhbGlmaWVkIGFzIGEgbGVhZC4KKyAgICBzdGF0aWMgY29uc3QgZG91YmxlIGtNaW5JbmNyZWFzZVRocmVzaG9sZCA9IC4wNTsKKworICAgIC8vIElmIHRoZSBpbmNyZWFzZSBiZXR3ZWVuIGZpcnN0IHF1YXJ0aWxlIGFuZCBmaW5hbCBzYW1wbGUgbGVzcyB0aGFuIDUlCisgICAgLy8gdGhlbiBza2lwLgorICAgIGlmIChpbmNyZWFzZV9yYXRpbyA8IGtNaW5JbmNyZWFzZVRocmVzaG9sZCkgeworICAgICAgY29udGludWU7CisgICAgfQorCisgICAgc2FtcGxlX2RhdGEuY2xlYXIoKTsgIC8vIFJlY3ljbGUuCisgICAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCB0aW1lX3ZhbHVlcy5zaXplKCk7ICsraSkgeworICAgICAgc3RkOjpwYWlyPGludDY0X3QsIGludDY0X3Q+IGRhdHVtKHRpbWVfdmFsdWVzW2ldLkluTWljcm9zZWNvbmRzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NhdGlvbl9zYW1wbGVzW2ldLnRvdGFsX2J5dGVzKTsKKyAgICAgIHNhbXBsZV9kYXRhLnB1c2hfYmFjayhkYXR1bSk7CisgICAgfQorCisgICAgZG91YmxlIHNsb3BlID0gMDsKKyAgICBkb3VibGUgeV9pbnRlcmNlcHQgPSAwOworICAgIGJvb2wgdmFsaWQgPSBHZXRMaW5lYXJGaXQoc2FtcGxlX2RhdGEuYmVnaW4oKSwgc2FtcGxlX2RhdGEuZW5kKCksICZzbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ5X2ludGVyY2VwdCk7CisgICAgRENIRUNLKHZhbGlkKTsKKyAgICBsaW5lYXJfcmVncmVzc2lvbl9tYXBbYWxsb2NhdGlvbl9uYW1lXSA9CisgICAgICAgIFNsb3BlWUludGVyY2VwdChzbG9wZSwgeV9pbnRlcmNlcHQpOworICAgIEFsbG9jYXRpb25Qcm9maWxlIGFsbG9jX3Byb2ZpbGUoYWxsb2NhdGlvbl9uYW1lLCAmYWxsb2NhdGlvbl9zYW1wbGVzLCBzbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHlfaW50ZXJjZXB0KTsKKyAgICBhbGxvY19wcm9maWxlLmxlYWtfcG90ZW50aWFsXyA9CisgICAgICAgIGFsbG9jYXRpb25fc2FtcGxlcy5iYWNrKCkudG90YWxfYnl0ZXMgKiBzbG9wZTsKKyAgICBhbGxvY2F0aW9uX3Byb2ZpbGVzLnB1c2hfYmFjayhhbGxvY19wcm9maWxlKTsKKyAgfQorCisgIHN0ZDo6c29ydChhbGxvY2F0aW9uX3Byb2ZpbGVzLmJlZ2luKCksIGFsbG9jYXRpb25fcHJvZmlsZXMuZW5kKCksCisgICAgICAgICAgICBBbGxvY2F0aW9uUHJvZmlsZTo6Q29tcGFyZUxlYWtQb3RlbnRpYWwpOworICAvLyBCaWdnZXN0IG9uZSBmaXJzdC4KKyAgc3RkOjpyZXZlcnNlKGFsbG9jYXRpb25fcHJvZmlsZXMuYmVnaW4oKSwgYWxsb2NhdGlvbl9wcm9maWxlcy5lbmQoKSk7CisgICpkZXN0aW5hdGlvbiA9IGFsbG9jYXRpb25fcHJvZmlsZXM7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBtZW1vcnlfdHJhY2tlcgogfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sX2ltcGwuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sX2ltcGwuaAppbmRleCA5ZDdjM2Y2Li43MDZkYzhhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbF9pbXBsLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL21lbW9yeV90cmFja2VyX3Rvb2xfaW1wbC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9NRU1PUllfVFJBQ0tFUl9NRU1PUllfVFJBQ0tFUl9UT09MX0lNUExfSF8KICNkZWZpbmUgQ09CQUxUX0JST1dTRVJfTUVNT1JZX1RSQUNLRVJfTUVNT1JZX1RSQUNLRVJfVE9PTF9JTVBMX0hfCkBAIC0yMCw2ICsxOCw3IEBACiAjaW5jbHVkZSA8ZGVxdWU+CiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx1dGlsaXR5PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKQEAgLTMxLDYgKzMwLDkgQEAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9idWZmZXJlZF9maWxlX3dyaXRlci5oIgogI2luY2x1ZGUgIm5iL2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlci5oIgogI2luY2x1ZGUgIm5iL2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl9oZWxwZXJzLmgiCisjaW5jbHVkZSAibmIvY29uY3VycmVudF9tYXAuaCIKKyNpbmNsdWRlICJuYi9zdHJpbmdfaW50ZXJuZXIuaCIKKyNpbmNsdWRlICJuYi90aHJlYWRfbG9jYWxfb2JqZWN0LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeV9yZXBvcnRlci5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTE0NSw0MyArMTQ3LDM4IEBACiAgIFRpbWVTdGFtcHMgdGltZV9zdGFtcHNfOwogfTsKIAotLy8gR2VuZXJhdGVzIENTViB2YWx1ZXMgb2YgdGhlIGVuZ2luZSBvZiBhIGNvbXByZXNzZWQtc2NhbGUgVGltZVNlcmllcy4KKy8vIEdlbmVyYXRlcyBDU1YgdmFsdWVzIG9mIHRoZSBlbmdpbmUgbWVtb3J5LiBUaGlzIGluY2x1ZGVzIG1lbW9yeQorLy8gY29uc3VtcHRpb24gaW4gYnl0ZXMgYW5kIGFsc28gdGhlIG51bWJlciBvZiBhbGxvY2F0aW9ucy4KKy8vIEFsbG9jYXRpb25zIGFyZSBzZWdtZW50ZWQgYnkgY2F0ZWdvcnkgc3VjaCBhcyAiSmF2YXNjcmlwdCIgYW5kICJOZXR3b3JrIGFuZAorLy8gYXJlIHBlcmlvZGljYWxseSBkdW1wZWQgdG8gdGhlIFBhcmFtczo6YWJzdHJhY3RfbG9nZ2VyXy4KIC8vCi0vLyBBIGNvbXByZXNzZWQtc2NhbGUgVGltZVNlcmllcyBpcyBkZWZpbmVkIGFzIGEgdGltZSBzZXJpZXMgd2hpY2ggaGFzCi0vLyBoaWdoZXIgcmVzb2x1dGlvbiBhdCB0aGUgbW9zdCByZWNlbnQgc2FtcGxpbmcgYW5kIGJlY29tZXMgcHJvZ3Jlc3NpdmVseQotLy8gbG93ZXIgcmVzb2x1dGlvbiBhcyB0aW1lIGdvZXMgYmFja3dhcmQuCisvLyBDb21wcmVzc2lvbjoKKy8vICBEdXJpbmcgZWFybHkgcnVuLCB0aGUgc2FtcGxpbmcgcmF0ZSBpcyBleHRyZW1lbHkgaGlnaCwgaG93ZXZlciB0aGUgc2FtcGxpbmcKKy8vICByYXRlIHdpbGwgZGVncmFkZSBieSBoYWxmIGVhY2ggdGltZSB0aGUgc2FtcGxpbmcgYnVmZmVyIGZpbGxzIHVwLgogLy8KLS8vIEZvciBleGFtcGxlLCBoZXJlIGlzIGEgY29tcHJlc3NlZC1oaXN0b2dyYW0gb2Ygb3JkZXIgMiwgd2hpY2ggbG9zZXMKLS8vIDUwJSByZXNvbHV0aW9uIG9uIGVhY2ggc2VjdGlvbiBnb2luZyBiYWNrLgorLy8gIEFkZGl0aW9uYWxseSwgZXZlcnkgdGltZSB0aGUgc2FtcGxpbmcgYnVmZmVyIGZpbGxzIHVwLCBzcGFjZSBpcyBmcmVlZCBieQorLy8gIGV2aWN0aW5nIGV2ZXJ5IG90aGVyIGVsZW1lbnQuCiAvLwotLy8gU3RhcnR1cCArLS0tLS0tLT4gICstLS0tLS0tLSsgLi4lIFJlc29sdXRpb24KLS8vICAgICAgICAgICAgICAgICAgICArLS0tLS0tLS0rCi0vLyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfCAxMiUgUmVzb2x1dGlvbgotLy8gICAgICAgICAgICAgICAgICAgICstLS0tLS0tLSsKLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfCAyNSUgUmVzb2x1dGlvbgotLy8gICAgICAgICAgICAgICAgICAgICstLS0tLS0tLSsKLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwgNTAlIFJlc29sdXRpb24KLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgICstLS0tLS0tLSsKLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8IDEwMCUgUmVzb2x1dGlvbgotLy8gICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKLS8vICAgICAgICAgICAgICAgICAgICB8ICAgICAgICB8Ci0vLyAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgfAotLy8gICAgICAgICAgICAgICAgICAgIHwgICAgICAgIHwKLS8vIEVuZCBUaW1lICstLS0tLS0+ICArLS0tLS0tLS0rCisvLyBFeGFtcGxlIG91dHB1dDoKKy8vICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgLy8gQ1NWIG9mIEJZVEVTIGFsbG9jYXRlZCBwZXIgcmVnaW9uIChNQidzKS4KKy8vICAvLyBVbml0cyBhcmUgaW4gTWVnYWJ5dGVzLiBUaGlzIGlzIGRlc2lnbmVkCisvLyAgLy8gdG8gYmUgdXNlZCBpbiBhIHN0YWNrZWQgZ3JhcGguCisvLyAgIlRpbWUobWlucykiLCJDU1MiLCJET00iLCJKYXZhc2NyaXB0IiwiTWVkaWEiLCJNZXNzYWdlTG9vcCIuLi4uCisvLyAgMCwwLDAsMCwwLDAuLi4KKy8vICAxMDIyLjU0LDMuMyw3LjE5LDQ5LjkzLDUwLjMzLi4uLgorLy8gIC4uLgorLy8gIC8vIEVORCBDU1Ygb2YgQllURVMgYWxsb2NhdGVkIHBlciByZWdpb24uCisvLyAgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogLy8KLS8vIFRoZSB0aGUgY29tcHJlc3NlZCBoaXN0b2dyYW0gaXMgZHVtcGVkIG91dCBhcyBhIENTViBzdHJpbmcgcGVyaW9kaWNhbGx5IHRvCi0vLyB0aGUgb3V0cHV0IHN0cmVhbS4KKy8vICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCisvLyAgLy8gQ1NWIG9mIENPVU5UIG9mIGFsbG9jYXRpb25zIHBlciByZWdpb24uCisvLyAgIlRpbWUobWlucykiLCJDU1MiLCJET00iLCJKYXZhc2NyaXB0IiwiTWVkaWEiLCJNZXNzYWdlTG9vcCIuLi4uCisvLyAgMCwwLDAsMCwwLDAuLi4KKy8vICAxMDIyLjU0LDU3NDU4LDcwMDExLDQyMzIxNywyNyw1NDQ5NSw0MzQ2MC4uLgorLy8gIC4uLgorLy8gIC8vIEVORCBDU1Ygb2YgQ09VTlQgb2YgYWxsb2NhdGlvbnMgcGVyIHJlZ2lvbi4KKy8vICAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiBjbGFzcyBNZW1vcnlUcmFja2VyQ29tcHJlc3NlZFRpbWVTZXJpZXMgOiBwdWJsaWMgQWJzdHJhY3RNZW1vcnlUcmFja2VyVG9vbCB7CiAgcHVibGljOgogICBNZW1vcnlUcmFja2VyQ29tcHJlc3NlZFRpbWVTZXJpZXMoKTsKQEAgLTE5Nyw3ICsxOTQsNiBAQAogICBzdGF0aWMgYm9vbCBJc0Z1bGwoY29uc3QgVGltZVNlcmllcyYgaGlzdG9ncmFtLCBzaXplX3QgbnVtX3NhbXBsZXMpOwogICBzdGF0aWMgdm9pZCBDb21wcmVzcyhUaW1lU2VyaWVzKiBoaXN0b2dyYW0pOwogCi0gIGNvbnN0IGludCBzYW1wbGVfaW50ZXJ2YWxfbXNfOwogICBjb25zdCBpbnQgbnVtYmVyX3NhbXBsZXNfOwogfTsKIApAQCAtMzQwLDYgKzMzNiwxMzEgQEAKICAgc2NvcGVkX3B0cjxCdWZmZXJlZEZpbGVXcml0ZXI+IGJ1ZmZlcmVkX2ZpbGVfd3JpdGVyXzsKIH07CiAKKy8vIFJlY29yZHMgYWxsb2NhdGlvbnMgYW5kIG91dHB1dHMgbGVha3MgYXMgYSBDU1YuIEVhY2ggY29sdW1uIHdpbGwKKy8vIGhhdmUgYW4gYXNzb2NpYXRlZCBzeW1ib2wuCitjbGFzcyBNZW1vcnlUcmFja2VyTGVha0ZpbmRlcgorICAgIDogcHVibGljIEFic3RyYWN0TWVtb3J5VHJhY2tlclRvb2wsCisgICAgICBwdWJsaWMgbmI6OmFuYWx5dGljczo6TWVtb3J5VHJhY2tlckRlYnVnQ2FsbGJhY2sgeworIHB1YmxpYzoKKyAgZW51bSBTdGFja1RyYWNlTW9kZSB7CisgICAgLy8gQWx3YXlzIGdldCB0aGUgQysrIHZlcnNpb24gb2YgdGhlIHN0YWNrIHRyYWNlLgorICAgIGtDUGx1c1BsdXMsCisgICAgLy8gV2hlbmV2ZXIgcG9zc2libGUsIGdldCB0aGUgamF2YXNjcmlwdCBzdGFjayB0cmFjZSwKKyAgICAvLyBlbHNlIGZhbGxiYWNrIHRvIENQbHVzUGx1cy4KKyAgICBrSmF2YXNjcmlwdCwKKyAgfTsKKworICBleHBsaWNpdCBNZW1vcnlUcmFja2VyTGVha0ZpbmRlcihTdGFja1RyYWNlTW9kZSBwcmVmKTsKKyAgdmlydHVhbCB+TWVtb3J5VHJhY2tlckxlYWtGaW5kZXIoKTsKKworICAvLyBPbk1lbW9yeUFsbG9jYXRpb24oKSBhbmQgT25NZW1vcnlEZWFsbG9jYXRpb24oKSBhcmUgcGFydCBvZgorICAvLyBjbGFzcyBNZW1vcnlUcmFja2VyRGVidWdDYWxsYmFjay4KKyAgdm9pZCBPbk1lbW9yeUFsbG9jYXRpb24oY29uc3Qgdm9pZCogbWVtb3J5X2Jsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYjo6YW5hbHl0aWNzOjpBbGxvY2F0aW9uUmVjb3JkJiByZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG5iOjphbmFseXRpY3M6OkNhbGxTdGFjayYgY2FsbHN0YWNrKSBPVkVSUklERTsKKworICB2b2lkIE9uTWVtb3J5RGVhbGxvY2F0aW9uKGNvbnN0IHZvaWQqIG1lbW9yeV9ibG9jaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBuYjo6YW5hbHl0aWNzOjpBbGxvY2F0aW9uUmVjb3JkJiByZWNvcmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbmI6OmFuYWx5dGljczo6Q2FsbFN0YWNrJiBjYWxsc3RhY2spIE9WRVJSSURFOworCisgIC8vIEludGVyZmFjZSBBYnN0cmFjdE1lbW9yeVRyYWNrZXJUb29sCisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgdG9vbF9uYW1lKCkgY29uc3QgT1ZFUlJJREU7CisgIHZpcnR1YWwgdm9pZCBSdW4oUGFyYW1zKiBwYXJhbXMpIE9WRVJSSURFOworCisgIGNvbnN0IHN0ZDo6c3RyaW5nKiBHZXRPckNyZWF0ZVN5bWJvbCgKKyAgICAgIGNvbnN0IG5iOjphbmFseXRpY3M6OkNhbGxTdGFjayYgY2FsbHN0YWNrKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyogVHJ5R2V0SmF2YXNjcmlwdFN5bWJvbCgpOworICBjb25zdCBzdGQ6OnN0cmluZyogR2V0T3JDcmVhdGVDcGx1c1BsdXNTeW1ib2woCisgICAgICBjb25zdCBuYjo6YW5hbHl0aWNzOjpDYWxsU3RhY2smIGNhbGxzdGFjayk7CisKKyBwcml2YXRlOgorICBzdHJ1Y3QgQWxsb2NSZWM7CisgIC8vIEEgbWFwIGZyb20gY2FsbHNpdGUgLT4gYWxsb2NhdGlvbiBzaXplLgorICAvLyB0eXBlZGVmIHN0ZDo6bWFwPGNvbnN0IHN0ZDo6c3RyaW5nKiwgQWxsb2NSZWM+IEFsbG9jYXRpb25GcmFtZU1hcDsKKyAgdHlwZWRlZiBuYjo6Q29uY3VycmVudE1hcDxjb25zdCBzdGQ6OnN0cmluZyosIEFsbG9jUmVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5iOjpQT0RIYXNoZXI8Y29uc3Qgc3RkOjpzdHJpbmcqPiA+CisgICAgICBBbGxvY2F0aW9uRnJhbWVNYXA7CisKKyAgLy8gQSBtYXAgb2YgbWVtb3J5IC0+IGNhbGxzaXRlLgorICAvLyBUaGlzIGtlZXBzIHRyYWNrIG9mIHdoYXQgY2FsbHNpdGVzIGJlbG9uZyB0byB3aGljaCBhbGxvY2F0aW9ucy4KKyAgLy8gdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgY29uc3Qgc3RkOjpzdHJpbmcqPiBDYWxsRnJhbWVNYXA7CisgIC8vCisgIHR5cGVkZWYgbmI6OkNvbmN1cnJlbnRNYXA8Y29uc3Qgdm9pZCosIGNvbnN0IHN0ZDo6c3RyaW5nKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYjo6UE9ESGFzaGVyPGNvbnN0IHN0ZDo6c3RyaW5nKj4gPiBDYWxsRnJhbWVNYXA7CisKKyAgLy8gQSBtYXAgZnJvbSBjYWxsc2l0ZSAtPiBhbGxvY2F0aW9uIGRhdGEuCisgIHR5cGVkZWYgc3RkOjptYXA8Y29uc3Qgc3RkOjpzdHJpbmcqLCBzdGQ6OnZlY3RvcjxBbGxvY1JlYz4gPiBNYXBTYW1wbGVzOworICAvLyBBIHZhbHVlIHR5cGUgZm9yIGhvbGRpbmcgYSBzbG9wZSBhbmQgWS1pbnRlcmNlcHQuCisgIHR5cGVkZWYgc3RkOjpwYWlyPGRvdWJsZSwgZG91YmxlPiBTbG9wZVlJbnRlcmNlcHQ7CisgIC8vIEFuIEFsbG9jYXRpb25SZWNvcmQuCisgIHN0cnVjdCBBbGxvY1JlYyB7CisgICAgQWxsb2NSZWMoKSA6IHRvdGFsX2J5dGVzKDApLCBudW1fYWxsb2NzKDApIHt9CisgICAgQWxsb2NSZWMoY29uc3QgQWxsb2NSZWMmIG90aGVyKQorICAgICAgICA6IHRvdGFsX2J5dGVzKG90aGVyLnRvdGFsX2J5dGVzKSwgbnVtX2FsbG9jcyhvdGhlci5udW1fYWxsb2NzKSB7fQorICAgIEFsbG9jUmVjJiBvcGVyYXRvcj0oY29uc3QgQWxsb2NSZWMmIG90aGVyKSB7CisgICAgICB0b3RhbF9ieXRlcyA9IG90aGVyLnRvdGFsX2J5dGVzOworICAgICAgbnVtX2FsbG9jcyA9IG90aGVyLm51bV9hbGxvY3M7CisgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIGludDY0X3QgdG90YWxfYnl0ZXM7CisgICAgaW50MzJfdCBudW1fYWxsb2NzOworICB9OworCisgIC8vIFRoaXMgZGF0YSBzdHJ1Y3R1cmUgaXMgdXNlZCB0byBmb3Igc29ydGluZyBsZWFrcy4gVGhlIGltcG9ydGFudCB2YXJpYWJsZQorICAvLyBpcyB8bGVha19wb3RlbnRpYWx8LCB3aGljaCByZXByZXNlbnRzIGhvdyBsaWtlbHkgdGhpcyBBbGxvY2F0aW9uUHJvZmlsZQorICAvLyBpcyBhIGxlYWsuCisgIHN0cnVjdCBBbGxvY2F0aW9uUHJvZmlsZSB7CisgICAgQWxsb2NhdGlvblByb2ZpbGUoKQorICAgICAgICA6IG5hbWVfKE5VTEwpLAorICAgICAgICAgIGFsbG9jX2hpc3RvcnlfKE5VTEwpLAorICAgICAgICAgIHNsb3BlXygwKSwKKyAgICAgICAgICB5X2ludGVyY2VwdF8oMCksCisgICAgICAgICAgbGVha19wb3RlbnRpYWxfKDApIHt9CisKKyAgICBBbGxvY2F0aW9uUHJvZmlsZShjb25zdCBzdGQ6OnN0cmluZyogbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxBbGxvY1JlYz4qIGFsbG9jX2hpc3RvcnksIGRvdWJsZSBzbG9wZSwKKyAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgeV9pbnRlcmNlcHQpCisgICAgICAgIDogbmFtZV8obmFtZSksCisgICAgICAgICAgYWxsb2NfaGlzdG9yeV8oYWxsb2NfaGlzdG9yeSksCisgICAgICAgICAgc2xvcGVfKHNsb3BlKSwKKyAgICAgICAgICB5X2ludGVyY2VwdF8oeV9pbnRlcmNlcHQpLAorICAgICAgICAgIGxlYWtfcG90ZW50aWFsXygwKSB7fQorICAgIGNvbnN0IHN0ZDo6c3RyaW5nKiBuYW1lXzsKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxBbGxvY1JlYz4qIGFsbG9jX2hpc3RvcnlfOworICAgIC8vIExpbmVhciByZWdyZXNzaW9uIGRhdGEuCisgICAgZG91YmxlIHNsb3BlXzsKKyAgICBkb3VibGUgeV9pbnRlcmNlcHRfOworCisgICAgLy8gVGhpcyB0aGlzIHZhbHVlIGlzIHNldCBleHRlcm5hbGx5LiBIaWdoZXIgdmFsdWVzIGluZGljYXRlIGhpZ2hlciBjaGFuY2UKKyAgICAvLyB0aGF0IHRoaXMgaXMgYSBsZWFrLgorICAgIGRvdWJsZSBsZWFrX3BvdGVudGlhbF87CisKKyAgICBzdGF0aWMgYm9vbCBDb21wYXJlTGVha1BvdGVudGlhbChjb25zdCBBbGxvY2F0aW9uUHJvZmlsZSYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbGxvY2F0aW9uUHJvZmlsZSYgYikgeworICAgICAgcmV0dXJuIGEubGVha19wb3RlbnRpYWxfIDwgYi5sZWFrX3BvdGVudGlhbF87CisgICAgfQorICB9OworCisgIHN0YXRpYyBzdGQ6OnN0cmluZyBHZW5lcmF0ZUNTVigKKyAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPGJhc2U6OlRpbWVEZWx0YT4mIHRpbWVfdmFsdWVzLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8QWxsb2NhdGlvblByb2ZpbGU+JiBkYXRhKTsKKworICB2b2lkIFNhbXBsZVNuYXBzaG90KAorICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpwYWlyPGNvbnN0IHN0ZDo6c3RyaW5nKiwgQWxsb2NSZWM+ID4qIGRlc3RpbmF0aW9uKTsKKworICBzdGF0aWMgdm9pZCBHZW5lcmF0ZVRvcExlYWtpbmdBbGxvY2F0aW9uUHJvZmlsZXMoCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxiYXNlOjpUaW1lRGVsdGE+JiB0aW1lX3ZhbHVlcywKKyAgICAgIGNvbnN0IE1hcFNhbXBsZXMmIHNhbXBsZXMsIHN0ZDo6dmVjdG9yPEFsbG9jYXRpb25Qcm9maWxlPiogZGVzdGluYXRpb24pOworCisgIHN0YXRpYyBib29sIElzSmF2YXNjcmlwdFNjb3BlKGNvbnN0IG5iOjphbmFseXRpY3M6OkNhbGxTdGFjayYgY2FsbHN0YWNrKTsKKworICBjb25zdCBzdGQ6OnN0cmluZyogZGVmYXVsdF9jYWxsZnJhbWVfc3RyXzsKKyAgbmI6OkNvbmN1cnJlbnRTdHJpbmdJbnRlcm5lciBzdHJpbmdfcG9vbF87CisgIEFsbG9jYXRpb25GcmFtZU1hcCBmcmFtZV9tYXBfOworICBDYWxsRnJhbWVNYXAgY2FsbGZyYW1lX21hcF87CisgIFN0YWNrVHJhY2VNb2RlIHN0YWNrX3RyYWNlX21vZGVfOworfTsKIH0gIC8vIG5hbWVzcGFjZSBtZW1vcnlfdHJhY2tlcgogfSAgLy8gbmFtZXNwYWNlIGJyb3dzZXIKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbF90ZXN0LmNjCmluZGV4IGIxNWRhMWYuLjRkMTkxM2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9tZW1vcnlfdHJhY2tlci9tZW1vcnlfdHJhY2tlcl90b29sX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL21lbW9yeV90cmFja2VyL21lbW9yeV90cmFja2VyX3Rvb2xfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJidWlsZC9idWlsZF9jb25maWcuaCIgIC8vIGRlZmluZXMgT1NfU1RBUkJPQVJECiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvbWVtb3J5X3RyYWNrZXIvbWVtb3J5X3RyYWNrZXJfdG9vbF9pbXBsLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvcmVuZGVyX3RyZWVfY29tYmluZXIuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvcmVuZGVyX3RyZWVfY29tYmluZXIuY2MKaW5kZXggNmEwNzZlMS4uMTcxZmJjMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3JlbmRlcl90cmVlX2NvbWJpbmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvcmVuZGVyX3RyZWVfY29tYmluZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oCmluZGV4IDc1YmNhOWIuLjc2YjFhMjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9yZW5kZXJfdHJlZV9jb21iaW5lci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9SRU5ERVJfVFJFRV9DT01CSU5FUl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9SRU5ERVJfVFJFRV9DT01CSU5FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3Jlc291cmNlX3Byb3ZpZGVyX2FycmF5X2J1ZmZlcl9hbGxvY2F0b3IuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvcmVzb3VyY2VfcHJvdmlkZXJfYXJyYXlfYnVmZmVyX2FsbG9jYXRvci5jYwppbmRleCA5NWMzZmNlLi40NzEyMTg1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvcmVzb3VyY2VfcHJvdmlkZXJfYXJyYXlfYnVmZmVyX2FsbG9jYXRvci5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvcmVzb3VyY2VfcHJvdmlkZXJfYXJyYXlfYnVmZmVyX2FsbG9jYXRvci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9yZXNvdXJjZV9wcm92aWRlcl9hcnJheV9idWZmZXJfYWxsb2NhdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9yZXNvdXJjZV9wcm92aWRlcl9hcnJheV9idWZmZXJfYWxsb2NhdG9yLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvcmVzb3VyY2VfcHJvdmlkZXJfYXJyYXlfYnVmZmVyX2FsbG9jYXRvci5oCmluZGV4IDFhMGNjM2EuLmQ0MzY4YzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9yZXNvdXJjZV9wcm92aWRlcl9hcnJheV9idWZmZXJfYWxsb2NhdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3Jlc291cmNlX3Byb3ZpZGVyX2FycmF5X2J1ZmZlcl9hbGxvY2F0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JST1dTRVJfUkVTT1VSQ0VfUFJPVklERVJfQVJSQVlfQlVGRkVSX0FMTE9DQVRPUl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9SRVNPVVJDRV9QUk9WSURFUl9BUlJBWV9CVUZGRVJfQUxMT0NBVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3NjcmVlbl9zaG90X3dyaXRlci5jYwppbmRleCA5ZGFjMWE0Li4wMGVjZmM4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zY3JlZW5fc2hvdF93cml0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zY3JlZW5fc2hvdF93cml0ZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zY3JlZW5fc2hvdF93cml0ZXIuaAppbmRleCBlYjI0MTE1Li45ZmMyNzAyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc2NyZWVuX3Nob3Rfd3JpdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3NjcmVlbl9zaG90X3dyaXRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9TQ1JFRU5fU0hPVF9XUklURVJfSF8KICNkZWZpbmUgQ09CQUxUX0JST1dTRVJfU0NSRUVOX1NIT1RfV1JJVEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc25hcHNob3RfYXBwX3N0YXRzLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3NuYXBzaG90X2FwcF9zdGF0cy5jYwppbmRleCAwNTA5MTRmLi4wYjgzZjAyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc25hcHNob3RfYXBwX3N0YXRzLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zbmFwc2hvdF9hcHBfc3RhdHMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8Y3N0ZGlvPgogI2luY2x1ZGUgPG1hcD4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uY2MKaW5kZXggYzNhZTI3NS4uYjMwOGVhMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvc3BsYXNoX3NjcmVlbi5oIgogCkBAIC01MSw3ICs0OSw4IEBACiAgICAgICBiYXNlOjpCaW5kKCZTcGxhc2hTY3JlZW46Ok9uRXJyb3IsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAogICAgICAgYmFzZTo6QmluZCgmU3BsYXNoU2NyZWVuOjpPbldpbmRvd0Nsb3NlZCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCiAgICAgICAmc3R1Yl9tZWRpYV9tb2R1bGVfLCBuZXR3b3JrX21vZHVsZSwgd2luZG93X2RpbWVuc2lvbnMsIHJlc291cmNlX3Byb3ZpZGVyLAotICAgICAgbGF5b3V0X3JlZnJlc2hfcmF0ZSwgd2ViX21vZHVsZV9vcHRpb25zKSk7CisgICAgICBzdHViX21lZGlhX21vZHVsZV8uc3lzdGVtX3dpbmRvdygpLCBsYXlvdXRfcmVmcmVzaF9yYXRlLAorICAgICAgd2ViX21vZHVsZV9vcHRpb25zKSk7CiB9CiAKIFNwbGFzaFNjcmVlbjo6flNwbGFzaFNjcmVlbigpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3BsYXNoX3NjcmVlbi5oCmluZGV4IDMyN2NhNjQuLmEwZDY1ZjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zcGxhc2hfc2NyZWVuLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3NwbGFzaF9zY3JlZW4uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JST1dTRVJfU1BMQVNIX1NDUkVFTl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9TUExBU0hfU0NSRUVOX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3RhY2tfc2l6ZV9jb25zdGFudHMuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zdGFja19zaXplX2NvbnN0YW50cy5oCmluZGV4IGM0ZTYyZWEuLmQ2YjMzZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zdGFja19zaXplX2NvbnN0YW50cy5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zdGFja19zaXplX2NvbnN0YW50cy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9TVEFDS19TSVpFX0NPTlNUQU5UU19IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9TVEFDS19TSVpFX0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zdGFyYm9hcmQvYXBwbGljYXRpb24uY2MKaW5kZXggOTdiZDk4NS4uMDQwOWE5MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL2FwcGxpY2F0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zdGFyYm9hcmQvZXZlbnRfaGFuZGxlci5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zdGFyYm9hcmQvZXZlbnRfaGFuZGxlci5jYwppbmRleCBlMjQ0OTEyLi4yYWJjNWE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3RhcmJvYXJkL2V2ZW50X2hhbmRsZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N0YXJib2FyZC9ldmVudF9oYW5kbGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3N0YXJib2FyZC9ldmVudF9oYW5kbGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zdGFyYm9hcmQvZXZlbnRfaGFuZGxlci5oIGIvc3JjL2NvYmFsdC9icm93c2VyL3N0YXJib2FyZC9ldmVudF9oYW5kbGVyLmgKaW5kZXggZWQxMTA2NC4uZGRkYjBmMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N0YXJib2FyZC9ldmVudF9oYW5kbGVyLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N0YXJib2FyZC9ldmVudF9oYW5kbGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CUk9XU0VSX1NUQVJCT0FSRF9FVkVOVF9IQU5ETEVSX0hfCiAjZGVmaW5lIENPQkFMVF9CUk9XU0VSX1NUQVJCT0FSRF9FVkVOVF9IQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3RvcmFnZV91cGdyYWRlX2hhbmRsZXIuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3RvcmFnZV91cGdyYWRlX2hhbmRsZXIuY2MKaW5kZXggYjMwMmI5MS4uYjQwYWNmNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N0b3JhZ2VfdXBncmFkZV9oYW5kbGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zdG9yYWdlX3VwZ3JhZGVfaGFuZGxlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9zdG9yYWdlX3VwZ3JhZGVfaGFuZGxlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3RvcmFnZV91cGdyYWRlX2hhbmRsZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zdG9yYWdlX3VwZ3JhZGVfaGFuZGxlci5oCmluZGV4IDE1Yzg5NjIuLmE1MWQyM2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zdG9yYWdlX3VwZ3JhZGVfaGFuZGxlci5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zdG9yYWdlX3VwZ3JhZGVfaGFuZGxlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9TVE9SQUdFX1VQR1JBREVfSEFORExFUl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9TVE9SQUdFX1VQR1JBREVfSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3N0b3JhZ2VfdXBncmFkZV9oYW5kbGVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3RvcmFnZV91cGdyYWRlX2hhbmRsZXJfdGVzdC5jYwppbmRleCA3OWVjNGE1Li5lMmE5MmViIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3RvcmFnZV91cGdyYWRlX2hhbmRsZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvc3RvcmFnZV91cGdyYWRlX2hhbmRsZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxjc3RyaW5nPgogI2luY2x1ZGUgPHN0cmluZz4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5jYwppbmRleCBiZWNkODliLi5iMjYwZWU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvc3dpdGNoZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci9zd2l0Y2hlcy5oIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKaW5kZXggOWE2NTM3OC4uOGJlMjIxMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3N3aXRjaGVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CUk9XU0VSX1NXSVRDSEVTX0hfCiAjZGVmaW5lIENPQkFMVF9CUk9XU0VSX1NXSVRDSEVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvYW5pbWF0aW9ucy1kZW1vL2xheWVyX2Zlcm4uanMgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvYW5pbWF0aW9ucy1kZW1vL2xheWVyX2Zlcm4uanMKaW5kZXggODZmMDEzOC4uNTU3NTRlMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL2FuaW1hdGlvbnMtZGVtby9sYXllcl9mZXJuLmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9hbmltYXRpb25zLWRlbW8vbGF5ZXJfZmVybi5qcwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIHZhciBjc3NGaWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpOwogY3NzRmlsZS5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvYW5pbWF0aW9ucy1kZW1vL2xheWVyX2ludHJvLmpzIGIvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL2FuaW1hdGlvbnMtZGVtby9sYXllcl9pbnRyby5qcwppbmRleCBkMGQyMWFlLi42ZjcyYzllIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvYW5pbWF0aW9ucy1kZW1vL2xheWVyX2ludHJvLmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9hbmltYXRpb25zLWRlbW8vbGF5ZXJfaW50cm8uanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiB2YXIgY3NzRmlsZSA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ2xpbmsnKTsKIGNzc0ZpbGUuc2V0QXR0cmlidXRlKCdyZWwnLCAnc3R5bGVzaGVldCcpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL2FuaW1hdGlvbnMtZGVtby9sYXllcl9zdW4uanMgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvYW5pbWF0aW9ucy1kZW1vL2xheWVyX3N1bi5qcwppbmRleCA4YzI0ZGQxLi5kNDFjYTdiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvYW5pbWF0aW9ucy1kZW1vL2xheWVyX3N1bi5qcworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvYW5pbWF0aW9ucy1kZW1vL2xheWVyX3N1bi5qcwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIHZhciBjc3NGaWxlID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudCgnbGluaycpOwogY3NzRmlsZS5zZXRBdHRyaWJ1dGUoJ3JlbCcsICdzdHlsZXNoZWV0Jyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvY29iYWx0LW94aWRlL2NvYmFsdC1veGlkZS5qcyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9jb2JhbHQtb3hpZGUvY29iYWx0LW94aWRlLmpzCmluZGV4IDEzMzRmYzMuLjhhMTc3OWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9jb2JhbHQtb3hpZGUvY29iYWx0LW94aWRlLmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9jb2JhbHQtb3hpZGUvY29iYWx0LW94aWRlLmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogdmFyIGNvYmFsdCA9IGRvY3VtZW50LmNyZWF0ZUVsZW1lbnQoJ3NwYW4nKTsKIGNvYmFsdC50ZXh0Q29udGVudCA9ICdDb2JhbHQhJzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9tZWRpYS1lbGVtZW50LWRlbW8vbWVkaWEtZWxlbWVudC1kZW1vLmpzIGIvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL21lZGlhLWVsZW1lbnQtZGVtby9tZWRpYS1lbGVtZW50LWRlbW8uanMKaW5kZXggNzk2MmFjMi4uMzc1ZTU5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL21lZGlhLWVsZW1lbnQtZGVtby9tZWRpYS1lbGVtZW50LWRlbW8uanMKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3Rlc3RkYXRhL21lZGlhLWVsZW1lbnQtZGVtby9tZWRpYS1lbGVtZW50LWRlbW8uanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBUaGUgZGVtbyBkb2VzIHRoZSBmb2xsb3dpbmcgc3RlcHMgaW4gYSBsb29wOgogLy8gIDEuIFBsYXliYWNrIGEgcHJvZ3Jlc3NpdmUgdmlkZW8uCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdGVzdGRhdGEvc2NyaXB0LXRhZy1kZW1vL2luY3JlbWVudC1hbmQtcHJpbnQtaS5qcyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9zY3JpcHQtdGFnLWRlbW8vaW5jcmVtZW50LWFuZC1wcmludC1pLmpzCmluZGV4IDI1ZGEzMjEuLmY0YWMzNzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9zY3JpcHQtdGFnLWRlbW8vaW5jcmVtZW50LWFuZC1wcmludC1pLmpzCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci90ZXN0ZGF0YS9zY3JpcHQtdGFnLWRlbW8vaW5jcmVtZW50LWFuZC1wcmludC1pLmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogaSA9IGkgKyAxOwogcHJpbnQoJ3NjcmlwdCBydW5uaW5nLCBpID0gJyArIGkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3RyYWNlX21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdHJhY2VfbWFuYWdlci5jYwppbmRleCBjYjQ5YjM0Li42YTMxNzc0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvdHJhY2VfbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdHJhY2VfbWFuYWdlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci90cmFjZV9tYW5hZ2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci90cmFjZV9tYW5hZ2VyLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvdHJhY2VfbWFuYWdlci5oCmluZGV4IDhhY2U3YjguLmZmYTJjOGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci90cmFjZV9tYW5hZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3RyYWNlX21hbmFnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JST1dTRVJfVFJBQ0VfTUFOQUdFUl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9UUkFDRV9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdXJsX2hhbmRsZXIuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvdXJsX2hhbmRsZXIuY2MKaW5kZXggMDJlNThmNi4uZWJlM2ZhNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3VybF9oYW5kbGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci91cmxfaGFuZGxlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci91cmxfaGFuZGxlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvdXJsX2hhbmRsZXIuaCBiL3NyYy9jb2JhbHQvYnJvd3Nlci91cmxfaGFuZGxlci5oCmluZGV4IDc0MGYwNGEuLjY4OTNkMDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci91cmxfaGFuZGxlci5oCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci91cmxfaGFuZGxlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQlJPV1NFUl9VUkxfSEFORExFUl9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9VUkxfSEFORExFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuY2MgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYwppbmRleCBlMWFiN2RjLi44Y2U3OWNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5jYwpAQCAtMSwyMSArMSwyMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmgiCiAKKyNpbmNsdWRlIDxzc3RyZWFtPgorCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9jb21tYW5kX2xpbmUuaCIKICNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCkBAIC0yMyw4ICsyMyw5IEBACiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKLSNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS9mb2N1c19vYnNlcnZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L3NjcmVlbl9yZWFkZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS9zdGFyYm9hcmRfdHRzX2VuZ2luZS5oIgorI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L3R0c19lbmdpbmUuaCIKICNpbmNsdWRlICJjb2JhbHQvYWNjZXNzaWJpbGl0eS90dHNfbG9nZ2VyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvY192YWwuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2xsZXIuaCIKQEAgLTM2LDEzICszNywxOSBAQAogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXJfbW9kdWxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ibG9iLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jc3BfZGVsZWdhdGVfZmFjdG9yeS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZWxlbWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9zdG9yYWdlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS91cmwuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci9wYXJzZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2MuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2phdmFzY3JpcHRfZW5naW5lLmgiCiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmgiCisjaW5jbHVkZSAiY29iYWx0L3N5c3RlbV93aW5kb3cvc3lzdGVtX3dpbmRvdy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9hY2Nlc3NpYmlsaXR5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGJyb3dzZXIgewpAQCAtMTAzLDYgKzExMCw0NCBAQAogICBiYXNlOjpDVmFsPGJhc2U6OmN2YWw6OlNpemVJbkJ5dGVzLCBiYXNlOjpDVmFsUHVibGljPiBqc19yZXNlcnZlZF9tZW1vcnlfOwogfTsKIAorI2lmIFNCX0hBUyhTUEVFQ0hfU1lOVEhFU0lTKQorYm9vbCBJc1RleHRUb1NwZWVjaEVuYWJsZWQoKSB7CisjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQorICAvLyBDaGVjayBmb3IgYSBjb21tYW5kLWxpbmUgb3ZlcnJpZGUgdG8gZW5hYmxlIFRUUy4KKyAgQ29tbWFuZExpbmUqIGNvbW1hbmRfbGluZSA9IENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOworICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goYnJvd3Nlcjo6c3dpdGNoZXM6OmtVc2VUVFMpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyNlbmRpZiAgLy8gZGVmaW5lZChFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorICAvLyBDaGVjayBpZiB0aGUgdHRzIGZlYXR1cmUgaXMgZW5hYmxlZCBpbiBTdGFyYm9hcmQuCisgIFNiQWNjZXNzaWJpbGl0eVRleHRUb1NwZWVjaFNldHRpbmdzIHR0c19zZXR0aW5ncyA9IHswfTsKKyAgLy8gQ2hlY2sgcGxhdGZvcm0gc2V0dGluZ3MuCisgIGlmIChTYkFjY2Vzc2liaWxpdHlHZXRUZXh0VG9TcGVlY2hTZXR0aW5ncygmdHRzX3NldHRpbmdzKSkgeworICAgIHJldHVybiB0dHNfc2V0dGluZ3MuaGFzX3RleHRfdG9fc3BlZWNoX3NldHRpbmcgJiYKKyAgICAgICAgICAgdHRzX3NldHRpbmdzLmlzX3RleHRfdG9fc3BlZWNoX2VuYWJsZWQ7CisgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisgIHJldHVybiBmYWxzZTsKK30KKyNlbmRpZiAgLy8gU0JfSEFTKFNQRUVDSF9TWU5USEVTSVMpCisKKy8vIFN0YXJ0dXBUaW1lciBpcyBkZXNpZ25lZCB0byBtZWFzdXJlIHRpbWUgc2luY2UgdGhlIHN0YXJ0dXAgb2YgdGhlIGFwcC4KKy8vIEl0IGlzIGxvYWRlciBpbml0aWFsaXplZCB0byBoYXZlIHRoZSBtb3N0IGFjY3VyYXRlIHN0YXJ0IHRpbWUgYXMgcG9zc2libGUuCitjbGFzcyBTdGFydHVwVGltZXIgeworIHB1YmxpYzoKKyAgc3RhdGljIFN0YXJ0dXBUaW1lciogSW5zdGFuY2UoKTsKKyAgYmFzZTo6VGltZURlbHRhIFRpbWVTaW5jZVN0YXJ0dXAoKSBjb25zdCB7CisgICAgcmV0dXJuIGJhc2U6OlRpbWVUaWNrczo6Tm93KCkgLSBzdGFydF90aW1lXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgU3RhcnR1cFRpbWVyKCkgOiBzdGFydF90aW1lXyhiYXNlOjpUaW1lVGlja3M6Ok5vdygpKSB7fQorICBiYXNlOjpUaW1lVGlja3Mgc3RhcnRfdGltZV87Cit9OworCitTQl9PTkNFX0lOSVRJQUxJWkVfRlVOQ1RJT04oU3RhcnR1cFRpbWVyLCBTdGFydHVwVGltZXI6Okluc3RhbmNlKTsKK1N0YXJ0dXBUaW1lciogc19vbl9zdGFydHVwX2luaXRfZG9udF91c2UgPSBTdGFydHVwVGltZXI6Okluc3RhbmNlKCk7CiB9ICAvLyBuYW1lc3BhY2UKIAogLy8gUHJpdmF0ZSBXZWJNb2R1bGUgaW1wbGVtZW50YXRpb24uIEVhY2ggV2ViTW9kdWxlIG93bnMgYSBzaW5nbGUgaW5zdGFuY2Ugb2YKQEAgLTE2MCw2ICsyMDUsOSBAQAogICB2b2lkIEZpbmlzaFN1c3BlbmQoKTsKICAgdm9pZCBSZXN1bWUocmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKTsKIAorICB2b2lkIFJlcG9ydFNjcmlwdEVycm9yKGNvbnN0IGJhc2U6OlNvdXJjZUxvY2F0aW9uJiBzb3VyY2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpOworCiAgcHJpdmF0ZToKICAgY2xhc3MgRG9jdW1lbnRMb2FkZWRPYnNlcnZlcjsKIApAQCAtMTY4LDYgKzIxNiw5IEBACiAgIHZvaWQgSW5qZWN0Q3VzdG9tV2luZG93QXR0cmlidXRlcygKICAgICAgIGNvbnN0IE9wdGlvbnM6OkluamVjdGVkV2luZG93QXR0cmlidXRlcyYgYXR0cmlidXRlcyk7CiAKKyAgLy8gQ2FsbGVkIGJ5IHxsYXlvdXRfbWFuYW5nZXJffCBhZnRlciBpdCBydW5zIHRoZSBhbmltYXRpb24gZnJhbWUgY2FsbGJhY2tzLgorICB2b2lkIE9uUmFuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoKTsKKwogICAvLyBDYWxsZWQgYnkgfGxheW91dF9tYW5hbmdlcl98IHdoZW4gaXQgcHJvZHVjZXMgYSByZW5kZXIgdHJlZS4gTWF5IG1vZGlmeQogICAvLyB0aGUgcmVuZGVyIHRyZWUgKGUuZy4gdG8gYWRkIGEgZGVidWcgb3ZlcmxheSksIHRoZW4gcnVucyB0aGUgY2FsbGJhY2sKICAgLy8gc3BlY2lmaWVkIGluIHRoZSBjb25zdHJ1Y3RvciwgfHJlbmRlcl90cmVlX3Byb2R1Y2VkX2NhbGxiYWNrX3wuCkBAIC0yMzksNiArMjkwLDkgQEAKICAgLy8gdHJhY2tlciBhcmUgY29udGFpbmVkIHdpdGhpbiBpdC4KICAgc2NvcGVkX3B0cjxicm93c2VyOjpXZWJNb2R1bGVTdGF0VHJhY2tlcj4gd2ViX21vZHVsZV9zdGF0X3RyYWNrZXJfOwogCisgIC8vIFBvc3QgYW5kIHJ1biB0YXNrcyB0byBub3RpZnkgTXV0YXRpb25PYnNlcnZlcnMuCisgIGRvbTo6TXV0YXRpb25PYnNlcnZlclRhc2tNYW5hZ2VyIG11dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlcl87CisKICAgLy8gSmF2YVNjcmlwdCBlbmdpbmUgZm9yIHRoZSBicm93c2VyLgogICBzY29wZWRfcHRyPHNjcmlwdDo6SmF2YVNjcmlwdEVuZ2luZT4gamF2YXNjcmlwdF9lbmdpbmVfOwogCkBAIC0yODIsOCArMzM2LDExIEBACiAgIC8vIFRyaWdnZXJzIGxheW91dCB3aGVuZXZlciB0aGUgZG9jdW1lbnQgY2hhbmdlcy4KICAgc2NvcGVkX3B0cjxsYXlvdXQ6OkxheW91dE1hbmFnZXI+IGxheW91dF9tYW5hZ2VyXzsKIAorICAvLyBUVFNFbmdpbmUgdGhhdCB0aGUgU2NyZWVuUmVhZGVyIHNwZWFrcyB0by4KKyAgc2NvcGVkX3B0cjxhY2Nlc3NpYmlsaXR5OjpUVFNFbmdpbmU+IHR0c19lbmdpbmVfOworCiAgIC8vIFV0dGVycyB0aGUgdGV4dCBjb250ZW50cyBvZiB0aGUgZm9jdXNlZCBlbGVtZW50LgotICBzY29wZWRfcHRyPGFjY2Vzc2liaWxpdHk6OkZvY3VzT2JzZXJ2ZXI+IGZvY3VzX29ic2VydmVyXzsKKyAgc2NvcGVkX3B0cjxhY2Nlc3NpYmlsaXR5OjpTY3JlZW5SZWFkZXI+IHNjcmVlbl9yZWFkZXJfOwogCiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKICAgLy8gQWxsb3dzIHRoZSBkZWJ1Z2dlciB0byBhZGQgcmVuZGVyIGNvbXBvbmVudHMgdG8gdGhlIHdlYiBtb2R1bGUuCkBAIC00MDcsNiArNDY0LDEyIEBACiAgIGphdmFzY3JpcHRfZW5naW5lXyA9IHNjcmlwdDo6SmF2YVNjcmlwdEVuZ2luZTo6Q3JlYXRlRW5naW5lKCk7CiAgIERDSEVDSyhqYXZhc2NyaXB0X2VuZ2luZV8pOwogCisjaWYgZGVmaW5lZChDT0JBTFRfRU5BQkxFX0pBVkFTQ1JJUFRfRVJST1JfTE9HR0lORykKKyAgc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lOjpFcnJvckhhbmRsZXIgZXJyb3JfaGFuZGxlciA9CisgICAgICBiYXNlOjpCaW5kKCZXZWJNb2R1bGU6OkltcGw6OlJlcG9ydFNjcmlwdEVycm9yLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKTsKKyAgamF2YXNjcmlwdF9lbmdpbmVfLT5SZWdpc3RlckVycm9ySGFuZGxlcihlcnJvcl9oYW5kbGVyKTsKKyNlbmRpZgorCiAgIGphdmFzY3JpcHRfZW5naW5lX3BvbGxlcl8ucmVzZXQobmV3IGJhc2U6OlBvbGxlcldpdGhUaHJlYWQoCiAgICAgICBiYXNlOjpCaW5kKCZXZWJNb2R1bGU6OkltcGw6OlVwZGF0ZUphdmFTY3JpcHRFbmdpbmVTdGF0cywKICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCkBAIC00NDEsOCArNTA0LDEwIEBACiAgICAgICBkYXRhLm5ldHdvcmtfbW9kdWxlLT5jb29raWVfamFyKCksIGRhdGEubmV0d29ya19tb2R1bGUtPkdldFBvc3RTZW5kZXIoKSwKICAgICAgIGRhdGEub3B0aW9ucy5sb2NhdGlvbl9wb2xpY3ksIGRhdGEub3B0aW9ucy5jc3BfZW5mb3JjZW1lbnRfbW9kZSwKICAgICAgIGJhc2U6OkJpbmQoJldlYk1vZHVsZTo6SW1wbDo6T25Dc3BQb2xpY3lDaGFuZ2VkLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKLSAgICAgIGRhdGEud2luZG93X2Nsb3NlX2NhbGxiYWNrLCBkYXRhLm9wdGlvbnMuY3NwX2luc2VjdXJlX2FsbG93ZWRfdG9rZW4sCi0gICAgICBkYXRhLmRvbV9tYXhfZWxlbWVudF9kZXB0aCk7CisgICAgICBiYXNlOjpCaW5kKCZXZWJNb2R1bGU6OkltcGw6Ok9uUmFuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MsCisgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAorICAgICAgZGF0YS53aW5kb3dfY2xvc2VfY2FsbGJhY2ssIGRhdGEuc3lzdGVtX3dpbmRvd18sCisgICAgICBkYXRhLm9wdGlvbnMuY3NwX2luc2VjdXJlX2FsbG93ZWRfdG9rZW4sIGRhdGEuZG9tX21heF9lbGVtZW50X2RlcHRoKTsKICAgRENIRUNLKHdpbmRvd18pOwogCiAgIHdpbmRvd193ZWFrXyA9IGJhc2U6OkFzV2Vha1B0cih3aW5kb3dfLmdldCgpKTsKQEAgLTQ1Miw3ICs1MTcsOCBAQAogICAgICAga0RPTU1heEVsZW1lbnREZXB0aCwgZmV0Y2hlcl9mYWN0b3J5Xy5nZXQoKSwgZGF0YS5uZXR3b3JrX21vZHVsZSwKICAgICAgIGRhdGEubWVkaWFfbW9kdWxlLCB3aW5kb3dfLCBtZWRpYV9zb3VyY2VfcmVnaXN0cnlfLmdldCgpLAogICAgICAgYmxvYl9yZWdpc3RyeV8uZ2V0KCksIGRhdGEubWVkaWFfbW9kdWxlLCBqYXZhc2NyaXB0X2VuZ2luZV8uZ2V0KCksCi0gICAgICBnbG9iYWxfZW52aXJvbm1lbnRfLmdldCgpLCBkYXRhLm9wdGlvbnMuZG9tX3NldHRpbmdzX29wdGlvbnMpKTsKKyAgICAgIGdsb2JhbF9lbnZpcm9ubWVudF8uZ2V0KCksICZtdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXJfLAorICAgICAgZGF0YS5vcHRpb25zLmRvbV9zZXR0aW5nc19vcHRpb25zKSk7CiAgIERDSEVDSyhlbnZpcm9ubWVudF9zZXR0aW5nc18pOwogCiAgIGdsb2JhbF9lbnZpcm9ubWVudF8tPkNyZWF0ZUdsb2JhbE9iamVjdCh3aW5kb3dfLCBlbnZpcm9ubWVudF9zZXR0aW5nc18uZ2V0KCkpOwpAQCAtNDk4LDIzICs1NjQsMjUgQEAKICAgICB3aW5kb3dfLT5kb2N1bWVudCgpLT5BZGRPYnNlcnZlcihkb2N1bWVudF9sb2FkX29ic2VydmVyXy5nZXQoKSk7CiAgIH0KIAotICBzY29wZWRfcHRyPGFjY2Vzc2liaWxpdHk6OlRUU0VuZ2luZT4gdHRzX2VuZ2luZTsKKyAgLy8gSWYgYSBUVFNFbmdpbmUgd2FzIHByb3ZpZGVkIHRocm91Z2ggdGhlIG9wdGlvbnMsIHVzZSBpdC4KKyAgYWNjZXNzaWJpbGl0eTo6VFRTRW5naW5lKiB0dHNfZW5naW5lID0gZGF0YS5vcHRpb25zLnR0c19lbmdpbmU7CisgIGlmICghdHRzX2VuZ2luZSkgewogI2lmIFNCX0hBUyhTUEVFQ0hfU1lOVEhFU0lTKQotI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUykKLSAgQ29tbWFuZExpbmUqIGNvbW1hbmRfbGluZSA9IENvbW1hbmRMaW5lOjpGb3JDdXJyZW50UHJvY2VzcygpOwotICBpZiAoY29tbWFuZF9saW5lLT5IYXNTd2l0Y2goYnJvd3Nlcjo6c3dpdGNoZXM6OmtVc2VUVFMpKSB7Ci0gICAgdHRzX2VuZ2luZS5yZXNldChuZXcgYWNjZXNzaWJpbGl0eTo6U3RhcmJvYXJkVFRTRW5naW5lKCkpOwotICB9Ci0jZW5kaWYgIC8vIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUykKKyAgICBpZiAoSXNUZXh0VG9TcGVlY2hFbmFibGVkKCkpIHsKKyAgICAgIC8vIENyZWF0ZSBhIFN0YXJib2FyZFRUU0VuZ2luZSBpZiBUVFMgaXMgZW5hYmxlZC4KKyAgICAgIHR0c19lbmdpbmVfLnJlc2V0KG5ldyBhY2Nlc3NpYmlsaXR5OjpTdGFyYm9hcmRUVFNFbmdpbmUoKSk7CisgICAgfQogI2VuZGlmICAvLyBTQl9IQVMoU1BFRUNIX1NZTlRIRVNJUykKICNpZiAhZGVmaW5lZChDT0JBTFRfQlVJTERfVFlQRV9HT0xEKQotICBpZiAoIXR0c19lbmdpbmUpIHsKLSAgICB0dHNfZW5naW5lLnJlc2V0KG5ldyBhY2Nlc3NpYmlsaXR5OjpUVFNMb2dnZXIoKSk7Ci0gIH0KKyAgICBpZiAoIXR0c19lbmdpbmVfKSB7CisgICAgICB0dHNfZW5naW5lXy5yZXNldChuZXcgYWNjZXNzaWJpbGl0eTo6VFRTTG9nZ2VyKCkpOworICAgIH0KICNlbmRpZiAgLy8gIWRlZmluZWQoQ09CQUxUX0JVSUxEX1RZUEVfR09MRCkKKyAgICB0dHNfZW5naW5lID0gdHRzX2VuZ2luZV8uZ2V0KCk7CisgIH0KICAgaWYgKHR0c19lbmdpbmUpIHsKLSAgICBmb2N1c19vYnNlcnZlcl8ucmVzZXQobmV3IGFjY2Vzc2liaWxpdHk6OkZvY3VzT2JzZXJ2ZXIod2luZG93Xy0+ZG9jdW1lbnQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHRzX2VuZ2luZS5QYXNzKCkpKTsKKyAgICBzY3JlZW5fcmVhZGVyXy5yZXNldChuZXcgYWNjZXNzaWJpbGl0eTo6U2NyZWVuUmVhZGVyKAorICAgICAgICB3aW5kb3dfLT5kb2N1bWVudCgpLCB0dHNfZW5naW5lLCAmbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyXykpOwogICB9CiAgIGlzX3J1bm5pbmdfID0gdHJ1ZTsKIH0KQEAgLTUzOSw3ICs2MDcsNyBAQAogICByZW1vdGVfdHlwZWZhY2VfY2FjaGVfLT5EaXNhYmxlQ2FsbGJhY2tzKCk7CiAgIGltYWdlX2NhY2hlXy0+RGlzYWJsZUNhbGxiYWNrcygpOwogCi0gIGZvY3VzX29ic2VydmVyXy5yZXNldCgpOworICBzY3JlZW5fcmVhZGVyXy5yZXNldCgpOwogICBsYXlvdXRfbWFuYWdlcl8ucmVzZXQoKTsKICAgZW52aXJvbm1lbnRfc2V0dGluZ3NfLnJlc2V0KCk7CiAgIHdpbmRvd193ZWFrXy5yZXNldCgpOwpAQCAtNTgyLDYgKzY1MCw3IEBACiAgIH0KIAogICB3ZWJfbW9kdWxlX3N0YXRfdHJhY2tlcl8tPk9uRW5kSW5qZWN0RXZlbnQoCisgICAgICB3aW5kb3dfLT5IYXNQZW5kaW5nQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoKSwKICAgICAgIGxheW91dF9tYW5hZ2VyXy0+SXNOZXdSZW5kZXJUcmVlUGVuZGluZygpKTsKIH0KIApAQCAtNjAxLDEzICs2NzAsMjAgQEAKICAgd2luZG93Xy0+RGVzdHJveVRpbWVycygpOwogfQogCit2b2lkIFdlYk1vZHVsZTo6SW1wbDo6T25SYW5BbmltYXRpb25GcmFtZUNhbGxiYWNrcygpIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBEQ0hFQ0soaXNfcnVubmluZ18pOworICAvLyBOb3RpZnkgdGhlIHN0YXQgdHJhY2tlciB0aGF0IHRoZSBhbmltYXRpb24gZnJhbWUgY2FsbGJhY2tzIGhhdmUgZmluaXNoZWQuCisgIC8vIFRoaXMgbWF5IGVuZCB0aGUgY3VycmVudCBldmVudCBiZWluZyB0cmFja2VkLgorICB3ZWJfbW9kdWxlX3N0YXRfdHJhY2tlcl8tPk9uUmFuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoCisgICAgICBsYXlvdXRfbWFuYWdlcl8tPklzTmV3UmVuZGVyVHJlZVBlbmRpbmcoKSk7Cit9CisKIHZvaWQgV2ViTW9kdWxlOjpJbXBsOjpPblJlbmRlclRyZWVQcm9kdWNlZCgKICAgICBjb25zdCBMYXlvdXRSZXN1bHRzJiBsYXlvdXRfcmVzdWx0cykgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIERDSEVDSyhpc19ydW5uaW5nXyk7Ci0gIC8vIE5vdGlmeSB0aGUgc3RhdCB0cmFja2VyIHRoYXQgYSByZW5kZXIgdHJlZSBoYXMgYmVlbiBwcm9kdWNlZC4gVGhpcyBzaWduYWxzCi0gIC8vIHRoZSBlbmQgb2YgcHJldmlvdXMgZXZlbnQgdHJhY2tpbmcsIGFuZCB0cmlnZ2VycyBmbHVzaGluZyBvZiBwZXJpb2RpYwotICAvLyBjb3VudHMuCisgIC8vIE5vdGlmeSB0aGUgc3RhdCB0cmFja2VyIHRoYXQgYSByZW5kZXIgdHJlZSBoYXMgYmVlbiBwcm9kdWNlZC4KICAgd2ViX21vZHVsZV9zdGF0X3RyYWNrZXJfLT5PblJlbmRlclRyZWVQcm9kdWNlZCgpOwogCiAjaWYgZGVmaW5lZChFTkFCTEVfREVCVUdfQ09OU09MRSkKQEAgLTc0NCw2ICs4MjAsMjUgQEAKICAgbGF5b3V0X21hbmFnZXJfLT5SZXN1bWUoKTsKIH0KIAordm9pZCBXZWJNb2R1bGU6OkltcGw6OlJlcG9ydFNjcmlwdEVycm9yKAorICAgIGNvbnN0IGJhc2U6OlNvdXJjZUxvY2F0aW9uJiBzb3VyY2VfbG9jYXRpb24sCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKKyAgc3RkOjpzdHJpbmcgZmlsZV9uYW1lID0KKyAgICAgIEZpbGVQYXRoKHNvdXJjZV9sb2NhdGlvbi5maWxlX3BhdGgpLkJhc2VOYW1lKCkudmFsdWUoKTsKKworICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKyAgYmFzZTo6VGltZURlbHRhIGR0ID0gU3RhcnR1cFRpbWVyOjpJbnN0YW5jZSgpLT5UaW1lU2luY2VTdGFydHVwKCk7CisKKyAgLy8gQ3JlYXRlIHRoZSBlcnJvciBvdXRwdXQuCisgIC8vIEV4YW1wbGU6CisgIC8vICAgSlM6NTAyNTA6ZmlsZS5qcygyOSw4MCk6IGthKC4uLikgaXMgbm90IGl0ZXJhYmxlCisgIC8vICAgSlM6PHRpbWUgbWlsbGlzPjxqcy1maWxlLW5hbWU+KDxsaW5lPiw8Y29sdW1uPik6PG1lc3NhZ2U+CisgIHNzIDw8ICJKUzoiIDw8IGR0LkluTWlsbGlzZWNvbmRzKCkgPDwgIjoiIDw8IGZpbGVfbmFtZSA8PCAiKCIKKyAgICAgPDwgc291cmNlX2xvY2F0aW9uLmxpbmVfbnVtYmVyIDw8ICIsIgorICAgICA8PCBzb3VyY2VfbG9jYXRpb24uY29sdW1uX251bWJlciA8PCAiKTogIiA8PCBlcnJvcl9tZXNzYWdlIDw8ICJcbiI7CisgIFNiTG9nUmF3KHNzLnN0cigpLmNfc3RyKCkpOworfQorCiBXZWJNb2R1bGU6OkRlc3RydWN0aW9uT2JzZXJ2ZXI6OkRlc3RydWN0aW9uT2JzZXJ2ZXIoV2ViTW9kdWxlKiB3ZWJfbW9kdWxlKQogICAgIDogd2ViX21vZHVsZV8od2ViX21vZHVsZSkge30KIApAQCAtNzY1LDcgKzg2MCw4IEBACiAgICAgICB0aHJlYWRfcHJpb3JpdHkoYmFzZTo6a1RocmVhZFByaW9yaXR5X05vcm1hbCksCiAgICAgICBzb2Z0d2FyZV9kZWNvZGVyX3RocmVhZF9wcmlvcml0eShiYXNlOjprVGhyZWFkUHJpb3JpdHlfTG93KSwKICAgICAgIGhhcmR3YXJlX2RlY29kZXJfdGhyZWFkX3ByaW9yaXR5KGJhc2U6OmtUaHJlYWRQcmlvcml0eV9IaWdoKSwKLSAgICAgIGZldGNoZXJfbGlmZXRpbWVfdGhyZWFkX3ByaW9yaXR5KGJhc2U6OmtUaHJlYWRQcmlvcml0eV9IaWdoKSB7fQorICAgICAgZmV0Y2hlcl9saWZldGltZV90aHJlYWRfcHJpb3JpdHkoYmFzZTo6a1RocmVhZFByaW9yaXR5X0hpZ2gpLAorICAgICAgdHRzX2VuZ2luZShOVUxMKSB7fQogCiBXZWJNb2R1bGU6OldlYk1vZHVsZSgKICAgICBjb25zdCBHVVJMJiBpbml0aWFsX3VybCwKQEAgLTc3NCwxMyArODcwLDE1IEBACiAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgd2luZG93X2Nsb3NlX2NhbGxiYWNrLAogICAgIG1lZGlhOjpNZWRpYU1vZHVsZSogbWVkaWFfbW9kdWxlLCBuZXR3b3JrOjpOZXR3b3JrTW9kdWxlKiBuZXR3b3JrX21vZHVsZSwKICAgICBjb25zdCBtYXRoOjpTaXplJiB3aW5kb3dfZGltZW5zaW9ucywKLSAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsIGZsb2F0IGxheW91dF9yZWZyZXNoX3JhdGUsCisgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyLAorICAgIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvdywgZmxvYXQgbGF5b3V0X3JlZnJlc2hfcmF0ZSwKICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQogICAgIDogdGhyZWFkXyhvcHRpb25zLm5hbWUuY19zdHIoKSkgewogICBDb25zdHJ1Y3Rpb25EYXRhIGNvbnN0cnVjdGlvbl9kYXRhKAogICAgICAgaW5pdGlhbF91cmwsIHJlbmRlcl90cmVlX3Byb2R1Y2VkX2NhbGxiYWNrLCBlcnJvcl9jYWxsYmFjaywKICAgICAgIHdpbmRvd19jbG9zZV9jYWxsYmFjaywgbWVkaWFfbW9kdWxlLCBuZXR3b3JrX21vZHVsZSwgd2luZG93X2RpbWVuc2lvbnMsCi0gICAgICByZXNvdXJjZV9wcm92aWRlciwga0RPTU1heEVsZW1lbnREZXB0aCwgbGF5b3V0X3JlZnJlc2hfcmF0ZSwgb3B0aW9ucyk7CisgICAgICByZXNvdXJjZV9wcm92aWRlciwga0RPTU1heEVsZW1lbnREZXB0aCwgc3lzdGVtX3dpbmRvdywKKyAgICAgIGxheW91dF9yZWZyZXNoX3JhdGUsIG9wdGlvbnMpOwogCiAgIC8vIFN0YXJ0IHRoZSBkZWRpY2F0ZWQgdGhyZWFkIGFuZCBjcmVhdGUgdGhlIGludGVybmFsIGltcGxlbWVudGF0aW9uCiAgIC8vIG9iamVjdCBvbiB0aGF0IHRocmVhZC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmggYi9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZS5oCmluZGV4IGRmZWI5ZGMuLjNlMDgwZjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0JST1dTRVJfV0VCX01PRFVMRV9IXwogI2RlZmluZSBDT0JBTFRfQlJPV1NFUl9XRUJfTU9EVUxFX0hfCkBAIC0yNyw2ICsyNSw3IEBACiAjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWQuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy90aHJlYWRfY2hlY2tlci5oIgorI2luY2x1ZGUgImNvYmFsdC9hY2Nlc3NpYmlsaXR5L3R0c19lbmdpbmUuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9hZGRyZXNzX3Nhbml0aXplci5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL2NvbnNvbGVfY29tbWFuZHMuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9zb3VyY2VfbG9jYXRpb24uaCIKQEAgLTUyLDYgKzUxLDcgQEAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvamF2YXNjcmlwdF9lbmdpbmUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93LmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9zZXNzaW9uX2RyaXZlci5oIgogI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgogCkBAIC0xNjYsNiArMTY2LDkgQEAKICAgICAvLyBmZXRjaGVyIGNyZWF0aW9uIGFuZCBoYW5kbGluZyBjYWxsYmFja3MgZnJvbSBOZXRGZXRjaGVyLgogICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIGJhc2U6OmtUaHJlYWRQcmlvcml0eV9IaWdoLgogICAgIGJhc2U6OlRocmVhZFByaW9yaXR5IGZldGNoZXJfbGlmZXRpbWVfdGhyZWFkX3ByaW9yaXR5OworCisgICAgLy8gVFRTRW5naW5lIGluc3RhbmNlIHRvIHVzZSBmb3IgdGV4dC10by1zcGVlY2guCisgICAgYWNjZXNzaWJpbGl0eTo6VFRTRW5naW5lKiB0dHNfZW5naW5lOwogICB9OwogCiAgIHR5cGVkZWYgbGF5b3V0OjpMYXlvdXRNYW5hZ2VyOjpMYXlvdXRSZXN1bHRzIExheW91dFJlc3VsdHM7CkBAIC0xODEsNiArMTg0LDcgQEAKICAgICAgICAgICAgIG5ldHdvcms6Ok5ldHdvcmtNb2R1bGUqIG5ldHdvcmtfbW9kdWxlLAogICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgd2luZG93X2RpbWVuc2lvbnMsCiAgICAgICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCisgICAgICAgICAgICBzeXN0ZW1fd2luZG93OjpTeXN0ZW1XaW5kb3cqIHN5c3RlbV93aW5kb3csCiAgICAgICAgICAgICBmbG9hdCBsYXlvdXRfcmVmcmVzaF9yYXRlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zID0gT3B0aW9ucygpKTsKICAgfldlYk1vZHVsZSgpOwogCkBAIC0yMjgsOCArMjMyLDggQEAKICAgICAgICAgbmV0d29yazo6TmV0d29ya01vZHVsZSogbmV0d29ya19tb2R1bGUsCiAgICAgICAgIGNvbnN0IG1hdGg6OlNpemUmIHdpbmRvd19kaW1lbnNpb25zLAogICAgICAgICByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogcmVzb3VyY2VfcHJvdmlkZXIsCi0gICAgICAgIGludCBkb21fbWF4X2VsZW1lbnRfZGVwdGgsIGZsb2F0IGxheW91dF9yZWZyZXNoX3JhdGUsCi0gICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgICAgIGludCBkb21fbWF4X2VsZW1lbnRfZGVwdGgsIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvdywKKyAgICAgICAgZmxvYXQgbGF5b3V0X3JlZnJlc2hfcmF0ZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKICAgICAgICAgOiBpbml0aWFsX3VybChpbml0aWFsX3VybCksCiAgICAgICAgICAgcmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2socmVuZGVyX3RyZWVfcHJvZHVjZWRfY2FsbGJhY2spLAogICAgICAgICAgIGVycm9yX2NhbGxiYWNrKGVycm9yX2NhbGxiYWNrKSwKQEAgLTIzOSw2ICsyNDMsNyBAQAogICAgICAgICAgIHdpbmRvd19kaW1lbnNpb25zKHdpbmRvd19kaW1lbnNpb25zKSwKICAgICAgICAgICByZXNvdXJjZV9wcm92aWRlcihyZXNvdXJjZV9wcm92aWRlciksCiAgICAgICAgICAgZG9tX21heF9lbGVtZW50X2RlcHRoKGRvbV9tYXhfZWxlbWVudF9kZXB0aCksCisgICAgICAgICAgc3lzdGVtX3dpbmRvd18oc3lzdGVtX3dpbmRvdyksCiAgICAgICAgICAgbGF5b3V0X3JlZnJlc2hfcmF0ZShsYXlvdXRfcmVmcmVzaF9yYXRlKSwKICAgICAgICAgICBvcHRpb25zKG9wdGlvbnMpIHt9CiAKQEAgLTI1MSw2ICsyNTYsNyBAQAogICAgIG1hdGg6OlNpemUgd2luZG93X2RpbWVuc2lvbnM7CiAgICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyOwogICAgIGludCBkb21fbWF4X2VsZW1lbnRfZGVwdGg7CisgICAgc3lzdGVtX3dpbmRvdzo6U3lzdGVtV2luZG93KiBzeXN0ZW1fd2luZG93XzsKICAgICBmbG9hdCBsYXlvdXRfcmVmcmVzaF9yYXRlOwogICAgIE9wdGlvbnMgb3B0aW9uczsKICAgfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlX3N0YXRfdHJhY2tlci5jYyBiL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlX3N0YXRfdHJhY2tlci5jYwppbmRleCA2NGI5OTlmLi4yOGQ1ZTBiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvd2ViX21vZHVsZV9zdGF0X3RyYWNrZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGVfc3RhdF90cmFja2VyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9icm93c2VyL3dlYl9tb2R1bGVfc3RhdF90cmFja2VyLmgiCiAKQEAgLTk0LDcgKzkyLDkgQEAKICAgfQogfQogCi12b2lkIFdlYk1vZHVsZVN0YXRUcmFja2VyOjpPbkVuZEluamVjdEV2ZW50KGJvb2wgaXNfbmV3X3JlbmRlcl90cmVlX3BlbmRpbmcpIHsKK3ZvaWQgV2ViTW9kdWxlU3RhdFRyYWNrZXI6Ok9uRW5kSW5qZWN0RXZlbnQoCisgICAgYm9vbCBhcmVfYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrc19wZW5kaW5nLAorICAgIGJvb2wgaXNfbmV3X3JlbmRlcl90cmVlX3BlbmRpbmcpIHsKICAgLy8gSWYgdGhlIGluamVjdGlvbiBpc24ndCBjdXJyZW50bHkgYmVpbmcgdGltZWQsIHRoZW4gdGhpcyBldmVudCBpbmplY3Rpb24KICAgLy8gaXNuJ3QgYmVpbmcgdHJhY2tlZC4gU2ltcGx5IHJldHVybi4KICAgaWYgKCFzdG9wX3dhdGNoZXNfW2tTdG9wV2F0Y2hUeXBlSW5qZWN0RXZlbnRdLklzQ291bnRpbmcoKSkgewpAQCAtMTAzLDYgKzEwMywxMyBAQAogCiAgIHN0b3Bfd2F0Y2hlc19ba1N0b3BXYXRjaFR5cGVJbmplY3RFdmVudF0uU3RvcCgpOwogCisgIGlmICghYXJlX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3NfcGVuZGluZyAmJiAhaXNfbmV3X3JlbmRlcl90cmVlX3BlbmRpbmcpIHsKKyAgICBFbmRDdXJyZW50RXZlbnQoZmFsc2UpOworICB9Cit9CisKK3ZvaWQgV2ViTW9kdWxlU3RhdFRyYWNrZXI6Ok9uUmFuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoCisgICAgYm9vbCBpc19uZXdfcmVuZGVyX3RyZWVfcGVuZGluZykgewogICBpZiAoIWlzX25ld19yZW5kZXJfdHJlZV9wZW5kaW5nKSB7CiAgICAgRW5kQ3VycmVudEV2ZW50KGZhbHNlKTsKICAgfQpAQCAtMTI0LDI3ICsxMzEsNDAgQEAKICAgICAgIGNvdW50X2RvbV91cGRhdGVfbWF0Y2hpbmdfcnVsZXMoCiAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJFdmVudC5Db3VudC4lcy5ET00uSHRtbEVsZW1lbnQuVXBkYXRlTWF0Y2hpbmdSdWxlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSksCi0gICAgICAgICAgMCwgIk51bWJlciBvZiB1cGRhdGUgbWF0Y2hpbmcgcnVsZXMgZm9yIEhUTUwgZWxlbWVudHMuIiksCisgICAgICAgICAgMCwgIk51bWJlciBvZiBIVE1MIGVsZW1lbnRzIHRoYXQgaGFkIHRoZWlyIG1hdGNoaW5nIHJ1bGVzIHVwZGF0ZWQuIiksCiAgICAgICBjb3VudF9kb21fdXBkYXRlX2NvbXB1dGVkX3N0eWxlKAogICAgICAgICAgIFN0cmluZ1ByaW50ZigiRXZlbnQuQ291bnQuJXMuRE9NLkh0bWxFbGVtZW50LlVwZGF0ZUNvbXB1dGVkU3R5bGUiLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpLAotICAgICAgICAgIDAsICJOdW1iZXIgb2YgdXBkYXRlIGNvbXB1dGVkIHN0eWxlcyBmb3IgSFRNTCBlbGVtZW50cy4iKSwKKyAgICAgICAgICAwLCAiTnVtYmVyIG9mIEhUTUwgZWxlbWVudHMgdGhhdCBoYWQgdGhlaXIgY29tcHV0ZWQgc3R5bGUgdXBkYXRlZC4iKSwKICAgICAgIGNvdW50X2RvbV9nZW5lcmF0ZV9odG1sX2VsZW1lbnRfY29tcHV0ZWRfc3R5bGUoCiAgICAgICAgICAgU3RyaW5nUHJpbnRmKAogICAgICAgICAgICAgICAiRXZlbnQuQ291bnQuJXMuRE9NLkh0bWxFbGVtZW50LkdlbmVyYXRlSHRtbEVsZW1lbnRDb21wdXRlZFN0eWxlIiwKICAgICAgICAgICAgICAgbmFtZS5jX3N0cigpKSwKLSAgICAgICAgICAwLCAiTnVtYmVyIG9mIGdlbmVyYXRlZCBjb21wdXRlZCBzdHlsZXMgZm9yIEhUTUwgZWxlbWVudHMuIiksCisgICAgICAgICAgMCwKKyAgICAgICAgICAiTnVtYmVyIG9mIEhUTUwgZWxlbWVudHMgdGhhdCBoYWQgdGhlaXIgY29tcHV0ZWQgc3R5bGUgZ2VuZXJhdGVkLiIpLAogICAgICAgY291bnRfZG9tX2dlbmVyYXRlX3BzZXVkb19lbGVtZW50X2NvbXB1dGVkX3N0eWxlKAogICAgICAgICAgIFN0cmluZ1ByaW50ZigiRXZlbnQuQ291bnQuJXMuRE9NLkh0bWxFbGVtZW50LiIKICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlUHNldWRvRWxlbWVudENvbXB1dGVkU3R5bGUiLAogICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpLAotICAgICAgICAgIDAsICJOdW1iZXIgb2YgZ2VuZXJhdGVkIGNvbXB1dGVkIHN0eWxlcyBmb3IgUHNldWRvIGVsZW1lbnRzLiIpLAorICAgICAgICAgIDAsCisgICAgICAgICAgIk51bWJlciBvZiBwc2V1ZG8gZWxlbWVudHMgdGhhdCBoYWQgdGhlaXIgY29tcHV0ZWQgc3R5bGUgZ2VuZXJhdGVkLiIpLAogICAgICAgY291bnRfbGF5b3V0X2JveGVzX2NyZWF0ZWQoCiAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJFdmVudC5Db3VudC4lcy5MYXlvdXQuQm94LkNyZWF0ZWQiLCBuYW1lLmNfc3RyKCkpLCAwLAogICAgICAgICAgICJOdW1iZXIgb2YgYm94ZXMgY3JlYXRlZC4iKSwKICAgICAgIGNvdW50X2xheW91dF9ib3hlc19kZXN0cm95ZWQoCiAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJFdmVudC5Db3VudC4lcy5MYXlvdXQuQm94LkRlc3Ryb3llZCIsIG5hbWUuY19zdHIoKSksIDAsCiAgICAgICAgICAgIk51bWJlciBvZiBib3hlcyBkZXN0cm95ZWQuIiksCisgICAgICBjb3VudF9sYXlvdXRfdXBkYXRlX3NpemUoCisgICAgICAgICAgU3RyaW5nUHJpbnRmKCJFdmVudC5Db3VudC4lcy5MYXlvdXQuQm94LlVwZGF0ZVNpemUiLCBuYW1lLmNfc3RyKCkpLCAwLAorICAgICAgICAgICJOdW1iZXIgb2YgYm94ZXMgdGhhdCBoYWQgdGhlaXIgc2l6ZSB1cGRhdGVkLiIpLAorICAgICAgY291bnRfbGF5b3V0X3JlbmRlcl9hbmRfYW5pbWF0ZSgKKyAgICAgICAgICBTdHJpbmdQcmludGYoIkV2ZW50LkNvdW50LiVzLkxheW91dC5Cb3guUmVuZGVyQW5kQW5pbWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSksCisgICAgICAgICAgMCwgIk51bWJlciBvZiBib3hlcyB0aGF0IGhhZCB0aGVpciByZW5kZXIgdHJlZSBub2RlIHVwZGF0ZWQuIiksCisgICAgICBjb3VudF9sYXlvdXRfdXBkYXRlX2Nyb3NzX3JlZmVyZW5jZXMoCisgICAgICAgICAgU3RyaW5nUHJpbnRmKCJFdmVudC5Db3VudC4lcy5MYXlvdXQuQm94LlVwZGF0ZUNyb3NzUmVmZXJlbmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSksCisgICAgICAgICAgMCwgIk51bWJlciBvZiBib3hlcyB0aGF0IGhhZCB0aGVpciBjcm9zcyByZWZlcmVuY2VzIHVwZGF0ZWQuIiksCiAgICAgICBkdXJhdGlvbl90b3RhbChTdHJpbmdQcmludGYoIkV2ZW50LkR1cmF0aW9uLiVzIiwgbmFtZS5jX3N0cigpKSwKICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSgpLAogICAgICAgICAgICAgICAgICAgICAgIlRvdGFsIGR1cmF0aW9uIG9mIHRoZSBldmVudCAoaW4gbWljcm9zZWNvbmRzKS4gVGhpcyBpcyAiCkBAIC0xNTYsNiArMTc2LDEyIEBACiAgICAgICAgICAgIkluamVjdGlvbiBkdXJhdGlvbiwgd2hpY2ggaW5jbHVkZXMgSlMsIGZvciBldmVudCAoaW4gIgogICAgICAgICAgICJtaWNyb3NlY29uZHMpLiBUaGlzIGRvZXMgbm90IGluY2x1ZGUgc3Vic2VxdWVudCBET00gYW5kIExheW91dCAiCiAgICAgICAgICAgInByb2Nlc3NpbmcuIiksCisgICAgICBkdXJhdGlvbl9kb21fcnVuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3MoCisgICAgICAgICAgU3RyaW5nUHJpbnRmKCJFdmVudC5EdXJhdGlvbi4lcy5ET00uUnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MiLAorICAgICAgICAgICAgICAgICAgICAgICBuYW1lLmNfc3RyKCkpLAorICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSgpLAorICAgICAgICAgICJSdW4gYW5pbWF0aW9uIGZyYW1lIGNhbGxiYWNrcyBkdXJhdGlvbiBmb3IgZXZlbnQgKGluICIKKyAgICAgICAgICAibWljcm9zZWNvbmRzKS4iKSwKICAgICAgIGR1cmF0aW9uX2RvbV91cGRhdGVfY29tcHV0ZWRfc3R5bGUoCiAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJFdmVudC5EdXJhdGlvbi4lcy5ET00uVXBkYXRlQ29tcHV0ZWRTdHlsZSIsCiAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUuY19zdHIoKSksCkBAIC0yMjYsMTEgKzI1MiwyMCBAQAogICAgICAgbGF5b3V0X3N0YXRfdHJhY2tlcl8tPmJveGVzX2NyZWF0ZWRfY291bnQoKTsKICAgZXZlbnRfc3RhdHMtPmNvdW50X2xheW91dF9ib3hlc19kZXN0cm95ZWQgPQogICAgICAgbGF5b3V0X3N0YXRfdHJhY2tlcl8tPmJveGVzX2Rlc3Ryb3llZF9jb3VudCgpOworICBldmVudF9zdGF0cy0+Y291bnRfbGF5b3V0X3VwZGF0ZV9zaXplID0KKyAgICAgIGxheW91dF9zdGF0X3RyYWNrZXJfLT51cGRhdGVfc2l6ZV9jb3VudCgpOworICBldmVudF9zdGF0cy0+Y291bnRfbGF5b3V0X3JlbmRlcl9hbmRfYW5pbWF0ZSA9CisgICAgICBsYXlvdXRfc3RhdF90cmFja2VyXy0+cmVuZGVyX2FuZF9hbmltYXRlX2NvdW50KCk7CisgIGV2ZW50X3N0YXRzLT5jb3VudF9sYXlvdXRfdXBkYXRlX2Nyb3NzX3JlZmVyZW5jZXMgPQorICAgICAgbGF5b3V0X3N0YXRfdHJhY2tlcl8tPnVwZGF0ZV9jcm9zc19yZWZlcmVuY2VzX2NvdW50KCk7CiAKICAgLy8gVXBkYXRlIGV2ZW50IGR1cmF0aW9ucwogICBldmVudF9zdGF0cy0+ZHVyYXRpb25fdG90YWwgPSBzdG9wX3dhdGNoX2R1cmF0aW9uc19ba1N0b3BXYXRjaFR5cGVFdmVudF07CiAgIGV2ZW50X3N0YXRzLT5kdXJhdGlvbl9kb21faW5qZWN0X2V2ZW50ID0KICAgICAgIHN0b3Bfd2F0Y2hfZHVyYXRpb25zX1trU3RvcFdhdGNoVHlwZUluamVjdEV2ZW50XTsKKyAgZXZlbnRfc3RhdHMtPmR1cmF0aW9uX2RvbV9ydW5fYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrcyA9CisgICAgICBkb21fc3RhdF90cmFja2VyXy0+R2V0U3RvcFdhdGNoVHlwZUR1cmF0aW9uKAorICAgICAgICAgIGRvbTo6RG9tU3RhdFRyYWNrZXI6OmtTdG9wV2F0Y2hUeXBlUnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MpOwogICBldmVudF9zdGF0cy0+ZHVyYXRpb25fZG9tX3VwZGF0ZV9jb21wdXRlZF9zdHlsZSA9CiAgICAgICBkb21fc3RhdF90cmFja2VyXy0+R2V0U3RvcFdhdGNoVHlwZUR1cmF0aW9uKAogICAgICAgICAgIGRvbTo6RG9tU3RhdFRyYWNrZXI6OmtTdG9wV2F0Y2hUeXBlVXBkYXRlQ29tcHV0ZWRTdHlsZSk7CkBAIC0yNzgsMTEgKzMxMywyMyBAQAogICAgICAgPDwgbGF5b3V0X3N0YXRfdHJhY2tlcl8tPmJveGVzX2NyZWF0ZWRfY291bnQoKSA8PCAiLCAiCiAgICAgICA8PCAiXCJDbnRMYXlvdXRCb3hlc0Rlc3Ryb3llZFwiOiIKICAgICAgIDw8IGxheW91dF9zdGF0X3RyYWNrZXJfLT5ib3hlc19kZXN0cm95ZWRfY291bnQoKSA8PCAiLCAiCisgICAgICA8PCAiXCJDbnRMYXlvdXRVcGRhdGVTaXplXCI6IiA8PCBsYXlvdXRfc3RhdF90cmFja2VyXy0+dXBkYXRlX3NpemVfY291bnQoKQorICAgICAgPDwgIiwgIgorICAgICAgPDwgIlwiQ250TGF5b3V0UmVuZGVyQW5kQW5pbWF0ZVwiOiIKKyAgICAgIDw8IGxheW91dF9zdGF0X3RyYWNrZXJfLT5yZW5kZXJfYW5kX2FuaW1hdGVfY291bnQoKSA8PCAiLCAiCisgICAgICA8PCAiXCJDbnRMYXlvdXRVcGRhdGVDcm9zc1JlZmVyZW5jZXNcIjoiCisgICAgICA8PCBsYXlvdXRfc3RhdF90cmFja2VyXy0+dXBkYXRlX2Nyb3NzX3JlZmVyZW5jZXNfY291bnQoKSA8PCAiLCAiCiAgICAgICA8PCAiXCJEdXJUb3RhbFVzXCI6IgogICAgICAgPDwgc3RvcF93YXRjaF9kdXJhdGlvbnNfW2tTdG9wV2F0Y2hUeXBlRXZlbnRdLkluTWljcm9zZWNvbmRzKCkgPDwgIiwgIgogICAgICAgPDwgIlwiRHVyRG9tSW5qZWN0RXZlbnRVc1wiOiIKICAgICAgIDw8IHN0b3Bfd2F0Y2hfZHVyYXRpb25zX1trU3RvcFdhdGNoVHlwZUluamVjdEV2ZW50XS5Jbk1pY3Jvc2Vjb25kcygpCiAgICAgICA8PCAiLCAiCisgICAgICA8PCAiXCJEdXJEb21SdW5BbmltYXRpb25GcmFtZUNhbGxiYWNrc1VzXCI6IgorICAgICAgPDwgZG9tX3N0YXRfdHJhY2tlcl8KKyAgICAgICAgICAgICAtPkdldFN0b3BXYXRjaFR5cGVEdXJhdGlvbigKKyAgICAgICAgICAgICAgICAgZG9tOjpEb21TdGF0VHJhY2tlcjo6a1N0b3BXYXRjaFR5cGVSdW5BbmltYXRpb25GcmFtZUNhbGxiYWNrcykKKyAgICAgICAgICAgICAuSW5NaWNyb3NlY29uZHMoKQorICAgICAgPDwgIiwgIgogICAgICAgPDwgIlwiRHVyRG9tVXBkYXRlQ29tcHV0ZWRTdHlsZVVzXCI6IgogICAgICAgPDwgZG9tX3N0YXRfdHJhY2tlcl8KICAgICAgICAgICAgICAtPkdldFN0b3BXYXRjaFR5cGVEdXJhdGlvbigKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnJvd3Nlci93ZWJfbW9kdWxlX3N0YXRfdHJhY2tlci5oIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGVfc3RhdF90cmFja2VyLmgKaW5kZXggYjRmMjRlNy4uMzk1NmE1MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGVfc3RhdF90cmFja2VyLmgKKysrIGIvc3JjL2NvYmFsdC9icm93c2VyL3dlYl9tb2R1bGVfc3RhdF90cmFja2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9CUk9XU0VSX1dFQl9NT0RVTEVfU1RBVF9UUkFDS0VSX0hfCiAjZGVmaW5lIENPQkFMVF9CUk9XU0VSX1dFQl9NT0RVTEVfU1RBVF9UUkFDS0VSX0hfCkBAIC01MSw5ICs0OSwxNCBAQAogICB2b2lkIE9uU3RhcnRJbmplY3RFdmVudChjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6RXZlbnQ+JiBldmVudCk7CiAKICAgLy8gfE9uRW5kSW5qZWN0RXZlbnR8IG5vdGlmaWVzIHRoZSBldmVudCBzdGF0IHRyYWNraW5nIHRoYXQgdGhlIGV2ZW50IGhhcwotICAvLyBmaW5pc2hlZCBiZWluZyBpbmplY3RlZC4gSWYgbm8gcmVuZGVyIHRyZWUgaXMgcGVuZGluZywgaXQgYWxzbyBlbmRzCi0gIC8vIHRyYWNraW5nIG9mIHRoZSBldmVudC4KLSAgdm9pZCBPbkVuZEluamVjdEV2ZW50KGJvb2wgaXNfbmV3X3JlbmRlcl90cmVlX3BlbmRpbmcpOworICAvLyBmaW5pc2hlZCBiZWluZyBpbmplY3RlZC4gSWYgbm8gYW5pbWF0aW9uIGZyYW1lIGNhbGxiYWNrcyBhbmQgYWxzbyBubyByZW5kZXIKKyAgLy8gdHJlZSBpcyBwZW5kaW5nLCBpdCBhbHNvIGVuZHMgdHJhY2tpbmcgb2YgdGhlIGV2ZW50LgorICB2b2lkIE9uRW5kSW5qZWN0RXZlbnQoYm9vbCBhcmVfYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrc19wZW5kaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19uZXdfcmVuZGVyX3RyZWVfcGVuZGluZyk7CisKKyAgLy8gfE9uUmFuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3N8IGVuZHMgc3RhdCB0cmFja2luZyBmb3IgdGhlIGN1cnJlbnQgZXZlbnQKKyAgLy8gaWYgbm8gcmVuZGVyIHRyZWUgaXMgcGVuZGluZy4KKyAgdm9pZCBPblJhbkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2tzKGJvb2wgaXNfbmV3X3JlbmRlcl90cmVlX3BlbmRpbmcpOwogCiAgIC8vIHxPblJlbmRlclRyZWVQcm9kdWNlZHwgZW5kcyBzdGF0IHRyYWNraW5nIGZvciB0aGUgY3VycmVudCBldmVudC4KICAgdm9pZCBPblJlbmRlclRyZWVQcm9kdWNlZCgpOwpAQCAtODgsMTEgKzkxLDE2IEBACiAgICAgICAgIGNvdW50X2RvbV9nZW5lcmF0ZV9wc2V1ZG9fZWxlbWVudF9jb21wdXRlZF9zdHlsZTsKICAgICBiYXNlOjpDVmFsPGludCwgYmFzZTo6Q1ZhbFB1YmxpYz4gY291bnRfbGF5b3V0X2JveGVzX2NyZWF0ZWQ7CiAgICAgYmFzZTo6Q1ZhbDxpbnQsIGJhc2U6OkNWYWxQdWJsaWM+IGNvdW50X2xheW91dF9ib3hlc19kZXN0cm95ZWQ7CisgICAgYmFzZTo6Q1ZhbDxpbnQsIGJhc2U6OkNWYWxQdWJsaWM+IGNvdW50X2xheW91dF91cGRhdGVfc2l6ZTsKKyAgICBiYXNlOjpDVmFsPGludCwgYmFzZTo6Q1ZhbFB1YmxpYz4gY291bnRfbGF5b3V0X3JlbmRlcl9hbmRfYW5pbWF0ZTsKKyAgICBiYXNlOjpDVmFsPGludCwgYmFzZTo6Q1ZhbFB1YmxpYz4gY291bnRfbGF5b3V0X3VwZGF0ZV9jcm9zc19yZWZlcmVuY2VzOwogCiAgICAgLy8gRHVyYXRpb24tcmVsYXRlZAogICAgIGJhc2U6OkNWYWw8YmFzZTo6VGltZURlbHRhLCBiYXNlOjpDVmFsUHVibGljPiBkdXJhdGlvbl90b3RhbDsKICAgICBiYXNlOjpDVmFsPGJhc2U6OlRpbWVEZWx0YSwgYmFzZTo6Q1ZhbFB1YmxpYz4gZHVyYXRpb25fZG9tX2luamVjdF9ldmVudDsKICAgICBiYXNlOjpDVmFsPGJhc2U6OlRpbWVEZWx0YSwgYmFzZTo6Q1ZhbFB1YmxpYz4KKyAgICAgICAgZHVyYXRpb25fZG9tX3J1bl9hbmltYXRpb25fZnJhbWVfY2FsbGJhY2tzOworICAgIGJhc2U6OkNWYWw8YmFzZTo6VGltZURlbHRhLCBiYXNlOjpDVmFsUHVibGljPgogICAgICAgICBkdXJhdGlvbl9kb21fdXBkYXRlX2NvbXB1dGVkX3N0eWxlOwogICAgIGJhc2U6OkNWYWw8YmFzZTo6VGltZURlbHRhLCBiYXNlOjpDVmFsUHVibGljPiBkdXJhdGlvbl9sYXlvdXRfYm94X3RyZWU7CiAgICAgYmFzZTo6Q1ZhbDxiYXNlOjpUaW1lRGVsdGEsIGJhc2U6OkNWYWxQdWJsaWM+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Jyb3dzZXIvd2luL2FwcGxpY2F0aW9uLmNjIGIvc3JjL2NvYmFsdC9icm93c2VyL3dpbi9hcHBsaWNhdGlvbi5jYwppbmRleCBiMTBmYzRhLi5mYjg4MjU2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Jyb3dzZXIvd2luL2FwcGxpY2F0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvYnJvd3Nlci93aW4vYXBwbGljYXRpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Jyb3dzZXIvYXBwbGljYXRpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9idWlsZC9hbGwuZ3lwIGIvc3JjL2NvYmFsdC9idWlsZC9hbGwuZ3lwCmluZGV4IDFkODVhYzkuLjRkZmIyMmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnVpbGQvYWxsLmd5cAorKysgYi9zcmMvY29iYWx0L2J1aWxkL2FsbC5neXAKQEAgLTUzLDYgKzUzLDcgQEAKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tYXRoL21hdGguZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhL3NhbmRib3gvc2FuZGJveC5neXA6KicsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9uZXR3b3JrL25ldHdvcmsuZ3lwOionLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcl90cmVlL3JlbmRlcl90cmVlLmd5cDoqJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXA6KicsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkIGIvc3JjL2NvYmFsdC9idWlsZC9idWlsZC5pZAppbmRleCAyNTVmMTJlLi5hZjdkYWQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2J1aWxkL2J1aWxkLmlkCisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvYnVpbGQuaWQKQEAgLTEgKzEgQEAKLTIyODkxClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorMjgxNTIKXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmd5cGkgYi9zcmMvY29iYWx0L2J1aWxkL2NvbmZpZy9iYXNlLmd5cGkKaW5kZXggODE3NGNiZC4uNDBhODlmMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9idWlsZC9jb25maWcvYmFzZS5neXBpCisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvY29uZmlnL2Jhc2UuZ3lwaQpAQCAtODcsNiArODcsOSBAQAogICAgICMgU2V0IHRvIDEgdG8gZW5hYmxlIEg1dmNjQWNjb3VudE1hbmFnZXIuCiAgICAgJ2VuYWJsZV9hY2NvdW50X21hbmFnZXIlJzogMCwKIAorICAgICMgU2V0IHRvIDEgdG8gZW5hYmxlIEg1dmNjQ3Jhc2hMb2cuCisgICAgJ2VuYWJsZV9jcmFzaF9sb2clJzogMCwKKwogICAgICMgU2V0IHRvIDEgdG8gY29tcGlsZSB3aXRoIFNQRFkgc3VwcG9ydC4KICAgICAnZW5hYmxlX3NwZHklJzogMCwKIApAQCAtMjY4LDYgKzI3MSw3IEBACiAgICAgIyBQbGF0Zm9ybXMgbWF5IHJlZGVmaW5lIHRvICdwb2xsJyBpZiBuZWNlc3NhcnkuCiAgICAgIyBPdGhlciBtZWNoYW5pc21zLCBlLmcuIGRldnBvbGwsIGtxdWV1ZSwgc2VsZWN0LCBhcmUgbm90IHlldCBzdXBwb3J0ZWQuCiAgICAgJ3NiX2xpYmV2ZW50X21ldGhvZCUnOiAnZXBvbGwnLAorICAgICdjb2JhbHRfbWVkaWFfc291cmNlXzIwMTYlJzogMCwKICAgfSwKIAogICAndGFyZ2V0X2RlZmF1bHRzJzogewpAQCAtMzM3LDYgKzM0MSwxNSBAQAogICAgICAgICAgICdDT0JBTFRfV0VCS0lUX1NIQVJFRD0xJywKICAgICAgICAgXSwKICAgICAgIH1dLAorICAgICAgWydjb2JhbHRfbWVkaWFfc291cmNlXzIwMTYgPT0gMScsIHsKKyAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgJ0NPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNj0xJywKKyAgICAgICAgXSwKKyAgICAgIH0sIHsKKyAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgJ0NPQkFMVF9NRURJQV9TT1VSQ0VfMjAxMj0xJywKKyAgICAgICAgXSwKKyAgICAgIH1dLAogICAgICAgWydPUyA9PSAibGJfc2hlbGwiJywgewogICAgICAgICAnZGVmaW5lcyc6IFsKICAgICAgICAgICAnX19MQl9TSEVMTF9fJywKQEAgLTM5NSw2ICs0MDgsNyBAQAogICAgICAgICAgICdBTExPQ0FUT1JfU1RBVFNfVFJBQ0tJTkcnLAogICAgICAgICAgICdDT0JBTFRfQk9YX0RVTVBfRU5BQkxFRCcsCiAgICAgICAgICAgJ0NPQkFMVF9CVUlMRF9UWVBFX0RFQlVHJywKKyAgICAgICAgICAnQ09CQUxUX0VOQUJMRV9KQVZBU0NSSVBUX0VSUk9SX0xPR0dJTkcnLAogICAgICAgICAgICdfREVCVUcnLAogICAgICAgICAgICdFTkFCTEVfREVCVUdfQ09NTUFORF9MSU5FX1NXSVRDSEVTJywKICAgICAgICAgICAnRU5BQkxFX0RFQlVHX0NfVkFMJywKQEAgLTQxOSw2ICs0MzMsNyBAQAogICAgICAgICAgICdfREVCVUcnLAogICAgICAgICAgICdBTExPQ0FUT1JfU1RBVFNfVFJBQ0tJTkcnLAogICAgICAgICAgICdDT0JBTFRfQlVJTERfVFlQRV9ERVZFTCcsCisgICAgICAgICAgJ0NPQkFMVF9FTkFCTEVfSkFWQVNDUklQVF9FUlJPUl9MT0dHSU5HJywKICAgICAgICAgICAnRU5BQkxFX0RFQlVHX0NPTU1BTkRfTElORV9TV0lUQ0hFUycsCiAgICAgICAgICAgJ0VOQUJMRV9ERUJVR19DX1ZBTCcsCiAgICAgICAgICAgJ0VOQUJMRV9ERUJVR19DT05TT0xFJywKQEAgLTQ0MSw2ICs0NTYsNyBAQAogICAgICAgICAnZGVmaW5lcyc6IFsKICAgICAgICAgICAnQUxMT0NBVE9SX1NUQVRTX1RSQUNLSU5HJywKICAgICAgICAgICAnQ09CQUxUX0JVSUxEX1RZUEVfUUEnLAorICAgICAgICAgICdDT0JBTFRfRU5BQkxFX0pBVkFTQ1JJUFRfRVJST1JfTE9HR0lORycsCiAgICAgICAgICAgJ0VOQUJMRV9ERUJVR19DT01NQU5EX0xJTkVfU1dJVENIRVMnLAogICAgICAgICAgICdFTkFCTEVfREVCVUdfQ19WQUwnLAogICAgICAgICAgICdFTkFCTEVfREVCVUdfQ09OU09MRScsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2J1aWxkL3BhdGhfY29udmVyc2lvbi5weSBiL3NyYy9jb2JhbHQvYnVpbGQvcGF0aF9jb252ZXJzaW9uLnB5CmluZGV4IDZhNDlmYzYuLjdjYWFkMjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvYnVpbGQvcGF0aF9jb252ZXJzaW9uLnB5CisrKyBiL3NyYy9jb2JhbHQvYnVpbGQvcGF0aF9jb252ZXJzaW9uLnB5CkBAIC0yLDcgKzIsNiBAQAogIyBDb3B5cmlnaHQgKGMpIDIwMTQgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCiAjIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKICMgZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KLQogIiIiTW9kaWZpZXMgYSBsaXN0IG9mIGlucHV0IHBhdGhzIHRvIHByb2R1Y2UgYSBsaXN0IG9mIG91dHB1dCBwYXRocy4KIAogVGhlIHVzZXIgY2FuIHNwZWNpZnkgYSBsaXN0IG9mIHBhdGhzIGFzIHdlbGwgYXMgc3BlY2lmaWMgcGF0aCB0cmFuc2Zvcm1hdGlvbnMKQEAgLTE1LDYzICsxNCw5NCBAQAogaW1wb3J0IHN5cwogaW1wb3J0IHRleHR3cmFwCiAKLWRlZiBDb252ZXJ0UGF0aHMoaW5wdXRfcGF0aHMsIG91dHB1dF9kaXJlY3RvcnksIG91dHB1dF9wcmVmaXgsCi0gICAgICAgICAgICAgICAgIG91dHB1dF9leHRlbnNpb24sIGZvcndhcmRfc2xhc2hlcyk6CisKK2RlZiBDb252ZXJ0UGF0aChwYXRoLAorICAgICAgICAgICAgICAgIG91dHB1dF9kaXJlY3Rvcnk9Tm9uZSwKKyAgICAgICAgICAgICAgICBvdXRwdXRfcHJlZml4PU5vbmUsCisgICAgICAgICAgICAgICAgb3V0cHV0X2V4dGVuc2lvbj1Ob25lLAorICAgICAgICAgICAgICAgIGZvcndhcmRfc2xhc2hlcz1Ob25lLAorICAgICAgICAgICAgICAgIGJhc2VfZGlyZWN0b3J5PU5vbmUpOgogICAiIiJUaGUgc2NyaXB0J3MgY29yZSBmdW5jdGlvbi4iIiIKLSAgZGVmIENvbnZlcnRQYXRoKHBhdGgpOgotICAgIG91dHB1dF9wYXRoID0gcGF0aAorICBvdXRwdXRfcGF0aCA9IHBhdGgKIAotICAgIGlmIG91dHB1dF9kaXJlY3Rvcnk6Ci0gICAgICBvdXRwdXRfcGF0aCA9IG9zLnBhdGguam9pbihvdXRwdXRfZGlyZWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfcGF0aCkpCi0gICAgaWYgb3V0cHV0X3ByZWZpeDoKLSAgICAgIG91dHB1dF9wYXRoID0gb3MucGF0aC5qb2luKG9zLnBhdGguZGlybmFtZShvdXRwdXRfcGF0aCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfcHJlZml4ICsgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfcGF0aCkpCi0gICAgaWYgb3V0cHV0X2V4dGVuc2lvbjoKLSAgICAgIG91dHB1dF9wYXRoID0gKG9zLnBhdGguc3BsaXRleHQob3V0cHV0X3BhdGgpWzBdICsKLSAgICAgICAgICAgICAgICAgICAgIG9zLmV4dHNlcCArIG91dHB1dF9leHRlbnNpb24pCi0gICAgaWYgZm9yd2FyZF9zbGFzaGVzOgotICAgICAgb3V0cHV0X3BhdGggPSBvdXRwdXRfcGF0aC5yZXBsYWNlKCdcXCcsICcvJykKKyAgaWYgb3V0cHV0X2RpcmVjdG9yeToKKyAgICByZWxwYXRoX3N0YXJ0ID0gYmFzZV9kaXJlY3RvcnkKKyAgICBpZiBub3QgcmVscGF0aF9zdGFydDoKKyAgICAgIHJlbHBhdGhfc3RhcnQgPSBvcy5wYXRoLmRpcm5hbWUob3V0cHV0X3BhdGgpCisgICAgcmVscGF0aCA9IG9zLnBhdGgucmVscGF0aChvdXRwdXRfcGF0aCwgcmVscGF0aF9zdGFydCkKKyAgICBhc3NlcnQgb3MucGFyZGlyIG5vdCBpbiByZWxwYXRoCisgICAgb3V0cHV0X3BhdGggPSBvcy5wYXRoLmpvaW4ob3V0cHV0X2RpcmVjdG9yeSwgcmVscGF0aCkKIAotICAgIHJldHVybiBvdXRwdXRfcGF0aAorICBpZiBvdXRwdXRfcHJlZml4OgorICAgIG91dHB1dF9wYXRoID0gb3MucGF0aC5qb2luKAorICAgICAgICBvcy5wYXRoLmRpcm5hbWUob3V0cHV0X3BhdGgpLAorICAgICAgICBvdXRwdXRfcHJlZml4ICsgb3MucGF0aC5iYXNlbmFtZShvdXRwdXRfcGF0aCkpCisgIGlmIG91dHB1dF9leHRlbnNpb246CisgICAgb3V0cHV0X3BhdGggPSAoCisgICAgICAgIG9zLnBhdGguc3BsaXRleHQob3V0cHV0X3BhdGgpWzBdICsgb3MuZXh0c2VwICsgb3V0cHV0X2V4dGVuc2lvbikKKyAgaWYgZm9yd2FyZF9zbGFzaGVzOgorICAgIG91dHB1dF9wYXRoID0gb3V0cHV0X3BhdGgucmVwbGFjZSgnXFwnLCAnLycpCiAKLSAgcmV0dXJuIFtDb252ZXJ0UGF0aCh4KSBmb3IgeCBpbiBpbnB1dF9wYXRoc10KKyAgcmV0dXJuIG91dHB1dF9wYXRoCisKIAogZGVmIERvTWFpbihhcmd2KToKKyAgIiIiU2NyaXB0IG1haW4gZnVuY3Rpb24uIiIiCiAgIHBhcnNlciA9IGFyZ3BhcnNlLkFyZ3VtZW50UGFyc2VyKAogICAgICAgZm9ybWF0dGVyX2NsYXNzPWFyZ3BhcnNlLlJhd0Rlc2NyaXB0aW9uSGVscEZvcm1hdHRlciwKICAgICAgIGRlc2NyaXB0aW9uPXRleHR3cmFwLmRlZGVudChfX2RvY19fKSkKLSAgcGFyc2VyLmFkZF9hcmd1bWVudCgnLWQnLCAnLS1vdXRwdXRfZGlyZWN0b3J5JywKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlPXN0ciwKLSAgICAgICAgICAgICAgICAgICAgICBoZWxwPSgnSWYgc3BlY2lmaWVkLCB3aWxsIHJlcGxhY2UgYWxsIGlucHV0IHBhdGggJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdkaXJlY3RvcmllcyB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoaXMgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXIuJykpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoJy1lJywgJy0tb3V0cHV0X2V4dGVuc2lvbicsCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZT1zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0oJ0lmIHNwZWNpZmllZCwgd2lsbCByZXBsYWNlIGFsbCBpbnB1dCBwYXRoICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnZXh0ZW5zaW9ucyB3aXRoIHRoZSBvbmUgc3BlY2lmaWVkIGJ5IHRoaXMgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXJhbWV0ZXIuJykpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoJy1wJywgJy0tb3V0cHV0X3ByZWZpeCcsCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZT1zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0oJ0lmIHNwZWNpZmllZCwgd2lsbCBwcmVwZW5kIHRoZSBzdHJpbmcgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgaW4gdGhlIHBhcmFtZXRlciB0byB0aGUgZmlsZW5hbWUuJykpCi0gIHBhcnNlci5hZGRfYXJndW1lbnQoJy1zJywgJy0tZm9yd2FyZF9zbGFzaGVzJywKLSAgICAgICAgICAgICAgICAgICAgICBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICAgIGhlbHA9KCdTZXQgdGhpcyBmbGFnIGlmIHlvdSB3b3VsZCBsaWtlIGFsbCBvdXRwdXQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdwYXRocyB0byBjb250YWluIGZvcndhcmQgc2xhc2hlcywgZXZlbiBvbiAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ1dpbmRvd3MuICBUaGlzIGlzIHVzZWZ1bCBpZiB5b3UgYXJlIGNhbGxpbmcgdGhpcyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgJ2Zyb20gR3lwIHdoaWNoIGV4cGVjdHMgZm9yd2FyZCBzbGFzaGVzLicpKQotICBwYXJzZXIuYWRkX2FyZ3VtZW50KCdpbnB1dF9wYXRocycsCi0gICAgICAgICAgICAgICAgICAgICAgaGVscD0oJ0EgbGlzdCBvZiBwYXRocyB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgYXMgJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICdzcGVjaWZpZWQgYnkgdGhlIG90aGVyIG9wdGlvbnMuJyksCi0gICAgICAgICAgICAgICAgICAgICAgbmFyZ3M9JyonKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy1kJywKKyAgICAgICctLW91dHB1dF9kaXJlY3RvcnknLAorICAgICAgdHlwZT1zdHIsCisgICAgICBoZWxwPSgnSWYgc3BlY2lmaWVkLCB3aWxsIHJlcGxhY2UgYWxsIGlucHV0IHBhdGggJworICAgICAgICAgICAgJ2RpcmVjdG9yaWVzIHdpdGggdGhlIG9uZSBzcGVjaWZpZWQgYnkgdGhpcyAnCisgICAgICAgICAgICAncGFyYW1ldGVyLicpKQorICBwYXJzZXIuYWRkX2FyZ3VtZW50KAorICAgICAgJy1lJywKKyAgICAgICctLW91dHB1dF9leHRlbnNpb24nLAorICAgICAgdHlwZT1zdHIsCisgICAgICBoZWxwPSgnSWYgc3BlY2lmaWVkLCB3aWxsIHJlcGxhY2UgYWxsIGlucHV0IHBhdGggJworICAgICAgICAgICAgJ2V4dGVuc2lvbnMgd2l0aCB0aGUgb25lIHNwZWNpZmllZCBieSB0aGlzICcKKyAgICAgICAgICAgICdwYXJhbWV0ZXIuJykpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLXAnLAorICAgICAgJy0tb3V0cHV0X3ByZWZpeCcsCisgICAgICB0eXBlPXN0ciwKKyAgICAgIGhlbHA9KCdJZiBzcGVjaWZpZWQsIHdpbGwgcHJlcGVuZCB0aGUgc3RyaW5nICcKKyAgICAgICAgICAgICdzcGVjaWZpZWQgaW4gdGhlIHBhcmFtZXRlciB0byB0aGUgZmlsZW5hbWUuJykpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLXMnLAorICAgICAgJy0tZm9yd2FyZF9zbGFzaGVzJywKKyAgICAgIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCisgICAgICBoZWxwPSgnU2V0IHRoaXMgZmxhZyBpZiB5b3Ugd291bGQgbGlrZSBhbGwgb3V0cHV0ICcKKyAgICAgICAgICAgICdwYXRocyB0byBjb250YWluIGZvcndhcmQgc2xhc2hlcywgZXZlbiBvbiAnCisgICAgICAgICAgICAnV2luZG93cy4gIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBhcmUgY2FsbGluZyB0aGlzICcKKyAgICAgICAgICAgICdmcm9tIEd5cCB3aGljaCBleHBlY3RzIGZvcndhcmQgc2xhc2hlcy4gVXNlZCB3aXRoICcKKyAgICAgICAgICAgICd0aGUgLWQgYXJndW1lbnQuJykpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnLWInLAorICAgICAgJy0tYmFzZV9kaXJlY3RvcnknLAorICAgICAgdHlwZT1zdHIsCisgICAgICBoZWxwPSgnSWYgc3BlY2lmaWVkLCByZW1vdmUgdXAgdG8gYW5kIGluY2x1ZGluZyB0aGUgJworICAgICAgICAgICAgJ3NwZWNpZmllZCBkaXJlY3RvcnkgZnJvbSB0aGUgaW5wdXQgcGF0aCB3aGVuICcKKyAgICAgICAgICAgICdjb25zdHJ1Y3RpbmcgdGhlIG91dHB1dCBwYXRoLiBUaGUgaW5wdXQgcGF0aHMgJworICAgICAgICAgICAgJ211c3QgYmUgdW5kZXIgdGhlIGJhc2UgZGlyZWN0b3J5LiBUaGUgLWQgYXJndW1lbnQgJworICAgICAgICAgICAgJ211c3QgYWxzbyBiZSBzcGVjaWZpZWQuJykpCisgIHBhcnNlci5hZGRfYXJndW1lbnQoCisgICAgICAnaW5wdXRfcGF0aHMnLAorICAgICAgaGVscD0oJ0EgbGlzdCBvZiBwYXRocyB0aGF0IHdpbGwgYmUgbW9kaWZpZWQgYXMgJworICAgICAgICAgICAgJ3NwZWNpZmllZCBieSB0aGUgb3RoZXIgb3B0aW9ucy4nKSwKKyAgICAgIG5hcmdzPScqJykKICAgYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3YpCiAKLSAgcmV0dXJuICcgJy5qb2luKENvbnZlcnRQYXRocyhhcmdzLmlucHV0X3BhdGhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3Mub3V0cHV0X2RpcmVjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmdzLm91dHB1dF9wcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJncy5vdXRwdXRfZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MuZm9yd2FyZF9zbGFzaGVzKSkKKyAgY29udmVydGVkX3BhdGhzID0gWworICAgICAgQ29udmVydFBhdGgocGF0aCwgYXJncy5vdXRwdXRfZGlyZWN0b3J5LCBhcmdzLm91dHB1dF9wcmVmaXgsCisgICAgICAgICAgICAgICAgICBhcmdzLm91dHB1dF9leHRlbnNpb24sIGFyZ3MuZm9yd2FyZF9zbGFzaGVzLAorICAgICAgICAgICAgICAgICAgYXJncy5iYXNlX2RpcmVjdG9yeSkgZm9yIHBhdGggaW4gYXJncy5pbnB1dF9wYXRocworICBdCisgIHJldHVybiAnICcuam9pbihjb252ZXJ0ZWRfcGF0aHMpCisKIAogaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKICAgcHJpbnQgRG9NYWluKHN5cy5hcmd2WzE6XSkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvYnVpbGQvcGF0aF9jb252ZXJzaW9uX3Rlc3QucHkgYi9zcmMvY29iYWx0L2J1aWxkL3BhdGhfY29udmVyc2lvbl90ZXN0LnB5Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZTQ4YjkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2J1aWxkL3BhdGhfY29udmVyc2lvbl90ZXN0LnB5CkBAIC0wLDAgKzEsNjAgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbgorIyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbXBvcnQgdW5pdHRlc3QKKworaW1wb3J0IGJvb3RzdHJhcF9wYXRoICAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtaW1wb3J0Citmcm9tIGNvYmFsdC5idWlsZC5wYXRoX2NvbnZlcnNpb24gaW1wb3J0IENvbnZlcnRQYXRoCisKKworY2xhc3MgUGF0aENvbnZlcnNpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKKworICBkZWYgdGVzdE5vb3Aoc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbHMoQ29udmVydFBhdGgoJ3RoaXMvaXMvYS9wYXRoLnR4dCcpLCAndGhpcy9pcy9hL3BhdGgudHh0JykKKworICBkZWYgdGVzdE91dHB1dERpcmVjdG9yeShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgQ29udmVydFBhdGgoJ3RoaXMvaXMvYS9wYXRoLnR4dCcsIG91dHB1dF9kaXJlY3Rvcnk9J2Fub3RoZXIvbG9jYXRpb24nKSwKKyAgICAgICAgJ2Fub3RoZXIvbG9jYXRpb24vcGF0aC50eHQnKQorCisgIGRlZiB0ZXN0QWRkUHJlZml4KHNlbGYpOgorICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAorICAgICAgICBDb252ZXJ0UGF0aCgndGhpcy9pcy9hL3BhdGgudHh0Jywgb3V0cHV0X3ByZWZpeD0nYmFuYW5hXycpLAorICAgICAgICAndGhpcy9pcy9hL2JhbmFuYV9wYXRoLnR4dCcpCisKKyAgZGVmIHRlc3RDaGFuZ2VFeHRlbnNpb24oc2VsZik6CisgICAgc2VsZi5hc3NlcnRFcXVhbHMoCisgICAgICAgIENvbnZlcnRQYXRoKCd0aGlzL2lzL2EvcGF0aC50eHQnLCBvdXRwdXRfZXh0ZW5zaW9uPSdjbG93bicpLAorICAgICAgICAndGhpcy9pcy9hL3BhdGguY2xvd24nKQorCisgIGRlZiB0ZXN0U2xhc2hlcyhzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgQ29udmVydFBhdGgoJ3RoaXNcXGlzXFxhXFxwYXRoLnR4dCcsIGZvcndhcmRfc2xhc2hlcz1UcnVlKSwKKyAgICAgICAgJ3RoaXMvaXMvYS9wYXRoLnR4dCcpCisKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgQ29udmVydFBhdGgoJ3RoaXNcXGlzXFxhXFxwYXRoLnR4dCcsIGZvcndhcmRfc2xhc2hlcz1GYWxzZSksCisgICAgICAgICd0aGlzXFxpc1xcYVxccGF0aC50eHQnKQorCisgIGRlZiB0ZXN0QmFzZURpcmVjdG9yeShzZWxmKToKKyAgICBzZWxmLmFzc2VydEVxdWFscygKKyAgICAgICAgQ29udmVydFBhdGgoCisgICAgICAgICAgICAnaWYvdGhpcy9pcy9hL3BhdGgudHh0JywKKyAgICAgICAgICAgIG91dHB1dF9kaXJlY3Rvcnk9J3RoZW4vdGhhdCcsCisgICAgICAgICAgICBiYXNlX2RpcmVjdG9yeT0naWYvdGhpcycpLCAndGhlbi90aGF0L2lzL2EvcGF0aC50eHQnKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3AvY29udGVudF9zZWN1cml0eV9wb2xpY3kuY2MgYi9zcmMvY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5jYwppbmRleCBmNDNhYTc4Li4zMDJhZjE3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5jYworKysgYi9zcmMvY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3NwL2NvbnRlbnRfc2VjdXJpdHlfcG9saWN5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL2NvbnRlbnRfc2VjdXJpdHlfcG9saWN5LmggYi9zcmMvY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5oCmluZGV4IGI2MDE1NTguLjU3MjVmZmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NwL2NvbnRlbnRfc2VjdXJpdHlfcG9saWN5LmgKKysrIGIvc3JjL2NvYmFsdC9jc3AvY29udGVudF9zZWN1cml0eV9wb2xpY3kuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTUF9DT05URU5UX1NFQ1VSSVRZX1BPTElDWV9IXwogI2RlZmluZSBDT0JBTFRfQ1NQX0NPTlRFTlRfU0VDVVJJVFlfUE9MSUNZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3AvY29udGVudF9zZWN1cml0eV9wb2xpY3lfdGVzdC5jYwppbmRleCBmMjFlNGEzLi5hZTIxZGQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NwL2NvbnRlbnRfc2VjdXJpdHlfcG9saWN5X3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5oIgogI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3AvY3J5cHRvLmNjIGIvc3JjL2NvYmFsdC9jc3AvY3J5cHRvLmNjCmluZGV4IGY1YTYxNDUuLmE0MzdmMmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NwL2NyeXB0by5jYworKysgYi9zcmMvY29iYWx0L2NzcC9jcnlwdG8uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2NzcC9jcnlwdG8uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3AvY3J5cHRvLmggYi9zcmMvY29iYWx0L2NzcC9jcnlwdG8uaAppbmRleCA3OTg0ZmY2Li4zNjM3NzYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9jcnlwdG8uaAorKysgYi9zcmMvY29iYWx0L2NzcC9jcnlwdG8uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTUF9DUllQVE9fSF8KICNkZWZpbmUgQ09CQUxUX0NTUF9DUllQVE9fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL2NzcC5neXAgYi9zcmMvY29iYWx0L2NzcC9jc3AuZ3lwCmluZGV4IGE0OTNjZDcuLjg3YWNlMWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NwL2NzcC5neXAKKysrIGIvc3JjL2NvYmFsdC9jc3AvY3NwLmd5cApAQCAtNTUsOCArNTUsOCBAQAogICAgICAgICAnc291cmNlX3Rlc3QuY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnY3NwJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL2RpcmVjdGl2ZS5jYyBiL3NyYy9jb2JhbHQvY3NwL2RpcmVjdGl2ZS5jYwppbmRleCAyZDQxNzhhLi4xMmNkOGY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9kaXJlY3RpdmUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3AvZGlyZWN0aXZlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3AvZGlyZWN0aXZlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL2RpcmVjdGl2ZS5oIGIvc3JjL2NvYmFsdC9jc3AvZGlyZWN0aXZlLmgKaW5kZXggYTc0ZTZkNy4uYTJjNzViOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3AvZGlyZWN0aXZlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3AvZGlyZWN0aXZlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1BfRElSRUNUSVZFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1BfRElSRUNUSVZFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NzcC9kaXJlY3RpdmVfbGlzdC5jYyBiL3NyYy9jb2JhbHQvY3NwL2RpcmVjdGl2ZV9saXN0LmNjCmluZGV4IDYxMmVhNDYuLmYwZmI1OTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NwL2RpcmVjdGl2ZV9saXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NwL2RpcmVjdGl2ZV9saXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3AvZGlyZWN0aXZlX2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3AvZGlyZWN0aXZlX2xpc3QuaCBiL3NyYy9jb2JhbHQvY3NwL2RpcmVjdGl2ZV9saXN0LmgKaW5kZXggODhlYmI0NS4uODIxYzI3YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3AvZGlyZWN0aXZlX2xpc3QuaAorKysgYi9zcmMvY29iYWx0L2NzcC9kaXJlY3RpdmVfbGlzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NQX0RJUkVDVElWRV9MSVNUX0hfCiAjZGVmaW5lIENPQkFMVF9DU1BfRElSRUNUSVZFX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL21lZGlhX2xpc3RfZGlyZWN0aXZlLmNjIGIvc3JjL2NvYmFsdC9jc3AvbWVkaWFfbGlzdF9kaXJlY3RpdmUuY2MKaW5kZXggMWJlOGZiNC4uYzRiOTRkNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3AvbWVkaWFfbGlzdF9kaXJlY3RpdmUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3AvbWVkaWFfbGlzdF9kaXJlY3RpdmUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImNvYmFsdC9jc3AvbWVkaWFfbGlzdF9kaXJlY3RpdmUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NzcC9tZWRpYV9saXN0X2RpcmVjdGl2ZS5oIGIvc3JjL2NvYmFsdC9jc3AvbWVkaWFfbGlzdF9kaXJlY3RpdmUuaAppbmRleCA0OGViYzMzLi5lN2MxMzI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9tZWRpYV9saXN0X2RpcmVjdGl2ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3NwL21lZGlhX2xpc3RfZGlyZWN0aXZlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1BfTUVESUFfTElTVF9ESVJFQ1RJVkVfSF8KICNkZWZpbmUgQ09CQUxUX0NTUF9NRURJQV9MSVNUX0RJUkVDVElWRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3AvcGFyc2Vycy5oIGIvc3JjL2NvYmFsdC9jc3AvcGFyc2Vycy5oCmluZGV4IDYxM2RhZWIuLmIzMzg3NzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NwL3BhcnNlcnMuaAorKysgYi9zcmMvY29iYWx0L2NzcC9wYXJzZXJzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1BfUEFSU0VSU19IXwogI2RlZmluZSBDT0JBTFRfQ1NQX1BBUlNFUlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL3NvdXJjZS5jYyBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZS5jYwppbmRleCBmNmMxNDJmLi5mYjhjMGIxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9zb3VyY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3Avc291cmNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3Avc291cmNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL3NvdXJjZS5oIGIvc3JjL2NvYmFsdC9jc3Avc291cmNlLmgKaW5kZXggZThlNzRhYy4uMjhjYTYzMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3Avc291cmNlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3Avc291cmNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1BfU09VUkNFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1BfU09VUkNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NzcC9zb3VyY2VfbGlzdC5jYyBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0LmNjCmluZGV4IDg4MjVlMjcuLjMzZjNmZTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3Avc291cmNlX2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3Avc291cmNlX2xpc3QuaCBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0LmgKaW5kZXggZTA0M2I1MC4uYzFlOTA2ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3Avc291cmNlX2xpc3QuaAorKysgYi9zcmMvY29iYWx0L2NzcC9zb3VyY2VfbGlzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NQX1NPVVJDRV9MSVNUX0hfCiAjZGVmaW5lIENPQkFMVF9DU1BfU09VUkNFX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0X2RpcmVjdGl2ZS5jYyBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0X2RpcmVjdGl2ZS5jYwppbmRleCA0ZjQ3MTI2Li5iYzY3ZTJhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9zb3VyY2VfbGlzdF9kaXJlY3RpdmUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3Avc291cmNlX2xpc3RfZGlyZWN0aXZlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3Avc291cmNlX2xpc3RfZGlyZWN0aXZlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0X2RpcmVjdGl2ZS5oIGIvc3JjL2NvYmFsdC9jc3Avc291cmNlX2xpc3RfZGlyZWN0aXZlLmgKaW5kZXggNTRmMTI1MS4uYWU0NjM2MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3Avc291cmNlX2xpc3RfZGlyZWN0aXZlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3Avc291cmNlX2xpc3RfZGlyZWN0aXZlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1BfU09VUkNFX0xJU1RfRElSRUNUSVZFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1BfU09VUkNFX0xJU1RfRElSRUNUSVZFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NzcC9zb3VyY2VfbGlzdF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3Avc291cmNlX2xpc3RfdGVzdC5jYwppbmRleCA3N2E4YThjLi5kNGRkZjFmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2NzcC9zb3VyY2VfbGlzdF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV9saXN0X3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2NzcC9zb3VyY2VfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2NzcC9zb3VyY2VfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV90ZXN0LmNjCmluZGV4IDIwYzQzNjcuLmIxYjg2ZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NwL3NvdXJjZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3Avc291cmNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9hbmltYXRpb25fc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvYW5pbWF0aW9uX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmNjCmluZGV4IGE2ODVjZDguLmVkZTY0YWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9hbmltYXRpb25fc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2FuaW1hdGlvbl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci9hbmltYXRpb25fc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2FuaW1hdGlvbl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2FuaW1hdGlvbl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oCmluZGV4IDI1NDc0ZGQuLjk2ZTA2MTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9hbmltYXRpb25fc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaAorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvYW5pbWF0aW9uX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NfUEFSU0VSX0FOSU1BVElPTl9TSE9SVEhBTkRfUFJPUEVSVFlfUEFSU0VfU1RSVUNUVVJFU19IXwogI2RlZmluZSBDT0JBTFRfQ1NTX1BBUlNFUl9BTklNQVRJT05fU0hPUlRIQU5EX1BST1BFUlRZX1BBUlNFX1NUUlVDVFVSRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9iYWNrZ3JvdW5kX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2JhY2tncm91bmRfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MKaW5kZXggMzY4NDVjOS4uYWEyYjY3ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2JhY2tncm91bmRfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2JhY2tncm91bmRfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc19wYXJzZXIvYmFja2dyb3VuZF9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvYmFja2dyb3VuZF9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2JhY2tncm91bmRfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaAppbmRleCA1YzY2MjcyLi42M2ZkZmYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvYmFja2dyb3VuZF9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9iYWNrZ3JvdW5kX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NfUEFSU0VSX0JBQ0tHUk9VTkRfU0hPUlRIQU5EX1BST1BFUlRZX1BBUlNFX1NUUlVDVFVSRVNfSF8KICNkZWZpbmUgQ09CQUxUX0NTU19QQVJTRVJfQkFDS0dST1VORF9TSE9SVEhBTkRfUFJPUEVSVFlfUEFSU0VfU1RSVUNUVVJFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2JvcmRlcl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ib3JkZXJfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MKaW5kZXggZWJjNmZmNS4uODlhNzE5YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2JvcmRlcl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvYm9yZGVyX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL2JvcmRlcl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvYm9yZGVyX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmggYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvYm9yZGVyX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKaW5kZXggYzMwYjc1Yy4uMWIyMjBjOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2JvcmRlcl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ib3JkZXJfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU19QQVJTRVJfQk9SREVSX1NIT1JUSEFORF9QUk9QRVJUWV9QQVJTRV9TVFJVQ1RVUkVTX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NfUEFSU0VSX0JPUkRFUl9TSE9SVEhBTkRfUFJPUEVSVFlfUEFSU0VfU1RSVUNUVVJFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2Nzc19wYXJzZXIuZ3lwIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2Nzc19wYXJzZXIuZ3lwCmluZGV4IDc5MTgxOGQuLjM3ZWE3NTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9jc3NfcGFyc2VyLmd5cAorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvY3NzX3BhcnNlci5neXAKQEAgLTEyNyw4ICsxMjcsOCBAQAogICAgICAgICAndHJpdmlhbF9zdHJpbmdfcGllY2VfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdjc3NfZ3JhbW1hcicsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvZm9udF9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9mb250X3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmNjCmluZGV4IDc1Njg3NjAuLmI0NjM0MDkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9mb250X3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9mb250X3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL2ZvbnRfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2ZvbnRfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaCBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9mb250X3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKaW5kZXggZjRmM2MxMy4uZTkxNTdkNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2ZvbnRfc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaAorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvZm9udF9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTX1BBUlNFUl9GT05UX1NIT1JUSEFORF9QUk9QRVJUWV9QQVJTRV9TVFJVQ1RVUkVTX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NfUEFSU0VSX0ZPTlRfU0hPUlRIQU5EX1BST1BFUlRZX1BBUlNFX1NUUlVDVFVSRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLmggYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvZ3JhbW1hci5oCmluZGV4IGQxYTlmOWQuLmU2YzIyM2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2dyYW1tYXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU19QQVJTRVJfR1JBTU1BUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTX1BBUlNFUl9HUkFNTUFSX0hfCkBAIC02MywxMSArNjEsMTEgQEAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9sb2NhbF9zcmNfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWFwX3RvX21lc2hfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfbGlzdC5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9xdWVyeS5oIgotI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3BlcmNlbnRhZ2VfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcHJvcGVydHlfa2V5X2xpc3RfdmFsdWUuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLnkgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvZ3JhbW1hci55CmluZGV4IDMzNDJhOWUuLmJiMjVlZTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9ncmFtbWFyLnkKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL2dyYW1tYXIueQpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIC8vIFRoaXMgZmlsZSBjb250YWlucyBhIGRlZmluaXRpb24gb2YgQ1NTIGdyYW1tYXIuCiAKQEAgLTc5NCwxNiArNzkyLDE2IEBACiAlZGVzdHJ1Y3RvciB7IGRlbGV0ZSAkJDsgfSA8Y29iYWx0X210bV9maWx0ZXJfZnVuY3Rpb25zPgogCiAldW5pb24gewotICBjc3NvbTo6TVRNRnVuY3Rpb246Ok1lc2hTcGVjKiBjb2JhbHRfbWFwX3RvX21lc2hfc3BlYzsgfQorICBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb246Ok1lc2hTcGVjKiBjb2JhbHRfbWFwX3RvX21lc2hfc3BlYzsgfQogJXR5cGUgPGNvYmFsdF9tYXBfdG9fbWVzaF9zcGVjPiBjb2JhbHRfbWFwX3RvX21lc2hfc3BlYwogJWRlc3RydWN0b3IgeyBkZWxldGUgJCQ7IH0gPGNvYmFsdF9tYXBfdG9fbWVzaF9zcGVjPgogCiAldW5pb24gewotICBjc3NvbTo6TVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKiBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXM7IH0KKyAgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciogY29iYWx0X210bV9yZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzOyB9CiAldHlwZSA8Y29iYWx0X210bV9yZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzPiBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoX2xpc3QKICVkZXN0cnVjdG9yIHsgZGVsZXRlICQkOyB9IDxjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXM+CiAKLSV1bmlvbiB7IGNzc29tOjpNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoKiBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoOyB9CisldW5pb24geyBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaCogY29iYWx0X210bV9yZXNvbHV0aW9uX21hdGNoZWRfbWVzaDsgfQogJXR5cGUgPGNvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2g+IGNvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2gKICVkZXN0cnVjdG9yIHsgZGVsZXRlICQkOyB9IDxjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoPgogCkBAIC02NTUxLDcgKzY1NDksNyBAQAogICAgIGNvYmFsdF9tdG1fZnVuY3Rpb25fbmFtZSBtYXliZV93aGl0ZXNwYWNlIGNvYmFsdF9tYXBfdG9fbWVzaF9zcGVjIGNvbW1hIGFuZ2xlCiAgICAgICAgIGFuZ2xlIGNvbW1hIGNvYmFsdF9tdG1fdHJhbnNmb3JtX2Z1bmN0aW9uIG1heWJlX2NvYmFsdF9tdG1fc3RlcmVvX21vZGUKICAgICAgICAgJyknIG1heWJlX3doaXRlc3BhY2UgewotICAgIHNjb3BlZF9wdHI8Y3Nzb206Ok1UTUZ1bmN0aW9uOjpNZXNoU3BlYz4KKyAgICBzY29wZWRfcHRyPGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbjo6TWVzaFNwZWM+CiAgICAgICAgIG1lc2hfc3BlYygkMyk7CiAgICAgc2NvcGVkX3B0cjxnbG06Om1hdDQ+IHRyYW5zZm9ybSgkOCk7CiAgICAgc2NvcGVkX3JlZnB0cjxjc3NvbTo6S2V5d29yZFZhbHVlPiBzdGVyZW9fbW9kZSA9CkBAIC02NTYwLDcgKzY1NTgsNyBAQAogICAgIGlmICghcGFyc2VyX2ltcGwtPnN1cHBvcnRzX21hcF90b19tZXNoKCkpIHsKICAgICAgIFlZRVJST1I7CiAgICAgfSBlbHNlIHsKLSAgICAgICQkID0gbmV3IGNzc29tOjpNVE1GdW5jdGlvbigKKyAgICAgICQkID0gbmV3IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbigKICAgICAgICAgICBtZXNoX3NwZWMuUGFzcygpLAogICAgICAgICAgICQ1LAogICAgICAgICAgICQ2LApAQCAtNjU3MiwxNiArNjU3MCwxNiBAQAogCiBjb2JhbHRfbWFwX3RvX21lc2hfc3BlYzoKICAgICBrRXF1aXJlY3Rhbmd1bGFyVG9rZW4gewotICAgICQkID0gbmV3IGNzc29tOjpNVE1GdW5jdGlvbjo6TWVzaFNwZWMoCi0gICAgICAgIGNzc29tOjpNVE1GdW5jdGlvbjo6a0VxdWlyZWN0YW5ndWxhcik7CisgICAgJCQgPSBuZXcgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjpNZXNoU3BlYygKKyAgICAgICAgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjprRXF1aXJlY3Rhbmd1bGFyKTsKICAgfQogICB8IHVybCBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoX2xpc3QgewogICAgIHNjb3BlZF9yZWZwdHI8Y3Nzb206OlByb3BlcnR5VmFsdWU+IHVybCA9IE1ha2VTY29wZWRSZWZQdHJBbmRSZWxlYXNlKCQxKTsKLSAgICBzY29wZWRfcHRyPGNzc29tOjpNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXI+CisgICAgc2NvcGVkX3B0cjxjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyPgogICAgICAgICByZXNvbHV0aW9uX21hdGNoZWRfbWVzaF91cmxzKCQyKTsKIAotICAgICQkID0gbmV3IGNzc29tOjpNVE1GdW5jdGlvbjo6TWVzaFNwZWMoCi0gICAgICAgIGNzc29tOjpNVE1GdW5jdGlvbjo6a1VybHMsCisgICAgJCQgPSBuZXcgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjpNZXNoU3BlYygKKyAgICAgICAgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjprVXJscywKICAgICAgICAgdXJsLAogICAgICAgICByZXNvbHV0aW9uX21hdGNoZWRfbWVzaF91cmxzLT5QYXNzKCkpOwogICB9CkBAIC02NTk0LDcgKzY1OTIsNyBAQAogCiBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoX2xpc3Q6CiAgICAgLyogZW1wdHkgKi8gewotICAgICQkID0gbmV3IGNzc29tOjpNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKTsKKyAgICAkJCA9IG5ldyBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCk7CiAgIH0KICAgLy8gU3BlY2lmaWVzIGEgZGlmZmVyZW50IG1lc2ggZm9yIGEgcGFydGljdWxhciBpbWFnZSByZXNvbHV0aW9uLgogICB8IGNvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hfbGlzdCBjb2JhbHRfbXRtX3Jlc29sdXRpb25fbWF0Y2hlZF9tZXNoIHsKQEAgLTY2MDUsNyArNjYwMyw3IEBACiAKIGNvYmFsdF9tdG1fcmVzb2x1dGlvbl9tYXRjaGVkX21lc2g6CiAgICAgbm9uX25lZ2F0aXZlX2ludGVnZXIgbm9uX25lZ2F0aXZlX2ludGVnZXIgdXJsIHsKLSAgICAkJCA9IG5ldyBjc3NvbTo6TVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaCgkMSwgJDIsCisgICAgJCQgPSBuZXcgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2goJDEsICQyLAogICAgICAgTWFrZVNjb3BlZFJlZlB0ckFuZFJlbGVhc2UoJDMpKTsKICAgfQogICA7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvbWFyZ2luX29yX3BhZGRpbmdfc2hvcnRoYW5kLmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL21hcmdpbl9vcl9wYWRkaW5nX3Nob3J0aGFuZC5jYwppbmRleCAwMzExYmVmLi4yN2NmYmUyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvbWFyZ2luX29yX3BhZGRpbmdfc2hvcnRoYW5kLmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9tYXJnaW5fb3JfcGFkZGluZ19zaG9ydGhhbmQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc19wYXJzZXIvbWFyZ2luX29yX3BhZGRpbmdfc2hvcnRoYW5kLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9tYXJnaW5fb3JfcGFkZGluZ19zaG9ydGhhbmQuaCBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9tYXJnaW5fb3JfcGFkZGluZ19zaG9ydGhhbmQuaAppbmRleCAwNGI0YzdhLi5hZGJlMjZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvbWFyZ2luX29yX3BhZGRpbmdfc2hvcnRoYW5kLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL21hcmdpbl9vcl9wYWRkaW5nX3Nob3J0aGFuZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTX1BBUlNFUl9NQVJHSU5fT1JfUEFERElOR19TSE9SVEhBTkRfSF8KICNkZWZpbmUgQ09CQUxUX0NTU19QQVJTRVJfTUFSR0lOX09SX1BBRERJTkdfU0hPUlRIQU5EX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyLmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlci5jYwppbmRleCBjNjMyMzU0Li43YmUxNTI1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyLmgiCiAKQEAgLTY1LDEwICs2MywxMCBAQAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21hcF90b19tZXNoX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21hdHJpeF9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9saXN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5LmgiCi0jaW5jbHVkZSAiY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9uZXh0X3NpYmxpbmdfY29tYmluYXRvci5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL251bWJlcl92YWx1ZS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlci5oIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlci5oCmluZGV4IGU3ZWNiMjMuLjAwMmZlNzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuaAorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NfUEFSU0VSX1BBUlNFUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTX1BBUlNFUl9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wYXJzZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wYXJzZXJfdGVzdC5jYwppbmRleCBhNDI4ZDZiLi4yOTkxZmU2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcGFyc2VyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3BhcnNlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL3BhcnNlci5oIgogCkBAIC01MSwxMCArNDksMTAgQEAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9sb2NhbF9zcmNfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWFwX3RvX21lc2hfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWF0cml4X2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfcXVlcnkuaCIKLSNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL25leHRfc2libGluZ19jb21iaW5hdG9yLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL25vdF9wc2V1ZG9fY2xhc3MuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmgiCkBAIC04Mzk3LDExICs4Mzk1LDEyIEBACiAgIEFTU0VSVF9UUlVFKGZpbHRlcl9saXN0KTsKICAgQVNTRVJUX0VRKDEsIGZpbHRlcl9saXN0LT52YWx1ZSgpLnNpemUoKSk7CiAKLSAgY29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uKiBtdG1fZnVuY3Rpb24gPQotICAgICAgZHluYW1pY19jYXN0PGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbio+KGZpbHRlcl9saXN0LT52YWx1ZSgpWzBdKTsKKyAgY29uc3QgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uKiBtdG1fZnVuY3Rpb24gPQorICAgICAgZHluYW1pY19jYXN0PGNvbnN0IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbio+KGZpbHRlcl9saXN0LT52YWx1ZSgpWzBdKTsKICAgQVNTRVJUX1RSVUUobXRtX2Z1bmN0aW9uKTsKIAotICBFWFBFQ1RfRVEoY3Nzb206Ok1UTUZ1bmN0aW9uOjprVXJscywgbXRtX2Z1bmN0aW9uLT5tZXNoX3NwZWMoKS5tZXNoX3R5cGUoKSk7CisgIEVYUEVDVF9FUShjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb246OmtVcmxzLAorICAgICAgICAgICAgbXRtX2Z1bmN0aW9uLT5tZXNoX3NwZWMoKS5tZXNoX3R5cGUoKSk7CiAKICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGZsb2F0PihNX1BJKSwgbXRtX2Z1bmN0aW9uLT5ob3Jpem9udGFsX2ZvdigpKTsKICAgRVhQRUNUX0VRKDEuNWYsIG10bV9mdW5jdGlvbi0+dmVydGljYWxfZm92KCkpOwpAQCAtODQyOCwxMSArODQyNywxMSBAQAogICBBU1NFUlRfVFJVRShmaWx0ZXJfbGlzdCk7CiAgIEFTU0VSVF9FUSgxLCBmaWx0ZXJfbGlzdC0+dmFsdWUoKS5zaXplKCkpOwogCi0gIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KLSAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CisgIGNvbnN0IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KKyAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CiAgIEFTU0VSVF9UUlVFKG10bV9mdW5jdGlvbik7CiAKLSAgRVhQRUNUX0VRKGNzc29tOjpNVE1GdW5jdGlvbjo6a0VxdWlyZWN0YW5ndWxhciwKKyAgRVhQRUNUX0VRKGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbjo6a0VxdWlyZWN0YW5ndWxhciwKICAgICAgICAgICAgIG10bV9mdW5jdGlvbi0+bWVzaF9zcGVjKCkubWVzaF90eXBlKCkpOwogCiAgIEVYUEVDVF9FUShzdGF0aWNfY2FzdDxmbG9hdD4oTV9QSSksIG10bV9mdW5jdGlvbi0+aG9yaXpvbnRhbF9mb3YoKSk7CkBAIC04NDU5LDggKzg0NTgsOCBAQAogICBBU1NFUlRfVFJVRShmaWx0ZXJfbGlzdCk7CiAgIEFTU0VSVF9FUSgxLCBmaWx0ZXJfbGlzdC0+dmFsdWUoKS5zaXplKCkpOwogCi0gIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KLSAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CisgIGNvbnN0IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KKyAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CiAgIEFTU0VSVF9UUlVFKG10bV9mdW5jdGlvbik7CiAKICAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PGZsb2F0PihNX1BJKSwgbXRtX2Z1bmN0aW9uLT5ob3Jpem9udGFsX2ZvdigpKTsKQEAgLTg1MjksMTAgKzg1MjgsMTAgQEAKICAgICAgICAgICBzdHlsZS0+R2V0UHJvcGVydHlWYWx1ZShjc3NvbTo6a0ZpbHRlclByb3BlcnR5KS5nZXQoKSk7CiAKICAgQVNTRVJUX1RSVUUoZmlsdGVyX2xpc3QpOwotICBjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qIG10bV9mdW5jdGlvbiA9Ci0gICAgICBkeW5hbWljX2Nhc3Q8Y29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uKj4oZmlsdGVyX2xpc3QtPnZhbHVlKClbMF0pOworICBjb25zdCBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb24qIG10bV9mdW5jdGlvbiA9CisgICAgICBkeW5hbWljX2Nhc3Q8Y29uc3QgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uKj4oZmlsdGVyX2xpc3QtPnZhbHVlKClbMF0pOwogCi0gIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXImIG1lc2hlcyA9CisgIGNvbnN0IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXImIG1lc2hlcyA9CiAgICAgICBtdG1fZnVuY3Rpb24tPm1lc2hfc3BlYygpLnJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMoKTsKIAogICBBU1NFUlRfRVEoMywgbWVzaGVzLnNpemUoKSk7CkBAIC04NTYzLDggKzg1NjIsOCBAQAogICAgICAgICAgIHN0eWxlLT5HZXRQcm9wZXJ0eVZhbHVlKGNzc29tOjprRmlsdGVyUHJvcGVydHkpLmdldCgpKTsKIAogICBBU1NFUlRfVFJVRShmaWx0ZXJfbGlzdCk7Ci0gIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KLSAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CisgIGNvbnN0IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KKyAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CiAKICAgY29uc3QgZ2xtOjptYXQ0JiBhY3R1YWwgPSBtdG1fZnVuY3Rpb24tPnRyYW5zZm9ybSgpOwogICBFWFBFQ1RfVFJVRSgKQEAgLTg1OTgsOCArODU5Nyw4IEBACiAgIEFTU0VSVF9UUlVFKGZpbHRlcl9saXN0KTsKICAgQVNTRVJUX0VRKDEsIGZpbHRlcl9saXN0LT52YWx1ZSgpLnNpemUoKSk7CiAKLSAgY29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uKiBtdG1fZnVuY3Rpb24gPQotICAgICAgZHluYW1pY19jYXN0PGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbio+KGZpbHRlcl9saXN0LT52YWx1ZSgpWzBdKTsKKyAgY29uc3QgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uKiBtdG1fZnVuY3Rpb24gPQorICAgICAgZHluYW1pY19jYXN0PGNvbnN0IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbio+KGZpbHRlcl9saXN0LT52YWx1ZSgpWzBdKTsKICAgQVNTRVJUX1RSVUUobXRtX2Z1bmN0aW9uKTsKIAogICBFWFBFQ1RfRVEobXRtX2Z1bmN0aW9uLT5zdGVyZW9fbW9kZSgpLT52YWx1ZSgpLApAQCAtODYyNCw4ICs4NjIzLDggQEAKICAgQVNTRVJUX1RSVUUoZmlsdGVyX2xpc3QpOwogICBBU1NFUlRfRVEoMSwgZmlsdGVyX2xpc3QtPnZhbHVlKCkuc2l6ZSgpKTsKIAotICBjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qIG10bV9mdW5jdGlvbiA9Ci0gICAgICBkeW5hbWljX2Nhc3Q8Y29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uKj4oZmlsdGVyX2xpc3QtPnZhbHVlKClbMF0pOworICBjb25zdCBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb24qIG10bV9mdW5jdGlvbiA9CisgICAgICBkeW5hbWljX2Nhc3Q8Y29uc3QgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uKj4oZmlsdGVyX2xpc3QtPnZhbHVlKClbMF0pOwogICBBU1NFUlRfVFJVRShtdG1fZnVuY3Rpb24pOwogCiAgIEVYUEVDVF9FUShtdG1fZnVuY3Rpb24tPnN0ZXJlb19tb2RlKCktPnZhbHVlKCksCkBAIC04NjUwLDggKzg2NDksOCBAQAogICBBU1NFUlRfVFJVRShmaWx0ZXJfbGlzdCk7CiAgIEFTU0VSVF9FUSgxLCBmaWx0ZXJfbGlzdC0+dmFsdWUoKS5zaXplKCkpOwogCi0gIGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KLSAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CisgIGNvbnN0IGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbiogbXRtX2Z1bmN0aW9uID0KKyAgICAgIGR5bmFtaWNfY2FzdDxjb25zdCBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb24qPihmaWx0ZXJfbGlzdC0+dmFsdWUoKVswXSk7CiAgIEFTU0VSVF9UUlVFKG10bV9mdW5jdGlvbik7CiAKICAgRVhQRUNUX0VRKG10bV9mdW5jdGlvbi0+c3RlcmVvX21vZGUoKS0+dmFsdWUoKSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wb3NpdGlvbl9wYXJzZV9zdHJ1Y3R1cmVzLmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3Bvc2l0aW9uX3BhcnNlX3N0cnVjdHVyZXMuY2MKaW5kZXggNTBjMTNmMy4uOWMwOGQ2ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3Bvc2l0aW9uX3BhcnNlX3N0cnVjdHVyZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3Bvc2l0aW9uX3BhcnNlX3N0cnVjdHVyZXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc19wYXJzZXIvcG9zaXRpb25fcGFyc2Vfc3RydWN0dXJlcy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcG9zaXRpb25fcGFyc2Vfc3RydWN0dXJlcy5oIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3Bvc2l0aW9uX3BhcnNlX3N0cnVjdHVyZXMuaAppbmRleCAyNjM5OWRjLi4zYjI4YmZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcG9zaXRpb25fcGFyc2Vfc3RydWN0dXJlcy5oCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9wb3NpdGlvbl9wYXJzZV9zdHJ1Y3R1cmVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NfUEFSU0VSX1BPU0lUSU9OX1BBUlNFX1NUUlVDVFVSRVNfSF8KICNkZWZpbmUgQ09CQUxUX0NTU19QQVJTRVJfUE9TSVRJT05fUEFSU0VfU1RSVUNUVVJFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3Byb3BlcnR5X2RlY2xhcmF0aW9uLmggYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcHJvcGVydHlfZGVjbGFyYXRpb24uaAppbmRleCA3MGI4OGU5Li5kY2U5Nzk3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcHJvcGVydHlfZGVjbGFyYXRpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcHJvcGVydHlfZGVjbGFyYXRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU19QQVJTRVJfUFJPUEVSVFlfREVDTEFSQVRJT05fSF8KICNkZWZpbmUgQ09CQUxUX0NTU19QQVJTRVJfUFJPUEVSVFlfREVDTEFSQVRJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9yZWZfY291bnRlZF91dGlsLmggYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcmVmX2NvdW50ZWRfdXRpbC5oCmluZGV4IDZkMTRmOTQuLjZhOTI5YWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9yZWZfY291bnRlZF91dGlsLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3JlZl9jb3VudGVkX3V0aWwuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU19QQVJTRVJfUkVGX0NPVU5URURfVVRJTF9IXwogI2RlZmluZSBDT0JBTFRfQ1NTX1BBUlNFUl9SRUZfQ09VTlRFRF9VVElMX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcmVmX2NvdW50ZWRfdXRpbF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3JlZl9jb3VudGVkX3V0aWxfdGVzdC5jYwppbmRleCBhNGNjYzYxLi5mODM2Mjc3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvcmVmX2NvdW50ZWRfdXRpbF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9yZWZfY291bnRlZF91dGlsX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc19wYXJzZXIvcmVmX2NvdW50ZWRfdXRpbC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc2Nhbm5lci5jYyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyLmNjCmluZGV4IDNkM2NlNWUuLjAxYmVhYTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuaCBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyLmgKaW5kZXggZmUxODQ3Mi4uOGMyZDU5MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXIuaAorKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc2Nhbm5lci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTX1BBUlNFUl9TQ0FOTkVSX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NfUEFSU0VSX1NDQU5ORVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc2Nhbm5lcl90ZXN0LmNjCmluZGV4IGY1OGM2YmIuLmJiODBiZGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NjYW5uZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci9zY2FubmVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zaGFkb3dfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zaGFkb3dfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYwppbmRleCBlMGJhZjYwLi5kY2JlZmQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc2hhZG93X3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NoYWRvd19wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NfcGFyc2VyL3NoYWRvd19wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zaGFkb3dfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NoYWRvd19wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKaW5kZXggNDM0N2VmNi4uN2YzMjY5MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NoYWRvd19wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3NoYWRvd19wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NfUEFSU0VSX1NIQURPV19QUk9QRVJUWV9QQVJTRV9TVFJVQ1RVUkVTX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NfUEFSU0VSX1NIQURPV19QUk9QRVJUWV9QQVJTRV9TVFJVQ1RVUkVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvc3RyaW5nX3Bvb2wuaCBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zdHJpbmdfcG9vbC5oCmluZGV4IGMzZTQxYWMuLjMzZjljNjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zdHJpbmdfcG9vbC5oCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci9zdHJpbmdfcG9vbC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTX1BBUlNFUl9TVFJJTkdfUE9PTF9IXwogI2RlZmluZSBDT0JBTFRfQ1NTX1BBUlNFUl9TVFJJTkdfUE9PTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3RyYW5zaXRpb25fc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuY2MgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJhbnNpdGlvbl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYwppbmRleCA2YzM0MjhjLi5hOTdlZGE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJhbnNpdGlvbl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJhbnNpdGlvbl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci90cmFuc2l0aW9uX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci90cmFuc2l0aW9uX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmggYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJhbnNpdGlvbl9zaG9ydGhhbmRfcHJvcGVydHlfcGFyc2Vfc3RydWN0dXJlcy5oCmluZGV4IGI5ZGQ1NDguLmZiYzI3NDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci90cmFuc2l0aW9uX3Nob3J0aGFuZF9wcm9wZXJ0eV9wYXJzZV9zdHJ1Y3R1cmVzLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3RyYW5zaXRpb25fc2hvcnRoYW5kX3Byb3BlcnR5X3BhcnNlX3N0cnVjdHVyZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU19QQVJTRVJfVFJBTlNJVElPTl9TSE9SVEhBTkRfUFJPUEVSVFlfUEFSU0VfU1RSVUNUVVJFU19IXwogI2RlZmluZSBDT0JBTFRfQ1NTX1BBUlNFUl9UUkFOU0lUSU9OX1NIT1JUSEFORF9QUk9QRVJUWV9QQVJTRV9TVFJVQ1RVUkVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJpdmlhbF9zdHJpbmdfcGllY2UuaCBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci90cml2aWFsX3N0cmluZ19waWVjZS5oCmluZGV4IDdmODQwYzIuLjI1NTM1N2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3NzX3BhcnNlci90cml2aWFsX3N0cmluZ19waWVjZS5oCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci90cml2aWFsX3N0cmluZ19waWVjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTX1BBUlNFUl9UUklWSUFMX1NUUklOR19QSUVDRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTX1BBUlNFUl9UUklWSUFMX1NUUklOR19QSUVDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3RyaXZpYWxfc3RyaW5nX3BpZWNlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJpdmlhbF9zdHJpbmdfcGllY2VfdGVzdC5jYwppbmRleCA3ZmMzMTkyLi5hNjgzMzQ4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJpdmlhbF9zdHJpbmdfcGllY2VfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJpdmlhbF9zdHJpbmdfcGllY2VfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci90cml2aWFsX3N0cmluZ19waWVjZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJpdmlhbF90eXBlX3BhaXJzLmggYi9zcmMvY29iYWx0L2Nzc19wYXJzZXIvdHJpdmlhbF90eXBlX3BhaXJzLmgKaW5kZXggMzQ0OWEyOC4uMDkyYWIzOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NfcGFyc2VyL3RyaXZpYWxfdHlwZV9wYWlycy5oCisrKyBiL3NyYy9jb2JhbHQvY3NzX3BhcnNlci90cml2aWFsX3R5cGVfcGFpcnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU19QQVJTRVJfVFJJVklBTF9UWVBFX1BBSVJTX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NfUEFSU0VSX1RSSVZJQUxfVFlQRV9QQUlSU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9DU1MuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9DU1MuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiODA3YTM5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLyN0aGUtY3NzLWludGVyZmFjZQotCi1pbnRlcmZhY2UgQ1NTIHsKLSAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzKERPTVN0cmluZyBwcm9wZXJ0eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZyB2YWx1ZSk7Ci19OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTQ29uZGl0aW9uUnVsZS5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL0NTU0NvbmRpdGlvblJ1bGUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMmJlZDU5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTQ29uZGl0aW9uUnVsZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzMy1jb25kaXRpb25hbC8jY3NzY29uZGl0aW9ucnVsZQotCi1pbnRlcmZhY2UgQ1NTQ29uZGl0aW9uUnVsZSA6IENTU0dyb3VwaW5nUnVsZSB7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gYXR0cmlidXRlIERPTVN0cmluZyBjb25kaXRpb25UZXh0OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTRm9udEZhY2VSdWxlLmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vQ1NTRm9udEZhY2VSdWxlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2ZjNTNkMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL0NTU0ZvbnRGYWNlUnVsZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvY3NzMy1mb250cy8jb20tZm9udGZhY2UKLQotaW50ZXJmYWNlIENTU0ZvbnRGYWNlUnVsZSA6IENTU1J1bGUgewotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgZmFtaWx5OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgc3JjOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgc3R5bGU7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gYXR0cmlidXRlIERPTVN0cmluZyB3ZWlnaHQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gYXR0cmlidXRlIERPTVN0cmluZyB1bmljb2RlUmFuZ2U7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NHcm91cGluZ1J1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9DU1NHcm91cGluZ1J1bGUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNGJmNTE1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTR3JvdXBpbmdSdWxlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLyNjc3Nncm91cGluZ3J1bGUKLQotaW50ZXJmYWNlIENTU0dyb3VwaW5nUnVsZSA6IENTU1J1bGUgewotICByZWFkb25seSBhdHRyaWJ1dGUgQ1NTUnVsZUxpc3QgY3NzUnVsZXM7Ci0gIHVuc2lnbmVkIGxvbmcgaW5zZXJ0UnVsZShET01TdHJpbmcgcnVsZSwgdW5zaWduZWQgbG9uZyBpbmRleCk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NLZXlmcmFtZVJ1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9DU1NLZXlmcmFtZVJ1bGUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzkzZGUyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTS2V5ZnJhbWVSdWxlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzczMtYW5pbWF0aW9ucy0yMDEzMDIxOS8jQ1NTS2V5ZnJhbWVSdWxlLWludGVyZmFjZQotCi1pbnRlcmZhY2UgQ1NTS2V5ZnJhbWVSdWxlIDogQ1NTUnVsZSB7Ci0gIC8vIFRPRE86IGtleVRleHQgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlYWQtb25seS4gIFJlbW92ZSB0aGlzIG1vZGlmaWVyIGFuZAotICAvLyAgICAgICBpbXBsZW1lbnQgYSBzZXR0ZXIgZm9yIGtleVRleHQuCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2V5VGV4dDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIENTU1N0eWxlRGVjbGFyYXRpb24gc3R5bGU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NLZXlmcmFtZXNSdWxlLmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vQ1NTS2V5ZnJhbWVzUnVsZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NTNiMzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NLZXlmcmFtZXNSdWxlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzczMtYW5pbWF0aW9ucy0yMDEzMDIxOS8jQ1NTS2V5ZnJhbWVzUnVsZS1pbnRlcmZhY2UKLQotaW50ZXJmYWNlIENTU0tleWZyYW1lc1J1bGUgOiBDU1NSdWxlIHsKLSAgLy8gVE9ETzogbmFtZSBpcyBub3Qgc3VwcG9zZWQgdG8gYmUgcmVhZC1vbmx5LiAgUmVtb3ZlIHRoaXMgbW9kaWZpZXIgYW5kCi0gIC8vICAgICAgIGltcGxlbWVudCBhIHNldHRlciBmb3IgbmFtZS4KLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBuYW1lOwotICByZWFkb25seSBhdHRyaWJ1dGUgQ1NTUnVsZUxpc3QgY3NzUnVsZXM7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NNZWRpYVJ1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9DU1NNZWRpYVJ1bGUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2JiMmNhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTTWVkaWFSdWxlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLyNjc3NtZWRpYXJ1bGUKLQotaW50ZXJmYWNlIENTU01lZGlhUnVsZSA6IENTU0NvbmRpdGlvblJ1bGUgewotICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIE1lZGlhTGlzdCBtZWRpYTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL0NTU1J1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9DU1NSdWxlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzhiOWIyOS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL0NTU1J1bGUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI3RoZS1jc3NydWxlLWludGVyZmFjZQotCi1pbnRlcmZhY2UgQ1NTUnVsZSB7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNUWUxFX1JVTEUgPSAxOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBDSEFSU0VUX1JVTEUgPSAyOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBJTVBPUlRfUlVMRSA9IDM7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1FRElBX1JVTEUgPSA0OwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBGT05UX0ZBQ0VfUlVMRSA9IDU7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IFBBR0VfUlVMRSA9IDY7Ci0KLSAgLy8gS0VZRlJBTUVTX1JVTEUgYW5kIEtFWUZSQU1FX1JVTEUgYXJlIHNwZWNpZmllZCBpbiBDU1MgQW5pbWF0aW9uczoKLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3MzLWFuaW1hdGlvbnMtMjAxMzAyMTkvI0NTU1J1bGUtaW50ZXJmYWNlCi0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IEtFWUZSQU1FU19SVUxFID0gNzsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgS0VZRlJBTUVfUlVMRSA9IDg7Ci0KLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgTUFSR0lOX1JVTEUgPSA5OwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOQU1FU1BBQ0VfUlVMRSA9IDEwOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgdHlwZTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgY3NzVGV4dDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIENTU1J1bGU/IHBhcmVudFJ1bGU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBDU1NTdHlsZVNoZWV0PyBwYXJlbnRTdHlsZVNoZWV0OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTUnVsZUxpc3QuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9DU1NSdWxlTGlzdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQzMmMzZDEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NSdWxlTGlzdC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLWNzc3J1bGVsaXN0LWludGVyZmFjZQotCi1pbnRlcmZhY2UgQ1NTUnVsZUxpc3QgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGdldHRlciBDU1NSdWxlPyBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTU3R5bGVEZWNsYXJhdGlvbi5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL0NTU1N0eWxlRGVjbGFyYXRpb24uaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTlkMjNkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTU3R5bGVEZWNsYXJhdGlvbi5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI3RoZS1jc3NzdHlsZWRlY2xhcmF0aW9uLWludGVyZmFjZQotCi1pbnRlcmZhY2UgQ1NTU3R5bGVEZWNsYXJhdGlvbiB7Ci0gIC8vIFRPRE86IFJlcGxhY2UgdGhpcyBsaXN0IHdpdGggX19jYW1lbF9jYXNlZF9hdHRyaWJ1dGUuCi0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGFuaW1hdGlvbjsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uRGVsYXk7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGFuaW1hdGlvbkRpcmVjdGlvbjsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uRHVyYXRpb247Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGFuaW1hdGlvbkZpbGxNb2RlOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBhbmltYXRpb25JdGVyYXRpb25Db3VudDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uTmFtZTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uVGltaW5nRnVuY3Rpb247Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJhY2tncm91bmQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJhY2tncm91bmRDb2xvcjsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYmFja2dyb3VuZEltYWdlOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBiYWNrZ3JvdW5kUG9zaXRpb247Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJhY2tncm91bmRSZXBlYXQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJhY2tncm91bmRTaXplOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXI7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlckJvdHRvbTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyQm90dG9tQ29sb3I7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlckJvdHRvbVN0eWxlOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJCb3R0b21XaWR0aDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyQ29sb3I7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlckxlZnQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlckxlZnRDb2xvcjsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyTGVmdFN0eWxlOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJMZWZ0V2lkdGg7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclJhZGl1czsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyUmlnaHQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclJpZ2h0Q29sb3I7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclJpZ2h0U3R5bGU7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclJpZ2h0V2lkdGg7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclN0eWxlOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJUb3A7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclRvcENvbG9yOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJUb3BTdHlsZTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyVG9wV2lkdGg7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlcldpZHRoOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3R0b207Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJveFNoYWRvdzsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgY29sb3I7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGNvbnRlbnQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGRpc3BsYXk7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGZpbHRlcjsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgZm9udDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgZm9udEZhbWlseTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgZm9udFNpemU7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGZvbnRTdHlsZTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgZm9udFdlaWdodDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgaGVpZ2h0OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBsZWZ0OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBsaW5lSGVpZ2h0OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBtYXJnaW47Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1hcmdpbkJvdHRvbTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgbWFyZ2luTGVmdDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgbWFyZ2luUmlnaHQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1hcmdpblRvcDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgbWF4SGVpZ2h0OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBtYXhXaWR0aDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgbWluSGVpZ2h0OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBtaW5XaWR0aDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgb3BhY2l0eTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgb3ZlcmZsb3c7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG92ZXJmbG93V3JhcDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgcGFkZGluZzsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgcGFkZGluZ0JvdHRvbTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgcGFkZGluZ0xlZnQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHBhZGRpbmdSaWdodDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgcGFkZGluZ1RvcDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgcG9zaXRpb247Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJpZ2h0OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0ZXh0QWxpZ247Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRleHREZWNvcmF0aW9uOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0ZXh0RGVjb3JhdGlvbkxpbmU7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRleHRJbmRlbnQ7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRleHRPdmVyZmxvdzsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdGV4dFNoYWRvdzsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdGV4dFRyYW5zZm9ybTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdG9wOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0cmFuc2Zvcm07Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRyYW5zZm9ybU9yaWdpbjsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdHJhbnNpdGlvbjsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdHJhbnNpdGlvbkRlbGF5OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0cmFuc2l0aW9uRHVyYXRpb247Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRyYW5zaXRpb25Qcm9wZXJ0eTsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdHJhbnNpdGlvblRpbWluZ0Z1bmN0aW9uOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB2ZXJ0aWNhbEFsaWduOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB2aXNpYmlsaXR5OwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB3aGl0ZVNwYWNlOwotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB3aWR0aDsKLSAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgd29yZFdyYXA7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHpJbmRleDsKLQotICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBjc3NUZXh0OwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGdldHRlciBET01TdHJpbmc/IGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7Ci0gIERPTVN0cmluZyBnZXRQcm9wZXJ0eVZhbHVlKERPTVN0cmluZyBwcm9wZXJ0eSk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0UHJvcGVydHkoCi0gICAgICBET01TdHJpbmcgcHJvcGVydHksIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gRE9NU3RyaW5nIHZhbHVlLAotICAgICAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBvcHRpb25hbCBET01TdHJpbmcgcHJpb3JpdHkpOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNldFByb3BlcnR5VmFsdWUoCi0gICAgICBET01TdHJpbmcgcHJvcGVydHksIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gRE9NU3RyaW5nIHZhbHVlKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gRE9NU3RyaW5nIHJlbW92ZVByb3BlcnR5KERPTVN0cmluZyBwcm9wZXJ0eSk7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBDU1NSdWxlPyBwYXJlbnRSdWxlOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vQ1NTU3R5bGVSdWxlLmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vQ1NTU3R5bGVSdWxlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk1MTYxOC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL0NTU1N0eWxlUnVsZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLWNzc3N0eWxlcnVsZS1pbnRlcmZhY2UKLQotaW50ZXJmYWNlIENTU1N0eWxlUnVsZSA6IENTU1J1bGUgewotICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIENTU1N0eWxlRGVjbGFyYXRpb24gc3R5bGU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NTdHlsZVNoZWV0LmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vQ1NTU3R5bGVTaGVldC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMwMjM2MWEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9DU1NTdHlsZVNoZWV0LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLTIwMTMxMjA1LyN0aGUtY3Nzc3R5bGVzaGVldC1pbnRlcmZhY2UKLQotaW50ZXJmYWNlIENTU1N0eWxlU2hlZXQgOiBTdHlsZVNoZWV0IHsKLSAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBDU1NSdWxlTGlzdCBjc3NSdWxlczsKLSAgdW5zaWduZWQgbG9uZyBpbnNlcnRSdWxlKERPTVN0cmluZyBydWxlLCB1bnNpZ25lZCBsb25nIGluZGV4KTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL0xpbmtTdHlsZS5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL0xpbmtTdHlsZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZWRjMzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9MaW5rU3R5bGUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI3RoZS1saW5rc3R5bGUtaW50ZXJmYWNlCi0KLVtOb0ludGVyZmFjZU9iamVjdF0KLWludGVyZmFjZSBMaW5rU3R5bGUgewotIHJlYWRvbmx5IGF0dHJpYnV0ZSBTdHlsZVNoZWV0PyBzaGVldDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL01lZGlhTGlzdC5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL01lZGlhTGlzdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYyYjllZjEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9NZWRpYUxpc3QuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI21lZGlhbGlzdAotCi1bQXJyYXlDbGFzc10KLWludGVyZmFjZSBNZWRpYUxpc3QgewotICBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1lZGlhVGV4dDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBnZXR0ZXIgRE9NU3RyaW5nPyBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotICB2b2lkIGFwcGVuZE1lZGl1bShET01TdHJpbmcgbWVkaXVtKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL1N0eWxlU2hlZXQuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9TdHlsZVNoZWV0LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmNlYzdjMi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL1N0eWxlU2hlZXQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI3RoZS1zdHlsZXNoZWV0LWludGVyZmFjZQotCi1pbnRlcmZhY2UgU3R5bGVTaGVldCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vU3R5bGVTaGVldExpc3QuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9TdHlsZVNoZWV0TGlzdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmNmUxNGIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9TdHlsZVNoZWV0TGlzdC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLXN0eWxlc2hlZXRsaXN0LWludGVyZmFjZQotCi1pbnRlcmZhY2UgU3R5bGVTaGVldExpc3QgewotICBnZXR0ZXIgU3R5bGVTaGVldD8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vYWJzb2x1dGVfdXJsX3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9hYnNvbHV0ZV91cmxfdmFsdWUuY2MKaW5kZXggOWNmZmE4Zi4uZGVjMGNkOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9hYnNvbHV0ZV91cmxfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9hYnNvbHV0ZV91cmxfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Fic29sdXRlX3VybF92YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Fic29sdXRlX3VybF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9hYnNvbHV0ZV91cmxfdmFsdWUuaAppbmRleCA1NDQzZGY0Li4yNGZlYzFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Fic29sdXRlX3VybF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vYWJzb2x1dGVfdXJsX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9BQlNPTFVURV9VUkxfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0FCU09MVVRFX1VSTF9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9hY3RpdmVfcHNldWRvX2NsYXNzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9hY3RpdmVfcHNldWRvX2NsYXNzLmNjCmluZGV4IGJmZDkwZWQuLjg2OGE2NjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vYWN0aXZlX3BzZXVkb19jbGFzcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2FjdGl2ZV9wc2V1ZG9fY2xhc3MuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2FjdGl2ZV9wc2V1ZG9fY2xhc3MuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9hY3RpdmVfcHNldWRvX2NsYXNzLmggYi9zcmMvY29iYWx0L2Nzc29tL2FjdGl2ZV9wc2V1ZG9fY2xhc3MuaAppbmRleCBkMTMzYTA2Li43ZTRlZDgzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2FjdGl2ZV9wc2V1ZG9fY2xhc3MuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2FjdGl2ZV9wc2V1ZG9fY2xhc3MuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0FDVElWRV9QU0VVRE9fQ0xBU1NfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0FDVElWRV9QU0VVRE9fQ0xBU1NfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vYWZ0ZXJfcHNldWRvX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2FmdGVyX3BzZXVkb19lbGVtZW50LmNjCmluZGV4IDBhOTkxMzQuLjBlNzg2N2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vYWZ0ZXJfcHNldWRvX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9hZnRlcl9wc2V1ZG9fZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vYWZ0ZXJfcHNldWRvX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9hZnRlcl9wc2V1ZG9fZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9jc3NvbS9hZnRlcl9wc2V1ZG9fZWxlbWVudC5oCmluZGV4IDkzZDJkMTAuLjIzM2RjZmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vYWZ0ZXJfcHNldWRvX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2FmdGVyX3BzZXVkb19lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9BRlRFUl9QU0VVRE9fRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQUZURVJfUFNFVURPX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vYW5pbWF0aW9uLmggYi9zcmMvY29iYWx0L2Nzc29tL2FuaW1hdGlvbi5oCmluZGV4IDI0NjgwODEuLmJhYzFjY2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vYW5pbWF0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9hbmltYXRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0FOSU1BVElPTl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQU5JTUFUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2FuaW1hdGlvbl9zZXQuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2FuaW1hdGlvbl9zZXQuY2MKaW5kZXggYTI0NTliYi4uN2M5OTllNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9hbmltYXRpb25fc2V0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vYW5pbWF0aW9uX3NldC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vYW5pbWF0aW9uX3NldC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2FuaW1hdGlvbl9zZXQuaCBiL3NyYy9jb2JhbHQvY3Nzb20vYW5pbWF0aW9uX3NldC5oCmluZGV4IDE2MDM3N2IuLjczYzQ3MTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vYW5pbWF0aW9uX3NldC5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vYW5pbWF0aW9uX3NldC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQU5JTUFUSU9OX1NFVF9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQU5JTUFUSU9OX1NFVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9hdHRyaWJ1dGVfc2VsZWN0b3IuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2F0dHJpYnV0ZV9zZWxlY3Rvci5jYwppbmRleCAxMGI2MDIyLi5jNmEwMjA3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2F0dHJpYnV0ZV9zZWxlY3Rvci5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2F0dHJpYnV0ZV9zZWxlY3Rvci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vYXR0cmlidXRlX3NlbGVjdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vYXR0cmlidXRlX3NlbGVjdG9yLmggYi9zcmMvY29iYWx0L2Nzc29tL2F0dHJpYnV0ZV9zZWxlY3Rvci5oCmluZGV4IDY5YjdlM2MuLjljMzYwNzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vYXR0cmlidXRlX3NlbGVjdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9hdHRyaWJ1dGVfc2VsZWN0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0FUVFJJQlVURV9TRUxFQ1RPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQVRUUklCVVRFX1NFTEVDVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2JlZm9yZV9wc2V1ZG9fZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vYmVmb3JlX3BzZXVkb19lbGVtZW50LmNjCmluZGV4IGVkZTU5ZGIuLjAxNzg5YTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vYmVmb3JlX3BzZXVkb19lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vYmVmb3JlX3BzZXVkb19lbGVtZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9iZWZvcmVfcHNldWRvX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9iZWZvcmVfcHNldWRvX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvY3Nzb20vYmVmb3JlX3BzZXVkb19lbGVtZW50LmgKaW5kZXggZDIzNDRlZS4uZGEyY2FhYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9iZWZvcmVfcHNldWRvX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2JlZm9yZV9wc2V1ZG9fZWxlbWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQkVGT1JFX1BTRVVET19FTEVNRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9CRUZPUkVfUFNFVURPX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY2FsY192YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY2FsY192YWx1ZS5jYwppbmRleCA0ZDQxYjEwLi5jMjhlMTU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2NhbGNfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jYWxjX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jYWxjX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY2FsY192YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jYWxjX3ZhbHVlLmgKaW5kZXggNTgwNzkyZS4uNGJjYzg1ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jYWxjX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jYWxjX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DQUxDX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DQUxDX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nhc2NhZGVfcHJlY2VkZW5jZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlX3ByZWNlZGVuY2UuaAppbmRleCBhMjhkYjUwLi5jOGZjMDIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nhc2NhZGVfcHJlY2VkZW5jZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY2FzY2FkZV9wcmVjZWRlbmNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DQVNDQURFX1BSRUNFREVOQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NBU0NBREVfUFJFQ0VERU5DRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlX3ByZWNlZGVuY2VfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY2FzY2FkZV9wcmVjZWRlbmNlX3Rlc3QuY2MKaW5kZXggYzY2OGI5NC4uYWE5MmNjMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlX3ByZWNlZGVuY2VfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nhc2NhZGVfcHJlY2VkZW5jZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jYXNjYWRlX3ByZWNlZGVuY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlZF9zdHlsZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY2FzY2FkZWRfc3R5bGUuY2MKaW5kZXggNzc3Njk3OS4uYzc2MjVlMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlZF9zdHlsZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nhc2NhZGVkX3N0eWxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jYXNjYWRlZF9zdHlsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nhc2NhZGVkX3N0eWxlLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nhc2NhZGVkX3N0eWxlLmgKaW5kZXggNjk3MjM3Zi4uMDRhYzhlNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlZF9zdHlsZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY2FzY2FkZWRfc3R5bGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NBU0NBREVEX1NUWUxFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DQVNDQURFRF9TVFlMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlZF9zdHlsZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jYXNjYWRlZF9zdHlsZV90ZXN0LmNjCmluZGV4IDQ4OTI3NzMuLjJlOGE5MTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY2FzY2FkZWRfc3R5bGVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nhc2NhZGVkX3N0eWxlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nhc2NhZGVkX3N0eWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY2hhcmFjdGVyX2NsYXNzaWZpY2F0aW9uLmggYi9zcmMvY29iYWx0L2Nzc29tL2NoYXJhY3Rlcl9jbGFzc2lmaWNhdGlvbi5oCmluZGV4IDdmYmNkZTguLjUxZTM5ZGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY2hhcmFjdGVyX2NsYXNzaWZpY2F0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jaGFyYWN0ZXJfY2xhc3NpZmljYXRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NIQVJBQ1RFUl9DTEFTU0lGSUNBVElPTl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ0hBUkFDVEVSX0NMQVNTSUZJQ0FUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2NoaWxkX2NvbWJpbmF0b3IuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2NoaWxkX2NvbWJpbmF0b3IuY2MKaW5kZXggMjc1NDZmMS4uYTFjNjQ3ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jaGlsZF9jb21iaW5hdG9yLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY2hpbGRfY29tYmluYXRvci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY2hpbGRfY29tYmluYXRvci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2NoaWxkX2NvbWJpbmF0b3IuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY2hpbGRfY29tYmluYXRvci5oCmluZGV4IDM5ZmY3OTMuLjUwMmM3MzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY2hpbGRfY29tYmluYXRvci5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY2hpbGRfY29tYmluYXRvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ0hJTERfQ09NQklOQVRPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ0hJTERfQ09NQklOQVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jbGFzc19zZWxlY3Rvci5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY2xhc3Nfc2VsZWN0b3IuY2MKaW5kZXggZTVmN2Y5ZC4uMWY3MzNjMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jbGFzc19zZWxlY3Rvci5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2NsYXNzX3NlbGVjdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jbGFzc19zZWxlY3Rvci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2NsYXNzX3NlbGVjdG9yLmggYi9zcmMvY29iYWx0L2Nzc29tL2NsYXNzX3NlbGVjdG9yLmgKaW5kZXggZDIxYTYyMC4uZjcxNTBmMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jbGFzc19zZWxlY3Rvci5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY2xhc3Nfc2VsZWN0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NMQVNTX1NFTEVDVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DTEFTU19TRUxFQ1RPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jb2xvcl9zdG9wLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jb2xvcl9zdG9wLmNjCmluZGV4IGNiOWFhYjQuLjdjNzNkNmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY29sb3Jfc3RvcC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2NvbG9yX3N0b3AuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2NvbG9yX3N0b3AuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jb2xvcl9zdG9wLmggYi9zcmMvY29iYWx0L2Nzc29tL2NvbG9yX3N0b3AuaAppbmRleCAxMzEyMTFmLi5lMTIzY2IxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2NvbG9yX3N0b3AuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2NvbG9yX3N0b3AuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NPTE9SX1NUT1BfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NPTE9SX1NUT1BfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY29tYmluYXRvci5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY29tYmluYXRvci5jYwppbmRleCA4ZTZlNzc0Li4wN2VhZGZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2NvbWJpbmF0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21iaW5hdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jb21iaW5hdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY29tYmluYXRvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21iaW5hdG9yLmgKaW5kZXggM2EyYjdhOS4uOThhNGNiMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jb21iaW5hdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21iaW5hdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DT01CSU5BVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DT01CSU5BVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2NvbWJpbmF0b3JfdmlzaXRvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21iaW5hdG9yX3Zpc2l0b3IuaAppbmRleCA5MzVmZTA2Li5lMzczN2Q5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2NvbWJpbmF0b3JfdmlzaXRvci5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY29tYmluYXRvcl92aXNpdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DT01CSU5BVE9SX1ZJU0lUT1JfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NPTUJJTkFUT1JfVklTSVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jb21wbGV4X3NlbGVjdG9yLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wbGV4X3NlbGVjdG9yLmNjCmluZGV4IGIxNjRjNzcuLjg3ZDJjODAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcGxleF9zZWxlY3Rvci5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXBsZXhfc2VsZWN0b3IuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2NvbXBsZXhfc2VsZWN0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jb21wbGV4X3NlbGVjdG9yLmggYi9zcmMvY29iYWx0L2Nzc29tL2NvbXBsZXhfc2VsZWN0b3IuaAppbmRleCBlMjBlZjhhLi5jZjNmYWVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2NvbXBsZXhfc2VsZWN0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXBsZXhfc2VsZWN0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NPTVBMRVhfU0VMRUNUT1JfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NPTVBMRVhfU0VMRUNUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcG91bmRfc2VsZWN0b3IuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXBvdW5kX3NlbGVjdG9yLmNjCmluZGV4IDIyZWZjMWQuLjU4MzRkYzggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcG91bmRfc2VsZWN0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wb3VuZF9zZWxlY3Rvci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY29tcG91bmRfc2VsZWN0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jb21wb3VuZF9zZWxlY3Rvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wb3VuZF9zZWxlY3Rvci5oCmluZGV4IDA5N2UyY2QuLjUyYmY4NmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcG91bmRfc2VsZWN0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXBvdW5kX3NlbGVjdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DT01QT1VORF9TRUxFQ1RPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ09NUE9VTkRfU0VMRUNUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXB1dGVkX3N0eWxlLmNjCmluZGV4IDNlMTNkN2QuLjhjY2NmZTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wdXRlZF9zdHlsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jb21wdXRlZF9zdHlsZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wdXRlZF9zdHlsZS5oCmluZGV4IGRhOWM5ZGEuLjZkMjgzNzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2NvbXB1dGVkX3N0eWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DT01QVVRFRF9TVFlMRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ09NUFVURURfU1RZTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY29tcHV0ZWRfc3R5bGVfdGVzdC5jYwppbmRleCBmOTc0NWViLi44NWViM2IzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2NvbXB1dGVkX3N0eWxlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jb21wdXRlZF9zdHlsZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jb21wdXRlZF9zdHlsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzcy5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzLmNjCmluZGV4IDAyYThjMGMuLmQzMGFlNTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3MuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3MuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzLmgKaW5kZXggMGEzMjA1Mi4uMTdkZDM5NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3MuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DU1NfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzLmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wN2I3NGY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3MuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLyN0aGUtY3NzLWludGVyZmFjZQorCitpbnRlcmZhY2UgQ1NTIHsKKyAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHN0YXRpYyBib29sZWFuIHN1cHBvcnRzKERPTVN0cmluZyBwcm9wZXJ0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZyB2YWx1ZSk7Cit9OwpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmNjCmluZGV4IDUwOWE5YjMuLmJkZDcxMTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5oCmluZGV4IGZiMTJmMzcuLjJmODZkOGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfQ09NUFVURURfU1RZTEVfREFUQV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX0NPTVBVVEVEX1NUWUxFX0RBVEFfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGFfcHJvcGVydHlfc2V0X21hdGNoZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGFfcHJvcGVydHlfc2V0X21hdGNoZXJfdGVzdC5jYwppbmRleCA5ZGZlZGZlLi5jNzUxNzdjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhX3Byb3BlcnR5X3NldF9tYXRjaGVyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YV9wcm9wZXJ0eV9zZXRfbWF0Y2hlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhX3Rlc3QuY2MKaW5kZXggNGFlZGUwYy4uNGI5NmJiYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGF0YV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGFfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24uY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbi5jYwppbmRleCAxY2ExNTY2Li5mMTljN2QwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbi5oCmluZGV4IDE3MzU2OTAuLjQyMGI5Y2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19DT01QVVRFRF9TVFlMRV9ERUNMQVJBVElPTl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX0NPTVBVVEVEX1NUWUxFX0RFQ0xBUkFUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb25fdGVzdC5jYwppbmRleCBkNWFiZDVhLi4xNTJmYmQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbi5oIgpAQCAtMzgsNyArMzYsNyBAQAogICAgIGRvbV9leGNlcHRpb25fID0gbWFrZV9zY29wZWRfcmVmcHRyKAogICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxkb206OkRPTUV4Y2VwdGlvbio+KGV4Y2VwdGlvbi5nZXQoKSkpOwogICB9Ci0gIHZvaWQgU2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6TWVzc2FnZVR5cGUgLyptZXNzYWdlX3R5cGUqLywgLi4uKSBPVkVSUklERSB7CisgIHZvaWQgU2V0U2ltcGxlRXhjZXB0aW9uKE1lc3NhZ2VUeXBlVmFyIC8qbWVzc2FnZV90eXBlKi8sIC4uLikgT1ZFUlJJREUgewogICAgIC8vIG5vLW9wCiAgIH0KICAgZG9tOjpET01FeGNlcHRpb246OkV4Y2VwdGlvbkNvZGUgR2V0RXhjZXB0aW9uQ29kZSgpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbmRpdGlvbl9ydWxlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29uZGl0aW9uX3J1bGUuY2MKaW5kZXggNTViMjA2OC4uODViYWE3MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29uZGl0aW9uX3J1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29uZGl0aW9uX3J1bGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19jb25kaXRpb25fcnVsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb25kaXRpb25fcnVsZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29uZGl0aW9uX3J1bGUuaAppbmRleCBjOGY1MGE3Li5lOWFjN2Y4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb25kaXRpb25fcnVsZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2NvbmRpdGlvbl9ydWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfQ09ORElUSU9OX1JVTEVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19DT05ESVRJT05fUlVMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29uZGl0aW9uX3J1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfY29uZGl0aW9uX3J1bGUuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY4YWU4NWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19jb25kaXRpb25fcnVsZS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2NzczMtY29uZGl0aW9uYWwvI2Nzc2NvbmRpdGlvbnJ1bGUKKworaW50ZXJmYWNlIENTU0NvbmRpdGlvblJ1bGUgOiBDU1NHcm91cGluZ1J1bGUgeworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgY29uZGl0aW9uVGV4dDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJhdGlvbl9kYXRhLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJhdGlvbl9kYXRhLmgKaW5kZXggODdmNDkzZC4uY2RlYmYwZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyYXRpb25fZGF0YS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmF0aW9uX2RhdGEuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19ERUNMQVJBVElPTl9EQVRBX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DU1NfREVDTEFSQVRJT05fREFUQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyYXRpb25fdXRpbC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmF0aW9uX3V0aWwuY2MKaW5kZXggNWE2ODRhYi4uMTUzYTIyNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyYXRpb25fdXRpbC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJhdGlvbl91dGlsLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfZGVjbGFyYXRpb25fdXRpbC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJhdGlvbl91dGlsLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJhdGlvbl91dGlsLmgKaW5kZXggMjNiNmI2Yy4uZTBhYjBhYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyYXRpb25fdXRpbC5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmF0aW9uX3V0aWwuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19ERUNMQVJBVElPTl9VVElMX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DU1NfREVDTEFSQVRJT05fVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RhdGEuY2MKaW5kZXggODBhMDVkZi4uODYwZDgwMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kYXRhLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kYXRhLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kYXRhLmgKaW5kZXggYjA0YWJhMy4uMGFjMTljNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RhdGEuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19ERUNMQVJFRF9TVFlMRV9EQVRBX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DU1NfREVDTEFSRURfU1RZTEVfREFUQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YV90ZXN0LmNjCmluZGV4IDVlYjRiYmMuLjhlZjcyM2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RhdGFfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kYXRhX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kYXRhLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RlY2xhcmF0aW9uLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGVjbGFyYXRpb24uY2MKaW5kZXggMmU5YjA0Ni4uYTcwNGZkYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGVjbGFyYXRpb24uY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGVjbGFyYXRpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kZWNsYXJhdGlvbi5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kZWNsYXJhdGlvbi5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGVjbGFyYXRpb24uaAppbmRleCA5NDY2ZGY5Li44NWNiMWY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kZWNsYXJhdGlvbi5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RlY2xhcmF0aW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfREVDTEFSRURfU1RZTEVfREVDTEFSQVRJT05fSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19ERUNMQVJFRF9TVFlMRV9ERUNMQVJBVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGVjbGFyYXRpb25fdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2RlY2xhcmVkX3N0eWxlX2RlY2xhcmF0aW9uX3Rlc3QuY2MKaW5kZXggMTdiZTVlZC4uZTFhYTBhYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGVjbGFyYXRpb25fdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19kZWNsYXJlZF9zdHlsZV9kZWNsYXJhdGlvbl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGF0YS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfZGVjbGFyZWRfc3R5bGVfZGVjbGFyYXRpb24uaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9kZWNsYXJhdGlvbl9kYXRhLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX2RlY2xhcmF0aW9uX2RhdGEuY2MKaW5kZXggNWJmYjU2MC4uNjJlZDdhYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX2RlY2xhcmF0aW9uX2RhdGEuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX2RlY2xhcmF0aW9uX2RhdGEuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfZGVjbGFyYXRpb25fZGF0YS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfZGVjbGFyYXRpb25fZGF0YS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX2RlY2xhcmF0aW9uX2RhdGEuaAppbmRleCAyMjg5NWMxLi4wMTgwMTk1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfZGVjbGFyYXRpb25fZGF0YS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9kZWNsYXJhdGlvbl9kYXRhLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfRk9OVF9GQUNFX0RFQ0xBUkFUSU9OX0RBVEFfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19GT05UX0ZBQ0VfREVDTEFSQVRJT05fREFUQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX2RlY2xhcmF0aW9uX2RhdGFfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9kZWNsYXJhdGlvbl9kYXRhX3Rlc3QuY2MKaW5kZXggYWUyMzAzNy4uNzc4NjJiZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX2RlY2xhcmF0aW9uX2RhdGFfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfZGVjbGFyYXRpb25fZGF0YV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX2RlY2xhcmF0aW9uX2RhdGEuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX3J1bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZS5jYwppbmRleCA3NzE5ODU2Li4zZTk4YzExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9ydWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9ydWxlLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZS5oCmluZGV4IDIxMzAzY2YuLjg1YmZhODggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9ydWxlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX3J1bGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19GT05UX0ZBQ0VfUlVMRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX0ZPTlRfRkFDRV9SVUxFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZS5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWIzYmY4ZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZS5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2NzczMtZm9udHMvI29tLWZvbnRmYWNlCisKK2ludGVyZmFjZSBDU1NGb250RmFjZVJ1bGUgOiBDU1NSdWxlIHsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGZhbWlseTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNyYzsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHN0eWxlOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgd2VpZ2h0OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgdW5pY29kZVJhbmdlOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9ydWxlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19mb250X2ZhY2VfcnVsZV90ZXN0LmNjCmluZGV4IGQwODBlOTkuLjhlZTk1NmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9ydWxlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZm9udF9mYWNlX3J1bGVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2ZvbnRfZmFjZV9ydWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2dyb3VwaW5nX3J1bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ncm91cGluZ19ydWxlLmNjCmluZGV4IGZhZDM5ZmYuLmJiYjQ1OWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2dyb3VwaW5nX3J1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZ3JvdXBpbmdfcnVsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2dyb3VwaW5nX3J1bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZ3JvdXBpbmdfcnVsZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZ3JvdXBpbmdfcnVsZS5oCmluZGV4IGZlMjVmZDkuLmIwMWQwMWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2dyb3VwaW5nX3J1bGUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ncm91cGluZ19ydWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfR1JPVVBJTkdfUlVMRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX0dST1VQSU5HX1JVTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2dyb3VwaW5nX3J1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZ3JvdXBpbmdfcnVsZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzkwYmRlNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2dyb3VwaW5nX3J1bGUuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLyNjc3Nncm91cGluZ3J1bGUKKworaW50ZXJmYWNlIENTU0dyb3VwaW5nUnVsZSA6IENTU1J1bGUgeworICByZWFkb25seSBhdHRyaWJ1dGUgQ1NTUnVsZUxpc3QgY3NzUnVsZXM7CisgIHVuc2lnbmVkIGxvbmcgaW5zZXJ0UnVsZShET01TdHJpbmcgcnVsZSwgdW5zaWduZWQgbG9uZyBpbmRleCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZ3JvdXBpbmdfcnVsZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfZ3JvdXBpbmdfcnVsZV90ZXN0LmNjCmluZGV4IDIxNTJkMzcuLjY5OTUyYmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2dyb3VwaW5nX3J1bGVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ncm91cGluZ19ydWxlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19ncm91cGluZ19ydWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lX3J1bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZV9ydWxlLmNjCmluZGV4IDIyOTI0Y2MuLmY0M2MyZjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lX3J1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfa2V5ZnJhbWVfcnVsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lX3J1bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfa2V5ZnJhbWVfcnVsZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfa2V5ZnJhbWVfcnVsZS5oCmluZGV4IDQ4MzBkYjYuLjg0ZWVjZDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lX3J1bGUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZV9ydWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfS0VZRlJBTUVfUlVMRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX0tFWUZSQU1FX1JVTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lX3J1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfa2V5ZnJhbWVfcnVsZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2EzN2FhOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lX3J1bGUuaWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzczMtYW5pbWF0aW9ucy0yMDEzMDIxOS8jQ1NTS2V5ZnJhbWVSdWxlLWludGVyZmFjZQorCitpbnRlcmZhY2UgQ1NTS2V5ZnJhbWVSdWxlIDogQ1NTUnVsZSB7CisgIC8vIFRPRE86IGtleVRleHQgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlYWQtb25seS4gIFJlbW92ZSB0aGlzIG1vZGlmaWVyIGFuZAorICAvLyAgICAgICBpbXBsZW1lbnQgYSBzZXR0ZXIgZm9yIGtleVRleHQuCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2V5VGV4dDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIENTU1N0eWxlRGVjbGFyYXRpb24gc3R5bGU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfa2V5ZnJhbWVzX3J1bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZXNfcnVsZS5jYwppbmRleCBhNWU0MzdiLi4yYWJlZTRjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZXNfcnVsZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZXNfcnVsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lc19ydWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lc19ydWxlLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZXNfcnVsZS5oCmluZGV4IGMyOGMyY2UuLjRmYzhmM2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lc19ydWxlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfa2V5ZnJhbWVzX3J1bGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19LRVlGUkFNRVNfUlVMRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX0tFWUZSQU1FU19SVUxFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZXNfcnVsZS5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19rZXlmcmFtZXNfcnVsZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWRlMDNmOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX2tleWZyYW1lc19ydWxlLmlkbApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3MzLWFuaW1hdGlvbnMtMjAxMzAyMTkvI0NTU0tleWZyYW1lc1J1bGUtaW50ZXJmYWNlCisKK2ludGVyZmFjZSBDU1NLZXlmcmFtZXNSdWxlIDogQ1NTUnVsZSB7CisgIC8vIFRPRE86IG5hbWUgaXMgbm90IHN1cHBvc2VkIHRvIGJlIHJlYWQtb25seS4gIFJlbW92ZSB0aGlzIG1vZGlmaWVyIGFuZAorICAvLyAgICAgICBpbXBsZW1lbnQgYSBzZXR0ZXIgZm9yIG5hbWUuCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbmFtZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIENTU1J1bGVMaXN0IGNzc1J1bGVzOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX21lZGlhX3J1bGUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19tZWRpYV9ydWxlLmNjCmluZGV4IGE0Njc4NjkuLmMyOTAyOGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX21lZGlhX3J1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfbWVkaWFfcnVsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX21lZGlhX3J1bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfbWVkaWFfcnVsZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfbWVkaWFfcnVsZS5oCmluZGV4IDExY2VhOWMuLjdiODgxYTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX21lZGlhX3J1bGUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19tZWRpYV9ydWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfTUVESUFfUlVMRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX01FRElBX1JVTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX21lZGlhX3J1bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfbWVkaWFfcnVsZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTdjMTRhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX21lZGlhX3J1bGUuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9jc3MzLWNvbmRpdGlvbmFsLyNjc3NtZWRpYXJ1bGUKKworaW50ZXJmYWNlIENTU01lZGlhUnVsZSA6IENTU0NvbmRpdGlvblJ1bGUgeworICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIE1lZGlhTGlzdCBtZWRpYTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19wYXJzZXIuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3BhcnNlci5oCmluZGV4IDRhODFiNzMuLjMyMjcyY2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3BhcnNlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX1BBUlNFUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcHJvcGVydHlfZGVmaW5pdGlvbnNfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3Byb3BlcnR5X2RlZmluaXRpb25zX3Rlc3QuY2MKaW5kZXggNGRkNzRjOS4uMmE2MzJiYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcHJvcGVydHlfZGVmaW5pdGlvbnNfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19wcm9wZXJ0eV9kZWZpbml0aW9uc190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV9kZWZpbml0aW9ucy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZS5jYwppbmRleCAzNWYyYWViLi4zMDU1YjY5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19ydWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGUuaAppbmRleCA1MTMzMGM0Li4wNTNiOTU2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX1JVTEVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19SVUxFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlLmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGUuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU3YTJjNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlLmlkbApAQCAtMCwwICsxLDM2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLWNzc3J1bGUtaW50ZXJmYWNlCisKK2ludGVyZmFjZSBDU1NSdWxlIHsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1RZTEVfUlVMRSA9IDE7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IENIQVJTRVRfUlVMRSA9IDI7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IElNUE9SVF9SVUxFID0gMzsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgTUVESUFfUlVMRSA9IDQ7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEZPTlRfRkFDRV9SVUxFID0gNTsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgUEFHRV9SVUxFID0gNjsKKworICAvLyBLRVlGUkFNRVNfUlVMRSBhbmQgS0VZRlJBTUVfUlVMRSBhcmUgc3BlY2lmaWVkIGluIENTUyBBbmltYXRpb25zOgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzczMtYW5pbWF0aW9ucy0yMDEzMDIxOS8jQ1NTUnVsZS1pbnRlcmZhY2UKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgS0VZRlJBTUVTX1JVTEUgPSA3OworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBLRVlGUkFNRV9SVUxFID0gODsKKworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNQVJHSU5fUlVMRSA9IDk7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5BTUVTUEFDRV9SVUxFID0gMTA7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCB0eXBlOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBjc3NUZXh0OworICByZWFkb25seSBhdHRyaWJ1dGUgQ1NTUnVsZT8gcGFyZW50UnVsZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIENTU1N0eWxlU2hlZXQ/IHBhcmVudFN0eWxlU2hlZXQ7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZV9saXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZV9saXN0LmNjCmluZGV4IDQ3NjliYWYuLjQzMTk0M2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfbGlzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZV9saXN0LmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3QuaAppbmRleCA4MDI4NWIxLi4xZmIyMjIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3QuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19SVUxFX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19SVUxFX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfbGlzdC5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM3MjViNzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3QuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLTIwMTMxMjA1LyN0aGUtY3NzcnVsZWxpc3QtaW50ZXJmYWNlCisKK2ludGVyZmFjZSBDU1NSdWxlTGlzdCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIENTU1J1bGU/IGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZV9saXN0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3RfdGVzdC5jYwppbmRleCAwZGY0MDU3Li42MjFmZmFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3RfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX2xpc3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3J1bGVfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX3N0eWxlX2RlY2xhcmF0aW9uLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZV9zdHlsZV9kZWNsYXJhdGlvbi5jYwppbmRleCA2NjgzM2ZjLi5jNGM0MGY2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX3N0eWxlX2RlY2xhcmF0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfc3R5bGVfZGVjbGFyYXRpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19ydWxlX3N0eWxlX2RlY2xhcmF0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfc3R5bGVfZGVjbGFyYXRpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfc3R5bGVfZGVjbGFyYXRpb24uaAppbmRleCAzYzI2ZDg4Li44ZGE2ZTY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX3N0eWxlX2RlY2xhcmF0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZV9zdHlsZV9kZWNsYXJhdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX1JVTEVfU1RZTEVfREVDTEFSQVRJT05fSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19SVUxFX1NUWUxFX0RFQ0xBUkFUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX3Zpc2l0b3IuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfdmlzaXRvci5oCmluZGV4IGVkZTMyZWEuLjllZGU1YjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfdmlzaXRvci5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3J1bGVfdmlzaXRvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX1JVTEVfVklTSVRPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fQ1NTX1JVTEVfVklTSVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfcnVsZV92aXNpdG9yX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX3Zpc2l0b3JfdGVzdC5jYwppbmRleCA1NWU3N2I4Li4zNmMxMDRhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX3Zpc2l0b3JfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19ydWxlX3Zpc2l0b3JfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3J1bGVfdmlzaXRvci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9kZWNsYXJhdGlvbi5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX2RlY2xhcmF0aW9uLmNjCmluZGV4IGJjOWFiOWYuLjBhM2U5OTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX2RlY2xhcmF0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX2RlY2xhcmF0aW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfZGVjbGFyYXRpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfZGVjbGFyYXRpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX2RlY2xhcmF0aW9uLmgKaW5kZXggZGEyZjYzMS4uZDZkMmI2MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfZGVjbGFyYXRpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9kZWNsYXJhdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX1NUWUxFX0RFQ0xBUkFUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DU1NfU1RZTEVfREVDTEFSQVRJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX2RlY2xhcmF0aW9uLmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX2RlY2xhcmF0aW9uLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40YTc0NGE3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfZGVjbGFyYXRpb24uaWRsCkBAIC0wLDAgKzEsMTIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLWNzc3N0eWxlZGVjbGFyYXRpb24taW50ZXJmYWNlCisKK2ludGVyZmFjZSBDU1NTdHlsZURlY2xhcmF0aW9uIHsKKyAgLy8gVE9ETzogUmVwbGFjZSB0aGlzIGxpc3Qgd2l0aCBfX2NhbWVsX2Nhc2VkX2F0dHJpYnV0ZS4KKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBhbmltYXRpb25EZWxheTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uRGlyZWN0aW9uOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBhbmltYXRpb25EdXJhdGlvbjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uRmlsbE1vZGU7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGFuaW1hdGlvbkl0ZXJhdGlvbkNvdW50OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBhbmltYXRpb25OYW1lOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBhbmltYXRpb25UaW1pbmdGdW5jdGlvbjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYmFja2dyb3VuZDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYmFja2dyb3VuZENvbG9yOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBiYWNrZ3JvdW5kSW1hZ2U7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJhY2tncm91bmRQb3NpdGlvbjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYmFja2dyb3VuZFJlcGVhdDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYmFja2dyb3VuZFNpemU7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlcjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyQm90dG9tOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJCb3R0b21Db2xvcjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyQm90dG9tU3R5bGU7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlckJvdHRvbVdpZHRoOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJDb2xvcjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyTGVmdDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyTGVmdENvbG9yOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJMZWZ0U3R5bGU7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlckxlZnRXaWR0aDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyUmFkaXVzOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJSaWdodDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyUmlnaHRDb2xvcjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyUmlnaHRTdHlsZTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyUmlnaHRXaWR0aDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyU3R5bGU7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclRvcDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyVG9wQ29sb3I7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvcmRlclRvcFN0eWxlOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBib3JkZXJUb3BXaWR0aDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9yZGVyV2lkdGg7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJvdHRvbTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgYm94U2hhZG93OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBjb2xvcjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgY29udGVudDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgZGlzcGxheTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgZmlsdGVyOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBmb250OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBmb250RmFtaWx5OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBmb250U2l6ZTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgZm9udFN0eWxlOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBmb250V2VpZ2h0OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBoZWlnaHQ7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGxlZnQ7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGxpbmVIZWlnaHQ7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1hcmdpbjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgbWFyZ2luQm90dG9tOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBtYXJnaW5MZWZ0OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBtYXJnaW5SaWdodDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgbWFyZ2luVG9wOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBtYXhIZWlnaHQ7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1heFdpZHRoOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBtaW5IZWlnaHQ7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1pbldpZHRoOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBvcGFjaXR5OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBvdmVyZmxvdzsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgb3ZlcmZsb3dXcmFwOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBwYWRkaW5nOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBwYWRkaW5nQm90dG9tOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBwYWRkaW5nTGVmdDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgcGFkZGluZ1JpZ2h0OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBwYWRkaW5nVG9wOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBwb3NpdGlvbjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgcmlnaHQ7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRleHRBbGlnbjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdGV4dERlY29yYXRpb247CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRleHREZWNvcmF0aW9uTGluZTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdGV4dEluZGVudDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdGV4dE92ZXJmbG93OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0ZXh0U2hhZG93OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0ZXh0VHJhbnNmb3JtOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0b3A7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRyYW5zZm9ybTsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdHJhbnNmb3JtT3JpZ2luOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0cmFuc2l0aW9uOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0cmFuc2l0aW9uRGVsYXk7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRyYW5zaXRpb25EdXJhdGlvbjsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgdHJhbnNpdGlvblByb3BlcnR5OworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB0cmFuc2l0aW9uVGltaW5nRnVuY3Rpb247CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHZlcnRpY2FsQWxpZ247CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHZpc2liaWxpdHk7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHdoaXRlU3BhY2U7CisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHdpZHRoOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyB3b3JkV3JhcDsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nLCBSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBET01TdHJpbmcgekluZGV4OworCisgIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGNzc1RleHQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIERPTVN0cmluZz8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgRE9NU3RyaW5nIGdldFByb3BlcnR5VmFsdWUoRE9NU3RyaW5nIHByb3BlcnR5KTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRQcm9wZXJ0eSgKKyAgICAgIERPTVN0cmluZyBwcm9wZXJ0eSwgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBET01TdHJpbmcgdmFsdWUsCisgICAgICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIG9wdGlvbmFsIERPTVN0cmluZyBwcmlvcml0eSk7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0UHJvcGVydHlWYWx1ZSgKKyAgICAgIERPTVN0cmluZyBwcm9wZXJ0eSwgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBET01TdHJpbmcgdmFsdWUpOworICBbUmFpc2VzRXhjZXB0aW9uXSBET01TdHJpbmcgcmVtb3ZlUHJvcGVydHkoRE9NU3RyaW5nIHByb3BlcnR5KTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIENTU1J1bGU/IHBhcmVudFJ1bGU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuY2MKaW5kZXggZjExYzQ4NC4uMmYzNjA4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9ydWxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9ydWxlLmggYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9ydWxlLmgKaW5kZXggZTc3YjQ0Yy4uYmRmNjM2ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0NTU19TVFlMRV9SVUxFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DU1NfU1RZTEVfUlVMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9ydWxlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjAwYTkwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfcnVsZS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI3RoZS1jc3NzdHlsZXJ1bGUtaW50ZXJmYWNlCisKK2ludGVyZmFjZSBDU1NTdHlsZVJ1bGUgOiBDU1NSdWxlIHsKKyAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBDU1NTdHlsZURlY2xhcmF0aW9uIHN0eWxlOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3NoZWV0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXQuY2MKaW5kZXggMzE2NzdlMC4uNzZhYzhlZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXQuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9zaGVldC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9zaGVldC5oIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXQuaAppbmRleCAxZmExOTkzLi40Zjg0M2ZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9zaGVldC5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3NoZWV0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9DU1NfU1RZTEVfU0hFRVRfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19TVFlMRV9TSEVFVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXQuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWQ4ZDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9zaGVldC5pZGwKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI3RoZS1jc3NzdHlsZXNoZWV0LWludGVyZmFjZQorCitpbnRlcmZhY2UgQ1NTU3R5bGVTaGVldCA6IFN0eWxlU2hlZXQgeworICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIENTU1J1bGVMaXN0IGNzc1J1bGVzOworICB1bnNpZ25lZCBsb25nIGluc2VydFJ1bGUoRE9NU3RyaW5nIHJ1bGUsIHVuc2lnbmVkIGxvbmcgaW5kZXgpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3NoZWV0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc19zdHlsZV9zaGVldF90ZXN0LmNjCmluZGV4IDk3YmViZjUuLmNiNjFkMDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3NoZWV0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3Nfc3R5bGVfc2hlZXRfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3J1bGVfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc190cmFuc2l0aW9uLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfdHJhbnNpdGlvbi5jYwppbmRleCA0YWFhYjMxLi4wZWE4YThiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc190cmFuc2l0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc190cmFuc2l0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb24uaAppbmRleCBkMzlmNGI1Li40ZWViNmYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2Nzc190cmFuc2l0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfdHJhbnNpdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX1RSQU5TSVRJT05fSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0NTU19UUkFOU0lUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Nzc190cmFuc2l0aW9uX3NldC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb25fc2V0LmNjCmluZGV4IDZlZGVhZTYuLjNhZDNjODMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb25fc2V0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb25fc2V0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9jc3NfdHJhbnNpdGlvbl9zZXQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfdHJhbnNpdGlvbl9zZXQuaCBiL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb25fc2V0LmgKaW5kZXggOTBiNTgzZi4uZmE1MWU5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NfdHJhbnNpdGlvbl9zZXQuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc190cmFuc2l0aW9uX3NldC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fQ1NTX1RSQU5TSVRJT05fU0VUX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9DU1NfVFJBTlNJVElPTl9TRVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb25fc2V0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc190cmFuc2l0aW9uX3NldF90ZXN0LmNjCmluZGV4IDVjNjc5NDEuLjhkM2Y1MzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3NzX3RyYW5zaXRpb25fc2V0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NfdHJhbnNpdGlvbl9zZXRfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL3RpbWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX2NvbXB1dGVkX3N0eWxlX2RhdGEuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3Nzb20uZ3lwIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbS5neXAKaW5kZXggOTZjZDc0ZC4uZWNiOGRhZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbS5neXAKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbS5neXAKQEAgLTEzNCw2ICsxMzQsOCBAQAogICAgICAgICAnbGlzdF92YWx1ZS5oJywKICAgICAgICAgJ2xvY2FsX3NyY192YWx1ZS5jYycsCiAgICAgICAgICdsb2NhbF9zcmNfdmFsdWUuaCcsCisgICAgICAgICdtYXBfdG9fbWVzaF9mdW5jdGlvbi5jYycsCisgICAgICAgICdtYXBfdG9fbWVzaF9mdW5jdGlvbi5oJywKICAgICAgICAgJ21hdHJpeF9mdW5jdGlvbi5jYycsCiAgICAgICAgICdtYXRyaXhfZnVuY3Rpb24uaCcsCiAgICAgICAgICdtZWRpYV9mZWF0dXJlLmNjJywKQEAgLTE1MCw4ICsxNTIsNiBAQAogICAgICAgICAnbWVkaWFfcXVlcnkuaCcsCiAgICAgICAgICdtZWRpYV90eXBlX25hbWVzLmNjJywKICAgICAgICAgJ21lZGlhX3R5cGVfbmFtZXMuaCcsCi0gICAgICAgICdtdG1fZnVuY3Rpb24uY2MnLAotICAgICAgICAnbXRtX2Z1bmN0aW9uLmgnLAogICAgICAgICAnbXV0YXRpb25fb2JzZXJ2ZXIuaCcsCiAgICAgICAgICduZXh0X3NpYmxpbmdfY29tYmluYXRvci5jYycsCiAgICAgICAgICduZXh0X3NpYmxpbmdfY29tYmluYXRvci5oJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vY3Nzb21fdGVzdC5neXAgYi9zcmMvY29iYWx0L2Nzc29tL2Nzc29tX3Rlc3QuZ3lwCmluZGV4IDNjNTdiNjIuLjg0NzhkZWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vY3Nzb21fdGVzdC5neXAKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9jc3NvbV90ZXN0Lmd5cApAQCAtNTQsOSArNTQsOSBAQAogICAgICAgICAndHJhbnNmb3JtX2Z1bmN0aW9uX3Zpc2l0b3JfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Nzc19wYXJzZXIvY3NzX3BhcnNlci5neXA6Y3NzX3BhcnNlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvY3Nzb20vY3Nzb20uZ3lwOmNzc29tJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgIF0sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2Rlc2NlbmRhbnRfY29tYmluYXRvci5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vZGVzY2VuZGFudF9jb21iaW5hdG9yLmNjCmluZGV4IGQ1NGJiOTkuLjllODYyMjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vZGVzY2VuZGFudF9jb21iaW5hdG9yLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vZGVzY2VuZGFudF9jb21iaW5hdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9kZXNjZW5kYW50X2NvbWJpbmF0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9kZXNjZW5kYW50X2NvbWJpbmF0b3IuaCBiL3NyYy9jb2JhbHQvY3Nzb20vZGVzY2VuZGFudF9jb21iaW5hdG9yLmgKaW5kZXggNzNhNjdkYS4uN2M4YWU5YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9kZXNjZW5kYW50X2NvbWJpbmF0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2Rlc2NlbmRhbnRfY29tYmluYXRvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fREVTQ0VOREFOVF9DT01CSU5BVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9ERVNDRU5EQU5UX0NPTUJJTkFUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vZW1wdHlfcHNldWRvX2NsYXNzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9lbXB0eV9wc2V1ZG9fY2xhc3MuY2MKaW5kZXggZWMyMTg3Zi4uZGE2MzExMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9lbXB0eV9wc2V1ZG9fY2xhc3MuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9lbXB0eV9wc2V1ZG9fY2xhc3MuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2VtcHR5X3BzZXVkb19jbGFzcy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2VtcHR5X3BzZXVkb19jbGFzcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9lbXB0eV9wc2V1ZG9fY2xhc3MuaAppbmRleCAzYmM3N2IyLi5lNzI3ODQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2VtcHR5X3BzZXVkb19jbGFzcy5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vZW1wdHlfcHNldWRvX2NsYXNzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9FTVBUWV9QU0VVRE9fQ0xBU1NfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0VNUFRZX1BTRVVET19DTEFTU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uLmgKaW5kZXggYzMwNTNjMC4uNjgyMmNmNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fRklMVEVSX0ZVTkNUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9GSUxURVJfRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmNjCmluZGV4IDQ0MzgzMmIuLjI3YWM4YjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb25fbGlzdF92YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb25fbGlzdF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb25fbGlzdF92YWx1ZS5oCmluZGV4IDg2ZmFmZWYuLjUyOTY3MGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9GSUxURVJfRlVOQ1RJT05fTElTVF9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fRklMVEVSX0ZVTkNUSU9OX0xJU1RfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vZm9jdXNfcHNldWRvX2NsYXNzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9mb2N1c19wc2V1ZG9fY2xhc3MuY2MKaW5kZXggMTE5Zjc2Mi4uODVhODg4MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9mb2N1c19wc2V1ZG9fY2xhc3MuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9mb2N1c19wc2V1ZG9fY2xhc3MuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZvY3VzX3BzZXVkb19jbGFzcy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2ZvY3VzX3BzZXVkb19jbGFzcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9mb2N1c19wc2V1ZG9fY2xhc3MuaAppbmRleCBiZjBhYTQ5Li43MDI2Yjc2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ZvY3VzX3BzZXVkb19jbGFzcy5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vZm9jdXNfcHNldWRvX2NsYXNzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9GT0NVU19QU0VVRE9fQ0xBU1NfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0ZPQ1VTX1BTRVVET19DTEFTU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9mb2xsb3dpbmdfc2libGluZ19jb21iaW5hdG9yLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9mb2xsb3dpbmdfc2libGluZ19jb21iaW5hdG9yLmNjCmluZGV4IDkxZTNiODguLjFlZGZiZWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vZm9sbG93aW5nX3NpYmxpbmdfY29tYmluYXRvci5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2ZvbGxvd2luZ19zaWJsaW5nX2NvbWJpbmF0b3IuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZvbGxvd2luZ19zaWJsaW5nX2NvbWJpbmF0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9mb2xsb3dpbmdfc2libGluZ19jb21iaW5hdG9yLmggYi9zcmMvY29iYWx0L2Nzc29tL2ZvbGxvd2luZ19zaWJsaW5nX2NvbWJpbmF0b3IuaAppbmRleCA2MGM5ZmFlLi40ZWExY2EzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ZvbGxvd2luZ19zaWJsaW5nX2NvbWJpbmF0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2ZvbGxvd2luZ19zaWJsaW5nX2NvbWJpbmF0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0ZPTExPV0lOR19TSUJMSU5HX0NPTUJJTkFUT1JfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0ZPTExPV0lOR19TSUJMSU5HX0NPTUJJTkFUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vZm9udF9zdHlsZV92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vZm9udF9zdHlsZV92YWx1ZS5jYwppbmRleCBjODEyNDY4Li5jODAxNTg2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ZvbnRfc3R5bGVfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9mb250X3N0eWxlX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9mb250X3N0eWxlX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vZm9udF9zdHlsZV92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9mb250X3N0eWxlX3ZhbHVlLmgKaW5kZXggNmExZGZiNy4uN2U5ZTcwYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9mb250X3N0eWxlX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9mb250X3N0eWxlX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9GT05UX1NUWUxFX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9GT05UX1NUWUxFX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2ZvbnRfd2VpZ2h0X3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9mb250X3dlaWdodF92YWx1ZS5jYwppbmRleCBkOTNkMzA2Li45ZGZkZjA5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ZvbnRfd2VpZ2h0X3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vZm9udF93ZWlnaHRfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZvbnRfd2VpZ2h0X3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vZm9udF93ZWlnaHRfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vZm9udF93ZWlnaHRfdmFsdWUuaAppbmRleCAwMjY4NTAyLi5mZGQyOGE0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ZvbnRfd2VpZ2h0X3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9mb250X3dlaWdodF92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fRk9OVF9XRUlHSFRfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0ZPTlRfV0VJR0hUX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2hvdmVyX3BzZXVkb19jbGFzcy5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vaG92ZXJfcHNldWRvX2NsYXNzLmNjCmluZGV4IGI0NjM5MDIuLjgzZjljMDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vaG92ZXJfcHNldWRvX2NsYXNzLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vaG92ZXJfcHNldWRvX2NsYXNzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9ob3Zlcl9wc2V1ZG9fY2xhc3MuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9ob3Zlcl9wc2V1ZG9fY2xhc3MuaCBiL3NyYy9jb2JhbHQvY3Nzb20vaG92ZXJfcHNldWRvX2NsYXNzLmgKaW5kZXggYjBmYWNlYy4uZTNiMDBlNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9ob3Zlcl9wc2V1ZG9fY2xhc3MuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2hvdmVyX3BzZXVkb19jbGFzcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fSE9WRVJfUFNFVURPX0NMQVNTX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9IT1ZFUl9QU0VVRE9fQ0xBU1NfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vaWRfc2VsZWN0b3IuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2lkX3NlbGVjdG9yLmNjCmluZGV4IDVmYzAwMmEuLjIxNjkwZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vaWRfc2VsZWN0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9pZF9zZWxlY3Rvci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vaWRfc2VsZWN0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9pZF9zZWxlY3Rvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9pZF9zZWxlY3Rvci5oCmluZGV4IGExNDVmYWUuLjhhZWVhNjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vaWRfc2VsZWN0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2lkX3NlbGVjdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9JRF9TRUxFQ1RPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fSURfU0VMRUNUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vaW50ZWdlcl92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vaW50ZWdlcl92YWx1ZS5jYwppbmRleCBhZTU3NmI0Li5jMjZiMzlkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ludGVnZXJfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vaW50ZWdlcl92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmgKaW5kZXggMDc3NjJmNi4uMmRlMDNmMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9pbnRlZ2VyX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9JTlRFR0VSX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9JTlRFR0VSX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2ludGVycG9sYXRlX3Byb3BlcnR5X3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9pbnRlcnBvbGF0ZV9wcm9wZXJ0eV92YWx1ZS5jYwppbmRleCBkOWJlYThiLi5iYTM5NzljIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ludGVycG9sYXRlX3Byb3BlcnR5X3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vaW50ZXJwb2xhdGVfcHJvcGVydHlfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ludGVycG9sYXRlX3Byb3BlcnR5X3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vaW50ZXJwb2xhdGVfcHJvcGVydHlfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vaW50ZXJwb2xhdGVfcHJvcGVydHlfdmFsdWUuaAppbmRleCBlY2Y4OTJkLi4xMmVlOTY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2ludGVycG9sYXRlX3Byb3BlcnR5X3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9pbnRlcnBvbGF0ZV9wcm9wZXJ0eV92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fSU5URVJQT0xBVEVfUFJPUEVSVFlfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0lOVEVSUE9MQVRFX1BST1BFUlRZX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2ludGVycG9sYXRlX3Byb3BlcnR5X3ZhbHVlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2ludGVycG9sYXRlX3Byb3BlcnR5X3ZhbHVlX3Rlc3QuY2MKaW5kZXggMTBiNzg5MC4uNzc2ODc3OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9pbnRlcnBvbGF0ZV9wcm9wZXJ0eV92YWx1ZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vaW50ZXJwb2xhdGVfcHJvcGVydHlfdmFsdWVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxjbWF0aD4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmNjCmluZGV4IGRjZThjZDAuLjZlZjg3M2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF9uYW1lcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfbmFtZXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2tleXdvcmRfbmFtZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX25hbWVzLmggYi9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfbmFtZXMuaAppbmRleCA3Y2Q1ODUyLi5hMDk1NmY2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfbmFtZXMuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfbmFtZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0tFWVdPUkRfTkFNRVNfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0tFWVdPUkRfTkFNRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5jYwppbmRleCBhYzJjMjFlLi4zMDJiNjcxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgKaW5kZXggMzU2NTliNi4uNjc4OWFhZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9LRVlXT1JEX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9LRVlXT1JEX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZV90ZXN0LmNjCmluZGV4IGExYjlmNDIuLjFmNzNhMzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9sZW5ndGhfdmFsdWUuY2MKaW5kZXggZDM5MTcyOC4uYzNkNDllNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9sZW5ndGhfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9sZW5ndGhfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2xlbmd0aF92YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2xlbmd0aF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9sZW5ndGhfdmFsdWUuaAppbmRleCBkZjkxM2NhLi4zNjRjNzFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2xlbmd0aF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9MRU5HVEhfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX0xFTkdUSF9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9saW5lYXJfZ3JhZGllbnRfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5jYwppbmRleCAxOWZkMWYwLi5lMTE3MmU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGluZWFyX2dyYWRpZW50X3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbGluZWFyX2dyYWRpZW50X3ZhbHVlLmggYi9zcmMvY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5oCmluZGV4IGQ3YjI1YzcuLmQwYjJmNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbGluZWFyX2dyYWRpZW50X3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9saW5lYXJfZ3JhZGllbnRfdmFsdWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX0xJTkVBUl9HUkFESUVOVF9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fTElORUFSX0dSQURJRU5UX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2xpbmtfc3R5bGUuaWRsIGIvc3JjL2NvYmFsdC9jc3NvbS9saW5rX3N0eWxlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NzgzNDQ2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9saW5rX3N0eWxlLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLWxpbmtzdHlsZS1pbnRlcmZhY2UKKworW05vSW50ZXJmYWNlT2JqZWN0XQoraW50ZXJmYWNlIExpbmtTdHlsZSB7CisgcmVhZG9ubHkgYXR0cmlidXRlIFN0eWxlU2hlZXQ/IHNoZWV0OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbGlzdF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9saXN0X3ZhbHVlLmgKaW5kZXggZGYwYTVhMC4uMGRmZjg2YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9saXN0X3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9saXN0X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9MSVNUX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9MSVNUX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL2xvY2FsX3NyY192YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vbG9jYWxfc3JjX3ZhbHVlLmNjCmluZGV4IDAwYjkwNWIuLjc2ODExMzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbG9jYWxfc3JjX3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbG9jYWxfc3JjX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9sb2NhbF9zcmNfdmFsdWUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9sb2NhbF9zcmNfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vbG9jYWxfc3JjX3ZhbHVlLmgKaW5kZXggMzQyYjgyNC4uMWY5NTI0MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9sb2NhbF9zcmNfdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL2xvY2FsX3NyY192YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fTE9DQUxfU1JDX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9MT0NBTF9TUkNfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbWFwX3RvX21lc2hfZnVuY3Rpb24uY2MgYi9zcmMvY29iYWx0L2Nzc29tL21hcF90b19tZXNoX2Z1bmN0aW9uLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMyN2Y4NjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21hcF90b19tZXNoX2Z1bmN0aW9uLmNjCkBAIC0wLDAgKzEsMTQ3IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21hcF90b19tZXNoX2Z1bmN0aW9uLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb25fbGlzdF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9rZXl3b3JkX3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3IuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgY3Nzb20geworCitzdGQ6OnN0cmluZyBNYXBUb01lc2hGdW5jdGlvbjo6VG9TdHJpbmcoKSBjb25zdCB7CisgIHN0ZDo6c3RyaW5nIHJlc3VsdCA9ICJtYXAtdG8tbWVzaCgiOworCisgIGlmIChtZXNoX3NwZWMoKS5tZXNoX3R5cGUoKSA9PSBrRXF1aXJlY3Rhbmd1bGFyKSB7CisgICAgcmVzdWx0LmFwcGVuZCgiZXF1aXJlY3Rhbmd1bGFyIik7CisgIH0gZWxzZSBpZiAobWVzaF9zcGVjKCkubWVzaF90eXBlKCkgPT0ga1VybHMpIHsKKyAgICByZXN1bHQuYXBwZW5kKG1lc2hfc3BlYygpLm1lc2hfdXJsKCktPlRvU3RyaW5nKCkpOworCisgICAgY29uc3QgUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXImIG1lc2hlcyA9CisgICAgICAgIG1lc2hfc3BlYygpLnJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMoKTsKKyAgICBmb3IgKHNpemVfdCBtZXNoX2luZGV4ID0gMDsgbWVzaF9pbmRleCA8IG1lc2hlcy5zaXplKCk7ICsrbWVzaF9pbmRleCkgeworICAgICAgcmVzdWx0LnB1c2hfYmFjaygnICcpOworICAgICAgcmVzdWx0LmFwcGVuZChiYXNlOjpJbnRUb1N0cmluZyhtZXNoZXNbbWVzaF9pbmRleF0tPndpZHRoX21hdGNoKCkpKTsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soJyAnKTsKKyAgICAgIHJlc3VsdC5hcHBlbmQoYmFzZTo6SW50VG9TdHJpbmcobWVzaGVzW21lc2hfaW5kZXhdLT5oZWlnaHRfbWF0Y2goKSkpOworICAgICAgcmVzdWx0LnB1c2hfYmFjaygnICcpOworICAgICAgcmVzdWx0LmFwcGVuZChtZXNoZXNbbWVzaF9pbmRleF0tPm1lc2hfdXJsKCktPlRvU3RyaW5nKCkpOworICAgIH0KKyAgfQorCisgIHJlc3VsdC5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIsICUuN2dyYWQiLCBob3Jpem9udGFsX2ZvdigpKSk7CisgIHJlc3VsdC5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIgJS43Z3JhZCwgIiwgdmVydGljYWxfZm92KCkpKTsKKworICByZXN1bHQuYXBwZW5kKCJtYXRyaXgzZCgiKTsKKyAgZm9yIChpbnQgY29sID0gMDsgY29sIDw9IDM7ICsrY29sKSB7CisgICAgZm9yIChpbnQgcm93ID0gMDsgcm93IDw9IDM7ICsrcm93KSB7CisgICAgICBpZiAoY29sID4gMCB8fCByb3cgPiAwKSB7CisgICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7CisgICAgICB9CisgICAgICByZXN1bHQuYXBwZW5kKGJhc2U6OlN0cmluZ1ByaW50ZigiJS43ZyIsIHRyYW5zZm9ybSgpW2NvbF1bcm93XSkpOworICAgIH0KKyAgfQorCisgIHJlc3VsdC5hcHBlbmQoIiksICIpOworICByZXN1bHQuYXBwZW5kKHN0ZXJlb19tb2RlKCktPlRvU3RyaW5nKCkpOworICByZXN1bHQuYXBwZW5kKCIpIik7CisKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworTWFwVG9NZXNoRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaDo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoKAorICAgIGludCB3aWR0aF9tYXRjaCwgaW50IGhlaWdodF9tYXRjaCwKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBtZXNoX3VybCkKKyAgICA6IHdpZHRoX21hdGNoXyh3aWR0aF9tYXRjaCksCisgICAgICBoZWlnaHRfbWF0Y2hfKGhlaWdodF9tYXRjaCksCisgICAgICBtZXNoX3VybF8obWVzaF91cmwpIHsKKyAgRENIRUNLKG1lc2hfdXJsXyk7Cit9CisKK2Jvb2wgTWFwVG9NZXNoRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaDo6b3BlcmF0b3I9PSgKKyAgICBjb25zdCBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoJiByaHMpIGNvbnN0IHsKKyAgcmV0dXJuIG1lc2hfdXJsKCktPkVxdWFscygqcmhzLm1lc2hfdXJsKCkpICYmCisgICAgICAgICB3aWR0aF9tYXRjaCgpID09IHJocy53aWR0aF9tYXRjaCgpICYmCisgICAgICAgICBoZWlnaHRfbWF0Y2goKSA9PSByaHMuaGVpZ2h0X21hdGNoKCk7Cit9CisKK2Jvb2wgTWFwVG9NZXNoRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaDo6b3BlcmF0b3IhPSgKKyAgICBjb25zdCBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoJiByaHMpIGNvbnN0IHsKKyAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKK30KKworY29uc3QgTWFwVG9NZXNoRnVuY3Rpb24qIE1hcFRvTWVzaEZ1bmN0aW9uOjpFeHRyYWN0RnJvbUZpbHRlckxpc3QoCisgICAgUHJvcGVydHlWYWx1ZSogZmlsdGVyX3ZhbHVlKSB7CisgIGlmIChmaWx0ZXJfdmFsdWUgJiYgZmlsdGVyX3ZhbHVlICE9IGNzc29tOjpLZXl3b3JkVmFsdWU6OkdldE5vbmUoKSkgeworICAgIGNvbnN0IGNzc29tOjpGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6QnVpbGRlciYgZmlsdGVyX2xpc3QgPQorICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxjc3NvbTo6RmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUqPigKKyAgICAgICAgICAgIGZpbHRlcl92YWx1ZSkKKyAgICAgICAgICAgIC0+dmFsdWUoKTsKKworICAgIGZvciAoc2l6ZV90IGxpc3RfaW5kZXggPSAwOyBsaXN0X2luZGV4IDwgZmlsdGVyX2xpc3Quc2l6ZSgpOyArK2xpc3RfaW5kZXgpIHsKKyAgICAgIGlmIChmaWx0ZXJfbGlzdFtsaXN0X2luZGV4XS0+R2V0VHlwZUlkKCkgPT0KKyAgICAgICAgICBiYXNlOjpHZXRUeXBlSWQ8Y3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uPigpKSB7CisgICAgICAgIHJldHVybiBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxjb25zdCBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb24qPigKKyAgICAgICAgICAgIGZpbHRlcl9saXN0W2xpc3RfaW5kZXhdKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gTlVMTDsKK30KKworYm9vbCBNYXBUb01lc2hGdW5jdGlvbjo6b3BlcmF0b3I9PShjb25zdCBNYXBUb01lc2hGdW5jdGlvbiYgcmhzKSBjb25zdCB7CisgIGlmIChtZXNoX3NwZWMoKS5tZXNoX3R5cGUoKSAhPSByaHMubWVzaF9zcGVjKCkubWVzaF90eXBlKCkgfHwKKyAgICAgIGhvcml6b250YWxfZm92KCkgIT0gcmhzLmhvcml6b250YWxfZm92KCkgfHwKKyAgICAgIGhvcml6b250YWxfZm92KCkgIT0gcmhzLmhvcml6b250YWxfZm92KCkgfHwKKyAgICAgICFzdGVyZW9fbW9kZSgpLT5FcXVhbHMoKnJocy5zdGVyZW9fbW9kZSgpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChtZXNoX3NwZWMoKS5tZXNoX3R5cGUoKSA9PSBrVXJscykgeworICAgIGlmICghbWVzaF9zcGVjKCkubWVzaF91cmwoKS0+RXF1YWxzKCpyaHMubWVzaF9zcGVjKCkubWVzaF91cmwoKSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciYgbGhzX21lc2hlcyA9CisgICAgICAgIG1lc2hfc3BlYygpLnJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMoKTsKKyAgICBjb25zdCBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciYgcmhzX21lc2hlcyA9CisgICAgICAgIHJocy5tZXNoX3NwZWMoKS5yZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzKCk7CisKKyAgICBpZiAobGhzX21lc2hlcy5zaXplKCkgIT0gcmhzX21lc2hlcy5zaXplKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGxoc19tZXNoZXMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmICgqbGhzX21lc2hlc1tpXSAhPSAqcmhzX21lc2hlc1tpXSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorCisgICAgZm9yIChpbnQgY29sID0gMDsgY29sIDw9IDM7ICsrY29sKSB7CisgICAgICBpZiAoIWdsbTo6YWxsKGdsbTo6ZXF1YWwodHJhbnNmb3JtKClbY29sXSwgcmhzLnRyYW5zZm9ybSgpW2NvbF0pKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBjc3NvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tYXBfdG9fbWVzaF9mdW5jdGlvbi5oIGIvc3JjL2NvYmFsdC9jc3NvbS9tYXBfdG9fbWVzaF9mdW5jdGlvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk3NDE2MWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21hcF90b19tZXNoX2Z1bmN0aW9uLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0NTU09NX01BUF9UT19NRVNIX0ZVTkNUSU9OX0hfCisjZGVmaW5lIENPQkFMVF9DU1NPTV9NQVBfVE9fTUVTSF9GVU5DVElPTl9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF92ZWN0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19lcXVhdGFibGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdXJsX3ZhbHVlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvZ2xtL2dsbS9tYXQ0eDQuaHBwIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBjc3NvbSB7CisKKy8vIFJlcHJlc2VudCBhIG1hcC10by1tZXNoIGZpbHRlci4KK2NsYXNzIE1hcFRvTWVzaEZ1bmN0aW9uIDogcHVibGljIEZpbHRlckZ1bmN0aW9uIHsKKyBwdWJsaWM6CisgIC8vIEEgcmVzb2x1dGlvbi1tYXRjaGVkIG1lc2ggc3BlY2lmaWVyLgorICBjbGFzcyBSZXNvbHV0aW9uTWF0Y2hlZE1lc2ggeworICAgcHVibGljOgorICAgIFJlc29sdXRpb25NYXRjaGVkTWVzaChpbnQgd2lkdGhfbWF0Y2gsIGludCBoZWlnaHRfbWF0Y2gsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsKTsKKyAgICBpbnQgd2lkdGhfbWF0Y2goKSBjb25zdCB7IHJldHVybiB3aWR0aF9tYXRjaF87IH0KKyAgICBpbnQgaGVpZ2h0X21hdGNoKCkgY29uc3QgeyByZXR1cm4gaGVpZ2h0X21hdGNoXzsgfQorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsKCkgY29uc3QgeyByZXR1cm4gbWVzaF91cmxfOyB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2gmIHJocykgY29uc3Q7CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2gmIHJocykgY29uc3Q7CisKKyAgIHByaXZhdGU6CisgICAgY29uc3QgaW50IHdpZHRoX21hdGNoXzsKKyAgICBjb25zdCBpbnQgaGVpZ2h0X21hdGNoXzsKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+IG1lc2hfdXJsXzsKKyAgfTsKKworICAvLyBUeXBlIG9mIHRoZSBzb3VyY2Ugb2YgdGhlIG1lc2g6IGVpdGhlciBhIGJ1aWx0LWluIG1lc2ggdHlwZSBvciBhIGN1c3RvbQorICAvLyBtZXNoLgorICBlbnVtIE1lc2hTcGVjVHlwZSB7CisgICAgLy8gQnVpbHQtaW4gZXF1aXJlY3Rhbmd1bGFyIG1lc2guCisgICAga0VxdWlyZWN0YW5ndWxhciwKKyAgICAvLyBMaXN0IG9mIGN1c3RvbSBiaW5hcnkgbWVzaCBVUkxzLgorICAgIGtVcmxzCisgIH07CisgIHR5cGVkZWYgU2NvcGVkVmVjdG9yPFJlc29sdXRpb25NYXRjaGVkTWVzaD4gUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXI7CisKKyAgLy8gQ29udGFpbnMgdGhlIHNwZWNpZmljYXRpb24gb2YgdGhlIG1lc2ggc291cmNlLgorICBjbGFzcyBNZXNoU3BlYyB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgTWVzaFNwZWMoTWVzaFNwZWNUeXBlIG1lc2hfdHlwZSkgOiBtZXNoX3R5cGVfKG1lc2hfdHlwZSkgeworICAgICAgLy8gQ2hlY2sgdGhhdCB0aGlzIGlzIGEgYnVpbHQtaW4gbWVzaCB0eXBlLgorICAgICAgRENIRUNLX0VRKG1lc2hfdHlwZSwga0VxdWlyZWN0YW5ndWxhcik7CisgICAgfQorCisgICAgTWVzaFNwZWMoTWVzaFNwZWNUeXBlIG1lc2hfdHlwZSwKKyAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBtZXNoX3VybCwKKyAgICAgICAgICAgICBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzKQorICAgICAgICA6IG1lc2hfdHlwZV8obWVzaF90eXBlKSwKKyAgICAgICAgICBtZXNoX3VybF8obWVzaF91cmwpLAorICAgICAgICAgIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXNfKHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMuUGFzcygpKSB7CisgICAgICBEQ0hFQ0tfRVEobWVzaF90eXBlXywga1VybHMpOworICAgICAgRENIRUNLKG1lc2hfdXJsKTsKKyAgICB9CisKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBtZXNoX3VybCgpIGNvbnN0IHsKKyAgICAgIERDSEVDS19FUShtZXNoX3R5cGVfLCBrVXJscyk7CisgICAgICByZXR1cm4gbWVzaF91cmxfOworICAgIH0KKyAgICBjb25zdCBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciYgcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcygpIGNvbnN0IHsKKyAgICAgIERDSEVDS19FUShtZXNoX3R5cGVfLCBrVXJscyk7CisgICAgICByZXR1cm4gcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlc187CisgICAgfQorICAgIE1lc2hTcGVjVHlwZSBtZXNoX3R5cGUoKSBjb25zdCB7IHJldHVybiBtZXNoX3R5cGVfOyB9CisKKyAgIHByaXZhdGU6CisgICAgTWVzaFNwZWNUeXBlIG1lc2hfdHlwZV87CisgICAgc2NvcGVkX3JlZnB0cjxQcm9wZXJ0eVZhbHVlPiBtZXNoX3VybF87CisgICAgUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIgcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlc187CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVzaFNwZWMpOworICB9OworCisgIE1hcFRvTWVzaEZ1bmN0aW9uKHNjb3BlZF9wdHI8TWVzaFNwZWM+IG1lc2hfc3BlYywgZmxvYXQgaG9yaXpvbnRhbF9mb3YsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZlcnRpY2FsX2ZvdiwgY29uc3QgZ2xtOjptYXQ0JiB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8S2V5d29yZFZhbHVlPiYgc3RlcmVvX21vZGUpCisgICAgICA6IG1lc2hfc3BlY18obWVzaF9zcGVjLlBhc3MoKSksCisgICAgICAgIGhvcml6b250YWxfZm92Xyhob3Jpem9udGFsX2ZvdiksCisgICAgICAgIHZlcnRpY2FsX2Zvdl8odmVydGljYWxfZm92KSwKKyAgICAgICAgdHJhbnNmb3JtXyh0cmFuc2Zvcm0pLAorICAgICAgICBzdGVyZW9fbW9kZV8oc3RlcmVvX21vZGUpIHsKKyAgICBEQ0hFQ0sobWVzaF9zcGVjXyk7CisgICAgRENIRUNLKHN0ZXJlb19tb2RlXyk7CisgIH0KKworICAvLyBBbHRlcm5hdGUgY29uc3RydWN0b3IgZm9yIG1lc2ggVVJMIGxpc3RzLgorICBNYXBUb01lc2hGdW5jdGlvbihjb25zdCBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+JiBtZXNoX3VybCwKKyAgICAgICAgICAgICAgICAgICAgUmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIgcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcywKKyAgICAgICAgICAgICAgICAgICAgZmxvYXQgaG9yaXpvbnRhbF9mb3YsIGZsb2F0IHZlcnRpY2FsX2ZvdiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2xtOjptYXQ0JiB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8S2V5d29yZFZhbHVlPiYgc3RlcmVvX21vZGUpCisgICAgICA6IG1lc2hfc3BlY18oCisgICAgICAgICAgICBuZXcgTWVzaFNwZWMoa1VybHMsIG1lc2hfdXJsLCByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzLlBhc3MoKSkpLAorICAgICAgICBob3Jpem9udGFsX2Zvdl8oaG9yaXpvbnRhbF9mb3YpLAorICAgICAgICB2ZXJ0aWNhbF9mb3ZfKHZlcnRpY2FsX2ZvdiksCisgICAgICAgIHRyYW5zZm9ybV8odHJhbnNmb3JtKSwKKyAgICAgICAgc3RlcmVvX21vZGVfKHN0ZXJlb19tb2RlKSB7CisgICAgRENIRUNLKHN0ZXJlb19tb2RlXyk7CisgIH0KKworICAvLyBBbHRlcm5hdGUgY29uc3RydWN0b3IgZm9yIGJ1aWx0LWluIG1lc2hlcy4KKyAgTWFwVG9NZXNoRnVuY3Rpb24oTWVzaFNwZWNUeXBlIHNwZWNfdHlwZSwgZmxvYXQgaG9yaXpvbnRhbF9mb3YsCisgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZlcnRpY2FsX2ZvdiwgY29uc3QgZ2xtOjptYXQ0JiB0cmFuc2Zvcm0sCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8S2V5d29yZFZhbHVlPiYgc3RlcmVvX21vZGUpCisgICAgICA6IG1lc2hfc3BlY18obmV3IE1lc2hTcGVjKHNwZWNfdHlwZSkpLAorICAgICAgICBob3Jpem9udGFsX2Zvdl8oaG9yaXpvbnRhbF9mb3YpLAorICAgICAgICB2ZXJ0aWNhbF9mb3ZfKHZlcnRpY2FsX2ZvdiksCisgICAgICAgIHRyYW5zZm9ybV8odHJhbnNmb3JtKSwKKyAgICAgICAgc3RlcmVvX21vZGVfKHN0ZXJlb19tb2RlKSB7CisgICAgRENIRUNLKHN0ZXJlb19tb2RlXyk7CisgIH0KKworICB+TWFwVG9NZXNoRnVuY3Rpb24oKSBPVkVSUklERSB7fQorCisgIGNvbnN0IE1lc2hTcGVjJiBtZXNoX3NwZWMoKSBjb25zdCB7IHJldHVybiAqbWVzaF9zcGVjXzsgfQorICBmbG9hdCBob3Jpem9udGFsX2ZvdigpIGNvbnN0IHsgcmV0dXJuIGhvcml6b250YWxfZm92XzsgfQorICBmbG9hdCB2ZXJ0aWNhbF9mb3YoKSBjb25zdCB7IHJldHVybiB2ZXJ0aWNhbF9mb3ZfOyB9CisgIGNvbnN0IGdsbTo6bWF0NCYgdHJhbnNmb3JtKCkgY29uc3QgeyByZXR1cm4gdHJhbnNmb3JtXzsgfQorICBjb25zdCBzY29wZWRfcmVmcHRyPEtleXdvcmRWYWx1ZT4mIHN0ZXJlb19tb2RlKCkgY29uc3QgeworICAgIHJldHVybiBzdGVyZW9fbW9kZV87CisgIH0KKworICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IE9WRVJSSURFOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXBUb01lc2hGdW5jdGlvbiYgcmhzKSBjb25zdDsKKworICBzdGF0aWMgY29uc3QgTWFwVG9NZXNoRnVuY3Rpb24qIEV4dHJhY3RGcm9tRmlsdGVyTGlzdCgKKyAgICAgIFByb3BlcnR5VmFsdWUqIGZpbHRlcl9saXN0KTsKKworICBERUZJTkVfUE9MWU1PUlBISUNfRVFVQVRBQkxFX1RZUEUoTWFwVG9NZXNoRnVuY3Rpb24pOworCisgcHJpdmF0ZToKKyAgY29uc3Qgc2NvcGVkX3B0cjxNZXNoU3BlYz4gbWVzaF9zcGVjXzsKKyAgY29uc3QgZmxvYXQgaG9yaXpvbnRhbF9mb3ZfOworICBjb25zdCBmbG9hdCB2ZXJ0aWNhbF9mb3ZfOworICBjb25zdCBnbG06Om1hdDQgdHJhbnNmb3JtXzsKKyAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+IHN0ZXJlb19tb2RlXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWFwVG9NZXNoRnVuY3Rpb24pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGNzc29tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0NTU09NX01BUF9UT19NRVNIX0ZVTkNUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL21hdHJpeF9mdW5jdGlvbi5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vbWF0cml4X2Z1bmN0aW9uLmNjCmluZGV4IDYwMDJkZTguLjgzMDNhNjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbWF0cml4X2Z1bmN0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbWF0cml4X2Z1bmN0aW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tYXRyaXhfZnVuY3Rpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tYXRyaXhfZnVuY3Rpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vbWF0cml4X2Z1bmN0aW9uLmgKaW5kZXggZWU5ZDU1ZS4uYzA5YWZlOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9tYXRyaXhfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21hdHJpeF9mdW5jdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fTUFUUklYX0ZVTkNUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9NQVRSSVhfRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZS5jYwppbmRleCA4OGRiNzVjLi5jNTFmODRlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlLmgKaW5kZXggOWI5NDM5Ny4uNGVjZDliMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9NRURJQV9GRUFUVVJFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9NRURJQV9GRUFUVVJFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlLmNjCmluZGV4IGJiOGIzOTIuLjA0ZjM1YTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlLmgKaW5kZXggZGQ5MzBhNC4uYzE1YmJlMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fTUVESUFfRkVBVFVSRV9LRVlXT1JEX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9NRURJQV9GRUFUVVJFX0tFWVdPUkRfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlX25hbWVzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWVfbmFtZXMuY2MKaW5kZXggY2MxNDg2NC4uYTg0YTkyMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWVfbmFtZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWVfbmFtZXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZV9uYW1lcy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZV9uYW1lcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWVfbmFtZXMuaAppbmRleCAzNjczNjdmLi4zN2E4ZTU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfa2V5d29yZF92YWx1ZV9uYW1lcy5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlX25hbWVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9NRURJQV9GRUFUVVJFX0tFWVdPUkRfVkFMVUVfTkFNRVNfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX01FRElBX0ZFQVRVUkVfS0VZV09SRF9WQUxVRV9OQU1FU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX25hbWVzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX25hbWVzLmNjCmluZGV4IGIxYmQ4ZjQuLjRkNTlhNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9uYW1lcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfbmFtZXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfbmFtZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX25hbWVzLmggYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfbmFtZXMuaAppbmRleCAxZjEzMGY2Li40YmE2NDQzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfbmFtZXMuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmVfbmFtZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX01FRElBX0ZFQVRVUkVfTkFNRVNfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX01FRElBX0ZFQVRVUkVfTkFNRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX3Rlc3QuY2MKaW5kZXggNzYyYWYwYi4uZjk3MmQ4MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2ZlYXR1cmUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9saXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9saXN0LmNjCmluZGV4IGE1NjQ5YTguLmJhMzljNzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfbGlzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9saXN0LmggYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaAppbmRleCA5NTU3NGViLi4wZjZlZTM4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX01FRElBX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX01FRElBX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfbGlzdC5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYzQ5MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3QuaWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLTIwMTMxMjA1LyNtZWRpYWxpc3QKKworW0FycmF5Q2xhc3NdCitpbnRlcmZhY2UgTWVkaWFMaXN0IHsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBtZWRpYVRleHQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIERPTVN0cmluZz8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgdm9pZCBhcHBlbmRNZWRpdW0oRE9NU3RyaW5nIG1lZGl1bSk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9saXN0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3RfdGVzdC5jYwppbmRleCAwN2NkZjY0Li5mMjA1ZTY1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3RfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX2xpc3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9xdWVyeS5jYwppbmRleCBhZGRmNzNlLi5kZTk3MzYzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfcXVlcnkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfcXVlcnkuaCBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfcXVlcnkuaAppbmRleCBlNzE0ZWQ4Li5kYjFlOWRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5LmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9xdWVyeS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fTUVESUFfUVVFUllfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX01FRElBX1FVRVJZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3F1ZXJ5X3Rlc3QuY2MKaW5kZXggMDAxOGZjMC4uMjEyNzEyNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV9xdWVyeV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfcXVlcnlfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfcXVlcnkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV90eXBlX25hbWVzLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV90eXBlX25hbWVzLmNjCmluZGV4IGZmNDQ3NTUuLjc2ZTljOGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbWVkaWFfdHlwZV9uYW1lcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3R5cGVfbmFtZXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21lZGlhX3R5cGVfbmFtZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tZWRpYV90eXBlX25hbWVzLmggYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3R5cGVfbmFtZXMuaAppbmRleCA0NTRhOGEyLi4xYTcyOTk5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3R5cGVfbmFtZXMuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL21lZGlhX3R5cGVfbmFtZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX01FRElBX1RZUEVfTkFNRVNfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX01FRElBX1RZUEVfTkFNRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY5NzNiZjYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uaCIKLQotI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgotI2luY2x1ZGUgImJhc2Uvc3RyaW5ncHJpbnRmLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuaCIKLSNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvci5oIgotCi1uYW1lc3BhY2UgY29iYWx0IHsKLW5hbWVzcGFjZSBjc3NvbSB7Ci0KLXN0ZDo6c3RyaW5nIE1UTUZ1bmN0aW9uOjpUb1N0cmluZygpIGNvbnN0IHsKLSAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gIm1hcC10by1tZXNoKCI7Ci0KLSAgaWYgKG1lc2hfc3BlYygpLm1lc2hfdHlwZSgpID09IGtFcXVpcmVjdGFuZ3VsYXIpIHsKLSAgICByZXN1bHQuYXBwZW5kKCJlcXVpcmVjdGFuZ3VsYXIiKTsKLSAgfSBlbHNlIGlmIChtZXNoX3NwZWMoKS5tZXNoX3R5cGUoKSA9PSBrVXJscykgewotICAgIHJlc3VsdC5hcHBlbmQobWVzaF9zcGVjKCkubWVzaF91cmwoKS0+VG9TdHJpbmcoKSk7Ci0KLSAgICBjb25zdCBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciYgbWVzaGVzID0KLSAgICAgICAgbWVzaF9zcGVjKCkucmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcygpOwotICAgIGZvciAoc2l6ZV90IG1lc2hfaW5kZXggPSAwOyBtZXNoX2luZGV4IDwgbWVzaGVzLnNpemUoKTsgKyttZXNoX2luZGV4KSB7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKCcgJyk7Ci0gICAgICByZXN1bHQuYXBwZW5kKGJhc2U6OkludFRvU3RyaW5nKG1lc2hlc1ttZXNoX2luZGV4XS0+d2lkdGhfbWF0Y2goKSkpOwotICAgICAgcmVzdWx0LnB1c2hfYmFjaygnICcpOwotICAgICAgcmVzdWx0LmFwcGVuZChiYXNlOjpJbnRUb1N0cmluZyhtZXNoZXNbbWVzaF9pbmRleF0tPmhlaWdodF9tYXRjaCgpKSk7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKCcgJyk7Ci0gICAgICByZXN1bHQuYXBwZW5kKG1lc2hlc1ttZXNoX2luZGV4XS0+bWVzaF91cmwoKS0+VG9TdHJpbmcoKSk7Ci0gICAgfQotICB9Ci0KLSAgcmVzdWx0LmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiwgJS43Z3JhZCIsIGhvcml6b250YWxfZm92KCkpKTsKLSAgcmVzdWx0LmFwcGVuZChiYXNlOjpTdHJpbmdQcmludGYoIiAlLjdncmFkLCAiLCB2ZXJ0aWNhbF9mb3YoKSkpOwotCi0gIHJlc3VsdC5hcHBlbmQoIm1hdHJpeDNkKCIpOwotICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPD0gMzsgKytjb2wpIHsKLSAgICBmb3IgKGludCByb3cgPSAwOyByb3cgPD0gMzsgKytyb3cpIHsKLSAgICAgIGlmIChjb2wgPiAwIHx8IHJvdyA+IDApIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgiLCAiKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdC5hcHBlbmQoYmFzZTo6U3RyaW5nUHJpbnRmKCIlLjdnIiwgdHJhbnNmb3JtKClbY29sXVtyb3ddKSk7Ci0gICAgfQotICB9Ci0KLSAgcmVzdWx0LmFwcGVuZCgiKSwgIik7Ci0gIHJlc3VsdC5hcHBlbmQoc3RlcmVvX21vZGUoKS0+VG9TdHJpbmcoKSk7Ci0gIHJlc3VsdC5hcHBlbmQoIikiKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1NVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2goCi0gICAgaW50IHdpZHRoX21hdGNoLCBpbnQgaGVpZ2h0X21hdGNoLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsKQotICAgIDogd2lkdGhfbWF0Y2hfKHdpZHRoX21hdGNoKSwKLSAgICAgIGhlaWdodF9tYXRjaF8oaGVpZ2h0X21hdGNoKSwKLSAgICAgIG1lc2hfdXJsXyhtZXNoX3VybCkgewotICBEQ0hFQ0sobWVzaF91cmxfKTsKLX0KLQotYm9vbCBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoOjpvcGVyYXRvcj09KAotICAgIGNvbnN0IE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2gmIHJocykgY29uc3QgewotICByZXR1cm4gbWVzaF91cmwoKS0+RXF1YWxzKCpyaHMubWVzaF91cmwoKSkgJiYKLSAgICAgICAgIHdpZHRoX21hdGNoKCkgPT0gcmhzLndpZHRoX21hdGNoKCkgJiYKLSAgICAgICAgIGhlaWdodF9tYXRjaCgpID09IHJocy5oZWlnaHRfbWF0Y2goKTsKLX0KLQotYm9vbCBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoOjpvcGVyYXRvciE9KAotICAgIGNvbnN0IE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2gmIHJocykgY29uc3QgewotICByZXR1cm4gISgqdGhpcyA9PSByaHMpOwotfQotCi1jb25zdCBNVE1GdW5jdGlvbiogTVRNRnVuY3Rpb246OkV4dHJhY3RGcm9tRmlsdGVyTGlzdCgKLSAgICBQcm9wZXJ0eVZhbHVlKiBmaWx0ZXJfdmFsdWUpIHsKLSAgaWYgKGZpbHRlcl92YWx1ZSAmJiBmaWx0ZXJfdmFsdWUgIT0gY3Nzb206OktleXdvcmRWYWx1ZTo6R2V0Tm9uZSgpKSB7Ci0gICAgY29uc3QgY3Nzb206OkZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlOjpCdWlsZGVyJiBmaWx0ZXJfbGlzdCA9Ci0gICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGNzc29tOjpGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZSo+KAotICAgICAgICAgICAgZmlsdGVyX3ZhbHVlKQotICAgICAgICAgICAgLT52YWx1ZSgpOwotCi0gICAgZm9yIChzaXplX3QgbGlzdF9pbmRleCA9IDA7IGxpc3RfaW5kZXggPCBmaWx0ZXJfbGlzdC5zaXplKCk7ICsrbGlzdF9pbmRleCkgewotICAgICAgaWYgKGZpbHRlcl9saXN0W2xpc3RfaW5kZXhdLT5HZXRUeXBlSWQoKSA9PQotICAgICAgICAgIGJhc2U6OkdldFR5cGVJZDxjc3NvbTo6TVRNRnVuY3Rpb24+KCkpIHsKLSAgICAgICAgcmV0dXJuIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGNvbnN0IGNzc29tOjpNVE1GdW5jdGlvbio+KAotICAgICAgICAgICAgZmlsdGVyX2xpc3RbbGlzdF9pbmRleF0pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBOVUxMOwotfQotCi1ib29sIE1UTUZ1bmN0aW9uOjpvcGVyYXRvcj09KGNvbnN0IE1UTUZ1bmN0aW9uJiByaHMpIGNvbnN0IHsKLSAgaWYgKG1lc2hfc3BlYygpLm1lc2hfdHlwZSgpICE9IHJocy5tZXNoX3NwZWMoKS5tZXNoX3R5cGUoKSB8fAotICAgICAgaG9yaXpvbnRhbF9mb3YoKSAhPSByaHMuaG9yaXpvbnRhbF9mb3YoKSB8fAotICAgICAgaG9yaXpvbnRhbF9mb3YoKSAhPSByaHMuaG9yaXpvbnRhbF9mb3YoKSB8fAotICAgICAgIXN0ZXJlb19tb2RlKCktPkVxdWFscygqcmhzLnN0ZXJlb19tb2RlKCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKG1lc2hfc3BlYygpLm1lc2hfdHlwZSgpID09IGtVcmxzKSB7Ci0gICAgaWYgKCFtZXNoX3NwZWMoKS5tZXNoX3VybCgpLT5FcXVhbHMoKnJocy5tZXNoX3NwZWMoKS5tZXNoX3VybCgpKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGNvbnN0IFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyJiBsaHNfbWVzaGVzID0KLSAgICAgICAgbWVzaF9zcGVjKCkucmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcygpOwotICAgIGNvbnN0IFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyJiByaHNfbWVzaGVzID0KLSAgICAgICAgcmhzLm1lc2hfc3BlYygpLnJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMoKTsKLQotICAgIGlmIChsaHNfbWVzaGVzLnNpemUoKSAhPSByaHNfbWVzaGVzLnNpemUoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgbGhzX21lc2hlcy5zaXplKCk7ICsraSkgewotICAgICAgaWYgKCpsaHNfbWVzaGVzW2ldICE9ICpyaHNfbWVzaGVzW2ldKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGludCBjb2wgPSAwOyBjb2wgPD0gMzsgKytjb2wpIHsKLSAgICAgIGlmICghZ2xtOjphbGwoZ2xtOjplcXVhbCh0cmFuc2Zvcm0oKVtjb2xdLCByaHMudHJhbnNmb3JtKClbY29sXSkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNzc29tCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIGIvc3JjL2NvYmFsdC9jc3NvbS9tdG1fZnVuY3Rpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBhMWExNy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ09CQUxUX0NTU09NX01UTV9GVU5DVElPTl9IXwotI2RlZmluZSBDT0JBTFRfQ1NTT01fTVRNX0ZVTkNUSU9OX0hfCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3ZlY3Rvci5oIgotI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2VxdWF0YWJsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9maWx0ZXJfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9jc3NvbS91cmxfdmFsdWUuaCIKLSNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9nbG0vZ2xtL21hdDR4NC5ocHAiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGNzc29tIHsKLQotLy8gUmVwcmVzZW50IGEgbWFwLXRvLW1lc2ggZmlsdGVyLgotY2xhc3MgTVRNRnVuY3Rpb24gOiBwdWJsaWMgRmlsdGVyRnVuY3Rpb24gewotIHB1YmxpYzoKLSAgLy8gQSByZXNvbHV0aW9uLW1hdGNoZWQgbWVzaCBzcGVjaWZpZXIuCi0gIGNsYXNzIFJlc29sdXRpb25NYXRjaGVkTWVzaCB7Ci0gICBwdWJsaWM6Ci0gICAgUmVzb2x1dGlvbk1hdGNoZWRNZXNoKGludCB3aWR0aF9tYXRjaCwgaW50IGhlaWdodF9tYXRjaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQcm9wZXJ0eVZhbHVlPiYgbWVzaF91cmwpOwotICAgIGludCB3aWR0aF9tYXRjaCgpIGNvbnN0IHsgcmV0dXJuIHdpZHRoX21hdGNoXzsgfQotICAgIGludCBoZWlnaHRfbWF0Y2goKSBjb25zdCB7IHJldHVybiBoZWlnaHRfbWF0Y2hfOyB9Ci0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQcm9wZXJ0eVZhbHVlPiYgbWVzaF91cmwoKSBjb25zdCB7IHJldHVybiBtZXNoX3VybF87IH0KLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaCYgcmhzKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaCYgcmhzKSBjb25zdDsKLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBpbnQgd2lkdGhfbWF0Y2hfOwotICAgIGNvbnN0IGludCBoZWlnaHRfbWF0Y2hfOwotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4gbWVzaF91cmxfOwotICB9OwotCi0gIC8vIFR5cGUgb2YgdGhlIHNvdXJjZSBvZiB0aGUgbWVzaDogZWl0aGVyIGEgYnVpbHQtaW4gbWVzaCB0eXBlIG9yIGEgY3VzdG9tCi0gIC8vIG1lc2guCi0gIGVudW0gTWVzaFNwZWNUeXBlIHsKLSAgICAvLyBCdWlsdC1pbiBlcXVpcmVjdGFuZ3VsYXIgbWVzaC4KLSAgICBrRXF1aXJlY3Rhbmd1bGFyLAotICAgIC8vIExpc3Qgb2YgY3VzdG9tIGJpbmFyeSBtZXNoIFVSTHMuCi0gICAga1VybHMKLSAgfTsKLSAgdHlwZWRlZiBTY29wZWRWZWN0b3I8UmVzb2x1dGlvbk1hdGNoZWRNZXNoPiBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcjsKLQotICAvLyBDb250YWlucyB0aGUgc3BlY2lmaWNhdGlvbiBvZiB0aGUgbWVzaCBzb3VyY2UuCi0gIGNsYXNzIE1lc2hTcGVjIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBNZXNoU3BlYyhNZXNoU3BlY1R5cGUgbWVzaF90eXBlKSA6IG1lc2hfdHlwZV8obWVzaF90eXBlKSB7Ci0gICAgICAvLyBDaGVjayB0aGF0IHRoaXMgaXMgYSBidWlsdC1pbiBtZXNoIHR5cGUuCi0gICAgICBEQ0hFQ0tfRVEobWVzaF90eXBlLCBrRXF1aXJlY3Rhbmd1bGFyKTsKLSAgICB9Ci0KLSAgICBNZXNoU3BlYyhNZXNoU3BlY1R5cGUgbWVzaF90eXBlLAotICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsLAotICAgICAgICAgICAgIFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMpCi0gICAgICAgIDogbWVzaF90eXBlXyhtZXNoX3R5cGUpLAotICAgICAgICAgIG1lc2hfdXJsXyhtZXNoX3VybCksCi0gICAgICAgICAgcmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlc18ocmVzb2x1dGlvbl9tYXRjaGVkX21lc2hlcy5QYXNzKCkpIHsKLSAgICAgIERDSEVDS19FUShtZXNoX3R5cGVfLCBrVXJscyk7Ci0gICAgICBEQ0hFQ0sobWVzaF91cmwpOwotICAgIH0KLQotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsKCkgY29uc3QgewotICAgICAgRENIRUNLX0VRKG1lc2hfdHlwZV8sIGtVcmxzKTsKLSAgICAgIHJldHVybiBtZXNoX3VybF87Ci0gICAgfQotICAgIGNvbnN0IFJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyJiByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzKCkgY29uc3QgewotICAgICAgRENIRUNLX0VRKG1lc2hfdHlwZV8sIGtVcmxzKTsKLSAgICAgIHJldHVybiByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzXzsKLSAgICB9Ci0gICAgTWVzaFNwZWNUeXBlIG1lc2hfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIG1lc2hfdHlwZV87IH0KLQotICAgcHJpdmF0ZToKLSAgICBNZXNoU3BlY1R5cGUgbWVzaF90eXBlXzsKLSAgICBzY29wZWRfcmVmcHRyPFByb3BlcnR5VmFsdWU+IG1lc2hfdXJsXzsKLSAgICBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzXzsKLQotICAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNZXNoU3BlYyk7Ci0gIH07Ci0KLSAgTVRNRnVuY3Rpb24oc2NvcGVkX3B0cjxNZXNoU3BlYz4gbWVzaF9zcGVjLCBmbG9hdCBob3Jpem9udGFsX2ZvdiwKLSAgICAgICAgICAgICAgZmxvYXQgdmVydGljYWxfZm92LCBjb25zdCBnbG06Om1hdDQmIHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+JiBzdGVyZW9fbW9kZSkKLSAgICAgIDogbWVzaF9zcGVjXyhtZXNoX3NwZWMuUGFzcygpKSwKLSAgICAgICAgaG9yaXpvbnRhbF9mb3ZfKGhvcml6b250YWxfZm92KSwKLSAgICAgICAgdmVydGljYWxfZm92Xyh2ZXJ0aWNhbF9mb3YpLAotICAgICAgICB0cmFuc2Zvcm1fKHRyYW5zZm9ybSksCi0gICAgICAgIHN0ZXJlb19tb2RlXyhzdGVyZW9fbW9kZSkgewotICAgIERDSEVDSyhtZXNoX3NwZWNfKTsKLSAgICBEQ0hFQ0soc3RlcmVvX21vZGVfKTsKLSAgfQotCi0gIC8vIEFsdGVybmF0ZSBjb25zdHJ1Y3RvciBmb3IgbWVzaCBVUkwgbGlzdHMuCi0gIE1UTUZ1bmN0aW9uKGNvbnN0IHNjb3BlZF9yZWZwdHI8UHJvcGVydHlWYWx1ZT4mIG1lc2hfdXJsLAotICAgICAgICAgICAgICBSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciByZXNvbHV0aW9uX21hdGNoZWRfbWVzaGVzLAotICAgICAgICAgICAgICBmbG9hdCBob3Jpem9udGFsX2ZvdiwgZmxvYXQgdmVydGljYWxfZm92LAotICAgICAgICAgICAgICBjb25zdCBnbG06Om1hdDQmIHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+JiBzdGVyZW9fbW9kZSkKLSAgICAgIDogbWVzaF9zcGVjXygKLSAgICAgICAgICAgIG5ldyBNZXNoU3BlYyhrVXJscywgbWVzaF91cmwsIHJlc29sdXRpb25fbWF0Y2hlZF9tZXNoZXMuUGFzcygpKSksCi0gICAgICAgIGhvcml6b250YWxfZm92Xyhob3Jpem9udGFsX2ZvdiksCi0gICAgICAgIHZlcnRpY2FsX2Zvdl8odmVydGljYWxfZm92KSwKLSAgICAgICAgdHJhbnNmb3JtXyh0cmFuc2Zvcm0pLAotICAgICAgICBzdGVyZW9fbW9kZV8oc3RlcmVvX21vZGUpIHsKLSAgICBEQ0hFQ0soc3RlcmVvX21vZGVfKTsKLSAgfQotCi0gIC8vIEFsdGVybmF0ZSBjb25zdHJ1Y3RvciBmb3IgYnVpbHQtaW4gbWVzaGVzLgotICBNVE1GdW5jdGlvbihNZXNoU3BlY1R5cGUgc3BlY190eXBlLCBmbG9hdCBob3Jpem9udGFsX2ZvdiwgZmxvYXQgdmVydGljYWxfZm92LAotICAgICAgICAgICAgICBjb25zdCBnbG06Om1hdDQmIHRyYW5zZm9ybSwKLSAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+JiBzdGVyZW9fbW9kZSkKLSAgICAgIDogbWVzaF9zcGVjXyhuZXcgTWVzaFNwZWMoc3BlY190eXBlKSksCi0gICAgICAgIGhvcml6b250YWxfZm92Xyhob3Jpem9udGFsX2ZvdiksCi0gICAgICAgIHZlcnRpY2FsX2Zvdl8odmVydGljYWxfZm92KSwKLSAgICAgICAgdHJhbnNmb3JtXyh0cmFuc2Zvcm0pLAotICAgICAgICBzdGVyZW9fbW9kZV8oc3RlcmVvX21vZGUpIHsKLSAgICBEQ0hFQ0soc3RlcmVvX21vZGVfKTsKLSAgfQotCi0gIH5NVE1GdW5jdGlvbigpIE9WRVJSSURFIHt9Ci0KLSAgY29uc3QgTWVzaFNwZWMmIG1lc2hfc3BlYygpIGNvbnN0IHsgcmV0dXJuICptZXNoX3NwZWNfOyB9Ci0gIGZsb2F0IGhvcml6b250YWxfZm92KCkgY29uc3QgeyByZXR1cm4gaG9yaXpvbnRhbF9mb3ZfOyB9Ci0gIGZsb2F0IHZlcnRpY2FsX2ZvdigpIGNvbnN0IHsgcmV0dXJuIHZlcnRpY2FsX2Zvdl87IH0KLSAgY29uc3QgZ2xtOjptYXQ0JiB0cmFuc2Zvcm0oKSBjb25zdCB7IHJldHVybiB0cmFuc2Zvcm1fOyB9Ci0gIGNvbnN0IHNjb3BlZF9yZWZwdHI8S2V5d29yZFZhbHVlPiYgc3RlcmVvX21vZGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHN0ZXJlb19tb2RlXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgT1ZFUlJJREU7Ci0KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IE1UTUZ1bmN0aW9uJiByaHMpIGNvbnN0OwotCi0gIHN0YXRpYyBjb25zdCBNVE1GdW5jdGlvbiogRXh0cmFjdEZyb21GaWx0ZXJMaXN0KFByb3BlcnR5VmFsdWUqIGZpbHRlcl9saXN0KTsKLQotICBERUZJTkVfUE9MWU1PUlBISUNfRVFVQVRBQkxFX1RZUEUoTVRNRnVuY3Rpb24pOwotCi0gcHJpdmF0ZToKLSAgY29uc3Qgc2NvcGVkX3B0cjxNZXNoU3BlYz4gbWVzaF9zcGVjXzsKLSAgY29uc3QgZmxvYXQgaG9yaXpvbnRhbF9mb3ZfOwotICBjb25zdCBmbG9hdCB2ZXJ0aWNhbF9mb3ZfOwotICBjb25zdCBnbG06Om1hdDQgdHJhbnNmb3JtXzsKLSAgY29uc3Qgc2NvcGVkX3JlZnB0cjxLZXl3b3JkVmFsdWU+IHN0ZXJlb19tb2RlXzsKLQotICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTVRNRnVuY3Rpb24pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNzc29tCi19ICAvLyBuYW1lc3BhY2UgY29iYWx0Ci0KLSNlbmRpZiAgLy8gQ09CQUxUX0NTU09NX01UTV9GVU5DVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9tdXRhdGlvbl9vYnNlcnZlci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9tdXRhdGlvbl9vYnNlcnZlci5oCmluZGV4IGU3MmI0NWUuLjkzNjE3ZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbXV0YXRpb25fb2JzZXJ2ZXIuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL211dGF0aW9uX29ic2VydmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9NVVRBVElPTl9PQlNFUlZFUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fTVVUQVRJT05fT0JTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IuY2MgYi9zcmMvY29iYWx0L2Nzc29tL25leHRfc2libGluZ19jb21iaW5hdG9yLmNjCmluZGV4IGMzMzFmM2QuLjk5NDQyMzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9uZXh0X3NpYmxpbmdfY29tYmluYXRvci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9uZXh0X3NpYmxpbmdfY29tYmluYXRvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9uZXh0X3NpYmxpbmdfY29tYmluYXRvci5oCmluZGV4IGRhODM4M2IuLmEyZmRjODAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbmV4dF9zaWJsaW5nX2NvbWJpbmF0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL25leHRfc2libGluZ19jb21iaW5hdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9ORVhUX1NJQkxJTkdfQ09NQklOQVRPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fTkVYVF9TSUJMSU5HX0NPTUJJTkFUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbm90X3BzZXVkb19jbGFzcy5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vbm90X3BzZXVkb19jbGFzcy5jYwppbmRleCBhZmUxODQ2Li43MTE1ZjA5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL25vdF9wc2V1ZG9fY2xhc3MuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vbm90X3BzZXVkb19jbGFzcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgKaW5kZXggODEyYzRjNi4uZDhlMDFiYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9ub3RfcHNldWRvX2NsYXNzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9OT1RfUFNFVURPX0NMQVNTX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9OT1RfUFNFVURPX0NMQVNTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL251bWJlcl92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmNjCmluZGV4IDI0MTVmYzcuLjRhMGZkMWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vbnVtYmVyX3ZhbHVlLmgKaW5kZXggZGViNWMwMy4uOWJiZjFiOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL251bWJlcl92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fTlVNQkVSX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9OVU1CRVJfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcGVyY2VudGFnZV92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcGVyY2VudGFnZV92YWx1ZS5jYwppbmRleCBlMzE1NjcyLi4zMDY3MjEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3BlcmNlbnRhZ2VfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wZXJjZW50YWdlX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wZXJjZW50YWdlX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcGVyY2VudGFnZV92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wZXJjZW50YWdlX3ZhbHVlLmgKaW5kZXggNzAyNTkwZC4uZTQyODhkOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9wZXJjZW50YWdlX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wZXJjZW50YWdlX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9QRVJDRU5UQUdFX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9QRVJDRU5UQUdFX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV9kZWZpbml0aW9ucy5jYwppbmRleCAxYmNkYjJhLi44NjVlODgzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuaCBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfZGVmaW5pdGlvbnMuaAppbmRleCBmNGM5MzMzLi4wNzE4MjIwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV9kZWZpbml0aW9ucy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fUFJPUEVSVFlfREVGSU5JVElPTlNfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1BST1BFUlRZX0RFRklOSVRJT05TX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2tleV9saXN0X3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV9rZXlfbGlzdF92YWx1ZS5jYwppbmRleCA2YjUxMmJkLi45NDM2YjVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2tleV9saXN0X3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfa2V5X2xpc3RfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Byb3BlcnR5X2tleV9saXN0X3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfa2V5X2xpc3RfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfa2V5X2xpc3RfdmFsdWUuaAppbmRleCAxYjRiNzJmLi5lMTk1ODYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2tleV9saXN0X3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV9rZXlfbGlzdF92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fUFJPUEVSVFlfS0VZX0xJU1RfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1BST1BFUlRZX0tFWV9MSVNUX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X2xpc3RfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfbGlzdF92YWx1ZS5oCmluZGV4IDFmZTM2N2MuLjhiMjkwMDYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfbGlzdF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfbGlzdF92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fUFJPUEVSVFlfTElTVF9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fUFJPUEVSVFlfTElTVF9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZS5oCmluZGV4IDMzM2RjZTMuLmMyMjAxMGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9QUk9QRVJUWV9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fUFJPUEVSVFlfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfaXNfZXF1YWxfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfaXNfZXF1YWxfdGVzdC5jYwppbmRleCBkNjE5ODcxLi5hZmE5MWQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX2lzX2VxdWFsX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV9pc19lcXVhbF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9hYnNvbHV0ZV91cmxfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vZmlsdGVyX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKQEAgLTIyLDkgKzIwLDkgQEAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20va2V5d29yZF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9sZW5ndGhfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGluZWFyX2dyYWRpZW50X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21hcF90b19tZXNoX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21hdHJpeF9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tZWRpYV9mZWF0dXJlX2tleXdvcmRfdmFsdWUuaCIKLSNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL251bWJlcl92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wZXJjZW50YWdlX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Byb3BlcnR5X2RlZmluaXRpb25zLmgiCkBAIC02MDAsNDQgKzU5OCw0NCBAQAogCiBURVNUKFByb3BlcnR5VmFsdWVJc0VxdWFsVGVzdCwgRmlsdGVyTGlzdHNBcmVFcXVhbCkgewogICBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6QnVpbGRlciBmaWx0ZXJfbGlzdF9hOwotICBmaWx0ZXJfbGlzdF9hLnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgIGZpbHRlcl9saXN0X2EucHVzaF9iYWNrKG5ldyBNYXBUb01lc2hGdW5jdGlvbigKICAgICAgIG5ldyBVUkxWYWx1ZSgic29tZW1lc2gubXNoIiksCi0gICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDAuNzA3MDdmLCA2LjI4ZiwKLSAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCA5LjBmLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIDEuMGYsIDAuMDc4NzhmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgMC43MDcwN2YsCisgICAgICA2LjI4ZiwgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDkuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsIDEuMGYsIDAuMDc4NzhmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0TW9ub3Njb3BpYygpKSk7Ci0gIGZpbHRlcl9saXN0X2EucHVzaF9iYWNrKG5ldyBNVE1GdW5jdGlvbigKKyAgZmlsdGVyX2xpc3RfYS5wdXNoX2JhY2sobmV3IE1hcFRvTWVzaEZ1bmN0aW9uKAogICAgICAgbmV3IFVSTFZhbHVlKCJzcGhlcmUubXNoIiksCi0gICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDAuNjc2ZiwgNi4yOGYsCisgICAgICBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDAuNjc2ZiwKKyAgICAgIDYuMjhmLCBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCisgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7CisgIGZpbHRlcl9saXN0X2EucHVzaF9iYWNrKG5ldyBNYXBUb01lc2hGdW5jdGlvbigKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjprRXF1aXJlY3Rhbmd1bGFyLCAwLjY3NmYsIDYuMjhmLAogICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCiAgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7Ci0gIGZpbHRlcl9saXN0X2EucHVzaF9iYWNrKAotICAgICAgbmV3IE1UTUZ1bmN0aW9uKE1UTUZ1bmN0aW9uOjprRXF1aXJlY3Rhbmd1bGFyLCAwLjY3NmYsIDYuMjhmLAotICAgICAgICAgICAgICAgICAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7CiAgIHNjb3BlZF9yZWZwdHI8RmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU+IHZhbHVlX2EoCiAgICAgICBuZXcgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUoZmlsdGVyX2xpc3RfYS5QYXNzKCkpKTsKIAogICBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6QnVpbGRlciBmaWx0ZXJfbGlzdF9iOwotICBmaWx0ZXJfbGlzdF9iLnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgIGZpbHRlcl9saXN0X2IucHVzaF9iYWNrKG5ldyBNYXBUb01lc2hGdW5jdGlvbigKICAgICAgIG5ldyBVUkxWYWx1ZSgic29tZW1lc2gubXNoIiksCi0gICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDAuNzA3MDdmLCA2LjI4ZiwKLSAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCA5LjBmLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgIDEuMGYsIDAuMDc4NzhmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgMC43MDcwN2YsCisgICAgICA2LjI4ZiwgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDkuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsIDEuMGYsIDAuMDc4NzhmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0TW9ub3Njb3BpYygpKSk7Ci0gIGZpbHRlcl9saXN0X2IucHVzaF9iYWNrKG5ldyBNVE1GdW5jdGlvbigKKyAgZmlsdGVyX2xpc3RfYi5wdXNoX2JhY2sobmV3IE1hcFRvTWVzaEZ1bmN0aW9uKAogICAgICAgbmV3IFVSTFZhbHVlKCJzcGhlcmUubXNoIiksCi0gICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDAuNjc2ZiwgNi4yOGYsCisgICAgICBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDAuNjc2ZiwKKyAgICAgIDYuMjhmLCBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKKyAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCisgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7CisgIGZpbHRlcl9saXN0X2IucHVzaF9iYWNrKG5ldyBNYXBUb01lc2hGdW5jdGlvbigKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjprRXF1aXJlY3Rhbmd1bGFyLCAwLjY3NmYsIDYuMjhmLAogICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCiAgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7Ci0gIGZpbHRlcl9saXN0X2IucHVzaF9iYWNrKAotICAgICAgbmV3IE1UTUZ1bmN0aW9uKE1UTUZ1bmN0aW9uOjprRXF1aXJlY3Rhbmd1bGFyLCAwLjY3NmYsIDYuMjhmLAotICAgICAgICAgICAgICAgICAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7CiAgIHNjb3BlZF9yZWZwdHI8RmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU+IHZhbHVlX2IoCiAgICAgICBuZXcgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWUoZmlsdGVyX2xpc3RfYi5QYXNzKCkpKTsKIApAQCAtNjQ2LDkgKzY0NCw5IEBACiAKIFRFU1QoUHJvcGVydHlWYWx1ZUlzRXF1YWxUZXN0LCBGaWx0ZXJMaXN0c0FyZU5vdEVxdWFsKSB7CiAgIEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlOjpCdWlsZGVyIGZpbHRlcl9saXN0X2E7Ci0gIGZpbHRlcl9saXN0X2EucHVzaF9iYWNrKG5ldyBNVE1GdW5jdGlvbigKKyAgZmlsdGVyX2xpc3RfYS5wdXNoX2JhY2sobmV3IE1hcFRvTWVzaEZ1bmN0aW9uKAogICAgICAgbmV3IFVSTFZhbHVlKCJmb3JtYXQubXNoIiksCi0gICAgICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDguNWYsIDMuMTRmLAorICAgICAgTWFwVG9NZXNoRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCkuUGFzcygpLCA4LjVmLCAzLjE0ZiwKICAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAyLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAogICAgICAgICAgICAgICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpLAogICAgICAgS2V5d29yZFZhbHVlOjpHZXRNb25vc2NvcGljKCkpKTsKQEAgLTY1Niw5ICs2NTQsOSBAQAogICAgICAgbmV3IEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKGZpbHRlcl9saXN0X2EuUGFzcygpKSk7CiAKICAgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU6OkJ1aWxkZXIgZmlsdGVyX2xpc3RfYjsKLSAgZmlsdGVyX2xpc3RfYi5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uKAorICBmaWx0ZXJfbGlzdF9iLnB1c2hfYmFjayhuZXcgTWFwVG9NZXNoRnVuY3Rpb24oCiAgICAgICBuZXcgVVJMVmFsdWUoImZvcm1hdC5tc2giKSwKLSAgICAgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgOC41ZiwgMy4xNGYsCisgICAgICBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDguNWYsIDMuMTRmLAogICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCiAgICAgICBLZXl3b3JkVmFsdWU6OkdldE1vbm9zY29waWMoKSkpOwpAQCAtNjY4LDE4ICs2NjYsMTggQEAKICAgRVhQRUNUX0ZBTFNFKHZhbHVlX2EtPkVxdWFscygqdmFsdWVfYikpOwogCiAgIEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlOjpCdWlsZGVyIGZpbHRlcl9saXN0X2M7Ci0gIGZpbHRlcl9saXN0X2MucHVzaF9iYWNrKAotICAgICAgbmV3IE1UTUZ1bmN0aW9uKE1UTUZ1bmN0aW9uOjprRXF1aXJlY3Rhbmd1bGFyLCA4LjVmLCAzLjE0ZiwKLSAgICAgICAgICAgICAgICAgICAgICBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMi4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCi0gICAgICAgICAgICAgICAgICAgICAgS2V5d29yZFZhbHVlOjpHZXRNb25vc2NvcGljKCkpKTsKKyAgZmlsdGVyX2xpc3RfYy5wdXNoX2JhY2sobmV3IE1hcFRvTWVzaEZ1bmN0aW9uKAorICAgICAgTWFwVG9NZXNoRnVuY3Rpb246OmtFcXVpcmVjdGFuZ3VsYXIsIDguNWYsIDMuMTRmLAorICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDIuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCisgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCisgICAgICBLZXl3b3JkVmFsdWU6OkdldE1vbm9zY29waWMoKSkpOwogICBzY29wZWRfcmVmcHRyPEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlPiB2YWx1ZV9jKAogICAgICAgbmV3IEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKGZpbHRlcl9saXN0X2MuUGFzcygpKSk7CiAKICAgRmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU6OkJ1aWxkZXIgZmlsdGVyX2xpc3RfZDsKLSAgZmlsdGVyX2xpc3RfZC5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uKAorICBmaWx0ZXJfbGlzdF9kLnB1c2hfYmFjayhuZXcgTWFwVG9NZXNoRnVuY3Rpb24oCiAgICAgICBuZXcgVVJMVmFsdWUoImZvcm1hdC5tc2giKSwKLSAgICAgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgOC41ZiwgMy4xNGYsCisgICAgICBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDguNWYsIDMuMTRmLAogICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDIuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCiAgICAgICBLZXl3b3JkVmFsdWU6OkdldE1vbm9zY29waWMoKSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV90b19zdHJpbmdfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdG9fc3RyaW5nX3Rlc3QuY2MKaW5kZXggZWE3Y2M4ZS4uM2U5MTcyOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV90b19zdHJpbmdfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3RvX3N0cmluZ190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZS5oIgogCkBAIC0yNSw5ICsyMyw5IEBACiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tYXBfdG9fbWVzaF9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9tYXRyaXhfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcGVyY2VudGFnZV92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV9kZWZpbml0aW9ucy5oIgpAQCAtMzQ4LDEwICszNDYsMTAgQEAKICAgRVhQRUNUX0VRKHByb3BlcnR5LT5Ub1N0cmluZygpLCAidXJsKGZvby5wbmcpIik7CiB9CiAKLVRFU1QoUHJvcGVydHlWYWx1ZVRvU3RyaW5nVGVzdCwgTVRNRnVuY3Rpb25TaW5nbGVNZXNoKSB7Ci0gIHNjb3BlZF9wdHI8TVRNRnVuY3Rpb24+IGZ1bmN0aW9uKG5ldyBNVE1GdW5jdGlvbigKK1RFU1QoUHJvcGVydHlWYWx1ZVRvU3RyaW5nVGVzdCwgTWFwVG9NZXNoRnVuY3Rpb25TaW5nbGVNZXNoKSB7CisgIHNjb3BlZF9wdHI8TWFwVG9NZXNoRnVuY3Rpb24+IGZ1bmN0aW9uKG5ldyBNYXBUb01lc2hGdW5jdGlvbigKICAgICAgIG5ldyBVUkxWYWx1ZSgiLS5tc2giKSwKLSAgICAgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgMi41ZiwgMy4xNGYsCisgICAgICBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDIuNWYsIDMuMTRmLAogICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCiAgICAgICBLZXl3b3JkVmFsdWU6OkdldE1vbm9zY29waWMoKSkpOwpAQCAtMzYzLDEyICszNjEsMTIgQEAKICAgICAgIGZ1bmN0aW9uLT5Ub1N0cmluZygpKTsKIH0KIAotVEVTVChQcm9wZXJ0eVZhbHVlVG9TdHJpbmdUZXN0LCBNVE1GdW5jdGlvbkVxdWlyZWN0YW5ndWxhcikgewotICBzY29wZWRfcHRyPE1UTUZ1bmN0aW9uPiBmdW5jdGlvbigKLSAgICAgIG5ldyBNVE1GdW5jdGlvbihNVE1GdW5jdGlvbjo6a0VxdWlyZWN0YW5ndWxhciwgMi41ZiwgMy4xNGYsCi0gICAgICAgICAgICAgICAgICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpLAotICAgICAgICAgICAgICAgICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0TW9ub3Njb3BpYygpKSk7CitURVNUKFByb3BlcnR5VmFsdWVUb1N0cmluZ1Rlc3QsIE1hcFRvTWVzaEZ1bmN0aW9uRXF1aXJlY3Rhbmd1bGFyKSB7CisgIHNjb3BlZF9wdHI8TWFwVG9NZXNoRnVuY3Rpb24+IGZ1bmN0aW9uKG5ldyBNYXBUb01lc2hGdW5jdGlvbigKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjprRXF1aXJlY3Rhbmd1bGFyLCAyLjVmLCAzLjE0ZiwKKyAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpLAorICAgICAgS2V5d29yZFZhbHVlOjpHZXRNb25vc2NvcGljKCkpKTsKICAgRVhQRUNUX0VRKAogICAgICAgIm1hcC10by1tZXNoKGVxdWlyZWN0YW5ndWxhciwgIgogICAgICAgIjIuNXJhZCAzLjE0cmFkLCAiCkBAIC0zNzcsMTcgKzM3NSwxNyBAQAogICAgICAgZnVuY3Rpb24tPlRvU3RyaW5nKCkpOwogfQogCi1URVNUKFByb3BlcnR5VmFsdWVUb1N0cmluZ1Rlc3QsIE1UTUZ1bmN0aW9uV2l0aFJlc29sdXRpb25NYXRjaGVkTWVzaGVzKSB7Ci0gIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciBtZXNoZXM7Ci0gIG1lc2hlcy5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2goCitURVNUKFByb3BlcnR5VmFsdWVUb1N0cmluZ1Rlc3QsIE1hcFRvTWVzaEZ1bmN0aW9uV2l0aFJlc29sdXRpb25NYXRjaGVkTWVzaGVzKSB7CisgIE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciBtZXNoZXM7CisgIG1lc2hlcy5wdXNoX2JhY2sobmV3IE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2goCiAgICAgICAxOTIwLCAyMDAwMDAwLCBuZXcgVVJMVmFsdWUoImEubXNoIikpKTsKLSAgbWVzaGVzLnB1c2hfYmFjaygKLSAgICAgIG5ldyBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoKDY0MCwgNSwgbmV3IFVSTFZhbHVlKCJiLm1zaCIpKSk7Ci0gIHNjb3BlZF9wdHI8TVRNRnVuY3Rpb24+IGZ1bmN0aW9uKAotICAgICAgbmV3IE1UTUZ1bmN0aW9uKG5ldyBVUkxWYWx1ZSgiLS5tc2giKSwgbWVzaGVzLlBhc3MoKSwgMjguNWYsIDMuMTRmLAotICAgICAgICAgICAgICAgICAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKLSAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7CisgIG1lc2hlcy5wdXNoX2JhY2sobmV3IE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2goCisgICAgICA2NDAsIDUsIG5ldyBVUkxWYWx1ZSgiYi5tc2giKSkpOworICBzY29wZWRfcHRyPE1hcFRvTWVzaEZ1bmN0aW9uPiBmdW5jdGlvbihuZXcgTWFwVG9NZXNoRnVuY3Rpb24oCisgICAgICBuZXcgVVJMVmFsdWUoIi0ubXNoIiksIG1lc2hlcy5QYXNzKCksIDI4LjVmLCAzLjE0ZiwKKyAgICAgIGdsbTo6bWF0NCgxLjBmLCAwLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLAorICAgICAgICAgICAgICAgIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDEuMGYpLAorICAgICAgS2V5d29yZFZhbHVlOjpHZXRTdGVyZW9zY29waWNMZWZ0UmlnaHQoKSkpOwogICBFWFBFQ1RfRVEoCiAgICAgICAibWFwLXRvLW1lc2godXJsKC0ubXNoKSAxOTIwIDIwMDAwMDAgdXJsKGEubXNoKSA2NDAgNSB1cmwoYi5tc2gpLCAiCiAgICAgICAiMjguNXJhZCAzLjE0cmFkLCAiCkBAIC0zOTgsMjcgKzM5NiwyNyBAQAogCiBURVNUKFByb3BlcnR5VmFsdWVUb1N0cmluZ1Rlc3QsIEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlKSB7CiAgIEZpbHRlckZ1bmN0aW9uTGlzdFZhbHVlOjpCdWlsZGVyIGZpbHRlcl9saXN0OwotICBmaWx0ZXJfbGlzdC5wdXNoX2JhY2sobmV3IE1UTUZ1bmN0aW9uKAorICBmaWx0ZXJfbGlzdC5wdXNoX2JhY2sobmV3IE1hcFRvTWVzaEZ1bmN0aW9uKAogICAgICAgbmV3IFVSTFZhbHVlKCItLm1zaCIpLAotICAgICAgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCkuUGFzcygpLCA4LjVmLCAzLjE0ZiwKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgOC41ZiwgMy4xNGYsCiAgICAgICBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKICAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0TW9ub3Njb3BpYygpKSk7Ci0gIGZpbHRlcl9saXN0LnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgIGZpbHRlcl9saXN0LnB1c2hfYmFjayhuZXcgTWFwVG9NZXNoRnVuY3Rpb24oCiAgICAgICBuZXcgVVJMVmFsdWUoIndvcmxkLm1zaCIpLAotICAgICAgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCkuUGFzcygpLCA4LjVmLCAzOS4wZiwKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgOC41ZiwgMzkuMGYsCiAgICAgICBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKICAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0TW9ub3Njb3BpYygpKSk7Ci0gIGZpbHRlcl9saXN0LnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgIGZpbHRlcl9saXN0LnB1c2hfYmFjayhuZXcgTWFwVG9NZXNoRnVuY3Rpb24oCiAgICAgICBuZXcgVVJMVmFsdWUoInN0ZXJlb3Njb3BpYy13b3JsZC5tc2giKSwKLSAgICAgIE1UTUZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgOC41ZiwgMzkuMGYsCisgICAgICBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIoKS5QYXNzKCksIDguNWYsIDM5LjBmLAogICAgICAgZ2xtOjptYXQ0KDEuMGYsIDAuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDEuMGYsIDAuMGYsIDAuMGYsIDAuMGYsIDAuMGYsCiAgICAgICAgICAgICAgICAgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMS4wZiksCiAgICAgICBLZXl3b3JkVmFsdWU6OkdldFN0ZXJlb3Njb3BpY0xlZnRSaWdodCgpKSk7Ci0gIGZpbHRlcl9saXN0LnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24oCisgIGZpbHRlcl9saXN0LnB1c2hfYmFjayhuZXcgTWFwVG9NZXNoRnVuY3Rpb24oCiAgICAgICBuZXcgVVJMVmFsdWUoInN0ZXJlb3Njb3BpYy10b3AtYm90dG9tLXdvcmxkLm1zaCIpLAotICAgICAgTVRNRnVuY3Rpb246OlJlc29sdXRpb25NYXRjaGVkTWVzaExpc3RCdWlsZGVyKCkuUGFzcygpLCA4LjVmLCAzOS4wZiwKKyAgICAgIE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlcigpLlBhc3MoKSwgOC41ZiwgMzkuMGYsCiAgICAgICBnbG06Om1hdDQoMS4wZiwgMC4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMS4wZiwgMC4wZiwgMC4wZiwgMC4wZiwgMC4wZiwKICAgICAgICAgICAgICAgICAxLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAwLjBmLCAxLjBmKSwKICAgICAgIEtleXdvcmRWYWx1ZTo6R2V0U3RlcmVvc2NvcGljVG9wQm90dG9tKCkpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvci5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvci5jYwppbmRleCAxMmQyMzRiLi5jY2MwMzYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgKaW5kZXggMzQ1N2E5Zi4uMzg2ZWE1YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9QUk9QRVJUWV9WQUxVRV9WSVNJVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9QUk9QRVJUWV9WQUxVRV9WSVNJVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Byb3BlcnR5X3ZhbHVlX3Zpc2l0b3JfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvcl90ZXN0LmNjCmluZGV4IDFmZjEzOGQuLmIxOTc3MDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHJvcGVydHlfdmFsdWVfdmlzaXRvcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV92YWx1ZV92aXNpdG9yLmgiCiAKQEAgLTI4LDggKzI2LDggQEAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbGVuZ3RoX3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2xpbmVhcl9ncmFkaWVudF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9sb2NhbF9zcmNfdmFsdWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWFwX3RvX21lc2hfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbWVkaWFfZmVhdHVyZV9rZXl3b3JkX3ZhbHVlLmgiCi0jaW5jbHVkZSAiY29iYWx0L2Nzc29tL210bV9mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcGVyY2VudGFnZV92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9wcm9wZXJ0eV9rZXlfbGlzdF92YWx1ZS5oIgpAQCAtMTE1LDE0ICsxMTMsMTQgQEAKIH0KIAogVEVTVChQcm9wZXJ0eVZhbHVlVmlzaXRvclRlc3QsIFZpc2l0c0ZpbHRlckxpc3RWYWx1ZSkgewotICBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoTGlzdEJ1aWxkZXIgcmVzTXM7Ci0gIHJlc01zLnB1c2hfYmFjaygKLSAgICAgIG5ldyBNVE1GdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoKDIyLCAyMiwgbmV3IFVSTFZhbHVlKCJhLm1zaCIpKSk7CisgIE1hcFRvTWVzaEZ1bmN0aW9uOjpSZXNvbHV0aW9uTWF0Y2hlZE1lc2hMaXN0QnVpbGRlciByZXNNczsKKyAgcmVzTXMucHVzaF9iYWNrKG5ldyBNYXBUb01lc2hGdW5jdGlvbjo6UmVzb2x1dGlvbk1hdGNoZWRNZXNoKAorICAgICAgMjIsIDIyLCBuZXcgVVJMVmFsdWUoImEubXNoIikpKTsKIAogICBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZTo6QnVpbGRlciBidWlsZGVyOwotICBidWlsZGVyLnB1c2hfYmFjayhuZXcgTVRNRnVuY3Rpb24obmV3IFVSTFZhbHVlKCJwLm1zaCIpLCByZXNNcy5QYXNzKCksIDEyMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDYwLCBnbG06Om1hdDQoMS4wZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkVmFsdWU6OkdldE1vbm9zY29waWMoKSkpOworICBidWlsZGVyLnB1c2hfYmFjayhuZXcgTWFwVG9NZXNoRnVuY3Rpb24obmV3IFVSTFZhbHVlKCJwLm1zaCIpLCByZXNNcy5QYXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAsIDYwLCBnbG06Om1hdDQoMS4wZiksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLZXl3b3JkVmFsdWU6OkdldE1vbm9zY29waWMoKSkpOwogCiAgIHNjb3BlZF9yZWZwdHI8RmlsdGVyRnVuY3Rpb25MaXN0VmFsdWU+IGZpbHRlcl9saXN0X3ZhbHVlID0KICAgICAgIG5ldyBGaWx0ZXJGdW5jdGlvbkxpc3RWYWx1ZShidWlsZGVyLlBhc3MoKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fY2xhc3MuaAppbmRleCBlOWRlMzVjLi5hMDhjMWFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzcy5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2NsYXNzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9QU0VVRE9fQ0xBU1NfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1BTRVVET19DTEFTU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fY2xhc3NfbmFtZXMuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzc19uYW1lcy5jYwppbmRleCAyYTI1ODZlLi4xMjM0ZjlhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzc19uYW1lcy5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzc19uYW1lcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcHNldWRvX2NsYXNzX25hbWVzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2NsYXNzX25hbWVzLmggYi9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzc19uYW1lcy5oCmluZGV4IDI3ZGZhMjUuLjNkMTc5N2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2NsYXNzX25hbWVzLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fY2xhc3NfbmFtZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1BTRVVET19DTEFTU19OQU1FU19IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fUFNFVURPX0NMQVNTX05BTUVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzc190eXBlLmggYi9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19jbGFzc190eXBlLmgKaW5kZXggY2MwYWM0NC4uNTY4MGE1OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fY2xhc3NfdHlwZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2NsYXNzX3R5cGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1BTRVVET19DTEFTU19UWVBFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9QU0VVRE9fQ0xBU1NfVFlQRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fZWxlbWVudC5oCmluZGV4IGEzYjA0YWMuLjY5NzFlNDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9QU0VVRE9fRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fUFNFVURPX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2VsZW1lbnRfbmFtZXMuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19lbGVtZW50X25hbWVzLmNjCmluZGV4IDE4NTBhOGIuLjZiOGVlZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2VsZW1lbnRfbmFtZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fZWxlbWVudF9uYW1lcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vcHNldWRvX2VsZW1lbnRfbmFtZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fZWxlbWVudF9uYW1lcy5oIGIvc3JjL2NvYmFsdC9jc3NvbS9wc2V1ZG9fZWxlbWVudF9uYW1lcy5oCmluZGV4IGE5MWY5MzAuLjZkNDM2N2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcHNldWRvX2VsZW1lbnRfbmFtZXMuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3BzZXVkb19lbGVtZW50X25hbWVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9QU0VVRE9fRUxFTUVOVF9OQU1FU19IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fUFNFVURPX0VMRU1FTlRfTkFNRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcmFkaWFsX2dyYWRpZW50X3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9yYWRpYWxfZ3JhZGllbnRfdmFsdWUuY2MKaW5kZXggZDU4NTkxNS4uZDE4NDBhYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9yYWRpYWxfZ3JhZGllbnRfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9yYWRpYWxfZ3JhZGllbnRfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3JhZGlhbF9ncmFkaWVudF92YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3JhZGlhbF9ncmFkaWVudF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9yYWRpYWxfZ3JhZGllbnRfdmFsdWUuaAppbmRleCBmOTkwOWFjLi45YWUwZGZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3JhZGlhbF9ncmFkaWVudF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcmFkaWFsX2dyYWRpZW50X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9SQURJQUxfR1JBRElFTlRfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1JBRElBTF9HUkFESUVOVF9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9yYXRpb192YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcmF0aW9fdmFsdWUuY2MKaW5kZXggMmIwOWUyMS4uZDE3ZDYwOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9yYXRpb192YWx1ZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3JhdGlvX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9yYXRpb192YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3JhdGlvX3ZhbHVlLmggYi9zcmMvY29iYWx0L2Nzc29tL3JhdGlvX3ZhbHVlLmgKaW5kZXggNTFlM2NiMi4uM2E5ZDZkYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9yYXRpb192YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcmF0aW9fdmFsdWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1JBVElPX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9SQVRJT19WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9yZXNvbHV0aW9uX3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9yZXNvbHV0aW9uX3ZhbHVlLmNjCmluZGV4IGNmM2I5MDAuLjQwNjk5YTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcmVzb2x1dGlvbl92YWx1ZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3Jlc29sdXRpb25fdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3Jlc29sdXRpb25fdmFsdWUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9yZXNvbHV0aW9uX3ZhbHVlLmggYi9zcmMvY29iYWx0L2Nzc29tL3Jlc29sdXRpb25fdmFsdWUuaAppbmRleCAyZmFkYmZiLi42YTUzN2YwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Jlc29sdXRpb25fdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3Jlc29sdXRpb25fdmFsdWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1JFU09MVVRJT05fVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1JFU09MVVRJT05fVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcmdiYV9jb2xvcl92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcmdiYV9jb2xvcl92YWx1ZS5jYwppbmRleCAzNmY1MmFkLi41Y2QyMzU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3JnYmFfY29sb3JfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9yZ2JhX2NvbG9yX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9yZ2JhX2NvbG9yX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vcmdiYV9jb2xvcl92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9yZ2JhX2NvbG9yX3ZhbHVlLmgKaW5kZXggMTA3YjJjYi4uYTNhYTAxYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9yZ2JhX2NvbG9yX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9yZ2JhX2NvbG9yX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9SR0JBX0NPTE9SX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9SR0JBX0NPTE9SX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3JvdGF0ZV9mdW5jdGlvbi5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vcm90YXRlX2Z1bmN0aW9uLmNjCmluZGV4IDgzZTk0MzUuLjYyMWU5OGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vcm90YXRlX2Z1bmN0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vcm90YXRlX2Z1bmN0aW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9yb3RhdGVfZnVuY3Rpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9yb3RhdGVfZnVuY3Rpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vcm90YXRlX2Z1bmN0aW9uLmgKaW5kZXggNmUzZGY5NS4uMzEzM2E1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9yb3RhdGVfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3JvdGF0ZV9mdW5jdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fUk9UQVRFX0ZVTkNUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9ST1RBVEVfRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2NhbGVfZnVuY3Rpb24uY2MgYi9zcmMvY29iYWx0L2Nzc29tL3NjYWxlX2Z1bmN0aW9uLmNjCmluZGV4IDJiMTQzM2MuLmI3NzVkYzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc2NhbGVfZnVuY3Rpb24uY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zY2FsZV9mdW5jdGlvbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vc2NhbGVfZnVuY3Rpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zY2FsZV9mdW5jdGlvbi5oIGIvc3JjL2NvYmFsdC9jc3NvbS9zY2FsZV9mdW5jdGlvbi5oCmluZGV4IDNlNTc3YTIuLmFlODRhODAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc2NhbGVfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3NjYWxlX2Z1bmN0aW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9TQ0FMRV9GVU5DVElPTl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fU0NBTEVfRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2NvcGVkX2xpc3RfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vc2NvcGVkX2xpc3RfdmFsdWUuaAppbmRleCA0OGQwMDRjLi4yOGU4Yjk5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Njb3BlZF9saXN0X3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zY29wZWRfbGlzdF92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fU0NPUEVEX0xJU1RfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1NDT1BFRF9MSVNUX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Njb3BlZF9yZWZfbGlzdF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9zY29wZWRfcmVmX2xpc3RfdmFsdWUuaAppbmRleCBlYjAzMTM3Li41NjZmMjVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3Njb3BlZF9yZWZfbGlzdF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2NvcGVkX3JlZl9saXN0X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9TQ09QRURfUkVGX0xJU1RfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1NDT1BFRF9SRUZfTElTVF9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvci5oCmluZGV4IGFiZjZkM2EuLjcyOGFmOWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9TRUxFQ1RPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fU0VMRUNUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdGVzdC5jYwppbmRleCBjMTIwZGI4Li42NGMwY2Q5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9zZWxlY3Rvci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3RyZWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3RyZWUuY2MKaW5kZXggZWRmMzk3YS4uOWU1MjBmNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3RyZWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZS5oCmluZGV4IGI3YWI2MjYuLjExOTJkM2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdHJlZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fU0VMRUNUT1JfVFJFRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fU0VMRUNUT1JfVFJFRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl90cmVlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3RyZWVfdGVzdC5jYwppbmRleCBiMDA2ZjRkLi5lZjhjMmE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3RyZWVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3RyZWVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3NzX3BhcnNlci9wYXJzZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vY3NzX3N0eWxlX3J1bGUuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdmlzaXRvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl92aXNpdG9yLmgKaW5kZXggNDM0YTY3Yy4uNWQ2ZTljMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl92aXNpdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zZWxlY3Rvcl92aXNpdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9TRUxFQ1RPUl9WSVNJVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9TRUxFQ1RPUl9WSVNJVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3NlbGVjdG9yX3Zpc2l0b3JfdGVzdC5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdmlzaXRvcl90ZXN0LmNjCmluZGV4IGVjZDk4ODUuLmZiNDY2OWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdmlzaXRvcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2VsZWN0b3JfdmlzaXRvcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9zZWxlY3Rvcl92aXNpdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2hhZG93X3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9zaGFkb3dfdmFsdWUuY2MKaW5kZXggYjE3MmU2Ny4uNGU1ZjY0ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9zaGFkb3dfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zaGFkb3dfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3NoYWRvd192YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3NoYWRvd192YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS9zaGFkb3dfdmFsdWUuaAppbmRleCA2ZTdmNjAyLi5mY2M0MzNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3NoYWRvd192YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc2hhZG93X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9TSEFET1dfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1NIQURPV19WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zaW1wbGVfc2VsZWN0b3IuaCBiL3NyYy9jb2JhbHQvY3Nzb20vc2ltcGxlX3NlbGVjdG9yLmgKaW5kZXggMDQ4NzQ3NC4uYzI5ODQ5MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9zaW1wbGVfc2VsZWN0b3IuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3NpbXBsZV9zZWxlY3Rvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fU0lNUExFX1NFTEVDVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9TSU1QTEVfU0VMRUNUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc2ltcGxlX3NlbGVjdG9yX3R5cGUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vc2ltcGxlX3NlbGVjdG9yX3R5cGUuaAppbmRleCA3NzQyY2M1Li5jY2I3YjE4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3NpbXBsZV9zZWxlY3Rvcl90eXBlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zaW1wbGVfc2VsZWN0b3JfdHlwZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fU0lNUExFX1NFTEVDVE9SX1RZUEVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1NJTVBMRV9TRUxFQ1RPUl9UWVBFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3NwZWNpZmljaXR5LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9zcGVjaWZpY2l0eS5jYwppbmRleCBkYzY5MDYzLi41ZDRmMjU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3NwZWNpZmljaXR5LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc3BlY2lmaWNpdHkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3NwZWNpZmljaXR5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc3BlY2lmaWNpdHkuaCBiL3NyYy9jb2JhbHQvY3Nzb20vc3BlY2lmaWNpdHkuaAppbmRleCAyMTRiMmI4Li42YzFkMjlmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3NwZWNpZmljaXR5LmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zcGVjaWZpY2l0eS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fU1BFQ0lGSUNJVFlfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1NQRUNJRklDSVRZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3NwZWNpZmljaXR5X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3NwZWNpZmljaXR5X3Rlc3QuY2MKaW5kZXggZjE1Y2YyZi4uODJmMTU4MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS9zcGVjaWZpY2l0eV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc3BlY2lmaWNpdHlfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vc3BlY2lmaWNpdHkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zdHJpbmdfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3N0cmluZ192YWx1ZS5jYwppbmRleCBmNDZjMWU3Li4zODkzZTQ4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3N0cmluZ192YWx1ZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3N0cmluZ192YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vc3RyaW5nX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc3RyaW5nX3ZhbHVlLmggYi9zcmMvY29iYWx0L2Nzc29tL3N0cmluZ192YWx1ZS5oCmluZGV4IGVlMTkyODguLmI1MzJmMTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc3RyaW5nX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zdHJpbmdfdmFsdWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1NUUklOR19WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fU1RSSU5HX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9zdHlsZV9zaGVldC5jYwppbmRleCA3Y2ExOTAzLi5hMzBlNDc3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vc3R5bGVfc2hlZXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc3R5bGVfc2hlZXQuaCBiL3NyYy9jb2JhbHQvY3Nzb20vc3R5bGVfc2hlZXQuaAppbmRleCAwZTFkMTAwLi5iODAzMGU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0LmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS9zdHlsZV9zaGVldC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fU1RZTEVfU0hFRVRfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1NUWUxFX1NIRUVUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0LmlkbCBiL3NyYy9jb2JhbHQvY3Nzb20vc3R5bGVfc2hlZXQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3YmQxMWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0LmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jdGhlLXN0eWxlc2hlZXQtaW50ZXJmYWNlCisKK2ludGVyZmFjZSBTdHlsZVNoZWV0IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zdHlsZV9zaGVldF9saXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS9zdHlsZV9zaGVldF9saXN0LmNjCmluZGV4IDMwYTczNzkuLjFiZTliNDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vc3R5bGVfc2hlZXRfbGlzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zdHlsZV9zaGVldF9saXN0LmggYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuaAppbmRleCA5ZjI2YWJiLi5lNGE4ZDZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1NUWUxFX1NIRUVUX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1NUWUxFX1NIRUVUX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vc3R5bGVfc2hlZXRfbGlzdC5pZGwgYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkxNWEyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3QuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLTIwMTMxMjA1LyN0aGUtc3R5bGVzaGVldGxpc3QtaW50ZXJmYWNlCisKK2ludGVyZmFjZSBTdHlsZVNoZWV0TGlzdCB7CisgIGdldHRlciBTdHlsZVNoZWV0PyBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS9zdHlsZV9zaGVldF9saXN0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3RfdGVzdC5jYwppbmRleCBhZTM0NzU2Li5kNTI0NDQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3RfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3N0eWxlX3NoZWV0X2xpc3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vc3R5bGVfc2hlZXRfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3Rlc3RpbmcvbW9ja19jc3NfcGFyc2VyLmggYi9zcmMvY29iYWx0L2Nzc29tL3Rlc3RpbmcvbW9ja19jc3NfcGFyc2VyLmgKaW5kZXggMjNjMTY5NS4uYmVhZWFkYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS90ZXN0aW5nL21vY2tfY3NzX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdGVzdGluZy9tb2NrX2Nzc19wYXJzZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1RFU1RJTkdfTU9DS19DU1NfUEFSU0VSX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9URVNUSU5HX01PQ0tfQ1NTX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS90aW1lX2xpc3RfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3RpbWVfbGlzdF92YWx1ZS5jYwppbmRleCAxMDIyMWZkLi44NzgzM2IyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RpbWVfbGlzdF92YWx1ZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3RpbWVfbGlzdF92YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxpbnR0eXBlcy5oPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3RpbWVfbGlzdF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS90aW1lX2xpc3RfdmFsdWUuaAppbmRleCAzOTQ4ZWY0Li5lMzU5NDQzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RpbWVfbGlzdF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdGltZV9saXN0X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9USU1FX0xJU1RfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1RJTUVfTElTVF9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS90aW1pbmdfZnVuY3Rpb24uY2MgYi9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbi5jYwppbmRleCBjMjQ0OTE4Li44YTQ3ZWY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdGltaW5nX2Z1bmN0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdGltaW5nX2Z1bmN0aW9uLmggYi9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbi5oCmluZGV4IDBkYWM0MTMuLjM3NTA1ZDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdGltaW5nX2Z1bmN0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90aW1pbmdfZnVuY3Rpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1RJTUlOR19GVU5DVElPTl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fVElNSU5HX0ZVTkNUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbl9saXN0X3ZhbHVlLmNjIGIvc3JjL2NvYmFsdC9jc3NvbS90aW1pbmdfZnVuY3Rpb25fbGlzdF92YWx1ZS5jYwppbmRleCAzZTkxZmRiLi5hNDNhYjAxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbl9saXN0X3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdGltaW5nX2Z1bmN0aW9uX2xpc3RfdmFsdWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbl9saXN0X3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdGltaW5nX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vdGltaW5nX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaAppbmRleCAwMjlhNjQ2Li40ZTE3ODczIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbl9saXN0X3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90aW1pbmdfZnVuY3Rpb25fbGlzdF92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fVElNSU5HX0ZVTkNUSU9OX0xJU1RfVkFMVUVfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1RJTUlOR19GVU5DVElPTl9MSVNUX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS90aW1pbmdfZnVuY3Rpb25fdGVzdC5jYwppbmRleCA4YjEzMDQ0Li4zMjgxOWY0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdGltaW5nX2Z1bmN0aW9uX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3RpbWluZ19mdW5jdGlvbi5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uLmgKaW5kZXggNDZiZGY5MS4uMDMwYjBlNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9mdW5jdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fVFJBTlNGT1JNX0ZVTkNUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9UUkFOU0ZPUk1fRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX2xpc3RfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9mdW5jdGlvbl9saXN0X3ZhbHVlLmNjCmluZGV4IDYwNmZhNTAuLjBhZmE4NTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX2xpc3RfdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb25fbGlzdF92YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb25fbGlzdF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb25fbGlzdF92YWx1ZS5oCmluZGV4IDZmNTRlYzQuLjc4YzA5NTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX2xpc3RfdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9mdW5jdGlvbl9saXN0X3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9UUkFOU0ZPUk1fRlVOQ1RJT05fTElTVF9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fVFJBTlNGT1JNX0ZVTkNUSU9OX0xJU1RfVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX3Zpc2l0b3IuaCBiL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX3Zpc2l0b3IuaAppbmRleCAxODFmYTNmLi5mMDlkZGI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9mdW5jdGlvbl92aXNpdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb25fdmlzaXRvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fVFJBTlNGT1JNX0ZVTkNUSU9OX1ZJU0lUT1JfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1RSQU5TRk9STV9GVU5DVElPTl9WSVNJVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9mdW5jdGlvbl92aXNpdG9yX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9mdW5jdGlvbl92aXNpdG9yX3Rlc3QuY2MKaW5kZXggNjgxMWE5My4uYTQxOGUzNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fZnVuY3Rpb25fdmlzaXRvcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX3Zpc2l0b3JfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdHJhbnNmb3JtX2Z1bmN0aW9uX3Zpc2l0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4LmNjIGIvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4LmNjCmluZGV4IDFjYzRjYzcuLmU1ODZlOWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX21hdHJpeC5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9tYXRyaXguY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9tYXRyaXguaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4LmggYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9tYXRyaXguaAppbmRleCA5YmZjMjM3Li5kZTZkZTJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9tYXRyaXguaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9tYXRyaXguaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1RSQU5TRk9STV9NQVRSSVhfSF8KICNkZWZpbmUgQ09CQUxUX0NTU09NX1RSQU5TRk9STV9NQVRSSVhfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX21hdHJpeF9mdW5jdGlvbl92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX21hdHJpeF9mdW5jdGlvbl92YWx1ZS5jYwppbmRleCBmOGEwMWZmLi41NzUyODNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3RyYW5zZm9ybV9tYXRyaXhfZnVuY3Rpb25fdmFsdWUuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4X2Z1bmN0aW9uX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4X2Z1bmN0aW9uX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNmb3JtX21hdHJpeF9mdW5jdGlvbl92YWx1ZS5oIGIvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4X2Z1bmN0aW9uX3ZhbHVlLmgKaW5kZXggMGY5YWFmZC4uZDgwY2ZlYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4X2Z1bmN0aW9uX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2Zvcm1fbWF0cml4X2Z1bmN0aW9uX3ZhbHVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9UUkFOU0ZPUk1fTUFUUklYX0ZVTkNUSU9OX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9UUkFOU0ZPUk1fTUFUUklYX0ZVTkNUSU9OX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3RyYW5zbGF0ZV9mdW5jdGlvbi5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNsYXRlX2Z1bmN0aW9uLmNjCmluZGV4IGM5NzdkOGEuLmYwMjNlODkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNsYXRlX2Z1bmN0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNsYXRlX2Z1bmN0aW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS90cmFuc2xhdGVfZnVuY3Rpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2xhdGVfZnVuY3Rpb24uaCBiL3NyYy9jb2JhbHQvY3Nzb20vdHJhbnNsYXRlX2Z1bmN0aW9uLmgKaW5kZXggMWY5MzkyNy4uZTcwNDhlNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS90cmFuc2xhdGVfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2Nzc29tL3RyYW5zbGF0ZV9mdW5jdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fVFJBTlNMQVRFX0ZVTkNUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9UUkFOU0xBVEVfRlVOQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdHlwZV9zZWxlY3Rvci5jYyBiL3NyYy9jb2JhbHQvY3Nzb20vdHlwZV9zZWxlY3Rvci5jYwppbmRleCA2ZWUzYTIwLi5mNjE2YjQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3R5cGVfc2VsZWN0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90eXBlX3NlbGVjdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS90eXBlX3NlbGVjdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdHlwZV9zZWxlY3Rvci5oIGIvc3JjL2NvYmFsdC9jc3NvbS90eXBlX3NlbGVjdG9yLmgKaW5kZXggYTE5MTM0NS4uMGIxOWRjOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS90eXBlX3NlbGVjdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS90eXBlX3NlbGVjdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9DU1NPTV9UWVBFX1NFTEVDVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9DU1NPTV9UWVBFX1NFTEVDVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3VuaWNvZGVfcmFuZ2VfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3VuaWNvZGVfcmFuZ2VfdmFsdWUuY2MKaW5kZXggODZhZjIwOS4uMTlmMDliNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS91bmljb2RlX3JhbmdlX3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdW5pY29kZV9yYW5nZV92YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdW5pY29kZV9yYW5nZV92YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3VuaWNvZGVfcmFuZ2VfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vdW5pY29kZV9yYW5nZV92YWx1ZS5oCmluZGV4IDFjMThjYTcuLjA3ZDhjNTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdW5pY29kZV9yYW5nZV92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdW5pY29kZV9yYW5nZV92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fVU5JQ09ERV9SQU5HRV9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fVU5JQ09ERV9SQU5HRV9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS91bml2ZXJzYWxfc2VsZWN0b3IuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3VuaXZlcnNhbF9zZWxlY3Rvci5jYwppbmRleCA3YmY1YTUzLi4wOGY2NzcyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3VuaXZlcnNhbF9zZWxlY3Rvci5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3VuaXZlcnNhbF9zZWxlY3Rvci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdW5pdmVyc2FsX3NlbGVjdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdW5pdmVyc2FsX3NlbGVjdG9yLmggYi9zcmMvY29iYWx0L2Nzc29tL3VuaXZlcnNhbF9zZWxlY3Rvci5oCmluZGV4IDE3NjNhNDYuLjBiOTQwNWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdW5pdmVyc2FsX3NlbGVjdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS91bml2ZXJzYWxfc2VsZWN0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1VOSVZFUlNBTF9TRUxFQ1RPUl9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fVU5JVkVSU0FMX1NFTEVDVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3VybF9zcmNfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3VybF9zcmNfdmFsdWUuY2MKaW5kZXggNTQyMGVmYy4uODc1NjhjYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS91cmxfc3JjX3ZhbHVlLmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdXJsX3NyY192YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdXJsX3NyY192YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3VybF9zcmNfdmFsdWUuaCBiL3NyYy9jb2JhbHQvY3Nzb20vdXJsX3NyY192YWx1ZS5oCmluZGV4IDZhMDRmOWYuLmUyZjJhYWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdXJsX3NyY192YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdXJsX3NyY192YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fVVJMX1NSQ19WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fVVJMX1NSQ19WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9jc3NvbS91cmxfdmFsdWUuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3VybF92YWx1ZS5jYwppbmRleCA2ZDkyMTVkLi4zMTFiNzE0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2Nzc29tL3VybF92YWx1ZS5jYworKysgYi9zcmMvY29iYWx0L2Nzc29tL3VybF92YWx1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdXJsX3ZhbHVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvY3Nzb20vdXJsX3ZhbHVlLmggYi9zcmMvY29iYWx0L2Nzc29tL3VybF92YWx1ZS5oCmluZGV4IDNhZGRjMzIuLmEzNGVkOGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdXJsX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9jc3NvbS91cmxfdmFsdWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0NTU09NX1VSTF9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fVVJMX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3VzZXJfYWdlbnRfc3R5bGVfc2hlZXQuY2MgYi9zcmMvY29iYWx0L2Nzc29tL3VzZXJfYWdlbnRfc3R5bGVfc2hlZXQuY2MKaW5kZXggYTU3YTQ3NS4uYWEzNmMzZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9jc3NvbS91c2VyX2FnZW50X3N0eWxlX3NoZWV0LmNjCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdXNlcl9hZ2VudF9zdHlsZV9zaGVldC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvY3Nzb20vdXNlcl9hZ2VudF9zdHlsZV9zaGVldC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2Nzc29tL3VzZXJfYWdlbnRfc3R5bGVfc2hlZXQuaCBiL3NyYy9jb2JhbHQvY3Nzb20vdXNlcl9hZ2VudF9zdHlsZV9zaGVldC5oCmluZGV4IDZjMTlkZTAuLjI0NTI4NjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvY3Nzb20vdXNlcl9hZ2VudF9zdHlsZV9zaGVldC5oCisrKyBiL3NyYy9jb2JhbHQvY3Nzb20vdXNlcl9hZ2VudF9zdHlsZV9zaGVldC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfQ1NTT01fVVNFUl9BR0VOVF9TVFlMRV9TSEVFVF9IXwogI2RlZmluZSBDT0JBTFRfQ1NTT01fVVNFUl9BR0VOVF9TVFlMRV9TSEVFVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9EZWJ1Z0h1Yi5pZGwgYi9zcmMvY29iYWx0L2RlYnVnL0RlYnVnSHViLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2UxNjVmYS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL0RlYnVnSHViLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEN1c3RvbSBpbnRlcmZhY2UgdG8gYWNjZXNzIGRlYnVnZ2luZyBmdW5jdGlvbmFsaXRpZXMuCi0vLyBUT0RPOiBwcm92aWRlIGxpbmsgdG8gZGVzaWduIGRvYy4KLQotWwotICBDb25kaXRpb25hbD1FTkFCTEVfREVCVUdfQ09OU09MRQotXSBpbnRlcmZhY2UgRGVidWdIdWIgewotICBjb25zdCBsb25nIExPR19JTkZPID0gMDsKLSAgY29uc3QgbG9uZyBMT0dfV0FSTklORyA9IDE7Ci0gIGNvbnN0IGxvbmcgTE9HX0VSUk9SID0gMjsKLSAgY29uc3QgbG9uZyBMT0dfRVJST1JfUkVQT1JUID0gMzsKLSAgY29uc3QgbG9uZyBMT0dfRkFUQUwgPSA0OwotCi0gIGNvbnN0IGxvbmcgREVCVUdfQ09OU09MRV9PRkYgPSAwOwotICBjb25zdCBsb25nIERFQlVHX0NPTlNPTEVfSFVEID0gMTsKLSAgY29uc3QgbG9uZyBERUJVR19DT05TT0xFX09OID0gMjsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgRGVidWdnZXIgZGVidWdnZXI7Ci0KLSAgdm9pZCBzZXRMb2dNZXNzYWdlQ2FsbGJhY2soTG9nTWVzc2FnZUNhbGxiYWNrIGNiKTsKLQotICBET01TdHJpbmcgZ2V0Q29uc29sZVZhbHVlTmFtZXMoKTsKLSAgRE9NU3RyaW5nIGdldENvbnNvbGVWYWx1ZShET01TdHJpbmcgbmFtZSk7Ci0KLSAgbG9uZyBnZXREZWJ1Z0NvbnNvbGVNb2RlKCk7Ci0KLSAgRE9NU3RyaW5nIGdldENvbW1hbmRDaGFubmVscygpOwotICBET01TdHJpbmcgZ2V0Q29tbWFuZENoYW5uZWxTaG9ydEhlbHAoRE9NU3RyaW5nIGNvbW1hbmQpOwotICBET01TdHJpbmcgZ2V0Q29tbWFuZENoYW5uZWxMb25nSGVscChET01TdHJpbmcgY29tbWFuZCk7Ci0gIHZvaWQgc2VuZENvbW1hbmQoRE9NU3RyaW5nIGNoYW5uZWwsIERPTVN0cmluZyBtZXNzYWdlKTsKLX07Ci0KLWNhbGxiYWNrIExvZ01lc3NhZ2VDYWxsYmFjayA9IHZvaWQobG9uZyBzZXZlcml0eSwgRE9NU3RyaW5nIGZpbGUsIGxvbmcgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtZXNzYWdlX3N0YXJ0LCBET01TdHJpbmcgbWVzc2FnZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL0RlYnVnU2NyaXB0UnVubmVyLmlkbCBiL3NyYy9jb2JhbHQvZGVidWcvRGVidWdTY3JpcHRSdW5uZXIuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzM0ODk2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZGVidWcvRGVidWdTY3JpcHRSdW5uZXIuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotWwotICBDb25kaXRpb25hbD1FTkFCTEVfREVCVUdfQ09OU09MRQotXQotaW50ZXJmYWNlIERlYnVnU2NyaXB0UnVubmVyIHsKLSAgdm9pZCBzZW5kRXZlbnQoRE9NU3RyaW5nIG1ldGhvZCwgRE9NU3RyaW5nPyBwYXJhbXMpOwotICBhdHRyaWJ1dGUgQ3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2sgY3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2s7Ci19OwotCi1jYWxsYmFjayBDcmVhdGVSZW1vdGVPYmplY3RDYWxsYmFjayA9Ci0gICAgRE9NU3RyaW5nKG9iamVjdCBvYmosIERPTVN0cmluZyBqc29uX3BhcmFtcyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL0RlYnVnZ2VyLmlkbCBiL3NyYy9jb2JhbHQvZGVidWcvRGVidWdnZXIuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzkyYTZiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZGVidWcvRGVidWdnZXIuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gQ3VzdG9tIGludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIHRoZSBkZWJ1Z2dlciwgbW9kZWxlZCBhZnRlcgotLy8gY2hyb21lLmRlYnVnZ2VyIGV4dGVuc2lvbiBBUEkuCi0vLyBodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvZGVidWdnZXIKLQotWwotICBDb25kaXRpb25hbD1FTkFCTEVfREVCVUdfQ09OU09MRQotXSBpbnRlcmZhY2UgRGVidWdnZXIgewotCi0gIHZvaWQgYXR0YWNoKEF0dGFjaENhbGxiYWNrIGNiKTsKLSAgdm9pZCBkZXRhY2goQXR0YWNoQ2FsbGJhY2sgY2IpOwotICB2b2lkIHNlbmRDb21tYW5kKERPTVN0cmluZyBtZXRob2QsIERPTVN0cmluZyBqc29uUGFyYW1zLCBDb21tYW5kQ2FsbGJhY2sgY2IpOwotCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmc/IGxhc3RFcnJvcjsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERlYnVnZ2VyRXZlbnRUYXJnZXQgb25FdmVudDsKLX07Ci0KLWNhbGxiYWNrIEF0dGFjaENhbGxiYWNrID0gdm9pZCgpOwotY2FsbGJhY2sgQ29tbWFuZENhbGxiYWNrID0gdm9pZChET01TdHJpbmc/IHJlc3BvbnNlKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvRGVidWdnZXJFdmVudFRhcmdldC5pZGwgYi9zcmMvY29iYWx0L2RlYnVnL0RlYnVnZ2VyRXZlbnRUYXJnZXQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzNiNGFjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZGVidWcvRGVidWdnZXJFdmVudFRhcmdldC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBDdXN0b20gaW50ZXJmYWNlIHRvIGRpc3BhdGNoIGV2ZW50cyBmcm9tIGRlYnVnZ2VyLgotLy8gQmFzZWQgb24gQ2hyb21lJ3MgZGVidWdnZXIgZXZlbnQgdGFyZ2V0OgotLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL2RlYnVnZ2VyI2V2ZW50LW9uRXZlbnQKLQotWwotICBDb25kaXRpb25hbD1FTkFCTEVfREVCVUdfQ09OU09MRQotXSBpbnRlcmZhY2UgRGVidWdnZXJFdmVudFRhcmdldCB7Ci0gICAgdm9pZCBhZGRMaXN0ZW5lcihEZWJ1Z2dlckV2ZW50Q2FsbGJhY2sgY2FsbGJhY2spOwotfTsKLQotY2FsbGJhY2sgRGVidWdnZXJFdmVudENhbGxiYWNrID0gdm9pZChET01TdHJpbmcgbWV0aG9kLCBET01TdHJpbmc/IGpzb25fcGFyYW1zKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvY29tcG9uZW50X2Nvbm5lY3Rvci5jYyBiL3NyYy9jb2JhbHQvZGVidWcvY29tcG9uZW50X2Nvbm5lY3Rvci5jYwppbmRleCAyYWExY2ExLi5iNTcxYWRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2NvbXBvbmVudF9jb25uZWN0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb21wb25lbnRfY29ubmVjdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9jb21wb25lbnRfY29ubmVjdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvY29tcG9uZW50X2Nvbm5lY3Rvci5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb21wb25lbnRfY29ubmVjdG9yLmgKaW5kZXggZWI3ZGEwYy4uOGZhMDRmZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb21wb25lbnRfY29ubmVjdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb21wb25lbnRfY29ubmVjdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfREVCVUdfQ09NUE9ORU5UX0NPTk5FQ1RPUl9IXwogI2RlZmluZSBDT0JBTFRfREVCVUdfQ09NUE9ORU5UX0NPTk5FQ1RPUl9IXwogCkBAIC0yNCw3ICsyMiw2IEBACiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2pzb25fb2JqZWN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfZGVidWdnZXIuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZGVidWcgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlX2NvbXBvbmVudC5jYyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZV9jb21wb25lbnQuY2MKaW5kZXggYjg3YzIwMi4uMjY5NDNhNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlX2NvbXBvbmVudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGVfY29tcG9uZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9jb25zb2xlX2NvbXBvbmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGVfY29tcG9uZW50LmggYi9zcmMvY29iYWx0L2RlYnVnL2NvbnNvbGVfY29tcG9uZW50LmgKaW5kZXggYjA2ODNkMS4uMzYzMjlmNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb25zb2xlX2NvbXBvbmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvY29uc29sZV9jb21wb25lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RFQlVHX0NPTlNPTEVfQ09NUE9ORU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ERUJVR19DT05TT0xFX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L2JhY2tlbmQvZG9tLmpzIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L2JhY2tlbmQvZG9tLmpzCmluZGV4IDY3OTYwNjkuLjI0YjU1NzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvY29udGVudC9iYWNrZW5kL2RvbS5qcworKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvYmFja2VuZC9kb20uanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBKYXZhU2NyaXB0IGZ1bmN0aW9ucyB1c2VkIGJ5IHRoZSBDaHJvbWUgZGVidWdnaW5nIHByb3RvY29sIERPTSBkb21haW46CiAvLyBodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2RldnRvb2xzL2RvY3MvcHJvdG9jb2wvMS4xL2RvbQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L2JhY2tlbmQvcnVudGltZS5qcyBiL3NyYy9jb2JhbHQvZGVidWcvY29udGVudC9iYWNrZW5kL3J1bnRpbWUuanMKaW5kZXggMmM3NzllZC4uNjViMjM4MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L2JhY2tlbmQvcnVudGltZS5qcworKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvYmFja2VuZC9ydW50aW1lLmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8gVG9wIGxldmVsIGNhbGxiYWNrIGZ1bmN0aW9uIHRoYXQgY2FuIGJlIGNhbGxlZCBieSBhbnkgY29tcG9uZW50IHRvIGNyZWF0ZQogLy8gYSBSdW50aW1lLlJlbW90ZU9iamVjdCBmcm9tIGEgSlMgb2JqZWN0IHBhc3NlZCBpbiBmcm9tIEMrKy4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvY29udGVudC9yZW1vdGUtY29uc29sZS9jb21tYW5kcy5qcyBiL3NyYy9jb2JhbHQvZGVidWcvY29udGVudC9yZW1vdGUtY29uc29sZS9jb21tYW5kcy5qcwppbmRleCAzNzJmODE5Li43YjRhYTE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvcmVtb3RlLWNvbnNvbGUvY29tbWFuZHMuanMKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L3JlbW90ZS1jb25zb2xlL2NvbW1hbmRzLmpzCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogdmFyIHNjcmlwdHMgPSBbXTsKIHZhciBjb21tYW5kQ2FsbGJhY2tzID0gW107CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvcmVtb3RlLWNvbnNvbGUvaW5wdXQuanMgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvcmVtb3RlLWNvbnNvbGUvaW5wdXQuanMKaW5kZXggYjc5NTVlZC4uOGM4YTQ2NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L3JlbW90ZS1jb25zb2xlL2lucHV0LmpzCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvY29udGVudC9yZW1vdGUtY29uc29sZS9pbnB1dC5qcwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIGZ1bmN0aW9uIENvbW1hbmRJbnB1dChlbGVtKSB7CiAgIC8vIFRoZSB0b3AtbGV2ZWwgSFRNTCBlbGVtZW50IHRoaXMgY2xhc3MgdXNlcyBmb3IgaW5wdXQgaW50ZXJhY3Rpb24uCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvcmVtb3RlLWNvbnNvbGUvbWVzc2FnZV9sb2cuanMgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvcmVtb3RlLWNvbnNvbGUvbWVzc2FnZV9sb2cuanMKaW5kZXggNjY0ZmQyYi4uNzUyZTQyNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L3JlbW90ZS1jb25zb2xlL21lc3NhZ2VfbG9nLmpzCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvY29udGVudC9yZW1vdGUtY29uc29sZS9tZXNzYWdlX2xvZy5qcwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIC8vIFRoZSBNZXNzYWdlTG9nIGNsYXNzIG1hbmFnZXMgdGhlIHN0b3JhZ2UgYW5kIGRpc3BsYXkgb2YgYWxsIGxvZyBtZXNzYWdlcyBpbgogLy8gdGhlIHJlbW90ZSBjb25zb2xlLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L3JlbW90ZS1jb25zb2xlL3JlbW90ZV9jb25zb2xlLmpzIGIvc3JjL2NvYmFsdC9kZWJ1Zy9jb250ZW50L3JlbW90ZS1jb25zb2xlL3JlbW90ZV9jb25zb2xlLmpzCmluZGV4IGIwNGU3ZDYuLjA3YjMwM2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvY29udGVudC9yZW1vdGUtY29uc29sZS9yZW1vdGVfY29uc29sZS5qcworKysgYi9zcmMvY29iYWx0L2RlYnVnL2NvbnRlbnQvcmVtb3RlLWNvbnNvbGUvcmVtb3RlX2NvbnNvbGUuanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBUZXh0IHRoZSB1c2VyIGhhcyB0eXBlZCBzaW5jZSBsYXN0IGhpdHRpbmcgRW50ZXIKIHZhciBpbnB1dFRleHQgPSAnJzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfY2xpZW50LmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19jbGllbnQuY2MKaW5kZXggOGIxYWFiMC4uN2QyZjJmYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19jbGllbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19jbGllbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2RlYnVnX2NsaWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX2NsaWVudC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19jbGllbnQuaAppbmRleCBjNzY4MGM4Li5lMDNhNTBmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX2NsaWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfY2xpZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ERUJVR19ERUJVR19DTElFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RFQlVHX0RFQlVHX0NMSUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19odWIuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX2h1Yi5jYwppbmRleCBiMjIzNDJmLi5kMzczZmQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX2h1Yi5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX2h1Yi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZiBkZWZpbmVkKEVOQUJMRV9ERUJVR19DT05TT0xFKQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX2h1Yi5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19odWIuaAppbmRleCA0YTBlYzAxLi40NmFjNzQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX2h1Yi5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfaHViLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ERUJVR19ERUJVR19IVUJfSF8KICNkZWZpbmUgQ09CQUxUX0RFQlVHX0RFQlVHX0hVQl9IXwpAQCAtMzIsNyArMzAsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3NvdXJjZV9sb2NhdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9kZWJ1Z2dlci5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtNjcsNyArNjUsNyBAQAogICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjwKICAgICAgIHZvaWQoaW50IHNldmVyaXR5LCBjb25zdCBzdGQ6OnN0cmluZyYgZmlsZSwgaW50IGxpbmUsCiAgICAgICAgICAgIHNpemVfdCBtZXNzYWdlX3N0YXJ0LCBjb25zdCBzdGQ6OnN0cmluZyYgbXNnKT4gTG9nTWVzc2FnZUNhbGxiYWNrOwotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PExvZ01lc3NhZ2VDYWxsYmFjaz4gTG9nTWVzc2FnZUNhbGxiYWNrQXJnOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8TG9nTWVzc2FnZUNhbGxiYWNrPiBMb2dNZXNzYWdlQ2FsbGJhY2tBcmc7CiAKICAgLy8gRnVuY3Rpb24gc2lnbmF0dXJlIHRvIGNhbGwgd2hlbiB3ZSBuZWVkIHRvIHF1ZXJ5IGZvciB0aGUgSHVkIHZpc2liaWxpdHkKICAgLy8gbW9kZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfaHViLmlkbCBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfaHViLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzg1ZDhhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19odWIuaWRsCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEN1c3RvbSBpbnRlcmZhY2UgdG8gYWNjZXNzIGRlYnVnZ2luZyBmdW5jdGlvbmFsaXRpZXMuCisvLyBUT0RPOiBwcm92aWRlIGxpbmsgdG8gZGVzaWduIGRvYy4KKworWworICBDb25kaXRpb25hbD1FTkFCTEVfREVCVUdfQ09OU09MRQorXSBpbnRlcmZhY2UgRGVidWdIdWIgeworICBjb25zdCBsb25nIExPR19JTkZPID0gMDsKKyAgY29uc3QgbG9uZyBMT0dfV0FSTklORyA9IDE7CisgIGNvbnN0IGxvbmcgTE9HX0VSUk9SID0gMjsKKyAgY29uc3QgbG9uZyBMT0dfRVJST1JfUkVQT1JUID0gMzsKKyAgY29uc3QgbG9uZyBMT0dfRkFUQUwgPSA0OworCisgIGNvbnN0IGxvbmcgREVCVUdfQ09OU09MRV9PRkYgPSAwOworICBjb25zdCBsb25nIERFQlVHX0NPTlNPTEVfSFVEID0gMTsKKyAgY29uc3QgbG9uZyBERUJVR19DT05TT0xFX09OID0gMjsKKworICByZWFkb25seSBhdHRyaWJ1dGUgRGVidWdnZXIgZGVidWdnZXI7CisKKyAgdm9pZCBzZXRMb2dNZXNzYWdlQ2FsbGJhY2soTG9nTWVzc2FnZUNhbGxiYWNrIGNiKTsKKworICBET01TdHJpbmcgZ2V0Q29uc29sZVZhbHVlTmFtZXMoKTsKKyAgRE9NU3RyaW5nIGdldENvbnNvbGVWYWx1ZShET01TdHJpbmcgbmFtZSk7CisKKyAgbG9uZyBnZXREZWJ1Z0NvbnNvbGVNb2RlKCk7CisKKyAgRE9NU3RyaW5nIGdldENvbW1hbmRDaGFubmVscygpOworICBET01TdHJpbmcgZ2V0Q29tbWFuZENoYW5uZWxTaG9ydEhlbHAoRE9NU3RyaW5nIGNvbW1hbmQpOworICBET01TdHJpbmcgZ2V0Q29tbWFuZENoYW5uZWxMb25nSGVscChET01TdHJpbmcgY29tbWFuZCk7CisgIHZvaWQgc2VuZENvbW1hbmQoRE9NU3RyaW5nIGNoYW5uZWwsIERPTVN0cmluZyBtZXNzYWdlKTsKK307CisKK2NhbGxiYWNrIExvZ01lc3NhZ2VDYWxsYmFjayA9IHZvaWQobG9uZyBzZXZlcml0eSwgRE9NU3RyaW5nIGZpbGUsIGxvbmcgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBtZXNzYWdlX3N0YXJ0LCBET01TdHJpbmcgbWVzc2FnZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NjcmlwdF9ydW5uZXIuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NjcmlwdF9ydW5uZXIuY2MKaW5kZXggZWEzMzBkZC4uNGE2MTA4NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19zY3JpcHRfcnVubmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2NyaXB0X3J1bm5lci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvZGVidWdfc2NyaXB0X3J1bm5lci5oIgogCkBAIC0xMzMsNyArMTMxLDcgQEAKIGNvbnN0IERlYnVnU2NyaXB0UnVubmVyOjpDcmVhdGVSZW1vdGVPYmplY3RDYWxsYmFja0hvbGRlcioKIERlYnVnU2NyaXB0UnVubmVyOjpjcmVhdGVfcmVtb3RlX29iamVjdF9jYWxsYmFjaygpIHsKICAgaWYgKGNyZWF0ZV9yZW1vdGVfb2JqZWN0X2NhbGxiYWNrXykgewotICAgIHJldHVybiAmKGNyZWF0ZV9yZW1vdGVfb2JqZWN0X2NhbGxiYWNrXy0+cmVmZXJlbmNlZF9vYmplY3QoKSk7CisgICAgcmV0dXJuICYoY3JlYXRlX3JlbW90ZV9vYmplY3RfY2FsbGJhY2tfLT5yZWZlcmVuY2VkX3ZhbHVlKCkpOwogICB9IGVsc2UgewogICAgIHJldHVybiBOVUxMOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NjcmlwdF9ydW5uZXIuaCBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2NyaXB0X3J1bm5lci5oCmluZGV4IGEwNzYwOTguLjI4NDFiZTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2NyaXB0X3J1bm5lci5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2NyaXB0X3J1bm5lci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfREVCVUdfREVCVUdfU0NSSVBUX1JVTk5FUl9IXwogI2RlZmluZSBDT0JBTFRfREVCVUdfREVCVUdfU0NSSVBUX1JVTk5FUl9IXwpAQCAtMjUsNyArMjMsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC01Miw3ICs1MCw3IEBACiAgIHR5cGVkZWYgc2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uPHN0ZDo6c3RyaW5nKAogICAgICAgY29uc3Qgc2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXIqLCBjb25zdCBzdGQ6OnN0cmluZyYpPgogICAgICAgQ3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2s7Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8Q3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2s+CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxDcmVhdGVSZW1vdGVPYmplY3RDYWxsYmFjaz4KICAgICAgIENyZWF0ZVJlbW90ZU9iamVjdENhbGxiYWNrSG9sZGVyOwogCiAgIERlYnVnU2NyaXB0UnVubmVyKHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2NyaXB0X3J1bm5lci5pZGwgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NjcmlwdF9ydW5uZXIuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyMjQyNDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NjcmlwdF9ydW5uZXIuaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK1sKKyAgQ29uZGl0aW9uYWw9RU5BQkxFX0RFQlVHX0NPTlNPTEUKK10KK2ludGVyZmFjZSBEZWJ1Z1NjcmlwdFJ1bm5lciB7CisgIHZvaWQgc2VuZEV2ZW50KERPTVN0cmluZyBtZXRob2QsIERPTVN0cmluZz8gcGFyYW1zKTsKKyAgYXR0cmlidXRlIENyZWF0ZVJlbW90ZU9iamVjdENhbGxiYWNrIGNyZWF0ZVJlbW90ZU9iamVjdENhbGxiYWNrOworfTsKKworY2FsbGJhY2sgQ3JlYXRlUmVtb3RlT2JqZWN0Q2FsbGJhY2sgPQorICAgIERPTVN0cmluZyhvYmplY3Qgb2JqLCBET01TdHJpbmcganNvbl9wYXJhbXMpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXIuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NlcnZlci5jYwppbmRleCA5MDU3Zjc3Li40NjgwZDE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NlcnZlci5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NlcnZlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvZGVidWdfc2VydmVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2VydmVyLmggYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NlcnZlci5oCmluZGV4IGQ5ZmQ4ZjkuLmJmNjhjNWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2VydmVyLmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9ERUJVR19ERUJVR19TRVJWRVJfSF8KICNkZWZpbmUgQ09CQUxUX0RFQlVHX0RFQlVHX1NFUlZFUl9IXwogCkBAIC0zNiw3ICszNCw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jc3BfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGRlYnVnIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2VydmVyX21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2VydmVyX21vZHVsZS5jYwppbmRleCBkNjU2ZDkzLi5jNjA2OTQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3NlcnZlcl9tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXJfbW9kdWxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXJfbW9kdWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfc2VydmVyX21vZHVsZS5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXJfbW9kdWxlLmgKaW5kZXggM2NmYTM1NS4uOGQ4Y2VkNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXJfbW9kdWxlLmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z19zZXJ2ZXJfbW9kdWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfREVCVUdfREVCVUdfU0VSVkVSX01PRFVMRV9IXwogI2RlZmluZSBDT0JBTFRfREVCVUdfREVCVUdfU0VSVkVSX01PRFVMRV9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3dlYl9zZXJ2ZXIuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3dlYl9zZXJ2ZXIuY2MKaW5kZXggMWJlZmU2ZS4uMzI3MTFkYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z193ZWJfc2VydmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnX3dlYl9zZXJ2ZXIuaCBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5oCmluZGV4IDlmNTVjMTYuLjk2NzMxOWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdfd2ViX3NlcnZlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfREVCVUdfREVCVUdfV0VCX1NFUlZFUl9IXwogI2RlZmluZSBDT0JBTFRfREVCVUdfREVCVUdfV0VCX1NFUlZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z2dlci5jYyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXIuY2MKaW5kZXggMGQ0ZjFlOS4uOTFhYzExOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z2dlci5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnZ2VyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXIuaCBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXIuaAppbmRleCA1NDNiYmM2Li5jZjQyMjBmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z2dlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfREVCVUdfREVCVUdHRVJfSF8KICNkZWZpbmUgQ09CQUxUX0RFQlVHX0RFQlVHR0VSX0hfCkBAIC0zMSw3ICsyOSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2RlYnVnZ2VyX2V2ZW50X3RhcmdldC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtNDUsMTIgKzQzLDEyIEBACiAgcHVibGljOgogICAvLyBKYXZhU2NyaXB0IGNhbGxiYWNrIHRvIGJlIHJ1biB3aGVuIGRlYnVnZ2VyIGF0L2RldGFjaGVzLgogICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKCk+IEF0dGFjaENhbGxiYWNrOwotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PEF0dGFjaENhbGxiYWNrPiBBdHRhY2hDYWxsYmFja0FyZzsKKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPEF0dGFjaENhbGxiYWNrPiBBdHRhY2hDYWxsYmFja0FyZzsKIAogICAvLyBKYXZhU2NyaXB0IGNhbGxiYWNrIHRvIGJlIHJ1biB3aGVuIGEgZGVidWcgY29tbWFuZCBoYXMgYmVlbiBleGVjdXRlZC4KICAgdHlwZWRlZiBzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb248dm9pZChiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4pPgogICAgICAgQ29tbWFuZENhbGxiYWNrOwotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PENvbW1hbmRDYWxsYmFjaz4gQ29tbWFuZENhbGxiYWNrQXJnOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8Q29tbWFuZENhbGxiYWNrPiBDb21tYW5kQ2FsbGJhY2tBcmc7CiAKICAgLy8gQ2FsbGJhY2sgdG8gYmUgcnVuIHRvIGdldCB0aGUgZGVidWcgc2VydmVyLiBUaGUgZGVidWcgc2VydmVyIGlzIG93bmVkIGJ5CiAgIC8vIHRoZSB3ZWIgbW9kdWxlIHRvIHdoaWNoIGl0IGNvbm5lY3RzLCBhbmQgdGhpcyBjYWxsYmFjayBhbGxvd3MgdGhpcyBvYmplY3QKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXIuaWRsIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z2dlci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhYTcxNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXIuaWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEN1c3RvbSBpbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCB0aGUgZGVidWdnZXIsIG1vZGVsZWQgYWZ0ZXIKKy8vIGNocm9tZS5kZWJ1Z2dlciBleHRlbnNpb24gQVBJLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9leHRlbnNpb25zL2RlYnVnZ2VyCisKK1sKKyAgQ29uZGl0aW9uYWw9RU5BQkxFX0RFQlVHX0NPTlNPTEUKK10gaW50ZXJmYWNlIERlYnVnZ2VyIHsKKworICB2b2lkIGF0dGFjaChBdHRhY2hDYWxsYmFjayBjYik7CisgIHZvaWQgZGV0YWNoKEF0dGFjaENhbGxiYWNrIGNiKTsKKyAgdm9pZCBzZW5kQ29tbWFuZChET01TdHJpbmcgbWV0aG9kLCBET01TdHJpbmcganNvblBhcmFtcywgQ29tbWFuZENhbGxiYWNrIGNiKTsKKworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nPyBsYXN0RXJyb3I7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBEZWJ1Z2dlckV2ZW50VGFyZ2V0IG9uRXZlbnQ7Cit9OworCitjYWxsYmFjayBBdHRhY2hDYWxsYmFjayA9IHZvaWQoKTsKK2NhbGxiYWNrIENvbW1hbmRDYWxsYmFjayA9IHZvaWQoRE9NU3RyaW5nPyByZXNwb25zZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL2RlYnVnZ2VyX2V2ZW50X3RhcmdldC5jYyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmNjCmluZGV4IDNhOTZiNTMuLjMxZGFmYmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmNjCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmIGRlZmluZWQoRU5BQkxFX0RFQlVHX0NPTlNPTEUpCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmggYi9zcmMvY29iYWx0L2RlYnVnL2RlYnVnZ2VyX2V2ZW50X3RhcmdldC5oCmluZGV4IGY4MWI3MGQuLjQ0ZGJhZTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmgKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z2dlcl9ldmVudF90YXJnZXQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RFQlVHX0RFQlVHR0VSX0VWRU5UX1RBUkdFVF9IXwogI2RlZmluZSBDT0JBTFRfREVCVUdfREVCVUdHRVJfRVZFTlRfVEFSR0VUX0hfCkBAIC0yNyw3ICsyNSw3IEBACiAjaW5jbHVkZSAiYmFzZS9vcHRpb25hbC5oIgogI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTQ1LDcgKzQzLDcgQEAKICAgdHlwZWRlZiBzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb248dm9pZCgKICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXRob2QsCiAgICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIGpzb25fcGFyYW1zKT4gRGVidWdnZXJFdmVudENhbGxiYWNrOwotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PERlYnVnZ2VyRXZlbnRDYWxsYmFjaz4gRGVidWdnZXJFdmVudENhbGxiYWNrQXJnOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8RGVidWdnZXJFdmVudENhbGxiYWNrPiBEZWJ1Z2dlckV2ZW50Q2FsbGJhY2tBcmc7CiAKICAgLy8gVHlwZSBmb3IgbGlzdGVuZXIgaW5mby4KICAgLy8gV2Ugc3RvcmUgdGhlIG1lc3NhZ2UgbG9vcCBmcm9tIHdoaWNoIHRoZSBsaXN0ZW5lciB3YXMgcmVnaXN0ZXJlZCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmlkbCBiL3NyYy9jb2JhbHQvZGVidWcvZGVidWdnZXJfZXZlbnRfdGFyZ2V0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODJhODUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kZWJ1Z2dlcl9ldmVudF90YXJnZXQuaWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEN1c3RvbSBpbnRlcmZhY2UgdG8gZGlzcGF0Y2ggZXZlbnRzIGZyb20gZGVidWdnZXIuCisvLyBCYXNlZCBvbiBDaHJvbWUncyBkZWJ1Z2dlciBldmVudCB0YXJnZXQ6CisvLyBodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2V4dGVuc2lvbnMvZGVidWdnZXIjZXZlbnQtb25FdmVudAorCitbCisgIENvbmRpdGlvbmFsPUVOQUJMRV9ERUJVR19DT05TT0xFCitdIGludGVyZmFjZSBEZWJ1Z2dlckV2ZW50VGFyZ2V0IHsKKyAgICB2b2lkIGFkZExpc3RlbmVyKERlYnVnZ2VyRXZlbnRDYWxsYmFjayBjYWxsYmFjayk7Cit9OworCitjYWxsYmFjayBEZWJ1Z2dlckV2ZW50Q2FsbGJhY2sgPSB2b2lkKERPTVN0cmluZyBtZXRob2QsIERPTVN0cmluZz8ganNvbl9wYXJhbXMpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9kb21fY29tcG9uZW50LmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9kb21fY29tcG9uZW50LmNjCmluZGV4IDJlNThlNjUuLjA2YjM1NTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvZG9tX2NvbXBvbmVudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL2RvbV9jb21wb25lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL2RvbV9jb21wb25lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9kb21fY29tcG9uZW50LmggYi9zcmMvY29iYWx0L2RlYnVnL2RvbV9jb21wb25lbnQuaAppbmRleCAwODY4NDk1Li45MmQ4MDNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL2RvbV9jb21wb25lbnQuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2RvbV9jb21wb25lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9ERUJVR19ET01fQ09NUE9ORU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ERUJVR19ET01fQ09NUE9ORU5UX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvamF2YXNjcmlwdF9kZWJ1Z2dlcl9jb21wb25lbnQuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2phdmFzY3JpcHRfZGVidWdnZXJfY29tcG9uZW50LmNjCmluZGV4IGI3OGY0YjAuLmUwMmZjMmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvamF2YXNjcmlwdF9kZWJ1Z2dlcl9jb21wb25lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9qYXZhc2NyaXB0X2RlYnVnZ2VyX2NvbXBvbmVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvamF2YXNjcmlwdF9kZWJ1Z2dlcl9jb21wb25lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9qYXZhc2NyaXB0X2RlYnVnZ2VyX2NvbXBvbmVudC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9qYXZhc2NyaXB0X2RlYnVnZ2VyX2NvbXBvbmVudC5oCmluZGV4IDY1NzlkYzcuLmFmZGM2NGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvamF2YXNjcmlwdF9kZWJ1Z2dlcl9jb21wb25lbnQuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2phdmFzY3JpcHRfZGVidWdnZXJfY29tcG9uZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfREVCVUdfSkFWQVNDUklQVF9ERUJVR0dFUl9DT01QT05FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RFQlVHX0pBVkFTQ1JJUFRfREVCVUdHRVJfQ09NUE9ORU5UX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvanNvbl9vYmplY3QuY2MgYi9zcmMvY29iYWx0L2RlYnVnL2pzb25fb2JqZWN0LmNjCmluZGV4IDlkOWUzMGMuLjA1ZTNiNTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvanNvbl9vYmplY3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9qc29uX29iamVjdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvanNvbl9vYmplY3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9qc29uX29iamVjdC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9qc29uX29iamVjdC5oCmluZGV4IDExYjgzMTguLjU2ZTM4ZTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvanNvbl9vYmplY3QuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL2pzb25fb2JqZWN0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ERUJVR19KU09OX09CSkVDVF9IXwogI2RlZmluZSBDT0JBTFRfREVCVUdfSlNPTl9PQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvcGFnZV9jb21wb25lbnQuY2MgYi9zcmMvY29iYWx0L2RlYnVnL3BhZ2VfY29tcG9uZW50LmNjCmluZGV4IDE2ODUzZTIuLmI0NTc1NTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvcGFnZV9jb21wb25lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9wYWdlX2NvbXBvbmVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZGVidWcvcGFnZV9jb21wb25lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9wYWdlX2NvbXBvbmVudC5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9wYWdlX2NvbXBvbmVudC5oCmluZGV4IDU1MjA4NDguLjdkMGZlYmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZGVidWcvcGFnZV9jb21wb25lbnQuaAorKysgYi9zcmMvY29iYWx0L2RlYnVnL3BhZ2VfY29tcG9uZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ERUJVR19QQUdFX0NPTVBPTkVOVF9IXwogI2RlZmluZSBDT0JBTFRfREVCVUdfUEFHRV9DT01QT05FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZGVidWcvcmVuZGVyX2xheWVyLmNjIGIvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfbGF5ZXIuY2MKaW5kZXggZWU3Nzg1Yy4uZWIzNzYzMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfbGF5ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfbGF5ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RlYnVnL3JlbmRlcl9sYXllci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9sYXllci5oIGIvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfbGF5ZXIuaAppbmRleCAxMzc0MmQ4Li5lN2M4NGU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9sYXllci5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvcmVuZGVyX2xheWVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ERUJVR19SRU5ERVJfTEFZRVJfSF8KICNkZWZpbmUgQ09CQUxUX0RFQlVHX1JFTkRFUl9MQVlFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfb3ZlcmxheS5jYyBiL3NyYy9jb2JhbHQvZGVidWcvcmVuZGVyX292ZXJsYXkuY2MKaW5kZXggMGIxZjVhNi4uZDYxODdiYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfb3ZlcmxheS5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9vdmVybGF5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9yZW5kZXJfb3ZlcmxheS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9vdmVybGF5LmggYi9zcmMvY29iYWx0L2RlYnVnL3JlbmRlcl9vdmVybGF5LmgKaW5kZXggNjY1OGQ1Mi4uODFjMjIzNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9yZW5kZXJfb3ZlcmxheS5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvcmVuZGVyX292ZXJsYXkuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RFQlVHX1JFTkRFUl9PVkVSTEFZX0hfCiAjZGVmaW5lIENPQkFMVF9ERUJVR19SRU5ERVJfT1ZFUkxBWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kZWJ1Zy9ydW50aW1lX2NvbXBvbmVudC5jYyBiL3NyYy9jb2JhbHQvZGVidWcvcnVudGltZV9jb21wb25lbnQuY2MKaW5kZXggOTk5MjNmNy4uMjQ3MjAwYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9ydW50aW1lX2NvbXBvbmVudC5jYworKysgYi9zcmMvY29iYWx0L2RlYnVnL3J1bnRpbWVfY29tcG9uZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kZWJ1Zy9ydW50aW1lX2NvbXBvbmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RlYnVnL3J1bnRpbWVfY29tcG9uZW50LmggYi9zcmMvY29iYWx0L2RlYnVnL3J1bnRpbWVfY29tcG9uZW50LmgKaW5kZXggMmFkMzlhNS4uYzVjYzQ4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kZWJ1Zy9ydW50aW1lX2NvbXBvbmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZGVidWcvcnVudGltZV9jb21wb25lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RFQlVHX1JVTlRJTUVfQ09NUE9ORU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ERUJVR19SVU5USU1FX0NPTVBPTkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vQW5pbWF0aW9uRXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vQW5pbWF0aW9uRXZlbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZTc5Mzc1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0FuaW1hdGlvbkV2ZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzczMtYW5pbWF0aW9ucy0yMDEzMDIxOS8jYW5pbWF0aW9uZXZlbnQKLQotW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlKV0KLWludGVyZmFjZSBBbmltYXRpb25FdmVudCA6IEV2ZW50IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBhbmltYXRpb25OYW1lOwotICByZWFkb25seSBhdHRyaWJ1dGUgZmxvYXQgZWxhcHNlZFRpbWU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vQXJyYXlCdWZmZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vQXJyYXlCdWZmZXIuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjkwNjIxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0FycmF5QnVmZmVyLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3R5cGVkYXJyYXkvc3BlY3MvbGF0ZXN0LyM1Ci0KLVsKLSAgQ29uc3RydWN0b3IodW5zaWduZWQgbG9uZyBsZW5ndGgpLAotICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MKLV0KLWludGVyZmFjZSBBcnJheUJ1ZmZlciB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGJ5dGVMZW5ndGg7Ci0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSBBcnJheUJ1ZmZlciBzbGljZShsb25nIGJlZ2luLCBvcHRpb25hbCBsb25nIGVuZCk7Ci0KLSAgLy8gVE9ETzogRG8gd2UgbmVlZCB0byBzdXBwb3J0IHRoaXM/Ci0gIC8vIHN0YXRpYyBib29sZWFuIGlzVmlldyhhbnkgdmFsdWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0FycmF5QnVmZmVyVmlldy5pZGwgYi9zcmMvY29iYWx0L2RvbS9BcnJheUJ1ZmZlclZpZXcuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTRiMDkwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0FycmF5QnVmZmVyVmlldy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS90eXBlZGFycmF5L3NwZWNzL2xhdGVzdC8jNgotCi1bTm9JbnRlcmZhY2VPYmplY3RdCi1pbnRlcmZhY2UgQXJyYXlCdWZmZXJWaWV3IHsKLSAgICByZWFkb25seSBhdHRyaWJ1dGUgQXJyYXlCdWZmZXIgYnVmZmVyOwotICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQ7Ci0gICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgYnl0ZUxlbmd0aDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9BdHRyLmlkbCBiL3NyYy9jb2JhbHQvZG9tL0F0dHIuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2JiMjZlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0F0dHIuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jYXR0cgotCi1pbnRlcmZhY2UgQXR0ciB7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgdmFsdWU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbmFtZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBub2RlTmFtZTsKLQotICAvLyBEZXByZWNhdGVkLiBBdHRyIG5vIGxvbmdlciBpbmhlcml0cyBmcm9tIE5vZGUuCi0gIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0QtZG9tLTIwMTUwNDI4LyNkb20tY29yZQotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG5vZGVWYWx1ZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9CbG9iLmlkbCBiL3NyYy9jb2JhbHQvZG9tL0Jsb2IuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGI5NzJkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0Jsb2IuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0QtRmlsZUFQSS0yMDE1MDQyMS8jZGZuLUJsb2IKLQotWwotICAvL0NvbnN0cnVjdG9yLAotICAvLyBUT0RPOiBXaGVuIGFycmF5cyBvciBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZCwgc3VwcG9ydCB0aGUgY29uc3RydWN0b3IKLSAgLy8gZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQgd2l0aCBtdWx0aXBsZSBibG9icGFydHMsIGFuZCBkcm9wIHRoZSBzaW5nbGUKLSAgLy8gQXJyYXlCdWZmZXIgY29uc3RydWN0b3IuCi0gIENvbnN0cnVjdG9yKG9wdGlvbmFsIEFycmF5QnVmZmVyIGJ1ZmZlciksCi0gIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncwotXQotaW50ZXJmYWNlIEJsb2IgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsb25nIHNpemU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vQ0RBVEFTZWN0aW9uLmlkbCBiL3NyYy9jb2JhbHQvZG9tL0NEQVRBU2VjdGlvbi5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNWEzYTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vQ0RBVEFTZWN0aW9uLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDAwL1JFQy1ET00tTGV2ZWwtMi1Db3JlLTIwMDAxMTEzL2NvcmUuaHRtbCNJRC02Njc0NjkyMTIKLQotWwotICBDb25zdHJ1Y3RvcihvcHRpb25hbCBET01TdHJpbmcgZGF0YSA9ICIiKSwKLSAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzCi1dCi1pbnRlcmZhY2UgQ0RBVEFTZWN0aW9uIDogVGV4dCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0NoYXJhY3RlckRhdGEuaWRsIGIvc3JjL2NvYmFsdC9kb20vQ2hhcmFjdGVyRGF0YS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWVmNGEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vQ2hhcmFjdGVyRGF0YS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNjaGFyYWN0ZXJkYXRhCi0KLWludGVyZmFjZSBDaGFyYWN0ZXJEYXRhIDogTm9kZSB7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gYXR0cmlidXRlIERPTVN0cmluZyBkYXRhOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0NvbW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vQ29tbWVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRhYTJjNTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vQ29tbWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNjb21tZW50Ci0KLVsKLSAgQ29uc3RydWN0b3Iob3B0aW9uYWwgRE9NU3RyaW5nIGRhdGEgPSAiIiksCi0gIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncwotXQotaW50ZXJmYWNlIENvbW1lbnQgOiBDaGFyYWN0ZXJEYXRhIHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vQ29uc29sZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9Db25zb2xlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY1NTc3Ny4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9Db25zb2xlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEN1c3RvbSBpbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBsYXlvdXQgdGVzdHMuCi0vLyBSZWZlcmVuY2U6IGh0dHBzOi8vZGV2ZWxvcGVyLm1vemlsbGEub3JnL2VuLVVTL2RvY3MvV2ViL0FQSS9Db25zb2xlCi0KLWludGVyZmFjZSBDb25zb2xlIHsKLSAgdm9pZCBkZWJ1ZyhET01TdHJpbmcgdGV4dCk7Ci0gIHZvaWQgbG9nKERPTVN0cmluZyB0ZXh0KTsKLSAgdm9pZCBpbmZvKERPTVN0cmluZyB0ZXh0KTsKLSAgdm9pZCBlcnJvcihET01TdHJpbmcgdGV4dCk7Ci0gIHZvaWQgd2FybihET01TdHJpbmcgdGV4dCk7Ci0gIHZvaWQgdHJhY2UoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9DcnlwdG8uaWRsIGIvc3JjL2NvYmFsdC9kb20vQ3J5cHRvLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTg2NDZjMi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9DcnlwdG8uaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1dlYkNyeXB0b0FQSS8jY3J5cHRvLWludGVyZmFjZQotCi1pbnRlcmZhY2UgQ3J5cHRvIHsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gQXJyYXlCdWZmZXJWaWV3IGdldFJhbmRvbVZhbHVlcyhBcnJheUJ1ZmZlclZpZXcgYXJyYXkpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0RPTUV4Y2VwdGlvbi5pZGwgYi9zcmMvY29iYWx0L2RvbS9ET01FeGNlcHRpb24uaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmFlNjUyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RPTUV4Y2VwdGlvbi5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2lkbC1ET01FeGNlcHRpb24KLQotZXhjZXB0aW9uIERPTUV4Y2VwdGlvbiB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCBjb2RlOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG5hbWU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbWVzc2FnZTsKLQotICAvLyBMaXN0IG9mIGV4Y2VwdGlvbnMgYW5kIGNvZGVzIGZvdW5kIGhlcmU6Ci0gIC8vICAgaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtRE9NRXhjZXB0aW9uLWVycm9yLW5hbWVzCi0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IElOREVYX1NJWkVfRVJSID0gMTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgTk9UX0ZPVU5EX0VSUiA9IDg7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5PVF9TVVBQT1JURURfRVJSID0gOTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgSU5WQUxJRF9TVEFURV9FUlIgPSAxMTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgU1lOVEFYX0VSUiA9IDEyOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBJTlZBTElEX0FDQ0VTU19FUlIgPSAxNTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgUVVPVEFfRVhDRUVERURfRVJSID0gMjI7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vRE9NSW1wbGVtZW50YXRpb24uaWRsIGIvc3JjL2NvYmFsdC9kb20vRE9NSW1wbGVtZW50YXRpb24uaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGNlN2ViLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RPTUltcGxlbWVudGF0aW9uLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2RvbWltcGxlbWVudGF0aW9uCi0KLVtDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdCi1pbnRlcmZhY2UgRE9NSW1wbGVtZW50YXRpb24gewotICBbTmV3T2JqZWN0XSBYTUxEb2N1bWVudCBjcmVhdGVEb2N1bWVudChET01TdHJpbmc/IG5hbWVzcGFjZU5hbWUsIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gRE9NU3RyaW5nIHF1YWxpZmllZE5hbWUsIG9wdGlvbmFsIERvY3VtZW50VHlwZT8gZG9jdHlwZSA9IG51bGwpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0RPTVBhcnNlci5pZGwgYi9zcmMvY29iYWx0L2RvbS9ET01QYXJzZXIuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNTFhNzllLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RPTVBhcnNlci5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLVBhcnNpbmcvI3RoZS1kb21wYXJzZXItaW50ZXJmYWNlCi0KLWVudW0gU3VwcG9ydGVkVHlwZSB7Ci0gICAgInRleHQvaHRtbCIsCi0gICAgInRleHQveG1sIiwKLSAgICAiYXBwbGljYXRpb24veG1sIiwKLSAgICAiYXBwbGljYXRpb24veGh0bWwreG1sIiwKLSAgICAiaW1hZ2Uvc3ZnK3htbCIKLX07Ci0KLVsKLSAgQ29uc3RydWN0b3IsCi0gIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncwotXSBpbnRlcmZhY2UgRE9NUGFyc2VyIHsKLSAgW05ld09iamVjdF0gRG9jdW1lbnQgcGFyc2VGcm9tU3RyaW5nKERPTVN0cmluZyBzdHIsIFN1cHBvcnRlZFR5cGUgdHlwZSk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vRE9NUmVjdC5pZGwgYi9zcmMvY29iYWx0L2RvbS9ET01SZWN0LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTlkZGVlZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9ET01SZWN0LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9nZW9tZXRyeS0xLyNET01SZWN0Ci0KLVsKLSAgQ29uc3RydWN0b3IoKSwKLSAgQ29uc3RydWN0b3IodW5yZXN0cmljdGVkIGRvdWJsZSB4KSwKLSAgQ29uc3RydWN0b3IodW5yZXN0cmljdGVkIGRvdWJsZSB4LCB1bnJlc3RyaWN0ZWQgZG91YmxlIHkpLAotICBDb25zdHJ1Y3Rvcih1bnJlc3RyaWN0ZWQgZG91YmxlIHgsIHVucmVzdHJpY3RlZCBkb3VibGUgeSwKLSAgICAgICAgICAgICAgdW5yZXN0cmljdGVkIGRvdWJsZSB3aWR0aCksCi0gIENvbnN0cnVjdG9yKHVucmVzdHJpY3RlZCBkb3VibGUgeCwgdW5yZXN0cmljdGVkIGRvdWJsZSB5LAotICAgICAgICAgICAgICB1bnJlc3RyaWN0ZWQgZG91YmxlIHdpZHRoLCB1bnJlc3RyaWN0ZWQgZG91YmxlIGhlaWdodCkKLV0KLWludGVyZmFjZSBET01SZWN0IDogRE9NUmVjdFJlYWRPbmx5IHsKLSAgaW5oZXJpdCBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSB4OwotICBpbmhlcml0IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIHk7Ci0gIGluaGVyaXQgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgd2lkdGg7Ci0gIGluaGVyaXQgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgaGVpZ2h0OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0RPTVJlY3RMaXN0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0RPTVJlY3RMaXN0LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjFlNzNmMi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9ET01SZWN0TGlzdC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZ2VvbWV0cnktMS8jRE9NUmVjdExpc3QKLQotW05vSW50ZXJmYWNlT2JqZWN0LAotIEFycmF5Q2xhc3NdCi1pbnRlcmZhY2UgRE9NUmVjdExpc3QgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGdldHRlciBET01SZWN0PyBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0RPTVJlY3RSZWFkT25seS5pZGwgYi9zcmMvY29iYWx0L2RvbS9ET01SZWN0UmVhZE9ubHkuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NzBlMGJhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RPTVJlY3RSZWFkT25seS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZ2VvbWV0cnktMS8jZG9tLWRvbXJlY3RyZWFkb25seQotCi1bCi0gIENvbnN0cnVjdG9yKHVucmVzdHJpY3RlZCBkb3VibGUgeCwgdW5yZXN0cmljdGVkIGRvdWJsZSB5LAotICAgICAgICAgICAgICB1bnJlc3RyaWN0ZWQgZG91YmxlIHdpZHRoLCB1bnJlc3RyaWN0ZWQgZG91YmxlIGhlaWdodCkKLV0KLWludGVyZmFjZSBET01SZWN0UmVhZE9ubHkgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSB4OwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSB5OwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSB3aWR0aDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgaGVpZ2h0OwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSB0b3A7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIHJpZ2h0OwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSBib3R0b207Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIGxlZnQ7Ci19OwotCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ET01TdHJpbmdNYXAuaWRsIGIvc3JjL2NvYmFsdC9kb20vRE9NU3RyaW5nTWFwLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NiMzllMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9ET01TdHJpbmdNYXAuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2luZnJhc3RydWN0dXJlLmh0bWwjZG9tc3RyaW5nbWFwCi0KLVtPdmVycmlkZUJ1aWx0aW5zXQotaW50ZXJmYWNlIERPTVN0cmluZ01hcCB7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIGdldHRlciBET01TdHJpbmc/IChET01TdHJpbmcgbmFtZSk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHNldHRlciBjcmVhdG9yIHZvaWQgKERPTVN0cmluZyBuYW1lLCBET01TdHJpbmcgdmFsdWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0RPTVRva2VuTGlzdC5pZGwgYi9zcmMvY29iYWx0L2RvbS9ET01Ub2tlbkxpc3QuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNThhNjRhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RPTVRva2VuTGlzdC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb210b2tlbmxpc3QKLQotW0FkZE9wYXF1ZVJvb3RzPShlbGVtZW50KV0KLWludGVyZmFjZSBET01Ub2tlbkxpc3QgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGdldHRlciBET01TdHJpbmc/IGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7Ci0gIGJvb2xlYW4gY29udGFpbnMoRE9NU3RyaW5nIHRva2VuKTsKLSAgdm9pZCBhZGQoRE9NU3RyaW5nLi4uIHRva2Vucyk7Ci0gIHZvaWQgcmVtb3ZlKERPTVN0cmluZy4uLiB0b2tlbnMpOwotICBzdHJpbmdpZmllcjsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9EYXRhVmlldy5pZGwgYi9zcmMvY29iYWx0L2RvbS9EYXRhVmlldy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5OTJjMTIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vRGF0YVZpZXcuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdHlwZWRhcnJheS9zcGVjcy9sYXRlc3QvIzgKLQotWwotICBDb25zdHJ1Y3RvcihBcnJheUJ1ZmZlciBidWZmZXIsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwKLSAgICAgICAgICAgICAgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBieXRlTGVuZ3RoKSwKLSAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yCi1dCi1pbnRlcmZhY2UgRGF0YVZpZXcgewotICBbUmFpc2VzRXhjZXB0aW9uXSBieXRlIGdldEludDgodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0KTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gb2N0ZXQgZ2V0VWludDgodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0KTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gc2hvcnQgZ2V0SW50MTYodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHVuc2lnbmVkIHNob3J0IGdldFVpbnQxNih1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIGxvbmcgZ2V0SW50MzIodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdW5zaWduZWQgbG9uZyBnZXRVaW50MzIodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIGZsb2F0IGdldEZsb2F0MzIodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gZG91YmxlIGdldEZsb2F0NjQodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7Ci0KLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRJbnQ4KHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgYnl0ZSB2YWx1ZSk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0VWludDgodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBvY3RldCB2YWx1ZSk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0SW50MTYodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBzaG9ydCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0VWludDE2KHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRJbnQzMih1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIGxvbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgYm9vbGVhbiBsaXR0bGVFbmRpYW4pOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNldFVpbnQzMih1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRGbG9hdDMyKHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgZmxvYXQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0RmxvYXQ2NCh1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIGRvdWJsZSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKLX07Ci0KLURhdGFWaWV3IGltcGxlbWVudHMgQXJyYXlCdWZmZXJWaWV3OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMzMzMzRkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RvY3VtZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2RvY3VtZW50Ci0KLWludGVyZmFjZSBEb2N1bWVudCA6IE5vZGUgewotICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIERPTUltcGxlbWVudGF0aW9uIGltcGxlbWVudGF0aW9uOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIFVSTDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBkb2N1bWVudFVSSTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEVsZW1lbnQ/IGRvY3VtZW50RWxlbWVudDsKLQotICAvLyBOb24tc3RhbmRhcmQgcmV0dXJuIHR5cGUsIHNob3VsZCBiZSBXaW5kb3dQcm94eS4KLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NpbmdsZS1wYWdlLmh0bWwjZG9tLWRvY3VtZW50LWRlZmF1bHR2aWV3Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3c/IGRlZmF1bHRWaWV3OwotCi0gIEhUTUxDb2xsZWN0aW9uIGdldEVsZW1lbnRzQnlUYWdOYW1lKERPTVN0cmluZyBsb2NhbE5hbWUpOwotICBIVE1MQ29sbGVjdGlvbiBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKERPTVN0cmluZyBjbGFzc05hbWVzKTsKLSAgW05ld09iamVjdF0gRWxlbWVudCBjcmVhdGVFbGVtZW50KERPTVN0cmluZyBsb2NhbE5hbWUpOwotICBbTmV3T2JqZWN0XSBFbGVtZW50IGNyZWF0ZUVsZW1lbnROUyhET01TdHJpbmcgbmFtZXNwYWNlVVJJLCBET01TdHJpbmcgbG9jYWxOYW1lKTsKLQotICBbTmV3T2JqZWN0XSBUZXh0IGNyZWF0ZVRleHROb2RlKERPTVN0cmluZyBkYXRhKTsKLSAgW05ld09iamVjdF0gQ29tbWVudCBjcmVhdGVDb21tZW50KERPTVN0cmluZyBkYXRhKTsKLQotICBbTmV3T2JqZWN0LCBSYWlzZXNFeGNlcHRpb25dIEV2ZW50IGNyZWF0ZUV2ZW50KERPTVN0cmluZyBpbnRlcmZhY2VOYW1lKTsKLSAgYXR0cmlidXRlIERPTVN0cmluZyBjb29raWU7Ci19OwotCi1Eb2N1bWVudCBpbXBsZW1lbnRzIEdsb2JhbEV2ZW50SGFuZGxlcnM7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9Eb2N1bWVudFRpbWVsaW5lLmlkbCBiL3NyYy9jb2JhbHQvZG9tL0RvY3VtZW50VGltZWxpbmUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY2MDhmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RvY3VtZW50VGltZWxpbmUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWRvY3VtZW50dGltZWxpbmUtaW50ZXJmYWNlCi0KLVsKLSAgICBDb25zdHJ1Y3RvciAoRE9NSGlnaFJlc1RpbWVTdGFtcCBvcmlnaW5UaW1lKSwKLSAgICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MKLV0gaW50ZXJmYWNlIERvY3VtZW50VGltZWxpbmUgOiBBbmltYXRpb25UaW1lbGluZSB7Ci19OwotCi10eXBlZGVmIGRvdWJsZSBET01IaWdoUmVzVGltZVN0YW1wOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnRUeXBlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL0RvY3VtZW50VHlwZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRiZGIwYTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnRUeXBlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2RvY3VtZW50dHlwZQotCi1pbnRlcmZhY2UgRG9jdW1lbnRUeXBlIDogTm9kZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbmFtZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBwdWJsaWNJZDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzeXN0ZW1JZDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9Eb2N1bWVudF9DU1NPTS5pZGwgYi9zcmMvY29iYWx0L2RvbS9Eb2N1bWVudF9DU1NPTS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzZjEwNmQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnRfQ1NTT00uaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjEgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI2V4dGVuc2lvbnMtdG8tdGhlLWRvY3VtZW50LWludGVyZmFjZQotCi1wYXJ0aWFsIGludGVyZmFjZSBEb2N1bWVudCB7Ci0gIFtTYW1lT2JqZWN0XSByZWFkb25seSBhdHRyaWJ1dGUgU3R5bGVTaGVldExpc3Qgc3R5bGVTaGVldHM7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnRfSFRNTDUuaWRsIGIvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnRfSFRNTDUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTY2YmJlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0RvY3VtZW50X0hUTUw1LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kb20uaHRtbCN0aGUtZG9jdW1lbnQtb2JqZWN0Ci0KLVtPdmVycmlkZUJ1aWx0aW5zXQotcGFydGlhbCAvKnNlYWxlZCovIGludGVyZmFjZSBEb2N1bWVudCB7Ci0gIFtQdXRGb3J3YXJkcz1ocmVmLCBVbmZvcmdlYWJsZV0gcmVhZG9ubHkgYXR0cmlidXRlIExvY2F0aW9uPyBsb2NhdGlvbjsKLSAgLy8gYm9keSBhdHRyaWJ1dGUgaXMgY2hhbmdlZCwgZnJvbSB0aGUgc3BlYydzOgotICAvLyAgIGF0dHJpYnV0ZSBIVE1MRWxlbWVudD8gYm9keTsKLSAgLy8gVGhpcyBpcyBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgZnJhbWVzZXQgZWxlbWVudCwgYm9keSBoYXMgdG8gYmUgYW4KLSAgLy8gSFRNTEJvZHlFbGVtZW50LgotICBhdHRyaWJ1dGUgSFRNTEJvZHlFbGVtZW50PyBib2R5OwotICByZWFkb25seSBhdHRyaWJ1dGUgSFRNTEhlYWRFbGVtZW50PyBoZWFkOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRpdGxlOwotICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gYWN0aXZlRWxlbWVudDsKLQotICBbTGVuaWVudFRoaXNdIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25yZWFkeXN0YXRlY2hhbmdlOwotfTsKLQotLy8gVE9ETzogVGhlIElETCBkZWZpbmVzIEV2ZW50SGFuZGxlciBhcyBhIG51bGxhYmxlIGNhbGxiYWNrCi0vLyBmdW5jdGlvbi4gRGVmaW5lIGl0IGFzIGEgbnVsbGFibGUgRXZlbnRMaXN0ZW5lciBmb3Igbm93IHVudGlsIHdlIGNhbiBkbwotLy8gc29tZSByZWZhY3RvcmluZyB0byBhY2NlcHQgYm90aCBpbiB0aGUgRXZlbnRUYXJnZXQgaW1wbGVtZW50YXRpb24uCi10eXBlZGVmIEV2ZW50TGlzdGVuZXI/IEV2ZW50SGFuZGxlcjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0RvY3VtZW50X1dlYkFuaW1hdGlvbnNBUEkuaWRsIGIvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnRfV2ViQW5pbWF0aW9uc0FQSS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZDgzYWEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vRG9jdW1lbnRfV2ViQW5pbWF0aW9uc0FQSS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC13ZWItYW5pbWF0aW9ucy0xLTIwMTUwNzA3LyNleHRlbnNpb25zLXRvLXRoZS1kb2N1bWVudC1pbnRlcmZhY2UKLQotcGFydGlhbCBpbnRlcmZhY2UgRG9jdW1lbnQgewotICByZWFkb25seSBhdHRyaWJ1dGUgRG9jdW1lbnRUaW1lbGluZSB0aW1lbGluZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9FbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0VsZW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzc4MzExLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0VsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jZWxlbWVudAotCi1pbnRlcmZhY2UgRWxlbWVudCA6IE5vZGUgewotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRhZ05hbWU7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgaWQ7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgY2xhc3NOYW1lOwotICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIERPTVRva2VuTGlzdCBjbGFzc0xpc3Q7Ci0gIC8vIFRPRE86IENoYW5nZSB0byBBdHRyW10gd2hlbiBiaW5kaW5ncyBmb3IgYXJyYXkgYXJlIGltcGxlbWVudGVkIGFuZAotICAvLyByZW1vdmUgTmFtZWROb2RlTWFwLCB3aGljaCBpcyBhIGRlcHJlY2F0ZWQgaW50ZXJmYWNlLgotICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIE5hbWVkTm9kZU1hcCBhdHRyaWJ1dGVzOwotICBET01TdHJpbmc/IGdldEF0dHJpYnV0ZShET01TdHJpbmcgbmFtZSk7Ci0gIHZvaWQgc2V0QXR0cmlidXRlKERPTVN0cmluZyBuYW1lLCBET01TdHJpbmcgdmFsdWUpOwotICB2b2lkIHJlbW92ZUF0dHJpYnV0ZShET01TdHJpbmcgbmFtZSk7Ci0gIGJvb2xlYW4gaGFzQXR0cmlidXRlKERPTVN0cmluZyBuYW1lKTsKLSAgSFRNTENvbGxlY3Rpb24gZ2V0RWxlbWVudHNCeVRhZ05hbWUoRE9NU3RyaW5nIGxvY2FsTmFtZSk7Ci0gIEhUTUxDb2xsZWN0aW9uIGdldEVsZW1lbnRzQnlDbGFzc05hbWUoRE9NU3RyaW5nIGNsYXNzTmFtZXMpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0VsZW1lbnRDU1NJbmxpbmVTdHlsZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9FbGVtZW50Q1NTSW5saW5lU3R5bGUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4YjgyYzI4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0VsZW1lbnRDU1NJbmxpbmVTdHlsZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jZWxlbWVudGNzc2lubGluZXN0eWxlCi0KLVtOb0ludGVyZmFjZU9iamVjdF0KLWludGVyZmFjZSBFbGVtZW50Q1NTSW5saW5lU3R5bGUgewotICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIENTU1N0eWxlRGVjbGFyYXRpb24gc3R5bGU7Ci19OwotCi1IVE1MRWxlbWVudCBpbXBsZW1lbnRzIEVsZW1lbnRDU1NJbmxpbmVTdHlsZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0VsZW1lbnRfQ1NTT01WaWV3LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0VsZW1lbnRfQ1NTT01WaWV3LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBkNjNhMi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9FbGVtZW50X0NTU09NVmlldy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS12aWV3LTIwMTMxMjE3LyNleHRlbnNpb25zLXRvLXRoZS1lbGVtZW50LWludGVyZmFjZQotCi1wYXJ0aWFsIGludGVyZmFjZSBFbGVtZW50IHsKLSAgRE9NUmVjdExpc3QgZ2V0Q2xpZW50UmVjdHMoKTsKLSAgRE9NUmVjdCBnZXRCb3VuZGluZ0NsaWVudFJlY3QoKTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBjbGllbnRUb3A7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgY2xpZW50TGVmdDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBjbGllbnRXaWR0aDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBjbGllbnRIZWlnaHQ7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vRWxlbWVudF9ET01QYXJzaW5nQW5kU2VyaWFsaXphdGlvbi5pZGwgYi9zcmMvY29iYWx0L2RvbS9FbGVtZW50X0RPTVBhcnNpbmdBbmRTZXJpYWxpemF0aW9uLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNlOTU3Mi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9FbGVtZW50X0RPTVBhcnNpbmdBbmRTZXJpYWxpemF0aW9uLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tUGFyc2luZy8jZXh0ZW5zaW9ucy10by10aGUtZWxlbWVudC1pbnRlcmZhY2UKLQotcGFydGlhbCBpbnRlcmZhY2UgRWxlbWVudCB7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZ10gYXR0cmlidXRlIERPTVN0cmluZyBpbm5lckhUTUw7Ci0gIFtUcmVhdE51bGxBcz1FbXB0eVN0cmluZywgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG91dGVySFRNTDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9FdmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9FdmVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYzMDYzZDUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vRXZlbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jZXZlbnQKLQotW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlKV0KLWludGVyZmFjZSBFdmVudCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdHlwZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEV2ZW50VGFyZ2V0PyB0YXJnZXQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBFdmVudFRhcmdldD8gY3VycmVudFRhcmdldDsKLQotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOT05FID0gMDsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ0FQVFVSSU5HX1BIQVNFID0gMTsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgQVRfVEFSR0VUID0gMjsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgQlVCQkxJTkdfUEhBU0UgPSAzOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgZXZlbnRQaGFzZTsKLQotICB2b2lkIHN0b3BQcm9wYWdhdGlvbigpOwotICB2b2lkIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOwotCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIGJ1YmJsZXM7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIGNhbmNlbGFibGU7Ci0gIHZvaWQgcHJldmVudERlZmF1bHQoKTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gZGVmYXVsdFByZXZlbnRlZDsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NVGltZVN0YW1wIHRpbWVTdGFtcDsKLQotICB2b2lkIGluaXRFdmVudChET01TdHJpbmcgdHlwZSwgYm9vbGVhbiBidWJibGVzLCBib29sZWFuIGNhbmNlbGFibGUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0V2ZW50TGlzdGVuZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vRXZlbnRMaXN0ZW5lci5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlYTVjYzMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vRXZlbnRMaXN0ZW5lci5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNldmVudGxpc3RlbmVyCi0KLWNhbGxiYWNrIGludGVyZmFjZSBFdmVudExpc3RlbmVyIHsKLSAgLy8gVE9ETzogQmVjYXVzZSB0aGUgRXZlbnRIYW5kbGVyIHR5cGUgaXMgdHlwZWRlZidkIGFzIGEgbnVsbGFibGUKLSAgLy8gRXZlbnRMaXN0ZW5lciwgd2UgbmVlZCB0byBhbGxvdyB0aGUgcmV0dXJuIG9mIGEgYm9vbGVhbiB2YWx1ZS4gVGhlIHZhbHVlCi0gIC8vIG9mIHRoaXMgd2lsbCBvbmx5IGJlIGNoZWNrZWQgaWYgdGhlIEV2ZW50TGlzdGVuZXIgd2FzIGFkZGVkIGFzIGFuCi0gIC8vIGF0dHJpYnV0ZSAobm90IHRocm91Z2ggYWRkRXZlbnRMaXN0ZW5lcikuCi0gIGJvb2xlYW4/IGhhbmRsZUV2ZW50KEV2ZW50IGV2ZW50KTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9FdmVudFRhcmdldC5pZGwgYi9zcmMvY29iYWx0L2RvbS9FdmVudFRhcmdldC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmNzYzYmIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vRXZlbnRUYXJnZXQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jZXZlbnR0YXJnZXQKLQotaW50ZXJmYWNlIEV2ZW50VGFyZ2V0IHsKLSAgdm9pZCBhZGRFdmVudExpc3RlbmVyKERPTVN0cmluZyB0eXBlLCBFdmVudExpc3RlbmVyPyBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gdXNlQ2FwdHVyZSA9IGZhbHNlKTsKLSAgdm9pZCByZW1vdmVFdmVudExpc3RlbmVyKERPTVN0cmluZyB0eXBlLCBFdmVudExpc3RlbmVyPyBsaXN0ZW5lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gdXNlQ2FwdHVyZSA9IGZhbHNlKTsKLQotICBbUmFpc2VzRXhjZXB0aW9uXSBib29sZWFuIGRpc3BhdGNoRXZlbnQoRXZlbnQgZXZlbnQpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0Zsb2F0MzJBcnJheS5pZGwgYi9zcmMvY29iYWx0L2RvbS9GbG9hdDMyQXJyYXkuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZGY0MWExLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0Zsb2F0MzJBcnJheS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS90eXBlZGFycmF5L3NwZWNzL2xhdGVzdC8jNwotCi1bCi0gIENvbnN0cnVjdG9yKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKLSAgQ29uc3RydWN0b3IoRmxvYXQzMkFycmF5IGFycmF5KSwKLSAgQ29uc3RydWN0b3IoQXJyYXlCdWZmZXIgYnVmZmVyLCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKLSAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzLAotICBSYWlzZXNFeGNlcHRpb249Q29uc3RydWN0b3IKLV0KLWludGVyZmFjZSBGbG9hdDMyQXJyYXkgOiBBcnJheUJ1ZmZlclZpZXcgewotICBjb25zdCB1bnNpZ25lZCBsb25nIEJZVEVTX1BFUl9FTEVNRU5UID0gNDsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0KLSAgZ2V0dGVyIHVucmVzdHJpY3RlZCBmbG9hdCBnZXQodW5zaWduZWQgbG9uZyBpbmRleCk7Ci0gIHNldHRlciB2b2lkIHNldCh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnJlc3RyaWN0ZWQgZmxvYXQgdmFsdWUpOwotCi0gIC8vIFJldHVybiBhIG5ldyBGbG9hdDMyQXJyYXkgdGhhdCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoaXMgb25lLgotICAvLyBDb250YWlucyB0aGlzW3N0YXJ0XS4udGhpc1tlbmRdLiBlbmQgZGVmYXVsdHMgdG8gbGVuZ3RoIGlmIHVuc3BlY2lmaWVkLgotICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gRmxvYXQzMkFycmF5IHN1YmFycmF5KGxvbmcgc3RhcnQsIG9wdGlvbmFsIGxvbmcgZW5kKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9GbG9hdDY0QXJyYXkuaWRsIGIvc3JjL2NvYmFsdC9kb20vRmxvYXQ2NEFycmF5LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2JmMDc1Ni4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9GbG9hdDY0QXJyYXkuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdHlwZWRhcnJheS9zcGVjcy9sYXRlc3QvIzcKLQotWwotICBDb25zdHJ1Y3Rvcih1bnNpZ25lZCBsb25nIGxlbmd0aCksCi0gIENvbnN0cnVjdG9yKEZsb2F0NjRBcnJheSBhcnJheSksCi0gIENvbnN0cnVjdG9yKEFycmF5QnVmZmVyIGJ1ZmZlciwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGxlbmd0aCksCi0gIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncywKLSAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yCi1dCi1pbnRlcmZhY2UgRmxvYXQ2NEFycmF5IDogQXJyYXlCdWZmZXJWaWV3IHsKLSAgY29uc3QgdW5zaWduZWQgbG9uZyBCWVRFU19QRVJfRUxFTUVOVCA9IDg7Ci0KLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotCi0gIGdldHRlciB1bnJlc3RyaWN0ZWQgZG91YmxlIGdldCh1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgc2V0dGVyIHZvaWQgc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVucmVzdHJpY3RlZCBkb3VibGUgdmFsdWUpOwotCi0gIC8vIFJldHVybiBhIG5ldyBGbG9hdDY0QXJyYXkgdGhhdCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoaXMgb25lLgotICAvLyBDb250YWlucyB0aGlzW3N0YXJ0XS4udGhpc1tlbmRdLiBlbmQgZGVmYXVsdHMgdG8gbGVuZ3RoIGlmIHVuc3BlY2lmaWVkLgotICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gRmxvYXQ2NEFycmF5IHN1YmFycmF5KGxvbmcgc3RhcnQsIG9wdGlvbmFsIGxvbmcgZW5kKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9Gb2N1c0V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0ZvY3VzRXZlbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTBmMzBlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0ZvY3VzRXZlbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0QtdWlldmVudHMtMjAxNTEyMTUvI2ludGVyZmFjZS1Gb2N1c0V2ZW50Ci0KLVtDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCi1pbnRlcmZhY2UgRm9jdXNFdmVudCA6IFVJRXZlbnQgewotICByZWFkb25seSBhdHRyaWJ1dGUgRXZlbnRUYXJnZXQ/IHJlbGF0ZWRUYXJnZXQ7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vR2xvYmFsQ3J5cHRvLmlkbCBiL3NyYy9jb2JhbHQvZG9tL0dsb2JhbENyeXB0by5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYzQ2YTMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vR2xvYmFsQ3J5cHRvLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJDcnlwdG9BUEkvI2NyeXB0by1pbnRlcmZhY2UKLQotW05vSW50ZXJmYWNlT2JqZWN0XQotaW50ZXJmYWNlIEdsb2JhbENyeXB0byB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBDcnlwdG8gY3J5cHRvOwotfTsKLVdpbmRvdyBpbXBsZW1lbnRzIEdsb2JhbENyeXB0bzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0dsb2JhbEV2ZW50SGFuZGxlcnMuaWRsIGIvc3JjL2NvYmFsdC9kb20vR2xvYmFsRXZlbnRIYW5kbGVycy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZTQ2MGUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vR2xvYmFsRXZlbnRIYW5kbGVycy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI2dsb2JhbGV2ZW50aGFuZGxlcnMKLQotW05vSW50ZXJmYWNlT2JqZWN0XQotaW50ZXJmYWNlIEdsb2JhbEV2ZW50SGFuZGxlcnMgewotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uYmx1cjsKLSAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmVycm9yOwotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uZm9jdXM7Ci0gIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25sb2FkOwotfTsKLQotLy8gVE9ETzogVGhlIElETCBkZWZpbmVzIEV2ZW50SGFuZGxlciBhcyBhIG51bGxhYmxlIGNhbGxiYWNrCi0vLyBmdW5jdGlvbi4gRGVmaW5lIGl0IGFzIGEgbnVsbGFibGUgRXZlbnRMaXN0ZW5lciBmb3Igbm93IHVudGlsIHdlIGNhbiBkbwotLy8gc29tZSByZWZhY3RvcmluZyB0byBhY2NlcHQgYm90aCBpbiB0aGUgRXZlbnRUYXJnZXQgaW1wbGVtZW50YXRpb24uCi10eXBlZGVmIEV2ZW50TGlzdGVuZXI/IEV2ZW50SGFuZGxlcjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hUTUxBbmNob3JFbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0hUTUxBbmNob3JFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2I3MmFlMC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MQW5jaG9yRWxlbWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvdGV4dC1sZXZlbC1zZW1hbnRpY3MuaHRtbCN0aGUtYS1lbGVtZW50Ci0KLWludGVyZmFjZSBIVE1MQW5jaG9yRWxlbWVudCA6IEhUTUxFbGVtZW50IHt9OwotSFRNTEFuY2hvckVsZW1lbnQgaW1wbGVtZW50cyBVUkxVdGlsczsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hUTUxCUkVsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTEJSRWxlbWVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmNTE3NDEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vSFRNTEJSRWxlbWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvdGV4dC1sZXZlbC1zZW1hbnRpY3MuaHRtbCN0aGUtYnItZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTEJSRWxlbWVudCA6IEhUTUxFbGVtZW50IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vSFRNTEJvZHlFbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0hUTUxCb2R5RWxlbWVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdkNWI2ZDIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vSFRNTEJvZHlFbGVtZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zZWN0aW9ucy5odG1sI3RoZS1ib2R5LWVsZW1lbnQKLQotaW50ZXJmYWNlIEhUTUxCb2R5RWxlbWVudCA6IEhUTUxFbGVtZW50IHsKLSAgLy8gQ1NTT00gVmlldyBNb2R1bGUKLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tdmlldy0yMDEzMTIxNy8jZXh0ZW5zaW9ucy10by10aGUtaHRtbGVsZW1lbnQtaW50ZXJmYWNlCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIG9mZnNldFdpZHRoOwotICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBvZmZzZXRIZWlnaHQ7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vSFRNTENvbGxlY3Rpb24uaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTENvbGxlY3Rpb24uaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGM5YzMxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxDb2xsZWN0aW9uLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2h0bWxjb2xsZWN0aW9uCi0KLWludGVyZmFjZSBIVE1MQ29sbGVjdGlvbiB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgZ2V0dGVyIEVsZW1lbnQ/IGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7Ci0gIGdldHRlciBFbGVtZW50PyBuYW1lZEl0ZW0oRE9NU3RyaW5nIG5hbWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hUTUxEaXZFbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0hUTUxEaXZFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4MjA4OC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MRGl2RWxlbWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZ3JvdXBpbmctY29udGVudC5odG1sI3RoZS1kaXYtZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTERpdkVsZW1lbnQgOiBIVE1MRWxlbWVudCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hUTUxFbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0hUTUxFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmNhNWUzYi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MRWxlbWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZG9tLmh0bWwjaHRtbGVsZW1lbnQKLQotaW50ZXJmYWNlIEhUTUxFbGVtZW50IDogRWxlbWVudCB7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgZGlyOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nTWFwIGRhdGFzZXQ7Ci0gIGF0dHJpYnV0ZSBsb25nIHRhYkluZGV4OwotICB2b2lkIGZvY3VzKCk7Ci0gIHZvaWQgYmx1cigpOwotfTsKLUhUTUxFbGVtZW50IGltcGxlbWVudHMgR2xvYmFsRXZlbnRIYW5kbGVyczsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hUTUxFbGVtZW50X0NTU09NVmlldy5pZGwgYi9zcmMvY29iYWx0L2RvbS9IVE1MRWxlbWVudF9DU1NPTVZpZXcuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTg0MzFkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxFbGVtZW50X0NTU09NVmlldy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS12aWV3LTIwMTMxMjE3LyNleHRlbnNpb25zLXRvLXRoZS1odG1sZWxlbWVudC1pbnRlcmZhY2UKLQotcGFydGlhbCBpbnRlcmZhY2UgSFRNTEVsZW1lbnQgewotICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gb2Zmc2V0UGFyZW50OwotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG9mZnNldFRvcDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBvZmZzZXRMZWZ0OwotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG9mZnNldFdpZHRoOwotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG9mZnNldEhlaWdodDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MSGVhZEVsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTEhlYWRFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODBiZDdhMS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MSGVhZEVsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvY3VtZW50LW1ldGFkYXRhLmh0bWwjdGhlLWhlYWQtZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTEhlYWRFbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MSGVhZGluZ0VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTEhlYWRpbmdFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjMzN2VmNi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MSGVhZGluZ0VsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NlY3Rpb25zLmh0bWwjdGhlLWgxLC1oMiwtaDMsLWg0LC1oNSwtYW5kLWg2LWVsZW1lbnRzCi0KLWludGVyZmFjZSBIVE1MSGVhZGluZ0VsZW1lbnQgOiBIVE1MRWxlbWVudCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hUTUxIdG1sRWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9IVE1MSHRtbEVsZW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2M4Y2U1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxIdG1sRWxlbWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2VtYW50aWNzLmh0bWwjdGhlLWh0bWwtZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTEh0bWxFbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MSW1hZ2VFbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0hUTUxJbWFnZUVsZW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Mzg3MjAzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxJbWFnZUVsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI3RoZS1pbWctZWxlbWVudAotCi0vLyBUT0RPOiBBZGQgdGhlIG9wdGlvbmFsIHdpZHRoIGFuZCBoZWlnaHQgcGFyYW1ldGVycyB0byB0aGUKLS8vIGNvbnN0cnVjdG9yLCBhcyBzaG93biBpbiB0aGUgc3BlYy4KLVsKLSAgTmFtZWRDb25zdHJ1Y3Rvcj1JbWFnZSgpLAotICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MKLV0KLWludGVyZmFjZSBIVE1MSW1hZ2VFbGVtZW50IDogSFRNTEVsZW1lbnQgewotICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNyYzsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MTGlua0VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTExpbmtFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ0Yjk1Yy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MTGlua0VsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvY3VtZW50LW1ldGFkYXRhLmh0bWwjdGhlLWxpbmstZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTExpbmtFbGVtZW50IDogSFRNTEVsZW1lbnQgewotICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGhyZWY7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgcmVsOwotICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHR5cGU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vSFRNTE1lZGlhRWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9IVE1MTWVkaWFFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWEyNDAzYi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MTWVkaWFFbGVtZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNtZWRpYS1lbGVtZW50cwotCi1pbnRlcmZhY2UgSFRNTE1lZGlhRWxlbWVudCA6IEhUTUxFbGVtZW50IHsKLSAgLy8gZXJyb3Igc3RhdGUKLSAgcmVhZG9ubHkgYXR0cmlidXRlIE1lZGlhRXJyb3I/IGVycm9yOwotCi0gIC8vIG5ldHdvcmsgc3RhdGUKLSAgYXR0cmlidXRlIERPTVN0cmluZyBzcmM7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgY3VycmVudFNyYzsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgTkVUV09SS19FTVBUWSA9IDA7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5FVFdPUktfSURMRSA9IDE7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5FVFdPUktfTE9BRElORyA9IDI7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5FVFdPUktfTk9fU09VUkNFID0gMzsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IG5ldHdvcmtTdGF0ZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIFRpbWVSYW5nZXMgYnVmZmVyZWQ7Ci0gIHZvaWQgbG9hZCgpOwotICAvLyBUaGUga2V5U3lzdGVtIGFyZ3VtZW50IGlzIGFuIGV4dGVuc2lvbiBkZWZpbmVkIGluIEVuY3J5cHRlZCBNZWRpYSBFeHRlbnNpb25zLgotICAvLyAgIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvaHRtbC1tZWRpYS9yYXctZmlsZS9lbWUtdjAuMWIvZW5jcnlwdGVkLW1lZGlhL2VuY3J5cHRlZC1tZWRpYS5odG1sI2RvbS1jYW5wbGF5dHlwZQotICBET01TdHJpbmcgY2FuUGxheVR5cGUoRE9NU3RyaW5nIHR5cGUsIG9wdGlvbmFsIERPTVN0cmluZyBrZXlTeXN0ZW0pOwotCi0gIC8vIHJlYWR5IHN0YXRlCi0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IEhBVkVfTk9USElORyA9IDA7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IEhBVkVfTUVUQURBVEEgPSAxOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBIQVZFX0NVUlJFTlRfREFUQSA9IDI7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IEhBVkVfRlVUVVJFX0RBVEEgPSAzOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBIQVZFX0VOT1VHSF9EQVRBID0gNDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IHJlYWR5U3RhdGU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIHNlZWtpbmc7Ci0KLSAgLy8gcGxheWJhY2sgc3RhdGUKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIGRvdWJsZSBjdXJyZW50VGltZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBkdXJhdGlvbjsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gcGF1c2VkOwotICBhdHRyaWJ1dGUgZG91YmxlIGRlZmF1bHRQbGF5YmFja1JhdGU7Ci0gIGF0dHJpYnV0ZSBkb3VibGUgcGxheWJhY2tSYXRlOwotICByZWFkb25seSBhdHRyaWJ1dGUgVGltZVJhbmdlcyBwbGF5ZWQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBUaW1lUmFuZ2VzIHNlZWthYmxlOwotICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBlbmRlZDsKLSAgYXR0cmlidXRlIGJvb2xlYW4gYXV0b3BsYXk7Ci0gIGF0dHJpYnV0ZSBib29sZWFuIGxvb3A7Ci0gIHZvaWQgcGxheSgpOwotICB2b2lkIHBhdXNlKCk7Ci0KLSAgLy8gY29udHJvbHMKLSAgYXR0cmlidXRlIGJvb2xlYW4gY29udHJvbHM7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBkb3VibGUgdm9sdW1lOwotICBhdHRyaWJ1dGUgYm9vbGVhbiBtdXRlZDsKLQotICAvLyBFbmNyeXB0ZWQgTWVkaWEgRXh0ZW5zaW9ucyBtZXRob2RzCi0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgZ2VuZXJhdGVLZXlSZXF1ZXN0KERPTVN0cmluZyBrZXlTeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQ4QXJyYXk/IGluaXREYXRhKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBhZGRLZXkoRE9NU3RyaW5nIGtleVN5c3RlbSwgVWludDhBcnJheSBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVpbnQ4QXJyYXk/IGluaXREYXRhLCBET01TdHJpbmc/IHNlc3Npb25JZCk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgY2FuY2VsS2V5UmVxdWVzdChET01TdHJpbmcga2V5U3lzdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRE9NU3RyaW5nPyBzZXNzaW9uSWQpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hUTUxNZXRhRWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9IVE1MTWV0YUVsZW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjg4ZTY4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxNZXRhRWxlbWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZG9jdW1lbnQtbWV0YWRhdGEuaHRtbCN0aGUtbWV0YS1lbGVtZW50Ci0KLWludGVyZmFjZSBIVE1MTWV0YUVsZW1lbnQgOiBIVE1MRWxlbWVudCB7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgbmFtZTsKLSAgYXR0cmlidXRlIERPTVN0cmluZyBodHRwRXF1aXY7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgY29udGVudDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MUGFyYWdyYXBoRWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9IVE1MUGFyYWdyYXBoRWxlbWVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjOGFiN2IuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vSFRNTFBhcmFncmFwaEVsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2dyb3VwaW5nLWNvbnRlbnQuaHRtbCN0aGUtcC1lbGVtZW50Ci0KLWludGVyZmFjZSBIVE1MUGFyYWdyYXBoRWxlbWVudCA6IEhUTUxFbGVtZW50IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTFNjcmlwdEVsZW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2JhMTgwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxTY3JpcHRFbGVtZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zY3JpcHRpbmctMS5odG1sI3RoZS1zY3JpcHQtZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTFNjcmlwdEVsZW1lbnQgOiBIVE1MRWxlbWVudCB7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgc3JjOwotICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHR5cGU7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgY2hhcnNldDsKLSAgYXR0cmlidXRlIGJvb2xlYW4gYXN5bmM7Ci0gIC8vIEZyb20gQ29udGVudCBTZWN1cml0eSBQb2xpY3kgc3BlYy4KLSAgYXR0cmlidXRlIERPTVN0cmluZyBub25jZTsKLQotICAvLyBUaGlzIG1ldGhvZCBpcyBkZXByZWNhdGVkIGJ1dCBpdCBpcyBuZWVkZWQgdG8gd29ya2Fyb3VuZCBmb3IgbGFjayBvZgotICAvLyBQcm9taXNlLgotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ucmVhZHlzdGF0ZWNoYW5nZTsKLX07Ci0KLS8vIFRPRE86IFRoZSBJREwgZGVmaW5lcyBFdmVudEhhbmRsZXIgYXMgYSBudWxsYWJsZSBjYWxsYmFjawotLy8gZnVuY3Rpb24uIERlZmluZSBpdCBhcyBhIG51bGxhYmxlIEV2ZW50TGlzdGVuZXIgZm9yIG5vdyB1bnRpbCB3ZSBjYW4gZG8KLS8vIHNvbWUgcmVmYWN0b3JpbmcgdG8gYWNjZXB0IGJvdGggaW4gdGhlIEV2ZW50VGFyZ2V0IGltcGxlbWVudGF0aW9uLgotdHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MU3BhbkVsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTFNwYW5FbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTk2NDIwMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MU3BhbkVsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RleHQtbGV2ZWwtc2VtYW50aWNzLmh0bWwjdGhlLXNwYW4tZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTFNwYW5FbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MU3R5bGVFbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0hUTUxTdHlsZUVsZW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjODk3OGU4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxTdHlsZUVsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvY3VtZW50LW1ldGFkYXRhLmh0bWwjdGhlLXN0eWxlLWVsZW1lbnQKLQotaW50ZXJmYWNlIEhUTUxTdHlsZUVsZW1lbnQgOiBIVE1MRWxlbWVudCB7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmcgdHlwZTsKLX07Ci1IVE1MU3R5bGVFbGVtZW50IGltcGxlbWVudHMgTGlua1N0eWxlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vSFRNTFRpdGxlRWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9IVE1MVGl0bGVFbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0YzY3MS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MVGl0bGVFbGVtZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDE5ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kb2N1bWVudC1tZXRhZGF0YS5odG1sI3RoZS10aXRsZS1lbGVtZW50Ci0KLWludGVyZmFjZSBIVE1MVGl0bGVFbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MVW5rbm93bkVsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vSFRNTFVua25vd25FbGVtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2UwNjgwNy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9IVE1MVW5rbm93bkVsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvbS5odG1sI2h0bWx1bmtub3duZWxlbWVudAotCi1pbnRlcmZhY2UgSFRNTFVua25vd25FbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9IVE1MVmlkZW9FbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL0hUTUxWaWRlb0VsZW1lbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZjQ0MDYwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL0hUTUxWaWRlb0VsZW1lbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI3RoZS12aWRlby1lbGVtZW50Ci0KLWludGVyZmFjZSBIVE1MVmlkZW9FbGVtZW50IDogSFRNTE1lZGlhRWxlbWVudCB7Ci0gIGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHdpZHRoOwotICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBoZWlnaHQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHZpZGVvV2lkdGg7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHZpZGVvSGVpZ2h0OwotCi0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYS1zb3VyY2UvI3dpZGwtSFRNTFZpZGVvRWxlbWVudC1nZXRWaWRlb1BsYXliYWNrUXVhbGl0eS1WaWRlb1BsYXliYWNrUXVhbGl0eQotICBWaWRlb1BsYXliYWNrUXVhbGl0eSBnZXRWaWRlb1BsYXliYWNrUXVhbGl0eSgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0hpc3RvcnkuaWRsIGIvc3JjL2NvYmFsdC9kb20vSGlzdG9yeS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxMjBhNTguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vSGlzdG9yeS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvYnJvd3NlcnMuaHRtbCN0aGUtaGlzdG9yeS1pbnRlcmZhY2UKLQotLy8gVGhlIGpvaW50IHNlc3Npb24gaGlzdG9yeSBvZiBhIHRvcC1sZXZlbCBicm93c2luZyBjb250ZXh0IGlzIHRoZSB1bmlvbiBvZgotLy8gYWxsIHRoZSBzZXNzaW9uIGhpc3RvcmllcyBvZiBhbGwgYnJvd3NpbmcgY29udGV4dHMgb2YgYWxsIHRoZSBmdWxseSBhY3RpdmUKLS8vIERvY3VtZW50IG9iamVjdHMgdGhhdCBzaGFyZSB0aGF0IHRvcC1sZXZlbCBicm93c2luZyBjb250ZXh0LCB3aXRoIGFsbCB0aGUKLS8vIGVudHJpZXMgdGhhdCBhcmUgY3VycmVudCBlbnRyaWVzIGluIHRoZWlyIHJlc3BlY3RpdmUgc2Vzc2lvbiBoaXN0b3JpZXMKLS8vIHJlbW92ZWQgZXhjZXB0IGZvciB0aGUgY3VycmVudCBlbnRyeSBvZiB0aGUgam9pbnQgc2Vzc2lvbiBoaXN0b3J5LgotLy8gSnVzdCBhIHN0dWJiZWQgaW1wbGVtZW50YXRpb24gaXMgY3VycmVudGx5IHJlcXVpcmVkLiBIb3dldmVyLCBtb3JlIHN1cHBvcnQKLS8vIG1heSBiZSBuZWVkZWQgaW4gdGhlIGZ1dHVyZSBmb3Igb3RoZXIgY2xpZW50cy4KLWludGVyZmFjZSBIaXN0b3J5IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGxvbmcgbGVuZ3RoOwotfTsKLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vSW50MTZBcnJheS5pZGwgYi9zcmMvY29iYWx0L2RvbS9JbnQxNkFycmF5LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NjNGQzYy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9JbnQxNkFycmF5LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3R5cGVkYXJyYXkvc3BlY3MvbGF0ZXN0LyM3Ci1bCi0gIENvbnN0cnVjdG9yKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKLSAgQ29uc3RydWN0b3IoSW50MTZBcnJheSBhcnJheSksCi0gIENvbnN0cnVjdG9yKEFycmF5QnVmZmVyIGJ1ZmZlciwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGxlbmd0aCksCi0gIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncywKLSAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yCi1dCi1pbnRlcmZhY2UgSW50MTZBcnJheSA6IEFycmF5QnVmZmVyVmlldyB7Ci0gIGNvbnN0IHVuc2lnbmVkIGxvbmcgQllURVNfUEVSX0VMRU1FTlQgPSAyOwotCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQotICBnZXR0ZXIgc2hvcnQgZ2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotICBzZXR0ZXIgdm9pZCBzZXQodW5zaWduZWQgbG9uZyBpbmRleCwgc2hvcnQgdmFsdWUpOwotCi0gIC8vIFRPRE86IFdoZW4gYXJyYXlzIG9yIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkLCBzdXBwb3J0IHRoZW0gaGVyZS4KLSAgLy8gdm9pZCBzZXQoc2VxdWVuY2U8bG9uZz4gYXJyYXksIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotICAvLyBDb3B5IGl0ZW1zIGludG8gdGhpcyBhcnJheSBmcm9tIHNvdXJjZSwgc3RhcnRpbmcgYXQgdGhpc1tvZmZzZXRdLgotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNldChJbnQxNkFycmF5IHNvdXJjZSwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOwotCi0gIC8vIFJldHVybiBhIG5ldyBJbnQxNkFycmF5IHRoYXQgaXMgYSB2aWV3IG9uIHRvcCBvZiB0aGlzIG9uZS4KLSAgLy8gQ29udGFpbnMgdGhpc1tzdGFydF0uLnRoaXNbZW5kXS4gZW5kIGRlZmF1bHRzIHRvIGxlbmd0aCBpZiB1bnNwZWNpZmllZC4KLSAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIEludDE2QXJyYXkgc3ViYXJyYXkobG9uZyBzdGFydCwgb3B0aW9uYWwgbG9uZyBlbmQpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0tleWJvYXJkRXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vS2V5Ym9hcmRFdmVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlOTc0NGUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vS2V5Ym9hcmRFdmVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC11aWV2ZW50cy0yMDE1MTIxNS8jaW50ZXJmYWNlLUtleWJvYXJkRXZlbnQKLQotW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlKV0KLWludGVyZmFjZSBLZXlib2FyZEV2ZW50IDogVUlFdmVudCB7Ci0gIC8vIGVudW0gS2V5TG9jYXRpb25Db2RlCi0gIGNvbnN0IHVuc2lnbmVkIGxvbmcgRE9NX0tFWV9MT0NBVElPTl9TVEFOREFSRCA9IDB4MDA7Ci0gIGNvbnN0IHVuc2lnbmVkIGxvbmcgRE9NX0tFWV9MT0NBVElPTl9MRUZUID0gMHgwMTsKLSAgY29uc3QgdW5zaWduZWQgbG9uZyBET01fS0VZX0xPQ0FUSU9OX1JJR0hUID0gMHgwMjsKLSAgY29uc3QgdW5zaWduZWQgbG9uZyBET01fS0VZX0xPQ0FUSU9OX05VTVBBRCA9IDB4MDM7Ci0KLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXk7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxvY2F0aW9uOwotICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBjdHJsS2V5OwotICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBzaGlmdEtleTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gYWx0S2V5OwotICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBtZXRhS2V5OwotICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiByZXBlYXQ7Ci0KLSAgYm9vbGVhbiBnZXRNb2RpZmllclN0YXRlKERPTVN0cmluZyB0ZXh0KTsKLQotICAvLyBEZXByZWNhdGVkLiBUaGVzZSBmZWF0dXJlcyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBXZWIgc3RhbmRhcmRzLgotICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2xlZ2FjeS1rZXktbW9kZWxzCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIGtleUNvZGU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIGNoYXJDb2RlOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBrZXlMb2NhdGlvbjsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXlJZGVudGlmaWVyOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL0xvY2F0aW9uLmlkbCBiL3NyYy9jb2JhbHQvZG9tL0xvY2F0aW9uLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDY5Y2ViMi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9Mb2NhdGlvbi5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvYnJvd3NlcnMuaHRtbCN0aGUtbG9jYXRpb24taW50ZXJmYWNlCi0KLVtVbmZvcmdlYWJsZV0gaW50ZXJmYWNlIExvY2F0aW9uIHsKLSAgdm9pZCBhc3NpZ24oRE9NU3RyaW5nIHVybCk7Ci0gIHZvaWQgcmVwbGFjZShET01TdHJpbmcgdXJsKTsKLSAgdm9pZCByZWxvYWQoKTsKLX07Ci1Mb2NhdGlvbiBpbXBsZW1lbnRzIFVSTFV0aWxzOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vTWVkaWFFcnJvci5pZGwgYi9zcmMvY29iYWx0L2RvbS9NZWRpYUVycm9yLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmMwZjUxMC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9NZWRpYUVycm9yLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNtZWRpYWVycm9yCi0KLWludGVyZmFjZSBNZWRpYUVycm9yIHsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgTUVESUFfRVJSX0FCT1JURUQgPSAxOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9FUlJfTkVUV09SSyA9IDI7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1FRElBX0VSUl9ERUNPREUgPSAzOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURUQgPSA0OwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9FUlJfRU5DUllQVEVEID0gNTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IGNvZGU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vTWVkaWFLZXlDb21wbGV0ZUV2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL01lZGlhS2V5Q29tcGxldGVFdmVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlZWY1OTguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTWVkaWFLZXlDb21wbGV0ZUV2ZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBNZWRpYUtleUNvbXBsZXRlRXZlbnQgOiBFdmVudCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2V5U3lzdGVtOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNlc3Npb25JZDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9NZWRpYUtleUVycm9yLmlkbCBiL3NyYy9jb2JhbHQvZG9tL01lZGlhS2V5RXJyb3IuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MGUyYTAzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL01lZGlhS2V5RXJyb3IuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIE1lZGlhS2V5RXJyb3IgewotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfVU5LTk9XTiA9IDE7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1FRElBX0tFWUVSUl9DTElFTlQgPSAyOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfU0VSVklDRSA9IDM7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1FRElBX0tFWUVSUl9PVVRQVVQgPSA0OwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfSEFSRFdBUkVDSEFOR0UgPSA1OwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfRE9NQUlOID0gNjsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9NZWRpYUtleUVycm9yRXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vTWVkaWFLZXlFcnJvckV2ZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M1ZDViOS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9NZWRpYUtleUVycm9yRXZlbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIE1lZGlhS2V5RXJyb3JFdmVudCA6IEV2ZW50IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXlTeXN0ZW07Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgc2Vzc2lvbklkOwotICByZWFkb25seSBhdHRyaWJ1dGUgTWVkaWFLZXlFcnJvciBlcnJvckNvZGU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCBzeXN0ZW1Db2RlOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL01lZGlhS2V5TWVzc2FnZUV2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL01lZGlhS2V5TWVzc2FnZUV2ZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDM3YWRhNS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9NZWRpYUtleU1lc3NhZ2VFdmVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgTWVkaWFLZXlNZXNzYWdlRXZlbnQgOiBFdmVudCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2V5U3lzdGVtOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNlc3Npb25JZDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIFVpbnQ4QXJyYXkgbWVzc2FnZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBkZWZhdWx0VVJMOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL01lZGlhS2V5TmVlZGVkRXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vTWVkaWFLZXlOZWVkZWRFdmVudC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1MDZlMmEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTWVkaWFLZXlOZWVkZWRFdmVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgTWVkaWFLZXlOZWVkZWRFdmVudCA6IEV2ZW50IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXlTeXN0ZW07Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgc2Vzc2lvbklkOwotICByZWFkb25seSBhdHRyaWJ1dGUgVWludDhBcnJheSBpbml0RGF0YTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9NZWRpYVF1ZXJ5TGlzdC5pZGwgYi9zcmMvY29iYWx0L2RvbS9NZWRpYVF1ZXJ5TGlzdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg0NmE3YzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTWVkaWFRdWVyeUxpc3QuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tdmlldy0yMDEzMTIxNy8jbWVkaWFxdWVyeWxpc3QKLQotaW50ZXJmYWNlIE1lZGlhUXVlcnlMaXN0IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBtZWRpYTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gbWF0Y2hlczsKLSAgLy8gVE9ETzogQWRkIGFkZExpc3RlbmVyKCkvcmVtb3ZlTGlzdGVuZXIoKS4KLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9NZWRpYVNvdXJjZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9NZWRpYVNvdXJjZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZWViMzUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTWVkaWFTb3VyY2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhLXNvdXJjZS8jaWRsLWRlZi1NZWRpYVNvdXJjZQotCi1bQ29uc3RydWN0b3JdIGludGVyZmFjZSBNZWRpYVNvdXJjZSA6IEV2ZW50VGFyZ2V0IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIFNvdXJjZUJ1ZmZlckxpc3Qgc291cmNlQnVmZmVyczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIFNvdXJjZUJ1ZmZlckxpc3QgYWN0aXZlU291cmNlQnVmZmVyczsKLQotICBbUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgZG91YmxlIGR1cmF0aW9uOwotCi0gIFtSYWlzZXNFeGNlcHRpb25dIFNvdXJjZUJ1ZmZlciBhZGRTb3VyY2VCdWZmZXIoRE9NU3RyaW5nIHR5cGUpOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHJlbW92ZVNvdXJjZUJ1ZmZlcihTb3VyY2VCdWZmZXIgc291cmNlQnVmZmVyKTsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlYWR5U3RhdGU7Ci0KLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBlbmRPZlN0cmVhbShvcHRpb25hbCBET01TdHJpbmcgZXJyb3IpOwotCi0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSBzdGF0aWMgYm9vbGVhbiBpc1R5cGVTdXBwb3J0ZWQoRE9NU3RyaW5nIHR5cGUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL01lbW9yeUluZm8uaWRsIGIvc3JjL2NvYmFsdC9kb20vTWVtb3J5SW5mby5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjZjE5MjAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTWVtb3J5SW5mby5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBUaGlzIGlzIGEgbm9uLXN0YW5kYXJkIGludGVyZmFjZSBpbiBDaHJvbWl1bS4KLS8vIGh0dHBzOi8vZG9jcy53ZWJwbGF0Zm9ybS5vcmcvd2lraS9hcGlzL3RpbWluZy9wcm9wZXJ0aWVzL21lbW9yeQotCi1bCi0gIE5vSW50ZXJmYWNlT2JqZWN0LAotXSBpbnRlcmZhY2UgTWVtb3J5SW5mbyB7Ci0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB0b3RhbEpTSGVhcFNpemU7Ci0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB1c2VkSlNIZWFwU2l6ZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9NaW1lVHlwZUFycmF5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL01pbWVUeXBlQXJyYXkuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmN2Y4ZWQ3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL01pbWVUeXBlQXJyYXkuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNtaW1ldHlwZWFycmF5Ci0KLS8vIEEgTWltZVR5cGVBcnJheSBvYmplY3QgcmVwcmVzZW50cyB0aGUgTUlNRSB0eXBlcyBleHBsaWNpdGx5IHN1cHBvcnRlZCBieQotLy8gcGx1Z2lucyBzdXBwb3J0ZWQgYnkgdGhlIHVzZXIgYWdlbnQsIGVhY2ggb2Ygd2hpY2ggaXMgcmVwcmVzZW50ZWQgYnkgYQotLy8gTWltZVR5cGUgb2JqZWN0LiBDdXJyZW50bHkgb25seSBzdHViIHN1cHBvcnQgaXMgcmVxdWlyZWQuCi1pbnRlcmZhY2UgTWltZVR5cGVBcnJheSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIGxlbmd0aDsKLX07Ci0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL05hbWVkTm9kZU1hcC5pZGwgYi9zcmMvY29iYWx0L2RvbS9OYW1lZE5vZGVNYXAuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjU5YWJiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL05hbWVkTm9kZU1hcC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtQ29yZS9jb3JlLmh0bWwjSUQtMTc4MDQ4ODkyMgotCi1pbnRlcmZhY2UgTmFtZWROb2RlTWFwIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotICBnZXR0ZXIgQXR0cj8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgZ2V0dGVyIEF0dHI/IGdldE5hbWVkSXRlbShET01TdHJpbmcgbmFtZSk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vTmF2aWdhdG9yLmlkbCBiL3NyYy9jb2JhbHQvZG9tL05hdmlnYXRvci5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2MTZkYzcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTmF2aWdhdG9yLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjdGhlLW5hdmlnYXRvci1vYmplY3QKLQotaW50ZXJmYWNlIE5hdmlnYXRvciB7fTsKLQotTmF2aWdhdG9yIGltcGxlbWVudHMgTmF2aWdhdG9ySUQ7Ci1OYXZpZ2F0b3IgaW1wbGVtZW50cyBOYXZpZ2F0b3JMYW5ndWFnZTsKLU5hdmlnYXRvciBpbXBsZW1lbnRzIE5hdmlnYXRvclBsdWdpbnM7Ci1OYXZpZ2F0b3IgaW1wbGVtZW50cyBOYXZpZ2F0b3JTdG9yYWdlVXRpbHM7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9OYXZpZ2F0b3JJRC5pZGwgYi9zcmMvY29iYWx0L2RvbS9OYXZpZ2F0b3JJRC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhZGI5MTguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTmF2aWdhdG9ySUQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNuYXZpZ2F0b3JpZAotCi1bTm9JbnRlcmZhY2VPYmplY3RdCi1pbnRlcmZhY2UgTmF2aWdhdG9ySUQgewotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHVzZXJBZ2VudDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9OYXZpZ2F0b3JMYW5ndWFnZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9OYXZpZ2F0b3JMYW5ndWFnZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlMzlhOGMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTmF2aWdhdG9yTGFuZ3VhZ2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNuYXZpZ2F0b3JsYW5ndWFnZQotCi1bTm9JbnRlcmZhY2VPYmplY3RdCi1pbnRlcmZhY2UgTmF2aWdhdG9yTGFuZ3VhZ2UgewotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGxhbmd1YWdlOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL05hdmlnYXRvclBsdWdpbnMuaWRsIGIvc3JjL2NvYmFsdC9kb20vTmF2aWdhdG9yUGx1Z2lucy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY0OTFmOGYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTmF2aWdhdG9yUGx1Z2lucy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI25hdmlnYXRvcnBsdWdpbnMKLQotW05vSW50ZXJmYWNlT2JqZWN0XQotaW50ZXJmYWNlIE5hdmlnYXRvclBsdWdpbnMgewotICByZWFkb25seSBhdHRyaWJ1dGUgUGx1Z2luQXJyYXkgcGx1Z2luczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIE1pbWVUeXBlQXJyYXkgbWltZVR5cGVzOwotICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBqYXZhRW5hYmxlZDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9OYXZpZ2F0b3JTdG9yYWdlVXRpbHMuaWRsIGIvc3JjL2NvYmFsdC9kb20vTmF2aWdhdG9yU3RvcmFnZVV0aWxzLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWY2M2ZmMC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9OYXZpZ2F0b3JTdG9yYWdlVXRpbHMuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNuYXZpZ2F0b3JzdG9yYWdldXRpbHMKLQotW05vSW50ZXJmYWNlT2JqZWN0XQotaW50ZXJmYWNlIE5hdmlnYXRvclN0b3JhZ2VVdGlscyB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIGNvb2tpZUVuYWJsZWQ7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vTm9kZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9Ob2RlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDVhZmViZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9Ob2RlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI25vZGUKLQotWwotICBHZXRPcGFxdWVSb290PUdldFJvb3ROb2RlLAotICBBZGRPcGFxdWVSb290cz0oR2V0Um9vdE5vZGUpLAotXQotaW50ZXJmYWNlIE5vZGUgOiBFdmVudFRhcmdldCB7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IEVMRU1FTlRfTk9ERSA9IDE7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IFRFWFRfTk9ERSA9IDM7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IENEQVRBX1NFQ1RJT05fTk9ERSA9IDQ7IC8vIGhpc3RvcmljYWwKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09NTUVOVF9OT0RFID0gODsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgRE9DVU1FTlRfTk9ERSA9IDk7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCBub2RlVHlwZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBub2RlTmFtZTsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgRG9jdW1lbnQ/IG93bmVyRG9jdW1lbnQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlPyBwYXJlbnROb2RlOwotICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gcGFyZW50RWxlbWVudDsKLSAgYm9vbGVhbiBoYXNDaGlsZE5vZGVzKCk7Ci0gIFtTYW1lT2JqZWN0XSByZWFkb25seSBhdHRyaWJ1dGUgTm9kZUxpc3QgY2hpbGROb2RlczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIE5vZGU/IGZpcnN0Q2hpbGQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlPyBsYXN0Q2hpbGQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlPyBwcmV2aW91c1NpYmxpbmc7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlPyBuZXh0U2libGluZzsKLQotICBhdHRyaWJ1dGUgRE9NU3RyaW5nPyBub2RlVmFsdWU7Ci0gIGF0dHJpYnV0ZSBET01TdHJpbmc/IHRleHRDb250ZW50OwotCi0gIE5vZGUgY2xvbmVOb2RlKG9wdGlvbmFsIGJvb2xlYW4gZGVlcCA9IGZhbHNlKTsKLQotICBib29sZWFuIGNvbnRhaW5zKE5vZGU/IG90aGVyKTsKLQotICBOb2RlIGluc2VydEJlZm9yZShOb2RlIG5vZGUsIE5vZGU/IGNoaWxkKTsKLSAgTm9kZSBhcHBlbmRDaGlsZChOb2RlIG5vZGUpOwotICBOb2RlIHJlcGxhY2VDaGlsZChOb2RlIG5vZGUsIE5vZGUgY2hpbGQpOwotICBOb2RlIHJlbW92ZUNoaWxkKE5vZGUgY2hpbGQpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL05vZGVMaXN0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL05vZGVMaXN0LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWQ1NDgwNC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9Ob2RlTGlzdC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNub2RlbGlzdAotCi1bQXJyYXlDbGFzc10KLWludGVyZmFjZSBOb2RlTGlzdCB7Ci0gIGdldHRlciBOb2RlPyBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vTm9uRG9jdW1lbnRUeXBlQ2hpbGROb2RlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL05vbkRvY3VtZW50VHlwZUNoaWxkTm9kZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzYjJjMjguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTm9uRG9jdW1lbnRUeXBlQ2hpbGROb2RlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI25vbmRvY3VtZW50dHlwZWNoaWxkbm9kZQotCi1bTm9JbnRlcmZhY2VPYmplY3RdCi1pbnRlcmZhY2UgTm9uRG9jdW1lbnRUeXBlQ2hpbGROb2RlIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEVsZW1lbnQ/IHByZXZpb3VzRWxlbWVudFNpYmxpbmc7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBFbGVtZW50PyBuZXh0RWxlbWVudFNpYmxpbmc7Ci19OwotRWxlbWVudCBpbXBsZW1lbnRzIE5vbkRvY3VtZW50VHlwZUNoaWxkTm9kZTsKLUNoYXJhY3RlckRhdGEgaW1wbGVtZW50cyBOb25Eb2N1bWVudFR5cGVDaGlsZE5vZGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9Ob25FbGVtZW50UGFyZW50Tm9kZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9Ob25FbGVtZW50UGFyZW50Tm9kZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzM2RlZGQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vTm9uRWxlbWVudFBhcmVudE5vZGUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jbm9uZWxlbWVudHBhcmVudG5vZGUKLQotW05vSW50ZXJmYWNlT2JqZWN0XQotaW50ZXJmYWNlIE5vbkVsZW1lbnRQYXJlbnROb2RlIHsKLSAgRWxlbWVudD8gZ2V0RWxlbWVudEJ5SWQoRE9NU3RyaW5nIGVsZW1lbnRJZCk7Ci19OwotRG9jdW1lbnQgaW1wbGVtZW50cyBOb25FbGVtZW50UGFyZW50Tm9kZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1BhcmVudE5vZGUuaWRsIGIvc3JjL2NvYmFsdC9kb20vUGFyZW50Tm9kZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc3YzU1M2EuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vUGFyZW50Tm9kZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNwYXJlbnRub2RlCi0KLVtOb0ludGVyZmFjZU9iamVjdF0KLWludGVyZmFjZSBQYXJlbnROb2RlIHsKLSAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBIVE1MQ29sbGVjdGlvbiBjaGlsZHJlbjsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEVsZW1lbnQ/IGZpcnN0RWxlbWVudENoaWxkOwotICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gbGFzdEVsZW1lbnRDaGlsZDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgY2hpbGRFbGVtZW50Q291bnQ7Ci0KLSAgRWxlbWVudD8gcXVlcnlTZWxlY3RvcihET01TdHJpbmcgc2VsZWN0b3JzKTsKLSAgW05ld09iamVjdF0gTm9kZUxpc3QgcXVlcnlTZWxlY3RvckFsbChET01TdHJpbmcgc2VsZWN0b3JzKTsKLX07Ci1Eb2N1bWVudCBpbXBsZW1lbnRzIFBhcmVudE5vZGU7Ci1FbGVtZW50IGltcGxlbWVudHMgUGFyZW50Tm9kZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1BlcmZvcm1hbmNlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL1BlcmZvcm1hbmNlLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhMGUyZi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9QZXJmb3JtYW5jZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvbmF2aWdhdGlvbi10aW1pbmcvI3BlcmZvcm1hbmNlCi0KLWludGVyZmFjZSBQZXJmb3JtYW5jZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBQZXJmb3JtYW5jZVRpbWluZyB0aW1pbmc7Ci0KLSAgLy8gQ2hyb21pdW0gY3VzdG9tIG1lbWJlci4KLSAgcmVhZG9ubHkgYXR0cmlidXRlIE1lbW9yeUluZm8gbWVtb3J5OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1BlcmZvcm1hbmNlVGltaW5nLmlkbCBiL3NyYy9jb2JhbHQvZG9tL1BlcmZvcm1hbmNlVGltaW5nLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2I4MTFhOC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9QZXJmb3JtYW5jZVRpbWluZy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvbmF2aWdhdGlvbi10aW1pbmcvI3NlYy1uYXZpZ2F0aW9uLXRpbWluZy1pbnRlcmZhY2UKLQotaW50ZXJmYWNlIFBlcmZvcm1hbmNlVGltaW5nIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbG9uZyBuYXZpZ2F0aW9uU3RhcnQ7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vUGVyZm9ybWFuY2VfSGlnaFJlc29sdXRpb25UaW1lLmlkbCBiL3NyYy9jb2JhbHQvZG9tL1BlcmZvcm1hbmNlX0hpZ2hSZXNvbHV0aW9uVGltZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxNzM0MTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vUGVyZm9ybWFuY2VfSGlnaFJlc29sdXRpb25UaW1lLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L1dELWhyLXRpbWUtMi0yMDE2MDIyNS8jdGhlLXBlcmZvcm1hbmNlLWludGVyZmFjZQotCi1wYXJ0aWFsIGludGVyZmFjZSBQZXJmb3JtYW5jZSB7Ci0gIERPTUhpZ2hSZXNUaW1lU3RhbXAgbm93KCk7Ci19OwotCi10eXBlZGVmIGRvdWJsZSBET01IaWdoUmVzVGltZVN0YW1wOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vUGx1Z2luQXJyYXkuaWRsIGIvc3JjL2NvYmFsdC9kb20vUGx1Z2luQXJyYXkuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMWUyMzBjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1BsdWdpbkFycmF5LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjcGx1Z2luYXJyYXkKLQotaW50ZXJmYWNlIFBsdWdpbkFycmF5IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGxvbmcgbGVuZ3RoOwotfTsKLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vUHJvZ3Jlc3NFdmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9Qcm9ncmVzc0V2ZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU3NzVlMS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9Qcm9ncmVzc0V2ZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9wcm9ncmVzcy1ldmVudHMvI2ludGVyZmFjZS1wcm9ncmVzc2V2ZW50Ci0KLVtDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCi1pbnRlcmZhY2UgUHJvZ3Jlc3NFdmVudCA6IEV2ZW50IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gbGVuZ3RoQ29tcHV0YWJsZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbG9uZyBsb2FkZWQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWw7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vU2NyZWVuLmlkbCBiL3NyYy9jb2JhbHQvZG9tL1NjcmVlbi5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MWE4ZGEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vU2NyZWVuLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI2ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLXZpZXctMjAxMzEyMTcvI3RoZS1zY3JlZW4taW50ZXJmYWNlCi0KLWludGVyZmFjZSBTY3JlZW4gewotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGF2YWlsV2lkdGg7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgYXZhaWxIZWlnaHQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgd2lkdGg7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgaGVpZ2h0OwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBjb2xvckRlcHRoOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBwaXhlbERlcHRoOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1NvdXJjZUJ1ZmZlci5pZGwgYi9zcmMvY29iYWx0L2RvbS9Tb3VyY2VCdWZmZXIuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNTIyZmZmLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1NvdXJjZUJ1ZmZlci5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWEtc291cmNlLyNpZGwtZGVmLVNvdXJjZUJ1ZmZlcgotCi1pbnRlcmZhY2UgU291cmNlQnVmZmVyIHsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gcmVhZG9ubHkgYXR0cmlidXRlIFRpbWVSYW5nZXMgYnVmZmVyZWQ7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBkb3VibGUgdGltZXN0YW1wT2Zmc2V0OwotCi0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgYXBwZW5kKFVpbnQ4QXJyYXkgZGF0YSk7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgYWJvcnQoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9Tb3VyY2VCdWZmZXJMaXN0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL1NvdXJjZUJ1ZmZlckxpc3QuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NDQwMmE5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1NvdXJjZUJ1ZmZlckxpc3QuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhLXNvdXJjZS8jaWRsLWRlZi1Tb3VyY2VCdWZmZXIKLQotaW50ZXJmYWNlIFNvdXJjZUJ1ZmZlckxpc3QgOiBFdmVudFRhcmdldCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgZ2V0dGVyIFNvdXJjZUJ1ZmZlcj8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9TdG9yYWdlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL1N0b3JhZ2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDNlNmI3Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1N0b3JhZ2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYnN0b3JhZ2UvI3N0b3JhZ2UtMAotCi1pbnRlcmZhY2UgU3RvcmFnZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgRE9NU3RyaW5nPyBrZXkodW5zaWduZWQgbG9uZyBpbmRleCk7Ci0gIGdldHRlciBET01TdHJpbmc/IGdldEl0ZW0oRE9NU3RyaW5nIGtleSk7Ci0gIHNldHRlciB2b2lkIHNldEl0ZW0oRE9NU3RyaW5nIGtleSwgRE9NU3RyaW5nIHZhbHVlKTsKLSAgZGVsZXRlciB2b2lkIHJlbW92ZUl0ZW0oRE9NU3RyaW5nIGtleSk7Ci0gIHZvaWQgY2xlYXIoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9TdG9yYWdlRXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vU3RvcmFnZUV2ZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmMxZWVkNC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9TdG9yYWdlRXZlbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYnN0b3JhZ2UvI3N0b3JhZ2VldmVudAotCi1bQ29uc3RydWN0b3IoRE9NU3RyaW5nIHR5cGUpXQotaW50ZXJmYWNlIFN0b3JhZ2VFdmVudCA6IEV2ZW50IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZz8ga2V5OwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nPyBvbGRWYWx1ZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZz8gbmV3VmFsdWU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdXJsOwotICByZWFkb25seSBhdHRyaWJ1dGUgU3RvcmFnZT8gc3RvcmFnZUFyZWE7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vVGVzdFJ1bm5lci5pZGwgYi9zcmMvY29iYWx0L2RvbS9UZXN0UnVubmVyLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA0NDQ3OS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9UZXN0UnVubmVyLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEN1c3RvbSBpbnRlcmZhY2UgdG8gY29tbXVuaWNhdGUgd2l0aCBsYXlvdXQgdGVzdHMuCi0KLVsKLSAgQ29uZGl0aW9uYWw9RU5BQkxFX1RFU1RfUlVOTkVSCi1dIGludGVyZmFjZSBUZXN0UnVubmVyIHsKLSAgdm9pZCBub3RpZnlEb25lKCk7Ci0gIHZvaWQgd2FpdFVudGlsRG9uZSgpOwotICB2b2lkIERvTm9uTWVhc3VyZWRMYXlvdXQoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9UZXh0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL1RleHQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMGI2NDRkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1RleHQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjMgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jdGV4dAotCi1bCi0gIENvbnN0cnVjdG9yKG9wdGlvbmFsIERPTVN0cmluZyBkYXRhID0gIiIpLAotICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MKLV0KLWludGVyZmFjZSBUZXh0IDogQ2hhcmFjdGVyRGF0YSB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1RpbWVSYW5nZXMuaWRsIGIvc3JjL2NvYmFsdC9kb20vVGltZVJhbmdlcy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyNjY2NmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vVGltZVJhbmdlcy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjdGltZXJhbmdlcwotCi1pbnRlcmZhY2UgVGltZVJhbmdlcyB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gZG91YmxlIHN0YXJ0KHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotICBbUmFpc2VzRXhjZXB0aW9uXSBkb3VibGUgZW5kKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1RyYW5zaXRpb25FdmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9UcmFuc2l0aW9uRXZlbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZjFiZDQxLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1RyYW5zaXRpb25FdmVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3MzLXRyYW5zaXRpb25zLTIwMTMxMTE5LyN0cmFuc2l0aW9uLWV2ZW50cwotCi1bQ29uc3RydWN0b3IoRE9NU3RyaW5nIHR5cGUpXQotaW50ZXJmYWNlIFRyYW5zaXRpb25FdmVudCA6IEV2ZW50IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBwcm9wZXJ0eU5hbWU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBlbGFwc2VkVGltZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9VSUV2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL1VJRXZlbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZjBlNzNjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1VJRXZlbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0QtdWlldmVudHMtMjAxNTEyMTUvI2ludGVyZmFjZS1VSUV2ZW50Ci0KLVtDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCi1pbnRlcmZhY2UgVUlFdmVudCA6IEV2ZW50IHsKLSAgdm9pZCBpbml0VUlFdmVudChET01TdHJpbmcgdHlwZSwgYm9vbGVhbiBidWJibGVzLCBib29sZWFuIGNhbmNlbGFibGUsCi0gICAgICAgICAgICAgICAgICAgV2luZG93PyB2aWV3LCBsb25nIGRldGFpbCk7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3c/IHZpZXc7Ci0KLSAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgYW55IHNwZWNpZmljYXRpb24gYnV0Ci0gIC8vIGFyZSBjb21tb25seSBpbXBsZW1lbnRlZCBhbmQgcmVxdWlyZWQgYnkgQ29iYWx0LgotICAvLyBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgd2hvbGUgZG9jdW1lbnQuCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIHBhZ2VYOwotICAvLyBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHdob2xlIGRvY3VtZW50LgotICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBwYWdlWTsKLSAgLy8gVGhlIG51bWVyaWMga2V5Q29kZSBvZiB0aGUga2V5IHByZXNzZWQsIG9yIHRoZSBjaGFyYWN0ZXIgY29kZSAoY2hhckNvZGUpCi0gIC8vIGZvciBhbiBhbHBoYW51bWVyaWMga2V5IHByZXNzZWQuCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHdoaWNoOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1VSTC5pZGwgYi9zcmMvY29iYWx0L2RvbS9VUkwuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Nzg0ZDFkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1VSTC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNC9XRC11cmwtMS0yMDE0MTIwOS8jZG9tLXVybAotCi1pbnRlcmZhY2UgVVJMIHsKLSAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHN0YXRpYyBET01TdHJpbmcKLSAgICAgIGNyZWF0ZU9iamVjdFVSTChNZWRpYVNvdXJjZSBtZWRpYVNvdXJjZSk7Ci0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSBzdGF0aWMgRE9NU3RyaW5nCi0gICAgICBjcmVhdGVPYmplY3RVUkwoQmxvYiBibG9iKTsKLSAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHN0YXRpYyB2b2lkIHJldm9rZU9iamVjdFVSTChET01TdHJpbmcgdXJsKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9VUkxVdGlscy5pZGwgYi9zcmMvY29iYWx0L2RvbS9VUkxVdGlscy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU5MTg4NmQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vVVJMVXRpbHMuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvV0QtdXJsLTEtMjAxNDEyMDkvI2RvbS11cmx1dGlscwotCi1bTm9JbnRlcmZhY2VPYmplY3RdCi1pbnRlcmZhY2UgVVJMVXRpbHMgewotICBzdHJpbmdpZmllciBhdHRyaWJ1dGUgVVNWU3RyaW5nIGhyZWY7Ci0gIGF0dHJpYnV0ZSBVU1ZTdHJpbmcgcHJvdG9jb2w7Ci0gIGF0dHJpYnV0ZSBVU1ZTdHJpbmcgaG9zdDsKLSAgYXR0cmlidXRlIFVTVlN0cmluZyBob3N0bmFtZTsKLSAgYXR0cmlidXRlIFVTVlN0cmluZyBwb3J0OwotICBhdHRyaWJ1dGUgVVNWU3RyaW5nIHBhdGhuYW1lOwotICBhdHRyaWJ1dGUgVVNWU3RyaW5nIHNlYXJjaDsKLSAgYXR0cmlidXRlIFVTVlN0cmluZyBoYXNoOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1VpbnQxNkFycmF5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL1VpbnQxNkFycmF5LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDg4NmU3Yi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9VaW50MTZBcnJheS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS90eXBlZGFycmF5L3NwZWNzL2xhdGVzdC8jNwotWwotICBDb25zdHJ1Y3Rvcih1bnNpZ25lZCBsb25nIGxlbmd0aCksCi0gIENvbnN0cnVjdG9yKFVpbnQxNkFycmF5IGFycmF5KSwKLSAgQ29uc3RydWN0b3IoQXJyYXlCdWZmZXIgYnVmZmVyLCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKLSAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzLAotICBSYWlzZXNFeGNlcHRpb249Q29uc3RydWN0b3IKLV0KLWludGVyZmFjZSBVaW50MTZBcnJheSA6IEFycmF5QnVmZmVyVmlldyB7Ci0gIGNvbnN0IHVuc2lnbmVkIGxvbmcgQllURVNfUEVSX0VMRU1FTlQgPSAyOwotCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQotICBnZXR0ZXIgdW5zaWduZWQgc2hvcnQgZ2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotICBzZXR0ZXIgdm9pZCBzZXQodW5zaWduZWQgbG9uZyBpbmRleCwgdW5zaWduZWQgc2hvcnQgdmFsdWUpOwotCi0gIC8vIFRPRE86IFdoZW4gYXJyYXlzIG9yIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkLCBzdXBwb3J0IHRoZW0gaGVyZS4KLSAgLy8gdm9pZCBzZXQoc2VxdWVuY2U8bG9uZz4gYXJyYXksIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotICAvLyBDb3B5IGl0ZW1zIGludG8gdGhpcyBhcnJheSBmcm9tIHNvdXJjZSwgc3RhcnRpbmcgYXQgdGhpc1tvZmZzZXRdLgotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNldChVaW50MTZBcnJheSBzb3VyY2UsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotICAvLyBSZXR1cm4gYSBuZXcgVWludDE2QXJyYXkgdGhhdCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoaXMgb25lLgotICAvLyBDb250YWlucyB0aGlzW3N0YXJ0XS4udGhpc1tlbmRdLiBlbmQgZGVmYXVsdHMgdG8gbGVuZ3RoIGlmIHVuc3BlY2lmaWVkLgotICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gVWludDE2QXJyYXkgc3ViYXJyYXkobG9uZyBzdGFydCwgb3B0aW9uYWwgbG9uZyBlbmQpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1VpbnQzMkFycmF5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL1VpbnQzMkFycmF5LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmEzZmFhYS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9VaW50MzJBcnJheS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS90eXBlZGFycmF5L3NwZWNzL2xhdGVzdC8jNwotWwotICBDb25zdHJ1Y3Rvcih1bnNpZ25lZCBsb25nIGxlbmd0aCksCi0gIENvbnN0cnVjdG9yKFVpbnQzMkFycmF5IGFycmF5KSwKLSAgQ29uc3RydWN0b3IoQXJyYXlCdWZmZXIgYnVmZmVyLCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKLSAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzLAotICBSYWlzZXNFeGNlcHRpb249Q29uc3RydWN0b3IKLV0KLWludGVyZmFjZSBVaW50MzJBcnJheSA6IEFycmF5QnVmZmVyVmlldyB7Ci0gIGNvbnN0IHVuc2lnbmVkIGxvbmcgQllURVNfUEVSX0VMRU1FTlQgPSA0OwotCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLQotICBnZXR0ZXIgdW5zaWduZWQgbG9uZyBnZXQodW5zaWduZWQgbG9uZyBpbmRleCk7Ci0gIHNldHRlciB2b2lkIHNldCh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBsb25nIHZhbHVlKTsKLQotICAvLyBUT0RPOiBXaGVuIGFycmF5cyBvciBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZCwgc3VwcG9ydCB0aGVtIGhlcmUuCi0gIC8vIHZvaWQgc2V0KHNlcXVlbmNlPGxvbmc+IGFycmF5LCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci0KLSAgLy8gQ29weSBpdGVtcyBpbnRvIHRoaXMgYXJyYXkgZnJvbSBzb3VyY2UsIHN0YXJ0aW5nIGF0IHRoaXNbb2Zmc2V0XS4KLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXQoVWludDMyQXJyYXkgc291cmNlLCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci0KLSAgLy8gUmV0dXJuIGEgbmV3IFVpbnQzMkFycmF5IHRoYXQgaXMgYSB2aWV3IG9uIHRvcCBvZiB0aGlzIG9uZS4KLSAgLy8gQ29udGFpbnMgdGhpc1tzdGFydF0uLnRoaXNbZW5kXS4gZW5kIGRlZmF1bHRzIHRvIGxlbmd0aCBpZiB1bnNwZWNpZmllZC4KLSAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIFVpbnQzMkFycmF5IHN1YmFycmF5KGxvbmcgc3RhcnQsIG9wdGlvbmFsIGxvbmcgZW5kKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9VaW50OEFycmF5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL1VpbnQ4QXJyYXkuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmEwMGJkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1VpbnQ4QXJyYXkuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdHlwZWRhcnJheS9zcGVjcy9sYXRlc3QvIzcuMQotWwotICBDb25zdHJ1Y3Rvcih1bnNpZ25lZCBsb25nIGxlbmd0aCksCi0gIENvbnN0cnVjdG9yKFVpbnQ4QXJyYXkgYXJyYXkpLAotICBDb25zdHJ1Y3RvcihBcnJheUJ1ZmZlciBidWZmZXIsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBsZW5ndGgpLAotICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCi0gIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvcgotXQotaW50ZXJmYWNlIFVpbnQ4QXJyYXkgOiBBcnJheUJ1ZmZlclZpZXcgewotICBjb25zdCB1bnNpZ25lZCBsb25nIEJZVEVTX1BFUl9FTEVNRU5UID0gMTsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0KLSAgZ2V0dGVyIG9jdGV0IGdldCh1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgc2V0dGVyIHZvaWQgc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIG9jdGV0IHZhbHVlKTsKLQotICAvLyBUT0RPOiBXaGVuIGFycmF5cyBvciBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZCwgc3VwcG9ydCB0aGVtIGhlcmUuCi0gIC8vIHZvaWQgc2V0KHNlcXVlbmNlPGxvbmc+IGFycmF5LCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIG9mZnNldCk7Ci0KLSAgLy8gQ29weSBpdGVtcyBpbnRvIHRoaXMgYXJyYXkgZnJvbSBzb3VyY2UsIHN0YXJ0aW5nIGF0IHRoaXNbb2Zmc2V0XS4KLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXQoVWludDhBcnJheSBzb3VyY2UsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKLQotICAvLyBSZXR1cm4gYSBuZXcgVWludDhBcnJheSB0aGF0IGlzIGEgdmlldyBvbiB0b3Agb2YgdGhpcyBvbmUuCi0gIC8vIENvbnRhaW5zIHRoaXNbc3RhcnRdLi50aGlzW2VuZF0uIGVuZCBkZWZhdWx0cyB0byBsZW5ndGggaWYgdW5zcGVjaWZpZWQuCi0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSBVaW50OEFycmF5IHN1YmFycmF5KGxvbmcgc3RhcnQsIG9wdGlvbmFsIGxvbmcgZW5kKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9WaWRlb1BsYXliYWNrUXVhbGl0eS5pZGwgYi9zcmMvY29iYWx0L2RvbS9WaWRlb1BsYXliYWNrUXVhbGl0eS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNjNhMDcuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vVmlkZW9QbGF5YmFja1F1YWxpdHkuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhLXNvdXJjZS8jaWRsLWRlZi1WaWRlb1BsYXliYWNrUXVhbGl0eQotCi1pbnRlcmZhY2UgVmlkZW9QbGF5YmFja1F1YWxpdHkgewotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NSGlnaFJlc1RpbWVTdGFtcCBjcmVhdGlvblRpbWU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHRvdGFsVmlkZW9GcmFtZXM7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGRyb3BwZWRWaWRlb0ZyYW1lczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgY29ycnVwdGVkVmlkZW9GcmFtZXM7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgdG90YWxGcmFtZURlbGF5OwotfTsKLQotdHlwZWRlZiBkb3VibGUgRE9NSGlnaFJlc1RpbWVTdGFtcDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvdy5pZGwgYi9zcmMvY29iYWx0L2RvbS9XaW5kb3cuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNmEzZTIwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvdy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvYnJvd3NlcnMuaHRtbCN0aGUtd2luZG93LW9iamVjdAotCi0vLyBOb3RlOiBDb2JhbHQgb25seSBzdXBwb3J0cyBvbmUgYnJvd3NpbmcgY29udGV4dCBhbmQgb25lIFdpbmRvdyBvYmplY3QuCi1bUHJpbWFyeUdsb2JhbF0KLS8qc2VhbGVkKi8gaW50ZXJmYWNlIFdpbmRvdyA6IEV2ZW50VGFyZ2V0IHsKLSAgLy8gdGhlIGN1cnJlbnQgYnJvd3NpbmcgY29udGV4dAotICBbVW5mb3JnZWFibGVdIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3cgd2luZG93OwotICBbUmVwbGFjZWFibGVdIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3cgc2VsZjsKLSAgW1VuZm9yZ2VhYmxlXSByZWFkb25seSBhdHRyaWJ1dGUgRG9jdW1lbnQgZG9jdW1lbnQ7Ci0gIFtQdXRGb3J3YXJkcz1ocmVmLCBVbmZvcmdlYWJsZV0gcmVhZG9ubHkgYXR0cmlidXRlIExvY2F0aW9uIGxvY2F0aW9uOwotICByZWFkb25seSBhdHRyaWJ1dGUgSGlzdG9yeSBoaXN0b3J5OwotICB2b2lkIGNsb3NlKCk7Ci0KLSAgLy8gb3RoZXIgYnJvd3NpbmcgY29udGV4dHMKLSAgW1JlcGxhY2VhYmxlXSByZWFkb25seSBhdHRyaWJ1dGUgV2luZG93IGZyYW1lczsKLSAgW1JlcGxhY2VhYmxlXSByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIFtVbmZvcmdlYWJsZV0gcmVhZG9ubHkgYXR0cmlidXRlIFdpbmRvdyB0b3A7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3cgb3BlbmVyOwotICByZWFkb25seSBhdHRyaWJ1dGUgV2luZG93IHBhcmVudDsKLSAgZ2V0dGVyIFdpbmRvdyAodW5zaWduZWQgbG9uZyBpbmRleCk7Ci0KLSAgLy8gdGhlIHVzZXIgYWdlbnQKLSAgcmVhZG9ubHkgYXR0cmlidXRlIE5hdmlnYXRvciBuYXZpZ2F0b3I7Ci0KLSAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCi0gIC8vCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBDb25zb2xlIGNvbnNvbGU7Ci0gIFtDb25kaXRpb25hbD1FTkFCTEVfVEVTVF9SVU5ORVJdIHJlYWRvbmx5IGF0dHJpYnV0ZSBUZXN0UnVubmVyIHRlc3RSdW5uZXI7Ci0gIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSB2b2lkIGdjKCk7Ci19OwotV2luZG93IGltcGxlbWVudHMgR2xvYmFsRXZlbnRIYW5kbGVyczsKLVdpbmRvdyBpbXBsZW1lbnRzIFdpbmRvd0V2ZW50SGFuZGxlcnM7Ci0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd0V2ZW50SGFuZGxlcnMuaWRsIGIvc3JjL2NvYmFsdC9kb20vV2luZG93RXZlbnRIYW5kbGVycy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzNTgyNmIuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vV2luZG93RXZlbnRIYW5kbGVycy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI3dpbmRvd2V2ZW50aGFuZGxlcnMKLQotW05vSW50ZXJmYWNlT2JqZWN0XQotaW50ZXJmYWNlIFdpbmRvd0V2ZW50SGFuZGxlcnMgewotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9udW5sb2FkOwotfTsKLQotLy8gVE9ETzogVGhlIElETCBkZWZpbmVzIEV2ZW50SGFuZGxlciBhcyBhIG51bGxhYmxlIGNhbGxiYWNrCi0vLyBmdW5jdGlvbi4gRGVmaW5lIGl0IGFzIGEgbnVsbGFibGUgRXZlbnRMaXN0ZW5lciBmb3Igbm93IHVudGlsIHdlIGNhbiBkbwotLy8gc29tZSByZWZhY3RvcmluZyB0byBhY2NlcHQgYm90aCBpbiB0aGUgRXZlbnRUYXJnZXQgaW1wbGVtZW50YXRpb24uCi10eXBlZGVmIEV2ZW50TGlzdGVuZXI/IEV2ZW50SGFuZGxlcjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd0xvY2FsU3RvcmFnZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9XaW5kb3dMb2NhbFN0b3JhZ2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZmRlNzYyLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd0xvY2FsU3RvcmFnZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic3RvcmFnZS8jd2luZG93bG9jYWxzdG9yYWdlCi0KLVtOb0ludGVyZmFjZU9iamVjdF0KLWludGVyZmFjZSBXaW5kb3dMb2NhbFN0b3JhZ2UgewotICByZWFkb25seSBhdHRyaWJ1dGUgU3RvcmFnZSBsb2NhbFN0b3JhZ2U7Ci19OwotV2luZG93IGltcGxlbWVudHMgV2luZG93TG9jYWxTdG9yYWdlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vV2luZG93U2Vzc2lvblN0b3JhZ2UuaWRsIGIvc3JjL2NvYmFsdC9kb20vV2luZG93U2Vzc2lvblN0b3JhZ2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQzMzJjLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd1Nlc3Npb25TdG9yYWdlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzdG9yYWdlLyN3aW5kb3dzZXNzaW9uc3RvcmFnZQotCi1bTm9JbnRlcmZhY2VPYmplY3RdCi1pbnRlcmZhY2UgV2luZG93U2Vzc2lvblN0b3JhZ2UgewotICByZWFkb25seSBhdHRyaWJ1dGUgU3RvcmFnZSBzZXNzaW9uU3RvcmFnZTsKLX07Ci1XaW5kb3cgaW1wbGVtZW50cyBXaW5kb3dTZXNzaW9uU3RvcmFnZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd1RpbWVycy5pZGwgYi9zcmMvY29iYWx0L2RvbS9XaW5kb3dUaW1lcnMuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWIyYThlLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd1RpbWVycy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI3dpbmRvd3RpbWVycwotCi1bTm9JbnRlcmZhY2VPYmplY3RdCi1pbnRlcmZhY2UgV2luZG93VGltZXJzIHsKLSAgLy8gVE9ETzogQ2hhbmdlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBiYWNrIHRvIHRoZWlyIG9yaWdpbmFsIGZvcm0gaW4gdGhlIHNwZWMsCi0gIC8vIHdoZW4gIkZ1bmN0aW9uIiBhbmQgImFueSIgYXJlIHN1cHBvcnRlZC4KLSAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI3RpbWVycwotICBsb25nIHNldFRpbWVvdXQoVGltZXJDYWxsYmFjayBoYW5kbGVyLCBvcHRpb25hbCBsb25nIHRpbWVvdXQpOwotICB2b2lkIGNsZWFyVGltZW91dChsb25nIGhhbmRsZSk7Ci0gIGxvbmcgc2V0SW50ZXJ2YWwoVGltZXJDYWxsYmFjayBoYW5kbGVyLCBvcHRpb25hbCBsb25nIHRpbWVvdXQpOwotICB2b2lkIGNsZWFySW50ZXJ2YWwobG9uZyBoYW5kbGUpOwotCi0gIC8vIFRPRE86IElmIHdlIGV2ZXIgZGVjaWRlIHRvIHN1cHBvcnQgc2V0VGltZW91dCBhbmQgc2V0SW50ZXJ2YWwKLSAgLy8gd2l0aCBhIERPTVN0cmluZyBhcmd1bWVudCwgd2UgbXVzdCBpbXBsZW1lbnQgdGhlIGxvZ2ljIGRlc2NyaWJlZCBpbiB0aGUgQ1NQCi0gIC8vIHNwZWMgcmVnYXJkaW5nICJ1bnNhZmUtZXZhbCIuCi19OwotV2luZG93IGltcGxlbWVudHMgV2luZG93VGltZXJzOwotCi1jYWxsYmFjayBUaW1lckNhbGxiYWNrID0gdm9pZCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vV2luZG93X0FuaW1hdGlvblRpbWluZy5pZGwgYi9zcmMvY29iYWx0L2RvbS9XaW5kb3dfQW5pbWF0aW9uVGltaW5nLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM2YzcwYy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9XaW5kb3dfQW5pbWF0aW9uVGltaW5nLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L05PVEUtYW5pbWF0aW9uLXRpbWluZy0yMDE1MDkyMi8jV2luZG93LWludGVyZmFjZS1leHRlbnNpb25zCi0KLXBhcnRpYWwgaW50ZXJmYWNlIFdpbmRvdyB7Ci0gIGxvbmcgcmVxdWVzdEFuaW1hdGlvbkZyYW1lKEZyYW1lUmVxdWVzdENhbGxiYWNrIGNhbGxiYWNrKTsKLSAgdm9pZCBjYW5jZWxBbmltYXRpb25GcmFtZShsb25nIGhhbmRsZSk7Ci19OwotCi1jYWxsYmFjayBGcmFtZVJlcXVlc3RDYWxsYmFjayA9IHZvaWQoRE9NSGlnaFJlc1RpbWVTdGFtcCB0aW1lKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd19DU1NPTS5pZGwgYi9zcmMvY29iYWx0L2RvbS9XaW5kb3dfQ1NTT00uaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTkwZDdiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvZG9tL1dpbmRvd19DU1NPTS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9XRC1jc3NvbS0xLTIwMTYwMzE3LyNleHRlbnNpb25zLXRvLXRoZS13aW5kb3ctaW50ZXJmYWNlCi0KLXBhcnRpYWwgaW50ZXJmYWNlIFdpbmRvdyB7Ci0gIFtOZXdPYmplY3RdIENTU1N0eWxlRGVjbGFyYXRpb24gZ2V0Q29tcHV0ZWRTdHlsZShFbGVtZW50IGVsdCwgb3B0aW9uYWwgRE9NU3RyaW5nIHBzZXVkb0VsdCk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vV2luZG93X0NTU09NVmlldy5pZGwgYi9zcmMvY29iYWx0L2RvbS9XaW5kb3dfQ1NTT01WaWV3LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ5YWE0ZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9XaW5kb3dfQ1NTT01WaWV3LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLXZpZXctMjAxMzEyMTcvI2V4dGVuc2lvbnMtdG8tdGhlLXdpbmRvdy1pbnRlcmZhY2UKLQotcGFydGlhbCBpbnRlcmZhY2UgV2luZG93IHsKLSAgTWVkaWFRdWVyeUxpc3QgbWF0Y2hNZWRpYShET01TdHJpbmcgcXVlcnkpOwotICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIFNjcmVlbiBzY3JlZW47Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgaW5uZXJXaWR0aDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBpbm5lckhlaWdodDsKLQotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIHNjcmVlblg7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgc2NyZWVuWTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBvdXRlcldpZHRoOwotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG91dGVySGVpZ2h0OwotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGRldmljZVBpeGVsUmF0aW87Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vV2luZG93X1BlcmZvcm1hbmNlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL1dpbmRvd19QZXJmb3JtYW5jZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZhYjA4YjQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vV2luZG93X1BlcmZvcm1hbmNlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9uYXZpZ2F0aW9uLXRpbWluZy8jcGVyZm9ybWFuY2UKLQotcGFydGlhbCBpbnRlcmZhY2UgV2luZG93IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIFBlcmZvcm1hbmNlIHBlcmZvcm1hbmNlOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1hNTERvY3VtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL1hNTERvY3VtZW50LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzZjMDQ2OC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2RvbS9YTUxEb2N1bWVudC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwxOSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb2N1bWVudAotCi1pbnRlcmZhY2UgWE1MRG9jdW1lbnQgOiBEb2N1bWVudCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL1hNTFNlcmlhbGl6ZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vWE1MU2VyaWFsaXplci5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZTM2NTYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vWE1MU2VyaWFsaXplci5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLVBhcnNpbmcvI3RoZS14bWxzZXJpYWxpemVyLWludGVyZmFjZQotCi1bQ29uc3RydWN0b3JdCi1pbnRlcmZhY2UgWE1MU2VyaWFsaXplciB7Ci0gIERPTVN0cmluZyBzZXJpYWxpemVUb1N0cmluZyhOb2RlIHJvb3QpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2FuaW1hdGlvbl9ldmVudC5oIGIvc3JjL2NvYmFsdC9kb20vYW5pbWF0aW9uX2V2ZW50LmgKaW5kZXggZTFmMWU1OC4uNGI5ZTAwMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vYW5pbWF0aW9uX2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vYW5pbWF0aW9uX2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fQU5JTUFUSU9OX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQU5JTUFUSU9OX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9hbmltYXRpb25fZXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vYW5pbWF0aW9uX2V2ZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMjk5MzZjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vYW5pbWF0aW9uX2V2ZW50LmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3MzLWFuaW1hdGlvbnMtMjAxMzAyMTkvI2FuaW1hdGlvbmV2ZW50CisKK1tDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCitpbnRlcmZhY2UgQW5pbWF0aW9uRXZlbnQgOiBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgYW5pbWF0aW9uTmFtZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IGVsYXBzZWRUaW1lOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2FuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2NhbGxiYWNrX2xpc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9hbmltYXRpb25fZnJhbWVfcmVxdWVzdF9jYWxsYmFja19saXN0LmNjCmluZGV4IGYwZjg1NzMuLjYxMDhhZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2FuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2NhbGxiYWNrX2xpc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfY2FsbGJhY2tfbGlzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2FuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2NhbGxiYWNrX2xpc3QuaCIKIApAQCAtNDEsNiArMzksNyBAQAogICAgIGZyYW1lX3JlcXVlc3RfY2FsbGJhY2tzX1toYW5kbGUgLSAxXS0+Y2FuY2VsbGVkID0gdHJ1ZTsKICAgfQogfQorCiB2b2lkIEFuaW1hdGlvbkZyYW1lUmVxdWVzdENhbGxiYWNrTGlzdDo6UnVuQ2FsbGJhY2tzKGRvdWJsZSBhbmltYXRpb25fdGltZSkgewogICBUUkFDRV9FVkVOVDEoImNvYmFsdDo6ZG9tIiwgIldpbmRvdzo6UnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoKSIsCiAgICAgICAgICAgICAgICAibnVtYmVyX29mX2NhbGxiYWNrcyIsIGZyYW1lX3JlcXVlc3RfY2FsbGJhY2tzXy5zaXplKCkpOwpAQCAtNTMsNSArNTIsOSBAQAogICB9CiB9CiAKK2Jvb2wgQW5pbWF0aW9uRnJhbWVSZXF1ZXN0Q2FsbGJhY2tMaXN0OjpIYXNQZW5kaW5nQ2FsbGJhY2tzKCkgY29uc3QgeworICByZXR1cm4gIWZyYW1lX3JlcXVlc3RfY2FsbGJhY2tzXy5lbXB0eSgpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgZG9tCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9hbmltYXRpb25fZnJhbWVfcmVxdWVzdF9jYWxsYmFja19saXN0LmggYi9zcmMvY29iYWx0L2RvbS9hbmltYXRpb25fZnJhbWVfcmVxdWVzdF9jYWxsYmFja19saXN0LmgKaW5kZXggNmM1ZGY3MC4uNDYyMWQ3NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfY2FsbGJhY2tfbGlzdC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2FuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2NhbGxiYWNrX2xpc3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9BTklNQVRJT05fRlJBTUVfUkVRVUVTVF9DQUxMQkFDS19MSVNUX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQU5JTUFUSU9OX0ZSQU1FX1JFUVVFU1RfQ0FMTEJBQ0tfTElTVF9IXwpAQCAtMjIsMTkgKzIwLDE5IEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfdmVjdG9yLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZG9tIHsKIAogLy8gTWFuYWdlcyBhIGxpc3Qgb2YgZnJhbWUgcmVxdWVzdCBjYWxsYmFja3MgYXMgd2VsbCBhcyB0aGVpciAiY2FuY2VsbGVkIiBzdGF0ZS4KLS8vIEFzc29jaWF0ZXMgYSBoYW5kbGUgdG8gZWFjaCBmcmFtZSBmcmVxdWVzdCB0aGF0IGlzIHVuaXF1ZSB0byB0aGlzIGxpc3QuCisvLyBBc3NvY2lhdGVzIGEgaGFuZGxlIHRvIGVhY2ggZnJhbWUgcmVxdWVzdCB0aGF0IGlzIHVuaXF1ZSB0byB0aGlzIGxpc3QuCiAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9hbmltYXRpb24tdGltaW5nLyNkZm4tYW5pbWF0aW9uLWZyYW1lLXJlcXVlc3QtY2FsbGJhY2stbGlzdAogY2xhc3MgQW5pbWF0aW9uRnJhbWVSZXF1ZXN0Q2FsbGJhY2tMaXN0IHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgc2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uPHZvaWQoZG91YmxlKT4gRnJhbWVSZXF1ZXN0Q2FsbGJhY2s7Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8RnJhbWVSZXF1ZXN0Q2FsbGJhY2s+IEZyYW1lUmVxdWVzdENhbGxiYWNrQXJnOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8RnJhbWVSZXF1ZXN0Q2FsbGJhY2s+IEZyYW1lUmVxdWVzdENhbGxiYWNrQXJnOwogCiAgIGV4cGxpY2l0IEFuaW1hdGlvbkZyYW1lUmVxdWVzdENhbGxiYWNrTGlzdChzY3JpcHQ6OldyYXBwYWJsZSogY29uc3Qgb3duZXIpCiAgICAgICA6IG93bmVyXyhvd25lcikge30KQEAgLTQ3LDYgKzQ1LDkgQEAKICAgLy8gQ2FsbCBlYWNoIGFuaW1hdGlvbiBmcmFtZSBjYWxsYmFjayBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIHJlcXVlc3RlZC4KICAgdm9pZCBSdW5DYWxsYmFja3MoZG91YmxlIGFuaW1hdGlvbl90aW1lKTsKIAorICAvLyBXaGV0aGVyIG9yIG5vdCB0aGVyZSBhcmUgcGVuZGluZyBhbmltYXRpb24gZnJhbWUgY2FsbGJhY2tzLgorICBib29sIEhhc1BlbmRpbmdDYWxsYmFja3MoKSBjb25zdDsKKwogIHByaXZhdGU6CiAgIC8vIFdlIGRlZmluZSBhIHdyYXBwZXIgc3RydWN0dXJlIGZvciB0aGUgZnJhbWUgcmVxdWVzdCBzbyB0aGF0IHdlIGNhbgogICAvLyBhc3NvY2lhdGUgYSAiY2FuY2VsbGVkIiBmbGFnIHdpdGggZWFjaCBjYWxsYmFjay4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlci5jYyBiL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlci5jYwppbmRleCA1YTRiODhkLi44MjA0NmQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9hcnJheV9idWZmZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlci5oIGIvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgKaW5kZXggZWY0YTkyYS4uNjQ2NzhhYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fQVJSQVlfQlVGRkVSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQVJSQVlfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9hcnJheV9idWZmZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYzZiYTJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmlkbApAQCAtMCwwICsxLDI3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS90eXBlZGFycmF5L3NwZWNzL2xhdGVzdC8jNQorCitbCisgIENvbnN0cnVjdG9yKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKKyAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzCitdCitpbnRlcmZhY2UgQXJyYXlCdWZmZXIgeworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBieXRlTGVuZ3RoOworICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gQXJyYXlCdWZmZXIgc2xpY2UobG9uZyBiZWdpbiwgb3B0aW9uYWwgbG9uZyBlbmQpOworCisgIC8vIFRPRE86IERvIHdlIG5lZWQgdG8gc3VwcG9ydCB0aGlzPworICAvLyBzdGF0aWMgYm9vbGVhbiBpc1ZpZXcoYW55IHZhbHVlKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9hcnJheV9idWZmZXJfdmlldy5jYyBiL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmNjCmluZGV4IDk0M2MyNzcuLmQzYjA4NjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyX3ZpZXcuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyX3ZpZXcuaCBiL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmgKaW5kZXggZjA1MjM5NC4uNWJkYjFiNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyX3ZpZXcuaAorKysgYi9zcmMvY29iYWx0L2RvbS9hcnJheV9idWZmZXJfdmlldy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0FSUkFZX0JVRkZFUl9WSUVXX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQVJSQVlfQlVGRkVSX1ZJRVdfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2FycmF5X2J1ZmZlcl92aWV3LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjg5MDJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vYXJyYXlfYnVmZmVyX3ZpZXcuaWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3R5cGVkYXJyYXkvc3BlY3MvbGF0ZXN0LyM2CisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBBcnJheUJ1ZmZlclZpZXcgeworICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBBcnJheUJ1ZmZlciBidWZmZXI7CisgICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldDsKKyAgICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBieXRlTGVuZ3RoOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2F0dHIuY2MgYi9zcmMvY29iYWx0L2RvbS9hdHRyLmNjCmluZGV4IGRkMjBiNGEuLjY4Y2E3NmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2F0dHIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vYXR0ci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2F0dHIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYXR0ci5oIGIvc3JjL2NvYmFsdC9kb20vYXR0ci5oCmluZGV4IDI0OTRmODMuLjQzNjk3NDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2F0dHIuaAorKysgYi9zcmMvY29iYWx0L2RvbS9hdHRyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fQVRUUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0FUVFJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2F0dHIuaWRsIGIvc3JjL2NvYmFsdC9kb20vYXR0ci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWQxYjJiZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2F0dHIuaWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2F0dHIKKworaW50ZXJmYWNlIEF0dHIgeworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHZhbHVlOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG5hbWU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbm9kZU5hbWU7CisKKyAgLy8gRGVwcmVjYXRlZC4gQXR0ciBubyBsb25nZXIgaW5oZXJpdHMgZnJvbSBOb2RlLgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELWRvbS0yMDE1MDQyOC8jZG9tLWNvcmUKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBub2RlVmFsdWU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYXVkaW9fdHJhY2suaCBiL3NyYy9jb2JhbHQvZG9tL2F1ZGlvX3RyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM4NzI3NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2F1ZGlvX3RyYWNrLmgKQEAgLTAsMCArMSw4MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX0FVRElPX1RSQUNLX0hfCisjZGVmaW5lIENPQkFMVF9ET01fQVVESU9fVFJBQ0tfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvYmFsdC9kb20vdHJhY2tfYmFzZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK2NsYXNzIFNvdXJjZUJ1ZmZlcjsKKworLy8gVGhlIEF1ZGlvVHJhY2sgaW50ZXJmYWNlIGhvbGRzIGF0dHJpYnV0ZXMgb2YgYW4gYXVkaW8gdHJhY2suCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc2VtYW50aWNzLWVtYmVkZGVkLWNvbnRlbnQuaHRtbCNhdWRpb3RyYWNrLWF1ZGlvdHJhY2sKK2NsYXNzIEF1ZGlvVHJhY2sgOiBwdWJsaWMgVHJhY2tCYXNlIHsKKyBwdWJsaWM6CisgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgorICAvLworICBBdWRpb1RyYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtpbmQsCisgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsLCBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgYm9vbCBlbmFibGVkKQorICAgICAgOiBUcmFja0Jhc2UoaWQsIGtpbmQsIGxhYmVsLCBsYW5ndWFnZSwgJkF1ZGlvVHJhY2s6OklzVmFsaWRLaW5kKSwKKyAgICAgICAgZW5hYmxlZF8oZW5hYmxlZCkge30KKworICAvLyBXZWIgQVBJOiBBdWRpb1RyYWNrCisgIC8vCisgIHVzaW5nIFRyYWNrQmFzZTo6aWQ7CisgIHVzaW5nIFRyYWNrQmFzZTo6a2luZDsKKyAgdXNpbmcgVHJhY2tCYXNlOjpsYWJlbDsKKyAgdXNpbmcgVHJhY2tCYXNlOjpsYW5ndWFnZTsKKyAgYm9vbCBlbmFibGVkKCkgY29uc3QgeyByZXR1cm4gZW5hYmxlZF87IH0KKyAgdm9pZCBzZXRfZW5hYmxlZChib29sIGVuYWJsZWQpIHsKKyAgICBpZiAoZW5hYmxlZF8gPT0gZW5hYmxlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbmFibGVkXyA9IGVuYWJsZWQ7CisgICAgaWYgKG1lZGlhX2VsZW1lbnRfKSB7CisgICAgICAvLyBUT0RPOiBOb3RpZnkgdGhlIG1lZGlhIGVsZW1lbnQuCisgICAgICAvLyBtZWRpYV9lbGVtZW50Xy0+T25BdWRpb1RyYWNrQ2hhbmdlZCh0aGlzKTsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICB9CisgIH0KKworICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgLy8KKyAgc3RhdGljIGJvb2wgSXNWYWxpZEtpbmQoY29uc3QgY2hhcioga2luZCkgeworICAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc2VtYW50aWNzLWVtYmVkZGVkLWNvbnRlbnQuaHRtbCNkb20tYXVkaW90cmFjay1hdWRpb3RyYWNra2luZAorICAgIHJldHVybiBTYlN0cmluZ0NvbXBhcmVBbGwoa2luZCwgImFsdGVybmF0aXZlIikgPT0gMCB8fAorICAgICAgICAgICBTYlN0cmluZ0NvbXBhcmVBbGwoa2luZCwgImRlc2NyaXB0aW9ucyIpID09IDAgfHwKKyAgICAgICAgICAgU2JTdHJpbmdDb21wYXJlQWxsKGtpbmQsICJtYWluIikgPT0gMCB8fAorICAgICAgICAgICBTYlN0cmluZ0NvbXBhcmVBbGwoa2luZCwgIm1haW4tZGVzYyIpID09IDAgfHwKKyAgICAgICAgICAgU2JTdHJpbmdDb21wYXJlQWxsKGtpbmQsICJ0cmFuc2xhdGlvbiIpID09IDAgfHwKKyAgICAgICAgICAgU2JTdHJpbmdDb21wYXJlQWxsKGtpbmQsICJjb21tZW50YXJ5IikgPT0gMCB8fAorICAgICAgICAgICBTYlN0cmluZ0dldExlbmd0aChraW5kKSA9PSAwOworICB9CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKEF1ZGlvVHJhY2spOworCisgcHJpdmF0ZToKKyAgYm9vbCBlbmFibGVkXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfRE9NX0FVRElPX1RSQUNLX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9hdWRpb190cmFjay5pZGwgYi9zcmMvY29iYWx0L2RvbS9hdWRpb190cmFjay5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWNkOTFlMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2F1ZGlvX3RyYWNrLmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUxL3NlbWFudGljcy1lbWJlZGRlZC1jb250ZW50Lmh0bWwjYXVkaW90cmFjay1hdWRpb3RyYWNrCisKK2ludGVyZmFjZSBBdWRpb1RyYWNrIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBpZDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBraW5kOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGxhYmVsOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGxhbmd1YWdlOworICBhdHRyaWJ1dGUgYm9vbGVhbiBlbmFibGVkOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2F1ZGlvX3RyYWNrX2xpc3QuaCBiL3NyYy9jb2JhbHQvZG9tL2F1ZGlvX3RyYWNrX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MDY2ZjJjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vYXVkaW9fdHJhY2tfbGlzdC5oCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9BVURJT19UUkFDS19MSVNUX0hfCisjZGVmaW5lIENPQkFMVF9ET01fQVVESU9fVFJBQ0tfTElTVF9IXworCisjaW5jbHVkZSAiY29iYWx0L2RvbS9hdWRpb190cmFjay5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS90cmFja19saXN0X2Jhc2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworCisvLyBUaGUgQXVkaW9UcmFja0xpc3QgaW50ZXJmYWNlIGhvbGRzIGEgbGlzdCBvZiBhdWRpbyB0cmFja3MKKy8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1MS9zZW1hbnRpY3MtZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tsaXN0LWF1ZGlvdHJhY2tsaXN0CitjbGFzcyBBdWRpb1RyYWNrTGlzdCA6IHB1YmxpYyBUcmFja0xpc3RCYXNlPEF1ZGlvVHJhY2s+IHsKKyBwdWJsaWM6CisgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgorICAvLworICBleHBsaWNpdCBBdWRpb1RyYWNrTGlzdChIVE1MTWVkaWFFbGVtZW50KiBtZWRpYV9lbGVtZW50KQorICAgICAgOiBUcmFja0xpc3RCYXNlPEF1ZGlvVHJhY2s+KG1lZGlhX2VsZW1lbnQpIHt9CisKKyAgLy8gV2ViIEFQSTogQXVkaW9UcmFja0xpc3QKKyAgLy8KKyAgdXNpbmcgVHJhY2tMaXN0QmFzZTxBdWRpb1RyYWNrPjo6bGVuZ3RoOworICB1c2luZyBUcmFja0xpc3RCYXNlPEF1ZGlvVHJhY2s+OjpBbm9ueW1vdXNJbmRleGVkR2V0dGVyOworICB1c2luZyBUcmFja0xpc3RCYXNlPEF1ZGlvVHJhY2s+OjpHZXRUcmFja0J5SWQ7CisKKyAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCisgIC8vCisgIGJvb2wgSGFzRW5hYmxlZFRyYWNrKCkgY29uc3QgeworICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgbGVuZ3RoKCk7ICsraSkgeworICAgICAgaWYgKEFub255bW91c0luZGV4ZWRHZXR0ZXIoaSktPmVuYWJsZWQoKSkgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoQXVkaW9UcmFja0xpc3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fQVVESU9fVFJBQ0tfTElTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYXVkaW9fdHJhY2tfbGlzdC5pZGwgYi9zcmMvY29iYWx0L2RvbS9hdWRpb190cmFja19saXN0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTMxOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vYXVkaW9fdHJhY2tfbGlzdC5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1MS9zZW1hbnRpY3MtZW1iZWRkZWQtY29udGVudC5odG1sI2F1ZGlvdHJhY2tsaXN0LWF1ZGlvdHJhY2tsaXN0CisKK2ludGVyZmFjZSBBdWRpb1RyYWNrTGlzdCA6IEV2ZW50VGFyZ2V0IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBnZXR0ZXIgQXVkaW9UcmFjayh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgQXVkaW9UcmFjaz8gZ2V0VHJhY2tCeUlkKERPTVN0cmluZyBpZCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYmVuY2htYXJrX3N0YXRfbmFtZXMuY2MgYi9zcmMvY29iYWx0L2RvbS9iZW5jaG1hcmtfc3RhdF9uYW1lcy5jYwppbmRleCBkZWJhYjM4Li4yZTIxNGJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9iZW5jaG1hcmtfc3RhdF9uYW1lcy5jYworKysgYi9zcmMvY29iYWx0L2RvbS9iZW5jaG1hcmtfc3RhdF9uYW1lcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2JlbmNobWFya19zdGF0X25hbWVzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2JlbmNobWFya19zdGF0X25hbWVzLmggYi9zcmMvY29iYWx0L2RvbS9iZW5jaG1hcmtfc3RhdF9uYW1lcy5oCmluZGV4IDIzYWUyMGIuLjBjMjE1N2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2JlbmNobWFya19zdGF0X25hbWVzLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vYmVuY2htYXJrX3N0YXRfbmFtZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9CRU5DSE1BUktfU1RBVF9OQU1FU19IXwogI2RlZmluZSBDT0JBTFRfRE9NX0JFTkNITUFSS19TVEFUX05BTUVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ibG9iLmggYi9zcmMvY29iYWx0L2RvbS9ibG9iLmgKaW5kZXggZDY3N2UwNC4uNmE0OWI4YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vYmxvYi5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2Jsb2IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9CTE9CX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQkxPQl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYmxvYi5pZGwgYi9zcmMvY29iYWx0L2RvbS9ibG9iLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOTZiMDM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vYmxvYi5pZGwKQEAgLTAsMCArMSwyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0QtRmlsZUFQSS0yMDE1MDQyMS8jZGZuLUJsb2IKKworWworICAvL0NvbnN0cnVjdG9yLAorICAvLyBUT0RPOiBXaGVuIGFycmF5cyBvciBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZCwgc3VwcG9ydCB0aGUgY29uc3RydWN0b3IKKyAgLy8gZGVmaW5lZCBpbiB0aGUgc3RhbmRhcmQgd2l0aCBtdWx0aXBsZSBibG9icGFydHMsIGFuZCBkcm9wIHRoZSBzaW5nbGUKKyAgLy8gQXJyYXlCdWZmZXIgY29uc3RydWN0b3IuCisgIENvbnN0cnVjdG9yKG9wdGlvbmFsIEFycmF5QnVmZmVyIGJ1ZmZlciksCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncworXQoraW50ZXJmYWNlIEJsb2IgeworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsb25nIHNpemU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vYmxvYl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vYmxvYl90ZXN0LmNjCmluZGV4IDVkMjUyZGEuLjlhMzFiNzggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2Jsb2JfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ibG9iX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jZGF0YV9zZWN0aW9uLmNjIGIvc3JjL2NvYmFsdC9kb20vY2RhdGFfc2VjdGlvbi5jYwppbmRleCBiYTliZGQ4Li4xNTI2NTllIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jZGF0YV9zZWN0aW9uLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NkYXRhX3NlY3Rpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jZGF0YV9zZWN0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NkYXRhX3NlY3Rpb24uaCBiL3NyYy9jb2JhbHQvZG9tL2NkYXRhX3NlY3Rpb24uaAppbmRleCA4ZTRlZjhmLi5iZGYxNjA1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jZGF0YV9zZWN0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vY2RhdGFfc2VjdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0NEQVRBX1NFQ1RJT05fSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9DREFUQV9TRUNUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jZGF0YV9zZWN0aW9uLmlkbCBiL3NyYy9jb2JhbHQvZG9tL2NkYXRhX3NlY3Rpb24uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkMDMzYjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9jZGF0YV9zZWN0aW9uLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAwMC9SRUMtRE9NLUxldmVsLTItQ29yZS0yMDAwMTExMy9jb3JlLmh0bWwjSUQtNjY3NDY5MjEyCisKK1sKKyAgQ29uc3RydWN0b3Iob3B0aW9uYWwgRE9NU3RyaW5nIGRhdGEgPSAiIiksCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncworXQoraW50ZXJmYWNlIENEQVRBU2VjdGlvbiA6IFRleHQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jaGFyYWN0ZXJfZGF0YS5jYyBiL3NyYy9jb2JhbHQvZG9tL2NoYXJhY3Rlcl9kYXRhLmNjCmluZGV4IDZmZmZmMjUuLjlmN2YxMjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2NoYXJhY3Rlcl9kYXRhLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NoYXJhY3Rlcl9kYXRhLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY2hhcmFjdGVyX2RhdGEuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY2hhcmFjdGVyX2RhdGEuaCBiL3NyYy9jb2JhbHQvZG9tL2NoYXJhY3Rlcl9kYXRhLmgKaW5kZXggMTJhOGQ5ZC4uMWE1ZjY0NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY2hhcmFjdGVyX2RhdGEuaAorKysgYi9zcmMvY29iYWx0L2RvbS9jaGFyYWN0ZXJfZGF0YS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0NIQVJBQ1RFUl9EQVRBX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQ0hBUkFDVEVSX0RBVEFfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NoYXJhY3Rlcl9kYXRhLmlkbCBiL3NyYy9jb2JhbHQvZG9tL2NoYXJhY3Rlcl9kYXRhLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMDYyY2M0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vY2hhcmFjdGVyX2RhdGEuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2NoYXJhY3RlcmRhdGEKKworaW50ZXJmYWNlIENoYXJhY3RlckRhdGEgOiBOb2RlIHsKKyAgW1RyZWF0TnVsbEFzPUVtcHR5U3RyaW5nXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGRhdGE7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY29tbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2NvbW1lbnQuY2MKaW5kZXggNzI2YTlmZS4uMWMxMmQyNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY29tbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9jb21tZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY29tbWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jb21tZW50LmggYi9zcmMvY29iYWx0L2RvbS9jb21tZW50LmgKaW5kZXggZTc1YjQzOS4uMjZkMjMxMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY29tbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NvbW1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9DT01NRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQ09NTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY29tbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9jb21tZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTViNzViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vY29tbWVudC5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jY29tbWVudAorCitbCisgIENvbnN0cnVjdG9yKG9wdGlvbmFsIERPTVN0cmluZyBkYXRhID0gIiIpLAorICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MKK10KK2ludGVyZmFjZSBDb21tZW50IDogQ2hhcmFjdGVyRGF0YSB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NvbW1lbnRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2NvbW1lbnRfdGVzdC5jYwppbmRleCA3MWMxYzQ1Li4zNGFmNzJmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jb21tZW50X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vY29tbWVudF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY29tbWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jb25zb2xlLmNjIGIvc3JjL2NvYmFsdC9kb20vY29uc29sZS5jYwppbmRleCAyZWE0ODAxLi42ZTEzNzEyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jb25zb2xlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NvbnNvbGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jb25zb2xlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NvbnNvbGUuaCBiL3NyYy9jb2JhbHQvZG9tL2NvbnNvbGUuaAppbmRleCAzMTlkZDg3Li5iYjU5NzlhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jb25zb2xlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vY29uc29sZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0NPTlNPTEVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9DT05TT0xFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jb25zb2xlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL2NvbnNvbGUuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2ZGRlMDcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9jb25zb2xlLmlkbApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBDdXN0b20gaW50ZXJmYWNlIHRvIGNvbW11bmljYXRlIHdpdGggbGF5b3V0IHRlc3RzLgorLy8gUmVmZXJlbmNlOiBodHRwczovL2RldmVsb3Blci5tb3ppbGxhLm9yZy9lbi1VUy9kb2NzL1dlYi9BUEkvQ29uc29sZQorCitpbnRlcmZhY2UgQ29uc29sZSB7CisgIHZvaWQgZGVidWcoRE9NU3RyaW5nIHRleHQpOworICB2b2lkIGxvZyhET01TdHJpbmcgdGV4dCk7CisgIHZvaWQgaW5mbyhET01TdHJpbmcgdGV4dCk7CisgIHZvaWQgZXJyb3IoRE9NU3RyaW5nIHRleHQpOworICB2b2lkIHdhcm4oRE9NU3RyaW5nIHRleHQpOworICB2b2lkIHRyYWNlKCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3J5cHRvLmNjIGIvc3JjL2NvYmFsdC9kb20vY3J5cHRvLmNjCmluZGV4IDE5NDcwYzkuLmZkMzE2NTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2NyeXB0by5jYworKysgYi9zcmMvY29iYWx0L2RvbS9jcnlwdG8uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jcnlwdG8uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3J5cHRvLmggYi9zcmMvY29iYWx0L2RvbS9jcnlwdG8uaAppbmRleCBlZjk4NDY1Li42MDU2NTJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jcnlwdG8uaAorKysgYi9zcmMvY29iYWx0L2RvbS9jcnlwdG8uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9DUllQVE9fSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9DUllQVE9fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NyeXB0by5pZGwgYi9zcmMvY29iYWx0L2RvbS9jcnlwdG8uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWI5YmUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9jcnlwdG8uaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJDcnlwdG9BUEkvI2NyeXB0by1pbnRlcmZhY2UKKworaW50ZXJmYWNlIENyeXB0byB7CisgIFtSYWlzZXNFeGNlcHRpb25dIEFycmF5QnVmZmVyVmlldyBnZXRSYW5kb21WYWx1ZXMoQXJyYXlCdWZmZXJWaWV3IGFycmF5KTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jcnlwdG9fdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2NyeXB0b190ZXN0LmNjCmluZGV4IDM2ZmM3MzAuLjU2OGU5YTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2NyeXB0b190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NyeXB0b190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY3J5cHRvLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZS5jYyBiL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZS5jYwppbmRleCAwZjFmYWFlLi4wNGQzNGExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jc3BfZGVsZWdhdGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY3NwX2RlbGVnYXRlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZS5oIGIvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlLmgKaW5kZXggYWVhNzhlZS4uNTFlNDNjMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fQ1NQX0RFTEVHQVRFX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQ1NQX0RFTEVHQVRFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jc3BfZGVsZWdhdGVfZmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV9mYWN0b3J5LmNjCmluZGV4IGEyYzdhOTMuLjU1YTRmMTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV9mYWN0b3J5LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV9mYWN0b3J5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY3NwX2RlbGVnYXRlX2ZhY3RvcnkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlX2ZhY3RvcnkuaCBiL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV9mYWN0b3J5LmgKaW5kZXggNmVhOGE2NC4uZDdmMzI3NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlX2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L2RvbS9jc3BfZGVsZWdhdGVfZmFjdG9yeS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0NTUF9ERUxFR0FURV9GQUNUT1JZX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQ1NQX0RFTEVHQVRFX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlX3Rlc3QuY2MKaW5kZXggMDc3ZjE3NS4uMzJlZTYxMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jc3BfZGVsZWdhdGUuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV9mYWN0b3J5LmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jc3BfZGVsZWdhdGVfdHlwZS5oIGIvc3JjL2NvYmFsdC9kb20vY3NwX2RlbGVnYXRlX3R5cGUuaAppbmRleCBkZjIzODBkLi4zMWRkNTAzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jc3BfZGVsZWdhdGVfdHlwZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV90eXBlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fQ1NQX0RFTEVHQVRFX1RZUEVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9DU1BfREVMRUdBVEVfVFlQRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3NwX3Zpb2xhdGlvbl9yZXBvcnRlci5jYyBiL3NyYy9jb2JhbHQvZG9tL2NzcF92aW9sYXRpb25fcmVwb3J0ZXIuY2MKaW5kZXggNjE5ZmM4Yy4uNmZkOGM0YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3NwX3Zpb2xhdGlvbl9yZXBvcnRlci5jYworKysgYi9zcmMvY29iYWx0L2RvbS9jc3BfdmlvbGF0aW9uX3JlcG9ydGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY3NwX3Zpb2xhdGlvbl9yZXBvcnRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jc3BfdmlvbGF0aW9uX3JlcG9ydGVyLmggYi9zcmMvY29iYWx0L2RvbS9jc3BfdmlvbGF0aW9uX3JlcG9ydGVyLmgKaW5kZXggMGVmYjMyZC4uMWFkZDQzOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3NwX3Zpb2xhdGlvbl9yZXBvcnRlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2NzcF92aW9sYXRpb25fcmVwb3J0ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9DU1BfVklPTEFUSU9OX1JFUE9SVEVSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQ1NQX1ZJT0xBVElPTl9SRVBPUlRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3NzX2FuaW1hdGlvbnNfYWRhcHRlci5jYyBiL3NyYy9jb2JhbHQvZG9tL2Nzc19hbmltYXRpb25zX2FkYXB0ZXIuY2MKaW5kZXggMDUyNzY1NC4uNjI1MDk1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3NzX2FuaW1hdGlvbnNfYWRhcHRlci5jYworKysgYi9zcmMvY29iYWx0L2RvbS9jc3NfYW5pbWF0aW9uc19hZGFwdGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vY3NzX2FuaW1hdGlvbnNfYWRhcHRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9jc3NfYW5pbWF0aW9uc19hZGFwdGVyLmggYi9zcmMvY29iYWx0L2RvbS9jc3NfYW5pbWF0aW9uc19hZGFwdGVyLmgKaW5kZXggODYwN2IwYy4uMTY3M2UwZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vY3NzX2FuaW1hdGlvbnNfYWRhcHRlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2Nzc19hbmltYXRpb25zX2FkYXB0ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9DU1NfQU5JTUFUSU9OU19BREFQVEVSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fQ1NTX0FOSU1BVElPTlNfQURBUFRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vY3NzX3RyYW5zaXRpb25zX2FkYXB0ZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9jc3NfdHJhbnNpdGlvbnNfYWRhcHRlci5jYwppbmRleCA4MGIzYWY1Li45OTE1YmMxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9jc3NfdHJhbnNpdGlvbnNfYWRhcHRlci5jYworKysgYi9zcmMvY29iYWx0L2RvbS9jc3NfdHJhbnNpdGlvbnNfYWRhcHRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2Nzc190cmFuc2l0aW9uc19hZGFwdGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2Nzc190cmFuc2l0aW9uc19hZGFwdGVyLmggYi9zcmMvY29iYWx0L2RvbS9jc3NfdHJhbnNpdGlvbnNfYWRhcHRlci5oCmluZGV4IDM5MjBhZTQuLmJiM2JkNzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2Nzc190cmFuc2l0aW9uc19hZGFwdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vY3NzX3RyYW5zaXRpb25zX2FkYXB0ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9DU1NfVFJBTlNJVElPTlNfQURBUFRFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0NTU19UUkFOU0lUSU9OU19BREFQVEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kYXRhX3ZpZXcuY2MgYi9zcmMvY29iYWx0L2RvbS9kYXRhX3ZpZXcuY2MKaW5kZXggNTVmYzc3Mi4uNTFkMjYxMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZGF0YV92aWV3LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RhdGFfdmlldy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RhdGFfdmlldy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kYXRhX3ZpZXcuaCBiL3NyYy9jb2JhbHQvZG9tL2RhdGFfdmlldy5oCmluZGV4IDRlOTU3MmUuLmQ2YmZiMjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RhdGFfdmlldy5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RhdGFfdmlldy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0RBVEFfVklFV19IXwogI2RlZmluZSBDT0JBTFRfRE9NX0RBVEFfVklFV19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZGF0YV92aWV3LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2RhdGFfdmlldy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWJlNTYyZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RhdGFfdmlldy5pZGwKQEAgLTAsMCArMSw1NiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdHlwZWRhcnJheS9zcGVjcy9sYXRlc3QvIzgKKworWworICBDb25zdHJ1Y3RvcihBcnJheUJ1ZmZlciBidWZmZXIsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwKKyAgICAgICAgICAgICAgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBieXRlTGVuZ3RoKSwKKyAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yCitdCitpbnRlcmZhY2UgRGF0YVZpZXcgeworICBbUmFpc2VzRXhjZXB0aW9uXSBieXRlIGdldEludDgodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0KTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gb2N0ZXQgZ2V0VWludDgodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0KTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gc2hvcnQgZ2V0SW50MTYodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7CisgIFtSYWlzZXNFeGNlcHRpb25dIHVuc2lnbmVkIHNob3J0IGdldFVpbnQxNih1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7CisgIFtSYWlzZXNFeGNlcHRpb25dIGxvbmcgZ2V0SW50MzIodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdW5zaWduZWQgbG9uZyBnZXRVaW50MzIodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7CisgIFtSYWlzZXNFeGNlcHRpb25dIGZsb2F0IGdldEZsb2F0MzIodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gZG91YmxlIGdldEZsb2F0NjQodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7CisKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRJbnQ4KHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgYnl0ZSB2YWx1ZSk7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0VWludDgodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBvY3RldCB2YWx1ZSk7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0SW50MTYodW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBzaG9ydCB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0VWludDE2KHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgc2hvcnQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRJbnQzMih1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIGxvbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgYm9vbGVhbiBsaXR0bGVFbmRpYW4pOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNldFVpbnQzMih1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRGbG9hdDMyKHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgZmxvYXQgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIGxpdHRsZUVuZGlhbik7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0RmxvYXQ2NCh1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIGRvdWJsZSB2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIGJvb2xlYW4gbGl0dGxlRW5kaWFuKTsKK307CisKK0RhdGFWaWV3IGltcGxlbWVudHMgQXJyYXlCdWZmZXJWaWV3OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZGF0YV92aWV3X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9kYXRhX3ZpZXdfdGVzdC5jYwppbmRleCBkZDQyMTM0Li45ZDAzNTAwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kYXRhX3ZpZXdfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kYXRhX3ZpZXdfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RhdGFfdmlldy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmNjCmluZGV4IDIzNzBhYmYuLjEzMWIyNDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9jdW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmgKaW5kZXggNmY5MWQzNi4uMzZkNGUzYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0RPQ1VNRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fRE9DVU1FTlRfSF8KQEAgLTE4OSwxMCArMTg3LDEwIEBACiAKICAgc2NvcGVkX3JlZnB0cjxFbGVtZW50PiBhY3RpdmVfZWxlbWVudCgpIGNvbnN0OwogCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9ucmVhZHlzdGF0ZWNoYW5nZSgpIGNvbnN0IHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbnJlYWR5c3RhdGVjaGFuZ2UoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpyZWFkeXN0YXRlY2hhbmdlKCkpOwogICB9Ci0gIHZvaWQgc2V0X29ucmVhZHlzdGF0ZWNoYW5nZShjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBldmVudF9saXN0ZW5lcikgeworICB2b2lkIHNldF9vbnJlYWR5c3RhdGVjaGFuZ2UoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgewogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpyZWFkeXN0YXRlY2hhbmdlKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVkMjdlMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50LmlkbApAQCAtMCwwICsxLDM5IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb2N1bWVudAorCitpbnRlcmZhY2UgRG9jdW1lbnQgOiBOb2RlIHsKKyAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01JbXBsZW1lbnRhdGlvbiBpbXBsZW1lbnRhdGlvbjsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBVUkw7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgZG9jdW1lbnRVUkk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBFbGVtZW50PyBkb2N1bWVudEVsZW1lbnQ7CisKKyAgLy8gTm9uLXN0YW5kYXJkIHJldHVybiB0eXBlLCBzaG91bGQgYmUgV2luZG93UHJveHkuCisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9zaW5nbGUtcGFnZS5odG1sI2RvbS1kb2N1bWVudC1kZWZhdWx0dmlldworICByZWFkb25seSBhdHRyaWJ1dGUgV2luZG93PyBkZWZhdWx0VmlldzsKKworICBIVE1MQ29sbGVjdGlvbiBnZXRFbGVtZW50c0J5VGFnTmFtZShET01TdHJpbmcgbG9jYWxOYW1lKTsKKyAgSFRNTENvbGxlY3Rpb24gZ2V0RWxlbWVudHNCeUNsYXNzTmFtZShET01TdHJpbmcgY2xhc3NOYW1lcyk7CisgIFtOZXdPYmplY3RdIEVsZW1lbnQgY3JlYXRlRWxlbWVudChET01TdHJpbmcgbG9jYWxOYW1lKTsKKyAgW05ld09iamVjdF0gRWxlbWVudCBjcmVhdGVFbGVtZW50TlMoRE9NU3RyaW5nIG5hbWVzcGFjZVVSSSwgRE9NU3RyaW5nIGxvY2FsTmFtZSk7CisKKyAgW05ld09iamVjdF0gVGV4dCBjcmVhdGVUZXh0Tm9kZShET01TdHJpbmcgZGF0YSk7CisgIFtOZXdPYmplY3RdIENvbW1lbnQgY3JlYXRlQ29tbWVudChET01TdHJpbmcgZGF0YSk7CisKKyAgW05ld09iamVjdCwgUmFpc2VzRXhjZXB0aW9uXSBFdmVudCBjcmVhdGVFdmVudChET01TdHJpbmcgaW50ZXJmYWNlTmFtZSk7CisgIGF0dHJpYnV0ZSBET01TdHJpbmcgY29va2llOworfTsKKworRG9jdW1lbnQgaW1wbGVtZW50cyBHbG9iYWxFdmVudEhhbmRsZXJzOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfX3dlYl9hbmltYXRpb25zX2FwaS5pZGwgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF9fd2ViX2FuaW1hdGlvbnNfYXBpLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MGRjODI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfX3dlYl9hbmltYXRpb25zX2FwaS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jZXh0ZW5zaW9ucy10by10aGUtZG9jdW1lbnQtaW50ZXJmYWNlCisKK3BhcnRpYWwgaW50ZXJmYWNlIERvY3VtZW50IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERvY3VtZW50VGltZWxpbmUgdGltZWxpbmU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfY3Nzb20uaWRsIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfY3Nzb20uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjllYjE1MGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF9jc3NvbS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3Nzb20tMjAxMzEyMDUvI2V4dGVuc2lvbnMtdG8tdGhlLWRvY3VtZW50LWludGVyZmFjZQorCitwYXJ0aWFsIGludGVyZmFjZSBEb2N1bWVudCB7CisgIFtTYW1lT2JqZWN0XSByZWFkb25seSBhdHRyaWJ1dGUgU3R5bGVTaGVldExpc3Qgc3R5bGVTaGVldHM7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfaHRtbDUuaWRsIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfaHRtbDUuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0NzQ2NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF9odG1sNS5pZGwKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvbS5odG1sI3RoZS1kb2N1bWVudC1vYmplY3QKKworW092ZXJyaWRlQnVpbHRpbnNdCitwYXJ0aWFsIC8qc2VhbGVkKi8gaW50ZXJmYWNlIERvY3VtZW50IHsKKyAgW1B1dEZvcndhcmRzPWhyZWYsIFVuZm9yZ2VhYmxlXSByZWFkb25seSBhdHRyaWJ1dGUgTG9jYXRpb24/IGxvY2F0aW9uOworICAvLyBib2R5IGF0dHJpYnV0ZSBpcyBjaGFuZ2VkLCBmcm9tIHRoZSBzcGVjJ3M6CisgIC8vICAgYXR0cmlidXRlIEhUTUxFbGVtZW50PyBib2R5OworICAvLyBUaGlzIGlzIGJlY2F1c2Ugd2UgZG9uJ3Qgc3VwcG9ydCBmcmFtZXNldCBlbGVtZW50LCBib2R5IGhhcyB0byBiZSBhbgorICAvLyBIVE1MQm9keUVsZW1lbnQuCisgIGF0dHJpYnV0ZSBIVE1MQm9keUVsZW1lbnQ/IGJvZHk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBIVE1MSGVhZEVsZW1lbnQ/IGhlYWQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdGl0bGU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBFbGVtZW50PyBhY3RpdmVFbGVtZW50OworCisgIFtMZW5pZW50VGhpc10gYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnJlYWR5c3RhdGVjaGFuZ2U7Cit9OworCisvLyBUT0RPOiBUaGUgSURMIGRlZmluZXMgRXZlbnRIYW5kbGVyIGFzIGEgbnVsbGFibGUgY2FsbGJhY2sKKy8vIGZ1bmN0aW9uLiBEZWZpbmUgaXQgYXMgYSBudWxsYWJsZSBFdmVudExpc3RlbmVyIGZvciBub3cgdW50aWwgd2UgY2FuIGRvCisvLyBzb21lIHJlZmFjdG9yaW5nIHRvIGFjY2VwdCBib3RoIGluIHRoZSBFdmVudFRhcmdldCBpbXBsZW1lbnRhdGlvbi4KK3R5cGVkZWYgRXZlbnRMaXN0ZW5lcj8gRXZlbnRIYW5kbGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3Rlc3QuY2MKaW5kZXggZTUwYzA2Yy4uMTkwMGVjNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9jdW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGltZWxpbmUuY2MgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90aW1lbGluZS5jYwppbmRleCBhOWJlMWE3Li4wNzkzYzRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90aW1lbGluZS5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90aW1lbGluZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90aW1lbGluZS5oIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGltZWxpbmUuaAppbmRleCBjZTk4YjNmLi5jODk0NzQyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90aW1lbGluZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3RpbWVsaW5lLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRE9DVU1FTlRfVElNRUxJTkVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9ET0NVTUVOVF9USU1FTElORV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGltZWxpbmUuaWRsIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdGltZWxpbmUuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlZDIyNzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90aW1lbGluZS5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWRvY3VtZW50dGltZWxpbmUtaW50ZXJmYWNlCisKK1sKKyAgICBDb25zdHJ1Y3RvciAoRE9NSGlnaFJlc1RpbWVTdGFtcCBvcmlnaW5UaW1lKSwKKyAgICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MKK10gaW50ZXJmYWNlIERvY3VtZW50VGltZWxpbmUgOiBBbmltYXRpb25UaW1lbGluZSB7Cit9OworCit0eXBlZGVmIGRvdWJsZSBET01IaWdoUmVzVGltZVN0YW1wOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdHlwZS5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3R5cGUuY2MKaW5kZXggYTUyMzAzMS4uMDNkMGI5YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdHlwZS5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90eXBlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9jdW1lbnRfdHlwZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90eXBlLmggYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90eXBlLmgKaW5kZXggMDJhNmYxZS4uYTllZWJkMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdHlwZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3R5cGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9ET0NVTUVOVF9UWVBFX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fRE9DVU1FTlRfVFlQRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdHlwZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90eXBlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzczMGQxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdHlwZS5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jZG9jdW1lbnR0eXBlCisKK2ludGVyZmFjZSBEb2N1bWVudFR5cGUgOiBOb2RlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBuYW1lOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHB1YmxpY0lkOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHN5c3RlbUlkOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3R5cGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvY3VtZW50X3R5cGVfdGVzdC5jYwppbmRleCA1NDBkYzUzLi5kYWZmYTRlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb2N1bWVudF90eXBlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9jdW1lbnRfdHlwZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9jdW1lbnRfdHlwZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb20uZ3lwIGIvc3JjL2NvYmFsdC9kb20vZG9tLmd5cAppbmRleCAzZDJhOWU5Li40ZDY5N2UxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb20uZ3lwCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbS5neXAKQEAgLTMwLDYgKzMwLDggQEAKICAgICAgICAgJ2FycmF5X2J1ZmZlcl92aWV3LmgnLAogICAgICAgICAnYXR0ci5jYycsCiAgICAgICAgICdhdHRyLmgnLAorICAgICAgICAnYXVkaW9fdHJhY2suaCcsCisgICAgICAgICdhdWRpb190cmFja19saXN0LmgnLAogICAgICAgICAnYmVuY2htYXJrX3N0YXRfbmFtZXMuY2MnLAogICAgICAgICAnYmVuY2htYXJrX3N0YXRfbmFtZXMuaCcsCiAgICAgICAgICdibG9iLmgnLApAQCAtMTczLDEwICsxNzUsMTAgQEAKICAgICAgICAgJ21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaCcsCiAgICAgICAgICdtZWRpYV9xdWVyeV9saXN0LmNjJywKICAgICAgICAgJ21lZGlhX3F1ZXJ5X2xpc3QuaCcsCi0gICAgICAgICdtZWRpYV9zb3VyY2UuY2MnLAotICAgICAgICAnbWVkaWFfc291cmNlLmgnLAogICAgICAgICAnbWVtb3J5X2luZm8uY2MnLAogICAgICAgICAnbWVtb3J5X2luZm8uaCcsCisgICAgICAgICdtZXNzYWdlX2V2ZW50LmgnLAorICAgICAgICAnbWVzc2FnZV9ldmVudC5jYycsCiAgICAgICAgICdtaW1lX3R5cGVfYXJyYXkuY2MnLAogICAgICAgICAnbWltZV90eXBlX2FycmF5LmgnLAogICAgICAgICAnbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyLmNjJywKQEAgLTIyMSwxMCArMjIzLDYgQEAKICAgICAgICAgJ3NlY3VyaXR5X3BvbGljeV92aW9sYXRpb25fZXZlbnQuaCcsCiAgICAgICAgICdzZXJpYWxpemVyLmNjJywKICAgICAgICAgJ3NlcmlhbGl6ZXIuaCcsCi0gICAgICAgICdzb3VyY2VfYnVmZmVyLmNjJywKLSAgICAgICAgJ3NvdXJjZV9idWZmZXIuaCcsCi0gICAgICAgICdzb3VyY2VfYnVmZmVyX2xpc3QuY2MnLAotICAgICAgICAnc291cmNlX2J1ZmZlcl9saXN0LmgnLAogICAgICAgICAnc3RvcmFnZS5jYycsCiAgICAgICAgICdzdG9yYWdlLmgnLAogICAgICAgICAnc3RvcmFnZV9hcmVhLmNjJywKQEAgLTIzNyw2ICsyMzUsMTAgQEAKICAgICAgICAgJ3RleHQuaCcsCiAgICAgICAgICd0aW1lX3Jhbmdlcy5jYycsCiAgICAgICAgICd0aW1lX3Jhbmdlcy5oJywKKyAgICAgICAgJ3RyYWNrX2Jhc2UuaCcsCisgICAgICAgICd0cmFja19kZWZhdWx0LmgnLAorICAgICAgICAndHJhY2tfZGVmYXVsdF9saXN0LmgnLAorICAgICAgICAndHJhY2tfZXZlbnQuaCcsCiAgICAgICAgICd0cmFuc2l0aW9uX2V2ZW50LmgnLAogICAgICAgICAndHlwZWRfYXJyYXkuaCcsCiAgICAgICAgICd1aV9ldmVudC5jYycsCkBAIC0yNDksNiArMjUxLDggQEAKICAgICAgICAgJ3VybF9yZWdpc3RyeS5oJywKICAgICAgICAgJ3VybF91dGlscy5jYycsCiAgICAgICAgICd1cmxfdXRpbHMuaCcsCisgICAgICAgICd2aWRlb190cmFjay5oJywKKyAgICAgICAgJ3ZpZGVvX3RyYWNrX2xpc3QuaCcsCiAgICAgICAgICd3aW5kb3cuY2MnLAogICAgICAgICAnd2luZG93LmgnLAogICAgICAgICAnd2luZG93X3RpbWVycy5jYycsCkBAIC0yNTksMTkgKzI2Myw2MCBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXJfYmluZGluZ3NfZ2VuLmd5cDpnZW5lcmF0ZWRfZGljdGlvbmFyaWVzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9jc3AvY3NwLmd5cDpjc3AnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Nzc29tL2Nzc29tLmd5cDpjc3NvbScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uZ3lwOmRvbV9leGNlcHRpb24nLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwOmxvYWRlcicsCi0gICAgICAgICc8KERFUFRIKS9jb2JhbHQvbWVkaWEvbWVkaWEuZ3lwOm1lZGlhJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uZ3lwOm1lZGlhX3Nlc3Npb24nLAogICAgICAgICAjIEludGVyZmFjZSBsYXllciB0byBhdm9pZCBkaXJlY3RseSBkZXBlbmRpbmcgb24gbmV0d29yay4KICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9uZXR3b3JrX2JyaWRnZS9uZXR3b3JrX2JyaWRnZS5neXA6bmV0d29ya19icmlkZ2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3NjcmlwdC9zY3JpcHQuZ3lwOnNjcmlwdCcsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlLmd5cDpzdG9yYWdlJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuZ3lwOnN5c3RlbV93aW5kb3cnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3dlYl9hbmltYXRpb25zL3dlYl9hbmltYXRpb25zLmd5cDp3ZWJfYW5pbWF0aW9ucycsCiAgICAgICAgICc8KERFUFRIKS9nb29nbGV1cmwvZ29vZ2xldXJsLmd5cDpnb29nbGV1cmwnLAogICAgICAgICAnPChERVBUSCkvbmIvbmIuZ3lwOm5iJywKICAgICAgIF0sCisgICAgICAnY29uZGl0aW9ucyc6IFsKKyAgICAgICAgWydjb2JhbHRfbWVkaWFfc291cmNlXzIwMTY9PTEnLCB7CisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAnbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5jYycsCisgICAgICAgICAgICAnbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5oJywKKyAgICAgICAgICAgICdtZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlci5jYycsCisgICAgICAgICAgICAnbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXIuaCcsCisgICAgICAgICAgICAnbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXJfbGlzdC5jYycsCisgICAgICAgICAgICAnbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXJfbGlzdC5oJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhL21lZGlhMi5neXA6bWVkaWEyJywKKyAgICAgICAgICBdLAorICAgICAgICB9LCB7CisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAnbWVkaWFfc291cmNlLmNjJywKKyAgICAgICAgICAgICdtZWRpYV9zb3VyY2UuaCcsCisgICAgICAgICAgICAnc291cmNlX2J1ZmZlci5jYycsCisgICAgICAgICAgICAnc291cmNlX2J1ZmZlci5oJywKKyAgICAgICAgICAgICdzb3VyY2VfYnVmZmVyX2xpc3QuY2MnLAorICAgICAgICAgICAgJ3NvdXJjZV9idWZmZXJfbGlzdC5oJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhL21lZGlhLmd5cDptZWRpYScsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICBdLAorICAgICAgIyBUaGlzIHRhcmdldCBkb2Vzbid0IGdlbmVyYXRlIGFueSBoZWFkZXJzLCBidXQgaXQgZXhwb3NlcyBnZW5lcmF0ZWQKKyAgICAgICMgaGVhZGVyIGZpbGVzIChmb3IgaWRsIGRpY3Rpb25hcmllcykgdGhyb3VnaCB0aGlzIG1vZHVsZSdzIHB1YmxpYyBoZWFkZXIKKyAgICAgICMgZmlsZXMuIFNvIG1hcmsgdGhpcyB0YXJnZXQgYXMgYSBoYXJkIGRlcGVuZGVuY3kgdG8gZW5zdXJlIHRoYXQgYW55CisgICAgICAjIGRlcGVuZGVudCB0YXJnZXRzIHdhaXQgdW50aWwgdGhpcyB0YXJnZXQgKGFuZCBpdHMgaGFyZCBkZXBlbmRlbmNpZXMpIGFyZQorICAgICAgIyBidWlsdC4KKyAgICAgICdoYXJkX2RlcGVuZGVuY3knOiAxLAorICAgICAgJ2V4cG9ydF9kZXBlbmRlbnRfc2V0dGluZ3MnOiBbCisgICAgICAgICMgQWRkaXRpb25hbGx5LCBlbnN1cmUgdGhhdCB0aGUgaW5jbHVkZSBkaXJlY3RvcmllcyBmb3IgZ2VuZXJhdGVkCisgICAgICAgICMgaGVhZGVycyBhcmUgcHV0IG9uIHRoZSBpbmNsdWRlIGRpcmVjdG9yaWVzIGZvciB0YXJnZXRzIHRoYXQgZGVwZW5kCisgICAgICAgICMgb24gdGhpcyBvbmUuCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyX2JpbmRpbmdzX2dlbi5neXA6Z2VuZXJhdGVkX2RpY3Rpb25hcmllcycsCisgICAgICBdCiAgICAgfSwKIAogICAgIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9hbmltYXRhYmxlLmNjIGIvc3JjL2NvYmFsdC9kb20vZG9tX2FuaW1hdGFibGUuY2MKaW5kZXggMWRjMGY1NS4uYjNiM2IxZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX2FuaW1hdGFibGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX2FuaW1hdGFibGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fYW5pbWF0YWJsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fYW5pbWF0YWJsZS5oIGIvc3JjL2NvYmFsdC9kb20vZG9tX2FuaW1hdGFibGUuaAppbmRleCA4Yzg0MmUxLi5lMTJlNjNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21fYW5pbWF0YWJsZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9hbmltYXRhYmxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRE9NX0FOSU1BVEFCTEVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9ET01fQU5JTUFUQUJMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uY2MKaW5kZXggN2I0ZTFjOS4uMzc4NWU1YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgogCkBAIC02MiwxNCArNjAsMjAgQEAKIC8vIHN0YXRpYwogdm9pZCBET01FeGNlcHRpb246OlJhaXNlKEV4Y2VwdGlvbkNvZGUgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKLSAgZXhjZXB0aW9uX3N0YXRlLT5TZXRFeGNlcHRpb24obWFrZV9zY29wZWRfcmVmcHRyKG5ldyBET01FeGNlcHRpb24oY29kZSkpKTsKKyAgRENIRUNLKGV4Y2VwdGlvbl9zdGF0ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldEV4Y2VwdGlvbihtYWtlX3Njb3BlZF9yZWZwdHIobmV3IERPTUV4Y2VwdGlvbihjb2RlKSkpOworICB9CiB9CiAKIC8vIHN0YXRpYwogdm9pZCBET01FeGNlcHRpb246OlJhaXNlKEV4Y2VwdGlvbkNvZGUgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7Ci0gIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0RXhjZXB0aW9uKAotICAgICAgbWFrZV9zY29wZWRfcmVmcHRyKG5ldyBET01FeGNlcHRpb24oY29kZSwgbWVzc2FnZSkpKTsKKyAgRENIRUNLKGV4Y2VwdGlvbl9zdGF0ZSk7CisgIGlmIChleGNlcHRpb25fc3RhdGUpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldEV4Y2VwdGlvbigKKyAgICAgICAgbWFrZV9zY29wZWRfcmVmcHRyKG5ldyBET01FeGNlcHRpb24oY29kZSwgbWVzc2FnZSkpKTsKKyAgfQogfQogCiB9ICAvLyBuYW1lc3BhY2UgZG9tCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmggYi9zcmMvY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmgKaW5kZXggZTNhODA0NS4uMWM5ZWY5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9ET01fRVhDRVBUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fRE9NX0VYQ0VQVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5pZGwgYi9zcmMvY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YzY2ZmI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5pZGwKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNpZGwtRE9NRXhjZXB0aW9uCisKK2V4Y2VwdGlvbiBET01FeGNlcHRpb24geworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgY29kZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBuYW1lOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1lc3NhZ2U7CisKKyAgLy8gTGlzdCBvZiBleGNlcHRpb25zIGFuZCBjb2RlcyBmb3VuZCBoZXJlOgorICAvLyAgIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jaWRsLURPTUV4Y2VwdGlvbi1lcnJvci1uYW1lcworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBJTkRFWF9TSVpFX0VSUiA9IDE7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5PVF9GT1VORF9FUlIgPSA4OworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOT1RfU1VQUE9SVEVEX0VSUiA9IDk7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IElOVkFMSURfU1RBVEVfRVJSID0gMTE7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFNZTlRBWF9FUlIgPSAxMjsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgSU5WQUxJRF9BQ0NFU1NfRVJSID0gMTU7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFFVT1RBX0VYQ0VFREVEX0VSUiA9IDIyOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9pbXBsZW1lbnRhdGlvbi5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9pbXBsZW1lbnRhdGlvbi5jYwppbmRleCBkZTljZDQ0Li5lN2M3M2M3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21faW1wbGVtZW50YXRpb24uY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9pbXBsZW1lbnRhdGlvbi5oIGIvc3JjL2NvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmgKaW5kZXggNjU0YWY3MS4uNjZhMDRmNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRE9NX0lNUExFTUVOVEFUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fRE9NX0lNUExFTUVOVEFUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21faW1wbGVtZW50YXRpb24uaWRsIGIvc3JjL2NvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MjY5NWI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNkb21pbXBsZW1lbnRhdGlvbgorCitbQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXQoraW50ZXJmYWNlIERPTUltcGxlbWVudGF0aW9uIHsKKyAgW05ld09iamVjdF0gWE1MRG9jdW1lbnQgY3JlYXRlRG9jdW1lbnQoRE9NU3RyaW5nPyBuYW1lc3BhY2VOYW1lLCBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIERPTVN0cmluZyBxdWFsaWZpZWROYW1lLCBvcHRpb25hbCBEb2N1bWVudFR5cGU/IGRvY3R5cGUgPSBudWxsKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21faW1wbGVtZW50YXRpb25fdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9pbXBsZW1lbnRhdGlvbl90ZXN0LmNjCmluZGV4IGZmMTM3ZWQuLjViMGE3YmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9pbXBsZW1lbnRhdGlvbl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9pbXBsZW1lbnRhdGlvbl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2ltcGxlbWVudGF0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9wYXJzZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9kb21fcGFyc2VyLmNjCmluZGV4IGU3YzhjZDQuLjI2ZGEzY2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9wYXJzZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3BhcnNlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9wYXJzZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX3BhcnNlci5oIGIvc3JjL2NvYmFsdC9kb20vZG9tX3BhcnNlci5oCmluZGV4IDk3NTA5N2EuLjVjMzNkZjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9wYXJzZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS9kb21fcGFyc2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRE9NX1BBUlNFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0RPTV9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9wYXJzZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vZG9tX3BhcnNlci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVmNmYwYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9wYXJzZXIuaWRsCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tUGFyc2luZy8jdGhlLWRvbXBhcnNlci1pbnRlcmZhY2UKKworZW51bSBTdXBwb3J0ZWRUeXBlIHsKKyAgICAidGV4dC9odG1sIiwKKyAgICAidGV4dC94bWwiLAorICAgICJhcHBsaWNhdGlvbi94bWwiLAorICAgICJhcHBsaWNhdGlvbi94aHRtbCt4bWwiLAorICAgICJpbWFnZS9zdmcreG1sIgorfTsKKworWworICBDb25zdHJ1Y3RvciwKKyAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzCitdIGludGVyZmFjZSBET01QYXJzZXIgeworICBbTmV3T2JqZWN0XSBEb2N1bWVudCBwYXJzZUZyb21TdHJpbmcoRE9NU3RyaW5nIHN0ciwgU3VwcG9ydGVkVHlwZSB0eXBlKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fcGFyc2VyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9kb21fcGFyc2VyX3Rlc3QuY2MKaW5kZXggZmUwMzdlMS4uYTljZjUxMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX3BhcnNlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9wYXJzZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0LmggYi9zcmMvY29iYWx0L2RvbS9kb21fcmVjdC5oCmluZGV4IDgwM2M4YjguLjg5MWEyMzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3JlY3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9ET01fUkVDVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0RPTV9SRUNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fcmVjdC5pZGwgYi9zcmMvY29iYWx0L2RvbS9kb21fcmVjdC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDRkYWYwYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0LmlkbApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZ2VvbWV0cnktMS8jRE9NUmVjdAorCitbCisgIENvbnN0cnVjdG9yKCksCisgIENvbnN0cnVjdG9yKHVucmVzdHJpY3RlZCBkb3VibGUgeCksCisgIENvbnN0cnVjdG9yKHVucmVzdHJpY3RlZCBkb3VibGUgeCwgdW5yZXN0cmljdGVkIGRvdWJsZSB5KSwKKyAgQ29uc3RydWN0b3IodW5yZXN0cmljdGVkIGRvdWJsZSB4LCB1bnJlc3RyaWN0ZWQgZG91YmxlIHksCisgICAgICAgICAgICAgIHVucmVzdHJpY3RlZCBkb3VibGUgd2lkdGgpLAorICBDb25zdHJ1Y3Rvcih1bnJlc3RyaWN0ZWQgZG91YmxlIHgsIHVucmVzdHJpY3RlZCBkb3VibGUgeSwKKyAgICAgICAgICAgICAgdW5yZXN0cmljdGVkIGRvdWJsZSB3aWR0aCwgdW5yZXN0cmljdGVkIGRvdWJsZSBoZWlnaHQpCitdCitpbnRlcmZhY2UgRE9NUmVjdCA6IERPTVJlY3RSZWFkT25seSB7CisgIGluaGVyaXQgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgeDsKKyAgaW5oZXJpdCBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSB5OworICBpbmhlcml0IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIHdpZHRoOworICBpbmhlcml0IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIGhlaWdodDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fcmVjdF9saXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vZG9tX3JlY3RfbGlzdC5jYwppbmRleCBkOTBiZDRjLi40ODFjOGQzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21fcmVjdF9saXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X2xpc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fcmVjdF9saXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X2xpc3QuaCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X2xpc3QuaAppbmRleCBhNjg4NGJjLi40ODBkM2Y5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21fcmVjdF9saXN0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3JlY3RfbGlzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0RPTV9SRUNUX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9ET01fUkVDVF9MSVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fcmVjdF9saXN0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X2xpc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA4Zjc3MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9kb21fcmVjdF9saXN0LmlkbApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZ2VvbWV0cnktMS8jRE9NUmVjdExpc3QKKworW05vSW50ZXJmYWNlT2JqZWN0LAorIEFycmF5Q2xhc3NdCitpbnRlcmZhY2UgRE9NUmVjdExpc3QgeworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIGdldHRlciBET01SZWN0PyBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X2xpc3RfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X2xpc3RfdGVzdC5jYwppbmRleCA4MjZkMDM5Li5hMTkwMzhjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21fcmVjdF9saXN0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3JlY3RfbGlzdF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3JlY3RfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fcmVjdF9yZWFkX29ubHkuaCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X3JlYWRfb25seS5oCmluZGV4IDQxNmU4MjEuLjcwZWI5NGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X3JlYWRfb25seS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X3JlYWRfb25seS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0RPTV9SRUNUX1JFQURfT05MWV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0RPTV9SRUNUX1JFQURfT05MWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX3JlY3RfcmVhZF9vbmx5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X3JlYWRfb25seS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWE0MjcxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9yZWN0X3JlYWRfb25seS5pZGwKQEAgLTAsMCArMSwzMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2dlb21ldHJ5LTEvI2RvbS1kb21yZWN0cmVhZG9ubHkKKworWworICBDb25zdHJ1Y3Rvcih1bnJlc3RyaWN0ZWQgZG91YmxlIHgsIHVucmVzdHJpY3RlZCBkb3VibGUgeSwKKyAgICAgICAgICAgICAgdW5yZXN0cmljdGVkIGRvdWJsZSB3aWR0aCwgdW5yZXN0cmljdGVkIGRvdWJsZSBoZWlnaHQpCitdCitpbnRlcmZhY2UgRE9NUmVjdFJlYWRPbmx5IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgeDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgeTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgd2lkdGg7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIGhlaWdodDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgdG9wOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSByaWdodDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgYm90dG9tOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSBsZWZ0OworfTsKKwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX3NldHRpbmdzLmNjIGIvc3JjL2NvYmFsdC9kb20vZG9tX3NldHRpbmdzLmNjCmluZGV4IDM2OGQ2MTUuLjY5Y2M4ZTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5jYworKysgYi9zcmMvY29iYWx0L2RvbS9kb21fc2V0dGluZ3MuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fc2V0dGluZ3MuaCIKIApAQCAtMjgsNyArMjYsOSBAQAogICAgIE1lZGlhU291cmNlOjpSZWdpc3RyeSogbWVkaWFfc291cmNlX3JlZ2lzdHJ5LCBCbG9iOjpSZWdpc3RyeSogYmxvYl9yZWdpc3RyeSwKICAgICBtZWRpYTo6Q2FuUGxheVR5cGVIYW5kbGVyKiBjYW5fcGxheV90eXBlX2hhbmRsZXIsCiAgICAgc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lKiBlbmdpbmUsCi0gICAgc2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50LCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCwKKyAgICBNdXRhdGlvbk9ic2VydmVyVGFza01hbmFnZXIqIG11dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlciwKKyAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQogICAgIDogbWF4X2RvbV9lbGVtZW50X2RlcHRoXyhtYXhfZG9tX2VsZW1lbnRfZGVwdGgpLAogICAgICAgbWljcm9waG9uZV9vcHRpb25zXyhvcHRpb25zLm1pY3JvcGhvbmVfb3B0aW9ucyksCiAgICAgICBmZXRjaGVyX2ZhY3RvcnlfKGZldGNoZXJfZmFjdG9yeSksCkBAIC00MSw3ICs0MSw4IEBACiAgICAgICBibG9iX3JlZ2lzdHJ5XyhibG9iX3JlZ2lzdHJ5KSwKICAgICAgIGNhbl9wbGF5X3R5cGVfaGFuZGxlcl8oY2FuX3BsYXlfdHlwZV9oYW5kbGVyKSwKICAgICAgIGphdmFzY3JpcHRfZW5naW5lXyhlbmdpbmUpLAotICAgICAgZ2xvYmFsX2Vudmlyb25tZW50XyhnbG9iYWxfZW52aXJvbm1lbnQpIHsKKyAgICAgIGdsb2JhbF9lbnZpcm9ubWVudF8oZ2xvYmFsX2Vudmlyb25tZW50KSwKKyAgICAgIG11dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlcl8obXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyKSB7CiAgIGlmIChhcnJheV9idWZmZXJfYWxsb2NhdG9yXykgewogICAgIERDSEVDSyhvcHRpb25zLmFycmF5X2J1ZmZlcl9jYWNoZSk7CiAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fc2V0dGluZ3MuaCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oCmluZGV4IGIwZmM0MWYuLmRkYzk4ZDkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0RPTV9TRVRUSU5HU19IXwogI2RlZmluZSBDT0JBTFRfRE9NX0RPTV9TRVRUSU5HU19IXwpAQCAtMjIsNiArMjAsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ibG9iLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vd2luZG93LmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Nhbl9wbGF5X3R5cGVfaGFuZGxlci5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuaCIKQEAgLTczLDYgKzcyLDcgQEAKICAgICAgICAgICAgICAgbWVkaWE6OkNhblBsYXlUeXBlSGFuZGxlciogY2FuX3BsYXlfdHlwZV9oYW5kbGVyLAogICAgICAgICAgICAgICBzY3JpcHQ6OkphdmFTY3JpcHRFbmdpbmUqIGVuZ2luZSwKICAgICAgICAgICAgICAgc2NyaXB0OjpHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50X3Byb3h5LAorICAgICAgICAgICAgICBNdXRhdGlvbk9ic2VydmVyVGFza01hbmFnZXIqIG11dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlciwKICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyA9IE9wdGlvbnMoKSk7CiAgIH5ET01TZXR0aW5ncygpIE9WRVJSSURFOwogCkBAIC0xMTEsNiArMTExLDkgQEAKICAgbWVkaWE6OkNhblBsYXlUeXBlSGFuZGxlciogY2FuX3BsYXlfdHlwZV9oYW5kbGVyKCkgY29uc3QgewogICAgIHJldHVybiBjYW5fcGxheV90eXBlX2hhbmRsZXJfOwogICB9CisgIE11dGF0aW9uT2JzZXJ2ZXJUYXNrTWFuYWdlciogbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyKCkgY29uc3QgeworICAgIHJldHVybiBtdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXJfOworICB9CiAgIEJsb2I6OlJlZ2lzdHJ5KiBibG9iX3JlZ2lzdHJ5KCkgY29uc3QgeyByZXR1cm4gYmxvYl9yZWdpc3RyeV87IH0KIAogICAvLyBBbiBhYnNvbHV0ZSBVUkwgdXNlZCB0byByZXNvbHZlIHJlbGF0aXZlIFVSTHMuCkBAIC0xMzAsNiArMTMzLDcgQEAKICAgbWVkaWE6OkNhblBsYXlUeXBlSGFuZGxlciogY2FuX3BsYXlfdHlwZV9oYW5kbGVyXzsKICAgc2NyaXB0OjpKYXZhU2NyaXB0RW5naW5lKiBqYXZhc2NyaXB0X2VuZ2luZV87CiAgIHNjcmlwdDo6R2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudF87CisgIE11dGF0aW9uT2JzZXJ2ZXJUYXNrTWFuYWdlciogbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyXzsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oRE9NU2V0dGluZ3MpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9zdGF0X3RyYWNrZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9kb21fc3RhdF90cmFja2VyLmNjCmluZGV4IDgzZGNkMzguLmNhZGYwOWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9zdGF0X3RyYWNrZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3N0YXRfdHJhY2tlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9zdGF0X3RyYWNrZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX3N0YXRfdHJhY2tlci5oIGIvc3JjL2NvYmFsdC9kb20vZG9tX3N0YXRfdHJhY2tlci5oCmluZGV4IDIzZDhiY2QuLjZlMzRhYjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9zdGF0X3RyYWNrZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS9kb21fc3RhdF90cmFja2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRE9NX1NUQVRfVFJBQ0tFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0RPTV9TVEFUX1RSQUNLRVJfSF8KQEAgLTMwLDYgKzI4LDcgQEAKIGNsYXNzIERvbVN0YXRUcmFja2VyIDogcHVibGljIGJhc2U6OlN0b3BXYXRjaE93bmVyIHsKICBwdWJsaWM6CiAgIGVudW0gU3RvcFdhdGNoVHlwZSB7CisgICAga1N0b3BXYXRjaFR5cGVSdW5BbmltYXRpb25GcmFtZUNhbGxiYWNrcywKICAgICBrU3RvcFdhdGNoVHlwZVVwZGF0ZUNvbXB1dGVkU3R5bGUsCiAgICAga1N0b3BXYXRjaFR5cGVFdmVudFZpZGVvU3RhcnREZWxheSwKICAgICBrTnVtU3RvcFdhdGNoVHlwZXMsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fc3RyaW5nX21hcC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9zdHJpbmdfbWFwLmNjCmluZGV4IGM3ZjgyOTAuLjgxMWYxNDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV9zdHJpbmdfbWFwLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9zdHJpbmdfbWFwLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3N0cmluZ19tYXAuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX3N0cmluZ19tYXAuaCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9zdHJpbmdfbWFwLmgKaW5kZXggYTFkMGU1Yi4uYWMzOGIyZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX3N0cmluZ19tYXAuaAorKysgYi9zcmMvY29iYWx0L2RvbS9kb21fc3RyaW5nX21hcC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0RPTV9TVFJJTkdfTUFQX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fRE9NX1NUUklOR19NQVBfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV9zdHJpbmdfbWFwLmlkbCBiL3NyYy9jb2JhbHQvZG9tL2RvbV9zdHJpbmdfbWFwLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NmMxMWY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3N0cmluZ19tYXAuaWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9pbmZyYXN0cnVjdHVyZS5odG1sI2RvbXN0cmluZ21hcAorCitbT3ZlcnJpZGVCdWlsdGluc10KK2ludGVyZmFjZSBET01TdHJpbmdNYXAgeworICBbUmFpc2VzRXhjZXB0aW9uXSBnZXR0ZXIgRE9NU3RyaW5nPyAoRE9NU3RyaW5nIG5hbWUpOworICBbUmFpc2VzRXhjZXB0aW9uXSBzZXR0ZXIgY3JlYXRvciB2b2lkIChET01TdHJpbmcgbmFtZSwgRE9NU3RyaW5nIHZhbHVlKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fc3RyaW5nX21hcF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vZG9tX3N0cmluZ19tYXBfdGVzdC5jYwppbmRleCAzNjVjOWE4Li5iYjU1OTlhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9kb21fc3RyaW5nX21hcF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV9zdHJpbmdfbWFwX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fc3RyaW5nX21hcC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9kb21fdG9rZW5fbGlzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0LmNjCmluZGV4IGZhMTIwYmMuLjE4ZTJkYWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3Rva2VuX2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZG9tX3Rva2VuX2xpc3QuaCBiL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0LmgKaW5kZXggYWJlZDEwMi4uNDBlOGEzMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZG9tX3Rva2VuX2xpc3QuaAorKysgYi9zcmMvY29iYWx0L2RvbS9kb21fdG9rZW5fbGlzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0RPTV9UT0tFTl9MSVNUX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fRE9NX1RPS0VOX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjFiYTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3Rva2VuX2xpc3QuaWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2RvbXRva2VubGlzdAorCitbQWRkT3BhcXVlUm9vdHM9KGVsZW1lbnQpXQoraW50ZXJmYWNlIERPTVRva2VuTGlzdCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIERPTVN0cmluZz8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgYm9vbGVhbiBjb250YWlucyhET01TdHJpbmcgdG9rZW4pOworICB2b2lkIGFkZChET01TdHJpbmcuLi4gdG9rZW5zKTsKKyAgdm9pZCByZW1vdmUoRE9NU3RyaW5nLi4uIHRva2Vucyk7CisgIHN0cmluZ2lmaWVyOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9kb21fdG9rZW5fbGlzdF90ZXN0LmNjCmluZGV4IDcwZTIyNGMuLmU3ZmU1NTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZG9tX3Rva2VuX2xpc3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV90b2tlbl9saXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9lbGVtZW50LmNjCmluZGV4IDhlZGRiNTMuLmE4ZWQ5YTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5oCmluZGV4IDJjMzNhMWUuLmVkMWIyODggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOThhNzdhMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMzEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2VsZW1lbnQKKworaW50ZXJmYWNlIEVsZW1lbnQgOiBOb2RlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB0YWdOYW1lOworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGlkOworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGNsYXNzTmFtZTsKKyAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01Ub2tlbkxpc3QgY2xhc3NMaXN0OworICAvLyBUT0RPOiBDaGFuZ2UgdG8gQXR0cltdIHdoZW4gYmluZGluZ3MgZm9yIGFycmF5IGFyZSBpbXBsZW1lbnRlZCBhbmQKKyAgLy8gcmVtb3ZlIE5hbWVkTm9kZU1hcCwgd2hpY2ggaXMgYSBkZXByZWNhdGVkIGludGVyZmFjZS4KKyAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBOYW1lZE5vZGVNYXAgYXR0cmlidXRlczsKKyAgRE9NU3RyaW5nPyBnZXRBdHRyaWJ1dGUoRE9NU3RyaW5nIG5hbWUpOworICB2b2lkIHNldEF0dHJpYnV0ZShET01TdHJpbmcgbmFtZSwgRE9NU3RyaW5nIHZhbHVlKTsKKyAgdm9pZCByZW1vdmVBdHRyaWJ1dGUoRE9NU3RyaW5nIG5hbWUpOworICBib29sZWFuIGhhc0F0dHJpYnV0ZShET01TdHJpbmcgbmFtZSk7CisgIEhUTUxDb2xsZWN0aW9uIGdldEVsZW1lbnRzQnlUYWdOYW1lKERPTVN0cmluZyBsb2NhbE5hbWUpOworICBIVE1MQ29sbGVjdGlvbiBnZXRFbGVtZW50c0J5Q2xhc3NOYW1lKERPTVN0cmluZyBjbGFzc05hbWVzKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbGVtZW50X2Nzc19pbmxpbmVfc3R5bGUuaWRsIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudF9jc3NfaW5saW5lX3N0eWxlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTI2ZDc5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudF9jc3NfaW5saW5lX3N0eWxlLmlkbApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS0yMDEzMTIwNS8jZWxlbWVudGNzc2lubGluZXN0eWxlCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBFbGVtZW50Q1NTSW5saW5lU3R5bGUgeworICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIENTU1N0eWxlRGVjbGFyYXRpb24gc3R5bGU7Cit9OworCitIVE1MRWxlbWVudCBpbXBsZW1lbnRzIEVsZW1lbnRDU1NJbmxpbmVTdHlsZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnRfY3Nzb21fdmlldy5pZGwgYi9zcmMvY29iYWx0L2RvbS9lbGVtZW50X2Nzc29tX3ZpZXcuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiN2JmY2QKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbGVtZW50X2Nzc29tX3ZpZXcuaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLXZpZXctMjAxMzEyMTcvI2V4dGVuc2lvbnMtdG8tdGhlLWVsZW1lbnQtaW50ZXJmYWNlCisKK3BhcnRpYWwgaW50ZXJmYWNlIEVsZW1lbnQgeworICBET01SZWN0TGlzdCBnZXRDbGllbnRSZWN0cygpOworICBET01SZWN0IGdldEJvdW5kaW5nQ2xpZW50UmVjdCgpOworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGNsaWVudFRvcDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBjbGllbnRMZWZ0OworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGNsaWVudFdpZHRoOworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGNsaWVudEhlaWdodDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9lbGVtZW50X2RvbV9wYXJzaW5nX2FuZF9zZXJpYWxpemF0aW9uLmlkbCBiL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnRfZG9tX3BhcnNpbmdfYW5kX3NlcmlhbGl6YXRpb24uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUwZWQxNDAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9lbGVtZW50X2RvbV9wYXJzaW5nX2FuZF9zZXJpYWxpemF0aW9uLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLVBhcnNpbmcvI2V4dGVuc2lvbnMtdG8tdGhlLWVsZW1lbnQtaW50ZXJmYWNlCisKK3BhcnRpYWwgaW50ZXJmYWNlIEVsZW1lbnQgeworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmddIGF0dHJpYnV0ZSBET01TdHJpbmcgaW5uZXJIVE1MOworICBbVHJlYXROdWxsQXM9RW1wdHlTdHJpbmcsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBvdXRlckhUTUw7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZWxlbWVudF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vZWxlbWVudF90ZXN0LmNjCmluZGV4IGQ0YTM3MjQuLjdjOTI3ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2VsZW1lbnRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9lbGVtZW50X3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9lbGVtZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vZXZlbnQuY2MKaW5kZXggMWU5MDRhZi4uM2FhYzBhZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZXZlbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ldmVudC5oIGIvc3JjL2NvYmFsdC9kb20vZXZlbnQuaAppbmRleCA4NmE5M2FjLi45N2RhZWFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vZXZlbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkZmQ3NDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudC5pZGwKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jZXZlbnQKKworW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlKV0KK2ludGVyZmFjZSBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdHlwZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEV2ZW50VGFyZ2V0PyB0YXJnZXQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBFdmVudFRhcmdldD8gY3VycmVudFRhcmdldDsKKworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBOT05FID0gMDsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ0FQVFVSSU5HX1BIQVNFID0gMTsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgQVRfVEFSR0VUID0gMjsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgQlVCQkxJTkdfUEhBU0UgPSAzOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgZXZlbnRQaGFzZTsKKworICB2b2lkIHN0b3BQcm9wYWdhdGlvbigpOworICB2b2lkIHN0b3BJbW1lZGlhdGVQcm9wYWdhdGlvbigpOworCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIGJ1YmJsZXM7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIGNhbmNlbGFibGU7CisgIHZvaWQgcHJldmVudERlZmF1bHQoKTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gZGVmYXVsdFByZXZlbnRlZDsKKworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NVGltZVN0YW1wIHRpbWVTdGFtcDsKKworICB2b2lkIGluaXRFdmVudChET01TdHJpbmcgdHlwZSwgYm9vbGVhbiBidWJibGVzLCBib29sZWFuIGNhbmNlbGFibGUpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmNjIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuY2MKaW5kZXggNGQ5OTU5ZS4uZDUzYjhkYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5oIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuaAppbmRleCA1MDA2YjI4Li43YmVhYjJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X2xpc3RlbmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRVZFTlRfTElTVEVORVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9FVkVOVF9MSVNURU5FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfbGlzdGVuZXIuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRmZjFjMjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jZXZlbnRsaXN0ZW5lcgorCitjYWxsYmFjayBpbnRlcmZhY2UgRXZlbnRMaXN0ZW5lciB7CisgIC8vIFRPRE86IEJlY2F1c2UgdGhlIEV2ZW50SGFuZGxlciB0eXBlIGlzIHR5cGVkZWYnZCBhcyBhIG51bGxhYmxlCisgIC8vIEV2ZW50TGlzdGVuZXIsIHdlIG5lZWQgdG8gYWxsb3cgdGhlIHJldHVybiBvZiBhIGJvb2xlYW4gdmFsdWUuIFRoZSB2YWx1ZQorICAvLyBvZiB0aGlzIHdpbGwgb25seSBiZSBjaGVja2VkIGlmIHRoZSBFdmVudExpc3RlbmVyIHdhcyBhZGRlZCBhcyBhbgorICAvLyBhdHRyaWJ1dGUgKG5vdCB0aHJvdWdoIGFkZEV2ZW50TGlzdGVuZXIpLgorICBib29sZWFuPyBoYW5kbGVFdmVudChFdmVudCBldmVudCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfcXVldWUuY2MgYi9zcmMvY29iYWx0L2RvbS9ldmVudF9xdWV1ZS5jYwppbmRleCA5OGUwNDNhLi4wMDkwZmI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ldmVudF9xdWV1ZS5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudF9xdWV1ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50X3F1ZXVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3F1ZXVlLmggYi9zcmMvY29iYWx0L2RvbS9ldmVudF9xdWV1ZS5oCmluZGV4IGIzMzAxNWIuLmRkNWNhMGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3F1ZXVlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfcXVldWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9FVkVOVF9RVUVVRV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0VWRU5UX1FVRVVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ldmVudF9xdWV1ZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfcXVldWVfdGVzdC5jYwppbmRleCAzMmFhZGM5Li4wYTQ2ZTI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ldmVudF9xdWV1ZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3F1ZXVlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF9xdWV1ZS5oIgogCkBAIC0zMCw3ICsyOCw3IEBACiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBkb20gewogCi11c2luZyB0ZXN0aW5nOjpGYWtlU2NyaXB0T2JqZWN0OwordXNpbmcgdGVzdGluZzo6RmFrZVNjcmlwdFZhbHVlOwogdXNpbmcgdGVzdGluZzo6TW9ja0V2ZW50TGlzdGVuZXI7CiAKIGNsYXNzIEV2ZW50UXVldWVUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CkBAIC01Nyw3ICs1NSw3IEBACiAgIEV2ZW50UXVldWUgZXZlbnRfcXVldWUoZXZlbnRfdGFyZ2V0LmdldCgpKTsKIAogICBldmVudF90YXJnZXQtPkFkZEV2ZW50TGlzdGVuZXIoImV2ZW50IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWtlU2NyaXB0VmFsdWUoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CiAgIEV4cGVjdEhhbmRsZUV2ZW50Q2FsbFdpdGhFdmVudEFuZFRhcmdldChldmVudF9saXN0ZW5lci5nZXQoKSwgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudF90YXJnZXQpOwogCkBAIC03Myw3ICs3MSw3IEBACiAKICAgZXZlbnQtPnNldF90YXJnZXQoZXZlbnRfdGFyZ2V0KTsKICAgZXZlbnRfdGFyZ2V0LT5BZGRFdmVudExpc3RlbmVyKCJldmVudCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOwogICBFeHBlY3RIYW5kbGVFdmVudENhbGxXaXRoRXZlbnRBbmRUYXJnZXQoZXZlbnRfbGlzdGVuZXIuZ2V0KCksIGV2ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnRfdGFyZ2V0KTsKIApAQCAtODksNyArODcsNyBAQAogCiAgIGV2ZW50LT5zZXRfdGFyZ2V0KGV2ZW50X3RhcmdldCk7CiAgIGV2ZW50X3RhcmdldC0+QWRkRXZlbnRMaXN0ZW5lcigiZXZlbnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKICAgZXZlbnRfbGlzdGVuZXItPkV4cGVjdE5vSGFuZGxlRXZlbnRDYWxsKCk7CiAKICAgZXZlbnRfcXVldWUuRW5xdWV1ZShldmVudCk7CkBAIC0xMTAsNyArMTA4LDcgQEAKIAogICBldmVudC0+c2V0X3RhcmdldChldmVudF90YXJnZXRfMik7CiAgIGV2ZW50X3RhcmdldF8yLT5BZGRFdmVudExpc3RlbmVyKAotICAgICAgImV2ZW50IiwgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKKyAgICAgICJldmVudCIsIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKICAgRXhwZWN0SGFuZGxlRXZlbnRDYWxsV2l0aEV2ZW50QW5kVGFyZ2V0KGV2ZW50X2xpc3RlbmVyLmdldCgpLCBldmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50X3RhcmdldF8yKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmNjIGIvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmNjCmluZGV4IDEzODJmM2QuLjZhNzdmZjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKIApAQCAtMjgsMjEgKzI2LDIxIEBACiBuYW1lc3BhY2UgZG9tIHsKIAogdm9pZCBFdmVudFRhcmdldDo6QWRkRXZlbnRMaXN0ZW5lcihjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2NhcHR1cmUpIHsKICAgLy8gRG8gbm90aGluZyBpZiBsaXN0ZW5lciBpcyBudWxsLgogICBpZiAobGlzdGVuZXIuSXNOdWxsKCkpIHsKICAgICByZXR1cm47CiAgIH0KIAotICBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0OjpSZWZlcmVuY2UgbGlzdGVuZXJfcmVmZXJlbmNlKHRoaXMsIGxpc3RlbmVyKTsKKyAgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOjpSZWZlcmVuY2UgbGlzdGVuZXJfcmVmZXJlbmNlKHRoaXMsIGxpc3RlbmVyKTsKIAogICBBZGRFdmVudExpc3RlbmVySW50ZXJuYWwoYmFzZTo6VG9rZW4odHlwZSksIGxpc3RlbmVyLCB1c2VfY2FwdHVyZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXI6OmtOb3RBdHRyaWJ1dGUpOwogfQogCiB2b2lkIEV2ZW50VGFyZ2V0OjpSZW1vdmVFdmVudExpc3RlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfY2FwdHVyZSkgewogICAvLyBEbyBub3RoaW5nIGlmIGxpc3RlbmVyIGlzIG51bGwuCiAgIGlmIChsaXN0ZW5lci5Jc051bGwoKSkgewpAQCAtNTMsNyArNTEsNyBAQAogICAgICAgIGl0ZXIgIT0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmVuZCgpOyArK2l0ZXIpIHsKICAgICBpZiAoKCppdGVyKS0+bGlzdGVuZXJfdHlwZSA9PSBFdmVudExpc3RlbmVyOjprTm90QXR0cmlidXRlICYmCiAgICAgICAgICgqaXRlciktPnR5cGUgPT0gdHlwZS5jX3N0cigpICYmCi0gICAgICAgICgqaXRlciktPmxpc3RlbmVyLnJlZmVyZW5jZWRfb2JqZWN0KCkuRXF1YWxUbyhsaXN0ZW5lcikgJiYKKyAgICAgICAgKCppdGVyKS0+bGlzdGVuZXIucmVmZXJlbmNlZF92YWx1ZSgpLkVxdWFsVG8obGlzdGVuZXIpICYmCiAgICAgICAgICgqaXRlciktPnVzZV9jYXB0dXJlID09IHVzZV9jYXB0dXJlKSB7CiAgICAgICBldmVudF9saXN0ZW5lcl9pbmZvc18uZXJhc2UoaXRlcik7CiAgICAgICByZXR1cm47CkBAIC0xMTgsNyArMTE2LDcgQEAKIH0KIAogdm9pZCBFdmVudFRhcmdldDo6U2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcigKLSAgICBiYXNlOjpUb2tlbiB0eXBlLCBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lcikgeworICAgIGJhc2U6OlRva2VuIHR5cGUsIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpIHsKICAgLy8gUmVtb3ZlIGV4aXN0aW5nIGF0dHJpYnV0ZSBsaXN0ZW5lciBvZiB0aGUgc2FtZSB0eXBlLgogICBmb3IgKEV2ZW50TGlzdGVuZXJJbmZvczo6aXRlcmF0b3IgaXRlciA9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5iZWdpbigpOwogICAgICAgIGl0ZXIgIT0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmVuZCgpOyArK2l0ZXIpIHsKQEAgLTEzNSwxMyArMTMzLDEzIEBACiAgIEFkZEV2ZW50TGlzdGVuZXJJbnRlcm5hbCh0eXBlLCBsaXN0ZW5lciwgZmFsc2UsIEV2ZW50TGlzdGVuZXI6OmtBdHRyaWJ1dGUpOwogfQogCi1jb25zdCBFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCoKK2NvbnN0IEV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqCiBFdmVudFRhcmdldDo6R2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbiB0eXBlKSBjb25zdCB7CiAgIGZvciAoRXZlbnRMaXN0ZW5lckluZm9zOjpjb25zdF9pdGVyYXRvciBpdGVyID0gZXZlbnRfbGlzdGVuZXJfaW5mb3NfLmJlZ2luKCk7CiAgICAgICAgaXRlciAhPSBldmVudF9saXN0ZW5lcl9pbmZvc18uZW5kKCk7ICsraXRlcikgewogICAgIGlmICgoKml0ZXIpLT5saXN0ZW5lcl90eXBlID09IEV2ZW50TGlzdGVuZXI6OmtBdHRyaWJ1dGUgJiYKICAgICAgICAgKCppdGVyKS0+dHlwZSA9PSB0eXBlKSB7Ci0gICAgICByZXR1cm4gJigqaXRlciktPmxpc3RlbmVyLnJlZmVyZW5jZWRfb2JqZWN0KCk7CisgICAgICByZXR1cm4gJigqaXRlciktPmxpc3RlbmVyLnJlZmVyZW5jZWRfdmFsdWUoKTsKICAgICB9CiAgIH0KICAgcmV0dXJuIE5VTEw7CkBAIC0xNjMsNyArMTYxLDcgQEAKICAgICAgICBpdGVyICE9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5lbmQoKTsgKytpdGVyKSB7CiAgICAgaWYgKCgqaXRlciktPnR5cGUgPT0gZXZlbnQtPnR5cGUoKSkgewogICAgICAgZXZlbnRfbGlzdGVuZXJfaW5mb3MucHVzaF9iYWNrKG5ldyBFdmVudExpc3RlbmVySW5mbygKLSAgICAgICAgICAoKml0ZXIpLT50eXBlLCB0aGlzLCAoKml0ZXIpLT5saXN0ZW5lci5yZWZlcmVuY2VkX29iamVjdCgpLAorICAgICAgICAgICgqaXRlciktPnR5cGUsIHRoaXMsICgqaXRlciktPmxpc3RlbmVyLnJlZmVyZW5jZWRfdmFsdWUoKSwKICAgICAgICAgICAoKml0ZXIpLT51c2VfY2FwdHVyZSwgKCppdGVyKS0+bGlzdGVuZXJfdHlwZSkpOwogICAgIH0KICAgfQpAQCAtMTg5LDcgKzE4Nyw3IEBACiB9CiAKIHZvaWQgRXZlbnRUYXJnZXQ6OkFkZEV2ZW50TGlzdGVuZXJJbnRlcm5hbCgKLSAgICBiYXNlOjpUb2tlbiB0eXBlLCBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lciwKKyAgICBiYXNlOjpUb2tlbiB0eXBlLCBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyLAogICAgIGJvb2wgdXNlX2NhcHR1cmUsIEV2ZW50TGlzdGVuZXI6OlR5cGUgbGlzdGVuZXJfdHlwZSkgewogICBUUkFDS19NRU1PUllfU0NPUEUoIkRPTSIpOwogCkBAIC0xOTgsNyArMTk2LDcgQEAKICAgZm9yIChFdmVudExpc3RlbmVySW5mb3M6Oml0ZXJhdG9yIGl0ZXIgPSBldmVudF9saXN0ZW5lcl9pbmZvc18uYmVnaW4oKTsKICAgICAgICBpdGVyICE9IGV2ZW50X2xpc3RlbmVyX2luZm9zXy5lbmQoKTsgKytpdGVyKSB7CiAgICAgaWYgKCgqaXRlciktPnR5cGUgPT0gdHlwZSAmJgotICAgICAgICAoKml0ZXIpLT5saXN0ZW5lci5yZWZlcmVuY2VkX29iamVjdCgpLkVxdWFsVG8obGlzdGVuZXIpICYmCisgICAgICAgICgqaXRlciktPmxpc3RlbmVyLnJlZmVyZW5jZWRfdmFsdWUoKS5FcXVhbFRvKGxpc3RlbmVyKSAmJgogICAgICAgICAoKml0ZXIpLT51c2VfY2FwdHVyZSA9PSB1c2VfY2FwdHVyZSAmJgogICAgICAgICAoKml0ZXIpLT5saXN0ZW5lcl90eXBlID09IGxpc3RlbmVyX3R5cGUpIHsKICAgICAgIC8vIEF0dHJpYnV0ZSBsaXN0ZW5lcnMgc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlbW92ZWQuCkBAIC0yMTMsNyArMjExLDcgQEAKIAogRXZlbnRUYXJnZXQ6OkV2ZW50TGlzdGVuZXJJbmZvOjpFdmVudExpc3RlbmVySW5mbygKICAgICBiYXNlOjpUb2tlbiB0eXBlLCBFdmVudFRhcmdldCogY29uc3QgZXZlbnRfdGFyZ2V0LAotICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyLCBib29sIHVzZV9jYXB0dXJlLAorICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsIGJvb2wgdXNlX2NhcHR1cmUsCiAgICAgRXZlbnRMaXN0ZW5lcjo6VHlwZSBsaXN0ZW5lcl90eXBlKQogICAgIDogdHlwZSh0eXBlKSwKICAgICAgIGxpc3RlbmVyKGV2ZW50X3RhcmdldCwgbGlzdGVuZXIpLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmggYi9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaAppbmRleCAzZmM0ZGY5Li42ZWM5NDUwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9FVkVOVF9UQVJHRVRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9FVkVOVF9UQVJHRVRfSF8KQEAgLTMwLDcgKzI4LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF9saXN0ZW5lci5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTQ0LDE1ICs0MiwxNSBAQAogY2xhc3MgRXZlbnRUYXJnZXQgOiBwdWJsaWMgc2NyaXB0OjpXcmFwcGFibGUsCiAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBiYXNlOjpTdXBwb3J0c1dlYWtQdHI8RXZlbnRUYXJnZXQ+IHsKICBwdWJsaWM6Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8RXZlbnRMaXN0ZW5lcj4gRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdDsKKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPEV2ZW50TGlzdGVuZXI+IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZTsKIAogICAvLyBXZWIgQVBJOiBFdmVudFRhcmdldAogICAvLwogICB2b2lkIEFkZEV2ZW50TGlzdGVuZXIoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHVzZV9jYXB0dXJlKTsKICAgdm9pZCBSZW1vdmVFdmVudExpc3RlbmVyKGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfY2FwdHVyZSk7CiAgIGJvb2wgRGlzcGF0Y2hFdmVudChjb25zdCBzY29wZWRfcmVmcHRyPEV2ZW50PiYgZXZlbnQsCiAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOwpAQCAtODUsNDkgKzgzLDQ5IEBACiAgIC8vIGV2ZW50IGxpc3RlbmVycyBmb3IgdGhlIG9iamVjdCBvbiB3aGljaCB0aGV5IGFyZSBzcGVjaWZpZWQuCiAgIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNnbG9iYWxldmVudGhhbmRsZXJzCiAgIC8vCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9uYmx1cigpIHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbmJsdXIoKSB7CiAgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpibHVyKCkpOwogICB9Ci0gIHZvaWQgc2V0X29uYmx1cihjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBldmVudF9saXN0ZW5lcikgeworICB2b2lkIHNldF9vbmJsdXIoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgewogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpibHVyKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9uZXJyb3IoKSB7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25lcnJvcigpIHsKICAgICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmVycm9yKCkpOwogICB9Ci0gIHZvaWQgc2V0X29uZXJyb3IoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgZXZlbnRfbGlzdGVuZXIpIHsKKyAgdm9pZCBzZXRfb25lcnJvcihjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKSB7CiAgICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmVycm9yKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9uZm9jdXMoKSB7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25mb2N1cygpIHsKICAgICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmZvY3VzKCkpOwogICB9Ci0gIHZvaWQgc2V0X29uZm9jdXMoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgZXZlbnRfbGlzdGVuZXIpIHsKKyAgdm9pZCBzZXRfb25mb2N1cyhjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKSB7CiAgICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmZvY3VzKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9ubG9hZCgpIHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbmxvYWQoKSB7CiAgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpsb2FkKCkpOwogICB9Ci0gIHZvaWQgc2V0X29ubG9hZChjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBldmVudF9saXN0ZW5lcikgeworICB2b2lkIHNldF9vbmxvYWQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgewogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpsb2FkKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9udW5sb2FkKCkgeworICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9udW5sb2FkKCkgewogICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6dW5sb2FkKCkpOwogICB9Ci0gIHZvaWQgc2V0X29udW5sb2FkKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGV2ZW50X2xpc3RlbmVyKSB7CisgIHZvaWQgc2V0X29udW5sb2FkKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgZXZlbnRfbGlzdGVuZXIpIHsKICAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6dW5sb2FkKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCiAgIC8vIFNldCBhbiBldmVudCBsaXN0ZW5lciBhc3NpZ25lZCBhcyBhbiBhdHRyaWJ1dGUuIE92ZXJ3cml0ZSB0aGUgZXhpc3Rpbmcgb25lCiAgIC8vIGlmIHRoZXJlIGlzIGFueS4KICAgdm9pZCBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2VuIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKTsKIAogICAvLyBHZXQgdGhlIGV2ZW50IGxpc3RlbmVyIGN1cnJlbnRseSBhc3NpZ25lZCB0byBhbiBhdHRyaWJ1dGUsIG9yIE5VTEwgaWYKICAgLy8gdGhlcmUgaXMgbm9uZS4KLSAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCogR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcigKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKAogICAgICAgYmFzZTo6VG9rZW4gdHlwZSkgY29uc3Q7CiAKICAgLy8gc2NyaXB0OjpXcmFwcGFibGUKQEAgLTE0OCwxOSArMTQ2LDE5IEBACiAgcHJpdmF0ZToKICAgc3RydWN0IEV2ZW50TGlzdGVuZXJJbmZvIHsKICAgICBFdmVudExpc3RlbmVySW5mbyhiYXNlOjpUb2tlbiB0eXBlLCBFdmVudFRhcmdldCogY29uc3QgZXZlbnRfdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1c2VfY2FwdHVyZSwgRXZlbnRMaXN0ZW5lcjo6VHlwZSBsaXN0ZW5lcl90eXBlKTsKICAgICB+RXZlbnRMaXN0ZW5lckluZm8oKTsKIAogICAgIGJhc2U6OlRva2VuIHR5cGU7Ci0gICAgc2NyaXB0OjpTY3JpcHRPYmplY3Q8RXZlbnRMaXN0ZW5lcj46OlJlZmVyZW5jZSBsaXN0ZW5lcjsKKyAgICBzY3JpcHQ6OlNjcmlwdFZhbHVlPEV2ZW50TGlzdGVuZXI+OjpSZWZlcmVuY2UgbGlzdGVuZXI7CiAgICAgYm9vbCB1c2VfY2FwdHVyZTsKICAgICBFdmVudExpc3RlbmVyOjpUeXBlIGxpc3RlbmVyX3R5cGU7CiAgIH07CiAgIHR5cGVkZWYgU2NvcGVkVmVjdG9yPEV2ZW50TGlzdGVuZXJJbmZvPiBFdmVudExpc3RlbmVySW5mb3M7CiAKICAgdm9pZCBBZGRFdmVudExpc3RlbmVySW50ZXJuYWwoYmFzZTo6VG9rZW4gdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdXNlX2NhcHR1cmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV2ZW50TGlzdGVuZXI6OlR5cGUgbGlzdGVuZXJfdHlwZSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5pZGwgYi9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2ZTM4NDQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2V2ZW50dGFyZ2V0CisKK2ludGVyZmFjZSBFdmVudFRhcmdldCB7CisgIHZvaWQgYWRkRXZlbnRMaXN0ZW5lcihET01TdHJpbmcgdHlwZSwgRXZlbnRMaXN0ZW5lcj8gbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIHVzZUNhcHR1cmUgPSBmYWxzZSk7CisgIHZvaWQgcmVtb3ZlRXZlbnRMaXN0ZW5lcihET01TdHJpbmcgdHlwZSwgRXZlbnRMaXN0ZW5lcj8gbGlzdGVuZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbCBib29sZWFuIHVzZUNhcHR1cmUgPSBmYWxzZSk7CisKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gYm9vbGVhbiBkaXNwYXRjaEV2ZW50KEV2ZW50IGV2ZW50KTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ldmVudF90YXJnZXRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldF90ZXN0LmNjCmluZGV4IDFhMWZmZTUuLmYwNTVmMDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3RhcmdldF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgiCiAKQEAgLTM4LDcgKzM2LDcgQEAKIHVzaW5nIDo6dGVzdGluZzo6U3RyaWN0TW9jazsKIHVzaW5nIDo6dGVzdGluZzo6XzsKIHVzaW5nIHNjcmlwdDo6dGVzdGluZzo6TW9ja0V4Y2VwdGlvblN0YXRlOwotdXNpbmcgdGVzdGluZzo6RmFrZVNjcmlwdE9iamVjdDsKK3VzaW5nIHRlc3Rpbmc6OkZha2VTY3JpcHRWYWx1ZTsKIHVzaW5nIHRlc3Rpbmc6Ok1vY2tFdmVudExpc3RlbmVyOwogCiBiYXNlOjpvcHRpb25hbDxib29sPiBEaXNwYXRjaEV2ZW50T25DdXJyZW50VGFyZ2V0KApAQCAtNzAsNyArNjgsNyBAQAogCiAgIGV2ZW50X2xpc3RlbmVyLT5FeHBlY3RIYW5kbGVFdmVudENhbGwoZXZlbnQsIGV2ZW50X3RhcmdldCk7CiAgIGV2ZW50X3RhcmdldC0+QWRkRXZlbnRMaXN0ZW5lcigiZmlyZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKICAgRVhQRUNUX1RSVUUoZXZlbnRfdGFyZ2V0LT5EaXNwYXRjaEV2ZW50KGV2ZW50LCAmZXhjZXB0aW9uX3N0YXRlKSk7CiB9CiAKQEAgLTgyLDcgKzgwLDcgQEAKIAogICBldmVudF9saXN0ZW5lci0+RXhwZWN0Tm9IYW5kbGVFdmVudENhbGwoKTsKICAgZXZlbnRfdGFyZ2V0LT5BZGRFdmVudExpc3RlbmVyKCJub3RmaXJlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOwogICBFWFBFQ1RfVFJVRShldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoZXZlbnQsICZleGNlcHRpb25fc3RhdGUpKTsKIH0KIApAQCAtMTA1LDExICsxMDMsMTEgQEAKICAgZXZlbnRfbGlzdGVuZXJub3RfZmlyZWQtPkV4cGVjdE5vSGFuZGxlRXZlbnRDYWxsKCk7CiAKICAgZXZlbnRfdGFyZ2V0LT5BZGRFdmVudExpc3RlbmVyKAotICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lcmZpcmVkXzEuZ2V0KCkpLCBmYWxzZSk7CisgICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0VmFsdWUoZXZlbnRfbGlzdGVuZXJmaXJlZF8xLmdldCgpKSwgZmFsc2UpOwogICBldmVudF90YXJnZXQtPkFkZEV2ZW50TGlzdGVuZXIoCi0gICAgICAibm90ZmlyZWQiLCBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVybm90X2ZpcmVkLmdldCgpKSwgZmFsc2UpOworICAgICAgIm5vdGZpcmVkIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVybm90X2ZpcmVkLmdldCgpKSwgZmFsc2UpOwogICBldmVudF90YXJnZXQtPkFkZEV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyZmlyZWRfMi5nZXQoKSksIHRydWUpOworICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyZmlyZWRfMi5nZXQoKSksIHRydWUpOwogICBFWFBFQ1RfVFJVRShldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoZXZlbnQsICZleGNlcHRpb25fc3RhdGUpKTsKIH0KIApAQCAtMTIyLDE3ICsxMjAsMTcgQEAKIAogICBldmVudF9saXN0ZW5lci0+RXhwZWN0SGFuZGxlRXZlbnRDYWxsKGV2ZW50LCBldmVudF90YXJnZXQpOwogICBldmVudF90YXJnZXQtPkFkZEV2ZW50TGlzdGVuZXIoImZpcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWtlU2NyaXB0VmFsdWUoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CiAgIEVYUEVDVF9UUlVFKGV2ZW50X3RhcmdldC0+RGlzcGF0Y2hFdmVudChldmVudCwgJmV4Y2VwdGlvbl9zdGF0ZSkpOwogCiAgIGV2ZW50X2xpc3RlbmVyLT5FeHBlY3ROb0hhbmRsZUV2ZW50Q2FsbCgpOwogICBldmVudF90YXJnZXQtPlJlbW92ZUV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOworICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOwogICBFWFBFQ1RfVFJVRShldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoZXZlbnQsICZleGNlcHRpb25fc3RhdGUpKTsKIAogICBldmVudF9saXN0ZW5lci0+RXhwZWN0SGFuZGxlRXZlbnRDYWxsKGV2ZW50LCBldmVudF90YXJnZXQpOwogICBldmVudF90YXJnZXQtPkFkZEV2ZW50TGlzdGVuZXIoImZpcmVkIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWtlU2NyaXB0VmFsdWUoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CiAgIEVYUEVDVF9UUlVFKGV2ZW50X3RhcmdldC0+RGlzcGF0Y2hFdmVudChldmVudCwgJmV4Y2VwdGlvbl9zdGF0ZSkpOwogfQogCkBAIC0xNDksMjYgKzE0NywyNiBAQAogICAgICAgTW9ja0V2ZW50TGlzdGVuZXI6OkNyZWF0ZSgpOwogCiAgIGV2ZW50X3RhcmdldC0+QWRkRXZlbnRMaXN0ZW5lcigKLSAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRPYmplY3Qobm9uX2F0dHJpYnV0ZV9ldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKKyAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRWYWx1ZShub25fYXR0cmlidXRlX2V2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOwogCiAgIG5vbl9hdHRyaWJ1dGVfZXZlbnRfbGlzdGVuZXItPkV4cGVjdEhhbmRsZUV2ZW50Q2FsbChldmVudCwgZXZlbnRfdGFyZ2V0KTsKICAgYXR0cmlidXRlX2V2ZW50X2xpc3RlbmVyMS0+RXhwZWN0SGFuZGxlRXZlbnRDYWxsKGV2ZW50LCBldmVudF90YXJnZXQpOwogICBldmVudF90YXJnZXQtPlNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoCi0gICAgICBiYXNlOjpUb2tlbigiZmlyZWQiKSwgRmFrZVNjcmlwdE9iamVjdChhdHRyaWJ1dGVfZXZlbnRfbGlzdGVuZXIxLmdldCgpKSk7CisgICAgICBiYXNlOjpUb2tlbigiZmlyZWQiKSwgRmFrZVNjcmlwdFZhbHVlKGF0dHJpYnV0ZV9ldmVudF9saXN0ZW5lcjEuZ2V0KCkpKTsKICAgRVhQRUNUX1RSVUUoZXZlbnRfdGFyZ2V0LT5EaXNwYXRjaEV2ZW50KGV2ZW50LCAmZXhjZXB0aW9uX3N0YXRlKSk7CiAKICAgbm9uX2F0dHJpYnV0ZV9ldmVudF9saXN0ZW5lci0+RXhwZWN0SGFuZGxlRXZlbnRDYWxsKGV2ZW50LCBldmVudF90YXJnZXQpOwogICBhdHRyaWJ1dGVfZXZlbnRfbGlzdGVuZXIxLT5FeHBlY3ROb0hhbmRsZUV2ZW50Q2FsbCgpOwogICBhdHRyaWJ1dGVfZXZlbnRfbGlzdGVuZXIyLT5FeHBlY3RIYW5kbGVFdmVudENhbGwoZXZlbnQsIGV2ZW50X3RhcmdldCk7CiAgIGV2ZW50X3RhcmdldC0+U2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcigKLSAgICAgIGJhc2U6OlRva2VuKCJmaXJlZCIpLCBGYWtlU2NyaXB0T2JqZWN0KGF0dHJpYnV0ZV9ldmVudF9saXN0ZW5lcjIuZ2V0KCkpKTsKKyAgICAgIGJhc2U6OlRva2VuKCJmaXJlZCIpLCBGYWtlU2NyaXB0VmFsdWUoYXR0cmlidXRlX2V2ZW50X2xpc3RlbmVyMi5nZXQoKSkpOwogICBFWFBFQ1RfVFJVRShldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoZXZlbnQsICZleGNlcHRpb25fc3RhdGUpKTsKIAogICBub25fYXR0cmlidXRlX2V2ZW50X2xpc3RlbmVyLT5FeHBlY3RIYW5kbGVFdmVudENhbGwoZXZlbnQsIGV2ZW50X3RhcmdldCk7CiAgIGF0dHJpYnV0ZV9ldmVudF9saXN0ZW5lcjEtPkV4cGVjdE5vSGFuZGxlRXZlbnRDYWxsKCk7CiAgIGF0dHJpYnV0ZV9ldmVudF9saXN0ZW5lcjItPkV4cGVjdE5vSGFuZGxlRXZlbnRDYWxsKCk7CiAgIGV2ZW50X3RhcmdldC0+U2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbigiZmlyZWQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRPYmplY3QoTlVMTCkpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZVNjcmlwdFZhbHVlKE5VTEwpKTsKICAgRVhQRUNUX1RSVUUoZXZlbnRfdGFyZ2V0LT5EaXNwYXRjaEV2ZW50KGV2ZW50LCAmZXhjZXB0aW9uX3N0YXRlKSk7CiB9CiAKQEAgLTE4MywyOCArMTgxLDI4IEBACiAgIGV2ZW50X2xpc3RlbmVyLT5FeHBlY3RIYW5kbGVFdmVudENhbGwoZXZlbnRfMSwgZXZlbnRfdGFyZ2V0KTsKICAgZXZlbnRfbGlzdGVuZXItPkV4cGVjdEhhbmRsZUV2ZW50Q2FsbChldmVudF8yLCBldmVudF90YXJnZXQpOwogICBldmVudF90YXJnZXQtPkFkZEV2ZW50TGlzdGVuZXIoImZpcmVkXzEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKICAgZXZlbnRfdGFyZ2V0LT5BZGRFdmVudExpc3RlbmVyKCJmaXJlZF8yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGYWtlU2NyaXB0VmFsdWUoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CiAgIEVYUEVDVF9UUlVFKGV2ZW50X3RhcmdldC0+RGlzcGF0Y2hFdmVudChldmVudF8xLCAmZXhjZXB0aW9uX3N0YXRlKSk7CiAgIEVYUEVDVF9UUlVFKGV2ZW50X3RhcmdldC0+RGlzcGF0Y2hFdmVudChldmVudF8yLCAmZXhjZXB0aW9uX3N0YXRlKSk7CiAKICAgZXZlbnRfbGlzdGVuZXItPkV4cGVjdEhhbmRsZUV2ZW50Q2FsbChldmVudF8xLCBldmVudF90YXJnZXQpOwogICBldmVudF90YXJnZXQtPlJlbW92ZUV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWRfMiIsIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCBmYWxzZSk7CisgICAgICAiZmlyZWRfMiIsIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKICAgRVhQRUNUX1RSVUUoZXZlbnRfdGFyZ2V0LT5EaXNwYXRjaEV2ZW50KGV2ZW50XzEsICZleGNlcHRpb25fc3RhdGUpKTsKICAgRVhQRUNUX1RSVUUoZXZlbnRfdGFyZ2V0LT5EaXNwYXRjaEV2ZW50KGV2ZW50XzIsICZleGNlcHRpb25fc3RhdGUpKTsKIAogICBldmVudF9saXN0ZW5lci0+RXhwZWN0SGFuZGxlRXZlbnRDYWxsKGV2ZW50XzEsIGV2ZW50X3RhcmdldCk7CiAgIC8vIFRoZSBjYXB0dXJlIGZsYWcgaXMgbm90IHRoZSBzYW1lIHNvIHRoZSBldmVudCB3aWxsIG5vdCBiZSByZW1vdmVkLgogICBldmVudF90YXJnZXQtPlJlbW92ZUV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWRfMSIsIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpLCB0cnVlKTsKKyAgICAgICJmaXJlZF8xIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgdHJ1ZSk7CiAgIEVYUEVDVF9UUlVFKGV2ZW50X3RhcmdldC0+RGlzcGF0Y2hFdmVudChldmVudF8xLCAmZXhjZXB0aW9uX3N0YXRlKSk7CiAgIEVYUEVDVF9UUlVFKGV2ZW50X3RhcmdldC0+RGlzcGF0Y2hFdmVudChldmVudF8yLCAmZXhjZXB0aW9uX3N0YXRlKSk7CiAKICAgZXZlbnRfbGlzdGVuZXItPkV4cGVjdE5vSGFuZGxlRXZlbnRDYWxsKCk7CiAgIGV2ZW50X3RhcmdldC0+UmVtb3ZlRXZlbnRMaXN0ZW5lcigKLSAgICAgICJmaXJlZF8xIiwgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKKyAgICAgICJmaXJlZF8xIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyLmdldCgpKSwgZmFsc2UpOwogICBFWFBFQ1RfVFJVRShldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoZXZlbnRfMSwgJmV4Y2VwdGlvbl9zdGF0ZSkpOwogICBFWFBFQ1RfVFJVRShldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoZXZlbnRfMiwgJmV4Y2VwdGlvbl9zdGF0ZSkpOwogfQpAQCAtMjI0LDkgKzIyMiw5IEBACiAgIGV2ZW50X2xpc3RlbmVyZmlyZWRfMi0+RXhwZWN0SGFuZGxlRXZlbnRDYWxsKGV2ZW50LCBldmVudF90YXJnZXQpOwogCiAgIGV2ZW50X3RhcmdldC0+QWRkRXZlbnRMaXN0ZW5lcigKLSAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXJmaXJlZF8xLmdldCgpKSwgZmFsc2UpOworICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyZmlyZWRfMS5nZXQoKSksIGZhbHNlKTsKICAgZXZlbnRfdGFyZ2V0LT5BZGRFdmVudExpc3RlbmVyKAotICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lcmZpcmVkXzIuZ2V0KCkpLCB0cnVlKTsKKyAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lcmZpcmVkXzIuZ2V0KCkpLCB0cnVlKTsKICAgRVhQRUNUX1RSVUUoZXZlbnRfdGFyZ2V0LT5EaXNwYXRjaEV2ZW50KGV2ZW50LCAmZXhjZXB0aW9uX3N0YXRlKSk7CiB9CiAKQEAgLTI0NCw5ICsyNDIsOSBAQAogICBldmVudF9saXN0ZW5lcmZpcmVkXzItPkV4cGVjdE5vSGFuZGxlRXZlbnRDYWxsKCk7CiAKICAgZXZlbnRfdGFyZ2V0LT5BZGRFdmVudExpc3RlbmVyKAotICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lcmZpcmVkXzEuZ2V0KCkpLCBmYWxzZSk7CisgICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0VmFsdWUoZXZlbnRfbGlzdGVuZXJmaXJlZF8xLmdldCgpKSwgZmFsc2UpOwogICBldmVudF90YXJnZXQtPkFkZEV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyZmlyZWRfMi5nZXQoKSksIHRydWUpOworICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyZmlyZWRfMi5nZXQoKSksIHRydWUpOwogICBFWFBFQ1RfVFJVRShldmVudF90YXJnZXQtPkRpc3BhdGNoRXZlbnQoZXZlbnQsICZleGNlcHRpb25fc3RhdGUpKTsKIH0KIApAQCAtMjU4LDcgKzI1Niw3IEBACiAgICAgICBNb2NrRXZlbnRMaXN0ZW5lcjo6Q3JlYXRlKCk7CiAKICAgZXZlbnRfdGFyZ2V0LT5BZGRFdmVudExpc3RlbmVyKAotICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lcmZpcmVkLmdldCgpKSwgZmFsc2UpOworICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyZmlyZWQuZ2V0KCkpLCBmYWxzZSk7CiAgIGV2ZW50ID0gbmV3IEV2ZW50KGJhc2U6OlRva2VuKCJmaXJlZCIpLCBFdmVudDo6a05vdEJ1YmJsZXMsCiAgICAgICAgICAgICAgICAgICAgIEV2ZW50OjprTm90Q2FuY2VsYWJsZSk7CiAgIGV2ZW50X2xpc3RlbmVyZmlyZWQtPkV4cGVjdEhhbmRsZUV2ZW50Q2FsbCgKQEAgLTI5OSw3ICsyOTcsNyBAQAogICBleGNlcHRpb24gPSBOVUxMOwogCiAgIGV2ZW50X3RhcmdldC0+QWRkRXZlbnRMaXN0ZW5lcigiZmlyZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmFrZVNjcmlwdE9iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lci5nZXQoKSksIGZhbHNlKTsKICAgZXZlbnQgPSBuZXcgRXZlbnQoYmFzZTo6VG9rZW4oImZpcmVkIiksIEV2ZW50OjprTm90QnViYmxlcywKICAgICAgICAgICAgICAgICAgICAgRXZlbnQ6OmtOb3RDYW5jZWxhYmxlKTsKICAgLy8gRGlzcGF0Y2ggZXZlbnQgYWdhaW4gd2hlbiBpdCBpcyBiZWluZyBkaXNwYXRjaGVkLgpAQCAtMzEzLDcgKzMxMSw3IEBACiAgIHNjb3BlZF9yZWZwdHI8RXZlbnRUYXJnZXQ+IGV2ZW50X3RhcmdldCA9IG5ldyBFdmVudFRhcmdldDsKICAgc2NvcGVkX3JlZnB0cjxFdmVudD4gZXZlbnQgPSBuZXcgRXZlbnQoYmFzZTo6VG9rZW4oImZpcmVkIikpOwogICBzY29wZWRfcHRyPE1vY2tFdmVudExpc3RlbmVyPiBldmVudF9saXN0ZW5lciA9IE1vY2tFdmVudExpc3RlbmVyOjpDcmVhdGUoKTsKLSAgRmFrZVNjcmlwdE9iamVjdCBzY3JpcHRfb2JqZWN0KGV2ZW50X2xpc3RlbmVyLmdldCgpKTsKKyAgRmFrZVNjcmlwdFZhbHVlIHNjcmlwdF9vYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpOwogCiAgIEluU2VxdWVuY2UgaW5fc2VxdWVuY2U7CiAgIGV2ZW50X2xpc3RlbmVyLT5FeHBlY3RIYW5kbGVFdmVudENhbGwoZXZlbnQsIGV2ZW50X3RhcmdldCk7CkBAIC0zMzAsNyArMzI4LDcgQEAKICAgc2NvcGVkX3JlZnB0cjxFdmVudFRhcmdldD4gZXZlbnRfdGFyZ2V0ID0gbmV3IEV2ZW50VGFyZ2V0OwogICBzY29wZWRfcmVmcHRyPEV2ZW50PiBldmVudCA9IG5ldyBFdmVudChiYXNlOjpUb2tlbigiZmlyZWQiKSk7CiAgIHNjb3BlZF9wdHI8TW9ja0V2ZW50TGlzdGVuZXI+IGV2ZW50X2xpc3RlbmVyID0gTW9ja0V2ZW50TGlzdGVuZXI6OkNyZWF0ZSgpOwotICBGYWtlU2NyaXB0T2JqZWN0IHNjcmlwdF9vYmplY3QoZXZlbnRfbGlzdGVuZXIuZ2V0KCkpOworICBGYWtlU2NyaXB0VmFsdWUgc2NyaXB0X29iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSk7CiAKICAgSW5TZXF1ZW5jZSBpbl9zZXF1ZW5jZTsKICAgZXZlbnRfbGlzdGVuZXItPkV4cGVjdEhhbmRsZUV2ZW50Q2FsbChldmVudCwgZXZlbnRfdGFyZ2V0KTsKQEAgLTM0Nyw3ICszNDUsNyBAQAogICBzY29wZWRfcmVmcHRyPEV2ZW50VGFyZ2V0PiBldmVudF90YXJnZXQgPSBuZXcgRXZlbnRUYXJnZXQ7CiAgIHNjb3BlZF9yZWZwdHI8RXZlbnQ+IGV2ZW50ID0gbmV3IEV2ZW50KGJhc2U6OlRva2VuKCJmaXJlZCIpKTsKICAgc2NvcGVkX3B0cjxNb2NrRXZlbnRMaXN0ZW5lcj4gZXZlbnRfbGlzdGVuZXIgPSBNb2NrRXZlbnRMaXN0ZW5lcjo6Q3JlYXRlKCk7Ci0gIEZha2VTY3JpcHRPYmplY3Qgc2NyaXB0X29iamVjdChldmVudF9saXN0ZW5lci5nZXQoKSk7CisgIEZha2VTY3JpcHRWYWx1ZSBzY3JpcHRfb2JqZWN0KGV2ZW50X2xpc3RlbmVyLmdldCgpKTsKIAogICBJblNlcXVlbmNlIGluX3NlcXVlbmNlOwogICBldmVudF9saXN0ZW5lci0+RXhwZWN0SGFuZGxlRXZlbnRDYWxsKGV2ZW50LCBldmVudF90YXJnZXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2V2ZW50X3Rlc3QuY2MKaW5kZXggNTI2OWNhZi4uODc0MWM0MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZXZlbnRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ldmVudF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZmxvYXQzMl9hcnJheS5oIGIvc3JjL2NvYmFsdC9kb20vZmxvYXQzMl9hcnJheS5oCmluZGV4IDk0YmQyMjUuLjM3OTg1ODYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2Zsb2F0MzJfYXJyYXkuaAorKysgYi9zcmMvY29iYWx0L2RvbS9mbG9hdDMyX2FycmF5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRkxPQVQzMl9BUlJBWV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0ZMT0FUMzJfQVJSQVlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2Zsb2F0MzJfYXJyYXkuaWRsIGIvc3JjL2NvYmFsdC9kb20vZmxvYXQzMl9hcnJheS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDAzOWVjMQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2Zsb2F0MzJfYXJyYXkuaWRsCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3R5cGVkYXJyYXkvc3BlY3MvbGF0ZXN0LyM3CisKK1sKKyAgQ29uc3RydWN0b3IodW5zaWduZWQgbG9uZyBsZW5ndGgpLAorICBDb25zdHJ1Y3RvcihGbG9hdDMyQXJyYXkgYXJyYXkpLAorICBDb25zdHJ1Y3RvcihBcnJheUJ1ZmZlciBidWZmZXIsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBsZW5ndGgpLAorICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCisgIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvcgorXQoraW50ZXJmYWNlIEZsb2F0MzJBcnJheSA6IEFycmF5QnVmZmVyVmlldyB7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgQllURVNfUEVSX0VMRU1FTlQgPSA0OworCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKworICBnZXR0ZXIgdW5yZXN0cmljdGVkIGZsb2F0IGdldCh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgc2V0dGVyIHZvaWQgc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVucmVzdHJpY3RlZCBmbG9hdCB2YWx1ZSk7CisKKyAgLy8gUmV0dXJuIGEgbmV3IEZsb2F0MzJBcnJheSB0aGF0IGlzIGEgdmlldyBvbiB0b3Agb2YgdGhpcyBvbmUuCisgIC8vIENvbnRhaW5zIHRoaXNbc3RhcnRdLi50aGlzW2VuZF0uIGVuZCBkZWZhdWx0cyB0byBsZW5ndGggaWYgdW5zcGVjaWZpZWQuCisgIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSBGbG9hdDMyQXJyYXkgc3ViYXJyYXkobG9uZyBzdGFydCwgb3B0aW9uYWwgbG9uZyBlbmQpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2Zsb2F0MzJfYXJyYXlfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2Zsb2F0MzJfYXJyYXlfdGVzdC5jYwppbmRleCBjMDE2ZTU2Li5hZDc1NTQ0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mbG9hdDMyX2FycmF5X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZmxvYXQzMl9hcnJheV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vZmxvYXQzMl9hcnJheS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9mbG9hdDY0X2FycmF5LmggYi9zcmMvY29iYWx0L2RvbS9mbG9hdDY0X2FycmF5LmgKaW5kZXggZWJlMjZkYy4uM2ExZGZjMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZmxvYXQ2NF9hcnJheS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2Zsb2F0NjRfYXJyYXkuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9GTE9BVDY0X0FSUkFZX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fRkxPQVQ2NF9BUlJBWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZmxvYXQ2NF9hcnJheS5pZGwgYi9zcmMvY29iYWx0L2RvbS9mbG9hdDY0X2FycmF5LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMjRhOTIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vZmxvYXQ2NF9hcnJheS5pZGwKQEAgLTAsMCArMSwzNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdHlwZWRhcnJheS9zcGVjcy9sYXRlc3QvIzcKKworWworICBDb25zdHJ1Y3Rvcih1bnNpZ25lZCBsb25nIGxlbmd0aCksCisgIENvbnN0cnVjdG9yKEZsb2F0NjRBcnJheSBhcnJheSksCisgIENvbnN0cnVjdG9yKEFycmF5QnVmZmVyIGJ1ZmZlciwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGxlbmd0aCksCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncywKKyAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yCitdCitpbnRlcmZhY2UgRmxvYXQ2NEFycmF5IDogQXJyYXlCdWZmZXJWaWV3IHsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBCWVRFU19QRVJfRUxFTUVOVCA9IDg7CisKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCisgIGdldHRlciB1bnJlc3RyaWN0ZWQgZG91YmxlIGdldCh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgc2V0dGVyIHZvaWQgc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVucmVzdHJpY3RlZCBkb3VibGUgdmFsdWUpOworCisgIC8vIFJldHVybiBhIG5ldyBGbG9hdDY0QXJyYXkgdGhhdCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoaXMgb25lLgorICAvLyBDb250YWlucyB0aGlzW3N0YXJ0XS4udGhpc1tlbmRdLiBlbmQgZGVmYXVsdHMgdG8gbGVuZ3RoIGlmIHVuc3BlY2lmaWVkLgorICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gRmxvYXQ2NEFycmF5IHN1YmFycmF5KGxvbmcgc3RhcnQsIG9wdGlvbmFsIGxvbmcgZW5kKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9mbG9hdDY0X2FycmF5X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9mbG9hdDY0X2FycmF5X3Rlc3QuY2MKaW5kZXggMWMyMjdkOS4uMmEyYmNmZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZmxvYXQ2NF9hcnJheV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2Zsb2F0NjRfYXJyYXlfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2Zsb2F0NjRfYXJyYXkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZm9jdXNfZXZlbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9mb2N1c19ldmVudC5jYwppbmRleCBlY2YyNjQ1Li42OTE3MGFjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb2N1c19ldmVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9mb2N1c19ldmVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2ZvY3VzX2V2ZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2ZvY3VzX2V2ZW50LmggYi9zcmMvY29iYWx0L2RvbS9mb2N1c19ldmVudC5oCmluZGV4IGU0YTZhMmQuLmE2NzI3YzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2ZvY3VzX2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZm9jdXNfZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9GT0NVU19FVkVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0ZPQ1VTX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9mb2N1c19ldmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9mb2N1c19ldmVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA1YjY1MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2ZvY3VzX2V2ZW50LmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC11aWV2ZW50cy0yMDE1MTIxNS8jaW50ZXJmYWNlLUZvY3VzRXZlbnQKKworW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlKV0KK2ludGVyZmFjZSBGb2N1c0V2ZW50IDogVUlFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBFdmVudFRhcmdldD8gcmVsYXRlZFRhcmdldDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmNjIGIvc3JjL2NvYmFsdC9kb20vZm9udF9jYWNoZS5jYwppbmRleCA4MzFkMTVlLi5mOTY0NWJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9mb250X2NhY2hlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuaCBiL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGUuaAppbmRleCA4ZTVhZmM1Li4zZDA1Njk2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vZm9udF9jYWNoZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0ZPTlRfQ0FDSEVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9GT05UX0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9mb250X2NhY2hlX3Rlc3QuY2MKaW5kZXggYjI4MzI3Mi4uMGYxZjFkZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZm9udF9jYWNoZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2ZvbnRfY2FjaGVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2ZvbnRfY2FjaGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlLmNjIGIvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlLmNjCmluZGV4IDQzNjMwYmMuLjNiNWUyYWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfZmFjZS5jYworKysgYi9zcmMvY29iYWx0L2RvbS9mb250X2ZhY2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9mb250X2ZhY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlLmggYi9zcmMvY29iYWx0L2RvbS9mb250X2ZhY2UuaAppbmRleCBlOGMzNGM1Li40YjllMDZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2ZhY2UuaAorKysgYi9zcmMvY29iYWx0L2RvbS9mb250X2ZhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9GT05UX0ZBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9GT05UX0ZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfZmFjZV91cGRhdGVyLmNjIGIvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlX3VwZGF0ZXIuY2MKaW5kZXggMTZkZTQ1Zi4uNDUzZGVhMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlX3VwZGF0ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlX3VwZGF0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9mb250X2ZhY2VfdXBkYXRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9mb250X2ZhY2VfdXBkYXRlci5oIGIvc3JjL2NvYmFsdC9kb20vZm9udF9mYWNlX3VwZGF0ZXIuaAppbmRleCBlY2I0ZmY5Li4wZWI3NWMxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2ZhY2VfdXBkYXRlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2ZvbnRfZmFjZV91cGRhdGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fRk9OVF9GQUNFX1VQREFURVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9GT05UX0ZBQ0VfVVBEQVRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZm9udF9saXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vZm9udF9saXN0LmNjCmluZGV4IDY5ZmRlNTIuLjA0NzQzYzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2ZvbnRfbGlzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9mb250X2xpc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9mb250X2xpc3QuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZm9udF9saXN0LmggYi9zcmMvY29iYWx0L2RvbS9mb250X2xpc3QuaAppbmRleCBhZjJjZGRlLi4wNjJkMzk5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9mb250X2xpc3QuaAorKysgYi9zcmMvY29iYWx0L2RvbS9mb250X2xpc3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9GT05UX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9GT05UX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2dsb2JhbF9jcnlwdG8uaWRsIGIvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX2NyeXB0by5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjMyMmUzNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2dsb2JhbF9jcnlwdG8uaWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJDcnlwdG9BUEkvI2NyeXB0by1pbnRlcmZhY2UKKworW05vSW50ZXJmYWNlT2JqZWN0XQoraW50ZXJmYWNlIEdsb2JhbENyeXB0byB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBDcnlwdG8gY3J5cHRvOworfTsKK1dpbmRvdyBpbXBsZW1lbnRzIEdsb2JhbENyeXB0bzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2dsb2JhbF9ldmVudF9oYW5kbGVycy5pZGwgYi9zcmMvY29iYWx0L2RvbS9nbG9iYWxfZXZlbnRfaGFuZGxlcnMuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjczZjRiOTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9nbG9iYWxfZXZlbnRfaGFuZGxlcnMuaWRsCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjZ2xvYmFsZXZlbnRoYW5kbGVycworCitbTm9JbnRlcmZhY2VPYmplY3RdCitpbnRlcmZhY2UgR2xvYmFsRXZlbnRIYW5kbGVycyB7CisgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25ibHVyOworICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uZXJyb3I7CisgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25mb2N1czsKKyAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmxvYWQ7Cit9OworCisvLyBUT0RPOiBUaGUgSURMIGRlZmluZXMgRXZlbnRIYW5kbGVyIGFzIGEgbnVsbGFibGUgY2FsbGJhY2sKKy8vIGZ1bmN0aW9uLiBEZWZpbmUgaXQgYXMgYSBudWxsYWJsZSBFdmVudExpc3RlbmVyIGZvciBub3cgdW50aWwgd2UgY2FuIGRvCisvLyBzb21lIHJlZmFjdG9yaW5nIHRvIGFjY2VwdCBib3RoIGluIHRoZSBFdmVudFRhcmdldCBpbXBsZW1lbnRhdGlvbi4KK3R5cGVkZWYgRXZlbnRMaXN0ZW5lcj8gRXZlbnRIYW5kbGVyOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX3N0YXRzLmNjIGIvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX3N0YXRzLmNjCmluZGV4IDY4MmFjOWEuLjhkYzhmOTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2dsb2JhbF9zdGF0cy5jYworKysgYi9zcmMvY29iYWx0L2RvbS9nbG9iYWxfc3RhdHMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9nbG9iYWxfc3RhdHMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vZ2xvYmFsX3N0YXRzLmggYi9zcmMvY29iYWx0L2RvbS9nbG9iYWxfc3RhdHMuaAppbmRleCAwZmMyYjA4Li43NWQ0ZmViIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9nbG9iYWxfc3RhdHMuaAorKysgYi9zcmMvY29iYWx0L2RvbS9nbG9iYWxfc3RhdHMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9HTE9CQUxfU1RBVFNfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9HTE9CQUxfU1RBVFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2hpc3RvcnkuY2MgYi9zcmMvY29iYWx0L2RvbS9oaXN0b3J5LmNjCmluZGV4IGU3MmVjMDguLjk4NzQwMjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2hpc3RvcnkuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaGlzdG9yeS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2hpc3RvcnkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaGlzdG9yeS5oIGIvc3JjL2NvYmFsdC9kb20vaGlzdG9yeS5oCmluZGV4IDUwYWVmM2MuLmFhOWU5MzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2hpc3RvcnkuaAorKysgYi9zcmMvY29iYWx0L2RvbS9oaXN0b3J5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSElTVE9SWV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hJU1RPUllfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2hpc3RvcnkuaWRsIGIvc3JjL2NvYmFsdC9kb20vaGlzdG9yeS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE3NDg0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2hpc3RvcnkuaWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9icm93c2Vycy5odG1sI3RoZS1oaXN0b3J5LWludGVyZmFjZQorCisvLyBUaGUgam9pbnQgc2Vzc2lvbiBoaXN0b3J5IG9mIGEgdG9wLWxldmVsIGJyb3dzaW5nIGNvbnRleHQgaXMgdGhlIHVuaW9uIG9mCisvLyBhbGwgdGhlIHNlc3Npb24gaGlzdG9yaWVzIG9mIGFsbCBicm93c2luZyBjb250ZXh0cyBvZiBhbGwgdGhlIGZ1bGx5IGFjdGl2ZQorLy8gRG9jdW1lbnQgb2JqZWN0cyB0aGF0IHNoYXJlIHRoYXQgdG9wLWxldmVsIGJyb3dzaW5nIGNvbnRleHQsIHdpdGggYWxsIHRoZQorLy8gZW50cmllcyB0aGF0IGFyZSBjdXJyZW50IGVudHJpZXMgaW4gdGhlaXIgcmVzcGVjdGl2ZSBzZXNzaW9uIGhpc3RvcmllcworLy8gcmVtb3ZlZCBleGNlcHQgZm9yIHRoZSBjdXJyZW50IGVudHJ5IG9mIHRoZSBqb2ludCBzZXNzaW9uIGhpc3RvcnkuCisvLyBKdXN0IGEgc3R1YmJlZCBpbXBsZW1lbnRhdGlvbiBpcyBjdXJyZW50bHkgcmVxdWlyZWQuIEhvd2V2ZXIsIG1vcmUgc3VwcG9ydAorLy8gbWF5IGJlIG5lZWRlZCBpbiB0aGUgZnV0dXJlIGZvciBvdGhlciBjbGllbnRzLgoraW50ZXJmYWNlIEhpc3RvcnkgeworICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBsZW5ndGg7Cit9OworCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2FuY2hvcl9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9hbmNob3JfZWxlbWVudC5jYwppbmRleCAxZDVhZmQ0Li5hMzIzZTFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2FuY2hvcl9lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfYW5jaG9yX2VsZW1lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb2N1bWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9hbmNob3JfZWxlbWVudC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9hbmNob3JfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9hbmNob3JfZWxlbWVudC5oCmluZGV4IGJhYTFmNWQuLjU1MmEyMTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfYW5jaG9yX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2FuY2hvcl9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9BTkNIT1JfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfQU5DSE9SX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfYW5jaG9yX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9hbmNob3JfZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU4ZGVlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfYW5jaG9yX2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS90ZXh0LWxldmVsLXNlbWFudGljcy5odG1sI3RoZS1hLWVsZW1lbnQKKworaW50ZXJmYWNlIEhUTUxBbmNob3JFbGVtZW50IDogSFRNTEVsZW1lbnQge307CitIVE1MQW5jaG9yRWxlbWVudCBpbXBsZW1lbnRzIFVSTFV0aWxzOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9ib2R5X2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2JvZHlfZWxlbWVudC5jYwppbmRleCBkMjNhYjY1Li4xZTAwZDI2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2JvZHlfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2JvZHlfZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfYm9keV9lbGVtZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfYm9keV9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2JvZHlfZWxlbWVudC5oCmluZGV4IDI2MTEyMDIuLjA3YzE0MDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfYm9keV9lbGVtZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9ib2R5X2VsZW1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9IVE1MX0JPRFlfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfQk9EWV9FTEVNRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2JvZHlfZWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX2JvZHlfZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODI5NWQzNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfYm9keV9lbGVtZW50LmlkbApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvc2VjdGlvbnMuaHRtbCN0aGUtYm9keS1lbGVtZW50CisKK2ludGVyZmFjZSBIVE1MQm9keUVsZW1lbnQgOiBIVE1MRWxlbWVudCB7CisgIC8vIENTU09NIFZpZXcgTW9kdWxlCisgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLXZpZXctMjAxMzEyMTcvI2V4dGVuc2lvbnMtdG8tdGhlLWh0bWxlbGVtZW50LWludGVyZmFjZQorICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBvZmZzZXRXaWR0aDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGxvbmcgb2Zmc2V0SGVpZ2h0OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfYnJfZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfYnJfZWxlbWVudC5jYwppbmRleCA4ZTczNDUxLi5jZjNkNDA1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2JyX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9icl9lbGVtZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9icl9lbGVtZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfYnJfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9icl9lbGVtZW50LmgKaW5kZXggYzFiYjUxNS4uNDExOTFmZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9icl9lbGVtZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9icl9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9CUl9FTEVNRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fSFRNTF9CUl9FTEVNRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2JyX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9icl9lbGVtZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NjU0OWZmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9icl9lbGVtZW50LmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvdGV4dC1sZXZlbC1zZW1hbnRpY3MuaHRtbCN0aGUtYnItZWxlbWVudAorCitpbnRlcmZhY2UgSFRNTEJSRWxlbWVudCA6IEhUTUxFbGVtZW50IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9jb2xsZWN0aW9uLmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9jb2xsZWN0aW9uLmNjCmluZGV4IDczYzE3MDYuLjQwYmZmYWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfY29sbGVjdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2NvbGxlY3Rpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2NvbGxlY3Rpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9jb2xsZWN0aW9uLmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2NvbGxlY3Rpb24uaAppbmRleCBiYTJiYTVjLi4wYmY0MjdlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2NvbGxlY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2NvbGxlY3Rpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9IVE1MX0NPTExFQ1RJT05fSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX0NPTExFQ1RJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfY29sbGVjdGlvbi5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX2NvbGxlY3Rpb24uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxZDk3MDUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2NvbGxlY3Rpb24uaWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2h0bWxjb2xsZWN0aW9uCisKK2ludGVyZmFjZSBIVE1MQ29sbGVjdGlvbiB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIEVsZW1lbnQ/IGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7CisgIGdldHRlciBFbGVtZW50PyBuYW1lZEl0ZW0oRE9NU3RyaW5nIG5hbWUpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZGl2X2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2Rpdl9lbGVtZW50LmNjCmluZGV4IDg1ZDNmYjAuLmJhOTM3MTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZGl2X2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9kaXZfZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfZGl2X2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9kaXZfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9kaXZfZWxlbWVudC5oCmluZGV4IGVjMWQ4MzguLmFjOTQ2M2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZGl2X2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2Rpdl9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9ESVZfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfRElWX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZGl2X2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9kaXZfZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2MjY2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZGl2X2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9ncm91cGluZy1jb250ZW50Lmh0bWwjdGhlLWRpdi1lbGVtZW50CisKK2ludGVyZmFjZSBIVE1MRGl2RWxlbWVudCA6IEhUTUxFbGVtZW50IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmNjCmluZGV4IDkxMjNmZmIuLjkwZjhiZDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaAppbmRleCA0M2Y1NTE2Li45OTVlZDUyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9IVE1MX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzYzdiODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kb20uaHRtbCNodG1sZWxlbWVudAorCitpbnRlcmZhY2UgSFRNTEVsZW1lbnQgOiBFbGVtZW50IHsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBkaXI7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmdNYXAgZGF0YXNldDsKKyAgYXR0cmlidXRlIGxvbmcgdGFiSW5kZXg7CisgIHZvaWQgZm9jdXMoKTsKKyAgdm9pZCBibHVyKCk7Cit9OworSFRNTEVsZW1lbnQgaW1wbGVtZW50cyBHbG9iYWxFdmVudEhhbmRsZXJzOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYwppbmRleCBlMzg4OGQzLi44YTEwMzQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oCmluZGV4IDRjMGY5MzMuLjRjMTY5MTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jb250ZXh0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2NvbnRleHQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9IVE1MX0VMRU1FTlRfQ09OVEVYVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfRUxFTUVOVF9DT05URVhUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY3Nzb21fdmlldy5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY3Nzb21fdmlldy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM3MGIxOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9jc3NvbV92aWV3LmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS12aWV3LTIwMTMxMjE3LyNleHRlbnNpb25zLXRvLXRoZS1odG1sZWxlbWVudC1pbnRlcmZhY2UKKworcGFydGlhbCBpbnRlcmZhY2UgSFRNTEVsZW1lbnQgeworICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gb2Zmc2V0UGFyZW50OworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG9mZnNldFRvcDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBvZmZzZXRMZWZ0OworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG9mZnNldFdpZHRoOworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG9mZnNldEhlaWdodDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfZmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5LmNjCmluZGV4IGY5NjBlYzIuLmEwNjFlMmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9lbGVtZW50X2ZhY3RvcnkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2ZhY3RvcnkuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5LmgKaW5kZXggNTA5ZmZlMC4uOTZhZjZiOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfZmFjdG9yeS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0hUTUxfRUxFTUVOVF9GQUNUT1JZX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fSFRNTF9FTEVNRU5UX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfZmFjdG9yeV90ZXN0LmNjCmluZGV4IGMxNDg1ZmIuLjVjMTgyOGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X2ZhY3RvcnlfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfZWxlbWVudF9mYWN0b3J5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfZWxlbWVudF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X3Rlc3QuY2MKaW5kZXggMjE3ODU0OS4uZGI5NDIzNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9lbGVtZW50X3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRfZWxlbWVudC5jYwppbmRleCA0NjljMjQ3Li5lODRlMjNlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRfZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfaGVhZF9lbGVtZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfaGVhZF9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRfZWxlbWVudC5oCmluZGV4IDJjMTc5MjQuLjE0MTViYzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfaGVhZF9lbGVtZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkX2VsZW1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9IVE1MX0hFQURfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfSEVBRF9FTEVNRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRfZWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRfZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTY4YWMxYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfaGVhZF9lbGVtZW50LmlkbApAQCAtMCwwICsxLDE3IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZG9jdW1lbnQtbWV0YWRhdGEuaHRtbCN0aGUtaGVhZC1lbGVtZW50CisKK2ludGVyZmFjZSBIVE1MSGVhZEVsZW1lbnQgOiBIVE1MRWxlbWVudCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfaGVhZGluZ19lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkaW5nX2VsZW1lbnQuY2MKaW5kZXggNWJiZDk0Ni4uYTllOTM4OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkaW5nX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkaW5nX2VsZW1lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2hlYWRpbmdfZWxlbWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRpbmdfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkaW5nX2VsZW1lbnQuaAppbmRleCBiZjRiOTEwLi45MTNmNWNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRpbmdfZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfaGVhZGluZ19lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9IRUFESU5HX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX0hFQURJTkdfRUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkaW5nX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9oZWFkaW5nX2VsZW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ1NjgxNTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2hlYWRpbmdfZWxlbWVudC5pZGwKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NlY3Rpb25zLmh0bWwjdGhlLWgxLC1oMiwtaDMsLWg0LC1oNSwtYW5kLWg2LWVsZW1lbnRzCisKK2ludGVyZmFjZSBIVE1MSGVhZGluZ0VsZW1lbnQgOiBIVE1MRWxlbWVudCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfaHRtbF9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9odG1sX2VsZW1lbnQuY2MKaW5kZXggMTdkYmRiYS4uMDE3NjFmZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9odG1sX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9odG1sX2VsZW1lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2h0bWxfZWxlbWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2h0bWxfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9odG1sX2VsZW1lbnQuaAppbmRleCAzYWU3MDk4Li41ZWU1YzgyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX2h0bWxfZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfaHRtbF9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9IVE1MX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX0hUTUxfRUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9odG1sX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9odG1sX2VsZW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkzMzRjZWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2h0bWxfZWxlbWVudC5pZGwKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NlbWFudGljcy5odG1sI3RoZS1odG1sLWVsZW1lbnQKKworaW50ZXJmYWNlIEhUTUxIdG1sRWxlbWVudCA6IEhUTUxFbGVtZW50IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmNjCmluZGV4IGZlOTE4OTQuLjZiNDRkZDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfaW1hZ2VfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2ltYWdlX2VsZW1lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2ltYWdlX2VsZW1lbnQuaCIKIApAQCAtNzksNiArNzcsNyBAQAogICAvLyAzLiBGb3JnZXQgdGhlIGltZyBlbGVtZW50J3MgY3VycmVudCBpbWFnZSBkYXRhLCBpZiBhbnkuCiAgIGlmIChjYWNoZWRfaW1hZ2VfbG9hZGVkX2NhbGxiYWNrX2hhbmRsZXJfKSB7CiAgICAgY2FjaGVkX2ltYWdlX2xvYWRlZF9jYWxsYmFja19oYW5kbGVyXy5yZXNldCgpOworICAgIEFsbG93R2FyYmFnZUNvbGxlY3Rpb24oKTsKICAgICBub2RlX2RvY3VtZW50KCktPkRlY3JlYXNlTG9hZGluZ0NvdW50ZXIoKTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2ltYWdlX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfaW1hZ2VfZWxlbWVudC5oCmluZGV4IDNhODcxYTUuLmQ2ZTMzNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfaW1hZ2VfZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfaW1hZ2VfZWxlbWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0hUTUxfSU1BR0VfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfSU1BR0VfRUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9pbWFnZV9lbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfaW1hZ2VfZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmEyMGZlNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfaW1hZ2VfZWxlbWVudC5pZGwKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI3RoZS1pbWctZWxlbWVudAorCisvLyBUT0RPOiBBZGQgdGhlIG9wdGlvbmFsIHdpZHRoIGFuZCBoZWlnaHQgcGFyYW1ldGVycyB0byB0aGUKKy8vIGNvbnN0cnVjdG9yLCBhcyBzaG93biBpbiB0aGUgc3BlYy4KK1sKKyAgTmFtZWRDb25zdHJ1Y3Rvcj1JbWFnZSgpLAorICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MKK10KK2ludGVyZmFjZSBIVE1MSW1hZ2VFbGVtZW50IDogSFRNTEVsZW1lbnQgeworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNyYzsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX2xpbmtfZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbGlua19lbGVtZW50LmNjCmluZGV4IDdhNDgwMmMuLjA3ZGY3YTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbGlua19lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbGlua19lbGVtZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9saW5rX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9saW5rX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbGlua19lbGVtZW50LmgKaW5kZXggYTI2Y2U2Ni4uMzk0NjQwNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9saW5rX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX2xpbmtfZWxlbWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0hUTUxfTElOS19FTEVNRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fSFRNTF9MSU5LX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbGlua19lbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbGlua19lbGVtZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MjRjYzJiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9saW5rX2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kb2N1bWVudC1tZXRhZGF0YS5odG1sI3RoZS1saW5rLWVsZW1lbnQKKworaW50ZXJmYWNlIEhUTUxMaW5rRWxlbWVudCA6IEhUTUxFbGVtZW50IHsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBocmVmOworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlbDsKKyAgYXR0cmlidXRlIERPTVN0cmluZyB0eXBlOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5jYwppbmRleCBhNDc1NjM1Li5hZGI2MDQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgiCiAKQEAgLTM3LDE2ICszNSwyMiBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfa2V5X2Vycm9yX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfa2V5X25lZWRlZF9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfc291cmNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS93ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnkuaCIKKworI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZy5oIgorI2Vsc2UgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2xvZy5oIgotI2luY2x1ZGUgIm1lZGlhL3BsYXllci9jYW5fcGxheV90eXBlLmgiCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBkb20gewogCit1c2luZyA6Om1lZGlhOjpCdWZmZXJlZERhdGFTb3VyY2U7CiB1c2luZyA6Om1lZGlhOjpXZWJNZWRpYVBsYXllcjsKIAogY29uc3QgY2hhciBIVE1MTWVkaWFFbGVtZW50OjprTWVkaWFTb3VyY2VVcmxQcm90b2NvbFtdID0gImJsb2IiOwpAQCAtMTM4LDEyICsxNDIsMTIgQEAKIAogSFRNTE1lZGlhRWxlbWVudDo6fkhUTUxNZWRpYUVsZW1lbnQoKSB7CiAgIE1MT0coKTsKLSAgU2V0U291cmNlU3RhdGUoTWVkaWFTb3VyY2U6OmtSZWFkeVN0YXRlQ2xvc2VkKTsKKyAgQ2xlYXJNZWRpYVNvdXJjZSgpOwogICBodG1sX21lZGlhX2VsZW1lbnRfY291bnRfbG9nLkdldCgpLmNvdW50LS07CiB9CiAKIHNjb3BlZF9yZWZwdHI8TWVkaWFFcnJvcj4gSFRNTE1lZGlhRWxlbWVudDo6ZXJyb3IoKSBjb25zdCB7Ci0gIE1MT0coKSA8PCBlcnJvcl8tPmNvZGUoKTsKKyAgTUxPRygpIDw8IChlcnJvcl8gPyBlcnJvcl8tPmNvZGUoKSA6IDApOwogICByZXR1cm4gZXJyb3JfOwogfQogCkBAIC0zOTEsNyArMzk1LDcgQEAKICAgTUxPRygpIDw8IHJhdGU7CiAgIGlmIChkZWZhdWx0X3BsYXliYWNrX3JhdGVfICE9IHJhdGUpIHsKICAgICBkZWZhdWx0X3BsYXliYWNrX3JhdGVfID0gcmF0ZTsKLSAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6cmF0ZWNoYW5nZSgpKTsKKyAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6cmF0ZWNoYW5nZSgpKTsKICAgfQogfQogCkBAIC00MDQsNyArNDA4LDcgQEAKICAgTUxPRygpIDw8IHJhdGU7CiAgIGlmIChwbGF5YmFja19yYXRlXyAhPSByYXRlKSB7CiAgICAgcGxheWJhY2tfcmF0ZV8gPSByYXRlOwotICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpyYXRlY2hhbmdlKCkpOworICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpyYXRlY2hhbmdlKCkpOwogICB9CiAKICAgaWYgKHBsYXllcl8gJiYgUG90ZW50aWFsbHlQbGF5aW5nKCkpIHsKQEAgLTQ4NiwxMiArNDkwLDEyIEBACiAKICAgaWYgKHBhdXNlZF8pIHsKICAgICBwYXVzZWRfID0gZmFsc2U7Ci0gICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnBsYXkoKSk7CisgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OnBsYXkoKSk7CiAKICAgICBpZiAocmVhZHlfc3RhdGVfIDw9IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVDdXJyZW50RGF0YSkgewotICAgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OndhaXRpbmcoKSk7CisgICAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6d2FpdGluZygpKTsKICAgICB9IGVsc2UgaWYgKHJlYWR5X3N0YXRlXyA+PSBXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlRnV0dXJlRGF0YSkgewotICAgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnBsYXlpbmcoKSk7CisgICAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6cGxheWluZygpKTsKICAgICB9CiAgIH0KICAgYXV0b3BsYXlpbmdfID0gZmFsc2U7CkBAIC01MTEsNyArNTE1LDcgQEAKICAgaWYgKCFwYXVzZWRfKSB7CiAgICAgcGF1c2VkXyA9IHRydWU7CiAgICAgU2NoZWR1bGVUaW1ldXBkYXRlRXZlbnQoZmFsc2UpOwotICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpwYXVzZSgpKTsKKyAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6cGF1c2UoKSk7CiAgIH0KIAogICBVcGRhdGVQbGF5U3RhdGUoKTsKQEAgLTU0NSw3ICs1NDksNyBAQAogICBpZiAodm9sdW1lXyAhPSB2b2x1bWUpIHsKICAgICB2b2x1bWVfID0gdm9sdW1lOwogICAgIFVwZGF0ZVZvbHVtZSgpOwotICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjp2b2x1bWVjaGFuZ2UoKSk7CisgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OnZvbHVtZWNoYW5nZSgpKTsKICAgfQogfQogCkBAIC01NjQsNyArNTY4LDcgQEAKICAgICAgICAgcGxheWVyXy0+U2V0Vm9sdW1lKG11dGVkXyA/IDAgOiB2b2x1bWVfKTsKICAgICAgIH0KICAgICB9Ci0gICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnZvbHVtZWNoYW5nZSgpKTsKKyAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6dm9sdW1lY2hhbmdlKCkpOwogICB9CiB9CiAKQEAgLTU3Nyw2ICs1ODEsMjkgQEAKICAgfQogfQogCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCit2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OkR1cmF0aW9uQ2hhbmdlZChkb3VibGUgZHVyYXRpb24sIGJvb2wgcmVxdWVzdF9zZWVrKSB7CisgIE1MT0coKSA8PCAiRHVyYXRpb25DaGFuZ2VkKCIgPDwgZHVyYXRpb24gPDwgIiwgIiA8PCByZXF1ZXN0X3NlZWsgPDwgIikiOworCisgIC8vIFRPRE86IEFkZCBjYWNoZWQgZHVyYXRpb24gc3VwcG9ydC4KKyAgLyppZiAoZHVyYXRpb25fID09IGR1cmF0aW9uKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgZHVyYXRpb25fID0gZHVyYXRpb247Ki8KKyAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmR1cmF0aW9uY2hhbmdlKCkpOworCisgIGlmIChyZXF1ZXN0X3NlZWspIHsKKyAgICBTZWVrKHN0YXRpY19jYXN0PGZsb2F0PihkdXJhdGlvbikpOworICB9Cit9CisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorCit2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OlNjaGVkdWxlRXZlbnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudD4mIGV2ZW50KSB7CisgIE1MT0coKSA8PCBldmVudC0+dHlwZSgpOworICBldmVudF9xdWV1ZV8uRW5xdWV1ZShldmVudCk7Cit9CisKIHZvaWQgSFRNTE1lZGlhRWxlbWVudDo6Q3JlYXRlTWVkaWFQbGF5ZXIoKSB7CiAgIE1MT0coKTsKICAgaWYgKHNyYygpLmVtcHR5KCkpIHsKQEAgLTYwOCw5ICs2MzUsMTEgQEAKICAgcGxheWVyXyA9CiAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dCgpLT53ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnkoKS0+Q3JlYXRlV2ViTWVkaWFQbGF5ZXIoCiAgICAgICAgICAgdGhpcyk7CisjaWYgIWRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogICBpZiAobWVkaWFfc291cmNlXykgewogICAgIG1lZGlhX3NvdXJjZV8tPlNldFBsYXllcihwbGF5ZXJfLmdldCgpKTsKICAgfQorI2VuZGlmICAvLyAhZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgIG5vZGVfZG9jdW1lbnQoKS0+T25ET01NdXRhdGlvbigpOwogICBJbnZhbGlkYXRlTGF5b3V0Qm94ZXNGcm9tTm9kZUFuZEFuY2VzdG9ycygpOwogfQpAQCAtNjQ4LDEwICs2NzcsMTAgQEAKICAgLy8ga05ldHdvcmtJZGxlLCBxdWV1ZSBhIHRhc2sgdG8gZmlyZSBhIHNpbXBsZSBldmVudCBuYW1lZCBhYm9ydCBhdCB0aGUgbWVkaWEKICAgLy8gZWxlbWVudC4KICAgaWYgKG5ldHdvcmtfc3RhdGVfID09IGtOZXR3b3JrTG9hZGluZyB8fCBuZXR3b3JrX3N0YXRlXyA9PSBrTmV0d29ya0lkbGUpIHsKLSAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6YWJvcnQoKSk7CisgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmFib3J0KCkpOwogICB9CiAKLSAgU2V0U291cmNlU3RhdGUoTWVkaWFTb3VyY2U6OmtSZWFkeVN0YXRlQ2xvc2VkKTsKKyAgQ2xlYXJNZWRpYVNvdXJjZSgpOwogCiAgIENyZWF0ZU1lZGlhUGxheWVyKCk7CiAKQEAgLTY2Myw3ICs2OTIsNyBAQAogICAgIHJlYWR5X3N0YXRlX21heGltdW1fID0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmc7CiAgICAgcGF1c2VkXyA9IHRydWU7CiAgICAgc2Vla2luZ18gPSBmYWxzZTsKLSAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6ZW1wdGllZCgpKTsKKyAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6ZW1wdGllZCgpKTsKICAgfQogCiAgIC8vIDUgLSBTZXQgdGhlIHBsYXliYWNrUmF0ZSBhdHRyaWJ1dGUgdG8gdGhlIHZhbHVlIG9mIHRoZSBkZWZhdWx0UGxheWJhY2tSYXRlCkBAIC03MTYsNyArNzQ1LDcgQEAKIAogICAvLyA1IC0gUXVldWUgYSB0YXNrIHRvIGZpcmUgYSBzaW1wbGUgZXZlbnQgbmFtZWQgbG9hZHN0YXJ0IGF0IHRoZSBtZWRpYQogICAvLyBlbGVtZW50LgotICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6bG9hZHN0YXJ0KCkpOworICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6bG9hZHN0YXJ0KCkpOwogCiAgIC8vIDYgLSBJZiBtb2RlIGlzIGtBdHRyaWJ1dGUsIHRoZW4gcnVuIHRoZXNlIHN1YnN0ZXBzLgogICBpZiAobW9kZSA9PSBrQXR0cmlidXRlKSB7CkBAIC03NzgsNyArODA3LDExIEBACiAgICAgLy8gSWYgbWVkaWFfc291cmNlXyBpcyBOVUxMLCB0aGUgcGxheWVyIHdpbGwgdHJ5IHRvIGxvYWQgaXQgYXMgYSBub3JtYWwKICAgICAvLyBtZWRpYSByZXNvdXJjZSB1cmwgYW5kIHRocm93IGEgRE9NIGV4Y2VwdGlvbiB3aGVuIGl0IGZhaWxzLgogICAgIGlmIChtZWRpYV9zb3VyY2VfKSB7CisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgICAgICBtZWRpYV9zb3VyY2VfLT5BdHRhY2hUb0VsZW1lbnQodGhpcyk7CisjZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogICAgICAgbWVkaWFfc291cmNlXy0+U2V0UGxheWVyKHBsYXllcl8uZ2V0KCkpOworI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICAgICAgIG1lZGlhX3NvdXJjZV91cmxfID0gdXJsOwogICAgIH0gZWxzZSB7CiAgICAgICBOb25lU3VwcG9ydGVkKCk7CkBAIC04MDcsMTcgKzg0MCwxOSBAQAogICAgIGNzcDo6U2VjdXJpdHlDYWxsYmFjayBjc3BfY2FsbGJhY2sgPSBiYXNlOjpCaW5kKAogICAgICAgICAmQ3NwRGVsZWdhdGU6OkNhbkxvYWQsCiAgICAgICAgIGJhc2U6OlVucmV0YWluZWQobm9kZV9kb2N1bWVudCgpLT5jc3BfZGVsZWdhdGUoKSksIENzcERlbGVnYXRlOjprTWVkaWEpOwotICAgIHBsYXllcl8tPkxvYWRQcm9ncmVzc2l2ZSgKLSAgICAgICAgdXJsLCBuZXcgbWVkaWE6OkZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2UoCi0gICAgICAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSwgdXJsLCBjc3BfY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0KCktPmZldGNoZXJfZmFjdG9yeSgpLT5uZXR3b3JrX21vZHVsZSgpKSwKLSAgICAgICAgV2ViTWVkaWFQbGF5ZXI6OmtDT1JTTW9kZVVuc3BlY2lmaWVkKTsKKyAgICBzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2UoCisgICAgICAgIG5ldyBtZWRpYTo6RmV0Y2hlckJ1ZmZlcmVkRGF0YVNvdXJjZSgKKyAgICAgICAgICAgIGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk6OmN1cnJlbnQoKSwgdXJsLCBjc3BfY2FsbGJhY2ssCisgICAgICAgICAgICBodG1sX2VsZW1lbnRfY29udGV4dCgpLT5mZXRjaGVyX2ZhY3RvcnkoKS0+bmV0d29ya19tb2R1bGUoKSkpOworICAgIHBsYXllcl8tPkxvYWRQcm9ncmVzc2l2ZSh1cmwsIGRhdGFfc291cmNlLlBhc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2ViTWVkaWFQbGF5ZXI6OmtDT1JTTW9kZVVuc3BlY2lmaWVkKTsKICAgfQogfQogCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OkNsZWFyTWVkaWFQbGF5ZXIoKSB7CiAgIE1MT0coKTsKLSAgU2V0U291cmNlU3RhdGUoTWVkaWFTb3VyY2U6OmtSZWFkeVN0YXRlQ2xvc2VkKTsKKworICBDbGVhck1lZGlhU291cmNlKCk7CiAKICAgcGxheWVyXy5yZXNldChOVUxMKTsKIApAQCAtODU1LDkgKzg5MCw5IEBACiAgIG5ldHdvcmtfc3RhdGVfID0ga05ldHdvcmtOb1NvdXJjZTsKIAogICAvLyA3IC0gUXVldWUgYSB0YXNrIHRvIGZpcmUgYSBzaW1wbGUgZXZlbnQgbmFtZWQgZXJyb3IgYXQgdGhlIG1lZGlhIGVsZW1lbnQuCi0gIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjplcnJvcigpKTsKKyAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmVycm9yKCkpOwogCi0gIFNldFNvdXJjZVN0YXRlKE1lZGlhU291cmNlOjprUmVhZHlTdGF0ZUNsb3NlZCk7CisgIENsZWFyTWVkaWFTb3VyY2UoKTsKIH0KIAogdm9pZCBIVE1MTWVkaWFFbGVtZW50OjpNZWRpYUxvYWRpbmdGYWlsZWQoV2ViTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBlcnJvcikgewpAQCAtOTAwLDExICs5MzUsMTEgQEAKICAgZG91YmxlIHRpbWVfZGVsdGEgPSB0aW1lIC0gcHJldmlvdXNfcHJvZ3Jlc3NfdGltZV87CiAKICAgaWYgKHBsYXllcl8tPkRpZExvYWRpbmdQcm9ncmVzcygpKSB7Ci0gICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnByb2dyZXNzKCkpOworICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpwcm9ncmVzcygpKTsKICAgICBwcmV2aW91c19wcm9ncmVzc190aW1lXyA9IHRpbWU7CiAgICAgc2VudF9zdGFsbGVkX2V2ZW50XyA9IGZhbHNlOwogICB9IGVsc2UgaWYgKHRpbWVfZGVsdGEgPiAzLjAgJiYgIXNlbnRfc3RhbGxlZF9ldmVudF8pIHsKLSAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6c3RhbGxlZCgpKTsKKyAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6c3RhbGxlZCgpKTsKICAgICBzZW50X3N0YWxsZWRfZXZlbnRfID0gdHJ1ZTsKICAgfQogfQpAQCAtOTU5LDE5ICs5OTQsMTkgQEAKICAgLy8gYnV0IHdlIG9ubHkgd2FudCBvbmUgZXZlbnQgYXQgYSBnaXZlbiB0aW1lIHNvIGZpbHRlciBoZXJlCiAgIGZsb2F0IG1vdmllX3RpbWUgPSBjdXJyZW50X3RpbWUoTlVMTCk7CiAgIGlmIChtb3ZpZV90aW1lICE9IGxhc3RfdGltZV91cGRhdGVfZXZlbnRfbW92aWVfdGltZV8pIHsKLSAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6dGltZXVwZGF0ZSgpKTsKKyAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6dGltZXVwZGF0ZSgpKTsKICAgICBsYXN0X3RpbWVfdXBkYXRlX2V2ZW50X3dhbGxfdGltZV8gPSBub3c7CiAgICAgbGFzdF90aW1lX3VwZGF0ZV9ldmVudF9tb3ZpZV90aW1lXyA9IG1vdmllX3RpbWU7CiAgIH0KIH0KIAotdm9pZCBIVE1MTWVkaWFFbGVtZW50OjpTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2VuIGV2ZW50X25hbWUpIHsKK3ZvaWQgSFRNTE1lZGlhRWxlbWVudDo6U2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbiBldmVudF9uYW1lKSB7CiAgIE1MT0coKSA8PCBldmVudF9uYW1lOwogICBzY29wZWRfcmVmcHRyPEV2ZW50PiBldmVudCA9CiAgICAgICBuZXcgRXZlbnQoZXZlbnRfbmFtZSwgRXZlbnQ6OmtOb3RCdWJibGVzLCBFdmVudDo6a0NhbmNlbGFibGUpOwogICBldmVudC0+c2V0X3RhcmdldCh0aGlzKTsKIAotICBldmVudF9xdWV1ZV8uRW5xdWV1ZShldmVudCk7CisgIFNjaGVkdWxlRXZlbnQoZXZlbnQpOwogfQogCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OkNhbmNlbFBlbmRpbmdFdmVudHNBbmRDYWxsYmFja3MoKSB7CkBAIC0xMDA1LDcgKzEwNDAsNyBAQAogICAgIC8vIDQuOC4xMC45LCBzdGVwIDExCiAgICAgaWYgKHdhc19wb3RlbnRpYWxseV9wbGF5aW5nICYmCiAgICAgICAgIHJlYWR5X3N0YXRlXyA8IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVGdXR1cmVEYXRhKSB7Ci0gICAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6d2FpdGluZygpKTsKKyAgICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjp3YWl0aW5nKCkpOwogICAgIH0KICAgICAvLyA0LjguMTAuMTAgc3RlcCAxNCAmIDE1LgogICAgIGlmIChyZWFkeV9zdGF0ZV8gPj0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZUN1cnJlbnREYXRhKSB7CkBAIC0xMDE2LDQ5ICsxMDUxLDUwIEBACiAgICAgICAgIHJlYWR5X3N0YXRlXyA8IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVGdXR1cmVEYXRhKSB7CiAgICAgICAvLyA0LjguMTAuOAogICAgICAgU2NoZWR1bGVUaW1ldXBkYXRlRXZlbnQoZmFsc2UpOwotICAgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OndhaXRpbmcoKSk7CisgICAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6d2FpdGluZygpKTsKICAgICB9CiAgIH0KIAogICBpZiAocmVhZHlfc3RhdGVfID49IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVNZXRhZGF0YSAmJgogICAgICAgb2xkX3N0YXRlIDwgV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU1ldGFkYXRhKSB7Ci0gICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OmR1cmF0aW9uY2hhbmdlKCkpOwotICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpsb2FkZWRtZXRhZGF0YSgpKTsKKyAgICBQbGF5ZXJPdXRwdXRNb2RlVXBkYXRlZCgpOworICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpkdXJhdGlvbmNoYW5nZSgpKTsKKyAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6bG9hZGVkbWV0YWRhdGEoKSk7CiAgIH0KIAogICBpZiAocmVhZHlfc3RhdGVfID49IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVDdXJyZW50RGF0YSAmJgogICAgICAgb2xkX3N0YXRlIDwgV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZUN1cnJlbnREYXRhICYmCiAgICAgICAhaGF2ZV9maXJlZF9sb2FkZWRfZGF0YV8pIHsKICAgICBoYXZlX2ZpcmVkX2xvYWRlZF9kYXRhXyA9IHRydWU7Ci0gICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OmxvYWRlZGRhdGEoKSk7CisgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmxvYWRlZGRhdGEoKSk7CiAgIH0KIAogICBib29sIGlzX3BvdGVudGlhbGx5X3BsYXlpbmcgPSBQb3RlbnRpYWxseVBsYXlpbmcoKTsKICAgaWYgKHJlYWR5X3N0YXRlXyA9PSBXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlRnV0dXJlRGF0YSAmJgogICAgICAgb2xkX3N0YXRlIDw9IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVDdXJyZW50RGF0YSkgewotICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpjYW5wbGF5KCkpOworICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpjYW5wbGF5KCkpOwogICAgIGlmIChpc19wb3RlbnRpYWxseV9wbGF5aW5nKSB7Ci0gICAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6cGxheWluZygpKTsKKyAgICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpwbGF5aW5nKCkpOwogICAgIH0KICAgfQogCiAgIGlmIChyZWFkeV9zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZUVub3VnaERhdGEgJiYKICAgICAgIG9sZF9zdGF0ZSA8IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVFbm91Z2hEYXRhKSB7CiAgICAgaWYgKG9sZF9zdGF0ZSA8PSBXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlQ3VycmVudERhdGEpIHsKLSAgICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpjYW5wbGF5KCkpOworICAgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmNhbnBsYXkoKSk7CiAgICAgfQogCi0gICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OmNhbnBsYXl0aHJvdWdoKCkpOworICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpjYW5wbGF5dGhyb3VnaCgpKTsKIAogICAgIGlmIChpc19wb3RlbnRpYWxseV9wbGF5aW5nICYmCiAgICAgICAgIG9sZF9zdGF0ZSA8PSBXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlQ3VycmVudERhdGEpIHsKLSAgICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpwbGF5aW5nKCkpOworICAgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OnBsYXlpbmcoKSk7CiAgICAgfQogCiAgICAgaWYgKGF1dG9wbGF5aW5nXyAmJiBwYXVzZWRfICYmIGF1dG9wbGF5KCkpIHsKICAgICAgIHBhdXNlZF8gPSBmYWxzZTsKLSAgICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpwbGF5KCkpOwotICAgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnBsYXlpbmcoKSk7CisgICAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6cGxheSgpKTsKKyAgICAgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpwbGF5aW5nKCkpOwogICAgIH0KICAgfQogCkBAIC0xMTA3LDggKzExNDMsOCBAQAogCiAgIC8vIFNjaGVkdWxlIG9uZSBsYXN0IHByb2dyZXNzIGV2ZW50IHNvIHdlIGd1YXJhbnRlZSB0aGF0IGF0IGxlYXN0IG9uZSBpcyBmaXJlZAogICAvLyBmb3IgZmlsZXMgdGhhdCBsb2FkIHZlcnkgcXVpY2tseS4KLSAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnByb2dyZXNzKCkpOwotICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6c3VzcGVuZCgpKTsKKyAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OnByb2dyZXNzKCkpOworICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6c3VzcGVuZCgpKTsKICAgbmV0d29ya19zdGF0ZV8gPSBrTmV0d29ya0lkbGU7CiB9CiAKQEAgLTExNTgsMTYgKzExOTQsMTUgQEAKICAgLy8gQWx3YXlzIG5vdGlmeSB0aGUgbWVkaWEgZW5naW5lIG9mIGEgc2VlayBpZiB0aGUgc291cmNlIGlzIG5vdCBjbG9zZWQuIFRoaXMKICAgLy8gZW5zdXJlcyB0aGF0IHRoZSBzb3VyY2UgaXMgYWx3YXlzIGluIGEgZmx1c2hlZCBzdGF0ZSB3aGVuIHRoZSAnc2Vla2luZycKICAgLy8gZXZlbnQgZmlyZXMuCi0gIGlmIChtZWRpYV9zb3VyY2VfICYmCi0gICAgICBtZWRpYV9zb3VyY2VfLT5HZXRSZWFkeVN0YXRlKCkgIT0gTWVkaWFTb3VyY2U6OmtSZWFkeVN0YXRlQ2xvc2VkKSB7CisgIGlmIChtZWRpYV9zb3VyY2VfICYmIG1lZGlhX3NvdXJjZV8tPnJlYWR5X3N0YXRlKCkgIT0gTWVkaWFTb3VyY2U6OmtDbG9zZWQpIHsKICAgICBub19zZWVrX3JlcXVpcmVkID0gZmFsc2U7CiAgIH0KIAogICBpZiAobm9fc2Vla19yZXF1aXJlZCkgewogICAgIGlmICh0aW1lID09IG5vdykgewotICAgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnNlZWtpbmcoKSk7CisgICAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6c2Vla2luZygpKTsKICAgICAgIFNjaGVkdWxlVGltZXVwZGF0ZUV2ZW50KGZhbHNlKTsKLSAgICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpzZWVrZWQoKSk7CisgICAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6c2Vla2VkKCkpOwogICAgIH0KICAgICBzZWVraW5nXyA9IGZhbHNlOwogICAgIHJldHVybjsKQEAgLTExODYsNyArMTIyMSw3IEBACiAgIHBsYXllcl8tPlNlZWsodGltZSk7CiAKICAgLy8gOSAtIFF1ZXVlIGEgdGFzayB0byBmaXJlIGEgc2ltcGxlIGV2ZW50IG5hbWVkIHNlZWtpbmcgYXQgdGhlIGVsZW1lbnQuCi0gIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpzZWVraW5nKCkpOworICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6c2Vla2luZygpKTsKIAogICAvLyAxMCAtIFF1ZXVlIGEgdGFzayB0byBmaXJlIGEgc2ltcGxlIGV2ZW50IG5hbWVkIHRpbWV1cGRhdGUgYXQgdGhlIGVsZW1lbnQuCiAgIFNjaGVkdWxlVGltZXVwZGF0ZUV2ZW50KGZhbHNlKTsKQEAgLTEyMDAsNyArMTIzNSw3IEBACiAgIHNlZWtpbmdfID0gZmFsc2U7CiAKICAgLy8gNC44LjEwLjkgU2Vla2luZyBzdGVwIDE1Ci0gIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpzZWVrZWQoKSk7CisgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjpzZWVrZWQoKSk7CiB9CiAKIHZvaWQgSFRNTE1lZGlhRWxlbWVudDo6QWRkUGxheWVkUmFuZ2UoZmxvYXQgc3RhcnQsIGZsb2F0IGVuZCkgewpAQCAtMTMzNCwxNCArMTM2OSwxNCBAQAogICBlcnJvcl8gPSBlcnJvcjsKIAogICAvLyAzIC0gUXVldWUgYSB0YXNrIHRvIGZpcmUgYSBzaW1wbGUgZXZlbnQgbmFtZWQgZXJyb3IgYXQgdGhlIG1lZGlhIGVsZW1lbnQuCi0gIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjplcnJvcigpKTsKKyAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmVycm9yKCkpOwogCi0gIFNldFNvdXJjZVN0YXRlKE1lZGlhU291cmNlOjprUmVhZHlTdGF0ZUNsb3NlZCk7CisgIENsZWFyTWVkaWFTb3VyY2UoKTsKIAogICAvLyA0IC0gU2V0IHRoZSBlbGVtZW50J3MgbmV0d29ya1N0YXRlIGF0dHJpYnV0ZSB0byB0aGUga05ldHdvcmtFbXB0eSB2YWx1ZSBhbmQKICAgLy8gcXVldWUgYSB0YXNrIHRvIGZpcmUgYSBzaW1wbGUgZXZlbnQgY2FsbGVkIGVtcHRpZWQgYXQgdGhlIGVsZW1lbnQuCiAgIG5ldHdvcmtfc3RhdGVfID0ga05ldHdvcmtFbXB0eTsKLSAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OmVtcHRpZWQoKSk7CisgIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW5zOjplbXB0aWVkKCkpOwogfQogCiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6Ok5ldHdvcmtTdGF0ZUNoYW5nZWQoKSB7CkBAIC0xNDA2LDEyICsxNDQxLDEyIEBACiAgICAgICAgIC8vIGNoYW5nZXMgcGF1c2VkIHRvIHRydWUgYW5kIGZpcmVzIGEgc2ltcGxlIGV2ZW50IG5hbWVkIHBhdXNlIGF0IHRoZQogICAgICAgICAvLyBtZWRpYSBlbGVtZW50LgogICAgICAgICBwYXVzZWRfID0gdHJ1ZTsKLSAgICAgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnBhdXNlKCkpOworICAgICAgICBTY2hlZHVsZU93bkV2ZW50KGJhc2U6OlRva2Vuczo6cGF1c2UoKSk7CiAgICAgICB9CiAgICAgICAvLyBRdWV1ZSBhIHRhc2sgdG8gZmlyZSBhIHNpbXBsZSBldmVudCBuYW1lZCBlbmRlZCBhdCB0aGUgbWVkaWEgZWxlbWVudC4KICAgICAgIGlmICghc2VudF9lbmRfZXZlbnRfKSB7CiAgICAgICAgIHNlbnRfZW5kX2V2ZW50XyA9IHRydWU7Ci0gICAgICAgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjplbmRlZCgpKTsKKyAgICAgICAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmVuZGVkKCkpOwogICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKQEAgLTE0MjUsNyArMTQ2MCw3IEBACiB2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OkR1cmF0aW9uQ2hhbmdlZCgpIHsKICAgQmVnaW5Qcm9jZXNzaW5nTWVkaWFQbGF5ZXJDYWxsYmFjaygpOwogCi0gIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpkdXJhdGlvbmNoYW5nZSgpKTsKKyAgU2NoZWR1bGVPd25FdmVudChiYXNlOjpUb2tlbnM6OmR1cmF0aW9uY2hhbmdlKCkpOwogCiAgIGZsb2F0IG5vdyA9IGN1cnJlbnRfdGltZShOVUxMKTsKICAgZmxvYXQgZHVyID0gZHVyYXRpb24oKTsKQEAgLTE0NTQsMTEgKzE0ODksMjAgQEAKIAogZmxvYXQgSFRNTE1lZGlhRWxlbWVudDo6Vm9sdW1lKCkgY29uc3QgeyByZXR1cm4gdm9sdW1lKE5VTEwpOyB9CiAKLXZvaWQgSFRNTE1lZGlhRWxlbWVudDo6U291cmNlT3BlbmVkKCkgeworI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQordm9pZCBIVE1MTWVkaWFFbGVtZW50OjpTb3VyY2VPcGVuZWQoOjptZWRpYTo6Q2h1bmtEZW11eGVyKiBjaHVua19kZW11eGVyKSB7CiAgIEJlZ2luUHJvY2Vzc2luZ01lZGlhUGxheWVyQ2FsbGJhY2soKTsKLSAgU2V0U291cmNlU3RhdGUoTWVkaWFTb3VyY2U6OmtSZWFkeVN0YXRlT3Blbik7CisgIERDSEVDSyhtZWRpYV9zb3VyY2VfKTsKKyAgbWVkaWFfc291cmNlXy0+U2V0Q2h1bmtEZW11eGVyQW5kT3BlbihjaHVua19kZW11eGVyKTsKICAgRW5kUHJvY2Vzc2luZ01lZGlhUGxheWVyQ2FsbGJhY2soKTsKIH0KKyNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCit2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OlNvdXJjZU9wZW5lZCgpIHsKKyAgQmVnaW5Qcm9jZXNzaW5nTWVkaWFQbGF5ZXJDYWxsYmFjaygpOworICBTZXRTb3VyY2VTdGF0ZShNZWRpYVNvdXJjZTo6a09wZW4pOworICBFbmRQcm9jZXNzaW5nTWVkaWFQbGF5ZXJDYWxsYmFjaygpOworfQorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIAogc3RkOjpzdHJpbmcgSFRNTE1lZGlhRWxlbWVudDo6U291cmNlVVJMKCkgY29uc3QgewogICByZXR1cm4gbWVkaWFfc291cmNlX3VybF8uc3BlYygpOwpAQCAtMTUyNSwxNiArMTU2OSwzNyBAQAogICAgICAgbmV3IFVpbnQ4QXJyYXkoTlVMTCwgaW5pdF9kYXRhLCBpbml0X2RhdGFfbGVuZ3RoLCBOVUxMKSkpOwogfQogCit2b2lkIEhUTUxNZWRpYUVsZW1lbnQ6OkNsZWFyTWVkaWFTb3VyY2UoKSB7CisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIGlmIChtZWRpYV9zb3VyY2VfKSB7CisgICAgbWVkaWFfc291cmNlXy0+Q2xvc2UoKTsKKyAgICBtZWRpYV9zb3VyY2VfID0gTlVMTDsKKyAgfQorI2Vsc2UgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorICBTZXRTb3VyY2VTdGF0ZShNZWRpYVNvdXJjZTo6a0Nsb3NlZCk7CisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorfQorCisjaWYgIWRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogdm9pZCBIVE1MTWVkaWFFbGVtZW50OjpTZXRTb3VyY2VTdGF0ZShNZWRpYVNvdXJjZTo6UmVhZHlTdGF0ZSByZWFkeV9zdGF0ZSkgewogICBNTE9HKCkgPDwgcmVhZHlfc3RhdGU7CiAgIGlmICghbWVkaWFfc291cmNlXykgewogICAgIHJldHVybjsKICAgfQogICBtZWRpYV9zb3VyY2VfLT5TZXRSZWFkeVN0YXRlKHJlYWR5X3N0YXRlKTsKLSAgaWYgKHJlYWR5X3N0YXRlID09IE1lZGlhU291cmNlOjprUmVhZHlTdGF0ZUNsb3NlZCkgeworICBpZiAocmVhZHlfc3RhdGUgPT0gTWVkaWFTb3VyY2U6OmtDbG9zZWQpIHsKICAgICBtZWRpYV9zb3VyY2VfID0gTlVMTDsKICAgfQogfQorI2VuZGlmICAvLyAhZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKK3ZvaWQgSFRNTE1lZGlhRWxlbWVudDo6UGxheWVyT3V0cHV0TW9kZVVwZGF0ZWQoKSB7CisgIC8vIElmIHRoZSBwbGF5ZXIgbW9kZSBpcyB1cGRhdGVkLCB0cmlnZ2VyIGEgcmUtbGF5b3V0IHNvIHRoYXQgd2UgY2FuIHNldHVwCisgIC8vIHRoZSB2aWRlbyByZW5kZXIgdHJlZSBkaWZmZXJlbnRseSBkZXBlbmRpbmcgb24gd2hldGhlciB3ZSBhcmUgaW4gcHVuY2gtb3V0CisgIC8vIG9yIGRlY29kZS10by10ZXh0dXJlLgorICBub2RlX2RvY3VtZW50KCktPk9uRE9NTXV0YXRpb24oKTsKKyAgSW52YWxpZGF0ZUxheW91dEJveGVzRnJvbU5vZGVBbmRBbmNlc3RvcnMoKTsKK30KIAogfSAgLy8gbmFtZXNwYWNlIGRvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaAppbmRleCA5MGJmYTdjLi5kMThkYTA4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9IVE1MX01FRElBX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX01FRElBX0VMRU1FTlRfSF8KQEAgLTI3LDE3ICsyNSwyMyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfcXVldWUuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfZWxlbWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfZXJyb3IuaCIKLSNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vdGltZV9yYW5nZXMuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3VpbnQ4X2FycmF5LmgiCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9jYWNoZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCiAjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgiCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuaCIKICNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oIgorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZG9tIHsKIAorY2xhc3MgTWVkaWFTb3VyY2U7CisKIC8vIFRoZSBIVE1MTWVkaWFFbGVtZW50IGlzIHRoZSBiYXNlIG9mIEhUTUxBdWRpb0VsZW1lbnQgYW5kIEhUTUxWaWRlb0VsZW1lbnQuCiAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNtZWRpYS1lbGVtZW50CiAvLyBJdCBhbHNvIGltcGxlbWVudHMgbWV0aG9kcyBkZWZpbmVkIGluIEVuY3J5cHRlZCBNZWRpYSBFeHRlbnNpb25zLgpAQCAtMTMwLDYgKzEzNCwxNSBAQAogICAvLyBGcm9tIE5vZGUKICAgdm9pZCBPbkluc2VydGVkSW50b0RvY3VtZW50KCkgT1ZFUlJJREU7CiAKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyAgLy8gQ2FsbGVkIGJ5IE1lZGlhU291cmNlCisgIHZvaWQgRHVyYXRpb25DaGFuZ2VkKGRvdWJsZSBkdXJhdGlvbiwgYm9vbCByZXF1ZXN0X3NlZWspOworI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKworICAvLyBMZXQgb3RoZXIgb2JqZWN0cyBhZGQgZXZlbnQgdG8gdGhlIEV2ZW50UXVldWUgb2YgSFRNTE1lZGlhRWxlbWVudC4gIFRoaXMKKyAgLy8gZnVuY3Rpb24gd29uJ3QgbW9kaWZ5IHRoZSB0YXJnZXQgb2YgdGhlIHxldmVudHwgcGFzc2VkIGluLgorICB2b2lkIFNjaGVkdWxlRXZlbnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudD4mIGV2ZW50KTsKKwogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoSFRNTE1lZGlhRWxlbWVudCk7CiAKICBwcm90ZWN0ZWQ6CkBAIC0xNjEsNyArMTc0LDcgQEAKIAogICAvLyBFdmVudHMKICAgdm9pZCBTY2hlZHVsZVRpbWV1cGRhdGVFdmVudChib29sIHBlcmlvZGljX2V2ZW50KTsKLSAgdm9pZCBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2VuIGV2ZW50X25hbWUpOworICB2b2lkIFNjaGVkdWxlT3duRXZlbnQoYmFzZTo6VG9rZW4gZXZlbnRfbmFtZSk7CiAgIHZvaWQgQ2FuY2VsUGVuZGluZ0V2ZW50c0FuZENhbGxiYWNrcygpOwogICBib29sIFByb2Nlc3NpbmdNZWRpYVBsYXllckNhbGxiYWNrKCkgY29uc3QgewogICAgIHJldHVybiBwcm9jZXNzaW5nX21lZGlhX3BsYXllcl9jYWxsYmFja18gPiAwOwpAQCAtMjA1LDcgKzIxOCwxMSBAQAogICB2b2lkIFBsYXliYWNrU3RhdGVDaGFuZ2VkKCkgT1ZFUlJJREU7CiAgIHZvaWQgU2F3VW5zdXBwb3J0ZWRUcmFja3MoKSBPVkVSUklERTsKICAgZmxvYXQgVm9sdW1lKCkgY29uc3QgT1ZFUlJJREU7CisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIHZvaWQgU291cmNlT3BlbmVkKDo6bWVkaWE6OkNodW5rRGVtdXhlciogY2h1bmtfZGVtdXhlcikgT1ZFUlJJREU7CisjZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogICB2b2lkIFNvdXJjZU9wZW5lZCgpIE9WRVJSSURFOworI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICAgc3RkOjpzdHJpbmcgU291cmNlVVJMKCkgY29uc3QgT1ZFUlJJREU7CiAgIHZvaWQgS2V5QWRkZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQpIE9WRVJSSURFOwpAQCAtMjE3LDggKzIzNCwxNCBAQAogICB2b2lkIEtleU5lZWRlZChjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwgY29uc3Qgc3RkOjpzdHJpbmcmIHNlc3Npb25faWQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXRfZGF0YSwKICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IGluaXRfZGF0YV9sZW5ndGgpIE9WRVJSSURFOwotCisgIHZvaWQgQ2xlYXJNZWRpYVNvdXJjZSgpOworI2lmICFkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICAgdm9pZCBTZXRTb3VyY2VTdGF0ZShNZWRpYVNvdXJjZTo6UmVhZHlTdGF0ZSByZWFkeV9zdGF0ZSk7CisjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKworICAvLyBDYWxsZWQgd2hlbmV2ZXIgdGhlIHBsYXllcidzIG91dHB1dCBtb2RlIChlLmcuIHB1bmNoLW91dCwKKyAgLy8gZGVjb2RlLXRvLXRleHR1cmUpIGlzIHVwZGF0ZWQuCisgIHZvaWQgUGxheWVyT3V0cHV0TW9kZVVwZGF0ZWQoKTsKIAogICBzY29wZWRfcHRyPFdlYk1lZGlhUGxheWVyPiBwbGF5ZXJfOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21lZGlhX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MjVhZTY3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmlkbApAQCAtMCwwICsxLDcwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjbWVkaWEtZWxlbWVudHMKKworaW50ZXJmYWNlIEhUTUxNZWRpYUVsZW1lbnQgOiBIVE1MRWxlbWVudCB7CisgIC8vIGVycm9yIHN0YXRlCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBNZWRpYUVycm9yPyBlcnJvcjsKKworICAvLyBuZXR3b3JrIHN0YXRlCisgIGF0dHJpYnV0ZSBET01TdHJpbmcgc3JjOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGN1cnJlbnRTcmM7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE5FVFdPUktfRU1QVFkgPSAwOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBORVRXT1JLX0lETEUgPSAxOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBORVRXT1JLX0xPQURJTkcgPSAyOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBORVRXT1JLX05PX1NPVVJDRSA9IDM7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCBuZXR3b3JrU3RhdGU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBUaW1lUmFuZ2VzIGJ1ZmZlcmVkOworICB2b2lkIGxvYWQoKTsKKyAgLy8gVGhlIGtleVN5c3RlbSBhcmd1bWVudCBpcyBhbiBleHRlbnNpb24gZGVmaW5lZCBpbiBFbmNyeXB0ZWQgTWVkaWEgRXh0ZW5zaW9ucy4KKyAgLy8gICBodHRwczovL2R2Y3MudzMub3JnL2hnL2h0bWwtbWVkaWEvcmF3LWZpbGUvZW1lLXYwLjFiL2VuY3J5cHRlZC1tZWRpYS9lbmNyeXB0ZWQtbWVkaWEuaHRtbCNkb20tY2FucGxheXR5cGUKKyAgRE9NU3RyaW5nIGNhblBsYXlUeXBlKERPTVN0cmluZyB0eXBlLCBvcHRpb25hbCBET01TdHJpbmcga2V5U3lzdGVtKTsKKworICAvLyByZWFkeSBzdGF0ZQorICBjb25zdCB1bnNpZ25lZCBzaG9ydCBIQVZFX05PVEhJTkcgPSAwOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBIQVZFX01FVEFEQVRBID0gMTsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgSEFWRV9DVVJSRU5UX0RBVEEgPSAyOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBIQVZFX0ZVVFVSRV9EQVRBID0gMzsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgSEFWRV9FTk9VR0hfREFUQSA9IDQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCByZWFkeVN0YXRlOworICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBzZWVraW5nOworCisgIC8vIHBsYXliYWNrIHN0YXRlCisgIFtSYWlzZXNFeGNlcHRpb25dIGF0dHJpYnV0ZSBkb3VibGUgY3VycmVudFRpbWU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgZHVyYXRpb247CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIHBhdXNlZDsKKyAgYXR0cmlidXRlIGRvdWJsZSBkZWZhdWx0UGxheWJhY2tSYXRlOworICBhdHRyaWJ1dGUgZG91YmxlIHBsYXliYWNrUmF0ZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIFRpbWVSYW5nZXMgcGxheWVkOworICByZWFkb25seSBhdHRyaWJ1dGUgVGltZVJhbmdlcyBzZWVrYWJsZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gZW5kZWQ7CisgIGF0dHJpYnV0ZSBib29sZWFuIGF1dG9wbGF5OworICBhdHRyaWJ1dGUgYm9vbGVhbiBsb29wOworICB2b2lkIHBsYXkoKTsKKyAgdm9pZCBwYXVzZSgpOworCisgIC8vIGNvbnRyb2xzCisgIGF0dHJpYnV0ZSBib29sZWFuIGNvbnRyb2xzOworICBbUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgZG91YmxlIHZvbHVtZTsKKyAgYXR0cmlidXRlIGJvb2xlYW4gbXV0ZWQ7CisKKyAgLy8gRW5jcnlwdGVkIE1lZGlhIEV4dGVuc2lvbnMgbWV0aG9kcworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGdlbmVyYXRlS2V5UmVxdWVzdChET01TdHJpbmcga2V5U3lzdGVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5PyBpbml0RGF0YSk7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgYWRkS2V5KERPTVN0cmluZyBrZXlTeXN0ZW0sIFVpbnQ4QXJyYXkga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVaW50OEFycmF5PyBpbml0RGF0YSwgRE9NU3RyaW5nPyBzZXNzaW9uSWQpOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGNhbmNlbEtleVJlcXVlc3QoRE9NU3RyaW5nIGtleVN5c3RlbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZz8gc2Vzc2lvbklkKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX21ldGFfZWxlbWVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWV0YV9lbGVtZW50LmNjCmluZGV4IDVlYzdlNjkuLjMyNWEzNjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWV0YV9lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWV0YV9lbGVtZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9tZXRhX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9tZXRhX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWV0YV9lbGVtZW50LmgKaW5kZXggZmRhMTJkMy4uYTE3ZGQ1NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9tZXRhX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX21ldGFfZWxlbWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0hUTUxfTUVUQV9FTEVNRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fSFRNTF9NRVRBX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWV0YV9lbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfbWV0YV9lbGVtZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYjViNDFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9tZXRhX2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kb2N1bWVudC1tZXRhZGF0YS5odG1sI3RoZS1tZXRhLWVsZW1lbnQKKworaW50ZXJmYWNlIEhUTUxNZXRhRWxlbWVudCA6IEhUTUxFbGVtZW50IHsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBuYW1lOworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGh0dHBFcXVpdjsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBjb250ZW50OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfcGFyYWdyYXBoX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX3BhcmFncmFwaF9lbGVtZW50LmNjCmluZGV4IDk2Y2MyY2MuLjM4OWY2YmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfcGFyYWdyYXBoX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9wYXJhZ3JhcGhfZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfcGFyYWdyYXBoX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9wYXJhZ3JhcGhfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9wYXJhZ3JhcGhfZWxlbWVudC5oCmluZGV4IDFkZDBlYjkuLmI4OGI1NTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfcGFyYWdyYXBoX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3BhcmFncmFwaF9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9QQVJBR1JBUEhfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfUEFSQUdSQVBIX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfcGFyYWdyYXBoX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9wYXJhZ3JhcGhfZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWM2OTI4YwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfcGFyYWdyYXBoX2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9ncm91cGluZy1jb250ZW50Lmh0bWwjdGhlLXAtZWxlbWVudAorCitpbnRlcmZhY2UgSFRNTFBhcmFncmFwaEVsZW1lbnQgOiBIVE1MRWxlbWVudCB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfc2NyaXB0X2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmNjCmluZGV4IDU1ODQ1NTcuLjg0MDQ1OGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfc2NyaXB0X2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfc2NyaXB0X2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5oCmluZGV4IGFhNTIzZGIuLjgzMDcxNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfc2NyaXB0X2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9TQ1JJUFRfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfU0NSSVBUX0VMRU1FTlRfSF8KQEAgLTU1LDEwICs1MywxMCBAQAogICBzdGQ6OnN0cmluZyBub25jZSgpIGNvbnN0IHsgcmV0dXJuIEdldEF0dHJpYnV0ZSgibm9uY2UiKS52YWx1ZV9vcigiIik7IH0KICAgdm9pZCBzZXRfbm9uY2UoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IFNldEF0dHJpYnV0ZSgibm9uY2UiLCB2YWx1ZSk7IH0KIAotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbnJlYWR5c3RhdGVjaGFuZ2UoKSBjb25zdCB7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25yZWFkeXN0YXRlY2hhbmdlKCkgY29uc3QgewogICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6cmVhZHlzdGF0ZWNoYW5nZSgpKTsKICAgfQotICB2b2lkIHNldF9vbnJlYWR5c3RhdGVjaGFuZ2UoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgZXZlbnRfbGlzdGVuZXIpIHsKKyAgdm9pZCBzZXRfb25yZWFkeXN0YXRlY2hhbmdlKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgZXZlbnRfbGlzdGVuZXIpIHsKICAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6cmVhZHlzdGF0ZWNoYW5nZSgpLCBldmVudF9saXN0ZW5lcik7CiAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX3NjcmlwdF9lbGVtZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NjdiMTMxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zY3JpcHRfZWxlbWVudC5pZGwKQEAgLTAsMCArMSwzMyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3NjcmlwdGluZy0xLmh0bWwjdGhlLXNjcmlwdC1lbGVtZW50CisKK2ludGVyZmFjZSBIVE1MU2NyaXB0RWxlbWVudCA6IEhUTUxFbGVtZW50IHsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBzcmM7CisgIGF0dHJpYnV0ZSBET01TdHJpbmcgdHlwZTsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBjaGFyc2V0OworICBhdHRyaWJ1dGUgYm9vbGVhbiBhc3luYzsKKyAgLy8gRnJvbSBDb250ZW50IFNlY3VyaXR5IFBvbGljeSBzcGVjLgorICBhdHRyaWJ1dGUgRE9NU3RyaW5nIG5vbmNlOworCisgIC8vIFRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYnV0IGl0IGlzIG5lZWRlZCB0byB3b3JrYXJvdW5kIGZvciBsYWNrIG9mCisgIC8vIFByb21pc2UuCisgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25yZWFkeXN0YXRlY2hhbmdlOworfTsKKworLy8gVE9ETzogVGhlIElETCBkZWZpbmVzIEV2ZW50SGFuZGxlciBhcyBhIG51bGxhYmxlIGNhbGxiYWNrCisvLyBmdW5jdGlvbi4gRGVmaW5lIGl0IGFzIGEgbnVsbGFibGUgRXZlbnRMaXN0ZW5lciBmb3Igbm93IHVudGlsIHdlIGNhbiBkbworLy8gc29tZSByZWZhY3RvcmluZyB0byBhY2NlcHQgYm90aCBpbiB0aGUgRXZlbnRUYXJnZXQgaW1wbGVtZW50YXRpb24uCit0eXBlZGVmIEV2ZW50TGlzdGVuZXI/IEV2ZW50SGFuZGxlcjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3Bhbl9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zcGFuX2VsZW1lbnQuY2MKaW5kZXggMjkxOTUzOS4uNDcyZGQ4NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9zcGFuX2VsZW1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zcGFuX2VsZW1lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX3NwYW5fZWxlbWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3NwYW5fZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zcGFuX2VsZW1lbnQuaAppbmRleCBlOGFhMDQ2Li4wMTIyYjkyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX3NwYW5fZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3Bhbl9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9TUEFOX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX1NQQU5fRUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9zcGFuX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF9zcGFuX2VsZW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1MTlhNmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3NwYW5fZWxlbWVudC5pZGwKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3RleHQtbGV2ZWwtc2VtYW50aWNzLmh0bWwjdGhlLXNwYW4tZWxlbWVudAorCitpbnRlcmZhY2UgSFRNTFNwYW5FbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3N0eWxlX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX3N0eWxlX2VsZW1lbnQuY2MKaW5kZXggODhhNTYyNi4uNjE2ODUxZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF9zdHlsZV9lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3R5bGVfZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfc3R5bGVfZWxlbWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3N0eWxlX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3R5bGVfZWxlbWVudC5oCmluZGV4IDFiYWE0MzUuLmQwMzIxMzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3R5bGVfZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3R5bGVfZWxlbWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0hUTUxfU1RZTEVfRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfU1RZTEVfRUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF9zdHlsZV9lbGVtZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3R5bGVfZWxlbWVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTNjZGZiNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfc3R5bGVfZWxlbWVudC5pZGwKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvY3VtZW50LW1ldGFkYXRhLmh0bWwjdGhlLXN0eWxlLWVsZW1lbnQKKworaW50ZXJmYWNlIEhUTUxTdHlsZUVsZW1lbnQgOiBIVE1MRWxlbWVudCB7CisgIGF0dHJpYnV0ZSBET01TdHJpbmcgdHlwZTsKK307CitIVE1MU3R5bGVFbGVtZW50IGltcGxlbWVudHMgTGlua1N0eWxlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF90aXRsZV9lbGVtZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vaHRtbF90aXRsZV9lbGVtZW50LmNjCmluZGV4IDA0N2ViOTcuLmEwYTU3YmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfdGl0bGVfZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF90aXRsZV9lbGVtZW50LmggYi9zcmMvY29iYWx0L2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuaAppbmRleCA3Yjk1Y2JiLi4wNTRjMTA5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9IVE1MX1RJVExFX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX1RJVExFX0VMRU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfdGl0bGVfZWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcxOTQ4NjgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3RpdGxlX2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9kb2N1bWVudC1tZXRhZGF0YS5odG1sI3RoZS10aXRsZS1lbGVtZW50CisKK2ludGVyZmFjZSBIVE1MVGl0bGVFbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3Vua25vd25fZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vaHRtbF91bmtub3duX2VsZW1lbnQuaAppbmRleCBiNTkxNGEwLi5kMWI0OGZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9odG1sX3Vua25vd25fZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfdW5rbm93bl9lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSFRNTF9VTktOT1dOX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9IVE1MX1VOS05PV05fRUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaHRtbF91bmtub3duX2VsZW1lbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vaHRtbF91bmtub3duX2VsZW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMyMGE0ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3Vua25vd25fZWxlbWVudC5pZGwKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2RvbS5odG1sI2h0bWx1bmtub3duZWxlbWVudAorCitpbnRlcmZhY2UgSFRNTFVua25vd25FbGVtZW50IDogSFRNTEVsZW1lbnQge307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3ZpZGVvX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9odG1sX3ZpZGVvX2VsZW1lbnQuY2MKaW5kZXggMWQyNTQxNS4uNGE5MjZlNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vaHRtbF92aWRlb19lbGVtZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfdmlkZW9fZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfdmlkZW9fZWxlbWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9odG1sX3ZpZGVvX2VsZW1lbnQuaCBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfdmlkZW9fZWxlbWVudC5oCmluZGV4IGQ5ZjA5NTMuLmI0ZmU5NTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfdmlkZW9fZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2h0bWxfdmlkZW9fZWxlbWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0hUTUxfVklERU9fRUxFTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0hUTUxfVklERU9fRUxFTUVOVF9IXwpAQCAtMjIsNyArMjAsOSBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS92aWRlb19wbGF5YmFja19xdWFsaXR5LmgiCiAjaW5jbHVkZSAiY29iYWx0L21hdGgvcmVjdC5oIgorI2lmICFkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgiCisjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZG9tIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2h0bWxfdmlkZW9fZWxlbWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9odG1sX3ZpZGVvX2VsZW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMjU5YWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9odG1sX3ZpZGVvX2VsZW1lbnQuaWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCN0aGUtdmlkZW8tZWxlbWVudAorCitpbnRlcmZhY2UgSFRNTFZpZGVvRWxlbWVudCA6IEhUTUxNZWRpYUVsZW1lbnQgeworICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB3aWR0aDsKKyAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgaGVpZ2h0OworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB2aWRlb1dpZHRoOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyB2aWRlb0hlaWdodDsKKworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWEtc291cmNlLyN3aWRsLUhUTUxWaWRlb0VsZW1lbnQtZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHktVmlkZW9QbGF5YmFja1F1YWxpdHkKKyAgVmlkZW9QbGF5YmFja1F1YWxpdHkgZ2V0VmlkZW9QbGF5YmFja1F1YWxpdHkoKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9pbml0aWFsX2NvbXB1dGVkX3N0eWxlLmNjIGIvc3JjL2NvYmFsdC9kb20vaW5pdGlhbF9jb21wdXRlZF9zdHlsZS5jYwppbmRleCA2OGQxMThjLi5kY2MwNmYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9pbml0aWFsX2NvbXB1dGVkX3N0eWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2luaXRpYWxfY29tcHV0ZWRfc3R5bGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9pbml0aWFsX2NvbXB1dGVkX3N0eWxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2luaXRpYWxfY29tcHV0ZWRfc3R5bGUuaCBiL3NyYy9jb2JhbHQvZG9tL2luaXRpYWxfY29tcHV0ZWRfc3R5bGUuaAppbmRleCBjMjdiODY2Li41NmQwNzc3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9pbml0aWFsX2NvbXB1dGVkX3N0eWxlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vaW5pdGlhbF9jb21wdXRlZF9zdHlsZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0lOSVRJQUxfQ09NUFVURURfU1RZTEVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9JTklUSUFMX0NPTVBVVEVEX1NUWUxFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9pbnQxNl9hcnJheS5oIGIvc3JjL2NvYmFsdC9kb20vaW50MTZfYXJyYXkuaAppbmRleCBhNGEyODIxLi4zNTRhZWNlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9pbnQxNl9hcnJheS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2ludDE2X2FycmF5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fSU5UMTZfQVJSQVlfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9JTlQxNl9BUlJBWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vaW50MTZfYXJyYXkuaWRsIGIvc3JjL2NvYmFsdC9kb20vaW50MTZfYXJyYXkuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEwZDg2MjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9pbnQxNl9hcnJheS5pZGwKQEAgLTAsMCArMSw0MCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cua2hyb25vcy5vcmcvcmVnaXN0cnkvdHlwZWRhcnJheS9zcGVjcy9sYXRlc3QvIzcKK1sKKyAgQ29uc3RydWN0b3IodW5zaWduZWQgbG9uZyBsZW5ndGgpLAorICBDb25zdHJ1Y3RvcihJbnQxNkFycmF5IGFycmF5KSwKKyAgQ29uc3RydWN0b3IoQXJyYXlCdWZmZXIgYnVmZmVyLCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGJ5dGVPZmZzZXQsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKKyAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzLAorICBSYWlzZXNFeGNlcHRpb249Q29uc3RydWN0b3IKK10KK2ludGVyZmFjZSBJbnQxNkFycmF5IDogQXJyYXlCdWZmZXJWaWV3IHsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBCWVRFU19QRVJfRUxFTUVOVCA9IDI7CisKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCisgIGdldHRlciBzaG9ydCBnZXQodW5zaWduZWQgbG9uZyBpbmRleCk7CisgIHNldHRlciB2b2lkIHNldCh1bnNpZ25lZCBsb25nIGluZGV4LCBzaG9ydCB2YWx1ZSk7CisKKyAgLy8gVE9ETzogV2hlbiBhcnJheXMgb3Igc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQsIHN1cHBvcnQgdGhlbSBoZXJlLgorICAvLyB2b2lkIHNldChzZXF1ZW5jZTxsb25nPiBhcnJheSwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworCisgIC8vIENvcHkgaXRlbXMgaW50byB0aGlzIGFycmF5IGZyb20gc291cmNlLCBzdGFydGluZyBhdCB0aGlzW29mZnNldF0uCisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0KEludDE2QXJyYXkgc291cmNlLCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIG9mZnNldCk7CisKKyAgLy8gUmV0dXJuIGEgbmV3IEludDE2QXJyYXkgdGhhdCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoaXMgb25lLgorICAvLyBDb250YWlucyB0aGlzW3N0YXJ0XS4udGhpc1tlbmRdLiBlbmQgZGVmYXVsdHMgdG8gbGVuZ3RoIGlmIHVuc3BlY2lmaWVkLgorICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gSW50MTZBcnJheSBzdWJhcnJheShsb25nIHN0YXJ0LCBvcHRpb25hbCBsb25nIGVuZCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20va2V5Ym9hcmRfZXZlbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5jYwppbmRleCA1NGExYTJjLi40YWY1YjJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmggYi9zcmMvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5oCmluZGV4IDI4NjE1MjAuLjBiOGIyMzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20va2V5Ym9hcmRfZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9LRVlCT0FSRF9FVkVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0tFWUJPQVJEX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzM2MDdmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmlkbApAQCAtMCwwICsxLDQxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC11aWV2ZW50cy0yMDE1MTIxNS8jaW50ZXJmYWNlLUtleWJvYXJkRXZlbnQKKworW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlKV0KK2ludGVyZmFjZSBLZXlib2FyZEV2ZW50IDogVUlFdmVudCB7CisgIC8vIGVudW0gS2V5TG9jYXRpb25Db2RlCisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgRE9NX0tFWV9MT0NBVElPTl9TVEFOREFSRCA9IDB4MDA7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgRE9NX0tFWV9MT0NBVElPTl9MRUZUID0gMHgwMTsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBET01fS0VZX0xPQ0FUSU9OX1JJR0hUID0gMHgwMjsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBET01fS0VZX0xPQ0FUSU9OX05VTVBBRCA9IDB4MDM7CisKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxvY2F0aW9uOworICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBjdHJsS2V5OworICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBzaGlmdEtleTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gYWx0S2V5OworICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBtZXRhS2V5OworICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiByZXBlYXQ7CisKKyAgYm9vbGVhbiBnZXRNb2RpZmllclN0YXRlKERPTVN0cmluZyB0ZXh0KTsKKworICAvLyBEZXByZWNhdGVkLiBUaGVzZSBmZWF0dXJlcyBoYXZlIGJlZW4gcmVtb3ZlZCBmcm9tIHRoZSBXZWIgc3RhbmRhcmRzLgorICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tTGV2ZWwtMy1FdmVudHMvI2xlZ2FjeS1rZXktbW9kZWxzCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIGtleUNvZGU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIGNoYXJDb2RlOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBrZXlMb2NhdGlvbjsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXlJZGVudGlmaWVyOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9rZXlib2FyZF9ldmVudF90ZXN0LmNjCmluZGV4IDQ0MThjNDEuLmE5Nzk0YjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20va2V5Ym9hcmRfZXZlbnRfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2tleWJvYXJkX2V2ZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2tleWNvZGUuaCBiL3NyYy9jb2JhbHQvZG9tL2tleWNvZGUuaAppbmRleCAyZWU5OTgwLi42MjA0YTMzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9rZXljb2RlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20va2V5Y29kZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0tFWUNPREVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9LRVlDT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9rZXlmcmFtZXNfbWFwX3VwZGF0ZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9rZXlmcmFtZXNfbWFwX3VwZGF0ZXIuY2MKaW5kZXggMWIyYWUzNC4uZGU1OTdhNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20va2V5ZnJhbWVzX21hcF91cGRhdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL2tleWZyYW1lc19tYXBfdXBkYXRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2tleWZyYW1lc19tYXBfdXBkYXRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9rZXlmcmFtZXNfbWFwX3VwZGF0ZXIuaCBiL3NyYy9jb2JhbHQvZG9tL2tleWZyYW1lc19tYXBfdXBkYXRlci5oCmluZGV4IGY0MDkyZGIuLmVkZjNiMmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2tleWZyYW1lc19tYXBfdXBkYXRlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL2tleWZyYW1lc19tYXBfdXBkYXRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX0tFWUZSQU1FU19NQVBfVVBEQVRFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0tFWUZSQU1FU19NQVBfVVBEQVRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbGF5b3V0X2JveGVzLmggYi9zcmMvY29iYWx0L2RvbS9sYXlvdXRfYm94ZXMuaAppbmRleCA5OGVjY2NlLi5iMGRiNmZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9sYXlvdXRfYm94ZXMuaAorKysgYi9zcmMvY29iYWx0L2RvbS9sYXlvdXRfYm94ZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9MQVlPVVRfQk9YRVNfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9MQVlPVVRfQk9YRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuY2MgYi9zcmMvY29iYWx0L2RvbS9sb2NhbF9zdG9yYWdlX2RhdGFiYXNlLmNjCmluZGV4IDZiN2E0Y2MuLmM4N2I5NDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZS5oIGIvc3JjL2NvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZS5oCmluZGV4IGMxOTBjMWMuLjlhN2M0MzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2UuaAorKysgYi9zcmMvY29iYWx0L2RvbS9sb2NhbF9zdG9yYWdlX2RhdGFiYXNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTE9DQUxfU1RPUkFHRV9EQVRBQkFTRV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0xPQ0FMX1NUT1JBR0VfREFUQUJBU0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2xvY2FsX3N0b3JhZ2VfZGF0YWJhc2VfdGVzdC5jYwppbmRleCA2ZjQzNTJjLi4wOWVjMjBhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9sb2NhbF9zdG9yYWdlX2RhdGFiYXNlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbG9jYWxfc3RvcmFnZV9kYXRhYmFzZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9sb2NhdGlvbi5jYyBiL3NyYy9jb2JhbHQvZG9tL2xvY2F0aW9uLmNjCmluZGV4IDcyMDJhM2ZkLi5iOWZmNDEzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9sb2NhdGlvbi5jYworKysgYi9zcmMvY29iYWx0L2RvbS9sb2NhdGlvbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL2xvY2F0aW9uLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL2xvY2F0aW9uLmggYi9zcmMvY29iYWx0L2RvbS9sb2NhdGlvbi5oCmluZGV4IDFiM2FhNzYuLmQ1MWI3ZjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL2xvY2F0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbG9jYXRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9MT0NBVElPTl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX0xPQ0FUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9sb2NhdGlvbi5pZGwgYi9zcmMvY29iYWx0L2RvbS9sb2NhdGlvbi5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWZkODliYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL2xvY2F0aW9uLmlkbApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvYnJvd3NlcnMuaHRtbCN0aGUtbG9jYXRpb24taW50ZXJmYWNlCisKK1tVbmZvcmdlYWJsZV0gaW50ZXJmYWNlIExvY2F0aW9uIHsKKyAgdm9pZCBhc3NpZ24oRE9NU3RyaW5nIHVybCk7CisgIHZvaWQgcmVwbGFjZShET01TdHJpbmcgdXJsKTsKKyAgdm9pZCByZWxvYWQoKTsKK307CitMb2NhdGlvbiBpbXBsZW1lbnRzIFVSTFV0aWxzOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbG9jYXRpb25fdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL2xvY2F0aW9uX3Rlc3QuY2MKaW5kZXggYWE0NTllNS4uYzg4NzI2YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbG9jYXRpb25fdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9sb2NhdGlvbl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotKgotKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSoKLSogICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSoKLSogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHBzOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbG9jYXRpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfZXJyb3IuaCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2Vycm9yLmgKaW5kZXggMTI0YjQzNy4uMzhmYTgxNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfZXJyb3IuaAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9lcnJvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX01FRElBX0VSUk9SX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fTUVESUFfRVJST1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2Vycm9yLmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2Vycm9yLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMzVhZjdhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfZXJyb3IuaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9lbWJlZGRlZC1jb250ZW50LTAuaHRtbCNtZWRpYWVycm9yCisKK2ludGVyZmFjZSBNZWRpYUVycm9yIHsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgTUVESUFfRVJSX0FCT1JURUQgPSAxOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9FUlJfTkVUV09SSyA9IDI7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1FRElBX0VSUl9ERUNPREUgPSAzOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9FUlJfU1JDX05PVF9TVVBQT1JURUQgPSA0OworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9FUlJfRU5DUllQVEVEID0gNTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IGNvZGU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X2NvbXBsZXRlX2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X2NvbXBsZXRlX2V2ZW50LmNjCmluZGV4IDk4MDdlOTAuLjRjNTMyMDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9jb21wbGV0ZV9ldmVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X2NvbXBsZXRlX2V2ZW50LmggYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaAppbmRleCBjMzMwN2M0Li4xODE4NjVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9NRURJQV9LRVlfQ09NUExFVEVfRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9LRVlfQ09NUExFVEVfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9jb21wbGV0ZV9ldmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdmYjE0NmEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfY29tcGxldGVfZXZlbnQuaWRsCkBAIC0wLDAgKzEsMTggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludGVyZmFjZSBNZWRpYUtleUNvbXBsZXRlRXZlbnQgOiBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2V5U3lzdGVtOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHNlc3Npb25JZDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfZXJyb3IuaCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvci5oCmluZGV4IDYwMDc4OTkuLmIzMzBhMDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX01FRElBX0tFWV9FUlJPUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX01FRElBX0tFWV9FUlJPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X2Vycm9yLmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIxM2U1YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvci5pZGwKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIE1lZGlhS2V5RXJyb3IgeworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfVU5LTk9XTiA9IDE7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1FRElBX0tFWUVSUl9DTElFTlQgPSAyOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfU0VSVklDRSA9IDM7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE1FRElBX0tFWUVSUl9PVVRQVVQgPSA0OworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfSEFSRFdBUkVDSEFOR0UgPSA1OworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBNRURJQV9LRVlFUlJfRE9NQUlOID0gNjsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfZXJyb3JfZXZlbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfZXJyb3JfZXZlbnQuY2MKaW5kZXggYTg0NjZkYy4uY2QwOTJmYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X2Vycm9yX2V2ZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfZXJyb3JfZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5oCmluZGV4IDkxMzczNWIuLjAxZmZmMTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX01FRElBX0tFWV9FUlJPUl9FVkVOVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX01FRElBX0tFWV9FUlJPUl9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X2Vycm9yX2V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RkNDk1MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9lcnJvcl9ldmVudC5pZGwKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIE1lZGlhS2V5RXJyb3JFdmVudCA6IEV2ZW50IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXlTeXN0ZW07CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgc2Vzc2lvbklkOworICByZWFkb25seSBhdHRyaWJ1dGUgTWVkaWFLZXlFcnJvciBlcnJvckNvZGU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCBzeXN0ZW1Db2RlOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuY2MKaW5kZXggZDg2ODNlNC4uNjBhMDc0YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaAppbmRleCBmZjQ5MGZkLi44NjY0M2JiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9tZXNzYWdlX2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTUVESUFfS0VZX01FU1NBR0VfRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9LRVlfTUVTU0FHRV9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X21lc3NhZ2VfZXZlbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEyMDI0YzMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbWVzc2FnZV9ldmVudC5pZGwKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIE1lZGlhS2V5TWVzc2FnZUV2ZW50IDogRXZlbnQgeworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGtleVN5c3RlbTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzZXNzaW9uSWQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBVaW50OEFycmF5IG1lc3NhZ2U7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgZGVmYXVsdFVSTDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X25lZWRlZF9ldmVudC5jYwppbmRleCBkOTkyNWQ3Li5mNmJkNDg0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaAppbmRleCBkYjcyMjJmLi40MjA3YmJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfa2V5X25lZWRlZF9ldmVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX01FRElBX0tFWV9ORUVERURfRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9LRVlfTkVFREVEX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX2tleV9uZWVkZWRfZXZlbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM2OWYyYzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9rZXlfbmVlZGVkX2V2ZW50LmlkbApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgTWVkaWFLZXlOZWVkZWRFdmVudCA6IEV2ZW50IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBrZXlTeXN0ZW07CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgc2Vzc2lvbklkOworICByZWFkb25seSBhdHRyaWJ1dGUgVWludDhBcnJheSBpbml0RGF0YTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9xdWVyeV9saXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfcXVlcnlfbGlzdC5jYwppbmRleCBmYTlmNzZiLi5mYmRmM2Q0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9xdWVyeV9saXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3F1ZXJ5X2xpc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9xdWVyeV9saXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX3F1ZXJ5X2xpc3QuaCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3F1ZXJ5X2xpc3QuaAppbmRleCA5MTc1Nzk5Li5lOWM4NjllIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9xdWVyeV9saXN0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfcXVlcnlfbGlzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX01FRElBX1FVRVJZX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9RVUVSWV9MSVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9xdWVyeV9saXN0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3F1ZXJ5X2xpc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlOTQ4YWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9xdWVyeV9saXN0LmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS12aWV3LTIwMTMxMjE3LyNtZWRpYXF1ZXJ5bGlzdAorCitpbnRlcmZhY2UgTWVkaWFRdWVyeUxpc3QgeworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1lZGlhOworICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBtYXRjaGVzOworICAvLyBUT0RPOiBBZGQgYWRkTGlzdGVuZXIoKS9yZW1vdmVMaXN0ZW5lcigpLgorfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lZGlhX3F1ZXJ5X2xpc3RfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3F1ZXJ5X2xpc3RfdGVzdC5jYwppbmRleCBlNTBkYzA2Li44NWRkZGM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9xdWVyeV9saXN0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfcXVlcnlfbGlzdF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfcXVlcnlfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuY2MgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuY2MKaW5kZXggOTgwN2I0OC4uMzM1ZmI4ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5oIgogCkBAIC03NSw3ICs3Myw3IEBACiB9ICAvLyBuYW1lc3BhY2UKIAogTWVkaWFTb3VyY2U6Ok1lZGlhU291cmNlKCkKLSAgICA6IHJlYWR5X3N0YXRlXyhrUmVhZHlTdGF0ZUNsb3NlZCksCisgICAgOiByZWFkeV9zdGF0ZV8oa0Nsb3NlZCksCiAgICAgICBwbGF5ZXJfKE5VTEwpLAogICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGV2ZW50X3F1ZXVlXyh0aGlzKSksCiAgICAgICBzb3VyY2VfYnVmZmVyc18obmV3IFNvdXJjZUJ1ZmZlckxpc3QoJmV2ZW50X3F1ZXVlXykpIHt9CkBAIC05Miw3ICs5MCw3IEBACiBkb3VibGUgTWVkaWFTb3VyY2U6OmR1cmF0aW9uKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3QgewogICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CiAKLSAgaWYgKHJlYWR5X3N0YXRlXyA9PSBrUmVhZHlTdGF0ZUNsb3NlZCkgeworICBpZiAocmVhZHlfc3RhdGVfID09IGtDbG9zZWQpIHsKICAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpOwogICB9CiAKQEAgLTEwNiw3ICsxMDQsNyBAQAogICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZEFjY2Vzc0VyciwgZXhjZXB0aW9uX3N0YXRlKTsKICAgICByZXR1cm47CiAgIH0KLSAgaWYgKHJlYWR5X3N0YXRlXyAhPSBrUmVhZHlTdGF0ZU9wZW4pIHsKKyAgaWYgKHJlYWR5X3N0YXRlXyAhPSBrT3BlbikgewogICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZEFjY2Vzc0VyciwgZXhjZXB0aW9uX3N0YXRlKTsKICAgICByZXR1cm47CiAgIH0KQEAgLTEzMyw3ICsxMzEsNyBAQAogICAgIHJldHVybiBOVUxMOwogICB9CiAKLSAgaWYgKCFwbGF5ZXJfIHx8IHJlYWR5X3N0YXRlXyAhPSBrUmVhZHlTdGF0ZU9wZW4pIHsKKyAgaWYgKCFwbGF5ZXJfIHx8IHJlYWR5X3N0YXRlXyAhPSBrT3BlbikgewogICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOwogICAgIC8vIFJldHVybiB2YWx1ZSBzaG91bGQgYmUgaWdub3JlZC4KICAgICByZXR1cm4gTlVMTDsKQEAgLTE4NCwyNyArMTgyLDE4IEBACiAgIHBsYXllcl8tPlNvdXJjZVJlbW92ZUlkKHNvdXJjZV9idWZmZXItPmlkKCkpOwogfQogCi1zdGQ6OnN0cmluZyBNZWRpYVNvdXJjZTo6cmVhZHlfc3RhdGUoKSBjb25zdCB7Ci0gIHN3aXRjaCAocmVhZHlfc3RhdGVfKSB7Ci0gICAgY2FzZSBrUmVhZHlTdGF0ZUNsb3NlZDoKLSAgICAgIHJldHVybiAiY2xvc2VkIjsKLSAgICBjYXNlIGtSZWFkeVN0YXRlT3BlbjoKLSAgICAgIHJldHVybiAib3BlbiI7Ci0gICAgY2FzZSBrUmVhZHlTdGF0ZUVuZGVkOgotICAgICAgcmV0dXJuICJlbmRlZCI7Ci0gIH0KLSAgTk9UUkVBQ0hFRCgpIDw8ICJyZWFkeV9zdGF0ZV8gKCIgPDwgcmVhZHlfc3RhdGVfIDw8ICIpIGlzIGludmFsaWQiOwotICByZXR1cm4gIiI7CitNZWRpYVNvdXJjZTo6UmVhZHlTdGF0ZSBNZWRpYVNvdXJjZTo6cmVhZHlfc3RhdGUoKSBjb25zdCB7CisgIHJldHVybiByZWFkeV9zdGF0ZV87CiB9CiAKIHZvaWQgTWVkaWFTb3VyY2U6OkVuZE9mU3RyZWFtKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgewogICAvLyBJZiB0aGVyZSBpcyBubyBlcnJvciBzdHJpbmcgcHJvdmlkZWQsIHRyZWF0IGl0IGFzIGVtcHR5LgotICBFbmRPZlN0cmVhbSgiIiwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgRW5kT2ZTdHJlYW0oa05vRXJyb3IsIGV4Y2VwdGlvbl9zdGF0ZSk7CiB9CiAKLXZvaWQgTWVkaWFTb3VyY2U6OkVuZE9mU3RyZWFtKGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvciwKK3ZvaWQgTWVkaWFTb3VyY2U6OkVuZE9mU3RyZWFtKEVuZE9mU3RyZWFtRXJyb3IgZXJyb3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKLSAgaWYgKCFwbGF5ZXJfIHx8IHJlYWR5X3N0YXRlXyAhPSBrUmVhZHlTdGF0ZU9wZW4pIHsKKyAgaWYgKCFwbGF5ZXJfIHx8IHJlYWR5X3N0YXRlXyAhPSBrT3BlbikgewogICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOwogICAgIHJldHVybjsKICAgfQpAQCAtMjEyLDE4ICsyMDEsMTggQEAKICAgV2ViTWVkaWFQbGF5ZXI6OkVuZE9mU3RyZWFtU3RhdHVzIGVvc19zdGF0dXMgPQogICAgICAgV2ViTWVkaWFQbGF5ZXI6OmtFbmRPZlN0cmVhbVN0YXR1c05vRXJyb3I7CiAKLSAgaWYgKGVycm9yLmVtcHR5KCkgfHwgZXJyb3IgPT0gIm51bGwiKSB7CisgIGlmIChlcnJvciA9PSBrTm9FcnJvcikgewogICAgIGVvc19zdGF0dXMgPSBXZWJNZWRpYVBsYXllcjo6a0VuZE9mU3RyZWFtU3RhdHVzTm9FcnJvcjsKLSAgfSBlbHNlIGlmIChlcnJvciA9PSAibmV0d29yayIpIHsKKyAgfSBlbHNlIGlmIChlcnJvciA9PSBrTmV0d29yaykgewogICAgIGVvc19zdGF0dXMgPSBXZWJNZWRpYVBsYXllcjo6a0VuZE9mU3RyZWFtU3RhdHVzTmV0d29ya0Vycm9yOwotICB9IGVsc2UgaWYgKGVycm9yID09ICJkZWNvZGUiKSB7CisgIH0gZWxzZSBpZiAoZXJyb3IgPT0ga0RlY29kZSkgewogICAgIGVvc19zdGF0dXMgPSBXZWJNZWRpYVBsYXllcjo6a0VuZE9mU3RyZWFtU3RhdHVzRGVjb2RlRXJyb3I7CiAgIH0gZWxzZSB7CiAgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkQWNjZXNzRXJyLCBleGNlcHRpb25fc3RhdGUpOwogICAgIHJldHVybjsKICAgfQogCi0gIFNldFJlYWR5U3RhdGUoa1JlYWR5U3RhdGVFbmRlZCk7CisgIFNldFJlYWR5U3RhdGUoa0VuZGVkKTsKICAgcGxheWVyXy0+U291cmNlRW5kT2ZTdHJlYW0oZW9zX3N0YXR1cyk7CiB9CiAKQEAgLTI1NCw3ICsyNDMsNyBAQAogc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBNZWRpYVNvdXJjZTo6R2V0QnVmZmVyZWQoCiAgICAgY29uc3QgU291cmNlQnVmZmVyKiBzb3VyY2VfYnVmZmVyLAogICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgewotICBpZiAoIXBsYXllcl8gfHwgcmVhZHlfc3RhdGVfID09IGtSZWFkeVN0YXRlQ2xvc2VkKSB7CisgIGlmICghcGxheWVyXyB8fCByZWFkeV9zdGF0ZV8gPT0ga0Nsb3NlZCkgewogICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOwogICAgIC8vIFJldHVybiB2YWx1ZSBzaG91bGQgYmUgaWdub3JlZC4KICAgICByZXR1cm4gTlVMTDsKQEAgLTI3NCw3ICsyNjMsNyBAQAogYm9vbCBNZWRpYVNvdXJjZTo6U2V0VGltZXN0YW1wT2Zmc2V0KGNvbnN0IFNvdXJjZUJ1ZmZlciogc291cmNlX2J1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdGltZXN0YW1wX29mZnNldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKLSAgaWYgKCFwbGF5ZXJfIHx8IHJlYWR5X3N0YXRlXyA9PSBrUmVhZHlTdGF0ZUNsb3NlZCkgeworICBpZiAoIXBsYXllcl8gfHwgcmVhZHlfc3RhdGVfID09IGtDbG9zZWQpIHsKICAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKICAgICAvLyBSZXR1cm4gdmFsdWUgc2hvdWxkIGJlIGlnbm9yZWQuCiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtMjk1LDEzICsyODQsMTMgQEAKICAgICByZXR1cm47CiAgIH0KIAotICBpZiAoIXBsYXllcl8gfHwgcmVhZHlfc3RhdGVfID09IGtSZWFkeVN0YXRlQ2xvc2VkKSB7CisgIGlmICghcGxheWVyXyB8fCByZWFkeV9zdGF0ZV8gPT0ga0Nsb3NlZCkgewogICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOwogICAgIHJldHVybjsKICAgfQogCi0gIGlmIChyZWFkeV9zdGF0ZV8gPT0ga1JlYWR5U3RhdGVFbmRlZCkgewotICAgIFNldFJlYWR5U3RhdGUoa1JlYWR5U3RhdGVPcGVuKTsKKyAgaWYgKHJlYWR5X3N0YXRlXyA9PSBrRW5kZWQpIHsKKyAgICBTZXRSZWFkeVN0YXRlKGtPcGVuKTsKICAgfQogCiAgIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLCAiTWVkaWFTb3VyY2U6OkFwcGVuZCgpIiwgInNpemUiLCBzaXplKTsKQEAgLTMyNSw3ICszMTQsNyBAQAogCiB2b2lkIE1lZGlhU291cmNlOjpBYm9ydChjb25zdCBTb3VyY2VCdWZmZXIqIHNvdXJjZV9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKLSAgaWYgKCFwbGF5ZXJfIHx8IHJlYWR5X3N0YXRlXyAhPSBrUmVhZHlTdGF0ZU9wZW4pIHsKKyAgaWYgKCFwbGF5ZXJfIHx8IHJlYWR5X3N0YXRlXyAhPSBrT3BlbikgewogICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOwogICAgIHJldHVybjsKICAgfQpAQCAtMzM0LDEwICszMjMsNiBAQAogICBEQ0hFQ0soYWJvcnRlZCk7CiB9CiAKLU1lZGlhU291cmNlOjpSZWFkeVN0YXRlIE1lZGlhU291cmNlOjpHZXRSZWFkeVN0YXRlKCkgY29uc3QgewotICByZXR1cm4gcmVhZHlfc3RhdGVfOwotfQotCiB2b2lkIE1lZGlhU291cmNlOjpTZXRSZWFkeVN0YXRlKFJlYWR5U3RhdGUgcmVhZHlfc3RhdGUpIHsKICAgaWYgKHJlYWR5X3N0YXRlXyA9PSByZWFkeV9zdGF0ZSkgewogICAgIHJldHVybjsKQEAgLTM0NiwxOSArMzMxLDE5IEBACiAgIFJlYWR5U3RhdGUgb2xkX3N0YXRlID0gcmVhZHlfc3RhdGVfOwogICByZWFkeV9zdGF0ZV8gPSByZWFkeV9zdGF0ZTsKIAotICBpZiAocmVhZHlfc3RhdGVfID09IGtSZWFkeVN0YXRlQ2xvc2VkKSB7CisgIGlmIChyZWFkeV9zdGF0ZV8gPT0ga0Nsb3NlZCkgewogICAgIHNvdXJjZV9idWZmZXJzXy0+Q2xlYXIoKTsKICAgICBwbGF5ZXJfID0gTlVMTDsKICAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6c291cmNlY2xvc2UoKSk7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgaWYgKG9sZF9zdGF0ZSA9PSBrUmVhZHlTdGF0ZU9wZW4gJiYgcmVhZHlfc3RhdGVfID09IGtSZWFkeVN0YXRlRW5kZWQpIHsKKyAgaWYgKG9sZF9zdGF0ZSA9PSBrT3BlbiAmJiByZWFkeV9zdGF0ZV8gPT0ga0VuZGVkKSB7CiAgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnNvdXJjZWVuZGVkKCkpOwogICAgIHJldHVybjsKICAgfQogCi0gIGlmIChyZWFkeV9zdGF0ZV8gPT0ga1JlYWR5U3RhdGVPcGVuKSB7CisgIGlmIChyZWFkeV9zdGF0ZV8gPT0ga09wZW4pIHsKICAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6c291cmNlb3BlbigpKTsKICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlLmggYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuaAppbmRleCBiOGFhNTVhLi4zNTI5ODNkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuaAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UuaApAQCAtMSwxOCArMSwyMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9tZWRpYV9zb3VyY2UuaCIKKyNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9TT1VSQ0VfSF8KKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9NRURJQV9TT1VSQ0VfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9TT1VSQ0VfSF8KQEAgLTQ1LDExICs0OCwxNCBAQAogIHB1YmxpYzoKICAgdHlwZWRlZiBVcmxSZWdpc3RyeTxNZWRpYVNvdXJjZT4gUmVnaXN0cnk7CiAKKyAgLy8gV2ViIEFQSTogTWVkaWFTb3VyY2UKKyAgLy8KKyAgZW51bSBFbmRPZlN0cmVhbUVycm9yIHsga05vRXJyb3IsIGtOZXR3b3JrLCBrRGVjb2RlIH07CisKKyAgZW51bSBSZWFkeVN0YXRlIHsga0Nsb3NlZCwga09wZW4sIGtFbmRlZCB9OworCiAgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgogICAvLwotICAvLyBNZWRpYVNvdXJjZSBzcGVjIGRlZmluZXMgc3RhdGVzIGFzIHN0cmluZ3MgImNsb3NlZCIsICJvcGVuIiBhbmQgImVuZGVkIi4KLSAgZW51bSBSZWFkeVN0YXRlIHsga1JlYWR5U3RhdGVDbG9zZWQsIGtSZWFkeVN0YXRlT3Blbiwga1JlYWR5U3RhdGVFbmRlZCB9OwotCiAgIE1lZGlhU291cmNlKCk7CiAKICAgLy8gV2ViIEFQSTogTWVkaWFTb3VyY2UKQEAgLTYzLDEwICs2OSwxMCBAQAogICB2b2lkIFJlbW92ZVNvdXJjZUJ1ZmZlcihjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CiAKLSAgc3RkOjpzdHJpbmcgcmVhZHlfc3RhdGUoKSBjb25zdDsKKyAgUmVhZHlTdGF0ZSByZWFkeV9zdGF0ZSgpIGNvbnN0OwogCiAgIHZvaWQgRW5kT2ZTdHJlYW0oc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKLSAgdm9pZCBFbmRPZlN0cmVhbShjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3IsCisgIHZvaWQgRW5kT2ZTdHJlYW0oRW5kT2ZTdHJlYW1FcnJvciBlcnJvciwKICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOwogCiAgIHN0YXRpYyBib29sIElzVHlwZVN1cHBvcnRlZChzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLApAQCAtOTMsNyArOTksNiBAQAogICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CiAKICAgLy8gTWV0aG9kcyB1c2VkIGJ5IEhUTUxNZWRpYUVsZW1lbnQKLSAgUmVhZHlTdGF0ZSBHZXRSZWFkeVN0YXRlKCkgY29uc3Q7CiAgIHZvaWQgU2V0UmVhZHlTdGF0ZShSZWFkeVN0YXRlIHJlYWR5X3N0YXRlKTsKIAogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVkaWFTb3VyY2UpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWU2OWQ0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5pZGwKQEAgLTAsMCArMSw0OSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL21lZGlhLXNvdXJjZS8jaWRsLWRlZi1tZWRpYXNvdXJjZQorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItbWVkaWEtc291cmNlLTIwMTYwNzA1LyNpZGwtZGVmLU1lZGlhU291cmNlCisKK2VudW0gRW5kT2ZTdHJlYW1FcnJvciB7CisgICJuZXR3b3JrIiwKKyAgImRlY29kZSIKK307CisKK2VudW0gUmVhZHlTdGF0ZSB7CisgICJjbG9zZWQiLAorICAib3BlbiIsCisgICJlbmRlZCIKK307CisKK1tDb25zdHJ1Y3Rvcl0gaW50ZXJmYWNlIE1lZGlhU291cmNlIDogRXZlbnRUYXJnZXQgeworICAvLyBBbGwgdGhlIHNvdXJjZSBidWZmZXJzIGNyZWF0ZWQgYnkgdGhpcyBvYmplY3QuCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTb3VyY2VCdWZmZXJMaXN0IHNvdXJjZUJ1ZmZlcnM7CisgIC8vIFN1YnNldCBvZiBzb3VyY2VCdWZmZXJzIHRoYXQgcHJvdmlkZSBkYXRhIGZvciB0aGUgc2VsZWN0ZWQvZW5hYmxlZCB0cmFja3MuCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTb3VyY2VCdWZmZXJMaXN0IGFjdGl2ZVNvdXJjZUJ1ZmZlcnM7CisKKyAgcmVhZG9ubHkgYXR0cmlidXRlIFJlYWR5U3RhdGUgcmVhZHlTdGF0ZTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIHVucmVzdHJpY3RlZCBkb3VibGUgZHVyYXRpb247CisKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gU291cmNlQnVmZmVyIGFkZFNvdXJjZUJ1ZmZlcihET01TdHJpbmcgdHlwZSk7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgcmVtb3ZlU291cmNlQnVmZmVyKFNvdXJjZUJ1ZmZlciBzb3VyY2VCdWZmZXIpOworCisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgZW5kT2ZTdHJlYW0ob3B0aW9uYWwgRW5kT2ZTdHJlYW1FcnJvciBlcnJvcik7CisKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNiwgUmFpc2VzRXhjZXB0aW9uXQorICAgICAgdm9pZCBzZXRMaXZlU2Vla2FibGVSYW5nZShkb3VibGUgc3RhcnQsIGRvdWJsZSBlbmQpOworICBbQ29uZGl0aW9uYWw9Q09CQUxUX01FRElBX1NPVVJDRV8yMDE2LCBSYWlzZXNFeGNlcHRpb25dCisgICAgICB2b2lkIGNsZWFyTGl2ZVNlZWthYmxlUmFuZ2UoKTsKKworICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gc3RhdGljIGJvb2xlYW4gaXNUeXBlU3VwcG9ydGVkKERPTVN0cmluZyB0eXBlKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UvbWVkaWFfc291cmNlLmNjIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZWJkYjZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5jYwpAQCAtMCwwICsxLDU2MSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfc291cmNlL21lZGlhX3NvdXJjZS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisjaW5jbHVkZSAiYmFzZS9ndWlkLmgiCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdfc3BsaXQuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ191dGlsLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW5zLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fZXhjZXB0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fc2V0dGluZ3MuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK3VzaW5nIDo6bWVkaWE6OkNodW5rRGVtdXhlcjsKKworbmFtZXNwYWNlIHsKKworLy8gUGFyc2UgbWltZSBhbmQgY29kZWNzIGZyb20gY29udGVudCB0eXBlLiBJdCB3aWxsIHJldHVybiAidmlkZW8vbXA0IiBhbmQKKy8vICJhdmMxLjQyRTAxRSwgbXA0YS40MC4yIiBmb3IgInZpZGVvL21wNDsgY29kZWNzPSJhdmMxLjQyRTAxRSwgbXA0YS40MC4yIi4KKy8vIE5vdGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGRvZXMgbWluaW11bSB2YWxpZGF0aW9uIGFzIHRoZSBtZWRpYSBzdGFjayB3aWxsIGNoZWNrCisvLyB0aGUgbWltZSB0eXBlIGFuZCBjb2RlY3Mgc3RyaWN0bHkuCitib29sIFBhcnNlQ29udGVudFR5cGUoY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnRfdHlwZSwgc3RkOjpzdHJpbmcqIG1pbWUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGNvZGVjcykgeworICBEQ0hFQ0sobWltZSk7CisgIERDSEVDSyhjb2RlY3MpOworICBzdGF0aWMgY29uc3QgY2hhciBrQ29kZWNzW10gPSAiY29kZWNzPSI7CisKKyAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRva2VuczsKKyAgLy8gU3BsaXRTdHJpbmcgd2lsbCBhbHNvIHRyaW0gdGhlIHJlc3VsdHMuCisgIDo6YmFzZTo6U3BsaXRTdHJpbmcoY29udGVudF90eXBlLCAnOycsICZ0b2tlbnMpOworICAvLyBUaGUgZmlyc3Qgb25lIGhhcyB0byBiZSBtaW1lIHR5cGUgd2l0aCBkZWxpbWl0ZXIgJy8nIGxpa2UgJ3ZpZGVvL21wNCcuCisgIGlmICh0b2tlbnMuc2l6ZSgpIDwgMiB8fCB0b2tlbnNbMF0uZmluZCgnLycpID09IHRva2Vuc1swXS5ucG9zKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICptaW1lID0gdG9rZW5zWzBdOworICBmb3IgKHNpemVfdCBpID0gMTsgaSA8IHRva2Vucy5zaXplKCk7ICsraSkgeworICAgIGlmIChzdHJuY2FzZWNtcCh0b2tlbnNbaV0uY19zdHIoKSwga0NvZGVjcywgc3RybGVuKGtDb2RlY3MpKSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgICpjb2RlY3MgPSB0b2tlbnNbaV0uc3Vic3RyKHN0cmxlbigiY29kZWNzPSIpKTsKKyAgICBUcmltU3RyaW5nKCpjb2RlY3MsICIgXCIiLCBjb2RlY3MpOworICAgIGJyZWFrOworICB9CisgIHJldHVybiAhY29kZWNzLT5lbXB0eSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworTWVkaWFTb3VyY2U6Ok1lZGlhU291cmNlKCkKKyAgICA6IGNodW5rX2RlbXV4ZXJfKE5VTEwpLAorICAgICAgcmVhZHlfc3RhdGVfKGtDbG9zZWQpLAorICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKGV2ZW50X3F1ZXVlXyh0aGlzKSksCisgICAgICBzb3VyY2VfYnVmZmVyc18obmV3IFNvdXJjZUJ1ZmZlckxpc3QoJmV2ZW50X3F1ZXVlXykpLAorICAgICAgYWN0aXZlX3NvdXJjZV9idWZmZXJzXyhuZXcgU291cmNlQnVmZmVyTGlzdCgmZXZlbnRfcXVldWVfKSksCisgICAgICBsaXZlX3NlZWthYmxlX3JhbmdlXyhuZXcgVGltZVJhbmdlcykge30KKworTWVkaWFTb3VyY2U6On5NZWRpYVNvdXJjZSgpIHsgU2V0UmVhZHlTdGF0ZShrQ2xvc2VkKTsgfQorCitzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlckxpc3Q+IE1lZGlhU291cmNlOjpzb3VyY2VfYnVmZmVycygpIGNvbnN0IHsKKyAgcmV0dXJuIHNvdXJjZV9idWZmZXJzXzsKK30KKworc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXJMaXN0PiBNZWRpYVNvdXJjZTo6YWN0aXZlX3NvdXJjZV9idWZmZXJzKCkgY29uc3QgeworICByZXR1cm4gYWN0aXZlX3NvdXJjZV9idWZmZXJzXzsKK30KKworTWVkaWFTb3VyY2U6OlJlYWR5U3RhdGUgTWVkaWFTb3VyY2U6OnJlYWR5X3N0YXRlKCkgY29uc3QgeworICByZXR1cm4gcmVhZHlfc3RhdGVfOworfQorCitkb3VibGUgTWVkaWFTb3VyY2U6OmR1cmF0aW9uKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3QgeworICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisKKyAgaWYgKHJlYWR5X3N0YXRlXyA9PSBrQ2xvc2VkKSB7CisgICAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZmxvYXQ+OjpxdWlldF9OYU4oKTsKKyAgfQorCisgIERDSEVDSyhjaHVua19kZW11eGVyXyk7CisgIHJldHVybiBjaHVua19kZW11eGVyXy0+R2V0RHVyYXRpb24oKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6c2V0X2R1cmF0aW9uKGRvdWJsZSBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgaWYgKGR1cmF0aW9uIDwgMC4wIHx8IGlzbmFuKGR1cmF0aW9uKSkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW5kZXhTaXplRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoIUlzT3BlbigpIHx8IElzVXBkYXRpbmcoKSkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFJ1biB0aGUgZHVyYXRpb24gY2hhbmdlIGFsZ29yaXRobQorICBpZiAoZHVyYXRpb24gPT0gdGhpcy0+ZHVyYXRpb24oTlVMTCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBkb3VibGUgaGlnaGVzdF9idWZmZXJlZF9wcmVzZW50YXRpb25fdGltZXN0YW1wID0gMDsKKyAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzb3VyY2VfYnVmZmVyc18tPmxlbmd0aCgpOyArK2kpIHsKKyAgICBoaWdoZXN0X2J1ZmZlcmVkX3ByZXNlbnRhdGlvbl90aW1lc3RhbXAgPQorICAgICAgICBzdGQ6Om1heChoaWdoZXN0X2J1ZmZlcmVkX3ByZXNlbnRhdGlvbl90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgIHNvdXJjZV9idWZmZXJzXy0+SXRlbShpKS0+R2V0SGlnaGVzdFByZXNlbnRhdGlvblRpbWVzdGFtcCgpKTsKKyAgfQorCisgIGlmIChkdXJhdGlvbiA8IGhpZ2hlc3RfYnVmZmVyZWRfcHJlc2VudGF0aW9uX3RpbWVzdGFtcCkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIDMuIFNldCBvbGQgZHVyYXRpb24gdG8gdGhlIGN1cnJlbnQgdmFsdWUgb2YgZHVyYXRpb24uCisgIGRvdWJsZSBvbGRfZHVyYXRpb24gPSB0aGlzLT5kdXJhdGlvbihOVUxMKTsKKyAgRENIRUNLX0xFKGhpZ2hlc3RfYnVmZmVyZWRfcHJlc2VudGF0aW9uX3RpbWVzdGFtcCwKKyAgICAgICAgICAgIHN0ZDo6aXNuYW4ob2xkX2R1cmF0aW9uKSA/IDAgOiBvbGRfZHVyYXRpb24pOworCisgIC8vIDQuIFVwZGF0ZSBkdXJhdGlvbiB0byBuZXcgZHVyYXRpb24uCisgIGJvb2wgcmVxdWVzdF9zZWVrID0gYXR0YWNoZWRfZWxlbWVudF8tPmN1cnJlbnRfdGltZShOVUxMKSA+IGR1cmF0aW9uOworICBjaHVua19kZW11eGVyXy0+U2V0RHVyYXRpb24oZHVyYXRpb24pOworCisgIC8vIDUuIElmIGEgdXNlciBhZ2VudCBpcyB1bmFibGUgdG8gcGFydGlhbGx5IHJlbmRlciBhdWRpbyBmcmFtZXMgb3IgdGV4dCBjdWVzCisgIC8vICAgIHRoYXQgc3RhcnQgYmVmb3JlIGFuZCBlbmQgYWZ0ZXIgdGhlIGR1cmF0aW9uLCB0aGVuIHJ1biB0aGUgZm9sbG93aW5nCisgIC8vICAgIHN0ZXBzOgorICAvLyAgICBOT1RFOiBDdXJyZW50bHkgd2UgYXNzdW1lIHRoYXQgdGhlIG1lZGlhIGVuZ2luZSBpcyBhYmxlIHRvIHJlbmRlcgorICAvLyAgICBwYXJ0aWFsIGZyYW1lcy9jdWVzLiBJZiBhIG1lZGlhIGVuZ2luZSBnZXRzIGFkZGVkIHRoYXQgZG9lc24ndCBzdXBwb3J0CisgIC8vICAgIHRoaXMsIHRoZW4gd2UnbGwgbmVlZCB0byBhZGQgbG9naWMgdG8gaGFuZGxlIHRoZSBzdWJzdGVwcy4KKworICAvLyA2LiBVcGRhdGUgdGhlIG1lZGlhIGNvbnRyb2xsZXIgZHVyYXRpb24gdG8gbmV3IGR1cmF0aW9uIGFuZCBydW4gdGhlCisgIC8vICAgIEhUTUxNZWRpYUVsZW1lbnQgZHVyYXRpb24gY2hhbmdlIGFsZ29yaXRobS4KKyAgYXR0YWNoZWRfZWxlbWVudF8tPkR1cmF0aW9uQ2hhbmdlZChkdXJhdGlvbiwgcmVxdWVzdF9zZWVrKTsKK30KKworc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXI+IE1lZGlhU291cmNlOjpBZGRTb3VyY2VCdWZmZXIoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBETE9HKElORk8pIDw8ICJhZGQgU291cmNlQnVmZmVyIHdpdGggdHlwZSAiIDw8IHR5cGU7CisKKyAgaWYgKHR5cGUuZW1wdHkoKSkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZEFjY2Vzc0VyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICAvLyBSZXR1cm4gdmFsdWUgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAoIUlzVHlwZVN1cHBvcnRlZChOVUxMLCB0eXBlKSkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprTm90U3VwcG9ydGVkRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgaWYgKCFJc09wZW4oKSkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc3RkOjpzdHJpbmcgbWltZTsKKyAgc3RkOjpzdHJpbmcgY29kZWNzOworCisgIGlmICghUGFyc2VDb250ZW50VHlwZSh0eXBlLCAmbWltZSwgJmNvZGVjcykpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a05vdFN1cHBvcnRlZEVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICAvLyBSZXR1cm4gdmFsdWUgc2hvdWxkIGJlIGlnbm9yZWQuCisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzdGQ6OnN0cmluZyBndWlkID0gYmFzZTo6R2VuZXJhdGVHVUlEKCk7CisgIHNjb3BlZF9yZWZwdHI8U291cmNlQnVmZmVyPiBzb3VyY2VfYnVmZmVyOworICBDaHVua0RlbXV4ZXI6OlN0YXR1cyBzdGF0dXMgPSBjaHVua19kZW11eGVyXy0+QWRkSWQoZ3VpZCwgbWltZSwgY29kZWNzKTsKKyAgc3dpdGNoIChzdGF0dXMpIHsKKyAgICBjYXNlIENodW5rRGVtdXhlcjo6a09rOgorICAgICAgc291cmNlX2J1ZmZlciA9CisgICAgICAgICAgbmV3IFNvdXJjZUJ1ZmZlcihndWlkLCB0aGlzLCBjaHVua19kZW11eGVyXywgJmV2ZW50X3F1ZXVlXyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIENodW5rRGVtdXhlcjo6a05vdFN1cHBvcnRlZDoKKyAgICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprTm90U3VwcG9ydGVkRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgY2FzZSBDaHVua0RlbXV4ZXI6OmtSZWFjaGVkSWRMaW1pdDoKKyAgICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprUXVvdGFFeGNlZWRlZEVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICAgIHJldHVybiBOVUxMOworICB9CisKKyAgRENIRUNLKHNvdXJjZV9idWZmZXIpOworICBzb3VyY2VfYnVmZmVyc18tPkFkZChzb3VyY2VfYnVmZmVyKTsKKyAgcmV0dXJuIHNvdXJjZV9idWZmZXI7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2U6OlJlbW92ZVNvdXJjZUJ1ZmZlcigKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIsCisgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7CisgIGlmIChzb3VyY2VfYnVmZmVyID09IE5VTEwpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRBY2Nlc3NFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNvdXJjZV9idWZmZXJzXy0+bGVuZ3RoKCkgPT0gMCB8fAorICAgICAgIXNvdXJjZV9idWZmZXJzXy0+Q29udGFpbnMoc291cmNlX2J1ZmZlcikpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a05vdEZvdW5kRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIHNvdXJjZV9idWZmZXItPk9uUmVtb3ZlZEZyb21NZWRpYVNvdXJjZSgpOworCisgIGFjdGl2ZV9zb3VyY2VfYnVmZmVyc18tPlJlbW92ZShzb3VyY2VfYnVmZmVyKTsKKyAgc291cmNlX2J1ZmZlcnNfLT5SZW1vdmUoc291cmNlX2J1ZmZlcik7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2U6OkVuZE9mU3RyZWFtKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICAvLyBJZiB0aGVyZSBpcyBubyBlcnJvciBzdHJpbmcgcHJvdmlkZWQsIHRyZWF0IGl0IGFzIGVtcHR5LgorICBFbmRPZlN0cmVhbShrTm9FcnJvciwgZXhjZXB0aW9uX3N0YXRlKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6RW5kT2ZTdHJlYW0oRW5kT2ZTdHJlYW1FcnJvciBlcnJvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAoIUlzT3BlbigpIHx8IElzVXBkYXRpbmcoKSkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIFNldFJlYWR5U3RhdGUoa0VuZGVkKTsKKworICA6Om1lZGlhOjpQaXBlbGluZVN0YXR1cyBwaXBlbGluZV9zdGF0dXMgPSA6Om1lZGlhOjpQSVBFTElORV9PSzsKKworICBpZiAoZXJyb3IgPT0ga05ldHdvcmspIHsKKyAgICBwaXBlbGluZV9zdGF0dXMgPSA6Om1lZGlhOjpDSFVOS19ERU1VWEVSX0VSUk9SX0VPU19TVEFUVVNfTkVUV09SS19FUlJPUjsKKyAgfSBlbHNlIGlmIChlcnJvciA9PSBrRGVjb2RlKSB7CisgICAgcGlwZWxpbmVfc3RhdHVzID0gOjptZWRpYTo6Q0hVTktfREVNVVhFUl9FUlJPUl9FT1NfU1RBVFVTX0RFQ09ERV9FUlJPUjsKKyAgfQorCisgIGNodW5rX2RlbXV4ZXJfLT5NYXJrRW5kT2ZTdHJlYW0ocGlwZWxpbmVfc3RhdHVzKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6U2V0TGl2ZVNlZWthYmxlUmFuZ2UoCisgICAgZG91YmxlIHN0YXJ0LCBkb3VibGUgZW5kLCBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgaWYgKCFJc09wZW4oKSkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdGFydCA8IDAgfHwgc3RhcnQgPiBlbmQpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0luZGV4U2l6ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBsaXZlX3NlZWthYmxlX3JhbmdlXyA9IG5ldyBUaW1lUmFuZ2VzKHN0YXJ0LCBlbmQpOworfQorCit2b2lkIE1lZGlhU291cmNlOjpDbGVhckxpdmVTZWVrYWJsZVJhbmdlKAorICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAoIUlzT3BlbigpKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGxpdmVfc2Vla2FibGVfcmFuZ2VfLT5sZW5ndGgoKSAhPSAwKSB7CisgICAgbGl2ZV9zZWVrYWJsZV9yYW5nZV8gPSBuZXcgVGltZVJhbmdlczsKKyAgfQorfQorCisvLyBzdGF0aWMKK2Jvb2wgTWVkaWFTb3VyY2U6OklzVHlwZVN1cHBvcnRlZChzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlKSB7CisgIC8vIFRPRE86IFJlbW92ZSB8c2V0dGluZ3N8IHBhcmFtZXRlciBvbmNlIE1TRTIwMTIgaXMgcmVtb3ZlZC4KKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihzZXR0aW5ncyk7CisgIFNiTWVkaWFTdXBwb3J0VHlwZSBzdXBwb3J0X3R5cGUgPQorICAgICAgU2JNZWRpYUNhblBsYXlNaW1lQW5kS2V5U3lzdGVtKHR5cGUuY19zdHIoKSwgIiIpOworICBpZiAoc3VwcG9ydF90eXBlID09IGtTYk1lZGlhU3VwcG9ydFR5cGVOb3RTdXBwb3J0ZWQpIHsKKyAgICBETE9HKElORk8pIDw8ICJNZWRpYVNvdXJjZTo6SXNUeXBlU3VwcG9ydGVkKCIgPDwgdHlwZQorICAgICAgICAgICAgICAgPDwgIikgLT4gbm90IHN1cHBvcnRlZC9mYWxzZSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmIChzdXBwb3J0X3R5cGUgPT0ga1NiTWVkaWFTdXBwb3J0VHlwZU1heWJlKSB7CisgICAgRExPRyhJTkZPKSA8PCAiTWVkaWFTb3VyY2U6OklzVHlwZVN1cHBvcnRlZCgiIDw8IHR5cGUgPDwgIikgLT4gbWF5YmUvdHJ1ZSI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgaWYgKHN1cHBvcnRfdHlwZSA9PSBrU2JNZWRpYVN1cHBvcnRUeXBlUHJvYmFibHkpIHsKKyAgICBETE9HKElORk8pIDw8ICJNZWRpYVNvdXJjZTo6SXNUeXBlU3VwcG9ydGVkKCIgPDwgdHlwZQorICAgICAgICAgICAgICAgPDwgIikgLT4gcHJvYmFibHkvdHJ1ZSI7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgTk9UUkVBQ0hFRCgpOworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgTWVkaWFTb3VyY2U6OkF0dGFjaFRvRWxlbWVudChIVE1MTWVkaWFFbGVtZW50KiBtZWRpYV9lbGVtZW50KSB7CisgIGlmIChhdHRhY2hlZF9lbGVtZW50XykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIERDSEVDSyhJc0Nsb3NlZCgpKTsKKyAgYXR0YWNoZWRfZWxlbWVudF8gPSBiYXNlOjpBc1dlYWtQdHIobWVkaWFfZWxlbWVudCk7CisgIHJldHVybiB0cnVlOworfQorCit2b2lkIE1lZGlhU291cmNlOjpTZXRDaHVua0RlbXV4ZXJBbmRPcGVuKDo6bWVkaWE6OkNodW5rRGVtdXhlciogY2h1bmtfZGVtdXhlcikgeworICBEQ0hFQ0soY2h1bmtfZGVtdXhlcik7CisgIERDSEVDSyghY2h1bmtfZGVtdXhlcl8pOworICBEQ0hFQ0soYXR0YWNoZWRfZWxlbWVudF8pOworICBjaHVua19kZW11eGVyXyA9IGNodW5rX2RlbXV4ZXI7CisgIFNldFJlYWR5U3RhdGUoa09wZW4pOworfQorCit2b2lkIE1lZGlhU291cmNlOjpDbG9zZSgpIHsgU2V0UmVhZHlTdGF0ZShrQ2xvc2VkKTsgfQorCitib29sIE1lZGlhU291cmNlOjpJc0Nsb3NlZCgpIGNvbnN0IHsgcmV0dXJuIHJlYWR5X3N0YXRlXyA9PSBrQ2xvc2VkOyB9CisKK3Njb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gTWVkaWFTb3VyY2U6OkdldEJ1ZmZlcmVkUmFuZ2UoKSBjb25zdCB7CisgIHN0ZDo6dmVjdG9yPHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gPiByYW5nZXMoCisgICAgICBhY3RpdmVfc291cmNlX2J1ZmZlcnNfLT5sZW5ndGgoKSk7CisgIGZvciAodWludDMyIGkgPSAwOyBpIDwgYWN0aXZlX3NvdXJjZV9idWZmZXJzXy0+bGVuZ3RoKCk7ICsraSkKKyAgICByYW5nZXNbaV0gPSBhY3RpdmVfc291cmNlX2J1ZmZlcnNfLT5JdGVtKGkpLT5idWZmZXJlZChOVUxMKTsKKworICBpZiAocmFuZ2VzLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gbmV3IFRpbWVSYW5nZXM7CisgIH0KKworICBkb3VibGUgaGlnaGVzdF9lbmRfdGltZSA9IC0xOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJhbmdlcy5zaXplKCk7ICsraSkgeworICAgIHVpbnQzMiBsZW5ndGggPSByYW5nZXNbaV0tPmxlbmd0aCgpOworICAgIGlmIChsZW5ndGggPiAwKSB7CisgICAgICBoaWdoZXN0X2VuZF90aW1lID0KKyAgICAgICAgICBzdGQ6Om1heChoaWdoZXN0X2VuZF90aW1lLCByYW5nZXNbaV0tPkVuZChsZW5ndGggLSAxLCBOVUxMKSk7CisgICAgfQorICB9CisKKyAgLy8gUmV0dXJuIGFuIGVtcHR5IHJhbmdlIGlmIGFsbCByYW5nZXMgYXJlIGVtcHR5LgorICBpZiAoaGlnaGVzdF9lbmRfdGltZSA8IDApIHsKKyAgICByZXR1cm4gbmV3IFRpbWVSYW5nZXM7CisgIH0KKworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IGludGVyc2VjdGlvbl9yYW5nZXMgPQorICAgICAgbmV3IFRpbWVSYW5nZXMoMCwgaGlnaGVzdF9lbmRfdGltZSk7CisKKyAgYm9vbCBlbmRlZCA9IHJlYWR5X3N0YXRlKCkgPT0ga0VuZGVkOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJhbmdlcy5zaXplKCk7ICsraSkgeworICAgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gc291cmNlX3JhbmdlcyA9IHJhbmdlc1tpXS5nZXQoKTsKKworICAgIGlmIChlbmRlZCAmJiBzb3VyY2VfcmFuZ2VzLT5sZW5ndGgoKSkgeworICAgICAgc291cmNlX3Jhbmdlcy0+QWRkKAorICAgICAgICAgIHNvdXJjZV9yYW5nZXMtPlN0YXJ0KHNvdXJjZV9yYW5nZXMtPmxlbmd0aCgpIC0gMSwgTlVMTCksCisgICAgICAgICAgaGlnaGVzdF9lbmRfdGltZSk7CisgICAgfQorCisgICAgaW50ZXJzZWN0aW9uX3JhbmdlcyA9IGludGVyc2VjdGlvbl9yYW5nZXMtPkludGVyc2VjdFdpdGgoc291cmNlX3Jhbmdlcyk7CisgIH0KKworICByZXR1cm4gaW50ZXJzZWN0aW9uX3JhbmdlczsKK30KKworc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBNZWRpYVNvdXJjZTo6R2V0U2Vla2FibGUoKSBjb25zdCB7CisgIC8vIEltcGxlbWVudHMgTWVkaWFTb3VyY2UgYWxnb3JpdGhtIGZvciBIVE1MTWVkaWFFbGVtZW50LnNlZWthYmxlLgorICBkb3VibGUgc291cmNlX2R1cmF0aW9uID0gZHVyYXRpb24oTlVMTCk7CisKKyAgaWYgKHN0ZDo6aXNuYW4oc291cmNlX2R1cmF0aW9uKSkgeworICAgIHJldHVybiBuZXcgVGltZVJhbmdlczsKKyAgfQorCisgIGlmIChzb3VyY2VfZHVyYXRpb24gPT0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBidWZmZXJlZCA9IGF0dGFjaGVkX2VsZW1lbnRfLT5idWZmZXJlZCgpOworCisgICAgaWYgKGxpdmVfc2Vla2FibGVfcmFuZ2VfLT5sZW5ndGgoKSAhPSAwKSB7CisgICAgICBpZiAoYnVmZmVyZWQtPmxlbmd0aCgpID09IDApIHsKKyAgICAgICAgcmV0dXJuIG5ldyBUaW1lUmFuZ2VzKGxpdmVfc2Vla2FibGVfcmFuZ2VfLT5TdGFydCgwLCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpdmVfc2Vla2FibGVfcmFuZ2VfLT5FbmQoMCwgTlVMTCkpOworICAgICAgfQorCisgICAgICByZXR1cm4gbmV3IFRpbWVSYW5nZXMoCisgICAgICAgICAgc3RkOjptaW4obGl2ZV9zZWVrYWJsZV9yYW5nZV8tPlN0YXJ0KDAsIE5VTEwpLAorICAgICAgICAgICAgICAgICAgIGJ1ZmZlcmVkLT5TdGFydCgwLCBOVUxMKSksCisgICAgICAgICAgc3RkOjptYXgobGl2ZV9zZWVrYWJsZV9yYW5nZV8tPkVuZCgwLCBOVUxMKSwKKyAgICAgICAgICAgICAgICAgICBidWZmZXJlZC0+RW5kKGJ1ZmZlcmVkLT5sZW5ndGgoKSAtIDEsIE5VTEwpKSk7CisgICAgfQorCisgICAgaWYgKGJ1ZmZlcmVkLT5sZW5ndGgoKSA9PSAwKSB7CisgICAgICByZXR1cm4gbmV3IFRpbWVSYW5nZXM7CisgICAgfQorCisgICAgcmV0dXJuIG5ldyBUaW1lUmFuZ2VzKDAsIGJ1ZmZlcmVkLT5FbmQoYnVmZmVyZWQtPmxlbmd0aCgpIC0gMSwgTlVMTCkpOworICB9CisKKyAgcmV0dXJuIG5ldyBUaW1lUmFuZ2VzKDAsIHNvdXJjZV9kdXJhdGlvbik7Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2U6Ok9uQXVkaW9UcmFja0NoYW5nZWQoQXVkaW9UcmFjayogYXVkaW9fdHJhY2spIHsKKyAgc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXI+IHNvdXJjZV9idWZmZXIgPSBhdWRpb190cmFjay0+c291cmNlX2J1ZmZlcigpOworCisgIGlmICghc291cmNlX2J1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyhzb3VyY2VfYnVmZmVyc18tPkNvbnRhaW5zKHNvdXJjZV9idWZmZXIpKTsKKyAgc291cmNlX2J1ZmZlci0+YXVkaW9fdHJhY2tzKCktPlNjaGVkdWxlQ2hhbmdlRXZlbnQoKTsKKworICBib29sIGlzX2FjdGl2ZSA9IChzb3VyY2VfYnVmZmVyLT52aWRlb190cmFja3MoKS0+c2VsZWN0ZWRfaW5kZXgoKSAhPSAtMSkgfHwKKyAgICAgICAgICAgICAgICAgICBzb3VyY2VfYnVmZmVyLT5hdWRpb190cmFja3MoKS0+SGFzRW5hYmxlZFRyYWNrKCk7CisgIFNldFNvdXJjZUJ1ZmZlckFjdGl2ZShzb3VyY2VfYnVmZmVyLCBpc19hY3RpdmUpOworfQorCit2b2lkIE1lZGlhU291cmNlOjpPblZpZGVvVHJhY2tDaGFuZ2VkKFZpZGVvVHJhY2sqIHZpZGVvX3RyYWNrKSB7CisgIHNjb3BlZF9yZWZwdHI8U291cmNlQnVmZmVyPiBzb3VyY2VfYnVmZmVyID0gdmlkZW9fdHJhY2stPnNvdXJjZV9idWZmZXIoKTsKKworICBpZiAoIXNvdXJjZV9idWZmZXIpIHsKKyAgICByZXR1cm47CisgIH0KKworICBEQ0hFQ0soc291cmNlX2J1ZmZlcnNfLT5Db250YWlucyhzb3VyY2VfYnVmZmVyKSk7CisgIGlmICh2aWRlb190cmFjay0+c2VsZWN0ZWQoKSkgeworICAgIHNvdXJjZV9idWZmZXItPnZpZGVvX3RyYWNrcygpLT5PblRyYWNrU2VsZWN0ZWQodmlkZW9fdHJhY2stPmlkKCkpOworICB9CisgIHNvdXJjZV9idWZmZXItPnZpZGVvX3RyYWNrcygpLT5TY2hlZHVsZUNoYW5nZUV2ZW50KCk7CisKKyAgYm9vbCBpc19hY3RpdmUgPSBzb3VyY2VfYnVmZmVyLT52aWRlb190cmFja3MoKS0+c2VsZWN0ZWRfaW5kZXgoKSAhPSAtMSB8fAorICAgICAgICAgICAgICAgICAgIHNvdXJjZV9idWZmZXItPmF1ZGlvX3RyYWNrcygpLT5IYXNFbmFibGVkVHJhY2soKTsKKworICBTZXRTb3VyY2VCdWZmZXJBY3RpdmUoc291cmNlX2J1ZmZlciwgaXNfYWN0aXZlKTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6T3BlbklmSW5FbmRlZFN0YXRlKCkgeworICBpZiAocmVhZHlfc3RhdGVfICE9IGtFbmRlZCkgeworICAgIHJldHVybjsKKyAgfQorCisgIFNldFJlYWR5U3RhdGUoa09wZW4pOworICBjaHVua19kZW11eGVyXy0+VW5tYXJrRW5kT2ZTdHJlYW0oKTsKK30KKworYm9vbCBNZWRpYVNvdXJjZTo6SXNPcGVuKCkgY29uc3QgeyByZXR1cm4gcmVhZHlfc3RhdGVfID09IGtPcGVuOyB9CisKK3ZvaWQgTWVkaWFTb3VyY2U6OlNldFNvdXJjZUJ1ZmZlckFjdGl2ZShTb3VyY2VCdWZmZXIqIHNvdXJjZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19hY3RpdmUpIHsKKyAgLy8gV2UgZG9uJ3Qgc3VwcG9ydCBkZWFjdGl2YXRlIGEgc291cmNlIGJ1ZmZlci4KKyAgRENIRUNLKGlzX2FjdGl2ZSk7CisgIERDSEVDSyhzb3VyY2VfYnVmZmVyc18tPkNvbnRhaW5zKHNvdXJjZV9idWZmZXIpKTsKKworICBpZiAoIWlzX2FjdGl2ZSkgeworICAgIERDSEVDSyhhY3RpdmVfc291cmNlX2J1ZmZlcnNfLT5Db250YWlucyhzb3VyY2VfYnVmZmVyKSk7CisgICAgYWN0aXZlX3NvdXJjZV9idWZmZXJzXy0+UmVtb3ZlKHNvdXJjZV9idWZmZXIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChhY3RpdmVfc291cmNlX2J1ZmZlcnNfLT5Db250YWlucyhzb3VyY2VfYnVmZmVyKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdCBpbmRleCA9IHNvdXJjZV9idWZmZXJzXy0+RmluZChzb3VyY2VfYnVmZmVyKTsKKworICB1aW50MzIgaW5zZXJ0X3Bvc2l0aW9uID0gMDsKKyAgd2hpbGUgKGluc2VydF9wb3NpdGlvbiA8IGFjdGl2ZV9zb3VyY2VfYnVmZmVyc18tPmxlbmd0aCgpICYmCisgICAgICAgICBzb3VyY2VfYnVmZmVyc18tPkZpbmQoYWN0aXZlX3NvdXJjZV9idWZmZXJzXy0+SXRlbShpbnNlcnRfcG9zaXRpb24pKSA8CisgICAgICAgICAgICAgaW5kZXgpIHsKKyAgICArK2luc2VydF9wb3NpdGlvbjsKKyAgfQorCisgIGFjdGl2ZV9zb3VyY2VfYnVmZmVyc18tPkluc2VydChpbnNlcnRfcG9zaXRpb24sIHNvdXJjZV9idWZmZXIpOworfQorCitIVE1MTWVkaWFFbGVtZW50KiBNZWRpYVNvdXJjZTo6R2V0TWVkaWFFbGVtZW50KCkgY29uc3QgeworICByZXR1cm4gYXR0YWNoZWRfZWxlbWVudF87Cit9CisKK3ZvaWQgTWVkaWFTb3VyY2U6OlNldFJlYWR5U3RhdGUoUmVhZHlTdGF0ZSByZWFkeV9zdGF0ZSkgeworICBpZiAocmVhZHlfc3RhdGUgPT0ga0Nsb3NlZCkgeworICAgIGNodW5rX2RlbXV4ZXJfID0gTlVMTDsKKyAgfQorCisgIGlmIChyZWFkeV9zdGF0ZV8gPT0gcmVhZHlfc3RhdGUpIHsKKyAgICByZXR1cm47CisgIH0KKworICBSZWFkeVN0YXRlIG9sZF9zdGF0ZSA9IHJlYWR5X3N0YXRlXzsKKyAgcmVhZHlfc3RhdGVfID0gcmVhZHlfc3RhdGU7CisKKyAgaWYgKElzT3BlbigpKSB7CisgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnNvdXJjZW9wZW4oKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKG9sZF9zdGF0ZSA9PSBrT3BlbiAmJiByZWFkeV9zdGF0ZV8gPT0ga0VuZGVkKSB7CisgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnNvdXJjZWVuZGVkKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyhJc0Nsb3NlZCgpKTsKKworICBhY3RpdmVfc291cmNlX2J1ZmZlcnNfLT5DbGVhcigpOworCisgIC8vIENsZWFyIFNvdXJjZUJ1ZmZlciByZWZlcmVuY2VzIHRvIHRoaXMgb2JqZWN0LgorICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNvdXJjZV9idWZmZXJzXy0+bGVuZ3RoKCk7ICsraSkgeworICAgIHNvdXJjZV9idWZmZXJzXy0+SXRlbShpKS0+T25SZW1vdmVkRnJvbU1lZGlhU291cmNlKCk7CisgIH0KKyAgc291cmNlX2J1ZmZlcnNfLT5DbGVhcigpOworCisgIGF0dGFjaGVkX2VsZW1lbnRfLnJlc2V0KCk7CisKKyAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnNvdXJjZWNsb3NlKCkpOworfQorCitib29sIE1lZGlhU291cmNlOjpJc1VwZGF0aW5nKCkgY29uc3QgeworICAvLyBSZXR1cm4gdHJ1ZSBpZiBhbnkgbWVtYmVyIG9mIHxzb3VyY2VfYnVmZmVyc198IGlzIHVwZGF0aW5nLgorICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNvdXJjZV9idWZmZXJzXy0+bGVuZ3RoKCk7ICsraSkgeworICAgIGlmIChzb3VyY2VfYnVmZmVyc18tPkl0ZW0oaSktPnVwZGF0aW5nKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKwordm9pZCBNZWRpYVNvdXJjZTo6U2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbiBldmVudF9uYW1lKSB7CisgIHNjb3BlZF9yZWZwdHI8RXZlbnQ+IGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50X25hbWUpOworICBldmVudC0+c2V0X3RhcmdldCh0aGlzKTsKKyAgZXZlbnRfcXVldWVfLkVucXVldWUoZXZlbnQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UvbWVkaWFfc291cmNlLmggYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2UvbWVkaWFfc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzhjNGFkNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9tZWRpYV9zb3VyY2UuaApAQCAtMCwwICsxLDE0OSBAQAorLyoKKyAqIENvcHlyaWdodCAoQykgMjAxMyBHb29nbGUgSW5jLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorICogbWV0OgorICoKKyAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisgKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisgKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiBkaXN0cmlidXRpb24uCisgKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisgKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisgKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisgKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisgKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKyAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisgKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorICovCisKKy8vIE1vZGlmaWNhdGlvbnMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX01FRElBX1NPVVJDRV9NRURJQV9TT1VSQ0VfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9NRURJQV9TT1VSQ0VfTUVESUFfU09VUkNFX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2VuLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9hdWRpb190cmFjay5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfcXVldWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50X3RhcmdldC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXJfbGlzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vdGltZV9yYW5nZXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3VybF9yZWdpc3RyeS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vdmlkZW9fdHJhY2suaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9lbnZpcm9ubWVudF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKKy8vIFRoZSBNZWRpYVNvdXJjZSBpbnRlcmZhY2UgZXhwb3NlcyBmdW5jdGlvbmFsaXRpZXMgZm9yIHBsYXlpbmcgYWRhcHRpdmUKKy8vIHN0cmVhbXMuCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLW1lZGlhLXNvdXJjZS0yMDE2MDcwNS8jaWRsLWRlZi1NZWRpYVNvdXJjZQorY2xhc3MgTWVkaWFTb3VyY2UgOiBwdWJsaWMgRXZlbnRUYXJnZXQgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBVcmxSZWdpc3RyeTxNZWRpYVNvdXJjZT4gUmVnaXN0cnk7CisKKyAgLy8gV2ViIEFQSTogTWVkaWFTb3VyY2UKKyAgLy8KKyAgZW51bSBFbmRPZlN0cmVhbUVycm9yIHsga05vRXJyb3IsIGtOZXR3b3JrLCBrRGVjb2RlIH07CisKKyAgZW51bSBSZWFkeVN0YXRlIHsga0Nsb3NlZCwga09wZW4sIGtFbmRlZCB9OworCisgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgorICAvLworICBNZWRpYVNvdXJjZSgpOworICB+TWVkaWFTb3VyY2UoKTsKKworICAvLyBXZWIgQVBJOiBNZWRpYVNvdXJjZQorICAvLworICBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlckxpc3Q+IHNvdXJjZV9idWZmZXJzKCkgY29uc3Q7CisgIHNjb3BlZF9yZWZwdHI8U291cmNlQnVmZmVyTGlzdD4gYWN0aXZlX3NvdXJjZV9idWZmZXJzKCkgY29uc3Q7CisgIFJlYWR5U3RhdGUgcmVhZHlfc3RhdGUoKSBjb25zdDsKKyAgZG91YmxlIGR1cmF0aW9uKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3Q7CisgIHZvaWQgc2V0X2R1cmF0aW9uKGRvdWJsZSBkdXJhdGlvbiwgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKyAgc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXI+IEFkZFNvdXJjZUJ1ZmZlcigKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLCBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOworICB2b2lkIFJlbW92ZVNvdXJjZUJ1ZmZlcihjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisKKyAgdm9pZCBFbmRPZlN0cmVhbShzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOworICB2b2lkIEVuZE9mU3RyZWFtKEVuZE9mU3RyZWFtRXJyb3IgZXJyb3IsCisgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKyAgdm9pZCBTZXRMaXZlU2Vla2FibGVSYW5nZShkb3VibGUgc3RhcnQsIGRvdWJsZSBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKyAgdm9pZCBDbGVhckxpdmVTZWVrYWJsZVJhbmdlKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisKKyAgc3RhdGljIGJvb2wgSXNUeXBlU3VwcG9ydGVkKHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSk7CisKKyAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCisgIC8vCisgIC8vIEhUTUxNZWRpYVNvdXJjZQorICBib29sIEF0dGFjaFRvRWxlbWVudChIVE1MTWVkaWFFbGVtZW50KiBtZWRpYV9lbGVtZW50KTsKKyAgdm9pZCBTZXRDaHVua0RlbXV4ZXJBbmRPcGVuKDo6bWVkaWE6OkNodW5rRGVtdXhlciogY2h1bmtfZGVtdXhlcik7CisgIHZvaWQgQ2xvc2UoKTsKKyAgYm9vbCBJc0Nsb3NlZCgpIGNvbnN0OworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IEdldEJ1ZmZlcmVkUmFuZ2UoKSBjb25zdDsKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBHZXRTZWVrYWJsZSgpIGNvbnN0OworICB2b2lkIE9uQXVkaW9UcmFja0NoYW5nZWQoQXVkaW9UcmFjayogYXVkaW9fdHJhY2spOworICB2b2lkIE9uVmlkZW9UcmFja0NoYW5nZWQoVmlkZW9UcmFjayogdmlkZW9fdHJhY2spOworCisgIC8vIFVzZWQgYnkgU291cmNlQnVmZmVyLgorICB2b2lkIE9wZW5JZkluRW5kZWRTdGF0ZSgpOworICBib29sIElzT3BlbigpIGNvbnN0OworICB2b2lkIFNldFNvdXJjZUJ1ZmZlckFjdGl2ZShTb3VyY2VCdWZmZXIqIHNvdXJjZV9idWZmZXIsIGJvb2wgaXNfYWN0aXZlKTsKKyAgSFRNTE1lZGlhRWxlbWVudCogR2V0TWVkaWFFbGVtZW50KCkgY29uc3Q7CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKE1lZGlhU291cmNlKTsKKworIHByaXZhdGU6CisgIHZvaWQgU2V0UmVhZHlTdGF0ZShSZWFkeVN0YXRlIHJlYWR5X3N0YXRlKTsKKyAgYm9vbCBJc1VwZGF0aW5nKCkgY29uc3Q7CisgIHZvaWQgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbiBldmVudE5hbWUpOworCisgIG1lZGlhOjpDaHVua0RlbXV4ZXIqIGNodW5rX2RlbXV4ZXJfOworICBSZWFkeVN0YXRlIHJlYWR5X3N0YXRlXzsKKyAgRXZlbnRRdWV1ZSBldmVudF9xdWV1ZV87CisgIGJhc2U6OldlYWtQdHI8SFRNTE1lZGlhRWxlbWVudD4gYXR0YWNoZWRfZWxlbWVudF87CisKKyAgc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXJMaXN0PiBzb3VyY2VfYnVmZmVyc187CisgIHNjb3BlZF9yZWZwdHI8U291cmNlQnVmZmVyTGlzdD4gYWN0aXZlX3NvdXJjZV9idWZmZXJzXzsKKworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IGxpdmVfc2Vla2FibGVfcmFuZ2VfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fTUVESUFfU09VUkNFX01FRElBX1NPVVJDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iY2RkZDU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXIuY2MKQEAgLTAsMCArMSw1MjIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBNb2RpZmljYXRpb25zIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9zb3VyY2VfYnVmZmVyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3Jhbmdlcy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3RpbWVzdGFtcF9jb25zdGFudHMuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworbmFtZXNwYWNlIHsKKworc3RhdGljIGJhc2U6OlRpbWVEZWx0YSBEb3VibGVUb1RpbWVEZWx0YShkb3VibGUgdGltZSkgeworICBEQ0hFQ0soIXN0ZDo6aXNuYW4odGltZSkpOworICBEQ0hFQ0tfTkUodGltZSwgLXN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CisKKyAgaWYgKHRpbWUgPT0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7CisgICAgcmV0dXJuIDo6bWVkaWE6OmtJbmZpbml0ZUR1cmF0aW9uOworICB9CisKKyAgLy8gRG9uJ3QgdXNlIGJhc2U6OlRpbWVEZWx0YTo6TWF4KCkgaGVyZSwgYXMgd2Ugd2FudCB0aGUgbGFyZ2VzdCBmaW5pdGUgdGltZQorICAvLyBkZWx0YS4KKyAgYmFzZTo6VGltZURlbHRhIG1heF90aW1lID0gYmFzZTo6VGltZURlbHRhOjpGcm9tSW50ZXJuYWxWYWx1ZSgKKyAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8aW50NjRfdD46Om1heCgpIC0gMSk7CisgIGRvdWJsZSBtYXhfdGltZV9pbl9zZWNvbmRzID0gbWF4X3RpbWUuSW5TZWNvbmRzRigpOworCisgIGlmICh0aW1lID49IG1heF90aW1lX2luX3NlY29uZHMpIHsKKyAgICByZXR1cm4gbWF4X3RpbWU7CisgIH0KKworICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kc0QodGltZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTb3VyY2VCdWZmZXI6OlNvdXJjZUJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyYgaWQsIE1lZGlhU291cmNlKiBtZWRpYV9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICA6Om1lZGlhOjpDaHVua0RlbXV4ZXIqIGNodW5rX2RlbXV4ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBFdmVudFF1ZXVlKiBldmVudF9xdWV1ZSkKKyAgICA6IGlkXyhpZCksCisgICAgICBjaHVua19kZW11eGVyXyhjaHVua19kZW11eGVyKSwKKyAgICAgIG1lZGlhX3NvdXJjZV8obWVkaWFfc291cmNlKSwKKyAgICAgIHRyYWNrX2RlZmF1bHRzXyhuZXcgVHJhY2tEZWZhdWx0TGlzdChOVUxMKSksCisgICAgICBldmVudF9xdWV1ZV8oZXZlbnRfcXVldWUpLAorICAgICAgbW9kZV8oa1NlZ21lbnRzKSwKKyAgICAgIHVwZGF0aW5nXyhmYWxzZSksCisgICAgICB0aW1lc3RhbXBfb2Zmc2V0XygwKSwKKyAgICAgIGF1ZGlvX3RyYWNrc18obmV3IEF1ZGlvVHJhY2tMaXN0KG1lZGlhX3NvdXJjZS0+R2V0TWVkaWFFbGVtZW50KCkpKSwKKyAgICAgIHZpZGVvX3RyYWNrc18obmV3IFZpZGVvVHJhY2tMaXN0KG1lZGlhX3NvdXJjZS0+R2V0TWVkaWFFbGVtZW50KCkpKSwKKyAgICAgIGFwcGVuZF93aW5kb3dfc3RhcnRfKDApLAorICAgICAgYXBwZW5kX3dpbmRvd19lbmRfKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSksCisgICAgICBmaXJzdF9pbml0aWFsaXphdGlvbl9zZWdtZW50X3JlY2VpdmVkXyhmYWxzZSksCisgICAgICBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8oMCksCisgICAgICBwZW5kaW5nX3JlbW92ZV9zdGFydF8oLTEpLAorICAgICAgcGVuZGluZ19yZW1vdmVfZW5kXygtMSkgeworICBEQ0hFQ0soIWlkXy5lbXB0eSgpKTsKKyAgRENIRUNLKG1lZGlhX3NvdXJjZV8pOworICBEQ0hFQ0soY2h1bmtfZGVtdXhlcik7CisgIERDSEVDSyhldmVudF9xdWV1ZSk7CisKKyAgY2h1bmtfZGVtdXhlcl8tPlNldFRyYWNrc1dhdGNoZXIoCisgICAgICBpZF8sIGJhc2U6OkJpbmQoJlNvdXJjZUJ1ZmZlcjo6SW5pdFNlZ21lbnRSZWNlaXZlZCwgdGhpcykpOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlcjo6c2V0X21vZGUoQXBwZW5kTW9kZSBtb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAobWVkaWFfc291cmNlXyA9PSBOVUxMKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisgIGlmICh1cGRhdGluZ18pIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBtZWRpYV9zb3VyY2VfLT5PcGVuSWZJbkVuZGVkU3RhdGUoKTsKKworICBpZiAoY2h1bmtfZGVtdXhlcl8tPklzUGFyc2luZ01lZGlhU2VnbWVudChpZF8pKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgY2h1bmtfZGVtdXhlcl8tPlNldFNlcXVlbmNlTW9kZShpZF8sIG1vZGUgPT0ga1NlcXVlbmNlKTsKKworICBtb2RlXyA9IG1vZGU7Cit9CisKK3Njb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gU291cmNlQnVmZmVyOjpidWZmZXJlZCgKKyAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIGNvbnN0IHsKKyAgaWYgKG1lZGlhX3NvdXJjZV8gPT0gTlVMTCkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiB0aW1lX3JhbmdlcyA9IG5ldyBUaW1lUmFuZ2VzOworICA6Om1lZGlhOjpSYW5nZXM8YmFzZTo6VGltZURlbHRhPiByYW5nZXMgPQorICAgICAgY2h1bmtfZGVtdXhlcl8tPkdldEJ1ZmZlcmVkUmFuZ2VzKGlkXyk7CisgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgcmFuZ2VzLnNpemUoKTsgaSsrKSB7CisgICAgdGltZV9yYW5nZXMtPkFkZChyYW5nZXMuc3RhcnQoaSkuSW5TZWNvbmRzRigpLCByYW5nZXMuZW5kKGkpLkluU2Vjb25kc0YoKSk7CisgIH0KKyAgcmV0dXJuIHRpbWVfcmFuZ2VzOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlcjo6c2V0X3RpbWVzdGFtcF9vZmZzZXQoCisgICAgZG91YmxlIG9mZnNldCwgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7CisgIGlmIChtZWRpYV9zb3VyY2VfID09IE5VTEwpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHVwZGF0aW5nXykgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIG1lZGlhX3NvdXJjZV8tPk9wZW5JZkluRW5kZWRTdGF0ZSgpOworCisgIGlmIChjaHVua19kZW11eGVyXy0+SXNQYXJzaW5nTWVkaWFTZWdtZW50KGlkXykpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICB0aW1lc3RhbXBfb2Zmc2V0XyA9IG9mZnNldDsKKworICBjaHVua19kZW11eGVyXy0+U2V0R3JvdXBTdGFydFRpbWVzdGFtcElmSW5TZXF1ZW5jZU1vZGUoCisgICAgICBpZF8sIERvdWJsZVRvVGltZURlbHRhKHRpbWVzdGFtcF9vZmZzZXRfKSk7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpzZXRfYXBwZW5kX3dpbmRvd19zdGFydCgKKyAgICBkb3VibGUgc3RhcnQsIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAobWVkaWFfc291cmNlXyA9PSBOVUxMKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisgIGlmICh1cGRhdGluZ18pIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RhcnQgPCAwIHx8IHN0YXJ0ID49IGFwcGVuZF93aW5kb3dfZW5kXykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a1NpbXBsZVR5cGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgYXBwZW5kX3dpbmRvd19zdGFydF8gPSBzdGFydDsKK30KKwordm9pZCBTb3VyY2VCdWZmZXI6OnNldF9hcHBlbmRfd2luZG93X2VuZCgKKyAgICBkb3VibGUgZW5kLCBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgaWYgKG1lZGlhX3NvdXJjZV8gPT0gTlVMTCkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorICBpZiAodXBkYXRpbmdfKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0ZDo6aXNuYW4oZW5kKSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a1NpbXBsZVR5cGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisgIC8vIDQuIElmIHRoZSBuZXcgdmFsdWUgaXMgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIGFwcGVuZFdpbmRvd1N0YXJ0IHRoZW4gdGhyb3cgYQorICAvLyAgICBUeXBlRXJyb3IgZXhjZXB0aW9uIGFuZCBhYm9ydCB0aGVzZSBzdGVwcy4KKyAgaWYgKGVuZCA8PSBhcHBlbmRfd2luZG93X3N0YXJ0XykgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a1NpbXBsZVR5cGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgYXBwZW5kX3dpbmRvd19lbmRfID0gZW5kOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlcjo6QXBwZW5kQnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8QXJyYXlCdWZmZXI+JiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgQXBwZW5kQnVmZmVySW50ZXJuYWwoc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEtPmRhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEtPmJ5dGVfbGVuZ3RoKCksIGV4Y2VwdGlvbl9zdGF0ZSk7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpBcHBlbmRCdWZmZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxBcnJheUJ1ZmZlclZpZXc+JiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgQXBwZW5kQnVmZmVySW50ZXJuYWwoc3RhdGljX2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGRhdGEtPmJhc2VfYWRkcmVzcygpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZGF0YS0+Ynl0ZV9sZW5ndGgoKSwgZXhjZXB0aW9uX3N0YXRlKTsKK30KKwordm9pZCBTb3VyY2VCdWZmZXI6OkFib3J0KHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAobWVkaWFfc291cmNlXyA9PSBOVUxMKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisgIGlmICghbWVkaWFfc291cmNlXy0+SXNPcGVuKCkpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocGVuZGluZ19yZW1vdmVfc3RhcnRfICE9IC0xKSB7CisgICAgRENIRUNLKHVwZGF0aW5nXyk7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgQWJvcnRJZlVwZGF0aW5nKCk7CisKKyAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcF9vZmZzZXQgPSBEb3VibGVUb1RpbWVEZWx0YSh0aW1lc3RhbXBfb2Zmc2V0Xyk7CisgIGNodW5rX2RlbXV4ZXJfLT5SZXNldFBhcnNlclN0YXRlKGlkXywgRG91YmxlVG9UaW1lRGVsdGEoYXBwZW5kX3dpbmRvd19zdGFydF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGVUb1RpbWVEZWx0YShhcHBlbmRfd2luZG93X2VuZF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZXN0YW1wX29mZnNldCk7CisgIHRpbWVzdGFtcF9vZmZzZXRfID0gdGltZXN0YW1wX29mZnNldC5JblNlY29uZHNGKCk7CisKKyAgc2V0X2FwcGVuZF93aW5kb3dfc3RhcnQoMCwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgc2V0X2FwcGVuZF93aW5kb3dfZW5kKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdGF0ZSk7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpSZW1vdmUoZG91YmxlIHN0YXJ0LCBkb3VibGUgZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgaWYgKG1lZGlhX3NvdXJjZV8gPT0gTlVMTCkgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorICBpZiAodXBkYXRpbmdfKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0YXJ0IDwgMCB8fCBzdGQ6OmlzbmFuKG1lZGlhX3NvdXJjZV8tPmR1cmF0aW9uKE5VTEwpKSB8fAorICAgICAgc3RhcnQgPiBtZWRpYV9zb3VyY2VfLT5kdXJhdGlvbihOVUxMKSkgeworICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKHNjcmlwdDo6a1NpbXBsZVR5cGVFcnJvcik7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKGVuZCA8PSBzdGFydCB8fCBzdGQ6OmlzbmFuKGVuZCkpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtTaW1wbGVUeXBlRXJyb3IpOworICAgIHJldHVybjsKKyAgfQorCisgIG1lZGlhX3NvdXJjZV8tPk9wZW5JZkluRW5kZWRTdGF0ZSgpOworCisgIHVwZGF0aW5nXyA9IHRydWU7CisKKyAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnVwZGF0ZXN0YXJ0KCkpOworCisgIHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XyA9IHN0YXJ0OworICBwZW5kaW5nX3JlbW92ZV9lbmRfID0gZW5kOworICByZW1vdmVfdGltZXJfLlN0YXJ0KEZST01fSEVSRSwgYmFzZTo6VGltZURlbHRhKCksIHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgJlNvdXJjZUJ1ZmZlcjo6T25SZW1vdmVUaW1lcik7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpzZXRfdHJhY2tfZGVmYXVsdHMoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxUcmFja0RlZmF1bHRMaXN0PiYgdHJhY2tfZGVmYXVsdHMsCisgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7CisgIGlmIChtZWRpYV9zb3VyY2VfID09IE5VTEwpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKHVwZGF0aW5nXykgeworICAgIERPTUV4Y2VwdGlvbjo6UmFpc2UoRE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybjsKKyAgfQorCisgIHRyYWNrX2RlZmF1bHRzXyA9IHRyYWNrX2RlZmF1bHRzOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlcjo6T25SZW1vdmVkRnJvbU1lZGlhU291cmNlKCkgeworICBpZiAobWVkaWFfc291cmNlXyA9PSBOVUxMKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XyAhPSAtMSkgeworICAgIENhbmNlbFJlbW92ZSgpOworICB9IGVsc2UgeworICAgIEFib3J0SWZVcGRhdGluZygpOworICB9CisKKyAgRENIRUNLKG1lZGlhX3NvdXJjZV8pOworCisgIC8vIFRPRE86IEltcGxlbWVudCB0cmFjayBzdXBwb3J0LgorICAvLyBpZiAobWVkaWFfc291cmNlXy0+R2V0TWVkaWFFbGVtZW50KCktPmF1ZGlvX3RyYWNrcygpLmxlbmd0aCgpID4gMCB8fAorICAvLyAgICAgbWVkaWFfc291cmNlXy0+R2V0TWVkaWFFbGVtZW50KCktPmF1ZGlvX3RyYWNrcygpLmxlbmd0aCgpID4gMCkgeworICAvLyAgIFJlbW92ZU1lZGlhVHJhY2tzKCk7CisgIC8vIH0KKworICBjaHVua19kZW11eGVyXy0+UmVtb3ZlSWQoaWRfKTsKKyAgY2h1bmtfZGVtdXhlcl8gPSBOVUxMOworICBtZWRpYV9zb3VyY2VfID0gTlVMTDsKKyAgZXZlbnRfcXVldWVfID0gTlVMTDsKK30KKworZG91YmxlIFNvdXJjZUJ1ZmZlcjo6R2V0SGlnaGVzdFByZXNlbnRhdGlvblRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgRENIRUNLKG1lZGlhX3NvdXJjZV8gIT0gTlVMTCk7CisKKyAgcmV0dXJuIGNodW5rX2RlbXV4ZXJfLT5HZXRIaWdoZXN0UHJlc2VudGF0aW9uVGltZXN0YW1wKGlkXykuSW5TZWNvbmRzRigpOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlcjo6SW5pdFNlZ21lbnRSZWNlaXZlZChzY29wZWRfcHRyPE1lZGlhVHJhY2tzPiB0cmFja3MpIHsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih0cmFja3MpOworCisgIGlmICghZmlyc3RfaW5pdGlhbGl6YXRpb25fc2VnbWVudF9yZWNlaXZlZF8pIHsKKyAgICBtZWRpYV9zb3VyY2VfLT5TZXRTb3VyY2VCdWZmZXJBY3RpdmUodGhpcywgdHJ1ZSk7CisgICAgZmlyc3RfaW5pdGlhbGl6YXRpb25fc2VnbWVudF9yZWNlaXZlZF8gPSB0cnVlOworICB9CisKKyAgLy8gVE9ETzogSW1wbGVtZW50IHRyYWNrIHN1cHBvcnQuCit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2VuIGV2ZW50X25hbWUpIHsKKyAgc2NvcGVkX3JlZnB0cjxFdmVudD4gZXZlbnQgPSBuZXcgRXZlbnQoZXZlbnRfbmFtZSk7CisgIGV2ZW50LT5zZXRfdGFyZ2V0KHRoaXMpOworICBldmVudF9xdWV1ZV8tPkVucXVldWUoZXZlbnQpOworfQorCitib29sIFNvdXJjZUJ1ZmZlcjo6UHJlcGFyZUFwcGVuZChzaXplX3QgbmV3X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAobWVkaWFfc291cmNlXyA9PSBOVUxMKSB7CisgICAgRE9NRXhjZXB0aW9uOjpSYWlzZShET01FeGNlcHRpb246OmtJbnZhbGlkU3RhdGVFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICh1cGRhdGluZ18pIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBEQ0hFQ0sobWVkaWFfc291cmNlXy0+R2V0TWVkaWFFbGVtZW50KCkpOworICBpZiAobWVkaWFfc291cmNlXy0+R2V0TWVkaWFFbGVtZW50KCktPmVycm9yKCkpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRTdGF0ZUVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBtZWRpYV9zb3VyY2VfLT5PcGVuSWZJbkVuZGVkU3RhdGUoKTsKKworICBpZiAoIUV2aWN0Q29kZWRGcmFtZXMobmV3X2RhdGFfc2l6ZSkpIHsKKyAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a1F1b3RhRXhjZWVkZWRFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU291cmNlQnVmZmVyOjpFdmljdENvZGVkRnJhbWVzKHNpemVfdCBuZXdfZGF0YV9zaXplKSB7CisgIERDSEVDSyhtZWRpYV9zb3VyY2VfKTsKKyAgRENIRUNLKG1lZGlhX3NvdXJjZV8tPkdldE1lZGlhRWxlbWVudCgpKTsKKyAgZG91YmxlIGN1cnJlbnRfdGltZSA9IG1lZGlhX3NvdXJjZV8tPkdldE1lZGlhRWxlbWVudCgpLT5jdXJyZW50X3RpbWUoTlVMTCk7CisgIHJldHVybiBjaHVua19kZW11eGVyXy0+RXZpY3RDb2RlZEZyYW1lcygKKyAgICAgIGlkXywgYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kc0QoY3VycmVudF90aW1lKSwgbmV3X2RhdGFfc2l6ZSk7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpBcHBlbmRCdWZmZXJJbnRlcm5hbCgKKyAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiBkYXRhLCB1aW50MzIgc2l6ZSwKKyAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgaWYgKCFQcmVwYXJlQXBwZW5kKHNpemUsIGV4Y2VwdGlvbl9zdGF0ZSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBEQ0hFQ0soZGF0YSB8fCBzaXplID09IDApOworICBpZiAoZGF0YSkgeworICAgIHBlbmRpbmdfYXBwZW5kX2RhdGFfLmluc2VydChwZW5kaW5nX2FwcGVuZF9kYXRhXy5lbmQoKSwgZGF0YSwgZGF0YSArIHNpemUpOworICB9CisgIHBlbmRpbmdfYXBwZW5kX2RhdGFfb2Zmc2V0XyA9IDA7CisKKyAgdXBkYXRpbmdfID0gdHJ1ZTsKKworICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6dXBkYXRlc3RhcnQoKSk7CisKKyAgYXBwZW5kX3RpbWVyXy5TdGFydChGUk9NX0hFUkUsIGJhc2U6OlRpbWVEZWx0YSgpLCB0aGlzLAorICAgICAgICAgICAgICAgICAgICAgICZTb3VyY2VCdWZmZXI6Ok9uQXBwZW5kVGltZXIpOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlcjo6T25BcHBlbmRUaW1lcigpIHsKKyAgY29uc3Qgc2l6ZV90IGtNYXhBcHBlbmRTaXplID0gMTI4ICogMTAyNDsKKworICBEQ0hFQ0sodXBkYXRpbmdfKTsKKworICBEQ0hFQ0tfR0UocGVuZGluZ19hcHBlbmRfZGF0YV8uc2l6ZSgpLCBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8pOworICBzaXplX3QgYXBwZW5kX3NpemUgPQorICAgICAgcGVuZGluZ19hcHBlbmRfZGF0YV8uc2l6ZSgpIC0gcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfOworICBhcHBlbmRfc2l6ZSA9IHN0ZDo6bWluKGFwcGVuZF9zaXplLCBrTWF4QXBwZW5kU2l6ZSk7CisKKyAgdWludDggZHVtbXlbMV07CisgIGNvbnN0IHVpbnQ4KiBkYXRhX3RvX2FwcGVuZCA9CisgICAgICBhcHBlbmRfc2l6ZSA+IDAgPyAmcGVuZGluZ19hcHBlbmRfZGF0YV9bMF0gKyBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8KKyAgICAgICAgICAgICAgICAgICAgICA6IGR1bW15OworCisgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXBfb2Zmc2V0ID0gRG91YmxlVG9UaW1lRGVsdGEodGltZXN0YW1wX29mZnNldF8pOworICBib29sIHN1Y2Nlc3MgPSBjaHVua19kZW11eGVyXy0+QXBwZW5kRGF0YSgKKyAgICAgIGlkXywgZGF0YV90b19hcHBlbmQsIGFwcGVuZF9zaXplLCBEb3VibGVUb1RpbWVEZWx0YShhcHBlbmRfd2luZG93X3N0YXJ0XyksCisgICAgICBEb3VibGVUb1RpbWVEZWx0YShhcHBlbmRfd2luZG93X2VuZF8pLCAmdGltZXN0YW1wX29mZnNldCk7CisKKyAgaWYgKHRpbWVzdGFtcF9vZmZzZXQgIT0gRG91YmxlVG9UaW1lRGVsdGEodGltZXN0YW1wX29mZnNldF8pKSB7CisgICAgdGltZXN0YW1wX29mZnNldF8gPSB0aW1lc3RhbXBfb2Zmc2V0LkluU2Vjb25kc0YoKTsKKyAgfQorCisgIGlmICghc3VjY2VzcykgeworICAgIHBlbmRpbmdfYXBwZW5kX2RhdGFfLmNsZWFyKCk7CisgICAgcGVuZGluZ19hcHBlbmRfZGF0YV9vZmZzZXRfID0gMDsKKyAgICBBcHBlbmRFcnJvcigpOworICB9IGVsc2UgeworICAgIHBlbmRpbmdfYXBwZW5kX2RhdGFfb2Zmc2V0XyArPSBhcHBlbmRfc2l6ZTsKKworICAgIGlmIChwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8gPCBwZW5kaW5nX2FwcGVuZF9kYXRhXy5zaXplKCkpIHsKKyAgICAgIGFwcGVuZF90aW1lcl8uU3RhcnQoRlJPTV9IRVJFLCBiYXNlOjpUaW1lRGVsdGEoKSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJlNvdXJjZUJ1ZmZlcjo6T25BcHBlbmRUaW1lcik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgdXBkYXRpbmdfID0gZmFsc2U7CisgICAgcGVuZGluZ19hcHBlbmRfZGF0YV8uY2xlYXIoKTsKKyAgICBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8gPSAwOworCisgICAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnVwZGF0ZSgpKTsKKyAgICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6dXBkYXRlZW5kKCkpOworICB9Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpBcHBlbmRFcnJvcigpIHsKKyAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcF9vZmZzZXQgPSBEb3VibGVUb1RpbWVEZWx0YSh0aW1lc3RhbXBfb2Zmc2V0Xyk7CisgIGNodW5rX2RlbXV4ZXJfLT5SZXNldFBhcnNlclN0YXRlKGlkXywgRG91YmxlVG9UaW1lRGVsdGEoYXBwZW5kX3dpbmRvd19zdGFydF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEb3VibGVUb1RpbWVEZWx0YShhcHBlbmRfd2luZG93X2VuZF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGltZXN0YW1wX29mZnNldCk7CisgIHRpbWVzdGFtcF9vZmZzZXRfID0gdGltZXN0YW1wX29mZnNldC5JblNlY29uZHNGKCk7CisKKyAgdXBkYXRpbmdfID0gZmFsc2U7CisKKyAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OmVycm9yKCkpOworICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6dXBkYXRlZW5kKCkpOworICBtZWRpYV9zb3VyY2VfLT5FbmRPZlN0cmVhbShNZWRpYVNvdXJjZTo6a0RlY29kZSwgTlVMTCk7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpPblJlbW92ZVRpbWVyKCkgeworICBEQ0hFQ0sodXBkYXRpbmdfKTsKKyAgRENIRUNLX0dFKHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XywgMCk7CisgIERDSEVDS19MVChwZW5kaW5nX3JlbW92ZV9zdGFydF8sIHBlbmRpbmdfcmVtb3ZlX2VuZF8pOworCisgIGNodW5rX2RlbXV4ZXJfLT5SZW1vdmUoaWRfLCBEb3VibGVUb1RpbWVEZWx0YShwZW5kaW5nX3JlbW92ZV9zdGFydF8pLAorICAgICAgICAgICAgICAgICAgICAgICAgIERvdWJsZVRvVGltZURlbHRhKHBlbmRpbmdfcmVtb3ZlX2VuZF8pKTsKKworICB1cGRhdGluZ18gPSBmYWxzZTsKKyAgcGVuZGluZ19yZW1vdmVfc3RhcnRfID0gLTE7CisgIHBlbmRpbmdfcmVtb3ZlX2VuZF8gPSAtMTsKKworICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6dXBkYXRlKCkpOworICBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2Vuczo6dXBkYXRlZW5kKCkpOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlcjo6Q2FuY2VsUmVtb3ZlKCkgeworICBEQ0hFQ0sodXBkYXRpbmdfKTsKKyAgRENIRUNLX05FKHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XywgLTEpOworICByZW1vdmVfdGltZXJfLlN0b3AoKTsKKyAgcGVuZGluZ19yZW1vdmVfc3RhcnRfID0gLTE7CisgIHBlbmRpbmdfcmVtb3ZlX2VuZF8gPSAtMTsKKyAgdXBkYXRpbmdfID0gZmFsc2U7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyOjpBYm9ydElmVXBkYXRpbmcoKSB7CisgIGlmICghdXBkYXRpbmdfKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgRENIRUNLX0VRKHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XywgLTEpOworCisgIGFwcGVuZF90aW1lcl8uU3RvcCgpOworICBwZW5kaW5nX2FwcGVuZF9kYXRhXy5jbGVhcigpOworICBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF8gPSAwOworCisgIHVwZGF0aW5nXyA9IGZhbHNlOworCisgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjphYm9ydCgpKTsKKyAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OnVwZGF0ZWVuZCgpKTsKK30KKwordm9pZCBTb3VyY2VCdWZmZXI6OlJlbW92ZU1lZGlhVHJhY2tzKCkgeyBOT1RSRUFDSEVEKCk7IH0KKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXIuaCBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9zb3VyY2VfYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDc3ZGQxNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9zb3VyY2VfYnVmZmVyLmgKQEAgLTAsMCArMSwxOTcgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBNb2RpZmljYXRpb25zIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9NRURJQV9TT1VSQ0VfU09VUkNFX0JVRkZFUl9IXworI2RlZmluZSBDT0JBTFRfRE9NX01FRElBX1NPVVJDRV9TT1VSQ0VfQlVGRkVSX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJiYXNlL3RpbWVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdG9rZW4uaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2FycmF5X2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyX3ZpZXcuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2F1ZGlvX3RyYWNrX2xpc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50X3F1ZXVlLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3RpbWVfcmFuZ2VzLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS90cmFja19kZWZhdWx0X2xpc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3ZpZGVvX3RyYWNrX2xpc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV90cmFja3MuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGNlcHRpb25fc3RhdGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworY2xhc3MgTWVkaWFTb3VyY2U7CisKKy8vIFRoZSBTb3VyY2VCdWZmZXIgaW50ZXJmYWNlIGV4cG9zZXMgdGhlIG1lZGlhIHNvdXJjZSBidWZmZXIgc28gaXRzIHVzZXIgY2FuCisvLyBhcHBlbmQgbWVkaWEgZGF0YSB0by4KKy8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItbWVkaWEtc291cmNlLTIwMTYwNzA1LyNzb3VyY2VidWZmZXIKK2NsYXNzIFNvdXJjZUJ1ZmZlciA6IHB1YmxpYyBkb206OkV2ZW50VGFyZ2V0IHsKKyBwdWJsaWM6CisgIC8vIFdlYiBBUEk6IFNvdXJjZUJ1ZmZlcgorICAvLworICBlbnVtIEFwcGVuZE1vZGUgeworICAgIGtTZWdtZW50cywKKyAgICBrU2VxdWVuY2UsCisgIH07CisKKyAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCisgIC8vCisgIFNvdXJjZUJ1ZmZlcihjb25zdCBzdGQ6OnN0cmluZyYgaWQsIE1lZGlhU291cmNlKiBtZWRpYV9zb3VyY2UsCisgICAgICAgICAgICAgICA6Om1lZGlhOjpDaHVua0RlbXV4ZXIqIGNodW5rX2RlbXV4ZXIsIEV2ZW50UXVldWUqIGV2ZW50X3F1ZXVlKTsKKworICAvLyBXZWIgQVBJOiBTb3VyY2VCdWZmZXIKKyAgLy8KKyAgQXBwZW5kTW9kZSBtb2RlKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3QgeworICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm4gbW9kZV87CisgIH0KKyAgdm9pZCBzZXRfbW9kZShBcHBlbmRNb2RlIG1vZGUsIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisgIGJvb2wgdXBkYXRpbmcoKSBjb25zdCB7IHJldHVybiB1cGRhdGluZ187IH0KKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBidWZmZXJlZCgKKyAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3Q7CisgIGRvdWJsZSB0aW1lc3RhbXBfb2Zmc2V0KHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgY29uc3QgeworICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm4gdGltZXN0YW1wX29mZnNldF87CisgIH0KKyAgdm9pZCBzZXRfdGltZXN0YW1wX29mZnNldChkb3VibGUgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisgIHNjb3BlZF9yZWZwdHI8QXVkaW9UcmFja0xpc3Q+IGF1ZGlvX3RyYWNrcygpIGNvbnN0IHsgcmV0dXJuIGF1ZGlvX3RyYWNrc187IH0KKyAgc2NvcGVkX3JlZnB0cjxWaWRlb1RyYWNrTGlzdD4gdmlkZW9fdHJhY2tzKCkgY29uc3QgeyByZXR1cm4gdmlkZW9fdHJhY2tzXzsgfQorICBkb3VibGUgYXBwZW5kX3dpbmRvd19zdGFydChzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIGNvbnN0IHsKKyAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuIGFwcGVuZF93aW5kb3dfc3RhcnRfOworICB9CisgIHZvaWQgc2V0X2FwcGVuZF93aW5kb3dfc3RhcnQoZG91YmxlIHN0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisgIGRvdWJsZSBhcHBlbmRfd2luZG93X2VuZChzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIGNvbnN0IHsKKyAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuIGFwcGVuZF93aW5kb3dfZW5kXzsKKyAgfQorICB2b2lkIHNldF9hcHBlbmRfd2luZG93X2VuZChkb3VibGUgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisgIHZvaWQgQXBwZW5kQnVmZmVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8QXJyYXlCdWZmZXI+JiBkYXRhLAorICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOworICB2b2lkIEFwcGVuZEJ1ZmZlcihjb25zdCBzY29wZWRfcmVmcHRyPEFycmF5QnVmZmVyVmlldz4mIGRhdGEsCisgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisgIHZvaWQgQWJvcnQoc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKyAgdm9pZCBSZW1vdmUoZG91YmxlIHN0YXJ0LCBkb3VibGUgZW5kLAorICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOworICBzY29wZWRfcmVmcHRyPFRyYWNrRGVmYXVsdExpc3Q+IHRyYWNrX2RlZmF1bHRzKAorICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSBjb25zdCB7CisgICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybiB0cmFja19kZWZhdWx0c187CisgIH0KKyAgdm9pZCBzZXRfdHJhY2tfZGVmYXVsdHMoY29uc3Qgc2NvcGVkX3JlZnB0cjxUcmFja0RlZmF1bHRMaXN0PiYgdHJhY2tfZGVmYXVsdHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisKKyAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCisgIC8vCisgIHZvaWQgT25SZW1vdmVkRnJvbU1lZGlhU291cmNlKCk7CisgIGRvdWJsZSBHZXRIaWdoZXN0UHJlc2VudGF0aW9uVGltZXN0YW1wKCkgY29uc3Q7CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKFNvdXJjZUJ1ZmZlcik7CisKKyBwcml2YXRlOgorICB0eXBlZGVmIDo6bWVkaWE6Ok1lZGlhVHJhY2tzIE1lZGlhVHJhY2tzOworCisgIHZvaWQgSW5pdFNlZ21lbnRSZWNlaXZlZChzY29wZWRfcHRyPE1lZGlhVHJhY2tzPiB0cmFja3MpOworICB2b2lkIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW4gZXZlbnRfbmFtZSk7CisgIGJvb2wgUHJlcGFyZUFwcGVuZChzaXplX3QgbmV3X2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSk7CisgIGJvb2wgRXZpY3RDb2RlZEZyYW1lcyhzaXplX3QgbmV3X2RhdGFfc2l6ZSk7CisgIHZvaWQgQXBwZW5kQnVmZmVySW50ZXJuYWwoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgdWludDMyIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKKyAgdm9pZCBPbkFwcGVuZFRpbWVyKCk7CisgIHZvaWQgQXBwZW5kRXJyb3IoKTsKKworICB2b2lkIE9uUmVtb3ZlVGltZXIoKTsKKworICB2b2lkIENhbmNlbFJlbW92ZSgpOworICB2b2lkIEFib3J0SWZVcGRhdGluZygpOworCisgIHZvaWQgUmVtb3ZlTWVkaWFUcmFja3MoKTsKKworICBjb25zdCBUcmFja0RlZmF1bHQqIEdldFRyYWNrRGVmYXVsdCgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFja1R5cGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBieXRlU3RyZWFtVHJhY2tJRCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIERlZmF1bHRUcmFja0xhYmVsKGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBieXRlU3RyZWFtVHJhY2tJRCkgY29uc3Q7CisgIHN0ZDo6c3RyaW5nIERlZmF1bHRUcmFja0xhbmd1YWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiB0cmFja1R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBieXRlU3RyZWFtVHJhY2tJRCkgY29uc3Q7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgaWRfOworICA6Om1lZGlhOjpDaHVua0RlbXV4ZXIqIGNodW5rX2RlbXV4ZXJfOworICBNZWRpYVNvdXJjZSogbWVkaWFfc291cmNlXzsKKyAgc2NvcGVkX3JlZnB0cjxUcmFja0RlZmF1bHRMaXN0PiB0cmFja19kZWZhdWx0c187CisgIEV2ZW50UXVldWUqIGV2ZW50X3F1ZXVlXzsKKworICBBcHBlbmRNb2RlIG1vZGVfOworICBib29sIHVwZGF0aW5nXzsKKyAgZG91YmxlIHRpbWVzdGFtcF9vZmZzZXRfOworICBzY29wZWRfcmVmcHRyPEF1ZGlvVHJhY2tMaXN0PiBhdWRpb190cmFja3NfOworICBzY29wZWRfcmVmcHRyPFZpZGVvVHJhY2tMaXN0PiB2aWRlb190cmFja3NfOworICBkb3VibGUgYXBwZW5kX3dpbmRvd19zdGFydF87CisgIGRvdWJsZSBhcHBlbmRfd2luZG93X2VuZF87CisKKyAgYmFzZTo6T25lU2hvdFRpbWVyPFNvdXJjZUJ1ZmZlcj4gYXBwZW5kX3RpbWVyXzsKKyAgYm9vbCBmaXJzdF9pbml0aWFsaXphdGlvbl9zZWdtZW50X3JlY2VpdmVkXzsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gcGVuZGluZ19hcHBlbmRfZGF0YV87CisgIHNpemVfdCBwZW5kaW5nX2FwcGVuZF9kYXRhX29mZnNldF87CisKKyAgYmFzZTo6T25lU2hvdFRpbWVyPFNvdXJjZUJ1ZmZlcj4gcmVtb3ZlX3RpbWVyXzsKKyAgZG91YmxlIHBlbmRpbmdfcmVtb3ZlX3N0YXJ0XzsKKyAgZG91YmxlIHBlbmRpbmdfcmVtb3ZlX2VuZF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9NRURJQV9TT1VSQ0VfU09VUkNFX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXJfbGlzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9zb3VyY2VfYnVmZmVyX2xpc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTQzZjJmZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9zb3VyY2VfYnVmZmVyX2xpc3QuY2MKQEAgLTAsMCArMSwxMzIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBNb2RpZmljYXRpb25zIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS9zb3VyY2VfYnVmZmVyX2xpc3QuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxsaW1pdHM+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworbmFtZXNwYWNlIHsKKy8vIFNvdXJjZUJ1ZmZlckxpc3QgdXN1YWxseSBjb250YWlucyAyIHNvdXJjZSBidWZmZXJzLgorY29uc3QgaW50IGtTaXplT2ZTb3VyY2VCdWZmZXJUb1Jlc2VydmVJbml0aWFsbHkgPSAyOworfSAgLy8gbmFtZXNwYWNlCisKK1NvdXJjZUJ1ZmZlckxpc3Q6OlNvdXJjZUJ1ZmZlckxpc3QoRXZlbnRRdWV1ZSogZXZlbnRfcXVldWUpCisgICAgOiBldmVudF9xdWV1ZV8oZXZlbnRfcXVldWUpIHsKKyAgRENIRUNLKGV2ZW50X3F1ZXVlXyk7CisgIHNvdXJjZV9idWZmZXJzXy5yZXNlcnZlKGtTaXplT2ZTb3VyY2VCdWZmZXJUb1Jlc2VydmVJbml0aWFsbHkpOworfQorCitTb3VyY2VCdWZmZXJMaXN0Ojp+U291cmNlQnVmZmVyTGlzdCgpIHsgRENIRUNLKHNvdXJjZV9idWZmZXJzXy5lbXB0eSgpKTsgfQorCit1aW50MzIgU291cmNlQnVmZmVyTGlzdDo6bGVuZ3RoKCkgY29uc3QgeworICBEQ0hFQ0tfTEUoc291cmNlX2J1ZmZlcnNfLnNpemUoKSwgc3RkOjpudW1lcmljX2xpbWl0czx1aW50MzI+OjptYXgoKSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzI+KHNvdXJjZV9idWZmZXJzXy5zaXplKCkpOworfQorCitzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4gU291cmNlQnVmZmVyTGlzdDo6SXRlbSh1aW50MzIgaW5kZXgpIGNvbnN0IHsKKyAgaWYgKGluZGV4IDwgc291cmNlX2J1ZmZlcnNfLnNpemUoKSkgeworICAgIHJldHVybiBzb3VyY2VfYnVmZmVyc19baW5kZXhdOworICB9CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIFNvdXJjZUJ1ZmZlckxpc3Q6OkFkZChjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIpIHsKKyAgc291cmNlX2J1ZmZlcnNfLnB1c2hfYmFjayhzb3VyY2VfYnVmZmVyKTsKKyAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OmFkZHNvdXJjZWJ1ZmZlcigpKTsKK30KKwordm9pZCBTb3VyY2VCdWZmZXJMaXN0OjpJbnNlcnQoCisgICAgc2l6ZV90IHBvc2l0aW9uLCBjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIpIHsKKyAgc291cmNlX2J1ZmZlcnNfLmluc2VydChzb3VyY2VfYnVmZmVyc18uYmVnaW4oKSArIHBvc2l0aW9uLCBzb3VyY2VfYnVmZmVyKTsKKyAgU2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbnM6OmFkZHNvdXJjZWJ1ZmZlcigpKTsKK30KKwordm9pZCBTb3VyY2VCdWZmZXJMaXN0OjpSZW1vdmUoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXI+JiBzb3VyY2VfYnVmZmVyKSB7CisgIFNvdXJjZUJ1ZmZlcnM6Oml0ZXJhdG9yIGl0ZXIgPQorICAgICAgc3RkOjpmaW5kKHNvdXJjZV9idWZmZXJzXy5iZWdpbigpLCBzb3VyY2VfYnVmZmVyc18uZW5kKCksIHNvdXJjZV9idWZmZXIpOworICBpZiAoaXRlciA9PSBzb3VyY2VfYnVmZmVyc18uZW5kKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBzb3VyY2VfYnVmZmVyc18uZXJhc2UoaXRlcik7CisgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpyZW1vdmVzb3VyY2VidWZmZXIoKSk7Cit9CisKK3NpemVfdCBTb3VyY2VCdWZmZXJMaXN0OjpGaW5kKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U291cmNlQnVmZmVyPiYgc291cmNlX2J1ZmZlcikgY29uc3QgeworICBEQ0hFQ0soQ29udGFpbnMoc291cmNlX2J1ZmZlcikpOworICByZXR1cm4gc3RkOjpkaXN0YW5jZSgKKyAgICAgIHNvdXJjZV9idWZmZXJzXy5iZWdpbigpLAorICAgICAgc3RkOjpmaW5kKHNvdXJjZV9idWZmZXJzXy5iZWdpbigpLCBzb3VyY2VfYnVmZmVyc18uZW5kKCksIHNvdXJjZV9idWZmZXIpKTsKK30KKworYm9vbCBTb3VyY2VCdWZmZXJMaXN0OjpDb250YWlucygKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIpIGNvbnN0IHsKKyAgcmV0dXJuIHN0ZDo6ZmluZChzb3VyY2VfYnVmZmVyc18uYmVnaW4oKSwgc291cmNlX2J1ZmZlcnNfLmVuZCgpLAorICAgICAgICAgICAgICAgICAgIHNvdXJjZV9idWZmZXIpICE9IHNvdXJjZV9idWZmZXJzXy5lbmQoKTsKK30KKwordm9pZCBTb3VyY2VCdWZmZXJMaXN0OjpDbGVhcigpIHsKKyAgc291cmNlX2J1ZmZlcnNfLmNsZWFyKCk7CisgIFNjaGVkdWxlRXZlbnQoYmFzZTo6VG9rZW5zOjpyZW1vdmVzb3VyY2VidWZmZXIoKSk7Cit9CisKK3ZvaWQgU291cmNlQnVmZmVyTGlzdDo6U2NoZWR1bGVFdmVudChiYXNlOjpUb2tlbiBldmVudF9uYW1lKSB7CisgIHNjb3BlZF9yZWZwdHI8RXZlbnQ+IGV2ZW50ID0gbmV3IEV2ZW50KGV2ZW50X25hbWUpOworICBldmVudC0+c2V0X3RhcmdldCh0aGlzKTsKKyAgZXZlbnRfcXVldWVfLT5FbnF1ZXVlKGV2ZW50KTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXJfbGlzdC5oIGIvc3JjL2NvYmFsdC9kb20vbWVkaWFfc291cmNlL3NvdXJjZV9idWZmZXJfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhhYzYzOWMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9tZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlcl9saXN0LmgKQEAgLTAsMCArMSwxMDIgQEAKKy8qCisgKiBDb3B5cmlnaHQgKEMpIDIwMTMgR29vZ2xlIEluYy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKyAqIG1ldDoKKyAqCisgKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorICogZGlzdHJpYnV0aW9uLgorICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKyAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisgKgorICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKyAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisgKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKyAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKyAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisvLyBNb2RpZmljYXRpb25zIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9NRURJQV9TT1VSQ0VfU09VUkNFX0JVRkZFUl9MSVNUX0hfCisjZGVmaW5lIENPQkFMVF9ET01fTUVESUFfU09VUkNFX1NPVVJDRV9CVUZGRVJfTElTVF9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF9xdWV1ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnRfdGFyZ2V0LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKKy8vIFRoZSBTb3VyY2VCdWZmZXJMaXN0IGludGVyZmFjZSByZXByZXNlbnRzIGEgbGlzdCBvZiBTb3VyY2VCdWZmZXIuIEl0IGlzIHVzZWQKKy8vIHRvIGFjY2VzcyBhbGwgdGhlIFNvdXJjZUJ1ZmZlcnMgYW5kIHRoZSBhY3RpdmUgU291cmNlQnVmZmVycyBvZiBhIE1lZGlhU291cmNlCisvLyBvYmplY3QuCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLW1lZGlhLXNvdXJjZS0yMDE2MDcwNS8jc291cmNlYnVmZmVybGlzdAorY2xhc3MgU291cmNlQnVmZmVyTGlzdCA6IHB1YmxpYyBFdmVudFRhcmdldCB7CisgcHVibGljOgorICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgLy8KKyAgZXhwbGljaXQgU291cmNlQnVmZmVyTGlzdChFdmVudFF1ZXVlKiBldmVudF9xdWV1ZSk7CisgIH5Tb3VyY2VCdWZmZXJMaXN0KCkgT1ZFUlJJREU7CisKKyAgLy8gV2ViIEFQSTogU291cmNlQnVmZmVyCisgIC8vCisgIHVpbnQzMiBsZW5ndGgoKSBjb25zdDsKKyAgc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXI+IEl0ZW0odWludDMyIGluZGV4KSBjb25zdDsKKworICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgLy8KKyAgdm9pZCBBZGQoY29uc3Qgc2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXI+JiBzb3VyY2VfYnVmZmVyKTsKKyAgdm9pZCBJbnNlcnQoc2l6ZV90IHBvc2l0aW9uLAorICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIpOworICB2b2lkIFJlbW92ZShjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIpOworICBzaXplX3QgRmluZChjb25zdCBzY29wZWRfcmVmcHRyPFNvdXJjZUJ1ZmZlcj4mIHNvdXJjZV9idWZmZXIpIGNvbnN0OworICBib29sIENvbnRhaW5zKGNvbnN0IHNjb3BlZF9yZWZwdHI8U291cmNlQnVmZmVyPiYgc291cmNlX2J1ZmZlcikgY29uc3Q7CisgIHZvaWQgQ2xlYXIoKTsKKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoU291cmNlQnVmZmVyTGlzdCk7CisKKyBwcml2YXRlOgorICAvLyBGcm9tIEV2ZW50VGFyZ2V0LgorICBzdGQ6OnN0cmluZyBHZXREZWJ1Z05hbWUoKSBPVkVSUklERSB7IHJldHVybiAiU291cmNlQnVmZmVyTGlzdCI7IH0KKyAgdm9pZCBTY2hlZHVsZUV2ZW50KGJhc2U6OlRva2VuIGV2ZW50X25hbWUpOworCisgIC8vIFVzZSB2ZWN0b3Igc28gd2UgY2FuIHJlc2VydmUgbWVtb3J5IGluIGN0b3IuCisgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8c2NvcGVkX3JlZnB0cjxTb3VyY2VCdWZmZXI+ID4gU291cmNlQnVmZmVyczsKKyAgU291cmNlQnVmZmVycyBzb3VyY2VfYnVmZmVyc187CisgIEV2ZW50UXVldWUqIGV2ZW50X3F1ZXVlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfRE9NX01FRElBX1NPVVJDRV9TT1VSQ0VfQlVGRkVSX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lbW9yeV9pbmZvLmNjIGIvc3JjL2NvYmFsdC9kb20vbWVtb3J5X2luZm8uY2MKaW5kZXggNzVjOTlmOC4uODc1OGFiOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWVtb3J5X2luZm8uY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbWVtb3J5X2luZm8uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tZW1vcnlfaW5mby5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZW1vcnlfaW5mby5oIGIvc3JjL2NvYmFsdC9kb20vbWVtb3J5X2luZm8uaAppbmRleCBkYWQ5ZDc5Li5kM2RlNmE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tZW1vcnlfaW5mby5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lbW9yeV9pbmZvLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTUVNT1JZX0lORk9fSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NRU1PUllfSU5GT19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVtb3J5X2luZm8uaWRsIGIvc3JjL2NvYmFsdC9kb20vbWVtb3J5X2luZm8uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmOGI3MTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9tZW1vcnlfaW5mby5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gVGhpcyBpcyBhIG5vbi1zdGFuZGFyZCBpbnRlcmZhY2UgaW4gQ2hyb21pdW0uCisvLyBodHRwczovL2RvY3Mud2VicGxhdGZvcm0ub3JnL3dpa2kvYXBpcy90aW1pbmcvcHJvcGVydGllcy9tZW1vcnkKKworWworICBOb0ludGVyZmFjZU9iamVjdCwKK10gaW50ZXJmYWNlIE1lbW9yeUluZm8geworICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgdG90YWxKU0hlYXBTaXplOworICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgdXNlZEpTSGVhcFNpemU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbWVzc2FnZV9ldmVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL21lc3NhZ2VfZXZlbnQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzQyOGM3YQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lc3NhZ2VfZXZlbnQuY2MKQEAgLTAsMCArMSw5MiBAQAorLyogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tZXNzYWdlX2V2ZW50LmgiCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisKK25hbWVzcGFjZSB7Citjb25zdCBjaGFyKiBjb25zdCBrUmVzcG9uc2VUeXBlc1tdID0geyJ0ZXh0IiwgImJsb2IiLCAiYXJyYXlidWZmZXIifTsKKworQ09NUElMRV9BU1NFUlQoYXJyYXlzaXplKGtSZXNwb25zZVR5cGVzKSA9PQorICAgICAgICAgICAgICAgICAgIGNvYmFsdDo6ZG9tOjpNZXNzYWdlRXZlbnQ6OmtSZXNwb25zZVR5cGVDb2RlTWF4LAorICAgICAgICAgICAgICAgZW51bV9hbmRfYXJyYXlfc2l6ZV9taXNtYXRjaCk7CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworCitzdGQ6OnN0cmluZyBNZXNzYWdlRXZlbnQ6OkdldFJlc3BvbnNlVHlwZUFzU3RyaW5nKAorICAgIGNvbnN0IE1lc3NhZ2VFdmVudDo6UmVzcG9uc2VUeXBlQ29kZSBjb2RlKSB7CisgIERDSEVDS19MVChjb2RlLCBrUmVzcG9uc2VUeXBlQ29kZU1heCk7CisgIGlmICgoY29kZSA+PSBrVGV4dCkgJiYgKGNvZGUgPCBrUmVzcG9uc2VUeXBlQ29kZU1heCkpIHsKKyAgICByZXR1cm4ga1Jlc3BvbnNlVHlwZXNbY29kZV07CisgIH0KKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCk7Cit9CisKK01lc3NhZ2VFdmVudDo6UmVzcG9uc2VUeXBlQ29kZSBNZXNzYWdlRXZlbnQ6OkdldFJlc3BvbnNlVHlwZUNvZGUoCisgICAgYmFzZTo6U3RyaW5nUGllY2UgdG9fbWF0Y2gpIHsKKyAgZm9yIChzdGQ6OnNpemVfdCBpID0gMDsgaSAhPSBhcnJheXNpemUoa1Jlc3BvbnNlVHlwZXMpOyArK2kpIHsKKyAgICBpZiAoU2JTdHJpbmdDb21wYXJlKGtSZXNwb25zZVR5cGVzW2ldLCB0b19tYXRjaC5kYXRhKCksIHRvX21hdGNoLnNpemUoKSkgPT0KKyAgICAgICAgMCkgeworICAgICAgcmV0dXJuIE1lc3NhZ2VFdmVudDo6UmVzcG9uc2VUeXBlQ29kZShpKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGtSZXNwb25zZVR5cGVDb2RlTWF4OworfQorCitNZXNzYWdlRXZlbnQ6OlJlc3BvbnNlVHlwZSBNZXNzYWdlRXZlbnQ6OmRhdGEoKSBjb25zdCB7CisgIHNjb3BlZF9yZWZwdHI8ZG9tOjpBcnJheUJ1ZmZlcj4gcmVzcG9uc2VfYnVmZmVyOworCisgIGNvbnN0IGNoYXIqIGRhdGFfcG9pbnRlciA9IE5VTEw7CisgIGludCBkYXRhX2xlbmd0aCA9IDA7CisgIGlmIChkYXRhXykgeworICAgIGRhdGFfcG9pbnRlciA9IGRhdGFfLT5kYXRhKCk7CisgICAgZGF0YV9sZW5ndGggPSBkYXRhXy0+c2l6ZSgpOworICB9CisKKyAgaWYgKHJlc3BvbnNlX3R5cGVfICE9IGtUZXh0KSB7CisgICAgcmVzcG9uc2VfYnVmZmVyID0gbmV3IGRvbTo6QXJyYXlCdWZmZXIoCisgICAgICAgIHNldHRpbmdzXywgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGFfcG9pbnRlciksIGRhdGFfbGVuZ3RoKTsKKyAgfQorCisgIHN3aXRjaCAocmVzcG9uc2VfdHlwZV8pIHsKKyAgICBjYXNlIGtUZXh0OiB7CisgICAgICAvLyBUT0RPOiBGaW5kIGEgd2F5IHRvIHJlbW92ZSB0d28gY29waWVzIG9mIGRhdGEgaGVyZS4KKyAgICAgIHN0ZDo6c3RyaW5nIHN0cmluZ19yZXNwb25zZShkYXRhX3BvaW50ZXIsIGRhdGFfbGVuZ3RoKTsKKyAgICAgIHJldHVybiBSZXNwb25zZVR5cGUoc3RyaW5nX3Jlc3BvbnNlKTsKKyAgICB9CisgICAgY2FzZSBrQmxvYjogeworICAgICAgc2NvcGVkX3JlZnB0cjxkb206OkJsb2I+IGJsb2IgPSBuZXcgZG9tOjpCbG9iKHNldHRpbmdzXywgcmVzcG9uc2VfYnVmZmVyKTsKKyAgICAgIHJldHVybiBSZXNwb25zZVR5cGUoYmxvYik7CisgICAgfQorICAgIGNhc2Uga0FycmF5QnVmZmVyOiB7CisgICAgICByZXR1cm4gUmVzcG9uc2VUeXBlKHJlc3BvbnNlX2J1ZmZlcik7CisgICAgfQorICAgIGNhc2Uga1Jlc3BvbnNlVHlwZUNvZGVNYXg6CisgICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgcmVzcG9uc2UgdHlwZS4iOworICAgICAgcmV0dXJuIFJlc3BvbnNlVHlwZSgpOworICB9CisKKyAgcmV0dXJuIFJlc3BvbnNlVHlwZSgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tZXNzYWdlX2V2ZW50LmggYi9zcmMvY29iYWx0L2RvbS9tZXNzYWdlX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyM2JhZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lc3NhZ2VfZXZlbnQuaApAQCAtMCwwICsxLDY4IEBACisvKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9NRVNTQUdFX0VWRU5UX0hfCisjZGVmaW5lIENPQkFMVF9ET01fTUVTU0FHRV9FVkVOVF9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ19waWVjZS5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2VuLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9hcnJheV9idWZmZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2Jsb2IuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC91bmlvbl90eXBlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJuZXQvYmFzZS9pb19idWZmZXIuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworY2xhc3MgTWVzc2FnZUV2ZW50IDogcHVibGljIGRvbTo6RXZlbnQgeworIHB1YmxpYzoKKyAgdHlwZWRlZiBzY3JpcHQ6OlVuaW9uVHlwZTM8c3RkOjpzdHJpbmcsIHNjb3BlZF9yZWZwdHI8ZG9tOjpCbG9iPiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxkb206OkFycmF5QnVmZmVyPiA+IFJlc3BvbnNlVHlwZTsKKyAgLy8gVGhlc2UgcmVzcG9uc2UgY29kZXMgYXJlIG9yZGVyZWQgaW4gdGhlIGxpa2VseWhvb2Qgb2YgYmVpbmcgdXNlZC4KKyAgLy8gS2VlcGluZyB0aGVtIGluIGV4cGVjdGVkIG9yZGVyIHdpbGwgaGVscCBtYWtlIGNvZGUgZmFzdGVyLgorICBlbnVtIFJlc3BvbnNlVHlwZUNvZGUgeyBrVGV4dCwga0Jsb2IsIGtBcnJheUJ1ZmZlciwga1Jlc3BvbnNlVHlwZUNvZGVNYXggfTsKKworICBNZXNzYWdlRXZlbnQoYmFzZTo6VG9rZW4gdHlwZSwgc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBzZXR0aW5ncywKKyAgICAgICAgICAgICAgIFJlc3BvbnNlVHlwZUNvZGUgcmVzcG9uc2VfdHlwZSwKKyAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8bmV0OjpJT0J1ZmZlcldpdGhTaXplPiYgZGF0YSkKKyAgICAgIDogRXZlbnQodHlwZSksCisgICAgICAgIHNldHRpbmdzXyhzZXR0aW5ncyksCisgICAgICAgIHJlc3BvbnNlX3R5cGVfKHJlc3BvbnNlX3R5cGUpLAorICAgICAgICBkYXRhXyhkYXRhKSB7fQorCisgIFJlc3BvbnNlVHlwZSBkYXRhKCkgY29uc3Q7CisKKyAgLy8gVGhlc2UgaGVscGVyIGZ1bmN0aW9ucyBhcmUgY3VzdG9tLCBhbmQgbm90IGluIGFueSBzcGVjLgorICBzdGF0aWMgc3RkOjpzdHJpbmcgR2V0UmVzcG9uc2VUeXBlQXNTdHJpbmcoY29uc3QgUmVzcG9uc2VUeXBlQ29kZSBjb2RlKTsKKyAgLy8gVGhpcyBmdW5jdGlvbiByZXR1cm5zIGtSZXNwb25zZVR5cGVDb2RlTWF4IGlmIG5vIG1hdGNoIGlzIGZvdW5kLgorICBzdGF0aWMgUmVzcG9uc2VUeXBlQ29kZSBHZXRSZXNwb25zZVR5cGVDb2RlKGJhc2U6OlN0cmluZ1BpZWNlIHRvX21hdGNoKTsKKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVzc2FnZUV2ZW50KQorCisgcHJpdmF0ZToKKyAgc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBzZXR0aW5nc187CisgIFJlc3BvbnNlVHlwZUNvZGUgcmVzcG9uc2VfdHlwZV87CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpJT0J1ZmZlcldpdGhTaXplPiBkYXRhXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfRE9NX01FU1NBR0VfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21lc3NhZ2VfZXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vbWVzc2FnZV9ldmVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjE5ZjYxMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL21lc3NhZ2VfZXZlbnQuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8qIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gSURMIHNvdXJjZTogaHR0cHM6Ly9odG1sLnNwZWMud2hhdHdnLm9yZy9tdWx0aXBhZ2UvY29tbXMuaHRtbCNtZXNzYWdlZXZlbnQKKy8vIE9ubHkgdGhlIHN1YnNldCBvZiB0aGUgSURMIHRoYXQgaXMgbmVjZXNzYXJ5IGZvciBXZWJzb2NrZXRzIGlzIGltcGxlbWVudGVkLgoraW50ZXJmYWNlIE1lc3NhZ2VFdmVudCA6IEV2ZW50IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBkYXRhOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21pbWVfdHlwZV9hcnJheS5jYyBiL3NyYy9jb2JhbHQvZG9tL21pbWVfdHlwZV9hcnJheS5jYwppbmRleCA0Njk1Y2ZjLi41MzE4ZGZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9taW1lX3R5cGVfYXJyYXkuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL21pbWVfdHlwZV9hcnJheS5oIGIvc3JjL2NvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmgKaW5kZXggMzQzNzNiZC4uZTYxNTU1YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTUlNRV9UWVBFX0FSUkFZX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fTUlNRV9UWVBFX0FSUkFZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9taW1lX3R5cGVfYXJyYXkuaWRsIGIvc3JjL2NvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMmQ2MDI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI21pbWV0eXBlYXJyYXkKKworLy8gQSBNaW1lVHlwZUFycmF5IG9iamVjdCByZXByZXNlbnRzIHRoZSBNSU1FIHR5cGVzIGV4cGxpY2l0bHkgc3VwcG9ydGVkIGJ5CisvLyBwbHVnaW5zIHN1cHBvcnRlZCBieSB0aGUgdXNlciBhZ2VudCwgZWFjaCBvZiB3aGljaCBpcyByZXByZXNlbnRlZCBieSBhCisvLyBNaW1lVHlwZSBvYmplY3QuIEN1cnJlbnRseSBvbmx5IHN0dWIgc3VwcG9ydCBpcyByZXF1aXJlZC4KK2ludGVyZmFjZSBNaW1lVHlwZUFycmF5IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGxvbmcgbGVuZ3RoOworfTsKKwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5jYwppbmRleCAwNDA1N2E4Li5mOGE1YTgyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5jYworKysgYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5jYwpAQCAtMSwyMSArMSwyMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmgiCiAKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL25vZGUuaCIKIApAQCAtNzMsOSArNzMsMTAgQEAKICAgdGFza19tYW5hZ2VyXy0+T25NdXRhdGlvbk9ic2VydmVyQ3JlYXRlZCh0aGlzKTsKIH0KIAotTXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25PYnNlcnZlcihjb25zdCBNdXRhdGlvbkNhbGxiYWNrQXJnJiBjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTXV0YXRpb25PYnNlcnZlclRhc2tNYW5hZ2VyKiB0YXNrX21hbmFnZXIpCi0gICAgOiB0YXNrX21hbmFnZXJfKHRhc2tfbWFuYWdlcikgeworTXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25PYnNlcnZlcihzY3JpcHQ6OkVudmlyb25tZW50U2V0dGluZ3MqIHNldHRpbmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdXRhdGlvbkNhbGxiYWNrQXJnJiBjYWxsYmFjaykKKyAgICA6IHRhc2tfbWFuYWdlcl8oYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8RE9NU2V0dGluZ3MqPihzZXR0aW5ncykKKyAgICAgICAgICAgICAgICAgICAgICAgIC0+bXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyKCkpIHsKICAgY2FsbGJhY2tfLnJlc2V0KG5ldyBTY3JpcHRDYWxsYmFjayhjYWxsYmFjaywgdGhpcykpOwogICB0YXNrX21hbmFnZXJfLT5Pbk11dGF0aW9uT2JzZXJ2ZXJDcmVhdGVkKHRoaXMpOwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXIuaCBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmgKaW5kZXggZmE4ZGFhOS4uODc4MTdlNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX01VVEFUSU9OX09CU0VSVkVSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fTVVUQVRJT05fT0JTRVJWRVJfSF8KQEAgLTI1LDYgKzIzLDggQEAKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX2luaXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX3JlY29yZC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2Vudmlyb25tZW50X3NldHRpbmdzLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIApAQCAtNDUsNyArNDUsNyBAQAogICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKGNvbnN0IE11dGF0aW9uUmVjb3JkU2VxdWVuY2UmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TXV0YXRpb25PYnNlcnZlcj4mKT4KICAgICAgIE11dGF0aW9uQ2FsbGJhY2s7Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8TXV0YXRpb25DYWxsYmFjaz4gTXV0YXRpb25DYWxsYmFja0FyZzsKKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPE11dGF0aW9uQ2FsbGJhY2s+IE11dGF0aW9uQ2FsbGJhY2tBcmc7CiAKICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IE11dGF0aW9uUmVjb3JkU2VxdWVuY2UmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNdXRhdGlvbk9ic2VydmVyPiYpPgpAQCAtNTcsOCArNTcsOSBAQAogICAgICAgICAgICAgICAgICAgIE11dGF0aW9uT2JzZXJ2ZXJUYXNrTWFuYWdlciogdGFza19tYW5hZ2VyKTsKIAogICAvLyBXZWIgQXBpOiBNdXRhdGlvbk9ic2VydmVyCi0gIE11dGF0aW9uT2JzZXJ2ZXIoY29uc3QgTXV0YXRpb25DYWxsYmFja0FyZyYgY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgTXV0YXRpb25PYnNlcnZlclRhc2tNYW5hZ2VyKiB0YXNrX21hbmFnZXIpOworICBNdXRhdGlvbk9ic2VydmVyKHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncyogc2V0dGluZ3MsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTXV0YXRpb25DYWxsYmFja0FyZyYgY2FsbGJhY2spOworCiAgIH5NdXRhdGlvbk9ic2VydmVyKCk7CiAKICAgdm9pZCBPYnNlcnZlKGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIHRhcmdldCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmlkbCBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MzEyYTU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXIuaWRsCkBAIC0wLDAgKzEsMjkgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI211dGF0aW9ub2JzZXJ2ZXIKKworWworICBDb25zdHJ1Y3RvcihNdXRhdGlvbkNhbGxiYWNrIGNhbGxiYWNrKSwKKyAgQ29uc3RydWN0b3JDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzLAorXQoraW50ZXJmYWNlIE11dGF0aW9uT2JzZXJ2ZXIgeworICB2b2lkIG9ic2VydmUoTm9kZSB0YXJnZXQsIE11dGF0aW9uT2JzZXJ2ZXJJbml0IG9wdGlvbnMpOworICB2b2lkIGRpc2Nvbm5lY3QoKTsKKyAgc2VxdWVuY2U8TXV0YXRpb25SZWNvcmQ+IHRha2VSZWNvcmRzKCk7Cit9OworCitjYWxsYmFjayBNdXRhdGlvbkNhbGxiYWNrID0gdm9pZCAoc2VxdWVuY2U8TXV0YXRpb25SZWNvcmQ+IG11dGF0aW9ucywgTXV0YXRpb25PYnNlcnZlciBvYnNlcnZlcik7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl9pbml0LmggYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl9pbml0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkMzliMzMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfaW5pdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLSNpZm5kZWYgQ09CQUxUX0RPTV9NVVRBVElPTl9PQlNFUlZFUl9JTklUX0hfCi0jZGVmaW5lIENPQkFMVF9ET01fTVVUQVRJT05fT0JTRVJWRVJfSU5JVF9IXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIGRvbSB7Ci0KLS8vIFJlcHJlc2VudHMgdGhlIE11dGF0aW9uT2JzZXJ2ZXJJbml0IGRpY3Rpb25hcnkgdHlwZSB0aGF0IGlzIHVzZWQgdG8KLS8vIGluaXRpYWxpemUgdGhlIE11dGF0aW9uT2JzZXJ2ZXIgaW50ZXJmYWNlLgotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jbXV0YXRpb25vYnNlcnZlcgotY2xhc3MgTXV0YXRpb25PYnNlcnZlckluaXQgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBzY3JpcHQ6OlNlcXVlbmNlPHN0ZDo6c3RyaW5nPiBTdHJpbmdTZXF1ZW5jZTsKLQotICBNdXRhdGlvbk9ic2VydmVySW5pdCgpCi0gICAgICA6IGNoaWxkX2xpc3RfKGZhbHNlKSwKLSAgICAgICAgYXR0cmlidXRlc18oZmFsc2UpLAotICAgICAgICBoYXNfYXR0cmlidXRlc18oZmFsc2UpLAotICAgICAgICBjaGFyYWN0ZXJfZGF0YV8oZmFsc2UpLAotICAgICAgICBoYXNfY2hhcmFjdGVyX2RhdGFfKGZhbHNlKSwKLSAgICAgICAgc3VidHJlZV8oZmFsc2UpLAotICAgICAgICBhdHRyaWJ1dGVfb2xkX3ZhbHVlXyhmYWxzZSksCi0gICAgICAgIGhhc19hdHRyaWJ1dGVfb2xkX3ZhbHVlXyhmYWxzZSksCi0gICAgICAgIGNoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZV8oZmFsc2UpLAotICAgICAgICBoYXNfY2hhcmFjdGVyX2RhdGFfb2xkX3ZhbHVlXyhmYWxzZSksCi0gICAgICAgIGhhc19hdHRyaWJ1dGVfZmlsdGVyXyhmYWxzZSkge30KLQotICBib29sIGNoaWxkX2xpc3QoKSBjb25zdCB7IHJldHVybiBjaGlsZF9saXN0XzsgfQotICB2b2lkIHNldF9jaGlsZF9saXN0KGJvb2wgdmFsdWUpIHsgY2hpbGRfbGlzdF8gPSB2YWx1ZTsgfQotCi0gIGJvb2wgYXR0cmlidXRlcygpIGNvbnN0IHsKLSAgICBEQ0hFQ0soaGFzX2F0dHJpYnV0ZXNfKTsKLSAgICByZXR1cm4gYXR0cmlidXRlc187Ci0gIH0KLSAgdm9pZCBzZXRfYXR0cmlidXRlcyhib29sIHZhbHVlKSB7Ci0gICAgaGFzX2F0dHJpYnV0ZXNfID0gdHJ1ZTsKLSAgICBhdHRyaWJ1dGVzXyA9IHZhbHVlOwotICB9Ci0gIGJvb2wgaGFzX2F0dHJpYnV0ZXMoKSBjb25zdCB7IHJldHVybiBoYXNfYXR0cmlidXRlc187IH0KLQotICBib29sIGNoYXJhY3Rlcl9kYXRhKCkgY29uc3QgewotICAgIERDSEVDSyhoYXNfY2hhcmFjdGVyX2RhdGFfKTsKLSAgICByZXR1cm4gY2hhcmFjdGVyX2RhdGFfOwotICB9Ci0gIHZvaWQgc2V0X2NoYXJhY3Rlcl9kYXRhKGJvb2wgdmFsdWUpIHsKLSAgICBoYXNfY2hhcmFjdGVyX2RhdGFfID0gdHJ1ZTsKLSAgICBjaGFyYWN0ZXJfZGF0YV8gPSB2YWx1ZTsKLSAgfQotICBib29sIGhhc19jaGFyYWN0ZXJfZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGhhc19jaGFyYWN0ZXJfZGF0YV87IH0KLQotICBib29sIHN1YnRyZWUoKSBjb25zdCB7IHJldHVybiBzdWJ0cmVlXzsgfQotICB2b2lkIHNldF9zdWJ0cmVlKGJvb2wgdmFsdWUpIHsgc3VidHJlZV8gPSB2YWx1ZTsgfQotCi0gIGJvb2wgYXR0cmlidXRlX29sZF92YWx1ZSgpIGNvbnN0IHsKLSAgICBEQ0hFQ0soaGFzX2F0dHJpYnV0ZV9vbGRfdmFsdWVfKTsKLSAgICByZXR1cm4gYXR0cmlidXRlX29sZF92YWx1ZV87Ci0gIH0KLSAgdm9pZCBzZXRfYXR0cmlidXRlX29sZF92YWx1ZShib29sIHZhbHVlKSB7Ci0gICAgaGFzX2F0dHJpYnV0ZV9vbGRfdmFsdWVfID0gdHJ1ZTsKLSAgICBhdHRyaWJ1dGVfb2xkX3ZhbHVlXyA9IHZhbHVlOwotICB9Ci0gIGJvb2wgaGFzX2F0dHJpYnV0ZV9vbGRfdmFsdWUoKSBjb25zdCB7IHJldHVybiBoYXNfYXR0cmlidXRlX29sZF92YWx1ZV87IH0KLQotICBib29sIGNoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZSgpIGNvbnN0IHsKLSAgICBEQ0hFQ0soaGFzX2NoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZV8pOwotICAgIHJldHVybiBjaGFyYWN0ZXJfZGF0YV9vbGRfdmFsdWVfOwotICB9Ci0gIHZvaWQgc2V0X2NoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZShib29sIHZhbHVlKSB7Ci0gICAgaGFzX2NoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZV8gPSB0cnVlOwotICAgIGNoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZV8gPSB2YWx1ZTsKLSAgfQotICBib29sIGhhc19jaGFyYWN0ZXJfZGF0YV9vbGRfdmFsdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGhhc19jaGFyYWN0ZXJfZGF0YV9vbGRfdmFsdWVfOwotICB9Ci0KLSAgY29uc3QgU3RyaW5nU2VxdWVuY2UmIGF0dHJpYnV0ZV9maWx0ZXIoKSBjb25zdCB7Ci0gICAgRENIRUNLKGhhc19hdHRyaWJ1dGVfZmlsdGVyXyk7Ci0gICAgcmV0dXJuIGF0dHJpYnV0ZV9maWx0ZXJfOwotICB9Ci0gIHZvaWQgc2V0X2F0dHJpYnV0ZV9maWx0ZXIoU3RyaW5nU2VxdWVuY2UgdmFsdWUpIHsKLSAgICBoYXNfYXR0cmlidXRlX2ZpbHRlcl8gPSB0cnVlOwotICAgIGF0dHJpYnV0ZV9maWx0ZXJfID0gdmFsdWU7Ci0gIH0KLSAgYm9vbCBoYXNfYXR0cmlidXRlX2ZpbHRlcigpIGNvbnN0IHsgcmV0dXJuIGhhc19hdHRyaWJ1dGVfZmlsdGVyXzsgfQotCi0gcHJpdmF0ZToKLSAgLy8gRGljdGlvbmFyeSBtZW1iZXJzOgotICBib29sIGNoaWxkX2xpc3RfOwotCi0gIGJvb2wgYXR0cmlidXRlc187Ci0gIGJvb2wgaGFzX2F0dHJpYnV0ZXNfOwotCi0gIGJvb2wgY2hhcmFjdGVyX2RhdGFfOwotICBib29sIGhhc19jaGFyYWN0ZXJfZGF0YV87Ci0KLSAgYm9vbCBzdWJ0cmVlXzsKLQotICBib29sIGF0dHJpYnV0ZV9vbGRfdmFsdWVfOwotICBib29sIGhhc19hdHRyaWJ1dGVfb2xkX3ZhbHVlXzsKLQotICBib29sIGNoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZV87Ci0gIGJvb2wgaGFzX2NoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZV87Ci0KLSAgU3RyaW5nU2VxdWVuY2UgYXR0cmlidXRlX2ZpbHRlcl87Ci0gIGJvb2wgaGFzX2F0dHJpYnV0ZV9maWx0ZXJfOwotfTsKLX0gIC8vIG5hbWVzcGFjZSBkb20KLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBDT0JBTFRfRE9NX01VVEFUSU9OX09CU0VSVkVSX0lOSVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX2luaXQuaWRsIGIvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfaW5pdC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzNlZTZlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX2luaXQuaWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI211dGF0aW9ub2JzZXJ2ZXJpbml0CisKK2RpY3Rpb25hcnkgTXV0YXRpb25PYnNlcnZlckluaXQgeworICBib29sZWFuIGNoaWxkTGlzdCA9IGZhbHNlOworICBib29sZWFuIGF0dHJpYnV0ZXM7CisgIGJvb2xlYW4gY2hhcmFjdGVyRGF0YTsKKyAgYm9vbGVhbiBzdWJ0cmVlID0gZmFsc2U7CisgIGJvb2xlYW4gYXR0cmlidXRlT2xkVmFsdWU7CisgIGJvb2xlYW4gY2hhcmFjdGVyRGF0YU9sZFZhbHVlOworICBzZXF1ZW5jZTxET01TdHJpbmc+IGF0dHJpYnV0ZUZpbHRlcjsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuY2MKaW5kZXggYjdjN2M3YS4uM2YxYWFlOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5jYwpAQCAtMSwyMyArMSwyMiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5oIgogCiAjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBkb20gewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyLmggYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuaAppbmRleCBjMDgwNDkyLi44ODM0MWYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90YXNrX21hbmFnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9NVVRBVElPTl9PQlNFUlZFUl9UQVNLX01BTkFHRVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NVVRBVElPTl9PQlNFUlZFUl9UQVNLX01BTkFHRVJfSF8KQEAgLTIxLDExICsxOSwxMiBAQAogCiAjaW5jbHVkZSAiYmFzZS9oYXNoX3RhYmxlcy5oIgogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlci5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBkb20gewogCitjbGFzcyBNdXRhdGlvbk9ic2VydmVyOworCiAvLyBUaGUgTXV0YXRpb24gb2JzZXJ2ZXIgc3BlYyBkZXNjcmliZXMgYSBzZXF1ZW5jZSBvZiBzdGVwcyB0byAicXVldWUgYSBtdXRhdGlvbgogLy8gb2JzZXJ2ZXIgY29tcG91bmQgbWljcm90YXNrIiBhbmQgIm5vdGlmeSBtdXRhdGlvbiBvYnNlcnZlcnMiLiBUaGVzZSBzdGVwcwogLy8gYXJlIGltcGxlbWVudGVkIGluIHRoaXMgaGVscGVyIGNsYXNzLCB3aGljaCBtdXN0IG91dGxpdmUgYWxsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfdGVzdC5jYwppbmRleCAzMmExYTA0Li5hOGZjY2IxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9vYnNlcnZlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCkBAIC05OCw3ICs5Niw3IEBACiAgIEFTU0VSVF9UUlVFKHJlY29yZCk7CiAKICAgLy8gInR5cGUiIGFuZCBhdHRyaWJ1dGUtcmVsYXRlZCBhdHRyaWJ1dGVzIGFyZSBzZXQgYXMgZXhwZWN0ZWQKLSAgRVhQRUNUX1NUUkVRKCJhdHRyaWJ1dGUiLCByZWNvcmQtPnR5cGUoKS5jX3N0cigpKTsKKyAgRVhQRUNUX1NUUkVRKCJhdHRyaWJ1dGVzIiwgcmVjb3JkLT50eXBlKCkuY19zdHIoKSk7CiAgIEVYUEVDVF9UUlVFKHJlY29yZC0+YXR0cmlidXRlX25hbWUoKSk7CiAgIEVYUEVDVF9TVFJFUSgiYXR0cmlidXRlX25hbWUiLCByZWNvcmQtPmF0dHJpYnV0ZV9uYW1lKCktPmNfc3RyKCkpOwogICBFWFBFQ1RfVFJVRShyZWNvcmQtPm9sZF92YWx1ZSgpKTsKQEAgLTExMSw4ICsxMDksMTAgQEAKICAgRVhQRUNUX0ZBTFNFKHJlY29yZC0+YXR0cmlidXRlX25hbWVzcGFjZSgpKTsKIAogICAvLyBVbnJlbGF0ZWQgYXR0cmlidXRlcyBhcmUgbm90IHNldC4KLSAgRVhQRUNUX0ZBTFNFKHJlY29yZC0+YWRkZWRfbm9kZXMoKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWNvcmQtPnJlbW92ZWRfbm9kZXMoKSk7CisgIEFTU0VSVF9UUlVFKHJlY29yZC0+YWRkZWRfbm9kZXMoKSk7CisgIEVYUEVDVF9FUShyZWNvcmQtPmFkZGVkX25vZGVzKCktPmxlbmd0aCgpLCAwKTsKKyAgQVNTRVJUX1RSVUUocmVjb3JkLT5yZW1vdmVkX25vZGVzKCkpOworICBFWFBFQ1RfRVEocmVjb3JkLT5yZW1vdmVkX25vZGVzKCktPmxlbmd0aCgpLCAwKTsKICAgRVhQRUNUX0ZBTFNFKHJlY29yZC0+cHJldmlvdXNfc2libGluZygpKTsKICAgRVhQRUNUX0ZBTFNFKHJlY29yZC0+bmV4dF9zaWJsaW5nKCkpOwogfQpAQCAtMTM1LDggKzEzNSwxMCBAQAogICAvLyBVbnJlbGF0ZWQgYXR0cmlidXRlcyBhcmUgbm90IHNldC4KICAgRVhQRUNUX0ZBTFNFKHJlY29yZC0+YXR0cmlidXRlX25hbWUoKSk7CiAgIEVYUEVDVF9GQUxTRShyZWNvcmQtPmF0dHJpYnV0ZV9uYW1lc3BhY2UoKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWNvcmQtPmFkZGVkX25vZGVzKCkpOwotICBFWFBFQ1RfRkFMU0UocmVjb3JkLT5yZW1vdmVkX25vZGVzKCkpOworICBBU1NFUlRfVFJVRShyZWNvcmQtPmFkZGVkX25vZGVzKCkpOworICBFWFBFQ1RfRVEocmVjb3JkLT5hZGRlZF9ub2RlcygpLT5sZW5ndGgoKSwgMCk7CisgIEFTU0VSVF9UUlVFKHJlY29yZC0+cmVtb3ZlZF9ub2RlcygpKTsKKyAgRVhQRUNUX0VRKHJlY29yZC0+cmVtb3ZlZF9ub2RlcygpLT5sZW5ndGgoKSwgMCk7CiAgIEVYUEVDVF9GQUxTRShyZWNvcmQtPnByZXZpb3VzX3NpYmxpbmcoKSk7CiAgIEVYUEVDVF9GQUxTRShyZWNvcmQtPm5leHRfc2libGluZygpKTsKIH0KQEAgLTIxNCw4ICsyMTYsOCBAQAogCiAgIC8vIEFwcGVuZCBhIG11dGF0aW9uIHJlY29yZHMuCiAgIHNjb3BlZF9yZWZwdHI8TXV0YXRpb25SZWNvcmQ+IHJlY29yZCA9Ci0gICAgICBNdXRhdGlvblJlY29yZDo6Q3JlYXRlQ2hhcmFjdGVyRGF0YU11dGF0aW9uUmVjb3JkKHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9sZF9jaGFyYWN0ZXJfZGF0YSIpOworICAgICAgTXV0YXRpb25SZWNvcmQ6OkNyZWF0ZUNoYXJhY3RlckRhdGFNdXRhdGlvblJlY29yZCgKKyAgICAgICAgICB0YXJnZXQsIHN0ZDo6c3RyaW5nKCJvbGRfY2hhcmFjdGVyX2RhdGEiKSk7CiAgIG9ic2VydmVyLT5RdWV1ZU11dGF0aW9uUmVjb3JkKHJlY29yZCk7CiAKICAgLy8gVGhlIHF1ZXVlZCByZWNvcmQgY2FuIGJlIHRha2VuIG9uY2UuCkBAIC0yMzIsOCArMjM0LDggQEAKICAgLy8gQ3JlYXRlIGEgbmV3IG9ic2VydmVyIGFuZCBxdWV1ZSBhIG11dGF0aW9uIHJlY29yZC4KICAgc2NvcGVkX3JlZnB0cjxNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciA9IENyZWF0ZU9ic2VydmVyKCk7CiAgIHNjb3BlZF9yZWZwdHI8TXV0YXRpb25SZWNvcmQ+IHJlY29yZCA9Ci0gICAgICBNdXRhdGlvblJlY29yZDo6Q3JlYXRlQ2hhcmFjdGVyRGF0YU11dGF0aW9uUmVjb3JkKHRhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9sZF9jaGFyYWN0ZXJfZGF0YSIpOworICAgICAgTXV0YXRpb25SZWNvcmQ6OkNyZWF0ZUNoYXJhY3RlckRhdGFNdXRhdGlvblJlY29yZCgKKyAgICAgICAgICB0YXJnZXQsIHN0ZDo6c3RyaW5nKCJvbGRfY2hhcmFjdGVyX2RhdGEiKSk7CiAgIG9ic2VydmVyLT5RdWV1ZU11dGF0aW9uUmVjb3JkKHJlY29yZCk7CiAKICAgLy8gQ2FsbGJhY2sgc2hvdWxkIGJlIGZpcmVkIHdpdGggdGhlIGZpcnN0IGFyZ3VtZW50IGJlaW5nIGEgc2VxdWVuY2Ugb2YgdGhlCkBAIC0yNzksNyArMjgxLDcgQEAKICAgLy8gYmVlbiBxdWV1ZWQuCiAgIE11dGF0aW9uT2JzZXJ2ZXI6Ok11dGF0aW9uUmVjb3JkU2VxdWVuY2UgcmVjb3JkcyA9IG9ic2VydmVyLT5UYWtlUmVjb3JkcygpOwogICBBU1NFUlRfRVEoMiwgcmVjb3Jkcy5zaXplKCkpOwotICBFWFBFQ1RfRVEocmVjb3Jkcy5hdCgwKS0+dHlwZSgpLCAiYXR0cmlidXRlIik7CisgIEVYUEVDVF9FUShyZWNvcmRzLmF0KDApLT50eXBlKCksICJhdHRyaWJ1dGVzIik7CiAgIEVYUEVDVF9FUShyZWNvcmRzLmF0KDEpLT50eXBlKCksICJjaGFyYWN0ZXJEYXRhIik7CiB9CiAKQEAgLTQxNSwxNCArNDE3LDE2IEBACiAgIEFTU0VSVF9FUSgyLCByZWNvcmRzLnNpemUoKSk7CiAgIEVYUEVDVF9FUSgiY2hpbGRMaXN0IiwgcmVjb3Jkcy5hdCgwKS0+dHlwZSgpKTsKICAgRVhQRUNUX0VRKHJvb3QsIHJlY29yZHMuYXQoMCktPnRhcmdldCgpKTsKLSAgQVNTRVJUX0ZBTFNFKHJlY29yZHMuYXQoMCktPnJlbW92ZWRfbm9kZXMoKSk7CisgIEFTU0VSVF9UUlVFKHJlY29yZHMuYXQoMCktPnJlbW92ZWRfbm9kZXMoKSk7CisgIEFTU0VSVF9FUSgwLCByZWNvcmRzLmF0KDApLT5yZW1vdmVkX25vZGVzKCktPmxlbmd0aCgpKTsKICAgQVNTRVJUX1RSVUUocmVjb3Jkcy5hdCgwKS0+YWRkZWRfbm9kZXMoKSk7CiAgIEFTU0VSVF9FUSgxLCByZWNvcmRzLmF0KDApLT5hZGRlZF9ub2RlcygpLT5sZW5ndGgoKSk7CiAgIEVYUEVDVF9FUShjaGlsZDEsIHJlY29yZHMuYXQoMCktPmFkZGVkX25vZGVzKCktPkl0ZW0oMCkpOwogCiAgIEVYUEVDVF9FUSgiY2hpbGRMaXN0IiwgcmVjb3Jkcy5hdCgxKS0+dHlwZSgpKTsKICAgRVhQRUNUX0VRKGNoaWxkMSwgcmVjb3Jkcy5hdCgxKS0+dGFyZ2V0KCkpOwotICBBU1NFUlRfRkFMU0UocmVjb3Jkcy5hdCgxKS0+cmVtb3ZlZF9ub2RlcygpKTsKKyAgQVNTRVJUX1RSVUUocmVjb3Jkcy5hdCgxKS0+cmVtb3ZlZF9ub2RlcygpKTsKKyAgQVNTRVJUX0VRKDAsIHJlY29yZHMuYXQoMSktPnJlbW92ZWRfbm9kZXMoKS0+bGVuZ3RoKCkpOwogICBBU1NFUlRfVFJVRShyZWNvcmRzLmF0KDEpLT5hZGRlZF9ub2RlcygpKTsKICAgQVNTRVJUX0VRKDEsIHJlY29yZHMuYXQoMSktPmFkZGVkX25vZGVzKCktPmxlbmd0aCgpKTsKICAgRVhQRUNUX0VRKGNoaWxkMiwgcmVjb3Jkcy5hdCgxKS0+YWRkZWRfbm9kZXMoKS0+SXRlbSgwKSk7CkBAIC00NzMsNiArNDc3LDI3IEBACiAgIEFTU0VSVF9FUSgxLCByZWNvcmRzLnNpemUoKSk7CiAgIEVYUEVDVF9FUSgiY2hhcmFjdGVyRGF0YSIsIHJlY29yZHMuYXQoMCktPnR5cGUoKSk7CiAgIEVYUEVDVF9FUSh0ZXh0LCByZWNvcmRzLmF0KDApLT50YXJnZXQoKSk7CisgIEVYUEVDVF9GQUxTRShyZWNvcmRzLmF0KDApLT5vbGRfdmFsdWUoKSk7Cit9CisKK1RFU1RfRihNdXRhdGlvbk9ic2VydmVyVGVzdCwgTXV0YXRlQ2hhcmFjdGVyRGF0YVdpdGhPbGRWYWx1ZSkgeworICBzY29wZWRfcmVmcHRyPEVsZW1lbnQ+IHJvb3QgPSBDcmVhdGVEaXYoKTsKKyAgc2NvcGVkX3JlZnB0cjxUZXh0PiB0ZXh0ID0gZG9jdW1lbnQoKS0+Q3JlYXRlVGV4dE5vZGUoImluaXRpYWwtZGF0YSIpOworICBBU1NFUlRfVFJVRSh0ZXh0KTsKKyAgcm9vdC0+QXBwZW5kQ2hpbGQodGV4dCk7CisKKyAgc2NvcGVkX3JlZnB0cjxNdXRhdGlvbk9ic2VydmVyPiBvYnNlcnZlciA9IENyZWF0ZU9ic2VydmVyKCk7CisgIE11dGF0aW9uT2JzZXJ2ZXJJbml0IG9wdGlvbnM7CisgIG9wdGlvbnMuc2V0X3N1YnRyZWUodHJ1ZSk7CisgIG9wdGlvbnMuc2V0X2NoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZSh0cnVlKTsKKyAgb2JzZXJ2ZXItPk9ic2VydmUocm9vdCwgb3B0aW9ucyk7CisKKyAgdGV4dC0+c2V0X2RhdGEoIm5ldy1kYXRhIik7CisKKyAgTXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25SZWNvcmRTZXF1ZW5jZSByZWNvcmRzID0gb2JzZXJ2ZXItPlRha2VSZWNvcmRzKCk7CisgIEFTU0VSVF9FUSgxLCByZWNvcmRzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiY2hhcmFjdGVyRGF0YSIsIHJlY29yZHMuYXQoMCktPnR5cGUoKSk7CisgIEVYUEVDVF9FUSh0ZXh0LCByZWNvcmRzLmF0KDApLT50YXJnZXQoKSk7CiAgIEFTU0VSVF9UUlVFKHJlY29yZHMuYXQoMCktPm9sZF92YWx1ZSgpKTsKICAgRVhQRUNUX1NUUkVRKCJpbml0aWFsLWRhdGEiLCByZWNvcmRzLmF0KDApLT5vbGRfdmFsdWUoKS0+Y19zdHIoKSk7CiB9CkBAIC00OTUsNyArNTIwLDI3IEBACiAKICAgTXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25SZWNvcmRTZXF1ZW5jZSByZWNvcmRzID0gb2JzZXJ2ZXItPlRha2VSZWNvcmRzKCk7CiAgIEFTU0VSVF9FUSgxLCByZWNvcmRzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiYXR0cmlidXRlIiwgcmVjb3Jkcy5hdCgwKS0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKCJhdHRyaWJ1dGVzIiwgcmVjb3Jkcy5hdCgwKS0+dHlwZSgpKTsKKyAgRVhQRUNUX0VRKHJvb3QsIHJlY29yZHMuYXQoMCktPnRhcmdldCgpKTsKKyAgRVhQRUNUX0ZBTFNFKHJlY29yZHMuYXQoMCktPm9sZF92YWx1ZSgpKTsKKyAgQVNTRVJUX1RSVUUocmVjb3Jkcy5hdCgwKS0+YXR0cmlidXRlX25hbWUoKSk7CisgIEVYUEVDVF9TVFJFUSgiYmFuYW5hIiwgcmVjb3Jkcy5hdCgwKS0+YXR0cmlidXRlX25hbWUoKS0+Y19zdHIoKSk7Cit9CisKK1RFU1RfRihNdXRhdGlvbk9ic2VydmVyVGVzdCwgTXV0YXRlQXR0cmlidXRlV2l0aE9sZFZhbHVlKSB7CisgIHNjb3BlZF9yZWZwdHI8RWxlbWVudD4gcm9vdCA9IENyZWF0ZURpdigpOworICByb290LT5TZXRBdHRyaWJ1dGUoImJhbmFuYSIsICJwdXJwbGUiKTsKKworICBzY29wZWRfcmVmcHRyPE11dGF0aW9uT2JzZXJ2ZXI+IG9ic2VydmVyID0gQ3JlYXRlT2JzZXJ2ZXIoKTsKKyAgTXV0YXRpb25PYnNlcnZlckluaXQgb3B0aW9uczsKKyAgb3B0aW9ucy5zZXRfYXR0cmlidXRlX29sZF92YWx1ZSh0cnVlKTsKKyAgb2JzZXJ2ZXItPk9ic2VydmUocm9vdCwgb3B0aW9ucyk7CisKKyAgcm9vdC0+U2V0QXR0cmlidXRlKCJiYW5hbmEiLCAieWVsbG93Iik7CisKKyAgTXV0YXRpb25PYnNlcnZlcjo6TXV0YXRpb25SZWNvcmRTZXF1ZW5jZSByZWNvcmRzID0gb2JzZXJ2ZXItPlRha2VSZWNvcmRzKCk7CisgIEFTU0VSVF9FUSgxLCByZWNvcmRzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgiYXR0cmlidXRlcyIsIHJlY29yZHMuYXQoMCktPnR5cGUoKSk7CiAgIEVYUEVDVF9FUShyb290LCByZWNvcmRzLmF0KDApLT50YXJnZXQoKSk7CiAgIEFTU0VSVF9UUlVFKHJlY29yZHMuYXQoMCktPm9sZF92YWx1ZSgpKTsKICAgQVNTRVJUX1RSVUUocmVjb3Jkcy5hdCgwKS0+YXR0cmlidXRlX25hbWUoKSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9yZWNvcmQuY2MgYi9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9yZWNvcmQuY2MKaW5kZXggMzFkNmViMi4uOGE3OGQwMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fcmVjb3JkLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlY29yZC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX3JlY29yZC5oIgogCkBAIC0yNiwxNCArMjQsMTUgQEAKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBhdHRyaWJ1dGVfbmFtZSwKICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIG9sZF92YWx1ZSkgewogICBzY29wZWRfcmVmcHRyPE11dGF0aW9uUmVjb3JkPiByZWNvcmQgPQotICAgICAgbmV3IE11dGF0aW9uUmVjb3JkKGJhc2U6OlRva2Vuczo6YXR0cmlidXRlKCksIHRhcmdldCk7CisgICAgICBuZXcgTXV0YXRpb25SZWNvcmQoYmFzZTo6VG9rZW5zOjphdHRyaWJ1dGVzKCksIHRhcmdldCk7CiAgIHJlY29yZC0+YXR0cmlidXRlX25hbWVfID0gYXR0cmlidXRlX25hbWU7CiAgIHJlY29yZC0+b2xkX3ZhbHVlXyA9IG9sZF92YWx1ZTsKICAgcmV0dXJuIHJlY29yZDsKIH0KIAogc2NvcGVkX3JlZnB0cjxNdXRhdGlvblJlY29yZD4gTXV0YXRpb25SZWNvcmQ6OkNyZWF0ZUNoYXJhY3RlckRhdGFNdXRhdGlvblJlY29yZCgKLSAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBvbGRfY2hhcmFjdGVyX2RhdGEpIHsKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQsCisgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+JiBvbGRfY2hhcmFjdGVyX2RhdGEpIHsKICAgc2NvcGVkX3JlZnB0cjxNdXRhdGlvblJlY29yZD4gcmVjb3JkID0KICAgICAgIG5ldyBNdXRhdGlvblJlY29yZChiYXNlOjpUb2tlbnM6OmNoYXJhY3RlckRhdGEoKSwgdGFyZ2V0KTsKICAgcmVjb3JkLT5vbGRfdmFsdWVfID0gb2xkX2NoYXJhY3Rlcl9kYXRhOwpAQCAtNDgsOCArNDcsMTIgQEAKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6Tm9kZT4mIG5leHRfc2libGluZykgewogICBzY29wZWRfcmVmcHRyPE11dGF0aW9uUmVjb3JkPiByZWNvcmQgPQogICAgICAgbmV3IE11dGF0aW9uUmVjb3JkKGJhc2U6OlRva2Vuczo6Y2hpbGRMaXN0KCksIHRhcmdldCk7Ci0gIHJlY29yZC0+YWRkZWRfbm9kZXNfID0gYWRkZWRfbm9kZXM7Ci0gIHJlY29yZC0+cmVtb3ZlZF9ub2Rlc18gPSByZW1vdmVkX25vZGVzOworICBpZiAoYWRkZWRfbm9kZXMpIHsKKyAgICByZWNvcmQtPmFkZGVkX25vZGVzXyA9IGFkZGVkX25vZGVzOworICB9CisgIGlmIChyZW1vdmVkX25vZGVzKSB7CisgICAgcmVjb3JkLT5yZW1vdmVkX25vZGVzXyA9IHJlbW92ZWRfbm9kZXM7CisgIH0KICAgcmVjb3JkLT5wcmV2aW91c19zaWJsaW5nXyA9IHByZXZpb3VzX3NpYmxpbmc7CiAgIHJlY29yZC0+bmV4dF9zaWJsaW5nXyA9IG5leHRfc2libGluZzsKICAgcmV0dXJuIHJlY29yZDsKQEAgLTU3LDcgKzYwLDExIEBACiAKIE11dGF0aW9uUmVjb3JkOjpNdXRhdGlvblJlY29yZChjb25zdCBiYXNlOjpUb2tlbiYgdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQpCi0gICAgOiB0eXBlXyh0eXBlKSwgdGFyZ2V0Xyh0YXJnZXQpIHt9CisgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgIHRhcmdldF8odGFyZ2V0KSwKKyAgICAgIGFkZGVkX25vZGVzXyhuZXcgTm9kZUxpc3QoKSksCisgICAgICByZW1vdmVkX25vZGVzXyhuZXcgTm9kZUxpc3QoKSkge30KKwogTXV0YXRpb25SZWNvcmQ6On5NdXRhdGlvblJlY29yZCgpIHt9CiAKIH0gIC8vIG5hbWVzcGFjZSBkb20KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlY29yZC5oIGIvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fcmVjb3JkLmgKaW5kZXggOWMyMTAxMC4uYWMyZjM1OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fcmVjb3JkLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fcmVjb3JkLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTVVUQVRJT05fUkVDT1JEX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fTVVUQVRJT05fUkVDT1JEX0hfCkBAIC02MCw3ICs1OCw4IEBACiAgICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIG9sZF92YWx1ZSk7CiAKICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8TXV0YXRpb25SZWNvcmQ+IENyZWF0ZUNoYXJhY3RlckRhdGFNdXRhdGlvblJlY29yZCgKLSAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIHRhcmdldCwgY29uc3Qgc3RkOjpzdHJpbmcmIG9sZF9jaGFyYWN0ZXJfZGF0YSk7CisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQsCisgICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIG9sZF9jaGFyYWN0ZXJfZGF0YSk7CiAKICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8TXV0YXRpb25SZWNvcmQ+IENyZWF0ZUNoaWxkTGlzdE11dGF0aW9uUmVjb3JkKAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgdGFyZ2V0LApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fcmVjb3JkLmlkbCBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlY29yZC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjc0ZGQ5MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlY29yZC5pZGwKQEAgLTAsMCArMSwzMCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jbXV0YXRpb25yZWNvcmQKKworW0V4cG9zZWQ9V2luZG93XQoraW50ZXJmYWNlIE11dGF0aW9uUmVjb3JkIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB0eXBlOworICByZWFkb25seSBhdHRyaWJ1dGUgTm9kZSB0YXJnZXQ7CisgIFtTYW1lT2JqZWN0XSByZWFkb25seSBhdHRyaWJ1dGUgTm9kZUxpc3QgYWRkZWROb2RlczsKKyAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlTGlzdCByZW1vdmVkTm9kZXM7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlPyBwcmV2aW91c1NpYmxpbmc7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlPyBuZXh0U2libGluZzsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZz8gYXR0cmlidXRlTmFtZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZz8gYXR0cmlidXRlTmFtZXNwYWNlOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nPyBvbGRWYWx1ZTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9yZXBvcnRlci5jYyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmNjCmluZGV4IDI4YmIwMzcuLjYzOTNiZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbXV0YXRpb25fcmVwb3J0ZXIuaCIKIApAQCAtMzEsOSArMjksMTEgQEAKIC8vIHR5cGVzIG9mIG11dGF0aW9ucy4KIGNsYXNzIE11dGF0aW9uUmVjb3JkQnVpbGRlciB7CiAgcHVibGljOgotICB2aXJ0dWFsIGJvb2wgSXNJbnRlcmVzdGVkKGNvbnN0IE11dGF0aW9uT2JzZXJ2ZXJJbml0JiBvcHRpb25zKSA9IDA7Ci0gIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxNdXRhdGlvblJlY29yZD4gQ3JlYXRlTXV0YXRpb25SZWNvcmQoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQpID0gMDsKKyAgLy8gQ3JlYXRlIGEgbXV0YXRpb24gcmVjb3JkIGlmIHRoZSBvYnNlcnZlciBpcyBpbnRlcmVzdGVkIGluIHRoZSBtdXRhdGlvbgorICAvLyBhY2NvcmRpbmcgdG8gfG9wdGlvbnN8LgorICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8TXV0YXRpb25SZWNvcmQ+IE1heWJlQ3JlYXRlTXV0YXRpb25SZWNvcmQoCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQsCisgICAgICBjb25zdCBNdXRhdGlvbk9ic2VydmVySW5pdCYgb3B0aW9ucykgPSAwOwogfTsKIAogLy8gTXV0YXRpb25SZWNvcmRCdWlsZCBmb3IgYXR0cmlidXRlIG11dGF0aW9ucy4KQEAgLTQzLDcgKzQzLDIzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxzdGQ6OnN0cmluZz4mIG9sZF92YWx1ZSkKICAgICAgIDogYXR0cmlidXRlX25hbWVfKGF0dHJpYnV0ZV9uYW1lKSwgb2xkX3ZhbHVlXyhvbGRfdmFsdWUpIHt9CiAKLSAgYm9vbCBJc0ludGVyZXN0ZWQoY29uc3QgTXV0YXRpb25PYnNlcnZlckluaXQmIG9wdGlvbnMpIE9WRVJSSURFIHsKKyAgc2NvcGVkX3JlZnB0cjxNdXRhdGlvblJlY29yZD4gTWF5YmVDcmVhdGVNdXRhdGlvblJlY29yZCgKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Tm9kZT4mIHRhcmdldCwKKyAgICAgIGNvbnN0IE11dGF0aW9uT2JzZXJ2ZXJJbml0JiBvcHRpb25zKSBPVkVSUklERSB7CisgICAgaWYgKCFJc0ludGVyZXN0ZWQob3B0aW9ucykpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBvbGRfdmFsdWU7CisgICAgaWYgKG9wdGlvbnMuaGFzX2F0dHJpYnV0ZV9vbGRfdmFsdWUoKSAmJiBvcHRpb25zLmF0dHJpYnV0ZV9vbGRfdmFsdWUoKSkgeworICAgICAgb2xkX3ZhbHVlID0gb2xkX3ZhbHVlXzsKKyAgICB9CisgICAgcmV0dXJuIE11dGF0aW9uUmVjb3JkOjpDcmVhdGVBdHRyaWJ1dGVNdXRhdGlvblJlY29yZCgKKyAgICAgICAgdGFyZ2V0LCBhdHRyaWJ1dGVfbmFtZV8sIG9sZF92YWx1ZSk7CisgIH0KKworIHByaXZhdGU6CisgIGJvb2wgSXNJbnRlcmVzdGVkKGNvbnN0IE11dGF0aW9uT2JzZXJ2ZXJJbml0JiBvcHRpb25zKSB7CiAgICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jcXVldWUtYS1tdXRhdGlvbi1yZWNvcmQKICAgICAvLyAyLiBJZiB0eXBlIGlzICJhdHRyaWJ1dGVzIiBhbmQgb3B0aW9ucydzIGF0dHJpYnV0ZXMgaXMgbm90IHRydWUsCiAgICAgLy8gY29udGludWUuCkBAIC02NiwxMyArODIsNiBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKLSAgc2NvcGVkX3JlZnB0cjxNdXRhdGlvblJlY29yZD4gQ3JlYXRlTXV0YXRpb25SZWNvcmQoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQpIE9WRVJSSURFIHsKLSAgICByZXR1cm4gTXV0YXRpb25SZWNvcmQ6OkNyZWF0ZUF0dHJpYnV0ZU11dGF0aW9uUmVjb3JkKAotICAgICAgICB0YXJnZXQsIGF0dHJpYnV0ZV9uYW1lXywgb2xkX3ZhbHVlXyk7Ci0gIH0KLQotIHByaXZhdGU6CiAgIHN0ZDo6c3RyaW5nIGF0dHJpYnV0ZV9uYW1lXzsKICAgYmFzZTo6b3B0aW9uYWw8c3RkOjpzdHJpbmc+IG9sZF92YWx1ZV87CiB9OwpAQCAtODQsMTYgKzkzLDIyIEBACiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgb2xkX2NoYXJhY3Rlcl9kYXRhKQogICAgICAgOiBvbGRfY2hhcmFjdGVyX2RhdGFfKG9sZF9jaGFyYWN0ZXJfZGF0YSkge30KIAotICBib29sIElzSW50ZXJlc3RlZChjb25zdCBNdXRhdGlvbk9ic2VydmVySW5pdCYgb3B0aW9ucykgT1ZFUlJJREUgeworICBzY29wZWRfcmVmcHRyPE11dGF0aW9uUmVjb3JkPiBNYXliZUNyZWF0ZU11dGF0aW9uUmVjb3JkKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgdGFyZ2V0LAorICAgICAgY29uc3QgTXV0YXRpb25PYnNlcnZlckluaXQmIG9wdGlvbnMpIE9WRVJSSURFIHsKICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNxdWV1ZS1hLW11dGF0aW9uLXJlY29yZAogICAgIC8vIDQuIElmIHR5cGUgaXMgImNoYXJhY3RlckRhdGEiIGFuZCBvcHRpb25zJ3MgY2hhcmFjdGVyRGF0YSBpcyBub3QgdHJ1ZSwKICAgICAvLyAgICBjb250aW51ZS4KLSAgICByZXR1cm4gb3B0aW9ucy5oYXNfY2hhcmFjdGVyX2RhdGEoKSAmJiBvcHRpb25zLmNoYXJhY3Rlcl9kYXRhKCk7Ci0gIH0KLSAgc2NvcGVkX3JlZnB0cjxNdXRhdGlvblJlY29yZD4gQ3JlYXRlTXV0YXRpb25SZWNvcmQoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE5vZGU+JiB0YXJnZXQpIE9WRVJSSURFIHsKLSAgICByZXR1cm4gTXV0YXRpb25SZWNvcmQ6OkNyZWF0ZUNoYXJhY3RlckRhdGFNdXRhdGlvblJlY29yZCgKLSAgICAgICAgdGFyZ2V0LCBvbGRfY2hhcmFjdGVyX2RhdGFfKTsKKyAgICBpZiAoIShvcHRpb25zLmhhc19jaGFyYWN0ZXJfZGF0YSgpICYmIG9wdGlvbnMuY2hhcmFjdGVyX2RhdGEoKSkpIHsKKyAgICAgIHJldHVybiBOVUxMOworICAgIH0KKworICAgIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiBvbGRfdmFsdWU7CisgICAgaWYgKG9wdGlvbnMuaGFzX2NoYXJhY3Rlcl9kYXRhX29sZF92YWx1ZSgpICYmCisgICAgICAgIG9wdGlvbnMuY2hhcmFjdGVyX2RhdGFfb2xkX3ZhbHVlKCkpIHsKKyAgICAgIG9sZF92YWx1ZSA9IG9sZF9jaGFyYWN0ZXJfZGF0YV87CisgICAgfQorICAgIHJldHVybiBNdXRhdGlvblJlY29yZDo6Q3JlYXRlQ2hhcmFjdGVyRGF0YU11dGF0aW9uUmVjb3JkKHRhcmdldCwgb2xkX3ZhbHVlKTsKICAgfQogCiAgcHJpdmF0ZToKQEAgLTExMywxNCArMTI4LDE0IEBACiAgICAgICAgIHByZXZpb3VzX3NpYmxpbmdfKHByZXZpb3VzX3NpYmxpbmcpLAogICAgICAgICBuZXh0X3NpYmxpbmdfKG5leHRfc2libGluZykge30KIAotICBib29sIElzSW50ZXJlc3RlZChjb25zdCBNdXRhdGlvbk9ic2VydmVySW5pdCYgb3B0aW9ucykgT1ZFUlJJREUgeworICBzY29wZWRfcmVmcHRyPE11dGF0aW9uUmVjb3JkPiBNYXliZUNyZWF0ZU11dGF0aW9uUmVjb3JkKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgdGFyZ2V0LAorICAgICAgY29uc3QgTXV0YXRpb25PYnNlcnZlckluaXQmIG9wdGlvbnMpIE9WRVJSSURFIHsKICAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNxdWV1ZS1hLW11dGF0aW9uLXJlY29yZAogICAgIC8vIDUuIElmIHR5cGUgaXMgImNoaWxkTGlzdCIgYW5kIG9wdGlvbnMncyBjaGlsZExpc3QgaXMgZmFsc2UsIGNvbnRpbnVlLgotICAgIHJldHVybiBvcHRpb25zLmNoaWxkX2xpc3QoKTsKLSAgfQotCi0gIHNjb3BlZF9yZWZwdHI8TXV0YXRpb25SZWNvcmQ+IENyZWF0ZU11dGF0aW9uUmVjb3JkKAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxOb2RlPiYgdGFyZ2V0KSBPVkVSUklERSB7CisgICAgaWYgKCFvcHRpb25zLmNoaWxkX2xpc3QoKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQogICAgIHJldHVybiBNdXRhdGlvblJlY29yZDo6Q3JlYXRlQ2hpbGRMaXN0TXV0YXRpb25SZWNvcmQoCiAgICAgICAgIHRhcmdldCwgYWRkZWRfbm9kZXNfLCByZW1vdmVkX25vZGVzXywgcHJldmlvdXNfc2libGluZ18sIG5leHRfc2libGluZ18pOwogICB9CkBAIC0xNTYsMTMgKzE3MSwxNiBAQAogICAgIGlmIChyZWdpc3RlcmVkX29ic2VydmVyLnRhcmdldCgpICE9IHRhcmdldCAmJiAhb3B0aW9ucy5zdWJ0cmVlKCkpIHsKICAgICAgIGNvbnRpbnVlOwogICAgIH0KLSAgICAvLyBUaGlzIG9ic2VydmVyIGRvZXNuJ3QgY2FyZSBhYm91dCB0aGlzIG11dGF0aW9uLCBzbyBza2lwIGl0LgotICAgIGlmICghcmVjb3JkX2J1aWxkZXItPklzSW50ZXJlc3RlZChvcHRpb25zKSkgewotICAgICAgY29udGludWU7CisgICAgLy8gUXVldWUgYSBtdXRhdGlvbiByZWNvcmQgb24gdGhlIG9ic2VydmVyLCBpZiB0aGUgb2JzZXJ2ZXIgaXMgaW50ZXJlc3RlZC4KKyAgICBzY29wZWRfcmVmcHRyPE11dGF0aW9uUmVjb3JkPiByZWNvcmQgPQorICAgICAgICByZWNvcmRfYnVpbGRlci0+TWF5YmVDcmVhdGVNdXRhdGlvblJlY29yZCh0YXJnZXQsIG9wdGlvbnMpOworICAgIGlmIChyZWNvcmQpIHsKKyAgICAgIC8vIFRoZXNlIHNob3VsZCBiZSBub24tTlVMTC4KKyAgICAgIERDSEVDSyhyZWNvcmQtPmFkZGVkX25vZGVzKCkpOworICAgICAgRENIRUNLKHJlY29yZC0+cmVtb3ZlZF9ub2RlcygpKTsKKyAgICAgIG9ic2VydmVyLT5RdWV1ZU11dGF0aW9uUmVjb3JkKHJlY29yZCk7CisgICAgICByZXBvcnRlZF9vYnNlcnZlcnMuaW5zZXJ0KG9ic2VydmVyKTsKICAgICB9Ci0gICAgLy8gUXVldWUgYSBtdXRhdGlvbiByZWNvcmQgb24gdGhlIG9ic2VydmVyLgotICAgIG9ic2VydmVyLT5RdWV1ZU11dGF0aW9uUmVjb3JkKHJlY29yZF9idWlsZGVyLT5DcmVhdGVNdXRhdGlvblJlY29yZCh0YXJnZXQpKTsKLSAgICByZXBvcnRlZF9vYnNlcnZlcnMuaW5zZXJ0KG9ic2VydmVyKTsKICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9yZXBvcnRlci5oIGIvc3JjL2NvYmFsdC9kb20vbXV0YXRpb25fcmVwb3J0ZXIuaAppbmRleCBkOGNjZGEzLi4xODk2N2YwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9tdXRhdGlvbl9yZXBvcnRlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL211dGF0aW9uX3JlcG9ydGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTVVUQVRJT05fUkVQT1JURVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9NVVRBVElPTl9SRVBPUlRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbmFtZWRfbm9kZV9tYXAuY2MgYi9zcmMvY29iYWx0L2RvbS9uYW1lZF9ub2RlX21hcC5jYwppbmRleCA4OGZhYzQ3Li5kNmM5YWE4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9uYW1lZF9ub2RlX21hcC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9uYW1lZF9ub2RlX21hcC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL25hbWVkX25vZGVfbWFwLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25hbWVkX25vZGVfbWFwLmggYi9zcmMvY29iYWx0L2RvbS9uYW1lZF9ub2RlX21hcC5oCmluZGV4IDUwMjRiNDguLjBjZDhkYzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL25hbWVkX25vZGVfbWFwLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbmFtZWRfbm9kZV9tYXAuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9OQU1FRF9OT0RFX01BUF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX05BTUVEX05PREVfTUFQX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9uYW1lZF9ub2RlX21hcC5pZGwgYi9zcmMvY29iYWx0L2RvbS9uYW1lZF9ub2RlX21hcC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmJjNmE0MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL25hbWVkX25vZGVfbWFwLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvRE9NLUxldmVsLTMtQ29yZS9jb3JlLmh0bWwjSUQtMTc4MDQ4ODkyMgorCitpbnRlcmZhY2UgTmFtZWROb2RlTWFwIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBnZXR0ZXIgQXR0cj8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgZ2V0dGVyIEF0dHI/IGdldE5hbWVkSXRlbShET01TdHJpbmcgbmFtZSk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmNjIGIvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmNjCmluZGV4IDRlMzFlYWUuLjE1YWU1OWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvci5jYworKysgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuY2MKQEAgLTEsMjEgKzEsMjMgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9uYXZpZ2F0b3IuaCIKIAorI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCIKKwordXNpbmcgY29iYWx0OjptZWRpYV9zZXNzaW9uOjpNZWRpYVNlc3Npb247CisKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGRvbSB7CiAKQEAgLTIzLDcgKzI1LDggQEAKICAgICA6IHVzZXJfYWdlbnRfKHVzZXJfYWdlbnQpLAogICAgICAgbGFuZ3VhZ2VfKGxhbmd1YWdlKSwKICAgICAgIG1pbWVfdHlwZXNfKG5ldyBNaW1lVHlwZUFycmF5KCkpLAotICAgICAgcGx1Z2luc18obmV3IFBsdWdpbkFycmF5KCkpIHt9CisgICAgICBwbHVnaW5zXyhuZXcgUGx1Z2luQXJyYXkoKSksCisgICAgICBtZWRpYV9zZXNzaW9uXyhuZXcgTWVkaWFTZXNzaW9uKCkpIHt9CiAKIGNvbnN0IHN0ZDo6c3RyaW5nJiBOYXZpZ2F0b3I6Omxhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gbGFuZ3VhZ2VfOyB9CiAKQEAgLTQxLDUgKzQ0LDEwIEBACiAgIHJldHVybiBwbHVnaW5zXzsKIH0KIAorY29uc3Qgc2NvcGVkX3JlZnB0cjxjb2JhbHQ6Om1lZGlhX3Nlc3Npb246Ok1lZGlhU2Vzc2lvbj4mCitOYXZpZ2F0b3I6Om1lZGlhX3Nlc3Npb24oKSBjb25zdCB7CisgIHJldHVybiBtZWRpYV9zZXNzaW9uXzsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGRvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yLmggYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaAppbmRleCBlMjI2M2VhLi44ZWUyOGNkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaAorKysgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9OQVZJR0FUT1JfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9OQVZJR0FUT1JfSF8KQEAgLTIyLDYgKzIwLDcgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbWltZV90eXBlX2FycmF5LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9wbHVnaW5fYXJyYXkuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC00OSw2ICs0OCw5IEBACiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWltZVR5cGVBcnJheT4mIG1pbWVfdHlwZXMoKSBjb25zdDsKICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQbHVnaW5BcnJheT4mIHBsdWdpbnMoKSBjb25zdDsKIAorICBjb25zdCBzY29wZWRfcmVmcHRyPGNvYmFsdDo6bWVkaWFfc2Vzc2lvbjo6TWVkaWFTZXNzaW9uPiYgbWVkaWFfc2Vzc2lvbigpCisgICAgICBjb25zdDsKKwogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTmF2aWdhdG9yKTsKIAogIHByaXZhdGU6CkBAIC01OCw2ICs2MCw3IEBACiAgIHN0ZDo6c3RyaW5nIGxhbmd1YWdlXzsKICAgc2NvcGVkX3JlZnB0cjxNaW1lVHlwZUFycmF5PiBtaW1lX3R5cGVzXzsKICAgc2NvcGVkX3JlZnB0cjxQbHVnaW5BcnJheT4gcGx1Z2luc187CisgIHNjb3BlZF9yZWZwdHI8Y29iYWx0OjptZWRpYV9zZXNzaW9uOjpNZWRpYVNlc3Npb24+IG1lZGlhX3Nlc3Npb25fOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihOYXZpZ2F0b3IpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvci5pZGwgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjOTA1MmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3IuaWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjdGhlLW5hdmlnYXRvci1vYmplY3QKKworaW50ZXJmYWNlIE5hdmlnYXRvciB7fTsKKworTmF2aWdhdG9yIGltcGxlbWVudHMgTmF2aWdhdG9ySUQ7CitOYXZpZ2F0b3IgaW1wbGVtZW50cyBOYXZpZ2F0b3JMYW5ndWFnZTsKK05hdmlnYXRvciBpbXBsZW1lbnRzIE5hdmlnYXRvclBsdWdpbnM7CitOYXZpZ2F0b3IgaW1wbGVtZW50cyBOYXZpZ2F0b3JTdG9yYWdlVXRpbHM7CitOYXZpZ2F0b3IgaW1wbGVtZW50cyBOYXZpZ2F0b3JNZWRpYVNlc3Npb247CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3JfaWQuaWRsIGIvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yX2lkLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDU4NDViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbmF2aWdhdG9yX2lkLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI25hdmlnYXRvcmlkCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBOYXZpZ2F0b3JJRCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdXNlckFnZW50OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvcl9sYW5ndWFnZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3JfbGFuZ3VhZ2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMmZmMjcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3JfbGFuZ3VhZ2UuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS93ZWJhcHBhcGlzLmh0bWwjbmF2aWdhdG9ybGFuZ3VhZ2UKKworW05vSW50ZXJmYWNlT2JqZWN0XQoraW50ZXJmYWNlIE5hdmlnYXRvckxhbmd1YWdlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYW5ndWFnZTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3JfcGx1Z2lucy5pZGwgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3JfcGx1Z2lucy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzZhMGE5NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvcl9wbHVnaW5zLmlkbApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI25hdmlnYXRvcnBsdWdpbnMKKworW05vSW50ZXJmYWNlT2JqZWN0XQoraW50ZXJmYWNlIE5hdmlnYXRvclBsdWdpbnMgeworICByZWFkb25seSBhdHRyaWJ1dGUgUGx1Z2luQXJyYXkgcGx1Z2luczsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIE1pbWVUeXBlQXJyYXkgbWltZVR5cGVzOworICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBqYXZhRW5hYmxlZDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3Jfc3RvcmFnZV91dGlscy5pZGwgYi9zcmMvY29iYWx0L2RvbS9uYXZpZ2F0b3Jfc3RvcmFnZV91dGlscy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmIzNjE3MwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL25hdmlnYXRvcl9zdG9yYWdlX3V0aWxzLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI25hdmlnYXRvcnN0b3JhZ2V1dGlscworCitbTm9JbnRlcmZhY2VPYmplY3RdCitpbnRlcmZhY2UgTmF2aWdhdG9yU3RvcmFnZVV0aWxzIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gY29va2llRW5hYmxlZDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ub2RlLmNjIGIvc3JjL2NvYmFsdC9kb20vbm9kZS5jYwppbmRleCBmNmM2YjY5Li43NzgzNGZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ub2RlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL25vZGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ub2RlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25vZGUuaCBiL3NyYy9jb2JhbHQvZG9tL25vZGUuaAppbmRleCAxN2YzNWUyLi5kZmVlYzg5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vbm9kZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX05PREVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9OT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ub2RlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL25vZGUuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2NDk0ODcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9ub2RlLmlkbApAQCAtMCwwICsxLDUxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNub2RlCisKK1sKKyAgR2V0T3BhcXVlUm9vdD1HZXRSb290Tm9kZSwKKyAgQWRkT3BhcXVlUm9vdHM9KEdldFJvb3ROb2RlKSwKK10KK2ludGVyZmFjZSBOb2RlIDogRXZlbnRUYXJnZXQgeworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBFTEVNRU5UX05PREUgPSAxOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBURVhUX05PREUgPSAzOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBDREFUQV9TRUNUSU9OX05PREUgPSA0OyAvLyBoaXN0b3JpY2FsCisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IENPTU1FTlRfTk9ERSA9IDg7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IERPQ1VNRU5UX05PREUgPSA5OworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgbm9kZVR5cGU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbm9kZU5hbWU7CisKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERvY3VtZW50PyBvd25lckRvY3VtZW50OworICByZWFkb25seSBhdHRyaWJ1dGUgTm9kZT8gcGFyZW50Tm9kZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEVsZW1lbnQ/IHBhcmVudEVsZW1lbnQ7CisgIGJvb2xlYW4gaGFzQ2hpbGROb2RlcygpOworICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIE5vZGVMaXN0IGNoaWxkTm9kZXM7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBOb2RlPyBmaXJzdENoaWxkOworICByZWFkb25seSBhdHRyaWJ1dGUgTm9kZT8gbGFzdENoaWxkOworICByZWFkb25seSBhdHRyaWJ1dGUgTm9kZT8gcHJldmlvdXNTaWJsaW5nOworICByZWFkb25seSBhdHRyaWJ1dGUgTm9kZT8gbmV4dFNpYmxpbmc7CisKKyAgYXR0cmlidXRlIERPTVN0cmluZz8gbm9kZVZhbHVlOworICBhdHRyaWJ1dGUgRE9NU3RyaW5nPyB0ZXh0Q29udGVudDsKKworICBOb2RlIGNsb25lTm9kZShvcHRpb25hbCBib29sZWFuIGRlZXAgPSBmYWxzZSk7CisKKyAgYm9vbGVhbiBjb250YWlucyhOb2RlPyBvdGhlcik7CisKKyAgTm9kZSBpbnNlcnRCZWZvcmUoTm9kZSBub2RlLCBOb2RlPyBjaGlsZCk7CisgIE5vZGUgYXBwZW5kQ2hpbGQoTm9kZSBub2RlKTsKKyAgTm9kZSByZXBsYWNlQ2hpbGQoTm9kZSBub2RlLCBOb2RlIGNoaWxkKTsKKyAgTm9kZSByZW1vdmVDaGlsZChOb2RlIGNoaWxkKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ub2RlX2NoaWxkcmVuX2l0ZXJhdG9yLmggYi9zcmMvY29iYWx0L2RvbS9ub2RlX2NoaWxkcmVuX2l0ZXJhdG9yLmgKaW5kZXggNTYzYzgyOS4uNDE4MzQzMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZV9jaGlsZHJlbl9pdGVyYXRvci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfY2hpbGRyZW5faXRlcmF0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9OT0RFX0NISUxEUkVOX0lURVJBVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fTk9ERV9DSElMRFJFTl9JVEVSQVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbm9kZV9kZXNjZW5kYW50c19pdGVyYXRvci5oIGIvc3JjL2NvYmFsdC9kb20vbm9kZV9kZXNjZW5kYW50c19pdGVyYXRvci5oCmluZGV4IDQxMGVkMTAuLmUyY2QwNTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL25vZGVfZGVzY2VuZGFudHNfaXRlcmF0b3IuaAorKysgYi9zcmMvY29iYWx0L2RvbS9ub2RlX2Rlc2NlbmRhbnRzX2l0ZXJhdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTk9ERV9ERVNDRU5EQU5UU19JVEVSQVRPUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX05PREVfREVTQ0VOREFOVFNfSVRFUkFUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25vZGVfZGlzcGF0Y2hfZXZlbnRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfZGlzcGF0Y2hfZXZlbnRfdGVzdC5jYwppbmRleCA5NWIyMjNjLi44YjllMzAwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ub2RlX2Rpc3BhdGNoX2V2ZW50X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbm9kZV9kaXNwYXRjaF9ldmVudF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbm9kZS5oIgogCkBAIC0zNSw3ICszMyw3IEBACiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBkb20gewogCi11c2luZyB0ZXN0aW5nOjpGYWtlU2NyaXB0T2JqZWN0OwordXNpbmcgdGVzdGluZzo6RmFrZVNjcmlwdFZhbHVlOwogdXNpbmcgdGVzdGluZzo6TW9ja0V2ZW50TGlzdGVuZXI7CiAKIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCkBAIC03MSwxNyArNjksMTcgQEAKICAgZXZlbnRfbGlzdGVuZXJfYnViYmxpbmdfID0gTW9ja0V2ZW50TGlzdGVuZXI6OkNyZWF0ZSgpOwogCiAgIGdyYW5kX3BhcmVudF8tPkFkZEV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyX2J1YmJsaW5nXy5nZXQoKSksIGZhbHNlKTsKKyAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lcl9idWJibGluZ18uZ2V0KCkpLCBmYWxzZSk7CiAgIGdyYW5kX3BhcmVudF8tPkFkZEV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyX2NhcHR1cmVfLmdldCgpKSwgdHJ1ZSk7CisgICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0VmFsdWUoZXZlbnRfbGlzdGVuZXJfY2FwdHVyZV8uZ2V0KCkpLCB0cnVlKTsKICAgcGFyZW50Xy0+QWRkRXZlbnRMaXN0ZW5lcigKLSAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXJfYnViYmxpbmdfLmdldCgpKSwgZmFsc2UpOworICAgICAgImZpcmVkIiwgRmFrZVNjcmlwdFZhbHVlKGV2ZW50X2xpc3RlbmVyX2J1YmJsaW5nXy5nZXQoKSksIGZhbHNlKTsKICAgcGFyZW50Xy0+QWRkRXZlbnRMaXN0ZW5lcigKLSAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXJfY2FwdHVyZV8uZ2V0KCkpLCB0cnVlKTsKKyAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lcl9jYXB0dXJlXy5nZXQoKSksIHRydWUpOwogICBjaGlsZF8tPkFkZEV2ZW50TGlzdGVuZXIoCi0gICAgICAiZmlyZWQiLCBGYWtlU2NyaXB0T2JqZWN0KGV2ZW50X2xpc3RlbmVyX2J1YmJsaW5nXy5nZXQoKSksIGZhbHNlKTsKKyAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lcl9idWJibGluZ18uZ2V0KCkpLCBmYWxzZSk7CiAgIGNoaWxkXy0+QWRkRXZlbnRMaXN0ZW5lcigKLSAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRPYmplY3QoZXZlbnRfbGlzdGVuZXJfY2FwdHVyZV8uZ2V0KCkpLCB0cnVlKTsKKyAgICAgICJmaXJlZCIsIEZha2VTY3JpcHRWYWx1ZShldmVudF9saXN0ZW5lcl9jYXB0dXJlXy5nZXQoKSksIHRydWUpOwogfQogCiBOb2RlRGlzcGF0Y2hFdmVudFRlc3Q6On5Ob2RlRGlzcGF0Y2hFdmVudFRlc3QoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3QuY2MKaW5kZXggMmQ2OGJiMS4uYWY3YTMxMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL25vZGVfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3QuaCBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdC5oCmluZGV4IDJhMzRiMjYuLjkwOTMxZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX05PREVfTElTVF9IXwogI2RlZmluZSBDT0JBTFRfRE9NX05PREVfTElTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE0ZjBjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdC5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jbm9kZWxpc3QKKworW0FycmF5Q2xhc3NdCitpbnRlcmZhY2UgTm9kZUxpc3QgeworICBnZXR0ZXIgTm9kZT8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdF9saXZlLmNjIGIvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmUuY2MKaW5kZXggYTA4MzdhOC4uNTQ2MjdhMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmUuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ub2RlX2xpc3RfbGl2ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3RfbGl2ZS5oIGIvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmUuaAppbmRleCAxYWIzNGVjLi5hY2IwNGI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3RfbGl2ZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdF9saXZlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fTk9ERV9MSVNUX0xJVkVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9OT0RFX0xJU1RfTElWRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfbGlzdF9saXZlX3Rlc3QuY2MKaW5kZXggMWVjNTM0ZS4uMzY0NTQ4NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X2xpdmVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3RfbGl2ZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vbm9kZV9saXN0X2xpdmUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbm9kZV9saXN0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3RfdGVzdC5jYwppbmRleCAzYjUyMDgyLi43YmVhOWQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3RfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9ub2RlX2xpc3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL25vZGVfbGlzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ub2RlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9ub2RlX3Rlc3QuY2MKaW5kZXggZDdlNmVkYS4uOTA1NjE5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vbm9kZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL25vZGVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL25vZGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vbm9uX2RvY3VtZW50X3R5cGVfY2hpbGRfbm9kZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9ub25fZG9jdW1lbnRfdHlwZV9jaGlsZF9ub2RlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMDhkOThhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbm9uX2RvY3VtZW50X3R5cGVfY2hpbGRfbm9kZS5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2RvbS8jbm9uZG9jdW1lbnR0eXBlY2hpbGRub2RlCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBOb25Eb2N1bWVudFR5cGVDaGlsZE5vZGUgeworICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gcHJldmlvdXNFbGVtZW50U2libGluZzsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEVsZW1lbnQ/IG5leHRFbGVtZW50U2libGluZzsKK307CitFbGVtZW50IGltcGxlbWVudHMgTm9uRG9jdW1lbnRUeXBlQ2hpbGROb2RlOworQ2hhcmFjdGVyRGF0YSBpbXBsZW1lbnRzIE5vbkRvY3VtZW50VHlwZUNoaWxkTm9kZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL25vbl9lbGVtZW50X3BhcmVudF9ub2RlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL25vbl9lbGVtZW50X3BhcmVudF9ub2RlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44NWIxMmIwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vbm9uX2VsZW1lbnRfcGFyZW50X25vZGUuaWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI25vbmVsZW1lbnRwYXJlbnRub2RlCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBOb25FbGVtZW50UGFyZW50Tm9kZSB7CisgIEVsZW1lbnQ/IGdldEVsZW1lbnRCeUlkKERPTVN0cmluZyBlbGVtZW50SWQpOworfTsKK0RvY3VtZW50IGltcGxlbWVudHMgTm9uRWxlbWVudFBhcmVudE5vZGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wYXJlbnRfbm9kZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9wYXJlbnRfbm9kZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2JiZGJkOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BhcmVudF9ub2RlLmlkbApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyNwYXJlbnRub2RlCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBQYXJlbnROb2RlIHsKKyAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBIVE1MQ29sbGVjdGlvbiBjaGlsZHJlbjsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEVsZW1lbnQ/IGZpcnN0RWxlbWVudENoaWxkOworICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gbGFzdEVsZW1lbnRDaGlsZDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgY2hpbGRFbGVtZW50Q291bnQ7CisKKyAgRWxlbWVudD8gcXVlcnlTZWxlY3RvcihET01TdHJpbmcgc2VsZWN0b3JzKTsKKyAgW05ld09iamVjdF0gTm9kZUxpc3QgcXVlcnlTZWxlY3RvckFsbChET01TdHJpbmcgc2VsZWN0b3JzKTsKK307CitEb2N1bWVudCBpbXBsZW1lbnRzIFBhcmVudE5vZGU7CitFbGVtZW50IGltcGxlbWVudHMgUGFyZW50Tm9kZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3BhcnNlci5oIGIvc3JjL2NvYmFsdC9kb20vcGFyc2VyLmgKaW5kZXggM2JmNzM5Mi4uMTI5N2Q1NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vcGFyc2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fUEFSU0VSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZS5jYyBiL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlLmNjCmluZGV4IDUxOWM0N2MuLjJjYTQ1YTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vcGVyZm9ybWFuY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2UuaCBiL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlLmgKaW5kZXggNWEzODJkMS4uNjE2ZDc1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2UuaAorKysgYi9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1BFUkZPUk1BTkNFX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fUEVSRk9STUFOQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlLmlkbCBiL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yYTI5MGYzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2UuaWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9uYXZpZ2F0aW9uLXRpbWluZy8jcGVyZm9ybWFuY2UKKworaW50ZXJmYWNlIFBlcmZvcm1hbmNlIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIFBlcmZvcm1hbmNlVGltaW5nIHRpbWluZzsKKworICAvLyBDaHJvbWl1bSBjdXN0b20gbWVtYmVyLgorICByZWFkb25seSBhdHRyaWJ1dGUgTWVtb3J5SW5mbyBtZW1vcnk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2VfX2hpZ2hfcmVzb2x1dGlvbl90aW1lLmlkbCBiL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlX19oaWdoX3Jlc29sdXRpb25fdGltZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MTc5ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlX19oaWdoX3Jlc29sdXRpb25fdGltZS5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvV0QtaHItdGltZS0yLTIwMTYwMjI1LyN0aGUtcGVyZm9ybWFuY2UtaW50ZXJmYWNlCisKK3BhcnRpYWwgaW50ZXJmYWNlIFBlcmZvcm1hbmNlIHsKKyAgRE9NSGlnaFJlc1RpbWVTdGFtcCBub3coKTsKK307CisKK3R5cGVkZWYgZG91YmxlIERPTUhpZ2hSZXNUaW1lU3RhbXA7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2VfdGVzdC5jYwppbmRleCBhZWIxYjE0Li44M2JiZjY1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9wZXJmb3JtYW5jZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2VfdGltaW5nLmNjIGIvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2VfdGltaW5nLmNjCmluZGV4IGYzYzEzZjYuLjVhYTBhZWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlX3RpbWluZy5jYworKysgYi9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcGVyZm9ybWFuY2VfdGltaW5nLmggYi9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaAppbmRleCA5NzIzMWY1Li41MDhiZmU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaAorKysgYi9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9QRVJGT1JNQU5DRV9USU1JTkdfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9QRVJGT1JNQU5DRV9USU1JTkdfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3BlcmZvcm1hbmNlX3RpbWluZy5pZGwgYi9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzZTI4ZjUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9wZXJmb3JtYW5jZV90aW1pbmcuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9uYXZpZ2F0aW9uLXRpbWluZy8jc2VjLW5hdmlnYXRpb24tdGltaW5nLWludGVyZmFjZQorCitpbnRlcmZhY2UgUGVyZm9ybWFuY2VUaW1pbmcgeworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsb25nIG5hdmlnYXRpb25TdGFydDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wbHVnaW5fYXJyYXkuY2MgYi9zcmMvY29iYWx0L2RvbS9wbHVnaW5fYXJyYXkuY2MKaW5kZXggZWU5YjFhMi4uNDU5MWMzZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcGx1Z2luX2FycmF5LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wbHVnaW5fYXJyYXkuaCBiL3NyYy9jb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5oCmluZGV4IDRhZDQ3ODYuLmY2MmZjYzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1BMVUdJTl9BUlJBWV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1BMVUdJTl9BUlJBWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcGx1Z2luX2FycmF5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmY4MzlhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BsdWdpbl9hcnJheS5pZGwKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCNwbHVnaW5hcnJheQorCitpbnRlcmZhY2UgUGx1Z2luQXJyYXkgeworICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBsZW5ndGg7Cit9OworCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wcm9ncmVzc19ldmVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL3Byb2dyZXNzX2V2ZW50LmNjCmluZGV4IGJhZDkxNDAuLmFiMDBkMDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3Byb2dyZXNzX2V2ZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3Byb2dyZXNzX2V2ZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vcHJvZ3Jlc3NfZXZlbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcHJvZ3Jlc3NfZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL3Byb2dyZXNzX2V2ZW50LmgKaW5kZXggMzIxYzc1OS4uMzg0Nzc4MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcHJvZ3Jlc3NfZXZlbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS9wcm9ncmVzc19ldmVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1BST0dSRVNTX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fUFJPR1JFU1NfRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3Byb2dyZXNzX2V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL3Byb2dyZXNzX2V2ZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmRhNjM1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vcHJvZ3Jlc3NfZXZlbnQuaWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9wcm9ncmVzcy1ldmVudHMvI2ludGVyZmFjZS1wcm9ncmVzc2V2ZW50CisKK1tDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCitpbnRlcmZhY2UgUHJvZ3Jlc3NFdmVudCA6IEV2ZW50IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gbGVuZ3RoQ29tcHV0YWJsZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbG9uZyBsb2FkZWQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxvbmcgdG90YWw7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcHNldWRvX2VsZW1lbnQuY2MgYi9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5jYwppbmRleCBlZmExYjdiLi5jYjU0OTE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9hbmltYXRhYmxlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5oIGIvc3JjL2NvYmFsdC9kb20vcHNldWRvX2VsZW1lbnQuaAppbmRleCAxOGU5NGQ3Li40NDQxZmIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9wc2V1ZG9fZWxlbWVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3BzZXVkb19lbGVtZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fUFNFVURPX0VMRU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9QU0VVRE9fRUxFTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vcmVnaXN0ZXJlZF9vYnNlcnZlci5oIGIvc3JjL2NvYmFsdC9kb20vcmVnaXN0ZXJlZF9vYnNlcnZlci5oCmluZGV4IGVjNDZiZjguLjBhMjMzODMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3JlZ2lzdGVyZWRfb2JzZXJ2ZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS9yZWdpc3RlcmVkX29ic2VydmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fUkVHSVNURVJFRF9PQlNFUlZFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1JFR0lTVEVSRURfT0JTRVJWRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3JlZ2lzdGVyZWRfb2JzZXJ2ZXJfbGlzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL3JlZ2lzdGVyZWRfb2JzZXJ2ZXJfbGlzdC5jYwppbmRleCA0ZTg2MDA4Li40OWJiMWExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9yZWdpc3RlcmVkX29ic2VydmVyX2xpc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vcmVnaXN0ZXJlZF9vYnNlcnZlcl9saXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vcmVnaXN0ZXJlZF9vYnNlcnZlcl9saXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3JlZ2lzdGVyZWRfb2JzZXJ2ZXJfbGlzdC5oIGIvc3JjL2NvYmFsdC9kb20vcmVnaXN0ZXJlZF9vYnNlcnZlcl9saXN0LmgKaW5kZXggOGFiMjM2NS4uNTU4MjgzMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcmVnaXN0ZXJlZF9vYnNlcnZlcl9saXN0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vcmVnaXN0ZXJlZF9vYnNlcnZlcl9saXN0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fUkVHSVNURVJFRF9PQlNFUlZFUl9MSVNUX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fUkVHSVNURVJFRF9PQlNFUlZFUl9MSVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmNjIGIvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZy5jYwppbmRleCA4ZWU2MWJlLi42MWVjYjU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuaCBiL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuaAppbmRleCBhOTIyYTQxLi4zMWQyMzUzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1JVTEVfTUFUQ0hJTkdfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9SVUxFX01BVENISU5HX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9ydWxlX21hdGNoaW5nX3Rlc3QuY2MKaW5kZXggZmFmOGY3My4uNWYxZTU4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vcnVsZV9tYXRjaGluZ190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmdfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3J1bGVfbWF0Y2hpbmcuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc2NyZWVuLmggYi9zcmMvY29iYWx0L2RvbS9zY3JlZW4uaAppbmRleCA5MWQyOTllLi4xZmQ0M2ZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zY3JlZW4uaAorKysgYi9zcmMvY29iYWx0L2RvbS9zY3JlZW4uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9TQ1JFRU5fSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9TQ1JFRU5fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NjcmVlbi5pZGwgYi9zcmMvY29iYWx0L2RvbS9zY3JlZW4uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMDBhYmIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9zY3JlZW4uaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLXZpZXctMjAxMzEyMTcvI3RoZS1zY3JlZW4taW50ZXJmYWNlCisKK2ludGVyZmFjZSBTY3JlZW4geworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGF2YWlsV2lkdGg7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgYXZhaWxIZWlnaHQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgd2lkdGg7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgaGVpZ2h0OworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBjb2xvckRlcHRoOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBwaXhlbERlcHRoOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NjcmVlbl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vc2NyZWVuX3Rlc3QuY2MKaW5kZXggMWI2N2Q1NC4uODg3OTc3ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc2NyZWVuX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vc2NyZWVuX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9zY3JlZW4uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc2VjdXJpdHlfcG9saWN5X3Zpb2xhdGlvbl9ldmVudC5jYyBiL3NyYy9jb2JhbHQvZG9tL3NlY3VyaXR5X3BvbGljeV92aW9sYXRpb25fZXZlbnQuY2MKaW5kZXggY2RmNjdhYS4uNmQ3Mzk0ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc2VjdXJpdHlfcG9saWN5X3Zpb2xhdGlvbl9ldmVudC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9zZWN1cml0eV9wb2xpY3lfdmlvbGF0aW9uX2V2ZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vc2VjdXJpdHlfcG9saWN5X3Zpb2xhdGlvbl9ldmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zZWN1cml0eV9wb2xpY3lfdmlvbGF0aW9uX2V2ZW50LmggYi9zcmMvY29iYWx0L2RvbS9zZWN1cml0eV9wb2xpY3lfdmlvbGF0aW9uX2V2ZW50LmgKaW5kZXggMDUzYmE3OC4uZTUyNTBkNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc2VjdXJpdHlfcG9saWN5X3Zpb2xhdGlvbl9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3NlY3VyaXR5X3BvbGljeV92aW9sYXRpb25fZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9TRUNVUklUWV9QT0xJQ1lfVklPTEFUSU9OX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fU0VDVVJJVFlfUE9MSUNZX1ZJT0xBVElPTl9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vU2VjdXJpdHlQb2xpY3lWaW9sYXRpb25FdmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS9zZWN1cml0eV9wb2xpY3lfdmlvbGF0aW9uX2V2ZW50LmlkbApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL2NvYmFsdC9kb20vU2VjdXJpdHlQb2xpY3lWaW9sYXRpb25FdmVudC5pZGwKcmVuYW1lIHRvIHNyYy9jb2JhbHQvZG9tL3NlY3VyaXR5X3BvbGljeV92aW9sYXRpb25fZXZlbnQuaWRsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zZXJpYWxpemVyLmNjIGIvc3JjL2NvYmFsdC9kb20vc2VyaWFsaXplci5jYwppbmRleCA0ZTBiZGYwLi5lMmY2NDFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zZXJpYWxpemVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3NlcmlhbGl6ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9zZXJpYWxpemVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NlcmlhbGl6ZXIuaCBiL3NyYy9jb2JhbHQvZG9tL3NlcmlhbGl6ZXIuaAppbmRleCBkMjNlY2M0Li42Y2RjMDQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zZXJpYWxpemVyLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vc2VyaWFsaXplci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1NFUklBTElaRVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9TRVJJQUxJWkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zZXJpYWxpemVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9zZXJpYWxpemVyX3Rlc3QuY2MKaW5kZXggZTZjY2Q2My4uZWRlNjUwYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc2VyaWFsaXplcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3NlcmlhbGl6ZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxzc3RyZWFtPgogI2luY2x1ZGUgPHN0cmluZz4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuY2MgYi9zcmMvY29iYWx0L2RvbS9zb3VyY2VfYnVmZmVyLmNjCmluZGV4IDRhY2VkNTkuLmRlZDRjMDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlci5oIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlci5oCmluZGV4IDhhZDlmZjIuLjBkNzJkNjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS9zb3VyY2VfYnVmZmVyLmgKQEAgLTEsMTggKzEsMjEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlci5oIgorI2RlZmluZSBDT0JBTFRfRE9NX1NPVVJDRV9CVUZGRVJfSF8KKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9TT1VSQ0VfQlVGRkVSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fU09VUkNFX0JVRkZFUl9IXwpAQCAtMjAsNiArMjMsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3RpbWVfcmFuZ2VzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS91aW50OF9hcnJheS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCkBAIC0zMyw4ICszNywxNSBAQAogLy8gVGhlIFNvdXJjZUJ1ZmZlciBpbnRlcmZhY2UgZXhwb3NlcyB0aGUgbWVkaWEgc291cmNlIGJ1ZmZlciBzbyBpdHMgdXNlciBjYW4KIC8vIGFwcGVuZCBtZWRpYSBkYXRhIHRvLgogLy8gICBodHRwczovL3Jhd2dpdC5jb20vdzNjL21lZGlhLXNvdXJjZS82NzQ3ZWQ3YTMyMDZmNjQ2OTYzZDc2MDEwMGIwZjM3ZTJmYzdlNDdlL21lZGlhLXNvdXJjZS5odG1sI3NvdXJjZWJ1ZmZlcgotY2xhc3MgU291cmNlQnVmZmVyIDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlIHsKKy8vIE5vdGUgdGhhdCBTb3VyY2VCdWZmZXIgaXMgbm90IGluaGVyaXRlZCBmcm9tIEV2ZW50VGFyZ2V0IGluIE1TRSAyMDEyIGJ1dCB3ZQorLy8gbWFrZSBpdCBpbmhlcml0IGZyb20gRXZlbnRUYXJnZXQgdG8gYmUgaW4gc3luYyB3aXRoIHRoZSBiaW5kaW5nLCB3aGljaCBpcworLy8gc2hhcmVkIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIE1TRS4KK2NsYXNzIFNvdXJjZUJ1ZmZlciA6IHB1YmxpYyBkb206OkV2ZW50VGFyZ2V0IHsKICBwdWJsaWM6CisgIC8vIFdlYiBBUEk6IFNvdXJjZUJ1ZmZlcgorICAvLworICBlbnVtIEFwcGVuZE1vZGUgeyBrU2VnbWVudHMsIGtTZXF1ZW5jZSB9OworCiAgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgogICAvLwogICBTb3VyY2VCdWZmZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYVNvdXJjZT4mIG1lZGlhX3NvdXJjZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlci5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTE0ZTZiMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXIuaWRsCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9tZWRpYS1zb3VyY2UvI2lkbC1kZWYtU291cmNlQnVmZmVyCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1tZWRpYS1zb3VyY2UtMjAxNjA3MDUvI3NvdXJjZWJ1ZmZlcgorCitlbnVtIEFwcGVuZE1vZGUgeworICAic2VnbWVudHMiLAorICAic2VxdWVuY2UiCit9OworCitpbnRlcmZhY2UgU291cmNlQnVmZmVyIDogRXZlbnRUYXJnZXQgeworICBbUmFpc2VzRXhjZXB0aW9uXSByZWFkb25seSBhdHRyaWJ1dGUgVGltZVJhbmdlcyBidWZmZXJlZDsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIGRvdWJsZSB0aW1lc3RhbXBPZmZzZXQ7CisKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9NRURJQV9TT1VSQ0VfMjAxMiwgUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGFwcGVuZChVaW50OEFycmF5IGRhdGEpOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIGFib3J0KCk7CisKKyAgLy8gTVNFIDIwMTYgSW50ZXJmYWNlCisgIFtDb25kaXRpb25hbD1DT0JBTFRfTUVESUFfU09VUkNFXzIwMTYsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIEFwcGVuZE1vZGUgbW9kZTsKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNl0gcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gdXBkYXRpbmc7CisgIC8vIFtSYWlzZXNFeGNlcHRpb25dIHJlYWRvbmx5IGF0dHJpYnV0ZSBUaW1lUmFuZ2VzIGJ1ZmZlcmVkOworICAvLyBbUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgZG91YmxlIHRpbWVzdGFtcE9mZnNldDsKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNl0gcmVhZG9ubHkgYXR0cmlidXRlIEF1ZGlvVHJhY2tMaXN0IGF1ZGlvVHJhY2tzOworICBbQ29uZGl0aW9uYWw9Q09CQUxUX01FRElBX1NPVVJDRV8yMDE2XSByZWFkb25seSBhdHRyaWJ1dGUgVmlkZW9UcmFja0xpc3QgdmlkZW9UcmFja3M7CisgIC8vIFtDb25kaXRpb25hbD1DT0JBTFRfTUVESUFfU09VUkNFXzIwMTZdIHJlYWRvbmx5IGF0dHJpYnV0ZSBUZXh0VHJhY2tMaXN0IHRleHRUcmFja3M7CisgIFtDb25kaXRpb25hbD1DT0JBTFRfTUVESUFfU09VUkNFXzIwMTYsIFJhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIGRvdWJsZSBhcHBlbmRXaW5kb3dTdGFydDsKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNiwgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSBhcHBlbmRXaW5kb3dFbmQ7CisgIFtDb25kaXRpb25hbD1DT0JBTFRfTUVESUFfU09VUkNFXzIwMTYsIFJhaXNlc0V4Y2VwdGlvbl0gdm9pZCBhcHBlbmRCdWZmZXIoQXJyYXlCdWZmZXIgZGF0YSk7CisgIFtDb25kaXRpb25hbD1DT0JBTFRfTUVESUFfU09VUkNFXzIwMTYsIFJhaXNlc0V4Y2VwdGlvbl0gdm9pZCBhcHBlbmRCdWZmZXIoQXJyYXlCdWZmZXJWaWV3IGRhdGEpOworCisgIC8vIGFwcGVuZFN0cmVhbSgpIG9taXR0ZWQgYXMgaXQgaXMgbm90IHVzZWQuCisgIC8vIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgYWJvcnQoKTsKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNiwgUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHJlbW92ZShkb3VibGUgc3RhcnQsIHVucmVzdHJpY3RlZCBkb3VibGUgZW5kKTsKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNiwgUmFpc2VzRXhjZXB0aW9uXSBhdHRyaWJ1dGUgVHJhY2tEZWZhdWx0TGlzdCB0cmFja0RlZmF1bHRzOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXJfbGlzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXJfbGlzdC5jYwppbmRleCA1ODViMWIyLi41YTMzMjA2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zb3VyY2VfYnVmZmVyX2xpc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlcl9saXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vc291cmNlX2J1ZmZlcl9saXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3NvdXJjZV9idWZmZXJfbGlzdC5oIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlcl9saXN0LmgKaW5kZXggZTc1ZWRkOC4uNjcyNjc5ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlcl9saXN0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlcl9saXN0LmgKQEAgLTEsMTggKzEsMjEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L2RvbS9tZWRpYV9zb3VyY2Uvc291cmNlX2J1ZmZlcl9saXN0LmgiCisjZGVmaW5lIENPQkFMVF9ET01fU09VUkNFX0JVRkZFUl9MSVNUX0hfCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCiAjaWZuZGVmIENPQkFMVF9ET01fU09VUkNFX0JVRkZFUl9MSVNUX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fU09VUkNFX0JVRkZFUl9MSVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zb3VyY2VfYnVmZmVyX2xpc3QuaWRsIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlcl9saXN0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOGRiOTY5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vc291cmNlX2J1ZmZlcl9saXN0LmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWEtc291cmNlLyNpZGwtZGVmLVNvdXJjZUJ1ZmZlcgorLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItbWVkaWEtc291cmNlLTIwMTYwNzA1LyNzb3VyY2VidWZmZXJsaXN0CisKK2ludGVyZmFjZSBTb3VyY2VCdWZmZXJMaXN0IDogRXZlbnRUYXJnZXQgeworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIGdldHRlciBTb3VyY2VCdWZmZXI/IGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc3RvcmFnZS5jYyBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2UuY2MKaW5kZXggODZhYjE4MC4uNmRlNmY0OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc3RvcmFnZS5jYworKysgYi9zcmMvY29iYWx0L2RvbS9zdG9yYWdlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vc3RvcmFnZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlLmggYi9zcmMvY29iYWx0L2RvbS9zdG9yYWdlLmgKaW5kZXggZjAyNWFlMi4uNjNkZWI5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc3RvcmFnZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9TVE9SQUdFX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fU1RPUkFHRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc3RvcmFnZS5pZGwgYi9zcmMvY29iYWx0L2RvbS9zdG9yYWdlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY2MGI4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vc3RvcmFnZS5pZGwKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYnN0b3JhZ2UvI3N0b3JhZ2UtMAorCitpbnRlcmZhY2UgU3RvcmFnZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgRE9NU3RyaW5nPyBrZXkodW5zaWduZWQgbG9uZyBpbmRleCk7CisgIGdldHRlciBET01TdHJpbmc/IGdldEl0ZW0oRE9NU3RyaW5nIGtleSk7CisgIHNldHRlciB2b2lkIHNldEl0ZW0oRE9NU3RyaW5nIGtleSwgRE9NU3RyaW5nIHZhbHVlKTsKKyAgZGVsZXRlciB2b2lkIHJlbW92ZUl0ZW0oRE9NU3RyaW5nIGtleSk7CisgIHZvaWQgY2xlYXIoKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2FyZWEuY2MgYi9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2FyZWEuY2MKaW5kZXggYzVlMTNmOC4uNzhjYjllNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vc3RvcmFnZV9hcmVhLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfYXJlYS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3N0b3JhZ2VfYXJlYS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2FyZWEuaCBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfYXJlYS5oCmluZGV4IDYzNDIxNWYuLmM1NTk0YWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfYXJlYS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfYXJlYS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1NUT1JBR0VfQVJFQV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1NUT1JBR0VfQVJFQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vc3RvcmFnZV9hcmVhX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2FyZWFfdGVzdC5jYwppbmRleCA2MjhiYWRlLi43MTk2ZmU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2FyZWFfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2FyZWFfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3N0b3JhZ2VfYXJlYS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vc3RvcmFnZV9ldmVudC5jYwppbmRleCAzNzEwYjcyLi40OTVhMjE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2V2ZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfZXZlbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9zdG9yYWdlX2V2ZW50LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfZXZlbnQuaAppbmRleCA1ZjFjNTdmLi45ZTVkMmU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vc3RvcmFnZV9ldmVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1NUT1JBR0VfRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9TVE9SQUdFX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvZG9tL3N0b3JhZ2VfZXZlbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmODI1ZTMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS9zdG9yYWdlX2V2ZW50LmlkbApAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic3RvcmFnZS8jc3RvcmFnZWV2ZW50CisKK1tDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCitpbnRlcmZhY2UgU3RvcmFnZUV2ZW50IDogRXZlbnQgeworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nPyBrZXk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmc/IG9sZFZhbHVlOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nPyBuZXdWYWx1ZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB1cmw7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTdG9yYWdlPyBzdG9yYWdlQXJlYTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90ZXN0X3J1bm5lci5jYyBiL3NyYy9jb2JhbHQvZG9tL3Rlc3RfcnVubmVyLmNjCmluZGV4IGY4MzgwNTAuLjIzNjdmNzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3Rlc3RfcnVubmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3Rlc3RfcnVubmVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmIGRlZmluZWQoRU5BQkxFX1RFU1RfUlVOTkVSKQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90ZXN0X3J1bm5lci5oIGIvc3JjL2NvYmFsdC9kb20vdGVzdF9ydW5uZXIuaAppbmRleCBhNDdlMWZmLi5kNzY0ZjE0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXN0X3J1bm5lci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3Rlc3RfcnVubmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fVEVTVF9SVU5ORVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9URVNUX1JVTk5FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdGVzdF9ydW5uZXIuaWRsIGIvc3JjL2NvYmFsdC9kb20vdGVzdF9ydW5uZXIuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmViM2EzNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS90ZXN0X3J1bm5lci5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gQ3VzdG9tIGludGVyZmFjZSB0byBjb21tdW5pY2F0ZSB3aXRoIGxheW91dCB0ZXN0cy4KKworWworICBDb25kaXRpb25hbD1FTkFCTEVfVEVTVF9SVU5ORVIKK10gaW50ZXJmYWNlIFRlc3RSdW5uZXIgeworICB2b2lkIG5vdGlmeURvbmUoKTsKKyAgdm9pZCB3YWl0VW50aWxEb25lKCk7CisgIHZvaWQgRG9Ob25NZWFzdXJlZExheW91dCgpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3Rlc3RpbmcvZ3Rlc3Rfd29ya2Fyb3VuZHMuaCBiL3NyYy9jb2JhbHQvZG9tL3Rlc3RpbmcvZ3Rlc3Rfd29ya2Fyb3VuZHMuaAppbmRleCBiMjc2N2I3Li5lMjdiNmUyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL2d0ZXN0X3dvcmthcm91bmRzLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9ndGVzdF93b3JrYXJvdW5kcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1RFU1RJTkdfR1RFU1RfV09SS0FST1VORFNfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9URVNUSU5HX0dURVNUX1dPUktBUk9VTkRTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL2h0bWxfY29sbGVjdGlvbl90ZXN0aW5nLmggYi9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL2h0bWxfY29sbGVjdGlvbl90ZXN0aW5nLmgKaW5kZXggMmY3ZWY5ZS4uZGUzMWYwZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9odG1sX2NvbGxlY3Rpb25fdGVzdGluZy5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3Rlc3RpbmcvaHRtbF9jb2xsZWN0aW9uX3Rlc3RpbmcuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9URVNUSU5HX0hUTUxfQ09MTEVDVElPTl9URVNUSU5HX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fVEVTVElOR19IVE1MX0NPTExFQ1RJT05fVEVTVElOR19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9tb2NrX2V2ZW50X2xpc3RlbmVyLmggYi9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL21vY2tfZXZlbnRfbGlzdGVuZXIuaAppbmRleCA0YTY0ZTVmLi40YWU5ZDIwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL21vY2tfZXZlbnRfbGlzdGVuZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL21vY2tfZXZlbnRfbGlzdGVuZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9URVNUSU5HX01PQ0tfRVZFTlRfTElTVEVORVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9URVNUSU5HX01PQ0tfRVZFTlRfTElTVEVORVJfSF8KQEAgLTIyLDcgKzIwLDcgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKIApAQCAtMTQyLDI0ICsxNDAsMjQgQEAKICAgfQogfTsKIAotY2xhc3MgRmFrZVNjcmlwdE9iamVjdCA6IHB1YmxpYyBzY3JpcHQ6OlNjcmlwdE9iamVjdDxFdmVudExpc3RlbmVyPiB7CitjbGFzcyBGYWtlU2NyaXB0VmFsdWUgOiBwdWJsaWMgc2NyaXB0OjpTY3JpcHRWYWx1ZTxFdmVudExpc3RlbmVyPiB7CiAgcHVibGljOgotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PEV2ZW50TGlzdGVuZXI+IEJhc2VDbGFzczsKLSAgZXhwbGljaXQgRmFrZVNjcmlwdE9iamVjdChjb25zdCBNb2NrRXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpCisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxFdmVudExpc3RlbmVyPiBCYXNlQ2xhc3M7CisgIGV4cGxpY2l0IEZha2VTY3JpcHRWYWx1ZShjb25zdCBNb2NrRXZlbnRMaXN0ZW5lciogbGlzdGVuZXIpCiAgICAgICA6IG1vY2tfbGlzdGVuZXJfKGxpc3RlbmVyKSB7fQogCiAgIHZvaWQgUmVnaXN0ZXJPd25lcihzY3JpcHQ6OldyYXBwYWJsZSopIE9WRVJSSURFIHt9CiAgIHZvaWQgRGVyZWdpc3Rlck93bmVyKHNjcmlwdDo6V3JhcHBhYmxlKikgT1ZFUlJJREUge30KLSAgY29uc3QgRXZlbnRMaXN0ZW5lciogR2V0U2NyaXB0T2JqZWN0KHZvaWQpIGNvbnN0IE9WRVJSSURFIHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lciogR2V0U2NyaXB0VmFsdWUodm9pZCkgY29uc3QgT1ZFUlJJREUgewogICAgIHJldHVybiBtb2NrX2xpc3RlbmVyXzsKICAgfQogICBzY29wZWRfcHRyPEJhc2VDbGFzcz4gTWFrZUNvcHkoKSBjb25zdCBPVkVSUklERSB7Ci0gICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxCYXNlQ2xhc3M+KG5ldyBGYWtlU2NyaXB0T2JqZWN0KG1vY2tfbGlzdGVuZXJfKSk7CisgICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3B0cjxCYXNlQ2xhc3M+KG5ldyBGYWtlU2NyaXB0VmFsdWUobW9ja19saXN0ZW5lcl8pKTsKICAgfQogCiAgIGJvb2wgRXF1YWxUbyhjb25zdCBCYXNlQ2xhc3MmIG90aGVyKSBjb25zdCBPVkVSUklERSB7Ci0gICAgY29uc3QgRmFrZVNjcmlwdE9iamVjdCogb3RoZXJfc2NyaXB0X29iamVjdCA9Ci0gICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGNvbnN0IEZha2VTY3JpcHRPYmplY3QqPigmb3RoZXIpOworICAgIGNvbnN0IEZha2VTY3JpcHRWYWx1ZSogb3RoZXJfc2NyaXB0X29iamVjdCA9CisgICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PGNvbnN0IEZha2VTY3JpcHRWYWx1ZSo+KCZvdGhlcik7CiAgICAgcmV0dXJuIG1vY2tfbGlzdGVuZXJfID09IG90aGVyX3NjcmlwdF9vYmplY3QtPm1vY2tfbGlzdGVuZXJfOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl9jc3NfcGFyc2VyLmNjIGIvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9zdHViX2Nzc19wYXJzZXIuY2MKaW5kZXggYjQ4ZGQ0Ny4uNTViZGJiNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9zdHViX2Nzc19wYXJzZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9zdHViX2Nzc19wYXJzZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfY3NzX3BhcnNlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfY3NzX3BhcnNlci5oIGIvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9zdHViX2Nzc19wYXJzZXIuaAppbmRleCAwMjU5Y2EyLi5jNzc4M2JlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfY3NzX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl9jc3NfcGFyc2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fVEVTVElOR19TVFVCX0NTU19QQVJTRVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9URVNUSU5HX1NUVUJfQ1NTX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9zdHViX3NjcmlwdF9ydW5uZXIuY2MgYi9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfc2NyaXB0X3J1bm5lci5jYwppbmRleCBmOWRiNDkzLi5iMjUyOTA4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfc2NyaXB0X3J1bm5lci5jYworKysgYi9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfc2NyaXB0X3J1bm5lci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl9zY3JpcHRfcnVubmVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl9zY3JpcHRfcnVubmVyLmggYi9zcmMvY29iYWx0L2RvbS90ZXN0aW5nL3N0dWJfc2NyaXB0X3J1bm5lci5oCmluZGV4IGQwOTU1ODMuLjZiODkzOTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3Rlc3Rpbmcvc3R1Yl9zY3JpcHRfcnVubmVyLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vdGVzdGluZy9zdHViX3NjcmlwdF9ydW5uZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9URVNUSU5HX1NUVUJfU0NSSVBUX1JVTk5FUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1RFU1RJTkdfU1RVQl9TQ1JJUFRfUlVOTkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90ZXh0LmNjIGIvc3JjL2NvYmFsdC9kb20vdGV4dC5jYwppbmRleCBmMzFmNWJhLi4yMjgyMTA2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXh0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3RleHQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXh0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3RleHQuaCBiL3NyYy9jb2JhbHQvZG9tL3RleHQuaAppbmRleCBmOGVhODRlLi40ZTAwNDkxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS90ZXh0LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vdGV4dC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1RFWFRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9URVhUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90ZXh0LmlkbCBiL3NyYy9jb2JhbHQvZG9tL3RleHQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQzZTY3OTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS90ZXh0LmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvZG9tLyN0ZXh0CisKK1sKKyAgQ29uc3RydWN0b3Iob3B0aW9uYWwgRE9NU3RyaW5nIGRhdGEgPSAiIiksCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncworXQoraW50ZXJmYWNlIFRleHQgOiBDaGFyYWN0ZXJEYXRhIHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdGV4dF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9kb20vdGV4dF90ZXN0LmNjCmluZGV4IDM4MWUyNGMuLjU0ZDczMDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3RleHRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS90ZXh0X3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS90ZXh0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3RpbWVfcmFuZ2VzLmNjIGIvc3JjL2NvYmFsdC9kb20vdGltZV9yYW5nZXMuY2MKaW5kZXggZGQ5NTgwNC4uMTVmZDYzZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdGltZV9yYW5nZXMuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vdGltZV9yYW5nZXMuY2MKQEAgLTEsMjIgKzEsMjEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS90aW1lX3Jhbmdlcy5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgpAQCAtMTA2LDUgKzEwNSw2NCBAQAogICByZXR1cm4gKHRpbWUgLSBwcmV2IDw9IG5leHQgLSB0aW1lKSA/IHByZXYgOiBuZXh0OwogfQogCitzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IFRpbWVSYW5nZXM6OkNsb25lKCkgY29uc3QgeworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IHRpbWVfcmFuZ2VzID0gbmV3IFRpbWVSYW5nZXM7CisgIHRpbWVfcmFuZ2VzLT5yYW5nZXNfID0gcmFuZ2VzXzsKKyAgcmV0dXJuIHRpbWVfcmFuZ2VzOworfQorCitzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IFRpbWVSYW5nZXM6OlVuaW9uV2l0aCgKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+JiB0aGF0KSBjb25zdCB7CisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gcmVzdWx0ID0gdGhpcy0+Q2xvbmUoKTsKKyAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCB0aGF0LT5sZW5ndGgoKTsgKytpKSB7CisgICAgcmVzdWx0LT5BZGQodGhhdC0+U3RhcnQoaSwgTlVMTCksIHRoYXQtPkVuZChpLCBOVUxMKSk7CisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IFRpbWVSYW5nZXM6OkludGVyc2VjdFdpdGgoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiYgdGhhdCkgY29uc3QgeworICBEQ0hFQ0sodGhhdCk7CisKKyAgaWYgKHRoYXQgPT0gdGhpcykgeworICAgIHJldHVybiB0aGlzLT5DbG9uZSgpOworICB9CisKKyAgaWYgKHRoaXMtPmxlbmd0aCgpID09IDAgfHwgdGhhdC0+bGVuZ3RoKCkgPT0gMCkgeworICAgIHJldHVybiBuZXcgVGltZVJhbmdlczsKKyAgfQorCisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gaW52ZXJ0ZWRfdGhpcyA9IHRoaXMtPkNsb25lKCktPkludmVydCgpOworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IGludmVydGVkX3RoYXQgPSB0aGF0LT5DbG9uZSgpLT5JbnZlcnQoKTsKKworICByZXR1cm4gaW52ZXJ0ZWRfdGhpcy0+VW5pb25XaXRoKGludmVydGVkX3RoYXQpLT5JbnZlcnQoKTsKK30KKworc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBUaW1lUmFuZ2VzOjpJbnZlcnQoKSBjb25zdCB7CisgIGNvbnN0IGRvdWJsZSBrSW5maW5pdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gaW52ZXJ0ZWQgPSBuZXcgVGltZVJhbmdlczsKKworICBpZiAocmFuZ2VzXy5lbXB0eSgpKSB7CisgICAgaW52ZXJ0ZWQtPkFkZCgta0luZmluaXR5LCBrSW5maW5pdHkpOworICB9IGVsc2UgeworICAgIGRvdWJsZSBzdGFydCA9IFN0YXJ0KDAsIE5VTEwpOworICAgIGlmIChzdGFydCAhPSAta0luZmluaXR5KSB7CisgICAgICBpbnZlcnRlZC0+QWRkKC1rSW5maW5pdHksIHN0YXJ0KTsKKyAgICB9CisKKyAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSArIDEgPCBsZW5ndGgoKTsgKytpKSB7CisgICAgICBpbnZlcnRlZC0+QWRkKEVuZChpLCBOVUxMKSwgU3RhcnQoaSArIDEsIE5VTEwpKTsKKyAgICB9CisKKyAgICBkb3VibGUgZW5kID0gRW5kKGxlbmd0aCgpIC0gMSwgTlVMTCk7CisgICAgaWYgKGVuZCAhPSBrSW5maW5pdHkpIHsKKyAgICAgIGludmVydGVkLT5BZGQoZW5kLCBrSW5maW5pdHkpOworICAgIH0KKyAgfQorCisgIHJldHVybiBpbnZlcnRlZDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGRvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdGltZV9yYW5nZXMuaCBiL3NyYy9jb2JhbHQvZG9tL3RpbWVfcmFuZ2VzLmgKaW5kZXggOGZjODIzMy4uNzQ2ZjlkNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdGltZV9yYW5nZXMuaAorKysgYi9zcmMvY29iYWx0L2RvbS90aW1lX3Jhbmdlcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1RJTUVfUkFOR0VTX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fVElNRV9SQU5HRVNfSF8KQEAgLTMwLDcgKzI4LDggQEAKIC8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L2VtYmVkZGVkLWNvbnRlbnQtMC5odG1sI3RpbWVyYW5nZXMKIC8vCiAvLyBOb3RlIHRoYXQgaW4gb3VyIGltcGxlbWVudGF0aW9uIGl0IGlzIGFsd2F5cyBub3JtYWxpemVkLCBpLmUuIGFsbCBjb250YWluZWQKLS8vIHJhbmdlcyBhcmUgc29ydGVkIGFzY2VuZGFudGx5IGFuZCBub3Qgb3ZlcmxhcHBlZC4KKy8vIHJhbmdlcyBhcmUgc29ydGVkIGFzY2VuZGFudGx5IGFuZCBub3Qgb3ZlcmxhcHBlZC4gIFRoZSBsaW1pdHMgb2YgdGhlIHJhbmdlCisvLyBhcmUgWy1JbmZpbml0eSwgSW5maW5pdHldLgogY2xhc3MgVGltZVJhbmdlcyA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CiAgcHVibGljOgogICBUaW1lUmFuZ2VzKCkge30KQEAgLTUyLDkgKzUxLDIyIEBACiAgIC8vIHJhbmdlcyB0aGF0IGlzIGNsb3Nlc3QgdG8gdGltZS4KICAgZG91YmxlIE5lYXJlc3QoZG91YmxlIHRpbWUpIGNvbnN0OwogCisgIC8vIFJldHVybnMgYSBjb3B5IG9mIHRoZSBjdXJyZW50IG9iamVjdC4KKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBDbG9uZSgpIGNvbnN0OworICAvLyBSZXR1cm5zIGEgVGltZVJhbmdlcyBvYmplY3QgY29udGFpbnMgdGhlIHVuaW9uIG9mIHRoZSBjdXJyZW50IG9iamVjdCBhbmQKKyAgLy8gfHRoYXR8LgorICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IFVuaW9uV2l0aCgKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4mIHRoYXQpIGNvbnN0OworICAvLyBSZXR1cm5zIGEgVGltZVJhbmdlcyBvYmplY3QgY29udGFpbnMgdGhlIGludGVyc2VjdGlvbiBvZiB0aGUgY3VycmVudCBvYmplY3QKKyAgLy8gYW5kIHx0aGF0fC4KKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBJbnRlcnNlY3RXaXRoKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiYgdGhhdCkgY29uc3Q7CisKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKFRpbWVSYW5nZXMpOwogCiAgcHJpdmF0ZToKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBJbnZlcnQoKSBjb25zdDsKKwogICBjbGFzcyBUaW1lUmFuZ2UgewogICAgcHVibGljOgogICAgIFRpbWVSYW5nZShkb3VibGUgc3RhcnQsIGRvdWJsZSBlbmQpIDogc3RhcnRfKHN0YXJ0KSwgZW5kXyhlbmQpIHt9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90aW1lX3Jhbmdlcy5pZGwgYi9zcmMvY29iYWx0L2RvbS90aW1lX3Jhbmdlcy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA1NDU2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3RpbWVfcmFuZ2VzLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvZW1iZWRkZWQtY29udGVudC0wLmh0bWwjdGltZXJhbmdlcworCitpbnRlcmZhY2UgVGltZVJhbmdlcyB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gZG91YmxlIHN0YXJ0KHVuc2lnbmVkIGxvbmcgaW5kZXgpOworICBbUmFpc2VzRXhjZXB0aW9uXSBkb3VibGUgZW5kKHVuc2lnbmVkIGxvbmcgaW5kZXgpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3RpbWVfcmFuZ2VzX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS90aW1lX3Jhbmdlc190ZXN0LmNjCmluZGV4IGNjOGYxMmYuLjZhZmQ5YjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3RpbWVfcmFuZ2VzX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vdGltZV9yYW5nZXNfdGVzdC5jYwpAQCAtMSwyMSArMSwyMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3RpbWVfcmFuZ2VzLmgiCiAKKyNpbmNsdWRlIDxsaW1pdHM+CisKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgpAQCAtMjMsNiArMjMsNyBAQAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgZG9tIHsKIG5hbWVzcGFjZSB7CisKIGNsYXNzIEZha2VFeGNlcHRpb25TdGF0ZSA6IHB1YmxpYyBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlIHsKICBwdWJsaWM6CiAgIHZvaWQgU2V0RXhjZXB0aW9uKApAQCAtMzAsNyArMzEsNyBAQAogICAgIGRvbV9leGNlcHRpb25fID0gbWFrZV9zY29wZWRfcmVmcHRyKAogICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxET01FeGNlcHRpb24qPihleGNlcHRpb24uZ2V0KCkpKTsKICAgfQotICB2b2lkIFNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6Ok1lc3NhZ2VUeXBlIC8qbWVzc2FnZV90eXBlKi8sIC4uLikgT1ZFUlJJREUgeworICB2b2lkIFNldFNpbXBsZUV4Y2VwdGlvbihNZXNzYWdlVHlwZVZhciAvKm1lc3NhZ2VfdHlwZSovLCAuLi4pIE9WRVJSSURFIHsKICAgICAvLyBuby1vcAogICB9CiAgIGRvbTo6RE9NRXhjZXB0aW9uOjpFeGNlcHRpb25Db2RlIEdldEV4Y2VwdGlvbkNvZGUoKSB7CkBAIC00Miw2ICs0MywxNiBAQAogIHByaXZhdGU6CiAgIHNjb3BlZF9yZWZwdHI8ZG9tOjpET01FeGNlcHRpb24+IGRvbV9leGNlcHRpb25fOwogfTsKKwordm9pZCBDaGVja0VxdWFsKGNvbnN0IHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4mIHRpbWVfcmFuZ2VzMSwKKyAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+JiB0aW1lX3JhbmdlczIpIHsKKyAgQVNTRVJUX0VRKHRpbWVfcmFuZ2VzMS0+bGVuZ3RoKCksIHRpbWVfcmFuZ2VzMi0+bGVuZ3RoKCkpOworICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHRpbWVfcmFuZ2VzMS0+bGVuZ3RoKCk7ICsraSkgeworICAgIEVYUEVDVF9FUSh0aW1lX3JhbmdlczEtPlN0YXJ0KGksIE5VTEwpLCB0aW1lX3JhbmdlczItPlN0YXJ0KGksIE5VTEwpKTsKKyAgICBFWFBFQ1RfRVEodGltZV9yYW5nZXMxLT5FbmQoaSwgTlVMTCksIHRpbWVfcmFuZ2VzMi0+RW5kKGksIE5VTEwpKTsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogVEVTVChUaW1lUmFuZ2VzVGVzdCwgQ29uc3RydWN0b3JzKSB7CkBAIC0xOTYsNSArMjA3LDEyMSBAQAogICB9CiB9CiAKK1RFU1QoVGltZVJhbmdlc1Rlc3QsIENsb25lKSB7CisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gdGltZV9yYW5nZXMgPSBuZXcgVGltZVJhbmdlczsKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBjbG9uZWQgPSB0aW1lX3Jhbmdlcy0+Q2xvbmUoKTsKKyAgRVhQRUNUX05FKHRpbWVfcmFuZ2VzLCBjbG9uZWQpOworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IGFub3RoZXJfY2xvbmVkID0gdGltZV9yYW5nZXMtPkNsb25lKCk7CisgIEVYUEVDVF9ORShjbG9uZWQsIGFub3RoZXJfY2xvbmVkKTsKKworICB0aW1lX3Jhbmdlcy0+QWRkKDAuMCwgMS4wKTsKKyAgdGltZV9yYW5nZXMtPkFkZCgyLjAsIDMuMCk7CisKKyAgY2xvbmVkID0gdGltZV9yYW5nZXMtPkNsb25lKCk7CisgIEVYUEVDVF9ORSh0aW1lX3JhbmdlcywgY2xvbmVkKTsKKyAgRVhQRUNUX0VRKHRpbWVfcmFuZ2VzLT5sZW5ndGgoKSwgY2xvbmVkLT5sZW5ndGgoKSk7CisKKyAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBjbG9uZWQtPmxlbmd0aCgpOyArK2kpIHsKKyAgICBFWFBFQ1RfRVEodGltZV9yYW5nZXMtPlN0YXJ0KGksIE5VTEwpLCBjbG9uZWQtPlN0YXJ0KGksIE5VTEwpKTsKKyAgICBFWFBFQ1RfRVEodGltZV9yYW5nZXMtPkVuZChpLCBOVUxMKSwgY2xvbmVkLT5FbmQoaSwgTlVMTCkpOworICB9Cit9CisKK1RFU1QoVGltZVJhbmdlc1Rlc3QsIFVuaW9uV2l0aFNlbGYpIHsKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiB0aW1lX3JhbmdlcyA9IG5ldyBUaW1lUmFuZ2VzOworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IHVuaW9uZWQgPSB0aW1lX3Jhbmdlcy0+VW5pb25XaXRoKHRpbWVfcmFuZ2VzKTsKKyAgRVhQRUNUX05FKHRpbWVfcmFuZ2VzLCB1bmlvbmVkKTsKKyAgQ2hlY2tFcXVhbCh0aW1lX3JhbmdlcywgdW5pb25lZCk7Cit9CisKK1RFU1QoVGltZVJhbmdlc1Rlc3QsIFVuaW9uV2l0aCkgeworICBjb25zdCBkb3VibGUga0luZmluaXR5ID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOworCisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gdGltZV9yYW5nZXMxID0gbmV3IFRpbWVSYW5nZXM7CisgIHRpbWVfcmFuZ2VzMS0+QWRkKC1rSW5maW5pdHksIDEuMCk7CisgIHRpbWVfcmFuZ2VzMS0+QWRkKDQuMCwgNi4wKTsKKyAgdGltZV9yYW5nZXMxLT5BZGQoOC4wLCAxMC4wKTsKKworICAvLyAxOioqKioqKioqKioqKioqKioqKiAgICoqICAqKgorICAvLyA9PT09PT09PT09PT09PT09PT09MDEyMzQ1Njc4OUE9PT09PT09PT09PT09PT09PT0KKyAgLy8gMjogICAgICAgICAgICAgICAgICAgKiAgKiogICAqKioqKioqKioqKioqKioqKioqCisgIC8vIFU6KioqKioqKioqKioqKioqKioqICogKioqICoqKioqKioqKioqKioqKioqKioqKgorICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IHRpbWVfcmFuZ2VzMiA9IG5ldyBUaW1lUmFuZ2VzOworICB0aW1lX3JhbmdlczItPkFkZCgyLjAsIDMuMCk7CisgIHRpbWVfcmFuZ2VzMi0+QWRkKDUuMCwgNy4wKTsKKyAgdGltZV9yYW5nZXMyLT5BZGQoMTAuMCwga0luZmluaXR5KTsKKworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IGNsb25lZF90aW1lX3JhbmdlczEgPSB0aW1lX3JhbmdlczEtPkNsb25lKCk7CisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gY2xvbmVkX3RpbWVfcmFuZ2VzMiA9IHRpbWVfcmFuZ2VzMi0+Q2xvbmUoKTsKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiB1bmlvbmVkID0gdGltZV9yYW5nZXMxLT5VbmlvbldpdGgodGltZV9yYW5nZXMyKTsKKworICBDaGVja0VxdWFsKGNsb25lZF90aW1lX3JhbmdlczEsIHRpbWVfcmFuZ2VzMSk7CisgIENoZWNrRXF1YWwoY2xvbmVkX3RpbWVfcmFuZ2VzMiwgdGltZV9yYW5nZXMyKTsKKworICBFWFBFQ1RfRVEoNCwgdW5pb25lZC0+bGVuZ3RoKCkpOworCisgIEVYUEVDVF9FUSgta0luZmluaXR5LCB1bmlvbmVkLT5TdGFydCgwLCBOVUxMKSk7CisgIEVYUEVDVF9FUSgxLCB1bmlvbmVkLT5FbmQoMCwgTlVMTCkpOworCisgIEVYUEVDVF9FUSgyLCB1bmlvbmVkLT5TdGFydCgxLCBOVUxMKSk7CisgIEVYUEVDVF9FUSgzLCB1bmlvbmVkLT5FbmQoMSwgTlVMTCkpOworCisgIEVYUEVDVF9FUSg0LCB1bmlvbmVkLT5TdGFydCgyLCBOVUxMKSk7CisgIEVYUEVDVF9FUSg3LCB1bmlvbmVkLT5FbmQoMiwgTlVMTCkpOworCisgIEVYUEVDVF9FUSg4LCB1bmlvbmVkLT5TdGFydCgzLCBOVUxMKSk7CisgIEVYUEVDVF9FUShrSW5maW5pdHksIHVuaW9uZWQtPkVuZCgzLCBOVUxMKSk7Cit9CisKK1RFU1QoVGltZVJhbmdlc1Rlc3QsIEludGVyc2VjdFdpdGhFbXB0eVJhbmdlKSB7CisgIGNvbnN0IGRvdWJsZSBrSW5maW5pdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiB0aW1lX3JhbmdlczEgPSBuZXcgVGltZVJhbmdlczsKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBpbnRlcnNlY3Rpb24gPQorICAgICAgdGltZV9yYW5nZXMxLT5JbnRlcnNlY3RXaXRoKHRpbWVfcmFuZ2VzMSk7CisgIEVYUEVDVF9ORSh0aW1lX3JhbmdlczEsIGludGVyc2VjdGlvbik7CisgIENoZWNrRXF1YWwodGltZV9yYW5nZXMxLCBpbnRlcnNlY3Rpb24pOworCisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gdGltZV9yYW5nZXMyID0gbmV3IFRpbWVSYW5nZXM7CisgIHRpbWVfcmFuZ2VzMi0+QWRkKC1rSW5maW5pdHksIGtJbmZpbml0eSk7CisKKyAgaW50ZXJzZWN0aW9uID0gdGltZV9yYW5nZXMxLT5JbnRlcnNlY3RXaXRoKHRpbWVfcmFuZ2VzMik7CisgIENoZWNrRXF1YWwodGltZV9yYW5nZXMxLCBpbnRlcnNlY3Rpb24pOworfQorCitURVNUKFRpbWVSYW5nZXNUZXN0LCBJbnRlcnNlY3RXaXRoKSB7CisgIGNvbnN0IGRvdWJsZSBrSW5maW5pdHkgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7CisKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiB0aW1lX3JhbmdlczEgPSBuZXcgVGltZVJhbmdlczsKKyAgdGltZV9yYW5nZXMxLT5BZGQoLWtJbmZpbml0eSwgMS4wKTsKKyAgdGltZV9yYW5nZXMxLT5BZGQoNC4wLCA2LjApOworICB0aW1lX3JhbmdlczEtPkFkZCg4LjAsIGtJbmZpbml0eSk7CisKKyAgLy8gMToqKioqKioqKioqKioqKioqKiogICAqKiAgKioqKioqKioqKioqKioqKioqKioqCisgIC8vID09PT09PT09PT09PT09PT09PT0wMTIzNDU2Nzg5QT09PT09PT09PT09PT09PT09PQorICAvLyAyOiAgICAgICAgICAgICAgICAgICAqICAqKiAgICoqKioqKioqKioqKioqKioqKioKKyAgLy8gSTogICAgICAgICAgICAgICAgICAgICAgKiAgICAqKioqKioqKioqKioqKioqKioqCisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gdGltZV9yYW5nZXMyID0gbmV3IFRpbWVSYW5nZXM7CisgIHRpbWVfcmFuZ2VzMi0+QWRkKDIuMCwgMy4wKTsKKyAgdGltZV9yYW5nZXMyLT5BZGQoNS4wLCA3LjApOworICB0aW1lX3JhbmdlczItPkFkZCgxMC4wLCBrSW5maW5pdHkpOworCisgIHNjb3BlZF9yZWZwdHI8VGltZVJhbmdlcz4gY2xvbmVkX3RpbWVfcmFuZ2VzMSA9IHRpbWVfcmFuZ2VzMS0+Q2xvbmUoKTsKKyAgc2NvcGVkX3JlZnB0cjxUaW1lUmFuZ2VzPiBjbG9uZWRfdGltZV9yYW5nZXMyID0gdGltZV9yYW5nZXMyLT5DbG9uZSgpOworICBzY29wZWRfcmVmcHRyPFRpbWVSYW5nZXM+IGludGVyc2VjdGlvbiA9CisgICAgICB0aW1lX3JhbmdlczEtPkludGVyc2VjdFdpdGgodGltZV9yYW5nZXMyKTsKKworICBDaGVja0VxdWFsKGNsb25lZF90aW1lX3JhbmdlczEsIHRpbWVfcmFuZ2VzMSk7CisgIENoZWNrRXF1YWwoY2xvbmVkX3RpbWVfcmFuZ2VzMiwgdGltZV9yYW5nZXMyKTsKKworICBFWFBFQ1RfRVEoMiwgaW50ZXJzZWN0aW9uLT5sZW5ndGgoKSk7CisKKyAgRVhQRUNUX0VRKDUsIGludGVyc2VjdGlvbi0+U3RhcnQoMCwgTlVMTCkpOworICBFWFBFQ1RfRVEoNiwgaW50ZXJzZWN0aW9uLT5FbmQoMCwgTlVMTCkpOworCisgIEVYUEVDVF9FUSgxMCwgaW50ZXJzZWN0aW9uLT5TdGFydCgxLCBOVUxMKSk7CisgIEVYUEVDVF9FUShrSW5maW5pdHksIGludGVyc2VjdGlvbi0+RW5kKDEsIE5VTEwpKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGRvbQogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdHJhY2tfYmFzZS5oIGIvc3JjL2NvYmFsdC9kb20vdHJhY2tfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIzODAxZTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS90cmFja19iYXNlLmgKQEAgLTAsMCArMSw2NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX1RSQUNLX0JBU0VfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9UUkFDS19CQVNFX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK2NsYXNzIFNvdXJjZUJ1ZmZlcjsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBjb21tb24gb3BlcmF0aW9ucyBmb3IgQXVkaW9UcmFjayBhbmQgVmlkZW9UcmFjay4KK2NsYXNzIFRyYWNrQmFzZSA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CisgcHVibGljOgorICBjb25zdCBzdGQ6OnN0cmluZyYgaWQoKSBjb25zdCB7IHJldHVybiBpZF87IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGtpbmQoKSBjb25zdCB7IHJldHVybiBraW5kXzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbGFiZWwoKSBjb25zdCB7IHJldHVybiBsYWJlbF87IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlKCkgY29uc3QgeyByZXR1cm4gbGFuZ3VhZ2VfOyB9CisKKyAgdm9pZCBTZXRNZWRpYUVsZW1lbnQoSFRNTE1lZGlhRWxlbWVudCogbWVkaWFfZWxlbWVudCkgeworICAgIG1lZGlhX2VsZW1lbnRfID0gYmFzZTo6QXNXZWFrUHRyKG1lZGlhX2VsZW1lbnQpOworICB9CisgIFNvdXJjZUJ1ZmZlciogc291cmNlX2J1ZmZlcigpIGNvbnN0IHsgcmV0dXJuIHNvdXJjZV9idWZmZXJfOyB9CisKKyBwcm90ZWN0ZWQ6CisgIHR5cGVkZWYgYm9vbCAoKklzVmFsaWRLaW5kRm4pKGNvbnN0IGNoYXIqKTsKKworICBUcmFja0Jhc2UoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzdGQ6OnN0cmluZyYga2luZCwKKyAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCwgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgSXNWYWxpZEtpbmRGbiBpc192YWxpZF9raW5kX2ZuKQorICAgICAgOiBpZF8oaWQpLCBsYWJlbF8obGFiZWwpLCBsYW5ndWFnZV8obGFuZ3VhZ2UpLCBzb3VyY2VfYnVmZmVyXyhOVUxMKSB7CisgICAgaWYgKGlzX3ZhbGlkX2tpbmRfZm4oa2luZC5jX3N0cigpKSkgeworICAgICAga2luZF8gPSBraW5kOworICAgIH0KKyAgfQorCisgIHN0ZDo6c3RyaW5nIGlkXzsKKyAgc3RkOjpzdHJpbmcga2luZF87CisgIHN0ZDo6c3RyaW5nIGxhYmVsXzsKKyAgc3RkOjpzdHJpbmcgbGFuZ3VhZ2VfOworICBiYXNlOjpXZWFrUHRyPEhUTUxNZWRpYUVsZW1lbnQ+IG1lZGlhX2VsZW1lbnRfOworICBTb3VyY2VCdWZmZXIqIHNvdXJjZV9idWZmZXJfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fVFJBQ0tfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdHJhY2tfZGVmYXVsdC5oIGIvc3JjL2NvYmFsdC9kb20vdHJhY2tfZGVmYXVsdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNDU5ZjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS90cmFja19kZWZhdWx0LmgKQEAgLTAsMCArMSw5NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX1RSQUNLX0RFRkFVTFRfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9UUkFDS19ERUZBVUxUX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2F1ZGlvX3RyYWNrLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS92aWRlb190cmFjay5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKKy8vIFRoZSBUcmFja0RlZmF1bHQgb2JqZWN0IGlzIHVzZWQgdG8gcHJvdmlkZSBraW5kLCBsYWJlbCwgYW5kIGxhbmd1YWdlCisvLyBpbmZvcm1hdGlvbiBmb3IgdHJhY2tzIHRoYXQgZG8gbm90IGNvbnRhaW4gdGhpcyBpbmZvcm1hdGlvbiBpbiB0aGUKKy8vIGluaXRpYWxpemF0aW9uIHNlZ21lbnRzLgorLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNi9DUi1tZWRpYS1zb3VyY2UtMjAxNjA3MDUvI3RyYWNrZGVmYXVsdAorY2xhc3MgVHJhY2tEZWZhdWx0IDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlIHsKKyBwdWJsaWM6CisgIC8vIFdlYiBBUEk6IFRyYWNrRGVmYXVsdAorICAvLworICBlbnVtIFRyYWNrRGVmYXVsdFR5cGUgeworICAgIGtBdWRpbywKKyAgICBrVmlkZW8sCisgICAga1RleHQsCisgIH07CisKKyAgVHJhY2tEZWZhdWx0KFRyYWNrRGVmYXVsdFR5cGUgdHlwZSwgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsLAorICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0OjpTZXF1ZW5jZTxzdGQ6OnN0cmluZz4mIGtpbmRzLAorICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGJ5dGVfc3RyZWFtX3RyYWNrX2lkLAorICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKQorICAgICAgOiB0eXBlXyh0eXBlKSwKKyAgICAgICAgYnl0ZV9zdHJlYW1fdHJhY2tfaWRfKGJ5dGVfc3RyZWFtX3RyYWNrX2lkKSwKKyAgICAgICAgbGFuZ3VhZ2VfKGxhbmd1YWdlKSwKKyAgICAgICAgbGFiZWxfKGxhYmVsKSwKKyAgICAgICAga2luZHNfKGtpbmRzKSB7CisgICAgaWYgKHR5cGUgPT0ga0F1ZGlvKSB7CisgICAgICBmb3IgKHNjcmlwdDo6U2VxdWVuY2U8c3RkOjpzdHJpbmc+OjpzaXplX3R5cGUgaSA9IDA7IGkgPCBraW5kcy5zaXplKCk7CisgICAgICAgICAgICsraSkgeworICAgICAgICBpZiAoIUF1ZGlvVHJhY2s6OklzVmFsaWRLaW5kKGtpbmRzLmF0KGkpLmNfc3RyKCkpKSB7CisgICAgICAgICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oc2NyaXB0OjprU2ltcGxlVHlwZUVycm9yKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSBpZiAodHlwZSA9PSBrVmlkZW8pIHsKKyAgICAgIGZvciAoc2NyaXB0OjpTZXF1ZW5jZTxzdGQ6OnN0cmluZz46OnNpemVfdHlwZSBpID0gMDsgaSA8IGtpbmRzLnNpemUoKTsKKyAgICAgICAgICAgKytpKSB7CisgICAgICAgIGlmICghVmlkZW9UcmFjazo6SXNWYWxpZEtpbmQoa2luZHMuYXQoaSkuY19zdHIoKSkpIHsKKyAgICAgICAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihzY3JpcHQ6OmtTaW1wbGVUeXBlRXJyb3IpOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICB9CisgIH0KKworICBUcmFja0RlZmF1bHRUeXBlIHR5cGUoKSBjb25zdCB7IHJldHVybiB0eXBlXzsgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgYnl0ZV9zdHJlYW1fdHJhY2tfaWQoKSBjb25zdCB7CisgICAgcmV0dXJuIGJ5dGVfc3RyZWFtX3RyYWNrX2lkXzsKKyAgfQorICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UoKSBjb25zdCB7IHJldHVybiBsYW5ndWFnZV87IH0KKyAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsKCkgY29uc3QgeyByZXR1cm4gbGFiZWxfOyB9CisgIGNvbnN0IHNjcmlwdDo6U2VxdWVuY2U8c3RkOjpzdHJpbmc+JiBHZXRLaW5kcygpIGNvbnN0IHsgcmV0dXJuIGtpbmRzXzsgfQorCisgIERFRklORV9XUkFQUEFCTEVfVFlQRShUcmFja0RlZmF1bHQpOworCisgcHJpdmF0ZToKKyAgVHJhY2tEZWZhdWx0VHlwZSB0eXBlXzsKKyAgY29uc3Qgc3RkOjpzdHJpbmcgYnl0ZV9zdHJlYW1fdHJhY2tfaWRfOworICBjb25zdCBzdGQ6OnN0cmluZyBsYW5ndWFnZV87CisgIGNvbnN0IHN0ZDo6c3RyaW5nIGxhYmVsXzsKKyAgY29uc3Qgc2NyaXB0OjpTZXF1ZW5jZTxzdGQ6OnN0cmluZz4ga2luZHNfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fVFJBQ0tfREVGQVVMVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdHJhY2tfZGVmYXVsdC5pZGwgYi9zcmMvY29iYWx0L2RvbS90cmFja19kZWZhdWx0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMDdhNTA5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vdHJhY2tfZGVmYXVsdC5pZGwKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItbWVkaWEtc291cmNlLTIwMTYwNzA1LyN0cmFja2RlZmF1bHQKKworZW51bSBUcmFja0RlZmF1bHRUeXBlIHsKKyAgImF1ZGlvIiwKKyAgInZpZGVvIiwKKyAgInRleHQiCit9OworCitbCisgIENvbnN0cnVjdG9yKFRyYWNrRGVmYXVsdFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgRE9NU3RyaW5nIGxhbmd1YWdlLAorICAgICAgICAgICAgICBET01TdHJpbmcgbGFiZWwsCisgICAgICAgICAgICAgIHNlcXVlbmNlPERPTVN0cmluZz4ga2luZHMsCisgICAgICAgICAgICAgIG9wdGlvbmFsIERPTVN0cmluZyBieXRlU3RyZWFtVHJhY2tJRCA9ICIiKSwKKyAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yLAorXSBpbnRlcmZhY2UgVHJhY2tEZWZhdWx0IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIFRyYWNrRGVmYXVsdFR5cGUgdHlwZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBieXRlU3RyZWFtVHJhY2tJRDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYW5ndWFnZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYWJlbDsKKyAgc2VxdWVuY2U8RE9NU3RyaW5nPiBnZXRLaW5kcygpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3RyYWNrX2RlZmF1bHRfbGlzdC5oIGIvc3JjL2NvYmFsdC9kb20vdHJhY2tfZGVmYXVsdF9saXN0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTBiODJhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3RyYWNrX2RlZmF1bHRfbGlzdC5oCkBAIC0wLDAgKzEsNzggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX0RPTV9UUkFDS19ERUZBVUxUX0xJU1RfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9UUkFDS19ERUZBVUxUX0xJU1RfSF8KKworI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9leGNlcHRpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3RyYWNrX2RlZmF1bHQuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBkb20geworCisvLyBUaGUgVHJhY2tEZWZhdWx0TGlzdCBpcyBhIHNpbXBsZSBjb250YWluZXIgb2JqZWN0IGZvciBUcmFja0RlZmF1bHQgb2JqZWN0cy4KKy8vICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvQ1ItbWVkaWEtc291cmNlLTIwMTYwNzA1LyN0cmFja2RlZmF1bHRsaXN0CitjbGFzcyBUcmFja0RlZmF1bHRMaXN0IDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlIHsKKyBwdWJsaWM6CisgIC8vIFdlYiBBUEk6IFRyYWNrRGVmYXVsdExpc3QKKyAgLy8KKyAgZXhwbGljaXQgVHJhY2tEZWZhdWx0TGlzdChzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisgIH0KKyAgVHJhY2tEZWZhdWx0TGlzdCgKKyAgICAgIGNvbnN0IHNjcmlwdDo6U2VxdWVuY2U8c2NvcGVkX3JlZnB0cjxUcmFja0RlZmF1bHQ+ID4mIHRyYWNrX2RlZmF1bHRzLAorICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7CisgICAgLy8gfHRyYWNrX2RlZmF1bHRzfCBzaG91bGRuJ3QgY29udGFpbiB0d28gb3IgbW9yZSBUcmFja0RlZmF1bHQgb2JqZWN0cyB3aXRoCisgICAgLy8gdGhlIHNhbWUgfHR5cGV8IGFuZCB0aGUgc2FtZSB8Ynl0ZV9zdHJlYW1fdHJhY2tfaWR8LgorICAgIHR5cGVkZWYgc3RkOjpwYWlyPFRyYWNrRGVmYXVsdDo6VHJhY2tEZWZhdWx0VHlwZSwgc3RkOjpzdHJpbmc+IFR5cGVBbmRJZDsKKyAgICBzdGQ6OnNldDxUeXBlQW5kSWQ+IHR5cGVfYW5kX2lkczsKKyAgICBmb3IgKHNjcmlwdDo6U2VxdWVuY2U8c2NvcGVkX3JlZnB0cjxUcmFja0RlZmF1bHQ+ID46OnNpemVfdHlwZSBpID0gMDsKKyAgICAgICAgIGkgPCB0cmFja19kZWZhdWx0cy5zaXplKCk7ICsraSkgeworICAgICAgc2NvcGVkX3JlZnB0cjxUcmFja0RlZmF1bHQ+IHRyYWNrX2RlZmF1bHQgPSB0cmFja19kZWZhdWx0cy5hdChpKTsKKyAgICAgIFR5cGVBbmRJZCB0eXBlX2FuZF9pZCh0cmFja19kZWZhdWx0LT50eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhY2tfZGVmYXVsdC0+Ynl0ZV9zdHJlYW1fdHJhY2tfaWQoKSk7CisgICAgICBpZiAoIXR5cGVfYW5kX2lkcy5pbnNlcnQodHlwZV9hbmRfaWQpLnNlY29uZCkgeworICAgICAgICBET01FeGNlcHRpb246OlJhaXNlKERPTUV4Y2VwdGlvbjo6a0ludmFsaWRBY2Nlc3NFcnIsIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0KKyAgICB9CisgICAgdHJhY2tfZGVmYXVsdHNfID0gdHJhY2tfZGVmYXVsdHM7CisgIH0KKworICB1aW50MzIgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPih0cmFja19kZWZhdWx0c18uc2l6ZSgpKTsgfQorICBzY29wZWRfcmVmcHRyPFRyYWNrRGVmYXVsdD4gQW5vbnltb3VzSW5kZXhlZEdldHRlcih1aW50MzIgaW5kZXgpIGNvbnN0IHsKKyAgICBpZiAoaW5kZXggPCBsZW5ndGgoKSkgeworICAgICAgcmV0dXJuIHRyYWNrX2RlZmF1bHRzXy5hdChpbmRleCk7CisgICAgfQorICAgIHJldHVybiBOVUxMOworICB9CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKFRyYWNrRGVmYXVsdExpc3QpOworCisgcHJpdmF0ZToKKyAgc2NyaXB0OjpTZXF1ZW5jZTxzY29wZWRfcmVmcHRyPFRyYWNrRGVmYXVsdD4gPiB0cmFja19kZWZhdWx0c187Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9UUkFDS19ERUZBVUxUX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3RyYWNrX2RlZmF1bHRfbGlzdC5pZGwgYi9zcmMvY29iYWx0L2RvbS90cmFja19kZWZhdWx0X2xpc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjOTA5MzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS90cmFja19kZWZhdWx0X2xpc3QuaWRsCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE2L0NSLW1lZGlhLXNvdXJjZS0yMDE2MDcwNS8jdHJhY2tkZWZhdWx0bGlzdAorCitbCisgIENvbnN0cnVjdG9yKG9wdGlvbmFsIHNlcXVlbmNlPFRyYWNrRGVmYXVsdD4gdHJhY2tEZWZhdWx0cyksCisgIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvciwKK10gaW50ZXJmYWNlIFRyYWNrRGVmYXVsdExpc3QgeworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIGdldHRlciBUcmFja0RlZmF1bHQodW5zaWduZWQgbG9uZyBpbmRleCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdHJhY2tfZXZlbnQuaCBiL3NyYy9jb2JhbHQvZG9tL3RyYWNrX2V2ZW50LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmFkNzE3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3RyYWNrX2V2ZW50LmgKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX1RSQUNLX0VWRU5UX0hfCisjZGVmaW5lIENPQkFMVF9ET01fVFJBQ0tfRVZFTlRfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2VuLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9hdWRpb190cmFjay5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3ZpZGVvX3RyYWNrLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworLy8gVGhlIFRyYWNrRXZlbnQgcHJvdmlkZXMgc3BlY2lmaWMgY29udGV4dHVhbCBpbmZvcm1hdGlvbiBhc3NvY2lhdGVkIHdpdGgKKy8vIGV2ZW50cyBmaXJlZCBvbiBBdWRpb1RyYWNrLCBWaWRlb1RyYWNrLCBhbmQgVGV4dFRyYWNrIG9iamVjdHMuCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc2VtYW50aWNzLWVtYmVkZGVkLWNvbnRlbnQuaHRtbCN0cmFja2V2ZW50LXRyYWNrZXZlbnQKK2NsYXNzIFRyYWNrRXZlbnQgOiBwdWJsaWMgRXZlbnQgeworIHB1YmxpYzoKKyAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCisgIC8vCisgIGV4cGxpY2l0IFRyYWNrRXZlbnQoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUpIDogRXZlbnQoYmFzZTo6VG9rZW4odHlwZSkpIHt9CisgIFRyYWNrRXZlbnQoYmFzZTo6VG9rZW4gdHlwZSwgY29uc3Qgc2NvcGVkX3JlZnB0cjxBdWRpb1RyYWNrPiYgYXVkaW9fdHJhY2spCisgICAgICA6IEV2ZW50KHR5cGUpLCB0cmFja18oYXVkaW9fdHJhY2spIHt9CisgIFRyYWNrRXZlbnQoYmFzZTo6VG9rZW4gdHlwZSwgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb1RyYWNrPiYgdmlkZW9fdHJhY2spCisgICAgICA6IEV2ZW50KHR5cGUpLCB0cmFja18odmlkZW9fdHJhY2spIHt9CisKKyAgLy8gV2ViIEFQSTogVHJhY2tFdmVudAorICAvLworICBzY29wZWRfcmVmcHRyPHNjcmlwdDo6V3JhcHBhYmxlPiB0cmFjaygpIGNvbnN0IHsgcmV0dXJuIHRyYWNrXzsgfQorCisgIERFRklORV9XUkFQUEFCTEVfVFlQRShUcmFja0V2ZW50KTsKKworIHByaXZhdGU6CisgIHNjb3BlZF9yZWZwdHI8c2NyaXB0OjpXcmFwcGFibGU+IHRyYWNrXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBkb20KK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfRE9NX1RSQUNLX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90cmFja19ldmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS90cmFja19ldmVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWVlMGFiYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3RyYWNrX2V2ZW50LmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUxL3NlbWFudGljcy1lbWJlZGRlZC1jb250ZW50Lmh0bWwjdHJhY2tldmVudC10cmFja2V2ZW50CisKK1tDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCitpbnRlcmZhY2UgVHJhY2tFdmVudCA6IEV2ZW50IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIChBdWRpb1RyYWNrIG9yIFZpZGVvVHJhY2spPyB0cmFjazsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90cmFja19saXN0X2Jhc2UuaCBiL3NyYy9jb2JhbHQvZG9tL3RyYWNrX2xpc3RfYmFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODAzMmYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS90cmFja19saXN0X2Jhc2UuaApAQCAtMCwwICsxLDEwMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX1RSQUNLX0xJU1RfQkFTRV9IXworI2RlZmluZSBDT0JBTFRfRE9NX1RSQUNLX0xJU1RfQkFTRV9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS90b2tlbnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL2h0bWxfbWVkaWFfZWxlbWVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vdHJhY2tfZXZlbnQuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworLy8gVGhpcyBjbGFzcyBjb250YWlucyBjb21tb24gb3BlcmF0aW9ucyBmb3IgQXVkaW9UcmFja0xpc3QgYW5kIFZpZGVvVHJhY2tMaXN0LgordGVtcGxhdGUgPHR5cGVuYW1lIFRyYWNrVHlwZT4KK2NsYXNzIFRyYWNrTGlzdEJhc2UgOiBwdWJsaWMgRXZlbnRUYXJnZXQgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVHJhY2tMaXN0QmFzZShIVE1MTWVkaWFFbGVtZW50KiBtZWRpYV9lbGVtZW50KSB7CisgICAgRENIRUNLKG1lZGlhX2VsZW1lbnQpOworICAgIG1lZGlhX2VsZW1lbnRfID0gYmFzZTo6QXNXZWFrUHRyKG1lZGlhX2VsZW1lbnQpOworICB9CisKKyAgdWludDMyIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIHN0YXRpY19jYXN0PHVpbnQzMj4odHJhY2tzXy5zaXplKCkpOyB9CisgIHNjb3BlZF9yZWZwdHI8VHJhY2tUeXBlPiBBbm9ueW1vdXNJbmRleGVkR2V0dGVyKHVpbnQzMiBpbmRleCkgY29uc3QgeworICAgIGlmIChpbmRleCA+PSB0cmFja3NfLnNpemUoKSkgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIHRyYWNrc19baW5kZXhdOworICB9CisKKyAgc2NvcGVkX3JlZnB0cjxUcmFja1R5cGU+IEdldFRyYWNrQnlJZChjb25zdCBzdGQ6OnN0cmluZyYgaWQpIGNvbnN0IHsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRyYWNrc18uc2l6ZSgpOyArK2kpIHsKKyAgICAgIGlmICh0cmFja3NfW2ldLT5pZCgpID09IGlkKSB7CisgICAgICAgIHJldHVybiB0cmFja3NfW2ldOworICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBOVUxMOworICB9CisKKyAgdm9pZCBBZGQoY29uc3Qgc2NvcGVkX3JlZnB0cjxUcmFja1R5cGU+JiB0cmFjaykgeworICAgIHRyYWNrLT5TZXRNZWRpYUVsZW1lbnQobWVkaWFfZWxlbWVudF8pOworICAgIHRyYWNrc18ucHVzaF9iYWNrKHRyYWNrKTsKKyAgICBTY2hlZHVsZUV2ZW50KG5ldyBUcmFja0V2ZW50KGJhc2U6OlRva2Vuczo6YWRkdHJhY2soKSwgdHJhY2spKTsKKyAgfQorCisgIHZvaWQgUmVtb3ZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tzXy5zaXplKCk7ICsraSkgeworICAgICAgc2NvcGVkX3JlZnB0cjxUcmFja1R5cGU+IHRyYWNrID0gdHJhY2tzX1tpXTsKKyAgICAgIGlmICh0cmFjay0+aWQoKSAhPSBpZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIHRyYWNrLT5TZXRNZWRpYUVsZW1lbnQoTlVMTCk7CisgICAgICBTY2hlZHVsZUV2ZW50KG5ldyBUcmFja0V2ZW50KGJhc2U6OlRva2Vuczo6cmVtb3ZldHJhY2soKSwgdHJhY2spKTsKKyAgICAgIHRyYWNrc18uZXJhc2UodHJhY2tzXy5iZWdpbigpICsgaSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorCisgIHZvaWQgUmVtb3ZlQWxsKCkgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgdHJhY2tzXy5zaXplKCk7ICsraSkgeworICAgICAgdHJhY2tzX1tpXS0+U2V0TWVkaWFFbGVtZW50KE5VTEwpOworICAgIH0KKworICAgIHRyYWNrc18uY2xlYXIoKTsKKyAgfQorCisgIHZvaWQgU2NoZWR1bGVDaGFuZ2VFdmVudCgpIHsKKyAgICBTY2hlZHVsZUV2ZW50KG5ldyBFdmVudChiYXNlOjpUb2tlbnM6OmNoYW5nZSgpKSk7CisgIH0KKworIHByaXZhdGU6CisgIHZvaWQgU2NoZWR1bGVFdmVudChjb25zdCBzY29wZWRfcmVmcHRyPEV2ZW50PiYgZXZlbnQpIHsKKyAgICBldmVudC0+c2V0X3RhcmdldCh0aGlzKTsKKyAgICBtZWRpYV9lbGVtZW50Xy0+U2NoZWR1bGVFdmVudChldmVudCk7CisgIH0KKworICBiYXNlOjpXZWFrUHRyPEhUTUxNZWRpYUVsZW1lbnQ+IG1lZGlhX2VsZW1lbnRfOworICBzdGQ6OnZlY3RvcjxzY29wZWRfcmVmcHRyPFRyYWNrVHlwZT4gPiB0cmFja3NfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fVFJBQ0tfTElTVF9CQVNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS90cmFuc2l0aW9uX2V2ZW50LmggYi9zcmMvY29iYWx0L2RvbS90cmFuc2l0aW9uX2V2ZW50LmgKaW5kZXggYmY0MzQzZi4uMzVmNGI1MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdHJhbnNpdGlvbl9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3RyYW5zaXRpb25fZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9UUkFOU0lUSU9OX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fVFJBTlNJVElPTl9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdHJhbnNpdGlvbl9ldmVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS90cmFuc2l0aW9uX2V2ZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yNjI3ZWU2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vdHJhbnNpdGlvbl9ldmVudC5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTMvV0QtY3NzMy10cmFuc2l0aW9ucy0yMDEzMTExOS8jdHJhbnNpdGlvbi1ldmVudHMKKworW0NvbnN0cnVjdG9yKERPTVN0cmluZyB0eXBlKV0KK2ludGVyZmFjZSBUcmFuc2l0aW9uRXZlbnQgOiBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcHJvcGVydHlOYW1lOworICByZWFkb25seSBhdHRyaWJ1dGUgZmxvYXQgZWxhcHNlZFRpbWU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdHlwZWRfYXJyYXkuaCBiL3NyYy9jb2JhbHQvZG9tL3R5cGVkX2FycmF5LmgKaW5kZXggZTkwMWE3MC4uMWI2YjI2MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdHlwZWRfYXJyYXkuaAorKysgYi9zcmMvY29iYWx0L2RvbS90eXBlZF9hcnJheS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1RZUEVEX0FSUkFZX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fVFlQRURfQVJSQVlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3R5cGVkX2FycmF5X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS90eXBlZF9hcnJheV90ZXN0LmNjCmluZGV4IDNmNjI3YzUuLjAyMzMyZDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3R5cGVkX2FycmF5X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vdHlwZWRfYXJyYXlfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3R5cGVkX2FycmF5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VpX2V2ZW50LmNjIGIvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnQuY2MKaW5kZXggNzc0NTRlOS4uYTllYmVjMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS91aV9ldmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS91aV9ldmVudC5oIGIvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnQuaAppbmRleCBlMzllZjM0Li5hMWU2NjlmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS91aV9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3VpX2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fVUlfRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9VSV9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlYjBhZDYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS91aV9ldmVudC5pZGwKQEAgLTAsMCArMSwzMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0QtdWlldmVudHMtMjAxNTEyMTUvI2ludGVyZmFjZS1VSUV2ZW50CisKK1tDb25zdHJ1Y3RvcihET01TdHJpbmcgdHlwZSldCitpbnRlcmZhY2UgVUlFdmVudCA6IEV2ZW50IHsKKyAgdm9pZCBpbml0VUlFdmVudChET01TdHJpbmcgdHlwZSwgYm9vbGVhbiBidWJibGVzLCBib29sZWFuIGNhbmNlbGFibGUsCisgICAgICAgICAgICAgICAgICAgV2luZG93PyB2aWV3LCBsb25nIGRldGFpbCk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3c/IHZpZXc7CisKKyAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgcHJvcGVydGllcyBhcmUgbm90IHBhcnQgb2YgYW55IHNwZWNpZmljYXRpb24gYnV0CisgIC8vIGFyZSBjb21tb25seSBpbXBsZW1lbnRlZCBhbmQgcmVxdWlyZWQgYnkgQ29iYWx0LgorICAvLyBUaGUgaG9yaXpvbnRhbCBjb29yZGluYXRlIG9mIHRoZSBldmVudCByZWxhdGl2ZSB0byB0aGUgd2hvbGUgZG9jdW1lbnQuCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIHBhZ2VYOworICAvLyBUaGUgdmVydGljYWwgY29vcmRpbmF0ZSBvZiB0aGUgZXZlbnQgcmVsYXRpdmUgdG8gdGhlIHdob2xlIGRvY3VtZW50LgorICByZWFkb25seSBhdHRyaWJ1dGUgbG9uZyBwYWdlWTsKKyAgLy8gVGhlIG51bWVyaWMga2V5Q29kZSBvZiB0aGUga2V5IHByZXNzZWQsIG9yIHRoZSBjaGFyYWN0ZXIgY29kZSAoY2hhckNvZGUpCisgIC8vIGZvciBhbiBhbHBoYW51bWVyaWMga2V5IHByZXNzZWQuCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHdoaWNoOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VpX2V2ZW50X3dpdGhfa2V5X3N0YXRlLmNjIGIvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnRfd2l0aF9rZXlfc3RhdGUuY2MKaW5kZXggN2JhMWU4OS4uMGYwODE1MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnRfd2l0aF9rZXlfc3RhdGUuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnRfd2l0aF9rZXlfc3RhdGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS91aV9ldmVudF93aXRoX2tleV9zdGF0ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS91aV9ldmVudF93aXRoX2tleV9zdGF0ZS5oIGIvc3JjL2NvYmFsdC9kb20vdWlfZXZlbnRfd2l0aF9rZXlfc3RhdGUuaAppbmRleCA3NmY2MjlhLi5jOTA1NWJjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS91aV9ldmVudF93aXRoX2tleV9zdGF0ZS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3VpX2V2ZW50X3dpdGhfa2V5X3N0YXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fVUlfRVZFTlRfV0lUSF9LRVlfU1RBVEVfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9VSV9FVkVOVF9XSVRIX0tFWV9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdWludDE2X2FycmF5LmggYi9zcmMvY29iYWx0L2RvbS91aW50MTZfYXJyYXkuaAppbmRleCAyYWRmNmYzLi45MGY3YjExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS91aW50MTZfYXJyYXkuaAorKysgYi9zcmMvY29iYWx0L2RvbS91aW50MTZfYXJyYXkuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9VSU5UMTZfQVJSQVlfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9VSU5UMTZfQVJSQVlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VpbnQxNl9hcnJheS5pZGwgYi9zcmMvY29iYWx0L2RvbS91aW50MTZfYXJyYXkuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4ZTFiZWEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS91aW50MTZfYXJyYXkuaWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3R5cGVkYXJyYXkvc3BlY3MvbGF0ZXN0LyM3CitbCisgIENvbnN0cnVjdG9yKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKKyAgQ29uc3RydWN0b3IoVWludDE2QXJyYXkgYXJyYXkpLAorICBDb25zdHJ1Y3RvcihBcnJheUJ1ZmZlciBidWZmZXIsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBsZW5ndGgpLAorICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCisgIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvcgorXQoraW50ZXJmYWNlIFVpbnQxNkFycmF5IDogQXJyYXlCdWZmZXJWaWV3IHsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBCWVRFU19QRVJfRUxFTUVOVCA9IDI7CisKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCisgIGdldHRlciB1bnNpZ25lZCBzaG9ydCBnZXQodW5zaWduZWQgbG9uZyBpbmRleCk7CisgIHNldHRlciB2b2lkIHNldCh1bnNpZ25lZCBsb25nIGluZGV4LCB1bnNpZ25lZCBzaG9ydCB2YWx1ZSk7CisKKyAgLy8gVE9ETzogV2hlbiBhcnJheXMgb3Igc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQsIHN1cHBvcnQgdGhlbSBoZXJlLgorICAvLyB2b2lkIHNldChzZXF1ZW5jZTxsb25nPiBhcnJheSwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworCisgIC8vIENvcHkgaXRlbXMgaW50byB0aGlzIGFycmF5IGZyb20gc291cmNlLCBzdGFydGluZyBhdCB0aGlzW29mZnNldF0uCisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0KFVpbnQxNkFycmF5IHNvdXJjZSwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworCisgIC8vIFJldHVybiBhIG5ldyBVaW50MTZBcnJheSB0aGF0IGlzIGEgdmlldyBvbiB0b3Agb2YgdGhpcyBvbmUuCisgIC8vIENvbnRhaW5zIHRoaXNbc3RhcnRdLi50aGlzW2VuZF0uIGVuZCBkZWZhdWx0cyB0byBsZW5ndGggaWYgdW5zcGVjaWZpZWQuCisgIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSBVaW50MTZBcnJheSBzdWJhcnJheShsb25nIHN0YXJ0LCBvcHRpb25hbCBsb25nIGVuZCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdWludDMyX2FycmF5LmggYi9zcmMvY29iYWx0L2RvbS91aW50MzJfYXJyYXkuaAppbmRleCBmMDcyMDEyLi44NTMyNDY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS91aW50MzJfYXJyYXkuaAorKysgYi9zcmMvY29iYWx0L2RvbS91aW50MzJfYXJyYXkuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9VSU5UMzJfQVJSQVlfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9VSU5UMzJfQVJSQVlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VpbnQzMl9hcnJheS5pZGwgYi9zcmMvY29iYWx0L2RvbS91aW50MzJfYXJyYXkuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxYTQzNWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS91aW50MzJfYXJyYXkuaWRsCkBAIC0wLDAgKzEsNDAgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3Lmtocm9ub3Mub3JnL3JlZ2lzdHJ5L3R5cGVkYXJyYXkvc3BlY3MvbGF0ZXN0LyM3CitbCisgIENvbnN0cnVjdG9yKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKKyAgQ29uc3RydWN0b3IoVWludDMyQXJyYXkgYXJyYXkpLAorICBDb25zdHJ1Y3RvcihBcnJheUJ1ZmZlciBidWZmZXIsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgYnl0ZU9mZnNldCwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBsZW5ndGgpLAorICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCisgIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvcgorXQoraW50ZXJmYWNlIFVpbnQzMkFycmF5IDogQXJyYXlCdWZmZXJWaWV3IHsKKyAgY29uc3QgdW5zaWduZWQgbG9uZyBCWVRFU19QRVJfRUxFTUVOVCA9IDQ7CisKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworCisgIGdldHRlciB1bnNpZ25lZCBsb25nIGdldCh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgc2V0dGVyIHZvaWQgc2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgsIHVuc2lnbmVkIGxvbmcgdmFsdWUpOworCisgIC8vIFRPRE86IFdoZW4gYXJyYXlzIG9yIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkLCBzdXBwb3J0IHRoZW0gaGVyZS4KKyAgLy8gdm9pZCBzZXQoc2VxdWVuY2U8bG9uZz4gYXJyYXksIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKworICAvLyBDb3B5IGl0ZW1zIGludG8gdGhpcyBhcnJheSBmcm9tIHNvdXJjZSwgc3RhcnRpbmcgYXQgdGhpc1tvZmZzZXRdLgorICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNldChVaW50MzJBcnJheSBzb3VyY2UsIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKworICAvLyBSZXR1cm4gYSBuZXcgVWludDMyQXJyYXkgdGhhdCBpcyBhIHZpZXcgb24gdG9wIG9mIHRoaXMgb25lLgorICAvLyBDb250YWlucyB0aGlzW3N0YXJ0XS4udGhpc1tlbmRdLiBlbmQgZGVmYXVsdHMgdG8gbGVuZ3RoIGlmIHVuc3BlY2lmaWVkLgorICBbQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5nc10gVWludDMyQXJyYXkgc3ViYXJyYXkobG9uZyBzdGFydCwgb3B0aW9uYWwgbG9uZyBlbmQpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VpbnQ4X2FycmF5LmggYi9zcmMvY29iYWx0L2RvbS91aW50OF9hcnJheS5oCmluZGV4IDM0MzRiNDYuLmIwYjFiOWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3VpbnQ4X2FycmF5LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vdWludDhfYXJyYXkuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9VSU5UOF9BUlJBWV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1VJTlQ4X0FSUkFZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS91aW50OF9hcnJheS5pZGwgYi9zcmMvY29iYWx0L2RvbS91aW50OF9hcnJheS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGIyOTg5OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3VpbnQ4X2FycmF5LmlkbApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy5raHJvbm9zLm9yZy9yZWdpc3RyeS90eXBlZGFycmF5L3NwZWNzL2xhdGVzdC8jNy4xCitbCisgIENvbnN0cnVjdG9yKHVuc2lnbmVkIGxvbmcgbGVuZ3RoKSwKKyAgQ29uc3RydWN0b3IoVWludDhBcnJheSBhcnJheSksCisgIENvbnN0cnVjdG9yKEFycmF5QnVmZmVyIGJ1ZmZlciwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBieXRlT2Zmc2V0LCBvcHRpb25hbCB1bnNpZ25lZCBsb25nIGxlbmd0aCksCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncywKKyAgUmFpc2VzRXhjZXB0aW9uPUNvbnN0cnVjdG9yCitdCitpbnRlcmZhY2UgVWludDhBcnJheSA6IEFycmF5QnVmZmVyVmlldyB7CisgIGNvbnN0IHVuc2lnbmVkIGxvbmcgQllURVNfUEVSX0VMRU1FTlQgPSAxOworCisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKworICBnZXR0ZXIgb2N0ZXQgZ2V0KHVuc2lnbmVkIGxvbmcgaW5kZXgpOworICBzZXR0ZXIgdm9pZCBzZXQodW5zaWduZWQgbG9uZyBpbmRleCwgb2N0ZXQgdmFsdWUpOworCisgIC8vIFRPRE86IFdoZW4gYXJyYXlzIG9yIHNlcXVlbmNlcyBhcmUgc3VwcG9ydGVkLCBzdXBwb3J0IHRoZW0gaGVyZS4KKyAgLy8gdm9pZCBzZXQoc2VxdWVuY2U8bG9uZz4gYXJyYXksIG9wdGlvbmFsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0KTsKKworICAvLyBDb3B5IGl0ZW1zIGludG8gdGhpcyBhcnJheSBmcm9tIHNvdXJjZSwgc3RhcnRpbmcgYXQgdGhpc1tvZmZzZXRdLgorICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNldChVaW50OEFycmF5IHNvdXJjZSwgb3B0aW9uYWwgdW5zaWduZWQgbG9uZyBvZmZzZXQpOworCisgIC8vIFJldHVybiBhIG5ldyBVaW50OEFycmF5IHRoYXQgaXMgYSB2aWV3IG9uIHRvcCBvZiB0aGlzIG9uZS4KKyAgLy8gQ29udGFpbnMgdGhpc1tzdGFydF0uLnRoaXNbZW5kXS4gZW5kIGRlZmF1bHRzIHRvIGxlbmd0aCBpZiB1bnNwZWNpZmllZC4KKyAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIFVpbnQ4QXJyYXkgc3ViYXJyYXkobG9uZyBzdGFydCwgb3B0aW9uYWwgbG9uZyBlbmQpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VybC5jYyBiL3NyYy9jb2JhbHQvZG9tL3VybC5jYwppbmRleCBlN2IyNTZlLi40YjljZDRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS91cmwuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vdXJsLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vdXJsLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VybC5oIGIvc3JjL2NvYmFsdC9kb20vdXJsLmgKaW5kZXggNjg5OTYxMi4uYTllODQ3OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20vdXJsLmgKKysrIGIvc3JjL2NvYmFsdC9kb20vdXJsLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fVVJMX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fVVJMX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS91cmwuaWRsIGIvc3JjL2NvYmFsdC9kb20vdXJsLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMzBjMjIzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vdXJsLmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNC9XRC11cmwtMS0yMDE0MTIwOS8jZG9tLXVybAorCitpbnRlcmZhY2UgVVJMIHsKKyAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHN0YXRpYyBET01TdHJpbmcKKyAgICAgIGNyZWF0ZU9iamVjdFVSTChNZWRpYVNvdXJjZSBtZWRpYVNvdXJjZSk7CisgIFtDYWxsV2l0aD1FbnZpcm9ubWVudFNldHRpbmdzXSBzdGF0aWMgRE9NU3RyaW5nCisgICAgICBjcmVhdGVPYmplY3RVUkwoQmxvYiBibG9iKTsKKyAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHN0YXRpYyB2b2lkIHJldm9rZU9iamVjdFVSTChET01TdHJpbmcgdXJsKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS91cmxfcmVnaXN0cnkuaCBiL3NyYy9jb2JhbHQvZG9tL3VybF9yZWdpc3RyeS5oCmluZGV4IDM2MTk3NjIuLjRiNjk1NGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3VybF9yZWdpc3RyeS5oCisrKyBiL3NyYy9jb2JhbHQvZG9tL3VybF9yZWdpc3RyeS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1VSTF9SRUdJU1RSWV9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1VSTF9SRUdJU1RSWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdXJsX3V0aWxzLmNjIGIvc3JjL2NvYmFsdC9kb20vdXJsX3V0aWxzLmNjCmluZGV4IDczNzRmNDEuLjRmYjU1YzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3VybF91dGlscy5jYworKysgYi9zcmMvY29iYWx0L2RvbS91cmxfdXRpbHMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS91cmxfdXRpbHMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdXJsX3V0aWxzLmggYi9zcmMvY29iYWx0L2RvbS91cmxfdXRpbHMuaAppbmRleCAwOTg3NzNiLi5mM2RiYWE3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS91cmxfdXRpbHMuaAorKysgYi9zcmMvY29iYWx0L2RvbS91cmxfdXRpbHMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9VUkxfVVRJTFNfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9VUkxfVVRJTFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3VybF91dGlscy5pZGwgYi9zcmMvY29iYWx0L2RvbS91cmxfdXRpbHMuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdiNGM5M2IKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS91cmxfdXRpbHMuaWRsCkBAIC0wLDAgKzEsMjcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE0L1dELXVybC0xLTIwMTQxMjA5LyNkb20tdXJsdXRpbHMKKworW05vSW50ZXJmYWNlT2JqZWN0XQoraW50ZXJmYWNlIFVSTFV0aWxzIHsKKyAgc3RyaW5naWZpZXIgYXR0cmlidXRlIFVTVlN0cmluZyBocmVmOworICBhdHRyaWJ1dGUgVVNWU3RyaW5nIHByb3RvY29sOworICBhdHRyaWJ1dGUgVVNWU3RyaW5nIGhvc3Q7CisgIGF0dHJpYnV0ZSBVU1ZTdHJpbmcgaG9zdG5hbWU7CisgIGF0dHJpYnV0ZSBVU1ZTdHJpbmcgcG9ydDsKKyAgYXR0cmlidXRlIFVTVlN0cmluZyBwYXRobmFtZTsKKyAgYXR0cmlidXRlIFVTVlN0cmluZyBzZWFyY2g7CisgIGF0dHJpYnV0ZSBVU1ZTdHJpbmcgaGFzaDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS91cmxfdXRpbHNfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tL3VybF91dGlsc190ZXN0LmNjCmluZGV4IDI5YzQ3MjEuLjhlZDkxNzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3VybF91dGlsc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3VybF91dGlsc190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20vdXJsX3V0aWxzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3ZpZGVvX3BsYXliYWNrX3F1YWxpdHkuaCBiL3NyYy9jb2JhbHQvZG9tL3ZpZGVvX3BsYXliYWNrX3F1YWxpdHkuaAppbmRleCBlNWU4OGUzLi40NzFiOTI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS92aWRlb19wbGF5YmFja19xdWFsaXR5LmgKKysrIGIvc3JjL2NvYmFsdC9kb20vdmlkZW9fcGxheWJhY2tfcXVhbGl0eS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1ZJREVPX1BMQVlCQUNLX1FVQUxJVFlfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9WSURFT19QTEFZQkFDS19RVUFMSVRZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS92aWRlb19wbGF5YmFja19xdWFsaXR5LmlkbCBiL3NyYy9jb2JhbHQvZG9tL3ZpZGVvX3BsYXliYWNrX3F1YWxpdHkuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFjYzA2YzAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS92aWRlb19wbGF5YmFja19xdWFsaXR5LmlkbApAQCAtMCwwICsxLDI1IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvbWVkaWEtc291cmNlLyNpZGwtZGVmLVZpZGVvUGxheWJhY2tRdWFsaXR5CisKK2ludGVyZmFjZSBWaWRlb1BsYXliYWNrUXVhbGl0eSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01IaWdoUmVzVGltZVN0YW1wIGNyZWF0aW9uVGltZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgdG90YWxWaWRlb0ZyYW1lczsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgZHJvcHBlZFZpZGVvRnJhbWVzOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBjb3JydXB0ZWRWaWRlb0ZyYW1lczsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSB0b3RhbEZyYW1lRGVsYXk7Cit9OworCit0eXBlZGVmIGRvdWJsZSBET01IaWdoUmVzVGltZVN0YW1wOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdmlkZW9fdHJhY2suaCBiL3NyYy9jb2JhbHQvZG9tL3ZpZGVvX3RyYWNrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmUzOWVmNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3ZpZGVvX3RyYWNrLmgKQEAgLTAsMCArMSw4NiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX1ZJREVPX1RSQUNLX0hfCisjZGVmaW5lIENPQkFMVF9ET01fVklERU9fVFJBQ0tfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImNvYmFsdC9kb20vdHJhY2tfYmFzZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIGRvbSB7CisKK2NsYXNzIFNvdXJjZUJ1ZmZlcjsKKworLy8gVGhlIFZpZGVvVHJhY2sgaW50ZXJmYWNlIGhvbGRzIGF0dHJpYnV0ZXMgb2YgYW4gdmlkZW8gdHJhY2suCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc2VtYW50aWNzLWVtYmVkZGVkLWNvbnRlbnQuaHRtbCN2aWRlb3RyYWNrLXZpZGVvdHJhY2sKK2NsYXNzIFZpZGVvVHJhY2sgOiBwdWJsaWMgVHJhY2tCYXNlIHsKKyBwdWJsaWM6CisgIC8vIEN1c3RvbSwgbm90IGluIGFueSBzcGVjLgorICAvLworICBWaWRlb1RyYWNrKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGtpbmQsCisgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsLCBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsCisgICAgICAgICAgICAgYm9vbCBzZWxlY3RlZCkKKyAgICAgIDogVHJhY2tCYXNlKGlkLCBraW5kLCBsYWJlbCwgbGFuZ3VhZ2UsICZWaWRlb1RyYWNrOjpJc1ZhbGlkS2luZCksCisgICAgICAgIHNlbGVjdGVkXyhzZWxlY3RlZCkge30KKworICAvLyBXZWIgQVBJOiBWaWRlb1RyYWNrCisgIC8vCisgIHVzaW5nIFRyYWNrQmFzZTo6aWQ7CisgIHVzaW5nIFRyYWNrQmFzZTo6a2luZDsKKyAgdXNpbmcgVHJhY2tCYXNlOjpsYWJlbDsKKyAgdXNpbmcgVHJhY2tCYXNlOjpsYW5ndWFnZTsKKyAgYm9vbCBzZWxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIHNlbGVjdGVkXzsgfQorICB2b2lkIHNldF9zZWxlY3RlZChib29sIHNlbGVjdGVkKSB7CisgICAgaWYgKHNlbGVjdGVkXyA9PSBzZWxlY3RlZCkgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzZWxlY3RlZF8gPSBzZWxlY3RlZDsKKyAgICBpZiAobWVkaWFfZWxlbWVudF8pIHsKKyAgICAgIC8vIFRPRE86IE5vdGlmeSB0aGUgbWVkaWEgZWxlbWVudC4KKyAgICAgIC8vIG1lZGlhX2VsZW1lbnRfLT5PblNlbGVjdGVkVmlkZW9UcmFja0NoYW5nZWQodGhpcyk7CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgfQorICB9CisKKyAgLy8gQ3VzdG9tLCBub3QgaW4gYW55IHNwZWMuCisgIC8vCisgIHN0YXRpYyBib29sIElzVmFsaWRLaW5kKGNvbnN0IGNoYXIqIGtpbmQpIHsKKyAgICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUxL3NlbWFudGljcy1lbWJlZGRlZC1jb250ZW50Lmh0bWwjZG9tLXZpZGVvdHJhY2stdmlkZW90cmFja2tpbmQKKyAgICByZXR1cm4gU2JTdHJpbmdDb21wYXJlQWxsKGtpbmQsICJhbHRlcm5hdGl2ZSIpID09IDAgfHwKKyAgICAgICAgICAgU2JTdHJpbmdDb21wYXJlQWxsKGtpbmQsICJjYXB0aW9ucyIpID09IDAgfHwKKyAgICAgICAgICAgU2JTdHJpbmdDb21wYXJlQWxsKGtpbmQsICJtYWluIikgPT0gMCB8fAorICAgICAgICAgICBTYlN0cmluZ0NvbXBhcmVBbGwoa2luZCwgInNpZ24iKSA9PSAwIHx8CisgICAgICAgICAgIFNiU3RyaW5nQ29tcGFyZUFsbChraW5kLCAic3VidGl0bGVzIikgPT0gMCB8fAorICAgICAgICAgICBTYlN0cmluZ0NvbXBhcmVBbGwoa2luZCwgImNvbW1lbnRhcnkiKSA9PSAwIHx8CisgICAgICAgICAgIFNiU3RyaW5nR2V0TGVuZ3RoKGtpbmQpID09IDA7CisgIH0KKworICAvLyBSZXNldCBzZWxlY3RlZCBmbGFnIHdpdGhvdXQgbm90aWZ5aW5nIHRoZSBtZWRpYSBlbGVtZW50LiAgVGhpcyBpcyB1c2VkIGJ5CisgIC8vIHRoZSBWaWRlb1RyYWNrTGlzdCB0byBjbGVhciB0aGUgc2VsZWN0IGZsYWcgb2Ygb3RoZXIgVmlkZW9UcmFja3Mgd2hlbiBhCisgIC8vIFZpZGVvVHJhY2sgaXMgc2VsZWN0ZWQuCisgIHZvaWQgZGVzZWxlY3QoKSB7IHNlbGVjdGVkXyA9IGZhbHNlOyB9CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKFZpZGVvVHJhY2spOworCisgcHJpdmF0ZToKKyAgYm9vbCBzZWxlY3RlZF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZG9tCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0RPTV9WSURFT19UUkFDS19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdmlkZW9fdHJhY2suaWRsIGIvc3JjL2NvYmFsdC9kb20vdmlkZW9fdHJhY2suaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkYWRkZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS92aWRlb190cmFjay5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1MS9zZW1hbnRpY3MtZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2stdmlkZW90cmFjaworCitpbnRlcmZhY2UgVmlkZW9UcmFjayB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgaWQ7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcga2luZDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYWJlbDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBsYW5ndWFnZTsKKyAgYXR0cmlidXRlIGJvb2xlYW4gc2VsZWN0ZWQ7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdmlkZW9fdHJhY2tfbGlzdC5oIGIvc3JjL2NvYmFsdC9kb20vdmlkZW9fdHJhY2tfbGlzdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0YWQ2MTAKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS92aWRlb190cmFja19saXN0LmgKQEAgLTAsMCArMSw3NyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfRE9NX1ZJREVPX1RSQUNLX0xJU1RfSF8KKyNkZWZpbmUgQ09CQUxUX0RPTV9WSURFT19UUkFDS19MSVNUX0hfCisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9tZWRpYV9lbGVtZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS90cmFja19saXN0X2Jhc2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL3ZpZGVvX3RyYWNrLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgZG9tIHsKKworLy8gVGhlIFZpZGVvVHJhY2tMaXN0IGludGVyZmFjZSBob2xkcyBhIGxpc3Qgb2YgdmlkZW8gdHJhY2tzCisvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNTEvc2VtYW50aWNzLWVtYmVkZGVkLWNvbnRlbnQuaHRtbCN2aWRlb3RyYWNrbGlzdC12aWRlb3RyYWNrbGlzdAorY2xhc3MgVmlkZW9UcmFja0xpc3QgOiBwdWJsaWMgVHJhY2tMaXN0QmFzZTxWaWRlb1RyYWNrPiB7CisgcHVibGljOgorICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgLy8KKyAgZXhwbGljaXQgVmlkZW9UcmFja0xpc3QoSFRNTE1lZGlhRWxlbWVudCogbWVkaWFfZWxlbWVudCkKKyAgICAgIDogVHJhY2tMaXN0QmFzZTxWaWRlb1RyYWNrPihtZWRpYV9lbGVtZW50KSB7fQorCisgIC8vIFdlYiBBUEk6IFZpZGVvVHJhY2tMaXN0CisgIC8vCisgIHVzaW5nIFRyYWNrTGlzdEJhc2U8VmlkZW9UcmFjaz46Omxlbmd0aDsKKyAgdXNpbmcgVHJhY2tMaXN0QmFzZTxWaWRlb1RyYWNrPjo6QW5vbnltb3VzSW5kZXhlZEdldHRlcjsKKyAgdXNpbmcgVHJhY2tMaXN0QmFzZTxWaWRlb1RyYWNrPjo6R2V0VHJhY2tCeUlkOworCisgIGludDMyIHNlbGVjdGVkX2luZGV4KCkgY29uc3QgeworICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgbGVuZ3RoKCk7ICsraSkgeworICAgICAgc2NvcGVkX3JlZnB0cjxWaWRlb1RyYWNrPiB2aWRlb190cmFjayA9IEFub255bW91c0luZGV4ZWRHZXR0ZXIoaSk7CisgICAgICBpZiAodmlkZW9fdHJhY2stPnNlbGVjdGVkKCkpIHsKKyAgICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyPihpKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gLTE7CisgIH0KKworICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgLy8KKyAgLy8gQ2FsbGVkIHdoZW4gdGhlIFZpZGVvVHJhY2sgaWRlbnRpZmllZCBieSB8aWR8IGlzIHNlbGVjdGVkLiAgVGhpcyBmdW5jdGlvbgorICAvLyBjbGVhcnMgdGhlIHNlbGVjdGVkIGZsYWdzIG9mIG90aGVyIFZpZGVvVHJhY2tzIGlmIHRoZXJlIGlzIGFueS4KKyAgdm9pZCBPblRyYWNrU2VsZWN0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkKSB7CisgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBsZW5ndGgoKTsgKytpKSB7CisgICAgICBzY29wZWRfcmVmcHRyPFZpZGVvVHJhY2s+IHZpZGVvX3RyYWNrID0gQW5vbnltb3VzSW5kZXhlZEdldHRlcihpKTsKKworICAgICAgaWYgKHZpZGVvX3RyYWNrLT5pZCgpICE9IGlkKSB7CisgICAgICAgIHZpZGVvX3RyYWNrLT5kZXNlbGVjdCgpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRENIRUNLKHZpZGVvX3RyYWNrLT5zZWxlY3RlZCgpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoVmlkZW9UcmFja0xpc3QpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGRvbQorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9ET01fVklERU9fVFJBQ0tfTElTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vdmlkZW9fdHJhY2tfbGlzdC5pZGwgYi9zcmMvY29iYWx0L2RvbS92aWRlb190cmFja19saXN0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGIxNThiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vdmlkZW9fdHJhY2tfbGlzdC5pZGwKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1MS9zZW1hbnRpY3MtZW1iZWRkZWQtY29udGVudC5odG1sI3ZpZGVvdHJhY2tsaXN0LXZpZGVvdHJhY2tsaXN0CisKK2ludGVyZmFjZSBWaWRlb1RyYWNrTGlzdCA6IEV2ZW50VGFyZ2V0IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBnZXR0ZXIgVmlkZW9UcmFjayh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgVmlkZW9UcmFjaz8gZ2V0VHJhY2tCeUlkKERPTVN0cmluZyBpZCk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBsb25nIHNlbGVjdGVkSW5kZXg7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjIGIvc3JjL2NvYmFsdC9kb20vd2luZG93LmNjCmluZGV4IDI1YjYxMDYuLjE3MjI5ZTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5jYworKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbS93aW5kb3cuaCIKIApAQCAtMzMsNiArMzEsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vaHRtbF9lbGVtZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2VsZW1lbnRfY29udGV4dC5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbG9jYXRpb24uaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL211dGF0aW9uX29ic2VydmVyX3Rhc2tfbWFuYWdlci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vbmF2aWdhdG9yLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9wZXJmb3JtYW5jZS5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vc2NyZWVuLmgiCkBAIC04NCw3ICs4Myw5IEBACiAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF9zZWN1cml0eV9wb2xpY3ksCiAgICAgICAgICAgICAgICBDc3BFbmZvcmNlbWVudFR5cGUgY3NwX2VuZm9yY2VtZW50X21vZGUsCiAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBjc3BfcG9saWN5X2NoYW5nZWRfY2FsbGJhY2ssCisgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiByYW5fYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrc19jYWxsYmFjaywKICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHdpbmRvd19jbG9zZV9jYWxsYmFjaywKKyAgICAgICAgICAgICAgIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvdywKICAgICAgICAgICAgICAgIGludCBjc3BfaW5zZWN1cmVfYWxsb3dlZF90b2tlbiwgaW50IGRvbV9tYXhfZWxlbWVudF9kZXB0aCkKICAgICA6IHdpZHRoXyh3aWR0aCksCiAgICAgICBoZWlnaHRfKGhlaWdodCksCkBAIC0xMjUsMTEgKzEyNiwyOCBAQAogICAgICAgQUxMT1dfVEhJU19JTl9JTklUSUFMSVpFUl9MSVNUKAogICAgICAgICAgIHNlc3Npb25fc3RvcmFnZV8obmV3IFN0b3JhZ2UodGhpcywgU3RvcmFnZTo6a1Nlc3Npb25TdG9yYWdlLCBOVUxMKSkpLAogICAgICAgc2NyZWVuXyhuZXcgU2NyZWVuKHdpZHRoLCBoZWlnaHQpKSwKLSAgICAgIHdpbmRvd19jbG9zZV9jYWxsYmFja18od2luZG93X2Nsb3NlX2NhbGxiYWNrKSB7CisgICAgICByYW5fYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrc19jYWxsYmFja18oCisgICAgICAgICAgcmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3NfY2FsbGJhY2spLAorICAgICAgd2luZG93X2Nsb3NlX2NhbGxiYWNrXyh3aW5kb3dfY2xvc2VfY2FsbGJhY2spLAorICAgICAgc3lzdGVtX3dpbmRvd18oc3lzdGVtX3dpbmRvdykgewogI2lmIGRlZmluZWQoRU5BQkxFX1RFU1RfUlVOTkVSKQogICB0ZXN0X3J1bm5lcl8gPSBuZXcgVGVzdFJ1bm5lcigpOwogI2VuZGlmICAvLyBFTkFCTEVfVEVTVF9SVU5ORVIKICAgZG9jdW1lbnRfLT5BZGRPYnNlcnZlcihyZWxheV9vbl9sb2FkX2V2ZW50Xy5nZXQoKSk7CisgIGlmIChzeXN0ZW1fd2luZG93XykgeworICAgIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvd1N0YXJib2FyZCogc3lzdGVtX3dpbmRvd19zYiA9CisgICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvd1N0YXJib2FyZCo+KAorICAgICAgICAgICAgc3lzdGVtX3dpbmRvd18pOworICAgIFNiV2luZG93IHNiX3dpbmRvdyA9IHN5c3RlbV93aW5kb3dfc2ItPkdldFNiV2luZG93KCk7CisgICAgU2JXaW5kb3dTaXplIHNpemU7CisgICAgaWYgKFNiV2luZG93R2V0U2l6ZShzYl93aW5kb3csICZzaXplKSkgeworICAgICAgZGV2aWNlX3BpeGVsX3JhdGlvXyA9IHNpemUudmlkZW9fcGl4ZWxfcmF0aW87CisgICAgfSBlbHNlIHsKKyAgICAgIGRldmljZV9waXhlbF9yYXRpb18gPSAxLjBmOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICAgIGRldmljZV9waXhlbF9yYXRpb18gPSAxLjBmOworICB9CiB9CiAKIGNvbnN0IHNjb3BlZF9yZWZwdHI8RG9jdW1lbnQ+JiBXaW5kb3c6OmRvY3VtZW50KCkgY29uc3QgeyByZXR1cm4gZG9jdW1lbnRfOyB9CkBAIC0zMDUsMTggKzMyMywzNiBAQAogfQogCiB2b2lkIFdpbmRvdzo6UnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoKSB7Ci0gIC8vIEZpcnN0IGdyYWIgdGhlIGN1cnJlbnQgbGlzdCBvZiBmcmFtZSByZXF1ZXN0IGNhbGxiYWNrcyBhbmQgaG9sZCBvbiB0byBpdAotICAvLyBoZXJlIGxvY2FsbHkuCi0gIHNjb3BlZF9wdHI8QW5pbWF0aW9uRnJhbWVSZXF1ZXN0Q2FsbGJhY2tMaXN0PiBmcmFtZV9yZXF1ZXN0X2xpc3QgPQotICAgICAgYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfY2FsbGJhY2tfbGlzdF8uUGFzcygpOworICAvLyBTY29wZSB0aGUgU3RvcFdhdGNoLiBJdCBzaG91bGQgbm90IGluY2x1ZGUgYW55IHByb2Nlc3NpbmcgZnJvbQorICAvLyB8cmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3NfY2FsbGJhY2tffC4KKyAgeworICAgIGJhc2U6OlN0b3BXYXRjaCBzdG9wX3dhdGNoX3J1bl9hbmltYXRpb25fZnJhbWVfY2FsbGJhY2tzKAorICAgICAgICBEb21TdGF0VHJhY2tlcjo6a1N0b3BXYXRjaFR5cGVSdW5BbmltYXRpb25GcmFtZUNhbGxiYWNrcywKKyAgICAgICAgYmFzZTo6U3RvcFdhdGNoOjprQXV0b1N0YXJ0T24sCisgICAgICAgIGh0bWxfZWxlbWVudF9jb250ZXh0KCktPmRvbV9zdGF0X3RyYWNrZXIoKSk7CiAKLSAgLy8gVGhlbiBzZXR1cCB0aGUgV2luZG93J3MgZnJhbWUgcmVxdWVzdCBjYWxsYmFjayBsaXN0IHdpdGggYSBmcmVzaGx5IGNyZWF0ZWQKLSAgLy8gYW5kIGVtcHR5IG9uZS4KLSAgYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfY2FsbGJhY2tfbGlzdF8ucmVzZXQoCi0gICAgICBuZXcgQW5pbWF0aW9uRnJhbWVSZXF1ZXN0Q2FsbGJhY2tMaXN0KHRoaXMpKTsKKyAgICAvLyBGaXJzdCBncmFiIHRoZSBjdXJyZW50IGxpc3Qgb2YgZnJhbWUgcmVxdWVzdCBjYWxsYmFja3MgYW5kIGhvbGQgb24gdG8gaXQKKyAgICAvLyBoZXJlIGxvY2FsbHkuCisgICAgc2NvcGVkX3B0cjxBbmltYXRpb25GcmFtZVJlcXVlc3RDYWxsYmFja0xpc3Q+IGZyYW1lX3JlcXVlc3RfbGlzdCA9CisgICAgICAgIGFuaW1hdGlvbl9mcmFtZV9yZXF1ZXN0X2NhbGxiYWNrX2xpc3RfLlBhc3MoKTsKIAotICAvLyBOb3csIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBjYWxsYmFja3MgYW5kIGNhbGwgdGhlbS4KLSAgZnJhbWVfcmVxdWVzdF9saXN0LT5SdW5DYWxsYmFja3MoKmRvY3VtZW50Xy0+dGltZWxpbmUoKS0+Y3VycmVudF90aW1lKCkpOworICAgIC8vIFRoZW4gc2V0dXAgdGhlIFdpbmRvdydzIGZyYW1lIHJlcXVlc3QgY2FsbGJhY2sgbGlzdCB3aXRoIGEgZnJlc2hseQorICAgIC8vIGNyZWF0ZWQgYW5kIGVtcHR5IG9uZS4KKyAgICBhbmltYXRpb25fZnJhbWVfcmVxdWVzdF9jYWxsYmFja19saXN0Xy5yZXNldCgKKyAgICAgICAgbmV3IEFuaW1hdGlvbkZyYW1lUmVxdWVzdENhbGxiYWNrTGlzdCh0aGlzKSk7CisKKyAgICAvLyBOb3csIGl0ZXJhdGUgdGhyb3VnaCBlYWNoIG9mIHRoZSBjYWxsYmFja3MgYW5kIGNhbGwgdGhlbS4KKyAgICBmcmFtZV9yZXF1ZXN0X2xpc3QtPlJ1bkNhbGxiYWNrcygqZG9jdW1lbnRfLT50aW1lbGluZSgpLT5jdXJyZW50X3RpbWUoKSk7CisgIH0KKworICAvLyBSdW4gdGhlIGNhbGxiYWNrIGlmIG9uZSBleGlzdHMuCisgIGlmICghcmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3NfY2FsbGJhY2tfLmlzX251bGwoKSkgeworICAgIHJhbl9hbmltYXRpb25fZnJhbWVfY2FsbGJhY2tzX2NhbGxiYWNrXy5SdW4oKTsKKyAgfQorfQorCitib29sIFdpbmRvdzo6SGFzUGVuZGluZ0FuaW1hdGlvbkZyYW1lQ2FsbGJhY2tzKCkgY29uc3QgeworICByZXR1cm4gYW5pbWF0aW9uX2ZyYW1lX3JlcXVlc3RfY2FsbGJhY2tfbGlzdF8tPkhhc1BlbmRpbmdDYWxsYmFja3MoKTsKIH0KIAogdm9pZCBXaW5kb3c6OkluamVjdEV2ZW50KGNvbnN0IHNjb3BlZF9yZWZwdHI8RXZlbnQ+JiBldmVudCkgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93LmggYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaAppbmRleCAzMGE1N2Q5Li4yZmU4YzFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS93aW5kb3cuaAorKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9XSU5ET1dfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9XSU5ET1dfSF8KQEAgLTMwLDExICsyOCw5IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9jcnlwdG8uaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2NzcF9kZWxlZ2F0ZV90eXBlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9kb21fc3RhdF90cmFja2VyLmgiCi0jaW5jbHVkZSAiY29iYWx0L2RvbS9lbGVtZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3F1ZXJ5X2xpc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL21lZGlhX3NvdXJjZS5oIgotI2luY2x1ZGUgImNvYmFsdC9kb20vbXV0YXRpb25fb2JzZXJ2ZXJfdGFza19tYW5hZ2VyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9wYXJzZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbmV0d29ya19icmlkZ2UvY29va2llX2phci5oIgogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrX2JyaWRnZS9uZXRfcG9zdGVyLmgiCkBAIC01NCwxMyArNTAsMTcgQEAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2Vudmlyb25tZW50X3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGVjdXRpb25fc3RhdGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvc3lzdGVtX3dpbmRvdy9zdGFyYm9hcmQvc3lzdGVtX3dpbmRvdy5oIgorI2luY2x1ZGUgImNvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaCIKICNpbmNsdWRlICJnb29nbGV1cmwvc3JjL2d1cmwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGRvbSB7CiAKIGNsYXNzIENvbnNvbGU7CiBjbGFzcyBEb2N1bWVudDsKK2NsYXNzIEVsZW1lbnQ7CiBjbGFzcyBFdmVudDsKIGNsYXNzIEhpc3Rvcnk7CiBjbGFzcyBIVE1MRWxlbWVudENvbnRleHQ7CkBAIC0xMTAsNyArMTEwLDkgQEAKICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3NlY3VyaXR5X3BvbGljeSwKICAgICAgICAgIGRvbTo6Q3NwRW5mb3JjZW1lbnRUeXBlIGNzcF9lbmZvcmNlbWVudF9tb2RlLAogICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgY3NwX3BvbGljeV9jaGFuZ2VkX2NhbGxiYWNrLAorICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgcmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3NfY2FsbGJhY2ssCiAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB3aW5kb3dfY2xvc2VfY2FsbGJhY2ssCisgICAgICAgICBzeXN0ZW1fd2luZG93OjpTeXN0ZW1XaW5kb3cqIHN5c3RlbV93aW5kb3csCiAgICAgICAgICBpbnQgY3NwX2luc2VjdXJlX2FsbG93ZWRfdG9rZW4gPSAwLCBpbnQgZG9tX21heF9lbGVtZW50X2RlcHRoID0gMCk7CiAKICAgLy8gV2ViIEFQSTogV2luZG93CkBAIC0xODYsNyArMTg4LDcgQEAKICAgLy8gVGhlIGRldmljZVBpeGVsUmF0aW8gYXR0cmlidXRlIHJldHVybnMgdGhlIHJhdGlvIG9mIENTUyBwaXhlbHMgcGVyIGRldmljZQogICAvLyBwaXhlbC4KICAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxMy9XRC1jc3NvbS12aWV3LTIwMTMxMjE3LyNkb20td2luZG93LWRldmljZXBpeGVscmF0aW8KLSAgZmxvYXQgZGV2aWNlX3BpeGVsX3JhdGlvKCkgY29uc3QgeyByZXR1cm4gMS4wZjsgfQorICBmbG9hdCBkZXZpY2VfcGl4ZWxfcmF0aW8oKSBjb25zdCB7IHJldHVybiBkZXZpY2VfcGl4ZWxfcmF0aW9fOyB9CiAKICAgLy8gV2ViIEFQSTogR2xvYmFsQ3J5cHRvIChpbXBsZW1lbnRzKQogICAvLyAgIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJDcnlwdG9BUEkvI2NyeXB0by1pbnRlcmZhY2UKQEAgLTIzNyw2ICsyMzksOCBAQAogICAvLyByZXF1ZXN0IGNhbGxiYWNrIGxpc3QuCiAgIHZvaWQgUnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoKTsKIAorICBib29sIEhhc1BlbmRpbmdBbmltYXRpb25GcmFtZUNhbGxiYWNrcygpIGNvbnN0OworCiAgIC8vIENhbGwgdGhpcyB0byBpbmplY3QgYW4gZXZlbnQgaW50byB0aGUgd2luZG93IHdoaWNoIHdpbGwgdWx0aW1hdGVseSBtYWtlCiAgIC8vIGl0cyB3YXkgdG8gdGhlIGFwcHJvcHJpYXRlIG9iamVjdCBpbiBET00uCiAgIHZvaWQgSW5qZWN0RXZlbnQoY29uc3Qgc2NvcGVkX3JlZnB0cjxFdmVudD4mIGV2ZW50KTsKQEAgLTI2MSw2ICsyNjUsNyBAQAogCiAgIGludCB3aWR0aF87CiAgIGludCBoZWlnaHRfOworICBmbG9hdCBkZXZpY2VfcGl4ZWxfcmF0aW9fOwogCiAgIGNvbnN0IHNjb3BlZF9wdHI8SFRNTEVsZW1lbnRDb250ZXh0PiBodG1sX2VsZW1lbnRfY29udGV4dF87CiAgIHNjb3BlZF9yZWZwdHI8UGVyZm9ybWFuY2U+IHBlcmZvcm1hbmNlXzsKQEAgLTI4MSw3ICsyODYsMTAgQEAKIAogICBzY29wZWRfcmVmcHRyPFNjcmVlbj4gc2NyZWVuXzsKIAotICBiYXNlOjpDbG9zdXJlIHdpbmRvd19jbG9zZV9jYWxsYmFja187CisgIGNvbnN0IGJhc2U6OkNsb3N1cmUgcmFuX2FuaW1hdGlvbl9mcmFtZV9jYWxsYmFja3NfY2FsbGJhY2tfOworICBjb25zdCBiYXNlOjpDbG9zdXJlIHdpbmRvd19jbG9zZV9jYWxsYmFja187CisKKyAgc3lzdGVtX3dpbmRvdzo6U3lzdGVtV2luZG93KiBzeXN0ZW1fd2luZG93XzsKIAogI2lmIGRlZmluZWQoRU5BQkxFX1RFU1RfUlVOTkVSKQogICBzY29wZWRfcmVmcHRyPFRlc3RSdW5uZXI+IHRlc3RfcnVubmVyXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvdy5pZGwgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkMTRjZmQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3cuaWRsCkBAIC0wLDAgKzEsNDcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9odG1sNS9icm93c2Vycy5odG1sI3RoZS13aW5kb3ctb2JqZWN0CisKKy8vIE5vdGU6IENvYmFsdCBvbmx5IHN1cHBvcnRzIG9uZSBicm93c2luZyBjb250ZXh0IGFuZCBvbmUgV2luZG93IG9iamVjdC4KK1tQcmltYXJ5R2xvYmFsXQorLypzZWFsZWQqLyBpbnRlcmZhY2UgV2luZG93IDogRXZlbnRUYXJnZXQgeworICAvLyB0aGUgY3VycmVudCBicm93c2luZyBjb250ZXh0CisgIFtVbmZvcmdlYWJsZV0gcmVhZG9ubHkgYXR0cmlidXRlIFdpbmRvdyB3aW5kb3c7CisgIFtSZXBsYWNlYWJsZV0gcmVhZG9ubHkgYXR0cmlidXRlIFdpbmRvdyBzZWxmOworICBbVW5mb3JnZWFibGVdIHJlYWRvbmx5IGF0dHJpYnV0ZSBEb2N1bWVudCBkb2N1bWVudDsKKyAgW1B1dEZvcndhcmRzPWhyZWYsIFVuZm9yZ2VhYmxlXSByZWFkb25seSBhdHRyaWJ1dGUgTG9jYXRpb24gbG9jYXRpb247CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBIaXN0b3J5IGhpc3Rvcnk7CisgIHZvaWQgY2xvc2UoKTsKKworICAvLyBvdGhlciBicm93c2luZyBjb250ZXh0cworICBbUmVwbGFjZWFibGVdIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3cgZnJhbWVzOworICBbUmVwbGFjZWFibGVdIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgW1VuZm9yZ2VhYmxlXSByZWFkb25seSBhdHRyaWJ1dGUgV2luZG93IHRvcDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIFdpbmRvdyBvcGVuZXI7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBXaW5kb3cgcGFyZW50OworICBnZXR0ZXIgV2luZG93ICh1bnNpZ25lZCBsb25nIGluZGV4KTsKKworICAvLyB0aGUgdXNlciBhZ2VudAorICByZWFkb25seSBhdHRyaWJ1dGUgTmF2aWdhdG9yIG5hdmlnYXRvcjsKKworICAvLyBDdXN0b20sIG5vdCBpbiBhbnkgc3BlYy4KKyAgLy8KKyAgcmVhZG9ubHkgYXR0cmlidXRlIENvbnNvbGUgY29uc29sZTsKKyAgW0NvbmRpdGlvbmFsPUVOQUJMRV9URVNUX1JVTk5FUl0gcmVhZG9ubHkgYXR0cmlidXRlIFRlc3RSdW5uZXIgdGVzdFJ1bm5lcjsKKyAgW0NhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3NdIHZvaWQgZ2MoKTsKK307CitXaW5kb3cgaW1wbGVtZW50cyBHbG9iYWxFdmVudEhhbmRsZXJzOworV2luZG93IGltcGxlbWVudHMgV2luZG93RXZlbnRIYW5kbGVyczsKKwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93X19hbmltYXRpb25fdGltaW5nLmlkbCBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19fYW5pbWF0aW9uX3RpbWluZy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg3ZWQ5ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19fYW5pbWF0aW9uX3RpbWluZy5pZGwKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvTk9URS1hbmltYXRpb24tdGltaW5nLTIwMTUwOTIyLyNXaW5kb3ctaW50ZXJmYWNlLWV4dGVuc2lvbnMKKworcGFydGlhbCBpbnRlcmZhY2UgV2luZG93IHsKKyAgbG9uZyByZXF1ZXN0QW5pbWF0aW9uRnJhbWUoRnJhbWVSZXF1ZXN0Q2FsbGJhY2sgY2FsbGJhY2spOworICB2b2lkIGNhbmNlbEFuaW1hdGlvbkZyYW1lKGxvbmcgaGFuZGxlKTsKK307CisKK2NhbGxiYWNrIEZyYW1lUmVxdWVzdENhbGxiYWNrID0gdm9pZChET01IaWdoUmVzVGltZVN0YW1wIHRpbWUpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93X19wZXJmb3JtYW5jZS5pZGwgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfX3BlcmZvcm1hbmNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTRlNjMzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X19wZXJmb3JtYW5jZS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL25hdmlnYXRpb24tdGltaW5nLyNwZXJmb3JtYW5jZQorCitwYXJ0aWFsIGludGVyZmFjZSBXaW5kb3cgeworICByZWFkb25seSBhdHRyaWJ1dGUgUGVyZm9ybWFuY2UgcGVyZm9ybWFuY2U7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93X2Nzc29tLmlkbCBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19jc3NvbS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmVhNjgwNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19jc3NvbS5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTYvV0QtY3Nzb20tMS0yMDE2MDMxNy8jZXh0ZW5zaW9ucy10by10aGUtd2luZG93LWludGVyZmFjZQorCitwYXJ0aWFsIGludGVyZmFjZSBXaW5kb3cgeworICBbTmV3T2JqZWN0XSBDU1NTdHlsZURlY2xhcmF0aW9uIGdldENvbXB1dGVkU3R5bGUoRWxlbWVudCBlbHQsIG9wdGlvbmFsIERPTVN0cmluZyBwc2V1ZG9FbHQpOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19jc3NvbV92aWV3LmlkbCBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19jc3NvbV92aWV3LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYjNmNzE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X2Nzc29tX3ZpZXcuaWRsCkBAIC0wLDAgKzEsMjggQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDEzL1dELWNzc29tLXZpZXctMjAxMzEyMTcvI2V4dGVuc2lvbnMtdG8tdGhlLXdpbmRvdy1pbnRlcmZhY2UKKworcGFydGlhbCBpbnRlcmZhY2UgV2luZG93IHsKKyAgTWVkaWFRdWVyeUxpc3QgbWF0Y2hNZWRpYShET01TdHJpbmcgcXVlcnkpOworICBbU2FtZU9iamVjdF0gcmVhZG9ubHkgYXR0cmlidXRlIFNjcmVlbiBzY3JlZW47CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgaW5uZXJXaWR0aDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBpbm5lckhlaWdodDsKKworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIHNjcmVlblg7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgc2NyZWVuWTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBvdXRlcldpZHRoOworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIG91dGVySGVpZ2h0OworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGRldmljZVBpeGVsUmF0aW87Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93X2V2ZW50X2hhbmRsZXJzLmlkbCBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19ldmVudF9oYW5kbGVycy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTY2ZmY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19ldmVudF9oYW5kbGVycy5pZGwKQEAgLTAsMCArMSwyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL2h0bWw1L3dlYmFwcGFwaXMuaHRtbCN3aW5kb3dldmVudGhhbmRsZXJzCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBXaW5kb3dFdmVudEhhbmRsZXJzIHsKKyAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnVubG9hZDsKK307CisKKy8vIFRPRE86IFRoZSBJREwgZGVmaW5lcyBFdmVudEhhbmRsZXIgYXMgYSBudWxsYWJsZSBjYWxsYmFjaworLy8gZnVuY3Rpb24uIERlZmluZSBpdCBhcyBhIG51bGxhYmxlIEV2ZW50TGlzdGVuZXIgZm9yIG5vdyB1bnRpbCB3ZSBjYW4gZG8KKy8vIHNvbWUgcmVmYWN0b3JpbmcgdG8gYWNjZXB0IGJvdGggaW4gdGhlIEV2ZW50VGFyZ2V0IGltcGxlbWVudGF0aW9uLgordHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS93aW5kb3dfbG9jYWxfc3RvcmFnZS5pZGwgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfbG9jYWxfc3RvcmFnZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNkZjhkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd19sb2NhbF9zdG9yYWdlLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic3RvcmFnZS8jd2luZG93bG9jYWxzdG9yYWdlCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBXaW5kb3dMb2NhbFN0b3JhZ2UgeworICByZWFkb25seSBhdHRyaWJ1dGUgU3RvcmFnZSBsb2NhbFN0b3JhZ2U7Cit9OworV2luZG93IGltcGxlbWVudHMgV2luZG93TG9jYWxTdG9yYWdlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93X3Nlc3Npb25fc3RvcmFnZS5pZGwgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfc2Vzc2lvbl9zdG9yYWdlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmNiNThkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X3Nlc3Npb25fc3RvcmFnZS5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYnN0b3JhZ2UvI3dpbmRvd3Nlc3Npb25zdG9yYWdlCisKK1tOb0ludGVyZmFjZU9iamVjdF0KK2ludGVyZmFjZSBXaW5kb3dTZXNzaW9uU3RvcmFnZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBTdG9yYWdlIHNlc3Npb25TdG9yYWdlOworfTsKK1dpbmRvdyBpbXBsZW1lbnRzIFdpbmRvd1Nlc3Npb25TdG9yYWdlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfdGVzdC5jYwppbmRleCBmZTEwNjE0Li5hODlhZjQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS93aW5kb3dfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3dpbmRvdy5oIgogCkBAIC02Miw3ICs2MCw5IEBACiAgICAgICAgICAgICBOVUxMLCBuZXR3b3JrX2JyaWRnZTo6UG9zdFNlbmRlcigpLAogICAgICAgICAgICAgc3RkOjpzdHJpbmcoKSAvKiBkZWZhdWx0IHNlY3VyaXR5IHBvbGljeSAqLywga0NzcEVuZm9yY2VtZW50RW5hYmxlLAogICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIGNzcF9wb2xpY3lfY2hhbmdlZCAqLywKLSAgICAgICAgICAgIGJhc2U6OkNsb3N1cmUoKSAvKiB3aW5kb3dfY2xvc2UgKi8pKSB7fQorICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHJhbl9hbmltYXRpb25fZnJhbWVfY2FsbGJhY2tzICovLAorICAgICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19jbG9zZSAqLywKKyAgICAgICAgICAgIHN0dWJfbWVkaWFfbW9kdWxlXy0+c3lzdGVtX3dpbmRvdygpKSkge30KIAogICB+V2luZG93VGVzdCgpIE9WRVJSSURFIHt9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd190aW1lcnMuY2MgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfdGltZXJzLmNjCmluZGV4IDFiZDNiMTYuLjc5MmFlNDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd190aW1lcnMuY2MKKysrIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X3RpbWVycy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3dpbmRvd190aW1lcnMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20vd2luZG93X3RpbWVycy5oIGIvc3JjL2NvYmFsdC9kb20vd2luZG93X3RpbWVycy5oCmluZGV4IGFhNjM1NzUuLjQ1OGJmZDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3dpbmRvd190aW1lcnMuaAorKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfdGltZXJzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fV0lORE9XX1RJTUVSU19IXwogI2RlZmluZSBDT0JBTFRfRE9NX1dJTkRPV19USU1FUlNfSF8KQEAgLTIyLDcgKzIwLDcgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS90aW1lci5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMzEsNyArMjksNyBAQAogY2xhc3MgV2luZG93VGltZXJzIHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgc2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uPHZvaWQoKT4gVGltZXJDYWxsYmFjazsKLSAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdE9iamVjdDxUaW1lckNhbGxiYWNrPiBUaW1lckNhbGxiYWNrQXJnOworICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8VGltZXJDYWxsYmFjaz4gVGltZXJDYWxsYmFja0FyZzsKICAgZXhwbGljaXQgV2luZG93VGltZXJzKHNjcmlwdDo6V3JhcHBhYmxlKiBjb25zdCBvd25lcikKICAgICAgIDogY3VycmVudF90aW1lcl9pbmRleF8oMCksIG93bmVyXyhvd25lcikge30KICAgfldpbmRvd1RpbWVycygpIHt9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS93aW5kb3dfdGltZXJzLmlkbCBiL3NyYy9jb2JhbHQvZG9tL3dpbmRvd190aW1lcnMuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0N2MzYzUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS93aW5kb3dfdGltZXJzLmlkbApAQCAtMCwwICsxLDMzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI3dpbmRvd3RpbWVycworCitbTm9JbnRlcmZhY2VPYmplY3RdCitpbnRlcmZhY2UgV2luZG93VGltZXJzIHsKKyAgLy8gVE9ETzogQ2hhbmdlIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBiYWNrIHRvIHRoZWlyIG9yaWdpbmFsIGZvcm0gaW4gdGhlIHNwZWMsCisgIC8vIHdoZW4gIkZ1bmN0aW9uIiBhbmQgImFueSIgYXJlIHN1cHBvcnRlZC4KKyAgLy8gICBodHRwczovL3d3dy53My5vcmcvVFIvaHRtbDUvd2ViYXBwYXBpcy5odG1sI3RpbWVycworICBsb25nIHNldFRpbWVvdXQoVGltZXJDYWxsYmFjayBoYW5kbGVyLCBvcHRpb25hbCBsb25nIHRpbWVvdXQpOworICB2b2lkIGNsZWFyVGltZW91dChsb25nIGhhbmRsZSk7CisgIGxvbmcgc2V0SW50ZXJ2YWwoVGltZXJDYWxsYmFjayBoYW5kbGVyLCBvcHRpb25hbCBsb25nIHRpbWVvdXQpOworICB2b2lkIGNsZWFySW50ZXJ2YWwobG9uZyBoYW5kbGUpOworCisgIC8vIFRPRE86IElmIHdlIGV2ZXIgZGVjaWRlIHRvIHN1cHBvcnQgc2V0VGltZW91dCBhbmQgc2V0SW50ZXJ2YWwKKyAgLy8gd2l0aCBhIERPTVN0cmluZyBhcmd1bWVudCwgd2UgbXVzdCBpbXBsZW1lbnQgdGhlIGxvZ2ljIGRlc2NyaWJlZCBpbiB0aGUgQ1NQCisgIC8vIHNwZWMgcmVnYXJkaW5nICJ1bnNhZmUtZXZhbCIuCit9OworV2luZG93IGltcGxlbWVudHMgV2luZG93VGltZXJzOworCitjYWxsYmFjayBUaW1lckNhbGxiYWNrID0gdm9pZCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20veG1sX2RvY3VtZW50LmggYi9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnQuaAppbmRleCBhZmI2MzQ2Li4yNmIzY2RiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnQuaAorKysgYi9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9YTUxfRE9DVU1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9YTUxfRE9DVU1FTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3htbF9kb2N1bWVudC5pZGwgYi9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhmOWFjMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnQuaWRsCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9kb20vI2RvY3VtZW50CisKK2ludGVyZmFjZSBYTUxEb2N1bWVudCA6IERvY3VtZW50IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20veG1sX2RvY3VtZW50X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnRfdGVzdC5jYwppbmRleCBlMmU0OGE0Li42NTA5OTY4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbS94bWxfZG9jdW1lbnRfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tL3htbF9kb2N1bWVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbS94bWxfc2VyaWFsaXplci5jYyBiL3NyYy9jb2JhbHQvZG9tL3htbF9zZXJpYWxpemVyLmNjCmluZGV4IDA1NTA1YWUuLjY3MWY4YjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tL3htbF9zZXJpYWxpemVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tL3htbF9zZXJpYWxpemVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb20veG1sX3NlcmlhbGl6ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb20veG1sX3NlcmlhbGl6ZXIuaCBiL3NyYy9jb2JhbHQvZG9tL3htbF9zZXJpYWxpemVyLmgKaW5kZXggMGMwZDU3OS4uOWZlOTAwNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb20veG1sX3NlcmlhbGl6ZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbS94bWxfc2VyaWFsaXplci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1hNTF9TRVJJQUxJWkVSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fWE1MX1NFUklBTElaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tL3htbF9zZXJpYWxpemVyLmlkbCBiL3NyYy9jb2JhbHQvZG9tL3htbF9zZXJpYWxpemVyLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmVlZTI3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9kb20veG1sX3NlcmlhbGl6ZXIuaWRsCkBAIC0wLDAgKzEsMjAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9ET00tUGFyc2luZy8jdGhlLXhtbHNlcmlhbGl6ZXItaW50ZXJmYWNlCisKK1tDb25zdHJ1Y3Rvcl0KK2ludGVyZmFjZSBYTUxTZXJpYWxpemVyIHsKKyAgRE9NU3RyaW5nIHNlcmlhbGl6ZVRvU3RyaW5nKE5vZGUgcm9vdCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2RvbV9wYXJzZXIuZ3lwIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2RvbV9wYXJzZXIuZ3lwCmluZGV4IDc2YmE3MGEuLjI1YmI2MTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9kb21fcGFyc2VyLmd5cAorKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvZG9tX3BhcnNlci5neXAKQEAgLTUwLDggKzUwLDggQEAKICAgICAgICAgJ3htbF9kZWNvZGVyX3Rlc3QuY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9kb20vZG9tLmd5cDpkb21fdGVzdGluZycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdkb21fcGFyc2VyJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvaHRtbF9kZWNvZGVyLmNjCmluZGV4IDUyMzMzMjYuLjE2MDllOWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2h0bWxfZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2h0bWxfZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2h0bWxfZGVjb2Rlci5oCmluZGV4IGNmNTdjZjkuLjA0M2FkNGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvaHRtbF9kZWNvZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ET01fUEFSU0VSX0hUTUxfREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1BBUlNFUl9IVE1MX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9odG1sX2RlY29kZXJfdGVzdC5jYwppbmRleCA5NzcwZmFiLi4wODJhMDA2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvaHRtbF9kZWNvZGVyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2h0bWxfZGVjb2Rlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL2h0bWxfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX2h0bWxfcGFyc2VyX3dyYXBwZXIuY2MgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX2h0bWxfcGFyc2VyX3dyYXBwZXIuY2MKaW5kZXggN2EwNWNiOC4uOTFkYzAyYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF9odG1sX3BhcnNlcl93cmFwcGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfaHRtbF9wYXJzZXJfd3JhcHBlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfaHRtbF9wYXJzZXJfd3JhcHBlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX2h0bWxfcGFyc2VyX3dyYXBwZXIuaCBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfaHRtbF9wYXJzZXJfd3JhcHBlci5oCmluZGV4IDcxMTQ0NDMuLjI4MmM5OGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfaHRtbF9wYXJzZXJfd3JhcHBlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfaHRtbF9wYXJzZXJfd3JhcHBlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1BBUlNFUl9MSUJYTUxfSFRNTF9QQVJTRVJfV1JBUFBFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1BBUlNFUl9MSUJYTUxfSFRNTF9QQVJTRVJfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF9wYXJzZXJfd3JhcHBlci5jYyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfcGFyc2VyX3dyYXBwZXIuY2MKaW5kZXggYTg2NzUzZS4uMzI0ZjhmZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF9wYXJzZXJfd3JhcHBlci5jYworKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3BhcnNlcl93cmFwcGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF9wYXJzZXJfd3JhcHBlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3BhcnNlcl93cmFwcGVyLmggYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3BhcnNlcl93cmFwcGVyLmgKaW5kZXggNGM1ZTIzMy4uNTU1MzJiMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF9wYXJzZXJfd3JhcHBlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfcGFyc2VyX3dyYXBwZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9QQVJTRVJfTElCWE1MX1BBUlNFUl9XUkFQUEVSX0hfCiAjZGVmaW5lIENPQkFMVF9ET01fUEFSU0VSX0xJQlhNTF9QQVJTRVJfV1JBUFBFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF94bWxfcGFyc2VyX3dyYXBwZXIuY2MgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3htbF9wYXJzZXJfd3JhcHBlci5jYwppbmRleCBkZmJiMjkwLi5lNDVmOWNkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3htbF9wYXJzZXJfd3JhcHBlci5jYworKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3htbF9wYXJzZXJfd3JhcHBlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfeG1sX3BhcnNlcl93cmFwcGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfeG1sX3BhcnNlcl93cmFwcGVyLmggYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIvbGlieG1sX3htbF9wYXJzZXJfd3JhcHBlci5oCmluZGV4IGY1M2M3MjkuLjU4NjdhOTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9saWJ4bWxfeG1sX3BhcnNlcl93cmFwcGVyLmgKKysrIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL2xpYnhtbF94bWxfcGFyc2VyX3dyYXBwZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0RPTV9QQVJTRVJfTElCWE1MX1hNTF9QQVJTRVJfV1JBUFBFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1BBUlNFUl9MSUJYTUxfWE1MX1BBUlNFUl9XUkFQUEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvcGFyc2VyLmNjIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5jYwppbmRleCA1YmUwNWE2Li5iZTBkYTljIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvcGFyc2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9wYXJzZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2RvbV9wYXJzZXIvcGFyc2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci9wYXJzZXIuaAppbmRleCBlOWRlNTI2Li4wMzY4ODUwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIvcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9kb21fcGFyc2VyL3BhcnNlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1BBUlNFUl9QQVJTRVJfSF8KICNkZWZpbmUgQ09CQUxUX0RPTV9QQVJTRVJfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIveG1sX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIveG1sX2RlY29kZXIuY2MKaW5kZXggYTFiMWIxZi4uZjUxNDlmMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL3htbF9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci94bWxfZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci94bWxfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIveG1sX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci94bWxfZGVjb2Rlci5oCmluZGV4IDJlZTM4ZTQuLjY4NGM2ZDggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvZG9tX3BhcnNlci94bWxfZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvZG9tX3BhcnNlci94bWxfZGVjb2Rlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfRE9NX1BBUlNFUl9YTUxfREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfRE9NX1BBUlNFUl9YTUxfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9kb21fcGFyc2VyL3htbF9kZWNvZGVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIveG1sX2RlY29kZXJfdGVzdC5jYwppbmRleCAyMTg4ODViLi41OWIyZWU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2RvbV9wYXJzZXIveG1sX2RlY29kZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2RvbV9wYXJzZXIveG1sX2RlY29kZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvZG9tX3BhcnNlci94bWxfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2V4cG9ydC5oIGIvc3JjL2NvYmFsdC9leHBvcnQuaAppbmRleCA3YTAzYjc3Li5kOTliNjM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2V4cG9ydC5oCisrKyBiL3NyYy9jb2JhbHQvZXhwb3J0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9FWFBPUlRfSF8KICNkZWZpbmUgQ09CQUxUX0VYUE9SVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjYy5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL0g1dmNjLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGUxNmQxMy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEg1dmNjIHN0YW5kcyBmb3IgIkhUTUw1IFZpZGVvIENvbnRhaW5lciBmb3IgQ29uc29sZXMiLgotLy8KLS8vIFRoZSBINXZjYyBub2RlIGFjdHMgYXMgYSBKYXZhc2NyaXB0IG5hbWVzcGFjZSBjb2xsZWN0aW5nIHZhcmlvdXMgZGlzcGFyYXRlCi0vLyBBUElzIHdoaWNoIGFsbG93IGNsaWVudHMgdG8gY2FsbCBub24tc3RhbmRhcmQgbmF0aXZlIGZ1bmN0aW9ucyB0aGF0IHdlCi0vLyBleHBvc2UuCi0vLwotLy8gRm9yIGV4YW1wbGUgd2UgcHJvdmlkZSBhIGg1dmNjLnN0b3JhZ2UuQ2xlYXJDb29raWVzKCksIHdoaWNoIGNhbiBlbXB0eSB0aGUKLS8vIGNvb2tpZSBqYXIgaW4gcmVzcG9uc2UgdG8gdGhlIHVzZXIncyByZXF1ZXN0LiBPdGhlciBINXZjYyBtb2R1bGVzIGV4cG9zZQotLy8gYXVkaW8gY2FwYWJpbGl0aWVzIGFib3V0IHRoZSBwbGF0Zm9ybSwgb3IgcnVuIGFuIGluLWFwcCBESUFMIHNlcnZlci4KLS8vCi0vLyBUaGUgSDV2Y2Mgbm9kZSBzaG91bGQganVzdCBiZSBhIGNvbGxlY3Rpb24gb2YgcmVhZG9ubHkgc3ViLW5vZGVzLgotLy8gVGhpcyBpcyBjcmVhdGVkIGJ5IHRoZSBCcm93c2VyTW9kdWxlIGFuZCBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFdpbmRvdwotLy8gZHVyaW5nIGNvbnN0cnVjdGlvbi4KLQotaW50ZXJmYWNlIEg1dmNjIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjQWNjb3VudEluZm8gYWNjb3VudEluZm87Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBINXZjY0F1ZGlvQ29uZmlnQXJyYXkgYXVkaW9Db25maWc7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBINXZjY0NWYWwgY1ZhbDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjUnVudGltZSBydW50aW1lOwotICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NTZXR0aW5ncyBzZXR0aW5nczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjU3RvcmFnZSBzdG9yYWdlOwotICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NTeXN0ZW0gc3lzdGVtOwotICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NUcmFjZUV2ZW50IHRyYWNlRXZlbnQ7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjY0FjY291bnRJbmZvLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NBY2NvdW50SW5mby5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQxZWE2YTEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjY0FjY291bnRJbmZvLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBINXZjY0FjY291bnRJbmZvIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBhdmF0YXJVcmw7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdXNlcm5hbWU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdXNlcklkOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NBY2NvdW50TWFuYWdlci5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL0g1dmNjQWNjb3VudE1hbmFnZXIuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMTkyYzc0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NBY2NvdW50TWFuYWdlci5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotWwotICBDb25kaXRpb25hbD1DT0JBTFRfRU5BQkxFX0FDQ09VTlRfTUFOQUdFUiwKLSAgQ29uc3RydWN0b3IKLV0KLWludGVyZmFjZSBINXZjY0FjY291bnRNYW5hZ2VyIHsKLSAgdm9pZCBnZXRBdXRoVG9rZW4oQWNjZXNzVG9rZW5DYWxsYmFjayBjYWxsYmFjayk7Ci0gIHZvaWQgcmVxdWVzdFBhaXJpbmcoQWNjZXNzVG9rZW5DYWxsYmFjayBjYWxsYmFjayk7Ci0gIHZvaWQgcmVxdWVzdFVucGFpcmluZyhBY2Nlc3NUb2tlbkNhbGxiYWNrIGNhbGxiYWNrKTsKLX07Ci0KLWNhbGxiYWNrIEFjY2Vzc1Rva2VuQ2FsbGJhY2sgPSBib29sZWFuKERPTVN0cmluZyB0b2tlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBleHBpcmF0aW9uKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NBdWRpb0NvbmZpZy5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL0g1dmNjQXVkaW9Db25maWcuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNmNkNTM0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NBdWRpb0NvbmZpZy5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgSDV2Y2NBdWRpb0NvbmZpZyB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgY29ubmVjdG9yOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsYXRlbmN5TXM7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgY29kaW5nVHlwZTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZDaGFubmVsczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgc2FtcGxpbmdGcmVxdWVuY3k7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjY0F1ZGlvQ29uZmlnQXJyYXkuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9INXZjY0F1ZGlvQ29uZmlnQXJyYXkuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZGQ1Y2M5Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NBdWRpb0NvbmZpZ0FycmF5LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBINXZjY0F1ZGlvQ29uZmlnQXJyYXkgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGdldHRlciBINXZjY0F1ZGlvQ29uZmlnPyBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NDVmFsLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NDVmFsLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWFjMWRlNC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjQ1ZhbC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1pbnRlcmZhY2UgSDV2Y2NDVmFsIHsKLSAgW05ld09iamVjdF0gSDV2Y2NDVmFsS2V5TGlzdCBrZXlzKCk7Ci0gIERPTVN0cmluZz8gZ2V0VmFsdWUoRE9NU3RyaW5nIG5hbWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NDVmFsS2V5TGlzdC5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL0g1dmNjQ1ZhbEtleUxpc3QuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZGRlZjMwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NDVmFsS2V5TGlzdC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1bQXJyYXlDbGFzc10KLWludGVyZmFjZSBINXZjY0NWYWxLZXlMaXN0IHsKLSAgZ2V0dGVyIERPTVN0cmluZz8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NEZWVwTGlua0V2ZW50VGFyZ2V0LmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NEZWVwTGlua0V2ZW50VGFyZ2V0LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY4MjNhOS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjRGVlcExpbmtFdmVudFRhcmdldC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBDdXN0b20gaW50ZXJmYWNlIHRvIGRpc3BhdGNoIGRlZXAgbGluayBldmVudHMuCi0vLyBNb2RlbGVkIGFmdGVyIENocm9tZSdzIHJ1bnRpbWUgb25NZXNzYWdlIHRhcmdldCAoYW5kIHNpbWlsYXIpOgotLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9hcHBzL3J1bnRpbWUjZXZlbnQtb25NZXNzYWdlCi0KLWludGVyZmFjZSBINXZjY0RlZXBMaW5rRXZlbnRUYXJnZXQgewotICB2b2lkIGFkZExpc3RlbmVyKEg1dmNjRGVlcExpbmtFdmVudENhbGxiYWNrIGNhbGxiYWNrKTsKLX07Ci0KLWNhbGxiYWNrIEg1dmNjRGVlcExpbmtFdmVudENhbGxiYWNrID0gdm9pZChET01TdHJpbmcgbGluayk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjUnVudGltZS5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL0g1dmNjUnVudGltZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAyZWQ4YWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjY1J1bnRpbWUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIEg1dmNjUnVudGltZSB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgaW5pdGlhbERlZXBMaW5rOwotICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NEZWVwTGlua0V2ZW50VGFyZ2V0IG9uRGVlcExpbms7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBINXZjY1J1bnRpbWVFdmVudFRhcmdldCBvblBhdXNlOwotICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NSdW50aW1lRXZlbnRUYXJnZXQgb25SZXN1bWU7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjY1J1bnRpbWVFdmVudFRhcmdldC5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL0g1dmNjUnVudGltZUV2ZW50VGFyZ2V0LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzY1NGFiYy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjUnVudGltZUV2ZW50VGFyZ2V0LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI1ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIEN1c3RvbSBpbnRlcmZhY2UgdG8gZGlzcGF0Y2ggZXZlbnRzIGZyb20gaDV2Y2MucnVudGltZS4KLS8vIE1vZGVsZWQgYWZ0ZXIgQ2hyb21lJ3MgcnVudGltZSBvblN1c3BlbmQgdGFyZ2V0IChhbmQgc2ltaWxhcik6Ci0vLyBodHRwczovL2RldmVsb3Blci5jaHJvbWUuY29tL2FwcHMvcnVudGltZSNldmVudC1vblN1c3BlbmQKLQotaW50ZXJmYWNlIEg1dmNjUnVudGltZUV2ZW50VGFyZ2V0IHsKLSAgdm9pZCBhZGRMaXN0ZW5lcihINXZjY1J1bnRpbWVFdmVudENhbGxiYWNrIGNhbGxiYWNrKTsKLX07Ci0KLWNhbGxiYWNrIEg1dmNjUnVudGltZUV2ZW50Q2FsbGJhY2sgPSB2b2lkKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjU2V0dGluZ3MuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9INXZjY1NldHRpbmdzLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0OTIzZC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjU2V0dGluZ3MuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIEg1dmNjU2V0dGluZ3MgewotICBib29sZWFuIHNldChET01TdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjY1N0b3JhZ2UuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9INXZjY1N0b3JhZ2UuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0MzI5MmU0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NTdG9yYWdlLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIzICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBINXZjY1N0b3JhZ2UgewotICB2b2lkIGNsZWFyQ29va2llcygpOwotICAvLyBXZSBkb24ndCBzdXBwb3J0IHN5bmNocm9ub3VzIGZsdXNoLCB0aGlzIGlzIGxlZ2FjeS4KLSAgdm9pZCBmbHVzaChvcHRpb25hbCBib29sZWFuIHN5bmMgPSBmYWxzZSk7Ci0gIGJvb2xlYW4gZ2V0Q29va2llc0VuYWJsZWQoKTsKLSAgdm9pZCBzZXRDb29raWVzRW5hYmxlZChib29sZWFuIHZhbHVlKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL0g1dmNjU3lzdGVtLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NTeXN0ZW0uaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNWJiZTNiLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NTeXN0ZW0uaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotaW50ZXJmYWNlIEg1dmNjU3lzdGVtIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGJvb2xlYW4gYXJlS2V5c1JldmVyc2VkOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGJ1aWxkSWQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcGxhdGZvcm07Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcmVnaW9uOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHZlcnNpb247Ci0gIGJvb2xlYW4gdHJpZ2dlckhlbHAoKTsKLSAgRE9NU3RyaW5nIGdldFZpZGVvQ29udGFpbmVyU2l6ZU92ZXJyaWRlKCk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9INXZjY1RyYWNlRXZlbnQuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9INXZjY1RyYWNlRXZlbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTY0Nzc4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvSDV2Y2NUcmFjZUV2ZW50LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLWludGVyZmFjZSBINXZjY1RyYWNlRXZlbnQgewotICB2b2lkIHN0YXJ0KCk7Ci0gIHZvaWQgc3RvcCgpOwotCi0gIHZvaWQgdHJhY2VCZWdpbihET01TdHJpbmcgY2F0ZWdvcnksIERPTVN0cmluZyBuYW1lKTsKLSAgdm9pZCB0cmFjZUVuZChET01TdHJpbmcgY2F0ZWdvcnksIERPTVN0cmluZyBuYW1lKTsKLQotICB2b2lkIHRyYWNlSW50QmVnaW4oRE9NU3RyaW5nIGNhdGVnb3J5LCBET01TdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZyBhcmcxX25hbWUsIGxvbmcgYXJnMV92YWx1ZSk7Ci0gIHZvaWQgdHJhY2VJbnRFbmQoRE9NU3RyaW5nIGNhdGVnb3J5LCBET01TdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICBET01TdHJpbmcgYXJnMV9uYW1lLCBsb25nIGFyZzFfdmFsdWUpOwotCi0gIHZvaWQgdHJhY2VGbG9hdEJlZ2luKERPTVN0cmluZyBjYXRlZ29yeSwgRE9NU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZyBhcmcxX25hbWUsIGZsb2F0IGFyZzFfdmFsdWUpOwotICB2b2lkIHRyYWNlRmxvYXRFbmQoRE9NU3RyaW5nIGNhdGVnb3J5LCBET01TdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIERPTVN0cmluZyBhcmcxX25hbWUsIGZsb2F0IGFyZzFfdmFsdWUpOwotCi0gIHZvaWQgdHJhY2VTdHJpbmdCZWdpbihET01TdHJpbmcgY2F0ZWdvcnksIERPTVN0cmluZyBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgRE9NU3RyaW5nIGFyZzFfbmFtZSwgRE9NU3RyaW5nIGFyZzFfdmFsdWUpOwotICB2b2lkIHRyYWNlU3RyaW5nRW5kKERPTVN0cmluZyBjYXRlZ29yeSwgRE9NU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgRE9NU3RyaW5nIGFyZzFfbmFtZSwgRE9NU3RyaW5nIGFyZzFfdmFsdWUpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9EaWFsSHR0cFJlcXVlc3QuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL0RpYWxIdHRwUmVxdWVzdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4M2IwZTguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL0RpYWxIdHRwUmVxdWVzdC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi1bQ29uZGl0aW9uYWw9RElBTF9TRVJWRVJdCi1pbnRlcmZhY2UgRGlhbEh0dHBSZXF1ZXN0IHsKLSAgICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHBhdGg7Ci0gICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBtZXRob2Q7Ci0gICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBib2R5OwotICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgaG9zdDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvRGlhbEh0dHBSZXNwb25zZS5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvRGlhbEh0dHBSZXNwb25zZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NzQ5NDAuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL0RpYWxIdHRwUmVzcG9uc2UuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotW0NvbmRpdGlvbmFsPURJQUxfU0VSVkVSXQotaW50ZXJmYWNlIERpYWxIdHRwUmVzcG9uc2UgewotICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcGF0aDsKLSAgICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1ldGhvZDsKLSAgICBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgcmVzcG9uc2VDb2RlOwotICAgIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9keTsKLSAgICBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1pbWVUeXBlOwotCi0gICAgdm9pZCBhZGRIZWFkZXIoRE9NU3RyaW5nIGhlYWRlciwgRE9NU3RyaW5nIHZhbHVlKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvRGlhbFNlcnZlci5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvRGlhbFNlcnZlci5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQyM2FhY2IuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL0RpYWxTZXJ2ZXIuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzAgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotWwotICBDb25zdHJ1Y3RvcihET01TdHJpbmcgc2VydmljZU5hbWUpLAotICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCi0gIENvbmRpdGlvbmFsPURJQUxfU0VSVkVSLAotXQotaW50ZXJmYWNlIERpYWxTZXJ2ZXIgewotICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgc2VydmljZU5hbWU7Ci0KLSAgICBib29sZWFuIG9uRGVsZXRlKERPTVN0cmluZyBwYXRoLCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFjayBsaXN0ZW5lcik7Ci0gICAgYm9vbGVhbiBvbkdldChET01TdHJpbmcgcGF0aCwgRGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2sgbGlzdGVuZXIpOwotICAgIGJvb2xlYW4gb25Qb3N0KERPTVN0cmluZyBwYXRoLCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFjayBsaXN0ZW5lcik7Ci19OwotCi1jYWxsYmFjayBEaWFsSHR0cFJlcXVlc3RDYWxsYmFjayA9IGJvb2xlYW4oRGlhbEh0dHBSZXF1ZXN0IHJlcSwgRGlhbEh0dHBSZXNwb25zZSByZXNwb25zZSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9odHRwX3JlcXVlc3QuY2MgYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9odHRwX3JlcXVlc3QuY2MKaW5kZXggODNiNGIxNi4uZDY1MWE4NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXF1ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9odHRwX3JlcXVlc3QuaCBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5oCmluZGV4IGNkOGRiMzQuLmIwNjhlODAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfSDVWQ0NfRElBTF9ESUFMX0hUVFBfUkVRVUVTVF9IXwogI2RlZmluZSBDT0JBTFRfSDVWQ0NfRElBTF9ESUFMX0hUVFBfUkVRVUVTVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXF1ZXN0LmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg0MTVjMgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVxdWVzdC5pZGwKQEAgLTAsMCArMSwyMSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworW0NvbmRpdGlvbmFsPURJQUxfU0VSVkVSXQoraW50ZXJmYWNlIERpYWxIdHRwUmVxdWVzdCB7CisgICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBwYXRoOworICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbWV0aG9kOworICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgYm9keTsKKyAgICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGhvc3Q7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXNwb25zZS5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVzcG9uc2UuY2MKaW5kZXggMmM1OWRiMy4uOTBhZWIwYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXNwb25zZS5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9odHRwX3Jlc3BvbnNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXNwb25zZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9odHRwX3Jlc3BvbnNlLmggYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9odHRwX3Jlc3BvbnNlLmgKaW5kZXggM2ZiZDMyMy4uNzgxODQ0MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXNwb25zZS5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVzcG9uc2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0RJQUxfRElBTF9IVFRQX1JFU1BPTlNFX0hfCiAjZGVmaW5lIENPQkFMVF9INVZDQ19ESUFMX0RJQUxfSFRUUF9SRVNQT05TRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXNwb25zZS5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9odHRwX3Jlc3BvbnNlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjE2OTBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfaHR0cF9yZXNwb25zZS5pZGwKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworW0NvbmRpdGlvbmFsPURJQUxfU0VSVkVSXQoraW50ZXJmYWNlIERpYWxIdHRwUmVzcG9uc2UgeworICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcGF0aDsKKyAgICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1ldGhvZDsKKyAgICBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgcmVzcG9uc2VDb2RlOworICAgIGF0dHJpYnV0ZSBET01TdHJpbmcgYm9keTsKKyAgICBhdHRyaWJ1dGUgRE9NU3RyaW5nIG1pbWVUeXBlOworCisgICAgdm9pZCBhZGRIZWFkZXIoRE9NU3RyaW5nIGhlYWRlciwgRE9NU3RyaW5nIHZhbHVlKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuY2MgYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuY2MKaW5kZXggZTg2NDJmZC4uZjViYjY5ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfc2VydmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX3NlcnZlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX3NlcnZlci5oIgogCkBAIC05OCwxOSArOTYsMTkgQEAKIAogYm9vbCBEaWFsU2VydmVyOjpPbkRlbGV0ZSgKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICBjb25zdCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFja1dyYXBwZXI6OlNjcmlwdE9iamVjdCYgaGFuZGxlcikgeworICAgIGNvbnN0IERpYWxIdHRwUmVxdWVzdENhbGxiYWNrV3JhcHBlcjo6U2NyaXB0VmFsdWUmIGhhbmRsZXIpIHsKICAgcmV0dXJuIEFkZEhhbmRsZXIoa0RlbGV0ZSwgcGF0aCwgaGFuZGxlcik7CiB9CiAKIGJvb2wgRGlhbFNlcnZlcjo6T25HZXQoCiAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgY29uc3QgRGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2tXcmFwcGVyOjpTY3JpcHRPYmplY3QmIGhhbmRsZXIpIHsKKyAgICBjb25zdCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFja1dyYXBwZXI6OlNjcmlwdFZhbHVlJiBoYW5kbGVyKSB7CiAgIHJldHVybiBBZGRIYW5kbGVyKGtHZXQsIHBhdGgsIGhhbmRsZXIpOwogfQogCiBib29sIERpYWxTZXJ2ZXI6Ok9uUG9zdCgKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICBjb25zdCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFja1dyYXBwZXI6OlNjcmlwdE9iamVjdCYgaGFuZGxlcikgeworICAgIGNvbnN0IERpYWxIdHRwUmVxdWVzdENhbGxiYWNrV3JhcHBlcjo6U2NyaXB0VmFsdWUmIGhhbmRsZXIpIHsKICAgcmV0dXJuIEFkZEhhbmRsZXIoa1Bvc3QsIHBhdGgsIGhhbmRsZXIpOwogfQogCkBAIC0xMjAsNyArMTE4LDcgQEAKIAogYm9vbCBEaWFsU2VydmVyOjpBZGRIYW5kbGVyKAogICAgIE1ldGhvZCBtZXRob2QsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwYXRoLAotICAgIGNvbnN0IERpYWxIdHRwUmVxdWVzdENhbGxiYWNrV3JhcHBlcjo6U2NyaXB0T2JqZWN0JiBoYW5kbGVyKSB7CisgICAgY29uc3QgRGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2tXcmFwcGVyOjpTY3JpcHRWYWx1ZSYgaGFuZGxlcikgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIHNjb3BlZF9yZWZwdHI8RGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2tXcmFwcGVyPiBjYWxsYmFjayA9CiAgICAgICBuZXcgRGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2tXcmFwcGVyKHRoaXMsIGhhbmRsZXIpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfc2VydmVyLmggYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuaAppbmRleCAzZTI0MTVlLi44ZjNlNDc3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuaAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9INVZDQ19ESUFMX0RJQUxfU0VSVkVSX0hfCiAjZGVmaW5lIENPQkFMVF9INVZDQ19ESUFMX0RJQUxfU0VSVkVSX0hfCiAKQEAgLTI4LDcgKzI2LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvZGlhbC9kaWFsX2h0dHBfcmVzcG9uc2UuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9lbnZpcm9ubWVudF9zZXR0aW5ncy5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKICNpbmNsdWRlICJuZXQvZGlhbC9kaWFsX3NlcnZpY2UuaCIKIApAQCAtNDEsMTAgKzM5LDEwIEBACiBjbGFzcyBTY3JpcHRDYWxsYmFja1dyYXBwZXIKICAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxTY3JpcHRDYWxsYmFja1dyYXBwZXI8VD4gPiB7CiAgcHVibGljOgotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PFQ+IFNjcmlwdE9iamVjdDsKLSAgU2NyaXB0Q2FsbGJhY2tXcmFwcGVyKHNjcmlwdDo6V3JhcHBhYmxlKiB3cmFwcGFibGUsIGNvbnN0IFNjcmlwdE9iamVjdCYgZnVuYykKKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPFQ+IFNjcmlwdFZhbHVlOworICBTY3JpcHRDYWxsYmFja1dyYXBwZXIoc2NyaXB0OjpXcmFwcGFibGUqIHdyYXBwYWJsZSwgY29uc3QgU2NyaXB0VmFsdWUmIGZ1bmMpCiAgICAgICA6IGNhbGxiYWNrKHdyYXBwYWJsZSwgZnVuYykge30KLSAgdHlwZW5hbWUgU2NyaXB0T2JqZWN0OjpSZWZlcmVuY2UgY2FsbGJhY2s7CisgIHR5cGVuYW1lIFNjcmlwdFZhbHVlOjpSZWZlcmVuY2UgY2FsbGJhY2s7CiB9OwogCiBjbGFzcyBEaWFsU2VydmVyIDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlLApAQCAtNjgsMTEgKzY2LDExIEBACiAKICAgLy8gUmVnaXN0ZXIgYSBKYXZhc2NyaXB0IGNhbGxiYWNrIGZvciB2YXJpb3VzIERJQUwgbWV0aG9kcy4KICAgYm9vbCBPbkRlbGV0ZShjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgICBjb25zdCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFja1dyYXBwZXI6OlNjcmlwdE9iamVjdCYgaGFuZGxlcik7CisgICAgICAgICAgICAgICAgY29uc3QgRGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2tXcmFwcGVyOjpTY3JpcHRWYWx1ZSYgaGFuZGxlcik7CiAgIGJvb2wgT25HZXQoY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICAgICAgICAgY29uc3QgRGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2tXcmFwcGVyOjpTY3JpcHRPYmplY3QmIGhhbmRsZXIpOworICAgICAgICAgICAgIGNvbnN0IERpYWxIdHRwUmVxdWVzdENhbGxiYWNrV3JhcHBlcjo6U2NyaXB0VmFsdWUmIGhhbmRsZXIpOwogICBib29sIE9uUG9zdChjb25zdCBzdGQ6OnN0cmluZyYgcGF0aCwKLSAgICAgICAgICAgICAgY29uc3QgRGlhbEh0dHBSZXF1ZXN0Q2FsbGJhY2tXcmFwcGVyOjpTY3JpcHRPYmplY3QmIGhhbmRsZXIpOworICAgICAgICAgICAgICBjb25zdCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFja1dyYXBwZXI6OlNjcmlwdFZhbHVlJiBoYW5kbGVyKTsKICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNlcnZpY2VfbmFtZSgpIGNvbnN0OwogCiAgIHNjb3BlZF9wdHI8bmV0OjpIdHRwU2VydmVyUmVzcG9uc2VJbmZvPiBSdW5DYWxsYmFjaygKQEAgLTg1LDcgKzgzLDcgQEAKIAogICB+RGlhbFNlcnZlcigpOwogICBib29sIEFkZEhhbmRsZXIoTWV0aG9kIG1ldGhvZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHBhdGgsCi0gICAgICAgICAgICAgICAgICBjb25zdCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFja1dyYXBwZXI6OlNjcmlwdE9iamVjdCYgaGFuZGxlcik7CisgICAgICAgICAgICAgICAgICBjb25zdCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFja1dyYXBwZXI6OlNjcmlwdFZhbHVlJiBoYW5kbGVyKTsKIAogICB0eXBlZGVmIHN0ZDo6bWFwPHN0ZDo6c3RyaW5nLCBzY29wZWRfcmVmcHRyPERpYWxIdHRwUmVxdWVzdENhbGxiYWNrV3JhcHBlcj4gPgogICAgICAgQ2FsbGJhY2tNYXA7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2RpYWwvZGlhbF9zZXJ2ZXIuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfc2VydmVyLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzU2ZTI1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9kaWFsL2RpYWxfc2VydmVyLmlkbApAQCAtMCwwICsxLDI4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitbCisgIENvbnN0cnVjdG9yKERPTVN0cmluZyBzZXJ2aWNlTmFtZSksCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncywKKyAgQ29uZGl0aW9uYWw9RElBTF9TRVJWRVIsCitdCitpbnRlcmZhY2UgRGlhbFNlcnZlciB7CisgICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzZXJ2aWNlTmFtZTsKKworICAgIGJvb2xlYW4gb25EZWxldGUoRE9NU3RyaW5nIHBhdGgsIERpYWxIdHRwUmVxdWVzdENhbGxiYWNrIGxpc3RlbmVyKTsKKyAgICBib29sZWFuIG9uR2V0KERPTVN0cmluZyBwYXRoLCBEaWFsSHR0cFJlcXVlc3RDYWxsYmFjayBsaXN0ZW5lcik7CisgICAgYm9vbGVhbiBvblBvc3QoRE9NU3RyaW5nIHBhdGgsIERpYWxIdHRwUmVxdWVzdENhbGxiYWNrIGxpc3RlbmVyKTsKK307CisKK2NhbGxiYWNrIERpYWxIdHRwUmVxdWVzdENhbGxiYWNrID0gYm9vbGVhbihEaWFsSHR0cFJlcXVlc3QgcmVxLCBEaWFsSHR0cFJlc3BvbnNlIHJlc3BvbnNlKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuY2MgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjLmNjCmluZGV4IGNiNDYzM2UuLjZmMjljMzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuY2MKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjYy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2MuaCIKIApAQCAtMjAsOSArMTgsMTEgQEAKIG5hbWVzcGFjZSBoNXZjYyB7CiAKIEg1dmNjOjpINXZjYyhjb25zdCBTZXR0aW5ncyYgc2V0dGluZ3MpIHsKKyAgYWNjZXNzaWJpbGl0eV8gPSBuZXcgSDV2Y2NBY2Nlc3NpYmlsaXR5KCk7CiAgIGFjY291bnRfaW5mb18gPSBuZXcgSDV2Y2NBY2NvdW50SW5mbyhzZXR0aW5ncy5hY2NvdW50X21hbmFnZXIpOwogICBhdWRpb19jb25maWdfYXJyYXlfID0gbmV3IEg1dmNjQXVkaW9Db25maWdBcnJheSgpOwogICBjX3ZhbF8gPSBuZXcgSDV2Y2NDVmFsKCk7CisgIGNyYXNoX2xvZ18gPSBuZXcgSDV2Y2NDcmFzaExvZygpOwogICBydW50aW1lXyA9CiAgICAgICBuZXcgSDV2Y2NSdW50aW1lKHNldHRpbmdzLmV2ZW50X2Rpc3BhdGNoZXIsIHNldHRpbmdzLmluaXRpYWxfZGVlcF9saW5rKTsKICAgc2V0dGluZ3NfID0gbmV3IEg1dmNjU2V0dGluZ3Moc2V0dGluZ3MubWVkaWFfbW9kdWxlKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuZ3lwIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjYy5neXAKaW5kZXggZDIzYWM3Yy4uNDBkOGRiMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjYy5neXAKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjYy5neXAKQEAgLTI5LDYgKzI5LDggQEAKICAgICAgICAgJ2RpYWwvZGlhbF9zZXJ2ZXIuaCcsCiAgICAgICAgICdoNXZjYy5jYycsCiAgICAgICAgICdoNXZjYy5oJywKKyAgICAgICAgJ2g1dmNjX2FjY2Vzc2liaWxpdHkuY2MnLAorICAgICAgICAnaDV2Y2NfYWNjZXNzaWJpbGl0eS5oJywKICAgICAgICAgJ2g1dmNjX2FjY291bnRfaW5mby5jYycsCiAgICAgICAgICdoNXZjY19hY2NvdW50X2luZm8uaCcsCiAgICAgICAgICdoNXZjY19hdWRpb19jb25maWcuY2MnLApAQCAtNTcsNiArNTksNyBAQAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnVpbGQvY29iYWx0X2J1aWxkX2lkLmd5cDpjb2JhbHRfYnVpbGRfaWQnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L2RvbS9kb20uZ3lwOmRvbScsCiAgICAgICBdLAogICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKICAgICAgICAgIyBGb3IgY29iYWx0X2J1aWxkX2lkLmgKQEAgLTc0LDYgKzc3LDE3IEBACiAgICAgICAgICAgICBdLAogICAgICAgICAgIH0sCiAgICAgICAgIH1dLAorICAgICAgICBbJ2VuYWJsZV9jcmFzaF9sb2cgPT0gMScsIHsKKyAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICdoNXZjY19jcmFzaF9sb2cuY2MnLAorICAgICAgICAgICAgJ2g1dmNjX2NyYXNoX2xvZy5oJywKKyAgICAgICAgICBdLAorICAgICAgICAgICdkaXJlY3RfZGVwZW5kZW50X3NldHRpbmdzJzogeworICAgICAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgICAgICdDT0JBTFRfRU5BQkxFX0NSQVNIX0xPRycsCisgICAgICAgICAgICBdLAorICAgICAgICAgIH0sCisgICAgICAgIH1dLAogICAgICAgXSwKICAgICB9LAogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjLmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjLmgKaW5kZXggNmYwOTIzMC4uNzE5OTZlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjYy5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX0hfCiAjZGVmaW5lIENPQkFMVF9INVZDQ19INVZDQ19IXwpAQCAtMjAsOSArMTgsMTEgQEAKICNpbmNsdWRlIDxzdHJpbmc+CiAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9ldmVudF9kaXNwYXRjaGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2FjY2Vzc2liaWxpdHkuaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9pbmZvLmgiCiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZ19hcnJheS5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbC5oIgorI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5oIgogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19zdG9yYWdlLmgiCkBAIC00OSw2ICs0OSw5IEBACiAgIH07CiAKICAgZXhwbGljaXQgSDV2Y2MoY29uc3QgU2V0dGluZ3MmIGNvbmZpZyk7CisgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SDV2Y2NBY2Nlc3NpYmlsaXR5PiYgYWNjZXNzaWJpbGl0eSgpIGNvbnN0IHsKKyAgICByZXR1cm4gYWNjZXNzaWJpbGl0eV87CisgIH0KICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxINXZjY0FjY291bnRJbmZvPiYgYWNjb3VudF9pbmZvKCkgY29uc3QgewogICAgIHJldHVybiBhY2NvdW50X2luZm9fOwogICB9CkBAIC01Niw2ICs1OSw3IEBACiAgICAgcmV0dXJuIGF1ZGlvX2NvbmZpZ19hcnJheV87CiAgIH0KICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxINXZjY0NWYWw+JiBjX3ZhbCgpIGNvbnN0IHsgcmV0dXJuIGNfdmFsXzsgfQorICBjb25zdCBzY29wZWRfcmVmcHRyPEg1dmNjQ3Jhc2hMb2c+JiBjcmFzaF9sb2coKSBjb25zdCB7IHJldHVybiBjcmFzaF9sb2dfOyB9CiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SDV2Y2NSdW50aW1lPiYgcnVudGltZSgpIGNvbnN0IHsgcmV0dXJuIHJ1bnRpbWVfOyB9CiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SDV2Y2NTZXR0aW5ncz4mIHNldHRpbmdzKCkgY29uc3QgeyByZXR1cm4gc2V0dGluZ3NfOyB9CiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8SDV2Y2NTdG9yYWdlPiYgc3RvcmFnZSgpIGNvbnN0IHsgcmV0dXJuIHN0b3JhZ2VfOyB9CkBAIC02Nyw5ICs3MSwxMSBAQAogICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoSDV2Y2MpOwogCiAgcHJpdmF0ZToKKyAgc2NvcGVkX3JlZnB0cjxINXZjY0FjY2Vzc2liaWxpdHk+IGFjY2Vzc2liaWxpdHlfOwogICBzY29wZWRfcmVmcHRyPEg1dmNjQWNjb3VudEluZm8+IGFjY291bnRfaW5mb187CiAgIHNjb3BlZF9yZWZwdHI8SDV2Y2NBdWRpb0NvbmZpZ0FycmF5PiBhdWRpb19jb25maWdfYXJyYXlfOwogICBzY29wZWRfcmVmcHRyPEg1dmNjQ1ZhbD4gY192YWxfOworICBzY29wZWRfcmVmcHRyPEg1dmNjQ3Jhc2hMb2c+IGNyYXNoX2xvZ187CiAgIHNjb3BlZF9yZWZwdHI8SDV2Y2NSdW50aW1lPiBydW50aW1lXzsKICAgc2NvcGVkX3JlZnB0cjxINXZjY1NldHRpbmdzPiBzZXR0aW5nc187CiAgIHNjb3BlZF9yZWZwdHI8SDV2Y2NTdG9yYWdlPiBzdG9yYWdlXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjYy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODczODM2MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2MuaWRsCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIEg1dmNjIHN0YW5kcyBmb3IgIkhUTUw1IFZpZGVvIENvbnRhaW5lciBmb3IgQ29uc29sZXMiLgorLy8KKy8vIFRoZSBINXZjYyBub2RlIGFjdHMgYXMgYSBKYXZhc2NyaXB0IG5hbWVzcGFjZSBjb2xsZWN0aW5nIHZhcmlvdXMgZGlzcGFyYXRlCisvLyBBUElzIHdoaWNoIGFsbG93IGNsaWVudHMgdG8gY2FsbCBub24tc3RhbmRhcmQgbmF0aXZlIGZ1bmN0aW9ucyB0aGF0IHdlCisvLyBleHBvc2UuCisvLworLy8gRm9yIGV4YW1wbGUgd2UgcHJvdmlkZSBhIGg1dmNjLnN0b3JhZ2UuQ2xlYXJDb29raWVzKCksIHdoaWNoIGNhbiBlbXB0eSB0aGUKKy8vIGNvb2tpZSBqYXIgaW4gcmVzcG9uc2UgdG8gdGhlIHVzZXIncyByZXF1ZXN0LiBPdGhlciBINXZjYyBtb2R1bGVzIGV4cG9zZQorLy8gYXVkaW8gY2FwYWJpbGl0aWVzIGFib3V0IHRoZSBwbGF0Zm9ybSwgb3IgcnVuIGFuIGluLWFwcCBESUFMIHNlcnZlci4KKy8vCisvLyBUaGUgSDV2Y2Mgbm9kZSBzaG91bGQganVzdCBiZSBhIGNvbGxlY3Rpb24gb2YgcmVhZG9ubHkgc3ViLW5vZGVzLgorLy8gVGhpcyBpcyBjcmVhdGVkIGJ5IHRoZSBCcm93c2VyTW9kdWxlIGFuZCBwYXNzZWQgZGlyZWN0bHkgdG8gdGhlIFdpbmRvdworLy8gZHVyaW5nIGNvbnN0cnVjdGlvbi4KKworaW50ZXJmYWNlIEg1dmNjIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjQWNjZXNzaWJpbGl0eSBhY2Nlc3NpYmlsaXR5OworICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NBY2NvdW50SW5mbyBhY2NvdW50SW5mbzsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjQXVkaW9Db25maWdBcnJheSBhdWRpb0NvbmZpZzsKKyAgW0NvbmRpdGlvbmFsPUNPQkFMVF9FTkFCTEVfQ1JBU0hfTE9HXQorICAgICAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjQ3Jhc2hMb2cgY3Jhc2hMb2c7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBINXZjY0NWYWwgY1ZhbDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjUnVudGltZSBydW50aW1lOworICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NTZXR0aW5ncyBzZXR0aW5nczsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEg1dmNjU3RvcmFnZSBzdG9yYWdlOworICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NTeXN0ZW0gc3lzdGVtOworICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NUcmFjZUV2ZW50IHRyYWNlRXZlbnQ7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2Nlc3NpYmlsaXR5LmNjIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2Nlc3NpYmlsaXR5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM3MGEyZTgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY2Vzc2liaWxpdHkuY2MKQEAgLTAsMCArMSw0MyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19hY2Nlc3NpYmlsaXR5LmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvYWNjZXNzaWJpbGl0eS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgaDV2Y2MgeworCitINXZjY0FjY2Vzc2liaWxpdHk6Okg1dmNjQWNjZXNzaWJpbGl0eSgpIDogaGlnaF9jb250cmFzdF90ZXh0XyhmYWxzZSkgeworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorICBTYkFjY2Vzc2liaWxpdHlEaXNwbGF5U2V0dGluZ3Mgc2V0dGluZ3M7CisgIFNiTWVtb3J5U2V0KCZzZXR0aW5ncywgMCwgc2l6ZW9mKHNldHRpbmdzKSk7CisKKyAgaWYgKCFTYkFjY2Vzc2liaWxpdHlHZXREaXNwbGF5U2V0dGluZ3MoJnNldHRpbmdzKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGhpZ2hfY29udHJhc3RfdGV4dF8gPSBzZXR0aW5ncy5pc19oaWdoX2NvbnRyYXN0X3RleHRfZW5hYmxlZDsKKyNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKyAgaGlnaF9jb250cmFzdF90ZXh0XyA9IGZhbHNlOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KK30KKworYm9vbCBINXZjY0FjY2Vzc2liaWxpdHk6OmhpZ2hfY29udHJhc3RfdGV4dCgpIGNvbnN0IHsKKyAgcmV0dXJuIGhpZ2hfY29udHJhc3RfdGV4dF87Cit9CisKK30gIC8vIG5hbWVzcGFjZSBoNXZjYworfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2Nlc3NpYmlsaXR5LmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY2Vzc2liaWxpdHkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGM1OTdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2Nlc3NpYmlsaXR5LmgKQEAgLTAsMCArMSw0OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfSDVWQ0NfSDVWQ0NfQUNDRVNTSUJJTElUWV9IXworI2RlZmluZSBDT0JBTFRfSDVWQ0NfSDVWQ0NfQUNDRVNTSUJJTElUWV9IXworCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgaDV2Y2MgeworCitjbGFzcyBINXZjY0FjY2Vzc2liaWxpdHkgOiBwdWJsaWMgc2NyaXB0OjpXcmFwcGFibGUgeworIHB1YmxpYzoKKyAgLy8gVHlwZSBmb3IgSmF2YVNjcmlwdCBldmVudCBjYWxsYmFjay4KKyAgdHlwZWRlZiBzY3JpcHQ6OkNhbGxiYWNrRnVuY3Rpb248dm9pZCgpPiBINXZjY0FjY2Vzc2liaWxpdHlDYWxsYmFjazsKKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPEg1dmNjQWNjZXNzaWJpbGl0eUNhbGxiYWNrPgorICAgICAgSDV2Y2NBY2Nlc3NpYmlsaXR5Q2FsbGJhY2tIb2xkZXI7CisgIEg1dmNjQWNjZXNzaWJpbGl0eSgpOworICBib29sIGhpZ2hfY29udHJhc3RfdGV4dCgpIGNvbnN0OworICB2b2lkIEFkZEhpZ2hDb250cmFzdFRleHRMaXN0ZW5lcigKKyAgICAgIGNvbnN0IEg1dmNjQWNjZXNzaWJpbGl0eUNhbGxiYWNrSG9sZGVyJiBob2xkZXIpIHsKKyAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGhvbGRlcik7CisgIH0KKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoSDV2Y2NBY2Nlc3NpYmlsaXR5KTsKKworIHByaXZhdGU6CisgIGJvb2wgaGlnaF9jb250cmFzdF90ZXh0XzsKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEg1dmNjQWNjZXNzaWJpbGl0eSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgaDV2Y2MKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfSDVWQ0NfSDVWQ0NfQUNDRVNTSUJJTElUWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2Nlc3NpYmlsaXR5LmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjZXNzaWJpbGl0eS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0OTdkOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjZXNzaWJpbGl0eS5pZGwKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEg1dmNjQWNjZXNzaWJpbGl0eSB7CisgIC8vIFRydWUgaWYgdGhlIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbSdzICJoaWdoIGNvbnRyYXN0IHRleHQiIG9wdGlvbgorICAvLyBoYXMgYmVlbiBlbmFibGVkLgorICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBoaWdoQ29udHJhc3RUZXh0OworICB2b2lkIGFkZEhpZ2hDb250cmFzdFRleHRMaXN0ZW5lcihINXZjY0FjY2Vzc2liaWxpdHlDYWxsYmFjayBjYWxsYmFjayk7Cit9OworCitjYWxsYmFjayBINXZjY0FjY2Vzc2liaWxpdHlDYWxsYmFjayA9IHZvaWQoKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9pbmZvLmNjIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uY2MKaW5kZXggN2FkMWZjNy4uMDQwMTM4MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uY2MKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5oIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uaAppbmRleCBjMjE2Y2RmLi43NTBiZmNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9pbmZvLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9INVZDQ19INVZDQ19BQ0NPVU5UX0lORk9fSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX0FDQ09VTlRfSU5GT19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X2luZm8uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZmE0ZGIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfaW5mby5pZGwKQEAgLTAsMCArMSwxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEg1dmNjQWNjb3VudEluZm8geworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGF2YXRhclVybDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB1c2VybmFtZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB1c2VySWQ7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfbWFuYWdlci5jYwppbmRleCAwZDIzOWZhLi5lMjc5NmNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfbWFuYWdlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9tYW5hZ2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9tYW5hZ2VyLmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2FjY291bnRfbWFuYWdlci5oCmluZGV4IDNjNWM2YTQuLjhkOTA0Y2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9tYW5hZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X21hbmFnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX0FDQ09VTlRfTUFOQUdFUl9IXwogI2RlZmluZSBDT0JBTFRfSDVWQ0NfSDVWQ0NfQUNDT1VOVF9NQU5BR0VSX0hfCkBAIC0yNCw3ICsyMiw3IEBACiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCiAjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2Z1bmN0aW9uLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTM4LDcgKzM2LDcgQEAKICBwdWJsaWM6CiAgIHR5cGVkZWYgc2NyaXB0OjpDYWxsYmFja0Z1bmN0aW9uPGJvb2woY29uc3Qgc3RkOjpzdHJpbmcmLCB1aW50NjRfdCk+CiAgICAgICBBY2Nlc3NUb2tlbkNhbGxiYWNrOwotICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0T2JqZWN0PEFjY2Vzc1Rva2VuQ2FsbGJhY2s+IEFjY2Vzc1Rva2VuQ2FsbGJhY2tIb2xkZXI7CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxBY2Nlc3NUb2tlbkNhbGxiYWNrPiBBY2Nlc3NUb2tlbkNhbGxiYWNrSG9sZGVyOwogCiAgIEg1dmNjQWNjb3VudE1hbmFnZXIoKTsKICAgLy8gSDV2Y2NBY2NvdW50TWFuYWdlciBpbnRlcmZhY2UuCkBAIC00OSw3ICs0Nyw3IEBACiAgIERFRklORV9XUkFQUEFCTEVfVFlQRShINXZjY0FjY291bnRNYW5hZ2VyKTsKIAogIHByaXZhdGU6Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8QWNjZXNzVG9rZW5DYWxsYmFjaz46OlJlZmVyZW5jZQorICB0eXBlZGVmIHNjcmlwdDo6U2NyaXB0VmFsdWU8QWNjZXNzVG9rZW5DYWxsYmFjaz46OlJlZmVyZW5jZQogICAgICAgQWNjZXNzVG9rZW5DYWxsYmFja1JlZmVyZW5jZTsKICAgZW51bSBPcGVyYXRpb25UeXBlIHsKICAgICBrUGFpcmluZywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9tYW5hZ2VyLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYWNjb3VudF9tYW5hZ2VyLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZjNiNGJhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hY2NvdW50X21hbmFnZXIuaWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCitbCisgIENvbmRpdGlvbmFsPUNPQkFMVF9FTkFCTEVfQUNDT1VOVF9NQU5BR0VSLAorICBDb25zdHJ1Y3RvcgorXQoraW50ZXJmYWNlIEg1dmNjQWNjb3VudE1hbmFnZXIgeworICB2b2lkIGdldEF1dGhUb2tlbihBY2Nlc3NUb2tlbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgdm9pZCByZXF1ZXN0UGFpcmluZyhBY2Nlc3NUb2tlbkNhbGxiYWNrIGNhbGxiYWNrKTsKKyAgdm9pZCByZXF1ZXN0VW5wYWlyaW5nKEFjY2Vzc1Rva2VuQ2FsbGJhY2sgY2FsbGJhY2spOworfTsKKworY2FsbGJhY2sgQWNjZXNzVG9rZW5DYWxsYmFjayA9IGJvb2xlYW4oRE9NU3RyaW5nIHRva2VuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGV4cGlyYXRpb24pOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hdWRpb19jb25maWcuY2MgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZy5jYwppbmRleCBmMGQzMTBmLi45MWRiMTZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZy5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnLmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZy5oCmluZGV4IDc5Yjg3YWIuLjNjNWNiYzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnLmgKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hdWRpb19jb25maWcuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX0FVRElPX0NPTkZJR19IXwogI2RlZmluZSBDT0JBTFRfSDVWQ0NfSDVWQ0NfQVVESU9fQ09ORklHX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZy5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZy5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODc2MjFhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitpbnRlcmZhY2UgSDV2Y2NBdWRpb0NvbmZpZyB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgY29ubmVjdG9yOworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsYXRlbmN5TXM7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgY29kaW5nVHlwZTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbnVtYmVyT2ZDaGFubmVsczsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgc2FtcGxpbmdGcmVxdWVuY3k7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hdWRpb19jb25maWdfYXJyYXkuY2MgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZ19hcnJheS5jYwppbmRleCBiNGE3OTA0Li42ZGY5YzY4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZ19hcnJheS5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZ19hcnJheS5jYwpAQCAtMSwzMSArMSwzMiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnX2FycmF5LmgiCiAKKyNpZiAhZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAibWVkaWEvYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXIuaCIKKyNlbmRpZiAgLy8gIWRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBoNXZjYyB7CiAKLXVzaW5nIDo6bWVkaWE6OlNoZWxsQXVkaW9TdHJlYW1lcjsKLQogSDV2Y2NBdWRpb0NvbmZpZ0FycmF5OjpINXZjY0F1ZGlvQ29uZmlnQXJyYXkoKSA6IGF1ZGlvX2NvbmZpZ191cGRhdGVkXyhmYWxzZSkge30KIAogdm9pZCBINXZjY0F1ZGlvQ29uZmlnQXJyYXk6Ok1heWJlUmVmcmVzaEF1ZGlvQ29uZmlncygpIHsKKyNpZiAhZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIHVzaW5nIDo6bWVkaWE6OlNoZWxsQXVkaW9TdHJlYW1lcjsKKwogICBpZiAoYXVkaW9fY29uZmlnX3VwZGF0ZWRfKSB7CiAgICAgcmV0dXJuOwogICB9CkBAIC00NCw2ICs0NSw3IEBACiAgICAgICAgIG91dHB1dF9kZXZpY2VzW2ldLnNhbXBsaW5nX2ZyZXF1ZW5jeSkpOwogICB9CiAgIGF1ZGlvX2NvbmZpZ191cGRhdGVkXyA9IHRydWU7CisjZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGg1dmNjCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZ19hcnJheS5oIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hdWRpb19jb25maWdfYXJyYXkuaAppbmRleCBkZDI0MzIzLi4xNDAyOGI0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZ19hcnJheS5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfYXVkaW9fY29uZmlnX2FycmF5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9INVZDQ19INVZDQ19BVURJT19DT05GSUdfQVJSQVlfSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX0FVRElPX0NPTkZJR19BUlJBWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hdWRpb19jb25maWdfYXJyYXkuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19hdWRpb19jb25maWdfYXJyYXkuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiNzA1ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2F1ZGlvX2NvbmZpZ19hcnJheS5pZGwKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEg1dmNjQXVkaW9Db25maWdBcnJheSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKKyAgZ2V0dGVyIEg1dmNjQXVkaW9Db25maWc/IGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbC5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY192YWwuY2MKaW5kZXggZmQyYmQ5ZS4uMzNmYjQ2ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbC5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsLmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsLmgKaW5kZXggNTk3ZmIzOC4uZWIzODY4NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbC5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY192YWwuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX0NfVkFMX0hfCiAjZGVmaW5lIENPQkFMVF9INVZDQ19INVZDQ19DX1ZBTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbC5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMGU4OWViCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbC5pZGwKQEAgLTAsMCArMSwxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEg1dmNjQ1ZhbCB7CisgIFtOZXdPYmplY3RdIEg1dmNjQ1ZhbEtleUxpc3Qga2V5cygpOworICBET01TdHJpbmc/IGdldFZhbHVlKERPTVN0cmluZyBuYW1lKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsX2tleV9saXN0LmNjIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbF9rZXlfbGlzdC5jYwppbmRleCA4YjBkMGQwLi40MDU4YTZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsX2tleV9saXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY192YWxfa2V5X2xpc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsX2tleV9saXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY192YWxfa2V5X2xpc3QuaCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY192YWxfa2V5X2xpc3QuaAppbmRleCAyM2ExZWU2Li4yNTEwYWQ1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsX2tleV9saXN0LmgKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jX3ZhbF9rZXlfbGlzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfSDVWQ0NfSDVWQ0NfQ19WQUxfS0VZX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX0NfVkFMX0tFWV9MSVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsX2tleV9saXN0LmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY192YWxfa2V5X2xpc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZhMzI1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NfdmFsX2tleV9saXN0LmlkbApAQCAtMCwwICsxLDE5IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitbQXJyYXlDbGFzc10KK2ludGVyZmFjZSBINXZjY0NWYWxLZXlMaXN0IHsKKyAgZ2V0dGVyIERPTVN0cmluZz8gaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY3Jhc2hfbG9nLmNjIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc5NjgzMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfY3Jhc2hfbG9nLmNjCkBAIC0wLDAgKzEsMTA0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2NyYXNoX2xvZy5oIgorCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvYXRvbWljb3BzLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2luZ2xldG9uLmgiCisjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgorCisvLyBVbmZvcnR1bmF0ZWx5LCB0aGUgU3RhcmJvYXJkIGludGVyZmFjZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIHN1cHBvcnRlZAorLy8gb25seSBvbiB0aGUgUFM0IGZvciBub3cuCisjaW5jbHVkZSAic3RhcmJvYXJkL3BzNC9jb3JlX2R1bXBfaGFuZGxlci5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3N5c3RlbS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBoNXZjYyB7CisKKy8vIFdlIGtlZXAgYSBnbG9iYWwgbWFwcGluZyBvZiBhbGwgcmVnaXN0ZXJlZCBsb2dzLiAgV2hlbiBhIGNyYXNoIG9jY3Vycywgd2UKKy8vIHdpbGwgaXRlcmF0ZSB0aHJvdWdoIHRoZSBtYXBwaW5nIGluIHRoaXMgZGljdGlvbmFyeSB0byBleHRyYWN0IGFsbAorLy8gbG9nZ2VkIGVudHJpZXMgYW5kIHdyaXRlIHRoZW0gdG8gdGhlIHN5c3RlbSdzIGNyYXNoIGxvZ2dlciB2aWEgU3RhcmJvYXJkLgorY2xhc3MgQ3Jhc2hMb2dEaWN0aW9uYXJ5IHsKKyBwdWJsaWM6CisgIHN0YXRpYyBDcmFzaExvZ0RpY3Rpb25hcnkqIEdldEluc3RhbmNlKCkgeworICAgIHJldHVybiBTaW5nbGV0b248Q3Jhc2hMb2dEaWN0aW9uYXJ5LAorICAgICAgICAgICAgICAgICAgICAgTGVha3lTaW5nbGV0b25UcmFpdHM8Q3Jhc2hMb2dEaWN0aW9uYXJ5PiA+OjpnZXQoKTsKKyAgfQorCisgIHZvaWQgU2V0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAgIGJhc2U6OkF1dG9Mb2NrIGxvY2sobXV0ZXhfKTsKKyAgICAvLyBXaGlsZSB0aGUgbG9jayBwcmV2ZW50cyBjb250ZW50aW9uIGJldHdlZW4gb3RoZXIgY2FsbHMgdG8gU2V0U3RyaW5nKCksCisgICAgLy8gdGhlIGF0b21pY3MgZ3VhcmQgYWdhaW5zdCBPbkNyYXNoKCksIHdoaWNoIGRvZXNuJ3QgYWNxdWlyZSB8bXV0ZXhffCwgZnJvbQorICAgIC8vIGFjY2Vzc2luZyB0aGUgZGF0YSBhdCB0aGUgc2FtZSB0aW1lLiAgSW4gdGhlIGNhc2UgdGhhdCBPbkNyYXNoKCkgaXMKKyAgICAvLyBiZWluZyBjYWxsZWQsIHdlIGdpdmUgdXAgYW5kIHNraXAgYWRkaW5nIHRoZSBkYXRhLgorICAgIGlmIChiYXNlOjpzdWJ0bGU6OkFjcXVpcmVfQ29tcGFyZUFuZFN3YXAoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDAsIDEpID09IDApIHsKKyAgICAgIHN0cmluZ19sb2dfbWFwX1trZXldID0gdmFsdWU7CisgICAgICBiYXNlOjpzdWJ0bGU6OlJlbGVhc2VfU3RvcmUoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDApOworICAgIH0KKyAgfQorCisgcHJpdmF0ZToKKyAgQ3Jhc2hMb2dEaWN0aW9uYXJ5KCkgOiBhY2Nlc3NpbmdfbG9nX2RhdGFfKDApIHsKKyAgICBTYkNvcmVEdW1wUmVnaXN0ZXJIYW5kbGVyKCZDb3JlRHVtcEhhbmRsZXIsIHRoaXMpOworICB9CisKKyAgc3RhdGljIHZvaWQgQ29yZUR1bXBIYW5kbGVyKHZvaWQqIGNvbnRleHQpIHsKKyAgICBDcmFzaExvZ0RpY3Rpb25hcnkqIGNyYXNoX2xvZ19kaWN0aW9uYXJ5ID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8Q3Jhc2hMb2dEaWN0aW9uYXJ5Kj4oY29udGV4dCk7CisgICAgY3Jhc2hfbG9nX2RpY3Rpb25hcnktPk9uQ3Jhc2goKTsKKyAgfQorCisgIHZvaWQgT25DcmFzaCgpIHsKKyAgICAvLyBDaGVjayB0aGF0IHdlJ3JlIG5vdCBhbHJlYWR5IHVwZGF0aW5nIGxvZyBkYXRhLiAgSWYgd2UgYXJlLCB3ZSBqdXN0CisgICAgLy8gZ2l2ZSB1cCBhbmQgc2tpcCByZWNvcmRpbmcgYW55IGNyYXNoIGRhdGEsIGJ1dCBob3BlZnVsbHkgdGhpcyBpcyByYXJlLgorICAgIGlmIChiYXNlOjpzdWJ0bGU6OkFjcXVpcmVfQ29tcGFyZUFuZFN3YXAoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDAsIDEpID09IDApIHsKKyAgICAgIGZvciAoU3RyaW5nTWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0gc3RyaW5nX2xvZ19tYXBfLmJlZ2luKCk7CisgICAgICAgICAgIGl0ZXIgIT0gc3RyaW5nX2xvZ19tYXBfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgICAgU2JDb3JlRHVtcExvZ1N0cmluZyhpdGVyLT5maXJzdC5jX3N0cigpLCBpdGVyLT5zZWNvbmQuY19zdHIoKSk7CisgICAgICB9CisgICAgICBiYXNlOjpzdWJ0bGU6OlJlbGVhc2VfU3RvcmUoJmFjY2Vzc2luZ19sb2dfZGF0YV8sIDApOworICAgIH0KKyAgfQorCisgIGZyaWVuZCBzdHJ1Y3QgRGVmYXVsdFNpbmdsZXRvblRyYWl0czxDcmFzaExvZ0RpY3Rpb25hcnk+OworCisgIGJhc2U6OnN1YnRsZTo6QXRvbWljMzIgYWNjZXNzaW5nX2xvZ19kYXRhXzsKKworICAvLyBJdCBpcyBwb3NzaWJsZSBmb3IgbXVsdGlwbGUgdGhyZWFkcyB0byBjYWxsIHRoZSBINVZDQyBpbnRlcmZhY2UgYXQgdGhlCisgIC8vIHNhbWUgdGltZSwgYW5kIHRoZXkgd2lsbCBhbGwgZm9yd2FyZCB0byB0aGlzIGdsb2JhbCBzaW5nbGV0b24sIHNvIHdlCisgIC8vIHVzZSB0aGlzIG11dGV4IHRvIHByb3RlY3QgYWdhaW5zdCBjb25jdXJyZW50IGFjY2Vzcy4KKyAgYmFzZTo6TG9jayBtdXRleF87CisKKyAgdHlwZWRlZiBzdGQ6Om1hcDxzdGQ6OnN0cmluZywgc3RkOjpzdHJpbmc+IFN0cmluZ01hcDsKKyAgLy8gS2VlcHMgdHJhY2sgb2YgYWxsIHN0cmluZyB2YWx1ZXMgdG8gYmUgbG9nZ2VkIHdoZW4gYSBjcmFzaCBvY2N1cnMuCisgIFN0cmluZ01hcCBzdHJpbmdfbG9nX21hcF87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENyYXNoTG9nRGljdGlvbmFyeSk7Cit9OworCitib29sIEg1dmNjQ3Jhc2hMb2c6OlNldFN0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIC8vIEZvcndhcmQgdGhlIGNhbGwgdG8gYSBnbG9iYWwgc2luZ2xldG9uIHNvIHRoYXQgd2Uga2VlcCBhIGNvbnNpc3RlbnQgY3Jhc2gKKyAgLy8gbG9nIGdsb2JhbGx5LgorICBDcmFzaExvZ0RpY3Rpb25hcnk6OkdldEluc3RhbmNlKCktPlNldFN0cmluZyhrZXksIHZhbHVlKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGg1dmNjCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NyYXNoX2xvZy5oIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NTBhZmExCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaApAQCAtMCwwICsxLDQwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9INVZDQ19INVZDQ19DUkFTSF9MT0dfSF8KKyNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX0NSQVNIX0xPR19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgaDV2Y2MgeworCitjbGFzcyBINXZjY0NyYXNoTG9nIDogcHVibGljIHNjcmlwdDo6V3JhcHBhYmxlIHsKKyBwdWJsaWM6CisgIEg1dmNjQ3Jhc2hMb2coKSB7fQorCisgIGJvb2wgU2V0U3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXksIGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisKKyAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKEg1dmNjQ3Jhc2hMb2cpOworCisgcHJpdmF0ZToKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEg1dmNjQ3Jhc2hMb2cpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGg1dmNjCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX0g1VkNDX0g1VkNDX0NSQVNIX0xPR19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19jcmFzaF9sb2cuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE1ZjRmMWUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2NyYXNoX2xvZy5pZGwKQEAgLTAsMCArMSwyOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gRGVmaW5lcyBhbiBpbnRlcmZhY2UgZm9yIHNldHRpbmcgYXJiaXRyYXJ5IHZhbHVlcyB0byBiZSBsb2dnZWQgKGluIGEKKy8vIHBsYXRmb3JtLXNwZWNpZmljIHdheSkgd2hlbmV2ZXIgYSBjcmFzaCBvY2N1cnMuICBGb3IgZXhhbXBsZSwgYSBwbGF0Zm9ybQorLy8gbWF5IGltcGxlbWVudCB0aGlzIGJ5IHVwbG9hZGluZyB0aGUgZGF0YSB0byBhIGNlbnRyYWwgY3Jhc2ggcmVwb3J0CisvLyByZXBvc2l0b3J5IHRoYXQgY2FuIGJlIGV4YW1pbmVkIGxhdGVyLgorLy8gUGxhdGZvcm1zIHR5cGljYWxseSBoYXZlIG1heGltdW0gY3Jhc2ggbG9nIGRhdGEgc2l6ZXMgb24gdGhlIG9yZGVyIG9mIDE2S0IsCisvLyBidXQgaXQgdmFyaWVzIHBlciBwbGF0Zm9ybS4KK1sKKyAgQ29uZGl0aW9uYWw9Q09CQUxUX0VOQUJMRV9DUkFTSF9MT0cKK10KK2ludGVyZmFjZSBINXZjY0NyYXNoTG9nIHsKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJpbmcgd2FzIHN1Y2Nlc3NmdWxseSBzZXQgaW4gdGhlIGNyYXNoIGxvZywgYW5kIGZhbHNlCisgIC8vIGlmIGZvciBzb21lIHJlYXNvbiB0aGUgc3RyaW5nIGNvdWxkIG5vdCBiZSBzZXQgaW4gdGhlIGNyYXNoIGxvZy4KKyAgLy8gU2V0cyBhIChrZXksIHZhbHVlKSBzdHJpbmcgcGFpciB0aGF0IHNob3VsZCBiZSBsb2dnZWQgaWYgYSBjcmFzaCBvY2N1cnMuCisgIGJvb2xlYW4gc2V0U3RyaW5nKERPTVN0cmluZyBrZXksIERPTVN0cmluZyB2YWx1ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19kZWVwX2xpbmtfZXZlbnRfdGFyZ2V0LmNjIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19kZWVwX2xpbmtfZXZlbnRfdGFyZ2V0LmNjCmluZGV4IDY5NzY4OGQuLjAyYjg0MTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfZGVlcF9saW5rX2V2ZW50X3RhcmdldC5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19kZWVwX2xpbmtfZXZlbnRfdGFyZ2V0LmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuaAppbmRleCA0YTZiNzA2Li5jN2NkNzcyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuaAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX0RFRVBfTElOS19FVkVOVF9UQVJHRVRfSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX0RFRVBfTElOS19FVkVOVF9UQVJHRVRfSF8KQEAgLTI2LDcgKzI0LDcgQEAKICNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX2V2ZW50X2xpc3RlbmVyX2NvbnRhaW5lci5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtNDEsNyArMzksNyBAQAogICAvLyBUeXBlIGZvciBKYXZhU2NyaXB0IGV2ZW50IGNhbGxiYWNrLgogICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJik+CiAgICAgICBINXZjY0RlZXBMaW5rRXZlbnRDYWxsYmFjazsKLSAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdE9iamVjdDxINXZjY0RlZXBMaW5rRXZlbnRDYWxsYmFjaz4KKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPEg1dmNjRGVlcExpbmtFdmVudENhbGxiYWNrPgogICAgICAgSDV2Y2NEZWVwTGlua0V2ZW50Q2FsbGJhY2tIb2xkZXI7CiAKICAgSDV2Y2NEZWVwTGlua0V2ZW50VGFyZ2V0KCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2RlZXBfbGlua19ldmVudF90YXJnZXQuaWRsIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19kZWVwX2xpbmtfZXZlbnRfdGFyZ2V0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZGNlNDM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19kZWVwX2xpbmtfZXZlbnRfdGFyZ2V0LmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBDdXN0b20gaW50ZXJmYWNlIHRvIGRpc3BhdGNoIGRlZXAgbGluayBldmVudHMuCisvLyBNb2RlbGVkIGFmdGVyIENocm9tZSdzIHJ1bnRpbWUgb25NZXNzYWdlIHRhcmdldCAoYW5kIHNpbWlsYXIpOgorLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9hcHBzL3J1bnRpbWUjZXZlbnQtb25NZXNzYWdlCisKK2ludGVyZmFjZSBINXZjY0RlZXBMaW5rRXZlbnRUYXJnZXQgeworICB2b2lkIGFkZExpc3RlbmVyKEg1dmNjRGVlcExpbmtFdmVudENhbGxiYWNrIGNhbGxiYWNrKTsKK307CisKK2NhbGxiYWNrIEg1dmNjRGVlcExpbmtFdmVudENhbGxiYWNrID0gdm9pZChET01TdHJpbmcgbGluayk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2V2ZW50X2xpc3RlbmVyX2NvbnRhaW5lci5oIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19ldmVudF9saXN0ZW5lcl9jb250YWluZXIuaAppbmRleCA2ZjkxMTQzLi4yN2U1ZjU3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX2V2ZW50X2xpc3RlbmVyX2NvbnRhaW5lci5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfZXZlbnRfbGlzdGVuZXJfY29udGFpbmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9INVZDQ19INVZDQ19FVkVOVF9MSVNURU5FUl9DT05UQUlORVJfSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX0VWRU5UX0xJU1RFTkVSX0NPTlRBSU5FUl9IXwpAQCAtMjUsNyArMjMsNyBAQAogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wX3Byb3h5LmgiCiAjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMzgsNyArMzYsNyBAQAogdGVtcGxhdGUgPGNsYXNzIENhbGxiYWNrQXJnVHlwZSwgY2xhc3MgQ2FsbGJhY2tUeXBlPgogY2xhc3MgSDV2Y2NFdmVudExpc3RlbmVyQ29udGFpbmVyIHsKICBwdWJsaWM6Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8Q2FsbGJhY2tUeXBlPiBDYWxsYmFja0hvbGRlclR5cGU7CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxDYWxsYmFja1R5cGU+IENhbGxiYWNrSG9sZGVyVHlwZTsKIAogICAvLyBUeXBlIGZvciBhIGNhbGxiYWNrIHRoYXQgcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIGFyZ3VtZW50IHRvIGJlIHBhc3NlZAogICAvLyB0byB0aGUgY2FsbGJhY2sgZm9yIGVhY2ggbGlzdGVuZXIuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWUuY2MgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWUuY2MKaW5kZXggNDNkNzFjYy4uZmViMjM2YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19ydW50aW1lLmNjCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWUuaCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5oCmluZGV4IGU1MWU4N2IuLjc0YmMwZjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfSDVWQ0NfSDVWQ0NfUlVOVElNRV9IXwogI2RlZmluZSBDT0JBTFRfSDVWQ0NfSDVWQ0NfUlVOVElNRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19ydW50aW1lLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTRiNzMxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZS5pZGwKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEg1dmNjUnVudGltZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgaW5pdGlhbERlZXBMaW5rOworICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NEZWVwTGlua0V2ZW50VGFyZ2V0IG9uRGVlcExpbms7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBINXZjY1J1bnRpbWVFdmVudFRhcmdldCBvblBhdXNlOworICByZWFkb25seSBhdHRyaWJ1dGUgSDV2Y2NSdW50aW1lRXZlbnRUYXJnZXQgb25SZXN1bWU7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19ydW50aW1lX2V2ZW50X3RhcmdldC5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZV9ldmVudF90YXJnZXQuY2MKaW5kZXggNDE3NDIwMS4uOGIyNDVhNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19ydW50aW1lX2V2ZW50X3RhcmdldC5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWVfZXZlbnRfdGFyZ2V0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19ydW50aW1lX2V2ZW50X3RhcmdldC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWVfZXZlbnRfdGFyZ2V0LmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWVfZXZlbnRfdGFyZ2V0LmgKaW5kZXggZmMyYjQ5MS4uMGY3MGJiMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19ydW50aW1lX2V2ZW50X3RhcmdldC5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZV9ldmVudF90YXJnZXQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX1JVTlRJTUVfRVZFTlRfVEFSR0VUX0hfCiAjZGVmaW5lIENPQkFMVF9INVZDQ19INVZDQ19SVU5USU1FX0VWRU5UX1RBUkdFVF9IXwpAQCAtMjQsNyArMjIsNyBAQAogI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKICNpbmNsdWRlICJjb2JhbHQvaDV2Y2MvaDV2Y2NfZXZlbnRfbGlzdGVuZXJfY29udGFpbmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC0zOCw3ICszNiw3IEBACiAgcHVibGljOgogICAvLyBUeXBlIGZvciBKYXZhU2NyaXB0IGV2ZW50IGNhbGxiYWNrLgogICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKCk+IEg1dmNjUnVudGltZUV2ZW50Q2FsbGJhY2s7Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8SDV2Y2NSdW50aW1lRXZlbnRDYWxsYmFjaz4KKyAgdHlwZWRlZiBzY3JpcHQ6OlNjcmlwdFZhbHVlPEg1dmNjUnVudGltZUV2ZW50Q2FsbGJhY2s+CiAgICAgICBINXZjY1J1bnRpbWVFdmVudENhbGxiYWNrSG9sZGVyOwogCiAgIEg1dmNjUnVudGltZUV2ZW50VGFyZ2V0KCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWVfZXZlbnRfdGFyZ2V0LmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfcnVudGltZV9ldmVudF90YXJnZXQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyNWY3YTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3J1bnRpbWVfZXZlbnRfdGFyZ2V0LmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBDdXN0b20gaW50ZXJmYWNlIHRvIGRpc3BhdGNoIGV2ZW50cyBmcm9tIGg1dmNjLnJ1bnRpbWUuCisvLyBNb2RlbGVkIGFmdGVyIENocm9tZSdzIHJ1bnRpbWUgb25TdXNwZW5kIHRhcmdldCAoYW5kIHNpbWlsYXIpOgorLy8gaHR0cHM6Ly9kZXZlbG9wZXIuY2hyb21lLmNvbS9hcHBzL3J1bnRpbWUjZXZlbnQtb25TdXNwZW5kCisKK2ludGVyZmFjZSBINXZjY1J1bnRpbWVFdmVudFRhcmdldCB7CisgIHZvaWQgYWRkTGlzdGVuZXIoSDV2Y2NSdW50aW1lRXZlbnRDYWxsYmFjayBjYWxsYmFjayk7Cit9OworCitjYWxsYmFjayBINXZjY1J1bnRpbWVFdmVudENhbGxiYWNrID0gdm9pZCgpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc2V0dGluZ3MuY2MKaW5kZXggNzc4MGUyMS4uYTRjYzUxNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3NldHRpbmdzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3NldHRpbmdzLmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3NldHRpbmdzLmgKaW5kZXggYzEzZjUyNy4uYjFkZTJiYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc2V0dGluZ3MuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX1NFVFRJTkdTX0hfCiAjZGVmaW5lIENPQkFMVF9INVZDQ19INVZDQ19TRVRUSU5HU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3NldHRpbmdzLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NGY1N2Q2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zZXR0aW5ncy5pZGwKQEAgLTAsMCArMSwxNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEg1dmNjU2V0dGluZ3MgeworICBib29sZWFuIHNldChET01TdHJpbmcgbmFtZSwgbG9uZyB2YWx1ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zdG9yYWdlLmNjIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zdG9yYWdlLmNjCmluZGV4IDdiMmMxMmEuLjYyZmIwMWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3RvcmFnZS5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zdG9yYWdlLmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuaAppbmRleCAwNGU2N2JjLi4zYTIwYzE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuaAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX1NUT1JBR0VfSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX1NUT1JBR0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3RvcmFnZS5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlNTY1ZWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N0b3JhZ2UuaWRsCkBAIC0wLDAgKzEsMjEgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludGVyZmFjZSBINXZjY1N0b3JhZ2UgeworICB2b2lkIGNsZWFyQ29va2llcygpOworICAvLyBXZSBkb24ndCBzdXBwb3J0IHN5bmNocm9ub3VzIGZsdXNoLCB0aGlzIGlzIGxlZ2FjeS4KKyAgdm9pZCBmbHVzaChvcHRpb25hbCBib29sZWFuIHN5bmMgPSBmYWxzZSk7CisgIGJvb2xlYW4gZ2V0Q29va2llc0VuYWJsZWQoKTsKKyAgdm9pZCBzZXRDb29raWVzRW5hYmxlZChib29sZWFuIHZhbHVlKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N5c3RlbS5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmNjCmluZGV4IDA5NWI2MjYuLjYwZTM5NmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmNjCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY19zeXN0ZW0uaCIKIApAQCAtNjYsMTIgKzY0LDUgQEAKIC8vIHJldHVybiBmYWxzZSB0byBpbmRpY2F0ZSB0aGUgY2xpZW50IHNob3VsZCBsYXVuY2ggdGhlaXIgb3duIGRpYWxvZy4KIGJvb2wgSDV2Y2NTeXN0ZW06OlRyaWdnZXJIZWxwKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KIAotLy8gUmV0dXJucyBhIHN0cmluZyBpbiB0aGUgZm9ybSBvZiAiMTkyMHgxMDgwIiB0byBpbmZvcm0gdGhlIHBsYXllciB0byB1c2UgdGhlCi0vLyByZXR1cm5lZCByZXNvbHV0aW9uIGluc3RlYWQgb2YgdGhlIHdpbmRvdyBzaXplIGFzIHRoZSBtYXhpbXVtIHJlc29sdXRpb24gb2YKLS8vIHZpZGVvIGJlaW5nIHBsYXllZC4KLXN0ZDo6c3RyaW5nIEg1dmNjU3lzdGVtOjpHZXRWaWRlb0NvbnRhaW5lclNpemVPdmVycmlkZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHZpZGVvX2NvbnRhaW5lcl9zaXplXzsKLX0KLQogfSAgLy8gbmFtZXNwYWNlIGg1dmNjCiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N5c3RlbS5oIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zeXN0ZW0uaAppbmRleCAyNjJkM2NjLi5lMTkyNTgxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3N5c3RlbS5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9INVZDQ19INVZDQ19TWVNURU1fSF8KICNkZWZpbmUgQ09CQUxUX0g1VkNDX0g1VkNDX1NZU1RFTV9IXwpAQCAtMzYsNyArMzQsNiBAQAogICBzdGQ6OnN0cmluZyB2ZXJzaW9uKCkgY29uc3Q7CiAKICAgYm9vbCBUcmlnZ2VySGVscCgpIGNvbnN0OwotICBzdGQ6OnN0cmluZyBHZXRWaWRlb0NvbnRhaW5lclNpemVPdmVycmlkZSgpIGNvbnN0OwogCiAgIERFRklORV9XUkFQUEFCTEVfVFlQRShINXZjY1N5c3RlbSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmlkbCBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2Nfc3lzdGVtLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMTYxMmU0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY19zeXN0ZW0uaWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK2ludGVyZmFjZSBINXZjY1N5c3RlbSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIGFyZUtleXNSZXZlcnNlZDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBidWlsZElkOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHBsYXRmb3JtOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlZ2lvbjsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB2ZXJzaW9uOworICBib29sZWFuIHRyaWdnZXJIZWxwKCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY190cmFjZV9ldmVudC5jYyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfdHJhY2VfZXZlbnQuY2MKaW5kZXggY2E0MzI5My4uMWNiMDMzMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY190cmFjZV9ldmVudC5jYworKysgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3RyYWNlX2V2ZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9oNXZjYy9oNXZjY190cmFjZV9ldmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3RyYWNlX2V2ZW50LmggYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3RyYWNlX2V2ZW50LmgKaW5kZXggZjNlNDVmNi4uOGQ0OTdmZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY190cmFjZV9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvaDV2Y2MvaDV2Y2NfdHJhY2VfZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0g1VkNDX0g1VkNDX1RSQUNFX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9INVZDQ19INVZDQ19UUkFDRV9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY190cmFjZV9ldmVudC5pZGwgYi9zcmMvY29iYWx0L2g1dmNjL2g1dmNjX3RyYWNlX2V2ZW50LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNmI1MDhkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9oNXZjYy9oNXZjY190cmFjZV9ldmVudC5pZGwKQEAgLTAsMCArMSwzNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworaW50ZXJmYWNlIEg1dmNjVHJhY2VFdmVudCB7CisgIHZvaWQgc3RhcnQoKTsKKyAgdm9pZCBzdG9wKCk7CisKKyAgdm9pZCB0cmFjZUJlZ2luKERPTVN0cmluZyBjYXRlZ29yeSwgRE9NU3RyaW5nIG5hbWUpOworICB2b2lkIHRyYWNlRW5kKERPTVN0cmluZyBjYXRlZ29yeSwgRE9NU3RyaW5nIG5hbWUpOworCisgIHZvaWQgdHJhY2VJbnRCZWdpbihET01TdHJpbmcgY2F0ZWdvcnksIERPTVN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgRE9NU3RyaW5nIGFyZzFfbmFtZSwgbG9uZyBhcmcxX3ZhbHVlKTsKKyAgdm9pZCB0cmFjZUludEVuZChET01TdHJpbmcgY2F0ZWdvcnksIERPTVN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgIERPTVN0cmluZyBhcmcxX25hbWUsIGxvbmcgYXJnMV92YWx1ZSk7CisKKyAgdm9pZCB0cmFjZUZsb2F0QmVnaW4oRE9NU3RyaW5nIGNhdGVnb3J5LCBET01TdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgRE9NU3RyaW5nIGFyZzFfbmFtZSwgZmxvYXQgYXJnMV92YWx1ZSk7CisgIHZvaWQgdHJhY2VGbG9hdEVuZChET01TdHJpbmcgY2F0ZWdvcnksIERPTVN0cmluZyBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgRE9NU3RyaW5nIGFyZzFfbmFtZSwgZmxvYXQgYXJnMV92YWx1ZSk7CisKKyAgdm9pZCB0cmFjZVN0cmluZ0JlZ2luKERPTVN0cmluZyBjYXRlZ29yeSwgRE9NU3RyaW5nIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBET01TdHJpbmcgYXJnMV9uYW1lLCBET01TdHJpbmcgYXJnMV92YWx1ZSk7CisgIHZvaWQgdHJhY2VTdHJpbmdFbmQoRE9NU3RyaW5nIGNhdGVnb3J5LCBET01TdHJpbmcgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICBET01TdHJpbmcgYXJnMV9uYW1lLCBET01TdHJpbmcgYXJnMV92YWx1ZSk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlci5oIGIvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlci5oCmluZGV4IDY5M2E1NmYuLjAzM2JmYTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9JTlBVVF9JTlBVVF9ERVZJQ0VfTUFOQUdFUl9IXwogI2RlZmluZSBDT0JBTFRfSU5QVVRfSU5QVVRfREVWSUNFX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5jYyBiL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5jYwppbmRleCA3NzhmMjk5Li44MGI5ODdmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Rlc2t0b3AuY2MKKysrIGIvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5oIGIvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmgKaW5kZXggYWRkNmI4Ny4uMDVhZDVlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmgKKysrIGIvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9kZXNrdG9wLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9JTlBVVF9JTlBVVF9ERVZJQ0VfTUFOQUdFUl9ERVNLVE9QX0hfCiAjZGVmaW5lIENPQkFMVF9JTlBVVF9JTlBVVF9ERVZJQ0VfTUFOQUdFUl9ERVNLVE9QX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Z1enplci5jYyBiL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZnV6emVyLmNjCmluZGV4IGMzMWVmN2QuLjQ1YjU0YzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZnV6emVyLmNjCisrKyBiL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZnV6emVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9mdXp6ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9mdXp6ZXIuaCBiL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZnV6emVyLmgKaW5kZXggMDZhMWRkZi4uODMzODRiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9mdXp6ZXIuaAorKysgYi9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Z1enplci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfSU5QVVRfSU5QVVRfREVWSUNFX01BTkFHRVJfRlVaWkVSX0hfCiAjZGVmaW5lIENPQkFMVF9JTlBVVF9JTlBVVF9ERVZJQ0VfTUFOQUdFUl9GVVpaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfc3RhcmJvYXJkLmNjIGIvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9zdGFyYm9hcmQuY2MKaW5kZXggZjVlYzE2Zi4uOTU1MDhhMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl9zdGFyYm9hcmQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX2Rlc2t0b3AuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9pbnB1dC9pbnB1dF9kZXZpY2VfbWFuYWdlcl93aW4uY2MgYi9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX3dpbi5jYwppbmRleCBmNWVjMTZmLi45NTUwOGEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX3dpbi5jYworKysgYi9zcmMvY29iYWx0L2lucHV0L2lucHV0X2RldmljZV9tYW5hZ2VyX3dpbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaW5wdXQvaW5wdXRfZGV2aWNlX21hbmFnZXJfZGVza3RvcC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2lucHV0L2tleV9ldmVudF9oYW5kbGVyLmNjIGIvc3JjL2NvYmFsdC9pbnB1dC9rZXlfZXZlbnRfaGFuZGxlci5jYwppbmRleCBjN2ZkYTViLi45OWI4MjRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2lucHV0L2tleV9ldmVudF9oYW5kbGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvaW5wdXQva2V5X2V2ZW50X2hhbmRsZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2lucHV0L2tleV9ldmVudF9oYW5kbGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaW5wdXQva2V5X2V2ZW50X2hhbmRsZXIuaCBiL3NyYy9jb2JhbHQvaW5wdXQva2V5X2V2ZW50X2hhbmRsZXIuaAppbmRleCA3YzViNTAxLi5hMjA4MTM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2lucHV0L2tleV9ldmVudF9oYW5kbGVyLmgKKysrIGIvc3JjL2NvYmFsdC9pbnB1dC9rZXlfZXZlbnRfaGFuZGxlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfSU5QVVRfS0VZX0VWRU5UX0hBTkRMRVJfSF8KICNkZWZpbmUgQ09CQUxUX0lOUFVUX0tFWV9FVkVOVF9IQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2lucHV0L2tleV9yZXBlYXRfZmlsdGVyLmNjIGIvc3JjL2NvYmFsdC9pbnB1dC9rZXlfcmVwZWF0X2ZpbHRlci5jYwppbmRleCA5OGVhYWVjLi5jY2MwYjM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2lucHV0L2tleV9yZXBlYXRfZmlsdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvaW5wdXQva2V5X3JlcGVhdF9maWx0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2lucHV0L2tleV9yZXBlYXRfZmlsdGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvaW5wdXQva2V5X3JlcGVhdF9maWx0ZXIuaCBiL3NyYy9jb2JhbHQvaW5wdXQva2V5X3JlcGVhdF9maWx0ZXIuaAppbmRleCBkZmU4ZDU3Li5lMTU2OWI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2lucHV0L2tleV9yZXBlYXRfZmlsdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9pbnB1dC9rZXlfcmVwZWF0X2ZpbHRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfSU5QVVRfS0VZX1JFUEVBVF9GSUxURVJfSF8KICNkZWZpbmUgQ09CQUxUX0lOUFVUX0tFWV9SRVBFQVRfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2lucHV0L2tleXByZXNzX2dlbmVyYXRvcl9maWx0ZXIuY2MgYi9zcmMvY29iYWx0L2lucHV0L2tleXByZXNzX2dlbmVyYXRvcl9maWx0ZXIuY2MKaW5kZXggNWZmYWI5Mi4uZGFiOWE4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9pbnB1dC9rZXlwcmVzc19nZW5lcmF0b3JfZmlsdGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvaW5wdXQva2V5cHJlc3NfZ2VuZXJhdG9yX2ZpbHRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvaW5wdXQva2V5cHJlc3NfZ2VuZXJhdG9yX2ZpbHRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2lucHV0L2tleXByZXNzX2dlbmVyYXRvcl9maWx0ZXIuaCBiL3NyYy9jb2JhbHQvaW5wdXQva2V5cHJlc3NfZ2VuZXJhdG9yX2ZpbHRlci5oCmluZGV4IGFjOWVjNTUuLjllYTI4MGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvaW5wdXQva2V5cHJlc3NfZ2VuZXJhdG9yX2ZpbHRlci5oCisrKyBiL3NyYy9jb2JhbHQvaW5wdXQva2V5cHJlc3NfZ2VuZXJhdG9yX2ZpbHRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfSU5QVVRfS0VZUFJFU1NfR0VORVJBVE9SX0ZJTFRFUl9IXwogI2RlZmluZSBDT0JBTFRfSU5QVVRfS0VZUFJFU1NfR0VORVJBVE9SX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYW5vbnltb3VzX2Jsb2NrX2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2Fub255bW91c19ibG9ja19ib3guY2MKaW5kZXggNGJlOGQ1Zi4uOGFhMDYzNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvYW5vbnltb3VzX2Jsb2NrX2JveC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9hbm9ueW1vdXNfYmxvY2tfYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvYW5vbnltb3VzX2Jsb2NrX2JveC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9hbm9ueW1vdXNfYmxvY2tfYm94LmggYi9zcmMvY29iYWx0L2xheW91dC9hbm9ueW1vdXNfYmxvY2tfYm94LmgKaW5kZXggYmRhNzM2Zi4uZDg2NWZiZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvYW5vbnltb3VzX2Jsb2NrX2JveC5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2Fub255bW91c19ibG9ja19ib3guaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9BTk9OWU1PVVNfQkxPQ0tfQk9YX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfQU5PTllNT1VTX0JMT0NLX0JPWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYmFzZV9kaXJlY3Rpb24uaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jhc2VfZGlyZWN0aW9uLmgKaW5kZXggNjQzZjVmYy4uYTk5NTM4NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvYmFzZV9kaXJlY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9iYXNlX2RpcmVjdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5gCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuYAogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfQkFTRV9ESVJFQ1RJT05fSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9CQVNFX0RJUkVDVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYmVuY2htYXJrX3N0YXRfbmFtZXMuY2MgYi9zcmMvY29iYWx0L2xheW91dC9iZW5jaG1hcmtfc3RhdF9uYW1lcy5jYwppbmRleCAxZGNkM2I4Li41MWUwOWJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9iZW5jaG1hcmtfc3RhdF9uYW1lcy5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9iZW5jaG1hcmtfc3RhdF9uYW1lcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2JlbmNobWFya19zdGF0X25hbWVzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2JlbmNobWFya19zdGF0X25hbWVzLmggYi9zcmMvY29iYWx0L2xheW91dC9iZW5jaG1hcmtfc3RhdF9uYW1lcy5oCmluZGV4IDA5MWNhZTMuLjFmMDA1ZjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2JlbmNobWFya19zdGF0X25hbWVzLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvYmVuY2htYXJrX3N0YXRfbmFtZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9CRU5DSE1BUktfU1RBVF9OQU1FU19IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0JFTkNITUFSS19TVEFUX05BTUVTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19jb250YWluZXJfYm94LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvYmxvY2tfY29udGFpbmVyX2JveC5jYwppbmRleCA3OWFkMDI3Li44MGQxZWRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19jb250YWluZXJfYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2NvbnRhaW5lcl9ib3guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9ibG9ja19jb250YWluZXJfYm94LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2NvbnRhaW5lcl9ib3guaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2NvbnRhaW5lcl9ib3guaAppbmRleCBjZWQyZDk4Li42MGQzODRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19jb250YWluZXJfYm94LmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvYmxvY2tfY29udGFpbmVyX2JveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0JMT0NLX0NPTlRBSU5FUl9CT1hfSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9CTE9DS19DT05UQUlORVJfQk9YX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2Jsb2NrX2NvbnRhaW5lcl9ib3guY2MgYi9zcmMvY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2Jsb2NrX2NvbnRhaW5lcl9ib3guY2MKaW5kZXggMWM4NTUwMi4uNDE2MTk5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvYmxvY2tfZm9ybWF0dGluZ19ibG9ja19jb250YWluZXJfYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2Zvcm1hdHRpbmdfYmxvY2tfY29udGFpbmVyX2JveC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2Jsb2NrX2Zvcm1hdHRpbmdfYmxvY2tfY29udGFpbmVyX2JveC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2Jsb2NrX2NvbnRhaW5lcl9ib3guaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2Zvcm1hdHRpbmdfYmxvY2tfY29udGFpbmVyX2JveC5oCmluZGV4IGE0YTViZDkuLjY4ZTllMTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2Zvcm1hdHRpbmdfYmxvY2tfY29udGFpbmVyX2JveC5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2Zvcm1hdHRpbmdfYmxvY2tfY29udGFpbmVyX2JveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0JMT0NLX0ZPUk1BVFRJTkdfQkxPQ0tfQ09OVEFJTkVSX0JPWF9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0JMT0NLX0ZPUk1BVFRJTkdfQkxPQ0tfQ09OVEFJTkVSX0JPWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYmxvY2tfZm9ybWF0dGluZ19jb250ZXh0LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvYmxvY2tfZm9ybWF0dGluZ19jb250ZXh0LmNjCmluZGV4IDEyMDNjMzQuLmFmZjVlYmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2Zvcm1hdHRpbmdfY29udGV4dC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2NvbnRleHQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2NvbnRleHQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYmxvY2tfZm9ybWF0dGluZ19jb250ZXh0LmggYi9zcmMvY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2NvbnRleHQuaAppbmRleCA3ZmMxNmIxLi40MGQ2NTYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2NvbnRleHQuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9ibG9ja19mb3JtYXR0aW5nX2NvbnRleHQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9CTE9DS19GT1JNQVRUSU5HX0NPTlRFWFRfSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9CTE9DS19GT1JNQVRUSU5HX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2xldmVsX3JlcGxhY2VkX2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2xldmVsX3JlcGxhY2VkX2JveC5jYwppbmRleCAxNDY1OGZhLi5kZDVmMzc0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19sZXZlbF9yZXBsYWNlZF9ib3guY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvYmxvY2tfbGV2ZWxfcmVwbGFjZWRfYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvYmxvY2tfbGV2ZWxfcmVwbGFjZWRfYm94LmgiCiAKQEAgLTMwLDEyICsyOCwxMyBAQAogICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPExheW91dFVuaXQ+JiBtYXliZV9pbnRyaW5zaWNfaGVpZ2h0LAogICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPGZsb2F0PiYgbWF5YmVfaW50cmluc2ljX3JhdGlvLAogICAgIFVzZWRTdHlsZVByb3ZpZGVyKiB1c2VkX3N0eWxlX3Byb3ZpZGVyLAorICAgIGJhc2U6Om9wdGlvbmFsPGJvb2w+IGlzX3ZpZGVvX3B1bmNoZWRfb3V0LAogICAgIExheW91dFN0YXRUcmFja2VyKiBsYXlvdXRfc3RhdF90cmFja2VyKQogICAgIDogUmVwbGFjZWRCb3goY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uLCByZXBsYWNlX2ltYWdlX2NiLAogICAgICAgICAgICAgICAgICAgc2V0X2JvdW5kc19jYiwgcGFyYWdyYXBoLCB0ZXh0X3Bvc2l0aW9uLAogICAgICAgICAgICAgICAgICAgbWF5YmVfaW50cmluc2ljX3dpZHRoLCBtYXliZV9pbnRyaW5zaWNfaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgbWF5YmVfaW50cmluc2ljX3JhdGlvLCB1c2VkX3N0eWxlX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgbGF5b3V0X3N0YXRfdHJhY2tlcikge30KKyAgICAgICAgICAgICAgICAgIGlzX3ZpZGVvX3B1bmNoZWRfb3V0LCBsYXlvdXRfc3RhdF90cmFja2VyKSB7fQogCiBCb3g6OkxldmVsIEJsb2NrTGV2ZWxSZXBsYWNlZEJveDo6R2V0TGV2ZWwoKSBjb25zdCB7IHJldHVybiBrQmxvY2tMZXZlbDsgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9ibG9ja19sZXZlbF9yZXBsYWNlZF9ib3guaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2xldmVsX3JlcGxhY2VkX2JveC5oCmluZGV4IGJkNzk4MmIuLjZmZGRhOWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2xldmVsX3JlcGxhY2VkX2JveC5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2Jsb2NrX2xldmVsX3JlcGxhY2VkX2JveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0JMT0NLX0xFVkVMX1JFUExBQ0VEX0JPWF9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0JMT0NLX0xFVkVMX1JFUExBQ0VEX0JPWF9IXwpAQCAtNDAsNiArMzgsNyBAQAogICAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8TGF5b3V0VW5pdD4mIG1heWJlX2ludHJpbnNpY19oZWlnaHQsCiAgICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxmbG9hdD4mIG1heWJlX2ludHJpbnNpY19yYXRpbywKICAgICAgIFVzZWRTdHlsZVByb3ZpZGVyKiB1c2VkX3N0eWxlX3Byb3ZpZGVyLAorICAgICAgYmFzZTo6b3B0aW9uYWw8Ym9vbD4gaXNfdmlkZW9fcHVuY2hlZF9vdXQsCiAgICAgICBMYXlvdXRTdGF0VHJhY2tlciogbGF5b3V0X3N0YXRfdHJhY2tlcik7CiAKICAgLy8gRnJvbSB8Qm94fC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5jYwppbmRleCBhMDRjZWQ3Li4zZTcxNjM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9ib3guY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvYm94LmgiCiAKQEAgLTEwOCw2ICsxMDYsOSBAQAogICAgIHJldHVybjsKICAgfQogCisgIC8vIElmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgdGhlbiB0aGUgc2l6ZSBvZiB0aGUgYm94IGlzIGJlaW5nIHJlLWNhbGN1bGF0ZWQuCisgIGxheW91dF9zdGF0X3RyYWNrZXJfLT5PblVwZGF0ZVNpemUoKTsKKwogICBVcGRhdGVCb3JkZXJzKCk7CiAgIFVwZGF0ZVBhZGRpbmdzKGxheW91dF9wYXJhbXMpOwogICBVcGRhdGVDb250ZW50U2l6ZUFuZE1hcmdpbnMobGF5b3V0X3BhcmFtcyk7CkBAIC00MTMsNiArNDE0LDEwIEBACiAgICAgcmV0dXJuOwogICB9CiAKKyAgLy8gSWYgdGhpcyBwb2ludCBpcyByZWFjaGVkLCB0aGVuIHRoZSBwcmUtZXhpc3RpbmcgY2FjaGVkIHJlbmRlciB0cmVlIG5vZGUgaXMKKyAgLy8gbm90IGJlaW5nIHVzZWQuCisgIGxheW91dF9zdGF0X3RyYWNrZXJfLT5PblJlbmRlckFuZEFuaW1hdGUoKTsKKwogICAvLyBJbml0aWFsaXplIHRoZSBjYWNoZWQgcmVuZGVyIHRyZWUgbm9kZSB3aXRoIHRoZSBib3JkZXIgYm94IG9mZnNldC4KICAgY2FjaGVkX3JlbmRlcl90cmVlX25vZGVfaW5mb18gPSBDYWNoZWRSZW5kZXJUcmVlTm9kZUluZm8oYm9yZGVyX2JveF9vZmZzZXQpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9ib3guaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5oCmluZGV4IDYwZTljY2IuLjQyY2ZjNzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2JveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0JPWF9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0JPWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94X2dlbmVyYXRvci5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2JveF9nZW5lcmF0b3IuY2MKaW5kZXggN2I2NDZjMC4uYmNiMzBjOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94X2dlbmVyYXRvci5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9ib3hfZ2VuZXJhdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvYm94X2dlbmVyYXRvci5oIgogCkBAIC00Myw3ICs0MSwxMiBAQAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvd2hpdGVfc3BhY2VfcHJvY2Vzc2luZy5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZS5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmgiCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaCIKKyNlbHNlICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgiCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGxheW91dCB7CkBAIC01NCwxNiArNTcsMzIgQEAKIG5hbWVzcGFjZSB7CiAKIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBHZXRWaWRlb0ZyYW1lKAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI+JiBmcmFtZV9wcm92aWRlcikgewotICBEQ0hFQ0soZnJhbWVfcHJvdmlkZXIpOwotICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IHZpZGVvX2ZyYW1lID0gZnJhbWVfcHJvdmlkZXItPkdldEN1cnJlbnRGcmFtZSgpOwotICBpZiAodmlkZW9fZnJhbWUgJiYgdmlkZW9fZnJhbWUtPnRleHR1cmVfaWQoKSkgewotICAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBpbWFnZSA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8cmVuZGVyX3RyZWU6OkltYWdlKj4odmlkZW9fZnJhbWUtPnRleHR1cmVfaWQoKSk7Ci0gICAgcmV0dXJuIGltYWdlOwotICB9CisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4mIGZyYW1lX3Byb3ZpZGVyLAorICAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcikgeworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0ID0gZnJhbWVfcHJvdmlkZXItPkdldEN1cnJlbnRTYkRlY29kZVRhcmdldCgpOworICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXQpKSB7CisjaWYgU0JfSEFTKEdSQVBISUNTKQorICAgIHJldHVybiByZXNvdXJjZV9wcm92aWRlci0+Q3JlYXRlSW1hZ2VGcm9tU2JEZWNvZGVUYXJnZXQoZGVjb2RlX3RhcmdldCk7CisjZWxzZSAgLy8gU0JfSEFTKEdSQVBISUNTKQorICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocmVzb3VyY2VfcHJvdmlkZXIpOworICAgIHJldHVybiBOVUxMOworI2VuZGlmCisgIH0gZWxzZSB7CisjZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocmVzb3VyY2VfcHJvdmlkZXIpOworICB7CisjZW5kaWYKKyAgICBEQ0hFQ0soZnJhbWVfcHJvdmlkZXIpOworICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gdmlkZW9fZnJhbWUgPSBmcmFtZV9wcm92aWRlci0+R2V0Q3VycmVudEZyYW1lKCk7CisgICAgaWYgKHZpZGVvX2ZyYW1lICYmIHZpZGVvX2ZyYW1lLT50ZXh0dXJlX2lkKCkpIHsKKyAgICAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBpbWFnZSA9CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxyZW5kZXJfdHJlZTo6SW1hZ2UqPih2aWRlb19mcmFtZS0+dGV4dHVyZV9pZCgpKTsKKyAgICAgIHJldHVybiBpbWFnZTsKKyAgICB9CiAKLSAgcmV0dXJuIE5VTEw7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC0xNjMsNyArMTgyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8TGF5b3V0VW5pdD4mIG1heWJlX2ludHJpbnNpY193aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8TGF5b3V0VW5pdD4mIG1heWJlX2ludHJpbnNpY19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPGZsb2F0PiYgbWF5YmVfaW50cmluc2ljX3JhdGlvLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCb3hHZW5lcmF0b3I6OkNvbnRleHQqIGNvbnRleHQpCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJveEdlbmVyYXRvcjo6Q29udGV4dCogY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6b3B0aW9uYWw8Ym9vbD4gaXNfdmlkZW9fcHVuY2hlZF9vdXQpCiAgICAgICA6IGNzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbl8oY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uKSwKICAgICAgICAgcmVwbGFjZV9pbWFnZV9jYl8ocmVwbGFjZV9pbWFnZV9jYiksCiAgICAgICAgIHNldF9ib3VuZHNfY2JfKHNldF9ib3VuZHNfY2IpLApAQCAtMTcyLDcgKzE5Miw4IEBACiAgICAgICAgIG1heWJlX2ludHJpbnNpY193aWR0aF8obWF5YmVfaW50cmluc2ljX3dpZHRoKSwKICAgICAgICAgbWF5YmVfaW50cmluc2ljX2hlaWdodF8obWF5YmVfaW50cmluc2ljX2hlaWdodCksCiAgICAgICAgIG1heWJlX2ludHJpbnNpY19yYXRpb18obWF5YmVfaW50cmluc2ljX3JhdGlvKSwKLSAgICAgICAgY29udGV4dF8oY29udGV4dCkge30KKyAgICAgICAgY29udGV4dF8oY29udGV4dCksCisgICAgICAgIGlzX3ZpZGVvX3B1bmNoZWRfb3V0Xyhpc192aWRlb19wdW5jaGVkX291dCkge30KIAogICB2b2lkIFZpc2l0S2V5d29yZChjc3NvbTo6S2V5d29yZFZhbHVlKiBrZXl3b3JkKSBPVkVSUklERTsKIApAQCAtMTg5LDYgKzIxMCw3IEBACiAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPExheW91dFVuaXQ+IG1heWJlX2ludHJpbnNpY19oZWlnaHRfOwogICBjb25zdCBiYXNlOjpvcHRpb25hbDxmbG9hdD4gbWF5YmVfaW50cmluc2ljX3JhdGlvXzsKICAgY29uc3QgQm94R2VuZXJhdG9yOjpDb250ZXh0KiBjb250ZXh0XzsKKyAgYmFzZTo6b3B0aW9uYWw8Ym9vbD4gaXNfdmlkZW9fcHVuY2hlZF9vdXRfOwogCiAgIHNjb3BlZF9yZWZwdHI8UmVwbGFjZWRCb3g+IHJlcGxhY2VkX2JveF87CiB9OwpAQCAtMjAyLDcgKzIyNCw4IEBACiAgICAgICAgICAgY3NzX2NvbXB1dGVkX3N0eWxlX2RlY2xhcmF0aW9uXywgcmVwbGFjZV9pbWFnZV9jYl8sIHNldF9ib3VuZHNfY2JfLAogICAgICAgICAgIHBhcmFncmFwaF8sIHRleHRfcG9zaXRpb25fLCBtYXliZV9pbnRyaW5zaWNfd2lkdGhfLAogICAgICAgICAgIG1heWJlX2ludHJpbnNpY19oZWlnaHRfLCBtYXliZV9pbnRyaW5zaWNfcmF0aW9fLAotICAgICAgICAgIGNvbnRleHRfLT51c2VkX3N0eWxlX3Byb3ZpZGVyLCBjb250ZXh0Xy0+bGF5b3V0X3N0YXRfdHJhY2tlcikpOworICAgICAgICAgIGNvbnRleHRfLT51c2VkX3N0eWxlX3Byb3ZpZGVyLCBpc192aWRlb19wdW5jaGVkX291dF8sCisgICAgICAgICAgY29udGV4dF8tPmxheW91dF9zdGF0X3RyYWNrZXIpKTsKICAgICAgIGJyZWFrOwogICAgIC8vIEdlbmVyYXRlIGFuIGlubGluZS1sZXZlbCByZXBsYWNlZCBib3guIFRoZXJlIGlzIG5vIG5lZWQgdG8gZGlzdGluZ3Vpc2gKICAgICAvLyBiZXR3ZWVuIGlubGluZSByZXBsYWNlZCBlbGVtZW50cyBhbmQgaW5saW5lLWJsb2NrIHJlcGxhY2VkIGVsZW1lbnRzCkBAIC0yMTQsNyArMjM3LDggQEAKICAgICAgICAgICBjc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb25fLCByZXBsYWNlX2ltYWdlX2NiXywgc2V0X2JvdW5kc19jYl8sCiAgICAgICAgICAgcGFyYWdyYXBoXywgdGV4dF9wb3NpdGlvbl8sIG1heWJlX2ludHJpbnNpY193aWR0aF8sCiAgICAgICAgICAgbWF5YmVfaW50cmluc2ljX2hlaWdodF8sIG1heWJlX2ludHJpbnNpY19yYXRpb18sCi0gICAgICAgICAgY29udGV4dF8tPnVzZWRfc3R5bGVfcHJvdmlkZXIsIGNvbnRleHRfLT5sYXlvdXRfc3RhdF90cmFja2VyKSk7CisgICAgICAgICAgY29udGV4dF8tPnVzZWRfc3R5bGVfcHJvdmlkZXIsIGlzX3ZpZGVvX3B1bmNoZWRfb3V0XywKKyAgICAgICAgICBjb250ZXh0Xy0+bGF5b3V0X3N0YXRfdHJhY2tlcikpOwogICAgICAgYnJlYWs7CiAgICAgLy8gVGhlIGVsZW1lbnQgZ2VuZXJhdGVzIG5vIGJveGVzIGFuZCBoYXMgbm8gZWZmZWN0IG9uIGxheW91dC4KICAgICBjYXNlIGNzc29tOjpLZXl3b3JkVmFsdWU6OmtOb25lOgpAQCAtMjkwLDE2ICszMTQsMzQgQEAKICAgICAgICgqcGFyYWdyYXBoXyktPkFwcGVuZENvZGVQb2ludCgKICAgICAgICAgICBQYXJhZ3JhcGg6OmtPYmplY3RSZXBsYWNlbWVudENoYXJhY3RlckNvZGVQb2ludCk7CiAKKyAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyID0KKyAgICAgICp2aWRlb19lbGVtZW50LT5ub2RlX2RvY3VtZW50KCkKKyAgICAgICAgICAgLT5odG1sX2VsZW1lbnRfY29udGV4dCgpCisgICAgICAgICAgIC0+cmVzb3VyY2VfcHJvdmlkZXIoKTsKKworICAvLyBJZiB0aGUgb3B0aW9uYWwgaXMgZGlzZW5nYWdlZCwgdGhlbiB3ZSBkb24ndCBrbm93IGlmIHB1bmNoIG91dCBpcyBlbmFibGVkCisgIC8vIG9yIG5vdC4KKyAgYmFzZTo6b3B0aW9uYWw8Ym9vbD4gaXNfcHVuY2hfb3V0OworICBpZiAodmlkZW9fZWxlbWVudC0+R2V0VmlkZW9GcmFtZVByb3ZpZGVyKCkpIHsKKyAgICBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6T3V0cHV0TW9kZSBvdXRwdXRfbW9kZSA9CisgICAgICAgIHZpZGVvX2VsZW1lbnQtPkdldFZpZGVvRnJhbWVQcm92aWRlcigpLT5HZXRPdXRwdXRNb2RlKCk7CisgICAgaWYgKG91dHB1dF9tb2RlICE9IFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyOjprT3V0cHV0TW9kZUludmFsaWQpIHsKKyAgICAgIGlzX3B1bmNoX291dCA9CisgICAgICAgICAgb3V0cHV0X21vZGUgPT0gIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyOjprT3V0cHV0TW9kZVB1bmNoT3V0OworICAgIH0KKyAgfQorCiAgIC8vIFVubGlrZSBpbiBDaHJvbWl1bSwgd2UgZG8gbm90IHNldCB0aGUgaW50cmluc2ljIHdpZHRoLCBoZWlnaHQsIG9yIHJhdGlvCiAgIC8vIGJhc2VkIG9uIHRoZSB2aWRlbyBmcmFtZS4gVGhpcyBhbGxvd3MgdG8gYXZvaWQgcmVsYXlvdXQgd2hpbGUgcGxheWluZwogICAvLyBhZGFwdGl2ZSB2aWRlb3MuCiAgIFJlcGxhY2VkQm94R2VuZXJhdG9yIHJlcGxhY2VkX2JveF9nZW5lcmF0b3IoCiAgICAgICB2aWRlb19lbGVtZW50LT5jc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24oKSwKICAgICAgIHZpZGVvX2VsZW1lbnQtPkdldFZpZGVvRnJhbWVQcm92aWRlcigpCi0gICAgICAgICAgPyBiYXNlOjpCaW5kKEdldFZpZGVvRnJhbWUsIHZpZGVvX2VsZW1lbnQtPkdldFZpZGVvRnJhbWVQcm92aWRlcigpKQorICAgICAgICAgID8gYmFzZTo6QmluZChHZXRWaWRlb0ZyYW1lLCB2aWRlb19lbGVtZW50LT5HZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzb3VyY2VfcHJvdmlkZXIpCiAgICAgICAgICAgOiBSZXBsYWNlZEJveDo6UmVwbGFjZUltYWdlQ0IoKSwKICAgICAgIHZpZGVvX2VsZW1lbnQtPkdldFNldEJvdW5kc0NCKCksICpwYXJhZ3JhcGhfLCB0ZXh0X3Bvc2l0aW9uLAotICAgICAgYmFzZTo6bnVsbG9wdCwgYmFzZTo6bnVsbG9wdCwgYmFzZTo6bnVsbG9wdCwgY29udGV4dF8pOworICAgICAgYmFzZTo6bnVsbG9wdCwgYmFzZTo6bnVsbG9wdCwgYmFzZTo6bnVsbG9wdCwgY29udGV4dF8sIGlzX3B1bmNoX291dCk7CiAgIHZpZGVvX2VsZW1lbnQtPmNvbXB1dGVkX3N0eWxlKCktPmRpc3BsYXkoKS0+QWNjZXB0KCZyZXBsYWNlZF9ib3hfZ2VuZXJhdG9yKTsKIAogICBzY29wZWRfcmVmcHRyPFJlcGxhY2VkQm94PiByZXBsYWNlZF9ib3ggPQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvYm94X2dlbmVyYXRvci5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvYm94X2dlbmVyYXRvci5oCmluZGV4IDJmOWJiYTkuLjMwNzJkMjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2JveF9nZW5lcmF0b3IuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9ib3hfZ2VuZXJhdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLmAKLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5gCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9CT1hfR0VORVJBVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfQk9YX0dFTkVSQVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvY29udGFpbmVyX2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2NvbnRhaW5lcl9ib3guY2MKaW5kZXggYTJjNzliYi4uYTEzZDg4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvY29udGFpbmVyX2JveC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvY29udGFpbmVyX2JveC5oIgogCkBAIC0xNzksMTUgKzE3NywxOSBAQAogCiB2b2lkIENvbnRhaW5lckJveDo6VXBkYXRlQ3Jvc3NSZWZlcmVuY2VzKCkgewogICBpZiAoIWFyZV9jcm9zc19yZWZlcmVuY2VzX3ZhbGlkXykgeworICAgIC8vIElmIHRoaXMgcG9pbnQgaXMgcmVhY2hlZCwgdGhlbiB0aGUgY3Jvc3MgcmVmZXJlbmNlcyBmb3IgdGhpcyBjb250YWluZXIKKyAgICAvLyBib3ggYXJlIGJlaW5nIHJlLWdlbmVyYXRlZC4KKyAgICBsYXlvdXRfc3RhdF90cmFja2VyKCktPk9uVXBkYXRlQ3Jvc3NSZWZlcmVuY2VzKCk7CisKICAgICAvLyBDcm9zcyByZWZlcmVuY2VzIGFyZSBub3QgY2xlYXJlZCB3aGVuIHRoZXkgYXJlIGludmFsaWRhdGVkLiBUaGlzIGlzCiAgICAgLy8gYmVjYXVzZSB0aGV5IGNhbiBiZSBpbnZhbGlkYXRlZCB3aGlsZSB0aGV5IGFyZSBiZWluZyB3YWxrZWQgaWYgYQogICAgIC8vIHJlbGF0aXZlbHkgcG9zaXRpb25lZCBkZXNjZW5kYW50IGlzIHNwbGl0LiBUaGVyZWZvcmUsIHRoZXkgbmVlZCB0byBiZQotICAgIC8vIGNsZWFyZWQgbm93LgorICAgIC8vIGNsZWFyZWQgbm93IGJlZm9yZSB0aGV5IGFyZSByZWdlbmVyYXRlZC4KICAgICBwb3NpdGlvbmVkX2NoaWxkX2JveGVzXy5jbGVhcigpOwogICAgIG5lZ2F0aXZlX3pfaW5kZXhfY2hpbGRfLmNsZWFyKCk7CiAgICAgbm9uX25lZ2F0aXZlX3pfaW5kZXhfY2hpbGRfLmNsZWFyKCk7CiAKLSAgICBib29sIGlzX25lYXJlc3RfY29udGFpbmluZ19ibG9jayA9IHRydWU7CisgICAgY29uc3QgYm9vbCBrSXNOZWFyZXN0Q29udGFpbmluZ0Jsb2NrT2ZDaGlsZHJlbiA9IHRydWU7CiAgICAgYm9vbCBpc19uZWFyZXN0X2Fic29sdXRlX2NvbnRhaW5pbmdfYmxvY2sgPQogICAgICAgICBJc0NvbnRhaW5pbmdCbG9ja0ZvclBvc2l0aW9uQWJzb2x1dGVFbGVtZW50cygpOwogICAgIGJvb2wgaXNfbmVhcmVzdF9maXhlZF9jb250YWluaW5nX2Jsb2NrID0KQEAgLTE5OCw3ICsyMDAsNyBAQAogICAgICAgICAgY2hpbGRfYm94X2l0ZXJhdG9yICE9IGNoaWxkX2JveGVzXy5lbmQoKTsgKytjaGlsZF9ib3hfaXRlcmF0b3IpIHsKICAgICAgIEJveCogY2hpbGRfYm94ID0gKmNoaWxkX2JveF9pdGVyYXRvcjsKICAgICAgIGNoaWxkX2JveC0+VXBkYXRlQ3Jvc3NSZWZlcmVuY2VzT2ZDb250YWluZXJCb3goCi0gICAgICAgICAgdGhpcywgaXNfbmVhcmVzdF9jb250YWluaW5nX2Jsb2NrLAorICAgICAgICAgIHRoaXMsIGtJc05lYXJlc3RDb250YWluaW5nQmxvY2tPZkNoaWxkcmVuLAogICAgICAgICAgIGlzX25lYXJlc3RfYWJzb2x1dGVfY29udGFpbmluZ19ibG9jaywKICAgICAgICAgICBpc19uZWFyZXN0X2ZpeGVkX2NvbnRhaW5pbmdfYmxvY2ssIGlzX25lYXJlc3Rfc3RhY2tpbmdfY29udGV4dCk7CiAgICAgfQpAQCAtNTMwLDE2ICs1MzIsMTMgQEAKICAgLy8gc3BlY2lmaWVkIHR5cGVzLCB0aGVuIHRoZSB0YXJnZXQgY29udGFpbmVyIGJveCBjYW5ub3QgYmUgdGhlIG5lYXJlc3QgYm94IG9mCiAgIC8vIHRoYXQgdHlwZSBmb3IgdGhlIGNoaWxkcmVuLgogCi0gIGJvb2wgaXNfbmVhcmVzdF9jb250YWluaW5nX2Jsb2NrX29mX2NoaWxkcmVuID0gZmFsc2U7Ci0KKyAgY29uc3QgYm9vbCBrSXNOZWFyZXN0Q29udGFpbmluZ0Jsb2NrT2ZDaGlsZHJlbiA9IGZhbHNlOwogICBib29sIGlzX25lYXJlc3RfYWJzb2x1dGVfY29udGFpbmluZ19ibG9ja19vZl9jaGlsZHJlbiA9CiAgICAgICBpc19uZWFyZXN0X2Fic29sdXRlX2NvbnRhaW5pbmdfYmxvY2sgJiYKICAgICAgICFJc0NvbnRhaW5pbmdCbG9ja0ZvclBvc2l0aW9uQWJzb2x1dGVFbGVtZW50cygpOwotCiAgIGJvb2wgaXNfbmVhcmVzdF9maXhlZF9jb250YWluaW5nX2Jsb2NrX29mX2NoaWxkcmVuID0KICAgICAgIGlzX25lYXJlc3RfZml4ZWRfY29udGFpbmluZ19ibG9jayAmJgogICAgICAgIUlzQ29udGFpbmluZ0Jsb2NrRm9yUG9zaXRpb25GaXhlZEVsZW1lbnRzKCk7Ci0KICAgYm9vbCBpc19uZWFyZXN0X3N0YWNraW5nX2NvbnRleHRfb2ZfY2hpbGRyZW4gPQogICAgICAgaXNfbmVhcmVzdF9zdGFja2luZ19jb250ZXh0ICYmICFJc1N0YWNraW5nQ29udGV4dCgpOwogCkBAIC01NTMsNyArNTUyLDcgQEAKICAgICAgICAgIGNoaWxkX2JveF9pdGVyYXRvciAhPSBjaGlsZF9ib3hlc18uZW5kKCk7ICsrY2hpbGRfYm94X2l0ZXJhdG9yKSB7CiAgICAgICBCb3gqIGNoaWxkX2JveCA9ICpjaGlsZF9ib3hfaXRlcmF0b3I7CiAgICAgICBjaGlsZF9ib3gtPlVwZGF0ZUNyb3NzUmVmZXJlbmNlc09mQ29udGFpbmVyQm94KAotICAgICAgICAgIHNvdXJjZV9ib3gsIGlzX25lYXJlc3RfY29udGFpbmluZ19ibG9ja19vZl9jaGlsZHJlbiwKKyAgICAgICAgICBzb3VyY2VfYm94LCBrSXNOZWFyZXN0Q29udGFpbmluZ0Jsb2NrT2ZDaGlsZHJlbiwKICAgICAgICAgICBpc19uZWFyZXN0X2Fic29sdXRlX2NvbnRhaW5pbmdfYmxvY2tfb2ZfY2hpbGRyZW4sCiAgICAgICAgICAgaXNfbmVhcmVzdF9maXhlZF9jb250YWluaW5nX2Jsb2NrX29mX2NoaWxkcmVuLAogICAgICAgICAgIGlzX25lYXJlc3Rfc3RhY2tpbmdfY29udGV4dF9vZl9jaGlsZHJlbik7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmggYi9zcmMvY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmgKaW5kZXggMmExM2M5MS4uMWY4ZjYwYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvY29udGFpbmVyX2JveC5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2NvbnRhaW5lcl9ib3guaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9DT05UQUlORVJfQk9YX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfQ09OVEFJTkVSX0JPWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvZm9ybWF0dGluZ19jb250ZXh0LmggYi9zcmMvY29iYWx0L2xheW91dC9mb3JtYXR0aW5nX2NvbnRleHQuaAppbmRleCA2YjA2OWM2Li43MGNmMjM2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9mb3JtYXR0aW5nX2NvbnRleHQuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9mb3JtYXR0aW5nX2NvbnRleHQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFRfSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9GT1JNQVRUSU5HX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2luaXRpYWxfY29udGFpbmluZ19ibG9jay5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2luaXRpYWxfY29udGFpbmluZ19ibG9jay5jYwppbmRleCBmNTYzZTBlLi4wOGU2MDBkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9pbml0aWFsX2NvbnRhaW5pbmdfYmxvY2suY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvaW5pdGlhbF9jb250YWluaW5nX2Jsb2NrLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvaW5pdGlhbF9jb250YWluaW5nX2Jsb2NrLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2luaXRpYWxfY29udGFpbmluZ19ibG9jay5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvaW5pdGlhbF9jb250YWluaW5nX2Jsb2NrLmgKaW5kZXggOTg4ZmI5Zi4uNTJiMmQzZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvaW5pdGlhbF9jb250YWluaW5nX2Jsb2NrLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvaW5pdGlhbF9jb250YWluaW5nX2Jsb2NrLmgKQEAgLTEsMjQgKzEsMjMgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfSU5JVElBTF9DT05UQUlOSU5HX0JMT0NLX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfSU5JVElBTF9DT05UQUlOSU5HX0JMT0NLX0hfCiAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2Nzc19jb21wdXRlZF9zdHlsZV9kYXRhLmgiCisjaW5jbHVkZSAiY29iYWx0L2RvbS9odG1sX2VsZW1lbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL3dpbmRvdy5oIgogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvYmxvY2tfZm9ybWF0dGluZ19ibG9ja19jb250YWluZXJfYm94LmgiCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC91c2VkX3N0eWxlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9pbmxpbmVfY29udGFpbmVyX2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9jb250YWluZXJfYm94LmNjCmluZGV4IDc1MWEzYjQuLjk5MDJlZTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9jb250YWluZXJfYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9jb250YWluZXJfYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvaW5saW5lX2NvbnRhaW5lcl9ib3guaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvaW5saW5lX2NvbnRhaW5lcl9ib3guaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9jb250YWluZXJfYm94LmgKaW5kZXggNjQ0NGMwZS4uZjIwYjhlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvaW5saW5lX2NvbnRhaW5lcl9ib3guaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9pbmxpbmVfY29udGFpbmVyX2JveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0lOTElORV9DT05UQUlORVJfQk9YX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfSU5MSU5FX0NPTlRBSU5FUl9CT1hfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9mb3JtYXR0aW5nX2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L2xheW91dC9pbmxpbmVfZm9ybWF0dGluZ19jb250ZXh0LmNjCmluZGV4IGViNzM5ZTIuLmQ3YTM0NmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9mb3JtYXR0aW5nX2NvbnRleHQuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvaW5saW5lX2Zvcm1hdHRpbmdfY29udGV4dC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2lubGluZV9mb3JtYXR0aW5nX2NvbnRleHQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvaW5saW5lX2Zvcm1hdHRpbmdfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvaW5saW5lX2Zvcm1hdHRpbmdfY29udGV4dC5oCmluZGV4IGQxOWNjYTUuLmMxNWJiYTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9mb3JtYXR0aW5nX2NvbnRleHQuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9pbmxpbmVfZm9ybWF0dGluZ19jb250ZXh0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfSU5MSU5FX0ZPUk1BVFRJTkdfQ09OVEVYVF9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0lOTElORV9GT1JNQVRUSU5HX0NPTlRFWFRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9sZXZlbF9yZXBsYWNlZF9ib3guY2MgYi9zcmMvY29iYWx0L2xheW91dC9pbmxpbmVfbGV2ZWxfcmVwbGFjZWRfYm94LmNjCmluZGV4IDVlYWI4YzguLjBmMmJjMTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9sZXZlbF9yZXBsYWNlZF9ib3guY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvaW5saW5lX2xldmVsX3JlcGxhY2VkX2JveC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2lubGluZV9sZXZlbF9yZXBsYWNlZF9ib3guaCIKIApAQCAtMzAsMTIgKzI4LDEzIEBACiAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8TGF5b3V0VW5pdD4mIG1heWJlX2ludHJpbnNpY19oZWlnaHQsCiAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8ZmxvYXQ+JiBtYXliZV9pbnRyaW5zaWNfcmF0aW8sCiAgICAgVXNlZFN0eWxlUHJvdmlkZXIqIHVzZWRfc3R5bGVfcHJvdmlkZXIsCisgICAgYmFzZTo6b3B0aW9uYWw8Ym9vbD4gaXNfdmlkZW9fcHVuY2hlZF9vdXQsCiAgICAgTGF5b3V0U3RhdFRyYWNrZXIqIGxheW91dF9zdGF0X3RyYWNrZXIpCiAgICAgOiBSZXBsYWNlZEJveChjc3NfY29tcHV0ZWRfc3R5bGVfZGVjbGFyYXRpb24sIHJlcGxhY2VfaW1hZ2VfY2IsCiAgICAgICAgICAgICAgICAgICBzZXRfYm91bmRzX2NiLCBwYXJhZ3JhcGgsIHRleHRfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICBtYXliZV9pbnRyaW5zaWNfd2lkdGgsIG1heWJlX2ludHJpbnNpY19oZWlnaHQsCiAgICAgICAgICAgICAgICAgICBtYXliZV9pbnRyaW5zaWNfcmF0aW8sIHVzZWRfc3R5bGVfcHJvdmlkZXIsCi0gICAgICAgICAgICAgICAgICBsYXlvdXRfc3RhdF90cmFja2VyKSwKKyAgICAgICAgICAgICAgICAgIGlzX3ZpZGVvX3B1bmNoZWRfb3V0LCBsYXlvdXRfc3RhdF90cmFja2VyKSwKICAgICAgIGlzX2hpZGRlbl9ieV9lbGxpcHNpc18oZmFsc2UpLAogICAgICAgd2FzX2hpZGRlbl9ieV9lbGxpcHNpc18oZmFsc2UpIHt9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9sZXZlbF9yZXBsYWNlZF9ib3guaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2lubGluZV9sZXZlbF9yZXBsYWNlZF9ib3guaAppbmRleCAzMmE4NWFhLi4xNGZkOTk1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9pbmxpbmVfbGV2ZWxfcmVwbGFjZWRfYm94LmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvaW5saW5lX2xldmVsX3JlcGxhY2VkX2JveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0lOTElORV9MRVZFTF9SRVBMQUNFRF9CT1hfSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9JTkxJTkVfTEVWRUxfUkVQTEFDRURfQk9YX0hfCkBAIC00Miw2ICs0MCw3IEBACiAgICAgICBjb25zdCBiYXNlOjpvcHRpb25hbDxMYXlvdXRVbml0PiYgbWF5YmVfaW50cmluc2ljX2hlaWdodCwKICAgICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPGZsb2F0PiYgbWF5YmVfaW50cmluc2ljX3JhdGlvLAogICAgICAgVXNlZFN0eWxlUHJvdmlkZXIqIHVzZWRfc3R5bGVfcHJvdmlkZXIsCisgICAgICBiYXNlOjpvcHRpb25hbDxib29sPiBpc192aWRlb19wdW5jaGVkX291dCwKICAgICAgIExheW91dFN0YXRUcmFja2VyKiBsYXlvdXRfc3RhdF90cmFja2VyKTsKIAogICAvLyBGcm9tIHxCb3h8LgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0LmNjCmluZGV4IDQ5ODgzNmIuLmRiMDk1MTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9sYXlvdXQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0Lmd5cCBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dC5neXAKaW5kZXggY2RlNmRiYS4uYzIzOTQwMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0Lmd5cAorKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXQuZ3lwCkBAIC0xMTMsOSArMTEzLDkgQEAKICAgICAgICAgJ3doaXRlX3NwYWNlX3Byb2Nlc3NpbmdfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Nzc19wYXJzZXIvY3NzX3BhcnNlci5neXA6Y3NzX3BhcnNlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbGF5b3V0L2xheW91dC5neXA6bGF5b3V0X3Rlc3RpbmcnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnbGF5b3V0JywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dC5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0LmgKaW5kZXggMGY3YzU0ZS4uYTc3NzMxOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0LmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfTEFZT1VUX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfTEFZT1VUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfYm94ZXMuY2MgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfYm94ZXMuY2MKaW5kZXggOGE5NTExNS4uZTBmYzc3MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X2JveGVzLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9ib3hlcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2xheW91dF9ib3hlcy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfYm94ZXMuaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9ib3hlcy5oCmluZGV4IDA1NWQxZTAuLmUyOGY0MjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9ib3hlcy5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9ib3hlcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0xBWU9VVF9CT1hFU19IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0xBWU9VVF9CT1hFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5jYwppbmRleCBhYTJmNGQ5Li5jZTMxZjczIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2xheW91dF9tYW5hZ2VyLmgiCiAKQEAgLTIzNywxMyArMjM1LDEzIEBACiAgIC8vIFRPRE86IEV2ZW50dWFsbHkgd2Ugd291bGQgbGlrZSB0byBpbnN0ZWFkIGJhc2Ugb3VyIGxheW91dHMgb2ZmIG9mIGEKICAgLy8gICAgICAgInJlZnJlc2giIHNpZ25hbCBnZW5lcmF0ZWQgYnkgdGhlIHJhc3Rlcml6ZXIsIGluc3RlYWQgb2YgdHJ5aW5nIHRvCiAgIC8vICAgICAgIG1hdGNoIHRpbWVycyB0byB0aGUgZ3JhcGhpY3MnIHJlZnJlc2ggcmF0ZSwgd2hpY2ggaXMgZXJyb3IgcHJvbmUuCi0gIGNvbnN0IGludDY0X3QgdGltZXJfaW50ZXJ2YWxfaW5fbWlyY29zZWNvbmRzID0KKyAgY29uc3QgaW50NjRfdCB0aW1lcl9pbnRlcnZhbF9pbl9taWNyb3NlY29uZHMgPQogICAgICAgc3RhdGljX2Nhc3Q8aW50NjRfdD4oYmFzZTo6VGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCAqIDEuMGYgLwogICAgICAgICAgICAgICAgICAgICAgICAgICAgKGxheW91dF9yZWZyZXNoX3JhdGVfICsgMS4wZikpOwogCiAgIGxheW91dF90aW1lcl8uU3RhcnQoCiAgICAgICBGUk9NX0hFUkUsCi0gICAgICBiYXNlOjpUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHModGltZXJfaW50ZXJ2YWxfaW5fbWlyY29zZWNvbmRzKSwKKyAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcyh0aW1lcl9pbnRlcnZhbF9pbl9taWNyb3NlY29uZHMpLAogICAgICAgYmFzZTo6QmluZCgmTGF5b3V0TWFuYWdlcjo6SW1wbDo6RG9MYXlvdXRBbmRQcm9kdWNlUmVuZGVyVHJlZSwKICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSkpOwogfQpAQCAtMjYzLDI3ICsyNjEsMzAgQEAKICAgLy8gVXBkYXRlIHRoZSBkb2N1bWVudCdzIHNhbXBsZSB0aW1lLCB1c2VkIGZvciB1cGRhdGluZyBhbmltYXRpb25zLgogICBkb2N1bWVudC0+U2FtcGxlVGltZWxpbmVUaW1lKCk7CiAKLSAgYm9vbCB3YXNfZGlydHkgPSBsYXlvdXRfZGlydHlfOwotICBpZiAobGF5b3V0X2RpcnR5XykgewotICAgIFRSQUNFX0VWRU5UX0JFR0lOMCgiY29iYWx0OjpsYXlvdXQiLCBrQmVuY2htYXJrU3RhdExheW91dCk7Ci0gICAgLy8gVXBkYXRlIG91ciBjb21wdXRlZCBzdHlsZSBiZWZvcmUgcnVubmluZyBhbmltYXRpb24gY2FsbGJhY2tzLCBzbyB0aGF0Ci0gICAgLy8gYW55IHRyYW5zaXRpb25pbmcgZWxlbWVudHMgYWRqdXN0ZWQgZHVyaW5nIHRoZSBhbmltYXRpb24gY2FsbGJhY2sgd2lsbAotICAgIC8vIHRyYW5zaXRpb24gZnJvbSB0aGVpciBwcmV2aW91c2x5IHNldCB2YWx1ZS4KLSAgICBkb2N1bWVudC0+VXBkYXRlQ29tcHV0ZWRTdHlsZXMoKTsKKyAgYm9vbCBoYXNfbGF5b3V0X3Byb2Nlc3Npbmdfc3RhcnRlZCA9IGZhbHNlOworICBpZiAod2luZG93Xy0+SGFzUGVuZGluZ0FuaW1hdGlvbkZyYW1lQ2FsbGJhY2tzKCkpIHsKKyAgICBpZiAobGF5b3V0X2RpcnR5XykgeworICAgICAgaGFzX2xheW91dF9wcm9jZXNzaW5nX3N0YXJ0ZWQgPSB0cnVlOworICAgICAgVFJBQ0VfRVZFTlRfQkVHSU4wKCJjb2JhbHQ6OmxheW91dCIsIGtCZW5jaG1hcmtTdGF0TGF5b3V0KTsKKyAgICAgIC8vIFVwZGF0ZSBvdXIgY29tcHV0ZWQgc3R5bGUgYmVmb3JlIHJ1bm5pbmcgYW5pbWF0aW9uIGNhbGxiYWNrcywgc28gdGhhdAorICAgICAgLy8gYW55IHRyYW5zaXRpb25pbmcgZWxlbWVudHMgYWRqdXN0ZWQgZHVyaW5nIHRoZSBhbmltYXRpb24gY2FsbGJhY2sgd2lsbAorICAgICAgLy8gdHJhbnNpdGlvbiBmcm9tIHRoZWlyIHByZXZpb3VzbHkgc2V0IHZhbHVlLgorICAgICAgZG9jdW1lbnQtPlVwZGF0ZUNvbXB1dGVkU3R5bGVzKCk7CisgICAgfQorCisgICAgLy8gTm90ZSB0aGF0IGFjY29yZGluZyB0bzoKKyAgICAvLyAgICAgaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jbW9kZWwtbGl2ZW5lc3MsCisgICAgLy8gIlRoZSB0aW1lIHBhc3NlZCB0byBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayB3aWxsIGJlIGVxdWFsIHRvCisgICAgLy8gZG9jdW1lbnQudGltZWxpbmUuY3VycmVudFRpbWUiLiAgSW4gb3VyIGNhc2UsCisgICAgLy8gZG9jdW1lbnQudGltZWxpbmUuY3VycmVudFRpbWUgaXMgZGVyaXZlZCBmcm9tIHRoZSBsYXRlc3Qgc2FtcGxlIHRpbWUuCisgICAgd2luZG93Xy0+UnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoKTsKICAgfQogCi0gIC8vIE5vdGUgdGhhdCBhY2NvcmRpbmcgdG86Ci0gIC8vICAgICBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC13ZWItYW5pbWF0aW9ucy0xLTIwMTUwNzA3LyNtb2RlbC1saXZlbmVzcywKLSAgLy8gIlRoZSB0aW1lIHBhc3NlZCB0byBhIHJlcXVlc3RBbmltYXRpb25GcmFtZSBjYWxsYmFjayB3aWxsIGJlIGVxdWFsIHRvCi0gIC8vIGRvY3VtZW50LnRpbWVsaW5lLmN1cnJlbnRUaW1lIi4gIEluIG91ciBjYXNlLCBkb2N1bWVudC50aW1lbGluZS5jdXJyZW50VGltZQotICAvLyBpcyBkZXJpdmVkIGZyb20gdGhlIGxhdGVzdCBzYW1wbGUgdGltZS4KLSAgd2luZG93Xy0+UnVuQW5pbWF0aW9uRnJhbWVDYWxsYmFja3MoKTsKLQogICBpZiAobGF5b3V0X2RpcnR5XykgewotICAgIGlmICghd2FzX2RpcnR5KSB7Ci0gICAgICAvLyBXZSB3YW50IHRvIGNhdGNoIHRoZSBiZWdpbm5pbmcgb2YgYWxsIGxheW91dCBwcm9jZXNzaW5nLiAgSWYgd2Ugd2VyZW4ndAotICAgICAgLy8gZGlydHkgYmVmb3JlIHRoZSBjYWxsIHRvIFJ1bkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2tzKCksIHRoZW4gdGhlIGZsb3cKLSAgICAgIC8vIHN0YXJ0cyBoZXJlIGluc3RlYWQgb2YgdGhlcmUuCisgICAgaWYgKCFoYXNfbGF5b3V0X3Byb2Nlc3Npbmdfc3RhcnRlZCkgeworICAgICAgLy8gV2Ugd2FudCB0byBjYXRjaCB0aGUgYmVnaW5uaW5nIG9mIGFsbCBsYXlvdXQgcHJvY2Vzc2luZy4gIElmIGl0IGRpZG4ndAorICAgICAgLy8gYmVnaW4gYmVmb3JlIHRoZSBjYWxsIHRvIFJ1bkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2tzKCksIHRoZW4gdGhlIGZsb3cKKyAgICAgIC8vIHN0YXJ0cyBoZXJlIGluc3RlYWQuCiAgICAgICBUUkFDRV9FVkVOVF9CRUdJTjAoImNvYmFsdDo6bGF5b3V0Iiwga0JlbmNobWFya1N0YXRMYXlvdXQpOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9tYW5hZ2VyLmgKaW5kZXggMjg3MjMzNS4uZTAyY2MwYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfbWFuYWdlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0xBWU9VVF9NQU5BR0VSX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfTEFZT1VUX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9zdGF0X3RyYWNrZXIuY2MgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfc3RhdF90cmFja2VyLmNjCmluZGV4IGNiNGYzMzAuLmQ2MDgyNzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9zdGF0X3RyYWNrZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X3N0YXRfdHJhY2tlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2xheW91dF9zdGF0X3RyYWNrZXIuaCIKIApAQCAtMjYsNyArMjQsMTAgQEAKICAgICAgICAgICAgICAgICAgICAiVG90YWwgbnVtYmVyIG9mIGxheW91dCBib3hlcy4iKSwKICAgICAgIGlzX2V2ZW50X2FjdGl2ZV8oZmFsc2UpLAogICAgICAgYm94ZXNfY3JlYXRlZF9jb3VudF8oMCksCi0gICAgICBib3hlc19kZXN0cm95ZWRfY291bnRfKDApIHsKKyAgICAgIGJveGVzX2Rlc3Ryb3llZF9jb3VudF8oMCksCisgICAgICB1cGRhdGVfc2l6ZV9jb3VudF8oMCksCisgICAgICByZW5kZXJfYW5kX2FuaW1hdGVfY291bnRfKDApLAorICAgICAgdXBkYXRlX2Nyb3NzX3JlZmVyZW5jZXNfY291bnRfKDApIHsKICAgc3RvcF93YXRjaF9kdXJhdGlvbnNfLnJlc2l6ZShrTnVtU3RvcFdhdGNoVHlwZXMsIGJhc2U6OlRpbWVEZWx0YSgpKTsKIH0KIApAQCAtNjMsNiArNjQsMTQgQEAKIAogdm9pZCBMYXlvdXRTdGF0VHJhY2tlcjo6T25Cb3hEZXN0cm95ZWQoKSB7ICsrYm94ZXNfZGVzdHJveWVkX2NvdW50XzsgfQogCit2b2lkIExheW91dFN0YXRUcmFja2VyOjpPblVwZGF0ZVNpemUoKSB7ICsrdXBkYXRlX3NpemVfY291bnRfOyB9CisKK3ZvaWQgTGF5b3V0U3RhdFRyYWNrZXI6Ok9uUmVuZGVyQW5kQW5pbWF0ZSgpIHsgKytyZW5kZXJfYW5kX2FuaW1hdGVfY291bnRfOyB9CisKK3ZvaWQgTGF5b3V0U3RhdFRyYWNrZXI6Ok9uVXBkYXRlQ3Jvc3NSZWZlcmVuY2VzKCkgeworICArK3VwZGF0ZV9jcm9zc19yZWZlcmVuY2VzX2NvdW50XzsKK30KKwogYmFzZTo6VGltZURlbHRhIExheW91dFN0YXRUcmFja2VyOjpHZXRTdG9wV2F0Y2hUeXBlRHVyYXRpb24oCiAgICAgU3RvcFdhdGNoVHlwZSB0eXBlKSBjb25zdCB7CiAgIHJldHVybiBzdG9wX3dhdGNoX2R1cmF0aW9uc19bdHlwZV07CkBAIC04NCw2ICs5Myw5IEBACiAgIC8vIE5vdyBjbGVhciB0aGUgdmFsdWVzLgogICBib3hlc19jcmVhdGVkX2NvdW50XyA9IDA7CiAgIGJveGVzX2Rlc3Ryb3llZF9jb3VudF8gPSAwOworICB1cGRhdGVfc2l6ZV9jb3VudF8gPSAwOworICByZW5kZXJfYW5kX2FuaW1hdGVfY291bnRfID0gMDsKKyAgdXBkYXRlX2Nyb3NzX3JlZmVyZW5jZXNfY291bnRfID0gMDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGxheW91dApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X3N0YXRfdHJhY2tlci5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X3N0YXRfdHJhY2tlci5oCmluZGV4IDE5NWNjZTkuLjg1NzA0ZjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF9zdGF0X3RyYWNrZXIuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfc3RhdF90cmFja2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfTEFZT1VUX1NUQVRfVFJBQ0tFUl9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0xBWU9VVF9TVEFUX1RSQUNLRVJfSF8KQEAgLTQ4LDExICs0NiwxOSBAQAogICAvLyBQZXJpb2RpYyBjb3VudC1yZWxhdGVkCiAgIHZvaWQgT25Cb3hDcmVhdGVkKCk7CiAgIHZvaWQgT25Cb3hEZXN0cm95ZWQoKTsKKyAgdm9pZCBPblVwZGF0ZVNpemUoKTsKKyAgdm9pZCBPblJlbmRlckFuZEFuaW1hdGUoKTsKKyAgdm9pZCBPblVwZGF0ZUNyb3NzUmVmZXJlbmNlcygpOwogCiAgIGludCB0b3RhbF9ib3hlcygpIGNvbnN0IHsgcmV0dXJuIHRvdGFsX2JveGVzXzsgfQogCiAgIGludCBib3hlc19jcmVhdGVkX2NvdW50KCkgY29uc3QgeyByZXR1cm4gYm94ZXNfY3JlYXRlZF9jb3VudF87IH0KICAgaW50IGJveGVzX2Rlc3Ryb3llZF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGJveGVzX2Rlc3Ryb3llZF9jb3VudF87IH0KKyAgaW50IHVwZGF0ZV9zaXplX2NvdW50KCkgY29uc3QgeyByZXR1cm4gdXBkYXRlX3NpemVfY291bnRfOyB9CisgIGludCByZW5kZXJfYW5kX2FuaW1hdGVfY291bnQoKSBjb25zdCB7IHJldHVybiByZW5kZXJfYW5kX2FuaW1hdGVfY291bnRfOyB9CisgIGludCB1cGRhdGVfY3Jvc3NfcmVmZXJlbmNlc19jb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdXBkYXRlX2Nyb3NzX3JlZmVyZW5jZXNfY291bnRfOworICB9CiAKICAgYmFzZTo6VGltZURlbHRhIEdldFN0b3BXYXRjaFR5cGVEdXJhdGlvbihTdG9wV2F0Y2hUeXBlIHR5cGUpIGNvbnN0OwogCkBAIC03NSw2ICs4MSw5IEBACiAgIC8vIGluIHxGbHVzaFBlcmlvZGljVHJhY2tpbmd8LgogICBpbnQgYm94ZXNfY3JlYXRlZF9jb3VudF87CiAgIGludCBib3hlc19kZXN0cm95ZWRfY291bnRfOworICBpbnQgdXBkYXRlX3NpemVfY291bnRfOworICBpbnQgcmVuZGVyX2FuZF9hbmltYXRlX2NvdW50XzsKKyAgaW50IHVwZGF0ZV9jcm9zc19yZWZlcmVuY2VzX2NvdW50XzsKIAogICAvLyBTdG9wIHdhdGNoLXJlbGF0ZWQuCiAgIHN0ZDo6dmVjdG9yPGJhc2U6OlRpbWVEZWx0YT4gc3RvcF93YXRjaF9kdXJhdGlvbnNfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X3VuaXQuaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF91bml0LmgKaW5kZXggMjA4M2EyMy4uZDY1ZjA4ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X3VuaXQuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfdW5pdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX0xBWU9VVF9VTklUX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfTEFZT1VUX1VOSVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF91bml0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L2xheW91dC9sYXlvdXRfdW5pdF90ZXN0LmNjCmluZGV4IDE3ZmI4OTcuLjcyMWUzYWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2xheW91dF91bml0X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGF5b3V0X3VuaXRfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2xheW91dF91bml0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xldHRlcmJveGVkX2ltYWdlLmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGV0dGVyYm94ZWRfaW1hZ2UuY2MKaW5kZXggOTRkMzM5MS4uZmRhZDg4YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGV0dGVyYm94ZWRfaW1hZ2UuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGV0dGVyYm94ZWRfaW1hZ2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9sZXR0ZXJib3hlZF9pbWFnZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9sZXR0ZXJib3hlZF9pbWFnZS5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGV0dGVyYm94ZWRfaW1hZ2UuaAppbmRleCAzNjI0NjA5Li45MjBmYzZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9sZXR0ZXJib3hlZF9pbWFnZS5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2xldHRlcmJveGVkX2ltYWdlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfTEVUVEVSQk9YRURfSU1BR0VfSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9MRVRURVJCT1hFRF9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGV0dGVyYm94ZWRfaW1hZ2VfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L2xldHRlcmJveGVkX2ltYWdlX3Rlc3QuY2MKaW5kZXggZDAyOTg0My4uZmU5NDBlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvbGV0dGVyYm94ZWRfaW1hZ2VfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9sZXR0ZXJib3hlZF9pbWFnZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvbGV0dGVyYm94ZWRfaW1hZ2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guY2MgYi9zcmMvY29iYWx0L2xheW91dC9saW5lX2JveC5jYwppbmRleCA5Mjk0MGQxLi5lNGYzZWVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9saW5lX2JveC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9saW5lX2JveC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L2xpbmVfYm94LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xpbmVfYm94LmggYi9zcmMvY29iYWx0L2xheW91dC9saW5lX2JveC5oCmluZGV4IGFmOTdmYWEuLjNlNzNiNDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L2xpbmVfYm94LmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV9ib3guaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9MSU5FX0JPWF9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0xJTkVfQk9YX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9saW5lX3dyYXBwaW5nLmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV93cmFwcGluZy5jYwppbmRleCBhNDA2Nzc3Li4zMGI3NDU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9saW5lX3dyYXBwaW5nLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L2xpbmVfd3JhcHBpbmcuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9saW5lX3dyYXBwaW5nLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L2xpbmVfd3JhcHBpbmcuaCBiL3NyYy9jb2JhbHQvbGF5b3V0L2xpbmVfd3JhcHBpbmcuaAppbmRleCBlYTY0MDY3Li5iNmU3ZGQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9saW5lX3dyYXBwaW5nLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvbGluZV93cmFwcGluZy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5gCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuYAogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfTElORV9XUkFQUElOR19IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX0xJTkVfV1JBUFBJTkdfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3BhcmFncmFwaC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L3BhcmFncmFwaC5jYwppbmRleCA5NzgxMjczLi4yNjc1YzQxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9wYXJhZ3JhcGguY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvcGFyYWdyYXBoLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvcGFyYWdyYXBoLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3BhcmFncmFwaC5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvcGFyYWdyYXBoLmgKaW5kZXggMzY0MjE4Yy4uMWQ5MGVlYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvcGFyYWdyYXBoLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvcGFyYWdyYXBoLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfUEFSQUdSQVBIX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfUEFSQUdSQVBIX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC9yZW5kZXJfdHJlZV9hbmltYXRpb25zLmggYi9zcmMvY29iYWx0L2xheW91dC9yZW5kZXJfdHJlZV9hbmltYXRpb25zLmgKaW5kZXggZTIwODdhYi4uYzY1OWQwMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvcmVuZGVyX3RyZWVfYW5pbWF0aW9ucy5oCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L3JlbmRlcl90cmVlX2FuaW1hdGlvbnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9SRU5ERVJfVFJFRV9BTklNQVRJT05TX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfUkVOREVSX1RSRUVfQU5JTUFUSU9OU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvcmVwbGFjZWRfYm94LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvcmVwbGFjZWRfYm94LmNjCmluZGV4IDAxNjNmMDYuLjYzMDA1MmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L3JlcGxhY2VkX2JveC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dC9yZXBsYWNlZF9ib3guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9yZXBsYWNlZF9ib3guaCIKIApAQCAtMjMsNyArMjEsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2ZpbHRlcl9mdW5jdGlvbl9saXN0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2tleXdvcmRfdmFsdWUuaCIKLSNpbmNsdWRlICJjb2JhbHQvY3Nzb20vbXRtX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L2Nzc29tL21hcF90b19tZXNoX2Z1bmN0aW9uLmgiCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9jb250YWluZXJfYm94LmgiCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC9sZXR0ZXJib3hlZF9pbWFnZS5oIgogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvdXNlZF9zdHlsZS5oIgpAQCAtOTEsNiArODksNyBAQAogICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPExheW91dFVuaXQ+JiBtYXliZV9pbnRyaW5zaWNfaGVpZ2h0LAogICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPGZsb2F0PiYgbWF5YmVfaW50cmluc2ljX3JhdGlvLAogICAgIFVzZWRTdHlsZVByb3ZpZGVyKiB1c2VkX3N0eWxlX3Byb3ZpZGVyLAorICAgIGJhc2U6Om9wdGlvbmFsPGJvb2w+IGlzX3ZpZGVvX3B1bmNoZWRfb3V0LAogICAgIExheW91dFN0YXRUcmFja2VyKiBsYXlvdXRfc3RhdF90cmFja2VyKQogICAgIDogQm94KGNzc19jb21wdXRlZF9zdHlsZV9kZWNsYXJhdGlvbiwgdXNlZF9zdHlsZV9wcm92aWRlciwKICAgICAgICAgICBsYXlvdXRfc3RhdF90cmFja2VyKSwKQEAgLTEwMyw3ICsxMDIsOCBAQAogICAgICAgcmVwbGFjZV9pbWFnZV9jYl8ocmVwbGFjZV9pbWFnZV9jYiksCiAgICAgICBzZXRfYm91bmRzX2NiXyhzZXRfYm91bmRzX2NiKSwKICAgICAgIHBhcmFncmFwaF8ocGFyYWdyYXBoKSwKLSAgICAgIHRleHRfcG9zaXRpb25fKHRleHRfcG9zaXRpb24pIHt9CisgICAgICB0ZXh0X3Bvc2l0aW9uXyh0ZXh0X3Bvc2l0aW9uKSwKKyAgICAgIGlzX3ZpZGVvX3B1bmNoZWRfb3V0Xyhpc192aWRlb19wdW5jaGVkX291dCkge30KIAogV3JhcFJlc3VsdCBSZXBsYWNlZEJveDo6VHJ5V3JhcEF0KAogICAgIFdyYXBBdFBvbGljeSAvKndyYXBfYXRfcG9saWN5Ki8sCkBAIC0xOTIsOCArMTkyLDYgQEAKICAgcmV0dXJuIEdldE1hcmdpbkJveEhlaWdodCgpOwogfQogCi0jaWYgIVBVTkNIX1RIUk9VR0hfVklERU9fUkVOREVSSU5HCi0KIG5hbWVzcGFjZSB7CiAKIHZvaWQgQWRkTGV0dGVyYm94RmlsbFJlY3RzKGNvbnN0IExldHRlcmJveERpbWVuc2lvbnMmIGRpbWVuc2lvbnMsCkBAIC0yNDcsOCArMjQ1LDYgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKLSNlbmRpZiAgLy8gIVBVTkNIX1RIUk9VR0hfVklERU9fUkVOREVSSU5HCi0KIHZvaWQgUmVwbGFjZWRCb3g6OlJlbmRlckFuZEFuaW1hdGVDb250ZW50KAogICAgIENvbXBvc2l0aW9uTm9kZTo6QnVpbGRlciogYm9yZGVyX25vZGVfYnVpbGRlcikgY29uc3QgewogICBpZiAoY29tcHV0ZWRfc3R5bGUoKS0+dmlzaWJpbGl0eSgpICE9IGNzc29tOjpLZXl3b3JkVmFsdWU6OkdldFZpc2libGUoKSkgewpAQCAtMjU2LDYgKzI1MiwxNiBAQAogICB9CiAKICAgaWYgKHJlcGxhY2VfaW1hZ2VfY2JfLmlzX251bGwoKSkgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChpc192aWRlb19wdW5jaGVkX291dF8gPT0gYmFzZTo6bnVsbG9wdCkgeworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgYSBkYXRhIHN0cmVhbSBhc3NvY2lhdGVkIHdpdGggdGhpcyB2aWRlbyBbeWV0XSwgdGhlbgorICAgIC8vIHdlIGRvbid0IHlldCBrbm93IGlmIGl0IGlzIHB1bmNoZWQgb3V0IG9yIG5vdCwgYW5kIHNvIHJlbmRlciBibGFjay4KKyAgICBib3JkZXJfbm9kZV9idWlsZGVyLT5BZGRDaGlsZChuZXcgUmVjdE5vZGUoCisgICAgICAgIG1hdGg6OlJlY3RGKGNvbnRlbnRfYm94X3NpemUoKSksCisgICAgICAgIHNjb3BlZF9wdHI8cmVuZGVyX3RyZWU6OkJydXNoPihuZXcgcmVuZGVyX3RyZWU6OlNvbGlkQ29sb3JCcnVzaCgKKyAgICAgICAgICAgIHJlbmRlcl90cmVlOjpDb2xvclJHQkEoMC4wZiwgMC4wZiwgMC4wZiwgMS4wZikpKSkpOwogICAgIC8vIE5vdGhpbmcgdG8gcmVuZGVyLgogICAgIHJldHVybjsKICAgfQpAQCAtMjY3LDMzICsyNzMsMzYgQEAKICAgc2NvcGVkX3JlZnB0cjxDb21wb3NpdGlvbk5vZGU+IGNvbXBvc2l0aW9uX25vZGUgPQogICAgICAgbmV3IENvbXBvc2l0aW9uTm9kZShjb21wb3NpdGlvbl9ub2RlX2J1aWxkZXIpOwogCi0jaWYgUFVOQ0hfVEhST1VHSF9WSURFT19SRU5ERVJJTkcKLSAgLy8gRm9yIHN5c3RlbXMgdGhhdCBoYXZlIHRoZWlyIG93biBwYXRoIHRvIGJsaXR0aW5nIHZpZGVvIHRvIHRoZSBkaXNwbGF5LCB3ZQotICAvLyBzaW1wbHkgcHVuY2ggYSBob2xlIHRocm91Z2ggb3VyIHNjZW5lIHNvIHRoYXQgdGhlIHZpZGVvIGNhbiBhcHBlYXIgdGhlcmUuCi0gIFB1bmNoVGhyb3VnaFZpZGVvTm9kZTo6QnVpbGRlciBidWlsZGVyKG1hdGg6OlJlY3RGKGNvbnRlbnRfYm94X3NpemUoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldF9ib3VuZHNfY2JfKTsKLSAgTm9kZSogZnJhbWVfbm9kZSA9IG5ldyBQdW5jaFRocm91Z2hWaWRlb05vZGUoYnVpbGRlcik7Ci0jZWxzZQotICBBbmltYXRlTm9kZTo6QnVpbGRlciBhbmltYXRlX25vZGVfYnVpbGRlcjsKLSAgYW5pbWF0ZV9ub2RlX2J1aWxkZXIuQWRkKAotICAgICAgY29tcG9zaXRpb25fbm9kZSwgYmFzZTo6QmluZChBbmltYXRlQ0IsIHJlcGxhY2VfaW1hZ2VfY2JfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZW50X2JveF9zaXplKCkpKTsKKyAgc2NvcGVkX3JlZnB0cjxOb2RlPiBmcmFtZV9ub2RlOworICBpZiAoKmlzX3ZpZGVvX3B1bmNoZWRfb3V0XykgeworICAgIC8vIEZvciBzeXN0ZW1zIHRoYXQgaGF2ZSB0aGVpciBvd24gcGF0aCB0byBibGl0dGluZyB2aWRlbyB0byB0aGUgZGlzcGxheSwgd2UKKyAgICAvLyBzaW1wbHkgcHVuY2ggYSBob2xlIHRocm91Z2ggb3VyIHNjZW5lIHNvIHRoYXQgdGhlIHZpZGVvIGNhbiBhcHBlYXIgdGhlcmUuCisgICAgUHVuY2hUaHJvdWdoVmlkZW9Ob2RlOjpCdWlsZGVyIGJ1aWxkZXIobWF0aDo6UmVjdEYoY29udGVudF9ib3hfc2l6ZSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXRfYm91bmRzX2NiXyk7CisgICAgZnJhbWVfbm9kZSA9IG5ldyBQdW5jaFRocm91Z2hWaWRlb05vZGUoYnVpbGRlcik7CisgIH0gZWxzZSB7CisgICAgQW5pbWF0ZU5vZGU6OkJ1aWxkZXIgYW5pbWF0ZV9ub2RlX2J1aWxkZXI7CisgICAgYW5pbWF0ZV9ub2RlX2J1aWxkZXIuQWRkKAorICAgICAgICBjb21wb3NpdGlvbl9ub2RlLAorICAgICAgICBiYXNlOjpCaW5kKEFuaW1hdGVDQiwgcmVwbGFjZV9pbWFnZV9jYl8sIGNvbnRlbnRfYm94X3NpemUoKSkpOwogCi0gIE5vZGUqIGZyYW1lX25vZGUgPSBuZXcgQW5pbWF0ZU5vZGUoYW5pbWF0ZV9ub2RlX2J1aWxkZXIsIGNvbXBvc2l0aW9uX25vZGUpOwotI2VuZGlmICAvLyBQVU5DSF9USFJPVUdIX1ZJREVPX1JFTkRFUklORworICAgIGZyYW1lX25vZGUgPSBuZXcgQW5pbWF0ZU5vZGUoYW5pbWF0ZV9ub2RlX2J1aWxkZXIsIGNvbXBvc2l0aW9uX25vZGUpOworICB9CiAKLSAgY29uc3QgY3Nzb206Ok1UTUZ1bmN0aW9uKiBtdG1fZmlsdGVyX2Z1bmN0aW9uID0KLSAgICAgIGNzc29tOjpNVE1GdW5jdGlvbjo6RXh0cmFjdEZyb21GaWx0ZXJMaXN0KGNvbXB1dGVkX3N0eWxlKCktPmZpbHRlcigpKTsKKyAgY29uc3QgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uKiBtdG1fZmlsdGVyX2Z1bmN0aW9uID0KKyAgICAgIGNzc29tOjpNYXBUb01lc2hGdW5jdGlvbjo6RXh0cmFjdEZyb21GaWx0ZXJMaXN0KAorICAgICAgICAgIGNvbXB1dGVkX3N0eWxlKCktPmZpbHRlcigpKTsKIAotICBOb2RlKiBjb250ZW50X25vZGUgPSBOVUxMOworICBzY29wZWRfcmVmcHRyPE5vZGU+IGNvbnRlbnRfbm9kZTsKICAgaWYgKG10bV9maWx0ZXJfZnVuY3Rpb24pIHsKLSAgICBjb25zdCBjc3NvbTo6TVRNRnVuY3Rpb246Ok1lc2hTcGVjJiBzcGVjID0gbXRtX2ZpbHRlcl9mdW5jdGlvbi0+bWVzaF9zcGVjKCk7CisgICAgY29uc3QgY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjpNZXNoU3BlYyYgc3BlYyA9CisgICAgICAgIG10bV9maWx0ZXJfZnVuY3Rpb24tPm1lc2hfc3BlYygpOwogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Y3Nzb206OktleXdvcmRWYWx1ZT4mIHN0ZXJlb19tb2RlX2tleXdvcmRfdmFsdWUgPQogICAgICAgICBtdG1fZmlsdGVyX2Z1bmN0aW9uLT5zdGVyZW9fbW9kZSgpOwogICAgIHJlbmRlcl90cmVlOjpTdGVyZW9Nb2RlIHN0ZXJlb19tb2RlID0KICAgICAgICAgUmVhZFN0ZXJlb01vZGUoc3RlcmVvX21vZGVfa2V5d29yZF92YWx1ZSk7CiAKLSAgICBpZiAoc3BlYy5tZXNoX3R5cGUoKSA9PSBjc3NvbTo6TVRNRnVuY3Rpb246OmtVcmxzKSB7CisgICAgaWYgKHNwZWMubWVzaF90eXBlKCkgPT0gY3Nzb206Ok1hcFRvTWVzaEZ1bmN0aW9uOjprVXJscykgewogICAgICAgLy8gQ3VzdG9tIG1lc2ggVVJMcy4KICAgICAgIGNzc29tOjpVUkxWYWx1ZSogdXJsX3ZhbHVlID0KICAgICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxjc3NvbTo6VVJMVmFsdWUqPihzcGVjLm1lc2hfdXJsKCkuZ2V0KCkpOwpAQCAtMzA1LDcgKzMxNCw3IEBACiAKICAgICAgIGNvbnRlbnRfbm9kZSA9CiAgICAgICAgICAgbmV3IEZpbHRlck5vZGUoTWFwVG9NZXNoRmlsdGVyKHN0ZXJlb19tb2RlLCBtZXNoKSwgZnJhbWVfbm9kZSk7Ci0gICAgfSBlbHNlIGlmIChzcGVjLm1lc2hfdHlwZSgpID09IGNzc29tOjpNVE1GdW5jdGlvbjo6a0VxdWlyZWN0YW5ndWxhcikgeworICAgIH0gZWxzZSBpZiAoc3BlYy5tZXNoX3R5cGUoKSA9PSBjc3NvbTo6TWFwVG9NZXNoRnVuY3Rpb246OmtFcXVpcmVjdGFuZ3VsYXIpIHsKICAgICAgIC8vIERlZmF1bHQgZXF1aXJlY3Rhbmd1bGFyIG1lc2guCiAgICAgICBjb250ZW50X25vZGUgPSBuZXcgRmlsdGVyTm9kZShNYXBUb01lc2hGaWx0ZXIoc3RlcmVvX21vZGUpLCBmcmFtZV9ub2RlKTsKICAgICB9IGVsc2UgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvcmVwbGFjZWRfYm94LmggYi9zcmMvY29iYWx0L2xheW91dC9yZXBsYWNlZF9ib3guaAppbmRleCBhYWE2Y2JjLi42ODMzOTYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC9yZXBsYWNlZF9ib3guaAorKysgYi9zcmMvY29iYWx0L2xheW91dC9yZXBsYWNlZF9ib3guaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9SRVBMQUNFRF9CT1hfSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9SRVBMQUNFRF9CT1hfSF8KQEAgLTI4LDE2ICsyNiw2IEBACiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2ltYWdlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3B1bmNoX3Rocm91Z2hfdmlkZW9fbm9kZS5oIgogCi0vLyBIZXJlIHdlIGRldGVybWluZSBpZiB3ZSBhcmUgZ29pbmcgdG8gYmUgcmVuZGVyaW5nIHZpZGVvIG91cnNlbHZlcywgb3IgaWYKLS8vIHRoZSBTdGFyYm9hcmQgUGxheWVyIHN5c3RlbSB3aWxsIGJlIHJlbmRlcmluZyB2aWRlbyBpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8KLS8vIHB1bmNoIHRocm91Z2ggb3VyIHNjZW5lIHNvIHRoYXQgdGhlIHZpZGVvIHdpbGwgYmUgdmlzaWJsZS4KLSNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKLSNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgotI2RlZmluZSBQVU5DSF9USFJPVUdIX1ZJREVPX1JFTkRFUklORyBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCi0jZWxzZSAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCi0jZGVmaW5lIFBVTkNIX1RIUk9VR0hfVklERU9fUkVOREVSSU5HIDAKLSNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCi0KIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIGxheW91dCB7CiAKQEAgLTYxLDYgKzQ5LDcgQEAKICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6b3B0aW9uYWw8TGF5b3V0VW5pdD4mIG1heWJlX2ludHJpbnNpY19oZWlnaHQsCiAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6Om9wdGlvbmFsPGZsb2F0PiYgbWF5YmVfaW50cmluc2ljX3JhdGlvLAogICAgICAgICAgICAgICBVc2VkU3R5bGVQcm92aWRlciogdXNlZF9zdHlsZV9wcm92aWRlciwKKyAgICAgICAgICAgICAgYmFzZTo6b3B0aW9uYWw8Ym9vbD4gaXNfdmlkZW9fcHVuY2hlZF9vdXQsCiAgICAgICAgICAgICAgIExheW91dFN0YXRUcmFja2VyKiBsYXlvdXRfc3RhdF90cmFja2VyKTsKIAogICAvLyBGcm9tIHxCb3h8LgpAQCAtMTIwLDYgKzEwOSw3IEBACiAKICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQYXJhZ3JhcGg+IHBhcmFncmFwaF87CiAgIGludDMyIHRleHRfcG9zaXRpb25fOworICBiYXNlOjpvcHRpb25hbDxib29sPiBpc192aWRlb19wdW5jaGVkX291dF87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbGF5b3V0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC90ZXh0X2JveC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L3RleHRfYm94LmNjCmluZGV4IDlkYWQzNWIuLmExM2IxYzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L3RleHRfYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L3RleHRfYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvdGV4dF9ib3guaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvdGV4dF9ib3guaCBiL3NyYy9jb2JhbHQvbGF5b3V0L3RleHRfYm94LmgKaW5kZXggYzcwMDhlYi4uYzU5OWJmYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXQvdGV4dF9ib3guaAorKysgYi9zcmMvY29iYWx0L2xheW91dC90ZXh0X2JveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX1RFWFRfQk9YX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfVEVYVF9CT1hfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGUuY2MgYi9zcmMvY29iYWx0L2xheW91dC91c2VkX3N0eWxlLmNjCmluZGV4IDA0NjRiZjkuLjk2MTNmNDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGUuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvdXNlZF9zdHlsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXQvdXNlZF9zdHlsZS5oIGIvc3JjL2NvYmFsdC9sYXlvdXQvdXNlZF9zdHlsZS5oCmluZGV4IGIzMjEyYzkuLjY3YTgyODcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGUuaAorKysgYi9zcmMvY29iYWx0L2xheW91dC91c2VkX3N0eWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfVVNFRF9TVFlMRV9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX1VTRURfU1RZTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L3VzZWRfc3R5bGVfdGVzdC5jYwppbmRleCAwMTcwYTI5Li45MWVlYjkxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC91c2VkX3N0eWxlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvdXNlZF9zdHlsZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvdXNlZF9zdHlsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dC93aGl0ZV9zcGFjZV9wcm9jZXNzaW5nLmNjIGIvc3JjL2NvYmFsdC9sYXlvdXQvd2hpdGVfc3BhY2VfcHJvY2Vzc2luZy5jYwppbmRleCBiMzczNmM4Li5iODg2ZmI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC93aGl0ZV9zcGFjZV9wcm9jZXNzaW5nLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0L3doaXRlX3NwYWNlX3Byb2Nlc3NpbmcuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dC93aGl0ZV9zcGFjZV9wcm9jZXNzaW5nLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3doaXRlX3NwYWNlX3Byb2Nlc3NpbmcuaCBiL3NyYy9jb2JhbHQvbGF5b3V0L3doaXRlX3NwYWNlX3Byb2Nlc3NpbmcuaAppbmRleCAzNTA4YmYzLi45ZTJiNzEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC93aGl0ZV9zcGFjZV9wcm9jZXNzaW5nLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvd2hpdGVfc3BhY2VfcHJvY2Vzc2luZy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS5gCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuYAogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfV0hJVEVfU1BBQ0VfUFJPQ0VTU0lOR19IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX1dISVRFX1NQQUNFX1BST0NFU1NJTkdfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0L3doaXRlX3NwYWNlX3Byb2Nlc3NpbmdfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0L3doaXRlX3NwYWNlX3Byb2Nlc3NpbmdfdGVzdC5jYwppbmRleCA2YmQxNzk1Li4yZDAwNDhhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dC93aGl0ZV9zcGFjZV9wcm9jZXNzaW5nX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXQvd2hpdGVfc3BhY2VfcHJvY2Vzc2luZ190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sYXlvdXQvd2hpdGVfc3BhY2VfcHJvY2Vzc2luZy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfYmVuY2htYXJrcy5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF9iZW5jaG1hcmtzLmNjCmluZGV4IGJhY2UxZWQuLmIyODljYzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF9iZW5jaG1hcmtzLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF9iZW5jaG1hcmtzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3V0aWwuaCIKICNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3NuYXBzaG90LmNjIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3NuYXBzaG90LmNjCmluZGV4IDVmYjhiY2UuLmI1NzcyNzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF9zbmFwc2hvdC5jYworKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfc25hcHNob3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfc25hcHNob3QuaCIKIApAQCAtODYsOCArODQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICZydW5fbG9vcCwgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSksCiAgICAgICBiYXNlOjpCaW5kKCZXZWJNb2R1bGVFcnJvckNhbGxiYWNrLCAmcnVuX2xvb3AsIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpLAogICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19jbG9zZV9jYWxsYmFjayAqLywgc3R1Yl9tZWRpYV9tb2R1bGUuZ2V0KCksCi0gICAgICAmbmV0d29ya19tb2R1bGUsIHZpZXdwb3J0X3NpemUsIHJlc291cmNlX3Byb3ZpZGVyLCA2MC4wZiwKLSAgICAgIHdlYl9tb2R1bGVfb3B0aW9ucyk7CisgICAgICAmbmV0d29ya19tb2R1bGUsIHZpZXdwb3J0X3NpemUsIHJlc291cmNlX3Byb3ZpZGVyLAorICAgICAgc3R1Yl9tZWRpYV9tb2R1bGUtPnN5c3RlbV93aW5kb3coKSwgNjAuMGYsIHdlYl9tb2R1bGVfb3B0aW9ucyk7CiAKICAgcnVuX2xvb3AuUnVuKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF9zbmFwc2hvdC5oIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3NuYXBzaG90LmgKaW5kZXggYjFkZWU3Zi4uOGZkZmRlMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3NuYXBzaG90LmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3NuYXBzaG90LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfVEVTVFNfTEFZT1VUX1NOQVBTSE9UX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfVEVTVFNfTEFZT1VUX1NOQVBTSE9UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfdGVzdHMuY2MgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfdGVzdHMuY2MKaW5kZXggMzhhZGI4Ni4uZWMwY2UwNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3Rlc3RzLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF90ZXN0cy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxvc3RyZWFtPgogI2luY2x1ZGUgPHZlY3Rvcj4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF90ZXN0cy5neXAgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy9sYXlvdXRfdGVzdHMuZ3lwCmluZGV4IDQ1NGUzZjIuLjE3OTczMmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL2xheW91dF90ZXN0cy5neXAKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvbGF5b3V0X3Rlc3RzLmd5cApAQCAtNjQsMTMgKzY0LDEzIEBACiAgICAgICAgICdsYXlvdXRfdGVzdHMuY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3NlcicsCiAgICAgICAgICMgRGVwZW5kIG9uIGJyb3dzZXJfY29weV90ZXN0X2RhdGEgc28gdGhhdCB3ZSBlbnN1cmUgZXh0ZXJuYWwgdGVzdHMKICAgICAgICAgIyBmaWxlcyBmcm9tIGJyb3dzZXIgdGhhdCB3ZSBsaW5rIHRvIGFyZSBhdmFpbGFibGUuCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cDpicm93c2VyX2NvcHlfdGVzdF9kYXRhJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXA6cmVuZGVyX3RyZWVfcGl4ZWxfdGVzdGVyJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL2dvb2dsZXVybC9nb29nbGV1cmwuZ3lwOmdvb2dsZXVybCcsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCkBAIC0xMjYsMTIgKzEyNiwxMiBAQAogICAgICAgICAnd2ViX3BsYXRmb3JtX3Rlc3RzLmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXIuZ3lwOmJyb3dzZXInLAogICAgICAgICAjIERlcGVuZCBvbiBicm93c2VyX2NvcHlfdGVzdF9kYXRhIHNvIHRoYXQgd2UgZW5zdXJlIGV4dGVybmFsIHRlc3RzCiAgICAgICAgICMgZmlsZXMgZnJvbSBicm93c2VyIHRoYXQgd2UgbGluayB0byBhcmUgYXZhaWxhYmxlLgogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jyb3dzZXIvYnJvd3Nlci5neXA6YnJvd3Nlcl9jb3B5X3Rlc3RfZGF0YScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS9nb29nbGV1cmwvZ29vZ2xldXJsLmd5cDpnb29nbGV1cmwnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdF9wYXJzZXIuY2MgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3BhcnNlci5jYwppbmRleCAyZjI0OTcwLi5lOWZlN2M1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3BhcnNlci5jYworKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3BhcnNlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RfcGFyc2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RfcGFyc2VyLmggYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3BhcnNlci5oCmluZGV4IDdjMjk3NTYuLjFlOGM0NTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RfcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdF9wYXJzZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xBWU9VVF9URVNUU19URVNUX1BBUlNFUl9IXwogI2RlZmluZSBDT0JBTFRfTEFZT1VUX1RFU1RTX1RFU1RfUEFSU0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3V0aWxzLmNjIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdF91dGlscy5jYwppbmRleCA3ZDNmYzRhLi43NjJkZWFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3V0aWxzLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RfdXRpbHMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3V0aWxzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RfdXRpbHMuaCBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RfdXRpbHMuaAppbmRleCA5OWVhMmE3Li5kMGRkMTgwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0X3V0aWxzLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdF91dGlscy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTEFZT1VUX1RFU1RTX1RFU1RfVVRJTFNfSF8KICNkZWZpbmUgQ09CQUxUX0xBWU9VVF9URVNUU19URVNUX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvY29uc29sZS10cmFjZS1zaG91bGQtbm90LWNyYXNoLmpzIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvY29iYWx0L2NvbnNvbGUtdHJhY2Utc2hvdWxkLW5vdC1jcmFzaC5qcwppbmRleCAyOGNjZGIzLi5lNmZiZWM4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS9jb2JhbHQvY29uc29sZS10cmFjZS1zaG91bGQtbm90LWNyYXNoLmpzCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL2NvYmFsdC9jb25zb2xlLXRyYWNlLXNob3VsZC1ub3QtY3Jhc2guanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBDYWxsIGZyb20gZXh0ZXJuYWwgSmF2YVNjcmlwdCBmaWxlLgogLy8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3Rlc3RkYXRhL3dlYi1wbGF0Zm9ybS10ZXN0cy9YTUxIdHRwUmVxdWVzdC93ZWJfcGxhdGZvcm1fdGVzdHMudHh0IGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvd2ViLXBsYXRmb3JtLXRlc3RzL1hNTEh0dHBSZXF1ZXN0L3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQKaW5kZXggMWMyNDU1Yy4uYjU0Y2I3NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvd2ViLXBsYXRmb3JtLXRlc3RzL1hNTEh0dHBSZXF1ZXN0L3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvd2ViLXBsYXRmb3JtLXRlc3RzL1hNTEh0dHBSZXF1ZXN0L3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQKQEAgLTkyLDcgKzkyLDggQEAKIG92ZXJyaWRlbWltZXR5cGUtb3Blbi1zdGF0ZS1mb3JjZS14bWwuaHRtLERJU0FCTEUKICMgQ2hlY2sgZmFpbGVkOiBJc1N0cmluZ1VURjgoKQogb3ZlcnJpZGVtaW1ldHlwZS11bnNlbnQtc3RhdGUtZm9yY2Utc2hpZnRqaXMuaHRtLERJU0FCTEUKLXByZXNlcnZlLXVhLWhlYWRlci1vbi1yZWRpcmVjdC5odG0sRkFJTAorcHJlc2VydmUtdWEtaGVhZGVyLW9uLXJlZGlyZWN0Lmh0bSxQQVNTCitwcmVzZXJ2ZS11YS1oZWFkZXItb24tcmVkaXJlY3QuaHRtLEZBSUwsWE1MSHR0cFJlcXVlc3Q6IFVzZXItQWdlbnQgaGVhZGVyIGlzIHByZXNlcnZlZCBvbiByZWRpcmVjdCAxCiBwcm9ncmVzcy1ldmVudHMtcmVzcG9uc2UtZGF0YS1nemlwLmh0bSxQQVNTCiByZXNwb25zZS1kYXRhLWFycmF5YnVmZmVyLmh0bSxQQVNTCiByZXNwb25zZS1kYXRhLWJsb2IuaHRtLEZBSUwKQEAgLTEwMiwxNCArMTAzLDE2IEBACiByZXNwb25zZS1kYXRhLWd6aXAuaHRtLEZBSUwKIHJlc3BvbnNlLWRhdGEtcHJvZ3Jlc3MuaHRtLFBBU1MKIHJlc3BvbnNlLWludmFsaWQtcmVzcG9uc2V0eXBlLmh0bSxQQVNTCi1yZXNwb25zZS1qc29uLmh0bSxGQUlMCityZXNwb25zZS1qc29uLmh0bSxQQVNTCityZXNwb25zZS1qc29uLmh0bSxGQUlMLEpTT04gb2JqZWN0IHJvdW5kdHJpcAorcmVzcG9uc2UtanNvbi5odG0sRkFJTCxKU09OIHJvdW5kdHJpcCB3aXRoIEphcGFuZXNlIHRleHQKICMgU3luY2hyb25vdXMKIHJlc3BvbnNlLW1ldGhvZC5odG0sRkFJTAogIyBDaGVjayBmYWlsZWQ6IElzU3RyaW5nVVRGOCgpCiByZXNwb25zZXRleHQtZGVjb2RpbmcuaHRtLERJU0FCTEUKIHJlc3BvbnNlVGV4dC1zdGF0dXMuaHRtbCxQQVNTCiAjIFN5bmNocm9ub3VzCi1yZXNwb25zZXR5cGUuaHRtbCxGQUlMCityZXNwb25zZXR5cGUuaHRtbCxESVNBQkxFCiByZXNwb25zZXhtbC1iYXNpYy5odG0sRkFJTAogcmVzcG9uc2V4bWwtZG9jdW1lbnQtcHJvcGVydGllcy5odG0sRkFJTAogcmVzcG9uc2V4bWwtbWVkaWEtdHlwZS5odG0sRkFJTApAQCAtMTQxLDggKzE0NCw3IEBACiBzZW5kLWNvbnRlbnQtdHlwZS1zdHJpbmcuaHRtLEZBSUwKIHNlbmQtZGF0YS1hcnJheWJ1ZmZlci5odG0sRkFJTAogc2VuZC1kYXRhLWJsb2IuaHRtLEZBSUwKLXNlbmQtZGF0YS1lcy1vYmplY3QuaHRtLEZBSUwKLXNlbmQtZGF0YS1mb3JtZGF0YS5odG0sRkFJTAorc2VuZC1kYXRhLWVzLW9iamVjdC5odG0sRElTQUJMRQogc2VuZC1kYXRhLXVuZXhwZWN0ZWQtdG9zdHJpbmcuaHRtLEZBSUwKICMgU3luY2hyb25vdXMKIHNlbmQtZW50aXR5LWJvZHktYmFzaWMuaHRtLEZBSUwKQEAgLTE5MSwxMyArMTkzLDE0IEBACiBzZXRyZXF1ZXN0aGVhZGVyLWJlZm9yZS1vcGVuLmh0bSxQQVNTCiBzZXRyZXF1ZXN0aGVhZGVyLWJvZ3VzLW5hbWUuaHRtLEZBSUwKIHNldHJlcXVlc3RoZWFkZXItYm9ndXMtdmFsdWUuaHRtLEZBSUwKK3NldHJlcXVlc3RoZWFkZXItYm9ndXMtdmFsdWUuaHRtLFBBU1MsT21pdHRlZCB2YWx1ZSBhcmd1bWVudAogc2V0cmVxdWVzdGhlYWRlci1jYXNlLWluc2Vuc2l0aXZlLmh0bSxGQUlMCiAjIFN5bmNocm9ub3VzCiBzZXRyZXF1ZXN0aGVhZGVyLWNvbnRlbnQtdHlwZS5odG0sRkFJTAogc2V0cmVxdWVzdGhlYWRlci1oZWFkZXItYWxsb3dlZC5odG0sRkFJTAogc2V0cmVxdWVzdGhlYWRlci1oZWFkZXItZm9yYmlkZGVuLmh0bSxGQUlMCiBzZXRyZXF1ZXN0aGVhZGVyLW9wZW4tc2V0cmVxdWVzdGhlYWRlci5odG0sUEFTUwotc3RhdHVzLWFzeW5jLmh0bSxGQUlMCitzdGF0dXMtYXN5bmMuaHRtLERJU0FCTEUKIHN0YXR1cy1iYXNpYy5odG0sRkFJTAogc3RhdHVzLWVycm9yLmh0bSxQQVNTCiAjIEZsYWt5LgpAQCAtMjI0LDUgKzIyNyw3IEBACiB4bWxodHRwcmVxdWVzdC10aW1lb3V0LXdvcmtlci1zeW5jb253b3JrZXIuaHRtbCxESVNBQkxFCiB4bWxodHRwcmVxdWVzdC10aW1lb3V0LXdvcmtlci10d2ljZS5odG1sLERJU0FCTEUKIHhtbGh0dHByZXF1ZXN0LXVuc2VudC5odG0sUEFTUworWE1MSHR0cFJlcXVlc3Qtd2l0aENyZWRlbnRpYWxzLmh0bWwsUEFTUwogIyBTeW5jaHJvbm91cwotWE1MSHR0cFJlcXVlc3Qtd2l0aENyZWRlbnRpYWxzLmh0bWwsRkFJTAorWE1MSHR0cFJlcXVlc3Qtd2l0aENyZWRlbnRpYWxzLmh0bWwsRkFJTCxzZXR0aW5nIG9uIHN5bmNocm9ub3VzIFhIUgorWE1MSHR0cFJlcXVlc3Qtd2l0aENyZWRlbnRpYWxzLmh0bWwsRkFJTCxzZXR0aW5nIHdpdGhDcmVkZW50aWFscyB3aGVuIGluIERPTkUgc3RhdGUgKHN5bmNocm9ub3VzKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvd2ViLXBsYXRmb3JtLXRlc3RzL2RvbS93ZWJfcGxhdGZvcm1fdGVzdHMudHh0IGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvdGVzdGRhdGEvd2ViLXBsYXRmb3JtLXRlc3RzL2RvbS93ZWJfcGxhdGZvcm1fdGVzdHMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyZTQ4OGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy90ZXN0ZGF0YS93ZWItcGxhdGZvcm0tdGVzdHMvZG9tL3dlYl9wbGF0Zm9ybV90ZXN0cy50eHQKQEAgLTAsMCArMSw1MyBAQAorIyBNdXRhdGlvbk9ic2VydmVyIHRlc3RzCisKK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItYXR0cmlidXRlcy5odG1sLFBBU1MKKyMgVGhlc2UgZmFpbCBiZWNhdXNlIENvYmFsdCBkb2Vzbid0IHN1cHBvcnQgc2V0QXR0cmlidXRlTlMuCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWF0dHJpYnV0ZXMuaHRtbCxGQUlMLGF0dHJpYnV0ZXMgRWxlbWVudC5zZXRBdHRyaWJ1dGVOUzogY3JlYXRpb24gbXV0YXRpb24KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItYXR0cmlidXRlcy5odG1sLEZBSUwsYXR0cmlidXRlcyBFbGVtZW50LnNldEF0dHJpYnV0ZU5TOiBwcmVmaXhlZCBhdHRyaWJ1dGUgY3JlYXRpb24gbXV0YXRpb24KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItYXR0cmlidXRlcy5odG1sLEZBSUwsYXR0cmlidXRlcyBFbGVtZW50LnNldEF0dHJpYnV0ZU5TOiByZW1vdmFsIG11dGF0aW9uCisjIFRPRE86IFRyaWFnZSB0aGVzZSBmYWlsdXJlcy4KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItYXR0cmlidXRlcy5odG1sLEZBSUwsYXR0cmlidXRlcyBFbGVtZW50LmF0dHJpYnV0ZXMudmFsdWU6IHVwZGF0ZSBtdXRhdGlvbgorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1hdHRyaWJ1dGVzLmh0bWwsRkFJTCxhdHRyaWJ1dGVzIEhUTUxJbnB1dEVsZW1lbnQudHlwZTogdHlwZSB1cGRhdGUgbXV0YXRpb24KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItYXR0cmlidXRlcy5odG1sLEZBSUwsYXR0cmlidXRlcyBFbGVtZW50LmNsYXNzTGlzdC5hZGQ6IHNhbWUgdmFsdWUgbXV0YXRpb24KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItYXR0cmlidXRlcy5odG1sLEZBSUwsYXR0cmlidXRlcyBFbGVtZW50LmNsYXNzTGlzdC5yZW1vdmU6IG1pc3NpbmcgdG9rZW4gcmVtb3ZhbCBtdXRhdGlvbgorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1hdHRyaWJ1dGVzLmh0bWwsRkFJTCxhdHRyaWJ1dGVzIEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZTogdG9rZW4gcmVtb3ZhbCBtdXRhdGlvbgorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1hdHRyaWJ1dGVzLmh0bWwsRkFJTCxhdHRyaWJ1dGVzIEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZTogdG9rZW4gYWRkaXRpb24gbXV0YXRpb24KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItYXR0cmlidXRlcy5odG1sLEZBSUwsYXR0cmlidXRlcyBFbGVtZW50LmNsYXNzTGlzdC50b2dnbGU6IGZvcmNlZCB0b2tlbiByZW1vdmFsIG11dGF0aW9uCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWF0dHJpYnV0ZXMuaHRtbCxGQUlMLGF0dHJpYnV0ZXMgRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlOiBmb3JjZWQgdG9rZW4gcmVtb3ZhbCBubyBtdXRhdGlvbgorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1hdHRyaWJ1dGVzLmh0bWwsRkFJTCxhdHRyaWJ1dGVzIEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZTogZm9yY2VkIG1pc3NpbmcgdG9rZW4gcmVtb3ZhbCBubyBtdXRhdGlvbgorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1hdHRyaWJ1dGVzLmh0bWwsRkFJTCxhdHRyaWJ1dGVzIEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZTogZm9yY2VkIGV4aXN0aW5nIHRva2VuIGFkZGl0aW9uIG5vIG11dGF0aW9uCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWF0dHJpYnV0ZXMuaHRtbCxGQUlMLGF0dHJpYnV0ZXMgRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlOiBmb3JjZWQgZXhpc3RpbmcgdG9rZW4gcmVtb3ZhbCBubyBtdXRhdGlvbgorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1hdHRyaWJ1dGVzLmh0bWwsRkFJTCxhdHRyaWJ1dGVzIEVsZW1lbnQuY2xhc3NMaXN0LnRvZ2dsZTogZm9yY2VkIHRva2VuIGFkZGl0aW9uIG5vIG11dGF0aW9uCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWF0dHJpYnV0ZXMuaHRtbCxGQUlMLGF0dHJpYnV0ZXMgRWxlbWVudC5jbGFzc0xpc3QudG9nZ2xlOiBmb3JjZWQgdG9rZW4gYWRkaXRpb24gbXV0YXRpb24KKworIyBNb3N0IG9mIHRoZXNlIHRlc3RzIHVzZSBvcGVyYXRpb25zIHN1Y2ggYXMgaW5zZXJ0RGF0YSwgcmVwbGFjZURhdGEsIGV0Yy4sCisjIHdoaWNoIENvYmFsdCBkb2Vzbid0IHN1cHBvcnQuCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWNoYXJhY3RlckRhdGEuaHRtbCxGQUlMCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWNoYXJhY3RlckRhdGEuaHRtbCxQQVNTLGNoYXJhY3RlckRhdGEgVGV4dC5kYXRhOiBzaW1wbGUgbXV0YXRpb24gd2l0aG91dCBvbGRWYWx1ZQorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1jaGFyYWN0ZXJEYXRhLmh0bWwsUEFTUyxjaGFyYWN0ZXJEYXRhIFRleHQuZGF0YTogc2ltcGxlIG11dGF0aW9uCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWNoYXJhY3RlckRhdGEuaHRtbCxQQVNTLGNoYXJhY3RlckRhdGEvY2hhcmFjdGVyRGF0YU9sZFZhbHVlIGFsb25lIFRleHQuZGF0YTogc2ltcGxlIG11dGF0aW9uCisKK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItY2hpbGRMaXN0Lmh0bWwsUEFTUworIyBOb2RlLnRleHRDb250ZW50IHRlc3RzIGZhaWwgYmVjYXVzZSBzZXRfdGV4dF9jb250ZW50IGRvZXNuJ3QgcnVuIHRoZQorIyByZXBsYWNlLWFsbCBhbGdvcml0aG0gZXhhY3RseS4KKyMgVE9ETzogRml4IHRoaXMuCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWNoaWxkTGlzdC5odG1sLEZBSUwsY2hpbGRMaXN0IE5vZGUudGV4dENvbnRlbnQ6IHJlcGxhY2UgY29udGVudCBtdXRhdGlvbgorIyBDb2JhbHQgZG9lc24ndCBpbXBsZW1lbnQgTm9kZS5ub3JtYWxpemUuCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWNoaWxkTGlzdC5odG1sLEZBSUwsY2hpbGRMaXN0IE5vZGUubm9ybWFsaXplIG11dGF0aW9uCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWNoaWxkTGlzdC5odG1sLEZBSUwsY2hpbGRMaXN0IE5vZGUubm9ybWFsaXplIG11dGF0aW9ucworIyBUT0RPOiBJbnZlc3RpZ2F0ZSBmYWlsdXJlcy4KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItY2hpbGRMaXN0Lmh0bWwsRkFJTCxjaGlsZExpc3QgTm9kZS5pbnNlcnRCZWZvcmU6IGFkZGl0aW9uIG11dGF0aW9uCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWNoaWxkTGlzdC5odG1sLEZBSUwsY2hpbGRMaXN0IE5vZGUuaW5zZXJ0QmVmb3JlOiByZW1vdmFsIGFuZCBhZGRpdGlvbiBtdXRhdGlvbnMKKworbm9kZXMvTXV0YXRpb25PYnNlcnZlci1kaXNjb25uZWN0Lmh0bWwsUEFTUworCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWRvY3VtZW50Lmh0bWwsUEFTUworIyBUT0RPOiBJbnZlc3RpZ2F0ZSBmYWlsdXJlcy4KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItZG9jdW1lbnQuaHRtbCxGQUlMLHBhcnNlciBpbnNlcnRpb24gbXV0YXRpb25zCitub2Rlcy9NdXRhdGlvbk9ic2VydmVyLWRvY3VtZW50Lmh0bWwsRkFJTCxwYXJzZXIgc2NyaXB0IGluc2VydGlvbiBtdXRhdGlvbgorbm9kZXMvTXV0YXRpb25PYnNlcnZlci1kb2N1bWVudC5odG1sLEZBSUwscmVtb3ZhbCBvZiBwYXJlbnQgZHVyaW5nIHBhcnNpbmcKKworIyBUZXN0cyB0aGF0IHVzZSBpbm5lckh0bWwgYW5kIG91dGVySHRtbC4gR2l2ZXMgbGlieG1sIGVycm9ycy4KK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItaW5uZXItb3V0ZXIuaHRtbCxGQUlMCisKK25vZGVzL011dGF0aW9uT2JzZXJ2ZXItdGFrZVJlY29yZHMuaHRtbCxQQVNTCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy93ZWJfcGxhdGZvcm1fdGVzdF9wYXJzZXIuY2MgYi9zcmMvY29iYWx0L2xheW91dF90ZXN0cy93ZWJfcGxhdGZvcm1fdGVzdF9wYXJzZXIuY2MKaW5kZXggNTFmZWUzNS4uMjFkYzVjZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvd2ViX3BsYXRmb3JtX3Rlc3RfcGFyc2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0X3BhcnNlci5jYwpAQCAtMSwyMSArMSwxOSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaW5jbHVkZSAiY29iYWx0L2xheW91dF90ZXN0cy93ZWJfcGxhdGZvcm1fdGVzdF9wYXJzZXIuaCIKIAotI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8dXRpbGl0eT4KIAogI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCkBAIC02MiwxMyArNjAsMTQgQEAKICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGluZV9zdHJpbmcpIHsKICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+IHRlc3RfY2FzZV90b2tlbnM7CiAgIFRva2VuaXplKGxpbmVfc3RyaW5nLCAiLCIsICZ0ZXN0X2Nhc2VfdG9rZW5zKTsKLSAgaWYgKHRlc3RfY2FzZV90b2tlbnMuZW1wdHkoKSB8fCB0ZXN0X2Nhc2VfdG9rZW5zLnNpemUoKSA+IDIpIHsKKyAgaWYgKHRlc3RfY2FzZV90b2tlbnMuc2l6ZSgpIDwgMikgewogICAgIERMT0coV0FSTklORykgPDwgIkZhaWxlZCB0byBwYXJzZTogIiA8PCBsaW5lX3N0cmluZzsKICAgICByZXR1cm4gYmFzZTo6bnVsbG9wdDsKICAgfQogCi0gIFRyaW1XaGl0ZXNwYWNlQVNDSUkodGVzdF9jYXNlX3Rva2Vuc1swXSwgVFJJTV9BTEwsICZ0ZXN0X2Nhc2VfdG9rZW5zWzBdKTsKLSAgVHJpbVdoaXRlc3BhY2VBU0NJSSh0ZXN0X2Nhc2VfdG9rZW5zWzFdLCBUUklNX0FMTCwgJnRlc3RfY2FzZV90b2tlbnNbMV0pOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHRlc3RfY2FzZV90b2tlbnMuc2l6ZSgpOyArK2kpIHsKKyAgICBUcmltV2hpdGVzcGFjZUFTQ0lJKHRlc3RfY2FzZV90b2tlbnNbaV0sIFRSSU1fQUxMLCAmdGVzdF9jYXNlX3Rva2Vuc1tpXSk7CisgIH0KIAogICBzdGQ6OnN0cmluZyB0ZXN0X2V4cGVjdCA9IFN0cmluZ1RvTG93ZXJBU0NJSSh0ZXN0X2Nhc2VfdG9rZW5zWzFdKTsKICAgV2ViUGxhdGZvcm1UZXN0SW5mbzo6U3RhdGUgZXhwZWN0YXRpb24gPSBTdHJpbmdUb0V4cGVjdGF0aW9uKHRlc3RfZXhwZWN0KTsKQEAgLTc4LDYgKzc3LDkgQEAKICAgICBXZWJQbGF0Zm9ybVRlc3RJbmZvIHRlc3RfaW5mbzsKICAgICB0ZXN0X2luZm8udXJsID0gdGVzdF9jYXNlX3Rva2Vuc1swXTsKICAgICB0ZXN0X2luZm8uZXhwZWN0YXRpb24gPSBleHBlY3RhdGlvbjsKKyAgICBmb3IgKHNpemVfdCBpID0gMjsgaSA8IHRlc3RfY2FzZV90b2tlbnMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIHRlc3RfaW5mby5leGNlcHRpb25zLmluc2VydCh0ZXN0X2Nhc2VfdG9rZW5zW2ldKTsKKyAgICB9CiAgICAgcmV0dXJuIHRlc3RfaW5mbzsKICAgfQogfQpAQCAtMTEwLDkgKzExMiw5IEBACiAKICAgICBjb25zdCBjaGFyIGtDb21tZW50Q2hhciA9ICcjJzsKIAotICAgIHR5cGVkZWYgc3RkOjpzZXQ8V2ViUGxhdGZvcm1UZXN0SW5mbz4gVGVzdEluZm9TZXQ7Ci0gICAgVGVzdEluZm9TZXQgYWxsX3Rlc3RfaW5mb3M7Ci0gICAgZm9yIChzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBsaW5lX3Rva2Vucy5iZWdpbigpOworICAgIHR5cGVkZWYgc3RkOjptYXA8c3RkOjpzdHJpbmcsIFdlYlBsYXRmb3JtVGVzdEluZm8+IFRlc3RJbmZvTWFwOworICAgIFRlc3RJbmZvTWFwIGFsbF90ZXN0X2luZm9zOworICAgIGZvciAoc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gbGluZV90b2tlbnMuYmVnaW4oKTsKICAgICAgICAgIGl0ZXIgIT0gbGluZV90b2tlbnMuZW5kKCk7ICsraXRlcikgewogICAgICAgc3RkOjpzdHJpbmcgdHJpbW1lZF9saW5lOwogICAgICAgVHJpbVdoaXRlc3BhY2VBU0NJSSgqaXRlciwgVFJJTV9BTEwsICZ0cmltbWVkX2xpbmUpOwpAQCAtMTI3LDE2ICsxMjksMzEgQEAKICAgICAgIGlmIChwYXJzZWRfdGVzdF9pbmZvKSB7CiAgICAgICAgIFdlYlBsYXRmb3JtVGVzdEluZm8mIHRlc3RfaW5mbyA9ICpwYXJzZWRfdGVzdF9pbmZvOwogICAgICAgICB0ZXN0X2luZm8udXJsID0gdG9wX2xldmVsICsgIi8iICsgdGVzdF9pbmZvLnVybDsKLSAgICAgICAgc3RkOjpwYWlyPFRlc3RJbmZvU2V0OjppdGVyYXRvciwgYm9vbD4gcmV0ID0KLSAgICAgICAgICAgIGFsbF90ZXN0X2luZm9zLmluc2VydCh0ZXN0X2luZm8pOworICAgICAgICBzdGQ6OnBhaXI8VGVzdEluZm9NYXA6Oml0ZXJhdG9yLCBib29sPiByZXQgPQorICAgICAgICAgICAgYWxsX3Rlc3RfaW5mb3MuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHRlc3RfaW5mby51cmwsIHRlc3RfaW5mbykpOworICAgICAgICAvLyBJZiBpdCdzIHRoZSBzYW1lIHVybCwgbWVyZ2UgdGhlIGV4Y2VwdGlvbnMgaW50byB0aGUgb3JpZ2luYWwgb25lLgogICAgICAgICBpZiAocmV0LnNlY29uZCA9PSBmYWxzZSkgewotICAgICAgICAgIE5PVFJFQUNIRUQoKSA8PCAiRHVwbGljYXRlIGVudHJ5IGZvdW5kOiAiIDw8IHRlc3RfaW5mbzsKKyAgICAgICAgICAvLyBFbnN1cmUgdGhhdCBuZWl0aGVyIGV4cGVjdGF0aW9uIGlzIHNldCB0byBkaXNhYmxlLCBhbmQgdGhhdCB0aGUKKyAgICAgICAgICAvLyBleHBlY3RhdGlvbnMgYXJlIGRpZmZlcmVudC4KKyAgICAgICAgICBEQ0hFQ0tfTkUocmV0LmZpcnN0LT5zZWNvbmQuZXhwZWN0YXRpb24sCisgICAgICAgICAgICAgICAgICAgIFdlYlBsYXRmb3JtVGVzdEluZm86OmtEaXNhYmxlKTsKKyAgICAgICAgICBEQ0hFQ0tfTkUodGVzdF9pbmZvLmV4cGVjdGF0aW9uLCBXZWJQbGF0Zm9ybVRlc3RJbmZvOjprRGlzYWJsZSk7CisgICAgICAgICAgRENIRUNLX05FKHJldC5maXJzdC0+c2Vjb25kLmV4cGVjdGF0aW9uLCB0ZXN0X2luZm8uZXhwZWN0YXRpb24pOworCisgICAgICAgICAgLy8gVGhlcmUgc2hvdWxkIGJlIGF0IGxlYXN0IG9uZSB0ZXN0IGluIHRoZSBsaXN0IG9mIGV4Y2VwdGlvbnMgZm9yCisgICAgICAgICAgLy8gdGhlIG5ldyBvbmUuIEFwcGVuZCB0aGVzZSB0byB0aGUgZXhpc3RpbmcgZXhjZXB0aW9ucyBsaXN0LgorICAgICAgICAgIERDSEVDS19HVCh0ZXN0X2luZm8uZXhjZXB0aW9ucy5zaXplKCksIHNpemVfdCgwKSk7CisgICAgICAgICAgcmV0LmZpcnN0LT5zZWNvbmQuZXhjZXB0aW9ucy5pbnNlcnQodGVzdF9pbmZvLmV4Y2VwdGlvbnMuYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0X2luZm8uZXhjZXB0aW9ucy5lbmQoKSk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICBzdGQ6OnZlY3RvcjxXZWJQbGF0Zm9ybVRlc3RJbmZvPiB0ZXN0X2luZm9fbGlzdChhbGxfdGVzdF9pbmZvcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbF90ZXN0X2luZm9zLmVuZCgpKTsKKyAgICBzdGQ6OnZlY3RvcjxXZWJQbGF0Zm9ybVRlc3RJbmZvPiB0ZXN0X2luZm9fbGlzdDsKKyAgICBmb3IgKFRlc3RJbmZvTWFwOjppdGVyYXRvciBpdCA9IGFsbF90ZXN0X2luZm9zLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBhbGxfdGVzdF9pbmZvcy5lbmQoKTsgKytpdCkgeworICAgICAgdGVzdF9pbmZvX2xpc3QucHVzaF9iYWNrKGl0LT5zZWNvbmQpOworICAgIH0KICAgICByZXR1cm4gdGVzdF9pbmZvX2xpc3Q7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0X3BhcnNlci5oIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvd2ViX3BsYXRmb3JtX3Rlc3RfcGFyc2VyLmgKaW5kZXggZjAyZjA3YS4uYzQ2ZDg0ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvd2ViX3BsYXRmb3JtX3Rlc3RfcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvd2ViX3BsYXRmb3JtX3Rlc3RfcGFyc2VyLmgKQEAgLTEsMjIgKzEsMjEgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MQVlPVVRfVEVTVFNfV0VCX1BMQVRGT1JNX1RFU1RfUEFSU0VSX0hfCiAjZGVmaW5lIENPQkFMVF9MQVlPVVRfVEVTVFNfV0VCX1BMQVRGT1JNX1RFU1RfUEFSU0VSX0hfCiAKKyNpbmNsdWRlIDxzZXQ+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIApAQCAtMzgsNiArMzcsMTEgQEAKIAogICBTdGF0ZSBleHBlY3RhdGlvbjsKIAorICAvLyBPbmx5IHJlbGV2YW50IHdoZW4gfGV4cGVjdGF0aW9ufCBpcyBrUGFzcyBvciBrRmFpbC4gVGVzdHMgd2l0aCB0aGVzZSBuYW1lcworICAvLyBhcmUgZXhwZWN0ZWQgdG8gZmFpbCBvciBwYXNzIGlmIHxleHBlY3RhdGlvbnwgaXMga1Bhc3Mgb3Iga0ZhaWwKKyAgLy8gcmVzcGVjdGl2ZWx5LgorICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gZXhjZXB0aW9uczsKKwogICBib29sIG9wZXJhdG9yPChjb25zdCBXZWJQbGF0Zm9ybVRlc3RJbmZvJiByaHMpIGNvbnN0IHsgcmV0dXJuIHVybCA8IHJocy51cmw7IH0KIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0cy5jYyBiL3NyYy9jb2JhbHQvbGF5b3V0X3Rlc3RzL3dlYl9wbGF0Zm9ybV90ZXN0cy5jYwppbmRleCBkOTg0YTU1Li5lYzA0NWQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xheW91dF90ZXN0cy93ZWJfcGxhdGZvcm1fdGVzdHMuY2MKKysrIGIvc3JjL2NvYmFsdC9sYXlvdXRfdGVzdHMvd2ViX3BsYXRmb3JtX3Rlc3RzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPG9zdHJlYW0+CiAjaW5jbHVkZSA8c3N0cmVhbT4KQEAgLTE3Nyw4ICsxNzUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICZydW5fbG9vcCwgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSksCiAgICAgICBiYXNlOjpCaW5kKCZXZWJNb2R1bGVFcnJvckNhbGxiYWNrLCAmcnVuX2xvb3AsIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpLAogICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19jbG9zZV9jYWxsYmFjayAqLywgbWVkaWFfbW9kdWxlLmdldCgpLAotICAgICAgJm5ldHdvcmtfbW9kdWxlLCBrRGVmYXVsdFZpZXdwb3J0U2l6ZSwgJnJlc291cmNlX3Byb3ZpZGVyLCA2MC4wZiwKLSAgICAgIHdlYl9tb2R1bGVfb3B0aW9ucyk7CisgICAgICAmbmV0d29ya19tb2R1bGUsIGtEZWZhdWx0Vmlld3BvcnRTaXplLCAmcmVzb3VyY2VfcHJvdmlkZXIsCisgICAgICBtZWRpYV9tb2R1bGUtPnN5c3RlbV93aW5kb3coKSwgNjAuMGYsIHdlYl9tb2R1bGVfb3B0aW9ucyk7CiAgIHJ1bl9sb29wLlJ1bigpOwogICBjb25zdCBzdGQ6OnN0cmluZyBleHRyYWN0X3Jlc3VsdHMgPQogICAgICAgImRvY3VtZW50LmdldEVsZW1lbnRCeUlkKFwiX190ZXN0aGFybmVzc19fcmVzdWx0c19fXCIpLnRleHRDb250ZW50OyI7CkBAIC0yMTksMzggKzIxNywzMCBAQAogICByZXR1cm4gdGVzdF9yZXN1bHRzOwogfQogCi06OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBDaGVja1Jlc3VsdHMoCi0gICAgY29uc3QgY2hhciogLyogZXhwZWN0YXRpb25fc3RyICovLCBjb25zdCBjaGFyKiAvKiByZXN1bHRzX3N0ciAqLywKLSAgICBXZWJQbGF0Zm9ybVRlc3RJbmZvOjpTdGF0ZSBleHBlY3RhdGlvbiwKLSAgICBjb25zdCBzdGQ6OnZlY3RvcjxUZXN0UmVzdWx0PiYgcmVzdWx0cykgewotICBXZWJQbGF0Zm9ybVRlc3RJbmZvOjpTdGF0ZSBvdXRjb21lID0gV2ViUGxhdGZvcm1UZXN0SW5mbzo6a1Bhc3M7Ci0gIGlmIChyZXN1bHRzLnNpemUoKSA9PSAwKSB7Ci0gICAgb3V0Y29tZSA9IFdlYlBsYXRmb3JtVGVzdEluZm86OmtGYWlsOwotICB9Cis6OnRlc3Rpbmc6OkFzc2VydGlvblJlc3VsdCBDaGVja1Jlc3VsdChjb25zdCBjaGFyKiAvKiBleHBlY3RhdGlvbl9zdHIgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiAvKiByZXN1bHRzX3N0ciAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2hvdWxkX3Bhc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXN0UmVzdWx0JiByZXN1bHQpIHsKKyAgYm9vbCB0ZXN0X3Bhc3NlZCA9IHJlc3VsdC5zdGF0dXMgPT0gV2ViUGxhdGZvcm1UZXN0SW5mbzo6a1Bhc3M7CiAKLSAgc3RkOjpvc3RyaW5nc3RyZWFtIG91dHB1dDsKLSAgZm9yIChzdGQ6OnZlY3RvcjxUZXN0UmVzdWx0Pjo6Y29uc3RfaXRlcmF0b3IgaXQgPSByZXN1bHRzLmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gcmVzdWx0cy5lbmQoKTsgKytpdCkgewotICAgIGlmIChpdC0+c3RhdHVzICE9IGtQYXNzKSB7Ci0gICAgICBvdXRjb21lID0gV2ViUGxhdGZvcm1UZXN0SW5mbzo6a0ZhaWw7Ci0gICAgfQotICAgIG91dHB1dCA8PCBzdGQ6OmVuZGwKLSAgICAgICAgICAgPDwgIlRlc3QgXCIiIDw8IGl0LT5uYW1lCi0gICAgICAgICAgIDw8ICJcIiBzdGF0dXM6ICIgPDwgVGVzdFN0YXR1c1RvU3RyaW5nKGl0LT5zdGF0dXMpOwotICAgIGlmICghaXQtPm1lc3NhZ2UuZW1wdHkoKSkgewotICAgICAgb3V0cHV0IDw8IHN0ZDo6ZW5kbCA8PCBpdC0+bWVzc2FnZTsKLSAgICB9Ci0gICAgaWYgKCFpdC0+c3RhY2suZW1wdHkoKSkgewotICAgICAgb3V0cHV0IDw8IHN0ZDo6ZW5kbCA8PCBpdC0+c3RhY2s7Ci0gICAgfQotICB9Ci0KLSAgaWYgKG91dGNvbWUgPT0gZXhwZWN0YXRpb24pIHsKKyAgaWYgKHRlc3RfcGFzc2VkID09IHNob3VsZF9wYXNzKSB7CiAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uU3VjY2VzcygpOwogICB9IGVsc2UgeworICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvdXRwdXQ7CisgICAgb3V0cHV0IDw8IHN0ZDo6ZW5kbAorICAgICAgICAgICA8PCAiVGVzdCBcIiIgPDwgcmVzdWx0Lm5hbWUKKyAgICAgICAgICAgPDwgIlwiIHN0YXR1czogIiA8PCBUZXN0U3RhdHVzVG9TdHJpbmcocmVzdWx0LnN0YXR1cyk7CisgICAgaWYgKCFyZXN1bHQubWVzc2FnZS5lbXB0eSgpKSB7CisgICAgICBvdXRwdXQgPDwgc3RkOjplbmRsIDw8IHJlc3VsdC5tZXNzYWdlOworICAgIH0KKyAgICBpZiAoIXJlc3VsdC5zdGFjay5lbXB0eSgpKSB7CisgICAgICBvdXRwdXQgPDwgc3RkOjplbmRsIDw8IHJlc3VsdC5zdGFjazsKKyAgICB9CisgICAgV2ViUGxhdGZvcm1UZXN0SW5mbzo6U3RhdGUgZXhwZWN0YXRpb24gPQorICAgICAgICBzaG91bGRfcGFzcyA/IFdlYlBsYXRmb3JtVGVzdEluZm86OmtQYXNzIDogV2ViUGxhdGZvcm1UZXN0SW5mbzo6a0ZhaWw7CiAgICAgcmV0dXJuIDo6dGVzdGluZzo6QXNzZXJ0aW9uRmFpbHVyZSgpCiAgICAgICAgICAgIDw8ICJFeHBlY3RlZDogIiA8PCBUZXN0U3RhdHVzVG9TdHJpbmcoZXhwZWN0YXRpb24pIDw8IHN0ZDo6ZW5kbAotICAgICAgICAgICA8PCAiQWN0dWFsOiAiIDw8IFRlc3RTdGF0dXNUb1N0cmluZyhvdXRjb21lKSA8PCBzdGQ6OmVuZGwKKyAgICAgICAgICAgPDwgIkFjdHVhbDogIiA8PCBUZXN0U3RhdHVzVG9TdHJpbmcocmVzdWx0LnN0YXR1cykgPDwgc3RkOjplbmRsCiAgICAgICAgICAgIDw8IG91dHB1dC5zdHIoKTsKICAgfQogfQpAQCAtMjg0LDcgKzI3NCwxNyBAQAogCiAgIHN0ZDo6c3RyaW5nIGpzb25fcmVzdWx0cyA9IFJ1bldlYlBsYXRmb3JtVGVzdCh0ZXN0X3VybCk7CiAgIHN0ZDo6dmVjdG9yPFRlc3RSZXN1bHQ+IHJlc3VsdHMgPSBQYXJzZVJlc3VsdHMoanNvbl9yZXN1bHRzKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMihDaGVja1Jlc3VsdHMsIEdldFBhcmFtKCkuZXhwZWN0YXRpb24sIHJlc3VsdHMpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHJlc3VsdHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBXZWJQbGF0Zm9ybVRlc3RJbmZvJiB0ZXN0X2luZm8gPSBHZXRQYXJhbSgpOworICAgIGNvbnN0IFRlc3RSZXN1bHQmIHRlc3RfcmVzdWx0ID0gcmVzdWx0c1tpXTsKKyAgICBib29sIHNob3VsZF9wYXNzID0gdGVzdF9pbmZvLmV4cGVjdGF0aW9uID09IFdlYlBsYXRmb3JtVGVzdEluZm86OmtQYXNzOworICAgIHN0ZDo6c2V0PHN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQorICAgICAgICB0ZXN0X2luZm8uZXhjZXB0aW9ucy5maW5kKHRlc3RfcmVzdWx0Lm5hbWUpOworICAgIGlmIChpdCAhPSB0ZXN0X2luZm8uZXhjZXB0aW9ucy5lbmQoKSkgeworICAgICAgc2hvdWxkX3Bhc3MgPSAhc2hvdWxkX3Bhc3M7CisgICAgfQorICAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIoQ2hlY2tSZXN1bHQsIHNob3VsZF9wYXNzLCB0ZXN0X3Jlc3VsdCk7CisgIH0KIH0KIAogLy8gRGlzYWJsZSBvbiBXaW5kb3dzIHVudGlsIG5ldHdvcmsgc3RhY2sgaXMgaW1wbGVtZW50ZWQuCkBAIC0yOTcsNiArMjk3LDkgQEAKIElOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKAogICAgIGNzcCwgV2ViUGxhdGZvcm1UZXN0LAogICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oRW51bWVyYXRlV2ViUGxhdGZvcm1UZXN0cygiY29udGVudC1zZWN1cml0eS1wb2xpY3kiKSkpOworCitJTlNUQU5USUFURV9URVNUX0NBU0VfUChkb20sIFdlYlBsYXRmb3JtVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDo6dGVzdGluZzo6VmFsdWVzSW4oRW51bWVyYXRlV2ViUGxhdGZvcm1UZXN0cygiZG9tIikpKTsKICNlbmRpZiAgLy8gIWRlZmluZWQoQ09CQUxUX1dJTikKIAogfSAgLy8gbmFtZXNwYWNlIGxheW91dF90ZXN0cwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvYWJvdXRfZmV0Y2hlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2Fib3V0X2ZldGNoZXIuY2MKaW5kZXggODFlZmFkMC4uNTgwYzIxYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvYWJvdXRfZmV0Y2hlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9hYm91dF9mZXRjaGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvYWJvdXRfZmV0Y2hlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9hYm91dF9mZXRjaGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9hYm91dF9mZXRjaGVyLmgKaW5kZXggNjA2YjdlZi4uNmQ1NzVlNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvYWJvdXRfZmV0Y2hlci5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2Fib3V0X2ZldGNoZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9BQk9VVF9GRVRDSEVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfQUJPVVRfRkVUQ0hFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvYmxvYl9mZXRjaGVyLmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvYmxvYl9mZXRjaGVyLmNjCmluZGV4IDQxMTgyMDYuLjA1NWY0OTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2Jsb2JfZmV0Y2hlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9ibG9iX2ZldGNoZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9ibG9iX2ZldGNoZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvYmxvYl9mZXRjaGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9ibG9iX2ZldGNoZXIuaAppbmRleCA5YjQwYzNmLi5kODA0Y2RiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9ibG9iX2ZldGNoZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9ibG9iX2ZldGNoZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9CTE9CX0ZFVENIRVJfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9CTE9CX0ZFVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2Jsb2JfZmV0Y2hlcl90ZXN0LmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvYmxvYl9mZXRjaGVyX3Rlc3QuY2MKaW5kZXggZTJiYWVhMy4uODM1MTRmNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvYmxvYl9mZXRjaGVyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvYmxvYl9mZXRjaGVyX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9ibG9iX2ZldGNoZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvZGVjb2Rlci5oCmluZGV4IDJhMGFkY2IuLjQzZDMyMTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9kZWNvZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2VtYmVkZGVkX2ZldGNoZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9lbWJlZGRlZF9mZXRjaGVyLmNjCmluZGV4IDlmOWUyMjIuLjIwZDkwMzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2VtYmVkZGVkX2ZldGNoZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZW1iZWRkZWRfZmV0Y2hlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2VtYmVkZGVkX2ZldGNoZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvZW1iZWRkZWRfZmV0Y2hlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvZW1iZWRkZWRfZmV0Y2hlci5oCmluZGV4IDgwZjNhNzQuLmE1Nzc1NTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2VtYmVkZGVkX2ZldGNoZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9lbWJlZGRlZF9mZXRjaGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfRU1CRURERURfRkVUQ0hFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0VNQkVEREVEX0ZFVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyLmNjCmluZGV4IGQ3ZGM3M2QuLmU3MWY3ZTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZldGNoZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlci5oCmluZGV4IGU5OThmNDQuLjNlMDA0NjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfRkVUQ0hFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0ZFVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5jYwppbmRleCAwYTc2MjFjLi41NzY2ODg2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnkuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeS5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgKaW5kZXggOWY5MThhZi4uYTk4NDg1YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfRkVUQ0hFUl9GQUNUT1JZX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfRkVUQ0hFUl9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyX2ZhY3RvcnlfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeV90ZXN0LmNjCmluZGV4IDVkYWVmOTQuLjdlNTI1ZTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZldGNoZXJfZmFjdG9yeV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPHN0cmluZz4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvZmV0Y2hlcl90ZXN0LmggYi9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyX3Rlc3QuaAppbmRleCAwYjkyMzc4Li4yNGUxM2Q0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyX3Rlc3QuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9mZXRjaGVyX3Rlc3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9GRVRDSEVSX1RFU1RfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9GRVRDSEVSX1RFU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZpbGVfZmV0Y2hlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZpbGVfZmV0Y2hlci5jYwppbmRleCA4M2VlN2E2Li4yMjViMWExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9maWxlX2ZldGNoZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmlsZV9mZXRjaGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmlsZV9mZXRjaGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZpbGVfZmV0Y2hlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmlsZV9mZXRjaGVyLmgKaW5kZXggOTE0MDgxNS4uMjEwNGFhZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvZmlsZV9mZXRjaGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZmlsZV9mZXRjaGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfRklMRV9GRVRDSEVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfRklMRV9GRVRDSEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9maWxlX2ZldGNoZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZpbGVfZmV0Y2hlcl90ZXN0LmNjCmluZGV4IDBiMjJmNzEuLjkwODZjMzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZpbGVfZmV0Y2hlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZpbGVfZmV0Y2hlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmlsZV9mZXRjaGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvcmVtb3RlX3R5cGVmYWNlX2NhY2hlLmggYi9zcmMvY29iYWx0L2xvYWRlci9mb250L3JlbW90ZV90eXBlZmFjZV9jYWNoZS5oCmluZGV4IDdhNjk0YzguLmJhODI0MGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvcmVtb3RlX3R5cGVmYWNlX2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvZm9udC9yZW1vdGVfdHlwZWZhY2VfY2FjaGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9GT05UX1JFTU9URV9UWVBFRkFDRV9DQUNIRV9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0ZPTlRfUkVNT1RFX1RZUEVGQUNFX0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuY2MKaW5kZXggODFmY2VkYy4uY2Q0MWMwOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvZm9udC90eXBlZmFjZV9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5oCmluZGV4IDJhNjExYzQuLjcwMGUxZGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX0ZPTlRfVFlQRUZBQ0VfREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0ZPTlRfVFlQRUZBQ0VfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvZm9udC90eXBlZmFjZV9kZWNvZGVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXJfdGVzdC5jYwppbmRleCBhZDQwNDZkLi5iNDJkYTAyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9mb250L3R5cGVmYWNlX2RlY29kZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ZvbnQvdHlwZWZhY2VfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9kdW1teV9naWZfaW1hZ2VfZGVjb2Rlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2R1bW15X2dpZl9pbWFnZV9kZWNvZGVyLmNjCmluZGV4IDI4M2UxZmUuLmY1NzQ3MmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2R1bW15X2dpZl9pbWFnZV9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2R1bW15X2dpZl9pbWFnZV9kZWNvZGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvZHVtbXlfZ2lmX2ltYWdlX2RlY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvZHVtbXlfZ2lmX2ltYWdlX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2R1bW15X2dpZl9pbWFnZV9kZWNvZGVyLmgKaW5kZXggM2VhNWIzOC4uY2MyYWY0MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvZHVtbXlfZ2lmX2ltYWdlX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9kdW1teV9naWZfaW1hZ2VfZGVjb2Rlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX0lNQUdFX0RVTU1ZX0dJRl9JTUFHRV9ERUNPREVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfSU1BR0VfRFVNTVlfR0lGX0lNQUdFX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2NhY2hlLmggYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9jYWNoZS5oCmluZGV4IGI5OTY3N2MuLjk2ZDg3ZjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfY2FjaGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9JTUFHRV9JTUFHRV9DQUNIRV9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0lNQUdFX0lNQUdFX0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kYXRhX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kYXRhX2RlY29kZXIuY2MKaW5kZXggYjk2Mzk1Ny4uYWY5NWIzYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGF0YV9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RhdGFfZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RhdGFfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kYXRhX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RhdGFfZGVjb2Rlci5oCmluZGV4IDMwOWE4ODQuLjM3MmE5MTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RhdGFfZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RhdGFfZGVjb2Rlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX0lNQUdFX0lNQUdFX0RBVEFfREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0lNQUdFX0lNQUdFX0RBVEFfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuY2MKaW5kZXggNmIzZWYzYi4uNDhmZDBiMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyLmgKaW5kZXggNTgwYTQyMi4uZDE1ZmNlMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9JTUFHRV9JTUFHRV9ERUNPREVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfSU1BR0VfSU1BR0VfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlcl9zdGFyYm9hcmQuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyX3N0YXJib2FyZC5jYwppbmRleCAxZmRiN2JmLi4zNGI1ZTU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyX3N0YXJib2FyZC5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyX3N0YXJib2FyZC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlcl9zdGFyYm9hcmQuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfc3RhcmJvYXJkLmgKaW5kZXggNTg4MTg4MS4uZjViNDQwOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlcl9zdGFyYm9hcmQuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyX3N0YXJib2FyZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX0lNQUdFX0lNQUdFX0RFQ09ERVJfU1RBUkJPQVJEX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfSU1BR0VfSU1BR0VfREVDT0RFUl9TVEFSQk9BUkRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2ltYWdlX2RlY29kZXJfdGVzdC5jYwppbmRleCBiMmFhMTcwLi42MjExZTY5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9pbWFnZV9kZWNvZGVyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2UvaW1hZ2VfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9qcGVnX2ltYWdlX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9qcGVnX2ltYWdlX2RlY29kZXIuY2MKaW5kZXggYzMzOGM3NS4uMjc0YTEzMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvanBlZ19pbWFnZV9kZWNvZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2pwZWdfaW1hZ2VfZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL2pwZWdfaW1hZ2VfZGVjb2Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9qcGVnX2ltYWdlX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2pwZWdfaW1hZ2VfZGVjb2Rlci5oCmluZGV4IDI0MmZkMGUuLmJmMmJlMzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2pwZWdfaW1hZ2VfZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL2pwZWdfaW1hZ2VfZGVjb2Rlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX0lNQUdFX0pQRUdfSU1BR0VfREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0lNQUdFX0pQRUdfSU1BR0VfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvcG5nX2ltYWdlX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9wbmdfaW1hZ2VfZGVjb2Rlci5jYwppbmRleCBkNjBkMWRjLi43NTkyMWNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9wbmdfaW1hZ2VfZGVjb2Rlci5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9wbmdfaW1hZ2VfZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL3BuZ19pbWFnZV9kZWNvZGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3BuZ19pbWFnZV9kZWNvZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9wbmdfaW1hZ2VfZGVjb2Rlci5oCmluZGV4IGQyNzAwODcuLjc3ZjYyZjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3BuZ19pbWFnZV9kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvcG5nX2ltYWdlX2RlY29kZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9JTUFHRV9QTkdfSU1BR0VfREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0lNQUdFX1BOR19JTUFHRV9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9zYW5kYm94L2ltYWdlX2RlY29kZXJfc2FuZGJveC5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3NhbmRib3gvaW1hZ2VfZGVjb2Rlcl9zYW5kYm94LmNjCmluZGV4IDkzNzFhOGIuLmVkYjM2YzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3NhbmRib3gvaW1hZ2VfZGVjb2Rlcl9zYW5kYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3NhbmRib3gvaW1hZ2VfZGVjb2Rlcl9zYW5kYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvc3R1Yl9pbWFnZV9kZWNvZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9zdHViX2ltYWdlX2RlY29kZXIuaAppbmRleCBkZDY0ODE1Li5mZWU1MDJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9zdHViX2ltYWdlX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS9zdHViX2ltYWdlX2RlY29kZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9JTUFHRV9TVFVCX0lNQUdFX0RFQ09ERVJfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9JTUFHRV9TVFVCX0lNQUdFX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3RocmVhZGVkX2ltYWdlX2RlY29kZXJfcHJveHkuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS90aHJlYWRlZF9pbWFnZV9kZWNvZGVyX3Byb3h5LmNjCmluZGV4IGQ3YzI0YTkuLmIwYWZlMmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3RocmVhZGVkX2ltYWdlX2RlY29kZXJfcHJveHkuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvdGhyZWFkZWRfaW1hZ2VfZGVjb2Rlcl9wcm94eS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2ltYWdlL3RocmVhZGVkX2ltYWdlX2RlY29kZXJfcHJveHkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvdGhyZWFkZWRfaW1hZ2VfZGVjb2Rlcl9wcm94eS5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2UvdGhyZWFkZWRfaW1hZ2VfZGVjb2Rlcl9wcm94eS5oCmluZGV4IDYwM2Q0ZTcuLjJkOTI5YjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3RocmVhZGVkX2ltYWdlX2RlY29kZXJfcHJveHkuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS90aHJlYWRlZF9pbWFnZV9kZWNvZGVyX3Byb3h5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfSU1BR0VfVEhSRUFERURfSU1BR0VfREVDT0RFUl9QUk9YWV9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0lNQUdFX1RIUkVBREVEX0lNQUdFX0RFQ09ERVJfUFJPWFlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3dlYnBfaW1hZ2VfZGVjb2Rlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3dlYnBfaW1hZ2VfZGVjb2Rlci5jYwppbmRleCBhZGQzYjQ3Li5hZDRmM2QzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9pbWFnZS93ZWJwX2ltYWdlX2RlY29kZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2ltYWdlL3dlYnBfaW1hZ2VfZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmgKaW5kZXggMTg3Y2E2Mi4uZTQ1NDc5YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvaW1hZ2Uvd2VicF9pbWFnZV9kZWNvZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfSU1BR0VfV0VCUF9JTUFHRV9ERUNPREVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfSU1BR0VfV0VCUF9JTUFHRV9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuY2MKaW5kZXggYmM2YjdjOC4uMWVhOTY0YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2xvYWRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmd5cAppbmRleCAzZGQ4NjdjLi5kMTc2MmU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlci5neXAKQEAgLTExOCw5ICsxMTgsOSBAQAogICAgICAgICAndGV4dF9kZWNvZGVyX3Rlc3QuY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L21hdGgvbWF0aC5neXA6bWF0aCcsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdsb2FkZXInLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmggYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuaAppbmRleCAxYTFiZDFlLi42MGFmYTVmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9MT0FERVJfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9MT0FERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuY2MKaW5kZXggOTBjNTk0MC4uZGJmNGFiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX2ZhY3RvcnkuaAppbmRleCBkMmJhYTkyLi5mNTE1N2YxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfZmFjdG9yeS5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl9mYWN0b3J5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfTE9BREVSX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9MT0FERVJfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbG9hZGVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfdGVzdC5jYwppbmRleCBlZDQzZGZhLi4xZTc4NzJhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL2xvYWRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9sb2FkZXJfdHlwZXMuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl90eXBlcy5oCmluZGV4IDAxODg3MDIuLjY5YTJkNDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl90eXBlcy5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL2xvYWRlcl90eXBlcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX0xPQURFUl9UWVBFU19IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX0xPQURFUl9UWVBFU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2NhY2hlLmggYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL21lc2hfY2FjaGUuaAppbmRleCA0ZTAxMDQ3Li41M2NhMzQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9tZXNoL21lc2hfY2FjaGUuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL21lc2hfY2FjaGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9NRVNIX01FU0hfQ0FDSEVfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9NRVNIX01FU0hfQ0FDSEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvbWVzaF9kZWNvZGVyLmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2RlY29kZXIuY2MKaW5kZXggNWI0MWY0NC4uMDVkN2JjYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2RlY29kZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2RlY29kZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9tZXNoL21lc2hfZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2RlY29kZXIuaAppbmRleCAxNTU4YWNkLi41ZDQ1YTMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9tZXNoL21lc2hfZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvbWVzaF9kZWNvZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfTUVTSF9NRVNIX0RFQ09ERVJfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9NRVNIX01FU0hfREVDT0RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2RlY29kZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvbWVzaF9kZWNvZGVyX3Rlc3QuY2MKaW5kZXggZjU0MzBlYS4uOWVmZGQzOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2RlY29kZXJfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL21lc2hfZGVjb2Rlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbWVzaC9tZXNoX2RlY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL2NvbnN0YW50cy5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL2NvbnN0YW50cy5oCmluZGV4IDljNTExMDYuLmY4MmZiZGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9jb25zdGFudHMuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL3Byb2plY3Rpb25fY29kZWMvY29uc3RhbnRzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfTUVTSF9QUk9KRUNUSU9OX0NPREVDX0NPTlNUQU5UU19IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX01FU0hfUFJPSkVDVElPTl9DT0RFQ19DT05TVEFOVFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9pbmRleGVkX3ZlcnQuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL3Byb2plY3Rpb25fY29kZWMvaW5kZXhlZF92ZXJ0LmNjCmluZGV4IGFiNmQxMTcuLjJkODI2MTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9pbmRleGVkX3ZlcnQuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL2luZGV4ZWRfdmVydC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9pbmRleGVkX3ZlcnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL2luZGV4ZWRfdmVydC5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL2luZGV4ZWRfdmVydC5oCmluZGV4IDg4YzJhN2IuLmUxNTQ5YzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9pbmRleGVkX3ZlcnQuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL3Byb2plY3Rpb25fY29kZWMvaW5kZXhlZF92ZXJ0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfTUVTSF9QUk9KRUNUSU9OX0NPREVDX0lOREVYRURfVkVSVF9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX01FU0hfUFJPSkVDVElPTl9DT0RFQ19JTkRFWEVEX1ZFUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9wcm9qZWN0aW9uX2RlY29kZXIuY2MgYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL3Byb2plY3Rpb25fY29kZWMvcHJvamVjdGlvbl9kZWNvZGVyLmNjCmluZGV4IGJlZTc4ZTEuLmZlN2E0MjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9wcm9qZWN0aW9uX2RlY29kZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL3Byb2plY3Rpb25fZGVjb2Rlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9wcm9qZWN0aW9uX2RlY29kZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL3Byb2plY3Rpb25fZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvbWVzaC9wcm9qZWN0aW9uX2NvZGVjL3Byb2plY3Rpb25fZGVjb2Rlci5oCmluZGV4IGUwMmNkNjEuLjA5YTYyODMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL21lc2gvcHJvamVjdGlvbl9jb2RlYy9wcm9qZWN0aW9uX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9tZXNoL3Byb2plY3Rpb25fY29kZWMvcHJvamVjdGlvbl9kZWNvZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfTUVTSF9QUk9KRUNUSU9OX0NPREVDX1BST0pFQ1RJT05fREVDT0RFUl9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX01FU0hfUFJPSkVDVElPTl9DT0RFQ19QUk9KRUNUSU9OX0RFQ09ERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL21vY2tfbG9hZGVyX2ZhY3RvcnkuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL21vY2tfbG9hZGVyX2ZhY3RvcnkuaAppbmRleCBmZTIxZDFiLi5jNjgwMTkwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci9tb2NrX2xvYWRlcl9mYWN0b3J5LmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvbW9ja19sb2FkZXJfZmFjdG9yeS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX01PQ0tfTE9BREVSX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9NT0NLX0xPQURFUl9GQUNUT1JZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmNjCmluZGV4IGVmYjk0NmUuLjQwZGI3NGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvbmV0X2ZldGNoZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvbmV0X2ZldGNoZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL25ldF9mZXRjaGVyLmgKaW5kZXggMjMyNTMxMC4uYzkwMjgzMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvbmV0X2ZldGNoZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9uZXRfZmV0Y2hlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX05FVF9GRVRDSEVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfTkVUX0ZFVENIRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL3Jlc291cmNlX2NhY2hlLmggYi9zcmMvY29iYWx0L2xvYWRlci9yZXNvdXJjZV9jYWNoZS5oCmluZGV4IDMzNWM5MGMuLjIxMzQ0MjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL3Jlc291cmNlX2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvcmVzb3VyY2VfY2FjaGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX0xPQURFUl9SRVNPVVJDRV9DQUNIRV9IXwogI2RlZmluZSBDT0JBTFRfTE9BREVSX1JFU09VUkNFX0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci9zeW5jX2xvYWRlci5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL3N5bmNfbG9hZGVyLmNjCmluZGV4IDdjZWZmODIuLmU4ZDQ1ZjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL3N5bmNfbG9hZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL3N5bmNfbG9hZGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvc3luY19sb2FkZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9sb2FkZXIvc3luY19sb2FkZXIuaCBiL3NyYy9jb2JhbHQvbG9hZGVyL3N5bmNfbG9hZGVyLmgKaW5kZXggNzBjNTgzOS4uZGFkYzJiOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvc3luY19sb2FkZXIuaAorKysgYi9zcmMvY29iYWx0L2xvYWRlci9zeW5jX2xvYWRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTE9BREVSX1NZTkNfTE9BREVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfU1lOQ19MT0FERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL3RleHRfZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgKaW5kZXggZGQxOTFkNy4uMTFiNzhkNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfVEVYVF9ERUNPREVSX0hfCiAjZGVmaW5lIENPQkFMVF9MT0FERVJfVEVYVF9ERUNPREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci90ZXh0X2RlY29kZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbG9hZGVyL3RleHRfZGVjb2Rlcl90ZXN0LmNjCmluZGV4IGNiNjNlYjcuLjdjNjI2OTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbG9hZGVyL3RleHRfZGVjb2Rlcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL3RleHRfZGVjb2Rlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvdGV4dF9kZWNvZGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbG9hZGVyL3RocmVhZGVkX25ldF9mZXRjaGVyX3Byb3h5LmNjIGIvc3JjL2NvYmFsdC9sb2FkZXIvdGhyZWFkZWRfbmV0X2ZldGNoZXJfcHJveHkuY2MKaW5kZXggNjcyNmQ0NC4uYmU2OWQyZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9sb2FkZXIvdGhyZWFkZWRfbmV0X2ZldGNoZXJfcHJveHkuY2MKKysrIGIvc3JjL2NvYmFsdC9sb2FkZXIvdGhyZWFkZWRfbmV0X2ZldGNoZXJfcHJveHkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2xvYWRlci90aHJlYWRlZF9uZXRfZmV0Y2hlcl9wcm94eS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L2xvYWRlci90aHJlYWRlZF9uZXRfZmV0Y2hlcl9wcm94eS5oIGIvc3JjL2NvYmFsdC9sb2FkZXIvdGhyZWFkZWRfbmV0X2ZldGNoZXJfcHJveHkuaAppbmRleCAxNGM0ZDBiLi44NmJjYjhlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L2xvYWRlci90aHJlYWRlZF9uZXRfZmV0Y2hlcl9wcm94eS5oCisrKyBiL3NyYy9jb2JhbHQvbG9hZGVyL3RocmVhZGVkX25ldF9mZXRjaGVyX3Byb3h5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9MT0FERVJfVEhSRUFERURfTkVUX0ZFVENIRVJfUFJPWFlfSF8KICNkZWZpbmUgQ09CQUxUX0xPQURFUl9USFJFQURFRF9ORVRfRkVUQ0hFUl9QUk9YWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tYXRoL2V4cG9uZW50aWFsX21vdmluZ19hdmVyYWdlLmggYi9zcmMvY29iYWx0L21hdGgvZXhwb25lbnRpYWxfbW92aW5nX2F2ZXJhZ2UuaAppbmRleCBjYTMxZmI3Li45MzBjOTU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21hdGgvZXhwb25lbnRpYWxfbW92aW5nX2F2ZXJhZ2UuaAorKysgYi9zcmMvY29iYWx0L21hdGgvZXhwb25lbnRpYWxfbW92aW5nX2F2ZXJhZ2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01BVEhfRVhQT05FTlRJQUxfTU9WSU5HX0FWRVJBR0VfSF8KICNkZWZpbmUgQ09CQUxUX01BVEhfRVhQT05FTlRJQUxfTU9WSU5HX0FWRVJBR0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWF0aC9tYXRoLmd5cCBiL3NyYy9jb2JhbHQvbWF0aC9tYXRoLmd5cAppbmRleCAyNzUyMTA0Li42OTJkN2VjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21hdGgvbWF0aC5neXAKKysrIGIvc3JjL2NvYmFsdC9tYXRoL21hdGguZ3lwCkBAIC05MCw3ICs5MCw4IEBACiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6YmFzZScsCi0gICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgICAnbWF0aCcsCiAgICAgICBdLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tYXRoL21hdHJpeF9pbnRlcnBvbGF0aW9uLmNjIGIvc3JjL2NvYmFsdC9tYXRoL21hdHJpeF9pbnRlcnBvbGF0aW9uLmNjCmluZGV4IGZkN2FiZjQuLjVjZmRjNzggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWF0aC9tYXRyaXhfaW50ZXJwb2xhdGlvbi5jYworKysgYi9zcmMvY29iYWx0L21hdGgvbWF0cml4X2ludGVycG9sYXRpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21hdGgvbWF0cml4X2ludGVycG9sYXRpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tYXRoL21hdHJpeF9pbnRlcnBvbGF0aW9uLmggYi9zcmMvY29iYWx0L21hdGgvbWF0cml4X2ludGVycG9sYXRpb24uaAppbmRleCA0ZTEwMjg3Li42Yzc0M2M1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21hdGgvbWF0cml4X2ludGVycG9sYXRpb24uaAorKysgYi9zcmMvY29iYWx0L21hdGgvbWF0cml4X2ludGVycG9sYXRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01BVEhfTUFUUklYX0lOVEVSUE9MQVRJT05fSF8KICNkZWZpbmUgQ09CQUxUX01BVEhfTUFUUklYX0lOVEVSUE9MQVRJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWF0aC9tYXRyaXhfaW50ZXJwb2xhdGlvbl91bml0dGVzdC5jYyBiL3NyYy9jb2JhbHQvbWF0aC9tYXRyaXhfaW50ZXJwb2xhdGlvbl91bml0dGVzdC5jYwppbmRleCBkMjIxNzBmLi40MzI3OTc2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21hdGgvbWF0cml4X2ludGVycG9sYXRpb25fdW5pdHRlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9tYXRoL21hdHJpeF9pbnRlcnBvbGF0aW9uX3VuaXR0ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPGNtYXRoPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21hdGgvcmF0aW9uYWwuaCBiL3NyYy9jb2JhbHQvbWF0aC9yYXRpb25hbC5oCmluZGV4IDU1MmY3MWYuLjk3OWUwYzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWF0aC9yYXRpb25hbC5oCisrKyBiL3NyYy9jb2JhbHQvbWF0aC9yYXRpb25hbC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTUFUSF9SQVRJT05BTF9IXwogI2RlZmluZSBDT0JBTFRfTUFUSF9SQVRJT05BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tYXRoL3RyYW5zZm9ybV8yZC5jYyBiL3NyYy9jb2JhbHQvbWF0aC90cmFuc2Zvcm1fMmQuY2MKaW5kZXggNWY0ZmQ0ZC4uYWI3NDNiNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tYXRoL3RyYW5zZm9ybV8yZC5jYworKysgYi9zcmMvY29iYWx0L21hdGgvdHJhbnNmb3JtXzJkLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9tYXRoL3RyYW5zZm9ybV8yZC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21hdGgvdHJhbnNmb3JtXzJkLmggYi9zcmMvY29iYWx0L21hdGgvdHJhbnNmb3JtXzJkLmgKaW5kZXggZWJjMzliZi4uNjhiODA4NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tYXRoL3RyYW5zZm9ybV8yZC5oCisrKyBiL3NyYy9jb2JhbHQvbWF0aC90cmFuc2Zvcm1fMmQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01BVEhfVFJBTlNGT1JNXzJEX0hfCiAjZGVmaW5lIENPQkFMVF9NQVRIX1RSQU5TRk9STV8yRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tYXRoL3RyYW5zZm9ybV8yZF90ZXN0LmNjIGIvc3JjL2NvYmFsdC9tYXRoL3RyYW5zZm9ybV8yZF90ZXN0LmNjCmluZGV4IDQxOTVmYjQuLmNjMTg5ZDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWF0aC90cmFuc2Zvcm1fMmRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L21hdGgvdHJhbnNmb3JtXzJkX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8Y21hdGg+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idWZmZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idWZmZXIuaAppbmRleCAyMWFiZmRlLi5iYTg1ODU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fYnVmZmVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1ZmZlci5oCkBAIC01MSw4ICs1MSw3IEBACiAgIC8vIG11c3QgYmUgPj0gMC4KICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IENvcHlGcm9tKFNhbXBsZUZvcm1hdCBzYW1wbGVfZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjaGFubmVsX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNoYW5uZWxfY291bnQsIGludCBzYW1wbGVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmcmFtZV9jb3VudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGNvbnN0KiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CkBAIC02NywxMSArNjYsOCBAQAogCiAgIC8vIENyZWF0ZSBhbiBlbXB0eSBBdWRpb0J1ZmZlciB3aXRoIHxmcmFtZV9jb3VudHwgZnJhbWVzLgogICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxBdWRpb0J1ZmZlcj4gQ3JlYXRlRW1wdHlCdWZmZXIoCi0gICAgICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgaW50IGNoYW5uZWxfY291bnQsCi0gICAgICBpbnQgc2FtcGxlX3JhdGUsCi0gICAgICBpbnQgZnJhbWVfY291bnQsCi0gICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKKyAgICAgIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQsIGludCBjaGFubmVsX2NvdW50LCBpbnQgc2FtcGxlX3JhdGUsCisgICAgICBpbnQgZnJhbWVfY291bnQsIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwogCiAgIC8vIENyZWF0ZSBhIEF1ZGlvQnVmZmVyIGluZGljYXRpbmcgd2UndmUgcmVhY2hlZCBlbmQgb2Ygc3RyZWFtLgogICAvLyBDYWxsaW5nIGFueSBtZXRob2Qgb3RoZXIgdGhhbiBlbmRfb2Zfc3RyZWFtKCkgb24gdGhlIHJlc3VsdGluZyBidWZmZXIKQEAgLTg5LDEwICs4NSw4IEBACiAgIC8vIGZpcnN0LiB8ZGVzdF9mcmFtZV9vZmZzZXR8IGlzIHRoZSBmcmFtZSBvZmZzZXQgaW4gfGRlc3R8LiBUaGUgZnJhbWVzIGFyZQogICAvLyBjb252ZXJ0ZWQgZnJvbSB0aGVpciBzb3VyY2UgZm9ybWF0IGludG8gcGxhbmFyIGZsb2F0MzIgZGF0YSAod2hpY2ggaXMgYWxsCiAgIC8vIHRoYXQgQXVkaW9CdXMgaGFuZGxlcykuCi0gIHZvaWQgUmVhZEZyYW1lcyhpbnQgZnJhbWVzX3RvX2NvcHksCi0gICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2ZyYW1lX29mZnNldCwKLSAgICAgICAgICAgICAgICAgIGludCBkZXN0X2ZyYW1lX29mZnNldCwKLSAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0KTsKKyAgdm9pZCBSZWFkRnJhbWVzKGludCBmcmFtZXNfdG9fY29weSwgaW50IHNvdXJjZV9mcmFtZV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9mcmFtZV9vZmZzZXQsIEF1ZGlvQnVzKiBkZXN0KTsKIAogICAvLyBUcmltIGFuIEF1ZGlvQnVmZmVyIGJ5IHJlbW92aW5nIHxmcmFtZXNfdG9fdHJpbXwgZnJhbWVzIGZyb20gdGhlIHN0YXJ0LgogICAvLyBUaW1lc3RhbXAgYW5kIGR1cmF0aW9uIGFyZSBhZGp1c3RlZCB0byByZWZsZWN0IHRoZSBmZXdlciBmcmFtZXMuCkBAIC0xNTAsMTMgKzE0NCw5IEBACiAgIC8vIFtkYXRhLGRhdGErZGF0YV9zaXplKSB0byB0aGUgYWxsb2NhdGVkIGJ1ZmZlcihzKS4gSWYgfGRhdGF8IGlzIG51bGwsIG5vCiAgIC8vIGRhdGEgaXMgY29waWVkLiBJZiB8Y3JlYXRlX2J1ZmZlcnwgaXMgZmFsc2UsIG5vIGRhdGEgYnVmZmVyIGlzIGNyZWF0ZWQgKG9yCiAgIC8vIGNvcGllZCB0bykuCi0gIEF1ZGlvQnVmZmVyKFNhbXBsZUZvcm1hdCBzYW1wbGVfZm9ybWF0LAotICAgICAgICAgICAgICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgICBpbnQgY2hhbm5lbF9jb3VudCwKLSAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICBpbnQgZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgIGJvb2wgY3JlYXRlX2J1ZmZlciwKLSAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogY29uc3QqIGRhdGEsCisgIEF1ZGlvQnVmZmVyKFNhbXBsZUZvcm1hdCBzYW1wbGVfZm9ybWF0LCBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICBpbnQgY2hhbm5lbF9jb3VudCwgaW50IHNhbXBsZV9yYXRlLCBpbnQgZnJhbWVfY291bnQsCisgICAgICAgICAgICAgIGJvb2wgY3JlYXRlX2J1ZmZlciwgY29uc3QgdWludDhfdCogY29uc3QqIGRhdGEsCiAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwogCiAgIHZpcnR1YWwgfkF1ZGlvQnVmZmVyKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fYnVmZmVyX2NvbnZlcnRlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1ZmZlcl9jb252ZXJ0ZXIuaAppbmRleCAxNWVmODNjLi40YTcyMGY2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fYnVmZmVyX2NvbnZlcnRlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idWZmZXJfY29udmVydGVyLmgKQEAgLTQ1LDkgKzQ1LDcgQEAKICAgaW50IGlucHV0X2J1ZmZlcl9zaXplX2Zvcl90ZXN0aW5nKCkgY29uc3QgewogICAgIHJldHVybiBpbnB1dF9wYXJhbXNfLmZyYW1lc19wZXJfYnVmZmVyKCk7CiAgIH0KLSAgaW50IGlucHV0X2ZyYW1lc19sZWZ0X2Zvcl90ZXN0aW5nKCkgY29uc3QgewotICAgIHJldHVybiBpbnB1dF9mcmFtZXNfOwotICB9CisgIGludCBpbnB1dF9mcmFtZXNfbGVmdF9mb3JfdGVzdGluZygpIGNvbnN0IHsgcmV0dXJuIGlucHV0X2ZyYW1lc187IH0KIAogIHByaXZhdGU6CiAgIC8vIENhbGxiYWNrIHRvIHByb3ZpZGUgZGF0YSB0byB0aGUgQXVkaW9Db252ZXJ0ZXIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idWZmZXJfcXVldWUuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idWZmZXJfcXVldWUuaAppbmRleCA2Mzk2MjhmLi42OWQzMzU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fYnVmZmVyX3F1ZXVlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1ZmZlcl9xdWV1ZS5oCkBAIC00NCw5ICs0NCw3IEBACiAgIC8vIHxzb3VyY2VfZnJhbWVfb2Zmc2V0fCBmcm9tIGN1cnJlbnQgcG9zaXRpb24uIHxkZXN0X2ZyYW1lX29mZnNldHwgc3BlY2lmaWVzCiAgIC8vIGEgc3RhcnRpbmcgb2Zmc2V0IGludG8gfGRlc3R8LiBPbiBlYWNoIGNhbGwsIHRoZSBmcmFtZXMgYXJlIGNvbnZlcnRlZCBmcm9tCiAgIC8vIHRoZWlyIHNvdXJjZSBmb3JtYXQgaW50byB0aGUgZGVzdGluYXRpb24gQXVkaW9CdXMuCi0gIGludCBQZWVrRnJhbWVzKGludCBmcmFtZXMsCi0gICAgICAgICAgICAgICAgIGludCBzb3VyY2VfZnJhbWVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICBpbnQgZGVzdF9mcmFtZV9vZmZzZXQsCisgIGludCBQZWVrRnJhbWVzKGludCBmcmFtZXMsIGludCBzb3VyY2VfZnJhbWVfb2Zmc2V0LCBpbnQgZGVzdF9mcmFtZV9vZmZzZXQsCiAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0KTsKIAogICAvLyBNb3ZlcyB0aGUgY3VycmVudCBwb3NpdGlvbiBmb3J3YXJkIGJ5IHxmcmFtZXN8IGZyYW1lcy4gSWYgfGZyYW1lc3wgZXhjZWVkcwpAQCAtNjcsMTEgKzY1LDggQEAKICAgLy8gb25seSB0aGUgY3VycmVudCBwb3NpdGlvbiB3aWxsIGFkdmFuY2UgYnV0IG5vIGRhdGEgd2lsbCBiZSBjb3BpZWQuCiAgIC8vIHxzb3VyY2VfZnJhbWVfb2Zmc2V0fCBjYW4gYmUgdXNlZCB0byBza2lwIGZyYW1lcyBiZWZvcmUgcmVhZGluZy4KICAgLy8gfGRlc3RfZnJhbWVfb2Zmc2V0fCBzcGVjaWZpZXMgYSBzdGFydGluZyBvZmZzZXQgaW50byB8ZGVzdHwuCi0gIGludCBJbnRlcm5hbFJlYWQoaW50IGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICBib29sIGFkdmFuY2VfcG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9mcmFtZV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgaW50IGRlc3RfZnJhbWVfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0KTsKKyAgaW50IEludGVybmFsUmVhZChpbnQgZnJhbWVzLCBib29sIGFkdmFuY2VfcG9zaXRpb24sIGludCBzb3VyY2VfZnJhbWVfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2ZyYW1lX29mZnNldCwgQXVkaW9CdXMqIGRlc3QpOwogCiAgIEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBjdXJyZW50X2J1ZmZlcl87CiAgIEJ1ZmZlclF1ZXVlIGJ1ZmZlcnNfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1cy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2J1cy5oCmluZGV4IDMwNjFkNmIuLmJlZDA4ZGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19idXMuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fYnVzLmgKQEAgLTQ3LDggKzQ3LDcgQEAKICAgLy8gb3duZXJzaGlwIG9mIHxjaGFubmVsX2RhdGF8IHRvIEF1ZGlvQnVzOyBpLmUuLCB8Y2hhbm5lbF9kYXRhfCBtdXN0IG91dGxpdmUKICAgLy8gdGhlIHJldHVybmVkIEF1ZGlvQnVzLiAgRWFjaCBjaGFubmVsIG11c3QgYmUgYWxpZ25lZCBieSBrQ2hhbm5lbEFsaWdubWVudC4KICAgc3RhdGljIHNjb3BlZF9wdHI8QXVkaW9CdXM+IFdyYXBWZWN0b3IoCi0gICAgICBpbnQgZnJhbWVzLAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQqPiYgY2hhbm5lbF9kYXRhKTsKKyAgICAgIGludCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0Kj4mIGNoYW5uZWxfZGF0YSk7CiAKICAgLy8gQ3JlYXRlcyBhIG5ldyBBdWRpb0J1cyBieSB3cmFwcGluZyBhbiBleGlzdGluZyBibG9jayBvZiBtZW1vcnkuICBCbG9jayBtdXN0CiAgIC8vIGJlIGF0IGxlYXN0IENhbGN1bGF0ZU1lbW9yeVNpemUoKSBieXRlcyBpbiBzaXplLiAgfGRhdGF8IG11c3Qgb3V0bGl2ZSB0aGUKQEAgLTk2LDggKzk1LDcgQEAKICAgdGVtcGxhdGUgPGNsYXNzIFNvdXJjZVNhbXBsZVR5cGVUcmFpdHM+CiAgIHZvaWQgRnJvbUludGVybGVhdmVkUGFydGlhbCgKICAgICAgIGNvbnN0IHR5cGVuYW1lIFNvdXJjZVNhbXBsZVR5cGVUcmFpdHM6OlZhbHVlVHlwZSogc291cmNlX2J1ZmZlciwKLSAgICAgIGludCB3cml0ZV9vZmZzZXRfaW5fZnJhbWVzLAotICAgICAgaW50IG51bV9mcmFtZXNfdG9fd3JpdGUpOworICAgICAgaW50IHdyaXRlX29mZnNldF9pbl9mcmFtZXMsIGludCBudW1fZnJhbWVzX3RvX3dyaXRlKTsKIAogICAvLyBERVBSRUNBVEVEIChodHRwczovL2NyYnVnLmNvbS81ODAzOTEpCiAgIC8vIFBsZWFzZSB1c2UgdGhlIHZlcnNpb24gdGVtcGxhdGVkIHdpdGggU291cmNlU2FtcGxlVHlwZVRyYWl0cyBpbnN0ZWFkLgpAQCAtMTI0LDE2ICsxMjIsMTMgQEAKICAgLy8gb2Zmc2V0IHxyZWFkX29mZnNldF9pbl9mcmFtZXN8LgogICB0ZW1wbGF0ZSA8Y2xhc3MgVGFyZ2V0U2FtcGxlVHlwZVRyYWl0cz4KICAgdm9pZCBUb0ludGVybGVhdmVkUGFydGlhbCgKLSAgICAgIGludCByZWFkX29mZnNldF9pbl9mcmFtZXMsCi0gICAgICBpbnQgbnVtX2ZyYW1lc190b19yZWFkLAorICAgICAgaW50IHJlYWRfb2Zmc2V0X2luX2ZyYW1lcywgaW50IG51bV9mcmFtZXNfdG9fcmVhZCwKICAgICAgIHR5cGVuYW1lIFRhcmdldFNhbXBsZVR5cGVUcmFpdHM6OlZhbHVlVHlwZSogZGVzdF9idWZmZXIpIGNvbnN0OwogCiAgIC8vIERFUFJFQ0FURUQgKGh0dHBzOi8vY3JidWcuY29tLzU4MDM5MSkKICAgLy8gUGxlYXNlIHVzZSB0aGUgdmVyc2lvbiB0ZW1wbGF0ZWQgd2l0aCBUYXJnZXRTYW1wbGVUeXBlVHJhaXRzIGluc3RlYWQuCiAgIC8vIFRPRE8oY2hmcmVtZXIpOiBSZW1vdmUgKGh0dHBzOi8vY3JidWcuY29tLzYxOTYyMykKLSAgdm9pZCBUb0ludGVybGVhdmVkUGFydGlhbChpbnQgc3RhcnRfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcGVyX3NhbXBsZSwKKyAgdm9pZCBUb0ludGVybGVhdmVkUGFydGlhbChpbnQgc3RhcnRfZnJhbWUsIGludCBmcmFtZXMsIGludCBieXRlc19wZXJfc2FtcGxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRlc3QpIGNvbnN0OwogCiAgIC8vIEhlbHBlciBtZXRob2QgZm9yIGNvcHlpbmcgY2hhbm5lbCBkYXRhIGZyb20gb25lIEF1ZGlvQnVzIHRvIGFub3RoZXIuICBCb3RoCkBAIC0xNDQsMTAgKzEzOSw4IEBACiAgIC8vIG9iamVjdHMgbXVzdCBoYXZlIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscygpLiB8c291cmNlX3N0YXJ0X2ZyYW1lfCBpcwogICAvLyB0aGUgc3RhcnRpbmcgb2Zmc2V0LiB8ZGVzdF9zdGFydF9mcmFtZXwgaXMgdGhlIHN0YXJ0aW5nIG9mZnNldCBpbiB8ZGVzdHwuCiAgIC8vIHxmcmFtZV9jb3VudHwgaXMgdGhlIG51bWJlciBvZiBmcmFtZXMgdG8gY29weS4KLSAgdm9pZCBDb3B5UGFydGlhbEZyYW1lc1RvKGludCBzb3VyY2Vfc3RhcnRfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9zdGFydF9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQnVzKiBkZXN0KSBjb25zdDsKKyAgdm9pZCBDb3B5UGFydGlhbEZyYW1lc1RvKGludCBzb3VyY2Vfc3RhcnRfZnJhbWUsIGludCBmcmFtZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3N0YXJ0X2ZyYW1lLCBBdWRpb0J1cyogZGVzdCkgY29uc3Q7CiAKICAgLy8gUmV0dXJucyBhIHJhdyBwb2ludGVyIHRvIHRoZSByZXF1ZXN0ZWQgY2hhbm5lbC4gIFBvaW50ZXIgaXMgZ3VhcmFudGVlZCB0bwogICAvLyBoYXZlIGEgMTYtYnl0ZSBhbGlnbm1lbnQuICBXYXJuaW5nOiBEbyBub3QgcmVseSBvbiBoYXZpbmcgc2FuZSAoaS5lLiBub3QKQEAgLTE5NCwxNSArMTg3LDExIEBACiAgIHRlbXBsYXRlIDxjbGFzcyBTb3VyY2VTYW1wbGVUeXBlVHJhaXRzPgogICBzdGF0aWMgdm9pZCBDb3B5Q29udmVydEZyb21JbnRlcmxlYXZlZFNvdXJjZVRvQXVkaW9CdXMoCiAgICAgICBjb25zdCB0eXBlbmFtZSBTb3VyY2VTYW1wbGVUeXBlVHJhaXRzOjpWYWx1ZVR5cGUqIHNvdXJjZV9idWZmZXIsCi0gICAgICBpbnQgd3JpdGVfb2Zmc2V0X2luX2ZyYW1lcywKLSAgICAgIGludCBudW1fZnJhbWVzX3RvX3dyaXRlLAotICAgICAgQXVkaW9CdXMqIGRlc3QpOworICAgICAgaW50IHdyaXRlX29mZnNldF9pbl9mcmFtZXMsIGludCBudW1fZnJhbWVzX3RvX3dyaXRlLCBBdWRpb0J1cyogZGVzdCk7CiAKICAgdGVtcGxhdGUgPGNsYXNzIFRhcmdldFNhbXBsZVR5cGVUcmFpdHM+CiAgIHN0YXRpYyB2b2lkIENvcHlDb252ZXJ0RnJvbUF1ZGlvQnVzVG9JbnRlcmxlYXZlZFRhcmdldCgKLSAgICAgIGNvbnN0IEF1ZGlvQnVzKiBzb3VyY2UsCi0gICAgICBpbnQgcmVhZF9vZmZzZXRfaW5fZnJhbWVzLAotICAgICAgaW50IG51bV9mcmFtZXNfdG9fcmVhZCwKKyAgICAgIGNvbnN0IEF1ZGlvQnVzKiBzb3VyY2UsIGludCByZWFkX29mZnNldF9pbl9mcmFtZXMsIGludCBudW1fZnJhbWVzX3RvX3JlYWQsCiAgICAgICB0eXBlbmFtZSBUYXJnZXRTYW1wbGVUeXBlVHJhaXRzOjpWYWx1ZVR5cGUqIGRlc3RfYnVmZmVyKTsKIAogICAvLyBDb250aWd1b3VzIGJsb2NrIG9mIGNoYW5uZWwgbWVtb3J5LgpAQCAtMjM1LDggKzIyNCw3IEBACiB0ZW1wbGF0ZSA8Y2xhc3MgU291cmNlU2FtcGxlVHlwZVRyYWl0cz4KIHZvaWQgQXVkaW9CdXM6OkZyb21JbnRlcmxlYXZlZFBhcnRpYWwoCiAgICAgY29uc3QgdHlwZW5hbWUgU291cmNlU2FtcGxlVHlwZVRyYWl0czo6VmFsdWVUeXBlKiBzb3VyY2VfYnVmZmVyLAotICAgIGludCB3cml0ZV9vZmZzZXRfaW5fZnJhbWVzLAotICAgIGludCBudW1fZnJhbWVzX3RvX3dyaXRlKSB7CisgICAgaW50IHdyaXRlX29mZnNldF9pbl9mcmFtZXMsIGludCBudW1fZnJhbWVzX3RvX3dyaXRlKSB7CiAgIENoZWNrT3ZlcmZsb3cod3JpdGVfb2Zmc2V0X2luX2ZyYW1lcywgbnVtX2ZyYW1lc190b193cml0ZSwgZnJhbWVzXyk7CiAgIENvcHlDb252ZXJ0RnJvbUludGVybGVhdmVkU291cmNlVG9BdWRpb0J1czxTb3VyY2VTYW1wbGVUeXBlVHJhaXRzPigKICAgICAgIHNvdXJjZV9idWZmZXIsIHdyaXRlX29mZnNldF9pbl9mcmFtZXMsIG51bV9mcmFtZXNfdG9fd3JpdGUsIHRoaXMpOwpAQCAtMjUzLDggKzI0MSw3IEBACiAKIHRlbXBsYXRlIDxjbGFzcyBUYXJnZXRTYW1wbGVUeXBlVHJhaXRzPgogdm9pZCBBdWRpb0J1czo6VG9JbnRlcmxlYXZlZFBhcnRpYWwoCi0gICAgaW50IHJlYWRfb2Zmc2V0X2luX2ZyYW1lcywKLSAgICBpbnQgbnVtX2ZyYW1lc190b19yZWFkLAorICAgIGludCByZWFkX29mZnNldF9pbl9mcmFtZXMsIGludCBudW1fZnJhbWVzX3RvX3JlYWQsCiAgICAgdHlwZW5hbWUgVGFyZ2V0U2FtcGxlVHlwZVRyYWl0czo6VmFsdWVUeXBlKiBkZXN0KSBjb25zdCB7CiAgIENoZWNrT3ZlcmZsb3cocmVhZF9vZmZzZXRfaW5fZnJhbWVzLCBudW1fZnJhbWVzX3RvX3JlYWQsIGZyYW1lc18pOwogICBDb3B5Q29udmVydEZyb21BdWRpb0J1c1RvSW50ZXJsZWF2ZWRUYXJnZXQ8VGFyZ2V0U2FtcGxlVHlwZVRyYWl0cz4oCkBAIC0yNjYsOSArMjUzLDcgQEAKIHRlbXBsYXRlIDxjbGFzcyBTb3VyY2VTYW1wbGVUeXBlVHJhaXRzPgogdm9pZCBBdWRpb0J1czo6Q29weUNvbnZlcnRGcm9tSW50ZXJsZWF2ZWRTb3VyY2VUb0F1ZGlvQnVzKAogICAgIGNvbnN0IHR5cGVuYW1lIFNvdXJjZVNhbXBsZVR5cGVUcmFpdHM6OlZhbHVlVHlwZSogc291cmNlX2J1ZmZlciwKLSAgICBpbnQgd3JpdGVfb2Zmc2V0X2luX2ZyYW1lcywKLSAgICBpbnQgbnVtX2ZyYW1lc190b193cml0ZSwKLSAgICBBdWRpb0J1cyogZGVzdCkgeworICAgIGludCB3cml0ZV9vZmZzZXRfaW5fZnJhbWVzLCBpbnQgbnVtX2ZyYW1lc190b193cml0ZSwgQXVkaW9CdXMqIGRlc3QpIHsKICAgY29uc3QgaW50IGNoYW5uZWxzID0gZGVzdC0+Y2hhbm5lbHMoKTsKICAgZm9yIChpbnQgY2ggPSAwOyBjaCA8IGNoYW5uZWxzOyArK2NoKSB7CiAgICAgZmxvYXQqIGNoYW5uZWxfZGF0YSA9IGRlc3QtPmNoYW5uZWwoY2gpOwpAQCAtMjg3LDkgKzI3Miw3IEBACiAvLyAgICAgICAgICAgICAgICAgaHR0cHM6Ly9jcmJ1Zy5jb20vNjE5NjI4CiB0ZW1wbGF0ZSA8Y2xhc3MgVGFyZ2V0U2FtcGxlVHlwZVRyYWl0cz4KIHZvaWQgQXVkaW9CdXM6OkNvcHlDb252ZXJ0RnJvbUF1ZGlvQnVzVG9JbnRlcmxlYXZlZFRhcmdldCgKLSAgICBjb25zdCBBdWRpb0J1cyogc291cmNlLAotICAgIGludCByZWFkX29mZnNldF9pbl9mcmFtZXMsCi0gICAgaW50IG51bV9mcmFtZXNfdG9fcmVhZCwKKyAgICBjb25zdCBBdWRpb0J1cyogc291cmNlLCBpbnQgcmVhZF9vZmZzZXRfaW5fZnJhbWVzLCBpbnQgbnVtX2ZyYW1lc190b19yZWFkLAogICAgIHR5cGVuYW1lIFRhcmdldFNhbXBsZVR5cGVUcmFpdHM6OlZhbHVlVHlwZSogZGVzdF9idWZmZXIpIHsKICAgY29uc3QgaW50IGNoYW5uZWxzID0gc291cmNlLT5jaGFubmVscygpOwogICBmb3IgKGludCBjaCA9IDA7IGNoIDwgY2hhbm5lbHM7ICsrY2gpIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19jYXB0dXJlcl9zb3VyY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19jYXB0dXJlcl9zb3VyY2UuaAppbmRleCAwYTUzYzU5Li43ODYyMzA4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fY2FwdHVyZXJfc291cmNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2NhcHR1cmVyX3NvdXJjZS5oCkBAIC0yNyw4ICsyNyw3IEBACiAgICAgLy8gVE9ETyhjaGN1bm5pbmdoYW0pOiBVcGRhdGUgZGVsYXkgYXJndW1lbnQgdG8gdXNlIGZyYW1lcyBpbnN0ZWFkIG9mCiAgICAgLy8gbWlsbGlzZWNvbmRzIHRvIHByZXZlbnQgbG9zcyBvZiBwcmVjaXNpb24uIFNlZSBodHRwOi8vY3JidWcuY29tLzU4NzI5MS4KICAgICB2aXJ0dWFsIHZvaWQgQ2FwdHVyZShjb25zdCBBdWRpb0J1cyogYXVkaW9fc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19kZWxheV9taWxsaXNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZvbHVtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXVkaW9fZGVsYXlfbWlsbGlzZWNvbmRzLCBkb3VibGUgdm9sdW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wga2V5X3ByZXNzZWQpID0gMDsKIAogICAgIC8vIFNpZ25hbHMgYW4gZXJyb3IgaGFzIG9jY3VycmVkLgpAQCAtNDUsOCArNDQsNyBAQAogICAvLyBzZWxlY3Rpb24sIHBhc3MgfHNlc3Npb25faWR8IHVzaW5nCiAgIC8vIEF1ZGlvSW5wdXREZXZpY2VNYW5hZ2VyOjprRmFrZU9wZW5TZXNzaW9uSWQuCiAgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgcGFyYW1zLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlQ2FsbGJhY2sqIGNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2Vzc2lvbl9pZCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICBDYXB0dXJlQ2FsbGJhY2sqIGNhbGxiYWNrLCBpbnQgc2Vzc2lvbl9pZCkgPSAwOwogCiAgIC8vIFN0YXJ0cyB0aGUgYXVkaW8gcmVjb3JkaW5nLgogICB2aXJ0dWFsIHZvaWQgU3RhcnQoKSA9IDA7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXIuaAppbmRleCAyYTVjYzhiLi40NDQyYTYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyLmgKQEAgLTU1LDggKzU1LDcgQEAKICAgLy8gfGluaXRfY2J8IGlzIHVzZWQgdG8gcmV0dXJuIGluaXRpYWxpemF0aW9uIHN0YXR1cy4KICAgLy8gfG91dHB1dF9jYnwgaXMgY2FsbGVkIGZvciBkZWNvZGVkIGF1ZGlvIGJ1ZmZlcnMgKHNlZSBEZWNvZGUoKSkuCiAgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdENCJiBpbml0X2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwgY29uc3QgSW5pdENCJiBpbml0X2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRDQiYgb3V0cHV0X2NiKSA9IDA7CiAKICAgLy8gUmVxdWVzdHMgc2FtcGxlcyB0byBiZSBkZWNvZGVkLiBPbmx5IG9uZSBkZWNvZGUgbWF5IGJlIGluIGZsaWdodCBhdCBhbnkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgKaW5kZXggNjA2YzkzZi4uMjcxYTJlNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgKQEAgLTMwLDI0ICszMCwxOSBAQAogICBBdWRpb0RlY29kZXJDb25maWcoKTsKIAogICAvLyBDb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIG9iamVjdC4KLSAgQXVkaW9EZWNvZGVyQ29uZmlnKEF1ZGlvQ29kZWMgY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICBTYW1wbGVGb3JtYXQgc2FtcGxlX2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlc19wZXJfc2Vjb25kLAorICBBdWRpb0RlY29kZXJDb25maWcoQXVkaW9Db2RlYyBjb2RlYywgU2FtcGxlRm9ybWF0IHNhbXBsZV9mb3JtYXQsCisgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LCBpbnQgc2FtcGxlc19wZXJfc2Vjb25kLAogICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGV4dHJhX2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbmNyeXB0aW9uU2NoZW1lJiBlbmNyeXB0aW9uX3NjaGVtZSk7CiAKICAgfkF1ZGlvRGVjb2RlckNvbmZpZygpOwogCiAgIC8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBvYmplY3QuIHxjb2RlY19kZWxheXwgaXMgaW4gZnJhbWVzLgotICB2b2lkIEluaXRpYWxpemUoQXVkaW9Db2RlYyBjb2RlYywKLSAgICAgICAgICAgICAgICAgIFNhbXBsZUZvcm1hdCBzYW1wbGVfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVzX3Blcl9zZWNvbmQsCisgIHZvaWQgSW5pdGlhbGl6ZShBdWRpb0NvZGVjIGNvZGVjLCBTYW1wbGVGb3JtYXQgc2FtcGxlX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQsIGludCBzYW1wbGVzX3Blcl9zZWNvbmQsCiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgZXh0cmFfZGF0YSwKICAgICAgICAgICAgICAgICAgIGNvbnN0IEVuY3J5cHRpb25TY2hlbWUmIGVuY3J5cHRpb25fc2NoZW1lLAotICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHNlZWtfcHJlcm9sbCwKLSAgICAgICAgICAgICAgICAgIGludCBjb2RlY19kZWxheSk7CisgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgc2Vla19wcmVyb2xsLCBpbnQgY29kZWNfZGVsYXkpOwogCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIG9iamVjdCBoYXMgYXBwcm9wcmlhdGUgY29uZmlndXJhdGlvbiB2YWx1ZXMsIGZhbHNlCiAgIC8vIG90aGVyd2lzZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19wYXJhbWV0ZXJzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fcGFyYW1ldGVycy5oCmluZGV4IDg1ZjMzMDEuLjk4YjQzZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19wYXJhbWV0ZXJzLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX3BhcmFtZXRlcnMuaApAQCAtOTYsMjAgKzk2LDE0IEBACiAgIH07CiAKICAgQXVkaW9QYXJhbWV0ZXJzKCk7Ci0gIEF1ZGlvUGFyYW1ldGVycyhGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgIGludCBiaXRzX3Blcl9zYW1wbGUsCi0gICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzX3Blcl9idWZmZXIpOworICBBdWRpb1BhcmFtZXRlcnMoRm9ybWF0IGZvcm1hdCwgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCwgaW50IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgaW50IGJpdHNfcGVyX3NhbXBsZSwgaW50IGZyYW1lc19wZXJfYnVmZmVyKTsKIAogICB+QXVkaW9QYXJhbWV0ZXJzKCk7CiAKICAgLy8gUmUtaW5pdGlhbGl6ZXMgYWxsIG1lbWJlcnMuCi0gIHZvaWQgUmVzZXQoRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICBDaGFubmVsTGF5b3V0IGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICBpbnQgYml0c19wZXJfc2FtcGxlLAotICAgICAgICAgICAgIGludCBmcmFtZXNfcGVyX2J1ZmZlcik7CisgIHZvaWQgUmVzZXQoRm9ybWF0IGZvcm1hdCwgQ2hhbm5lbExheW91dCBjaGFubmVsX2xheW91dCwgaW50IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgIGludCBiaXRzX3Blcl9zYW1wbGUsIGludCBmcmFtZXNfcGVyX2J1ZmZlcik7CiAKICAgLy8gQ2hlY2tzIHRoYXQgYWxsIHZhbHVlcyBhcmUgaW4gdGhlIGV4cGVjdGVkIHJhbmdlLiBBbGwgbGltaXRzIGFyZSBzcGVjaWZpZWQKICAgLy8gaW4gbWVkaWE6OkxpbWl0cy4KQEAgLTIxOCwxMCArMjEyLDggQEAKIAogLy8gQ29tcGFyaXNvbiBpcyB1c2VmdWwgd2hlbiBBdWRpb1BhcmFtZXRlcnMgaXMgdXNlZCB3aXRoIHN0ZCBzdHJ1Y3R1cmVzLgogaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IEF1ZGlvUGFyYW1ldGVycyYgYSwgY29uc3QgQXVkaW9QYXJhbWV0ZXJzJiBiKSB7Ci0gIGlmIChhLmZvcm1hdCgpICE9IGIuZm9ybWF0KCkpCi0gICAgcmV0dXJuIGEuZm9ybWF0KCkgPCBiLmZvcm1hdCgpOwotICBpZiAoYS5jaGFubmVscygpICE9IGIuY2hhbm5lbHMoKSkKLSAgICByZXR1cm4gYS5jaGFubmVscygpIDwgYi5jaGFubmVscygpOworICBpZiAoYS5mb3JtYXQoKSAhPSBiLmZvcm1hdCgpKSByZXR1cm4gYS5mb3JtYXQoKSA8IGIuZm9ybWF0KCk7CisgIGlmIChhLmNoYW5uZWxzKCkgIT0gYi5jaGFubmVscygpKSByZXR1cm4gYS5jaGFubmVscygpIDwgYi5jaGFubmVscygpOwogICBpZiAoYS5zYW1wbGVfcmF0ZSgpICE9IGIuc2FtcGxlX3JhdGUoKSkKICAgICByZXR1cm4gYS5zYW1wbGVfcmF0ZSgpIDwgYi5zYW1wbGVfcmF0ZSgpOwogICBpZiAoYS5iaXRzX3Blcl9zYW1wbGUoKSAhPSBiLmJpdHNfcGVyX3NhbXBsZSgpKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaAppbmRleCA3NDBlYmQzLi4zM2M3Zjk5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXIuaApAQCAtMzIsOCArMzIsNyBAQAogICAvLwogICAvLyB8Y2RtX2NvbnRleHR8IGNhbiBiZSB1c2VkIHRvIGhhbmRsZSBlbmNyeXB0ZWQgc3RyZWFtcy4gTWF5IGJlIG51bGwgaWYgdGhlCiAgIC8vIHN0cmVhbSBpcyBub3QgZW5jcnlwdGVkLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVyU3RyZWFtKiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIENkbUNvbnRleHQqIGNkbV9jb250ZXh0LAorICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVyU3RyZWFtKiBzdHJlYW0sIENkbUNvbnRleHQqIGNkbV9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJlckNsaWVudCogY2xpZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiKSA9IDA7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9zaW5rLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fcmVuZGVyZXJfc2luay5oCmluZGV4IGJiNDJjMmQuLjZkZmM3OWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19yZW5kZXJlcl9zaW5rLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX3JlbmRlcmVyX3NpbmsuaApAQCAtMzIsOCArMzIsNyBAQAogICAgIC8vIHRoZSBjb25zdW1lciBoYXMgc2tpcHBlZCwgaWYgYW55LgogICAgIC8vIFRPRE8oamFtZXN3ZXN0KTogQ2hhbmdlIHRvIHVzZSB0aGUgc2FtZSBzaWduYXR1cmUgYXMKICAgICAvLyBBdWRpb091dHB1dFN0cmVhbTo6QXVkaW9Tb3VyY2VDYWxsYmFjazo6T25Nb3JlRGF0YS4KLSAgICB2aXJ0dWFsIGludCBSZW5kZXIoQXVkaW9CdXMqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lc19kZWxheWVkLAorICAgIHZpcnR1YWwgaW50IFJlbmRlcihBdWRpb0J1cyogZGVzdCwgdWludDMyX3QgZnJhbWVzX2RlbGF5ZWQsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lc19za2lwcGVkKSA9IDA7CiAKICAgICAvLyBTaWduYWxzIGFuIGVycm9yIGhhcyBvY2N1cnJlZC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9iaW5kX3RvX2N1cnJlbnRfbG9vcC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgKaW5kZXggYzIwZmE2MS4uZGE2ZTAyZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgKQEAgLTMxLDcgKzMxLDkgQEAKIC8vIGJhc2U6OlBhc3NlZCgmcCkgdG8gYWNjb3VudCBmb3IgdGhlIGV4dHJhIGxheWVyIG9mIGluZGlyZWN0aW9uLgogbmFtZXNwYWNlIGludGVybmFsIHsKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVCYgVHJhbXBvbGluZUZvcndhcmQoVCYgdCkgeyByZXR1cm4gdDsgfQorVCYgVHJhbXBvbGluZUZvcndhcmQoVCYgdCkgeworICByZXR1cm4gdDsKK30KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFI+CiBiYXNlOjppbnRlcm5hbDo6UGFzc2VkV3JhcHBlcjxzY29wZWRfcHRyPFQ+ID4gVHJhbXBvbGluZUZvcndhcmQoCkBAIC00MSwxMiArNDMsMTUgQEAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBiYXNlOjppbnRlcm5hbDo6UGFzc2VkV3JhcHBlcjxTY29wZWRWZWN0b3I8VD4gPiBUcmFtcG9saW5lRm9yd2FyZCgKLSAgICBTY29wZWRWZWN0b3I8VD4mIHApIHsgcmV0dXJuIGJhc2U6OlBhc3NlZCgmcCk7IH0KKyAgICBTY29wZWRWZWN0b3I8VD4mIHApIHsKKyAgcmV0dXJuIGJhc2U6OlBhc3NlZCgmcCk7Cit9CiAKIC8vIEZpcnN0LCB0ZWxsIHRoZSBjb21waWxlciBUcmFtcG9saW5lSGVscGVyIGlzIGEgc3RydWN0IHRlbXBsYXRlIHdpdGggb25lCiAvLyB0eXBlIHBhcmFtZXRlci4gIFRoZW4gZGVmaW5lIHNwZWNpYWxpemF0aW9ucyB3aGVyZSB0aGUgdHlwZSBpcyBhIGZ1bmN0aW9uCiAvLyByZXR1cm5pbmcgdm9pZCBhbmQgdGFraW5nIHplcm8gb3IgbW9yZSBhcmd1bWVudHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgU2lnPiBzdHJ1Y3QgVHJhbXBvbGluZUhlbHBlcjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBTaWc+CitzdHJ1Y3QgVHJhbXBvbGluZUhlbHBlcjsKIAogdGVtcGxhdGUgPD4KIHN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoKT4gewpAQCAtNjAsOCArNjUsNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIEExPgogc3RydWN0IFRyYW1wb2xpbmVIZWxwZXI8dm9pZChBMSk+IHsKICAgc3RhdGljIHZvaWQgUnVuKGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4mIGxvb3AsCi0gICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExKT4mIGNiLAotICAgICAgICAgICAgICAgICAgQTEgYTEpIHsKKyAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoQTEpPiYgY2IsIEExIGExKSB7CiAgICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTEpKSk7CiAgIH0KIH07CkBAIC02OSw5ICs3Myw3IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyPgogc3RydWN0IFRyYW1wb2xpbmVIZWxwZXI8dm9pZChBMSwgQTIpPiB7CiAgIHN0YXRpYyB2b2lkIFJ1bihjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiBsb29wLAotICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChBMSwgQTIpPiYgY2IsCi0gICAgICAgICAgICAgICAgICBBMSBhMSwKLSAgICAgICAgICAgICAgICAgIEEyIGEyKSB7CisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExLCBBMik+JiBjYiwgQTEgYTEsIEEyIGEyKSB7CiAgICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTIpKSk7CiAgIH0KQEAgLTgwLDkgKzgyLDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzPgogc3RydWN0IFRyYW1wb2xpbmVIZWxwZXI8dm9pZChBMSwgQTIsIEEzKT4gewogICBzdGF0aWMgdm9pZCBSdW4oY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiYgbG9vcCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoQTEsIEEyLCBBMyk+JiBjYiwKLSAgICAgICAgICAgICAgICAgIEExIGExLAotICAgICAgICAgICAgICAgICAgQTIgYTIsCisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExLCBBMiwgQTMpPiYgY2IsIEExIGExLCBBMiBhMiwKICAgICAgICAgICAgICAgICAgIEEzIGEzKSB7CiAgICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTIpLApAQCAtOTMsMTEgKzkzLDggQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBND4KIHN0cnVjdCBUcmFtcG9saW5lSGVscGVyPHZvaWQoQTEsIEEyLCBBMywgQTQpPiB7CiAgIHN0YXRpYyB2b2lkIFJ1bihjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiBsb29wLAotICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChBMSwgQTIsIEEzLCBBNCk+JiBjYiwKLSAgICAgICAgICAgICAgICAgIEExIGExLAotICAgICAgICAgICAgICAgICAgQTIgYTIsCi0gICAgICAgICAgICAgICAgICBBMyBhMywKLSAgICAgICAgICAgICAgICAgIEE0IGE0KSB7CisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExLCBBMiwgQTMsIEE0KT4mIGNiLCBBMSBhMSwgQTIgYTIsCisgICAgICAgICAgICAgICAgICBBMyBhMywgQTQgYTQpIHsKICAgICBsb29wLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoY2IsIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMyksCkBAIC0xMDgsMTIgKzEwNSw4IEBACiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTEsIHR5cGVuYW1lIEEyLCB0eXBlbmFtZSBBMywgdHlwZW5hbWUgQTQsIHR5cGVuYW1lIEE1Pgogc3RydWN0IFRyYW1wb2xpbmVIZWxwZXI8dm9pZChBMSwgQTIsIEEzLCBBNCwgQTUpPiB7CiAgIHN0YXRpYyB2b2lkIFJ1bihjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiBsb29wLAotICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChBMSwgQTIsIEEzLCBBNCwgQTUpPiYgY2IsCi0gICAgICAgICAgICAgICAgICBBMSBhMSwKLSAgICAgICAgICAgICAgICAgIEEyIGEyLAotICAgICAgICAgICAgICAgICAgQTMgYTMsCi0gICAgICAgICAgICAgICAgICBBNCBhNCwKLSAgICAgICAgICAgICAgICAgIEE1IGE1KSB7CisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExLCBBMiwgQTMsIEE0LCBBNSk+JiBjYiwgQTEgYTEsCisgICAgICAgICAgICAgICAgICBBMiBhMiwgQTMgYTMsIEE0IGE0LCBBNSBhNSkgewogICAgIGxvb3AtPlBvc3RUYXNrKEZST01fSEVSRSwgYmFzZTo6QmluZChjYiwgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGExKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGEyKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJuYWw6OlRyYW1wb2xpbmVGb3J3YXJkKGEzKSwKQEAgLTEyMiwyMSArMTE1LDEyIEBACiAgIH0KIH07CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBBMSwKLSAgICAgICAgICB0eXBlbmFtZSBBMiwKLSAgICAgICAgICB0eXBlbmFtZSBBMywKLSAgICAgICAgICB0eXBlbmFtZSBBNCwKLSAgICAgICAgICB0eXBlbmFtZSBBNSwKK3RlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTIsIHR5cGVuYW1lIEEzLCB0eXBlbmFtZSBBNCwgdHlwZW5hbWUgQTUsCiAgICAgICAgICAgdHlwZW5hbWUgQTY+CiBzdHJ1Y3QgVHJhbXBvbGluZUhlbHBlcjx2b2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiB7CiAgIHN0YXRpYyB2b2lkIFJ1bihjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiBsb29wLAotICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChBMSwgQTIsIEEzLCBBNCwgQTUsIEE2KT4mIGNiLAotICAgICAgICAgICAgICAgICAgQTEgYTEsCi0gICAgICAgICAgICAgICAgICBBMiBhMiwKLSAgICAgICAgICAgICAgICAgIEEzIGEzLAotICAgICAgICAgICAgICAgICAgQTQgYTQsCi0gICAgICAgICAgICAgICAgICBBNSBhNSwKLSAgICAgICAgICAgICAgICAgIEE2IGE2KSB7CisgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDYWxsYmFjazx2b2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYpPiYgY2IsIEExIGExLAorICAgICAgICAgICAgICAgICAgQTIgYTIsIEEzIGEzLCBBNCBhNCwgQTUgYTUsIEE2IGE2KSB7CiAgICAgbG9vcC0+UG9zdFRhc2soRlJPTV9IRVJFLCBiYXNlOjpCaW5kKGNiLCBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTEpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6VHJhbXBvbGluZUZvcndhcmQoYTMpLApAQCAtMTQ2LDIzICsxMzAsMTIgQEAKICAgfQogfTsKIAotdGVtcGxhdGUgPHR5cGVuYW1lIEExLAotICAgICAgICAgIHR5cGVuYW1lIEEyLAotICAgICAgICAgIHR5cGVuYW1lIEEzLAotICAgICAgICAgIHR5cGVuYW1lIEE0LAotICAgICAgICAgIHR5cGVuYW1lIEE1LAotICAgICAgICAgIHR5cGVuYW1lIEE2LAotICAgICAgICAgIHR5cGVuYW1lIEE3PgordGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMiwgdHlwZW5hbWUgQTMsIHR5cGVuYW1lIEE0LCB0eXBlbmFtZSBBNSwKKyAgICAgICAgICB0eXBlbmFtZSBBNiwgdHlwZW5hbWUgQTc+CiBzdHJ1Y3QgVHJhbXBvbGluZUhlbHBlcjx2b2lkKEExLCBBMiwgQTMsIEE0LCBBNSwgQTYsIEE3KT4gewogICBzdGF0aWMgdm9pZCBSdW4oY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiYgbG9vcCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNhbGxiYWNrPHZvaWQoQTEsIEEyLCBBMywgQTQsIEE1LCBBNiwgQTcpPiYgY2IsCi0gICAgICAgICAgICAgICAgICBBMSBhMSwKLSAgICAgICAgICAgICAgICAgIEEyIGEyLAotICAgICAgICAgICAgICAgICAgQTMgYTMsCi0gICAgICAgICAgICAgICAgICBBNCBhNCwKLSAgICAgICAgICAgICAgICAgIEE1IGE1LAotICAgICAgICAgICAgICAgICAgQTYgYTYsCi0gICAgICAgICAgICAgICAgICBBNyBhNykgeworICAgICAgICAgICAgICAgICAgQTEgYTEsIEEyIGEyLCBBMyBhMywgQTQgYTQsIEE1IGE1LCBBNiBhNiwgQTcgYTcpIHsKICAgICBsb29wLT5Qb3N0VGFzayhGUk9NX0hFUkUsIGJhc2U6OkJpbmQoY2IsIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpUcmFtcG9saW5lRm9yd2FyZChhMyksCkBAIC0xNzUsOSArMTQ4LDggQEAKIAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCiAKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdGF0aWMgYmFzZTo6Q2FsbGJhY2s8VD4gQmluZFRvQ3VycmVudExvb3AoCi0gICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8VD4mIGNiKSB7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0YXRpYyBiYXNlOjpDYWxsYmFjazxUPiBCaW5kVG9DdXJyZW50TG9vcChjb25zdCBiYXNlOjpDYWxsYmFjazxUPiYgY2IpIHsKICAgcmV0dXJuIGJhc2U6OkJpbmQoJmludGVybmFsOjpUcmFtcG9saW5lSGVscGVyPFQ+OjpSdW4sCiAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRocmVhZFRhc2tSdW5uZXJIYW5kbGU6OkdldCgpLCBjYik7CiB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYml0X3JlYWRlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpdF9yZWFkZXIuaAppbmRleCBiZGM4YmZkLi5kYzQwZWZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYml0X3JlYWRlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9iaXRfcmVhZGVyLmgKQEAgLTE1LDMyICsxNSwyNSBAQAogbmFtZXNwYWNlIG1lZGlhIHsKIAogY2xhc3MgTUVESUFfRVhQT1JUIEJpdFJlYWRlcgotICAgIDogTk9OX0VYUE9SVEVEX0JBU0UocHJpdmF0ZSBCaXRSZWFkZXJDb3JlOjpCeXRlU3RyZWFtUHJvdmlkZXIpICB7CisgICAgOiBOT05fRVhQT1JURURfQkFTRShwcml2YXRlIEJpdFJlYWRlckNvcmU6OkJ5dGVTdHJlYW1Qcm92aWRlcikgewogIHB1YmxpYzoKICAgLy8gSW5pdGlhbGl6ZSB0aGUgcmVhZGVyIHRvIHN0YXJ0IHJlYWRpbmcgYXQgfGRhdGF8LCB8c2l6ZXwgYmVpbmcgc2l6ZQogICAvLyBvZiB8ZGF0YXwgaW4gYnl0ZXMuCiAgIEJpdFJlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgc2l6ZSk7CiAgIH5CaXRSZWFkZXIoKSBPVkVSUklERTsKIAotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBib29sIFJlYWRCaXRzKGludCBudW1fYml0cywgVCogb3V0KSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIFJlYWRCaXRzKGludCBudW1fYml0cywgVCogb3V0KSB7CiAgICAgcmV0dXJuIGJpdF9yZWFkZXJfY29yZV8uUmVhZEJpdHMobnVtX2JpdHMsIG91dCk7CiAgIH0KIAotICBib29sIFJlYWRGbGFnKGJvb2wqIGZsYWcpIHsKLSAgICByZXR1cm4gYml0X3JlYWRlcl9jb3JlXy5SZWFkRmxhZyhmbGFnKTsKLSAgfQorICBib29sIFJlYWRGbGFnKGJvb2wqIGZsYWcpIHsgcmV0dXJuIGJpdF9yZWFkZXJfY29yZV8uUmVhZEZsYWcoZmxhZyk7IH0KIAotICBib29sIFNraXBCaXRzKGludCBudW1fYml0cykgewotICAgIHJldHVybiBiaXRfcmVhZGVyX2NvcmVfLlNraXBCaXRzKG51bV9iaXRzKTsKLSAgfQorICBib29sIFNraXBCaXRzKGludCBudW1fYml0cykgeyByZXR1cm4gYml0X3JlYWRlcl9jb3JlXy5Ta2lwQml0cyhudW1fYml0cyk7IH0KIAotICBpbnQgYml0c19hdmFpbGFibGUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGluaXRpYWxfc2l6ZV8gKiA4IC0gYml0c19yZWFkKCk7Ci0gIH0KKyAgaW50IGJpdHNfYXZhaWxhYmxlKCkgY29uc3QgeyByZXR1cm4gaW5pdGlhbF9zaXplXyAqIDggLSBiaXRzX3JlYWQoKTsgfQogCi0gIGludCBiaXRzX3JlYWQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGJpdF9yZWFkZXJfY29yZV8uYml0c19yZWFkKCk7Ci0gIH0KKyAgaW50IGJpdHNfcmVhZCgpIGNvbnN0IHsgcmV0dXJuIGJpdF9yZWFkZXJfY29yZV8uYml0c19yZWFkKCk7IH0KIAogIHByaXZhdGU6CiAgIC8vIEJpdFJlYWRlckNvcmU6OkJ5dGVTdHJlYW1Qcm92aWRlciBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9iaXRfcmVhZGVyX2NvcmUuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9iaXRfcmVhZGVyX2NvcmUuaAppbmRleCA3NjE4M2RjLi43NzE2MDNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYml0X3JlYWRlcl9jb3JlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpdF9yZWFkZXJfY29yZS5oCkBAIC01NCw3ICs1NCw4IEBACiAgIC8vIGVudGVyIGEgc3RhdGUgd2hlcmUgZnVydGhlciBSZWFkQml0cy9Ta2lwQml0cyBvcGVyYXRpb25zIHdpbGwgYWx3YXlzCiAgIC8vIHJldHVybiBmYWxzZSB1bmxlc3MgfG51bV9iaXRzfCBpcyAwLiBUaGUgdHlwZSB8VHwgaGFzIHRvIGJlIGEgcHJpbWl0aXZlCiAgIC8vIGludGVnZXIgdHlwZS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBSZWFkQml0cyhpbnQgbnVtX2JpdHMsIFQqIG91dCkgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgYm9vbCBSZWFkQml0cyhpbnQgbnVtX2JpdHMsIFQqIG91dCkgewogICAgIERDSEVDS19MRShudW1fYml0cywgc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoVCkgKiA4KSk7CiAgICAgdWludDY0X3QgdGVtcDsKICAgICBib29sIHJldCA9IFJlYWRCaXRzSW50ZXJuYWwobnVtX2JpdHMsICZ0ZW1wKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9iaXRfcmVhZGVyX3VuaXR0ZXN0LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpdF9yZWFkZXJfdW5pdHRlc3QuY2MKaW5kZXggZGNmMmE5Zi4uNjJmODU1NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpdF9yZWFkZXJfdW5pdHRlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpdF9yZWFkZXJfdW5pdHRlc3QuY2MKQEAgLTg0LDE2ICs4NCw5IEBACiAgIC8vIHdoaWxlIHRoZSBudW1iZXIgb2YgYml0cyB0byBza2lwIHdhcyBjaG9zZW4gc28gYXMgdG8gY292ZXIgZnJvbSBzbWFsbCBza2lwcwogICAvLyB0byBsYXJnZSBza2lwcy4KICAgY29uc3Qgc2l6ZV90IHBhdHRlcm5fcmVhZF9za2lwW11bMl0gPSB7Ci0gICAgICB7IDUsICAxN30sCi0gICAgICB7IDQsICAzNH0sCi0gICAgICB7IDAsICA0NH0sCi0gICAgICB7IDMsICAgNH0sICAgLy8gTm90ZTogYWxpZ25lZCByZWFkLgotICAgICAgeyA3LCAgIDd9LCAgIC8vIE5vdGU6IGJvdGggcmVhZCZza2lwIGNyb3NzIGJ5dGUgYm91bmRhcnkuCi0gICAgICB7MTcsICA2OH0sCi0gICAgICB7IDcsIDEwMn0sCi0gICAgICB7IDksIDIwNH0sCi0gICAgICB7IDMsIDQwOH0KLSAgfTsKKyAgICAgIHs1LCAxN30sICB7NCwgMzR9LCAgezAsIDQ0fSwgIHszLCA0fSwgIC8vIE5vdGU6IGFsaWduZWQgcmVhZC4KKyAgICAgIHs3LCA3fSwgIC8vIE5vdGU6IGJvdGggcmVhZCZza2lwIGNyb3NzIGJ5dGUgYm91bmRhcnkuCisgICAgICB7MTcsIDY4fSwgezcsIDEwMn0sIHs5LCAyMDR9LCB7MywgNDA4fX07CiAKICAgLy8gU2V0IGJpdHMgdG8gb25lIG9ubHkgZm9yIHRoZSBmaXJzdCBhbmQgbGFzdCBiaXQgb2YgZWFjaCByZWFkCiAgIC8vIGluIHRoZSBwYXR0ZXJuLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpdHN0cmVhbV9idWZmZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9iaXRzdHJlYW1fYnVmZmVyLmgKaW5kZXggNmUxMTJmNy4uMDY0ODc2NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2JpdHN0cmVhbV9idWZmZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvYml0c3RyZWFtX2J1ZmZlci5oCkBAIC0zNyw5ICszNyw3IEBACiAgIC8vIHxwcmVzZW50YXRpb25fdGltZXN0YW1wfCBpcyB3aGVuIHRoZSBkZWNvZGVkIGZyYW1lIHNob3VsZCBiZSBkaXNwbGF5ZWQuCiAgIC8vIFdoZW4gbm90IHByb3ZpZGVkLCB8cHJlc2VudGF0aW9uX3RpbWVzdGFtcHwgd2lsbCBiZQogICAvLyB8bWVkaWE6OmtOb1RpbWVzdGFtcHwuCi0gIEJpdHN0cmVhbUJ1ZmZlcihpbnQzMl90IGlkLAotICAgICAgICAgICAgICAgICAgYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICBCaXRzdHJlYW1CdWZmZXIoaW50MzJfdCBpZCwgYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlIGhhbmRsZSwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICBvZmZfdCBvZmZzZXQgPSAwLAogICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHByZXNlbnRhdGlvbl90aW1lc3RhbXAgPSBrTm9UaW1lc3RhbXApOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2FsbGJhY2tfaG9sZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2FsbGJhY2tfaG9sZGVyLmgKaW5kZXggYTVkNTU4My4uNTk1NWM2MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NhbGxiYWNrX2hvbGRlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jYWxsYmFja19ob2xkZXIuaApAQCAtMTMsNyArMTMsOCBAQAogbmFtZXNwYWNlIG1lZGlhIHsKIAogLy8gQSBoZWxwZXIgY2xhc3MgdGhhdCBjYW4gaG9sZCBhIGNhbGxiYWNrIGZyb20gYmVpbmcgZmlyZWQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ0I+IGNsYXNzIENhbGxiYWNrSG9sZGVyIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBDQj4KK2NsYXNzIENhbGxiYWNrSG9sZGVyIHsKICBwdWJsaWM6CiAgIENhbGxiYWNrSG9sZGVyKCkgOiBob2xkXyhmYWxzZSkge30KIApAQCAtMzEsOSArMzIsNyBAQAogICAgIG9yaWdpbmFsX2NiXyA9IGNiOwogICB9CiAKLSAgYm9vbCBJc051bGwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIG9yaWdpbmFsX2NiXy5pc19udWxsKCkgJiYgaGVsZF9jYl8uaXNfbnVsbCgpOwotICB9CisgIGJvb2wgSXNOdWxsKCkgY29uc3QgeyByZXR1cm4gb3JpZ2luYWxfY2JfLmlzX251bGwoKSAmJiBoZWxkX2NiXy5pc19udWxsKCk7IH0KIAogICAvLyBIb2xkcyB0aGUgY2FsbGJhY2sgd2hlbiBSdW4oKSBpcyBjYWxsZWQuCiAgIHZvaWQgSG9sZENhbGxiYWNrKCkgeyBob2xkXyA9IHRydWU7IH0KQEAgLTQ4LDcgKzQ3LDggQEAKICAgICAgIGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZvcmlnaW5hbF9jYl8pLlJ1bigpOwogICB9CiAKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExPiB2b2lkIFJ1bk9ySG9sZChBMSBhMSkgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQTE+CisgIHZvaWQgUnVuT3JIb2xkKEExIGExKSB7CiAgICAgRENIRUNLKGhlbGRfY2JfLmlzX251bGwoKSk7CiAgICAgaWYgKGhvbGRfKSB7CiAgICAgICBoZWxkX2NiXyA9IGJhc2U6OkJpbmQoYmFzZTo6UmVzZXRBbmRSZXR1cm4oJm9yaWdpbmFsX2NiXyksCkBAIC01OCw3ICs1OCw4IEBACiAgICAgfQogICB9CiAKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEExLCB0eXBlbmFtZSBBMj4gdm9pZCBSdW5PckhvbGQoQTEgYTEsIEEyIGEyKSB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBBMSwgdHlwZW5hbWUgQTI+CisgIHZvaWQgUnVuT3JIb2xkKEExIGExLCBBMiBhMikgewogICAgIERDSEVDSyhoZWxkX2NiXy5pc19udWxsKCkpOwogICAgIGlmIChob2xkXykgewogICAgICAgaGVsZF9jYl8gPSBiYXNlOjpCaW5kKGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZvcmlnaW5hbF9jYl8pLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NkbV9jYWxsYmFja19wcm9taXNlLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2NhbGxiYWNrX3Byb21pc2UuaAppbmRleCAzNzczNWUzLi42ZDYzZTMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2NhbGxiYWNrX3Byb21pc2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2NhbGxiYWNrX3Byb21pc2UuaApAQCAtMTcsMTAgKzE3LDkgQEAKIAogbmFtZXNwYWNlIG1lZGlhIHsKIAotdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKT4KLSAgICBQcm9taXNlUmVqZWN0ZWRDQjsKK3R5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZCgKKyAgICBNZWRpYUtleXM6OkV4Y2VwdGlvbiBleGNlcHRpb25fY29kZSwgdWludDMyX3Qgc3lzdGVtX2NvZGUsCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpPiBQcm9taXNlUmVqZWN0ZWRDQjsKIAogdGVtcGxhdGUgPHR5cGVuYW1lLi4uIFQ+CiBjbGFzcyBNRURJQV9FWFBPUlQgQ2RtQ2FsbGJhY2tQcm9taXNlIDogcHVibGljIENkbVByb21pc2VUZW1wbGF0ZTxULi4uPiB7CkBAIC0zMSw4ICszMCw3IEBACiAKICAgLy8gQ2RtUHJvbWlzZVRlbXBsYXRlPFQ+IGltcGxlbWVudGF0aW9uLgogICB2aXJ0dWFsIHZvaWQgcmVzb2x2ZShjb25zdCBUJi4uLiByZXN1bHQpIE9WRVJSSURFOwotICB2aXJ0dWFsIHZvaWQgcmVqZWN0KE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jb2RlLAorICB2aXJ0dWFsIHZvaWQgcmVqZWN0KE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLCB1aW50MzJfdCBzeXN0ZW1fY29kZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgT1ZFUlJJREU7CiAKICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NkbV9mYWN0b3J5LmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2ZhY3RvcnkuaAppbmRleCBlNzkyYmI0Li5kNmJjNGVmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2ZhY3RvcnkuaApAQCAtMzAsMTAgKzMwLDggQEAKICAgLy8gQ3JlYXRlcyBhIENETSBmb3IgfGtleV9zeXN0ZW18IGFuZCByZXR1cm5zIGl0IHRocm91Z2ggfGNkbV9jcmVhdGVkX2NifAogICAvLyBhc3luY2hyb25vdXNseS4KICAgdmlydHVhbCB2b2lkIENyZWF0ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgY29uc3QgR1VSTCYgc2VjdXJpdHlfb3JpZ2luLAotICAgICAgY29uc3QgQ2RtQ29uZmlnJiBjZG1fY29uZmlnLAotICAgICAgY29uc3QgU2Vzc2lvbk1lc3NhZ2VDQiYgc2Vzc2lvbl9tZXNzYWdlX2NiLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sIGNvbnN0IEdVUkwmIHNlY3VyaXR5X29yaWdpbiwKKyAgICAgIGNvbnN0IENkbUNvbmZpZyYgY2RtX2NvbmZpZywgY29uc3QgU2Vzc2lvbk1lc3NhZ2VDQiYgc2Vzc2lvbl9tZXNzYWdlX2NiLAogICAgICAgY29uc3QgU2Vzc2lvbkNsb3NlZENCJiBzZXNzaW9uX2Nsb3NlZF9jYiwKICAgICAgIGNvbnN0IFNlc3Npb25LZXlzQ2hhbmdlQ0ImIHNlc3Npb25fa2V5c19jaGFuZ2VfY2IsCiAgICAgICBjb25zdCBTZXNzaW9uRXhwaXJhdGlvblVwZGF0ZUNCJiBzZXNzaW9uX2V4cGlyYXRpb25fdXBkYXRlX2NiLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NkbV9pbml0aWFsaXplZF9wcm9taXNlLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2luaXRpYWxpemVkX3Byb21pc2UuaAppbmRleCA5OTIxODFmLi5lN2JhNzhjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2luaXRpYWxpemVkX3Byb21pc2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2luaXRpYWxpemVkX3Byb21pc2UuaApAQCAtMjgsOCArMjgsNyBAQAogCiAgIC8vIFNpbXBsZUNkbVByb21pc2UgaW1wbGVtZW50YXRpb24uCiAgIHZvaWQgcmVzb2x2ZSgpIE9WRVJSSURFOwotICB2b2lkIHJlamVjdChNZWRpYUtleXM6OkV4Y2VwdGlvbiBleGNlcHRpb25fY29kZSwKLSAgICAgICAgICAgICAgdWludDMyX3Qgc3lzdGVtX2NvZGUsCisgIHZvaWQgcmVqZWN0KE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLCB1aW50MzJfdCBzeXN0ZW1fY29kZSwKICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpIE9WRVJSSURFOwogCiAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jZG1fa2V5X2luZm9ybWF0aW9uLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX2tleV9pbmZvcm1hdGlvbi5oCmluZGV4IDI1MWYxMjMuLmQyZmIyNjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jZG1fa2V5X2luZm9ybWF0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NkbV9rZXlfaW5mb3JtYXRpb24uaApAQCAtMzAsMTYgKzMwLDEyIEBACiAgIC8vIERlZmF1bHQgY29uc3RydWN0b3IgbmVlZGVkIGZvciBwYXNzaW5nIHRoaXMgdHlwZSB0aHJvdWdoIElQQy4gUmVndWxhcgogICAvLyBjb2RlIHNob3VsZCB1c2Ugb25lIG9mIHRoZSBvdGhlciBjb25zdHJ1Y3RvcnMuCiAgIENkbUtleUluZm9ybWF0aW9uKCk7Ci0gIENkbUtleUluZm9ybWF0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXlfaWQsCi0gICAgICAgICAgICAgICAgICAgIEtleVN0YXR1cyBzdGF0dXMsCisgIENkbUtleUluZm9ybWF0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBrZXlfaWQsIEtleVN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jb2RlKTsKLSAgQ2RtS2V5SW5mb3JtYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9pZCwKLSAgICAgICAgICAgICAgICAgICAgS2V5U3RhdHVzIHN0YXR1cywKKyAgQ2RtS2V5SW5mb3JtYXRpb24oY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9pZCwgS2V5U3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3lzdGVtX2NvZGUpOwotICBDZG1LZXlJbmZvcm1hdGlvbihjb25zdCB1aW50OF90KiBrZXlfaWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGtleV9pZF9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIEtleVN0YXR1cyBzdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jb2RlKTsKKyAgQ2RtS2V5SW5mb3JtYXRpb24oY29uc3QgdWludDhfdCoga2V5X2lkX2RhdGEsIHNpemVfdCBrZXlfaWRfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICBLZXlTdGF0dXMgc3RhdHVzLCB1aW50MzJfdCBzeXN0ZW1fY29kZSk7CiAgIENkbUtleUluZm9ybWF0aW9uKGNvbnN0IENkbUtleUluZm9ybWF0aW9uJiBvdGhlcik7CiAgIH5DZG1LZXlJbmZvcm1hdGlvbigpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX3Byb21pc2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jZG1fcHJvbWlzZS5oCmluZGV4IGVkZWQ5NDUuLjIyYTkxZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jZG1fcHJvbWlzZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jZG1fcHJvbWlzZS5oCkBAIC00Niw4ICs0Niw3IEBACiAgIC8vIHNwZWNpZmllZC4gfHN5c3RlbV9jb2RlfCBpcyBhIEtleSBTeXN0ZW0tc3BlY2lmaWMgdmFsdWUgZm9yIHRoZSBlcnJvcgogICAvLyB0aGF0IG9jY3VycmVkLCBvciAwIGlmIHRoZXJlIGlzIG5vIGFzc29jaWF0ZWQgc3RhdHVzIGNvZGUgb3Igc3VjaCBzdGF0dXMKICAgLy8gY29kZXMgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIEtleSBTeXN0ZW0uIHxlcnJvcl9tZXNzYWdlfCBpcyBvcHRpb25hbC4KLSAgdmlydHVhbCB2b2lkIHJlamVjdChNZWRpYUtleXM6OkV4Y2VwdGlvbiBleGNlcHRpb25fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeXN0ZW1fY29kZSwKKyAgdmlydHVhbCB2b2lkIHJlamVjdChNZWRpYUtleXM6OkV4Y2VwdGlvbiBleGNlcHRpb25fY29kZSwgdWludDMyX3Qgc3lzdGVtX2NvZGUsCiAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpID0gMDsKIAogICAvLyBVc2VkIHRvIGRldGVybWluZSB0aGUgdGVtcGxhdGUgdHlwZSBvZiBDZG1Qcm9taXNlVGVtcGxhdGU8VD4gc28gdGhhdApAQCAtOTAsOCArODksNyBAQAogICB2aXJ0dWFsIHZvaWQgcmVzb2x2ZShjb25zdCBUJi4uLiByZXN1bHQpID0gMDsKIAogICAvLyBDZG1Qcm9taXNlIGltcGxlbWVudGF0aW9uLgotICB2aXJ0dWFsIHZvaWQgcmVqZWN0KE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLAotICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jb2RlLAorICB2aXJ0dWFsIHZvaWQgcmVqZWN0KE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLCB1aW50MzJfdCBzeXN0ZW1fY29kZSwKICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgPSAwOwogCiAgIFJlc29sdmVQYXJhbWV0ZXJUeXBlIEdldFJlc29sdmVQYXJhbWV0ZXJUeXBlKCkgY29uc3Qgb3ZlcnJpZGUgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NkbV9wcm9taXNlX2FkYXB0ZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jZG1fcHJvbWlzZV9hZGFwdGVyLmgKaW5kZXggNTliMjQ3OS4uNTg0OTk4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NkbV9wcm9taXNlX2FkYXB0ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2RtX3Byb21pc2VfYWRhcHRlci5oCkBAIC0zNiwxMCArMzYsOCBAQAogCiAgIC8vIFRha2VzIHRoZSBwcm9taXNlIGZvciB8cHJvbWlzZV9pZHwgYW5kIHJlamVjdHMgaXQgd2l0aCB8ZXhjZXB0aW9uX2NvZGV8LAogICAvLyB8c3lzdGVtX2NvZGV8IGFuZCB8ZXJyb3JfbWVzc2FnZXwuCi0gIHZvaWQgUmVqZWN0UHJvbWlzZSh1aW50MzJfdCBwcm9taXNlX2lkLAotICAgICAgICAgICAgICAgICAgICAgTWVkaWFLZXlzOjpFeGNlcHRpb24gZXhjZXB0aW9uX2NvZGUsCi0gICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBzeXN0ZW1fY29kZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKTsKKyAgdm9pZCBSZWplY3RQcm9taXNlKHVpbnQzMl90IHByb21pc2VfaWQsIE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLAorICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgc3lzdGVtX2NvZGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKTsKIAogICAvLyBSZWplY3RzIGFuZCBjbGVhcnMgYWxsIHxwcm9taXNlc198LgogICB2b2lkIENsZWFyKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2hhbm5lbF9sYXlvdXQuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oCmluZGV4IDg4MWM5M2IuLjBiNmY4NjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jaGFubmVsX2xheW91dC5oCkBAIC0xMjQsNyArMTI0LDggQEAKICAgQkFDS19DRU5URVIsCiAgIFNJREVfTEVGVCwKICAgU0lERV9SSUdIVCwKLSAgQ0hBTk5FTFNfTUFYID0gU0lERV9SSUdIVCwgLy8gTXVzdCBhbHdheXMgZXF1YWwgdGhlIGxhcmdlc3QgdmFsdWUgZXZlciBsb2dnZWQuCisgIENIQU5ORUxTX01BWCA9CisgICAgICBTSURFX1JJR0hULCAgLy8gTXVzdCBhbHdheXMgZXF1YWwgdGhlIGxhcmdlc3QgdmFsdWUgZXZlciBsb2dnZWQuCiB9OwogCiAvLyBSZXR1cm5zIHRoZSBleHBlY3RlZCBjaGFubmVsIHBvc2l0aW9uIGluIGFuIGludGVybGVhdmVkIHN0cmVhbS4gIFZhbHVlcyBvZiAtMQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NoYW5uZWxfbWl4aW5nX21hdHJpeC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NoYW5uZWxfbWl4aW5nX21hdHJpeC5oCmluZGV4IDgzNjgxMDcuLmI1NWE4Y2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jaGFubmVsX21peGluZ19tYXRyaXguaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY2hhbm5lbF9taXhpbmdfbWF0cml4LmgKQEAgLTE1LDEwICsxNSw4IEBACiAKIGNsYXNzIE1FRElBX0VYUE9SVCBDaGFubmVsTWl4aW5nTWF0cml4IHsKICBwdWJsaWM6Ci0gIENoYW5uZWxNaXhpbmdNYXRyaXgoQ2hhbm5lbExheW91dCBpbnB1dF9sYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGlucHV0X2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxMYXlvdXQgb3V0cHV0X2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgb3V0cHV0X2NoYW5uZWxzKTsKKyAgQ2hhbm5lbE1peGluZ01hdHJpeChDaGFubmVsTGF5b3V0IGlucHV0X2xheW91dCwgaW50IGlucHV0X2NoYW5uZWxzLAorICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxMYXlvdXQgb3V0cHV0X2xheW91dCwgaW50IG91dHB1dF9jaGFubmVscyk7CiAKICAgfkNoYW5uZWxNaXhpbmdNYXRyaXgoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NvbG9yX3NwYWNlLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuaAppbmRleCAxYTNiNmRiLi5lNWE5NDc1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY29sb3Jfc3BhY2UuaApAQCAtMTIsOCArMTIsMTAgQEAKIC8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKIC8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCi0jaWZuZGVmIENPQkFMVF9NRURJQV9ERU1VWEVSX0JBU0VfQ09MT1JfU1BBQ0VfSF8KLSNkZWZpbmUgQ09CQUxUX01FRElBX0RFTVVYRVJfQkFTRV9DT0xPUl9TUEFDRV9IXworI2lmbmRlZiBDT0JBTFRfTUVESUFfQkFTRV9DT0xPUl9TUEFDRV9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9DT0xPUl9TUEFDRV9IXworCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAKIC8vIFRoaXMgaXMgYSBtb2RpZmllZCB2ZXJzaW9uIG9mIGdmeDo6Q29sb3JTcGFjZSB3aXRoIFNraWEgZGVwZW5kZW5jeSByZW1vdmVkLgogLy8gSXQgaXMgdGVudGF0aXZlbHkgcHV0IGluc2lkZSBtZWRpYTIgdG8gYXZvaWQgaW50cm9kdWNpbmcgbmV3IGNvZGUgaW50bwpAQCAtMjYsNiArMjgsOCBAQAogLy8gYmV0d2VlbiBhbnkgcHJvY2Vzc2VzLgogY2xhc3MgQ29sb3JTcGFjZSB7CiAgcHVibGljOgorICB0eXBlZGVmIGZsb2F0IEN1c3RvbVByaW1hcnlNYXRyaXhbMTJdOworCiAgIGVudW0gUHJpbWFyeUlEIHsKICAgICAvLyBUaGUgZmlyc3QgMC0yNTUgdmFsdWVzIHNob3VsZCBtYXRjaCB0aGUgSDI2NCBzcGVjaWZpY2F0aW9uIChzZWUgVGFibGUgRS0zCiAgICAgLy8gQ29sb3VyIFByaW1hcmllcyBpbiBodHRwczovL3d3dy5pdHUuaW50L3JlYy9ULVJFQy1ILjI2NC9lbikuCkBAIC0xMDQsNyArMTA4LDcgQEAKICAgICBrTWF0cml4SWRTbXB0ZTI0ME0gPSA3LAogICAgIGtNYXRyaXhJZFlDZ0NvID0gOCwKICAgICBrTWF0cml4SWRCdDIwMjBOb25jb25zdGFudEx1bWluYW5jZSA9IDksCi0gICAga01hdHJpeElkQlQyMDIwQ29uc3RhbnRMdW1pbmFuY2UgPSAxMCwKKyAgICBrTWF0cml4SWRCdDIwMjBDb25zdGFudEx1bWluYW5jZSA9IDEwLAogICAgIGtNYXRyaXhJZFlEekR4ID0gMTEsCiAKICAgICBrTWF0cml4SWRMYXN0U3RhbmRhcmRWYWx1ZSA9IGtNYXRyaXhJZFlEekR4LApAQCAtMTM1LDkgKzEzOSw3IEBACiAgIH07CiAKICAgQ29sb3JTcGFjZSgpOwotICBDb2xvclNwYWNlKFByaW1hcnlJRCBwcmltYXJpZXMsCi0gICAgICAgICAgICAgVHJhbnNmZXJJRCB0cmFuc2ZlciwKLSAgICAgICAgICAgICBNYXRyaXhJRCBtYXRyaXgsCisgIENvbG9yU3BhY2UoUHJpbWFyeUlEIHByaW1hcmllcywgVHJhbnNmZXJJRCB0cmFuc2ZlciwgTWF0cml4SUQgbWF0cml4LAogICAgICAgICAgICAgIFJhbmdlSUQgZnVsbF9yYW5nZSk7CiAgIENvbG9yU3BhY2UoY29uc3QgQ29sb3JTcGFjZSYgb3RoZXIpOwogICBDb2xvclNwYWNlKGludCBwcmltYXJpZXMsIGludCB0cmFuc2ZlciwgaW50IG1hdHJpeCwgUmFuZ2VJRCBmdWxsX3JhbmdlKTsKQEAgLTE1OCwxNiArMTYwLDI2IEBACiAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBDb2xvclNwYWNlJiBvdGhlcikgY29uc3Q7CiAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IENvbG9yU3BhY2UmIG90aGVyKSBjb25zdDsKIAorICBQcmltYXJ5SUQgcHJpbWFyaWVzKCkgY29uc3QgeyByZXR1cm4gcHJpbWFyaWVzXzsgfQorICBUcmFuc2ZlcklEIHRyYW5zZmVyKCkgY29uc3QgeyByZXR1cm4gdHJhbnNmZXJfOyB9CisgIE1hdHJpeElEIG1hdHJpeCgpIGNvbnN0IHsgcmV0dXJuIG1hdHJpeF87IH0KKyAgUmFuZ2VJRCByYW5nZSgpIGNvbnN0IHsgcmV0dXJuIHJhbmdlXzsgfQorCisgIGNvbnN0IEN1c3RvbVByaW1hcnlNYXRyaXgmIGN1c3RvbV9wcmltYXJ5X21hdHJpeCgpIGNvbnN0IHsKKyAgICBEQ0hFQ0tfRVEocHJpbWFyaWVzXywga1ByaW1hcnlJZEN1c3RvbSk7CisgICAgcmV0dXJuIGN1c3RvbV9wcmltYXJ5X21hdHJpeF87CisgIH0KKwogIHByaXZhdGU6CiAgIFByaW1hcnlJRCBwcmltYXJpZXNfOwogICBUcmFuc2ZlcklEIHRyYW5zZmVyXzsKICAgTWF0cml4SUQgbWF0cml4XzsKICAgUmFuZ2VJRCByYW5nZV87CiAKLSAgLy8gT25seSB1c2VkIGlmIHByaW1hcmllc18gPT0gUHJpbWFyeUlEOjpDVVNUT00KKyAgLy8gT25seSB1c2VkIGlmIHByaW1hcmllc18gPT0ga1ByaW1hcnlJZEN1c3RvbQogICBmbG9hdCBjdXN0b21fcHJpbWFyeV9tYXRyaXhfWzEyXTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBnZngKIAotI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfREVNVVhFUl9CQVNFX0NPTE9SX1NQQUNFX0hfCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX0NPTE9SX1NQQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY29udGFpbmVyX25hbWVzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvY29udGFpbmVyX25hbWVzLmgKaW5kZXggNDFhY2M3Zi4uYWVlMzQ2YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2NvbnRhaW5lcl9uYW1lcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9jb250YWluZXJfbmFtZXMuaApAQCAtMTksNDcgKzE5LDQ3IEBACiAvLyBzeW5jIHdpdGggdGhlIGVudW0gZGVmaW5pdGlvbiAiTWVkaWFDb250YWluZXJzIiBpbgogLy8gdG9vbHMvbWV0cmljcy9oaXN0b2dyYW1zL2hpc3RvZ3JhbXMueG1sLgogZW51bSBNZWRpYUNvbnRhaW5lck5hbWUgewotICBDT05UQUlORVJfVU5LTk9XTiwgICAgICAgICAgLy8gVW5rbm93bgotICBDT05UQUlORVJfQUFDLCAgICAgICAgICAgICAgLy8gQUFDIChBZHZhbmNlZCBBdWRpbyBDb2RpbmcpCi0gIENPTlRBSU5FUl9BQzMsICAgICAgICAgICAgICAvLyBBQy0zCi0gIENPTlRBSU5FUl9BSUZGLCAgICAgICAgICAgICAvLyBBSUZGIChBdWRpbyBJbnRlcmNoYW5nZSBGaWxlIEZvcm1hdCkKLSAgQ09OVEFJTkVSX0FNUiwgICAgICAgICAgICAgIC8vIEFNUiAoQWRhcHRpdmUgTXVsdGktUmF0ZSBBdWRpbykKLSAgQ09OVEFJTkVSX0FQRSwgICAgICAgICAgICAgIC8vIEFQRSAoTW9ua2V5J3MgQXVkaW8pCi0gIENPTlRBSU5FUl9BU0YsICAgICAgICAgICAgICAvLyBBU0YgKEFkdmFuY2VkIC8gQWN0aXZlIFN0cmVhbWluZyBGb3JtYXQpCi0gIENPTlRBSU5FUl9BU1MsICAgICAgICAgICAgICAvLyBTU0EgKFN1YlN0YXRpb24gQWxwaGEpIHN1YnRpdGxlCi0gIENPTlRBSU5FUl9BVkksICAgICAgICAgICAgICAvLyBBVkkgKEF1ZGlvIFZpZGVvIEludGVybGVhdmVkKQotICBDT05UQUlORVJfQklOSywgICAgICAgICAgICAgLy8gQmluawotICBDT05UQUlORVJfQ0FGLCAgICAgICAgICAgICAgLy8gQ0FGIChBcHBsZSBDb3JlIEF1ZGlvIEZvcm1hdCkKLSAgQ09OVEFJTkVSX0RUUywgICAgICAgICAgICAgIC8vIERUUwotICBDT05UQUlORVJfRFRTSEQsICAgICAgICAgICAgLy8gRFRTLUhECi0gIENPTlRBSU5FUl9EViwgICAgICAgICAgICAgICAvLyBEViAoRGlnaXRhbCBWaWRlbykKLSAgQ09OVEFJTkVSX0RYQSwgICAgICAgICAgICAgIC8vIERYQQotICBDT05UQUlORVJfRUFDMywgICAgICAgICAgICAgLy8gRW5oYW5jZWQgQUMtMwotICBDT05UQUlORVJfRkxBQywgICAgICAgICAgICAgLy8gRkxBQyAoRnJlZSBMb3NzbGVzcyBBdWRpbyBDb2RlYykKLSAgQ09OVEFJTkVSX0ZMViwgICAgICAgICAgICAgIC8vIEZMViAoRmxhc2ggVmlkZW8pCi0gIENPTlRBSU5FUl9HU00sICAgICAgICAgICAgICAvLyBHU00gKEdsb2JhbCBTeXN0ZW0gZm9yIE1vYmlsZSBBdWRpbykKLSAgQ09OVEFJTkVSX0gyNjEsICAgICAgICAgICAgIC8vIEguMjYxCi0gIENPTlRBSU5FUl9IMjYzLCAgICAgICAgICAgICAvLyBILjI2MwotICBDT05UQUlORVJfSDI2NCwgICAgICAgICAgICAgLy8gSC4yNjQKLSAgQ09OVEFJTkVSX0hMUywgICAgICAgICAgICAgIC8vIEhMUyAoQXBwbGUgSFRUUCBMaXZlIFN0cmVhbWluZyBQbGF5TGlzdCkKLSAgQ09OVEFJTkVSX0lSQ0FNLCAgICAgICAgICAgIC8vIEJlcmtlbGV5L0lSQ0FNL0NBUkwgU291bmQgRm9ybWF0Ci0gIENPTlRBSU5FUl9NSlBFRywgICAgICAgICAgICAvLyBNSlBFRyB2aWRlbwotICBDT05UQUlORVJfTU9WLCAgICAgICAgICAgICAgLy8gUXVpY2tUaW1lIC8gTU9WIC8gTVBFRzQKLSAgQ09OVEFJTkVSX01QMywgICAgICAgICAgICAgIC8vIE1QMyAoTVBFRyBhdWRpbyBsYXllciAyLzMpCi0gIENPTlRBSU5FUl9NUEVHMlBTLCAgICAgICAgICAvLyBNUEVHLTIgUHJvZ3JhbSBTdHJlYW0KLSAgQ09OVEFJTkVSX01QRUcyVFMsICAgICAgICAgIC8vIE1QRUctMiBUcmFuc3BvcnQgU3RyZWFtCi0gIENPTlRBSU5FUl9NUEVHNEJTLCAgICAgICAgICAvLyBNUEVHLTQgQml0c3RyZWFtCi0gIENPTlRBSU5FUl9PR0csICAgICAgICAgICAgICAvLyBPZ2cKLSAgQ09OVEFJTkVSX1JNLCAgICAgICAgICAgICAgIC8vIFJNIChSZWFsTWVkaWEpCi0gIENPTlRBSU5FUl9TUlQsICAgICAgICAgICAgICAvLyBTUlQgKFN1YlJpcCBzdWJ0aXRsZSkKLSAgQ09OVEFJTkVSX1NXRiwgICAgICAgICAgICAgIC8vIFNXRiAoU2hvY2tXYXZlIEZsYXNoKQotICBDT05UQUlORVJfVkMxLCAgICAgICAgICAgICAgLy8gVkMtMQotICBDT05UQUlORVJfV0FWLCAgICAgICAgICAgICAgLy8gV0FWIC8gV0FWRSAoV2F2ZWZvcm0gQXVkaW8pCi0gIENPTlRBSU5FUl9XRUJNLCAgICAgICAgICAgICAvLyBNYXRyb3NrYSAvIFdlYk0KLSAgQ09OVEFJTkVSX1dUViwgICAgICAgICAgICAgIC8vIFdUViAoV2luZG93cyBUZWxldmlzaW9uKQotICBDT05UQUlORVJfREFTSCwgICAgICAgICAgICAgLy8gREFTSCAoTVBFRy1EQVNIKQotICBDT05UQUlORVJfU01PT1RIU1RSRUFNLCAgICAgLy8gU21vb3RoU3RyZWFtaW5nCi0gIENPTlRBSU5FUl9NQVggICAgICAgICAgICAgICAvLyBNdXN0IGJlIGxhc3QKKyAgQ09OVEFJTkVSX1VOS05PV04sICAgICAgIC8vIFVua25vd24KKyAgQ09OVEFJTkVSX0FBQywgICAgICAgICAgIC8vIEFBQyAoQWR2YW5jZWQgQXVkaW8gQ29kaW5nKQorICBDT05UQUlORVJfQUMzLCAgICAgICAgICAgLy8gQUMtMworICBDT05UQUlORVJfQUlGRiwgICAgICAgICAgLy8gQUlGRiAoQXVkaW8gSW50ZXJjaGFuZ2UgRmlsZSBGb3JtYXQpCisgIENPTlRBSU5FUl9BTVIsICAgICAgICAgICAvLyBBTVIgKEFkYXB0aXZlIE11bHRpLVJhdGUgQXVkaW8pCisgIENPTlRBSU5FUl9BUEUsICAgICAgICAgICAvLyBBUEUgKE1vbmtleSdzIEF1ZGlvKQorICBDT05UQUlORVJfQVNGLCAgICAgICAgICAgLy8gQVNGIChBZHZhbmNlZCAvIEFjdGl2ZSBTdHJlYW1pbmcgRm9ybWF0KQorICBDT05UQUlORVJfQVNTLCAgICAgICAgICAgLy8gU1NBIChTdWJTdGF0aW9uIEFscGhhKSBzdWJ0aXRsZQorICBDT05UQUlORVJfQVZJLCAgICAgICAgICAgLy8gQVZJIChBdWRpbyBWaWRlbyBJbnRlcmxlYXZlZCkKKyAgQ09OVEFJTkVSX0JJTkssICAgICAgICAgIC8vIEJpbmsKKyAgQ09OVEFJTkVSX0NBRiwgICAgICAgICAgIC8vIENBRiAoQXBwbGUgQ29yZSBBdWRpbyBGb3JtYXQpCisgIENPTlRBSU5FUl9EVFMsICAgICAgICAgICAvLyBEVFMKKyAgQ09OVEFJTkVSX0RUU0hELCAgICAgICAgIC8vIERUUy1IRAorICBDT05UQUlORVJfRFYsICAgICAgICAgICAgLy8gRFYgKERpZ2l0YWwgVmlkZW8pCisgIENPTlRBSU5FUl9EWEEsICAgICAgICAgICAvLyBEWEEKKyAgQ09OVEFJTkVSX0VBQzMsICAgICAgICAgIC8vIEVuaGFuY2VkIEFDLTMKKyAgQ09OVEFJTkVSX0ZMQUMsICAgICAgICAgIC8vIEZMQUMgKEZyZWUgTG9zc2xlc3MgQXVkaW8gQ29kZWMpCisgIENPTlRBSU5FUl9GTFYsICAgICAgICAgICAvLyBGTFYgKEZsYXNoIFZpZGVvKQorICBDT05UQUlORVJfR1NNLCAgICAgICAgICAgLy8gR1NNIChHbG9iYWwgU3lzdGVtIGZvciBNb2JpbGUgQXVkaW8pCisgIENPTlRBSU5FUl9IMjYxLCAgICAgICAgICAvLyBILjI2MQorICBDT05UQUlORVJfSDI2MywgICAgICAgICAgLy8gSC4yNjMKKyAgQ09OVEFJTkVSX0gyNjQsICAgICAgICAgIC8vIEguMjY0CisgIENPTlRBSU5FUl9ITFMsICAgICAgICAgICAvLyBITFMgKEFwcGxlIEhUVFAgTGl2ZSBTdHJlYW1pbmcgUGxheUxpc3QpCisgIENPTlRBSU5FUl9JUkNBTSwgICAgICAgICAvLyBCZXJrZWxleS9JUkNBTS9DQVJMIFNvdW5kIEZvcm1hdAorICBDT05UQUlORVJfTUpQRUcsICAgICAgICAgLy8gTUpQRUcgdmlkZW8KKyAgQ09OVEFJTkVSX01PViwgICAgICAgICAgIC8vIFF1aWNrVGltZSAvIE1PViAvIE1QRUc0CisgIENPTlRBSU5FUl9NUDMsICAgICAgICAgICAvLyBNUDMgKE1QRUcgYXVkaW8gbGF5ZXIgMi8zKQorICBDT05UQUlORVJfTVBFRzJQUywgICAgICAgLy8gTVBFRy0yIFByb2dyYW0gU3RyZWFtCisgIENPTlRBSU5FUl9NUEVHMlRTLCAgICAgICAvLyBNUEVHLTIgVHJhbnNwb3J0IFN0cmVhbQorICBDT05UQUlORVJfTVBFRzRCUywgICAgICAgLy8gTVBFRy00IEJpdHN0cmVhbQorICBDT05UQUlORVJfT0dHLCAgICAgICAgICAgLy8gT2dnCisgIENPTlRBSU5FUl9STSwgICAgICAgICAgICAvLyBSTSAoUmVhbE1lZGlhKQorICBDT05UQUlORVJfU1JULCAgICAgICAgICAgLy8gU1JUIChTdWJSaXAgc3VidGl0bGUpCisgIENPTlRBSU5FUl9TV0YsICAgICAgICAgICAvLyBTV0YgKFNob2NrV2F2ZSBGbGFzaCkKKyAgQ09OVEFJTkVSX1ZDMSwgICAgICAgICAgIC8vIFZDLTEKKyAgQ09OVEFJTkVSX1dBViwgICAgICAgICAgIC8vIFdBViAvIFdBVkUgKFdhdmVmb3JtIEF1ZGlvKQorICBDT05UQUlORVJfV0VCTSwgICAgICAgICAgLy8gTWF0cm9za2EgLyBXZWJNCisgIENPTlRBSU5FUl9XVFYsICAgICAgICAgICAvLyBXVFYgKFdpbmRvd3MgVGVsZXZpc2lvbikKKyAgQ09OVEFJTkVSX0RBU0gsICAgICAgICAgIC8vIERBU0ggKE1QRUctREFTSCkKKyAgQ09OVEFJTkVSX1NNT09USFNUUkVBTSwgIC8vIFNtb290aFN0cmVhbWluZworICBDT05UQUlORVJfTUFYICAgICAgICAgICAgLy8gTXVzdCBiZSBsYXN0CiB9OwogCiAvLyBEZXRlcm1pbmUgdGhlIGNvbnRhaW5lciB0eXBlLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RhdGFfc291cmNlLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuaAppbmRleCAwYTQ4YTQzLi45MDgxMTNkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuaApAQCAtMjcsOSArMjcsNyBAQAogICAvLyBSZWFkcyB8c2l6ZXwgYnl0ZXMgZnJvbSB8cG9zaXRpb258IGludG8gfGRhdGF8LiBBbmQgd2hlbiB0aGUgcmVhZCBpcyBkb25lCiAgIC8vIG9yIGZhaWxlZCwgfHJlYWRfY2J8IGlzIGNhbGxlZCB3aXRoIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvcgogICAvLyBrUmVhZEVycm9yIGluIGNhc2Ugb2YgZXJyb3IuCi0gIHZpcnR1YWwgdm9pZCBSZWFkKGludDY0X3QgcG9zaXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkYXRhLAorICB2aXJ0dWFsIHZvaWQgUmVhZChpbnQ2NF90IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDhfdCogZGF0YSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGF0YVNvdXJjZTo6UmVhZENCJiByZWFkX2NiKSA9IDA7CiAKICAgLy8gU3RvcHMgdGhlIERhdGFTb3VyY2UuIE9uY2UgdGhpcyBpcyBjYWxsZWQgYWxsIGZ1dHVyZSBSZWFkKCkgY2FsbHMgd2lsbApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmNjCmluZGV4IDk0ZTI1MTcuLjA5NDg1NzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuY2MKQEAgLTE2LDEzICsxNiwxOSBAQAogfQogCiBEZWNvZGVyQnVmZmVyOjpEZWNvZGVyQnVmZmVyKHNpemVfdCBzaXplKQotICAgIDogc2l6ZV8oc2l6ZSksIHNpZGVfZGF0YV9zaXplXygwKSwgaXNfa2V5X2ZyYW1lXyhmYWxzZSkgeworICAgIDogYWxsb2NhdGVkX3NpemVfKHNpemUpLAorICAgICAgc2l6ZV8oc2l6ZSksCisgICAgICBzaWRlX2RhdGFfc2l6ZV8oMCksCisgICAgICBpc19rZXlfZnJhbWVfKGZhbHNlKSB7CiAgIEluaXRpYWxpemUoKTsKIH0KIAogRGVjb2RlckJ1ZmZlcjo6RGVjb2RlckJ1ZmZlcihjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3Qgc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2lkZV9kYXRhLCBzaXplX3Qgc2lkZV9kYXRhX3NpemUpCi0gICAgOiBzaXplXyhzaXplKSwgc2lkZV9kYXRhX3NpemVfKHNpZGVfZGF0YV9zaXplKSwgaXNfa2V5X2ZyYW1lXyhmYWxzZSkgeworICAgIDogYWxsb2NhdGVkX3NpemVfKHNpemUpLAorICAgICAgc2l6ZV8oc2l6ZSksCisgICAgICBzaWRlX2RhdGFfc2l6ZV8oc2lkZV9kYXRhX3NpemUpLAorICAgICAgaXNfa2V5X2ZyYW1lXyhmYWxzZSkgewogICBpZiAoIWRhdGEpIHsKICAgICBDSEVDS19FUShzaXplXywgMHUpOwogICAgIENIRUNLKCFzaWRlX2RhdGEpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaAppbmRleCBjNzQxODM5Li5hOWM5NjAzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaApAQCAtNTksOCArNTksNyBAQAogICAvLyBpcyBjb3BpZWQgZnJvbSB8c2lkZV9kYXRhfC4gQnVmZmVycyB3aWxsIGJlIHBhZGRlZCBhbmQgYWxpZ25lZCBhcyBuZWNlc3NhcnkKICAgLy8gRGF0YSBwb2ludGVycyBtdXN0IG5vdCBiZSBOVUxMIGFuZCBzaXplcyBtdXN0IGJlID49IDAuIFRoZSBidWZmZXIncwogICAvLyB8aXNfa2V5X2ZyYW1lX3wgd2lsbCBkZWZhdWx0IHRvIGZhbHNlLgotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBDb3B5RnJvbShjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwKKyAgc3RhdGljIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gQ29weUZyb20oY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNpZGVfZGF0YSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpZGVfZGF0YV9zaXplKTsKIApAQCAtMTAyLDExICsxMDEsMTcgQEAKICAgICByZXR1cm4gZGF0YV8uZ2V0KCk7CiAgIH0KIAorICBzaXplX3QgYWxsb2NhdGVkX3NpemUoKSBjb25zdCB7IHJldHVybiBhbGxvY2F0ZWRfc2l6ZV87IH0KICAgc2l6ZV90IGRhdGFfc2l6ZSgpIGNvbnN0IHsKICAgICBEQ0hFQ0soIWVuZF9vZl9zdHJlYW0oKSk7CiAgICAgcmV0dXJuIHNpemVfOwogICB9CiAKKyAgdm9pZCBzaHJpbmtfdG8oc2l6ZV90IHNpemUpIHsKKyAgICBEQ0hFQ0tfTEUoc2l6ZSwgYWxsb2NhdGVkX3NpemVfKTsKKyAgICBzaXplXyA9IHNpemU7CisgIH0KKwogICBjb25zdCB1aW50OF90KiBzaWRlX2RhdGEoKSBjb25zdCB7CiAgICAgRENIRUNLKCFlbmRfb2Zfc3RyZWFtKCkpOwogICAgIHJldHVybiBzaWRlX2RhdGFfLmdldCgpOwpAQCAtMTQ0LDkgKzE0OSw3IEBACiAgIH0KIAogICAvLyBJZiB0aGVyZSdzIG5vIGRhdGEgaW4gdGhpcyBidWZmZXIsIGl0IHJlcHJlc2VudHMgZW5kIG9mIHN0cmVhbS4KLSAgYm9vbCBlbmRfb2Zfc3RyZWFtKCkgY29uc3QgewotICAgIHJldHVybiBkYXRhXyA9PSBOVUxMOwotICB9CisgIGJvb2wgZW5kX29mX3N0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfID09IE5VTEw7IH0KIAogICAvLyBJbmRpY2F0ZXMgdGhpcyBidWZmZXIgaXMgcGFydCBvZiBhIHNwbGljZSBhcm91bmQgfHNwbGljZV90aW1lc3RhbXBffC4KICAgLy8gUmV0dXJucyBrTm9UaW1lc3RhbXAgaWYgdGhlIGJ1ZmZlciBpcyBub3QgcGFydCBvZiBhIHNwbGljZS4KQEAgLTE4NSw5ICsxODgsNyBAQAogICAvLyB3aWxsIGJlIHBhZGRlZCBhbmQgYWxpZ25lZCBhcyBuZWNlc3NhcnkuICBJZiB8ZGF0YXwgaXMgTlVMTCB0aGVuIHxkYXRhX3wgaXMKICAgLy8gc2V0IHRvIE5VTEwgYW5kIHxidWZmZXJfc2l6ZV98IHRvIDAuICB8aXNfa2V5X2ZyYW1lX3wgd2lsbCBkZWZhdWx0IHRvCiAgIC8vIGZhbHNlLgotICBEZWNvZGVyQnVmZmVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogc2lkZV9kYXRhLAorICBEZWNvZGVyQnVmZmVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIHNpemVfdCBzaXplLCBjb25zdCB1aW50OF90KiBzaWRlX2RhdGEsCiAgICAgICAgICAgICAgICAgc2l6ZV90IHNpZGVfZGF0YV9zaXplKTsKICAgdmlydHVhbCB+RGVjb2RlckJ1ZmZlcigpOwogCkBAIC0xOTUsNiArMTk2LDcgQEAKICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcF87CiAgIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbl87CiAKKyAgY29uc3Qgc2l6ZV90IGFsbG9jYXRlZF9zaXplXzsKICAgc2l6ZV90IHNpemVfOwogICBzY29wZWRfcHRyX21hbGxvYzx1aW50OF90LCBiYXNlOjpTY29wZWRQdHJBbGlnbmVkRnJlZT4gZGF0YV87CiAgIHNpemVfdCBzaWRlX2RhdGFfc2l6ZV87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfY2FjaGUuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfY2FjaGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EzYTQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlcl9jYWNoZS5jYwpAQCAtMCwwICsxLDEyNSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX2NhY2hlLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKK0RlY29kZXJCdWZmZXJDYWNoZTo6RGVjb2RlckJ1ZmZlckNhY2hlKCkKKyAgICA6IGF1ZGlvX2J1ZmZlcl9pbmRleF8oMCksIHZpZGVvX2J1ZmZlcl9pbmRleF8oMCkge30KKwordm9pZCBEZWNvZGVyQnVmZmVyQ2FjaGU6OkFkZEJ1ZmZlcihEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcikgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgaWYgKHR5cGUgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8pIHsKKyAgICBhdWRpb19idWZmZXJzXy5wdXNoX2JhY2soYnVmZmVyKTsKKyAgICBpZiAoIWJ1ZmZlci0+ZW5kX29mX3N0cmVhbSgpICYmIGJ1ZmZlci0+aXNfa2V5X2ZyYW1lKCkpIHsKKyAgICAgIGF1ZGlvX2tleV9mcmFtZV90aW1lc3RhbXBzXy5wdXNoX2JhY2soYnVmZmVyLT50aW1lc3RhbXAoKSk7CisgICAgfQorICB9IGVsc2UgeworICAgIERDSEVDS19FUSh0eXBlLCBEZW11eGVyU3RyZWFtOjpWSURFTyk7CisgICAgdmlkZW9fYnVmZmVyc18ucHVzaF9iYWNrKGJ1ZmZlcik7CisgICAgaWYgKCFidWZmZXItPmVuZF9vZl9zdHJlYW0oKSAmJiBidWZmZXItPmlzX2tleV9mcmFtZSgpKSB7CisgICAgICB2aWRlb19rZXlfZnJhbWVfdGltZXN0YW1wc18ucHVzaF9iYWNrKGJ1ZmZlci0+dGltZXN0YW1wKCkpOworICAgIH0KKyAgfQorfQorCit2b2lkIERlY29kZXJCdWZmZXJDYWNoZTo6Q2xlYXJTZWdtZW50c0JlZm9yZU1lZGlhVGltZSgKKyAgICBiYXNlOjpUaW1lRGVsdGEgbWVkaWFfdGltZSkgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgQ2xlYXJTZWdtZW50c0JlZm9yZU1lZGlhVGltZShtZWRpYV90aW1lLCAmYXVkaW9fYnVmZmVyc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmF1ZGlvX2tleV9mcmFtZV90aW1lc3RhbXBzXyk7CisgIENsZWFyU2VnbWVudHNCZWZvcmVNZWRpYVRpbWUobWVkaWFfdGltZSwgJnZpZGVvX2J1ZmZlcnNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2aWRlb19rZXlfZnJhbWVfdGltZXN0YW1wc18pOworfQorCit2b2lkIERlY29kZXJCdWZmZXJDYWNoZTo6Q2xlYXJBbGwoKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKworICBhdWRpb19idWZmZXJzXy5jbGVhcigpOworICBhdWRpb19rZXlfZnJhbWVfdGltZXN0YW1wc18uY2xlYXIoKTsKKyAgdmlkZW9fYnVmZmVyc18uY2xlYXIoKTsKKyAgdmlkZW9fa2V5X2ZyYW1lX3RpbWVzdGFtcHNfLmNsZWFyKCk7Cit9CisKK3ZvaWQgRGVjb2RlckJ1ZmZlckNhY2hlOjpTdGFydFJlc3VtaW5nKCkgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgYXVkaW9fYnVmZmVyX2luZGV4XyA9IDA7CisgIHZpZGVvX2J1ZmZlcl9pbmRleF8gPSAwOworfQorCitzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IERlY29kZXJCdWZmZXJDYWNoZTo6R2V0QnVmZmVyKAorICAgIERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgY29uc3QgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgaWYgKHR5cGUgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8pIHsKKyAgICBpZiAoYXVkaW9fYnVmZmVyX2luZGV4XyA8IGF1ZGlvX2J1ZmZlcnNfLnNpemUoKSkgeworICAgICAgcmV0dXJuIGF1ZGlvX2J1ZmZlcnNfW2F1ZGlvX2J1ZmZlcl9pbmRleF9dOworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIERDSEVDS19FUSh0eXBlLCBEZW11eGVyU3RyZWFtOjpWSURFTyk7CisgIGlmICh2aWRlb19idWZmZXJfaW5kZXhfIDwgdmlkZW9fYnVmZmVyc18uc2l6ZSgpKSB7CisgICAgcmV0dXJuIHZpZGVvX2J1ZmZlcnNfW3ZpZGVvX2J1ZmZlcl9pbmRleF9dOworICB9CisgIHJldHVybiBOVUxMOworfQorCit2b2lkIERlY29kZXJCdWZmZXJDYWNoZTo6QWR2YW5jZVRvTmV4dEJ1ZmZlcihEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUpIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworCisgIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7CisgICAgKythdWRpb19idWZmZXJfaW5kZXhfOworICB9IGVsc2UgeworICAgIERDSEVDS19FUSh0eXBlLCBEZW11eGVyU3RyZWFtOjpWSURFTyk7CisgICAgKyt2aWRlb19idWZmZXJfaW5kZXhfOworICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBEZWNvZGVyQnVmZmVyQ2FjaGU6OkNsZWFyU2VnbWVudHNCZWZvcmVNZWRpYVRpbWUoCisgICAgYmFzZTo6VGltZURlbHRhIG1lZGlhX3RpbWUsIEJ1ZmZlcnMqIGJ1ZmZlcnMsCisgICAgS2V5RnJhbWVUaW1lc3RhbXBzKiBrZXlfZnJhbWVfdGltZXN0YW1wcykgeworICAvLyBVc2UgSyB0byBkZW5vdGUgYSBrZXkgZnJhbWUgYW5kIE4gZm9yIG5vbi1rZXkgZnJhbWUuICBJZiB0aGUgY2FjaGUgY29udGFpbnMKKyAgLy8gSyBOIE4gTiBOIE4gTiBOIE4gSyBOIE4gTiBOIE4gTiBOIE4gSyBOIE4gTiBOIE4gTiBOIE4KKyAgLy8gICAgICAgICAgICAgICAgICAgICB8CisgIC8vICAgICAgICAgICAgICAgICBtZWRpYV90aW1lCisgIC8vIFRoZW4gd2Ugc2hvdWxkIHJlbW92ZSBldmVyeXRoaW5nIGJlZm9yZSB0aGUga2V5IGZyYW1lIGJlZm9yZSB0aGUKKyAgLy8gfG1lZGlhX3RpbWV8IGFuZCB0dXJuIHRoZSBjYWNoZSBpbnRvOgorICAvLyAgICAgICAgICAgICAgICAgICBLIE4gTiBOIE4gTiBOIE4gTiBLIE4gTiBOIE4gTiBOIE4gTgorICAvLyAgICAgICAgICAgICAgICAgICAgIHwKKyAgLy8gICAgICAgICAgICAgICAgIG1lZGlhX3RpbWUKKyAgLy8gU28gd2UgbmVlZCBhdCBsZWFzdCB0d28ga2V5ZnJhbWVzIGJlZm9yZSB3ZSBjYW4gcmVtb3ZlIGFueSBmcmFtZXMuCisgIHdoaWxlIChrZXlfZnJhbWVfdGltZXN0YW1wcy0+c2l6ZSgpID4gMSAmJgorICAgICAgICAga2V5X2ZyYW1lX3RpbWVzdGFtcHMtPmF0KDEpIDw9IG1lZGlhX3RpbWUpIHsKKyAgICBrZXlfZnJhbWVfdGltZXN0YW1wcy0+ZXJhc2Uoa2V5X2ZyYW1lX3RpbWVzdGFtcHMtPmJlZ2luKCkpOworICB9CisgIGlmIChrZXlfZnJhbWVfdGltZXN0YW1wcy0+ZW1wdHkoKSkgeworICAgIHJldHVybjsKKyAgfQorICB3aGlsZSAoc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJzLT5mcm9udCgpKSB7CisgICAgaWYgKGJ1ZmZlci0+aXNfa2V5X2ZyYW1lKCkgJiYKKyAgICAgICAgYnVmZmVyLT50aW1lc3RhbXAoKSA9PSBrZXlfZnJhbWVfdGltZXN0YW1wcy0+ZnJvbnQoKSkgeworICAgICAgYnJlYWs7CisgICAgfQorICAgIGJ1ZmZlcnMtPnBvcF9mcm9udCgpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX2NhY2hlLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfY2FjaGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmMxMWE2Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyX2NhY2hlLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfQkFTRV9ERUNPREVSX0JVRkZFUl9DQUNIRV9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9ERUNPREVSX0JVRkZFUl9DQUNIRV9IXworCisjaW5jbHVkZSA8ZGVxdWU+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZF9jaGVja2VyLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCisvLyBUaGlzIGNsYXNzIGNhbiBiZSB1c2VkIHRvIGhvbGQgbWVkaWEgYnVmZmVycyBpbiBkZWNvZGluZyBvcmRlci4gIEl0IGFsc28KKy8vIHByb3ZpZGVzIGZ1bmN0aW9uIHRoYXQgZ2l2ZW4gYSBtZWRpYSB0aW1lLCB0aGUgZnVuY3Rpb24gd2lsbCBmaW5kIGEga2V5IGZyYW1lCisvLyBiZWZvcmUgdGhlIG1lZGlhIHRpbWUgYW5kIGNsZWFyIGFsbCBidWZmZXJzIGJlZm9yZSB0aGUga2V5IGZyYW1lLiAgVGhpcyBjbGFzcworLy8gY2FuIGJlIHVzZWQgdG8gInJlcGxheSIgdGhlIHZpZGVvIGZyb20gdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gYW5kIGNhbgorLy8gYmUgdXNlZnVsIHRvIGltcGxlbWVudCBzdXNwZW5kL3Jlc3VtZS4KK2NsYXNzIERlY29kZXJCdWZmZXJDYWNoZSB7CisgcHVibGljOgorICBEZWNvZGVyQnVmZmVyQ2FjaGUoKTsKKworICB2b2lkIEFkZEJ1ZmZlcihEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7CisgIHZvaWQgQ2xlYXJTZWdtZW50c0JlZm9yZU1lZGlhVGltZShiYXNlOjpUaW1lRGVsdGEgbWVkaWFfdGltZSk7CisgIHZvaWQgQ2xlYXJBbGwoKTsKKworICAvLyBTdGFydCByZXN1bWluZywgcmVzZXQgaW5kaWNlcyB0byBhdWRpby92aWRlbyBidWZmZXJzIHRvIHRoZSB2ZXJ5IGJlZ2lubmluZy4KKyAgdm9pZCBTdGFydFJlc3VtaW5nKCk7CisgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gR2V0QnVmZmVyKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgY29uc3Q7CisgIHZvaWQgQWR2YW5jZVRvTmV4dEJ1ZmZlcihEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUpOworCisgcHJpdmF0ZToKKyAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gPiBCdWZmZXJzOworICB0eXBlZGVmIHN0ZDo6ZGVxdWU8YmFzZTo6VGltZURlbHRhPiBLZXlGcmFtZVRpbWVzdGFtcHM7CisKKyAgc3RhdGljIHZvaWQgQ2xlYXJTZWdtZW50c0JlZm9yZU1lZGlhVGltZSgKKyAgICAgIGJhc2U6OlRpbWVEZWx0YSBtZWRpYV90aW1lLCBCdWZmZXJzKiBidWZmZXJzLAorICAgICAgS2V5RnJhbWVUaW1lc3RhbXBzKiBrZXlfZnJhbWVfdGltZXN0YW1wcyk7CisKKyAgYmFzZTo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CisKKyAgQnVmZmVycyBhdWRpb19idWZmZXJzXzsKKyAgS2V5RnJhbWVUaW1lc3RhbXBzIGF1ZGlvX2tleV9mcmFtZV90aW1lc3RhbXBzXzsKKworICBCdWZmZXJzIHZpZGVvX2J1ZmZlcnNfOworICBLZXlGcmFtZVRpbWVzdGFtcHMgdmlkZW9fa2V5X2ZyYW1lX3RpbWVzdGFtcHNfOworCisgIHNpemVfdCBhdWRpb19idWZmZXJfaW5kZXhfOworICBzaXplX3QgdmlkZW9fYnVmZmVyX2luZGV4XzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX0RFQ09ERVJfQlVGRkVSX0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5oCmluZGV4IDZkNzg2OGQuLjk4OTRiYzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZWNyeXB0X2NvbmZpZy5oCkBAIC0zMCw4ICszMCw3IEBACiAgIC8vIHxzdWJzYW1wbGVzfCBkZWZpbmVzIHRoZSBjbGVhciBhbmQgZW5jcnlwdGVkIHBvcnRpb25zIG9mIHRoZSBzYW1wbGUgYXMKICAgLy8gICBkZXNjcmliZWQgYWJvdmUuIEEgZGVjcnlwdGVkIGJ1ZmZlciB3aWxsIGJlIGVxdWFsIGluIHNpemUgdG8gdGhlIHN1bQogICAvLyAgIG9mIHRoZSBzdWJzYW1wbGUgc2l6ZXMuCi0gIERlY3J5cHRDb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9pZCwKLSAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaXYsCisgIERlY3J5cHRDb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9pZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGl2LAogICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5PiYgc3Vic2FtcGxlcyk7CiAgIH5EZWNyeXB0Q29uZmlnKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZWNyeXB0b3IuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZWNyeXB0b3IuaAppbmRleCBjYTRhMDg3Li42OTk1OTk2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVjcnlwdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlY3J5cHRvci5oCkBAIC0zMiwxNiArMzIsMTMgQEAKICAgLy8gVE9ETyh4aHdhbmcpOiBSZXBsYWNlIGtOZWVkTW9yZURhdGEgd2l0aCBrTm90RW5vdWdoRGF0YS4KICAgZW51bSBTdGF0dXMgewogICAgIGtTdWNjZXNzLCAgLy8gRGVjcnlwdGlvbiBzdWNjZXNzZnVsbHkgY29tcGxldGVkLiBEZWNyeXB0ZWQgYnVmZmVyIHJlYWR5LgotICAgIGtOb0tleSwgIC8vIE5vIGtleSBpcyBhdmFpbGFibGUgdG8gZGVjcnlwdC4KKyAgICBrTm9LZXksICAgIC8vIE5vIGtleSBpcyBhdmFpbGFibGUgdG8gZGVjcnlwdC4KICAgICBrTmVlZE1vcmVEYXRhLCAgLy8gRGVjb2RlciBuZWVkcyBtb3JlIGRhdGEgdG8gcHJvZHVjZSBhIGZyYW1lLgotICAgIGtFcnJvciAgLy8gS2V5IGlzIGF2YWlsYWJsZSBidXQgYW4gZXJyb3Igb2NjdXJyZWQgZHVyaW5nIGRlY3J5cHRpb24uCisgICAga0Vycm9yICAgICAgICAgIC8vIEtleSBpcyBhdmFpbGFibGUgYnV0IGFuIGVycm9yIG9jY3VycmVkIGR1cmluZyBkZWNyeXB0aW9uLgogICB9OwogCiAgIC8vIFRPRE8oeGh3YW5nKTogVW5pZnkgdGhpcyB3aXRoIERlbXV4ZXJTdHJlYW06OlR5cGUuCi0gIGVudW0gU3RyZWFtVHlwZSB7Ci0gICAga0F1ZGlvLAotICAgIGtWaWRlbwotICB9OworICBlbnVtIFN0cmVhbVR5cGUgeyBrQXVkaW8sIGtWaWRlbyB9OwogCiAgIERlY3J5cHRvcigpOwogICB2aXJ0dWFsIH5EZWNyeXB0b3IoKTsKQEAgLTcyLDggKzY5LDggQEAKICAgLy8gLSBPbmx5IHxkYXRhfCwgfGRhdGFfc2l6ZXwgYW5kIHx0aW1lc3RhbXB8IGFyZSBzZXQgaW4gdGhlIHJldHVybmVkCiAgIC8vICAgRGVjb2RlckJ1ZmZlci4gVGhlIGNhbGxiYWNrIGhhbmRsZXIgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcgb3RoZXIKICAgLy8gICBmaWVsZHMgYXMgYXBwcm9wcmlhdGUuCi0gIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+Jik+IERlY3J5cHRDQjsKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFN0YXR1cywgY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYpPgorICAgICAgRGVjcnlwdENCOwogCiAgIC8vIERlY3J5cHRzIHRoZSB8ZW5jcnlwdGVkfCBidWZmZXIuIFRoZSBkZWNyeXB0IHN0YXR1cyBhbmQgZGVjcnlwdGVkIGJ1ZmZlcgogICAvLyBhcmUgcmV0dXJuZWQgdmlhIHRoZSBwcm92aWRlZCBjYWxsYmFjayB8ZGVjcnlwdF9jYnwuIFRoZSB8ZW5jcnlwdGVkfCBidWZmZXIKQEAgLTEyNCw4ICsxMjEsOCBAQAogICAvLyAgIHJldHVybmVkIGZyYW1lKHMpIG11c3QgYmUgTlVMTC9lbXB0eS4KICAgLy8gU2Vjb25kIHBhcmFtZXRlcjogVGhlIGRlY29kZWQgdmlkZW8gZnJhbWUgb3IgYXVkaW8gYnVmZmVycy4KICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFN0YXR1cywgY29uc3QgQXVkaW9GcmFtZXMmKT4gQXVkaW9EZWNvZGVDQjsKLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mKT4gVmlkZW9EZWNvZGVDQjsKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFN0YXR1cywgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYpPgorICAgICAgVmlkZW9EZWNvZGVDQjsKIAogICAvLyBEZWNyeXB0cyBhbmQgZGVjb2RlcyB0aGUgfGVuY3J5cHRlZHwgYnVmZmVyLiBUaGUgc3RhdHVzIGFuZCB0aGUgZGVjcnlwdGVkCiAgIC8vIGJ1ZmZlciBhcmUgcmV0dXJuZWQgdmlhIHRoZSBwcm92aWRlZCBjYWxsYmFjay4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZGVtdXhlci5oCmluZGV4IDVmNzI1ZmUuLmFmYjUyMDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXIuaApAQCAtODQsOCArODQsNyBAQAogICAvLyBUaGUgZGVtdXhlciBkb2VzIG5vdCBvd24gfGhvc3R8IGFzIGl0IGlzIGd1YXJhbnRlZWQgdG8gb3V0bGl2ZSB0aGUKICAgLy8gbGlmZXRpbWUgb2YgdGhlIGRlbXV4ZXIuIERvbid0IGRlbGV0ZSBpdCEgIHxzdGF0dXNfY2J8IG11c3Qgb25seSBiZSBydW4KICAgLy8gYWZ0ZXIgdGhpcyBtZXRob2QgaGFzIHJldHVybmVkLgotICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAorICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV90ZXh0X3RyYWNrcykgPSAwOwogCiAgIC8vIEFib3J0cyBhbnkgcGVuZGluZyByZWFkIG9wZXJhdGlvbnMgdGhhdCB0aGUgZGVtdXhlciBpcyBpbnZvbHZlZCB3aXRoOyBhbnkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgKaW5kZXggYTI4OTI2ZC4uYjdlZGI3OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgKQEAgLTYxLDggKzYxLDggQEAKICAgLy8gVGhlIGZpcnN0IHBhcmFtZXRlciBpbmRpY2F0ZXMgdGhlIHN0YXR1cyBvZiB0aGUgcmVhZC4KICAgLy8gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgbm9uLU5VTEwgYW5kIGNvbnRhaW5zIG1lZGlhIGRhdGEKICAgLy8gb3IgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGlmIHRoZSBmaXJzdCBwYXJhbWV0ZXIgaXMga09rLiBOVUxMIG90aGVyd2lzZS4KLSAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKFN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mKT5SZWFkQ0I7CisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChTdGF0dXMsIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mKT4KKyAgICAgIFJlYWRDQjsKICAgdmlydHVhbCB2b2lkIFJlYWQoY29uc3QgUmVhZENCJiByZWFkX2NiKSA9IDA7CiAKICAgLy8gUmV0dXJucyB0aGUgYXVkaW8vdmlkZW8gZGVjb2RlciBjb25maWd1cmF0aW9uLiBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2VuZGlhbl91dGlsLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZW5kaWFuX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWQ2YzAyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2VuZGlhbl91dGlsLmgKQEAgLTAsMCArMSwxMzkgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgTUVESUFfQkFTRV9FTkRJQU5fVVRJTF9IXworI2RlZmluZSBNRURJQV9CQVNFX0VORElBTl9VVElMX0hfCisKKyNpbmNsdWRlICJiYXNlL3N5c19ieXRlb3JkZXIuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKK25hbWVzcGFjZSBlbmRpYW5fdXRpbCB7CisKKy8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIG11c3QgYmUgYWJsZSB0byBzdXBwb3J0IHN0b3JpbmcgdG8vbG9hZGluZyBmcm9tCisvLyBub24tYWxpZ25lZCBtZW1vcnkuICBUaHVzLCBjYXN0cyBsaWtlICIqcmVpbnRlcnByZXRfY2FzdDx1aW50MTZfdCo+KHApIgorLy8gc2hvdWxkIGJlIGF2b2lkZWQgYXMgdGhlc2UgY2FuIGNhdXNlIGNyYXNoZXMgZHVlIHRvIGFsaWdubWVudCBvbiBzb21lCisvLyBwbGF0Zm9ybXMuCisKKy8vIExvYWQgMiBsaXR0bGUtZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gdWludDE2X3QuCitpbmxpbmUgdWludDE2X3QgbG9hZF91aW50MTZfbGl0dGxlX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7CisgIHVpbnQxNl90IGFsaWduZWRfcDsKKyAgbWVtY3B5KCZhbGlnbmVkX3AsIHAsIHNpemVvZihhbGlnbmVkX3ApKTsKKyAgcmV0dXJuIGJhc2U6OkJ5dGVTd2FwVG9MRTE2KGFsaWduZWRfcCk7Cit9CisKKy8vIExvYWQgNCBsaXR0bGUtZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gdWludDMyX3QuCitpbmxpbmUgdWludDMyX3QgbG9hZF91aW50MzJfbGl0dGxlX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7CisgIHVpbnQzMl90IGFsaWduZWRfcDsKKyAgbWVtY3B5KCZhbGlnbmVkX3AsIHAsIHNpemVvZihhbGlnbmVkX3ApKTsKKyAgcmV0dXJuIGJhc2U6OkJ5dGVTd2FwVG9MRTMyKGFsaWduZWRfcCk7Cit9CisKKy8vIExvYWQgOCBsaXR0bGUtZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gdWludDY0X3QuCitpbmxpbmUgdWludDY0X3QgbG9hZF91aW50NjRfbGl0dGxlX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7CisgIHVpbnQ2NF90IGFsaWduZWRfcDsKKyAgbWVtY3B5KCZhbGlnbmVkX3AsIHAsIHNpemVvZihhbGlnbmVkX3ApKTsKKyAgcmV0dXJuIGJhc2U6OkJ5dGVTd2FwVG9MRTY0KGFsaWduZWRfcCk7Cit9CisKKy8vIExvYWQgMiBiaWctZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gdWludDE2X3QuCitpbmxpbmUgdWludDE2X3QgbG9hZF91aW50MTZfYmlnX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7CisgIHVpbnQxNl90IGFsaWduZWRfcDsKKyAgbWVtY3B5KCZhbGlnbmVkX3AsIHAsIHNpemVvZihhbGlnbmVkX3ApKTsKKyAgcmV0dXJuIGJhc2U6Ok5ldFRvSG9zdDE2KGFsaWduZWRfcCk7Cit9CisKKy8vIExvYWQgNCBiaWctZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gdWludDMyX3QuCitpbmxpbmUgdWludDMyX3QgbG9hZF91aW50MzJfYmlnX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7CisgIHVpbnQzMl90IGFsaWduZWRfcDsKKyAgbWVtY3B5KCZhbGlnbmVkX3AsIHAsIHNpemVvZihhbGlnbmVkX3ApKTsKKyAgcmV0dXJuIGJhc2U6Ok5ldFRvSG9zdDMyKGFsaWduZWRfcCk7Cit9CisKKy8vIExvYWQgOCBiaWctZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gdWludDY0X3QuCitpbmxpbmUgdWludDY0X3QgbG9hZF91aW50NjRfYmlnX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7CisgIHVpbnQ2NF90IGFsaWduZWRfcDsKKyAgbWVtY3B5KCZhbGlnbmVkX3AsIHAsIHNpemVvZihhbGlnbmVkX3ApKTsKKyAgcmV0dXJuIGJhc2U6Ok5ldFRvSG9zdDY0KGFsaWduZWRfcCk7Cit9CisKKy8vIExvYWQgMiBiaWctZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGFuIGhvc3QtZW5kaWFuIGludDE2X3QuCitpbmxpbmUgaW50MTZfdCBsb2FkX2ludDE2X2JpZ19lbmRpYW4oY29uc3QgdWludDhfdCogcCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MTZfdD4obG9hZF91aW50MTZfYmlnX2VuZGlhbihwKSk7Cit9CisKKy8vIExvYWQgNCBiaWctZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGFuIGhvc3QtZW5kaWFuIGludDMyX3QuCitpbmxpbmUgaW50MzJfdCBsb2FkX2ludDMyX2JpZ19lbmRpYW4oY29uc3QgdWludDhfdCogcCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzJfdD4obG9hZF91aW50MzJfYmlnX2VuZGlhbihwKSk7Cit9CisKKy8vIExvYWQgOCBiaWctZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGFuIGhvc3QtZW5kaWFuIGludDY0X3QuCitpbmxpbmUgaW50NjRfdCBsb2FkX2ludDY0X2JpZ19lbmRpYW4oY29uc3QgdWludDhfdCogcCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4obG9hZF91aW50NjRfYmlnX2VuZGlhbihwKSk7Cit9CisKKy8vIExvYWQgMiBsaXR0bGUtZW5kaWFuIGJ5dGVzIGF0IHxwfCBhbmQgcmV0dXJuIGFzIGEgaG9zdC1lbmRpYW4gaW50MTZfdC4KK2lubGluZSBpbnQxNl90IGxvYWRfaW50MTZfbGl0dGxlX2VuZGlhbihjb25zdCB1aW50OF90KiBwKSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQxNl90Pihsb2FkX3VpbnQxNl9saXR0bGVfZW5kaWFuKHApKTsKK30KKworLy8gTG9hZCA0IGxpdHRsZS1lbmRpYW4gYnl0ZXMgYXQgfHB8IGFuZCByZXR1cm4gYXMgYSBob3N0LWVuZGlhbiBpbnQzMl90LgoraW5saW5lIGludDMyX3QgbG9hZF9pbnQzMl9saXR0bGVfZW5kaWFuKGNvbnN0IHVpbnQ4X3QqIHApIHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludDMyX3Q+KGxvYWRfdWludDMyX2xpdHRsZV9lbmRpYW4ocCkpOworfQorCisvLyBMb2FkIDggbGl0dGxlLWVuZGlhbiBieXRlcyBhdCB8cHwgYW5kIHJldHVybiBhcyBhIGhvc3QtZW5kaWFuIGludDY0X3QuCitpbmxpbmUgaW50NjRfdCBsb2FkX2ludDY0X2xpdHRsZV9lbmRpYW4oY29uc3QgdWludDhfdCogcCkgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjRfdD4obG9hZF91aW50NjRfbGl0dGxlX2VuZGlhbihwKSk7Cit9CisKKy8vIFN0b3JlIDIgaG9zdC1lbmRpYW4gYnl0ZXMgYXMgYmlnLWVuZGlhbiBhdCB8cHwuCitpbmxpbmUgdm9pZCBzdG9yZV91aW50MTZfYmlnX2VuZGlhbih1aW50MTZfdCBkLCB1aW50OF90KiBwKSB7CisgIHVpbnQxNl90IGJpZ19kID0gYmFzZTo6SG9zdFRvTmV0MTYoZCk7CisgIG1lbWNweShwLCAmYmlnX2QsIHNpemVvZihiaWdfZCkpOworfQorCisvLyBTdG9yZSA0IGhvc3QtZW5kaWFuIGJ5dGVzIGFzIGJpZy1lbmRpYW4gYXQgfHB8LgoraW5saW5lIHZvaWQgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4odWludDMyX3QgZCwgdWludDhfdCogcCkgeworICB1aW50MzJfdCBiaWdfZCA9IGJhc2U6Okhvc3RUb05ldDMyKGQpOworICBtZW1jcHkocCwgJmJpZ19kLCBzaXplb2YoYmlnX2QpKTsKK30KKworLy8gU3RvcmUgOCBob3N0LWVuZGlhbiBieXRlcyBhcyBiaWctZW5kaWFuIGF0IHxwfC4KK2lubGluZSB2b2lkIHN0b3JlX3VpbnQ2NF9iaWdfZW5kaWFuKHVpbnQ2NF90IGQsIHVpbnQ4X3QqIHApIHsKKyAgdWludDY0X3QgYmlnX2QgPSBiYXNlOjpIb3N0VG9OZXQ2NChkKTsKKyAgbWVtY3B5KHAsICZiaWdfZCwgc2l6ZW9mKGJpZ19kKSk7Cit9CisKKy8vIFN0b3JlIDIgaG9zdC1lbmRpYW4gYnl0ZXMgYXMgbGl0dGxlLWVuZGlhbiBhdCB8cHwuCitpbmxpbmUgdm9pZCBzdG9yZV91aW50MTZfbGl0dGxlX2VuZGlhbih1aW50MTZfdCBkLCB1aW50OF90KiBwKSB7CisgIHVpbnQxNl90IGxpdHRsZV9kID0gYmFzZTo6Qnl0ZVN3YXBUb0xFMTYoZCk7CisgIG1lbWNweShwLCAmbGl0dGxlX2QsIHNpemVvZihsaXR0bGVfZCkpOworfQorCisvLyBTdG9yZSA0IGhvc3QtZW5kaWFuIGJ5dGVzIGFzIGxpdHRsZS1lbmRpYW4gYXQgfHB8LgoraW5saW5lIHZvaWQgc3RvcmVfdWludDMyX2xpdHRsZV9lbmRpYW4odWludDMyX3QgZCwgdWludDhfdCogcCkgeworICB1aW50MzJfdCBsaXR0bGVfZCA9IGJhc2U6OkJ5dGVTd2FwVG9MRTMyKGQpOworICBtZW1jcHkocCwgJmxpdHRsZV9kLCBzaXplb2YobGl0dGxlX2QpKTsKK30KKworLy8gU3RvcmUgOCBob3N0LWVuZGlhbiBieXRlcyBhcyBsaXR0bGUtZW5kaWFuIGF0IHxwfC4KK2lubGluZSB2b2lkIHN0b3JlX3VpbnQ2NF9saXR0bGVfZW5kaWFuKHVpbnQ2NF90IGQsIHVpbnQ4X3QqIHApIHsKKyAgdWludDY0X3QgbGl0dGxlX2QgPSBiYXNlOjpCeXRlU3dhcFRvTEU2NChkKTsKKyAgbWVtY3B5KHAsICZsaXR0bGVfZCwgc2l6ZW9mKGxpdHRsZV9kKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlbmRpYW5fdXRpbAorfSAgLy8gbmFtZXNwYWNlIG1lZGlhCisKKyNlbmRpZiAgLy8gTUVESUFfQkFTRV9FTkRJQU5fVVRJTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2Zha2VfYXVkaW9fcmVuZGVyX2NhbGxiYWNrLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaAppbmRleCA1Y2RkYTliLi4wZWQ4YTFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV9hdWRpb19yZW5kZXJfY2FsbGJhY2suaApAQCAtMTcsOSArMTcsOCBAQAogLy8gRmFrZSBSZW5kZXJDYWxsYmFjayB3aGljaCB3aWxsIGZpbGwgZWFjaCByZXF1ZXN0IHdpdGggYSBzaW5lIHdhdmUuICBTaW5lCiAvLyBzdGF0ZSBpcyBrZXB0IGFjcm9zcyBjYWxsYmFja3MuICBTdGF0ZSBjYW4gYmUgcmVzZXQgdG8gZGVmYXVsdCB2aWEgcmVzZXQoKS4KIC8vIEFsc28gcHJvdmlkZSBhbiBpbnRlcmZhY2UgdG8gQXVkaW9UcmFuc2Zvcm1JbnB1dC4KLWNsYXNzIEZha2VBdWRpb1JlbmRlckNhbGxiYWNrCi0gICAgOiBwdWJsaWMgQXVkaW9SZW5kZXJlclNpbms6OlJlbmRlckNhbGxiYWNrLAotICAgICAgcHVibGljIEF1ZGlvQ29udmVydGVyOjpJbnB1dENhbGxiYWNrIHsKK2NsYXNzIEZha2VBdWRpb1JlbmRlckNhbGxiYWNrIDogcHVibGljIEF1ZGlvUmVuZGVyZXJTaW5rOjpSZW5kZXJDYWxsYmFjaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIEF1ZGlvQ29udmVydGVyOjpJbnB1dENhbGxiYWNrIHsKICBwdWJsaWM6CiAgIC8vIFRoZSBmdW5jdGlvbiB1c2VkIHRvIGZ1bGZpbGwgUmVuZGVyKCkgaXMgZih4KSA9IHNpbigyICogUEkgKiB4ICogfHN0ZXB8KSwKICAgLy8gd2hlcmUgeCA9IFt8bnVtYmVyX29mX2ZyYW1lc3wgKiBtLCB8bnVtYmVyX29mX2ZyYW1lc3wgKiAobSArIDEpXSBhbmQgbSA9CkBAIC0yOSw4ICsyOCw3IEBACiAKICAgLy8gUmVuZGVycyBhIHNpbmUgd2F2ZSBpbnRvIHRoZSBwcm92aWRlZCBhdWRpbyBkYXRhIGJ1ZmZlci4gIElmIHxoYWxmX2ZpbGxffAogICAvLyBpcyBzZXQsIHdpbGwgb25seSBmaWxsIGhhbGYgdGhlIGJ1ZmZlci4KLSAgaW50IFJlbmRlcihBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lc19kZWxheWVkLAorICBpbnQgUmVuZGVyKEF1ZGlvQnVzKiBhdWRpb19idXMsIHVpbnQzMl90IGZyYW1lc19kZWxheWVkLAogICAgICAgICAgICAgIHVpbnQzMl90IGZyYW1lc19za2lwcGVkKSBPVkVSUklERTsKICAgTU9DS19NRVRIT0QwKE9uUmVuZGVyRXJyb3IsIHZvaWQoKSk7CiAKQEAgLTUzLDggKzUxLDcgQEAKICAgaW50IGxhc3RfY2hhbm5lbF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIGxhc3RfY2hhbm5lbF9jb3VudF87IH0KIAogIHByaXZhdGU6Ci0gIGludCBSZW5kZXJJbnRlcm5hbChBdWRpb0J1cyogYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVzX2RlbGF5ZWQsCisgIGludCBSZW5kZXJJbnRlcm5hbChBdWRpb0J1cyogYXVkaW9fYnVzLCB1aW50MzJfdCBmcmFtZXNfZGVsYXllZCwKICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2b2x1bWUpOwogCiAgIGJvb2wgaGFsZl9maWxsXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9mYWtlX2RlbXV4ZXJfc3RyZWFtLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV9kZW11eGVyX3N0cmVhbS5oCmluZGV4IDBhNDU2NGMuLjliMTFlY2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9mYWtlX2RlbXV4ZXJfc3RyZWFtLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2Zha2VfZGVtdXhlcl9zdHJlYW0uaApAQCAtMjMsOCArMjMsNyBAQAogICAvLyBDb25zdHJ1Y3RzIGFuIG9iamVjdCB0aGF0IG91dHB1dHMgfG51bV9jb25maWdzfCBkaWZmZXJlbnQgY29uZmlncyBpbgogICAvLyBzZXF1ZW5jZSB3aXRoIHxudW1fZnJhbWVzX2luX29uZV9jb25maWd8IGJ1ZmZlcnMgZm9yIGVhY2ggY29uZmlnLiBUaGUKICAgLy8gb3V0cHV0IGJ1ZmZlcnMgYXJlIGVuY3J5cHRlZCBpZiB8aXNfZW5jcnlwdGVkfCBpcyB0cnVlLgotICBGYWtlRGVtdXhlclN0cmVhbShpbnQgbnVtX2NvbmZpZ3MsCi0gICAgICAgICAgICAgICAgICAgIGludCBudW1fYnVmZmVyc19pbl9vbmVfY29uZmlnLAorICBGYWtlRGVtdXhlclN0cmVhbShpbnQgbnVtX2NvbmZpZ3MsIGludCBudW1fYnVmZmVyc19pbl9vbmVfY29uZmlnLAogICAgICAgICAgICAgICAgICAgICBib29sIGlzX2VuY3J5cHRlZCk7CiAgIH5GYWtlRGVtdXhlclN0cmVhbSgpIE9WRVJSSURFOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmgKaW5kZXggOTQxYjJkOC4uNmQxMmFjNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2Zha2Vfc2luZ2xlX3RocmVhZF90YXNrX3J1bm5lci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9mYWtlX3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuaApAQCAtMjYsOCArMjYsNyBAQAogCiAgIC8vIGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXIgaW1wbGVtZW50YXRpb24uCiAgIGJvb2wgUG9zdERlbGF5ZWRUYXNrKGNvbnN0IHRyYWNrZWRfb2JqZWN0czo6TG9jYXRpb24mIGZyb21faGVyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgdGFzaywKLSAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGRlbGF5KSBmaW5hbDsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgdGFzaywgYmFzZTo6VGltZURlbHRhIGRlbGF5KSBmaW5hbDsKIAogICBib29sIFJ1bnNUYXNrc09uQ3VycmVudFRocmVhZCgpIGNvbnN0IGZpbmFsOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV90ZXh0X3RyYWNrX3N0cmVhbS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2Zha2VfdGV4dF90cmFja19zdHJlYW0uaAppbmRleCA4Mzk1ZGI0Li4yOGRkYTZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmFrZV90ZXh0X3RyYWNrX3N0cmVhbS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9mYWtlX3RleHRfdHJhY2tfc3RyZWFtLmgKQEAgLTM4LDggKzM4LDcgQEAKIAogICB2b2lkIFNhdGlzZnlQZW5kaW5nUmVhZChjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHN0YXJ0LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb250ZW50LAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2V0dGluZ3MpOwogICB2b2lkIEFib3J0UGVuZGluZ1JlYWQoKTsKICAgdm9pZCBTZW5kRW9zTm90aWZpY2F0aW9uKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmVlZGJhY2tfc2lnbmFsX2FjY3VtdWxhdG9yLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZmVlZGJhY2tfc2lnbmFsX2FjY3VtdWxhdG9yLmgKaW5kZXggOGJhMWJiMi4uMWIxOWM3MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2ZlZWRiYWNrX3NpZ25hbF9hY2N1bXVsYXRvci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9mZWVkYmFja19zaWduYWxfYWNjdW11bGF0b3IuaApAQCAtNjYsOCArNjYsNyBAQAogICAgICAgICAgICAgc3RkOjptYXgodmFsdWUsIHVwZGF0ZV92YWx1ZV8pOwogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KLSAgICAgIGlmICh2YWx1ZSA8PSB1cGRhdGVfdmFsdWVfKQotICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGlmICh2YWx1ZSA8PSB1cGRhdGVfdmFsdWVfKSByZXR1cm4gdHJ1ZTsKICAgICAgIHVwZGF0ZV92YWx1ZV8gPSB2YWx1ZTsKICAgICB9IGVsc2UgewogICAgICAgcHJpb3JfYXZlcmFnZV8gPSBhdmVyYWdlXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9nbW9ja19jYWxsYmFja19zdXBwb3J0LmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvZ21vY2tfY2FsbGJhY2tfc3VwcG9ydC5oCmluZGV4IDI2MGEwMGUuLjJhZTJlZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9nbW9ja19jYWxsYmFja19zdXBwb3J0LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2dtb2NrX2NhbGxiYWNrX3N1cHBvcnQuaApAQCAtMTEsMjYgKzExLDE5IEBACiAKIC8vIE1hdGNoZXJzIGZvciBiYXNlOjpDYWxsYmFjayBhbmQgYmFzZTo6Q2xvc3VyZS4KIAotTUFUQ0hFUihJc051bGxDYWxsYmFjaywgImEgbnVsbCBjYWxsYmFjayIpIHsKLSAgcmV0dXJuIChhcmcuaXNfbnVsbCgpKTsKLX0KK01BVENIRVIoSXNOdWxsQ2FsbGJhY2ssICJhIG51bGwgY2FsbGJhY2siKSB7IHJldHVybiAoYXJnLmlzX251bGwoKSk7IH0KIAotTUFUQ0hFUihJc05vdE51bGxDYWxsYmFjaywgImEgbm9uLW51bGwgY2FsbGJhY2siKSB7Ci0gIHJldHVybiAoIWFyZy5pc19udWxsKCkpOwotfQorTUFUQ0hFUihJc05vdE51bGxDYWxsYmFjaywgImEgbm9uLW51bGwgY2FsbGJhY2siKSB7IHJldHVybiAoIWFyZy5pc19udWxsKCkpOyB9CiAKIC8vIFRoZSBSdW5DbG9zdXJlPE4+KCkgYWN0aW9uIGludm9rZXMgUnVuKCkgbWV0aG9kIG9uIHRoZSBOLXRoICgwLWJhc2VkKQogLy8gYXJndW1lbnQgb2YgdGhlIG1vY2sgZnVuY3Rpb24uCiAKLUFDVElPTl9URU1QTEFURShSdW5DbG9zdXJlLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorQUNUSU9OX1RFTVBMQVRFKFJ1bkNsb3N1cmUsIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAogICAgICAgICAgICAgICAgIEFORF8wX1ZBTFVFX1BBUkFNUygpKSB7CiAgIDo6c3RkOjp0cjE6OmdldDxrPihhcmdzKS5SdW4oKTsKIH0KIAotQUNUSU9OX1AoUnVuQ2xvc3VyZSwgY2xvc3VyZSkgewotICBjbG9zdXJlLlJ1bigpOwotfQorQUNUSU9OX1AoUnVuQ2xvc3VyZSwgY2xvc3VyZSkgeyBjbG9zdXJlLlJ1bigpOyB9CiAKIC8vIFZhcmlvdXMgb3ZlcmxvYWRzIGZvciBSdW5DYWxsYmFjazxOPigpLgogLy8KQEAgLTU4LDUwICs1MSw0MiBAQAogLy8gICB0byB0aGUgY2FsbGJhY2suICBUaGlzIG1ha2VzIGl0IGVhc3kgZm9yIGEgdXNlciB0byBkZWZpbmUgYW4KIC8vICAgUnVuQ2FsbGJhY2sgYWN0aW9uIGZyb20gdGVtcG9yYXJ5IHZhbHVlcyBhbmQgaGF2ZSBpdCBwZXJmb3JtZWQgbGF0ZXIuCiAKLUFDVElPTl9URU1QTEFURShSdW5DYWxsYmFjaywKLSAgICAgICAgICAgICAgICBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKK0FDVElPTl9URU1QTEFURShSdW5DYWxsYmFjaywgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCiAgICAgICAgICAgICAgICAgQU5EXzBfVkFMVUVfUEFSQU1TKCkpIHsKICAgcmV0dXJuIDo6c3RkOjp0cjE6OmdldDxrPihhcmdzKS5SdW4oKTsKIH0KIAotQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLCBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKICAgICAgICAgICAgICAgICBBTkRfMV9WQUxVRV9QQVJBTVMocDApKSB7CiAgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncykuUnVuKHAwKTsKIH0KIAotQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLCBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKICAgICAgICAgICAgICAgICBBTkRfMl9WQUxVRV9QQVJBTVMocDAsIHAxKSkgewogICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEpOwogfQogCi1BQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCitBQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAogICAgICAgICAgICAgICAgIEFORF8zX1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyKSkgewogICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEsIHAyKTsKIH0KIAotQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLCBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKICAgICAgICAgICAgICAgICBBTkRfNF9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMpKSB7CiAgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncykuUnVuKHAwLCBwMSwgcDIsIHAzKTsKIH0KIAotQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLCBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKICAgICAgICAgICAgICAgICBBTkRfNV9WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0KSkgewogICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEsIHAyLCBwMywgcDQpOwogfQogCi1BQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgSEFTXzFfVEVNUExBVEVfUEFSQU1TKGludCwgayksCitBQ1RJT05fVEVNUExBVEUoUnVuQ2FsbGJhY2ssIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAogICAgICAgICAgICAgICAgIEFORF82X1ZBTFVFX1BBUkFNUyhwMCwgcDEsIHAyLCBwMywgcDQsIHA1KSkgewogICByZXR1cm4gOjpzdGQ6OnRyMTo6Z2V0PGs+KGFyZ3MpLlJ1bihwMCwgcDEsIHAyLCBwMywgcDQsIHA1KTsKIH0KIAotQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLAotICAgICAgICAgICAgICAgIEhBU18xX1RFTVBMQVRFX1BBUkFNUyhpbnQsIGspLAorQUNUSU9OX1RFTVBMQVRFKFJ1bkNhbGxiYWNrLCBIQVNfMV9URU1QTEFURV9QQVJBTVMoaW50LCBrKSwKICAgICAgICAgICAgICAgICBBTkRfN19WQUxVRV9QQVJBTVMocDAsIHAxLCBwMiwgcDMsIHA0LCBwNSwgcDYpKSB7CiAgIHJldHVybiA6OnN0ZDo6dHIxOjpnZXQ8az4oYXJncykuUnVuKHAwLCBwMSwgcDIsIHAzLCBwNCwgcDUsIHA2KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9oZHJfbWV0YWRhdGEuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9oZHJfbWV0YWRhdGEuaAppbmRleCAwOTUwZDc1Li5hZjI5ZWZiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvaGRyX21ldGFkYXRhLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL2hkcl9tZXRhZGF0YS5oCkBAIC0yNCw2ICsyNCwxOSBAQAogCiAgIE1hc3RlcmluZ01ldGFkYXRhKCk7CiAgIE1hc3RlcmluZ01ldGFkYXRhKGNvbnN0IE1hc3RlcmluZ01ldGFkYXRhJiByaHMpOworCisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBNYXN0ZXJpbmdNZXRhZGF0YSYgcmhzKSBjb25zdCB7CisgICAgcmV0dXJuICgocHJpbWFyeV9yX2Nocm9tYXRpY2l0eV94ID09IHJocy5wcmltYXJ5X3JfY2hyb21hdGljaXR5X3gpICYmCisgICAgICAgICAgICAocHJpbWFyeV9yX2Nocm9tYXRpY2l0eV95ID09IHJocy5wcmltYXJ5X3JfY2hyb21hdGljaXR5X3kpICYmCisgICAgICAgICAgICAocHJpbWFyeV9nX2Nocm9tYXRpY2l0eV94ID09IHJocy5wcmltYXJ5X2dfY2hyb21hdGljaXR5X3gpICYmCisgICAgICAgICAgICAocHJpbWFyeV9nX2Nocm9tYXRpY2l0eV95ID09IHJocy5wcmltYXJ5X2dfY2hyb21hdGljaXR5X3kpICYmCisgICAgICAgICAgICAocHJpbWFyeV9iX2Nocm9tYXRpY2l0eV94ID09IHJocy5wcmltYXJ5X2JfY2hyb21hdGljaXR5X3gpICYmCisgICAgICAgICAgICAocHJpbWFyeV9iX2Nocm9tYXRpY2l0eV95ID09IHJocy5wcmltYXJ5X2JfY2hyb21hdGljaXR5X3kpICYmCisgICAgICAgICAgICAod2hpdGVfcG9pbnRfY2hyb21hdGljaXR5X3ggPT0gcmhzLndoaXRlX3BvaW50X2Nocm9tYXRpY2l0eV94KSAmJgorICAgICAgICAgICAgKHdoaXRlX3BvaW50X2Nocm9tYXRpY2l0eV95ID09IHJocy53aGl0ZV9wb2ludF9jaHJvbWF0aWNpdHlfeSkgJiYKKyAgICAgICAgICAgIChsdW1pbmFuY2VfbWF4ID09IHJocy5sdW1pbmFuY2VfbWF4KSAmJgorICAgICAgICAgICAgKGx1bWluYW5jZV9taW4gPT0gcmhzLmx1bWluYW5jZV9taW4pKTsKKyAgfQogfTsKIAogLy8gSERSIG1ldGFkYXRhIGNvbW1vbiBmb3IgSERSMTAgYW5kIFdlYk0vVlA5LWJhc2VkIEhEUiBmb3JtYXRzLgpAQCAtMzQsNiArNDcsMTEgQEAKIAogICBIRFJNZXRhZGF0YSgpOwogICBIRFJNZXRhZGF0YShjb25zdCBIRFJNZXRhZGF0YSYgcmhzKTsKKworICBib29sIG9wZXJhdG9yPT0oY29uc3QgSERSTWV0YWRhdGEmIHJocykgY29uc3QgeworICAgIHJldHVybiAoKG1heF9jbGwgPT0gcmhzLm1heF9jbGwpICYmIChtYXhfZmFsbCA9PSByaHMubWF4X2ZhbGwpICYmCisgICAgICAgICAgICAobWFzdGVyaW5nX21ldGFkYXRhID09IHJocy5tYXN0ZXJpbmdfbWV0YWRhdGEpKTsKKyAgfQogfTsKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uva2V5X3N5c3RlbXMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9rZXlfc3lzdGVtcy5oCmluZGV4IDQ3NjkxM2IuLjlhZWRkMjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9rZXlfc3lzdGVtcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9rZXlfc3lzdGVtcy5oCkBAIC0zMSwyMSArMzEsMTggQEAKIAogICAvLyBSZXR1cm5zIHdoZXRoZXIgfGluaXRfZGF0YV90eXBlfCBpcyBzdXBwb3J0ZWQgYnkgfGtleV9zeXN0ZW18LgogICB2aXJ0dWFsIGJvb2wgSXNTdXBwb3J0ZWRJbml0RGF0YVR5cGUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgIEVtZUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSkgY29uc3QgPSAwOworICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sIEVtZUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSkgY29uc3QgPSAwOwogCiAgIC8vIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gcnVsZSBmb3Igc3VwcG9ydGluZyBhIGNvbnRhaW5lciBhbmQgbGlzdCBvZgogICAvLyBjb2RlY3MuCiAgIHZpcnR1YWwgRW1lQ29uZmlnUnVsZSBHZXRDb250ZW50VHlwZUNvbmZpZ1J1bGUoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICAgIEVtZU1lZGlhVHlwZSBtZWRpYV90eXBlLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sIEVtZU1lZGlhVHlwZSBtZWRpYV90eXBlLAogICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRhaW5lcl9taW1lX3R5cGUsCiAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcykgY29uc3QgPSAwOwogCiAgIC8vIFJldHVybnMgdGhlIGNvbmZpZ3VyYXRpb24gcnVsZSBmb3Igc3VwcG9ydGluZyBhIHJvYnVzdG5lc3MgcmVxdWlyZW1lbnQuCiAgIHZpcnR1YWwgRW1lQ29uZmlnUnVsZSBHZXRSb2J1c3RuZXNzQ29uZmlnUnVsZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgRW1lTWVkaWFUeXBlIG1lZGlhX3R5cGUsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwgRW1lTWVkaWFUeXBlIG1lZGlhX3R5cGUsCiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgcmVxdWVzdGVkX3JvYnVzdG5lc3MpIGNvbnN0ID0gMDsKIAogICAvLyBSZXR1cm5zIHRoZSBzdXBwb3J0IHxrZXlfc3lzdGVtfCBwcm92aWRlcyBmb3IgcGVyc2lzdGVudC1saWNlbnNlIHNlc3Npb25zLgpAQCAtNjYsMTUgKzYzLDE0IEBACiAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSkgY29uc3QgPSAwOwogCiAgcHJvdGVjdGVkOgotICB2aXJ0dWFsIH5LZXlTeXN0ZW1zKCkge307CisgIHZpcnR1YWwgfktleVN5c3RlbXMoKSB7fQogfTsKIAogLy8gVE9ETyhkZG9yd2luKTogV2ViQ29udGVudERlY3J5cHRpb25Nb2R1bGVTZXNzaW9uSW1wbDo6aW5pdGlhbGl6ZU5ld1Nlc3Npb24oKQogLy8gaXMgdmlvbGF0aW5nIHRoaXMgcnVsZSEgaHR0cHM6Ly9jcmJ1Zy5jb20vMjQ5OTc2LgogLy8gVXNlIGZvciBwcmVmaXhlZCBFTUUgb25seSEKIE1FRElBX0VYUE9SVCBib29sIElzU3VwcG9ydGVkS2V5U3lzdGVtV2l0aEluaXREYXRhVHlwZSgKLSAgICBjb25zdCBzdGQ6OnN0cmluZyYga2V5X3N5c3RlbSwKLSAgICBFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUpOworICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLCBFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUpOwogCiAvLyBSZXR1cm5zIGEgbmFtZSBmb3IgfGtleV9zeXN0ZW18IHN1aXRhYmxlIHRvIFVNQSBsb2dnaW5nLgogTUVESUFfRVhQT1JUIHN0ZDo6c3RyaW5nIEdldEtleVN5c3RlbU5hbWVGb3JVTUEoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0pOwpAQCAtOTMsOCArODksNyBAQAogLy8gQ2FsbCBBZGRDb2RlY01hc2soKSBmaXJzdCB0byBlbnN1cmUgdGhlIG1hc2sgdmFsdWVzIHBhc3NlZCB0bwogLy8gQWRkTWltZVR5cGVDb2RlY01hc2soKSBhbHJlYWR5IGV4aXN0LgogTUVESUFfRVhQT1JUIHZvaWQgQWRkQ29kZWNNYXNrKEVtZU1lZGlhVHlwZSBtZWRpYV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWMsIHVpbnQzMl90IG1hc2spOwogTUVESUFfRVhQT1JUIHZvaWQgQWRkTWltZVR5cGVDb2RlY01hc2soY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IG1hc2spOwogI2VuZGlmICAvLyBkZWZpbmVkKFVOSVRfVEVTVCkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9jbGllbnQuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9jbGllbnQuaAppbmRleCBlNDI0NmNlLi5iOTBiODhjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfY2xpZW50LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2NsaWVudC5oCkBAIC02OSw4ICs2OSw3IEBACiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY29tYmluYXRpb24gb2YgdmlkZW8gY29kZWMsIHByb2ZpbGUgYW5kIGxldmVsIGlzCiAgIC8vIHN1cHBvcnRlZC4gVGhlIHxsZXZlbHwgdmFsdWUgaXMgY29kZWMtc3BlY2lmaWMuCiAgIHZpcnR1YWwgYm9vbCBJc1N1cHBvcnRlZFZpZGVvQ29uZmlnKFZpZGVvQ29kZWMgY29kZWMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZXZlbCkgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlLCBpbnQgbGV2ZWwpID0gMDsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2tleXMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9rZXlzLmgKaW5kZXggOTQ2MGJjYS4uODc2YmIyMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2tleXMuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfa2V5cy5oCkBAIC0xMTYsOCArMTE2LDcgQEAKICAgLy8gMy4gVXBkYXRlU2Vzc2lvbigpLCBDbG9zZVNlc3Npb24oKSBhbmQgUmVtb3ZlU2Vzc2lvbigpIHNob3VsZCBvbmx5IGJlCiAgIC8vICAgIGNhbGxlZCBhZnRlciB0aGUgfHByb21pc2V8IGlzIHJlc29sdmVkLgogICB2aXJ0dWFsIHZvaWQgQ3JlYXRlU2Vzc2lvbkFuZEdlbmVyYXRlUmVxdWVzdCgKLSAgICAgIFNlc3Npb25UeXBlIHNlc3Npb25fdHlwZSwKLSAgICAgIEVtZUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSwKKyAgICAgIFNlc3Npb25UeXBlIHNlc3Npb25fdHlwZSwgRW1lSW5pdERhdGFUeXBlIGluaXRfZGF0YV90eXBlLAogICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXRfZGF0YSwKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxOZXdTZXNzaW9uQ2RtUHJvbWlzZT4gcHJvbWlzZSkgPSAwOwogCkBAIC0xNzksMTAgKzE3OCw5IEBACiAKIC8vIENhbGxlZCB3aGVuIHRoZSBDRE0gbmVlZHMgdG8gcXVldWUgYSBtZXNzYWdlIGV2ZW50IHRvIHRoZSBzZXNzaW9uIG9iamVjdC4KIC8vIFNlZSBodHRwOi8vdzNjLmdpdGh1Yi5pby9lbmNyeXB0ZWQtbWVkaWEvI2RvbS1ldnQtbWVzc2FnZQotdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhS2V5czo6TWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBtZXNzYWdlKT4KLSAgICBTZXNzaW9uTWVzc2FnZUNCOwordHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKAorICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkLCBNZWRpYUtleXM6Ok1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgbWVzc2FnZSk+IFNlc3Npb25NZXNzYWdlQ0I7CiAKIC8vIENhbGxlZCB3aGVuIHRoZSBzZXNzaW9uIHNwZWNpZmllZCBieSB8c2Vzc2lvbl9pZHwgaXMgY2xvc2VkLiBOb3RlIHRoYXQgdGhlCiAvLyBDRE0gbWF5IGNsb3NlIGEgc2Vzc2lvbiBhdCBhbnkgcG9pbnQsIHN1Y2ggYXMgaW4gcmVzcG9uc2UgdG8gYSBDbG9zZVNlc3Npb24oKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZy5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2cuY2MKaW5kZXggYjUwNjY2MC4uYTE1YzFiZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZy5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfbG9nLmNjCkBAIC0yMjEsMTEgKzIyMSwxMSBAQAogICByZXR1cm4gZXZlbnQuUGFzcygpOwogfQogCi1zY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IE1lZGlhTG9nOjpDcmVhdGVQaXBlbGluZVN0YXRlQ2hhbmdlZEV2ZW50KAorLypzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IE1lZGlhTG9nOjpDcmVhdGVQaXBlbGluZVN0YXRlQ2hhbmdlZEV2ZW50KAogICAgIFBpcGVsaW5lSW1wbDo6U3RhdGUgc3RhdGUpIHsKICAgTk9UUkVBQ0hFRCgpOwogICByZXR1cm4gc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PigpOwotfQorfSovCiAKIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gTWVkaWFMb2c6OkNyZWF0ZVBpcGVsaW5lRXJyb3JFdmVudCgKICAgICBQaXBlbGluZVN0YXR1cyBlcnJvcikgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZy5oCmluZGV4IDQ4N2RlZmUuLmEyYTIxZjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2cuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfbG9nLmgKQEAgLTE3LDcgKzE3LDcgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfbG9nX2V2ZW50LmgiCi0jaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbC5oIgorLy8jaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbC5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgogCiBuYW1lc3BhY2UgbWVkaWEgewpAQCAtNjUsOCArNjUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgdmFsdWUpOwogICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IENyZWF0ZUxvYWRFdmVudChjb25zdCBzdGQ6OnN0cmluZyYgdXJsKTsKICAgc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBDcmVhdGVTZWVrRXZlbnQoZmxvYXQgc2Vjb25kcyk7Ci0gIHNjb3BlZF9wdHI8TWVkaWFMb2dFdmVudD4gQ3JlYXRlUGlwZWxpbmVTdGF0ZUNoYW5nZWRFdmVudCgKLSAgICAgIFBpcGVsaW5lSW1wbDo6U3RhdGUgc3RhdGUpOworICAvLyBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IENyZWF0ZVBpcGVsaW5lU3RhdGVDaGFuZ2VkRXZlbnQoCisgIC8vICBQaXBlbGluZUltcGw6OlN0YXRlIHN0YXRlKTsKICAgc2NvcGVkX3B0cjxNZWRpYUxvZ0V2ZW50PiBDcmVhdGVQaXBlbGluZUVycm9yRXZlbnQoUGlwZWxpbmVTdGF0dXMgZXJyb3IpOwogICBzY29wZWRfcHRyPE1lZGlhTG9nRXZlbnQ+IENyZWF0ZVZpZGVvU2l6ZVNldEV2ZW50KHNpemVfdCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgaGVpZ2h0KTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2dfZXZlbnQuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2dfZXZlbnQuaAppbmRleCBkZTExN2RkLi45ZjM5ZTU3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfbG9nX2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZ19ldmVudC5oCkBAIC0xNiw5ICsxNiw3IEBACiBzdHJ1Y3QgTWVkaWFMb2dFdmVudCB7CiAgIE1lZGlhTG9nRXZlbnQoKSB7fQogCi0gIE1lZGlhTG9nRXZlbnQoY29uc3QgTWVkaWFMb2dFdmVudCYgZXZlbnQpIHsKLSAgICAqdGhpcyA9IGV2ZW50OwotICB9CisgIE1lZGlhTG9nRXZlbnQoY29uc3QgTWVkaWFMb2dFdmVudCYgZXZlbnQpIHsgKnRoaXMgPSBldmVudDsgfQogCiAgIE1lZGlhTG9nRXZlbnQmIG9wZXJhdG9yPShjb25zdCBNZWRpYUxvZ0V2ZW50JiBldmVudCkgewogICAgIGlkID0gZXZlbnQuaWQ7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfcGVybWlzc2lvbi5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX3Blcm1pc3Npb24uaAppbmRleCA0MmY1YzlhLi4zMjEwNjA5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfcGVybWlzc2lvbi5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9wZXJtaXNzaW9uLmgKQEAgLTMxLDE1ICszMSwxMyBAQAogICAvLyB0cmlnZ2VyaW5nIHVzZXIgaW50ZXJhY3Rpb24gKGUuZy4gcGVybWlzc2lvbiBwcm9tcHQpLiBUaGUgc3RhdHVzIHdpbGwgYmUKICAgLy8gfGZhbHNlfCBpZiB0aGUgcGVybWlzc2lvbiBoYXMgbmV2ZXIgYmVlbiBzZXQuCiAgIHZpcnR1YWwgdm9pZCBIYXNQZXJtaXNzaW9uKAotICAgICAgVHlwZSB0eXBlLAotICAgICAgY29uc3QgR1VSTCYgc2VjdXJpdHlfb3JpZ2luLAorICAgICAgVHlwZSB0eXBlLCBjb25zdCBHVVJMJiBzZWN1cml0eV9vcmlnaW4sCiAgICAgICBjb25zdCBQZXJtaXNzaW9uU3RhdHVzQ0ImIHBlcm1pc3Npb25fc3RhdHVzX2NiKSA9IDA7CiAKICAgLy8gUmVxdWVzdHMgfHR5cGV8IHBlcm1pc3Npb24gZm9yIHxzZWN1cml0eV9vcmlnaW9ufC4gVGhpcyBtYXkgdHJpZ2dlciB1c2VyCiAgIC8vIGludGVyYWN0aW9uIChlLmcuIHBlcm1pc3Npb24gcHJvbXB0KSBpZiB0aGUgcGVybWlzc2lvbiBoYXMgbmV2ZXIgYmVlbiBzZXQuCiAgIHZpcnR1YWwgdm9pZCBSZXF1ZXN0UGVybWlzc2lvbigKLSAgICAgIFR5cGUgdHlwZSwKLSAgICAgIGNvbnN0IEdVUkwmIHNlY3VyaXR5X29yaWdpbiwKKyAgICAgIFR5cGUgdHlwZSwgY29uc3QgR1VSTCYgc2VjdXJpdHlfb3JpZ2luLAogICAgICAgY29uc3QgUGVybWlzc2lvblN0YXR1c0NCJiBwZXJtaXNzaW9uX3N0YXR1c19jYikgPSAwOwogCiAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV90cmFjay5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX3RyYWNrLmgKaW5kZXggZWU1ZDc3Yi4uNzJjYzIwZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX3RyYWNrLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX3RyYWNrLmgKQEAgLTE2LDEwICsxNiw4IEBACiAgcHVibGljOgogICBlbnVtIFR5cGUgeyBUZXh0LCBBdWRpbywgVmlkZW8gfTsKICAgdHlwZWRlZiBzdGQ6OnN0cmluZyBJZDsKLSAgTWVkaWFUcmFjayhUeXBlIHR5cGUsCi0gICAgICAgICAgICAgU3RyZWFtUGFyc2VyOjpUcmFja0lkIGJ5dGVzdHJlYW1fdHJhY2tfaWQsCi0gICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtpbmQsCi0gICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsLAorICBNZWRpYVRyYWNrKFR5cGUgdHlwZSwgU3RyZWFtUGFyc2VyOjpUcmFja0lkIGJ5dGVzdHJlYW1fdHJhY2tfaWQsCisgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCwKICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZyk7CiAgIH5NZWRpYVRyYWNrKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV90cmFja3MuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV90cmFja3MuaAppbmRleCA5OWMzYTk0Li43YzY2OTgyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfdHJhY2tzLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX3RyYWNrcy5oCkBAIC0zMSwxNSArMzEsMTMgQEAKICAgLy8gdHJhY2sgd2l0aGluIHRoZSBieXRlc3RyZWFtLgogICBNZWRpYVRyYWNrKiBBZGRBdWRpb1RyYWNrKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmVhbVBhcnNlcjo6VHJhY2tJZCBieXRlc3RyZWFtX3RyYWNrX2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBraW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2luZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSk7CiAgIC8vIEFkZHMgYSBuZXcgdmlkZW8gdHJhY2suIFRoZSB8Ynl0ZXN0cmVhbVRyYWNrSWR8IG11c3QgdW5pcXVlbHkgaWRlbnRpZnkgdGhlCiAgIC8vIHRyYWNrIHdpdGhpbiB0aGUgYnl0ZXN0cmVhbS4KICAgTWVkaWFUcmFjayogQWRkVmlkZW9UcmFjayhjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJlYW1QYXJzZXI6OlRyYWNrSWQgYnl0ZXN0cmVhbV90cmFja19pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYga2luZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFiZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtpbmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UpOwogCiAgIGNvbnN0IE1lZGlhVHJhY2tzQ29sbGVjdGlvbiYgdHJhY2tzKCkgY29uc3QgeyByZXR1cm4gdHJhY2tzXzsgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21lZGlhX3VybF9kZW11eGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfdXJsX2RlbXV4ZXIuaAppbmRleCBjYjY4YzRlLi45MDM2NTFmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfdXJsX2RlbXV4ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfdXJsX2RlbXV4ZXIuaApAQCAtNDMsOCArNDMsNyBAQAogCiAgIC8vIERlbXV4ZXIgaW50ZXJmYWNlLgogICBzdGQ6OnN0cmluZyBHZXREaXNwbGF5TmFtZSgpIGNvbnN0IE9WRVJSSURFOwotICB2b2lkIEluaXRpYWxpemUoRGVtdXhlckhvc3QqIGhvc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdGF0dXNfY2IsCisgIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAogICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfdGV4dF90cmFja3MpIE9WRVJSSURFOwogICB2b2lkIFN0YXJ0V2FpdGluZ0ZvclNlZWsoYmFzZTo6VGltZURlbHRhIHNlZWtfdGltZSkgT1ZFUlJJREU7CiAgIHZvaWQgQ2FuY2VsUGVuZGluZ1NlZWsoYmFzZTo6VGltZURlbHRhIHNlZWtfdGltZSkgT1ZFUlJJREU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWltZV91dGlsLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWltZV91dGlsLmgKaW5kZXggNjdlYmU5My4uMWY2NDRmYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21pbWVfdXRpbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9taW1lX3V0aWwuaApAQCAtNDksMTQgKzQ5LDEyIEBACiAvLyAqIFJldHVybnMgSXNOb3RTdXBwb3J0ZWQgaWYgZWl0aGVyIHRoZSB8bWltZV90eXBlfCBpcyBub3Qgc3VwcG9ydGVkIG9yIHRoZQogLy8gICB8bWltZV90eXBlfCBpcyBzdXBwb3J0ZWQgYnV0IGF0IGxlYXN0IG9uZSBvZiB0aGUgY29kZWNzIHdpdGhpbiB8Y29kZWNzfCBpcwogLy8gICBub3Qgc3VwcG9ydGVkIGZvciB0aGUgfG1pbWVfdHlwZXwuCi1NRURJQV9FWFBPUlQgU3VwcG9ydHNUeXBlCi1Jc1N1cHBvcnRlZE1lZGlhRm9ybWF0KGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgY29kZWNzKTsKK01FRElBX0VYUE9SVCBTdXBwb3J0c1R5cGUgSXNTdXBwb3J0ZWRNZWRpYUZvcm1hdCgKKyAgICBjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcyk7CiAKIC8vIFNpbWlsYXIgdG8gdGhlIGFib3ZlLCBidXQgZm9yIGVuY3J5cHRlZCBmb3JtYXRzLgotTUVESUFfRVhQT1JUIFN1cHBvcnRzVHlwZQotSXNTdXBwb3J0ZWRFbmNyeXB0ZWRNZWRpYUZvcm1hdChjb25zdCBzdGQ6OnN0cmluZyYgbWltZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcyk7CitNRURJQV9FWFBPUlQgU3VwcG9ydHNUeXBlIElzU3VwcG9ydGVkRW5jcnlwdGVkTWVkaWFGb3JtYXQoCisgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpOwogCiAvLyBUZXN0IG9ubHkgbWV0aG9kIHRoYXQgcmVtb3ZlcyBwcm9wcmlldGFyeSBtZWRpYSB0eXBlcyBhbmQgY29kZWNzIGZyb20gdGhlCiAvLyBsaXN0IG9mIHN1cHBvcnRlZCBNSU1FIHR5cGVzIGFuZCBjb2RlY3MuIFRoZXNlIHR5cGVzIGFuZCBjb2RlY3MgbXVzdCBiZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21pbWVfdXRpbF9pbnRlcm5hbC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21pbWVfdXRpbF9pbnRlcm5hbC5oCmluZGV4IDhlYTEwN2QuLjFkNTM5ZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9taW1lX3V0aWxfaW50ZXJuYWwuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbWltZV91dGlsX2ludGVybmFsLmgKQEAgLTY1LDggKzY1LDcgQEAKICAgLy8gU2VlIG1pbWVfdXRpbC5oIGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIHRoZXNlIG1ldGhvZHMuCiAgIGJvb2wgSXNTdXBwb3J0ZWRNZWRpYU1pbWVUeXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGUpIGNvbnN0OwogICB2b2lkIFBhcnNlQ29kZWNTdHJpbmcoY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjcywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogY29kZWNzX291dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc3RyaXApOworICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBjb2RlY3Nfb3V0LCBib29sIHN0cmlwKTsKICAgU3VwcG9ydHNUeXBlIElzU3VwcG9ydGVkTWVkaWFGb3JtYXQoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkKSBjb25zdDsKQEAgLTc5LDkgKzc4LDcgQEAKICAgLy8gfHBsYXRmb3JtX2luZm98IGRlc2NyaWJlcyB0aGUgYXZhaWxhYmlsaXR5IG9mIHZhcmlvdXMgcGxhdGZvcm0gZmVhdHVyZXM7CiAgIC8vIHNlZSBQbGF0Zm9ybUluZm8gZm9yIG1vcmUgZGV0YWlscy4KICAgc3RhdGljIGJvb2wgSXNDb2RlY1N1cHBvcnRlZE9uUGxhdGZvcm0oCi0gICAgICBDb2RlYyBjb2RlYywKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGVfbG93ZXJfY2FzZSwKLSAgICAgIGJvb2wgaXNfZW5jcnlwdGVkLAorICAgICAgQ29kZWMgY29kZWMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGVfbG93ZXJfY2FzZSwgYm9vbCBpc19lbmNyeXB0ZWQsCiAgICAgICBjb25zdCBQbGF0Zm9ybUluZm8mIHBsYXRmb3JtX2luZm8pOwogCiAgcHJpdmF0ZToKQEAgLTEzMCwxOSArMTI3LDE1IEBACiAgIC8vIGF1ZGlvIGNvZGVjcykuCiAgIC8vIHxpc19lbmNyeXB0ZWR8IG1lYW5zIHRoZSBjb2RlYyB3aWxsIGJlIHVzZWQgd2l0aCBlbmNyeXB0ZWQgYmxvY2tzLgogICBib29sIFN0cmluZ1RvQ29kZWMoY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZV9sb3dlcl9jYXNlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLAotICAgICAgICAgICAgICAgICAgICAgQ29kZWMqIGNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCogaXNfYW1iaWd1b3VzLAotICAgICAgICAgICAgICAgICAgICAgVmlkZW9Db2RlY1Byb2ZpbGUqIG91dF9wcm9maWxlLAotICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogb3V0X2xldmVsLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19lbmNyeXB0ZWQpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLCBDb2RlYyogY29kZWMsCisgICAgICAgICAgICAgICAgICAgICBib29sKiBpc19hbWJpZ3VvdXMsIFZpZGVvQ29kZWNQcm9maWxlKiBvdXRfcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIG91dF9sZXZlbCwgYm9vbCBpc19lbmNyeXB0ZWQpIGNvbnN0OwogCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8Y29kZWN8IGlzIHN1cHBvcnRlZCB3aGVuIGNvbnRhaW5lZCBpbgogICAvLyB8bWltZV90eXBlX2xvd2VyX2Nhc2V8LiBOb3RlOiBUaGlzIG1ldGhvZCB3aWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgZm9yCiAgIC8vIHByb3ByaWV0YXJ5IGNvZGVjcyBpZiB8YWxsb3dfcHJvcHJpZXRhcnlfY29kZWNzX3wgaXMgc2V0IHRvIGZhbHNlLgogICAvLyB8aXNfZW5jcnlwdGVkfCBtZWFucyB0aGUgY29kZWMgd2lsbCBiZSB1c2VkIHdpdGggZW5jcnlwdGVkIGJsb2Nrcy4KLSAgYm9vbCBJc0NvZGVjU3VwcG9ydGVkKENvZGVjIGNvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1pbWVfdHlwZV9sb3dlcl9jYXNlLAorICBib29sIElzQ29kZWNTdXBwb3J0ZWQoQ29kZWMgY29kZWMsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtaW1lX3R5cGVfbG93ZXJfY2FzZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkKSBjb25zdDsKIAogICAvLyBSZXR1cm5zIHRydWUgaWYgfGNvZGVjfCByZWZlcnMgdG8gYSBwcm9wcmlldGFyeSBjb2RlYy4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tb2NrX2RlbXV4ZXJfaG9zdC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmgKaW5kZXggZmRhMjRmNi4uYTM0ZGEwZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21vY2tfZGVtdXhlcl9ob3N0LmgKQEAgLTIxLDggKzIxLDcgQEAKICAgICAgICAgICAgICAgIHZvaWQoY29uc3QgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4mKSk7CiAgIE1PQ0tfTUVUSE9EMShTZXREdXJhdGlvbiwgdm9pZChiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24pKTsKICAgTU9DS19NRVRIT0QxKE9uRGVtdXhlckVycm9yLCB2b2lkKFBpcGVsaW5lU3RhdHVzIGVycm9yKSk7Ci0gIE1PQ0tfTUVUSE9EMihBZGRUZXh0U3RyZWFtLCB2b2lkKERlbXV4ZXJTdHJlYW0qLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXh0VHJhY2tDb25maWcmKSk7CisgIE1PQ0tfTUVUSE9EMihBZGRUZXh0U3RyZWFtLCB2b2lkKERlbXV4ZXJTdHJlYW0qLCBjb25zdCBUZXh0VHJhY2tDb25maWcmKSk7CiAgIE1PQ0tfTUVUSE9EMShSZW1vdmVUZXh0U3RyZWFtLCB2b2lkKERlbXV4ZXJTdHJlYW0qKSk7CiAKICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL21vY2tfZmlsdGVycy5oCmluZGV4IDcxOWIzYzYuLjg5ODliOTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9tb2NrX2ZpbHRlcnMuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvbW9ja19maWx0ZXJzLmgKQEAgLTYzLDE4ICs2MywxMyBAQAogICAvLyB0YWtlIHVuaXF1ZV9wdHIqIGluc3RlYWQgb2YgdW5pcXVlX3B0ciBzbyB0aGF0IHRoZXkgY2FuIGJlIG1vY2sgbWV0aG9kcy4KICAgLy8gUHJpdmF0ZSBzdHVicyBmb3IgU3RhcnQoKSBhbmQgUmVzdW1lKCkgaW1wbGVtZW50IHRoZSBhY3R1YWwgUGlwZWxpbmUKICAgLy8gaW50ZXJmYWNlIGJ5IGZvcndhcmRpbmcgdG8gdGhlc2UgbW9jayBtZXRob2RzLgotICBNT0NLX01FVEhPRDQoU3RhcnQsCi0gICAgICAgICAgICAgICB2b2lkKERlbXV4ZXIqLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyZXI+KiwKLSAgICAgICAgICAgICAgICAgICAgQ2xpZW50KiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYpKTsKKyAgTU9DS19NRVRIT0Q0KFN0YXJ0LCB2b2lkKERlbXV4ZXIqLCBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyZXI+KiwgQ2xpZW50KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImKSk7CiAgIE1PQ0tfTUVUSE9EMChTdG9wLCB2b2lkKCkpOwogICBNT0NLX01FVEhPRDIoU2Vlaywgdm9pZChiYXNlOjpUaW1lRGVsdGEsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImKSk7CiAgIE1PQ0tfTUVUSE9EMShTdXNwZW5kLCB2b2lkKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImKSk7Ci0gIE1PQ0tfTUVUSE9EMyhSZXN1bWUsCi0gICAgICAgICAgICAgICB2b2lkKHN0ZDo6dW5pcXVlX3B0cjxSZW5kZXJlcj4qLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImKSk7CisgIE1PQ0tfTUVUSE9EMyhSZXN1bWUsIHZvaWQoc3RkOjp1bmlxdWVfcHRyPFJlbmRlcmVyPiosIGJhc2U6OlRpbWVEZWx0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJikpOwogCiAgIE1PQ0tfTUVUSE9EMShPbkVuYWJsZWRBdWRpb1RyYWNrc0NoYW5nZWQsCiAgICAgICAgICAgICAgICB2b2lkKGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhVHJhY2s6OklkPiYpKTsKQEAgLTEwMiwxMiArOTcsOSBAQAogCiAgcHJpdmF0ZToKICAgLy8gRm9yd2FyZGluZyBzdHVicyAoc2VlIGNvbW1lbnQgYWJvdmUpLgotICB2b2lkIFN0YXJ0KERlbXV4ZXIqIGRlbXV4ZXIsCi0gICAgICAgICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlcmVyPiByZW5kZXJlciwKLSAgICAgICAgICAgICBDbGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiKSBPVkVSUklERTsKLSAgdm9pZCBSZXN1bWUoc3RkOjp1bmlxdWVfcHRyPFJlbmRlcmVyPiByZW5kZXJlciwKLSAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwKKyAgdm9pZCBTdGFydChEZW11eGVyKiBkZW11eGVyLCBzdGQ6OnVuaXF1ZV9wdHI8UmVuZGVyZXI+IHJlbmRlcmVyLAorICAgICAgICAgICAgIENsaWVudCogY2xpZW50LCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiKSBPVkVSUklERTsKKyAgdm9pZCBSZXN1bWUoc3RkOjp1bmlxdWVfcHRyPFJlbmRlcmVyPiByZW5kZXJlciwgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwKICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYikgT1ZFUlJJREU7CiAKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tQaXBlbGluZSk7CkBAIC0xODAsMTAgKzE3Miw4IEBACiAgIC8vIFZpZGVvRGVjb2RlciBpbXBsZW1lbnRhdGlvbi4KICAgdmlydHVhbCBzdGQ6OnN0cmluZyBHZXREaXNwbGF5TmFtZSgpIGNvbnN0OwogICBNT0NLX01FVEhPRDUoSW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgIHZvaWQoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgbG93X2RlbGF5LAotICAgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdENCJiBpbml0X2NiLAorICAgICAgICAgICAgICAgdm9pZChjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywgYm9vbCBsb3dfZGVsYXksCisgICAgICAgICAgICAgICAgICAgIENkbUNvbnRleHQqIGNkbV9jb250ZXh0LCBjb25zdCBJbml0Q0ImIGluaXRfY2IsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dENCJiBvdXRwdXRfY2IpKTsKICAgTU9DS19NRVRIT0QyKERlY29kZSwgdm9pZChjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImKSk7CkBAIC0yMDMsMTMgKzE5MywxMCBAQAogICAvLyBBdWRpb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCiAgIHZpcnR1YWwgc3RkOjpzdHJpbmcgR2V0RGlzcGxheU5hbWUoKSBjb25zdDsKICAgTU9DS19NRVRIT0Q0KEluaXRpYWxpemUsCi0gICAgICAgICAgICAgICB2b2lkKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdENCJiBpbml0X2NiLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRDQiYgb3V0cHV0X2NiKSk7Ci0gIE1PQ0tfTUVUSE9EMihEZWNvZGUsCi0gICAgICAgICAgICAgICB2b2lkKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImKSk7CisgICAgICAgICAgICAgICB2b2lkKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnLCBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdENCJiBpbml0X2NiLCBjb25zdCBPdXRwdXRDQiYgb3V0cHV0X2NiKSk7CisgIE1PQ0tfTUVUSE9EMihEZWNvZGUsIHZvaWQoY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY29kZUNCJikpOwogICBNT0NLX01FVEhPRDEoUmVzZXQsIHZvaWQoY29uc3QgYmFzZTo6Q2xvc3VyZSYpKTsKIAogIHByaXZhdGU6CkBAIC0yMzksOCArMjI2LDcgQEAKIAogICAvLyBWaWRlb1JlbmRlcmVyIGltcGxlbWVudGF0aW9uLgogICBNT0NLX01FVEhPRDUoSW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgIHZvaWQoRGVtdXhlclN0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKKyAgICAgICAgICAgICAgIHZvaWQoRGVtdXhlclN0cmVhbSogc3RyZWFtLCBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgUmVuZGVyZXJDbGllbnQqIGNsaWVudCwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGltZVNvdXJjZTo6V2FsbENsb2NrVGltZUNCJiB3YWxsX2Nsb2NrX3RpbWVfY2IsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGluaXRfY2IpKTsKQEAgLTI2MCwxMCArMjQ2LDggQEAKIAogICAvLyBBdWRpb1JlbmRlcmVyIGltcGxlbWVudGF0aW9uLgogICBNT0NLX01FVEhPRDQoSW5pdGlhbGl6ZSwKLSAgICAgICAgICAgICAgIHZvaWQoRGVtdXhlclN0cmVhbSogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgUmVuZGVyZXJDbGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgaW5pdF9jYikpOworICAgICAgICAgICAgICAgdm9pZChEZW11eGVyU3RyZWFtKiBzdHJlYW0sIENkbUNvbnRleHQqIGNkbV9jb250ZXh0LAorICAgICAgICAgICAgICAgICAgICBSZW5kZXJlckNsaWVudCogY2xpZW50LCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiKSk7CiAgIE1PQ0tfTUVUSE9EMChHZXRUaW1lU291cmNlLCBUaW1lU291cmNlKigpKTsKICAgTU9DS19NRVRIT0QxKEZsdXNoLCB2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSk7CiAgIE1PQ0tfTUVUSE9EMChTdGFydFBsYXlpbmcsIHZvaWQoKSk7CkBAIC0yODEsOCArMjY1LDcgQEAKICAgLy8gUmVuZGVyZXIgaW1wbGVtZW50YXRpb24uCiAgIE1PQ0tfTUVUSE9EMyhJbml0aWFsaXplLAogICAgICAgICAgICAgICAgdm9pZChEZW11eGVyU3RyZWFtUHJvdmlkZXIqIGRlbXV4ZXJfc3RyZWFtX3Byb3ZpZGVyLAotICAgICAgICAgICAgICAgICAgICBSZW5kZXJlckNsaWVudCogY2xpZW50LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiKSk7CisgICAgICAgICAgICAgICAgICAgIFJlbmRlcmVyQ2xpZW50KiBjbGllbnQsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGluaXRfY2IpKTsKICAgTU9DS19NRVRIT0QxKEZsdXNoLCB2b2lkKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGZsdXNoX2NiKSk7CiAgIE1PQ0tfTUVUSE9EMShTdGFydFBsYXlpbmdGcm9tLCB2b2lkKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApKTsKICAgTU9DS19NRVRIT0QxKFNldFBsYXliYWNrUmF0ZSwgdm9pZChkb3VibGUgcGxheWJhY2tfcmF0ZSkpOwpAQCAtMjkwLDkgKzI3Myw4IEBACiAgIE1PQ0tfTUVUSE9EMChHZXRNZWRpYVRpbWUsIGJhc2U6OlRpbWVEZWx0YSgpKTsKICAgTU9DS19NRVRIT0QwKEhhc0F1ZGlvLCBib29sKCkpOwogICBNT0NLX01FVEhPRDAoSGFzVmlkZW8sIGJvb2woKSk7Ci0gIE1PQ0tfTUVUSE9EMihTZXRDZG0sCi0gICAgICAgICAgICAgICB2b2lkKENkbUNvbnRleHQqIGNkbV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBDZG1BdHRhY2hlZENCJiBjZG1fYXR0YWNoZWRfY2IpKTsKKyAgTU9DS19NRVRIT0QyKFNldENkbSwgdm9pZChDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDZG1BdHRhY2hlZENCJiBjZG1fYXR0YWNoZWRfY2IpKTsKIAogIHByaXZhdGU6CiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihNb2NrUmVuZGVyZXIpOwpAQCAtMzA5LDkgKzI5MSw4IEBACiAgIE1PQ0tfTUVUSE9EMShTZXRQbGF5YmFja1JhdGUsIHZvaWQoZG91YmxlKSk7CiAgIE1PQ0tfTUVUSE9EMShTZXRNZWRpYVRpbWUsIHZvaWQoYmFzZTo6VGltZURlbHRhKSk7CiAgIE1PQ0tfTUVUSE9EMChDdXJyZW50TWVkaWFUaW1lLCBiYXNlOjpUaW1lRGVsdGEoKSk7Ci0gIE1PQ0tfTUVUSE9EMihHZXRXYWxsQ2xvY2tUaW1lcywKLSAgICAgICAgICAgICAgIGJvb2woY29uc3Qgc3RkOjp2ZWN0b3I8YmFzZTo6VGltZURlbHRhPiYsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJhc2U6OlRpbWVUaWNrcz4qKSk7CisgIE1PQ0tfTUVUSE9EMihHZXRXYWxsQ2xvY2tUaW1lcywgYm9vbChjb25zdCBzdGQ6OnZlY3RvcjxiYXNlOjpUaW1lRGVsdGE+JiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJhc2U6OlRpbWVUaWNrcz4qKSk7CiAKICBwcml2YXRlOgogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTW9ja1RpbWVTb3VyY2UpOwpAQCAtMzIyLDExICszMDMsMTAgQEAKICAgTW9ja1RleHRUcmFjaygpOwogICB2aXJ0dWFsIH5Nb2NrVGV4dFRyYWNrKCk7CiAKLSAgTU9DS19NRVRIT0Q1KGFkZFdlYlZUVEN1ZSwgdm9pZChjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgZW5kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2V0dGluZ3MpKTsKKyAgTU9DS19NRVRIT0Q1KGFkZFdlYlZUVEN1ZSwKKyAgICAgICAgICAgICAgIHZvaWQoY29uc3QgYmFzZTo6VGltZURlbHRhJiBzdGFydCwgY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXR0aW5ncykpOwogCiAgcHJpdmF0ZToKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKE1vY2tUZXh0VHJhY2spOwpAQCAtMzM3LDE4ICszMTcsMTYgQEAKICAgTW9ja0RlY3J5cHRvcigpOwogICB2aXJ0dWFsIH5Nb2NrRGVjcnlwdG9yKCk7CiAKLSAgTU9DS19NRVRIT0QyKFJlZ2lzdGVyTmV3S2V5Q0IsIHZvaWQoU3RyZWFtVHlwZSBzdHJlYW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTmV3S2V5Q0ImIG5ld19rZXlfY2IpKTsKKyAgTU9DS19NRVRIT0QyKFJlZ2lzdGVyTmV3S2V5Q0IsCisgICAgICAgICAgICAgICB2b2lkKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUsIGNvbnN0IE5ld0tleUNCJiBuZXdfa2V5X2NiKSk7CiAgIE1PQ0tfTUVUSE9EMyhEZWNyeXB0LCB2b2lkKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGVuY3J5cHRlZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjcnlwdENCJiBkZWNyeXB0X2NiKSk7CiAgIE1PQ0tfTUVUSE9EMShDYW5jZWxEZWNyeXB0LCB2b2lkKFN0cmVhbVR5cGUgc3RyZWFtX3R5cGUpKTsKLSAgTU9DS19NRVRIT0QyKEluaXRpYWxpemVBdWRpb0RlY29kZXIsCi0gICAgICAgICAgICAgICB2b2lkKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNvZGVySW5pdENCJiBpbml0X2NiKSk7Ci0gIE1PQ0tfTUVUSE9EMihJbml0aWFsaXplVmlkZW9EZWNvZGVyLAotICAgICAgICAgICAgICAgdm9pZChjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikpOworICBNT0NLX01FVEhPRDIoSW5pdGlhbGl6ZUF1ZGlvRGVjb2Rlciwgdm9pZChjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikpOworICBNT0NLX01FVEhPRDIoSW5pdGlhbGl6ZVZpZGVvRGVjb2Rlciwgdm9pZChjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlckluaXRDQiYgaW5pdF9jYikpOwogICBNT0NLX01FVEhPRDIoRGVjcnlwdEFuZERlY29kZUF1ZGlvLAogICAgICAgICAgICAgICAgdm9pZChjb25zdCBzY29wZWRfcmVmcHRyPG1lZGlhOjpEZWNvZGVyQnVmZmVyPiYgZW5jcnlwdGVkLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0RlY29kZUNCJiBhdWRpb19kZWNvZGVfY2IpKTsKQEAgLTM4NSwxNSArMzYzLDEyIEBACiAKICAgLy8gU3RyZWFtUGFyc2VyIGludGVyZmFjZQogICBNT0NLX01FVEhPRDgoCi0gICAgICBJbml0LAotICAgICAgdm9pZChjb25zdCBJbml0Q0ImIGluaXRfY2IsCi0gICAgICAgICAgIGNvbnN0IE5ld0NvbmZpZ0NCJiBjb25maWdfY2IsCi0gICAgICAgICAgIGNvbnN0IE5ld0J1ZmZlcnNDQiYgbmV3X2J1ZmZlcnNfY2IsCi0gICAgICAgICAgIGJvb2wgaWdub3JlX3RleHRfdHJhY2ssCi0gICAgICAgICAgIGNvbnN0IEVuY3J5cHRlZE1lZGlhSW5pdERhdGFDQiYgZW5jcnlwdGVkX21lZGlhX2luaXRfZGF0YV9jYiwKLSAgICAgICAgICAgY29uc3QgTmV3TWVkaWFTZWdtZW50Q0ImIG5ld19zZWdtZW50X2NiLAotICAgICAgICAgICBjb25zdCBFbmRNZWRpYVNlZ21lbnRDQiYgZW5kX29mX3NlZ21lbnRfY2IsCi0gICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2cpKTsKKyAgICAgIEluaXQsIHZvaWQoY29uc3QgSW5pdENCJiBpbml0X2NiLCBjb25zdCBOZXdDb25maWdDQiYgY29uZmlnX2NiLAorICAgICAgICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIG5ld19idWZmZXJzX2NiLCBib29sIGlnbm9yZV90ZXh0X3RyYWNrLAorICAgICAgICAgICAgICAgICBjb25zdCBFbmNyeXB0ZWRNZWRpYUluaXREYXRhQ0ImIGVuY3J5cHRlZF9tZWRpYV9pbml0X2RhdGFfY2IsCisgICAgICAgICAgICAgICAgIGNvbnN0IE5ld01lZGlhU2VnbWVudENCJiBuZXdfc2VnbWVudF9jYiwKKyAgICAgICAgICAgICAgICAgY29uc3QgRW5kTWVkaWFTZWdtZW50Q0ImIGVuZF9vZl9zZWdtZW50X2NiLAorICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nKSk7CiAgIE1PQ0tfTUVUSE9EMChGbHVzaCwgdm9pZCgpKTsKICAgTU9DS19NRVRIT0QyKFBhcnNlLCBib29sKGNvbnN0IHVpbnQ4X3QqLCBpbnQpKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmUuaAppbmRleCA1NDcwZGJjLi5mNDA4NWI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmUuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmUuaApAQCAtMSw5OSArMSwxMTYgQEAKLS8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKLS8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9CQVNFX1BJUEVMSU5FX0hfCiAjZGVmaW5lIENPQkFMVF9NRURJQV9CQVNFX1BJUEVMSU5FX0hfCiAKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KKyNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKICNpbmNsdWRlICJiYXNlL3RpbWUuaCIKLSNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9idWZmZXJpbmdfc3RhdGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9jZG1fY29udGV4dC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlY3J5cHRvci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKLSNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV90cmFjay5oIgotI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lX21ldGFkYXRhLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmVfc3RhdHVzLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcmFuZ2VzLmgiCi0jaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvdGV4dF90cmFjay5oIgotI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX3JvdGF0aW9uLmgiCisjaW5jbHVkZSAidWkvZ2Z4L3JlY3QuaCIKICNpbmNsdWRlICJ1aS9nZngvc2l6ZS5oIgogCisjaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCisjaWYgU0JfSEFTKFBMQVlFUikKKworI2RlZmluZSBDT0JBTFRfVVNFX1NCUExBWUVSX1BJUEVMSU5FCisKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikKKyNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCisKKyNpZiBkZWZpbmVkKENPQkFMVF9VU0VfU0JQTEFZRVJfUElQRUxJTkUpCisjaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgordHlwZWRlZiBTYldpbmRvdyBQaXBlbGluZVdpbmRvdzsKKyNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfVVNFX1NCUExBWUVSX1BJUEVMSU5FKQordHlwZWRlZiB2b2lkKiBQaXBlbGluZVdpbmRvdzsKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfVVNFX1NCUExBWUVSX1BJUEVMSU5FKQorCiBuYW1lc3BhY2UgbWVkaWEgewogCi1jbGFzcyBEZW11eGVyOwotY2xhc3MgUmVuZGVyZXI7Ci1jbGFzcyBWaWRlb0ZyYW1lOworY2xhc3MgTWVkaWFMb2c7CiAKLWNsYXNzIE1FRElBX0VYUE9SVCBQaXBlbGluZSB7CisvLyBQaXBlbGluZSBjb250YWlucyB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgbWVkaWEgcGlwZWxpbmVzLiAgSXQgcHJvdmlkZXMKKy8vIGZ1bmN0aW9ucyB0byBwZXJmb3JtIGFzeW5jaHJvbm91cyBpbml0aWFsaXphdGlvbiwgcGF1c2luZywgc2Vla2luZyBhbmQKKy8vIHBsYXlpbmcuCitjbGFzcyBNRURJQV9FWFBPUlQgUGlwZWxpbmUgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8UGlwZWxpbmU+IHsKICBwdWJsaWM6Ci0gIGNsYXNzIENsaWVudCB7Ci0gICBwdWJsaWM6Ci0gICAgLy8gRXhlY3V0ZWQgd2hlbmV2ZXIgYW4gZXJyb3Igb2NjdXJzIGV4Y2VwdCB3aGVuIHRoZSBlcnJvciBvY2N1cnMgZHVyaW5nCi0gICAgLy8gU3RhcnQvU2Vlay9SZXN1bWUgb3IgU3VzcGVuZC4gVGhvc2UgZXJyb3JzIGFyZSByZXBvcnRlZCB2aWEgfHNlZWtfY2J8Ci0gICAgLy8gYW5kIHxzdXNwZW5kX2NifCByZXNwZWN0aXZlbHkuCi0gICAgdmlydHVhbCB2b2lkIE9uRXJyb3IoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSA9IDA7CisgIC8vIFJldHVybiB0cnVlIGlmIHRoZSBwdW5jaCB0aHJvdWdoIGJveCBzaG91bGQgYmUgcmVuZGVyZWQuICBSZXR1cm4gZmFsc2UgaWYKKyAgLy8gbm8gcHVuY2ggdGhyb3VnaCBib3ggc2hvdWxkIGJlIHJlbmRlcmVkLgorICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGJvb2woY29uc3QgZ2Z4OjpSZWN0Jik+IFNldEJvdW5kc0NCOwogCi0gICAgLy8gRXhlY3V0ZWQgd2hlbmV2ZXIgdGhlIG1lZGlhIHJlYWNoZXMgdGhlIGVuZC4KLSAgICB2aXJ0dWFsIHZvaWQgT25FbmRlZCgpID0gMDsKLQotICAgIC8vIEV4ZWN1dGVkIHdoZW4gdGhlIGNvbnRlbnQgZHVyYXRpb24sIGNvbnRhaW5lciB2aWRlbyBzaXplLCBzdGFydCB0aW1lLAotICAgIC8vIGFuZCB3aGV0aGVyIHRoZSBjb250ZW50IGhhcyBhdWRpbyBhbmQvb3IgdmlkZW8gaW4gc3VwcG9ydGVkIGZvcm1hdHMgYXJlCi0gICAgLy8ga25vd24uCi0gICAgdmlydHVhbCB2b2lkIE9uTWV0YWRhdGEoUGlwZWxpbmVNZXRhZGF0YSBtZXRhZGF0YSkgPSAwOwotCi0gICAgLy8gRXhlY3V0ZWQgd2hlbmV2ZXIgdGhlcmUgYXJlIGNoYW5nZXMgaW4gdGhlIGJ1ZmZlcmluZyBzdGF0ZSBvZiB0aGUKLSAgICAvLyBwaXBlbGluZS4KLSAgICB2aXJ0dWFsIHZvaWQgT25CdWZmZXJpbmdTdGF0ZUNoYW5nZShCdWZmZXJpbmdTdGF0ZSBzdGF0ZSkgPSAwOwotCi0gICAgLy8gRXhlY3V0ZWQgd2hlbmV2ZXIgdGhlIHByZXNlbnRhdGlvbiBkdXJhdGlvbiBjaGFuZ2VzLgotICAgIHZpcnR1YWwgdm9pZCBPbkR1cmF0aW9uQ2hhbmdlKCkgPSAwOwotCi0gICAgLy8gRXhlY3V0ZWQgd2hlbmV2ZXIgYSB0ZXh0IHRyYWNrIGlzIGFkZGVkLgotICAgIC8vIFRoZSBjbGllbnQgaXMgZXhwZWN0ZWQgdG8gY3JlYXRlIGEgVGV4dFRyYWNrIGFuZCBjYWxsIHxkb25lX2NifC4KLSAgICB2aXJ0dWFsIHZvaWQgT25BZGRUZXh0VHJhY2soY29uc3QgVGV4dFRyYWNrQ29uZmlnJiBjb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFkZFRleHRUcmFja0RvbmVDQiYgZG9uZV9jYikgPSAwOwotCi0gICAgLy8gRXhlY3V0ZWQgd2hlbmV2ZXIgdGhlIGtleSBuZWVkZWQgdG8gZGVjcnlwdCB0aGUgc3RyZWFtIGlzIG5vdCBhdmFpbGFibGUuCi0gICAgdmlydHVhbCB2b2lkIE9uV2FpdGluZ0ZvckRlY3J5cHRpb25LZXkoKSA9IDA7Ci0KLSAgICAvLyBFeGVjdXRlZCBmb3IgdGhlIGZpcnN0IHZpZGVvIGZyYW1lIGFuZCB3aGVuZXZlciBuYXR1cmFsIHNpemUgY2hhbmdlcy4KLSAgICB2aXJ0dWFsIHZvaWQgT25WaWRlb05hdHVyYWxTaXplQ2hhbmdlKGNvbnN0IGdmeDo6U2l6ZSYgc2l6ZSkgPSAwOwotCi0gICAgLy8gRXhlY3V0ZWQgZm9yIHRoZSBmaXJzdCB2aWRlbyBmcmFtZSBhbmQgd2hlbmV2ZXIgb3BhY2l0eSBjaGFuZ2VzLgotICAgIHZpcnR1YWwgdm9pZCBPblZpZGVvT3BhY2l0eUNoYW5nZShib29sIG9wYXF1ZSkgPSAwOworICAvLyBCdWZmZXJpbmcgc3RhdGVzIHRoZSBwaXBlbGluZSB0cmFuc2l0aW9ucyBiZXR3ZWVuIGR1cmluZyBwbGF5YmFjay4KKyAgLy8ga0hhdmVNZXRhZGF0YToKKyAgLy8gICBJbmRpY2F0ZXMgdGhhdCB0aGUgZm9sbG93aW5nIHRoaW5ncyBhcmUga25vd246CisgIC8vICAgY29udGVudCBkdXJhdGlvbiwgbmF0dXJhbCBzaXplLCBzdGFydCB0aW1lLCBhbmQgd2hldGhlciB0aGUgY29udGVudCBoYXMKKyAgLy8gICBhdWRpbyBhbmQvb3IgdmlkZW8gaW4gc3VwcG9ydGVkIGZvcm1hdHMuCisgIC8vIGtQcmVyb2xsQ29tcGxldGVkOgorICAvLyAgIEFsbCByZW5kZXJlcnMgaGF2ZSBidWZmZXJlZCBlbm91Z2ggZGF0YSB0byBzYXRpc2Z5IHByZXJvbGwgYW5kIGFyZSByZWFkeQorICAvLyAgIHRvIHN0YXJ0IHBsYXliYWNrLgorICBlbnVtIEJ1ZmZlcmluZ1N0YXRlIHsKKyAgICBrSGF2ZU1ldGFkYXRhLAorICAgIGtQcmVyb2xsQ29tcGxldGVkLAogICB9OwogCisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChCdWZmZXJpbmdTdGF0ZSk+IEJ1ZmZlcmluZ1N0YXRlQ0I7CisKKyAgc3RhdGljIHNjb3BlZF9yZWZwdHI8UGlwZWxpbmU+IENyZWF0ZSgKKyAgICAgIFBpcGVsaW5lV2luZG93IHdpbmRvdywKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKKyAgICAgIE1lZGlhTG9nKiBtZWRpYV9sb2cpOworCiAgIHZpcnR1YWwgflBpcGVsaW5lKCkge30KIAotICAvLyBCdWlsZCBhIHBpcGVsaW5lIHRvIHVzaW5nIHRoZSBnaXZlbiB8ZGVtdXhlcnwgYW5kIHxyZW5kZXJlcnwgdG8gY29uc3RydWN0Ci0gIC8vIGEgZmlsdGVyIGNoYWluLCBleGVjdXRpbmcgfHNlZWtfY2J8IHdoZW4gdGhlIGluaXRpYWwgc2VlayBoYXMgY29tcGxldGVkLgotICAvLyBNZXRob2RzIG9uIFBpcGVsaW5lQ2xpZW50IG1heSBiZSBjYWxsZWQgdXAgdW50aWwgU3RvcCgpIGhhcyBjb21wbGV0ZWQuCi0gIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlIHBpcGVsaW5lIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuCi0gIHZpcnR1YWwgdm9pZCBTdGFydChEZW11eGVyKiBkZW11eGVyLAotICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxSZW5kZXJlcj4gcmVuZGVyZXIsCi0gICAgICAgICAgICAgICAgICAgICBDbGllbnQqIGNsaWVudCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHNlZWtfY2IpID0gMDsKKyAgdmlydHVhbCB2b2lkIFN1c3BlbmQoKSB7fQorICB2aXJ0dWFsIHZvaWQgUmVzdW1lKCkge30KIAotICAvLyB8ZW5hYmxlZFRyYWNrSWRzfCBjb250YWlucyB0cmFjayBpZHMgb2YgZW5hYmxlZCBhdWRpbyB0cmFja3MuCi0gIHZpcnR1YWwgdm9pZCBPbkVuYWJsZWRBdWRpb1RyYWNrc0NoYW5nZWQoCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxNZWRpYVRyYWNrOjpJZD4mIGVuYWJsZWRUcmFja0lkcykgPSAwOwotCi0gIC8vIHx0cmFja0lkfCBlaXRoZXIgZW1wdHksIHdoaWNoIG1lYW5zIG5vIHZpZGVvIHRyYWNrIGlzIHNlbGVjdGVkLCBvciBjb250YWluCi0gIC8vIG9uZSBlbGVtZW50IC0gdGhlIHNlbGVjdGVkIHZpZGVvIHRyYWNrIGlkLgotICB2aXJ0dWFsIHZvaWQgT25TZWxlY3RlZFZpZGVvVHJhY2tDaGFuZ2VkKAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFUcmFjazo6SWQ+JiBzZWxlY3RlZFRyYWNrSWQpID0gMDsKLQotICAvLyBTdG9wcyB0aGUgcGlwZWxpbmUuIFRoaXMgaXMgYSBibG9ja2luZyBmdW5jdGlvbi4KLSAgLy8gSWYgdGhlIHBpcGVsaW5lIGlzIHN0YXJ0ZWQsIGl0IG11c3QgYmUgc3RvcHBlZCBiZWZvcmUgZGVzdHJveWluZyBpdC4KLSAgLy8gSXQgaXQgcGVybWlzc2libGUgdG8gY2FsbCBTdG9wKCkgYXQgYW55IHBvaW50IGR1cmluZyB0aGUgbGlmZXRpbWUgb2YgdGhlCi0gIC8vIHBpcGVsaW5lLgorICAvLyBCdWlsZCBhIHBpcGVsaW5lIHRvIHVzaW5nIHRoZSBnaXZlbiBmaWx0ZXIgY29sbGVjdGlvbiB0byBjb25zdHJ1Y3QgYSBmaWx0ZXIKKyAgLy8gY2hhaW4sIGV4ZWN1dGluZyB8c2Vla19jYnwgd2hlbiB0aGUgaW5pdGlhbCBzZWVrL3ByZXJvbGwgaGFzIGNvbXBsZXRlZC4KICAgLy8KLSAgLy8gT25jZSBTdG9wIGlzIGNhbGxlZCBhbnkgb3V0c3RhbmRpbmcgY29tcGxldGlvbiBjYWxsYmFja3MKLSAgLy8gZm9yIFN0YXJ0L1NlZWsvU3VzcGVuZC9SZXN1bWUgb3IgQ2xpZW50IG1ldGhvZHMgd2lsbCAqbm90KiBiZSBjYWxsZWQuCi0gIHZpcnR1YWwgdm9pZCBTdG9wKCkgPSAwOworICAvLyB8ZmlsdGVyX2NvbGxlY3Rpb258IG11c3QgYmUgYSBjb21wbGV0ZSBjb2xsZWN0aW9uIGNvbnRhaW5pbmcgYSBkZW11eGVyLAorICAvLyBhdWRpby92aWRlbyBkZWNvZGVycywgYW5kIGF1ZGlvL3ZpZGVvIHJlbmRlcmVycy4gRmFpbGluZyB0byBkbyBzbyB3aWxsCisgIC8vIHJlc3VsdCBpbiBhIGNyYXNoLgorICAvLworICAvLyBUaGUgZm9sbG93aW5nIHBlcm1hbmVudCBjYWxsYmFja3Mgd2lsbCBiZSBleGVjdXRlZCBhcyBmb2xsb3dzIHVwIHVudGlsCisgIC8vIFN0b3AoKSBoYXMgY29tcGxldGVkOgorICAvLyAgIHxkZWNyeXB0b3JfcmVhZHlfY2J8IGNhbiBiZSB1c2VkIGlmIFBpcGVsaW5lIG5lZWRzIHRvIGJlIG5vdGlmaWVkIHdoZW4KKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICB0aGUgRGVjcnlwdG9yIGlzIHJlYWR5LgorICAvLyAgIHxlbmRlZF9jYnwgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciB0aGUgbWVkaWEgcmVhY2hlcyB0aGUgZW5kLgorICAvLyAgIHxlcnJvcl9jYnwgd2lsbCBiZSBleGVjdXRlZCB3aGVuZXZlciBhbiBlcnJvciBvY2N1cnMgYnV0IGhhc24ndAorICAvLyAgICAgICAgICAgICAgYmVlbiByZXBvcnRlZCBhbHJlYWR5IHRocm91Z2ggYW5vdGhlciBjYWxsYmFjay4KKyAgLy8gICB8YnVmZmVyaW5nX3N0YXRlX2NifCBPcHRpb25hbCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbmV2ZXIgdGhlCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgcGlwZWxpbmUncyBidWZmZXJpbmcgc3RhdGUgY2hhbmdlcy4KKyAgLy8gICB8ZHVyYXRpb25fY2hhbmdlX2NifCBvcHRpb25hbCBjYWxsYmFjayB0aGF0IHdpbGwgYmUgZXhlY3V0ZWQgd2hlbmV2ZXIgdGhlCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgcHJlc2VudGF0aW9uIGR1cmF0aW9uIGNoYW5nZXMuCisgIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2QgYWZ0ZXIgdGhlIHBpcGVsaW5lIGhhcyBhbHJlYWR5IHN0YXJ0ZWQuCisgIHZpcnR1YWwgdm9pZCBTdGFydChEZW11eGVyKiBkZW11eGVyLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGVycm9yX2NiLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1N0YXRlQ0ImIGJ1ZmZlcmluZ19zdGF0ZV9jYiwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGR1cmF0aW9uX2NoYW5nZV9jYikgPSAwOworCisgIC8vIEFzeW5jaHJvbm91c2x5IHN0b3BzIHRoZSBwaXBlbGluZSwgZXhlY3V0aW5nIHxzdG9wX2NifCB3aGVuIHRoZSBwaXBlbGluZQorICAvLyB0ZWFyZG93biBoYXMgY29tcGxldGVkLgorICAvLworICAvLyBTdG9wKCkgbXVzdCBjb21wbGV0ZSBiZWZvcmUgZGVzdHJveWluZyB0aGUgcGlwZWxpbmUuIEl0IGl0IHBlcm1pc3NpYmxlIHRvCisgIC8vIGNhbGwgU3RvcCgpIGF0IGFueSBwb2ludCBkdXJpbmcgdGhlIGxpZmV0aW1lIG9mIHRoZSBwaXBlbGluZS4KKyAgdmlydHVhbCB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgc3RvcF9jYikgPSAwOwogCiAgIC8vIEF0dGVtcHQgdG8gc2VlayB0byB0aGUgcG9zaXRpb24gc3BlY2lmaWVkIGJ5IHRpbWUuICB8c2Vla19jYnwgd2lsbCBiZQogICAvLyBleGVjdXRlZCB3aGVuIHRoZSBhbGwgZmlsdGVycyBpbiB0aGUgcGlwZWxpbmUgaGF2ZSBwcm9jZXNzZWQgdGhlIHNlZWsuCkBAIC0xMDEsNDQgKzExOCwyNSBAQAogICAvLyBDbGllbnRzIGFyZSBleHBlY3RlZCB0byBjYWxsIEdldE1lZGlhVGltZSgpIHRvIGNoZWNrIHdoZXRoZXIgdGhlIHNlZWsKICAgLy8gc3VjY2VlZGVkLgogICAvLwotICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBwaXBlbGluZSBoYXMgbm90IHN0YXJ0ZWQgb3IKLSAgLy8gaGFzIGJlZW4gc3VzcGVuZGVkLgorICAvLyBJdCBpcyBhbiBlcnJvciB0byBjYWxsIHRoaXMgbWV0aG9kIGlmIHRoZSBwaXBlbGluZSBoYXMgbm90IHN0YXJ0ZWQuCiAgIHZpcnR1YWwgdm9pZCBTZWVrKGJhc2U6OlRpbWVEZWx0YSB0aW1lLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiKSA9IDA7CiAKLSAgLy8gU3VzcGVuZHMgdGhlIHBpcGVsaW5lLCBkaXNjYXJkaW5nIHRoZSBjdXJyZW50IHJlbmRlcmVyLgotICAvLwotICAvLyBXaGlsZSBzdXNwZW5kZWQsIEdldE1lZGlhVGltZSgpIHJldHVybnMgdGhlIHByZXNlbnRhdGlvbiB0aW1lc3RhbXAgb2YgdGhlCi0gIC8vIGxhc3QgcmVuZGVyZWQgZnJhbWUuCi0gIC8vCi0gIC8vIEl0IGlzIGFuIGVycm9yIHRvIGNhbGwgdGhpcyBtZXRob2QgaWYgdGhlIHBpcGVsaW5lIGhhcyBub3Qgc3RhcnRlZCBvciBpcwotICAvLyBzZWVraW5nLgotICB2aXJ0dWFsIHZvaWQgU3VzcGVuZChjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdXNwZW5kX2NiKSA9IDA7CisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVkaWEgaGFzIGF1ZGlvLgorICB2aXJ0dWFsIGJvb2wgSGFzQXVkaW8oKSBjb25zdCA9IDA7CiAKLSAgLy8gUmVzdW1lIHRoZSBwaXBlbGluZSB3aXRoIGEgbmV3IHJlbmRlcmVyLCBhbmQgaW5pdGlhbGl6ZSBpdCB3aXRoIGEgc2Vlay4KLSAgLy8KLSAgLy8gSXQgaXMgYW4gZXJyb3IgdG8gY2FsbCB0aGlzIG1ldGhvZCBpZiB0aGUgcGlwZWxpbmUgaGFzIG5vdCBmaW5pc2hlZAotICAvLyBzdXNwZW5kaW5nLgotICB2aXJ0dWFsIHZvaWQgUmVzdW1lKHNjb3BlZF9wdHI8UmVuZGVyZXI+IHJlbmRlcmVyLAotICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYikgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGlwZWxpbmUgaGFzIGJlZW4gc3RhcnRlZCB2aWEgU3RhcnQoKS4gIElmIElzUnVubmluZygpCi0gIC8vIHJldHVybnMgdHJ1ZSwgaXQgaXMgZXhwZWN0ZWQgdGhhdCBTdG9wKCkgd2lsbCBiZSBjYWxsZWQgYmVmb3JlIGRlc3Ryb3lpbmcKLSAgLy8gdGhlIHBpcGVsaW5lLgotICB2aXJ0dWFsIGJvb2wgSXNSdW5uaW5nKCkgY29uc3QgPSAwOworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lZGlhIGhhcyB2aWRlby4KKyAgdmlydHVhbCBib29sIEhhc1ZpZGVvKCkgY29uc3QgPSAwOwogCiAgIC8vIEdldHMgdGhlIGN1cnJlbnQgcGxheWJhY2sgcmF0ZSBvZiB0aGUgcGlwZWxpbmUuICBXaGVuIHRoZSBwaXBlbGluZSBpcwotICAvLyBzdGFydGVkLCB0aGUgcGxheWJhY2sgcmF0ZSB3aWxsIGJlIDAuMC4gIEEgcmF0ZSBvZiAxLjAgaW5kaWNhdGVzCisgIC8vIHN0YXJ0ZWQsIHRoZSBwbGF5YmFjayByYXRlIHdpbGwgYmUgMC4wZi4gIEEgcmF0ZSBvZiAxLjBmIGluZGljYXRlcwogICAvLyB0aGF0IHRoZSBwaXBlbGluZSBpcyByZW5kZXJpbmcgdGhlIG1lZGlhIGF0IHRoZSBzdGFuZGFyZCByYXRlLiAgVmFsaWQKLSAgLy8gdmFsdWVzIGZvciBwbGF5YmFjayByYXRlIGFyZSA+PSAwLjAuCi0gIHZpcnR1YWwgZG91YmxlIEdldFBsYXliYWNrUmF0ZSgpIGNvbnN0ID0gMDsKKyAgLy8gdmFsdWVzIGZvciBwbGF5YmFjayByYXRlIGFyZSA+PSAwLjBmLgorICB2aXJ0dWFsIGZsb2F0IEdldFBsYXliYWNrUmF0ZSgpIGNvbnN0ID0gMDsKIAotICAvLyBBdHRlbXB0IHRvIGFkanVzdCB0aGUgcGxheWJhY2sgcmF0ZS4gU2V0dGluZyBhIHBsYXliYWNrIHJhdGUgb2YgMC4wIHBhdXNlcwotICAvLyBhbGwgcmVuZGVyaW5nIG9mIHRoZSBtZWRpYS4gIEEgcmF0ZSBvZiAxLjAgaW5kaWNhdGVzIGEgbm9ybWFsIHBsYXliYWNrCi0gIC8vIHJhdGUuICBWYWx1ZXMgZm9yIHRoZSBwbGF5YmFjayByYXRlIG11c3QgYmUgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDAuMC4KLSAgLy8KLSAgLy8gVE9ETyhzY2hlcmt1cyk6IFdoYXQgYWJvdXQgbWF4aW11bSByYXRlPyAgRG9lcyBIVE1MNSBzcGVjaWZ5IGEgbWF4PwotICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSA9IDA7CisgIC8vIEF0dGVtcHQgdG8gYWRqdXN0IHRoZSBwbGF5YmFjayByYXRlLiBTZXR0aW5nIGEgcGxheWJhY2sgcmF0ZSBvZiAwLjBmIHBhdXNlcworICAvLyBhbGwgcmVuZGVyaW5nIG9mIHRoZSBtZWRpYS4gIEEgcmF0ZSBvZiAxLjBmIGluZGljYXRlcyBhIG5vcm1hbCBwbGF5YmFjaworICAvLyByYXRlLiAgVmFsdWVzIGZvciB0aGUgcGxheWJhY2sgcmF0ZSBtdXN0IGJlIGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byAwLjBmLgorICB2aXJ0dWFsIHZvaWQgU2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpID0gMDsKIAogICAvLyBHZXRzIHRoZSBjdXJyZW50IHZvbHVtZSBzZXR0aW5nIGJlaW5nIHVzZWQgYnkgdGhlIGF1ZGlvIHJlbmRlcmVyLiAgV2hlbgogICAvLyB0aGUgcGlwZWxpbmUgaXMgc3RhcnRlZCwgdGhpcyB2YWx1ZSB3aWxsIGJlIDEuMGYuICBWYWxpZCB2YWx1ZXMgcmFuZ2UKQEAgLTE1NSwyMSArMTUzLDI5IEBACiAgIHZpcnR1YWwgYmFzZTo6VGltZURlbHRhIEdldE1lZGlhVGltZSgpIGNvbnN0ID0gMDsKIAogICAvLyBHZXQgYXBwcm94aW1hdGUgdGltZSByYW5nZXMgb2YgYnVmZmVyZWQgbWVkaWEuCi0gIHZpcnR1YWwgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gR2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IEdldEJ1ZmZlcmVkVGltZVJhbmdlcygpID0gMDsKIAogICAvLyBHZXQgdGhlIGR1cmF0aW9uIG9mIHRoZSBtZWRpYSBpbiBtaWNyb3NlY29uZHMuICBJZiB0aGUgZHVyYXRpb24gaGFzIG5vdAogICAvLyBiZWVuIGRldGVybWluZWQgeWV0LCB0aGVuIHJldHVybnMgMC4KICAgdmlydHVhbCBiYXNlOjpUaW1lRGVsdGEgR2V0TWVkaWFEdXJhdGlvbigpIGNvbnN0ID0gMDsKIAorICAvLyBHZXRzIHRoZSBuYXR1cmFsIHNpemUgb2YgdGhlIHZpZGVvIG91dHB1dCBpbiBwaXhlbCB1bml0cy4gIElmIHRoZXJlIGlzIG5vCisgIC8vIHZpZGVvIG9yIHRoZSB2aWRlbyBoYXMgbm90IGJlZW4gcmVuZGVyZWQgeWV0LCB0aGUgd2lkdGggYW5kIGhlaWdodCB3aWxsCisgIC8vIGJlIDAuCisgIHZpcnR1YWwgdm9pZCBHZXROYXR1cmFsVmlkZW9TaXplKGdmeDo6U2l6ZSogb3V0X3NpemUpIGNvbnN0ID0gMDsKKwogICAvLyBSZXR1cm4gdHJ1ZSBpZiBsb2FkaW5nIHByb2dyZXNzIGhhcyBiZWVuIG1hZGUgc2luY2UgdGhlIGxhc3QgdGltZSB0aGlzCiAgIC8vIG1ldGhvZCB3YXMgY2FsbGVkLgotICB2aXJ0dWFsIGJvb2wgRGlkTG9hZGluZ1Byb2dyZXNzKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgRGlkTG9hZGluZ1Byb2dyZXNzKCkgY29uc3QgPSAwOwogCiAgIC8vIEdldHMgdGhlIGN1cnJlbnQgcGlwZWxpbmUgc3RhdGlzdGljcy4KICAgdmlydHVhbCBQaXBlbGluZVN0YXRpc3RpY3MgR2V0U3RhdGlzdGljcygpIGNvbnN0ID0gMDsKIAotICB2aXJ0dWFsIHZvaWQgU2V0Q2RtKENkbUNvbnRleHQqIGNkbV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENkbUF0dGFjaGVkQ0ImIGNkbV9hdHRhY2hlZF9jYikgPSAwOworICAvLyBHZXQgdGhlIFNldEJvdW5kc0NCIHVzZWQgdG8gc2V0IHRoZSBib3VuZHMgb2YgdGhlIHZpZGVvIGZyYW1lLgorICB2aXJ0dWFsIFNldEJvdW5kc0NCIEdldFNldEJvdW5kc0NCKCkgeyByZXR1cm4gU2V0Qm91bmRzQ0IoKTsgfQorCisgIC8vIFJldHVybnMgd2hldGhlciB0aGUgcGxheWVyIGlzIGNvbmZpZ3VyZWQgZm9yIG91dHB1dHRpbmcgaW4gcHVuY2ggb3V0IG1vZGUuCisgIHZpcnR1YWwgYm9vbCBJc1B1bmNoT3V0TW9kZSgpIHsgcmV0dXJuIGZhbHNlOyB9CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZV9pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmVfaW1wbC5oCmluZGV4IDQ5YzcyZDkuLjg3ZTY1N2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZV9pbXBsLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lX2ltcGwuaApAQCAtNzQsMTUgKzc0LDEyIEBACiAgIH5QaXBlbGluZUltcGwoKSBPVkVSUklERTsKIAogICAvLyBQaXBlbGluZSBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBTdGFydChEZW11eGVyKiBkZW11eGVyLAotICAgICAgICAgICAgIHNjb3BlZF9wdHI8UmVuZGVyZXI+IHJlbmRlcmVyLAotICAgICAgICAgICAgIENsaWVudCogY2xpZW50LAorICB2b2lkIFN0YXJ0KERlbXV4ZXIqIGRlbXV4ZXIsIHNjb3BlZF9wdHI8UmVuZGVyZXI+IHJlbmRlcmVyLCBDbGllbnQqIGNsaWVudCwKICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzZWVrX2NiKSBPVkVSUklERTsKICAgdm9pZCBTdG9wKCkgT1ZFUlJJREU7CiAgIHZvaWQgU2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYikgT1ZFUlJJREU7CiAgIHZvaWQgU3VzcGVuZChjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBzdXNwZW5kX2NiKSBPVkVSUklERTsKLSAgdm9pZCBSZXN1bWUoc2NvcGVkX3B0cjxSZW5kZXJlcj4gcmVuZGVyZXIsCi0gICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lLAorICB2b2lkIFJlc3VtZShzY29wZWRfcHRyPFJlbmRlcmVyPiByZW5kZXJlciwgYmFzZTo6VGltZURlbHRhIHRpbWUsCiAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHNlZWtfY2IpIE9WRVJSSURFOwogICBib29sIElzUnVubmluZygpIGNvbnN0IE9WRVJSSURFOwogICBkb3VibGUgR2V0UGxheWJhY2tSYXRlKCkgY29uc3QgT1ZFUlJJREU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvcmFuZ2VzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvcmFuZ2VzLmgKaW5kZXggZTM5YzU2Yy4uZjdmNTZiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3Jhbmdlcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9yYW5nZXMuaApAQCAtNTYsNyArNTYsNyBAQAogLy8gRVZFUllUSElORyBCRUxPVyBIRVJFIElTIElNUExFTUVOVEFUSU9OIERFVEFJTCEhCiAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKLXRlbXBsYXRlPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIHNpemVfdCBSYW5nZXM8VD46OkFkZChUIHN0YXJ0LCBUIGVuZCkgewogICBpZiAoc3RhcnQgPT0gZW5kKSAgLy8gTm90aGluZyB0byBiZSBkb25lIHdpdGggZW1wdHkgcmFuZ2VzLgogICAgIHJldHVybiByYW5nZXNfLnNpemUoKTsKQEAgLTg3LDEwICs4Nyw4IEBACiAgIC8vIGFuZCB0aGUgZXhpc3RpbmcgcmFuZ2VzLgogCiAgIC8vIE5vdzogc3RhcnQgPD0gaS0+c2Vjb25kICYmIGktPmZpcnN0IDw9IGVuZAotICBpZiAoc3RhcnQgPCByYW5nZXNfW2ldLmZpcnN0KQotICAgIHJhbmdlc19baV0uZmlyc3QgPSBzdGFydDsKLSAgaWYgKHJhbmdlc19baV0uc2Vjb25kIDwgZW5kKQotICAgIHJhbmdlc19baV0uc2Vjb25kID0gZW5kOworICBpZiAoc3RhcnQgPCByYW5nZXNfW2ldLmZpcnN0KSByYW5nZXNfW2ldLmZpcnN0ID0gc3RhcnQ7CisgIGlmIChyYW5nZXNfW2ldLnNlY29uZCA8IGVuZCkgcmFuZ2VzX1tpXS5zZWNvbmQgPSBlbmQ7CiAKICAgLy8gTm93OiBbc3RhcnQsZW5kKSBpcyBjb250YWluZWQgaW4gdGhlIGkndGggcmFuZ2UsIGFuZCB3ZSdkIGJlIGRvbmUsIGV4Y2VwdAogICAvLyBmb3IgdGhlIGZhY3QgdGhhdCB0aGUgbmV3bHktZXh0ZW5kZWQgaSd0aCByYW5nZSBtaWdodCBub3cgb3ZlcmxhcApAQCAtMTA2LDM3ICsxMDQsMzYgQEAKICAgcmV0dXJuIHJhbmdlc18uc2l6ZSgpOwogfQogCi10ZW1wbGF0ZTw+Ci1NRURJQV9FWFBPUlQgdm9pZAotICAgIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+OjpEQ2hlY2tMVChjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGxocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiByaHMpIGNvbnN0OwordGVtcGxhdGUgPD4KK01FRElBX0VYUE9SVCB2b2lkIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+OjpEQ2hlY2tMVCgKKyAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGxocywgY29uc3QgYmFzZTo6VGltZURlbHRhJiByaHMpIGNvbnN0OwogCi10ZW1wbGF0ZTxjbGFzcyBUPgordGVtcGxhdGUgPGNsYXNzIFQ+CiB2b2lkIFJhbmdlczxUPjo6RENoZWNrTFQoY29uc3QgVCYgbGhzLCBjb25zdCBUJiByaHMpIGNvbnN0IHsKICAgRENIRUNLX0xUKGxocywgcmhzKTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogc2l6ZV90IFJhbmdlczxUPjo6c2l6ZSgpIGNvbnN0IHsKICAgcmV0dXJuIHJhbmdlc18uc2l6ZSgpOwogfQogCi10ZW1wbGF0ZTxjbGFzcyBUPgordGVtcGxhdGUgPGNsYXNzIFQ+CiBUIFJhbmdlczxUPjo6c3RhcnQoc2l6ZV90IGkpIGNvbnN0IHsKICAgcmV0dXJuIHJhbmdlc19baV0uZmlyc3Q7CiB9CiAKLXRlbXBsYXRlPGNsYXNzIFQ+Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KIFQgUmFuZ2VzPFQ+OjplbmQoc2l6ZV90IGkpIGNvbnN0IHsKICAgcmV0dXJuIHJhbmdlc19baV0uc2Vjb25kOwogfQogCi10ZW1wbGF0ZTxjbGFzcyBUPgordGVtcGxhdGUgPGNsYXNzIFQ+CiB2b2lkIFJhbmdlczxUPjo6Y2xlYXIoKSB7CiAgIHJhbmdlc18uY2xlYXIoKTsKIH0KIAotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogUmFuZ2VzPFQ+IFJhbmdlczxUPjo6SW50ZXJzZWN0aW9uV2l0aChjb25zdCBSYW5nZXM8VD4mIG90aGVyKSBjb25zdCB7CiAgIFJhbmdlczxUPiByZXN1bHQ7CiAKQEAgLTE0OCw4ICsxNDUsNyBAQAogICAgIFQgbWluX2VuZCA9IHN0ZDo6bWluKGVuZChpKSwgb3RoZXIuZW5kKGopKTsKIAogICAgIC8vIEFkZCBhbiBpbnRlcnNlY3Rpb24gcmFuZ2UgdG8gdGhlIHJlc3VsdCBpZiB0aGUgcmFuZ2VzIG92ZXJsYXAuCi0gICAgaWYgKG1heF9zdGFydCA8IG1pbl9lbmQpCi0gICAgICByZXN1bHQuQWRkKG1heF9zdGFydCwgbWluX2VuZCk7CisgICAgaWYgKG1heF9zdGFydCA8IG1pbl9lbmQpIHJlc3VsdC5BZGQobWF4X3N0YXJ0LCBtaW5fZW5kKTsKIAogICAgIGlmIChlbmQoaSkgPCBvdGhlci5lbmQoaikpCiAgICAgICArK2k7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwZDBhYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5jYwpAQCAtMCwwICsxLDgyNyBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvYmFzaWN0eXBlcy5oIiAgLy8gRm9yIENPTVBJTEVfQVNTRVJUCisjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFja19oZWxwZXJzLmgiCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCisjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vbG9jay5oIgorI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL3dhaXRhYmxlX2V2ZW50LmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvYXVkaW9fZGVjb2Rlcl9jb25maWcuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9iaW5kX3RvX2N1cnJlbnRfbG9vcC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2NoYW5uZWxfbGF5b3V0LmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZGVtdXhlcl9zdHJlYW0uaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9leHBvcnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3Jhbmdlcy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3NldF9ib3VuZHNfaGVscGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCisjaW5jbHVkZSAidWkvZ2Z4L3NpemUuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworI2lmIFNCX0hBUyhQTEFZRVIpCisKK3VzaW5nIGJhc2U6OlRpbWU7Cit1c2luZyBiYXNlOjpUaW1lRGVsdGE7CisKK25hbWVzcGFjZSB7CisKKy8vIFVzZWQgdG8gcG9zdCBwYXJhbWV0ZXJzIHRvIFNiUGxheWVyUGlwZWxpbmU6OlN0YXJ0VGFzaygpIGFzIHRoZSBudW1iZXIgb2YKKy8vIHBhcmFtZXRlcnMgZXhjZWVkIHdoYXQgYmFzZTo6QmluZCgpIGNhbiBzdXBwb3J0Lgorc3RydWN0IFN0YXJ0VGFza1BhcmFtZXRlcnMgeworICBEZW11eGVyKiBkZW11eGVyOworICBQaXBlbGluZVN0YXR1c0NCIGVuZGVkX2NiOworICBQaXBlbGluZVN0YXR1c0NCIGVycm9yX2NiOworICBQaXBlbGluZVN0YXR1c0NCIHNlZWtfY2I7CisgIFBpcGVsaW5lOjpCdWZmZXJpbmdTdGF0ZUNCIGJ1ZmZlcmluZ19zdGF0ZV9jYjsKKyAgYmFzZTo6Q2xvc3VyZSBkdXJhdGlvbl9jaGFuZ2VfY2I7Cit9OworCisvLyBTYlBsYXllclBpcGVsaW5lIGlzIGEgUGlwZWxpbmVCYXNlIGltcGxlbWVudGF0aW9uIHRoYXQgdXNlcyB0aGUgU2JQbGF5ZXIKKy8vIGludGVyZmFjZSBpbnRlcm5hbGx5LgorY2xhc3MgTUVESUFfRVhQT1JUIFNiUGxheWVyUGlwZWxpbmUgOiBwdWJsaWMgUGlwZWxpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1YmxpYyBEZW11eGVySG9zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIFN0YXJib2FyZFBsYXllcjo6SG9zdCB7CisgcHVibGljOgorICAvLyBDb25zdHJ1Y3RzIGEgbWVkaWEgcGlwZWxpbmUgdGhhdCB3aWxsIGV4ZWN1dGUgb24gfG1lc3NhZ2VfbG9vcHwuCisgIFNiUGxheWVyUGlwZWxpbmUoUGlwZWxpbmVXaW5kb3cgd2luZG93LAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKKyAgICAgICAgICAgICAgICAgICBNZWRpYUxvZyogbWVkaWFfbG9nKTsKKyAgflNiUGxheWVyUGlwZWxpbmUoKSBPVkVSUklERTsKKworICB2b2lkIFN1c3BlbmQoKSBPVkVSUklERTsKKyAgdm9pZCBSZXN1bWUoKSBPVkVSUklERTsKKyAgdm9pZCBTdGFydChEZW11eGVyKiBkZW11eGVyLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwKKyAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlcnJvcl9jYiwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYiwKKyAgICAgICAgICAgICBjb25zdCBCdWZmZXJpbmdTdGF0ZUNCJiBidWZmZXJpbmdfc3RhdGVfY2IsCisgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZHVyYXRpb25fY2hhbmdlX2NiKSBPVkVSUklERTsKKworICB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgc3RvcF9jYikgT1ZFUlJJREU7CisgIHZvaWQgU2VlayhUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYik7CisgIGJvb2wgSGFzQXVkaW8oKSBjb25zdCBPVkVSUklERTsKKyAgYm9vbCBIYXNWaWRlbygpIGNvbnN0IE9WRVJSSURFOworCisgIGZsb2F0IEdldFBsYXliYWNrUmF0ZSgpIGNvbnN0IE9WRVJSSURFOworICB2b2lkIFNldFBsYXliYWNrUmF0ZShmbG9hdCBwbGF5YmFja19yYXRlKSBPVkVSUklERTsKKyAgZmxvYXQgR2V0Vm9sdW1lKCkgY29uc3QgT1ZFUlJJREU7CisgIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgT1ZFUlJJREU7CisKKyAgVGltZURlbHRhIEdldE1lZGlhVGltZSgpIGNvbnN0IE9WRVJSSURFOworICBSYW5nZXM8VGltZURlbHRhPiBHZXRCdWZmZXJlZFRpbWVSYW5nZXMoKSBPVkVSUklERTsKKyAgVGltZURlbHRhIEdldE1lZGlhRHVyYXRpb24oKSBjb25zdCBPVkVSUklERTsKKyAgdm9pZCBHZXROYXR1cmFsVmlkZW9TaXplKGdmeDo6U2l6ZSogb3V0X3NpemUpIGNvbnN0IE9WRVJSSURFOworCisgIGJvb2wgRGlkTG9hZGluZ1Byb2dyZXNzKCkgY29uc3QgT1ZFUlJJREU7CisgIFBpcGVsaW5lU3RhdGlzdGljcyBHZXRTdGF0aXN0aWNzKCkgY29uc3QgT1ZFUlJJREU7CisgIFNldEJvdW5kc0NCIEdldFNldEJvdW5kc0NCKCkgT1ZFUlJJREU7CisKKyAgYm9vbCBJc1B1bmNoT3V0TW9kZSgpIE9WRVJSSURFOworCisgcHJpdmF0ZToKKyAgdm9pZCBTdGFydFRhc2soY29uc3QgU3RhcnRUYXNrUGFyYW1ldGVycyYgcGFyYW1ldGVycyk7CisgIHZvaWQgU2V0Vm9sdW1lVGFzayhmbG9hdCB2b2x1bWUpOworICB2b2lkIFNldFBsYXliYWNrUmF0ZVRhc2soZmxvYXQgdm9sdW1lKTsKKyAgdm9pZCBTZXREdXJhdGlvblRhc2soVGltZURlbHRhIGR1cmF0aW9uKTsKKworICAvLyBEZW11eGVySG9zdCBpbXBsZW1lbnRhaW9uLgorICB2b2lkIE9uQnVmZmVyZWRUaW1lUmFuZ2VzQ2hhbmdlZCgKKyAgICAgIGNvbnN0IFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+JiByYW5nZXMpIE9WRVJSSURFOworICB2b2lkIFNldER1cmF0aW9uKFRpbWVEZWx0YSBkdXJhdGlvbikgT1ZFUlJJREU7CisgIHZvaWQgT25EZW11eGVyRXJyb3IoUGlwZWxpbmVTdGF0dXMgZXJyb3IpIE9WRVJSSURFOworICB2b2lkIEFkZFRleHRTdHJlYW0oRGVtdXhlclN0cmVhbSogdGV4dF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBUZXh0VHJhY2tDb25maWcmIGNvbmZpZykgT1ZFUlJJREU7CisgIHZvaWQgUmVtb3ZlVGV4dFN0cmVhbShEZW11eGVyU3RyZWFtKiB0ZXh0X3N0cmVhbSkgT1ZFUlJJREU7CisKKyAgdm9pZCBDcmVhdGVQbGF5ZXIoU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7CisgIHZvaWQgU2V0RGVjcnlwdG9yKERlY3J5cHRvciogZGVjcnlwdG9yKTsKKyAgdm9pZCBPbkRlbXV4ZXJJbml0aWFsaXplZChQaXBlbGluZVN0YXR1cyBzdGF0dXMpOworICB2b2lkIE9uRGVtdXhlclNlZWtlZChQaXBlbGluZVN0YXR1cyBzdGF0dXMpOworICB2b2lkIE9uRGVtdXhlclN0b3BwZWQoKTsKKyAgdm9pZCBPbkRlbXV4ZXJTdHJlYW1SZWFkKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIERlbXV4ZXJTdHJlYW06OlN0YXR1cyBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpOworCisgIC8vIFN0YXJib2FyZFBsYXllcjo6SG9zdCBpbXBsZW1lbnRhdGlvbi4KKyAgdm9pZCBPbk5lZWREYXRhKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgT1ZFUlJJREU7CisgIHZvaWQgT25QbGF5ZXJTdGF0dXMoU2JQbGF5ZXJTdGF0ZSBzdGF0ZSkgT1ZFUlJJREU7CisKKyAgdm9pZCBVcGRhdGVEZWNvZGVyQ29uZmlnKERlbXV4ZXJTdHJlYW0qIHN0cmVhbSk7CisKKyAgdm9pZCBTdXNwZW5kVGFzayhiYXNlOjpXYWl0YWJsZUV2ZW50KiBkb25lX2V2ZW50KTsKKyAgdm9pZCBSZXN1bWVUYXNrKGJhc2U6OldhaXRhYmxlRXZlbnQqIGRvbmVfZXZlbnQpOworCisgIC8vIE1lc3NhZ2UgbG9vcCB1c2VkIHRvIGV4ZWN1dGUgcGlwZWxpbmUgdGFza3MuICBJdCBpcyB0aHJlYWQtc2FmZS4KKyAgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZXNzYWdlX2xvb3BfOworCisgIC8vIFRoZSB3aW5kb3cgdGhpcyBwbGF5ZXIgYXNzb2NpYXRlcyB3aXRoLiAgSXQgc2hvdWxkIG9ubHkgYmUgYXNzaWduZWQgaW4gdGhlCisgIC8vIGR0b3IgYW5kIGFjY2VzZWQgb25jZSBieSBTYlBsYXllckNyZWF0ZSgpLgorICBQaXBlbGluZVdpbmRvdyB3aW5kb3dfOworCisgIC8vIExvY2sgdXNlZCB0byBzZXJpYWxpemUgYWNjZXNzIGZvciB0aGUgZm9sbG93aW5nIG1lbWJlciB2YXJpYWJsZXMuCisgIG11dGFibGUgYmFzZTo6TG9jayBsb2NrXzsKKworICAvLyBBbW91bnQgb2YgYXZhaWxhYmxlIGJ1ZmZlcmVkIGRhdGEuICBTZXQgYnkgZmlsdGVycy4KKyAgUmFuZ2VzPGludDY0PiBidWZmZXJlZF9ieXRlX3Jhbmdlc187CisgIFJhbmdlczxUaW1lRGVsdGE+IGJ1ZmZlcmVkX3RpbWVfcmFuZ2VzXzsKKworICAvLyBUcnVlIHdoZW4gQWRkQnVmZmVyZWRCeXRlUmFuZ2UoKSBoYXMgYmVlbiBjYWxsZWQgbW9yZSByZWNlbnRseSB0aGFuCisgIC8vIERpZExvYWRpbmdQcm9ncmVzcygpLgorICBtdXRhYmxlIGJvb2wgZGlkX2xvYWRpbmdfcHJvZ3Jlc3NfOworCisgIC8vIFZpZGVvJ3MgbmF0dXJhbCB3aWR0aCBhbmQgaGVpZ2h0LiAgU2V0IGJ5IGZpbHRlcnMuCisgIGdmeDo6U2l6ZSBuYXR1cmFsX3NpemVfOworCisgIC8vIEN1cnJlbnQgdm9sdW1lIGxldmVsIChmcm9tIDAuMGYgdG8gMS4wZikuICBUaGlzIHZhbHVlIGlzIHNldCBpbW1lZGlhdGVseQorICAvLyB2aWEgU2V0Vm9sdW1lKCkgYW5kIGEgdGFzayBpcyBkaXNwYXRjaGVkIG9uIHRoZSBtZXNzYWdlIGxvb3AgdG8gbm90aWZ5IHRoZQorICAvLyBmaWx0ZXJzLgorICBmbG9hdCB2b2x1bWVfOworCisgIC8vIEN1cnJlbnQgcGxheWJhY2sgcmF0ZSAoPj0gMC4wZikuICBUaGlzIHZhbHVlIGlzIHNldCBpbW1lZGlhdGVseSB2aWEKKyAgLy8gU2V0UGxheWJhY2tSYXRlKCkgYW5kIGEgdGFzayBpcyBkaXNwYXRjaGVkIG9uIHRoZSBtZXNzYWdlIGxvb3AgdG8gbm90aWZ5CisgIC8vIHRoZSBmaWx0ZXJzLgorICBmbG9hdCBwbGF5YmFja19yYXRlXzsKKworICAvLyBXaGV0aGVyIHRoZSBtZWRpYSBjb250YWlucyByZW5kZXJlZCBhdWRpbyBhbmQgdmlkZW8gc3RyZWFtcy4KKyAgLy8gVE9ETyhmaXNjaG1hbixzY2hlcmt1cyk6IHJlcGxhY2UgdGhlc2Ugd2l0aCBjaGVja3MgZm9yCisgIC8vIHthdWRpbyx2aWRlb31fZGVjb2Rlcl8gb25jZSBleHRyYWN0aW9uIG9mIHtBdWRpbyxWaWRlb31EZWNvZGVyIGZyb20gdGhlCisgIC8vIEZpbHRlciBoZWlyYXJjaHkgaXMgZG9uZS4KKyAgYm9vbCBoYXNfYXVkaW9fOworICBib29sIGhhc192aWRlb187CisKKyAgbXV0YWJsZSBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdGlzdGljc187CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGFyZSBvbmx5IGFjY2Vzc2VkIGJ5IHRhc2tzIHBvc3RlZCB0bworICAvLyB8bWVzc2FnZV9sb29wX3wuCisKKyAgLy8gVGVtcG9yYXJ5IGNhbGxiYWNrIHVzZWQgZm9yIFN0b3AoKS4KKyAgYmFzZTo6Q2xvc3VyZSBzdG9wX2NiXzsKKworICAvLyBQZXJtYW5lbnQgY2FsbGJhY2tzIHBhc3NlZCBpbiB2aWEgU3RhcnQoKS4KKyAgUGlwZWxpbmVTdGF0dXNDQiBlbmRlZF9jYl87CisgIFBpcGVsaW5lU3RhdHVzQ0IgZXJyb3JfY2JfOworICBCdWZmZXJpbmdTdGF0ZUNCIGJ1ZmZlcmluZ19zdGF0ZV9jYl87CisgIGJhc2U6OkNsb3N1cmUgZHVyYXRpb25fY2hhbmdlX2NiXzsKKworICAvLyBEZW11eGVyIHJlZmVyZW5jZSB1c2VkIGZvciBzZXR0aW5nIHRoZSBwcmVsb2FkIHZhbHVlLgorICBEZW11eGVyKiBkZW11eGVyXzsKKyAgYm9vbCBhdWRpb19yZWFkX2luX3Byb2dyZXNzXzsKKyAgYm9vbCB2aWRlb19yZWFkX2luX3Byb2dyZXNzXzsKKyAgVGltZURlbHRhIGR1cmF0aW9uXzsKKworICBzY29wZWRfcmVmcHRyPFNiUGxheWVyU2V0Qm91bmRzSGVscGVyPiBzZXRfYm91bmRzX2hlbHBlcl87CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZW1iZXIgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIFdNUEkgdGhyZWFkIGJ1dCBhbGwKKyAgLy8gbW9kaWZpY2F0aW9ucyB0byB0aGVtIGhhcHBlbnMgb24gdGhlIHBpcGVsaW5lIHRocmVhZC4gIFNvIGFueSBhY2Nlc3Mgb2YKKyAgLy8gdGhlbSBmcm9tIHRoZSBXTVBJIHRocmVhZCBhbmQgYW55IG1vZGlmaWNhdGlvbiB0byB0aGVtIG9uIHRoZSBwaXBlbGluZQorICAvLyB0aHJlYWQgaGFzIHRvIGd1YXJkZWQgYnkgbG9jay4gIEFjY2VzcyB0byB0aGVtIGZyb20gdGhlIHBpcGVsaW5lIHRocmVhZAorICAvLyBuZWVkbid0IHRvIGJlIGd1YXJkZWQuCisKKyAgLy8gVGVtcG9yYXJ5IGNhbGxiYWNrIHVzZWQgZm9yIFN0YXJ0KCkgYW5kIFNlZWsoKS4KKyAgUGlwZWxpbmVTdGF0dXNDQiBzZWVrX2NiXzsKKyAgYmFzZTo6VGltZURlbHRhIHNlZWtfdGltZV87CisgIHNjb3BlZF9wdHI8U3RhcmJvYXJkUGxheWVyPiBwbGF5ZXJfOworICBib29sIHN1c3BlbmRlZF87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNiUGxheWVyUGlwZWxpbmUpOworfTsKKworU2JQbGF5ZXJQaXBlbGluZTo6U2JQbGF5ZXJQaXBlbGluZSgKKyAgICBQaXBlbGluZVdpbmRvdyB3aW5kb3csCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAorICAgIE1lZGlhTG9nKiBtZWRpYV9sb2cpCisgICAgOiB3aW5kb3dfKHdpbmRvdyksCisgICAgICBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCisgICAgICBuYXR1cmFsX3NpemVfKDAsIDApLAorICAgICAgdm9sdW1lXygxLmYpLAorICAgICAgcGxheWJhY2tfcmF0ZV8oMC5mKSwKKyAgICAgIGhhc19hdWRpb18oZmFsc2UpLAorICAgICAgaGFzX3ZpZGVvXyhmYWxzZSksCisgICAgICBkZW11eGVyXyhOVUxMKSwKKyAgICAgIGF1ZGlvX3JlYWRfaW5fcHJvZ3Jlc3NfKGZhbHNlKSwKKyAgICAgIHZpZGVvX3JlYWRfaW5fcHJvZ3Jlc3NfKGZhbHNlKSwKKyAgICAgIHNldF9ib3VuZHNfaGVscGVyXyhuZXcgU2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXIpLAorICAgICAgc3VzcGVuZGVkXyhmYWxzZSkge30KKworU2JQbGF5ZXJQaXBlbGluZTo6flNiUGxheWVyUGlwZWxpbmUoKSB7IERDSEVDSyghcGxheWVyXyk7IH0KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpTdXNwZW5kKCkgeworICBEQ0hFQ0soIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgYmFzZTo6V2FpdGFibGVFdmVudCB3YWl0YWJsZV9ldmVudCh0cnVlLCAvKiBtYW51YWxfcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsbHlfc2lnbmFsZWQgKi8pOworICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlN1c3BlbmRUYXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcyksICZ3YWl0YWJsZV9ldmVudCkpOworICB3YWl0YWJsZV9ldmVudC5XYWl0KCk7Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6UmVzdW1lKCkgeworICBEQ0hFQ0soIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgYmFzZTo6V2FpdGFibGVFdmVudCB3YWl0YWJsZV9ldmVudCh0cnVlLCAvKiBtYW51YWxfcmVzZXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpbml0aWFsbHlfc2lnbmFsZWQgKi8pOworICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzayhGUk9NX0hFUkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlJlc3VtZVRhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgJndhaXRhYmxlX2V2ZW50KSk7CisgIHdhaXRhYmxlX2V2ZW50LldhaXQoKTsKK30KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpTdGFydChEZW11eGVyKiBkZW11eGVyLCBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBlbmRlZF9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZXJyb3JfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHNlZWtfY2IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlcmluZ1N0YXRlQ0ImIGJ1ZmZlcmluZ19zdGF0ZV9jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgZHVyYXRpb25fY2hhbmdlX2NiKSB7CisgIERDSEVDSyhkZW11eGVyKTsKKyAgRENIRUNLKCFlbmRlZF9jYi5pc19udWxsKCkpOworICBEQ0hFQ0soIWVycm9yX2NiLmlzX251bGwoKSk7CisgIERDSEVDSyghc2Vla19jYi5pc19udWxsKCkpOworICBEQ0hFQ0soIWJ1ZmZlcmluZ19zdGF0ZV9jYi5pc19udWxsKCkpOworICBEQ0hFQ0soIWR1cmF0aW9uX2NoYW5nZV9jYi5pc19udWxsKCkpOworCisgIFN0YXJ0VGFza1BhcmFtZXRlcnMgcGFyYW1ldGVyczsKKyAgcGFyYW1ldGVycy5kZW11eGVyID0gZGVtdXhlcjsKKyAgcGFyYW1ldGVycy5lbmRlZF9jYiA9IGVuZGVkX2NiOworICBwYXJhbWV0ZXJzLmVycm9yX2NiID0gZXJyb3JfY2I7CisgIHBhcmFtZXRlcnMuc2Vla19jYiA9IHNlZWtfY2I7CisgIHBhcmFtZXRlcnMuYnVmZmVyaW5nX3N0YXRlX2NiID0gYnVmZmVyaW5nX3N0YXRlX2NiOworICBwYXJhbWV0ZXJzLmR1cmF0aW9uX2NoYW5nZV9jYiA9IGR1cmF0aW9uX2NoYW5nZV9jYjsKKworICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU2JQbGF5ZXJQaXBlbGluZTo6U3RhcnRUYXNrLCB0aGlzLCBwYXJhbWV0ZXJzKSk7Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U3RvcChjb25zdCBiYXNlOjpDbG9zdXJlJiBzdG9wX2NiKSB7CisgIGlmICghbWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7CisgICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlN0b3AsIHRoaXMsIHN0b3BfY2IpKTsKKyAgICByZXR1cm47CisgIH0KKworICBEQ0hFQ0soc3RvcF9jYl8uaXNfbnVsbCgpKTsKKyAgRENIRUNLKCFzdG9wX2NiLmlzX251bGwoKSk7CisKKyAgaWYgKHBsYXllcl8pIHsKKyAgICBzY29wZWRfcHRyPFN0YXJib2FyZFBsYXllcj4gcGxheWVyOworICAgIHsKKyAgICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgICAgICBwbGF5ZXIgPSBwbGF5ZXJfLlBhc3MoKTsKKyAgICB9CisKKyAgICBETE9HKElORk8pIDw8ICJEZXN0cm95aW5nIFNiUGxheWVyLiI7CisgICAgcGxheWVyLnJlc2V0KCk7CisgICAgRExPRyhJTkZPKSA8PCAiU2JQbGF5ZXIgZGVzdHJveWVkLiI7CisgIH0KKworICAvLyBXaGVuIFN0b3AoKSBpcyBpbiBwcm9ncmVzcywgd2Ugbm8gbG9uZ2VyIG5lZWQgdG8gY2FsbCB8ZXJyb3JfY2JffC4KKyAgZXJyb3JfY2JfLlJlc2V0KCk7CisgIGlmIChkZW11eGVyXykgeworICAgIHN0b3BfY2JfID0gc3RvcF9jYjsKKyAgICBkZW11eGVyXy0+U3RvcCgpOworICAgIE9uRGVtdXhlclN0b3BwZWQoKTsKKyAgfSBlbHNlIHsKKyAgICBzdG9wX2NiLlJ1bigpOworICB9Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U2VlayhUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc2Vla19jYikgeworICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlNlZWssIHRoaXMsIHRpbWUsIHNlZWtfY2IpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIXBsYXllcl8pIHsKKyAgICBzZWVrX2NiLlJ1bihQSVBFTElORV9FUlJPUl9JTlZBTElEX1NUQVRFKTsKKyAgfQorCisgIHBsYXllcl8tPlByZXBhcmVGb3JTZWVrKCk7CisKKyAgRENIRUNLKHNlZWtfY2JfLmlzX251bGwoKSk7CisgIERDSEVDSyghc2Vla19jYi5pc19udWxsKCkpOworCisgIGlmIChhdWRpb19yZWFkX2luX3Byb2dyZXNzXyB8fCB2aWRlb19yZWFkX2luX3Byb2dyZXNzXykgeworICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlNlZWssIHRoaXMsIHRpbWUsIHNlZWtfY2IpKTsKKyAgICByZXR1cm47CisgIH0KKworICB7CisgICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgICBzZWVrX2NiXyA9IHNlZWtfY2I7CisgICAgc2Vla190aW1lXyA9IHRpbWU7CisgIH0KKyAgZGVtdXhlcl8tPlNlZWsodGltZSwgQmluZFRvQ3VycmVudExvb3AoYmFzZTo6QmluZCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZTYlBsYXllclBpcGVsaW5lOjpPbkRlbXV4ZXJTZWVrZWQsIHRoaXMpKSk7Cit9CisKK2Jvb2wgU2JQbGF5ZXJQaXBlbGluZTo6SGFzQXVkaW8oKSBjb25zdCB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIHJldHVybiBoYXNfYXVkaW9fOworfQorCitib29sIFNiUGxheWVyUGlwZWxpbmU6Okhhc1ZpZGVvKCkgY29uc3QgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICByZXR1cm4gaGFzX3ZpZGVvXzsKK30KKworZmxvYXQgU2JQbGF5ZXJQaXBlbGluZTo6R2V0UGxheWJhY2tSYXRlKCkgY29uc3QgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICByZXR1cm4gcGxheWJhY2tfcmF0ZV87Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpIHsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgcGxheWJhY2tfcmF0ZV8gPSBwbGF5YmFja19yYXRlOworICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlNldFBsYXliYWNrUmF0ZVRhc2ssIHRoaXMsIHBsYXliYWNrX3JhdGUpKTsKK30KKworZmxvYXQgU2JQbGF5ZXJQaXBlbGluZTo6R2V0Vm9sdW1lKCkgY29uc3QgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICByZXR1cm4gdm9sdW1lXzsKK30KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpTZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CisgIGlmICh2b2x1bWUgPCAwLjBmIHx8IHZvbHVtZSA+IDEuMGYpIHJldHVybjsKKworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICB2b2x1bWVfID0gdm9sdW1lOworICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU2JQbGF5ZXJQaXBlbGluZTo6U2V0Vm9sdW1lVGFzaywgdGhpcywgdm9sdW1lKSk7Cit9CisKK1RpbWVEZWx0YSBTYlBsYXllclBpcGVsaW5lOjpHZXRNZWRpYVRpbWUoKSBjb25zdCB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisKKyAgaWYgKCFzZWVrX2NiXy5pc19udWxsKCkpIHsKKyAgICByZXR1cm4gc2Vla190aW1lXzsKKyAgfQorICBpZiAoIXBsYXllcl8pIHsKKyAgICByZXR1cm4gVGltZURlbHRhKCk7CisgIH0KKyAgYmFzZTo6VGltZURlbHRhIG1lZGlhX3RpbWU7CisgIHBsYXllcl8tPkdldEluZm8oJnN0YXRpc3RpY3NfLnZpZGVvX2ZyYW1lc19kZWNvZGVkLAorICAgICAgICAgICAgICAgICAgICZzdGF0aXN0aWNzXy52aWRlb19mcmFtZXNfZHJvcHBlZCwgJm1lZGlhX3RpbWUpOworICByZXR1cm4gbWVkaWFfdGltZTsKK30KKworUmFuZ2VzPFRpbWVEZWx0YT4gU2JQbGF5ZXJQaXBlbGluZTo6R2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICBSYW5nZXM8VGltZURlbHRhPiB0aW1lX3JhbmdlczsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBidWZmZXJlZF90aW1lX3Jhbmdlc18uc2l6ZSgpOyArK2kpIHsKKyAgICB0aW1lX3Jhbmdlcy5BZGQoYnVmZmVyZWRfdGltZV9yYW5nZXNfLnN0YXJ0KGkpLAorICAgICAgICAgICAgICAgICAgICBidWZmZXJlZF90aW1lX3Jhbmdlc18uZW5kKGkpKTsKKyAgfQorICBOT1RJTVBMRU1FTlRFRCgpOworICAvKmlmIChjbG9ja18tPkR1cmF0aW9uKCkgPT0gVGltZURlbHRhKCkgfHwgdG90YWxfYnl0ZXNfID09IDApCisgICAgcmV0dXJuIHRpbWVfcmFuZ2VzOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGJ1ZmZlcmVkX2J5dGVfcmFuZ2VzXy5zaXplKCk7ICsraSkgeworICAgIFRpbWVEZWx0YSBzdGFydCA9IFRpbWVGb3JCeXRlT2Zmc2V0X0xvY2tlZChidWZmZXJlZF9ieXRlX3Jhbmdlc18uc3RhcnQoaSkpOworICAgIFRpbWVEZWx0YSBlbmQgPSBUaW1lRm9yQnl0ZU9mZnNldF9Mb2NrZWQoYnVmZmVyZWRfYnl0ZV9yYW5nZXNfLmVuZChpKSk7CisgICAgLy8gQ2FwIGFwcHJveGltYXRlZCBidWZmZXJlZCB0aW1lIGF0IHRoZSBsZW5ndGggb2YgdGhlIHZpZGVvLgorICAgIGVuZCA9IHN0ZDo6bWluKGVuZCwgY2xvY2tfLT5EdXJhdGlvbigpKTsKKyAgICB0aW1lX3Jhbmdlcy5BZGQoc3RhcnQsIGVuZCk7CisgIH0qLworCisgIHJldHVybiB0aW1lX3JhbmdlczsKK30KKworVGltZURlbHRhIFNiUGxheWVyUGlwZWxpbmU6OkdldE1lZGlhRHVyYXRpb24oKSBjb25zdCB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIHJldHVybiBkdXJhdGlvbl87Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6R2V0TmF0dXJhbFZpZGVvU2l6ZShnZng6OlNpemUqIG91dF9zaXplKSBjb25zdCB7CisgIENIRUNLKG91dF9zaXplKTsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgKm91dF9zaXplID0gbmF0dXJhbF9zaXplXzsKK30KKworYm9vbCBTYlBsYXllclBpcGVsaW5lOjpEaWRMb2FkaW5nUHJvZ3Jlc3MoKSBjb25zdCB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIGJvb2wgcmV0ID0gZGlkX2xvYWRpbmdfcHJvZ3Jlc3NfOworICBkaWRfbG9hZGluZ19wcm9ncmVzc18gPSBmYWxzZTsKKyAgcmV0dXJuIHJldDsKK30KKworUGlwZWxpbmVTdGF0aXN0aWNzIFNiUGxheWVyUGlwZWxpbmU6OkdldFN0YXRpc3RpY3MoKSBjb25zdCB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIHJldHVybiBzdGF0aXN0aWNzXzsKK30KKworUGlwZWxpbmU6OlNldEJvdW5kc0NCIFNiUGxheWVyUGlwZWxpbmU6OkdldFNldEJvdW5kc0NCKCkgeworICByZXR1cm4gYmFzZTo6QmluZCgmU2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXI6OlNldEJvdW5kcywgc2V0X2JvdW5kc19oZWxwZXJfKTsKK30KKworYm9vbCBTYlBsYXllclBpcGVsaW5lOjpJc1B1bmNoT3V0TW9kZSgpIHsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgcmV0dXJuIHBsYXllcl8tPkdldFNiUGxheWVyT3V0cHV0TW9kZSgpID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dDsKKyNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgcmV0dXJuIHRydWU7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6OlN0YXJ0VGFzayhjb25zdCBTdGFydFRhc2tQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIERDSEVDSyghZGVtdXhlcl8pOworCisgIGRlbXV4ZXJfID0gcGFyYW1ldGVycy5kZW11eGVyOworICBlbmRlZF9jYl8gPSBwYXJhbWV0ZXJzLmVuZGVkX2NiOworICBlcnJvcl9jYl8gPSBwYXJhbWV0ZXJzLmVycm9yX2NiOworICB7CisgICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgICBzZWVrX2NiXyA9IHBhcmFtZXRlcnMuc2Vla19jYjsKKyAgfQorICBidWZmZXJpbmdfc3RhdGVfY2JfID0gcGFyYW1ldGVycy5idWZmZXJpbmdfc3RhdGVfY2I7CisgIGR1cmF0aW9uX2NoYW5nZV9jYl8gPSBwYXJhbWV0ZXJzLmR1cmF0aW9uX2NoYW5nZV9jYjsKKworICBjb25zdCBib29sIGtFbmFibGVUZXh0VHJhY2tzID0gZmFsc2U7CisgIGRlbXV4ZXJfLT5Jbml0aWFsaXplKHRoaXMsCisgICAgICAgICAgICAgICAgICAgICAgIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2JQbGF5ZXJQaXBlbGluZTo6T25EZW11eGVySW5pdGlhbGl6ZWQsIHRoaXMpKSwKKyAgICAgICAgICAgICAgICAgICAgICAga0VuYWJsZVRleHRUcmFja3MpOworfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6OlNldFZvbHVtZVRhc2soZmxvYXQgdm9sdW1lKSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGlmIChwbGF5ZXJfKSB7CisgICAgcGxheWVyXy0+U2V0Vm9sdW1lKHZvbHVtZV8pOworICB9Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U2V0UGxheWJhY2tSYXRlVGFzayhmbG9hdCB2b2x1bWUpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgaWYgKHBsYXllcl8pIHsKKyAgICBwbGF5ZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8pOworICB9Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U2V0RHVyYXRpb25UYXNrKFRpbWVEZWx0YSBkdXJhdGlvbikgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgaWYgKCFkdXJhdGlvbl9jaGFuZ2VfY2JfLmlzX251bGwoKSkgeworICAgIGR1cmF0aW9uX2NoYW5nZV9jYl8uUnVuKCk7CisgIH0KK30KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpPbkJ1ZmZlcmVkVGltZVJhbmdlc0NoYW5nZWQoCisgICAgY29uc3QgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4mIHJhbmdlcykgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICBkaWRfbG9hZGluZ19wcm9ncmVzc18gPSB0cnVlOworICBidWZmZXJlZF90aW1lX3Jhbmdlc18gPSByYW5nZXM7Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U2V0RHVyYXRpb24oVGltZURlbHRhIGR1cmF0aW9uKSB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIGR1cmF0aW9uXyA9IGR1cmF0aW9uOworICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlNldER1cmF0aW9uVGFzaywgdGhpcywgZHVyYXRpb24pKTsKK30KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpPbkRlbXV4ZXJFcnJvcihQaXBlbGluZVN0YXR1cyBlcnJvcikgeworICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6Ok9uRGVtdXhlckVycm9yLCB0aGlzLCBlcnJvcikpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChlcnJvciAhPSBQSVBFTElORV9PSykgeworICAgIFJlc2V0QW5kUnVuSWZOb3ROdWxsKCZlcnJvcl9jYl8sIGVycm9yKTsKKyAgfQorfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6OkFkZFRleHRTdHJlYW0oRGVtdXhlclN0cmVhbSogdGV4dF9zdHJlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGV4dFRyYWNrQ29uZmlnJiBjb25maWcpIHsKKyAgTk9UUkVBQ0hFRCgpOworfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6OlJlbW92ZVRleHRTdHJlYW0oRGVtdXhlclN0cmVhbSogdGV4dF9zdHJlYW0pIHsKKyAgTk9UUkVBQ0hFRCgpOworfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6OkNyZWF0ZVBsYXllcihTYkRybVN5c3RlbSBkcm1fc3lzdGVtKSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGlmIChzdXNwZW5kZWRfKSB7CisgICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgICAgICAgIEZST01fSEVSRSwKKyAgICAgICAgYmFzZTo6QmluZCgmU2JQbGF5ZXJQaXBlbGluZTo6Q3JlYXRlUGxheWVyLCB0aGlzLCBkcm1fc3lzdGVtKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gVE9ETzogIENoZWNrIHxzdXNwZW5kZWRffCBoZXJlIGFzIHRoZSBwaXBlbGluZSBjYW4gYmUgc3VzcGVuZGVkIGJlZm9yZSB0aGUKKyAgLy8gcGxheWVyIGlzIGNyZWF0ZWQuICBJbiB0aGlzIGNhc2Ugd2Ugc2hvdWxkIGRlbGF5IGNyZWF0aW5nIHRoZSBwbGF5ZXIgYXMgdGhlCisgIC8vIGNyZWF0aW9uIG9mIHBsYXllciBtYXkgZmFpbC4KKyAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcgPQorICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpBVURJTyktPmF1ZGlvX2RlY29kZXJfY29uZmlnKCk7CisgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnID0KKyAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VklERU8pLT52aWRlb19kZWNvZGVyX2NvbmZpZygpOworCisgIHsKKyAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICAgIHBsYXllcl8ucmVzZXQobmV3IFN0YXJib2FyZFBsYXllcihtZXNzYWdlX2xvb3BfLCBhdWRpb19jb25maWcsIHZpZGVvX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2luZG93XywgZHJtX3N5c3RlbSwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0X2JvdW5kc19oZWxwZXJfLmdldCgpKSk7CisgICAgU2V0UGxheWJhY2tSYXRlVGFzayhwbGF5YmFja19yYXRlXyk7CisgICAgU2V0Vm9sdW1lVGFzayh2b2x1bWVfKTsKKyAgfQorCisgIGlmIChwbGF5ZXJfLT5Jc1ZhbGlkKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBwbGF5ZXJfLnJlc2V0KCk7CisKKyAgUGlwZWxpbmVTdGF0dXNDQiBzZWVrX2NiOworICB7CisgICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgICBEQ0hFQ0soIXNlZWtfY2JfLmlzX251bGwoKSk7CisgICAgc2Vla19jYiA9IGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWVrX2NiXyk7CisgIH0KKyAgc2Vla19jYi5SdW4oREVDT0RFUl9FUlJPUl9OT1RfU1VQUE9SVEVEKTsKK30KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpTZXREZWNyeXB0b3IoRGVjcnlwdG9yKiBkZWNyeXB0b3IpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgaWYgKCFkZWNyeXB0b3IpIHsKKyAgICByZXR1cm47CisgIH0KKyAgTk9UUkVBQ0hFRCgpOworICAvLyBUT0RPOiBNaWdyYXRlIHRoaXMKKyAgLy8gU3RhcmJvYXJkRGVjcnlwdG9yKiBzYl9kZWNyeXB0b3IgPQorICAvLyAgICByZWludGVycHJldF9jYXN0PFN0YXJib2FyZERlY3J5cHRvcio+KGRlY3J5cHRvcik7CisgIC8vIENyZWF0ZVBsYXllcihzYl9kZWNyeXB0b3ItPmRybV9zeXN0ZW0oKSk7Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6T25EZW11eGVySW5pdGlhbGl6ZWQoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spIHsKKyAgICBSZXNldEFuZFJ1bklmTm90TnVsbCgmZXJyb3JfY2JfLCBzdGF0dXMpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OkFVRElPKSA9PSBOVUxMIHx8CisgICAgICBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKSA9PSBOVUxMKSB7CisgICAgUmVzZXRBbmRSdW5JZk5vdE51bGwoJmVycm9yX2NiXywgREVNVVhFUl9FUlJPUl9OT19TVVBQT1JURURfU1RSRUFNUyk7CisgICAgcmV0dXJuOworICB9CisKKyAgeworICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgICAgaGFzX2F1ZGlvXyA9IGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pICE9IE5VTEw7CisgICAgRENIRUNLKGhhc19hdWRpb18pOworICAgIGhhc192aWRlb18gPSBkZW11eGVyXy0+R2V0U3RyZWFtKERlbXV4ZXJTdHJlYW06OlZJREVPKSAhPSBOVUxMOworCisgICAgYnVmZmVyaW5nX3N0YXRlX2NiXy5SdW4oa0hhdmVNZXRhZGF0YSk7CisKKyAgICBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2NvbmZpZyA9CisgICAgICAgIGRlbXV4ZXJfLT5HZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6QVVESU8pLT5hdWRpb19kZWNvZGVyX2NvbmZpZygpOworICAgIGJvb2wgaXNfZW5jcnlwdGVkID0gYXVkaW9fY29uZmlnLmlzX2VuY3J5cHRlZCgpOworICAgIGlmIChoYXNfdmlkZW9fKSB7CisgICAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2NvbmZpZyA9CisgICAgICAgICAgZGVtdXhlcl8tPkdldFN0cmVhbShEZW11eGVyU3RyZWFtOjpWSURFTyktPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7CisgICAgICBuYXR1cmFsX3NpemVfID0gdmlkZW9fY29uZmlnLm5hdHVyYWxfc2l6ZSgpOworICAgICAgaXNfZW5jcnlwdGVkIHw9IHZpZGVvX2NvbmZpZy5pc19lbmNyeXB0ZWQoKTsKKyAgICB9CisgICAgaWYgKGlzX2VuY3J5cHRlZCkgeworICAgICAgLy8gVE9ETzogTWlncmF0ZSB0aGlzCisgICAgICAvLyBkZWNyeXB0b3JfcmVhZHlfY2JfLlJ1bigKKyAgICAgIC8vICAgIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6OlNldERlY3J5cHRvciwKKyAgICAgIC8vICAgIHRoaXMpKSk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgQ3JlYXRlUGxheWVyKGtTYkRybVN5c3RlbUludmFsaWQpOworfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6Ok9uRGVtdXhlclNlZWtlZChQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgaWYgKHN0YXR1cyA9PSBQSVBFTElORV9PSykgeworICAgIHBsYXllcl8tPlNlZWsoc2Vla190aW1lXyk7CisgIH0KK30KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpPbkRlbXV4ZXJTdG9wcGVkKCkgeworICBpZiAoIW1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICAgIG1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6Ok9uRGVtdXhlclN0b3BwZWQsIHRoaXMpKTsKKyAgICByZXR1cm47CisgIH0KKworICBiYXNlOjpSZXNldEFuZFJldHVybigmc3RvcF9jYl8pLlJ1bigpOworfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6Ok9uRGVtdXhlclN0cmVhbVJlYWQoCisgICAgRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlLCBEZW11eGVyU3RyZWFtOjpTdGF0dXMgc3RhdHVzLAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcikgeworICBEQ0hFQ0sodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTyB8fCB0eXBlID09IERlbXV4ZXJTdHJlYW06OlZJREVPKQorICAgICAgPDwgIlVuc3VwcG9ydGVkIERlbXV4ZXJTdHJlYW06OlR5cGUgIiA8PCB0eXBlOworCisgIGlmICghbWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKSB7CisgICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCisgICAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU2JQbGF5ZXJQaXBlbGluZTo6T25EZW11eGVyU3RyZWFtUmVhZCwgdGhpcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUsIHN0YXR1cywgYnVmZmVyKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgRGVtdXhlclN0cmVhbSogc3RyZWFtID0gZGVtdXhlcl8tPkdldFN0cmVhbSh0eXBlKTsKKworICAvLyBJbiBjYXNlIGlmIFN0b3AoKSBoYXMgYmVlbiBjYWxsZWQuCisgIGlmICghcGxheWVyXykgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdGF0dXMgPT0gRGVtdXhlclN0cmVhbTo6a0Fib3J0ZWQpIHsKKyAgICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgeworICAgICAgRENIRUNLKGF1ZGlvX3JlYWRfaW5fcHJvZ3Jlc3NfKTsKKyAgICAgIGF1ZGlvX3JlYWRfaW5fcHJvZ3Jlc3NfID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIERDSEVDSyh2aWRlb19yZWFkX2luX3Byb2dyZXNzXyk7CisgICAgICB2aWRlb19yZWFkX2luX3Byb2dyZXNzXyA9IGZhbHNlOworICAgIH0KKyAgICBpZiAoIXNlZWtfY2JfLmlzX251bGwoKSkgeworICAgICAgUGlwZWxpbmVTdGF0dXNDQiBzZWVrX2NiOworICAgICAgeworICAgICAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICAgICAgICBzZWVrX2NiID0gYmFzZTo6UmVzZXRBbmRSZXR1cm4oJnNlZWtfY2JfKTsKKyAgICAgIH0KKyAgICAgIHNlZWtfY2IuUnVuKFBJUEVMSU5FX09LKTsKKyAgICB9CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0YXR1cyA9PSBEZW11eGVyU3RyZWFtOjprQ29uZmlnQ2hhbmdlZCkgeworICAgIFVwZGF0ZURlY29kZXJDb25maWcoc3RyZWFtKTsKKyAgICBzdHJlYW0tPlJlYWQoCisgICAgICAgIGJhc2U6OkJpbmQoJlNiUGxheWVyUGlwZWxpbmU6Ok9uRGVtdXhlclN0cmVhbVJlYWQsIHRoaXMsIHR5cGUpKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgeworICAgIGF1ZGlvX3JlYWRfaW5fcHJvZ3Jlc3NfID0gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgdmlkZW9fcmVhZF9pbl9wcm9ncmVzc18gPSBmYWxzZTsKKyAgfQorCisgIHBsYXllcl8tPldyaXRlQnVmZmVyKHR5cGUsIGJ1ZmZlcik7Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6T25OZWVkRGF0YShEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgLy8gSW4gY2FzZSBpZiBTdG9wKCkgaGFzIGJlZW4gY2FsbGVkLgorICBpZiAoIXBsYXllcl8pIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgeworICAgIGlmIChhdWRpb19yZWFkX2luX3Byb2dyZXNzXykgeworICAgICAgcmV0dXJuOworICAgIH0KKyAgICBhdWRpb19yZWFkX2luX3Byb2dyZXNzXyA9IHRydWU7CisgIH0gZWxzZSB7CisgICAgRENIRUNLX0VRKHR5cGUsIERlbXV4ZXJTdHJlYW06OlZJREVPKTsKKyAgICBpZiAodmlkZW9fcmVhZF9pbl9wcm9ncmVzc18pIHsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmlkZW9fcmVhZF9pbl9wcm9ncmVzc18gPSB0cnVlOworICB9CisgIERlbXV4ZXJTdHJlYW0qIHN0cmVhbSA9IGRlbXV4ZXJfLT5HZXRTdHJlYW0odHlwZSk7CisgIHN0cmVhbS0+UmVhZChiYXNlOjpCaW5kKCZTYlBsYXllclBpcGVsaW5lOjpPbkRlbXV4ZXJTdHJlYW1SZWFkLCB0aGlzLCB0eXBlKSk7Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6T25QbGF5ZXJTdGF0dXMoU2JQbGF5ZXJTdGF0ZSBzdGF0ZSkgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKworICAvLyBJbiBjYXNlIGlmIFN0b3AoKSBoYXMgYmVlbiBjYWxsZWQuCisgIGlmICghcGxheWVyXykgeworICAgIHJldHVybjsKKyAgfQorICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBrU2JQbGF5ZXJTdGF0ZUluaXRpYWxpemVkOgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBrU2JQbGF5ZXJTdGF0ZVByZXJvbGxpbmc6CisgICAgICBicmVhazsKKyAgICBjYXNlIGtTYlBsYXllclN0YXRlUHJlc2VudGluZzoKKyAgICAgIGJ1ZmZlcmluZ19zdGF0ZV9jYl8uUnVuKGtQcmVyb2xsQ29tcGxldGVkKTsKKyAgICAgIGlmICghc2Vla19jYl8uaXNfbnVsbCgpKSB7CisgICAgICAgIFBpcGVsaW5lU3RhdHVzQ0Igc2Vla19jYjsKKyAgICAgICAgeworICAgICAgICAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgICAgICAgICAgc2Vla19jYiA9IGJhc2U6OlJlc2V0QW5kUmV0dXJuKCZzZWVrX2NiXyk7CisgICAgICAgIH0KKyAgICAgICAgc2Vla19jYi5SdW4oUElQRUxJTkVfT0spOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBrU2JQbGF5ZXJTdGF0ZUVuZE9mU3RyZWFtOgorICAgICAgZW5kZWRfY2JfLlJ1bihQSVBFTElORV9PSyk7CisgICAgICBicmVhazsKKyAgICBjYXNlIGtTYlBsYXllclN0YXRlRGVzdHJveWVkOgorICAgICAgYnJlYWs7CisgICAgY2FzZSBrU2JQbGF5ZXJTdGF0ZUVycm9yOgorICAgICAgUmVzZXRBbmRSdW5JZk5vdE51bGwoJmVycm9yX2NiXywgUElQRUxJTkVfRVJST1JfREVDT0RFKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6VXBkYXRlRGVjb2RlckNvbmZpZyhEZW11eGVyU3RyZWFtKiBzdHJlYW0pIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgaWYgKHN0cmVhbS0+dHlwZSgpID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7CisgICAgc3RyZWFtLT5hdWRpb19kZWNvZGVyX2NvbmZpZygpOworICB9IGVsc2UgeworICAgIERDSEVDS19FUShzdHJlYW0tPnR5cGUoKSwgRGVtdXhlclN0cmVhbTo6VklERU8pOworICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgZGVjb2Rlcl9jb25maWcgPSBzdHJlYW0tPnZpZGVvX2RlY29kZXJfY29uZmlnKCk7CisgICAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgICBuYXR1cmFsX3NpemVfID0gZGVjb2Rlcl9jb25maWcubmF0dXJhbF9zaXplKCk7CisgICAgcGxheWVyXy0+VXBkYXRlVmlkZW9SZXNvbHV0aW9uKHN0YXRpY19jYXN0PGludD4obmF0dXJhbF9zaXplXy53aWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50PihuYXR1cmFsX3NpemVfLmhlaWdodCgpKSk7CisgIH0KK30KKwordm9pZCBTYlBsYXllclBpcGVsaW5lOjpTdXNwZW5kVGFzayhiYXNlOjpXYWl0YWJsZUV2ZW50KiBkb25lX2V2ZW50KSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBEQ0hFQ0soZG9uZV9ldmVudCk7CisgIERDSEVDSyghc3VzcGVuZGVkXyk7CisKKyAgaWYgKHN1c3BlbmRlZF8pIHsKKyAgICBkb25lX2V2ZW50LT5TaWduYWwoKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAocGxheWVyXykgeworICAgIHBsYXllcl8tPlN1c3BlbmQoKTsKKyAgfQorCisgIHN1c3BlbmRlZF8gPSB0cnVlOworCisgIGRvbmVfZXZlbnQtPlNpZ25hbCgpOworfQorCit2b2lkIFNiUGxheWVyUGlwZWxpbmU6OlJlc3VtZVRhc2soYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCkgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgRENIRUNLKGRvbmVfZXZlbnQpOworICBEQ0hFQ0soc3VzcGVuZGVkXyk7CisKKyAgaWYgKCFzdXNwZW5kZWRfKSB7CisgICAgZG9uZV9ldmVudC0+U2lnbmFsKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHBsYXllcl8pIHsKKyAgICBwbGF5ZXJfLT5SZXN1bWUoKTsKKyAgfQorCisgIHN1c3BlbmRlZF8gPSBmYWxzZTsKKworICBkb25lX2V2ZW50LT5TaWduYWwoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKyNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikKKworc2NvcGVkX3JlZnB0cjxQaXBlbGluZT4gUGlwZWxpbmU6OkNyZWF0ZSgKKyAgICBQaXBlbGluZVdpbmRvdyB3aW5kb3csCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAorICAgIE1lZGlhTG9nKiBtZWRpYV9sb2cpIHsKKyNpZiBTQl9IQVMoUExBWUVSKQorICByZXR1cm4gbmV3IFNiUGxheWVyUGlwZWxpbmUod2luZG93LCBtZXNzYWdlX2xvb3AsIG1lZGlhX2xvZyk7CisjZWxzZQorICByZXR1cm4gTlVMTDsKKyNlbmRpZgorfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9zZXRfYm91bmRzX2hlbHBlci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9zZXRfYm91bmRzX2hlbHBlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ZTA4MGUzCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3NldF9ib3VuZHNfaGVscGVyLmNjCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9zZXRfYm91bmRzX2hlbHBlci5oIgorCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCit2b2lkIFNiUGxheWVyU2V0Qm91bmRzSGVscGVyOjpTZXRQbGF5ZXIoU3RhcmJvYXJkUGxheWVyKiBwbGF5ZXIpIHsKKyAgYmFzZTo6TG9jayBsb2NrXzsKKyAgcGxheWVyXyA9IHBsYXllcjsKK30KKworYm9vbCBTYlBsYXllclNldEJvdW5kc0hlbHBlcjo6U2V0Qm91bmRzKGNvbnN0IGdmeDo6UmVjdCYgcmVjdCkgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICBpZiAoIXBsYXllcl8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcGxheWVyXy0+U2V0Qm91bmRzKHJlY3QpOworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfc2V0X2JvdW5kc19oZWxwZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zYnBsYXllcl9zZXRfYm91bmRzX2hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4OTdmNGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2JwbGF5ZXJfc2V0X2JvdW5kc19oZWxwZXIuaApAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9NRURJQV9CQVNFX1NCUExBWUVSX1NFVF9CT1VORFNfSEVMUEVSX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9CQVNFX1NCUExBWUVSX1NFVF9CT1VORFNfSEVMUEVSX0hfCisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKKyNpbmNsdWRlICJ1aS9nZngvcmVjdC5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCitjbGFzcyBTdGFyYm9hcmRQbGF5ZXI7CisKK2NsYXNzIFNiUGxheWVyU2V0Qm91bmRzSGVscGVyCisgICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXI+IHsKKyBwdWJsaWM6CisgIFNiUGxheWVyU2V0Qm91bmRzSGVscGVyKCkgOiBwbGF5ZXJfKE5VTEwpIHt9CisKKyAgdm9pZCBTZXRQbGF5ZXIoU3RhcmJvYXJkUGxheWVyKiBwbGF5ZXIpOworICBib29sIFNldEJvdW5kcyhjb25zdCBnZng6OlJlY3QmIHJlY3QpOworCisgcHJpdmF0ZToKKyAgYmFzZTo6TG9jayBsb2NrXzsKKyAgU3RhcmJvYXJkUGxheWVyKiBwbGF5ZXJfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTYlBsYXllclNldEJvdW5kc0hlbHBlcik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfQkFTRV9TQlBMQVlFUl9TRVRfQk9VTkRTX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NlZWthYmxlX2J1ZmZlci5oCmluZGV4IDFlN2MxOGEuLmRlMWFiZTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zZWVrYWJsZV9idWZmZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2Vla2FibGVfYnVmZmVyLmgKQEAgLTE0NCw5ICsxNDQsNyBAQAogICAvLyBvZiBieXRlcyByZWFkLiBUaGUgY3VycmVudCByZWFkIHBvc2l0aW9uIHdpbGwgYmUgbW92ZWQgZm9yd2FyZCBieSB0aGUKICAgLy8gbnVtYmVyIG9mIGJ5dGVzIHJlYWQuIElmIHxkYXRhfCBpcyBOVUxMLCBvbmx5IHRoZSBjdXJyZW50IHJlYWQgcG9zaXRpb24KICAgLy8gd2lsbCBhZHZhbmNlIGJ1dCBubyBkYXRhIHdpbGwgYmUgY29waWVkLgotICBpbnQgSW50ZXJuYWxSZWFkKHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgYm9vbCBhZHZhbmNlX3Bvc2l0aW9uLAorICBpbnQgSW50ZXJuYWxSZWFkKHVpbnQ4X3QqIGRhdGEsIGludCBzaXplLCBib29sIGFkdmFuY2VfcG9zaXRpb24sCiAgICAgICAgICAgICAgICAgICAgaW50IGZvcndhcmRfb2Zmc2V0KTsKIAogICAvLyBBIGhlbHBlciBtZXRob2QgdGhhdCBtb3ZlcyB0aGUgY3VycmVudCByZWFkIHBvc2l0aW9uIGZvcndhcmQgYnkgfHNpemV8CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1cy5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYzJlMmQwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1cy5jYwpAQCAtMCwwICsxLDM1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1cy5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworbmFtZXNwYWNlIG1lZGlhIHsKKworbmFtZXNwYWNlIHsKKwordHlwZWRlZiBTaGVsbEF1ZGlvQnVzOjpTdG9yYWdlVHlwZSBTdG9yYWdlVHlwZTsKK3R5cGVkZWYgU2hlbGxBdWRpb0J1czo6U2FtcGxlVHlwZSBTYW1wbGVUeXBlOworCitjb25zdCBmbG9hdCBrRmxvYXQzMlRvSW50MTZGYWN0b3IgPSAzMjc2OC5mOworCitpbmxpbmUgdm9pZCBDb252ZXJ0U2FtcGxlKFNoZWxsQXVkaW9CdXM6OlNhbXBsZVR5cGUgc3JjX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBzcmNfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBTaGVsbEF1ZGlvQnVzOjpTYW1wbGVUeXBlIGRlc3RfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIGRlc3RfcHRyKSB7CisgIGlmIChzcmNfdHlwZSA9PSBkZXN0X3R5cGUpIHsKKyAgICBtZW1jcHkoZGVzdF9wdHIsIHNyY19wdHIsCisgICAgICAgICAgIHNyY190eXBlID09IFNoZWxsQXVkaW9CdXM6OmtJbnQxNiA/IHNpemVvZihpbnQxNikgOiBzaXplb2YoZmxvYXQpKTsKKyAgfSBlbHNlIGlmIChzcmNfdHlwZSA9PSBTaGVsbEF1ZGlvQnVzOjprRmxvYXQzMikgeworICAgIGZsb2F0IHNhbXBsZV9pbl9mbG9hdCA9ICpyZWludGVycHJldF9jYXN0PGNvbnN0IGZsb2F0Kj4oc3JjX3B0cik7CisgICAgaW50MzIgc2FtcGxlX2luX2ludDMyID0KKyAgICAgICAgc3RhdGljX2Nhc3Q8aW50MzI+KHNhbXBsZV9pbl9mbG9hdCAqIGtGbG9hdDMyVG9JbnQxNkZhY3Rvcik7CisgICAgc2FtcGxlX2luX2ludDMyID0KKyAgICAgICAgc3RkOjptYXg8aW50MzI+KHNhbXBsZV9pbl9pbnQzMiwgc3RkOjpudW1lcmljX2xpbWl0czxpbnQxNj46Om1pbigpKTsKKyAgICBzYW1wbGVfaW5faW50MzIgPQorICAgICAgICBzdGQ6Om1pbjxpbnQzMj4oc2FtcGxlX2luX2ludDMyLCBzdGQ6Om51bWVyaWNfbGltaXRzPGludDE2Pjo6bWF4KCkpOworICAgICpyZWludGVycHJldF9jYXN0PGludDE2Kj4oZGVzdF9wdHIpID0gc3RhdGljX2Nhc3Q8aW50MTY+KHNhbXBsZV9pbl9pbnQzMik7CisgIH0gZWxzZSB7CisgICAgaW50MTYgc2FtcGxlID0gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgaW50MTYqPihzcmNfcHRyKTsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KGRlc3RfcHRyKSA9CisgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0PihzYW1wbGUpIC8ga0Zsb2F0MzJUb0ludDE2RmFjdG9yOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitTaGVsbEF1ZGlvQnVzOjpTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwgU3RvcmFnZVR5cGUgc3RvcmFnZV90eXBlKQorICAgIDogY2hhbm5lbHNfKGNoYW5uZWxzKSwKKyAgICAgIGZyYW1lc18oZnJhbWVzKSwKKyAgICAgIHNhbXBsZV90eXBlXyhzYW1wbGVfdHlwZSksCisgICAgICBzdG9yYWdlX3R5cGVfKHN0b3JhZ2VfdHlwZSkgeworICBEQ0hFQ0tfR1QoY2hhbm5lbHNfLCAwKTsKKworICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICBkYXRhXy5yZXNldChzdGF0aWNfY2FzdDx1aW50OCo+KGJhc2U6OkFsaWduZWRBbGxvYygKKyAgICAgICAgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIGZyYW1lcyAqIGNoYW5uZWxzLCBrQ2hhbm5lbEFsaWdubWVudEluQnl0ZXMpKSk7CisgICAgY2hhbm5lbF9kYXRhXy5wdXNoX2JhY2soZGF0YV8uZ2V0KCkpOworICB9IGVsc2UgeworICAgIERDSEVDS19FUShzdG9yYWdlX3R5cGVfLCBrUGxhbmFyKTsKKyAgICBzaXplX3QgYWxpZ25lZF9wZXJfY2hhbm5lbF9zaXplX2luX2J5dGVzID0KKyAgICAgICAgKEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiBmcmFtZXMgKyBrQ2hhbm5lbEFsaWdubWVudEluQnl0ZXMgLSAxKSAvCisgICAgICAgIGtDaGFubmVsQWxpZ25tZW50SW5CeXRlcyAqIGtDaGFubmVsQWxpZ25tZW50SW5CeXRlczsKKyAgICBkYXRhXy5yZXNldChzdGF0aWNfY2FzdDx1aW50OCo+KAorICAgICAgICBiYXNlOjpBbGlnbmVkQWxsb2MoYWxpZ25lZF9wZXJfY2hhbm5lbF9zaXplX2luX2J5dGVzICogY2hhbm5lbHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrQ2hhbm5lbEFsaWdubWVudEluQnl0ZXMpKSk7CisgICAgY2hhbm5lbF9kYXRhXy5yZXNlcnZlKGNoYW5uZWxzKTsKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNoYW5uZWxzXzsgKytpKSB7CisgICAgICBjaGFubmVsX2RhdGFfLnB1c2hfYmFjayhkYXRhXy5nZXQoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGlnbmVkX3Blcl9jaGFubmVsX3NpemVfaW5fYnl0ZXMgKiBpKTsKKyAgICB9CisgIH0KK30KKworU2hlbGxBdWRpb0J1czo6U2hlbGxBdWRpb0J1cyhzaXplX3QgZnJhbWVzLCBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdCo+JiBzYW1wbGVzKQorICAgIDogY2hhbm5lbHNfKHNhbXBsZXMuc2l6ZSgpKSwKKyAgICAgIGZyYW1lc18oZnJhbWVzKSwKKyAgICAgIHNhbXBsZV90eXBlXyhrRmxvYXQzMiksCisgICAgICBzdG9yYWdlX3R5cGVfKGtQbGFuYXIpIHsKKyAgRENIRUNLX0dUKGNoYW5uZWxzXywgMCk7CisKKyAgY2hhbm5lbF9kYXRhXy5yZXNlcnZlKHNhbXBsZXMuc2l6ZSgpKTsKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBzYW1wbGVzLnNpemUoKTsgKytpKSB7CisgICAgY2hhbm5lbF9kYXRhXy5wdXNoX2JhY2socmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHNhbXBsZXNbaV0pKTsKKyAgfQorfQorCitTaGVsbEF1ZGlvQnVzOjpTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgZmxvYXQqIHNhbXBsZXMpCisgICAgOiBjaGFubmVsc18oY2hhbm5lbHMpLAorICAgICAgZnJhbWVzXyhmcmFtZXMpLAorICAgICAgc2FtcGxlX3R5cGVfKGtGbG9hdDMyKSwKKyAgICAgIHN0b3JhZ2VfdHlwZV8oa0ludGVybGVhdmVkKSB7CisgIERDSEVDS19HVChjaGFubmVsc18sIDApOworCisgIGNoYW5uZWxfZGF0YV8ucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzYW1wbGVzKSk7Cit9CisKK1NoZWxsQXVkaW9CdXM6OlNoZWxsQXVkaW9CdXMoc2l6ZV90IGZyYW1lcywgY29uc3Qgc3RkOjp2ZWN0b3I8aW50MTYqPiYgc2FtcGxlcykKKyAgICA6IGNoYW5uZWxzXyhzYW1wbGVzLnNpemUoKSksCisgICAgICBmcmFtZXNfKGZyYW1lcyksCisgICAgICBzYW1wbGVfdHlwZV8oa0ludDE2KSwKKyAgICAgIHN0b3JhZ2VfdHlwZV8oa1BsYW5hcikgeworICBEQ0hFQ0tfR1QoY2hhbm5lbHNfLCAwKTsKKworICBjaGFubmVsX2RhdGFfLnJlc2VydmUoc2FtcGxlcy5zaXplKCkpOworICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBjaGFubmVsX2RhdGFfLnB1c2hfYmFjayhyZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc2FtcGxlc1tpXSkpOworICB9Cit9CisKK1NoZWxsQXVkaW9CdXM6OlNoZWxsQXVkaW9CdXMoc2l6ZV90IGNoYW5uZWxzLCBzaXplX3QgZnJhbWVzLCBpbnQxNiogc2FtcGxlcykKKyAgICA6IGNoYW5uZWxzXyhjaGFubmVscyksCisgICAgICBmcmFtZXNfKGZyYW1lcyksCisgICAgICBzYW1wbGVfdHlwZV8oa0ludDE2KSwKKyAgICAgIHN0b3JhZ2VfdHlwZV8oa0ludGVybGVhdmVkKSB7CisgIERDSEVDS19HVChjaGFubmVsc18sIDApOworCisgIGNoYW5uZWxfZGF0YV8ucHVzaF9iYWNrKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzYW1wbGVzKSk7Cit9CisKK3NpemVfdCBTaGVsbEF1ZGlvQnVzOjpHZXRTYW1wbGVTaXplSW5CeXRlcygpIGNvbnN0IHsKKyAgaWYgKHNhbXBsZV90eXBlXyA9PSBrSW50MTYpIHsKKyAgICByZXR1cm4gc2l6ZW9mKGludDE2KTsKKyAgfQorICBEQ0hFQ0tfRVEoc2FtcGxlX3R5cGVfLCBrRmxvYXQzMik7CisgIHJldHVybiBzaXplb2YoZmxvYXQpOworfQorCitjb25zdCB1aW50OCogU2hlbGxBdWRpb0J1czo6aW50ZXJsZWF2ZWRfZGF0YSgpIGNvbnN0IHsKKyAgRENIRUNLX0VRKHN0b3JhZ2VfdHlwZV8sIGtJbnRlcmxlYXZlZCk7CisgIHJldHVybiBjaGFubmVsX2RhdGFfWzBdOworfQorCitjb25zdCB1aW50OCogU2hlbGxBdWRpb0J1czo6cGxhbmFyX2RhdGEoc2l6ZV90IGNoYW5uZWwpIGNvbnN0IHsKKyAgRENIRUNLX0xUKGNoYW5uZWwsIGNoYW5uZWxzXyk7CisgIERDSEVDS19FUShzdG9yYWdlX3R5cGVfLCBrUGxhbmFyKTsKKyAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bY2hhbm5lbF07Cit9CisKK3ZvaWQgU2hlbGxBdWRpb0J1czo6WmVyb0ZyYW1lcyhzaXplX3Qgc3RhcnRfZnJhbWUsIHNpemVfdCBlbmRfZnJhbWUpIHsKKyAgRENIRUNLX0xFKHN0YXJ0X2ZyYW1lLCBlbmRfZnJhbWUpOworICBEQ0hFQ0tfTEUoZW5kX2ZyYW1lLCBmcmFtZXNfKTsKKyAgZW5kX2ZyYW1lID0gc3RkOjptaW4oZW5kX2ZyYW1lLCBmcmFtZXNfKTsKKyAgc3RhcnRfZnJhbWUgPSBzdGQ6Om1pbihzdGFydF9mcmFtZSwgZW5kX2ZyYW1lKTsKKyAgaWYgKHN0YXJ0X2ZyYW1lID49IGVuZF9mcmFtZSkgeworICAgIHJldHVybjsKKyAgfQorICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICBtZW1zZXQoR2V0U2FtcGxlUHRyKDAsIHN0YXJ0X2ZyYW1lKSwgMCwKKyAgICAgICAgICAgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIChlbmRfZnJhbWUgLSBzdGFydF9mcmFtZSkgKiBjaGFubmVsc18pOworICB9IGVsc2UgeworICAgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHNfOyArK2NoYW5uZWwpIHsKKyAgICAgIG1lbXNldChHZXRTYW1wbGVQdHIoY2hhbm5lbCwgc3RhcnRfZnJhbWUpLCAwLAorICAgICAgICAgICAgIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiAoZW5kX2ZyYW1lIC0gc3RhcnRfZnJhbWUpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBTaGVsbEF1ZGlvQnVzOjpBc3NpZ24oY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKSB7CisgIERDSEVDS19FUShjaGFubmVsc18sIHNvdXJjZS5jaGFubmVsc18pOworICBpZiAoY2hhbm5lbHNfICE9IHNvdXJjZS5jaGFubmVsc18pIHsKKyAgICBaZXJvQWxsRnJhbWVzKCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHNhbXBsZV90eXBlXyA9PSBzb3VyY2Uuc2FtcGxlX3R5cGVfICYmCisgICAgICBzdG9yYWdlX3R5cGVfID09IHNvdXJjZS5zdG9yYWdlX3R5cGVfKSB7CisgICAgc2l6ZV90IGZyYW1lcyA9IHN0ZDo6bWluKGZyYW1lc18sIHNvdXJjZS5mcmFtZXNfKTsKKyAgICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICAgIG1lbWNweShHZXRTYW1wbGVQdHIoMCwgMCksIHNvdXJjZS5HZXRTYW1wbGVQdHIoMCwgMCksCisgICAgICAgICAgICAgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIGZyYW1lcyAqIGNoYW5uZWxzXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIGZvciAoc2l6ZV90IGNoYW5uZWwgPSAwOyBjaGFubmVsIDwgY2hhbm5lbHNfOyArK2NoYW5uZWwpIHsKKyAgICAgICAgbWVtY3B5KEdldFNhbXBsZVB0cihjaGFubmVsLCAwKSwgc291cmNlLkdldFNhbXBsZVB0cihjaGFubmVsLCAwKSwKKyAgICAgICAgICAgICAgIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiBmcmFtZXMpOworICAgICAgfQorICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBzaXplX3QgZnJhbWVzID0gc3RkOjptaW4oZnJhbWVzXywgc291cmNlLmZyYW1lc18pOworICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzXzsgKytjaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lczsgKytmcmFtZSkgeworICAgICAgQ29udmVydFNhbXBsZShzb3VyY2Uuc2FtcGxlX3R5cGVfLCBzb3VyY2UuR2V0U2FtcGxlUHRyKGNoYW5uZWwsIGZyYW1lKSwKKyAgICAgICAgICAgICAgICAgICAgc2FtcGxlX3R5cGVfLCBHZXRTYW1wbGVQdHIoY2hhbm5lbCwgZnJhbWUpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBTaGVsbEF1ZGlvQnVzOjpBc3NpZ24oY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBtYXRyaXgpIHsKKyAgRENIRUNLX0VRKGNoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSwgbWF0cml4LnNpemUoKSk7CisgIERDSEVDS19FUShzYW1wbGVfdHlwZV8sIGtGbG9hdDMyKTsKKyAgRENIRUNLX0VRKHNvdXJjZS5zYW1wbGVfdHlwZV8sIGtGbG9hdDMyKTsKKyAgaWYgKGNoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSAhPSBtYXRyaXguc2l6ZSgpIHx8CisgICAgICBzYW1wbGVfdHlwZV8gIT0ga0Zsb2F0MzIgfHwgc291cmNlLnNhbXBsZV90eXBlXyAhPSBrRmxvYXQzMikgeworICAgIFplcm9BbGxGcmFtZXMoKTsKKyAgICByZXR1cm47CisgIH0KKworICBzaXplX3QgZnJhbWVzID0gc3RkOjptaW4oZnJhbWVzXywgc291cmNlLmZyYW1lc18pOworICBmb3IgKHNpemVfdCBkZXN0X2NoYW5uZWwgPSAwOyBkZXN0X2NoYW5uZWwgPCBjaGFubmVsc187ICsrZGVzdF9jaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lczsgKytmcmFtZSkgeworICAgICAgZmxvYXQgbWl4ZWRfc2FtcGxlID0gMC5mOworICAgICAgZm9yIChzaXplX3Qgc3JjX2NoYW5uZWwgPSAwOyBzcmNfY2hhbm5lbCA8IHNvdXJjZS5jaGFubmVsc187CisgICAgICAgICAgICsrc3JjX2NoYW5uZWwpIHsKKyAgICAgICAgbWl4ZWRfc2FtcGxlICs9IHNvdXJjZS5HZXRGbG9hdDMyU2FtcGxlKHNyY19jaGFubmVsLCBmcmFtZSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W2Rlc3RfY2hhbm5lbCAqIHNvdXJjZS5jaGFubmVsc18gKyBzcmNfY2hhbm5lbF07CisgICAgICB9CisgICAgICBTZXRGbG9hdDMyU2FtcGxlKGRlc3RfY2hhbm5lbCwgZnJhbWUsIG1peGVkX3NhbXBsZSk7CisgICAgfQorICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBTb3VyY2VTYW1wbGVUeXBlLCB0eXBlbmFtZSBEZXN0U2FtcGxlVHlwZSwKKyAgICAgICAgICBTdG9yYWdlVHlwZSBTb3VyY2VTdG9yYWdlVHlwZSwgU3RvcmFnZVR5cGUgRGVzdFN0b3JhZ2VUeXBlPgordm9pZCBTaGVsbEF1ZGlvQnVzOjpNaXhGb3JUeXBlcyhjb25zdCBTaGVsbEF1ZGlvQnVzJiBzb3VyY2UpIHsKKyAgY29uc3Qgc2l6ZV90IGZyYW1lcyA9IHN0ZDo6bWluKGZyYW1lc18sIHNvdXJjZS5mcmFtZXNfKTsKKworICBmb3IgKHNpemVfdCBjaGFubmVsID0gMDsgY2hhbm5lbCA8IGNoYW5uZWxzXzsgKytjaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lczsgKytmcmFtZSkgeworICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8RGVzdFNhbXBsZVR5cGUqPigKKyAgICAgICAgICBHZXRTYW1wbGVQdHJGb3JUeXBlPERlc3RTYW1wbGVUeXBlLCBEZXN0U3RvcmFnZVR5cGU+KGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmFtZSkpICs9CisgICAgICAgICAgc291cmNlLkdldFNhbXBsZUZvclR5cGU8U291cmNlU2FtcGxlVHlwZSwgU291cmNlU3RvcmFnZVR5cGU+KGNoYW5uZWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBTaGVsbEF1ZGlvQnVzOjpNaXgoY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKSB7CisgIERDSEVDS19FUShjaGFubmVsc18sIHNvdXJjZS5jaGFubmVsc18pOworCisgIGlmIChjaGFubmVsc18gIT0gc291cmNlLmNoYW5uZWxzXykgeworICAgIFplcm9BbGxGcmFtZXMoKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBQcm9maWxpbmcgaGFzIGlkZW50aWZpZWQgdGhpcyBhcmVhIG9mIGNvZGUgYXMgaG90LCBzbyBpbnN0ZWFkIG9mIGNhbGxpbmcKKyAgLy8gR2V0U2FtcGxlUHRyLCB3aGljaCBicmFuY2hlcyBlYWNoIHRpbWUgaXQgaXMgY2FsbGVkLCB3ZSBicmFuY2ggb25jZQorICAvLyBiZWZvcmUgd2UgbG9vcCBhbmQgaW5saW5lIHRoZSBicmFuY2ggb2YgdGhlIGZ1bmN0aW9uIHdlIHdhbnQuCisgIGlmIChzb3VyY2Uuc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJiBzYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmCisgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQgJiYgc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICBNaXhGb3JUeXBlczxpbnQxNiwgaW50MTYsIGtJbnRlcmxlYXZlZCwga0ludGVybGVhdmVkPihzb3VyY2UpOworICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmIHNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYKKyAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQgJiYgc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyKSB7CisgICAgTWl4Rm9yVHlwZXM8aW50MTYsIGludDE2LCBrSW50ZXJsZWF2ZWQsIGtQbGFuYXI+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYgc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJgorICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtQbGFuYXIgJiYgc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICBNaXhGb3JUeXBlczxpbnQxNiwgaW50MTYsIGtQbGFuYXIsIGtJbnRlcmxlYXZlZD4oc291cmNlKTsKKyAgfSBlbHNlIGlmIChzb3VyY2Uuc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJiBzYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmCisgICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hciAmJiBzdG9yYWdlX3R5cGVfID09IGtQbGFuYXIpIHsKKyAgICBNaXhGb3JUeXBlczxpbnQxNiwgaW50MTYsIGtQbGFuYXIsIGtQbGFuYXI+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYgc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmCisgICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkICYmCisgICAgICAgICAgICAgc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICBNaXhGb3JUeXBlczxpbnQxNiwgZmxvYXQsIGtJbnRlcmxlYXZlZCwga0ludGVybGVhdmVkPihzb3VyY2UpOworICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmIHNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJgorICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCAmJiBzdG9yYWdlX3R5cGVfID09IGtQbGFuYXIpIHsKKyAgICBNaXhGb3JUeXBlczxpbnQxNiwgZmxvYXQsIGtJbnRlcmxlYXZlZCwga1BsYW5hcj4oc291cmNlKTsKKyAgfSBlbHNlIGlmIChzb3VyY2Uuc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJiBzYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYKKyAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyICYmIHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7CisgICAgTWl4Rm9yVHlwZXM8aW50MTYsIGZsb2F0LCBrUGxhbmFyLCBrSW50ZXJsZWF2ZWQ+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYgc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmCisgICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hciAmJiBzdG9yYWdlX3R5cGVfID09IGtQbGFuYXIpIHsKKyAgICBNaXhGb3JUeXBlczxpbnQxNiwgZmxvYXQsIGtQbGFuYXIsIGtQbGFuYXI+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJiBzYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmCisgICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkICYmCisgICAgICAgICAgICAgc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICBNaXhGb3JUeXBlczxmbG9hdCwgaW50MTYsIGtJbnRlcmxlYXZlZCwga0ludGVybGVhdmVkPihzb3VyY2UpOworICB9IGVsc2UgaWYgKHNvdXJjZS5zYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYgc2FtcGxlX3R5cGVfID09IGtJbnQxNiAmJgorICAgICAgICAgICAgIHNvdXJjZS5zdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCAmJiBzdG9yYWdlX3R5cGVfID09IGtQbGFuYXIpIHsKKyAgICBNaXhGb3JUeXBlczxmbG9hdCwgaW50MTYsIGtJbnRlcmxlYXZlZCwga1BsYW5hcj4oc291cmNlKTsKKyAgfSBlbHNlIGlmIChzb3VyY2Uuc2FtcGxlX3R5cGVfID09IGtGbG9hdDMyICYmIHNhbXBsZV90eXBlXyA9PSBrSW50MTYgJiYKKyAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyICYmIHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7CisgICAgTWl4Rm9yVHlwZXM8ZmxvYXQsIGludDE2LCBrUGxhbmFyLCBrSW50ZXJsZWF2ZWQ+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJiBzYW1wbGVfdHlwZV8gPT0ga0ludDE2ICYmCisgICAgICAgICAgICAgc291cmNlLnN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hciAmJiBzdG9yYWdlX3R5cGVfID09IGtQbGFuYXIpIHsKKyAgICBNaXhGb3JUeXBlczxmbG9hdCwgaW50MTYsIGtQbGFuYXIsIGtQbGFuYXI+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJiBzYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYKKyAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQgJiYKKyAgICAgICAgICAgICBzdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCkgeworICAgIE1peEZvclR5cGVzPGZsb2F0LCBmbG9hdCwga0ludGVybGVhdmVkLCBrSW50ZXJsZWF2ZWQ+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJiBzYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYKKyAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQgJiYgc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyKSB7CisgICAgTWl4Rm9yVHlwZXM8ZmxvYXQsIGZsb2F0LCBrSW50ZXJsZWF2ZWQsIGtQbGFuYXI+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJiBzYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYKKyAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyICYmIHN0b3JhZ2VfdHlwZV8gPT0ga0ludGVybGVhdmVkKSB7CisgICAgTWl4Rm9yVHlwZXM8ZmxvYXQsIGZsb2F0LCBrUGxhbmFyLCBrSW50ZXJsZWF2ZWQ+KHNvdXJjZSk7CisgIH0gZWxzZSBpZiAoc291cmNlLnNhbXBsZV90eXBlXyA9PSBrRmxvYXQzMiAmJiBzYW1wbGVfdHlwZV8gPT0ga0Zsb2F0MzIgJiYKKyAgICAgICAgICAgICBzb3VyY2Uuc3RvcmFnZV90eXBlXyA9PSBrUGxhbmFyICYmIHN0b3JhZ2VfdHlwZV8gPT0ga1BsYW5hcikgeworICAgIE1peEZvclR5cGVzPGZsb2F0LCBmbG9hdCwga1BsYW5hciwga1BsYW5hcj4oc291cmNlKTsKKyAgfSBlbHNlIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgIH0KK30KKwordm9pZCBTaGVsbEF1ZGlvQnVzOjpNaXgoY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8ZmxvYXQ+JiBtYXRyaXgpIHsKKyAgRENIRUNLX0VRKGNoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSwgbWF0cml4LnNpemUoKSk7CisgIERDSEVDS19FUShzYW1wbGVfdHlwZV8sIGtGbG9hdDMyKTsKKyAgRENIRUNLX0VRKHNvdXJjZS5zYW1wbGVfdHlwZV8sIGtGbG9hdDMyKTsKKyAgaWYgKGNoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSAhPSBtYXRyaXguc2l6ZSgpIHx8CisgICAgICBzYW1wbGVfdHlwZV8gIT0ga0Zsb2F0MzIgfHwgc291cmNlLnNhbXBsZV90eXBlXyAhPSBrRmxvYXQzMikgeworICAgIFplcm9BbGxGcmFtZXMoKTsKKyAgICByZXR1cm47CisgIH0KKworICBzaXplX3QgZnJhbWVzID0gc3RkOjptaW4oZnJhbWVzXywgc291cmNlLmZyYW1lc18pOworICBmb3IgKHNpemVfdCBkZXN0X2NoYW5uZWwgPSAwOyBkZXN0X2NoYW5uZWwgPCBjaGFubmVsc187ICsrZGVzdF9jaGFubmVsKSB7CisgICAgZm9yIChzaXplX3QgZnJhbWUgPSAwOyBmcmFtZSA8IGZyYW1lczsgKytmcmFtZSkgeworICAgICAgZmxvYXQgbWl4ZWRfc2FtcGxlID0gMC5mOworICAgICAgZm9yIChzaXplX3Qgc3JjX2NoYW5uZWwgPSAwOyBzcmNfY2hhbm5lbCA8IHNvdXJjZS5jaGFubmVsc187CisgICAgICAgICAgICsrc3JjX2NoYW5uZWwpIHsKKyAgICAgICAgbWl4ZWRfc2FtcGxlICs9IHNvdXJjZS5HZXRGbG9hdDMyU2FtcGxlKHNyY19jaGFubmVsLCBmcmFtZSkgKgorICAgICAgICAgICAgICAgICAgICAgICAgbWF0cml4W2Rlc3RfY2hhbm5lbCAqIHNvdXJjZS5jaGFubmVsc18gKyBzcmNfY2hhbm5lbF07CisgICAgICB9CisgICAgICBtaXhlZF9zYW1wbGUgKz0gR2V0RmxvYXQzMlNhbXBsZShkZXN0X2NoYW5uZWwsIGZyYW1lKTsKKyAgICAgIFNldEZsb2F0MzJTYW1wbGUoZGVzdF9jaGFubmVsLCBmcmFtZSwgbWl4ZWRfc2FtcGxlKTsKKyAgICB9CisgIH0KK30KKwordWludDgqIFNoZWxsQXVkaW9CdXM6OkdldFNhbXBsZVB0cihzaXplX3QgY2hhbm5lbCwgc2l6ZV90IGZyYW1lKSB7CisgIERDSEVDS19MVChjaGFubmVsLCBjaGFubmVsc18pOworICBEQ0hFQ0tfTFQoZnJhbWUsIGZyYW1lc18pOworCisgIGlmIChzdG9yYWdlX3R5cGVfID09IGtJbnRlcmxlYXZlZCkgeworICAgIHJldHVybiBjaGFubmVsX2RhdGFfWzBdICsKKyAgICAgICAgICAgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIChjaGFubmVsc18gKiBmcmFtZSArIGNoYW5uZWwpOworICB9IGVsc2UgeworICAgIHJldHVybiBjaGFubmVsX2RhdGFfW2NoYW5uZWxdICsgR2V0U2FtcGxlU2l6ZUluQnl0ZXMoKSAqIGZyYW1lOworICB9Cit9CisKK2NvbnN0IHVpbnQ4KiBTaGVsbEF1ZGlvQnVzOjpHZXRTYW1wbGVQdHIoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSkgY29uc3QgeworICBEQ0hFQ0tfTFQoY2hhbm5lbCwgY2hhbm5lbHNfKTsKKyAgRENIRUNLX0xUKGZyYW1lLCBmcmFtZXNfKTsKKworICBpZiAoc3RvcmFnZV90eXBlXyA9PSBrSW50ZXJsZWF2ZWQpIHsKKyAgICByZXR1cm4gY2hhbm5lbF9kYXRhX1swXSArCisgICAgICAgICAgIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiAoY2hhbm5lbHNfICogZnJhbWUgKyBjaGFubmVsKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gY2hhbm5lbF9kYXRhX1tjaGFubmVsXSArIEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgKiBmcmFtZTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9hdWRpb19idXMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9hdWRpb19idXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQ3NjNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX2F1ZGlvX2J1cy5oCkBAIC0wLDAgKzEsMTU4IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9NRURJQV9CQVNFX1NIRUxMX0FVRElPX0JVU19IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9TSEVMTF9BVURJT19CVVNfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L2FsaWduZWRfbWVtb3J5LmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImNvYmFsdC9leHBvcnQuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gVGhpcyBzd2lzcyBhcm15IGtuaWZlIGNsYXNzIGVuY2Fwc3VsYXRlcyBhdWRpbyBkYXRhIGluIG11bHRpcGxlIGNoYW5uZWxzLCBpbgorLy8gZGlmZmVyZW50IHN0b3JhZ2UgdHlwZXMgYW5kIHdpdGggZGlmZmVyZW50IHNhbXBsZSBzaXplcy4gIEl0IGFsc28gcHJvdmlkZXMKKy8vIG9wZXJhdGlvbiB0byBjb252ZXJ0LCBtaXggYmV0d2VlbiBkaWZmZXJlbnQgdHlwZXMgb2YgYXVkaW8gZGF0YS4gIEl0IHNob3VsZAorLy8gYmUgdXNlZCB3aGVuZXZlciBzdWNoIGF1ZGlvIGRhdGEgaXMgc3RvcmVkIG9yIHBhc3NlZCBhcm91bmQuCisvLyBJbiB0aGlzIGNsYXNzLCAic2FtcGxlIiBpcyBvbmUgYXVkaW8gd2F2ZSBmb3JtIGRhdGEgYXQgYSBjZXJ0YWluIHRpbWUgZnJvbSBhCisvLyBjZXJ0YWluIGNoYW5uZWwsIHdoaWxlICJmcmFtZSIgcmVmZXJzIHRvIGFsbCBzYW1wbGVzIGF0IHRoZSBzYW1lIHRpbWUgZnJvbQorLy8gYWxsIGNoYW5uZWxzLiAgRm9yIGV4YW1wbGUsIGZvciBhIDQ4MDAwS0h6IHN0ZXJlbyBhdWRpbyB3aXRoIHNhbXBsZXMgaW4KKy8vIGZsb2F0LCBpdHMgc2FtcGxlIHNpemUgaW4gYnl0ZXMgaXMgNCBidXQgaXRzIGZyYW1lIHNpemUgaW4gYnl0ZXMgaXMgOC4gIE9uZQorLy8gc2Vjb25kIG9mIHN1Y2ggYXVkaW8gY29udGFpbnMgNDgwMDAgZnJhbWVzICg5NjAwMCBzYW1wbGVzKS4KKy8vIE5vdGU6IFRoaXMgY2xhc3MgZG9lc24ndCBkbyBlbmRpYW5uZXNzIGNvbnZlcnNpb25zLiAgSXQgYXNzdW1lcyB0aGF0IGFsbCBkYXRhCisvLyBpcyBpbiB0aGUgY29ycmVjdCBlbmRpYW5uZXNzLgorY2xhc3MgQ09CQUxUX0VYUE9SVCBTaGVsbEF1ZGlvQnVzIHsKKyBwdWJsaWM6CisgIC8vIEd1YXJhbnRlZWQgYWxpZ25tZW50IG9mIGVhY2ggY2hhbm5lbCdzIGRhdGE7IHVzZSA2NC1ieXRlIGFsaWdubWVudCBzbyBpdAorICAvLyBzYXRpc2ZpZXMgYWxsIG91ciBjdXJyZW50IHBsYXRmb3Jtcy4gIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgdXNlZCBmb3IKKyAgLy8gYnVmZmVycyB0aGF0IGFyZSBhbGxvY2F0ZWQgYW5kIG93bmVkIGJ5IHRoZSBTaGVsbEF1ZGlvQnVzLiAgV2UgZG9uJ3QKKyAgLy8gZW5mb3JjZSBhbGlnbm1lbnQgZm9yIHRoZSBidWZmZXJzIHBhc3NlZCBpbiBhbmQgZXh0cmEgY2F1dGlvbiBzaG91bGQgYmUKKyAgLy8gdGFrZW4gaWYgdGhleSBhcmUgdXNlZCBhcyBoYXJkd2FyZSBidWZmZXIuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0NoYW5uZWxBbGlnbm1lbnRJbkJ5dGVzID0gNjQ7CisKKyAgZW51bSBTYW1wbGVUeXBlIHsga0ludDE2LCBrRmxvYXQzMiB9OworCisgIGVudW0gU3RvcmFnZVR5cGUgeyBrSW50ZXJsZWF2ZWQsIGtQbGFuYXIgfTsKKworICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgU2FtcGxlVHlwZSBzYW1wbGVfdHlwZSwKKyAgICAgICAgICAgICAgICBTdG9yYWdlVHlwZSBzdG9yYWdlX3R5cGUpOworICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0Kj4mIHNhbXBsZXMpOworICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgZmxvYXQqIHNhbXBsZXMpOworICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBmcmFtZXMsIGNvbnN0IHN0ZDo6dmVjdG9yPGludDE2Kj4mIHNhbXBsZXMpOworICBTaGVsbEF1ZGlvQnVzKHNpemVfdCBjaGFubmVscywgc2l6ZV90IGZyYW1lcywgaW50MTYqIHNhbXBsZXMpOworCisgIHNpemVfdCBjaGFubmVscygpIGNvbnN0IHsgcmV0dXJuIGNoYW5uZWxzXzsgfQorICBzaXplX3QgZnJhbWVzKCkgY29uc3QgeyByZXR1cm4gZnJhbWVzXzsgfQorICBTYW1wbGVUeXBlIHNhbXBsZV90eXBlKCkgY29uc3QgeyByZXR1cm4gc2FtcGxlX3R5cGVfOyB9CisgIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHN0b3JhZ2VfdHlwZV87IH0KKyAgc2l6ZV90IEdldFNhbXBsZVNpemVJbkJ5dGVzKCkgY29uc3Q7CisgIGNvbnN0IHVpbnQ4KiBpbnRlcmxlYXZlZF9kYXRhKCkgY29uc3Q7CisgIGNvbnN0IHVpbnQ4KiBwbGFuYXJfZGF0YShzaXplX3QgY2hhbm5lbCkgY29uc3Q7CisKKyAgaW50MTYgR2V0SW50MTZTYW1wbGUoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSkgY29uc3QgeworICAgIERDSEVDS19FUShzYW1wbGVfdHlwZV8sIGtJbnQxNik7CisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IGludDE2Kj4oR2V0U2FtcGxlUHRyKGNoYW5uZWwsIGZyYW1lKSk7CisgIH0KKyAgZmxvYXQgR2V0RmxvYXQzMlNhbXBsZShzaXplX3QgY2hhbm5lbCwgc2l6ZV90IGZyYW1lKSBjb25zdCB7CisgICAgRENIRUNLX0VRKHNhbXBsZV90eXBlXywga0Zsb2F0MzIpOworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBmbG9hdCo+KEdldFNhbXBsZVB0cihjaGFubmVsLCBmcmFtZSkpOworICB9CisKKyAgdm9pZCBaZXJvRnJhbWVzKHNpemVfdCBzdGFydF9mcmFtZSwgc2l6ZV90IGVuZF9mcmFtZSk7CisgIHZvaWQgWmVyb0FsbEZyYW1lcygpIHsgWmVyb0ZyYW1lcygwLCBmcmFtZXMoKSk7IH0KKworICAvLyBDb3B5IGZyYW1lcyBmcm9tIHxzb3VyY2V8IHByb3ZpZGVkIHRoYXQgaXQgaGFzIHRoZSBzYW1lIG51bWJlciBvZiBjaGFubmVscworICAvLyBhcyB0aGUgZGVzdGluYXRpb24gb2JqZWN0ICh0aGlzKS4gIFRoaXMgZnVuY3Rpb24gZG9lcyBhbnkgbmVjZXNzYXJ5CisgIC8vIGNvbnZlcnNpb24gYmV0d2VlbiBkaWZmZXJlbnQgc2FtcGxlIHR5cGVzIGFuZCBzdG9yYWdlIHR5cGVzLiAgV2hlbiBzb3VyY2UKKyAgLy8gaGFzIGxlc3MgZnJhbWVzIHRoYW4gdGhlIGRlc3RpbmF0aW9uIG9iamVjdCwgaXQgd2lsbCBvbmx5IGNvcHkgdGhlc2UgZnJhbWVzCisgIC8vIGFuZCB3aWxsIG5vdCBmaWxsIHRoZSByZXN0IGZyYW1lcyBpbiBvdXIgYnVmZmVyIHdpdGggMC4KKyAgdm9pZCBBc3NpZ24oY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKTsKKworICAvLyBUaGUgc2FtZSBhcyB0aGUgYWJvdmUgZnVuY3Rpb24gZXhjZXB0IHRoYXQgdGhpcyBmdW5jdGlvbiBhbHNvIGRvZXMgbWl4aW5nLgorICAvLyB8bWF0cml4fCBpcyBhIHxkZXN0LmNoYW5uZWxzKCl8IHJvdyAqIHxzb3VyY2UuY2hhbm5lbHMoKXwgY29sdW1uIG1hdHJpeCBpbgorICAvLyByb3cgbWFqb3IuCisgIC8vIGRlc3Quc2FtcGxlW2Rlc3RfY2hhbm5lbF1bZnJhbWVdID0KKyAgLy8gICAgIHNvdXJjZS5zYW1wbGVbMF1bZnJhbWVdICogbWF0cml4W2Rlc3RfY2hhbm5lbCAqIHNvdXJjZS5jaGFubmVscygpICsgMF0KKyAgLy8gICArIHNvdXJjZS5zYW1wbGVbMV1bZnJhbWVdICogbWF0cml4W2Rlc3RfY2hhbm5lbCAqIHNvdXJjZS5jaGFubmVscygpICsgMV0KKyAgLy8gICAgIC4uLgorICAvLyAgICsgc291cmNlLnNhbXBsZVtzb3VyY2UuY2hhbm5lbHMoKSAtIDFdW2ZyYW1lXSAqCisgIC8vICAgICAgICAgbWF0cml4W2NoYW5uZWxzKCkgKiBzb3VyY2UuY2hhbm5lbHMoKSArIHNvdXJjZS5jaGFubmVscygpIC0gMV07CisgIC8vIE5vdGU6IEJvdGggb2JqZWN0cyBtdXN0IGhhdmUgc3RvcmFnZSB0eXBlIG9mIGtGbG9hdDMyLgorICB2b2lkIEFzc2lnbihjb25zdCBTaGVsbEF1ZGlvQnVzJiBzb3VyY2UsIGNvbnN0IHN0ZDo6dmVjdG9yPGZsb2F0PiYgbWF0cml4KTsKKworICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcmUgdGhlIHNhbWUgYXMgdGhlIEFzc2lnbigpIGZ1bmN0aW9ucyBleGNlcHQgdGhhdAorICAvLyB0aGV5IGFkZCB0aGUgY2FsY3VsYXRlZCBzYW1wbGVzIHRvIHRoZSB0YXJnZXQgc2FtcGxlcyBpbnN0ZWFkIG9mIHJlcGxhY2luZworICAvLyB0aGUgdGFyZ2V0IHNhbXBsZXMgd2l0aCB0aGUgY2FsY3VsYXRlZCBzYW1wbGVzLgorICAvLyBOb3RlOiBCb3RoIG9iamVjdHMgbXVzdCBoYXZlIHN0b3JhZ2UgdHlwZSBvZiBrRmxvYXQzMi4KKyAgdm9pZCBNaXgoY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlKTsKKyAgdm9pZCBNaXgoY29uc3QgU2hlbGxBdWRpb0J1cyYgc291cmNlLCBjb25zdCBzdGQ6OnZlY3RvcjxmbG9hdD4mIG1hdHJpeCk7CisKKyBwdWJsaWM6CisgIC8vIFRoZSAuKkZvclR5cGVzPyBmdW5jdGlvbnMgYmVsb3cgYXJlIG9wdGltaXplZCB2ZXJzaW9ucyB0aGF0IGFzc3VtZSB3aGF0CisgIC8vIHN0b3JhZ2UgdHlwZSB0aGUgYnVzIGlzIHVzaW5nLiAgVGhleSBhcmUgbWVhbnQgdG8gYmUgY2FsbGVkIGFmdGVyCisgIC8vIGNoZWNraW5nIHdoYXQgc3RvcmFnZSB0eXBlIHRoZSBidXMgaXMgb25jZSwgYW5kIHRoZW4gcGVyZm9ybWluZyBhIGJhdGNoCisgIC8vIG9mIG9wZXJhdGlvbnMsIHdoZXJlIGl0IGlzIGtub3duIHRoYXQgdGhlIHR5cGUgd2lsbCBub3QgY2hhbmdlLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU2FtcGxlVHlwZU5hbWUsIFN0b3JhZ2VUeXBlIFQ+CisgIGlubGluZSB1aW50OCogR2V0U2FtcGxlUHRyRm9yVHlwZShzaXplX3QgY2hhbm5lbCwgc2l6ZV90IGZyYW1lKSBjb25zdCB7CisgICAgRENIRUNLX0xUKGNoYW5uZWwsIGNoYW5uZWxzXyk7CisgICAgRENIRUNLX0xUKGZyYW1lLCBmcmFtZXNfKTsKKworICAgIGlmIChUID09IGtJbnRlcmxlYXZlZCkgeworICAgICAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bMF0gKworICAgICAgICAgICAgIHNpemVvZihTYW1wbGVUeXBlTmFtZSkgKiAoY2hhbm5lbHNfICogZnJhbWUgKyBjaGFubmVsKTsKKyAgICB9IGVsc2UgaWYgKFQgPT0ga1BsYW5hcikgeworICAgICAgcmV0dXJuIGNoYW5uZWxfZGF0YV9bY2hhbm5lbF0gKyBzaXplb2YoU2FtcGxlVHlwZU5hbWUpICogZnJhbWU7CisgICAgfSBlbHNlIHsKKyAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICB9CisKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTYW1wbGVUeXBlTmFtZSwgU3RvcmFnZVR5cGUgVD4KKyAgaW5saW5lIFNhbXBsZVR5cGVOYW1lIEdldFNhbXBsZUZvclR5cGUoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSkgY29uc3QgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTYW1wbGVUeXBlTmFtZSo+KAorICAgICAgICBHZXRTYW1wbGVQdHJGb3JUeXBlPFNhbXBsZVR5cGVOYW1lLCBUPihjaGFubmVsLCBmcmFtZSkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFNvdXJjZVNhbXBsZVR5cGUsIHR5cGVuYW1lIERlc3RTYW1wbGVUeXBlLAorICAgICAgICAgICAgU3RvcmFnZVR5cGUgU291cmNlU3RvcmFnZVR5cGUsIFN0b3JhZ2VUeXBlIERlc3RTdG9yYWdlVHlwZT4KKyAgdm9pZCBNaXhGb3JUeXBlcyhjb25zdCBTaGVsbEF1ZGlvQnVzJiBzb3VyY2UpOworCisgcHJpdmF0ZToKKyAgdm9pZCBTZXRGbG9hdDMyU2FtcGxlKHNpemVfdCBjaGFubmVsLCBzaXplX3QgZnJhbWUsIGZsb2F0IHNhbXBsZSkgeworICAgIERDSEVDS19FUShzYW1wbGVfdHlwZV8sIGtGbG9hdDMyKTsKKyAgICAqcmVpbnRlcnByZXRfY2FzdDxmbG9hdCo+KEdldFNhbXBsZVB0cihjaGFubmVsLCBmcmFtZSkpID0gc2FtcGxlOworICB9CisgIHVpbnQ4KiBHZXRTYW1wbGVQdHIoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSk7CisgIGNvbnN0IHVpbnQ4KiBHZXRTYW1wbGVQdHIoc2l6ZV90IGNoYW5uZWwsIHNpemVfdCBmcmFtZSkgY29uc3Q7CisKKyAgLy8gQ29udGlndW91cyBibG9jayBvZiBjaGFubmVsIG1lbW9yeSBpZiB0aGUgbWVtb3J5IGlzIG93bmVkIGJ5IHRoaXMgb2JqZWN0LgorICBzY29wZWRfcHRyX21hbGxvYzx1aW50OCwgYmFzZTo6U2NvcGVkUHRyQWxpZ25lZEZyZWU+IGRhdGFfOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4Kj4gY2hhbm5lbF9kYXRhXzsKKyAgc2l6ZV90IGNoYW5uZWxzXzsKKyAgc2l6ZV90IGZyYW1lc187CisgIFNhbXBsZVR5cGUgc2FtcGxlX3R5cGVfOworICBTdG9yYWdlVHlwZSBzdG9yYWdlX3R5cGVfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTaGVsbEF1ZGlvQnVzKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX1NIRUxMX0FVRElPX0JVU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjgxYjBjZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuY2MKQEAgLTAsMCArMSwxMDggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCIKKworI2luY2x1ZGUgPGxpbWl0cy5oPiAgLy8gZm9yIFVMTE9OR19NQVgKKworbmFtZXNwYWNlIG1lZGlhIHsKKworY29uc3QgaW50IFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6a1JlYWRFcnJvciA9IERhdGFTb3VyY2U6OmtSZWFkRXJyb3I7CisKK1NoZWxsRGF0YVNvdXJjZVJlYWRlcjo6U2hlbGxEYXRhU291cmNlUmVhZGVyKCkKKyAgICA6IGRhdGFfc291cmNlXyhOVUxMKSwKKyAgICAgIGJsb2NraW5nX3JlYWRfZXZlbnRfKGZhbHNlLCBmYWxzZSksCisgICAgICBmaWxlX3NpemVfKC0xKSwKKyAgICAgIHJlYWRfaGFzX2ZhaWxlZF8oZmFsc2UpLAorICAgICAgbGFzdF9ieXRlc19yZWFkXygwKSB7fQorCitTaGVsbERhdGFTb3VyY2VSZWFkZXI6On5TaGVsbERhdGFTb3VyY2VSZWFkZXIoKSB7fQorCit2b2lkIFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6U2V0RGF0YVNvdXJjZShEYXRhU291cmNlKiBkYXRhX3NvdXJjZSkgeworICBEQ0hFQ0soZGF0YV9zb3VyY2UpOworICBkYXRhX3NvdXJjZV8gPSBkYXRhX3NvdXJjZTsKK30KKworLy8gY3VycmVudGx5IG9ubHkgc2luZ2xlLXRocmVhZGVkIHJlYWRzIHN1cHBvcnRlZAoraW50IFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6QmxvY2tpbmdSZWFkKGludDY0IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDgqIGRhdGEpIHsKKyAgLy8gcmVhZCBmYWlsdXJlcyBhcmUgdW5yZWNvdmVyYWJsZSwgYWxsIHN1YnNlcXVlbnQgcmVhZHMgd2lsbCBhbHNvIGZhaWwKKyAgaWYgKHJlYWRfaGFzX2ZhaWxlZF8pIHsKKyAgICByZXR1cm4ga1JlYWRFcnJvcjsKKyAgfQorCisgIC8vIGNoZWNrIGJvdW5kcyBvZiByZWFkIGF0IG9yIHBhc3QgRU9GCisgIGlmIChmaWxlX3NpemVfID49IDAgJiYgcG9zaXRpb24gPj0gZmlsZV9zaXplXykgeworICAgIHJldHVybiAwOworICB9CisKKyAgaW50IHRvdGFsX2J5dGVzX3JlYWQgPSAwOworICB3aGlsZSAoc2l6ZSA+IDAgJiYgIXJlYWRfaGFzX2ZhaWxlZF8pIHsKKyAgICBkYXRhX3NvdXJjZV8tPlJlYWQoCisgICAgICAgIHBvc2l0aW9uLCBzaXplLCBkYXRhLAorICAgICAgICBiYXNlOjpCaW5kKCZTaGVsbERhdGFTb3VyY2VSZWFkZXI6OkJsb2NraW5nUmVhZENvbXBsZXRlZCwgdGhpcykpOworCisgICAgLy8gd2FpdCBmb3IgY2FsbGJhY2sgb24gcmVhZCBjb21wbGV0aW9uCisgICAgYmxvY2tpbmdfcmVhZF9ldmVudF8uV2FpdCgpOworCisgICAgaWYgKGxhc3RfYnl0ZXNfcmVhZF8gPT0gRGF0YVNvdXJjZTo6a1JlYWRFcnJvcikgeworICAgICAgLy8gbWFrZSBhbGwgZnV0dXJlIHJlYWRzIGZhaWwKKyAgICAgIHJlYWRfaGFzX2ZhaWxlZF8gPSB0cnVlOworICAgICAgcmV0dXJuIGtSZWFkRXJyb3I7CisgICAgfQorCisgICAgRENIRUNLX0xFKGxhc3RfYnl0ZXNfcmVhZF8sIHNpemUpOworICAgIGlmIChsYXN0X2J5dGVzX3JlYWRfID4gc2l6ZSkgeworICAgICAgLy8gbWFrZSBhbGwgZnV0dXJlIHJlYWRzIGZhaWwKKyAgICAgIHJlYWRfaGFzX2ZhaWxlZF8gPSB0cnVlOworICAgICAgcmV0dXJuIGtSZWFkRXJyb3I7CisgICAgfQorCisgICAgLy8gQXZvaWQgZW50ZXJpbmcgYW4gZW5kbGVzcyBsb29wIGhlcmUuCisgICAgaWYgKGxhc3RfYnl0ZXNfcmVhZF8gPT0gMCkgYnJlYWs7CisKKyAgICB0b3RhbF9ieXRlc19yZWFkICs9IGxhc3RfYnl0ZXNfcmVhZF87CisgICAgcG9zaXRpb24gKz0gbGFzdF9ieXRlc19yZWFkXzsKKyAgICBzaXplIC09IGxhc3RfYnl0ZXNfcmVhZF87CisgICAgZGF0YSArPSBsYXN0X2J5dGVzX3JlYWRfOworICB9CisKKyAgaWYgKHJlYWRfaGFzX2ZhaWxlZF8pIHsKKyAgICByZXR1cm4ga1JlYWRFcnJvcjsKKyAgfQorICByZXR1cm4gdG90YWxfYnl0ZXNfcmVhZDsKK30KKwordm9pZCBTaGVsbERhdGFTb3VyY2VSZWFkZXI6OlN0b3AoKSB7CisgIGlmIChkYXRhX3NvdXJjZV8pIHsKKyAgICBkYXRhX3NvdXJjZV8tPlN0b3AoKTsKKyAgICBkYXRhX3NvdXJjZV8gPSBOVUxMOworICB9Cit9CisKK3ZvaWQgU2hlbGxEYXRhU291cmNlUmVhZGVyOjpCbG9ja2luZ1JlYWRDb21wbGV0ZWQoaW50IGJ5dGVzX3JlYWQpIHsKKyAgbGFzdF9ieXRlc19yZWFkXyA9IGJ5dGVzX3JlYWQ7CisgIC8vIHdha2UgdXAgYmxvY2tlZCB0aHJlYWQKKyAgYmxvY2tpbmdfcmVhZF9ldmVudF8uU2lnbmFsKCk7Cit9CisKK2ludDY0IFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6RmlsZVNpemUoKSB7CisgIGlmIChmaWxlX3NpemVfID09IC0xKSB7CisgICAgaWYgKCFkYXRhX3NvdXJjZV8tPkdldFNpemUoJmZpbGVfc2l6ZV8pKSB7CisgICAgICBmaWxlX3NpemVfID0gLTE7CisgICAgfQorICB9CisgIHJldHVybiBmaWxlX3NpemVfOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTExZTMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oCkBAIC0wLDAgKzEsNjkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX0JBU0VfU0hFTExfREFUQV9TT1VSQ0VfUkVBREVSX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9CQVNFX1NIRUxMX0RBVEFfU09VUkNFX1JFQURFUl9IXworCisjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCisjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kYXRhX3NvdXJjZS5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCisvLyBBbGxvd3Mgc2hhcmluZyBvZiBhIERhdGFTb3VyY2Ugb2JqZWN0IGJldHdlZW4gbXVsdGlwbGUgb2JqZWN0cyBvbiBhIHNpbmdsZQorLy8gdGhyZWFkLCBhbmQgZXhwb3NlcyBhIHNpbXBsZSBCbG9ja2luZ1JlYWQoKSBtZXRob2QgdG8gYmxvY2sgdGhlIHRocmVhZCB1bnRpbAorLy8gZGF0YSBpcyBhdmFpbGFibGUgb3IgZXJyb3IuIFRvIGF2b2lkIGNpcmN1bGFyIHNtYXJ0IHBvaW50ZXIgcmVmZXJlbmNlcyB0aGlzCisvLyBvYmplY3QgaXMgYWxzbyB0aGUgc29sZSBvd25lciBvZiBhIHBvaW50ZXIgdG8gRGF0YVNvdXJjZS4gIElmIHdlIHdhbnQgdG8gYWRkCisvLyBhc3luY2hyb25vdXMgcmVhZGluZyB0byB0aGlzIG9iamVjdCBpdCB3aWxsIG5lZWQgaXRzIG93biB0aHJlYWQgYW5kIGEKKy8vIGNhbGxiYWNrIHF1ZXVlLgorY2xhc3MgU2hlbGxEYXRhU291cmNlUmVhZGVyCisgICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2hlbGxEYXRhU291cmNlUmVhZGVyPiB7CisgcHVibGljOgorICBzdGF0aWMgY29uc3QgaW50IGtSZWFkRXJyb3I7CisKKyAgU2hlbGxEYXRhU291cmNlUmVhZGVyKCk7CisgIHZpcnR1YWwgdm9pZCBTZXREYXRhU291cmNlKERhdGFTb3VyY2UqIGRhdGFfc291cmNlKTsKKworICAvLyBCbG9jayB0aGUgY2FsbGluZyB0aHJlYWQncyBtZXNzYWdlIGxvb3AgdW50aWwgcmVhZCBpcyBjb21wbGV0ZS4KKyAgLy8gcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciBrUmVhZEVycm9yIG9uIGVycm9yLgorICAvLyBDdXJyZW50bHkgb25seSBzaW5nbGUtdGhyZWFkZWQgc3VwcG9ydC4KKyAgdmlydHVhbCBpbnQgQmxvY2tpbmdSZWFkKGludDY0IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDgqIGRhdGEpOworCisgIC8vIHJldHVybnMgc2l6ZSBvZiBmaWxlIGluIGJ5dGVzLCBvciAtMSBpZiBmaWxlIHNpemUgbm90IGtub3duLiBJZiBlcnJvciB3aWxsCisgIC8vIHJldHJ5IGdldHRpbmcgZmlsZSBzaXplIG9uIHN1YnNlcXVlbnQgY2FsbHMgdG8gRmlsZVNpemUoKS4KKyAgdmlydHVhbCBpbnQ2NCBGaWxlU2l6ZSgpOworCisgIC8vIGFib3J0IGFueSBwZW5kaW5nIHJlYWQsIHRoZW4gc3RvcCB0aGUgZGF0YSBzb3VyY2UKKyAgdmlydHVhbCB2b2lkIFN0b3AoKTsKKworIHByb3RlY3RlZDoKKyAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj47CisgIHZpcnR1YWwgflNoZWxsRGF0YVNvdXJjZVJlYWRlcigpOworICAvLyBibG9ja2luZyByZWFkIGNhbGxiYWNrCisgIHZpcnR1YWwgdm9pZCBCbG9ja2luZ1JlYWRDb21wbGV0ZWQoaW50IGJ5dGVzX3JlYWQpOworCisgIERhdGFTb3VyY2UqIGRhdGFfc291cmNlXzsKKyAgYmFzZTo6V2FpdGFibGVFdmVudCBibG9ja2luZ19yZWFkX2V2ZW50XzsKKyAgaW50NjQgZmlsZV9zaXplXzsKKyAgYm9vbCByZWFkX2hhc19mYWlsZWRfOworICBpbnQgbGFzdF9ieXRlc19yZWFkXzsgIC8vIHByb3RlY3RlZCBpbXBsaWNpdGx5IGJ5IGJsb2NraW5nX3JlYWRfZXZlbnRfCit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfQkFTRV9TSEVMTF9EQVRBX1NPVVJDRV9SRUFERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMWI3Y2FiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmNjCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgorCituYW1lc3BhY2UgeworCittZWRpYTo6U2hlbGxNZWRpYVBsYXRmb3JtKiBzX3NoZWxsX21lZGlhX3BsYXRmb3JtXzsKKworfSAgLy8gbmFtZXNwYWNlCisKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vIHN0YXRpYworU2hlbGxNZWRpYVBsYXRmb3JtKiBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCkgeworICByZXR1cm4gc19zaGVsbF9tZWRpYV9wbGF0Zm9ybV87Cit9CisKKy8vIHN0YXRpYwordm9pZCBTaGVsbE1lZGlhUGxhdGZvcm06OlNldEluc3RhbmNlKFNoZWxsTWVkaWFQbGF0Zm9ybSogc2hlbGxfbWVkaWFfcGxhdGZvcm0pIHsKKyAgc19zaGVsbF9tZWRpYV9wbGF0Zm9ybV8gPSBzaGVsbF9tZWRpYV9wbGF0Zm9ybTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlNDc3ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaApAQCAtMCwwICsxLDEwNSBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfQkFTRV9TSEVMTF9NRURJQV9QTEFURk9STV9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9TSEVMTF9NRURJQV9QTEFURk9STV9IXworCisjaW5jbHVkZSAiYmFzZS9iYXNpY3R5cGVzLmgiCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2xpbWl0cy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gVGhpcyBjbGFzcyBpcyBtZWFudCB0byBiZSB0aGUgc2luZ2xlIHBvaW50IHRvIGF0dGFjaCBwbGF0Zm9ybSBzcGVjaWZpYyBtZWRpYQorLy8gY2xhc3NlcyBhbmQgc2V0dGluZ3MuIEVhY2ggcGxhdGZvcm0gc2hvdWxkIGltcGxlbWVudCBpdHMgb3duIGltcGxlbWVudGF0aW9uCisvLyBhbmQgcHJvdmlkZSBpdCB0aHJvdWdoIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UuCitjbGFzcyBNRURJQV9FWFBPUlQgU2hlbGxNZWRpYVBsYXRmb3JtIHsKKyBwdWJsaWM6CisgIFNoZWxsTWVkaWFQbGF0Zm9ybSgpIHt9CisgIHZpcnR1YWwgflNoZWxsTWVkaWFQbGF0Zm9ybSgpIHt9CisKKyAgLy8gSW5kaXZpZHVhbCBwbGF0Zm9ybXMgc2hvdWxkIGltcGxlbWVudCB0aGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgdG8KKyAgLy8gZW5zdXJlIHRoYXQgYSB2YWxpZCBTaGVsbE1lZGlhUGxhdGZvcm0gaW5zdGFuY2UgaXMgYXZhaWxhYmxlIGR1cmluZyB0aGUKKyAgLy8gbGlmZSB0aW1lIG9mIG1lZGlhIHN0YWNrCisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemUoKTsKKyAgc3RhdGljIHZvaWQgVGVybWluYXRlKCk7CisKKyAgc3RhdGljIFNoZWxsTWVkaWFQbGF0Zm9ybSogSW5zdGFuY2UoKTsKKworICAvLyBUaGUgZm9sbG93aW5nIGZ1bmN0aW9ucyB3aWxsIGJlIGNhbGxlZCB3aGVuIHRoZSBhcHBsaWNhdGlvbiBlbnRlcnMgb3IKKyAgLy8gbGVhdmVzIHN1c3BlbmRpbmcgc3RhdHVzLgorICB2aXJ0dWFsIHZvaWQgU3VzcGVuZCgpIHt9CisgIHZpcnR1YWwgdm9pZCBSZXN1bWUoKSB7fQorCisgIC8vIE1lZGlhIHN0YWNrIGJ1ZmZlciBhbGxvY2F0ZS9mcmVlIGZ1bmN0aW9ucyBjdXJyZW50bHkgb25seSB1c2VkIGJ5CisgIC8vIFNoZWxsQnVmZmVyRmFjdG9yeS4KKyAgdmlydHVhbCB2b2lkKiBBbGxvY2F0ZUJ1ZmZlcihzaXplX3Qgc2l6ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgRnJlZUJ1ZmZlcih2b2lkKiBwdHIpID0gMDsKKworICAvLyBUaGUgbWF4aW11bSBhdWRpbyBhbmQgdmlkZW8gYnVmZmVyIHNpemUgdXNlZCBieSBTb3VyY2VCdWZmZXJTdHJlYW0uCisgIC8vIFNlZSBpbXBsZW1lbnRhdGlvbiBvZiBTb3VyY2VCdWZmZXJTdHJlYW0gZm9yIG1vcmUgZGV0YWlscy4KKyAgdmlydHVhbCBzaXplX3QgR2V0U291cmNlQnVmZmVyU3RyZWFtQXVkaW9NZW1vcnlMaW1pdCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBzaXplX3QgR2V0U291cmNlQnVmZmVyU3RyZWFtVmlkZW9NZW1vcnlMaW1pdCgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8U2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI+IEdldFZpZGVvRnJhbWVQcm92aWRlcigpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMworICB2aXJ0dWFsIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIEdldFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIoKSB7IHJldHVybiBOVUxMOyB9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKKworICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBiZWZvcmUgdGhlIGRlY29kZXIgYnVmZmVyIGxlYXZlcyB0aGUgZGVtdXhlciBhbmQKKyAgLy8gaXMgYmVpbmcgc2VudCB0byB0aGUgbWVkaWEgcGlwZWxpbmUgZm9yIGRlY3J5cHRpbmcgYW5kIGRlY29kaW5nLiBUaGUKKyAgLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBzaW1wbHkgcmV0dXJucyB0aGUgYnVmZmVyIGluZGljYXRlaW5nIHRoYXQgdGhlcmUgaXMKKyAgLy8gbm8gcHJvY2Vzc2luZyBuZWNlc3NhcnkuCisgIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBQcm9jZXNzQmVmb3JlTGVhdmluZ0RlbXV4ZXIoCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIpIHsKKyAgICByZXR1cm4gYnVmZmVyOworICB9CisKKyBwcm90ZWN0ZWQ6CisgIHN0YXRpYyB2b2lkIFNldEluc3RhbmNlKFNoZWxsTWVkaWFQbGF0Zm9ybSogc2hlbGxfbWVkaWFfcGxhdGZvcm0pOworCisgcHJpdmF0ZToKKyAgLy8gUGxhdGZvcm0gc3BlY2lmaWMgbWVkaWEgSW5pdCBhbmQgVGVhciBkb3duLgorICB2aXJ0dWFsIHZvaWQgSW50ZXJuYWxJbml0aWFsaXplKCkge30KKyAgdmlydHVhbCB2b2lkIEludGVybmFsVGVybWluYXRlKCkge30KKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oU2hlbGxNZWRpYVBsYXRmb3JtKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZGVmaW5lIFJFR0lTVEVSX1NIRUxMX01FRElBX1BMQVRGT1JNKENsYXNzTmFtZSkgXAorICBuYW1lc3BhY2UgbWVkaWEgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdm9pZCBTaGVsbE1lZGlhUGxhdGZvcm06OkluaXRpYWxpemUoKSB7ICAgICAgICBcCisgICAgRENIRUNLKCFJbnN0YW5jZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNldEluc3RhbmNlKG5ldyBDbGFzc05hbWUpOyAgICAgICAgICAgICAgICAgIFwKKyAgICBJbnN0YW5jZSgpLT5JbnRlcm5hbEluaXRpYWxpemUoKTsgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB2b2lkIFNoZWxsTWVkaWFQbGF0Zm9ybTo6VGVybWluYXRlKCkgeyAgICAgICAgIFwKKyAgICBEQ0hFQ0soSW5zdGFuY2UoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgSW5zdGFuY2UoKS0+SW50ZXJuYWxUZXJtaW5hdGUoKTsgICAgICAgICAgICAgXAorICAgIGRlbGV0ZSBJbnN0YW5jZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBTZXRJbnN0YW5jZShOVUxMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfQkFTRV9TSEVMTF9NRURJQV9QTEFURk9STV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNDJlMWNmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgKQEAgLTAsMCArMSw5NSBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfQkFTRV9TSEVMTF9WSURFT19GUkFNRV9QUk9WSURFUl9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9TSEVMTF9WSURFT19GUkFNRV9QUk9WSURFUl9IXworCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gVE9ETzogVGhlIGZvbGxvd2luZyBjbGFzcyBpcyB0ZW50YXRpdmUgdG8gbWFrZSB0aGUgbmV3IG1lZGlhIHN0YWNrIHdvcmsuCisvLyAgICAgICBXZSBzaG91bGQgY29uc2lkZXIgcmVtb3ZlIFZpZGVvRnJhbWUgYXMgaXQgaXMgbm8gbG9uZ2VyIHVzZWZ1bC4KK2NsYXNzIFZpZGVvRnJhbWUgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8VmlkZW9GcmFtZT4geworIHB1YmxpYzoKKyAgaW50IHRleHR1cmVfaWQoKSBjb25zdCB7IHJldHVybiAwOyB9CisgIGJhc2U6OlRpbWVEZWx0YSBHZXRUaW1lc3RhbXAoKSBjb25zdCB7IHJldHVybiBiYXNlOjpUaW1lRGVsdGEoKTsgfQorfTsKKworLy8gVE9ETzogUmVtb3ZlIFNoZWxsIHByZWZpeC4KKy8vIFRoZSBTaGVsbFZpZGVvRnJhbWVQcm92aWRlciBtYW5hZ2VzIHRoZSBiYWNrbG9nIGZvciB2aWRlbyBmcmFtZXMuIEl0IGhhcyB0aGUKKy8vIGZvbGxvd2luZyBmdW5jdGlvbmFsaXRpZXM6CisvLyAxLiBJdCBjYWNoZXMgdGhlIHZpZGVvIGZyYW1lcyByZWFkeSB0byBiZSBkaXNwbGF5ZWQuCisvLyAyLiBJdCBkZWNpZGVzIHdoaWNoIGZyYW1lIHRvIGJlIGRpc3BsYXllZCBhdCB0aGUgY3VycmVudCB0aW1lLgorLy8gMy4gSXQgcmVtb3ZlcyBmcmFtZXMgdGhhdCB3aWxsIG5vIGxvbmdlciBiZSBkaXNwbGF5ZWQuCitjbGFzcyBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcgorICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyPiB7CisgcHVibGljOgorICBlbnVtIE91dHB1dE1vZGUgeworICAgIGtPdXRwdXRNb2RlUHVuY2hPdXQsCisgICAga091dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUsCisgICAga091dHB1dE1vZGVJbnZhbGlkLAorICB9OworCisgIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyKCkgOiBvdXRwdXRfbW9kZV8oa091dHB1dE1vZGVQdW5jaE91dCkge30KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPFNiRGVjb2RlVGFyZ2V0KCk+IEdldEN1cnJlbnRTYkRlY29kZVRhcmdldEZ1bmN0aW9uOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IEdldEN1cnJlbnRGcmFtZSgpIHsgcmV0dXJuIE5VTEw7IH0KKworICB2b2lkIFNldE91dHB1dE1vZGUoT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSkgeyBvdXRwdXRfbW9kZV8gPSBvdXRwdXRfbW9kZTsgfQorICBPdXRwdXRNb2RlIEdldE91dHB1dE1vZGUoKSBjb25zdCB7IHJldHVybiBvdXRwdXRfbW9kZV87IH0KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICAvLyBGb3IgU3RhcmJvYXJkIHBsYXRmb3JtcyB0aGF0IGhhdmUgYSBkZWNvZGUtdG8tdGV4dHVyZSBwbGF5ZXIsIHdlIGVuYWJsZQorICAvLyB0aGlzIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyIHRvIGFjdCBhcyBhIGJyaWRnZSBmb3IgQ29iYWx0IGNvZGUgdG8gcXVlcnkKKyAgLy8gZm9yIHRoZSBjdXJyZW50IFNiRGVjb2RlVGFyZ2V0LiAgSW4gZWZmZWN0LCB3ZSBieXBhc3MgYWxsIG9mCisgIC8vIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyJ3MgbG9naWMgaW4gdGhpcyBjYXNlLCBpbnN0ZWFkIHJlbHlpbmcgb24gdGhlCisgIC8vIFN0YXJib2FyZCBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIHVzIHdpdGggdGhlIGN1cnJlbnQgdmlkZW8gZnJhbWUgd2hlbgorICAvLyBuZWVkZWQuCisgIHZvaWQgU2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oCisgICAgICBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbiBmdW5jdGlvbikgeworICAgIGdldF9jdXJyZW50X3NiX2RlY29kZV90YXJnZXRfZnVuY3Rpb25fID0gZnVuY3Rpb247CisgIH0KKworICB2b2lkIFJlc2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oKSB7CisgICAgZ2V0X2N1cnJlbnRfc2JfZGVjb2RlX3RhcmdldF9mdW5jdGlvbl8uUmVzZXQoKTsKKyAgfQorCisgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnRTYkRlY29kZVRhcmdldCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0X2N1cnJlbnRfc2JfZGVjb2RlX3RhcmdldF9mdW5jdGlvbl8uaXNfbnVsbCgpKSB7CisgICAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGdldF9jdXJyZW50X3NiX2RlY29kZV90YXJnZXRfZnVuY3Rpb25fLlJ1bigpOworICAgIH0KKyAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworIHByaXZhdGU6CisgIE91dHB1dE1vZGUgb3V0cHV0X21vZGVfOworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbiBnZXRfY3VycmVudF9zYl9kZWNvZGVfdGFyZ2V0X2Z1bmN0aW9uXzsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX1NIRUxMX1ZJREVPX0ZSQU1FX1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXYuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oCmluZGV4IDUxYzVjMDQuLjlmYmYxODkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaW1kL2NvbnZlcnRfcmdiX3RvX3l1di5oCkBAIC0xNSw2NCArMTUsMzYgQEAKIC8vIG9ubHkgY2FsbCB0aGUgbWV0aG9kcyBsaXN0ZWQgaW4geXV2X2NvbnZlcnQuaC4KIAogTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFJHQjMyVG9ZVVZfU1NTRTMoY29uc3QgdWludDhfdCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHlwbGFuZSwgdWludDhfdCogdXBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdnBsYW5lLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LCBpbnQgcmdic3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsIGludCB1dnN0cmlkZSk7CiAKIE1FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRSR0IyNFRvWVVWX1NTU0UzKGNvbnN0IHVpbnQ4X3QqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB5cGxhbmUsIHVpbnQ4X3QqIHVwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZwbGFuZSwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHJnYnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLCBpbnQgdXZzdHJpZGUpOwogCiBNRURJQV9FWFBPUlQgdm9pZCBDb252ZXJ0UkdCMzJUb1lVVl9TU0UyKGNvbnN0IHVpbnQ4X3QqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB5cGxhbmUsIHVpbnQ4X3QqIHVwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdnBsYW5lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsIGludCB5c3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpOwogCi1NRURJQV9FWFBPUlQgdm9pZCBDb252ZXJ0UkdCMzJUb1lVVl9TU0UyX1JlZmVyZW5jZShjb25zdCB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpOworTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFJHQjMyVG9ZVVZfU1NFMl9SZWZlcmVuY2UoCisgICAgY29uc3QgdWludDhfdCogcmdiZnJhbWUsIHVpbnQ4X3QqIHlwbGFuZSwgdWludDhfdCogdXBsYW5lLCB1aW50OF90KiB2cGxhbmUsCisgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgcmdic3RyaWRlLCBpbnQgeXN0cmlkZSwgaW50IHV2c3RyaWRlKTsKIAotTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFJHQjMyVG9ZVVZfQyhjb25zdCB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKTsKK01FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRSR0IzMlRvWVVWX0MoY29uc3QgdWludDhfdCogcmdiZnJhbWUsIHVpbnQ4X3QqIHlwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdXBsYW5lLCB1aW50OF90KiB2cGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHJnYnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsIGludCB1dnN0cmlkZSk7CiAKLU1FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRSR0IyNFRvWVVWX0MoY29uc3QgdWludDhfdCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSk7CitNRURJQV9FWFBPUlQgdm9pZCBDb252ZXJ0UkdCMjRUb1lVVl9DKGNvbnN0IHVpbnQ4X3QqIHJnYmZyYW1lLCB1aW50OF90KiB5cGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHVwbGFuZSwgdWludDhfdCogdnBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCByZ2JzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLCBpbnQgdXZzdHJpZGUpOwogCiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NpbWQvY29udmVydF9yZ2JfdG9feXV2X3Nzc2UzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfc3NzZTMuaAppbmRleCBlYTk1ZWU2Li40NDY0NWY5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfc3NzZTMuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3JnYl90b195dXZfc3NzZTMuaApAQCAtMjMsMTggKzIzLDEyIEBACiAvLyBpc3N1ZSBvbiBhdCBsZWFzdCBXaW42NC4KIAogLy8gQ29udmVydCBhIHJvdyBvZiAyNC1iaXQgUkdCIHBpeGVscyB0byBZVjEyIHBpeGVscy4KLXZvaWQgQ29udmVydFJHQlRvWVVWUm93X1NTU0UzKGNvbnN0IHVpbnQ4X3QqIHJnYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3aWR0aCk7Cit2b2lkIENvbnZlcnRSR0JUb1lVVlJvd19TU1NFMyhjb25zdCB1aW50OF90KiByZ2IsIHVpbnQ4X3QqIHksIHVpbnQ4X3QqIHUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB2LCBwdHJkaWZmX3Qgd2lkdGgpOwogCiAvLyBDb252ZXJ0IGEgcm93IG9mIDMyLWJpdCBSR0IgcGl4ZWxzIHRvIFlWMTIgcGl4ZWxzLgotdm9pZCBDb252ZXJ0QVJHQlRvWVVWUm93X1NTU0UzKGNvbnN0IHVpbnQ4X3QqIGFyZ2IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoKTsKK3ZvaWQgQ29udmVydEFSR0JUb1lVVlJvd19TU1NFMyhjb25zdCB1aW50OF90KiBhcmdiLCB1aW50OF90KiB5LCB1aW50OF90KiB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHYsIHB0cmRpZmZfdCB3aWR0aCk7CiAKICNpZmRlZiBfX2NwbHVzcGx1cwogfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NpbWQvY29udmVydF95dXZfdG9fcmdiLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2IuaAppbmRleCBjOThhMGFjLi4yZWZkYWE1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2IuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9jb252ZXJ0X3l1dl90b19yZ2IuaApAQCAtMTcsOTEgKzE3LDU3IEBACiAKIE1FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRZVVZUb1JHQjMyX0MoY29uc3QgdWludDhfdCogeXBsYW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdnBsYW5lLCB1aW50OF90KiByZ2JmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LCBpbnQgeXN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlLCBpbnQgcmdic3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVZUeXBlIHl1dl90eXBlKTsKIAogTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFlVVlRvUkdCMzJSb3dfQyhjb25zdCB1aW50OF90KiB5cGxhbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVwbGFuZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JmcmFtZSwgcHRyZGlmZl90IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjb252ZXJ0X3RhYmxlKTsKIAotTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFlVVkFUb0FSR0JfQyhjb25zdCB1aW50OF90KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhcGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSk7CitNRURJQV9FWFBPUlQgdm9pZCBDb252ZXJ0WVVWQVRvQVJHQl9DKAorICAgIGNvbnN0IHVpbnQ4X3QqIHlwbGFuZSwgY29uc3QgdWludDhfdCogdXBsYW5lLCBjb25zdCB1aW50OF90KiB2cGxhbmUsCisgICAgY29uc3QgdWludDhfdCogYXBsYW5lLCB1aW50OF90KiByZ2JmcmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgIGludCB5c3RyaWRlLCBpbnQgdXZzdHJpZGUsIGludCBhdnN0cmlkZSwgaW50IHJnYnN0cmlkZSwgWVVWVHlwZSB5dXZfdHlwZSk7CiAKIE1FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRZVVZBVG9BUkdCUm93X0MoY29uc3QgdWludDhfdCogeXBsYW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1cGxhbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JmcmFtZSwgcHRyZGlmZl90IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjb252ZXJ0X3RhYmxlKTsKIAogTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFlVVlRvUkdCMzJfU1NFKGNvbnN0IHVpbnQ4X3QqIHlwbGFuZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1cGxhbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFlVVlR5cGUgeXV2X3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJnYmZyYW1lLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHlzdHJpZGUsIGludCB1dnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLCBZVVZUeXBlIHl1dl90eXBlKTsKIAotTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFlVVkFUb0FSR0JfTU1YKGNvbnN0IHVpbnQ4X3QqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF2c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSk7CitNRURJQV9FWFBPUlQgdm9pZCBDb252ZXJ0WVVWQVRvQVJHQl9NTVgoCisgICAgY29uc3QgdWludDhfdCogeXBsYW5lLCBjb25zdCB1aW50OF90KiB1cGxhbmUsIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwKKyAgICBjb25zdCB1aW50OF90KiBhcGxhbmUsIHVpbnQ4X3QqIHJnYmZyYW1lLCBpbnQgd2lkdGgsIGludCBoZWlnaHQsCisgICAgaW50IHlzdHJpZGUsIGludCB1dnN0cmlkZSwgaW50IGF2c3RyaWRlLCBpbnQgcmdic3RyaWRlLCBZVVZUeXBlIHl1dl90eXBlKTsKIAogTUVESUFfRVhQT1JUIHZvaWQgU2NhbGVZVVZUb1JHQjMyUm93X0MoY29uc3QgdWludDhfdCogeV9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzb3VyY2VfZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2X2J1ZiwgdWludDhfdCogcmdiX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCB3aWR0aCwgcHRyZGlmZl90IHNvdXJjZV9keCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnZlcnRfdGFibGUpOwogCiBNRURJQV9FWFBPUlQgdm9pZCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dfQyhjb25zdCB1aW50OF90KiB5X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiX2J1ZiwgcHRyZGlmZl90IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHNvdXJjZV9keCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnZlcnRfdGFibGUpOwogCiBNRURJQV9FWFBPUlQgdm9pZCBMaW5lYXJTY2FsZVlVVlRvUkdCMzJSb3dXaXRoUmFuZ2VfQygKLSAgICBjb25zdCB1aW50OF90KiB5X2J1ZiwKLSAgICBjb25zdCB1aW50OF90KiB1X2J1ZiwKLSAgICBjb25zdCB1aW50OF90KiB2X2J1ZiwKLSAgICB1aW50OF90KiByZ2JfYnVmLAotICAgIGludCBkZXN0X3dpZHRoLAotICAgIGludCBzb3VyY2VfeCwKLSAgICBpbnQgc291cmNlX2R4LAorICAgIGNvbnN0IHVpbnQ4X3QqIHlfYnVmLCBjb25zdCB1aW50OF90KiB1X2J1ZiwgY29uc3QgdWludDhfdCogdl9idWYsCisgICAgdWludDhfdCogcmdiX2J1ZiwgaW50IGRlc3Rfd2lkdGgsIGludCBzb3VyY2VfeCwgaW50IHNvdXJjZV9keCwKICAgICBjb25zdCBpbnQxNl90KiBjb252ZXJ0X3RhYmxlKTsKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCkBAIC0xMjAsNDggKzg2LDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXBsYW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhcGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJnYmZyYW1lLCBwdHJkaWZmX3Qgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogY29udmVydF90YWJsZSk7CiAKIE1FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRZVVZUb1JHQjMyUm93X1NTRShjb25zdCB1aW50OF90KiB5cGxhbmUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXBsYW5lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiZnJhbWUsIHB0cmRpZmZfdCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjb252ZXJ0X3RhYmxlKTsKIAogTUVESUFfRVhQT1JUIHZvaWQgU2NhbGVZVVZUb1JHQjMyUm93X1NTRShjb25zdCB1aW50OF90KiB5X2J1ZiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzb3VyY2VfZHgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZfYnVmLCB1aW50OF90KiByZ2JfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgd2lkdGgsIHB0cmRpZmZfdCBzb3VyY2VfZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDE2X3QqIGNvbnZlcnRfdGFibGUpOwogCiBNRURJQV9FWFBPUlQgdm9pZCBTY2FsZVlVVlRvUkdCMzJSb3dfU1NFMl9YNjQoY29uc3QgdWludDhfdCogeV9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdV9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdl9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiX2J1ZiwgcHRyZGlmZl90IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cmRpZmZfdCBzb3VyY2VfZHgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50MTZfdCogY29udmVydF90YWJsZSk7CiAKLU1FRElBX0VYUE9SVCB2b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19TU0UoY29uc3QgdWludDhfdCogeV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVfYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2X2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJkaWZmX3Qgc291cmNlX2R4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQxNl90KiBjb252ZXJ0X3RhYmxlKTsKK01FRElBX0VYUE9SVCB2b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19TU0UoCisgICAgY29uc3QgdWludDhfdCogeV9idWYsIGNvbnN0IHVpbnQ4X3QqIHVfYnVmLCBjb25zdCB1aW50OF90KiB2X2J1ZiwKKyAgICB1aW50OF90KiByZ2JfYnVmLCBwdHJkaWZmX3Qgd2lkdGgsIHB0cmRpZmZfdCBzb3VyY2VfZHgsCisgICAgY29uc3QgaW50MTZfdCogY29udmVydF90YWJsZSk7CiAKIE1FRElBX0VYUE9SVCB2b2lkIExpbmVhclNjYWxlWVVWVG9SR0IzMlJvd19NTVhfWDY0KAotICAgIGNvbnN0IHVpbnQ4X3QqIHlfYnVmLAotICAgIGNvbnN0IHVpbnQ4X3QqIHVfYnVmLAotICAgIGNvbnN0IHVpbnQ4X3QqIHZfYnVmLAotICAgIHVpbnQ4X3QqIHJnYl9idWYsCi0gICAgcHRyZGlmZl90IHdpZHRoLAotICAgIHB0cmRpZmZfdCBzb3VyY2VfZHgsCisgICAgY29uc3QgdWludDhfdCogeV9idWYsIGNvbnN0IHVpbnQ4X3QqIHVfYnVmLCBjb25zdCB1aW50OF90KiB2X2J1ZiwKKyAgICB1aW50OF90KiByZ2JfYnVmLCBwdHJkaWZmX3Qgd2lkdGgsIHB0cmRpZmZfdCBzb3VyY2VfZHgsCiAgICAgY29uc3QgaW50MTZfdCogY29udmVydF90YWJsZSk7CiAKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaW1kL2ZpbHRlcl95dXYuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zaW1kL2ZpbHRlcl95dXYuaAppbmRleCBmNzViZmNkLi42ZjI0MjU2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc2ltZC9maWx0ZXJfeXV2LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3NpbWQvZmlsdGVyX3l1di5oCkBAIC0xNCwxNiArMTQsMTIgQEAKIC8vIFRoZXNlIG1ldGhvZHMgYXJlIGV4cG9ydGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzIG9ubHkuICBMaWJyYXJ5IHVzZXJzIHNob3VsZAogLy8gb25seSBjYWxsIHRoZSBtZXRob2RzIGxpc3RlZCBpbiB5dXZfY29udmVydC5oLgogCi1NRURJQV9FWFBPUlQgdm9pZCBGaWx0ZXJZVVZSb3dzX0ModWludDhfdCogeWJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB5MF9wdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogeTFfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfd2lkdGgsCitNRURJQV9FWFBPUlQgdm9pZCBGaWx0ZXJZVVZSb3dzX0ModWludDhfdCogeWJ1ZiwgY29uc3QgdWludDhfdCogeTBfcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHkxX3B0ciwgaW50IHNvdXJjZV93aWR0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHNvdXJjZV95X2ZyYWN0aW9uKTsKIAotTUVESUFfRVhQT1JUIHZvaWQgRmlsdGVyWVVWUm93c19TU0UyKHVpbnQ4X3QqIHlidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogeTBfcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHkxX3B0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX3dpZHRoLAorTUVESUFfRVhQT1JUIHZvaWQgRmlsdGVyWVVWUm93c19TU0UyKHVpbnQ4X3QqIHlidWYsIGNvbnN0IHVpbnQ4X3QqIHkwX3B0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB5MV9wdHIsIGludCBzb3VyY2Vfd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCBzb3VyY2VfeV9mcmFjdGlvbik7CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODJjYzdkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MKQEAgLTAsMCArMSw1MTEgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL2xvY2F0aW9uLmgiCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworU3RhcmJvYXJkUGxheWVyOjpTdGFyYm9hcmRQbGF5ZXIoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAorICAgIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fY29uZmlnLAorICAgIGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgdmlkZW9fY29uZmlnLCBTYldpbmRvdyB3aW5kb3csCisgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwgSG9zdCogaG9zdCwKKyAgICBTYlBsYXllclNldEJvdW5kc0hlbHBlciogc2V0X2JvdW5kc19oZWxwZXIpCisgICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCisgICAgICBhdWRpb19jb25maWdfKGF1ZGlvX2NvbmZpZyksCisgICAgICB2aWRlb19jb25maWdfKHZpZGVvX2NvbmZpZyksCisgICAgICB3aW5kb3dfKHdpbmRvdyksCisgICAgICBkcm1fc3lzdGVtXyhkcm1fc3lzdGVtKSwKKyAgICAgIGhvc3RfKGhvc3QpLAorICAgICAgc2V0X2JvdW5kc19oZWxwZXJfKHNldF9ib3VuZHNfaGVscGVyKSwKKyAgICAgIHdlYWtfdGhpc18oQXNXZWFrUHRyKCkpLAorICAgICAgZnJhbWVfd2lkdGhfKDEpLAorICAgICAgZnJhbWVfaGVpZ2h0XygxKSwKKyAgICAgIHRpY2tldF8oU0JfUExBWUVSX0lOSVRJQUxfVElDS0VUKSwKKyAgICAgIHZvbHVtZV8oMS4wKSwKKyAgICAgIHBsYXliYWNrX3JhdGVfKDAuMCksCisgICAgICBzZWVrX3BlbmRpbmdfKGZhbHNlKSwKKyAgICAgIHN0YXRlXyhrUGxheWluZykgeworICBEQ0hFQ0soYXVkaW9fY29uZmlnLklzVmFsaWRDb25maWcoKSk7CisgIERDSEVDSyh2aWRlb19jb25maWcuSXNWYWxpZENvbmZpZygpKTsKKyAgRENIRUNLKGhvc3RfKTsKKyAgRENIRUNLKHNldF9ib3VuZHNfaGVscGVyXyk7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgb3V0cHV0X21vZGVfID0gQ29tcHV0ZVNiUGxheWVyT3V0cHV0TW9kZSgKKyAgICAgIE1lZGlhVmlkZW9Db2RlY1RvU2JNZWRpYVZpZGVvQ29kZWModmlkZW9fY29uZmlnLmNvZGVjKCkpLCBkcm1fc3lzdGVtKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKKyAgQ3JlYXRlUGxheWVyKCk7CisKKyAgbWVzc2FnZV9sb29wLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJlN0YXJib2FyZFBsYXllcjo6Q2xlYXJEZWNvZGVyQnVmZmVyQ2FjaGUsIHdlYWtfdGhpc18pKTsKK30KKworU3RhcmJvYXJkUGxheWVyOjp+U3RhcmJvYXJkUGxheWVyKCkgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKworICBzZXRfYm91bmRzX2hlbHBlcl8tPlNldFBsYXllcihOVUxMKTsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCkKKyAgICAgIC0+R2V0VmlkZW9GcmFtZVByb3ZpZGVyKCkKKyAgICAgIC0+UmVzZXRHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbigpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworICBTYlBsYXllckRlc3Ryb3kocGxheWVyXyk7Cit9CisKK3ZvaWQgU3RhcmJvYXJkUGxheWVyOjpVcGRhdGVWaWRlb1Jlc29sdXRpb24oaW50IGZyYW1lX3dpZHRoLCBpbnQgZnJhbWVfaGVpZ2h0KSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGZyYW1lX3dpZHRoXyA9IGZyYW1lX3dpZHRoOworICBmcmFtZV9oZWlnaHRfID0gZnJhbWVfaGVpZ2h0OworfQorCit2b2lkIFN0YXJib2FyZFBsYXllcjo6V3JpdGVCdWZmZXIoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcikgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKworICAvLyBXaGVuIHxzdGF0ZV98IGlzIGtQbGF5aW5nLCBjYWNoZSBhbGwgYnVmZmVyIGFwcGVuZGVkLiAgV2hlbiB8c3RhdGVffCBpcworICAvLyBrU3VzcGVuZGVkLCB0aGVyZSBtYXkgc3RpbGwgYmUgbGVmdC1vdmVyIGJ1ZmZlcnMgYXBwZW5kZWQgZnJvbSB0aGUgcGlwZWxpbmUKKyAgLy8gc28gdGhleSBhbHNvIHNob3VsZCBiZSBjYWNoZWQuCisgIC8vIFdoZW4gfHN0YXRlX3wgaXMgcmVzdW1pbmcsIGFsbCBidWZmZXJzIGNvbWUgZnJvbSB0aGUgY2FjaGUgYW5kIHNob3VsZG4ndCBiZQorICAvLyBjYWNoZWQuCisgIGlmIChzdGF0ZV8gIT0ga1Jlc3VtaW5nKSB7CisgICAgZGVjb2Rlcl9idWZmZXJfY2FjaGVfLkFkZEJ1ZmZlcih0eXBlLCBidWZmZXIpOworICB9CisKKyAgaWYgKHN0YXRlXyA9PSBrU3VzcGVuZGVkKSB7CisgICAgRENIRUNLKCFTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworCisgIGlmIChidWZmZXItPmVuZF9vZl9zdHJlYW0oKSkgeworICAgIFNiUGxheWVyV3JpdGVFbmRPZlN0cmVhbShwbGF5ZXJfLCBEZW11eGVyU3RyZWFtVHlwZVRvU2JNZWRpYVR5cGUodHlwZSkpOworICAgIHJldHVybjsKKyAgfQorCisgIERlY29kaW5nQnVmZmVyczo6aXRlcmF0b3IgaXRlciA9IGRlY29kaW5nX2J1ZmZlcnNfLmZpbmQoYnVmZmVyLT5kYXRhKCkpOworICBpZiAoaXRlciA9PSBkZWNvZGluZ19idWZmZXJzXy5lbmQoKSkgeworICAgIGRlY29kaW5nX2J1ZmZlcnNfW2J1ZmZlci0+ZGF0YSgpXSA9IHN0ZDo6bWFrZV9wYWlyKGJ1ZmZlciwgMSk7CisgIH0gZWxzZSB7CisgICAgKytpdGVyLT5zZWNvbmQuc2Vjb25kOworICB9CisKKyAgU2JEcm1TYW1wbGVJbmZvIGRybV9pbmZvOworICBTYkRybVN1YlNhbXBsZU1hcHBpbmcgc3Vic2FtcGxlX21hcHBpbmc7CisgIGJvb2wgaXNfZW5jcnlwdGVkID0gYnVmZmVyLT5kZWNyeXB0X2NvbmZpZygpOworICBTYk1lZGlhVmlkZW9TYW1wbGVJbmZvIHZpZGVvX2luZm87CisKKyAgZHJtX2luZm8uc3Vic2FtcGxlX2NvdW50ID0gMDsKKyAgdmlkZW9faW5mby5pc19rZXlfZnJhbWUgPSBidWZmZXItPmlzX2tleV9mcmFtZSgpOworICB2aWRlb19pbmZvLmZyYW1lX3dpZHRoID0gZnJhbWVfd2lkdGhfOworICB2aWRlb19pbmZvLmZyYW1lX2hlaWdodCA9IGZyYW1lX2hlaWdodF87CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKyAgU2JNZWRpYUNvbG9yTWV0YWRhdGEgc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEgPQorICAgICAgTWVkaWFUb1NiTWVkaWFDb2xvck1ldGFkYXRhKHZpZGVvX2NvbmZpZ18ud2VibV9jb2xvcl9tZXRhZGF0YSgpKTsKKyAgdmlkZW9faW5mby5jb2xvcl9tZXRhZGF0YSA9ICZzYl9tZWRpYV9jb2xvcl9tZXRhZGF0YTsKKyNlbmRpZgorICBpZiAoaXNfZW5jcnlwdGVkKSB7CisgICAgRmlsbERybVNhbXBsZUluZm8oYnVmZmVyLCAmZHJtX2luZm8sICZzdWJzYW1wbGVfbWFwcGluZyk7CisgIH0KKyAgU2JQbGF5ZXJXcml0ZVNhbXBsZShwbGF5ZXJfLCBEZW11eGVyU3RyZWFtVHlwZVRvU2JNZWRpYVR5cGUodHlwZSksCisgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLT5kYXRhKCksIGJ1ZmZlci0+ZGF0YV9zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhVG9TYk1lZGlhVGltZShidWZmZXItPnRpbWVzdGFtcCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlID09IERlbXV4ZXJTdHJlYW06OlZJREVPID8gJnZpZGVvX2luZm8gOiBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgIGRybV9pbmZvLnN1YnNhbXBsZV9jb3VudCA+IDAgPyAmZHJtX2luZm8gOiBOVUxMKTsKK30KKwordm9pZCBTdGFyYm9hcmRQbGF5ZXI6OlNldEJvdW5kcyhjb25zdCBnZng6OlJlY3QmIHJlY3QpIHsKKyAgRENIRUNLKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CisKKyAgU2JQbGF5ZXJTZXRCb3VuZHMocGxheWVyXywgcmVjdC54KCksIHJlY3QueSgpLCByZWN0LndpZHRoKCksIHJlY3QuaGVpZ2h0KCkpOworfQorCit2b2lkIFN0YXJib2FyZFBsYXllcjo6UHJlcGFyZUZvclNlZWsoKSB7CisgIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICArK3RpY2tldF87CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICBTYlBsYXllclNldFBhdXNlKHBsYXllcl8sIHRydWUpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIHNlZWtfcGVuZGluZ18gPSB0cnVlOworfQorCit2b2lkIFN0YXJib2FyZFBsYXllcjo6U2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSkgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKworICBkZWNvZGVyX2J1ZmZlcl9jYWNoZV8uQ2xlYXJBbGwoKTsKKworICBpZiAoc3RhdGVfID09IGtTdXNwZW5kZWQpIHsKKyAgICBEQ0hFQ0soIVNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CisgICAgcHJlcm9sbF90aW1lc3RhbXBfID0gdGltZTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBJZiBhIHNlZWsgaGFwcGVucyBkdXJpbmcgcmVzdW1pbmcsIHRoZSBwaXBlbGluZSB3aWxsIHdyaXRlIHNhbXBsZXMgZnJvbSB0aGUKKyAgLy8gc2VlayB0YXJnZXQgdGltZSBhZ2FpbiBzbyByZXN1bWluZyBjYW4gYmUgYWJvcnRlZC4KKyAgaWYgKHN0YXRlXyA9PSBrUmVzdW1pbmcpIHsKKyAgICBzdGF0ZV8gPSBrUGxheWluZzsKKyAgfQorCisgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworCisgICsrdGlja2V0XzsKKyAgU2JQbGF5ZXJTZWVrKHBsYXllcl8sIFRpbWVEZWx0YVRvU2JNZWRpYVRpbWUodGltZSksIHRpY2tldF8pOworICBzZWVrX3BlbmRpbmdfID0gZmFsc2U7CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICBTYlBsYXllclNldFBhdXNlKHBsYXllcl8sIHBsYXliYWNrX3JhdGVfID09IDAuMCk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KK30KKwordm9pZCBTdGFyYm9hcmRQbGF5ZXI6OlNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgdm9sdW1lXyA9IHZvbHVtZTsKKworICBpZiAoc3RhdGVfID09IGtTdXNwZW5kZWQpIHsKKyAgICBEQ0hFQ0soIVNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CisgICAgcmV0dXJuOworICB9CisKKyAgRENIRUNLKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CisgIFNiUGxheWVyU2V0Vm9sdW1lKHBsYXllcl8sIHZvbHVtZSk7Cit9CisKK3ZvaWQgU3RhcmJvYXJkUGxheWVyOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworCisgIHBsYXliYWNrX3JhdGVfID0gcGxheWJhY2tfcmF0ZTsKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIFNiUGxheWVyU2V0UGF1c2UocGxheWVyXywgcGxheWJhY2tfcmF0ZSA9PSAwLjApOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIFNiUGxheWVyU2V0UGxheWJhY2tSYXRlKHBsYXllcl8sIHBsYXliYWNrX3JhdGUpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCit9CisKK3ZvaWQgU3RhcmJvYXJkUGxheWVyOjpHZXRJbmZvKHVpbnQzMiogdmlkZW9fZnJhbWVzX2RlY29kZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIqIHZpZGVvX2ZyYW1lc19kcm9wcGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKiBtZWRpYV90aW1lKSB7CisgIERDSEVDSyh2aWRlb19mcmFtZXNfZGVjb2RlZCB8fCB2aWRlb19mcmFtZXNfZHJvcHBlZCB8fCBtZWRpYV90aW1lKTsKKworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICBpZiAoc3RhdGVfID09IGtTdXNwZW5kZWQpIHsKKyAgICBEQ0hFQ0soIVNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CisKKyAgICBpZiAodmlkZW9fZnJhbWVzX2RlY29kZWQpIHsKKyAgICAgICp2aWRlb19mcmFtZXNfZGVjb2RlZCA9IGNhY2hlZF92aWRlb19mcmFtZXNfZGVjb2RlZF87CisgICAgfQorICAgIGlmICh2aWRlb19mcmFtZXNfZHJvcHBlZCkgeworICAgICAgKnZpZGVvX2ZyYW1lc19kcm9wcGVkID0gY2FjaGVkX3ZpZGVvX2ZyYW1lc19kcm9wcGVkXzsKKyAgICB9CisgICAgaWYgKG1lZGlhX3RpbWUpIHsKKyAgICAgICptZWRpYV90aW1lID0gcHJlcm9sbF90aW1lc3RhbXBfOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBEQ0hFQ0soU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcl8pKTsKKworICBTYlBsYXllckluZm8gaW5mbzsKKyAgU2JQbGF5ZXJHZXRJbmZvKHBsYXllcl8sICZpbmZvKTsKKyAgaWYgKHZpZGVvX2ZyYW1lc19kZWNvZGVkKSB7CisgICAgKnZpZGVvX2ZyYW1lc19kZWNvZGVkID0gaW5mby50b3RhbF92aWRlb19mcmFtZXM7CisgIH0KKyAgaWYgKHZpZGVvX2ZyYW1lc19kcm9wcGVkKSB7CisgICAgKnZpZGVvX2ZyYW1lc19kcm9wcGVkID0gaW5mby5kcm9wcGVkX3ZpZGVvX2ZyYW1lczsKKyAgfQorICBpZiAobWVkaWFfdGltZSkgeworICAgICptZWRpYV90aW1lID0gU2JNZWRpYVRpbWVUb1RpbWVEZWx0YShpbmZvLmN1cnJlbnRfbWVkaWFfcHRzKTsKKyAgfQorfQorCit2b2lkIFN0YXJib2FyZFBsYXllcjo6U3VzcGVuZCgpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IHN1c3BlbmRlZC4KKyAgaWYgKHN0YXRlXyA9PSBrU3VzcGVuZGVkKSB7CisgICAgRENIRUNLKCFTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICBTYlBsYXllclNldFBhdXNlKHBsYXllcl8sIHRydWUpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIFNiUGxheWVyU2V0UGxheWJhY2tSYXRlKHBsYXllcl8sIDAuMCk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworCisgIHN0YXRlXyA9IGtTdXNwZW5kZWQ7CisKKyAgU2JQbGF5ZXJJbmZvIGluZm87CisgIFNiUGxheWVyR2V0SW5mbyhwbGF5ZXJfLCAmaW5mbyk7CisgIGNhY2hlZF92aWRlb19mcmFtZXNfZGVjb2RlZF8gPSBpbmZvLnRvdGFsX3ZpZGVvX2ZyYW1lczsKKyAgY2FjaGVkX3ZpZGVvX2ZyYW1lc19kcm9wcGVkXyA9IGluZm8uZHJvcHBlZF92aWRlb19mcmFtZXM7CisgIHByZXJvbGxfdGltZXN0YW1wXyA9IFNiTWVkaWFUaW1lVG9UaW1lRGVsdGEoaW5mby5jdXJyZW50X21lZGlhX3B0cyk7CisKKyAgc2V0X2JvdW5kc19oZWxwZXJfLT5TZXRQbGF5ZXIoTlVMTCk7CisgIFNiUGxheWVyRGVzdHJveShwbGF5ZXJfKTsKKworICBwbGF5ZXJfID0ga1NiUGxheWVySW52YWxpZDsKK30KKwordm9pZCBTdGFyYm9hcmRQbGF5ZXI6OlJlc3VtZSgpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgLy8gQ2hlY2sgaWYgdGhlIHBsYXllciBpcyBhbHJlYWR5IHJlc3VtZWQuCisgIGlmIChzdGF0ZV8gIT0ga1N1c3BlbmRlZCkgeworICAgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyghU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcl8pKTsKKworICBkZWNvZGVyX2J1ZmZlcl9jYWNoZV8uU3RhcnRSZXN1bWluZygpOworCisgIENyZWF0ZVBsYXllcigpOworCisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIHN0YXRlXyA9IGtSZXN1bWluZzsKK30KKwordm9pZCBTdGFyYm9hcmRQbGF5ZXI6OkNyZWF0ZVBsYXllcigpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgU2JNZWRpYUF1ZGlvSGVhZGVyIGF1ZGlvX2hlYWRlcjsKKyAgLy8gVE9ETzogTWFrZSB0aGlzIHdvcmsgd2l0aCBub24gQUFDIGF1ZGlvLgorICBhdWRpb19oZWFkZXIuZm9ybWF0X3RhZyA9IDB4MDBmZjsKKyAgYXVkaW9faGVhZGVyLm51bWJlcl9vZl9jaGFubmVscyA9CisgICAgICBDaGFubmVsTGF5b3V0VG9DaGFubmVsQ291bnQoYXVkaW9fY29uZmlnXy5jaGFubmVsX2xheW91dCgpKTsKKyAgYXVkaW9faGVhZGVyLnNhbXBsZXNfcGVyX3NlY29uZCA9IGF1ZGlvX2NvbmZpZ18uc2FtcGxlc19wZXJfc2Vjb25kKCk7CisgIGF1ZGlvX2hlYWRlci5hdmVyYWdlX2J5dGVzX3Blcl9zZWNvbmQgPSAxOworICBhdWRpb19oZWFkZXIuYmxvY2tfYWxpZ25tZW50ID0gNDsKKyAgYXVkaW9faGVhZGVyLmJpdHNfcGVyX3NhbXBsZSA9IGF1ZGlvX2NvbmZpZ18uYml0c19wZXJfY2hhbm5lbCgpOworICBhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUgPSBzdGF0aWNfY2FzdDx1aW50MTZfdD4oCisgICAgICBzdGQ6Om1pbihhdWRpb19jb25maWdfLmV4dHJhX2RhdGEoKS5zaXplKCksCisgICAgICAgICAgICAgICBzaXplb2YoYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZykpKTsKKyAgaWYgKGF1ZGlvX2hlYWRlci5hdWRpb19zcGVjaWZpY19jb25maWdfc2l6ZSA+IDApIHsKKyAgICBTYk1lbW9yeUNvcHkoYXVkaW9faGVhZGVyLmF1ZGlvX3NwZWNpZmljX2NvbmZpZywKKyAgICAgICAgICAgICAgICAgJmF1ZGlvX2NvbmZpZ18uZXh0cmFfZGF0YSgpWzBdLAorICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIuYXVkaW9fc3BlY2lmaWNfY29uZmlnX3NpemUpOworICB9CisKKyAgU2JNZWRpYUF1ZGlvQ29kZWMgYXVkaW9fY29kZWMgPQorICAgICAgTWVkaWFBdWRpb0NvZGVjVG9TYk1lZGlhQXVkaW9Db2RlYyhhdWRpb19jb25maWdfLmNvZGVjKCkpOworICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYyA9CisgICAgICBNZWRpYVZpZGVvQ29kZWNUb1NiTWVkaWFWaWRlb0NvZGVjKHZpZGVvX2NvbmZpZ18uY29kZWMoKSk7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgRENIRUNLKFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZV8sIHZpZGVvX2NvZGVjLCBkcm1fc3lzdGVtXykpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworICBwbGF5ZXJfID0gU2JQbGF5ZXJDcmVhdGUoCisgICAgICB3aW5kb3dfLCB2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIFNCX1BMQVlFUl9OT19EVVJBVElPTiwgZHJtX3N5c3RlbV8sCisgICAgICAmYXVkaW9faGVhZGVyLCAmU3RhcmJvYXJkUGxheWVyOjpEZWFsbG9jYXRlU2FtcGxlQ0IsCisgICAgICAmU3RhcmJvYXJkUGxheWVyOjpEZWNvZGVyU3RhdHVzQ0IsICZTdGFyYm9hcmRQbGF5ZXI6OlBsYXllclN0YXR1c0NCLCB0aGlzCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgICAsCisgICAgICBvdXRwdXRfbW9kZV8KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMworICAgICAgLAorICAgICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5HZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgIC8vIHByb3ZpZGVyCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKKyAgICAgICk7CisgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIGlmIChvdXRwdXRfbW9kZV8gPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSkgeworICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgc2V0dXAgdG8gZGVjb2RlIHRvIHRleHR1cmUsIHRoZW4gcHJvdmlkZSBDb2JhbHQgd2l0aAorICAgIC8vIGEgbWV0aG9kIG9mIHF1ZXJ5aW5nIHRoYXQgdGV4dHVyZS4KKyAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCkKKyAgICAgICAgLT5HZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKQorICAgICAgICAtPlNldEdldEN1cnJlbnRTYkRlY29kZVRhcmdldEZ1bmN0aW9uKAorICAgICAgICAgICAgYmFzZTo6QmluZCgmU3RhcmJvYXJkUGxheWVyOjpHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKKyAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworICBzZXRfYm91bmRzX2hlbHBlcl8tPlNldFBsYXllcih0aGlzKTsKK30KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorU2JEZWNvZGVUYXJnZXQgU3RhcmJvYXJkUGxheWVyOjpHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXQoKSB7CisgIHJldHVybiBTYlBsYXllckdldEN1cnJlbnRGcmFtZShwbGF5ZXJfKTsKK30KK1NiUGxheWVyT3V0cHV0TW9kZSBTdGFyYm9hcmRQbGF5ZXI6OkdldFNiUGxheWVyT3V0cHV0TW9kZSgpIHsKKyAgcmV0dXJuIG91dHB1dF9tb2RlXzsKK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKK3ZvaWQgU3RhcmJvYXJkUGxheWVyOjpDbGVhckRlY29kZXJCdWZmZXJDYWNoZSgpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgYmFzZTo6VGltZURlbHRhIG1lZGlhX3RpbWU7CisgIEdldEluZm8oTlVMTCwgTlVMTCwgJm1lZGlhX3RpbWUpOworICBkZWNvZGVyX2J1ZmZlcl9jYWNoZV8uQ2xlYXJTZWdtZW50c0JlZm9yZU1lZGlhVGltZShtZWRpYV90aW1lKTsKKworICBtZXNzYWdlX2xvb3BfLT5Qb3N0RGVsYXllZFRhc2soCisgICAgICBGUk9NX0hFUkUsCisgICAgICBiYXNlOjpCaW5kKCZTdGFyYm9hcmRQbGF5ZXI6OkNsZWFyRGVjb2RlckJ1ZmZlckNhY2hlLCB3ZWFrX3RoaXNfKSwKKyAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pbGxpc2Vjb25kcygKKyAgICAgICAgICBrQ2xlYXJEZWNvZGVyQ2FjaGVJbnRlcnZhbEluTWlsbGlzZWNvbmRzKSk7Cit9CisKK3ZvaWQgU3RhcmJvYXJkUGxheWVyOjpPbkRlY29kZXJTdGF0dXMoU2JQbGF5ZXIgcGxheWVyLCBTYk1lZGlhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllckRlY29kZXJTdGF0ZSBzdGF0ZSwgaW50IHRpY2tldCkgeworICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKworICBpZiAocGxheWVyXyAhPSBwbGF5ZXIgfHwgdGlja2V0ICE9IHRpY2tldF8pIHsKKyAgICByZXR1cm47CisgIH0KKworICBEQ0hFQ0tfTkUoc3RhdGVfLCBrU3VzcGVuZGVkKTsKKworICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSBrU2JQbGF5ZXJEZWNvZGVyU3RhdGVOZWVkc0RhdGE6CisgICAgICBicmVhazsKKyAgICBjYXNlIGtTYlBsYXllckRlY29kZXJTdGF0ZUJ1ZmZlckZ1bGw6CisgICAgICBETE9HKFdBUk5JTkcpIDw8ICJrU2JQbGF5ZXJEZWNvZGVyU3RhdGVCdWZmZXJGdWxsIGhhcyBiZWVuIGRlcHJlY2F0ZWQuIjsKKyAgICAgIHJldHVybjsKKyAgICBjYXNlIGtTYlBsYXllckRlY29kZXJTdGF0ZURlc3Ryb3llZDoKKyAgICAgIHJldHVybjsKKyAgfQorCisgIGlmIChzdGF0ZV8gPT0ga1Jlc3VtaW5nKSB7CisgICAgRGVtdXhlclN0cmVhbTo6VHlwZSBzdHJlYW1fdHlwZSA9IFNiTWVkaWFUeXBlVG9EZW11eGVyU3RyZWFtVHlwZSh0eXBlKTsKKyAgICBpZiAoZGVjb2Rlcl9idWZmZXJfY2FjaGVfLkdldEJ1ZmZlcihzdHJlYW1fdHlwZSkpIHsKKyAgICAgIFdyaXRlQnVmZmVyKHN0cmVhbV90eXBlLCBkZWNvZGVyX2J1ZmZlcl9jYWNoZV8uR2V0QnVmZmVyKHN0cmVhbV90eXBlKSk7CisgICAgICBkZWNvZGVyX2J1ZmZlcl9jYWNoZV8uQWR2YW5jZVRvTmV4dEJ1ZmZlcihzdHJlYW1fdHlwZSk7CisgICAgICByZXR1cm47CisgICAgfQorICAgIGlmICghZGVjb2Rlcl9idWZmZXJfY2FjaGVfLkdldEJ1ZmZlcihEZW11eGVyU3RyZWFtOjpBVURJTykgJiYKKyAgICAgICAgIWRlY29kZXJfYnVmZmVyX2NhY2hlXy5HZXRCdWZmZXIoRGVtdXhlclN0cmVhbTo6VklERU8pKSB7CisgICAgICBzdGF0ZV8gPSBrUGxheWluZzsKKyAgICB9CisgIH0KKworICBob3N0Xy0+T25OZWVkRGF0YShTYk1lZGlhVHlwZVRvRGVtdXhlclN0cmVhbVR5cGUodHlwZSkpOworfQorCit2b2lkIFN0YXJib2FyZFBsYXllcjo6T25QbGF5ZXJTdGF0dXMoU2JQbGF5ZXIgcGxheWVyLCBTYlBsYXllclN0YXRlIHN0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0aWNrZXQpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgaWYgKHBsYXllcl8gIT0gcGxheWVyKSB7CisgICAgcmV0dXJuOworICB9CisKKyAgRENIRUNLX05FKHN0YXRlXywga1N1c3BlbmRlZCk7CisKKyAgaWYgKHRpY2tldCAhPSBTQl9QTEFZRVJfSU5JVElBTF9USUNLRVQgJiYgdGlja2V0ICE9IHRpY2tldF8pIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoc3RhdGUgPT0ga1NiUGxheWVyU3RhdGVJbml0aWFsaXplZCkgeworICAgIGlmICh0aWNrZXRfID09IFNCX1BMQVlFUl9JTklUSUFMX1RJQ0tFVCkgeworICAgICAgKyt0aWNrZXRfOworICAgIH0KKyAgICBTYlBsYXllclNlZWsocGxheWVyXywgVGltZURlbHRhVG9TYk1lZGlhVGltZShwcmVyb2xsX3RpbWVzdGFtcF8pLCB0aWNrZXRfKTsKKyAgICBTZXRWb2x1bWUodm9sdW1lXyk7CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICAgIFNiUGxheWVyU2V0UGF1c2UocGxheWVyXywgcGxheWJhY2tfcmF0ZV8gPT0gMC4wKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICAgIFNiUGxheWVyU2V0UGxheWJhY2tSYXRlKHBsYXllcl8sIHBsYXliYWNrX3JhdGVfKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICAgIHJldHVybjsKKyAgfQorICBob3N0Xy0+T25QbGF5ZXJTdGF0dXMoc3RhdGUpOworfQorCit2b2lkIFN0YXJib2FyZFBsYXllcjo6T25EZWFsbG9jYXRlU2FtcGxlKGNvbnN0IHZvaWQqIHNhbXBsZV9idWZmZXIpIHsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgRGVjb2RpbmdCdWZmZXJzOjppdGVyYXRvciBpdGVyID0gZGVjb2RpbmdfYnVmZmVyc18uZmluZChzYW1wbGVfYnVmZmVyKTsKKyAgRENIRUNLKGl0ZXIgIT0gZGVjb2RpbmdfYnVmZmVyc18uZW5kKCkpOworICBpZiAoaXRlciA9PSBkZWNvZGluZ19idWZmZXJzXy5lbmQoKSkgeworICAgIExPRyhFUlJPUikgPDwgIlN0YXJib2FyZFBsYXllcjo6T25EZWFsbG9jYXRlU2FtcGxlIGVuY291bnRlcnMgdW5rbm93biAiCisgICAgICAgICAgICAgICA8PCAic2FtcGxlX2J1ZmZlciAiIDw8IHNhbXBsZV9idWZmZXI7CisgICAgcmV0dXJuOworICB9CisgIC0taXRlci0+c2Vjb25kLnNlY29uZDsKKyAgaWYgKGl0ZXItPnNlY29uZC5zZWNvbmQgPT0gMCkgeworICAgIGRlY29kaW5nX2J1ZmZlcnNfLmVyYXNlKGl0ZXIpOworICB9Cit9CisKKy8vIHN0YXRpYwordm9pZCBTdGFyYm9hcmRQbGF5ZXI6OkRlY29kZXJTdGF0dXNDQihTYlBsYXllciBwbGF5ZXIsIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyRGVjb2RlclN0YXRlIHN0YXRlLCBpbnQgdGlja2V0KSB7CisgIFN0YXJib2FyZFBsYXllciogaGVscGVyID0gcmVpbnRlcnByZXRfY2FzdDxTdGFyYm9hcmRQbGF5ZXIqPihjb250ZXh0KTsKKyAgaGVscGVyLT5tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmU3RhcmJvYXJkUGxheWVyOjpPbkRlY29kZXJTdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVscGVyLT53ZWFrX3RoaXNfLCBwbGF5ZXIsIHR5cGUsIHN0YXRlLCB0aWNrZXQpKTsKK30KKworLy8gc3RhdGljCit2b2lkIFN0YXJib2FyZFBsYXllcjo6UGxheWVyU3RhdHVzQ0IoU2JQbGF5ZXIgcGxheWVyLCB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyU3RhdGUgc3RhdGUsIGludCB0aWNrZXQpIHsKKyAgU3RhcmJvYXJkUGxheWVyKiBoZWxwZXIgPSByZWludGVycHJldF9jYXN0PFN0YXJib2FyZFBsYXllcio+KGNvbnRleHQpOworICBoZWxwZXItPm1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTdGFyYm9hcmRQbGF5ZXI6Ok9uUGxheWVyU3RhdHVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci0+d2Vha190aGlzXywgcGxheWVyLCBzdGF0ZSwgdGlja2V0KSk7Cit9CisKKy8vIHN0YXRpYwordm9pZCBTdGFyYm9hcmRQbGF5ZXI6OkRlYWxsb2NhdGVTYW1wbGVDQihTYlBsYXllciBwbGF5ZXIsIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHNhbXBsZV9idWZmZXIpIHsKKyAgU3RhcmJvYXJkUGxheWVyKiBoZWxwZXIgPSByZWludGVycHJldF9jYXN0PFN0YXJib2FyZFBsYXllcio+KGNvbnRleHQpOworICBoZWxwZXItPm1lc3NhZ2VfbG9vcF8tPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLCBiYXNlOjpCaW5kKCZTdGFyYm9hcmRQbGF5ZXI6Ok9uRGVhbGxvY2F0ZVNhbXBsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBoZWxwZXItPndlYWtfdGhpc18sIHNhbXBsZV9idWZmZXIpKTsKK30KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorLy8gc3RhdGljCitTYlBsYXllck91dHB1dE1vZGUgU3RhcmJvYXJkUGxheWVyOjpDb21wdXRlU2JQbGF5ZXJPdXRwdXRNb2RlKAorICAgIFNiTWVkaWFWaWRlb0NvZGVjIGNvZGVjLCBTYkRybVN5c3RlbSBkcm1fc3lzdGVtKSB7CisgIC8vIElmIGF2YWlsYWJsZSwgY2hvb3NlIHB1bmNoLW91dCBtb2RlLCBzaW5jZSBpdCB3aWxsIGFsbW9zdCBhbHdheXMgYmUKKyAgLy8gdGhlIG1vc3QgcGVyZm9ybWFudC4gIElmIGl0IGlzIHVuYXZhaWxhYmxlLCB0aGVuIGZhbGxiYWNrIHRvCisgIC8vIGRlY29kZS10by10ZXh0dXJlLgorICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUgPSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlOworICBpZiAoU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkKGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCwgY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHJtX3N5c3RlbSkpIHsKKyAgICBvdXRwdXRfbW9kZSA9IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dDsKKyAgfQorCisgIHJldHVybiBvdXRwdXRfbW9kZTsKK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjM5ZDFmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgKQEAgLTAsMCArMSwxNTcgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX0JBU0VfU1RBUkJPQVJEX1BMQVlFUl9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9TVEFSQk9BUkRfUExBWUVSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgorI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKKyNpbmNsdWRlICJiYXNlL3RpbWUuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXJfY2FjaGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NicGxheWVyX3NldF9ib3VuZHNfaGVscGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vIFRPRE86IEFkZCBzd2l0Y2ggdG8gZGlzYWJsZSBjYWNoaW5nCitjbGFzcyBTdGFyYm9hcmRQbGF5ZXIgOiBwdWJsaWMgYmFzZTo6U3VwcG9ydHNXZWFrUHRyPFN0YXJib2FyZFBsYXllcj4geworIHB1YmxpYzoKKyAgY2xhc3MgSG9zdCB7CisgICBwdWJsaWM6CisgICAgdmlydHVhbCB2b2lkIE9uTmVlZERhdGEoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSA9IDA7CisgICAgdmlydHVhbCB2b2lkIE9uUGxheWVyU3RhdHVzKFNiUGxheWVyU3RhdGUgc3RhdGUpID0gMDsKKworICAgcHJvdGVjdGVkOgorICAgIH5Ib3N0KCkge30KKyAgfTsKKworICBTdGFyYm9hcmRQbGF5ZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wLAorICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcsCisgICAgICAgICAgICAgICAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIHZpZGVvX2NvbmZpZywgU2JXaW5kb3cgd2luZG93LAorICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSwgSG9zdCogaG9zdCwKKyAgICAgICAgICAgICAgICAgIFNiUGxheWVyU2V0Qm91bmRzSGVscGVyKiBzZXRfYm91bmRzX2hlbHBlcik7CisgIH5TdGFyYm9hcmRQbGF5ZXIoKTsKKworICBib29sIElzVmFsaWQoKSBjb25zdCB7IHJldHVybiBTYlBsYXllcklzVmFsaWQocGxheWVyXyk7IH0KKworICB2b2lkIFVwZGF0ZVZpZGVvUmVzb2x1dGlvbihpbnQgZnJhbWVfd2lkdGgsIGludCBmcmFtZV9oZWlnaHQpOworCisgIHZvaWQgV3JpdGVCdWZmZXIoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcik7CisgIHZvaWQgU2V0Qm91bmRzKGNvbnN0IGdmeDo6UmVjdCYgcmVjdCk7CisKKyAgdm9pZCBQcmVwYXJlRm9yU2VlaygpOworICB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUpOworCisgIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7CisgIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKTsKKyAgdm9pZCBHZXRJbmZvKHVpbnQzMiogdmlkZW9fZnJhbWVzX2RlY29kZWQsIHVpbnQzMiogdmlkZW9fZnJhbWVzX2Ryb3BwZWQsCisgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEqIG1lZGlhX3RpbWUpOworCisgIHZvaWQgU3VzcGVuZCgpOworICB2b2lkIFJlc3VtZSgpOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnRTYkRlY29kZVRhcmdldCgpOworICBTYlBsYXllck91dHB1dE1vZGUgR2V0U2JQbGF5ZXJPdXRwdXRNb2RlKCk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCisgcHJpdmF0ZToKKyAgZW51bSBTdGF0ZSB7CisgICAga1BsYXlpbmcsCisgICAga1N1c3BlbmRlZCwKKyAgICBrUmVzdW1pbmcsCisgIH07CisKKyAgc3RhdGljIGNvbnN0IGludDY0IGtDbGVhckRlY29kZXJDYWNoZUludGVydmFsSW5NaWxsaXNlY29uZHMgPSAxMDAwOworCisgIC8vIEEgbWFwIGZyb20gcmF3IGRhdGEgcG9pbnRlciByZXR1cm5lZCBieSBEZWNvZGVyQnVmZmVyOjpHZXREYXRhKCkgdG8gdGhlCisgIC8vIERlY29kZXJCdWZmZXIgYW5kIGEgcmVmZXJlbmNlIGNvdW50LiAgVGhlIHJlZmVyZW5jZSBjb3VudCBpbmRpY2F0ZXMgaG93CisgIC8vIG1hbnkgaW5zdGFuY2VzIG9mIHRoZSBEZWNvZGVyQnVmZmVyIGlzIGN1cnJlbnRseSBiZWluZyBkZWNvZGVkIGluIHRoZQorICAvLyBwaXBlbGluZS4KKyAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgc3RkOjpwYWlyPHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4sIGludD4gPgorICAgICAgRGVjb2RpbmdCdWZmZXJzOworCisgIHZvaWQgQ3JlYXRlUGxheWVyKCk7CisgIHZvaWQgQ2xlYXJEZWNvZGVyQnVmZmVyQ2FjaGUoKTsKKworICB2b2lkIE9uRGVjb2RlclN0YXR1cyhTYlBsYXllciBwbGF5ZXIsIFNiTWVkaWFUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyRGVjb2RlclN0YXRlIHN0YXRlLCBpbnQgdGlja2V0KTsKKyAgdm9pZCBPblBsYXllclN0YXR1cyhTYlBsYXllciBwbGF5ZXIsIFNiUGxheWVyU3RhdGUgc3RhdGUsIGludCB0aWNrZXQpOworICB2b2lkIE9uRGVhbGxvY2F0ZVNhbXBsZShjb25zdCB2b2lkKiBzYW1wbGVfYnVmZmVyKTsKKworICBzdGF0aWMgdm9pZCBEZWNvZGVyU3RhdHVzQ0IoU2JQbGF5ZXIgcGxheWVyLCB2b2lkKiBjb250ZXh0LCBTYk1lZGlhVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdGUgc3RhdGUsIGludCB0aWNrZXQpOworICBzdGF0aWMgdm9pZCBQbGF5ZXJTdGF0dXNDQihTYlBsYXllciBwbGF5ZXIsIHZvaWQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyU3RhdGUgc3RhdGUsIGludCB0aWNrZXQpOworICBzdGF0aWMgdm9pZCBEZWFsbG9jYXRlU2FtcGxlQ0IoU2JQbGF5ZXIgcGxheWVyLCB2b2lkKiBjb250ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2FtcGxlX2J1ZmZlcik7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IG1vZGUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSB2aWRlbyB3aXRoIHRoZSBnaXZlbgorICAvLyBzcGVjaWZpY2F0aW9ucy4KKyAgc3RhdGljIFNiUGxheWVyT3V0cHV0TW9kZSBDb21wdXRlU2JQbGF5ZXJPdXRwdXRNb2RlKFNiTWVkaWFWaWRlb0NvZGVjIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCisgIC8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGFyZSBpbml0aWFsaXplZCBpbiB0aGUgY3RvciBhbmQgbmV2ZXIgY2hhbmdlZC4KKyAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiBtZXNzYWdlX2xvb3BfOworICBBdWRpb0RlY29kZXJDb25maWcgYXVkaW9fY29uZmlnXzsKKyAgVmlkZW9EZWNvZGVyQ29uZmlnIHZpZGVvX2NvbmZpZ187CisgIGNvbnN0IFNiV2luZG93IHdpbmRvd187CisgIGNvbnN0IFNiRHJtU3lzdGVtIGRybV9zeXN0ZW1fOworICBIb3N0KiBjb25zdCBob3N0XzsKKyAgU2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXIqIGNvbnN0IHNldF9ib3VuZHNfaGVscGVyXzsKKyAgY29uc3QgYmFzZTo6V2Vha1B0cjxTdGFyYm9hcmRQbGF5ZXI+IHdlYWtfdGhpc187CisKKyAgLy8gVGhlIGZvbGxvd2luZyB2YXJpYWJsZXMgYXJlIG9ubHkgY2hhbmdlZCBvciBhY2Nlc3NlZCBmcm9tIHRoZQorICAvLyB8bWVzc2FnZV9sb29wX3wuCisgIGludCBmcmFtZV93aWR0aF87CisgIGludCBmcmFtZV9oZWlnaHRfOworICBEZWNvZGluZ0J1ZmZlcnMgZGVjb2RpbmdfYnVmZmVyc187CisgIGludCB0aWNrZXRfOworICBmbG9hdCB2b2x1bWVfOworICBkb3VibGUgcGxheWJhY2tfcmF0ZV87CisgIGJvb2wgcGF1c2VkXzsKKyAgYm9vbCBzZWVrX3BlbmRpbmdfOworICBEZWNvZGVyQnVmZmVyQ2FjaGUgZGVjb2Rlcl9idWZmZXJfY2FjaGVfOworCisgIC8vIFRoZSBmb2xsb3dpbmcgdmFyaWFibGVzIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIEdldEluZm8oKSwgd2hpY2ggY2FuIGJlIGNhbGxlZAorICAvLyBmcm9tIGFueSB0aHJlYWRzLiAgU28gc29tZSBvZiB0aGVpciB1c2FnZXMgaGF2ZSB0byBiZSBndWFyZGVkIGJ5IHxsb2NrX3wuCisgIGJhc2U6OkxvY2sgbG9ja187CisgIFN0YXRlIHN0YXRlXzsKKyAgU2JQbGF5ZXIgcGxheWVyXzsKKyAgdWludDMyIGNhY2hlZF92aWRlb19mcmFtZXNfZGVjb2RlZF87CisgIHVpbnQzMiBjYWNoZWRfdmlkZW9fZnJhbWVzX2Ryb3BwZWRfOworICBiYXNlOjpUaW1lRGVsdGEgcHJlcm9sbF90aW1lc3RhbXBfOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIC8vIEtlZXAgdHJhY2sgb2YgdGhlIG91dHB1dCBtb2RlIHdlIGFyZSBzdXBwb3NlZCB0byBvdXRwdXQgdG8uCisgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZV87CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX0JBU0VfU1RBUkJPQVJEX1BMQVlFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0YXJib2FyZF91dGlscy5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjJjNjcyZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuY2MKQEAgLTAsMCArMSwyODEgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorCit1c2luZyBiYXNlOjpUaW1lOwordXNpbmcgYmFzZTo6VGltZURlbHRhOworCituYW1lc3BhY2UgbWVkaWEgeworCitTYk1lZGlhQXVkaW9Db2RlYyBNZWRpYUF1ZGlvQ29kZWNUb1NiTWVkaWFBdWRpb0NvZGVjKEF1ZGlvQ29kZWMgY29kZWMpIHsKKyAgaWYgKGNvZGVjID09IGtDb2RlY0FBQykgeworICAgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNBYWM7CisgIH0gZWxzZSBpZiAoY29kZWMgPT0ga0NvZGVjVm9yYmlzKSB7CisgICAgcmV0dXJuIGtTYk1lZGlhQXVkaW9Db2RlY1ZvcmJpczsKKyAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNPcHVzKSB7CisgICAgcmV0dXJuIGtTYk1lZGlhQXVkaW9Db2RlY09wdXM7CisgIH0KKyAgRExPRyhFUlJPUikgPDwgIlVuc3VwcG9ydGVkIGF1ZGlvIGNvZGVjICIgPDwgY29kZWM7CisgIHJldHVybiBrU2JNZWRpYUF1ZGlvQ29kZWNOb25lOworfQorCitTYk1lZGlhVmlkZW9Db2RlYyBNZWRpYVZpZGVvQ29kZWNUb1NiTWVkaWFWaWRlb0NvZGVjKFZpZGVvQ29kZWMgY29kZWMpIHsKKyAgaWYgKGNvZGVjID09IGtDb2RlY0gyNjQpIHsKKyAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NDsKKyAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNWQzEpIHsKKyAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjVmMxOworICB9IGVsc2UgaWYgKGNvZGVjID09IGtDb2RlY01QRUcyKSB7CisgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY01wZWcyOworICB9IGVsc2UgaWYgKGNvZGVjID09IGtDb2RlY1RoZW9yYSkgeworICAgIHJldHVybiBrU2JNZWRpYVZpZGVvQ29kZWNUaGVvcmE7CisgIH0gZWxzZSBpZiAoY29kZWMgPT0ga0NvZGVjVlA4KSB7CisgICAgcmV0dXJuIGtTYk1lZGlhVmlkZW9Db2RlY1ZwODsKKyAgfSBlbHNlIGlmIChjb2RlYyA9PSBrQ29kZWNWUDkpIHsKKyAgICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjVnA5OworICB9CisgIERMT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCB2aWRlbyBjb2RlYyAiIDw8IGNvZGVjOworICByZXR1cm4ga1NiTWVkaWFWaWRlb0NvZGVjTm9uZTsKK30KKworVGltZURlbHRhIFNiTWVkaWFUaW1lVG9UaW1lRGVsdGEoU2JNZWRpYVRpbWUgdGltZXN0YW1wKSB7CisgIHJldHVybiBUaW1lRGVsdGE6OkZyb21NaWNyb3NlY29uZHModGltZXN0YW1wICogVGltZTo6a01pY3Jvc2Vjb25kc1BlclNlY29uZCAvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NiTWVkaWFUaW1lU2Vjb25kKTsKK30KKworU2JNZWRpYVRpbWUgVGltZURlbHRhVG9TYk1lZGlhVGltZShUaW1lRGVsdGEgdGltZWRlbHRhKSB7CisgIHJldHVybiB0aW1lZGVsdGEuSW5NaWNyb3NlY29uZHMoKSAqIGtTYk1lZGlhVGltZVNlY29uZCAvCisgICAgICAgICBUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kOworfQorCitEZW11eGVyU3RyZWFtOjpUeXBlIFNiTWVkaWFUeXBlVG9EZW11eGVyU3RyZWFtVHlwZShTYk1lZGlhVHlwZSB0eXBlKSB7CisgIGlmICh0eXBlID09IGtTYk1lZGlhVHlwZUF1ZGlvKSB7CisgICAgcmV0dXJuIERlbXV4ZXJTdHJlYW06OkFVRElPOworICB9CisgIERDSEVDS19FUSh0eXBlLCBrU2JNZWRpYVR5cGVWaWRlbyk7CisgIHJldHVybiBEZW11eGVyU3RyZWFtOjpWSURFTzsKK30KKworU2JNZWRpYVR5cGUgRGVtdXhlclN0cmVhbVR5cGVUb1NiTWVkaWFUeXBlKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgeworICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgeworICAgIHJldHVybiBrU2JNZWRpYVR5cGVBdWRpbzsKKyAgfQorICBEQ0hFQ0tfRVEodHlwZSwgRGVtdXhlclN0cmVhbTo6VklERU8pOworICByZXR1cm4ga1NiTWVkaWFUeXBlVmlkZW87Cit9CisKK3ZvaWQgRmlsbERybVNhbXBsZUluZm8oY29uc3Qgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICBTYkRybVNhbXBsZUluZm8qIGRybV9pbmZvLAorICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN1YlNhbXBsZU1hcHBpbmcqIHN1YnNhbXBsZV9tYXBwaW5nKSB7CisgIERDSEVDSyhkcm1faW5mbyk7CisgIERDSEVDSyhzdWJzYW1wbGVfbWFwcGluZyk7CisKKyAgY29uc3QgRGVjcnlwdENvbmZpZyogY29uZmlnID0gYnVmZmVyLT5kZWNyeXB0X2NvbmZpZygpOworICBpZiAoIWNvbmZpZyB8fCBjb25maWctPml2KCkuZW1wdHkoKSB8fCBjb25maWctPmtleV9pZCgpLmVtcHR5KCkpIHsKKyAgICBkcm1faW5mby0+aW5pdGlhbGl6YXRpb25fdmVjdG9yX3NpemUgPSAwOworICAgIGRybV9pbmZvLT5pZGVudGlmaWVyX3NpemUgPSAwOworICAgIGRybV9pbmZvLT5zdWJzYW1wbGVfY291bnQgPSAwOworICAgIGRybV9pbmZvLT5zdWJzYW1wbGVfbWFwcGluZyA9IE5VTEw7CisgICAgcmV0dXJuOworICB9CisKKyAgRENIRUNLX0xFKGNvbmZpZy0+aXYoKS5zaXplKCksIHNpemVvZihkcm1faW5mby0+aW5pdGlhbGl6YXRpb25fdmVjdG9yKSk7CisgIERDSEVDS19MRShjb25maWctPmtleV9pZCgpLnNpemUoKSwgc2l6ZW9mKGRybV9pbmZvLT5pZGVudGlmaWVyKSk7CisKKyAgaWYgKGNvbmZpZy0+aXYoKS5zaXplKCkgPiBzaXplb2YoZHJtX2luZm8tPmluaXRpYWxpemF0aW9uX3ZlY3RvcikgfHwKKyAgICAgIGNvbmZpZy0+a2V5X2lkKCkuc2l6ZSgpID4gc2l6ZW9mKGRybV9pbmZvLT5pZGVudGlmaWVyKSkgeworICAgIGRybV9pbmZvLT5pbml0aWFsaXphdGlvbl92ZWN0b3Jfc2l6ZSA9IDA7CisgICAgZHJtX2luZm8tPmlkZW50aWZpZXJfc2l6ZSA9IDA7CisgICAgZHJtX2luZm8tPnN1YnNhbXBsZV9jb3VudCA9IDA7CisgICAgZHJtX2luZm8tPnN1YnNhbXBsZV9tYXBwaW5nID0gTlVMTDsKKyAgICByZXR1cm47CisgIH0KKworICBtZW1jcHkoZHJtX2luZm8tPmluaXRpYWxpemF0aW9uX3ZlY3RvciwgJmNvbmZpZy0+aXYoKVswXSwKKyAgICAgICAgIGNvbmZpZy0+aXYoKS5zaXplKCkpOworICBkcm1faW5mby0+aW5pdGlhbGl6YXRpb25fdmVjdG9yX3NpemUgPSBjb25maWctPml2KCkuc2l6ZSgpOworICBtZW1jcHkoZHJtX2luZm8tPmlkZW50aWZpZXIsICZjb25maWctPmtleV9pZCgpWzBdLCBjb25maWctPmtleV9pZCgpLnNpemUoKSk7CisgIGRybV9pbmZvLT5pZGVudGlmaWVyX3NpemUgPSBjb25maWctPmtleV9pZCgpLnNpemUoKTsKKyAgZHJtX2luZm8tPnN1YnNhbXBsZV9jb3VudCA9IGNvbmZpZy0+c3Vic2FtcGxlcygpLnNpemUoKTsKKworICBpZiAoZHJtX2luZm8tPnN1YnNhbXBsZV9jb3VudCA+IDApIHsKKyAgICBDT01QSUxFX0FTU0VSVChzaXplb2YoU2JEcm1TdWJTYW1wbGVNYXBwaW5nKSA9PSBzaXplb2YoU3Vic2FtcGxlRW50cnkpLAorICAgICAgICAgICAgICAgICAgIFN1YlNhbXBsZUVudHJ5U2l6ZXNNYXRjaCk7CisgICAgZHJtX2luZm8tPnN1YnNhbXBsZV9tYXBwaW5nID0KKyAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBTYkRybVN1YlNhbXBsZU1hcHBpbmcqPigKKyAgICAgICAgICAgICZjb25maWctPnN1YnNhbXBsZXMoKVswXSk7CisgIH0gZWxzZSB7CisgICAgZHJtX2luZm8tPnN1YnNhbXBsZV9jb3VudCA9IDE7CisgICAgZHJtX2luZm8tPnN1YnNhbXBsZV9tYXBwaW5nID0gc3Vic2FtcGxlX21hcHBpbmc7CisgICAgc3Vic2FtcGxlX21hcHBpbmctPmNsZWFyX2J5dGVfY291bnQgPSAwOworICAgIHN1YnNhbXBsZV9tYXBwaW5nLT5lbmNyeXB0ZWRfYnl0ZV9jb3VudCA9IGJ1ZmZlci0+ZGF0YV9zaXplKCk7CisgIH0KK30KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorLy8gRW5zdXJlIHRoYXQgdGhlIGVudW1zIGluIHN0YXJib2FyZC9tZWRpYS5oIG1hdGNoIGVudW1zIGluIGdmeDo6Q29sb3JTcGFjZS4KKyNkZWZpbmUgRU5VTV9FUShhLCBiKSBcCisgIENPTVBJTEVfQVNTRVJUKHN0YXRpY19jYXN0PGludD4oYSkgPT0gc3RhdGljX2Nhc3Q8aW50PihiKSwgbWlzbWF0Y2hpbmdfZW51bXMpCisKKy8vIEVuc3VyZSBQcmltYXJ5SWQgZW51bXMgY29udmVydCBjb3JyZWN0bHkuCitFTlVNX0VRKGtTYk1lZGlhUHJpbWFyeUlkUmVzZXJ2ZWQwLCBnZng6OkNvbG9yU3BhY2U6OmtQcmltYXJ5SWRSZXNlcnZlZDApOworRU5VTV9FUShrU2JNZWRpYVByaW1hcnlJZEJ0NzA5LCBnZng6OkNvbG9yU3BhY2U6OmtQcmltYXJ5SWRCdDcwOSk7CitFTlVNX0VRKGtTYk1lZGlhUHJpbWFyeUlkVW5zcGVjaWZpZWQsIGdmeDo6Q29sb3JTcGFjZTo6a1ByaW1hcnlJZFVuc3BlY2lmaWVkKTsKK0VOVU1fRVEoa1NiTWVkaWFQcmltYXJ5SWRSZXNlcnZlZCwgZ2Z4OjpDb2xvclNwYWNlOjprUHJpbWFyeUlkUmVzZXJ2ZWQpOworRU5VTV9FUShrU2JNZWRpYVByaW1hcnlJZEJ0NDcwTSwgZ2Z4OjpDb2xvclNwYWNlOjprUHJpbWFyeUlkQnQ0NzBNKTsKK0VOVU1fRVEoa1NiTWVkaWFQcmltYXJ5SWRCdDQ3MEJnLCBnZng6OkNvbG9yU3BhY2U6OmtQcmltYXJ5SWRCdDQ3MEJnKTsKK0VOVU1fRVEoa1NiTWVkaWFQcmltYXJ5SWRTbXB0ZTE3ME0sIGdmeDo6Q29sb3JTcGFjZTo6a1ByaW1hcnlJZFNtcHRlMTcwTSk7CitFTlVNX0VRKGtTYk1lZGlhUHJpbWFyeUlkU21wdGUyNDBNLCBnZng6OkNvbG9yU3BhY2U6OmtQcmltYXJ5SWRTbXB0ZTI0ME0pOworRU5VTV9FUShrU2JNZWRpYVByaW1hcnlJZEZpbG0sIGdmeDo6Q29sb3JTcGFjZTo6a1ByaW1hcnlJZEZpbG0pOworRU5VTV9FUShrU2JNZWRpYVByaW1hcnlJZEJ0MjAyMCwgZ2Z4OjpDb2xvclNwYWNlOjprUHJpbWFyeUlkQnQyMDIwKTsKK0VOVU1fRVEoa1NiTWVkaWFQcmltYXJ5SWRTbXB0ZVN0NDI4MSwgZ2Z4OjpDb2xvclNwYWNlOjprUHJpbWFyeUlkU21wdGVTdDQyODEpOworRU5VTV9FUShrU2JNZWRpYVByaW1hcnlJZFNtcHRlU3Q0MzEyLCBnZng6OkNvbG9yU3BhY2U6OmtQcmltYXJ5SWRTbXB0ZVN0NDMxMik7CitFTlVNX0VRKGtTYk1lZGlhUHJpbWFyeUlkU21wdGVTdDQzMjEsIGdmeDo6Q29sb3JTcGFjZTo6a1ByaW1hcnlJZFNtcHRlU3Q0MzIxKTsKK0VOVU1fRVEoa1NiTWVkaWFQcmltYXJ5SWRMYXN0U3RhbmRhcmRWYWx1ZSwKKyAgICAgICAgZ2Z4OjpDb2xvclNwYWNlOjprUHJpbWFyeUlkTGFzdFN0YW5kYXJkVmFsdWUpOworRU5VTV9FUShrU2JNZWRpYVByaW1hcnlJZFVua25vd24sIGdmeDo6Q29sb3JTcGFjZTo6a1ByaW1hcnlJZFVua25vd24pOworRU5VTV9FUShrU2JNZWRpYVByaW1hcnlJZFh5ekQ1MCwgZ2Z4OjpDb2xvclNwYWNlOjprUHJpbWFyeUlkWHl6RDUwKTsKK0VOVU1fRVEoa1NiTWVkaWFQcmltYXJ5SWRDdXN0b20sIGdmeDo6Q29sb3JTcGFjZTo6a1ByaW1hcnlJZEN1c3RvbSk7CitFTlVNX0VRKGtTYk1lZGlhUHJpbWFyeUlkTGFzdCwgZ2Z4OjpDb2xvclNwYWNlOjprUHJpbWFyeUlkTGFzdCk7CisKKy8vIEVuc3VyZSBUcmFuc2ZlcklkIGVudW1zIGNvbnZlcnQgY29ycmVjdGx5LgorRU5VTV9FUShrU2JNZWRpYVRyYW5zZmVySWRSZXNlcnZlZDAsIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRSZXNlcnZlZDApOworRU5VTV9FUShrU2JNZWRpYVRyYW5zZmVySWRCdDcwOSwgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZEJ0NzA5KTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkVW5zcGVjaWZpZWQsIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRVbnNwZWNpZmllZCk7CitFTlVNX0VRKGtTYk1lZGlhVHJhbnNmZXJJZFJlc2VydmVkLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkUmVzZXJ2ZWQpOworRU5VTV9FUShrU2JNZWRpYVRyYW5zZmVySWRHYW1tYTIyLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkR2FtbWEyMik7CitFTlVNX0VRKGtTYk1lZGlhVHJhbnNmZXJJZEdhbW1hMjgsIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRHYW1tYTI4KTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkU21wdGUxNzBNLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkU21wdGUxNzBNKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkU21wdGUyNDBNLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkU21wdGUyNDBNKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkTGluZWFyLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkTGluZWFyKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkTG9nLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkTG9nKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkTG9nU3FydCwgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZExvZ1NxcnQpOworRU5VTV9FUShrU2JNZWRpYVRyYW5zZmVySWRJZWM2MTk2NjI0LCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkSWVjNjE5NjYyNCk7CitFTlVNX0VRKGtTYk1lZGlhVHJhbnNmZXJJZEJ0MTM2MUVjZywgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZEJ0MTM2MUVjZyk7CitFTlVNX0VRKGtTYk1lZGlhVHJhbnNmZXJJZEllYzYxOTY2MjEsIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRJZWM2MTk2NjIxKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkMTBCaXRCdDIwMjAsIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWQxMEJpdEJ0MjAyMCk7CitFTlVNX0VRKGtTYk1lZGlhVHJhbnNmZXJJZDEyQml0QnQyMDIwLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkMTJCaXRCdDIwMjApOworRU5VTV9FUShrU2JNZWRpYVRyYW5zZmVySWRTbXB0ZVN0MjA4NCwgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZFNtcHRlU3QyMDg0KTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkU21wdGVTdDQyODEsIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRTbXB0ZVN0NDI4MSk7CitFTlVNX0VRKGtTYk1lZGlhVHJhbnNmZXJJZEFyaWJTdGRCNjcsIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRBcmliU3RkQjY3KTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkTGFzdFN0YW5kYXJkVmFsdWUsCisgICAgICAgIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRMYXN0U3RhbmRhcmRWYWx1ZSk7CitFTlVNX0VRKGtTYk1lZGlhVHJhbnNmZXJJZFVua25vd24sIGdmeDo6Q29sb3JTcGFjZTo6a1RyYW5zZmVySWRVbmtub3duKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkR2FtbWEyNCwgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZEdhbW1hMjQpOworRU5VTV9FUShrU2JNZWRpYVRyYW5zZmVySWRTbXB0ZVN0MjA4NE5vbkhkciwKKyAgICAgICAgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZFNtcHRlU3QyMDg0Tm9uSGRyKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkQ3VzdG9tLCBnZng6OkNvbG9yU3BhY2U6OmtUcmFuc2ZlcklkQ3VzdG9tKTsKK0VOVU1fRVEoa1NiTWVkaWFUcmFuc2ZlcklkTGFzdCwgZ2Z4OjpDb2xvclNwYWNlOjprVHJhbnNmZXJJZExhc3QpOworCisvLyBFbnN1cmUgTWF0cml4SWQgZW51bXMgY29udmVydCBjb3JyZWN0bHkuCitFTlVNX0VRKGtTYk1lZGlhTWF0cml4SWRSZ2IsIGdmeDo6Q29sb3JTcGFjZTo6a01hdHJpeElkUmdiKTsKK0VOVU1fRVEoa1NiTWVkaWFNYXRyaXhJZEJ0NzA5LCBnZng6OkNvbG9yU3BhY2U6OmtNYXRyaXhJZEJ0NzA5KTsKK0VOVU1fRVEoa1NiTWVkaWFNYXRyaXhJZFVuc3BlY2lmaWVkLCBnZng6OkNvbG9yU3BhY2U6OmtNYXRyaXhJZFVuc3BlY2lmaWVkKTsKK0VOVU1fRVEoa1NiTWVkaWFNYXRyaXhJZFJlc2VydmVkLCBnZng6OkNvbG9yU3BhY2U6OmtNYXRyaXhJZFJlc2VydmVkKTsKK0VOVU1fRVEoa1NiTWVkaWFNYXRyaXhJZEZjYywgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRGY2MpOworRU5VTV9FUShrU2JNZWRpYU1hdHJpeElkQnQ0NzBCZywgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRCdDQ3MEJnKTsKK0VOVU1fRVEoa1NiTWVkaWFNYXRyaXhJZFNtcHRlMTcwTSwgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRTbXB0ZTE3ME0pOworRU5VTV9FUShrU2JNZWRpYU1hdHJpeElkU21wdGUyNDBNLCBnZng6OkNvbG9yU3BhY2U6OmtNYXRyaXhJZFNtcHRlMjQwTSk7CitFTlVNX0VRKGtTYk1lZGlhTWF0cml4SWRZQ2dDbywgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRZQ2dDbyk7CitFTlVNX0VRKGtTYk1lZGlhTWF0cml4SWRCdDIwMjBOb25jb25zdGFudEx1bWluYW5jZSwKKyAgICAgICAgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRCdDIwMjBOb25jb25zdGFudEx1bWluYW5jZSk7CitFTlVNX0VRKGtTYk1lZGlhTWF0cml4SWRCdDIwMjBDb25zdGFudEx1bWluYW5jZSwKKyAgICAgICAgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRCdDIwMjBDb25zdGFudEx1bWluYW5jZSk7CitFTlVNX0VRKGtTYk1lZGlhTWF0cml4SWRZRHpEeCwgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRZRHpEeCk7CitFTlVNX0VRKGtTYk1lZGlhTWF0cml4SWRMYXN0U3RhbmRhcmRWYWx1ZSwKKyAgICAgICAgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRMYXN0U3RhbmRhcmRWYWx1ZSk7CitFTlVNX0VRKGtTYk1lZGlhTWF0cml4SWRVbmtub3duLCBnZng6OkNvbG9yU3BhY2U6OmtNYXRyaXhJZFVua25vd24pOworRU5VTV9FUShrU2JNZWRpYU1hdHJpeElkTGFzdCwgZ2Z4OjpDb2xvclNwYWNlOjprTWF0cml4SWRMYXN0KTsKKworLy8gRW5zdXJlIFJhbmdlSWQgZW51bXMgY29udmVydCBjb3JyZWN0bHkuCitFTlVNX0VRKGtTYk1lZGlhUmFuZ2VJZFVuc3BlY2lmaWVkLCBnZng6OkNvbG9yU3BhY2U6OmtSYW5nZUlkVW5zcGVjaWZpZWQpOworRU5VTV9FUShrU2JNZWRpYVJhbmdlSWRMaW1pdGVkLCBnZng6OkNvbG9yU3BhY2U6OmtSYW5nZUlkTGltaXRlZCk7CitFTlVNX0VRKGtTYk1lZGlhUmFuZ2VJZEZ1bGwsIGdmeDo6Q29sb3JTcGFjZTo6a1JhbmdlSWRGdWxsKTsKK0VOVU1fRVEoa1NiTWVkaWFSYW5nZUlkRGVyaXZlZCwgZ2Z4OjpDb2xvclNwYWNlOjprUmFuZ2VJZERlcml2ZWQpOworRU5VTV9FUShrU2JNZWRpYVJhbmdlSWRMYXN0LCBnZng6OkNvbG9yU3BhY2U6OmtSYW5nZUlkTGFzdCk7CisKK1NiTWVkaWFDb2xvck1ldGFkYXRhIE1lZGlhVG9TYk1lZGlhQ29sb3JNZXRhZGF0YSgKKyAgICBjb25zdCBXZWJNQ29sb3JNZXRhZGF0YSYgd2VibV9jb2xvcl9tZXRhZGF0YSkgeworICBTYk1lZGlhQ29sb3JNZXRhZGF0YSBzYl9tZWRpYV9jb2xvcl9tZXRhZGF0YTsKKworICAvLyBDb3B5IHRoZSBvdGhlciBjb2xvciBtZXRhZGF0YSBiZWxvdy4KKyAgc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEuYml0c19wZXJfY2hhbm5lbCA9IHdlYm1fY29sb3JfbWV0YWRhdGEuQml0c1BlckNoYW5uZWw7CisgIHNiX21lZGlhX2NvbG9yX21ldGFkYXRhLmNocm9tYV9zdWJzYW1wbGluZ19ob3Jpem9udGFsID0KKyAgICAgIHdlYm1fY29sb3JfbWV0YWRhdGEuQ2hyb21hU3Vic2FtcGxpbmdIb3J6OworICBzYl9tZWRpYV9jb2xvcl9tZXRhZGF0YS5jaHJvbWFfc3Vic2FtcGxpbmdfdmVydGljYWwgPQorICAgICAgd2VibV9jb2xvcl9tZXRhZGF0YS5DaHJvbWFTdWJzYW1wbGluZ1ZlcnQ7CisgIHNiX21lZGlhX2NvbG9yX21ldGFkYXRhLmNiX3N1YnNhbXBsaW5nX2hvcml6b250YWwgPQorICAgICAgd2VibV9jb2xvcl9tZXRhZGF0YS5DYlN1YnNhbXBsaW5nSG9yejsKKyAgc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEuY2Jfc3Vic2FtcGxpbmdfdmVydGljYWwgPQorICAgICAgd2VibV9jb2xvcl9tZXRhZGF0YS5DYlN1YnNhbXBsaW5nVmVydDsKKyAgc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEuY2hyb21hX3NpdGluZ19ob3Jpem9udGFsID0KKyAgICAgIHdlYm1fY29sb3JfbWV0YWRhdGEuQ2hyb21hU2l0aW5nSG9yejsKKyAgc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEuY2hyb21hX3NpdGluZ192ZXJ0aWNhbCA9CisgICAgICB3ZWJtX2NvbG9yX21ldGFkYXRhLkNocm9tYVNpdGluZ1ZlcnQ7CisKKyAgLy8gQ29weSB0aGUgSERSIE1ldGFkYXRhIGJlbG93LgorICBTYk1lZGlhTWFzdGVyaW5nTWV0YWRhdGEgc2JfbWVkaWFfbWFzdGVyaW5nX21ldGFkYXRhOworICBIRFJNZXRhZGF0YSBoZHJfbWV0YWRhdGEgPSB3ZWJtX2NvbG9yX21ldGFkYXRhLmhkcl9tZXRhZGF0YTsKKyAgTWFzdGVyaW5nTWV0YWRhdGEgbWFzdGVyaW5nX21ldGFkYXRhID0gaGRyX21ldGFkYXRhLm1hc3RlcmluZ19tZXRhZGF0YTsKKworICBzYl9tZWRpYV9tYXN0ZXJpbmdfbWV0YWRhdGEucHJpbWFyeV9yX2Nocm9tYXRpY2l0eV94ID0KKyAgICAgIG1hc3RlcmluZ19tZXRhZGF0YS5wcmltYXJ5X3JfY2hyb21hdGljaXR5X3g7CisgIHNiX21lZGlhX21hc3RlcmluZ19tZXRhZGF0YS5wcmltYXJ5X3JfY2hyb21hdGljaXR5X3kgPQorICAgICAgbWFzdGVyaW5nX21ldGFkYXRhLnByaW1hcnlfcl9jaHJvbWF0aWNpdHlfeTsKKworICBzYl9tZWRpYV9tYXN0ZXJpbmdfbWV0YWRhdGEucHJpbWFyeV9nX2Nocm9tYXRpY2l0eV94ID0KKyAgICAgIG1hc3RlcmluZ19tZXRhZGF0YS5wcmltYXJ5X2dfY2hyb21hdGljaXR5X3g7CisgIHNiX21lZGlhX21hc3RlcmluZ19tZXRhZGF0YS5wcmltYXJ5X2dfY2hyb21hdGljaXR5X3kgPQorICAgICAgbWFzdGVyaW5nX21ldGFkYXRhLnByaW1hcnlfZ19jaHJvbWF0aWNpdHlfeTsKKworICBzYl9tZWRpYV9tYXN0ZXJpbmdfbWV0YWRhdGEucHJpbWFyeV9iX2Nocm9tYXRpY2l0eV94ID0KKyAgICAgIG1hc3RlcmluZ19tZXRhZGF0YS5wcmltYXJ5X2JfY2hyb21hdGljaXR5X3g7CisgIHNiX21lZGlhX21hc3RlcmluZ19tZXRhZGF0YS5wcmltYXJ5X2JfY2hyb21hdGljaXR5X3kgPQorICAgICAgbWFzdGVyaW5nX21ldGFkYXRhLnByaW1hcnlfYl9jaHJvbWF0aWNpdHlfeTsKKworICBzYl9tZWRpYV9tYXN0ZXJpbmdfbWV0YWRhdGEud2hpdGVfcG9pbnRfY2hyb21hdGljaXR5X3ggPQorICAgICAgbWFzdGVyaW5nX21ldGFkYXRhLndoaXRlX3BvaW50X2Nocm9tYXRpY2l0eV94OworICBzYl9tZWRpYV9tYXN0ZXJpbmdfbWV0YWRhdGEud2hpdGVfcG9pbnRfY2hyb21hdGljaXR5X3kgPQorICAgICAgbWFzdGVyaW5nX21ldGFkYXRhLndoaXRlX3BvaW50X2Nocm9tYXRpY2l0eV95OworCisgIHNiX21lZGlhX21hc3RlcmluZ19tZXRhZGF0YS5sdW1pbmFuY2VfbWF4ID0gbWFzdGVyaW5nX21ldGFkYXRhLmx1bWluYW5jZV9tYXg7CisgIHNiX21lZGlhX21hc3RlcmluZ19tZXRhZGF0YS5sdW1pbmFuY2VfbWluID0gbWFzdGVyaW5nX21ldGFkYXRhLmx1bWluYW5jZV9taW47CisKKyAgc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEubWFzdGVyaW5nX21ldGFkYXRhID0gc2JfbWVkaWFfbWFzdGVyaW5nX21ldGFkYXRhOworICBzYl9tZWRpYV9jb2xvcl9tZXRhZGF0YS5tYXhfY2xsID0gaGRyX21ldGFkYXRhLm1heF9jbGw7CisgIHNiX21lZGlhX2NvbG9yX21ldGFkYXRhLm1heF9mYWxsID0gaGRyX21ldGFkYXRhLm1heF9mYWxsOworCisgIC8vIENvcHkgdGhlIGNvbG9yIHNwYWNlIGJlbG93LgorICBnZng6OkNvbG9yU3BhY2UgY29sb3Jfc3BhY2UgPSB3ZWJtX2NvbG9yX21ldGFkYXRhLmNvbG9yX3NwYWNlOworICBzYl9tZWRpYV9jb2xvcl9tZXRhZGF0YS5wcmltYXJpZXMgPQorICAgICAgc3RhdGljX2Nhc3Q8U2JNZWRpYVByaW1hcnlJZD4oY29sb3Jfc3BhY2UucHJpbWFyaWVzKCkpOworICBzYl9tZWRpYV9jb2xvcl9tZXRhZGF0YS50cmFuc2ZlciA9CisgICAgICBzdGF0aWNfY2FzdDxTYk1lZGlhVHJhbnNmZXJJZD4oY29sb3Jfc3BhY2UudHJhbnNmZXIoKSk7CisgIHNiX21lZGlhX2NvbG9yX21ldGFkYXRhLm1hdHJpeCA9CisgICAgICBzdGF0aWNfY2FzdDxTYk1lZGlhTWF0cml4SWQ+KGNvbG9yX3NwYWNlLm1hdHJpeCgpKTsKKyAgc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEucmFuZ2UgPQorICAgICAgc3RhdGljX2Nhc3Q8U2JNZWRpYVJhbmdlSWQ+KGNvbG9yX3NwYWNlLnJhbmdlKCkpOworICBpZiAoc2JfbWVkaWFfY29sb3JfbWV0YWRhdGEucHJpbWFyaWVzID09IGtTYk1lZGlhUHJpbWFyeUlkQ3VzdG9tKSB7CisgICAgY29uc3QgZmxvYXQqIGN1c3RvbV9wcmltYXJ5X21hdHJpeCA9IGNvbG9yX3NwYWNlLmN1c3RvbV9wcmltYXJ5X21hdHJpeCgpOworICAgIFNiTWVtb3J5Q29weShzYl9tZWRpYV9jb2xvcl9tZXRhZGF0YS5jdXN0b21fcHJpbWFyeV9tYXRyaXgsCisgICAgICAgICAgICAgICAgIGN1c3RvbV9wcmltYXJ5X21hdHJpeCwgc2l6ZW9mKGN1c3RvbV9wcmltYXJ5X21hdHJpeCkpOworICB9CisKKyAgcmV0dXJuIHNiX21lZGlhX2NvbG9yX21ldGFkYXRhOworfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3V0aWxzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3V0aWxzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjI4ZWRlYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuaApAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9NRURJQV9CQVNFX1NUQVJCT0FSRF9VVElMU19IXworI2RlZmluZSBDT0JBTFRfTUVESUFfQkFTRV9TVEFSQk9BUkRfVVRJTFNfSF8KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZGVjb2Rlcl9idWZmZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2NvbG91cl9wYXJzZXIuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvZHJtLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKK1NiTWVkaWFBdWRpb0NvZGVjIE1lZGlhQXVkaW9Db2RlY1RvU2JNZWRpYUF1ZGlvQ29kZWMoQXVkaW9Db2RlYyBjb2RlYyk7CitTYk1lZGlhVmlkZW9Db2RlYyBNZWRpYVZpZGVvQ29kZWNUb1NiTWVkaWFWaWRlb0NvZGVjKFZpZGVvQ29kZWMgY29kZWMpOworCitiYXNlOjpUaW1lRGVsdGEgU2JNZWRpYVRpbWVUb1RpbWVEZWx0YShTYk1lZGlhVGltZSB0aW1lc3RhbXApOworU2JNZWRpYVRpbWUgVGltZURlbHRhVG9TYk1lZGlhVGltZShiYXNlOjpUaW1lRGVsdGEgdGltZWRlbHRhKTsKKworRGVtdXhlclN0cmVhbTo6VHlwZSBTYk1lZGlhVHlwZVRvRGVtdXhlclN0cmVhbVR5cGUoU2JNZWRpYVR5cGUgdHlwZSk7CitTYk1lZGlhVHlwZSBEZW11eGVyU3RyZWFtVHlwZVRvU2JNZWRpYVR5cGUoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKTsKKwordm9pZCBGaWxsRHJtU2FtcGxlSW5mbyhjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU2FtcGxlSW5mbyogZHJtX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3ViU2FtcGxlTWFwcGluZyogc3Vic2FtcGxlX21hcHBpbmcpOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCitTYk1lZGlhQ29sb3JNZXRhZGF0YSBNZWRpYVRvU2JNZWRpYUNvbG9yTWV0YWRhdGEoCisgICAgY29uc3QgV2ViTUNvbG9yTWV0YWRhdGEmIHdlYm1fY29sb3JfbWV0YWRhdGEpOworI2VuZGlmCisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9CQVNFX1NUQVJCT0FSRF9VVElMU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyLmgKaW5kZXggZGNlYmYyYS4uMDk2YmQwNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3N0cmVhbV9wYXJzZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlci5oCkBAIC01Miw3ICs1Miw3IEBACiAKICAgLy8gU3RyZWFtIHBhcmFtZXRlcnMgcGFzc2VkIGluIEluaXRDQi4KICAgc3RydWN0IE1FRElBX0VYUE9SVCBJbml0UGFyYW1ldGVycyB7Ci0gICAgSW5pdFBhcmFtZXRlcnMoYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uKTsKKyAgICBleHBsaWNpdCBJbml0UGFyYW1ldGVycyhiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24pOwogCiAgICAgLy8gU3RyZWFtIGR1cmF0aW9uLgogICAgIGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbjsKQEAgLTEyMCwxMCArMTIwLDggQEAKICAgLy8gc3RhcnQgdGltZSwgYW5kIGR1cmF0aW9uLiBJZiB8aWdub3JlX3RleHRfdHJhY2t8IGlzIHRydWUsIHRoZW4gbm8gdGV4dAogICAvLyBidWZmZXJzIHNob3VsZCBiZSBwYXNzZWQgbGF0ZXIgYnkgdGhlIHBhcnNlciB0byB8bmV3X2J1ZmZlcnNfY2J8LgogICB2aXJ0dWFsIHZvaWQgSW5pdCgKLSAgICAgIGNvbnN0IEluaXRDQiYgaW5pdF9jYiwKLSAgICAgIGNvbnN0IE5ld0NvbmZpZ0NCJiBjb25maWdfY2IsCi0gICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIG5ld19idWZmZXJzX2NiLAotICAgICAgYm9vbCBpZ25vcmVfdGV4dF90cmFjaywKKyAgICAgIGNvbnN0IEluaXRDQiYgaW5pdF9jYiwgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKKyAgICAgIGNvbnN0IE5ld0J1ZmZlcnNDQiYgbmV3X2J1ZmZlcnNfY2IsIGJvb2wgaWdub3JlX3RleHRfdHJhY2ssCiAgICAgICBjb25zdCBFbmNyeXB0ZWRNZWRpYUluaXREYXRhQ0ImIGVuY3J5cHRlZF9tZWRpYV9pbml0X2RhdGFfY2IsCiAgICAgICBjb25zdCBOZXdNZWRpYVNlZ21lbnRDQiYgbmV3X3NlZ21lbnRfY2IsCiAgICAgICBjb25zdCBFbmRNZWRpYVNlZ21lbnRDQiYgZW5kX29mX3NlZ21lbnRfY2IsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2Uvc3RyZWFtX3BhcnNlcl9idWZmZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oCmluZGV4IDk3NjA5MDAuLmU3NmY2ZDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5oCkBAIC0yNiwyMSArMjYsMjAgQEAKIGNsYXNzIERlY29kZVRpbWVzdGFtcCB7CiAgcHVibGljOgogICBEZWNvZGVUaW1lc3RhbXAoKSB7fQotICBEZWNvZGVUaW1lc3RhbXAoY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIDogdHNfKHJocy50c18pIHsgfQorICBEZWNvZGVUaW1lc3RhbXAoY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIDogdHNfKHJocy50c18pIHt9CiAgIERlY29kZVRpbWVzdGFtcCYgb3BlcmF0b3I9KGNvbnN0IERlY29kZVRpbWVzdGFtcCYgcmhzKSB7Ci0gICAgaWYgKCZyaHMgIT0gdGhpcykKLSAgICAgIHRzXyA9IHJocy50c187CisgICAgaWYgKCZyaHMgIT0gdGhpcykgdHNfID0gcmhzLnRzXzsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KIAogICAvLyBPbmx5IG9wZXJhdG9ycyB0aGF0IGFyZSBhY3R1YWxseSB1c2VkIGJ5IHRoZSBjb2RlIGhhdmUgYmVlbiBkZWZpbmVkLgogICAvLyBSZXZpZXdlcnMgc2hvdWxkIHBheSBjbG9zZSBhdHRlbnRpb24gdG8gdGhlIGFkZGl0aW9uIG9mIG5ldyBvcGVyYXRvcnMuCiAgIGJvb2wgb3BlcmF0b3I8KGNvbnN0IERlY29kZVRpbWVzdGFtcCYgcmhzKSBjb25zdCB7IHJldHVybiB0c18gPCByaHMudHNfOyB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IERlY29kZVRpbWVzdGFtcCYgcmhzKSBjb25zdCAgeyByZXR1cm4gdHNfID4gcmhzLnRzXzsgfQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIGNvbnN0ICB7IHJldHVybiB0c18gPT0gcmhzLnRzXzsgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIGNvbnN0ICB7IHJldHVybiB0c18gIT0gcmhzLnRzXzsgfQotICBib29sIG9wZXJhdG9yPj0oY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIGNvbnN0ICB7IHJldHVybiB0c18gPj0gcmhzLnRzXzsgfQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIGNvbnN0ICB7IHJldHVybiB0c18gPD0gcmhzLnRzXzsgfQorICBib29sIG9wZXJhdG9yPihjb25zdCBEZWNvZGVUaW1lc3RhbXAmIHJocykgY29uc3QgeyByZXR1cm4gdHNfID4gcmhzLnRzXzsgfQorICBib29sIG9wZXJhdG9yPT0oY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIGNvbnN0IHsgcmV0dXJuIHRzXyA9PSByaHMudHNfOyB9CisgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBEZWNvZGVUaW1lc3RhbXAmIHJocykgY29uc3QgeyByZXR1cm4gdHNfICE9IHJocy50c187IH0KKyAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IERlY29kZVRpbWVzdGFtcCYgcmhzKSBjb25zdCB7IHJldHVybiB0c18gPj0gcmhzLnRzXzsgfQorICBib29sIG9wZXJhdG9yPD0oY29uc3QgRGVjb2RlVGltZXN0YW1wJiByaHMpIGNvbnN0IHsgcmV0dXJuIHRzXyA8PSByaHMudHNfOyB9CiAKICAgYmFzZTo6VGltZURlbHRhIG9wZXJhdG9yLShjb25zdCBEZWNvZGVUaW1lc3RhbXAmIHJocykgY29uc3QgewogICAgIHJldHVybiB0c18gLSByaHMudHNfOwpAQCAtNTEsNyArNTAsNyBAQAogICAgIHJldHVybiAqdGhpczsKICAgfQogCi0gIERlY29kZVRpbWVzdGFtcCYgb3BlcmF0b3ItPShjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHJocykgIHsKKyAgRGVjb2RlVGltZXN0YW1wJiBvcGVyYXRvci09KGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgcmhzKSB7CiAgICAgdHNfIC09IHJoczsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KQEAgLTkzLDcgKzkyLDcgQEAKICAgYmFzZTo6VGltZURlbHRhIFRvUHJlc2VudGF0aW9uVGltZSgpIGNvbnN0IHsgcmV0dXJuIHRzXzsgfQogCiAgcHJpdmF0ZToKLSAgZXhwbGljaXQgRGVjb2RlVGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIDogdHNfKHRpbWVzdGFtcCkgeyB9CisgIGV4cGxpY2l0IERlY29kZVRpbWVzdGFtcChiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSA6IHRzXyh0aW1lc3RhbXApIHt9CiAKICAgYmFzZTo6VGltZURlbHRhIHRzXzsKIH07CkBAIC0xMTcsMTMgKzExNiw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlfZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVHlwZSB0eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRyYWNrSWQgdHJhY2tfaWQpOwotICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IENvcHlGcm9tKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzaWRlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpZGVfZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUcmFja0lkIHRyYWNrX2lkKTsKKyAgc3RhdGljIHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBDb3B5RnJvbSgKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBkYXRhX3NpemUsIGNvbnN0IHVpbnQ4X3QqIHNpZGVfZGF0YSwKKyAgICAgIGludCBzaWRlX2RhdGFfc2l6ZSwgYm9vbCBpc19rZXlfZnJhbWUsIFR5cGUgdHlwZSwgVHJhY2tJZCB0cmFja19pZCk7CiAKICAgLy8gRGVjb2RlIHRpbWVzdGFtcC4gSWYgbm90IGV4cGxpY2l0bHkgc2V0LCBvciBzZXQgdG8ga05vVGltZXN0YW1wLCB0aGUKICAgLy8gdmFsdWUgd2lsbCBiZSB0YWtlbiBmcm9tIHRoZSBub3JtYWwgdGltZXN0YW1wLgpAQCAtMTg2LDEzICsxODEsOSBAQAogICB9CiAKICBwcml2YXRlOgotICBTdHJlYW1QYXJzZXJCdWZmZXIoY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBzaWRlX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgc2lkZV9kYXRhX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGlzX2tleV9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIFRyYWNrSWQgdHJhY2tfaWQpOworICBTdHJlYW1QYXJzZXJCdWZmZXIoY29uc3QgdWludDhfdCogZGF0YSwgaW50IGRhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHNpZGVfZGF0YSwgaW50IHNpZGVfZGF0YV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlfZnJhbWUsIFR5cGUgdHlwZSwgVHJhY2tJZCB0cmFja19pZCk7CiAgIH5TdHJlYW1QYXJzZXJCdWZmZXIoKSBPVkVSUklERTsKIAogICBEZWNvZGVUaW1lc3RhbXAgZGVjb2RlX3RpbWVzdGFtcF87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGVzdF9oZWxwZXJzLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGVzdF9oZWxwZXJzLmgKaW5kZXggNDljYzQ1ZC4uNjc5MzYwMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3Rlc3RfaGVscGVycy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS90ZXN0X2hlbHBlcnMuaApAQCAtMTMxLDE4ICsxMzEsMTUgQEAKIHNjb3BlZF9yZWZwdHI8QXVkaW9CdWZmZXI+IE1ha2VBdWRpb0J1ZmZlcihTYW1wbGVGb3JtYXQgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxMYXlvdXQgY2hhbm5lbF9sYXlvdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGNoYW5uZWxfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBpbmNyZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGZyYW1lcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX3JhdGUsIFQgc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBpbmNyZW1lbnQsIHNpemVfdCBmcmFtZXMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAKIC8vIENyZWF0ZSBhIGZha2UgdmlkZW8gRGVjb2RlckJ1ZmZlciBmb3IgdGVzdGluZyBwdXJwb3NlLiBUaGUgYnVmZmVyIGNvbnRhaW5zCiAvLyBwYXJ0IG9mIHZpZGVvIGRlY29kZXIgY29uZmlnIGluZm8gZW1iZWRkZWQgc28gdGhhdCB0aGUgdGVzdGluZyBjb2RlIGNhbiBkbwogLy8gc29tZSBzYW5pdHkgY2hlY2suCiBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IENyZWF0ZUZha2VWaWRlb0J1ZmZlckZvclRlc3QoCi0gICAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsCi0gICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwKKyAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCwKICAgICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb24pOwogCiAvLyBWZXJpZnkgaWYgYSBmYWtlIHZpZGVvIERlY29kZXJCdWZmZXIgaXMgdmFsaWQuCkBAIC0xNTQsOSArMTUxLDcgQEAKICAgICAgICAgIGFyZy0+dGltZXN0YW1wKCkuSW5NaWxsaXNlY29uZHMoKSA9PSB0aW1lc3RhbXBfaW5fbXM7CiB9CiAKLU1BVENIRVIoSXNFbmRPZlN0cmVhbSwgIiIpIHsKLSAgcmV0dXJuIGFyZy5nZXQoKSAmJiBhcmctPmVuZF9vZl9zdHJlYW0oKTsKLX0KK01BVENIRVIoSXNFbmRPZlN0cmVhbSwgIiIpIHsgcmV0dXJuIGFyZy5nZXQoKSAmJiBhcmctPmVuZF9vZl9zdHJlYW0oKTsgfQogCiBNQVRDSEVSX1AoU2VnbWVudE1pc3NpbmdGcmFtZXMsIHRyYWNrX2lkLCAiIikgewogICByZXR1cm4gQ09OVEFJTlNfU1RSSU5HKApAQCAtMjAzLDkgKzE5OCw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6SW50VG9TdHJpbmcodGltZV9taWNyb3NlY29uZHMpICsgInVzLiIpOwogfQogCi1NQVRDSEVSX1AyKFNraXBwaW5nU3BsaWNlQXRPckJlZm9yZSwKLSAgICAgICAgICAgbmV3X21pY3Jvc2Vjb25kcywKLSAgICAgICAgICAgZXhpc3RpbmdfbWljcm9zZWNvbmRzLAorTUFUQ0hFUl9QMihTa2lwcGluZ1NwbGljZUF0T3JCZWZvcmUsIG5ld19taWNyb3NlY29uZHMsIGV4aXN0aW5nX21pY3Jvc2Vjb25kcywKICAgICAgICAgICAgIiIpIHsKICAgcmV0dXJuIENPTlRBSU5TX1NUUklORygKICAgICAgIGFyZywgIlNraXBwaW5nIHNwbGljZSBmcmFtZSBnZW5lcmF0aW9uOiBmaXJzdCBuZXcgYnVmZmVyIGF0ICIgKwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3RleHRfY3VlLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGV4dF9jdWUuaAppbmRleCBiODkzZGM4Li5hYzRkNGYzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGV4dF9jdWUuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGV4dF9jdWUuaApAQCAtMTUsMTMgKzE1LDEwIEBACiBuYW1lc3BhY2UgbWVkaWEgewogCiAvLyBBIHRleHQgYnVmZmVyIHRvIGNhcnJ5IHRoZSBjb21wb25lbnRzIG9mIGEgdGV4dCB0cmFjayBjdWUuCi1jbGFzcyBNRURJQV9FWFBPUlQgVGV4dEN1ZQotICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFRleHRDdWU+IHsKK2NsYXNzIE1FRElBX0VYUE9SVCBUZXh0Q3VlIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFRleHRDdWU+IHsKICBwdWJsaWM6Ci0gIFRleHRDdWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiB0aW1lc3RhbXAsCi0gICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBkdXJhdGlvbiwKLSAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIHNldHRpbmdzLAorICBUZXh0Q3VlKGNvbnN0IGJhc2U6OlRpbWVEZWx0YSYgdGltZXN0YW1wLCBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGR1cmF0aW9uLAorICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIHNldHRpbmdzLAogICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0ZXh0KTsKIAogICAvLyBBY2Nlc3MgdG8gY29uc3RydWN0b3IgcGFyYW1ldGVycy4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS90ZXh0X3JlbmRlcmVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGV4dF9yZW5kZXJlci5oCmluZGV4IGU4OWU4YjQuLmVlMTUyZWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS90ZXh0X3JlbmRlcmVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3RleHRfcmVuZGVyZXIuaApAQCAtMzYsOSArMzYsOCBAQAogICAvLwogICAvLyB8YWRkX3RleHRfdHJhY2tfY2JdIGlzIGNhbGxlZCB3aGVuIHRoZSBkZW11eGVyIHJlcXVlc3RzICh2aWEgaXRzIGhvc3QpCiAgIC8vIHRoYXQgYSBuZXcgdGV4dCB0cmFjayBiZSBjcmVhdGVkLgotICBUZXh0UmVuZGVyZXIoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiB0YXNrX3J1bm5lciwKLSAgICAgIGNvbnN0IEFkZFRleHRUcmFja0NCJiBhZGRfdGV4dF90cmFja19jYik7CisgIFRleHRSZW5kZXJlcihjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiB0YXNrX3J1bm5lciwKKyAgICAgICAgICAgICAgIGNvbnN0IEFkZFRleHRUcmFja0NCJiBhZGRfdGV4dF90cmFja19jYik7CiAKICAgLy8gU3RvcHMgYWxsIG9wZXJhdGlvbnMgYW5kIGZpcmVzIGFsbCBwZW5kaW5nIGNhbGxiYWNrcy4KICAgflRleHRSZW5kZXJlcigpOwpAQCAtNTksOCArNTgsNyBAQAogCiAgIC8vIEFkZHMgbmV3IHx0ZXh0X3N0cmVhbXwsIGhhdmluZyB0aGUgaW5kaWNhdGVkIHxjb25maWd8LCB0byB0aGUgdGV4dCBzdHJlYW0KICAgLy8gY29sbGVjdGlvbiBtYW5hZ2VkIGJ5IHRoaXMgdGV4dCByZW5kZXJlci4KLSAgdm9pZCBBZGRUZXh0U3RyZWFtKERlbXV4ZXJTdHJlYW0qIHRleHRfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgVGV4dFRyYWNrQ29uZmlnJiBjb25maWcpOworICB2b2lkIEFkZFRleHRTdHJlYW0oRGVtdXhlclN0cmVhbSogdGV4dF9zdHJlYW0sIGNvbnN0IFRleHRUcmFja0NvbmZpZyYgY29uZmlnKTsKIAogICAvLyBSZW1vdmVzIHx0ZXh0X3N0cmVhbXwgZnJvbSB0aGUgdGV4dCBzdHJlYW0gY29sbGVjdGlvbi4KICAgdm9pZCBSZW1vdmVUZXh0U3RyZWFtKERlbXV4ZXJTdHJlYW0qIHRleHRfc3RyZWFtKTsKQEAgLTcxLDEwICs2OSw3IEBACiAgcHJpdmF0ZToKICAgc3RydWN0IFRleHRUcmFja1N0YXRlIHsKICAgICAvLyBUbyBkZXRlcm1pbmUgcmVhZCBwcm9ncmVzcy4KLSAgICBlbnVtIFJlYWRTdGF0ZSB7Ci0gICAgICBrUmVhZElkbGUsCi0gICAgICBrUmVhZFBlbmRpbmcKLSAgICB9OworICAgIGVudW0gUmVhZFN0YXRlIHsga1JlYWRJZGxlLCBrUmVhZFBlbmRpbmcgfTsKIAogICAgIGV4cGxpY2l0IFRleHRUcmFja1N0YXRlKHN0ZDo6dW5pcXVlX3B0cjxUZXh0VHJhY2s+IHRleHRfdHJhY2spOwogICAgIH5UZXh0VHJhY2tTdGF0ZSgpOwpAQCAtODYsOCArODEsNyBAQAogCiAgIC8vIENhbGxiYWNrIGRlbGl2ZXJlZCBieSB0aGUgZGVtdXhlciB8dGV4dF9zdHJlYW18IHdoZW4KICAgLy8gYSByZWFkIGZyb20gdGhlIHN0cmVhbSBjb21wbGV0ZXMuCi0gIHZvaWQgQnVmZmVyUmVhZHkoRGVtdXhlclN0cmVhbSogdGV4dF9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKKyAgdm9pZCBCdWZmZXJSZWFkeShEZW11eGVyU3RyZWFtKiB0ZXh0X3N0cmVhbSwgRGVtdXhlclN0cmVhbTo6U3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBpbnB1dCk7CiAKICAgLy8gRGlzcGF0Y2hlcyB0aGUgZGVjb2RlZCBjdWUgZGVsaXZlcmVkIG9uIHRoZSBkZW11eGVyJ3MgfHRleHRfc3RyZWFtfC4KQEAgLTExMiwxMyArMTA2LDcgQEAKICAgYmFzZTo6Q2xvc3VyZSBwYXVzZV9jYl87CiAKICAgLy8gU2ltcGxlIHN0YXRlIHRyYWNraW5nIHZhcmlhYmxlLgotICBlbnVtIFN0YXRlIHsKLSAgICBrVW5pbml0aWFsaXplZCwKLSAgICBrUGF1c2VQZW5kaW5nLAotICAgIGtQYXVzZWQsCi0gICAga1BsYXlpbmcsCi0gICAga0VuZGVkCi0gIH07CisgIGVudW0gU3RhdGUgeyBrVW5pbml0aWFsaXplZCwga1BhdXNlUGVuZGluZywga1BhdXNlZCwga1BsYXlpbmcsIGtFbmRlZCB9OwogICBTdGF0ZSBzdGF0ZV87CiAKICAgc3RkOjptYXA8RGVtdXhlclN0cmVhbSosIHN0ZDo6dW5pcXVlX3B0cjxUZXh0VHJhY2tTdGF0ZT4+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGV4dF90cmFjay5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3RleHRfdHJhY2suaAppbmRleCBkMGUxMmJjLi40OTJkYjljIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGV4dF90cmFjay5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS90ZXh0X3RyYWNrLmgKQEAgLTE5LDggKzE5LDcgQEAKICBwdWJsaWM6CiAgIHZpcnR1YWwgflRleHRUcmFjaygpIHt9CiAgIHZpcnR1YWwgdm9pZCBhZGRXZWJWVFRDdWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbmQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgc2V0dGluZ3MpID0gMDsKIH07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGV4dF90cmFja19jb25maWcuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS90ZXh0X3RyYWNrX2NvbmZpZy5oCmluZGV4IDY0N2JhMjYuLjA1NzE4ZDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS90ZXh0X3RyYWNrX2NvbmZpZy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS90ZXh0X3RyYWNrX2NvbmZpZy5oCkBAIC0yMywxMCArMjMsOCBAQAogY2xhc3MgTUVESUFfRVhQT1JUIFRleHRUcmFja0NvbmZpZyB7CiAgcHVibGljOgogICBUZXh0VHJhY2tDb25maWcoKTsKLSAgVGV4dFRyYWNrQ29uZmlnKFRleHRLaW5kIGtpbmQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFiZWwsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgaWQpOworICBUZXh0VHJhY2tDb25maWcoVGV4dEtpbmQga2luZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGxhYmVsLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLCBjb25zdCBzdGQ6OnN0cmluZyYgaWQpOwogCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgZmllbGRzIGluIHxjb25maWd8IG1hdGNoIHRoaXMgY29uZmlnLgogICBib29sIE1hdGNoZXMoY29uc3QgVGV4dFRyYWNrQ29uZmlnJiBjb25maWcpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3RpbWVfZGVsdGFfaW50ZXJwb2xhdG9yLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGltZV9kZWx0YV9pbnRlcnBvbGF0b3IuaAppbmRleCBhZGIwZDg5Li5iOGVkZTEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGltZV9kZWx0YV9pbnRlcnBvbGF0b3IuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGltZV9kZWx0YV9pbnRlcnBvbGF0b3IuaApAQCAtNTAsOCArNTAsNyBAQAogICAvLwogICAvLyB8dXBwZXJfYm91bmR8IGlzIHR5cGljYWxseSB0aGUgbWVkaWEgdGltZXN0YW1wIG9mIHRoZSBsYXN0IGF1ZGlvIGZyYW1lCiAgIC8vIGJ1ZmZlcmVkIGJ5IHRoZSBhdWRpbyBoYXJkd2FyZS4KLSAgdm9pZCBTZXRCb3VuZHMoYmFzZTo6VGltZURlbHRhIGxvd2VyX2JvdW5kLAotICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgdXBwZXJfYm91bmQsCisgIHZvaWQgU2V0Qm91bmRzKGJhc2U6OlRpbWVEZWx0YSBsb3dlcl9ib3VuZCwgYmFzZTo6VGltZURlbHRhIHVwcGVyX2JvdW5kLAogICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lVGlja3MgY2FwdHVyZV90aW1lKTsKIAogICAvLyBTZXRzIHRoZSB1cHBlciBib3VuZCB1c2VkIGZvciBpbnRlcnBvbGF0aW9uLiBOb3RlIHRoYXQgaWYgfHVwcGVyX2JvdW5kfCBpcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3RpbWVfc291cmNlLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGltZV9zb3VyY2UuaAppbmRleCBkOGVjYzNiLi4yNDU0NDhhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGltZV9zb3VyY2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdGltZV9zb3VyY2UuaApAQCAtMTcsOSArMTcsOCBAQAogY2xhc3MgTUVESUFfRVhQT1JUIFRpbWVTb3VyY2UgewogIHB1YmxpYzoKICAgLy8gSGVscGVyIGFsaWFzIGZvciBjb252ZXJ0aW5nIG1lZGlhIHRpbWVzdGFtcHMgaW50byBhIHdhbGwgY2xvY2sgdGltZXN0YW1wcy4KLSAgdXNpbmcgV2FsbENsb2NrVGltZUNCID0KLSAgICAgIGJhc2U6OkNhbGxiYWNrPGJvb2woY29uc3Qgc3RkOjp2ZWN0b3I8YmFzZTo6VGltZURlbHRhPiYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGJhc2U6OlRpbWVUaWNrcz4qKT47CisgIHVzaW5nIFdhbGxDbG9ja1RpbWVDQiA9IGJhc2U6OkNhbGxiYWNrPGJvb2woCisgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxiYXNlOjpUaW1lRGVsdGE+Jiwgc3RkOjp2ZWN0b3I8YmFzZTo6VGltZVRpY2tzPiopPjsKIAogICBUaW1lU291cmNlKCkge30KICAgdmlydHVhbCB+VGltZVNvdXJjZSgpIHt9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmVjdG9yX21hdGguaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5oCmluZGV4IGUyODAwZDkuLjRlYTU3MmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aC5oCkBAIC0zMCw4ICszMCw5IEBACiAvLyAgIHlbbl0gPSBzbW9vdGhpbmdfZmFjdG9yICogc3JjW25dXjIgKyAoMS1zbW9vdGhpbmdfZmFjdG9yKSAqIHlbbi0xXQogLy8KIC8vIFJldHVybnMgdGhlIGZpbmFsIGF2ZXJhZ2UgcG93ZXIgYW5kIHRoZSBtYXhpbXVtIHNxdWFyZWQgZWxlbWVudCB2YWx1ZS4KLU1FRElBX0VYUE9SVCBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBFV01BQW5kTWF4UG93ZXIoCi0gICAgZmxvYXQgaW5pdGlhbF92YWx1ZSwgY29uc3QgZmxvYXQgc3JjW10sIGludCBsZW4sIGZsb2F0IHNtb290aGluZ19mYWN0b3IpOworTUVESUFfRVhQT1JUIHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IEVXTUFBbmRNYXhQb3dlcihmbG9hdCBpbml0aWFsX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCBzcmNbXSwgaW50IGxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc21vb3RoaW5nX2ZhY3Rvcik7CiAKIE1FRElBX0VYUE9SVCB2b2lkIENyb3NzZmFkZShjb25zdCBmbG9hdCBzcmNbXSwgaW50IGxlbiwgZmxvYXQgZGVzdFtdKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoX3Rlc3RpbmcuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92ZWN0b3JfbWF0aF90ZXN0aW5nLmgKaW5kZXggYWIzNzUyMy4uY2IyMmViYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZlY3Rvcl9tYXRoX3Rlc3RpbmcuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmVjdG9yX21hdGhfdGVzdGluZy5oCkBAIC0xNiw4ICsxNiwxMCBAQAogLy8gT3B0aW1pemVkIHZlcnNpb25zIGV4cG9zZWQgZm9yIHRlc3RpbmcuICBTZWUgdmVjdG9yX21hdGguaCBmb3IgZGV0YWlscy4KIE1FRElBX0VYUE9SVCB2b2lkIEZNQUNfQyhjb25zdCBmbG9hdCBzcmNbXSwgZmxvYXQgc2NhbGUsIGludCBsZW4sIGZsb2F0IGRlc3RbXSk7CiBNRURJQV9FWFBPUlQgdm9pZCBGTVVMX0MoY29uc3QgZmxvYXQgc3JjW10sIGZsb2F0IHNjYWxlLCBpbnQgbGVuLCBmbG9hdCBkZXN0W10pOwotTUVESUFfRVhQT1JUIHN0ZDo6cGFpcjxmbG9hdCwgZmxvYXQ+IEVXTUFBbmRNYXhQb3dlcl9DKAotICAgIGZsb2F0IGluaXRpYWxfdmFsdWUsIGNvbnN0IGZsb2F0IHNyY1tdLCBpbnQgbGVuLCBmbG9hdCBzbW9vdGhpbmdfZmFjdG9yKTsKK01FRElBX0VYUE9SVCBzdGQ6OnBhaXI8ZmxvYXQsIGZsb2F0PiBFV01BQW5kTWF4UG93ZXJfQyhmbG9hdCBpbml0aWFsX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGZsb2F0IHNyY1tdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgc21vb3RoaW5nX2ZhY3Rvcik7CiAKICNpZiBkZWZpbmVkKEFSQ0hfQ1BVX1g4Nl9GQU1JTFkpICYmICFkZWZpbmVkKE9TX05BQ0wpCiBNRURJQV9FWFBPUlQgdm9pZCBGTUFDX1NTRShjb25zdCBmbG9hdCBzcmNbXSwgZmxvYXQgc2NhbGUsIGludCBsZW4sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY2FwdHVyZV90eXBlcy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2NhcHR1cmVfdHlwZXMuaAppbmRleCBjMzVkOTY2Li4zMWI3OTNmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY2FwdHVyZV90eXBlcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19jYXB0dXJlX3R5cGVzLmgKQEAgLTgzLDExICs4Myw5IEBACiAvLyBzdXBwb3J0ZWQgY2FwdHVyZSBmb3JtYXQgYnkgYSBkZXZpY2UuCiBzdHJ1Y3QgTUVESUFfRVhQT1JUIFZpZGVvQ2FwdHVyZUZvcm1hdCB7CiAgIFZpZGVvQ2FwdHVyZUZvcm1hdCgpOwotICBWaWRlb0NhcHR1cmVGb3JtYXQoY29uc3QgZ2Z4OjpTaXplJiBmcmFtZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgZmxvYXQgZnJhbWVfcmF0ZSwKKyAgVmlkZW9DYXB0dXJlRm9ybWF0KGNvbnN0IGdmeDo6U2l6ZSYgZnJhbWVfc2l6ZSwgZmxvYXQgZnJhbWVfcmF0ZSwKICAgICAgICAgICAgICAgICAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgcGl4ZWxfZm9ybWF0KTsKLSAgVmlkZW9DYXB0dXJlRm9ybWF0KGNvbnN0IGdmeDo6U2l6ZSYgZnJhbWVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIGZsb2F0IGZyYW1lX3JhdGUsCisgIFZpZGVvQ2FwdHVyZUZvcm1hdChjb25zdCBnZng6OlNpemUmIGZyYW1lX3NpemUsIGZsb2F0IGZyYW1lX3JhdGUsCiAgICAgICAgICAgICAgICAgICAgICBWaWRlb1BpeGVsRm9ybWF0IHBpeGVsX2Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgIFZpZGVvUGl4ZWxTdG9yYWdlIHBpeGVsX3N0b3JhZ2UpOwogCkBAIC0xMDgsOSArMTA2LDggQEAKICAgYm9vbCBJc1ZhbGlkKCkgY29uc3Q7CiAKICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFZpZGVvQ2FwdHVyZUZvcm1hdCYgb3RoZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gZnJhbWVfc2l6ZSA9PSBvdGhlci5mcmFtZV9zaXplICYmCi0gICAgICAgIGZyYW1lX3JhdGUgPT0gb3RoZXIuZnJhbWVfcmF0ZSAmJgotICAgICAgICBwaXhlbF9mb3JtYXQgPT0gb3RoZXIucGl4ZWxfZm9ybWF0OworICAgIHJldHVybiBmcmFtZV9zaXplID09IG90aGVyLmZyYW1lX3NpemUgJiYgZnJhbWVfcmF0ZSA9PSBvdGhlci5mcmFtZV9yYXRlICYmCisgICAgICAgICAgIHBpeGVsX2Zvcm1hdCA9PSBvdGhlci5waXhlbF9mb3JtYXQ7CiAgIH0KIAogICBnZng6OlNpemUgZnJhbWVfc2l6ZTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19jYXB0dXJlcl9zb3VyY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19jYXB0dXJlcl9zb3VyY2UuaAppbmRleCBiNTQ3NTQ0Li41MmI5MjEyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY2FwdHVyZXJfc291cmNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2NhcHR1cmVyX3NvdXJjZS5oCkBAIC01Niw4ICs1Niw3IEBACiAgIC8vIHJlc29sdXRpb24vZnJhbWVyYXRlIHRvIGdlbmVyYXRlLiB8Y2FsbGJhY2t8IGlzIHRyaWdnZXJlZCB3aGVuIHRoZSBmb3JtYXRzCiAgIC8vIGhhdmUgYmVlbiBjb2xsZWN0ZWQuCiAgIHZpcnR1YWwgdm9pZCBHZXRDdXJyZW50U3VwcG9ydGVkRm9ybWF0cygKLSAgICAgIGludCBtYXhfcmVxdWVzdGVkX3dpZHRoLAotICAgICAgaW50IG1heF9yZXF1ZXN0ZWRfaGVpZ2h0LAorICAgICAgaW50IG1heF9yZXF1ZXN0ZWRfd2lkdGgsIGludCBtYXhfcmVxdWVzdGVkX2hlaWdodCwKICAgICAgIGRvdWJsZSBtYXhfcmVxdWVzdGVkX2ZyYW1lX3JhdGUsCiAgICAgICBjb25zdCBWaWRlb0NhcHR1cmVEZXZpY2VGb3JtYXRzQ0ImIGNhbGxiYWNrKSA9IDA7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlci5oCmluZGV4IDI3MjcxYjMuLjkzODk5NWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXIuaApAQCAtNjksMTAgKzY5LDggQEAKICAgLy8gaXMgcmVhZHkgKGkuZS4gdy9vIHRocmVhZCB0cmFtcG9saW5pbmcpIHNpbmNlIGl0IGNhbiBzdHJvbmdseSBhZmZlY3QgZnJhbWUKICAgLy8gZGVsaXZlcnkgdGltZXMgd2l0aCBoaWdoLWZyYW1lLXJhdGUgbWF0ZXJpYWwuICBTZWUgRGVjb2RlKCkgZm9yIGFkZGl0aW9uYWwKICAgLy8gbm90ZXMuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKGNvbnN0IFZpZGVvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGxvd19kZWxheSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2RtQ29udGV4dCogY2RtX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEluaXRDQiYgaW5pdF9jYiwKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemUoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsIGJvb2wgbG93X2RlbGF5LAorICAgICAgICAgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwgY29uc3QgSW5pdENCJiBpbml0X2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRDQiYgb3V0cHV0X2NiKSA9IDA7CiAKICAgLy8gUmVxdWVzdHMgYSB8YnVmZmVyfCB0byBiZSBkZWNvZGVkLiBUaGUgc3RhdHVzIG9mIHRoZSBkZWNvZGVyIGFuZCBkZWNvZGVkCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuY2MKaW5kZXggZDMxNmRiOC4uZmZjZmVmMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5jYwpAQCAtNjAsMjMgKzYwLDYgQEAKIAogVmlkZW9EZWNvZGVyQ29uZmlnOjp+VmlkZW9EZWNvZGVyQ29uZmlnKCkge30KIAotdm9pZCBWaWRlb0RlY29kZXJDb25maWc6OnNldF9jb2xvcl9zcGFjZV9pbmZvKAotICAgIGNvbnN0IGdmeDo6Q29sb3JTcGFjZSYgY29sb3Jfc3BhY2VfaW5mbykgewotICBjb2xvcl9zcGFjZV9pbmZvXyA9IGNvbG9yX3NwYWNlX2luZm87Ci19Ci0KLWdmeDo6Q29sb3JTcGFjZSBWaWRlb0RlY29kZXJDb25maWc6OmNvbG9yX3NwYWNlX2luZm8oKSBjb25zdCB7Ci0gIHJldHVybiBjb2xvcl9zcGFjZV9pbmZvXzsKLX0KLQotdm9pZCBWaWRlb0RlY29kZXJDb25maWc6OnNldF9oZHJfbWV0YWRhdGEoY29uc3QgSERSTWV0YWRhdGEmIGhkcl9tZXRhZGF0YSkgewotICBoZHJfbWV0YWRhdGFfID0gaGRyX21ldGFkYXRhOwotfQotCi1iYXNlOjpvcHRpb25hbDxIRFJNZXRhZGF0YT4gVmlkZW9EZWNvZGVyQ29uZmlnOjpoZHJfbWV0YWRhdGEoKSBjb25zdCB7Ci0gIHJldHVybiBoZHJfbWV0YWRhdGFfOwotfQotCiB2b2lkIFZpZGVvRGVjb2RlckNvbmZpZzo6SW5pdGlhbGl6ZShWaWRlb0NvZGVjIGNvZGVjLCBWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2xvclNwYWNlIGNvbG9yX3NwYWNlLApAQCAtOTcsMTMgKzgwLDEzIEBACiAKICAgc3dpdGNoIChjb2xvcl9zcGFjZSkgewogICAgIGNhc2UgQ09MT1JfU1BBQ0VfSlBFRzoKLSAgICAgIGNvbG9yX3NwYWNlX2luZm9fID0gZ2Z4OjpDb2xvclNwYWNlOjpDcmVhdGVKcGVnKCk7CisgICAgICB3ZWJtX2NvbG9yX21ldGFkYXRhXy5jb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlSnBlZygpOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBDT0xPUl9TUEFDRV9IRF9SRUM3MDk6Ci0gICAgICBjb2xvcl9zcGFjZV9pbmZvXyA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlUkVDNzA5KCk7CisgICAgICB3ZWJtX2NvbG9yX21ldGFkYXRhXy5jb2xvcl9zcGFjZSA9IGdmeDo6Q29sb3JTcGFjZTo6Q3JlYXRlUkVDNzA5KCk7CiAgICAgICBicmVhazsKICAgICBjYXNlIENPTE9SX1NQQUNFX1NEX1JFQzYwMToKLSAgICAgIGNvbG9yX3NwYWNlX2luZm9fID0gZ2Z4OjpDb2xvclNwYWNlOjpDcmVhdGVSRUM2MDEoKTsKKyAgICAgIHdlYm1fY29sb3JfbWV0YWRhdGFfLmNvbG9yX3NwYWNlID0gZ2Z4OjpDb2xvclNwYWNlOjpDcmVhdGVSRUM2MDEoKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgQ09MT1JfU1BBQ0VfVU5TUEVDSUZJRUQ6CiAgICAgZGVmYXVsdDoKQEAgLTEyMyw3ICsxMDYsOCBAQAogICAgICAgICAgICh2aXNpYmxlX3JlY3QoKSA9PSBjb25maWcudmlzaWJsZV9yZWN0KCkpICYmCiAgICAgICAgICAgKG5hdHVyYWxfc2l6ZSgpID09IGNvbmZpZy5uYXR1cmFsX3NpemUoKSkgJiYKICAgICAgICAgICAoZXh0cmFfZGF0YSgpID09IGNvbmZpZy5leHRyYV9kYXRhKCkpICYmCi0gICAgICAgICAgKGVuY3J5cHRpb25fc2NoZW1lKCkuTWF0Y2hlcyhjb25maWcuZW5jcnlwdGlvbl9zY2hlbWUoKSkpKTsKKyAgICAgICAgICAoZW5jcnlwdGlvbl9zY2hlbWUoKS5NYXRjaGVzKGNvbmZpZy5lbmNyeXB0aW9uX3NjaGVtZSgpKSkgJiYKKyAgICAgICAgICB3ZWJtX2NvbG9yX21ldGFkYXRhXyA9PSBjb25maWcud2VibV9jb2xvcl9tZXRhZGF0YSgpKTsKIH0KIAogc3RkOjpzdHJpbmcgVmlkZW9EZWNvZGVyQ29uZmlnOjpBc0h1bWFuUmVhZGFibGVTdHJpbmcoKSBjb25zdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oCmluZGV4IGU4MTYwNjYuLjA2ZTRkZmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oCkBAIC0xOCw2ICsxOCw3IEBACiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfZXhwb3J0LmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fY29kZWNzLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fdHlwZXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fY29sb3VyX3BhcnNlci5oIgogI2luY2x1ZGUgInVpL2dmeC9yZWN0LmgiCiAjaW5jbHVkZSAidWkvZ2Z4L3NpemUuaCIKIApAQCAtMzQsMTIgKzM1LDkgQEAKIAogICAvLyBDb25zdHJ1Y3RzIGFuIGluaXRpYWxpemVkIG9iamVjdC4gSXQgaXMgYWNjZXB0YWJsZSB0byBwYXNzIGluIE5VTEwgZm9yCiAgIC8vIHxleHRyYV9kYXRhfCwgb3RoZXJ3aXNlIHRoZSBtZW1vcnkgaXMgY29waWVkLgotICBWaWRlb0RlY29kZXJDb25maWcoVmlkZW9Db2RlYyBjb2RlYywKLSAgICAgICAgICAgICAgICAgICAgIFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgIENvbG9yU3BhY2UgY29sb3Jfc3BhY2UsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKKyAgVmlkZW9EZWNvZGVyQ29uZmlnKFZpZGVvQ29kZWMgY29kZWMsIFZpZGVvQ29kZWNQcm9maWxlIHByb2ZpbGUsCisgICAgICAgICAgICAgICAgICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwgQ29sb3JTcGFjZSBjb2xvcl9zcGFjZSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBleHRyYV9kYXRhLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW5jcnlwdGlvblNjaGVtZSYgZW5jcnlwdGlvbl9zY2hlbWUpOwpAQCAtNDcsMTIgKzQ1LDkgQEAKICAgflZpZGVvRGVjb2RlckNvbmZpZygpOwogCiAgIC8vIFJlc2V0cyB0aGUgaW50ZXJuYWwgc3RhdGUgb2YgdGhpcyBvYmplY3QuCi0gIHZvaWQgSW5pdGlhbGl6ZShWaWRlb0NvZGVjIGNvZGVjLAotICAgICAgICAgICAgICAgICAgVmlkZW9Db2RlY1Byb2ZpbGUgcHJvZmlsZSwKLSAgICAgICAgICAgICAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgICAgICAgQ29sb3JTcGFjZSBjb2xvcl9zcGFjZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAorICB2b2lkIEluaXRpYWxpemUoVmlkZW9Db2RlYyBjb2RlYywgVmlkZW9Db2RlY1Byb2ZpbGUgcHJvZmlsZSwKKyAgICAgICAgICAgICAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LCBDb2xvclNwYWNlIGNvbG9yX3NwYWNlLAorICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLCBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAogICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGV4dHJhX2RhdGEsCiAgICAgICAgICAgICAgICAgICBjb25zdCBFbmNyeXB0aW9uU2NoZW1lJiBlbmNyeXB0aW9uX3NjaGVtZSk7CkBAIC0xMDksMTEgKzEwNCwxMyBAQAogICAgIHJldHVybiBlbmNyeXB0aW9uX3NjaGVtZV87CiAgIH0KIAotICB2b2lkIHNldF9jb2xvcl9zcGFjZV9pbmZvKGNvbnN0IGdmeDo6Q29sb3JTcGFjZSYgY29sb3Jfc3BhY2VfaW5mbyk7Ci0gIGdmeDo6Q29sb3JTcGFjZSBjb2xvcl9zcGFjZV9pbmZvKCkgY29uc3Q7CisgIHZvaWQgc2V0X3dlYm1fY29sb3JfbWV0YWRhdGEoY29uc3QgV2ViTUNvbG9yTWV0YWRhdGEmIHdlYm1fY29sb3JfbWV0YWRhdGEpIHsKKyAgICB3ZWJtX2NvbG9yX21ldGFkYXRhXyA9IHdlYm1fY29sb3JfbWV0YWRhdGE7CisgIH0KIAotICB2b2lkIHNldF9oZHJfbWV0YWRhdGEoY29uc3QgSERSTWV0YWRhdGEmIGhkcl9tZXRhZGF0YSk7Ci0gIGJhc2U6Om9wdGlvbmFsPEhEUk1ldGFkYXRhPiBoZHJfbWV0YWRhdGEoKSBjb25zdDsKKyAgY29uc3QgV2ViTUNvbG9yTWV0YWRhdGEmIHdlYm1fY29sb3JfbWV0YWRhdGEoKSBjb25zdCB7CisgICAgcmV0dXJuIHdlYm1fY29sb3JfbWV0YWRhdGFfOworICB9CiAKICBwcml2YXRlOgogICBWaWRlb0NvZGVjIGNvZGVjXzsKQEAgLTEzMiw4ICsxMjksNyBAQAogCiAgIEVuY3J5cHRpb25TY2hlbWUgZW5jcnlwdGlvbl9zY2hlbWVfOwogCi0gIGdmeDo6Q29sb3JTcGFjZSBjb2xvcl9zcGFjZV9pbmZvXzsKLSAgYmFzZTo6b3B0aW9uYWw8SERSTWV0YWRhdGE+IGhkcl9tZXRhZGF0YV87CisgIFdlYk1Db2xvck1ldGFkYXRhIHdlYm1fY29sb3JfbWV0YWRhdGFfOwogCiAgIC8vIE5vdCB1c2luZyBESVNBTExPV19DT1BZX0FORF9BU1NJR04gaGVyZSBpbnRlbnRpb25hbGx5IHRvIGFsbG93IHRoZSBjb21waWxlcgogICAvLyBnZW5lcmF0ZWQgY29weSBjb25zdHJ1Y3RvciBhbmQgYXNzaWdubWVudCBvcGVyYXRvci4gU2luY2UgdGhlIGV4dHJhIGRhdGEgaXMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgKaW5kZXggNWQ0YzA3OC4uMTFkMTRkYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgKQEAgLTg4LDEzICs4OCwxMyBAQAogICAgcHJvdGVjdGVkOgogICAgIHZpcnR1YWwgflN5bmNUb2tlbkNsaWVudCgpIHt9CiAKKyAgIHByaXZhdGU6CiAgICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN5bmNUb2tlbkNsaWVudCk7CiAgIH07CiAKICAgLy8gQ2FsbCBwcmlvciB0byBDcmVhdGVGcmFtZSB0byBlbnN1cmUgdmFsaWRpdHkgb2YgZnJhbWUgY29uZmlndXJhdGlvbi4gQ2FsbGVkCiAgIC8vIGF1dG9tYXRpY2FsbHkgYnkgVmlkZW9EZWNvZGVyQ29uZmlnOjpJc1ZhbGlkQ29uZmlnKCkuCi0gIHN0YXRpYyBib29sIElzVmFsaWRDb25maWcoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RvcmFnZVR5cGUgc3RvcmFnZV90eXBlLAorICBzdGF0aWMgYm9vbCBJc1ZhbGlkQ29uZmlnKFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LCBTdG9yYWdlVHlwZSBzdG9yYWdlX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplKTsKQEAgLTExMywxMCArMTEzLDggQEAKICAgLy8gT2ZmZXJzIHRoZSBzYW1lIGZ1bmN0aW9uYWxpdHkgYXMgQ3JlYXRlRnJhbWUsIGFuZCBhZGRpdGlvbmFsbHkgemVyb2VzIG91dAogICAvLyB0aGUgaW5pdGlhbCBhbGxvY2F0ZWQgYnVmZmVycy4KICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gQ3JlYXRlWmVyb0luaXRpYWxpemVkRnJhbWUoCi0gICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCisgICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAorICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAogICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAKICAgLy8gV3JhcHMgYSBzZXQgb2YgbmF0aXZlIHRleHR1cmVzIHdpdGggYSBWaWRlb0ZyYW1lLgpAQCAtMTI0LDg2ICsxMjIsNTMgQEAKICAgLy8gYXJndW1lbnQgd2hlbiB0aGUgVmlkZW9GcmFtZSBpcyB0byBiZSBkZXN0cm95ZWQuCiAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFdyYXBOYXRpdmVUZXh0dXJlcygKICAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgY29uc3QgZ3B1OjpNYWlsYm94SG9sZGVyICgmbWFpbGJveF9ob2xkZXIpW2tNYXhQbGFuZXNdLAorICAgICAgY29uc3QgZ3B1OjpNYWlsYm94SG9sZGVyKCZtYWlsYm94X2hvbGRlcilba01heFBsYW5lc10sCiAgICAgICBjb25zdCBSZWxlYXNlTWFpbGJveENCJiBtYWlsYm94X2hvbGRlcnNfcmVsZWFzZV9jYiwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKKyAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCisgICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAKICAgLy8gV3JhcHMgcGFja2VkIGltYWdlIGRhdGEgcmVzaWRpbmcgaW4gYSBtZW1vcnkgYnVmZmVyIHdpdGggYSBWaWRlb0ZyYW1lLgogICAvLyBUaGUgaW1hZ2UgZGF0YSByZXNpZGVzIGluIHxkYXRhfCBhbmQgaXMgYXNzdW1lZCB0byBiZSBwYWNrZWQgdGlnaHRseSBpbiBhCiAgIC8vIGJ1ZmZlciBvZiBsb2dpY2FsIGRpbWVuc2lvbnMgfGNvZGVkX3NpemV8IHdpdGggdGhlIGFwcHJvcHJpYXRlIGJpdCBkZXB0aAogICAvLyBhbmQgcGxhbmUgY291bnQgYXMgZ2l2ZW4gYnkgfGZvcm1hdHwuIFJldHVybnMgTlVMTCBvbiBmYWlsdXJlLgogICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBXcmFwRXh0ZXJuYWxEYXRhKAotICAgICAgVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAotICAgICAgdWludDhfdCogZGF0YSwKLSAgICAgIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKKyAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LCBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCisgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCisgICAgICB1aW50OF90KiBkYXRhLCBzaXplX3QgZGF0YV9zaXplLCBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKIAogICAvLyBTYW1lIGFzIFdyYXBFeHRlcm5hbERhdGEoKSB3aXRoIFNoYXJlZE1lbW9yeUhhbmRsZSBhbmQgaXRzIG9mZnNldC4KICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gV3JhcEV4dGVybmFsU2hhcmVkTWVtb3J5KAotICAgICAgVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAotICAgICAgdWludDhfdCogZGF0YSwKLSAgICAgIHNpemVfdCBkYXRhX3NpemUsCi0gICAgICBiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgaGFuZGxlLAotICAgICAgc2l6ZV90IHNoYXJlZF9tZW1vcnlfb2Zmc2V0LAotICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CisgICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAorICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAorICAgICAgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwgYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlIGhhbmRsZSwKKyAgICAgIHNpemVfdCBzaGFyZWRfbWVtb3J5X29mZnNldCwgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAKICAgLy8gV3JhcHMgZXh0ZXJuYWwgWVVWIGRhdGEgb2YgdGhlIGdpdmVuIHBhcmFtZXRlcnMgd2l0aCBhIFZpZGVvRnJhbWUuCiAgIC8vIFRoZSByZXR1cm5lZCBWaWRlb0ZyYW1lIGRvZXMgbm90IG93biB0aGUgZGF0YSBwYXNzZWQgaW4uCiAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFdyYXBFeHRlcm5hbFl1dkRhdGEoCi0gICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICBpbnQzMl90IHlfc3RyaWRlLAotICAgICAgaW50MzJfdCB1X3N0cmlkZSwKLSAgICAgIGludDMyX3Qgdl9zdHJpZGUsCi0gICAgICB1aW50OF90KiB5X2RhdGEsCi0gICAgICB1aW50OF90KiB1X2RhdGEsCi0gICAgICB1aW50OF90KiB2X2RhdGEsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKKyAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LCBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCisgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCisgICAgICBpbnQzMl90IHlfc3RyaWRlLCBpbnQzMl90IHVfc3RyaWRlLCBpbnQzMl90IHZfc3RyaWRlLCB1aW50OF90KiB5X2RhdGEsCisgICAgICB1aW50OF90KiB1X2RhdGEsIHVpbnQ4X3QqIHZfZGF0YSwgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAKICAgLy8gV3JhcHMgZXh0ZXJuYWwgWVVWIGRhdGEgd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyB3aXRoIGEgVmlkZW9GcmFtZS4KICAgLy8gVGhlIHJldHVybmVkIFZpZGVvRnJhbWUgZG9lcyBub3Qgb3duIHRoZSBHcHVNZW1vcnlCdWZmZXJzIHBhc3NlZCBpbi4KICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gV3JhcEV4dGVybmFsWXV2R3B1TWVtb3J5QnVmZmVycygKLSAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAotICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCi0gICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwKLSAgICAgIGludDMyX3QgeV9zdHJpZGUsCi0gICAgICBpbnQzMl90IHVfc3RyaWRlLAotICAgICAgaW50MzJfdCB2X3N0cmlkZSwKLSAgICAgIHVpbnQ4X3QqIHlfZGF0YSwKLSAgICAgIHVpbnQ4X3QqIHVfZGF0YSwKLSAgICAgIHVpbnQ4X3QqIHZfZGF0YSwKKyAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LCBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCisgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCisgICAgICBpbnQzMl90IHlfc3RyaWRlLCBpbnQzMl90IHVfc3RyaWRlLCBpbnQzMl90IHZfc3RyaWRlLCB1aW50OF90KiB5X2RhdGEsCisgICAgICB1aW50OF90KiB1X2RhdGEsIHVpbnQ4X3QqIHZfZGF0YSwKICAgICAgIGNvbnN0IGdmeDo6R3B1TWVtb3J5QnVmZmVySGFuZGxlJiB5X2hhbmRsZSwKICAgICAgIGNvbnN0IGdmeDo6R3B1TWVtb3J5QnVmZmVySGFuZGxlJiB1X2hhbmRsZSwKLSAgICAgIGNvbnN0IGdmeDo6R3B1TWVtb3J5QnVmZmVySGFuZGxlJiB2X2hhbmRsZSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOworICAgICAgY29uc3QgZ2Z4OjpHcHVNZW1vcnlCdWZmZXJIYW5kbGUmIHZfaGFuZGxlLCBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKIAogICAvLyBXcmFwcyBleHRlcm5hbCBZVVZBIGRhdGEgb2YgdGhlIGdpdmVuIHBhcmFtZXRlcnMgd2l0aCBhIFZpZGVvRnJhbWUuCiAgIC8vIFRoZSByZXR1cm5lZCBWaWRlb0ZyYW1lIGRvZXMgbm90IG93biB0aGUgZGF0YSBwYXNzZWQgaW4uCiAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFdyYXBFeHRlcm5hbFl1dmFEYXRhKAotICAgICAgVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAotICAgICAgaW50MzJfdCB5X3N0cmlkZSwKLSAgICAgIGludDMyX3QgdV9zdHJpZGUsCi0gICAgICBpbnQzMl90IHZfc3RyaWRlLAotICAgICAgaW50MzJfdCBhX3N0cmlkZSwKLSAgICAgIHVpbnQ4X3QqIHlfZGF0YSwKLSAgICAgIHVpbnQ4X3QqIHVfZGF0YSwKLSAgICAgIHVpbnQ4X3QqIHZfZGF0YSwKLSAgICAgIHVpbnQ4X3QqIGFfZGF0YSwKKyAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LCBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCisgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCisgICAgICBpbnQzMl90IHlfc3RyaWRlLCBpbnQzMl90IHVfc3RyaWRlLCBpbnQzMl90IHZfc3RyaWRlLCBpbnQzMl90IGFfc3RyaWRlLAorICAgICAgdWludDhfdCogeV9kYXRhLCB1aW50OF90KiB1X2RhdGEsIHVpbnQ4X3QqIHZfZGF0YSwgdWludDhfdCogYV9kYXRhLAogICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAKICNpZiBkZWZpbmVkKE9TX0xJTlVYKQpAQCAtMjE4LDEyICsxODMsOSBAQAogICAvLyBtYXBwZWQgdmlhIG1tYXAoKSBmb3IgQ1BVIGFjY2Vzcy4KICAgLy8gUmV0dXJucyBOVUxMIG9uIGZhaWx1cmUuCiAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFdyYXBFeHRlcm5hbERtYWJ1ZnMoCi0gICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICBjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBkbWFidWZfZmRzLAotICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CisgICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAorICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8aW50PiYgZG1hYnVmX2ZkcywgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAjZW5kaWYKIAogI2lmIGRlZmluZWQoT1NfTUFDT1NYKQpAQCAtMjM2LDI1ICsxOTgsMjEgQEAKICAgLy8gcGl4ZWwgZm9ybWF0IHRoYXQgaGFzIG5vIFZpZGVvRnJhbWUgbWF0Y2gpLCBOVUxMIGlzIHJldHVybmVkLgogICAvLyBodHRwOi8vY3JidWcuY29tLzQwMTMwOAogICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBXcmFwQ1ZQaXhlbEJ1ZmZlcigKLSAgICAgIENWUGl4ZWxCdWZmZXJSZWYgY3ZfcGl4ZWxfYnVmZmVyLAotICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CisgICAgICBDVlBpeGVsQnVmZmVyUmVmIGN2X3BpeGVsX2J1ZmZlciwgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CiAjZW5kaWYKIAogICAvLyBXcmFwcyB8ZnJhbWV8LiB8dmlzaWJsZV9yZWN0fCBtdXN0IGJlIGEgc3ViIHJlY3Qgd2l0aGluCiAgIC8vIGZyYW1lLT52aXNpYmxlX3JlY3QoKS4KICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gV3JhcFZpZGVvRnJhbWUoCi0gICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBmcmFtZSwKLSAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCi0gICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSk7CisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBmcmFtZSwgVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsCisgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUpOwogCiAgIC8vIENyZWF0ZXMgYSBmcmFtZSB3aGljaCBpbmRpY2F0ZXMgZW5kLW9mLXN0cmVhbS4KICAgc3RhdGljIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gQ3JlYXRlRU9TRnJhbWUoKTsKIAogICAvLyBBbGxvY2F0ZXMgWVYxMiBmcmFtZSBiYXNlZCBvbiB8c2l6ZXwsIGFuZCBzZXRzIGl0cyBkYXRhIHRvIHRoZSBZVVYoeSx1LHYpLgogICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBDcmVhdGVDb2xvckZyYW1lKGNvbnN0IGdmeDo6U2l6ZSYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgeSwgdWludDhfdCB1LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKIApAQCAtMjc2LDggKzIzNCw3IEBACiAKICAgLy8gUmV0dXJucyB0aGUgcGxhbmUgZ2Z4OjpTaXplIChpbiBieXRlcykgZm9yIGEgcGxhbmUgb2YgdGhlIGdpdmVuIGNvZGVkIHNpemUKICAgLy8gYW5kIGZvcm1hdC4KLSAgc3RhdGljIGdmeDo6U2l6ZSBQbGFuZVNpemUoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwbGFuZSwKKyAgc3RhdGljIGdmeDo6U2l6ZSBQbGFuZVNpemUoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsIHNpemVfdCBwbGFuZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplKTsKIAogICAvLyBSZXR1cm5zIGhvcml6b250YWwgYml0cyBwZXIgcGl4ZWwgZm9yIGdpdmVuIHxwbGFuZXwgYW5kIHxmb3JtYXR8LgpAQCAtNDAwLDkgKzM1Nyw3IEBACiAgIC8vIFRoaXMgaXMgdGhlIG1lZGlhIHRpbWVzdGFtcCwgYW5kIG5vdCB0aGUgcmVmZXJlbmNlIHRpbWUuCiAgIC8vIFNlZSBWaWRlb0ZyYW1lTWV0YWRhdGE6OlJFRkVSRU5DRV9USU1FIGZvciBkZXRhaWxzLgogICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKCkgY29uc3QgeyByZXR1cm4gdGltZXN0YW1wXzsgfQotICB2b2lkIHNldF90aW1lc3RhbXAoYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgewotICAgIHRpbWVzdGFtcF8gPSB0aW1lc3RhbXA7Ci0gIH0KKyAgdm9pZCBzZXRfdGltZXN0YW1wKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIHsgdGltZXN0YW1wXyA9IHRpbWVzdGFtcDsgfQogCiAgIC8vIEl0IHVzZXMgfGNsaWVudHwgdG8gaW5zZXJ0IGEgbmV3IHN5bmMgcG9pbnQgYW5kIHBvdGVudGlhbGx5IHdhaXRzIG9uIGEKICAgLy8gb2xkZXIgc3luYyBwb2ludC4gVGhlIGZpbmFsIHN5bmMgcG9pbnQgd2lsbCBiZSB1c2VkIHRvIHJlbGVhc2UgdGhpcwpAQCAtNDIzLDEyICszNzgsOSBAQAogICAvLyBDbGllbnRzIG11c3QgdXNlIHRoZSBzdGF0aWMgZmFjdG9yeS93cmFwcGluZyBtZXRob2RzIHRvIGNyZWF0ZSBhIG5ldyBmcmFtZS4KICAgLy8gRGVyaXZlZCBjbGFzc2VzIHNob3VsZCBjcmVhdGUgdGhlaXIgb3duIGZhY3Rvcnkvd3JhcHBpbmcgbWV0aG9kcywgYW5kIHVzZQogICAvLyB0aGlzIGNvbnN0cnVjdG9yIHRvIGRvIGJhc2ljIGluaXRpYWxpemF0aW9uLgotICBWaWRlb0ZyYW1lKFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSwKLSAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCi0gICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCk7CisgIFZpZGVvRnJhbWUoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSwKKyAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAorICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLCBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKTsKIAogICB2aXJ0dWFsIH5WaWRlb0ZyYW1lKCk7CiAKQEAgLTQ1MSw0MiArNDAzLDI4IEBACiAKICBwcml2YXRlOgogICAvLyBDbGllbnRzIG11c3QgdXNlIHRoZSBzdGF0aWMgZmFjdG9yeS93cmFwcGluZyBtZXRob2RzIHRvIGNyZWF0ZSBhIG5ldyBmcmFtZS4KLSAgVmlkZW9GcmFtZShWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgICAgICAgICBTdG9yYWdlVHlwZSBzdG9yYWdlX3R5cGUsCi0gICAgICAgICAgICAgY29uc3QgZ2Z4OjpTaXplJiBjb2RlZF9zaXplLAotICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAotICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgYmFzZTo6U2hhcmVkTWVtb3J5SGFuZGxlIGhhbmRsZSwKLSAgICAgICAgICAgICBzaXplX3Qgc2hhcmVkX21lbW9yeV9vZmZzZXQpOwotICBWaWRlb0ZyYW1lKFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LAotICAgICAgICAgICAgIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSwKLSAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCi0gICAgICAgICAgICAgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCisgIFZpZGVvRnJhbWUoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSwKKyAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAorICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLCBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLAorICAgICAgICAgICAgIGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBoYW5kbGUsIHNpemVfdCBzaGFyZWRfbWVtb3J5X29mZnNldCk7CisgIFZpZGVvRnJhbWUoVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSwKKyAgICAgICAgICAgICBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAogICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAogICAgICAgICAgICAgIGNvbnN0IGdwdTo6TWFpbGJveEhvbGRlcigmbWFpbGJveF9ob2xkZXJzKVtrTWF4UGxhbmVzXSwKICAgICAgICAgICAgICBjb25zdCBSZWxlYXNlTWFpbGJveENCJiBtYWlsYm94X2hvbGRlcl9yZWxlYXNlX2NiLAogICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwogCiAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFdyYXBFeHRlcm5hbFN0b3JhZ2UoCi0gICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICB1aW50OF90KiBkYXRhLAotICAgICAgc2l6ZV90IGRhdGFfc2l6ZSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsCi0gICAgICBiYXNlOjpTaGFyZWRNZW1vcnlIYW5kbGUgaGFuZGxlLAorICAgICAgVmlkZW9QaXhlbEZvcm1hdCBmb3JtYXQsIFN0b3JhZ2VUeXBlIHN0b3JhZ2VfdHlwZSwKKyAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwgY29uc3QgZ2Z4OjpSZWN0JiB2aXNpYmxlX3JlY3QsCisgICAgICBjb25zdCBnZng6OlNpemUmIG5hdHVyYWxfc2l6ZSwgdWludDhfdCogZGF0YSwgc2l6ZV90IGRhdGFfc2l6ZSwKKyAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXAsIGJhc2U6OlNoYXJlZE1lbW9yeUhhbmRsZSBoYW5kbGUsCiAgICAgICBzaXplX3QgZGF0YV9vZmZzZXQpOwogCiAgIHN0YXRpYyBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IENyZWF0ZUZyYW1lSW50ZXJuYWwoCi0gICAgICBWaWRlb1BpeGVsRm9ybWF0IGZvcm1hdCwKLSAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgY29kZWRfc2l6ZSwKLSAgICAgIGNvbnN0IGdmeDo6UmVjdCYgdmlzaWJsZV9yZWN0LAotICAgICAgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLAotICAgICAgYm9vbCB6ZXJvX2luaXRpYWxpemVfbWVtb3J5KTsKKyAgICAgIFZpZGVvUGl4ZWxGb3JtYXQgZm9ybWF0LCBjb25zdCBnZng6OlNpemUmIGNvZGVkX3NpemUsCisgICAgICBjb25zdCBnZng6OlJlY3QmIHZpc2libGVfcmVjdCwgY29uc3QgZ2Z4OjpTaXplJiBuYXR1cmFsX3NpemUsCisgICAgICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wLCBib29sIHplcm9faW5pdGlhbGl6ZV9tZW1vcnkpOwogCiAgIC8vIFJldHVybnMgdGhlIHBpeGVsIHNpemUgb2YgZWFjaCBzdWJzYW1wbGUgZm9yIGEgZ2l2ZW4gfHBsYW5lfCBhbmQgfGZvcm1hdHwuCiAgIC8vIEUuZy4gMngyIGZvciB0aGUgVS1wbGFuZSBpbiBQSVhFTF9GT1JNQVRfSTQyMC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19mcmFtZV9wb29sLmggYi9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fZnJhbWVfcG9vbC5oCmluZGV4IDcxMDQ2NDEuLjAxNDJjMzAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19mcmFtZV9wb29sLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lX3Bvb2wuaApAQCAtMzcsNyArMzcsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgbmF0dXJhbF9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApOwogCi1wcm90ZWN0ZWQ6CisgcHJvdGVjdGVkOgogICBmcmllbmQgY2xhc3MgVmlkZW9GcmFtZVBvb2xUZXN0OwogCiAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmcmFtZXMgaW4gdGhlIHBvb2wgZm9yIHRlc3RpbmcgcHVycG9zZXMuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fcmVuZGVyZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19yZW5kZXJlci5oCmluZGV4IDgwNDE3OGEuLjVhYzUyZjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19yZW5kZXJlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb19yZW5kZXJlci5oCkBAIC0zMyw4ICszMyw3IEBACiAgIC8vCiAgIC8vIHx3YWxsX2Nsb2NrX3RpbWVfY2J8IGlzIHVzZWQgdG8gY29udmVydCBtZWRpYSB0aW1lc3RhbXBzIGludG8gd2FsbGNsb2NrCiAgIC8vIHRpbWVzdGFtcHMuCi0gIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKERlbXV4ZXJTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2RtQ29udGV4dCogY2RtX2NvbnRleHQsCisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplKERlbXV4ZXJTdHJlYW0qIHN0cmVhbSwgQ2RtQ29udGV4dCogY2RtX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlcmVyQ2xpZW50KiBjbGllbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFRpbWVTb3VyY2U6OldhbGxDbG9ja1RpbWVDQiYgd2FsbF9jbG9ja190aW1lX2NiLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiKSA9IDA7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fdXRpbC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX3V0aWwuaAppbmRleCAyNTczZWQ3Li5kNzI4MTg2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fdXRpbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS92aWRlb191dGlsLmgKQEAgLTI1LDE4ICsyNSwxNCBAQAogTUVESUFfRVhQT1JUIHZvaWQgRmlsbFlVVihWaWRlb0ZyYW1lKiBmcmFtZSwgdWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3Qgdik7CiAKIC8vIEZpbGxzIHxmcmFtZXwgY29udGFpbmluZyBZVVZBIGRhdGEgd2l0aCB0aGUgZ2l2ZW4gY29sb3IgdmFsdWVzLgotTUVESUFfRVhQT1JUIHZvaWQgRmlsbFlVVkEoVmlkZW9GcmFtZSogZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHYsCitNRURJQV9FWFBPUlQgdm9pZCBGaWxsWVVWQShWaWRlb0ZyYW1lKiBmcmFtZSwgdWludDhfdCB5LCB1aW50OF90IHUsIHVpbnQ4X3QgdiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgYSk7CiAKIC8vIENyZWF0ZXMgYSBib3JkZXIgaW4gfGZyYW1lfCBzdWNoIHRoYXQgYWxsIHBpeGVscyBvdXRzaWRlIG9mCiAvLyB8dmlld19hcmVhfCBhcmUgYmxhY2suIFRoZSBzaXplIGFuZCBwb3NpdGlvbiBvZiB8dmlld19hcmVhfAogLy8gbXVzdCBiZSBldmVuIHRvIGFsaWduIGNvcnJlY3RseSB3aXRoIHRoZSBjb2xvciBwbGFuZXMuCiAvLyBPbmx5IFlWMTIgZm9ybWF0IHZpZGVvIGZyYW1lcyBhcmUgY3VycmVudGx5IHN1cHBvcnRlZC4KLU1FRElBX0VYUE9SVCB2b2lkIExldHRlcmJveFlVVihWaWRlb0ZyYW1lKiBmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBnZng6OlJlY3QmIHZpZXdfYXJlYSk7CitNRURJQV9FWFBPUlQgdm9pZCBMZXR0ZXJib3hZVVYoVmlkZW9GcmFtZSogZnJhbWUsIGNvbnN0IGdmeDo6UmVjdCYgdmlld19hcmVhKTsKIAogLy8gUm90YXRlcyB8c3JjfCBwbGFuZSBieSB8cm90YXRpb258IGRlZ3JlZSB3aXRoIHBvc3NpYmxlIGZsaXBwaW5nIHZlcnRpY2FsbHkKIC8vIGFuZCBob3Jpem9udGFsbHkuCkBAIC00OSwxMyArNDUsMTAgQEAKIC8vIGZyb20gY29sdW1uIDgwIHRocm91Z2ggNTU5LiBUaGUgbGVmdG1vc3QgYW5kIHJpZ2h0bW9zdCA4MCBjb2x1bW5zIGFyZQogLy8gaWdub3JlZCBmb3IgYm90aCB8c3JjfCBhbmQgfGRlc3R8LgogLy8gVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgYmxhbmtpbmcgb3V0IHRoZSBtYXJnaW4gYXJlYS4KLU1FRElBX0VYUE9SVCB2b2lkIFJvdGF0ZVBsYW5lQnlQaXhlbHMoY29uc3QgdWludDhfdCogc3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCitNRURJQV9FWFBPUlQgdm9pZCBSb3RhdGVQbGFuZUJ5UGl4ZWxzKGNvbnN0IHVpbnQ4X3QqIHNyYywgdWludDhfdCogZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcm90YXRpb24sICAvLyBDbG9ja3dpc2UuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZmxpcF92ZXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZsaXBfaG9yaXopOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGZsaXBfdmVydCwgYm9vbCBmbGlwX2hvcml6KTsKIAogLy8gUmV0dXJuIHRoZSBsYXJnZXN0IGNlbnRlcmVkIHJlY3RhbmdsZSB3aXRoIHRoZSBzYW1lIGFzcGVjdCByYXRpbyBvZiB8Y29udGVudHwKIC8vIHRoYXQgZml0cyBlbnRpcmVseSBpbnNpZGUgb2YgfGJvdW5kc3wuICBJZiB8Y29udGVudHwgaXMgZW1wdHksIGl0cyBhc3BlY3QKQEAgLTg4LDggKzgxLDcgQEAKIAogLy8gQ29weSBhbiBSR0IgYml0bWFwIGludG8gdGhlIHNwZWNpZmllZCB8cmVnaW9uX2luX2ZyYW1lfCBvZiBhIFlVViB2aWRlbyBmcmFtZS4KIC8vIEZpbGxzIHRoZSByZWdpb25zIG91dHNpZGUgfHJlZ2lvbl9pbl9mcmFtZXwgd2l0aCBibGFjay4KLU1FRElBX0VYUE9SVCB2b2lkIENvcHlSR0JUb1ZpZGVvRnJhbWUoY29uc3QgdWludDhfdCogc291cmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RyaWRlLAorTUVESUFfRVhQT1JUIHZvaWQgQ29weVJHQlRvVmlkZW9GcmFtZShjb25zdCB1aW50OF90KiBzb3VyY2UsIGludCBzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6UmVjdCYgcmVnaW9uX2luX2ZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWaWRlb0ZyYW1lKiBmcmFtZSk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmFzZS95dXZfY29udmVydC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3l1dl9jb252ZXJ0LmgKaW5kZXggYmJkNzUzYS4uZjM0NjE2NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3l1dl9jb252ZXJ0LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9iYXNlL3l1dl9jb252ZXJ0LmgKQEAgLTY0LDg0ICs2NCw0NCBAQAogLy8gUGFzcyBpbiBZVjE2L1lWMTIgZGVwZW5kaW5nIG9uIHNvdXJjZSBmb3JtYXQKIE1FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRZVVZUb1JHQjMyKGNvbnN0IHVpbnQ4X3QqIHlwbGFuZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHJnYnN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwgdWludDhfdCogcmdiZnJhbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsIGludCBoZWlnaHQsIGludCB5c3RyaWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlLCBpbnQgcmdic3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSk7CiAKIC8vIENvbnZlcnQgYSBmcmFtZSBvZiBZVVZBIHRvIDMyIGJpdCBBUkdCLgogLy8gUGFzcyBpbiBZVjEyQQotTUVESUFfRVhQT1JUIHZvaWQgQ29udmVydFlVVkFUb0FSR0IoY29uc3QgdWludDhfdCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogcmdiZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBZVVZUeXBlIHl1dl90eXBlKTsKK01FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRZVVZBVG9BUkdCKAorICAgIGNvbnN0IHVpbnQ4X3QqIHlwbGFuZSwgY29uc3QgdWludDhfdCogdXBsYW5lLCBjb25zdCB1aW50OF90KiB2cGxhbmUsCisgICAgY29uc3QgdWludDhfdCogYXBsYW5lLCB1aW50OF90KiByZ2JmcmFtZSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAorICAgIGludCB5c3RyaWRlLCBpbnQgdXZzdHJpZGUsIGludCBhc3RyaWRlLCBpbnQgcmdic3RyaWRlLCBZVVZUeXBlIHl1dl90eXBlKTsKIAogLy8gU2NhbGUgYSBmcmFtZSBvZiBZVVYgdG8gMzIgYml0IEFSR0IuCiAvLyBTdXBwb3J0cyByb3RhdGlvbiBhbmQgbWlycm9yaW5nLgotTUVESUFfRVhQT1JUIHZvaWQgU2NhbGVZVVZUb1JHQjMyKGNvbnN0IHVpbnQ4X3QqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNvdXJjZV9oZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgWVVWVHlwZSB5dXZfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSb3RhdGUgdmlld19yb3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2NhbGVGaWx0ZXIgZmlsdGVyKTsKK01FRElBX0VYUE9SVCB2b2lkIFNjYWxlWVVWVG9SR0IzMihjb25zdCB1aW50OF90KiB5cGxhbmUsIGNvbnN0IHVpbnQ4X3QqIHVwbGFuZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2cGxhbmUsIHVpbnQ4X3QqIHJnYmZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfd2lkdGgsIGludCBzb3VyY2VfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwgaW50IGhlaWdodCwgaW50IHlzdHJpZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlLCBpbnQgcmdic3RyaWRlLCBZVVZUeXBlIHl1dl90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJvdGF0ZSB2aWV3X3JvdGF0ZSwgU2NhbGVGaWx0ZXIgZmlsdGVyKTsKIAogLy8gQmlsaW5lciBTY2FsZSBhIGZyYW1lIG9mIFlWMTIgdG8gMzIgYml0cyBBUkdCIG9uIGEgc3BlY2lmaWVkIHJlY3RhbmdsZS4KIC8vIHx5cGxhbmV8LCBldGMgYW5kIHxyZ2JmcmFtZXwgc2hvdWxkIHBvaW50IHRvIHRoZSB0b3AtbGVmdCBwaXhlbHMgb2YgdGhlCiAvLyBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGJ1ZmZlcnMuCi1NRURJQV9FWFBPUlQgdm9pZCBTY2FsZVlVVlRvUkdCMzJXaXRoUmVjdChjb25zdCB1aW50OF90KiB5cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB1cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiB2cGxhbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzb3VyY2Vfd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc291cmNlX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXN0X3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcmVjdF9sZWZ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcmVjdF90b3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGVzdF9yZWN0X3JpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGRlc3RfcmVjdF9ib3R0b20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1dnN0cmlkZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUpOworTUVESUFfRVhQT1JUIHZvaWQgU2NhbGVZVVZUb1JHQjMyV2l0aFJlY3QoCisgICAgY29uc3QgdWludDhfdCogeXBsYW5lLCBjb25zdCB1aW50OF90KiB1cGxhbmUsIGNvbnN0IHVpbnQ4X3QqIHZwbGFuZSwKKyAgICB1aW50OF90KiByZ2JmcmFtZSwgaW50IHNvdXJjZV93aWR0aCwgaW50IHNvdXJjZV9oZWlnaHQsIGludCBkZXN0X3dpZHRoLAorICAgIGludCBkZXN0X2hlaWdodCwgaW50IGRlc3RfcmVjdF9sZWZ0LCBpbnQgZGVzdF9yZWN0X3RvcCwgaW50IGRlc3RfcmVjdF9yaWdodCwKKyAgICBpbnQgZGVzdF9yZWN0X2JvdHRvbSwgaW50IHlzdHJpZGUsIGludCB1dnN0cmlkZSwgaW50IHJnYnN0cmlkZSk7CiAKLU1FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRSR0IzMlRvWVVWKGNvbnN0IHVpbnQ4X3QqIHJnYmZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogeXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdXBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdnBsYW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCByZ2JzdHJpZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgeXN0cmlkZSwKK01FRElBX0VYUE9SVCB2b2lkIENvbnZlcnRSR0IzMlRvWVVWKGNvbnN0IHVpbnQ4X3QqIHJnYmZyYW1lLCB1aW50OF90KiB5cGxhbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90KiB1cGxhbmUsIHVpbnQ4X3QqIHZwbGFuZSwgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwgaW50IHJnYnN0cmlkZSwgaW50IHlzdHJpZGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdXZzdHJpZGUpOwogCi1NRURJQV9FWFBPUlQgdm9pZCBDb252ZXJ0UkdCMjRUb1lVVihjb25zdCB1aW50OF90KiByZ2JmcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHlwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHVwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqIHZwbGFuZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcmdic3RyaWRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHlzdHJpZGUsCitNRURJQV9FWFBPUlQgdm9pZCBDb252ZXJ0UkdCMjRUb1lVVihjb25zdCB1aW50OF90KiByZ2JmcmFtZSwgdWludDhfdCogeXBsYW5lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCogdXBsYW5lLCB1aW50OF90KiB2cGxhbmUsIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGludCByZ2JzdHJpZGUsIGludCB5c3RyaWRlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHV2c3RyaWRlKTsKIAogLy8gRW1wdHkgU0lNRCByZWdpc3RlciBzdGF0ZSBhZnRlciBjYWxsaW5nIG9wdGltaXplZCBzY2FsZXIgZnVuY3Rpb25zLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9idWZmZXJlZF9kYXRhX3NvdXJjZV9ob3N0X2ltcGwuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvYnVmZmVyZWRfZGF0YV9zb3VyY2VfaG9zdF9pbXBsLmgKaW5kZXggZDhkNjNkYy4uODg5MThlNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9idWZmZXJlZF9kYXRhX3NvdXJjZV9ob3N0X2ltcGwuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2J1ZmZlcmVkX2RhdGFfc291cmNlX2hvc3RfaW1wbC5oCkBAIC00NCw5ICs0NCw4IEBACiAKICAgLy8gVHJhbnNsYXRlIHRoZSBieXRlIHJhbmdlcyB0byB0aW1lIHJhbmdlcyBhbmQgYXBwZW5kIHRoZW0gdG8gdGhlIGxpc3QuCiAgIC8vIFRPRE8oc2FuZGVyc2QpOiBUaGlzIGlzIGEgY29uZnVzaW5nIG5hbWUsIGZpbmQgc29tZXRoaW5nIGJldHRlci4KLSAgdm9pZCBBZGRCdWZmZXJlZFRpbWVSYW5nZXMoCi0gICAgICBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiogYnVmZmVyZWRfdGltZV9yYW5nZXMsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgbWVkaWFfZHVyYXRpb24pIGNvbnN0OworICB2b2lkIEFkZEJ1ZmZlcmVkVGltZVJhbmdlcyhSYW5nZXM8YmFzZTo6VGltZURlbHRhPiogYnVmZmVyZWRfdGltZV9yYW5nZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBtZWRpYV9kdXJhdGlvbikgY29uc3Q7CiAKICAgYm9vbCBEaWRMb2FkaW5nUHJvZ3Jlc3MoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9jYWNoZV91dGlsLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2NhY2hlX3V0aWwuaAppbmRleCA2ODA3YjZmLi44ZTk2ZWQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2NhY2hlX3V0aWwuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2NhY2hlX3V0aWwuaApAQCAtMjIsMTQgKzIyLDE0IEBACiAvLyB0aGUgc2VydmVyLiAgUmVwb3J0ZWQgdmlhIFVNQSwgc28gZG9uJ3QgY2hhbmdlL3JldXNlIHByZXZpb3VzbHktZXhpc3RpbmcKIC8vIHZhbHVlcy4KIGVudW0gVW5jYWNoZWFibGVSZWFzb24gewotICBrTm9EYXRhID0gMSA8PCAwLCAgLy8gTm90IDIwMCBvciAyMDYuCi0gIGtQcmUxMVBhcnRpYWxSZXNwb25zZSA9IDEgPDwgMSwgIC8vIDIwNiBidXQgSFRUUCB2ZXJzaW9uIDwgMS4xLgorICBrTm9EYXRhID0gMSA8PCAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCAyMDAgb3IgMjA2LgorICBrUHJlMTFQYXJ0aWFsUmVzcG9uc2UgPSAxIDw8IDEsICAgICAgICAgICAgICAgIC8vIDIwNiBidXQgSFRUUCB2ZXJzaW9uIDwgMS4xLgogICBrTm9TdHJvbmdWYWxpZGF0b3JPblBhcnRpYWxSZXNwb25zZSA9IDEgPDwgMiwgIC8vIDIwNiwgbm8gc3Ryb25nIHZhbGlkYXRvci4KLSAga1Nob3J0TWF4QWdlID0gMSA8PCAzLCAgLy8gTWF4IGFnZSBsZXNzIHRoYW4gMWggKGFyYml0cmFyeSB2YWx1ZSkuCi0gIGtFeHBpcmVzVG9vU29vbiA9IDEgPDwgNCwgIC8vIEV4cGlyZXMgaW4gbGVzcyB0aGFuIDFoIChhcmJpdHJhcnkgdmFsdWUpLgorICBrU2hvcnRNYXhBZ2UgPSAxIDw8IDMsICAgICAgICAvLyBNYXggYWdlIGxlc3MgdGhhbiAxaCAoYXJiaXRyYXJ5IHZhbHVlKS4KKyAga0V4cGlyZXNUb29Tb29uID0gMSA8PCA0LCAgICAgLy8gRXhwaXJlcyBpbiBsZXNzIHRoYW4gMWggKGFyYml0cmFyeSB2YWx1ZSkuCiAgIGtIYXNNdXN0UmV2YWxpZGF0ZSA9IDEgPDwgNSwgIC8vIFJlc3BvbnNlIGFza3MgZm9yIHJldmFsaWRhdGlvbi4KLSAga05vQ2FjaGUgPSAxIDw8IDYsICAvLyBSZXNwb25zZSBpbmNsdWRlZCBhIG5vLWNhY2hlIGhlYWRlci4KLSAga05vU3RvcmUgPSAxIDw8IDcsICAvLyBSZXNwb25zZSBpbmNsdWRlZCBhIG5vLXN0b3JlIGhlYWRlci4KKyAga05vQ2FjaGUgPSAxIDw8IDYsICAgICAgICAgICAgLy8gUmVzcG9uc2UgaW5jbHVkZWQgYSBuby1jYWNoZSBoZWFkZXIuCisgIGtOb1N0b3JlID0gMSA8PCA3LCAgICAgICAgICAgIC8vIFJlc3BvbnNlIGluY2x1ZGVkIGEgbm8tc3RvcmUgaGVhZGVyLgogICBrTWF4UmVhc29uICAvLyBOZWVkcyB0byBiZSBvbmUgbW9yZSB0aGFuIG1heCBsZWdpdGltYXRlIHJlYXNvbi4KIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvY2RtX3Jlc3VsdF9wcm9taXNlLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2NkbV9yZXN1bHRfcHJvbWlzZS5oCmluZGV4IDg5ZGU0ZDMuLjcyYjk2OGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvY2RtX3Jlc3VsdF9wcm9taXNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9jZG1fcmVzdWx0X3Byb21pc2UuaApAQCAtMzQsOCArMzQsNyBAQAogCiAgIC8vIENkbVByb21pc2VUZW1wbGF0ZTxUPiBpbXBsZW1lbnRhdGlvbi4KICAgdm9pZCByZXNvbHZlKGNvbnN0IFQmLi4uIHJlc3VsdCkgT1ZFUlJJREU7Ci0gIHZvaWQgcmVqZWN0KE1lZGlhS2V5czo6RXhjZXB0aW9uIGV4Y2VwdGlvbl9jb2RlLAotICAgICAgICAgICAgICB1aW50MzJfdCBzeXN0ZW1fY29kZSwKKyAgdm9pZCByZWplY3QoTWVkaWFLZXlzOjpFeGNlcHRpb24gZXhjZXB0aW9uX2NvZGUsIHVpbnQzMl90IHN5c3RlbV9jb2RlLAogICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZXJyb3JfbWVzc2FnZSkgT1ZFUlJJREU7CiAKICBwcml2YXRlOgpAQCAtNTUsMTMgKzU0LDExIEBACiBDZG1SZXN1bHRQcm9taXNlPFQuLi4+OjpDZG1SZXN1bHRQcm9taXNlKAogICAgIGNvbnN0IGJsaW5rOjpXZWJDb250ZW50RGVjcnlwdGlvbk1vZHVsZVJlc3VsdCYgcmVzdWx0LAogICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1bWFfbmFtZSkKLSAgICA6IHdlYl9jZG1fcmVzdWx0XyhyZXN1bHQpLCB1bWFfbmFtZV8odW1hX25hbWUpIHsKLX0KKyAgICA6IHdlYl9jZG1fcmVzdWx0XyhyZXN1bHQpLCB1bWFfbmFtZV8odW1hX25hbWUpIHt9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZS4uLiBUPgogQ2RtUmVzdWx0UHJvbWlzZTxULi4uPjo6fkNkbVJlc3VsdFByb21pc2UoKSB7Ci0gIGlmICghSXNQcm9taXNlU2V0dGxlZCgpKQotICAgIFJlamVjdFByb21pc2VPbkRlc3RydWN0aW9uKCk7CisgIGlmICghSXNQcm9taXNlU2V0dGxlZCgpKSBSZWplY3RQcm9taXNlT25EZXN0cnVjdGlvbigpOwogfQogCiAvLyAiaW5saW5lIiBpcyBuZWVkZWQgdG8gcHJldmVudCBtdWx0aXBsZSBkZWZpbml0aW9uIGVycm9yLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9jZG1fc2Vzc2lvbl9hZGFwdGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2NkbV9zZXNzaW9uX2FkYXB0ZXIuaAppbmRleCBjMTE3NGUxLi44YjFjOGYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2NkbV9zZXNzaW9uX2FkYXB0ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2NkbV9zZXNzaW9uX2FkYXB0ZXIuaApAQCAtMzgsMTAgKzM4LDggQEAKICAgLy8gQ3JlYXRlcyB0aGUgQ0RNIGZvciB8a2V5X3N5c3RlbXwgdXNpbmcgfGNkbV9mYWN0b3J5fCBhbmQgcmV0dXJucyB0aGUgcmVzdWx0CiAgIC8vIHZpYSB8cmVzdWx0fC4KICAgdm9pZCBDcmVhdGVDZG0oCi0gICAgICBDZG1GYWN0b3J5KiBjZG1fZmFjdG9yeSwKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgY29uc3QgR1VSTCYgc2VjdXJpdHlfb3JpZ2luLAotICAgICAgY29uc3QgQ2RtQ29uZmlnJiBjZG1fY29uZmlnLAorICAgICAgQ2RtRmFjdG9yeSogY2RtX2ZhY3RvcnksIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAorICAgICAgY29uc3QgR1VSTCYgc2VjdXJpdHlfb3JpZ2luLCBjb25zdCBDZG1Db25maWcmIGNkbV9jb25maWcsCiAgICAgICBzdGQ6OnVuaXF1ZV9wdHI8Ymxpbms6OldlYkNvbnRlbnREZWNyeXB0aW9uTW9kdWxlUmVzdWx0PiByZXN1bHQpOwogCiAgIC8vIFByb3ZpZGVzIGEgc2VydmVyIGNlcnRpZmljYXRlIHRvIGJlIHVzZWQgdG8gZW5jcnlwdCBtZXNzYWdlcyB0byB0aGUKQEAgLTExMCw4ICsxMDgsNyBAQAogICB+Q2RtU2Vzc2lvbkFkYXB0ZXIoKTsKIAogICAvLyBDYWxsYmFjayBmb3IgQ3JlYXRlQ2RtKCkuCi0gIHZvaWQgT25DZG1DcmVhdGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLAotICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lVGlja3Mgc3RhcnRfdGltZSwKKyAgdm9pZCBPbkNkbUNyZWF0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sIGJhc2U6OlRpbWVUaWNrcyBzdGFydF90aW1lLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhS2V5cz4mIGNkbSwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2ludGVydmFsX21hcC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9pbnRlcnZhbF9tYXAuaAppbmRleCA5YzlmMTUzLi5jNjg3YzU4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2ludGVydmFsX21hcC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvaW50ZXJ2YWxfbWFwLmgKQEAgLTc2LDggKzc2LDcgQEAKIC8vIEludGVydmFsTWFwIHdoZXJlIGFsbCB2YWx1ZXMgYXJlIHRoZSBzYW1lLiBDYWxsaW5nICsrLy0tCiAvLyBnb2VzIHRvIHRoZSBuZXh0L3ByZXZpb3VzIGludGVydmFsLCB3aGljaCBpcyBndWFyYW50ZWVkIHRvCiAvLyBoYXZlIHZhbHVlcyBkaWZmZXJlbnQgZnJvbSB0aGUgY3VycmVudCBpbnRlcnZhbC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXlUeXBlLAotICAgICAgICAgIHR5cGVuYW1lIFZhbHVlVHlwZSwKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlUeXBlLCB0eXBlbmFtZSBWYWx1ZVR5cGUsCiAgICAgICAgICAgY2xhc3MgQ29tcGFyZSA9IHN0ZDo6bGVzczxLZXlUeXBlPiwKICAgICAgICAgICBjbGFzcyBOdW1lcmljTGltaXRzID0gc3RkOjpudW1lcmljX2xpbWl0czxLZXlUeXBlPj4KIGNsYXNzIEludGVydmFsTWFwQ29uc3RJdGVyYXRvciB7CkBAIC0xNTcsOCArMTU2LDcgQEAKICAgdHlwZW5hbWUgTWFwVHlwZTo6Y29uc3RfaXRlcmF0b3IgaXRlcl87CiB9OwogCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VHlwZSwKLSAgICAgICAgICB0eXBlbmFtZSBWYWx1ZVR5cGUsCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VHlwZSwgdHlwZW5hbWUgVmFsdWVUeXBlLAogICAgICAgICAgIGNsYXNzIENvbXBhcmUgPSBzdGQ6Omxlc3M8S2V5VHlwZT4sCiAgICAgICAgICAgY2xhc3MgTnVtZXJpY0xpbWl0cyA9IHN0ZDo6bnVtZXJpY19saW1pdHM8S2V5VHlwZT4+CiBjbGFzcyBJbnRlcnZhbE1hcCB7CkBAIC0xODMsOCArMTgxLDcgQEAKIAogICAvLyBJbmNyZWFzZSBbZnJvbS4udG8pIGJ5IHxob3dfbXVjaHwuCiAgIHZvaWQgSW5jcmVtZW50SW50ZXJ2YWwoS2V5VHlwZSBmcm9tLCBLZXlUeXBlIHRvLCBWYWx1ZVR5cGUgaG93X211Y2gpIHsKLSAgICBpZiAodG8gPD0gZnJvbSB8fCBob3dfbXVjaCA9PSAwKQotICAgICAgcmV0dXJuOworICAgIGlmICh0byA8PSBmcm9tIHx8IGhvd19tdWNoID09IDApIHJldHVybjsKICAgICB0eXBlbmFtZSBNYXBUeXBlOjppdGVyYXRvciBhID0gTWFrZUVudHJ5KGZyb20pOwogICAgIHR5cGVuYW1lIE1hcFR5cGU6Oml0ZXJhdG9yIGIgPSBNYWtlRW50cnkodG8pOwogICAgIGZvciAodHlwZW5hbWUgTWFwVHlwZTo6aXRlcmF0b3IgaSA9IGE7IGkgIT0gYjsgKytpKSB7CkBAIC0xOTcsOCArMTk0LDcgQEAKIAogICAvLyBTZXQgW2Zyb20uLnRvKSB0byB8aG93X211Y2h8LgogICB2b2lkIFNldEludGVydmFsKEtleVR5cGUgZnJvbSwgS2V5VHlwZSB0bywgVmFsdWVUeXBlIGhvd19tdWNoKSB7Ci0gICAgaWYgKHRvIDw9IGZyb20pCi0gICAgICByZXR1cm47CisgICAgaWYgKHRvIDw9IGZyb20pIHJldHVybjsKICAgICB0eXBlbmFtZSBNYXBUeXBlOjppdGVyYXRvciBhID0gTWFrZUVudHJ5KGZyb20pOwogICAgIHR5cGVuYW1lIE1hcFR5cGU6Oml0ZXJhdG9yIGIgPSBNYWtlRW50cnkodG8pOwogICAgIGEtPnNlY29uZCA9IGhvd19tdWNoOwpAQCAtMjYzLDggKzI1OSw3IEBACiAKICAgLy8gUmVtb3ZlIGR1cGxpY2F0ZXMgYmVmb3JlIGFuZCBhZnRlciB8aXwuCiAgIHZvaWQgUmVtb3ZlRHVwbGljYXRlcyh0eXBlbmFtZSBNYXBUeXBlOjppdGVyYXRvciBpKSB7Ci0gICAgaWYgKGkgPT0gbWFwXy5lbmQoKSkKLSAgICAgIHJldHVybjsKKyAgICBpZiAoaSA9PSBtYXBfLmVuZCgpKSByZXR1cm47CiAKICAgICB0eXBlbmFtZSBNYXBUeXBlOjppdGVyYXRvciBmaXJzdCA9IGk7CiAgICAgdHlwZW5hbWUgTWFwVHlwZTo6aXRlcmF0b3Igc2Vjb25kID0gaTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsva2V5X3N5c3RlbV9jb25maWdfc2VsZWN0b3IuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsva2V5X3N5c3RlbV9jb25maWdfc2VsZWN0b3IuaAppbmRleCBlZGE3MWE1Li5lYzkzNWZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2tleV9zeXN0ZW1fY29uZmlnX3NlbGVjdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9rZXlfc3lzdGVtX2NvbmZpZ19zZWxlY3Rvci5oCkBAIC0zNCw5ICszNCw4IEBACiAKIGNsYXNzIE1FRElBX0JMSU5LX0VYUE9SVCBLZXlTeXN0ZW1Db25maWdTZWxlY3RvciB7CiAgcHVibGljOgotICBLZXlTeXN0ZW1Db25maWdTZWxlY3RvcigKLSAgICAgIGNvbnN0IEtleVN5c3RlbXMqIGtleV9zeXN0ZW1zLAotICAgICAgTWVkaWFQZXJtaXNzaW9uKiBtZWRpYV9wZXJtaXNzaW9uKTsKKyAgS2V5U3lzdGVtQ29uZmlnU2VsZWN0b3IoY29uc3QgS2V5U3lzdGVtcyoga2V5X3N5c3RlbXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lZGlhUGVybWlzc2lvbiogbWVkaWFfcGVybWlzc2lvbik7CiAKICAgfktleVN5c3RlbUNvbmZpZ1NlbGVjdG9yKCk7CiAKQEAgLTcyLDggKzcxLDcgQEAKICAgICAgIGJsaW5rOjpXZWJNZWRpYUtleVN5c3RlbUNvbmZpZ3VyYXRpb24qIGFjY3VtdWxhdGVkX2NvbmZpZ3VyYXRpb24pOwogCiAgIGJvb2wgR2V0U3VwcG9ydGVkQ2FwYWJpbGl0aWVzKAotICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGtleV9zeXN0ZW0sCi0gICAgICBFbWVNZWRpYVR5cGUgbWVkaWFfdHlwZSwKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBrZXlfc3lzdGVtLCBFbWVNZWRpYVR5cGUgbWVkaWFfdHlwZSwKICAgICAgIGNvbnN0IGJsaW5rOjpXZWJWZWN0b3I8Ymxpbms6OldlYk1lZGlhS2V5U3lzdGVtTWVkaWFDYXBhYmlsaXR5PiYKICAgICAgICAgICByZXF1ZXN0ZWRfbWVkaWFfY2FwYWJpbGl0aWVzLAogICAgICAgQ29uZmlnU3RhdGUqIGNvbmZpZ19zdGF0ZSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbHJ1LmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL2xydS5oCmluZGV4IDU2ZGQwYTUuLmRiYmRiYzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbHJ1LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9scnUuaApAQCAtNTEsOCArNTEsNyBAQAogICAvLyBJZiB8eHwgaXMgbm90IGluIExSVSwgaXQgaXMgYWRkZWQuCiAgIC8vIFBsZWFzZSBjYWxsIEluc2VydCgpIGlmIHlvdSBrbm93IHRoYXQgfHh8IGlzIG5vdCBpbiB0aGUgTFJVLgogICB2b2lkIFVzZShjb25zdCBUJiB4KSB7Ci0gICAgaWYgKENvbnRhaW5zKHgpKQotICAgICAgUmVtb3ZlKHgpOworICAgIGlmIChDb250YWlucyh4KSkgUmVtb3ZlKHgpOwogICAgIEluc2VydCh4KTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL21vY2tfd2VidXJsbG9hZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL21vY2tfd2VidXJsbG9hZGVyLmgKaW5kZXggZmYzMDk5Ny4uZjNjMDQ5NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9tb2NrX3dlYnVybGxvYWRlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbW9ja193ZWJ1cmxsb2FkZXIuaApAQCAtMTgsMTAgKzE4LDggQEAKIAogICBNT0NLX01FVEhPRDUobG9hZFN5bmNocm9ub3VzbHksCiAgICAgICAgICAgICAgICB2b2lkKGNvbnN0IGJsaW5rOjpXZWJVUkxSZXF1ZXN0JiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBibGluazo6V2ViVVJMUmVzcG9uc2UmIHJlc3BvbnNlLAotICAgICAgICAgICAgICAgICAgICBibGluazo6V2ViVVJMRXJyb3ImIGVycm9yLAotICAgICAgICAgICAgICAgICAgICBibGluazo6V2ViRGF0YSYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgaW50NjRfdCYgZW5jb2RlZF9kYXRhX2xlbmd0aCkpOworICAgICAgICAgICAgICAgICAgICBibGluazo6V2ViVVJMUmVzcG9uc2UmIHJlc3BvbnNlLCBibGluazo6V2ViVVJMRXJyb3ImIGVycm9yLAorICAgICAgICAgICAgICAgICAgICBibGluazo6V2ViRGF0YSYgZGF0YSwgaW50NjRfdCYgZW5jb2RlZF9kYXRhX2xlbmd0aCkpOwogICBNT0NLX01FVEhPRDIobG9hZEFzeW5jaHJvbm91c2x5LCB2b2lkKGNvbnN0IGJsaW5rOjpXZWJVUkxSZXF1ZXN0JiByZXF1ZXN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsaW5rOjpXZWJVUkxMb2FkZXJDbGllbnQqIGNsaWVudCkpOwogICBNT0NLX01FVEhPRDAoY2FuY2VsLCB2b2lkKCkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9tdWx0aWJ1ZmZlcl9kYXRhX3NvdXJjZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9tdWx0aWJ1ZmZlcl9kYXRhX3NvdXJjZS5oCmluZGV4IDJmMTc2NDguLjg2ODVjYzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbXVsdGlidWZmZXJfZGF0YV9zb3VyY2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL211bHRpYnVmZmVyX2RhdGFfc291cmNlLmgKQEAgLTY1LDEzICs2NSwxMCBAQAogICAvLyB3aWxsIGJlIHJlcG9ydGVkIHRvIHxob3N0fC4gfGRvd25sb2FkaW5nX2NifCB3aWxsIGJlIGNhbGxlZCB3aGVuZXZlciB0aGUKICAgLy8gZG93bmxvYWRpbmcvcGF1c2VkIHN0YXRlIG9mIHRoZSBzb3VyY2UgY2hhbmdlcy4KICAgTXVsdGlidWZmZXJEYXRhU291cmNlKAotICAgICAgY29uc3QgR1VSTCYgdXJsLAotICAgICAgVXJsRGF0YTo6Q09SU01vZGUgY29yc19tb2RlLAorICAgICAgY29uc3QgR1VSTCYgdXJsLCBVcmxEYXRhOjpDT1JTTW9kZSBjb3JzX21vZGUsCiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiB0YXNrX3J1bm5lciwKLSAgICAgIGxpbmtlZF9wdHI8VXJsSW5kZXg+IHVybF9pbmRleCwKLSAgICAgIGJsaW5rOjpXZWJGcmFtZSogZnJhbWUsCi0gICAgICBNZWRpYUxvZyogbWVkaWFfbG9nLAotICAgICAgQnVmZmVyZWREYXRhU291cmNlSG9zdCogaG9zdCwKKyAgICAgIGxpbmtlZF9wdHI8VXJsSW5kZXg+IHVybF9pbmRleCwgYmxpbms6OldlYkZyYW1lKiBmcmFtZSwKKyAgICAgIE1lZGlhTG9nKiBtZWRpYV9sb2csIEJ1ZmZlcmVkRGF0YVNvdXJjZUhvc3QqIGhvc3QsCiAgICAgICBjb25zdCBEb3dubG9hZGluZ0NCJiBkb3dubG9hZGluZ19jYik7CiAgIH5NdWx0aWJ1ZmZlckRhdGFTb3VyY2UoKSBPVkVSUklERTsKIApAQCAtMTIyLDkgKzExOSw3IEBACiAgIHZvaWQgU3RvcCgpIE9WRVJSSURFOwogICB2b2lkIEFib3J0KCkgT1ZFUlJJREU7CiAKLSAgdm9pZCBSZWFkKGludDY0X3QgcG9zaXRpb24sCi0gICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgIHVpbnQ4X3QqIGRhdGEsCisgIHZvaWQgUmVhZChpbnQ2NF90IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDhfdCogZGF0YSwKICAgICAgICAgICAgIGNvbnN0IERhdGFTb3VyY2U6OlJlYWRDQiYgcmVhZF9jYikgT1ZFUlJJREU7CiAgIGJvb2wgR2V0U2l6ZShpbnQ2NF90KiBzaXplX291dCkgT1ZFUlJJREU7CiAgIGJvb2wgSXNTdHJlYW1pbmcoKSBPVkVSUklERTsKQEAgLTI2NCw2ICsyNTksNyBAQAogICBiYXNlOjpXZWFrUHRyPE11bHRpYnVmZmVyRGF0YVNvdXJjZT4gd2Vha19wdHJfOwogICBiYXNlOjpXZWFrUHRyRmFjdG9yeTxNdWx0aWJ1ZmZlckRhdGFTb3VyY2U+IHdlYWtfZmFjdG9yeV87CiAKKyBwcml2YXRlOgogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTXVsdGlidWZmZXJEYXRhU291cmNlKTsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbXVsdGlidWZmZXJfcmVhZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL211bHRpYnVmZmVyX3JlYWRlci5oCmluZGV4IGE0YzEzNjEuLjMwZjI0NGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbXVsdGlidWZmZXJfcmVhZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9tdWx0aWJ1ZmZlcl9yZWFkZXIuaApAQCAtMzYsOSArMzYsNyBAQAogICAvLyByZWdpb25zIG9mIGF2YWlsYWJsZSBkYXRhIGluIHRoZSBjYWNoZSBhcyB3ZWxsLgogICAvLyBJZiB8ZW5kfCBpcyBub3Qga25vd24sIHVzZSAtMS4KICAgTXVsdGlCdWZmZXJSZWFkZXIoCi0gICAgICBNdWx0aUJ1ZmZlciogbXVsdGlidWZmZXIsCi0gICAgICBpbnQ2NF90IHN0YXJ0LAotICAgICAgaW50NjRfdCBlbmQsCisgICAgICBNdWx0aUJ1ZmZlciogbXVsdGlidWZmZXIsIGludDY0X3Qgc3RhcnQsIGludDY0X3QgZW5kLAogICAgICAgY29uc3QgYmFzZTo6Q2FsbGJhY2s8dm9pZChpbnQ2NF90LCBpbnQ2NF90KT4mIHByb2dyZXNzX2NhbGxiYWNrKTsKIAogICB+TXVsdGlCdWZmZXJSZWFkZXIoKSBPVkVSUklERTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbmV3X3Nlc3Npb25fY2RtX3Jlc3VsdF9wcm9taXNlLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL25ld19zZXNzaW9uX2NkbV9yZXN1bHRfcHJvbWlzZS5oCmluZGV4IGFkY2NjYWMuLmVlNmEwZWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvbmV3X3Nlc3Npb25fY2RtX3Jlc3VsdF9wcm9taXNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9uZXdfc2Vzc2lvbl9jZG1fcmVzdWx0X3Byb21pc2UuaApAQCAtNTAsOCArNTAsNyBAQAogCiAgIC8vIENkbVByb21pc2VUZW1wbGF0ZTxUPiBpbXBsZW1lbnRhdGlvbi4KICAgdm9pZCByZXNvbHZlKGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXNzaW9uX2lkKSBPVkVSUklERTsKLSAgdm9pZCByZWplY3QoTWVkaWFLZXlzOjpFeGNlcHRpb24gZXhjZXB0aW9uX2NvZGUsCi0gICAgICAgICAgICAgIHVpbnQzMl90IHN5c3RlbV9jb2RlLAorICB2b2lkIHJlamVjdChNZWRpYUtleXM6OkV4Y2VwdGlvbiBleGNlcHRpb25fY29kZSwgdWludDMyX3Qgc3lzdGVtX2NvZGUsCiAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBlcnJvcl9tZXNzYWdlKSBPVkVSUklERTsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3JlbmRlcmVyX21lZGlhX3BsYXllcl9pbnRlcmZhY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvcmVuZGVyZXJfbWVkaWFfcGxheWVyX2ludGVyZmFjZS5oCmluZGV4IDk4NmNkYTYuLjJhNzlkOTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvcmVuZGVyZXJfbWVkaWFfcGxheWVyX2ludGVyZmFjZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvcmVuZGVyZXJfbWVkaWFfcGxheWVyX2ludGVyZmFjZS5oCkBAIC0yOSwxMCArMjksOCBAQAogCiBjbGFzcyBSZW5kZXJlck1lZGlhUGxheWVySW50ZXJmYWNlIHsKICBwdWJsaWM6Ci0gIHZpcnR1YWwgdm9pZCBPbk1lZGlhTWV0YWRhdGFDaGFuZ2VkKGJhc2U6OlRpbWVEZWx0YSBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN1Y2Nlc3MpID0gMDsKKyAgdmlydHVhbCB2b2lkIE9uTWVkaWFNZXRhZGF0YUNoYW5nZWQoYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uLCBpbnQgd2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQsIGJvb2wgc3VjY2VzcykgPSAwOwogICB2aXJ0dWFsIHZvaWQgT25QbGF5YmFja0NvbXBsZXRlKCkgPSAwOwogICB2aXJ0dWFsIHZvaWQgT25CdWZmZXJpbmdVcGRhdGUoaW50IHBlcmNlbnRhZ2UpID0gMDsKICAgdmlydHVhbCB2b2lkIE9uU2Vla1JlcXVlc3QoY29uc3QgYmFzZTo6VGltZURlbHRhJiB0aW1lX3RvX3NlZWspID0gMDsKQEAgLTcyLDExICs3MCw5IEBACiAgcHVibGljOgogICAvLyBJbml0aWFsaXplcyBhIE1lZGlhUGxheWVyQW5kcm9pZCBvYmplY3QgaW4gYnJvd3NlciBwcm9jZXNzLgogICB2aXJ0dWFsIHZvaWQgSW5pdGlhbGl6ZShNZWRpYVBsYXllckhvc3RNc2dfSW5pdGlhbGl6ZV9UeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwbGF5ZXJfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEdVUkwmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBsYXllcl9pZCwgY29uc3QgR1VSTCYgdXJsLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVVJMJiBmaXJzdF9wYXJ0eV9mb3JfY29va2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgR1VSTCYgZnJhbWVfdXJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGFsbG93X2NyZWRlbnRpYWxzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBHVVJMJiBmcmFtZV91cmwsIGJvb2wgYWxsb3dfY3JlZGVudGlhbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWxlZ2F0ZV9pZCkgPSAwOwogCiAgIC8vIFN0YXJ0cyB0aGUgcGxheWVyLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9yZXNvdXJjZV9tdWx0aWJ1ZmZlcl9kYXRhX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9yZXNvdXJjZV9tdWx0aWJ1ZmZlcl9kYXRhX3Byb3ZpZGVyLmNjCmluZGV4IGZhYmI1Y2UuLmVkMzM0ODMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvcmVzb3VyY2VfbXVsdGlidWZmZXJfZGF0YV9wcm92aWRlci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3Jlc291cmNlX211bHRpYnVmZmVyX2RhdGFfcHJvdmlkZXIuY2MKQEAgLTE4OCw4ICsxODgsNyBAQAogfQogCiB2b2lkIFJlc291cmNlTXVsdGlCdWZmZXJEYXRhUHJvdmlkZXI6OmRpZFNlbmREYXRhKAotICAgIFdlYlVSTExvYWRlciogbG9hZGVyLCB1aW50NjQgYnl0ZXNfc2VudCwKLSAgICB1aW50NjQgdG90YWxfYnl0ZXNfdG9fYmVfc2VudCkgeworICAgIFdlYlVSTExvYWRlciogbG9hZGVyLCB1aW50NjQgYnl0ZXNfc2VudCwgdWludDY0IHRvdGFsX2J5dGVzX3RvX2JlX3NlbnQpIHsKICAgTk9USU1QTEVNRU5URUQoKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay9yZXNvdXJjZV9tdWx0aWJ1ZmZlcl9kYXRhX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3Jlc291cmNlX211bHRpYnVmZmVyX2RhdGFfcHJvdmlkZXIuaAppbmRleCAyYWFmMzQ4Li5hY2ZlNzBjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3Jlc291cmNlX211bHRpYnVmZmVyX2RhdGFfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3Jlc291cmNlX211bHRpYnVmZmVyX2RhdGFfcHJvdmlkZXIuaApAQCAtNDcsMjcgKzQ3LDIwIEBACiAKICAgLy8gYmxpbms6OldlYlVSTExvYWRlckNsaWVudCBpbXBsZW1lbnRhdGlvbi4KICAgYm9vbCB3aWxsRm9sbG93UmVkaXJlY3QoCi0gICAgICBibGluazo6V2ViVVJMTG9hZGVyKiBsb2FkZXIsCi0gICAgICBibGluazo6V2ViVVJMUmVxdWVzdCYgbmV3UmVxdWVzdCwKKyAgICAgIGJsaW5rOjpXZWJVUkxMb2FkZXIqIGxvYWRlciwgYmxpbms6OldlYlVSTFJlcXVlc3QmIG5ld1JlcXVlc3QsCiAgICAgICBjb25zdCBibGluazo6V2ViVVJMUmVzcG9uc2UmIHJlZGlyZWN0UmVzcG9uc2UpIE9WRVJSSURFOwotICB2b2lkIGRpZFNlbmREYXRhKGJsaW5rOjpXZWJVUkxMb2FkZXIqIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICB1aW50NjQgYnl0ZXNTZW50LAorICB2b2lkIGRpZFNlbmREYXRhKGJsaW5rOjpXZWJVUkxMb2FkZXIqIGxvYWRlciwgdWludDY0IGJ5dGVzU2VudCwKICAgICAgICAgICAgICAgICAgICB1aW50NjQgdG90YWxCeXRlc1RvQmVTZW50KSBPVkVSUklERTsKICAgdm9pZCBkaWRSZWNlaXZlUmVzcG9uc2UoYmxpbms6OldlYlVSTExvYWRlciogbG9hZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibGluazo6V2ViVVJMUmVzcG9uc2UmIHJlc3BvbnNlKSBPVkVSUklERTsKLSAgdm9pZCBkaWREb3dubG9hZERhdGEoYmxpbms6OldlYlVSTExvYWRlciogbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9sZW5ndGgsCisgIHZvaWQgZGlkRG93bmxvYWREYXRhKGJsaW5rOjpXZWJVUkxMb2FkZXIqIGxvYWRlciwgaW50IGRhdGFfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5jb2RlZF9kYXRhX2xlbmd0aCkgT1ZFUlJJREU7Ci0gIHZvaWQgZGlkUmVjZWl2ZURhdGEoYmxpbms6OldlYlVSTExvYWRlciogbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGRhdGFfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNvZGVkX2RhdGFfbGVuZ3RoLAorICB2b2lkIGRpZFJlY2VpdmVEYXRhKGJsaW5rOjpXZWJVUkxMb2FkZXIqIGxvYWRlciwgY29uc3QgY2hhciogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9sZW5ndGgsIGludCBlbmNvZGVkX2RhdGFfbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgIGludCBlbmNvZGVkX2JvZHlfbGVuZ3RoKSBPVkVSUklERTsKLSAgdm9pZCBkaWRSZWNlaXZlQ2FjaGVkTWV0YWRhdGEoYmxpbms6OldlYlVSTExvYWRlciogbG9hZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkYXRhLAorICB2b2lkIGRpZFJlY2VpdmVDYWNoZWRNZXRhZGF0YShibGluazo6V2ViVVJMTG9hZGVyKiBsb2FkZXIsIGNvbnN0IGNoYXIqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkYXRhTGVuZ3RoKSBPVkVSUklERTsKLSAgdm9pZCBkaWRGaW5pc2hMb2FkaW5nKGJsaW5rOjpXZWJVUkxMb2FkZXIqIGxvYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBmaW5pc2hUaW1lLAorICB2b2lkIGRpZEZpbmlzaExvYWRpbmcoYmxpbms6OldlYlVSTExvYWRlciogbG9hZGVyLCBkb3VibGUgZmluaXNoVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgdG90YWxfZW5jb2RlZF9kYXRhX2xlbmd0aCkgT1ZFUlJJREU7CiAgIHZvaWQgZGlkRmFpbChibGluazo6V2ViVVJMTG9hZGVyKiBsb2FkZXIsIGNvbnN0IGJsaW5rOjpXZWJVUkxFcnJvciYpIE9WRVJSSURFOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3RleHR0cmFja19pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3RleHR0cmFja19pbXBsLmgKaW5kZXggYzEzZDRjZi4uYWIyNTllMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay90ZXh0dHJhY2tfaW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvdGV4dHRyYWNrX2ltcGwuaApAQCAtMzMsMTggKzMzLDE0IEBACiAKICAgflRleHRUcmFja0ltcGwoKSBPVkVSUklERTsKIAotICB2b2lkIGFkZFdlYlZUVEN1ZShjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudCwKKyAgdm9pZCBhZGRXZWJWVFRDdWUoY29uc3QgYmFzZTo6VGltZURlbHRhJiBzdGFydCwgY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbmQsCisgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXR0aW5ncykgT1ZFUlJJREU7CiAKICBwcml2YXRlOgogICBzdGF0aWMgdm9pZCBPbkFkZEN1ZShXZWJJbmJhbmRUZXh0VHJhY2tJbXBsKiB0ZXh0X3RyYWNrLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIHN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEmIGVuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGlkLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29udGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZURlbHRhJiBzdGFydCwgY29uc3QgYmFzZTo6VGltZURlbHRhJiBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgY29uc3Qgc3RkOjpzdHJpbmcmIGNvbnRlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBzZXR0aW5ncyk7CiAKICAgc3RhdGljIHZvaWQgT25SZW1vdmVUcmFjayhibGluazo6V2ViTWVkaWFQbGF5ZXJDbGllbnQqIGNsaWVudCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvdXJsX2luZGV4LmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3VybF9pbmRleC5oCmluZGV4IDY2YWVhZjIuLmY1MzYwNWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvdXJsX2luZGV4LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay91cmxfaW5kZXguaApAQCAtMTQyLDggKzE0Miw3IEBACiAgIGJsaW5rOjpXZWJGcmFtZSogZnJhbWUoKSBjb25zdCB7IHJldHVybiBmcmFtZV87IH0KIAogIHByb3RlY3RlZDoKLSAgVXJsRGF0YShjb25zdCBHVVJMJiB1cmwsCi0gICAgICAgICAgQ09SU01vZGUgY29yc19tb2RlLAorICBVcmxEYXRhKGNvbnN0IEdVUkwmIHVybCwgQ09SU01vZGUgY29yc19tb2RlLAogICAgICAgICAgIGNvbnN0IGJhc2U6OldlYWtQdHI8VXJsSW5kZXg+JiB1cmxfaW5kZXgpOwogICB2aXJ0dWFsIH5VcmxEYXRhKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvdmlkZW9fZnJhbWVfY29tcG9zaXRvci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay92aWRlb19mcmFtZV9jb21wb3NpdG9yLmgKaW5kZXggZDBkYzQ4Ni4uNTMzN2E4OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay92aWRlb19mcmFtZV9jb21wb3NpdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay92aWRlb19mcmFtZV9jb21wb3NpdG9yLmgKQEAgLTEyOCw4ICsxMjgsNyBAQAogICAvLyBVcGRhdGVzIHxpc19iYWNrZ3JvdW5kX3JlbmRlcmluZ198LCB8bGFzdF9pbnRlcnZhbF98LCBhbmQgcmVzZXRzCiAgIC8vIHxiYWNrZ3JvdW5kX3JlbmRlcmluZ190aW1lcl98LiBSZXR1cm5zIHRydWUgaWYgdGhlcmUncyBhIG5ldyBmcmFtZQogICAvLyBhdmFpbGFibGUgdmlhIEdldEN1cnJlbnRGcmFtZSgpLgotICBib29sIENhbGxSZW5kZXIoYmFzZTo6VGltZVRpY2tzIGRlYWRsaW5lX21pbiwKLSAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVUaWNrcyBkZWFkbGluZV9tYXgsCisgIGJvb2wgQ2FsbFJlbmRlcihiYXNlOjpUaW1lVGlja3MgZGVhZGxpbmVfbWluLCBiYXNlOjpUaW1lVGlja3MgZGVhZGxpbmVfbWF4LAogICAgICAgICAgICAgICAgICAgYm9vbCBiYWNrZ3JvdW5kX3JlbmRlcmluZyk7CiAKICAgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiBjb21wb3NpdG9yX3Rhc2tfcnVubmVyXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2F0Y2hfdGltZV9yZXBvcnRlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93YXRjaF90aW1lX3JlcG9ydGVyLmgKaW5kZXggMWIzMjU0ZS4uOTAxOWJiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93YXRjaF90aW1lX3JlcG9ydGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93YXRjaF90aW1lX3JlcG9ydGVyLmgKQEAgLTU3LDExICs1Nyw4IEBACiAgIC8vIHN1c3BlbmQgYW5kIHJlc3VtZS4KICAgLy8gVE9ETyhkYWxlY3VydGlzKTogU2hvdWxkIHdlIG9ubHkgcmVwb3J0IHdoZW4gcmF0ZSA9PSAxLjA/IFNob3VsZCB3ZSBzY2FsZQogICAvLyB0aGUgZWxhcHNlZCBtZWRpYSB0aW1lIGluc3RlYWQ/Ci0gIFdhdGNoVGltZVJlcG9ydGVyKGJvb2wgaGFzX2F1ZGlvLAotICAgICAgICAgICAgICAgICAgICBib29sIGhhc192aWRlbywKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19tc2UsCi0gICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkLAotICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiBtZWRpYV9sb2csCisgIFdhdGNoVGltZVJlcG9ydGVyKGJvb2wgaGFzX2F1ZGlvLCBib29sIGhhc192aWRlbywgYm9vbCBpc19tc2UsCisgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfZW5jcnlwdGVkLCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiBtZWRpYV9sb2csCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGdmeDo6U2l6ZSYgaW5pdGlhbF92aWRlb19zaXplLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBHZXRNZWRpYVRpbWVDQiYgZ2V0X21lZGlhX3RpbWVfY2IpOwogICB+V2F0Y2hUaW1lUmVwb3J0ZXIoKSBPVkVSUklERTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2ViYXVkaW9zb3VyY2Vwcm92aWRlcl9pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYmF1ZGlvc291cmNlcHJvdmlkZXJfaW1wbC5oCmluZGV4IDNjZTUyYzguLmY3ODYzYTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2ViYXVkaW9zb3VyY2Vwcm92aWRlcl9pbXBsLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJhdWRpb3NvdXJjZXByb3ZpZGVyX2ltcGwuaApAQCAtNDMsOSArNDMsOCBAQAogICAgIDogTk9OX0VYUE9SVEVEX0JBU0UocHVibGljIGJsaW5rOjpXZWJBdWRpb1NvdXJjZVByb3ZpZGVyKSwKICAgICAgIE5PTl9FWFBPUlRFRF9CQVNFKHB1YmxpYyBTd2l0Y2hhYmxlQXVkaW9SZW5kZXJlclNpbmspIHsKICBwdWJsaWM6Ci0gIHVzaW5nIENvcHlBdWRpb0NCID0gYmFzZTo6Q2FsbGJhY2s8dm9pZChzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9CdXM+LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZnJhbWVzX2RlbGF5ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2FtcGxlX3JhdGUpPjsKKyAgdXNpbmcgQ29weUF1ZGlvQ0IgPSBiYXNlOjpDYWxsYmFjazx2b2lkKAorICAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvQnVzPiwgdWludDMyX3QgZnJhbWVzX2RlbGF5ZWQsIGludCBzYW1wbGVfcmF0ZSk+OwogCiAgIGV4cGxpY2l0IFdlYkF1ZGlvU291cmNlUHJvdmlkZXJJbXBsKAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTd2l0Y2hhYmxlQXVkaW9SZW5kZXJlclNpbms+JiBzaW5rKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2ViY29udGVudGRlY3J5cHRpb25tb2R1bGVfaW1wbC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJjb250ZW50ZGVjcnlwdGlvbm1vZHVsZV9pbXBsLmgKaW5kZXggYmI3Y2NhZC4uNjY5MjI2NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJjb250ZW50ZGVjcnlwdGlvbm1vZHVsZV9pbXBsLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJjb250ZW50ZGVjcnlwdGlvbm1vZHVsZV9pbXBsLmgKQEAgLTM2LDggKzM2LDcgQEAKICAgICA6IHB1YmxpYyBibGluazo6V2ViQ29udGVudERlY3J5cHRpb25Nb2R1bGUgewogIHB1YmxpYzoKICAgc3RhdGljIHZvaWQgQ3JlYXRlKAotICAgICAgQ2RtRmFjdG9yeSogY2RtX2ZhY3RvcnksCi0gICAgICBjb25zdCBiYXNlOjpzdHJpbmcxNiYga2V5X3N5c3RlbSwKKyAgICAgIENkbUZhY3RvcnkqIGNkbV9mYWN0b3J5LCBjb25zdCBiYXNlOjpzdHJpbmcxNiYga2V5X3N5c3RlbSwKICAgICAgIGNvbnN0IGJsaW5rOjpXZWJTZWN1cml0eU9yaWdpbiYgc2VjdXJpdHlfb3JpZ2luLAogICAgICAgY29uc3QgQ2RtQ29uZmlnJiBjZG1fY29uZmlnLAogICAgICAgc3RkOjp1bmlxdWVfcHRyPGJsaW5rOjpXZWJDb250ZW50RGVjcnlwdGlvbk1vZHVsZVJlc3VsdD4gcmVzdWx0KTsKQEAgLTQ4LDggKzQ3LDcgQEAKICAgYmxpbms6OldlYkNvbnRlbnREZWNyeXB0aW9uTW9kdWxlU2Vzc2lvbiogY3JlYXRlU2Vzc2lvbigpIE9WRVJSSURFOwogCiAgIHZvaWQgc2V0U2VydmVyQ2VydGlmaWNhdGUoCi0gICAgICBjb25zdCB1aW50OF90KiBzZXJ2ZXJfY2VydGlmaWNhdGUsCi0gICAgICBzaXplX3Qgc2VydmVyX2NlcnRpZmljYXRlX2xlbmd0aCwKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNlcnZlcl9jZXJ0aWZpY2F0ZSwgc2l6ZV90IHNlcnZlcl9jZXJ0aWZpY2F0ZV9sZW5ndGgsCiAgICAgICBibGluazo6V2ViQ29udGVudERlY3J5cHRpb25Nb2R1bGVSZXN1bHQgcmVzdWx0KSBPVkVSUklERTsKIAogICAvLyBSZXR1cm5zIGEgcmVmZXJlbmNlIHRvIHRoZSBDRE0gdXNlZCBieSB8YWRhcHRlcl98LgpAQCAtNTksMTAgKzU3LDEyIEBACiAgIGZyaWVuZCBDZG1TZXNzaW9uQWRhcHRlcjsKIAogICAvLyBUYWtlcyByZWZlcmVuY2UgdG8gfGFkYXB0ZXJ8LgotICBXZWJDb250ZW50RGVjcnlwdGlvbk1vZHVsZUltcGwoc2NvcGVkX3JlZnB0cjxDZG1TZXNzaW9uQWRhcHRlcj4gYWRhcHRlcik7CisgIGV4cGxpY2l0IFdlYkNvbnRlbnREZWNyeXB0aW9uTW9kdWxlSW1wbCgKKyAgICAgIHNjb3BlZF9yZWZwdHI8Q2RtU2Vzc2lvbkFkYXB0ZXI+IGFkYXB0ZXIpOwogCiAgIHNjb3BlZF9yZWZwdHI8Q2RtU2Vzc2lvbkFkYXB0ZXI+IGFkYXB0ZXJfOwogCisgcHJpdmF0ZToKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYkNvbnRlbnREZWNyeXB0aW9uTW9kdWxlSW1wbCk7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYmNvbnRlbnRkZWNyeXB0aW9ubW9kdWxlc2Vzc2lvbl9pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYmNvbnRlbnRkZWNyeXB0aW9ubW9kdWxlc2Vzc2lvbl9pbXBsLmgKaW5kZXggNDdmNDY2YS4uZGEyMmVjYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJjb250ZW50ZGVjcnlwdGlvbm1vZHVsZXNlc3Npb25faW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2ViY29udGVudGRlY3J5cHRpb25tb2R1bGVzZXNzaW9uX2ltcGwuaApAQCAtMzksMTQgKzM5LDEyIEBACiAKICAgdm9pZCBpbml0aWFsaXplTmV3U2Vzc2lvbigKICAgICAgIGJsaW5rOjpXZWJFbmNyeXB0ZWRNZWRpYUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSwKLSAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIGluaXREYXRhLAotICAgICAgc2l6ZV90IGluaXREYXRhTGVuZ3RoLAorICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogaW5pdERhdGEsIHNpemVfdCBpbml0RGF0YUxlbmd0aCwKICAgICAgIGJsaW5rOjpXZWJFbmNyeXB0ZWRNZWRpYVNlc3Npb25UeXBlIHNlc3Npb25fdHlwZSwKICAgICAgIGJsaW5rOjpXZWJDb250ZW50RGVjcnlwdGlvbk1vZHVsZVJlc3VsdCByZXN1bHQpIE9WRVJSSURFOwogICB2b2lkIGxvYWQoY29uc3QgYmxpbms6OldlYlN0cmluZyYgc2Vzc2lvbl9pZCwKICAgICAgICAgICAgIGJsaW5rOjpXZWJDb250ZW50RGVjcnlwdGlvbk1vZHVsZVJlc3VsdCByZXN1bHQpIE9WRVJSSURFOwotICB2b2lkIHVwZGF0ZShjb25zdCB1aW50OF90KiByZXNwb25zZSwKLSAgICAgICAgICAgICAgc2l6ZV90IHJlc3BvbnNlX2xlbmd0aCwKKyAgdm9pZCB1cGRhdGUoY29uc3QgdWludDhfdCogcmVzcG9uc2UsIHNpemVfdCByZXNwb25zZV9sZW5ndGgsCiAgICAgICAgICAgICAgIGJsaW5rOjpXZWJDb250ZW50RGVjcnlwdGlvbk1vZHVsZVJlc3VsdCByZXN1bHQpIE9WRVJSSURFOwogICB2b2lkIGNsb3NlKGJsaW5rOjpXZWJDb250ZW50RGVjcnlwdGlvbk1vZHVsZVJlc3VsdCByZXN1bHQpIE9WRVJSSURFOwogICB2b2lkIHJlbW92ZShibGluazo6V2ViQ29udGVudERlY3J5cHRpb25Nb2R1bGVSZXN1bHQgcmVzdWx0KSBPVkVSUklERTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2ViZW5jcnlwdGVkbWVkaWFjbGllbnRfaW1wbC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJlbmNyeXB0ZWRtZWRpYWNsaWVudF9pbXBsLmgKaW5kZXggZjFhYjMyNC4uMTYzYTQ5MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJlbmNyeXB0ZWRtZWRpYWNsaWVudF9pbXBsLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJlbmNyeXB0ZWRtZWRpYWNsaWVudF9pbXBsLmgKQEAgLTM1LDggKzM1LDcgQEAKICBwdWJsaWM6CiAgIFdlYkVuY3J5cHRlZE1lZGlhQ2xpZW50SW1wbCgKICAgICAgIGJhc2U6OkNhbGxiYWNrPGJvb2wodm9pZCk+IGFyZV9zZWN1cmVfY29kZWNzX3N1cHBvcnRlZF9jYiwKLSAgICAgIENkbUZhY3RvcnkqIGNkbV9mYWN0b3J5LAotICAgICAgTWVkaWFQZXJtaXNzaW9uKiBtZWRpYV9wZXJtaXNzaW9uKTsKKyAgICAgIENkbUZhY3RvcnkqIGNkbV9mYWN0b3J5LCBNZWRpYVBlcm1pc3Npb24qIG1lZGlhX3Blcm1pc3Npb24pOwogICB+V2ViRW5jcnlwdGVkTWVkaWFDbGllbnRJbXBsKCkgT1ZFUlJJREU7CiAKICAgLy8gV2ViRW5jcnlwdGVkTWVkaWFDbGllbnQgaW1wbGVtZW50YXRpb24uCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYmluYmFuZHRleHR0cmFja19pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYmluYmFuZHRleHR0cmFja19pbXBsLmgKaW5kZXggNTEyNTZlNy4uMzk0YjM1MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJpbmJhbmR0ZXh0dHJhY2tfaW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2ViaW5iYW5kdGV4dHRyYWNrX2ltcGwuaApAQCAtMTMsOCArMTMsNyBAQAogCiBjbGFzcyBXZWJJbmJhbmRUZXh0VHJhY2tJbXBsIDogcHVibGljIGJsaW5rOjpXZWJJbmJhbmRUZXh0VHJhY2sgewogIHB1YmxpYzoKLSAgV2ViSW5iYW5kVGV4dFRyYWNrSW1wbChLaW5kIGtpbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmxpbms6OldlYlN0cmluZyYgbGFiZWwsCisgIFdlYkluYmFuZFRleHRUcmFja0ltcGwoS2luZCBraW5kLCBjb25zdCBibGluazo6V2ViU3RyaW5nJiBsYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibGluazo6V2ViU3RyaW5nJiBsYW5ndWFnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBibGluazo6V2ViU3RyaW5nJiBpZCk7CiAgIH5XZWJJbmJhbmRUZXh0VHJhY2tJbXBsKCkgT1ZFUlJJREU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYm1lZGlhcGxheWVyX2RlbGVnYXRlLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYm1lZGlhcGxheWVyX2RlbGVnYXRlLmgKaW5kZXggZDBmNDgyOS4uMzk1ZjAzNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJtZWRpYXBsYXllcl9kZWxlZ2F0ZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2VibWVkaWFwbGF5ZXJfZGVsZWdhdGUuaApAQCAtNTIsOSArNTIsNyBAQAogICB2aXJ0dWFsIHZvaWQgUmVtb3ZlT2JzZXJ2ZXIoaW50IGRlbGVnYXRlX2lkKSA9IDA7CiAKICAgLy8gVGhlIHNwZWNpZmllZCBwbGF5ZXIgc3RhcnRlZCBwbGF5aW5nIG1lZGlhLgotICB2aXJ0dWFsIHZvaWQgRGlkUGxheShpbnQgZGVsZWdhdGVfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaGFzX3ZpZGVvLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIGhhc19hdWRpbywKKyAgdmlydHVhbCB2b2lkIERpZFBsYXkoaW50IGRlbGVnYXRlX2lkLCBib29sIGhhc192aWRlbywgYm9vbCBoYXNfYXVkaW8sCiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVtb3RlLAogICAgICAgICAgICAgICAgICAgICAgICBtZWRpYTo6TWVkaWFDb250ZW50VHlwZSBtZWRpYV9jb250ZW50X3R5cGUpID0gMDsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJtZWRpYXBsYXllcl9pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYm1lZGlhcGxheWVyX2ltcGwuaAppbmRleCBkNTExNjE1Li5lNmQzYTBjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYm1lZGlhcGxheWVyX2ltcGwuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYm1lZGlhcGxheWVyX2ltcGwuaApAQCAtOTEsMTcgKzkxLDE0IEBACiAgIC8vIENvbnN0cnVjdHMgYSBXZWJNZWRpYVBsYXllciBpbXBsZW1lbnRhdGlvbiB1c2luZyBDaHJvbWl1bSdzIG1lZGlhIHN0YWNrLgogICAvLyB8ZGVsZWdhdGV8IG1heSBiZSBudWxsLiB8cmVuZGVyZXJfZmFjdG9yeXwgbXVzdCBub3QgYmUgbnVsbC4KICAgV2ViTWVkaWFQbGF5ZXJJbXBsKAotICAgICAgYmxpbms6OldlYkxvY2FsRnJhbWUqIGZyYW1lLAotICAgICAgYmxpbms6OldlYk1lZGlhUGxheWVyQ2xpZW50KiBjbGllbnQsCisgICAgICBibGluazo6V2ViTG9jYWxGcmFtZSogZnJhbWUsIGJsaW5rOjpXZWJNZWRpYVBsYXllckNsaWVudCogY2xpZW50LAogICAgICAgYmxpbms6OldlYk1lZGlhUGxheWVyRW5jcnlwdGVkTWVkaWFDbGllbnQqIGVuY3J5cHRlZF9jbGllbnQsCiAgICAgICBiYXNlOjpXZWFrUHRyPFdlYk1lZGlhUGxheWVyRGVsZWdhdGU+IGRlbGVnYXRlLAogICAgICAgc3RkOjp1bmlxdWVfcHRyPFJlbmRlcmVyRmFjdG9yeT4gcmVuZGVyZXJfZmFjdG9yeSwKLSAgICAgIGxpbmtlZF9wdHI8VXJsSW5kZXg+IHVybF9pbmRleCwKLSAgICAgIGNvbnN0IFdlYk1lZGlhUGxheWVyUGFyYW1zJiBwYXJhbXMpOworICAgICAgbGlua2VkX3B0cjxVcmxJbmRleD4gdXJsX2luZGV4LCBjb25zdCBXZWJNZWRpYVBsYXllclBhcmFtcyYgcGFyYW1zKTsKICAgfldlYk1lZGlhUGxheWVySW1wbCgpIE9WRVJSSURFOwogCi0gIHZvaWQgbG9hZChMb2FkVHlwZSBsb2FkX3R5cGUsCi0gICAgICAgICAgICBjb25zdCBibGluazo6V2ViTWVkaWFQbGF5ZXJTb3VyY2UmIHNvdXJjZSwKKyAgdm9pZCBsb2FkKExvYWRUeXBlIGxvYWRfdHlwZSwgY29uc3QgYmxpbms6OldlYk1lZGlhUGxheWVyU291cmNlJiBzb3VyY2UsCiAgICAgICAgICAgICBDT1JTTW9kZSBjb3JzX21vZGUpIE9WRVJSSURFOwogCiAgIC8vIFBsYXliYWNrIGNvbnRyb2xzLgpAQCAtMTIzLDggKzEyMCw3IEBACiAgIC8vIHBhaW50KCkgdGhlIGN1cnJlbnQgdmlkZW8gZnJhbWUgaW50byB8Y2FudmFzfC4gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQKICAgLy8gdmFyaW91cyBBUElzIGFuZCBmdW5jdGlvbmFsaXRpZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG86IDxjYW52YXM+LAogICAvLyBXZWJHTCB0ZXhJbWFnZTJELCBJbWFnZUJpdG1hcCwgcHJpbnRpbmcgYW5kIGNhcHR1cmluZyBjYXBhYmlsaXRpZXMuCi0gIHZvaWQgcGFpbnQoYmxpbms6OldlYkNhbnZhcyogY2FudmFzLAotICAgICAgICAgICAgIGNvbnN0IGJsaW5rOjpXZWJSZWN0JiByZWN0LAorICB2b2lkIHBhaW50KGJsaW5rOjpXZWJDYW52YXMqIGNhbnZhcywgY29uc3QgYmxpbms6OldlYlJlY3QmIHJlY3QsCiAgICAgICAgICAgICAgU2tQYWludCYgcGFpbnQpIE9WRVJSSURFOwogCiAgIC8vIFRydWUgaWYgdGhlIGxvYWRlZCBtZWRpYSBoYXMgYSBwbGF5YWJsZSB2aWRlby9hdWRpbyB0cmFjay4KQEAgLTI2MCw5ICsyNTYsNyBAQAogCiAgIC8vIENhbGxlZCBhZnRlciB8ZGVmZXJfbG9hZF9jYl98IGhhcyBkZWNpZGVkIHRvIGFsbG93IHRoZSBsb2FkLiBJZgogICAvLyB8ZGVmZXJfbG9hZF9jYl98IGlzIG51bGwgdGhpcyBpcyBjYWxsZWQgaW1tZWRpYXRlbHkuCi0gIHZvaWQgRG9Mb2FkKExvYWRUeXBlIGxvYWRfdHlwZSwKLSAgICAgICAgICAgICAgY29uc3QgYmxpbms6OldlYlVSTCYgdXJsLAotICAgICAgICAgICAgICBDT1JTTW9kZSBjb3JzX21vZGUpOworICB2b2lkIERvTG9hZChMb2FkVHlwZSBsb2FkX3R5cGUsIGNvbnN0IGJsaW5rOjpXZWJVUkwmIHVybCwgQ09SU01vZGUgY29yc19tb2RlKTsKIAogICAvLyBDYWxsZWQgYWZ0ZXIgYXN5bmNocm9ub3VzIGluaXRpYWxpemF0aW9uIG9mIGEgZGF0YSBzb3VyY2UgY29tcGxldGVkLgogICB2b2lkIERhdGFTb3VyY2VJbml0aWFsaXplZChib29sIHN1Y2Nlc3MpOwpAQCAtMzMyLDggKzMyNiw3IEBACiAgIHZvaWQgVXBkYXRlUGxheVN0YXRlKCk7CiAKICAgLy8gTWV0aG9kcyBpbnRlcm5hbCB0byBVcGRhdGVQbGF5U3RhdGUoKS4KLSAgUGxheVN0YXRlIFVwZGF0ZVBsYXlTdGF0ZV9Db21wdXRlUGxheVN0YXRlKGJvb2wgaXNfcmVtb3RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19zdXNwZW5kZWQsCisgIFBsYXlTdGF0ZSBVcGRhdGVQbGF5U3RhdGVfQ29tcHV0ZVBsYXlTdGF0ZShib29sIGlzX3JlbW90ZSwgYm9vbCBpc19zdXNwZW5kZWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2JhY2tncm91bmRlZCk7CiAgIHZvaWQgU2V0RGVsZWdhdGVTdGF0ZShEZWxlZ2F0ZVN0YXRlIG5ld19zdGF0ZSk7CiAgIHZvaWQgU2V0TWVtb3J5UmVwb3J0aW5nU3RhdGUoYm9vbCBpc19tZW1vcnlfcmVwb3J0aW5nX2VuYWJsZWQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJtZWRpYXBsYXllcl9wYXJhbXMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2VibWVkaWFwbGF5ZXJfcGFyYW1zLmgKaW5kZXggNTM4MmQ5MS4uOTM3NjI2ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJtZWRpYXBsYXllcl9wYXJhbXMuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYm1lZGlhcGxheWVyX3BhcmFtcy5oCkBAIC02Niw5ICs2Niw3IEBACiAgICAgcmV0dXJuIGF1ZGlvX3JlbmRlcmVyX3NpbmtfOwogICB9CiAKLSAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZygpIGNvbnN0IHsKLSAgICByZXR1cm4gbWVkaWFfbG9nXzsKLSAgfQorICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nKCkgY29uc3QgeyByZXR1cm4gbWVkaWFfbG9nXzsgfQogCiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4mIG1lZGlhX3Rhc2tfcnVubmVyKCkgY29uc3QgewogICAgIHJldHVybiBtZWRpYV90YXNrX3J1bm5lcl87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYm1lZGlhcGxheWVyX3V0aWwuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2VibWVkaWFwbGF5ZXJfdXRpbC5oCmluZGV4IDJhYmE2MDYuLjIwYTQ0ODkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2VibWVkaWFwbGF5ZXJfdXRpbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2VibWVkaWFwbGF5ZXJfdXRpbC5oCkBAIC0yOCwxNSArMjgsMTMgQEAKIAogLy8gUmVwb3J0IHZhcmlvdXMgbWV0cmljcyB0byBVTUEgYW5kIFJBUFBPUi4KIHZvaWQgTUVESUFfQkxJTktfRVhQT1JUCi1SZXBvcnRNZXRyaWNzKGJsaW5rOjpXZWJNZWRpYVBsYXllcjo6TG9hZFR5cGUgbG9hZF90eXBlLAotICAgICAgICAgICAgICBjb25zdCBHVVJMJiB1cmwsCitSZXBvcnRNZXRyaWNzKGJsaW5rOjpXZWJNZWRpYVBsYXllcjo6TG9hZFR5cGUgbG9hZF90eXBlLCBjb25zdCBHVVJMJiB1cmwsCiAgICAgICAgICAgICAgIGNvbnN0IGJsaW5rOjpXZWJTZWN1cml0eU9yaWdpbiYgc2VjdXJpdHlfb3JpZ2luKTsKIAogLy8gUmVwb3J0IG1ldHJpY3MgYWJvdXQgcGlwZWxpbmUgZXJyb3JzLgotdm9pZCBNRURJQV9CTElOS19FWFBPUlQKLVJlcG9ydFBpcGVsaW5lRXJyb3IoYmxpbms6OldlYk1lZGlhUGxheWVyOjpMb2FkVHlwZSBsb2FkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGJsaW5rOjpXZWJTZWN1cml0eU9yaWdpbiYgc2VjdXJpdHlfb3JpZ2luLAotICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyBlcnJvcik7Cit2b2lkIE1FRElBX0JMSU5LX0VYUE9SVCBSZXBvcnRQaXBlbGluZUVycm9yKAorICAgIGJsaW5rOjpXZWJNZWRpYVBsYXllcjo6TG9hZFR5cGUgbG9hZF90eXBlLAorICAgIGNvbnN0IGJsaW5rOjpXZWJTZWN1cml0eU9yaWdpbiYgc2VjdXJpdHlfb3JpZ2luLCBQaXBlbGluZVN0YXR1cyBlcnJvcik7CiAKIC8vIFJlY29yZCBhIFJBUFBPUiBtZXRyaWMgZm9yIHRoZSBvcmlnaW4gb2YgYW4gSExTIHBsYXliYWNrLgogdm9pZCBNRURJQV9CTElOS19FWFBPUlQgUmVjb3JkT3JpZ2luT2ZITFNQbGF5YmFjayhjb25zdCBHVVJMJiBvcmlnaW5fdXJsKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2Vic291cmNlYnVmZmVyX2ltcGwuaCBiL3NyYy9jb2JhbHQvbWVkaWEvYmxpbmsvd2Vic291cmNlYnVmZmVyX2ltcGwuaAppbmRleCBhMmQ4ZTY3Li5iMWQyNGFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2JsaW5rL3dlYnNvdXJjZWJ1ZmZlcl9pbXBsLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9ibGluay93ZWJzb3VyY2VidWZmZXJfaW1wbC5oCkBAIC0zMSw4ICszMSw3IEBACiAgIGRvdWJsZSBoaWdoZXN0UHJlc2VudGF0aW9uVGltZXN0YW1wKCkgT1ZFUlJJREU7CiAgIGJvb2wgZXZpY3RDb2RlZEZyYW1lcyhkb3VibGUgY3VycmVudFBsYXliYWNrVGltZSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuZXdEYXRhU2l6ZSkgT1ZFUlJJREU7Ci0gIGJvb2wgYXBwZW5kKGNvbnN0IHVuc2lnbmVkIGNoYXIqIGRhdGEsCi0gICAgICAgICAgICAgIHVuc2lnbmVkIGxlbmd0aCwKKyAgYm9vbCBhcHBlbmQoY29uc3QgdW5zaWduZWQgY2hhciogZGF0YSwgdW5zaWduZWQgbGVuZ3RoLAogICAgICAgICAgICAgICBkb3VibGUqIHRpbWVzdGFtcF9vZmZzZXQpIE9WRVJSSURFOwogICB2b2lkIHJlc2V0UGFyc2VyU3RhdGUoKSBPVkVSUklERTsKICAgdm9pZCByZW1vdmUoZG91YmxlIHN0YXJ0LCBkb3VibGUgZW5kKSBPVkVSUklERTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FuX3BsYXlfdHlwZV9oYW5kbGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Nhbl9wbGF5X3R5cGVfaGFuZGxlci5oCmluZGV4IDdmZGYwNjAuLmZlMDgxYTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvY2FuX3BsYXlfdHlwZV9oYW5kbGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYW5fcGxheV90eXBlX2hhbmRsZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01FRElBX0NBTl9QTEFZX1RZUEVfSEFORExFUl9IXwogI2RlZmluZSBDT0JBTFRfTUVESUFfQ0FOX1BMQVlfVFlQRV9IQU5ETEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvY2FzdF9lbnZpcm9ubWVudC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2Nhc3RfZW52aXJvbm1lbnQuaAppbmRleCBmZjAwMGM1Li5iZDEyYzhiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvY2FzdF9lbnZpcm9ubWVudC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9jYXN0X2Vudmlyb25tZW50LmgKQEAgLTQyLDE0ICs0MiwxMiBAQAogICAvLyBUaGV5IHJldHVybiB0cnVlIGlmZiB0aGUgdGhyZWFkIGV4aXN0ZWQgYW5kIHRoZSB0YXNrIHdhcyBwb3N0ZWQuICBOb3RlIHRoYXQKICAgLy8gZXZlbiBpZiB0aGUgdGFzayBpcyBwb3N0ZWQsIHRoZXJlJ3Mgbm8gZ3VhcmFudGVlIHRoYXQgaXQgd2lsbCBydW4sIHNpbmNlCiAgIC8vIHRoZSB0YXJnZXQgdGhyZWFkIG1heSBhbHJlYWR5IGhhdmUgYSBRdWl0IG1lc3NhZ2UgaW4gaXRzIHF1ZXVlLgotICBib29sIFBvc3RUYXNrKFRocmVhZElkIGlkZW50aWZpZXIsCi0gICAgICAgICAgICAgICAgY29uc3QgdHJhY2tlZF9vYmplY3RzOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAorICBib29sIFBvc3RUYXNrKFRocmVhZElkIGlkZW50aWZpZXIsIGNvbnN0IHRyYWNrZWRfb2JqZWN0czo6TG9jYXRpb24mIGZyb21faGVyZSwKICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB0YXNrKTsKIAogICBib29sIFBvc3REZWxheWVkVGFzayhUaHJlYWRJZCBpZGVudGlmaWVyLAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB0cmFja2VkX29iamVjdHM6OkxvY2F0aW9uJiBmcm9tX2hlcmUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHRhc2ssCi0gICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBkZWxheSk7CisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHRhc2ssIGJhc2U6OlRpbWVEZWx0YSBkZWxheSk7CiAKICAgYm9vbCBDdXJyZW50bHlPbihUaHJlYWRJZCBpZGVudGlmaWVyKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2Nhc3RfcmVjZWl2ZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9jYXN0X3JlY2VpdmVyLmgKaW5kZXggNTMwMzkwZC4uZmNkOTVjMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2Nhc3RfcmVjZWl2ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvY2FzdF9yZWNlaXZlci5oCkBAIC0zMSw4ICszMSw3IEBACiAvLyBpcyBub3QgYXZhaWxhYmxlIChlLmcuLCBiYWQvbWlzc2luZyBwYWNrZXQpLgogdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyYgcGxheW91dF90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY29udGludW91cyk+Ci0gICAgQXVkaW9GcmFtZURlY29kZWRDYWxsYmFjazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbnRpbnVvdXMpPiBBdWRpb0ZyYW1lRGVjb2RlZENhbGxiYWNrOwogLy8gVE9ETyhtaXUpOiB8dmlkZW9fZnJhbWV8IGluY2x1ZGVzIGEgdGltZXN0YW1wLCBzbyB1c2UgdGhhdCBpbnN0ZWFkLgogdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHNjb3BlZF9yZWZwdHI8bWVkaWE6OlZpZGVvRnJhbWU+JiB2aWRlb19mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lVGlja3MmIHBsYXlvdXRfdGltZSwKQEAgLTUwLDggKzQ5LDcgQEAKICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxDYXN0UmVjZWl2ZXI+IENyZWF0ZSgKICAgICAgIHNjb3BlZF9yZWZwdHI8Q2FzdEVudmlyb25tZW50PiBjYXN0X2Vudmlyb25tZW50LAogICAgICAgY29uc3QgRnJhbWVSZWNlaXZlckNvbmZpZyYgYXVkaW9fY29uZmlnLAotICAgICAgY29uc3QgRnJhbWVSZWNlaXZlckNvbmZpZyYgdmlkZW9fY29uZmlnLAotICAgICAgQ2FzdFRyYW5zcG9ydCogY29uc3QgdHJhbnNwb3J0KTsKKyAgICAgIGNvbnN0IEZyYW1lUmVjZWl2ZXJDb25maWcmIHZpZGVvX2NvbmZpZywgQ2FzdFRyYW5zcG9ydCogY29uc3QgdHJhbnNwb3J0KTsKIAogICAvLyBBbGwgcmVjZWl2ZWQgUlRQIGFuZCBSVENQIHBhY2tldHMgZm9yIHRoZSBjYWxsIHNob3VsZCBiZSBzZW50IHRvIHRoaXMKICAgLy8gUGFja2V0UmVjZWl2ZXIuICBDYW4gYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9jb21tb24vZXhwYW5kZWRfdmFsdWVfYmFzZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi9leHBhbmRlZF92YWx1ZV9iYXNlLmgKaW5kZXggN2M2NDMzYi4uODg4YjM1NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi9leHBhbmRlZF92YWx1ZV9iYXNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi9leHBhbmRlZF92YWx1ZV9iYXNlLmgKQEAgLTgyLDggKzgyLDcgQEAKICAgICAgIC8vIElmIHRoZSB8cmVzdWx0fCBpcyBsYXJnZXIgdGhhbiB8dmFsdWVffCwgZGVjcmVtZW50IHRoZSB1cHBlciBiaXRzIGJ5CiAgICAgICAvLyBvbmUuICBJbiBvdGhlciB3b3JkcywgfHh8IG11c3QgYWx3YXlzIGJlIGludGVycHJldGVkIGFzIGEgdHJ1bmNhdGVkCiAgICAgICAvLyB2ZXJzaW9uIG9mIGEgdmFsdWUgbGVzcyB0aGFuIG9yIGVxdWFsIHRvIHx2YWx1ZV98LgotICAgICAgaWYgKHJlc3VsdCA+IHZhbHVlXykKLSAgICAgICAgcmVzdWx0IC09IHNob3J0X21heCArIDE7CisgICAgICBpZiAocmVzdWx0ID4gdmFsdWVfKSByZXN1bHQgLT0gc2hvcnRfbWF4ICsgMTsKIAogICAgICAgcmV0dXJuIFN1YmNsYXNzKHJlc3VsdCk7CiAgICAgfSBlbHNlIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9jb21tb24vbW9kX3V0aWwuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9jb21tb24vbW9kX3V0aWwuaAppbmRleCBhNzA0NTc5Li5lODc4MmRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvY29tbW9uL21vZF91dGlsLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi9tb2RfdXRpbC5oCkBAIC0xNCw3ICsxNCw3IEBACiAvLyBNQVAgaXMgYSBtYXA8dWludD8/LCAuLi4+IHdoZXJlIHRoZSB1bnNpZ25lZCBpbnRlZ2VyIGlzCiAvLyBhc3N1bWVkIHRvIHdyYXAgYXJvdW5kLCBidXQgb25seSBhIHNtYWxsIHJhbmdlIGlzIHVzZWQgYXQgYSB0aW1lLgogLy8gUmV0dXJuIHRoZSBvbGRlc3QgZW50cnkgaW4gdGhlIG1hcC4KLXRlbXBsYXRlPGNsYXNzIE1BUD4KK3RlbXBsYXRlIDxjbGFzcyBNQVA+CiB0eXBlbmFtZSBNQVA6Oml0ZXJhdG9yIE1vZE1hcE9sZGVzdChNQVAqIG1hcCkgewogICB0eXBlbmFtZSBNQVA6Oml0ZXJhdG9yIHJldCA9IG1hcC0+YmVnaW4oKTsKICAgaWYgKHJldCAhPSBtYXAtPmVuZCgpKSB7CkBAIC0yMyw4ICsyMyw3IEBACiAgICAgbG93ZXJfcXVhcnRlciA+Pj0gMTsKICAgICBpZiAocmV0LT5maXJzdCA8IGxvd2VyX3F1YXJ0ZXIpIHsKICAgICAgIHR5cGVuYW1lIE1BUDo6aXRlcmF0b3IgdG1wID0gbWFwLT51cHBlcl9ib3VuZChsb3dlcl9xdWFydGVyICogMyk7Ci0gICAgICBpZiAodG1wICE9IG1hcC0+ZW5kKCkpCi0gICAgICAgIHJldCA9IHRtcDsKKyAgICAgIGlmICh0bXAgIT0gbWFwLT5lbmQoKSkgcmV0ID0gdG1wOwogICAgIH0KICAgfQogICByZXR1cm4gcmV0OwpAQCAtMzMsNyArMzIsNyBAQAogLy8gTUFQIGlzIGEgbWFwPHVpbnQ/PywgLi4uPiB3aGVyZSB0aGUgdW5zaWduZWQgaW50ZWdlciBpcwogLy8gYXNzdW1lZCB0byB3cmFwIGFyb3VuZCwgYnV0IG9ubHkgYSBzbWFsbCByYW5nZSBpcyB1c2VkIGF0IGEgdGltZS4KIC8vIFJldHVybnMgdGhlIHByZXZpb3VzIGVudHJ5IGluIHRoZSBtYXAuCi10ZW1wbGF0ZTxjbGFzcyBNQVA+Cit0ZW1wbGF0ZSA8Y2xhc3MgTUFQPgogdHlwZW5hbWUgTUFQOjppdGVyYXRvciBNb2RNYXBQcmV2aW91cyhNQVAqIG1hcCwgdHlwZW5hbWUgTUFQOjppdGVyYXRvciBpKSB7CiAgIERDSEVDSyghbWFwLT5lbXB0eSgpKTsKICAgdHlwZW5hbWUgTUFQOjppdGVyYXRvciByZXQgPSBpOwpAQCAtNDEsOCArNDAsNyBAQAogICAgIHJldCA9IG1hcC0+ZW5kKCk7CiAgIH0KICAgcmV0LS07Ci0gIGlmIChpID09IHJldCkKLSAgICByZXR1cm4gbWFwLT5lbmQoKTsKKyAgaWYgKGkgPT0gcmV0KSByZXR1cm4gbWFwLT5lbmQoKTsKICAgaWYgKChpLT5maXJzdCAtIHJldC0+Zmlyc3QpID4gKCh0eXBlbmFtZSBNQVA6OmtleV90eXBlKDApIC0gMSkpID4+IDEpCiAgICAgcmV0dXJuIG1hcC0+ZW5kKCk7CiAgIHJldHVybiByZXQ7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvY29tbW9uL3J0cF90aW1lLmggYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvY29tbW9uL3J0cF90aW1lLmgKaW5kZXggMWFmZGJkMi4uZjczZjhmZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi9ydHBfdGltZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9jb21tb24vcnRwX3RpbWUuaApAQCAtOTIsOSArOTIsMTMgQEAKICAgICByZXR1cm4gUnRwVGltZURlbHRhKHZhbHVlXyAvIHJocyk7CiAgIH0KICAgdGVtcGxhdGUgPHR5cGVuYW1lIEludFR5cGU+Ci0gIFJ0cFRpbWVEZWx0YSYgb3BlcmF0b3IqPShJbnRUeXBlIHJocykgeyByZXR1cm4gKCp0aGlzID0gKCp0aGlzICogcmhzKSk7IH0KKyAgUnRwVGltZURlbHRhJiBvcGVyYXRvcio9KEludFR5cGUgcmhzKSB7CisgICAgcmV0dXJuICgqdGhpcyA9ICgqdGhpcyAqIHJocykpOworICB9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBJbnRUeXBlPgotICBSdHBUaW1lRGVsdGEmIG9wZXJhdG9yLz0oSW50VHlwZSByaHMpIHsgcmV0dXJuICgqdGhpcyA9ICgqdGhpcyAvIHJocykpOyB9CisgIFJ0cFRpbWVEZWx0YSYgb3BlcmF0b3IvPShJbnRUeXBlIHJocykgeworICAgIHJldHVybiAoKnRoaXMgPSAoKnRoaXMgLyByaHMpKTsKKyAgfQogCiAgIC8vIE1hcHMgdGhpcyBSdHBUaW1lRGVsdGEgdG8gYW4gYXBwcm94aW1hdGUgVGltZURlbHRhIHVzaW5nIHRoZSBnaXZlbgogICAvLyBSVFAgdGltZWJhc2UuICBBc3N1bWVzIGEgemVyby12YWx1ZWQgVGltZURlbHRhIGNvcnJlc3BvbmRzIHRvIGEgemVyby12YWx1ZWQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9jb21tb24vdHJhbnNwb3J0X2VuY3J5cHRpb25faGFuZGxlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi90cmFuc3BvcnRfZW5jcnlwdGlvbl9oYW5kbGVyLmgKaW5kZXggYjhmZGYzMy4uZjE2NDk5MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi90cmFuc3BvcnRfZW5jcnlwdGlvbl9oYW5kbGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L2NvbW1vbi90cmFuc3BvcnRfZW5jcnlwdGlvbl9oYW5kbGVyLmgKQEAgLTMyLDEyICszMiwxMCBAQAogCiAgIGJvb2wgSW5pdGlhbGl6ZShjb25zdCBzdGQ6OnN0cmluZyYgYWVzX2tleSwgY29uc3Qgc3RkOjpzdHJpbmcmIGFlc19pdl9tYXNrKTsKIAotICBib29sIEVuY3J5cHQoRnJhbWVJZCBmcmFtZV9pZCwKLSAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlJiBkYXRhLAorICBib29sIEVuY3J5cHQoRnJhbWVJZCBmcmFtZV9pZCwgY29uc3QgYmFzZTo6U3RyaW5nUGllY2UmIGRhdGEsCiAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZW5jcnlwdGVkX2RhdGEpOwogCi0gIGJvb2wgRGVjcnlwdChGcmFtZUlkIGZyYW1lX2lkLAotICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6U3RyaW5nUGllY2UmIGNpcGhlcnRleHQsCisgIGJvb2wgRGVjcnlwdChGcmFtZUlkIGZyYW1lX2lkLCBjb25zdCBiYXNlOjpTdHJpbmdQaWVjZSYgY2lwaGVydGV4dCwKICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBwbGFpbnRleHQpOwogCiAgIGJvb2wgaXNfYWN0aXZhdGVkKCkgY29uc3QgeyByZXR1cm4gaXNfYWN0aXZhdGVkXzsgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3JlY2VpdmVyL2F1ZGlvX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9yZWNlaXZlci9hdWRpb19kZWNvZGVyLmgKaW5kZXggZTBkOGRlNC4uM2EwYmU4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3JlY2VpdmVyL2F1ZGlvX2RlY29kZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvcmVjZWl2ZXIvYXVkaW9fZGVjb2Rlci5oCkBAIC0yNSwxMyArMjUsMTAgQEAKICAgLy8gb3BlcmF0aW9uOyBhbmQgdGhlIGNsaWVudCBzaG91bGQgdGFrZSBzdGVwcyB0byBzbW9vdGggYXVkaW8gZGlzY29udGludWl0aWVzCiAgIC8vIGluIHRoaXMgY2FzZS4KICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHN0ZDo6dW5pcXVlX3B0cjxBdWRpb0J1cz4gYXVkaW9fYnVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19jb250aW51b3VzKT4KLSAgICAgIERlY29kZUZyYW1lQ2FsbGJhY2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbnRpbnVvdXMpPiBEZWNvZGVGcmFtZUNhbGxiYWNrOwogCiAgIEF1ZGlvRGVjb2Rlcihjb25zdCBzY29wZWRfcmVmcHRyPENhc3RFbnZpcm9ubWVudD4mIGNhc3RfZW52aXJvbm1lbnQsCi0gICAgICAgICAgICAgICBpbnQgY2hhbm5lbHMsCi0gICAgICAgICAgICAgICBpbnQgc2FtcGxpbmdfcmF0ZSwKLSAgICAgICAgICAgICAgIENvZGVjIGNvZGVjKTsKKyAgICAgICAgICAgICAgIGludCBjaGFubmVscywgaW50IHNhbXBsaW5nX3JhdGUsIENvZGVjIGNvZGVjKTsKICAgdmlydHVhbCB+QXVkaW9EZWNvZGVyKCk7CiAKICAgLy8gUmV0dXJucyBTVEFUVVNfSU5JVElBTElaRUQgaWYgdGhlIGRlY29kZXIgd2FzIHN1Y2Nlc3NmdWxseSBjb25zdHJ1Y3RlZC4gIElmCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvcmVjZWl2ZXIvY2FzdF9yZWNlaXZlcl9pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvcmVjZWl2ZXIvY2FzdF9yZWNlaXZlcl9pbXBsLmgKaW5kZXggZDgyMjhjZS4uMGJiMmYzYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3JlY2VpdmVyL2Nhc3RfcmVjZWl2ZXJfaW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9yZWNlaXZlci9jYXN0X3JlY2VpdmVyX2ltcGwuaApAQCAtNjQsMTIgKzY0LDkgQEAKICAgLy8gQXVkaW9EZWNvZGVyOjpEZWNvZGVGcmFtZSgpLgogICBzdGF0aWMgdm9pZCBFbWl0RGVjb2RlZEF1ZGlvRnJhbWUoCiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPENhc3RFbnZpcm9ubWVudD4mIGNhc3RfZW52aXJvbm1lbnQsCi0gICAgICBjb25zdCBBdWRpb0ZyYW1lRGVjb2RlZENhbGxiYWNrJiBjYWxsYmFjaywKLSAgICAgIEZyYW1lSWQgZnJhbWVfaWQsCi0gICAgICBSdHBUaW1lVGlja3MgcnRwX3RpbWVzdGFtcCwKLSAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyYgcGxheW91dF90aW1lLAotICAgICAgc3RkOjp1bmlxdWVfcHRyPEF1ZGlvQnVzPiBhdWRpb19idXMsCi0gICAgICBib29sIGlzX2NvbnRpbnVvdXMpOworICAgICAgY29uc3QgQXVkaW9GcmFtZURlY29kZWRDYWxsYmFjayYgY2FsbGJhY2ssIEZyYW1lSWQgZnJhbWVfaWQsCisgICAgICBSdHBUaW1lVGlja3MgcnRwX3RpbWVzdGFtcCwgY29uc3QgYmFzZTo6VGltZVRpY2tzJiBwbGF5b3V0X3RpbWUsCisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8QXVkaW9CdXM+IGF1ZGlvX2J1cywgYm9vbCBpc19jb250aW51b3VzKTsKIAogICAvLyBSZWNlaXZlcyBhIFZpZGVvRnJhbWUgZnJvbSB8dmlkZW9fZGVjb2Rlcl98LCBsb2dzIHRoZSBldmVudCwgYW5kIHBhc3NlcyB0aGUKICAgLy8gZGF0YSBvbiBieSBydW5uaW5nIHRoZSBnaXZlbiB8Y2FsbGJhY2t8LiAgVGhpcyBtZXRob2QgaXMgc3RhdGljIHRvIGVuc3VyZQpAQCAtNzgsMTIgKzc1LDkgQEAKICAgLy8gVmlkZW9EZWNvZGVyOjpEZWNvZGVGcmFtZSgpLgogICBzdGF0aWMgdm9pZCBFbWl0RGVjb2RlZFZpZGVvRnJhbWUoCiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPENhc3RFbnZpcm9ubWVudD4mIGNhc3RfZW52aXJvbm1lbnQsCi0gICAgICBjb25zdCBWaWRlb0ZyYW1lRGVjb2RlZENhbGxiYWNrJiBjYWxsYmFjaywKLSAgICAgIEZyYW1lSWQgZnJhbWVfaWQsCi0gICAgICBSdHBUaW1lVGlja3MgcnRwX3RpbWVzdGFtcCwKLSAgICAgIGNvbnN0IGJhc2U6OlRpbWVUaWNrcyYgcGxheW91dF90aW1lLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgdmlkZW9fZnJhbWUsCi0gICAgICBib29sIGlzX2NvbnRpbnVvdXMpOworICAgICAgY29uc3QgVmlkZW9GcmFtZURlY29kZWRDYWxsYmFjayYgY2FsbGJhY2ssIEZyYW1lSWQgZnJhbWVfaWQsCisgICAgICBSdHBUaW1lVGlja3MgcnRwX3RpbWVzdGFtcCwgY29uc3QgYmFzZTo6VGltZVRpY2tzJiBwbGF5b3V0X3RpbWUsCisgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiB2aWRlb19mcmFtZSwgYm9vbCBpc19jb250aW51b3VzKTsKIAogICBjb25zdCBzY29wZWRfcmVmcHRyPENhc3RFbnZpcm9ubWVudD4gY2FzdF9lbnZpcm9ubWVudF87CiAgIEZyYW1lUmVjZWl2ZXIgYXVkaW9fcmVjZWl2ZXJfOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3JlY2VpdmVyL2ZyYW1lX3JlY2VpdmVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvcmVjZWl2ZXIvZnJhbWVfcmVjZWl2ZXIuaAppbmRleCAzZWVkZmQxLi5hNTYwZTJhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvcmVjZWl2ZXIvZnJhbWVfcmVjZWl2ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvcmVjZWl2ZXIvZnJhbWVfcmVjZWl2ZXIuaApAQCAtNzQsOCArNzQsNyBAQAogICBmcmllbmQgY2xhc3MgRnJhbWVSZWNlaXZlclRlc3Q7ICAvLyBJbnZva2VzIFByb2Nlc3NQYXJzZWRQYWNrZXQoKS4KIAogICB2b2lkIFByb2Nlc3NQYXJzZWRQYWNrZXQoY29uc3QgUnRwQ2FzdEhlYWRlciYgcnRwX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIHBheWxvYWRfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwYXlsb2FkX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogcGF5bG9hZF9kYXRhLCBzaXplX3QgcGF5bG9hZF9zaXplKTsKIAogICAvLyBSdHBQYXlsb2FkRmVlZGJhY2sgaW1wbGVtZW50YXRpb24uCiAgIHZvaWQgQ2FzdEZlZWRiYWNrKGNvbnN0IFJ0Y3BDYXN0TWVzc2FnZSYgY2FzdF9tZXNzYWdlKSBmaW5hbDsKQEAgLTEyMiwxMiArMTIxLDkgQEAKICAgLy8gfGNhc3RfbWVzc2FnZXwuIElmIHxydGNwX2V2ZW50c3wgaXMgcHJvdmlkZWQgdGhlIFJUQ1AgcmVjZWl2ZXIgcmVwb3J0IHdpbGwKICAgLy8gaW5jbHVkZSBldmVudCBsb2cgbWVzc2FnZXMKICAgdm9pZCBTZW5kUnRjcFJlcG9ydCgKLSAgICAgIHVpbnQzMl90IHJ0cF9yZWNlaXZlcl9zc3JjLAotICAgICAgdWludDMyX3QgcnRwX3NlbmRlcl9zc3JjLAotICAgICAgY29uc3QgUnRjcFRpbWVEYXRhJiB0aW1lX2RhdGEsCi0gICAgICBjb25zdCBSdGNwQ2FzdE1lc3NhZ2UqIGNhc3RfbWVzc2FnZSwKLSAgICAgIGNvbnN0IFJ0Y3BQbGlNZXNzYWdlKiBwbGlfbWVzc2FnZSwKLSAgICAgIGJhc2U6OlRpbWVEZWx0YSB0YXJnZXRfZGVsYXksCisgICAgICB1aW50MzJfdCBydHBfcmVjZWl2ZXJfc3NyYywgdWludDMyX3QgcnRwX3NlbmRlcl9zc3JjLAorICAgICAgY29uc3QgUnRjcFRpbWVEYXRhJiB0aW1lX2RhdGEsIGNvbnN0IFJ0Y3BDYXN0TWVzc2FnZSogY2FzdF9tZXNzYWdlLAorICAgICAgY29uc3QgUnRjcFBsaU1lc3NhZ2UqIHBsaV9tZXNzYWdlLCBiYXNlOjpUaW1lRGVsdGEgdGFyZ2V0X2RlbGF5LAogICAgICAgY29uc3QgUmVjZWl2ZXJSdGNwRXZlbnRTdWJzY3JpYmVyOjpSdGNwRXZlbnRzKiBydGNwX2V2ZW50cywKICAgICAgIGNvbnN0IFJ0cFJlY2VpdmVyU3RhdGlzdGljcyogcnRwX3JlY2VpdmVyX3N0YXRpc3RpY3MpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL2F1ZGlvX2VuY29kZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvYXVkaW9fZW5jb2Rlci5oCmluZGV4IDJjOTA2MTQuLjgwYTVmNmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvYXVkaW9fZW5jb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvYXVkaW9fZW5jb2Rlci5oCkBAIC0zMCwxMCArMzAsNyBAQAogICAgICAgYmFzZTo6Q2FsbGJhY2s8dm9pZChzdGQ6OnVuaXF1ZV9wdHI8U2VuZGVyRW5jb2RlZEZyYW1lPiwgaW50KT47CiAKICAgQXVkaW9FbmNvZGVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8Q2FzdEVudmlyb25tZW50PiYgY2FzdF9lbnZpcm9ubWVudCwKLSAgICAgICAgICAgICAgIGludCBudW1fY2hhbm5lbHMsCi0gICAgICAgICAgICAgICBpbnQgc2FtcGxpbmdfcmF0ZSwKLSAgICAgICAgICAgICAgIGludCBiaXRyYXRlLAotICAgICAgICAgICAgICAgQ29kZWMgY29kZWMsCisgICAgICAgICAgICAgICBpbnQgbnVtX2NoYW5uZWxzLCBpbnQgc2FtcGxpbmdfcmF0ZSwgaW50IGJpdHJhdGUsIENvZGVjIGNvZGVjLAogICAgICAgICAgICAgICAgY29uc3QgRnJhbWVFbmNvZGVkQ2FsbGJhY2smIGZyYW1lX2VuY29kZWRfY2FsbGJhY2spOwogICB2aXJ0dWFsIH5BdWRpb0VuY29kZXIoKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9jb25nZXN0aW9uX2NvbnRyb2wuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvY29uZ2VzdGlvbl9jb250cm9sLmgKaW5kZXggM2QyMjYzOC4uZDcyNjE3ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9jb25nZXN0aW9uX2NvbnRyb2wuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL2Nvbmdlc3Rpb25fY29udHJvbC5oCkBAIC0yOSw4ICsyOSw3IEBACiAgIHZpcnR1YWwgdm9pZCBVcGRhdGVUYXJnZXRQbGF5b3V0RGVsYXkoYmFzZTo6VGltZURlbHRhIGRlbGF5KSA9IDA7CiAKICAgLy8gQ2FsbGVkIHdoZW4gYW4gZW5jb2RlZCBmcmFtZSBpcyBlbnF1ZXVlZCBmb3IgdHJhbnNwb3J0LgotICB2aXJ0dWFsIHZvaWQgU2VuZEZyYW1lVG9UcmFuc3BvcnQoRnJhbWVJZCBmcmFtZV9pZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBmcmFtZV9zaXplX2luX2JpdHMsCisgIHZpcnR1YWwgdm9pZCBTZW5kRnJhbWVUb1RyYW5zcG9ydChGcmFtZUlkIGZyYW1lX2lkLCBzaXplX3QgZnJhbWVfc2l6ZV9pbl9iaXRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZVRpY2tzIHdoZW4pID0gMDsKIAogICAvLyBDYWxsZWQgd2hlbiB3ZSByZWNlaXZlIGFuIEFDSyBmb3IgYSBmcmFtZS4KQEAgLTQ2LDExICs0NSwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBwbGF5b3V0X2RlbGF5KSA9IDA7CiB9OwogCi1Db25nZXN0aW9uQ29udHJvbCogTmV3QWRhcHRpdmVDb25nZXN0aW9uQ29udHJvbCgKLSAgICBiYXNlOjpUaWNrQ2xvY2sqIGNsb2NrLAotICAgIGludCBtYXhfYml0cmF0ZV9jb25maWd1cmVkLAotICAgIGludCBtaW5fYml0cmF0ZV9jb25maWd1cmVkLAotICAgIGRvdWJsZSBtYXhfZnJhbWVfcmF0ZSk7CitDb25nZXN0aW9uQ29udHJvbCogTmV3QWRhcHRpdmVDb25nZXN0aW9uQ29udHJvbChiYXNlOjpUaWNrQ2xvY2sqIGNsb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9iaXRyYXRlX2NvbmZpZ3VyZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWluX2JpdHJhdGVfY29uZmlndXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBtYXhfZnJhbWVfcmF0ZSk7CiAKIENvbmdlc3Rpb25Db250cm9sKiBOZXdGaXhlZENvbmdlc3Rpb25Db250cm9sKGludCBiaXRyYXRlKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9leHRlcm5hbF92aWRlb19lbmNvZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL2V4dGVybmFsX3ZpZGVvX2VuY29kZXIuaAppbmRleCAxNDFlZTk1Li4yODE1MmIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL2V4dGVybmFsX3ZpZGVvX2VuY29kZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL2V4dGVybmFsX3ZpZGVvX2VuY29kZXIuaApAQCAtMzIsMTAgKzMyLDggQEAKIAogICBFeHRlcm5hbFZpZGVvRW5jb2RlcigKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8Q2FzdEVudmlyb25tZW50PiYgY2FzdF9lbnZpcm9ubWVudCwKLSAgICAgIGNvbnN0IEZyYW1lU2VuZGVyQ29uZmlnJiB2aWRlb19jb25maWcsCi0gICAgICBjb25zdCBnZng6OlNpemUmIGZyYW1lX3NpemUsCi0gICAgICBGcmFtZUlkIGZpcnN0X2ZyYW1lX2lkLAotICAgICAgY29uc3QgU3RhdHVzQ2hhbmdlQ2FsbGJhY2smIHN0YXR1c19jaGFuZ2VfY2IsCisgICAgICBjb25zdCBGcmFtZVNlbmRlckNvbmZpZyYgdmlkZW9fY29uZmlnLCBjb25zdCBnZng6OlNpemUmIGZyYW1lX3NpemUsCisgICAgICBGcmFtZUlkIGZpcnN0X2ZyYW1lX2lkLCBjb25zdCBTdGF0dXNDaGFuZ2VDYWxsYmFjayYgc3RhdHVzX2NoYW5nZV9jYiwKICAgICAgIGNvbnN0IENyZWF0ZVZpZGVvRW5jb2RlQWNjZWxlcmF0b3JDYWxsYmFjayYgY3JlYXRlX3ZlYV9jYiwKICAgICAgIGNvbnN0IENyZWF0ZVZpZGVvRW5jb2RlTWVtb3J5Q2FsbGJhY2smIGNyZWF0ZV92aWRlb19lbmNvZGVfbWVtb3J5X2NiKTsKIApAQCAtNTYsOCArNTQsNyBAQAogICAvLyBWRUFDbGllbnRJbXBsIHRvIG93biBhbmQgaW50ZXJmYWNlIHdpdGggYSBuZXcgfHZlYXwuICBVcG9uIHJldHVybiwKICAgLy8gfGNsaWVudF98IGhvbGRzIGEgcmVmZXJlbmNlIHRvIHRoZSBuZXcgVkVBQ2xpZW50SW1wbC4KICAgdm9pZCBPbkNyZWF0ZVZpZGVvRW5jb2RlQWNjZWxlcmF0b3IoCi0gICAgICBjb25zdCBGcmFtZVNlbmRlckNvbmZpZyYgdmlkZW9fY29uZmlnLAotICAgICAgRnJhbWVJZCBmaXJzdF9mcmFtZV9pZCwKKyAgICAgIGNvbnN0IEZyYW1lU2VuZGVyQ29uZmlnJiB2aWRlb19jb25maWcsIEZyYW1lSWQgZmlyc3RfZnJhbWVfaWQsCiAgICAgICBjb25zdCBTdGF0dXNDaGFuZ2VDYWxsYmFjayYgc3RhdHVzX2NoYW5nZV9jYiwKICAgICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lcj4gZW5jb2Rlcl90YXNrX3J1bm5lciwKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxtZWRpYTo6VmlkZW9FbmNvZGVBY2NlbGVyYXRvcj4gdmVhKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvZmFrZV92aWRlb19lbmNvZGVfYWNjZWxlcmF0b3JfZmFjdG9yeS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9mYWtlX3ZpZGVvX2VuY29kZV9hY2NlbGVyYXRvcl9mYWN0b3J5LmgKaW5kZXggN2RiMWM0My4uZDdiZTExOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9mYWtlX3ZpZGVvX2VuY29kZV9hY2NlbGVyYXRvcl9mYWN0b3J5LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9mYWtlX3ZpZGVvX2VuY29kZV9hY2NlbGVyYXRvcl9mYWN0b3J5LmgKQEAgLTI4LDEyICsyOCw4IEBACiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+JiB0YXNrX3J1bm5lcik7CiAgIH5GYWtlVmlkZW9FbmNvZGVBY2NlbGVyYXRvckZhY3RvcnkoKTsKIAotICBpbnQgdmVhX3Jlc3BvbnNlX2NvdW50KCkgY29uc3QgewotICAgIHJldHVybiB2ZWFfcmVzcG9uc2VfY291bnRfOwotICB9Ci0gIGludCBzaG1fcmVzcG9uc2VfY291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHNobV9yZXNwb25zZV9jb3VudF87Ci0gIH0KKyAgaW50IHZlYV9yZXNwb25zZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIHZlYV9yZXNwb25zZV9jb3VudF87IH0KKyAgaW50IHNobV9yZXNwb25zZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIHNobV9yZXNwb25zZV9jb3VudF87IH0KIAogICAvLyBUaGVzZSByZXR1cm4gdGhlIGluc3RhbmNlIGxhc3QgcmVzcG9uZGVkLiAgSXQgaXMgdXAgdG8gdGhlIGNhbGxlciB0bwogICAvLyBkZXRlcm1pbmUgd2hldGhlciB0aGUgcG9pbnRlciBpcyBzdGlsbCB2YWxpZCwgc2luY2UgdGhpcyBmYWN0b3J5IGRvZXMgbm90CkBAIC00MSw5ICszNyw3IEBACiAgIG1lZGlhOjpGYWtlVmlkZW9FbmNvZGVBY2NlbGVyYXRvciogbGFzdF9yZXNwb25zZV92ZWEoKSBjb25zdCB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PG1lZGlhOjpGYWtlVmlkZW9FbmNvZGVBY2NlbGVyYXRvcio+KGxhc3RfcmVzcG9uc2VfdmVhXyk7CiAgIH0KLSAgYmFzZTo6U2hhcmVkTWVtb3J5KiBsYXN0X3Jlc3BvbnNlX3NobSgpIGNvbnN0IHsKLSAgICByZXR1cm4gbGFzdF9yZXNwb25zZV9zaG1fOwotICB9CisgIGJhc2U6OlNoYXJlZE1lbW9yeSogbGFzdF9yZXNwb25zZV9zaG0oKSBjb25zdCB7IHJldHVybiBsYXN0X3Jlc3BvbnNlX3NobV87IH0KIAogICAvLyBTZXQgd2hldGhlciB0aGUgbmV4dCBjcmVhdGVkIG1lZGlhOjpGYWtlVmlkZW9FbmNvZGVBY2NlbGVyYXRvciB3aWxsCiAgIC8vIGluaXRpYWxpemUgc3VjY2Vzc2Z1bGx5LgpAQCAtNTksOSArNTMsOCBAQAogCiAgIC8vIENyZWF0ZXMgc2hhcmVkIG1lbW9yeSBvZiB0aGUgcmVxdWVzdGVkIHxzaXplfC4gIElmIGluIGF1dG8tcmVzcG9uZCBtb2RlLAogICAvLyB8Y2FsbGJhY2t8IGlzIHJ1biBzeW5jaHJvbm91c2x5IChpLmUuLCBiZWZvcmUgdGhpcyBtZXRob2QgcmV0dXJucykuCi0gIHZvaWQgQ3JlYXRlU2hhcmVkTWVtb3J5KAotICAgICAgc2l6ZV90IHNpemUsCi0gICAgICBjb25zdCBSZWNlaXZlVmlkZW9FbmNvZGVNZW1vcnlDYWxsYmFjayYgY2FsbGJhY2spOworICB2b2lkIENyZWF0ZVNoYXJlZE1lbW9yeShzaXplX3Qgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVjZWl2ZVZpZGVvRW5jb2RlTWVtb3J5Q2FsbGJhY2smIGNhbGxiYWNrKTsKIAogICAvLyBSdW5zIHRoZSB8Y2FsbGJhY2t8IHByb3ZpZGVkIHRvIHRoZSBsYXN0IGNhbGwgdG8KICAgLy8gQ3JlYXRlVmlkZW9FbmNvZGVBY2NlbGVyYXRvcigpIHdpdGggdGhlIG5ldyBWaWRlb0VuY29kZUFjY2VsZXJhdG9yCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL2gyNjRfdnRfZW5jb2Rlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9oMjY0X3Z0X2VuY29kZXIuaAppbmRleCA5YjViM2I1Li5kMWZmZWMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL2gyNjRfdnRfZW5jb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvaDI2NF92dF9lbmNvZGVyLmgKQEAgLTc3LDEwICs3Nyw4IEBACiAgIHZvaWQgVXBkYXRlRnJhbWVTaXplKGNvbnN0IGdmeDo6U2l6ZSYgc2l6ZV9uZWVkZWQpOwogCiAgIC8vIENvbXByZXNzaW9uIHNlc3Npb24gY2FsbGJhY2sgZnVuY3Rpb24gdG8gaGFuZGxlIGNvbXByZXNzZWQgZnJhbWVzLgotICBzdGF0aWMgdm9pZCBDb21wcmVzc2lvbkNhbGxiYWNrKHZvaWQqIGVuY29kZXJfb3BhcXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIHJlcXVlc3Rfb3BhcXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9TU3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWVEVuY29kZUluZm9GbGFncyBpbmZvLAorICBzdGF0aWMgdm9pZCBDb21wcmVzc2lvbkNhbGxiYWNrKHZvaWQqIGVuY29kZXJfb3BhcXVlLCB2b2lkKiByZXF1ZXN0X29wYXF1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPU1N0YXR1cyBzdGF0dXMsIFZURW5jb2RlSW5mb0ZsYWdzIGluZm8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ01TYW1wbGVCdWZmZXJSZWYgc2J1Zik7CiAKICAgLy8gVGhlIGNhc3QgZW52aXJvbm1lbnQgKGNvbnRhaW5zIHdvcmtlciB0aHJlYWRzICYgbW9yZSkuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL3BlcmZvcm1hbmNlX21ldHJpY3Nfb3ZlcmxheS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9wZXJmb3JtYW5jZV9tZXRyaWNzX292ZXJsYXkuaAppbmRleCA2NjliZjU3Li4yYzFkZDQwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL3BlcmZvcm1hbmNlX21ldHJpY3Nfb3ZlcmxheS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvcGVyZm9ybWFuY2VfbWV0cmljc19vdmVybGF5LmgKQEAgLTYyLDggKzYyLDcgQEAKIC8vIHJlbmRlcmluZyBvZiB0aGUgZW50aXJlIG92ZXJsYXkuCiB2b2lkIE1heWJlUmVuZGVyUGVyZm9ybWFuY2VNZXRyaWNzT3ZlcmxheShiYXNlOjpUaW1lRGVsdGEgdGFyZ2V0X3BsYXlvdXRfZGVsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluX2xvd19sYXRlbmN5X21vZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdGFyZ2V0X2JpdHJhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzX2FnbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0YXJnZXRfYml0cmF0ZSwgaW50IGZyYW1lc19hZ28sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgZW5jb2Rlcl91dGlsaXphdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBsb3NzeV91dGlsaXphdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZpZGVvRnJhbWUqIGZyYW1lKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvc2l6ZV9hZGFwdGFibGVfdmlkZW9fZW5jb2Rlcl9iYXNlLmggYi9zcmMvY29iYWx0L21lZGlhL2Nhc3Qvc2VuZGVyL3NpemVfYWRhcHRhYmxlX3ZpZGVvX2VuY29kZXJfYmFzZS5oCmluZGV4IDA0YTVlNWMuLjI5ZWUxZWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC9zZW5kZXIvc2l6ZV9hZGFwdGFibGVfdmlkZW9fZW5jb2Rlcl9iYXNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3NlbmRlci9zaXplX2FkYXB0YWJsZV92aWRlb19lbmNvZGVyX2Jhc2UuaApAQCAtNDcsMTMgKzQ3LDkgQEAKIAogIHByb3RlY3RlZDoKICAgLy8gQWNjZXNzb3JzIGZvciBzdWJjbGFzc2VzLgotICBDYXN0RW52aXJvbm1lbnQqIGNhc3RfZW52aXJvbm1lbnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNhc3RfZW52aXJvbm1lbnRfLmdldCgpOwotICB9CisgIENhc3RFbnZpcm9ubWVudCogY2FzdF9lbnZpcm9ubWVudCgpIGNvbnN0IHsgcmV0dXJuIGNhc3RfZW52aXJvbm1lbnRfLmdldCgpOyB9CiAgIGNvbnN0IEZyYW1lU2VuZGVyQ29uZmlnJiB2aWRlb19jb25maWcoKSBjb25zdCB7IHJldHVybiB2aWRlb19jb25maWdfOyB9Ci0gIGNvbnN0IGdmeDo6U2l6ZSYgZnJhbWVfc2l6ZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gZnJhbWVfc2l6ZV87Ci0gIH0KKyAgY29uc3QgZ2Z4OjpTaXplJiBmcmFtZV9zaXplKCkgY29uc3QgeyByZXR1cm4gZnJhbWVfc2l6ZV87IH0KICAgRnJhbWVJZCBuZXh0X2ZyYW1lX2lkKCkgY29uc3QgeyByZXR1cm4gbmV4dF9mcmFtZV9pZF87IH0KIAogICAvLyBSZXR1cm5zIGEgY2FsbGJhY2sgdGhhdCBjYWxscyBPbkVuY29kZXJTdGF0dXNDaGFuZ2UoKS4gIFRoZSBjYWxsYmFjayBpcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvZmFrZV9tZWRpYV9zb3VyY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L2Zha2VfbWVkaWFfc291cmNlLmgKaW5kZXggZDM1YWE1My4uNzA4M2M1OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvZmFrZV9tZWRpYV9zb3VyY2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvdGVzdC9mYWtlX21lZGlhX3NvdXJjZS5oCkBAIC01NCwxMCArNTQsOCBAQAogICAvLyB8dmlkZW9fY29uZmlnfCBpcyB0aGUgZGVzaXJlZCB2aWRlbyBjb25maWcuCiAgIC8vIHxrZWVwX2ZyYW1lc3wgaXMgdHJ1ZSBpZiBhbGwgVmlkZW9GcmFtZXMgYXJlIHNhdmVkIGluIGEgcXVldWUuCiAgIEZha2VNZWRpYVNvdXJjZShzY29wZWRfcmVmcHRyPGJhc2U6OlNpbmdsZVRocmVhZFRhc2tSdW5uZXI+IHRhc2tfcnVubmVyLAotICAgICAgICAgICAgICAgICAgYmFzZTo6VGlja0Nsb2NrKiBjbG9jaywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZyYW1lU2VuZGVyQ29uZmlnJiBhdWRpb19jb25maWcsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGcmFtZVNlbmRlckNvbmZpZyYgdmlkZW9fY29uZmlnLAotICAgICAgICAgICAgICAgICAgYm9vbCBrZWVwX2ZyYW1lcyk7CisgICAgICAgICAgICAgICAgICBiYXNlOjpUaWNrQ2xvY2sqIGNsb2NrLCBjb25zdCBGcmFtZVNlbmRlckNvbmZpZyYgYXVkaW9fY29uZmlnLAorICAgICAgICAgICAgICAgICAgY29uc3QgRnJhbWVTZW5kZXJDb25maWcmIHZpZGVvX2NvbmZpZywgYm9vbCBrZWVwX2ZyYW1lcyk7CiAgIH5GYWtlTWVkaWFTb3VyY2UoKSBmaW5hbDsKIAogICAvLyBUcmFuc2NvZGUgdGhpcyBmaWxlIGFzIHRoZSBzb3VyY2Ugb2YgdmlkZW8gYW5kIGF1ZGlvIGZyYW1lcy4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L2xvb3BiYWNrX3RyYW5zcG9ydC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvbG9vcGJhY2tfdHJhbnNwb3J0LmgKaW5kZXggNzQzOGY5Yi4uZjU1YjAyYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvbG9vcGJhY2tfdHJhbnNwb3J0LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvbG9vcGJhY2tfdHJhbnNwb3J0LmgKQEAgLTI5LDggKzI5LDcgQEAKIC8vIENsYXNzIHRoYXQgc2VuZHMgdGhlIHBhY2tldCB0byBhIHJlY2VpdmVyIHRocm91Z2ggYSBzdGFjayBvZiBQYWNrZXRQaXBlcy4KIGNsYXNzIExvb3BCYWNrVHJhbnNwb3J0IDogcHVibGljIFBhY2tldFRyYW5zcG9ydCB7CiAgcHVibGljOgotICBleHBsaWNpdCBMb29wQmFja1RyYW5zcG9ydCgKLSAgICAgIHNjb3BlZF9yZWZwdHI8Q2FzdEVudmlyb25tZW50PiBjYXN0X2Vudmlyb25tZW50KTsKKyAgZXhwbGljaXQgTG9vcEJhY2tUcmFuc3BvcnQoc2NvcGVkX3JlZnB0cjxDYXN0RW52aXJvbm1lbnQ+IGNhc3RfZW52aXJvbm1lbnQpOwogICB+TG9vcEJhY2tUcmFuc3BvcnQoKSBmaW5hbDsKIAogICBib29sIFNlbmRQYWNrZXQoUGFja2V0UmVmIHBhY2tldCwgY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2IpIGZpbmFsOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3Qvc2tld2VkX3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3NrZXdlZF9zaW5nbGVfdGhyZWFkX3Rhc2tfcnVubmVyLmgKaW5kZXggY2NjM2I2Yy4uYzdhZGUxYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3Qvc2tld2VkX3NpbmdsZV90aHJlYWRfdGFza19ydW5uZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvdGVzdC9za2V3ZWRfc2luZ2xlX3RocmVhZF90YXNrX3J1bm5lci5oCkBAIC0zMCw4ICszMCw3IEBACiAKICAgLy8gYmFzZTo6U2luZ2xlVGhyZWFkVGFza1J1bm5lciBpbXBsZW1lbnRhdGlvbi4KICAgYm9vbCBQb3N0RGVsYXllZFRhc2soY29uc3QgdHJhY2tlZF9vYmplY3RzOjpMb2NhdGlvbiYgZnJvbV9oZXJlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB0YXNrLAotICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZGVsYXkpIGZpbmFsOworICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiB0YXNrLCBiYXNlOjpUaW1lRGVsdGEgZGVsYXkpIGZpbmFsOwogCiAgIGJvb2wgUnVuc1Rhc2tzT25DdXJyZW50VGhyZWFkKCkgY29uc3QgZmluYWw7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3V0aWxpdHkvYXVkaW9fdXRpbGl0eS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9hdWRpb191dGlsaXR5LmgKaW5kZXggMDhkOTcwNC4uZmQxM2IwNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9hdWRpb191dGlsaXR5LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9hdWRpb191dGlsaXR5LmgKQEAgLTI4LDEwICsyOCw4IEBACiAvLyB0aGUgY29udGludWF0aW9uIG9mIGEgc2luZ2xlIHNpbmUgd2F2ZS4KIGNsYXNzIFRlc3RBdWRpb0J1c0ZhY3RvcnkgewogIHB1YmxpYzoKLSAgVGVzdEF1ZGlvQnVzRmFjdG9yeShpbnQgbnVtX2NoYW5uZWxzLAotICAgICAgICAgICAgICAgICAgICAgIGludCBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICBmbG9hdCBzaW5lX3dhdmVfZnJlcXVlbmN5LAotICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHZvbHVtZSk7CisgIFRlc3RBdWRpb0J1c0ZhY3RvcnkoaW50IG51bV9jaGFubmVscywgaW50IHNhbXBsZV9yYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGZsb2F0IHNpbmVfd2F2ZV9mcmVxdWVuY3ksIGZsb2F0IHZvbHVtZSk7CiAgIH5UZXN0QXVkaW9CdXNGYWN0b3J5KCk7CiAKICAgLy8gQ3JlYXRlcyBhIG5ldyBBdWRpb0J1cyBvZiB0aGUgZ2l2ZW4gfGR1cmF0aW9ufCwgZmlsbGVkIHdpdGggdGhlIG5leHQgYmF0Y2gKQEAgLTczLDkgKzcxLDcgQEAKIC8vIGNvbnRhaW4gaG93IG1hbnkgc2FtcGxlcyBoYXMgYmVlbiBlbmNvZGVkIHNvIGZhciwgc28gdGhhdCB3ZSBjYW4gbWFrZSBzbW9vdGgKIC8vIHRyYW5zaXRpb25zIGJldHdlZW4gZW5jb2RlZCBjaHVua3MuCiAvLyBTZWUgYXVkaW9fdXRpbGl0eS5jYyBmb3IgZGV0YWlscyBvbiBob3cgdGhlIGVuY29kaW5nIGlzIGRvbmUuCi1ib29sIEVuY29kZVRpbWVzdGFtcCh1aW50MTZfdCB0aW1lc3RhbXAsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2FtcGxlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW5ndGgsCitib29sIEVuY29kZVRpbWVzdGFtcCh1aW50MTZfdCB0aW1lc3RhbXAsIHNpemVfdCBzYW1wbGVfb2Zmc2V0LCBzaXplX3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIHNhbXBsZXMpOwogCiAvLyBEZWNvZGUgYSB0aW1lc3RhbXAgZW5jb2RlZCB3aXRoIEVuY29kZVRpbWVzdGFtcC4gUmV0dXJucyB0cnVlIGlmIGEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3V0aWxpdHkvYmFyY29kZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9iYXJjb2RlLmgKaW5kZXggYjg4ZTQwMC4uZTA5NjA5NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9iYXJjb2RlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9iYXJjb2RlLmgKQEAgLTI4LDcgKzI4LDcgQEAKIAogLy8gQ29udmVuaWVuY2UgdGVtcGxhdGVzIHRoYXQgYWxsb3dzIHlvdSB0byBlbmNvZGUvZGVjb2RlIG51bWVyaWMKIC8vIHR5cGVzIGRpcmVjdGx5LgotdGVtcGxhdGU8Y2xhc3MgVD4KK3RlbXBsYXRlIDxjbGFzcyBUPgogYm9vbCBFbmNvZGVCYXJjb2RlKFQgZGF0YSwgc2NvcGVkX3JlZnB0cjxtZWRpYTo6VmlkZW9GcmFtZT4gb3V0cHV0X2ZyYW1lKSB7CiAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJpdHMoc2l6ZW9mKFQpICogOCk7CiAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgYml0cy5zaXplKCk7IGkrKykgewpAQCAtMzcsNyArMzcsNyBAQAogICByZXR1cm4gRW5jb2RlQmFyY29kZShiaXRzLCBvdXRwdXRfZnJhbWUpOwogfQogCi10ZW1wbGF0ZTxjbGFzcyBUPgordGVtcGxhdGUgPGNsYXNzIFQ+CiBib29sIERlY29kZUJhcmNvZGUoc2NvcGVkX3JlZnB0cjxtZWRpYTo6VmlkZW9GcmFtZT4gb3V0cHV0X2ZyYW1lLCBUKiBkYXRhKSB7CiAgIHN0ZDo6dmVjdG9yPGJvb2w+IGJpdHMoc2l6ZW9mKFQpICogOCk7CiAgIGJvb2wgcmV0ID0gRGVjb2RlQmFyY29kZShvdXRwdXRfZnJhbWUsICZiaXRzKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3V0aWxpdHkvZGVmYXVsdF9jb25maWcuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3V0aWxpdHkvZGVmYXVsdF9jb25maWcuaAppbmRleCA4MjA0NGYxLi45NzU0ZDM4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvdGVzdC91dGlsaXR5L2RlZmF1bHRfY29uZmlnLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9kZWZhdWx0X2NvbmZpZy5oCkBAIC0zMSw3ICszMSw3IEBACiAKIC8vIFJldHVybnMgYSBjYWxsYmFjayB0aGF0IGRvZXMgbm90aGluZy4KIENyZWF0ZVZpZGVvRW5jb2RlQWNjZWxlcmF0b3JDYWxsYmFjawotICAgIENyZWF0ZURlZmF1bHRWaWRlb0VuY29kZUFjY2VsZXJhdG9yQ2FsbGJhY2soKTsKK0NyZWF0ZURlZmF1bHRWaWRlb0VuY29kZUFjY2VsZXJhdG9yQ2FsbGJhY2soKTsKIAogLy8gUmV0dXJucyBhIGNhbGxiYWNrIHRoYXQgZG9lcyBub3RoaW5nLgogQ3JlYXRlVmlkZW9FbmNvZGVNZW1vcnlDYWxsYmFjayBDcmVhdGVEZWZhdWx0VmlkZW9FbmNvZGVNZW1vcnlDYWxsYmFjaygpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9pbl9wcm9jZXNzX3JlY2VpdmVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvdGVzdC91dGlsaXR5L2luX3Byb2Nlc3NfcmVjZWl2ZXIuaAppbmRleCBiYjNhYjY5Li5jZWI1YTI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Nhc3QvdGVzdC91dGlsaXR5L2luX3Byb2Nlc3NfcmVjZWl2ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvdGVzdC91dGlsaXR5L2luX3Byb2Nlc3NfcmVjZWl2ZXIuaApAQCAtMTE0LDExICsxMTQsOSBAQAogICAvLyBjb21tZW50cyBmb3IgdGhlIGNhbGxiYWNrcyBkZWZpbmVkIGluIHNyYy9tZWRpYS9jYXN0L2Nhc3RfcmVjZWl2ZXIuaCBmb3IKICAgLy8gYXJndW1lbnQgZGVzY3JpcHRpb24gYW5kIHNlbWFudGljcy4KICAgdm9pZCBHb3RBdWRpb0ZyYW1lKHN0ZDo6dW5pcXVlX3B0cjxBdWRpb0J1cz4gYXVkaW9fZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lVGlja3MmIHBsYXlvdXRfdGltZSwKLSAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfY29udGludW91cyk7CisgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYXNlOjpUaW1lVGlja3MmIHBsYXlvdXRfdGltZSwgYm9vbCBpc19jb250aW51b3VzKTsKICAgdm9pZCBHb3RWaWRlb0ZyYW1lKGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIHZpZGVvX2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzJiBwbGF5b3V0X3RpbWUsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbnRpbnVvdXMpOworICAgICAgICAgICAgICAgICAgICAgY29uc3QgYmFzZTo6VGltZVRpY2tzJiBwbGF5b3V0X3RpbWUsIGJvb2wgaXNfY29udGludW91cyk7CiAgIHZvaWQgUHVsbE5leHRBdWRpb0ZyYW1lKCk7CiAgIHZvaWQgUHVsbE5leHRWaWRlb0ZyYW1lKCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3V0aWxpdHkvaW5wdXRfYnVpbGRlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9pbnB1dF9idWlsZGVyLmgKaW5kZXggN2M3Njg0Mi4uZWZmZTIwMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9pbnB1dF9idWlsZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS9pbnB1dF9idWlsZGVyLmgKQEAgLTE5LDEwICsxOSw4IEBACiAvLyBTZXR0aW5nIGxvdyBhbmQgaGlnaCB0byBJTlRfTUlOL0lOVF9NQVggaXMgZXF1aXZhbGVudCB0byBub3Qgc2V0dGluZyBhIHJhbmdlLgogY2xhc3MgSW5wdXRCdWlsZGVyIHsKICBwdWJsaWM6Ci0gIElucHV0QnVpbGRlcihjb25zdCBzdGQ6OnN0cmluZyYgdGl0bGUsCi0gICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgIGludCBsb3dfcmFuZ2UsCi0gICAgICAgICAgICAgICBpbnQgaGlnaF9yYW5nZSk7CisgIElucHV0QnVpbGRlcihjb25zdCBzdGQ6OnN0cmluZyYgdGl0bGUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlLAorICAgICAgICAgICAgICAgaW50IGxvd19yYW5nZSwgaW50IGhpZ2hfcmFuZ2UpOwogICB2aXJ0dWFsIH5JbnB1dEJ1aWxkZXIoKTsKIAogICAvLyBBc2sgdGhlIHVzZXIgZm9yIGlucHV0LCByZWFkcyBpbnB1dCBmcm9tIHRoZSBpbnB1dCBzb3VyY2UgYW5kIHJldHVybnMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3V0aWxpdHkvdWRwX3Byb3h5LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS91ZHBfcHJveHkuY2MKaW5kZXggNmY4YzhlZi4uNGVlZDI3MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS91ZHBfcHJveHkuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS91ZHBfcHJveHkuY2MKQEAgLTE2Myw3ICsxNjMsOCBAQAogCiBjbGFzcyBDb25zdGFudERlbGF5IDogcHVibGljIFNpbXBsZURlbGF5QmFzZSB7CiAgcHVibGljOgotICBleHBsaWNpdCBDb25zdGFudERlbGF5KGRvdWJsZSBkZWxheV9zZWNvbmRzKSA6IGRlbGF5X3NlY29uZHNfKGRlbGF5X3NlY29uZHMpIHt9CisgIGV4cGxpY2l0IENvbnN0YW50RGVsYXkoZG91YmxlIGRlbGF5X3NlY29uZHMpCisgICAgICA6IGRlbGF5X3NlY29uZHNfKGRlbGF5X3NlY29uZHMpIHt9CiAgIGRvdWJsZSBHZXREZWxheSgpIGZpbmFsIHsgcmV0dXJuIGRlbGF5X3NlY29uZHNfOyB9CiAKICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS91ZHBfcHJveHkuaCBiL3NyYy9jb2JhbHQvbWVkaWEvY2FzdC90ZXN0L3V0aWxpdHkvdWRwX3Byb3h5LmgKaW5kZXggMDFhZDAxNi4uMzhlNDZhNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9jYXN0L3Rlc3QvdXRpbGl0eS91ZHBfcHJveHkuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Nhc3QvdGVzdC91dGlsaXR5L3VkcF9wcm94eS5oCkBAIC01OSw4ICs1OSw3IEBACiBjbGFzcyBJbnRlcnJ1cHRlZFBvaXNzb25Qcm9jZXNzIHsKICBwdWJsaWM6CiAgIEludGVycnVwdGVkUG9pc3NvblByb2Nlc3MoY29uc3Qgc3RkOjp2ZWN0b3I8ZG91YmxlPiYgYXZlcmFnZV9yYXRlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgY29lZl9idXJzdGluZXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb2VmX3ZhcmlhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBjb2VmX2J1cnN0aW5lc3MsIGRvdWJsZSBjb2VmX3ZhcmlhbmNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHJhbmRfc2VlZCk7CiAgIH5JbnRlcnJ1cHRlZFBvaXNzb25Qcm9jZXNzKCk7CiAKQEAgLTExOCwxMSArMTE3LDkgQEAKICBwdWJsaWM6CiAgIHZpcnR1YWwgflVEUFByb3h5KCkge30KICAgc3RhdGljIHN0ZDo6dW5pcXVlX3B0cjxVRFBQcm94eT4gQ3JlYXRlKAotICAgICAgY29uc3QgbmV0OjpJUEVuZFBvaW50JiBsb2NhbF9wb3J0LAotICAgICAgY29uc3QgbmV0OjpJUEVuZFBvaW50JiBkZXN0aW5hdGlvbiwKKyAgICAgIGNvbnN0IG5ldDo6SVBFbmRQb2ludCYgbG9jYWxfcG9ydCwgY29uc3QgbmV0OjpJUEVuZFBvaW50JiBkZXN0aW5hdGlvbiwKICAgICAgIHN0ZDo6dW5pcXVlX3B0cjxQYWNrZXRQaXBlPiB0b19kZXN0X3BpcGUsCi0gICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFja2V0UGlwZT4gZnJvbV9kZXN0X3BpcGUsCi0gICAgICBuZXQ6Ok5ldExvZyogbmV0X2xvZyk7CisgICAgICBzdGQ6OnVuaXF1ZV9wdHI8UGFja2V0UGlwZT4gZnJvbV9kZXN0X3BpcGUsIG5ldDo6TmV0TG9nKiBuZXRfbG9nKTsKIH07CiAKIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGNyZWF0ZSBQYWNrZXRQaXBlcyB3aGljaCBjYW4gYmUgbGlua2VkCkBAIC0xNTcsOSArMTU0LDcgQEAKIC8vIEhvd2V2ZXIsIGV2ZXJ5IG5vdyBhbmQgdGhlbiBhIGRlbGF5IG9mIHxiaWdfZGVsYXl8IHdpbGwgYmUKIC8vIGluc2VydGVkIChyb3VnaGx5IGV2ZXJ5IHxzZWNvbmRzX2JldHdlZW5fYmlnX2RlbGF5fCBzZWNvbmRzKS4KIHN0ZDo6dW5pcXVlX3B0cjxQYWNrZXRQaXBlPiBOZXdSYW5kb21Tb3J0ZWREZWxheSgKLSAgICBkb3VibGUgcmFuZG9tX2RlbGF5LAotICAgIGRvdWJsZSBiaWdfZGVsYXksCi0gICAgZG91YmxlIHNlY29uZHNfYmV0d2Vlbl9iaWdfZGVsYXkpOworICAgIGRvdWJsZSByYW5kb21fZGVsYXksIGRvdWJsZSBiaWdfZGVsYXksIGRvdWJsZSBzZWNvbmRzX2JldHdlZW5fYmlnX2RlbGF5KTsKIAogLy8gVGhpcyBQYWNrZXRQaXBlIGVtdWxhdGVzIG5ldHdvcmsgb3V0YWdlcy4gSXQgYmFzaWNhbGx5IHdhaXRzCiAvLyBmb3IgMC0yKnxhdmVyYWdlX3dvcmtfdGltZXwgc2Vjb25kcywgdGhlbiBraWxscyB0aGUgbmV0d29yayBmb3IKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5jYwppbmRleCAzMzA2NDMxLi4wZTIwNzQ1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZldGNoZXJfYnVmZmVyZWRfZGF0YV9zb3VyY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9mZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmgiCiAKQEAgLTYwLDcgKzU4LDkgQEAKIH0KIAogRmV0Y2hlckJ1ZmZlcmVkRGF0YVNvdXJjZTo6fkZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2UoKSB7Ci0gIERDSEVDSyhtZXNzYWdlX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICBpZiAoY2FuY2VsYWJsZV9jcmVhdGVfZmV0Y2hlcl9jbG9zdXJlXykgeworICAgIGNhbmNlbGFibGVfY3JlYXRlX2ZldGNoZXJfY2xvc3VyZV8tPkNhbmNlbCgpOworICB9CiB9CiAKIHZvaWQgRmV0Y2hlckJ1ZmZlcmVkRGF0YVNvdXJjZTo6UmVhZChpbnQ2NCBwb3NpdGlvbiwgaW50IHNpemUsIHVpbnQ4KiBkYXRhLApAQCAtNzgsNyArNzgsNyBAQAogICAgICAgICAgICAgICByZWFkX2NiKTsKIH0KIAotdm9pZCBGZXRjaGVyQnVmZmVyZWREYXRhU291cmNlOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7Cit2b2lkIEZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2U6OlN0b3AoKSB7CiAgIHsKICAgICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwogCkBAIC05NiwxMiArOTYsNiBAQAogICAgIC8vIGltbWVkaWF0ZWx5IHNvIGl0IGlzIHNhZmUgdG8gZGVzdHJveSB8ZmV0Y2hlcl98IGluc2lkZSB0aGUgZHRvci4KICAgICBlcnJvcl9vY2N1cmVkXyA9IHRydWU7CiAgIH0KLQotICAvLyBXZSBjYW5ub3QgcG9zdCB0aGUgY2FsbGJhY2sgdXNpbmcgdGhlIE1lc3NhZ2VMb29wIGFzIHdlIHNoYXJlIHRoZQotICAvLyBzYW1lIE1lc3NhZ2VMb29wIGFzIFdlYk1lZGlhUGxheWVySW1wbCAoV01QSSkgYW5kIFdNUEk6OkRlc3Ryb3koKQotICAvLyB3YWl0cyBvbiBhbiBldmVudCBkdXJpbmcgdmlkZW8gU3RvcC4gIFRoZSBwb3N0ZWQgdGFzayB3aWxsIG5ldmVyIGJlCi0gIC8vIHJ1biBhbmQgd2lsbCBjYXVzZSBkZWFkIGxvY2suCi0gIGNhbGxiYWNrLlJ1bigpOwogfQogCiBib29sIEZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2U6OkdldFNpemUoaW50NjQqIHNpemVfb3V0KSB7CkBAIC00MDUsOSArMzk5LDE1IEBACiAgICAgbGFzdF9yZXF1ZXN0X29mZnNldF8gPSBidWZmZXJfb2Zmc2V0XyArIGJ1ZmZlcl8uR2V0TGVuZ3RoKCk7CiAgIH0KIAotICBtZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKLSAgICAgIEZST01fSEVSRSwKLSAgICAgIGJhc2U6OkJpbmQoJkZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2U6OkNyZWF0ZU5ld0ZldGNoZXIsIHRoaXMpKTsKKyAgaWYgKGNhbmNlbGFibGVfY3JlYXRlX2ZldGNoZXJfY2xvc3VyZV8pIHsKKyAgICBjYW5jZWxhYmxlX2NyZWF0ZV9mZXRjaGVyX2Nsb3N1cmVfLT5DYW5jZWwoKTsKKyAgfQorICBiYXNlOjpDbG9zdXJlIGNyZWF0ZV9mZXRjaGVyX2Nsb3N1cmUgPSBiYXNlOjpCaW5kKAorICAgICAgJkZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2U6OkNyZWF0ZU5ld0ZldGNoZXIsIGJhc2U6OlVucmV0YWluZWQodGhpcykpOworICBjYW5jZWxhYmxlX2NyZWF0ZV9mZXRjaGVyX2Nsb3N1cmVfID0KKyAgICAgIG5ldyBDYW5jZWxhYmxlQ2xvc3VyZShjcmVhdGVfZmV0Y2hlcl9jbG9zdXJlKTsKKyAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjYW5jZWxhYmxlX2NyZWF0ZV9mZXRjaGVyX2Nsb3N1cmVfLT5Bc0Nsb3N1cmUoKSk7CiB9CiAKIHZvaWQgRmV0Y2hlckJ1ZmZlcmVkRGF0YVNvdXJjZTo6UHJvY2Vzc1BlbmRpbmdSZWFkX0xvY2tlZCgpIHsKQEAgLTQxOCw1ICs0MTgsMjkgQEAKICAgfQogfQogCitGZXRjaGVyQnVmZmVyZWREYXRhU291cmNlOjpDYW5jZWxhYmxlQ2xvc3VyZTo6Q2FuY2VsYWJsZUNsb3N1cmUoCisgICAgY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkKKyAgICA6IGNsb3N1cmVfKGNsb3N1cmUpIHsKKyAgRENIRUNLKCFjbG9zdXJlLmlzX251bGwoKSk7Cit9CisKK3ZvaWQgRmV0Y2hlckJ1ZmZlcmVkRGF0YVNvdXJjZTo6Q2FuY2VsYWJsZUNsb3N1cmU6OkNhbmNlbCgpIHsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgY2xvc3VyZV8uUmVzZXQoKTsKK30KKworYmFzZTo6Q2xvc3VyZSBGZXRjaGVyQnVmZmVyZWREYXRhU291cmNlOjpDYW5jZWxhYmxlQ2xvc3VyZTo6QXNDbG9zdXJlKCkgeworICByZXR1cm4gYmFzZTo6QmluZCgmQ2FuY2VsYWJsZUNsb3N1cmU6OkNhbGwsIHRoaXMpOworfQorCit2b2lkIEZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2U6OkNhbmNlbGFibGVDbG9zdXJlOjpDYWxsKCkgeworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICAvLyBjbG9zdXJlXy5SdW4oKSBoYXMgdG8gYmUgY2FsbGVkIHdoZW4gdGhlIGxvY2sgaXMgYWNxdWlyZWQgdG8gYXZvaWQgcmFjZQorICAvLyBjb25kaXRpb24uCisgIGlmICghY2xvc3VyZV8uaXNfbnVsbCgpKSB7CisgICAgYmFzZTo6UmVzZXRBbmRSZXR1cm4oJmNsb3N1cmVfKS5SdW4oKTsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmV0Y2hlcl9idWZmZXJlZF9kYXRhX3NvdXJjZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmgKaW5kZXggZjhlNTZhZS4uMGU3Y2FmYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmgKQEAgLTEsMzMgKzEsMzcgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9GRVRDSEVSX0JVRkZFUkVEX0RBVEFfU09VUkNFX0hfCiAjZGVmaW5lIENPQkFMVF9NRURJQV9GRVRDSEVSX0JVRkZFUkVEX0RBVEFfU09VUkNFX0hfCiAKICNpbmNsdWRlIDxzdHJpbmc+CiAKKyNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCiAjaW5jbHVkZSAiYmFzZS9jaXJjdWxhcl9idWZmZXJfc2hlbGwuaCIKICNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKICNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi9sb2NrLmgiCiAjaW5jbHVkZSAiY29iYWx0L2NzcC9jb250ZW50X3NlY3VyaXR5X3BvbGljeS5oIgogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmgiCiAjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL3BsYXllci9idWZmZXJlZF9kYXRhX3NvdXJjZS5oIgorI2Vsc2UgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogI2luY2x1ZGUgIm1lZGlhL3BsYXllci9idWZmZXJlZF9kYXRhX3NvdXJjZS5oIgorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXIuaCIKICNpbmNsdWRlICJuZXQvdXJsX3JlcXVlc3QvdXJsX2ZldGNoZXJfZGVsZWdhdGUuaCIKIApAQCAtNjgsMTIgKzcyLDI3IEBACiAgIC8vIERhdGFTb3VyY2UgbWV0aG9kcy4KICAgdm9pZCBSZWFkKGludDY0IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDgqIGRhdGEsCiAgICAgICAgICAgICBjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIE9WRVJSSURFOworICB2b2lkIFN0b3AoKSBPVkVSUklERTsKICAgYm9vbCBHZXRTaXplKGludDY0KiBzaXplX291dCkgT1ZFUlJJREU7CiAgIGJvb2wgSXNTdHJlYW1pbmcoKSBPVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQogICB2b2lkIFNldEJpdHJhdGUoaW50IGJpdHJhdGUpIE9WRVJSSURFIHsgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihiaXRyYXRlKTsgfQogCiAgcHJpdmF0ZToKKyAgY2xhc3MgQ2FuY2VsYWJsZUNsb3N1cmUKKyAgICAgIDogcHVibGljIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPENhbmNlbGFibGVDbG9zdXJlPiB7CisgICBwdWJsaWM6CisgICAgZXhwbGljaXQgQ2FuY2VsYWJsZUNsb3N1cmUoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSk7CisKKyAgICB2b2lkIENhbmNlbCgpOworICAgIGJhc2U6OkNsb3N1cmUgQXNDbG9zdXJlKCk7CisKKyAgIHByaXZhdGU6CisgICAgdm9pZCBDYWxsKCk7CisKKyAgICBiYXNlOjpMb2NrIGxvY2tfOworICAgIGJhc2U6OkNsb3N1cmUgY2xvc3VyZV87CisgIH07CisKICAgLy8gbmV0OjpVUkxGZXRjaGVyRGVsZWdhdGUgbWV0aG9kcwogICB2b2lkIE9uVVJMRmV0Y2hSZXNwb25zZVN0YXJ0ZWQoY29uc3QgbmV0OjpVUkxGZXRjaGVyKiBzb3VyY2UpIE9WRVJSSURFOwogICBib29sIFNob3VsZFNlbmREb3dubG9hZERhdGEoKSBPVkVSUklERSB7IHJldHVybiB0cnVlOyB9CkBAIC0xMTUsNiArMTM0LDcgQEAKICAgdWludDgqIHBlbmRpbmdfcmVhZF9kYXRhXzsKIAogICBjc3A6OlNlY3VyaXR5Q2FsbGJhY2sgc2VjdXJpdHlfY2FsbGJhY2tfOworICBzY29wZWRfcmVmcHRyPENhbmNlbGFibGVDbG9zdXJlPiBjYW5jZWxhYmxlX2NyZWF0ZV9mZXRjaGVyX2Nsb3N1cmVfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvYXVkaW9fY2xvY2suaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9hdWRpb19jbG9jay5oCmluZGV4IGE2YjBhMzcuLmYxM2ViN2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9hdWRpb19jbG9jay5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9hdWRpb19jbG9jay5oCkBAIC01OCw5ICs1OCw3IEBACiAgIC8vIHxmcmFtZXNfd3JpdHRlbnwgYW1vdW50IG9mIGF1ZGlvIGRhdGEgc2NhbGVkIHRvIHxwbGF5YmFja19yYXRlfCB3cml0dGVuLgogICAvLyB8ZnJhbWVzX3JlcXVlc3RlZHwgYW1vdW50IG9mIGF1ZGlvIGRhdGEgcmVxdWVzdGVkIGJ5IGhhcmR3YXJlLgogICAvLyB8ZGVsYXlfZnJhbWVzfCBpcyB0aGUgY3VycmVudCBhbW91bnQgb2YgaGFyZHdhcmUgZGVsYXkuCi0gIHZvaWQgV3JvdGVBdWRpbyhpbnQgZnJhbWVzX3dyaXR0ZW4sCi0gICAgICAgICAgICAgICAgICBpbnQgZnJhbWVzX3JlcXVlc3RlZCwKLSAgICAgICAgICAgICAgICAgIGludCBkZWxheV9mcmFtZXMsCisgIHZvaWQgV3JvdGVBdWRpbyhpbnQgZnJhbWVzX3dyaXR0ZW4sIGludCBmcmFtZXNfcmVxdWVzdGVkLCBpbnQgZGVsYXlfZnJhbWVzLAogICAgICAgICAgICAgICAgICAgZG91YmxlIHBsYXliYWNrX3JhdGUpOwogCiAgIC8vIElmIFdyb3RlQXVkaW8oKSBjYWxscyBhcmUgc3VzcGVuZGVkIChpLmUuIGR1ZSB0byBwbGF5YmFjayBiZWluZyBwYXVzZWQpIHRoZQpAQCAtMTA2LDggKzEwNCw3IEBACiAgIGJhc2U6OlRpbWVEZWx0YSBUaW1lVW50aWxQbGF5YmFjayhiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSBjb25zdDsKIAogICB2b2lkIENvbnRpZ3VvdXNBdWRpb0RhdGFCdWZmZXJlZEZvclRlc3RpbmcoCi0gICAgICBiYXNlOjpUaW1lRGVsdGEqIHRvdGFsLAotICAgICAgYmFzZTo6VGltZURlbHRhKiBzYW1lX3JhdGVfdG90YWwpIGNvbnN0OworICAgICAgYmFzZTo6VGltZURlbHRhKiB0b3RhbCwgYmFzZTo6VGltZURlbHRhKiBzYW1lX3JhdGVfdG90YWwpIGNvbnN0OwogCiAgcHJpdmF0ZToKICAgLy8gRXZlbiB3aXRoIGEgcmlkaWN1bG91c2x5IGhpZ2ggc2FtcGxlIHJhdGUgb2YgMjU2a0h6LCB1c2luZyA2NCBiaXRzIHdpbGwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9hdWRpb19maWxlX3JlYWRlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyLmgKaW5kZXggZjg4ZDhmYi4uMzA5MWFlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2F1ZGlvX2ZpbGVfcmVhZGVyLmgKQEAgLTE2LDcgKzE2LDkgQEAKIHN0cnVjdCBBVlBhY2tldDsKIHN0cnVjdCBBVlN0cmVhbTsKIAotbmFtZXNwYWNlIGJhc2UgeyBjbGFzcyBUaW1lRGVsdGE7IH0KK25hbWVzcGFjZSBiYXNlIHsKK2NsYXNzIFRpbWVEZWx0YTsKK30KIAogbmFtZXNwYWNlIG1lZGlhIHsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2F1ZGlvX3JlbmRlcmVyX2FsZ29yaXRobS5oCmluZGV4IDI1OTViNTcuLmQxYzdjM2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9hdWRpb19yZW5kZXJlcl9hbGdvcml0aG0uaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvYXVkaW9fcmVuZGVyZXJfYWxnb3JpdGhtLmgKQEAgLTUyLDkgKzUyLDcgQEAKICAgLy8gfGRlc3Rfb2Zmc2V0fCBpcyB0aGUgb2Zmc2V0IGluIGZyYW1lcyBmb3Igd3JpdGluZyBpbnRvIHxkZXN0fC4KICAgLy8KICAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGZyYW1lcyBjb3BpZWQgaW50byB8ZGVzdHwuCi0gIGludCBGaWxsQnVmZmVyKEF1ZGlvQnVzKiBkZXN0LAotICAgICAgICAgICAgICAgICBpbnQgZGVzdF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgIGludCByZXF1ZXN0ZWRfZnJhbWVzLAorICBpbnQgRmlsbEJ1ZmZlcihBdWRpb0J1cyogZGVzdCwgaW50IGRlc3Rfb2Zmc2V0LCBpbnQgcmVxdWVzdGVkX2ZyYW1lcywKICAgICAgICAgICAgICAgICAgZG91YmxlIHBsYXliYWNrX3JhdGUpOwogCiAgIC8vIENsZWFycyB8YXVkaW9fYnVmZmVyX3wuCkBAIC05Myw4ICs5MSw4IEBACiAKICAgLy8gUmVhZCBhIG1heGltdW0gb2YgfHJlcXVlc3RlZF9mcmFtZXN8IGZyYW1lcyBmcm9tIHx3c29sYV9vdXRwdXRffC4gUmV0dXJucwogICAvLyBudW1iZXIgb2YgZnJhbWVzIGFjdHVhbGx5IHJlYWQuCi0gIGludCBXcml0ZUNvbXBsZXRlZEZyYW1lc1RvKAotICAgICAgaW50IHJlcXVlc3RlZF9mcmFtZXMsIGludCBvdXRwdXRfb2Zmc2V0LCBBdWRpb0J1cyogZGVzdCk7CisgIGludCBXcml0ZUNvbXBsZXRlZEZyYW1lc1RvKGludCByZXF1ZXN0ZWRfZnJhbWVzLCBpbnQgb3V0cHV0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9CdXMqIGRlc3QpOwogCiAgIC8vIEZpbGwgfGRlc3R8IHdpdGggZnJhbWVzIGZyb20gfGF1ZGlvX2J1ZmZlcl98IHN0YXJ0aW5nIGZyb20gZnJhbWUKICAgLy8gfHJlYWRfb2Zmc2V0X2ZyYW1lc3wuIHxkZXN0fCBpcyBleHBlY3RlZCB0byBoYXZlIHRoZSBzYW1lIG51bWJlciBvZgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2NodW5rX2RlbXV4ZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5jYwppbmRleCBhMTgxMmYxLi43OWQ4YzI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5jYwpAQCAtNDEzLDYgKzQxMyw3IEBACiB2b2lkIENodW5rRGVtdXhlcjo6SW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGluaXRfY2IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV90ZXh0X3RyYWNrcykgeworICBETE9HKElORk8pIDw8ICJUaGlzIGlzIGFuIEFTWU5DIE1FRElBIFNPVVJDRSBwbGF5YmFjay4iOwogICBEVkxPRygxKSA8PCAiSW5pdCgpIjsKIAogICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwpAQCAtNjMzLDcgKzYzNCw3IEBACiAgICAgICBpZiAoYXVkaW9fc3RyZWFtc19baV0gPT0gKml0ZXIpIHsKICAgICAgICAgc3RyZWFtX2ZvdW5kID0gdHJ1ZTsKICAgICAgICAgcmVtb3ZlZF9zdHJlYW1zXy5wdXNoX2JhY2soYXVkaW9fc3RyZWFtc19baV0pOwotICAgICAgICBhdWRpb19zdHJlYW1zXy5lcmFzZShhdWRpb19zdHJlYW1zXy5iZWdpbigpICsgaSk7CisgICAgICAgIGF1ZGlvX3N0cmVhbXNfLndlYWtfZXJhc2UoYXVkaW9fc3RyZWFtc18uYmVnaW4oKSArIGkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC02NDIsNyArNjQzLDcgQEAKICAgICAgIGlmICh2aWRlb19zdHJlYW1zX1tpXSA9PSAqaXRlcikgewogICAgICAgICBzdHJlYW1fZm91bmQgPSB0cnVlOwogICAgICAgICByZW1vdmVkX3N0cmVhbXNfLnB1c2hfYmFjayh2aWRlb19zdHJlYW1zX1tpXSk7Ci0gICAgICAgIHZpZGVvX3N0cmVhbXNfLmVyYXNlKHZpZGVvX3N0cmVhbXNfLmJlZ2luKCkgKyBpKTsKKyAgICAgICAgdmlkZW9fc3RyZWFtc18ud2Vha19lcmFzZSh2aWRlb19zdHJlYW1zXy5iZWdpbigpICsgaSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5oCmluZGV4IGZiMjAzZTQuLmRiZWNkMTEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2NodW5rX2RlbXV4ZXIuaApAQCAtMzYsOCArMzYsNyBAQAogIHB1YmxpYzoKICAgdHlwZWRlZiBzdGQ6OmRlcXVlPHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiA+IEJ1ZmZlclF1ZXVlOwogCi0gIENodW5rRGVtdXhlclN0cmVhbShUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBib29sIHNwbGljZV9mcmFtZXNfZW5hYmxlZCwKKyAgQ2h1bmtEZW11eGVyU3RyZWFtKFR5cGUgdHlwZSwgYm9vbCBzcGxpY2VfZnJhbWVzX2VuYWJsZWQsCiAgICAgICAgICAgICAgICAgICAgICBNZWRpYVRyYWNrOjpJZCBtZWRpYV90cmFja19pZCk7CiAgIH5DaHVua0RlbXV4ZXJTdHJlYW0oKSBPVkVSUklERTsKIApAQCAtMTk1LDggKzE5NCw3IEBACiAKICAgLy8gfGVuYWJsZV90ZXh0fCBQcm9jZXNzIGluYmFuZCB0ZXh0IHRyYWNrcyBpbiB0aGUgbm9ybWFsIHdheSB3aGVuIHRydWUsCiAgIC8vICAgb3RoZXJ3aXNlIGlnbm9yZSB0aGVtLgotICB2b2lkIEluaXRpYWxpemUoRGVtdXhlckhvc3QqIGhvc3QsCi0gICAgICAgICAgICAgICAgICBjb25zdCBQaXBlbGluZVN0YXR1c0NCJiBpbml0X2NiLAorICB2b2lkIEluaXRpYWxpemUoRGVtdXhlckhvc3QqIGhvc3QsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGluaXRfY2IsCiAgICAgICAgICAgICAgICAgICBib29sIGVuYWJsZV90ZXh0X3RyYWNrcykgT1ZFUlJJREU7CiAgIHZvaWQgU3RvcCgpIE9WRVJSSURFOwogICB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKSBPVkVSUklERTsKQEAgLTIyMCw4ICsyMTgsNyBAQAogICAvLyBrTm90U3VwcG9ydGVkIGlzIHJldHVybmVkIGlmIHx0eXBlfCBpcyBub3QgYSBzdXBwb3J0ZWQgZm9ybWF0LgogICAvLyBrUmVhY2hlZElkTGltaXQgaXMgcmV0dXJuZWQgaWYgdGhlIGRlbXV4ZXIgY2Fubm90IGhhbmRsZSBhbm90aGVyIElEIHJpZ2h0CiAgIC8vICAgIG5vdy4KLSAgU3RhdHVzIEFkZElkKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAorICBTdGF0dXMgQWRkSWQoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwKICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2RlY3MpOwogCiAgIC8vIE5vdGlmaWVzIGEgY2FsbGVyIHZpYSB8dHJhY2tzX3VwZGF0ZWRfY2J8IHRoYXQgdGhlIHNldCBvZiBtZWRpYSB0cmFja3MKQEAgLTI1Miw5ICsyNDksNyBAQAogICAvLyBzaW1pbGFybHkgbmFtZWQgc291cmNlIGJ1ZmZlciBhdHRyaWJ1dGVzIHRoYXQgYXJlIHVzZWQgaW4gY29kZWQgZnJhbWUKICAgLy8gcHJvY2Vzc2luZy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MsIGZhbHNlIGlmIHRoZSBjYWxsZXIgbmVlZHMgdG8gcnVuIHRoZQogICAvLyBhcHBlbmQgZXJyb3IgYWxnb3JpdGhtIHdpdGggZGVjb2RlIGVycm9yIHBhcmFtZXRlciBzZXQgdG8gdHJ1ZS4KLSAgYm9vbCBBcHBlbmREYXRhKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLAorICBib29sIEFwcGVuZERhdGEoY29uc3Qgc3RkOjpzdHJpbmcmIGlkLCBjb25zdCB1aW50OF90KiBkYXRhLCBzaXplX3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGFwcGVuZF93aW5kb3dfc3RhcnQsCiAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgYXBwZW5kX3dpbmRvd19lbmQsCiAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEqIHRpbWVzdGFtcF9vZmZzZXQpOwpAQCAtMjc3LDggKzI3Miw3IEBACiAgIC8vIHRoZSAiQ29kZWQgRnJhbWUgRXZpY3Rpb24gQWxnb3JpdGhtIiBpbiB0aGUgTWVkaWEgU291cmNlIEV4dGVuc2lvbnMgU3BlYy4KICAgLy8gUmV0dXJucyBmYWxzZSBpZmYgYnVmZmVyIGlzIHN0aWxsIGZ1bGwgYWZ0ZXIgcnVubmluZyBldmljdGlvbi4KICAgLy8gaHR0cHM6Ly93M2MuZ2l0aHViLmlvL21lZGlhLXNvdXJjZS8jc291cmNlYnVmZmVyLWNvZGVkLWZyYW1lLWV2aWN0aW9uCi0gIGJvb2wgRXZpY3RDb2RlZEZyYW1lcyhjb25zdCBzdGQ6OnN0cmluZyYgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgY3VycmVudE1lZGlhVGltZSwKKyAgYm9vbCBFdmljdENvZGVkRnJhbWVzKGNvbnN0IHN0ZDo6c3RyaW5nJiBpZCwgYmFzZTo6VGltZURlbHRhIGN1cnJlbnRNZWRpYVRpbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmV3RGF0YVNpemUpOwogCiAgIC8vIFJldHVybnMgdGhlIGN1cnJlbnQgcHJlc2VudGF0aW9uIGR1cmF0aW9uLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2RlY29kZXJfc2VsZWN0b3IuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNvZGVyX3NlbGVjdG9yLmgKaW5kZXggNWZmYzNhOS4uZGFkNDdmZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2RlY29kZXJfc2VsZWN0b3IuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZGVjb2Rlcl9zZWxlY3Rvci5oCkBAIC0zMyw3ICszMyw3IEBACiAvLyBlbmNyeXB0ZWQsIGEgRGVjcnlwdGluZ0RlbXV4ZXJTdHJlYW0gbWF5IGFsc28gYmUgY3JlYXRlZC4KIC8vIFRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgfFN0cmVhbVR5cGV8IGlzIHRoZSB0eXBlIG9mIHN0cmVhbSB3ZSB3aWxsIGJlCiAvLyBzZWxlY3RpbmcgYSBkZWNvZGVyIGZvci4KLXRlbXBsYXRlPERlbXV4ZXJTdHJlYW06OlR5cGUgU3RyZWFtVHlwZT4KK3RlbXBsYXRlIDxEZW11eGVyU3RyZWFtOjpUeXBlIFN0cmVhbVR5cGU+CiBjbGFzcyBNRURJQV9FWFBPUlQgRGVjb2RlclNlbGVjdG9yIHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgRGVjb2RlclN0cmVhbVRyYWl0czxTdHJlYW1UeXBlPiBTdHJlYW1UcmFpdHM7CkBAIC01NSw4ICs1NSw3IEBACiAgIC8vIHxkZWNvZGVyc3wgY29udGFpbnMgdGhlIERlY29kZXJzIHRvIHVzZSB3aGVuIGluaXRpYWxpemluZy4KICAgRGVjb2RlclNlbGVjdG9yKAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpTaW5nbGVUaHJlYWRUYXNrUnVubmVyPiYgbWVzc2FnZV9sb29wLAotICAgICAgU2NvcGVkVmVjdG9yPERlY29kZXI+IGRlY29kZXJzLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZyk7CisgICAgICBTY29wZWRWZWN0b3I8RGVjb2Rlcj4gZGVjb2RlcnMsIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2cpOwogCiAgIC8vIEFib3J0cyBwZW5kaW5nIERlY29kZXIgc2VsZWN0aW9uIGFuZCBmaXJlcyB8c2VsZWN0X2RlY29kZXJfY2J8IHdpdGgKICAgLy8gTlVMTCBhbmQgTlVMTCBpbW1lZGlhdGVseSBpZiBpdCdzIHBlbmRpbmcuCkBAIC03MSw4ICs3MCw3IEBACiAgIC8vICAgIHNlbGVjdCBmcm9tIHRoZSBkZWNvZGVycyBmb2xsb3dpbmcgdGhlIGRlY29kZXIgdGhhdCB3YXMgbGFzdCByZXR1cm5lZC4KICAgLy8gMy4gfGNkbV9jb250ZXh0fCBpcyBvcHRpb25hbC4gSWYgfGNkbV9jb250ZXh0fCBpcwogICAvLyAgICBudWxsLCBubyBDRE0gd2lsbCBiZSBhdmFpbGFibGUgdG8gcGVyZm9ybSBkZWNyeXB0aW9uLgotICB2b2lkIFNlbGVjdERlY29kZXIoU3RyZWFtVHJhaXRzKiB0cmFpdHMsCi0gICAgICAgICAgICAgICAgICAgICBEZW11eGVyU3RyZWFtKiBzdHJlYW0sCisgIHZvaWQgU2VsZWN0RGVjb2RlcihTdHJlYW1UcmFpdHMqIHRyYWl0cywgRGVtdXhlclN0cmVhbSogc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgQ2RtQ29udGV4dCogY2RtX2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWxlY3REZWNvZGVyQ0ImIHNlbGVjdF9kZWNvZGVyX2NiLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgRGVjb2Rlcjo6T3V0cHV0Q0ImIG91dHB1dF9jYiwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2F1ZGlvX2RlY29kZXIuaAppbmRleCBmMDA2NjFkLi4xOTU0ZDkzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19hdWRpb19kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfYXVkaW9fZGVjb2Rlci5oCkBAIC00MywxMCArNDMsOCBAQAogCiAgIC8vIEF1ZGlvRGVjb2RlciBpbXBsZW1lbnRhdGlvbi4KICAgc3RkOjpzdHJpbmcgR2V0RGlzcGxheU5hbWUoKSBjb25zdCBPVkVSUklERTsKLSAgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnLAotICAgICAgICAgICAgICAgICAgQ2RtQ29udGV4dCogY2RtX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBJbml0Q0ImIGluaXRfY2IsCi0gICAgICAgICAgICAgICAgICBjb25zdCBPdXRwdXRDQiYgb3V0cHV0X2NiKSBPVkVSUklERTsKKyAgdm9pZCBJbml0aWFsaXplKGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgY29uZmlnLCBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEluaXRDQiYgaW5pdF9jYiwgY29uc3QgT3V0cHV0Q0ImIG91dHB1dF9jYikgT1ZFUlJJREU7CiAgIHZvaWQgRGVjb2RlKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlciwKICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYikgT1ZFUlJJREU7CiAgIHZvaWQgUmVzZXQoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2xvc3VyZSkgT1ZFUlJJREU7CkBAIC03NSw4ICs3Myw3IEBACiAgIHZvaWQgRGVjb2RlUGVuZGluZ0J1ZmZlcigpOwogCiAgIC8vIENhbGxiYWNrIGZvciBEZWNyeXB0b3I6OkRlY3J5cHRBbmREZWNvZGVBdWRpbygpLgotICB2b2lkIERlbGl2ZXJGcmFtZShpbnQgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKKyAgdm9pZCBEZWxpdmVyRnJhbWUoaW50IGJ1ZmZlcl9zaXplLCBEZWNyeXB0b3I6OlN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlY3J5cHRvcjo6QXVkaW9GcmFtZXMmIGZyYW1lcyk7CiAKICAgLy8gQ2FsbGJhY2sgZm9yIHRoZSB8ZGVjcnlwdG9yX3wgdG8gbm90aWZ5IHRoaXMgb2JqZWN0IHRoYXQgYSBuZXcga2V5IGhhcyBiZWVuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmNjCmluZGV4IDNlNWQyNmYuLjk1YWM1MjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmNjCkBAIC0zODEsNiArMzgxLDggQEAKICAgICAgICAgICBpbnB1dF92aWRlb19jb25maWcuY29kZWRfc2l6ZSgpLCBpbnB1dF92aWRlb19jb25maWcudmlzaWJsZV9yZWN0KCksCiAgICAgICAgICAgaW5wdXRfdmlkZW9fY29uZmlnLm5hdHVyYWxfc2l6ZSgpLCBpbnB1dF92aWRlb19jb25maWcuZXh0cmFfZGF0YSgpLAogICAgICAgICAgIFVuZW5jcnlwdGVkKCkpOworICAgICAgdmlkZW9fY29uZmlnXy0+c2V0X3dlYm1fY29sb3JfbWV0YWRhdGEoCisgICAgICAgICAgaW5wdXRfdmlkZW9fY29uZmlnLT53ZWJtX2NvbG9yX21ldGFkYXRhKCkpOwogICAgICAgYnJlYWs7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uaAppbmRleCBjZmExODA0Li4yNTJmNTA3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmgKQEAgLTQyLDggKzQyLDcgQEAKICAgfkRlY3J5cHRpbmdEZW11eGVyU3RyZWFtKCkgT1ZFUlJJREU7CiAKICAgLy8gfHN0ZXJhbXwgbXVzdCBiZSBlbmNyeXB0ZWQgYW5kIHxjZG1fY29udGV4dHwgbXVzdCBiZSBub24tbnVsbC4KLSAgdm9pZCBJbml0aWFsaXplKERlbXV4ZXJTdHJlYW0qIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgIENkbUNvbnRleHQqIGNkbV9jb250ZXh0LAorICB2b2lkIEluaXRpYWxpemUoRGVtdXhlclN0cmVhbSogc3RyZWFtLCBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYik7CiAKICAgLy8gQ2FuY2VscyBhbGwgcGVuZGluZyBvcGVyYXRpb25zIGFuZCBmaXJlcyBhbGwgcGVuZGluZyBjYWxsYmFja3MuIElmIGluCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ192aWRlb19kZWNvZGVyLmgKaW5kZXggNzk5YjNiNi4uZjBkZWQwNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfdmlkZW9fZGVjb2Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX3ZpZGVvX2RlY29kZXIuaApAQCAtNDEsMTAgKzQxLDggQEAKIAogICAvLyBWaWRlb0RlY29kZXIgaW1wbGVtZW50YXRpb24uCiAgIHN0ZDo6c3RyaW5nIEdldERpc3BsYXlOYW1lKCkgY29uc3QgT1ZFUlJJREU7Ci0gIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywKLSAgICAgICAgICAgICAgICAgIGJvb2wgbG93X2RlbGF5LAotICAgICAgICAgICAgICAgICAgQ2RtQ29udGV4dCogY2RtX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBJbml0Q0ImIGluaXRfY2IsCisgIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGNvbmZpZywgYm9vbCBsb3dfZGVsYXksCisgICAgICAgICAgICAgICAgICBDZG1Db250ZXh0KiBjZG1fY29udGV4dCwgY29uc3QgSW5pdENCJiBpbml0X2NiLAogICAgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0Q0ImIG91dHB1dF9jYikgT1ZFUlJJREU7CiAgIHZvaWQgRGVjb2RlKGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlciwKICAgICAgICAgICAgICAgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYikgT1ZFUlJJREU7CkBAIC03Miw4ICs3MCw3IEBACiAgIHZvaWQgRGVjb2RlUGVuZGluZ0J1ZmZlcigpOwogCiAgIC8vIENhbGxiYWNrIGZvciBEZWNyeXB0b3I6OkRlY3J5cHRBbmREZWNvZGVWaWRlbygpLgotICB2b2lkIERlbGl2ZXJGcmFtZShpbnQgYnVmZmVyX3NpemUsCi0gICAgICAgICAgICAgICAgICAgIERlY3J5cHRvcjo6U3RhdHVzIHN0YXR1cywKKyAgdm9pZCBEZWxpdmVyRnJhbWUoaW50IGJ1ZmZlcl9zaXplLCBEZWNyeXB0b3I6OlN0YXR1cyBzdGF0dXMsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKTsKIAogICAvLyBDYWxsYmFjayBmb3IgdGhlIHxkZWNyeXB0b3JffCB0byBub3RpZnkgdGhpcyBvYmplY3QgdGhhdCBhIG5ldyBrZXkgaGFzIGJlZW4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9mYWtlX3ZpZGVvX2RlY29kZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9mYWtlX3ZpZGVvX2RlY29kZXIuaAppbmRleCBmZTliZWM0Li5mOTc2MDdmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZmFrZV92aWRlb19kZWNvZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2Zha2VfdmlkZW9fZGVjb2Rlci5oCkBAIC0zOSwxNyArMzksMTQgQEAKICAgLy8gQ29uc3RydWN0cyBhbiBvYmplY3Qgd2l0aCBhIGRlY29kaW5nIGRlbGF5IG9mIHxkZWNvZGluZ19kZWxheXwgZnJhbWVzLgogICAvLyB8Ynl0ZXNfZGVjb2RlZF9jYnwgaXMgY2FsbGVkIGFmdGVyIGVhY2ggZGVjb2RlLiBUaGUgc3VtIG9mIHRoZSBieXRlCiAgIC8vIGNvdW50IG92ZXIgYWxsIGNhbGxzIHdpbGwgYmUgZXF1YWwgdG8gdG90YWxfYnl0ZXNfZGVjb2RlZCgpLgotICBGYWtlVmlkZW9EZWNvZGVyKGludCBkZWNvZGluZ19kZWxheSwKLSAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3BhcmFsbGVsX2RlY29kaW5nX3JlcXVlc3RzLAorICBGYWtlVmlkZW9EZWNvZGVyKGludCBkZWNvZGluZ19kZWxheSwgaW50IG1heF9wYXJhbGxlbF9kZWNvZGluZ19yZXF1ZXN0cywKICAgICAgICAgICAgICAgICAgICBjb25zdCBCeXRlc0RlY29kZWRDQiYgYnl0ZXNfZGVjb2RlZF9jYik7CiAgIH5GYWtlVmlkZW9EZWNvZGVyKCkgT1ZFUlJJREU7CiAKICAgLy8gVmlkZW9EZWNvZGVyIGltcGxlbWVudGF0aW9uLgogICBzdGQ6OnN0cmluZyBHZXREaXNwbGF5TmFtZSgpIGNvbnN0IE9WRVJSSURFOwotICB2b2lkIEluaXRpYWxpemUoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsCi0gICAgICAgICAgICAgICAgICBib29sIGxvd19kZWxheSwKLSAgICAgICAgICAgICAgICAgIENkbUNvbnRleHQqIGNkbV9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgY29uc3QgSW5pdENCJiBpbml0X2NiLAorICB2b2lkIEluaXRpYWxpemUoY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBjb25maWcsIGJvb2wgbG93X2RlbGF5LAorICAgICAgICAgICAgICAgICAgQ2RtQ29udGV4dCogY2RtX2NvbnRleHQsIGNvbnN0IEluaXRDQiYgaW5pdF9jYiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IE91dHB1dENCJiBvdXRwdXRfY2IpIE9WRVJSSURFOwogICB2b2lkIERlY29kZShjb25zdCBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+JiBidWZmZXIsCiAgICAgICAgICAgICAgIGNvbnN0IERlY29kZUNCJiBkZWNvZGVfY2IpIE9WRVJSSURFOwpAQCAtODUsOCArODIsNyBAQAogICB9OwogCiAgIC8vIENhbGxiYWNrIGZvciB1cGRhdGluZyB8dG90YWxfYnl0ZXNfZGVjb2RlZF98LgotICB2b2lkIE9uRnJhbWVEZWNvZGVkKGludCBidWZmZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWNvZGVDQiYgZGVjb2RlX2NiLAorICB2b2lkIE9uRnJhbWVEZWNvZGVkKGludCBidWZmZXJfc2l6ZSwgY29uc3QgRGVjb2RlQ0ImIGRlY29kZV9jYiwKICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVTdGF0dXMgc3RhdHVzKTsKIAogICAvLyBSdW5zIHxkZWNvZGVfY2J8IG9yIHB1dHMgaXQgdG8gfGhlbGRfZGVjb2RlX2NhbGxiYWNrc198IGRlcGVuZGluZyBvbgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9maWxlX2RhdGFfc291cmNlLmgKaW5kZXggM2ZhMDA4ZC4uNjcyOTM5YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2ZpbGVfZGF0YV9zb3VyY2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZmlsZV9kYXRhX3NvdXJjZS5oCkBAIC0zMCw5ICszMCw3IEBACiAgIC8vIEltcGxlbWVudGF0aW9uIG9mIERhdGFTb3VyY2UuCiAgIHZvaWQgU3RvcCgpIE9WRVJSSURFOwogICB2b2lkIEFib3J0KCkgT1ZFUlJJREU7Ci0gIHZvaWQgUmVhZChpbnQ2NF90IHBvc2l0aW9uLAotICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICB1aW50OF90KiBkYXRhLAorICB2b2lkIFJlYWQoaW50NjRfdCBwb3NpdGlvbiwgaW50IHNpemUsIHVpbnQ4X3QqIGRhdGEsCiAgICAgICAgICAgICBjb25zdCBEYXRhU291cmNlOjpSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwogICBib29sIEdldFNpemUoaW50NjRfdCogc2l6ZV9vdXQpIE9WRVJSSURFOwogICBib29sIElzU3RyZWFtaW5nKCkgT1ZFUlJJREU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZnJhbWVfcHJvY2Vzc29yLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvZnJhbWVfcHJvY2Vzc29yLmgKaW5kZXggZjRmZWY5OS4uMDZjYWExZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2ZyYW1lX3Byb2Nlc3Nvci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9mcmFtZV9wcm9jZXNzb3IuaApAQCAtMTE1LDggKzExNSw3IEBACiAgIC8vIG5vcm1hbGx5IGJlIGRpc2NhcmRlZCwgfGF1ZGlvX3ByZXJvbGxfYnVmZmVyX3wgd2lsbCBiZSBzZXQgdG8gfGJ1ZmZlcnwgYW5kCiAgIC8vIHRoZSBtZXRob2Qgd2lsbCByZXR1cm4gZmFsc2UuCiAgIGJvb2wgSGFuZGxlUGFydGlhbEFwcGVuZFdpbmRvd1RyaW1taW5nKAotICAgICAgYmFzZTo6VGltZURlbHRhIGFwcGVuZF93aW5kb3dfc3RhcnQsCi0gICAgICBiYXNlOjpUaW1lRGVsdGEgYXBwZW5kX3dpbmRvd19lbmQsCisgICAgICBiYXNlOjpUaW1lRGVsdGEgYXBwZW5kX3dpbmRvd19zdGFydCwgYmFzZTo6VGltZURlbHRhIGFwcGVuZF93aW5kb3dfZW5kLAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+JiBidWZmZXIpOwogCiAgIC8vIEhlbHBlciB0aGF0IHByb2Nlc3NlcyBvbmUgZnJhbWUgd2l0aCB0aGUgY29kZWQgZnJhbWUgcHJvY2Vzc2luZyBhbGdvcml0aG0uCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvaDI2NF9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9oMjY0X3BhcnNlci5oCmluZGV4IGIzZjdlYzAuLjllZTQ0YmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9oMjY0X3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9oMjY0X3BhcnNlci5oCkBAIC0xNDQsOCArMTQ0LDggQEAKICAgaW50IGZyYW1lX2Nyb3BfYm90dG9tX29mZnNldDsKIAogICBib29sIHZ1aV9wYXJhbWV0ZXJzX3ByZXNlbnRfZmxhZzsKLSAgaW50IHNhcl93aWR0aDsgICAgLy8gU2V0IHRvIDAgd2hlbiBub3Qgc3BlY2lmaWVkLgotICBpbnQgc2FyX2hlaWdodDsgICAvLyBTZXQgdG8gMCB3aGVuIG5vdCBzcGVjaWZpZWQuCisgIGludCBzYXJfd2lkdGg7ICAgLy8gU2V0IHRvIDAgd2hlbiBub3Qgc3BlY2lmaWVkLgorICBpbnQgc2FyX2hlaWdodDsgIC8vIFNldCB0byAwIHdoZW4gbm90IHNwZWNpZmllZC4KICAgYm9vbCBiaXRzdHJlYW1fcmVzdHJpY3Rpb25fZmxhZzsKICAgaW50IG1heF9udW1fcmVvcmRlcl9mcmFtZXM7CiAgIGludCBtYXhfZGVjX2ZyYW1lX2J1ZmZlcmluZzsKQEAgLTIzNCwxMCArMjM0LDcgQEAKIHN0cnVjdCBNRURJQV9FWFBPUlQgSDI2NFNsaWNlSGVhZGVyIHsKICAgSDI2NFNsaWNlSGVhZGVyKCk7CiAKLSAgZW51bSB7Ci0gICAga1JlZkxpc3RTaXplID0gMzIsCi0gICAga1JlZkxpc3RNb2RTaXplID0ga1JlZkxpc3RTaXplCi0gIH07CisgIGVudW0geyBrUmVmTGlzdFNpemUgPSAzMiwga1JlZkxpc3RNb2RTaXplID0ga1JlZkxpc3RTaXplIH07CiAKICAgZW51bSBUeXBlIHsKICAgICBrUFNsaWNlID0gMCwKQEAgLTI1MywxMSArMjUwLDExIEBACiAgIGJvb2wgSXNTUFNsaWNlKCkgY29uc3Q7CiAgIGJvb2wgSXNTSVNsaWNlKCkgY29uc3Q7CiAKLSAgYm9vbCBpZHJfcGljX2ZsYWc7ICAgICAgIC8vIGZyb20gTkFMIGhlYWRlcgotICBpbnQgbmFsX3JlZl9pZGM7ICAgICAgICAgLy8gZnJvbSBOQUwgaGVhZGVyCisgIGJvb2wgaWRyX3BpY19mbGFnOyAgICAgICAgIC8vIGZyb20gTkFMIGhlYWRlcgorICBpbnQgbmFsX3JlZl9pZGM7ICAgICAgICAgICAvLyBmcm9tIE5BTCBoZWFkZXIKICAgY29uc3QgdWludDhfdCogbmFsdV9kYXRhOyAgLy8gZnJvbSBOQUwgaGVhZGVyCi0gIG9mZl90IG5hbHVfc2l6ZTsgICAgICAgICAvLyBmcm9tIE5BTCBoZWFkZXIKLSAgb2ZmX3QgaGVhZGVyX2JpdF9zaXplOyAgIC8vIGNhbGN1bGF0ZWQKKyAgb2ZmX3QgbmFsdV9zaXplOyAgICAgICAgICAgLy8gZnJvbSBOQUwgaGVhZGVyCisgIG9mZl90IGhlYWRlcl9iaXRfc2l6ZTsgICAgIC8vIGNhbGN1bGF0ZWQKIAogICBpbnQgZmlyc3RfbWJfaW5fc2xpY2U7CiAgIGludCBzbGljZV90eXBlOwpAQCAtMzU4LDE5ICszNTUsMTUgQEAKICAgLy8gLSB8Km9mZnNldHwgaXMgYmV0d2VlbiAwIGFuZCB8ZGF0YV9zaXplfCBpbmNsdWRlZC4KICAgLy8gICBJdCBpcyBzdHJpY3RseSBsZXNzIHRoYW4gfGRhdGFfc2l6ZXwgaWYgfGRhdGFfc2l6ZXwgPiAwLgogICAvLyAtIHwqc3RhcnRfY29kZV9zaXplfCBpcyBlaXRoZXIgMCwgMyBvciA0LgotICBzdGF0aWMgYm9vbCBGaW5kU3RhcnRDb2RlKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3QgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90KiBvZmZzZXQsCisgIHN0YXRpYyBib29sIEZpbmRTdGFydENvZGUoY29uc3QgdWludDhfdCogZGF0YSwgb2ZmX3QgZGF0YV9zaXplLCBvZmZfdCogb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90KiBzdGFydF9jb2RlX3NpemUpOwogCiAgIC8vIFdyYXBwZXIgZm9yIEZpbmRTdGFydENvZGUoKSB0aGF0IHNraXBzIG92ZXIgc3RhcnQgY29kZXMgdGhhdAogICAvLyBtYXkgYXBwZWFyIGluc2lkZSBvZiB8ZW5jcnlwdGVkX3Jhbmdlc198LgogICAvLyBSZXR1cm5zIHRydWUgaWYgYSBzdGFydCBjb2RlIHdhcyBmb3VuZC4gT3RoZXJ3aXNlIHJldHVybnMgZmFsc2UuCi0gIHN0YXRpYyBib29sIEZpbmRTdGFydENvZGVJbkNsZWFyUmFuZ2VzKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IGRhdGFfc2l6ZSwKKyAgc3RhdGljIGJvb2wgRmluZFN0YXJ0Q29kZUluQ2xlYXJSYW5nZXMoY29uc3QgdWludDhfdCogZGF0YSwgb2ZmX3QgZGF0YV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYW5nZXM8Y29uc3QgdWludDhfdCo+JiByYW5nZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90KiBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90KiBzdGFydF9jb2RlX3NpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZfdCogb2Zmc2V0LCBvZmZfdCogc3RhcnRfY29kZV9zaXplKTsKIAogICBzdGF0aWMgVmlkZW9Db2RlY1Byb2ZpbGUgUHJvZmlsZUlEQ1RvVmlkZW9Db2RlY1Byb2ZpbGUoaW50IHByb2ZpbGVfaWRjKTsKIApAQCAtMzgzLDggKzM3Niw3IEBACiAgIC8vIHxzdWJzYW1wbGVzfCBjb250YWlucyBpbmZvcm1hdGlvbiBhYm91dCB3aGF0IHBhcnRzIG9mIHxzdHJlYW18IGFyZQogICAvLyBlbmNyeXB0ZWQuCiAgIHZvaWQgU2V0U3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHN0cmVhbSwgb2ZmX3Qgc3RyZWFtX3NpemUpOwotICB2b2lkIFNldEVuY3J5cHRlZFN0cmVhbShjb25zdCB1aW50OF90KiBzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG9mZl90IHN0cmVhbV9zaXplLAorICB2b2lkIFNldEVuY3J5cHRlZFN0cmVhbShjb25zdCB1aW50OF90KiBzdHJlYW0sIG9mZl90IHN0cmVhbV9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4mIHN1YnNhbXBsZXMpOwogCiAgIC8vIFJlYWQgdGhlIHN0cmVhbSB0byBmaW5kIHRoZSBuZXh0IE5BTFUsIGlkZW50aWZ5IGl0IGFuZCByZXR1cm4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9oMjY0X3RvX2FubmV4X2JfYml0c3RyZWFtX2NvbnZlcnRlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmgKaW5kZXggNWY4Y2VjNC4uOTg5OThhOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2gyNjRfdG9fYW5uZXhfYl9iaXRzdHJlYW1fY29udmVydGVyLmgKQEAgLTY5LDggKzY5LDcgQEAKICAgLy8gICB0byBieXRlc3RyZWFtIGZvcm1hdCwgb3IgMCBpZiBjb3VsZCBub3QgZGV0ZXJtaW5lIHRoZSBzaXplIG9mCiAgIC8vICAgdGhlIG91dHB1dCBidWZmZXIgZnJvbSB0aGUgZGF0YSBpbiB8aW5wdXR8IGFuZCB8YXZjX2NvbmZpZ3wuCiAgIHVpbnQzMl90IENhbGN1bGF0ZU5lZWRlZE91dHB1dEJ1ZmZlclNpemUoCi0gICAgICBjb25zdCB1aW50OF90KiBpbnB1dCwKLSAgICAgIHVpbnQzMl90IGlucHV0X3NpemUsCisgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCwgdWludDMyX3QgaW5wdXRfc2l6ZSwKICAgICAgIGNvbnN0IG1wNDo6QVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQqIGF2Y19jb25maWcpIGNvbnN0OwogCiAgIC8vIENvbnZlcnRBVkNEZWNvZGVyQ29uZmlnVG9CeXRlU3RyZWFtIGNvbnZlcnRzIHRoZQpAQCAtOTQsOCArOTMsNyBAQAogICAvLyAgICBmYWxzZSBpZiBjb252ZXJzaW9uIG5vdCBzdWNjZXNzZnVsICh8b3V0cHV0X3NpemV8IHdpbGwgaG9sZCB0aGUgYW1vdW50CiAgIC8vICAgICAgICAgIG9mIGNvbnZlcnRlZCBkYXRhKQogICBib29sIENvbnZlcnRBVkNEZWNvZGVyQ29uZmlnVG9CeXRlU3RyZWFtKAotICAgICAgY29uc3QgbXA0OjpBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCYgYXZjX2NvbmZpZywKLSAgICAgIHVpbnQ4X3QqIG91dHB1dCwKKyAgICAgIGNvbnN0IG1wNDo6QVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQmIGF2Y19jb25maWcsIHVpbnQ4X3QqIG91dHB1dCwKICAgICAgIHVpbnQzMl90KiBvdXRwdXRfc2l6ZSk7CiAKICAgLy8gQ29udmVydE5hbFVuaXRTdHJlYW1Ub0J5dGVTdHJlYW0gY29udmVydHMgdGhlIE5BTCB1bml0IGZyb20gTVA0IGZvcm1hdApAQCAtMTIyLDEwICsxMjAsOCBAQAogICAvLyAgICBmYWxzZSBpZiBjb252ZXJzaW9uIG5vdCBzdWNjZXNzZnVsIChvdXRwdXRfc2l6ZSB3aWxsIGhvbGQgdGhlIGFtb3VudAogICAvLyAgICAgICAgICBvZiBjb252ZXJ0ZWQgZGF0YSkKICAgYm9vbCBDb252ZXJ0TmFsVW5pdFN0cmVhbVRvQnl0ZVN0cmVhbSgKLSAgICAgIGNvbnN0IHVpbnQ4X3QqIGlucHV0LAotICAgICAgdWludDMyX3QgaW5wdXRfc2l6ZSwKLSAgICAgIGNvbnN0IG1wNDo6QVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQqIGF2Y19jb25maWcsCi0gICAgICB1aW50OF90KiBvdXRwdXQsCisgICAgICBjb25zdCB1aW50OF90KiBpbnB1dCwgdWludDMyX3QgaW5wdXRfc2l6ZSwKKyAgICAgIGNvbnN0IG1wNDo6QVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQqIGF2Y19jb25maWcsIHVpbnQ4X3QqIG91dHB1dCwKICAgICAgIHVpbnQzMl90KiBvdXRwdXRfc2l6ZSk7CiAKICBwcml2YXRlOgpAQCAtMTM2LDggKzEzMiw3IEBACiAgIC8vIHdyaXR0ZW4uIE9uIGEgc3VjY2Vzc2Z1bCB3cml0ZSwgfCpvdXR8IGlzIHVwZGF0ZWQgdG8gcG9pbnQgdG8gdGhlIGZpcnN0CiAgIC8vIGJ5dGUgYWZ0ZXIgdGhlIGRhdGEgdGhhdCB3YXMgd3JpdHRlbi4gfCpvdXRfc2l6ZXwgaXMgdXBkYXRlZCB0byByZWZsZWN0CiAgIC8vIHRoZSBuZXcgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgaW4gfCpvdXR8LgotICBib29sIFdyaXRlUGFyYW1TZXQoY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIHBhcmFtX3NldCwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QqKiBvdXQsCisgIGJvb2wgV3JpdGVQYXJhbVNldChjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgcGFyYW1fc2V0LCB1aW50OF90Kiogb3V0LAogICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QqIG91dF9zaXplKSBjb25zdDsKIAogICAvLyBGbGFnIGZvciBpbmRpY2F0aW5nIHdoZXRoZXIgZ2xvYmFsIHBhcmFtZXRlciBzZXRzIGhhdmUgYmVlbiBwcm9jZXNzZWQuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvaDI2NV9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9oMjY1X3BhcnNlci5oCmluZGV4IDFkMTUyMzEuLjFjMjRkZmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9oMjY1X3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9oMjY1X3BhcnNlci5oCkBAIC0xMTAsOCArMTEwLDcgQEAKICAgLy8gfHN1YnNhbXBsZXN8IGNvbnRhaW5zIGluZm9ybWF0aW9uIGFib3V0IHdoYXQgcGFydHMgb2YgfHN0cmVhbXwgYXJlCiAgIC8vIGVuY3J5cHRlZC4KICAgdm9pZCBTZXRTdHJlYW0oY29uc3QgdWludDhfdCogc3RyZWFtLCBvZmZfdCBzdHJlYW1fc2l6ZSk7Ci0gIHZvaWQgU2V0RW5jcnlwdGVkU3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmX3Qgc3RyZWFtX3NpemUsCisgIHZvaWQgU2V0RW5jcnlwdGVkU3RyZWFtKGNvbnN0IHVpbnQ4X3QqIHN0cmVhbSwgb2ZmX3Qgc3RyZWFtX3NpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5PiYgc3Vic2FtcGxlcyk7CiAKICAgLy8gUmVhZCB0aGUgc3RyZWFtIHRvIGZpbmQgdGhlIG5leHQgTkFMVSwgaWRlbnRpZnkgaXQgYW5kIHJldHVybgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2l2Zl9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9pdmZfcGFyc2VyLmgKaW5kZXggMmEyNzI2NC4uODBiN2E0YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL2l2Zl9wYXJzZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvaXZmX3BhcnNlci5oCkBAIC01OSw4ICs1OSw3IEBACiAKICAgLy8gSW5pdGlhbGl6ZXMgdGhlIHBhcnNlciBmb3IgSVZGIHxzdHJlYW18IHdpdGggc2l6ZSB8c2l6ZXwgYW5kIHBhcnNlcyB0aGUKICAgLy8gZmlsZSBoZWFkZXIuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgotICBib29sIEluaXRpYWxpemUoY29uc3QgdWludDhfdCogc3RyZWFtLAotICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsCisgIGJvb2wgSW5pdGlhbGl6ZShjb25zdCB1aW50OF90KiBzdHJlYW0sIHNpemVfdCBzaXplLAogICAgICAgICAgICAgICAgICAgSXZmRmlsZUhlYWRlciogZmlsZV9oZWFkZXIpOwogCiAgIC8vIFBhcnNlcyB0aGUgbmV4dCBmcmFtZS4gUmV0dXJucyB0cnVlIGlmIHRoZSBuZXh0IGZyYW1lIGlzIHBhcnNlZCB3aXRob3V0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvanBlZ19wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9qcGVnX3BhcnNlci5oCmluZGV4IGVjMjI0OWMuLmIwMmE5MWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9qcGVnX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9qcGVnX3BhcnNlci5oCkBAIC0xMDksMTUgKzEwOSwxMyBAQAogLy8gUGFyc2VzIEpQRUcgcGljdHVyZSBpbiB8YnVmZmVyfCB3aXRoIHxsZW5ndGh8LiAgUmV0dXJucyB0cnVlIGlmZiBoZWFkZXIgaXMKIC8vIHZhbGlkIGFuZCBKUEVHIGJhc2VsaW5lIHNlcXVlbnRpYWwgcHJvY2VzcyBpcyBwcmVzZW50LiBJZiBwYXJzZWQKIC8vIHN1Y2Nlc3NmdWxseSwgfHJlc3VsdHwgaXMgdGhlIHBhcnNlZCByZXN1bHQuCi1NRURJQV9FWFBPUlQgYm9vbCBQYXJzZUpwZWdQaWN0dXJlKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwKK01FRElBX0VYUE9SVCBib29sIFBhcnNlSnBlZ1BpY3R1cmUoY29uc3QgdWludDhfdCogYnVmZmVyLCBzaXplX3QgbGVuZ3RoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGVnUGFyc2VSZXN1bHQqIHJlc3VsdCk7CiAKIC8vIFBhcnNlcyB0aGUgZmlyc3QgaW1hZ2Ugb2YgSlBFRyBzdHJlYW0gaW4gfGJ1ZmZlcnwgd2l0aCB8bGVuZ3RofC4gIFJldHVybnMKIC8vIHRydWUgaWZmIGhlYWRlciBpcyB2YWxpZCBhbmQgSlBFRyBiYXNlbGluZSBzZXF1ZW50aWFsIHByb2Nlc3MgaXMgcHJlc2VudC4KIC8vIElmIHBhcnNlZCBzdWNjZXNzZnVsbHksIHxyZXN1bHR8IGlzIHRoZSBwYXJzZWQgcmVzdWx0LgotTUVESUFfRVhQT1JUIGJvb2wgUGFyc2VKcGVnU3RyZWFtKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuZ3RoLAorTUVESUFfRVhQT1JUIGJvb2wgUGFyc2VKcGVnU3RyZWFtKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKcGVnUGFyc2VSZXN1bHQqIHJlc3VsdCk7CiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL21lbW9yeV9kYXRhX3NvdXJjZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL21lbW9yeV9kYXRhX3NvdXJjZS5oCmluZGV4IGE5Y2Q2MTIuLmRiYjVhOTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9tZW1vcnlfZGF0YV9zb3VyY2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvbWVtb3J5X2RhdGFfc291cmNlLmgKQEAgLTIyLDkgKzIyLDcgQEAKICAgfk1lbW9yeURhdGFTb3VyY2UoKSBmaW5hbDsKIAogICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBEYXRhU291cmNlLgotICB2b2lkIFJlYWQoaW50NjRfdCBwb3NpdGlvbiwKLSAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgdWludDhfdCogZGF0YSwKKyAgdm9pZCBSZWFkKGludDY0X3QgcG9zaXRpb24sIGludCBzaXplLCB1aW50OF90KiBkYXRhLAogICAgICAgICAgICAgY29uc3QgRGF0YVNvdXJjZTo6UmVhZENCJiByZWFkX2NiKSBmaW5hbDsKICAgdm9pZCBTdG9wKCkgZmluYWw7CiAgIHZvaWQgQWJvcnQoKSBmaW5hbDsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9waXBlbGluZV9jb250cm9sbGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvcGlwZWxpbmVfY29udHJvbGxlci5oCmluZGV4IDlhNTk1MjguLjM0MGM0NTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9waXBlbGluZV9jb250cm9sbGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3BpcGVsaW5lX2NvbnRyb2xsZXIuaApAQCAtNTIsOCArNTIsNyBAQAogICAvLyAgICAgaW4gUElQRUxJTkVfT0sgb3IgaXRzIGVycm9yIGNhbGxiYWNrIGlzIGNhbGxlZC4KICAgUGlwZWxpbmVDb250cm9sbGVyKFBpcGVsaW5lKiBwaXBlbGluZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlbmRlcmVyRmFjdG9yeUNCJiByZW5kZXJlcl9mYWN0b3J5X2NiLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2Vla2VkQ0ImIHNlZWtlZF9jYiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN1c3BlbmRlZENCJiBzdXNwZW5kZWRfY2IsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZWVrZWRDQiYgc2Vla2VkX2NiLCBjb25zdCBTdXNwZW5kZWRDQiYgc3VzcGVuZGVkX2NiLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgZXJyb3JfY2IpOwogICB+UGlwZWxpbmVDb250cm9sbGVyKCk7CiAKQEAgLTY4LDkgKzY3LDcgQEAKICAgLy8gT3RoZXJ3aXNlIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbWVkaWEgZGF0YSBtYXkgaGF2ZSBjaGFuZ2VkLgogICAvLwogICAvLyBUaGUgcmVtYWluaW5nIHBhcmFtZXRlcnMgYXJlIGp1c3QgcGFzc2VkIGRpcmVjdGx5IHRvIHBpcGVsaW5lXy5TdGFydCgpLgotICB2b2lkIFN0YXJ0KERlbXV4ZXIqIGRlbXV4ZXIsCi0gICAgICAgICAgICAgUGlwZWxpbmU6OkNsaWVudCogY2xpZW50LAotICAgICAgICAgICAgIGJvb2wgaXNfc3RyZWFtaW5nLAorICB2b2lkIFN0YXJ0KERlbXV4ZXIqIGRlbXV4ZXIsIFBpcGVsaW5lOjpDbGllbnQqIGNsaWVudCwgYm9vbCBpc19zdHJlYW1pbmcsCiAgICAgICAgICAgICAgYm9vbCBpc19zdGF0aWMpOwogCiAgIC8vIFJlcXVlc3QgYSBzZWVrIHRvIHx0aW1lfC4gSWYgfHRpbWVfdXBkYXRlZHwgaXMgdHJ1ZSwgdGhlbiB0aGUgZXZlbnR1YWwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9hdS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9hdS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWYyYmQ5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmNjCkBAIC0wLDAgKzEsMjc1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfYXUuaCIKKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZW5kaWFuX3V0aWwuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS90aW1lc3RhbXBfY29uc3RhbnRzLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfcGFyc2VyLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKK25hbWVzcGFjZSB7CisKK2Jvb2wgUmVhZEJ5dGVzKHVpbnQ2NCBvZmZzZXQsIHNpemVfdCBzaXplLCB1aW50OCogYnVmZmVyLAorICAgICAgICAgICAgICAgU2hlbGxEYXRhU291cmNlUmVhZGVyKiByZWFkZXIpIHsKKyAgaWYgKHJlYWRlci0+QmxvY2tpbmdSZWFkKG9mZnNldCwgc2l6ZSwgYnVmZmVyKSAhPSBzaXplKSB7CisgICAgRExPRyhFUlJPUikgPDwgInVuYWJsZSB0byBkb3dubG9hZCBBVSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyA9PT09IFNoZWxsRW5kT2ZTdHJlYW1BVSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTaGVsbEVuZE9mU3RyZWFtQVUgOiBwdWJsaWMgU2hlbGxBVSB7CisgcHVibGljOgorICBTaGVsbEVuZE9mU3RyZWFtQVUoVHlwZSB0eXBlLCBUaW1lRGVsdGEgdGltZXN0YW1wKQorICAgICAgOiB0eXBlXyh0eXBlKSwgdGltZXN0YW1wXyh0aW1lc3RhbXApLCBkdXJhdGlvbl8oa0luZmluaXRlRHVyYXRpb24pIHt9CisKKyBwcml2YXRlOgorICBib29sIElzRW5kT2ZTdHJlYW0oKSBjb25zdCBPVkVSUklERSB7IHJldHVybiB0cnVlOyB9CisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KKyAgYm9vbCBSZWFkKFNoZWxsRGF0YVNvdXJjZVJlYWRlciogcmVhZGVyLCBEZWNvZGVyQnVmZmVyKiBidWZmZXIpIE9WRVJSSURFIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIFR5cGUgR2V0VHlwZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHR5cGVfOyB9CisgIGJvb2wgSXNLZXlmcmFtZSgpIGNvbnN0IE9WRVJSSURFIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJvb2wgQWRkUHJlcGVuZCgpIGNvbnN0IE9WRVJSSURFIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHNpemVfdCBHZXRTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gMDsgfQorICBzaXplX3QgR2V0TWF4U2l6ZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIDA7IH0KKyAgVGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHRpbWVzdGFtcF87IH0KKyAgVGltZURlbHRhIEdldER1cmF0aW9uKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gZHVyYXRpb25fOyB9CisgIHZvaWQgU2V0RHVyYXRpb24oVGltZURlbHRhIGR1cmF0aW9uKSBPVkVSUklERSB7IGR1cmF0aW9uXyA9IGR1cmF0aW9uOyB9CisgIHZvaWQgU2V0VGltZXN0YW1wKFRpbWVEZWx0YSB0aW1lc3RhbXApIE9WRVJSSURFIHsgdGltZXN0YW1wXyA9IHRpbWVzdGFtcDsgfQorCisgIFR5cGUgdHlwZV87CisgIFRpbWVEZWx0YSB0aW1lc3RhbXBfOworICBUaW1lRGVsdGEgZHVyYXRpb25fOworfTsKKworLy8gPT09PSBTaGVsbEF1ZGlvQVUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTaGVsbEF1ZGlvQVUgOiBwdWJsaWMgU2hlbGxBVSB7CisgcHVibGljOgorICBTaGVsbEF1ZGlvQVUodWludDY0IG9mZnNldCwgc2l6ZV90IHNpemUsIHNpemVfdCBwcmVwZW5kX3NpemUsCisgICAgICAgICAgICAgICBib29sIGlzX2tleWZyYW1lLCBUaW1lRGVsdGEgdGltZXN0YW1wLCBUaW1lRGVsdGEgZHVyYXRpb24sCisgICAgICAgICAgICAgICBTaGVsbFBhcnNlciogcGFyc2VyKTsKKworIHByaXZhdGU6CisgIGJvb2wgSXNFbmRPZlN0cmVhbSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IE9WRVJSSURFIHsKKyAgICByZXR1cm4gb2Zmc2V0XyAhPSAwICYmIHNpemVfICE9IDAgJiYgdGltZXN0YW1wXyAhPSBrTm9UaW1lc3RhbXA7CisgIH0KKyAgYm9vbCBSZWFkKFNoZWxsRGF0YVNvdXJjZVJlYWRlciogcmVhZGVyLCBEZWNvZGVyQnVmZmVyKiBidWZmZXIpIE9WRVJSSURFOworICBUeXBlIEdldFR5cGUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBEZW11eGVyU3RyZWFtOjpBVURJTzsgfQorICBib29sIElzS2V5ZnJhbWUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBpc19rZXlmcmFtZV87IH0KKyAgYm9vbCBBZGRQcmVwZW5kKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorICBzaXplX3QgR2V0U2l6ZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHNpemVfOyB9CisgIHNpemVfdCBHZXRNYXhTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gc2l6ZV8gKyBwcmVwZW5kX3NpemVfOyB9CisgIFRpbWVEZWx0YSBHZXRUaW1lc3RhbXAoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiB0aW1lc3RhbXBfOyB9CisgIFRpbWVEZWx0YSBHZXREdXJhdGlvbigpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGR1cmF0aW9uXzsgfQorICB2b2lkIFNldER1cmF0aW9uKFRpbWVEZWx0YSBkdXJhdGlvbikgT1ZFUlJJREUgeyBkdXJhdGlvbl8gPSBkdXJhdGlvbjsgfQorICB2b2lkIFNldFRpbWVzdGFtcChUaW1lRGVsdGEgdGltZXN0YW1wKSBPVkVSUklERSB7IHRpbWVzdGFtcF8gPSB0aW1lc3RhbXA7IH0KKworICB1aW50NjQgb2Zmc2V0XzsKKyAgc2l6ZV90IHNpemVfOworICBzaXplX3QgcHJlcGVuZF9zaXplXzsKKyAgYm9vbCBpc19rZXlmcmFtZV87CisgIFRpbWVEZWx0YSB0aW1lc3RhbXBfOworICBUaW1lRGVsdGEgZHVyYXRpb25fOworICBTaGVsbFBhcnNlciogcGFyc2VyXzsKK307CisKK1NoZWxsQXVkaW9BVTo6U2hlbGxBdWRpb0FVKHVpbnQ2NCBvZmZzZXQsIHNpemVfdCBzaXplLCBzaXplX3QgcHJlcGVuZF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSwgVGltZURlbHRhIHRpbWVzdGFtcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YSBkdXJhdGlvbiwgU2hlbGxQYXJzZXIqIHBhcnNlcikKKyAgICA6IG9mZnNldF8ob2Zmc2V0KSwKKyAgICAgIHNpemVfKHNpemUpLAorICAgICAgcHJlcGVuZF9zaXplXyhwcmVwZW5kX3NpemUpLAorICAgICAgaXNfa2V5ZnJhbWVfKGlzX2tleWZyYW1lKSwKKyAgICAgIHRpbWVzdGFtcF8odGltZXN0YW1wKSwKKyAgICAgIGR1cmF0aW9uXyhkdXJhdGlvbiksCisgICAgICBwYXJzZXJfKHBhcnNlcikge30KKworYm9vbCBTaGVsbEF1ZGlvQVU6OlJlYWQoU2hlbGxEYXRhU291cmNlUmVhZGVyKiByZWFkZXIsIERlY29kZXJCdWZmZXIqIGJ1ZmZlcikgeworICBEQ0hFQ0tfTEUoc2l6ZV8gKyBwcmVwZW5kX3NpemVfLCBidWZmZXItPmRhdGFfc2l6ZSgpKTsKKyAgaWYgKCFSZWFkQnl0ZXMob2Zmc2V0Xywgc2l6ZV8sIGJ1ZmZlci0+d3JpdGFibGVfZGF0YSgpICsgcHJlcGVuZF9zaXplXywKKyAgICAgICAgICAgICAgICAgcmVhZGVyKSkKKyAgICByZXR1cm4gZmFsc2U7CisKKyAgaWYgKCFwYXJzZXJfLT5QcmVwZW5kKHRoaXMsIGJ1ZmZlcikpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAicHJlcGVuZCBmYWlsIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gPT09PSBTaGVsbFZpZGVvQVUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjbGFzcyBTaGVsbFZpZGVvQVUgOiBwdWJsaWMgU2hlbGxBVSB7CisgcHVibGljOgorICBTaGVsbFZpZGVvQVUodWludDY0IG9mZnNldCwgc2l6ZV90IHNpemUsIHNpemVfdCBwcmVwZW5kX3NpemUsCisgICAgICAgICAgICAgICB1aW50OCBsZW5ndGhfb2ZfbmFsdV9zaXplLCBib29sIGlzX2tleWZyYW1lLCBUaW1lRGVsdGEgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgVGltZURlbHRhIGR1cmF0aW9uLCBTaGVsbFBhcnNlciogcGFyc2VyKTsKKworIHByaXZhdGU6CisgIGJvb2wgSXNFbmRPZlN0cmVhbSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGZhbHNlOyB9CisgIGJvb2wgSXNWYWxpZCgpIGNvbnN0IE9WRVJSSURFIHsKKyAgICByZXR1cm4gb2Zmc2V0XyAhPSAwICYmIHNpemVfICE9IDAgJiYgdGltZXN0YW1wXyAhPSBrTm9UaW1lc3RhbXA7CisgIH0KKyAgYm9vbCBSZWFkKFNoZWxsRGF0YVNvdXJjZVJlYWRlciogcmVhZGVyLCBEZWNvZGVyQnVmZmVyKiBidWZmZXIpIE9WRVJSSURFOworICBUeXBlIEdldFR5cGUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBEZW11eGVyU3RyZWFtOjpWSURFTzsgfQorICBib29sIElzS2V5ZnJhbWUoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBpc19rZXlmcmFtZV87IH0KKyAgYm9vbCBBZGRQcmVwZW5kKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gaXNfa2V5ZnJhbWVfOyB9CisgIHNpemVfdCBHZXRTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gc2l6ZV87IH0KKyAgc2l6ZV90IEdldE1heFNpemUoKSBjb25zdCBPVkVSUklERSB7CisgICAgLy8gVE9ETyA6IFRoaXMgY29kZSBpcyBhIHByb29mIG9mIGNvbmNlcHQuIEl0IHNob3VsZCBiZSBmaXhlZAorICAgIC8vIHdpdGggbW9yZSByZWFzb25hYmxlIHZhbHVlIG9uY2Ugd2UgaGF2ZSBlbm91Z2ggZGF0YS4KKyAgICByZXR1cm4gc2l6ZV8gKyBwcmVwZW5kX3NpemVfICsgc2l6ZV8gLyAxMDI0ICsgMTAyNDsKKyAgfQorICBUaW1lRGVsdGEgR2V0VGltZXN0YW1wKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gdGltZXN0YW1wXzsgfQorICBUaW1lRGVsdGEgR2V0RHVyYXRpb24oKSBjb25zdCBPVkVSUklERSB7IHJldHVybiBkdXJhdGlvbl87IH0KKyAgdm9pZCBTZXREdXJhdGlvbihUaW1lRGVsdGEgZHVyYXRpb24pIE9WRVJSSURFIHsgZHVyYXRpb25fID0gZHVyYXRpb247IH0KKyAgdm9pZCBTZXRUaW1lc3RhbXAoVGltZURlbHRhIHRpbWVzdGFtcCkgT1ZFUlJJREUgeyB0aW1lc3RhbXBfID0gdGltZXN0YW1wOyB9CisKKyAgdWludDY0IG9mZnNldF87CisgIHNpemVfdCBzaXplXzsKKyAgc2l6ZV90IHByZXBlbmRfc2l6ZV87CisgIHVpbnQ4IGxlbmd0aF9vZl9uYWx1X3NpemVfOworICBib29sIGlzX2tleWZyYW1lXzsKKyAgVGltZURlbHRhIHRpbWVzdGFtcF87CisgIFRpbWVEZWx0YSBkdXJhdGlvbl87CisgIFNoZWxsUGFyc2VyKiBwYXJzZXJfOworfTsKKworU2hlbGxWaWRlb0FVOjpTaGVsbFZpZGVvQVUodWludDY0IG9mZnNldCwgc2l6ZV90IHNpemUsIHNpemVfdCBwcmVwZW5kX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCBsZW5ndGhfb2ZfbmFsdV9zaXplLCBib29sIGlzX2tleWZyYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhIHRpbWVzdGFtcCwgVGltZURlbHRhIGR1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hlbGxQYXJzZXIqIHBhcnNlcikKKyAgICA6IG9mZnNldF8ob2Zmc2V0KSwKKyAgICAgIHNpemVfKHNpemUpLAorICAgICAgcHJlcGVuZF9zaXplXyhwcmVwZW5kX3NpemUpLAorICAgICAgbGVuZ3RoX29mX25hbHVfc2l6ZV8obGVuZ3RoX29mX25hbHVfc2l6ZSksCisgICAgICBpc19rZXlmcmFtZV8oaXNfa2V5ZnJhbWUpLAorICAgICAgdGltZXN0YW1wXyh0aW1lc3RhbXApLAorICAgICAgZHVyYXRpb25fKGR1cmF0aW9uKSwKKyAgICAgIHBhcnNlcl8ocGFyc2VyKSB7CisgIENIRUNLX0xFKGxlbmd0aF9vZl9uYWx1X3NpemVfLCA0KTsKKyAgQ0hFQ0tfTkUobGVuZ3RoX29mX25hbHVfc2l6ZV8sIDMpOworfQorCitib29sIFNoZWxsVmlkZW9BVTo6UmVhZChTaGVsbERhdGFTb3VyY2VSZWFkZXIqIHJlYWRlciwgRGVjb2RlckJ1ZmZlciogYnVmZmVyKSB7CisgIHNpemVfdCBhdV9sZWZ0ID0gc2l6ZV87ICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5dGVzIGxlZnQgaW4gdGhlIEFVCisgIHVpbnQ2NCBhdV9vZmZzZXQgPSBvZmZzZXRfOyAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byByZWFkIGluIHRoZSByZWFkZXIKKyAgc2l6ZV90IGJ1Zl9sZWZ0ID0gYnVmZmVyLT5hbGxvY2F0ZWRfc2l6ZSgpOyAgLy8gYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyCisgIC8vIFRoZSBjdXJyZW50IHdyaXRlIHBvc2l0aW9uIGluIHRoZSBidWZmZXIKKyAgdWludDgqIGJ1ZiA9IGJ1ZmZlci0+d3JpdGFibGVfZGF0YSgpICsgcHJlcGVuZF9zaXplXzsKKworICAvLyBUaGUgTkFMVSBpcyBzdG9yZWQgYXMgW3NpemVdW2RhdGFdW3NpemVdW2RhdGFdLi4uLiBXZSBhcmUgZ29pbmcgdG8KKyAgLy8gdHJhbnNmb3JtIGl0IGludG8gW3N0YXJ0IGNvZGVdW2RhdGFdW3N0YXJ0IGNvZGVdW2RhdGFdLi4uLgorICAvLyBUaGUgbGVuZ3RoIG9mIHNpemUgaXMgaW5kaWNhdGVkIGJ5IGxlbmd0aF9vZl9uYWx1X3NpemVfCisgIHdoaWxlIChhdV9sZWZ0ID49IGxlbmd0aF9vZl9uYWx1X3NpemVfICYmIGJ1Zl9sZWZ0ID49IGtBbm5leEJTdGFydENvZGUpIHsKKyAgICB1aW50OCBzaXplX2J1Zls0XTsKKyAgICB1aW50MzIgbmFsX3NpemU7CisKKyAgICAvLyBTdG9yZSBbc3RhcnQgY29kZV0KKyAgICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDMyX2JpZ19lbmRpYW4oa0FubmV4QlN0YXJ0Q29kZSwgYnVmKTsKKyAgICBidWYgKz0ga0FubmV4QlN0YXJ0Q29kZVNpemU7CisgICAgYnVmX2xlZnQgLT0ga0FubmV4QlN0YXJ0Q29kZVNpemU7CisKKyAgICAvLyBSZWFkIFtzaXplXQorICAgIGlmICghUmVhZEJ5dGVzKGF1X29mZnNldCwgbGVuZ3RoX29mX25hbHVfc2l6ZV8sIHNpemVfYnVmLCByZWFkZXIpKQorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgYXVfb2Zmc2V0ICs9IGxlbmd0aF9vZl9uYWx1X3NpemVfOworICAgIGF1X2xlZnQgLT0gbGVuZ3RoX29mX25hbHVfc2l6ZV87CisKKyAgICBpZiAobGVuZ3RoX29mX25hbHVfc2l6ZV8gPT0gMSkgeworICAgICAgbmFsX3NpemUgPSBzaXplX2J1ZlswXTsKKyAgICB9IGVsc2UgaWYgKGxlbmd0aF9vZl9uYWx1X3NpemVfID09IDIpIHsKKyAgICAgIG5hbF9zaXplID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDE2X2JpZ19lbmRpYW4oc2l6ZV9idWYpOworICAgIH0gZWxzZSB7CisgICAgICBEQ0hFQ0tfRVEobGVuZ3RoX29mX25hbHVfc2l6ZV8sIDQpOworICAgICAgbmFsX3NpemUgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihzaXplX2J1Zik7CisgICAgfQorCisgICAgaWYgKGF1X2xlZnQgPCBuYWxfc2l6ZSB8fCBidWZfbGVmdCA8IG5hbF9zaXplKSBicmVhazsKKworICAgIC8vIFJlYWQgdGhlIFtkYXRhXSBmcm9tIHJlYWRlciBpbnRvIGJ1ZgorICAgIGlmICghUmVhZEJ5dGVzKGF1X29mZnNldCwgbmFsX3NpemUsIGJ1ZiwgcmVhZGVyKSkgcmV0dXJuIGZhbHNlOworCisgICAgYnVmICs9IG5hbF9zaXplOworICAgIGF1X29mZnNldCArPSBuYWxfc2l6ZTsKKyAgICBhdV9sZWZ0IC09IG5hbF9zaXplOworICAgIGJ1Zl9sZWZ0IC09IG5hbF9zaXplOworICB9CisKKyAgaWYgKGF1X2xlZnQgIT0gMCkgeworICAgIERMT0coRVJST1IpIDw8ICJjb3JydXB0ZWQgTkFMVSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgc2l6ZV8gPSBidWYgLSBidWZmZXItPndyaXRhYmxlX2RhdGEoKTsKKyAgYnVmZmVyLT5zaHJpbmtfdG8oc2l6ZV8pOworCisgIGlmICghcGFyc2VyXy0+UHJlcGVuZCh0aGlzLCBidWZmZXIpKSB7CisgICAgRExPRyhFUlJPUikgPDwgInByZXBlbmQgZmFpbCI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisvLyA9PT09IFNoZWxsQVUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTaGVsbEFVOjpTaGVsbEFVKCkge30KKworU2hlbGxBVTo6flNoZWxsQVUoKSB7fQorCisvLyBzdGF0aWMKK3Njb3BlZF9yZWZwdHI8U2hlbGxBVT4gU2hlbGxBVTo6Q3JlYXRlRW5kT2ZTdHJlYW1BVShEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGltZURlbHRhIHRpbWVzdGFtcCkgeworICByZXR1cm4gbmV3IFNoZWxsRW5kT2ZTdHJlYW1BVSh0eXBlLCB0aW1lc3RhbXApOworfQorCisvLyBzdGF0aWMKK3Njb3BlZF9yZWZwdHI8U2hlbGxBVT4gU2hlbGxBVTo6Q3JlYXRlQXVkaW9BVSgKKyAgICB1aW50NjQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHByZXBlbmRfc2l6ZSwgYm9vbCBpc19rZXlmcmFtZSwKKyAgICBUaW1lRGVsdGEgdGltZXN0YW1wLCBUaW1lRGVsdGEgZHVyYXRpb24sIFNoZWxsUGFyc2VyKiBwYXJzZXIpIHsKKyAgcmV0dXJuIG5ldyBTaGVsbEF1ZGlvQVUob2Zmc2V0LCBzaXplLCBwcmVwZW5kX3NpemUsIGlzX2tleWZyYW1lLCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uLCBwYXJzZXIpOworfQorCisvLyBzdGF0aWMKK3Njb3BlZF9yZWZwdHI8U2hlbGxBVT4gU2hlbGxBVTo6Q3JlYXRlVmlkZW9BVSgKKyAgICB1aW50NjQgb2Zmc2V0LCBzaXplX3Qgc2l6ZSwgc2l6ZV90IHByZXBlbmRfc2l6ZSwgdWludDggbGVuZ3RoX29mX25hbHVfc2l6ZSwKKyAgICBib29sIGlzX2tleWZyYW1lLCBUaW1lRGVsdGEgdGltZXN0YW1wLCBUaW1lRGVsdGEgZHVyYXRpb24sCisgICAgU2hlbGxQYXJzZXIqIHBhcnNlcikgeworICByZXR1cm4gbmV3IFNoZWxsVmlkZW9BVShvZmZzZXQsIHNpemUsIHByZXBlbmRfc2l6ZSwgbGVuZ3RoX29mX25hbHVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfa2V5ZnJhbWUsIHRpbWVzdGFtcCwgZHVyYXRpb24sIHBhcnNlcik7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfYXUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZTFkZmY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmgKQEAgLTAsMCArMSw3NCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfRklMVEVSU19TSEVMTF9BVV9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfRklMVEVSU19TSEVMTF9BVV9IXworCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCitjbGFzcyBTaGVsbFBhcnNlcjsKKworLy8gQW5uZXhCIHN0YXJ0IGNvZGUgaXMgNCBieXRlcyAweDAwMDAwMDAxIGJpZy1lbmRpYW4KK3N0YXRpYyBjb25zdCBpbnQga0FubmV4QlN0YXJ0Q29kZVNpemUgPSA0Oworc3RhdGljIGNvbnN0IHVpbnQzMiBrQW5uZXhCU3RhcnRDb2RlID0gMHgwMDAwMDAwMTsKKworLy8gVGhlIGJhc2ljIHVuaXQgb2YgY3VycmVuY3kgYmV0d2VlbiBTaGVsbERlbXV4ZXIgYW5kIFNoZWxsUGFyc2VyLCB0aGUgU2hlbGxBVQorLy8gZGVmaW5lcyBhbGwgbmVlZGVkIGluZm9ybWF0aW9uIGZvciBhIGdpdmVuIEFjY2Vzc1VuaXQgKEZyYW1lKSBvZiBlbmNvZGVkCisvLyBtZWRpYSBkYXRhLgorY2xhc3MgU2hlbGxBVSA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxTaGVsbEFVPiB7CisgcHVibGljOgorICB0eXBlZGVmIGJhc2U6OlRpbWVEZWx0YSBUaW1lRGVsdGE7CisgIHR5cGVkZWYgRGVtdXhlclN0cmVhbTo6VHlwZSBUeXBlOworCisgIHN0YXRpYyBzY29wZWRfcmVmcHRyPFNoZWxsQVU+IENyZWF0ZUVuZE9mU3RyZWFtQVUoVHlwZSB0eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRpbWVEZWx0YSB0aW1lc3RhbXApOworICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBDcmVhdGVBdWRpb0FVKAorICAgICAgdWludDY0IG9mZnNldCwgc2l6ZV90IHNpemUsIHNpemVfdCBwcmVwZW5kX3NpemUsIGJvb2wgaXNfa2V5ZnJhbWUsCisgICAgICBUaW1lRGVsdGEgdGltZXN0YW1wLCBUaW1lRGVsdGEgZHVyYXRpb24sIFNoZWxsUGFyc2VyKiBwYXJzZXIpOworICBzdGF0aWMgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBDcmVhdGVWaWRlb0FVKAorICAgICAgdWludDY0IG9mZnNldCwgc2l6ZV90IHNpemUsIHNpemVfdCBwcmVwZW5kX3NpemUsCisgICAgICB1aW50OCBsZW5ndGhfb2ZfbmFsdV9zaXplLCBib29sIGlzX2tleWZyYW1lLCBUaW1lRGVsdGEgdGltZXN0YW1wLAorICAgICAgVGltZURlbHRhIGR1cmF0aW9uLCBTaGVsbFBhcnNlciogcGFyc2VyKTsKKworICB2aXJ0dWFsIGJvb2wgSXNFbmRPZlN0cmVhbSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIElzVmFsaWQoKSBjb25zdCA9IDA7CisgIC8vIFJlYWQgYW4gQVUgZnJvbSByZWFkZXIgdG8gYnVmZmVyIGFuZCBhbHNvIGRvIGFsbCB0aGUgbmVjZXNzYXJ5IG9wZXJhdGlvbnMKKyAgLy8gbGlrZSBwcmVwZW5kaW5nIGhlYWQgdG8gbWFrZSBpdCByZWFkeSB0byBkZWNvZGUuCisgIHZpcnR1YWwgYm9vbCBSZWFkKFNoZWxsRGF0YVNvdXJjZVJlYWRlciogcmVhZGVyLCBEZWNvZGVyQnVmZmVyKiBidWZmZXIpID0gMDsKKyAgdmlydHVhbCBUeXBlIEdldFR5cGUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBJc0tleWZyYW1lKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgQWRkUHJlcGVuZCgpIGNvbnN0ID0gMDsKKyAgLy8gR2V0IHRoZSBzaXplIG9mIHRoaXMgQVUsIGl0IGlzIGFsd2F5cyBubyBsYXJnZXIgdGhhbiBpdHMgbWF4IHNpemUuCisgIHZpcnR1YWwgc2l6ZV90IEdldFNpemUoKSBjb25zdCA9IDA7CisgIC8vIEdldCB0aGUgbWF4IHJlcXVpcmVkIGJ1ZmZlciBvZiB0aGlzIEFVCisgIHZpcnR1YWwgc2l6ZV90IEdldE1heFNpemUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgVGltZURlbHRhIEdldFRpbWVzdGFtcCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBUaW1lRGVsdGEgR2V0RHVyYXRpb24oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXREdXJhdGlvbihUaW1lRGVsdGEgZHVyYXRpb24pID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFRpbWVzdGFtcChUaW1lRGVsdGEgdGltZXN0YW1wKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxTaGVsbEFVPjsKKworICBTaGVsbEFVKCk7CisgIHZpcnR1YWwgflNoZWxsQVUoKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX0FVX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9hdmNfcGFyc2VyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIxYzgzMGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5jYwpAQCAtMCwwICsxLDQ5MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuaCIKKworI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlY29kZXJfYnVmZmVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZW5kaWFuX3V0aWwuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV91dGlsLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvdmlkZW9fdHlwZXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9hdS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2FhYy5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCisvLyB3aGF0J3MgdGhlIHNtYWxsZXN0IG1lYW5pbmdmdWwgQVZDIGNvbmZpZyB3ZSBjYW4gcGFyc2U/CitzdGF0aWMgY29uc3QgaW50IGtBVkNDb25maWdNaW5TaXplID0gODsKKy8vIGxvd2VyIGZpdmUgYml0cyBvZiBmaXJzdCBieXRlIGluIFNQUyBzaG91bGQgYmUgNworc3RhdGljIGNvbnN0IHVpbnQ4IGtTUFNOQUxUeXBlID0gNzsKKworU2hlbGxBVkNQYXJzZXI6OlNoZWxsQVZDUGFyc2VyKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZykKKyAgICA6IFNoZWxsUGFyc2VyKHJlYWRlciksCisgICAgICBtZWRpYV9sb2dfKG1lZGlhX2xvZyksCisgICAgICBuYWxfaGVhZGVyX3NpemVfKDApLAorICAgICAgdmlkZW9fcHJlcGVuZF9zaXplXygwKSB7CisgIERDSEVDSyhtZWRpYV9sb2cpOworfQorCitTaGVsbEFWQ1BhcnNlcjo6flNoZWxsQVZDUGFyc2VyKCkge30KKworYm9vbCBTaGVsbEFWQ1BhcnNlcjo6UHJlcGVuZChzY29wZWRfcmVmcHRyPFNoZWxsQVU+IGF1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcikgeworICAvLyBzYW5pdHktY2hlY2sgaW5wdXRzCisgIGlmICghYXUgfHwgIWJ1ZmZlcikgeworICAgIE5PVFJFQUNIRUQoKSA8PCAiYmFkIGlucHV0IHRvIFByZXBlbmQoKSI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVpbnQ4KiBwcmVwZW5kX2J1ZmZlciA9IGJ1ZmZlci0+d3JpdGFibGVfZGF0YSgpOworICBpZiAoIXByZXBlbmRfYnVmZmVyKSB7CisgICAgTk9UUkVBQ0hFRCgpIDw8ICJlbXB0eS91bmRlcnNpemVkIGJ1ZmZlciB0byBQcmVwZW5kKCkiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoYXUtPkdldFR5cGUoKSA9PSBEZW11eGVyU3RyZWFtOjpWSURFTykgeworICAgIGlmIChhdS0+QWRkUHJlcGVuZCgpKQorICAgICAgbWVtY3B5KHByZXBlbmRfYnVmZmVyLCB2aWRlb19wcmVwZW5kXywgdmlkZW9fcHJlcGVuZF9zaXplXyk7CisgIH0gZWxzZSBpZiAoYXUtPkdldFR5cGUoKSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgeworI2lmIGRlZmluZWQoQ09CQUxUX1dJTikKKyAgICAvLyBXZSB1c2UgcmF3IEFBQyBpbnN0ZWFkIG9mIEFEVFMgb24gdGhlc2UgcGxhdGZvcm1zLgorICAgIERDSEVDSyhhdWRpb19wcmVwZW5kXy5lbXB0eSgpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyNlbmRpZgorICAgIGlmIChhdWRpb19wcmVwZW5kXy5lbXB0eSgpKSAgLy8gdmFsaWQgQURUUyBoZWFkZXIgbm90IGF2YWlsYWJsZQorICAgICAgcmV0dXJuIGZhbHNlOworICAgIC8vIGF1ZGlvLCBuZWVkIHRvIGNvcHkgQURUUyBoZWFkZXIgYW5kIHRoZW4gYWRkIGJ1ZmZlciBzaXplCisgICAgdWludDMyIGJ1ZmZlcl9zaXplID0gYXUtPkdldFNpemUoKSArIGF1ZGlvX3ByZXBlbmRfLnNpemUoKTsKKyAgICAvLyB3ZSBjYW4ndCBleHByZXNzIGFuIEFVIHNpemUgbGFyZ2VyIHRoYW4gMTMgYml0cywgc29tZXRoaW5nJ3MgYmFkIGhlcmUuCisgICAgaWYgKGJ1ZmZlcl9zaXplICYgMHhmZmZmZTAwMCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBtZW1jcHkocHJlcGVuZF9idWZmZXIsICZhdWRpb19wcmVwZW5kX1swXSwgYXVkaW9fcHJlcGVuZF8uc2l6ZSgpKTsKKyAgICAvLyBPUiBzaXplIGludG8gYnVmZmVyLCBieXRlIDMgZ2V0cyAyIE1TYiBvZiAxMy1iaXQgc2l6ZQorICAgIHByZXBlbmRfYnVmZmVyWzNdIHw9ICh1aW50OCkoKGJ1ZmZlcl9zaXplICYgMHgwMDAwMTgwMCkgPj4gMTEpOworICAgIC8vIGJ5dGUgNCBnZXRzIGJpdHMgMTAtMyBvZiBzaXplCisgICAgcHJlcGVuZF9idWZmZXJbNF0gPSAodWludDgpKChidWZmZXJfc2l6ZSAmIDB4MDAwMDA3ZjgpID4+IDMpOworICAgIC8vIGJ5dGUgNSBnZXRzIGJpdHMgMi0wIG9mIHNpemUKKyAgICBwcmVwZW5kX2J1ZmZlcls1XSB8PSAodWludDgpKChidWZmZXJfc2l6ZSAmIDB4MDAwMDAwMDcpIDw8IDUpOworICB9IGVsc2UgeworICAgIE5PVFJFQUNIRUQoKSA8PCAidW5zdXBwb3J0ZWQgZGVtdXhlciBzdHJlYW0gdHlwZS4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCitib29sIFNoZWxsQVZDUGFyc2VyOjpEb3dubG9hZEFuZFBhcnNlQVZDQ29uZmlnUmVjb3JkKHVpbnQ2NCBvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBzaXplKSB7CisgIGlmIChzaXplID09IDApIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3RkOjp2ZWN0b3I8dWludDg+IHJlY29yZF9idWZmZXIoc2l6ZSk7CisgIGludCBieXRlc19yZWFkID0gcmVhZGVyXy0+QmxvY2tpbmdSZWFkKG9mZnNldCwgc2l6ZSwgJnJlY29yZF9idWZmZXJbMF0pOworICBEQ0hFQ0tfTEUoc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyPihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyPjo6bWF4KCkpKTsKKyAgaWYgKGJ5dGVzX3JlYWQgPCBzdGF0aWNfY2FzdDxpbnQ+KHNpemUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIG9rLCBzdWNjZXNzZnVsbHkgZG93bmxvYWRlZCB0aGUgcmVjb3JkLCBwYXJzZSBpdAorICByZXR1cm4gUGFyc2VBVkNDb25maWdSZWNvcmQoJnJlY29yZF9idWZmZXJbMF0sIHNpemUpOworfQorCisvLyBzdGF0aWMKK2Jvb2wgU2hlbGxBVkNQYXJzZXI6OlBhcnNlU1BTKGNvbnN0IHVpbnQ4KiBzcHMsIHNpemVfdCBzcHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNoZWxsU1BTUmVjb3JkKiByZWNvcmRfb3V0KSB7CisgIERDSEVDSyhzcHMpIDw8ICJubyBzcHMgcHJvdmlkZWQiOworICBEQ0hFQ0socmVjb3JkX291dCkgPDwgIm5vIG91dHB1dCBzdHJ1Y3R1cmUgcHJvdmlkZWQiOworICAvLyBmaXJzdCBieXRlIGlzIE5BTCB0eXBlIGlkLCBjaGVjayB0aGF0IGl0IGlzIFNQUworICBpZiAoKCpzcHMgJiAweDFmKSAhPSBrU1BTTkFMVHlwZSkgeworICAgIERMT0coRVJST1IpIDw8ICJiYWQgTkFMIHR5cGUgb24gU1BTIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gY29udmVydCBTUFMgTkFMVSB0byBSQlNQIHN0cmVhbQorICBTaGVsbFJCU1BTdHJlYW0gc3BzX3Jic3Aoc3BzICsgMSwgc3BzX3NpemUgLSAxKTsKKyAgdWludDggcHJvZmlsZV9pZGMgPSAwOworICBpZiAoIXNwc19yYnNwLlJlYWRCeXRlKCZwcm9maWxlX2lkYykpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIHByb2ZpbGVfaWRjIGZyb20gc3BzIFJCU1AiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBza2lwIDMgY29uc3RyYWludCBmbGFncywgNSByZXNlcnZlZCBiaXRzLCBhbmQgbGV2ZWxfaWRjICgxNiBiaXRzKQorICBzcHNfcmJzcC5Ta2lwQnl0ZXMoMik7CisgIC8vIFJlYWRVRVYvUmVhZFNFViByZXF1aXJlIGEgdmFsdWUgdG8gYmUgcGFzc2VkIGJ5IHJlZmVyZW5jZSBidXQKKyAgLy8gdGhlcmUgYXJlIG1hbnkgdGltZXMgaW4gd2hpY2ggd2UgaWdub3JlIHRoaXMgdmFsdWUuCisgIHVpbnQzMiBkaXNwb3NhYmxlX3VldiA9IDA7CisgIGludDMyIGRpc3Bvc2FibGVfc2V2ID0gMDsKKyAgLy8gc2VxX3BhcmFtZXRlcl9zZXRfaWQKKyAgc3BzX3Jic3AuUmVhZFVFVigmZGlzcG9zYWJsZV91ZXYpOworICAvLyBza2lwIHByb2ZpbGUtc3BlY2lmaWMgZW5jb2RpbmcgaW5mb3JtYXRpb24gaWYgdGhlcmUKKyAgaWYgKHByb2ZpbGVfaWRjID09IDEwMCB8fCBwcm9maWxlX2lkYyA9PSAxMDMgfHwgcHJvZmlsZV9pZGMgPT0gMTEwIHx8CisgICAgICBwcm9maWxlX2lkYyA9PSAxMjIgfHwgcHJvZmlsZV9pZGMgPT0gMjQ0IHx8IHByb2ZpbGVfaWRjID09IDQ0IHx8CisgICAgICBwcm9maWxlX2lkYyA9PSA4MyB8fCBwcm9maWxlX2lkYyA9PSA4NiB8fCBwcm9maWxlX2lkYyA9PSAxMTgpIHsKKyAgICB1aW50MzIgY2hyb21hX2Zvcm1hdF9pZGMgPSAwOworICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVigmY2hyb21hX2Zvcm1hdF9pZGMpKSB7CisgICAgICBETE9HKFdBUk5JTkcpIDw8ICJmYWlsdXJlIHJlYWRpbmcgY2hyb21hX2Zvcm1hdF9pZGMgZnJvbSBzcHMgUkJTUCI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmIChjaHJvbWFfZm9ybWF0X2lkYyA9PSAzKSB7CisgICAgICAvLyBzZXBhcmF0ZV9jb2xvcl9wbGFuZV9mbGFnCisgICAgICBzcHNfcmJzcC5Ta2lwQml0cygxKTsKKyAgICB9CisgICAgLy8gYml0X2RlcHRoX2x1bWFfbWludXM4CisgICAgc3BzX3Jic3AuUmVhZFVFVigmZGlzcG9zYWJsZV91ZXYpOworICAgIC8vIGJpdF9kZXB0aF9jaHJvbWFfbWludXM4CisgICAgc3BzX3Jic3AuUmVhZFVFVigmZGlzcG9zYWJsZV91ZXYpOworICAgIC8vIHFwcHJpbWVfeV96ZXJvX3RyYW5zZm9ybV9ieXBhc3NfZmxhZworICAgIHNwc19yYnNwLlNraXBCaXRzKDEpOworICAgIC8vIHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcKKyAgICB1aW50OCBzZXFfc2NhbGluZ19tYXRyaXhfcHJlc2VudF9mbGFnID0gMDsKKyAgICBpZiAoIXNwc19yYnNwLlJlYWRCaXQoJnNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcpKSB7CisgICAgICBETE9HKEVSUk9SKQorICAgICAgICAgIDw8ICJmYWlsdXJlIHJlYWRpbmcgc2VxX3NjYWxpbmdfbWF0cml4X3ByZXNlbnRfZmxhZyBmcm9tIHNwcyBSQlNQIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHNlcV9zY2FsaW5nX21hdHJpeF9wcmVzZW50X2ZsYWcpIHsKKyAgICAgIC8vIHNlcV9zY2FsaW5nX2xpc3RfcHJlc2VudF9mbGFnW10KKyAgICAgIHNwc19yYnNwLlNraXBCaXRzKGNocm9tYV9mb3JtYXRfaWRjICE9IDMgPyA4IDogMTIpOworICAgIH0KKyAgfQorICAvLyBsb2cyX21heF9mcmFtZV9udW1fbWludXM0CisgIHNwc19yYnNwLlJlYWRVRVYoJmRpc3Bvc2FibGVfdWV2KTsKKyAgLy8gcGljX29yZGVyX2NudF90eXBlCisgIHVpbnQzMiBwaWNfb3JkZXJfY250X3R5cGUgPSAwOworICBpZiAoIXNwc19yYnNwLlJlYWRVRVYoJnBpY19vcmRlcl9jbnRfdHlwZSkpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIHBpY19vcmRlcl9jbnRfdHlwZSBmcm9tIHNwcyBSQlNQIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAwKSB7CisgICAgLy8gbG9nMl9tYXhfcGljX29yZGVyX2NudF9sc2JfbWludXM0CisgICAgc3BzX3Jic3AuUmVhZFVFVigmZGlzcG9zYWJsZV91ZXYpOworICB9IGVsc2UgaWYgKHBpY19vcmRlcl9jbnRfdHlwZSA9PSAxKSB7CisgICAgLy8gZGVsdGFfcGljX29yZGVyX2Fsd2F5c196ZXJvX2ZsYWcKKyAgICBzcHNfcmJzcC5Ta2lwQml0cygxKTsKKyAgICAvLyBvZmZzZXRfZm9yX25vbl9yZWZfcGljCisgICAgc3BzX3Jic3AuUmVhZFNFVigmZGlzcG9zYWJsZV9zZXYpOworICAgIC8vIG9mZnNldF9mb3JfdG9wX3RvX2JvdHRvbV9maWVsZAorICAgIHNwc19yYnNwLlJlYWRTRVYoJmRpc3Bvc2FibGVfc2V2KTsKKyAgICAvLyBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlCisgICAgdWludDMyIG51bV9yZWZfZnJhbWVzX2luX3BpY19vcmRlcl9jbnRfY3ljbGUgPSAwOworICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVigmbnVtX3JlZl9mcmFtZXNfaW5fcGljX29yZGVyX2NudF9jeWNsZSkpIHsKKyAgICAgIERMT0coRVJST1IpCisgICAgICAgICAgPDwgImZhaWx1cmUgcmVhZGluZyBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlIGZyb20gc3BzIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBudW1fcmVmX2ZyYW1lc19pbl9waWNfb3JkZXJfY250X2N5Y2xlOyArK2kpIHsKKyAgICAgIHNwc19yYnNwLlJlYWRTRVYoJmRpc3Bvc2FibGVfc2V2KTsKKyAgICB9CisgIH0KKyAgLy8gbnVtYmVyIG9mIHJlZmVyZW5jZSBmcmFtZXMgdXNlZCB0byBkZWNvZGUKKyAgdWludDMyIG51bV9yZWZfZnJhbWVzID0gMDsKKyAgaWYgKCFzcHNfcmJzcC5SZWFkVUVWKCZudW1fcmVmX2ZyYW1lcykpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIG51bWJlciBvZiByZWYgZnJhbWVzIGZyb20gc3BzIFJCU1AiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBnYXBzX2luX2ZyYW1lX251bV92YWx1ZV9hbGxvd2VkX2ZsYWcKKyAgc3BzX3Jic3AuU2tpcEJpdHMoMSk7CisgIC8vIHdpZHRoIGlzIGNhbGN1bGF0ZWQgZnJvbSBwaWNfd2lkdGhfaW5fbWJzX21pbnVzMQorICB1aW50MzIgcGljX3dpZHRoX2luX21ic19taW51czEgPSAwOworICBpZiAoIXNwc19yYnNwLlJlYWRVRVYoJnBpY193aWR0aF9pbl9tYnNfbWludXMxKSkgeworICAgIERMT0coV0FSTklORykgPDwgImZhaWx1cmUgcmVhZGluZyBpbWFnZSB3aWR0aCBmcm9tIHNwcyBSQlNQIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gMTYgcHhzIHBlciBtYWNyb2Jsb2NrCisgIHVpbnQzMiB3aWR0aCA9IChwaWNfd2lkdGhfaW5fbWJzX21pbnVzMSArIDEpICogMTY7CisgIC8vIHBpY19oZWlnaHRfaW5fbWFwX3VuaXRzX21pbnVzMQorICB1aW50MzIgcGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxID0gMDsKKyAgaWYgKCFzcHNfcmJzcC5SZWFkVUVWKCZwaWNfaGVpZ2h0X2luX21hcF91bml0c19taW51czEpKSB7CisgICAgRExPRyhFUlJPUikKKyAgICAgICAgPDwgImZhaWx1cmUgcmVhZGluZyBwaWNfaGVpZ2h0X2luX21hcF91aW50c19taW51czEgZnJvbSBzcHMgUkJTUCI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVpbnQ4IGZyYW1lX21ic19vbmx5X2ZsYWcgPSAwOworICBpZiAoIXNwc19yYnNwLlJlYWRCaXQoJmZyYW1lX21ic19vbmx5X2ZsYWcpKSB7CisgICAgRExPRyhFUlJPUikgPDwgImZhaWx1cmUgcmVhZGluZyBmcmFtZV9tYnNfb25seV9mbGFnIGZyb20gc3BzIFJCU1AiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICB1aW50MzIgaGVpZ2h0ID0gKDIgLSBzdGF0aWNfY2FzdDx1aW50MzI+KGZyYW1lX21ic19vbmx5X2ZsYWcpKSAqCisgICAgICAgICAgICAgICAgICAocGljX2hlaWdodF9pbl9tYXBfdW5pdHNfbWludXMxICsgMSkgKiAxNjsKKyAgaWYgKCFmcmFtZV9tYnNfb25seV9mbGFnKSB7CisgICAgc3BzX3Jic3AuU2tpcEJpdHMoMSk7CisgIH0KKyAgLy8gZGlyZWN0Xzh4OF9pbmZlcmVuY2VfZmxhZworICBzcHNfcmJzcC5Ta2lwQml0cygxKTsKKyAgLy8gZnJhbWUgY3JvcHBpbmcgZmxhZworICB1aW50OCBmcmFtZV9jcm9wcGluZ19mbGFnID0gMDsKKyAgaWYgKCFzcHNfcmJzcC5SZWFkQml0KCZmcmFtZV9jcm9wcGluZ19mbGFnKSkgeworICAgIERMT0coRVJST1IpIDw8ICJmYWlsdXJlIHJlYWRpbmcgZnJhbWVfY3JvcHBpbmdfZmxhZyBmcm9tIHNwcyBSQlNQIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gZGlzdGFuY2UgaW4gcGl4ZWxzIGZyb20gdGhlIGFzc29jaWF0ZWQgZWRnZSBvZiB0aGUgbWVkaWE6CisgIC8vCisgIC8vIDwtLS1jb2RlZF9zaXplLS0td2lkdGgtLS0tLS0tLS0tLS0tLS0tLS0tLS0+CisgIC8vCisgIC8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgXgorICAvLyB8ICAgICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgLy8gfCAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgIC8vIHwgICAgICAgICAgICAgIGNyb3BfdG9wICAgICAgICAgICAgICAgICAgICB8ICAgfAorICAvLyB8ICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgLy8gfCAgICAgICAgICAgICAgICAgdiAgICAgICAgICAgICAgICAgICAgICAgIHwgaGVpZ2h0CisgIC8vIHwgICAgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICAgICB8ICAgfAorICAvLyB8PC0tY3JvcF9sZWZ0LS0+fCB2aXNpYmxlIHwgICAgICAgICAgICAgICAgfCAgIHwKKyAgLy8gfCAgICAgICAgICAgICAgIHwgICByZWN0ICB8PC0tY3JvcF9yaWdodC0tPnwgICB8CisgIC8vIHwgICAgICAgICAgICAgICArLS0tLS0tLS0tKyAgICAgICAgICAgICAgICB8ICAgfAorICAvLyB8ICAgICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgLy8gfCAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgIC8vIHwgICAgICAgICAgICAgIGNyb3BfYm90dG9tICAgICAgICAgICAgICAgICB8ICAgfAorICAvLyB8ICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgfCAgIHwKKyAgLy8gfCAgICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgIHwgICB8CisgIC8vICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rICAgdgorICAvLworICB1aW50MzIgY3JvcF9sZWZ0ID0gMDsKKyAgdWludDMyIGNyb3BfcmlnaHQgPSAwOworICB1aW50MzIgY3JvcF90b3AgPSAwOworICB1aW50MzIgY3JvcF9ib3R0b20gPSAwOworICAvLyBjcm9wcGluZyB2YWx1ZXMgYXJlIHN0b3JlZCBkaXZpZGVkIGJ5IHR3bworICBpZiAoZnJhbWVfY3JvcHBpbmdfZmxhZykgeworICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVigmY3JvcF9sZWZ0KSkgeworICAgICAgRExPRyhFUlJPUikgPDwgImZhaWx1cmUgcmVhZGluZyBjcm9wX2xlZnQgZnJvbSBzcHMgUkJTUCI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVigmY3JvcF9yaWdodCkpIHsKKyAgICAgIERMT0coRVJST1IpIDw8ICJmYWlsdXJlIHJlYWRpbmcgY3JvcF9yaWdodCBmcm9tIHNwcyBSQlNQIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKCFzcHNfcmJzcC5SZWFkVUVWKCZjcm9wX3RvcCkpIHsKKyAgICAgIERMT0coRVJST1IpIDw8ICJmYWlsdXJlIHJlYWRpbmcgY3JvcF90b3AgZnJvbSBzcHMgUkJTUCI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghc3BzX3Jic3AuUmVhZFVFVigmY3JvcF9ib3R0b20pKSB7CisgICAgICBETE9HKEVSUk9SKSA8PCAiZmFpbHVyZSByZWFkaW5nIGNyb3BfYm90dG9tIGZyb20gc3BzIFJCU1AiOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBjcm9wX2xlZnQgKj0gMjsKKyAgICBjcm9wX3JpZ2h0ICo9IDI7CisgICAgY3JvcF90b3AgKj0gMjsKKyAgICBjcm9wX2JvdHRvbSAqPSAyOworICB9CisgIC8vIHJlbWFpbmRlciBvZiBTUFMgYXJlIHZhbHVlcyB3ZSBjYW4gc2FmZWx5IGlnbm9yZSwgZXZlcnl0aGluZworICAvLyBjaGVja3Mgb3V0LCB3cml0ZSBvdXRwdXQgc3RydWN0dXJlCisgIGludCB2aXNpYmxlX3dpZHRoID0gd2lkdGggLSAoY3JvcF9sZWZ0ICsgY3JvcF9yaWdodCk7CisgIGludCB2aXNpYmxlX2hlaWdodCA9IGhlaWdodCAtIChjcm9wX3RvcCArIGNyb3BfYm90dG9tKTsKKyAgcmVjb3JkX291dC0+Y29kZWRfc2l6ZSA9IGdmeDo6U2l6ZSh3aWR0aCwgaGVpZ2h0KSwKKyAgcmVjb3JkX291dC0+dmlzaWJsZV9yZWN0ID0KKyAgICAgIGdmeDo6UmVjdChjcm9wX2xlZnQsIGNyb3BfdG9wLCB2aXNpYmxlX3dpZHRoLCB2aXNpYmxlX2hlaWdodCksCisgIHJlY29yZF9vdXQtPm5hdHVyYWxfc2l6ZSA9IGdmeDo6U2l6ZSh2aXNpYmxlX3dpZHRoLCB2aXNpYmxlX2hlaWdodCk7CisgIHJlY29yZF9vdXQtPm51bV9yZWZfZnJhbWVzID0gbnVtX3JlZl9mcmFtZXM7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFNoZWxsQVZDUGFyc2VyOjpQYXJzZUFWQ0NvbmZpZ1JlY29yZCh1aW50OCogYnVmZmVyLCB1aW50MzIgc2l6ZSkgeworICBpZiAoc2l6ZSA8IGtBVkNDb25maWdNaW5TaXplKSB7CisgICAgRExPRyhFUlJPUikgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKCJBVkMgY29uZmlnIHJlY29yZCBiYWQgc2l6ZTogJWQiLCBzaXplKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBnZXQgdGhlIE5BTFUgaGVhZGVyIHNpemUKKyAgbmFsX2hlYWRlcl9zaXplXyA9IChidWZmZXJbNF0gJiAweDAzKSArIDE7CisgIC8vIHZhbGlkYXRlIHNpemUsIG5lZWRzIHRvIGJlIDEsIDIgb3IgNCBieXRlcyBvbmx5CisgIGlmIChuYWxfaGVhZGVyX3NpemVfICE9IDQgJiYgbmFsX2hlYWRlcl9zaXplXyAhPSAyICYmIG5hbF9oZWFkZXJfc2l6ZV8gIT0gMSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBBVkNDb25maWdSZWNvcmRzIGNvbnRhaW4gYSB2YXJpYWJsZSBudW1iZXIgb2YgU1BTIE5BTFUKKyAgLy8gKFNlcXVlbmNlIFBhcmFtZXRlciBTZXQpIChOZXR3b3JrIEFic3RyYWN0aW9uIExheWVyIFVuaXRzKQorICAvLyBmcm9tIHdoaWNoIHdlIGNhbiBleHRyYWN0IHdpZHRoLCBoZWlnaHQsIGFuZCBjcm9wcGluZyBpbmZvLgorICAvLyBUaGF0IG1lYW5zIHdlIG5lZWQgYXQgbGVhc3QgMSBTUFMgTkFMVSBpbiB0aGlzIHN0cmVhbSBmb3IgZXh0cmFjdGlvbi4KKyAgdWludDggbnVtYmVyX29mX3Nwc19uYWx1cyA9IGJ1ZmZlcls1XSAmIDB4MWY7CisgIGlmIChudW1iZXJfb2Zfc3BzX25hbHVzID09IDApIHsKKyAgICBETE9HKFdBUk5JTkcpIDw8ICJnb3QgQVZDQ29uZmlnUmVjb3JkIHdpdGhvdXQgYW55IFNQUyBOQUxVcyEiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBpdGVyYXRlIHRocm91Z2ggU1BTIE5BTFVzIGZpbmRpbmcgb25lIG9mIHZhbGlkIHNpemUgZm9yIG91ciBwdXJwb3NlcworICAvLyAodGhpcyBzaG91bGQgdXN1YWxseSBiZSB0aGUgZmlyc3Qgb25lKSwgYnV0IGFsc28gYWR2YW5jaW5nIHRocm91Z2gKKyAgLy8gdGhlIENvbmZpZ1JlY29yZCB1bnRpbCB3ZSBlbmNvdW50ZXIgdGhlIFBQUyBzZXRzCisgIGJvb2wgaGF2ZV92YWxpZF9zcHMgPSBmYWxzZTsKKyAgaW50IHJlY29yZF9vZmZzZXQgPSA2OworICBzaXplX3QgdXNhYmxlX3Nwc19zaXplID0gMDsKKyAgaW50IHVzYWJsZV9zcHNfb2Zmc2V0ID0gMDsKKyAgZm9yICh1aW50OCBpID0gMDsgaSA8IG51bWJlcl9vZl9zcHNfbmFsdXM7IGkrKykgeworICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlbid0IHJ1biBvdXQgb2YgcmVjb3JkIGZvciB0aGUgMi1ieXRlIHNpemUgcmVjb3JkCisgICAgRENIRUNLX0xFKHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMj4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMj46Om1heCgpKSk7CisgICAgaWYgKHJlY29yZF9vZmZzZXQgKyAyID4gc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgeworICAgICAgRExPRyhXQVJOSU5HKSA8PCAicmFuIG91dCBvZiBBVkNDb25maWcgcmVjb3JkIHdoaWxlIHBhcnNpbmcgU1BTIHNpemUuIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gZXh0cmFjdCAyLWJ5dGUgc2l6ZSBvZiB0aGlzIFNQUworICAgIHNpemVfdCBzcHNfc2l6ZSA9CisgICAgICAgIGVuZGlhbl91dGlsOjpsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKGJ1ZmZlciArIHJlY29yZF9vZmZzZXQpOworICAgIC8vIGFkdmFuY2UgcGFzdCB0aGUgMi1ieXRlIHNpemUgcmVjb3JkCisgICAgcmVjb3JkX29mZnNldCArPSAyOworICAgIC8vIHNlZSBpZiB3ZSBqdW1wZWQgb3ZlciByZWNvcmQgc2l6ZQorICAgIGlmIChyZWNvcmRfb2Zmc2V0ICsgc3BzX3NpemUgPiBzaXplKSB7CisgICAgICBETE9HKFdBUk5JTkcpIDw8ICJyYW4gb3V0IG9mIEFWQ0NvbmZpZyByZWNvcmQgd2hpbGUgcGFyc2luZyBTUFMgYmxvY2tzLiI7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGlmICghaGF2ZV92YWxpZF9zcHMpIHsKKyAgICAgIGhhdmVfdmFsaWRfc3BzID0gdHJ1ZTsKKyAgICAgIC8vIHNhdmUgc2l6ZSBhbmQgb2Zmc2V0IGZvciBsYXRlciBjb3B5aW5nIGFuZCBwYXJzaW5nCisgICAgICB1c2FibGVfc3BzX3NpemUgPSBzcHNfc2l6ZTsKKyAgICAgIHVzYWJsZV9zcHNfb2Zmc2V0ID0gcmVjb3JkX29mZnNldDsKKyAgICAgIC8vIGNvbnRpbnVlIHRvIGl0ZXJhdGUgdGhyb3VnaCBzcHMgcmVjb3JkcyB0byBnZXQgdG8gcHBzIHdoaWNoIGZvbGxvdworICAgIH0KKyAgICByZWNvcmRfb2Zmc2V0ICs9IHNwc19zaXplOworICB9CisgIGlmICghaGF2ZV92YWxpZF9zcHMpIHsKKyAgICBETE9HKFdBUk5JTkcpCisgICAgICAgIDw8ICJ1bmFibGUgdG8gcGFyc2UgYSBzdWl0YWJsZSBTUFMuIFBlcmhhcHMgaW5jcmVhc2UgbWF4IHNpemU/IjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gd2UgZG9uJ3Qgc3RyaWN0bHkgcmVxdWlyZSBhIFBQUywgc28gd2UncmUgZXZlbiB3aWxsaW5nIHRvIGFjY2VwdCB0aGF0CisgIC8vIHRoaXMgY291bGQgYmUgdGhlIGVuZCBvZiB0aGUgYnl0ZXN0cmVhbSwgYnV0IGlmIG5vdCB0aGUgbmV4dCBieXRlIHNob3VsZAorICAvLyBkZWZpbmUgdGhlIG51bWJlciBvZiBQUFMgb2JqZWN0cyBpbiB0aGUgcmVjb3JkLiBOb3Qgc3VyZSBpZgorICAvLyBzcGVjaWZpYyBkZWNvZGVycyBjb3VsZCBkZWNvZGUgc29tZXRoaW5nIHdpdGhvdXQgYSBQUFMgcHJlcGVuZCBidXQgdGhpcworICAvLyBkb2Vzbid0IGJyZWFrIGRlbXV4aW5nIHNvIHdlJ2xsIGxldCB0aGVtIGNvbXBsYWluIGlmIHRoYXQgaXNuJ3QgZ29pbmcKKyAgLy8gdG8gd29yayBmb3IgdGhlbSA6KQorICBzaXplX3QgdXNhYmxlX3Bwc19zaXplID0gMDsKKyAgc2l6ZV90IHVzYWJsZV9wcHNfb2Zmc2V0ID0gMDsKKyAgYm9vbCBoYXZlX3ZhbGlkX3BwcyA9IGZhbHNlOworICBEQ0hFQ0tfTEUoc2l6ZSwgc3RhdGljX2Nhc3Q8dWludDMyPihzdGQ6Om51bWVyaWNfbGltaXRzPGludDMyPjo6bWF4KCkpKTsKKyAgaWYgKHJlY29yZF9vZmZzZXQgKyAxIDwgc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgeworICAgIHVpbnQ4IG51bWJlcl9vZl9wcHNfbmFsdXMgPSBidWZmZXJbcmVjb3JkX29mZnNldF07CisgICAgcmVjb3JkX29mZnNldCsrOworICAgIGZvciAodWludDggaSA9IDA7IGkgPCBudW1iZXJfb2ZfcHBzX25hbHVzOyBpKyspIHsKKyAgICAgIC8vIG1ha2Ugc3VyZSB3ZSBkb24ndCBydW4gb3V0IG9mIHJvb20gZm9yIDItYnl0ZSBzaXplIHJlY29yZAorICAgICAgRENIRUNLX0xFKHNpemUsIHN0YXRpY19jYXN0PHVpbnQzMj4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQzMj46Om1heCgpKSk7CisgICAgICBpZiAocmVjb3JkX29mZnNldCArIDIgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplKSkgeworICAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJyYW4gb3V0IG9mIEFWQ0NvbmZpZyByZWNvcmQgd2hpbGUgcGFyc2luZyBQUFMgc2l6ZS4iOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBleHRyYWN0IDItYnl0ZSBzaXplIG9mIHRoaXMgUFBTCisgICAgICBzaXplX3QgcHBzX3NpemUgPQorICAgICAgICAgIGVuZGlhbl91dGlsOjpsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKGJ1ZmZlciArIHJlY29yZF9vZmZzZXQpOworICAgICAgcmVjb3JkX29mZnNldCArPSAyOworICAgICAgLy8gc2VlIGlmIHRoZXJlJ3MgYWN0dWFsbHkgcm9vbSBmb3IgdGhpcyByZWNvcmQgaW4gdGhlIGJ1ZmZlcgorICAgICAgaWYgKHJlY29yZF9vZmZzZXQgKyBwcHNfc2l6ZSA+IHNpemUpIHsKKyAgICAgICAgRExPRyhXQVJOSU5HKQorICAgICAgICAgICAgPDwgInJhbiBvdXQgb2YgQVZDQ29uZmlnIHJlY29yZCB3aGlsZSBzY2FubmluZyBQUFMgYmxvY2tzLiI7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmICghaGF2ZV92YWxpZF9wcHMpIHsKKyAgICAgICAgaGF2ZV92YWxpZF9wcHMgPSB0cnVlOworICAgICAgICB1c2FibGVfcHBzX3NpemUgPSBwcHNfc2l6ZTsKKyAgICAgICAgdXNhYmxlX3Bwc19vZmZzZXQgPSByZWNvcmRfb2Zmc2V0OworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gbm93IHdlIHBhcnNlIHRoZSB2YWxpZCBTUFMgd2UgZXh0cmFjdGVkIGZyb20gYnl0ZSBzdHJlYW0gZWFybGllci4KKyAgU2hlbGxTUFNSZWNvcmQgc3BzX3JlY29yZDsKKyAgaWYgKCFQYXJzZVNQUyhidWZmZXIgKyB1c2FibGVfc3BzX29mZnNldCwgdXNhYmxlX3Nwc19zaXplLCAmc3BzX3JlY29yZCkpIHsKKyAgICBETE9HKFdBUk5JTkcpIDw8ICJlcnJvciBwYXJzaW5nIFNQUyI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIHdlIGNhbiBub3cgaW5pdGlhbGl6ZSBvdXIgdmlkZW8gZGVjb2RlciBjb25maWcKKyAgdmlkZW9fY29uZmlnXy5Jbml0aWFsaXplKGtDb2RlY0gyNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBIMjY0UFJPRklMRV9NQUlOLCAgLy8gcHJvZmlsZSBpcyBpZ25vcmVkIGN1cnJlbnRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgUElYRUxfRk9STUFUX1lWMTIsIENPTE9SX1NQQUNFX0hEX1JFQzcwOSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNwc19yZWNvcmQuY29kZWRfc2l6ZSwgc3BzX3JlY29yZC52aXNpYmxlX3JlY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzcHNfcmVjb3JkLm5hdHVyYWxfc2l6ZSwgRW1wdHlFeHRyYURhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuZW5jcnlwdGVkKCkpOworCisgIHJldHVybiBCdWlsZEFubmV4QlByZXBlbmQoYnVmZmVyICsgdXNhYmxlX3Nwc19vZmZzZXQsIHVzYWJsZV9zcHNfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIgKyB1c2FibGVfcHBzX29mZnNldCwgdXNhYmxlX3Bwc19zaXplKTsKK30KKworYm9vbCBTaGVsbEFWQ1BhcnNlcjo6QnVpbGRBbm5leEJQcmVwZW5kKHVpbnQ4KiBzcHMsIHVpbnQzMiBzcHNfc2l6ZSwgdWludDgqIHBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgcHBzX3NpemUpIHsKKyAgLy8gV2Ugd2lsbCBuZWVkIHRvIGF0dGFjaCB0aGUgc3BzIGFuZCBwcHMgKGlmIHByb3ZpZGVkKSB0byBlYWNoIGtleWZyYW1lCisgIC8vIHZpZGVvIHBhY2tldCwgd2l0aCB0aGUgQW5uZXhCIHN0YXJ0IGNvZGUgaW4gZnJvbnQgb2YgZWFjaC4gU3RhcnQgd2l0aAorICAvLyBzcHMgc2l6ZSBhbmQgc3RhcnQgY29kZQorICB2aWRlb19wcmVwZW5kX3NpemVfID0gc3BzX3NpemUgKyBrQW5uZXhCU3RhcnRDb2RlU2l6ZTsKKyAgaWYgKHBwc19zaXplID4gMCkgeworICAgIC8vIEFkZCBwcHMgYW5kIHBwcyBzdGFydCBjb2RlIHNpemUgaWYgbmVlZGVkLgorICAgIHZpZGVvX3ByZXBlbmRfc2l6ZV8gKz0gcHBzX3NpemUgKyBrQW5uZXhCU3RhcnRDb2RlU2l6ZTsKKyAgfQorICAvLyB0aGlzIHNob3VsZCBiZSBhIHZlcnkgcmFyZSBjYXNlIGZvciB0eXBpY2FsIHZpZGVvcworICBpZiAodmlkZW9fcHJlcGVuZF9zaXplXyA+IGtBbm5leEJQcmVwZW5kTWF4U2l6ZSkgeworICAgIE5PVFJFQUNIRUQoKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoIkJhZCBBbm5leEIgcHJlcGVuZCBzaXplOiAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb19wcmVwZW5kX3NpemVfKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gc3RhcnQgY29kZSBmb3Igc3BzIGNvbWVzIGZpcnN0CisgIGVuZGlhbl91dGlsOjpzdG9yZV91aW50MzJfYmlnX2VuZGlhbihrQW5uZXhCU3RhcnRDb2RlLCB2aWRlb19wcmVwZW5kXyk7CisgIC8vIGZvbGxvd2VkIGJ5IHNwcyBib2R5CisgIG1lbWNweSh2aWRlb19wcmVwZW5kXyArIGtBbm5leEJTdGFydENvZGVTaXplLCBzcHMsIHNwc19zaXplKTsKKyAgaW50IHByZXBlbmRfb2Zmc2V0ID0ga0FubmV4QlN0YXJ0Q29kZVNpemUgKyBzcHNfc2l6ZTsKKyAgaWYgKHBwc19zaXplID4gMCkgeworICAgIC8vIHBwcyBzdGFydCBjb2RlIGNvbWVzIG5leHQKKyAgICBlbmRpYW5fdXRpbDo6c3RvcmVfdWludDMyX2JpZ19lbmRpYW4oa0FubmV4QlN0YXJ0Q29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fcHJlcGVuZF8gKyBwcmVwZW5kX29mZnNldCk7CisgICAgcHJlcGVuZF9vZmZzZXQgKz0ga0FubmV4QlN0YXJ0Q29kZVNpemU7CisgICAgLy8gZm9sbG93ZWQgYnkgcHBzCisgICAgbWVtY3B5KHZpZGVvX3ByZXBlbmRfICsgcHJlcGVuZF9vZmZzZXQsIHBwcywgcHBzX3NpemUpOworICAgIHByZXBlbmRfb2Zmc2V0ICs9IHBwc19zaXplOworICB9CisKKyAgLy8gbWFrZSBzdXJlIHdlIGhhdmVuJ3Qgd2FuZGVyZWQgb2ZmIGludG8gbWVtb3J5IHNvbWV3aGVyZQorICBEQ0hFQ0tfRVEocHJlcGVuZF9vZmZzZXQsIHZpZGVvX3ByZXBlbmRfc2l6ZV8pOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBTaGVsbEFWQ1BhcnNlcjo6UGFyc2VBdWRpb1NwZWNpZmljQ29uZmlnKHVpbnQ4IGIwLCB1aW50OCBiMSkgeworICBtZWRpYTo6bXA0OjpBQUMgYWFjOworICBzdGQ6OnZlY3Rvcjx1aW50OD4gYWFjX2NvbmZpZygyKTsKKworICBhYWNfY29uZmlnWzBdID0gYjA7CisgIGFhY19jb25maWdbMV0gPSBiMTsKKyAgYXVkaW9fcHJlcGVuZF8uY2xlYXIoKTsKKworICBpZiAoIWFhYy5QYXJzZShhYWNfY29uZmlnLCBtZWRpYV9sb2dfKSB8fAorICAgICAgIWFhYy5Db252ZXJ0RXNkc1RvQURUUygmYXVkaW9fcHJlcGVuZF8pKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAiRXJyb3IgaW4gcGFyc2luZyBBdWRpb1NwZWNpZmljQ29uZmlnLiI7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gQ2xlYXIgdGhlIGxlbmd0aCwgaXQgaXMgMTMgYml0cyBhbmQgc3RvcmVkIGFzICoqKioqKkxMIExMTExMTExMIExMTCoqKioqCisgIC8vIGluIGJ5dGVzIDMgdG8gNS4KKyAgYXVkaW9fcHJlcGVuZF9bM10gJj0gMHhmYzsKKyAgYXVkaW9fcHJlcGVuZF9bNF0gPSAwOworICBhdWRpb19wcmVwZW5kX1s1XSAmPSAweDFmOworCisjaWYgZGVmaW5lZChDT0JBTFRfV0lOKQorICAvLyBXZSB1c2UgcmF3IEFBQyBpbnN0ZWFkIG9mIEFEVFMgb24gdGhlc2UgcGxhdGZvcm1zLgorICBhdWRpb19wcmVwZW5kXy5jbGVhcigpOworI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9XSU4pCisKKyAgY29uc3QgYm9vbCBrU2JySW5NaW1ldHlwZSA9IGZhbHNlOworICBhdWRpb19jb25maWdfLkluaXRpYWxpemUoCisgICAgICBrQ29kZWNBQUMsIGtTYW1wbGVGb3JtYXRTMTYsIGFhYy5HZXRDaGFubmVsTGF5b3V0KGtTYnJJbk1pbWV0eXBlKSwKKyAgICAgIGFhYy5HZXRPdXRwdXRTYW1wbGVzUGVyU2Vjb25kKGtTYnJJbk1pbWV0eXBlKSwgYWFjLmNvZGVjX3NwZWNpZmljX2RhdGEoKSwKKyAgICAgIFVuZW5jcnlwdGVkKCksIGJhc2U6OlRpbWVEZWx0YSgpLCAwKTsKK30KKworc2l6ZV90IFNoZWxsQVZDUGFyc2VyOjpDYWxjdWxhdGVQcmVwZW5kU2l6ZShEZW11eGVyU3RyZWFtOjpUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5ZnJhbWUpIHsKKyAgc2l6ZV90IHByZXBlbmRfc2l6ZSA9IDA7CisgIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OlZJREVPKSB7CisgICAgYm9vbCBuZWVkc19wcmVwZW5kID0gaXNfa2V5ZnJhbWU7CisgICAgaWYgKG5lZWRzX3ByZXBlbmQpIHByZXBlbmRfc2l6ZSA9IHZpZGVvX3ByZXBlbmRfc2l6ZV87CisgIH0gZWxzZSBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgeworICAgIHByZXBlbmRfc2l6ZSA9IGF1ZGlvX3ByZXBlbmRfLnNpemUoKTsKKyAgfSBlbHNlIHsKKyAgICBOT1RSRUFDSEVEKCkgPDwgInVuc3VwcG9ydGVkIHN0cmVhbSB0eXBlIjsKKyAgfQorICByZXR1cm4gcHJlcGVuZF9zaXplOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9hdmNfcGFyc2VyLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQzMjY0MjEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfYXZjX3BhcnNlci5oCkBAIC0wLDAgKzEsNzggQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX0ZJTFRFUlNfU0hFTExfQVZDX1BBUlNFUl9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfRklMVEVSU19TSEVMTF9BVkNfUEFSU0VSX0hfCisKKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gVHlwaWNhbCBzaXplIG9mIGFuIGFubmV4QiBwcmVwZW5kIHdpbGwgYmUgYXJvdW5kIDYwIGJ5dGVzLiBXZSBtYWtlIG1vcmUgcm9vbQorLy8gdG8gZW5zdXJlIHRoYXQgb25seSBhIHZlcnkgZmV3IHZpZGVvcyB3aWxsIGZhaWwgdG8gcGxheSBmb3IgbGFjayBvZiByb29tCisvLyBpbiB0aGUgcHJlcGVuZC4KK3N0YXRpYyBjb25zdCBpbnQga0FubmV4QlByZXBlbmRNYXhTaXplID0gMTAyNDsKKworLy8gd2hpbGUgbm90IGFuIGFjdHVhbCBwYXJzZXIsIHByb3ZpZGVzIHNoYXJlZCBmdW5jdGlvbmFsaXR5IHRvIGJvdGggdGhlCisvLyBtcDQgYW5kIGZsdiBwYXJzZXJzIHdoaWNoIGRlcml2ZSBmcm9tIGl0LiBJbXBsZW1lbnRzIHBhcnQgb2YgU2hlbGxQYXJzZXIKKy8vIHdoaWxlIGxlYXZpbmcgdGhlIHJlc3QgZm9yIGl0cyBjaGlsZHJlbi4KK2NsYXNzIFNoZWxsQVZDUGFyc2VyIDogcHVibGljIFNoZWxsUGFyc2VyIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFNoZWxsQVZDUGFyc2VyKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2cpOworICB2aXJ0dWFsIH5TaGVsbEFWQ1BhcnNlcigpOworCisgIHN0cnVjdCBTaGVsbFNQU1JlY29yZCB7CisgICAgZ2Z4OjpTaXplIGNvZGVkX3NpemU7CisgICAgZ2Z4OjpSZWN0IHZpc2libGVfcmVjdDsKKyAgICBnZng6OlNpemUgbmF0dXJhbF9zaXplOworICAgIHVpbnQzMiBudW1fcmVmX2ZyYW1lczsKKyAgfTsKKyAgc3RhdGljIGJvb2wgUGFyc2VTUFMoY29uc3QgdWludDgqIHNwcywgc2l6ZV90IHNwc19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBTaGVsbFNQU1JlY29yZCogcmVjb3JkX291dCk7CisKKyAgLy8gR2V0TmV4dEFVIHdlIG11c3QgcGFzcyBvbiB0byBGTFYgb3IgTVA0IGNoaWxkcmVuLgorICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gR2V0TmV4dEFVKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgPSAwOworICAvLyBQcmVwZW5kcyBhcmUgY29tbW9uIHRvIGFsbCBBVkMvQUFDIGNvbnRhaW5lcnMgc28gd2UgY2FuIGRvIHRoaXMgb25lIGhlcmUuCisgIHZpcnR1YWwgYm9vbCBQcmVwZW5kKHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gYXUsCisgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKSBPVkVSUklERTsKKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCBib29sIERvd25sb2FkQW5kUGFyc2VBVkNDb25maWdSZWNvcmQodWludDY0IG9mZnNldCwgdWludDMyIHNpemUpOworICB2aXJ0dWFsIGJvb2wgUGFyc2VBVkNDb25maWdSZWNvcmQodWludDgqIGJ1ZmZlciwgdWludDMyIHNpemUpOworICAvLyBwcHNfc2l6ZSBjYW4gYmUgMC4gUmV0dXJucyBmYWxzZSBvbiB1bmFibGUgdG8gY29uc3RydWN0LgorICB2aXJ0dWFsIGJvb2wgQnVpbGRBbm5leEJQcmVwZW5kKHVpbnQ4KiBzcHMsIHVpbnQzMiBzcHNfc2l6ZSwgdWludDgqIHBwcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgcHBzX3NpemUpOworICB2aXJ0dWFsIHZvaWQgUGFyc2VBdWRpb1NwZWNpZmljQ29uZmlnKHVpbnQ4IGIwLCB1aW50OCBiMSk7CisgIHZpcnR1YWwgc2l6ZV90IENhbGN1bGF0ZVByZXBlbmRTaXplKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSk7CisKKyAgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4gbWVkaWFfbG9nXzsKKyAgdWludDggbmFsX2hlYWRlcl9zaXplXzsKKyAgLy8gYXVkaW8gZnJhbWVzIGhhdmUgYSBmaXhlZC1zaXplIHNtYWxsIHByZXBlbmQgdGhhdCB3ZSBhdHRhY2ggdG8gZXZlcnkKKyAgLy8gYXVkaW8gYnVmZmVyIGNyZWF0ZWQgYnkgRG93bmxvYWRCdWZmZXIoKQorICBzdGQ6OnZlY3Rvcjx1aW50OD4gYXVkaW9fcHJlcGVuZF87CisgIC8vIHZpZGVvIGZyYW1lcyBoYXZlIGEgdmFyaWFibGUtc2l6ZSBwcmVwZW5kIHRoYXQgd2UgbGltaXQgdG8gYSByZWFzb25hYmxlCisgIC8vIHVwcGVyIGJvdW5kLiBXZSBvbmx5IG5lZWQgdG8gYXR0YWNoIGl0IHRvIGtleWZyYW1lcywgaG93ZXZlciwgdGhlIHJlc3QKKyAgLy8gb2YgdGhlIGZyYW1lcyBuZWVkIG9ubHkgYW4gQW5uZXhCIHN0YXJ0IGNvZGUuCisgIHVpbnQ4IHZpZGVvX3ByZXBlbmRfW2tBbm5leEJQcmVwZW5kTWF4U2l6ZV07CisgIHVpbnQzMiB2aWRlb19wcmVwZW5kX3NpemVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX0ZJTFRFUlNfU0hFTExfQVZDX1BBUlNFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNDZkYTM3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuY2MKQEAgLTAsMCArMSw1NTIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9kZW11eGVyLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorCisjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvY2FsbGJhY2tfaGVscGVycy5oIgorI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgImJhc2UvdGFza19ydW5uZXJfdXRpbC5oIgorI2luY2x1ZGUgImJhc2UvdGltZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3RpbWVzdGFtcF9jb25zdGFudHMuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworU2hlbGxEZW11eGVyU3RyZWFtOjpTaGVsbERlbXV4ZXJTdHJlYW0oU2hlbGxEZW11eGVyKiBkZW11eGVyLCBUeXBlIHR5cGUpCisgICAgOiBkZW11eGVyXyhkZW11eGVyKSwKKyAgICAgIHR5cGVfKHR5cGUpLAorICAgICAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyhrTm9UaW1lc3RhbXApLAorICAgICAgc3RvcHBlZF8oZmFsc2UpIHsKKyAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXJTdHJlYW06OlNoZWxsRGVtdXhlclN0cmVhbSgpIik7CisgIERDSEVDSyhkZW11eGVyXyk7Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyU3RyZWFtOjpSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgeworICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlclN0cmVhbTo6UmVhZCgpIik7CisgIERDSEVDSyghcmVhZF9jYi5pc19udWxsKCkpOworCisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisKKyAgLy8gRG9uJ3QgYWNjZXB0IGFueSBhZGRpdGlvbmFsIHJlYWRzIGlmIHdlJ3ZlIGJlZW4gdG9sZCB0byBzdG9wLgorICAvLyBUaGUgZGVtdXhlcl8gbWF5IGhhdmUgYmVlbiBkZXN0cm95ZWQgaW4gdGhlIHBpcGxlaW5lIHRocmVhZC4KKyAgaWYgKHN0b3BwZWRfKSB7CisgICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXJTdHJlYW06OlJlYWQoKSBFT1Mgc2VudC4iKTsKKyAgICByZWFkX2NiLlJ1bihEZW11eGVyU3RyZWFtOjprT2ssCisgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPihEZWNvZGVyQnVmZmVyOjpDcmVhdGVFT1NCdWZmZXIoKSkpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIEJ1ZmZlcnMgYXJlIG9ubHkgcXVldWVkIHdoZW4gdGhlcmUgYXJlIG5vIHBlbmRpbmcgcmVhZHMuCisgIERDSEVDSyhidWZmZXJfcXVldWVfLmVtcHR5KCkgfHwgcmVhZF9xdWV1ZV8uZW1wdHkoKSk7CisKKyAgaWYgKCFidWZmZXJfcXVldWVfLmVtcHR5KCkpIHsKKyAgICAvLyBTZW5kIHRoZSBvbGRlc3QgYnVmZmVyIGJhY2suCisgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIgPSBidWZmZXJfcXVldWVfLmZyb250KCk7CisgICAgaWYgKGJ1ZmZlci0+ZW5kX29mX3N0cmVhbSgpKSB7CisgICAgICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlclN0cmVhbTo6UmVhZCgpIEVPUyBzZW50LiIpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBEbyBub3QgcG9wIEVPUyBidWZmZXJzLCBzbyB0aGF0IHN1YnNlcXVlbnQgcmVhZCByZXF1ZXN0cyBhbHNvIGdldCBFT1MKKyAgICAgIGJ1ZmZlcl9xdWV1ZV8ucG9wX2Zyb250KCk7CisgICAgfQorICAgIHJlYWRfY2IuUnVuKAorICAgICAgICBEZW11eGVyU3RyZWFtOjprT2ssCisgICAgICAgIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+UHJvY2Vzc0JlZm9yZUxlYXZpbmdEZW11eGVyKGJ1ZmZlcikpOworICB9IGVsc2UgeworICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyU3RyZWFtOjpSZWFkKCkgcmVxdWVzdCBxdWV1ZWQuIik7CisgICAgcmVhZF9xdWV1ZV8ucHVzaF9iYWNrKHJlYWRfY2IpOworICB9Cit9CisKK0F1ZGlvRGVjb2RlckNvbmZpZyBTaGVsbERlbXV4ZXJTdHJlYW06OmF1ZGlvX2RlY29kZXJfY29uZmlnKCkgeworICByZXR1cm4gZGVtdXhlcl8tPkF1ZGlvQ29uZmlnKCk7Cit9CisKK1ZpZGVvRGVjb2RlckNvbmZpZyBTaGVsbERlbXV4ZXJTdHJlYW06OnZpZGVvX2RlY29kZXJfY29uZmlnKCkgeworICByZXR1cm4gZGVtdXhlcl8tPlZpZGVvQ29uZmlnKCk7Cit9CisKK1JhbmdlczxiYXNlOjpUaW1lRGVsdGE+IFNoZWxsRGVtdXhlclN0cmVhbTo6R2V0QnVmZmVyZWRSYW5nZXMoKSB7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIHJldHVybiBidWZmZXJlZF9yYW5nZXNfOworfQorCitEZW11eGVyU3RyZWFtOjpUeXBlIFNoZWxsRGVtdXhlclN0cmVhbTo6dHlwZSgpIGNvbnN0IHsgcmV0dXJuIHR5cGVfOyB9CisKK3ZvaWQgU2hlbGxEZW11eGVyU3RyZWFtOjpFbmFibGVCaXRzdHJlYW1Db252ZXJ0ZXIoKSB7IE5PVElNUExFTUVOVEVEKCk7IH0KKwordm9pZCBTaGVsbERlbXV4ZXJTdHJlYW06OkVucXVldWVCdWZmZXIoc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIpIHsKKyAgVFJBQ0VfRVZFTlQxKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXJTdHJlYW06OkVucXVldWVCdWZmZXIoKSIsCisgICAgICAgICAgICAgICAidGltZXN0YW1wIiwgYnVmZmVyLT50aW1lc3RhbXAoKS5Jbk1pY3Jvc2Vjb25kcygpKTsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgaWYgKHN0b3BwZWRfKSB7CisgICAgLy8gaXQncyBwb3NzaWJsZSBkdWUgdG8gcGlwZWxpbmluZyBib3RoIGRvd25zdHJlYW0gYW5kIHdpdGhpbiB0aGUKKyAgICAvLyBkZW11eGVyIHRoYXQgc2V2ZXJhbCBwaXBlbGluZWQgcmVhZHMgd2lsbCBiZSBlbnF1ZXVpbmcgcGFja2V0cworICAgIC8vIG9uIGEgc3RvcHBlZCBzdHJlYW0uIERyb3AgdGhlbSBhZnRlciBjb21wbGFpbmluZy4KKyAgICBETE9HKFdBUk5JTkcpIDw8ICJhdHRlbXB0ZWQgdG8gZW5xdWV1ZSBwYWNrZXQgb24gc3RvcHBlZCBzdHJlYW0iOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChidWZmZXItPmVuZF9vZl9zdHJlYW0oKSkgeworICAgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLAorICAgICAgICAgICAgICAgICAiU2hlbGxEZW11eGVyU3RyZWFtOjpFbnF1ZXVlQnVmZmVyKCkgRU9TIHJlY2VpdmVkLiIpOworICB9IGVsc2UgaWYgKGJ1ZmZlci0+dGltZXN0YW1wKCkgIT0ga05vVGltZXN0YW1wKSB7CisgICAgaWYgKGxhc3RfYnVmZmVyX3RpbWVzdGFtcF8gIT0ga05vVGltZXN0YW1wICYmCisgICAgICAgIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF8gPCBidWZmZXItPnRpbWVzdGFtcCgpKSB7CisgICAgICBidWZmZXJlZF9yYW5nZXNfLkFkZChsYXN0X2J1ZmZlcl90aW1lc3RhbXBfLCBidWZmZXItPnRpbWVzdGFtcCgpKTsKKyAgICB9CisgICAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyA9IGJ1ZmZlci0+dGltZXN0YW1wKCk7CisgIH0gZWxzZSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAiYmFkIHRpbWVzdGFtcCBpbmZvIG9uIGVucXVldWVkIGJ1ZmZlci4iOworICB9CisKKyAgLy8gQ2hlY2sgZm9yIGFueSBhbHJlYWR5IHdhaXRpbmcgcmVhZHMsIHNlcnZpY2Ugb2xkZXN0IHJlYWQgaWYgdGhlcmUKKyAgaWYgKHJlYWRfcXVldWVfLnNpemUoKSkgeworICAgIC8vIGFzc3VtcHRpb24gaGVyZSBpcyB0aGF0IGJ1ZmZlciBxdWV1ZSBpcyBlbXB0eQorICAgIERDSEVDS19FUShidWZmZXJfcXVldWVfLnNpemUoKSwgMCk7CisgICAgUmVhZENCIHJlYWRfY2IocmVhZF9xdWV1ZV8uZnJvbnQoKSk7CisgICAgcmVhZF9xdWV1ZV8ucG9wX2Zyb250KCk7CisgICAgcmVhZF9jYi5SdW4oCisgICAgICAgIERlbXV4ZXJTdHJlYW06OmtPaywKKyAgICAgICAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpLT5Qcm9jZXNzQmVmb3JlTGVhdmluZ0RlbXV4ZXIoYnVmZmVyKSk7CisgIH0gZWxzZSB7CisgICAgLy8gc2F2ZSB0aGUgYnVmZmVyIGZvciBuZXh0IHJlYWQgcmVxdWVzdAorICAgIGJ1ZmZlcl9xdWV1ZV8ucHVzaF9iYWNrKGJ1ZmZlcik7CisgIH0KK30KKworYmFzZTo6VGltZURlbHRhIFNoZWxsRGVtdXhlclN0cmVhbTo6R2V0TGFzdEJ1ZmZlclRpbWVzdGFtcCgpIGNvbnN0IHsKKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgcmV0dXJuIGxhc3RfYnVmZmVyX3RpbWVzdGFtcF87Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyU3RyZWFtOjpGbHVzaEJ1ZmZlcnMoKSB7CisgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyU3RyZWFtOjpGbHVzaEJ1ZmZlcnMoKSIpOworICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOworICAvLyBUT0RPOiBJbnZlc3RpZ2F0ZSBpZiB0aGUgZm9sbG93aW5nIHdhcm5pbmcgaXMgdmFsaWQuCisgIERMT0dfSUYoV0FSTklORywgIXJlYWRfcXVldWVfLmVtcHR5KCkpIDw8ICJSZWFkIHJlcXVlc3RzIHNob3VsZCBiZSBlbXB0eSI7CisgIGJ1ZmZlcl9xdWV1ZV8uY2xlYXIoKTsKKyAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcDsKK30KKwordm9pZCBTaGVsbERlbXV4ZXJTdHJlYW06OlN0b3AoKSB7CisgIFRSQUNFX0VWRU5UMCgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyU3RyZWFtOjpTdG9wKCkiKTsKKyAgRENIRUNLKGRlbXV4ZXJfLT5NZXNzYWdlTG9vcEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CisgIGJ1ZmZlcl9xdWV1ZV8uY2xlYXIoKTsKKyAgbGFzdF9idWZmZXJfdGltZXN0YW1wXyA9IGtOb1RpbWVzdGFtcDsKKyAgLy8gZnVsZmlsbCBhbnkgcGVuZGluZyBjYWxsYmFja3Mgd2l0aCBFT1MgYnVmZmVycyBzZXQgdG8gZW5kIHRpbWVzdGFtcAorICBmb3IgKFJlYWRRdWV1ZTo6aXRlcmF0b3IgaXQgPSByZWFkX3F1ZXVlXy5iZWdpbigpOyBpdCAhPSByZWFkX3F1ZXVlXy5lbmQoKTsKKyAgICAgICArK2l0KSB7CisgICAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXJTdHJlYW06OlN0b3AoKSBFT1Mgc2VudC4iKTsKKyAgICBpdC0+UnVuKERlbXV4ZXJTdHJlYW06OmtPaywKKyAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4oRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCkpKTsKKyAgfQorICByZWFkX3F1ZXVlXy5jbGVhcigpOworICBzdG9wcGVkXyA9IHRydWU7Cit9CisKKy8vCisvLyBTaGVsbERlbXV4ZXIKKy8vCitTaGVsbERlbXV4ZXI6OlNoZWxsRGVtdXhlcigKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCisgICAgRGF0YVNvdXJjZSogZGF0YV9zb3VyY2UsIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2cpCisgICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCisgICAgICBob3N0XyhOVUxMKSwKKyAgICAgIGJsb2NraW5nX3RocmVhZF8oIlNoZWxsRGVtdXhlckJsb2NraW5nVGhyZWFkIiksCisgICAgICBkYXRhX3NvdXJjZV8oZGF0YV9zb3VyY2UpLAorICAgICAgbWVkaWFfbG9nXyhtZWRpYV9sb2cpLAorICAgICAgc3RvcHBlZF8oZmFsc2UpLAorICAgICAgZmx1c2hpbmdfKGZhbHNlKSwKKyAgICAgIGF1ZGlvX3JlYWNoZWRfZW9zXyhmYWxzZSksCisgICAgICB2aWRlb19yZWFjaGVkX2Vvc18oZmFsc2UpIHsKKyAgRENIRUNLKGRhdGFfc291cmNlXyk7CisgIERDSEVDSyhtZWRpYV9sb2dfKTsKKyAgRENIRUNLKG1lc3NhZ2VfbG9vcF8pOworICByZWFkZXJfID0gbmV3IFNoZWxsRGF0YVNvdXJjZVJlYWRlcigpOworICByZWFkZXJfLT5TZXREYXRhU291cmNlKGRhdGFfc291cmNlXyk7Cit9CisKK1NoZWxsRGVtdXhlcjo6flNoZWxsRGVtdXhlcigpIHsKKyAgLy8gRXhwbGljaXRseSBzdG9wIHxibG9ja2luZ190aHJlYWRffCB0byBlbnN1cmUgdGhhdCBpdCBzdG9wcyBiZWZvcmUgdGhlCisgIC8vIGRlc3RydWN0aWluZyBvZiBhbnkgb3RoZXIgbWVtYmVycy4KKyAgYmxvY2tpbmdfdGhyZWFkXy5TdG9wKCk7Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyOjpJbml0aWFsaXplKERlbXV4ZXJIb3N0KiBob3N0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfdGV4dF90cmFja3MpIHsKKyAgVFJBQ0VfRVZFTlQwKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXI6OkluaXRpYWxpemUoKSIpOworICBEQ0hFQ0soIWVuYWJsZV90ZXh0X3RyYWNrcyk7CisgIERDSEVDSyhNZXNzYWdlTG9vcEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIERDSEVDSyhyZWFkZXJfKTsKKyAgRENIRUNLKCFwYXJzZXJfKTsKKworICBETE9HKElORk8pIDw8ICJ0aGlzIGlzIGEgUFJPR1JFU1NJVkUgcGxheWJhY2suIjsKKworICBob3N0XyA9IGhvc3Q7CisKKyAgLy8gY3JlYXRlIGF1ZGlvIGFuZCB2aWRlbyBkZW11eGVyIHN0cmVhbSBvYmplY3RzCisgIGF1ZGlvX2RlbXV4ZXJfc3RyZWFtXy5yZXNldCgKKyAgICAgIG5ldyBTaGVsbERlbXV4ZXJTdHJlYW0odGhpcywgRGVtdXhlclN0cmVhbTo6QVVESU8pKTsKKyAgdmlkZW9fZGVtdXhlcl9zdHJlYW1fLnJlc2V0KAorICAgICAgbmV3IFNoZWxsRGVtdXhlclN0cmVhbSh0aGlzLCBEZW11eGVyU3RyZWFtOjpWSURFTykpOworCisgIC8vIHN0YXJ0IHRoZSBibG9ja2luZyB0aHJlYWQgYW5kIGhhdmUgaXQgZG93bmxvYWQgYW5kIHBhcnNlIHRoZSBtZWRpYSBjb25maWcKKyAgaWYgKCFibG9ja2luZ190aHJlYWRfLlN0YXJ0KCkpIHsKKyAgICBzdGF0dXNfY2IuUnVuKERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFKTsKKyAgICByZXR1cm47CisgIH0KKworICBiYXNlOjpQb3N0VGFza0FuZFJlcGx5V2l0aFJlc3VsdCgKKyAgICAgIGJsb2NraW5nX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCksIEZST01fSEVSRSwKKyAgICAgIGJhc2U6OkJpbmQoJlNoZWxsRGVtdXhlcjo6UGFyc2VDb25maWdCbG9ja2luZywgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwKKyAgICAgICAgICAgICAgICAgc3RhdHVzX2NiKSwKKyAgICAgIGJhc2U6OkJpbmQoJlNoZWxsRGVtdXhlcjo6UGFyc2VDb25maWdEb25lLCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLAorICAgICAgICAgICAgICAgICBzdGF0dXNfY2IpKTsKK30KKworUGlwZWxpbmVTdGF0dXMgU2hlbGxEZW11eGVyOjpQYXJzZUNvbmZpZ0Jsb2NraW5nKAorICAgIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYikgeworICBEQ0hFQ0soYmxvY2tpbmdfdGhyZWFkXy5tZXNzYWdlX2xvb3BfcHJveHkoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgRENIRUNLKCFwYXJzZXJfKTsKKworICAvLyBjb25zdHJ1Y3Qgc3RyZWFtIHBhcnNlciB3aXRoIGVycm9yIGNhbGxiYWNrCisgIFBpcGVsaW5lU3RhdHVzIHN0YXR1cyA9IFNoZWxsUGFyc2VyOjpDb25zdHJ1Y3QocmVhZGVyXywgJnBhcnNlcl8sIG1lZGlhX2xvZ18pOworICAvLyBpZiB3ZSBjYW4ndCBjb25zdHJ1Y3QgYSBwYXJzZXIgZm9yIHRoaXMgc3RyZWFtIGl0J3MgYSBmYXRhbCBlcnJvciwgcmV0dXJuCisgIC8vIGZhbHNlIHNvIFBhcnNlQ29uZmlnRG9uZSB3aWxsIG5vdGlmeSB0aGUgY2FsbGVyIHRvIEluaXRpYWxpemUoKSB2aWEKKyAgLy8gc3RhdHVzX2NiLgorICBpZiAoIXBhcnNlcl8gfHwgc3RhdHVzICE9IFBJUEVMSU5FX09LKSB7CisgICAgRENIRUNLKCFwYXJzZXJfKTsKKyAgICBEQ0hFQ0tfTkUoc3RhdHVzLCBQSVBFTElORV9PSyk7CisgICAgaWYgKHN0YXR1cyA9PSBQSVBFTElORV9PSykgeworICAgICAgc3RhdHVzID0gREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0U7CisgICAgfQorICAgIHJldHVybiBzdGF0dXM7CisgIH0KKworICAvLyBpbnN0cnVjdCB0aGUgcGFyc2VyIHRvIGV4dHJhY3QgYXVkaW8gYW5kIHZpZGVvIGNvbmZpZyBmcm9tIHRoZSBmaWxlCisgIGlmICghcGFyc2VyXy0+UGFyc2VDb25maWcoKSkgeworICAgIHJldHVybiBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRTsKKyAgfQorCisgIC8vIG1ha2Ugc3VyZSB3ZSBnb3QgYSB2YWxpZCBhbmQgY29tcGxldGUgY29uZmlndXJhdGlvbgorICBpZiAoIXBhcnNlcl8tPklzQ29uZmlnQ29tcGxldGUoKSkgeworICAgIHJldHVybiBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRTsKKyAgfQorCisgIC8vIElzQ29uZmlnQ29tcGxldGUoKSBzaG91bGQgZ3VhcmFudGVlIHdlIGtub3cgdGhlIGR1cmF0aW9uCisgIERDSEVDSyhwYXJzZXJfLT5EdXJhdGlvbigpICE9IGtJbmZpbml0ZUR1cmF0aW9uKTsKKyAgaG9zdF8tPlNldER1cmF0aW9uKHBhcnNlcl8tPkR1cmF0aW9uKCkpOworICAvLyBCaXRyYXRlIG1heSBub3QgYmUga25vd24sIGhvd2V2ZXIKKyAgdWludDMyIGJpdHJhdGUgPSBwYXJzZXJfLT5CaXRzUGVyU2Vjb25kKCk7CisgIGlmIChiaXRyYXRlID4gMCkgeworICAgIGRhdGFfc291cmNlXy0+U2V0Qml0cmF0ZShiaXRyYXRlKTsKKyAgfQorCisgIC8vIHN1Y2Nlc3NmdWwgcGFyc2Ugb2YgY29uZmlnIGRhdGEsIGluZm9ybSB0aGUgbm9uYmxvY2tpbmcgZGVtdXhlciB0aHJlYWQKKyAgRENIRUNLX0VRKHN0YXR1cywgUElQRUxJTkVfT0spOworICByZXR1cm4gUElQRUxJTkVfT0s7Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyOjpQYXJzZUNvbmZpZ0RvbmUoY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQaXBlbGluZVN0YXR1cyBzdGF0dXMpIHsKKyAgRENIRUNLKE1lc3NhZ2VMb29wQmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgLy8gaWYgdGhlIGJsb2NraW5nIHBhcnNlciB0aHJlYWQgY2Fubm90IHBhcnNlIGNvbmZpZyB3ZSdyZSBkb25lLgorICBpZiAoc3RhdHVzICE9IFBJUEVMSU5FX09LKSB7CisgICAgc3RhdHVzX2NiLlJ1bihzdGF0dXMpOworICAgIHJldHVybjsKKyAgfQorICBEQ0hFQ0socGFyc2VyXyk7CisgIC8vIHN0YXJ0IGRvd25sb2FkaW5nIGRhdGEKKyAgUmVxdWVzdChEZW11eGVyU3RyZWFtOjpBVURJTyk7CisKKyAgc3RhdHVzX2NiLlJ1bihQSVBFTElORV9PSyk7Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyOjpSZXF1ZXN0KERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgeworICBpZiAoIWJsb2NraW5nX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCktPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSkgeworICAgIGJsb2NraW5nX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCktPlBvc3RUYXNrKAorICAgICAgICBGUk9NX0hFUkUsCisgICAgICAgIGJhc2U6OkJpbmQoJlNoZWxsRGVtdXhlcjo6UmVxdWVzdCwgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSwgdHlwZSkpOworICAgIHJldHVybjsKKyAgfQorCisgIERDSEVDSyghcmVxdWVzdGVkX2F1XykgPDwgIm92ZXJsYXBwaW5nIHJlcXVlc3RzIG5vdCBzdXBwb3J0ZWQhIjsKKyAgZmx1c2hpbmdfID0gZmFsc2U7CisgIC8vIEFzayBwYXJzZXIgZm9yIG5leHQgQVUKKyAgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBhdSA9IHBhcnNlcl8tPkdldE5leHRBVSh0eXBlKTsKKyAgLy8gZmF0YWwgcGFyc2luZyBlcnJvciByZXR1cm5zIE5VTEwgb3IgbWFsZm9ybWVkIEFVCisgIGlmICghYXUgfHwgIWF1LT5Jc1ZhbGlkKCkpIHsKKyAgICBpZiAoIXN0b3BwZWRfKSB7CisgICAgICBETE9HKEVSUk9SKSA8PCAiZ290IGJhY2sgYmFkIEFVIGZyb20gcGFyc2VyIjsKKyAgICAgIGhvc3RfLT5PbkRlbXV4ZXJFcnJvcihERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRSk7CisgICAgfQorICAgIHJldHVybjsKKyAgfQorCisgIC8vIG1ha2Ugc3VyZSB3ZSBnb3QgYmFjayBhbiBBVSBvZiB0aGUgY29ycmVjdCB0eXBlCisgIERDSEVDSyhhdS0+R2V0VHlwZSgpID09IHR5cGUpOworCisgIGNvbnN0IGNoYXIqIEFMTE9XX1VOVVNFRCBldmVudF90eXBlID0KKyAgICAgIHR5cGUgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8gPyAiYXVkaW8iIDogInZpZGVvIjsKKyAgVFJBQ0VfRVZFTlQyKCJtZWRpYV9zdGFjayIsICJTaGVsbERlbXV4ZXI6OlJlcXVlc3RUYXNrKCkiLCAidHlwZSIsIGV2ZW50X3R5cGUsCisgICAgICAgICAgICAgICAidGltZXN0YW1wIiwgYXUtPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOworCisgIC8vIGRvbid0IGlzc3VlIGFsbG9jYXRpb24gcmVxdWVzdHMgZm9yIEVPUyBBVXMKKyAgaWYgKGF1LT5Jc0VuZE9mU3RyZWFtKCkpIHsKKyAgICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlcjo6UmVxdWVzdFRhc2soKSBFT1Mgc2VudCIpOworICAgIC8vIGVucXVldWUgRU9TIGJ1ZmZlciB3aXRoIGNvcnJlY3Qgc3RyZWFtCisgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBlb3NfYnVmZmVyID0gRGVjb2RlckJ1ZmZlcjo6Q3JlYXRlRU9TQnVmZmVyKCk7CisgICAgaWYgKHR5cGUgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8pIHsKKyAgICAgIGF1ZGlvX3JlYWNoZWRfZW9zXyA9IHRydWU7CisgICAgICBhdWRpb19kZW11eGVyX3N0cmVhbV8tPkVucXVldWVCdWZmZXIoZW9zX2J1ZmZlcik7CisgICAgfSBlbHNlIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OlZJREVPKSB7CisgICAgICB2aWRlb19yZWFjaGVkX2Vvc18gPSB0cnVlOworICAgICAgdmlkZW9fZGVtdXhlcl9zdHJlYW1fLT5FbnF1ZXVlQnVmZmVyKGVvc19idWZmZXIpOworICAgIH0KKyAgICBJc3N1ZU5leHRSZXF1ZXN0KCk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gZW5xdWV1ZSB0aGUgcmVxdWVzdAorICByZXF1ZXN0ZWRfYXVfID0gYXU7CisKKyAgQWxsb2NhdGVCdWZmZXIoKTsKK30KKwordm9pZCBTaGVsbERlbXV4ZXI6OkFsbG9jYXRlQnVmZmVyKCkgeworICBEQ0hFQ0socmVxdWVzdGVkX2F1Xyk7CisKKyAgaWYgKHJlcXVlc3RlZF9hdV8gJiYgIXN0b3BwZWRfKSB7CisgICAgLy8gTm90ZSB0aGF0IHRoaXMgcmVsaWVzIG9uICJuZXcgRGVjb2RlckJ1ZmZlciIgcmV0dXJucyBOVUxMIGlmIGl0IGlzIHVuYWJsZQorICAgIC8vIHRvIGFsbG9jYXRlIGFueSBEZWNvZGVyQnVmZmVyLgorICAgIHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gZGVjb2Rlcl9idWZmZXIoCisgICAgICAgIG5ldyBEZWNvZGVyQnVmZmVyKHJlcXVlc3RlZF9hdV8tPkdldE1heFNpemUoKSkpOworICAgIGlmIChkZWNvZGVyX2J1ZmZlcikgeworICAgICAgZGVjb2Rlcl9idWZmZXItPnNldF9pc19rZXlfZnJhbWUocmVxdWVzdGVkX2F1Xy0+SXNLZXlmcmFtZSgpKTsKKyAgICAgIERvd25sb2FkKGRlY29kZXJfYnVmZmVyKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gQXMgdGhlIGJ1ZmZlciBpcyBmdWxsIG9mIG1lZGlhIGRhdGEsIGl0IGlzIHNhZmUgdG8gZGVsYXkgMTAwCisgICAgICAvLyBtaWxsaXNlY29uZHMuCisgICAgICBjb25zdCBiYXNlOjpUaW1lRGVsdGEga0RlbGF5ID0gYmFzZTo6VGltZURlbHRhOjpGcm9tTWlsbGlzZWNvbmRzKDEwMCk7CisgICAgICBibG9ja2luZ190aHJlYWRfLm1lc3NhZ2VfbG9vcCgpLT5Qb3N0RGVsYXllZFRhc2soCisgICAgICAgICAgRlJPTV9IRVJFLAorICAgICAgICAgIGJhc2U6OkJpbmQoJlNoZWxsRGVtdXhlcjo6QWxsb2NhdGVCdWZmZXIsIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAorICAgICAgICAgIGtEZWxheSk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyOjpEb3dubG9hZChzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+IGJ1ZmZlcikgeworICBEQ0hFQ0soYmxvY2tpbmdfdGhyZWFkXy5tZXNzYWdlX2xvb3BfcHJveHkoKS0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgLy8gV2UgbmVlZCBhIHJlcXVlc3RlZF9hdV8gb3IgdG8gaGF2ZSBjYW5jZWxlZCB0aGlzIHJlcXVlc3QgYW5kCisgIC8vIGFyZSBidWZmZXJpbmcgdG8gYSBuZXcgbG9jYXRpb24gZm9yIHRoaXMgdG8gbWFrZSBzZW5zZQorICBEQ0hFQ0socmVxdWVzdGVkX2F1Xyk7CisKKyAgY29uc3QgY2hhciogQUxMT1dfVU5VU0VEIGV2ZW50X3R5cGUgPQorICAgICAgcmVxdWVzdGVkX2F1Xy0+R2V0VHlwZSgpID09IERlbXV4ZXJTdHJlYW06OkFVRElPID8gImF1ZGlvIiA6ICJ2aWRlbyI7CisgIFRSQUNFX0VWRU5UMigibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyOjpEb3dubG9hZCgpIiwgInR5cGUiLCBldmVudF90eXBlLAorICAgICAgICAgICAgICAgInRpbWVzdGFtcCIsIHJlcXVlc3RlZF9hdV8tPkdldFRpbWVzdGFtcCgpLkluTWljcm9zZWNvbmRzKCkpOworICAvLyBkbyBub3RoaW5nIGlmIHN0b3BwZWQKKyAgaWYgKHN0b3BwZWRfKSB7CisgICAgRExPRyhJTkZPKSA8PCAiYWJvcnRpbmcgZG93bmxvYWQgdGFzaywgc3RvcHBlZCI7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gRmx1c2hpbmcgaXMgYSBzaWduYWwgdG8gcmVzdGFydCB0aGUgcmVxdWVzdC0+ZG93bmxvYWQgY3ljbGUgd2l0aAorICAvLyBhIG5ldyByZXF1ZXN0LiBEcm9wIGN1cnJlbnQgcmVxdWVzdCBhbmQgaXNzdWUgYSBuZXcgb25lLgorICAvLyBmbHVzaGluZ18gd2lsbCBiZSByZXNldCBieSB0aGUgbmV4dCBjYWxsIHRvIFJlcXVlc3RUYXNrKCkKKyAgaWYgKGZsdXNoaW5nXykgeworICAgIERMT0coSU5GTykgPDwgInNraXBwZWQgQVUgZG93bmxvYWQgZHVlIHRvIGZsdXNoIjsKKyAgICByZXF1ZXN0ZWRfYXVfID0gTlVMTDsKKyAgICBJc3N1ZU5leHRSZXF1ZXN0KCk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKCFyZXF1ZXN0ZWRfYXVfLT5SZWFkKHJlYWRlcl8sIGJ1ZmZlcikpIHsKKyAgICBETE9HKEVSUk9SKSA8PCAiYXUgcmVhZCBmYWlsZWQiOworICAgIGhvc3RfLT5PbkRlbXV4ZXJFcnJvcihQSVBFTElORV9FUlJPUl9SRUFEKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBjb3B5IHRpbWVzdGFtcCBhbmQgZHVyYXRpb24gdmFsdWVzCisgIGJ1ZmZlci0+c2V0X3RpbWVzdGFtcChyZXF1ZXN0ZWRfYXVfLT5HZXRUaW1lc3RhbXAoKSk7CisgIGJ1ZmZlci0+c2V0X2R1cmF0aW9uKHJlcXVlc3RlZF9hdV8tPkdldER1cmF0aW9uKCkpOworCisgIC8vIGVucXVldWUgYnVmZmVyIGludG8gYXBwcm9wcmlhdGUgc3RyZWFtCisgIGlmIChyZXF1ZXN0ZWRfYXVfLT5HZXRUeXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6QVVESU8pIHsKKyAgICBhdWRpb19kZW11eGVyX3N0cmVhbV8tPkVucXVldWVCdWZmZXIoYnVmZmVyKTsKKyAgfSBlbHNlIGlmIChyZXF1ZXN0ZWRfYXVfLT5HZXRUeXBlKCkgPT0gRGVtdXhlclN0cmVhbTo6VklERU8pIHsKKyAgICB2aWRlb19kZW11eGVyX3N0cmVhbV8tPkVucXVldWVCdWZmZXIoYnVmZmVyKTsKKyAgfSBlbHNlIHsKKyAgICBOT1RSRUFDSEVEKCkgPDwgImludmFsaWQgYnVmZmVyIHR5cGUgZW5xdWV1ZWQiOworICB9CisKKyAgLy8gZmluaXNoZWQgd2l0aCB0aGlzIGF1LCBkZXJlZgorICByZXF1ZXN0ZWRfYXVfID0gTlVMTDsKKworICAvLyBDYWxjdWxhdGUgdG90YWwgcmFuZ2Ugb2YgYnVmZmVyZWQgZGF0YSBmb3IgYm90aCBhdWRpbyBhbmQgdmlkZW8uCisgIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IGJ1ZmZlcmVkKAorICAgICAgYXVkaW9fZGVtdXhlcl9zdHJlYW1fLT5HZXRCdWZmZXJlZFJhbmdlcygpLkludGVyc2VjdGlvbldpdGgoCisgICAgICAgICAgdmlkZW9fZGVtdXhlcl9zdHJlYW1fLT5HZXRCdWZmZXJlZFJhbmdlcygpKSk7CisgIC8vIE5vdGlmeSBob3N0IG9mIGVhY2ggZGlzam9pbnQgcmFuZ2UuCisgIGhvc3RfLT5PbkJ1ZmZlcmVkVGltZVJhbmdlc0NoYW5nZWQoYnVmZmVyZWQpOworCisgIElzc3VlTmV4dFJlcXVlc3QoKTsKK30KKwordm9pZCBTaGVsbERlbXV4ZXI6Oklzc3VlTmV4dFJlcXVlc3QoKSB7CisgIERDSEVDSyghcmVxdWVzdGVkX2F1Xyk7CisgIC8vIGlmIHdlJ3JlIHN0b3BwZWQgZG9uJ3QgZG93bmxvYWQgYW55bW9yZQorICBpZiAoc3RvcHBlZF8pIHsKKyAgICBETE9HKElORk8pIDw8ICJzdG9wcGVkIHNvIHJlcXVlc3QgbG9vcCBpcyBzdG9wcGluZyI7CisgICAgcmV0dXJuOworICB9CisgIERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSA9IERlbXV4ZXJTdHJlYW06OlVOS05PV047CisgIC8vIGlmIHdlIGhhdmUgZW9zIGluIG9uZSBvciBib3RoIGJ1ZmZlcnMgdGhlIGRlY2lzaW9uIGlzIGVhc3kKKyAgaWYgKGF1ZGlvX3JlYWNoZWRfZW9zXyB8fCB2aWRlb19yZWFjaGVkX2Vvc18pIHsKKyAgICBpZiAoYXVkaW9fcmVhY2hlZF9lb3NfKSB7CisgICAgICBpZiAodmlkZW9fcmVhY2hlZF9lb3NfKSB7CisgICAgICAgIC8vIGJvdGggYXJlIHRydWUsIGlzc3VlIG5vIG1vcmUgcmVxdWVzdHMhCisgICAgICAgIERMT0coSU5GTykgPDwgImJvdGggc3RyZWFtcyBhdCBFT1MsIHJlcXVlc3QgbG9vcCBzdG9wcGluZyI7CisgICAgICAgIHJldHVybjsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIGF1ZGlvIGlzIGF0IGVvcywgdmlkZW8gaXNuJ3QsIGdldCBtb3JlIHZpZGVvCisgICAgICAgIHR5cGUgPSBEZW11eGVyU3RyZWFtOjpWSURFTzsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gYXVkaW8gaXMgbm90IGF0IGVvcywgdmlkZW8gaXMsIGdldCBtb3JlIGF1ZGlvCisgICAgICB0eXBlID0gRGVtdXhlclN0cmVhbTo6QVVESU87CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIHByaW9yaXR5IG9yZGVyIGZvciBmaWd1cmluZyBvdXQgd2hhdCB0byBkb3dubG9hZCBuZXh0CisgICAgYmFzZTo6VGltZURlbHRhIGF1ZGlvX3N0YW1wID0KKyAgICAgICAgYXVkaW9fZGVtdXhlcl9zdHJlYW1fLT5HZXRMYXN0QnVmZmVyVGltZXN0YW1wKCk7CisgICAgYmFzZTo6VGltZURlbHRhIHZpZGVvX3N0YW1wID0KKyAgICAgICAgdmlkZW9fZGVtdXhlcl9zdHJlYW1fLT5HZXRMYXN0QnVmZmVyVGltZXN0YW1wKCk7CisgICAgLy8gaWYgdGhlIGF1ZGlvIGRlbXV4ZXIgc3RyZWFtIGlzIGVtcHR5LCBhbHdheXMgZmlsbCBpdCBmaXJzdAorICAgIGlmIChhdWRpb19zdGFtcCA9PSBrTm9UaW1lc3RhbXApIHsKKyAgICAgIHR5cGUgPSBEZW11eGVyU3RyZWFtOjpBVURJTzsKKyAgICB9IGVsc2UgaWYgKHZpZGVvX3N0YW1wID09IGtOb1RpbWVzdGFtcCkgeworICAgICAgLy8gdGhlIHZpZGVvIGRlbXV4ZXIgc3RyZWFtIGlzIGVtcHR5LCB3ZSBuZWVkIGRhdGEgZm9yIGl0CisgICAgICB0eXBlID0gRGVtdXhlclN0cmVhbTo6VklERU87CisgICAgfSBlbHNlIGlmICh2aWRlb19zdGFtcCA8IGF1ZGlvX3N0YW1wKSB7CisgICAgICAvLyB2aWRlbyBpcyBlYXJsaWVyLCBmaWxsIGl0IGZpcnN0CisgICAgICB0eXBlID0gRGVtdXhlclN0cmVhbTo6VklERU87CisgICAgfSBlbHNlIHsKKyAgICAgIHR5cGUgPSBEZW11eGVyU3RyZWFtOjpBVURJTzsKKyAgICB9CisgIH0KKyAgRENIRUNLX05FKHR5cGUsIERlbXV4ZXJTdHJlYW06OlVOS05PV04pOworICAvLyBXZSBjYW5ub3QgY2FsbCBSZXF1ZXN0KCkgZGlyZWN0bHkgZXZlbiBpZiB0aGlzIGZ1bmN0aW9uIGlzIGFsc28gcnVuIG9uCisgIC8vIHxibG9ja2luZ190aHJlYWRffCBhcyBvdGhlcndpc2UgaXQgaXMgcG9zc2libGUgdGhhdCB0aGlzIGZ1bmN0aW9uIGlzCisgIC8vIHJ1bm5pbmcgaW4gYSB0aWdodCBsb29wIGFuZCBzZWVrIG9yIHN0b3AgcmVxdWVzdCBoYXMgbm8gY2hhbmNlIHRvIGtpY2sgaW4uCisgIGJsb2NraW5nX3RocmVhZF8ubWVzc2FnZV9sb29wX3Byb3h5KCktPlBvc3RUYXNrKAorICAgICAgRlJPTV9IRVJFLAorICAgICAgYmFzZTo6QmluZCgmU2hlbGxEZW11eGVyOjpSZXF1ZXN0LCBiYXNlOjpVbnJldGFpbmVkKHRoaXMpLCB0eXBlKSk7Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyOjpTdG9wKCkgeworICBEQ0hFQ0soTWVzc2FnZUxvb3BCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICAvLyBzZXQgb3VyIGludGVybmFsIHN0b3AgZmxhZywgdG8gbm90IHRyZWF0IHJlYWQgZmFpbHVyZXMgYXMKKyAgLy8gZXJyb3JzIGFueW1vcmUgYnV0IGFzIGEgbmF0dXJhbCBwYXJ0IG9mIHN0b3BwaW5nCisgIHN0b3BwZWRfID0gdHJ1ZTsKKyAgLy8gc3RvcCB0aGUgcmVhZGVyLCB3aGljaCB3aWxsIHN0b3AgdGhlIGRhdGFzb3VyY2UgYW5kIGNhbGwgYmFjaworICByZWFkZXJfLT5TdG9wKCk7Cit9CisKK3ZvaWQgU2hlbGxEZW11eGVyOjpEYXRhU291cmNlU3RvcHBlZChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgeworICBUUkFDRV9FVkVOVDAoIm1lZGlhX3N0YWNrIiwgIlNoZWxsRGVtdXhlcjo6RGF0YVNvdXJjZVN0b3BwZWQoKSIpOworICBEQ0hFQ0soTWVzc2FnZUxvb3BCZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworICAvLyBzdG9wIHRoZSBkb3dubG9hZCB0aHJlYWQKKyAgYmxvY2tpbmdfdGhyZWFkXy5TdG9wKCk7CisKKyAgLy8gdGVsbCBkb3duc3RyZWFtIHdlJ3ZlIHN0b3BwZWQKKyAgaWYgKGF1ZGlvX2RlbXV4ZXJfc3RyZWFtXykgYXVkaW9fZGVtdXhlcl9zdHJlYW1fLT5TdG9wKCk7CisgIGlmICh2aWRlb19kZW11eGVyX3N0cmVhbV8pIHZpZGVvX2RlbXV4ZXJfc3RyZWFtXy0+U3RvcCgpOworCisgIGNhbGxiYWNrLlJ1bigpOworfQorCit2b2lkIFNoZWxsRGVtdXhlcjo6U2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIHsKKyAgYmxvY2tpbmdfdGhyZWFkXy5tZXNzYWdlX2xvb3AoKS0+UG9zdFRhc2soCisgICAgICBGUk9NX0hFUkUsIGJhc2U6OkJpbmQoJlNoZWxsRGVtdXhlcjo6U2Vla1Rhc2ssIGJhc2U6OlVucmV0YWluZWQodGhpcyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZSwgQmluZFRvQ3VycmVudExvb3AoY2IpKSk7Cit9CisKKy8vIHJ1bnMgb24gYmxvY2tpbmcgdGhyZWFkCit2b2lkIFNoZWxsRGVtdXhlcjo6U2Vla1Rhc2soYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKSB7CisgIFRSQUNFX0VWRU5UMSgibWVkaWFfc3RhY2siLCAiU2hlbGxEZW11eGVyOjpTZWVrVGFzaygpIiwgInRpbWVzdGFtcCIsCisgICAgICAgICAgICAgICB0aW1lLkluTWljcm9zZWNvbmRzKCkpOworICBETE9HKElORk8pIDw8IGJhc2U6OlN0cmluZ1ByaW50Zigic2VlayB0bzogJSIgUFJJZDY0ICIgbXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lLkluTWlsbGlzZWNvbmRzKCkpOworICAvLyBjbGVhciBhbnkgZW5xdWV1ZWQgYnVmZmVycyBvbiBkZW11eGVyIHN0cmVhbXMKKyAgYXVkaW9fZGVtdXhlcl9zdHJlYW1fLT5GbHVzaEJ1ZmZlcnMoKTsKKyAgdmlkZW9fZGVtdXhlcl9zdHJlYW1fLT5GbHVzaEJ1ZmZlcnMoKTsKKyAgLy8gYWR2YW5jZSBwYXJzZXIgdG8gbmV3IHRpbWVzdGFtcAorICBpZiAoIXBhcnNlcl8tPlNlZWtUbyh0aW1lKSkgeworICAgIERMT0coRVJST1IpIDw8ICJwYXJzZXIgc2VlayBmYWlsZWQuIjsKKyAgICBjYi5SdW4oUElQRUxJTkVfRVJST1JfUkVBRCk7CisgICAgcmV0dXJuOworICB9CisgIC8vIGlmIGJvdGggc3RyZWFtcyBoYWQgZmluaXNoZWQgZG93bmxvYWRpbmcsIHdlIG5lZWQgdG8gcmVzdGFydCB0aGUgcmVxdWVzdAorICBpZiAoYXVkaW9fcmVhY2hlZF9lb3NfICYmIHZpZGVvX3JlYWNoZWRfZW9zXykgeworICAgIERMT0coSU5GTykgPDwgInJlc3RhcnRpbmcgc3RvcHBlZCByZXF1ZXN0IGxvb3AiOworICAgIFJlcXVlc3QoRGVtdXhlclN0cmVhbTo6QVVESU8pOworICB9CisgIGF1ZGlvX3JlYWNoZWRfZW9zXyA9IGZhbHNlOworICB2aWRlb19yZWFjaGVkX2Vvc18gPSBmYWxzZTsKKyAgZmx1c2hpbmdfID0gdHJ1ZTsKKyAgY2IuUnVuKFBJUEVMSU5FX09LKTsKK30KKworRGVtdXhlclN0cmVhbSogU2hlbGxEZW11eGVyOjpHZXRTdHJlYW0obWVkaWE6OkRlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgeworICBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpBVURJTykgeworICAgIHJldHVybiBhdWRpb19kZW11eGVyX3N0cmVhbV8uZ2V0KCk7CisgIH0gZWxzZSBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpWSURFTykgeworICAgIHJldHVybiB2aWRlb19kZW11eGVyX3N0cmVhbV8uZ2V0KCk7CisgIH0gZWxzZSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAidW5zdXBwb3J0ZWQgc3RyZWFtIHR5cGUgcmVxdWVzdGVkIjsKKyAgfQorICByZXR1cm4gTlVMTDsKK30KKworYmFzZTo6VGltZURlbHRhIFNoZWxsRGVtdXhlcjo6R2V0U3RhcnRUaW1lKCkgY29uc3QgeworICAvLyB3ZSBhbHdheXMgYXNzdW1lIGEgc3RhcnQgdGltZSBvZiAwCisgIHJldHVybiBiYXNlOjpUaW1lRGVsdGEoKTsKK30KKworY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBTaGVsbERlbXV4ZXI6OkF1ZGlvQ29uZmlnKCkgeworICByZXR1cm4gcGFyc2VyXy0+QXVkaW9Db25maWcoKTsKK30KKworY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBTaGVsbERlbXV4ZXI6OlZpZGVvQ29uZmlnKCkgeworICByZXR1cm4gcGFyc2VyXy0+VmlkZW9Db25maWcoKTsKK30KKworYm9vbCBTaGVsbERlbXV4ZXI6Ok1lc3NhZ2VMb29wQmVsb25nc1RvQ3VycmVudFRocmVhZCgpIGNvbnN0IHsKKyAgcmV0dXJuIG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NTBmODA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaApAQCAtMCwwICsxLDE4MCBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfRklMVEVSU19TSEVMTF9ERU1VWEVSX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX0RFTVVYRVJfSF8KKworI2luY2x1ZGUgPGRlcXVlPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgorI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3Jhbmdlcy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX3BhcnNlci5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCitjbGFzcyBEZWNvZGVyQnVmZmVyOworY2xhc3MgU2hlbGxEZW11eGVyOworCitjbGFzcyBTaGVsbERlbXV4ZXJTdHJlYW0gOiBwdWJsaWMgRGVtdXhlclN0cmVhbSB7CisgcHVibGljOgorICBTaGVsbERlbXV4ZXJTdHJlYW0oU2hlbGxEZW11eGVyKiBkZW11eGVyLCBUeXBlIHR5cGUpOworCisgIC8vIERlbXV4ZXJTdHJlYW0gaW1wbGVtZW50YXRpb24KKyAgdm9pZCBSZWFkKGNvbnN0IFJlYWRDQiYgcmVhZF9jYikgT1ZFUlJJREU7CisgIEF1ZGlvRGVjb2RlckNvbmZpZyBhdWRpb19kZWNvZGVyX2NvbmZpZygpIE9WRVJSSURFOworICBWaWRlb0RlY29kZXJDb25maWcgdmlkZW9fZGVjb2Rlcl9jb25maWcoKSBPVkVSUklERTsKKyAgVHlwZSB0eXBlKCkgY29uc3QgT1ZFUlJJREU7CisgIHZvaWQgRW5hYmxlQml0c3RyZWFtQ29udmVydGVyKCkgT1ZFUlJJREU7CisgIGJvb2wgU3VwcG9ydHNDb25maWdDaGFuZ2VzKCkgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KKyAgVmlkZW9Sb3RhdGlvbiB2aWRlb19yb3RhdGlvbigpIE9WRVJSSURFIHsgcmV0dXJuIFZJREVPX1JPVEFUSU9OXzA7IH0KKyAgYm9vbCBlbmFibGVkKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gdHJ1ZTsgfQorICB2b2lkIHNldF9lbmFibGVkKGJvb2wgZW5hYmxlZCwgYmFzZTo6VGltZURlbHRhIHRpbWVzdGFtcCkgT1ZFUlJJREUgeworICAgIERDSEVDSyhlbmFibGVkKTsKKyAgfQorICB2b2lkIFNldFN0cmVhbVN0YXR1c0NoYW5nZUNCKGNvbnN0IFN0cmVhbVN0YXR1c0NoYW5nZUNCJiBjYikgT1ZFUlJJREUgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorCisgIC8vIEZ1bmN0aW9ucyB1c2VkIGJ5IFNoZWxsRGVtdXhlcgorICBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiBHZXRCdWZmZXJlZFJhbmdlcygpOworICB2b2lkIEVucXVldWVCdWZmZXIoc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIpOworICB2b2lkIEZsdXNoQnVmZmVycygpOworICB2b2lkIFN0b3AoKTsKKyAgYmFzZTo6VGltZURlbHRhIEdldExhc3RCdWZmZXJUaW1lc3RhbXAoKSBjb25zdDsKKworIHByaXZhdGU6CisgIC8vIFRoZSBSYW5nZXMgb2JqZWN0IGRvZXNuJ3Qgb2ZmZXIgYSBjb21wbGVtZW50IG9iamVjdCBzbyB3ZSByZWJ1aWxkCisgIC8vIGVucXVldWVkIHJhbmdlcyBmcm9tIHRoZSB1bmlvbiBvZiBhbGwgb2YgdGhlIGJ1ZmZlcnMgaW4gdGhlIHF1ZXVlLgorICAvLyBDYWxsIG1lIHdoZW5ldmVyIF9yZW1vdmluZ18gZGF0YSBmcm9tIGJ1ZmZlcl9xdWV1ZV8uCisgIHZvaWQgUmVidWlsZEVucXVldWVkUmFuZ2VzX0xvY2tlZCgpOworCisgIC8vIG5vbi1vd25pbmcgcG9pbnRlciB0byBhdm9pZCBjaXJjdWxhciByZWZlcmVuY2UKKyAgU2hlbGxEZW11eGVyKiBkZW11eGVyXzsKKyAgVHlwZSB0eXBlXzsKKworICAvLyBVc2VkIHRvIHByb3RlY3QgZXZlcnl0aGluZyBiZWxvdy4KKyAgbXV0YWJsZSBiYXNlOjpMb2NrIGxvY2tfOworICAvLyBLZWVwcyB0cmFjayBvZiBhbGwgdGltZSByYW5nZXMgdGhpcyBvYmplY3QgaGFzIHNlZW4gc2luY2UgY3JlYXRpb24uCisgIC8vIFRoZSBkZW11eGVyIHVzZXMgdGhlc2UgcmFuZ2VzIHRvIHVwZGF0ZSB0aGUgcGlwZWxpbmUgYWJvdXQgd2hhdCBkYXRhCisgIC8vIGl0IGhhcyBkZW11eGVkLgorICBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiBidWZmZXJlZF9yYW5nZXNfOworICAvLyBUaGUgbGFzdCB0aW1lc3RhbXAgb2YgYnVmZmVyIGVucXVldWVkLiBUaGlzIGlzIHVzZWQgaW4gdHdvIHBsYWNlczoKKyAgLy8gICAxLiBVc2VkIHdpdGggdGhlIHRpbWVzdGFtcCBvZiB0aGUgY3VycmVudCBmcmFtZSB0byBjYWxjdWxhdGUgdGhlCisgIC8vICAgICAgYnVmZmVyIHJhbmdlLgorICAvLyAgIDIuIFVzZWQgYnkgdGhlIGRlbXV4ZXIgdG8gZGV0ZW1pbmF0ZSB3aGF0IHR5cGUgb2YgZnJhbWUgdG8gZ2V0IG5leHQuCisgIGJhc2U6OlRpbWVEZWx0YSBsYXN0X2J1ZmZlcl90aW1lc3RhbXBfOworICBib29sIHN0b3BwZWRfOworCisgIHR5cGVkZWYgc3RkOjpkZXF1ZTxzY29wZWRfcmVmcHRyPERlY29kZXJCdWZmZXI+ID4gQnVmZmVyUXVldWU7CisgIEJ1ZmZlclF1ZXVlIGJ1ZmZlcl9xdWV1ZV87CisKKyAgdHlwZWRlZiBzdGQ6OmRlcXVlPFJlYWRDQj4gUmVhZFF1ZXVlOworICBSZWFkUXVldWUgcmVhZF9xdWV1ZV87CisKKyAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsRGVtdXhlclN0cmVhbSk7Cit9OworCitjbGFzcyBNRURJQV9FWFBPUlQgU2hlbGxEZW11eGVyIDogcHVibGljIERlbXV4ZXIgeworIHB1YmxpYzoKKyAgU2hlbGxEZW11eGVyKGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIG1lc3NhZ2VfbG9vcCwKKyAgICAgICAgICAgICAgIERhdGFTb3VyY2UqIGRhdGFfc291cmNlLAorICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZyk7CisgIH5TaGVsbERlbXV4ZXIoKSBPVkVSUklERTsKKworICAvLyBEZW11eGVyIGltcGxlbWVudGF0aW9uLgorICBzdGQ6OnN0cmluZyBHZXREaXNwbGF5TmFtZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuICJTaGVsbERlbXV4ZXIiOyB9CisgIHZvaWQgSW5pdGlhbGl6ZShEZW11eGVySG9zdCogaG9zdCwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiLAorICAgICAgICAgICAgICAgICAgYm9vbCBlbmFibGVfdGV4dF90cmFja3MpIE9WRVJSSURFOworICB2b2lkIEFib3J0UGVuZGluZ1JlYWRzKCkgT1ZFUlJJREUge30KKyAgdm9pZCBTdGFydFdhaXRpbmdGb3JTZWVrKGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWUpIE9WRVJSSURFIHt9CisgIHZvaWQgQ2FuY2VsUGVuZGluZ1NlZWsoYmFzZTo6VGltZURlbHRhIHNlZWtfdGltZSkgT1ZFUlJJREUge30KKyAgdm9pZCBTdG9wKCkgT1ZFUlJJREU7CisgIHZvaWQgU2VlayhiYXNlOjpUaW1lRGVsdGEgdGltZSwgY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgY2IpIE9WRVJSSURFOworICBEZW11eGVyU3RyZWFtKiBHZXRTdHJlYW0oRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSBPVkVSUklERTsKKyAgYmFzZTo6VGltZURlbHRhIEdldFN0YXJ0VGltZSgpIGNvbnN0IE9WRVJSSURFOworICBiYXNlOjpUaW1lIEdldFRpbWVsaW5lT2Zmc2V0KCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gYmFzZTo6VGltZSgpOyB9CisgIGludDY0X3QgR2V0TWVtb3J5VXNhZ2UoKSBjb25zdCBPVkVSUklERSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworICB9CisgIHZvaWQgT25FbmFibGVkQXVkaW9UcmFja3NDaGFuZ2VkKGNvbnN0IHN0ZDo6dmVjdG9yPE1lZGlhVHJhY2s6OklkPiYgdHJhY2tfaWRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgY3VyclRpbWUpIE9WRVJSSURFIHsKKyAgICBOT1RSRUFDSEVEKCk7CisgIH0KKyAgdm9pZCBPblNlbGVjdGVkVmlkZW9UcmFja0NoYW5nZWQoY29uc3Qgc3RkOjp2ZWN0b3I8TWVkaWFUcmFjazo6SWQ+JiB0cmFja19pZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBjdXJyVGltZSkgT1ZFUlJJREUgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorCisgIC8vIFRPRE86IENvbnNpZGVyIG1vdmUgdGhlIGZvbGxvd2luZyBmdW5jdGlvbnMgdG8gcHJpdmF0ZSBzZWN0aW9uLgorCisgIC8vIElzc3VlcyBhIHRhc2sgdG8gdGhlIGRlbXV4ZXIgdG8gaWRlbnRpZnkgdGhlIG5leHQgYnVmZmVyIG9mIHByb3ZpZGVkIHR5cGUKKyAgLy8gaW4gdGhlIHN0cmVhbSwgYWxsb2NhdGUgbWVtb3J5IHRvIGNvbnRhaW4gdGhhdCBidWZmZXIsIGRvd25sb2FkIHRoZSBieXRlcworICAvLyBpbiB0byBpdCwgYW5kIGVucXVldWUgdGhlIGRhdGEgaW4gdGhlIGFwcHJvcHJpYXRlIGRlbXV4ZXIgc3RyZWFtLgorICB2b2lkIFJlcXVlc3QoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKTsKKworICAvLyBUaGUgRGVtdXhlclN0cmVhbSBvYmplY3RzIGFzayB0aGVpciBwYXJlbnQgU2hlbGxEZW11eGVyIHN0cmVhbSBjbGFzcworICAvLyBmb3IgdGhlc2UgY29uZmlndXJhdGlvbiBkYXRhIHJhdGhlciB0aGFuIGR1cGxpY2F0aW5nIGluIHRoZSBjaGlsZCBjbGFzc2VzCisgIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgQXVkaW9Db25maWcoKTsKKyAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBWaWRlb0NvbmZpZygpOworCisgIC8vIFByb3ZpZGUgYWNjZXNzIHRvIFNoZWxsRGVtdXhlclN0cmVhbS4KKyAgYm9vbCBNZXNzYWdlTG9vcEJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSBjb25zdDsKKworIHByaXZhdGU6CisgIHZvaWQgUGFyc2VDb25maWdEb25lKGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIHN0YXR1c19jYiwKKyAgICAgICAgICAgICAgICAgICAgICAgUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKKyAgdm9pZCBEYXRhU291cmNlU3RvcHBlZChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjayk7CisKKyAgLy8gbWV0aG9kcyB0aGF0IHBlcmZvcm0gYmxvY2tpbmcgSS9PLCBhbmQgYXJlIHRoZXJlZm9yZSBydW4gb24gdGhlCisgIC8vIGJsb2NraW5nX3RocmVhZF8KKyAgLy8gZG93bmxvYWQgZW5vdWdoIG9mIHRoZSBzdHJlYW0gdG8gcGFyc2UgdGhlIGNvbmZpZ3VyYXRpb24uIHJldHVybnMKKyAgLy8gZmFsc2Ugb24gZXJyb3IuCisgIFBpcGVsaW5lU3RhdHVzIFBhcnNlQ29uZmlnQmxvY2tpbmcoY29uc3QgUGlwZWxpbmVTdGF0dXNDQiYgc3RhdHVzX2NiKTsKKyAgdm9pZCBBbGxvY2F0ZUJ1ZmZlcigpOworICB2b2lkIERvd25sb2FkKHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4gYnVmZmVyKTsKKyAgdm9pZCBJc3N1ZU5leHRSZXF1ZXN0KCk7CisgIHZvaWQgU2Vla1Rhc2soYmFzZTo6VGltZURlbHRhIHRpbWUsIGNvbnN0IFBpcGVsaW5lU3RhdHVzQ0ImIGNiKTsKKworICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IG1lc3NhZ2VfbG9vcF87CisgIERlbXV4ZXJIb3N0KiBob3N0XzsKKworICAvLyBUaHJlYWQgb24gd2hpY2ggYWxsIGJsb2NraW5nIG9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkLgorICBiYXNlOjpUaHJlYWQgYmxvY2tpbmdfdGhyZWFkXzsKKyAgRGF0YVNvdXJjZSogZGF0YV9zb3VyY2VfOworICBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiBtZWRpYV9sb2dfOworICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyXzsKKworICBib29sIHN0b3BwZWRfOworICBib29sIGZsdXNoaW5nXzsKKworICBzY29wZWRfcHRyPFNoZWxsRGVtdXhlclN0cmVhbT4gYXVkaW9fZGVtdXhlcl9zdHJlYW1fOworICBzY29wZWRfcHRyPFNoZWxsRGVtdXhlclN0cmVhbT4gdmlkZW9fZGVtdXhlcl9zdHJlYW1fOworICBzY29wZWRfcmVmcHRyPFNoZWxsUGFyc2VyPiBwYXJzZXJfOworCisgIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gcmVxdWVzdGVkX2F1XzsKKyAgYm9vbCBhdWRpb19yZWFjaGVkX2Vvc187CisgIGJvb2wgdmlkZW9fcmVhY2hlZF9lb3NfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX0ZJTFRFUlNfU0hFTExfREVNVVhFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9tYXAuY2MgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzZjYjFmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9tYXAuY2MKQEAgLTAsMCArMSwxMTM5IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9lbmRpYW5fdXRpbC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gPT09PSBUYWJsZUNhY2hlID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU2hlbGxNUDRNYXA6OlRhYmxlQ2FjaGU6OlRhYmxlQ2FjaGUodWludDY0IHRhYmxlX29mZnNldCwgdWludDMyIGVudHJ5X2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGVudHJ5X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgY2FjaGVfc2l6ZV9lbnRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcikKKyAgICA6IGVudHJ5X3NpemVfKGVudHJ5X3NpemUpLAorICAgICAgZW50cnlfY291bnRfKGVudHJ5X2NvdW50KSwKKyAgICAgIGNhY2hlX3NpemVfZW50cmllc18oY2FjaGVfc2l6ZV9lbnRyaWVzKSwKKyAgICAgIHRhYmxlX29mZnNldF8odGFibGVfb2Zmc2V0KSwKKyAgICAgIHJlYWRlcl8ocmVhZGVyKSwKKyAgICAgIGNhY2hlX2ZpcnN0X2VudHJ5X251bWJlcl8oLTEpLAorICAgICAgY2FjaGVfZW50cnlfY291bnRfKDApIHt9CisKK3VpbnQ4KiBTaGVsbE1QNE1hcDo6VGFibGVDYWNoZTo6R2V0Qnl0ZXNBdEVudHJ5KHVpbnQzMiBlbnRyeV9udW1iZXIpIHsKKyAgLy8gZG9uJ3QgZmV0Y2ggdGhlIHVuZmV0Y2hhYmxlCisgIGlmIChlbnRyeV9udW1iZXIgPj0gZW50cnlfY291bnRfKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgLy8gdGhpcyBxdWVyeSB3aXRoaW4gdmFsaWQgcmFuZ2UgZm9yIHRoZSBjdXJyZW50IGNhY2hlIHRhYmxlPworICBpZiAoZW50cnlfbnVtYmVyIDwgY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXyB8fAorICAgICAgZW50cnlfbnVtYmVyID49IGNhY2hlX2ZpcnN0X2VudHJ5X251bWJlcl8gKyBjYWNoZV9lbnRyeV9jb3VudF8pIHsKKyAgICAvLyBDYWxjdWxhdGUgZmlyc3QgZW50cnkgaW4gdGFibGUga2VlcGluZyBjYWNoZSBzaXplIGFsaWdubWVudCBpbiB0YWJsZS4KKyAgICAvLyBBbHdheXMgY2FjaGUgb25lIG1vcmUgZW50cnkgYXMgaW4gc3RzcyB3ZSBuZWVkIHRvIHVzZSB0aGUgZmlyc3QgZW50cnkKKyAgICAvLyBvZiB0aGUgbmV4dCBjYWNoZSBzbG90IGFzIGFuIHVwcGVyIGJvdW5kLgorICAgIGNhY2hlX2VudHJ5X2NvdW50XyA9IGNhY2hlX3NpemVfZW50cmllc18gKyAxOworICAgIGNhY2hlX2ZpcnN0X2VudHJ5X251bWJlcl8gPQorICAgICAgICAoZW50cnlfbnVtYmVyIC8gY2FjaGVfc2l6ZV9lbnRyaWVzXykgKiBjYWNoZV9zaXplX2VudHJpZXNfOworICAgIC8vIHNlZSBpZiB3ZSBoYXZlIGV4Y2VlZGVkIG91ciB0YWJsZSBib3VuZHMKKyAgICBpZiAoY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXyArIGNhY2hlX2VudHJ5X2NvdW50XyA+IGVudHJ5X2NvdW50XykgeworICAgICAgY2FjaGVfZW50cnlfY291bnRfID0gZW50cnlfY291bnRfIC0gY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXzsKKyAgICB9CisgICAgLy8gZHJvcCBvbGQgZGF0YSB0byBhbGxvdyBTaGVsbEJ1ZmZlckZhY3RvcnkgdG8gZGVmcmFnCisgICAgY2FjaGVfLmNsZWFyKCk7CisgICAgRENIRUNLX0dFKGNhY2hlX2VudHJ5X2NvdW50XywgMCk7CisgICAgaW50IGJ5dGVzX3RvX3JlYWQgPSBjYWNoZV9lbnRyeV9jb3VudF8gKiBlbnRyeV9zaXplXzsKKyAgICBjYWNoZV8ucmVzaXplKGJ5dGVzX3RvX3JlYWQpOworICAgIHVpbnQ2NCBmaWxlX29mZnNldCA9CisgICAgICAgIHRhYmxlX29mZnNldF8gKyAoY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXyAqIGVudHJ5X3NpemVfKTsKKyAgICBpbnQgYnl0ZXNfcmVhZCA9CisgICAgICAgIHJlYWRlcl8tPkJsb2NraW5nUmVhZChmaWxlX29mZnNldCwgYnl0ZXNfdG9fcmVhZCwgJmNhY2hlX1swXSk7CisgICAgaWYgKGJ5dGVzX3JlYWQgPCBieXRlc190b19yZWFkKSB7CisgICAgICBjYWNoZV9lbnRyeV9jb3VudF8gPSAwOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICB9CisgIC8vIGNhY2hlIGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQgYW5kIHRvIGNvbnRhaW4gdGhlIGVudHJ5IGZyb20gaGVyZSBvbgorICBEQ0hFQ0tfR0UoZW50cnlfbnVtYmVyLCBjYWNoZV9maXJzdF9lbnRyeV9udW1iZXJfKTsKKyAgRENIRUNLX0xUKGVudHJ5X251bWJlciwgY2FjaGVfZmlyc3RfZW50cnlfbnVtYmVyXyArIGNhY2hlX2VudHJ5X2NvdW50Xyk7CisKKyAgdWludDMyIGNhY2hlX29mZnNldCA9IGVudHJ5X251bWJlciAtIGNhY2hlX2ZpcnN0X2VudHJ5X251bWJlcl87CisgIHJldHVybiAmY2FjaGVfWzBdICsgKGNhY2hlX29mZnNldCAqIGVudHJ5X3NpemVfKTsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6VGFibGVDYWNoZTo6UmVhZFUzMkVudHJ5KHVpbnQzMiBlbnRyeV9udW1iZXIsIHVpbnQzMiogZW50cnkpIHsKKyAgaWYgKHVpbnQ4KiBkYXRhID0gR2V0Qnl0ZXNBdEVudHJ5KGVudHJ5X251bWJlcikpIHsKKyAgICAqZW50cnkgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihkYXRhKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6VGFibGVDYWNoZTo6UmVhZFUzMlBhaXJFbnRyeSh1aW50MzIgZW50cnlfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIqIGZpcnN0LCB1aW50MzIqIHNlY29uZCkgeworICBpZiAodWludDgqIGRhdGEgPSBHZXRCeXRlc0F0RW50cnkoZW50cnlfbnVtYmVyKSkgeworICAgIGlmIChmaXJzdCkgKmZpcnN0ID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oZGF0YSk7CisgICAgaWYgKHNlY29uZCkgKnNlY29uZCA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKGRhdGEgKyA0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6VGFibGVDYWNoZTo6UmVhZFUzMkVudHJ5SW50b1U2NCh1aW50MzIgZW50cnlfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjQqIGVudHJ5KSB7CisgIGlmICh1aW50OCogZGF0YSA9IEdldEJ5dGVzQXRFbnRyeShlbnRyeV9udW1iZXIpKSB7CisgICAgKmVudHJ5ID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oZGF0YSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU2hlbGxNUDRNYXA6OlRhYmxlQ2FjaGU6OlJlYWRVNjRFbnRyeSh1aW50MzIgZW50cnlfbnVtYmVyLCB1aW50NjQqIGVudHJ5KSB7CisgIGlmICh1aW50OCogZGF0YSA9IEdldEJ5dGVzQXRFbnRyeShlbnRyeV9udW1iZXIpKSB7CisgICAgKmVudHJ5ID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDY0X2JpZ19lbmRpYW4oZGF0YSk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICByZXR1cm4gZmFsc2U7Cit9CisKKy8vID09PT0gU2hlbGxNUDRNYXAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGF0b20gfCBuYW1lICAgICAgICAgICAgICAgICAgfCBzaXplIHwgZGVzY3JpcHRpb24sICgqKSBtZWFucyBvcHRpb25hbCB0YWJsZQorLy8gLS0tLS0rLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGNvNjQgfCBjaHVuayBvZmZzZXQgKDY0LWJpdCkgfCA4ICAgIHwgcGVyLWNodW5rIGxpc3Qgb2YgY2h1bmsgZmlsZSBvZmZzZXRzCisvLyBjdHRzIHwgY29tcG9zaXRpb24gb2Zmc2V0ICAgIHwgOCAgICB8ICgqKSBydW4tbGVuZ3RoIHNhbXBsZSBudW1iZXIgdG8gY3RzCisvLyBzdGNvIHwgY2h1bmsgb2Zmc2V0ICgzMi1iaXQpIHwgNCAgICB8IHBlci1jaHVuayBsaXN0IG9mIGNodW5rIGZpbGUgb2Zmc2V0cworLy8gc3RzYyB8IHNhbXBsZS10by1jaHVuayAgICAgICB8IDEyICAgfCBjaHVuayBudW1iZXIgdG8gc2FtcGxlcyBwZXIgY2h1bmsKKy8vIHN0c3MgfCBzeW5jIHNhbXBsZSAgICAgICAgICAgfCA0ICAgIHwgKCopIGxpc3Qgb2Yga2V5ZnJhbWUgc2FtcGxlIG51bWJlcnMKKy8vIHN0dHMgfCB0aW1lLXRvLXNhbXBsZSAgICAgICAgfCA4ICAgIHwgcnVuLWxlbmd0aCBzYW1wbGUgbnVtYmVyIHRvIGR1cmF0aW9uCisvLyBzdHN6IHwgc2FtcGxlIHNpemUgICAgICAgICAgIHwgNCAgICB8IHBlci1zYW1wbGUgbGlzdCBvZiBzYW1wbGUgc2l6ZXMKKworU2hlbGxNUDRNYXA6OlNoZWxsTVA0TWFwKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIpCisgICAgOiByZWFkZXJfKHJlYWRlciksCisgICAgICBjdXJyZW50X2NodW5rX3NhbXBsZV8oMCksCisgICAgICBuZXh0X2NodW5rX3NhbXBsZV8oMCksCisgICAgICBjdXJyZW50X2NodW5rX29mZnNldF8oMCksCisgICAgICBoaWdoZXN0X3ZhbGlkX3NhbXBsZV9udW1iZXJfKFVJTlQzMl9NQVgpLAorICAgICAgY3R0c19maXJzdF9zYW1wbGVfKDApLAorICAgICAgY3R0c19zYW1wbGVfb2Zmc2V0XygwKSwKKyAgICAgIGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfKDApLAorICAgICAgY3R0c190YWJsZV9pbmRleF8oMCksCisgICAgICBzdHNjX2ZpcnN0X2NodW5rXygwKSwKKyAgICAgIHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXygwKSwKKyAgICAgIHN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfKDApLAorICAgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rXygwKSwKKyAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfKDApLAorICAgICAgc3RzY190YWJsZV9pbmRleF8oMCksCisgICAgICBzdHNzX2xhc3Rfa2V5ZnJhbWVfKDApLAorICAgICAgc3Rzc19uZXh0X2tleWZyYW1lXygwKSwKKyAgICAgIHN0c3NfdGFibGVfaW5kZXhfKDApLAorICAgICAgc3R0c19maXJzdF9zYW1wbGVfKDApLAorICAgICAgc3R0c19maXJzdF9zYW1wbGVfdGltZV8oMCksCisgICAgICBzdHRzX3NhbXBsZV9kdXJhdGlvbl8oMCksCisgICAgICBzdHRzX25leHRfZmlyc3Rfc2FtcGxlXygwKSwKKyAgICAgIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfdGltZV8oMCksCisgICAgICBzdHRzX3RhYmxlX2luZGV4XygwKSwKKyAgICAgIHN0c3pfZGVmYXVsdF9zaXplXygwKSB7fQorCitib29sIFNoZWxsTVA0TWFwOjpJc0NvbXBsZXRlKCkgeworICAvLyBhbGwgcmVxdWlyZWQgdGFibGUgcG9pbnRlcnMgbXVzdCBiZSB2YWxpZCBmb3IgbWFwIHRvIGZ1bmN0aW9uCisgIHJldHVybiAoY282NF8gfHwgc3Rjb18pICYmIHN0c2NfICYmIHN0dHNfICYmIChzdHN6XyB8fCBzdHN6X2RlZmF1bHRfc2l6ZV8pOworfQorCisvLyBUaGUgc2FtcGxlIHNpemUgaXMgYSBsb29rdXAgaW4gdGhlIHN0c3ogdGFibGUsIHdoaWNoIGlzIGluZGV4ZWQgcGVyIHNhbXBsZQorLy8gbnVtYmVyLgorYm9vbCBTaGVsbE1QNE1hcDo6R2V0U2l6ZSh1aW50MzIgc2FtcGxlX251bWJlciwgdWludDMyKiBzaXplX291dCkgeworICBEQ0hFQ0soc2l6ZV9vdXQpOworICBEQ0hFQ0soc3Rzel8gfHwgc3Rzel9kZWZhdWx0X3NpemVfKTsKKworICBpZiAoc2FtcGxlX251bWJlciA+IGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoc3Rzel9kZWZhdWx0X3NpemVfKSB7CisgICAgKnNpemVfb3V0ID0gc3Rzel9kZWZhdWx0X3NpemVfOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgcmV0dXJuIHN0c3pfLT5SZWFkVTMyRW50cnkoc2FtcGxlX251bWJlciwgc2l6ZV9vdXQpOworfQorCisvLyBXZSBmaXJzdCBtdXN0IGludGVncmF0ZSB0aGUgc3RzYyB0YWJsZSB0byBmaW5kIHRoZSBjaHVuayBudW1iZXIgdGhhdCB0aGUKKy8vIHNhbXBsZSByZXNpZGVzIGluLCBhbmQgdGhlIGZpcnN0IHNhbXBsZSBudW1iZXIgaW4gdGhhdCBjaHVuay4gV2UgbG9vayB1cCB0aGF0CisvLyBjaHVuayBvZmZzZXQgZnJvbSB0aGUgc3RjbyBvciBjbzY0LCB3aGljaCBhcmUgaW5kZXhlZCBieSBjaHVuayBudW1iZXIuIFdlCisvLyB0aGVuIHVzZSB0aGUgc3RzeiB0byBzdW0gc2FtcGxlcyB0byB0aGUgYnl0ZSBvZmZzZXQgd2l0aCB0aGF0IGNodW5rLiBUaGUgc3VtCisvLyBvZiB0aGUgY2h1bmsgb2Zmc2V0IGFuZCB0aGUgYnl0ZSBvZmZzZXQgd2l0aGluIHRoZSBjaHVuayBpcyB0aGUgb2Zmc2V0IG9mCisvLyB0aGUgc2FtcGxlLgorYm9vbCBTaGVsbE1QNE1hcDo6R2V0T2Zmc2V0KHVpbnQzMiBzYW1wbGVfbnVtYmVyLCB1aW50NjQqIG9mZnNldF9vdXQpIHsKKyAgRENIRUNLKG9mZnNldF9vdXQpOworICBEQ0hFQ0soc3RzY18pOworICBEQ0hFQ0soc3Rjb18gfHwgY282NF8pOworICBEQ0hFQ0soc3Rzel8gfHwgc3Rzel9kZWZhdWx0X3NpemVfKTsKKworICBpZiAoc2FtcGxlX251bWJlciA+IGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBjaGVjayBmb3Igc2VxdWVudGlhbCBhY2Nlc3Mgb2Ygc2FtcGxlIG51bWJlcnMgd2l0aGluIHRoZSBzYW1lIGNodW5rCisgIGlmIChzYW1wbGVfbnVtYmVyIDwgY3VycmVudF9jaHVua19zYW1wbGVfIHx8CisgICAgICBzYW1wbGVfbnVtYmVyID49IG5leHRfY2h1bmtfc2FtcGxlXykgeworICAgIC8vIGludGVncmF0ZSB0aHJvdWdoIHN0c2MgdW50aWwgd2UgZmluZCB0aGUgY2h1bmsgcmFuZ2UgY29udGFpbmluZyBzYW1wbGUKKyAgICBpZiAoIXN0c2NfQWR2YW5jZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSBzdHNjIGFkdmFuY2UgZGlkIGl0cyBqb2IgY29ycmVjdGx5CisgICAgRENIRUNLX0dFKHNhbXBsZV9udW1iZXIsIHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXyk7CisKKyAgICAvLyBjYWxjdWxhdGUgY2h1bmsgbnVtYmVyIGJhc2VkIG9uIGNodW5rIHNhbXBsZSBzaXplIGZvciB0aGlzIHJhbmdlCisgICAgdWludDMyIHNhbXBsZV9vZmZzZXQgPSBzYW1wbGVfbnVtYmVyIC0gc3RzY19maXJzdF9jaHVua19zYW1wbGVfOworICAgIHVpbnQzMiBjaHVua19yYW5nZV9vZmZzZXQgPSBzYW1wbGVfb2Zmc2V0IC8gc3RzY19zYW1wbGVzX3Blcl9jaHVua187CisgICAgdWludDMyIGNodW5rX251bWJlciA9IHN0c2NfZmlyc3RfY2h1bmtfICsgY2h1bmtfcmFuZ2Vfb2Zmc2V0OworICAgIC8vIHNob3VsZCBiZSB3aXRoaW4gdGhlIHJhbmdlIG9mIGNodW5rcyB3aXRoIHRoaXMgc2FtcGxlIHNpemUKKyAgICBEQ0hFQ0tfTFQoY2h1bmtfbnVtYmVyLCBzdHNjX25leHRfZmlyc3RfY2h1bmtfKTsKKyAgICAvLyB1cGRhdGUgZmlyc3Qgc2FtcGxlIG51bWJlciBjb250YWluZWQgd2l0aGluIHRoaXMgY2h1bmsKKyAgICBjdXJyZW50X2NodW5rX3NhbXBsZV8gPSBzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaHVua19yYW5nZV9vZmZzZXQgKiBzdHNjX3NhbXBsZXNfcGVyX2NodW5rXyk7CisgICAgLy8gdXBkYXRlIGZpcnN0IHNhbXBsZSBudW1iZXIgb2YgbmV4dCBjaHVuaworICAgIG5leHRfY2h1bmtfc2FtcGxlXyA9IGN1cnJlbnRfY2h1bmtfc2FtcGxlXyArIHN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfOworICAgIC8vIGZpbmQgb2Zmc2V0IG9mIHRoaXMgY2h1bmsgd2l0aGluIHRoZSBmaWxlIGZyb20gY282NC9zdGNvCisgICAgaWYgKGNvNjRfKSB7CisgICAgICBpZiAoIWNvNjRfLT5SZWFkVTY0RW50cnkoY2h1bmtfbnVtYmVyLCAmY3VycmVudF9jaHVua19vZmZzZXRfKSkKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0gZWxzZSBpZiAoIXN0Y29fLT5SZWFkVTMyRW50cnlJbnRvVTY0KGNodW5rX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3VycmVudF9jaHVua19vZmZzZXRfKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIC8vIGF0IHRoaXMgcG9pbnQgd2Ugc2hvdWxkIGhhdmUgc2FtcGxlX251bWJlciB3aXRoaW4gdGhlIHJhbmdlIG9mIG91ciBjaHVuaworICAvLyBvZmZzZXQgc3VtbWF0aW9uIHNhdmVkIHN0YXRlCisgIERDSEVDS19MRShjdXJyZW50X2NodW5rX3NhbXBsZV8sIHNhbXBsZV9udW1iZXIpOworICBEQ0hFQ0tfTFQoc2FtcGxlX251bWJlciwgbmV4dF9jaHVua19zYW1wbGVfKTsKKworICBpZiAoc3Rzel9kZWZhdWx0X3NpemVfID4gMCkgeworICAgIGN1cnJlbnRfY2h1bmtfb2Zmc2V0XyArPQorICAgICAgICAoc2FtcGxlX251bWJlciAtIGN1cnJlbnRfY2h1bmtfc2FtcGxlXykgKiBzdHN6X2RlZmF1bHRfc2l6ZV87CisgICAgY3VycmVudF9jaHVua19zYW1wbGVfID0gc2FtcGxlX251bWJlcjsKKyAgfSBlbHNlIHsKKyAgICAvLyBzdW0gc2FtcGxlIHNpemVzIHdpdGhpbiBjaHVuayB0byBnZXQgdG8gYnl0ZSBvZmZzZXQgb2Ygc2FtcGxlCisgICAgd2hpbGUgKGN1cnJlbnRfY2h1bmtfc2FtcGxlXyA8IHNhbXBsZV9udW1iZXIpIHsKKyAgICAgIHVpbnQzMiBzYW1wbGVfc2l6ZSA9IDA7CisgICAgICBpZiAoIUdldFNpemUoY3VycmVudF9jaHVua19zYW1wbGVfLCAmc2FtcGxlX3NpemUpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGN1cnJlbnRfY2h1bmtfb2Zmc2V0XyArPSBzYW1wbGVfc2l6ZTsKKyAgICAgIGN1cnJlbnRfY2h1bmtfc2FtcGxlXysrOworICAgIH0KKyAgfQorCisgICpvZmZzZXRfb3V0ID0gY3VycmVudF9jaHVua19vZmZzZXRfOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gR2l2ZW4gYSBjdXJyZW50IHNhbXBsZSBudW1iZXIgd2UgaW50ZWdyYXRlIHRocm91Z2ggdGhlIHN0dHMgdG8gZmluZCB0aGUKKy8vIGR1cmF0aW9uIG9mIHRoZSBjdXJyZW50IHNhbXBsZSwgYW5kIGF0IHRoZSBzYW1lIHRpbWUgaW50ZWdyYXRlIHRocm91Z2ggdGhlCisvLyBkdXJhdGlvbnMgdG8gZmluZCB0aGUgZHRzIG9mIHRoYXQgc2FtcGxlIG51bWJlci4gV2UgdGhlbiBpbnRlZ3JhdGUgc2FtcGxlCisvLyBudW1iZXJzIHRocm91Z2ggdGhlIGN0dHMgdG8gZmluZCB0aGUgY29tcG9zaXRpb24gdGltZSBvZmZzZXQsIHdoaWNoIHdlIGFkZCB0bworLy8gdGhlIGR0cyB0byByZXR1cm4gdGhlIHB0cy4KK2Jvb2wgU2hlbGxNUDRNYXA6OkdldFRpbWVzdGFtcCh1aW50MzIgc2FtcGxlX251bWJlciwgdWludDY0KiB0aW1lc3RhbXBfb3V0KSB7CisgIERDSEVDSyh0aW1lc3RhbXBfb3V0KTsKKyAgaWYgKHNhbXBsZV9udW1iZXIgPiBoaWdoZXN0X3ZhbGlkX3NhbXBsZV9udW1iZXJfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFzdHRzX0FkdmFuY2VUb1NhbXBsZShzYW1wbGVfbnVtYmVyKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBEQ0hFQ0tfTFQoc2FtcGxlX251bWJlciwgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8pOworICBEQ0hFQ0tfR0Uoc2FtcGxlX251bWJlciwgc3R0c19maXJzdF9zYW1wbGVfKTsKKyAgdWludDY0IGR0cyA9IHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfICsKKyAgICAgICAgICAgICAgIChzYW1wbGVfbnVtYmVyIC0gc3R0c19maXJzdF9zYW1wbGVfKSAqIHN0dHNfc2FtcGxlX2R1cmF0aW9uXzsKKyAgaWYgKGN0dHNfKSB7CisgICAgaWYgKCFjdHRzX0FkdmFuY2VUb1NhbXBsZShzYW1wbGVfbnVtYmVyKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBEQ0hFQ0tfTFQoc2FtcGxlX251bWJlciwgY3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8pOworICAgIERDSEVDS19HRShzYW1wbGVfbnVtYmVyLCBjdHRzX2ZpcnN0X3NhbXBsZV8pOworICB9CisgICp0aW1lc3RhbXBfb3V0ID0gZHRzICsgY3R0c19zYW1wbGVfb2Zmc2V0XzsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFN1bSB0aHJvdWdoIHRoZSBzdHRzIHRvIGZpbmQgdGhlIGR1cmF0aW9uIG9mIHRoZSBnaXZlbiBzYW1wbGVfbnVtYmVyLgorYm9vbCBTaGVsbE1QNE1hcDo6R2V0RHVyYXRpb24odWludDMyIHNhbXBsZV9udW1iZXIsIHVpbnQzMiogZHVyYXRpb25fb3V0KSB7CisgIERDSEVDSyhkdXJhdGlvbl9vdXQpOworICBpZiAoc2FtcGxlX251bWJlciA+IGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIXN0dHNfQWR2YW5jZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIERDSEVDS19MVChzYW1wbGVfbnVtYmVyLCBzdHRzX25leHRfZmlyc3Rfc2FtcGxlXyk7CisgIERDSEVDS19HRShzYW1wbGVfbnVtYmVyLCBzdHRzX2ZpcnN0X3NhbXBsZV8pOworICAqZHVyYXRpb25fb3V0ID0gc3R0c19zYW1wbGVfZHVyYXRpb25fOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6R2V0SXNLZXlmcmFtZSh1aW50MzIgc2FtcGxlX251bWJlciwgYm9vbCogaXNfa2V5ZnJhbWVfb3V0KSB7CisgIERDSEVDSyhpc19rZXlmcmFtZV9vdXQpOworICBpZiAoc2FtcGxlX251bWJlciA+IGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBubyBzdHRzIG1lYW5zIGV2ZXJ5IGZyYW1lIGlzIGEga2V5ZnJhbWUKKyAgaWYgKCFzdHNzXykgeworICAgICppc19rZXlmcmFtZV9vdXQgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gY2hlY2sgZm9yIGtleWZyYW1lIG1hdGNoIG9uIGVpdGhlciByYW5nZSB2YWx1ZQorICBpZiAoc2FtcGxlX251bWJlciA9PSBzdHNzX25leHRfa2V5ZnJhbWVfKSB7CisgICAgKmlzX2tleWZyYW1lX291dCA9IHRydWU7CisgICAgcmV0dXJuIHN0c3NfQWR2YW5jZVN0ZXAoKTsKKyAgfSBlbHNlIGlmIChzYW1wbGVfbnVtYmVyID09IHN0c3NfbGFzdF9rZXlmcmFtZV8pIHsKKyAgICAqaXNfa2V5ZnJhbWVfb3V0ID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIHRoaXMgY291bGQgYmUgZm9yIGEgbXVjaCBlYXJsaWVyIHNhbXBsZSBudW1iZXIsIGNoZWNrIGlmIHdlIGFyZSB3aXRoaW4KKyAgLy8gY3VycmVudCByYW5nZSBvZiBzYW1wbGUgbnVtYmVycworICBpZiAoc2FtcGxlX251bWJlciA8IHN0c3NfbGFzdF9rZXlmcmFtZV8gfHwKKyAgICAgIHNhbXBsZV9udW1iZXIgPiBzdHNzX25leHRfa2V5ZnJhbWVfKSB7CisgICAgLy8gc2VhcmNoIGZvciBjb250YWluaW5nIGVudHJ5CisgICAgaWYgKCFzdHNzX0ZpbmROZWFyZXN0S2V5ZnJhbWUoc2FtcGxlX251bWJlcikpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgLy8gc2FtcGxlIG51bWJlciBtdXN0IGJlIGluIHJhbmdlIG9mIGtleWZyYW1lIHN0YXRlcworICBEQ0hFQ0tfR0Uoc2FtcGxlX251bWJlciwgc3Rzc19sYXN0X2tleWZyYW1lXyk7CisgIERDSEVDS19MVChzYW1wbGVfbnVtYmVyLCBzdHNzX25leHRfa2V5ZnJhbWVfKTsKKyAgLy8gc3Rzc19GaW5kTmVhcmVzdEtleWZyYW1lIHJldHVybnMgZXhhY3QgbWF0Y2hlcyB0bworICAvLyBzYW1wbGVfbnVtYmVyIGluIHRoZSBzdHNzX2xhc3Rfa2V5ZnJhbWVfIHZhcmlhYmxlLCBzbworICAvLyB3ZSBjaGVjayB0aGF0IGZvciBlcXVhbGl0eQorICAqaXNfa2V5ZnJhbWVfb3V0ID0gKHNhbXBsZV9udW1iZXIgPT0gc3Rzc19sYXN0X2tleWZyYW1lXyk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hlbGxNUDRNYXA6OklzRU9TKHVpbnQzMiBzYW1wbGVfbnVtYmVyKSB7CisgIHJldHVybiAoc2FtcGxlX251bWJlciA+IGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8pOworfQorCisvLyBGaXJzdCBsb29rIHVwIHRoZSBzYW1wbGUgbnVtYmVyIGZvciB0aGUgcHJvdmlkZWQgdGltZXN0YW1wIGJ5IGludGVncmF0aW5nCisvLyB0aW1lc3RhbXBzIHRocm91Z2ggdGhlIHN0dHMuIFRoZW4gZG8gYSBiaW5hcnkgc2VhcmNoIG9uIHRoZSBzdHNzIHRvIGZpbmQgdGhlCisvLyBrZXlmcmFtZSBuZWFyZXN0IHRoYXQgc2FtcGxlIG51bWJlci4KK2Jvb2wgU2hlbGxNUDRNYXA6OkdldEtleWZyYW1lKHVpbnQ2NCB0aW1lc3RhbXAsIHVpbnQzMiogc2FtcGxlX291dCkgeworICBEQ0hFQ0soc2FtcGxlX291dCk7CisgIC8vIEFkdmFuY2Ugc3R0cyB0byB0aGUgcHJvdmlkZWQgdGltZXN0YW1wIHJhbmdlCisgIGlmICghc3R0c19BZHZhbmNlVG9UaW1lKHRpbWVzdGFtcCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gZW5zdXJlIHdlIGdvdCB0aGUgY29ycmVjdCBzYW1wbGUgZHVyYXRpb24gcmFuZ2UKKyAgRENIRUNLX0xUKHRpbWVzdGFtcCwgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV90aW1lXyk7CisgIERDSEVDS19HRSh0aW1lc3RhbXAsIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfKTsKKyAgLy8gY2FsY3VsYXRlIHNhbXBsZSBudW1iZXIgY29udGFpbmluZyB0aGlzIHRpbWVzdGFtcAorICB1aW50NjQgdGltZV9vZmZzZXRfd2l0aGluX3JhbmdlID0gdGltZXN0YW1wIC0gc3R0c19maXJzdF9zYW1wbGVfdGltZV87CisgIHVpbnQzMiBzYW1wbGVfbnVtYmVyID0KKyAgICAgIHN0dHNfZmlyc3Rfc2FtcGxlXyArICh0aW1lX29mZnNldF93aXRoaW5fcmFuZ2UgLyBzdHRzX3NhbXBsZV9kdXJhdGlvbl8pOworCisgIC8vIFRPRE86IGN0dHM/CisKKyAgLy8gYmluYXJ5IHNlYXJjaCBvbiBzdHRzIHRvIGZpbmQgbmVhcmVzdCBrZXlmcmFtZSBiZW5lYXRoIHRoaXMgc2FtcGxlIG51bWJlcgorICBpZiAoc3Rzc18pIHsKKyAgICBpZiAoIXN0c3NfRmluZE5lYXJlc3RLZXlmcmFtZShzYW1wbGVfbnVtYmVyKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqc2FtcGxlX291dCA9IHN0c3NfbGFzdF9rZXlmcmFtZV87CisgIH0gZWxzZSB7CisgICAgLy8gYW4gYWJzZW50IHN0dHMgbWVhbnMgZXZlcnkgZnJhbWUgaXMgYSBrZXkgZnJhbWUsIHdlIGNhbiBwcm92aWRlIHNhbXBsZQorICAgIC8vIGRpcmVjdGx5LgorICAgICpzYW1wbGVfb3V0ID0gc2FtcGxlX251bWJlcjsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworLy8gU2V0IHVwIG1hcCBzdGF0ZSBhbmQgbG9hZCBmaXJzdCBwYXJ0IG9mIHRhYmxlLCBvciBlbnRpcmUgdGFibGUgaWYgaXQgaXMgc21hbGwKKy8vIGVub3VnaCwgZm9yIGVhY2ggb2YgdGhlIHN1cHBvcmF0ZWQgYXRvbXMuCitib29sIFNoZWxsTVA0TWFwOjpTZXRBdG9tKHVpbnQzMiBmb3VyX2NjLCB1aW50NjQgb2Zmc2V0LCB1aW50NjQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGNhY2hlX3NpemVfZW50cmllcywgY29uc3QgdWludDgqIGF0b20pIHsKKyAgLy8gQWxsIG1hcCBhdG9tcyBhcmUgdmFyaWFibGUtbGVuZ3RoIHRhYmxlcyBzdGFydGluZyB3aXRoIDQgYnl0ZXMgb2YKKyAgLy8gdmVyc2lvbi9mbGFnIGluZm8gZm9sbG93ZWQgYnkgYSB1aW50MzIgaW5kaWNhdGluZyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGluCisgIC8vIHRhYmxlLiBUaGUgc3RzeiBhdG9tIGJ1Y2tzIHRyYWRpdGlvbiBieSBwdXR0aW5nIGFuIG9wdGlvbmFsIGRlZmF1bHQgdmFsdWUKKyAgLy8gYXQgaW5kZXggNC4KKyAgdWludDMyIGNvdW50ID0gMDsKKyAgdWludDY0IHRhYmxlX29mZnNldCA9IG9mZnNldCArIDg7CisgIGlmIChmb3VyX2NjID09IGtBdG9tVHlwZV9zdHN6KSB7CisgICAgaWYgKHNpemUgPCAxMikgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBzdHN6X2RlZmF1bHRfc2l6ZV8gPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihhdG9tICsgNCk7CisgICAgY291bnQgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihhdG9tICsgOCk7CisgICAgaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXyA9CisgICAgICAgIHN0ZDo6bWluKGNvdW50IC0gMSwgaGlnaGVzdF92YWxpZF9zYW1wbGVfbnVtYmVyXyk7CisgICAgLy8gaWYgYSBub24temVybyBkZWZhdWx0IHNpemUgaXMgcHJvdmlkZWQgZG9uJ3QgYm90aGVyIGxvYWRpbmcgdGhlIHRhYmxlCisgICAgaWYgKHN0c3pfZGVmYXVsdF9zaXplXykgeworICAgICAgc3Rzel8gPSBOVUxMOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgdGFibGVfb2Zmc2V0ICs9IDQ7CisgIH0gZWxzZSB7CisgICAgaWYgKHNpemUgPCA4KSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNvdW50ID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4oYXRvbSArIDQpOworICB9CisKKyAgLy8gaWYgY2FjaGVfc2l6ZV9lbnRyaWVzIGlzIDAgd2UgYXJlIHRvIGNhY2hlIHRoZSBlbnRpcmUgdGFibGUKKyAgaWYgKGNhY2hlX3NpemVfZW50cmllcyA9PSAwKSB7CisgICAgY2FjaGVfc2l6ZV9lbnRyaWVzID0gY291bnQ7CisgIH0KKworICBib29sIGF0b21faW5pdCA9IGZhbHNlOworICAvLyBpbml0aWFsaXplIHRoZSBhcHByb3ByaWF0ZSB0YWJsZSBjYWNoZSBkZXBlbmRlbnQgb24gdGFibGUgdHlwZQorICBzd2l0Y2ggKGZvdXJfY2MpIHsKKyAgICBjYXNlIGtBdG9tVHlwZV9jbzY0OgorICAgICAgY282NF8gPSBuZXcgVGFibGVDYWNoZSh0YWJsZV9vZmZzZXQsIGNvdW50LCBrRW50cnlTaXplX2NvNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3NpemVfZW50cmllcywgcmVhZGVyXyk7CisgICAgICBpZiAoY282NF8pIGF0b21faW5pdCA9IGNvNjRfSW5pdCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9jdHRzOgorICAgICAgY3R0c18gPSBuZXcgVGFibGVDYWNoZSh0YWJsZV9vZmZzZXQsIGNvdW50LCBrRW50cnlTaXplX2N0dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3NpemVfZW50cmllcywgcmVhZGVyXyk7CisgICAgICBpZiAoY3R0c18pIGF0b21faW5pdCA9IGN0dHNfSW5pdCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9zdGNvOgorICAgICAgc3Rjb18gPSBuZXcgVGFibGVDYWNoZSh0YWJsZV9vZmZzZXQsIGNvdW50LCBrRW50cnlTaXplX3N0Y28sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3NpemVfZW50cmllcywgcmVhZGVyXyk7CisgICAgICBpZiAoc3Rjb18pIGF0b21faW5pdCA9IHN0Y29fSW5pdCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9zdHNjOgorICAgICAgc3RzY18gPSBuZXcgVGFibGVDYWNoZSh0YWJsZV9vZmZzZXQsIGNvdW50LCBrRW50cnlTaXplX3N0c2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3NpemVfZW50cmllcywgcmVhZGVyXyk7CisgICAgICBpZiAoc3RzY18pIGF0b21faW5pdCA9IHN0c2NfSW5pdCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9zdHNzOgorICAgICAgc3Rzc18gPSBuZXcgVGFibGVDYWNoZSh0YWJsZV9vZmZzZXQsIGNvdW50LCBrRW50cnlTaXplX3N0c3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3NpemVfZW50cmllcywgcmVhZGVyXyk7CisgICAgICBpZiAoc3Rzc18pIGF0b21faW5pdCA9IHN0c3NfSW5pdCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9zdHRzOgorICAgICAgc3R0c18gPSBuZXcgVGFibGVDYWNoZSh0YWJsZV9vZmZzZXQsIGNvdW50LCBrRW50cnlTaXplX3N0dHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3NpemVfZW50cmllcywgcmVhZGVyXyk7CisgICAgICBpZiAoc3R0c18pIGF0b21faW5pdCA9IHN0dHNfSW5pdCgpOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9zdHN6OgorICAgICAgc3Rzel8gPSBuZXcgVGFibGVDYWNoZSh0YWJsZV9vZmZzZXQsIGNvdW50LCBrRW50cnlTaXplX3N0c3osCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhY2hlX3NpemVfZW50cmllcywgcmVhZGVyXyk7CisgICAgICBpZiAoc3Rzel8pIGF0b21faW5pdCA9IHN0c3pfSW5pdCgpOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJ1bmtub3duIGF0b20gdHlwZSBwcm92aWRlZCB0byBtcDQgbWFwIjsKKyAgICAgIGJyZWFrOworICB9CisKKyAgcmV0dXJuIGF0b21faW5pdDsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6Y282NF9Jbml0KCkgeworICBEQ0hFQ0soY282NF8pOworICAvLyBsb2FkIG9mZnNldCBvZiBmaXJzdCBjaHVuayBpbnRvIGN1cnJlbnRfY2h1bmtfb2Zmc2V0XworICBpZiAoY282NF8tPkdldEVudHJ5Q291bnQoKSA+IDApIHsKKyAgICAvLyBjYW4gZHJvcCBhbnkgc3RjbyB0YWJsZSBhbHJlYWR5IGFsbG9jYXRlZAorICAgIHN0Y29fID0gTlVMTDsKKyAgICAvLyBsb2FkIGluaXRpYWwgdmFsdWUgb2YgY3VycmVudF9jaHVua19vZmZzZXRfIGZvciAwdGggY2h1bmsKKyAgICByZXR1cm4gY282NF8tPlJlYWRVNjRFbnRyeSgwLCAmY3VycmVudF9jaHVua19vZmZzZXRfKTsKKyAgfQorCisgIGNvNjRfID0gTlVMTDsKKworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gVGhlIGN0dHMgdGFibGUgaGFzIHRoZSBmb2xsb3dpbmcgcGVyLWVudHJ5IGxheW91dDoKKy8vIHVpbnQzMiBzYW1wbGUgY291bnQKKy8vIHVpbnQzMiBjb21wb3NpdGlvbiBvZmZzZXQgaW4gdGlja3MKKy8vCitib29sIFNoZWxsTVA0TWFwOjpjdHRzX0luaXQoKSB7CisgIERDSEVDSyhjdHRzXyk7CisgIC8vIGdldCBjYWNoZSBzZWdtZW50IHZlY3RvciB0byByZXNlcnZlIHRhYmxlIGVudHJpZXMgaW4gYWR2YW5jZQorICBpbnQgY2FjaGVfc2VnbWVudHMgPQorICAgICAgKGN0dHNfLT5HZXRFbnRyeUNvdW50KCkgLyBjdHRzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpKSArIDE7CisgIGN0dHNfc2FtcGxlc18ucmVzZXJ2ZShjYWNoZV9zZWdtZW50cyk7CisgIGlmIChjdHRzXy0+R2V0RW50cnlDb3VudCgpID4gMCkgeworICAgIC8vIHNhdmUgdGhlIHN0YXJ0IG9mIHRoZSBmaXJzdCB0YWJsZSBpbnRlZ3JhdGlvbiBhdCAwCisgICAgY3R0c19zYW1wbGVzXy5wdXNoX2JhY2soMCk7CisgICAgY3R0c190YWJsZV9pbmRleF8gPSAwOworICAgIGN0dHNfZmlyc3Rfc2FtcGxlXyA9IDA7CisgICAgLy8gbG9hZCBmaXJzdCBlbnRyeSBpbiB0YWJsZSwgdG8gc3RhcnQgaW50ZWdyYXRpb24KKyAgICByZXR1cm4gY3R0c18tPlJlYWRVMzJQYWlyRW50cnkoMCwgJmN0dHNfbmV4dF9maXJzdF9zYW1wbGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R0c19zYW1wbGVfb2Zmc2V0Xyk7CisgIH0KKyAgLy8gZHJvcCBlbXB0eSBjdHRzXyB0YWJsZQorICBjdHRzXyA9IE5VTEw7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIFRvIGZpbmQgdGhlIGNvbXBvc2l0aW9uIG9mZnNldCBvZiBhIGdpdmVuIHNhbXBsZSBudW1iZXIgd2UgbXVzdCBpbnRlZ3JhdGUKKy8vIHRocm91Z2ggdGhlIGN0dHMgdG8gZmluZCB0aGUgcmFuZ2Ugb2Ygc2FtcGxlcyBjb250YWluaW5nIHNhbXBsZV9udW1iZXIuIE5vdGUKKy8vIHRoYXQgdGhlIGN0dHMgaXMgYW4gb3B0aW9uYWwgdGFibGUuCitib29sIFNoZWxsTVA0TWFwOjpjdHRzX0FkdmFuY2VUb1NhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlcikgeworICAvLyBjdHRzIHRhYmxlIGlzIG9wdGlvbmFsLCBzbyB0cmVhdCBub3QgaGF2aW5nIG9uZSBhcyBub24tZmF0YWwKKyAgaWYgKCFjdHRzXykgeworICAgIHJldHVybiB0cnVlOworICB9CisgIC8vIHNhbXBsZSBudW1iZXIgY291bGQgYmUgYmVmb3JlIG91ciBzYXZlZCBmaXJzdCBzYW1wbGUsIG1lYW5pbmcgd2UndmUKKyAgLy8gZ29uZSBiYWNrd2FyZCBpbiBzYW1wbGUgbnVtYmVycyBhbmQgd2lsbCBuZWVkIHRvIHJlc3RhcnQgaW50ZWdyYXRpb24gYXQKKyAgLy8gdGhlIG5lYXJlc3Qgc2F2ZWQgc2FtcGxlIGNvdW50IHN0YXJ0aW5nIGF0IGEgY2FjaGUgZW50cnkKKyAgaWYgKHNhbXBsZV9udW1iZXIgPCBjdHRzX2ZpcnN0X3NhbXBsZV8pIHsKKyAgICBpZiAoIWN0dHNfU2xpcENhY2hlVG9TYW1wbGUoc2FtcGxlX251bWJlciwgMCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBzYW1wbGVfbnVtYmVyIGNvdWxkIGFsc28gYmUgYWhlYWQgb2Ygb3VyIGN1cnJlbnQgcmFuZ2UsIGZvciBleGFtcGxlIHdoZW4KKyAgLy8gc2Vla2luZyBmb3J3YXJkLiBTZWUgaWYgd2UndmUgY2FsY3VsYXRlZCB0aGVzZSB2YWx1ZXMgYWhlYWQgb2YgdXMgYmVmb3JlLAorICAvLyBhbmQgaWYgd2UgY2FuIHNsaXAgZm9yd2FyZCB0byB0aGVtCisgIGludCBuZXh0X2NhY2hlX2luZGV4ID0gKGN0dHNfdGFibGVfaW5kZXhfIC8gY3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSkgKyAxOworICBpZiAoKG5leHRfY2FjaGVfaW5kZXggPCBjdHRzX3NhbXBsZXNfLnNpemUoKSkgJiYKKyAgICAgIChzYW1wbGVfbnVtYmVyID49IGN0dHNfc2FtcGxlc19bbmV4dF9jYWNoZV9pbmRleF0pKSB7CisgICAgaWYgKCFjdHRzX1NsaXBDYWNoZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIsIG5leHRfY2FjaGVfaW5kZXgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gcGVyZm9ybSBpbnRlZ3JhdGlvbiB1bnRpbCBzYW1wbGUgbnVtYmVyIGlzIHdpdGhpbiBjb3JyZWN0IGN0dHMgcmFuZ2UKKyAgd2hpbGUgKGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfIDw9IHNhbXBsZV9udW1iZXIpIHsKKyAgICAvLyBuZXh0IGZpcnN0IHNhbXBsZSBpcyBub3cgb3VyIHRoZSBmaXJzdCBzYW1wbGUKKyAgICBjdHRzX2ZpcnN0X3NhbXBsZV8gPSBjdHRzX25leHRfZmlyc3Rfc2FtcGxlXzsKKyAgICAvLyBhZHZhbmNlIHRvIG5leHQgZW50cnkgaW4gdGFibGUKKyAgICBjdHRzX3RhYmxlX2luZGV4XysrOworICAgIC8vIElmIHRoaXMgd291bGQgYmUgYSBuZXcgY2FjaGUgZW50cnksIGtlZXAgYSByZWNvcmQgb2YgaW50ZWdyYXRpb24gdXAKKyAgICAvLyB0byB0aGlzIHBvaW50IHNvIHdlIGRvbid0IGhhdmUgdG8gc3RhcnQgZnJvbSAwIG9uIHNlZWtpbmcgYmFjaworICAgIGlmICghKGN0dHNfdGFibGVfaW5kZXhfICUgY3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSkpIHsKKyAgICAgIGludCBjYWNoZV9pbmRleCA9IGN0dHNfdGFibGVfaW5kZXhfIC8gY3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKTsKKyAgICAgIC8vIGNoZWNrIHRoYXQgdGhpcyBpcyBvdXIgZmlyc3QgdGltZSB3aXRoIHRoZXNlIGRhdGEKKyAgICAgIGlmIChjYWNoZV9pbmRleCA9PSBjdHRzX3NhbXBsZXNfLnNpemUoKSkgeworICAgICAgICBjdHRzX3NhbXBsZXNfLnB1c2hfYmFjayhjdHRzX2ZpcnN0X3NhbXBsZV8pOworICAgICAgfQorICAgICAgLy8gb3VyIGludGVncmF0aW9uIGF0IHRoaXMgcG9pbnQgc2hvdWxkIGFsd2F5cyBtYXRjaCBhbnkgc3RvcmVkIHJlY29yZAorICAgICAgRENIRUNLX0VRKGN0dHNfZmlyc3Rfc2FtcGxlXywgY3R0c19zYW1wbGVzX1tjYWNoZV9pbmRleF0pOworICAgIH0KKworICAgIGlmIChjdHRzX3RhYmxlX2luZGV4XyA8IGN0dHNfLT5HZXRFbnRyeUNvdW50KCkpIHsKKyAgICAgIC8vIGxvYWQgdGhlIHNhbXBsZSBjb3VudCB0byBkZXRlcm1pbmUgbmV4dCBmaXJzdCBzYW1wbGUKKyAgICAgIHVpbnQzMiBzYW1wbGVfY291bnQ7CisgICAgICBpZiAoIWN0dHNfLT5SZWFkVTMyUGFpckVudHJ5KGN0dHNfdGFibGVfaW5kZXhfLCAmc2FtcGxlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY3R0c19zYW1wbGVfb2Zmc2V0XykpCisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfID0gY3R0c19maXJzdF9zYW1wbGVfICsgc2FtcGxlX2NvdW50OworICAgIH0gZWxzZSB7CisgICAgICAvLyBUaGlzIG1lYW5zIHRoYXQgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlIHNwZWNpZmllZCBhIHNhbXBsZSByYW5nZQorICAgICAgLy8gdGhhdCB0aGlzIHNhbXBsZSBudW1iZXIgaGFzIGV4Y2VlZGVkLCBhbmQgc28gdGhlIGN0dHMgb2YgdGhpcyBzYW1wbGUKKyAgICAgIC8vIG51bWJlciBpcyB1bmRlZmluZWQuIFdoaWxlIG5vdCBhIGZhdGFsIGVycm9yIGl0J3Mga2luZCBvZiBhIHdlaXJkCisgICAgICAvLyBzdGF0ZSwgd2Ugc2V0IHRoZSBvZmZzZXQgYmFjayB0byB6ZXJvIGFuZCBleHRlbmQgdGhlIG5leHRfZmlyc3Rfc2FtcGxlCisgICAgICAvLyB0byBpbmZpbml0eQorICAgICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoCisgICAgICAgICAgIm91dCBvZiByYW5nZSBzYW1wbGUgbnVtYmVyICVkIGluIGN0dHMsIGxhc3QgdmFsaWQgc2FtcGxlIG51bWJlcjogJWQiLAorICAgICAgICAgIHNhbXBsZV9udW1iZXIsIGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfKTsKKyAgICAgIGN0dHNfc2FtcGxlX29mZnNldF8gPSAwOworICAgICAgY3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8gPSBVSU5UMzJfTUFYOworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFNoZWxsTVA0TWFwOjpjdHRzX1NsaXBDYWNoZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRpbmdfY2FjaGVfaW5kZXgpIHsKKyAgRENIRUNLX0xUKHN0YXJ0aW5nX2NhY2hlX2luZGV4LCBjdHRzX3NhbXBsZXNfLnNpemUoKSk7CisgIGludCBjYWNoZV9pbmRleCA9IHN0YXJ0aW5nX2NhY2hlX2luZGV4OworICBmb3IgKDsgY2FjaGVfaW5kZXggKyAxIDwgY3R0c19zYW1wbGVzXy5zaXplKCk7IGNhY2hlX2luZGV4KyspIHsKKyAgICBpZiAoc2FtcGxlX251bWJlciA8IGN0dHNfc2FtcGxlc19bY2FjaGVfaW5kZXggKyAxXSkgeworICAgICAgYnJlYWs7CisgICAgfQorICB9CisgIGN0dHNfZmlyc3Rfc2FtcGxlXyA9IGN0dHNfc2FtcGxlc19bY2FjaGVfaW5kZXhdOworICBjdHRzX3RhYmxlX2luZGV4XyA9IGNhY2hlX2luZGV4ICogY3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKTsKKyAgLy8gcmVhZCBzYW1wbGUgY291bnQgYW5kIGR1cmF0aW9uIHRvIHNldCBuZXh0IHZhbHVlcworICB1aW50MzIgc2FtcGxlX2NvdW50OworICBpZiAoIWN0dHNfLT5SZWFkVTMyUGFpckVudHJ5KGN0dHNfdGFibGVfaW5kZXhfLCAmc2FtcGxlX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjdHRzX3NhbXBsZV9vZmZzZXRfKSkKKyAgICByZXR1cm4gZmFsc2U7CisgIGN0dHNfbmV4dF9maXJzdF9zYW1wbGVfID0gY3R0c19maXJzdF9zYW1wbGVfICsgc2FtcGxlX2NvdW50OworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6c3Rjb19Jbml0KCkgeworICBEQ0hFQ0soc3Rjb18pOworICAvLyBsb2FkIG9mZnNldCBvZiBmaXJzdCBjaHVuayBpbnRvIGN1cnJlbnRfY2h1bmtfb2Zmc2V0XworICBpZiAoc3Rjb18tPkdldEVudHJ5Q291bnQoKSA+IDApIHsKKyAgICBjbzY0XyA9IE5VTEw7CisgICAgcmV0dXJuIHN0Y29fLT5SZWFkVTMyRW50cnlJbnRvVTY0KDAsICZjdXJyZW50X2NodW5rX29mZnNldF8pOworICB9CisKKyAgc3Rjb18gPSBOVUxMOworCisgIHJldHVybiB0cnVlOworfQorCisvLyBUaGUgc3RzYyB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBwZXItZW50cnkgbGF5b3V0OgorLy8gdWludDMyIGZpcnN0IGNodW5rIG51bWJlciB3aXRoIHRoaXMgc2FtcGxlIGNvdW50CisvLyB1aW50MzIgc2FtcGxlcy1wZXItY2h1bmsKKy8vIHVpbnQzMiBzYW1wbGUgZGVzY3JpcHRpb24gaWQgKHVudXNlZCkKK2Jvb2wgU2hlbGxNUDRNYXA6OnN0c2NfSW5pdCgpIHsKKyAgRENIRUNLKHN0c2NfKTsKKyAgLy8gc2V0IHVwIHZlY3RvciB0byBjb3JyZWN0IGZpbmFsIHNpemUKKyAgaW50IGNhY2hlX3NlZ21lbnRzID0KKyAgICAgIChzdHNjXy0+R2V0RW50cnlDb3VudCgpIC8gc3RzY18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSkgKyAxOworICBzdHNjX3NhbXBsZV9zdW1zXy5yZXNlcnZlKGNhY2hlX3NlZ21lbnRzKTsKKyAgLy8gdGhlcmUgbXVzdCBhbHdheXMgYmUgYXQgbGVhc3QgMSBlbnRyeSBpbiBhIHZhbGlkIHN0c2MgdGFibGUKKyAgaWYgKHN0c2NfLT5HZXRFbnRyeUNvdW50KCkgPiAwKSB7CisgICAgc3RzY19maXJzdF9jaHVua18gPSAwOworICAgIHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXyA9IDA7CisgICAgLy8gZmlyc3QgY2FjaGVkIGVudHJ5IGlzIGFsd2F5cyAwCisgICAgc3RzY19zYW1wbGVfc3Vtc18ucHVzaF9iYWNrKDApOworICAgIGlmICghc3RzY18tPlJlYWRVMzJQYWlyRW50cnkoMCwgTlVMTCwgJnN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfKSkgeworICAgICAgc3RzY18gPSBOVUxMOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBsb29rIHVwIG5leHQgZmlyc3QgY2h1bmsgYXQgbmV4dCBpbmRleCBpbiB0YWJsZQorICAgIGlmIChzdHNjXy0+R2V0RW50cnlDb3VudCgpID4gMSkgeworICAgICAgaWYgKCFzdHNjXy0+UmVhZFUzMlBhaXJFbnRyeSgxLCAmc3RzY19uZXh0X2ZpcnN0X2NodW5rXywgTlVMTCkpIHsKKyAgICAgICAgc3RzY18gPSBOVUxMOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAtLXN0c2NfbmV4dF9maXJzdF9jaHVua187CisgICAgICBzdHNjX25leHRfZmlyc3RfY2h1bmtfc2FtcGxlXyA9CisgICAgICAgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rXyAqIHN0c2Nfc2FtcGxlc19wZXJfY2h1bmtfOworICAgIH0gZWxzZSB7CisgICAgICAvLyBldmVyeSBjaHVuayBpbiB0aGUgZmlsZSBoYXMgdGhlIHNhbXBsZSBzYW1wbGUgY291bnQsIHNldCBuZXh0IGZpcnN0CisgICAgICAvLyBjaHVuayB0byBoaWdoZXN0IHZhbGlkIGNodW5rIG51bWJlci4KKyAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua18gPSBVSU5UMzJfTUFYOworICAgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rX3NhbXBsZV8gPSBVSU5UMzJfTUFYOworICAgIH0KKyAgICBzdHNjX3RhYmxlX2luZGV4XyA9IDA7CisKKyAgICAvLyBzaW5jZSB3ZSBrbm93biB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgY2h1bmsgd2UgY2FuIHNldCBuZXh0X2NodW5rX3NhbXBsZV8KKyAgICBuZXh0X2NodW5rX3NhbXBsZV8gPSBzdHNjX3NhbXBsZXNfcGVyX2NodW5rXzsKKworICB9IGVsc2UgeworICAgIHN0c2NfID0gTlVMTDsKKyAgfQorCisgIHJldHVybiB0cnVlOworfQorCisvLyBUbyBmaW5kIHRoZSBjaHVuayBudW1iZXIgb2YgYW4gYWJyaXRyYXJ5IHNhbXBsZSB3ZSBoYXZlIHRvIHN1bSB0aGUKKy8vIHNhbXBsZXMtcGVyLWNodW5rIHZhbHVlIG11bHRpcGxpZWQgYnkgdGhlIG51bWJlciBvZiBjaHVua3Mgd2l0aCB0aGF0IHNhbXBsZQorLy8gY291bnQgdW50aWwgdGhlIHN1bSBleGNlZWRzIHRoZSBzYW1wbGUgbnVtYmVyLCB0aGVuIGNhbGN1bGF0ZSB0aGUgY2h1bmsKKy8vIG51bWJlciBmcm9tIHRoYXQgcmFuZ2Ugb2YgcGVyLXNhbXBsZSBjaHVuayBzaXplcy4gU2luY2UgdGhpcyBtYXAgaXMgbWVhbnQKKy8vIHRvIGJlIGNvbnN1bWVkIGluY3JlbWVudGFsbHkgYW5kIHdpdGggbWluaW1hbCBtZW1vcnkgY29uc3VtcHRpb24gd2UgY2FsY3VsYXRlCisvLyB0aGlzIGludGVncmF0aW9uIHN0ZXAgb25seSB3aGVuIG5lZWRlZCwgYW5kIHNhdmUgcmVzdWx0cyBmb3IgZWFjaCBjYWNoZWQKKy8vIHBpZWNlIG9mIHRoZSB0YWJsZSwgdG8gYXZvaWQgaGF2aW5nIHRvIHJlY2FsY3VsYXRlIG5lZWRlZCBkYXRhLgorYm9vbCBTaGVsbE1QNE1hcDo6c3RzY19BZHZhbmNlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIpIHsKKyAgRENIRUNLKHN0c2NfKTsKKyAgLy8gc2FtcGxlX251bWJlciBjb3VsZCBiZSBiZWZvcmUgZmlyc3QgY2h1bmssIG1lYW5pbmcgdGhhdCB3ZSBhcmUgc2Vla2luZworICAvLyBiYWNrd2FyZHMgYW5kIGhhdmUgbGVmdCB0aGUgY3VycmVudCBjaHVuay4gRmluZCB0aGUgY2xvc2VzdCBwYXJ0IG9mIHRoZQorICAvLyBjYWNoZWQgdGFibGUgYW5kIGludGVncmF0ZSBmb3J3YXJkIGZyb20gdGhlcmUuCisgIGlmIChzYW1wbGVfbnVtYmVyIDwgc3RzY19maXJzdF9jaHVua19zYW1wbGVfKSB7CisgICAgaWYgKCFzdHNjX1NsaXBDYWNoZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIsIDApKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gc2FtcGxlX251bWJlciBjb3VsZCBhbHNvIGJlIHdlbGwgaGVhZCBvZiBvdXIgY3VycmVudCBwaWVjZSBvZiB0aGUKKyAgLy8gY2FjaGUsIHNvIHNlZSBpZiB3ZSBjYW4gcmUtdXNlIGFueSBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgc3VtbWF0aW9ucyB0bworICAvLyBza2lwIHRvIHRoZSBuZWFyZXN0IGNhY2hlIGVudHJ5CisgIGludCBuZXh0X2NhY2hlX2luZGV4ID0gKHN0c2NfdGFibGVfaW5kZXhfIC8gc3RzY18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSkgKyAxOworICBpZiAoKG5leHRfY2FjaGVfaW5kZXggPCBzdHNjX3NhbXBsZV9zdW1zXy5zaXplKCkpICYmCisgICAgICAoc2FtcGxlX251bWJlciA+PSBzdHNjX3NhbXBsZV9zdW1zX1tuZXh0X2NhY2hlX2luZGV4XSkpIHsKKyAgICBpZiAoIXN0c2NfU2xpcENhY2hlVG9TYW1wbGUoc2FtcGxlX251bWJlciwgbmV4dF9jYWNoZV9pbmRleCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBJbnRlZ3JhdGUgdGhyb3VnaCBlYWNoIHRhYmxlIGVudHJ5IHVudGlsIHdlIGZpbmQgc2FtcGxlX251bWJlciBpbiByYW5nZQorICB3aGlsZSAoc3RzY19uZXh0X2ZpcnN0X2NodW5rX3NhbXBsZV8gPD0gc2FtcGxlX251bWJlcikgeworICAgIC8vIGFkdmFuY2UgdG8gbmV4dCBjaHVuayBzYW1wbGUgcmFuZ2UKKyAgICBzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8gPSBzdHNjX25leHRfZmlyc3RfY2h1bmtfc2FtcGxlXzsKKyAgICAvLyBvdXIgbmV4dF9maXJzdF9jaHVuayBpcyBub3cgb3VyIGZpcnN0IGNodW5rCisgICAgc3RzY19maXJzdF9jaHVua18gPSBzdHNjX25leHRfZmlyc3RfY2h1bmtfOworICAgIC8vIGFkdmFuY2UgdG8gbmV4dCBlbnRyeSBpbiB0YWJsZQorICAgIHN0c2NfdGFibGVfaW5kZXhfKys7CisgICAgLy8gaWYgd2UndmUgYWR2YW5jZWQgdG8gYSBuZXcgc2VnbWVudCBvZiB0aGUgY2FjaGUsIHVwZGF0ZSB0aGUgc2F2ZWQKKyAgICAvLyBpbnRlZ3JhdGlvbiB2YWx1ZXMKKyAgICBpZiAoIShzdHNjX3RhYmxlX2luZGV4XyAlIHN0c2NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpKSB7CisgICAgICBpbnQgY2FjaGVfaW5kZXggPSBzdHNjX3RhYmxlX2luZGV4XyAvIHN0c2NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7CisgICAgICAvLyBjaGVjayB0aGF0IHRoaXMgaXMgb3VyIGZpcnN0IHRpbWUgd2l0aCB0aGVzZSBkYXRhCisgICAgICBpZiAoY2FjaGVfaW5kZXggPT0gc3RzY19zYW1wbGVfc3Vtc18uc2l6ZSgpKSB7CisgICAgICAgIHN0c2Nfc2FtcGxlX3N1bXNfLnB1c2hfYmFjayhzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8pOworICAgICAgfQorICAgICAgLy8gb3VyIGludGVncmF0aW9uIGF0IHRoaXMgcG9pbnQgc2hvdWxkIGFsd2F5cyBtYXRjaCBhbnkgc3RvcmVkIHJlY29yZAorICAgICAgRENIRUNLX0VRKHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXywgc3RzY19zYW1wbGVfc3Vtc19bY2FjaGVfaW5kZXhdKTsKKyAgICB9CisgICAgaWYgKHN0c2NfdGFibGVfaW5kZXhfIDwgc3RzY18tPkdldEVudHJ5Q291bnQoKSkgeworICAgICAgLy8gbG9vayB1cCBvdXIgbmV3IHNhbXBsZSByYXRlCisgICAgICBpZiAoIXN0c2NfLT5SZWFkVTMyUGFpckVudHJ5KHN0c2NfdGFibGVfaW5kZXhfLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RzY19zYW1wbGVzX3Blcl9jaHVua18pKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIHdlIG5lZWQgdG8gbG9vayB1cCBuZXh0IHRhYmxlIGVudHJ5IHRvIGRldGVybWluZSBuZXh0IGZpcnN0IGNodW5rCisgICAgICBpZiAoc3RzY190YWJsZV9pbmRleF8gKyAxIDwgc3RzY18tPkdldEVudHJ5Q291bnQoKSkgeworICAgICAgICAvLyBsb29rIHVwIG5leHQgZmlyc3QgY2h1bmsKKyAgICAgICAgaWYgKCFzdHNjXy0+UmVhZFUzMlBhaXJFbnRyeShzdHNjX3RhYmxlX2luZGV4XyArIDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0c2NfbmV4dF9maXJzdF9jaHVua18sIE5VTEwpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIC0tc3RzY19uZXh0X2ZpcnN0X2NodW5rXzsKKyAgICAgICAgLy8gY2Fycnkgc3VtIG9mIGZpcnN0X3NhbXBsZXMgZm9yd2FyZCB0byBuZXh0IGNodW5rIHJhbmdlCisgICAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfICs9CisgICAgICAgICAgICAoc3RzY19uZXh0X2ZpcnN0X2NodW5rXyAtIHN0c2NfZmlyc3RfY2h1bmtfKSAqCisgICAgICAgICAgICBzdHNjX3NhbXBsZXNfcGVyX2NodW5rXzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIHRoaXMgaXMgdGhlIG5vcm1hbCBwbGFjZSB0byBlbmNvdW50ZXIgdGhlIGVuZCBvZiB0aGUgY2h1bmsgdGFibGUuCisgICAgICAgIC8vIHNldCB0aGUgbmV4dCBjaHVuayB0byB0aGUgaGlnaGVzdCB2YWxpZCBjaHVuayBudW1iZXIKKyAgICAgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rXyA9IFVJTlQzMl9NQVg7CisgICAgICAgIHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfID0gVUlOVDMyX01BWDsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgLy8gV2Ugc2hvdWxkIG5vcm1hbGx5IGVuY291bnRlciB0aGUgZW5kIG9mIHRoZSBjaHVuayB0YWJsZSBvbiBsb29rdXAKKyAgICAgIC8vIG9mIHRoZSBuZXh0X2ZpcnN0X2NodW5rXyB3aXRoaW4gdGhlIGlmIGNsYXVzZSBhc3NvY2lhdGVkIHdpdGggdGhpcworICAgICAgLy8gZWxzZS4gU29tZXRoaW5nIGhhcyBnb25lIHdyb25nLgorICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6c3RzY19TbGlwQ2FjaGVUb1NhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN0YXJ0aW5nX2NhY2hlX2luZGV4KSB7CisgIERDSEVDS19MVChzdGFydGluZ19jYWNoZV9pbmRleCwgc3RzY19zYW1wbGVfc3Vtc18uc2l6ZSgpKTsKKyAgLy8gbG9vayB0aHJvdWdoIG9sZCBzYW1wbGUgc3VtcyBmb3IgdGhlIGZpcnN0IGVudHJ5IHRoYXQgZXhjZWVkcyBzYW1wbGUKKyAgLy8gc2FtcGxlX251bWJlciwgd2Ugd2FudCB0aGUgZW50cnkgcmlnaHQgYmVmb3JlIHRoYXQKKyAgaW50IGNhY2hlX2luZGV4ID0gc3RhcnRpbmdfY2FjaGVfaW5kZXg7CisgIGZvciAoOyBjYWNoZV9pbmRleCArIDEgPCBzdHNjX3NhbXBsZV9zdW1zXy5zaXplKCk7IGNhY2hlX2luZGV4KyspIHsKKyAgICBpZiAoc2FtcGxlX251bWJlciA8IHN0c2Nfc2FtcGxlX3N1bXNfW2NhY2hlX2luZGV4ICsgMV0pIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICAvLyBqdW1wIHRvIG5ldyBzcG90IGluIHRhYmxlCisgIHN0c2NfZmlyc3RfY2h1bmtfc2FtcGxlXyA9IHN0c2Nfc2FtcGxlX3N1bXNfW2NhY2hlX2luZGV4XTsKKyAgc3RzY190YWJsZV9pbmRleF8gPSBjYWNoZV9pbmRleCAqIHN0c2NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7CisgIGlmICghc3RzY18tPlJlYWRVMzJQYWlyRW50cnkoc3RzY190YWJsZV9pbmRleF8sICZzdHNjX2ZpcnN0X2NodW5rXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3RzY19zYW1wbGVzX3Blcl9jaHVua18pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIGxvYWQgY3VycmVudCBhbmQgbmV4dCB2YWx1ZXMKKyAgLS1zdHNjX2ZpcnN0X2NodW5rXzsKKyAgaWYgKHN0c2NfdGFibGVfaW5kZXhfICsgMSA8IHN0c2NfLT5HZXRFbnRyeUNvdW50KCkpIHsKKyAgICBpZiAoIXN0c2NfLT5SZWFkVTMyUGFpckVudHJ5KHN0c2NfdGFibGVfaW5kZXhfICsgMSwgJnN0c2NfbmV4dF9maXJzdF9jaHVua18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAtLXN0c2NfbmV4dF9maXJzdF9jaHVua187CisgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rX3NhbXBsZV8gPQorICAgICAgICBzdHNjX2ZpcnN0X2NodW5rX3NhbXBsZV8gKworICAgICAgICAoKHN0c2NfbmV4dF9maXJzdF9jaHVua18gLSBzdHNjX2ZpcnN0X2NodW5rXykgKgorICAgICAgICAgc3RzY19zYW1wbGVzX3Blcl9jaHVua18pOworICB9IGVsc2UgeworICAgIC8vIFdlIHNlZW0gdG8gaGF2ZSBjYWNoZWQgYW4gZW50cnkgMSBlbnRyeSBiZWZvcmUgZW5kIG9mIHRoZSB0YWJsZSwgYW5kCisgICAgLy8gYXJlIHNlZWtpbmcgdG8gYSByZWdpb24gY29udGFpbmVkIGluIHRoYXQgbGFzdCBlbnRyeSBpbiB0aGUgdGFibGUuCisgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rXyA9IFVJTlQzMl9NQVg7CisgICAgc3RzY19uZXh0X2ZpcnN0X2NodW5rX3NhbXBsZV8gPSBVSU5UMzJfTUFYOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBzdHNzIGlzIGEgbGlzdCBvZiBzYW1wbGUgbnVtYmVycyB0aGF0IGFyZSBrZXlmcmFtZXMuCitib29sIFNoZWxsTVA0TWFwOjpzdHNzX0luaXQoKSB7CisgIGludCBjYWNoZV9zZWdtZW50cyA9CisgICAgICAoc3Rzc18tPkdldEVudHJ5Q291bnQoKSAvIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpICsgMTsKKyAgc3Rzc19rZXlmcmFtZXNfLnJlc2VydmUoY2FjaGVfc2VnbWVudHMpOworICAvLyBlbXB0eSBzdHNzIG1lYW5zIGV2ZXJ5IGZyYW1lIGlzIGEga2V5ZnJhbWUsIHNhbWUgYXMgbm90CisgIC8vIHByb3ZpZGluZyBvbmUKKyAgaWYgKHN0c3NfLT5HZXRFbnRyeUNvdW50KCkgPiAwKSB7CisgICAgLy8gaWRlbnRpZnkgZmlyc3Qga2V5ZnJhbWUgZnJvbSBmaXJzdCBlbnRyeSBpbiBzdHNzCisgICAgaWYgKCFzdHNzXy0+UmVhZFUzMkVudHJ5KDAsICZzdHNzX2xhc3Rfa2V5ZnJhbWVfKSkgeworICAgICAgc3Rzc18gPSBOVUxMOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAtLXN0c3NfbGFzdF9rZXlmcmFtZV87CisgICAgc3Rzc19rZXlmcmFtZXNfLnB1c2hfYmFjayhzdHNzX2xhc3Rfa2V5ZnJhbWVfKTsKKyAgICBzdHNzX25leHRfa2V5ZnJhbWVfID0gc3Rzc19sYXN0X2tleWZyYW1lXzsKKyAgICBzdHNzX3RhYmxlX2luZGV4XyA9IDA7CisgIH0gZWxzZSB7CisgICAgc3Rzc18gPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIGFkdmFuY2UgYnkgb25lIHRhYmxlIGVudHJ5IHRocm91Z2ggc3RzcywgdXBkYXRpbmcgY2FjaGUgaWYgbmVjZXNzYXJ5Citib29sIFNoZWxsTVA0TWFwOjpzdHNzX0FkdmFuY2VTdGVwKCkgeworICBEQ0hFQ0soc3Rzc18pOworICBzdHNzX2xhc3Rfa2V5ZnJhbWVfID0gc3Rzc19uZXh0X2tleWZyYW1lXzsKKyAgc3Rzc190YWJsZV9pbmRleF8rKzsKKyAgaWYgKHN0c3NfdGFibGVfaW5kZXhfIDwgc3Rzc18tPkdldEVudHJ5Q291bnQoKSkgeworICAgIGlmICghc3Rzc18tPlJlYWRVMzJFbnRyeShzdHNzX3RhYmxlX2luZGV4XywgJnN0c3NfbmV4dF9rZXlmcmFtZV8pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC0tc3Rzc19uZXh0X2tleWZyYW1lXzsKKyAgICBpZiAoIShzdHNzX3RhYmxlX2luZGV4XyAlIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpKSB7CisgICAgICBpbnQgY2FjaGVfaW5kZXggPSBzdHNzX3RhYmxlX2luZGV4XyAvIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7CisgICAgICAvLyBvbmx5IGFkZCBpZiB0aGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlJ3ZlIGVuY291bnRlcmVkIHRoaXMgbnVtYmVyCisgICAgICBpZiAoY2FjaGVfaW5kZXggPT0gc3Rzc19rZXlmcmFtZXNfLnNpemUoKSkgeworICAgICAgICBzdHNzX2tleWZyYW1lc18ucHVzaF9iYWNrKHN0c3NfbmV4dF9rZXlmcmFtZV8pOworICAgICAgfQorICAgICAgRENIRUNLX0VRKHN0c3NfbmV4dF9rZXlmcmFtZV8sIHN0c3Nfa2V5ZnJhbWVzX1tjYWNoZV9pbmRleF0pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBzdHNzX25leHRfa2V5ZnJhbWVfID0gVUlOVDMyX01BWDsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGVsbE1QNE1hcDo6c3Rzc19GaW5kTmVhcmVzdEtleWZyYW1lKHVpbnQzMiBzYW1wbGVfbnVtYmVyKSB7CisgIERDSEVDSyhzdHNzXyk7CisgIC8vIGl0IGlzIGFzc3VtZWQgdGhhdCB0aGVyZSdzIGF0IGxlYXN0IG9uZSBjYWNoZSBlbnRyeSBjcmVhdGVkIGJ5CisgIC8vIHN0c3NfSW5pdCgpOworICBEQ0hFQ0tfR1Qoc3Rzc19rZXlmcmFtZXNfLnNpemUoKSwgMCk7CisgIGludCBjYWNoZV9lbnRyeV9udW1iZXIgPSBzdHNzX2tleWZyYW1lc18uc2l6ZSgpIC0gMTsKKyAgaW50IHRvdGFsX2NhY2hlX2VudHJpZXMgPQorICAgICAgKHN0c3NfLT5HZXRFbnRyeUNvdW50KCkgKyBzdHNzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpIC0gMSkgLworICAgICAgc3Rzc18tPkdldENhY2hlU2l6ZUVudHJpZXMoKTsKKyAgLy8gaWYgdGhlcmUncyBtb3JlIHRoYW4gb25lIGNhY2hlIGVudHJ5IHdlIGNhbiBzZWFyY2ggdGhlIGNhY2hlZAorICAvLyBlbnRyaWVzIGZvciB0aGUgZW50cnkgY29udGFpbmluZyBvdXIga2V5ZnJhbWUsIG90aGVyd2lzZSB3ZSBza2lwCisgIC8vIGRpcmVjdGx5IHRvIHRoZSBiaW5hcnkgc2VhcmNoIG9mIHRoZSBzaW5nbGUgY2FjaGVkIGVudHJ5CisgIGlmICh0b3RhbF9jYWNoZV9lbnRyaWVzID4gMSkgeworICAgIC8vIGlmIHRoZSBzYW1wbGUgbnVtYmVyIHJlc2lkZXMgd2l0aGluIHRoZSByYW5nZSBvZiBjYWNoZWQgZW50cmllcworICAgIC8vIHdlIHNlYXJjaCB0aG9zZSB0byBmaW5kIHJpZ2h0IHRhYmxlIGNhY2hlIGVudHJ5IHRvIGxvYWQKKyAgICBpZiAoc2FtcGxlX251bWJlciA8IHN0c3Nfa2V5ZnJhbWVzX1tjYWNoZV9lbnRyeV9udW1iZXJdKSB7CisgICAgICBpbnQgbG93ZXJfYm91bmQgPSAwOworICAgICAgaW50IHVwcGVyX2JvdW5kID0gc3Rzc19rZXlmcmFtZXNfLnNpemUoKTsKKyAgICAgIC8vIGJpbmFyeSBzZWFyY2ggdG8gZmluZCByYW5nZQorICAgICAgd2hpbGUgKGxvd2VyX2JvdW5kIDw9IHVwcGVyX2JvdW5kKSB7CisgICAgICAgIGNhY2hlX2VudHJ5X251bWJlciA9IGxvd2VyX2JvdW5kICsgKCh1cHBlcl9ib3VuZCAtIGxvd2VyX2JvdW5kKSAvIDIpOworICAgICAgICBpZiAoc2FtcGxlX251bWJlciA8IHN0c3Nfa2V5ZnJhbWVzX1tjYWNoZV9lbnRyeV9udW1iZXJdKSB7CisgICAgICAgICAgdXBwZXJfYm91bmQgPSBjYWNoZV9lbnRyeV9udW1iZXIgLSAxOworICAgICAgICB9IGVsc2UgeyAgLy8gc2FtcGxlX251bWJlciA+PSBzdHNzX2tleWZyYW1lc19bY2FjaGVfZW50cnlfbnVtYmVyXQorICAgICAgICAgIC8vIGlmIHdlIGFyZSBhdCBlbmQgb2YgbGlzdCBvciBuZXh0IGNhY2hlIGVudHJ5IGlzIGhpZ2hlciB0aGFuIHNhbXBsZQorICAgICAgICAgIC8vIG51bWJlciB3ZSBjb25zaWRlciBpdCBhIG1hdGNoCisgICAgICAgICAgaWYgKGNhY2hlX2VudHJ5X251bWJlciA9PSBzdHNzX2tleWZyYW1lc18uc2l6ZSgpIC0gMSB8fAorICAgICAgICAgICAgICBzYW1wbGVfbnVtYmVyIDwgc3Rzc19rZXlmcmFtZXNfW2NhY2hlX2VudHJ5X251bWJlciArIDFdKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgbG93ZXJfYm91bmQgPSBjYWNoZV9lbnRyeV9udW1iZXIgKyAxOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICAgIC8vIFdlJ3ZlIGdvdHRlbiBhcyBjbG9zZSBhcyB3ZSBjYW4gdXNpbmcgdGhlIGNhY2hlZCB2YWx1ZXMgYW5kIG11c3QgaGFuZGxlCisgICAgLy8gdHdvIGNhc2VzLiAoYSkgaXMgdGhhdCB3ZSBrbm93IHRoYXQgc2FtcGxlX251bWJlciBpcyBjb250YWluZWQgaW4gdGhlCisgICAgLy8gY2FjaGVfZW50cnlfbnVtYmVyLCBiZWNhdXNlIHdlIGtub3cgdGhhdDoKKyAgICAvLyBzdHRzX2tleWZyYW1lc19bY2FjaGVfZW50cnlfbnVtYmVyXSA8PSBzYW1wbGVfbnVtYmVyIDwKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0dHNfa2V5ZnJhbWVzX1tjYWNoZV9lbnRyeV9udW1iZXIgKyAxXQorICAgIC8vIChiKSBpcyB0aGF0IHdlIG9ubHkga25vdzoKKyAgICAvLyBzdHRzX2tleWZyYW1lc19bc3R0c19rZXlmcmFtZXNfLnNpemUoKSAtIDFdIDw9IHNhbXBsZV9udW1iZXIKKyAgICAvLyBiZWNhdXNlIHdlIGhhdmUgbm90IGNhY2hlZCBhbiB1cHBlciBib3VuZCB0byBzYW1wbGVfbnVtYmVyLgorICAgIC8vIEZpcnN0IHN0ZXAgaXMgdG8gbWFrZSAoYikgaW4gdG8gKGEpIGJ5IGFkdmFuY2luZyB0aHJvdWdoIGNhY2hlIGVudHJpZXMKKyAgICAvLyB1bnRpbCBsYXN0IHRhYmxlIGVudHJ5IGluIGNhY2hlID4gc2FtcGxlX251bWJlciBvciB1bnRpbCB3ZSBhcnJpdmUKKyAgICAvLyBhdCB0aGUgY2FjaGUgZW50cnkgaW4gdGhlIHRhYmxlLgorICAgIHdoaWxlICgoY2FjaGVfZW50cnlfbnVtYmVyID09IHN0c3Nfa2V5ZnJhbWVzXy5zaXplKCkgLSAxKSAmJgorICAgICAgICAgICBjYWNoZV9lbnRyeV9udW1iZXIgPCB0b3RhbF9jYWNoZV9lbnRyaWVzIC0gMSkgeworICAgICAgLy8gVXNlIHRoZSBmaXJzdCBrZXkgZnJhbWUgaW4gbmV4dCBjYWNoZSBhcyB1cHBlciBib3VuZC4KKyAgICAgIGludCBuZXh0X2NhY2hlZF9lbnRyeV9udW1iZXIgPQorICAgICAgICAgIChjYWNoZV9lbnRyeV9udW1iZXIgKyAxKSAqIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7CisgICAgICB1aW50MzIgbmV4dF9jYWNoZWRfa2V5ZnJhbWU7CisgICAgICBpZiAoIXN0c3NfLT5SZWFkVTMyRW50cnkobmV4dF9jYWNoZWRfZW50cnlfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuZXh0X2NhY2hlZF9rZXlmcmFtZSkpIHsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgLS1uZXh0X2NhY2hlZF9rZXlmcmFtZTsKKyAgICAgIC8vIGlmIHRoaXMga2V5ZnJhbWUgaXMgaGlnaGVyIHRoYW4gb3VyIHNhbXBsZSBudW1iZXIgd2UncmUgaW4gdGhlIHJpZ2h0CisgICAgICAvLyB0YWJsZSwgc3RvcAorICAgICAgaWYgKHNhbXBsZV9udW1iZXIgPCBuZXh0X2NhY2hlZF9rZXlmcmFtZSkgeworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICAgIC8vIG9rLCB3ZSBuZWVkIHRvIGxvb2sgaW4gdG8gdGhlIG5leHQgY2FjaGUgZW50cnksIGFkdmFuY2UKKyAgICAgIGNhY2hlX2VudHJ5X251bWJlcisrOworICAgICAgaW50IGZpcnN0X3RhYmxlX2VudHJ5X251bWJlciA9CisgICAgICAgICAgY2FjaGVfZW50cnlfbnVtYmVyICogc3Rzc18tPkdldENhY2hlU2l6ZUVudHJpZXMoKTsKKyAgICAgIHVpbnQzMiBmaXJzdF9rZXlmcmFtZV9pbl9jYWNoZV9lbnRyeTsKKyAgICAgIGlmICghc3Rzc18tPlJlYWRVMzJFbnRyeShmaXJzdF90YWJsZV9lbnRyeV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpcnN0X2tleWZyYW1lX2luX2NhY2hlX2VudHJ5KSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAtLWZpcnN0X2tleWZyYW1lX2luX2NhY2hlX2VudHJ5OworICAgICAgLy8gc2F2ZSBmaXJzdCBlbnRyeSBpbiBrZXlmcmFtZSBjYWNoZQorICAgICAgc3Rzc19rZXlmcmFtZXNfLnB1c2hfYmFjayhmaXJzdF9rZXlmcmFtZV9pbl9jYWNoZV9lbnRyeSk7CisgICAgfQorICAgIC8vIG1ha2Ugc3VyZSB3ZSBoYXZlIGFuIHVwcGVyIGJvdW5kCisgICAgaWYgKGNhY2hlX2VudHJ5X251bWJlciAhPSB0b3RhbF9jYWNoZV9lbnRyaWVzIC0gMSAmJgorICAgICAgICBjYWNoZV9lbnRyeV9udW1iZXIgPT0gc3Rzc19rZXlmcmFtZXNfLnNpemUoKSAtIDEpIHsKKyAgICAgIGludCBuZXh0X2NhY2hlZF9lbnRyeV9udW1iZXIgPQorICAgICAgICAgICgoY2FjaGVfZW50cnlfbnVtYmVyICsgMSkgKiBzdHNzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpKTsKKyAgICAgIHVpbnQzMiBuZXh0X2NhY2hlZF9rZXlmcmFtZTsKKyAgICAgIGlmICghc3Rzc18tPlJlYWRVMzJFbnRyeShuZXh0X2NhY2hlZF9lbnRyeV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5leHRfY2FjaGVkX2tleWZyYW1lKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAtLW5leHRfY2FjaGVkX2tleWZyYW1lOworICAgICAgc3Rzc19rZXlmcmFtZXNfLnB1c2hfYmFjayhuZXh0X2NhY2hlZF9rZXlmcmFtZSk7CisgICAgfQorICAgIC8vIG9rLCBub3cgd2UgYXNzdW1lIHdlIGFyZSBpbiBzdGF0ZSAoYSksIGFuZCB0aGF0IHdlJ3JlIGVpdGhlcgorICAgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIHRhYmxlIG9yIHdpdGhpbiB0aGUgY2FjaGUgZW50cnkgYm91bmRzIGZvciBvdXIKKyAgICAvLyBzYW1wbGUgbnVtYmVyCisgICAgRENIRUNLKHN0c3Nfa2V5ZnJhbWVzX1tjYWNoZV9lbnRyeV9udW1iZXJdIDw9IHNhbXBsZV9udW1iZXIgJiYKKyAgICAgICAgICAgKGNhY2hlX2VudHJ5X251bWJlciA9PSB0b3RhbF9jYWNoZV9lbnRyaWVzIC0gMSB8fAorICAgICAgICAgICAgc2FtcGxlX251bWJlciA8IHN0c3Nfa2V5ZnJhbWVzX1tjYWNoZV9lbnRyeV9udW1iZXIgKyAxXSkpOworICB9CisgIC8vIGJpbmFyeSBzZWFyY2ggd2l0aGluIHN0c3MgY2FjaGUgZW50cnkgZm9yIGtleWZyYW1lcyBib3VuZGluZyBzYW1wbGVfbnVtYmVyCisgIGludCBsb3dlcl9ib3VuZCA9IGNhY2hlX2VudHJ5X251bWJlciAqIHN0c3NfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCk7CisgIGludCB1cHBlcl9ib3VuZCA9IHN0ZDo6bWluKGxvd2VyX2JvdW5kICsgc3Rzc18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Rzc18tPkdldEVudHJ5Q291bnQoKSk7CisKKyAgd2hpbGUgKGxvd2VyX2JvdW5kIDw9IHVwcGVyX2JvdW5kKSB7CisgICAgc3Rzc190YWJsZV9pbmRleF8gPSBsb3dlcl9ib3VuZCArICgodXBwZXJfYm91bmQgLSBsb3dlcl9ib3VuZCkgLyAyKTsKKyAgICBpZiAoIXN0c3NfLT5SZWFkVTMyRW50cnkoc3Rzc190YWJsZV9pbmRleF8sICZzdHNzX2xhc3Rfa2V5ZnJhbWVfKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAtLXN0c3NfbGFzdF9rZXlmcmFtZV87CisgICAgaWYgKHNhbXBsZV9udW1iZXIgPCBzdHNzX2xhc3Rfa2V5ZnJhbWVfKSB7CisgICAgICB1cHBlcl9ib3VuZCA9IHN0c3NfdGFibGVfaW5kZXhfIC0gMTsKKyAgICB9IGVsc2UgeyAgLy8gc2FtcGxlX251bWJlciA+PSBsYXN0X2tleWZyYW1lCisgICAgICBsb3dlcl9ib3VuZCA9IHN0c3NfdGFibGVfaW5kZXhfICsgMTsKKyAgICAgIC8vIGlmIHRoaXMgaXMgdGhlIGxhc3QgZW50cnkgaW4gdGhlIHRhYmxlLCB3ZSBjYW4gc3RvcCBoZXJlLgorICAgICAgaWYgKGxvd2VyX2JvdW5kID09IHN0c3NfLT5HZXRFbnRyeUNvdW50KCkpIHsKKyAgICAgICAgc3Rzc19uZXh0X2tleWZyYW1lXyA9IFVJTlQzMl9NQVg7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgICAgLy8gbG9hZCBuZXh0IGVudHJ5IGluIHRhYmxlLCBzZWUgaWYgd2UgYWN0dWFsbHkgZm91bmQgdGhlIHVwcGVyIGJvdW5kCisgICAgICBpZiAoIXN0c3NfLT5SZWFkVTMyRW50cnkobG93ZXJfYm91bmQsICZzdHNzX25leHRfa2V5ZnJhbWVfKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICAtLXN0c3NfbmV4dF9rZXlmcmFtZV87CisgICAgICBpZiAoc2FtcGxlX251bWJlciA8IHN0c3NfbmV4dF9rZXlmcmFtZV8pIHsKKyAgICAgICAgc3Rzc190YWJsZV9pbmRleF8gPSBsb3dlcl9ib3VuZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBzYW1wbGVfbnVtYmVyID49IHN0c3NfbGFzdF9rZXlmcmFtZV8gJiYKKyAgICAgICAgIHNhbXBsZV9udW1iZXIgPCBzdHNzX25leHRfa2V5ZnJhbWVfOworfQorCisvLyBUaGUgc3R0cyB0YWJsZSBoYXMgdGhlIGZvbGxvd2luZyBwZXItZW50cnkgbGF5b3V0OgorLy8gdWludDMyIHNhbXBsZSBjb3VudCAtIG51bWJlciBvZiBzZXF1ZW50aWFsIHNhbXBsZXMgd2l0aCB0aGlzIGR1cmF0aW9uCisvLyB1aW50MzIgc2FtcGxlIGR1cmF0aW9uIC0gZHVyYXRpb24gaW4gdGlja3Mgb2YgdGhpcyBzYW1wbGUgcmFuZ2UKK2Jvb2wgU2hlbGxNUDRNYXA6OnN0dHNfSW5pdCgpIHsKKyAgaW50IGNhY2hlX3NlZ21lbnRzID0KKyAgICAgIChzdHRzXy0+R2V0RW50cnlDb3VudCgpIC8gc3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSkgKyAxOworICBzdHRzX3NhbXBsZXNfLnJlc2VydmUoY2FjaGVfc2VnbWVudHMpOworICBzdHRzX3RpbWVzdGFtcHNfLnJlc2VydmUoY2FjaGVfc2VnbWVudHMpOworICAvLyBuZWVkIGF0IGxlYXN0IG9uZSBlbnRyeSBpbiB2YWxpZCBzdHRzCisgIGlmIChzdHRzXy0+R2V0RW50cnlDb3VudCgpID4gMCkgeworICAgIC8vIGludGVncmF0aW9uIHN0YXJ0cyBhdCAwIGZvciBib3RoIGNhY2hlIGVudHJpZXMKKyAgICBzdHRzX3NhbXBsZXNfLnB1c2hfYmFjaygwKTsKKyAgICBzdHRzX3RpbWVzdGFtcHNfLnB1c2hfYmFjaygwKTsKKyAgICBpZiAoIXN0dHNfLT5SZWFkVTMyUGFpckVudHJ5KDAsICZzdHRzX25leHRfZmlyc3Rfc2FtcGxlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHRzX3NhbXBsZV9kdXJhdGlvbl8pKSB7CisgICAgICBzdHRzXyA9IE5VTEw7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIHN0dHNfZmlyc3Rfc2FtcGxlXyA9IDA7CisgICAgc3R0c19maXJzdF9zYW1wbGVfdGltZV8gPSAwOworICAgIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfdGltZV8gPQorICAgICAgICBzdHRzX25leHRfZmlyc3Rfc2FtcGxlXyAqIHN0dHNfc2FtcGxlX2R1cmF0aW9uXzsKKyAgICBzdHRzX3RhYmxlX2luZGV4XyA9IDA7CisgIH0gZWxzZSB7CisgICAgc3R0c18gPSBOVUxMOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hlbGxNUDRNYXA6OnN0dHNfQWR2YW5jZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyKSB7CisgIERDSEVDSyhzdHRzXyk7CisgIC8vIHNhbXBsZV9udW1iZXIgY291bGQgYmUgYmVmb3JlIG91ciBjdXJyZW50IHNhbXBsZSByYW5nZSwgaW4gd2hpY2ggY2FzZQorICAvLyB3ZSBza2lwIHRvIHRoZSBuZWFyZXN0IHRhYmxlIGVudHJ5IGJlZm9yZSBzYW1wbGVfbnVtYmVyIGFuZCBpbnRlZ3JhdGUKKyAgLy8gZm9yd2FyZCB0byB0aGUgc2FtcGxlX251bWJlciBhZ2Fpbi4KKyAgaWYgKHNhbXBsZV9udW1iZXIgPCBzdHRzX2ZpcnN0X3NhbXBsZV8pIHsKKyAgICBpZiAoIXN0dHNfU2xpcENhY2hlVG9TYW1wbGUoc2FtcGxlX251bWJlciwgMCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKworICAvLyBzYW1wbGUgbnVtYmVyIGNvdWxkIGFsc28gYmUgd2VsbCBhaGVhZCBvZiB0aGlzIGNhY2hlIHNlZ21lbnQsIGlmIHdlJ3ZlCisgIC8vIHByZXZpb3VzbHkgY2FsY3VsYXRlZCBzdW1tYXRpb25zIGFoZWFkIGxldCdzIHNraXAgdG8gdGhlIGNvcnJlY3Qgb25lCisgIGludCBuZXh0X2NhY2hlX2luZGV4ID0gKHN0dHNfdGFibGVfaW5kZXhfIC8gc3R0c18tPkdldENhY2hlU2l6ZUVudHJpZXMoKSkgKyAxOworICBpZiAoKG5leHRfY2FjaGVfaW5kZXggPCBzdHRzX3NhbXBsZXNfLnNpemUoKSkgJiYKKyAgICAgIChzYW1wbGVfbnVtYmVyID49IHN0dHNfc2FtcGxlc19bbmV4dF9jYWNoZV9pbmRleF0pKSB7CisgICAgaWYgKCFzdHRzX1NsaXBDYWNoZVRvU2FtcGxlKHNhbXBsZV9udW1iZXIsIG5leHRfY2FjaGVfaW5kZXgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gaW50ZWdyYXRlIHRocm91Z2ggdGhlIHN0dHMgdW50aWwgc2FtcGxlX251bWJlciBpcyB3aXRoaW4gY3VycmVudCByYW5nZQorICB3aGlsZSAoc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8gPD0gc2FtcGxlX251bWJlcikgeworICAgIGlmICghc3R0c19JbnRlZ3JhdGVTdGVwKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIE1vdmUgb3VyIGludGVncmF0aW9uIHN0ZXBzIHRvIGEgcHJldmlvdXNseSBzYXZlZCBlbnRyeSBpbiB0aGUgY2FjaGUgdGFibGVzLgorLy8gU2VhcmNoZXMgbGluZWFybHkgdGhyb3VnaCB0aGUgdmVjdG9yIG9mIG9sZCBjYWNoZWQgdmFsdWVzLCBzbyBjYW4gYWNjZXB0IGEKKy8vIHN0YXJ0aW5nIGluZGV4IHRvIGRvIHRoZSBzZWFyY2ggZnJvbS4KK2Jvb2wgU2hlbGxNUDRNYXA6OnN0dHNfU2xpcENhY2hlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzdGFydGluZ19jYWNoZV9pbmRleCkgeworICBEQ0hFQ0tfTFQoc3RhcnRpbmdfY2FjaGVfaW5kZXgsIHN0dHNfc2FtcGxlc18uc2l6ZSgpKTsKKyAgaW50IGNhY2hlX2luZGV4ID0gc3RhcnRpbmdfY2FjaGVfaW5kZXg7CisgIGZvciAoOyBjYWNoZV9pbmRleCArIDEgPCBzdHRzX3NhbXBsZXNfLnNpemUoKTsgY2FjaGVfaW5kZXgrKykgeworICAgIGlmIChzYW1wbGVfbnVtYmVyIDwgc3R0c19zYW1wbGVzX1tjYWNoZV9pbmRleCArIDFdKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgc3R0c19maXJzdF9zYW1wbGVfID0gc3R0c19zYW1wbGVzX1tjYWNoZV9pbmRleF07CisgIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfID0gc3R0c190aW1lc3RhbXBzX1tjYWNoZV9pbmRleF07CisgIHN0dHNfdGFibGVfaW5kZXhfID0gY2FjaGVfaW5kZXggKiBzdHRzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOworICB1aW50MzIgc2FtcGxlX2NvdW50OworICAvLyByZWFkIHNhbXBsZSBjb3VudCBhbmQgZHVyYXRpb24gdG8gc2V0IG5leHQgdmFsdWVzCisgIGlmICghc3R0c18tPlJlYWRVMzJQYWlyRW50cnkoc3R0c190YWJsZV9pbmRleF8sICZzYW1wbGVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0dHNfc2FtcGxlX2R1cmF0aW9uXykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8gPSBzdHRzX2ZpcnN0X3NhbXBsZV8gKyBzYW1wbGVfY291bnQ7CisgIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfdGltZV8gPQorICAgICAgc3R0c19maXJzdF9zYW1wbGVfdGltZV8gKyAoc2FtcGxlX2NvdW50ICogc3R0c19zYW1wbGVfZHVyYXRpb25fKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hlbGxNUDRNYXA6OnN0dHNfQWR2YW5jZVRvVGltZSh1aW50NjQgdGltZXN0YW1wKSB7CisgIERDSEVDSyhzdHRzXyk7CisKKyAgaWYgKHRpbWVzdGFtcCA8IHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfKSB7CisgICAgaWYgKCFzdHRzX1NsaXBDYWNoZVRvVGltZSh0aW1lc3RhbXAsIDApKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gc2FtcGxlIG51bWJlciBjb3VsZCBhbHNvIGJlIHdlbGwgYWhlYWQgb2YgdGhpcyBjYWNoZSBzZWdtZW50LCBpZiB3ZSd2ZQorICAvLyBwcmV2aW91c2x5IGNhbGN1bGF0ZWQgc3VtbWF0aW9ucyBhaGVhZCBsZXQncyBza2lwIHRvIHRoZSBjb3JyZWN0IG9uZQorICBpbnQgbmV4dF9jYWNoZV9pbmRleCA9IChzdHRzX3RhYmxlX2luZGV4XyAvIHN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpICsgMTsKKyAgaWYgKChuZXh0X2NhY2hlX2luZGV4IDwgc3R0c190aW1lc3RhbXBzXy5zaXplKCkpICYmCisgICAgICAodGltZXN0YW1wID49IHN0dHNfdGltZXN0YW1wc19bbmV4dF9jYWNoZV9pbmRleF0pKSB7CisgICAgaWYgKCFzdHRzX1NsaXBDYWNoZVRvVGltZSh0aW1lc3RhbXAsIG5leHRfY2FjaGVfaW5kZXgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisKKyAgLy8gaW50ZWdyYXRlIHRocm91Z2ggdGhlIHN0dHMgdW50aWwgc2FtcGxlX251bWJlciBpcyB3aXRoaW4gY3VycmVudCByYW5nZQorICB3aGlsZSAoc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV90aW1lXyA8PSB0aW1lc3RhbXApIHsKKyAgICBpZiAoIXN0dHNfSW50ZWdyYXRlU3RlcCgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFNoZWxsTVA0TWFwOjpzdHRzX0ludGVncmF0ZVN0ZXAoKSB7CisgIC8vIGFkdmFuY2UgdGltZSB0byBuZXh0IHNhbXBsZSByYW5nZQorICB1aW50MzIgcmFuZ2Vfc2l6ZSA9IHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfIC0gc3R0c19maXJzdF9zYW1wbGVfOworICBzdHRzX2ZpcnN0X3NhbXBsZV90aW1lXyArPSAocmFuZ2Vfc2l6ZSAqIHN0dHNfc2FtcGxlX2R1cmF0aW9uXyk7CisgIC8vIGFkdmFuY2Ugc2FtcGxlIGNvdW50ZXIgdG8gbmV4dCByYW5nZQorICBzdHRzX2ZpcnN0X3NhbXBsZV8gPSBzdHRzX25leHRfZmlyc3Rfc2FtcGxlXzsKKyAgLy8gYnVtcCB0YWJsZSBjb3VudGVyIHRvIG5leHQgZW50cnkKKyAgc3R0c190YWJsZV9pbmRleF8rKzsKKyAgLy8gc2VlIGlmIHdlIGp1c3QgY3Jvc3NlZCBhIGNhY2hlIGJvdW5kYXJ5IGFuZCBzaG91bGQgY2FjaGUgcmVzdWx0cworICBpZiAoIShzdHRzX3RhYmxlX2luZGV4XyAlIHN0dHNfLT5HZXRDYWNoZVNpemVFbnRyaWVzKCkpKSB7CisgICAgaW50IGNhY2hlX2luZGV4ID0gc3R0c190YWJsZV9pbmRleF8gLyBzdHRzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOworICAgIC8vIGNoZWNrIHRoYXQgdGhpcyBpcyBvdXIgZmlyc3QgdGltZSB3aXRoIHRoZXNlIGRhdGEKKyAgICBpZiAoY2FjaGVfaW5kZXggPT0gc3R0c19zYW1wbGVzXy5zaXplKCkpIHsKKyAgICAgIC8vIGJvdGggdGFibGVzIHNob3VsZCBhbHdheXMgZ3JvdyB0b2dldGhlcgorICAgICAgRENIRUNLX0VRKHN0dHNfc2FtcGxlc18uc2l6ZSgpLCBzdHRzX3RpbWVzdGFtcHNfLnNpemUoKSk7CisgICAgICBzdHRzX3NhbXBsZXNfLnB1c2hfYmFjayhzdHRzX2ZpcnN0X3NhbXBsZV8pOworICAgICAgc3R0c190aW1lc3RhbXBzXy5wdXNoX2JhY2soc3R0c19maXJzdF9zYW1wbGVfdGltZV8pOworICAgIH0KKyAgICAvLyBvdXIgaW50ZWdyYXRpb24gYXQgdGhpcyBwb2ludCBzaG91bGQgYWx3YXlzIG1hdGNoIGFueSBzdG9yZWQgcmVjb3JkCisgICAgRENIRUNLX0VRKHN0dHNfZmlyc3Rfc2FtcGxlXywgc3R0c19zYW1wbGVzX1tjYWNoZV9pbmRleF0pOworICAgIERDSEVDS19FUShzdHRzX2ZpcnN0X3NhbXBsZV90aW1lXywgc3R0c190aW1lc3RhbXBzX1tjYWNoZV9pbmRleF0pOworICB9CisgIGlmIChzdHRzX3RhYmxlX2luZGV4XyA8IHN0dHNfLT5HZXRFbnRyeUNvdW50KCkpIHsKKyAgICAvLyBsb2FkIG5leHQgZW50cnkgZGF0YQorICAgIHVpbnQzMiBzYW1wbGVfY291bnQ7CisgICAgaWYgKCFzdHRzXy0+UmVhZFUzMlBhaXJFbnRyeShzdHRzX3RhYmxlX2luZGV4XywgJnNhbXBsZV9jb3VudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdHRzX3NhbXBsZV9kdXJhdGlvbl8pKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIGNhbGN1bGF0ZSBuZXh0IHNhbXBsZSBudW1iZXIgZnJvbSByYW5nZSBzaXplCisgICAgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8gPSBzdHRzX2ZpcnN0X3NhbXBsZV8gKyBzYW1wbGVfY291bnQ7CisgICAgLy8gYW5kIGxvYWQgZHVyYXRpb24gb2YgdGhpcyBzYW1wbGUgcmFuZ2UKKyAgICBzdHRzX25leHRfZmlyc3Rfc2FtcGxlX3RpbWVfID0KKyAgICAgICAgc3R0c19maXJzdF9zYW1wbGVfdGltZV8gKyAoc2FtcGxlX2NvdW50ICogc3R0c19zYW1wbGVfZHVyYXRpb25fKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXZSd2ZSBnb25lIGJleW9uZCB0aGUgcmFuZ2UgZGVmaW5lZCBieSB0aGUgbGFzdCBlbnRyeSBpbiB0aGUgc3R0cy4KKyAgICAvLyB0aGlzIGlzIGFuIGVycm9yLgorICAgIGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl8gPQorICAgICAgICBzdGQ6Om1pbihoaWdoZXN0X3ZhbGlkX3NhbXBsZV9udW1iZXJfLCBzdHRzX2ZpcnN0X3NhbXBsZV8gLSAxKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hlbGxNUDRNYXA6OnN0dHNfU2xpcENhY2hlVG9UaW1lKHVpbnQ2NCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnRpbmdfY2FjaGVfaW5kZXgpIHsKKyAgRENIRUNLX0xUKHN0YXJ0aW5nX2NhY2hlX2luZGV4LCBzdHRzX3RpbWVzdGFtcHNfLnNpemUoKSk7CisgIGludCBjYWNoZV9pbmRleCA9IHN0YXJ0aW5nX2NhY2hlX2luZGV4OworICBmb3IgKDsgY2FjaGVfaW5kZXggKyAxIDwgc3R0c190aW1lc3RhbXBzXy5zaXplKCk7IGNhY2hlX2luZGV4KyspIHsKKyAgICBpZiAodGltZXN0YW1wIDwgc3R0c190aW1lc3RhbXBzX1tjYWNoZV9pbmRleCArIDFdKSB7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKyAgc3R0c19maXJzdF9zYW1wbGVfID0gc3R0c19zYW1wbGVzX1tjYWNoZV9pbmRleF07CisgIHN0dHNfZmlyc3Rfc2FtcGxlX3RpbWVfID0gc3R0c190aW1lc3RhbXBzX1tjYWNoZV9pbmRleF07CisgIHN0dHNfdGFibGVfaW5kZXhfID0gY2FjaGVfaW5kZXggKiBzdHRzXy0+R2V0Q2FjaGVTaXplRW50cmllcygpOworICAvLyByZWFkIHNhbXBsZSBjb3VudCBhbmQgZHVyYXRpb24gdG8gc2V0IG5leHQgdmFsdWVzCisgIHVpbnQzMiBzYW1wbGVfY291bnQ7CisgIGlmICghc3R0c18tPlJlYWRVMzJQYWlyRW50cnkoc3R0c190YWJsZV9pbmRleF8sICZzYW1wbGVfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0dHNfc2FtcGxlX2R1cmF0aW9uXykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgc3R0c19uZXh0X2ZpcnN0X3NhbXBsZV8gPSBzdHRzX2ZpcnN0X3NhbXBsZV8gKyBzYW1wbGVfY291bnQ7CisgIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfdGltZV8gPQorICAgICAgc3R0c19maXJzdF9zYW1wbGVfdGltZV8gKyAoc2FtcGxlX2NvdW50ICogc3R0c19zYW1wbGVfZHVyYXRpb25fKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hlbGxNUDRNYXA6OnN0c3pfSW5pdCgpIHsgcmV0dXJuIHN0c3pfLT5HZXRCeXRlc0F0RW50cnkoMCkgIT0gTlVMTDsgfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfbWFwLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2NzU0NjYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oCkBAIC0wLDAgKzEsMjEyIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX01QNF9NQVBfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX0ZJTFRFUlNfU0hFTExfTVA0X01BUF9IXworCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vIHBlci1hdG9tIHNpemVzIG9mIGluZGl2aWR1YWwgdGFibGUgZW50cmllcworc3RhdGljIGNvbnN0IGludCBrRW50cnlTaXplX2NvNjQgPSA4Oworc3RhdGljIGNvbnN0IGludCBrRW50cnlTaXplX2N0dHMgPSA4Oworc3RhdGljIGNvbnN0IGludCBrRW50cnlTaXplX3N0Y28gPSA0Oworc3RhdGljIGNvbnN0IGludCBrRW50cnlTaXplX3N0dHMgPSA4Oworc3RhdGljIGNvbnN0IGludCBrRW50cnlTaXplX3N0c2MgPSAxMjsKK3N0YXRpYyBjb25zdCBpbnQga0VudHJ5U2l6ZV9zdHNzID0gNDsKK3N0YXRpYyBjb25zdCBpbnQga0VudHJ5U2l6ZV9zdHN6ID0gNDsKKworLy8gVXRpbGl0eSBjbGFzcyB0byBwYXJzZSB0aGUgdmFyaW91cyBzdWJhdG9tcyBvZiB0aGUgc3RibCBtcDQgYXRvbSBhbmQgdXNlCisvLyB0aGVtIHRvIHByb3ZpZGUgYnl0ZSBvZmZzZXRzLCBzaXplcywgYW5kIHRpbWVzdGFtcHMgb2YgYSBtcDQgYXRvbSB3aGlsZQorLy8gcmV1c2luZyBtZW1vcnkgaXNzdWVkIGJ5IFNoZWxsQnVmZmVyRmFjdG9yeS4gVGhlIGNhY2hpbmcgZGVzaWduIGJlbmVmaXRzCisvLyBmcm9tLCBidXQgZG9lcyBub3QgcmVxdWlyZSwgc2VxdWVudGlhbCBhY2Nlc3MgaW4gc2FtcGxlIG51bWJlcnMuCitjbGFzcyBTaGVsbE1QNE1hcCA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxTaGVsbE1QNE1hcD4geworIHB1YmxpYzoKKyAgZXhwbGljaXQgU2hlbGxNUDRNYXAoc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcik7CisKKyAgYm9vbCBJc0NvbXBsZXRlKCk7CisKKyAgLy8gQWxsIEdldCgpIG1ldGhvZHMgcmV0dXJuIHRydWUgb24gc3VjY2VzcyBhbmQgc2F2ZSB0aGVpciB2YWx1ZXMgYnkKKyAgLy8gcmVmZXJlbmNlIGluIHRoZSBsYXR0ZXIgYXJndW1lbnQuCisgIGJvb2wgR2V0U2l6ZSh1aW50MzIgc2FtcGxlX251bWJlciwgdWludDMyKiBzaXplX291dCk7CisgIGJvb2wgR2V0T2Zmc2V0KHVpbnQzMiBzYW1wbGVfbnVtYmVyLCB1aW50NjQqIG9mZnNldF9vdXQpOworICAvLyBhbGwgdGltZSB2YWx1ZXMgaW4gKnRpY2tzKiBhcyBkZWZpbmVkIGJ5IHRoZSBtcDQgY29udGFpbmVyCisgIGJvb2wgR2V0VGltZXN0YW1wKHVpbnQzMiBzYW1wbGVfbnVtYmVyLCB1aW50NjQqIHRpbWVzdGFtcF9vdXQpOworICBib29sIEdldER1cmF0aW9uKHVpbnQzMiBzYW1wbGVfbnVtYmVyLCB1aW50MzIqIGR1cmF0aW9uX291dCk7CisgIGJvb2wgR2V0SXNLZXlmcmFtZSh1aW50MzIgc2FtcGxlX251bWJlciwgYm9vbCogaXNfa2V5ZnJhbWVfb3V0KTsKKyAgLy8gVXNlZCB0byBkZXRlcm1pbmUgaWYgdGhlIGZhaWx1cmUgcmVwb3J0ZWQgYnkgYW55IG9mIHRoZSBhYm92ZSBtZXRob2RzCisgIC8vIGlzIGR1ZSB0byBFT1Mgb3Igb3RoZXIgKGZhdGFsKSBlcnJvci4gVGhlIGxlbmd0aCBvZiBhIG1wNCBmaWxlIGluIHNhbXBsZXMKKyAgLy8gbWF5IG5vdCBiZSBrbm93biB1bnRpbCBpdGVyYXRpbmcgdGhyb3VnaCBhbG1vc3QgdGhlIGVudGlyZSBtYXAsIGluIHRoZQorICAvLyBjYXNlIG9mIGEgZGVmYXVsdCBzYW1wbGUgc2l6ZSAocmFyZSBpbiBjb21wcmVzc2VkIG1lZGlhKQorICBib29sIElzRU9TKHVpbnQzMiBzYW1wbGVfbnVtYmVyKTsKKworICAvLyBSZXR1cm5zIHRoZSBrZXlmcmFtZSBzYW1wbGUgbnVtYmVyIG5lYXJlc3QgdGhlIHByb3ZpZGVkIHRpbWVzdGFtcAorICBib29sIEdldEtleWZyYW1lKHVpbnQ2NCB0aW1lc3RhbXAsIHVpbnQzMiogc2FtcGxlX291dCk7CisKKyAgLy8gcGFzcyAwIGFzIGNhY2hlX3NpemVfZW50cmllcyB0byBmb3JjZSBjYWNoaW5nIG9mIHRoZSBlbnRpcmUgbWFwLgorICBib29sIFNldEF0b20odWludDMyIGZvdXJfY2MsICAvLyBmb3VyQ0MgY29kZSBhc2NpaSBjb2RlIGFzIGJpZy1lbmRpYW4gdWludDMyCisgICAgICAgICAgICAgICB1aW50NjQgb2Zmc2V0LCAgIC8vIG9mZnNldCBvZiBhdG9tIGJvZHkgaW4gZmlsZQorICAgICAgICAgICAgICAgdWludDY0IHNpemUsICAgICAvLyB0b3RhbCBzaXplIG9mIGF0b20gaW4gYnl0ZXMKKyAgICAgICAgICAgICAgIHVpbnQzMiBjYWNoZV9zaXplX2VudHJpZXMsICAvLyBudW0gb2YgZW50cmllcyB0byBjYWNoZSBpbiBtZW1vcnkKKyAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4KiBhdG9tKTsgICAgICAgICAvLyBwb2ludGVyIHRvIGF0b20gYm9keSBzdGFydAorCisgcHJpdmF0ZToKKyAgYm9vbCBjbzY0X0luaXQoKTsKKworICBib29sIGN0dHNfSW5pdCgpOworICAvLyBhZHZhbmNlIHRoZSBjdHRzIGNhY2hlIGFuZCBpbnRlZ3JhdGlvbiBzdGF0ZSB0byBjb250YWluIHNhbXBsZSBudW1iZXIuCisgIGJvb2wgY3R0c19BZHZhbmNlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIpOworICBib29sIGN0dHNfU2xpcENhY2hlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIsIGludCBzdGFydGluZ19jYWNoZV9pbmRleCk7CisKKyAgYm9vbCBzdGNvX0luaXQoKTsKKworICBib29sIHN0c2NfSW5pdCgpOworICAvLyBhZHZhbmNlIHRoZSBzdHNjIGNhY2hlIGFuZCBpbnRlZ3JhdGlvbiBzdGF0ZSB0byBjb250YWluIHNhbXBsZSBudW1iZXIuCisgIGJvb2wgc3RzY19BZHZhbmNlVG9TYW1wbGUodWludDMyIHNhbXBsZV9udW1iZXIpOworICAvLyByZS11c2UgcHJldmlvdXNseSBjYWxjdWxhdGVkIHN1bXMgdG8ganVtcCB0aHJvdWdoIHRoZSB0YWJsZSB0byBnZXQgdG8gdGhlCisgIC8vIG5lYXJlc3QgY2FjaGUgZW50cnkgdGhhdCBjb250YWlucyBnaXZlbiBzYW1wbGUgbnVtYmVyLiBTdGFydHMgdGhlIHNlYXJjaAorICAvLyBmcm9tIHRoZSBzdGFydGluZ19jYWNoZV9pbmRleC4KKyAgYm9vbCBzdHNjX1NsaXBDYWNoZVRvU2FtcGxlKHVpbnQzMiBzYW1wbGVfbnVtYmVyLCBpbnQgc3RhcnRpbmdfY2FjaGVfaW5kZXgpOworCisgIGJvb2wgc3Rzc19Jbml0KCk7CisgIC8vIHN0ZXAgdGhyb3VnaCB0YWJsZSBieSBvbmUgdGFibGUgZW50cnksIHJldHVybiBmYWxzZSBvbiBlcnJvcgorICBib29sIHN0c3NfQWR2YW5jZVN0ZXAoKTsKKyAgLy8gc2VhcmNoIGZvciBuZWFyZXN0IGtleWZyYW1lLCB1cGRhdGUgc3RhdGUgdG8gY29udGFpbiBpdAorICBib29sIHN0c3NfRmluZE5lYXJlc3RLZXlmcmFtZSh1aW50MzIgc2FtcGxlX251bWJlcik7CisKKyAgYm9vbCBzdHRzX0luaXQoKTsKKyAgYm9vbCBzdHRzX0FkdmFuY2VUb1NhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlcik7CisgIGJvb2wgc3R0c19TbGlwQ2FjaGVUb1NhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlciwgaW50IHN0YXJ0aW5nX2NhY2hlX2luZGV4KTsKKyAgYm9vbCBzdHRzX0FkdmFuY2VUb1RpbWUodWludDY0IHRpbWVzdGFtcCk7CisgIGJvb2wgc3R0c19TbGlwQ2FjaGVUb1RpbWUodWludDY0IHRpbWVzdGFtcCwgaW50IHN0YXJ0aW5nX2NhY2hlX2luZGV4KTsKKyAgLy8gc3RlcCB0aHJvdWdoIHRoZSBzdHRzIHRhYmxlIGJ5IG9uZSB0YWJsZSBlbnRyeSwgcmV0dXJuIGZhbHNlIG9uIGVycm9yCisgIGJvb2wgc3R0c19JbnRlZ3JhdGVTdGVwKCk7CisKKyAgYm9vbCBzdHN6X0luaXQoKTsKKworICAvLyBUYWJsZUNhY2hlIG1hbmFnZXMgdGhlIGNhY2hpbmcgb2YgZWFjaCBhdG9tIHRhYmxlIGluIGEgc2VwYXJhdGUgaW5zdGFuY2UuCisgIC8vIEFzIGVhY2ggYXRvbSBoYXMgYSBkaWZmZXJlbnQgcGVyLWVudHJ5IGJ5dGUgc2l6ZSwgYW5kIG1heSB3YW50IGRpZmZlcmVudAorICAvLyBjYWNoaW5nIGJlaGF2aW9yIGJhc2VkIG9uIGNvbnN1bXB0aW9uIHJhdGUgb2YgZW50cmllcyBhbmQgdGhlIG92ZXJhbGwgc2l6ZQorICAvLyBvZiB0aGUgdGFibGUsIGl0IGFsbG93cyBlYWNoIGF0b20gdG8gdXNlIGl0cyBvd24gcG9saWN5IGZvciBjYWNoaW5nLgorICAvLyBUbyBrZWVwIHRoaW5ncyByZWxhdGl2ZWx5IHNpbXBsZSBpdCBhbHdheXMga2VlcCBhIHRhYmxlIG9mIHNpemUgb2YgdGhlCisgIC8vIG1pbmltdW0gb2YgY2FjaGVfc2l6ZV9lbnRyaWVzIG9yIGVudHJ5X2NvdW50IGluIG1lbW9yeSwgYW5kIHRoYXQgY2FjaGVkCisgIC8vIHRhYmxlIGlzIGFsd2F5cyBhbGlnbmVkIHdpdGggdGhlIGZ1bGwgdGFibGUgaW4gY2FjaGVfc2l6ZV9lbnRyaWVzLCBzbworICAvLyB0aGF0IHRoZSBwb3NpdGlvbiBpbiB0aGUgY2FjaGUgaXMgdHJpdmlhbGx5IGNhbGN1bGF0ZWQgZnJvbQorICAvLyBlbnRyeV9udW1iZXIgJSBjYWNoZV9zaXplX2VudHJpZXMsIGFuZCB0aGUgY2FjaGUgaW5kZXggaXMgc2ltaWxhcmx5CisgIC8vIGNhY3VsYXRlZCBmcm9tIGVudHJ5X251bWJlciAvIGNhY2hlX3NpemVfZW50cmllcy4KKyAgY2xhc3MgVGFibGVDYWNoZSA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxUYWJsZUNhY2hlPiB7CisgICBwdWJsaWM6CisgICAgVGFibGVDYWNoZSh1aW50NjQgdGFibGVfb2Zmc2V0LCAgLy8gYnl0ZSBvZmZzZXQgb2Ygc3RhcnQgb2YgdGFibGUgaW4gZmlsZQorICAgICAgICAgICAgICAgdWludDMyIGVudHJ5X2NvdW50LCAgIC8vIG51bWJlciBvZiBlbnRyaWVzIGluIHRhYmxlCisgICAgICAgICAgICAgICB1aW50MzIgZW50cnlfc2l6ZSwgICAgLy8gc2l6ZSBpbiBieXRlcyBvZiBlYWNoIGVudHJ5IGluIHRhYmxlCisgICAgICAgICAgICAgICB1aW50MzIgY2FjaGVfc2l6ZV9lbnRyaWVzLCAgLy8gbnVtYmVyIG9mIGVudHJpZXMgdG8gY2FjaGUgaW4gbWVtCisgICAgICAgICAgICAgICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyKTsgIC8vIHJlYWRlciB0byB1c2UKKworICAgIC8vIFRoZSBmb2xsb3dpbmcgUmVhZCogZnVuY3Rpb25zIGFsbCByZWFkIHZhbHVlcyBpbiBiaWcgZW5kaWFuLgorICAgIGJvb2wgUmVhZFUzMkVudHJ5KHVpbnQzMiBlbnRyeV9udW1iZXIsIHVpbnQzMiogZW50cnkpOworICAgIGJvb2wgUmVhZFUzMlBhaXJFbnRyeSh1aW50MzIgZW50cnlfbnVtYmVyLCB1aW50MzIqIGZpcnN0LCB1aW50MzIqIHNlY29uZCk7CisgICAgYm9vbCBSZWFkVTMyRW50cnlJbnRvVTY0KHVpbnQzMiBlbnRyeV9udW1iZXIsIHVpbnQ2NCogZW50cnkpOworICAgIGJvb2wgUmVhZFU2NEVudHJ5KHVpbnQzMiBlbnRyeV9udW1iZXIsIHVpbnQ2NCogZW50cnkpOworCisgICAgdWludDgqIEdldEJ5dGVzQXRFbnRyeSh1aW50MzIgZW50cnlfbnVtYmVyKTsKKworICAgIC8vIGhvdyBtYW55IGVudHJpZXMgdG90YWwgaW4gdGhlIHRhYmxlPworICAgIGlubGluZSB1aW50MzIgR2V0RW50cnlDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGVudHJ5X2NvdW50XzsgfQorICAgIC8vIGhvdyBtYW55IGVudHJpZXMgYXJlIHdlIGNhY2hpbmcgaW4gbWVtb3J5IGF0IG9uY2U/CisgICAgaW5saW5lIHVpbnQzMiBHZXRDYWNoZVNpemVFbnRyaWVzKCkgY29uc3QgeyByZXR1cm4gY2FjaGVfc2l6ZV9lbnRyaWVzXzsgfQorCisgICBwcml2YXRlOgorICAgIGZyaWVuZCBjbGFzcyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxUYWJsZUNhY2hlPjsKKyAgICB1aW50MzIgZW50cnlfc2l6ZV87ICAgICAgICAgIC8vIHNpemUgb2YgZW50cnkgaW4gYnl0ZXMKKyAgICB1aW50MzIgZW50cnlfY291bnRfOyAgICAgICAgIC8vIHNpemUgb2YgdGFibGUgaW4gZW50cmllcworICAgIHVpbnQzMiBjYWNoZV9zaXplX2VudHJpZXNfOyAgLy8gbWF4IG51bWJlciBvZiBlbnRyaWVzIHRvIGZpdCBpbiBtZW1vcnkKKyAgICB1aW50NjQgdGFibGVfb2Zmc2V0XzsgICAgICAgIC8vIG9mZnNldCBvZiB0YWJsZSBpbiBzdHJlYW0KKyAgICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyXzsgIC8vIG1lYW5zIHRvIHJlYWQgbW9yZSB0YWJsZQorCisgICAgLy8gY3VycmVudCBjYWNoZSBzdGF0ZQorICAgIHN0ZDo6dmVjdG9yPHVpbnQ4PiBjYWNoZV87ICAgICAgICAgLy8gdGhlIGNhY2hlZCBwYXJ0IG9mIHRoZSB0YWJsZQorICAgIHVpbnQzMiBjYWNoZV9maXJzdF9lbnRyeV9udW1iZXJfOyAgLy8gZmlyc3QgdGFibGUgZW50cnkgbnVtYmVyIGluIGNhY2hlCisgICAgdWludDMyIGNhY2hlX2VudHJ5X2NvdW50XzsgICAgICAgICAvLyBudW1iZXIgb2YgdmFsaWQgZW50cmllcyBpbiBjYWNoZQorICB9OworCisgIHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXJfOworCisgIC8vIGN1cnJlbnQgaW50ZWdyYXRpb24gc3RhdGUgZm9yIEdldE9mZnNldCgpLCB3ZSBzYXZlIHRoZSBzdW0gb2Ygc2FtcGxlIHNpemVzCisgIC8vIHdpdGhpbiB0aGUgY3VycmVudCBjaHVuay4KKyAgdWludDMyIGN1cnJlbnRfY2h1bmtfc2FtcGxlXzsgIC8vIHNhbXBsZSBudW1iZXIgbGFzdCBpbmNsdWRlZCBpbiBzdW1tYXRpb24KKyAgdWludDMyIG5leHRfY2h1bmtfc2FtcGxlXzsgICAgIC8vIGZpcnN0IHNhbXBsZSBudW1iZXIgb2YgbmV4dCBjaHVuaworICB1aW50NjQgY3VycmVudF9jaHVua19vZmZzZXRfOyAgLy8gZmlsZSBieXRlIG9mZnNldCBvZiBjdXJyZW50X2NodW5rX3NhbXBsZV8KKworICAvLyBDYW4gYmUgc2V0IGJ5IGEgc3RzeiBlbnRyeSBjb3VudCBidXQgYW4gc3RzeiBtYXkgcHJvdmlkZSBhIGRlZmF1bHQgc2l6ZSwKKyAgLy8gaW4gd2hpY2ggY2FzZSB0aGlzIG51bWJlciBtYXkgbm90IGJlIGtub3duIHVudGlsIGl0ZWdyYXRpb24gdGhyb3VnaAorICAvLyB0aGUgY3R0cywgb3Igc3R0cyBoYXMgY29tcGxldGVkLiBJbiB0aGUgZXZlbnQgdGhhdCBvbmUgb2YgdGhvc2UgdGFibGVzCisgIC8vIGVuZHMgYXQgYSBsb3dlciBudW1iZXIgdGhhbiB0aGUgb3RoZXJzIHRoaXMgbnVtYmVyIHdpbGwgYmUgYW1lbmRlZAorICAvLyB0byByZXR1cm4gdGhlIGxvd2VyIG51bWJlci4KKyAgdWludDMyIGhpZ2hlc3RfdmFsaWRfc2FtcGxlX251bWJlcl87CisKKyAgLy8gPT09PSBjMDY0IC0gcGVyLWNodW5rIGxpc3Qgb2YgZmlsZSBvZmZzZXRzICg2NC1iaXQpCisgIHNjb3BlZF9yZWZwdHI8VGFibGVDYWNoZT4gY282NF87CisKKyAgLy8gPT09PSBjdHRzIC0gcnVuLWxlbmd0aCBzYW1wbGUgbnVtYmVyIHRvIGNvbXBvc2l0aW9uIHRpbWUgb2Zmc2V0CisgIHNjb3BlZF9yZWZwdHI8VGFibGVDYWNoZT4gY3R0c187CisgIHVpbnQzMiBjdHRzX2ZpcnN0X3NhbXBsZV87CisgIHVpbnQzMiBjdHRzX3NhbXBsZV9vZmZzZXRfOworICB1aW50MzIgY3R0c19uZXh0X2ZpcnN0X3NhbXBsZV87CisgIHVpbnQzMiBjdHRzX3RhYmxlX2luZGV4XzsKKyAgc3RkOjp2ZWN0b3I8dWludDMyPiBjdHRzX3NhbXBsZXNfOworCisgIC8vID09PT0gc3RjbyAtIHBlci1jaHVuayBsaXN0IG9mIGNodW5rIGZpbGUgb2Zmc2V0cyAoMzItYml0KQorICBzY29wZWRfcmVmcHRyPFRhYmxlQ2FjaGU+IHN0Y29fOworCisgIC8vID09PT0gc3RzYyAtIGNodW5rLW51bWJlciB0byBzYW1wbGVzLXBlci1jaHVuaworICBzY29wZWRfcmVmcHRyPFRhYmxlQ2FjaGU+IHN0c2NfOworICB1aW50MzIgc3RzY19maXJzdF9jaHVua187ICAvLyBmaXJzdCBjaHVuayBvZiB0aGUgY3VycmVudCBzYW1wbGUgc2l6ZSByYW5nZQorICB1aW50MzIgc3RzY19maXJzdF9jaHVua19zYW1wbGVfOyAgLy8gc3VtIG9mIHNhbXBsZXMgb2YgYWxsIHByZXYgY2h1bmsgcmFuZ2VzCisgIHVpbnQzMiBzdHNjX3NhbXBsZXNfcGVyX2NodW5rXzsgICAvLyBjdXJyZW50IHNhbXBsZXMtcGVyLWNodW5rIGluIHRoaXMgcmFuZ2UKKyAgdWludDMyIHN0c2NfbmV4dF9maXJzdF9jaHVua187ICAvLyB0aGUgY2h1bmsgbnVtYmVyIHRoZSBuZXh0IHJlZ2lvbiBiZWdpbnMgaW4KKyAgdWludDMyIHN0c2NfbmV4dF9maXJzdF9jaHVua19zYW1wbGVfOyAgLy8gc2FtcGxlIG51bWJlciBuZXh0IHJlZ2lvbiBiZWdpbnMgaW4KKyAgdWludDMyIHN0c2NfdGFibGVfaW5kZXhfOyAgLy8gdGhlIGluZGV4IGluIHRoZSB0YWJsZSBvZiB0aGUgY3VycmVudCByYW5nZQorICBzdGQ6OnZlY3Rvcjx1aW50MzI+IHN0c2Nfc2FtcGxlX3N1bXNfOyAgLy8gc2F2ZWQgc3VtcyBvZiBjYWNoZSBzZWdtZW50cworCisgIC8vID09PT0gc3RzcyAtIGxpc3Qgb2Yga2V5ZnJhbWUgc2FtcGxlIG51bWJlcnMKKyAgc2NvcGVkX3JlZnB0cjxUYWJsZUNhY2hlPiBzdHNzXzsKKyAgdWludDMyIHN0c3NfbGFzdF9rZXlmcmFtZV87CisgIHVpbnQzMiBzdHNzX25leHRfa2V5ZnJhbWVfOworICB1aW50MzIgc3Rzc190YWJsZV9pbmRleF87ICAvLyBpbmRleCBvZiBzdHNzX25leHRfa2V5ZnJhbWVfIGluIHRhYmxlCisgIHN0ZDo6dmVjdG9yPHVpbnQzMj4gc3Rzc19rZXlmcmFtZXNfOworCisgIC8vID09PT0gc3R0cyAtIHJ1bi1sZW5ndGggc2FtcGxlIG51bWJlciB0byB0aW1lIGR1cmF0aW9uCisgIHNjb3BlZF9yZWZwdHI8VGFibGVDYWNoZT4gc3R0c187CisgIHVpbnQzMiBzdHRzX2ZpcnN0X3NhbXBsZV87ICAgICAgIC8vIGZpcnN0IHNhbXBsZSBvZiB0aGUgY3VycmVudCBkdXJhdGlvbiByYW5nZQorICB1aW50NjQgc3R0c19maXJzdF9zYW1wbGVfdGltZV87ICAvLyBzdW0gb2YgYWxsIGR1cmF0aW9ucyBvZiBwcmV2aW91cyByYW5nZXMKKyAgdWludDMyIHN0dHNfc2FtcGxlX2R1cmF0aW9uXzsgICAgLy8gY3VycmVudCBkdXJhdGlvbiBvZiBzYW1wbGVzIGluIHRoaXMgcmFuZ2UKKyAgdWludDMyIHN0dHNfbmV4dF9maXJzdF9zYW1wbGVfOyAgLy8gZmlyc3Qgc2FtcGxlIG51bWJlciBvZiBuZXh0IHJhbmdlCisgIHVpbnQ2NCBzdHRzX25leHRfZmlyc3Rfc2FtcGxlX3RpbWVfOyAgLy8gZmlyc3QgdGltZXN0YW1wIG9mIG5leHQgcmFuZ2UKKyAgdWludDMyIHN0dHNfdGFibGVfaW5kZXhfOyAgICAgICAgICAgICAvLyBpbmRleCBpbiB0aGUgdGFibGUgb2YgdGhlIG5leHQgZW50cnkKKyAgc3RkOjp2ZWN0b3I8dWludDMyPiBzdHRzX3NhbXBsZXNfOworICBzdGQ6OnZlY3Rvcjx1aW50NjQ+IHN0dHNfdGltZXN0YW1wc187CisKKyAgLy8gPT09PSBzdHN6IC0gcGVyLXNhbXBsZSBsaXN0IG9mIHNhbXBsZSBzaXplcworICBzY29wZWRfcmVmcHRyPFRhYmxlQ2FjaGU+IHN0c3pfOworICB1aW50MzIgc3Rzel9kZWZhdWx0X3NpemVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX0ZJTFRFUlNfU0hFTExfTVA0X01BUF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9tYXBfdW5pdHRlc3QuY2MgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcF91bml0dGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNjY0ODgyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9tYXBfdW5pdHRlc3QuY2MKQEAgLTAsMCArMSwxMTA4IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5oIgorCisjaW5jbHVkZSA8c3RkbGliLmg+ICAvLyBmb3IgcmFuZCBhbmQgc3JhbmQKKworI2luY2x1ZGUgPGFsZ29yaXRobT4gIC8vIGZvciBzdGQ6Om1pbgorI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzc3RyZWFtPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21vY2tfc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmgiCisjaW5jbHVkZSAibGJfcGxhdGZvcm0uaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2dtb2NrL2luY2x1ZGUvZ21vY2svZ21vY2suaCIKKyNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKKwordXNpbmcgOjpMQjo6UGxhdGZvcm06OmxvYWRfdWludDMyX2JpZ19lbmRpYW47Cit1c2luZyA6OkxCOjpQbGF0Zm9ybTo6c3RvcmVfdWludDMyX2JpZ19lbmRpYW47Cit1c2luZyA6OkxCOjpQbGF0Zm9ybTo6c3RvcmVfdWludDY0X2JpZ19lbmRpYW47CisKK3VzaW5nIDo6bWVkaWE6OmtBdG9tVHlwZV9jbzY0OwordXNpbmcgOjptZWRpYTo6a0F0b21UeXBlX2N0dHM7Cit1c2luZyA6Om1lZGlhOjprQXRvbVR5cGVfc3RjbzsKK3VzaW5nIDo6bWVkaWE6OmtBdG9tVHlwZV9zdHNjOwordXNpbmcgOjptZWRpYTo6a0F0b21UeXBlX3N0c3M7Cit1c2luZyA6Om1lZGlhOjprQXRvbVR5cGVfc3RzejsKK3VzaW5nIDo6bWVkaWE6OmtBdG9tVHlwZV9zdHRzOwordXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9jbzY0OwordXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9jdHRzOwordXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdGNvOwordXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHNjOwordXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHNzOwordXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHN6OwordXNpbmcgOjptZWRpYTo6a0VudHJ5U2l6ZV9zdHRzOwordXNpbmcgOjptZWRpYTo6TW9ja1NoZWxsRGF0YVNvdXJjZVJlYWRlcjsKK3VzaW5nIDo6bWVkaWE6OlNoZWxsQnVmZmVyRmFjdG9yeTsKK3VzaW5nIDo6bWVkaWE6OlNoZWxsTVA0TWFwOworCit1c2luZyA6OnRlc3Rpbmc6Ol87Cit1c2luZyA6OnRlc3Rpbmc6OkFsbE9mOwordXNpbmcgOjp0ZXN0aW5nOjpBbnlOdW1iZXI7Cit1c2luZyA6OnRlc3Rpbmc6OkRvQWxsOwordXNpbmcgOjp0ZXN0aW5nOjpHZTsKK3VzaW5nIDo6dGVzdGluZzo6SW52b2tlOwordXNpbmcgOjp0ZXN0aW5nOjpMdDsKK3VzaW5nIDo6dGVzdGluZzo6UmV0dXJuOwordXNpbmcgOjp0ZXN0aW5nOjpTZXRBcnJheUFyZ3VtZW50OworCituYW1lc3BhY2UgeworCitpbnQgUmFuZG9tUmFuZ2UoaW50IG1pbiwgaW50IG1heCkgeyByZXR1cm4gbWluICsgcmFuZCgpICUgKG1heCAtIG1pbiArIDEpOyB9CisKKy8vIERhdGEgc3RydWN0dXJlIHJlcHJlc2VudCBhIHNhbXBsZSBpbnNpZGUgc3RibC4gSXQgaGFzIHJlZHVuZGFudCBkYXRhIGZvcgorLy8gZWFzeSBhY2Nlc3MuCitzdHJ1Y3QgU2FtcGxlIHsKKyAgYm9vbCBpc19rZXlfZnJhbWU7CisgIGludCBzaXplOworICBpbnQgb2Zmc2V0OworICBpbnQgY2h1bmtfaW5kZXg7CisgIGludCBkdHNfZHVyYXRpb247CisgIGludCBkdHM7CisgIGludCBjdHM7Cit9OworCit0eXBlZGVmIHN0ZDo6dmVjdG9yPFNhbXBsZT4gU2FtcGxlVmVjdG9yOworCitjbGFzcyBTYW1wbGVUYWJsZSB7CisgcHVibGljOgorICAvLyBBbGwgcmFuZ2VzIGFyZSBpbmNsdXNpdmUgYXQgYm90aCBlbmRzLgorICAvLyBTZXQgcmFuZ2Ugb2YgY29tcG9zaXRpb24gdGltZXN0YW1wIHRvIFswLCAwXSB0byBkaXNhYmxlIGN0dHMuCisgIFNhbXBsZVRhYmxlKHVuc2lnbmVkIGludCBzZWVkLCBpbnQgbnVtX29mX3NhbXBsZXMsIGludCBtaW5fc2FtcGxlX3NpemUsCisgICAgICAgICAgICAgIGludCBtYXhfc2FtcGxlX3NpemUsIGludCBtaW5fc2FtcGxlc19wZXJfY2h1bmssCisgICAgICAgICAgICAgIGludCBtYXhfc2FtcGxlc19wZXJfY2h1bmssIGludCBtaW5fa2V5X2ZyYW1lX2dhcCwKKyAgICAgICAgICAgICAgaW50IG1heF9rZXlfZnJhbWVfZ2FwLCBpbnQgbWluX3NhbXBsZV9kZWNvZGVfdGltZXN0YW1wX29mZnNldCwKKyAgICAgICAgICAgICAgaW50IG1heF9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgICAgICAgIGludCBtaW5fc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgICAgICAgIGludCBtYXhfc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQpCisgICAgICA6IHJlYWRfY291bnRfKDApLCByZWFkX2J5dGVzXygwKSB7CisgICAgc3JhbmQoc2VlZCk7CisgICAgQ0hFQ0tfR1QobnVtX29mX3NhbXBsZXMsIDApOworICAgIENIRUNLX0dUKG1pbl9zYW1wbGVfc2l6ZSwgMCk7CisgICAgQ0hFQ0tfTEUobWluX3NhbXBsZV9zaXplLCBtYXhfc2FtcGxlX3NpemUpOworICAgIENIRUNLX0dUKG1pbl9zYW1wbGVzX3Blcl9jaHVuaywgMCk7CisgICAgQ0hFQ0tfTEUobWluX3NhbXBsZXNfcGVyX2NodW5rLCBtYXhfc2FtcGxlc19wZXJfY2h1bmspOworICAgIENIRUNLX0dUKG1pbl9rZXlfZnJhbWVfZ2FwLCAwKTsKKyAgICBDSEVDS19MRShtaW5fa2V5X2ZyYW1lX2dhcCwgbWF4X2tleV9mcmFtZV9nYXApOworICAgIENIRUNLX0dUKG1pbl9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsIDApOworICAgIENIRUNLX0xFKG1pbl9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgICAgICAgbWF4X3NhbXBsZV9kZWNvZGVfdGltZXN0YW1wX29mZnNldCk7CisgICAgQ0hFQ0tfTEUobWluX3NhbXBsZV9jb21wb3NpdGlvbl90aW1lc3RhbXBfb2Zmc2V0LAorICAgICAgICAgICAgIG1heF9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCk7CisKKyAgICBzYW1wbGVzXy5yZXNpemUobnVtX29mX3NhbXBsZXMpOworCisgICAgaW50IHJlbWFpbmluZ19zYW1wbGVfaW5fY2h1bmsgPSAwOworICAgIGludCBjdXJyZW50X2NodW5rX2luZGV4ID0gLTE7CisgICAgaW50IG5leHRfa2V5X2ZyYW1lID0gMDsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX29mX3NhbXBsZXM7ICsraSkgeworICAgICAgc2FtcGxlc19baV0uc2l6ZSA9IFJhbmRvbVJhbmdlKG1pbl9zYW1wbGVfc2l6ZSwgbWF4X3NhbXBsZV9zaXplKTsKKyAgICAgIHNhbXBsZXNfW2ldLm9mZnNldCA9CisgICAgICAgICAgaSA9PSAwID8gcmFuZCgpIDogc2FtcGxlc19baSAtIDFdLm9mZnNldCArIHNhbXBsZXNfW2kgLSAxXS5zaXplOworICAgICAgc2FtcGxlc19baV0uZHRzID0KKyAgICAgICAgICBpID09IDAgPyAwIDogc2FtcGxlc19baSAtIDFdLmR0cyArIHNhbXBsZXNfW2kgLSAxXS5kdHNfZHVyYXRpb247CisgICAgICBzYW1wbGVzX1tpXS5kdHNfZHVyYXRpb24gPQorICAgICAgICAgIFJhbmRvbVJhbmdlKG1pbl9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgbWF4X3NhbXBsZV9kZWNvZGVfdGltZXN0YW1wX29mZnNldCk7CisKKyAgICAgIHNhbXBsZXNfW2ldLmN0cyA9IHNhbXBsZXNfW2ldLmR0cyArCisgICAgICAgICAgICAgICAgICAgICAgICBSYW5kb21SYW5nZShtaW5fc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXhfc2FtcGxlX2NvbXBvc2l0aW9uX3RpbWVzdGFtcF9vZmZzZXQpOworICAgICAgaWYgKCFyZW1haW5pbmdfc2FtcGxlX2luX2NodW5rKSB7CisgICAgICAgICsrY3VycmVudF9jaHVua19pbmRleDsKKyAgICAgICAgcmVtYWluaW5nX3NhbXBsZV9pbl9jaHVuayA9CisgICAgICAgICAgICBSYW5kb21SYW5nZShtaW5fc2FtcGxlc19wZXJfY2h1bmssIG1heF9zYW1wbGVzX3Blcl9jaHVuayk7CisgICAgICB9CisKKyAgICAgIGlmIChpID49IG5leHRfa2V5X2ZyYW1lKSB7CisgICAgICAgIHNhbXBsZXNfW2ldLmlzX2tleV9mcmFtZSA9IHRydWU7CisgICAgICAgIG5leHRfa2V5X2ZyYW1lICs9IFJhbmRvbVJhbmdlKG1pbl9rZXlfZnJhbWVfZ2FwLCBtYXhfa2V5X2ZyYW1lX2dhcCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBzYW1wbGVzX1tpXS5pc19rZXlfZnJhbWUgPSBmYWxzZTsKKyAgICAgIH0KKworICAgICAgc2FtcGxlc19baV0uY2h1bmtfaW5kZXggPSBjdXJyZW50X2NodW5rX2luZGV4OworICAgICAgLS1yZW1haW5pbmdfc2FtcGxlX2luX2NodW5rOworICAgIH0KKworICAgIFBvcHVsYXRlQm94ZXMoKTsKKyAgfQorCisgIGludDY0IEdldEJveE9mZnNldCh1aW50MzIgYXRvbV90eXBlKSBjb25zdCB7CisgICAgc3dpdGNoIChhdG9tX3R5cGUpIHsKKyAgICAgIGNhc2Uga0F0b21UeXBlX3N0c3o6CisgICAgICAgIHJldHVybiBzdHN6X29mZnNldF87CisgICAgICBjYXNlIGtBdG9tVHlwZV9zdGNvOgorICAgICAgICByZXR1cm4gc3Rjb19vZmZzZXRfOworICAgICAgY2FzZSBrQXRvbVR5cGVfY282NDoKKyAgICAgICAgcmV0dXJuIGNvNjRfb2Zmc2V0XzsKKyAgICAgIGNhc2Uga0F0b21UeXBlX3N0c2M6CisgICAgICAgIHJldHVybiBzdHNjX29mZnNldF87CisgICAgICBjYXNlIGtBdG9tVHlwZV9jdHRzOgorICAgICAgICByZXR1cm4gY3R0c19vZmZzZXRfOworICAgICAgY2FzZSBrQXRvbVR5cGVfc3R0czoKKyAgICAgICAgcmV0dXJuIHN0dHNfb2Zmc2V0XzsKKyAgICAgIGNhc2Uga0F0b21UeXBlX3N0c3M6CisgICAgICAgIHJldHVybiBzdHNzX29mZnNldF87CisgICAgICBkZWZhdWx0OgorICAgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgfQorCisgIGludDY0IEdldEJveFNpemUodWludDMyIGF0b21fdHlwZSkgY29uc3QgeworICAgIHN3aXRjaCAoYXRvbV90eXBlKSB7CisgICAgICBjYXNlIGtBdG9tVHlwZV9zdHN6OgorICAgICAgICByZXR1cm4gc3Rzel8uc2l6ZSgpOworICAgICAgY2FzZSBrQXRvbVR5cGVfc3RjbzoKKyAgICAgICAgcmV0dXJuIHN0Y29fLnNpemUoKTsKKyAgICAgIGNhc2Uga0F0b21UeXBlX2NvNjQ6CisgICAgICAgIHJldHVybiBjbzY0Xy5zaXplKCk7CisgICAgICBjYXNlIGtBdG9tVHlwZV9zdHNjOgorICAgICAgICByZXR1cm4gc3RzY18uc2l6ZSgpOworICAgICAgY2FzZSBrQXRvbVR5cGVfY3R0czoKKyAgICAgICAgcmV0dXJuIGN0dHNfLnNpemUoKTsKKyAgICAgIGNhc2Uga0F0b21UeXBlX3N0dHM6CisgICAgICAgIHJldHVybiBzdHRzXy5zaXplKCk7CisgICAgICBjYXNlIGtBdG9tVHlwZV9zdHNzOgorICAgICAgICByZXR1cm4gc3Rzc18uc2l6ZSgpOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgIH0KKworICBjb25zdCB1aW50OF90KiBHZXRCb3hEYXRhKHVpbnQzMiBhdG9tX3R5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gJmNvbWJpbmVkX1swXSArIEdldEJveE9mZnNldChhdG9tX3R5cGUpIC0gZmlsZV9vZmZzZXRfOworICB9CisKKyAgc2l6ZV90IHNhbXBsZV9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIHNhbXBsZXNfLnNpemUoKTsgfQorICBjb25zdCBTYW1wbGUmIHNhbXBsZShpbnQgaSkgY29uc3QgeyByZXR1cm4gc2FtcGxlc18uYXQoaSk7IH0KKworICBzaXplX3Qga2V5ZnJhbWVfY291bnQoKSBjb25zdCB7IHJldHVybiAoc3Rzc18uc2l6ZSgpIC0gOCkgLyBrRW50cnlTaXplX3N0c3M7IH0KKworICBpbnQgQmxvY2tpbmdSZWFkKGludDY0IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDgqIGRhdGEpIHsKKyAgICBDSEVDS19HRShwb3NpdGlvbiwgZmlsZV9vZmZzZXRfKTsKKyAgICBDSEVDS19MRShwb3NpdGlvbiArIHNpemUsIGZpbGVfb2Zmc2V0XyArIGNvbWJpbmVkXy5zaXplKCkpOworICAgIHVpbnQzMiBvZmZzZXQgPSBwb3NpdGlvbiAtIGZpbGVfb2Zmc2V0XzsKKyAgICBtZW1jcHkoZGF0YSwgJmNvbWJpbmVkX1swXSArIG9mZnNldCwgc2l6ZSk7CisgICAgKytyZWFkX2NvdW50XzsKKyAgICByZWFkX2J5dGVzXyArPSBzaXplOworICAgIHJldHVybiBzaXplOworICB9CisKKyAgdm9pZCBDbGVhclJlYWRTdGF0aXN0aWNzKCkgeworICAgIHJlYWRfY291bnRfID0gMDsKKyAgICByZWFkX2J5dGVzXyA9IDA7CisgIH0KKworICBpbnQgcmVhZF9jb3VudCgpIGNvbnN0IHsgcmV0dXJuIHJlYWRfY291bnRfOyB9CisgIGludCByZWFkX2J5dGVzKCkgY29uc3QgeyByZXR1cm4gcmVhZF9ieXRlc187IH0KKworICB2b2lkIER1bXAoKSBjb25zdCB7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgdWludDMyIGJveGVzW10gPSB7a0F0b21UeXBlX3N0c3osIGtBdG9tVHlwZV9zdGNvLCBrQXRvbVR5cGVfY282NCwKKyAgICAgICAgICAgICAgICAgICAgICBrQXRvbVR5cGVfc3RzYywga0F0b21UeXBlX2N0dHMsIGtBdG9tVHlwZV9zdHRzLAorICAgICAgICAgICAgICAgICAgICAgIGtBdG9tVHlwZV9zdHNzfTsKKyAgICBjb25zdCBjaGFyKiBuYW1lc1tdID0geyJzdHN6IiwgInN0Y28iLCAiY282NCIsICJzdHNjIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJjdHRzIiwgInN0dHMiLCAic3RzcyJ9OworICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgc2l6ZW9mKGJveGVzKSAvIHNpemVvZigqYm94ZXMpOyArK2kpIHsKKyAgICAgIHNzIDw8ICJcbj09PT09PT09PT09PT09PT09PT09PT09PSAiIDw8IG5hbWVzW2ldCisgICAgICAgICA8PCAiID09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKKyAgICAgIGludDY0IHNpemUgPSBHZXRCb3hTaXplKGJveGVzW2ldKTsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEgPSBHZXRCb3hEYXRhKGJveGVzW2ldKTsKKyAgICAgIGZvciAoaW50NjQgaiA9IDA7IGogPCBzaXplOyArK2opIHsKKyAgICAgICAgc3MgPDwgc3RhdGljX2Nhc3Q8dW5zaWduZWQgaW50PihkYXRhW2pdKSA8PCAnICc7CisgICAgICAgIGlmIChqICE9IDAgJiYgaiAlIDMyID09IDApIHNzIDw8ICdcbic7CisgICAgICB9CisgICAgfQorICAgIExPRyhJTkZPKSA8PCBzcy5zdHIoKTsKKyAgfQorCisgcHJpdmF0ZToKKyAgU2FtcGxlVmVjdG9yIHNhbXBsZXNfOworCisgIGludDY0IGZpbGVfb2Zmc2V0XzsKKyAgaW50NjQgc3Rzel9vZmZzZXRfOworICBpbnQ2NCBzdGNvX29mZnNldF87CisgIGludDY0IGNvNjRfb2Zmc2V0XzsKKyAgaW50NjQgc3RzY19vZmZzZXRfOworICBpbnQ2NCBjdHRzX29mZnNldF87CisgIGludDY0IHN0dHNfb2Zmc2V0XzsKKyAgaW50NjQgc3Rzc19vZmZzZXRfOworCisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGNvbWJpbmVkXzsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3Rzel87CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHN0Y29fOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBjbzY0XzsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3RzY187CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IGN0dHNfOworICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBzdHRzXzsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gc3Rzc187CisKKyAgaW50IHJlYWRfY291bnRfOworICBpbnQgcmVhZF9ieXRlc187CisKKyAgc3RhdGljIHZvaWQgaW5jX3VpbnQzMl9iaWdfZW5kaWFuKHVpbnQ4X3QqIGRhdGEpIHsKKyAgICB1aW50MzIgdmFsdWUgPSBsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKGRhdGEpOworICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKHZhbHVlICsgMSwgZGF0YSk7CisgIH0KKworICB2b2lkIFBvcHVsYXRlQm94ZXMoKSB7CisgICAgQ0hFQ0soIXNhbXBsZXNfLmVtcHR5KCkpOworICAgIGJvb2wgYWxsX2tleV9mcmFtZXMgPSB0cnVlOworICAgIGJvb2wgYWxsX2N0dHNfb2Zmc2V0X2lzX3plcm8gPSB0cnVlOworICAgIGJvb2wgYWxsX3NhbXBsZV9oYXNfc2FtZV9zaXplID0gdHJ1ZTsKKworICAgIGZvciAoU2FtcGxlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdGVyID0gc2FtcGxlc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ZXIgIT0gc2FtcGxlc18uZW5kKCk7ICsraXRlcikgeworICAgICAgaWYgKCFpdGVyLT5pc19rZXlfZnJhbWUpIGFsbF9rZXlfZnJhbWVzID0gZmFsc2U7CisgICAgICBpZiAoaXRlci0+ZHRzICE9IGl0ZXItPmN0cykgYWxsX2N0dHNfb2Zmc2V0X2lzX3plcm8gPSBmYWxzZTsKKyAgICAgIGlmIChpdGVyLT5zaXplICE9IHNhbXBsZXNfWzBdLnNpemUpIGFsbF9zYW1wbGVfaGFzX3NhbWVfc2l6ZSA9IGZhbHNlOworICAgIH0KKworICAgIC8vIHBvcHVsYXRlIHRoZSBzdHN6IGJveDogNCBieXRlcyBmbGFncyArIDQgYnl0ZXMgZGVmYXVsdCBzaXplCisgICAgLy8gICAgICsgNCBieXRlcyBjb3VudCArIHNpemUgdGFibGUgaWYgZGVmYXVsdCBzaXplIGlzIDAKKyAgICBpZiAoYWxsX3NhbXBsZV9oYXNfc2FtZV9zaXplKSB7CisgICAgICBzdHN6Xy5yZXNpemUoMTIpOworICAgICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oc2FtcGxlc19bMF0uc2l6ZSwgJnN0c3pfWzRdKTsKKyAgICB9IGVsc2UgeworICAgICAgc3Rzel8ucmVzaXplKHNhbXBsZXNfLnNpemUoKSAqIGtFbnRyeVNpemVfc3RzeiArIDEyKTsKKyAgICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKDAsICZzdHN6X1s0XSk7CisKKyAgICAgIHVpbnQ4X3QqIHRhYmxlX29mZnNldCA9ICZzdHN6X1sxMl07CisKKyAgICAgIGZvciAoU2FtcGxlVmVjdG9yOjpjb25zdF9pdGVyYXRvciBpdGVyID0gc2FtcGxlc18uYmVnaW4oKTsKKyAgICAgICAgICAgaXRlciAhPSBzYW1wbGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKGl0ZXItPnNpemUsIHRhYmxlX29mZnNldCk7CisgICAgICAgIHRhYmxlX29mZnNldCArPSBrRW50cnlTaXplX3N0c3o7CisgICAgICB9CisgICAgfQorICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKHNhbXBsZXNfLnNpemUoKSwgJnN0c3pfWzhdKTsKKworICAgIC8vIHBvcHVsYXRlIHN0Y28sIGNvNjQgYW5kIHN0c2MKKyAgICAvLyBzdGNvID0gNCBieXRlcyBjb3VudCArICg0IGJ5dGVzIG9mZnNldCkqCisgICAgLy8gY282NCA9IDQgYnl0ZXMgY291bnQgKyAoOCBieXRlcyBvZmZzZXQpKgorICAgIC8vIHN0c2MgPSA0IGJ5dGVzIGNvdW50ICsgKDQgYnl0ZXMgY2h1bmsgaW5kZXggKyA0IGJ5dGVzIHNhbXBsZSBwZXIgY2h1bmsKKyAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICArIDQgYnl0ZXMgc2FtcGxlIGRlc2NyaXB0aW9uIGluZGV4KSoKKyAgICBzdGNvXy5yZXNpemUoOCk7CisgICAgY282NF8ucmVzaXplKDgpOworICAgIHN0c2NfLnJlc2l6ZSg4KTsKKyAgICB1aW50MzIgY2h1bmtfb2Zmc2V0ID0gc2FtcGxlc19bMF0ub2Zmc2V0OworICAgIGludCBjdXJyZW50X2NodW5rX2luZGV4ID0gLTE7CisgICAgZm9yIChTYW1wbGVWZWN0b3I6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBzYW1wbGVzXy5iZWdpbigpOworICAgICAgICAgaXRlciAhPSBzYW1wbGVzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgICBpZiAoY3VycmVudF9jaHVua19pbmRleCAhPSBpdGVyLT5jaHVua19pbmRleCkgeworICAgICAgICBjdXJyZW50X2NodW5rX2luZGV4ID0gaXRlci0+Y2h1bmtfaW5kZXg7CisgICAgICAgIHN0Y29fLnJlc2l6ZShzdGNvXy5zaXplKCkgKyBrRW50cnlTaXplX3N0Y28pOworICAgICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbihjaHVua19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGNvX1tzdGNvXy5zaXplKCkgLSBrRW50cnlTaXplX3N0Y29dKTsKKyAgICAgICAgY282NF8ucmVzaXplKGNvNjRfLnNpemUoKSArIGtFbnRyeVNpemVfY282NCk7CisgICAgICAgIHN0b3JlX3VpbnQ2NF9iaWdfZW5kaWFuKGNodW5rX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvNjRfW2NvNjRfLnNpemUoKSAtIGtFbnRyeVNpemVfY282NF0pOworICAgICAgICBzdHNjXy5yZXNpemUoc3RzY18uc2l6ZSgpICsga0VudHJ5U2l6ZV9zdHNjKTsKKyAgICAgICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oY3VycmVudF9jaHVua19pbmRleCArIDEsICAvLyBzdGFydCBmcm9tIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0c2NfW3N0c2NfLnNpemUoKSAtIGtFbnRyeVNpemVfc3RzY10pOworICAgICAgfQorICAgICAgaW5jX3VpbnQzMl9iaWdfZW5kaWFuKCZzdHNjX1tzdHNjXy5zaXplKCkgLSBrRW50cnlTaXplX3N0c2MgKyA0XSk7CisgICAgICBjaHVua19vZmZzZXQgKz0gaXRlci0+c2l6ZTsKKyAgICB9CisgICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oKHN0Y29fLnNpemUoKSAtIDgpIC8ga0VudHJ5U2l6ZV9zdGNvLCAmc3Rjb19bNF0pOworICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKChjbzY0Xy5zaXplKCkgLSA4KSAvIGtFbnRyeVNpemVfY282NCwgJmNvNjRfWzRdKTsKKyAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbigoc3RzY18uc2l6ZSgpIC0gOCkgLyBrRW50cnlTaXplX3N0c2MsICZzdHNjX1s0XSk7CisKKyAgICAvLyBwb3B1bGF0ZSBzdHRzIGFuZCBjdHRzLgorICAgIC8vIHN0dHMgPSA0IGJ5dGVzIGNvdW50ICsgKDQgYnl0ZXMgc2FtcGxlIGNvdW50ICsgNCBieXRlcyBzYW1wbGUgZGVsdGEpKgorICAgIC8vIGN0dHMgPSA0IGJ5dGVzIGNvdW50ICsgKDQgYnl0ZXMgc2FtcGxlIGNvdW50ICsgNCBieXRlcyBzYW1wbGUgb2Zmc2V0KSoKKyAgICAvLyAgICAgICAgdGhlIG9mZnNldCBpcyB0byBzdHRzLgorICAgIHN0dHNfLnJlc2l6ZSg4KTsKKyAgICBjdHRzXy5yZXNpemUoYWxsX2N0dHNfb2Zmc2V0X2lzX3plcm8gPyAwIDogOCk7CisgICAgaW50MzIgbGFzdF9zdHRzX2R1cmF0aW9uID0gLTE7CisgICAgaW50MzIgbGFzdF9jdHRzX29mZnNldCA9IHNhbXBsZXNfWzBdLmN0cyAtIHNhbXBsZXNfWzBdLmR0cyAtIDE7CisKKyAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZXNfLnNpemUoKTsgKytpKSB7CisgICAgICBpbnQzMiBjdHRzX29mZnNldCA9IHNhbXBsZXNfW2ldLmN0cyAtIHNhbXBsZXNfW2ldLmR0czsKKyAgICAgIGlmIChsYXN0X3N0dHNfZHVyYXRpb24gIT0gc2FtcGxlc19baV0uZHRzX2R1cmF0aW9uKSB7CisgICAgICAgIHN0dHNfLnJlc2l6ZShzdHRzXy5zaXplKCkgKyBrRW50cnlTaXplX3N0dHMpOworICAgICAgICBsYXN0X3N0dHNfZHVyYXRpb24gPSBzYW1wbGVzX1tpXS5kdHNfZHVyYXRpb247CisgICAgICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKGxhc3Rfc3R0c19kdXJhdGlvbiwgJnN0dHNfW3N0dHNfLnNpemUoKSAtIDRdKTsKKyAgICAgIH0KKyAgICAgIGluY191aW50MzJfYmlnX2VuZGlhbigmc3R0c19bc3R0c18uc2l6ZSgpIC0gOF0pOworICAgICAgaWYgKCFhbGxfY3R0c19vZmZzZXRfaXNfemVybykgeworICAgICAgICBpZiAobGFzdF9jdHRzX29mZnNldCAhPSBjdHRzX29mZnNldCkgeworICAgICAgICAgIGN0dHNfLnJlc2l6ZShjdHRzXy5zaXplKCkgKyBrRW50cnlTaXplX2N0dHMpOworICAgICAgICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKGN0dHNfb2Zmc2V0LCAmY3R0c19bY3R0c18uc2l6ZSgpIC0gNF0pOworICAgICAgICAgIGxhc3RfY3R0c19vZmZzZXQgPSBjdHRzX29mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpbmNfdWludDMyX2JpZ19lbmRpYW4oJmN0dHNfW2N0dHNfLnNpemUoKSAtIDhdKTsKKyAgICAgIH0KKyAgICB9CisgICAgc3RvcmVfdWludDMyX2JpZ19lbmRpYW4oKHN0dHNfLnNpemUoKSAtIDgpIC8ga0VudHJ5U2l6ZV9zdHRzLCAmc3R0c19bNF0pOworICAgIGlmICghYWxsX2N0dHNfb2Zmc2V0X2lzX3plcm8pCisgICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbigoY3R0c18uc2l6ZSgpIC0gOCkgLyBrRW50cnlTaXplX2N0dHMsICZjdHRzX1s0XSk7CisKKyAgICAvLyBwb3B1bGF0ZSBzdHNzIGJveAorICAgIC8vIHN0c3MgPSA0IGJ5dGVzIGNvdW50ICsgKDQgYnl0ZXMgc2FtcGxlIGluZGV4KSoKKyAgICBpZiAoIWFsbF9rZXlfZnJhbWVzKSB7CisgICAgICBzdHNzXy5yZXNpemUoOCk7CisgICAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNhbXBsZXNfLnNpemUoKTsgKytpKSB7CisgICAgICAgIGlmIChzYW1wbGVzX1tpXS5pc19rZXlfZnJhbWUpIHsKKyAgICAgICAgICBzdHNzXy5yZXNpemUoc3Rzc18uc2l6ZSgpICsga0VudHJ5U2l6ZV9zdHNzKTsKKyAgICAgICAgICBzdG9yZV91aW50MzJfYmlnX2VuZGlhbihpICsgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc3Rzc19bc3Rzc18uc2l6ZSgpIC0ga0VudHJ5U2l6ZV9zdHNzXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHN0b3JlX3VpbnQzMl9iaWdfZW5kaWFuKChzdHNzXy5zaXplKCkgLSA4KSAvIGtFbnRyeVNpemVfc3RzcywgJnN0c3NfWzRdKTsKKyAgICB9CisKKyAgICBjb25zdCBpbnQga0dhcmJhZ2VTaXplID0gMTAyNDsKKyAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBnYXJiYWdlOworICAgIGdhcmJhZ2UucmVzZXJ2ZShrR2FyYmFnZVNpemUpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwga0dhcmJhZ2VTaXplOyArK2kpCisgICAgICBnYXJiYWdlLnB1c2hfYmFjayhSYW5kb21SYW5nZSgweGVmLCAweGZlKSk7CisgICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIGdhcmJhZ2UuYmVnaW4oKSwgZ2FyYmFnZS5lbmQoKSk7CisgICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIHN0c3pfLmJlZ2luKCksIHN0c3pfLmVuZCgpKTsKKyAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgZ2FyYmFnZS5iZWdpbigpLCBnYXJiYWdlLmVuZCgpKTsKKyAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgc3Rjb18uYmVnaW4oKSwgc3Rjb18uZW5kKCkpOworICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBnYXJiYWdlLmJlZ2luKCksIGdhcmJhZ2UuZW5kKCkpOworICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBjbzY0Xy5iZWdpbigpLCBjbzY0Xy5lbmQoKSk7CisgICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIGdhcmJhZ2UuYmVnaW4oKSwgZ2FyYmFnZS5lbmQoKSk7CisgICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIHN0c2NfLmJlZ2luKCksIHN0c2NfLmVuZCgpKTsKKyAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgZ2FyYmFnZS5iZWdpbigpLCBnYXJiYWdlLmVuZCgpKTsKKyAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgY3R0c18uYmVnaW4oKSwgY3R0c18uZW5kKCkpOworICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBnYXJiYWdlLmJlZ2luKCksIGdhcmJhZ2UuZW5kKCkpOworICAgIGNvbWJpbmVkXy5pbnNlcnQoY29tYmluZWRfLmVuZCgpLCBzdHRzXy5iZWdpbigpLCBzdHRzXy5lbmQoKSk7CisgICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIGdhcmJhZ2UuYmVnaW4oKSwgZ2FyYmFnZS5lbmQoKSk7CisgICAgY29tYmluZWRfLmluc2VydChjb21iaW5lZF8uZW5kKCksIHN0c3NfLmJlZ2luKCksIHN0c3NfLmVuZCgpKTsKKyAgICBjb21iaW5lZF8uaW5zZXJ0KGNvbWJpbmVkXy5lbmQoKSwgZ2FyYmFnZS5iZWdpbigpLCBnYXJiYWdlLmVuZCgpKTsKKworICAgIGZpbGVfb2Zmc2V0XyA9IGFicyhyYW5kKCkpOworICAgIHN0c3pfb2Zmc2V0XyA9IGZpbGVfb2Zmc2V0XyArIGtHYXJiYWdlU2l6ZTsKKyAgICBzdGNvX29mZnNldF8gPSBzdHN6X29mZnNldF8gKyBzdHN6Xy5zaXplKCkgKyBrR2FyYmFnZVNpemU7CisgICAgY282NF9vZmZzZXRfID0gc3Rjb19vZmZzZXRfICsgc3Rjb18uc2l6ZSgpICsga0dhcmJhZ2VTaXplOworICAgIHN0c2Nfb2Zmc2V0XyA9IGNvNjRfb2Zmc2V0XyArIGNvNjRfLnNpemUoKSArIGtHYXJiYWdlU2l6ZTsKKyAgICBjdHRzX29mZnNldF8gPSBzdHNjX29mZnNldF8gKyBzdHNjXy5zaXplKCkgKyBrR2FyYmFnZVNpemU7CisgICAgc3R0c19vZmZzZXRfID0gY3R0c19vZmZzZXRfICsgY3R0c18uc2l6ZSgpICsga0dhcmJhZ2VTaXplOworICAgIHN0c3Nfb2Zmc2V0XyA9IHN0dHNfb2Zmc2V0XyArIHN0dHNfLnNpemUoKSArIGtHYXJiYWdlU2l6ZTsKKyAgfQorfTsKKworY2xhc3MgU2hlbGxNUDRNYXBUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgU2hlbGxNUDRNYXBUZXN0KCkgeworICAgIC8vIHdlIGNyZWF0ZSBhbmQgZGVzdHJveSBidWZmZXIgZmFjdG9yeSBhZnRlciBlYWNoIHRlc3QgdG8gZGV0ZWN0IGFueQorICAgIC8vIGxlYWtlZCByZWZlcmVuY2UtY291bnRlZCBvYmplY3RzIG9yIHBlbmRpbmcgY2FsbGJhY2tzCisgICAgU2hlbGxCdWZmZXJGYWN0b3J5OjpJbml0aWFsaXplKCk7CisgICAgLy8gbWFrZSBhIG5ldyBtb2NrIHJlYWRlcgorICAgIHJlYWRlcl8gPSBuZXcgOjp0ZXN0aW5nOjpOaWNlTW9jazxNb2NrU2hlbGxEYXRhU291cmNlUmVhZGVyPigpOworICAgIC8vIG1ha2UgYSBuZXcgbWFwIHdpdGggYSBtb2NrIHJlYWRlci4KKyAgICBtYXBfID0gbmV3IFNoZWxsTVA0TWFwKHJlYWRlcl8pOworICB9CisKKyAgdmlydHVhbCB+U2hlbGxNUDRNYXBUZXN0KCkgeworICAgIC8vIHdpcGUgb3V0IHRoZSBtYXAgb3IgU2hlbGxCdWZmZXJGYWN0b3J5IG1heSBjb21wbGFpbiBvZiB1bmZyZWVkIGFsbG9jcworICAgIERDSEVDSyhtYXBfLT5IYXNPbmVSZWYoKSk7CisgICAgbWFwXyA9IE5VTEw7CisKKyAgICByZWFkZXJfLT5TdG9wKGJhc2U6OkNsb3N1cmUoKSk7CisgICAgRENIRUNLKHJlYWRlcl8tPkhhc09uZVJlZigpKTsKKyAgICByZWFkZXJfID0gTlVMTDsKKworICAgIFNoZWxsQnVmZmVyRmFjdG9yeTo6VGVybWluYXRlKCk7CisgIH0KKworICB2b2lkIFJlc2V0TWFwKCkgeyBtYXBfID0gbmV3IFNoZWxsTVA0TWFwKHJlYWRlcl8pOyB9CisKKyAgdm9pZCBDcmVhdGVUZXN0U2FtcGxlVGFibGUodW5zaWduZWQgaW50IHNlZWQsIGludCBudW1fb2Zfc2FtcGxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9zYW1wbGVfc2l6ZSwgaW50IG1heF9zYW1wbGVfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9zYW1wbGVzX3Blcl9jaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zYW1wbGVzX3Blcl9jaHVuaywgaW50IG1pbl9rZXlfZnJhbWVfZ2FwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X2tleV9mcmFtZV9nYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtaW5fc2FtcGxlX2RlY29kZV90aW1lc3RhbXBfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWF4X3NhbXBsZV9kZWNvZGVfdGltZXN0YW1wX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1pbl9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heF9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCkgeworICAgIHNhbXBsZV90YWJsZV8ucmVzZXQobmV3IFNhbXBsZVRhYmxlKAorICAgICAgICBzZWVkLCBudW1fb2Zfc2FtcGxlcywgbWluX3NhbXBsZV9zaXplLCBtYXhfc2FtcGxlX3NpemUsCisgICAgICAgIG1pbl9zYW1wbGVzX3Blcl9jaHVuaywgbWF4X3NhbXBsZXNfcGVyX2NodW5rLCBtaW5fa2V5X2ZyYW1lX2dhcCwKKyAgICAgICAgbWF4X2tleV9mcmFtZV9nYXAsIG1pbl9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgIG1heF9zYW1wbGVfZGVjb2RlX3RpbWVzdGFtcF9vZmZzZXQsCisgICAgICAgIG1pbl9zYW1wbGVfY29tcG9zaXRpb25fdGltZXN0YW1wX29mZnNldCwKKyAgICAgICAgbWF4X3NhbXBsZV9jb21wb3NpdGlvbl90aW1lc3RhbXBfb2Zmc2V0KSk7CisgICAgT05fQ0FMTCgqcmVhZGVyXywgQmxvY2tpbmdSZWFkKF8sIF8sIF8pKQorICAgICAgICAuV2lsbEJ5RGVmYXVsdChJbnZva2Uoc2FtcGxlX3RhYmxlXy5nZXQoKSwgJlNhbXBsZVRhYmxlOjpCbG9ja2luZ1JlYWQpKTsKKyAgfQorCisgIHZvaWQgU2V0VGVzdFRhYmxlKHVpbnQzMiBmb3VyX2NjLCB1aW50MzIgY2FjaGVfc2l6ZV9lbnRyaWVzKSB7CisgICAgbWFwXy0+U2V0QXRvbShmb3VyX2NjLCBzYW1wbGVfdGFibGVfLT5HZXRCb3hPZmZzZXQoZm91cl9jYyksCisgICAgICAgICAgICAgICAgICBzYW1wbGVfdGFibGVfLT5HZXRCb3hTaXplKGZvdXJfY2MpLCBjYWNoZV9zaXplX2VudHJpZXMsCisgICAgICAgICAgICAgICAgICBzYW1wbGVfdGFibGVfLT5HZXRCb3hEYXRhKGZvdXJfY2MpKTsKKyAgfQorCisgIGNvbnN0IFNhbXBsZSYgR2V0VGVzdFNhbXBsZSh1aW50MzIgc2FtcGxlX251bWJlcikgY29uc3QgeworICAgIHJldHVybiBzYW1wbGVfdGFibGVfLT5zYW1wbGUoc2FtcGxlX251bWJlcik7CisgIH0KKworICAvLyA9PT09IFRlc3QgRml4dHVyZSBNZW1iZXJzCisgIHNjb3BlZF9yZWZwdHI8U2hlbGxNUDRNYXA+IG1hcF87CisgIHNjb3BlZF9yZWZwdHI8TW9ja1NoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyXzsKKyAgc2NvcGVkX3B0cjxTYW1wbGVUYWJsZT4gc2FtcGxlX3RhYmxlXzsKK307CisKKy8vID09PT0gU2V0QXRvbSgpIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvKgorVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgU2V0QXRvbVdpdGhaZXJvRGVmYXVsdFNpemUpIHsKKyAgLy8gU2V0QXRvbSgpIHNob3VsZCBmYWlsIHdpdGggYSB6ZXJvIGRlZmF1bHQgc2l6ZSBvbiBhbiBzdHNjLgorICBOT1RJTVBMRU1FTlRFRCgpOworfQorKi8KKy8vID09PT0gR2V0U2l6ZSgpIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldFNpemVXaXRoRGVmYXVsdFNpemUpIHsKKyAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDEwMCwgMTAwMCwgMHhiMGRmMDBkLCAweGIwZGYwMGQsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLAorICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDIwKTsKKyAgc2FtcGxlX3RhYmxlXy0+Q2xlYXJSZWFkU3RhdGlzdGljcygpOworCisgIGZvciAoaW50IGkgPSAxMzsgaSA8IDIxOyArK2kpIHsKKyAgICBSZXNldE1hcCgpOworICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzeiwgaSk7CisKKyAgICB1aW50MzIgcmV0dXJuZWRfc2l6ZTsKKyAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRTaXplKDAsIHJldHVybmVkX3NpemUpKTsKKyAgICBBU1NFUlRfRVEocmV0dXJuZWRfc2l6ZSwgMHhiMGRmMDBkKTsKKyAgICBBU1NFUlRfRkFMU0UobWFwXy0+R2V0U2l6ZSgyMDAwLCByZXR1cm5lZF9zaXplKSk7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZSgyLCByZXR1cm5lZF9zaXplKSk7CisgICAgQVNTRVJUX0VRKHJldHVybmVkX3NpemUsIDB4YjBkZjAwZCk7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZSgxMjAsIHJldHVybmVkX3NpemUpKTsKKyAgICBBU1NFUlRfRVEocmV0dXJuZWRfc2l6ZSwgMHhiMGRmMDBkKTsKKyAgfQorCisgIEFTU0VSVF9FUShzYW1wbGVfdGFibGVfLT5yZWFkX2NvdW50KCksIDApOworfQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRTaXplSXRlcmF0aW9uV2l0aEh1Z2VDYWNoZSkgeworICBmb3IgKGludCBtYXhfc2FtcGxlX3NpemUgPSAxMDsgbWF4X3NhbXBsZV9zaXplIDwgMjA7ICsrbWF4X3NhbXBsZV9zaXplKSB7CisgICAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDIwMCArIG1heF9zYW1wbGVfc2l6ZSwgMTAwMCwgMTAsIG1heF9zYW1wbGVfc2l6ZSwgNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7CisgICAgZm9yIChpbnQgaSA9IDE1MDA7IGkgPCAxMDAwMDsgaSA9IGkgKiAyICsgMSkgeworICAgICAgUmVzZXRNYXAoKTsKKyAgICAgIHNhbXBsZV90YWJsZV8tPkNsZWFyUmVhZFN0YXRpc3RpY3MoKTsKKyAgICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzeiwgaSk7CisKKyAgICAgIGZvciAodWludDMyIGogPSAwOyBqIDwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7IGorKykgeworICAgICAgICB1aW50MzIgbWFwX3JlcG9ydGVkX3NpemUgPSAwOworICAgICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRTaXplKGosIG1hcF9yZXBvcnRlZF9zaXplKSk7CisgICAgICAgIHVpbnQzMiB0YWJsZV9zaXplID0gR2V0VGVzdFNhbXBsZShqKS5zaXplOworICAgICAgICAvLyByZXBvcnRlZCBzaXplIHNob3VsZCBtYXRjaCB0YWJsZSBzaXplCisgICAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfc2l6ZSwgdGFibGVfc2l6ZSk7CisgICAgICB9CisKKyAgICAgIC8vIGNhbGwgdG8gYSBzYW1wbGUgcGFzdCB0aGUgc2l6ZSBvZiB0aGUgdGFibGUgc2hvdWxkIGZhaWwKKyAgICAgIHVpbnQzMiBmYWlsZWRfc2l6ZSA9IDA7CisgICAgICBBU1NFUlRfRkFMU0UobWFwXy0+R2V0U2l6ZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSwgZmFpbGVkX3NpemUpKTsKKyAgICAgIEFTU0VSVF9MRShzYW1wbGVfdGFibGVfLT5yZWFkX2NvdW50KCksIDEpOworICAgICAgQVNTRVJUX0xFKHNhbXBsZV90YWJsZV8tPnJlYWRfYnl0ZXMoKSwKKyAgICAgICAgICAgICAgICBzYW1wbGVfdGFibGVfLT5HZXRCb3hTaXplKGtBdG9tVHlwZV9zdHN6KSk7CisgICAgfQorICB9Cit9CisKK1RFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldFNpemVJdGVyYXRpb25UaW55Q2FjaGUpIHsKKyAgZm9yIChpbnQgbWF4X3NhbXBsZV9zaXplID0gMTA7IG1heF9zYW1wbGVfc2l6ZSA8IDIwOyArK21heF9zYW1wbGVfc2l6ZSkgeworICAgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgzMDAgKyBtYXhfc2FtcGxlX3NpemUsIDEwMDAsIDEwLCBtYXhfc2FtcGxlX3NpemUsIDUsCisgICAgICAgICAgICAgICAgICAgICAgICAgIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOworICAgIGZvciAoaW50IGkgPSA1OyBpIDwgMTI7ICsraSkgeworICAgICAgUmVzZXRNYXAoKTsKKyAgICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzeiwgaSk7CisgICAgICBzYW1wbGVfdGFibGVfLT5DbGVhclJlYWRTdGF0aXN0aWNzKCk7CisgICAgICBmb3IgKHVpbnQzMiBqID0gMDsgaiA8IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOyBqKyspIHsKKyAgICAgICAgdWludDMyIG1hcF9yZXBvcnRlZF9zaXplID0gMDsKKyAgICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZShqLCBtYXBfcmVwb3J0ZWRfc2l6ZSkpOworICAgICAgICB1aW50MzIgdGFibGVfc2l6ZSA9IEdldFRlc3RTYW1wbGUoaikuc2l6ZTsKKyAgICAgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9zaXplLCB0YWJsZV9zaXplKTsKKyAgICAgIH0KKyAgICAgIEFTU0VSVF9MRShzYW1wbGVfdGFibGVfLT5yZWFkX2NvdW50KCksCisgICAgICAgICAgICAgICAgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLyBpICsgMSk7CisgICAgICBpZiAoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpKQorICAgICAgICBBU1NFUlRfTEUoc2FtcGxlX3RhYmxlXy0+cmVhZF9ieXRlcygpIC8gc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLAorICAgICAgICAgICAgICAgICAgKGkgKyAxKSAqIGtFbnRyeVNpemVfc3Rzeik7CisgICAgICAvLyBjYWxsIHRvIHNhbXBsZSBwYXN0IHRoZSB0YWJsZSBzaXplIHNob3VsZCBzdGlsbCBmYWlsZQorICAgICAgdWludDMyIGZhaWxlZF9zaXplID0gMDsKKyAgICAgIEFTU0VSVF9GQUxTRShtYXBfLT5HZXRTaXplKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpLCBmYWlsZWRfc2l6ZSkpOworICAgIH0KKyAgfQorfQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRTaXplUmFuZG9tQWNjZXNzKSB7CisgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMDEsIDIwMDAsIDIwLCAyNCwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7CisgIGZvciAoaW50IGkgPSAyNDsgaSA8IDI3OyArK2kpIHsKKyAgICBSZXNldE1hcCgpOworICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzeiwgaSk7CisgICAgc2FtcGxlX3RhYmxlXy0+Q2xlYXJSZWFkU3RhdGlzdGljcygpOworICAgIC8vIHRlc3QgZmlyc3Qgc2FtcGxlIHF1ZXJ5IHNvbWV3aGVyZSBsYXRlciBpbiB0aGUgdGFibGUsIHNhbXBsZSAxMDUKKyAgICB1aW50MzIgbWFwX3JlcG9ydGVkX3NpemUgPSAwOworICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoaSAqIDQgKyA1LCBtYXBfcmVwb3J0ZWRfc2l6ZSkpOworICAgIHVpbnQzMiB0YWJsZV9zaXplID0gR2V0VGVzdFNhbXBsZShpICogNCArIDUpLnNpemU7CisgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9zaXplLCB0YWJsZV9zaXplKTsKKyAgICBBU1NFUlRfRVEoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLCAxKTsKKyAgICBBU1NFUlRfTEUoc2FtcGxlX3RhYmxlXy0+cmVhZF9ieXRlcygpLCAoaSArIDEpICoga0VudHJ5U2l6ZV9zdHN6KTsKKworICAgIC8vIG5vdyBqdW1wIGJhY2sgdG8gc2FtcGxlIDAKKyAgICBzYW1wbGVfdGFibGVfLT5DbGVhclJlYWRTdGF0aXN0aWNzKCk7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZSgwLCBtYXBfcmVwb3J0ZWRfc2l6ZSkpOworICAgIHRhYmxlX3NpemUgPSBHZXRUZXN0U2FtcGxlKDApLnNpemU7CisgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9zaXplLCB0YWJsZV9zaXplKTsKKyAgICBBU1NFUlRfRVEoc2FtcGxlX3RhYmxlXy0+cmVhZF9jb3VudCgpLCAxKTsKKyAgICBBU1NFUlRfTEUoc2FtcGxlX3RhYmxlXy0+cmVhZF9ieXRlcygpLCAoaSArIDEpICoga0VudHJ5U2l6ZV9zdHN6KTsKKworICAgIC8vIG5vdyBzZWVrIHdlbGwgcGFzdCB0aGUgZW5kLCB0aGlzIHF1ZXJ5IHNob3VsZCBmYWlsIGJ1dCBub3QgYnJlYWsKKyAgICAvLyBzdWJzZXF1ZW50IHF1ZXJpZXMgb3IgaXNzdWUgYSByZWNhY2hlCisgICAgQVNTRVJUX0ZBTFNFKAorICAgICAgICBtYXBfLT5HZXRTaXplKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpLCBtYXBfcmVwb3J0ZWRfc2l6ZSkpOworCisgICAgLy8gYSBxdWVyeSBiYWNrIHdpdGhpbiB0aGUgZmlyc3QgdGFibGUgc2hvdWxkIG5vdCBjYXVzZSByZWNhY2hlCisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZSgxMCwgbWFwX3JlcG9ydGVkX3NpemUpKTsKKyAgICB0YWJsZV9zaXplID0gR2V0VGVzdFNhbXBsZSgxMCkuc2l6ZTsKKyAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3NpemUsIHRhYmxlX3NpemUpOworCisgICAgLy8gY2hlY2sgc2FtcGxlIHF1ZXJpZXMgcmlnaHQgb24gY2FjaGUgYm91bmRhcmllcyBvdXQtb2Ytb3JkZXIKKyAgICBzYW1wbGVfdGFibGVfLT5DbGVhclJlYWRTdGF0aXN0aWNzKCk7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0U2l6ZSgyICogaSwgbWFwX3JlcG9ydGVkX3NpemUpKTsKKyAgICB0YWJsZV9zaXplID0gR2V0VGVzdFNhbXBsZSgyICogaSkuc2l6ZTsKKyAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3NpemUsIHRhYmxlX3NpemUpOworICAgIEFTU0VSVF9FUShzYW1wbGVfdGFibGVfLT5yZWFkX2NvdW50KCksIDEpOworICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoMiAqIGkgLSAxLCBtYXBfcmVwb3J0ZWRfc2l6ZSkpOworICAgIHRhYmxlX3NpemUgPSBHZXRUZXN0U2FtcGxlKDIgKiBpIC0gMSkuc2l6ZTsKKyAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3NpemUsIHRhYmxlX3NpemUpOworICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFNpemUoMiAqIGkgLSAyLCBtYXBfcmVwb3J0ZWRfc2l6ZSkpOworICAgIHRhYmxlX3NpemUgPSBHZXRUZXN0U2FtcGxlKDIgKiBpIC0gMikuc2l6ZTsKKyAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3NpemUsIHRhYmxlX3NpemUpOworICAgIEFTU0VSVF9FUShzYW1wbGVfdGFibGVfLT5yZWFkX2NvdW50KCksIDIpOworICB9Cit9CisKKy8vID09PT0gR2V0T2Zmc2V0KCkgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldE9mZnNldEl0ZXJhdGlvbkh1Z2VDYWNoZSkgeworICBmb3IgKGludCBjb2luZGV4ID0gMDsgY29pbmRleCA8IDI7ICsrY29pbmRleCkgeworICAgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMDIgKyBjb2luZGV4LCAxMDAwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgMjApOworICAgIFJlc2V0TWFwKCk7CisgICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHN6LCAxMDAwKTsKKyAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c2MsIDEwMDApOworICAgIFNldFRlc3RUYWJsZShjb2luZGV4ID8ga0F0b21UeXBlX3N0Y28gOiBrQXRvbVR5cGVfY282NCwgMTAwMCk7CisKKyAgICAvLyBubyBleHBlY3RhdGlvbnMgb24gcmVhZGVyXywgYWxsIHRhYmxlcyBzaG91bGQgbm93IGJlIGluIG1lbW9yeQorICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7ICsraSkgeworICAgICAgdWludDY0IG1hcF9yZXBvcnRlZF9vZmZzZXQgPSAwOworICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0T2Zmc2V0KGksIG1hcF9yZXBvcnRlZF9vZmZzZXQpKTsKKyAgICAgIHVpbnQ2NCB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKGkpLm9mZnNldDsKKyAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworICAgIH0KKworICAgIC8vIGNhbGxzIHRvIHNhbXBsZSBudW1iZXJzIG91dHNpZGUgZmlsZSByYW5nZSBzaG91bGQgZmFpbCBub24tZmF0YWxseQorICAgIHVpbnQ2NCBmYWlsZWRfb2Zmc2V0OworICAgIEFTU0VSVF9GQUxTRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCksIGZhaWxlZF9vZmZzZXQpKTsKKyAgfQorfQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRPZmZzZXRJdGVyYXRpb25UaW55Q2FjaGUpIHsKKyAgZm9yIChpbnQgY29pbmRleCA9IDA7IGNvaW5kZXggPCAyOyArK2NvaW5kZXgpIHsKKyAgICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTAzLCAzMCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKKyAgICBmb3IgKGludCBpID0gMTsgaSA8IDEyOyArK2kpIHsKKyAgICAgIFJlc2V0TWFwKCk7CisgICAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIGkpOworICAgICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHNjLCBpKTsKKyAgICAgIFNldFRlc3RUYWJsZShjb2luZGV4ID8ga0F0b21UeXBlX3N0Y28gOiBrQXRvbVR5cGVfY282NCwgaSk7CisKKyAgICAgIC8vIGl0ZXJhdGUgdGhyb3VnaCBhbGwgc2FtcGxlcyBpbiByYW5nZQorICAgICAgZm9yICh1aW50MzIgaiA9IDA7IGogPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgaiArPSAyKSB7CisgICAgICAgIHVpbnQ2NCBtYXBfcmVwb3J0ZWRfb2Zmc2V0ID0gMDsKKyAgICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0T2Zmc2V0KGosIG1hcF9yZXBvcnRlZF9vZmZzZXQpKTsKKyAgICAgICAgdWludDY0IHRhYmxlX29mZnNldCA9IEdldFRlc3RTYW1wbGUoaikub2Zmc2V0OworICAgICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKKyAgICAgIH0KKworICAgICAgLy8gY2FsbHMgdG8gc2FtcGxlIG51bWJlcnMgb3V0c2lkZSBmaWxlIHJhbmdlIHNob3VsZCBmYWlsIG5vbi1mYXRhbGx5CisgICAgICB1aW50NjQgZmFpbGVkX29mZnNldDsKKyAgICAgIEFTU0VSVF9GQUxTRSgKKyAgICAgICAgICBtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCksIGZhaWxlZF9vZmZzZXQpKTsKKyAgICB9CisgIH0KK30KKworLy8gUmFuZG9tIGFjY2VzcyB3aXRoaW4gY2FjaGUgc2hvdWxkIGp1c3QgcmVzdWx0IGluIGNvcnJlY3QgcmUtaW50ZWdyYXRpb24KKy8vIHRocm91Z2ggdGhlIHN0c2MuCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRPZmZzZXRSYW5kb21BY2Nlc3NIdWdlQ2FjaGUpIHsKKyAgZm9yIChpbnQgY29pbmRleCA9IDA7IGNvaW5kZXggPCAyOyArK2NvaW5kZXgpIHsKKyAgICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTA0LCAzMDAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7CisgICAgUmVzZXRNYXAoKTsKKyAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIDMwMCk7CisgICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHNjLCAzMDApOworICAgIFNldFRlc3RUYWJsZShjb2luZGV4ID8ga0F0b21UeXBlX3N0Y28gOiBrQXRvbVR5cGVfY282NCwgMzAwKTsKKworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDsgKytpKSB7CisgICAgICB1aW50MzIgc2FtcGxlX251bWJlciA9IHJhbmQoKSAlIHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOworICAgICAgdWludDY0IG1hcF9yZXBvcnRlZF9vZmZzZXQgPSAwOworICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0T2Zmc2V0KHNhbXBsZV9udW1iZXIsIG1hcF9yZXBvcnRlZF9vZmZzZXQpKTsKKyAgICAgIHVpbnQ2NCB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLm9mZnNldDsKKyAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworICAgIH0KKyAgfQorfQorCisvLyBSYW5kb20gYWNjZXNzIGFjcm9zcyBjYWNoZSBib3VuZGFyaWVzIHNob3VsZCBub3QgYnJlYWsgY29tcHV0YXRpb24gb2YKKy8vIG9mZnNldHMuCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRPZmZzZXRSYW5kb21BY2Nlc3NUaW55Q2FjaGUpIHsKKyAgZm9yIChpbnQgY29pbmRleCA9IDA7IGNvaW5kZXggPCAyOyArK2NvaW5kZXgpIHsKKyAgICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTA1LCAzMDAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7CisgICAgUmVzZXRNYXAoKTsKKyAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIDcpOworICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzYywgNyk7CisgICAgU2V0VGVzdFRhYmxlKGNvaW5kZXggPyBrQXRvbVR5cGVfc3RjbyA6IGtBdG9tVHlwZV9jbzY0LCA3KTsKKworICAgIC8vIGNhbGxzIHRvIHNhbXBsZSBudW1iZXJzIG91dHNpZGUgZmlsZSByYW5nZSBzaG91bGQgZmFpbCBub24tZmF0YWxseQorICAgIHVpbnQ2NCBmYWlsZWRfb2Zmc2V0OworICAgIEFTU0VSVF9GQUxTRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCksIGZhaWxlZF9vZmZzZXQpKTsKKworICAgIC8vIHNlY29uZCBzYW1wbGUgaW4gdGhlIGZpbGUKKyAgICB1aW50MzIgc2FtcGxlX251bWJlciA9IDE7CisgICAgdWludDY0IG1hcF9yZXBvcnRlZF9vZmZzZXQgPSAwOworICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfbnVtYmVyLCBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7CisgICAgdWludDY0IHRhYmxlX29mZnNldCA9IEdldFRlc3RTYW1wbGUoc2FtcGxlX251bWJlcikub2Zmc2V0OworICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworCisgICAgZm9yIChpbnQgaSA9IDE7IGkgPCAxNTsgKytpKSB7CisgICAgICBSZXNldE1hcCgpOworICAgICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHN6LCA3KTsKKyAgICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzYywgNyk7CisgICAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0Y28sIDcpOworCisgICAgICBzYW1wbGVfbnVtYmVyID0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSBpOworICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0T2Zmc2V0KHNhbXBsZV9udW1iZXIsIG1hcF9yZXBvcnRlZF9vZmZzZXQpKTsKKyAgICAgIHRhYmxlX29mZnNldCA9IEdldFRlc3RTYW1wbGUoc2FtcGxlX251bWJlcikub2Zmc2V0OworICAgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9vZmZzZXQsIHRhYmxlX29mZnNldCk7CisKKyAgICAgIHNhbXBsZV9udW1iZXItLTsKKyAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfbnVtYmVyLCBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7CisgICAgICB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLm9mZnNldDsKKyAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworCisgICAgICAvLyBub3cgaXRlcmF0ZSB0aHJvdWdoIGEgZmV3IHNhbXBsZXMgaW4gdGhlIG1pZGRsZQorICAgICAgc2FtcGxlX251bWJlciAvPSAyOworICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0MDsgaisrKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfbnVtYmVyICsgaiwgbWFwX3JlcG9ydGVkX29mZnNldCkpOworICAgICAgICB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIgKyBqKS5vZmZzZXQ7CisgICAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworICAgICAgfQorCisgICAgICAvLyBub3cgaXRlcmF0ZSBiYWNrd2FyZHMgZnJvbSB0aGUgc2FtZSBzdGFydGluZyBwb2ludAorICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCA0MDsgaisrKSB7CisgICAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfbnVtYmVyIC0gaiwgbWFwX3JlcG9ydGVkX29mZnNldCkpOworICAgICAgICB0YWJsZV9vZmZzZXQgPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIgLSBqKS5vZmZzZXQ7CisgICAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRPZmZzZXRSYW5kb21BY2Nlc3NXaXRoRGVmYXVsdFNpemUpIHsKKyAgZm9yIChpbnQgY29pbmRleCA9IDA7IGNvaW5kZXggPCAyOyArK2NvaW5kZXgpIHsKKyAgICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTA2LCAzMDAsIDIwLCAyMCwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7CisgICAgUmVzZXRNYXAoKTsKKyAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3osIDcpOworICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3RzYywgNyk7CisgICAgU2V0VGVzdFRhYmxlKGNvaW5kZXggPyBrQXRvbVR5cGVfc3RjbyA6IGtBdG9tVHlwZV9jbzY0LCA3KTsKKworICAgIC8vIENhbGN1bGF0aW5nIG9mZnNldCBvZiBhbiBvdXQtb2YtcmFuZ2Ugc2FtcGxlIHNob3VsZCBzdGlsbCByZXR1cm4gYW4KKyAgICAvLyBlcnJvci4KKyAgICB1aW50NjQgbWFwX3JlcG9ydGVkX29mZnNldCA9IDA7CisgICAgQVNTRVJUX0ZBTFNFKG1hcF8tPkdldE9mZnNldChzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSArIDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7CisKKyAgICAvLyBGaXJzdCBzYW1wbGUgaW4gZmlsZSBzaG91bGQgc3RpbGwgd29yaywgdGhvdWdoLgorICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldE9mZnNldCgwLCBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7CisgICAgdWludDY0IHRhYmxlX29mZnNldCA9IEdldFRlc3RTYW1wbGUoMCkub2Zmc2V0OworICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworCisgICAgLy8gTGFzdCBzYW1wbGUgc2hvdWxkIGFsc28gd29yay4KKyAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRPZmZzZXQoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfcmVwb3J0ZWRfb2Zmc2V0KSk7CisgICAgdGFibGVfb2Zmc2V0ID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDEpLm9mZnNldDsKKyAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX29mZnNldCwgdGFibGVfb2Zmc2V0KTsKKworICAgIC8vIFNraXAgYnkgMyB0aHJvdWdoIHRoZSBmaWxlIGEgZmV3IHRpbWVzCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgKytpKSB7CisgICAgICBpbnQgc2FtcGxlX2luZGV4ID0gKGkgKiAzKSAlIHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOworICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0T2Zmc2V0KHNhbXBsZV9pbmRleCwgbWFwX3JlcG9ydGVkX29mZnNldCkpOworICAgICAgdGFibGVfb2Zmc2V0ID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfaW5kZXgpLm9mZnNldDsKKyAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfb2Zmc2V0LCB0YWJsZV9vZmZzZXQpOworICAgIH0KKyAgfQorfQorCisvLyA9PT09IEdldER1cmF0aW9uKCkgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXREdXJhdGlvbkl0ZXJhdGlvbikgeworICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTA3LCA2MCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKKyAgUmVzZXRNYXAoKTsKKyAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHRzLCAyKTsKKworICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOyArK2kpIHsKKyAgICB1aW50MzIgbWFwX3JlcG9ydGVkX2R1cmF0aW9uID0gMDsKKyAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXREdXJhdGlvbihpLCBtYXBfcmVwb3J0ZWRfZHVyYXRpb24pKTsKKyAgICB1aW50MzIgdGFibGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKGkpLmR0c19kdXJhdGlvbjsKKyAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX2R1cmF0aW9uLCB0YWJsZV9kdXJhdGlvbik7CisgIH0KKworICAvLyBlbnRyaWVzIHBhc3QgZW5kIG9mIHRhYmxlIHNob3VsZCBmYWlsCisgIHVpbnQzMiBmYWlsZWRfZHVyYXRpb24gPSAwOworICBBU1NFUlRfRkFMU0UoCisgICAgICBtYXBfLT5HZXREdXJhdGlvbihzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSwgZmFpbGVkX2R1cmF0aW9uKSk7Cit9CisKK1RFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldER1cmF0aW9uUmFuZG9tQWNjZXNzKSB7CisgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMDgsIDYwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOworICBSZXNldE1hcCgpOworICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0dHMsIDMpOworCisgIC8vIGZpcnN0IHNhbXBsZSBpbiB0YWJsZQorICB1aW50MzIgbWFwX3JlcG9ydGVkX2R1cmF0aW9uID0gMDsKKyAgQVNTRVJUX1RSVUUobWFwXy0+R2V0RHVyYXRpb24oMCwgbWFwX3JlcG9ydGVkX2R1cmF0aW9uKSk7CisgIHVpbnQzMiB0YWJsZV9kdXJhdGlvbiA9IEdldFRlc3RTYW1wbGUoMCkuZHRzX2R1cmF0aW9uOworICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX2R1cmF0aW9uLCB0YWJsZV9kdXJhdGlvbik7CisKKyAgLy8gbGFzdCBzYW1wbGUgaW4gdGFibGUKKyAgQVNTRVJUX1RSVUUobWFwXy0+R2V0RHVyYXRpb24oc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfcmVwb3J0ZWRfZHVyYXRpb24pKTsKKyAgdGFibGVfZHVyYXRpb24gPQorICAgICAgR2V0VGVzdFNhbXBsZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDEpLmR0c19kdXJhdGlvbjsKKyAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9kdXJhdGlvbiwgdGFibGVfZHVyYXRpb24pOworCisgIC8vIHNhbXBsZSBqdXN0IHBhc3QgZW5kIHNob3VsZCBmYWlsCisgIEFTU0VSVF9GQUxTRSgKKyAgICAgIG1hcF8tPkdldER1cmF0aW9uKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpLCBtYXBfcmVwb3J0ZWRfZHVyYXRpb24pKTsKKworICAvLyBidXQgc2hvdWxkbid0IGJyZWFrIG90aGVyIHNhbXBsZSBsb29rdXBzCisgIEFTU0VSVF9UUlVFKG1hcF8tPkdldER1cmF0aW9uKDIsIG1hcF9yZXBvcnRlZF9kdXJhdGlvbikpOworICB0YWJsZV9kdXJhdGlvbiA9IEdldFRlc3RTYW1wbGUoMikuZHRzX2R1cmF0aW9uOworICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX2R1cmF0aW9uLCB0YWJsZV9kdXJhdGlvbik7CisKKyAgLy8gbm93IGl0ZXJhdGUgYmFja3dhcmRzIHRocm91Z2ggZW50aXJlIHRhYmxlIGJhY2sgdG8gZmlyc3Qgc2FtcGxlCisgIGZvciAoaW50IGkgPSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDE7IGkgPj0gMTsgaS0tKSB7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0RHVyYXRpb24oaSwgbWFwX3JlcG9ydGVkX2R1cmF0aW9uKSk7CisgICAgdGFibGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKGkpLmR0c19kdXJhdGlvbjsKKyAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX2R1cmF0aW9uLCB0YWJsZV9kdXJhdGlvbik7CisgIH0KK30KKworLy8gPT09PSBHZXRUaW1lc3RhbXAoKSBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0VGltZXN0YW1wSXRlcmF0aW9uTm9Db21wb3NpdGlvblRpbWUpIHsKKyAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDEwOSwgNjAsIDIwLCAyNSwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsIDEwLCAyMCk7CisgIFJlc2V0TWFwKCk7CisgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3R0cywgNyk7CisKKyAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgKytpKSB7CisgICAgdWludDY0IG1hcF9yZXBvcnRlZF90aW1lc3RhbXAgPSAwOworICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFRpbWVzdGFtcChpLCBtYXBfcmVwb3J0ZWRfdGltZXN0YW1wKSk7CisgICAgdWludDY0IHRhYmxlX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUoaSkuZHRzOworICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfdGltZXN0YW1wLCB0YWJsZV90aW1lc3RhbXApOworICB9CisKKyAgLy8gZW50cmllcyBwYXN0IGVuZCBvZiB0YWJsZSBzaG91bGQgZmFpbAorICB1aW50NjQgZmFpbGVkX3RpbWVzdGFtcCA9IDA7CisgIEFTU0VSVF9GQUxTRSgKKyAgICAgIG1hcF8tPkdldFRpbWVzdGFtcChzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSwgZmFpbGVkX3RpbWVzdGFtcCkpOworfQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRUaW1lc3RhbXBSYW5kb21BY2Nlc3NOb0NvbXBvc2l0aW9uVGltZSkgeworICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTEwLCA2MCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKKyAgUmVzZXRNYXAoKTsKKyAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHRzLCAxMCk7CisKKyAgLy8gc2tpcCBieSBzZXZlbnMgdGhyb3VnaCB0aGUgZmlsZSwgc2V2ZW4gdGltZXMKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsgKytpKSB7CisgICAgdWludDMyIHNhbXBsZV9udW1iZXIgPSAoaSAqIDcpICUgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7CisgICAgdWludDY0IG1hcF9yZXBvcnRlZF90aW1lc3RhbXAgPSAwOworICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFRpbWVzdGFtcChzYW1wbGVfbnVtYmVyLCBtYXBfcmVwb3J0ZWRfdGltZXN0YW1wKSk7CisgICAgdWludDY0IHRhYmxlX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUoc2FtcGxlX251bWJlcikuZHRzOworICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfdGltZXN0YW1wLCB0YWJsZV90aW1lc3RhbXApOworICB9CisKKyAgLy8gY2hlY2sgYSBmYWlsZWQgZW50cnkKKyAgdWludDY0IGZhaWxlZF90aW1lc3RhbXAgPSAwOworICBBU1NFUlRfRkFMU0UoCisgICAgICBtYXBfLT5HZXRUaW1lc3RhbXAoc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgKiAyLCBmYWlsZWRfdGltZXN0YW1wKSk7CisKKyAgLy8gc2hvdWxkIHN0aWxsIGJlIGFibGUgdG8gcmVjb3ZlciB3aXRoIHZhbGlkIGlucHV0LCB0aGlzIHRpbWUgc2tpcCBieSAyMXMKKyAgLy8gYmFja3dhcmQgdGhyb3VnaCB0aGUgZmlsZSAyMSB0aW1lcworICBmb3IgKGludCBpID0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLSAxOyBpID49IDA7IGktLSkgeworICAgIHVpbnQzMiBzYW1wbGVfbnVtYmVyID0gKGkgKiAyMSkgJSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKTsKKyAgICB1aW50NjQgbWFwX3JlcG9ydGVkX3RpbWVzdGFtcCA9IDA7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0VGltZXN0YW1wKHNhbXBsZV9udW1iZXIsIG1hcF9yZXBvcnRlZF90aW1lc3RhbXApKTsKKyAgICB1aW50NjQgdGFibGVfdGltZXN0YW1wID0gR2V0VGVzdFNhbXBsZShzYW1wbGVfbnVtYmVyKS5kdHM7CisgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF90aW1lc3RhbXAsIHRhYmxlX3RpbWVzdGFtcCk7CisgIH0KK30KKworVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0VGltZXN0YW1wSXRlcmF0aW9uKSB7CisgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMTEsIDMwMCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCAyMDsgKytpKSB7CisgICAgUmVzZXRNYXAoKTsKKyAgICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX2N0dHMsIGkpOworICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3R0cywgaSk7CisKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOyArK2opIHsKKyAgICAgIHVpbnQ2NCBtYXBfcmVwb3J0ZWRfdGltZXN0YW1wID0gMDsKKyAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldFRpbWVzdGFtcChqLCBtYXBfcmVwb3J0ZWRfdGltZXN0YW1wKSk7CisgICAgICB1aW50NjQgdGFibGVfdGltZXN0YW1wID0gR2V0VGVzdFNhbXBsZShqKS5jdHM7CisgICAgICBBU1NFUlRfRVEobWFwX3JlcG9ydGVkX3RpbWVzdGFtcCwgdGFibGVfdGltZXN0YW1wKTsKKworICAgICAgdWludDMyIG1hcF9yZXBvcnRlZF9kdXJhdGlvbiA9IDA7CisgICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXREdXJhdGlvbihqLCBtYXBfcmVwb3J0ZWRfZHVyYXRpb24pKTsKKyAgICAgIHVpbnQzMiB0YWJsZV9kdXJhdGlvbiA9IEdldFRlc3RTYW1wbGUoaikuZHRzX2R1cmF0aW9uOworICAgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF9kdXJhdGlvbiwgdGFibGVfZHVyYXRpb24pOworICAgIH0KKyAgfQorfQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRUaW1lc3RhbXBSYW5kb21BY2Nlc3MpIHsKKyAgQ3JlYXRlVGVzdFNhbXBsZVRhYmxlKDExMiwgMzAwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOworICBmb3IgKGludCBpID0gMTsgaSA8IDIwOyArK2kpIHsKKyAgICBSZXNldE1hcCgpOworICAgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfY3R0cywgaSk7CisgICAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHRzLCBpKTsKKworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMTAwOyArK2opIHsKKyAgICAgIHVpbnQzMiBzYW1wbGVfbnVtYmVyID0gcmFuZCgpICUgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7CisgICAgICB1aW50NjQgbWFwX3JlcG9ydGVkX3RpbWVzdGFtcCA9IDA7CisgICAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRUaW1lc3RhbXAoc2FtcGxlX251bWJlciwgbWFwX3JlcG9ydGVkX3RpbWVzdGFtcCkpOworICAgICAgdWludDY0IHRhYmxlX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUoc2FtcGxlX251bWJlcikuY3RzOworICAgICAgQVNTRVJUX0VRKG1hcF9yZXBvcnRlZF90aW1lc3RhbXAsIHRhYmxlX3RpbWVzdGFtcCk7CisKKyAgICAgIHVpbnQzMiBtYXBfcmVwb3J0ZWRfZHVyYXRpb24gPSAwOworICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0RHVyYXRpb24oc2FtcGxlX251bWJlciwgbWFwX3JlcG9ydGVkX2R1cmF0aW9uKSk7CisgICAgICB1aW50MzIgdGFibGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLmR0c19kdXJhdGlvbjsKKyAgICAgIEFTU0VSVF9FUShtYXBfcmVwb3J0ZWRfZHVyYXRpb24sIHRhYmxlX2R1cmF0aW9uKTsKKyAgICB9CisgIH0KK30KKworLy8gPT09PSBHZXRJc0tleWZyYW1lKCkgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gdGhlIG1hcCBzaG91bGQgY29uc2lkZXIgZXZlcnkgdmFsaWQgc2FtcGxlIG51bWJlciBhIGtleWZyYW1lIHdpdGhvdXQgYW4gc3RzcworVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0SXNLZXlmcmFtZU5vS2V5ZnJhbWVUYWJsZSkgeworICBSZXNldE1hcCgpOworICBib29sIGlzX2tleWZyYW1lX291dCA9IGZhbHNlOworICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKDEwMCwgaXNfa2V5ZnJhbWVfb3V0KSk7CisgIEFTU0VSVF9UUlVFKGlzX2tleWZyYW1lX291dCk7CisKKyAgaXNfa2V5ZnJhbWVfb3V0ID0gZmFsc2U7CisgIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoNSwgaXNfa2V5ZnJhbWVfb3V0KSk7CisgIEFTU0VSVF9UUlVFKGlzX2tleWZyYW1lX291dCk7CisKKyAgZm9yIChpbnQgaSA9IDE3OyBpIDwgMTc0OyBpICs9IDMpIHsKKyAgICBpc19rZXlmcmFtZV9vdXQgPSBmYWxzZTsKKyAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKGksIGlzX2tleWZyYW1lX291dCkpOworICAgIEFTU0VSVF9UUlVFKGlzX2tleWZyYW1lX291dCk7CisgIH0KK30KKworVEVTVF9GKFNoZWxsTVA0TWFwVGVzdCwgR2V0SXNLZXlmcmFtZUl0ZXJhdGlvbikgeworICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTEzLCAxMDAwLCAweGIwZGYwMGQsIDB4YjBkZjAwZCwgNSwgMTAsIDUsIDEwLCAxMCwgMjAsCisgICAgICAgICAgICAgICAgICAgICAgICAxMCwgMjApOworICBSZXNldE1hcCgpOworICBzYW1wbGVfdGFibGVfLT5DbGVhclJlYWRTdGF0aXN0aWNzKCk7CisgIFNldFRlc3RUYWJsZShrQXRvbVR5cGVfc3Rzcywgc2FtcGxlX3RhYmxlXy0+a2V5ZnJhbWVfY291bnQoKSAvIDIgKyA1KTsKKworICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOyArK2kpIHsKKyAgICBib29sIG1hcF9pc19rZXlmcmFtZV9vdXQgPSBmYWxzZTsKKyAgICBBU1NFUlRfVFJVRShtYXBfLT5HZXRJc0tleWZyYW1lKGksIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKKyAgICBib29sIHRhYmxlX2lzX2tleWZyYW1lID0gR2V0VGVzdFNhbXBsZShpKS5pc19rZXlfZnJhbWU7CisgICAgQVNTRVJUX0VRKG1hcF9pc19rZXlmcmFtZV9vdXQsIHRhYmxlX2lzX2tleWZyYW1lKTsKKyAgfQorfQorCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRJc0tleWZyYW1lUmFuZG9tQWNjZXNzKSB7CisgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMTQsIDEwMDAsIDB4YjBkZjAwZCwgMHhiMGRmMDBkLCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwKKyAgICAgICAgICAgICAgICAgICAgICAgIDEwLCAyMCk7CisgIFJlc2V0TWFwKCk7CisgIHNhbXBsZV90YWJsZV8tPkNsZWFyUmVhZFN0YXRpc3RpY3MoKTsKKyAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHNzLCBzYW1wbGVfdGFibGVfLT5rZXlmcmFtZV9jb3VudCgpIC8gMiArIDUpOworCisgIC8vIHBpY2sgYSBrZXlmcmFtZSBhYm91dCBoYWxmd2F5CisgIHVpbnQzMiBzYW1wbGVfbnVtYmVyID0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLyAyOworICB3aGlsZSAoIUdldFRlc3RTYW1wbGUoc2FtcGxlX251bWJlcikuaXNfa2V5X2ZyYW1lKSArK3NhbXBsZV9udW1iZXI7CisgIC8vIHNhbXBsZSBvbmUgcGFzdCBpdCBzaG91bGQgbm90IGJlIGEga2V5ZnJhbWUKKyAgYm9vbCBtYXBfaXNfa2V5ZnJhbWVfb3V0ID0gZmFsc2U7CisgIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoc2FtcGxlX251bWJlciArIDEsIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKKyAgQVNTRVJUX0ZBTFNFKG1hcF9pc19rZXlmcmFtZV9vdXQpOworICAvLyBzYW1wbGUgb25lIGJlZm9yZSBrZXlmcmFtZSBzaG91bGQgbm90IGJlIGEga2V5ZnJhbWUgZWl0aGVyCisgIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoc2FtcGxlX251bWJlciAtIDEsIG1hcF9pc19rZXlmcmFtZV9vdXQpKTsKKyAgQVNTRVJUX0ZBTFNFKG1hcF9pc19rZXlmcmFtZV9vdXQpOworICAvLyBob3dldmVyIGl0IHNob3VsZCBiZSBhIGtleWZyYW1lCisgIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoc2FtcGxlX251bWJlciwgbWFwX2lzX2tleWZyYW1lX291dCkpOworICBBU1NFUlRfVFJVRShtYXBfaXNfa2V5ZnJhbWVfb3V0KTsKKworICAvLyBmaXJzdCBrZXlmcmFtZQorICBzYW1wbGVfbnVtYmVyID0gMDsKKyAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKHNhbXBsZV9udW1iZXIpLmlzX2tleV9mcmFtZSkgKytzYW1wbGVfbnVtYmVyOworICAvLyBuZXh0IHNhbXBsZSBzaG91bGQgbm90IGJlIGEga2V5ZnJhbWUKKyAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShzYW1wbGVfbnVtYmVyICsgMSwgbWFwX2lzX2tleWZyYW1lX291dCkpOworICBBU1NFUlRfRkFMU0UobWFwX2lzX2tleWZyYW1lX291dCk7CisgIC8vIGJ1dCBpdCBzaG91bGQgYmUKKyAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShzYW1wbGVfbnVtYmVyLCBtYXBfaXNfa2V5ZnJhbWVfb3V0KSk7CisgIEFTU0VSVF9UUlVFKG1hcF9pc19rZXlmcmFtZV9vdXQpOworCisgIC8vIGl0ZXJhdGUgYmFja3dhcmRzIGZyb20gZW5kIG9mIGZpbGUgdG8gYmVnaW5uaW5nCisgIGZvciAoaW50IGkgPSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShpLCBtYXBfaXNfa2V5ZnJhbWVfb3V0KSk7CisgICAgQVNTRVJUX0VRKG1hcF9pc19rZXlmcmFtZV9vdXQsIEdldFRlc3RTYW1wbGUoaSkuaXNfa2V5X2ZyYW1lKTsKKyAgfQorCisgIC8vIGl0ZXJhdGUgYmFja3dhcmRzIHRocm91Z2gga2V5ZnJhbWVzIG9ubHkKKyAgZm9yIChpbnQgaSA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICBpZiAoR2V0VGVzdFNhbXBsZShpKS5pc19rZXlfZnJhbWUpIHsKKyAgICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldElzS2V5ZnJhbWUoaSwgbWFwX2lzX2tleWZyYW1lX291dCkpOworICAgICAgQVNTRVJUX1RSVUUobWFwX2lzX2tleWZyYW1lX291dCk7CisgICAgfQorICB9CisKKyAgLy8gaXRlcmF0ZSBmb3J3YXJkcyBidXQgc2tpcCBhbGwga2V5ZnJhbWVzCisgIGZvciAoaW50IGkgPSBzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDE7IGkgPj0gMDsgLS1pKSB7CisgICAgaWYgKCFHZXRUZXN0U2FtcGxlKGkpLmlzX2tleV9mcmFtZSkgeworICAgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShpLCBtYXBfaXNfa2V5ZnJhbWVfb3V0KSk7CisgICAgICBBU1NFUlRfRkFMU0UobWFwX2lzX2tleWZyYW1lX291dCk7CisgICAgfQorICB9CisKKyAgUmVzZXRNYXAoKTsKKyAgc2FtcGxlX3RhYmxlXy0+Q2xlYXJSZWFkU3RhdGlzdGljcygpOworICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0c3MsIDcpOworCisgIC8vIHJhbmRvbSBhY2Nlc3MKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKKyAgICBzYW1wbGVfbnVtYmVyID0gcmFuZCgpICUgc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCk7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0SXNLZXlmcmFtZShzYW1wbGVfbnVtYmVyLCBtYXBfaXNfa2V5ZnJhbWVfb3V0KSk7CisgICAgQVNTRVJUX0VRKG1hcF9pc19rZXlmcmFtZV9vdXQsIEdldFRlc3RTYW1wbGUoc2FtcGxlX251bWJlcikuaXNfa2V5X2ZyYW1lKTsKKyAgfQorfQorCisvLyA9PT09IEdldEtleWZyYW1lKCkgVGVzdHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBldmVyeSBmcmFtZSBzaG91bGQgYmUgcmV0dXJuZWQgYXMgYSBrZXlmcmFtZS4gVGhpcyB0ZXN0cyBpZiBvdXIgY29tcHV0YXRpb24KKy8vIG9mIHRpbWVzdGFtcHMgPT4gc2FtcGxlIG51bWJlcnMgaXMgZXF1aXZhbGVudCB0byBzYW1wbGUgbnVtYmVycyA9PiB0aW1lc3RhbXBzCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRLZXlmcmFtZU5vS2V5ZnJhbWVUYWJsZUl0ZXJhdGlvbikgeworICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTE1LCAzMCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKKyAgUmVzZXRNYXAoKTsKKyAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHRzLCA3KTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpOyArK2kpIHsKKyAgICAvLyBnZXQgYWN0dWFsIHRpbWVzdGFtcCBhbmQgZHVyYXRpb24gb2YgdGhpcyBzYW1wbGUKKyAgICB1aW50NjQgc2FtcGxlX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUoaSkuZHRzOworICAgIHVpbnQzMiBzYW1wbGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKGkpLmR0c19kdXJhdGlvbjsKKyAgICAvLyBhZGQgYSBiaXQgb2YgdGltZSB0byBzYW1wbGUgdGltZXN0YW1wLCBidXQga2VlcCB0aW1lIHdpdGhpbiB0aGlzIGZyYW1lCisgICAgc2FtcGxlX3RpbWVzdGFtcCArPSBpICUgc2FtcGxlX2R1cmF0aW9uOworICAgIHVpbnQzMiBtYXBfa2V5ZnJhbWUgPSAwOworICAgIEFTU0VSVF9UUlVFKG1hcF8tPkdldEtleWZyYW1lKHNhbXBsZV90aW1lc3RhbXAsIG1hcF9rZXlmcmFtZSkpOworICAgIEFTU0VSVF9FUShtYXBfa2V5ZnJhbWUsIGkpOworICB9Cit9CisKK1RFU1RfRihTaGVsbE1QNE1hcFRlc3QsIEdldEtleWZyYW1lTm9LZXlmcmFtZVRhYmxlUmFuZG9tQWNjZXNzKSB7CisgIENyZWF0ZVRlc3RTYW1wbGVUYWJsZSgxMTYsIDMwLCAyMCwgMjUsIDUsIDEwLCA1LCAxMCwgMTAsIDIwLCAxMCwgMjApOworICBSZXNldE1hcCgpOworICBTZXRUZXN0VGFibGUoa0F0b21UeXBlX3N0dHMsIDUpOworCisgIC8vIGJhY2t3YXJkcyB0aHJvdWdoIHRoZSBtaWRkbGUgdGhpcmQgb2Ygc2FtcGxlcworICBmb3IgKGludCBpID0gKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpICogMikgLyAzOworICAgICAgIGkgPj0gc2FtcGxlX3RhYmxlXy0+c2FtcGxlX2NvdW50KCkgLyAzOyAtLWkpIHsKKyAgICB1aW50NjQgc2FtcGxlX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUoaSkuZHRzOworICAgIHVpbnQzMiBzYW1wbGVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKGkpLmR0c19kdXJhdGlvbjsKKyAgICBzYW1wbGVfdGltZXN0YW1wICs9IHNhbXBsZV9kdXJhdGlvbiAtIDEgLSAoaSAlIHNhbXBsZV9kdXJhdGlvbik7CisgICAgdWludDMyIG1hcF9rZXlmcmFtZSA9IDA7CisgICAgQVNTRVJUX1RSVUUobWFwXy0+R2V0S2V5ZnJhbWUoc2FtcGxlX3RpbWVzdGFtcCwgbWFwX2tleWZyYW1lKSk7CisgICAgQVNTRVJUX0VRKG1hcF9rZXlmcmFtZSwgaSk7CisgIH0KKworICAvLyBoaWdoZXN0IHZhbGlkIHRpbWVzdGFtcCBpbiBmaWxlCisgIHVpbnQ2NCBoaWdoZXN0X3RpbWVzdGFtcCA9CisgICAgICBHZXRUZXN0U2FtcGxlKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMSkuZHRzOworICBoaWdoZXN0X3RpbWVzdGFtcCArPQorICAgICAgR2V0VGVzdFNhbXBsZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDEpLmR0c19kdXJhdGlvbiAtIDE7CisgIHVpbnQzMiBtYXBfa2V5ZnJhbWUgPSAwOworICBBU1NFUlRfVFJVRShtYXBfLT5HZXRLZXlmcmFtZShoaWdoZXN0X3RpbWVzdGFtcCwgbWFwX2tleWZyYW1lKSk7CisgIEFTU0VSVF9FUShtYXBfa2V5ZnJhbWUsIHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMSk7CisKKyAgLy8gbG93ZXN0IHZhbGlkIHRpbWVzdGFtcCBpbiBmaWxlCisgIEFTU0VSVF9UUlVFKG1hcF8tPkdldEtleWZyYW1lKDAsIG1hcF9rZXlmcmFtZSkpOworICBBU1NFUlRfRVEobWFwX2tleWZyYW1lLCAwKTsKKworICAvLyBzaG91bGQgZmFpbCBvbiBoaWdoZXIgdGltZXN0YW1wcworICBBU1NFUlRfRkFMU0UobWFwXy0+R2V0S2V5ZnJhbWUoaGlnaGVzdF90aW1lc3RhbXAgKyAxLCBtYXBfa2V5ZnJhbWUpKTsKK30KKworLy8gR2V0S2V5ZnJhbWUgaXMgbm90IG5vcm1hbGx5IGNhbGxlZCBpdGVyYXRpdmVseSwgc28gd2UgdGVzdCByYW5kb20gYWNjZXNzCitURVNUX0YoU2hlbGxNUDRNYXBUZXN0LCBHZXRLZXlmcmFtZSkgeworICBDcmVhdGVUZXN0U2FtcGxlVGFibGUoMTE3LCA2MCwgMjAsIDI1LCA1LCAxMCwgNSwgMTAsIDEwLCAyMCwgMTAsIDIwKTsKKyAgUmVzZXRNYXAoKTsKKyAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHNzLCAzKTsKKyAgU2V0VGVzdFRhYmxlKGtBdG9tVHlwZV9zdHRzLCA3KTsKKworICAvLyBmaW5kIGZpcnN0IGtleWZyYW1lIGluIGZpbGUsIHNob3VsZCBiZSBmaXJzdCBmcmFtZQorICB1aW50MzIgbWFwX2tleWZyYW1lID0gMDsKKyAgQVNTRVJUX1RSVUUobWFwXy0+R2V0S2V5ZnJhbWUoMCwgbWFwX2tleWZyYW1lKSk7CisgIEFTU0VSVF9FUShtYXBfa2V5ZnJhbWUsIDApOworCisgIC8vIGZpbmQgYSBmaXJzdCBxdWFydGVyIGtleWZyYW1lIGluIGZpbGUKKyAgdWludDMyIHF0cl9rZXlmcmFtZSA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC8gNDsKKyAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKHF0cl9rZXlmcmFtZSkuaXNfa2V5X2ZyYW1lKSArK3F0cl9rZXlmcmFtZTsKKyAgdWludDMyIG5leHRfa2V5ZnJhbWUgPSBxdHJfa2V5ZnJhbWUgKyAxOworICB3aGlsZSAoIUdldFRlc3RTYW1wbGUobmV4dF9rZXlmcmFtZSkuaXNfa2V5X2ZyYW1lKSArK25leHRfa2V5ZnJhbWU7CisgIHVpbnQzMiBwcmV2X2tleWZyYW1lID0gcXRyX2tleWZyYW1lIC0gMTsKKyAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKHByZXZfa2V5ZnJhbWUpLmlzX2tleV9mcmFtZSkgLS1wcmV2X2tleWZyYW1lOworICB1aW50MzIgbGFzdF9rZXlmcmFtZSA9IHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMTsKKyAgd2hpbGUgKCFHZXRUZXN0U2FtcGxlKGxhc3Rfa2V5ZnJhbWUpLmlzX2tleV9mcmFtZSkgLS1sYXN0X2tleWZyYW1lOworICAvLyBtaWR3YXkgYmV0d2VlbiB0aGlzIGtleWZyYW1lIGFuZCB0aGUgbmV4dCBvbmUKKyAgdWludDMyIHRlc3RfZnJhbWUgPSBxdHJfa2V5ZnJhbWUgKyAoKG5leHRfa2V5ZnJhbWUgLSBxdHJfa2V5ZnJhbWUpIC8gMik7CisgIC8vIGdldCB0aW1lIGZvciB0aGlzIGZyYW1lCisgIHVpbnQ2NCB0ZXN0X2ZyYW1lX3RpbWVzdGFtcCA9IEdldFRlc3RTYW1wbGUodGVzdF9mcmFtZSkuZHRzOworICAvLyBnZXQgZHVyYXRpb24gZm9yIHRoaXMgZnJhbWUKKyAgdWludDMyIHRlc3RfZnJhbWVfZHVyYXRpb24gPSBHZXRUZXN0U2FtcGxlKHRlc3RfZnJhbWUpLmR0c19kdXJhdGlvbjsKKyAgLy8gbWlkd2F5IHRocm91Z2ggdGhpcyBmcmFtZQorICB0ZXN0X2ZyYW1lX3RpbWVzdGFtcCArPSB0ZXN0X2ZyYW1lX2R1cmF0aW9uIC8gMjsKKyAgLy8gZmluZCBsb3dlciBib3VuZCBrZXlmcmFtZSwgc2hvdWxkIGJlIHF0cl9rZXlmcmFtZQorICBBU1NFUlRfVFJVRShtYXBfLT5HZXRLZXlmcmFtZSh0ZXN0X2ZyYW1lX3RpbWVzdGFtcCwgbWFwX2tleWZyYW1lKSk7CisgIEFTU0VSVF9FUShtYXBfa2V5ZnJhbWUsIHF0cl9rZXlmcmFtZSk7CisKKyAgLy8gdGltZXN0YW1wIG9uZSB0aWNrIGJlZm9yZSBxdHJfa2V5ZnJhbWUgc2hvdWxkIGZpbmQgcHJldmlvdXMga2V5ZnJhbWUKKyAgdGVzdF9mcmFtZV90aW1lc3RhbXAgPSBHZXRUZXN0U2FtcGxlKHF0cl9rZXlmcmFtZSkuZHRzIC0gMTsKKyAgQVNTRVJUX1RSVUUobWFwXy0+R2V0S2V5ZnJhbWUodGVzdF9mcmFtZV90aW1lc3RhbXAsIG1hcF9rZXlmcmFtZSkpOworICBBU1NFUlRfRVEobWFwX2tleWZyYW1lLCBwcmV2X2tleWZyYW1lKTsKKworICAvLyB2ZXJ5IGhpZ2hlc3QgdGltZXN0YW1wIGluIGZpbGUgc2hvdWxkIHJldHVybiBsYXN0IGtleWZyYW1lCisgIHVpbnQ2NCBoaWdoZXN0X3RpbWVzdGFtcCA9CisgICAgICBHZXRUZXN0U2FtcGxlKHNhbXBsZV90YWJsZV8tPnNhbXBsZV9jb3VudCgpIC0gMSkuZHRzOworICBoaWdoZXN0X3RpbWVzdGFtcCArPQorICAgICAgR2V0VGVzdFNhbXBsZShzYW1wbGVfdGFibGVfLT5zYW1wbGVfY291bnQoKSAtIDEpLmR0c19kdXJhdGlvbiAtIDE7CisgIEFTU0VSVF9UUlVFKG1hcF8tPkdldEtleWZyYW1lKGhpZ2hlc3RfdGltZXN0YW1wLCBtYXBfa2V5ZnJhbWUpKTsKKyAgQVNTRVJUX0VRKG1hcF9rZXlmcmFtZSwgbGFzdF9rZXlmcmFtZSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X3BhcnNlci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43MGEzNTY0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuY2MKQEAgLTAsMCArMSw2NjIgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmgiCisKKyNpbmNsdWRlIDxpbnR0eXBlcy5oPgorI2luY2x1ZGUgPGxpbWl0cz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2VuZGlhbl91dGlsLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2VzX2Rlc2NyaXB0b3IuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gaG93IG1hbnkgYnl0ZXMgdG8gc2tpcCB3aXRoaW4gYW4gYXZjMSBiZWZvcmUgdGhlIGNvbmZpZyBhdG9tcyBzdGFydD8KK3N0YXRpYyBjb25zdCBpbnQga1NraXBCeXRlc19hdmMxID0gNzg7CisKKy8vIHdoYXQncyB0aGUgc21hbGxlc3QgbWVhbmluZ2Z1bCBtcDQgYXRvbSBzaXplPworc3RhdGljIGNvbnN0IGludCBrQXRvbU1pblNpemUgPSA4OworCisvLyBGdWxsIEJveCBoYXMgYSBvbmUgYnl0ZSB2ZXJzaW9uIGFuZCB0aHJlZSBieXRlcyBmbGFncyBhZnRlciB0aGUgaGVhZGVyCitzdGF0aWMgY29uc3QgaW50IGtGdWxsQm94SGVhZGVyQW5kRmxhZ1NpemUgPSA0OworCisvLyBob3cgbXVjaCB0byBkb3dubG9hZCBvZiBhbiBoZGxyIHRvIGdldCB0aGUgdHJhayB0eXBlPworc3RhdGljIGNvbnN0IGludCBrRGVzaXJlZEJ5dGVzX2hkbHIgPSAxMjsKK3N0YXRpYyBjb25zdCB1aW50MzIga0F1ZGlvU3VidHlwZV9oZGxyX3NvdW4gPSAweDczNmY3NTZlOworc3RhdGljIGNvbnN0IHVpbnQzMiBrVmlkZW9TdWJ0eXBlX2hkbHJfdmlkZSA9IDB4NzY2OTY0NjU7CisKKy8vIGhvdyBtdWNoIHRvIGRvd25sb2FkIG9mIGFuIG1wNGEgdG8gZGV0ZXJtaW5lIHZlcnNpb24gbnVtYmVyPworc3RhdGljIGNvbnN0IGludCBrRGVzaXJlZEJ5dGVzX21wNGEgPSAyOworLy8gaG93IGJpZyBpcyB0aGUgbXA0YSBhdG9tIGJlZm9yZSBvcHRpb25hbCBleHRlbnNpb24gYXRvbXM/CitzdGF0aWMgY29uc3QgaW50IGtUb3RhbFNpemVfbXA0YV92MCA9IDI4Oworc3RhdGljIGNvbnN0IGludCBrVG90YWxTaXplX21wNGFfdjEgPSA0NDsKK3N0YXRpYyBjb25zdCBpbnQga1RvdGFsU2l6ZV9tcDRhX3YyID0gNjQ7CisKKy8vIGhvdyBtYW55IGJ5dGVzIHNob3VsZCB3ZSBkb3dubG9hZCBmcm9tIGFuIG1kaGQ/CitzdGF0aWMgY29uc3QgaW50IGtEZXNpcmVkQnl0ZXNfbWRoZCA9IDIwOworCisvLyBob3cgbWFueSBieXRlcyBzaG91bGQgd2UgZG93bmxvYWQgZnJvbSBhbiBtdmhkPworc3RhdGljIGNvbnN0IGludCBrRGVzaXJlZEJ5dGVzX212aGQgPSAyMDsKKworLy8gaG93IG1hbnkgYnl0ZXMgdG8gc2tpcCB3aXRoaW4gYW4gc3RzZCBiZWZvcmUgdGhlIGNvbmZpZyBhdG9tcyBzdGFydD8KK3N0YXRpYyBjb25zdCBpbnQga1NraXBCeXRlc19zdHNkID0gODsKKworLy8gdXNlIGF2ZXJhZ2UgdmFsdWVzIG9mIG1wNCBtZXRhZGF0YSB0YWJsZXMgcGx1cyAyIHN0YW5kYXJkIGRldmlhdGlvbnMgdG8KKy8vIGhvbGQgbW9zdCBtZXRhZGF0YSBhdG9tcyBlbnRpcmVseSBpbiBtZW1vcnkuCitzdGF0aWMgY29uc3QgaW50IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RzeiA9IDI2MDU5MSAvIGtFbnRyeVNpemVfc3RzejsKK3N0YXRpYyBjb25zdCBpbnQga01hcFRhYmxlQXRvbUNhY2hlRW50cmllc19zdGNvID0gMjI4NTkgLyBrRW50cnlTaXplX3N0Y287CitzdGF0aWMgY29uc3QgaW50IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RzcyA9IDM3ODYgLyBrRW50cnlTaXplX3N0c3M7CitzdGF0aWMgY29uc3QgaW50IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3R0cyA9IDE2NDkxNSAvIGtFbnRyeVNpemVfc3R0czsKK3N0YXRpYyBjb25zdCBpbnQga01hcFRhYmxlQXRvbUNhY2hlRW50cmllc19zdHNjID0gMzIxOTkgLyBrRW50cnlTaXplX3N0c2M7CitzdGF0aWMgY29uc3QgaW50IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfY282NCA9IDc0MDIxMiAvIGtFbnRyeVNpemVfY282NDsKK3N0YXRpYyBjb25zdCBpbnQga01hcFRhYmxlQXRvbUNhY2hlRW50cmllc19jdHRzID0gNTE1NDMgLyBrRW50cnlTaXplX2N0dHM7CisKKy8vIHN0YXRpYworUGlwZWxpbmVTdGF0dXMgU2hlbGxNUDRQYXJzZXI6OkNvbnN0cnVjdCgKKyAgICBzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyLAorICAgIGNvbnN0IHVpbnQ4KiBjb25zdHJ1Y3Rpb25faGVhZGVyLCBzY29wZWRfcmVmcHRyPFNoZWxsUGFyc2VyPiogcGFyc2VyLAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2cpIHsKKyAgRENIRUNLKHBhcnNlcik7CisgIERDSEVDSyhtZWRpYV9sb2cpOworICAqcGFyc2VyID0gTlVMTDsKKworICAvLyBkZXRlY3QgbXA0IHN0cmVhbSBieSBsb29raW5nIGZvciBmdHlwIGF0b20gYXQgdG9wIG9mIGZpbGUKKyAgdWludDMyIGZ0eXAgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihjb25zdHJ1Y3Rpb25faGVhZGVyICsgNCk7CisgIGlmIChmdHlwICE9IGtBdG9tVHlwZV9mdHlwKSB7CisgICAgLy8gbm90IGFuIG1wNAorICAgIHJldHVybiBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRTsKKyAgfQorCisgIC8vIGZpcnN0IDQgYnl0ZXMgd2lsbCBiZSB0aGUgc2l6ZSBvZiB0aGUgZnR5cCBhdG9tCisgIHVpbnQzMiBmdHlwX2F0b21fc2l6ZSA9CisgICAgICBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihjb25zdHJ1Y3Rpb25faGVhZGVyKTsKKyAgaWYgKGZ0eXBfYXRvbV9zaXplIDwga0F0b21NaW5TaXplKSB7CisgICAgcmV0dXJuIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX1BBUlNFOworICB9CisKKyAgLy8gY29uc3RydWN0IG5ldyBtcDQgcGFyc2VyCisgICpwYXJzZXIgPSBuZXcgU2hlbGxNUDRQYXJzZXIocmVhZGVyLCBmdHlwX2F0b21fc2l6ZSwgbWVkaWFfbG9nKTsKKyAgcmV0dXJuIFBJUEVMSU5FX09LOworfQorCitTaGVsbE1QNFBhcnNlcjo6U2hlbGxNUDRQYXJzZXIoc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgZnR5cF9hdG9tX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZykKKyAgICA6IFNoZWxsQVZDUGFyc2VyKHJlYWRlciwgbWVkaWFfbG9nKSwKKyAgICAgIGF0b21fb2Zmc2V0XyhmdHlwX2F0b21fc2l6ZSksICAvLyBzdGFydCBhdCBuZXh0IGF0b20sIHNraXBwaW5nIG92ZXIgZnR5cAorICAgICAgY3VycmVudF90cmFrX2lzX3ZpZGVvXyhmYWxzZSksCisgICAgICBjdXJyZW50X3RyYWtfaXNfYXVkaW9fKGZhbHNlKSwKKyAgICAgIGN1cnJlbnRfdHJha190aW1lX3NjYWxlXygwKSwKKyAgICAgIHZpZGVvX3RpbWVfc2NhbGVfaHpfKDApLAorICAgICAgYXVkaW9fdGltZV9zY2FsZV9oel8oMCksCisgICAgICBhdWRpb19tYXBfKG5ldyBTaGVsbE1QNE1hcChyZWFkZXIpKSwKKyAgICAgIHZpZGVvX21hcF8obmV3IFNoZWxsTVA0TWFwKHJlYWRlcikpLAorICAgICAgYXVkaW9fc2FtcGxlXygwKSwKKyAgICAgIHZpZGVvX3NhbXBsZV8oMCksCisgICAgICBmaXJzdF9hdWRpb19ob2xlX3RpY2tzXygwKSwKKyAgICAgIGZpcnN0X2F1ZGlvX2hvbGVfKGJhc2U6OlRpbWVEZWx0YTo6RnJvbVNlY29uZHMoMCkpIHt9CisKK1NoZWxsTVA0UGFyc2VyOjp+U2hlbGxNUDRQYXJzZXIoKSB7fQorCisvLyBGb3IgTVA0IHdlIHRyYXZlcnNlIHRoZSBmaWxlJ3MgYXRvbSBzdHJ1Y3R1cmUgYXR0ZW1wdGluZyB0byBmaW5kIHRoZSBhdWRpbworLy8gYW5kIHZpZGVvIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24gYW5kIHRoZSBsb2NhdGlvbnMgaW4gdGhlIGZpbGUgb2YgdGhlCisvLyB2YXJpb3VzIHN0Ymwgc3ViYXRvbXMgd2hpY2ggZGV0YWlsIHRoZSBwb3NpdGlvbiBvZiB0aGUgYXVkaW8gYW5kIHZpZGVvCisvLyBOQUxVcyBpbiB0aGUgZmlsZS4gQXMgc29tZSBvZiB0aGUgc3RibCBzdWJhdG9tcyBjYW4gYmUgcXVpdGUgbGFyZ2Ugd2UgY2FjaGUKKy8vIGEgZml4ZWQgbWF4aW11bSBxdWFudGl0eSBvZiBlYWNoIHN0Ymwgc3ViYXRvbSBhbmQgdXBkYXRlIHRoZSBjYWNoZSBvbmx5IG9uCisvLyBtaXNzLgorYm9vbCBTaGVsbE1QNFBhcnNlcjo6UGFyc2VDb25maWcoKSB7CisgIHdoaWxlICghSXNDb25maWdDb21wbGV0ZSgpIHx8ICFhdWRpb19tYXBfLT5Jc0NvbXBsZXRlKCkgfHwKKyAgICAgICAgICF2aWRlb19tYXBfLT5Jc0NvbXBsZXRlKCkpIHsKKyAgICBpZiAoIVBhcnNlTmV4dEF0b20oKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBTaGVsbE1QNFBhcnNlcjo6R2V0TmV4dEFVKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgeworICB1aW50MzIgc2l6ZSA9IDA7CisgIHVpbnQzMiBkdXJhdGlvbl90aWNrcyA9IDA7CisgIHVpbnQ2NCB0aW1lc3RhbXBfdGlja3MgPSAwOworICB1aW50NjQgb2Zmc2V0ID0gMDsKKyAgYm9vbCBpc19rZXlmcmFtZSA9IGZhbHNlOworICBiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wOworICBiYXNlOjpUaW1lRGVsdGEgZHVyYXRpb247CisgIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKSB7CisgICAgaWYgKGF1ZGlvX3RpbWVfc2NhbGVfaHpfID09IDApIHsKKyAgICAgIERMT0coRVJST1IpIDw8ICJ8YXVkaW9fdGltZV9zY2FsZV9oel98IGNhbm5vdCBiZSAwLiI7CisgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgaWYgKCFhdWRpb19tYXBfLT5HZXRTaXplKGF1ZGlvX3NhbXBsZV8sICZzaXplKSB8fAorICAgICAgICAhYXVkaW9fbWFwXy0+R2V0T2Zmc2V0KGF1ZGlvX3NhbXBsZV8sICZvZmZzZXQpIHx8CisgICAgICAgICFhdWRpb19tYXBfLT5HZXREdXJhdGlvbihhdWRpb19zYW1wbGVfLCAmZHVyYXRpb25fdGlja3MpIHx8CisgICAgICAgICFhdWRpb19tYXBfLT5HZXRUaW1lc3RhbXAoYXVkaW9fc2FtcGxlXywgJnRpbWVzdGFtcF90aWNrcykpIHsKKyAgICAgIC8vIGRldGVybWluZSBpZiBFT1Mgb3IgZXJyb3IKKyAgICAgIGlmIChhdWRpb19tYXBfLT5Jc0VPUyhhdWRpb19zYW1wbGVfKSkgeworICAgICAgICByZXR1cm4gU2hlbGxBVTo6Q3JlYXRlRW5kT2ZTdHJlYW1BVShEZW11eGVyU3RyZWFtOjpBVURJTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXVkaW9fdHJhY2tfZHVyYXRpb25fKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERMT0coRVJST1IpIDw8ICJwYXJzZWQgYmFkIGF1ZGlvIEFVIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICAgIC8vIGFsbCBhYWMgZnJhbWVzIGFyZSByYW5kb20tYWNjZXNzLCBzbyBhbGwgYXJlIGtleWZyYW1lcworICAgIGlzX2tleWZyYW1lID0gdHJ1ZTsKKyAgICBhdWRpb19zYW1wbGVfKys7CisgICAgdGltZXN0YW1wID0gVGlja3NUb1RpbWUodGltZXN0YW1wX3RpY2tzLCBhdWRpb190aW1lX3NjYWxlX2h6Xyk7CisgICAgZHVyYXRpb24gPSBUaWNrc1RvVGltZShkdXJhdGlvbl90aWNrcywgYXVkaW9fdGltZV9zY2FsZV9oel8pOworCisgICAgLy8gSXQgd291bGQgYmUgdmVyeSB1bnVzdWFsIHRvIGVuY291bnRlciBub24tY29udGlndW91cyBhdWRpbworICAgIC8vIGluIGFuIG1wNCwgYnV0IHlvdSBuZXZlciBrbm93LiBNYWtlIHN1cmUgdGhpcyB0aW1lc3RhbXAgaXMKKyAgICAvLyBjb250aWd1b3VzIGluIHRpY2tzIGZyb20gdGhlIGxhc3Qgb25lCisgICAgaWYgKGZpcnN0X2F1ZGlvX2hvbGVfdGlja3NfID09IHRpbWVzdGFtcF90aWNrcykgeworICAgICAgLy8gTXVjaCBvZiB0aGUgYXVkaW8gc3RhY2sgYXNzdW1lcyB0aGF0IGF1ZGlvIHRpbWVzdGFtcHMgYXJlCisgICAgICAvLyBjb250aWd1b3VzLiBXaGlsZSB0aGUgdGltZXN0YW1wcyBjb21pbmcgb3V0IG9mIHRoZSBtYXAgYXJlCisgICAgICAvLyBub3JtYWxseSBjb250aW51b3VzLCB0aGV5IGFyZSBvbiBhIGRpZmZlcmVudCB0aW1lIHNjYWxlLiBEdWUKKyAgICAgIC8vIHRvIHJvdW5kb2ZmIGVycm9yIGluIGNvbnZlcnNpb24gdGhlIHRpbWVzdGFtcHMgcHJvZHVjZWQgbWF5CisgICAgICAvLyBiZSBkaXNjb250aW51b3VzLiBUbyBjb3JyZWN0IHRoaXMgd2UgY29ycmVjdCB0aGUgdGltZXN0YW1wCisgICAgICAvLyB0byB0aGUgb25lIHRoZSBzeXN0ZW0gaXMgZXhwZWN0aW5nIGZvciBjb250aW51aXR5LCB0aGVuIG1vZGlmeQorICAgICAgLy8gdGhlIGR1cmF0aW9uIGJ5IHRoZSBuZWdhdGl2ZSBvZiB0aGF0IHNhbWUgKHNtYWxsKSB2YWx1ZSwKKyAgICAgIC8vIHNvIGFzIHRvIG5vdCBhY2N1bXVsYXRlIHJvdW5kb2ZmIGVycm9yIG92ZXIgdGltZS4KKyAgICAgIGJhc2U6OlRpbWVEZWx0YSB0aW1lX2RpZmZlcmVuY2UgPSB0aW1lc3RhbXAgLSBmaXJzdF9hdWRpb19ob2xlXzsKKyAgICAgIHRpbWVzdGFtcCA9IGZpcnN0X2F1ZGlvX2hvbGVfOworICAgICAgZHVyYXRpb24gKz0gdGltZV9kaWZmZXJlbmNlOworICAgICAgZmlyc3RfYXVkaW9faG9sZV8gPSB0aW1lc3RhbXAgKyBkdXJhdGlvbjsKKyAgICAgIGZpcnN0X2F1ZGlvX2hvbGVfdGlja3NfICs9IGR1cmF0aW9uX3RpY2tzOworICAgIH0gZWxzZSB7CisgICAgICBETE9HKFdBUk5JTkcpIDw8ICJwYXJzZWQgbm9uLWNvbnRpZ3VvdXMgbXA0IGF1ZGlvIHRpbWVzdGFtcCI7CisgICAgICAvLyByZXNldCBob2xlIHRyYWNraW5nIHBhc3QgZ2FwCisgICAgICBmaXJzdF9hdWRpb19ob2xlX3RpY2tzXyA9IHRpbWVzdGFtcF90aWNrcyArIGR1cmF0aW9uX3RpY2tzOworICAgICAgZmlyc3RfYXVkaW9faG9sZV8gPSB0aW1lc3RhbXAgKyBkdXJhdGlvbjsKKyAgICB9CisgIH0gZWxzZSBpZiAodHlwZSA9PSBEZW11eGVyU3RyZWFtOjpWSURFTykgeworICAgIGlmICh2aWRlb190aW1lX3NjYWxlX2h6XyA9PSAwKSB7CisgICAgICBETE9HKEVSUk9SKSA8PCAifHZpZGVvX3RpbWVfc2NhbGVfaHpffCBjYW5ub3QgYmUgMC4iOworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICghdmlkZW9fbWFwXy0+R2V0U2l6ZSh2aWRlb19zYW1wbGVfLCAmc2l6ZSkgfHwKKyAgICAgICAgIXZpZGVvX21hcF8tPkdldE9mZnNldCh2aWRlb19zYW1wbGVfLCAmb2Zmc2V0KSB8fAorICAgICAgICAhdmlkZW9fbWFwXy0+R2V0RHVyYXRpb24odmlkZW9fc2FtcGxlXywgJmR1cmF0aW9uX3RpY2tzKSB8fAorICAgICAgICAhdmlkZW9fbWFwXy0+R2V0VGltZXN0YW1wKHZpZGVvX3NhbXBsZV8sICZ0aW1lc3RhbXBfdGlja3MpIHx8CisgICAgICAgICF2aWRlb19tYXBfLT5HZXRJc0tleWZyYW1lKHZpZGVvX3NhbXBsZV8sICZpc19rZXlmcmFtZSkpIHsKKyAgICAgIGlmICh2aWRlb19tYXBfLT5Jc0VPUyh2aWRlb19zYW1wbGVfKSkgeworICAgICAgICByZXR1cm4gU2hlbGxBVTo6Q3JlYXRlRW5kT2ZTdHJlYW1BVShEZW11eGVyU3RyZWFtOjpWSURFTywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlkZW9fdHJhY2tfZHVyYXRpb25fKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIERMT0coRVJST1IpIDw8ICJwYXJzZWQgYmFkIHZpZGVvIEFVIjsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICAgIHZpZGVvX3NhbXBsZV8rKzsKKyAgICB0aW1lc3RhbXAgPSBUaWNrc1RvVGltZSh0aW1lc3RhbXBfdGlja3MsIHZpZGVvX3RpbWVfc2NhbGVfaHpfKTsKKyAgICBkdXJhdGlvbiA9IFRpY2tzVG9UaW1lKGR1cmF0aW9uX3RpY2tzLCB2aWRlb190aW1lX3NjYWxlX2h6Xyk7CisgICAgLy8gZHVlIHRvIGItZnJhbWVzIGl0J3MgbXVjaCBtb3JlIGxpa2VseSB3ZSdsbCBlbmNvdW50ZXIgZGlzY29udGludW91cworICAgIC8vIHZpZGVvIGJ1ZmZlcnMuIEFzIGEgcmVzdWx0IHdlIGFkZCBhIHNtYWxsIGR1cmF0aW9uIHRvIGVhY2ggdmlkZW8KKyAgICAvLyBidWZmZXIsIGVxdWFsIGluIHZhbHVlIHRvIG9uZSBmdWxsIHRpY2sgYXQgdGhlIHZpZGVvIHRpbWVzY2FsZS4gVGhlCisgICAgLy8gc2hvd2luZyBvZiB2aWRlbyBmcmFtZXMgaXMgYWN0dWFsbHkga2V5ZWQgb24gdGhlIGF1ZGlvIGNsb2NrLCBzbyB0aGlzCisgICAgLy8gc2hvdWxkbid0IGNyZWF0ZSB0b28gbXVjaCBqaXR0ZXIgaW4gdGhlIG91dHB1dC4KKyAgICBkdXJhdGlvbiArPSBvbmVfdmlkZW9fdGlja187CisgIH0gZWxzZSB7CisgICAgTk9UUkVBQ0hFRCgpIDw8ICJ1bnN1cHBvcnRlZCBzdHJlYW0gdHlwZSI7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBzaXplX3QgcHJlcGVuZF9zaXplID0gQ2FsY3VsYXRlUHJlcGVuZFNpemUodHlwZSwgaXNfa2V5ZnJhbWUpOworCisgIGlmICh0eXBlID09IERlbXV4ZXJTdHJlYW06OkFVRElPKQorICAgIHJldHVybiBTaGVsbEFVOjpDcmVhdGVBdWRpb0FVKG9mZnNldCwgc2l6ZSwgcHJlcGVuZF9zaXplLCBpc19rZXlmcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lc3RhbXAsIGR1cmF0aW9uLCB0aGlzKTsKKyAgcmV0dXJuIFNoZWxsQVU6OkNyZWF0ZVZpZGVvQVUob2Zmc2V0LCBzaXplLCBwcmVwZW5kX3NpemUsIG5hbF9oZWFkZXJfc2l6ZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2tleWZyYW1lLCB0aW1lc3RhbXAsIGR1cmF0aW9uLCB0aGlzKTsKK30KKworYm9vbCBTaGVsbE1QNFBhcnNlcjo6U2Vla1RvKGJhc2U6OlRpbWVEZWx0YSB0aW1lc3RhbXApIHsKKyAgaWYgKGF1ZGlvX3RpbWVfc2NhbGVfaHpfID09IDAgfHwgdmlkZW9fdGltZV9zY2FsZV9oel8gPT0gMCkgeworICAgIERMT0dfSUYoRVJST1IsIGF1ZGlvX3RpbWVfc2NhbGVfaHpfID09IDApCisgICAgICAgIDw8ICJ8YXVkaW9fdGltZV9zY2FsZV9oel98IGNhbm5vdCBiZSAwLiI7CisgICAgRExPR19JRihFUlJPUiwgdmlkZW9fdGltZV9zY2FsZV9oel8gPT0gMCkKKyAgICAgICAgPDwgInx2aWRlb190aW1lX3NjYWxlX2h6X3wgY2Fubm90IGJlIDAuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBnZXQgdmlkZW8gdGltZXN0YW1wIGluIHZpZGVvIHRpbWUgdW5pdHMKKyAgdWludDY0IHZpZGVvX3RpY2tzID0gVGltZVRvVGlja3ModGltZXN0YW1wLCB2aWRlb190aW1lX3NjYWxlX2h6Xyk7CisgIC8vIGZpbmQgbmVhcmVzdCBrZXlmcmFtZSBmcm9tIG1hcCwgbWFrZSBpdCBvdXIgbmV4dCB2aWRlbyBzYW1wbGUKKyAgaWYgKCF2aWRlb19tYXBfLT5HZXRLZXlmcmFtZSh2aWRlb190aWNrcywgJnZpZGVvX3NhbXBsZV8pKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIGdldCB0aGUgdGltZXN0YW1wIGZvciB0aGlzIHZpZGVvIGtleWZyYW1lCisgIHVpbnQ2NCB2aWRlb19rZXlmcmFtZV90aW1lX3RpY2tzID0gMDsKKyAgaWYgKCF2aWRlb19tYXBfLT5HZXRUaW1lc3RhbXAodmlkZW9fc2FtcGxlXywgJnZpZGVvX2tleWZyYW1lX3RpbWVfdGlja3MpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGJhc2U6OlRpbWVEZWx0YSB2aWRlb19rZXlmcmFtZV90aW1lID0KKyAgICAgIFRpY2tzVG9UaW1lKHZpZGVvX2tleWZyYW1lX3RpbWVfdGlja3MsIHZpZGVvX3RpbWVfc2NhbGVfaHpfKTsKKyAgLy8gZmluZCB0aGUgY2xvc2VzdCBhdWRpbyBmcmFtZSB0aGF0IGJvdW5kcyB0aGF0IHRpbWVzdGFtcAorICB1aW50NjQgYXVkaW9fdGlja3MgPSBUaW1lVG9UaWNrcyh2aWRlb19rZXlmcmFtZV90aW1lLCBhdWRpb190aW1lX3NjYWxlX2h6Xyk7CisgIGlmICghYXVkaW9fbWFwXy0+R2V0S2V5ZnJhbWUoYXVkaW9fdGlja3MsICZhdWRpb19zYW1wbGVfKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBETE9HKElORk8pIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICJzZWVraW5nIHRvIHRpbWVzdGFtcDogJSIgUFJJZDY0ICIsIHZpZGVvIHNhbXBsZTogJWQsIGF1ZGlvIHNhbXBsZTogJWQiLAorICAgICAgdGltZXN0YW1wLkluTWlsbGlzZWNvbmRzKCksIHZpZGVvX3NhbXBsZV8sIGF1ZGlvX3NhbXBsZV8pOworICAvLyBjaGVhdCBvdXIgYnVmZmVyIGNvbnRpbnVpdHkgc3lzdGVtCisgIGlmICghYXVkaW9fbWFwXy0+R2V0VGltZXN0YW1wKGF1ZGlvX3NhbXBsZV8sICZmaXJzdF9hdWRpb19ob2xlX3RpY2tzXykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZmlyc3RfYXVkaW9faG9sZV8gPQorICAgICAgVGlja3NUb1RpbWUoZmlyc3RfYXVkaW9faG9sZV90aWNrc18sIGF1ZGlvX3RpbWVfc2NhbGVfaHpfKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHBhcnNlIHRoZSBhdG9tIHN0YXJ0aW5nIGF0IGF0b21fb2Zmc2V0XywgdXBkYXRlIGFwcHJvcHJpYXRlIGludGVybmFsIHN0YXRlLAorLy8gcmV0dXJuIGZhbHNlIG9uIGZhdGFsIGVycm9yLiBHZW5lcmFsIHN0cnVjdHVyZSBvZiBhbiBNUDQgYXRvbSBpczoKKy8vIGZpZWxkICAgICAgICAgICAgIHwgdHlwZSAgIHwgY29tbWVudAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKy0tLS0tLS0tLQorLy8gYXRvbSBzaXplICAgICAgICAgfCB1aW50MzIgfCBpZiAwIG1lYW5zICJyZXN0IG9mIGZpbGUiLCBpZiAxIG1lYW5zIGV4dGVuZGVkCisvLyBmb3VyQ0MgY29kZSAgICAgICB8IEFTQ0lJICB8IGZvdXItYnl0ZSBBU0NJSSBjb2RlIHdlIHRyZWF0IGFzIHVpbnQzMgorLy8gZXh0ZW5kZWQgc2l6ZSAgICAgfCB1aW50NjQgfCBvcHRpb25hbCBzaXplIGZpZWxkLCBvbmx5IGhlcmUgaWYgYXRvbSBzaXplIGlzIDEKKy8vIDwtLS0gcmVzdCBvZiBhdG9tIGJvZHkgc3RhcnRzIGhlcmUKK2Jvb2wgU2hlbGxNUDRQYXJzZXI6OlBhcnNlTmV4dEF0b20oKSB7CisgIHVpbnQ4IGF0b21ba0F0b21Eb3dubG9hZF07CisgIGludCBieXRlc19yZWFkID0gcmVhZGVyXy0+QmxvY2tpbmdSZWFkKGF0b21fb2Zmc2V0Xywga0F0b21Eb3dubG9hZCwgYXRvbSk7CisgIGlmIChieXRlc19yZWFkIDwga0F0b21Eb3dubG9hZCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBmaXJzdCA0IGJ5dGVzIGFyZSBzaXplIG9mIGF0b20gdWludDMyCisgIHVpbnQ2NCBhdG9tX3NpemUgPQorICAgICAgc3RhdGljX2Nhc3Q8dWludDY0PihlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihhdG9tKSk7CisgIC8vIG5vcm1hbGx5IGF0b20gYm9keSBzdGFydHMganVzdCBwYXN0IGZvdXJDQyBjb2RlCisgIHVpbnQzMiBhdG9tX2JvZHkgPSBrQXRvbU1pblNpemU7CisgIC8vIGlmIDEgd2UgbmVlZCB0byBsb2FkIHRoZSBleHRlbmRlZCBzaXplIHdoaWNoIHdpbGwgYmUgYXBwZW5kZWQganVzdCBwYXN0CisgIC8vIHRoZSBmb3VyQ0MgY29kZQorICBpZiAoYXRvbV9zaXplID09IDEpIHsKKyAgICBhdG9tX3NpemUgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50NjRfYmlnX2VuZGlhbihhdG9tICsgOCk7CisgICAgLy8gYWR2YW5jZSBhdG9tX2JvZHkgcGFzdCB0aGUgOCBieXRlcyBvZiBzaXplIHdlIGp1c3QgcGFyc2VkCisgICAgYXRvbV9ib2R5ICs9IDg7CisgIH0gZWxzZSBpZiAoYXRvbV9zaXplID09IDApIHsKKyAgICAvLyBjYWxjdWxhdGUgc2l6ZSBvZiB0aGlzIGF0b20gZnJvbSByZW1haW5kZXIgb2YgZmlsZQorICAgIERDSEVDS19MRShhdG9tX29mZnNldF8sCisgICAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oc3RkOjpudW1lcmljX2xpbWl0czxpbnQ2ND46Om1heCgpKSk7CisgICAgaWYgKHJlYWRlcl8tPkZpbGVTaXplKCkgPiBzdGF0aWNfY2FzdDxpbnQ2ND4oYXRvbV9vZmZzZXRfKSkgeworICAgICAgYXRvbV9zaXplID0gcmVhZGVyXy0+RmlsZVNpemUoKSAtIGF0b21fb2Zmc2V0XzsKKyAgICB9CisgIH0KKyAgLy8gYXRvbSBzaXplcyBhbHNvIGluY2x1ZGUgdGhlIHNpemUgb2YgdGhlIHN0YXJ0IG9mIHRoZSBhdG9tLCBzbyBzYW5pdHktY2hlY2sKKyAgLy8gdGhlIHNpemUgd2UganVzdCBwYXJzZWQgYWdhaW5zdCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHdlIG5lZWRlZCB0byBwYXJzZSBpdAorICBpZiAoYXRvbV9zaXplIDwgYXRvbV9ib2R5KSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoImF0b20gc2l6ZTogJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsZXNzIHRoYW4gbWluIGJvZHkgc2l6ZSAlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbV9zaXplLCBhdG9tX2JvZHkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIGV4dHJhY3QgZm91ckNDIGNvZGUgYXMgYmlnLWVuZGlhbiB1aW50MzIKKyAgdWludDMyIGZvdXJfY2MgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihhdG9tICsgNCk7CisgIERMT0coSU5GTykgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKCJmb3VyX2NjOiAlYyVjJWMlYyIsIGF0b21bNF0sIGF0b21bNV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21bNl0sIGF0b21bN10pOworCisgIC8vIGFkdmFuY2UgcmVhZCBwb2ludGVyIHRvIGF0b20gYm9keQorICBhdG9tX29mZnNldF8gKz0gYXRvbV9ib2R5OworICAvLyBhZGp1c3Qgc2l6ZSBvZiBib2R5IG9mIGF0b20gZnJvbSBzaXplIG9mIGhlYWRlcgorICB1aW50NjQgYXRvbV9kYXRhX3NpemUgPSBhdG9tX3NpemUgLSBhdG9tX2JvZHk7CisKKyAgYm9vbCBhdG9tX3BhcnNlX3N1Y2Nlc3MgPSB0cnVlOworCisgIC8vIFdlIHVzZSA5NSUgY2VydGFpbnR5IGludGVydmFscyBmb3IgdmlkZW8gbWV0YWRhdGEgYXRvbSBzaXplcy4gVGhlIG1hcAorICAvLyBpcyB3cml0dGVuIHRvIGhhbmRsZSBsYXJnZXIgYXRvbSBzaXplcyBidXQgaGF2aW5nIHRvIHJlY2FjaGUgbWV0YWRhdGEKKyAgLy8gaW5jcmVhc2VzIGxhdGVuY2llcyBvbiB0aGluZ3MgbGlrZSBzZWVrcy4KKyAgaW50IG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSAwOworCisgIC8vIG5vdyB0YWtlIGFwcHJvcHJpYXRlIGFjdGlvbiBiYXNlZCBvbiBhdG9tIHR5cGUKKyAgc3dpdGNoIChmb3VyX2NjKSB7CisgICAgLy8gYXZjMSBhdG9tcyBhcmUgY29udGFpbmVkIHdpdGhpbiBzdHNkIGF0b21zIGFuZCBjYXJyeSB0aGVpciBvd24KKyAgICAvLyBjb25maWd1cmF0aW9uIGJhZ2dhZ2UgbG9hZCwgd2hpY2ggd2Ugc2tpcCBvdmVyIGFuZCBwYXJzZSB0aGUgYXRvbXMKKyAgICAvLyB3aXRoaW4sIG5vcm1hbGx5IGFuIGF2Y0MgYXRvbS4KKyAgICBjYXNlIGtBdG9tVHlwZV9hdmMxOgorICAgICAgYXRvbV9vZmZzZXRfICs9IGtTa2lwQnl0ZXNfYXZjMTsKKyAgICAgIGJyZWFrOworCisgICAgLy8gYXZjQyBhdG9tcyBjb250YWluIHRoZSBBVkNDb25maWdSZWNvcmQsIG91ciB2aWRlbyBjb25maWd1cmF0aW9uIGluZm8KKyAgICBjYXNlIGtBdG9tVHlwZV9hdmNDOgorICAgICAgYXRvbV9wYXJzZV9zdWNjZXNzID0KKyAgICAgICAgICBEb3dubG9hZEFuZFBhcnNlQVZDQ29uZmlnUmVjb3JkKGF0b21fb2Zmc2V0XywgYXRvbV9kYXRhX3NpemUpOworICAgICAgaWYgKGF0b21fcGFyc2Vfc3VjY2VzcykgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOworICAgICAgYnJlYWs7CisKKyAgICAvLyBlc2RzIGF0b21zIGNvbnRhaW4gYWN0dWFsbHkgdXNhYmxlIGF1ZGlvIGNvbmZpZ3VyYXRpb24gaW5mbyBmb3IgQUFDLgorICAgIGNhc2Uga0F0b21UeXBlX2VzZHM6CisgICAgICByZXR1cm4gUGFyc2VNUDRfZXNkcyhhdG9tX2RhdGFfc2l6ZSk7CisKKyAgICAvLyBjYW4gdGVsbCB1cyBpZiBtZGlhIGFuZCBtZGhkIGF0b21zIHJlbGF0ZSB0byBhdWRpbyBvciB2aWRlbyBtZXRhZGF0YQorICAgIGNhc2Uga0F0b21UeXBlX2hkbHI6CisgICAgICByZXR1cm4gUGFyc2VNUDRfaGRscihhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7CisKKyAgICAvLyBwcm92aWRlcyBhIGR1cmF0aW9uIGFuZCBhIHRpbWVzY2FsZSB1bmlxdWUgdG8gYSBnaXZlbiB0cmFjaworICAgIGNhc2Uga0F0b21UeXBlX21kaGQ6CisgICAgICByZXR1cm4gUGFyc2VNUDRfbWRoZChhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7CisKKyAgICAvLyBtcDRhIGF0b21zIGNvbnRhaW4gYXVkaW8gY29uZmlndXJhdGlvbiBpbmZvLCBidXQgd2Ugb25seSB3YW50IHRvIGtub3cKKyAgICAvLyB3aGljaCB2ZXJzaW9uIGl0IGlzIHNvIHdlIGNhbiBza2lwIHRvIHRoZSBlc2RzLCB3aGljaCB3ZSBtdXN0IGJlIHByZXNlbnQKKyAgICAvLyB3aGVuIHVzaW5nIEFBQworICAgIGNhc2Uga0F0b21UeXBlX21wNGE6CisgICAgICByZXR1cm4gUGFyc2VNUDRfbXA0YShhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7CisKKyAgICAvLyBtb3ZpZSBoZWFkZXIgYXRvbSBjb250YWlucyB0cmFjayBkdXJhdGlvbiBhbmQgdGltZSB1bml0IHNjYWxlLCB3ZSB0cnVzdAorICAgIC8vIHRoZXNlIGRhdGEgYXMgdGhlIGF1dGhvcml0YXRpdmUgZHVyYXRpb24gZGF0YSBmb3IgdGhlIG1wNAorICAgIGNhc2Uga0F0b21UeXBlX212aGQ6CisgICAgICByZXR1cm4gUGFyc2VNUDRfbXZoZChhdG9tX2RhdGFfc2l6ZSwgYXRvbSArIGF0b21fYm9keSk7CisKKyAgICAvLyBzdHNkIGF0b21zIG1heSBjb250YWluIGF2YzEgYXRvbXMsIHdoaWNoIHRoZW1zZWx2ZXMgbWF5IGNvbnRhaW4gYXZjQworICAgIC8vIGF0b21zLCB3aGljaCBjb250YWluIGFjdHVhbGx5IHVzYWJsZSBjb25maWd1cmF0aW9uIGluZm9ybWF0aW9uLiBza2lwIHRvCisgICAgLy8gc3ViYXRvbS4KKyAgICBjYXNlIGtBdG9tVHlwZV9zdHNkOgorICAgICAgYXRvbV9vZmZzZXRfICs9IGtTa2lwQnl0ZXNfc3RzZDsKKyAgICAgIGJyZWFrOworCisgICAgLy8gV2UncmUgdmVyeSBtdWNoIGludGVyZXN0ZWQgaW4gdGhlIGNvbnRlbnRzIG9mIHRoZSB0cmFrIGNvbnRhaW5lciBhdG9tLAorICAgIC8vIGJsb3cgYXdheSBzdGF0ZSB0aGF0IHdlIG1heSBoYXZlIGJlZW4ga2VlcGluZyBhYm91dCBhbnkgcHJpb3IgdHJhaworICAgIC8vIGF0b21zIHdlJ3ZlIHBhcnNlZC4KKyAgICBjYXNlIGtBdG9tVHlwZV90cmFrOgorICAgICAgY3VycmVudF90cmFrX2lzX3ZpZGVvXyA9IGZhbHNlOworICAgICAgY3VycmVudF90cmFrX2lzX2F1ZGlvXyA9IGZhbHNlOworICAgICAgYnJlYWs7CisKKyAgICAvLyBpZiBvbmUgb2YgdGhlIHN0Ymwgc3ViYXRvbXMgYWRkIGl0IHRvIHRoZSBhcHByb3ByaWF0ZSBhdWRpbyBvciB2aWRlbyBtYXAKKyAgICAvLyBhbmQgdGhlbiBhZHZhbmNlIHBhc3QgaXQuCisgICAgY2FzZSBrQXRvbVR5cGVfY282NDoKKyAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX2NvNjQ7CisgICAgICBicmVhazsKKworICAgIGNhc2Uga0F0b21UeXBlX2N0dHM6CisgICAgICBtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzID0ga01hcFRhYmxlQXRvbUNhY2hlRW50cmllc19jdHRzOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9zdGNvOgorICAgICAgbWFwX3RhYmxlX2F0b21fY2FjaGVfZW50cmllcyA9IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RjbzsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBrQXRvbVR5cGVfc3R0czoKKyAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX3N0dHM7CisgICAgICBicmVhazsKKworICAgIGNhc2Uga0F0b21UeXBlX3N0c2M6CisgICAgICBtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzID0ga01hcFRhYmxlQXRvbUNhY2hlRW50cmllc19zdHNjOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIGtBdG9tVHlwZV9zdHNzOgorICAgICAgbWFwX3RhYmxlX2F0b21fY2FjaGVfZW50cmllcyA9IGtNYXBUYWJsZUF0b21DYWNoZUVudHJpZXNfc3RzczsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBrQXRvbVR5cGVfc3RzejoKKyAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMgPSBrTWFwVGFibGVBdG9tQ2FjaGVFbnRyaWVzX3N0c3o7CisgICAgICBicmVhazsKKworICAgIC8vIHRoZXNlIGFyZSBjb250YWluZXIgYXRvbXMsIHNvIHdlIGRvbnQgd2FudCB0byBhZHZhbmNlIHBhc3QgdGhlIGhlYWRlcgorICAgIC8vIGFzIHdlIGFyZSBpbnRlcmVzdGVkIGluIHRoZWlyIGNvbnRlbnRzLiBQYXJzaW5nIHRoZW0gaXMgdHJpdmlhbAorICAgIC8vIGFzIGFsbCB0aGV5IGFyZSBpcyBhIHNpemUgaGVhZGVyIGFuZCBhIGZvdXJDQyB0eXBlIHRhZywgd2hpY2ggd2UndmUKKyAgICAvLyBhbHJlYWR5IHBhcnNlZCBhbmQgYWR2YW5jZWQgcGFzdC4KKyAgICBjYXNlIGtBdG9tVHlwZV9tZGlhOgorICAgIGNhc2Uga0F0b21UeXBlX21pbmY6CisgICAgY2FzZSBrQXRvbVR5cGVfbW9vdjoKKyAgICBjYXNlIGtBdG9tVHlwZV9zdGJsOgorICAgICAgLy8gbm8tb3AKKyAgICAgIGJyZWFrOworCisgICAgLy8ga25vd24gYXRvbSB0eXBlcyB0aGF0IHdlIHdpc2ggdG8ganVzdCBza2lwIHBhc3QgdGhlIGJvZHkgd2l0aG91dCB3YXJuaW5nCisgICAgY2FzZSBrQXRvbVR5cGVfZGluZjoKKyAgICBjYXNlIGtBdG9tVHlwZV9kcmVmOgorICAgIGNhc2Uga0F0b21UeXBlX3NtaGQ6CisgICAgY2FzZSBrQXRvbVR5cGVfdGtoZDoKKyAgICBjYXNlIGtBdG9tVHlwZV92bWhkOgorICAgICAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOworICAgICAgYnJlYWs7CisKKyAgICAvLyBwYXJzZSBmdW5jdGlvbnMgYXJlIGFzc3VtZWQgdG8gYWR2YW5jZSByZWFkX3Bvc2l0aW9uXyB0aGVtc2VsdmVzLAorICAgIC8vIGFzIHdlIGFyZSBmbGF0dGVuaW5nIGEgdHJlZSBvZiBhdG9tcyBzbyB0aGF0IHRoZSBhdG9tX3NpemUgd2UgcGFyc2VkCisgICAgLy8gdGhpcyB0aW1lLCBpZiBpdCdzIGEgY29udGFpbmVyLCBtYXkgbm90IGhhdmUgYmVlbiBlbnRpcmVseSBjb25zdW1lZAorICAgIC8vIGluIHRoaXMgc2luZ2xlIGNhbGwuIEhvd2V2ZXIgZm9yIHVuc3VwcG9ydGVkIGF0b21zIHdlIGp1c3Qgc2tpcCB0aGVtCisgICAgLy8gZW50aXJlbHksIG1lYW5pbmcgd2Ugd2lsbCBza2lwIHRoZWlyIGNvbnRlbnRzIHRvby4KKyAgICBkZWZhdWx0OgorICAgICAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOworICAgICAgRExPRyhJTkZPKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoCisgICAgICAgICAgInNraXBwaW5nIHVuc3VwcG9ydGVkIE1QNCBhdG9tOiAlYyVjJWMlYyIsIGF0b21bNF0sIGF0b21bNV0sIGF0b21bNl0sCisgICAgICAgICAgYXRvbVs3XSk7CisgICAgICBicmVhazsKKyAgfQorCisgIGlmIChtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzID4gMCkgeworICAgIGlmIChjdXJyZW50X3RyYWtfaXNfdmlkZW9fKSB7CisgICAgICBhdG9tX3BhcnNlX3N1Y2Nlc3MgPQorICAgICAgICAgIHZpZGVvX21hcF8tPlNldEF0b20oZm91cl9jYywgYXRvbV9vZmZzZXRfLCBhdG9tX2RhdGFfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF90YWJsZV9hdG9tX2NhY2hlX2VudHJpZXMsIGF0b20gKyBhdG9tX2JvZHkpOworICAgIH0gZWxzZSBpZiAoY3VycmVudF90cmFrX2lzX2F1ZGlvXykgeworICAgICAgYXRvbV9wYXJzZV9zdWNjZXNzID0KKyAgICAgICAgICBhdWRpb19tYXBfLT5TZXRBdG9tKGZvdXJfY2MsIGF0b21fb2Zmc2V0XywgYXRvbV9kYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfdGFibGVfYXRvbV9jYWNoZV9lbnRyaWVzLCBhdG9tICsgYXRvbV9ib2R5KTsKKyAgICB9CisgICAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOworICB9CisKKyAgaWYgKCFhdG9tX3BhcnNlX3N1Y2Nlc3MpIHsKKyAgICBETE9HKEVSUk9SKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoIlVuYWJsZSB0byBwYXJzZSBNUDQgYXRvbTogJWMlYyVjJWMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG9tWzRdLCBhdG9tWzVdLCBhdG9tWzZdLCBhdG9tWzddKTsKKyAgfQorCisgIHJldHVybiBhdG9tX3BhcnNlX3N1Y2Nlc3M7Cit9CisKK2Jvb2wgU2hlbGxNUDRQYXJzZXI6OlBhcnNlTVA0X2VzZHModWludDY0IGF0b21fZGF0YV9zaXplKSB7CisgIGlmIChhdG9tX2RhdGFfc2l6ZSA8IGtGdWxsQm94SGVhZGVyQW5kRmxhZ1NpemUpIHsKKyAgICBETE9HKFdBUk5JTkcpIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigKKyAgICAgICAgImVzZHMgYm94IHNob3VsZCBhdCBsZWFzdCBiZSAlZCBieXRlcyBidXQgbm93IGl0IGlzICUiIFBSSWQ2NCAiIGJ5dGVzIiwKKyAgICAgICAga0Z1bGxCb3hIZWFkZXJBbmRGbGFnU2l6ZSwgYXRvbV9kYXRhX3NpemUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHVpbnQ2NCBlc2RzX29mZnNldCA9IGF0b21fb2Zmc2V0XyArIGtGdWxsQm94SGVhZGVyQW5kRmxhZ1NpemU7CisgIHVpbnQ2NCBlc2RzX3NpemUgPSBhdG9tX2RhdGFfc2l6ZSAtIGtGdWxsQm94SGVhZGVyQW5kRmxhZ1NpemU7CisKKyAgaWYgKGVzZHNfc2l6ZSA9PSAwKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIHdlJ2xsIG5lZWQgdG8gZG93bmxvYWQgZW50aXJlIGVzZHMsIGFsbG9jYXRlIGJ1ZmZlciBmb3IgaXQKKyAgc3RkOjp2ZWN0b3I8dWludDg+IGVzZHNfc3RvcmFnZShlc2RzX3NpemUpOworICB1aW50OCogZXNkcyA9ICZlc2RzX3N0b3JhZ2VbMF07CisgIC8vIGRvd25sb2FkIGVzZHMKKyAgaW50IGJ5dGVzX3JlYWQgPSByZWFkZXJfLT5CbG9ja2luZ1JlYWQoZXNkc19vZmZzZXQsIGVzZHNfc2l6ZSwgZXNkcyk7CisgIGlmIChieXRlc19yZWFkIDwgZXNkc19zaXplKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAiZmFpbGVkIHRvIGRvd25sb2FkIGVzZHMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBtcDQ6OkVTRGVzY3JpcHRvciBlc19kZXNjcmlwdG9yOworICBzdGQ6OnZlY3Rvcjx1aW50OD4gZGF0YShlc2RzLCBlc2RzICsgZXNkc19zaXplKTsKKyAgaWYgKGVzX2Rlc2NyaXB0b3IuUGFyc2UoZGF0YSkpIHsKKyAgICBjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OD4mIGRzaSA9IGVzX2Rlc2NyaXB0b3IuZGVjb2Rlcl9zcGVjaWZpY19pbmZvKCk7CisgICAgaWYgKGRzaS5zaXplKCkgPj0gMikgeworICAgICAgUGFyc2VBdWRpb1NwZWNpZmljQ29uZmlnKGRzaVswXSwgZHNpWzFdKTsKKyAgICAgIGF0b21fb2Zmc2V0XyArPSBhdG9tX2RhdGFfc2l6ZTsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBETE9HKFdBUk5JTkcpIDw8ICJlc2RzIGF1ZGlvIHNwZWNpZmljIGNvbmZpZyBzaG9ydGVyIHRoYW4gMiBieXRlcyI7CisgIH0gZWxzZSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAiZXJyb3IgaW4gcGFyc2UgZXNkcyBib3giOworICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIFNoZWxsTVA0UGFyc2VyOjpQYXJzZU1QNF9oZGxyKHVpbnQ2NCBhdG9tX2RhdGFfc2l6ZSwgdWludDgqIGhkbHIpIHsKKyAgLy8gZW5zdXJlIHdlJ3JlIGRvd25sb2FkaW5nIGVub3VnaCBvZiB0aGUgaGRsciB0byBwYXJzZQorICBEQ0hFQ0tfTEUoa0Rlc2lyZWRCeXRlc19oZGxyICsgMTYsIGtBdG9tRG93bmxvYWQpOworICAvLyBzYW5pdHktY2hlY2sgZm9yIG1pbmltdW0gc2l6ZQorICBpZiAoYXRvbV9kYXRhX3NpemUgPCBrRGVzaXJlZEJ5dGVzX2hkbHIpIHsKKyAgICBETE9HKFdBUk5JTkcpIDw8IGJhc2U6OlN0cmluZ1ByaW50ZigiYmFkIHNpemUgJSIgUFJJZDY0ICIgb24gaGRsciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXRvbV9kYXRhX3NpemUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBsYXN0IDQgYnl0ZXMgb2YgdGhlIDEyIHdlIG5lZWQgYXJlIGFuIGFzY2lpIGNvZGUgZm9yIHRoZSB0cmFrIHR5cGUsIHdlCisgIC8vIHdhbnQgJ3ZpZGUnIGZvciB2aWRlbyBvciAnc291bicgZm9yIGF1ZGlvLiBpZ25vcmUgdGhlIHJlc3QuCisgIHVpbnQzMiBoZGxyX3N1YnR5cGUgPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihoZGxyICsgOCk7CisgIC8vIHVwZGF0ZSBzdGF0ZSBmbGFncworICBjdXJyZW50X3RyYWtfaXNfdmlkZW9fID0gKGhkbHJfc3VidHlwZSA9PSBrVmlkZW9TdWJ0eXBlX2hkbHJfdmlkZSk7CisgIGN1cnJlbnRfdHJha19pc19hdWRpb18gPSAoaGRscl9zdWJ0eXBlID09IGtBdWRpb1N1YnR5cGVfaGRscl9zb3VuKTsKKyAgLy8gc2F2ZSBhIHRpbWUgc2NhbGUgaWYgcGVuZGluZworICBpZiAoY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID4gMCAmJiBjdXJyZW50X3RyYWtfaXNfdmlkZW9fKSB7CisgICAgdmlkZW9fdGltZV9zY2FsZV9oel8gPSBjdXJyZW50X3RyYWtfdGltZV9zY2FsZV87CisgICAgY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID0gMDsKKyAgICB2aWRlb190cmFja19kdXJhdGlvbl8gPSBjdXJyZW50X3RyYWtfZHVyYXRpb25fOworICAgIG9uZV92aWRlb190aWNrXyA9CisgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMDAwMDAwIC8gdmlkZW9fdGltZV9zY2FsZV9oel8pOworICB9CisgIGlmIChjdXJyZW50X3RyYWtfdGltZV9zY2FsZV8gPiAwICYmIGN1cnJlbnRfdHJha19pc19hdWRpb18pIHsKKyAgICBhdWRpb190aW1lX3NjYWxlX2h6XyA9IGN1cnJlbnRfdHJha190aW1lX3NjYWxlXzsKKyAgICBjdXJyZW50X3RyYWtfdGltZV9zY2FsZV8gPSAwOworICAgIGF1ZGlvX3RyYWNrX2R1cmF0aW9uXyA9IGN1cnJlbnRfdHJha19kdXJhdGlvbl87CisgIH0KKyAgLy8gc2tpcCByZXN0IG9mIGF0b20KKyAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGVsbE1QNFBhcnNlcjo6UGFyc2VNUDRfbWRoZCh1aW50NjQgYXRvbV9kYXRhX3NpemUsIHVpbnQ4KiBtZGhkKSB7CisgIERDSEVDS19MRShrRGVzaXJlZEJ5dGVzX21kaGQgKyAxNiwga0F0b21Eb3dubG9hZCk7CisgIGlmIChhdG9tX2RhdGFfc2l6ZSA8IGtEZXNpcmVkQnl0ZXNfbWRoZCkgeworICAgIERMT0coV0FSTklORykgPDwgYmFzZTo6U3RyaW5nUHJpbnRmKCJiYWQgc2l6ZSAlIiBQUklkNjQgIiBvbiBtZGhkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdG9tX2RhdGFfc2l6ZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVpbnQzMiB0aW1lX3NjYWxlID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4obWRoZCArIDEyKTsKKyAgaWYgKHRpbWVfc2NhbGUgPT0gMCkgeworICAgIERMT0coV0FSTklORykgPDwgImdvdCAwIHRpbWUgc2NhbGUgZm9yIG12aGQiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAvLyBkb3VibGUtY2hlY2sgdHJhY2sgZHVyYXRpb24sIGl0IG1heSBiZSBkaWZmZXJlbnQgZnJvbSB0aGUgbW92aWUgZHVyYXRpb24KKyAgdWludDMyIHRyYWNrX2R1cmF0aW9uX3RpY2tzID0gZW5kaWFuX3V0aWw6OmxvYWRfdWludDMyX2JpZ19lbmRpYW4obWRoZCArIDE2KTsKKyAgYmFzZTo6VGltZURlbHRhIHRyYWNrX2R1cmF0aW9uID0KKyAgICAgIFRpY2tzVG9UaW1lKHRyYWNrX2R1cmF0aW9uX3RpY2tzLCB0aW1lX3NjYWxlKTsKKyAgaWYgKHRyYWNrX2R1cmF0aW9uID4gZHVyYXRpb25fKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoIm1kaGQgaGFzIGxvbmdlciBkdXJhdGlvbjogJSIgUFJJZDY0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBtcyB0aGFuIG9sZCB2YWx1ZTogJSIgUFJJZDY0ICIgbXMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFja19kdXJhdGlvbi5Jbk1pY3Jvc2Vjb25kcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uXy5Jbk1pY3Jvc2Vjb25kcygpKTsKKyAgICBkdXJhdGlvbl8gPSB0cmFja19kdXJhdGlvbjsKKyAgfQorICBpZiAoY3VycmVudF90cmFrX2lzX3ZpZGVvXykgeworICAgIHZpZGVvX3RpbWVfc2NhbGVfaHpfID0gdGltZV9zY2FsZTsKKyAgICBjdXJyZW50X3RyYWtfdGltZV9zY2FsZV8gPSAwOworICAgIHZpZGVvX3RyYWNrX2R1cmF0aW9uXyA9IHRyYWNrX2R1cmF0aW9uOworICAgIG9uZV92aWRlb190aWNrXyA9CisgICAgICAgIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcygxMDAwMDAwIC8gdmlkZW9fdGltZV9zY2FsZV9oel8pOworICB9IGVsc2UgaWYgKGN1cnJlbnRfdHJha19pc19hdWRpb18pIHsKKyAgICBhdWRpb190aW1lX3NjYWxlX2h6XyA9IHRpbWVfc2NhbGU7CisgICAgY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID0gMDsKKyAgICBhdWRpb190cmFja19kdXJhdGlvbl8gPSB0cmFja19kdXJhdGlvbjsKKyAgfSBlbHNlIHsKKyAgICAvLyBpdCdzIHBvc3NpYmxlIHdlIHdpbGwgZW5jb3VudGVyIHRoZSBtZGhkIGJlZm9yZSB3ZSBlbmNvdW50ZXIgdGhlIGhkbHIsCisgICAgLy8gaW4gdGhhdCBldmVudCB3ZSBzYXZlIHRoZSB0aW1lIHNjYWxlIHZhbHVlIHVudGlsIHdlIGtub3cuCisgICAgY3VycmVudF90cmFrX3RpbWVfc2NhbGVfID0gdGltZV9zY2FsZTsKKyAgICBjdXJyZW50X3RyYWtfZHVyYXRpb25fID0gdHJhY2tfZHVyYXRpb247CisgIH0KKyAgYXRvbV9vZmZzZXRfICs9IGF0b21fZGF0YV9zaXplOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBTaGVsbE1QNFBhcnNlcjo6UGFyc2VNUDRfbXA0YSh1aW50NjQgYXRvbV9kYXRhX3NpemUsIHVpbnQ4KiBtcDRhKSB7CisgIERDSEVDS19MRShrRGVzaXJlZEJ5dGVzX21wNGEgKyAxNiwga0F0b21Eb3dubG9hZCk7CisgIC8vIHdlIG9ubHkgbmVlZCB0aGUgZmlyc3QgdHdvIGJ5dGVzIG9mIHRoZSBoZWFkZXIsIHdoaWNoIGRldGFpbHMgdGhlIHZlcnNpb24KKyAgLy8gbnVtYmVyIG9mIHRoaXMgYXRvbSwgd2hpY2ggdGVsbHMgdXMgdGhlIHNpemUgb2YgdGhlIHJlc3Qgb2YgdGhlIGhlYWRlciwKKyAgLy8gdGVsbGluZyB1cyBob3cgbXVjaCB3ZSBzaG91bGQgc2tpcCB0byBnZXQgdG8gdGhlIGV4dGVuc2lvbiBjb250ZW50cy4KKyAgaWYgKGF0b21fZGF0YV9zaXplIDwga0Rlc2lyZWRCeXRlc19tcDRhKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoImJhZCBzaXplICUiIFBSSWQ2NCAiIG9uIG1wNGEiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21fZGF0YV9zaXplKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdWludDE2IG1wNGFfdmVyc2lvbiA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQxNl9iaWdfZW5kaWFuKG1wNGEpOworICBzd2l0Y2ggKG1wNGFfdmVyc2lvbikgeworICAgIGNhc2UgMDoKKyAgICAgIGF0b21fb2Zmc2V0XyArPSBrVG90YWxTaXplX21wNGFfdjA7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgMToKKyAgICAgIGF0b21fb2Zmc2V0XyArPSBrVG90YWxTaXplX21wNGFfdjE7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGNhc2UgMjoKKyAgICAgIGF0b21fb2Zmc2V0XyArPSBrVG90YWxTaXplX21wNGFfdjI7CisgICAgICByZXR1cm4gdHJ1ZTsKKworICAgIGRlZmF1bHQ6CisgICAgICAvLyB1bmtub3duIG1wNGEgYXRvbSB2ZXJzaW9uLCBwYXJzZSBmYWlsdXJlCisgICAgICBETE9HKEVSUk9SKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoInBhcnNlZCBiYWQgbXA0YSB2ZXJzaW9uICVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtcDRhX3ZlcnNpb24pOworICAgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKKy8vIHBhcnRpYWwgbGF5b3V0IG9mIG12aGQgaGVhZGVyIGlzOgorLy8gb2Zmc2V0IHwgbmFtZSAgICAgICAgICAgICAgfCBzaXplIGluIGJ5dGVzCisvLyAtLS0tLS0tKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0tLS0tLS0tCisvLyAwICAgICAgfCB2ZXJzaW9uICAgICAgICAgICB8IDEgKGlnbm9yZWQpCisvLyAxICAgICAgfCBmbGFncyAgICAgICAgICAgICB8IDMgKGlnbm9yZWQpCisvLyA0ICAgICAgfCBjcmVhdGlvbiB0aW1lICAgICB8IDQgKGlnbm9yZWQpCisvLyA4ICAgICAgfCBtb2RpZmljYXRpb24gdGltZSB8IDQgKGlnbm9yZWQpCisvLyAxMiAgICAgfCB0aW1lIHNjYWxlICAgICAgICB8IDQKKy8vIDE2ICAgICB8IGR1cmF0aW9uOiAgICAgICAgIHwgNAorLy8KK2Jvb2wgU2hlbGxNUDRQYXJzZXI6OlBhcnNlTVA0X212aGQodWludDY0IGF0b21fZGF0YV9zaXplLCB1aW50OCogbXZoZCkgeworICBEQ0hFQ0tfTEUoa0Rlc2lyZWRCeXRlc19tdmhkICsgMTYsIGtBdG9tRG93bmxvYWQpOworICAvLyBpdCBzaG91bGQgYmUgYXQgbGVhc3QgbG9uZyBlbm91Z2ggZm9yIHVzIHRvIGV4dHJhY3QgdGhlIHBhcnRzIHdlIHdhbnQKKyAgaWYgKGF0b21fZGF0YV9zaXplIDwga0Rlc2lyZWRCeXRlc19tdmhkKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCBiYXNlOjpTdHJpbmdQcmludGYoImJhZCBzaXplICUiIFBSSWQ2NCAiIG9uIG12aGQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF0b21fZGF0YV9zaXplKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdWludDMyIHRpbWVfc2NhbGVfaHogPSBlbmRpYW5fdXRpbDo6bG9hZF91aW50MzJfYmlnX2VuZGlhbihtdmhkICsgMTIpOworICBpZiAodGltZV9zY2FsZV9oeiA9PSAwKSB7CisgICAgRExPRyhXQVJOSU5HKSA8PCAiZ290IDAgdGltZSBzY2FsZSBmb3IgbXZoZCI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIGR1cmF0aW9uIGlzIGluIHVuaXRzIG9mIHRoZSB0aW1lIHNjYWxlIHdlIGp1c3QgZXh0cmFjdGVkCisgIHVpbnQ2NCBkdXJhdGlvbl90aWNrcyA9IGVuZGlhbl91dGlsOjpsb2FkX3VpbnQzMl9iaWdfZW5kaWFuKG12aGQgKyAxNik7CisgIC8vIGNhbGN1bGF0ZSBhY3R1YWwgZHVyYXRpb24gZnJvbSB0aGF0IGFuZCB0aGUgdGltZSBzY2FsZQorICBkdXJhdGlvbl8gPSBUaWNrc1RvVGltZShkdXJhdGlvbl90aWNrcywgdGltZV9zY2FsZV9oeik7CisgIC8vIGFkdmFuY2UgcmVhZCBwb3NpdGlvbgorICBhdG9tX29mZnNldF8gKz0gYXRvbV9kYXRhX3NpemU7CisgIHJldHVybiB0cnVlOworfQorCitiYXNlOjpUaW1lRGVsdGEgU2hlbGxNUDRQYXJzZXI6OlRpY2tzVG9UaW1lKHVpbnQ2NCB0aWNrcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRpbWVfc2NhbGVfaHopIHsKKyAgRENIRUNLX05FKHRpbWVfc2NhbGVfaHosIDApOworCisgIGlmICh0aW1lX3NjYWxlX2h6ID09IDApIHsKKyAgICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tU2Vjb25kcygwKTsKKyAgfQorICByZXR1cm4gYmFzZTo6VGltZURlbHRhOjpGcm9tTWljcm9zZWNvbmRzKCh0aWNrcyAqIDEwMDAwMDBVTEwpIC8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lX3NjYWxlX2h6KTsKK30KKwordWludDY0IFNoZWxsTVA0UGFyc2VyOjpUaW1lVG9UaWNrcyhiYXNlOjpUaW1lRGVsdGEgdGltZSwgdWludDMyIHRpbWVfc2NhbGVfaHopIHsKKyAgRENIRUNLX05FKHRpbWVfc2NhbGVfaHosIDApOworCisgIGlmICh0aW1lX3NjYWxlX2h6ID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4gKHRpbWUuSW5NaWNyb3NlY29uZHMoKSAqIHRpbWVfc2NhbGVfaHopIC8gMTAwMDAwMFVMTDsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfbXA0X3BhcnNlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMGJhMDE5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuaApAQCAtMCwwICsxLDExMiBAQAorLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfRklMVEVSU19TSEVMTF9NUDRfUEFSU0VSX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX01QNF9QQVJTRVJfSF8KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL21lZGlhX2xvZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfbWFwLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vIEhvdyBtYW55IGJ5dGVzIHRvIGRvd25sb2FkIGZyb20gdGhlIHN0YXJ0IG9mIHRoZSBhdG9tPyBTaG91bGQgYmUgbGFyZ2UKKy8vIGVub3VnaCB0aGF0IHdlIGNhbiBleHRyYWN0IGFsbCB0aGUgZGF0YSB3ZSBuZWVkIGZyb20gdGhlIGF0b20gd2l0aG91dAorLy8gc2Vjb25kIGRvd25sb2FkICh0eXBpY2FsbHkpLCBidXQgbm8gbGFyZ2VyLiBUaGlzIGlzIGN1cnJlbnRseSBzZXQgYXQgMTYKKy8vIGJ5dGVzIGZvciB0aGUgOCBieXRlIGhlYWRlciArIG9wdGlvbmFsIDggYnl0ZSBzaXplIGV4dGVuc2lvbiBwbHVzIDIwIGJ5dGVzCisvLyBmb3IgdGhlIG5lZWRlZCB2YWx1ZXMgd2l0aGluIGFuIG12aGQgaGVhZGVyLiBXZSBsZWF2ZSB0aGlzIGlzIHRoZSBoZWFkZXIgc28KKy8vIHRoYXQgU2hlbGxNUDRNYXAgY2FuIHJlLXVzZSwKK3N0YXRpYyBjb25zdCBpbnQga0F0b21Eb3dubG9hZCA9IDM2OworCisvLyBtcDQgYXRvbSBmb3VyQ0MgY29kZXMgYXMgYmlnLWVuZGlhbiB1bnNpZ25lZCBpbnRzCitzdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9hdmMxID0gMHg2MTc2NjMzMTsgIC8vIHNraXAgaW4gdG8gc3ViYXRvbQorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfYXZjQyA9IDB4NjE3NjYzNDM7ICAvLyBkb3dubG9hZCBhbmQgcGFyc2UKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX2NvNjQgPSAweDYzNmYzNjM0OyAgLy8gY2FjaGUgaW4gdGFibGUKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX2N0dHMgPSAweDYzNzQ3NDczOyAgLy8gY2FjaGUgaW4gdGFibGUKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX2RpbmYgPSAweDY0Njk2ZTY2OyAgLy8gc2tpcCB3aG9sZSBhdG9tCitzdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9kcmVmID0gMHg2NDcyNjU2NjsgIC8vIHNraXAgd2hvbGUgYXRvbQorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfZXNkcyA9IDB4NjU3MzY0NzM7ICAvLyBkb3dubG9hZCBhbmQgcGFyc2UKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX2Z0eXAgPSAweDY2NzQ3OTcwOyAgLy8gdG9wIG9mIHRoZSBmaWxlIG9ubHkKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX2hkbHIgPSAweDY4NjQ2YzcyOyAgLy8gcGFyc2UgZmlyc3QgMTIgYnl0ZXMKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX21kaGQgPSAweDZkNjQ2ODY0OyAgLy8gcGFyc2UgZmlyc3QgMjAgYnl0ZXMKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX21kaWEgPSAweDZkNjQ2OTYxOyAgLy8gY29udGFpbmVyIGF0b20sIG5vLW9wCitzdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9taW5mID0gMHg2ZDY5NmU2NjsgIC8vIGNvbnRhaW5lciBhdG9tLCBuby1vcAorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfbW9vdiA9IDB4NmQ2ZjZmNzY7ICAvLyBjb250YWluZXIgYXRvbSwgbm8tb3AKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX21wNGEgPSAweDZkNzAzNDYxOyAgLy8gcGFyc2UgZmlyc3QgMTAgYnl0ZXMKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX212aGQgPSAweDZkNzY2ODY0OyAgLy8gcGFyc2UgZmlyc3QgMjAgYnl0ZXMKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX3NtaGQgPSAweDczNmQ2ODYyOyAgLy8gc2tpcCB3aG9sZSBhdG9tCitzdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV9zdGJsID0gMHg3Mzc0NjI2YzsgIC8vIGNvbnRhaW5lciBhdG9tLCBuby1vcAorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfc3RjbyA9IDB4NzM3NDYzNmY7ICAvLyBjYWNoZSBpbiB0YWJsZQorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfc3R0cyA9IDB4NzM3NDc0NzM7ICAvLyBjYWNoZSBpbiB0YWJsZQorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfc3RzYyA9IDB4NzM3NDczNjM7ICAvLyBjYWNoZSBpbiB0YWJsZQorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfc3RzZCA9IDB4NzM3NDczNjQ7ICAvLyBza2lwIGluIHRvIHN1YmF0b20KK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX3N0c3MgPSAweDczNzQ3MzczOyAgLy8gY2FjaGUgaW4gdGFibGUKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX3N0c3ogPSAweDczNzQ3MzdhOyAgLy8gY2FjaGUgaW4gdGFibGUKK3N0YXRpYyBjb25zdCB1aW50MzIga0F0b21UeXBlX3RyYWsgPSAweDc0NzI2MTZiOyAgLy8gY29udGFpbmVyIGF0b20sIG5vLW9wCitzdGF0aWMgY29uc3QgdWludDMyIGtBdG9tVHlwZV90a2hkID0gMHg3NDZiNjg2NDsgIC8vIHNraXAgd2hvbGUgYXRvbQorc3RhdGljIGNvbnN0IHVpbnQzMiBrQXRvbVR5cGVfdm1oZCA9IDB4NzY2ZDY4NjQ7ICAvLyBza2lwIHdob2xlIGF0b20KKy8vIFRPRE86IG1wNHYhIQorCitjbGFzcyBTaGVsbE1QNFBhcnNlciA6IHB1YmxpYyBTaGVsbEFWQ1BhcnNlciB7CisgcHVibGljOgorICAvLyBBdHRlbXB0cyB0byBtYWtlIHNlbnNlIG9mIHRoZSBwcm92aWRlZCBieXRlcyBvZiB0aGUgdG9wIG9mIGEgZmlsZSBhcyBhbgorICAvLyBmbHYsIGFuZCBpZiBpdCBkb2VzIG1ha2Ugc2Vuc2UgcmV0dXJucyBQSVBFTElORV9PSyBhbmQgfCpwYXJzZXJ8IGNvbnRhaW5zIGEKKyAgLy8gU2hlbGxNUDRQYXJzZXIgaW5pdGlhbGl6ZWQgd2l0aCBzb21lIGJhc2ljIHN0YXRlLiAgSWYgaXQgZG9lc24ndCBtYWtlIHNlbnNlCisgIC8vIHRoaXMgcmV0dXJucyBhbiBlcnJvciBzdGF0dXMgYW5kIHwqcGFyc2VyfCBjb250YWlucyBOVUxMLgorICBzdGF0aWMgUGlwZWxpbmVTdGF0dXMgQ29uc3RydWN0KHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDgqIGNvbnN0cnVjdGlvbl9oZWFkZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxTaGVsbFBhcnNlcj4qIHBhcnNlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nKTsKKyAgU2hlbGxNUDRQYXJzZXIoc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlciwKKyAgICAgICAgICAgICAgICAgdWludDMyIGZ0eXBfYXRvbV9zaXplLAorICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nKTsKKyAgdmlydHVhbCB+U2hlbGxNUDRQYXJzZXIoKTsKKworICAvLyA9PT0gU2hlbGxQYXJzZXIgaW1wbGVtZW50YXRpb24KKyAgdmlydHVhbCBib29sIFBhcnNlQ29uZmlnKCkgT1ZFUlJJREU7CisgIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBHZXROZXh0QVUoRGVtdXhlclN0cmVhbTo6VHlwZSB0eXBlKSBPVkVSUklERTsKKyAgdmlydHVhbCBib29sIFNlZWtUbyhiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSBPVkVSUklERTsKKworIHByaXZhdGU6CisgIGJvb2wgUGFyc2VOZXh0QXRvbSgpOworICBib29sIFBhcnNlTVA0X2VzZHModWludDY0IGF0b21fZGF0YV9zaXplKTsKKyAgYm9vbCBQYXJzZU1QNF9oZGxyKHVpbnQ2NCBhdG9tX2RhdGFfc2l6ZSwgdWludDgqIGhkbHIpOworICBib29sIFBhcnNlTVA0X21kaGQodWludDY0IGF0b21fZGF0YV9zaXplLCB1aW50OCogbWRoZCk7CisgIGJvb2wgUGFyc2VNUDRfbXA0YSh1aW50NjQgYXRvbV9kYXRhX3NpemUsIHVpbnQ4KiBtcDRhKTsKKyAgYm9vbCBQYXJzZU1QNF9tdmhkKHVpbnQ2NCBhdG9tX2RhdGFfc2l6ZSwgdWludDgqIG12aGQpOworICBiYXNlOjpUaW1lRGVsdGEgVGlja3NUb1RpbWUodWludDY0IHRpY2tzLCB1aW50MzIgdGltZV9zY2FsZV9oeik7CisgIHVpbnQ2NCBUaW1lVG9UaWNrcyhiYXNlOjpUaW1lRGVsdGEgdGltZSwgdWludDMyIHRpbWVfc2NhbGVfaHopOworCisgIHVpbnQ2NCBhdG9tX29mZnNldF87CisgIGJvb2wgY3VycmVudF90cmFrX2lzX3ZpZGVvXzsKKyAgYm9vbCBjdXJyZW50X3RyYWtfaXNfYXVkaW9fOworICB1aW50MzIgY3VycmVudF90cmFrX3RpbWVfc2NhbGVfOworICBiYXNlOjpUaW1lRGVsdGEgY3VycmVudF90cmFrX2R1cmF0aW9uXzsKKyAgdWludDMyIHZpZGVvX3RpbWVfc2NhbGVfaHpfOworICBiYXNlOjpUaW1lRGVsdGEgb25lX3ZpZGVvX3RpY2tfOworICB1aW50MzIgYXVkaW9fdGltZV9zY2FsZV9oel87CisgIGJhc2U6OlRpbWVEZWx0YSBhdWRpb190cmFja19kdXJhdGlvbl87CisgIGJhc2U6OlRpbWVEZWx0YSB2aWRlb190cmFja19kdXJhdGlvbl87CisgIHNjb3BlZF9yZWZwdHI8U2hlbGxNUDRNYXA+IGF1ZGlvX21hcF87CisgIHNjb3BlZF9yZWZwdHI8U2hlbGxNUDRNYXA+IHZpZGVvX21hcF87CisgIHVpbnQzMiBhdWRpb19zYW1wbGVfOworICB1aW50MzIgdmlkZW9fc2FtcGxlXzsKKyAgLy8gZm9yIGtlZXBpbmcgYnVmZmVycyBjb250aW51b3VzIGFjcm9zcyB0aW1lIHNjYWxlcworICB1aW50NjQgZmlyc3RfYXVkaW9faG9sZV90aWNrc187CisgIGJhc2U6OlRpbWVEZWx0YSBmaXJzdF9hdWRpb19ob2xlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX01QNF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfcGFyc2VyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3YWE4YWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfcGFyc2VyLmNjCkBAIC0wLDAgKzEsNTkgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3RpbWVzdGFtcF9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vID09PT0gU2hlbGxQYXJzZXIgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKy8vIGhvdyBtYW55IGJ5dGVzIHRvIGRvd25sb2FkIG9mIHRoZSBmaWxlIHRvIGRldGVybWluZSB0eXBlPworY29uc3QgaW50IFNoZWxsUGFyc2VyOjprSW5pdGlhbEhlYWRlclNpemUgPSA5OworCisvLyBzdGF0aWMKK1BpcGVsaW5lU3RhdHVzIFNoZWxsUGFyc2VyOjpDb25zdHJ1Y3QoCisgICAgc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlciwKKyAgICBzY29wZWRfcmVmcHRyPFNoZWxsUGFyc2VyPiogcGFyc2VyLAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2cpIHsKKyAgRENIRUNLKHBhcnNlcik7CisgIERDSEVDSyhtZWRpYV9sb2cpOworICAqcGFyc2VyID0gTlVMTDsKKworICAvLyBkb3dubG9hZCBmaXJzdCAxNiBieXRlcyBvZiBzdHJlYW0gdG8gZGV0ZXJtaW5lIGZpbGUgdHlwZSBhbmQgZXh0cmFjdCBiYXNpYworICAvLyBjb250YWluZXItc3BlY2lmaWMgc3RyZWFtIGNvbmZpZ3VyYXRpb24gaW5mb3JtYXRpb24KKyAgdWludDggaGVhZGVyW2tJbml0aWFsSGVhZGVyU2l6ZV07CisgIGludCBieXRlc19yZWFkID0gcmVhZGVyLT5CbG9ja2luZ1JlYWQoMCwga0luaXRpYWxIZWFkZXJTaXplLCBoZWFkZXIpOworICBpZiAoYnl0ZXNfcmVhZCAhPSBrSW5pdGlhbEhlYWRlclNpemUpIHsKKyAgICByZXR1cm4gREVNVVhFUl9FUlJPUl9DT1VMRF9OT1RfUEFSU0U7CisgIH0KKworICAvLyBhdHRlbXB0IHRvIGNvbnN0cnVjdCBtcDQgcGFyc2VyIGZyb20gdGhpcyBoZWFkZXIKKyAgcmV0dXJuIFNoZWxsTVA0UGFyc2VyOjpDb25zdHJ1Y3QocmVhZGVyLCBoZWFkZXIsIHBhcnNlciwgbWVkaWFfbG9nKTsKK30KKworU2hlbGxQYXJzZXI6OlNoZWxsUGFyc2VyKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIpCisgICAgOiByZWFkZXJfKHJlYWRlciksIGR1cmF0aW9uXyhrSW5maW5pdGVEdXJhdGlvbiksIGJpdHNfcGVyX3NlY29uZF8oMCkge30KKworU2hlbGxQYXJzZXI6On5TaGVsbFBhcnNlcigpIHt9CisKK2Jvb2wgU2hlbGxQYXJzZXI6OklzQ29uZmlnQ29tcGxldGUoKSB7CisgIHJldHVybiB2aWRlb19jb25maWdfLklzVmFsaWRDb25maWcoKSAmJiBhdWRpb19jb25maWdfLklzVmFsaWRDb25maWcoKSAmJgorICAgICAgICAgZHVyYXRpb25fICE9IGtJbmZpbml0ZUR1cmF0aW9uOworfQorCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9wYXJzZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ODUzNmM4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX3BhcnNlci5oCkBAIC0wLDAgKzEsODEgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX0ZJTFRFUlNfU0hFTExfUEFSU0VSX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX1BBUlNFUl9IXworCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9hdWRpb19kZWNvZGVyX2NvbmZpZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXJfc3RyZWFtLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfbG9nLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcGlwZWxpbmUuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1LmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vIGFic3RyYWN0IGJhc2UgY2xhc3MgdG8gZGVmaW5lIGEgc3RyZWFtIHBhcnNlciBpbnRlcmZhY2UgdXNlZCBieSBTaGVsbERlbXV4ZXIuCitjbGFzcyBTaGVsbFBhcnNlciA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxTaGVsbFBhcnNlcj4geworIHB1YmxpYzoKKyAgc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbEhlYWRlclNpemU7CisgIC8vIERldGVybWluZSBzdHJlYW0gdHlwZSwgY29uc3RydWN0IGFwcHJvcHJpYXRlIHBhcnNlciBvYmplY3QsIGFuZCByZXR1cm5zCisgIC8vIFBJUEVMSU5FX09LIG9uIHN1Y2Nlc3Mgb3IgZXJyb3IgY29kZS4KKyAgc3RhdGljIFBpcGVsaW5lU3RhdHVzIENvbnN0cnVjdChzY29wZWRfcmVmcHRyPFNoZWxsRGF0YVNvdXJjZVJlYWRlcj4gcmVhZGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9yZWZwdHI8U2hlbGxQYXJzZXI+KiBwYXJzZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZyk7CisgIGV4cGxpY2l0IFNoZWxsUGFyc2VyKHNjb3BlZF9yZWZwdHI8U2hlbGxEYXRhU291cmNlUmVhZGVyPiByZWFkZXIpOworCisgIC8vIFNlZWsgdGhyb3VnaCB0aGUgZmlsZSBsb29raW5nIGZvciBhdWRpbyBhbmQgdmlkZW8gY29uZmlndXJhdGlvbiBpbmZvLAorICAvLyBzYXZpbmcgYXMgbXVjaCBjb25maWcgc3RhdGUgYXMgaXMgcG9zc2libGUuIFNob3VsZCB0cnkgdG8gYmUgZmFzdCBidXQgdGhpcworICAvLyBtYXkgcmVzdWx0IGluIHRoZSBkb3dubG9hZGluZyBvZiBNQiBvZiBkYXRhLiBSZXR1cm5zIGZhbHNlIG9uIGZhdGFsIGVycm9yLgorICB2aXJ0dWFsIGJvb2wgUGFyc2VDb25maWcoKSA9IDA7CisKKyAgLy8gUmV0dXJucyBhIHBvcHVsYXRlZCwgdmFsaWQgQVUgaW5kaWNhdGluZyB0aGUgbmVlZGVkIGluZm9ybWF0aW9uIGZvcgorICAvLyBkb3dubG9kaW5nIGFuZCBkZWNvZGluZyB0aGUgbmV4dCBhY2Nlc3MgdW5pdCBpbiB0aGUgc3RyZWFtLCBvciBOVUxMIG9uCisgIC8vIGZhdGFsIGVycm9yLiBPbiBzdWNjZXNzIHRoaXMgYWR2YW5jZXMgdGhlIHJlc3BlY3RpdmUgYXVkaW8gb3IgdmlkZW8gY3Vyc29yCisgIC8vIHRvIHRoZSBuZXh0IEFVLgorICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8U2hlbGxBVT4gR2V0TmV4dEFVKERlbXV4ZXJTdHJlYW06OlR5cGUgdHlwZSkgPSAwOworICAvLyBXcml0ZSB0aGUgYXBwcm9wcmlhdGUgcHJlcGVuZCBoZWFkZXIgZm9yIHRoZSBzdXBwbGllZCBhdSBpbnRvIHRoZSBzdXBwbGllZAorICAvLyBidWZmZXIuIFJldHVybiBmYWxzZSBvbiBlcnJvci4KKyAgdmlydHVhbCBib29sIFByZXBlbmQoc2NvcGVkX3JlZnB0cjxTaGVsbEFVPiBhdSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxEZWNvZGVyQnVmZmVyPiBidWZmZXIpID0gMDsKKyAgLy8gQWR2YW5jZSBpbnRlcm5hbCBzdGF0ZSB0byBwcm92aWRlZCB0aW1lc3RhbXAuIFJldHVybiBmYWxzZSBvbiBlcnJvci4KKyAgdmlydHVhbCBib29sIFNlZWtUbyhiYXNlOjpUaW1lRGVsdGEgdGltZXN0YW1wKSA9IDA7CisKKyAgLy8gPT09PT09PSBjb25maWcgc3RhdGUgbWV0aG9kcywgdmFsdWVzIHNob3VsZCBiZSBzZXQgYnkgUGFyc2VDb25maWcoKQorICAvLyBSZXR1cm5zIHRydWUgaWYgYWxsIG9mIHRoZSByZXF1aXJlZCB2YXJpYWJsZXMgZGVmaW5lZCBiZWxvdyBhcmUgdmFsaWQuCisgIC8vIEJpdHNQZXJTZWNvbmQoKSBpcyBvcHRpb25hbC4KKyAgdmlydHVhbCBib29sIElzQ29uZmlnQ29tcGxldGUoKTsKKyAgLy8gdGltZS1kdXJhdGlvbiBvZiBmaWxlLCBtYXkgcmV0dXJuIGtJbmZpbml0ZUR1cmF0aW9uKCkgaWYgdW5rbm93bgorICB2aXJ0dWFsIGJhc2U6OlRpbWVEZWx0YSBEdXJhdGlvbigpIHsgcmV0dXJuIGR1cmF0aW9uXzsgfQorICAvLyBiaXRzIHBlciBzZWNvbmQgb2YgbWVkaWEsIGlmIGtub3duLCBvdGhlcndpc2UgMAorICB2aXJ0dWFsIHVpbnQzMiBCaXRzUGVyU2Vjb25kKCkgeyByZXR1cm4gYml0c19wZXJfc2Vjb25kXzsgfQorICB2aXJ0dWFsIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgQXVkaW9Db25maWcoKSB7IHJldHVybiBhdWRpb19jb25maWdfOyB9CisgIHZpcnR1YWwgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiBWaWRlb0NvbmZpZygpIHsgcmV0dXJuIHZpZGVvX2NvbmZpZ187IH0KKworIHByb3RlY3RlZDoKKyAgLy8gb25seSBhbGxvdyBSZWZDb3VudGVkVGhyZWFkU2FmZSB0byBkZWxldGUgdXMKKyAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPFNoZWxsUGFyc2VyPjsKKyAgdmlydHVhbCB+U2hlbGxQYXJzZXIoKTsKKyAgc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcl87CisgIEF1ZGlvRGVjb2RlckNvbmZpZyBhdWRpb19jb25maWdfOworICBWaWRlb0RlY29kZXJDb25maWcgdmlkZW9fY29uZmlnXzsKKyAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uXzsKKyAgdWludDMyIGJpdHNfcGVyX3NlY29uZF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfRklMVEVSU19TSEVMTF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42M2ExM2I4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtLmNjCkBAIC0wLDAgKzEsMjE1IEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCitTaGVsbFJCU1BTdHJlYW06OlNoZWxsUkJTUFN0cmVhbShjb25zdCB1aW50OCogbmFsdV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbmFsdV9idWZmZXJfc2l6ZSkKKyAgICA6IG5hbHVfYnVmZmVyXyhuYWx1X2J1ZmZlciksCisgICAgICBuYWx1X2J1ZmZlcl9zaXplXyhuYWx1X2J1ZmZlcl9zaXplKSwKKyAgICAgIG5hbHVfYnVmZmVyX2J5dGVfb2Zmc2V0XygwKSwKKyAgICAgIGN1cnJlbnRfbmFsdV9ieXRlXygwKSwKKyAgICAgIG51bWJlcl9jb25zZWN1dGl2ZV96ZXJvc18oMCksCisgICAgICByYnNwX2JpdF9vZmZzZXRfKDApIHt9CisKKy8vIHJlYWQgdW5zaWduZWQgRXhwLUdvbG9tYiBjb2RlZCBpbnRlZ2VyLCBJU08gMTQ0OTYtMTAgU2VjdGlvbiA5LjEKK2Jvb2wgU2hlbGxSQlNQU3RyZWFtOjpSZWFkVUVWKHVpbnQzMiogdWV2X291dCkgeworICBEQ0hFQ0sodWV2X291dCk7CisgIGludCBsZWFkaW5nX3plcm9fYml0cyA9IC0xOworICBmb3IgKHVpbnQ4IGIgPSAwOyBiID09IDA7IGxlYWRpbmdfemVyb19iaXRzKyspIHsKKyAgICBpZiAoIVJlYWRSQlNQQml0KCZiKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICAvLyB3ZSBjYW4gb25seSBmaXQgMzEgYml0cyBvZiBFeHAtR29sb21iIGNvZGVkIGRhdGEgaW50byBhIDMyLWJpdCBudW1iZXIKKyAgaWYgKGxlYWRpbmdfemVyb19iaXRzID49IDMyKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHVpbnQzMiByZXN1bHQgPSAoMSA8PCBsZWFkaW5nX3plcm9fYml0cykgLSAxOworICB1aW50MzIgcmVtYWluZGVyID0gMDsKKyAgaWYgKCFSZWFkQml0cyhsZWFkaW5nX3plcm9fYml0cywgJnJlbWFpbmRlcikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmVzdWx0ICs9IHJlbWFpbmRlcjsKKyAgKnVldl9vdXQgPSByZXN1bHQ7CisgIHJldHVybiB0cnVlOworfQorCisvLyByZWFkIHNpZ25lZCBFeHAtR29sb21iIGNvZGVkIGludGVnZXIsIElTTyAxNDQ5Ni0xMCBTZWN0aW9uIDkuMQorYm9vbCBTaGVsbFJCU1BTdHJlYW06OlJlYWRTRVYoaW50MzIqIHNldl9vdXQpIHsKKyAgRENIRUNLKHNldl9vdXQpOworICAvLyB3ZSBzdGFydCBvZmYgYnkgcmVhZGluZyBhbiB1bnNpZ25lZCBFeHAtR29sb21iIGNvZGVkIG51bWJlcgorICB1aW50MzIgdWV2ID0gMDsKKyAgaWYgKCFSZWFkVUVWKCZ1ZXYpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIHRoZSBMU2IgaW4gdGhpcyBudW1iZXIgaXMgdHJlYXRlZCBhcyB0aGUgaW52ZXJ0ZWQgc2lnbiBiaXQKKyAgYm9vbCBpc19uZWdhdGl2ZSA9ICEodWV2ICYgMSk7CisgIGludDMyIHJlc3VsdCA9IHN0YXRpY19jYXN0PGludDMyPigodWV2ICsgMSkgPj4gMSk7CisgIGlmIChpc19uZWdhdGl2ZSkgeworICAgIHJlc3VsdCAqPSAtMTsKKyAgfQorICAqc2V2X291dCA9IHJlc3VsdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIHJlYWQgYW5kIHJldHVybiB1cCB0byAzMiBiaXRzLCBmaWxsaW5nIGZyb20gdGhlIHJpZ2h0LCBtZWFuaW5nIHRoYXQKKy8vIFJlYWRCaXRzKDE3KSBvbiBhIHN0cmVhbSBvZiBhbGwgMXMgd291bGQgcmV0dXJuIDB4MDFmZmZmCitib29sIFNoZWxsUkJTUFN0cmVhbTo6UmVhZEJpdHMoc2l6ZV90IGJpdHMsIHVpbnQzMiogYml0c19vdXQpIHsKKyAgRENIRUNLKGJpdHNfb3V0KTsKKyAgaWYgKGJpdHMgPiAzMikgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoYml0cyA9PSAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgdWludDMyIHJlc3VsdCA9IDA7CisgIHNpemVfdCBieXRlcyA9IGJpdHMgPj4gMzsKKyAgLy8gcmVhZCBieXRlcyBmaXJzdAorICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzOyBpKyspIHsKKyAgICB1aW50OCBuZXdfYnl0ZSA9IDA7CisgICAgaWYgKCFSZWFkUkJTUEJ5dGUoJm5ld19ieXRlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXN1bHQgPSByZXN1bHQgPDwgODsKKyAgICByZXN1bHQgPSByZXN1bHQgfCBzdGF0aWNfY2FzdDx1aW50MzI+KG5ld19ieXRlKTsKKyAgfQorICAvLyBzY29vdCBhbnkgbGVmdG92ZXIgYml0cyBpbgorICBiaXRzID0gYml0cyAlIDg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgYml0czsgaSsrKSB7CisgICAgdWludDggbmV3X2JpdCA9IDA7CisgICAgaWYgKCFSZWFkUkJTUEJpdCgmbmV3X2JpdCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgcmVzdWx0ID0gcmVzdWx0IDw8IDE7CisgICAgcmVzdWx0ID0gcmVzdWx0IHwgc3RhdGljX2Nhc3Q8dWludDMyPihuZXdfYml0KTsKKyAgfQorICAqYml0c19vdXQgPSByZXN1bHQ7CisgIHJldHVybiB0cnVlOworfQorCisvLyBqdW1wIG92ZXIgYnl0ZXMgaW4gdGhlIFJCU1Agc3RyZWFtCitib29sIFNoZWxsUkJTUFN0cmVhbTo6U2tpcEJ5dGVzKHNpemVfdCBieXRlcykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzOyArK2kpIHsKKyAgICBpZiAoIUNvbnN1bWVOQUxVQnl0ZSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBqdW1wIG92ZXIgYml0cyBpbiB0aGUgUkJTUCBzdHJlYW0KK2Jvb2wgU2hlbGxSQlNQU3RyZWFtOjpTa2lwQml0cyhzaXplX3QgYml0cykgeworICAvLyBza2lwIGJ5dGVzIGZpcnN0CisgIHNpemVfdCBieXRlcyA9IGJpdHMgPj4gMzsKKyAgaWYgKGJ5dGVzID4gMCkgeworICAgIGlmICghU2tpcEJ5dGVzKGJ5dGVzKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICAvLyBtYXNrIG9mZiBieXRlIHNraXBzCisgIGJpdHMgPSBiaXRzICYgNzsKKyAgLy8gaWYgbm8gYml0cyBsZWZ0IHRvIHNraXAganVzdCByZXR1cm4KKyAgaWYgKGJpdHMgPT0gMCkgeworICAgIHJldHVybiB0cnVlOworICB9CisgIC8vIG9iZXkgdGhlIGNvbnZlbnRpb24gdGhhdCBpZiBvdXIgYml0IG9mZnNldCBpcyAwIHdlIGhhdmVuJ3QgbG9hZGVkIHRoZQorICAvLyBjdXJyZW50IGJ5dGUsIGV4dHJhY3QgaXQgZnJvbSBOQUxVIHN0cmVhbSBhcyB3ZSBhcmUgZ29pbmcgdG8gYWR2YW5jZQorICAvLyB0aGUgYml0IGN1cnNvciBpbiB0byBpdCAob3IgcG90ZW50aWFsbHkgcGFzdCBpdCkKKyAgaWYgKHJic3BfYml0X29mZnNldF8gPT0gMCkgeworICAgIGlmICghQ29uc3VtZU5BTFVCeXRlKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgLy8gYWRkIHRvIG91ciBiaXQgb2Zmc2V0CisgIHJic3BfYml0X29mZnNldF8gKz0gYml0czsKKyAgLy8gaWYgd2UganVtcGVkIGluIHRvIHRoZSBuZXh0IGJ5dGUgYWR2YW5jZSB0aGUgTkFMVSBzdHJlYW0sIHJlc3BlY3RpbmcgdGhlCisgIC8vIGNvbnZlbnRpb24gdGhhdCBpZiB3ZSdyZSBhdCA4IGJpdHMgc3RheSBvbiB0aGUgY3VycmVudCBieXRlCisgIGlmIChyYnNwX2JpdF9vZmZzZXRfID49IDkpIHsKKyAgICBpZiAoIUNvbnN1bWVOQUxVQnl0ZSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIHJic3BfYml0X29mZnNldF8gPSByYnNwX2JpdF9vZmZzZXRfICUgODsKKyAgcmV0dXJuIHRydWU7Cit9CisKKy8vIGFkdmFuY2UgYnkgb25lIGJ5dGUgdGhyb3VnaCB0aGUgTkFMVSBidWZmZXIsIHJlc3BlY3RpbmcgdGhlIGVuY29kaW5nIG9mCisvLyAwMCAwMCAwMyA9PiAwMCAwMC4gVXBkYXRlcyB0aGUgc3RhdGUgb2YgY3VycmVudF9uYWx1X2J5dGVfIHRvIHRoZSBuZXcgdmFsdWUuCitib29sIFNoZWxsUkJTUFN0cmVhbTo6Q29uc3VtZU5BTFVCeXRlKCkgeworICBpZiAobmFsdV9idWZmZXJfYnl0ZV9vZmZzZXRfID49IG5hbHVfYnVmZmVyX3NpemVfKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGN1cnJlbnRfbmFsdV9ieXRlXyA9IG5hbHVfYnVmZmVyX1tuYWx1X2J1ZmZlcl9ieXRlX29mZnNldF9dOworICBpZiAoY3VycmVudF9uYWx1X2J5dGVfID09IDB4MDMgJiYgbnVtYmVyX2NvbnNlY3V0aXZlX3plcm9zXyA+PSAyKSB7CisgICAgKytuYWx1X2J1ZmZlcl9ieXRlX29mZnNldF87CisgICAgY3VycmVudF9uYWx1X2J5dGVfID0gbmFsdV9idWZmZXJfW25hbHVfYnVmZmVyX2J5dGVfb2Zmc2V0X107CisgICAgbnVtYmVyX2NvbnNlY3V0aXZlX3plcm9zXyA9IDA7CisgIH0KKworICBpZiAoY3VycmVudF9uYWx1X2J5dGVfID09IDApIHsKKyAgICArK251bWJlcl9jb25zZWN1dGl2ZV96ZXJvc187CisgIH0gZWxzZSB7CisgICAgbnVtYmVyX2NvbnNlY3V0aXZlX3plcm9zXyA9IDA7CisgIH0KKyAgKytuYWx1X2J1ZmZlcl9ieXRlX29mZnNldF87CisgIHJldHVybiB0cnVlOworfQorCisvLyByZXR1cm4gc2luZ2xlIGJpdCBpbiB0aGUgTFNiIGZyb20gdGhlIFJCU1Agc3RyZWFtLiBCaXRzIGFyZSByZWFkIGZyb20gTVNiCisvLyB0byBMU2IgaW4gdGhlIHN0cmVhbS4KK2Jvb2wgU2hlbGxSQlNQU3RyZWFtOjpSZWFkUkJTUEJpdCh1aW50OCogYml0X291dCkgeworICBEQ0hFQ0soYml0X291dCk7CisgIC8vIGNoZWNrIHRvIHNlZSBpZiB3ZSBuZWVkIHRvIGNvbnN1bWUgYSBmcmVzaCBieXRlCisgIGlmIChyYnNwX2JpdF9vZmZzZXRfID09IDApIHsKKyAgICBpZiAoIUNvbnN1bWVOQUxVQnl0ZSgpKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CisgIC8vIHNpbmNlIHdlIHJlYWQgZnJvbSBNU2IgdG8gTFNiIGluIHN0cmVhbSB3ZSBzaGlmdCByaWdodAorICB1aW50OCBiaXQgPSAoY3VycmVudF9uYWx1X2J5dGVfID4+ICg3IC0gcmJzcF9iaXRfb2Zmc2V0XykpICYgMTsKKyAgLy8gaW5jcmVtZW50IGJpdCBvZmZzZXQKKyAgcmJzcF9iaXRfb2Zmc2V0XyA9IChyYnNwX2JpdF9vZmZzZXRfICsgMSkgJSA4OworICAqYml0X291dCA9IGJpdDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgU2hlbGxSQlNQU3RyZWFtOjpSZWFkUkJTUEJ5dGUodWludDgqIGJ5dGVfb3V0KSB7CisgIERDSEVDSyhieXRlX291dCk7CisgIC8vIGZhc3QgcGF0aCBmb3IgYnl0ZS1hbGlnbmVkIGFjY2VzcworICBpZiAocmJzcF9iaXRfb2Zmc2V0XyA9PSAwKSB7CisgICAgaWYgKCFDb25zdW1lTkFMVUJ5dGUoKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAqYnl0ZV9vdXQgPSBjdXJyZW50X25hbHVfYnl0ZV87CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gYXQgbGVhc3Qgc29tZSBvZiB0aGUgYml0cyBpbiB0aGUgY3VycmVudCBieXRlIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhpcworICAvLyBuZXh0IGJ5dGUsIGFic29yYiB0aGVtCisgIHVpbnQ4IHVwcGVyX3BhcnQgPSBjdXJyZW50X25hbHVfYnl0ZV87CisgIC8vIHJlYWQgbmV4dCBieXRlIGZyb20gc3RyZWFtCisgIGlmICghQ29uc3VtZU5BTFVCeXRlKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgLy8gZm9ybSB0aGUgYnl0ZSBmcm9tIHRoZSB0d28gYnl0ZXMKKyAgKmJ5dGVfb3V0ID0gKHVwcGVyX3BhcnQgPDwgcmJzcF9iaXRfb2Zmc2V0XykgfAorICAgICAgICAgICAgICAoY3VycmVudF9uYWx1X2J5dGVfID4+ICg4IC0gcmJzcF9iaXRfb2Zmc2V0XykpOworICByZXR1cm4gdHJ1ZTsKK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uaCBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2U3MDkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uaApAQCAtMCwwICsxLDcxIEBACisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX1JCU1BfU1RSRUFNX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9GSUxURVJTX1NIRUxMX1JCU1BfU1RSRUFNX0hfCisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworLy8gSVNPIDE0NDk2LTEwIGRlc2NyaWJlcyBhIGJ5dGUgZW5jb2RpbmcgZm9ybWF0IGZvciBOQUxVcyAobmV0d29yayBhYnN0cmFjdGlvbgorLy8gbGF5ZXIgdW5pdHMpIGFuZCBydWxlcyB0byBjb252ZXJ0IGl0IGludG8gYSBSQlNQIHN0cmVhbSwgd2hpY2ggaXMgdGhlIGZvcm1hdAorLy8gdGhhdCBzb21lIG90aGVyIGF0b21zIGFyZSBkZWZpbmVkLiBUaGlzIGNsYXNzIHRha2VzIGEgbm9uLW93bmluZyByZWZlcmVuY2UKKy8vIHRvIGEgYnVmZmVyIGFuZCBleHRyYWN0IHZhcmlvdXMgdHlwZXMgZnJvbSB0aGUgc3RyZWFtIHdoaWxlIHNpbGVudGx5CisvLyBjb25zdW1pbmcgdGhlIGV4dHJhIGVuY29kaW5nIGJ5dGVzIGFuZCBhZHZhbmNpbmcgYSBiaXQgc3RyZWFtIHBvaW50ZXIuCitjbGFzcyBTaGVsbFJCU1BTdHJlYW0geworIHB1YmxpYzoKKyAgLy8gTk9OLU9XTklORyBwb2ludGVyIHRvIGJ1ZmZlci4gSXQgaXMgYXNzdW1lZCB0aGUgY2xpZW50IHdpbGwgZGlzcG9zZSBvZgorICAvLyB0aGlzIGJ1ZmZlci4KKyAgU2hlbGxSQlNQU3RyZWFtKGNvbnN0IHVpbnQ4KiBuYWx1X2J1ZmZlciwgc2l6ZV90IG5hbHVfYnVmZmVyX3NpemUpOworICAvLyBhbGwgUmVhZC9Ta2lwIG1ldGhvZHMgcmV0dXJuIHRoZSB2YWx1ZSBieSByZWZlcmVuY2UgYW5kIHJldHVybiB0cnVlCisgIC8vIG9uIHN1Y2Nlc3MsIGZhbHNlIG9uIHJlYWQgZXJyb3IvRU9CLiBPbmNlIHRoZSBvYmplY3QgaGFzIHJldHVybmVkCisgIC8vIGZhbHNlIHRoZSBjb25zaXN0ZW5jeSBvZiB0aGUgZGF0YSBpcyBub3QgZ3VhcmFudGVlZC4KKyAgLy8gcmVhZCB1bnNpZ25lZCBFeHAtR29sb21iIGNvZGVkIGludGVnZXIsIElTTyAxNDQ5Ni0xMCBTZWN0aW9uIDkuMQorICBib29sIFJlYWRVRVYodWludDMyKiB1ZXZfb3V0KTsKKyAgLy8gcmVhZCBzaWduZWQgRXhwLUdvbG9tYiBjb2RlZCBpbnRlZ2VyLCBJU08gMTQ0OTYtMTAgU2VjdGlvbiA5LjEKKyAgYm9vbCBSZWFkU0VWKGludDMyKiBzZXZfb3V0KTsKKyAgLy8gcmVhZCBhbmQgcmV0dXJuIHVwIHRvIDMyIGJpdHMsIGZpbGxpbmcgZnJvbSB0aGUgcmlnaHQsIG1lYW5pbmcgdGhhdAorICAvLyBSZWFkQml0cygxNykgb24gYSBzdHJlYW0gb2YgYWxsIDFzIHdvdWxkIHJldHVybiAweDAxZmZmZgorICBib29sIFJlYWRCaXRzKHNpemVfdCBiaXRzLCB1aW50MzIqIGJpdHNfb3V0KTsKKyAgYm9vbCBSZWFkQnl0ZSh1aW50OCogYnl0ZV9vdXQpIHsgcmV0dXJuIFJlYWRSQlNQQnl0ZShieXRlX291dCk7IH0KKyAgYm9vbCBSZWFkQml0KHVpbnQ4KiBiaXRfb3V0KSB7IHJldHVybiBSZWFkUkJTUEJpdChiaXRfb3V0KTsgfQorICAvLyBqdW1wIG92ZXIgYnl0ZXMgaW4gdGhlIFJCU1Agc3RyZWFtCisgIGJvb2wgU2tpcEJ5dGVzKHNpemVfdCBieXRlcyk7CisgIC8vIGp1bXAgb3ZlciBiaXRzIGluIHRoZSBSQlNQIHN0cmVhbQorICBib29sIFNraXBCaXRzKHNpemVfdCBiaXRzKTsKKworIHByaXZhdGU6CisgIC8vIGFkdmFuY2UgYnkgb25lIGJ5dGUgdGhyb3VnaCB0aGUgTkFMVSBidWZmZXIsIHJlc3BlY3RpbmcgdGhlIGVuY29kaW5nIG9mCisgIC8vIDAwIDAwIDAzID0+IDAwIDAwLiBVcGRhdGVzIHRoZSBzdGF0ZSBvZiBjdXJyZW50X25hbHVfYnl0ZV8gdG8gdGhlIG5ldworICAvLyB2YWx1ZS4KKyAgLy8gcmV0dXJucyBmYWxlIGlmIHdlIGhhdmUgbW92ZWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCisgIGJvb2wgQ29uc3VtZU5BTFVCeXRlKCk7CisgIC8vIHJldHVybiBzaW5nbGUgYml0IGluIHRoZSBMU2IgZnJvbSB0aGUgUkJTUCBzdHJlYW0uIEJpdHMgYXJlIHJlYWQgZnJvbSBNU2IKKyAgLy8gdG8gTFNiIGluIHRoZSBzdHJlYW0uCisgIGJvb2wgUmVhZFJCU1BCaXQodWludDgqIGJpdF9vdXQpOworICBib29sIFJlYWRSQlNQQnl0ZSh1aW50OCogYnl0ZV9vdXQpOworCisgIGNvbnN0IHVpbnQ4KiBuYWx1X2J1ZmZlcl87CisgIHNpemVfdCBuYWx1X2J1ZmZlcl9zaXplXzsKKyAgc2l6ZV90IG5hbHVfYnVmZmVyX2J5dGVfb2Zmc2V0XzsKKyAgdWludDggY3VycmVudF9uYWx1X2J5dGVfOworICBpbnQgbnVtYmVyX2NvbnNlY3V0aXZlX3plcm9zXzsKKyAgLy8gbG9jYXRpb24gb2YgcmJzcCBiaXQgY3Vyc29yIHdpdGhpbiBjdXJyZW50X25hbHVfYnl0ZV8KKyAgc2l6ZV90IHJic3BfYml0X29mZnNldF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWEKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfRklMVEVSU19TSEVMTF9SQlNQX1NUUkVBTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtX3VuaXR0ZXN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI4YWU5ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW1fdW5pdHRlc3QuY2MKQEAgLTAsMCArMSw2MzMgQEAKKy8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9zaGVsbF9yYnNwX3N0cmVhbS5oIgorCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ3ByaW50Zi5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCitjbGFzcyBTaGVsbFJCU1BTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgU2hlbGxSQlNQU3RyZWFtVGVzdCgpIHt9CisKKyAgdmlydHVhbCB+U2hlbGxSQlNQU3RyZWFtVGVzdCgpIHt9CisKKyAgLy8gR2l2ZW4gbnVtIGVuY29kZSB0aGUgdmFsdWUgaW4gc2lnbmVkIGV4cC1nb2xvbWIgc3ludGF4IGFuZCBwdXNoCisgIC8vIHRoZSB2YWx1ZSBvbiB0aGUgcHJvdmlkZWQgYml0bGlzdAorICB2b2lkIEVuY29kZVNFVihpbnQzMiBudW0sIHN0ZDo6bGlzdDxib29sPiYgYml0cykgeworICAgIGJvb2wgaXNfbmVnYXRpdmUgPSAobnVtIDwgMCk7CisgICAgdWludDMyIHVudW0gPSAwOworICAgIGlmIChpc19uZWdhdGl2ZSkgeworICAgICAgdW51bSA9ICh1aW50MzIpKG51bSAqIC0xKTsKKyAgICB9IGVsc2UgeworICAgICAgdW51bSA9ICh1aW50MzIpbnVtOworICAgIH0KKyAgICAvLyBtdWx0aXBseSB1bnNpZ25lZCB2YWx1ZSBieSAyCisgICAgdW51bSA9IHVudW0gPDwgMTsKKyAgICAvLyBzdWJ0cmFjdCBvbmUgZnJvbSB0aGUgcG9zaXRpdmUgdmFsdWVzCisgICAgaWYgKCFpc19uZWdhdGl2ZSkgeworICAgICAgLS11bnVtOworICAgIH0KKyAgICAvLyBlbmNvZGUgdGhlIHJlc3VsdGluZyB1ZXYKKyAgICBFbmNvZGVVRVYodW51bSwgYml0cyk7CisgIH0KKworICAvLyBHaXZlbiBudW0gZW5jb2RlIHRoZSB2YWx1ZSBpbiB1bnNpZ25lZCBleHAtZ29sb21iIHN5bnRheCBhbmQgcHVzaAorICAvLyB0aGUgdmFsdWUgb24gdG8gdGhlIHByb3ZpZGVkIGJpdGxpc3QKKyAgdm9pZCBFbmNvZGVVRVYodWludDMyIG51bSwgc3RkOjpsaXN0PGJvb2w+JiBiaXRzKSB7CisgICAgLy8gZmluZCBsYXJnZXN0ICgyXnBvdykgLSAxIHNtYWxsZXIgdGhhbiBudW0KKyAgICB1aW50MzIgcG93ID0gMzE7CisgICAgdWludDMyIGJhc2UgPSAweDdmZmZmZmZmOworICAgIHdoaWxlIChiYXNlID4gbnVtKSB7CisgICAgICBwb3ctLTsKKyAgICAgIGJhc2UgPSBiYXNlID4+IDE7CisgICAgfQorICAgIC8vIGVuY29kaW5nIGNhbGxzIGZvciBwb3cgbGVhZGluZyB6ZXJvcywgZm9sbG93ZWQgYnkgYSAxLCBmb2xsb3dlZAorICAgIC8vIGJ5IHBvdyBkaWdpdHMgb2YgdGhlIGlucHV0IG51bWJlciAtICgoMl5wb3cpIC0gMSkuCisgICAgLy8gd2UgbW92ZSBmcm9tIE1TYiB0byBMU2IsIHNvIHN0YXJ0IGJ5IHB1c2hpbmcgYmFjayB0aGUgbGVhZGluZyAwcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcG93OyBpKyspIHsKKyAgICAgIGJpdHMucHVzaF9iYWNrKGZhbHNlKTsKKyAgICB9CisgICAgLy8gbm93IHB1c2ggdGhlIHNlcGFyYXRpbmcgb25lCisgICAgYml0cy5wdXNoX2JhY2sodHJ1ZSk7CisgICAgLy8gYW5kIG5vdyBwb3cgYml0cyBvZiB0aGUgcmVtYWluZGVyIGJpdGZpZWxkIE1TYiB0byBMU2IKKyAgICB1aW50MzIgcmVtYWluZGVyID0gbnVtIC0gYmFzZTsKKyAgICBmb3IgKGludCBpID0gcG93IC0gMTsgaSA+PSAwOyAtLWkpIHsKKyAgICAgIGJpdHMucHVzaF9iYWNrKChyZW1haW5kZXIgPj4gaSkgJiAweDAxKTsKKyAgICB9CisgIH0KKworICAvLyBhZnRlciBidWlsZGluZyBhIGJpdGxpc3QgaW4gdmFyaW91cyBmdW4gd2F5cyBjYWxsIHRoaXMgbWV0aG9kIHRvCisgIC8vIGNyZWF0ZSBhIGJ1ZmZlciBvbiB0aGUgaGVhcCB0aGF0IGNhbiBiZSBwYXNzZWQgdG8gU2hlbGxSQlNQU3RyZWFtCisgIC8vIGZvciBkZXNlcmlhbGl6YXRpb24uCisgIHNjb3BlZF9hcnJheTx1aW50OD4gU2VyaWFsaXplVG9CdWZmZXIoY29uc3Qgc3RkOjpsaXN0PGJvb2w+JiBiaXRsaXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYWRkX3NlcXVlbmNlX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCYgYnVmZmVyX3NpemVfb3V0KSB7CisgICAgLy8gc3RhcnQgYnkgYnVpbGRpbmcgYSBsaXN0IG9mIGJ5dGVzLCBzbyB3ZSBjYW4gYWRkIHRoZQorICAgIC8vIDAwIDAwID0+IDAwIDAwIDAzIHNlcXVlbmNlIGJ5dGVzCisgICAgc3RkOjpsaXN0PHVpbnQ4PiBieXRlbGlzdDsKKyAgICB1aW50OCBwdXNoX2J5dGUgPSAwOworICAgIHVpbnQzMiBiaXRfY291bnRlciA9IDA7CisgICAgZm9yIChzdGQ6Omxpc3Q8Ym9vbD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYml0bGlzdC5iZWdpbigpOworICAgICAgICAgaXQgIT0gYml0bGlzdC5lbmQoKTsgKytpdCkgeworICAgICAgYml0X2NvdW50ZXIrKzsKKyAgICAgIHB1c2hfYnl0ZSA9IHB1c2hfYnl0ZSA8PCAxOworICAgICAgaWYgKCppdCkgeworICAgICAgICBwdXNoX2J5dGUgfD0gMTsKKyAgICAgIH0KKyAgICAgIGlmICghKGJpdF9jb3VudGVyICUgOCkpIHsKKyAgICAgICAgYnl0ZWxpc3QucHVzaF9iYWNrKHB1c2hfYnl0ZSk7CisgICAgICAgIHB1c2hfYnl0ZSA9IDA7CisgICAgICB9CisgICAgfQorICAgIC8vIHB1c2ggYW55IHJlbWFpbmluZyBiaXRzIG9uIGFzIHRoZSBmaW5hbCBieXRlCisgICAgaWYgKGJpdF9jb3VudGVyICUgOCkgeworICAgICAgYnl0ZWxpc3QucHVzaF9iYWNrKHB1c2hfYnl0ZSA8PCAoOCAtIChiaXRfY291bnRlciAlIDgpKSk7CisgICAgfQorICAgIC8vIGlmIHdlIHNob3VsZCBhZGQgc2VxdWVuY2UgYnl0ZXMgd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBuZXcKKyAgICAvLyBieXRlIGxpc3QgbG9va2luZyBmb3IgMDAgMDAgYW5kIGluc2VydGluZyBhIDAzIGFmdGVyIGVhY2guCisgICAgaWYgKGFkZF9zZXF1ZW5jZV9ieXRlcykgeworICAgICAgaW50IG51bV96ZXJvcyA9IDA7CisgICAgICBmb3IgKHN0ZDo6bGlzdDx1aW50OD46Oml0ZXJhdG9yIGl0ID0gYnl0ZWxpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgaXQgIT0gYnl0ZWxpc3QuZW5kKCk7ICsraXQpIHsKKyAgICAgICAgLy8gaWYgd2UganVzdCBwYXNzZWQgdHdvIHNlcXVlbnRpYWwgemVyb3MgaW5zZXJ0IGEgMDMKKyAgICAgICAgaWYgKG51bV96ZXJvcyA9PSAyKSB7CisgICAgICAgICAgYnl0ZWxpc3QuaW5zZXJ0KGl0LCAweDAzKTsKKyAgICAgICAgICAvLyByZXNldCB0aGUgY291bnRlcgorICAgICAgICAgIG51bV96ZXJvcyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCppdCA9PSAwKSB7CisgICAgICAgICAgKytudW1femVyb3M7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgbnVtX3plcm9zID0gMDsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAvLyB3ZSB3aWxsIG5lZWQgdG8gZGV0ZWN0IGFueSBuYXR1cmFsbHkgb2N1cnJpbmcgMDAgMDAgMDNzCisgICAgICAvLyBhbmQgcHJvdGVjdCB0aGVtIGZyb20gcmVtb3ZhbCBvZiB0aGUgMDMsIGJ5IGluc2VydGluZyBhCisgICAgICAvLyBzZWNvbmQgMDMKKyAgICAgIGludCBudW1femVyb3MgPSAwOworICAgICAgZm9yIChzdGQ6Omxpc3Q8dWludDg+OjppdGVyYXRvciBpdCA9IGJ5dGVsaXN0LmJlZ2luKCk7CisgICAgICAgICAgIGl0ICE9IGJ5dGVsaXN0LmVuZCgpOyArK2l0KSB7CisgICAgICAgIGlmICgobnVtX3plcm9zID49IDIpICYmICgqaXQgPT0gMHgwMykpIHsKKyAgICAgICAgICBieXRlbGlzdC5pbnNlcnQoaXQsIDB4MDMpOworICAgICAgICB9CisgICAgICAgIGlmICgqaXQgPT0gMCkgeworICAgICAgICAgICsrbnVtX3plcm9zOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG51bV96ZXJvcyA9IDA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgICAgLy8gYWxyaWdodCB3ZSBjYW4gbWFrZSB0aGUgZmluYWwgb3V0cHV0IGJ1ZmZlcgorICAgIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmKG5ldyB1aW50OFtieXRlbGlzdC5zaXplKCldKTsKKyAgICBpbnQgaW5kZXggPSAwOworICAgIGZvciAoc3RkOjpsaXN0PHVpbnQ4Pjo6aXRlcmF0b3IgaXQgPSBieXRlbGlzdC5iZWdpbigpOyBpdCAhPSBieXRlbGlzdC5lbmQoKTsKKyAgICAgICAgIGl0KyspIHsKKyAgICAgIGJ1ZltpbmRleF0gPSAqaXQ7CisgICAgICBpbmRleCsrOworICAgIH0KKyAgICBidWZmZXJfc2l6ZV9vdXQgPSBieXRlbGlzdC5zaXplKCk7CisgICAgcmV0dXJuIGJ1Zi5QYXNzKCk7CisgIH0KK307CisKK1RFU1RfRihTaGVsbFJCU1BTdHJlYW1UZXN0LCBSZWFkVUVWKSB7CisgIHN0ZDo6bGlzdDxib29sPiBmaWJiaXRzOworICAvLyBlbmNvZGUgZmlyc3QgNDcgRmlib25hY2NpIG51bWJlcnMKKyAgdWludDMyIGZfbl9taW51c18yID0gMDsKKyAgRW5jb2RlVUVWKGZfbl9taW51c18yLCBmaWJiaXRzKTsKKyAgdWludDMyIGZfbl9taW51c18xID0gMTsKKyAgRW5jb2RlVUVWKGZfbl9taW51c18xLCBmaWJiaXRzKTsKKyAgZm9yIChpbnQgaSA9IDI7IGkgPCA0NzsgaSsrKSB7CisgICAgdWludDMyIGZfbiA9IGZfbl9taW51c18xICsgZl9uX21pbnVzXzI7CisgICAgRW5jb2RlVUVWKGZfbiwgZmliYml0cyk7CisgICAgLy8gdXBkYXRlIHZhbHVlcworICAgIGZfbl9taW51c18yID0gZl9uX21pbnVzXzE7CisgICAgZl9uX21pbnVzXzEgPSBmX247CisgIH0KKyAgLy8gY29udmVydCB0byBidWZmZXIKKyAgc2l6ZV90IGZpYl9idWZmZXJfc2l6ZSA9IDA7CisgIHNjb3BlZF9hcnJheTx1aW50OD4gZmliX2J1ZmZlciA9CisgICAgICBTZXJpYWxpemVUb0J1ZmZlcihmaWJiaXRzLCB0cnVlLCBmaWJfYnVmZmVyX3NpemUpOworICBzaXplX3QgZmliX2J1ZmZlcl9ub19zZXF1ZW5jZV9zaXplOworICBzY29wZWRfYXJyYXk8dWludDg+IGZpYl9idWZmZXJfbm9fc2VxdWVuY2UgPQorICAgICAgU2VyaWFsaXplVG9CdWZmZXIoZmliYml0cywgZmFsc2UsIGZpYl9idWZmZXJfbm9fc2VxdWVuY2Vfc2l6ZSk7CisgIFNoZWxsUkJTUFN0cmVhbSBmaWJfc3RyZWFtKGZpYl9idWZmZXIuZ2V0KCksIGZpYl9idWZmZXJfc2l6ZSk7CisgIFNoZWxsUkJTUFN0cmVhbSBmaWJfc3RyZWFtX25vX3NlcXVlbmNlKGZpYl9idWZmZXJfbm9fc2VxdWVuY2UuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpYl9idWZmZXJfbm9fc2VxdWVuY2Vfc2l6ZSk7CisgIC8vIGRlc2VyaWFsaXplIHRoZSBzYW1lIHNlcXVlbmNlIGZyb20gYm90aCBidWZmZXJzCisgIHVpbnQzMiB1ZXYgPSAwOworICB1aW50MzIgdWV2X24gPSAwOworICBmX25fbWludXNfMiA9IDA7CisgIEFTU0VSVF9UUlVFKGZpYl9zdHJlYW0uUmVhZFVFVih1ZXYpKTsKKyAgQVNTRVJUX0VRKHVldiwgZl9uX21pbnVzXzIpOworICBBU1NFUlRfVFJVRShmaWJfc3RyZWFtX25vX3NlcXVlbmNlLlJlYWRVRVYodWV2X24pKTsKKyAgQVNTRVJUX0VRKHVldl9uLCBmX25fbWludXNfMik7CisKKyAgZl9uX21pbnVzXzEgPSAxOworICBBU1NFUlRfVFJVRShmaWJfc3RyZWFtLlJlYWRVRVYodWV2KSk7CisgIEFTU0VSVF9FUSh1ZXYsIGZfbl9taW51c18xKTsKKyAgQVNTRVJUX1RSVUUoZmliX3N0cmVhbV9ub19zZXF1ZW5jZS5SZWFkVUVWKHVldl9uKSk7CisgIEFTU0VSVF9FUSh1ZXZfbiwgZl9uX21pbnVzXzEpOworCisgIGZvciAoaW50IGkgPSAyOyBpIDwgNDc7IGkrKykgeworICAgIHVpbnQzMiBmX24gPSBmX25fbWludXNfMSArIGZfbl9taW51c18yOworICAgIEFTU0VSVF9UUlVFKGZpYl9zdHJlYW0uUmVhZFVFVih1ZXYpKTsKKyAgICBBU1NFUlRfRVEodWV2LCBmX24pOworICAgIEFTU0VSVF9UUlVFKGZpYl9zdHJlYW1fbm9fc2VxdWVuY2UuUmVhZFVFVih1ZXZfbikpOworICAgIEFTU0VSVF9FUSh1ZXZfbiwgZl9uKTsKKyAgICBmX25fbWludXNfMiA9IGZfbl9taW51c18xOworICAgIGZfbl9taW51c18xID0gZl9uOworICB9CisgIC8vIHN1YnNlcXVlbnQgY2FsbCB0byBSZWFkVUVWIHNob3VsZCBmYWlsCisgIEFTU0VSVF9GQUxTRShmaWJfc3RyZWFtLlJlYWRVRVYodWV2KSk7CisgIEFTU0VSVF9GQUxTRShmaWJfc3RyZWFtX25vX3NlcXVlbmNlLlJlYWRVRVYodWV2X24pKTsKK30KKworVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRTRVYpIHsKKyAgc3RkOjpsaXN0PGJvb2w+IGx1Y2FzYml0czsKKyAgLy8gZW5jb2RlIGZpcnN0IDQ0IEx1Y2FzIG51bWJlcnMgd2l0aCBhbHRlcm5hdGluZyBzaWduCisgIGludDMyIGxfbl9taW51c18yID0gMTsKKyAgRW5jb2RlU0VWKGxfbl9taW51c18yLCBsdWNhc2JpdHMpOworICBpbnQzMiBsX25fbWludXNfMSA9IDI7CisgIEVuY29kZVNFVigtbF9uX21pbnVzXzEsIGx1Y2FzYml0cyk7CisgIGZvciAoaW50IGkgPSAyOyBpIDwgNDQ7ICsraSkgeworICAgIGludDMyIGxfbiA9IGxfbl9taW51c18xICsgbF9uX21pbnVzXzI7CisgICAgaWYgKGkgJSAyKSB7CisgICAgICBFbmNvZGVTRVYoLWxfbiwgbHVjYXNiaXRzKTsKKyAgICB9IGVsc2UgeworICAgICAgRW5jb2RlU0VWKGxfbiwgbHVjYXNiaXRzKTsKKyAgICB9CisgICAgbF9uX21pbnVzXzIgPSBsX25fbWludXNfMTsKKyAgICBsX25fbWludXNfMSA9IGxfbjsKKyAgfQorICAvLyBjb252ZXJ0IHRvIGJ1ZmZlcnMKKyAgc2l6ZV90IGx1Y2FzX3NlcV9idWZmZXJfc2l6ZSA9IDA7CisgIHNjb3BlZF9hcnJheTx1aW50OD4gbHVjYXNfc2VxX2J1ZmZlciA9CisgICAgICBTZXJpYWxpemVUb0J1ZmZlcihsdWNhc2JpdHMsIHRydWUsIGx1Y2FzX3NlcV9idWZmZXJfc2l6ZSk7CisgIHNpemVfdCBsdWNhc19kZXNlcV9idWZmZXJfc2l6ZSA9IDA7CisgIHNjb3BlZF9hcnJheTx1aW50OD4gbHVjYXNfZGVzZXFfYnVmZmVyID0KKyAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKGx1Y2FzYml0cywgZmFsc2UsIGx1Y2FzX2Rlc2VxX2J1ZmZlcl9zaXplKTsKKyAgU2hlbGxSQlNQU3RyZWFtIGx1Y2FzX3NlcV9zdHJlYW0obHVjYXNfc2VxX2J1ZmZlci5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVjYXNfc2VxX2J1ZmZlcl9zaXplKTsKKyAgU2hlbGxSQlNQU3RyZWFtIGx1Y2FzX2Rlc2VxX3N0cmVhbShsdWNhc19kZXNlcV9idWZmZXIuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbHVjYXNfZGVzZXFfYnVmZmVyX3NpemUpOworICBsX25fbWludXNfMiA9IDE7CisgIGxfbl9taW51c18xID0gMjsKKyAgaW50MzIgc2V2ID0gMDsKKyAgaW50MzIgc2V2X24gPSAwOworICBBU1NFUlRfVFJVRShsdWNhc19zZXFfc3RyZWFtLlJlYWRTRVYoc2V2KSk7CisgIEFTU0VSVF9FUShzZXYsIDEpOworICBBU1NFUlRfVFJVRShsdWNhc19kZXNlcV9zdHJlYW0uUmVhZFNFVihzZXZfbikpOworICBBU1NFUlRfRVEoc2V2X24sIDEpOworICBBU1NFUlRfVFJVRShsdWNhc19zZXFfc3RyZWFtLlJlYWRTRVYoc2V2KSk7CisgIEFTU0VSVF9FUShzZXYsIC0yKTsKKyAgQVNTRVJUX1RSVUUobHVjYXNfZGVzZXFfc3RyZWFtLlJlYWRTRVYoc2V2X24pKTsKKyAgQVNTRVJUX0VRKHNldl9uLCAtMik7CisgIGZvciAoaW50IGkgPSAyOyBpIDwgNDQ7ICsraSkgeworICAgIGludDMyIGxfbiA9IGxfbl9taW51c18xICsgbF9uX21pbnVzXzI7CisgICAgQVNTRVJUX1RSVUUobHVjYXNfc2VxX3N0cmVhbS5SZWFkU0VWKHNldikpOworICAgIEFTU0VSVF9UUlVFKGx1Y2FzX2Rlc2VxX3N0cmVhbS5SZWFkU0VWKHNldl9uKSk7CisgICAgaWYgKGkgJSAyKSB7CisgICAgICBBU1NFUlRfRVEoLXNldiwgbF9uKTsKKyAgICAgIEFTU0VSVF9FUSgtc2V2X24sIGxfbik7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9FUShzZXYsIGxfbik7CisgICAgICBBU1NFUlRfRVEoc2V2X24sIGxfbik7CisgICAgfQorICAgIGxfbl9taW51c18yID0gbF9uX21pbnVzXzE7CisgICAgbF9uX21pbnVzXzEgPSBsX247CisgIH0KKyAgLy8gc3Vic2VxdWVudCBjYWxscyB0byBSZWFkU0VWIHNob3VsZCBmYWlsCisgIEFTU0VSVF9GQUxTRShsdWNhc19zZXFfc3RyZWFtLlJlYWRTRVYoc2V2KSk7CisgIEFTU0VSVF9GQUxTRShsdWNhc19kZXNlcV9zdHJlYW0uUmVhZFNFVihzZXZfbikpOworfQorCitzdGF0aWMgY29uc3QgdWludDgga1Rlc3RSQlNQRXhwR29sb21iVG9vQmlnW10gPSB7CisgICAgLy8gMTUgbGVhZGluZyB6ZXJvcywgc2hvdWxkIGJlIGZpbmUKKyAgICAvLyAwMDAwMDAwMDAwMDAwMDAxMDEwMTAxMDEwMTAxMDEwCisgICAgLy8gID0gMl4xNSAtIDEgICsgcmVhZF9iaXRzKDAxMDEwMTAxMDEwMTAxMCkKKyAgICAvLyAgPSAzMjc2OCAtIDEgKyAxMDkyMiA9IDQzNjg5IHVuc2lnbmVkLCAyMTg0NSBzaWduZWQKKyAgICAvLyAwMDAwIDAwMDAgMDAwMCAwMDAxIDAxMDEgMDEwMSAwMTAxIDAxMCswIChmaXJzdCAwIG9mIG5leHQgbnVtYmVyKQorICAgIDB4MDAsIDB4MDEsIDB4NTUsIDB4NTQsCisgICAgLy8gMzEgbGVhZGluZyB6ZXJvcywgc2hvdWxkIGJlIGZpbmUKKyAgICAvLyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMTAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDEKKyAgICAvLyAgPSAyXjMxIC0gMSArIDEgPSAyMTQ3NDgzNjQ4IHVuc2lnbmVkLCAtMTA3Mzc0MTgyNCBzaWduZWQKKyAgICAvLyAwIGFwcGVuZGVkIG9uIHRvIGxhc3QgYnl0ZQorICAgIC8vIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAxMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMAorICAgIDB4MDAsIDB4MDAsIDB4MDMsIDB4MDAsIDB4MDIsIDB4MDAsIDB4MDAsIDB4MDAsIDB4MDMsCisgICAgLy8gMDAwMCAwMSswMCAoZmlyc3QgMiB6ZXJvcyBvZiBuZXh0IG51bWJlcikKKyAgICAweDA0LAorICAgIC8vIDMyIGxlYWRpbmcgemVyb3MsIHNob3VsZCBub3QgYmUgb2sKKyAgICAvLyAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDExMTExMTExMTExMTExMTExMTExMTExMTExMTExMTExMQorICAgIC8vID0gMl4zMiAtIDEgKyAyXjMyID0gMl4zMyAtIDEgPSA4NTg5OTM0NTkxCisgICAgLy8gMDAgYXBwZW5kZWQgb24gdG8gbGFzdCBieXRlCisgICAgLy8gMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDAwIDAwMDAgMDAwMCAwMDExIDExMTEgMTExMSAxMTExIDExMTEgMTExMSAxMTExCisgICAgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMywgMHgwMywgMHhmZiwgMHhmZiwgMHhmZiwKKyAgICAvLyAxMTExIDExMSswICh0byBjb21wbGV0ZSB0aGUgYnl0ZSkKKyAgICAweGZlfTsKKworVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRVRVZUb29MYXJnZSkgeworICAvLyBjb25zdHJ1Y3QgYSBzdHJlYW0gZnJvbSB0aGUgc3VwcGxpZWQgdGVzdCBkYXRhCisgIFNoZWxsUkJTUFN0cmVhbSB1ZXZfdG9vX2JpZyhrVGVzdFJCU1BFeHBHb2xvbWJUb29CaWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa1Rlc3RSQlNQRXhwR29sb21iVG9vQmlnKSk7CisgIC8vIGZpcnN0IGNhbGwgc2hvdWxkIHN1Y2NlZWQKKyAgdWludDMyIHVldiA9IDA7CisgIEFTU0VSVF9UUlVFKHVldl90b29fYmlnLlJlYWRVRVYodWV2KSk7CisgIEFTU0VSVF9FUSh1ZXYsIDQzNjg5KTsKKyAgLy8gYXMgc2hvdWxkIHRoZSBzZWNvbmQgY2FsbAorICBBU1NFUlRfVFJVRSh1ZXZfdG9vX2JpZy5SZWFkVUVWKHVldikpOworICBBU1NFUlRfRVEodWV2LCAyMTQ3NDgzNjQ4dSk7CisgIC8vIHRoaXJkIHNob3VsZCBmYWlsCisgIEFTU0VSVF9GQUxTRSh1ZXZfdG9vX2JpZy5SZWFkVUVWKHVldikpOworfQorCitURVNUX0YoU2hlbGxSQlNQU3RyZWFtVGVzdCwgUmVhZFNFVlRvb0xhcmdlKSB7CisgIC8vIGNvbnN0cnVjdCBhIHN0cmVhbSBmcm9tIHRoZSBzdXBwbGllZCB0ZXN0IGRhdGEKKyAgU2hlbGxSQlNQU3RyZWFtIHNldl90b29fYmlnKGtUZXN0UkJTUEV4cEdvbG9tYlRvb0JpZywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrVGVzdFJCU1BFeHBHb2xvbWJUb29CaWcpKTsKKyAgLy8gZmlyc3QgY2FsbCBzaG91bGQgc3VjY2VlZAorICBpbnQzMiBzZXYgPSAwOworICBBU1NFUlRfVFJVRShzZXZfdG9vX2JpZy5SZWFkU0VWKHNldikpOworICBBU1NFUlRfRVEoc2V2LCAyMTg0NSk7CisgIC8vIGFzIHNob3VsZCB0aGUgc2Vjb25kIGNhbGwKKyAgQVNTRVJUX1RSVUUoc2V2X3Rvb19iaWcuUmVhZFNFVihzZXYpKTsKKyAgQVNTRVJUX0VRKHNldiwgLTEwNzM3NDE4MjQpOworICAvLyB0aGlyZCBzaG91bGQgZmFpbAorICBBU1NFUlRfRkFMU0Uoc2V2X3Rvb19iaWcuUmVhZFNFVihzZXYpKTsKK30KKworVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRCaXQpIHsKKyAgc3RkOjpsaXN0PGJvb2w+IHBhZGRlZF9vbmVzOworICAvLyBidWlsZCBhIGJpdGZpZWxkIG9mIDEgcGFkZGVkIGJ5IG4gemVyb3MsIGZvciBuIGluIHJhbmdlWzAsIDEwMjRdCisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKKyAgICAgIHBhZGRlZF9vbmVzLnB1c2hfYmFjayhmYWxzZSk7CisgICAgfQorICAgIHBhZGRlZF9vbmVzLnB1c2hfYmFjayh0cnVlKTsKKyAgfQorICAvLyBidWlsZCB0aGUgYnVmZmVyIHdpdGggc2VxdWVuY2UgYml0cyBhbmQgd2l0aG91dAorICBzaXplX3Qgc2VxdWVuY2VfYnVmZl9zaXplID0gMDsKKyAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzZXF1ZW5jZV9idWZmID0KKyAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHBhZGRlZF9vbmVzLCB0cnVlLCBzZXF1ZW5jZV9idWZmX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0gc2VxX3N0cmVhbShzZXF1ZW5jZV9idWZmLmdldCgpLCBzZXF1ZW5jZV9idWZmX3NpemUpOworCisgIHNpemVfdCBkZXNlcXVlbmNlX2J1ZmZfc2l6ZSA9IDA7CisgIHNjb3BlZF9hcnJheTx1aW50OD4gZGVzZXF1ZW5jZV9idWZmID0KKyAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHBhZGRlZF9vbmVzLCBmYWxzZSwgZGVzZXF1ZW5jZV9idWZmX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0gZGVzZXFfc3RyZWFtKGRlc2VxdWVuY2VfYnVmZi5nZXQoKSwgZGVzZXF1ZW5jZV9idWZmX3NpemUpOworICBmb3IgKHN0ZDo6bGlzdDxib29sPjo6aXRlcmF0b3IgaXQgPSBwYWRkZWRfb25lcy5iZWdpbigpOworICAgICAgIGl0ICE9IHBhZGRlZF9vbmVzLmVuZCgpOyArK2l0KSB7CisgICAgdWludDggYml0ID0gMDsKKyAgICBBU1NFUlRfVFJVRShzZXFfc3RyZWFtLlJlYWRCaXQoYml0KSk7CisgICAgQVNTRVJUX0VRKCppdCwgYml0KTsKKyAgICB1aW50OCBkZXNlcV9iaXQgPSAwOworICAgIEFTU0VSVF9UUlVFKGRlc2VxX3N0cmVhbS5SZWFkQml0KGRlc2VxX2JpdCkpOworICAgIEFTU0VSVF9FUSgqaXQsIGRlc2VxX2JpdCk7CisgIH0KKworICAvLyB0aGVyZSBzaG91bGQgYmUgbGVzcyB0aGFuIGEgYnl0ZSBpbiB0aGUgZWl0aGVyIHN0cmVhbQorICB1aW50OCBmYWlsX2J5dGUgPSAwOworICBBU1NFUlRfRkFMU0Uoc2VxX3N0cmVhbS5SZWFkQnl0ZShmYWlsX2J5dGUpKTsKKyAgQVNTRVJUX0ZBTFNFKGRlc2VxX3N0cmVhbS5SZWFkQnl0ZShmYWlsX2J5dGUpKTsKK30KKworVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRCeXRlKSB7CisgIC8vIGJ1aWxkIGEgZmllbGQgb2YgMTYgeCAoMHhhYSBieXRlIGZvbGxvd2VkIGJ5IDAgYml0KQorICBzdGQ6Omxpc3Q8Ym9vbD4gYWFfZmllbGQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgODsgKytqKSB7CisgICAgICBhYV9maWVsZC5wdXNoX2JhY2soIShqICUgMikpOworICAgIH0KKyAgICBhYV9maWVsZC5wdXNoX2JhY2soZmFsc2UpOworICB9CisgIC8vIGRlc2VxYnVmZiB3aWxsIGJlIGlkZW50aWNhbCBkdWUgdG8gZGVuc2UgcGFja2luZyBvZiAwMSBwYXR0ZXJuCisgIHNpemVfdCBhYWJ1ZmZfc2l6ZSA9IDA7CisgIHNjb3BlZF9hcnJheTx1aW50OD4gYWFidWZmID0gU2VyaWFsaXplVG9CdWZmZXIoYWFfZmllbGQsIHRydWUsIGFhYnVmZl9zaXplKTsKKyAgU2hlbGxSQlNQU3RyZWFtIGFhX3N0cmVhbShhYWJ1ZmYuZ2V0KCksIGFhYnVmZl9zaXplKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CisgICAgdWludDggYWEgPSAwOworICAgIEFTU0VSVF9UUlVFKGFhX3N0cmVhbS5SZWFkQnl0ZShhYSkpOworICAgIEFTU0VSVF9FUShhYSwgMHhhYSk7CisgICAgLy8gcmVhZCB0aGUgemVybyBzZXBhcmF0b3IgYml0CisgICAgdWludDggemVybyA9IDA7CisgICAgQVNTRVJUX1RSVUUoYWFfc3RyZWFtLlJlYWRCaXQoemVybykpOworICAgIEFTU0VSVF9FUSh6ZXJvLCAwKTsKKyAgfQorCisgIC8vIGJ1aWxkIGEgZmllbGQgb2YgMjQgeCAoMSBiaXQsIDQgYnl0ZXMgb2YgMCwgb25lIDAzIGJ5dGUsIDQgYnl0ZXMgb2YgMCkKKyAgc3RkOjpsaXN0PGJvb2w+IHplcm9fZmllbGQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjQ7ICsraSkgeworICAgIHplcm9fZmllbGQucHVzaF9iYWNrKHRydWUpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgMzI7ICsraikgeworICAgICAgemVyb19maWVsZC5wdXNoX2JhY2soZmFsc2UpOworICAgIH0KKyAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayhmYWxzZSk7CisgICAgemVyb19maWVsZC5wdXNoX2JhY2soZmFsc2UpOworICAgIHplcm9fZmllbGQucHVzaF9iYWNrKGZhbHNlKTsKKyAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayhmYWxzZSk7CisgICAgemVyb19maWVsZC5wdXNoX2JhY2soZmFsc2UpOworICAgIHplcm9fZmllbGQucHVzaF9iYWNrKGZhbHNlKTsKKyAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayh0cnVlKTsKKyAgICB6ZXJvX2ZpZWxkLnB1c2hfYmFjayh0cnVlKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IDMyOyArK2opIHsKKyAgICAgIHplcm9fZmllbGQucHVzaF9iYWNrKGZhbHNlKTsKKyAgICB9CisgIH0KKyAgc2l6ZV90IHpzZXFidWZmX3NpemUgPSAwOworICBzY29wZWRfYXJyYXk8dWludDg+IHpzZXFidWZmID0KKyAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHplcm9fZmllbGQsIHRydWUsIHpzZXFidWZmX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0genNlcV9zdHJlYW0oenNlcWJ1ZmYuZ2V0KCksIHpzZXFidWZmX3NpemUpOworICBzaXplX3QgemRzZXFidWZmX3NpemUgPSAwOworICBzY29wZWRfYXJyYXk8dWludDg+IHpkc2VxYnVmZiA9CisgICAgICBTZXJpYWxpemVUb0J1ZmZlcih6ZXJvX2ZpZWxkLCBmYWxzZSwgemRzZXFidWZmX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0gemRzZXFfc3RyZWFtKHpkc2VxYnVmZi5nZXQoKSwgemRzZXFidWZmX3NpemUpOworICBmb3IgKGludCBpID0gMDsgaSA8IDI0OyArK2kpIHsKKyAgICAvLyByZWFkIHRoZSBsZWFkaW5nIDEgYml0CisgICAgdWludDggc2VxX2JpdCA9IDA7CisgICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJpdChzZXFfYml0KSk7CisgICAgQVNTRVJUX0VRKHNlcV9iaXQsIDEpOworICAgIHVpbnQ4IGRzZXFfYml0ID0gMDsKKyAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJpdChkc2VxX2JpdCkpOworICAgIEFTU0VSVF9FUShkc2VxX2JpdCwgMSk7CisgICAgLy8gcmVhZCA0IHplcm9zCisgICAgdWludDggc2VxX2J5dGUgPSAwOworICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7CisgICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKKyAgICBBU1NFUlRfVFJVRSh6c2VxX3N0cmVhbS5SZWFkQnl0ZShzZXFfYnl0ZSkpOworICAgIEFTU0VSVF9FUShzZXFfYnl0ZSwgMCk7CisgICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJ5dGUoc2VxX2J5dGUpKTsKKyAgICBBU1NFUlRfRVEoc2VxX2J5dGUsIDApOworICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7CisgICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKKyAgICB1aW50OCBkc2VxX2J5dGUgPSAwOworICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKKyAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAwKTsKKyAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJ5dGUoZHNlcV9ieXRlKSk7CisgICAgQVNTRVJUX0VRKGRzZXFfYnl0ZSwgMCk7CisgICAgQVNTRVJUX1RSVUUoemRzZXFfc3RyZWFtLlJlYWRCeXRlKGRzZXFfYnl0ZSkpOworICAgIEFTU0VSVF9FUShkc2VxX2J5dGUsIDApOworICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKKyAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAwKTsKKyAgICAvLyByZWFkIHRoZSAzCisgICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJ5dGUoc2VxX2J5dGUpKTsKKyAgICBBU1NFUlRfRVEoc2VxX2J5dGUsIDB4MDMpOworICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKKyAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAweDAzKTsKKyAgICAvLyByZWFkIHRoZSByZW1haW5pbmcgNCB6ZXJvcworICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7CisgICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKKyAgICBBU1NFUlRfVFJVRSh6c2VxX3N0cmVhbS5SZWFkQnl0ZShzZXFfYnl0ZSkpOworICAgIEFTU0VSVF9FUShzZXFfYnl0ZSwgMCk7CisgICAgQVNTRVJUX1RSVUUoenNlcV9zdHJlYW0uUmVhZEJ5dGUoc2VxX2J5dGUpKTsKKyAgICBBU1NFUlRfRVEoc2VxX2J5dGUsIDApOworICAgIEFTU0VSVF9UUlVFKHpzZXFfc3RyZWFtLlJlYWRCeXRlKHNlcV9ieXRlKSk7CisgICAgQVNTRVJUX0VRKHNlcV9ieXRlLCAwKTsKKyAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJ5dGUoZHNlcV9ieXRlKSk7CisgICAgQVNTRVJUX0VRKGRzZXFfYnl0ZSwgMCk7CisgICAgQVNTRVJUX1RSVUUoemRzZXFfc3RyZWFtLlJlYWRCeXRlKGRzZXFfYnl0ZSkpOworICAgIEFTU0VSVF9FUShkc2VxX2J5dGUsIDApOworICAgIEFTU0VSVF9UUlVFKHpkc2VxX3N0cmVhbS5SZWFkQnl0ZShkc2VxX2J5dGUpKTsKKyAgICBBU1NFUlRfRVEoZHNlcV9ieXRlLCAwKTsKKyAgICBBU1NFUlRfVFJVRSh6ZHNlcV9zdHJlYW0uUmVhZEJ5dGUoZHNlcV9ieXRlKSk7CisgICAgQVNTRVJUX0VRKGRzZXFfYnl0ZSwgMCk7CisgIH0KK30KKworVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFJlYWRCaXRzKSB7CisgIC8vIHRlc3QgdGhlIGFzc2VydGlvbiBpbiB0aGUgUmVhZEJpdHMgY29tbWVudCwgYXMgaXQgaGFkIGEgYnVnIDopCisgIHN0ZDo6bGlzdDxib29sPiBzZXZlbnRlZW5fb25lczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNzsgKytpKSB7CisgICAgc2V2ZW50ZWVuX29uZXMucHVzaF9iYWNrKHRydWUpOworICB9CisgIHNpemVfdCBzZXZlbnRlZW5fb25lc19zaXplID0gMDsKKyAgc2NvcGVkX2FycmF5PHVpbnQ4PiBzZXZlbnRlZW5fb25lc19idWZmID0KKyAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKHNldmVudGVlbl9vbmVzLCBmYWxzZSwgc2V2ZW50ZWVuX29uZXNfc2l6ZSk7CisgIFNoZWxsUkJTUFN0cmVhbSBzZXZlbnRlZW5fb25lc19zdHJlYW0oc2V2ZW50ZWVuX29uZXNfYnVmZi5nZXQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXZlbnRlZW5fb25lc19zaXplKTsKKyAgdWludDMyIHNldmVudGVlbl9vbmVzX3dvcmQgPSAwOworICBBU1NFUlRfVFJVRShzZXZlbnRlZW5fb25lc19zdHJlYW0uUmVhZEJpdHMoMTcsIHNldmVudGVlbl9vbmVzX3dvcmQpKTsKKyAgQVNTRVJUX0VRKHNldmVudGVlbl9vbmVzX3dvcmQsIDB4MDAwMWZmZmYpOworCisgIC8vIHNlcmlhbGl6ZSBhbGwgcG93ZXJzIG9mIHR3byBmcm9tIDJeMCB0byAyXjMxCisgIHN0ZDo6bGlzdDxib29sPiBwb3dzOworICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyArK2kpIHsKKyAgICBwb3dzLnB1c2hfYmFjayh0cnVlKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgcG93cy5wdXNoX2JhY2soZmFsc2UpOworICAgIH0KKyAgfQorICBzaXplX3QgcG93c19zaXplID0gMDsKKyAgc2NvcGVkX2FycmF5PHVpbnQ4PiBwb3dzX2J1ZmYgPSBTZXJpYWxpemVUb0J1ZmZlcihwb3dzLCB0cnVlLCBwb3dzX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0gcG93c19zdHJlYW0ocG93c19idWZmLmdldCgpLCBwb3dzX3NpemUpOworICAvLyBSZWFkQml0cygwKSBzaG91bGQgc3VjY2VlZCBhbmQgbm90IG1vZGlmeSB0aGUgdmFsdWUgb2YgdGhlIHJlZiBvdXRwdXQgb3IKKyAgLy8gaW50ZXJuYWwgYml0IGl0ZXJhdG9yCisgIHVpbnQzMiBkb250X3RvdWNoID0gMHhmZWVkZmVlZDsKKyAgQVNTRVJUX1RSVUUocG93c19zdHJlYW0uUmVhZEJpdHMoMCwgZG9udF90b3VjaCkpOworICBBU1NFUlRfRVEoZG9udF90b3VjaCwgMHhmZWVkZmVlZCk7CisgIC8vIGNvbXBhcmUgZGVzZXJpYWxpemF0aW9ucworICBmb3IgKGludCBpID0gMDsgaSA8IDMyOyArK2kpIHsKKyAgICB1aW50MzIgYml0cyA9IDA7CisgICAgQVNTRVJUX1RSVUUocG93c19zdHJlYW0uUmVhZEJpdHMoaSArIDEsIGJpdHMpKTsKKyAgICBBU1NFUlRfRVEoYml0cywgKHVpbnQzMikoMSA8PCBpKSk7CisgIH0KK30KKworVEVTVF9GKFNoZWxsUkJTUFN0cmVhbVRlc3QsIFNraXBCeXRlcykgeworICAvLyBzZXJpYWxpemUgYWxsIG5pbmUtYml0IHZhbHVlcyBmcm9tIHplcm8gdG8gNTEyCisgIHN0ZDo6bGlzdDxib29sPiBuaW5lczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MTI7ICsraSkgeworICAgIGZvciAoaW50IGogPSA4OyBqID49IDA7IC0taikgeworICAgICAgbmluZXMucHVzaF9iYWNrKChpID4+IGopICYgMSk7CisgICAgfQorICB9CisgIHNpemVfdCBuaW5lc19zaXplID0gMDsKKyAgc2NvcGVkX2FycmF5PHVpbnQ4PiBuaW5lc19idWZmID0gU2VyaWFsaXplVG9CdWZmZXIobmluZXMsIHRydWUsIG5pbmVzX3NpemUpOworICBzaXplX3QgbmluZXNfZGVzZXFfc2l6ZSA9IDA7CisgIHNjb3BlZF9hcnJheTx1aW50OD4gbmluZXNfZGVzZXFfYnVmZiA9CisgICAgICBTZXJpYWxpemVUb0J1ZmZlcihuaW5lcywgZmFsc2UsIG5pbmVzX2Rlc2VxX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0gbmluZXNfc3RyZWFtKG5pbmVzX2J1ZmYuZ2V0KCksIG5pbmVzX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0gbmluZXNfZGVzZXFfc3RyZWFtKG5pbmVzX2Rlc2VxX2J1ZmYuZ2V0KCksIG5pbmVzX2Rlc2VxX3NpemUpOworICAvLyBpdGVyYXRlIHRocm91Z2ggc3RyZWFtcywgc2tpcHBpbmcgaW4gb25lIGFuZCByZWFkaW5nIGluIHRoZSBvdGhlciwgYWx3YXlzCisgIC8vIGNvbXBhcmluZyB2YWx1ZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgNTEyOyArK2kpIHsKKyAgICBpZiAoaSAlIDIpIHsKKyAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOworICAgICAgdWludDggYml0ID0gMDsKKyAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX3N0cmVhbS5SZWFkQml0KGJpdCkpOworICAgICAgdWludDMyIG5pbmViaXRzID0gMDsKKyAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX2Rlc2VxX3N0cmVhbS5SZWFkQml0cyg5LCBuaW5lYml0cykpOworICAgICAgQVNTRVJUX0VRKG5pbmViaXRzLCBpKTsKKyAgICAgIEFTU0VSVF9FUShuaW5lYml0cyAmIDEsIGJpdCk7CisgICAgfSBlbHNlIHsKKyAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOworICAgICAgdWludDggYml0ID0gMDsKKyAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX2Rlc2VxX3N0cmVhbS5SZWFkQml0KGJpdCkpOworICAgICAgdWludDMyIG5pbmViaXRzID0gMDsKKyAgICAgIEFTU0VSVF9UUlVFKG5pbmVzX3N0cmVhbS5SZWFkQml0cyg5LCBuaW5lYml0cykpOworICAgICAgQVNTRVJUX0VRKG5pbmViaXRzLCBpKTsKKyAgICAgIEFTU0VSVF9FUShuaW5lYml0cyAmIDEsIGJpdCk7CisgICAgfQorICB9CisgIC8vIDEgdHJ1ZSBiaXQgZm9sbG93ZWQgYnkgMSBieXRlIHdpdGggMSwgZm9sbG93ZWQgYnkgMSB0cnVlIGJpdCwgdGhlbiAyIGJ5dGVzCisgIC8vIHdpdGggMiwgZm9sbG93ZWQgYnkgMSBiaXQsIHRoZW4gMyBieXRlcyB3aXRoIDMsIGV0YyB1cCB0byAyNTYKKyAgc3RkOjpsaXN0PGJvb2w+IHJ1bl9sZW5ndGg7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMjU2OyArK2kpIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgZm9yIChpbnQgayA9IDc7IGsgPj0gMDsgLS1rKSB7CisgICAgICAgIHJ1bl9sZW5ndGgucHVzaF9iYWNrKChpID4+IGspICYgMSk7CisgICAgICB9CisgICAgfQorICAgIHJ1bl9sZW5ndGgucHVzaF9iYWNrKHRydWUpOworICB9CisgIHNpemVfdCBydW5fbGVuZ3RoX3NpemUgPSAwOworICBzY29wZWRfYXJyYXk8dWludDg+IHJ1bl9sZW5ndGhfYnVmZiA9CisgICAgICBTZXJpYWxpemVUb0J1ZmZlcihydW5fbGVuZ3RoLCB0cnVlLCBydW5fbGVuZ3RoX3NpemUpOworICBzaXplX3QgcnVuX2xlbmd0aF9kZXNlcV9zaXplID0gMDsKKyAgc2NvcGVkX2FycmF5PHVpbnQ4PiBydW5fbGVuZ3RoX2Rlc2VxX2J1ZmYgPQorICAgICAgU2VyaWFsaXplVG9CdWZmZXIocnVuX2xlbmd0aCwgZmFsc2UsIHJ1bl9sZW5ndGhfZGVzZXFfc2l6ZSk7CisgIFNoZWxsUkJTUFN0cmVhbSBydW5fbGVuZ3RoX3N0cmVhbShydW5fbGVuZ3RoX2J1ZmYuZ2V0KCksIHJ1bl9sZW5ndGhfc2l6ZSk7CisgIFNoZWxsUkJTUFN0cmVhbSBydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbShydW5fbGVuZ3RoX2Rlc2VxX2J1ZmYuZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW5fbGVuZ3RoX2Rlc2VxX3NpemUpOworICAvLyByZWFkIGZpcnN0IGJpdCwgc2tpcCBmaXJzdCBieXRlIGZyb20gZWFjaCBzdHJlYW0sIHJlYWQgbmV4dCBiaXQKKyAgdWludDggYml0ID0gMDsKKyAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9zdHJlYW0uUmVhZEJpdChiaXQpKTsKKyAgQVNTRVJUX0VRKGJpdCwgMSk7CisgIGJpdCA9IDA7CisgIEFTU0VSVF9UUlVFKHJ1bl9sZW5ndGhfZGVzZXFfc3RyZWFtLlJlYWRCaXQoYml0KSk7CisgIEFTU0VSVF9FUShiaXQsIDEpOworICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOworICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOworICBiaXQgPSAwOworICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX3N0cmVhbS5SZWFkQml0KGJpdCkpOworICBBU1NFUlRfRVEoYml0LCAxKTsKKyAgYml0ID0gMDsKKyAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9kZXNlcV9zdHJlYW0uUmVhZEJpdChiaXQpKTsKKyAgQVNTRVJUX0VRKGJpdCwgMSk7CisKKyAgZm9yIChpbnQgaSA9IDI7IGkgPCAyNTY7ICsraSkgeworICAgIC8vIHJlYWQgZmlyc3QgYnl0ZSBpbiBzZXEgc3RyZWFtLCBtYWtlIHN1cmUgaXQgbWF0Y2hlcyB2YWx1ZQorICAgIHVpbnQ4IGJ5dGUgPSAwOworICAgIEFTU0VSVF9UUlVFKHJ1bl9sZW5ndGhfc3RyZWFtLlJlYWRCeXRlKGJ5dGUpKTsKKyAgICBBU1NFUlRfRVEoYnl0ZSwgaSk7CisgICAgLy8gc2tpcCB0aGUgcmVzdCBvZiB0aGUgYnl0ZSBmaWVsZAorICAgIEFTU0VSVF9UUlVFKHJ1bl9sZW5ndGhfc3RyZWFtLlNraXBCeXRlcyhpIC0gMSkpOworICAgIGJpdCA9IDA7CisgICAgLy8gcmVhZCB0aGUgc2VwYXJhdGluZyBvbmUgYml0CisgICAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9zdHJlYW0uUmVhZEJpdChiaXQpKTsKKyAgICBBU1NFUlRfRVEoYml0LCAxKTsKKyAgICAvLyByZWFkIGxhc3QgYnl0ZSBpbiBkZXNlcSBzdHJlYW0sIHNvIHNraXAgYnl0ZXMgZmlyc3QKKyAgICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoaSAtIDEpKTsKKyAgICBieXRlID0gMDsKKyAgICBBU1NFUlRfVFJVRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5SZWFkQnl0ZShieXRlKSk7CisgICAgQVNTRVJUX0VRKGJ5dGUsIGkpOworICAgIC8vIHJlYWQgdGhlIHNlcGFyYXRpbmcgb25lIGJpdAorICAgIGJpdCA9IDA7CisgICAgQVNTRVJUX1RSVUUocnVuX2xlbmd0aF9kZXNlcV9zdHJlYW0uUmVhZEJpdChiaXQpKTsKKyAgICBBU1NFUlRfRVEoYml0LCAxKTsKKyAgfQorCisgIC8vIGZ1cnRoZXIgc2tpcHMgc2hvdWxkIGZhaWwKKyAgQVNTRVJUX0ZBTFNFKHJ1bl9sZW5ndGhfc3RyZWFtLlNraXBCeXRlcygxKSk7CisgIEFTU0VSVF9GQUxTRShydW5fbGVuZ3RoX2Rlc2VxX3N0cmVhbS5Ta2lwQnl0ZXMoMSkpOworfQorCitURVNUX0YoU2hlbGxSQlNQU3RyZWFtVGVzdCwgU2tpcEJpdHMpIHsKKyAgc3RkOjpsaXN0PGJvb2w+IG9uZV9vaHM7CisgIC8vIGVuY29kZSBvbmUgMSwgZm9sbG93ZWQgYnkgb25lIHplcm8sIGZvbGxvd2VkIGJ5IDIgMXMsIGZvbGxvd2VkIGJ5IDIgemVyb3MsCisgIC8vIGV0YworICBmb3IgKGludCBpID0gMTsgaSA8PSA2NDsgKytpKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgIG9uZV9vaHMucHVzaF9iYWNrKHRydWUpOworICAgIH0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgb25lX29ocy5wdXNoX2JhY2soZmFsc2UpOworICAgIH0KKyAgfQorICBzaXplX3Qgc2tpcF9vbmVzX3NpemUgPSAwOworICBzY29wZWRfYXJyYXk8dWludDg+IHNraXBfb25lc19idWZmID0KKyAgICAgIFNlcmlhbGl6ZVRvQnVmZmVyKG9uZV9vaHMsIHRydWUsIHNraXBfb25lc19zaXplKTsKKyAgc2l6ZV90IHNraXBfb2hzX3NpemUgPSAwOworICBzY29wZWRfYXJyYXk8dWludDg+IHNraXBfb2hzX2J1ZmYgPQorICAgICAgU2VyaWFsaXplVG9CdWZmZXIob25lX29ocywgZmFsc2UsIHNraXBfb2hzX3NpemUpOworICBTaGVsbFJCU1BTdHJlYW0gc2tpcF9vbmVzKHNraXBfb25lc19idWZmLmdldCgpLCBza2lwX29uZXNfc2l6ZSk7CisgIFNoZWxsUkJTUFN0cmVhbSBza2lwX29ocyhza2lwX29oc19idWZmLmdldCgpLCBza2lwX29oc19zaXplKTsKKyAgZm9yIChpbnQgaSA9IDE7IGkgPCA2NDsgKytpKSB7CisgICAgLy8gc2tpcCB0aGUgb25lcworICAgIEFTU0VSVF9UUlVFKHNraXBfb25lcy5Ta2lwQml0cyhpKSk7CisgICAgLy8gcmVhZCB0aGUgb25lcyBmcm9tIHRoZSB6ZXJvcyBzdHJlYW0KKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7ICsraikgeworICAgICAgdWludDggYml0ID0gMDsKKyAgICAgIEFTU0VSVF9UUlVFKHNraXBfb2hzLlJlYWRCaXQoYml0KSk7CisgICAgICBBU1NFUlRfRVEoYml0LCAxKTsKKyAgICB9CisgICAgLy8gc2tpcCB0aGUgb2hzCisgICAgQVNTRVJUX1RSVUUoc2tpcF9vaHMuU2tpcEJpdHMoaSkpOworICAgIC8vIHJlYWQgdGhlIG9ocyBmcm9tIHRoZSBvbmVzIHN0cmVhbQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgaTsgKytqKSB7CisgICAgICB1aW50OCBiaXQgPSAwOworICAgICAgQVNTRVJUX1RSVUUoc2tpcF9vbmVzLlJlYWRCaXQoYml0KSk7CisgICAgICBBU1NFUlRfRVEoYml0LCAwKTsKKyAgICB9CisgIH0KK30KKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9yYW5nZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NvdXJjZV9idWZmZXJfcmFuZ2UuaAppbmRleCA0MzVkNDQzLi5iMDk3NGJhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9yYW5nZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zb3VyY2VfYnVmZmVyX3JhbmdlLmgKQEAgLTMyLDEwICszMiw3IEBACiAgIC8vIGF1ZGlvICYgdmlkZW8gc2hvdWxkIHVzZSBOT19HQVBTX0FMTE9XRUQuIERpc2NvbnRpbnVvdXMgbWVkaWEgbGlrZQogICAvLyB0aW1lZCB0ZXh0IHNob3VsZCB1c2UgQUxMT1dfR0FQUyBiZWNhdXNlIGxhcmdlIGRpZmZlcmVuY2VzIGluIHRpbWVzdGFtcHMKICAgLy8gYXJlIGNvbW1vbiBhbmQgYWNjZXB0YWJsZS4KLSAgZW51bSBHYXBQb2xpY3kgewotICAgIE5PX0dBUFNfQUxMT1dFRCwKLSAgICBBTExPV19HQVBTCi0gIH07CisgIGVudW0gR2FwUG9saWN5IHsgTk9fR0FQU19BTExPV0VELCBBTExPV19HQVBTIH07CiAKICAgLy8gU2VxdWVudGlhbCBidWZmZXJzIHdpdGggdGhlIHNhbWUgZGVjb2RlIHRpbWVzdGFtcCBtYWtlIHNlbnNlIHVuZGVyIGNlcnRhaW4KICAgLy8gY29uZGl0aW9ucywgdHlwaWNhbGx5IHdoZW4gdGhlIGZpcnN0IGJ1ZmZlciBpcyBhIGtleWZyYW1lLiBEdWUgdG8gc29tZQpAQCAtNTksOCArNTYsNyBAQAogICAvLyBlbXB0eSBhbmQgdGhlIGZyb250IG9mIHxuZXdfYnVmZmVyc3wgbXVzdCBiZSBhIGtleWZyYW1lLgogICAvLyB8cmFuZ2Vfc3RhcnRfdGltZXwgcmVmZXJzIHRvIHRoZSBzdGFydGluZyB0aW1lc3RhbXAgZm9yIHRoZSBjb2RlZCBmcmFtZQogICAvLyBncm91cCB0byB3aGljaCB0aGVzZSBidWZmZXJzIGJlbG9uZy4KLSAgU291cmNlQnVmZmVyUmFuZ2UoR2FwUG9saWN5IGdhcF9wb2xpY3ksCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlclF1ZXVlJiBuZXdfYnVmZmVycywKKyAgU291cmNlQnVmZmVyUmFuZ2UoR2FwUG9saWN5IGdhcF9wb2xpY3ksIGNvbnN0IEJ1ZmZlclF1ZXVlJiBuZXdfYnVmZmVycywKICAgICAgICAgICAgICAgICAgICAgRGVjb2RlVGltZXN0YW1wIHJhbmdlX3N0YXJ0X3RpbWUsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEludGVyYnVmZmVyRGlzdGFuY2VDQiYgaW50ZXJidWZmZXJfZGlzdGFuY2VfY2IpOwogCkBAIC0xMjYsOCArMTIyLDggQEAKICAgLy8gc3RhcnRpbmcgYXQgdGhlIGJ1ZmZlciB0aGF0IGhhZCBiZWVuIGF0IHxuZXh0X2J1ZmZlcl9pbmRleF98LgogICAvLyBSZXR1cm5zIHRydWUgaWYgZXZlcnl0aGluZyBpbiB0aGUgcmFuZ2Ugd2FzIGRlbGV0ZWQuIE90aGVyd2lzZQogICAvLyByZXR1cm5zIGZhbHNlLgotICBib29sIFRydW5jYXRlQXQoRGVjb2RlVGltZXN0YW1wIHRpbWVzdGFtcCwKLSAgICAgICAgICAgICAgICAgIEJ1ZmZlclF1ZXVlKiBkZWxldGVkX2J1ZmZlcnMsIGJvb2wgaXNfZXhjbHVzaXZlKTsKKyAgYm9vbCBUcnVuY2F0ZUF0KERlY29kZVRpbWVzdGFtcCB0aW1lc3RhbXAsIEJ1ZmZlclF1ZXVlKiBkZWxldGVkX2J1ZmZlcnMsCisgICAgICAgICAgICAgICAgICBib29sIGlzX2V4Y2x1c2l2ZSk7CiAgIC8vIERlbGV0ZXMgYWxsIGJ1ZmZlcnMgaW4gcmFuZ2UuCiAgIHZvaWQgRGVsZXRlQWxsKEJ1ZmZlclF1ZXVlKiBkZWxldGVkX2J1ZmZlcnMpOwogCkBAIC0xNDQsOSArMTQwLDkgQEAKICAgLy8gUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVycyB0byBzZWN1cmUgaWYgdGhlIGJ1ZmZlcnMgb2YKICAgLy8gW3xzdGFydF90aW1lc3RhbXB8LCB8ZW5kX3JlbW92YWxfdGltZXN0YW1wfCkgaXMgcmVtb3ZlZC4KICAgLy8gV2lsbCBub3QgdXBkYXRlIHxlbmRfcmVtb3ZhbF90aW1lc3RhbXB8IGlmIHRoZSByZXR1cm5lZCBzaXplIGlzIDAuCi0gIHNpemVfdCBHZXRSZW1vdmFsR09QKAotICAgICAgRGVjb2RlVGltZXN0YW1wIHN0YXJ0X3RpbWVzdGFtcCwgRGVjb2RlVGltZXN0YW1wIGVuZF90aW1lc3RhbXAsCi0gICAgICBzaXplX3QgYnl0ZXNfdG9fZnJlZSwgRGVjb2RlVGltZXN0YW1wKiBlbmRfcmVtb3ZhbF90aW1lc3RhbXApOworICBzaXplX3QgR2V0UmVtb3ZhbEdPUChEZWNvZGVUaW1lc3RhbXAgc3RhcnRfdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVUaW1lc3RhbXAgZW5kX3RpbWVzdGFtcCwgc2l6ZV90IGJ5dGVzX3RvX2ZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgIERlY29kZVRpbWVzdGFtcCogZW5kX3JlbW92YWxfdGltZXN0YW1wKTsKIAogICAvLyBSZXR1cm5zIHRydWUgaWZmIHRoZSBidWZmZXJlZCBlbmQgdGltZSBvZiB0aGUgZmlyc3QgR09QIGluIHRoaXMgcmFuZ2UgaXMKICAgLy8gYXQgb3IgYmVmb3JlIHxtZWRpYV90aW1lfC4KQEAgLTI0OSwxNCArMjQ1LDE0IEBACiAgIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgaW4gfGJ1ZmZlcnNffCBwb2ludGluZyB0byB0aGUgYnVmZmVyIGF0IHx0aW1lc3RhbXB8LgogICAvLyBJZiB8c2tpcF9naXZlbl90aW1lc3RhbXB8IGlzIHRydWUsIHRoaXMgcmV0dXJucyB0aGUgZmlyc3QgYnVmZmVyIHdpdGgKICAgLy8gdGltZXN0YW1wIGdyZWF0ZXIgdGhhbiB8dGltZXN0YW1wfC4KLSAgQnVmZmVyUXVldWU6Oml0ZXJhdG9yIEdldEJ1ZmZlckl0ckF0KAotICAgICAgRGVjb2RlVGltZXN0YW1wIHRpbWVzdGFtcCwgYm9vbCBza2lwX2dpdmVuX3RpbWVzdGFtcCk7CisgIEJ1ZmZlclF1ZXVlOjppdGVyYXRvciBHZXRCdWZmZXJJdHJBdChEZWNvZGVUaW1lc3RhbXAgdGltZXN0YW1wLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dpdmVuX3RpbWVzdGFtcCk7CiAKICAgLy8gUmV0dXJucyBhbiBpdGVyYXRvciBpbiB8a2V5ZnJhbWVfbWFwX3wgcG9pbnRpbmcgdG8gdGhlIG5leHQga2V5ZnJhbWUgYWZ0ZXIKICAgLy8gfHRpbWVzdGFtcHwuIElmIHxza2lwX2dpdmVuX3RpbWVzdGFtcHwgaXMgdHJ1ZSwgdGhpcyByZXR1cm5zIHRoZSBmaXJzdAogICAvLyBrZXlmcmFtZSB3aXRoIGEgdGltZXN0YW1wIHN0cmljdGx5IGdyZWF0ZXIgdGhhbiB8dGltZXN0YW1wfC4KLSAgS2V5ZnJhbWVNYXA6Oml0ZXJhdG9yIEdldEZpcnN0S2V5ZnJhbWVBdCgKLSAgICAgIERlY29kZVRpbWVzdGFtcCB0aW1lc3RhbXAsIGJvb2wgc2tpcF9naXZlbl90aW1lc3RhbXApOworICBLZXlmcmFtZU1hcDo6aXRlcmF0b3IgR2V0Rmlyc3RLZXlmcmFtZUF0KERlY29kZVRpbWVzdGFtcCB0aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBza2lwX2dpdmVuX3RpbWVzdGFtcCk7CiAKICAgLy8gUmV0dXJucyBhbiBpdGVyYXRvciBpbiB8a2V5ZnJhbWVfbWFwX3wgcG9pbnRpbmcgdG8gdGhlIGZpcnN0IGtleWZyYW1lCiAgIC8vIGJlZm9yZSBvciBhdCB8dGltZXN0YW1wfC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zb3VyY2VfYnVmZmVyX3N0YXRlLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdGF0ZS5oCmluZGV4IDJlMGQ4YzUuLmU3NjdmMDkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zb3VyY2VfYnVmZmVyX3N0YXRlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NvdXJjZV9idWZmZXJfc3RhdGUuaApAQCAtNTgsMTEgKzU4LDggQEAKICAgLy8gYXBwZW5kLiB8YXBwZW5kX3dpbmRvd19zdGFydHwgYW5kIHxhcHBlbmRfd2luZG93X2VuZHwgY29ycmVzcG9uZCB0byB0aGUgTVNFCiAgIC8vIHNwZWMncyBzaW1pbGFybHkgbmFtZWQgc291cmNlIGJ1ZmZlciBhdHRyaWJ1dGVzIHRoYXQgYXJlIHVzZWQgaW4gY29kZWQKICAgLy8gZnJhbWUgcHJvY2Vzc2luZy4KLSAgYm9vbCBBcHBlbmQoY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwKLSAgICAgICAgICAgICAgVGltZURlbHRhIGFwcGVuZF93aW5kb3dfc3RhcnQsCi0gICAgICAgICAgICAgIFRpbWVEZWx0YSBhcHBlbmRfd2luZG93X2VuZCwKLSAgICAgICAgICAgICAgVGltZURlbHRhKiB0aW1lc3RhbXBfb2Zmc2V0KTsKKyAgYm9vbCBBcHBlbmQoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCwgVGltZURlbHRhIGFwcGVuZF93aW5kb3dfc3RhcnQsCisgICAgICAgICAgICAgIFRpbWVEZWx0YSBhcHBlbmRfd2luZG93X2VuZCwgVGltZURlbHRhKiB0aW1lc3RhbXBfb2Zmc2V0KTsKIAogICAvLyBBYm9ydHMgdGhlIGN1cnJlbnQgYXBwZW5kIHNlcXVlbmNlIGFuZCByZXNldHMgdGhlIHBhcnNlci4KICAgdm9pZCBSZXNldFBhcnNlclN0YXRlKFRpbWVEZWx0YSBhcHBlbmRfd2luZG93X3N0YXJ0LApAQCAtMTIxLDggKzExOCw3IEBACiAKICAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxSYW5nZXM8VGltZURlbHRhPiA+IFJhbmdlc0xpc3Q7CiAgIHN0YXRpYyBSYW5nZXM8VGltZURlbHRhPiBDb21wdXRlUmFuZ2VzSW50ZXJzZWN0aW9uKAotICAgICAgY29uc3QgUmFuZ2VzTGlzdCYgYWN0aXZlX3JhbmdlcywKLSAgICAgIGJvb2wgZW5kZWQpOworICAgICAgY29uc3QgUmFuZ2VzTGlzdCYgYWN0aXZlX3JhbmdlcywgYm9vbCBlbmRlZCk7CiAKICAgdm9pZCBTZXRUcmFja3NXYXRjaGVyKGNvbnN0IERlbXV4ZXI6Ok1lZGlhVHJhY2tzVXBkYXRlZENCJiB0cmFja3NfdXBkYXRlZF9jYik7CiAKQEAgLTE0MSw4ICsxMzcsNyBAQAogICAvLyBlbmNvdW50ZXJlZC4KICAgLy8gUmV0dXJucyB0cnVlIG9uIGEgc3VjY2Vzc2Z1bCBjYWxsLiBSZXR1cm5zIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlCiAgIC8vIHByb2Nlc3NpbmcgZGVjb2RlciBjb25maWd1cmF0aW9ucy4KLSAgYm9vbCBPbk5ld0NvbmZpZ3Moc3RkOjpzdHJpbmcgZXhwZWN0ZWRfY29kZWNzLAotICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPE1lZGlhVHJhY2tzPiB0cmFja3MsCisgIGJvb2wgT25OZXdDb25maWdzKHN0ZDo6c3RyaW5nIGV4cGVjdGVkX2NvZGVjcywgc2NvcGVkX3B0cjxNZWRpYVRyYWNrcz4gdHJhY2tzLAogICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJlYW1QYXJzZXI6OlRleHRUcmFja0NvbmZpZ01hcCYgdGV4dF9jb25maWdzKTsKIAogICAvLyBDYWxsZWQgYnkgdGhlIHxzdHJlYW1fcGFyc2VyX3wgYXQgdGhlIGJlZ2lubmluZyBvZiBhIG5ldyBtZWRpYSBzZWdtZW50LgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3NvdXJjZV9idWZmZXJfc3RyZWFtLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uaAppbmRleCA5MzljZDlhLi4wYTMyZjYxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uaApAQCAtNDQsNyArNDQsNyBAQAogICB0eXBlZGVmIFN0cmVhbVBhcnNlcjo6QnVmZmVyUXVldWUgQnVmZmVyUXVldWU7CiAgIHR5cGVkZWYgc3RkOjpsaXN0PFNvdXJjZUJ1ZmZlclJhbmdlKj4gUmFuZ2VMaXN0OwogCi0gIFNvdXJjZUJ1ZmZlclN0cmVhbVN0YXRlKGJvb2wgc3BsaWNlX2ZyYW1lc19lbmFibGVkKQorICBleHBsaWNpdCBTb3VyY2VCdWZmZXJTdHJlYW1TdGF0ZShib29sIHNwbGljZV9mcmFtZXNfZW5hYmxlZCkKICAgICAgIDogc3BsaWNlX2ZyYW1lc19lbmFibGVkXyhzcGxpY2VfZnJhbWVzX2VuYWJsZWQpIHsKICAgICBjdXJyZW50X2NvbmZpZ19pbmRleF8gPSAwOwogICAgIGFwcGVuZF9jb25maWdfaW5kZXhfID0gMDsKQEAgLTE1NSwxOCArMTU1LDkgQEAKICAgLy8ga05lZWRCdWZmZXI6IEluZGljYXRlcyB0aGF0IHdlIG5lZWQgbW9yZSBkYXRhIGJlZm9yZSBhIGJ1ZmZlciBjYW4gYmUKICAgLy8gICAgICAgICAgICAgIHJldHVybmVkLgogICAvLyBrQ29uZmlnQ2hhbmdlOiBJbmRpY2F0ZXMgdGhhdCB0aGUgbmV4dCBidWZmZXIgcmVxdWlyZXMgYSBjb25maWcgY2hhbmdlLgotICBlbnVtIFN0YXR1cyB7Ci0gICAga1N1Y2Nlc3MsCi0gICAga05lZWRCdWZmZXIsCi0gICAga0NvbmZpZ0NoYW5nZSwKLSAgICBrRW5kT2ZTdHJlYW0KLSAgfTsKKyAgZW51bSBTdGF0dXMgeyBrU3VjY2Vzcywga05lZWRCdWZmZXIsIGtDb25maWdDaGFuZ2UsIGtFbmRPZlN0cmVhbSB9OwogCi0gIGVudW0gVHlwZSB7Ci0gICAga0F1ZGlvLAotICAgIGtWaWRlbywKLSAgICBrVGV4dAotICB9OworICBlbnVtIFR5cGUgeyBrQXVkaW8sIGtWaWRlbywga1RleHQgfTsKIAogICBTb3VyY2VCdWZmZXJTdHJlYW0oY29uc3QgQXVkaW9EZWNvZGVyQ29uZmlnJiBhdWRpb19jb25maWcsCiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nLApAQCAtMjA1LDggKzE5Niw3IEBACiAKICAgLy8gRnJlZXMgdXAgc3BhY2UgaWYgdGhlIFNvdXJjZUJ1ZmZlclN0cmVhbSBpcyB0YWtpbmcgdXAgdG9vIG11Y2ggbWVtb3J5LgogICAvLyB8bWVkaWFfdGltZXwgaXMgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbi4KLSAgYm9vbCBHYXJiYWdlQ29sbGVjdElmTmVlZGVkKERlY29kZVRpbWVzdGFtcCBtZWRpYV90aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG5ld0RhdGFTaXplKTsKKyAgYm9vbCBHYXJiYWdlQ29sbGVjdElmTmVlZGVkKERlY29kZVRpbWVzdGFtcCBtZWRpYV90aW1lLCBzaXplX3QgbmV3RGF0YVNpemUpOwogCiAgIC8vIENoYW5nZXMgdGhlIFNvdXJjZUJ1ZmZlclN0cmVhbSdzIHN0YXRlIHNvIHRoYXQgaXQgd2lsbCBzdGFydCByZXR1cm5pbmcKICAgLy8gYnVmZmVycyBzdGFydGluZyBmcm9tIHRoZSBjbG9zZXN0IGtleWZyYW1lIGJlZm9yZSB8dGltZXN0YW1wfC4KQEAgLTI2OCw5ICsyNTgsNyBAQAogICAvLyB5ZXQuCiAgIGJhc2U6OlRpbWVEZWx0YSBHZXRNYXhJbnRlcmJ1ZmZlckRpc3RhbmNlKCkgY29uc3Q7CiAKLSAgdm9pZCBzZXRfbWVtb3J5X2xpbWl0KHNpemVfdCBtZW1vcnlfbGltaXQpIHsKLSAgICBtZW1vcnlfbGltaXRfID0gbWVtb3J5X2xpbWl0OwotICB9CisgIHZvaWQgc2V0X21lbW9yeV9saW1pdChzaXplX3QgbWVtb3J5X2xpbWl0KSB7IG1lbW9yeV9saW1pdF8gPSBtZW1vcnlfbGltaXQ7IH0KIAogIHByaXZhdGU6CiAgIGZyaWVuZCBjbGFzcyBTb3VyY2VCdWZmZXJTdHJlYW1UZXN0OwpAQCAtMjgwLDggKzI2OCw3IEBACiAgIC8vIHRocm91Z2ggdGhlIGJ1ZmZlcnMuIERlbGV0ZXMgc3RhcnRpbmcgZnJvbSB0aGUgYmFjayBpZiB8cmV2ZXJzZV9kaXJlY3Rpb258CiAgIC8vIGlzIHRydWUuIHxtZWRpYV90aW1lfCBpcyBjdXJyZW50IHBsYXliYWNrIHBvc2l0aW9uLgogICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgZnJlZWQuCi0gIHNpemVfdCBGcmVlQnVmZmVycyhzaXplX3QgdG90YWxfYnl0ZXNfdG9fZnJlZSwKLSAgICAgICAgICAgICAgICAgICAgIERlY29kZVRpbWVzdGFtcCBtZWRpYV90aW1lLAorICBzaXplX3QgRnJlZUJ1ZmZlcnMoc2l6ZV90IHRvdGFsX2J5dGVzX3RvX2ZyZWUsIERlY29kZVRpbWVzdGFtcCBtZWRpYV90aW1lLAogICAgICAgICAgICAgICAgICAgICAgYm9vbCByZXZlcnNlX2RpcmVjdGlvbik7CiAKICAgLy8gQXR0ZW1wdHMgdG8gZGVsZXRlIGFwcHJveGltYXRlbHkgfHRvdGFsX2J5dGVzX3RvX2ZyZWV8IGFtb3VudCBvZiBkYXRhIGZyb20KQEAgLTMxOCw4ICszMDUsOCBAQAogCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB8c2Vjb25kX3RpbWVzdGFtcHwgaXMgdGhlIHRpbWVzdGFtcCBvZiB0aGUgbmV4dCBidWZmZXIgaW4KICAgLy8gc2VxdWVuY2UgYWZ0ZXIgfGZpcnN0X3RpbWVzdGFtcHwsIGZhbHNlIG90aGVyd2lzZS4KLSAgYm9vbCBBcmVBZGphY2VudEluU2VxdWVuY2UoCi0gICAgICBEZWNvZGVUaW1lc3RhbXAgZmlyc3RfdGltZXN0YW1wLCBEZWNvZGVUaW1lc3RhbXAgc2Vjb25kX3RpbWVzdGFtcCkgY29uc3Q7CisgIGJvb2wgQXJlQWRqYWNlbnRJblNlcXVlbmNlKERlY29kZVRpbWVzdGFtcCBmaXJzdF90aW1lc3RhbXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlY29kZVRpbWVzdGFtcCBzZWNvbmRfdGltZXN0YW1wKSBjb25zdDsKIAogICAvLyBIZWxwZXIgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgdGltZXN0YW1wIGZvciB0aGUgbmV4dCBidWZmZXIgdGhhdAogICAvLyB8c2VsZWN0ZWRfcmFuZ2VffCB3aWxsIHJldHVybiBmcm9tIEdldE5leHRCdWZmZXIoKSBjYWxsLCBvciBrTm9UaW1lc3RhbXAKQEAgLTQzMCwxMCArNDE3LDggQEAKICAgLy8gfCpkZWxldGVkX2J1ZmZlcnN8IC0gRmlsbGVkIHdpdGggYnVmZmVycyBmb3IgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24KICAgLy8gaWYgdGhlIHJlbW92YWwgcmFuZ2UgaW5jbHVkZWQgdGhlIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24uIFRoZXNlIGJ1ZmZlcnMKICAgLy8gY2FuIGJlIHVzZWQgYXMgY2FuZGlkYXRlcyBmb3IgcGxhY2luZyBpbiB0aGUgfHRyYWNrX2J1ZmZlcl98LgotICB2b2lkIFJlbW92ZUludGVybmFsKERlY29kZVRpbWVzdGFtcCBzdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICBEZWNvZGVUaW1lc3RhbXAgZW5kLAotICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZXhjbHVkZV9zdGFydCwKLSAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzKTsKKyAgdm9pZCBSZW1vdmVJbnRlcm5hbChEZWNvZGVUaW1lc3RhbXAgc3RhcnQsIERlY29kZVRpbWVzdGFtcCBlbmQsCisgICAgICAgICAgICAgICAgICAgICAgYm9vbCBleGNsdWRlX3N0YXJ0LCBCdWZmZXJRdWV1ZSogZGVsZXRlZF9idWZmZXJzKTsKIAogICAvLyBIZWxwZXIgZnVuY3Rpb24gdXNlZCBieSBSZW1vdmVJbnRlcm5hbCgpIHRvIGV2YWx1YXRlIHdoZXRoZXIgcmVtb3ZlIHdpbGwKICAgLy8gZGlzcnVwdCB0aGUgbGFzdCBhcHBlbmRlZCBHT1AuIElmIGRpc3J1cHRpb24gaXMgZXhwZWN0ZWQsIHJlc2V0IHN0YXRlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc3RyZWFtX3BhcnNlcl9mYWN0b3J5LmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvc3RyZWFtX3BhcnNlcl9mYWN0b3J5LmgKaW5kZXggZTZiNGE0ZS4uMTEzNWZmYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3N0cmVhbV9wYXJzZXJfZmFjdG9yeS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy9zdHJlYW1fcGFyc2VyX2ZhY3RvcnkuaApAQCAtMjAsOCArMjAsOCBAQAogIHB1YmxpYzoKICAgLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgc3BlY2lmaWVkIHx0eXBlfCBhbmQgfGNvZGVjc3wgbGlzdCBhcmUgc3VwcG9ydGVkLgogICAvLyBSZXR1cm5zIHRydWUgaWYgfHR5cGV8IGFuZCBhbGwgY29kZWNzIGxpc3RlZCBpbiB8Y29kZWNzfCBhcmUgc3VwcG9ydGVkLgotICBzdGF0aWMgYm9vbCBJc1R5cGVTdXBwb3J0ZWQoCi0gICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MpOworICBzdGF0aWMgYm9vbCBJc1R5cGVTdXBwb3J0ZWQoY29uc3Qgc3RkOjpzdHJpbmcmIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIGNvZGVjcyk7CiAKICAgLy8gQ3JlYXRlcyBhIG5ldyBTdHJlYW1QYXJzZXIgb2JqZWN0IGlmIHRoZSBzcGVjaWZpZWQgfHR5cGV8IGFuZCB8Y29kZWNzfCBsaXN0CiAgIC8vIGFyZSBzdXBwb3J0ZWQuIHxtZWRpYV9sb2d8IGNhbiBiZSB1c2VkIHRvIHJlcG9ydCBlcnJvcnMgaWYgdGhlcmUgaXMKQEAgLTMwLDggKzMwLDcgQEAKICAgLy8gICB8Y29kZWNzfCBhcmUgc3VwcG9ydGVkLgogICAvLyBSZXR1cm5zIE5VTEwgb3RoZXJ3aXNlLgogICBzdGF0aWMgc2NvcGVkX3B0cjxTdHJlYW1QYXJzZXI+IENyZWF0ZSgKLSAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB0eXBlLAotICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MsCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBjb2RlY3MsCiAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nKTsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy92cDhfYm9vbF9kZWNvZGVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3ZwOF9ib29sX2RlY29kZXIuY2MKaW5kZXggOTdhYTcwZS4uMmY1ZWQ5YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3ZwOF9ib29sX2RlY29kZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3ZwOF9ib29sX2RlY29kZXIuY2MKQEAgLTYxLDIxICs2MSwxNiBAQAogCiAvLyBUaGUgbnVtYmVyIG9mIGxlYWRpbmcgemVyb3MuCiBzdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVnA4Tm9ybVsyNTZdID0gewotICAgIDAsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gICAgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywgMywKLSAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLAotICAgIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsIDIsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0gICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLSAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDcsIDYsIDYsIDUsIDUsIDUsIDUsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDMsIDMsIDMsIDMsIDMsIDMsIDMsIDMsCisgICAgMywgMywgMywgMywgMywgMywgMywgMywgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwgMiwKKyAgICAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAorICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCisgICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKKyAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCiAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy92cDhfcGFyc2VyLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvdnA4X3BhcnNlci5oCmluZGV4IDA4Y2UzYTcuLjYyOTM2NGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy92cDhfcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3ZwOF9wYXJzZXIuaApAQCAtMTc0LDggKzE3NCw3IEBACiAgIGJvb2wgUGFyc2VMb29wRmlsdGVySGVhZGVyKGJvb2wga2V5ZnJhbWUpOwogICBib29sIFBhcnNlUXVhbnRpemF0aW9uSGVhZGVyKFZwOFF1YW50aXphdGlvbkhlYWRlciogcWhkcik7CiAgIGJvb2wgUGFyc2VUb2tlblByb2JzKFZwOEVudHJvcHlIZWFkZXIqIGVoZHIsIGJvb2wgdXBkYXRlX2N1cnJfcHJvYnMpOwotICBib29sIFBhcnNlSW50cmFQcm9icyhWcDhFbnRyb3B5SGVhZGVyKiBlaGRyLAotICAgICAgICAgICAgICAgICAgICAgICBib29sIHVwZGF0ZV9jdXJyX3Byb2JzLAorICBib29sIFBhcnNlSW50cmFQcm9icyhWcDhFbnRyb3B5SGVhZGVyKiBlaGRyLCBib29sIHVwZGF0ZV9jdXJyX3Byb2JzLAogICAgICAgICAgICAgICAgICAgICAgICBib29sIGtleWZyYW1lKTsKICAgYm9vbCBQYXJzZU1WUHJvYnMoVnA4RW50cm9weUhlYWRlciogZWhkciwgYm9vbCB1cGRhdGVfY3Vycl9wcm9icyk7CiAgIGJvb2wgUGFyc2VQYXJ0aXRpb25zKFZwOEZyYW1lSGVhZGVyKiBmaGRyKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy92cDlfY29tcHJlc3NlZF9oZWFkZXJfcGFyc2VyLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvdnA5X2NvbXByZXNzZWRfaGVhZGVyX3BhcnNlci5oCmluZGV4IGY3MTAxYjguLmUyN2E2NWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy92cDlfY29tcHJlc3NlZF9oZWFkZXJfcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3ZwOV9jb21wcmVzc2VkX2hlYWRlcl9wYXJzZXIuaApAQCAtMjMsNyArMjMsNyBAQAogICB1aW50OF90IERlY29kZVRlcm1TdWJleHAoKTsKICAgdm9pZCBEaWZmVXBkYXRlUHJvYihWcDlQcm9iKiBwcm9iKTsKICAgdGVtcGxhdGUgPGludCBOPgotICB2b2lkIERpZmZVcGRhdGVQcm9iQXJyYXkoVnA5UHJvYiAoJnByb2JfYXJyYXkpW05dKTsKKyAgdm9pZCBEaWZmVXBkYXRlUHJvYkFycmF5KFZwOVByb2IoJnByb2JfYXJyYXkpW05dKTsKICAgdm9pZCBSZWFkVHhNb2RlUHJvYnMoVnA5RnJhbWVDb250ZXh0KiBmcmFtZV9jb250ZXh0KTsKICAgdm9pZCBSZWFkQ29lZlByb2JzKFZwOUZyYW1lSGVhZGVyKiBmaGRyKTsKICAgdm9pZCBSZWFkU2tpcFByb2IoVnA5RnJhbWVDb250ZXh0KiBmcmFtZV9jb250ZXh0KTsKQEAgLTM4LDcgKzM4LDcgQEAKICAgICAgICAgICAgICAgICAgICBWcDlGcmFtZUNvbnRleHQqIGZyYW1lX2NvbnRleHQpOwogICB2b2lkIFVwZGF0ZU12UHJvYihWcDlQcm9iKiBwcm9iKTsKICAgdGVtcGxhdGUgPGludCBOPgotICB2b2lkIFVwZGF0ZU12UHJvYkFycmF5KFZwOVByb2IgKCZwcm9iX2FycmF5KVtOXSk7CisgIHZvaWQgVXBkYXRlTXZQcm9iQXJyYXkoVnA5UHJvYigmcHJvYl9hcnJheSlbTl0pOwogCiAgIC8vIEJvb2wgZGVjb2RlciBmb3IgY29tcHJlc3NlZCBmcmFtZSBoZWFkZXIuCiAgIFZwOUJvb2xEZWNvZGVyIHJlYWRlcl87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvdnA5X3BhcnNlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3ZwOV9wYXJzZXIuaAppbmRleCBlMDNmMWQxLi5mM2Y3NmVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvdnA5X3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy92cDlfcGFyc2VyLmgKQEAgLTExOSw4ICsxMTksOCBAQAogICBpbnQ4X3QgbW9kZV9kZWx0YXNba051bU1vZGVEZWx0YXNdOwogCiAgIC8vIENhbGN1bGF0ZWQgZnJvbSBhYm92ZSBmaWVsZHMuCi0gIHVpbnQ4X3QgbHZsW1ZwOVNlZ21lbnRhdGlvblBhcmFtczo6a051bVNlZ21lbnRzXVtWUDlfRlJBTUVfTUFYXQotICAgICAgICAgICAgIFtrTnVtTW9kZURlbHRhc107CisgIHVpbnQ4X3QKKyAgICAgIGx2bFtWcDlTZWdtZW50YXRpb25QYXJhbXM6OmtOdW1TZWdtZW50c11bVlA5X0ZSQU1FX01BWF1ba051bU1vZGVEZWx0YXNdOwogfTsKIAogLy8gTWVtYmVycyBvZiBWcDlGcmFtZUhlYWRlciB3aWxsIGJlIDAtaW5pdGlhbGl6ZWQgYnkgVnA5UGFyc2VyOjpQYXJzZU5leHRGcmFtZS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy93ZWJ2dHRfdXRpbC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3dlYnZ0dF91dGlsLmgKaW5kZXggMTlmZWExZC4uMTJiYzAzYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3dlYnZ0dF91dGlsLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3dlYnZ0dF91dGlsLmgKQEAgLTEzLDEwICsxMyw3IEBACiAKIC8vIFV0aWxpdHkgZnVuY3Rpb24gdG8gY3JlYXRlIHNpZGUgZGF0YSBpdGVtIGZvciBkZWNvZGVyIGJ1ZmZlci4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotdm9pZCBNYWtlU2lkZURhdGEoVCBpZF9iZWdpbiwKLSAgICAgICAgICAgICAgICAgIFQgaWRfZW5kLAotICAgICAgICAgICAgICAgICAgVCBzZXR0aW5nc19iZWdpbiwKLSAgICAgICAgICAgICAgICAgIFQgc2V0dGluZ3NfZW5kLAordm9pZCBNYWtlU2lkZURhdGEoVCBpZF9iZWdpbiwgVCBpZF9lbmQsIFQgc2V0dGluZ3NfYmVnaW4sIFQgc2V0dGluZ3NfZW5kLAogICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIHNpZGVfZGF0YSkgewogICAvLyBUaGUgRGVjb2RlckJ1ZmZlciBvbmx5IHN1cHBvcnRzIGEgc2luZ2xlIHNpZGUgZGF0YSBpdGVtLiBJbiB0aGUgY2FzZSBvZgogICAvLyBhIFdlYlZUVCBjdWUsIHdlIGNhbiBoYXZlIHBvdGVudGlhbGx5IHR3byBzaWRlIGRhdGEgaXRlbXMuIEluIG9yZGVyIHRvCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvd3NvbGFfaW50ZXJuYWxzLmggYi9zcmMvY29iYWx0L21lZGlhL2ZpbHRlcnMvd3NvbGFfaW50ZXJuYWxzLmgKaW5kZXggNWE2OGY4Yi4uOTA3YjBmOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9maWx0ZXJzL3dzb2xhX2ludGVybmFscy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZmlsdGVycy93c29sYV9pbnRlcm5hbHMuaApAQCAtMjIsMTIgKzIyLDkgQEAKIC8vIERvdC1wcm9kdWN0IG9mIGNoYW5uZWxzIG9mIHR3byBBdWRpb0J1cy4gRm9yIGVhY2ggQXVkaW9CdXMgYW4gb2Zmc2V0IGlzCiAvLyBnaXZlbi4gfGRvdF9wcm9kdWN0W2tdfCBpcyB0aGUgZG90LXByb2R1Y3Qgb2YgY2hhbm5lbCB8a3wuIFRoZSBjYWxsZXIgc2hvdWxkCiAvLyBhbGxvY2F0ZSBzdWZmaWNpZW50IHNwYWNlIGZvciB8ZG90X3Byb2R1Y3R8LgotTUVESUFfRVhQT1JUIHZvaWQgTXVsdGlDaGFubmVsRG90UHJvZHVjdChjb25zdCBBdWRpb0J1cyogYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX29mZnNldF9hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0J1cyogYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lX29mZnNldF9iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtX2ZyYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQqIGRvdF9wcm9kdWN0KTsKK01FRElBX0VYUE9SVCB2b2lkIE11bHRpQ2hhbm5lbERvdFByb2R1Y3QoY29uc3QgQXVkaW9CdXMqIGEsIGludCBmcmFtZV9vZmZzZXRfYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIGIsIGludCBmcmFtZV9vZmZzZXRfYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bV9mcmFtZXMsIGZsb2F0KiBkb3RfcHJvZHVjdCk7CiAKIC8vIEVuZXJnaWVzIG9mIHNsaWRpbmcgd2luZG93cyBvZiBjaGFubmVscyBhcmUgaW50ZXJsZWF2ZWQuCiAvLyBUaGUgbnVtYmVyIHdpbmRvd3MgaXMgfGlucHV0LT5mcmFtZXMoKXwgLSAofGZyYW1lc19wZXJfd2luZG93fCAtIDEpLCBoZW5jZSwKQEAgLTQyLDE2ICszOSwxNCBAQAogLy8gICBmKDApID0geVsxXQogLy8gICBmKDEpID0geVsyXQogLy8gYW5kIHJldHVybiB0aGUgbWF4aW11bSwgYXNzdW1pbmcgdGhhdCB5WzBdIDw9IHlbMV0gPj0geVsyXS4KLU1FRElBX0VYUE9SVCB2b2lkIFF1YWRyYXRpY0ludGVycG9sYXRpb24oY29uc3QgZmxvYXQqIHlfdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXh0cmVtdW0sCitNRURJQV9FWFBPUlQgdm9pZCBRdWFkcmF0aWNJbnRlcnBvbGF0aW9uKGNvbnN0IGZsb2F0KiB5X3ZhbHVlcywgZmxvYXQqIGV4dHJlbXVtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCogZXh0cmVtdW1fdmFsdWUpOwogCiAvLyBTZWFyY2ggYSBzdWJzZXQgb2YgYWxsIGNhbmRpZCBibG9ja3MuIFRoZSBzZWFyY2ggaXMgcGVyZm9ybWVkIGV2ZXJ5CiAvLyB8ZGVjaW1hdGlvbnwgZnJhbWVzLiBUaGlzIHJlZHVjZXMgY29tcGxleGl0eSBieSBhIGZhY3RvciBvZiBhYm91dAogLy8gMSAvIHxkZWNpbWF0aW9ufC4gQSBjdWJpYyBpbnRlcnBvbGF0aW9uIGlzIHVzZWQgdG8gaGF2ZSBhIGJldHRlciBlc3RpbWF0ZSBvZgogLy8gdGhlIGJlc3QgbWF0Y2guCi1NRURJQV9FWFBPUlQgaW50IERlY2ltYXRlZFNlYXJjaChpbnQgZGVjaW1hdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsIGV4Y2x1ZGVfaW50ZXJ2YWwsCitNRURJQV9FWFBPUlQgaW50IERlY2ltYXRlZFNlYXJjaChpbnQgZGVjaW1hdGlvbiwgSW50ZXJ2YWwgZXhjbHVkZV9pbnRlcnZhbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvQnVzKiB0YXJnZXRfYmxvY2ssCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0J1cyogc2VhcmNoX3NlZ21lbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBmbG9hdCogZW5lcmd5X3RhcmdldF9ibG9jaywKQEAgLTYxLDggKzU2LDcgQEAKIC8vIGlzIG1vc3Qgc2ltaWxhciB0byB8dGFyZ2V0X2Jsb2NrfC4gfGVuZXJneV90YXJnZXRfYmxvY2t8IGlzIHRoZSBlbmVyZ3kgb2YgdGhlCiAvLyB8dGFyZ2V0X2Jsb2NrfC4gfGVuZXJneV9jYW5kaWRhdGVfYmxvY2tzfCBpcyB0aGUgZW5lcmd5IG9mIGFsbCBibG9ja3Mgd2l0aGluCiAvLyB8c2VhcmNoX2Jsb2NrfC4KLU1FRElBX0VYUE9SVCBpbnQgRnVsbFNlYXJjaChpbnQgbG93X2xpbWl0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoaWdodF9saW1pbWl0LAorTUVESUFfRVhQT1JUIGludCBGdWxsU2VhcmNoKGludCBsb3dfbGltaXQsIGludCBoaWdodF9saW1pbWl0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVydmFsIGV4Y2x1ZGVfaW50ZXJ2YWwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXVkaW9CdXMqIHRhcmdldF9ibG9jaywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBdWRpb0J1cyogc2VhcmNoX2Jsb2NrLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL2NvbW1vbi9zdHJlYW1fcGFyc2VyX3Rlc3RfYmFzZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL2NvbW1vbi9zdHJlYW1fcGFyc2VyX3Rlc3RfYmFzZS5oCmluZGV4IDJkYzkyMzAuLmMwMTY1YmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9jb21tb24vc3RyZWFtX3BhcnNlcl90ZXN0X2Jhc2UuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvY29tbW9uL3N0cmVhbV9wYXJzZXJfdGVzdF9iYXNlLmgKQEAgLTU2LDggKzU2LDcgQEAKICAgfQogCiAgcHJpdmF0ZToKLSAgYm9vbCBBcHBlbmREYXRhSW5QaWVjZXMoY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbmd0aCwKKyAgYm9vbCBBcHBlbmREYXRhSW5QaWVjZXMoY29uc3QgdWludDhfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHBpZWNlX3NpemUpOwogICB2b2lkIE9uSW5pdERvbmUoY29uc3QgU3RyZWFtUGFyc2VyOjpJbml0UGFyYW1ldGVycyYgcGFyYW1zKTsKICAgYm9vbCBPbk5ld0NvbmZpZyhzdGQ6OnVuaXF1ZV9wdHI8TWVkaWFUcmFja3M+IHRyYWNrcywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L2VzX2FkYXB0ZXJfdmlkZW8uaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L2VzX2FkYXB0ZXJfdmlkZW8uaAppbmRleCA0NDc4NmNkLi4wNWM5MGJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9lc19hZGFwdGVyX3ZpZGVvLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvZXNfYWRhcHRlcl92aWRlby5oCkBAIC0zNiw5ICszNiw4IEBACiAgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBWaWRlb0RlY29kZXJDb25maWcmKT4gTmV3VmlkZW9Db25maWdDQjsKICAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPik+IEVtaXRCdWZmZXJDQjsKIAotICBFc0FkYXB0ZXJWaWRlbygKLSAgICAgIGNvbnN0IE5ld1ZpZGVvQ29uZmlnQ0ImIG5ld192aWRlb19jb25maWdfY2IsCi0gICAgICBjb25zdCBFbWl0QnVmZmVyQ0ImIGVtaXRfYnVmZmVyX2NiKTsKKyAgRXNBZGFwdGVyVmlkZW8oY29uc3QgTmV3VmlkZW9Db25maWdDQiYgbmV3X3ZpZGVvX2NvbmZpZ19jYiwKKyAgICAgICAgICAgICAgICAgY29uc3QgRW1pdEJ1ZmZlckNCJiBlbWl0X2J1ZmZlcl9jYik7CiAgIH5Fc0FkYXB0ZXJWaWRlbygpOwogCiAgIC8vIEZvcmNlIHRoZSBlbWlzc2lvbiBvZiB0aGUgcGVuZGluZyB2aWRlbyBidWZmZXJzLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvZXNfcGFyc2VyLmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9lc19wYXJzZXIuaAppbmRleCA1OTczZGE2Li5iNWNjNmIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9lc19wYXJzZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9lc19wYXJzZXIuaApAQCAtMzQsOSArMzQsNyBAQAogCiAgIC8vIEVTIHBhcnNpbmcuCiAgIC8vIFNob3VsZCB1c2Uga05vVGltZXN0YW1wIHdoZW4gYSB0aW1lc3RhbXAgaXMgbm90IHZhbGlkLgotICBib29sIFBhcnNlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKLSAgICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgcHRzLAorICBib29sIFBhcnNlKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IHNpemUsIGJhc2U6OlRpbWVEZWx0YSBwdHMsCiAgICAgICAgICAgICAgRGVjb2RlVGltZXN0YW1wIGR0cyk7CiAKICAgLy8gRmx1c2ggYW55IHBlbmRpbmcgYnVmZmVyLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvZXNfcGFyc2VyX2FkdHMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L2VzX3BhcnNlcl9hZHRzLmgKaW5kZXggZDVhZWEyYy4uY2JiNGM2OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvZXNfcGFyc2VyX2FkdHMuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9lc19wYXJzZXJfYWR0cy5oCkBAIC0zNSw4ICszNSw3IEBACiAgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChjb25zdCBBdWRpb0RlY29kZXJDb25maWcmKT4gTmV3QXVkaW9Db25maWdDQjsKIAogICBFc1BhcnNlckFkdHMoY29uc3QgTmV3QXVkaW9Db25maWdDQiYgbmV3X2F1ZGlvX2NvbmZpZ19jYiwKLSAgICAgICAgICAgICAgIGNvbnN0IEVtaXRCdWZmZXJDQiYgZW1pdF9idWZmZXJfY2IsCi0gICAgICAgICAgICAgICBib29sIHNicl9pbl9taW1ldHlwZSk7CisgICAgICAgICAgICAgICBjb25zdCBFbWl0QnVmZmVyQ0ImIGVtaXRfYnVmZmVyX2NiLCBib29sIHNicl9pbl9taW1ldHlwZSk7CiAgIH5Fc1BhcnNlckFkdHMoKSBvdmVycmlkZTsKIAogICAvLyBFc1BhcnNlciBpbXBsZW1lbnRhdGlvbi4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L2VzX3BhcnNlcl9oMjY0LmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9lc19wYXJzZXJfaDI2NC5oCmluZGV4IDVjNGM2NjYuLjkxYzRiYTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L2VzX3BhcnNlcl9oMjY0LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvZXNfcGFyc2VyX2gyNjQuaApAQCAtNjMsMTAgKzYzLDggQEAKIAogICAvLyBFbWl0IGEgZnJhbWUgd2hvc2UgcG9zaXRpb24gaW4gdGhlIEVTIHF1ZXVlIHN0YXJ0cyBhdCB8YWNjZXNzX3VuaXRfcG9zfC4KICAgLy8gUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIGlmIG5vIFBUUyBpcyBhdmFpbGFibGUgZm9yIHRoZSBmcmFtZS4KLSAgYm9vbCBFbWl0RnJhbWUoaW50NjRfdCBhY2Nlc3NfdW5pdF9wb3MsCi0gICAgICAgICAgICAgICAgIGludCBhY2Nlc3NfdW5pdF9zaXplLAotICAgICAgICAgICAgICAgICBib29sIGlzX2tleV9mcmFtZSwKLSAgICAgICAgICAgICAgICAgaW50IHBwc19pZCk7CisgIGJvb2wgRW1pdEZyYW1lKGludDY0X3QgYWNjZXNzX3VuaXRfcG9zLCBpbnQgYWNjZXNzX3VuaXRfc2l6ZSwKKyAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlfZnJhbWUsIGludCBwcHNfaWQpOwogCiAgIC8vIFVwZGF0ZSB0aGUgdmlkZW8gZGVjb2RlciBjb25maWcgYmFzZWQgb24gYW4gSDI2NCBTUFMuCiAgIC8vIFJldHVybiB0cnVlIGlmIHN1Y2Nlc3NmdWwuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9tcDJ0X2NvbW1vbi5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvbXAydF9jb21tb24uaAppbmRleCAwZTEwNTAxLi5jY2MxYzhjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC9tcDJ0X2NvbW1vbi5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L21wMnRfY29tbW9uLmgKQEAgLTUsMjMgKzUsMjMgQEAKICNpZm5kZWYgQ09CQUxUX01FRElBX0ZPUk1BVFNfTVAyVF9NUDJUX0NPTU1PTl9IXwogI2RlZmluZSBDT0JBTFRfTUVESUFfRk9STUFUU19NUDJUX01QMlRfQ09NTU9OX0hfCiAKLSNkZWZpbmUgTE9HX0xFVkVMX1RTICA1CisjZGVmaW5lIExPR19MRVZFTF9UUyA1CiAjZGVmaW5lIExPR19MRVZFTF9QRVMgNAotI2RlZmluZSBMT0dfTEVWRUxfRVMgIDMKKyNkZWZpbmUgTE9HX0xFVkVMX0VTIDMKIAotI2RlZmluZSBSQ0hFQ0soeCkgXAotICAgIGRvIHsgXAotICAgICAgaWYgKCEoeCkpIHsgXAotICAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsdXJlIHdoaWxlIHBhcnNpbmcgTXBlZzJUUzogIiA8PCAjeDsgXAotICAgICAgICByZXR1cm4gZmFsc2U7IFwKLSAgICAgIH0gXAotICAgIH0gd2hpbGUgKDApCisjZGVmaW5lIFJDSEVDSyh4KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoISh4KSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGYWlsdXJlIHdoaWxlIHBhcnNpbmcgTXBlZzJUUzogIiA8PCAjeDsgXAorICAgICAgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIH0gd2hpbGUgKDApCiAKIG5hbWVzcGFjZSBtZWRpYSB7CiBuYW1lc3BhY2UgbXAydCB7CiBjb25zdCBpbnQga01wMnRBdWRpb1RyYWNrSWQgPSAxOwogY29uc3QgaW50IGtNcDJ0VmlkZW9UcmFja0lkID0gMjsKLX0gIC8vIG5hbWVzcGFjZSBtZWRpYQogfSAgLy8gbmFtZXNwYWNlIG1wMnQKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQogCiAjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9GT1JNQVRTX01QMlRfTVAyVF9DT01NT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L21wMnRfc3RyZWFtX3BhcnNlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvbXAydF9zdHJlYW1fcGFyc2VyLmgKaW5kZXggYTBlYmVlMC4uYmRkM2RiYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvbXAydF9zdHJlYW1fcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvbXAydF9zdHJlYW1fcGFyc2VyLmgKQEAgLTM0LDEwICszNCw4IEBACiAgIH5NcDJ0U3RyZWFtUGFyc2VyKCkgb3ZlcnJpZGU7CiAKICAgLy8gU3RyZWFtUGFyc2VyIGltcGxlbWVudGF0aW9uLgotICB2b2lkIEluaXQoY29uc3QgSW5pdENCJiBpbml0X2NiLAotICAgICAgICAgICAgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKLSAgICAgICAgICAgIGNvbnN0IE5ld0J1ZmZlcnNDQiYgbmV3X2J1ZmZlcnNfY2IsCi0gICAgICAgICAgICBib29sIGlnbm9yZV90ZXh0X3RyYWNrcywKKyAgdm9pZCBJbml0KGNvbnN0IEluaXRDQiYgaW5pdF9jYiwgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKKyAgICAgICAgICAgIGNvbnN0IE5ld0J1ZmZlcnNDQiYgbmV3X2J1ZmZlcnNfY2IsIGJvb2wgaWdub3JlX3RleHRfdHJhY2tzLAogICAgICAgICAgICAgY29uc3QgRW5jcnlwdGVkTWVkaWFJbml0RGF0YUNCJiBlbmNyeXB0ZWRfbWVkaWFfaW5pdF9kYXRhX2NiLAogICAgICAgICAgICAgY29uc3QgTmV3TWVkaWFTZWdtZW50Q0ImIG5ld19zZWdtZW50X2NiLAogICAgICAgICAgICAgY29uc3QgRW5kTWVkaWFTZWdtZW50Q0ImIGVuZF9vZl9zZWdtZW50X2NiLApAQCAtNDcsOCArNDUsNyBAQAogCiAgcHJpdmF0ZToKICAgc3RydWN0IEJ1ZmZlclF1ZXVlV2l0aENvbmZpZyB7Ci0gICAgQnVmZmVyUXVldWVXaXRoQ29uZmlnKGJvb2wgaXNfY2ZnX3NlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEF1ZGlvRGVjb2RlckNvbmZpZyYgYXVkaW9fY2ZnLAorICAgIEJ1ZmZlclF1ZXVlV2l0aENvbmZpZyhib29sIGlzX2NmZ19zZW50LCBjb25zdCBBdWRpb0RlY29kZXJDb25maWcmIGF1ZGlvX2NmZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVmlkZW9EZWNvZGVyQ29uZmlnJiB2aWRlb19jZmcpOwogICAgIEJ1ZmZlclF1ZXVlV2l0aENvbmZpZyhjb25zdCBCdWZmZXJRdWV1ZVdpdGhDb25maWcmIG90aGVyKTsKICAgICB+QnVmZmVyUXVldWVXaXRoQ29uZmlnKCk7CkBAIC04OCwxMSArODUsOSBAQAogICAvLyBDYWxsYmFjayBpbnZva2VkIGJ5IHRoZSBFUyBzdHJlYW0gcGFyc2VyCiAgIC8vIHRvIGVtaXQgYSBuZXcgYXVkaW8vdmlkZW8gYWNjZXNzIHVuaXQuCiAgIHZvaWQgT25FbWl0QXVkaW9CdWZmZXIoCi0gICAgICBpbnQgcGVzX3BpZCwKLSAgICAgIHNjb3BlZF9yZWZwdHI8U3RyZWFtUGFyc2VyQnVmZmVyPiBzdHJlYW1fcGFyc2VyX2J1ZmZlcik7CisgICAgICBpbnQgcGVzX3BpZCwgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IHN0cmVhbV9wYXJzZXJfYnVmZmVyKTsKICAgdm9pZCBPbkVtaXRWaWRlb0J1ZmZlcigKLSAgICAgIGludCBwZXNfcGlkLAotICAgICAgc2NvcGVkX3JlZnB0cjxTdHJlYW1QYXJzZXJCdWZmZXI+IHN0cmVhbV9wYXJzZXJfYnVmZmVyKTsKKyAgICAgIGludCBwZXNfcGlkLCBzY29wZWRfcmVmcHRyPFN0cmVhbVBhcnNlckJ1ZmZlcj4gc3RyZWFtX3BhcnNlcl9idWZmZXIpOwogICBib29sIEVtaXRSZW1haW5pbmdCdWZmZXJzKCk7CiAKICAgLy8gTGlzdCBvZiBjYWxsYmFja3MuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC90c19wYWNrZXQuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L3RzX3BhY2tldC5oCmluZGV4IDUzMGFmMDAuLjc2NTc5ZTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L3RzX3BhY2tldC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L3RzX3BhY2tldC5oCkBAIC00OSw4ICs0OSw3IEBACiAgIC8vIFBhcnNlIGFuIE1wZWcyIFRTIGhlYWRlci4KICAgLy8gVGhlIGJ1ZmZlciBzaXplIHNob3VsZCBiZSBhdCBsZWFzdCB8a1BhY2tldFNpemV8CiAgIGJvb2wgUGFyc2VIZWFkZXIoY29uc3QgdWludDhfdCogYnVmKTsKLSAgYm9vbCBQYXJzZUFkYXB0YXRpb25GaWVsZChCaXRSZWFkZXIqIGJpdF9yZWFkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFkYXB0YXRpb25fZmllbGRfbGVuZ3RoKTsKKyAgYm9vbCBQYXJzZUFkYXB0YXRpb25GaWVsZChCaXRSZWFkZXIqIGJpdF9yZWFkZXIsIGludCBhZGFwdGF0aW9uX2ZpZWxkX2xlbmd0aCk7CiAKICAgLy8gU2l6ZSBvZiB0aGUgcGF5bG9hZC4KICAgY29uc3QgdWludDhfdCogcGF5bG9hZF87CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC90c19zZWN0aW9uLmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC90c19zZWN0aW9uLmgKaW5kZXggY2MwNWMyZi4uOTg1NjA3NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvdHNfc2VjdGlvbi5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L3RzX3NlY3Rpb24uaApAQCAtMjUsOCArMjUsNyBAQAogCiAgIC8vIFBhcnNlIHRoZSBkYXRhIGJ5dGVzIG9mIHRoZSBUUyBwYWNrZXQuCiAgIC8vIFJldHVybiB0cnVlIGlmIHBhcnNpbmcgaXMgc3VjY2Vzc2Z1bC4KLSAgdmlydHVhbCBib29sIFBhcnNlKGJvb2wgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKKyAgdmlydHVhbCBib29sIFBhcnNlKGJvb2wgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgY29uc3QgdWludDhfdCogYnVmLAogICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpID0gMDsKIAogICAvLyBQcm9jZXNzIGJ5dGVzIHRoYXQgaGF2ZSBub3QgYmVlbiBwcm9jZXNzZWQgeWV0IChwZW5kaW5nIGJ1ZmZlcnMgaW4gdGhlCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC90c19zZWN0aW9uX3Blcy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvdHNfc2VjdGlvbl9wZXMuaAppbmRleCBmZTFiNmZlLi43Mzk1MzRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC90c19zZWN0aW9uX3Blcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L3RzX3NlY3Rpb25fcGVzLmgKQEAgLTI3LDggKzI3LDcgQEAKICAgflRzU2VjdGlvblBlcygpIG92ZXJyaWRlOwogCiAgIC8vIFRzU2VjdGlvbiBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBQYXJzZShib29sIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsCi0gICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmLAorICBib29sIFBhcnNlKGJvb2wgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgY29uc3QgdWludDhfdCogYnVmLAogICAgICAgICAgICAgIGludCBzaXplKSBvdmVycmlkZTsKICAgdm9pZCBGbHVzaCgpIG92ZXJyaWRlOwogICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC90c19zZWN0aW9uX3BzaS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wMnQvdHNfc2VjdGlvbl9wc2kuaAppbmRleCBjNWNiNGJiLi4wN2MxNGE5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXAydC90c19zZWN0aW9uX3BzaS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDJ0L3RzX3NlY3Rpb25fcHNpLmgKQEAgLTI0LDggKzI0LDcgQEAKICAgflRzU2VjdGlvblBzaSgpIG92ZXJyaWRlOwogCiAgIC8vIFRzU2VjdGlvbiBpbXBsZW1lbnRhdGlvbi4KLSAgYm9vbCBQYXJzZShib29sIHBheWxvYWRfdW5pdF9zdGFydF9pbmRpY2F0b3IsCi0gICAgICAgICAgICAgY29uc3QgdWludDhfdCogYnVmLAorICBib29sIFBhcnNlKGJvb2wgcGF5bG9hZF91bml0X3N0YXJ0X2luZGljYXRvciwgY29uc3QgdWludDhfdCogYnVmLAogICAgICAgICAgICAgIGludCBzaXplKSBvdmVycmlkZTsKICAgdm9pZCBGbHVzaCgpIG92ZXJyaWRlOwogICB2b2lkIFJlc2V0KCkgb3ZlcnJpZGU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2F2Yy5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wNC9hdmMuaAppbmRleCA1OWJiNDc1Li44ZDcwMGFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2F2Yy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYXZjLmgKQEAgLTM1LDggKzM1LDcgQEAKICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBwYXJhbSBzZXRzIHdlcmUgc3VjY2Vzc2Z1bGx5IGluc2VydGVkLgogICBzdGF0aWMgYm9vbCBJbnNlcnRQYXJhbVNldHNBbm5leEIoCiAgICAgICBjb25zdCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCYgYXZjX2NvbmZpZywKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBidWZmZXIsCi0gICAgICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4qIHN1YnNhbXBsZXMpOworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGJ1ZmZlciwgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KiBzdWJzYW1wbGVzKTsKIAogICBzdGF0aWMgYm9vbCBDb252ZXJ0Q29uZmlnVG9Bbm5leEIoCiAgICAgICBjb25zdCBBVkNEZWNvZGVyQ29uZmlndXJhdGlvblJlY29yZCYgYXZjX2NvbmZpZywKQEAgLTUxLDggKzUwLDcgQEAKICAgLy8gQysrMTEncyBzdGQ6OnZlY3RvcjxUPjo6ZGF0YSgpIG1ldGhvZC4KICAgc3RhdGljIGJvb2wgSXNWYWxpZEFubmV4Qihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5PiYgc3Vic2FtcGxlcyk7Ci0gIHN0YXRpYyBib29sIElzVmFsaWRBbm5leEIoY29uc3QgdWludDhfdCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICBzdGF0aWMgYm9vbCBJc1ZhbGlkQW5uZXhCKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+JiBzdWJzYW1wbGVzKTsKIAogICAvLyBHaXZlbiBhIHxidWZmZXJ8IGFuZCB8c3Vic2FtcGxlc3wgaW5mb3JtYXRpb24gYW5kIHxwdHN8IHBvaW50ZXIgaW50byB0aGUKQEAgLTcyLDggKzcwLDcgQEAKICAgICAgIHNjb3BlZF9wdHI8QVZDRGVjb2RlckNvbmZpZ3VyYXRpb25SZWNvcmQ+IGF2Y19jb25maWcpOwogCiAgIC8vIEJpdHN0cmVhbUNvbnZlcnRlciBpbnRlcmZhY2UKLSAgYm9vbCBDb252ZXJ0RnJhbWUoc3RkOjp2ZWN0b3I8dWludDhfdD4qIGZyYW1lX2J1ZiwKLSAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSwKKyAgYm9vbCBDb252ZXJ0RnJhbWUoc3RkOjp2ZWN0b3I8dWludDhfdD4qIGZyYW1lX2J1ZiwgYm9vbCBpc19rZXlmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KiBzdWJzYW1wbGVzKSBjb25zdCBPVkVSUklERTsKIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2JpdHN0cmVhbV9jb252ZXJ0ZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYml0c3RyZWFtX2NvbnZlcnRlci5oCmluZGV4IGY1MDBlOTcuLjFlZWFlMTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYml0c3RyZWFtX2NvbnZlcnRlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYml0c3RyZWFtX2NvbnZlcnRlci5oCkBAIC0zMyw4ICszMyw3IEBACiAgIC8vIG9mIGlucHV0IGZyYW1lIGFyZSBlbmNyeXB0ZWQgYW5kIHNob3VsZCB1cGRhdGUgfHN1YnNhbXBsZXN8IGlmIG5lY2Vzc2FyeSwKICAgLy8gdG8gbWFrZSBzdXJlIGl0IGNvcnJlY3RseSBkZXNjcmliZXMgdGhlIGNvbnZlcnRlZCBvdXRwdXQgZnJhbWUuIFNlZQogICAvLyBTdWJzYW1wbGVFbnRyeSBkZWZpbml0aW9uIGluIG1lZGlhL2Jhc2UvZGVjcnlwdF9jb25maWcuaCBmb3IgbW9yZSBpbmZvLgotICB2aXJ0dWFsIGJvb2wgQ29udmVydEZyYW1lKHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBmcmFtZV9idWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSwKKyAgdmlydHVhbCBib29sIENvbnZlcnRGcmFtZShzdGQ6OnZlY3Rvcjx1aW50OF90PiogZnJhbWVfYnVmLCBib29sIGlzX2tleWZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5Piogc3Vic2FtcGxlcykgY29uc3QgPSAwOwogCiAgcHJvdGVjdGVkOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wNC9ib3hfZGVmaW5pdGlvbnMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X2RlZmluaXRpb25zLmgKaW5kZXggYjY0MGY0OS4uOGMwMGEwYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wNC9ib3hfZGVmaW5pdGlvbnMuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2JveF9kZWZpbml0aW9ucy5oCkBAIC0yNiw5ICsyNiw3IEBACiAKIGVudW0gVHJhY2tUeXBlIHsga0ludmFsaWQgPSAwLCBrVmlkZW8sIGtBdWRpbywga1RleHQsIGtIaW50IH07CiAKLWVudW0gU2FtcGxlRmxhZ3MgewotICBrU2FtcGxlSXNOb25TeW5jU2FtcGxlID0gMHgxMDAwMAotfTsKK2VudW0gU2FtcGxlRmxhZ3MgeyBrU2FtcGxlSXNOb25TeW5jU2FtcGxlID0gMHgxMDAwMCB9OwogCiAjZGVmaW5lIERFQ0xBUkVfQk9YX01FVEhPRFMoVCkgICAgICAgICAgICBcCiAgIFQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2JveF9yZWFkZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X3JlYWRlci5oCmluZGV4IDI2NDE2NTUuLjk5MmViMTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X3JlYWRlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvYm94X3JlYWRlci5oCkBAIC04NSw3ICs4NSw4IEBACiAgIHVpbnQ2NF90IHNpemVfOwogICB1aW50NjRfdCBwb3NfOwogCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgUmVhZChUKiB0KSBXQVJOX1VOVVNFRF9SRVNVTFQ7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBib29sIFJlYWQoVCogdCkgV0FSTl9VTlVTRURfUkVTVUxUOwogfTsKIAogY2xhc3MgTUVESUFfRVhQT1JUIEJveFJlYWRlciA6IHB1YmxpYyBCdWZmZXJSZWFkZXIgewpAQCAtOTgsOCArOTksNyBAQAogICAvLyB2YWx1ZXMgYXJlIG9ubHkgZXhwZWN0ZWQgd2hlbiBpbnN1ZmZpY2llbnQgZGF0YSBpcyBhdmFpbGFibGUuCiAgIC8vCiAgIC8vIHxidWZ8IGlzIHJldGFpbmVkIGJ1dCBub3Qgb3duZWQsIGFuZCBtdXN0IG91dGxpdmUgdGhlIEJveFJlYWRlciBpbnN0YW5jZS4KLSAgc3RhdGljIEJveFJlYWRlciogUmVhZFRvcExldmVsQm94KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBidWZfc2l6ZSwKKyAgc3RhdGljIEJveFJlYWRlciogUmVhZFRvcExldmVsQm94KGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgY29uc3QgaW50IGJ1Zl9zaXplLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGVycik7CiAKQEAgLTEwOSwxMSArMTA5LDkgQEAKICAgLy8gdHJ1ZS4gVGhlIHNlbWFudGljcyBvZiB8KmVycnwgYXJlIHRoZSBzYW1lIGFzIGFib3ZlLgogICAvLwogICAvLyB8YnVmfCBpcyBub3QgcmV0YWluZWQuCi0gIHN0YXRpYyBib29sIFN0YXJ0VG9wTGV2ZWxCb3goY29uc3QgdWludDhfdCogYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBidWZfc2l6ZSwKKyAgc3RhdGljIGJvb2wgU3RhcnRUb3BMZXZlbEJveChjb25zdCB1aW50OF90KiBidWYsIGNvbnN0IGludCBidWZfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvdXJDQyogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGJveF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvdXJDQyogdHlwZSwgaW50KiBib3hfc2l6ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBlcnIpIFdBUk5fVU5VU0VEX1JFU1VMVDsKIAogICAvLyBDcmVhdGUgYSBCb3hSZWFkZXIgZnJvbSBhIGJ1ZmZlci4gfGJ1ZnwgbXVzdCBiZSB0aGUgY29tcGxldGUgYnVmZmVyLCBhcwpAQCAtMTQ2LDEyICsxNDQsMTIgQEAKICAgYm9vbCBNYXliZVJlYWRDaGlsZChCb3gqIGNoaWxkKSBXQVJOX1VOVVNFRF9SRVNVTFQ7CiAKICAgLy8gUmVhZCBhdCBsZWFzdCBvbmUgY2hpbGQuIEZhbHNlIG1lYW5zIGVycm9yIG9yIG5vIHN1Y2ggY2hpbGQgcHJlc2VudC4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBSZWFkQ2hpbGRyZW4oCi0gICAgICBzdGQ6OnZlY3RvcjxUPiogY2hpbGRyZW4pIFdBUk5fVU5VU0VEX1JFU1VMVDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgUmVhZENoaWxkcmVuKHN0ZDo6dmVjdG9yPFQ+KiBjaGlsZHJlbikgV0FSTl9VTlVTRURfUkVTVUxUOwogCiAgIC8vIFJlYWQgYW55IG51bWJlciBvZiBjaGlsZHJlbi4gRmFsc2UgbWVhbnMgZXJyb3IuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgTWF5YmVSZWFkQ2hpbGRyZW4oCi0gICAgICBzdGQ6OnZlY3RvcjxUPiogY2hpbGRyZW4pIFdBUk5fVU5VU0VEX1JFU1VMVDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGJvb2wgTWF5YmVSZWFkQ2hpbGRyZW4oc3RkOjp2ZWN0b3I8VD4qIGNoaWxkcmVuKSBXQVJOX1VOVVNFRF9SRVNVTFQ7CiAKICAgLy8gUmVhZCBhbGwgY2hpbGRyZW4sIHJlZ2FyZGxlc3Mgb2YgRm91ckNDLiBUaGlzIGlzIHVzZWQgZnJvbSBleGFjdGx5IG9uZSBib3gsCiAgIC8vIGNvcnJlc3BvbmRpbmcgdG8gYSByYXRoZXIgc2lnbmlmaWNhbnQgaW5jb25zaXN0ZW5jeSBpbiB0aGUgQk1GRiBzcGVjLgpAQCAtMTczLDcgKzE3MSw3IEBACiAgIC8vIHRoZSBib3ggaGFzIGJlZW4gaW5pdGlhbGl6ZWQsIGFuZCBkb2VzIG5vdCByZS1yZWFkIHRoZSBtYWluIGJveCBoZWFkZXIuCiAgIGJvb2wgUmVhZEZ1bGxCb3hIZWFkZXIoKSBXQVJOX1VOVVNFRF9SRVNVTFQ7CiAKLSAgRm91ckNDIHR5cGUoKSBjb25zdCAgIHsgcmV0dXJuIHR5cGVfOyB9CisgIEZvdXJDQyB0eXBlKCkgY29uc3QgeyByZXR1cm4gdHlwZV87IH0KICAgdWludDhfdCB2ZXJzaW9uKCkgY29uc3QgeyByZXR1cm4gdmVyc2lvbl87IH0KICAgdWludDMyX3QgZmxhZ3MoKSBjb25zdCB7IHJldHVybiBmbGFnc187IH0KIApAQCAtMTgyLDEwICsxODAsOCBAQAogIHByaXZhdGU6CiAgIC8vIENyZWF0ZSBhIEJveFJlYWRlciBmcm9tIHxidWZ8LiB8aXNfRU9TfCBzaG91bGQgYmUgdHJ1ZSBpZiB8YnVmfCBpcwogICAvLyBjb21wbGV0ZSBzdHJlYW0gKGkuZS4gbm8gYWRkaXRpb25hbCBkYXRhIGlzIGV4cGVjdGVkIHRvIGJlIGFwcGVuZGVkKS4KLSAgQm94UmVhZGVyKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKLSAgICAgICAgICAgIGNvbnN0IGludCBzaXplLAotICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZywKLSAgICAgICAgICAgIGJvb2wgaXNfRU9TKTsKKyAgQm94UmVhZGVyKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgY29uc3QgaW50IHNpemUsCisgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nLCBib29sIGlzX0VPUyk7CiAKICAgLy8gTXVzdCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgaW5pdC4gSWYgdGhlIHJldHVybiBpcyBmYWxzZSwgdGhpcwogICAvLyBpbmRpY2F0ZXMgdGhhdCB0aGUgYm94IGhlYWRlciBhbmQgaXRzIGNvbnRlbnRzIHdlcmUgbm90IGF2YWlsYWJsZSBpbiB0aGUKQEAgLTIyMCwxMiArMjE2LDEzIEBACiB9OwogCiAvLyBUZW1wbGF0ZSBkZWZpbml0aW9ucwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gYm9vbCBCb3hSZWFkZXI6OlJlYWRDaGlsZHJlbihzdGQ6OnZlY3RvcjxUPiogY2hpbGRyZW4pIHsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorYm9vbCBCb3hSZWFkZXI6OlJlYWRDaGlsZHJlbihzdGQ6OnZlY3RvcjxUPiogY2hpbGRyZW4pIHsKICAgUkNIRUNLKE1heWJlUmVhZENoaWxkcmVuKGNoaWxkcmVuKSAmJiAhY2hpbGRyZW4tPmVtcHR5KCkpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotdGVtcGxhdGU8dHlwZW5hbWUgVD4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgogYm9vbCBCb3hSZWFkZXI6Ok1heWJlUmVhZENoaWxkcmVuKHN0ZDo6dmVjdG9yPFQ+KiBjaGlsZHJlbikgewogICBEQ0hFQ0soc2Nhbm5lZF8pOwogICBEQ0hFQ0soY2hpbGRyZW4tPmVtcHR5KCkpOwpAQCAtMjQzLDggKzI0MCw4IEBACiAgIH0KICAgY2hpbGRyZW5fLmVyYXNlKHN0YXJ0X2l0ciwgZW5kX2l0cik7CiAKLSAgRFZMT0coMikgPDwgIkZvdW5kICIgPDwgY2hpbGRyZW4tPnNpemUoKSA8PCAiICIKLSAgICAgICAgICAgPDwgRm91ckNDVG9TdHJpbmcoY2hpbGRfdHlwZSkgPDwgIiBib3hlcy4iOworICBEVkxPRygyKSA8PCAiRm91bmQgIiA8PCBjaGlsZHJlbi0+c2l6ZSgpIDw8ICIgIiA8PCBGb3VyQ0NUb1N0cmluZyhjaGlsZF90eXBlKQorICAgICAgICAgICA8PCAiIGJveGVzLiI7CiAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2ZvdXJjY3MuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvZm91cmNjcy5oCmluZGV4IDJmMTI5OGEuLmFkMzRkNjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvZm91cmNjcy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvZm91cmNjcy5oCkBAIC0xMDQsNyArMTA0LDcgQEAKICAgYnVmWzBdID0gKGZvdXJjYyA+PiAyNCkgJiAweGZmOwogICBidWZbMV0gPSAoZm91cmNjID4+IDE2KSAmIDB4ZmY7CiAgIGJ1ZlsyXSA9IChmb3VyY2MgPj4gOCkgJiAweGZmOwotICBidWZbM10gPSAoZm91cmNjKSAmIDB4ZmY7CisgIGJ1ZlszXSA9IChmb3VyY2MpJjB4ZmY7CiAgIGJ1Zls0XSA9IDA7CiAKICAgLy8gUmV0dXJuIGhleCBpdHNlbGYgaWYgY2hhcmFjdGVycyBjYW4gbm90IGJlIHByaW50ZWQuIEFueSBjaGFyYWN0ZXIgd2l0aGluCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L2hldmMuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvaGV2Yy5oCmluZGV4IDY0NDVhMTIuLmRhMTA5NTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvaGV2Yy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvaGV2Yy5oCkBAIC03Niw4ICs3Niw3IEBACiAKICAgc3RhdGljIGJvb2wgSW5zZXJ0UGFyYW1TZXRzQW5uZXhCKAogICAgICAgY29uc3QgSEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkJiBoZXZjX2NvbmZpZywKLSAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBidWZmZXIsCi0gICAgICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4qIHN1YnNhbXBsZXMpOworICAgICAgc3RkOjp2ZWN0b3I8dWludDhfdD4qIGJ1ZmZlciwgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+KiBzdWJzYW1wbGVzKTsKIAogICAvLyBWZXJpZmllcyB0aGF0IHRoZSBjb250ZW50cyBvZiB8YnVmZmVyfCBjb25mb3JtIHRvCiAgIC8vIFNlY3Rpb24gNy40LjIuNC40IG9mIElTTy9JRUMgMjMwMDgtMi4KQEAgLTg4LDggKzg3LDcgQEAKICAgLy8gQysrMTEncyBzdGQ6OnZlY3RvcjxUPjo6ZGF0YSgpIG1ldGhvZC4KICAgc3RhdGljIGJvb2wgSXNWYWxpZEFubmV4Qihjb25zdCBzdGQ6OnZlY3Rvcjx1aW50OF90PiYgYnVmZmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPFN1YnNhbXBsZUVudHJ5PiYgc3Vic2FtcGxlcyk7Ci0gIHN0YXRpYyBib29sIElzVmFsaWRBbm5leEIoY29uc3QgdWludDhfdCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLAorICBzdGF0aWMgYm9vbCBJc1ZhbGlkQW5uZXhCKGNvbnN0IHVpbnQ4X3QqIGJ1ZmZlciwgc2l6ZV90IHNpemUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8U3Vic2FtcGxlRW50cnk+JiBzdWJzYW1wbGVzKTsKIH07CiAKQEAgLTk5LDggKzk3LDcgQEAKICAgICAgIHNjb3BlZF9wdHI8SEVWQ0RlY29kZXJDb25maWd1cmF0aW9uUmVjb3JkPiBoZXZjX2NvbmZpZyk7CiAKICAgLy8gQml0c3RyZWFtQ29udmVydGVyIGludGVyZmFjZQotICBib29sIENvbnZlcnRGcmFtZShzdGQ6OnZlY3Rvcjx1aW50OF90PiogZnJhbWVfYnVmLAotICAgICAgICAgICAgICAgICAgICBib29sIGlzX2tleWZyYW1lLAorICBib29sIENvbnZlcnRGcmFtZShzdGQ6OnZlY3Rvcjx1aW50OF90PiogZnJhbWVfYnVmLCBib29sIGlzX2tleWZyYW1lLAogICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4qIHN1YnNhbXBsZXMpIGNvbnN0IE9WRVJSSURFOwogCiAgcHJpdmF0ZToKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvbXA0X3N0cmVhbV9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcDQvbXA0X3N0cmVhbV9wYXJzZXIuaAppbmRleCBhYjllNmE2Li4zNTI4MThkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXA0L21wNF9zdHJlYW1fcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wNC9tcDRfc3RyZWFtX3BhcnNlci5oCkBAIC0zMSwxMCArMzEsOCBAQAogICBNUDRTdHJlYW1QYXJzZXIoY29uc3Qgc3RkOjpzZXQ8aW50PiYgYXVkaW9fb2JqZWN0X3R5cGVzLCBib29sIGhhc19zYnIpOwogICB+TVA0U3RyZWFtUGFyc2VyKCkgT1ZFUlJJREU7CiAKLSAgdm9pZCBJbml0KGNvbnN0IEluaXRDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgIGNvbnN0IE5ld0NvbmZpZ0NCJiBjb25maWdfY2IsCi0gICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIG5ld19idWZmZXJzX2NiLAotICAgICAgICAgICAgYm9vbCBpZ25vcmVfdGV4dF90cmFja3MsCisgIHZvaWQgSW5pdChjb25zdCBJbml0Q0ImIGluaXRfY2IsIGNvbnN0IE5ld0NvbmZpZ0NCJiBjb25maWdfY2IsCisgICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIG5ld19idWZmZXJzX2NiLCBib29sIGlnbm9yZV90ZXh0X3RyYWNrcywKICAgICAgICAgICAgIGNvbnN0IEVuY3J5cHRlZE1lZGlhSW5pdERhdGFDQiYgZW5jcnlwdGVkX21lZGlhX2luaXRfZGF0YV9jYiwKICAgICAgICAgICAgIGNvbnN0IE5ld01lZGlhU2VnbWVudENCJiBuZXdfc2VnbWVudF9jYiwKICAgICAgICAgICAgIGNvbnN0IEVuZE1lZGlhU2VnbWVudENCJiBlbmRfb2Zfc2VnbWVudF9jYiwKQEAgLTcxLDggKzY5LDcgQEAKICAgdm9pZCBDaGFuZ2VTdGF0ZShTdGF0ZSBuZXdfc3RhdGUpOwogCiAgIGJvb2wgRW1pdENvbmZpZ3MoKTsKLSAgYm9vbCBQcmVwYXJlQUFDQnVmZmVyKGNvbnN0IEFBQyYgYWFjX2NvbmZpZywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBmcmFtZV9idWYsCisgIGJvb2wgUHJlcGFyZUFBQ0J1ZmZlcihjb25zdCBBQUMmIGFhY19jb25maWcsIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBmcmFtZV9idWYsCiAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxTdWJzYW1wbGVFbnRyeT4qIHN1YnNhbXBsZXMpIGNvbnN0OwogICBib29sIEVucXVldWVTYW1wbGUoQnVmZmVyUXVldWVNYXAqIGJ1ZmZlcnMsIGJvb2wqIGVycik7CiAgIGJvb2wgU2VuZEFuZEZsdXNoU2FtcGxlcyhCdWZmZXJRdWV1ZU1hcCogYnVmZmVycyk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXBlZy9hZHRzX3N0cmVhbV9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcGVnL2FkdHNfc3RyZWFtX3BhcnNlci5oCmluZGV4IDk2YzczNTkuLmFiNmI3MjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcGVnL2FkdHNfc3RyZWFtX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcGVnL2FkdHNfc3RyZWFtX3BhcnNlci5oCkBAIC0yMSwxMyArMjEsOSBAQAogICB+QURUU1N0cmVhbVBhcnNlcigpIE9WRVJSSURFOwogCiAgIC8vIE1QRUdBdWRpb1N0cmVhbVBhcnNlckJhc2Ugb3ZlcnJpZGVzLgotICBpbnQgUGFyc2VGcmFtZUhlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmcmFtZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNhbXBsZV9yYXRlLAotICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTGF5b3V0KiBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzYW1wbGVfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG1ldGFkYXRhX2ZyYW1lLAorICBpbnQgUGFyc2VGcmFtZUhlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgc2l6ZSwgaW50KiBmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNhbXBsZV9yYXRlLCBDaGFubmVsTGF5b3V0KiBjaGFubmVsX2xheW91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzYW1wbGVfY291bnQsIGJvb2wqIG1ldGFkYXRhX2ZyYW1lLAogICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogZXh0cmFfZGF0YSkgY29uc3QgT1ZFUlJJREU7CiAKICBwcml2YXRlOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wZWcvbXBlZzFfYXVkaW9fc3RyZWFtX3BhcnNlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wZWcvbXBlZzFfYXVkaW9fc3RyZWFtX3BhcnNlci5oCmluZGV4IDYxMjBhNTAuLmVhZGIxYjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcGVnL21wZWcxX2F1ZGlvX3N0cmVhbV9wYXJzZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXBlZy9tcGVnMV9hdWRpb19zdHJlYW1fcGFyc2VyLmgKQEAgLTY3LDIxICs2NywxNiBAQAogICAvLyBBc3N1bXB0aW9uOiBzaXplIG9mIGFycmF5IHxkYXRhfCBzaG91bGQgYmUgYXQgbGVhc3QgfGtIZWFkZXJTaXplfC4KICAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgaGVhZGVyIGlzIG5vdCB2YWxpZC4KICAgc3RhdGljIGJvb2wgUGFyc2VIZWFkZXIoY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgSGVhZGVyKiBoZWFkZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLCBIZWFkZXIqIGhlYWRlcik7CiAKICAgTVBFRzFBdWRpb1N0cmVhbVBhcnNlcigpOwogICB+TVBFRzFBdWRpb1N0cmVhbVBhcnNlcigpIE9WRVJSSURFOwogCiAgcHJpdmF0ZToKICAgLy8gTVBFR0F1ZGlvU3RyZWFtUGFyc2VyQmFzZSBvdmVycmlkZXMuCi0gIGludCBQYXJzZUZyYW1lSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCogc2FtcGxlX3JhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgIENoYW5uZWxMYXlvdXQqIGNoYW5uZWxfbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNhbXBsZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogbWV0YWRhdGFfZnJhbWUsCisgIGludCBQYXJzZUZyYW1lSGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBzaXplLCBpbnQqIGZyYW1lX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGludCogc2FtcGxlX3JhdGUsIENoYW5uZWxMYXlvdXQqIGNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNhbXBsZV9jb3VudCwgYm9vbCogbWV0YWRhdGFfZnJhbWUsCiAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+KiBleHRyYV9kYXRhKSBjb25zdCBPVkVSUklERTsKIAogICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTVBFRzFBdWRpb1N0cmVhbVBhcnNlcik7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXBlZy9tcGVnX2F1ZGlvX3N0cmVhbV9wYXJzZXJfYmFzZS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL21wZWcvbXBlZ19hdWRpb19zdHJlYW1fcGFyc2VyX2Jhc2UuaAppbmRleCA4MTYzNjk3Li5iOGJmNmRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvbXBlZy9tcGVnX2F1ZGlvX3N0cmVhbV9wYXJzZXJfYmFzZS5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy9tcGVnL21wZWdfYXVkaW9fc3RyZWFtX3BhcnNlcl9iYXNlLmgKQEAgLTI4LDE2ICsyOCwxMyBAQAogICAvLyByZWZlcnJlZCB0byBhcyB0aGUgc3luYyBjb2RlIGluIHRoZSBNUDMgYW5kIEFEVFMgaGVhZGVyIHNwZWNpZmljYXRpb25zLgogICAvLyB8Y29kZWNfZGVsYXl8IGlzIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyB0aGUgZGVjb2RlciB3aWxsIG91dHB1dCBiZWZvcmUgdGhlCiAgIC8vIGZpcnN0IHJlYWwgZnJhbWUuCi0gIE1QRUdBdWRpb1N0cmVhbVBhcnNlckJhc2UodWludDMyX3Qgc3RhcnRfY29kZV9tYXNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1ZGlvQ29kZWMgYXVkaW9fY29kZWMsCisgIE1QRUdBdWRpb1N0cmVhbVBhcnNlckJhc2UodWludDMyX3Qgc3RhcnRfY29kZV9tYXNrLCBBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb2RlY19kZWxheSk7CiAgIH5NUEVHQXVkaW9TdHJlYW1QYXJzZXJCYXNlKCkgT1ZFUlJJREU7CiAKICAgLy8gU3RyZWFtUGFyc2VyIGltcGxlbWVudGF0aW9uLgotICB2b2lkIEluaXQoY29uc3QgSW5pdENCJiBpbml0X2NiLAotICAgICAgICAgICAgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKLSAgICAgICAgICAgIGNvbnN0IE5ld0J1ZmZlcnNDQiYgbmV3X2J1ZmZlcnNfY2IsCi0gICAgICAgICAgICBib29sIGlnbm9yZV90ZXh0X3RyYWNrcywKKyAgdm9pZCBJbml0KGNvbnN0IEluaXRDQiYgaW5pdF9jYiwgY29uc3QgTmV3Q29uZmlnQ0ImIGNvbmZpZ19jYiwKKyAgICAgICAgICAgIGNvbnN0IE5ld0J1ZmZlcnNDQiYgbmV3X2J1ZmZlcnNfY2IsIGJvb2wgaWdub3JlX3RleHRfdHJhY2tzLAogICAgICAgICAgICAgY29uc3QgRW5jcnlwdGVkTWVkaWFJbml0RGF0YUNCJiBlbmNyeXB0ZWRfbWVkaWFfaW5pdF9kYXRhX2NiLAogICAgICAgICAgICAgY29uc3QgTmV3TWVkaWFTZWdtZW50Q0ImIG5ld19zZWdtZW50X2NiLAogICAgICAgICAgICAgY29uc3QgRW5kTWVkaWFTZWdtZW50Q0ImIGVuZF9vZl9zZWdtZW50X2NiLApAQCAtNzYsMjMgKzczLDE1IEBACiAgIC8vID4gMCA6IFRoZSBudW1iZXIgb2YgYnl0ZXMgcGFyc2VkLgogICAvLyAgIDAgOiBJZiBtb3JlIGRhdGEgaXMgbmVlZGVkIHRvIHBhcnNlIHRoZSBlbnRpcmUgZnJhbWUgaGVhZGVyLgogICAvLyA8IDAgOiBBbiBlcnJvciB3YXMgZW5jb3VudGVyZWQgZHVyaW5nIHBhcnNpbmcuCi0gIHZpcnR1YWwgaW50IFBhcnNlRnJhbWVIZWFkZXIoY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGZyYW1lX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzYW1wbGVfcmF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGFubmVsTGF5b3V0KiBjaGFubmVsX2xheW91dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNhbXBsZV9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBtZXRhZGF0YV9mcmFtZSwKKyAgdmlydHVhbCBpbnQgUGFyc2VGcmFtZUhlYWRlcihjb25zdCB1aW50OF90KiBkYXRhLCBpbnQgc2l6ZSwgaW50KiBmcmFtZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2FtcGxlX3JhdGUsIENoYW5uZWxMYXlvdXQqIGNoYW5uZWxfbGF5b3V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2FtcGxlX2NvdW50LCBib29sKiBtZXRhZGF0YV9mcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3Rvcjx1aW50OF90PiogZXh0cmFfZGF0YSkgY29uc3QgPSAwOwogCiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+JiBtZWRpYV9sb2coKSBjb25zdCB7IHJldHVybiBtZWRpYV9sb2dfOyB9CiAKICBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBVTklOSVRJQUxJWkVELAotICAgIElOSVRJQUxJWkVELAotICAgIFBBUlNFX0VSUk9SCi0gIH07CisgIGVudW0gU3RhdGUgeyBVTklOSVRJQUxJWkVELCBJTklUSUFMSVpFRCwgUEFSU0VfRVJST1IgfTsKIAogICB2b2lkIENoYW5nZVN0YXRlKFN0YXRlIHN0YXRlKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vY2x1c3Rlcl9idWlsZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS9jbHVzdGVyX2J1aWxkZXIuaAppbmRleCAyNGYyYTlhLi5kZDQ0Y2FmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS9jbHVzdGVyX2J1aWxkZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS9jbHVzdGVyX2J1aWxkZXIuaApAQCAtMzMsNDYgKzMzLDI3IEBACiAgIH5DbHVzdGVyQnVpbGRlcigpOwogCiAgIHZvaWQgU2V0Q2x1c3RlclRpbWVjb2RlKGludDY0X3QgY2x1c3Rlcl90aW1lY29kZSk7Ci0gIHZvaWQgQWRkU2ltcGxlQmxvY2soaW50IHRyYWNrX251bSwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKLSAgdm9pZCBBZGRCbG9ja0dyb3VwKGludCB0cmFja19udW0sCi0gICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgaW50IGR1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlfZnJhbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOwotICB2b2lkIEFkZEJsb2NrR3JvdXBXaXRob3V0QmxvY2tEdXJhdGlvbihpbnQgdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmxhZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfa2V5X2ZyYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7CisgIHZvaWQgQWRkU2ltcGxlQmxvY2soaW50IHRyYWNrX251bSwgaW50NjRfdCB0aW1lY29kZSwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBzaXplKTsKKyAgdm9pZCBBZGRCbG9ja0dyb3VwKGludCB0cmFja19udW0sIGludDY0X3QgdGltZWNvZGUsIGludCBkdXJhdGlvbiwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19rZXlfZnJhbWUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBzaXplKTsKKyAgdm9pZCBBZGRCbG9ja0dyb3VwV2l0aG91dEJsb2NrRHVyYXRpb24oaW50IHRyYWNrX251bSwgaW50NjRfdCB0aW1lY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLCBib29sIGlzX2tleV9mcmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgaW50IHNpemUpOwogCiAgIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gRmluaXNoKCk7CiAgIHNjb3BlZF9wdHI8Q2x1c3Rlcj4gRmluaXNoV2l0aFVua25vd25TaXplKCk7CiAKICBwcml2YXRlOgotICB2b2lkIEFkZEJsb2NrR3JvdXBJbnRlcm5hbChpbnQgdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHRpbWVjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfYmxvY2tfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2tleV9mcmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKKyAgdm9pZCBBZGRCbG9ja0dyb3VwSW50ZXJuYWwoaW50IHRyYWNrX251bSwgaW50NjRfdCB0aW1lY29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX2Jsb2NrX2R1cmF0aW9uLCBpbnQgZHVyYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmbGFncywgYm9vbCBpc19rZXlfZnJhbWUsIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKICAgdm9pZCBSZXNldCgpOwogICB2b2lkIEV4dGVuZEJ1ZmZlcihpbnQgYnl0ZXNfbmVlZGVkKTsKICAgdm9pZCBVcGRhdGVVSW50NjQoaW50IG9mZnNldCwgaW50NjRfdCB2YWx1ZSk7Ci0gIHZvaWQgV3JpdGVCbG9jayh1aW50OF90KiBidWYsCi0gICAgICAgICAgICAgICAgICBpbnQgdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgaW50NjRfdCB0aW1lY29kZSwKLSAgICAgICAgICAgICAgICAgIGludCBmbGFncywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7CisgIHZvaWQgV3JpdGVCbG9jayh1aW50OF90KiBidWYsIGludCB0cmFja19udW0sIGludDY0X3QgdGltZWNvZGUsIGludCBmbGFncywKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBzaXplKTsKIAogICBzY29wZWRfYXJyYXk8dWludDhfdD4gYnVmZmVyXzsKICAgaW50IGJ1ZmZlcl9zaXplXzsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3RyYWNrc19idWlsZGVyLmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS90cmFja3NfYnVpbGRlci5oCmluZGV4IGQyZjA1MGYuLjE3MWY2ODYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3RyYWNrc19idWlsZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vdHJhY2tzX2J1aWxkZXIuaApAQCAtMjksNjAgKzI5LDM3IEBACiAgIC8vIGlmIHxhbGxvd19pbnZhbGlkX3ZhbHVlc198IGlzIHRydWUsIHNpbmNlIGl0IGlzIGFuIGlsbGVnYWwgdmFsdWUgZm9yCiAgIC8vIERlZmF1bHREdXJhdGlvbi4gU2ltaWxhciBhcHBsaWVzIHRvIHxhdWRpb19jaGFubmVsc3wsCiAgIC8vIHxhdWRpb19zYW1wbGluZ19mcmVxdWVuY3l8LCB8dmlkZW9fcGl4ZWxfd2lkdGh8IGFuZCB8dmlkZW9fcGl4ZWxfaGVpZ2h0fC4KLSAgdm9pZCBBZGRWaWRlb1RyYWNrKGludCB0cmFja19udW0sCi0gICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0cmFja191aWQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0X2R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvX3BpeGVsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvX3BpeGVsX2hlaWdodCk7Ci0gIHZvaWQgQWRkQXVkaW9UcmFjayhpbnQgdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdHJhY2tfdWlkLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLAotICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgZGVmYXVsdF9kdXJhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhdWRpb19zYW1wbGluZ19mcmVxdWVuY3kpOwotICB2b2lkIEFkZFRleHRUcmFjayhpbnQgdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0cmFja191aWQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2RlY19pZCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgIHZvaWQgQWRkVmlkZW9UcmFjayhpbnQgdHJhY2tfbnVtLCB1aW50NjRfdCB0cmFja191aWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLCBpbnQgZGVmYXVsdF9kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCB2aWRlb19waXhlbF93aWR0aCwgaW50IHZpZGVvX3BpeGVsX2hlaWdodCk7CisgIHZvaWQgQWRkQXVkaW9UcmFjayhpbnQgdHJhY2tfbnVtLCB1aW50NjRfdCB0cmFja191aWQsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLCBpbnQgZGVmYXVsdF9kdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19jaGFubmVscywgZG91YmxlIGF1ZGlvX3NhbXBsaW5nX2ZyZXF1ZW5jeSk7CisgIHZvaWQgQWRkVGV4dFRyYWNrKGludCB0cmFja19udW0sIHVpbnQ2NF90IHRyYWNrX3VpZCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlKTsKIAogICBzdGQ6OnZlY3Rvcjx1aW50OF90PiBGaW5pc2goKTsKIAogIHByaXZhdGU6Ci0gIHZvaWQgQWRkVHJhY2tJbnRlcm5hbChpbnQgdHJhY2tfbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHRyYWNrX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCB0cmFja191aWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBsYW5ndWFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZWZhdWx0X2R1cmF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvX3BpeGVsX3dpZHRoLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvX3BpeGVsX2hlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBhdWRpb19jaGFubmVscywKLSAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSBhdWRpb19zYW1wbGluZ19mcmVxdWVuY3kpOworICB2b2lkIEFkZFRyYWNrSW50ZXJuYWwoaW50IHRyYWNrX251bSwgaW50IHRyYWNrX3R5cGUsIHVpbnQ2NF90IHRyYWNrX3VpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBjb2RlY19pZCwgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsIGludCBkZWZhdWx0X2R1cmF0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZpZGVvX3BpeGVsX3dpZHRoLCBpbnQgdmlkZW9fcGl4ZWxfaGVpZ2h0LAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvX2NoYW5uZWxzLCBkb3VibGUgYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5KTsKICAgaW50IEdldFRyYWNrc1NpemUoKSBjb25zdDsKICAgaW50IEdldFRyYWNrc1BheWxvYWRTaXplKCkgY29uc3Q7CiAgIHZvaWQgV3JpdGVUcmFja3ModWludDhfdCogYnVmZmVyLCBpbnQgYnVmZmVyX3NpemUpIGNvbnN0OwogCiAgIGNsYXNzIFRyYWNrIHsKICAgIHB1YmxpYzoKLSAgICBUcmFjayhpbnQgdHJhY2tfbnVtLAotICAgICAgICAgIGludCB0cmFja190eXBlLAotICAgICAgICAgIHVpbnQ2NF90IHRyYWNrX3VpZCwKLSAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgY29kZWNfaWQsCi0gICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGxhbmd1YWdlLAotICAgICAgICAgIGludCBkZWZhdWx0X2R1cmF0aW9uLAotICAgICAgICAgIGludCB2aWRlb19waXhlbF93aWR0aCwKLSAgICAgICAgICBpbnQgdmlkZW9fcGl4ZWxfaGVpZ2h0LAotICAgICAgICAgIGludCBhdWRpb19jaGFubmVscywKLSAgICAgICAgICBkb3VibGUgYXVkaW9fc2FtcGxpbmdfZnJlcXVlbmN5LAotICAgICAgICAgIGJvb2wgYWxsb3dfaW52YWxpZF92YWx1ZXMpOworICAgIFRyYWNrKGludCB0cmFja19udW0sIGludCB0cmFja190eXBlLCB1aW50NjRfdCB0cmFja191aWQsCisgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLCBjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgbGFuZ3VhZ2UsIGludCBkZWZhdWx0X2R1cmF0aW9uLAorICAgICAgICAgIGludCB2aWRlb19waXhlbF93aWR0aCwgaW50IHZpZGVvX3BpeGVsX2hlaWdodCwgaW50IGF1ZGlvX2NoYW5uZWxzLAorICAgICAgICAgIGRvdWJsZSBhdWRpb19zYW1wbGluZ19mcmVxdWVuY3ksIGJvb2wgYWxsb3dfaW52YWxpZF92YWx1ZXMpOwogCiAgICAgaW50IEdldFNpemUoKSBjb25zdDsKICAgICB2b2lkIFdyaXRlKHVpbnQ4X3QqKiBidWYsIGludCogYnVmX3NpemUpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9hdWRpb19jbGllbnQuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fYXVkaW9fY2xpZW50LmgKaW5kZXggN2JjNGJkYy4uYjNiYTJjMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9hdWRpb19jbGllbnQuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2F1ZGlvX2NsaWVudC5oCkBAIC0zNSw4ICszNSw3IEBACiAgIC8vIGF1ZGlvIHRyYWNrIGVsZW1lbnQgZmllbGRzLgogICBib29sIEluaXRpYWxpemVDb25maWcoY29uc3Qgc3RkOjpzdHJpbmcmIGNvZGVjX2lkLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGNvZGVjX3ByaXZhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHNlZWtfcHJlcm9sbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludDY0X3QgY29kZWNfZGVsYXksCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQ2NF90IHNlZWtfcHJlcm9sbCwgY29uc3QgaW50NjRfdCBjb2RlY19kZWxheSwKICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVuY3J5cHRpb25TY2hlbWUmIGVuY3J5cHRpb25fc2NoZW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgQXVkaW9EZWNvZGVyQ29uZmlnKiBjb25maWcpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyLmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2NsdXN0ZXJfcGFyc2VyLmgKaW5kZXggNzQ0ZDU2MC4uMTVkMjgyMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9jbHVzdGVyX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fY2x1c3Rlcl9wYXJzZXIuaApAQCAtNTEsOSArNTEsNyBAQAogICAvLyBIZWxwZXIgY2xhc3MgdGhhdCBtYW5hZ2VzIHBlci10cmFjayBzdGF0ZS4KICAgY2xhc3MgVHJhY2sgewogICAgcHVibGljOgotICAgIFRyYWNrKGludCB0cmFja19udW0sCi0gICAgICAgICAgYm9vbCBpc192aWRlbywKLSAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgZGVmYXVsdF9kdXJhdGlvbiwKKyAgICBUcmFjayhpbnQgdHJhY2tfbnVtLCBib29sIGlzX3ZpZGVvLCBiYXNlOjpUaW1lRGVsdGEgZGVmYXVsdF9kdXJhdGlvbiwKICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPE1lZGlhTG9nPiYgbWVkaWFfbG9nKTsKICAgICB+VHJhY2soKTsKIApAQCAtMTQ2LDEwICsxNDQsOCBAQAogICB0eXBlZGVmIHN0ZDo6bWFwPGludCwgVHJhY2s+IFRleHRUcmFja01hcDsKIAogIHB1YmxpYzoKLSAgV2ViTUNsdXN0ZXJQYXJzZXIoaW50NjRfdCB0aW1lY29kZV9zY2FsZSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGF1ZGlvX3RyYWNrX251bSwKLSAgICAgICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhIGF1ZGlvX2RlZmF1bHRfZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGludCB2aWRlb190cmFja19udW0sCisgIFdlYk1DbHVzdGVyUGFyc2VyKGludDY0X3QgdGltZWNvZGVfc2NhbGUsIGludCBhdWRpb190cmFja19udW0sCisgICAgICAgICAgICAgICAgICAgIGJhc2U6OlRpbWVEZWx0YSBhdWRpb19kZWZhdWx0X2R1cmF0aW9uLCBpbnQgdmlkZW9fdHJhY2tfbnVtLAogICAgICAgICAgICAgICAgICAgICBiYXNlOjpUaW1lRGVsdGEgdmlkZW9fZGVmYXVsdF9kdXJhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgV2ViTVRyYWNrc1BhcnNlcjo6VGV4dFRyYWNrcyYgdGV4dF90cmFja3MsCiAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c2V0PGludDY0X3Q+JiBpZ25vcmVkX3RyYWNrcywKQEAgLTIwOCwyNCArMjA0LDEyIEBACiAgIGJvb2wgT25VSW50KGludCBpZCwgaW50NjRfdCB2YWwpIE9WRVJSSURFOwogICBib29sIE9uQmluYXJ5KGludCBpZCwgY29uc3QgdWludDhfdCogZGF0YSwgaW50IHNpemUpIE9WRVJSSURFOwogCi0gIGJvb2wgUGFyc2VCbG9jayhib29sIGlzX3NpbXBsZV9ibG9jaywKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogYWRkaXRpb25hbCwKLSAgICAgICAgICAgICAgICAgIGludCBhZGRpdGlvbmFsX3NpemUsCi0gICAgICAgICAgICAgICAgICBpbnQgZHVyYXRpb24sCi0gICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc2NhcmRfcGFkZGluZywKLSAgICAgICAgICAgICAgICAgIGJvb2wgcmVmZXJlbmNlX2Jsb2NrX3NldCk7Ci0gIGJvb2wgT25CbG9jayhib29sIGlzX3NpbXBsZV9ibG9jaywKLSAgICAgICAgICAgICAgIGludCB0cmFja19udW0sCi0gICAgICAgICAgICAgICBpbnQgdGltZWNvZGUsCi0gICAgICAgICAgICAgICBpbnQgZHVyYXRpb24sCi0gICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBkYXRhLAotICAgICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICAgICBjb25zdCB1aW50OF90KiBhZGRpdGlvbmFsLAotICAgICAgICAgICAgICAgaW50IGFkZGl0aW9uYWxfc2l6ZSwKLSAgICAgICAgICAgICAgIGludDY0X3QgZGlzY2FyZF9wYWRkaW5nLAotICAgICAgICAgICAgICAgYm9vbCBpc19rZXlmcmFtZSk7CisgIGJvb2wgUGFyc2VCbG9jayhib29sIGlzX3NpbXBsZV9ibG9jaywgY29uc3QgdWludDhfdCogYnVmLCBpbnQgc2l6ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGFkZGl0aW9uYWwsIGludCBhZGRpdGlvbmFsX3NpemUsIGludCBkdXJhdGlvbiwKKyAgICAgICAgICAgICAgICAgIGludDY0X3QgZGlzY2FyZF9wYWRkaW5nLCBib29sIHJlZmVyZW5jZV9ibG9ja19zZXQpOworICBib29sIE9uQmxvY2soYm9vbCBpc19zaW1wbGVfYmxvY2ssIGludCB0cmFja19udW0sIGludCB0aW1lY29kZSwgaW50IGR1cmF0aW9uLAorICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwgaW50IHNpemUsIGNvbnN0IHVpbnQ4X3QqIGFkZGl0aW9uYWwsCisgICAgICAgICAgICAgICBpbnQgYWRkaXRpb25hbF9zaXplLCBpbnQ2NF90IGRpc2NhcmRfcGFkZGluZywgYm9vbCBpc19rZXlmcmFtZSk7CiAKICAgLy8gUmVzZXRzIHRoZSBUcmFjayBvYmplY3RzIGFzc29jaWF0ZWQgd2l0aCBlYWNoIHRleHQgdHJhY2suCiAgIHZvaWQgUmVzZXRUZXh0VHJhY2tzKCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2NvbG91cl9wYXJzZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2NvbG91cl9wYXJzZXIuY2MKaW5kZXggMGYzNmE4Zi4uNjM1YzQ2NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fY29sb3VyX3BhcnNlci5jYwpAQCAtMjcxLDcgKzI3MSw3IEBACiBTVEFUSUNfQVNTRVJUX0VOVU0oa01hdHJpeENvZWZmaWNpZW50QnQyMDIwTm9uY29uc3RhbnRMdW1pbmFuY2UsCiAgICAgICAgICAgICAgICAgICAga01hdHJpeElkQnQyMDIwTm9uY29uc3RhbnRMdW1pbmFuY2UpOwogU1RBVElDX0FTU0VSVF9FTlVNKGtNYXRyaXhDb2VmZmljaWVudEJ0MjAyMENvbnN0YW50THVtaW5hbmNlLAotICAgICAgICAgICAgICAgICAgIGtNYXRyaXhJZEJUMjAyMENvbnN0YW50THVtaW5hbmNlKTsKKyAgICAgICAgICAgICAgICAgICBrTWF0cml4SWRCdDIwMjBDb25zdGFudEx1bWluYW5jZSk7CiAKIGdmeDo6Q29sb3JTcGFjZTo6TWF0cml4SUQgRnJvbVdlYk1NYXRyaXhDb2VmZmljaWVudChNYXRyaXhDb2VmZmljaWVudCBjKSB7CiAgIHJldHVybiBzdGF0aWNfY2FzdDxnZng6OkNvbG9yU3BhY2U6Ok1hdHJpeElEPihjKTsKQEAgLTMzMyw2ICszMzMsMTcgQEAKICAgICAgIENocm9tYVNpdGluZ0hvcnooMCksCiAgICAgICBDaHJvbWFTaXRpbmdWZXJ0KDApIHt9CiAKK2Jvb2wgV2ViTUNvbG9yTWV0YWRhdGE6Om9wZXJhdG9yPT0oY29uc3QgV2ViTUNvbG9yTWV0YWRhdGEmIHJocykgY29uc3QgeworICByZXR1cm4gKEJpdHNQZXJDaGFubmVsID09IHJocy5CaXRzUGVyQ2hhbm5lbCAmJgorICAgICAgICAgIENocm9tYVN1YnNhbXBsaW5nSG9yeiA9PSByaHMuQ2hyb21hU3Vic2FtcGxpbmdIb3J6ICYmCisgICAgICAgICAgQ2hyb21hU3Vic2FtcGxpbmdWZXJ0ID09IHJocy5DaHJvbWFTdWJzYW1wbGluZ1ZlcnQgJiYKKyAgICAgICAgICBDYlN1YnNhbXBsaW5nSG9yeiA9PSByaHMuQ2JTdWJzYW1wbGluZ0hvcnogJiYKKyAgICAgICAgICBDYlN1YnNhbXBsaW5nVmVydCA9PSByaHMuQ2JTdWJzYW1wbGluZ1ZlcnQgJiYKKyAgICAgICAgICBDaHJvbWFTaXRpbmdIb3J6ID09IHJocy5DaHJvbWFTaXRpbmdIb3J6ICYmCisgICAgICAgICAgQ2hyb21hU2l0aW5nVmVydCA9PSByaHMuQ2hyb21hU2l0aW5nVmVydCAmJgorICAgICAgICAgIGNvbG9yX3NwYWNlID09IHJocy5jb2xvcl9zcGFjZSAmJiBoZHJfbWV0YWRhdGEgPT0gcmhzLmhkcl9tZXRhZGF0YSk7Cit9CisKIFdlYk1NYXN0ZXJpbmdNZXRhZGF0YVBhcnNlcjo6V2ViTU1hc3RlcmluZ01ldGFkYXRhUGFyc2VyKCkge30KIFdlYk1NYXN0ZXJpbmdNZXRhZGF0YVBhcnNlcjo6fldlYk1NYXN0ZXJpbmdNZXRhZGF0YVBhcnNlcigpIHt9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fY29sb3VyX3BhcnNlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmgKaW5kZXggZWU4YzA3Zi4uNWUzODJkMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9jb2xvdXJfcGFyc2VyLmgKQEAgLTI5LDYgKzI5LDcgQEAKICAgSERSTWV0YWRhdGEgaGRyX21ldGFkYXRhOwogCiAgIFdlYk1Db2xvck1ldGFkYXRhKCk7CisgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBXZWJNQ29sb3JNZXRhZGF0YSYgcmhzKSBjb25zdDsKIH07CiAKIC8vIFBhcnNlciBmb3IgV2ViTSBNYXN0ZXJpbmdNZXRhZGF0YSB3aXRoaW4gQ29sb3VyIGVsZW1lbnQ6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2NyeXB0b19oZWxwZXJzLmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX2NyeXB0b19oZWxwZXJzLmgKaW5kZXggMmNlYjE4Ni4uNjFiNGU4ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9jcnlwdG9faGVscGVycy5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fY3J5cHRvX2hlbHBlcnMuaApAQCAtMjAsMTMgKzIwLDkgQEAKIC8vIGZhbHNlIG90aGVyd2lzZSwgaW4gd2hpY2ggY2FzZSB8ZGVjcnlwdF9jb25maWd8IGFuZCB8ZGF0YV9vZmZzZXR8IHdpbGwgbm90IGJlCiAvLyBjaGFuZ2VkLiBDdXJyZW50IGVuY3J5cHRlZCBXZWJNIHJlcXVlc3QgZm9yIGNvbW1lbnRzIHNwZWNpZmljYXRpb24gaXMgaGVyZQogLy8gaHR0cDovL3dpa2kud2VibXByb2plY3Qub3JnL2VuY3J5cHRpb24vd2VibS1lbmNyeXB0aW9uLXJmYwotYm9vbCBNRURJQV9FWFBPUlQKLVdlYk1DcmVhdGVEZWNyeXB0Q29uZmlnKGNvbnN0IHVpbnQ4X3QqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCoga2V5X2lkLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGtleV9pZF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxEZWNyeXB0Q29uZmlnPiogZGVjcnlwdF9jb25maWcsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGRhdGFfb2Zmc2V0KTsKK2Jvb2wgTUVESUFfRVhQT1JUIFdlYk1DcmVhdGVEZWNyeXB0Q29uZmlnKAorICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBkYXRhX3NpemUsIGNvbnN0IHVpbnQ4X3QqIGtleV9pZCwgaW50IGtleV9pZF9zaXplLAorICAgIHNjb3BlZF9wdHI8RGVjcnlwdENvbmZpZz4qIGRlY3J5cHRfY29uZmlnLCBpbnQqIGRhdGFfb2Zmc2V0KTsKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fcGFyc2VyLmggYi9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX3BhcnNlci5oCmluZGV4IDgzNTBlYWMuLmEzMzQ5M2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV9wYXJzZXIuaApAQCAtNDEsNiArNDEsNyBAQAogIHByb3RlY3RlZDoKICAgV2ViTVBhcnNlckNsaWVudCgpOwogCisgcHJpdmF0ZToKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFdlYk1QYXJzZXJDbGllbnQpOwogfTsKIApAQCAtMTAxLDExICsxMDIsOCBAQAogICAvLyBSZXR1cm5zIDwgMCBpZiB0aGUgcGFyc2UgZmFpbHMuCiAgIC8vIFJldHVybnMgMCBpZiBtb3JlIGRhdGEgaXMgbmVlZGVkLgogICAvLyBSZXR1cm5pbmcgPiAwIGluZGljYXRlcyBzdWNjZXNzICYgdGhlIG51bWJlciBvZiBieXRlcyBwYXJzZWQuCi0gIGludCBQYXJzZUxpc3RFbGVtZW50KGludCBoZWFkZXJfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGlkLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGVsZW1lbnRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdWludDhfdCogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUpOworICBpbnQgUGFyc2VMaXN0RWxlbWVudChpbnQgaGVhZGVyX3NpemUsIGludCBpZCwgaW50NjRfdCBlbGVtZW50X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ4X3QqIGRhdGEsIGludCBzaXplKTsKIAogICAvLyBDYWxsZWQgd2hlbiBzdGFydGluZyB0byBwYXJzZSBhIG5ldyBsaXN0LgogICAvLwpAQCAtMTU0LDkgKzE1Miw3IEBACiAvLyB8KmlkfCBjb250YWlucyB0aGUgZWxlbWVudCBJRCBvbiBzdWNjZXNzIGFuZCBpcyB1bmRlZmluZWQgb3RoZXJ3aXNlLgogLy8gfCplbGVtZW50X3NpemV8IGNvbnRhaW5zIHRoZSBlbGVtZW50IHNpemUgb24gc3VjY2VzcyBhbmQgaXMgdW5kZWZpbmVkCiAvLyAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLgotaW50IE1FRElBX0VYUE9SVCBXZWJNUGFyc2VFbGVtZW50SGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIGlkLAoraW50IE1FRElBX0VYUE9SVCBXZWJNUGFyc2VFbGVtZW50SGVhZGVyKGNvbnN0IHVpbnQ4X3QqIGJ1ZiwgaW50IHNpemUsIGludCogaWQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCogZWxlbWVudF9zaXplKTsKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX3N0cmVhbV9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fc3RyZWFtX3BhcnNlci5oCmluZGV4IDEyZGRjZTUuLmJjMjc1OTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fc3RyZWFtX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fc3RyZWFtX3BhcnNlci5oCkBAIC0yOSwxMCArMjksOCBAQAogICB+V2ViTVN0cmVhbVBhcnNlcigpIE9WRVJSSURFOwogCiAgIC8vIFN0cmVhbVBhcnNlciBpbXBsZW1lbnRhdGlvbi4KLSAgdm9pZCBJbml0KGNvbnN0IEluaXRDQiYgaW5pdF9jYiwKLSAgICAgICAgICAgIGNvbnN0IE5ld0NvbmZpZ0NCJiBjb25maWdfY2IsCi0gICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIG5ld19idWZmZXJzX2NiLAotICAgICAgICAgICAgYm9vbCBpZ25vcmVfdGV4dF90cmFja3MsCisgIHZvaWQgSW5pdChjb25zdCBJbml0Q0ImIGluaXRfY2IsIGNvbnN0IE5ld0NvbmZpZ0NCJiBjb25maWdfY2IsCisgICAgICAgICAgICBjb25zdCBOZXdCdWZmZXJzQ0ImIG5ld19idWZmZXJzX2NiLCBib29sIGlnbm9yZV90ZXh0X3RyYWNrcywKICAgICAgICAgICAgIGNvbnN0IEVuY3J5cHRlZE1lZGlhSW5pdERhdGFDQiYgZW5jcnlwdGVkX21lZGlhX2luaXRfZGF0YV9jYiwKICAgICAgICAgICAgIGNvbnN0IE5ld01lZGlhU2VnbWVudENCJiBuZXdfc2VnbWVudF9jYiwKICAgICAgICAgICAgIGNvbnN0IEVuZE1lZGlhU2VnbWVudENCJiBlbmRfb2Zfc2VnbWVudF9jYiwKQEAgLTQxLDEyICszOSw3IEBACiAgIGJvb2wgUGFyc2UoY29uc3QgdWludDhfdCogYnVmLCBpbnQgc2l6ZSkgT1ZFUlJJREU7CiAKICBwcml2YXRlOgotICBlbnVtIFN0YXRlIHsKLSAgICBrV2FpdGluZ0ZvckluaXQsCi0gICAga1BhcnNpbmdIZWFkZXJzLAotICAgIGtQYXJzaW5nQ2x1c3RlcnMsCi0gICAga0Vycm9yCi0gIH07CisgIGVudW0gU3RhdGUgeyBrV2FpdGluZ0ZvckluaXQsIGtQYXJzaW5nSGVhZGVycywga1BhcnNpbmdDbHVzdGVycywga0Vycm9yIH07CiAKICAgdm9pZCBDaGFuZ2VTdGF0ZShTdGF0ZSBuZXdfc3RhdGUpOwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL2Zvcm1hdHMvd2VibS93ZWJtX3RyYWNrc19wYXJzZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5oCmluZGV4IGViMTExMmQuLmVkN2EzYTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fdHJhY2tzX3BhcnNlci5oCkBAIC03NCw5ICs3NCw3IEBACiAKICAgdHlwZWRlZiBzdGQ6Om1hcDxpbnQsIFRleHRUcmFja0NvbmZpZz4gVGV4dFRyYWNrczsKIAotICBjb25zdCBUZXh0VHJhY2tzJiB0ZXh0X3RyYWNrcygpIGNvbnN0IHsKLSAgICByZXR1cm4gdGV4dF90cmFja3NfOwotICB9CisgIGNvbnN0IFRleHRUcmFja3MmIHRleHRfdHJhY2tzKCkgY29uc3QgeyByZXR1cm4gdGV4dF90cmFja3NfOyB9CiAKICAgaW50IGRldGVjdGVkX2F1ZGlvX3RyYWNrX2NvdW50KCkgY29uc3QgeyByZXR1cm4gZGV0ZWN0ZWRfYXVkaW9fdHJhY2tfY291bnRfOyB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fdmlkZW9fY2xpZW50LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV92aWRlb19jbGllbnQuY2MKaW5kZXggM2E0YzFiYi4uMWU2NGE4YyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV92aWRlb19jbGllbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV92aWRlb19jbGllbnQuY2MKQEAgLTg3LDggKzg3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgIGVuY3J5cHRpb25fc2NoZW1lKTsKICAgaWYgKGNvbG91cl9wYXJzZWRfKSB7CiAgICAgV2ViTUNvbG9yTWV0YWRhdGEgY29sb3JfbWV0YWRhdGEgPSBjb2xvdXJfcGFyc2VyXy5HZXRXZWJNQ29sb3JNZXRhZGF0YSgpOwotICAgIGNvbmZpZy0+c2V0X2NvbG9yX3NwYWNlX2luZm8oY29sb3JfbWV0YWRhdGEuY29sb3Jfc3BhY2UpOwotICAgIGNvbmZpZy0+c2V0X2hkcl9tZXRhZGF0YShjb2xvcl9tZXRhZGF0YS5oZHJfbWV0YWRhdGEpOworICAgIGNvbmZpZy0+c2V0X3dlYm1fY29sb3JfbWV0YWRhdGEoY29sb3JfbWV0YWRhdGEpOwogICB9CiAgIHJldHVybiBjb25maWctPklzVmFsaWRDb25maWcoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvZm9ybWF0cy93ZWJtL3dlYm1fd2VidnR0X3BhcnNlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV93ZWJ2dHRfcGFyc2VyLmgKaW5kZXggOTJlN2QxZC4uODllMWY1NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV93ZWJ2dHRfcGFyc2VyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9mb3JtYXRzL3dlYm0vd2VibV93ZWJ2dHRfcGFyc2VyLmgKQEAgLTE3LDExICsxNyw4IEBACiBjbGFzcyBNRURJQV9FWFBPUlQgV2ViTVdlYlZUVFBhcnNlciB7CiAgcHVibGljOgogICAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIHBhcnNlIHRoZSBXZWJWVFQgY3VlIGZyb20gYSBieXRlIHN0cmVhbS4KLSAgc3RhdGljIHZvaWQgUGFyc2UoY29uc3QgdWludDhfdCogcGF5bG9hZCwKLSAgICAgICAgICAgICAgICAgICAgaW50IHBheWxvYWRfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGlkLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc2V0dGluZ3MsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBjb250ZW50KTsKKyAgc3RhdGljIHZvaWQgUGFyc2UoY29uc3QgdWludDhfdCogcGF5bG9hZCwgaW50IHBheWxvYWRfc2l6ZSwgc3RkOjpzdHJpbmcqIGlkLAorICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogc2V0dGluZ3MsIHN0ZDo6c3RyaW5nKiBjb250ZW50KTsKIAogIHByaXZhdGU6CiAgIC8vIFRoZSBwYXlsb2FkIGlzIHRoZSBlbWJlZGRlZCBXZWJWVFQgY3VlLCBzdG9yZWQgaW4gYSBXZWJNIGJsb2NrLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYTIuZ3lwIGIvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYTIuZ3lwCmluZGV4IDc0YWQ0MjQuLmYyMDJmYWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWEyLmd5cAorKysgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhMi5neXAKQEAgLTIzLDYgKzIzLDE0IEBACiAgICAgICAgICcuLicsCiAgICAgICBdLAogICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICdmZXRjaGVyX2J1ZmZlcmVkX2RhdGFfc291cmNlLmNjJywKKyAgICAgICAgJ2ZldGNoZXJfYnVmZmVyZWRfZGF0YV9zb3VyY2UuaCcsCisgICAgICAgICdtZWRpYV9tb2R1bGUuY2MnLAorICAgICAgICAnbWVkaWFfbW9kdWxlLmgnLAorICAgICAgICAnbWVkaWFfbW9kdWxlX3N0dWIuY2MnLAorICAgICAgICAnbWVkaWFfbW9kdWxlX3N0dWIuaCcsCisgICAgICAgICdtZWRpYV9tb2R1bGVfc3RhcmJvYXJkLmNjJywKKwogICAgICAgICAnYmFzZS9hdWRpb19jb2RlY3MuY2MnLAogICAgICAgICAnYmFzZS9hdWRpb19jb2RlY3MuaCcsCiAgICAgICAgICdiYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmNjJywKQEAgLTM5LDggKzQ3LDEyIEBACiAgICAgICAgICdiYXNlL2NoYW5uZWxfbGF5b3V0LmgnLAogICAgICAgICAnYmFzZS9jb2xvcl9zcGFjZS5jYycsCiAgICAgICAgICdiYXNlL2NvbG9yX3NwYWNlLmgnLAorICAgICAgICAnYmFzZS9kYXRhX3NvdXJjZS5jYycsCisgICAgICAgICdiYXNlL2RhdGFfc291cmNlLmgnLAogICAgICAgICAnYmFzZS9kZWNvZGVyX2J1ZmZlci5jYycsCiAgICAgICAgICdiYXNlL2RlY29kZXJfYnVmZmVyLmgnLAorICAgICAgICAnYmFzZS9kZWNvZGVyX2J1ZmZlcl9jYWNoZS5jYycsCisgICAgICAgICdiYXNlL2RlY29kZXJfYnVmZmVyX2NhY2hlLmgnLAogICAgICAgICAnYmFzZS9kZWNyeXB0X2NvbmZpZy5jYycsCiAgICAgICAgICdiYXNlL2RlY3J5cHRfY29uZmlnLmgnLAogICAgICAgICAnYmFzZS9kZW11eGVyLmNjJywKQEAgLTY5LDYgKzgxLDE5IEBACiAgICAgICAgICdiYXNlL3Jhbmdlcy5oJywKICAgICAgICAgJ2Jhc2Uvc2FtcGxlX2Zvcm1hdC5jYycsCiAgICAgICAgICdiYXNlL3NhbXBsZV9mb3JtYXQuaCcsCisgICAgICAgICdiYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjJywKKyAgICAgICAgJ2Jhc2Uvc2JwbGF5ZXJfc2V0X2JvdW5kc19oZWxwZXIuY2MnLAorICAgICAgICAnYmFzZS9zYnBsYXllcl9zZXRfYm91bmRzX2hlbHBlci5oJywKKyAgICAgICAgJ2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmNjJywKKyAgICAgICAgJ2Jhc2Uvc2hlbGxfYXVkaW9fYnVzLmgnLAorICAgICAgICAnYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuY2MnLAorICAgICAgICAnYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCcsCisgICAgICAgICdiYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmNjJywKKyAgICAgICAgJ2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaCcsCisgICAgICAgICdiYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MnLAorICAgICAgICAnYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgnLAorICAgICAgICAnYmFzZS9zdGFyYm9hcmRfdXRpbHMuY2MnLAorICAgICAgICAnYmFzZS9zdGFyYm9hcmRfdXRpbHMuaCcsCiAgICAgICAgICdiYXNlL3N0cmVhbV9wYXJzZXIuY2MnLAogICAgICAgICAnYmFzZS9zdHJlYW1fcGFyc2VyLmgnLAogICAgICAgICAnYmFzZS9zdHJlYW1fcGFyc2VyX2J1ZmZlci5jYycsCkBAIC05NSw2ICsxMjAsMjAgQEAKICAgICAgICAgJ2ZpbHRlcnMvaDI2NF9wYXJzZXIuaCcsCiAgICAgICAgICdmaWx0ZXJzL2gyNjVfcGFyc2VyLmNjJywKICAgICAgICAgJ2ZpbHRlcnMvaDI2NV9wYXJzZXIuaCcsCisgICAgICAgICdmaWx0ZXJzL3NoZWxsX2F1LmNjJywKKyAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfYXUuaCcsCisgICAgICAgICdmaWx0ZXJzL3NoZWxsX2F2Y19wYXJzZXIuY2MnLAorICAgICAgICAnZmlsdGVycy9zaGVsbF9hdmNfcGFyc2VyLmgnLAorICAgICAgICAnZmlsdGVycy9zaGVsbF9kZW11eGVyLmNjJywKKyAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5oJywKKyAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfbXA0X21hcC5jYycsCisgICAgICAgICdmaWx0ZXJzL3NoZWxsX21wNF9tYXAuaCcsCisgICAgICAgICdmaWx0ZXJzL3NoZWxsX21wNF9wYXJzZXIuY2MnLAorICAgICAgICAnZmlsdGVycy9zaGVsbF9tcDRfcGFyc2VyLmgnLAorICAgICAgICAnZmlsdGVycy9zaGVsbF9wYXJzZXIuY2MnLAorICAgICAgICAnZmlsdGVycy9zaGVsbF9wYXJzZXIuaCcsCisgICAgICAgICdmaWx0ZXJzL3NoZWxsX3Jic3Bfc3RyZWFtLmNjJywKKyAgICAgICAgJ2ZpbHRlcnMvc2hlbGxfcmJzcF9zdHJlYW0uaCcsCiAgICAgICAgICdmaWx0ZXJzL3NvdXJjZV9idWZmZXJfcGxhdGZvcm0uaCcsCiAgICAgICAgICdmaWx0ZXJzL3NvdXJjZV9idWZmZXJfcGxhdGZvcm1fbG93bWVtLmNjJywKICAgICAgICAgJ2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9yYW5nZS5jYycsCkBAIC0xNjksNiArMjA4LDExIEBACiAgICAgICAgICdmb3JtYXRzL3dlYm0vd2VibV92aWRlb19jbGllbnQuaCcsCiAgICAgICAgICdmb3JtYXRzL3dlYm0vd2VibV93ZWJ2dHRfcGFyc2VyLmNjJywKICAgICAgICAgJ2Zvcm1hdHMvd2VibS93ZWJtX3dlYnZ0dF9wYXJzZXIuaCcsCisgICAgICAgICdwbGF5ZXIvYnVmZmVyZWRfZGF0YV9zb3VyY2UuaCcsCisgICAgICAgICdwbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmNjJywKKyAgICAgICAgJ3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuaCcsCisgICAgICAgICdwbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5jYycsCisgICAgICAgICdwbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oJywKICAgICAgIF0sCiAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfYnVmZmVyX2FsbG9jYXRvci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9idWZmZXJfYWxsb2NhdG9yLmgKaW5kZXggZWY3ZjYyMC4uMDI0NzYwNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9idWZmZXJfYWxsb2NhdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9idWZmZXJfYWxsb2NhdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9NRURJQV9CVUZGRVJfQUxMT0NBVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9NRURJQV9NRURJQV9CVUZGRVJfQUxMT0NBVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmNjCmluZGV4IDEyNTBjZmIuLjBjNjhjYmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmgKaW5kZXggYTg3MTM0Mi4uYjA2M2ViNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTUVESUFfTUVESUFfTU9EVUxFX0hfCiAjZGVmaW5lIENPQkFMVF9NRURJQV9NRURJQV9NT0RVTEVfSF8KQEAgLTM1LDEwICszMywxMyBAQAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oIgogI2luY2x1ZGUgImNvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaCIKLSNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oIgorCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2RlbGVnYXRlLmgiCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAibWVkaWEvZmlsdGVycy9zaGVsbF92aWRlb19kZWNvZGVyX2ltcGwuaCIKICNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9kZWxlZ2F0ZS5oIgorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbWVkaWEgewpAQCAtODAsMTQgKzgxLDE4IEBACiAgIHZpcnR1YWwgdm9pZCBPblN1c3BlbmQoKSB7fQogICB2aXJ0dWFsIHZvaWQgT25SZXN1bWUoKSB7fQogCisgIHZpcnR1YWwgc3lzdGVtX3dpbmRvdzo6U3lzdGVtV2luZG93KiBzeXN0ZW1fd2luZG93KCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCiAgIHZvaWQgU3VzcGVuZCgpOwogICB2b2lkIFJlc3VtZSgpOwogCisjaWYgIWRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogI2lmICFkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX0dPTEQpCiAgIHZpcnR1YWwgOjptZWRpYTo6U2hlbGxSYXdWaWRlb0RlY29kZXJGYWN0b3J5KiBHZXRSYXdWaWRlb0RlY29kZXJGYWN0b3J5KCkgewogICAgIHJldHVybiBOVUxMOwogICB9Ci0jZW5kaWYgIC8vICFkZWZpbmVkKENPQkFMVF9SRUxFQVNFKQorI2VuZGlmICAvLyAhZGVmaW5lZChDT0JBTFRfQlVJTERfVFlQRV9HT0xEKQorI2VuZGlmICAvLyAhZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAKICAgLy8gVE9ETzogTW92ZSB0aGUgZm9sbG93aW5nIG1ldGhvZHMgaW50byBjbGFzcyBsaWtlIE1lZGlhTW9kdWxlQmFzZQogICAvLyB0byBlbnN1cmUgdGhhdCBNZWRpYU1vZHVsZSBpcyBhbiBpbnRlcmZhY2UuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZV9zdGFyYm9hcmQuY2MgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZV9zdGFyYm9hcmQuY2MKaW5kZXggNmQyMTg1Zi4uYjdkMmE3YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGVfc3RhcmJvYXJkLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlX3N0YXJib2FyZC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlLmgiCiAKQEAgLTIxLDEwICsxOSwxNSBAQAogI2luY2x1ZGUgImNvYmFsdC9tYXRoL3NpemUuaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvc2hlbGxfbWVkaWFfcGxhdGZvcm1fc3RhcmJvYXJkLmgiCiAjaW5jbHVkZSAiY29iYWx0L3N5c3RlbV93aW5kb3cvc3RhcmJvYXJkL3N5c3RlbV93aW5kb3cuaCIKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9tZWRpYV9sb2cuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oIgorI2Vsc2UgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZmlsdGVyX2NvbGxlY3Rpb24uaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2xvZy5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvbWVzc2FnZV9sb29wX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmgiCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogI2luY2x1ZGUgInN0YXJib2FyZC9tZWRpYS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKIApAQCAtMzQsOCArMzcsMTAgQEAKIG5hbWVzcGFjZSB7CiAKIHVzaW5nIDo6YmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q7CisjaWYgIWRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogdXNpbmcgOjptZWRpYTo6RmlsdGVyQ29sbGVjdGlvbjsKIHVzaW5nIDo6bWVkaWE6Ok1lc3NhZ2VMb29wRmFjdG9yeTsKKyNlbmRpZiAgLy8gIWRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogdXNpbmcgc3lzdGVtX3dpbmRvdzo6U3lzdGVtV2luZG93U3RhcmJvYXJkOwogCiBjbGFzcyBNZWRpYU1vZHVsZVN0YXJib2FyZCA6IHB1YmxpYyBNZWRpYU1vZHVsZSB7CkBAIC02NiwxMCArNzEsMTkgQEAKICAgfQogICBzY29wZWRfcHRyPFdlYk1lZGlhUGxheWVyPiBDcmVhdGVXZWJNZWRpYVBsYXllcigKICAgICAgIDo6bWVkaWE6OldlYk1lZGlhUGxheWVyQ2xpZW50KiBjbGllbnQpIE9WRVJSSURFIHsKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyAgICBTYldpbmRvdyB3aW5kb3cgPSBrU2JXaW5kb3dJbnZhbGlkOworICAgIGlmIChzeXN0ZW1fd2luZG93XykgeworICAgICAgd2luZG93ID0gcG9seW1vcnBoaWNfZG93bmNhc3Q8U3lzdGVtV2luZG93U3RhcmJvYXJkKj4oc3lzdGVtX3dpbmRvd18pCisgICAgICAgICAgICAgICAgICAgLT5HZXRTYldpbmRvdygpOworICAgIH0KKyAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPFdlYk1lZGlhUGxheWVyPihuZXcgOjptZWRpYTo6V2ViTWVkaWFQbGF5ZXJJbXBsKAorICAgICAgICB3aW5kb3csIGNsaWVudCwgdGhpcywgbWVkaWFfcGxhdGZvcm1fLkdldFZpZGVvRnJhbWVQcm92aWRlcigpLAorICAgICAgICBuZXcgOjptZWRpYTo6TWVkaWFMb2cpKTsKKyNlbHNlICAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAgICAgc2NvcGVkX3B0cjxNZXNzYWdlTG9vcEZhY3Rvcnk+IG1lc3NhZ2VfbG9vcF9mYWN0b3J5KG5ldyBNZXNzYWdlTG9vcEZhY3RvcnkpOwogICAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gcGlwZWxpbmVfbWVzc2FnZV9sb29wID0KICAgICAgICAgbWVzc2FnZV9sb29wX2ZhY3RvcnktPkdldE1lc3NhZ2VMb29wKE1lc3NhZ2VMb29wRmFjdG9yeTo6a1BpcGVsaW5lKTsKLSAgICBzY29wZWRfcHRyPEZpbHRlckNvbGxlY3Rpb24+IGZpbHRlcl9jb2xsZWN0aW9uKG5ldyBGaWx0ZXJDb2xsZWN0aW9uKTsKIAogICAgIFNiV2luZG93IHdpbmRvdyA9IGtTYldpbmRvd0ludmFsaWQ7CiAgICAgaWYgKHN5c3RlbV93aW5kb3dfKSB7CkBAIC03OCw4ICs5MiwxMyBAQAogICAgIH0KICAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPFdlYk1lZGlhUGxheWVyPihuZXcgOjptZWRpYTo6V2ViTWVkaWFQbGF5ZXJJbXBsKAogICAgICAgICB3aW5kb3csIGNsaWVudCwgdGhpcywgbWVkaWFfcGxhdGZvcm1fLkdldFZpZGVvRnJhbWVQcm92aWRlcigpLAotICAgICAgICBmaWx0ZXJfY29sbGVjdGlvbi5QYXNzKCksIE5VTEwsIG1lc3NhZ2VfbG9vcF9mYWN0b3J5LlBhc3MoKSwKLSAgICAgICAgbmV3IDo6bWVkaWE6Ok1lZGlhTG9nKSk7CisgICAgICAgIHNjb3BlZF9wdHI8RmlsdGVyQ29sbGVjdGlvbj4obmV3IEZpbHRlckNvbGxlY3Rpb24pLCBOVUxMLAorICAgICAgICBtZXNzYWdlX2xvb3BfZmFjdG9yeS5QYXNzKCksIG5ldyA6Om1lZGlhOjpNZWRpYUxvZykpOworI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyAgfQorCisgIHN5c3RlbV93aW5kb3c6OlN5c3RlbVdpbmRvdyogc3lzdGVtX3dpbmRvdygpIGNvbnN0IE9WRVJSSURFIHsKKyAgICByZXR1cm4gc3lzdGVtX3dpbmRvd187CiAgIH0KIAogIHByaXZhdGU6CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZV9zdHViLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGVfc3R1Yi5jYwppbmRleCBmOWUyMThkLi44NGUxNGU1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZV9zdHViLmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlX3N0dWIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL21lZGlhX21vZHVsZV9zdHViLmgiCiAKQEAgLTMxLDcgKzI5LDcgQEAKIAogICB2b2lkIExvYWRNZWRpYVNvdXJjZSgpIE9WRVJSSURFIHt9CiAgIHZvaWQgTG9hZFByb2dyZXNzaXZlKGNvbnN0IEdVUkwmIHVybCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXJlZERhdGFTb3VyY2U+JiBkYXRhX3NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3B0cjxCdWZmZXJlZERhdGFTb3VyY2U+IGRhdGFfc291cmNlLAogICAgICAgICAgICAgICAgICAgICAgICA6Om1lZGlhOjpXZWJNZWRpYVBsYXllcjo6Q09SU01vZGUgY29yc19tb2RlKSBPVkVSUklERSB7CiAgICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUih1cmwpOwogICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZGF0YV9zb3VyY2UpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGVfc3R1Yi5oIGIvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGVfc3R1Yi5oCmluZGV4IGE5ZTE3NDIuLjI3ZGFjODkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlX3N0dWIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZV9zdHViLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9NRURJQV9NT0RVTEVfU1RVQl9IXwogI2RlZmluZSBDT0JBTFRfTUVESUFfTUVESUFfTU9EVUxFX1NUVUJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlX3dpbi5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvbWVkaWFfbW9kdWxlX3dpbi5jYwppbmRleCAwZjYxNGUwLi4zYWIxZGFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL21lZGlhX21vZHVsZV93aW4uY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGVfd2luLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9tZWRpYV9tb2R1bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvYnVmZmVyZWRfZGF0YV9zb3VyY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL2J1ZmZlcmVkX2RhdGFfc291cmNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDIwNGU2YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL2J1ZmZlcmVkX2RhdGFfc291cmNlLmgKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfUExBWUVSX0JVRkZFUkVEX0RBVEFfU09VUkNFX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9QTEFZRVJfQlVGRkVSRURfREFUQV9TT1VSQ0VfSF8KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RhdGFfc291cmNlLmgiCisjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKK2VudW0gUHJlbG9hZCB7CisgIGtQcmVsb2FkTm9uZSwKKyAga1ByZWxvYWRNZXRhRGF0YSwKKyAga1ByZWxvYWRBdXRvLAorfTsKKworLy8gVE9ETzogSW52ZXN0aWdhdGUgaWYgd2Ugc3RpbGwgbmVlZCBCdWZmZXJlZERhdGFTb3VyY2UuCitjbGFzcyBCdWZmZXJlZERhdGFTb3VyY2UgOiBwdWJsaWMgRGF0YVNvdXJjZSB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgU2V0UHJlbG9hZChQcmVsb2FkIHByZWxvYWQpIHsgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihwcmVsb2FkKTsgfQorICB2aXJ0dWFsIGJvb2wgSGFzU2luZ2xlT3JpZ2luKCkgeyByZXR1cm4gdHJ1ZTsgfQorICB2aXJ0dWFsIGJvb2wgRGlkUGFzc0NPUlNBY2Nlc3NDaGVjaygpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KKyAgdmlydHVhbCB2b2lkIEFib3J0KCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9QTEFZRVJfQlVGRkVSRURfREFUQV9TT1VSQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL21pbWVfdXRpbF9jZXJ0aWZpY2F0ZV90eXBlX2xpc3QuaCBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL21pbWVfdXRpbF9jZXJ0aWZpY2F0ZV90eXBlX2xpc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jM2QyOTQ3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvbWltZV91dGlsX2NlcnRpZmljYXRlX3R5cGVfbGlzdC5oCkBAIC0wLDAgKzEsMTMgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIFRoaXMgZmlsZSBpbnRlbnRpb25hbGx5IGRvZXMgbm90IGhhdmUgaGVhZGVyIGd1YXJkcywgaXQncyBpbmNsdWRlZAorLy8gaW5zaWRlIGEgbWFjcm8gdG8gZ2VuZXJhdGUgZW51bS4KKworLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBsaXN0IG9mIGNlcnRpZmljYXRlIE1JTUUgdHlwZXMuCisKK0NFUlRJRklDQVRFX01JTUVfVFlQRShVTktOT1dOLCAwKQorQ0VSVElGSUNBVEVfTUlNRV9UWVBFKFg1MDlfVVNFUl9DRVJULCAxKQorQ0VSVElGSUNBVEVfTUlNRV9UWVBFKFg1MDlfQ0FfQ0VSVCwgMikKK0NFUlRJRklDQVRFX01JTUVfVFlQRShQS0NTMTJfQVJDSElWRSwgMykKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXIuaCBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lNzUwYjYxCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oCkBAIC0wLDAgKzEsMjcyIEBACisvLyBDb3B5cmlnaHQgKGMpIDIwMTIgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaWZuZGVmIENPQkFMVF9NRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfSF8KKworLy8gVGhlIHRlbXBvcmFyeSBob21lIGZvciBXZWJNZWRpYVBsYXllciBhbmQgV2ViTWVkaWFQbGF5ZXJDbGllbnQuIFRoZXkgYXJlIHRoZQorLy8gaW50ZXJmYWNlIGJldHdlZW4gdGhlIEhUTUxNZWRpYUVsZW1lbnQgYW5kIHRoZSBtZWRpYSBzdGFjay4KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3dlYWtfcHRyLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvcmFuZ2VzLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL3BsYXllci9idWZmZXJlZF9kYXRhX3NvdXJjZS5oIgorI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgorI2luY2x1ZGUgInVpL2dmeC9yZWN0LmgiCisjaW5jbHVkZSAidWkvZ2Z4L3NpemUuaCIKKworLy8gRGlzYWJsZSBgdW5yZWZlcmVuY2VkIGZvcm1hbCBwYXJhbWV0ZXJgIGFzIHdlIGhhdmUgbWFueSBzdHViIGZ1bmN0aW9ucyBpbgorLy8gdGhpcyBmaWxlIGFuZCB3ZSB3YW50IHRvIGtlZXAgdGhlaXIgcGFyYW1ldGVycy4KK01TVkNfUFVTSF9ESVNBQkxFX1dBUk5JTkcoNDEwMCkKKworbmFtZXNwYWNlIG1lZGlhIHsKKworY2xhc3MgV2ViTWVkaWFQbGF5ZXIgeworIHB1YmxpYzoKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIHB1bmNoIHRocm91Z2ggYm94IHNob3VsZCBiZSByZW5kZXJlZC4gIFJldHVybiBmYWxzZSBpZgorICAvLyBubyBwdW5jaCB0aHJvdWdoIGJveCBzaG91bGQgYmUgcmVuZGVyZWQuCisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8Ym9vbChjb25zdCBnZng6OlJlY3QmKT4gU2V0Qm91bmRzQ0I7CisKKyAgZW51bSBOZXR3b3JrU3RhdGUgeworICAgIGtOZXR3b3JrU3RhdGVFbXB0eSwKKyAgICBrTmV0d29ya1N0YXRlSWRsZSwKKyAgICBrTmV0d29ya1N0YXRlTG9hZGluZywKKyAgICBrTmV0d29ya1N0YXRlTG9hZGVkLAorICAgIGtOZXR3b3JrU3RhdGVGb3JtYXRFcnJvciwKKyAgICBrTmV0d29ya1N0YXRlTmV0d29ya0Vycm9yLAorICAgIGtOZXR3b3JrU3RhdGVEZWNvZGVFcnJvciwKKyAgfTsKKworICBlbnVtIFJlYWR5U3RhdGUgeworICAgIGtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcsCisgICAga1JlYWR5U3RhdGVIYXZlTWV0YWRhdGEsCisgICAga1JlYWR5U3RhdGVIYXZlQ3VycmVudERhdGEsCisgICAga1JlYWR5U3RhdGVIYXZlRnV0dXJlRGF0YSwKKyAgICBrUmVhZHlTdGF0ZUhhdmVFbm91Z2hEYXRhLAorICB9OworCisgIGVudW0gQWRkSWRTdGF0dXMgeworICAgIGtBZGRJZFN0YXR1c09rLAorICAgIGtBZGRJZFN0YXR1c05vdFN1cHBvcnRlZCwKKyAgICBrQWRkSWRTdGF0dXNSZWFjaGVkSWRMaW1pdAorICB9OworCisgIGVudW0gRW5kT2ZTdHJlYW1TdGF0dXMgeworICAgIGtFbmRPZlN0cmVhbVN0YXR1c05vRXJyb3IsCisgICAga0VuZE9mU3RyZWFtU3RhdHVzTmV0d29ya0Vycm9yLAorICAgIGtFbmRPZlN0cmVhbVN0YXR1c0RlY29kZUVycm9yLAorICB9OworCisgIC8vIFJlcHJlc2VudHMgc3luY2hyb25vdXMgZXhjZXB0aW9ucyB0aGF0IGNhbiBiZSB0aHJvd24gZnJvbSB0aGUgRW5jcnlwdGVkCisgIC8vIE1lZGlhIG1ldGhvZHMuIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gdGhlIGFzeW5jaHJvbm91cyBNZWRpYUtleUVycm9yLgorICBlbnVtIE1lZGlhS2V5RXhjZXB0aW9uIHsKKyAgICBrTWVkaWFLZXlFeGNlcHRpb25Ob0Vycm9yLAorICAgIGtNZWRpYUtleUV4Y2VwdGlvbkludmFsaWRQbGF5ZXJTdGF0ZSwKKyAgICBrTWVkaWFLZXlFeGNlcHRpb25LZXlTeXN0ZW1Ob3RTdXBwb3J0ZWQsCisgIH07CisKKyAgZW51bSBDT1JTTW9kZSB7CisgICAga0NPUlNNb2RlVW5zcGVjaWZpZWQsCisgICAga0NPUlNNb2RlQW5vbnltb3VzLAorICAgIGtDT1JTTW9kZVVzZUNyZWRlbnRpYWxzLAorICB9OworCisgIHZpcnR1YWwgfldlYk1lZGlhUGxheWVyKCkge30KKworICB2aXJ0dWFsIHZvaWQgTG9hZE1lZGlhU291cmNlKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9hZFByb2dyZXNzaXZlKGNvbnN0IEdVUkwmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SU01vZGUgY29yc19tb2RlKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBDYW5jZWxMb2FkKCkgPSAwOworCisgIC8vIFBsYXliYWNrIGNvbnRyb2xzLgorICB2aXJ0dWFsIHZvaWQgUGxheSgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFBhdXNlKCkgPSAwOworICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNGdWxsc2NyZWVuKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgU3VwcG9ydHNTYXZlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgU2VlayhmbG9hdCBzZWNvbmRzKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZXRFbmRUaW1lKGZsb2F0IHNlY29uZHMpID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFJhdGUoZmxvYXQgcmF0ZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgU2V0VmlzaWJsZShib29sIHZpc2libGUpID0gMDsKKyAgdmlydHVhbCBjb25zdCBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiYgR2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgPSAwOworICB2aXJ0dWFsIGZsb2F0IEdldE1heFRpbWVTZWVrYWJsZSgpIGNvbnN0ID0gMDsKKworICAvLyBTdXNwZW5kL1Jlc3VtZQorICB2aXJ0dWFsIHZvaWQgU3VzcGVuZCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlc3VtZSgpID0gMDsKKworICAvLyBUcnVlIGlmIHRoZSBsb2FkZWQgbWVkaWEgaGFzIGEgcGxheWFibGUgdmlkZW8vYXVkaW8gdHJhY2suCisgIHZpcnR1YWwgYm9vbCBIYXNWaWRlbygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIEhhc0F1ZGlvKCkgY29uc3QgPSAwOworCisgIC8vIERpbWVuc2lvbiBvZiB0aGUgdmlkZW8uCisgIHZpcnR1YWwgZ2Z4OjpTaXplIEdldE5hdHVyYWxTaXplKCkgY29uc3QgPSAwOworCisgIC8vIEdldHRlcnMgb2YgcGxheWJhY2sgc3RhdGUuCisgIHZpcnR1YWwgYm9vbCBJc1BhdXNlZCgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBib29sIElzU2Vla2luZygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBmbG9hdCBHZXREdXJhdGlvbigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBmbG9hdCBHZXRDdXJyZW50VGltZSgpIGNvbnN0ID0gMDsKKworICAvLyBHZXQgcmF0ZSBvZiBsb2FkaW5nIHRoZSByZXNvdXJjZS4KKyAgdmlydHVhbCBpbnQgR2V0RGF0YVJhdGUoKSBjb25zdCA9IDA7CisKKyAgLy8gSW50ZXJuYWwgc3RhdGVzIG9mIGxvYWRpbmcgYW5kIG5ldHdvcmsuCisgIHZpcnR1YWwgTmV0d29ya1N0YXRlIEdldE5ldHdvcmtTdGF0ZSgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBSZWFkeVN0YXRlIEdldFJlYWR5U3RhdGUoKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBib29sIERpZExvYWRpbmdQcm9ncmVzcygpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIGJvb2wgSGFzU2luZ2xlU2VjdXJpdHlPcmlnaW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBEaWRQYXNzQ09SU0FjY2Vzc0NoZWNrKCkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgZmxvYXQgTWVkaWFUaW1lRm9yVGltZVZhbHVlKGZsb2F0IHRpbWVWYWx1ZSkgY29uc3QgPSAwOworCisgIHZpcnR1YWwgdW5zaWduZWQgR2V0RGVjb2RlZEZyYW1lQ291bnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgR2V0RHJvcHBlZEZyYW1lQ291bnQoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdW5zaWduZWQgR2V0QXVkaW9EZWNvZGVkQnl0ZUNvdW50KCkgY29uc3QgPSAwOworICB2aXJ0dWFsIHVuc2lnbmVkIEdldFZpZGVvRGVjb2RlZEJ5dGVDb3VudCgpIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHNjb3BlZF9yZWZwdHI8U2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI+IEdldFZpZGVvRnJhbWVQcm92aWRlcigpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHZpcnR1YWwgQWRkSWRTdGF0dXMgU291cmNlQWRkSWQoCisgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyogaWQgKi8sIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiB0eXBlICovLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiAvKiBjb2RlY3MgKi8pIHsKKyAgICByZXR1cm4ga0FkZElkU3RhdHVzTm90U3VwcG9ydGVkOworICB9CisgIHZpcnR1YWwgYm9vbCBTb3VyY2VSZW1vdmVJZChjb25zdCBzdGQ6OnN0cmluZyYgLyogaWQgKi8pIHsgcmV0dXJuIGZhbHNlOyB9CisgIHZpcnR1YWwgUmFuZ2VzPGJhc2U6OlRpbWVEZWx0YT4gU291cmNlQnVmZmVyZWQoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGlkICovKSB7CisgICAgcmV0dXJuIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+KCk7CisgIH0KKyAgdmlydHVhbCBib29sIFNvdXJjZUFwcGVuZChjb25zdCBzdGQ6OnN0cmluZyYgLyogaWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogLyogZGF0YSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCAvKiBsZW5ndGggKi8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgdmlydHVhbCBib29sIFNvdXJjZUFib3J0KGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBpZCAqLykgeyByZXR1cm4gZmFsc2U7IH0KKyAgdmlydHVhbCBkb3VibGUgU291cmNlR2V0RHVyYXRpb24oKSBjb25zdCB7IHJldHVybiAwLjA7IH0KKyAgdmlydHVhbCB2b2lkIFNvdXJjZVNldER1cmF0aW9uKGRvdWJsZSAvKiBkdXJhdGlvbiAqLykge30KKyAgdmlydHVhbCB2b2lkIFNvdXJjZUVuZE9mU3RyZWFtKEVuZE9mU3RyZWFtU3RhdHVzIC8qIHN0YXR1cyAqLykge30KKyAgdmlydHVhbCBib29sIFNvdXJjZVNldFRpbWVzdGFtcE9mZnNldChjb25zdCBzdGQ6OnN0cmluZyYgLyogaWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIC8qIG9mZnNldCAqLykgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIC8vIFJldHVybnMgd2hldGhlciBrZXlTeXN0ZW0gaXMgc3VwcG9ydGVkLiBJZiB0cnVlLCB0aGUgcmVzdWx0IHdpbGwgYmUKKyAgLy8gcmVwb3J0ZWQgYnkgYW4gZXZlbnQuCisgIHZpcnR1YWwgTWVkaWFLZXlFeGNlcHRpb24gR2VuZXJhdGVLZXlSZXF1ZXN0KAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGtleV9zeXN0ZW0gKi8sIGNvbnN0IHVuc2lnbmVkIGNoYXIqIC8qIGluaXRfZGF0YSAqLywKKyAgICAgIHVuc2lnbmVkIC8qIGluaXRfZGF0YV9sZW5ndGggKi8pIHsKKyAgICByZXR1cm4ga01lZGlhS2V5RXhjZXB0aW9uS2V5U3lzdGVtTm90U3VwcG9ydGVkOworICB9CisgIHZpcnR1YWwgTWVkaWFLZXlFeGNlcHRpb24gQWRkS2V5KGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBrZXlfc3lzdGVtICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiAvKiBrZXkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIC8qIGtleV9sZW5ndGggKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIC8qIGluaXRfZGF0YSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgLyogaW5pdF9kYXRhX2xlbmd0aCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIHNlc3Npb25faWQgKi8pIHsKKyAgICByZXR1cm4ga01lZGlhS2V5RXhjZXB0aW9uS2V5U3lzdGVtTm90U3VwcG9ydGVkOworICB9CisgIHZpcnR1YWwgTWVkaWFLZXlFeGNlcHRpb24gQ2FuY2VsS2V5UmVxdWVzdCgKKyAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBrZXlfc3lzdGVtICovLAorICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIHNlc3Npb25faWQgKi8pIHsKKyAgICByZXR1cm4ga01lZGlhS2V5RXhjZXB0aW9uS2V5U3lzdGVtTm90U3VwcG9ydGVkOworICB9CisKKyAgdmlydHVhbCBTZXRCb3VuZHNDQiBHZXRTZXRCb3VuZHNDQigpIHsgcmV0dXJuIFNldEJvdW5kc0NCKCk7IH0KKworICAvLyBJbnN0cnVjdCBXZWJNZWRpYVBsYXllciB0byBlbnRlci9leGl0IGZ1bGxzY3JlZW4uCisgIHZpcnR1YWwgdm9pZCBFbnRlckZ1bGxzY3JlZW4oKSB7fQorICB2aXJ0dWFsIHZvaWQgRXhpdEZ1bGxzY3JlZW4oKSB7fQorICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIHBsYXllciBjYW4gZW50ZXIgZnVsbHNjcmVlbi4KKyAgdmlydHVhbCBib29sIENhbkVudGVyRnVsbHNjcmVlbigpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKKyAgLy8gUmV0dXJucyB0aGUgYWRkcmVzcyBhbmQgc2l6ZSBvZiBhIGNodW5rIG9mIG1lbW9yeSB0byBiZSBpbmNsdWRlZCBpbiBhCisgIC8vIGRlYnVnIHJlcG9ydC4gTWF5IG5vdCBiZSBzdXBwb3J0ZWQgb24gYWxsIHBsYXRmb3Jtcy4gVGhlIHJldHVybmVkIGFkZHJlc3MKKyAgLy8gc2hvdWxkIHJlbWFpbiB2YWxpZCBhcyBsb25nIGFzIHRoZSBXZWJNZWRpYVBsYXllciBpbnN0YW5jZSBpcyBhbGl2ZS4KKyAgdmlydHVhbCBib29sIEdldERlYnVnUmVwb3J0RGF0YUFkZHJlc3Modm9pZCoqIC8qb3V0X2FkZHJlc3MqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90KiAvKm91dF9zaXplKi8pIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK307CisKK2NsYXNzIFdlYk1lZGlhUGxheWVyQ2xpZW50IHsKKyBwdWJsaWM6CisgIGVudW0gTWVkaWFLZXlFcnJvckNvZGUgeworICAgIGtNZWRpYUtleUVycm9yQ29kZVVua25vd24gPSAxLAorICAgIGtNZWRpYUtleUVycm9yQ29kZUNsaWVudCwKKyAgICBrTWVkaWFLZXlFcnJvckNvZGVTZXJ2aWNlLAorICAgIGtNZWRpYUtleUVycm9yQ29kZU91dHB1dCwKKyAgICBrTWVkaWFLZXlFcnJvckNvZGVIYXJkd2FyZUNoYW5nZSwKKyAgICBrTWVkaWFLZXlFcnJvckNvZGVEb21haW4sCisgICAga1Vua25vd25FcnJvciA9IGtNZWRpYUtleUVycm9yQ29kZVVua25vd24sCisgICAga0NsaWVudEVycm9yID0ga01lZGlhS2V5RXJyb3JDb2RlQ2xpZW50LAorICAgIGtTZXJ2aWNlRXJyb3IgPSBrTWVkaWFLZXlFcnJvckNvZGVTZXJ2aWNlLAorICAgIGtPdXRwdXRFcnJvciA9IGtNZWRpYUtleUVycm9yQ29kZU91dHB1dCwKKyAgICBrSGFyZHdhcmVDaGFuZ2VFcnJvciA9IGtNZWRpYUtleUVycm9yQ29kZUhhcmR3YXJlQ2hhbmdlLAorICAgIGtEb21haW5FcnJvciA9IGtNZWRpYUtleUVycm9yQ29kZURvbWFpbiwKKyAgfTsKKworICB2aXJ0dWFsIHZvaWQgTmV0d29ya1N0YXRlQ2hhbmdlZCgpID0gMDsKKyAgdmlydHVhbCB2b2lkIFJlYWR5U3RhdGVDaGFuZ2VkKCkgPSAwOworICB2aXJ0dWFsIHZvaWQgVGltZUNoYW5nZWQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEdXJhdGlvbkNoYW5nZWQoKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBQbGF5YmFja1N0YXRlQ2hhbmdlZCgpID0gMDsKKyAgLy8gVE9ETzogUmV2aXNpdCB0aGUgbmVjZXNzaXR5IG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb24uCisgIHZpcnR1YWwgdm9pZCBTZXRPcGFxdWUoYm9vbCAvKiBvcGFxdWUgKi8pIHt9CisgIHZpcnR1YWwgdm9pZCBTYXdVbnN1cHBvcnRlZFRyYWNrcygpID0gMDsKKyAgdmlydHVhbCBmbG9hdCBWb2x1bWUoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBTb3VyY2VPcGVuZWQoQ2h1bmtEZW11eGVyKiBjaHVua19kZW11eGVyKSA9IDA7CisgIHZpcnR1YWwgc3RkOjpzdHJpbmcgU291cmNlVVJMKCkgY29uc3QgPSAwOworICAvLyBUT0RPOiBNYWtlIHRoZSBFTUUgcmVsYXRlZCBmdW5jdGlvbnMgcHVyZSB2aXJ0dWFsIGFnYWluIG9uY2UKKyAgLy8gd2UgaGF2ZSBwcm9wZXIgRU1FIGltcGxlbWVudGF0aW9uLiBDdXJyZW50bHkgZW1wdHkgaW1wbGVtZW50YXRpb24gYXJlCisgIC8vIHByb3ZpZGVkIHRvIG1ha2UgbWVkaWEgdGVtcG9yYXJpbHkgd29yay4KKyAgdmlydHVhbCB2b2lkIEtleUFkZGVkKGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBrZXlfc3lzdGVtICovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIHNlc3Npb25faWQgKi8pIHsKKyAgICBOT1RJTVBMRU1FTlRFRCgpOworICB9CisgIHZpcnR1YWwgdm9pZCBLZXlFcnJvcihjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiAvKiBzZXNzaW9uX2lkICovLCBNZWRpYUtleUVycm9yQ29kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIHNob3J0IC8qIHN5c3RlbV9jb2RlICovKSB7CisgICAgTk9USU1QTEVNRU5URUQoKTsKKyAgfQorICB2aXJ0dWFsIHZvaWQgS2V5TWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgLyoga2V5X3N5c3RlbSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIHNlc3Npb25faWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIC8qIG1lc3NhZ2UgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIC8qIG1lc3NhZ2VfbGVuZ3RoICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgLyogZGVmYXVsdF91cmwgKi8pIHsKKyAgICBOT1RJTVBMRU1FTlRFRCgpOworICB9CisgIHZpcnR1YWwgdm9pZCBLZXlOZWVkZWQoY29uc3Qgc3RkOjpzdHJpbmcmIC8qIGtleV9zeXN0ZW0gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIC8qIHNlc3Npb25faWQgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdW5zaWduZWQgY2hhciogLyogaW5pdF9kYXRhICovLAorICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIC8qIGluaXRfZGF0YV9sZW5ndGggKi8pIHsKKyAgICBOT1RJTVBMRU1FTlRFRCgpOworICB9CisgIC8vIFRPRE86IFJldmlzaXQgdGhlIG5lY2Vzc2l0eSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucy4KKyAgdmlydHVhbCB2b2lkIENsb3NlSGVscGVyUGx1Z2luKCkgeyBOT1RSRUFDSEVEKCk7IH0KKyAgdmlydHVhbCB2b2lkIERpc2FibGVBY2NlbGVyYXRlZENvbXBvc2l0aW5nKCkge30KKworIHByb3RlY3RlZDoKKyAgfldlYk1lZGlhUGxheWVyQ2xpZW50KCkge30KK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCitNU1ZDX1BPUF9XQVJOSU5HKCkKKworI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfZGVsZWdhdGUuaCBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfZGVsZWdhdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDZlMjM0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9kZWxlZ2F0ZS5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX0RFTEVHQVRFX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9ERUxFR0FURV9IXworCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorCituYW1lc3BhY2UgbWVkaWEgeworCitjbGFzcyBXZWJNZWRpYVBsYXllcjsKKworY2xhc3MgV2ViTWVkaWFQbGF5ZXJEZWxlZ2F0ZSB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJQbGF5ZXIoV2ViTWVkaWFQbGF5ZXIqIHBsYXllcikgPSAwOworICB2aXJ0dWFsIHZvaWQgVW5yZWdpc3RlclBsYXllcihXZWJNZWRpYVBsYXllciogcGxheWVyKSA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgfldlYk1lZGlhUGxheWVyRGVsZWdhdGUoKSB7fQorfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX0RFTEVHQVRFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjM1NTJlNQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5jYwpAQCAtMCwwICsxLDc0MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oIgorCisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2JpbmQuaCIKKyNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgorI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKKyNpbmNsdWRlICJiYXNlL2Zsb2F0X3V0aWwuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgorI2luY2x1ZGUgImJhc2UvbWV0cmljcy9oaXN0b2dyYW0uaCIKKyNpbmNsdWRlICJiYXNlL3N0cmluZ19udW1iZXJfY29udmVyc2lvbnMuaCIKKyNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2JpbmRfdG9fY3VycmVudF9sb29wLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbGltaXRzLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvbWVkaWFfbG9nLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuaCIKKworbmFtZXNwYWNlIHsKKworLy8gTGltaXRzIHRoZSByYW5nZSBvZiBwbGF5YmFjayByYXRlLgorLy8KKy8vIFRPRE8oa3lsZXApOiBSZXZpc2l0IHRoZXNlLgorLy8KKy8vIFZpc3RhIGhhcyBzdWJzdGFudGlhbGx5IGxvd2VyIHBlcmZvcm1hbmNlIHRoYW4gWFAgb3IgV2luZG93czcuICBJZiB5b3Ugc3BlZWQKKy8vIHVwIGEgdmlkZW8gdG9vIG11Y2gsIGl0IGNhbid0IGtlZXAgdXAsIGFuZCByZW5kZXJpbmcgc3RvcHMgdXBkYXRpbmcgZXhjZXB0IG9uCisvLyB0aGUgdGltZSBiYXIuIEZvciByZWFsbHkgaGlnaCBzcGVlZHMsIGF1ZGlvIGJlY29tZXMgYSBib3R0bGVuZWNrIGFuZCB3ZSBqdXN0CisvLyB1c2UgdXAgdGhlIGRhdGEgd2UgaGF2ZSwgd2hpY2ggbWF5IG5vdCBhY2hpZXZlIHRoZSBzcGVlZCByZXF1ZXN0ZWQsIGJ1dCB3aWxsCisvLyBub3QgY3Jhc2ggdGhlIHRhYi4KKy8vCisvLyBBIHZlcnkgc2xvdyBzcGVlZCwgaWUgMC4wMDAwMDAwMXgsIGNhdXNlcyB0aGUgbWFjaGluZSB0byBsb2NrIHVwLiAoSXQgc2VlbXMKKy8vIGxpa2UgYSBidXN5IGxvb3ApLiBJdCBnZXRzIHVucmVzcG9uc2l2ZSwgYWx0aG91Z2ggaXRzIG5vdCBjb21wbGV0ZWx5IGRlYWQuCisvLworLy8gQWxzbyBvdXIgdGltZXJzIGFyZSBub3QgdmVyeSBhY2N1cmF0ZSAoZXNwZWNpYWxseSBmb3Igb2dnKSwgd2hpY2ggYmVjb21lcworLy8gZXZpZGVudCBhdCBsb3cgc3BlZWRzIGFuZCBvbiBWaXN0YS4gU2luY2Ugb3RoZXIgc3BlZWRzIGFyZSByaXNreSBhbmQgb3V0c2lkZQorLy8gdGhlIG5vcm1zLCB3ZSB0aGluayAxLzE2eCB0byAxNnggaXMgYSBzYWZlIGFuZCB1c2VmdWwgcmFuZ2UgZm9yIG5vdy4KK2NvbnN0IGZsb2F0IGtNaW5SYXRlID0gMC4wNjI1ZjsKK2NvbnN0IGZsb2F0IGtNYXhSYXRlID0gMTYuMGY7CisKKy8vIFByZWZpeCBmb3IgaGlzdG9ncmFtcyByZWxhdGVkIHRvIEVuY3J5cHRlZCBNZWRpYSBFeHRlbnNpb25zLgorY29uc3QgY2hhcioga01lZGlhRW1lID0gIk1lZGlhLkVNRS4iOworCisjaWYgZGVmaW5lZChDT0JBTFRfU0tJUF9TRUVLX1JFUVVFU1RfTkVBUl9FTkQpCisvLyBPbiBzb21lIHBsYXRmb3JtcywgdGhlIHVuZGVybHlpbmcgbWVkaWEgcGxheWVyIGNhbiBoYW5nIGlmIHdlIGtlZXAgc2Vla2luZyB0bworLy8gYSBwb3NpdGlvbiB0aGF0IGlzIG5lYXIgdGhlIGVuZCBvZiB0aGUgdmlkZW8uIFNvIHdlIGlnbm9yZSBhbnkgc2Vla3MgbmVhciB0aGUKKy8vIGVuZCBvZiBzdHJlYW0gcG9zaXRpb24gd2hlbiB0aGUgY3VycmVudCBwbGF5YmFjayBwb3NpdGlvbiBpcyBhbHNvIG5lYXIgdGhlCisvLyBlbmQgb2YgdGhlIHN0cmVhbS4gSW4gdGhpcyBjYXNlLCAibmVhciB0aGUgZW5kIG9mIHN0cmVhbSIgbWVhbnMgInBvc2l0aW9uCisvLyBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gZHVyYXRpb24oKSAtIGtFbmRPZlN0cmVhbUVwc2lsb25JblNlY29uZHMiLgorY29uc3QgZG91YmxlIGtFbmRPZlN0cmVhbUVwc2lsb25JblNlY29uZHMgPSAyLjsKKworYm9vbCBJc05lYXJUaGVFbmRPZlN0cmVhbShjb25zdCBtZWRpYTo6V2ViTWVkaWFQbGF5ZXJJbXBsKiB3bXBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgcG9zaXRpb24pIHsKKyAgZmxvYXQgZHVyYXRpb24gPSB3bXBpLT5HZXREdXJhdGlvbigpOworICBpZiAoYmFzZTo6SXNGaW5pdGUoZHVyYXRpb24pKSB7CisgICAgLy8gSWYgdmlkZW8gaXMgdmVyeSBzaG9ydCwgd2UgYWx3YXlzIHRyZWF0IGEgcG9zaXRpb24gYXMgbmVhciB0aGUgZW5kLgorICAgIGlmIChkdXJhdGlvbiA8PSBrRW5kT2ZTdHJlYW1FcHNpbG9uSW5TZWNvbmRzKSByZXR1cm4gdHJ1ZTsKKyAgICBpZiAocG9zaXRpb24gPj0gZHVyYXRpb24gLSBrRW5kT2ZTdHJlYW1FcHNpbG9uSW5TZWNvbmRzKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX1NLSVBfU0VFS19SRVFVRVNUX05FQVJfRU5EKQorCitiYXNlOjpUaW1lRGVsdGEgQ29udmVydFNlY29uZHNUb1RpbWVzdGFtcChmbG9hdCBzZWNvbmRzKSB7CisgIGZsb2F0IG1pY3Jvc2Vjb25kcyA9IHNlY29uZHMgKiBiYXNlOjpUaW1lOjprTWljcm9zZWNvbmRzUGVyU2Vjb25kOworICBmbG9hdCBpbnRlZ2VyID0gY2VpbGYobWljcm9zZWNvbmRzKTsKKyAgZmxvYXQgZGlmZmVyZW5jZSA9IGludGVnZXIgLSBtaWNyb3NlY29uZHM7CisKKyAgLy8gUm91bmQgZG93biBpZiBkaWZmZXJlbmNlIGlzIGxhcmdlIGVub3VnaC4KKyAgaWYgKChtaWNyb3NlY29uZHMgPiAwICYmIGRpZmZlcmVuY2UgPiAwLjVmKSB8fAorICAgICAgKG1pY3Jvc2Vjb25kcyA8PSAwICYmIGRpZmZlcmVuY2UgPj0gMC41ZikpIHsKKyAgICBpbnRlZ2VyIC09IDEuMGY7CisgIH0KKworICAvLyBOb3cgd2UgY2FuIHNhZmVseSBjYXN0IHRvIGludDY0IG1pY3Jvc2Vjb25kcy4KKyAgcmV0dXJuIGJhc2U6OlRpbWVEZWx0YTo6RnJvbU1pY3Jvc2Vjb25kcyhzdGF0aWNfY2FzdDxpbnQ2ND4oaW50ZWdlcikpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIG1lZGlhIHsKKworI2RlZmluZSBCSU5EX1RPX1JFTkRFUl9MT09QKGZ1bmN0aW9uKSBcCisgIEJpbmRUb0N1cnJlbnRMb29wKGJhc2U6OkJpbmQoZnVuY3Rpb24sIEFzV2Vha1B0cigpKSkKKworI2RlZmluZSBCSU5EX1RPX1JFTkRFUl9MT09QXzIoZnVuY3Rpb24sIGFyZzEsIGFyZzIpIFwKKyAgQmluZFRvQ3VycmVudExvb3AoYmFzZTo6QmluZChmdW5jdGlvbiwgQXNXZWFrUHRyKCksIGFyZzEsIGFyZzIpKQorCisvLyBUT0RPKGFjb2x3ZWxsKTogSW52ZXN0aWdhdGUgd2hldGhlciB0aGUga2V5X3N5c3RlbSAmIHNlc3Npb25faWQgcGFyYW1ldGVycworLy8gYXJlIHJlYWxseSBuZWNlc3NhcnkuCit0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3Qgc3RkOjpzdHJpbmcmLCBjb25zdCBzdGQ6OnN0cmluZyYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX2FycmF5PHVpbnQ4PiwgaW50KT4gT25OZWVkS2V5Q0I7CisKK1dlYk1lZGlhUGxheWVySW1wbDo6V2ViTWVkaWFQbGF5ZXJJbXBsKAorICAgIFBpcGVsaW5lV2luZG93IHdpbmRvdywgV2ViTWVkaWFQbGF5ZXJDbGllbnQqIGNsaWVudCwKKyAgICBXZWJNZWRpYVBsYXllckRlbGVnYXRlKiBkZWxlZ2F0ZSwKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyPiYgdmlkZW9fZnJhbWVfcHJvdmlkZXIsCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZykKKyAgICA6IHBpcGVsaW5lX3RocmVhZF8oIm1lZGlhX3BpcGVsaW5lIiksCisgICAgICBuZXR3b3JrX3N0YXRlXyhXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZUVtcHR5KSwKKyAgICAgIHJlYWR5X3N0YXRlXyhXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlTm90aGluZyksCisgICAgICBtYWluX2xvb3BfKE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpLAorICAgICAgY2xpZW50XyhjbGllbnQpLAorICAgICAgZGVsZWdhdGVfKGRlbGVnYXRlKSwKKyAgICAgIHZpZGVvX2ZyYW1lX3Byb3ZpZGVyXyh2aWRlb19mcmFtZV9wcm92aWRlciksCisgICAgICBwcm94eV8obmV3IFdlYk1lZGlhUGxheWVyUHJveHkobWFpbl9sb29wXy0+bWVzc2FnZV9sb29wX3Byb3h5KCksIHRoaXMpKSwKKyAgICAgIG1lZGlhX2xvZ18obWVkaWFfbG9nKSwKKyAgICAgIGluY3JlbWVudGVkX2V4dGVybmFsbHlfYWxsb2NhdGVkX21lbW9yeV8oZmFsc2UpLAorICAgICAgaXNfbG9jYWxfc291cmNlXyhmYWxzZSksCisgICAgICBzdXBwb3J0c19zYXZlXyh0cnVlKSwKKyAgICAgIHN1cHByZXNzX2Rlc3RydWN0aW9uX2Vycm9yc18oZmFsc2UpIHsKKyAgbWVkaWFfbG9nXy0+QWRkRXZlbnQoCisgICAgICBtZWRpYV9sb2dfLT5DcmVhdGVFdmVudChNZWRpYUxvZ0V2ZW50OjpXRUJNRURJQVBMQVlFUl9DUkVBVEVEKSk7CisKKyAgcGlwZWxpbmVfdGhyZWFkXy5TdGFydCgpOworICBwaXBlbGluZV8gPSBQaXBlbGluZTo6Q3JlYXRlKHdpbmRvdywgcGlwZWxpbmVfdGhyZWFkXy5tZXNzYWdlX2xvb3BfcHJveHkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZWRpYV9sb2dfKTsKKworICAvLyBBbHNvIHdlIHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgfG1haW5fbG9vcF98IGRlc3RydWN0aW9uLgorICBtYWluX2xvb3BfLT5BZGREZXN0cnVjdGlvbk9ic2VydmVyKHRoaXMpOworCisgIGlmIChkZWxlZ2F0ZV8pIHsKKyAgICBkZWxlZ2F0ZV8tPlJlZ2lzdGVyUGxheWVyKHRoaXMpOworICB9Cit9CisKK1dlYk1lZGlhUGxheWVySW1wbDo6fldlYk1lZGlhUGxheWVySW1wbCgpIHsKKyAgRENIRUNLKCFtYWluX2xvb3BfIHx8IG1haW5fbG9vcF8gPT0gTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisKKyAgaWYgKGRlbGVnYXRlXykgeworICAgIGRlbGVnYXRlXy0+VW5yZWdpc3RlclBsYXllcih0aGlzKTsKKyAgfQorCisgIERlc3Ryb3koKTsKKyAgcHJvZ3Jlc3NpdmVfZGVtdXhlcl8ucmVzZXQoKTsKKyAgY2h1bmtfZGVtdXhlcl8ucmVzZXQoKTsKKworICBtZWRpYV9sb2dfLT5BZGRFdmVudCgKKyAgICAgIG1lZGlhX2xvZ18tPkNyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OldFQk1FRElBUExBWUVSX0RFU1RST1lFRCkpOworCisgIC8vIEZpbmFsbHkgdGVsbCB0aGUgfG1haW5fbG9vcF98IHdlIGRvbid0IHdhbnQgdG8gYmUgbm90aWZpZWQgb2YgZGVzdHJ1Y3Rpb24KKyAgLy8gZXZlbnQuCisgIGlmIChtYWluX2xvb3BfKSB7CisgICAgbWFpbl9sb29wXy0+UmVtb3ZlRGVzdHJ1Y3Rpb25PYnNlcnZlcih0aGlzKTsKKyAgfQorICBwaXBlbGluZV90aHJlYWRfLlN0b3AoKTsKK30KKworbmFtZXNwYWNlIHsKKworLy8gSGVscGVyIGVudW0gZm9yIHJlcG9ydGluZyBzY2hlbWUgaGlzdG9ncmFtcy4KK2VudW0gVVJMU2NoZW1lRm9ySGlzdG9ncmFtIHsKKyAga1Vua25vd25VUkxTY2hlbWUsCisgIGtNaXNzaW5nVVJMU2NoZW1lLAorICBrSHR0cFVSTFNjaGVtZSwKKyAga0h0dHBzVVJMU2NoZW1lLAorICBrRnRwVVJMU2NoZW1lLAorICBrQ2hyb21lRXh0ZW5zaW9uVVJMU2NoZW1lLAorICBrSmF2YXNjcmlwdFVSTFNjaGVtZSwKKyAga0ZpbGVVUkxTY2hlbWUsCisgIGtCbG9iVVJMU2NoZW1lLAorICBrRGF0YVVSTFNjaGVtZSwKKyAga0ZpbGVTeXN0ZW1TY2hlbWUsCisgIGtNYXhVUkxTY2hlbWUgPSBrRmlsZVN5c3RlbVNjaGVtZSAgLy8gTXVzdCBiZSBlcXVhbCB0byBoaWdoZXN0IGVudW0gdmFsdWUuCit9OworCitVUkxTY2hlbWVGb3JIaXN0b2dyYW0gVVJMU2NoZW1lKGNvbnN0IEdVUkwmIHVybCkgeworICBpZiAoIXVybC5oYXNfc2NoZW1lKCkpIHJldHVybiBrTWlzc2luZ1VSTFNjaGVtZTsKKyAgaWYgKHVybC5TY2hlbWVJcygiaHR0cCIpKSByZXR1cm4ga0h0dHBVUkxTY2hlbWU7CisgIGlmICh1cmwuU2NoZW1lSXMoImh0dHBzIikpIHJldHVybiBrSHR0cHNVUkxTY2hlbWU7CisgIGlmICh1cmwuU2NoZW1lSXMoImZ0cCIpKSByZXR1cm4ga0Z0cFVSTFNjaGVtZTsKKyAgaWYgKHVybC5TY2hlbWVJcygiY2hyb21lLWV4dGVuc2lvbiIpKSByZXR1cm4ga0Nocm9tZUV4dGVuc2lvblVSTFNjaGVtZTsKKyAgaWYgKHVybC5TY2hlbWVJcygiamF2YXNjcmlwdCIpKSByZXR1cm4ga0phdmFzY3JpcHRVUkxTY2hlbWU7CisgIGlmICh1cmwuU2NoZW1lSXMoImZpbGUiKSkgcmV0dXJuIGtGaWxlVVJMU2NoZW1lOworICBpZiAodXJsLlNjaGVtZUlzKCJibG9iIikpIHJldHVybiBrQmxvYlVSTFNjaGVtZTsKKyAgaWYgKHVybC5TY2hlbWVJcygiZGF0YSIpKSByZXR1cm4ga0RhdGFVUkxTY2hlbWU7CisgIGlmICh1cmwuU2NoZW1lSXMoImZpbGVzeXN0ZW0iKSkgcmV0dXJuIGtGaWxlU3lzdGVtU2NoZW1lOworICByZXR1cm4ga1Vua25vd25VUkxTY2hlbWU7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OkxvYWRNZWRpYVNvdXJjZSgpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIC8vIEhhbmRsZSBhbnkgdm9sdW1lIGNoYW5nZXMgdGhhdCBvY2N1cmVkIGJlZm9yZSBsb2FkKCkuCisgIFNldFZvbHVtZShHZXRDbGllbnQoKS0+Vm9sdW1lKCkpOworCisgIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZUxvYWRpbmcpOworICBTZXRSZWFkeVN0YXRlKFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVOb3RoaW5nKTsKKworICAvLyBNZWRpYSBzb3VyY2UgcGlwZWxpbmVzIGNhbiBzdGFydCBpbW1lZGlhdGVseS4KKyAgY2h1bmtfZGVtdXhlcl8ucmVzZXQobmV3IENodW5rRGVtdXhlcigKKyAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25EZW11eGVyT3BlbmVkKSwKKyAgICAgIEJJTkRfVE9fUkVOREVSX0xPT1AoJldlYk1lZGlhUGxheWVySW1wbDo6T25FbmNyeXB0ZWRNZWRpYUluaXREYXRhKSwKKyAgICAgIG1lZGlhX2xvZ18sIHRydWUpKTsKKworICBzdXBwb3J0c19zYXZlXyA9IGZhbHNlOworICBzdGF0ZV8uaXNfbWVkaWFfc291cmNlID0gdHJ1ZTsKKyAgU3RhcnRQaXBlbGluZShjaHVua19kZW11eGVyXy5nZXQoKSk7Cit9CisKK3ZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpMb2FkUHJvZ3Jlc3NpdmUoCisgICAgY29uc3QgR1VSTCYgdXJsLCBzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2UsCisgICAgQ09SU01vZGUgY29yc19tb2RlKSB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICBVTUFfSElTVE9HUkFNX0VOVU1FUkFUSU9OKCJNZWRpYS5VUkxTY2hlbWUiLCBVUkxTY2hlbWUodXJsKSwga01heFVSTFNjaGVtZSk7CisKKyAgLy8gSGFuZGxlIGFueSB2b2x1bWUgY2hhbmdlcyB0aGF0IG9jY3VyZWQgYmVmb3JlIGxvYWQoKS4KKyAgU2V0Vm9sdW1lKEdldENsaWVudCgpLT5Wb2x1bWUoKSk7CisKKyAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlTG9hZGluZyk7CisgIFNldFJlYWR5U3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpOworICBtZWRpYV9sb2dfLT5BZGRFdmVudChtZWRpYV9sb2dfLT5DcmVhdGVMb2FkRXZlbnQodXJsLnNwZWMoKSkpOworCisgIHByb3h5Xy0+c2V0X2RhdGFfc291cmNlKGRhdGFfc291cmNlLlBhc3MoKSk7CisKKyAgaXNfbG9jYWxfc291cmNlXyA9ICF1cmwuU2NoZW1lSXMoImh0dHAiKSAmJiAhdXJsLlNjaGVtZUlzKCJodHRwcyIpOworCisgIHByb2dyZXNzaXZlX2RlbXV4ZXJfLnJlc2V0KAorICAgICAgbmV3IFNoZWxsRGVtdXhlcihwaXBlbGluZV90aHJlYWRfLm1lc3NhZ2VfbG9vcF9wcm94eSgpLAorICAgICAgICAgICAgICAgICAgICAgICBwcm94eV8tPmRhdGFfc291cmNlKCksIG1lZGlhX2xvZ18pKTsKKworICBzdGF0ZV8uaXNfcHJvZ3Jlc3NpdmUgPSB0cnVlOworICBTdGFydFBpcGVsaW5lKHByb2dyZXNzaXZlX2RlbXV4ZXJfLmdldCgpKTsKK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OkNhbmNlbExvYWQoKSB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlBsYXkoKSB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyNpZiBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKQorICBhdWRpb19mb2N1c19icmlkZ2VfLlJlcXVlc3RBdWRpb0ZvY3VzKCk7CisjZW5kaWYgIC8vIGRlZmluZWQoX19MQl9BTkRST0lEX18pCisKKyAgc3RhdGVfLnBhdXNlZCA9IGZhbHNlOworICBwaXBlbGluZV8tPlNldFBsYXliYWNrUmF0ZShzdGF0ZV8ucGxheWJhY2tfcmF0ZSk7CisKKyAgbWVkaWFfbG9nXy0+QWRkRXZlbnQobWVkaWFfbG9nXy0+Q3JlYXRlRXZlbnQoTWVkaWFMb2dFdmVudDo6UExBWSkpOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6UGF1c2UoKSB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyNpZiBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKQorICBhdWRpb19mb2N1c19icmlkZ2VfLkFiYW5kb25BdWRpb0ZvY3VzKCk7CisjZW5kaWYgIC8vIGRlZmluZWQoX19MQl9BTkRST0lEX18pCisKKyAgc3RhdGVfLnBhdXNlZCA9IHRydWU7CisgIHBpcGVsaW5lXy0+U2V0UGxheWJhY2tSYXRlKDAuMGYpOworICBzdGF0ZV8ucGF1c2VkX3RpbWUgPSBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpOworCisgIG1lZGlhX2xvZ18tPkFkZEV2ZW50KG1lZGlhX2xvZ18tPkNyZWF0ZUV2ZW50KE1lZGlhTG9nRXZlbnQ6OlBBVVNFKSk7Cit9CisKK2Jvb2wgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTdXBwb3J0c0Z1bGxzY3JlZW4oKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTdXBwb3J0c1NhdmUoKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKyAgcmV0dXJuIHN1cHBvcnRzX3NhdmVfOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U2VlayhmbG9hdCBzZWNvbmRzKSB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworI2lmIGRlZmluZWQoQ09CQUxUX1NLSVBfU0VFS19SRVFVRVNUX05FQVJfRU5EKQorICAvLyBJZ25vcmUgYW55IHNlZWsgcmVxdWVzdCB0aGF0IGlzIG5lYXIgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdoZW4gdGhlCisgIC8vIGN1cnJlbnQgcGxheWJhY2sgcG9zaXRpb24gaXMgYWxzbyBuZWFyIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSB0byBhdm9pZAorICAvLyBhIGhhbmcgaW4gdGhlIE1lZGlhRW5naW5lLgorICBpZiAoSXNOZWFyVGhlRW5kT2ZTdHJlYW0odGhpcywgR2V0Q3VycmVudFRpbWUoKSkgJiYKKyAgICAgIElzTmVhclRoZUVuZE9mU3RyZWFtKHRoaXMsIHNlY29uZHMpKSB7CisgICAgcmV0dXJuOworICB9CisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX1NLSVBfU0VFS19SRVFVRVNUX05FQVJfRU5EKQorCisgIGlmIChzdGF0ZV8uc3RhcnRpbmcgfHwgc3RhdGVfLnNlZWtpbmcpIHsKKyAgICBzdGF0ZV8ucGVuZGluZ19zZWVrID0gdHJ1ZTsKKyAgICBzdGF0ZV8ucGVuZGluZ19zZWVrX3NlY29uZHMgPSBzZWNvbmRzOworICAgIGlmIChjaHVua19kZW11eGVyXykgeworICAgICAgY2h1bmtfZGVtdXhlcl8tPkNhbmNlbFBlbmRpbmdTZWVrKENvbnZlcnRTZWNvbmRzVG9UaW1lc3RhbXAoc2Vjb25kcykpOworICAgICAgLy8gVE9ETzogTWlncmF0ZSB0aGUgZm9sbG93aW5nCisgICAgICAvLyBkZWNyeXB0b3JfLT5DYW5jZWxEZWNyeXB0KERlY3J5cHRvcjo6a0F1ZGlvKTsKKyAgICAgIC8vIGRlY3J5cHRvcl8tPkNhbmNlbERlY3J5cHQoRGVjcnlwdG9yOjprVmlkZW8pOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBtZWRpYV9sb2dfLT5BZGRFdmVudChtZWRpYV9sb2dfLT5DcmVhdGVTZWVrRXZlbnQoc2Vjb25kcykpOworCisgIGJhc2U6OlRpbWVEZWx0YSBzZWVrX3RpbWUgPSBDb252ZXJ0U2Vjb25kc1RvVGltZXN0YW1wKHNlY29uZHMpOworCisgIC8vIFVwZGF0ZSBvdXIgcGF1c2VkIHRpbWUuCisgIGlmIChzdGF0ZV8ucGF1c2VkKSBzdGF0ZV8ucGF1c2VkX3RpbWUgPSBzZWVrX3RpbWU7CisKKyAgc3RhdGVfLnNlZWtpbmcgPSB0cnVlOworCisgIGlmIChjaHVua19kZW11eGVyXykgeworICAgIGNodW5rX2RlbXV4ZXJfLT5TdGFydFdhaXRpbmdGb3JTZWVrKHNlZWtfdGltZSk7CisgICAgLy8gVE9ETzogTWlncmF0ZSB0aGUgZm9sbG93aW5nCisgICAgLy8gZGVjcnlwdG9yXy0+Q2FuY2VsRGVjcnlwdChEZWNyeXB0b3I6OmtBdWRpbyk7CisgICAgLy8gZGVjcnlwdG9yXy0+Q2FuY2VsRGVjcnlwdChEZWNyeXB0b3I6OmtWaWRlbyk7CisgIH0KKworICAvLyBLaWNrIG9mZiB0aGUgYXN5bmNocm9ub3VzIHNlZWshCisgIHBpcGVsaW5lXy0+U2VlayhzZWVrX3RpbWUsCisgICAgICAgICAgICAgICAgICBCSU5EX1RPX1JFTkRFUl9MT09QKCZXZWJNZWRpYVBsYXllckltcGw6Ok9uUGlwZWxpbmVTZWVrKSk7Cit9CisKK3ZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXRFbmRUaW1lKGZsb2F0IHNlY29uZHMpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIC8vIFRPRE8oaGNsYW0pOiBhZGQgbWV0aG9kIGNhbGwgd2hlbiBpdCBoYXMgYmVlbiBpbXBsZW1lbnRlZC4KKyAgcmV0dXJuOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U2V0UmF0ZShmbG9hdCByYXRlKSB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICAvLyBUT0RPKGt5bGVwKTogUmVtb3ZlIHdoZW4gc3VwcG9ydCBmb3IgbmVnYXRpdmVzIGlzIGFkZGVkLiBBbHNvLCBtb2RpZnkgdGhlCisgIC8vIGZvbGxvd2luZyBjaGVja3Mgc28gcmV3aW5kIHVzZXMgcmVhc29uYWJsZSB2YWx1ZXMgYWxzby4KKyAgaWYgKHJhdGUgPCAwLjBmKSByZXR1cm47CisKKyAgLy8gTGltaXQgcmF0ZXMgdG8gcmVhc29uYWJsZSB2YWx1ZXMgYnkgY2xhbXBpbmcuCisgIGlmIChyYXRlICE9IDAuMGYpIHsKKyAgICBpZiAocmF0ZSA8IGtNaW5SYXRlKQorICAgICAgcmF0ZSA9IGtNaW5SYXRlOworICAgIGVsc2UgaWYgKHJhdGUgPiBrTWF4UmF0ZSkKKyAgICAgIHJhdGUgPSBrTWF4UmF0ZTsKKyAgfQorCisgIHN0YXRlXy5wbGF5YmFja19yYXRlID0gcmF0ZTsKKyAgaWYgKCFzdGF0ZV8ucGF1c2VkKSB7CisgICAgcGlwZWxpbmVfLT5TZXRQbGF5YmFja1JhdGUocmF0ZSk7CisgIH0KK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlNldFZvbHVtZShmbG9hdCB2b2x1bWUpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIHBpcGVsaW5lXy0+U2V0Vm9sdW1lKHZvbHVtZSk7Cit9CisKK3ZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXRWaXNpYmxlKGJvb2wgdmlzaWJsZSkgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisKKyAgLy8gVE9ETyhoY2xhbSk6IGFkZCBhcHByb3ByaWF0ZSBtZXRob2QgY2FsbCB3aGVuIHBpcGVsaW5lIGhhcyBpdCBpbXBsZW1lbnRlZC4KKyAgcmV0dXJuOworfQorCitib29sIFdlYk1lZGlhUGxheWVySW1wbDo6SGFzVmlkZW8oKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICByZXR1cm4gcGlwZWxpbmVfLT5IYXNWaWRlbygpOworfQorCitib29sIFdlYk1lZGlhUGxheWVySW1wbDo6SGFzQXVkaW8oKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICByZXR1cm4gcGlwZWxpbmVfLT5IYXNBdWRpbygpOworfQorCitnZng6OlNpemUgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXROYXR1cmFsU2l6ZSgpIGNvbnN0IHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIGdmeDo6U2l6ZSBzaXplOworICBwaXBlbGluZV8tPkdldE5hdHVyYWxWaWRlb1NpemUoJnNpemUpOworICByZXR1cm4gc2l6ZTsKK30KKworYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OklzUGF1c2VkKCkgY29uc3QgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisKKyAgcmV0dXJuIHBpcGVsaW5lXy0+R2V0UGxheWJhY2tSYXRlKCkgPT0gMC4wZjsKK30KKworYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OklzU2Vla2luZygpIGNvbnN0IHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIGlmIChyZWFkeV9zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpIHJldHVybiBmYWxzZTsKKworICByZXR1cm4gc3RhdGVfLnNlZWtpbmc7Cit9CisKK2Zsb2F0IFdlYk1lZGlhUGxheWVySW1wbDo6R2V0RHVyYXRpb24oKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICBpZiAocmVhZHlfc3RhdGVfID09IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVOb3RoaW5nKQorICAgIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGZsb2F0Pjo6cXVpZXRfTmFOKCk7CisKKyAgYmFzZTo6VGltZURlbHRhIGR1cmF0aW9uID0gcGlwZWxpbmVfLT5HZXRNZWRpYUR1cmF0aW9uKCk7CisKKyAgLy8gUmV0dXJuIHBvc2l0aXZlIGluZmluaXR5IGlmIHRoZSByZXNvdXJjZSBpcyB1bmJvdW5kZWQuCisgIC8vIGh0dHA6Ly93d3cud2hhdHdnLm9yZy9zcGVjcy93ZWItYXBwcy9jdXJyZW50LXdvcmsvbXVsdGlwYWdlL3ZpZGVvLmh0bWwjZG9tLW1lZGlhLWR1cmF0aW9uCisgIGlmIChkdXJhdGlvbiA9PSBrSW5maW5pdGVEdXJhdGlvbikKKyAgICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7CisKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihkdXJhdGlvbi5JblNlY29uZHNGKCkpOworfQorCitmbG9hdCBXZWJNZWRpYVBsYXllckltcGw6OkdldEN1cnJlbnRUaW1lKCkgY29uc3QgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIGlmIChzdGF0ZV8ucGF1c2VkKSByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHN0YXRlXy5wYXVzZWRfdGltZS5JblNlY29uZHNGKCkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHBpcGVsaW5lXy0+R2V0TWVkaWFUaW1lKCkuSW5TZWNvbmRzRigpKTsKK30KKworaW50IFdlYk1lZGlhUGxheWVySW1wbDo6R2V0RGF0YVJhdGUoKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICAvLyBUT0RPKGhjbGFtKTogQWRkIHRoaXMgbWV0aG9kIGNhbGwgaWYgcGlwZWxpbmUgaGFzIGl0IGluIHRoZSBpbnRlcmZhY2UuCisgIHJldHVybiAwOworfQorCitXZWJNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0TmV0d29ya1N0YXRlKCkgY29uc3QgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIHJldHVybiBuZXR3b3JrX3N0YXRlXzsKK30KKworV2ViTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRSZWFkeVN0YXRlKCkgY29uc3QgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIHJldHVybiByZWFkeV9zdGF0ZV87Cit9CisKK2NvbnN0IFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+JiBXZWJNZWRpYVBsYXllckltcGw6OkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBidWZmZXJlZF8gPSBwaXBlbGluZV8tPkdldEJ1ZmZlcmVkVGltZVJhbmdlcygpOworICByZXR1cm4gYnVmZmVyZWRfOworfQorCitmbG9hdCBXZWJNZWRpYVBsYXllckltcGw6OkdldE1heFRpbWVTZWVrYWJsZSgpIGNvbnN0IHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIC8vIFdlIGRvbid0IHN1cHBvcnQgc2Vla2luZyBpbiBzdHJlYW1pbmcgbWVkaWEuCisgIGlmIChwcm94eV8gJiYgcHJveHlfLT5kYXRhX3NvdXJjZSgpICYmIHByb3h5Xy0+ZGF0YV9zb3VyY2UoKS0+SXNTdHJlYW1pbmcoKSkKKyAgICByZXR1cm4gMC4wZjsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGZsb2F0PihwaXBlbGluZV8tPkdldE1lZGlhRHVyYXRpb24oKS5JblNlY29uZHNGKCkpOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6U3VzcGVuZCgpIHsgcGlwZWxpbmVfLT5TdXNwZW5kKCk7IH0KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlJlc3VtZSgpIHsgcGlwZWxpbmVfLT5SZXN1bWUoKTsgfQorCitib29sIFdlYk1lZGlhUGxheWVySW1wbDo6RGlkTG9hZGluZ1Byb2dyZXNzKCkgY29uc3QgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIHJldHVybiBwaXBlbGluZV8tPkRpZExvYWRpbmdQcm9ncmVzcygpOworfQorCitib29sIFdlYk1lZGlhUGxheWVySW1wbDo6SGFzU2luZ2xlU2VjdXJpdHlPcmlnaW4oKSBjb25zdCB7CisgIGlmIChwcm94eV8pIHJldHVybiBwcm94eV8tPkhhc1NpbmdsZU9yaWdpbigpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBXZWJNZWRpYVBsYXllckltcGw6OkRpZFBhc3NDT1JTQWNjZXNzQ2hlY2soKSBjb25zdCB7CisgIHJldHVybiBwcm94eV8gJiYgcHJveHlfLT5EaWRQYXNzQ09SU0FjY2Vzc0NoZWNrKCk7Cit9CisKK2Zsb2F0IFdlYk1lZGlhUGxheWVySW1wbDo6TWVkaWFUaW1lRm9yVGltZVZhbHVlKGZsb2F0IHRpbWVWYWx1ZSkgY29uc3QgeworICByZXR1cm4gQ29udmVydFNlY29uZHNUb1RpbWVzdGFtcCh0aW1lVmFsdWUpLkluU2Vjb25kc0YoKTsKK30KKwordW5zaWduZWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXREZWNvZGVkRnJhbWVDb3VudCgpIGNvbnN0IHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIFBpcGVsaW5lU3RhdGlzdGljcyBzdGF0cyA9IHBpcGVsaW5lXy0+R2V0U3RhdGlzdGljcygpOworICByZXR1cm4gc3RhdHMudmlkZW9fZnJhbWVzX2RlY29kZWQ7Cit9CisKK3Vuc2lnbmVkIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0RHJvcHBlZEZyYW1lQ291bnQoKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdHMgPSBwaXBlbGluZV8tPkdldFN0YXRpc3RpY3MoKTsKKyAgcmV0dXJuIHN0YXRzLnZpZGVvX2ZyYW1lc19kcm9wcGVkOworfQorCit1bnNpZ25lZCBXZWJNZWRpYVBsYXllckltcGw6OkdldEF1ZGlvRGVjb2RlZEJ5dGVDb3VudCgpIGNvbnN0IHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIFBpcGVsaW5lU3RhdGlzdGljcyBzdGF0cyA9IHBpcGVsaW5lXy0+R2V0U3RhdGlzdGljcygpOworICByZXR1cm4gc3RhdHMuYXVkaW9fYnl0ZXNfZGVjb2RlZDsKK30KKwordW5zaWduZWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpHZXRWaWRlb0RlY29kZWRCeXRlQ291bnQoKSBjb25zdCB7CisgIERDSEVDS19FUShtYWluX2xvb3BfLCBNZXNzYWdlTG9vcDo6Y3VycmVudCgpKTsKKworICBQaXBlbGluZVN0YXRpc3RpY3Mgc3RhdHMgPSBwaXBlbGluZV8tPkdldFN0YXRpc3RpY3MoKTsKKyAgcmV0dXJuIHN0YXRzLnZpZGVvX2J5dGVzX2RlY29kZWQ7Cit9CisKK3Njb3BlZF9yZWZwdHI8U2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI+CitXZWJNZWRpYVBsYXllckltcGw6OkdldFZpZGVvRnJhbWVQcm92aWRlcigpIHsKKyAgcmV0dXJuIHZpZGVvX2ZyYW1lX3Byb3ZpZGVyXzsKK30KKworV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXRCb3VuZHNDQiBXZWJNZWRpYVBsYXllckltcGw6OkdldFNldEJvdW5kc0NCKCkgeworICAvLyB8cGlwZWxpbmVffCBpcyBhbHdheXMgdmFsaWQgZHVyaW5nIFdlYk1lZGlhUGxheWVySW1wbCdzIGxpZmUgdGltZS4gIEl0IGlzCisgIC8vIGFsc28gcmVmZXJlbmNlIGNvdW50ZWQgc28gaXQgbGl2ZXMgYWZ0ZXIgV2ViTWVkaWFQbGF5ZXJJbXBsIGlzIGRlc3Ryb3llZC4KKyAgcmV0dXJuIHBpcGVsaW5lXy0+R2V0U2V0Qm91bmRzQ0IoKTsKK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OldpbGxEZXN0cm95Q3VycmVudE1lc3NhZ2VMb29wKCkgeworICBEZXN0cm95KCk7CisgIG1haW5fbG9vcF8gPSBOVUxMOworfQorCitib29sIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0RGVidWdSZXBvcnREYXRhQWRkcmVzcyh2b2lkKiogb3V0X2FkZHJlc3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9zaXplKSB7CisgICpvdXRfYWRkcmVzcyA9ICZzdGF0ZV87CisgICpvdXRfc2l6ZSA9IHNpemVvZihzdGF0ZV8pOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6Ok9uUGlwZWxpbmVTZWVrKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIHN0YXRlXy5zdGFydGluZyA9IGZhbHNlOworICBzdGF0ZV8uc2Vla2luZyA9IGZhbHNlOworICBpZiAoc3RhdGVfLnBlbmRpbmdfc2VlaykgeworICAgIHN0YXRlXy5wZW5kaW5nX3NlZWsgPSBmYWxzZTsKKyAgICBTZWVrKHN0YXRlXy5wZW5kaW5nX3NlZWtfc2Vjb25kcyk7CisgICAgcmV0dXJuOworICB9CisKKyAgaWYgKHN0YXR1cyAhPSBQSVBFTElORV9PSykgeworICAgIE9uUGlwZWxpbmVFcnJvcihzdGF0dXMpOworICAgIHJldHVybjsKKyAgfQorCisgIC8vIFVwZGF0ZSBvdXIgcGF1c2VkIHRpbWUuCisgIGlmIChzdGF0ZV8ucGF1c2VkKSBzdGF0ZV8ucGF1c2VkX3RpbWUgPSBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpOworCisgIEdldENsaWVudCgpLT5UaW1lQ2hhbmdlZCgpOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25QaXBlbGluZUVuZGVkKFBpcGVsaW5lU3RhdHVzIHN0YXR1cykgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIGlmIChzdGF0dXMgIT0gUElQRUxJTkVfT0spIHsKKyAgICBPblBpcGVsaW5lRXJyb3Ioc3RhdHVzKTsKKyAgICByZXR1cm47CisgIH0KKyAgR2V0Q2xpZW50KCktPlRpbWVDaGFuZ2VkKCk7Cit9CisKK3ZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lRXJyb3IoUGlwZWxpbmVTdGF0dXMgZXJyb3IpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworCisgIGlmIChzdXBwcmVzc19kZXN0cnVjdGlvbl9lcnJvcnNfKSByZXR1cm47CisKKyAgbWVkaWFfbG9nXy0+QWRkRXZlbnQobWVkaWFfbG9nXy0+Q3JlYXRlUGlwZWxpbmVFcnJvckV2ZW50KGVycm9yKSk7CisKKyAgaWYgKHJlYWR5X3N0YXRlXyA9PSBXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlTm90aGluZykgeworICAgIC8vIEFueSBlcnJvciB0aGF0IG9jY3VycyBiZWZvcmUgcmVhY2hpbmcgUmVhZHlTdGF0ZUhhdmVNZXRhZGF0YSBzaG91bGQKKyAgICAvLyBiZSBjb25zaWRlcmVkIGEgZm9ybWF0IGVycm9yLgorICAgIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZUZvcm1hdEVycm9yKTsKKyAgICByZXR1cm47CisgIH0KKworICBzd2l0Y2ggKGVycm9yKSB7CisgICAgY2FzZSBQSVBFTElORV9PSzoKKyAgICAgIE5PVFJFQUNIRUQoKSA8PCAiUElQRUxJTkVfT0sgaXNuJ3QgYW4gZXJyb3IhIjsKKyAgICAgIGJyZWFrOworCisgICAgY2FzZSBQSVBFTElORV9FUlJPUl9ORVRXT1JLOgorICAgIGNhc2UgUElQRUxJTkVfRVJST1JfUkVBRDoKKyAgICBjYXNlIENIVU5LX0RFTVVYRVJfRVJST1JfRU9TX1NUQVRVU19ORVRXT1JLX0VSUk9SOgorICAgICAgU2V0TmV0d29ya1N0YXRlKFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlTmV0d29ya0Vycm9yKTsKKyAgICAgIGJyZWFrOworCisgICAgLy8gVE9ETyh2cmspOiBCZWNhdXNlIE9uUGlwZWxpbmVJbml0aWFsaXplKCkgZGlyZWN0bHkgcmVwb3J0cyB0aGUKKyAgICAvLyBOZXR3b3JrU3RhdGVGb3JtYXRFcnJvciBpbnN0ZWFkIG9mIGNhbGxpbmcgT25QaXBlbGluZUVycm9yKCksIEkgYmVsaWV2ZQorICAgIC8vIHRoaXMgYmxvY2sgY2FuIGJlIGRlbGV0ZWQuIFNob3VsZCBsb29rIGludG8gaXQhIChjcmJ1Zy5jb20vMTI2MDcwKQorICAgIGNhc2UgUElQRUxJTkVfRVJST1JfSU5JVElBTElaQVRJT05fRkFJTEVEOgorICAgIGNhc2UgUElQRUxJTkVfRVJST1JfQ09VTERfTk9UX1JFTkRFUjoKKyAgICBjYXNlIFBJUEVMSU5FX0VSUk9SX0VYVEVSTkFMX1JFTkRFUkVSX0ZBSUxFRDoKKyAgICBjYXNlIERFTVVYRVJfRVJST1JfQ09VTERfTk9UX09QRU46CisgICAgY2FzZSBERU1VWEVSX0VSUk9SX0NPVUxEX05PVF9QQVJTRToKKyAgICBjYXNlIERFTVVYRVJfRVJST1JfTk9fU1VQUE9SVEVEX1NUUkVBTVM6CisgICAgY2FzZSBERUNPREVSX0VSUk9SX05PVF9TVVBQT1JURUQ6CisgICAgICBTZXROZXR3b3JrU3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtOZXR3b3JrU3RhdGVGb3JtYXRFcnJvcik7CisgICAgICBicmVhazsKKworICAgIGNhc2UgUElQRUxJTkVfRVJST1JfREVDT0RFOgorICAgIGNhc2UgUElQRUxJTkVfRVJST1JfQUJPUlQ6CisgICAgY2FzZSBQSVBFTElORV9FUlJPUl9JTlZBTElEX1NUQVRFOgorICAgIGNhc2UgQ0hVTktfREVNVVhFUl9FUlJPUl9BUFBFTkRfRkFJTEVEOgorICAgIGNhc2UgQ0hVTktfREVNVVhFUl9FUlJPUl9FT1NfU1RBVFVTX0RFQ09ERV9FUlJPUjoKKyAgICBjYXNlIEFVRElPX1JFTkRFUkVSX0VSUk9SOgorICAgIGNhc2UgQVVESU9fUkVOREVSRVJfRVJST1JfU1BMSUNFX0ZBSUxFRDoKKyAgICAgIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZURlY29kZUVycm9yKTsKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lQnVmZmVyaW5nU3RhdGUoCisgICAgUGlwZWxpbmU6OkJ1ZmZlcmluZ1N0YXRlIGJ1ZmZlcmluZ19zdGF0ZSkgeworICBEVkxPRygxKSA8PCAiT25QaXBlbGluZUJ1ZmZlcmluZ1N0YXRlKCIgPDwgYnVmZmVyaW5nX3N0YXRlIDw8ICIpIjsKKworICBzd2l0Y2ggKGJ1ZmZlcmluZ19zdGF0ZSkgeworICAgIGNhc2UgUGlwZWxpbmU6OmtIYXZlTWV0YWRhdGE6CisgICAgICBTZXRSZWFkeVN0YXRlKFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVNZXRhZGF0YSk7CisgICAgICBicmVhazsKKyAgICBjYXNlIFBpcGVsaW5lOjprUHJlcm9sbENvbXBsZXRlZDoKKyAgICAgIFNldFJlYWR5U3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZUVub3VnaERhdGEpOworICAgICAgYnJlYWs7CisgIH0KK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6Ok9uRGVtdXhlck9wZW5lZCgpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEQ0hFQ0soY2h1bmtfZGVtdXhlcl8pOworICBHZXRDbGllbnQoKS0+U291cmNlT3BlbmVkKGNodW5rX2RlbXV4ZXJfLmdldCgpKTsKK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlNldE9wYXF1ZShib29sIG9wYXF1ZSkgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisKKyAgR2V0Q2xpZW50KCktPlNldE9wYXF1ZShvcGFxdWUpOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6Tm90aWZ5RG93bmxvYWRpbmcoYm9vbCBpc19kb3dubG9hZGluZykgeworICBpZiAoIWlzX2Rvd25sb2FkaW5nICYmIG5ldHdvcmtfc3RhdGVfID09IFdlYk1lZGlhUGxheWVyOjprTmV0d29ya1N0YXRlTG9hZGluZykKKyAgICBTZXROZXR3b3JrU3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtOZXR3b3JrU3RhdGVJZGxlKTsKKyAgZWxzZSBpZiAoaXNfZG93bmxvYWRpbmcgJiYKKyAgICAgICAgICAgbmV0d29ya19zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtOZXR3b3JrU3RhdGVJZGxlKQorICAgIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6a05ldHdvcmtTdGF0ZUxvYWRpbmcpOworICBtZWRpYV9sb2dfLT5BZGRFdmVudCgKKyAgICAgIG1lZGlhX2xvZ18tPkNyZWF0ZUJvb2xlYW5FdmVudChNZWRpYUxvZ0V2ZW50OjpORVRXT1JLX0FDVElWSVRZX1NFVCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiaXNfZG93bmxvYWRpbmdfZGF0YSIsIGlzX2Rvd25sb2FkaW5nKSk7Cit9CisKK3ZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTdGFydFBpcGVsaW5lKERlbXV4ZXIqIGRlbXV4ZXIpIHsKKyAgc3RhdGVfLnN0YXJ0aW5nID0gdHJ1ZTsKKworICBwaXBlbGluZV8tPlN0YXJ0KAorICAgICAgZGVtdXhlciwgQklORF9UT19SRU5ERVJfTE9PUCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lRW5kZWQpLAorICAgICAgQklORF9UT19SRU5ERVJfTE9PUCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lRXJyb3IpLAorICAgICAgQklORF9UT19SRU5ERVJfTE9PUCgmV2ViTWVkaWFQbGF5ZXJJbXBsOjpPblBpcGVsaW5lU2VlayksCisgICAgICBCSU5EX1RPX1JFTkRFUl9MT09QKCZXZWJNZWRpYVBsYXllckltcGw6Ok9uUGlwZWxpbmVCdWZmZXJpbmdTdGF0ZSksCisgICAgICBCSU5EX1RPX1JFTkRFUl9MT09QKCZXZWJNZWRpYVBsYXllckltcGw6Ok9uRHVyYXRpb25DaGFuZ2VkKSk7Cit9CisKK3ZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpTZXROZXR3b3JrU3RhdGUoV2ViTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBzdGF0ZSkgeworICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIERWTE9HKDEpIDw8ICJTZXROZXR3b3JrU3RhdGU6ICIgPDwgc3RhdGU7CisgIG5ldHdvcmtfc3RhdGVfID0gc3RhdGU7CisgIC8vIEFsd2F5cyBub3RpZnkgdG8gZW5zdXJlIGNsaWVudCBoYXMgdGhlIGxhdGVzdCB2YWx1ZS4KKyAgR2V0Q2xpZW50KCktPk5ldHdvcmtTdGF0ZUNoYW5nZWQoKTsKK30KKwordm9pZCBXZWJNZWRpYVBsYXllckltcGw6OlNldFJlYWR5U3RhdGUoV2ViTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgc3RhdGUpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEVkxPRygxKSA8PCAiU2V0UmVhZHlTdGF0ZTogIiA8PCBzdGF0ZTsKKworICBpZiAocmVhZHlfc3RhdGVfID09IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVOb3RoaW5nICYmCisgICAgICBzdGF0ZSA+PSBXZWJNZWRpYVBsYXllcjo6a1JlYWR5U3RhdGVIYXZlTWV0YWRhdGEpIHsKKyAgICBpZiAoIUhhc1ZpZGVvKCkpIEdldENsaWVudCgpLT5EaXNhYmxlQWNjZWxlcmF0ZWRDb21wb3NpdGluZygpOworICB9IGVsc2UgaWYgKHN0YXRlID09IFdlYk1lZGlhUGxheWVyOjprUmVhZHlTdGF0ZUhhdmVFbm91Z2hEYXRhKSB7CisgICAgaWYgKGlzX2xvY2FsX3NvdXJjZV8gJiYKKyAgICAgICAgbmV0d29ya19zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtOZXR3b3JrU3RhdGVMb2FkaW5nKSB7CisgICAgICBTZXROZXR3b3JrU3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtOZXR3b3JrU3RhdGVMb2FkZWQpOworICAgIH0KKyAgfQorCisgIHJlYWR5X3N0YXRlXyA9IHN0YXRlOworICAvLyBBbHdheXMgbm90aWZ5IHRvIGVuc3VyZSBjbGllbnQgaGFzIHRoZSBsYXRlc3QgdmFsdWUuCisgIEdldENsaWVudCgpLT5SZWFkeVN0YXRlQ2hhbmdlZCgpOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6RGVzdHJveSgpIHsKKyAgRENIRUNLKCFtYWluX2xvb3BfIHx8IG1haW5fbG9vcF8gPT0gTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisKKyAgLy8gSWYgfG1haW5fbG9vcF98IGhhcyBhbHJlYWR5IHN0b3BwZWQsIGRvIG5vdGhpbmcgaGVyZS4KKyAgaWYgKCFtYWluX2xvb3BfKSB7CisgICAgLy8gVGhpcyBtYXkgaGFwcGVuIGlmIHRoaXMgZnVuY3Rpb24gd2FzIGFscmVhZHkgY2FsbGVkIGJ5IHRoZQorICAgIC8vIERlc3RydWN0aW9uT2JzZXJ2ZXIgb3ZlcnJpZGUgd2hlbiB0aGUgdGhyZWFkIHJ1bm5pbmcgdGhpcyBwbGF5ZXIgd2FzCisgICAgLy8gc3RvcHBlZC4gVGhlIHBpcGVsaW5lIHNob3VsZCBoYXZlIGJlZW4gc2h1dCBkb3duLgorICAgIERDSEVDSyghcHJveHlfKTsKKyAgICByZXR1cm47CisgIH0KKworICAvLyBUZWxsIHRoZSBkYXRhIHNvdXJjZSB0byBhYm9ydCBhbnkgcGVuZGluZyByZWFkcyBzbyB0aGF0IHRoZSBwaXBlbGluZSBpcworICAvLyBub3QgYmxvY2tlZCB3aGVuIGlzc3Vpbmcgc3RvcCBjb21tYW5kcyB0byB0aGUgb3RoZXIgZmlsdGVycy4KKyAgc3VwcHJlc3NfZGVzdHJ1Y3Rpb25fZXJyb3JzXyA9IHRydWU7CisgIGlmIChwcm94eV8pIHsKKyAgICBwcm94eV8tPkFib3J0RGF0YVNvdXJjZSgpOworICB9CisKKyAgLy8gTWFrZSBzdXJlIHRvIGtpbGwgdGhlIHBpcGVsaW5lIHNvIHRoZXJlJ3Mgbm8gbW9yZSBtZWRpYSB0aHJlYWRzIHJ1bm5pbmcuCisgIC8vIE5vdGU6IHN0b3BwaW5nIHRoZSBwaXBlbGluZSBtaWdodCBibG9jayBmb3IgYSBsb25nIHRpbWUuCisgIGJhc2U6OldhaXRhYmxlRXZlbnQgd2FpdGVyKGZhbHNlLCBmYWxzZSk7CisgIERMT0coSU5GTykgPDwgIlRyeWluZyB0byBzdG9wIG1lZGlhIHBpcGVsaW5lLiI7CisgIHBpcGVsaW5lXy0+U3RvcCgKKyAgICAgIGJhc2U6OkJpbmQoJmJhc2U6OldhaXRhYmxlRXZlbnQ6OlNpZ25hbCwgYmFzZTo6VW5yZXRhaW5lZCgmd2FpdGVyKSkpOworICB3YWl0ZXIuV2FpdCgpOworICBETE9HKElORk8pIDw8ICJNZWRpYSBwaXBlbGluZSBzdG9wcGVkLiI7CisKKyAgLy8gQW5kIHRoZW4gZGV0YWNoIHRoZSBwcm94eSwgaXQgbWF5IGxpdmUgb24gdGhlIHJlbmRlciB0aHJlYWQgZm9yIGEgbGl0dGxlCisgIC8vIGxvbmdlciB1bnRpbCBhbGwgdGhlIHRhc2tzIGFyZSBmaW5pc2hlZC4KKyAgaWYgKHByb3h5XykgeworICAgIHByb3h5Xy0+RGV0YWNoKCk7CisgICAgcHJveHlfID0gTlVMTDsKKyAgfQorfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6R2V0TWVkaWFUaW1lQW5kU2Vla2luZ1N0YXRlKAorICAgIGJhc2U6OlRpbWVEZWx0YSogbWVkaWFfdGltZSwgYm9vbCogaXNfc2Vla2luZykgY29uc3QgeworICBEQ0hFQ0sobWVkaWFfdGltZSk7CisgIERDSEVDSyhpc19zZWVraW5nKTsKKyAgKm1lZGlhX3RpbWUgPSBwaXBlbGluZV8tPkdldE1lZGlhVGltZSgpOworICAqaXNfc2Vla2luZyA9IHN0YXRlXy5zZWVraW5nOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25FbmNyeXB0ZWRNZWRpYUluaXREYXRhKAorICAgIEVtZUluaXREYXRhVHlwZSBpbml0X2RhdGFfdHlwZSwgY29uc3Qgc3RkOjp2ZWN0b3I8dWludDhfdD4mIGluaXRfZGF0YSkgeworICAvLyBUT0RPOiBJbXBsZW1lbnQgRU1FLgorICBOT1RSRUFDSEVEKCk7Cit9CisKK1dlYk1lZGlhUGxheWVyQ2xpZW50KiBXZWJNZWRpYVBsYXllckltcGw6OkdldENsaWVudCgpIHsKKyAgRENIRUNLX0VRKG1haW5fbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICBEQ0hFQ0soY2xpZW50Xyk7CisgIHJldHVybiBjbGllbnRfOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVySW1wbDo6T25EdXJhdGlvbkNoYW5nZWQoKSB7CisgIGlmIChyZWFkeV9zdGF0ZV8gPT0gV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU5vdGhpbmcpIHJldHVybjsKKworICBHZXRDbGllbnQoKS0+RHVyYXRpb25DaGFuZ2VkKCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmggYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTBiY2JiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmgKQEAgLTAsMCArMSwzMDggQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKy8vIERlbGVnYXRlIGNhbGxzIGZyb20gV2ViQ29yZTo6TWVkaWFQbGF5ZXJQcml2YXRlIHRvIENocm9tZSdzIHZpZGVvIHBsYXllci4KKy8vIEl0IGNvbnRhaW5zIFBpcGVsaW5lIHdoaWNoIGlzIHRoZSBhY3R1YWwgbWVkaWEgcGxheWVyIHBpcGVsaW5lLCBpdCBnbHVlcworLy8gdGhlIG1lZGlhIHBsYXllciBwaXBlbGluZSwgZGF0YSBzb3VyY2UsIGF1ZGlvIHJlbmRlcmVyIGFuZCByZW5kZXJlci4KKy8vIFBpcGVsaW5lIHdvdWxkIGNyZWF0ZXMgbXVsdGlwbGUgdGhyZWFkcyBhbmQgYWNjZXNzIHNvbWUgcHVibGljIG1ldGhvZHMKKy8vIG9mIHRoaXMgY2xhc3MsIHNvIHdlIG5lZWQgdG8gYmUgZXh0cmEgY2FyZWZ1bCBhYm91dCBjb25jdXJyZW50IGFjY2VzcyBvZgorLy8gbWV0aG9kcyBhbmQgbWVtYmVycy4KKy8vCisvLyBXZWJNZWRpYVBsYXllckltcGwgd29ya3Mgd2l0aCBtdWx0aXBsZSBvYmplY3RzLCB0aGUgbW9zdCBpbXBvcnRhbnQgb25lcyBhcmU6CisvLworLy8gUGlwZWxpbmUKKy8vICAgVGhlIG1lZGlhIHBsYXliYWNrIHBpcGVsaW5lLgorLy8KKy8vIFZpZGVvUmVuZGVyZXJCYXNlCisvLyAgIFZpZGVvIHJlbmRlcmVyIG9iamVjdC4KKy8vCisvLyBXZWJNZWRpYVBsYXllckNsaWVudAorLy8gICBDbGllbnQgb2YgdGhpcyBtZWRpYSBwbGF5ZXIgb2JqZWN0LgorLy8KKy8vIFRoZSBmb2xsb3dpbmcgZGlhZ3JhbSBzaG93cyB0aGUgcmVsYXRpb25zaGlwIG9mIHRoZXNlIG9iamVjdHM6CisvLyAgIChub3RlOiByZWYtY291bnRlZCByZWZlcmVuY2UgaXMgbWFya2VkIGJ5IGEgInIiLikKKy8vCisvLyBXZWJNZWRpYVBsYXllckNsaWVudAorLy8gICAgXgorLy8gICAgfAorLy8gV2ViTWVkaWFQbGF5ZXJJbXBsIC0tLT4gUGlwZWxpbmUKKy8vICAgIHwgICAgICAgIF4gICAgICAgICAgICAgICAgICB8CisvLyAgICB8ICAgICAgICB8ICAgICAgICAgICAgICAgICAgdiByCisvLyAgICB8ICAgICAgICB8ICAgICAgICBWaWRlb1JlbmRlcmVyQmFzZQorLy8gICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgIF4gcgorLy8gICAgfCAgIHIgICAgfCAgICAgICAgICB2IHIgICAgIHwKKy8vICAgICctLS0+IFdlYk1lZGlhUGxheWVyUHJveHkgLS0nCisvLworLy8gTm90aWNlIHRoYXQgV2ViTWVkaWFQbGF5ZXJQcm94eSBhbmQgVmlkZW9SZW5kZXJlckJhc2UgYXJlIHJlZmVyZW5jaW5nIGVhY2gKKy8vIG90aGVyLiBUaGlzIGludGVyZGVwZW5kZW5jeSBoYXMgdG8gYmUgdHJlYXRlZCBjYXJlZnVsbHkuCisvLworLy8gT3RoZXIgaXNzdWVzOgorLy8gRHVyaW5nIHRlYXIgZG93biBvZiB0aGUgd2hvbGUgYnJvd3NlciBvciBhIHRhYiwgdGhlIERPTSB0cmVlIG1heSBub3QgYmUKKy8vIGRlc3RydWN0ZWQgbmljZWx5LCBhbmQgdGhlcmUgd2lsbCBiZSBzb21lIGRhbmdsaW5nIG1lZGlhIHRocmVhZHMgdHJ5aW5nIHRvCisvLyB0aGUgbWFpbiB0aHJlYWQsIHNvIHdlIG5lZWQgdGhpcyBjbGFzcyB0byBsaXN0ZW4gdG8gZGVzdHJ1Y3Rpb24gZXZlbnQgb2YgdGhlCisvLyBtYWluIHRocmVhZCBhbmQgY2xlYW51cCB0aGUgbWVkaWEgdGhyZWFkcyB3aGVuIHRoZSBldmVuIGlzIHJlY2VpdmVkLiBBbHNvCisvLyBhdCBkZXN0cnVjdGlvbiBvZiB0aGlzIGNsYXNzIHdlIHdpbGwgbmVlZCB0byB1bmhvb2sgaXQgZnJvbSBkZXN0cnVjdGlvbiBldmVudAorLy8gbGlzdCBvZiB0aGUgbWFpbiB0aHJlYWQuCisKKyNpZm5kZWYgQ09CQUxUX01FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX0lNUExfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX0lNUExfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS93ZWFrX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkLmgiCisjaW5jbHVkZSAiYmFzZS90aW1lLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2UvZGVtdXhlci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2VtZV9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3Jhbmdlcy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9kZWxlZ2F0ZS5oIgorI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgorI2luY2x1ZGUgInVpL2dmeC9zaXplLmgiCisKKyNpZiBkZWZpbmVkKE9TX1NUQVJCT0FSRCkKKworI2lmIFNCX0hBUyhQTEFZRVIpCisjZGVmaW5lIENPQkFMVF9VU0VfUFVOQ0hPVVQKKyNkZWZpbmUgQ09CQUxUX1NLSVBfU0VFS19SRVFVRVNUX05FQVJfRU5ECisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVIpCisKKyNlbmRpZiAgLy8gZGVmaW5lZChPU19TVEFSQk9BUkQpCisKK25hbWVzcGFjZSBtZWRpYSB7CisKK2NsYXNzIENodW5rRGVtdXhlcjsKK2NsYXNzIE1lZGlhTG9nOworY2xhc3MgV2ViTWVkaWFQbGF5ZXJQcm94eTsKKworY2xhc3MgV2ViTWVkaWFQbGF5ZXJJbXBsIDogcHVibGljIFdlYk1lZGlhUGxheWVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIE1lc3NhZ2VMb29wOjpEZXN0cnVjdGlvbk9ic2VydmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGJhc2U6OlN1cHBvcnRzV2Vha1B0cjxXZWJNZWRpYVBsYXllckltcGw+IHsKKyBwdWJsaWM6CisgIC8vIENvbnN0cnVjdCBhIFdlYk1lZGlhUGxheWVySW1wbCB3aXRoIHJlZmVyZW5jZSB0byB0aGUgY2xpZW50LCBhbmQgbWVkaWEKKyAgLy8gZmlsdGVyIGNvbGxlY3Rpb24uIEJ5IHByb3ZpZGluZyB0aGUgZmlsdGVyIGNvbGxlY3Rpb24gdGhlIGltcGxlbWVudG9yIGNhbgorICAvLyBwcm92aWRlIG1vcmUgc3BlY2lmaWMgbWVkaWEgZmlsdGVycyB0aGF0IGRvZXMgcmVzb3VyY2UgbG9hZGluZyBhbmQKKyAgLy8gcmVuZGVyaW5nLgorICAvLworICAvLyBXZWJNZWRpYVBsYXllckltcGwgY29tZXMgcGFja2FnZWQgd2l0aCB0aGUgZm9sbG93aW5nIG1lZGlhIGZpbHRlcnM6CisgIC8vICAgLSBVUkwgZmV0Y2hpbmcKKyAgLy8gICAtIERlbXV4aW5nCisgIC8vICAgLSBTb2Z0d2FyZSBhdWRpby92aWRlbyBkZWNvZGluZworICAvLyAgIC0gVmlkZW8gcmVuZGVyaW5nCisgIC8vCisgIC8vIENsaWVudHMgYXJlIGV4cGVjdGVkIHRvIGFkZCB0aGVpciBwbGF0Zm9ybS1zcGVjaWZpYyBhdWRpbyByZW5kZXJpbmcgbWVkaWEKKyAgLy8gZmlsdGVyIGlmIHRoZXkgd2lzaCB0byBoZWFyIGFueSBzb3VuZCBjb21pbmcgb3V0IHRoZSBzcGVha2Vycywgb3RoZXJ3aXNlCisgIC8vIGF1ZGlvIGRhdGEgaXMgZGlzY2FyZGVkIGFuZCBtZWRpYSBwbGF5cyBiYWNrIGJhc2VkIG9uIHdhbGwgY2xvY2sgdGltZS4KKyAgLy8KKyAgLy8gV2hlbiBjYWxsaW5nIHRoaXMsIHRoZSB8YXVkaW9fc291cmNlX3Byb3ZpZGVyfCBhbmQKKyAgLy8gfGF1ZGlvX3JlbmRlcmVyX3Npbmt8IGFyZ3VtZW50cyBzaG91bGQgYmUgdGhlIHNhbWUgb2JqZWN0LgorCisgIFdlYk1lZGlhUGxheWVySW1wbCgKKyAgICAgIFBpcGVsaW5lV2luZG93IHdpbmRvdywgV2ViTWVkaWFQbGF5ZXJDbGllbnQqIGNsaWVudCwKKyAgICAgIFdlYk1lZGlhUGxheWVyRGVsZWdhdGUqIGRlbGVnYXRlLAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4mIHZpZGVvX2ZyYW1lX3Byb3ZpZGVyLAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxNZWRpYUxvZz4mIG1lZGlhX2xvZyk7CisgIH5XZWJNZWRpYVBsYXllckltcGwoKSBPVkVSUklERTsKKworICB2b2lkIExvYWRNZWRpYVNvdXJjZSgpIE9WRVJSSURFOworICB2b2lkIExvYWRQcm9ncmVzc2l2ZShjb25zdCBHVVJMJiB1cmwsCisgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8QnVmZmVyZWREYXRhU291cmNlPiBkYXRhX3NvdXJjZSwKKyAgICAgICAgICAgICAgICAgICAgICAgQ09SU01vZGUgY29yc19tb2RlKSBPVkVSUklERTsKKyAgdm9pZCBDYW5jZWxMb2FkKCkgT1ZFUlJJREU7CisKKyAgLy8gUGxheWJhY2sgY29udHJvbHMuCisgIHZvaWQgUGxheSgpIE9WRVJSSURFOworICB2b2lkIFBhdXNlKCkgT1ZFUlJJREU7CisgIGJvb2wgU3VwcG9ydHNGdWxsc2NyZWVuKCkgY29uc3QgT1ZFUlJJREU7CisgIGJvb2wgU3VwcG9ydHNTYXZlKCkgY29uc3QgT1ZFUlJJREU7CisgIHZvaWQgU2VlayhmbG9hdCBzZWNvbmRzKSBPVkVSUklERTsKKyAgdm9pZCBTZXRFbmRUaW1lKGZsb2F0IHNlY29uZHMpIE9WRVJSSURFOworICB2b2lkIFNldFJhdGUoZmxvYXQgcmF0ZSkgT1ZFUlJJREU7CisgIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSkgT1ZFUlJJREU7CisgIHZvaWQgU2V0VmlzaWJsZShib29sIHZpc2libGUpIE9WRVJSSURFOworICBjb25zdCBSYW5nZXM8YmFzZTo6VGltZURlbHRhPiYgR2V0QnVmZmVyZWRUaW1lUmFuZ2VzKCkgT1ZFUlJJREU7CisgIGZsb2F0IEdldE1heFRpbWVTZWVrYWJsZSgpIGNvbnN0IE9WRVJSSURFOworCisgIC8vIFN1c3BlbmQvUmVzdW1lCisgIHZvaWQgU3VzcGVuZCgpIE9WRVJSSURFOworICB2b2lkIFJlc3VtZSgpIE9WRVJSSURFOworCisgIC8vIFRydWUgaWYgdGhlIGxvYWRlZCBtZWRpYSBoYXMgYSBwbGF5YWJsZSB2aWRlby9hdWRpbyB0cmFjay4KKyAgYm9vbCBIYXNWaWRlbygpIGNvbnN0IE9WRVJSSURFOworICBib29sIEhhc0F1ZGlvKCkgY29uc3QgT1ZFUlJJREU7CisKKyAgLy8gRGltZW5zaW9ucyBvZiB0aGUgdmlkZW8uCisgIGdmeDo6U2l6ZSBHZXROYXR1cmFsU2l6ZSgpIGNvbnN0IE9WRVJSSURFOworCisgIC8vIEdldHRlcnMgb2YgcGxheWJhY2sgc3RhdGUuCisgIGJvb2wgSXNQYXVzZWQoKSBjb25zdCBPVkVSUklERTsKKyAgYm9vbCBJc1NlZWtpbmcoKSBjb25zdCBPVkVSUklERTsKKyAgZmxvYXQgR2V0RHVyYXRpb24oKSBjb25zdCBPVkVSUklERTsKKyAgZmxvYXQgR2V0Q3VycmVudFRpbWUoKSBjb25zdCBPVkVSUklERTsKKworICAvLyBHZXQgcmF0ZSBvZiBsb2FkaW5nIHRoZSByZXNvdXJjZS4KKyAgaW50MzIgR2V0RGF0YVJhdGUoKSBjb25zdCBPVkVSUklERTsKKworICAvLyBJbnRlcm5hbCBzdGF0ZXMgb2YgbG9hZGluZyBhbmQgbmV0d29yay4KKyAgLy8gVE9ETyhoY2xhbSk6IEFzayB0aGUgcGlwZWxpbmUgYWJvdXQgdGhlIHN0YXRlIHJhdGhlciB0aGFuIGhhdmluZyByZWFkaW5nCisgIC8vIHRoZW0gZnJvbSBtZW1iZXJzIHdoaWNoIHdvdWxkIGNhdXNlIHJhY2UgY29uZGl0aW9ucy4KKyAgV2ViTWVkaWFQbGF5ZXI6Ok5ldHdvcmtTdGF0ZSBHZXROZXR3b3JrU3RhdGUoKSBjb25zdCBPVkVSUklERTsKKyAgV2ViTWVkaWFQbGF5ZXI6OlJlYWR5U3RhdGUgR2V0UmVhZHlTdGF0ZSgpIGNvbnN0IE9WRVJSSURFOworCisgIGJvb2wgRGlkTG9hZGluZ1Byb2dyZXNzKCkgY29uc3QgT1ZFUlJJREU7CisKKyAgYm9vbCBIYXNTaW5nbGVTZWN1cml0eU9yaWdpbigpIGNvbnN0IE9WRVJSSURFOworICBib29sIERpZFBhc3NDT1JTQWNjZXNzQ2hlY2soKSBjb25zdCBPVkVSUklERTsKKworICBmbG9hdCBNZWRpYVRpbWVGb3JUaW1lVmFsdWUoZmxvYXQgdGltZVZhbHVlKSBjb25zdCBPVkVSUklERTsKKworICB1bnNpZ25lZCBHZXREZWNvZGVkRnJhbWVDb3VudCgpIGNvbnN0IE9WRVJSSURFOworICB1bnNpZ25lZCBHZXREcm9wcGVkRnJhbWVDb3VudCgpIGNvbnN0IE9WRVJSSURFOworICB1bnNpZ25lZCBHZXRBdWRpb0RlY29kZWRCeXRlQ291bnQoKSBjb25zdCBPVkVSUklERTsKKyAgdW5zaWduZWQgR2V0VmlkZW9EZWNvZGVkQnl0ZUNvdW50KCkgY29uc3QgT1ZFUlJJREU7CisKKyAgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4gR2V0VmlkZW9GcmFtZVByb3ZpZGVyKCkgT1ZFUlJJREU7CisKKyAgU2V0Qm91bmRzQ0IgR2V0U2V0Qm91bmRzQ0IoKSBPVkVSUklERTsKKworICAvLyBBcyB3ZSBhcmUgY2xvc2luZyB0aGUgdGFiIG9yIGV2ZW4gdGhlIGJyb3dzZXIsIHxtYWluX2xvb3BffCBpcyBkZXN0cm95ZWQKKyAgLy8gZXZlbiBiZWZvcmUgdGhpcyBvYmplY3QgZ2V0cyBkZXN0cnVjdGVkLCBzbyB3ZSBuZWVkIHRvIGtub3cgd2hlbgorICAvLyB8bWFpbl9sb29wX3wgaXMgYmVpbmcgZGVzdHJveWVkIGFuZCB3ZSBjYW4gc3RvcCBwb3N0aW5nIHJlcGFpbnQgdGFzaworICAvLyB0byBpdC4KKyAgdm9pZCBXaWxsRGVzdHJveUN1cnJlbnRNZXNzYWdlTG9vcCgpIE9WRVJSSURFOworCisgIGJvb2wgR2V0RGVidWdSZXBvcnREYXRhQWRkcmVzcyh2b2lkKiogb3V0X2FkZHJlc3MsIHNpemVfdCogb3V0X3NpemUpIE9WRVJSSURFOworCisgIHZvaWQgT25QaXBlbGluZVNlZWsoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKKyAgdm9pZCBPblBpcGVsaW5lRW5kZWQoUGlwZWxpbmVTdGF0dXMgc3RhdHVzKTsKKyAgdm9pZCBPblBpcGVsaW5lRXJyb3IoUGlwZWxpbmVTdGF0dXMgZXJyb3IpOworICB2b2lkIE9uUGlwZWxpbmVCdWZmZXJpbmdTdGF0ZShQaXBlbGluZTo6QnVmZmVyaW5nU3RhdGUgYnVmZmVyaW5nX3N0YXRlKTsKKyAgdm9pZCBPbkRlbXV4ZXJPcGVuZWQoKTsKKyAgdm9pZCBTZXRPcGFxdWUoYm9vbCk7CisKKyBwcml2YXRlOgorICAvLyBDYWxsZWQgd2hlbiB0aGUgZGF0YSBzb3VyY2UgaXMgZG93bmxvYWRpbmcgb3IgcGF1c2VkLgorICB2b2lkIE5vdGlmeURvd25sb2FkaW5nKGJvb2wgaXNfZG93bmxvYWRpbmcpOworCisgIC8vIEZpbmlzaGVzIHN0YXJ0aW5nIHRoZSBwaXBlbGluZSBkdWUgdG8gYSBjYWxsIHRvIGxvYWQoKS4KKyAgdm9pZCBTdGFydFBpcGVsaW5lKERlbXV4ZXIqIGRlbXV4ZXIpOworCisgIC8vIEhlbHBlcnMgdGhhdCBzZXQgdGhlIG5ldHdvcmsvcmVhZHkgc3RhdGUgYW5kIG5vdGlmaWVzIHRoZSBjbGllbnQgaWYKKyAgLy8gdGhleSd2ZSBjaGFuZ2VkLgorICB2b2lkIFNldE5ldHdvcmtTdGF0ZShXZWJNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIHN0YXRlKTsKKyAgdm9pZCBTZXRSZWFkeVN0YXRlKFdlYk1lZGlhUGxheWVyOjpSZWFkeVN0YXRlIHN0YXRlKTsKKworICAvLyBEZXN0cm95IHJlc291cmNlcyBoZWxkLgorICB2b2lkIERlc3Ryb3koKTsKKworICB2b2lkIEdldE1lZGlhVGltZUFuZFNlZWtpbmdTdGF0ZShiYXNlOjpUaW1lRGVsdGEqIG1lZGlhX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIGlzX3NlZWtpbmcpIGNvbnN0OworICB2b2lkIE9uRW5jcnlwdGVkTWVkaWFJbml0RGF0YShFbWVJbml0RGF0YVR5cGUgaW5pdF9kYXRhX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+JiBpbml0X2RhdGEpOworCisgIC8vIEdldHRlciBtZXRob2QgdG8gfGNsaWVudF98LgorICBXZWJNZWRpYVBsYXllckNsaWVudCogR2V0Q2xpZW50KCk7CisKKyAgLy8gQ2FsbGJhY2tzIHRoYXQgZm9yd2FyZCBkdXJhdGlvbiBjaGFuZ2UgZnJvbSB8cGlwZWxpbmVffCB0byB8Y2xpZW50X3wuCisgIHZvaWQgT25EdXJhdGlvbkNoYW5nZWQoKTsKKworICBiYXNlOjpUaHJlYWQgcGlwZWxpbmVfdGhyZWFkXzsKKworICAvLyBUT0RPKGhjbGFtKTogZ2V0IHJpZCBvZiB0aGVzZSBtZW1iZXJzIGFuZCByZWFkIGZyb20gdGhlIHBpcGVsaW5lIGRpcmVjdGx5LgorICBXZWJNZWRpYVBsYXllcjo6TmV0d29ya1N0YXRlIG5ldHdvcmtfc3RhdGVfOworICBXZWJNZWRpYVBsYXllcjo6UmVhZHlTdGF0ZSByZWFkeV9zdGF0ZV87CisKKyAgLy8gS2VlcCBhIGxpc3Qgb2YgYnVmZmVyZWQgdGltZSByYW5nZXMuCisgIFJhbmdlczxiYXNlOjpUaW1lRGVsdGE+IGJ1ZmZlcmVkXzsKKworICAvLyBNZXNzYWdlIGxvb3BzIGZvciBwb3N0aW5nIHRhc2tzIGJldHdlZW4gQ2hyb21lJ3MgbWFpbiB0aHJlYWQuIEFsc28gdXNlZAorICAvLyBmb3IgRENIRUNLcyBzbyBtZXRob2RzIGNhbGxzIHdvbid0IGV4ZWN1dGUgaW4gdGhlIHdyb25nIHRocmVhZC4KKyAgTWVzc2FnZUxvb3AqIG1haW5fbG9vcF87CisKKyAgc2NvcGVkX3JlZnB0cjxQaXBlbGluZT4gcGlwZWxpbmVfOworCisgIC8vIFRoZSBjdXJyZW50bHkgc2VsZWN0ZWQga2V5IHN5c3RlbS4gRW1wdHkgc3RyaW5nIG1lYW5zIHRoYXQgbm8ga2V5IHN5c3RlbQorICAvLyBoYXMgYmVlbiBzZWxlY3RlZC4KKyAgc3RkOjpzdHJpbmcgY3VycmVudF9rZXlfc3lzdGVtXzsKKworICAvLyBJbnRlcm5hbCBzdGF0ZSBvZiB0aGUgV2ViTWVkaWFQbGF5ZXIuIEdhdGhlcmVkIGluIG9uZSBzdHJ1Y3QgdG8gc3VwcG9ydAorICAvLyBzZXJpYWxpemF0aW9uIG9mIHRoaXMgc3RhdGUgaW4gZGVidWcgbG9ncy4gVGhpcyBzaG91bGQgbm90IGNvbnRhaW4gYW55CisgIC8vIHNlbnNpdGl2ZSBvciBwb3RlbnRpYWxseSBQSUkuCisgIHN0cnVjdCBXZWJNZWRpYVBsYXllclN0YXRlIHsKKyAgICBXZWJNZWRpYVBsYXllclN0YXRlKCkKKyAgICAgICAgOiBwYXVzZWQodHJ1ZSksCisgICAgICAgICAgc2Vla2luZyhmYWxzZSksCisgICAgICAgICAgcGxheWJhY2tfcmF0ZSgwLjBmKSwKKyAgICAgICAgICBwZW5kaW5nX3NlZWsoZmFsc2UpLAorICAgICAgICAgIHBlbmRpbmdfc2Vla19zZWNvbmRzKDAuMGYpLAorICAgICAgICAgIHN0YXJ0aW5nKGZhbHNlKSwKKyAgICAgICAgICBpc19wcm9ncmVzc2l2ZShmYWxzZSksCisgICAgICAgICAgaXNfbWVkaWFfc291cmNlKGZhbHNlKSB7fQorICAgIC8vIFBsYXliYWNrIHN0YXRlLgorICAgIC8vCisgICAgLy8gVE9ETyhzY2hlcmt1cyk6IHdlIGhhdmUgdGhlc2UgYmVjYXVzZSBQaXBlbGluZSBmYXZvdXJzIHRoZSBzaW1wbGljaXR5IG9mCisgICAgLy8gYSBzaW5nbGUgInBsYXliYWNrIHJhdGUiIG92ZXIgd29ycnlpbmcgYWJvdXQgcGF1c2VkL3N0b3BwZWQgZXRjLi4uICBJdAorICAgIC8vIGZvcmNlcyBhbGwgY2xpZW50cyB0byBtYW5hZ2UgdGhlIHBhdXNlK3BsYXliYWNrIHJhdGUgZXh0ZXJuYWxseSwgYnV0IGlzCisgICAgLy8gdGhhdCByZWFsbHkgYSBiYWQgdGhpbmc/CisgICAgLy8KKyAgICAvLyBUT0RPKHNjaGVya3VzKTogc2luY2UgU2V0UGxheWJhY2tSYXRlKDApIGlzIGFzeW5jaHJvbm91cyBhbmQgd2UgZG9uJ3QKKyAgICAvLyB3YW50IHRvIGhhbmcgdGhlIHJlbmRlciB0aHJlYWQgZHVyaW5nIHBhdXNlKCksIHdlIHJlY29yZCB0aGUgdGltZSBhdCB0aGUKKyAgICAvLyBzYW1lIHRpbWUgd2UgcGF1c2UgYW5kIHRoZW4gcmV0dXJuIHRoYXQgdmFsdWUgaW4gY3VycmVudFRpbWUoKS4KKyAgICAvLyBPdGhlcndpc2Ugb3VyIGNsb2NrIGNhbiBjcmVlcCBmb3J3YXJkIGEgbGl0dGxlIGJpdCB3aGlsZSB0aGUgYXN5bmNocm9ub3VzCisgICAgLy8gU2V0UGxheWJhY2tSYXRlKDApIGlzIGJlaW5nIGV4ZWN1dGVkLgorICAgIGJvb2wgcGF1c2VkOworICAgIGJvb2wgc2Vla2luZzsKKyAgICBmbG9hdCBwbGF5YmFja19yYXRlOworICAgIGJhc2U6OlRpbWVEZWx0YSBwYXVzZWRfdGltZTsKKworICAgIC8vIFNlZWsgZ2V0cyBwZW5kaW5nIGlmIGFub3RoZXIgc2VlayBpcyBpbiBwcm9ncmVzcy4gT25seSBsYXN0IHBlbmRpbmcgc2VlaworICAgIC8vIHdpbGwgaGF2ZSBlZmZlY3QuCisgICAgYm9vbCBwZW5kaW5nX3NlZWs7CisgICAgZmxvYXQgcGVuZGluZ19zZWVrX3NlY29uZHM7CisKKyAgICBib29sIHN0YXJ0aW5nOworCisgICAgYm9vbCBpc19wcm9ncmVzc2l2ZTsKKyAgICBib29sIGlzX21lZGlhX3NvdXJjZTsKKyAgfSBzdGF0ZV87CisKKyAgV2ViTWVkaWFQbGF5ZXJDbGllbnQqIGNsaWVudF87CisgIFdlYk1lZGlhUGxheWVyRGVsZWdhdGUqIGRlbGVnYXRlXzsKKyAgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4gdmlkZW9fZnJhbWVfcHJvdmlkZXJfOworCisgIHNjb3BlZF9yZWZwdHI8V2ViTWVkaWFQbGF5ZXJQcm94eT4gcHJveHlfOworCisgIHNjb3BlZF9yZWZwdHI8TWVkaWFMb2c+IG1lZGlhX2xvZ187CisKKyAgYm9vbCBpbmNyZW1lbnRlZF9leHRlcm5hbGx5X2FsbG9jYXRlZF9tZW1vcnlfOworCisgIGJvb2wgaXNfbG9jYWxfc291cmNlXzsKKyAgYm9vbCBzdXBwb3J0c19zYXZlXzsKKworICBzY29wZWRfcHRyPERlbXV4ZXI+IHByb2dyZXNzaXZlX2RlbXV4ZXJfOworICBzY29wZWRfcHRyPENodW5rRGVtdXhlcj4gY2h1bmtfZGVtdXhlcl87CisKKyNpZiBkZWZpbmVkKF9fTEJfQU5EUk9JRF9fKQorICBBdWRpb0ZvY3VzQnJpZGdlIGF1ZGlvX2ZvY3VzX2JyaWRnZV87CisjZW5kaWYgIC8vIGRlZmluZWQoX19MQl9BTkRST0lEX18pCisKKyAgLy8gU3VwcHJlc3NlcyBjYWxscyB0byBPblBpcGVsaW5lRXJyb3IoKSBhZnRlciBkZXN0cnVjdGlvbiAvIHNodXRkb3duIGhhcyBiZWVuCisgIC8vIHN0YXJ0ZWQ7IHByZXZlbnRzIHVzIGZyb20gc3B1cmlvdXNseSBsb2dnaW5nIGVycm9ycyB0aGF0IGFyZSB0cmFuc2llbnQgb3IKKyAgLy8gdW5pbXBvcnRhbnQuCisgIGJvb2wgc3VwcHJlc3NfZGVzdHJ1Y3Rpb25fZXJyb3JzXzsKKworICBiYXNlOjpDYWxsYmFjazx2b2lkKGJhc2U6OlRpbWVEZWx0YSosIGJvb2wqKT4KKyAgICAgIG1lZGlhX3RpbWVfYW5kX3NlZWtpbmdfc3RhdGVfY2JfOworCisgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWJNZWRpYVBsYXllckltcGwpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG1lZGlhCisKKyNlbmRpZiAgLy8gQ09CQUxUX01FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuY2MgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX3Byb3h5LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhMDNiOTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX3Byb3h5LmNjCkBAIC0wLDAgKzEsNTEgQEAKKy8vIENvcHlyaWdodCAoYykgMjAxMiBUaGUgQ2hyb21pdW0gQXV0aG9ycy4gQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUKKy8vIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuaCIKKworI2luY2x1ZGUgImJhc2UvYmluZC5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmgiCisKK25hbWVzcGFjZSBtZWRpYSB7CisKKy8vIExpbWl0cyB0aGUgbWF4aW11bSBvdXRzdGFuZGluZyByZXBhaW50cyBwb3N0ZWQgb24gcmVuZGVyIHRocmVhZC4KKy8vIFRoaXMgbnVtYmVyIG9mIDUwIGlzIGEgZ3Vlc3MsIGl0IGRvZXMgbm90IHRha2UgdG9vIG11Y2ggbWVtb3J5IG9uIHRoZSB0YXNrCisvLyBxdWV1ZSBidXQgZ2l2ZXMgdXAgYSBwcmV0dHkgZ29vZCBsYXRlbmN5IG9uIHJlcGFpbnQuCitzdGF0aWMgY29uc3QgaW50IGtNYXhPdXRzdGFuZGluZ1JlcGFpbnRzID0gNTA7CisKK1dlYk1lZGlhUGxheWVyUHJveHk6OldlYk1lZGlhUGxheWVyUHJveHkoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgcmVuZGVyX2xvb3AsCisgICAgV2ViTWVkaWFQbGF5ZXJJbXBsKiB3ZWJtZWRpYXBsYXllcikKKyAgICA6IHJlbmRlcl9sb29wXyhyZW5kZXJfbG9vcCksIHdlYm1lZGlhcGxheWVyXyh3ZWJtZWRpYXBsYXllcikgeworICBEQ0hFQ0socmVuZGVyX2xvb3BfKTsKKyAgRENIRUNLKHdlYm1lZGlhcGxheWVyXyk7Cit9CisKK1dlYk1lZGlhUGxheWVyUHJveHk6On5XZWJNZWRpYVBsYXllclByb3h5KCkgeyBEZXRhY2goKTsgfQorCitib29sIFdlYk1lZGlhUGxheWVyUHJveHk6Okhhc1NpbmdsZU9yaWdpbigpIHsKKyAgRENIRUNLKHJlbmRlcl9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgaWYgKGRhdGFfc291cmNlXykgcmV0dXJuIGRhdGFfc291cmNlXy0+SGFzU2luZ2xlT3JpZ2luKCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFdlYk1lZGlhUGxheWVyUHJveHk6OkRpZFBhc3NDT1JTQWNjZXNzQ2hlY2soKSBjb25zdCB7CisgIERDSEVDSyhyZW5kZXJfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisgIGlmIChkYXRhX3NvdXJjZV8pIHJldHVybiBkYXRhX3NvdXJjZV8tPkRpZFBhc3NDT1JTQWNjZXNzQ2hlY2soKTsKKyAgcmV0dXJuIGZhbHNlOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6OkFib3J0RGF0YVNvdXJjZSgpIHsKKyAgRENIRUNLKHJlbmRlcl9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgaWYgKGRhdGFfc291cmNlXykgZGF0YV9zb3VyY2VfLT5BYm9ydCgpOworfQorCit2b2lkIFdlYk1lZGlhUGxheWVyUHJveHk6OkRldGFjaCgpIHsKKyAgRENIRUNLKHJlbmRlcl9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKKyAgd2VibWVkaWFwbGF5ZXJfID0gTlVMTDsKKyAgZGF0YV9zb3VyY2VfLnJlc2V0KCk7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oIGIvc3JjL2NvYmFsdC9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNDk2ZTUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX3Byb3h5LmgKQEAgLTAsMCArMSw1MCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQorLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfUExBWUVSX1dFQl9NRURJQV9QTEFZRVJfUFJPWFlfSF8KKyNkZWZpbmUgQ09CQUxUX01FRElBX1BMQVlFUl9XRUJfTUVESUFfUExBWUVSX1BST1hZX0hfCisKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJiYXNlL21lc3NhZ2VfbG9vcF9wcm94eS5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9wbGF5ZXIvYnVmZmVyZWRfZGF0YV9zb3VyY2UuaCIKKworbmFtZXNwYWNlIG1lZGlhIHsKKworY2xhc3MgV2ViTWVkaWFQbGF5ZXJJbXBsOworCisvLyBBY3RzIGFzIGEgdGhyZWFkIHByb3h5IGJldHdlZW4gdGhlIHZhcmlvdXMgdGhyZWFkcyB1c2VkIGZvciBtdWx0aW1lZGlhIGFuZAorLy8gdGhlIHJlbmRlciB0aHJlYWQgdGhhdCBXZWJNZWRpYVBsYXllckltcGwgaXMgcnVubmluZyBvbi4KK2NsYXNzIFdlYk1lZGlhUGxheWVyUHJveHkKKyAgICA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxXZWJNZWRpYVBsYXllclByb3h5PiB7CisgcHVibGljOgorICBXZWJNZWRpYVBsYXllclByb3h5KGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4mIHJlbmRlcl9sb29wLAorICAgICAgICAgICAgICAgICAgICAgIFdlYk1lZGlhUGxheWVySW1wbCogd2VibWVkaWFwbGF5ZXIpOworICBCdWZmZXJlZERhdGFTb3VyY2UqIGRhdGFfc291cmNlKCkgeyByZXR1cm4gZGF0YV9zb3VyY2VfLmdldCgpOyB9CisgIHZvaWQgc2V0X2RhdGFfc291cmNlKHNjb3BlZF9wdHI8QnVmZmVyZWREYXRhU291cmNlPiBkYXRhX3NvdXJjZSkgeworICAgIGRhdGFfc291cmNlXyA9IGRhdGFfc291cmNlLlBhc3MoKTsKKyAgfQorCisgIHZvaWQgRGV0YWNoKCk7CisgIGJvb2wgSGFzU2luZ2xlT3JpZ2luKCk7CisgIGJvb2wgRGlkUGFzc0NPUlNBY2Nlc3NDaGVjaygpIGNvbnN0OworCisgIHZvaWQgQWJvcnREYXRhU291cmNlKCk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8V2ViTWVkaWFQbGF5ZXJQcm94eT47CisgIHZpcnR1YWwgfldlYk1lZGlhUGxheWVyUHJveHkoKTsKKworICAvLyBUaGUgcmVuZGVyIG1lc3NhZ2UgbG9vcCB3aGVyZSB0aGUgcmVuZGVyZXIgbGl2ZXMuCisgIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gcmVuZGVyX2xvb3BfOworICBXZWJNZWRpYVBsYXllckltcGwqIHdlYm1lZGlhcGxheWVyXzsKKworICBzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2VfOworCisgIERJU0FMTE9XX0lNUExJQ0lUX0NPTlNUUlVDVE9SUyhXZWJNZWRpYVBsYXllclByb3h5KTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9QTEFZRVJfV0VCX01FRElBX1BMQVlFUl9QUk9YWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2RlbXV4ZXJfaGVscGVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2RlbXV4ZXJfaGVscGVyLmNjCmluZGV4IDE4MDcyYWQuLmQ3OTExODAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9kZW11eGVyX2hlbHBlci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZGVtdXhlcl9oZWxwZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NhbmRib3gvZGVtdXhlcl9oZWxwZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2RlbXV4ZXJfaGVscGVyLmggYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZGVtdXhlcl9oZWxwZXIuaAppbmRleCA5NTVjYjQzLi44NzQ0Yjk2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZGVtdXhlcl9oZWxwZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZGVtdXhlcl9oZWxwZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01FRElBX1NBTkRCT1hfREVNVVhFUl9IRUxQRVJfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NBTkRCT1hfREVNVVhFUl9IRUxQRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9mdXp6ZXJfYXBwLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2Z1enplcl9hcHAuY2MKaW5kZXggMTYyMGU1YS4uODc1Zjg2MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2Z1enplcl9hcHAuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2Z1enplcl9hcHAuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NhbmRib3gvZnV6emVyX2FwcC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZnV6emVyX2FwcC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2Z1enplcl9hcHAuaAppbmRleCBhYjRhNzkxLi43NzExYTc0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvZnV6emVyX2FwcC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9mdXp6ZXJfYXBwLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9TQU5EQk9YX0ZVWlpFUl9BUFBfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NBTkRCT1hfRlVaWkVSX0FQUF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2luX21lbW9yeV9kYXRhX3NvdXJjZS5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9pbl9tZW1vcnlfZGF0YV9zb3VyY2UuY2MKaW5kZXggOWFiZDBjYS4uOTQzYTc2NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2luX21lbW9yeV9kYXRhX3NvdXJjZS5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvaW5fbWVtb3J5X2RhdGFfc291cmNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9zYW5kYm94L2luX21lbW9yeV9kYXRhX3NvdXJjZS5oIgogCkBAIC00OSw3ICs0Nyw3IEBACiAgIHJlYWRfY2IuUnVuKHNpemUpOwogfQogCi12b2lkIEluTWVtb3J5RGF0YVNvdXJjZTo6U3RvcChjb25zdCBiYXNlOjpDbG9zdXJlJiBjYWxsYmFjaykgeyBjYWxsYmFjay5SdW4oKTsgfQordm9pZCBJbk1lbW9yeURhdGFTb3VyY2U6OlN0b3AoKSB7fQogCiBib29sIEluTWVtb3J5RGF0YVNvdXJjZTo6R2V0U2l6ZShpbnQ2NCogc2l6ZV9vdXQpIHsKICAgRENIRUNLKHNpemVfb3V0KTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9pbl9tZW1vcnlfZGF0YV9zb3VyY2UuaCBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9pbl9tZW1vcnlfZGF0YV9zb3VyY2UuaAppbmRleCBhZGZiZjQyLi5lYmUxMTlhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvaW5fbWVtb3J5X2RhdGFfc291cmNlLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L2luX21lbW9yeV9kYXRhX3NvdXJjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTUVESUFfU0FOREJPWF9JTl9NRU1PUllfREFUQV9TT1VSQ0VfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NBTkRCT1hfSU5fTUVNT1JZX0RBVEFfU09VUkNFX0hfCkBAIC0zNyw3ICszNSw3IEBACiAgIC8vIERhdGFTb3VyY2UgbWV0aG9kcy4KICAgdm9pZCBSZWFkKGludDY0IHBvc2l0aW9uLCBpbnQgc2l6ZSwgdWludDgqIGRhdGEsCiAgICAgICAgICAgICBjb25zdCBSZWFkQ0ImIHJlYWRfY2IpIE9WRVJSSURFOwotICB2b2lkIFN0b3AoY29uc3QgYmFzZTo6Q2xvc3VyZSYgY2FsbGJhY2spIE9WRVJSSURFOworICB2b2lkIFN0b3AoKSBPVkVSUklERTsKICAgYm9vbCBHZXRTaXplKGludDY0KiBzaXplX291dCkgT1ZFUlJJREU7CiAgIGJvb2wgSXNTdHJlYW1pbmcoKSBPVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQogICB2b2lkIFNldEJpdHJhdGUoaW50IGJpdHJhdGUpIE9WRVJSSURFIHsgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihiaXRyYXRlKTsgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhMl9zYW5kYm94LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhMl9zYW5kYm94LmNjCmluZGV4IDU4NWJhNzMuLmQwMTVmZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9tZWRpYTJfc2FuZGJveC5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWEyX3NhbmRib3guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9maWxlX3V0aWwuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9tZWRpYV9zYW5kYm94LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NhbmRib3guY2MKaW5kZXggOWQxYTViNi4uNWJhZGVmNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NhbmRib3guY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NhbmRib3guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc2FuZGJveC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc2FuZGJveC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NhbmRib3guaAppbmRleCAwZDMzZmU3Li41ZDM4NGI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc2FuZGJveC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9tZWRpYV9zYW5kYm94LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9TQU5EQk9YX01FRElBX1NBTkRCT1hfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NBTkRCT1hfTUVESUFfU0FOREJPWF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NvdXJjZV9kZW11eGVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NvdXJjZV9kZW11eGVyLmNjCmluZGV4IDYyMTEyOWIuLjY4NDYyOWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9tZWRpYV9zb3VyY2VfZGVtdXhlci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc291cmNlX2RlbXV4ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc291cmNlX2RlbXV4ZXIuaCIKIApAQCAtMjUsMTAgKzIzLDE3IEBACiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKICNpbmNsdWRlICJiYXNlL3N5c19ieXRlb3JkZXIuaCIKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9iaW5kX3RvX2N1cnJlbnRfbG9vcC5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL2RlbXV4ZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9waXBlbGluZV9zdGF0dXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvZmlsdGVycy9jaHVua19kZW11eGVyLmgiCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9iaW5kX3RvX2xvb3AuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2RlbXV4ZXIuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lX3N0YXR1cy5oIgogI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvY2h1bmtfZGVtdXhlci5oIgorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbWVkaWEgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NvdXJjZV9kZW11eGVyLmggYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc291cmNlX2RlbXV4ZXIuaAppbmRleCAzMjIxY2NiLi41ODlhZGYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc291cmNlX2RlbXV4ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc291cmNlX2RlbXV4ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01FRElBX1NBTkRCT1hfTUVESUFfU09VUkNFX0RFTVVYRVJfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NBTkRCT1hfTUVESUFfU09VUkNFX0RFTVVYRVJfSF8KQEAgLTIxLDggKzE5LDEzIEBACiAKICNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKICNpbmNsdWRlICJiYXNlL3RpbWUuaCIKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaCIKKyNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIG1lZGlhIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9tZWRpYV9zb3VyY2Vfc2FuZGJveC5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9tZWRpYV9zb3VyY2Vfc2FuZGJveC5jYwppbmRleCAwNzg2MWI4Li5hNWY5OTMxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc291cmNlX3NhbmRib3guY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NvdXJjZV9zYW5kYm94LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxzdHJpbmc+CkBAIC0yOSw3ICsyNywxMSBAQAogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9zYW5kYm94L21lZGlhX3NhbmRib3guaCIKICNpbmNsdWRlICJjb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZS5oIgorI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgiCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICNpbmNsdWRlICJuZXQvYmFzZS9uZXRfdXRpbC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9yYXdfdmlkZW9fZGVjb2Rlcl9mdXp6ZXIuY2MgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvcmF3X3ZpZGVvX2RlY29kZXJfZnV6emVyLmNjCmluZGV4IDg4NTMwMzEuLmJlNTZmMDAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9yYXdfdmlkZW9fZGVjb2Rlcl9mdXp6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3Jhd192aWRlb19kZWNvZGVyX2Z1enplci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8dmVjdG9yPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3Jhd192aWRlb19kZWNvZGVyX3NhbmRib3guY2MgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvcmF3X3ZpZGVvX2RlY29kZXJfc2FuZGJveC5jYwppbmRleCA5MWViMzM5Li45MjI3ZmFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvcmF3X3ZpZGVvX2RlY29kZXJfc2FuZGJveC5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvcmF3X3ZpZGVvX2RlY29kZXJfc2FuZGJveC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL2JpbmQuaCIKICNpbmNsdWRlICJiYXNlL2JpbmRfaGVscGVycy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3NhbmRib3guZ3lwIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3NhbmRib3guZ3lwCmluZGV4IDFlMTc4M2UuLmFiNGYwNDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9zYW5kYm94Lmd5cAorKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvc2FuZGJveC5neXAKQEAgLTIwLDYgKzIwLDIzIEBACiAgICAgJ2hhc196enVmJzogJzwhKHB5dGhvbiAuLi8uLi8uLi9idWlsZC9kaXJfZXhpc3RzLnB5IC4uLy4uLy4uL3RoaXJkX3BhcnR5L3p6dWYpJywKICAgfSwKICAgJ3RhcmdldHMnOiBbCisgICAgIyBUaGlzIHRhcmdldCBjYW4gY2hvb3NlIHRoZSBjb3JyZWN0IG1lZGlhIGRlcGVuZGVuY3kuCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ21lZGlhJywKKyAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICdjb25kaXRpb25zJzogWworICAgICAgICBbJ2NvYmFsdF9tZWRpYV9zb3VyY2VfMjAxNj09MScsIHsKKyAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWworICAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9tZWRpYS9tZWRpYTIuZ3lwOm1lZGlhMicsCisgICAgICAgICAgXSwKKyAgICAgICAgfSwgeworICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhL21lZGlhLmd5cDptZWRpYScsCisgICAgICAgICAgXSwKKyAgICAgICAgfV0sCisgICAgICBdLAorICAgIH0sCisKICAgICAjIFRoaXMgdGFyZ2V0IHdpbGwgYnVpbGQgYSBzYW5kYm94IGFwcGxpY2F0aW9uIHRoYXQgYWxsb3dzIGZvciBlYXN5CiAgICAgIyBleHBlcmltZW50YXRpb24gd2l0aCB0aGUgbWVkaWEgaW50ZXJmYWNlIG9uIGFueSBwbGF0Zm9ybS4gIFRoaXMgY2FuCiAgICAgIyBhbHNvIGJlIHVzZWZ1bCBmb3IgdmlzdWFsbHkgaW5zcGVjdGluZyB0aGUgb3V0cHV0IHRoYXQgdGhlIENvYmFsdApAQCAtMzUsMTEgKzUyLDExIEBACiAgICAgICAgICd3ZWJfbWVkaWFfcGxheWVyX3NhbmRib3guY2MnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdtZWRpYScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgIyBVc2UgdGVzdCBkYXRhIGZyb20gYnJvd3NlciB0byBhdm9pZCBrZWVwaW5nIHR3byBjb3BpZXMgb2YgdmlkZW8gZmlsZXMuCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cDpicm93c2VyX2NvcHlfdGVzdF9kYXRhJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmd5cDpsb2FkZXInLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhL21lZGlhLmd5cDptZWRpYScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbmV0d29yay9uZXR3b3JrLmd5cDpuZXR3b3JrJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXA6cmVuZGVyZXInLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3N5c3RlbV93aW5kb3cvc3lzdGVtX3dpbmRvdy5neXA6c3lzdGVtX3dpbmRvdycsCkBAIC03MywxMSArOTAsMTEgQEAKICAgICAgICAgJ3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmgnLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdtZWRpYScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKICAgICAgICAgIyBVc2UgdGVzdCBkYXRhIGZyb20gYnJvd3NlciB0byBhdm9pZCBrZWVwaW5nIHR3byBjb3BpZXMgb2YgdmlkZW8gZmlsZXMuCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYnJvd3Nlci9icm93c2VyLmd5cDpicm93c2VyX2NvcHlfdGVzdF9kYXRhJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9sb2FkZXIvbG9hZGVyLmd5cDpsb2FkZXInLAotICAgICAgICAnPChERVBUSCkvY29iYWx0L21lZGlhL21lZGlhLmd5cDptZWRpYScsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvbmV0d29yay9uZXR3b3JrLmd5cDpuZXR3b3JrJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXA6cmVuZGVyZXInLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L3N5c3RlbV93aW5kb3cvc3lzdGVtX3dpbmRvdy5neXA6c3lzdGVtX3dpbmRvdycsCkBAIC0xMTUsNyArMTMyLDcgQEAKICAgICAgICAgfSwKICAgICAgIF0sCiAgICAgfV0sCi0gICAgWydPUyA9PSAic3RhcmJvYXJkIiBhbmQgaGFzX3p6dWYgPT0gIlRydWUiJywgeworICAgIFsnT1MgPT0gInN0YXJib2FyZCIgYW5kIGhhc196enVmID09ICJUcnVlIiBhbmQgY29iYWx0X21lZGlhX3NvdXJjZV8yMDE2IT0xJywgewogICAgICAgJ3RhcmdldHMnOiBbCiAgICAgICAgICMgVGhpcyB0YXJnZXQgd2lsbCBidWlsZCBhIHNhbmRib3ggYXBwbGljYXRpb24gdGhhdCBhbGxvd3MgZm9yIGZ1enppbmcKICAgICAgICAgIyBkZWNvZGVyLgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3NoZWxsX2RlbXV4ZXJfZnV6emVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3NoZWxsX2RlbXV4ZXJfZnV6emVyLmNjCmluZGV4IGM0NjljNWMuLmRlMGU3YWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC9zaGVsbF9kZW11eGVyX2Z1enplci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvc2hlbGxfZGVtdXhlcl9mdXp6ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8dmVjdG9yPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvdmlkZW9fZGVjb2Rlcl9zYW5kYm94LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3ZpZGVvX2RlY29kZXJfc2FuZGJveC5jYwppbmRleCBkOWM3ZjMxLi5mMmNmM2YwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvdmlkZW9fZGVjb2Rlcl9zYW5kYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC92aWRlb19kZWNvZGVyX3NhbmRib3guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5jYyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5jYwppbmRleCA5ZDQ3ZGIxLi4xNGY5MzdmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9oZWxwZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmgiCiAKQEAgLTIyLDYgKzIwLDcgQEAKIG5hbWVzcGFjZSBtZWRpYSB7CiBuYW1lc3BhY2Ugc2FuZGJveCB7CiAKK3VzaW5nIDo6bWVkaWE6OkJ1ZmZlcmVkRGF0YVNvdXJjZTsKIHVzaW5nIDo6bWVkaWE6OlZpZGVvRnJhbWU7CiAKIGNsYXNzIFdlYk1lZGlhUGxheWVySGVscGVyOjpXZWJNZWRpYVBsYXllckNsaWVudFN0dWIKQEAgLTM4LDcgKzM3LDExIEBACiAgIHZvaWQgUGxheWJhY2tTdGF0ZUNoYW5nZWQoKSBPVkVSUklERSB7fQogICB2b2lkIFNhd1Vuc3VwcG9ydGVkVHJhY2tzKCkgT1ZFUlJJREUge30KICAgZmxvYXQgVm9sdW1lKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gMS5mOyB9CisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisgIHZvaWQgU291cmNlT3BlbmVkKDo6bWVkaWE6OkNodW5rRGVtdXhlciopIE9WRVJSSURFIHt9CisjZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogICB2b2lkIFNvdXJjZU9wZW5lZCgpIE9WRVJSSURFIHt9CisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogICBzdGQ6OnN0cmluZyBTb3VyY2VVUkwoKSBjb25zdCBPVkVSUklERSB7IHJldHVybiAiIjsgfQogfTsKIApAQCAtNTYsMTAgKzU5LDEwIEBACiAgICAgOiBjbGllbnRfKG5ldyBXZWJNZWRpYVBsYXllckNsaWVudFN0dWIpLAogICAgICAgcGxheWVyXyhtZWRpYV9tb2R1bGUtPkNyZWF0ZVdlYk1lZGlhUGxheWVyKGNsaWVudF8pKSB7CiAgIHBsYXllcl8tPlNldFJhdGUoMS4wKTsKLSAgcGxheWVyXy0+TG9hZFByb2dyZXNzaXZlKHZpZGVvX3VybCwgbmV3IEZldGNoZXJCdWZmZXJlZERhdGFTb3VyY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlOjpNZXNzYWdlTG9vcFByb3h5OjpjdXJyZW50KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWRlb191cmwsIGNzcDo6U2VjdXJpdHlDYWxsYmFjaygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmV0Y2hlcl9mYWN0b3J5LT5uZXR3b3JrX21vZHVsZSgpKSwKKyAgc2NvcGVkX3B0cjxCdWZmZXJlZERhdGFTb3VyY2U+IGRhdGFfc291cmNlKG5ldyBGZXRjaGVyQnVmZmVyZWREYXRhU291cmNlKAorICAgICAgYmFzZTo6TWVzc2FnZUxvb3BQcm94eTo6Y3VycmVudCgpLCB2aWRlb191cmwsIGNzcDo6U2VjdXJpdHlDYWxsYmFjaygpLAorICAgICAgZmV0Y2hlcl9mYWN0b3J5LT5uZXR3b3JrX21vZHVsZSgpKSk7CisgIHBsYXllcl8tPkxvYWRQcm9ncmVzc2l2ZSh2aWRlb191cmwsIGRhdGFfc291cmNlLlBhc3MoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdlYk1lZGlhUGxheWVyOjprQ09SU01vZGVVbnNwZWNpZmllZCk7CiAgIHBsYXllcl8tPlBsYXkoKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX2hlbHBlci5oIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmgKaW5kZXggMmQwMjlkYi4uMDkxNDE0MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9TQU5EQk9YX1dFQl9NRURJQV9QTEFZRVJfSEVMUEVSX0hfCiAjZGVmaW5lIENPQkFMVF9NRURJQV9TQU5EQk9YX1dFQl9NRURJQV9QTEFZRVJfSEVMUEVSX0hfCkBAIC0yMyw4ICsyMSwxMyBAQAogI2luY2x1ZGUgImNvYmFsdC9sb2FkZXIvZmV0Y2hlcl9mYWN0b3J5LmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL21lZGlhX21vZHVsZS5oIgogI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgorI2lmIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgiCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgiCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCiAjaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19mcmFtZS5oIgogI2luY2x1ZGUgIm1lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgiCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBtZWRpYSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9zYW5kYm94LmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfc2FuZGJveC5jYwppbmRleCAwM2E3YTI3Li4wMDViNzFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvd2ViX21lZGlhX3BsYXllcl9zYW5kYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC93ZWJfbWVkaWFfcGxheWVyX3NhbmRib3guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9iaW5kX2hlbHBlcnMuaCIKQEAgLTI1LDcgKzIzLDExIEBACiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NhbmRib3gvbWVkaWFfc2FuZGJveC5oIgogI2luY2x1ZGUgImNvYmFsdC9tZWRpYS9zYW5kYm94L3dlYl9tZWRpYV9wbGF5ZXJfaGVscGVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2ltYWdlLmgiCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisjaW5jbHVkZSAiY29iYWx0L21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaCIKKyNlbHNlICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQogI2luY2x1ZGUgIm5ldC9iYXNlL25ldF91dGlsLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3p6dWZfZnV6emVyLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3p6dWZfZnV6emVyLmNjCmluZGV4IGJiNTJmYTcuLmM0N2M1ZTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2FuZGJveC96enVmX2Z1enplci5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvenp1Zl9mdXp6ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NhbmRib3gvenp1Zl9mdXp6ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zYW5kYm94L3p6dWZfZnV6emVyLmggYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvenp1Zl9mdXp6ZXIuaAppbmRleCA2MDIwYjIyLi4zYTkzMGQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvenp1Zl9mdXp6ZXIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL3NhbmRib3gvenp1Zl9mdXp6ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01FRElBX1NBTkRCT1hfWlpVRl9GVVpaRVJfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NBTkRCT1hfWlpVRl9GVVpaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2hlbGxfbWVkaWFfcGxhdGZvcm1fc3RhcmJvYXJkLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF9tZWRpYV9wbGF0Zm9ybV9zdGFyYm9hcmQuY2MKaW5kZXggOWI5YmYzMS4uYzE5NzViMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF9tZWRpYV9wbGF0Zm9ybV9zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF9tZWRpYV9wbGF0Zm9ybV9zdGFyYm9hcmQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NoZWxsX21lZGlhX3BsYXRmb3JtX3N0YXJib2FyZC5oIgogCkBAIC00NCw3ICs0Miw4IEBACiAKIFNoZWxsTWVkaWFQbGF0Zm9ybVN0YXJib2FyZDo6U2hlbGxNZWRpYVBsYXRmb3JtU3RhcmJvYXJkKAogICAgIGNvYmFsdDo6cmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyKQotICAgIDogdmlkZW9fZGF0YV9hbGxvY2F0b3JfKHJlc291cmNlX3Byb3ZpZGVyLCAwLAorICAgIDogcmVzb3VyY2VfcHJvdmlkZXJfKHJlc291cmNlX3Byb3ZpZGVyKSwKKyAgICAgIHZpZGVvX2RhdGFfYWxsb2NhdG9yXyhyZXNvdXJjZV9wcm92aWRlcl8sIDAsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9GcmFtZUFsaWdubWVudCksCiAgICAgICB2aWRlb19mcmFtZV9wcm92aWRlcl8obmV3IFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3NoZWxsX21lZGlhX3BsYXRmb3JtX3N0YXJib2FyZC5oIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF9tZWRpYV9wbGF0Zm9ybV9zdGFyYm9hcmQuaAppbmRleCBmOTA3YjYwLi4zYTFhOWVlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NoZWxsX21lZGlhX3BsYXRmb3JtX3N0YXJib2FyZC5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvc2hlbGxfbWVkaWFfcGxhdGZvcm1fc3RhcmJvYXJkLmgKQEAgLTEsMjkgKzEsODggQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9TSEVMTF9NRURJQV9QTEFURk9STV9TVEFSQk9BUkRfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NIRUxMX01FRElBX1BMQVRGT1JNX1NUQVJCT0FSRF9IXwogCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oIgorCisjaWYgZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oIgorCituYW1lc3BhY2UgbWVkaWEgeworY2xhc3MgU2hlbGxNZWRpYVBsYXRmb3JtU3RhcmJvYXJkIDogcHVibGljIFNoZWxsTWVkaWFQbGF0Zm9ybSB7CisgcHVibGljOgorICBleHBsaWNpdCBTaGVsbE1lZGlhUGxhdGZvcm1TdGFyYm9hcmQoCisgICAgICBjb2JhbHQ6OnJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiByZXNvdXJjZV9wcm92aWRlcikKKyAgICAgIDogcmVzb3VyY2VfcHJvdmlkZXJfKHJlc291cmNlX3Byb3ZpZGVyKSwKKyAgICAgICAgdmlkZW9fZnJhbWVfcHJvdmlkZXJfKG5ldyBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcikgeworICAgIFNldEluc3RhbmNlKHRoaXMpOworICB9CisKKyAgflNoZWxsTWVkaWFQbGF0Zm9ybVN0YXJib2FyZCgpIHsKKyAgICBEQ0hFQ0tfRVEoSW5zdGFuY2UoKSwgdGhpcyk7CisgICAgU2V0SW5zdGFuY2UoTlVMTCk7CisgIH0KKworICBzY29wZWRfcmVmcHRyPFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyPiBHZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKSBPVkVSUklERSB7CisgICAgcmV0dXJuIHZpZGVvX2ZyYW1lX3Byb3ZpZGVyXzsKKyAgfQorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMworICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgT1ZFUlJJREUgeworI2lmIFNCX0hBUyhHUkFQSElDUykKKyAgICByZXR1cm4gcmVzb3VyY2VfcHJvdmlkZXJfLT5HZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCk7CisjZWxzZSAgIC8vIFNCX0hBUyhHUkFQSElDUykKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZiAgLy8gU0JfSEFTKEdSQVBISUNTKQorICB9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKKworIHByaXZhdGU6CisgIHZvaWQqIEFsbG9jYXRlQnVmZmVyKHNpemVfdCBzaXplKSBPVkVSUklERSB7CisgICAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihzaXplKTsKKyAgICBOT1RSRUFDSEVEKCk7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgdm9pZCBGcmVlQnVmZmVyKHZvaWQqIHB0cikgT1ZFUlJJREUgeworICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocHRyKTsKKyAgICBOT1RSRUFDSEVEKCk7CisgIH0KKyAgc2l6ZV90IEdldFNvdXJjZUJ1ZmZlclN0cmVhbUF1ZGlvTWVtb3J5TGltaXQoKSBjb25zdCBPVkVSUklERSB7CisgICAgTk9UUkVBQ0hFRCgpOworICAgIHJldHVybiAwOworICB9CisgIHNpemVfdCBHZXRTb3VyY2VCdWZmZXJTdHJlYW1WaWRlb01lbW9yeUxpbWl0KCkgY29uc3QgT1ZFUlJJREUgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgIGNvYmFsdDo6cmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyXzsKKyAgc2NvcGVkX3JlZnB0cjxTaGVsbFZpZGVvRnJhbWVQcm92aWRlcj4gdmlkZW9fZnJhbWVfcHJvdmlkZXJfOworfTsKK30gIC8vIG5hbWVzcGFjZSBtZWRpYQorCisjZWxzZSAgLy8gZGVmaW5lZChDT0JBTFRfTUVESUFfU09VUkNFXzIwMTYpCisKICNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmgiCiAKLSNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvYWxpZ25lZF9tZW1vcnkuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX2NvbW1vbi5oIgotI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaCIKICNpbmNsdWRlICJuYi9tZW1vcnlfcG9vbC5oIgogCkBAIC01Niw3ICsxMTUsMTkgQEAKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8RGVjb2RlckJ1ZmZlcj4mIGJ1ZmZlcikgT1ZFUlJJREU7CiAgIGJvb2wgSXNPdXRwdXRQcm90ZWN0ZWQoKSBPVkVSUklERTsKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKKyAgdmlydHVhbCBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgeworI2lmIFNCX0hBUyhHUkFQSElDUykKKyAgICByZXR1cm4gcmVzb3VyY2VfcHJvdmlkZXJfLT5HZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCk7CisjZWxzZSAgIC8vIFNCX0hBUyhHUkFQSElDUykKKyAgICByZXR1cm4gTlVMTDsKKyNlbmRpZiAgLy8gU0JfSEFTKEdSQVBISUNTKQorICB9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKKwogIHByaXZhdGU6CisgIGNvYmFsdDo6cmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIHJlc291cmNlX3Byb3ZpZGVyXzsKKwogICAvLyBPcHRpb25hbCBHUFUgTWVtb3J5IGJ1ZmZlciBwb29sLCBmb3IgYnVmZmVyIG9mZmxvYWRpbmcuCiAgIHNjb3BlZF9wdHI8Y29iYWx0OjpyZW5kZXJfdHJlZTo6UmF3SW1hZ2VNZW1vcnk+IGdwdV9tZW1vcnlfYnVmZmVyX3NwYWNlXzsKICAgc2NvcGVkX3B0cjxuYjo6TWVtb3J5UG9vbD4gZ3B1X21lbW9yeV9wb29sXzsKQEAgLTc0LDQgKzE0NSw2IEBACiAKIH0gIC8vIG5hbWVzcGFjZSBtZWRpYQogCisjZW5kaWYgIC8vIGRlZmluZWQoQ09CQUxUX01FRElBX1NPVVJDRV8yMDE2KQorCiAjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9TSEVMTF9NRURJQV9QTEFURk9STV9TVEFSQk9BUkRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvc2hlbGxfdmlkZW9fZGF0YV9hbGxvY2F0b3JfY29tbW9uLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvcl9jb21tb24uY2MKaW5kZXggZGU4YWY3NC4uZjFiNGU2ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvcl9jb21tb24uY2MKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvcl9jb21tb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX2NvbW1vbi5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX2NvbW1vbi5oIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvcl9jb21tb24uaAppbmRleCA5NjczZGVkLi5hMTk2ZTM0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX2NvbW1vbi5oCisrKyBiL3NyYy9jb2JhbHQvbWVkaWEvc2hlbGxfdmlkZW9fZGF0YV9hbGxvY2F0b3JfY29tbW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9NRURJQV9TSEVMTF9WSURFT19EQVRBX0FMTE9DQVRPUl9DT01NT05fSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NIRUxMX1ZJREVPX0RBVEFfQUxMT0NBVE9SX0NPTU1PTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvcl9zdHViLmNjIGIvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvcl9zdHViLmNjCmluZGV4IDM0ODUwNTYuLjk2ZmFkOGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvc2hlbGxfdmlkZW9fZGF0YV9hbGxvY2F0b3Jfc3R1Yi5jYworKysgYi9zcmMvY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX3N0dWIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX3N0dWIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYS9zaGVsbF92aWRlb19kYXRhX2FsbG9jYXRvcl9zdHViLmggYi9zcmMvY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX3N0dWIuaAppbmRleCAzOWFiZGYwLi4xNTM5OTk5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX3N0dWIuaAorKysgYi9zcmMvY29iYWx0L21lZGlhL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yX3N0dWIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01FRElBX1NIRUxMX1ZJREVPX0RBVEFfQUxMT0NBVE9SX1NUVUJfSF8KICNkZWZpbmUgQ09CQUxUX01FRElBX1NIRUxMX1ZJREVPX0RBVEFfQUxMT0NBVE9SX1NUVUJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWEvd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5LmggYi9zcmMvY29iYWx0L21lZGlhL3dlYl9tZWRpYV9wbGF5ZXJfZmFjdG9yeS5oCmluZGV4IDE2OTZmODYuLjdjNmJmMDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbWVkaWEvd2ViX21lZGlhX3BsYXllcl9mYWN0b3J5LmgKKysrIGIvc3JjL2NvYmFsdC9tZWRpYS93ZWJfbWVkaWFfcGxheWVyX2ZhY3RvcnkuaApAQCAtMSwyMyArMSwyNSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX01FRElBX1dFQl9NRURJQV9QTEFZRVJfRkFDVE9SWV9IXwogI2RlZmluZSBDT0JBTFRfTUVESUFfV0VCX01FRElBX1BMQVlFUl9GQUNUT1JZX0hfCiAKKyNpZiBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKKyNpbmNsdWRlICJjb2JhbHQvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXIuaCIKKyNlbHNlICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKICNpbmNsdWRlICJtZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oIgorI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9NRURJQV9TT1VSQ0VfMjAxNikKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgbWVkaWEgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX21ldGFkYXRhLmggYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfbWV0YWRhdGEuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MzhmZjFhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX21ldGFkYXRhLmgKQEAgLTAsMCArMSw3MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfU0VTU0lPTl9NRURJQV9NRVRBREFUQV9IXworI2RlZmluZSBDT0JBTFRfTUVESUFfU0VTU0lPTl9NRURJQV9NRVRBREFUQV9IXworCisjaW5jbHVkZSA8c3RyaW5nPgorCisjaW5jbHVkZSAiY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfbWV0YWRhdGFfaW5pdC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSBtZWRpYV9zZXNzaW9uIHsKKworY2xhc3MgTWVkaWFNZXRhZGF0YSA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CisgcHVibGljOgorICBNZWRpYU1ldGFkYXRhKCkge30KKyAgZXhwbGljaXQgTWVkaWFNZXRhZGF0YShjb25zdCBNZWRpYU1ldGFkYXRhSW5pdCYgaW5pdCkgeworICAgIGlmIChpbml0Lmhhc190aXRsZSgpKSB7CisgICAgICB0aXRsZV8gPSBpbml0LnRpdGxlKCk7CisgICAgfQorCisgICAgaWYgKGluaXQuaGFzX2FydGlzdCgpKSB7CisgICAgICBhcnRpc3RfID0gaW5pdC5hcnRpc3QoKTsKKyAgICB9CisKKyAgICBpZiAoaW5pdC5oYXNfYWxidW0oKSkgeworICAgICAgYWxidW1fID0gaW5pdC5hbGJ1bSgpOworICAgIH0KKyAgfQorCisgIHNjb3BlZF9yZWZwdHI8TWVkaWFNZXRhZGF0YT4gbWV0YWRhdGEoKSB7CisgICAgcmV0dXJuIHNjb3BlZF9yZWZwdHI8TWVkaWFNZXRhZGF0YT4oKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nIHRpdGxlKCkgY29uc3QgeyByZXR1cm4gdGl0bGVfOyB9CisKKyAgdm9pZCBzZXRfdGl0bGUoY29uc3Qgc3RkOjpzdHJpbmcmIHZhbHVlKSB7IHRpdGxlXyA9IHZhbHVlOyB9CisKKyAgc3RkOjpzdHJpbmcgYXJ0aXN0KCkgY29uc3QgeyByZXR1cm4gYXJ0aXN0XzsgfQorCisgIHZvaWQgc2V0X2FydGlzdChjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgYXJ0aXN0XyA9IHZhbHVlOyB9CisKKyAgc3RkOjpzdHJpbmcgYWxidW0oKSBjb25zdCB7IHJldHVybiBhbGJ1bV87IH0KKworICB2b2lkIHNldF9hbGJ1bShjb25zdCBzdGQ6OnN0cmluZyYgdmFsdWUpIHsgYWxidW1fID0gdmFsdWU7IH0KKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVkaWFNZXRhZGF0YSk7CisKKyBwcml2YXRlOgorICBzdGQ6OnN0cmluZyB0aXRsZV87CisgIHN0ZDo6c3RyaW5nIGFydGlzdF87CisgIHN0ZDo6c3RyaW5nIGFsYnVtXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFNZXRhZGF0YSk7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbWVkaWFfc2Vzc2lvbgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorI2VuZGlmICAvLyBDT0JBTFRfTUVESUFfU0VTU0lPTl9NRURJQV9NRVRBREFUQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX21ldGFkYXRhLmlkbCBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9tZXRhZGF0YS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQwMDBmYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9tZXRhZGF0YS5pZGwKQEAgLTAsMCArMSwyNCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gTWVkaWFNZXRhZGF0YSBpbnRlcmZhY2UKKy8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vbWVkaWFzZXNzaW9uCitbQ29uc3RydWN0b3Iob3B0aW9uYWwgTWVkaWFNZXRhZGF0YUluaXQgaW5pdCksIEV4cG9zZWQ9V2luZG93XQoraW50ZXJmYWNlIE1lZGlhTWV0YWRhdGEgeworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRpdGxlOworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGFydGlzdDsKKyAgYXR0cmlidXRlIERPTVN0cmluZyBhbGJ1bTsKKyAgLy8gVE9ETyBGcm96ZW5BcnJheSBub3QgaW1wbGVtZW50ZWQgaW4gY3VycmVudCBJREwgcGFyc2VyLgorICAvLyBhdHRyaWJ1dGUgRnJvemVuQXJyYXk8TWVkaWFJbWFnZT4gYXJ0d29yazsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfbWV0YWRhdGFfaW5pdC5pZGwgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfbWV0YWRhdGFfaW5pdC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWYwMjUxNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9tZXRhZGF0YV9pbml0LmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBNZWRpYU1ldGFkYXRhIGludGVyZmFjZQorLy8gaHR0cHM6Ly93aWNnLmdpdGh1Yi5pby9tZWRpYXNlc3Npb24KK2RpY3Rpb25hcnkgTWVkaWFNZXRhZGF0YUluaXQgeworICBET01TdHJpbmcgdGl0bGUgPSAiIjsKKyAgRE9NU3RyaW5nIGFydGlzdCA9ICIiOworICBET01TdHJpbmcgYWxidW0gPSAiIjsKKyAgLy8gVE9ETyBGcm96ZW5BcnJheSBub3QgaW1wbGVtZW50ZWQgaW4gY3VycmVudCBJREwgcGFyc2VyLgorICAvLyBhdHRyaWJ1dGUgRnJvemVuQXJyYXk8TWVkaWFJbWFnZT4gYXJ0d29yazsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5neXAgYi9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbWVkaWFfc2Vzc2lvbi5neXAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU3YWFmMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmd5cApAQCAtMCwwICsxLDMyIEBACisjIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisjCisjIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworIyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorIworIyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisjCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKK3sKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAnY29iYWx0X2NvZGUnOiAxLAorICB9LAorICAndGFyZ2V0cyc6IFsKKyAgICB7CisgICAgICAndGFyZ2V0X25hbWUnOiAnbWVkaWFfc2Vzc2lvbicsCisgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ21lZGlhX3Nlc3Npb24uaCcKKyAgICAgICAgJ21lZGlhX21ldGFkYXRhLmgnCisgICAgICBdLAorICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgXSwKKyAgICB9LAorICBdLAorfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaCBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDA1YzA0ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmgKQEAgLTAsMCArMSw3MSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfTUVESUFfU0VTU0lPTl9NRURJQV9TRVNTSU9OX0hfCisjZGVmaW5lIENPQkFMVF9NRURJQV9TRVNTSU9OX01FRElBX1NFU1NJT05fSF8KKworI2luY2x1ZGUgImNvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX21ldGFkYXRhLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2Z1bmN0aW9uLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgbWVkaWFfc2Vzc2lvbiB7CisKK2NsYXNzIE1lZGlhU2Vzc2lvbiA6IHB1YmxpYyBzY3JpcHQ6OldyYXBwYWJsZSB7CisgcHVibGljOgorICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKCk+IE1lZGlhU2Vzc2lvbkFjdGlvbkhhbmRsZXI7CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxNZWRpYVNlc3Npb25BY3Rpb25IYW5kbGVyPgorICAgICAgTWVkaWFTZXNzaW9uQWN0aW9uSGFuZGxlckhvbGRlcjsKKyAgZW51bSBNZWRpYVNlc3Npb25QbGF5YmFja1N0YXRlIHsga05vbmUsIGtQYXVzZWQsIGtQbGF5aW5nIH07CisKKyAgZW51bSBNZWRpYVNlc3Npb25BY3Rpb24geworICAgIGtQbGF5LAorICAgIGtQYXVzZSwKKyAgICBrU2Vla2JhY2t3YXJkLAorICAgIGtTZWVrZm9yd2FyZCwKKyAgICBrUHJldmlvdXN0cmFjaywKKyAgICBrTmV4dHRyYWNrCisgIH07CisKKyAgTWVkaWFTZXNzaW9uKCkgOiBzdGF0ZV8oa05vbmUpIHt9CisKKyAgc2NvcGVkX3JlZnB0cjxNZWRpYU1ldGFkYXRhPiBtZXRhZGF0YSgpIGNvbnN0IHsgcmV0dXJuIG1ldGFkYXRhXzsgfQorCisgIHZvaWQgc2V0X21ldGFkYXRhKHNjb3BlZF9yZWZwdHI8TWVkaWFNZXRhZGF0YT4gdmFsdWUpIHsgbWV0YWRhdGFfID0gdmFsdWU7IH0KKworICBNZWRpYVNlc3Npb25QbGF5YmFja1N0YXRlIHBsYXliYWNrX3N0YXRlKCkgY29uc3QgeyByZXR1cm4gc3RhdGVfOyB9CisKKyAgdm9pZCBzZXRfcGxheWJhY2tfc3RhdGUoTWVkaWFTZXNzaW9uUGxheWJhY2tTdGF0ZSBzdGF0ZSkgeyBzdGF0ZV8gPSBzdGF0ZTsgfQorCisgIHZvaWQgU2V0QWN0aW9uSGFuZGxlcihNZWRpYVNlc3Npb25BY3Rpb24gYWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVkaWFTZXNzaW9uQWN0aW9uSGFuZGxlckhvbGRlciYgaGFuZGxlcikgeworICAgIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoYWN0aW9uKTsKKyAgICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGhhbmRsZXIpOworICAgIE5PVElNUExFTUVOVEVEKCk7CisgIH0KKworICBERUZJTkVfV1JBUFBBQkxFX1RZUEUoTWVkaWFTZXNzaW9uKTsKKworIHByaXZhdGU6CisgIHNjb3BlZF9yZWZwdHI8TWVkaWFNZXRhZGF0YT4gbWV0YWRhdGFfOworICBNZWRpYVNlc3Npb25QbGF5YmFja1N0YXRlIHN0YXRlXzsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oTWVkaWFTZXNzaW9uKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSBtZWRpYV9zZXNzaW9uCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisjZW5kaWYgIC8vIENPQkFMVF9NRURJQV9TRVNTSU9OX01FRElBX1NFU1NJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmlkbCBiL3NyYy9jb2JhbHQvbWVkaWFfc2Vzc2lvbi9tZWRpYV9zZXNzaW9uLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MjQ4ZDNkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL21lZGlhX3Nlc3Npb24uaWRsCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIE1lZGlhU2Vzc2lvbiBpbnRlcmZhY2UKKy8vIGh0dHBzOi8vd2ljZy5naXRodWIuaW8vbWVkaWFzZXNzaW9uCisKK2VudW0gTWVkaWFTZXNzaW9uUGxheWJhY2tTdGF0ZSB7CisgICJub25lIiwKKyAgInBhdXNlZCIsCisgICJwbGF5aW5nIgorfTsKKworZW51bSBNZWRpYVNlc3Npb25BY3Rpb24geworICAicGxheSIsCisgICJwYXVzZSIsCisgICJzZWVrYmFja3dhcmQiLAorICAic2Vla2ZvcndhcmQiLAorICAicHJldmlvdXN0cmFjayIsCisgICJuZXh0dHJhY2siLAorfTsKKworY2FsbGJhY2sgTWVkaWFTZXNzaW9uQWN0aW9uSGFuZGxlciA9IHZvaWQoKTsKKworaW50ZXJmYWNlIE1lZGlhU2Vzc2lvbiB7CisgIGF0dHJpYnV0ZSBNZWRpYU1ldGFkYXRhPyBtZXRhZGF0YTsKKworICBhdHRyaWJ1dGUgTWVkaWFTZXNzaW9uUGxheWJhY2tTdGF0ZSBwbGF5YmFja1N0YXRlOworCisgIHZvaWQgc2V0QWN0aW9uSGFuZGxlcihNZWRpYVNlc3Npb25BY3Rpb24gYWN0aW9uLCBNZWRpYVNlc3Npb25BY3Rpb25IYW5kbGVyPyBoYW5kbGVyKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L21lZGlhX3Nlc3Npb24vbmF2aWdhdG9yX21lZGlhX3Nlc3Npb24uaWRsIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL25hdmlnYXRvcl9tZWRpYV9zZXNzaW9uLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kM2RmZjFkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9tZWRpYV9zZXNzaW9uL25hdmlnYXRvcl9tZWRpYV9zZXNzaW9uLmlkbApAQCAtMCwwICsxLDIxIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBNZWRpYVNlc3Npb24gaW50ZXJmYWNlCisvLyBodHRwczovL3dpY2cuZ2l0aHViLmlvL21lZGlhc2Vzc2lvbgorCitbTm9JbnRlcmZhY2VPYmplY3RdCitpbnRlcmZhY2UgTmF2aWdhdG9yTWVkaWFTZXNzaW9uIHsKKyAgW1NhbWVPYmplY3RdIHJlYWRvbmx5IGF0dHJpYnV0ZSBNZWRpYVNlc3Npb24gbWVkaWFTZXNzaW9uOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9jb2JhbHRfbmV0X2xvZy5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay9jb2JhbHRfbmV0X2xvZy5jYwppbmRleCBkNDZmOGRmLi44ZWViYzIyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvY29iYWx0X25ldF9sb2cuY2MKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL2NvYmFsdF9uZXRfbG9nLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL2NvYmFsdF9uZXRfbG9nLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9jb2JhbHRfbmV0X2xvZy5oIGIvc3JjL2NvYmFsdC9uZXR3b3JrL2NvYmFsdF9uZXRfbG9nLmgKaW5kZXggM2JjMjJlMC4uNzhkODIwNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL2NvYmFsdF9uZXRfbG9nLmgKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL2NvYmFsdF9uZXRfbG9nLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ORVRXT1JLX0NPQkFMVF9ORVRfTE9HX0hfCiAjZGVmaW5lIENPQkFMVF9ORVRXT1JLX0NPQkFMVF9ORVRfTE9HX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvY29va2llX2phcl9pbXBsLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL2Nvb2tpZV9qYXJfaW1wbC5jYwppbmRleCA2ZTU3M2RlLi42YTIxMGE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvY29va2llX2phcl9pbXBsLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9jb29raWVfamFyX2ltcGwuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvY29va2llX2phcl9pbXBsLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9jb29raWVfamFyX2ltcGwuaCBiL3NyYy9jb2JhbHQvbmV0d29yay9jb29raWVfamFyX2ltcGwuaAppbmRleCA2Yzg3YTNmLi42ZTFhMGFiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvY29va2llX2phcl9pbXBsLmgKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL2Nvb2tpZV9qYXJfaW1wbC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTkVUV09SS19DT09LSUVfSkFSX0lNUExfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfQ09PS0lFX0pBUl9JTVBMX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0X2xvZ19jb25zdGFudHMuY2MgYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0X2xvZ19jb25zdGFudHMuY2MKaW5kZXggMjM2ZjlmNy4uYjJhZWNhZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9sb2dfY29uc3RhbnRzLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXRfbG9nX2NvbnN0YW50cy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXRfbG9nX2NvbnN0YW50cy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0X2xvZ19jb25zdGFudHMuaCBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXRfbG9nX2NvbnN0YW50cy5oCmluZGV4IDZiYWQxZmYuLmQ0YTQzY2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXRfbG9nX2NvbnN0YW50cy5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXRfbG9nX2NvbnN0YW50cy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTkVUV09SS19ORVRfTE9HX0NPTlNUQU5UU19IXwogI2RlZmluZSBDT0JBTFRfTkVUV09SS19ORVRfTE9HX0NPTlNUQU5UU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9sb2dfbG9nZ2VyLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9sb2dfbG9nZ2VyLmNjCmluZGV4IGNmMzNjZDQuLjg4YzUxZGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXRfbG9nX2xvZ2dlci5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0X2xvZ19sb2dnZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvbmV0X2xvZ19sb2dnZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9sb2dfbG9nZ2VyLmggYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0X2xvZ19sb2dnZXIuaAppbmRleCBiNzk3Y2NlLi4yY2NmMmVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0X2xvZ19sb2dnZXIuaAorKysgYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0X2xvZ19sb2dnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX05FVFdPUktfTkVUX0xPR19MT0dHRVJfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfTkVUX0xPR19MT0dHRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXRfcG9zdGVyLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9wb3N0ZXIuY2MKaW5kZXggYzY3MGU3My4uZTMzYTgzMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9wb3N0ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9wb3N0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvbmV0X3Bvc3Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0X3Bvc3Rlci5oIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldF9wb3N0ZXIuaAppbmRleCBlODVmMDM2Li43MTk1ZGNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0X3Bvc3Rlci5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXRfcG9zdGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ORVRXT1JLX05FVF9QT1NURVJfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfTkVUX1BPU1RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfZGVsZWdhdGUuY2MgYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19kZWxlZ2F0ZS5jYwppbmRleCAwYWFkYzUyLi4zOWZmMjczIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19kZWxlZ2F0ZS5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19kZWxlZ2F0ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9uZXR3b3JrX2RlbGVnYXRlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX2RlbGVnYXRlLmggYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19kZWxlZ2F0ZS5oCmluZGV4IGMwNDcwMDkuLjM0NGEwZWEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX2RlbGVnYXRlLmgKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfZGVsZWdhdGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX05FVFdPUktfTkVUV09SS19ERUxFR0FURV9IXwogI2RlZmluZSBDT0JBTFRfTkVUV09SS19ORVRXT1JLX0RFTEVHQVRFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19ldmVudC5oIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfZXZlbnQuaAppbmRleCA3NTE5ODMxLi5iNDc1YzU3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ORVRXT1JLX05FVFdPUktfRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfTkVUV09SS19FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmNjCmluZGV4IGU0Yjc5YWMuLmJiNGUwNzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX21vZHVsZS5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfbW9kdWxlLmggYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaAppbmRleCA0MzE3ZjI0Li4yMjJhMDVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX05FVFdPUktfTkVUV09SS19NT0RVTEVfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfTkVUV09SS19NT0RVTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9uZXR3b3JrX3N5c3RlbS5oIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfc3lzdGVtLmgKaW5kZXggNjliMDhkMi4uNTc0OWZiZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfc3lzdGVtLmgKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL25ldHdvcmtfc3lzdGVtLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ORVRXT1JLX05FVFdPUktfU1lTVEVNX0hfCiAjZGVmaW5lIENPQkFMVF9ORVRXT1JLX05FVFdPUktfU1lTVEVNX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmUuY2MgYi9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmUuY2MKaW5kZXggY2UwOTI2Yy4uZjZlMzdkZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3BlcnNpc3RlbnRfY29va2llX3N0b3JlLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmUuaCBiL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZS5oCmluZGV4IGMxYmM3YmQuLjUzNjhmZjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZS5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTkVUV09SS19QRVJTSVNURU5UX0NPT0tJRV9TVE9SRV9IXwogI2RlZmluZSBDT0JBTFRfTkVUV09SS19QRVJTSVNURU5UX0NPT0tJRV9TVE9SRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3BlcnNpc3RlbnRfY29va2llX3N0b3JlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmVfdGVzdC5jYwppbmRleCA3NzI4NWQwLi4wODdmNDRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvcGVyc2lzdGVudF9jb29raWVfc3RvcmVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9wZXJzaXN0ZW50X2Nvb2tpZV9zdG9yZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvcHJveHlfY29uZmlnX3NlcnZpY2UuaCBiL3NyYy9jb2JhbHQvbmV0d29yay9wcm94eV9jb25maWdfc2VydmljZS5oCmluZGV4IDQ5MDcwOTUuLjQ5OGQwMzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9wcm94eV9jb25maWdfc2VydmljZS5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9wcm94eV9jb25maWdfc2VydmljZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTkVUV09SS19QUk9YWV9DT05GSUdfU0VSVklDRV9IXwogI2RlZmluZSBDT0JBTFRfTkVUV09SS19QUk9YWV9DT05GSUdfU0VSVklDRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3N0YXJib2FyZC9uZXR3b3JrX3N5c3RlbS5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay9zdGFyYm9hcmQvbmV0d29ya19zeXN0ZW0uY2MKaW5kZXggZGVhNzI5MC4uNjJhNjZhNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3N0YXJib2FyZC9uZXR3b3JrX3N5c3RlbS5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvc3RhcmJvYXJkL25ldHdvcmtfc3lzdGVtLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfc3lzdGVtLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay9zdGFyYm9hcmQvcHJveHlfY29uZmlnX3NlcnZpY2UuY2MgYi9zcmMvY29iYWx0L25ldHdvcmsvc3RhcmJvYXJkL3Byb3h5X2NvbmZpZ19zZXJ2aWNlLmNjCmluZGV4IGU1ODE4NDAuLjM0NTYzNGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9zdGFyYm9hcmQvcHJveHlfY29uZmlnX3NlcnZpY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3N0YXJib2FyZC9wcm94eV9jb25maWdfc2VydmljZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9wcm94eV9jb25maWdfc2VydmljZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvc3RhcmJvYXJkL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3Rvcnlfc3RhcmJvYXJkLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3N0YXJib2FyZC91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5X3N0YXJib2FyZC5jYwppbmRleCA5YzAwYjU4Li4xYWVhYTYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvc3RhcmJvYXJkL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3Rvcnlfc3RhcmJvYXJkLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay9zdGFyYm9hcmQvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeV9zdGFyYm9hcmQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeS5oIgogCkBAIC0zNCw2ICszMiw5IEBACiAgICAgY2FzZSBrU2JTeXN0ZW1EZXZpY2VUeXBlT3ZlclRoZVRvcEJveDoKICAgICBjYXNlIGtTYlN5c3RlbURldmljZVR5cGVTZXRUb3BCb3g6CiAgICAgY2FzZSBrU2JTeXN0ZW1EZXZpY2VUeXBlVFY6CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisgICAgY2FzZSBrU2JTeXN0ZW1EZXZpY2VUeXBlQW5kcm9pZFRWOgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KICAgICAgIHJldHVybiB0cnVlOwogICAgIGNhc2Uga1NiU3lzdGVtRGV2aWNlVHlwZURlc2t0b3BQQzoKICAgICBjYXNlIGtTYlN5c3RlbURldmljZVR5cGVVbmtub3duOgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3N3aXRjaGVzLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3N3aXRjaGVzLmNjCmluZGV4IDE1ODgzM2YuLmE3ZGYyNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay9zd2l0Y2hlcy5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvc3dpdGNoZXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvc3dpdGNoZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3N3aXRjaGVzLmggYi9zcmMvY29iYWx0L25ldHdvcmsvc3dpdGNoZXMuaAppbmRleCBlOTVhNzBkLi5mYjJkOWYwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvc3dpdGNoZXMuaAorKysgYi9zcmMvY29iYWx0L25ldHdvcmsvc3dpdGNoZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX05FVFdPUktfU1dJVENIRVNfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfU1dJVENIRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay91cmxfcmVxdWVzdF9jb250ZXh0LmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3VybF9yZXF1ZXN0X2NvbnRleHQuY2MKaW5kZXggZGJjMTdmNS4uNGI5OWI5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VybF9yZXF1ZXN0X2NvbnRleHQuY2MKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3VybF9yZXF1ZXN0X2NvbnRleHQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3VybF9yZXF1ZXN0X2NvbnRleHQuaAppbmRleCA2YmEyOGM3Li42ZjRkYzcxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dC5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay91cmxfcmVxdWVzdF9jb250ZXh0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ORVRXT1JLX1VSTF9SRVFVRVNUX0NPTlRFWFRfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfVVJMX1JFUVVFU1RfQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3VybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyLmNjCmluZGV4IGRjZTM2MmQuLmRlMTU2MzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay91cmxfcmVxdWVzdF9jb250ZXh0X2dldHRlci5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VybF9yZXF1ZXN0X2NvbnRleHRfZ2V0dGVyLmggYi9zcmMvY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaAppbmRleCA4NjZlYmRhLi41YjkyYmE3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaAorKysgYi9zcmMvY29iYWx0L25ldHdvcmsvdXJsX3JlcXVlc3RfY29udGV4dF9nZXR0ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX05FVFdPUktfVVJMX1JFUVVFU1RfQ09OVEVYVF9HRVRURVJfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfVVJMX1JFUVVFU1RfQ09OVEVYVF9HRVRURVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5LmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnkuY2MKaW5kZXggMTJmZTBlZi4uYjBjMDYzOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnkuY2MKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeS5oIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnkuaAppbmRleCA4ZDczYzNiLi5kOWUxYjZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeS5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9ORVRXT1JLX1VTRVJfQUdFTlRfU1RSSU5HX0ZBQ1RPUllfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfVVNFUl9BR0VOVF9TVFJJTkdfRkFDVE9SWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnlfdGVzdC5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5X3Rlc3QuY2MKaW5kZXggM2EyMjExNy4uNmUzYTY2OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnlfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3RvcnkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrL3dpbi9uZXR3b3JrX3N5c3RlbS5jYyBiL3NyYy9jb2JhbHQvbmV0d29yay93aW4vbmV0d29ya19zeXN0ZW0uY2MKaW5kZXggMDMxOTdkNS4uOTIxN2NlMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9uZXR3b3JrL3dpbi9uZXR3b3JrX3N5c3RlbS5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmsvd2luL25ldHdvcmtfc3lzdGVtLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9uZXR3b3JrL25ldHdvcmtfc3lzdGVtLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvbmV0d29yay93aW4vcHJveHlfY29uZmlnX3NlcnZpY2UuY2MgYi9zcmMvY29iYWx0L25ldHdvcmsvd2luL3Byb3h5X2NvbmZpZ19zZXJ2aWNlLmNjCmluZGV4IGU1ODE4NDAuLjM0NTYzNGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29yay93aW4vcHJveHlfY29uZmlnX3NlcnZpY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3dpbi9wcm94eV9jb25maWdfc2VydmljZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvbmV0d29yay9wcm94eV9jb25maWdfc2VydmljZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmsvd2luL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3Rvcnlfd2luLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrL3dpbi91c2VyX2FnZW50X3N0cmluZ19mYWN0b3J5X3dpbi5jYwppbmRleCAyNDM4MDZhLi5jOTc3NzRlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmsvd2luL3VzZXJfYWdlbnRfc3RyaW5nX2ZhY3Rvcnlfd2luLmNjCisrKyBiL3NyYy9jb2JhbHQvbmV0d29yay93aW4vdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeV93aW4uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvdXNlcl9hZ2VudF9zdHJpbmdfZmFjdG9yeS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L25ldHdvcmtfYnJpZGdlL2Nvb2tpZV9qYXIuaCBiL3NyYy9jb2JhbHQvbmV0d29ya19icmlkZ2UvY29va2llX2phci5oCmluZGV4IDEwMDVhMzIuLmZmMDUwMmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29ya19icmlkZ2UvY29va2llX2phci5oCisrKyBiL3NyYy9jb2JhbHQvbmV0d29ya19icmlkZ2UvY29va2llX2phci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfTkVUV09SS19CUklER0VfQ09PS0lFX0pBUl9IXwogI2RlZmluZSBDT0JBTFRfTkVUV09SS19CUklER0VfQ09PS0lFX0pBUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrX2JyaWRnZS9uZXRfcG9zdGVyLmNjIGIvc3JjL2NvYmFsdC9uZXR3b3JrX2JyaWRnZS9uZXRfcG9zdGVyLmNjCmluZGV4IDI4ZmM5MGQuLjdjOTgyODggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvbmV0d29ya19icmlkZ2UvbmV0X3Bvc3Rlci5jYworKysgYi9zcmMvY29iYWx0L25ldHdvcmtfYnJpZGdlL25ldF9wb3N0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L25ldHdvcmtfYnJpZGdlL25ldF9wb3N0ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9uZXR3b3JrX2JyaWRnZS9uZXRfcG9zdGVyLmggYi9zcmMvY29iYWx0L25ldHdvcmtfYnJpZGdlL25ldF9wb3N0ZXIuaAppbmRleCA0ZDU1MzM2Li5lMTEwNzZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L25ldHdvcmtfYnJpZGdlL25ldF9wb3N0ZXIuaAorKysgYi9zcmMvY29iYWx0L25ldHdvcmtfYnJpZGdlL25ldF9wb3N0ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX05FVFdPUktfQlJJREdFX05FVF9QT1NURVJfSF8KICNkZWZpbmUgQ09CQUxUX05FVFdPUktfQlJJREdFX05FVF9QT1NURVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYW5pbWF0aW9ucy9hbmltYXRlX25vZGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2FuaW1hdGlvbnMvYW5pbWF0ZV9ub2RlLmNjCmluZGV4IDhjZGRkODYuLmYxMmRhYmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYW5pbWF0aW9ucy9hbmltYXRlX25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9hbmltYXRpb25zL2FuaW1hdGVfbm9kZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvYW5pbWF0aW9ucy9hbmltYXRlX25vZGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9hbmltYXRpb25zL2FuaW1hdGVfbm9kZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9hbmltYXRpb25zL2FuaW1hdGVfbm9kZS5oCmluZGV4IGQwYjgxYzguLjcwZWQ5YmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYW5pbWF0aW9ucy9hbmltYXRlX25vZGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2FuaW1hdGlvbnMvYW5pbWF0ZV9ub2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9BTklNQVRJT05TX0FOSU1BVEVfTk9ERV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfQU5JTUFUSU9OU19BTklNQVRFX05PREVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYW5pbWF0aW9ucy9hbmltYXRlX25vZGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYW5pbWF0aW9ucy9hbmltYXRlX25vZGVfdGVzdC5jYwppbmRleCAwMzIxYmQ4Li43ZjUzOWI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2FuaW1hdGlvbnMvYW5pbWF0ZV9ub2RlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9hbmltYXRpb25zL2FuaW1hdGVfbm9kZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPHN0cmluZz4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9hbmltYXRpb25zL2FuaW1hdGlvbl9saXN0LmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2FuaW1hdGlvbnMvYW5pbWF0aW9uX2xpc3QuaAppbmRleCA4OWMxMmZkLi43OGYxZTY1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2FuaW1hdGlvbnMvYW5pbWF0aW9uX2xpc3QuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2FuaW1hdGlvbnMvYW5pbWF0aW9uX2xpc3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX0FOSU1BVElPTlNfQU5JTUFUSU9OX0xJU1RfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX0FOSU1BVElPTlNfQU5JTUFUSU9OX0xJU1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYmx1cl9maWx0ZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYmx1cl9maWx0ZXIuaAppbmRleCAxOTM0ZjI0Li41ZjZmYmU3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2JsdXJfZmlsdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9ibHVyX2ZpbHRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfQkxVUl9GSUxURVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX0JMVVJfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2JvcmRlci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYm9yZGVyLmNjCmluZGV4IDdkMDk0Y2IuLjhhNDRlNDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYm9yZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYm9yZGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9ib3JkZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9ib3JkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYm9yZGVyLmgKaW5kZXggYzJkY2JjNC4uNzYxYzk5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9ib3JkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2JvcmRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfQk9SREVSX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9CT1JERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2guY2MgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2JydXNoLmNjCmluZGV4IDU1MTcxMGQuLjhiYTY2OTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2guY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9icnVzaC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2guaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9icnVzaC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9icnVzaC5oCmluZGV4IDcyYWM2NWEuLmZiYTgwNjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2guaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2JydXNoLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9CUlVTSF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfQlJVU0hfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2hfdmlzaXRvci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9icnVzaF92aXNpdG9yLmgKaW5kZXggMzlkZjI4Zi4uZWViY2EwYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9icnVzaF92aXNpdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9icnVzaF92aXNpdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9CUlVTSF9WSVNJVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9CUlVTSF9WSVNJVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2JydXNoX3Zpc2l0b3JfdGVzdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2hfdmlzaXRvcl90ZXN0LmNjCmluZGV4IDBlODg5YzMuLjAwYzE4NjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2hfdmlzaXRvcl90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvYnJ1c2hfdmlzaXRvcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9icnVzaF92aXNpdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY2hpbGRfaXRlcmF0b3IuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY2hpbGRfaXRlcmF0b3IuaAppbmRleCBkNTU2N2M1Li4zM2Y3YzE5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NoaWxkX2l0ZXJhdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9jaGlsZF9pdGVyYXRvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfQ0hJTERfSVRFUkFUT1JfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX0NISUxEX0lURVJBVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NvbG9yX3JnYmEuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY29sb3JfcmdiYS5oCmluZGV4IGI1Y2FiODYuLmVlNWFhNDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY29sb3JfcmdiYS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY29sb3JfcmdiYS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfQ09MT1JfUkdCQV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfQ09MT1JfUkdCQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9jb2xvcl9yZ2JhX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NvbG9yX3JnYmFfdGVzdC5jYwppbmRleCA4MDEyNWI3Li42NGRiMWVkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NvbG9yX3JnYmFfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NvbG9yX3JnYmFfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvY29sb3JfcmdiYS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NvbXBvc2l0aW9uX25vZGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NvbXBvc2l0aW9uX25vZGUuY2MKaW5kZXggNjA1Zjc0My4uMjY4YTZjYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9jb21wb3NpdGlvbl9ub2RlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY29tcG9zaXRpb25fbm9kZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvY29tcG9zaXRpb25fbm9kZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2NvbXBvc2l0aW9uX25vZGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY29tcG9zaXRpb25fbm9kZS5oCmluZGV4IGNmNTI2MTkuLjI2MTQ4MjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY29tcG9zaXRpb25fbm9kZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvY29tcG9zaXRpb25fbm9kZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfQ09NUE9TSVRJT05fTk9ERV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfQ09NUE9TSVRJT05fTk9ERV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9kdW1wX3JlbmRlcl90cmVlX3RvX3N0cmluZy5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZHVtcF9yZW5kZXJfdHJlZV90b19zdHJpbmcuY2MKaW5kZXggYTllMmFhYy4uNDg0NDU1NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9kdW1wX3JlbmRlcl90cmVlX3RvX3N0cmluZy5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2R1bXBfcmVuZGVyX3RyZWVfdG9fc3RyaW5nLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9kdW1wX3JlbmRlcl90cmVlX3RvX3N0cmluZy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2R1bXBfcmVuZGVyX3RyZWVfdG9fc3RyaW5nLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2R1bXBfcmVuZGVyX3RyZWVfdG9fc3RyaW5nLmgKaW5kZXggOTZkZWQ5OS4uNDIxMzJmZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9kdW1wX3JlbmRlcl90cmVlX3RvX3N0cmluZy5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZHVtcF9yZW5kZXJfdHJlZV90b19zdHJpbmcuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX0RVTVBfUkVOREVSX1RSRUVfVE9fU1RSSU5HX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9EVU1QX1JFTkRFUl9UUkVFX1RPX1NUUklOR19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9maWx0ZXJfbm9kZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZmlsdGVyX25vZGUuY2MKaW5kZXggYmNhMjU0ZS4uMjVmODM3ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9maWx0ZXJfbm9kZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ZpbHRlcl9ub2RlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9maWx0ZXJfbm9kZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9ub2RlX3Zpc2l0b3IuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZmlsdGVyX25vZGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZmlsdGVyX25vZGUuaAppbmRleCBmNWIzYjJkLi41YmE4YWM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ZpbHRlcl9ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9maWx0ZXJfbm9kZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfRklMVEVSX05PREVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX0ZJTFRFUl9OT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ZvbnQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZm9udC5oCmluZGV4IDc5YTRlNDMuLjc0N2NiY2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZm9udC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZm9udC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfRk9OVF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfRk9OVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9mb250X3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ZvbnRfcHJvdmlkZXIuaAppbmRleCBjNWEzMzgwLi45ZGY1YTljIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ZvbnRfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ZvbnRfcHJvdmlkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX0ZPTlRfUFJPVklERVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX0ZPTlRfUFJPVklERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZ2x5cGguaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZ2x5cGguaAppbmRleCAyNjE1Mjg4Li4zNmY2NmQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2dseXBoLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9nbHlwaC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfR0xZUEhfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX0dMWVBIX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2dseXBoX2J1ZmZlci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9nbHlwaF9idWZmZXIuaAppbmRleCBlMjAxYjVjLi40YTJlM2UyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2dseXBoX2J1ZmZlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvZ2x5cGhfYnVmZmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9HTFlQSF9CVUZGRVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX0dMWVBIX0JVRkZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZS5oCmluZGV4IGVlNThhZGEuLjZiZGExZjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvaW1hZ2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ltYWdlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9JTUFHRV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfSU1BR0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvaW1hZ2Vfbm9kZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvaW1hZ2Vfbm9kZS5jYwppbmRleCBlYjU1YjU3Li5jYjBkMTc4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL2ltYWdlX25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZV9ub2RlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZV9ub2RlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvaW1hZ2Vfbm9kZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZV9ub2RlLmgKaW5kZXggOGQ3NjM3Mi4uY2NkNDc3MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZV9ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9pbWFnZV9ub2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9JTUFHRV9OT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9JTUFHRV9OT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21hcF90b19tZXNoX2ZpbHRlci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9tYXBfdG9fbWVzaF9maWx0ZXIuaAppbmRleCAyOTQ0OGQ1Li5hZGQxZGNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21hcF90b19tZXNoX2ZpbHRlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbWFwX3RvX21lc2hfZmlsdGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9NQVBfVE9fTUVTSF9GSUxURVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX01BUF9UT19NRVNIX0ZJTFRFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9tYXRyaXhfdHJhbnNmb3JtX25vZGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21hdHJpeF90cmFuc2Zvcm1fbm9kZS5jYwppbmRleCBjYzk1ZWVjLi45MDM0MWFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21hdHJpeF90cmFuc2Zvcm1fbm9kZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21hdHJpeF90cmFuc2Zvcm1fbm9kZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvbWF0cml4X3RyYW5zZm9ybV9ub2RlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbWF0cml4X3RyYW5zZm9ybV9ub2RlLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21hdHJpeF90cmFuc2Zvcm1fbm9kZS5oCmluZGV4IDkxMzgxNDYuLjNiYWFmY2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbWF0cml4X3RyYW5zZm9ybV9ub2RlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9tYXRyaXhfdHJhbnNmb3JtX25vZGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX01BVFJJWF9UUkFOU0ZPUk1fTk9ERV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfTUFUUklYX1RSQU5TRk9STV9OT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21lc2guaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbWVzaC5oCmluZGV4IDI1YzFkZWYuLmM5ZTdhNzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbWVzaC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbWVzaC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfTUVTSF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfTUVTSF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9tb2NrX3Jlc291cmNlX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21vY2tfcmVzb3VyY2VfcHJvdmlkZXIuaAppbmRleCBmNTFjYmEzLi5lY2M4YzgxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21vY2tfcmVzb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL21vY2tfcmVzb3VyY2VfcHJvdmlkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX01PQ0tfUkVTT1VSQ0VfUFJPVklERVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX01PQ0tfUkVTT1VSQ0VfUFJPVklERVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbW92YWJsZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9tb3ZhYmxlLmgKaW5kZXggN2YxNjEzZi4uNDk2OWYyMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9tb3ZhYmxlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9tb3ZhYmxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9NT1ZBQkxFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9NT1ZBQkxFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL25vZGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbm9kZS5oCmluZGV4IGZmZmM1MDMuLmJiNjgzY2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbm9kZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbm9kZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfTk9ERV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfTk9ERV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9ub2RlX3Zpc2l0b3IuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbm9kZV92aXNpdG9yLmgKaW5kZXggZGU2YzAyNi4uOWJhYWE3NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9ub2RlX3Zpc2l0b3IuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL25vZGVfdmlzaXRvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfTk9ERV9WSVNJVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9OT0RFX1ZJU0lUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbm9kZV92aXNpdG9yX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL25vZGVfdmlzaXRvcl90ZXN0LmNjCmluZGV4IGY1ZDRhNjIuLjYxNmJjNjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvbm9kZV92aXNpdG9yX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9ub2RlX3Zpc2l0b3JfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvbm9kZV92aXNpdG9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvb3BhY2l0eV9maWx0ZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvb3BhY2l0eV9maWx0ZXIuaAppbmRleCA1Njg0YjFiLi45M2U4NzE4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL29wYWNpdHlfZmlsdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9vcGFjaXR5X2ZpbHRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfT1BBQ0lUWV9GSUxURVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX09QQUNJVFlfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3B1bmNoX3Rocm91Z2hfdmlkZW9fbm9kZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcHVuY2hfdGhyb3VnaF92aWRlb19ub2RlLmNjCmluZGV4IDY3NjkwNzguLjRmYmMzMDAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcHVuY2hfdGhyb3VnaF92aWRlb19ub2RlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcHVuY2hfdGhyb3VnaF92aWRlb19ub2RlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9wdW5jaF90aHJvdWdoX3ZpZGVvX25vZGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9wdW5jaF90aHJvdWdoX3ZpZGVvX25vZGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcHVuY2hfdGhyb3VnaF92aWRlb19ub2RlLmgKaW5kZXggMjJkZDBmOS4uMzY4M2Q2YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9wdW5jaF90aHJvdWdoX3ZpZGVvX25vZGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3B1bmNoX3Rocm91Z2hfdmlkZW9fbm9kZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfUFVOQ0hfVEhST1VHSF9WSURFT19OT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9QVU5DSF9USFJPVUdIX1ZJREVPX05PREVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVjdF9ub2RlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X25vZGUuY2MKaW5kZXggYzE1NWFmNC4uN2I2ZjY1NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X25vZGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfbm9kZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfbm9kZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X25vZGUuaAppbmRleCA0NWE1NDViLi5kODk2YWVmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfbm9kZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVjdF9ub2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9SRUNUX05PREVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX1JFQ1RfTk9ERV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X3NoYWRvd19ub2RlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X3NoYWRvd19ub2RlLmNjCmluZGV4IGE4YmRmY2MuLjNlNjAyYTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVjdF9zaGFkb3dfbm9kZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfc2hhZG93X25vZGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfc2hhZG93X25vZGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X3NoYWRvd19ub2RlLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfc2hhZG93X25vZGUuaAppbmRleCA2YmRkYTA0Li4yMjM0NGFkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfc2hhZG93X25vZGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JlY3Rfc2hhZG93X25vZGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX1JFQ1RfU0hBRE9XX05PREVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX1JFQ1RfU0hBRE9XX05PREVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVuZGVyX3RyZWUuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZW5kZXJfdHJlZS5neXAKaW5kZXggZDhkZmE1ZS4uNjE3NGYzNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZW5kZXJfdHJlZS5neXAKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZW5kZXJfdHJlZS5neXAKQEAgLTk2LDcgKzk2LDcgQEAKICAgICAgICAgJ25vZGVfdmlzaXRvcl90ZXN0LmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdhbmltYXRpb25zJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXIuaAppbmRleCA0NTkwMTIxLi4xN2ZhMTdmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfUkVTT1VSQ0VfUFJPVklERVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX1JFU09VUkNFX1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyX3N0dWIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oCmluZGV4IGQ0MDc4N2YuLjMyMDM3NWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcmVzb3VyY2VfcHJvdmlkZXJfc3R1Yi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfUkVTT1VSQ0VfUFJPVklERVJfU1RVQl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfUkVTT1VSQ0VfUFJPVklERVJfU1RVQl9IXwpAQCAtMTg3LDIwICsxODUsMjIgQEAKICAgICByZXR1cm4gbWFrZV9zY29wZWRfcmVmcHRyKG5ldyBJbWFnZVN0dWIoc2tpYV9zb3VyY2VfZGF0YS5QYXNzKCkpKTsKICAgfQogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaWYgU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCiAgIHNjb3BlZF9yZWZwdHI8SW1hZ2U+IENyZWF0ZUltYWdlRnJvbVNiRGVjb2RlVGFyZ2V0KAogICAgICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgT1ZFUlJJREUgewogICAgIE5PVFJFQUNIRUQoKTsKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICAgIFNiRGVjb2RlVGFyZ2V0RGVzdHJveShkZWNvZGVfdGFyZ2V0KTsKKyNlbHNlICAgLy8gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKGRlY29kZV90YXJnZXQpOworI2VuZGlmICAvLyBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICAgICByZXR1cm4gTlVMTDsKICAgfQogCiAgIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIEdldFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIoKSBPVkVSUklERSB7IHJldHVybiBOVUxMOyB9CiAKICAgYm9vbCBTdXBwb3J0c1NiRGVjb2RlVGFyZ2V0KCkgT1ZFUlJJREUgeyByZXR1cm4gZmFsc2U7IH0KLSNlbmRpZiAgLy8gU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCi0jZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzICYmIFNCX0hBUyhHUkFQSElDUykKIAogICBzY29wZWRfcHRyPFJhd0ltYWdlTWVtb3J5PiBBbGxvY2F0ZVJhd0ltYWdlTWVtb3J5KHNpemVfdCBzaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBhbGlnbm1lbnQpIE9WRVJSSURFIHsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcm91bmRlZF9jb3JuZXJzLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3JvdW5kZWRfY29ybmVycy5oCmluZGV4IGUxN2ZlMTQuLmNiNjMwZTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvcm91bmRlZF9jb3JuZXJzLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9yb3VuZGVkX2Nvcm5lcnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX1JPVU5ERURfQ09STkVSU19IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfUk9VTkRFRF9DT1JORVJTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3NoYWRvdy5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS9zaGFkb3cuaAppbmRleCA5MzI2M2NjLi5jYWVmYjhhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3NoYWRvdy5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvc2hhZG93LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9TSEFET1dfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX1NIQURPV19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90ZXN0aW5nL21vY2tfaW1hZ2UuaCBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvdGVzdGluZy9tb2NrX2ltYWdlLmgKaW5kZXggMTNjNTgzZC4uMDAwZGIwZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90ZXN0aW5nL21vY2tfaW1hZ2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3Rlc3RpbmcvbW9ja19pbWFnZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSX1RSRUVfVEVTVElOR19NT0NLX0lNQUdFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJfVFJFRV9URVNUSU5HX01PQ0tfSU1BR0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvdGV4dF9ub2RlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90ZXh0X25vZGUuY2MKaW5kZXggMmVjYmRmOS4uMTczMzYxMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90ZXh0X25vZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90ZXh0X25vZGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3RleHRfbm9kZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3RleHRfbm9kZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90ZXh0X25vZGUuaAppbmRleCBmZTc3YjBlLi4yZGRlMzMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3RleHRfbm9kZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvdGV4dF9ub2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9URVhUX05PREVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUl9UUkVFX1RFWFRfTk9ERV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90eXBlZmFjZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS90eXBlZmFjZS5oCmluZGV4IDQzYjFmZDMuLjc0NjVlMDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvdHlwZWZhY2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3R5cGVmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJfVFJFRV9UWVBFRkFDRV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfVFlQRUZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvdmlld3BvcnRfZmlsdGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcl90cmVlL3ZpZXdwb3J0X2ZpbHRlci5oCmluZGV4IGRhYzYyZjMuLjkyZjNkNTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyX3RyZWUvdmlld3BvcnRfZmlsdGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJfdHJlZS92aWV3cG9ydF9maWx0ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUl9UUkVFX1ZJRVdQT1JUX0ZJTFRFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSX1RSRUVfVklFV1BPUlRfRklMVEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2FuaW1hdGlvbnNfdGVzdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYW5pbWF0aW9uc190ZXN0LmNjCmluZGV4IDc2NmM0N2QuLmFhYzhlZjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYW5pbWF0aW9uc190ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYW5pbWF0aW9uc190ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0gIC8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9zeW5jaHJvbml6YXRpb24vd2FpdGFibGVfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL3RocmVhZGluZy9zaW1wbGVfdGhyZWFkLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9kaXNwbGF5LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvZGlzcGxheS5jYwppbmRleCA0Y2I3OWFmLi42MTk5ZWM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9kaXNwbGF5LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2Rpc3BsYXkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9kaXNwbGF5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2Rpc3BsYXkuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2Rpc3BsYXkuaAppbmRleCA2ODE0ZGQ3Li4yYTI1OWNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9kaXNwbGF5LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvZGlzcGxheS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9CTElUVEVSX0RJU1BMQVlfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfQkxJVFRFUl9ESVNQTEFZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19jb250ZXh0LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvZ3JhcGhpY3NfY29udGV4dC5jYwppbmRleCAzZTk2MTNmLi5jZTg2ZjVkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19jb250ZXh0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX2NvbnRleHQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19jb250ZXh0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX2NvbnRleHQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX2NvbnRleHQuaAppbmRleCA1ZmMzMzMwLi5mY2EyMGRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19jb250ZXh0LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvZ3JhcGhpY3NfY29udGV4dC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9CTElUVEVSX0dSQVBISUNTX0NPTlRFWFRfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfQkxJVFRFUl9HUkFQSElDU19DT05URVhUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19zeXN0ZW0uY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19zeXN0ZW0uY2MKaW5kZXggY2E1YjdmOS4uNDRjZWIwNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvZ3JhcGhpY3Nfc3lzdGVtLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX3N5c3RlbS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX3N5c3RlbS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9ncmFwaGljc19zeXN0ZW0uaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX3N5c3RlbS5oCmluZGV4IDVkODMwZjIuLjU1ZTU1YzUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX3N5c3RlbS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL2dyYXBoaWNzX3N5c3RlbS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9CTElUVEVSX0dSQVBISUNTX1NZU1RFTV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9CTElUVEVSX0dSQVBISUNTX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvcmVuZGVyX3RhcmdldC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvcmVuZGVyX3RhcmdldC5oCmluZGV4IDA3ZTg1Y2MuLmVhMWMwNzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL3JlbmRlcl90YXJnZXQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9yZW5kZXJfdGFyZ2V0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0JMSVRURVJfUkVOREVSX1RBUkdFVF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9CTElUVEVSX1JFTkRFUl9UQVJHRVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL3N1cmZhY2VfcmVuZGVyX3RhcmdldC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL3N1cmZhY2VfcmVuZGVyX3RhcmdldC5jYwppbmRleCA5ZDhmODE3Li4xOTI1NWQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvYmxpdHRlci9zdXJmYWNlX3JlbmRlcl90YXJnZXQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvc3VyZmFjZV9yZW5kZXJfdGFyZ2V0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvc3VyZmFjZV9yZW5kZXJfdGFyZ2V0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ibGl0dGVyL3N1cmZhY2VfcmVuZGVyX3RhcmdldC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvc3VyZmFjZV9yZW5kZXJfdGFyZ2V0LmgKaW5kZXggYTg1OTgxMi4uYjgyMzdhMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvc3VyZmFjZV9yZW5kZXJfdGFyZ2V0LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2JsaXR0ZXIvc3VyZmFjZV9yZW5kZXJfdGFyZ2V0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0JMSVRURVJfU1VSRkFDRV9SRU5ERVJfVEFSR0VUX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0JMSVRURVJfU1VSRkFDRV9SRU5ERVJfVEFSR0VUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW0uaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9kZWZhdWx0X2dyYXBoaWNzX3N5c3RlbS5oCmluZGV4IDFiNDMzMDYuLjllMWU3ZmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9kZWZhdWx0X2dyYXBoaWNzX3N5c3RlbS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9kZWZhdWx0X2dyYXBoaWNzX3N5c3RlbS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9ERUZBVUxUX0dSQVBISUNTX1NZU1RFTV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9ERUZBVUxUX0dSQVBISUNTX1NZU1RFTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2Rpc3BsYXkuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9kaXNwbGF5LmgKaW5kZXggOTU2NWYwOS4uOGU2NjI3ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2Rpc3BsYXkuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZGlzcGxheS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9ESVNQTEFZX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0RJU1BMQVlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9kaXNwbGF5X3N0dWIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9kaXNwbGF5X3N0dWIuaAppbmRleCBkYzllM2RhLi40Njc1ZjNhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZGlzcGxheV9zdHViLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2Rpc3BsYXlfc3R1Yi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9ESVNQTEFZX1NUVUJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfRElTUExBWV9TVFVCX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2Rpc3BsYXkuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2Rpc3BsYXkuY2MKaW5kZXggYzI5NDE2OC4uNDExMWY3MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9kaXNwbGF5LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZGlzcGxheS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZGlzcGxheS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2Rpc3BsYXkuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZGlzcGxheS5oCmluZGV4IGNlNmE2NDEuLmFmMWI4NjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZGlzcGxheS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZGlzcGxheS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfRElTUExBWV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfRElTUExBWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9lZ2xfYmFja2VuZC5neXBpIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9lZ2xfYmFja2VuZC5neXBpCmluZGV4IDRhNTE3YTkuLjNjYjdkMTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZWdsX2JhY2tlbmQuZ3lwaQorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2VnbF9iYWNrZW5kLmd5cGkKQEAgLTE2LDYgKzE2LDggQEAKICAgJ3NvdXJjZXMnOiBbCiAgICAgJ2Rpc3BsYXkuY2MnLAogICAgICdkaXNwbGF5LmgnLAorICAgICdmcmFtZWJ1ZmZlci5oJywKKyAgICAnZnJhbWVidWZmZXIuY2MnLAogICAgICdncmFwaGljc19jb250ZXh0LmNjJywKICAgICAnZ3JhcGhpY3NfY29udGV4dC5oJywKICAgICAnZ3JhcGhpY3Nfc3lzdGVtLmNjJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZnJhbWVidWZmZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2ZyYW1lYnVmZmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE2Y2UyMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2ZyYW1lYnVmZmVyLmNjCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZnJhbWVidWZmZXIuaCIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgYmFja2VuZCB7CisKK0ZyYW1lYnVmZmVyRUdMOjpGcmFtZWJ1ZmZlckVHTChHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwgR0xlbnVtIGNvbG9yX2Zvcm1hdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHTGVudW0gZGVwdGhfZm9ybWF0KQorICAgIDogZ3JhcGhpY3NfY29udGV4dF8oZ3JhcGhpY3NfY29udGV4dCksCisgICAgICBzaXplXyhzaXplKSB7CisgIEdyYXBoaWNzQ29udGV4dEVHTDo6U2NvcGVkTWFrZUN1cnJlbnQgc2NvcGVkX21ha2VfY3VycmVudChncmFwaGljc19jb250ZXh0Xyk7CisKKyAgLy8gQ3JlYXRlIHRoZSBmcmFtZWJ1ZmZlciBvYmplY3QuCisgIEdMX0NBTEwoZ2xHZW5GcmFtZWJ1ZmZlcnMoMSwgJmZyYW1lYnVmZmVyX2hhbmRsZV8pKTsKKyAgR0xfQ0FMTChnbEJpbmRGcmFtZWJ1ZmZlcihHTF9GUkFNRUJVRkZFUiwgZnJhbWVidWZmZXJfaGFuZGxlXykpOworCisgIC8vIENyZWF0ZSBhbmQgYXR0YWNoIGEgdGV4dHVyZSBmb3IgY29sb3IuCisgIEdMdWludCBjb2xvcl9oYW5kbGUgPSAwOworICBHTF9DQUxMKGdsR2VuVGV4dHVyZXMoMSwgJmNvbG9yX2hhbmRsZSkpOworICBHTF9DQUxMKGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgY29sb3JfaGFuZGxlKSk7CisgIEdMX0NBTEwoZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIGNvbG9yX2Zvcm1hdCwKKyAgICAgIHNpemVfLndpZHRoKCksIHNpemVfLmhlaWdodCgpLCAwLCBjb2xvcl9mb3JtYXQsIEdMX1VOU0lHTkVEX0JZVEUsIDApKTsKKyAgR0xfQ0FMTChnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NSU5fRklMVEVSLCBHTF9MSU5FQVIpKTsKKyAgR0xfQ0FMTChnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9NQUdfRklMVEVSLCBHTF9MSU5FQVIpKTsKKyAgR0xfQ0FMTChnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1MsIEdMX0NMQU1QX1RPX0VER0UpKTsKKyAgR0xfQ0FMTChnbFRleFBhcmFtZXRlcmYoR0xfVEVYVFVSRV8yRCwgR0xfVEVYVFVSRV9XUkFQX1QsIEdMX0NMQU1QX1RPX0VER0UpKTsKKyAgR0xfQ0FMTChnbEZyYW1lYnVmZmVyVGV4dHVyZTJEKEdMX0ZSQU1FQlVGRkVSLCBHTF9DT0xPUl9BVFRBQ0hNRU5UMCwKKyAgICAgIEdMX1RFWFRVUkVfMkQsIGNvbG9yX2hhbmRsZSwgMCkpOworICBHTF9DQUxMKGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCkpOworICBjb2xvcl90ZXh0dXJlXy5yZXNldChuZXcgVGV4dHVyZUVHTChncmFwaGljc19jb250ZXh0XywgY29sb3JfaGFuZGxlLCBzaXplXywKKyAgICAgIGNvbG9yX2Zvcm1hdCwgR0xfVEVYVFVSRV8yRCwgYmFzZTo6Q2xvc3VyZSgpKSk7CisKKyAgLy8gQ3JlYXRlIGFuZCBhdHRhY2ggYSBkZXB0aCBidWZmZXIgaWYgcmVxdWVzdGVkLgorICBkZXB0aGJ1ZmZlcl9oYW5kbGVfID0gMDsKKyAgaWYgKGRlcHRoX2Zvcm1hdCAhPSBHTF9OT05FKSB7CisgICAgR0xfQ0FMTChnbEdlblJlbmRlcmJ1ZmZlcnMoMSwgJmRlcHRoYnVmZmVyX2hhbmRsZV8pKTsKKyAgICBHTF9DQUxMKGdsQmluZFJlbmRlcmJ1ZmZlcihHTF9SRU5ERVJCVUZGRVIsIGRlcHRoYnVmZmVyX2hhbmRsZV8pKTsKKyAgICBHTF9DQUxMKGdsUmVuZGVyYnVmZmVyU3RvcmFnZShHTF9SRU5ERVJCVUZGRVIsIGRlcHRoX2Zvcm1hdCwgc2l6ZV8ud2lkdGgoKSwKKyAgICAgICAgc2l6ZV8uaGVpZ2h0KCkpKTsKKyAgICBHTF9DQUxMKGdsRnJhbWVidWZmZXJSZW5kZXJidWZmZXIoR0xfRlJBTUVCVUZGRVIsIEdMX0RFUFRIX0FUVEFDSE1FTlQsCisgICAgICAgIEdMX1JFTkRFUkJVRkZFUiwgZGVwdGhidWZmZXJfaGFuZGxlXykpOworICAgIEdMX0NBTEwoZ2xCaW5kUmVuZGVyYnVmZmVyKEdMX1JFTkRFUkJVRkZFUiwgMCkpOworICB9CisKKyAgLy8gVmVyaWZ5IHRoZSBmcmFtZWJ1ZmZlciBvYmplY3QgaXMgdmFsaWQuCisgIERDSEVDS19FUShnbENoZWNrRnJhbWVidWZmZXJTdGF0dXMoR0xfRlJBTUVCVUZGRVIpLCBHTF9GUkFNRUJVRkZFUl9DT01QTEVURSk7CisgIEdMX0NBTEwoZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApKTsKK30KKworRnJhbWVidWZmZXJFR0w6On5GcmFtZWJ1ZmZlckVHTCgpIHsKKyAgR3JhcGhpY3NDb250ZXh0RUdMOjpTY29wZWRNYWtlQ3VycmVudCBzY29wZWRfbWFrZV9jdXJyZW50KGdyYXBoaWNzX2NvbnRleHRfKTsKKyAgR0xfQ0FMTChnbERlbGV0ZUZyYW1lYnVmZmVycygxLCAmZnJhbWVidWZmZXJfaGFuZGxlXykpOworICBpZiAoZGVwdGhidWZmZXJfaGFuZGxlXyAhPSAwKSB7CisgICAgR0xfQ0FMTChnbERlbGV0ZVJlbmRlcmJ1ZmZlcnMoMSwgJmRlcHRoYnVmZmVyX2hhbmRsZV8pKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UgYmFja2VuZAorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2ZyYW1lYnVmZmVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2ZyYW1lYnVmZmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDBmNjgzOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZnJhbWVidWZmZXIuaApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9GUkFNRUJVRkZFUl9IXworI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfRlJBTUVCVUZGRVJfSF8KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImNvYmFsdC9tYXRoL3NpemUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworbmFtZXNwYWNlIGJhY2tlbmQgeworCitjbGFzcyBHcmFwaGljc0NvbnRleHRFR0w7CitjbGFzcyBUZXh0dXJlRUdMOworCisvLyBGcmFtZWJ1ZmZlciBvYmplY3QgdGhhdCBjYW4gYmUgcmVuZGVyZWQgdG8gb3IgdXNlZCBhcyBhIHNvdXJjZSB0ZXh0dXJlLgorY2xhc3MgRnJhbWVidWZmZXJFR0wgeworIHB1YmxpYzoKKyAgLy8gQ3JlYXRlIGEgZnJhbWVidWZmZXIgb2JqZWN0IHdpdGggdGhlIGdpdmVuIHxjb2xvcl9mb3JtYXR8IGFuZAorICAvLyB8ZGVwdGhfZm9ybWF0fC4gSWYgfGRlcHRoX2Zvcm1hdHwgaXMgR0xfTk9ORSwgdGhlbiBubyBkZXB0aCBidWZmZXIKKyAgLy8gd2lsbCBiZSB1c2VkLgorICBGcmFtZWJ1ZmZlckVHTChHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHQsIGNvbnN0IG1hdGg6OlNpemUmIHNpemUsCisgICAgICAgICAgICAgICAgIEdMZW51bSBjb2xvcl9mb3JtYXQsIEdMZW51bSBkZXB0aF9mb3JtYXQpOworICB+RnJhbWVidWZmZXJFR0woKTsKKworICBjb25zdCBtYXRoOjpTaXplJiBHZXRTaXplKCkgY29uc3QgeyByZXR1cm4gc2l6ZV87IH0KKworICAvLyBSZXR1cm4gdGhlIGNvbG9yIGF0dGFjaG1lbnQgZm9yIHRoZSBmcmFtZWJ1ZmZlciBhcyBhIHRleHR1cmUuCisgIFRleHR1cmVFR0wqIEdldENvbG9yVGV4dHVyZSgpIGNvbnN0IHsgcmV0dXJuIGNvbG9yX3RleHR1cmVfLmdldCgpOyB9CisKKyAgLy8gUmV0dXJuIHRoZSBmcmFtZWJ1ZmZlciBvYmplY3QncyBJRC4KKyAgR0x1aW50IGdsX2hhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGZyYW1lYnVmZmVyX2hhbmRsZV87IH0KKworIHByaXZhdGU6CisgIEdyYXBoaWNzQ29udGV4dEVHTCogZ3JhcGhpY3NfY29udGV4dF87CisgIG1hdGg6OlNpemUgc2l6ZV87CisKKyAgLy8gVGhlIGhhbmRsZSB0byB0aGUgZnJhbWVidWZmZXIgdGhhdCBjYW4gYmUgcGFzc2VkIGludG8gT3BlbkdMIGZ1bmN0aW9ucy4KKyAgR0x1aW50IGZyYW1lYnVmZmVyX2hhbmRsZV87CisKKyAgLy8gVGhlIGhhbmRsZSBmb3IgdGhlIGRlcHRoIGJ1ZmZlci4gT25seSB1c2VkIGludGVybmFsbHkuCisgIEdMdWludCBkZXB0aGJ1ZmZlcl9oYW5kbGVfOworCisgIC8vIFRoZSBjb2xvciBjb21wb25lbnQgb2YgdGhlIGZyYW1lYnVmZmVyIG9iamVjdCBhcyBhIHRleHR1cmUuCisgIHNjb3BlZF9wdHI8VGV4dHVyZUVHTD4gY29sb3JfdGV4dHVyZV87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgYmFja2VuZAorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfRUdMX0ZSQU1FQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuY2MKaW5kZXggYzNhYjZjZC4uMWIwNmFkOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KICNpbmNsdWRlIDxhbGdvcml0aG0+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oCmluZGV4IDczN2ExNTYuLjQ4N2IzM2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfR1JBUEhJQ1NfQ09OVEVYVF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfR1JBUEhJQ1NfQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19zeXN0ZW0uY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX3N5c3RlbS5jYwppbmRleCA3YTczYzljLi4wYzM1N2Y1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX3N5c3RlbS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX3N5c3RlbS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3Nfc3lzdGVtLmgiCiAKQEAgLTgxLDYgKzc5LDEwIEBACiAjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX1JFTkRFUkFCTEVfVFlQRSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX09QRU5HTF9FUzJfQklULAorI2lmIGRlZmluZWQoQ09CQUxUX0ZPUkNFX0NVU1RPTV9SQVNURVJJWkVSKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xfREVQVEhfU0laRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTYsCisjZW5kaWYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX05PTkV9OwogCiAgIC8vIFRyeSB0byBhbGxvdyBwcmVzZXJ2YXRpb24gb2YgdGhlIGZyYW1lIGNvbnRlbnRzIGJldHdlZW4gc3dhcCBjYWxscyAtLQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19zeXN0ZW0uaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3Nfc3lzdGVtLmgKaW5kZXggNjMwNjE2ZC4uODhjZjhhMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19zeXN0ZW0uaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX3N5c3RlbS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfR1JBUEhJQ1NfU1lTVEVNX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9HUkFQSElDU19TWVNURU1fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcGJ1ZmZlcl9yZW5kZXJfdGFyZ2V0LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9wYnVmZmVyX3JlbmRlcl90YXJnZXQuY2MKaW5kZXggMDYzNGM4Mi4uNmU4YTdlMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9wYnVmZmVyX3JlbmRlcl90YXJnZXQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9wYnVmZmVyX3JlbmRlcl90YXJnZXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3BidWZmZXJfcmVuZGVyX3RhcmdldC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3BidWZmZXJfcmVuZGVyX3RhcmdldC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9wYnVmZmVyX3JlbmRlcl90YXJnZXQuaAppbmRleCAzNGI2YmM1Li42Njc1MGYzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3BidWZmZXJfcmVuZGVyX3RhcmdldC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcGJ1ZmZlcl9yZW5kZXJfdGFyZ2V0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9QQlVGRkVSX1JFTkRFUl9UQVJHRVRfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfRUdMX1BCVUZGRVJfUkVOREVSX1RBUkdFVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZW5kZXJfdGFyZ2V0LmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3JlbmRlcl90YXJnZXQuaAppbmRleCAxNGMwOWYwLi4wNGU2MjdiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3JlbmRlcl90YXJnZXQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3JlbmRlcl90YXJnZXQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfRUdMX1JFTkRFUl9UQVJHRVRfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfRUdMX1JFTkRFUl9UQVJHRVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcmVzb3VyY2VfY29udGV4dC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcmVzb3VyY2VfY29udGV4dC5jYwppbmRleCA1OTlhZjRlLi40OTk3OGVmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3Jlc291cmNlX2NvbnRleHQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZXNvdXJjZV9jb250ZXh0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZXNvdXJjZV9jb250ZXh0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvcmVzb3VyY2VfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZXNvdXJjZV9jb250ZXh0LmgKaW5kZXggNmNiZDk1Ny4uYWMxYjc2ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZXNvdXJjZV9jb250ZXh0LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9yZXNvdXJjZV9jb250ZXh0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9SRVNPVVJDRV9DT05URVhUX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9SRVNPVVJDRV9DT05URVhUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmUuY2MKaW5kZXggZjY4ZWMyZS4uNDlmODNiMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZS5oIgogCkBAIC0zNCw3ICszMiw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgYmdyYV9zdXBwb3J0ZWQpCiAgICAgOiBncmFwaGljc19jb250ZXh0XyhncmFwaGljc19jb250ZXh0KSwKICAgICAgIHNpemVfKHRleHR1cmVfc291cmNlX2RhdGEtPkdldFNpemUoKSksCi0gICAgICBmb3JtYXRfKHRleHR1cmVfc291cmNlX2RhdGEtPkdldEZvcm1hdCgpKSB7CisgICAgICBmb3JtYXRfKHRleHR1cmVfc291cmNlX2RhdGEtPkdldEZvcm1hdCgpKSwKKyAgICAgIHRhcmdldF8oR0xfVEVYVFVSRV8yRCkgewogICBnbF9oYW5kbGVfID0KICAgICAgIHRleHR1cmVfc291cmNlX2RhdGEtPkNvbnZlcnRUb1RleHR1cmUoZ3JhcGhpY3NfY29udGV4dF8sIGJncmFfc3VwcG9ydGVkKTsKIH0KQEAgLTQzLDI2ICs0MiwzMSBAQAogICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSYXdUZXh0dXJlTWVtb3J5RUdMKiBkYXRhLCBpbnRwdHJfdCBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlNpemUmIHNpemUsIEdMZW51bSBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBwaXRjaF9pbl9ieXRlcywgYm9vbCBiZ3JhX3N1cHBvcnRlZCkKLSAgICA6IGdyYXBoaWNzX2NvbnRleHRfKGdyYXBoaWNzX2NvbnRleHQpLCBzaXplXyhzaXplKSwgZm9ybWF0Xyhmb3JtYXQpIHsKKyAgICA6IGdyYXBoaWNzX2NvbnRleHRfKGdyYXBoaWNzX2NvbnRleHQpLAorICAgICAgc2l6ZV8oc2l6ZSksCisgICAgICBmb3JtYXRfKGZvcm1hdCksCisgICAgICB0YXJnZXRfKEdMX1RFWFRVUkVfMkQpIHsKICAgZ2xfaGFuZGxlXyA9IGRhdGEtPkNyZWF0ZVRleHR1cmUoZ3JhcGhpY3NfY29udGV4dF8sIG9mZnNldCwgc2l6ZSwgZm9ybWF0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwaXRjaF9pbl9ieXRlcywgYmdyYV9zdXBwb3J0ZWQpOwogfQogCi1UZXh0dXJlRUdMOjpUZXh0dXJlRUdMKEdyYXBoaWNzQ29udGV4dEVHTCogZ3JhcGhpY3NfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50IGdsX2hhbmRsZSwgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIGZvcm1hdCkKLSAgICA6IGdyYXBoaWNzX2NvbnRleHRfKGdyYXBoaWNzX2NvbnRleHQpCi0gICAgLCBzaXplXyhzaXplKQotICAgICwgZm9ybWF0Xyhmb3JtYXQpCi0gICAgLCBnbF9oYW5kbGVfKGdsX2hhbmRsZSkgewotfQorVGV4dHVyZUVHTDo6VGV4dHVyZUVHTChHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHQsIEdMdWludCBnbF9oYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlNpemUmIHNpemUsIEdMZW51bSBmb3JtYXQsIEdMZW51bSB0YXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRlbGV0ZV9mdW5jdGlvbikKKyAgICA6IGdyYXBoaWNzX2NvbnRleHRfKGdyYXBoaWNzX2NvbnRleHQpLAorICAgICAgc2l6ZV8oc2l6ZSksCisgICAgICBmb3JtYXRfKGZvcm1hdCksCisgICAgICBnbF9oYW5kbGVfKGdsX2hhbmRsZSksCisgICAgICB0YXJnZXRfKHRhcmdldCksCisgICAgICBkZWxldGVfZnVuY3Rpb25fKGRlbGV0ZV9mdW5jdGlvbikge30KIAogVGV4dHVyZUVHTDo6VGV4dHVyZUVHTCgKICAgICBHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHQsCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQQnVmZmVyUmVuZGVyVGFyZ2V0RUdMPiYgcmVuZGVyX3RhcmdldCkKICAgICA6IGdyYXBoaWNzX2NvbnRleHRfKGdyYXBoaWNzX2NvbnRleHQpLAogICAgICAgc2l6ZV8ocmVuZGVyX3RhcmdldC0+R2V0U2l6ZSgpKSwKLSAgICAgIGZvcm1hdF8oR0xfUkdCQSkgeworICAgICAgZm9ybWF0XyhHTF9SR0JBKSwKKyAgICAgIHRhcmdldF8oR0xfVEVYVFVSRV8yRCkgewogICBHcmFwaGljc0NvbnRleHRFR0w6OlNjb3BlZE1ha2VDdXJyZW50IHNjb3BlZF9tYWtlX2N1cnJlbnQoZ3JhcGhpY3NfY29udGV4dF8pOwogCiAgIHNvdXJjZV9yZW5kZXJfdGFyZ2V0XyA9IHJlbmRlcl90YXJnZXQ7CkBAIC05MSwxMyArOTUsMTMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRUdMX0JBQ0tfQlVGRkVSKSk7CiAgIH0KIAotICBHTF9DQUxMKGdsRGVsZXRlVGV4dHVyZXMoMSwgJmdsX2hhbmRsZV8pKTsKKyAgaWYgKCFkZWxldGVfZnVuY3Rpb25fLmlzX251bGwoKSkgeworICAgIGRlbGV0ZV9mdW5jdGlvbl8uUnVuKCk7CisgIH0gZWxzZSB7CisgICAgR0xfQ0FMTChnbERlbGV0ZVRleHR1cmVzKDEsICZnbF9oYW5kbGVfKSk7CisgIH0KIH0KIAotY29uc3QgbWF0aDo6U2l6ZSYgVGV4dHVyZUVHTDo6R2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9Ci0KLUdMZW51bSBUZXh0dXJlRUdMOjpHZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBmb3JtYXRfOyB9Ci0KIH0gIC8vIG5hbWVzcGFjZSBiYWNrZW5kCiB9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlLmgKaW5kZXggZmY5M2ExZi4uYjcyM2EwNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlLmgKQEAgLTEsMjQgKzEsMjMgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9URVhUVVJFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9URVhUVVJFX0hfCiAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KIAorI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3BidWZmZXJfcmVuZGVyX3RhcmdldC5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGEuaCIKQEAgLTQ3LDggKzQ2LDExIEBACiAgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwgR0xlbnVtIGZvcm1hdCwgaW50IHBpdGNoX2luX2J5dGVzLAogICAgICAgICAgICAgIGJvb2wgYmdyYV9zdXBwb3J0ZWQpOwogICAvLyBXcmFwIGFuZCB0YWtlIG93bmVyc2hpcCBvZiBhIHByZS1leGlzdGluZyBPcGVuR0wgdGV4dHVyZS4KLSAgVGV4dHVyZUVHTChHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHQsCi0gICAgICAgICAgICAgR0x1aW50IGdsX2hhbmRsZSwgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwgR0xlbnVtIGZvcm1hdCk7CisgIC8vIElmIHByb3ZpZGVkLCB8ZGVsZXRlX2Z1bmN0aW9ufCB3aWxsIGJlIHVzZWQgdG8gY2xlYW4gdXAgcmVzb3VyY2VzIGluc3RlYWQKKyAgLy8gb2YgbWFudWFsbHkgY2FsbGluZyBnbF8KKyAgVGV4dHVyZUVHTChHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHQsIEdMdWludCBnbF9oYW5kbGUsCisgICAgICAgICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgc2l6ZSwgR0xlbnVtIGZvcm1hdCwgR0xlbnVtIHRhcmdldCwKKyAgICAgICAgICAgICBjb25zdCBiYXNlOjpDbG9zdXJlJiBkZWxldGVfZnVuY3Rpb24pOwogCiAgIC8vIENyZWF0ZSBhIHRleHR1cmUgZnJvbSBhIHByZS1leGlzdGluZyBvZmZzY3JlZW4gUEJ1ZmZlciByZW5kZXIgdGFyZ2V0LgogICBleHBsaWNpdCBUZXh0dXJlRUdMKApAQCAtNTYsOCArNTgsOSBAQAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxQQnVmZmVyUmVuZGVyVGFyZ2V0RUdMPiYgcmVuZGVyX3RhcmdldCk7CiAgIHZpcnR1YWwgflRleHR1cmVFR0woKTsKIAotICBjb25zdCBtYXRoOjpTaXplJiBHZXRTaXplKCkgY29uc3Q7Ci0gIEdMZW51bSBHZXRGb3JtYXQoKSBjb25zdDsKKyAgY29uc3QgbWF0aDo6U2l6ZSYgR2V0U2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9CisgIEdMZW51bSBHZXRGb3JtYXQoKSBjb25zdCB7IHJldHVybiBmb3JtYXRfOyB9CisgIEdMZW51bSBHZXRUYXJnZXQoKSBjb25zdCB7IHJldHVybiB0YXJnZXRfOyB9CiAKICAgaW50cHRyX3QgR2V0UGxhdGZvcm1IYW5kbGUoKSB7IHJldHVybiBzdGF0aWNfY2FzdDxpbnRwdHJfdD4oZ2xfaGFuZGxlKCkpOyB9CiAKQEAgLTc0LDEyICs3NywyMCBAQAogICAvLyBQaXhlbCBjb2xvciBmb3JtYXQgb2YgdGhlIHRleHR1cmUuCiAgIEdMZW51bSBmb3JtYXRfOwogCisgIC8vIFRoZSB0ZXh0dXJlIHRhcmdldCB0eXBlIHRoYXQgc2hvdWxkIGJlIHBhc3NlZCBpbiB0byBHTEVTIGNvbW1hbmRzIGRlYWxpbmcKKyAgLy8gd2l0aCB0aGlzIHRleHR1cmUuCisgIEdMZW51bSB0YXJnZXRfOworCiAgIC8vIFRoZSBPcGVuR0wgaGFuZGxlIHRvIHRoZSB0ZXh0dXJlIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvIE9wZW5HTCBmdW5jdGlvbnMuCiAgIEdMdWludCBnbF9oYW5kbGVfOwogCiAgIC8vIElmIHRoZSB0ZXh0dXJlIHdhcyBjb25zdHJ1Y3RlZCBmcm9tIGEgcmVuZGVyIHRhcmdldCwgd2Uga2VlcCBhIHJlZmVyZW5jZQogICAvLyB0byB0aGUgcmVuZGVyIHRhcmdldC4KICAgc2NvcGVkX3JlZnB0cjxQQnVmZmVyUmVuZGVyVGFyZ2V0RUdMPiBzb3VyY2VfcmVuZGVyX3RhcmdldF87CisKKyAgLy8gSWYgbm9uLW51bGwsIHdpbGwgYmUgY2FsbGVkIHVwb24gZGVzdHJ1Y3Rpb24gaW5zdGVhZCBvZiBtYW51YWxseSBkZWxldGluZworICAvLyB0aGUgdGV4dHVyZSB2aWEgZ2xEZWxldGVUZXh0dXJlcygpLgorICBiYXNlOjpDbG9zdXJlIGRlbGV0ZV9mdW5jdGlvbl87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYmFja2VuZApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGEuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YS5jYwppbmRleCBmY2E0ODMyLi5kNjBiYjQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YS5oCmluZGV4IDdhYjVhNGEuLjMwYjQ1OGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGEuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfRUdMX1RFWFRVUkVfREFUQV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfVEVYVFVSRV9EQVRBX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YV9jcHUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YV9jcHUuY2MKaW5kZXggZmU5NWFjZS4uZWM4NmMxYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfY3B1LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YV9jcHUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5oCmluZGV4IGY1ZmNiNDcuLmRkNzk5MGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX2NwdS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfVEVYVFVSRV9EQVRBX0NQVV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfVEVYVFVSRV9EQVRBX0NQVV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfcGJvLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfcGJvLmNjCmluZGV4IDg2ZmMxMDguLjk3MGJiODYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX3Biby5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmVfZGF0YV9wYm8uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWYgZGVmaW5lZChHTEVTM19TVVBQT1JURUQpCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZV9kYXRhX3Biby5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfcGJvLmgKaW5kZXggZDk5Y2E1NC4uOTJhYjVmNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfcGJvLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC90ZXh0dXJlX2RhdGFfcGJvLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9URVhUVVJFX0RBVEFfUEJPX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0VHTF9URVhUVVJFX0RBVEFfUEJPX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5jYwppbmRleCBjNzJmNzNlLi5iNGQ5MTM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdXRpbHMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdXRpbHMuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdXRpbHMuaAppbmRleCA4NmFlNGQ5Li4yYTlkNGJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9FR0xfVVRJTFNfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfRUdMX1VUSUxTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3NfY29udGV4dC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuaAppbmRleCA1NDYxMGZmLi4yZTk3NzAzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3NfY29udGV4dC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19jb250ZXh0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0dSQVBISUNTX0NPTlRFWFRfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfR1JBUEhJQ1NfQ09OVEVYVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHRfc3R1Yi5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHRfc3R1Yi5oCmluZGV4IGIyZTBmMWIuLjQ1YjhhMzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19jb250ZXh0X3N0dWIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3NfY29udGV4dF9zdHViLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX0dSQVBISUNTX0NPTlRFWFRfU1RVQl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9HUkFQSElDU19DT05URVhUX1NUVUJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19zeXN0ZW0uaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19zeXN0ZW0uaAppbmRleCBiY2M3ZmViLi4yYWJlNzVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3Nfc3lzdGVtLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX3N5c3RlbS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9HUkFQSElDU19TWVNURU1fSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfR1JBUEhJQ1NfU1lTVEVNX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3Nfc3lzdGVtX3N0dWIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19zeXN0ZW1fc3R1Yi5oCmluZGV4IGJjZWY2NmEuLjBjOTY2NzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19zeXN0ZW1fc3R1Yi5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9ncmFwaGljc19zeXN0ZW1fc3R1Yi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9HUkFQSElDU19TWVNURU1fU1RVQl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9HUkFQSElDU19TWVNURU1fU1RVQl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3JlbmRlcl90YXJnZXQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0LmgKaW5kZXggMzUxMjllMi4uZWJhYTMzNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3JlbmRlcl90YXJnZXQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvcmVuZGVyX3RhcmdldC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9SRU5ERVJfVEFSR0VUX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9CQUNLRU5EX1JFTkRFUl9UQVJHRVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0X3N0dWIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0X3N0dWIuaAppbmRleCBiYzlhNGNiLi41NmVkNWQzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvcmVuZGVyX3RhcmdldF9zdHViLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3JlbmRlcl90YXJnZXRfc3R1Yi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9SRU5ERVJfVEFSR0VUX1NUVUJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfUkVOREVSX1RBUkdFVF9TVFVCX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvc3RhcmJvYXJkL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtX2JsaXR0ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvc3RhcmJvYXJkL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtX2JsaXR0ZXIuY2MKaW5kZXggNjdiZjVlOS4uYWQwNTAyOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3N0YXJib2FyZC9kZWZhdWx0X2dyYXBoaWNzX3N5c3RlbV9ibGl0dGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW1fYmxpdHRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9kZWZhdWx0X2dyYXBoaWNzX3N5c3RlbS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvc3RhcmJvYXJkL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtX2VnbC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW1fZWdsLmNjCmluZGV4IGM3MzM5ZTUuLjBmOTk4ZTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW1fZWdsLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW1fZWdsLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW1fc3R1Yi5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW1fc3R1Yi5jYwppbmRleCA5OWM4OTA5Li44NTVmNjFjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvc3RhcmJvYXJkL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtX3N0dWIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3N0YXJib2FyZC9kZWZhdWx0X2dyYXBoaWNzX3N5c3RlbV9zdHViLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZ3JhcGhpY3Nfc3lzdGVtX3N0dWIuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvcGxhdGZvcm1fYmFja2VuZC5neXAgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvc3RhcmJvYXJkL3BsYXRmb3JtX2JhY2tlbmQuZ3lwCmluZGV4IDgwMGVmZjEuLmMzNmEwN2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9zdGFyYm9hcmQvcGxhdGZvcm1fYmFja2VuZC5neXAKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3N0YXJib2FyZC9wbGF0Zm9ybV9iYWNrZW5kLmd5cApAQCAtMzEsNiArMzEsNyBAQAogICAgICAgICAgICAgICBdLAogCiAgICAgICAgICAgICAgICdpbmNsdWRlcyc6IFsKKyAgICAgICAgICAgICAgICAnLi4vLi4vcmVuZGVyZXJfcGFyYW1ldGVyc19zZXR1cC5neXBpJywKICAgICAgICAgICAgICAgICAnLi4vYmxpdHRlci9ibGl0dGVyX2JhY2tlbmQuZ3lwaScsCiAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICB9LCB7CkBAIC0zOSw2ICs0MCw3IEBACiAgICAgICAgICAgICAgIF0sCiAKICAgICAgICAgICAgICAgJ2luY2x1ZGVzJzogWworICAgICAgICAgICAgICAgICcuLi8uLi9yZW5kZXJlcl9wYXJhbWV0ZXJzX3NldHVwLmd5cGknLAogICAgICAgICAgICAgICAgICcuLi9lZ2wvZWdsX2JhY2tlbmQuZ3lwaScsCiAgICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICB9XSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC90ZXh0dXJlX3N0dWIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC90ZXh0dXJlX3N0dWIuaAppbmRleCBlMmI1N2EzLi44MWI3NDA3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvdGV4dHVyZV9zdHViLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3RleHR1cmVfc3R1Yi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfQkFDS0VORF9URVhUVVJFX1NUVUJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX0JBQ0tFTkRfVEVYVFVSRV9TVFVCX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvd2luL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9iYWNrZW5kL3dpbi9kZWZhdWx0X2dyYXBoaWNzX3N5c3RlbS5jYwppbmRleCBjN2JiNTVmLi5lOGY2ZGFlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvd2luL2RlZmF1bHRfZ3JhcGhpY3Nfc3lzdGVtLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvYmFja2VuZC93aW4vZGVmYXVsdF9ncmFwaGljc19zeXN0ZW0uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZGVmYXVsdF9ncmFwaGljc19zeXN0ZW0uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9mcmFtZV9yYXRlX3Rocm90dGxlci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvZnJhbWVfcmF0ZV90aHJvdHRsZXIuY2MKaW5kZXggMjBkNjYyZS4uODJjZWJkMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9mcmFtZV9yYXRlX3Rocm90dGxlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL2ZyYW1lX3JhdGVfdGhyb3R0bGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9mcmFtZV9yYXRlX3Rocm90dGxlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL2ZyYW1lX3JhdGVfdGhyb3R0bGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL2ZyYW1lX3JhdGVfdGhyb3R0bGVyLmgKaW5kZXggNmFmMmJlNy4uMGEyZTRjNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9mcmFtZV9yYXRlX3Rocm90dGxlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvZnJhbWVfcmF0ZV90aHJvdHRsZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX0ZSQU1FX1JBVEVfVEhST1RUTEVSX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9GUkFNRV9SQVRFX1RIUk9UVExFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuY2MKaW5kZXggNTY4YjJiMi4uZTNmODZkOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9waXBlbGluZS5oIgogCkBAIC0zMjIsNiArMzIwLDEyIEBACiAgIHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZSogYW5pbWF0ZV9ub2RlID0KICAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZSo+KAogICAgICAgICAgIHN1Ym1pc3Npb24ucmVuZGVyX3RyZWUuZ2V0KCkpOworCisgIC8vIFNvbWUgYW5pbWF0aW9ucyByZXF1aXJlIGEgR0wgZ3JhcGhpY3MgY29udGV4dCB0byBiZSBjdXJyZW50LiAgU3BlY2lmaWNhbGx5LAorICAvLyBhIGNhbGwgdG8gU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUoKSBtYXkgYmUgbWFkZSB0byBnZXQgdGhlIGN1cnJlbnQgdmlkZW8KKyAgLy8gZnJhbWUgdG8gZHJpdmUgYSB2aWRlby1hcy1hbi1hbmltYXRlZC1pbWFnZS4KKyAgcmFzdGVyaXplcl8tPk1ha2VDdXJyZW50KCk7CisKICAgcmVuZGVyX3RyZWU6OmFuaW1hdGlvbnM6OkFuaW1hdGVOb2RlOjpBbmltYXRlUmVzdWx0cyByZXN1bHRzID0KICAgICAgIGFuaW1hdGVfbm9kZS0+QXBwbHkoc3VibWlzc2lvbi50aW1lX29mZnNldCk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmUuaAppbmRleCA0N2M4Nzc0Li43Njk1ZDRhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUElQRUxJTkVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1BJUEVMSU5FX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3BpcGVsaW5lX3Rlc3QuY2MKaW5kZXggYTIzYzJhYy4uZWMxYTVkMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9waXBlbGluZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcGlwZWxpbmVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxjbWF0aD4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JlbmNobWFyay5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9iZW5jaG1hcmsuY2MKaW5kZXggYzBkMjU2Ny4uMDA4YjM4YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JlbmNobWFyay5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmVuY2htYXJrLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L21hdGgvc2l6ZS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvY2FjaGVkX3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5jYwppbmRleCA3NDNmZjc5Li5kN2NmNDFjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NhY2hlZF9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NhY2hlZF9zb2Z0d2FyZV9yYXN0ZXJpemVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jYWNoZWRfc29mdHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDEwZDc2ZTkuLjk5Y2VmYmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NhY2hlZF9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvY2FjaGVkX3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9DQUNIRURfU09GVFdBUkVfUkFTVEVSSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX0NBQ0hFRF9TT0ZUV0FSRV9SQVNURVJJWkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jb2JhbHRfYmxpdHRlcl9jb252ZXJzaW9ucy5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NvYmFsdF9ibGl0dGVyX2NvbnZlcnNpb25zLmNjCmluZGV4IDI5YTk2MGEuLjE4NTgyMTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NvYmFsdF9ibGl0dGVyX2NvbnZlcnNpb25zLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NvYmFsdF9ibGl0dGVyX2NvbnZlcnNpb25zLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvY29iYWx0X2JsaXR0ZXJfY29udmVyc2lvbnMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvY29iYWx0X2JsaXR0ZXJfY29udmVyc2lvbnMuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2NvYmFsdF9ibGl0dGVyX2NvbnZlcnNpb25zLmgKaW5kZXggZDEzYjc3ZC4uZjFiZGYxYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvY29iYWx0X2JsaXR0ZXJfY29udmVyc2lvbnMuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9jb2JhbHRfYmxpdHRlcl9jb252ZXJzaW9ucy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX0NPQkFMVF9CTElUVEVSX0NPTlZFUlNJT05TX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfQ09CQUxUX0JMSVRURVJfQ09OVkVSU0lPTlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IDdiNzZlMTUuLmM1NTFmNGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaGFyZHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaGFyZHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaGFyZHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDVhYjhmZDUuLjlhZTQ3ZTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfSEFSRFdBUkVfUkFTVEVSSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX0hBUkRXQVJFX1JBU1RFUklaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2ltYWdlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuY2MKaW5kZXggYmQzMjA1Ny4uYjQ0ZmZkYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9pbWFnZS5oIgogCkBAIC03OCw4ICs3NiwxMSBAQAogICAgICAgICAgICAgICAgcmVuZGVyX3RyZWU6OmtBbHBoYUZvcm1hdE9wYXF1ZTsKIH0KIAotU2luZ2xlUGxhbmVJbWFnZTo6U2luZ2xlUGxhbmVJbWFnZShTYkJsaXR0ZXJTdXJmYWNlIHN1cmZhY2UsIGJvb2wgaXNfb3BhcXVlKQotICAgIDogc3VyZmFjZV8oc3VyZmFjZSksIGlzX29wYXF1ZV8oaXNfb3BhcXVlKSB7CitTaW5nbGVQbGFuZUltYWdlOjpTaW5nbGVQbGFuZUltYWdlKFNiQmxpdHRlclN1cmZhY2Ugc3VyZmFjZSwgYm9vbCBpc19vcGFxdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRlbGV0ZV9mdW5jdGlvbikKKyAgICA6IHN1cmZhY2VfKHN1cmZhY2UpLAorICAgICAgaXNfb3BhcXVlXyhpc19vcGFxdWUpLAorICAgICAgZGVsZXRlX2Z1bmN0aW9uXyhkZWxldGVfZnVuY3Rpb24pIHsKICAgQ0hFQ0soU2JCbGl0dGVySXNTdXJmYWNlVmFsaWQoc3VyZmFjZV8pKTsKICAgU2JCbGl0dGVyU3VyZmFjZUluZm8gaW5mbzsKICAgaWYgKCFTYkJsaXR0ZXJHZXRTdXJmYWNlSW5mbyhzdXJmYWNlXywgJmluZm8pKSB7CkBAIC0xMTksNyArMTIwLDEzIEBACiAgIHJldHVybiAmYml0bWFwXy52YWx1ZSgpOwogfQogCi1TaW5nbGVQbGFuZUltYWdlOjp+U2luZ2xlUGxhbmVJbWFnZSgpIHsgU2JCbGl0dGVyRGVzdHJveVN1cmZhY2Uoc3VyZmFjZV8pOyB9CitTaW5nbGVQbGFuZUltYWdlOjp+U2luZ2xlUGxhbmVJbWFnZSgpIHsKKyAgaWYgKCFkZWxldGVfZnVuY3Rpb25fLmlzX251bGwoKSkgeworICAgIGRlbGV0ZV9mdW5jdGlvbl8uUnVuKCk7CisgIH0gZWxzZSB7CisgICAgU2JCbGl0dGVyRGVzdHJveVN1cmZhY2Uoc3VyZmFjZV8pOworICB9Cit9CiAKIH0gIC8vIG5hbWVzcGFjZSBibGl0dGVyCiB9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2ltYWdlLmgKaW5kZXggNzZkZGE5OS4uZmVmYjFmMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvaW1hZ2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9pbWFnZS5oCkBAIC0xLDI0ICsxLDIzIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX0lNQUdFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfSU1BR0VfSF8KIAogI2luY2x1ZGUgPHN0cmluZz4KIAorI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9hbGlnbmVkX21lbW9yeS5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCkBAIC03MSw3ICs3MCwxMCBAQAogY2xhc3MgU2luZ2xlUGxhbmVJbWFnZSA6IHB1YmxpYyBza2lhOjpTaW5nbGVQbGFuZUltYWdlIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IFNpbmdsZVBsYW5lSW1hZ2Uoc2NvcGVkX3B0cjxJbWFnZURhdGE+IGltYWdlX2RhdGEpOwotICBTaW5nbGVQbGFuZUltYWdlKFNiQmxpdHRlclN1cmZhY2Ugc3VyZmFjZSwgYm9vbCBpc19vcGFxdWUpOworICAvLyBJZiB8ZGVsZXRlX2Z1bmN0aW9ufCBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSBjYWxsZWQgaW4gdGhlIGRlc3RydWN0b3IKKyAgLy8gaW5zdGVhZCBvZiBtYW51YWxseSBjYWxsaW5nIFNiQmxpdHRlckRlc3Ryb3lTdXJmYWNlKHN1cmZhY2VfKS4KKyAgU2luZ2xlUGxhbmVJbWFnZShTYkJsaXR0ZXJTdXJmYWNlIHN1cmZhY2UsIGJvb2wgaXNfb3BhcXVlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIGRlbGV0ZV9mdW5jdGlvbik7CiAKICAgY29uc3QgbWF0aDo6U2l6ZSYgR2V0U2l6ZSgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIHNpemVfOyB9CiAKQEAgLTk4LDYgKzEwMCwxMCBAQAogICAvLyBUaGlzIGZpZWxkIGlzIHBvcHVsYXRlZCB3aGVuIEdldEJpdG1hcCgpIGlzIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUsIGFuZAogICAvLyBhZnRlciB0aGF0IGlzIG5ldmVyIG1vZGlmaWVkLgogICBtdXRhYmxlIGJhc2U6Om9wdGlvbmFsPFNrQml0bWFwPiBiaXRtYXBfOworCisgIC8vIElmIHxkZWxldGVfZnVuY3Rpb258IGlzIHByb3ZpZGVkLCBpdCB3aWxsIGJlIGNhbGxlZCBpbiB0aGUgZGVzdHJ1Y3RvcgorICAvLyBpbnN0ZWFkIG9mIG1hbnVhbGx5IGNhbGxpbmcgU2JCbGl0dGVyRGVzdHJveVN1cmZhY2Uoc3VyZmFjZV8pLgorICBiYXNlOjpDbG9zdXJlIGRlbGV0ZV9mdW5jdGlvbl87CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgYmxpdHRlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50LmNjCmluZGV4IGJjMTdhZjcuLjY4YzUzYjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2xpbmVhcl9ncmFkaWVudC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9saW5lYXJfZ3JhZGllbnQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9saW5lYXJfZ3JhZGllbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50LmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9saW5lYXJfZ3JhZGllbnQuaAppbmRleCA3MTJkZjY0Li44NGQ2YzQzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9saW5lYXJfZ3JhZGllbnQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9saW5lYXJfZ3JhZGllbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9MSU5FQVJfR1JBRElFTlRfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9MSU5FQVJfR1JBRElFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2xpbmVhcl9ncmFkaWVudF9jYWNoZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2xpbmVhcl9ncmFkaWVudF9jYWNoZS5jYwppbmRleCA5N2ExN2Q4Li40N2MxZjhkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9saW5lYXJfZ3JhZGllbnRfY2FjaGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50X2NhY2hlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50X2NhY2hlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2xpbmVhcl9ncmFkaWVudF9jYWNoZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50X2NhY2hlLmgKaW5kZXggYjY2MWZjOS4uMTU3ODk4ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50X2NhY2hlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50X2NhY2hlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfTElORUFSX0dSQURJRU5UX0NBQ0hFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfTElORUFSX0dSQURJRU5UX0NBQ0hFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9saW5lYXJfZ3JhZGllbnRfY2FjaGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2xpbmVhcl9ncmFkaWVudF9jYWNoZV90ZXN0LmNjCmluZGV4IDNkODAwMDQuLjA1NDY0MzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2xpbmVhcl9ncmFkaWVudF9jYWNoZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL2xpbmVhcl9ncmFkaWVudF9jYWNoZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvbGluZWFyX2dyYWRpZW50X2NhY2hlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jhc3Rlcml6ZXIuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmFzdGVyaXplci5neXAKaW5kZXggMzMyYjhkNC4uMWNiMWFjMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmFzdGVyaXplci5neXAKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmFzdGVyaXplci5neXAKQEAgLTk0LDcgKzk0LDcgQEAKIAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJ2hhcmR3YXJlX3Jhc3Rlcml6ZXInLAotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcKICAgICAgIF0sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfc3RhdGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfc3RhdGUuY2MKaW5kZXggNzU5YjE0OS4uOGQ4YmI4MSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3N0YXRlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl9zdGF0ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl9zdGF0ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfc3RhdGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl9zdGF0ZS5oCmluZGV4IGIwYTgyOGEuLjQ2YmZkODggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl9zdGF0ZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl9zdGF0ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX1JFTkRFUl9TVEFURV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX1JFTkRFUl9TVEFURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfYmxpdHRlcl9jb252ZXJzaW9ucy5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl90cmVlX2JsaXR0ZXJfY29udmVyc2lvbnMuY2MKaW5kZXggMzc0YzRiMi4uNTZjNGQ0YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfYmxpdHRlcl9jb252ZXJzaW9ucy5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ibGl0dGVyX2NvbnZlcnNpb25zLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfYmxpdHRlcl9jb252ZXJzaW9ucy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ibGl0dGVyX2NvbnZlcnNpb25zLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ibGl0dGVyX2NvbnZlcnNpb25zLmgKaW5kZXggOTUxMWU0Yy4uZTE4ZTVhYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfYmxpdHRlcl9jb252ZXJzaW9ucy5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl90cmVlX2JsaXR0ZXJfY29udmVyc2lvbnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9SRU5ERVJfVFJFRV9CTElUVEVSX0NPTlZFUlNJT05TX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfUkVOREVSX1RSRUVfQkxJVFRFUl9DT05WRVJTSU9OU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmNjCmluZGV4IDNlOTYxY2UuLmJlM2I0YWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaAppbmRleCAzOTQ2YTU0Li5lYWUzOGU5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9SRU5ERVJfVFJFRV9OT0RFX1ZJU0lUT1JfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9SRU5ERVJfVFJFRV9OT0RFX1ZJU0lUT1JfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jlc291cmNlX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuY2MKaW5kZXggMTBhNjg4My4uYzMxNzdjOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuY2MKQEAgLTEsMjEgKzEsMjAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZXNvdXJjZV9wcm92aWRlci5oIgogCisjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9pbWFnZS5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVuZGVyX3RyZWVfYmxpdHRlcl9jb252ZXJzaW9ucy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9ibGl0dGVyLmgiCkBAIC03NCwxMCArNzMsMTEgQEAKICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3JlZnB0cihuZXcgU2luZ2xlUGxhbmVJbWFnZShibGl0dGVyX3NvdXJjZV9kYXRhLlBhc3MoKSkpOwogfQogCi0jaWYgU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCiAKIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPgogUmVzb3VyY2VQcm92aWRlcjo6Q3JlYXRlSW1hZ2VGcm9tU2JEZWNvZGVUYXJnZXQoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgeworI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCA9IFNiRGVjb2RlVGFyZ2V0R2V0Rm9ybWF0KGRlY29kZV90YXJnZXQpOwogICBpZiAoZm9ybWF0ID09IGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEpIHsKICAgICBTYkJsaXR0ZXJTdXJmYWNlIHN1cmZhY2UgPQpAQCAtODgsMTYgKzg4LDQxIEBACiAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgc3VyZmFjZSBpdCBjb250YWluZWQsIHdlIGFyZSBmcmVlIHRvIGRlbGV0ZQogICAgIC8vIHxkZWNvZGVfdGFyZ2V0fC4KICAgICBTYkRlY29kZVRhcmdldERlc3Ryb3koZGVjb2RlX3RhcmdldCk7Ci0gICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3JlZnB0cihuZXcgU2luZ2xlUGxhbmVJbWFnZShzdXJmYWNlLCBpc19vcGFxdWUpKTsKKyAgICByZXR1cm4gbWFrZV9zY29wZWRfcmVmcHRyKAorICAgICAgICBuZXcgU2luZ2xlUGxhbmVJbWFnZShzdXJmYWNlLCBpc19vcGFxdWUsIGJhc2U6OkNsb3N1cmUoKSkpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBTYkRlY29kZVRhcmdldEluZm8gaW5mbzsKKyAgU2JNZW1vcnlTZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisgIENIRUNLKFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyhkZWNvZGVfdGFyZ2V0LCAmaW5mbykpOworCisgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCA9IGluZm8uZm9ybWF0OworICBpZiAoZm9ybWF0ID09IGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEpIHsKKyAgICBjb25zdCBTYkRlY29kZVRhcmdldEluZm9QbGFuZSYgcGxhbmUgPQorICAgICAgICBpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkFdOworICAgIERDSEVDSyhTYkJsaXR0ZXJJc1N1cmZhY2VWYWxpZChwbGFuZS5zdXJmYWNlKSk7CisgICAgaWYgKHBsYW5lLmNvbnRlbnRfcmVnaW9uLmxlZnQgIT0gMCB8fCBwbGFuZS5jb250ZW50X3JlZ2lvbi50b3AgIT0gMCB8fAorICAgICAgICBwbGFuZS5jb250ZW50X3JlZ2lvbi5yaWdodCAhPSBwbGFuZS53aWR0aCB8fAorICAgICAgICBwbGFuZS5jb250ZW50X3JlZ2lvbi5ib3R0b20gIT0gcGxhbmUuaGVpZ2h0KSB7CisgICAgICBOT1RSRUFDSEVEKCkgPDwgIkNvYmFsdCBoYXMgbm90IHlldCBpbXBsZW1lbnRlZCBzdXBwb3J0IGZvciBCbGl0dGVyICIKKyAgICAgICAgICAgICAgICAgICAgICAiZGVjb2RlIHRhcmdldCBjb250ZW50IHJlZ2lvbnMuIjsKKyAgICB9CisgICAgcmV0dXJuIG1ha2Vfc2NvcGVkX3JlZnB0cihuZXcgU2luZ2xlUGxhbmVJbWFnZSgKKyAgICAgICAgcGxhbmUuc3VyZmFjZSwgaW5mby5pc19vcGFxdWUsCisgICAgICAgIGJhc2U6OkJpbmQoJlNiRGVjb2RlVGFyZ2V0UmVsZWFzZSwgZGVjb2RlX3RhcmdldCkpKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICAgfQogCiAgIE5PVFJFQUNIRUQoKQogICAgICAgPDwgIk9ubHkgZm9ybWF0IGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEgaXMgY3VycmVudGx5IHN1cHBvcnRlZC4iOworI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiAgIFNiRGVjb2RlVGFyZ2V0RGVzdHJveShkZWNvZGVfdGFyZ2V0KTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKGRlY29kZV90YXJnZXQpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICByZXR1cm4gTlVMTDsKIH0KIAotI2VuZGlmICAvLyBTQl9WRVJTSU9OKDMpICYmIFNCX0hBUyhHUkFQSElDUykKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCiAKIHNjb3BlZF9wdHI8cmVuZGVyX3RyZWU6OlJhd0ltYWdlTWVtb3J5PgogUmVzb3VyY2VQcm92aWRlcjo6QWxsb2NhdGVSYXdJbWFnZU1lbW9yeShzaXplX3Qgc2l6ZV9pbl9ieXRlcywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jlc291cmNlX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9yZXNvdXJjZV9wcm92aWRlci5oCmluZGV4IGMwYWU3YWIuLjc2YzZmYzggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3Jlc291cmNlX3Byb3ZpZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvcmVzb3VyY2VfcHJvdmlkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9SRVNPVVJDRV9QUk9WSURFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX1JFU09VUkNFX1BST1ZJREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuY2MKaW5kZXggMDkyNzk5Yi4uNmNkNGIyMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc2NyYXRjaF9zdXJmYWNlX2NhY2hlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5oCmluZGV4IDY3NWE0OTguLjZkMWY2NmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX1NDUkFUQ0hfU1VSRkFDRV9DQUNIRV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX1NDUkFUQ0hfU1VSRkFDRV9DQUNIRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc2tpYV9ibGl0dGVyX2NvbnZlcnNpb25zLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc2tpYV9ibGl0dGVyX2NvbnZlcnNpb25zLmNjCmluZGV4IDAzZTFjMGMuLjA1MmViNGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NraWFfYmxpdHRlcl9jb252ZXJzaW9ucy5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9za2lhX2JsaXR0ZXJfY29udmVyc2lvbnMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9za2lhX2JsaXR0ZXJfY29udmVyc2lvbnMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc2tpYV9ibGl0dGVyX2NvbnZlcnNpb25zLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9za2lhX2JsaXR0ZXJfY29udmVyc2lvbnMuaAppbmRleCAxOGYyYzM4Li4yMmY1NDEzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9za2lhX2JsaXR0ZXJfY29udmVyc2lvbnMuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9za2lhX2JsaXR0ZXJfY29udmVyc2lvbnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9TS0lBX0JMSVRURVJfQ09OVkVSU0lPTlNfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQkxJVFRFUl9TS0lBX0JMSVRURVJfQ09OVkVSU0lPTlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IGY5NmQ5MzEuLjIwN2QzYzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc29mdHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc29mdHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc29mdHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDA0YWEyYWMuLjg1YWFiZjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfU09GVFdBUkVfUkFTVEVSSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX1NPRlRXQVJFX1JBU1RFUklaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3N1cmZhY2VfY2FjaGVfZGVsZWdhdGUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zdXJmYWNlX2NhY2hlX2RlbGVnYXRlLmNjCmluZGV4IDQyN2JhN2QuLmE1ZmJkMWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3N1cmZhY2VfY2FjaGVfZGVsZWdhdGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3N1cmZhY2VfY2FjaGVfZGVsZWdhdGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2JsaXR0ZXIvc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZS5oCmluZGV4IDBiMGRhMjUuLjg5MTJjMjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9ibGl0dGVyL3N1cmZhY2VfY2FjaGVfZGVsZWdhdGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zdXJmYWNlX2NhY2hlX2RlbGVnYXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0JMSVRURVJfU1VSRkFDRV9DQUNIRV9ERUxFR0FURV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9CTElUVEVSX1NVUkZBQ0VfQ0FDSEVfREVMRUdBVEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vb2Zmc2NyZWVuX3JlbmRlcl9jb29yZGluYXRlX21hcHBpbmcuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL29mZnNjcmVlbl9yZW5kZXJfY29vcmRpbmF0ZV9tYXBwaW5nLmNjCmluZGV4IDg2MzcwNWMuLjdmMWY5YjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vb2Zmc2NyZWVuX3JlbmRlcl9jb29yZGluYXRlX21hcHBpbmcuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9vZmZzY3JlZW5fcmVuZGVyX2Nvb3JkaW5hdGVfbWFwcGluZy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vb2Zmc2NyZWVuX3JlbmRlcl9jb29yZGluYXRlX21hcHBpbmcuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9vZmZzY3JlZW5fcmVuZGVyX2Nvb3JkaW5hdGVfbWFwcGluZy5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9vZmZzY3JlZW5fcmVuZGVyX2Nvb3JkaW5hdGVfbWFwcGluZy5oCmluZGV4IGM1NWY3Y2MuLjEwZDhhNDIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vb2Zmc2NyZWVuX3JlbmRlcl9jb29yZGluYXRlX21hcHBpbmcuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL29mZnNjcmVlbl9yZW5kZXJfY29vcmRpbmF0ZV9tYXBwaW5nLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBUaGUgb2Zmc2NyZWVuLXJlbmRlciBjb29yZGluYXRlIG1hcHBpbmcgbG9naWMgaGVyZSBjb250YWlucyBoZWxwZXIgbG9naWMKIC8vIGNvbW1vbiB0byBhbGwgcmFzdGVyaXplcnMgdGhhdCBuZWVkIHRvIHBlcmZvcm0gc3ViLXJlbmRlcmluZyB0byBvZmZzY3JlZW4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vc2NyYXRjaF9zdXJmYWNlX2NhY2hlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuY2MKaW5kZXggNmM2YjM1OC4uYWZkNmQ0MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuaAppbmRleCBhNDgyZmZjLi40MmZjOWZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vc2NyYXRjaF9zdXJmYWNlX2NhY2hlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0NPTU1PTl9TQ1JBVENIX1NVUkZBQ0VfQ0FDSEVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQ09NTU9OX1NDUkFUQ0hfU1VSRkFDRV9DQUNIRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zdHJlYW1pbmdfYmVzdF9maXRfbGluZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vc3RyZWFtaW5nX2Jlc3RfZml0X2xpbmUuY2MKaW5kZXggYjIyYzg5ZC4uMDNlNzRiMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zdHJlYW1pbmdfYmVzdF9maXRfbGluZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N0cmVhbWluZ19iZXN0X2ZpdF9saW5lLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zdHJlYW1pbmdfYmVzdF9maXRfbGluZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N0cmVhbWluZ19iZXN0X2ZpdF9saW5lLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N0cmVhbWluZ19iZXN0X2ZpdF9saW5lLmgKaW5kZXggOTAwZGY4My4uOTM3ZTlmYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zdHJlYW1pbmdfYmVzdF9maXRfbGluZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vc3RyZWFtaW5nX2Jlc3RfZml0X2xpbmUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQ09NTU9OX1NUUkVBTUlOR19CRVNUX0ZJVF9MSU5FX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0NPTU1PTl9TVFJFQU1JTkdfQkVTVF9GSVRfTElORV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zdXJmYWNlX2NhY2hlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zdXJmYWNlX2NhY2hlLmNjCmluZGV4IDVjZTAxOWYuLmRiZGU4YjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vc3VyZmFjZV9jYWNoZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N1cmZhY2VfY2FjaGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N1cmZhY2VfY2FjaGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2NvbW1vbi9zdXJmYWNlX2NhY2hlLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N1cmZhY2VfY2FjaGUuaAppbmRleCBkZWI5M2RlLi5lOTk1ZmNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N1cmZhY2VfY2FjaGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvY29tbW9uL3N1cmZhY2VfY2FjaGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQ09NTU9OX1NVUkZBQ0VfQ0FDSEVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfQ09NTU9OX1NVUkZBQ0VfQ0FDSEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfb2JqZWN0LmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFlMTRhZjMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfb2JqZWN0LmNjCkBAIC0wLDAgKzEsNjQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaCIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworRHJhd09iamVjdDo6QmFzZVN0YXRlOjpCYXNlU3RhdGUoKQorICAgIDogdHJhbnNmb3JtKG1hdGg6Ok1hdHJpeDNGOjpJZGVudGl0eSgpKSwKKyAgICAgIHNjaXNzb3IoMCwgMCwKKyAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSwKKyAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSksCisgICAgICBkZXB0aChHcmFwaGljc1N0YXRlOjpGYXJ0aGVzdERlcHRoKCkpLAorICAgICAgb3BhY2l0eSgxLjBmKSB7fQorCitEcmF3T2JqZWN0OjpCYXNlU3RhdGU6OkJhc2VTdGF0ZShjb25zdCBCYXNlU3RhdGUmIG90aGVyKQorICAgIDogdHJhbnNmb3JtKG90aGVyLnRyYW5zZm9ybSksCisgICAgICBzY2lzc29yKG90aGVyLnNjaXNzb3IpLAorICAgICAgZGVwdGgob3RoZXIuZGVwdGgpLAorICAgICAgb3BhY2l0eShvdGhlci5vcGFjaXR5KSB7fQorCitEcmF3T2JqZWN0OjpEcmF3T2JqZWN0KGNvbnN0IEJhc2VTdGF0ZSYgYmFzZV9zdGF0ZSkKKyAgICA6IGJhc2Vfc3RhdGVfKGJhc2Vfc3RhdGUpIHt9CisKKy8vIHN0YXRpYwordWludDMyX3QgRHJhd09iamVjdDo6R2V0R0xSR0JBKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpIHsKKyAgLy8gRW5zdXJlIGNvbG9yIGJ5dGVzIHJlcHJlc2VudCBSR0JBLCByZWdhcmRsZXNzIG9mIGVuZGlhbm5lc3MuCisgIHVuaW9uIHsKKyAgICB1aW50MzJfdCBjb2xvcjMyOworICAgIHVpbnQ4X3QgY29sb3I4WzRdOworICB9IGNvbG9yX2RhdGE7CisgIGNvbG9yX2RhdGEuY29sb3I4WzBdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4ociAqIDI1NS4wZik7CisgIGNvbG9yX2RhdGEuY29sb3I4WzFdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oZyAqIDI1NS4wZik7CisgIGNvbG9yX2RhdGEuY29sb3I4WzJdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYiAqIDI1NS4wZik7CisgIGNvbG9yX2RhdGEuY29sb3I4WzNdID0gc3RhdGljX2Nhc3Q8dWludDhfdD4oYSAqIDI1NS4wZik7CisgIHJldHVybiBjb2xvcl9kYXRhLmNvbG9yMzI7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlZ2wKK30gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCit9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOGI5YmRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X29iamVjdC5oCkBAIC0wLDAgKzEsNzEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0RSQVdfT0JKRUNUX0hfCisjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9EUkFXX09CSkVDVF9IXworCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdHlwZV9pZC5oIgorI2luY2x1ZGUgImNvYmFsdC9tYXRoL21hdHJpeDNfZi5oIgorI2luY2x1ZGUgImNvYmFsdC9tYXRoL3JlY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZ3JhcGhpY3Nfc3RhdGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW1fbWFuYWdlci5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworLy8gQmFzZSB0eXBlIHRvIHJhc3Rlcml6ZSB2YXJpb3VzIG9iamVjdHMgdmlhIEdMIGNvbW1hbmRzLgorY2xhc3MgRHJhd09iamVjdCB7CisgcHVibGljOgorICAvLyBTdHJ1Y3R1cmUgY29udGFpbmluZyB0aGUgY29tbW9uIGF0dHJpYnV0ZXMgZm9yIGFsbCBEcmF3T2JqZWN0cy4KKyAgc3RydWN0IEJhc2VTdGF0ZSB7CisgICAgQmFzZVN0YXRlKCk7CisgICAgQmFzZVN0YXRlKGNvbnN0IEJhc2VTdGF0ZSYgb3RoZXIpOworCisgICAgbWF0aDo6TWF0cml4M0YgdHJhbnNmb3JtOworICAgIG1hdGg6OlJlY3Qgc2Npc3NvcjsKKyAgICBmbG9hdCBkZXB0aDsKKyAgICBmbG9hdCBvcGFjaXR5OworICB9OworCisgIGVudW0gRXhlY3V0aW9uU3RhZ2UgeworICAgIGtTdGFnZVVwZGF0ZVZlcnRleEJ1ZmZlciwKKyAgICBrU3RhZ2VSYXN0ZXJpemVPZmZzY3JlZW4sCisgICAga1N0YWdlUmFzdGVyaXplTm9ybWFsLAorICB9OworCisgIHZpcnR1YWwgfkRyYXdPYmplY3QoKSB7fQorCisgIC8vIElzc3VlIEdMIGNvbW1hbmRzIHRvIHJhc3Rlcml6ZSB0aGUgb2JqZWN0LgorICB2aXJ0dWFsIHZvaWQgRXhlY3V0ZShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHByb2dyYW1fbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgRXhlY3V0aW9uU3RhZ2Ugc3RhZ2UpID0gMDsKKworIHByb3RlY3RlZDoKKyAgZXhwbGljaXQgRHJhd09iamVjdChjb25zdCBCYXNlU3RhdGUmIGJhc2Vfc3RhdGUpOworCisgIC8vIFJldHVybiBhIHVpbnQzMl90IHN1aXRhYmxlIHRvIGJlIHRyYW5zZmVycmVkIGFzIDQgdW5zaWduZWQgYnl0ZXMKKyAgLy8gcmVwcmVzZW50aW5nIGNvbG9yIHRvIGEgR0wgc2hhZGVyLgorICBzdGF0aWMgdWludDMyX3QgR2V0R0xSR0JBKGZsb2F0IHIsIGZsb2F0IGcsIGZsb2F0IGIsIGZsb2F0IGEpOworCisgIEJhc2VTdGF0ZSBiYXNlX3N0YXRlXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBlZ2wKK30gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCit9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfRFJBV19PQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19wb2x5X2NvbG9yLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3BvbHlfY29sb3IuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjE3OGNjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19wb2x5X2NvbG9yLmNjCkBAIC0wLDAgKzEsODMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19wb2x5X2NvbG9yLmgiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKworI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oIgorI2luY2x1ZGUgImVnbC9nZW5lcmF0ZWRfc2hhZGVyX2ltcGwuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworbmFtZXNwYWNlIHJhc3Rlcml6ZXIgeworbmFtZXNwYWNlIGVnbCB7CisKK0RyYXdQb2x5Q29sb3I6OkRyYXdQb2x5Q29sb3IoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgY29uc3QgQmFzZVN0YXRlJiBiYXNlX3N0YXRlLCBjb25zdCBtYXRoOjpSZWN0RiYgcmVjdCwKKyAgICBjb25zdCByZW5kZXJfdHJlZTo6Q29sb3JSR0JBJiBjb2xvcikKKyAgICA6IERyYXdPYmplY3QoYmFzZV9zdGF0ZSkgeworICBmbG9hdCBhbHBoYSA9IGJhc2Vfc3RhdGVfLm9wYWNpdHkgKiBjb2xvci5hKCk7CisgIHVpbnQzMl90IGNvbG9yMzIgPSBHZXRHTFJHQkEoY29sb3IucigpLCBjb2xvci5nKCksIGNvbG9yLmIoKSwgYWxwaGEpOworICBhdHRyaWJ1dGVzXy5yZXNlcnZlKDQpOworICBBZGRWZXJ0ZXgocmVjdC54KCksIHJlY3QueSgpLCBjb2xvcjMyKTsKKyAgQWRkVmVydGV4KHJlY3QueCgpLCByZWN0LmJvdHRvbSgpLCBjb2xvcjMyKTsKKyAgQWRkVmVydGV4KHJlY3QucmlnaHQoKSwgcmVjdC55KCksIGNvbG9yMzIpOworICBBZGRWZXJ0ZXgocmVjdC5yaWdodCgpLCByZWN0LmJvdHRvbSgpLCBjb2xvcjMyKTsKKyAgZ3JhcGhpY3Nfc3RhdGUtPlJlc2VydmVWZXJ0ZXhEYXRhKGF0dHJpYnV0ZXNfLnNpemUoKSAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcykpOworfQorCit2b2lkIERyYXdQb2x5Q29sb3I6OkV4ZWN1dGUoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHByb2dyYW1fbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeGVjdXRpb25TdGFnZSBzdGFnZSkgeworICBpZiAoc3RhZ2UgPT0ga1N0YWdlVXBkYXRlVmVydGV4QnVmZmVyKSB7CisgICAgdmVydGV4X2J1ZmZlcl8gPSBncmFwaGljc19zdGF0ZS0+QWxsb2NhdGVWZXJ0ZXhEYXRhKAorICAgICAgICBhdHRyaWJ1dGVzXy5zaXplKCkgKiBzaXplb2YoVmVydGV4QXR0cmlidXRlcykpOworICAgIG1lbWNweSh2ZXJ0ZXhfYnVmZmVyXywgJmF0dHJpYnV0ZXNfWzBdLAorICAgICAgICAgICBhdHRyaWJ1dGVzXy5zaXplKCkgKiBzaXplb2YoVmVydGV4QXR0cmlidXRlcykpOworICB9IGVsc2UgaWYgKHN0YWdlID09IGtTdGFnZVJhc3Rlcml6ZU5vcm1hbCkgeworICAgIFNoYWRlclByb2dyYW08U2hhZGVyVmVydGV4Q29sb3IsCisgICAgICAgICAgICAgICAgICBTaGFkZXJGcmFnbWVudENvbG9yPiogcHJvZ3JhbTsKKyAgICBwcm9ncmFtX21hbmFnZXItPkdldFByb2dyYW0oJnByb2dyYW0pOworICAgIGdyYXBoaWNzX3N0YXRlLT5Vc2VQcm9ncmFtKHByb2dyYW0tPkdldEhhbmRsZSgpKTsKKyAgICBncmFwaGljc19zdGF0ZS0+VXBkYXRlQ2xpcEFkanVzdG1lbnQoCisgICAgICAgIHByb2dyYW0tPkdldFZlcnRleFNoYWRlcigpLnVfY2xpcF9hZGp1c3RtZW50KCkpOworICAgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVUcmFuc2Zvcm1NYXRyaXgoCisgICAgICAgIHByb2dyYW0tPkdldFZlcnRleFNoYWRlcigpLnVfdmlld19tYXRyaXgoKSwKKyAgICAgICAgYmFzZV9zdGF0ZV8udHJhbnNmb3JtKTsKKyAgICBncmFwaGljc19zdGF0ZS0+U2Npc3NvcihiYXNlX3N0YXRlXy5zY2lzc29yLngoKSwgYmFzZV9zdGF0ZV8uc2Npc3Nvci55KCksCisgICAgICAgIGJhc2Vfc3RhdGVfLnNjaXNzb3Iud2lkdGgoKSwgYmFzZV9zdGF0ZV8uc2Npc3Nvci5oZWlnaHQoKSk7CisgICAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYlBvaW50ZXIoCisgICAgICAgIHByb2dyYW0tPkdldFZlcnRleFNoYWRlcigpLmFfcG9zaXRpb24oKSwgMywgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksIHZlcnRleF9idWZmZXJfICsKKyAgICAgICAgb2Zmc2V0b2YoVmVydGV4QXR0cmlidXRlcywgcG9zaXRpb24pKTsKKyAgICBncmFwaGljc19zdGF0ZS0+VmVydGV4QXR0cmliUG9pbnRlcigKKyAgICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkuYV9jb2xvcigpLCA0LCBHTF9VTlNJR05FRF9CWVRFLCBHTF9UUlVFLAorICAgICAgICBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksIHZlcnRleF9idWZmZXJfICsKKyAgICAgICAgb2Zmc2V0b2YoVmVydGV4QXR0cmlidXRlcywgY29sb3IpKTsKKyAgICBncmFwaGljc19zdGF0ZS0+VmVydGV4QXR0cmliRmluaXNoKCk7CisgICAgR0xfQ0FMTChnbERyYXdBcnJheXMoR0xfVFJJQU5HTEVfU1RSSVAsIDAsIDQpKTsKKyAgfQorfQorCit2b2lkIERyYXdQb2x5Q29sb3I6OkFkZFZlcnRleChmbG9hdCB4LCBmbG9hdCB5LCB1aW50MzJfdCBjb2xvcikgeworICBWZXJ0ZXhBdHRyaWJ1dGVzIGF0dHJpYnV0ZSA9IHsgeyB4LCB5LCBiYXNlX3N0YXRlXy5kZXB0aCB9LCBjb2xvciB9OworICBhdHRyaWJ1dGVzXy5wdXNoX2JhY2soYXR0cmlidXRlKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGVnbAorfSAgLy8gbmFtZXNwYWNlIHJhc3Rlcml6ZXIKK30gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3BvbHlfY29sb3IuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19wb2x5X2NvbG9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTNjMDJjOQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19wb2x5X2NvbG9yLmgKQEAgLTAsMCArMSw1OCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfRFJBV19QT0xZX0NPTE9SX0hfCisjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9EUkFXX1BPTFlfQ09MT1JfSF8KKworI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvYmFsdC9tYXRoL3JlY3RfZi5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9jb2xvcl9yZ2JhLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfb2JqZWN0LmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHJlbmRlcmVyIHsKK25hbWVzcGFjZSByYXN0ZXJpemVyIHsKK25hbWVzcGFjZSBlZ2wgeworCisvLyBIYW5kbGVzIGRyYXdpbmcgdmFyaW91cyBjb2xvcmVkIHBvbHlnb25zLgorY2xhc3MgRHJhd1BvbHlDb2xvciA6IHB1YmxpYyBEcmF3T2JqZWN0IHsKKyBwdWJsaWM6CisgIERyYXdQb2x5Q29sb3IoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICAgY29uc3QgQmFzZVN0YXRlJiBiYXNlX3N0YXRlLAorICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlJlY3RGJiByZWN0LAorICAgICAgICAgICAgICAgIGNvbnN0IHJlbmRlcl90cmVlOjpDb2xvclJHQkEmIGNvbG9yKTsKKworICB2b2lkIEV4ZWN1dGUoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgICAgICAgICAgICBTaGFkZXJQcm9ncmFtTWFuYWdlciogcHJvZ3JhbV9tYW5hZ2VyLAorICAgICAgICAgICAgICAgRXhlY3V0aW9uU3RhZ2Ugc3RhZ2UpIE9WRVJSSURFOworCisgcHJpdmF0ZToKKyAgdm9pZCBBZGRWZXJ0ZXgoZmxvYXQgeCwgZmxvYXQgeSwgdWludDMyX3QgY29sb3IpOworCisgIHN0cnVjdCBWZXJ0ZXhBdHRyaWJ1dGVzIHsKKyAgICBmbG9hdCBwb3NpdGlvblszXTsKKyAgICB1aW50MzJfdCBjb2xvcjsKKyAgfTsKKyAgc3RkOjp2ZWN0b3I8VmVydGV4QXR0cmlidXRlcz4gYXR0cmlidXRlc187CisKKyAgdWludDhfdCogdmVydGV4X2J1ZmZlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0RSQVdfUE9MWV9DT0xPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3RfdGV4dHVyZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3RleHR1cmUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFjNTY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3RleHR1cmUuY2MKQEAgLTAsMCArMSwxMDEgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3RleHR1cmUuaCIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgiCisjaW5jbHVkZSAiZWdsL2dlbmVyYXRlZF9zaGFkZXJfaW1wbC5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworbmFtZXNwYWNlIHsKK3N0cnVjdCBWZXJ0ZXhBdHRyaWJ1dGVzIHsKKyAgZmxvYXQgcG9zaXRpb25bM107CisgIGZsb2F0IHRleGNvb3JkWzJdOworfTsKK30gIC8vIG5hbWVzcGFjZQorCitEcmF3UmVjdFRleHR1cmU6OkRyYXdSZWN0VGV4dHVyZShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICBjb25zdCBCYXNlU3RhdGUmIGJhc2Vfc3RhdGUsCisgICAgY29uc3QgbWF0aDo6UmVjdEYmIHJlY3QsIGNvbnN0IGJhY2tlbmQ6OlRleHR1cmVFR0wqIHRleHR1cmUsCisgICAgY29uc3QgbWF0aDo6TWF0cml4M0YmIHRleGNvb3JkX3RyYW5zZm9ybSkKKyAgICA6IERyYXdPYmplY3QoYmFzZV9zdGF0ZSksCisgICAgICB0ZXhjb29yZF90cmFuc2Zvcm1fKHRleGNvb3JkX3RyYW5zZm9ybSksCisgICAgICByZWN0XyhyZWN0KSwKKyAgICAgIHRleHR1cmVfKHRleHR1cmUpLAorICAgICAgdmVydGV4X2J1ZmZlcl8oTlVMTCkgeworICBncmFwaGljc19zdGF0ZS0+UmVzZXJ2ZVZlcnRleERhdGEoNCAqIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSk7Cit9CisKK3ZvaWQgRHJhd1JlY3RUZXh0dXJlOjpFeGVjdXRlKEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHByb2dyYW1fbWFuYWdlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4ZWN1dGlvblN0YWdlIHN0YWdlKSB7CisgIGlmIChzdGFnZSA9PSBrU3RhZ2VVcGRhdGVWZXJ0ZXhCdWZmZXIpIHsKKyAgICBWZXJ0ZXhBdHRyaWJ1dGVzIGF0dHJpYnV0ZXNbNF0gPSB7CisgICAgICB7IHsgcmVjdF8ueCgpLCByZWN0Xy5ib3R0b20oKSwgYmFzZV9zdGF0ZV8uZGVwdGggfSwgICAgICAvLyB1diA9ICgwLDEpCisgICAgICAgIHsgdGV4Y29vcmRfdHJhbnNmb3JtXygwLCAxKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMCwgMiksCisgICAgICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAxKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMikgfSB9LAorICAgICAgeyB7IHJlY3RfLnJpZ2h0KCksIHJlY3RfLmJvdHRvbSgpLCBiYXNlX3N0YXRlXy5kZXB0aCB9LCAgLy8gdXYgPSAoMSwxKQorICAgICAgICB7IHRleGNvb3JkX3RyYW5zZm9ybV8oMCwgMCkgKyB0ZXhjb29yZF90cmFuc2Zvcm1fKDAsIDEpICsKKyAgICAgICAgICAgIHRleGNvb3JkX3RyYW5zZm9ybV8oMCwgMiksCisgICAgICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAwKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMSkgKworICAgICAgICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAyKSB9IH0sCisgICAgICB7IHsgcmVjdF8ucmlnaHQoKSwgcmVjdF8ueSgpLCBiYXNlX3N0YXRlXy5kZXB0aCB9LCAgICAgICAvLyB1diA9ICgxLDApCisgICAgICAgIHsgdGV4Y29vcmRfdHJhbnNmb3JtXygwLCAwKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMCwgMiksCisgICAgICAgICAgdGV4Y29vcmRfdHJhbnNmb3JtXygxLCAwKSArIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMikgfSB9LAorICAgICAgeyB7IHJlY3RfLngoKSwgcmVjdF8ueSgpLCBiYXNlX3N0YXRlXy5kZXB0aCB9LCAgICAgICAgICAgLy8gdXYgPSAoMCwwKQorICAgICAgICB7IHRleGNvb3JkX3RyYW5zZm9ybV8oMCwgMiksIHRleGNvb3JkX3RyYW5zZm9ybV8oMSwgMikgfSB9LAorICAgIH07CisgICAgQ09NUElMRV9BU1NFUlQoc2l6ZW9mKGF0dHJpYnV0ZXMpID09IDQgKiBzaXplb2YoVmVydGV4QXR0cmlidXRlcyksCisgICAgICAgICAgICAgICAgICAgYmFkX3BhZGRpbmcpOworICAgIHZlcnRleF9idWZmZXJfID0gZ3JhcGhpY3Nfc3RhdGUtPkFsbG9jYXRlVmVydGV4RGF0YSgKKyAgICAgICAgc2l6ZW9mKGF0dHJpYnV0ZXMpKTsKKyAgICBtZW1jcHkodmVydGV4X2J1ZmZlcl8sIGF0dHJpYnV0ZXMsIHNpemVvZihhdHRyaWJ1dGVzKSk7CisgIH0gZWxzZSBpZiAoc3RhZ2UgPT0ga1N0YWdlUmFzdGVyaXplTm9ybWFsKSB7CisgICAgU2hhZGVyUHJvZ3JhbTxTaGFkZXJWZXJ0ZXhUZXhjb29yZCwKKyAgICAgICAgICAgICAgICAgIFNoYWRlckZyYWdtZW50VGV4Y29vcmQ+KiBwcm9ncmFtOworICAgIHByb2dyYW1fbWFuYWdlci0+R2V0UHJvZ3JhbSgmcHJvZ3JhbSk7CisgICAgZ3JhcGhpY3Nfc3RhdGUtPlVzZVByb2dyYW0ocHJvZ3JhbS0+R2V0SGFuZGxlKCkpOworICAgIGdyYXBoaWNzX3N0YXRlLT5VcGRhdGVDbGlwQWRqdXN0bWVudCgKKyAgICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkudV9jbGlwX2FkanVzdG1lbnQoKSk7CisgICAgZ3JhcGhpY3Nfc3RhdGUtPlVwZGF0ZVRyYW5zZm9ybU1hdHJpeCgKKyAgICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkudV92aWV3X21hdHJpeCgpLAorICAgICAgICBiYXNlX3N0YXRlXy50cmFuc2Zvcm0pOworICAgIGdyYXBoaWNzX3N0YXRlLT5TY2lzc29yKGJhc2Vfc3RhdGVfLnNjaXNzb3IueCgpLCBiYXNlX3N0YXRlXy5zY2lzc29yLnkoKSwKKyAgICAgICAgYmFzZV9zdGF0ZV8uc2Npc3Nvci53aWR0aCgpLCBiYXNlX3N0YXRlXy5zY2lzc29yLmhlaWdodCgpKTsKKyAgICBncmFwaGljc19zdGF0ZS0+VmVydGV4QXR0cmliUG9pbnRlcigKKyAgICAgICAgcHJvZ3JhbS0+R2V0VmVydGV4U2hhZGVyKCkuYV9wb3NpdGlvbigpLCAzLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgIHNpemVvZihWZXJ0ZXhBdHRyaWJ1dGVzKSwgdmVydGV4X2J1ZmZlcl8gKworICAgICAgICBvZmZzZXRvZihWZXJ0ZXhBdHRyaWJ1dGVzLCBwb3NpdGlvbikpOworICAgIGdyYXBoaWNzX3N0YXRlLT5WZXJ0ZXhBdHRyaWJQb2ludGVyKAorICAgICAgICBwcm9ncmFtLT5HZXRWZXJ0ZXhTaGFkZXIoKS5hX3RleGNvb3JkKCksIDIsIEdMX0ZMT0FULCBHTF9GQUxTRSwKKyAgICAgICAgc2l6ZW9mKFZlcnRleEF0dHJpYnV0ZXMpLCB2ZXJ0ZXhfYnVmZmVyXyArCisgICAgICAgIG9mZnNldG9mKFZlcnRleEF0dHJpYnV0ZXMsIHRleGNvb3JkKSk7CisgICAgZ3JhcGhpY3Nfc3RhdGUtPlZlcnRleEF0dHJpYkZpbmlzaCgpOworICAgIGdyYXBoaWNzX3N0YXRlLT5BY3RpdmVUZXh0dXJlKAorICAgICAgICBwcm9ncmFtLT5HZXRGcmFnbWVudFNoYWRlcigpLnVfdGV4dHVyZV90ZXh1bml0KCkpOworICAgIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZSh0ZXh0dXJlXy0+R2V0VGFyZ2V0KCksIHRleHR1cmVfLT5nbF9oYW5kbGUoKSkpOworICAgIEdMX0NBTEwoZ2xEcmF3QXJyYXlzKEdMX1RSSUFOR0xFX0ZBTiwgMCwgNCkpOworICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlZ2wKK30gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCit9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3RleHR1cmUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19yZWN0X3RleHR1cmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RmYTdjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3RfdGV4dHVyZS5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0RSQVdfUkVDVF9URVhUVVJFX0hfCisjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9EUkFXX1JFQ1RfVEVYVFVSRV9IXworCisjaW5jbHVkZSAiY29iYWx0L21hdGgvbWF0cml4M19mLmgiCisjaW5jbHVkZSAiY29iYWx0L21hdGgvcmVjdF9mLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZHJhd19vYmplY3QuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworbmFtZXNwYWNlIHJhc3Rlcml6ZXIgeworbmFtZXNwYWNlIGVnbCB7CisKKy8vIEhhbmRsZXMgZHJhd2luZyBhIHRleHR1cmVkIHJlY3RhbmdsZS4KK2NsYXNzIERyYXdSZWN0VGV4dHVyZSA6IHB1YmxpYyBEcmF3T2JqZWN0IHsKKyBwdWJsaWM6CisgIERyYXdSZWN0VGV4dHVyZShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEJhc2VTdGF0ZSYgYmFzZV9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlJlY3RGJiByZWN0LAorICAgICAgICAgICAgICAgICAgY29uc3QgYmFja2VuZDo6VGV4dHVyZUVHTCogdGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6Ok1hdHJpeDNGJiB0ZXhjb29yZF90cmFuc2Zvcm0pOworCisgIHZvaWQgRXhlY3V0ZShHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgIFNoYWRlclByb2dyYW1NYW5hZ2VyKiBwcm9ncmFtX21hbmFnZXIsCisgICAgICAgICAgICAgICBFeGVjdXRpb25TdGFnZSBzdGFnZSkgT1ZFUlJJREU7CisKKyBwcml2YXRlOgorICBtYXRoOjpNYXRyaXgzRiB0ZXhjb29yZF90cmFuc2Zvcm1fOworICBtYXRoOjpSZWN0RiByZWN0XzsKKyAgY29uc3QgYmFja2VuZDo6VGV4dHVyZUVHTCogdGV4dHVyZV87CisKKyAgdWludDhfdCogdmVydGV4X2J1ZmZlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0RSQVdfUkVDVF9URVhUVVJFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2dyYXBoaWNzX3N0YXRlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9ncmFwaGljc19zdGF0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mY2RkOWRhCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9ncmFwaGljc19zdGF0ZS5jYwpAQCAtMCwwICsxLDMxOSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9ncmFwaGljc19zdGF0ZS5oIgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHJlbmRlcmVyIHsKK25hbWVzcGFjZSByYXN0ZXJpemVyIHsKK25hbWVzcGFjZSBlZ2wgeworCitHcmFwaGljc1N0YXRlOjpHcmFwaGljc1N0YXRlKCkKKyAgICA6IHZlcnRleF9kYXRhX3Jlc2VydmVkXyhrVmVydGV4RGF0YUFsaWdubWVudCAtIDEpLAorICAgICAgdmVydGV4X2RhdGFfYWxsb2NhdGVkXygwKSwKKyAgICAgIHZlcnRleF9kYXRhX2J1ZmZlcl9oYW5kbGVfKDApLAorICAgICAgdmVydGV4X2RhdGFfYnVmZmVyX3VwZGF0ZWRfKGZhbHNlKSB7CisgIEdMX0NBTEwoZ2xHZW5CdWZmZXJzKDEsICZ2ZXJ0ZXhfZGF0YV9idWZmZXJfaGFuZGxlXykpOworICBtZW1zZXQoY2xpcF9hZGp1c3RtZW50XywgMCwgc2l6ZW9mKGNsaXBfYWRqdXN0bWVudF8pKTsKKyAgUmVzZXQoKTsKK30KKworR3JhcGhpY3NTdGF0ZTo6fkdyYXBoaWNzU3RhdGUoKSB7CisgIGlmICh2ZXJ0ZXhfZGF0YV9idWZmZXJfaGFuZGxlXyAhPSAwKSB7CisgICAgR0xfQ0FMTChnbERlbGV0ZUJ1ZmZlcnMoMSwgJnZlcnRleF9kYXRhX2J1ZmZlcl9oYW5kbGVfKSk7CisgIH0KK30KKwordm9pZCBHcmFwaGljc1N0YXRlOjpTZXREaXJ0eSgpIHsKKyAgc3RhdGVfZGlydHlfID0gdHJ1ZTsKKyAgY2xpcF9hZGp1c3RtZW50X2RpcnR5XyA9IHRydWU7Cit9CisKK3ZvaWQgR3JhcGhpY3NTdGF0ZTo6QmVnaW5GcmFtZSgpIHsKKyAgRENIRUNLX0VRKHZlcnRleF9kYXRhX2FsbG9jYXRlZF8sIDApOworICBpZiAodmVydGV4X2RhdGFfcmVzZXJ2ZWRfID4gdmVydGV4X2RhdGFfYnVmZmVyXy5jYXBhY2l0eSgpKSB7CisgICAgdmVydGV4X2RhdGFfYnVmZmVyXy5yZXNlcnZlKHZlcnRleF9kYXRhX3Jlc2VydmVkXyk7CisgIH0KKyAgU2V0RGlydHkoKTsKK30KKwordm9pZCBHcmFwaGljc1N0YXRlOjpFbmRGcmFtZSgpIHsKKyAgLy8gUmVzZXQgdGhlIHZlcnRleCBkYXRhIGJ1ZmZlci4KKyAgdmVydGV4X2RhdGFfcmVzZXJ2ZWRfID0ga1ZlcnRleERhdGFBbGlnbm1lbnQgLSAxOworICB2ZXJ0ZXhfZGF0YV9hbGxvY2F0ZWRfID0gMDsKKyAgdmVydGV4X2RhdGFfYnVmZmVyX3VwZGF0ZWRfID0gZmFsc2U7CisgIFVzZVByb2dyYW0oMCk7Cit9CisKK3ZvaWQgR3JhcGhpY3NTdGF0ZTo6Q2xlYXIoKSB7CisgIGlmIChzdGF0ZV9kaXJ0eV8pIHsKKyAgICBSZXNldCgpOworICB9CisKKyAgR0xfQ0FMTChnbENsZWFyQ29sb3IoMC4wZiwgMC4wZiwgMC4wZiwgMC4wZikpOworICBHTF9DQUxMKGdsQ2xlYXJEZXB0aGYoRmFydGhlc3REZXB0aCgpKSk7CisgIEdMX0NBTEwoZ2xDbGVhcihHTF9DT0xPUl9CVUZGRVJfQklUIHwgR0xfREVQVEhfQlVGRkVSX0JJVCkpOworfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OlVzZVByb2dyYW0oR0x1aW50IHByb2dyYW0pIHsKKyAgaWYgKHN0YXRlX2RpcnR5XykgeworICAgIFJlc2V0KCk7CisgIH0KKworICBpZiAocHJvZ3JhbV8gIT0gcHJvZ3JhbSkgeworICAgIHByb2dyYW1fID0gcHJvZ3JhbTsKKyAgICBjbGlwX2FkanVzdG1lbnRfZGlydHlfID0gdHJ1ZTsKKyAgICBHTF9DQUxMKGdsVXNlUHJvZ3JhbShwcm9ncmFtKSk7CisgIH0KKworICBpZiAoYXJyYXlfYnVmZmVyX2hhbmRsZV8gIT0gdmVydGV4X2RhdGFfYnVmZmVyX2hhbmRsZV8pIHsKKyAgICBhcnJheV9idWZmZXJfaGFuZGxlXyA9IHZlcnRleF9kYXRhX2J1ZmZlcl9oYW5kbGVfOworICAgIEdMX0NBTEwoZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgdmVydGV4X2RhdGFfYnVmZmVyX2hhbmRsZV8pKTsKKyAgfQorCisgIC8vIERpc2FibGUgYW55IHZlcnRleCBhdHRyaWJ1dGUgYXJyYXlzIHRoYXQgd2lsbCBub3QgYmUgdXNlZC4KKyAgZGlzYWJsZV92ZXJ0ZXhfYXR0cmliX2FycmF5X21hc2tfID0gZW5hYmxlZF92ZXJ0ZXhfYXR0cmliX2FycmF5X21hc2tfOworfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OlZpZXdwb3J0KGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KSB7CisgIHZpZXdwb3J0XyA9IG1hdGg6OlJlY3QoeCwgeSwgd2lkdGgsIGhlaWdodCk7CisgIC8vIEluY29taW5nIG9yaWdpbiBpcyB0b3AtbGVmdCwgYnV0IEdMIG9yaWdpbiBpcyBib3R0b20tbGVmdCwgc28gZmxpcAorICAvLyB2ZXJ0aWNhbGx5LgorICBHTF9DQUxMKGdsVmlld3BvcnQoeCwgcmVuZGVyX3RhcmdldF9zaXplXy5oZWlnaHQoKSAtIHkgLSBoZWlnaHQsCisgICAgICAgICAgICAgICAgICAgICB3aWR0aCwgaGVpZ2h0KSk7Cit9CisKK3ZvaWQgR3JhcGhpY3NTdGF0ZTo6U2Npc3NvcihpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgeworICAvLyBJbmNvbWluZyBvcmlnaW4gaXMgdG9wLWxlZnQsIGJ1dCBHTCBvcmlnaW4gaXMgYm90dG9tLWxlZnQsIHNvIGZsaXAKKyAgLy8gdmVydGljYWxseS4KKyAgc2Npc3Nvcl8gPSBtYXRoOjpSZWN0KHgsIHksIHdpZHRoLCBoZWlnaHQpOworICBHTF9DQUxMKGdsU2Npc3Nvcih4LCByZW5kZXJfdGFyZ2V0X3NpemVfLmhlaWdodCgpIC0geSAtIGhlaWdodCwKKyAgICAgICAgICAgICAgICAgICAgd2lkdGgsIGhlaWdodCkpOworfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OkVuYWJsZUJsZW5kKCkgeworICBpZiAoIWJsZW5kX2VuYWJsZWRfKSB7CisgICAgYmxlbmRfZW5hYmxlZF8gPSB0cnVlOworICAgIEdMX0NBTEwoZ2xFbmFibGUoR0xfQkxFTkQpKTsKKyAgfQorfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OkRpc2FibGVCbGVuZCgpIHsKKyAgaWYgKGJsZW5kX2VuYWJsZWRfKSB7CisgICAgYmxlbmRfZW5hYmxlZF8gPSBmYWxzZTsKKyAgICBHTF9DQUxMKGdsRGlzYWJsZShHTF9CTEVORCkpOworICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NTdGF0ZTo6RW5hYmxlRGVwdGhUZXN0KCkgeworICBpZiAoIWRlcHRoX3Rlc3RfZW5hYmxlZF8pIHsKKyAgICBkZXB0aF90ZXN0X2VuYWJsZWRfID0gdHJ1ZTsKKyAgICBHTF9DQUxMKGdsRW5hYmxlKEdMX0RFUFRIX1RFU1QpKTsKKyAgfQorfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OkRpc2FibGVEZXB0aFRlc3QoKSB7CisgIGlmIChkZXB0aF90ZXN0X2VuYWJsZWRfKSB7CisgICAgZGVwdGhfdGVzdF9lbmFibGVkXyA9IGZhbHNlOworICAgIEdMX0NBTEwoZ2xEaXNhYmxlKEdMX0RFUFRIX1RFU1QpKTsKKyAgfQorfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OkVuYWJsZURlcHRoV3JpdGUoKSB7CisgIGlmICghZGVwdGhfd3JpdGVfZW5hYmxlZF8pIHsKKyAgICBkZXB0aF93cml0ZV9lbmFibGVkXyA9IHRydWU7CisgICAgR0xfQ0FMTChnbERlcHRoTWFzayhHTF9UUlVFKSk7CisgIH0KK30KKwordm9pZCBHcmFwaGljc1N0YXRlOjpEaXNhYmxlRGVwdGhXcml0ZSgpIHsKKyAgaWYgKGRlcHRoX3dyaXRlX2VuYWJsZWRfKSB7CisgICAgZGVwdGhfd3JpdGVfZW5hYmxlZF8gPSBmYWxzZTsKKyAgICBHTF9DQUxMKGdsRGVwdGhNYXNrKEdMX0ZBTFNFKSk7CisgIH0KK30KKwordm9pZCBHcmFwaGljc1N0YXRlOjpBY3RpdmVUZXh0dXJlKEdMZW51bSB0ZXh0dXJlX3VuaXQpIHsKKyAgaWYgKHRleHR1cmVfdW5pdF8gIT0gdGV4dHVyZV91bml0KSB7CisgICAgdGV4dHVyZV91bml0XyA9IHRleHR1cmVfdW5pdDsKKyAgICBHTF9DQUxMKGdsQWN0aXZlVGV4dHVyZSh0ZXh0dXJlX3VuaXQpKTsKKyAgfQorfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OlNldENsaXBBZGp1c3RtZW50KGNvbnN0IG1hdGg6OlNpemUmIHJlbmRlcl90YXJnZXRfc2l6ZSkgeworICByZW5kZXJfdGFyZ2V0X3NpemVfID0gcmVuZGVyX3RhcmdldF9zaXplOworICBjbGlwX2FkanVzdG1lbnRfZGlydHlfID0gdHJ1ZTsKKworICAvLyBDbGlwIGFkanVzdG1lbnQgaXMgYSB2ZWM0IHVzZWQgdG8gdHJhbnNmb3JtIGEgZ2l2ZW4gMkQgcG9zaXRpb24gZnJvbSB2aWV3CisgIC8vIHNwYWNlIHRvIGNsaXAgc3BhY2UuIEdpdmVuIGEgMkQgcG9zaXRpb24sIHBvcywgdGhlIG91dHB1dCBpczoKKyAgLy8gb3V0cHV0ID0gcG9zICogY2xpcF9hZGp1c3RtZW50Xy54eSArIGNsaXBfYWRqdXN0bWVudF8uencKKworICBpZiAocmVuZGVyX3RhcmdldF9zaXplLndpZHRoKCkgPiAwKSB7CisgICAgY2xpcF9hZGp1c3RtZW50X1swXSA9IDIuMGYgLyByZW5kZXJfdGFyZ2V0X3NpemUud2lkdGgoKTsKKyAgICBjbGlwX2FkanVzdG1lbnRfWzJdID0gLTEuMGY7CisgIH0gZWxzZSB7CisgICAgY2xpcF9hZGp1c3RtZW50X1swXSA9IDAuMGY7CisgICAgY2xpcF9hZGp1c3RtZW50X1syXSA9IDAuMGY7CisgIH0KKworICBpZiAocmVuZGVyX3RhcmdldF9zaXplLmhlaWdodCgpID4gMCkgeworICAgIC8vIEluY29taW5nIG9yaWdpbiBpcyB0b3AtbGVmdCwgYnV0IEdMIG9yaWdpbiBpcyBib3R0b20tbGVmdCwgc28gZmxpcCB0aGUKKyAgICAvLyBpbWFnZSB2ZXJ0aWNhbGx5LgorICAgIGNsaXBfYWRqdXN0bWVudF9bMV0gPSAtMi4wZiAvIHJlbmRlcl90YXJnZXRfc2l6ZS5oZWlnaHQoKTsKKyAgICBjbGlwX2FkanVzdG1lbnRfWzNdID0gMS4wZjsKKyAgfSBlbHNlIHsKKyAgICBjbGlwX2FkanVzdG1lbnRfWzFdID0gMC4wZjsKKyAgICBjbGlwX2FkanVzdG1lbnRfWzNdID0gMC4wZjsKKyAgfQorfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OlVwZGF0ZUNsaXBBZGp1c3RtZW50KEdMaW50IGhhbmRsZSkgeworICBpZiAoY2xpcF9hZGp1c3RtZW50X2RpcnR5XykgeworICAgIGNsaXBfYWRqdXN0bWVudF9kaXJ0eV8gPSBmYWxzZTsKKyAgICBHTF9DQUxMKGdsVW5pZm9ybTRmdihoYW5kbGUsIDEsIGNsaXBfYWRqdXN0bWVudF8pKTsKKyAgfQorfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OlVwZGF0ZVRyYW5zZm9ybU1hdHJpeChHTGludCBoYW5kbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpNYXRyaXgzRiYgdHJhbnNmb3JtKSB7CisgIC8vIE1hbnVhbGx5IHRyYW5zcG9zZSBvdXIgcm93LW1ham9yIG1hdHJpeCB0byBjb2x1bW4tbWFqb3IuIERvbid0IHJlbHkgb24KKyAgLy8gZ2xVbmlmb3JtTWF0cml4M2Z2IHRvIGRvIGl0LCBzaW5jZSB0aGUgZHJpdmVyIG1heSBub3Qgc3VwcG9ydCB0aGF0LgorICBmbG9hdCB0cmFuc3Bvc2VbXSA9IHsKKyAgICB0cmFuc2Zvcm0oMCwgMCksIHRyYW5zZm9ybSgxLCAwKSwgdHJhbnNmb3JtKDIsIDApLAorICAgIHRyYW5zZm9ybSgwLCAxKSwgdHJhbnNmb3JtKDEsIDEpLCB0cmFuc2Zvcm0oMiwgMSksCisgICAgdHJhbnNmb3JtKDAsIDIpLCB0cmFuc2Zvcm0oMSwgMiksIHRyYW5zZm9ybSgyLCAyKQorICB9OworICBHTF9DQUxMKGdsVW5pZm9ybU1hdHJpeDNmdihoYW5kbGUsIDEsIEdMX0ZBTFNFLCB0cmFuc3Bvc2UpKTsKK30KKwordm9pZCBHcmFwaGljc1N0YXRlOjpSZXNlcnZlVmVydGV4RGF0YShzaXplX3QgYnl0ZXMpIHsKKyAgRENIRUNLX0VRKHZlcnRleF9kYXRhX2FsbG9jYXRlZF8sIDApOworICBEQ0hFQ0soIXZlcnRleF9kYXRhX2J1ZmZlcl91cGRhdGVkXyk7CisgIHZlcnRleF9kYXRhX3Jlc2VydmVkXyArPSBieXRlcyArIChrVmVydGV4RGF0YUFsaWdubWVudCAtIDEpICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIH4oa1ZlcnRleERhdGFBbGlnbm1lbnQgLSAxKTsKK30KKwordWludDhfdCogR3JhcGhpY3NTdGF0ZTo6QWxsb2NhdGVWZXJ0ZXhEYXRhKHNpemVfdCBieXRlcykgeworICBEQ0hFQ0soIXZlcnRleF9kYXRhX2J1ZmZlcl91cGRhdGVkXyk7CisKKyAgLy8gRW5zdXJlIHRoZSBzdGFydCBhZGRyZXNzIGlzIGFsaWduZWQuCisgIHVpbnRwdHJfdCBzdGFydF9hZGRyZXNzID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90PigmdmVydGV4X2RhdGFfYnVmZmVyX1swXSkgKworICAgICAgdmVydGV4X2RhdGFfYWxsb2NhdGVkXyArIChrVmVydGV4RGF0YUFsaWdubWVudCAtIDEpICYKKyAgICAgIH4oa1ZlcnRleERhdGFBbGlnbm1lbnQgLSAxKTsKKworICB2ZXJ0ZXhfZGF0YV9hbGxvY2F0ZWRfID0gc3RhcnRfYWRkcmVzcyAtCisgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4oJnZlcnRleF9kYXRhX2J1ZmZlcl9bMF0pICsgYnl0ZXM7CisKKyAgRENIRUNLX0xFKHZlcnRleF9kYXRhX2FsbG9jYXRlZF8sIHZlcnRleF9kYXRhX3Jlc2VydmVkXyk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4X3QqPihzdGFydF9hZGRyZXNzKTsKK30KKwordm9pZCBHcmFwaGljc1N0YXRlOjpVcGRhdGVWZXJ0ZXhEYXRhKCkgeworICBEQ0hFQ0soIXZlcnRleF9kYXRhX2J1ZmZlcl91cGRhdGVkXyk7CisgIHZlcnRleF9kYXRhX2J1ZmZlcl91cGRhdGVkXyA9IHRydWU7CisgIEdMX0NBTEwoZ2xCaW5kQnVmZmVyKEdMX0FSUkFZX0JVRkZFUiwgdmVydGV4X2RhdGFfYnVmZmVyX2hhbmRsZV8pKTsKKyAgaWYgKHZlcnRleF9kYXRhX2FsbG9jYXRlZF8gPiAwKSB7CisgICAgR0xfQ0FMTChnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCB2ZXJ0ZXhfZGF0YV9hbGxvY2F0ZWRfLAorICAgICAgICAgICAgICAgICAgICAgICAgICZ2ZXJ0ZXhfZGF0YV9idWZmZXJfWzBdLCBHTF9TVFJFQU1fRFJBVykpOworICB9Cit9CisKK3ZvaWQgR3JhcGhpY3NTdGF0ZTo6VmVydGV4QXR0cmliUG9pbnRlcihHTGludCBpbmRleCwgR0xpbnQgc2l6ZSwgR0xlbnVtIHR5cGUsCisgICAgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCB2b2lkKiBjbGllbnRfcG9pbnRlcikgeworICBjb25zdCBHTHZvaWQqIGdsX3BvaW50ZXIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IEdMdm9pZCo+CisgICAgICAocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OF90Kj4oY2xpZW50X3BvaW50ZXIpIC0KKyAgICAgICZ2ZXJ0ZXhfZGF0YV9idWZmZXJfWzBdKTsKKyAgR0xfQ0FMTChnbFZlcnRleEF0dHJpYlBvaW50ZXIoaW5kZXgsIHNpemUsIHR5cGUsIG5vcm1hbGl6ZWQsIHN0cmlkZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xfcG9pbnRlcikpOworCisgIC8vIEVuc3VyZSB0aGUgdmVydGV4IGF0dHJpYiBhcnJheSBpcyBlbmFibGVkLgorICBjb25zdCB1aW50MzJfdCBtYXNrID0gMSA8PCBpbmRleDsKKyAgaWYgKChlbmFibGVkX3ZlcnRleF9hdHRyaWJfYXJyYXlfbWFza18gJiBtYXNrKSA9PSAwKSB7CisgICAgZW5hYmxlZF92ZXJ0ZXhfYXR0cmliX2FycmF5X21hc2tfIHw9IG1hc2s7CisgICAgR0xfQ0FMTChnbEVuYWJsZVZlcnRleEF0dHJpYkFycmF5KGluZGV4KSk7CisgIH0KKyAgZGlzYWJsZV92ZXJ0ZXhfYXR0cmliX2FycmF5X21hc2tfICY9IH5tYXNrOworfQorCit2b2lkIEdyYXBoaWNzU3RhdGU6OlZlcnRleEF0dHJpYkZpbmlzaCgpIHsKKyAgZm9yIChpbnQgaW5kZXggPSAwOyBkaXNhYmxlX3ZlcnRleF9hdHRyaWJfYXJyYXlfbWFza18gIT0gMDsgKytpbmRleCkgeworICAgIGlmICgoZGlzYWJsZV92ZXJ0ZXhfYXR0cmliX2FycmF5X21hc2tfICYgMSkgIT0gMCkgeworICAgICAgR0xfQ0FMTChnbERpc2FibGVWZXJ0ZXhBdHRyaWJBcnJheShpbmRleCkpOworICAgIH0KKyAgICBkaXNhYmxlX3ZlcnRleF9hdHRyaWJfYXJyYXlfbWFza18gPj49IDE7CisgIH0KK30KKworLy8gc3RhdGljCitmbG9hdCBHcmFwaGljc1N0YXRlOjpGYXJ0aGVzdERlcHRoKCkgeworICByZXR1cm4gMS4wZjsKK30KKworLy8gc3RhdGljCitmbG9hdCBHcmFwaGljc1N0YXRlOjpOZXh0Q2xvc2VzdERlcHRoKGZsb2F0IGRlcHRoKSB7CisgIC8vIE91ciB2ZXJ0ZXggc2hhZGVycyBwYXNzIGRlcHRoIHN0cmFpZ2h0IHRvIGdsX1Bvc2l0aW9uIHdpdGhvdXQgYW55CisgIC8vIHRyYW5zZm9ybWF0aW9uLCBhbmQgZ2xfUG9zaXRpb24udyBpcyBhbHdheXMgMS4gVG8gYXZvaWQgY2xpcHBpbmcsCisgIC8vIHxkZXB0aHwgc2hvdWxkIGJlIFstMSwxXS4gSG93ZXZlciwgdGhpcyByYW5nZSBpcyB0aGVuIGNvbnZlcnRlZCB0byBbMCwxXSwKKyAgLy8gdGhlbiBzY2FsZWQgYnkgKDJeTiAtIDEpIHRvIGJlIHRoZSBmaW5hbCB2YWx1ZSBpbiB0aGUgZGVwdGggYnVmZmVyLCB3aGVyZQorICAvLyBOID0gbnVtYmVyIG9mIGJpdHMgaW4gdGhlIGRlcHRoIGJ1ZmZlci4KKworICAvLyBJbiB0aGUgd29yc3QgY2FzZSwgd2UncmUgdXNpbmcgYSAxNi1iaXQgZGVwdGggYnVmZmVyLiBTbyBlYWNoIHN0ZXAgaW4KKyAgLy8gZGVwdGggaXMgMiAvICgyXk4gLSAxKSAoc2luY2UgZGVwdGggaXMgY29udmVydGVkIGZyb20gWy0xLDFdIHRvIFswLDFdKS4KKyAgLy8gQWxzbywgYmVjYXVzZSB0aGUgZGVmYXVsdCBkZXB0aCBjb21wYXJlIGZ1bmN0aW9uIGlzIEdMX0xFU1MsIHZlcnRpY2VzIHdpdGgKKyAgLy8gc21hbGxlciBkZXB0aCB2YWx1ZXMgYXBwZWFyIG9uIHRvcCBvZiBvdGhlcnMuCisgIHJldHVybiBkZXB0aCAtIDIuMGYgLyA2NTUzNS4wZjsKK30KKwordm9pZCBHcmFwaGljc1N0YXRlOjpSZXNldCgpIHsKKyAgcHJvZ3JhbV8gPSAwOworICBHTF9DQUxMKGdsVXNlUHJvZ3JhbSgwKSk7CisKKyAgVmlld3BvcnQodmlld3BvcnRfLngoKSwgdmlld3BvcnRfLnkoKSwgdmlld3BvcnRfLndpZHRoKCksIHZpZXdwb3J0Xy5oZWlnaHQoKSk7CisgIFNjaXNzb3Ioc2Npc3Nvcl8ueCgpLCBzY2lzc29yXy55KCksIHNjaXNzb3JfLndpZHRoKCksIHNjaXNzb3JfLmhlaWdodCgpKTsKKworICBhcnJheV9idWZmZXJfaGFuZGxlXyA9IDA7CisgIHRleHR1cmVfdW5pdF8gPSAwOworICBlbmFibGVkX3ZlcnRleF9hdHRyaWJfYXJyYXlfbWFza18gPSAwOworICBkaXNhYmxlX3ZlcnRleF9hdHRyaWJfYXJyYXlfbWFza18gPSAwOworICBjbGlwX2FkanVzdG1lbnRfZGlydHlfID0gdHJ1ZTsKKworICBibGVuZF9lbmFibGVkXyA9IHRydWU7CisgIERpc2FibGVCbGVuZCgpOworICBHTF9DQUxMKGdsQmxlbmRGdW5jKEdMX09ORSwgR0xfT05FX01JTlVTX1NSQ19BTFBIQSkpOworCisgIGRlcHRoX3Rlc3RfZW5hYmxlZF8gPSBmYWxzZTsKKyAgRW5hYmxlRGVwdGhUZXN0KCk7CisgIEdMX0NBTEwoZ2xEZXB0aEZ1bmMoR0xfTEVTUykpOworICBHTF9DQUxMKGdsRGVwdGhSYW5nZWYoMC4wZiwgMS4wZikpOworCisgIGRlcHRoX3dyaXRlX2VuYWJsZWRfID0gZmFsc2U7CisgIEVuYWJsZURlcHRoV3JpdGUoKTsKKworICBHTF9DQUxMKGdsRGlzYWJsZShHTF9ESVRIRVIpKTsKKyAgR0xfQ0FMTChnbERpc2FibGUoR0xfQ1VMTF9GQUNFKSk7CisgIEdMX0NBTEwoZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCkpOworICBHTF9DQUxMKGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCkpOworCisgIHN0YXRlX2RpcnR5XyA9IGZhbHNlOworfQorCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2dyYXBoaWNzX3N0YXRlLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2dyYXBoaWNzX3N0YXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWRiMmExZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvZ3JhcGhpY3Nfc3RhdGUuaApAQCAtMCwwICsxLDE1NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfR1JBUEhJQ1NfU1RBVEVfSF8KKyNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0dSQVBISUNTX1NUQVRFX0hfCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC9tYXRyaXgzX2YuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC9yZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L21hdGgvc2l6ZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworLy8gQ2xhc3MgcmVwcmVzZW50aW5nIGFsbCB0aGUgR0wgZ3JhcGhpY3Mgc3RhdGVzIHBlcnRpbmVudCB0byByZW5kZXJpbmcuIFRoaXMKKy8vIGNhY2hlcyB0aGUgc3RhdGUgaW5mb3JtYXRpb24gYW5kIGhlbHBzIHJlZHVjZSByZWR1bmRhbnQgR0wgY2FsbHMuCitjbGFzcyBHcmFwaGljc1N0YXRlIHsKKyBwdWJsaWM6CisgIEdyYXBoaWNzU3RhdGUoKTsKKyAgfkdyYXBoaWNzU3RhdGUoKTsKKworICAvLyBNYXJrIGFsbCBjYWNoZWQgc3RhdGVzIGFzIGRpcnR5LiBHTCBjb21tYW5kcyB0byByZXNldCB0aGUgc3RhdGUgd2lsbCBiZQorICAvLyBleGVjdXRlZCBvbiB0aGUgbmV4dCBjYWxsIHRvIENsZWFyIG9yIFVzZVByb2dyYW0uCisgIHZvaWQgU2V0RGlydHkoKTsKKworICAvLyBTcGVjaWZ5IHRoZSBiZWdpbm5pbmcgb2YgYSBuZXcgcmVuZGVyIGZyYW1lLgorICB2b2lkIEJlZ2luRnJhbWUoKTsKKworICAvLyBTcGVjaWZ5IHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgcmVuZGVyIGZyYW1lLgorICB2b2lkIEVuZEZyYW1lKCk7CisKKyAgLy8gQ2xlYXIgdGhlIGNvbG9yIGFuZCBkZXB0aCBidWZmZXJzLgorICB2b2lkIENsZWFyKCk7CisKKyAgLy8gU2V0IHRoZSBjdXJyZW50IHNoYWRlciBwcm9ncmFtIHRvIGJlIHVzZWQuCisgIHZvaWQgVXNlUHJvZ3JhbShHTHVpbnQgcHJvZ3JhbSk7CisKKyAgLy8gU2V0IHRoZSB2aWV3cG9ydC4KKyAgdm9pZCBWaWV3cG9ydChpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCk7CisgIGNvbnN0IG1hdGg6OlJlY3QmIEdldFZpZXdwb3J0KCkgY29uc3QgeyByZXR1cm4gdmlld3BvcnRfOyB9CisKKyAgLy8gU2V0IHRoZSBzY2lzc29yIGJveC4KKyAgdm9pZCBTY2lzc29yKGludCB4LCBpbnQgeSwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKKyAgY29uc3QgbWF0aDo6UmVjdCYgR2V0U2Npc3NvcigpIGNvbnN0IHsgcmV0dXJuIHNjaXNzb3JfOyB9CisKKyAgLy8gQ29udHJvbCBibGVuZGluZyBzdGF0ZS4KKyAgLy8gRGVmYXVsdCA9IGRpc2FibGVkLgorICB2b2lkIEVuYWJsZUJsZW5kKCk7CisgIHZvaWQgRGlzYWJsZUJsZW5kKCk7CisKKyAgLy8gQ29udHJvbCBkZXB0aCB0ZXN0aW5nLgorICAvLyBEZWZhdWx0ID0gZW5hYmxlZC4KKyAgdm9pZCBFbmFibGVEZXB0aFRlc3QoKTsKKyAgdm9pZCBEaXNhYmxlRGVwdGhUZXN0KCk7CisKKyAgLy8gQ29udHJvbCB3cml0aW5nIHRvIHRoZSBkZXB0aCBidWZmZXIuCisgIC8vIERlZmF1bHQgPSBlbmFibGVkLgorICB2b2lkIEVuYWJsZURlcHRoV3JpdGUoKTsKKyAgdm9pZCBEaXNhYmxlRGVwdGhXcml0ZSgpOworCisgIC8vIE1ha2UgdGhlIHNwZWNpZmllZCB0ZXh0dXJlIHVuaXQgYWN0aXZlLgorICB2b2lkIEFjdGl2ZVRleHR1cmUoR0xlbnVtIHRleHR1cmVfdW5pdCk7CisKKyAgLy8gU2V0IHRoZSBjbGlwIGFkanVzdG1lbnQgdG8gYmUgdXNlZCB3aXRoIHZlcnRleCBzaGFkZXJzLiBUaGlzIHRyYW5zZm9ybXMKKyAgLy8gdGhlIHZlcnRleCBjb29yZGluYXRlcyBmcm9tIHZpZXcgc3BhY2UgdG8gY2xpcCBzcGFjZS4KKyAgdm9pZCBTZXRDbGlwQWRqdXN0bWVudChjb25zdCBtYXRoOjpTaXplJiByZW5kZXJfdGFyZ2V0X3NpemUpOworCisgIC8vIFVwZGF0ZSB0aGUgR1BVIHdpdGggdGhlIGN1cnJlbnQgY2xpcCBhZGp1c3RtZW50IHNldHRpbmdzLgorICB2b2lkIFVwZGF0ZUNsaXBBZGp1c3RtZW50KEdMaW50IGhhbmRsZSk7CisKKyAgLy8gVXBkYXRlIHRoZSBHUFUgd2l0aCB0aGUgc3BlY2lmaWVkIHRyYW5zZm9ybSBtYXRyaXguCisgIHZvaWQgVXBkYXRlVHJhbnNmb3JtTWF0cml4KEdMaW50IGhhbmRsZSwgY29uc3QgbWF0aDo6TWF0cml4M0YmIHRyYW5zZm9ybSk7CisKKyAgLy8gUmVzZXJ2ZSB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBmb3IgdmVydGV4IGRhdGEgaW4gdGhlIHVwY29taW5nCisgIC8vIGZyYW1lLiBUaGlzIG11c3QgYmUgY2FsbGVkIG91dHNpZGUgb2YgYSByZW5kZXIgZnJhbWUgKGkuZS4gYmVmb3JlCisgIC8vIEJlZ2luRnJhbWUgLyBhZnRlciBFbmRGcmFtZSkuCisgIHZvaWQgUmVzZXJ2ZVZlcnRleERhdGEoc2l6ZV90IGJ5dGVzKTsKKworICAvLyBSZXR1cm5zIGEgY2xpZW50LXNpZGUgcG9pbnRlciB0byB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBieXRlcyBpbiB0aGUKKyAgLy8gdmVydGV4IGRhdGEgYnVmZmVyLiBUaGUgbnVtYmVyIG9mIGJ5dGVzIGFsbG9jYXRlZCBmb3IgYW55IGdpdmVuIGZyYW1lCisgIC8vIHNob3VsZCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIG51bWJlciBvZiBieXRlcyByZXNlcnZlZC4gVGhpcyBtdXN0CisgIC8vIGJlIGRvbmUgYWZ0ZXIgYWxsIGNhbGxzIHRvIFJlc2VydmVWZXJ0ZXhEYXRhIGZvciBhIGdpdmVuIHJlbmRlciBmcmFtZS4KKyAgdWludDhfdCogQWxsb2NhdGVWZXJ0ZXhEYXRhKHNpemVfdCBieXRlcyk7CisKKyAgLy8gVXBkYXRlIHRoZSBHUFUgd2l0aCB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgdmVydGV4IGRhdGEgYnVmZmVyLiBUaGlzCisgIC8vIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLCBhZnRlciBCZWdpbkZyYW1lKCkuCisgIHZvaWQgVXBkYXRlVmVydGV4RGF0YSgpOworCisgIC8vIFNwZWNpZnkgdmVydGV4IGF0dHJpYnV0ZSBkYXRhIHRoYXQgdGhlIGN1cnJlbnQgcHJvZ3JhbSB3aWxsIHVzZS4KKyAgLy8gfGNsaWVudF9wb2ludGVyfCBzaG91bGQgYmUgd2l0aGluIHRoZSByYW5nZSBvZiBhZGRyZXNzZXMgcmV0dXJuZWQgYnkKKyAgLy8gQWxsb2NhdGVWZXJ0ZXhEYXRhLgorICB2b2lkIFZlcnRleEF0dHJpYlBvaW50ZXIoR0xpbnQgaW5kZXgsIEdMaW50IHNpemUsIEdMZW51bSB0eXBlLAorICAgICAgR0xib29sZWFuIG5vcm1hbGl6ZWQsIEdMc2l6ZWkgc3RyaWRlLCBjb25zdCB2b2lkKiBjbGllbnRfcG9pbnRlcik7CisKKyAgLy8gRGlzYWJsZSBhbnkgdmVydGV4IGF0dHJpYiBhcnJheXMgdGhhdCB0aGUgcHJldmlvdXMgcHJvZ3JhbSB1c2VkICh2aWEKKyAgLy8gVmVydGV4QXR0cmliUG9pbnRlciksIGJ1dCB0aGUgY3VycmVudCBwcm9ncmFtIGRvZXMgbm90LgorICB2b2lkIFZlcnRleEF0dHJpYkZpbmlzaCgpOworCisgIC8vIFJldHVybiB0aGUgZmFydGhlc3QgZGVwdGggdmFsdWUuCisgIHN0YXRpYyBmbG9hdCBGYXJ0aGVzdERlcHRoKCk7CisKKyAgLy8gUmV0dXJuIHRoZSBuZXh0IGNsb3Nlc3QgZGVwdGggdmFsdWUuIFZlcnRpY2VzIHVzaW5nIHRoZSBvdXRwdXQgZGVwdGggYXJlCisgIC8vIGd1YXJhbnRlZWQgdG8gcmVuZGVyIG9uIHRvcCBvZiB2ZXJ0aWNlcyB1c2luZyB0aGUgaW5jb21pbmcgZGVwdGguCisgIHN0YXRpYyBmbG9hdCBOZXh0Q2xvc2VzdERlcHRoKGZsb2F0IGRlcHRoKTsKKworIHByaXZhdGU6CisgIHZvaWQgUmVzZXQoKTsKKworICBtYXRoOjpSZWN0IHZpZXdwb3J0XzsKKyAgbWF0aDo6UmVjdCBzY2lzc29yXzsKKyAgbWF0aDo6U2l6ZSByZW5kZXJfdGFyZ2V0X3NpemVfOworCisgIEdMdWludCBwcm9ncmFtXzsKKyAgR0x1aW50IGFycmF5X2J1ZmZlcl9oYW5kbGVfOworICBHTGVudW0gdGV4dHVyZV91bml0XzsKKyAgdWludDMyX3QgZW5hYmxlZF92ZXJ0ZXhfYXR0cmliX2FycmF5X21hc2tfOworICB1aW50MzJfdCBkaXNhYmxlX3ZlcnRleF9hdHRyaWJfYXJyYXlfbWFza187CisgIGZsb2F0IGNsaXBfYWRqdXN0bWVudF9bNF07CisgIGJvb2wgY2xpcF9hZGp1c3RtZW50X2RpcnR5XzsKKyAgYm9vbCBzdGF0ZV9kaXJ0eV87CisgIGJvb2wgYmxlbmRfZW5hYmxlZF87CisgIGJvb2wgZGVwdGhfdGVzdF9lbmFibGVkXzsKKyAgYm9vbCBkZXB0aF93cml0ZV9lbmFibGVkXzsKKworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtWZXJ0ZXhEYXRhQWxpZ25tZW50ID0gNDsKKyAgc3RkOjp2ZWN0b3I8dWludDhfdD4gdmVydGV4X2RhdGFfYnVmZmVyXzsKKyAgc2l6ZV90IHZlcnRleF9kYXRhX3Jlc2VydmVkXzsKKyAgc2l6ZV90IHZlcnRleF9kYXRhX2FsbG9jYXRlZF87CisgIEdMdWludCB2ZXJ0ZXhfZGF0YV9idWZmZXJfaGFuZGxlXzsKKyAgYm9vbCB2ZXJ0ZXhfZGF0YV9idWZmZXJfdXBkYXRlZF87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX0dSQVBISUNTX1NUQVRFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjgwZTg0OAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvaGFyZHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMCwwICsxLDI3OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmgiCisKKyNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiYmFzZS90aHJlYWRpbmcvdGhyZWFkX2NoZWNrZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZnJhbWVidWZmZXIuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3NfY29udGV4dC5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19zeXN0ZW0uaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC91dGlscy5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9mcmFtZV9yYXRlX3Rocm90dGxlci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9ncmFwaGljc19zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW1fbWFuYWdlci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrQ2FudmFzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tSZWZDbnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1N1cmZhY2UuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1N1cmZhY2VQcm9wcy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9ncHUvR3JDb250ZXh0LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2dwdS9HclJlbmRlclRhcmdldC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9ncHUvR3JUeXBlcy5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworY2xhc3MgSGFyZHdhcmVSYXN0ZXJpemVyOjpJbXBsIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IEltcGwoYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LAorICAgICAgICAgICAgICAgIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpOworICB+SW1wbCgpOworCisgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKKyAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYWNrZW5kOjpSZW5kZXJUYXJnZXQ+JiByZW5kZXJfdGFyZ2V0LAorICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworICBiYWNrZW5kOjpUZXh0dXJlRUdMKiBTdWJtaXRUb0ZhbGxiYWNrUmFzdGVyaXplcigKKyAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKKyAgICAgIGNvbnN0IG1hdGg6OlNpemUmIHZpZXdwb3J0X3NpemUpOworCisgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiBHZXRSZXNvdXJjZVByb3ZpZGVyKCkgeworICAgIHJldHVybiBmYWxsYmFja19yYXN0ZXJpemVyXy0+R2V0UmVzb3VyY2VQcm92aWRlcigpOworICB9CisKKyBwcml2YXRlOgorICBHckNvbnRleHQqIEdldEdyQ29udGV4dCgpIHsKKyAgICByZXR1cm4gZmFsbGJhY2tfcmFzdGVyaXplcl8tPkdldEdyQ29udGV4dCgpOworICB9CisKKyAgc2NvcGVkX3B0cjxza2lhOjpIYXJkd2FyZVJhc3Rlcml6ZXI+IGZhbGxiYWNrX3Jhc3Rlcml6ZXJfOworICBzY29wZWRfcHRyPEdyYXBoaWNzU3RhdGU+IGdyYXBoaWNzX3N0YXRlXzsKKyAgc2NvcGVkX3B0cjxTaGFkZXJQcm9ncmFtTWFuYWdlcj4gc2hhZGVyX3Byb2dyYW1fbWFuYWdlcl87CisKKyAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMKiBncmFwaGljc19jb250ZXh0XzsKKyAgRnJhbWVSYXRlVGhyb3R0bGVyIGZyYW1lX3JhdGVfdGhyb3R0bGVyXzsKKyAgYmFzZTo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CisKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrTWluT2Zmc2NyZWVuVGFyZ2V0cyA9IDM7CisgIHN0cnVjdCBPZmZzY3JlZW5UYXJnZXQgeworICAgIHNjb3BlZF9wdHI8YmFja2VuZDo6RnJhbWVidWZmZXJFR0w+IGZyYW1lYnVmZmVyOworICAgIFNrQXV0b1RVbnJlZjxTa1N1cmZhY2U+IHNraWFfc3VyZmFjZTsKKyAgfTsKKyAgdHlwZWRlZiBzdGQ6OnZlY3RvcjxPZmZzY3JlZW5UYXJnZXQqPiBPZmZzY3JlZW5UYXJnZXRMaXN0OworICBPZmZzY3JlZW5UYXJnZXRMaXN0IHVzZWRfb2Zmc2NyZWVuX3RhcmdldHNfOworICBPZmZzY3JlZW5UYXJnZXRMaXN0IHVudXNlZF9vZmZzY3JlZW5fdGFyZ2V0c187Cit9OworCitIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OkltcGwoCisgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0KiBncmFwaGljc19jb250ZXh0LAorICAgIGludCBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgIGludCBzdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpCisgICAgOiBmYWxsYmFja19yYXN0ZXJpemVyXyhuZXcgc2tpYTo6SGFyZHdhcmVSYXN0ZXJpemVyKAorICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQsCisgICAgICAgICAgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykpLAorICAgICAgZ3JhcGhpY3NfY29udGV4dF8oCisgICAgICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8YmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMKj4oCisgICAgICAgICAgICAgIGdyYXBoaWNzX2NvbnRleHQpKSB7CisgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTDo6U2NvcGVkTWFrZUN1cnJlbnQgc2NvcGVkX21ha2VfY3VycmVudCgKKyAgICAgIGdyYXBoaWNzX2NvbnRleHRfKTsKKworICBncmFwaGljc19zdGF0ZV8ucmVzZXQobmV3IEdyYXBoaWNzU3RhdGUoKSk7CisgIHNoYWRlcl9wcm9ncmFtX21hbmFnZXJfLnJlc2V0KG5ldyBTaGFkZXJQcm9ncmFtTWFuYWdlcigpKTsKK30KKworSGFyZHdhcmVSYXN0ZXJpemVyOjpJbXBsOjp+SW1wbCgpIHsKKyAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMOjpTY29wZWRNYWtlQ3VycmVudCBzY29wZWRfbWFrZV9jdXJyZW50KAorICAgICAgZ3JhcGhpY3NfY29udGV4dF8pOworCisgIEdMX0NBTEwoZ2xGaW5pc2goKSk7CisgIHdoaWxlICghdW51c2VkX29mZnNjcmVlbl90YXJnZXRzXy5lbXB0eSgpKSB7CisgICAgZGVsZXRlIHVudXNlZF9vZmZzY3JlZW5fdGFyZ2V0c18uYmFjaygpOworICAgIHVudXNlZF9vZmZzY3JlZW5fdGFyZ2V0c18ucG9wX2JhY2soKTsKKyAgfQorCisgIHNoYWRlcl9wcm9ncmFtX21hbmFnZXJfLnJlc2V0KCk7CisgIGdyYXBoaWNzX3N0YXRlXy5yZXNldCgpOworfQorCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6U3VibWl0KAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhY2tlbmQ6OlJlbmRlclRhcmdldD4mIHJlbmRlcl90YXJnZXQsCisgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgYmFja2VuZDo6UmVuZGVyVGFyZ2V0RUdMKiByZW5kZXJfdGFyZ2V0X2VnbCA9CisgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxiYWNrZW5kOjpSZW5kZXJUYXJnZXRFR0wqPigKKyAgICAgICAgICByZW5kZXJfdGFyZ2V0LmdldCgpKTsKKyAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMOjpTY29wZWRNYWtlQ3VycmVudCBzY29wZWRfbWFrZV9jdXJyZW50KAorICAgICAgZ3JhcGhpY3NfY29udGV4dF8sIHJlbmRlcl90YXJnZXRfZWdsKTsKKworICBmYWxsYmFja19yYXN0ZXJpemVyXy0+QWR2YW5jZUZyYW1lKCk7CisKKyAgY29uc3QgbWF0aDo6U2l6ZSYgdGFyZ2V0X3NpemUgPSByZW5kZXJfdGFyZ2V0LT5HZXRTaXplKCk7CisgIGdyYXBoaWNzX3N0YXRlXy0+U2V0Q2xpcEFkanVzdG1lbnQodGFyZ2V0X3NpemUpOworICBncmFwaGljc19zdGF0ZV8tPlZpZXdwb3J0KDAsIDAsIHRhcmdldF9zaXplLndpZHRoKCksIHRhcmdldF9zaXplLmhlaWdodCgpKTsKKyAgZ3JhcGhpY3Nfc3RhdGVfLT5TY2lzc29yKDAsIDAsIHRhcmdldF9zaXplLndpZHRoKCksIHRhcmdldF9zaXplLmhlaWdodCgpKTsKKworICB7CisgICAgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpGYWxsYmFja1Jhc3Rlcml6ZUZ1bmN0aW9uIGZhbGxiYWNrX3Jhc3Rlcml6ZSA9CisgICAgICAgIGJhc2U6OkJpbmQoJkhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6U3VibWl0VG9GYWxsYmFja1Jhc3Rlcml6ZXIsCisgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSk7CisgICAgUmVuZGVyVHJlZU5vZGVWaXNpdG9yIHZpc2l0b3IoZ3JhcGhpY3Nfc3RhdGVfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl9wcm9ncmFtX21hbmFnZXJfLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmYWxsYmFja19yYXN0ZXJpemUpOworCisgICAgeworICAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIlZpc2l0UmVuZGVyVHJlZSIpOworICAgICAgcmVuZGVyX3RyZWUtPkFjY2VwdCgmdmlzaXRvcik7CisgICAgfQorCisgICAgZ3JhcGhpY3Nfc3RhdGVfLT5CZWdpbkZyYW1lKCk7CisKKyAgICAvLyBVcGRhdGUgdmVydGV4IGRhdGEgYnVmZmVyLgorICAgIHsKKyAgICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsICJVcGRhdGVWZXJ0ZXhCdWZmZXIiKTsKKyAgICAgIHZpc2l0b3IuRXhlY3V0ZURyYXcoRHJhd09iamVjdDo6a1N0YWdlVXBkYXRlVmVydGV4QnVmZmVyKTsKKyAgICAgIGdyYXBoaWNzX3N0YXRlXy0+VXBkYXRlVmVydGV4RGF0YSgpOworICAgIH0KKworICAgIHsKKyAgICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsICJSYXN0ZXJpemVPZmZzY3JlZW4iKTsKKyAgICAgIHZpc2l0b3IuRXhlY3V0ZURyYXcoRHJhd09iamVjdDo6a1N0YWdlUmFzdGVyaXplT2Zmc2NyZWVuKTsKKyAgICB9CisKKyAgICBncmFwaGljc19zdGF0ZV8tPkNsZWFyKCk7CisKKyAgICB7CisgICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6cmVuZGVyZXIiLCAiUmFzdGVyaXplTm9ybWFsIik7CisgICAgICB2aXNpdG9yLkV4ZWN1dGVEcmF3KERyYXdPYmplY3Q6OmtTdGFnZVJhc3Rlcml6ZU5vcm1hbCk7CisgICAgfQorCisgICAgZ3JhcGhpY3Nfc3RhdGVfLT5FbmRGcmFtZSgpOworICB9CisKKyAgLy8gVXBkYXRlIHRoZSBvZmZzY3JlZW4gdGFyZ2V0IGNhY2hlLiBLZWVwIGFuIGV4dHJhIGZyYW1lJ3Mgd29ydGggb2YgdGFyZ2V0cworICAvLyBhcm91bmQuCisgIHdoaWxlICh1bnVzZWRfb2Zmc2NyZWVuX3RhcmdldHNfLnNpemUoKSA+IGtNaW5PZmZzY3JlZW5UYXJnZXRzICYmCisgICAgICAgICB1bnVzZWRfb2Zmc2NyZWVuX3RhcmdldHNfLnNpemUoKSA+IHVzZWRfb2Zmc2NyZWVuX3RhcmdldHNfLnNpemUoKSkgeworICAgIGRlbGV0ZSB1bnVzZWRfb2Zmc2NyZWVuX3RhcmdldHNfLmJhY2soKTsKKyAgICB1bnVzZWRfb2Zmc2NyZWVuX3RhcmdldHNfLnBvcF9iYWNrKCk7CisgIH0KKworICAvLyBBZGQgbW9zdCByZWNlbnRseSB1c2VkIG9mZnNjcmVlbiB0YXJnZXRzIHRvIHRoZSBmcm9udC4KKyAgdW51c2VkX29mZnNjcmVlbl90YXJnZXRzXy5pbnNlcnQodW51c2VkX29mZnNjcmVlbl90YXJnZXRzXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX29mZnNjcmVlbl90YXJnZXRzXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2VkX29mZnNjcmVlbl90YXJnZXRzXy5lbmQoKSk7CisgIHVzZWRfb2Zmc2NyZWVuX3RhcmdldHNfLmNsZWFyKCk7CisKKyAgZnJhbWVfcmF0ZV90aHJvdHRsZXJfLkVuZEludGVydmFsKCk7CisgIGdyYXBoaWNzX2NvbnRleHRfLT5Td2FwQnVmZmVycyhyZW5kZXJfdGFyZ2V0X2VnbCk7CisgIGZyYW1lX3JhdGVfdGhyb3R0bGVyXy5CZWdpbkludGVydmFsKCk7Cit9CisKK2JhY2tlbmQ6OlRleHR1cmVFR0wqIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6U3VibWl0VG9GYWxsYmFja1Jhc3Rlcml6ZXIoCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLAorICAgIGNvbnN0IG1hdGg6OlNpemUmIHZpZXdwb3J0X3NpemUpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIlN1Ym1pdFRvRmFsbGJhY2tSYXN0ZXJpemVyIik7CisKKyAgLy8gR2V0IGFuIG9mZnNjcmVlbiB0YXJnZXQgZm9yIHJlbmRlcmluZy4KKyAgT2Zmc2NyZWVuVGFyZ2V0KiBvZmZzY3JlZW5fdGFyZ2V0ID0gTlVMTDsKKyAgZm9yIChPZmZzY3JlZW5UYXJnZXRMaXN0OjppdGVyYXRvciBpdGVyID0gdW51c2VkX29mZnNjcmVlbl90YXJnZXRzXy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gdW51c2VkX29mZnNjcmVlbl90YXJnZXRzXy5lbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCgqaXRlciktPmZyYW1lYnVmZmVyLT5HZXRTaXplKCkgPT0gdmlld3BvcnRfc2l6ZSkgeworICAgICAgb2Zmc2NyZWVuX3RhcmdldCA9ICppdGVyOworICAgICAgdW51c2VkX29mZnNjcmVlbl90YXJnZXRzXy5lcmFzZShpdGVyKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChvZmZzY3JlZW5fdGFyZ2V0ID09IE5VTEwpIHsKKyAgICBvZmZzY3JlZW5fdGFyZ2V0ID0gbmV3IE9mZnNjcmVlblRhcmdldDsKKworICAgIC8vIENyZWF0ZSBhIG5ldyBmcmFtZWJ1ZmZlci4KKyAgICBvZmZzY3JlZW5fdGFyZ2V0LT5mcmFtZWJ1ZmZlci5yZXNldChuZXcgYmFja2VuZDo6RnJhbWVidWZmZXJFR0woCisgICAgICAgIGdyYXBoaWNzX2NvbnRleHRfLCB2aWV3cG9ydF9zaXplLCBHTF9SR0JBLCBHTF9OT05FKSk7CisKKyAgICAvLyBXcmFwIHRoZSBmcmFtZWJ1ZmZlciBhcyBhIHNraWEgc3VyZmFjZS4KKyAgICBHckJhY2tlbmRSZW5kZXJUYXJnZXREZXNjIHNraWFfZGVzYzsKKyAgICBza2lhX2Rlc2MuZldpZHRoID0gdmlld3BvcnRfc2l6ZS53aWR0aCgpOworICAgIHNraWFfZGVzYy5mSGVpZ2h0ID0gdmlld3BvcnRfc2l6ZS5oZWlnaHQoKTsKKyAgICBza2lhX2Rlc2MuZkNvbmZpZyA9IGtSR0JBXzg4ODhfR3JQaXhlbENvbmZpZzsKKyAgICBza2lhX2Rlc2MuZk9yaWdpbiA9IGtCb3R0b21MZWZ0X0dyU3VyZmFjZU9yaWdpbjsKKyAgICBza2lhX2Rlc2MuZlNhbXBsZUNudCA9IDA7CisgICAgc2tpYV9kZXNjLmZTdGVuY2lsQml0cyA9IDA7CisgICAgc2tpYV9kZXNjLmZSZW5kZXJUYXJnZXRIYW5kbGUgPSBvZmZzY3JlZW5fdGFyZ2V0LT5mcmFtZWJ1ZmZlci0+Z2xfaGFuZGxlKCk7CisKKyAgICBTa0F1dG9UVW5yZWY8R3JSZW5kZXJUYXJnZXQ+IHNraWFfcmVuZGVyX3RhcmdldCgKKyAgICAgICAgR2V0R3JDb250ZXh0KCktPndyYXBCYWNrZW5kUmVuZGVyVGFyZ2V0KHNraWFfZGVzYykpOworICAgIFNrU3VyZmFjZVByb3BzIHNraWFfc3VyZmFjZV9wcm9wcygKKyAgICAgICAgU2tTdXJmYWNlUHJvcHM6OmtVc2VEaXN0YW5jZUZpZWxkRm9udHNfRmxhZywKKyAgICAgICAgU2tTdXJmYWNlUHJvcHM6OmtMZWdhY3lGb250SG9zdF9Jbml0VHlwZSk7CisgICAgb2Zmc2NyZWVuX3RhcmdldC0+c2tpYV9zdXJmYWNlLnJlc2V0KFNrU3VyZmFjZTo6TmV3UmVuZGVyVGFyZ2V0RGlyZWN0KAorICAgICAgICBza2lhX3JlbmRlcl90YXJnZXQsICZza2lhX3N1cmZhY2VfcHJvcHMpKTsKKyAgfQorICB1c2VkX29mZnNjcmVlbl90YXJnZXRzXy5wdXNoX2JhY2sob2Zmc2NyZWVuX3RhcmdldCk7CisKKyAgYmFja2VuZDo6RnJhbWVidWZmZXJFR0wqIGZyYW1lYnVmZmVyID0gb2Zmc2NyZWVuX3RhcmdldC0+ZnJhbWVidWZmZXIuZ2V0KCk7CisgIFNrQ2FudmFzKiBjYW52YXMgPSBvZmZzY3JlZW5fdGFyZ2V0LT5za2lhX3N1cmZhY2UtPmdldENhbnZhcygpOworCisgIEdMX0NBTEwoZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIGZyYW1lYnVmZmVyLT5nbF9oYW5kbGUoKSkpOworICBjYW52YXMtPnNhdmUoKTsKKyAgZmFsbGJhY2tfcmFzdGVyaXplcl8tPlN1Ym1pdE9mZnNjcmVlbihyZW5kZXJfdHJlZSwgY2FudmFzKTsKKyAgY2FudmFzLT5yZXN0b3JlKCk7CisgIEdMX0NBTEwoZ2xCaW5kRnJhbWVidWZmZXIoR0xfRlJBTUVCVUZGRVIsIDApKTsKKworICByZXR1cm4gZnJhbWVidWZmZXItPkdldENvbG9yVGV4dHVyZSgpOworfQorCitIYXJkd2FyZVJhc3Rlcml6ZXI6OkhhcmR3YXJlUmFzdGVyaXplcigKKyAgICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsCisgICAgaW50IHNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICBpbnQgc2NyYXRjaF9zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykKKyAgICA6IGltcGxfKG5ldyBJbXBsKGdyYXBoaWNzX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICBza2lhX2NhY2hlX3NpemVfaW5fYnl0ZXMsCisgICAgICAgICAgICAgICAgICAgICBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICAgICAgICAgICAgIHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcykpIHsKK30KKwordm9pZCBIYXJkd2FyZVJhc3Rlcml6ZXI6OlN1Ym1pdCgKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcmVuZGVyX3RyZWUsCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYWNrZW5kOjpSZW5kZXJUYXJnZXQ+JiByZW5kZXJfdGFyZ2V0LAorICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIkhhcmR3YXJlUmFzdGVyaXplcjo6U3VibWl0Iik7CisgIGltcGxfLT5TdWJtaXQocmVuZGVyX3RyZWUsIHJlbmRlcl90YXJnZXQsIG9wdGlvbnMpOworfQorCityZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogSGFyZHdhcmVSYXN0ZXJpemVyOjpHZXRSZXNvdXJjZVByb3ZpZGVyKCkgeworICByZXR1cm4gaW1wbF8tPkdldFJlc291cmNlUHJvdmlkZXIoKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGVnbAorfSAgLy8gbmFtZXNwYWNlIHJhc3Rlcml6ZXIKK30gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM2YjdmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKQEAgLTAsMCArMSw2OSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfSEFSRFdBUkVfUkFTVEVSSVpFUl9IXworI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfSEFSRFdBUkVfUkFTVEVSSVpFUl9IXworCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9yZXNvdXJjZV9wcm92aWRlci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2dyYXBoaWNzX2NvbnRleHQuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0LmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcmFzdGVyaXplci5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworLy8gQSBoYXJkd2FyZSByYXN0ZXJpemVyIHdoaWNoIGRpcmVjdGx5IHVzZXMgRUdML0dMRVMyIHRvIHJhc3Rlcml6ZSByZW5kZXIKKy8vIHRyZWVzIG9udG8gdGhlIGdpdmVuIHJlbmRlciB0YXJnZXQuICBGb3IgY2VydGFpbiBlZmZlY3RzLCBpdCB3aWxsIGZhbGwgYmFjaworLy8gdG8gdGhlIFNraWEgaGFyZHdhcmUgcmFzdGVyaXplci4KK2NsYXNzIEhhcmR3YXJlUmFzdGVyaXplciA6IHB1YmxpYyBSYXN0ZXJpemVyIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBwYXNzZWQgaW4gcmVuZGVyIHRhcmdldCB3aWxsIGJlIHVzZWQgdG8gZGV0ZXJtaW5lIHRoZSBkaW1lbnNpb25zIG9mCisgIC8vIHRoZSBvdXRwdXQuICBUaGUgZ3JhcGhpY3MgY29udGV4dCB3aWxsIGJlIHVzZWQgdG8gaXNzdWUgY29tbWFuZHMgdG8gdGhlIEdQVQorICAvLyB0byBibGl0IHRoZSBmaW5hbCBvdXRwdXQgdG8gdGhlIHJlbmRlciB0YXJnZXQuCisgIC8vIFRoZSB2YWx1ZSBvZiB8c2tpYV9jYWNoZV9zaXplX2luX2J5dGVzfCBkaWN0YXRlcyB0aGUgbWF4aW11bSBhbW91bnQgb2YKKyAgLy8gbWVtb3J5IHRoYXQgU2tpYSB3aWxsIHVzZSB0byBjYWNoZSB0aGUgcmVzdWx0cyBvZiBjZXJ0YWluIGVmZmVjdHMgdGhhdCB0YWtlCisgIC8vIGEgbG9uZyB0aW1lIHRvIHJlbmRlciwgc3VjaCBhcyBzaGFkb3dzLiAgVGhlIHJlc3VsdHMgd2lsbCBiZSByZXVzZWQgYWNyb3NzCisgIC8vIHN1Ym1pc3Npb25zLgorICAvLyBUaGUgdmFsdWUgb2YgfHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzfCBzZXRzIGFuIHVwcGVyIGxpbWl0IG9uCisgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBjYW4gYmUgY29uc3VtZWQgYnkgdGhlIHNjcmF0Y2ggc3VyZmFjZSBjYWNoZSwKKyAgLy8gYSBmYWNpbGl0eSB0aGF0IGFsbG93cyB0ZW1wb3Jhcnkgc3VyZmFjZXMgdG8gYmUgcmV1c2VkIHdpdGhpbiB0aGUKKyAgLy8gcmFzdGVyaXphdGlvbiBvZiBhIHNpbmdsZSBmcmFtZS9zdWJtaXNzaW9uLgorICAvLyBJZiB8c3VyZmFjZV9jYWNoZV9zaXplfCBpcyBub24temVybywgdGhlIHJhc3Rlcml6ZXIgd2lsbCBzZXQgaXRzZWxmIHVwIHdpdGgKKyAgLy8gYSBzdXJmYWNlIGNhY2hlIHN1Y2ggdGhhdCBleHBlbnNpdmUgcmVuZGVyIHRyZWUgbm9kZXMgc2VlbiBtdWx0aXBsZSB0aW1lcworICAvLyB3aWxsIGdldCBzYXZlZCB0byBvZmZzY3JlZW4gc3VyZmFjZXMuCisgIGV4cGxpY2l0IEhhcmR3YXJlUmFzdGVyaXplcihiYWNrZW5kOjpHcmFwaGljc0NvbnRleHQqIGdyYXBoaWNzX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHN1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcyk7CisKKyAgdm9pZCBTdWJtaXQoY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLAorICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhY2tlbmQ6OlJlbmRlclRhcmdldD4mIHJlbmRlcl90YXJnZXQsCisgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIE9WRVJSSURFOworCisgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiBHZXRSZXNvdXJjZVByb3ZpZGVyKCkgT1ZFUlJJREU7CisKKyBwcml2YXRlOgorICBjbGFzcyBJbXBsOworICBzY29wZWRfcHRyPEltcGw+IGltcGxfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVnbAorfSAgLy8gbmFtZXNwYWNlIHJhc3Rlcml6ZXIKK30gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9IQVJEV0FSRV9SQVNURVJJWkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3Jhc3Rlcml6ZXIuZ3lwIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9yYXN0ZXJpemVyLmd5cAppbmRleCAzYWJiMjlhLi5mNGY4Yjc5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3Jhc3Rlcml6ZXIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvcmFzdGVyaXplci5neXAKQEAgLTIxLDYgKzIxLDggQEAKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnc29mdHdhcmVfcmFzdGVyaXplci5jYycsCiAgICAgICAgICdzb2Z0d2FyZV9yYXN0ZXJpemVyLmgnLAorICAgICAgICAndGV4dHVyZWRfbWVzaF9yZW5kZXJlci5jYycsCisgICAgICAgICd0ZXh0dXJlZF9tZXNoX3JlbmRlcmVyLmgnLAogICAgICAgXSwKIAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKQEAgLTMwLDUgKzMyLDM4IEBACiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc2tpYS5neXA6c2tpYScsCiAgICAgICBdLAogICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ2hhcmR3YXJlX3Jhc3Rlcml6ZXInLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorCisgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJ2RyYXdfb2JqZWN0LmgnLAorICAgICAgICAnZHJhd19vYmplY3QuY2MnLAorICAgICAgICAnZHJhd19wb2x5X2NvbG9yLmgnLAorICAgICAgICAnZHJhd19wb2x5X2NvbG9yLmNjJywKKyAgICAgICAgJ2RyYXdfcmVjdF90ZXh0dXJlLmgnLAorICAgICAgICAnZHJhd19yZWN0X3RleHR1cmUuY2MnLAorICAgICAgICAnZ3JhcGhpY3Nfc3RhdGUuaCcsCisgICAgICAgICdncmFwaGljc19zdGF0ZS5jYycsCisgICAgICAgICdoYXJkd2FyZV9yYXN0ZXJpemVyLmNjJywKKyAgICAgICAgJ2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCcsCisgICAgICAgICdyZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaCcsCisgICAgICAgICdyZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MnLAorICAgICAgICAnc2hhZGVyX2Jhc2UuaCcsCisgICAgICAgICdzaGFkZXJfYmFzZS5jYycsCisgICAgICAgICdzaGFkZXJfcHJvZ3JhbS5oJywKKyAgICAgICAgJ3NoYWRlcl9wcm9ncmFtLmNjJywKKyAgICAgICAgJ3NoYWRlcl9wcm9ncmFtX21hbmFnZXIuaCcsCisgICAgICAgICdzaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmNjJywKKyAgICAgIF0sCisKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOmJhc2UnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL2VnbF9hbmRfZ2xlcy9lZ2xfYW5kX2dsZXMuZ3lwOmVnbF9hbmRfZ2xlcycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9zaGFkZXJzLmd5cDpzaGFkZXJzJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmFzdGVyaXplci5neXA6aGFyZHdhcmVfcmFzdGVyaXplcicsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc2tpYS5neXA6c2tpYScsCisgICAgICBdLAorICAgIH0sCiAgIF0sCi19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQorfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ODcxYzBmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MKQEAgLTAsMCArMSwyNjggQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisKKyNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS90eXBlX2lkLmgiCisjaW5jbHVkZSAiY29iYWx0L21hdGgvbWF0cml4M19mLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2RyYXdfcG9seV9jb2xvci5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X3JlY3RfdGV4dHVyZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ltYWdlLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHJlbmRlcmVyIHsKK25hbWVzcGFjZSByYXN0ZXJpemVyIHsKK25hbWVzcGFjZSBlZ2wgeworCituYW1lc3BhY2UgeworCittYXRoOjpSZWN0IFJvdW5kUmVjdEZUb0ludChjb25zdCBtYXRoOjpSZWN0RiYgaW5wdXQpIHsKKyAgaW50IGxlZnQgPSBzdGF0aWNfY2FzdDxpbnQ+KGlucHV0LngoKSArIDAuNWYpOworICBpbnQgcmlnaHQgPSBzdGF0aWNfY2FzdDxpbnQ+KGlucHV0LnJpZ2h0KCkgKyAwLjVmKTsKKyAgaW50IHRvcCA9IHN0YXRpY19jYXN0PGludD4oaW5wdXQueSgpICsgMC41Zik7CisgIGludCBib3R0b20gPSBzdGF0aWNfY2FzdDxpbnQ+KGlucHV0LmJvdHRvbSgpICsgMC41Zik7CisgIHJldHVybiBtYXRoOjpSZWN0KGxlZnQsIHRvcCwgcmlnaHQgLSBsZWZ0LCBib3R0b20gLSB0b3ApOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpSZW5kZXJUcmVlTm9kZVZpc2l0b3IoR3JhcGhpY3NTdGF0ZSogZ3JhcGhpY3Nfc3RhdGUsCisgICAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHNoYWRlcl9wcm9ncmFtX21hbmFnZXIsCisgICAgY29uc3QgRmFsbGJhY2tSYXN0ZXJpemVGdW5jdGlvbiogZmFsbGJhY2tfcmFzdGVyaXplKQorICAgIDogZ3JhcGhpY3Nfc3RhdGVfKGdyYXBoaWNzX3N0YXRlKSwKKyAgICAgIHNoYWRlcl9wcm9ncmFtX21hbmFnZXJfKHNoYWRlcl9wcm9ncmFtX21hbmFnZXIpLAorICAgICAgZmFsbGJhY2tfcmFzdGVyaXplXyhmYWxsYmFja19yYXN0ZXJpemUpIHsKKyAgLy8gTGV0IHRoZSBmaXJzdCBkcmF3IG9iamVjdCByZW5kZXIgaW4gZnJvbnQgb2YgdGhlIGNsZWFyIGRlcHRoLgorICBkcmF3X3N0YXRlXy5kZXB0aCA9IGdyYXBoaWNzX3N0YXRlXy0+TmV4dENsb3Nlc3REZXB0aChkcmF3X3N0YXRlXy5kZXB0aCk7CisKKyAgZHJhd19zdGF0ZV8uc2Npc3Nvci5JbnRlcnNlY3QoZ3JhcGhpY3Nfc3RhdGUtPkdldFNjaXNzb3IoKSk7Cit9CisKK3ZvaWQgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpWaXNpdCgKKyAgICByZW5kZXJfdHJlZTo6Q29tcG9zaXRpb25Ob2RlKiBjb21wb3NpdGlvbl9ub2RlKSB7CisgIGNvbnN0IHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGU6OkJ1aWxkZXImIGRhdGEgPSBjb21wb3NpdGlvbl9ub2RlLT5kYXRhKCk7CisgIGRyYXdfc3RhdGVfLnRyYW5zZm9ybSgwLCAyKSArPSBkYXRhLm9mZnNldCgpLngoKTsKKyAgZHJhd19zdGF0ZV8udHJhbnNmb3JtKDEsIDIpICs9IGRhdGEub2Zmc2V0KCkueSgpOworICBjb25zdCByZW5kZXJfdHJlZTo6Q29tcG9zaXRpb25Ob2RlOjpDaGlsZHJlbiYgY2hpbGRyZW4gPQorICAgICAgZGF0YS5jaGlsZHJlbigpOworICBmb3IgKHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGU6OkNoaWxkcmVuOjpjb25zdF9pdGVyYXRvciBpdGVyID0KKyAgICAgICBjaGlsZHJlbi5iZWdpbigpOyBpdGVyICE9IGNoaWxkcmVuLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAoKml0ZXIpLT5BY2NlcHQodGhpcyk7CisgIH0KKyAgZHJhd19zdGF0ZV8udHJhbnNmb3JtKDAsIDIpIC09IGRhdGEub2Zmc2V0KCkueCgpOworICBkcmF3X3N0YXRlXy50cmFuc2Zvcm0oMSwgMikgLT0gZGF0YS5vZmZzZXQoKS55KCk7Cit9CisKK3ZvaWQgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpWaXNpdCgKKyAgICByZW5kZXJfdHJlZTo6TWF0cml4VHJhbnNmb3JtTm9kZSogdHJhbnNmb3JtX25vZGUpIHsKKyAgY29uc3QgcmVuZGVyX3RyZWU6Ok1hdHJpeFRyYW5zZm9ybU5vZGU6OkJ1aWxkZXImIGRhdGEgPQorICAgICAgdHJhbnNmb3JtX25vZGUtPmRhdGEoKTsKKyAgbWF0aDo6TWF0cml4M0Ygb2xkX3RyYW5zZm9ybSA9IGRyYXdfc3RhdGVfLnRyYW5zZm9ybTsKKyAgZHJhd19zdGF0ZV8udHJhbnNmb3JtID0gZHJhd19zdGF0ZV8udHJhbnNmb3JtICoKKyAgICAgIGRhdGEudHJhbnNmb3JtOworICBkYXRhLnNvdXJjZS0+QWNjZXB0KHRoaXMpOworICBkcmF3X3N0YXRlXy50cmFuc2Zvcm0gPSBvbGRfdHJhbnNmb3JtOworfQorCit2b2lkIFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6VmlzaXQocmVuZGVyX3RyZWU6OkZpbHRlck5vZGUqIGZpbHRlcl9ub2RlKSB7CisgIGNvbnN0IHJlbmRlcl90cmVlOjpGaWx0ZXJOb2RlOjpCdWlsZGVyJiBkYXRhID0gZmlsdGVyX25vZGUtPmRhdGEoKTsKKworICAvLyBJZiB0aGlzIGlzIG9ubHkgYSB2aWV3cG9ydCBmaWx0ZXIgdy9vIHJvdW5kZWQgZWRnZXMsIGFuZCB0aGUgY3VycmVudAorICAvLyB0cmFuc2Zvcm0gbWF0cml4IGtlZXBzIHRoZSBmaWx0ZXIgYXMgYW4gb3J0aG9nb25hbCByZWN0LCB0aGVuIGNvbGxhcHNlCisgIC8vIHRoZSBub2RlLgorICBpZiAoZGF0YS52aWV3cG9ydF9maWx0ZXIgJiYKKyAgICAgICFkYXRhLnZpZXdwb3J0X2ZpbHRlci0+aGFzX3JvdW5kZWRfY29ybmVycygpICYmCisgICAgICAhZGF0YS5vcGFjaXR5X2ZpbHRlciAmJgorICAgICAgIWRhdGEuYmx1cl9maWx0ZXIgJiYKKyAgICAgICFkYXRhLm1hcF90b19tZXNoX2ZpbHRlcikgeworICAgIGNvbnN0IG1hdGg6Ok1hdHJpeDNGJiB0cmFuc2Zvcm0gPSBkcmF3X3N0YXRlXy50cmFuc2Zvcm07CisgICAgaWYgKHRyYW5zZm9ybSgyLCAwKSA9PSAwICYmIHRyYW5zZm9ybSgyLCAxKSA9PSAwICYmIHRyYW5zZm9ybSgyLCAyKSA9PSAxICYmCisgICAgICAgIHRyYW5zZm9ybSgwLCAxKSA9PSAwICYmIHRyYW5zZm9ybSgxLCAwKSA9PSAwKSB7CisgICAgICAvLyBUcmFuc2Zvcm0gbG9jYWwgdmlld3BvcnQgdG8gd29ybGQgdmlld3BvcnQuCisgICAgICBjb25zdCBtYXRoOjpSZWN0RiYgZmlsdGVyX3ZpZXdwb3J0ID0gZGF0YS52aWV3cG9ydF9maWx0ZXItPnZpZXdwb3J0KCk7CisgICAgICBtYXRoOjpSZWN0RiB0cmFuc2Zvcm1lZF92aWV3cG9ydCgKKyAgICAgICAgICBmaWx0ZXJfdmlld3BvcnQueCgpICogdHJhbnNmb3JtKDAsIDApICsgdHJhbnNmb3JtKDAsIDIpLAorICAgICAgICAgIGZpbHRlcl92aWV3cG9ydC55KCkgKiB0cmFuc2Zvcm0oMSwgMSkgKyB0cmFuc2Zvcm0oMSwgMiksCisgICAgICAgICAgZmlsdGVyX3ZpZXdwb3J0LndpZHRoKCkgKiB0cmFuc2Zvcm0oMCwgMCksCisgICAgICAgICAgZmlsdGVyX3ZpZXdwb3J0LmhlaWdodCgpICogdHJhbnNmb3JtKDEsIDEpKTsKKyAgICAgIC8vIEVuc3VyZSB0cmFuc2Zvcm1lZCB2aWV3cG9ydCBkYXRhIGlzIHNhbmUgKGluIGNhc2UgZ2xvYmFsIHRyYW5zZm9ybQorICAgICAgLy8gZmxpcHBlZCBhbnkgYXhpcykuCisgICAgICBpZiAodHJhbnNmb3JtZWRfdmlld3BvcnQud2lkdGgoKSA8IDApIHsKKyAgICAgICAgdHJhbnNmb3JtZWRfdmlld3BvcnQuc2V0X3godHJhbnNmb3JtZWRfdmlld3BvcnQucmlnaHQoKSk7CisgICAgICAgIHRyYW5zZm9ybWVkX3ZpZXdwb3J0LnNldF93aWR0aCgtdHJhbnNmb3JtZWRfdmlld3BvcnQud2lkdGgoKSk7CisgICAgICB9CisgICAgICBpZiAodHJhbnNmb3JtZWRfdmlld3BvcnQuaGVpZ2h0KCkgPCAwKSB7CisgICAgICAgIHRyYW5zZm9ybWVkX3ZpZXdwb3J0LnNldF95KHRyYW5zZm9ybWVkX3ZpZXdwb3J0LmJvdHRvbSgpKTsKKyAgICAgICAgdHJhbnNmb3JtZWRfdmlld3BvcnQuc2V0X2hlaWdodCgtdHJhbnNmb3JtZWRfdmlld3BvcnQuaGVpZ2h0KCkpOworICAgICAgfQorICAgICAgLy8gQ29tYmluZSB0aGUgbmV3IHZpZXdwb3J0IGZpbHRlciB3aXRoIGV4aXN0aW5nIHZpZXdwb3J0IGZpbHRlci4KKyAgICAgIG1hdGg6OlJlY3Qgb2xkX3NjaXNzb3IgPSBkcmF3X3N0YXRlXy5zY2lzc29yOworICAgICAgZHJhd19zdGF0ZV8uc2Npc3Nvci5JbnRlcnNlY3QoUm91bmRSZWN0RlRvSW50KHRyYW5zZm9ybWVkX3ZpZXdwb3J0KSk7CisgICAgICBpZiAoIWRyYXdfc3RhdGVfLnNjaXNzb3IuSXNFbXB0eSgpKSB7CisgICAgICAgIGRhdGEuc291cmNlLT5BY2NlcHQodGhpcyk7CisgICAgICB9CisgICAgICBkcmF3X3N0YXRlXy5zY2lzc29yID0gb2xkX3NjaXNzb3I7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgTk9USU1QTEVNRU5URUQoKTsKK30KKwordm9pZCBSZW5kZXJUcmVlTm9kZVZpc2l0b3I6OlZpc2l0KHJlbmRlcl90cmVlOjpJbWFnZU5vZGUqIGltYWdlX25vZGUpIHsKKyAgY29uc3QgcmVuZGVyX3RyZWU6OkltYWdlTm9kZTo6QnVpbGRlciYgZGF0YSA9IGltYWdlX25vZGUtPmRhdGEoKTsKKworICAvLyBUaGUgaW1hZ2Ugbm9kZSBtYXkgY29udGFpbiBub3RoaW5nLiBGb3IgZXhhbXBsZSwgd2hlbiBpdCByZXByZXNlbnRzIGEgdmlkZW8KKyAgLy8gZWxlbWVudCBiZWZvcmUgYW55IGZyYW1lIGlzIGRlY29kZWQuCisgIGlmICghZGF0YS5zb3VyY2UpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIUlzVmlzaWJsZShpbWFnZV9ub2RlLT5HZXRCb3VuZHMoKSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBza2lhOjpJbWFnZSogc2tpYV9pbWFnZSA9CisgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxza2lhOjpJbWFnZSo+KGRhdGEuc291cmNlLmdldCgpKTsKKworICAvLyBFbnN1cmUgYW55IHJlcXVpcmVkIGJhY2tlbmQgcHJvY2Vzc2luZyBpcyBkb25lIHRvIGNyZWF0ZSB0aGUgbmVjZXNzYXJ5CisgIC8vIEdQVSByZXNvdXJjZS4KKyAgc2tpYV9pbWFnZS0+RW5zdXJlSW5pdGlhbGl6ZWQoKTsKKworICAvLyBEaWZmZXJlbnQgc2hhZGVycyBhcmUgdXNlZCBkZXBlbmRpbmcgb24gd2hldGhlciB0aGUgaW1hZ2UgaGFzIGEgc2luZ2xlCisgIC8vIHBsYW5lIG9yIG11bHRpcGxlIHBsYW5lcy4KKyAgaWYgKHNraWFfaW1hZ2UtPkdldFR5cGVJZCgpID09IGJhc2U6OkdldFR5cGVJZDxza2lhOjpTaW5nbGVQbGFuZUltYWdlPigpKSB7CisgICAgbWF0aDo6TWF0cml4M0YgdGV4Y29vcmRfdHJhbnNmb3JtID0KKyAgICAgICAgZGF0YS5sb2NhbF90cmFuc2Zvcm0uSXNJZGVudGl0eSgpID8KKyAgICAgICAgICAgIG1hdGg6Ok1hdHJpeDNGOjpJZGVudGl0eSgpIDoKKyAgICAgICAgICAgIGRhdGEubG9jYWxfdHJhbnNmb3JtLkludmVyc2UoKTsKKyAgICBza2lhOjpIYXJkd2FyZUZyb250ZW5kSW1hZ2UqIGhhcmR3YXJlX2ltYWdlID0KKyAgICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8c2tpYTo6SGFyZHdhcmVGcm9udGVuZEltYWdlKj4oc2tpYV9pbWFnZSk7CisKKyAgICBpZiAoaGFyZHdhcmVfaW1hZ2UtPklzT3BhcXVlKCkgJiYgZHJhd19zdGF0ZV8ub3BhY2l0eSA9PSAxLjBmKSB7CisgICAgICBzY29wZWRfcHRyPERyYXdPYmplY3Q+IGRyYXcobmV3IERyYXdSZWN0VGV4dHVyZShncmFwaGljc19zdGF0ZV8sCisgICAgICAgICAgZHJhd19zdGF0ZV8sIGRhdGEuZGVzdGluYXRpb25fcmVjdCwKKyAgICAgICAgICBoYXJkd2FyZV9pbWFnZS0+R2V0VGV4dHVyZUVHTCgpLCB0ZXhjb29yZF90cmFuc2Zvcm0pKTsKKyAgICAgIEFkZERyYXdPYmplY3QoZHJhdy5QYXNzKCksIGtEcmF3UmVjdFRleHR1cmUpOworICAgIH0gZWxzZSB7CisgICAgICBOT1RJTVBMRU1FTlRFRCgpOworICAgIH0KKyAgfSBlbHNlIGlmIChza2lhX2ltYWdlLT5HZXRUeXBlSWQoKSA9PQorICAgICAgICAgICAgIGJhc2U6OkdldFR5cGVJZDxza2lhOjpNdWx0aVBsYW5lSW1hZ2U+KCkpIHsKKyAgICBOT1RJTVBMRU1FTlRFRCgpOworICB9IGVsc2UgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorfQorCit2b2lkIFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6VmlzaXQoCisgICAgcmVuZGVyX3RyZWU6OlB1bmNoVGhyb3VnaFZpZGVvTm9kZSogdmlkZW9fbm9kZSkgeworICBpZiAoIUlzVmlzaWJsZSh2aWRlb19ub2RlLT5HZXRCb3VuZHMoKSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBOT1RJTVBMRU1FTlRFRCgpOworfQorCit2b2lkIFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6VmlzaXQocmVuZGVyX3RyZWU6OlJlY3ROb2RlKiByZWN0X25vZGUpIHsKKyAgaWYgKCFJc1Zpc2libGUocmVjdF9ub2RlLT5HZXRCb3VuZHMoKSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBjb25zdCByZW5kZXJfdHJlZTo6UmVjdE5vZGU6OkJ1aWxkZXImIGRhdGEgPSByZWN0X25vZGUtPmRhdGEoKTsKKworICBjb25zdCBzY29wZWRfcHRyPHJlbmRlcl90cmVlOjpCcnVzaD4mIGJydXNoID0gZGF0YS5iYWNrZ3JvdW5kX2JydXNoOworICBtYXRoOjpSZWN0RiBjb250ZW50X3JlY3QoZGF0YS5yZWN0KTsKKyAgaWYgKGRhdGEuYm9yZGVyKSB7CisgICAgY29udGVudF9yZWN0Lkluc2V0KGRhdGEuYm9yZGVyLT5sZWZ0LndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJvcmRlci0+dG9wLndpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICBkYXRhLmJvcmRlci0+cmlnaHQud2lkdGgsCisgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuYm9yZGVyLT5ib3R0b20ud2lkdGgpOworICB9CisKKyAgaWYgKGRhdGEucm91bmRlZF9jb3JuZXJzIHx8CisgICAgICAoYnJ1c2ggJiYgYnJ1c2gtPkdldFR5cGVJZCgpICE9CisgICAgICAgICAgYmFzZTo6R2V0VHlwZUlkPHJlbmRlcl90cmVlOjpTb2xpZENvbG9yQnJ1c2g+KCkpKSB7CisgICAgTk9USU1QTEVNRU5URUQoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBIYW5kbGUgZHJhd2luZyB0aGUgY29udGVudC4KKyAgICBpZiAoYnJ1c2gpIHsKKyAgICAgIHJlbmRlcl90cmVlOjpTb2xpZENvbG9yQnJ1c2gqIHNvbGlkX2JydXNoID0KKyAgICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxyZW5kZXJfdHJlZTo6U29saWRDb2xvckJydXNoKj4KKyAgICAgICAgICAgICAgKGJydXNoLmdldCgpKTsKKyAgICAgIHNjb3BlZF9wdHI8RHJhd09iamVjdD4gZHJhdyhuZXcgRHJhd1BvbHlDb2xvcihncmFwaGljc19zdGF0ZV8sCisgICAgICAgICAgZHJhd19zdGF0ZV8sIGNvbnRlbnRfcmVjdCwgc29saWRfYnJ1c2gtPmNvbG9yKCkpKTsKKyAgICAgIGlmIChkcmF3X3N0YXRlXy5vcGFjaXR5ICogc29saWRfYnJ1c2gtPmNvbG9yKCkuYSgpID09IDEuMGYpIHsKKyAgICAgICAgQWRkRHJhd09iamVjdChkcmF3LlBhc3MoKSwga0RyYXdQb2x5Q29sb3IpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgQWRkRHJhd09iamVjdChkcmF3LlBhc3MoKSwga0RyYXdUcmFuc3BhcmVudCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpWaXNpdChyZW5kZXJfdHJlZTo6UmVjdFNoYWRvd05vZGUqIHNoYWRvd19ub2RlKSB7CisgIGlmICghSXNWaXNpYmxlKHNoYWRvd19ub2RlLT5HZXRCb3VuZHMoKSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBOT1RJTVBMRU1FTlRFRCgpOworfQorCit2b2lkIFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6VmlzaXQocmVuZGVyX3RyZWU6OlRleHROb2RlKiB0ZXh0X25vZGUpIHsKKyAgaWYgKCFJc1Zpc2libGUodGV4dF9ub2RlLT5HZXRCb3VuZHMoKSkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBOT1RJTVBMRU1FTlRFRCgpOworfQorCit2b2lkIFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6RXhlY3V0ZURyYXcoRHJhd09iamVjdDo6RXhlY3V0aW9uU3RhZ2Ugc3RhZ2UpIHsKKyAgZm9yIChpbnQgdHlwZSA9IDA7IHR5cGUgPCBrRHJhd0NvdW50OyArK3R5cGUpIHsKKyAgICBpZiAodHlwZSA9PSBrRHJhd1RyYW5zcGFyZW50KSB7CisgICAgICBncmFwaGljc19zdGF0ZV8tPkVuYWJsZUJsZW5kKCk7CisgICAgICBncmFwaGljc19zdGF0ZV8tPkRpc2FibGVEZXB0aFdyaXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGdyYXBoaWNzX3N0YXRlXy0+RGlzYWJsZUJsZW5kKCk7CisgICAgICBncmFwaGljc19zdGF0ZV8tPkVuYWJsZURlcHRoV3JpdGUoKTsKKyAgICB9CisKKyAgICBmb3IgKHNpemVfdCBpbmRleCA9IDA7IGluZGV4IDwgZHJhd19vYmplY3RzX1t0eXBlXS5zaXplKCk7ICsraW5kZXgpIHsKKyAgICAgIGRyYXdfb2JqZWN0c19bdHlwZV1baW5kZXhdLT5FeGVjdXRlKGdyYXBoaWNzX3N0YXRlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoYWRlcl9wcm9ncmFtX21hbmFnZXJfLCBzdGFnZSk7CisgICAgfQorICB9Cit9CisKK2Jvb2wgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpJc1Zpc2libGUoY29uc3QgbWF0aDo6UmVjdEYmIGJvdW5kcykgeworICBtYXRoOjpSZWN0RiBpbnRlcnNlY3Rpb24gPSBJbnRlcnNlY3RSZWN0cygKKyAgICAgIGRyYXdfc3RhdGVfLnRyYW5zZm9ybS5NYXBSZWN0KGJvdW5kcyksIGRyYXdfc3RhdGVfLnNjaXNzb3IpOworICByZXR1cm4gIWludGVyc2VjdGlvbi5Jc0VtcHR5KCk7Cit9CisKK3ZvaWQgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpBZGREcmF3T2JqZWN0KHNjb3BlZF9wdHI8RHJhd09iamVjdD4gb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRHJhd1R5cGUgdHlwZSkgeworICBkcmF3X29iamVjdHNfW3R5cGVdLnB1c2hfYmFjayhvYmplY3QucmVsZWFzZSgpKTsKKyAgZHJhd19zdGF0ZV8uZGVwdGggPSBncmFwaGljc19zdGF0ZV8tPk5leHRDbG9zZXN0RGVwdGgoZHJhd19zdGF0ZV8uZGVwdGgpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hODQzYmEyCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuaApAQCAtMCwwICsxLDk1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9SRU5ERVJfVFJFRV9OT0RFX1ZJU0lUT1JfSF8KKyNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX1JFTkRFUl9UUkVFX05PREVfVklTSVRPUl9IXworCisjaW5jbHVkZSAiYmFzZS9jYWxsYmFjay5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCisjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF92ZWN0b3IuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC9yZWN0X2YuaCIKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC9zaXplLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2FuaW1hdGlvbnMvYW5pbWF0ZV9ub2RlLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2NvbXBvc2l0aW9uX25vZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvZmlsdGVyX25vZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvaW1hZ2Vfbm9kZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9tYXRyaXhfdHJhbnNmb3JtX25vZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvbm9kZV92aXNpdG9yLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3B1bmNoX3Rocm91Z2hfdmlkZW9fbm9kZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS9yZWN0X25vZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyX3RyZWUvcmVjdF9zaGFkb3dfbm9kZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJfdHJlZS90ZXh0X25vZGUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdGV4dHVyZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9kcmF3X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9ncmFwaGljc19zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHJlbmRlcmVyIHsKK25hbWVzcGFjZSByYXN0ZXJpemVyIHsKK25hbWVzcGFjZSBlZ2wgeworCisvLyBBIHJlbmRlciB0cmVlIG5vZGUgdmlzaXRvciB0aGF0IHRyYW5zbGF0ZXMgYSBnaXZlbiByZW5kZXIgdHJlZSBpbnRvCisvLyBEcmF3T2JqZWN0cyB3aGljaCBtdXN0IHRoZW4gYmUgcHJvY2Vzc2VkIHVzaW5nIGNhbGxzIHRvIEV4ZWN1dGVEcmF3LgorY2xhc3MgUmVuZGVyVHJlZU5vZGVWaXNpdG9yIDogcHVibGljIHJlbmRlcl90cmVlOjpOb2RlVmlzaXRvciB7CisgcHVibGljOgorICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPGJhY2tlbmQ6OlRleHR1cmVFR0wqKAorICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLAorICAgICAgY29uc3QgbWF0aDo6U2l6ZSYgdmlld3BvcnRfc2l6ZSk+CisgICAgICBGYWxsYmFja1Jhc3Rlcml6ZUZ1bmN0aW9uOworCisgIFJlbmRlclRyZWVOb2RlVmlzaXRvcihHcmFwaGljc1N0YXRlKiBncmFwaGljc19zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNoYWRlclByb2dyYW1NYW5hZ2VyKiBzaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmFsbGJhY2tSYXN0ZXJpemVGdW5jdGlvbiogZmFsbGJhY2tfcmFzdGVyaXplKTsKKworICB2b2lkIFZpc2l0KHJlbmRlcl90cmVlOjphbmltYXRpb25zOjpBbmltYXRlTm9kZSogLyogYW5pbWF0ZSAqLykgT1ZFUlJJREUgeworICAgIE5PVFJFQUNIRUQoKTsKKyAgfQorICB2b2lkIFZpc2l0KHJlbmRlcl90cmVlOjpDb21wb3NpdGlvbk5vZGUqIGNvbXBvc2l0aW9uX25vZGUpIE9WRVJSSURFOworICB2b2lkIFZpc2l0KHJlbmRlcl90cmVlOjpNYXRyaXhUcmFuc2Zvcm1Ob2RlKiB0cmFuc2Zvcm1fbm9kZSkgT1ZFUlJJREU7CisgIHZvaWQgVmlzaXQocmVuZGVyX3RyZWU6OkZpbHRlck5vZGUqIGZpbHRlcl9ub2RlKSBPVkVSUklERTsKKyAgdm9pZCBWaXNpdChyZW5kZXJfdHJlZTo6SW1hZ2VOb2RlKiBpbWFnZV9ub2RlKSBPVkVSUklERTsKKyAgdm9pZCBWaXNpdChyZW5kZXJfdHJlZTo6UHVuY2hUaHJvdWdoVmlkZW9Ob2RlKiB2aWRlb19ub2RlKSBPVkVSUklERTsKKyAgdm9pZCBWaXNpdChyZW5kZXJfdHJlZTo6UmVjdE5vZGUqIHJlY3Rfbm9kZSkgT1ZFUlJJREU7CisgIHZvaWQgVmlzaXQocmVuZGVyX3RyZWU6OlJlY3RTaGFkb3dOb2RlKiBzaGFkb3dfbm9kZSkgT1ZFUlJJREU7CisgIHZvaWQgVmlzaXQocmVuZGVyX3RyZWU6OlRleHROb2RlKiB0ZXh0X25vZGUpIE9WRVJSSURFOworCisgIHZvaWQgRXhlY3V0ZURyYXcoRHJhd09iamVjdDo6RXhlY3V0aW9uU3RhZ2Ugc3RhZ2UpOworCisgcHJpdmF0ZToKKyAgZW51bSBEcmF3VHlwZSB7CisgICAga0RyYXdSZWN0VGV4dHVyZSA9IDAsCisgICAga0RyYXdQb2x5Q29sb3IsCisgICAga0RyYXdUcmFuc3BhcmVudCwKKyAgICBrRHJhd0NvdW50LAorICB9OworCisgIGJvb2wgSXNWaXNpYmxlKGNvbnN0IG1hdGg6OlJlY3RGJiBib3VuZHMpOworICB2b2lkIEFkZERyYXdPYmplY3Qoc2NvcGVkX3B0cjxEcmF3T2JqZWN0PiBvYmplY3QsIERyYXdUeXBlIHR5cGUpOworCisgIEdyYXBoaWNzU3RhdGUqIGdyYXBoaWNzX3N0YXRlXzsKKyAgU2hhZGVyUHJvZ3JhbU1hbmFnZXIqIHNoYWRlcl9wcm9ncmFtX21hbmFnZXJfOworICBjb25zdCBGYWxsYmFja1Jhc3Rlcml6ZUZ1bmN0aW9uKiBmYWxsYmFja19yYXN0ZXJpemVfOworCisgIERyYXdPYmplY3Q6OkJhc2VTdGF0ZSBkcmF3X3N0YXRlXzsKKyAgU2NvcGVkVmVjdG9yPERyYXdPYmplY3Q+IGRyYXdfb2JqZWN0c19ba0RyYXdDb3VudF07Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX1JFTkRFUl9UUkVFX05PREVfVklTSVRPUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfYmFzZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX2Jhc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJiMTE3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX2Jhc2UuY2MKQEAgLTAsMCArMSw0NCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfYmFzZS5oIgorCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHJlbmRlcmVyIHsKK25hbWVzcGFjZSByYXN0ZXJpemVyIHsKK25hbWVzcGFjZSBlZ2wgeworCit2b2lkIFNoYWRlckJhc2U6OkJpbmRBdHRyaWJMb2NhdGlvbihHTHVpbnQgcHJvZ3JhbSwgR0x1aW50IGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbmFtZSkgeworICBHTF9DQUxMKGdsQmluZEF0dHJpYkxvY2F0aW9uKHByb2dyYW0sIGxvY2F0aW9uLCBuYW1lKSk7Cit9CisKK0dMdWludCBTaGFkZXJCYXNlOjpHZXRVbmlmb3JtTG9jYXRpb24oR0x1aW50IHByb2dyYW0sIGNvbnN0IGNoYXIqIG5hbWUpIHsKKyAgR0xpbnQgbG9jYXRpb24gPSBnbEdldFVuaWZvcm1Mb2NhdGlvbihwcm9ncmFtLCBuYW1lKTsKKyAgRENIRUNLX05FKGxvY2F0aW9uLCAtMSk7CisgIHJldHVybiBzdGF0aWNfY2FzdDxHTHVpbnQ+KGxvY2F0aW9uKTsKK30KKwordm9pZCBTaGFkZXJCYXNlOjpTZXRUZXh0dXJlVW5pdEZvclVuaWZvcm1TYW1wbGVyKEdMdWludCB1bmlmb3JtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdMZW51bSB0ZXh0dXJlX3VuaXQpIHsKKyAgR0xfQ0FMTChnbFVuaWZvcm0xaSh1bmlmb3JtX2xvY2F0aW9uLCB0ZXh0dXJlX3VuaXQgLSBHTF9URVhUVVJFMCkpOworfQorCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcl9iYXNlLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcl9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVkZDc1NwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX2Jhc2UuaApAQCAtMCwwICsxLDU5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9TSEFERVJfQkFTRV9IXworI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfU0hBREVSX0JBU0VfSF8KKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworY2xhc3MgU2hhZGVyUHJvZ3JhbUJhc2U7CisKKy8vIFNoYWRlckJhc2UgcmVwcmVzZW50cyB2ZXJ0ZXgvZnJhZ21lbnQvZXRjLiBzaGFkZXJzLiBJdCBwcm92aWRlcyBtZXRob2RzCisvLyB0byBhY2Nlc3MgR0xFUyBmdW5jdGlvbmFsaXR5IHRoYXQgY2hpbGQgY2xhc3NlcyBjYW4gdXNlLiBUaGlzIHNob3VsZCBvbmx5CisvLyBiZSB1c2VkIGFzIHBhcnQgb2YgdGhlIFNoYWRlclByb2dyYW0gdGVtcGxhdGUgY2xhc3MuCitjbGFzcyBTaGFkZXJCYXNlIHsKKyBwdWJsaWM6CisgIFNoYWRlckJhc2UoKSA6IGhhbmRsZV8oMCkge30KKyAgdmlydHVhbCB+U2hhZGVyQmFzZSgpIHt9CisKKyAgR0x1aW50IEdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV87IH0KKyAgdmlydHVhbCBjb25zdCBjaGFyKiBHZXRTb3VyY2UoKSBjb25zdCA9IDA7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgQmluZEF0dHJpYkxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBHTHVpbnQgbG9jYXRpb24sIGNvbnN0IGNoYXIqIG5hbWUpOworICBHTHVpbnQgR2V0VW5pZm9ybUxvY2F0aW9uKEdMdWludCBwcm9ncmFtLCBjb25zdCBjaGFyKiBuYW1lKTsKKyAgdm9pZCBTZXRUZXh0dXJlVW5pdEZvclVuaWZvcm1TYW1wbGVyKEdMdWludCB1bmlmb3JtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0xlbnVtIHRleHR1cmVfdW5pdCk7CisKKyBwcml2YXRlOgorICBmcmllbmQgY2xhc3MgU2hhZGVyUHJvZ3JhbUJhc2U7CisKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVQcmVMaW5rKEdMdWludCBwcm9ncmFtKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBJbml0aWFsaXplUG9zdExpbmsoR0x1aW50IHByb2dyYW0pID0gMDsKKyAgdmlydHVhbCB2b2lkIEluaXRpYWxpemVQb3N0VXNlKCkgPSAwOworCisgIEdMdWludCBoYW5kbGVfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVnbAorfSAgLy8gbmFtZXNwYWNlIHJhc3Rlcml6ZXIKK30gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9TSEFERVJfQkFTRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjRkZDJmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW0uY2MKQEAgLTAsMCArMSw5MCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbS5oIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdXRpbHMuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworbmFtZXNwYWNlIHJhc3Rlcml6ZXIgeworbmFtZXNwYWNlIGVnbCB7CisKK25hbWVzcGFjZSB7CisKK3ZvaWQgQ29tcGlsZVNoYWRlcihHTHVpbnQgaGFuZGxlLCBjb25zdCBHTGNoYXIqIHNvdXJjZSkgeworICBHTGludCBzb3VyY2VfbGVuZ3RoID0gc3RybGVuKHNvdXJjZSk7CisgIEdMX0NBTEwoZ2xTaGFkZXJTb3VyY2UoaGFuZGxlLCAxLCAmc291cmNlLCAmc291cmNlX2xlbmd0aCkpOworICBHTF9DQUxMKGdsQ29tcGlsZVNoYWRlcihoYW5kbGUpKTsKKworICBHTGludCBpc19jb21waWxlZCA9IEdMX0ZBTFNFOworICBHTF9DQUxMKGdsR2V0U2hhZGVyaXYoaGFuZGxlLCBHTF9DT01QSUxFX1NUQVRVUywgJmlzX2NvbXBpbGVkKSk7CisgIGlmIChpc19jb21waWxlZCAhPSBHTF9UUlVFKSB7CisgICAgY29uc3QgR0xzaXplaSBrTWF4TG9nTGVuZ3RoID0gMjA0ODsKKyAgICBHTHNpemVpIGxvZ19sZW5ndGggPSAwOworICAgIEdMY2hhciBsb2dba01heExvZ0xlbmd0aF07CisgICAgZ2xHZXRTaGFkZXJJbmZvTG9nKGhhbmRsZSwga01heExvZ0xlbmd0aCwgJmxvZ19sZW5ndGgsIGxvZyk7CisgICAgRExPRyhFUlJPUikgPDwgInNoYWRlciBlcnJvcjogIiA8PCBsb2c7CisgICAgRExPRyhFUlJPUikgPDwgInNoYWRlciBzb3VyY2U6XG4iIDw8IHNvdXJjZTsKKyAgfQorICBEQ0hFQ0tfRVEoaXNfY29tcGlsZWQsIEdMX1RSVUUpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworU2hhZGVyUHJvZ3JhbUJhc2U6OlNoYWRlclByb2dyYW1CYXNlKCkKKyAgICA6IGhhbmRsZV8oMCkge30KKworU2hhZGVyUHJvZ3JhbUJhc2U6On5TaGFkZXJQcm9ncmFtQmFzZSgpIHsKKyAgRENIRUNLX0VRKGhhbmRsZV8sIDApOworfQorCit2b2lkIFNoYWRlclByb2dyYW1CYXNlOjpDcmVhdGUoU2hhZGVyQmFzZSogdmVydGV4X3NoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaGFkZXJCYXNlKiBmcmFnbWVudF9zaGFkZXIpIHsKKyAgaGFuZGxlXyA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworCisgIHZlcnRleF9zaGFkZXItPmhhbmRsZV8gPSBnbENyZWF0ZVNoYWRlcihHTF9WRVJURVhfU0hBREVSKTsKKyAgQ29tcGlsZVNoYWRlcih2ZXJ0ZXhfc2hhZGVyLT5oYW5kbGVfLCB2ZXJ0ZXhfc2hhZGVyLT5HZXRTb3VyY2UoKSk7CisgIEdMX0NBTEwoZ2xBdHRhY2hTaGFkZXIoaGFuZGxlXywgdmVydGV4X3NoYWRlci0+aGFuZGxlXykpOworCisgIGZyYWdtZW50X3NoYWRlci0+aGFuZGxlXyA9IGdsQ3JlYXRlU2hhZGVyKEdMX0ZSQUdNRU5UX1NIQURFUik7CisgIENvbXBpbGVTaGFkZXIoZnJhZ21lbnRfc2hhZGVyLT5oYW5kbGVfLCBmcmFnbWVudF9zaGFkZXItPkdldFNvdXJjZSgpKTsKKyAgR0xfQ0FMTChnbEF0dGFjaFNoYWRlcihoYW5kbGVfLCBmcmFnbWVudF9zaGFkZXItPmhhbmRsZV8pKTsKKworICB2ZXJ0ZXhfc2hhZGVyLT5Jbml0aWFsaXplUHJlTGluayhoYW5kbGVfKTsKKyAgZnJhZ21lbnRfc2hhZGVyLT5Jbml0aWFsaXplUHJlTGluayhoYW5kbGVfKTsKKyAgR0xfQ0FMTChnbExpbmtQcm9ncmFtKGhhbmRsZV8pKTsKKyAgdmVydGV4X3NoYWRlci0+SW5pdGlhbGl6ZVBvc3RMaW5rKGhhbmRsZV8pOworICBmcmFnbWVudF9zaGFkZXItPkluaXRpYWxpemVQb3N0TGluayhoYW5kbGVfKTsKKyAgR0xfQ0FMTChnbFVzZVByb2dyYW0oaGFuZGxlXykpOworICB2ZXJ0ZXhfc2hhZGVyLT5Jbml0aWFsaXplUG9zdFVzZSgpOworICBmcmFnbWVudF9zaGFkZXItPkluaXRpYWxpemVQb3N0VXNlKCk7Cit9CisKK3ZvaWQgU2hhZGVyUHJvZ3JhbUJhc2U6OkRlc3Ryb3koU2hhZGVyQmFzZSogdmVydGV4X3NoYWRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2hhZGVyQmFzZSogZnJhZ21lbnRfc2hhZGVyKSB7CisgIERDSEVDS19ORShoYW5kbGVfLCAwKTsKKyAgR0xfQ0FMTChnbERlbGV0ZVByb2dyYW0oaGFuZGxlXykpOworICBHTF9DQUxMKGdsRGVsZXRlU2hhZGVyKHZlcnRleF9zaGFkZXItPmhhbmRsZV8pKTsKKyAgR0xfQ0FMTChnbERlbGV0ZVNoYWRlcihmcmFnbWVudF9zaGFkZXItPmhhbmRsZV8pKTsKKyAgaGFuZGxlXyA9IDA7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlZ2wKK30gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCit9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW0uaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYWJlYmJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbS5oCkBAIC0wLDAgKzEsODIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX1NIQURFUl9QUk9HUkFNX0hfCisjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9TSEFERVJfUFJPR1JBTV9IXworCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfYmFzZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSByZW5kZXJlciB7CituYW1lc3BhY2UgcmFzdGVyaXplciB7CituYW1lc3BhY2UgZWdsIHsKKworY2xhc3MgU2hhZGVyUHJvZ3JhbU1hbmFnZXI7CisKKy8vIFNoYWRlclByb2dyYW1CYXNlIHJlcHJlc2VudHMgYSBzaGFkZXIgcHJvZ3JhbSB3aXRoIHZlcnRleCBhbmQgZnJhZ21lbnQKKy8vIHNoYWRlcnMgYXR0YWNoZWQuIFRoaXMgc2hvdWxkIGJlIGluc3RhbnRpYXRlZCB2aWEgdGhlIHRlbXBsYXRlIFNoYWRlclByb2dyYW0KKy8vIGNsYXNzLgorY2xhc3MgU2hhZGVyUHJvZ3JhbUJhc2UgeworIHB1YmxpYzoKKyAgR0x1aW50IEdldEhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIGhhbmRsZV87IH0KKworIHByb3RlY3RlZDoKKyAgLy8gU2hhZGVyIHByb2dyYW1zIHNob3VsZCBvbmx5IGJlIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBieSB0aGUKKyAgLy8gU2hhZGVyUHJvZ3JhbU1hbmFnZXIuCisgIGZyaWVuZCBjbGFzcyBTaGFkZXJQcm9ncmFtTWFuYWdlcjsKKworICBTaGFkZXJQcm9ncmFtQmFzZSgpOworICB2aXJ0dWFsIH5TaGFkZXJQcm9ncmFtQmFzZSgpOworICB2b2lkIENyZWF0ZShTaGFkZXJCYXNlKiB2ZXJ0ZXhfc2hhZGVyLCBTaGFkZXJCYXNlKiBmcmFnbWVudF9zaGFkZXIpOworICB2b2lkIERlc3Ryb3koU2hhZGVyQmFzZSogdmVydGV4X3NoYWRlciwgU2hhZGVyQmFzZSogZnJhZ21lbnRfc2hhZGVyKTsKKworIHByaXZhdGU6CisgIEdMdWludCBoYW5kbGVfOworfTsKKworLy8gVGhpcyB0ZW1wbGF0ZSBTaGFkZXJQcm9ncmFtIGNsYXNzIHJlcHJlc2VudHMgYSBzaGFkZXIgcHJvZ3JhbSB3aXRoIHNwZWNpZmljCisvLyB2ZXJ0ZXggYW5kIGZyYWdtZW50IHNoYWRlcnMuIFRoZSBzaGFkZXJzIG11c3QgaW5oZXJpdCBmcm9tIFNoYWRlckJhc2UuCit0ZW1wbGF0ZTx0eXBlbmFtZSBWZXJ0ZXhTaGFkZXIsIHR5cGVuYW1lIEZyYWdtZW50U2hhZGVyPgorY2xhc3MgU2hhZGVyUHJvZ3JhbSA6IHB1YmxpYyBTaGFkZXJQcm9ncmFtQmFzZSB7CisgcHVibGljOgorICBjb25zdCBWZXJ0ZXhTaGFkZXImIEdldFZlcnRleFNoYWRlcigpIGNvbnN0IHsKKyAgICByZXR1cm4gdmVydGV4X3NoYWRlcl87CisgIH0KKyAgY29uc3QgRnJhZ21lbnRTaGFkZXImIEdldEZyYWdtZW50U2hhZGVyKCkgY29uc3QgeworICAgIHJldHVybiBmcmFnbWVudF9zaGFkZXJfOworICB9CisKKyBwcml2YXRlOgorICAvLyBTaGFkZXIgcHJvZ3JhbXMgc2hvdWxkIG9ubHkgYmUgY3JlYXRlZCBhbmQgZGVzdHJveWVkIGJ5IHRoZQorICAvLyBTaGFkZXJQcm9ncmFtTWFuYWdlci4KKyAgZnJpZW5kIGNsYXNzIFNoYWRlclByb2dyYW1NYW5hZ2VyOworCisgIFNoYWRlclByb2dyYW0oKSB7CisgICAgQ3JlYXRlKCZ2ZXJ0ZXhfc2hhZGVyXywgJmZyYWdtZW50X3NoYWRlcl8pOworICB9CisgIH5TaGFkZXJQcm9ncmFtKCkgT1ZFUlJJREUgeworICAgIERlc3Ryb3koJnZlcnRleF9zaGFkZXJfLCAmZnJhZ21lbnRfc2hhZGVyXyk7CisgIH0KKworICBWZXJ0ZXhTaGFkZXIgdmVydGV4X3NoYWRlcl87CisgIEZyYWdtZW50U2hhZGVyIGZyYWdtZW50X3NoYWRlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX1NIQURFUl9QUk9HUkFNX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcl9wcm9ncmFtX21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcl9wcm9ncmFtX21hbmFnZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDQxODk5MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW1fbWFuYWdlci5jYwpAQCAtMCwwICsxLDU1IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcl9wcm9ncmFtX21hbmFnZXIuaCIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHJlbmRlcmVyIHsKK25hbWVzcGFjZSByYXN0ZXJpemVyIHsKK25hbWVzcGFjZSBlZ2wgeworCitTaGFkZXJQcm9ncmFtTWFuYWdlcjo6U2hhZGVyUHJvZ3JhbU1hbmFnZXIoKSB7Cit9CisKK1NoYWRlclByb2dyYW1NYW5hZ2VyOjp+U2hhZGVyUHJvZ3JhbU1hbmFnZXIoKSB7CisgIEdMX0NBTEwoZ2xVc2VQcm9ncmFtKDApKTsKKyAgZm9yIChQcm9ncmFtTWFwOjppdGVyYXRvciBpdGVyID0gcHJvZ3JhbV9tYXBfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBwcm9ncmFtX21hcF8uZW5kKCk7ICsraXRlcikgeworICAgIGRlbGV0ZSBpdGVyLT5zZWNvbmQ7CisgIH0KK30KKworU2hhZGVyUHJvZ3JhbUJhc2UqIFNoYWRlclByb2dyYW1NYW5hZ2VyOjpGaW5kUHJvZ3JhbSgKKyAgICBiYXNlOjpUeXBlSWQgcHJvZ3JhbV90eXBlX2lkKSB7CisgIFByb2dyYW1NYXA6Oml0ZXJhdG9yIGl0ZXIgPSBwcm9ncmFtX21hcF8uZmluZChwcm9ncmFtX3R5cGVfaWQpOworICBpZiAoaXRlciAhPSBwcm9ncmFtX21hcF8uZW5kKCkpIHsKKyAgICByZXR1cm4gaXRlci0+c2Vjb25kOworICB9IGVsc2UgeworICAgIHJldHVybiBOVUxMOworICB9Cit9CisKK3ZvaWQgU2hhZGVyUHJvZ3JhbU1hbmFnZXI6OkFkZFByb2dyYW0oYmFzZTo6VHlwZUlkIHByb2dyYW1fdHlwZV9pZCwKKyAgICBTaGFkZXJQcm9ncmFtQmFzZSogcHJvZ3JhbSkgeworICBwcm9ncmFtX21hcF9bcHJvZ3JhbV90eXBlX2lkXSA9IHByb2dyYW07Cit9CisKK30gIC8vIG5hbWVzcGFjZSBlZ2wKK30gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCit9ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW1fbWFuYWdlci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfcHJvZ3JhbV9tYW5hZ2VyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjljMzk2ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW1fbWFuYWdlci5oCkBAIC0wLDAgKzEsNjcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX1NIQURFUl9QUk9HUkFNX01BTkFHRVJfSF8KKyNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX1NIQURFUl9QUk9HUkFNX01BTkFHRVJfSF8KKworI2luY2x1ZGUgImJhc2UvY29udGFpbmVycy9saW5rZWRfaGFzaF9tYXAuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgorI2luY2x1ZGUgImNvYmFsdC9iYXNlL3R5cGVfaWQuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVyX3Byb2dyYW0uaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworbmFtZXNwYWNlIHJhc3Rlcml6ZXIgeworbmFtZXNwYWNlIGVnbCB7CisKKy8vIFRoaXMgY2xhc3MgY2FjaGVzIHNoYWRlciBwcm9ncmFtcy4gVGhpcyBpcyBub3QgdGhyZWFkLXNhZmUsIGFuZCB0aGUgY2FsbGVyCisvLyBpcyBleHBlY3RlZCB0byBlbnN1cmUgYWNjZXNzIHRvIHRoZXNlIHNoYWRlciBwcm9ncmFtcyBvY2N1cnMgZnJvbSBhIHNpbmdsZQorLy8gY29udGV4dC4KK2NsYXNzIFNoYWRlclByb2dyYW1NYW5hZ2VyIHsKKyBwdWJsaWM6CisgIFNoYWRlclByb2dyYW1NYW5hZ2VyKCk7CisgIH5TaGFkZXJQcm9ncmFtTWFuYWdlcigpOworCisgIC8vIEdldCB0aGUgc3BlY2lmaWVkIHNoYWRlciBwcm9ncmFtIGZyb20gdGhlIGNhY2hlIG9yIGNvbXBpbGUgdGhlIHByb2dyYW0gaWYKKyAgLy8gaXQgd2Fzbid0IGNhY2hlZC4KKyAgLy8gTk9URTogSWYgYSBuZXcgcHJvZ3JhbSBuZWVkZWQgdG8gYmUgY29tcGlsZWQsIHRoZW4gdGhlIGN1cnJlbnQKKyAgLy8gZ2xVc2VQcm9ncmFtIHN0YXRlIG1heSBiZSBhbHRlcmVkIGFzIHBhcnQgb2YgdGhlIHByb2dyYW0gaW5pdGlhbGl6YXRpb24uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFNoYWRlclByb2dyYW1UeXBlPgorICB2b2lkIEdldFByb2dyYW0oU2hhZGVyUHJvZ3JhbVR5cGUqKiBvdXRfcHJvZ3JhbSk7CisKKyBwcm90ZWN0ZWQ6CisgIFNoYWRlclByb2dyYW1CYXNlKiBGaW5kUHJvZ3JhbShiYXNlOjpUeXBlSWQgcHJvZ3JhbV90eXBlX2lkKTsKKyAgdm9pZCBBZGRQcm9ncmFtKGJhc2U6OlR5cGVJZCBwcm9ncmFtX3R5cGVfaWQsIFNoYWRlclByb2dyYW1CYXNlKiBwcm9ncmFtKTsKKworICB0eXBlZGVmIGJhc2U6OmxpbmtlZF9oYXNoX21hcDxiYXNlOjpUeXBlSWQsIFNoYWRlclByb2dyYW1CYXNlKj4gUHJvZ3JhbU1hcDsKKyAgUHJvZ3JhbU1hcCBwcm9ncmFtX21hcF87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBTaGFkZXJQcm9ncmFtVHlwZT4KK2lubGluZSB2b2lkIFNoYWRlclByb2dyYW1NYW5hZ2VyOjpHZXRQcm9ncmFtKFNoYWRlclByb2dyYW1UeXBlKiogb3V0X3Byb2dyYW0pIHsKKyAgYmFzZTo6VHlwZUlkIHByb2dyYW1fdHlwZV9pZCA9IGJhc2U6OkdldFR5cGVJZDxTaGFkZXJQcm9ncmFtVHlwZT4oKTsKKyAgU2hhZGVyUHJvZ3JhbUJhc2UqIHByb2dyYW0gPSBGaW5kUHJvZ3JhbShwcm9ncmFtX3R5cGVfaWQpOworICBpZiAocHJvZ3JhbSA9PSBOVUxMKSB7CisgICAgcHJvZ3JhbSA9IG5ldyBTaGFkZXJQcm9ncmFtVHlwZSgpOworICAgIEFkZFByb2dyYW0ocHJvZ3JhbV90eXBlX2lkLCBwcm9ncmFtKTsKKyAgfQorICAqb3V0X3Byb2dyYW0gPSBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxTaGFkZXJQcm9ncmFtVHlwZSo+KHByb2dyYW0pOworfQorCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisKKyNlbmRpZiAgLy8gQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfRUdMX1NIQURFUl9QUk9HUkFNX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvci5nbHNsIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X2NvbG9yLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWQ3Mjg2NAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9mcmFnbWVudF9jb2xvci5nbHNsCkBAIC0wLDAgKzEsNSBAQAorcHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7DQordmFyeWluZyB2ZWM0IHZfY29sb3I7DQordm9pZCBtYWluKCkgew0KKyAgZ2xfRnJhZ0NvbG9yID0gdl9jb2xvcjsNCit9DQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X3RleGNvb3JkLmdsc2wgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfdGV4Y29vcmQuZ2xzbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YzcyNjMwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2ZyYWdtZW50X3RleGNvb3JkLmdsc2wKQEAgLTAsMCArMSw2IEBACitwcmVjaXNpb24gbWVkaXVtcCBmbG9hdDsNCit1bmlmb3JtIHNhbXBsZXIyRCB1X3RleHR1cmU7DQordmFyeWluZyB2ZWMyIHZfdGV4Y29vcmQ7DQordm9pZCBtYWluKCkgew0KKyAgZ2xfRnJhZ0NvbG9yID0gdGV4dHVyZTJEKHVfdGV4dHVyZSwgdl90ZXhjb29yZCk7DQorfQ0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9nZW5lcmF0ZV9zaGFkZXJfaW1wbC5weSBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9nZW5lcmF0ZV9zaGFkZXJfaW1wbC5weQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmRmNWZlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2dlbmVyYXRlX3NoYWRlcl9pbXBsLnB5CkBAIC0wLDAgKzEsMzQxIEBACisjIS91c3IvYmluL3B5dGhvbgorIyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorIworIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyMKKyMgICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorIworIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisjIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisiIiJQYXJzZSBHTFNMIHNoYWRlciBmaWxlcyB0byBnZW5lcmF0ZSBDKysgY2xhc3Nlcy4KKworVGhpcyBzY3JpcHQgcGFyc2VzIGFsbCBHTFNMIHNoYWRlciBpbnB1dCBmaWxlcyB0byBnZW5lcmF0ZSBDKysgY2xhc3MKK2RlZmluaXRpb25zIHdoaWNoIGluaGVyaXQgZnJvbSBTaGFkZXJCYXNlOgorCisgIGNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfYmFzZS5oCisKK1RoZSBjbGFzc2VzIHdpbGwgaGF2ZSBtZW1iZXIgZnVuY3Rpb25zIHRvIGFjY2VzcyBhbnkgImF0dHJpYnV0ZSIgb3IgInVuaWZvcm0iCittZW1iZXIocykgZm91bmQgaW4gdGhlIHNoYWRlciBmaWxlLiBGb3IgZXhhbXBsZSwgYSBzaGFkZXIgZmlsZSB3aXRoIHRoZQorZm9sbG93aW5nIGxpbmVzOgorCisgIHVuaWZvcm0gbWF0MyB1X3ZpZXdfbWF0cml4OworICB1bmlmb3JtIHNhbXBsZXIyZCBpbnRleHR1cmU7CisgIGF0dHJpYnV0ZSB2ZWMyIGlucG9zaXRpb247CisgIGF0dHJpYnV0ZSBmbG9hdCBhX2RlcHRoOworCit3aWxsIGhhdmUgdGhlIGZvbGxvd2luZyBtZW1iZXIgZnVuY3Rpb25zIGluIHRoZSBnZW5lcmF0ZWQgY2xhc3M6CisKKyAgR0x1aW50IGludGV4dHVyZSgpIGNvbnN0OworICBHTGVudW0gaW50ZXh0dXJlX3RleHVuaXQoKSBjb25zdDsKKyAgR0x1aW50IHVfdmlld19tYXRyaXgoKSBjb25zdDsKKyAgR0x1aW50IGlucG9zaXRpb24oKSBjb25zdDsKKyAgR0x1aW50IGFfZGVwdGgoKSBjb25zdDsKKworQWRkaXRpb25hbGx5LCB0aGUgZ2VuZXJhdGVkIGNsYXNzZXMgd2lsbCBpbmNsdWRlIGRlZmluaXRpb25zIHRvIGJpbmQgYXR0cmlidXRlCitsb2NhdGlvbnMsIHF1ZXJ5IHVuaWZvcm0gbG9jYXRpb25zLCBhbmQgaW5pdGlhbGl6ZSB1bmlmb3JtIHNhbXBsZXJzIHRvIGRlZmF1bHQKK3RleHR1cmUgdW5pdHMuIFRoZXNlIGFyZSBkb25lIGluIHRoZSBjbGFzcycgSW5pdGlhbGl6ZVByZUxpbmssCitJbml0aWFsaXplUG9zdExpbmssIGFuZCBJbml0aWFsaXplUG9zdFVzZSBmdW5jdGlvbnMsIHJlc3BlY3RpdmVseS4KKyIiIgorCitpbXBvcnQgZGF0ZXRpbWUKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3lzCisKKworZGVmIEdldEJhc2VuYW1lKGZpbGVuYW1lKToKKyAgIiIiUmV0dXJucyB0aGUgZmlsZW5hbWUgd2l0aG91dCB0aGUgZGlyZWN0b3J5IGFuZCB3aXRob3V0IGl0cyBleHRlbnNpb24uCisKKyAgQXJnczoKKyAgICBmaWxlbmFtZTogQSBmaWxlbmFtZSBmcm9tIHdoaWNoIGEgYmFzZW5hbWUgaXMgdG8gYmUgZXh0cmFjdGVkLgorCisgIFJldHVybnM6CisgICAgQSBzdHJpbmcgZGVyaXZlZCBmcm9tIHRoZSBmaWxlbmFtZSBleGNlcHQgdGhlIGRpcmVjdG9yeSBhbmQgZXh0ZW5zaW9uCisgICAgYXJlIHJlbW92ZWQuCisgICIiIgorICByZXR1cm4gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGZpbGVuYW1lKSlbMF0KKworCitkZWYgR2V0U2hhZGVyQ2xhc3NOYW1lKGZpbGVuYW1lKToKKyAgIiIiUmV0dXJucyBhIEMrKyBjbGFzcyBuYW1lIGJhc2VkIG9uIHRoZSBnaXZlbiBmaWxlIG5hbWUuIiIiCisgICMgQ29udmVydCB1bmRlcnNjb3JlLWRlbGluZWF0ZWQgc3RyaW5nIHRvIGNhbWVsY2FzZSBhbmQgcHJlcGVuZHMgJ1NoYWRlcicuCisgIGNsYXNzX25hbWUgPSAnJy5qb2luKHguY2FwaXRhbGl6ZSgpIGZvciB4IGluCisgICAgICAgICAgICAgICAgICAgICAgIEdldEJhc2VuYW1lKGZpbGVuYW1lKS5sb3dlcigpLnNwbGl0KCdfJykpCisgIHJldHVybiAnU2hhZGVyJyArIGNsYXNzX25hbWUKKworCitkZWYgR2V0RGF0YURlZmluaXRpb25TdHJpbmdGb3JGaWxlKGZpbGVuYW1lKToKKyAgIiIiUmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIEMrKyBhcnJheSBkZWZpbml0aW9uIGZvciBmaWxlIGNvbnRlbnRzLiIiIgorICB3aXRoIG9wZW4oZmlsZW5hbWUsICdyYicpIGFzIGY6CisgICAgIyBSZWFkIHRoZSBmaWxlIGNvbnRlbnRzIGFuZCBhZGQgYSBudWxsIHRlcm1pbmF0b3IgYXQgdGhlIGVuZC4KKyAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkgKyAnXDAnCisgICAgZGVmIEdldENodW5rKGNvbnRlbnRzLCBjaHVua19zaXplKToKKyAgICAgICMgWWllbGQgc3VjY2Vzc2l2ZSB8Y2h1bmtfc2l6ZXwtc2l6ZWQgY2h1bmtzIGZyb20gfGNvbnRlbnRzfC4KKyAgICAgIGZvciBpIGluIHhyYW5nZSgwLCBsZW4oY29udGVudHMpLCBjaHVua19zaXplKToKKyAgICAgICAgeWllbGQgY29udGVudHNbaTppICsgY2h1bmtfc2l6ZV0KKworICAgICMgQnJlYWsgdXAgdGhlIGRhdGEgaW50byBjaHVuayBzaXplcyBzdWNoIHRoYXQgdGhlIHByb2R1Y2VkIG91dHB1dCBsaW5lcworICAgICMgcmVwcmVzZW50aW5nIHRoZSBkYXRhIGluIHRoZSAuaCBmaWxlIGFyZSBsZXNzIHRoYW4gODAgY2hhcmFjdGVycyBsb25nLgorICAgIGxlbmd0aF9vZl9vdXRwdXRfYnl0ZV9zdHJpbmcgPSA2CisgICAgbWF4X2NoYXJhY3RlcnNfcGVyX2xpbmUgPSA4MAorICAgIGNodW5rX3NpemUgPSBtYXhfY2hhcmFjdGVyc19wZXJfbGluZSAvIGxlbmd0aF9vZl9vdXRwdXRfYnl0ZV9zdHJpbmcKKworICAgICMgQ29udmVydCBlYWNoIGJ5dGUgdG8gQVNDSUkgaGV4YWRlY2ltYWwgZm9ybSBhbmQgb3V0cHV0IHRoYXQgdG8gdGhlIEMrKworICAgICMgaGVhZGVyIGZpbGUsIGxpbmUtYnktbGluZS4KKyAgICBkYXRhX2RlZmluaXRpb25fc3RyaW5nID0gJ3tcbicKKyAgICBmb3Igb3V0cHV0X2xpbmVfZGF0YSBpbiBHZXRDaHVuayhmaWxlX2NvbnRlbnRzLCBjaHVua19zaXplKToKKyAgICAgIGRhdGFfZGVmaW5pdGlvbl9zdHJpbmcgKz0gKAorICAgICAgICAgICcgICcgKworICAgICAgICAgICcgJy5qb2luKFsnMHglMDJ4LCcgJSBvcmQoeSkgZm9yIHkgaW4gb3V0cHV0X2xpbmVfZGF0YV0pICsKKyAgICAgICAgICAnXG4nKQorICAgIGRhdGFfZGVmaW5pdGlvbl9zdHJpbmcgKz0gJ307XG4nCisgICAgcmV0dXJuIGRhdGFfZGVmaW5pdGlvbl9zdHJpbmcKKworCitkZWYgR2V0U2hhZGVyU291cmNlRGVmaW5pdGlvbnMoZmlsZXMpOgorICAiIiJSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgQysrIHRoYXQgcmVwcmVzZW50cyBhbGwgZGF0YSBpbiBmaWxlcy4iIiIKKyAgc291cmNlX2RlZmluaXRpb25fc3RyaW5nID0gJycKKyAgZm9yIGZpbGVuYW1lIGluIGZpbGVzOgorICAgIGNsYXNzX25hbWUgPSBHZXRTaGFkZXJDbGFzc05hbWUoZmlsZW5hbWUpCisgICAgc291cmNlX2RlZmluaXRpb25fc3RyaW5nICs9ICdcbmNvbnN0IGNoYXIgJXM6OmtTb3VyY2VbXSA9ICcgJSBjbGFzc19uYW1lCisgICAgc291cmNlX2RlZmluaXRpb25fc3RyaW5nICs9IEdldERhdGFEZWZpbml0aW9uU3RyaW5nRm9yRmlsZShmaWxlbmFtZSkKKyAgcmV0dXJuIHNvdXJjZV9kZWZpbml0aW9uX3N0cmluZworCisKK1NPVVJDRV9GSUxFX1RFTVBMQVRFID0gIiIiXAorLy8gQ29weXJpZ2h0IHt5ZWFyfSBHb29nbGUgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnk6CisvLyAgIGNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9nZW5lcmF0ZV9zaGFkZXJfaW1wbC5weQorLy8gRG8gbm90IGVkaXQhCisKKyNpbmNsdWRlICJ7aGVhZGVyX2ZpbGVuYW1lfSIKKworbmFtZXNwYWNlIGNvYmFsdCB7eworbmFtZXNwYWNlIHJlbmRlcmVyIHt7CituYW1lc3BhY2UgcmFzdGVyaXplciB7eworbmFtZXNwYWNlIGVnbCB7ewore3NvdXJjZV9kZWZpbml0aW9uc30KK319ICAvLyBuYW1lc3BhY2UgZWdsCit9fSAgLy8gbmFtZXNwYWNlIHJhc3Rlcml6ZXIKK319ICAvLyBuYW1lc3BhY2UgcmVuZGVyZXIKK319ICAvLyBuYW1lc3BhY2UgY29iYWx0CisiIiIKKworCitkZWYgR2VuZXJhdGVTb3VyY2VGaWxlKHNvdXJjZV9maWxlbmFtZSwgaGVhZGVyX2ZpbGVuYW1lLCBhbGxfc2hhZGVycyk6CisgICIiIkdlbmVyYXRlIHRoZSBhY3R1YWwgQysrIHNvdXJjZSBmaWxlLiIiIgorICBoZWFkZXJfZmlsZW5hbWUgPSBvcy5wYXRoLmJhc2VuYW1lKGhlYWRlcl9maWxlbmFtZSkKKyAgY3VycmVudF95ZWFyID0gZGF0ZXRpbWUuZGF0ZXRpbWUubm93KCkueWVhcgorICB3aXRoIG9wZW4oc291cmNlX2ZpbGVuYW1lLCAndycpIGFzIG91dHB1dF9maWxlOgorICAgIG91dHB1dF9maWxlLndyaXRlKAorICAgICAgICBTT1VSQ0VfRklMRV9URU1QTEFURS5mb3JtYXQoCisgICAgICAgICAgICB5ZWFyPWN1cnJlbnRfeWVhciwKKyAgICAgICAgICAgIGhlYWRlcl9maWxlbmFtZT1oZWFkZXJfZmlsZW5hbWUsCisgICAgICAgICAgICBzb3VyY2VfZGVmaW5pdGlvbnM9R2V0U2hhZGVyU291cmNlRGVmaW5pdGlvbnMoYWxsX3NoYWRlcnMpKSkKKworCitkZWYgSW5kZW50TGluZXMobGluZXMsIGluZGVudF9jb3VudCk6CisgICIiIkluZGVudCBhbGwgbGluZXMgYnkgdGhlIGdpdmVuIGFtb3VudC4iIiIKKyAgbGluZV9zdGFydCA9ICdcbicgKyAnICcgKiBpbmRlbnRfY291bnQKKyAgcmV0dXJuIGxpbmVzLnJlcGxhY2UoJ1xuJywgbGluZV9zdGFydCkKKworCitkZWYgR2V0U2hhZGVySW5wdXRzKGZpbGVuYW1lKToKKyAgIiIiUmV0dXJuIGFsbCBhdHRyaWJ1dGVzLCB1bmlmb3JtcywgYW5kIHNhbXBsZXJzIGluIHRoZSBnaXZlbiBzaGFkZXIgZmlsZS4iIiIKKyAgYXR0cmlidXRlcyA9IFtdCisgIHVuaWZvcm1zID0gW10KKyAgc2FtcGxlcnMgPSBbXQorCisgIHdpdGggb3BlbihmaWxlbmFtZSwgJ3InKSBhcyBmOgorICAgICMgUmVhZCBmaWxlIGFzIGEgc2luZ2xlIHN0cmluZyB0byBmYWNpbGl0YXRlIGNvbW1lbnQgcmVtb3ZhbC4KKyAgICBmaWxlX2NvbnRlbnRzID0gZi5yZWFkKCkKKworICAgICMgUmVtb3ZlIGNvbW1lbnRzIGFuZCBkaXJlY3RpdmVzLgorICAgIGZpbGVfY29udGVudHMgPSByZS5zdWIocicvXCouKj9cKi8nLCAnJywgZmlsZV9jb250ZW50cywgZmxhZ3M9cmUuRE9UQUxMKQorICAgIGZpbGVfY29udGVudHMgPSByZS5zdWIocidcIy4qJywgJycsIGZpbGVfY29udGVudHMpCisgICAgZmlsZV9jb250ZW50cyA9IHJlLnN1YihyJy8vLionLCAnJywgZmlsZV9jb250ZW50cykKKworICAgICMgUmVtb3ZlIGV2ZXJ5dGhpbmcgYXNzb2NpYXRlZCB3aXRoIHRoZSBtYWluIHByb2dyYW0uCisgICAgZmlsZV9jb250ZW50cyA9IHJlLnN1YihyJ3ZvaWQgbWFpblwoXCkgLionLCAnJywgZmlsZV9jb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzPXJlLkRPVEFMTCkKKworICAgICMgTWF0Y2ggYXR0cmlidXRlcywgdW5pZm9ybXMsIGFuZCBzYW1wbGVycyAoYSBzdWJzZXQgb2YgdW5pZm9ybXMpLgorICAgIGZvciBsaW5lIGluIGZpbGVfY29udGVudHMuc3BsaXQoJzsnKToKKyAgICAgIHdvcmRzID0gbGluZS5zdHJpcCgpLnNwbGl0KCkKKyAgICAgIGlmIGxlbih3b3JkcykgPT0gMzoKKyAgICAgICAgdHlwZV9uYW1lID0gd29yZHNbMF0ubG93ZXIoKQorICAgICAgICBpZiB0eXBlX25hbWUgPT0gJ2F0dHJpYnV0ZSc6CisgICAgICAgICAgYXR0cmlidXRlcy5hcHBlbmQod29yZHNbMl0pCisgICAgICAgIGVsaWYgdHlwZV9uYW1lID09ICd1bmlmb3JtJzoKKyAgICAgICAgICB1bmlmb3Jtcy5hcHBlbmQod29yZHNbMl0pCisgICAgICAgICAgaWYgd29yZHNbMV0ubG93ZXIoKS5zdGFydHN3aXRoKCdzYW1wbGVyJyk6CisgICAgICAgICAgICBzYW1wbGVycy5hcHBlbmQod29yZHNbMl0pCisKKyAgcmV0dXJuIGF0dHJpYnV0ZXMsIHVuaWZvcm1zLCBzYW1wbGVycworCisKK2RlZiBHZXRBdHRyaWJ1dGVNZXRob2RzKGF0dHJpYnV0ZXMpOgorICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIEMrKyBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gYXR0cmlidXRlcy4iIiIKKyAgbWV0aG9kcyA9ICcnCisgIGZvciBpbmRleCwgbmFtZSBpbiBlbnVtZXJhdGUoYXR0cmlidXRlcyk6CisgICAgbWV0aG9kcyArPSAnXG5HTHVpbnQgezB9KCkgY29uc3Qge3sgcmV0dXJuIHsxfTsgfX0nLmZvcm1hdChuYW1lLCBpbmRleCkKKyAgcmV0dXJuIG1ldGhvZHMKKworCitkZWYgR2V0VW5pZm9ybU1ldGhvZHModW5pZm9ybXMpOgorICAiIiJSZXR1cm4gYSBzdHJpbmcgcmVwcmVzZW50aW5nIEMrKyBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gdW5pZm9ybXMuIiIiCisgIG1ldGhvZHMgPSAnJworICBmb3IgbmFtZSBpbiB1bmlmb3JtczoKKyAgICBtZXRob2RzICs9ICdcbkdMdWludCB7MH0oKSBjb25zdCB7eyByZXR1cm4gezB9XzsgfX0nLmZvcm1hdChuYW1lKQorICByZXR1cm4gbWV0aG9kcworCisKK2RlZiBHZXRTYW1wbGVyTWV0aG9kcyhzYW1wbGVycyk6CisgICIiIlJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIEMrKyBtZXRob2RzIGZvciB0aGUgZ2l2ZW4gc2FtcGxlcnMuIiIiCisgIG1ldGhvZHMgPSAnJworICBmb3IgaW5kZXgsIG5hbWUgaW4gZW51bWVyYXRlKHNhbXBsZXJzKToKKyAgICBtZXRob2RzICs9ICgnXG5HTGVudW0gezB9X3RleHVuaXQoKSBjb25zdCB7eyByZXR1cm4gR0xfVEVYVFVSRXsxfTsgfX0nCisgICAgICAgICAgICAgICAgLmZvcm1hdChuYW1lLCBpbmRleCkpCisgIHJldHVybiBtZXRob2RzCisKKworZGVmIEdldEluaXRpYWxpemVQcmVMaW5rKGF0dHJpYnV0ZXMpOgorICAiIiJSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyBDKysgc3RhdGVtZW50cyB0byBwcm9jZXNzIGR1cmluZyBwcmVsaW5rLiIiIgorICBzdGF0ZW1lbnRzID0gJycKKyAgZm9yIG5hbWUgaW4gYXR0cmlidXRlczoKKyAgICBzdGF0ZW1lbnRzICs9ICdcbkJpbmRBdHRyaWJMb2NhdGlvbihwcm9ncmFtLCB7MH0oKSwgInswfSIpOycuZm9ybWF0KG5hbWUpCisgIHJldHVybiBzdGF0ZW1lbnRzCisKKworZGVmIEdldEluaXRpYWxpemVQb3N0TGluayh1bmlmb3Jtcyk6CisgICIiIlJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIEMrKyBzdGF0ZW1lbnRzIHRvIHByb2Nlc3MgZHVyaW5nIHBvc3RsaW5rLiIiIgorICBzdGF0ZW1lbnRzID0gJycKKyAgZm9yIG5hbWUgaW4gdW5pZm9ybXM6CisgICAgc3RhdGVtZW50cyArPSAnXG57MH1fID0gR2V0VW5pZm9ybUxvY2F0aW9uKHByb2dyYW0sICJ7MH0iKTsnLmZvcm1hdChuYW1lKQorICByZXR1cm4gc3RhdGVtZW50cworCisKK2RlZiBHZXRJbml0aWFsaXplUG9zdFVzZShzYW1wbGVycyk6CisgICIiIlJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIEMrKyBzdGF0ZW1lbnRzIHRvIHByb2Nlc3MgZHVyaW5nIHBvc3R1c2UuIiIiCisgIHN0YXRlbWVudHMgPSAnJworICBmb3IgbmFtZSBpbiBzYW1wbGVyczoKKyAgICBzdGF0ZW1lbnRzICs9ICgnXG5TZXRUZXh0dXJlVW5pdEZvclVuaWZvcm1TYW1wbGVyKHswfSgpLCB7MH1fdGV4dW5pdCgpKTsnCisgICAgICAgICAgICAgICAgICAgLmZvcm1hdChuYW1lKSkKKyAgcmV0dXJuIHN0YXRlbWVudHMKKworCitkZWYgR2V0VmFyaWFibGVzKHZhcmlhYmxlX25hbWVzKToKKyAgIiIiUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRpbmcgQysrIG1lbWJlciB2YXJpYWJsZSBkZWNsYXJhdGlvbnMuIiIiCisgIHZhcmlhYmxlcyA9ICcnCisgIGZvciBuYW1lIGluIHZhcmlhYmxlX25hbWVzOgorICAgIHZhcmlhYmxlcyArPSAnXG5HTHVpbnQgezB9XzsnLmZvcm1hdChuYW1lKQorICByZXR1cm4gdmFyaWFibGVzCisKKworQ0xBU1NfVEVNUExBVEUgPSAiIiJcCitjbGFzcyB7Y2xhc3NfbmFtZX0gOiBwdWJsaWMgU2hhZGVyQmFzZSB7eworIHB1YmxpYzoKKyAgY29uc3QgY2hhciogR2V0U291cmNlKCkgY29uc3QgT1ZFUlJJREUge3sgcmV0dXJuIGtTb3VyY2U7IH19Cit7YXR0cmlidXRlX21ldGhvZHN9XAore3VuaWZvcm1fbWV0aG9kc31cCit7c2FtcGxlcl9tZXRob2RzfQorCisgcHJpdmF0ZToKKyAgdm9pZCBJbml0aWFsaXplUHJlTGluayhHTHVpbnQgcHJvZ3JhbSkgT1ZFUlJJREUge3tcCit7aW5pdGlhbGl6ZV9wcmVsaW5rfQorICB9fQorICB2b2lkIEluaXRpYWxpemVQb3N0TGluayhHTHVpbnQgcHJvZ3JhbSkgT1ZFUlJJREUge3tcCit7aW5pdGlhbGl6ZV9wb3N0bGlua30KKyAgfX0KKyAgdm9pZCBJbml0aWFsaXplUG9zdFVzZSgpIE9WRVJSSURFIHt7XAore2luaXRpYWxpemVfcG9zdHVzZX0KKyAgfX0KK3t2YXJpYWJsZXN9CisKKyAgc3RhdGljIGNvbnN0IGNoYXIga1NvdXJjZVtdOworfX07CisiIiIKKworCitkZWYgR2V0Q2xhc3NEZWZpbml0aW9uRm9yRmlsZShmaWxlbmFtZSk6CisgICIiIlJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIGEgQysrIGNsYXNzIGRlZmluaXRpb24gZm9yIGEgc2hhZGVyLiIiIgorICBhdHRyaWJ1dGVzLCB1bmlmb3Jtcywgc2FtcGxlcnMgPSBHZXRTaGFkZXJJbnB1dHMoZmlsZW5hbWUpCisgIHJldHVybiBDTEFTU19URU1QTEFURS5mb3JtYXQoCisgICAgICBjbGFzc19uYW1lPUdldFNoYWRlckNsYXNzTmFtZShmaWxlbmFtZSksCisgICAgICAjIEZvciB0aGUgZm9sbG93aW5nIGZpZWxkcywgZWFjaCBsaW5lIGluIHRoZSBzdHJpbmdzIHNob3VsZCBzdGFydCB3aXRoCisgICAgICAjIGEgbmV3bGluZS4KKyAgICAgIGF0dHJpYnV0ZV9tZXRob2RzPUluZGVudExpbmVzKEdldEF0dHJpYnV0ZU1ldGhvZHMoYXR0cmlidXRlcyksIDIpLAorICAgICAgdW5pZm9ybV9tZXRob2RzPUluZGVudExpbmVzKEdldFVuaWZvcm1NZXRob2RzKHVuaWZvcm1zKSwgMiksCisgICAgICBzYW1wbGVyX21ldGhvZHM9SW5kZW50TGluZXMoR2V0U2FtcGxlck1ldGhvZHMoc2FtcGxlcnMpLCAyKSwKKyAgICAgIGluaXRpYWxpemVfcHJlbGluaz1JbmRlbnRMaW5lcyhHZXRJbml0aWFsaXplUHJlTGluayhhdHRyaWJ1dGVzKSwgNCksCisgICAgICBpbml0aWFsaXplX3Bvc3RsaW5rPUluZGVudExpbmVzKEdldEluaXRpYWxpemVQb3N0TGluayh1bmlmb3JtcyksIDQpLAorICAgICAgaW5pdGlhbGl6ZV9wb3N0dXNlPUluZGVudExpbmVzKEdldEluaXRpYWxpemVQb3N0VXNlKHNhbXBsZXJzKSwgNCksCisgICAgICB2YXJpYWJsZXM9SW5kZW50TGluZXMoR2V0VmFyaWFibGVzKHVuaWZvcm1zKSwgMikpCisKKworZGVmIEdldFNoYWRlckNsYXNzRGVmaW5pdGlvbnMoZmlsZXMpOgorICAiIiJSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyBDKysgY2xhc3MgZGVmaW5pdGlvbnMgZm9yIGFsbCBnaXZlbiBmaWxlcy4iIiIKKyAgY2xhc3NfZGVmaW5pdGlvbl9zdHJpbmcgPSAnJworICBmb3IgZmlsZW5hbWUgaW4gZmlsZXM6CisgICAgY2xhc3NfZGVmaW5pdGlvbl9zdHJpbmcgKz0gJ1xuJyArIEdldENsYXNzRGVmaW5pdGlvbkZvckZpbGUoZmlsZW5hbWUpCisgIHJldHVybiBjbGFzc19kZWZpbml0aW9uX3N0cmluZworCisKK0hFQURFUl9GSUxFX1RFTVBMQVRFID0gIiIiXAorLy8gQ29weXJpZ2h0IHt5ZWFyfSBHb29nbGUgSW5jLiAgQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vIFRoaXMgZmlsZSBpcyBnZW5lcmF0ZWQgYnk6CisvLyAgIGNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9nZW5lcmF0ZV9zaGFkZXJfaW1wbC5weQorLy8gRG8gbm90IGVkaXQhCisKKyNpZm5kZWYge2luY2x1ZGVfZ3VhcmR9CisjZGVmaW5lIHtpbmNsdWRlX2d1YXJkfQorCisjaW5jbHVkZSAiYmFzZS9jb21waWxlcl9zcGVjaWZpYy5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJfYmFzZS5oIgorCituYW1lc3BhY2UgY29iYWx0IHt7CituYW1lc3BhY2UgcmVuZGVyZXIge3sKK25hbWVzcGFjZSByYXN0ZXJpemVyIHt7CituYW1lc3BhY2UgZWdsIHt7Cit7Y2xhc3NfZGVmaW5pdGlvbnN9Cit9fSAgLy8gbmFtZXNwYWNlIGVnbAorfX0gIC8vIG5hbWVzcGFjZSByYXN0ZXJpemVyCit9fSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9fSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIHtpbmNsdWRlX2d1YXJkfQorIiIiCisKKworZGVmIEdlbmVyYXRlSGVhZGVyRmlsZShvdXRwdXRfZmlsZW5hbWUsIGFsbF9zaGFkZXJzKToKKyAgIiIiR2VuZXJhdGUgdGhlIGFjdHVhbCBDKysgaGVhZGVyIGZpbGUuIiIiCisgIGluY2x1ZGVfZ3VhcmQgPSAnR0VORVJBVEVEXyVzX0hfJyAlIEdldEJhc2VuYW1lKG91dHB1dF9maWxlbmFtZSkudXBwZXIoKQorICBjdXJyZW50X3llYXIgPSBkYXRldGltZS5kYXRldGltZS5ub3coKS55ZWFyCisgIHdpdGggb3BlbihvdXRwdXRfZmlsZW5hbWUsICd3JykgYXMgb3V0cHV0X2ZpbGU6CisgICAgb3V0cHV0X2ZpbGUud3JpdGUoCisgICAgICAgIEhFQURFUl9GSUxFX1RFTVBMQVRFLmZvcm1hdCgKKyAgICAgICAgICAgIHllYXI9Y3VycmVudF95ZWFyLAorICAgICAgICAgICAgaW5jbHVkZV9ndWFyZD1pbmNsdWRlX2d1YXJkLAorICAgICAgICAgICAgY2xhc3NfZGVmaW5pdGlvbnM9R2V0U2hhZGVyQ2xhc3NEZWZpbml0aW9ucyhhbGxfc2hhZGVycykpKQorCisKK2RlZiBtYWluKG91dHB1dF9oZWFkZXJfZmlsZW5hbWUsIG91dHB1dF9zb3VyY2VfZmlsZW5hbWUsIHNoYWRlcl9maWxlc19maWxlKToKKyAgYWxsX3NoYWRlcl9maWxlcyA9IFtdCisgIHdpdGggb3BlbihzaGFkZXJfZmlsZXNfZmlsZSwgJ3InKSBhcyBpbnB1dF9maWxlOgorICAgIHNoYWRlcl9maWxlcyA9IGlucHV0X2ZpbGUucmVhZGxpbmVzKCkKKyAgICBmb3IgZmlsZW5hbWUgaW4gc2hhZGVyX2ZpbGVzOgorICAgICAgYWxsX3NoYWRlcl9maWxlcy5hcHBlbmQoZmlsZW5hbWUuc3RyaXAoKSkKKworICBHZW5lcmF0ZVNvdXJjZUZpbGUob3V0cHV0X3NvdXJjZV9maWxlbmFtZSwgb3V0cHV0X2hlYWRlcl9maWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGFsbF9zaGFkZXJfZmlsZXMpCisgIEdlbmVyYXRlSGVhZGVyRmlsZShvdXRwdXRfaGVhZGVyX2ZpbGVuYW1lLCBhbGxfc2hhZGVyX2ZpbGVzKQorCisKK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6CisgIG1haW4oc3lzLmFyZ3ZbMV0sIHN5cy5hcmd2WzJdLCBzeXMuYXJndlszXSkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9zaGFkZXJzLmd5cCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy9zaGFkZXJzLmd5cApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44M2RjMDgwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3NoYWRlcnMuZ3lwCkBAIC0wLDAgKzEsODggQEAKKyMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyMKKyMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisjCisjICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyMKKyMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworeworICAndmFyaWFibGVzJzogeworICAgICdvdXRwdXRfZGlyJzogJzwoU0hBUkVEX0lOVEVSTUVESUFURV9ESVIpL2VnbCcsCisgICAgJ3NoYWRlcl9pbXBsX2hlYWRlcic6ICc8KG91dHB1dF9kaXIpL2dlbmVyYXRlZF9zaGFkZXJfaW1wbC5oJywKKyAgICAnc2hhZGVyX2ltcGxfc291cmNlJzogJzwob3V0cHV0X2RpcikvZ2VuZXJhdGVkX3NoYWRlcl9pbXBsLmNjJywKKyAgICAnZ2VuZXJhdGVfY2xhc3Nfc2NyaXB0JzogJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL2dlbmVyYXRlX3NoYWRlcl9pbXBsLnB5JywKKyAgICAnc2hhZGVyX3NvdXJjZXMnOiBbCisgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfdGV4Y29vcmQuZ2xzbCcsCisgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvZnJhZ21lbnRfY29sb3IuZ2xzbCcsCisgICAgICAnPChERVBUSCkvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3RleGNvb3JkLmdsc2wnLAorICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zaGFkZXJzL3ZlcnRleF9jb2xvci5nbHNsJywKKyAgICBdLAorICB9LAorCisgICd0YXJnZXRzJzogWworICAgIHsKKyAgICAgICd0YXJnZXRfbmFtZSc6ICdnZW5lcmF0ZV9zaGFkZXJfaW1wbCcsCisgICAgICAndHlwZSc6ICdub25lJywKKyAgICAgICMgQmVjYXVzZSB3ZSBnZW5lcmF0ZSBhIGhlYWRlciwgd2UgbXVzdCBzZXQgdGhlIGhhcmRfZGVwZW5kZW5jeSBmbGFnLgorICAgICAgJ2hhcmRfZGVwZW5kZW5jeSc6IDEsCisgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAnaW5wdXRfc2hhZGVyX2ZpbGVzX2ZpbGUnOiAnPHwoZ2VuZXJhdGVfc2hhZGVyX2ltcGxfaW5wdXRzLnRtcCA8QChzaGFkZXJfc291cmNlcykpJywKKyAgICAgIH0sCisKKyAgICAgICdhY3Rpb25zJzogWworICAgICAgICB7CisgICAgICAgICAgIyBQYXJzZSBzaGFkZXIgZmlsZXMgdG8gY3JlYXRlIGEgaGVhZGVyIGFuZCBzb3VyY2UgZmlsZSB3aGljaCBjb250YWluCisgICAgICAgICAgIyBjbGFzc2VzIGVuY2Fwc3VsYXRpbmcgdGhlIHNoYWRlciBhdHRyaWJ1dGVzLCB1bmlmb3JtcywgYW5kIHNvdXJjZS4KKyAgICAgICAgICAnYWN0aW9uX25hbWUnOiAnY3JlYXRlX3NoYWRlcl9jbGFzc2VzJywKKyAgICAgICAgICAnaW5wdXRzJzogWworICAgICAgICAgICAgJzwoZ2VuZXJhdGVfY2xhc3Nfc2NyaXB0KScsCisgICAgICAgICAgICAnPChpbnB1dF9zaGFkZXJfZmlsZXNfZmlsZSknLAorICAgICAgICAgICAgJzxAKHNoYWRlcl9zb3VyY2VzKScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnb3V0cHV0cyc6IFsKKyAgICAgICAgICAgICc8KHNoYWRlcl9pbXBsX2hlYWRlciknLAorICAgICAgICAgICAgJzwoc2hhZGVyX2ltcGxfc291cmNlKScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnYWN0aW9uJzogWworICAgICAgICAgICAgJ3B5dGhvbicsCisgICAgICAgICAgICAnPChnZW5lcmF0ZV9jbGFzc19zY3JpcHQpJywKKyAgICAgICAgICAgICc8KHNoYWRlcl9pbXBsX2hlYWRlciknLAorICAgICAgICAgICAgJzwoc2hhZGVyX2ltcGxfc291cmNlKScsCisgICAgICAgICAgICAnPChpbnB1dF9zaGFkZXJfZmlsZXNfZmlsZSknLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ21lc3NhZ2UnOiAnR2VuZXJhdGluZyA8KHNoYWRlcl9pbXBsX2hlYWRlcikgYW5kIDwoc2hhZGVyX2ltcGxfc291cmNlKScsCisgICAgICAgIH0sCisgICAgICBdLAorICAgIH0sCisgICAgeworICAgICAgJ3RhcmdldF9uYW1lJzogJ3NoYWRlcnMnLAorICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgIyBXZSdyZSBkZXBlbmRpbmcgb24gYSB0YXJnZXQgd2hpY2ggZ2VuZXJhdGVzIGEgaGVhZGVyIGZpbGUsIHNvIG1ha2Ugc3VyZSBvdGhlcgorICAgICAgIyB0YXJnZXRzIHdoaWNoIG5lZWQgdGhlIGhlYWRlciBmaWxlIGtub3cgdGhpcy4KKyAgICAgICdoYXJkX2RlcGVuZGVuY3knOiAxLAorCisgICAgICAnc291cmNlcycgOiBbCisgICAgICAgICc8KHNoYWRlcl9pbXBsX2hlYWRlciknLAorICAgICAgICAnPChzaGFkZXJfaW1wbF9zb3VyY2UpJywKKyAgICAgIF0sCisKKyAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICdnZW5lcmF0ZV9zaGFkZXJfaW1wbCcsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvZWdsX2FuZF9nbGVzL2VnbF9hbmRfZ2xlcy5neXA6ZWdsX2FuZF9nbGVzJywKKyAgICAgIF0sCisKKyAgICAgICdkaXJlY3RfZGVwZW5kZW50X3NldHRpbmdzJzogeworICAgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAgICc8KFNIQVJFRF9JTlRFUk1FRElBVEVfRElSKScsCisgICAgICAgIF0sCisgICAgICB9LAorICAgIH0sCisgIF0sCit9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X2NvbG9yLmdsc2wgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X2NvbG9yLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWI2Y2Q4MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfY29sb3IuZ2xzbApAQCAtMCwwICsxLDExIEBACit1bmlmb3JtIHZlYzQgdV9jbGlwX2FkanVzdG1lbnQ7DQordW5pZm9ybSBtYXQzIHVfdmlld19tYXRyaXg7DQorYXR0cmlidXRlIHZlYzMgYV9wb3NpdGlvbjsNCithdHRyaWJ1dGUgdmVjNCBhX2NvbG9yOw0KK3ZhcnlpbmcgdmVjNCB2X2NvbG9yOw0KK3ZvaWQgbWFpbigpIHsNCisgIHZlYzMgcG9zMmQgPSB1X3ZpZXdfbWF0cml4ICogdmVjMyhhX3Bvc2l0aW9uLnh5LCAxKTsNCisgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3MyZC54eSAqIHVfY2xpcF9hZGp1c3RtZW50Lnh5ICsNCisgICAgICAgICAgICAgICAgICAgICB1X2NsaXBfYWRqdXN0bWVudC56dywgYV9wb3NpdGlvbi56LCBwb3MyZC56KTsNCisgIHZfY29sb3IgPSBhX2NvbG9yOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3RleGNvb3JkLmdsc2wgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NoYWRlcnMvdmVydGV4X3RleGNvb3JkLmdsc2wKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiZGJmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc2hhZGVycy92ZXJ0ZXhfdGV4Y29vcmQuZ2xzbApAQCAtMCwwICsxLDExIEBACit1bmlmb3JtIHZlYzQgdV9jbGlwX2FkanVzdG1lbnQ7DQordW5pZm9ybSBtYXQzIHVfdmlld19tYXRyaXg7DQorYXR0cmlidXRlIHZlYzMgYV9wb3NpdGlvbjsNCithdHRyaWJ1dGUgdmVjMiBhX3RleGNvb3JkOw0KK3ZhcnlpbmcgdmVjMiB2X3RleGNvb3JkOw0KK3ZvaWQgbWFpbigpIHsNCisgIHZlYzMgcG9zMmQgPSB1X3ZpZXdfbWF0cml4ICogdmVjMyhhX3Bvc2l0aW9uLnh5LCAxKTsNCisgIGdsX1Bvc2l0aW9uID0gdmVjNChwb3MyZC54eSAqIHVfY2xpcF9hZGp1c3RtZW50Lnh5ICsNCisgICAgICAgICAgICAgICAgICAgICB1X2NsaXBfYWRqdXN0bWVudC56dywgYV9wb3NpdGlvbi56LCBwb3MyZC56KTsNCisgIHZfdGV4Y29vcmQgPSBhX3RleGNvb3JkOw0KK30NCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MKaW5kZXggODc5OGIwNC4uYTg4MTFjOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDQ3OWNlN2UuLjEyMzg3YWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfU09GVFdBUkVfUkFTVEVSSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9FR0xfU09GVFdBUkVfUkFTVEVSSVpFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC90ZXh0dXJlZF9tZXNoX3JlbmRlcmVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC90ZXh0dXJlZF9tZXNoX3JlbmRlcmVyLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQyZmVkYTQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3RleHR1cmVkX21lc2hfcmVuZGVyZXIuY2MKQEAgLTAsMCArMSwyMzQgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5oIgorCisjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CisjaW5jbHVkZSA8R0xFUzIvZ2wyZXh0Lmg+CisKKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpbmNsdWRlICJjb2JhbHQvbWF0aC9zaXplLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3V0aWxzLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHJlbmRlcmVyIHsKK25hbWVzcGFjZSByYXN0ZXJpemVyIHsKK25hbWVzcGFjZSBlZ2wgeworCitUZXh0dXJlZE1lc2hSZW5kZXJlcjo6VGV4dHVyZWRNZXNoUmVuZGVyZXIoCisgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMKiBncmFwaGljc19jb250ZXh0KQorICAgIDogZ3JhcGhpY3NfY29udGV4dF8oZ3JhcGhpY3NfY29udGV4dCkge30KKworVGV4dHVyZWRNZXNoUmVuZGVyZXI6On5UZXh0dXJlZE1lc2hSZW5kZXJlcigpIHsKKyAgZ3JhcGhpY3NfY29udGV4dF8tPk1ha2VDdXJyZW50KCk7CisgIGlmIChxdWFkX3Zib18pIHsKKyAgICBHTF9DQUxMKGdsRGVsZXRlQnVmZmVycygxLCAmcXVhZF92Ym9fLnZhbHVlKCkpKTsKKyAgfQorICBmb3IgKHN0ZDo6bWFwPHVpbnQzMiwgdWludDMyPjo6aXRlcmF0b3IgaXRlciA9CisgICAgICAgICAgIGJsaXRfcHJvZ3JhbV9wZXJfdGV4dHVyZV90YXJnZXRfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBibGl0X3Byb2dyYW1fcGVyX3RleHR1cmVfdGFyZ2V0Xy5lbmQoKTsgKytpdGVyKSB7CisgICAgR0xfQ0FMTChnbERlbGV0ZVByb2dyYW0oaXRlci0+c2Vjb25kKSk7CisgIH0KK30KKworbmFtZXNwYWNlIHsKK3ZvaWQgQ29udmVydENvbnRlbnRSZWdpb25Ub1NjYWxlVHJhbnNsYXRlVmVjdG9yKAorICAgIGNvbnN0IG1hdGg6OlJlY3QqIGNvbnRlbnRfcmVnaW9uLCBjb25zdCBtYXRoOjpTaXplJiB0ZXh0dXJlX3NpemUsCisgICAgZmxvYXQqIG91dF92ZWM0KSB7CisgIFNiTWVtb3J5U2V0KG91dF92ZWM0LCAwLCBzaXplb2YoZmxvYXQpICogNCk7CisgIGlmICghY29udGVudF9yZWdpb24pIHsKKyAgICAvLyBJZiBubyBjb250ZW50IHJlZ2lvbiBpcyBwcm92aWRlZCwgdXNlIHRoZSBpZGVudGl0eSBtYXRyaXguCisgICAgb3V0X3ZlYzRbMF0gPSAxLjBmOworICAgIG91dF92ZWM0WzFdID0gMS4wZjsKKyAgICBvdXRfdmVjNFsyXSA9IDAuMGY7CisgICAgb3V0X3ZlYzRbM10gPSAwLjBmOworICAgIHJldHVybjsKKyAgfQorCisgIGZsb2F0IHNjYWxlX3ggPSAoY29udGVudF9yZWdpb24tPnJpZ2h0KCkgLSBjb250ZW50X3JlZ2lvbi0+eCgpKSAvCisgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxmbG9hdD4odGV4dHVyZV9zaXplLndpZHRoKCkpOworICBmbG9hdCBzY2FsZV95ID0gKGNvbnRlbnRfcmVnaW9uLT5ib3R0b20oKSAtIGNvbnRlbnRfcmVnaW9uLT55KCkpIC8KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGZsb2F0Pih0ZXh0dXJlX3NpemUuaGVpZ2h0KCkpOworICBmbG9hdCB0cmFuc2xhdGVfeCA9CisgICAgICBjb250ZW50X3JlZ2lvbi0+eCgpIC8gc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRleHR1cmVfc2l6ZS53aWR0aCgpKTsKKyAgZmxvYXQgdHJhbnNsYXRlX3kgPSAodGV4dHVyZV9zaXplLmhlaWdodCgpIC0gY29udGVudF9yZWdpb24tPmJvdHRvbSgpKSAvCisgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8ZmxvYXQ+KHRleHR1cmVfc2l6ZS5oZWlnaHQoKSk7CisgIG91dF92ZWM0WzBdID0gc2NhbGVfeDsKKyAgb3V0X3ZlYzRbMV0gPSBzY2FsZV95OworICBvdXRfdmVjNFsyXSA9IHRyYW5zbGF0ZV94OworICBvdXRfdmVjNFszXSA9IHRyYW5zbGF0ZV95OworfQorfSAgLy8gbmFtZXNwYWNlCisKK3ZvaWQgVGV4dHVyZWRNZXNoUmVuZGVyZXI6OlJlbmRlclZCTyh1aW50MzIgdmJvLCBpbnQgbnVtX3ZlcnRpY2VzLCB1aW50MzIgbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBiYWNrZW5kOjpUZXh0dXJlRUdMKiB0ZXh0dXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlJlY3QmIGNvbnRlbnRfcmVnaW9uKSB7CisgIHVpbnQzMiBibGl0X3Byb2dyYW0gPSBHZXRCbGl0UHJvZ3JhbSh0ZXh0dXJlLT5HZXRUYXJnZXQoKSk7CisKKyAgR0xfQ0FMTChnbFVzZVByb2dyYW0oYmxpdF9wcm9ncmFtKSk7CisKKyAgR0xfQ0FMTChnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCB2Ym8pKTsKKyAgR0xfQ0FMTChnbFZlcnRleEF0dHJpYlBvaW50ZXIoa0JsaXRQb3NpdGlvbkF0dHJpYnV0ZSwgMiwgR0xfRkxPQVQsIEdMX0ZBTFNFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZmxvYXQpICogNCwgMCkpOworICBHTF9DQUxMKGdsVmVydGV4QXR0cmliUG9pbnRlcihrQmxpdFRleGNvb3JkQXR0cmlidXRlLCAyLCBHTF9GTE9BVCwgR0xfRkFMU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihmbG9hdCkgKiA0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEdMdm9pZCo+KHNpemVvZihmbG9hdCkgKiAyKSkpOworICBHTF9DQUxMKGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoa0JsaXRQb3NpdGlvbkF0dHJpYnV0ZSkpOworICBHTF9DQUxMKGdsRW5hYmxlVmVydGV4QXR0cmliQXJyYXkoa0JsaXRUZXhjb29yZEF0dHJpYnV0ZSkpOworCisgIEdMX0NBTEwoZ2xBY3RpdmVUZXh0dXJlKEdMX1RFWFRVUkUwKSk7CisgIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZSh0ZXh0dXJlLT5HZXRUYXJnZXQoKSwgdGV4dHVyZS0+Z2xfaGFuZGxlKCkpKTsKKworICBmbG9hdCBzY2FsZV90cmFuc2xhdGVfdmVjdG9yWzRdOworICBDb252ZXJ0Q29udGVudFJlZ2lvblRvU2NhbGVUcmFuc2xhdGVWZWN0b3IoCisgICAgICAmY29udGVudF9yZWdpb24sIHRleHR1cmUtPkdldFNpemUoKSwgc2NhbGVfdHJhbnNsYXRlX3ZlY3Rvcik7CisgIEdMX0NBTEwoZ2xVbmlmb3JtNGZ2KHRleGNvb3JkX3NjYWxlX3RyYW5zbGF0ZV91bmlmb3JtXywgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgc2NhbGVfdHJhbnNsYXRlX3ZlY3RvcikpOworCisgIEdMX0NBTEwoZ2xEcmF3QXJyYXlzKG1vZGUsIDAsIG51bV92ZXJ0aWNlcykpOworCisgIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZSh0ZXh0dXJlLT5HZXRUYXJnZXQoKSwgMCkpOworCisgIEdMX0NBTEwoZ2xEaXNhYmxlVmVydGV4QXR0cmliQXJyYXkoa0JsaXRUZXhjb29yZEF0dHJpYnV0ZSkpOworICBHTF9DQUxMKGdsRGlzYWJsZVZlcnRleEF0dHJpYkFycmF5KGtCbGl0UG9zaXRpb25BdHRyaWJ1dGUpKTsKKyAgR0xfQ0FMTChnbFVzZVByb2dyYW0oMCkpOworfQorCit2b2lkIFRleHR1cmVkTWVzaFJlbmRlcmVyOjpSZW5kZXJRdWFkKGNvbnN0IGJhY2tlbmQ6OlRleHR1cmVFR0wqIHRleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hdGg6OlJlY3QmIGNvbnRlbnRfcmVnaW9uKSB7CisgIFJlbmRlclZCTyhHZXRRdWFkVkJPKCksIDQsIEdMX1RSSUFOR0xFX1NUUklQLCB0ZXh0dXJlLCBjb250ZW50X3JlZ2lvbik7Cit9CisKK3VpbnQzMiBUZXh0dXJlZE1lc2hSZW5kZXJlcjo6R2V0UXVhZFZCTygpIHsKKyAgaWYgKCFxdWFkX3Zib18pIHsKKyAgICAvLyBTZXR1cCBhIHZlcnRleCBidWZmZXIgdGhhdCBjYW4gYmxpdCBhIHF1YWQgd2l0aCBhIGZ1bGwgdGV4dHVyZSwgdG8gYmUKKyAgICAvLyB1c2VkIGJ5IEZyYW1lOjpCbGl0VG9SZW5kZXJUYXJnZXQoKS4KKyAgICBzdHJ1Y3QgUXVhZFZlcnRleCB7CisgICAgICBmbG9hdCBwb3NpdGlvbl94OworICAgICAgZmxvYXQgcG9zaXRpb25feTsKKyAgICAgIGZsb2F0IHRleF9jb29yZF91OworICAgICAgZmxvYXQgdGV4X2Nvb3JkX3Y7CisgICAgfTsKKyAgICBjb25zdCBRdWFkVmVydGV4IGtCbGl0UXVhZFZlcnRzWzRdID0geworICAgICAgICB7LTEuMGYsIC0xLjBmLCAwLjBmLCAwLjBmfSwKKyAgICAgICAgey0xLjBmLCAxLjBmLCAwLjBmLCAxLjBmfSwKKyAgICAgICAgezEuMGYsIC0xLjBmLCAxLjBmLCAwLjBmfSwKKyAgICAgICAgezEuMGYsIDEuMCwgMS4wZiwgMS4wZn0sCisgICAgfTsKKworICAgIHF1YWRfdmJvXyA9IDA7CisgICAgR0xfQ0FMTChnbEdlbkJ1ZmZlcnMoMSwgJnF1YWRfdmJvXy52YWx1ZSgpKSk7CisgICAgR0xfQ0FMTChnbEJpbmRCdWZmZXIoR0xfQVJSQVlfQlVGRkVSLCAqcXVhZF92Ym9fKSk7CisgICAgR0xfQ0FMTChnbEJ1ZmZlckRhdGEoR0xfQVJSQVlfQlVGRkVSLCBzaXplb2Yoa0JsaXRRdWFkVmVydHMpLAorICAgICAgICAgICAgICAgICAgICAgICAgIGtCbGl0UXVhZFZlcnRzLCBHTF9TVEFUSUNfRFJBVykpOworICB9CisKKyAgcmV0dXJuICpxdWFkX3Zib187Cit9CisKK3VpbnQzMiBUZXh0dXJlZE1lc2hSZW5kZXJlcjo6R2V0QmxpdFByb2dyYW0odWludDMyIHRleHR1cmVfdGFyZ2V0KSB7CisgIHN0ZDo6bWFwPHVpbnQzMiwgdWludDMyPjo6aXRlcmF0b3IgZm91bmQgPQorICAgICAgYmxpdF9wcm9ncmFtX3Blcl90ZXh0dXJlX3RhcmdldF8uZmluZCh0ZXh0dXJlX3RhcmdldCk7CisgIGlmIChmb3VuZCA9PSBibGl0X3Byb2dyYW1fcGVyX3RleHR1cmVfdGFyZ2V0Xy5lbmQoKSkgeworICAgIC8vIENyZWF0ZSB0aGUgYmxpdCBwcm9ncmFtLgorICAgIC8vIFNldHVwIHNoYWRlcnMgdXNlZCB3aGVuIGJsaXR0aW5nIHRoZSBjdXJyZW50IHRleHR1cmUuCisgICAgdWludDMyIGJsaXRfcHJvZ3JhbSA9IGdsQ3JlYXRlUHJvZ3JhbSgpOworCisgICAgdWludDMyIGJsaXRfdmVydGV4X3NoYWRlciA9IGdsQ3JlYXRlU2hhZGVyKEdMX1ZFUlRFWF9TSEFERVIpOworICAgIGNvbnN0IGNoYXIqIGJsaXRfdmVydGV4X3NoYWRlcl9zb3VyY2UgPQorICAgICAgICAiYXR0cmlidXRlIHZlYzIgYV9wb3NpdGlvbjsiCisgICAgICAgICJhdHRyaWJ1dGUgdmVjMiBhX3RleF9jb29yZDsiCisgICAgICAgICJ2YXJ5aW5nIHZlYzIgdl90ZXhfY29vcmQ7IgorICAgICAgICAidW5pZm9ybSB2ZWM0IHNjYWxlX3RyYW5zbGF0ZTsiCisgICAgICAgICJ2b2lkIG1haW4oKSB7IgorICAgICAgICAiICBnbF9Qb3NpdGlvbiA9IHZlYzQoYV9wb3NpdGlvbi54LCBhX3Bvc2l0aW9uLnksIDAsIDEpOyIKKyAgICAgICAgIiAgdl90ZXhfY29vcmQgPSAiCisgICAgICAgICIgICAgICBhX3RleF9jb29yZCAqIHNjYWxlX3RyYW5zbGF0ZS54eSArIHNjYWxlX3RyYW5zbGF0ZS56dzsiCisgICAgICAgICJ9IjsKKyAgICBpbnQgYmxpdF92ZXJ0ZXhfc2hhZGVyX3NvdXJjZV9sZW5ndGggPSBzdHJsZW4oYmxpdF92ZXJ0ZXhfc2hhZGVyX3NvdXJjZSk7CisgICAgR0xfQ0FMTChnbFNoYWRlclNvdXJjZShibGl0X3ZlcnRleF9zaGFkZXIsIDEsICZibGl0X3ZlcnRleF9zaGFkZXJfc291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsaXRfdmVydGV4X3NoYWRlcl9zb3VyY2VfbGVuZ3RoKSk7CisgICAgR0xfQ0FMTChnbENvbXBpbGVTaGFkZXIoYmxpdF92ZXJ0ZXhfc2hhZGVyKSk7CisKKyAgICBjaGFyIGJ1ZmZlclsyMDQ4XTsKKyAgICBpbnQgbGVuZ3RoOworICAgIGdsR2V0U2hhZGVySW5mb0xvZyhibGl0X3ZlcnRleF9zaGFkZXIsIDIwNDgsICZsZW5ndGgsIGJ1ZmZlcik7CisgICAgRExPRyhJTkZPKSA8PCAidmVydGV4IHNoYWRlcjogIiA8PCBidWZmZXI7CisKKyAgICBHTF9DQUxMKGdsQXR0YWNoU2hhZGVyKGJsaXRfcHJvZ3JhbSwgYmxpdF92ZXJ0ZXhfc2hhZGVyKSk7CisKKyAgICBzdGQ6OnN0cmluZyBzYW1wbGVyX3R5cGUgPSAic2FtcGxlciI7CisgICAgaWYgKHRleHR1cmVfdGFyZ2V0ID09IEdMX1RFWFRVUkVfRVhURVJOQUxfT0VTKSB7CisgICAgICBzYW1wbGVyX3R5cGUgPSAic2FtcGxlckV4dGVybmFsT0VTIjsKKyAgICB9CisgICAgdWludDMyIGJsaXRfZnJhZ21lbnRfc2hhZGVyID0gZ2xDcmVhdGVTaGFkZXIoR0xfRlJBR01FTlRfU0hBREVSKTsKKyAgICBzdGQ6OnN0cmluZyBibGl0X2ZyYWdtZW50X3NoYWRlcl9zb3VyY2UgPQorICAgICAgICAicHJlY2lzaW9uIG1lZGl1bXAgZmxvYXQ7IgorICAgICAgICAidmFyeWluZyB2ZWMyIHZfdGV4X2Nvb3JkOyIKKyAgICAgICAgInVuaWZvcm0gIiArCisgICAgICAgIHNhbXBsZXJfdHlwZSArCisgICAgICAgICIgdGV4dHVyZTsiCisgICAgICAgICJ2b2lkIG1haW4oKSB7IgorICAgICAgICAiICBnbF9GcmFnQ29sb3IgPSB0ZXh0dXJlMkQodGV4dHVyZSwgdl90ZXhfY29vcmQpOyIKKyAgICAgICAgIn0iOworICAgIGlmICh0ZXh0dXJlX3RhcmdldCA9PSBHTF9URVhUVVJFX0VYVEVSTkFMX09FUykgeworICAgICAgYmxpdF9mcmFnbWVudF9zaGFkZXJfc291cmNlID0KKyAgICAgICAgICAiI2V4dGVuc2lvbiBHTF9PRVNfRUdMX2ltYWdlX2V4dGVybmFsIDogcmVxdWlyZVxuIiArCisgICAgICAgICAgYmxpdF9mcmFnbWVudF9zaGFkZXJfc291cmNlOworICAgIH0KKworICAgIGludCBibGl0X2ZyYWdtZW50X3NoYWRlcl9zb3VyY2VfbGVuZ3RoID0gYmxpdF9mcmFnbWVudF9zaGFkZXJfc291cmNlLnNpemUoKTsKKyAgICBjb25zdCBjaGFyKiBibGl0X2ZyYWdtZW50X3NoYWRlcl9zb3VyY2VfY19zdHIgPQorICAgICAgICBibGl0X2ZyYWdtZW50X3NoYWRlcl9zb3VyY2UuY19zdHIoKTsKKyAgICBHTF9DQUxMKGdsU2hhZGVyU291cmNlKGJsaXRfZnJhZ21lbnRfc2hhZGVyLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJsaXRfZnJhZ21lbnRfc2hhZGVyX3NvdXJjZV9jX3N0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICZibGl0X2ZyYWdtZW50X3NoYWRlcl9zb3VyY2VfbGVuZ3RoKSk7CisgICAgR0xfQ0FMTChnbENvbXBpbGVTaGFkZXIoYmxpdF9mcmFnbWVudF9zaGFkZXIpKTsKKworICAgIGdsR2V0U2hhZGVySW5mb0xvZyhibGl0X2ZyYWdtZW50X3NoYWRlciwgMjA0OCwgJmxlbmd0aCwgYnVmZmVyKTsKKyAgICBETE9HKElORk8pIDw8ICJmcmFnbWVudCBzaGFkZXI6ICIgPDwgYnVmZmVyOworCisgICAgR0xfQ0FMTChnbEF0dGFjaFNoYWRlcihibGl0X3Byb2dyYW0sIGJsaXRfZnJhZ21lbnRfc2hhZGVyKSk7CisKKyAgICBHTF9DQUxMKGdsQmluZEF0dHJpYkxvY2F0aW9uKGJsaXRfcHJvZ3JhbSwga0JsaXRQb3NpdGlvbkF0dHJpYnV0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhX3Bvc2l0aW9uIikpOworICAgIEdMX0NBTEwoZ2xCaW5kQXR0cmliTG9jYXRpb24oYmxpdF9wcm9ncmFtLCBrQmxpdFRleGNvb3JkQXR0cmlidXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFfdGV4X2Nvb3JkIikpOworCisgICAgR0xfQ0FMTChnbExpbmtQcm9ncmFtKGJsaXRfcHJvZ3JhbSkpOworCisgICAgZ2xHZXRQcm9ncmFtSW5mb0xvZyhibGl0X3Byb2dyYW0sIDIwNDgsICZsZW5ndGgsIGJ1ZmZlcik7CisgICAgRExPRyhJTkZPKSA8PCBidWZmZXI7CisKKyAgICB0ZXhjb29yZF9zY2FsZV90cmFuc2xhdGVfdW5pZm9ybV8gPQorICAgICAgICBnbEdldFVuaWZvcm1Mb2NhdGlvbihibGl0X3Byb2dyYW0sICJzY2FsZV90cmFuc2xhdGUiKTsKKworICAgIEdMX0NBTEwoZ2xEZWxldGVTaGFkZXIoYmxpdF9mcmFnbWVudF9zaGFkZXIpKTsKKyAgICBHTF9DQUxMKGdsRGVsZXRlU2hhZGVyKGJsaXRfdmVydGV4X3NoYWRlcikpOworCisgICAgLy8gU2F2ZSBvdXIgc2hhZGVyIGludG8gdGhlIGNhY2hlLgorICAgIGZvdW5kID0KKyAgICAgICAgYmxpdF9wcm9ncmFtX3Blcl90ZXh0dXJlX3RhcmdldF8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKHRleHR1cmVfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmxpdF9wcm9ncmFtKSkKKyAgICAgICAgICAgIC5maXJzdDsKKyAgfQorCisgIHJldHVybiBmb3VuZC0+c2Vjb25kOworfQorCit9ICAvLyBuYW1lc3BhY2UgZWdsCit9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgorfSAgLy8gbmFtZXNwYWNlIHJlbmRlcmVyCit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3RleHR1cmVkX21lc2hfcmVuZGVyZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvdGV4dHVyZWRfbWVzaF9yZW5kZXJlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MDQ1MWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL3RleHR1cmVkX21lc2hfcmVuZGVyZXIuaApAQCAtMCwwICsxLDc5IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9URVhUVVJFRF9NRVNIX1JFTkRFUkVSX0hfCisjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9URVhUVVJFRF9NRVNIX1JFTkRFUkVSX0hfCisKKyNpbmNsdWRlIDxtYXA+CisKKyNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCisjaW5jbHVkZSAiY29iYWx0L21hdGgvcmVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmUuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2UgcmVuZGVyZXIgeworbmFtZXNwYWNlIHJhc3Rlcml6ZXIgeworbmFtZXNwYWNlIGVnbCB7CisKKy8vIEhlbHBlciBjbGFzcyB0byByZW5kZXIgdGV4dHVyZWQgbWVzaGVzLiAgVGhlIGNsYXNzIGlzIGNlbnRlcmVkIGFyb3VuZCB0aGUKKy8vIHB1YmxpYyBtZXRob2QgUmVuZGVyVkJPKCksIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlbmRlciBhbiBhcmJpdHJhcnkgR0xFUzIKKy8vIHZlcnRleCBidWZmZXIgb2JqZWN0ICh3aGVyZSBlYWNoIHZlcnRleCBoYXMgYSAzLWZsb2F0IHBvc2l0aW9uIGFuZCBhCisvLyAyLWZsb2F0IHRleHR1cmUgY29vcmRpbmF0ZSksIHdpdGggYSBzcGVjaWZpZWQgdGV4dHVyZSBhcHBsaWVkIHRvIGl0LgorY2xhc3MgVGV4dHVyZWRNZXNoUmVuZGVyZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVGV4dHVyZWRNZXNoUmVuZGVyZXIoYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMKiBncmFwaGljc19jb250ZXh0KTsKKyAgflRleHR1cmVkTWVzaFJlbmRlcmVyKCk7CisKKyAgLy8gQSBjb250ZXh0IG11c3QgYmUgY3VycmVudCBiZWZvcmUgdGhpcyBtZXRob2QgaXMgY2FsbGVkLiAgQmVmb3JlIGNhbGxpbmcKKyAgLy8gdGhpcyBmdW5jdGlvbiwgcGxlYXNlIGNvbmZpZ3VyZSBnbFZpZXdwb3J0KCkgYW5kIGdsU2Npc3NvcigpIGFzIGRlc2lyZWQuCisgIC8vIFRoZSBjb250ZW50IHJlZ2lvbiBpbmRpY2F0ZXMgd2hpY2ggc291cmNlIHJlY3RhbmdsZSBvZiB0aGUgaW5wdXQgdGV4dHVyZQorICAvLyBzaG91bGQgYmUgdXNlZCAoaS5lLiB0aGUgVkJPJ3MgdGV4dHVyZSBjb29yZGluYXRlcyB3aWxsIGJlIHRyYW5zZm9ybWVkIHRvCisgIC8vIGxpZSB3aXRoaW4gdGhpcyByZWN0YW5nbGUpLgorICB2b2lkIFJlbmRlclZCTyh1aW50MzIgdmJvLCBpbnQgbnVtX3ZlcnRpY2VzLCB1aW50MzIgbW9kZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgYmFja2VuZDo6VGV4dHVyZUVHTCogdGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6UmVjdCYgY29udGVudF9yZWdpb24pOworCisgIC8vIFRoaXMgbWV0aG9kIHdpbGwgY2FsbCBpbnRvIFJlbmRlclZCTygpLCBzbyB0aGUgY29tbWVudHMgcGVydGFpbmluZyB0byB0aGF0CisgIC8vIG1ldGhvZCBhbHNvIGFwcGx5IHRvIHRoaXMgbWV0aG9kLiAgVGhpcyBtZXRob2QgcmVuZGVycyB3aXRoIHZlcnRleAorICAvLyBwb3NpdGlvbnMgKC0xLCAtMSkgLT4gKDEsIDEpLCBzbyBpdCB3aWxsIG9jY3VweSB0aGUgZW50aXJlIHZpZXdwb3J0CisgIC8vIHNwZWNpZmllZCBieSBnbFZpZXdwb3J0KCkuCisgIHZvaWQgUmVuZGVyUXVhZChjb25zdCBiYWNrZW5kOjpUZXh0dXJlRUdMKiB0ZXh0dXJlLAorICAgICAgICAgICAgICAgICAgY29uc3QgbWF0aDo6UmVjdCYgY29udGVudF9yZWdpb24pOworCisgcHJpdmF0ZToKKyAgdWludDMyIEdldFF1YWRWQk8oKTsKKyAgdWludDMyIEdldEJsaXRQcm9ncmFtKHVpbnQzMiB0ZXh0dXJlX3RhcmdldCk7CisKKyAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMKiBncmFwaGljc19jb250ZXh0XzsKKworICAvLyBTaW5jZSBkaWZmZXJlbnQgdGV4dHVyZSB0YXJnZXRzIGNhbiB3YXJyYW50IGRpZmZlcmVudCBzaGFkZXJzL3Byb2dyYW1zLAorICAvLyB3ZSBrZWVwIGEgbWFwIG9mIGJsaXQgcHJvZ3JhbXMgZm9yIGVhY2ggdGV4dHVyZSB0YXJnZXQsIGFuZCBpbml0aWFsaXplCisgIC8vIHRoZW0gbGF6aWx5LgorICBzdGQ6Om1hcDx1aW50MzIsIHVpbnQzMj4gYmxpdF9wcm9ncmFtX3Blcl90ZXh0dXJlX3RhcmdldF87CisKKyAgc3RhdGljIGNvbnN0IGludCBrQmxpdFBvc2l0aW9uQXR0cmlidXRlID0gMDsKKyAgc3RhdGljIGNvbnN0IGludCBrQmxpdFRleGNvb3JkQXR0cmlidXRlID0gMTsKKworICBiYXNlOjpvcHRpb25hbDx1aW50MzI+IHF1YWRfdmJvXzsKKworICB1aW50MzIgdGV4Y29vcmRfc2NhbGVfdHJhbnNsYXRlX3VuaWZvcm1fOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGVnbAorfSAgLy8gbmFtZXNwYWNlIHJhc3Rlcml6ZXIKK30gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX0VHTF9URVhUVVJFRF9NRVNIX1JFTkRFUkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9waXhlbF90ZXN0LmNjCmluZGV4IGY3NGI1MjguLmJhNjljZGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9waXhlbF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9waXhlbF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPGNtYXRoPgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdF9maXh0dXJlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3BpeGVsX3Rlc3RfZml4dHVyZS5jYwppbmRleCBjNGVlNjg1Li43NzAxMjMyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdF9maXh0dXJlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9waXhlbF90ZXN0X2ZpeHR1cmUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdF9maXh0dXJlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9waXhlbF90ZXN0X2ZpeHR1cmUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9waXhlbF90ZXN0X2ZpeHR1cmUuaAppbmRleCBhYmQzMDFkLi5mOWFjOWUwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcGl4ZWxfdGVzdF9maXh0dXJlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3BpeGVsX3Rlc3RfZml4dHVyZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9QSVhFTF9URVNUX0ZJWFRVUkVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfUElYRUxfVEVTVF9GSVhUVVJFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcmFzdGVyaXplci5neXAgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcmFzdGVyaXplci5neXAKaW5kZXggNjQzODlmZS4uZjRiZGViZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3Jhc3Rlcml6ZXIuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9yYXN0ZXJpemVyLmd5cApAQCAtMjksNiArMjksNyBAQAogICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3Jhc3Rlcml6ZXIuZ3lwOmhhcmR3YXJlX3Jhc3Rlcml6ZXInLAogICAgICAgICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvcmFzdGVyaXplci5neXA6c29mdHdhcmVfcmFzdGVyaXplcicsCisgICAgICAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC9yYXN0ZXJpemVyLmd5cDpoYXJkd2FyZV9yYXN0ZXJpemVyJywKICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgIH1dLAogICAgICAgICAgICAgWydPUz09InN0YXJib2FyZCInLCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3Jhc3Rlcml6ZXIuaAppbmRleCBmZWE3ZmUyLi5jOWYyZWJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcmFzdGVyaXplci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9yYXN0ZXJpemVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1JBU1RFUklaRVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfUkFTVEVSSVpFUl9IXwpAQCAtODEsNiArNzksMTIgQEAKICAgLy8gbGlrZSBpbWFnZXMgYW5kIGZvbnRzIHdoaWNoIGNhbiBiZSByZWZlcmVuY2VkIGJ5IHJlbmRlciB0cmVlcyB0aGF0IGFyZQogICAvLyBzdWJzZXF1ZW50bHkgc3VibWl0dGVkIHRvIHRoaXMgcGlwZWxpbmUuICBUaGlzIGNhbGwgbXVzdCBiZSB0aHJlYWQtc2FmZS4KICAgdmlydHVhbCByZW5kZXJfdHJlZTo6UmVzb3VyY2VQcm92aWRlciogR2V0UmVzb3VyY2VQcm92aWRlcigpID0gMDsKKworICAvLyBGb3IgR0wtYmFzZWQgcmFzdGVyaXplcnMsIHNvbWUgYW5pbWF0aW9uIHVwZGF0ZXMgY2FuIHJlcXVpcmUgdGhhdCB0aGUKKyAgLy8gcmFzdGVyaXplcidzIEdMIGNvbnRleHQgYmUgY3VycmVudCB3aGVuIHRoZXkgYXJlIGV4ZWN1dGVkLiAgVGhpcyBtZXRob2QKKyAgLy8gaXMgZXNzZW50aWFsbHkgYSBoYWNrIHRvIGFsbG93IEdMLWJhc2VkIHJhc3Rlcml6ZXJzIGEgY2hhbmNlIHRvIHNldCB0aGVpcgorICAvLyBjb250ZXh0IGN1cnJlbnQgYmVmb3JlIHdlIG1vdmUgdG8gdXBkYXRlIGFuaW1hdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBNYWtlQ3VycmVudCgpIHt9CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgcmFzdGVyaXplcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3Jhc3Rlcml6ZXJfYmVuY2htYXJrLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3Jhc3Rlcml6ZXJfYmVuY2htYXJrLmNjCmluZGV4IGNhMmNjNzMuLmNiZTE4MWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9yYXN0ZXJpemVyX2JlbmNobWFyay5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcmFzdGVyaXplcl9iZW5jaG1hcmsuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKICNpbmNsdWRlICJjb2JhbHQvbWF0aC9zaXplLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9jb2JhbHRfc2tpYV90eXBlX2NvbnZlcnNpb25zLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvY29iYWx0X3NraWFfdHlwZV9jb252ZXJzaW9ucy5jYwppbmRleCA0YjZlMTBjLi4xNzM0ZTQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9jb2JhbHRfc2tpYV90eXBlX2NvbnZlcnNpb25zLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2NvYmFsdF9za2lhX3R5cGVfY29udmVyc2lvbnMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9jb2JhbHRfc2tpYV90eXBlX2NvbnZlcnNpb25zLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2NvYmFsdF9za2lhX3R5cGVfY29udmVyc2lvbnMuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2NvYmFsdF9za2lhX3R5cGVfY29udmVyc2lvbnMuaAppbmRleCA0OWIyYzc0Li42ZDg0Mzk1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9jb2JhbHRfc2tpYV90eXBlX2NvbnZlcnNpb25zLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvY29iYWx0X3NraWFfdHlwZV9jb252ZXJzaW9ucy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX0NPQkFMVF9TS0lBX1RZUEVfQ09OVkVSU0lPTlNfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9DT0JBTFRfU0tJQV9UWVBFX0NPTlZFUlNJT05TX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9jb252ZXJzaW9ucy5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvY29udmVyc2lvbnMuaAppbmRleCBjNTY0MGU0Li4zYmU2YTEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9jb252ZXJzaW9ucy5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2NvbnZlcnNpb25zLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfQ09OVkVSU0lPTlNfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9DT05WRVJTSU9OU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZm9udC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ZvbnQuY2MKaW5kZXggN2YzNTdiOS4uZDkwYmM0MiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZm9udC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9mb250LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZm9udC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9mb250LmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9mb250LmgKaW5kZXggZDBlOWVhNS4uYzI2Mjc4MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZm9udC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ZvbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9GT05UX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfRk9OVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2xfZm9ybWF0X2NvbnZlcnNpb25zLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2xfZm9ybWF0X2NvbnZlcnNpb25zLmNjCmluZGV4IDAyZTFlZDguLjdlNzEwYTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2dsX2Zvcm1hdF9jb252ZXJzaW9ucy5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9nbF9mb3JtYXRfY29udmVyc2lvbnMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9nbF9mb3JtYXRfY29udmVyc2lvbnMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2xfZm9ybWF0X2NvbnZlcnNpb25zLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9nbF9mb3JtYXRfY29udmVyc2lvbnMuaAppbmRleCAyOGZlMGE3Li44YjkwYWQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9nbF9mb3JtYXRfY29udmVyc2lvbnMuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9nbF9mb3JtYXRfY29udmVyc2lvbnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9HTF9GT1JNQVRfQ09OVkVSU0lPTlNfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9HTF9GT1JNQVRfQ09OVkVSU0lPTlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2dseXBoX2J1ZmZlci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2dseXBoX2J1ZmZlci5jYwppbmRleCBhOWZjOGExLi4zYWZjZTRlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9nbHlwaF9idWZmZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2x5cGhfYnVmZmVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2x5cGhfYnVmZmVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2dseXBoX2J1ZmZlci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2x5cGhfYnVmZmVyLmgKaW5kZXggY2ExZjg2ZC4uOTkzYTIwOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2x5cGhfYnVmZmVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvZ2x5cGhfYnVmZmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfR0xZUEhfQlVGRkVSX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfR0xZUEhfQlVGRkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmNjCmluZGV4IGIxNzEyOGEuLjFkMTE4ZjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuaCIKIApAQCAtMTM4LDE3ICsxMzYsMTkgQEAKICAgICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwKICAgICAgICAgICAgICAgICAgIkhhcmR3YXJlQmFja2VuZEltYWdlOjpDb21tb25Jbml0aWFsaXplKCkiKTsKKyAgICBpZiAodGV4dHVyZV8tPkdldFRhcmdldCgpID09IEdMX1RFWFRVUkVfMkQpIHsKKyAgICAgIGdyX3RleHR1cmVfLnJlc2V0KAorICAgICAgICAgIFdyYXBDb2JhbHRUZXh0dXJlV2l0aFNraWFUZXh0dXJlKGdyX2NvbnRleHQsIHRleHR1cmVfLmdldCgpKSk7CisgICAgICBEQ0hFQ0soZ3JfdGV4dHVyZV8pOwogCi0gICAgZ3JfdGV4dHVyZV8ucmVzZXQoCi0gICAgICAgIFdyYXBDb2JhbHRUZXh0dXJlV2l0aFNraWFUZXh0dXJlKGdyX2NvbnRleHQsIHRleHR1cmVfLmdldCgpKSk7Ci0gICAgRENIRUNLKGdyX3RleHR1cmVfKTsKLQotICAgIC8vIFByZXBhcmUgYSBtZW1iZXIgU2tCaXRtYXAgdGhhdCByZWZlcnMgdG8gdGhlIG5ld2x5IGNyZWF0ZWQgR3JUZXh0dXJlIGFuZAotICAgIC8vIHdpbGwgYmUgdGhlIG9iamVjdCB0aGF0IFNraWEgZHJhdyBjYWxscyB3aWxsIHJlZmVyZW5jZSB3aGVuIHJlZmVycmluZwotICAgIC8vIHRvIHRoaXMgaW1hZ2UuCi0gICAgYml0bWFwXy5zZXRJbmZvKGdyX3RleHR1cmVfLT5pbmZvKCkpOwotICAgIGJpdG1hcF8uc2V0UGl4ZWxSZWYoU2tORVdfQVJHUyhTa0dyUGl4ZWxSZWYsIChiaXRtYXBfLmluZm8oKSwgZ3JfdGV4dHVyZV8pKSkKLSAgICAgICAgLT51bnJlZigpOworICAgICAgLy8gUHJlcGFyZSBhIG1lbWJlciBTa0JpdG1hcCB0aGF0IHJlZmVycyB0byB0aGUgbmV3bHkgY3JlYXRlZCBHclRleHR1cmUKKyAgICAgIC8vIGFuZCB3aWxsIGJlIHRoZSBvYmplY3QgdGhhdCBTa2lhIGRyYXcgY2FsbHMgd2lsbCByZWZlcmVuY2Ugd2hlbgorICAgICAgLy8gcmVmZXJyaW5nIHRvIHRoaXMgaW1hZ2UuCisgICAgICBiaXRtYXBfLnNldEluZm8oZ3JfdGV4dHVyZV8tPmluZm8oKSk7CisgICAgICBiaXRtYXBfLnNldFBpeGVsUmVmKAorICAgICAgICAgICAgICAgICBTa05FV19BUkdTKFNrR3JQaXhlbFJlZiwgKGJpdG1hcF8uaW5mbygpLCBncl90ZXh0dXJlXykpKQorICAgICAgICAgIC0+dW5yZWYoKTsKKyAgICB9CiAgIH0KIAogICBjb25zdCBTa0JpdG1hcCogR2V0Qml0bWFwKCkgY29uc3QgewpAQCAtMTU2LDYgKzE1NiwxMSBAQAogICAgIHJldHVybiAmYml0bWFwXzsKICAgfQogCisgIGNvbnN0IGJhY2tlbmQ6OlRleHR1cmVFR0wqIEdldFRleHR1cmVFR0woKSBjb25zdCB7CisgICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICAgIHJldHVybiB0ZXh0dXJlXy5nZXQoKTsKKyAgfQorCiAgcHJpdmF0ZToKICAgLy8gS2VlcCBhIHJlZmVyZW5jZSB0byB0aGUgdGV4dHVyZSBhbGl2ZSBhcyBsb25nIGFzIHRoaXMgYmFja2VuZCBpbWFnZQogICAvLyBleGlzdHMuCkBAIC0yMDMsOSArMjA4LDEyIEBACiAgICAgc2NvcGVkX3B0cjxiYWNrZW5kOjpUZXh0dXJlRUdMPiB0ZXh0dXJlLAogICAgIHJlbmRlcl90cmVlOjpBbHBoYUZvcm1hdCBhbHBoYV9mb3JtYXQsCiAgICAgYmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMKiBjb2JhbHRfY29udGV4dCwgR3JDb250ZXh0KiBncl9jb250ZXh0LAotICAgIE1lc3NhZ2VMb29wKiByYXN0ZXJpemVyX21lc3NhZ2VfbG9vcCkKKyAgICBzY29wZWRfcHRyPG1hdGg6OlJlY3Q+IGNvbnRlbnRfcmVnaW9uLCBNZXNzYWdlTG9vcCogcmFzdGVyaXplcl9tZXNzYWdlX2xvb3ApCiAgICAgOiBpc19vcGFxdWVfKGFscGhhX2Zvcm1hdCA9PSByZW5kZXJfdHJlZTo6a0FscGhhRm9ybWF0T3BhcXVlKSwKLSAgICAgIHNpemVfKHRleHR1cmUtPkdldFNpemUoKSksCisgICAgICBjb250ZW50X3JlZ2lvbl8oY29udGVudF9yZWdpb24uUGFzcygpKSwKKyAgICAgIHNpemVfKGNvbnRlbnRfcmVnaW9uXyA/IG1hdGg6OlNpemUoc3RkOjphYnMoY29udGVudF9yZWdpb25fLT53aWR0aCgpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjphYnMoY29udGVudF9yZWdpb25fLT5oZWlnaHQoKSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiB0ZXh0dXJlLT5HZXRTaXplKCkpLAogICAgICAgcmFzdGVyaXplcl9tZXNzYWdlX2xvb3BfKHJhc3Rlcml6ZXJfbWVzc2FnZV9sb29wKSB7CiAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpyZW5kZXJlciIsCiAgICAgICAgICAgICAgICAiSGFyZHdhcmVGcm9udGVuZEltYWdlOjpIYXJkd2FyZUZyb250ZW5kSW1hZ2UoKSIpOwpAQCAtMjM1LDYgKzI0MywyNCBAQAogICByZXR1cm4gYmFja2VuZF9pbWFnZV8tPkdldEJpdG1hcCgpOwogfQogCitjb25zdCBiYWNrZW5kOjpUZXh0dXJlRUdMKiBIYXJkd2FyZUZyb250ZW5kSW1hZ2U6OkdldFRleHR1cmVFR0woKSBjb25zdCB7CisgIERDSEVDS19FUShyYXN0ZXJpemVyX21lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOworICByZXR1cm4gYmFja2VuZF9pbWFnZV8tPkdldFRleHR1cmVFR0woKTsKK30KKworYm9vbCBIYXJkd2FyZUZyb250ZW5kSW1hZ2U6OkNhblJlbmRlckluU2tpYSgpIGNvbnN0IHsKKyAgRENIRUNLX0VRKHJhc3Rlcml6ZXJfbWVzc2FnZV9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CisgIC8vIEluIHNvbWUgY2FzZXMsIGVzcGVjaWFsbHkgd2hlbiBkZWFsaW5nIHdpdGggU2JEZWNvZGVUYXJnZXRzLCB3ZSBtYXkgZW5kCisgIC8vIHVwIHdpdGggYSBHTEVTMiB0ZXh0dXJlIHdob3NlIHRhcmdldCBpcyBub3QgR0xfVEVYVFVSRV8yRCwgaW4gd2hpY2ggY2FzZQorICAvLyB3ZSBjYW5ub3QgdXNlIG91ciB0eXBpY2FsIFNraWEgZmxvdyB0byByZW5kZXIgaXQsIGFuZCB3ZSBkZWxlZ2F0ZSB0bworICAvLyBhIHJhc3Rlcml6ZXItcHJvdmlkZWQgY2FsbGJhY2sgZm9yIHBlcmZvcm1pbmcgY3VzdG9tIHJlbmRlcmluZyAoZS5nLgorICAvLyB2aWEgZGlyZWN0IEdMIGNhbGxzKS4KKyAgLy8gV2UgYWxzbyBmYWxsYmFjayBpZiBhIGNvbnRlbnQgcmVnaW9uIGlzIHNwZWNpZmllZCBvbiB0aGUgaW1hZ2UsIHNpbmNlIHdlCisgIC8vIGRvbid0IHN1cHBvcnQgaGFuZGxpbmcgdGhhdCBpbiB0aGUgbm9ybWFsIGZsb3cuCisgIHJldHVybiAhR2V0Q29udGVudFJlZ2lvbigpICYmCisgICAgICAgICAoIUdldFRleHR1cmVFR0woKSB8fCBHZXRUZXh0dXJlRUdMKCktPkdldFRhcmdldCgpID09IEdMX1RFWFRVUkVfMkQpOworfQorCiBib29sIEhhcmR3YXJlRnJvbnRlbmRJbWFnZTo6RW5zdXJlSW5pdGlhbGl6ZWQoKSB7CiAgIERDSEVDS19FUShyYXN0ZXJpemVyX21lc3NhZ2VfbG9vcF8sIE1lc3NhZ2VMb29wOjpjdXJyZW50KCkpOwogICBpZiAoIWluaXRpYWxpemVfYmFja2VuZF9pbWFnZV8uaXNfbnVsbCgpKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfaW1hZ2UuaAppbmRleCAyYmM1NWVmLi41ODY1Yzk0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9pbWFnZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX2ltYWdlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfSEFSRFdBUkVfSU1BR0VfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9IQVJEV0FSRV9JTUFHRV9IXwpAQCAtOTMsNiArOTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgcmVuZGVyX3RyZWU6OkFscGhhRm9ybWF0IGFscGhhX2Zvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dEVHTCogY29iYWx0X2NvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBHckNvbnRleHQqIGdyX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPG1hdGg6OlJlY3Q+IGNvbnRlbnRfcmVnaW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxvb3AqIHJhc3Rlcml6ZXJfbWVzc2FnZV9sb29wKTsKIAogICBjb25zdCBtYXRoOjpTaXplJiBHZXRTaXplKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gc2l6ZV87IH0KQEAgLTEwNSw2ICsxMDQsMTQgQEAKICAgLy8gcmVzdHJhaW50IHNob3VsZCBhbHdheXMgYmUgc2F0aXNmaWVkIG5hdHVyYWxseS4KICAgY29uc3QgU2tCaXRtYXAqIEdldEJpdG1hcCgpIGNvbnN0IE9WRVJSSURFOwogCisgIGNvbnN0IGJhY2tlbmQ6OlRleHR1cmVFR0wqIEdldFRleHR1cmVFR0woKSBjb25zdCBPVkVSUklERTsKKworICBjb25zdCBtYXRoOjpSZWN0KiBHZXRDb250ZW50UmVnaW9uKCkgY29uc3QgT1ZFUlJJREUgeworICAgIHJldHVybiBjb250ZW50X3JlZ2lvbl8uZ2V0KCk7CisgIH0KKworICBib29sIENhblJlbmRlckluU2tpYSgpIGNvbnN0IE9WRVJSSURFOworCiAgIGJvb2wgRW5zdXJlSW5pdGlhbGl6ZWQoKSBPVkVSUklERTsKIAogICBib29sIElzT3BhcXVlKCkgY29uc3QgT1ZFUlJJREUgeyByZXR1cm4gaXNfb3BhcXVlXzsgfQpAQCAtMTI4LDYgKzEzNSwxMSBAQAogICAvLyBjYXNlIHRoYXQgYWxwaGEgaXMgbm90IHByZXNlbnQuCiAgIGJvb2wgaXNfb3BhcXVlXzsKIAorICAvLyBBbiBvcHRpb25hbCByZWN0YW5nbGUsIGluIHBpeGVsIGNvb3JkaW5hdGVzICh3aXRoIHRoZSB0b3AtbGVmdCBhcyB0aGUKKyAgLy8gb3JpZ2luKSB0aGF0IGluZGljYXRlcyB3aGVyZSBpbiB0aGlzIGltYWdlIHRoZSB2YWxpZCBjb250ZW50IGlzIGNvbnRhaW5lZC4KKyAgLy8gVXN1YWxseSB0aGlzIGlzIG9ubHkgc2V0IGZyb20gcGxhdGZvcm0tc3BlY2lmaWMgU2JEZWNvZGVUYXJnZXRzLgorICBzY29wZWRfcHRyPG1hdGg6OlJlY3Q+IGNvbnRlbnRfcmVnaW9uXzsKKwogICAvLyBXZSBzaGFkb3cgdGhlIGltYWdlIGRpbWVuc2lvbnMgc28gdGhleSBjYW4gYmUgcXVpY2tseSBsb29rZWQgdXAgZnJvbSBqdXN0CiAgIC8vIHRoZSBmcm9udGVuZCBpbWFnZSBvYmplY3QuCiAgIGNvbnN0IG1hdGg6OlNpemUgc2l6ZV87CkBAIC0xNzUsNiArMTg3LDkgQEAKICAgY29uc3QgU2tCaXRtYXAqIEdldEJpdG1hcChpbnQgcGxhbmVfaW5kZXgpIGNvbnN0IE9WRVJSSURFIHsKICAgICByZXR1cm4gcGxhbmVzX1twbGFuZV9pbmRleF0tPkdldEJpdG1hcCgpOwogICB9CisgIGNvbnN0IGJhY2tlbmQ6OlRleHR1cmVFR0wqIEdldFRleHR1cmVFR0woaW50IHBsYW5lX2luZGV4KSBjb25zdCBPVkVSUklERSB7CisgICAgcmV0dXJuIHBsYW5lc19bcGxhbmVfaW5kZXhdLT5HZXRUZXh0dXJlRUdMKCk7CisgIH0KIAogICBib29sIEVuc3VyZUluaXRpYWxpemVkKCkgT1ZFUlJJREU7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmNjCmluZGV4IGJhNDBkYzcuLjk2NmY0ZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCIKIApAQCAtMjIsOCArMjAsMTEgQEAKICNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL2dyYXBoaWNzX2NvbnRleHQuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvZ3JhcGhpY3Nfc3lzdGVtLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL2JhY2tlbmQvZWdsL3RleHR1cmUuaCIKKyNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9lZ2wvdXRpbHMuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvZnJhbWVfcmF0ZV90aHJvdHRsZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9jb21tb24vc3VyZmFjZV9jYWNoZS5oIgorI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL2VnbC90ZXh0dXJlZF9tZXNoX3JlbmRlcmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9jb2JhbHRfc2tpYV90eXBlX2NvbnZlcnNpb25zLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmgiCkBAIC01NSwxMSArNTYsMTkgQEAKICAgICAgICBpbnQgc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKTsKICAgfkltcGwoKTsKIAorICB2b2lkIEFkdmFuY2VGcmFtZSgpOworCiAgIHZvaWQgU3VibWl0KGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYWNrZW5kOjpSZW5kZXJUYXJnZXQ+JiByZW5kZXJfdGFyZ2V0LAogICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKIAorICB2b2lkIFN1Ym1pdE9mZnNjcmVlbihjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcmVuZGVyX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMpOworCiAgIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiBHZXRSZXNvdXJjZVByb3ZpZGVyKCk7CisgIEdyQ29udGV4dCogR2V0R3JDb250ZXh0KCk7CisKKyAgdm9pZCBNYWtlQ3VycmVudCgpOwogCiAgcHJpdmF0ZToKICAgLy8gTm90ZTogV2UgY2Fubm90IHN0b3JlIGEgU2tBdXRvVFVucmVmPFNrU3VyZmFjZT4gaW4gdGhlIG1hcCBiZWNhdXNlIGl0IGlzCkBAIC04Nyw2ICs5Niw5IEBACiAKICAgdm9pZCBSZXNldFNraWFTdGF0ZSgpOwogCisgIHZvaWQgUmVuZGVyVGV4dHVyZUVHTChjb25zdCByZW5kZXJfdHJlZTo6SW1hZ2VOb2RlKiBpbWFnZV9ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgUmVuZGVyVHJlZU5vZGVWaXNpdG9yRHJhd1N0YXRlKiBkcmF3X3N0YXRlKTsKKwogICBiYXNlOjpUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKIAogICBiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqIGdyYXBoaWNzX2NvbnRleHRfOwpAQCAtMTAxLDYgKzExMyw4IEBACiAgIGJhc2U6Om9wdGlvbmFsPFN1cmZhY2VDYWNoZURlbGVnYXRlPiBzdXJmYWNlX2NhY2hlX2RlbGVnYXRlXzsKICAgYmFzZTo6b3B0aW9uYWw8Y29tbW9uOjpTdXJmYWNlQ2FjaGU+IHN1cmZhY2VfY2FjaGVfOwogCisgIGJhc2U6Om9wdGlvbmFsPGVnbDo6VGV4dHVyZWRNZXNoUmVuZGVyZXI+IHRleHR1cmVkX21lc2hfcmVuZGVyZXJfOworCiAgIEZyYW1lUmF0ZVRocm90dGxlciBmcmFtZV9yYXRlX3Rocm90dGxlcl87CiB9OwogCkBAIC0xMzksNiArMTUzLDUwIEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6UmVuZGVyVGV4dHVyZUVHTCgKKyAgICBjb25zdCByZW5kZXJfdHJlZTo6SW1hZ2VOb2RlKiBpbWFnZV9ub2RlLAorICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvckRyYXdTdGF0ZSogZHJhd19zdGF0ZSkgeworICBIYXJkd2FyZUZyb250ZW5kSW1hZ2UqIGltYWdlID0KKyAgICAgIGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PEhhcmR3YXJlRnJvbnRlbmRJbWFnZSo+KAorICAgICAgICAgIGltYWdlX25vZGUtPmRhdGEoKS5zb3VyY2UuZ2V0KCkpOworCisgIGNvbnN0IGJhY2tlbmQ6OlRleHR1cmVFR0wqIHRleHR1cmUgPSBpbWFnZS0+R2V0VGV4dHVyZUVHTCgpOworICBjb25zdCBtYXRoOjpSZWN0RiYgZGVzdGluYXRpb25fcmVjdCA9IGltYWdlX25vZGUtPmRhdGEoKS5kZXN0aW5hdGlvbl9yZWN0OworCisgIC8vIEZsdXNoIHRoZSBTa2lhIGRyYXcgc3RhdGUgdG8gZW5zdXJlIHRoYXQgYWxsIHByZXZpb3VzbHkgaXNzdWVkIFNraWEgY2FsbHMKKyAgLy8gYXJlIHJlbmRlcmVkIHNvIHRoYXQgdGhlIGZvbGxvd2luZyBkcmF3IGNvbW1hbmQgd2lsbCBhcHBlYXIgaW4gdGhlIGNvcnJlY3QKKyAgLy8gb3JkZXIuCisgIGRyYXdfc3RhdGUtPnJlbmRlcl90YXJnZXQtPmZsdXNoKCk7CisKKyAgLy8gUmVuZGVyIGEgdGV4dHVyZSB0byB0aGUgc3BlY2lmaWVkIG91dHB1dCByZWN0YW5nbGUgb24gdGhlIHJlbmRlciB0YXJnZXQuCisgIEdMX0NBTEwoZ2xWaWV3cG9ydChkZXN0aW5hdGlvbl9yZWN0LngoKSwgZGVzdGluYXRpb25fcmVjdC55KCksCisgICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9yZWN0LndpZHRoKCksIGRlc3RpbmF0aW9uX3JlY3QuaGVpZ2h0KCkpKTsKKyAgR0xfQ0FMTChnbFNjaXNzb3IoZGVzdGluYXRpb25fcmVjdC54KCksIGRlc3RpbmF0aW9uX3JlY3QueSgpLAorICAgICAgICAgICAgICAgICAgICBkZXN0aW5hdGlvbl9yZWN0LndpZHRoKCksIGRlc3RpbmF0aW9uX3JlY3QuaGVpZ2h0KCkpKTsKKworICBpZiAoaW1hZ2UtPklzT3BhcXVlKCkpIHsKKyAgICBHTF9DQUxMKGdsRGlzYWJsZShHTF9CTEVORCkpOworICB9IGVsc2UgeworICAgIEdMX0NBTEwoZ2xFbmFibGUoR0xfQkxFTkQpKTsKKyAgfQorICBHTF9DQUxMKGdsRGlzYWJsZShHTF9ERVBUSF9URVNUKSk7CisgIEdMX0NBTEwoZ2xEaXNhYmxlKEdMX1NURU5DSUxfVEVTVCkpOworICBHTF9DQUxMKGdsRW5hYmxlKEdMX1NDSVNTT1JfVEVTVCkpOworCisgIGlmICghdGV4dHVyZWRfbWVzaF9yZW5kZXJlcl8pIHsKKyAgICB0ZXh0dXJlZF9tZXNoX3JlbmRlcmVyXy5lbXBsYWNlKGdyYXBoaWNzX2NvbnRleHRfKTsKKyAgfQorICBtYXRoOjpSZWN0IGNvbnRlbnRfcmVnaW9uKGltYWdlLT5HZXRTaXplKCkpOworICBpZiAoaW1hZ2UtPkdldENvbnRlbnRSZWdpb24oKSkgeworICAgIGNvbnRlbnRfcmVnaW9uID0gKmltYWdlLT5HZXRDb250ZW50UmVnaW9uKCk7CisgIH0KKyAgLy8gSW52b2tlIG91dCBUZXh0dXJlZE1lc2hSZW5kZXJlciB0byBhY3R1YWxseSBwZXJmb3JtIHRoZSBkcmF3IGNhbGwuCisgIHRleHR1cmVkX21lc2hfcmVuZGVyZXJfLT5SZW5kZXJRdWFkKHRleHR1cmUsIGNvbnRlbnRfcmVnaW9uKTsKKworICAvLyBMZXQgU2tpYSBrbm93IHRoYXQgd2UndmUgbW9kaWZpZWQgR0wgc3RhdGUuCisgIGdyX2NvbnRleHRfLT5yZXNldENvbnRleHQoKTsKK30KKwogSGFyZHdhcmVSYXN0ZXJpemVyOjpJbXBsOjpJbXBsKGJhY2tlbmQ6OkdyYXBoaWNzQ29udGV4dCogZ3JhcGhpY3NfY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2tpYV9jYWNoZV9zaXplX2luX2J5dGVzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzY3JhdGNoX3N1cmZhY2VfY2FjaGVfc2l6ZV9pbl9ieXRlcywKQEAgLTE5OCw2ICsyNTYsOCBAQAogCiBIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6On5JbXBsKCkgewogICBncmFwaGljc19jb250ZXh0Xy0+TWFrZUN1cnJlbnQoKTsKKyAgdGV4dHVyZWRfbWVzaF9yZW5kZXJlcl8gPSBiYXNlOjpudWxsb3B0OworCiAgIGZvciAoU2tTdXJmYWNlTWFwOjppdGVyYXRvciBpdGVyID0gc2tfb3V0cHV0X3N1cmZhY2VfbWFwXy5iZWdpbigpOwogICAgIGl0ZXIgIT0gc2tfb3V0cHV0X3N1cmZhY2VfbWFwXy5lbmQoKTsgaXRlcisrKSB7CiAgICAgaXRlci0+c2Vjb25kLT51bnJlZigpOwpAQCAtMjA5LDE1ICsyNjksMjQgQEAKICAgZ3JhcGhpY3NfY29udGV4dF8tPlJlbGVhc2VDdXJyZW50Q29udGV4dCgpOwogfQogCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6QWR2YW5jZUZyYW1lKCkgeworICAvLyBVcGRhdGUgb3VyIHN1cmZhY2UgY2FjaGUgdG8gZG8gcGVyLWZyYW1lIGNhbGN1bGF0aW9ucyBzdWNoIGFzIGRlY2lkaW5nCisgIC8vIHdoaWNoIHJlbmRlciB0cmVlIG5vZGVzIGFyZSBjYW5kaWRhdGVzIGZvciBjYWNoaW5nIGluIHRoaXMgdXBjb21pbmcKKyAgLy8gZnJhbWUuCisgIGlmIChzdXJmYWNlX2NhY2hlXykgeworICAgIHN1cmZhY2VfY2FjaGVfLT5GcmFtZSgpOworICB9Cit9CisKIHZvaWQgSGFyZHdhcmVSYXN0ZXJpemVyOjpJbXBsOjpTdWJtaXQoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6Tm9kZT4mIHJlbmRlcl90cmVlLAogICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFja2VuZDo6UmVuZGVyVGFyZ2V0PiYgcmVuZGVyX3RhcmdldCwKICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKIAotICBiYWNrZW5kOjpSZW5kZXJUYXJnZXRFR0wqIHJlbmRlcl90YXJnZXRfZWdsID0KKyAgc2NvcGVkX3JlZnB0cjxiYWNrZW5kOjpSZW5kZXJUYXJnZXRFR0w+IHJlbmRlcl90YXJnZXRfZWdsKAogICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8YmFja2VuZDo6UmVuZGVyVGFyZ2V0RUdMKj4oCi0gICAgICAgICAgcmVuZGVyX3RhcmdldC5nZXQoKSk7CisgICAgICAgICAgcmVuZGVyX3RhcmdldC5nZXQoKSkpOwogCiAgIC8vIFNraXAgcmVuZGVyaW5nIGlmIHdlIGxvc3QgdGhlIHN1cmZhY2UuIFRoaXMgY2FuIGhhcHBlbiBqdXN0IGJlZm9yZSBzdXNwZW5kCiAgIC8vIG9uIEFuZHJvaWQsIHNvIG5vdyB3ZSdyZSBqdXN0IHdhaXRpbmcgZm9yIHRoZSBzdXNwZW5kIHRvIGNsZWFuIHVwLgpAQCAtMjMyLDEyICszMDEsNyBAQAogICAvLyBkcmF3IGNhbGxzLCBpbiBjYXNlIHdlIGhhdmUgbW9kaWZpZWQgc3RhdGUgaW4gYmV0d2Vlbi4KICAgZ3JfY29udGV4dF8tPnJlc2V0Q29udGV4dCgpOwogCi0gIC8vIFVwZGF0ZSBvdXIgc3VyZmFjZSBjYWNoZSB0byBkbyBwZXItZnJhbWUgY2FsY3VsYXRpb25zIHN1Y2ggYXMgZGVjaWRpbmcKLSAgLy8gd2hpY2ggcmVuZGVyIHRyZWUgbm9kZXMgYXJlIGNhbmRpZGF0ZXMgZm9yIGNhY2hpbmcgaW4gdGhpcyB1cGNvbWluZwotICAvLyBmcmFtZS4KLSAgaWYgKHN1cmZhY2VfY2FjaGVfKSB7Ci0gICAgc3VyZmFjZV9jYWNoZV8tPkZyYW1lKCk7Ci0gIH0KKyAgQWR2YW5jZUZyYW1lKCk7CiAKICAgU2tTdXJmYWNlKiBza19vdXRwdXRfc3VyZmFjZTsKICAgU2tTdXJmYWNlTWFwOjppdGVyYXRvciBpdGVyID0gc2tfb3V0cHV0X3N1cmZhY2VfbWFwXy5maW5kKHJlbmRlcl90YXJnZXQpOwpAQCAtMjk2LDYgKzM2MCw4IEBACiAgICAgICAgIGNhbnZhcywgJmNyZWF0ZV9zY3JhdGNoX3N1cmZhY2VfZnVuY3Rpb24sCiAgICAgICAgIGJhc2U6OkJpbmQoJkhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6UmVzZXRTa2lhU3RhdGUsCiAgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICAgIGJhc2U6OkJpbmQoJkhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6UmVuZGVyVGV4dHVyZUVHTCwKKyAgICAgICAgICAgICAgICAgICBiYXNlOjpVbnJldGFpbmVkKHRoaXMpKSwKICAgICAgICAgc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8gPyAmc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8udmFsdWUoKSA6IE5VTEwsCiAgICAgICAgIHN1cmZhY2VfY2FjaGVfID8gJnN1cmZhY2VfY2FjaGVfLnZhbHVlKCkgOiBOVUxMKTsKICAgICByZW5kZXJfdHJlZS0+QWNjZXB0KCZ2aXNpdG9yKTsKQEAgLTMxMiwxMCArMzc4LDUwIEBACiAgIGNhbnZhcy0+cmVzdG9yZSgpOwogfQogCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6U3VibWl0T2Zmc2NyZWVuKAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6Ok5vZGU+JiByZW5kZXJfdHJlZSwKKyAgICBTa0NhbnZhcyogY2FudmFzKSB7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKworICAvLyBSZXNldCB0aGUgZ3JhcGhpY3MgY29udGV4dCBzaW5jZSB3ZSdyZSBzdGFydGluZyBmcm9tIGFuIHVua25vd24gc3RhdGUuCisgIGdyX2NvbnRleHRfLT5yZXNldENvbnRleHQoKTsKKworICB7CisgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIlZpc2l0UmVuZGVyVHJlZSIpOworICAgIC8vIFJhc3Rlcml6ZSB0aGUgcGFzc2VkIGluIHJlbmRlciB0cmVlIHRvIG91ciBoYXJkd2FyZSByZW5kZXIgdGFyZ2V0LgorICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvcjo6Q3JlYXRlU2NyYXRjaFN1cmZhY2VGdW5jdGlvbgorICAgICAgICBjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uID0KKyAgICAgICAgICAgIGJhc2U6OkJpbmQoJkhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6Q3JlYXRlU2NyYXRjaFN1cmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpOworICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvciB2aXNpdG9yKAorICAgICAgICBjYW52YXMsICZjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uLAorICAgICAgICBiYXNlOjpCaW5kKCZIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OlJlc2V0U2tpYVN0YXRlLAorICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpLAorICAgICAgICBiYXNlOjpCaW5kKCZIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OlJlbmRlclRleHR1cmVFR0wsCisgICAgICAgICAgICAgICAgICAgYmFzZTo6VW5yZXRhaW5lZCh0aGlzKSksCisgICAgICAgIHN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfID8gJnN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfLnZhbHVlKCkgOiBOVUxMLAorICAgICAgICBzdXJmYWNlX2NhY2hlXyA/ICZzdXJmYWNlX2NhY2hlXy52YWx1ZSgpIDogTlVMTCk7CisgICAgcmVuZGVyX3RyZWUtPkFjY2VwdCgmdmlzaXRvcik7CisgIH0KKworICB7CisgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIlNraWEgRmx1c2giKTsKKyAgICBjYW52YXMtPmZsdXNoKCk7CisgIH0KK30KKwogcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6R2V0UmVzb3VyY2VQcm92aWRlcigpIHsKICAgcmV0dXJuIHJlc291cmNlX3Byb3ZpZGVyXy5nZXQoKTsKIH0KIAorR3JDb250ZXh0KiBIYXJkd2FyZVJhc3Rlcml6ZXI6OkltcGw6OkdldEdyQ29udGV4dCgpIHsKKyAgcmV0dXJuIGdyX2NvbnRleHRfLmdldCgpOworfQorCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6TWFrZUN1cnJlbnQoKSB7CisgIGdyYXBoaWNzX2NvbnRleHRfLT5NYWtlQ3VycmVudCgpOworfQorCiBTa1N1cmZhY2UqIEhhcmR3YXJlUmFzdGVyaXplcjo6SW1wbDo6Q3JlYXRlU2tTdXJmYWNlKGNvbnN0IG1hdGg6OlNpemUmIHNpemUpIHsKICAgVFJBQ0VfRVZFTlQyKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIkhhcmR3YXJlUmFzdGVyaXplcjo6Q3JlYXRlU2tTdXJmYWNlKCkiLAogICAgICAgICAgICAgICAgIndpZHRoIiwgc2l6ZS53aWR0aCgpLCAiaGVpZ2h0Iiwgc2l6ZS5oZWlnaHQoKSk7CkBAIC0zODUsMTAgKzQ5MSwyNyBAQAogICBpbXBsXy0+U3VibWl0KHJlbmRlcl90cmVlLCByZW5kZXJfdGFyZ2V0LCBvcHRpb25zKTsKIH0KIAordm9pZCBIYXJkd2FyZVJhc3Rlcml6ZXI6OlN1Ym1pdE9mZnNjcmVlbigKKyAgICBjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcmVuZGVyX3RyZWUsCisgICAgU2tDYW52YXMqIGNhbnZhcykgeworICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6cmVuZGVyZXIiLCAiSGFyZHdhcmVSYXN0ZXJpemVyOjpTdWJtaXRPZmZzY3JlZW4oKSIpOworICBpbXBsXy0+U3VibWl0T2Zmc2NyZWVuKHJlbmRlcl90cmVlLCBjYW52YXMpOworfQorCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6QWR2YW5jZUZyYW1lKCkgeworICBpbXBsXy0+QWR2YW5jZUZyYW1lKCk7Cit9CisKIHJlbmRlcl90cmVlOjpSZXNvdXJjZVByb3ZpZGVyKiBIYXJkd2FyZVJhc3Rlcml6ZXI6OkdldFJlc291cmNlUHJvdmlkZXIoKSB7CiAgIHJldHVybiBpbXBsXy0+R2V0UmVzb3VyY2VQcm92aWRlcigpOwogfQogCitHckNvbnRleHQqIEhhcmR3YXJlUmFzdGVyaXplcjo6R2V0R3JDb250ZXh0KCkgeworICByZXR1cm4gaW1wbF8tPkdldEdyQ29udGV4dCgpOworfQorCit2b2lkIEhhcmR3YXJlUmFzdGVyaXplcjo6TWFrZUN1cnJlbnQoKSB7IHJldHVybiBpbXBsXy0+TWFrZUN1cnJlbnQoKTsgfQorCiB9ICAvLyBuYW1lc3BhY2Ugc2tpYQogfSAgLy8gbmFtZXNwYWNlIHJhc3Rlcml6ZXIKIH0gIC8vIG5hbWVzcGFjZSByZW5kZXJlcgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oCmluZGV4IGFmMmI3OGUuLmU0MTA4ODMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yYXN0ZXJpemVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfSEFSRFdBUkVfUkFTVEVSSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX0hBUkRXQVJFX1JBU1RFUklaRVJfSF8KQEAgLTIzLDYgKzIxLDkgQEAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvYmFja2VuZC9yZW5kZXJfdGFyZ2V0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvcmFzdGVyaXplci5oIgogCitjbGFzcyBHckNvbnRleHQ7CitjbGFzcyBTa0NhbnZhczsKKwogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2UgcmVuZGVyZXIgewogbmFtZXNwYWNlIHJhc3Rlcml6ZXIgewpAQCAtNjEsNyArNjIsMTggQEAKICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYWNrZW5kOjpSZW5kZXJUYXJnZXQ+JiByZW5kZXJfdGFyZ2V0LAogICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSBPVkVSUklERTsKIAorICAvLyBDb25zdW1lIHRoZSByZW5kZXIgdHJlZSBhbmQgb3V0cHV0IHRoZSByZXN1bHRzIHRvIHRoZSBzcGVjaWZpZWQgY2FudmFzLgorICB2b2lkIFN1Ym1pdE9mZnNjcmVlbihjb25zdCBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpOb2RlPiYgcmVuZGVyX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgIFNrQ2FudmFzKiBjYW52YXMpOworCisgIC8vIElmIFN1Ym1pdCgpIGlzIG5vdCBjYWxsZWQsIHRoZW4gdXNlIHRoaXMgZnVuY3Rpb24gdG8gdGVsbCByYXN0ZXJpemVyIHRoYXQKKyAgLy8gYSBmcmFtZSBoYXMgYmVlbiBzdWJtaXR0ZWQuCisgIHZvaWQgQWR2YW5jZUZyYW1lKCk7CisKICAgcmVuZGVyX3RyZWU6OlJlc291cmNlUHJvdmlkZXIqIEdldFJlc291cmNlUHJvdmlkZXIoKSBPVkVSUklERTsKKyAgR3JDb250ZXh0KiBHZXRHckNvbnRleHQoKTsKKworICB2b2lkIE1ha2VDdXJyZW50KCkgT1ZFUlJJREU7CiAKICBwcml2YXRlOgogICBjbGFzcyBJbXBsOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5jYwppbmRleCAwZDIyOTg3Li5lZjI1MDI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5jYwpAQCAtMSwyMSArMSwyMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmgiCiAKKyNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KKwogI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL3N5bmNocm9uaXphdGlvbi93YWl0YWJsZV9ldmVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3BvbHltb3JwaGljX2Rvd25jYXN0LmgiCkBAIC00MCw1MCArNDAsMzQgQEAKIAogbmFtZXNwYWNlIHsKIAotI2lmIFNCX1ZFUlNJT04oU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OICYmIFwKKyAgICBTQl9IQVMoR1JBUEhJQ1MpCiAKIHZvaWQgRGVjb2RlVGFyZ2V0QWNxdWlyZU9uUmFzdGVyaXplcigKICAgICBjb2JhbHQ6OnJlbmRlcmVyOjpiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqIGNvbnRleHRfZWdsLAogICAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCwgaW50IHdpZHRoLCBpbnQgaGVpZ2h0LAogICAgIFNiRGVjb2RlVGFyZ2V0KiBvdXRfZGVjb2RlX3RhcmdldCwgYmFzZTo6V2FpdGFibGVFdmVudCogZG9uZV9ldmVudCkgewotICBHTHVpbnQgcGxhbmVzWzNdID0geyAwLCAwLCAwIH07Ci0KICAgY29iYWx0OjpyZW5kZXJlcjo6YmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMOjpTY29wZWRNYWtlQ3VycmVudAogICAgICAgc2NvcGVkX2NvbnRleHQoY29udGV4dF9lZ2wpOwogCi0gIHN3aXRjaCAoZm9ybWF0KSB7Ci0gICAgY2FzZSBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBOgotICAgICAgR0xfQ0FMTChnbEdlblRleHR1cmVzKDEsIHBsYW5lcykpOwotICAgICAgR0xfQ0FMTChnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIHBsYW5lc1swXSkpOwotICAgICAgY29iYWx0OjpyZW5kZXJlcjo6YmFja2VuZDo6U2V0dXBJbml0aWFsVGV4dHVyZVBhcmFtZXRlcnMoKTsKLSAgICAgIEdMX0NBTEwoZ2xUZXhJbWFnZTJEKEdMX1RFWFRVUkVfMkQsIDAsIEdMX1JHQkEsIHdpZHRoLCBoZWlnaHQsIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHTF9SR0JBLCBHTF9VTlNJR05FRF9CWVRFLCBOVUxMKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZUJHUkE6Ci0gICAgY2FzZSBrU2JEZWNvZGVUYXJnZXRGb3JtYXQyUGxhbmVZVVZOVjEyOgotICAgIGNhc2Uga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0M1BsYW5lWVVWSTQyMDoKLSAgICBkZWZhdWx0OgotICAgICAgTk9UUkVBQ0hFRCgpIDw8ICJVbnN1cHBvcnRlZCBmb3JtYXQgIiA8PCBmb3JtYXQ7Ci0gICAgICBicmVhazsKLSAgfQotCi0gICpvdXRfZGVjb2RlX3RhcmdldCA9IFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKAotICAgICAgY29udGV4dF9lZ2wtPnN5c3RlbV9lZ2woKS0+R2V0RGlzcGxheSgpLAotICAgICAgY29udGV4dF9lZ2wtPkdldENvbnRleHQoKSwKLSAgICAgIGZvcm1hdCwgd2lkdGgsIGhlaWdodCwgcGxhbmVzKTsKLSAgR0xfQ0FMTChnbEJpbmRUZXh0dXJlKEdMX1RFWFRVUkVfMkQsIDApKTsKKyAgKm91dF9kZWNvZGVfdGFyZ2V0ID0KKyAgICAgIFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKGNvbnRleHRfZWdsLT5zeXN0ZW1fZWdsKCktPkdldERpc3BsYXkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHRfZWdsLT5HZXRDb250ZXh0KCksIGZvcm1hdCwgd2lkdGgsIGhlaWdodCk7CiAKICAgZG9uZV9ldmVudC0+U2lnbmFsKCk7CiB9CiAKLXZvaWQgRGVjb2RlVGFyZ2V0UmVsZWFzZU9uUmFzdGVyaXplcihTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KSB7Ci0gIEdMdWludCBwbGFuZSA9IFNiRGVjb2RlVGFyZ2V0R2V0UGxhbmUoZGVjb2RlX3RhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkEpOwotICBHTF9DQUxMKGdsRGVsZXRlVGV4dHVyZXMoMSwgJnBsYW5lKSk7Ci0gIFNiRGVjb2RlVGFyZ2V0RGVzdHJveShkZWNvZGVfdGFyZ2V0KTsKK3ZvaWQgRGVjb2RlVGFyZ2V0UmVsZWFzZU9uUmFzdGVyaXplcigKKyAgICBjb2JhbHQ6OnJlbmRlcmVyOjpiYWNrZW5kOjpHcmFwaGljc0NvbnRleHRFR0wqIGNvbnRleHRfZWdsLAorICAgIFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIHsKKyAgY29iYWx0OjpyZW5kZXJlcjo6YmFja2VuZDo6R3JhcGhpY3NDb250ZXh0RUdMOjpTY29wZWRNYWtlQ3VycmVudAorICAgICAgc2NvcGVkX2NvbnRleHQoY29udGV4dF9lZ2wpOworCisgIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZShkZWNvZGVfdGFyZ2V0KTsKIH0KIAotI2VuZGlmICAvLyBTQl9WRVJTSU9OKFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTikgJiYgU0JfSEFTKEdSQVBISUNTKQorI2VuZGlmICAvLyBTQl9WRVJTSU9OKFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTikgJiYgXAorICAgICAgICAgICBTQl9IQVMoR1JBUEhJQ1MpCiAKIH0gIC8vIG5hbWVzcGFjZQogCkBAIC0xMDEsMTEgKzg1LDEzIEBACiAgIC8vIG9uIG11bHRpcGxlIHRocmVhZHMgc2ltdWx0YW5lb3VzbHkgbGF0ZXIuCiAgIFNrU2FmZVVucmVmKFNrRm9udE1ncjo6UmVmRGVmYXVsdCgpKTsKIAotI2lmIFNCX1ZFUlNJT04oU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OICYmIFwKKyAgICBTQl9IQVMoR1JBUEhJQ1MpCiAgIGRlY29kZV90YXJnZXRfcHJvdmlkZXJfLmFjcXVpcmUgPSAmRGVjb2RlVGFyZ2V0QWNxdWlyZTsKICAgZGVjb2RlX3RhcmdldF9wcm92aWRlcl8ucmVsZWFzZSA9ICZEZWNvZGVUYXJnZXRSZWxlYXNlOwogICBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyXy5jb250ZXh0ID0gdGhpczsKLSNlbmRpZiAgLy8gU0JfVkVSU0lPTihTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04pICYmIFNCX0hBUyhHUkFQSElDUykKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OICYmIFwKKyAgICAgICAgICAgU0JfSEFTKEdSQVBISUNTKQogfQogCiB2b2lkIEhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcjo6RmluaXNoKCkgewpAQCAtMTc0LDMxICsxNjAsNDEgQEAKICAgICAgIHNlbGZfbWVzc2FnZV9sb29wXykpOwogfQogCi0jaWYgU0JfVkVSU0lPTihTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04pICYmIFNCX0hBUyhHUkFQSElDUykKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gJiYgXAorICAgIFNCX0hBUyhHUkFQSElDUykKIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPgogICAgIEhhcmR3YXJlUmVzb3VyY2VQcm92aWRlcjo6Q3JlYXRlSW1hZ2VGcm9tU2JEZWNvZGVUYXJnZXQoCiAgICAgICAgIFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIHsKKyAgU2JEZWNvZGVUYXJnZXRJbmZvIGluZm87CisgIFNiTWVtb3J5U2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICBDSEVDSyhTYkRlY29kZVRhcmdldEdldEluZm8oZGVjb2RlX3RhcmdldCwgJmluZm8pKTsKKwogICAvLyBUaGVyZSBpcyBsaW1pdGVkIGZvcm1hdCBzdXBwb3J0IGF0IHRoaXMgdGltZS4KLSAgRENIRUNLKFNiRGVjb2RlVGFyZ2V0R2V0Rm9ybWF0KGRlY29kZV90YXJnZXQpID09Ci0gICAgICAgICBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBKTsKKyAgRENIRUNLX0VRKGluZm8uZm9ybWF0LCBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBKTsKKyAgY29uc3QgU2JEZWNvZGVUYXJnZXRJbmZvUGxhbmUmIHBsYW5lID0gaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBXTsKIAotICBpbnQgZ2xfaGFuZGxlID0gU2JEZWNvZGVUYXJnZXRHZXRQbGFuZShkZWNvZGVfdGFyZ2V0LAotICAgICAga1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBKTsKKyAgaW50IGdsX2hhbmRsZSA9IHBsYW5lLnRleHR1cmU7CiAgIHJlbmRlcl90cmVlOjpBbHBoYUZvcm1hdCBhbHBoYV9mb3JtYXQgPQotICAgICAgU2JEZWNvZGVUYXJnZXRJc09wYXF1ZShkZWNvZGVfdGFyZ2V0KSA/Ci0gICAgICAgICAgcmVuZGVyX3RyZWU6OmtBbHBoYUZvcm1hdE9wYXF1ZSA6Ci0gICAgICAgICAgcmVuZGVyX3RyZWU6OmtBbHBoYUZvcm1hdFVucHJlbXVsdGlwbGllZDsKLSAgaW50IHdpZHRoID0gMDsKLSAgaW50IGhlaWdodCA9IDA7Ci0gIFNiRGVjb2RlVGFyZ2V0R2V0U2l6ZShkZWNvZGVfdGFyZ2V0LCAmd2lkdGgsICZoZWlnaHQpOwotICBTYkRlY29kZVRhcmdldERlc3Ryb3koZGVjb2RlX3RhcmdldCk7CisgICAgICBpbmZvLmlzX29wYXF1ZSA/IHJlbmRlcl90cmVlOjprQWxwaGFGb3JtYXRPcGFxdWUKKyAgICAgICAgICAgICAgICAgICAgIDogcmVuZGVyX3RyZWU6OmtBbHBoYUZvcm1hdFVucHJlbXVsdGlwbGllZDsKIAotICBzY29wZWRfcHRyPGJhY2tlbmQ6OlRleHR1cmVFR0w+IHRleHR1cmUoCi0gICAgICBuZXcgYmFja2VuZDo6VGV4dHVyZUVHTChjb2JhbHRfY29udGV4dF8sCi0gICAgICAgICAgZ2xfaGFuZGxlLCBtYXRoOjpTaXplKHdpZHRoLCBoZWlnaHQpLCBHTF9SR0JBKSk7CisgIHNjb3BlZF9wdHI8bWF0aDo6UmVjdD4gY29udGVudF9yZWdpb247CisgIGlmIChwbGFuZS5jb250ZW50X3JlZ2lvbi5sZWZ0ICE9IDAgfHwgcGxhbmUuY29udGVudF9yZWdpb24udG9wICE9IDAgfHwKKyAgICAgIHBsYW5lLmNvbnRlbnRfcmVnaW9uLnJpZ2h0ICE9IHBsYW5lLndpZHRoIHx8CisgICAgICBwbGFuZS5jb250ZW50X3JlZ2lvbi5ib3R0b20gIT0gcGxhbmUuaGVpZ2h0KSB7CisgICAgY29udGVudF9yZWdpb24ucmVzZXQoCisgICAgICAgIG5ldyBtYXRoOjpSZWN0KHBsYW5lLmNvbnRlbnRfcmVnaW9uLmxlZnQsIHBsYW5lLmNvbnRlbnRfcmVnaW9uLnRvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgcGxhbmUuY29udGVudF9yZWdpb24ucmlnaHQgLSBwbGFuZS5jb250ZW50X3JlZ2lvbi5sZWZ0LAorICAgICAgICAgICAgICAgICAgICAgICBwbGFuZS5jb250ZW50X3JlZ2lvbi5ib3R0b20gLSBwbGFuZS5jb250ZW50X3JlZ2lvbi50b3ApKTsKKyAgfQorCisgIHNjb3BlZF9wdHI8YmFja2VuZDo6VGV4dHVyZUVHTD4gdGV4dHVyZShuZXcgYmFja2VuZDo6VGV4dHVyZUVHTCgKKyAgICAgIGNvYmFsdF9jb250ZXh0XywgZ2xfaGFuZGxlLCBtYXRoOjpTaXplKHBsYW5lLndpZHRoLCBwbGFuZS5oZWlnaHQpLAorICAgICAgR0xfUkdCQSwgcGxhbmUuZ2xfdGV4dHVyZV90YXJnZXQsCisgICAgICBiYXNlOjpCaW5kKCZTYkRlY29kZVRhcmdldFJlbGVhc2UsIGRlY29kZV90YXJnZXQpKSk7CiAgIHJldHVybiBtYWtlX3Njb3BlZF9yZWZwdHIobmV3IEhhcmR3YXJlRnJvbnRlbmRJbWFnZSgKICAgICAgIHRleHR1cmUuUGFzcygpLCBhbHBoYV9mb3JtYXQsIGNvYmFsdF9jb250ZXh0XywgZ3JfY29udGV4dF8sCi0gICAgICBzZWxmX21lc3NhZ2VfbG9vcF8pKTsKKyAgICAgIGNvbnRlbnRfcmVnaW9uLlBhc3MoKSwgc2VsZl9tZXNzYWdlX2xvb3BfKSk7CiB9CiAKIC8vIHN0YXRpYwpAQCAtMjI5LDEwICsyMjUsMTIgQEAKICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8SGFyZHdhcmVSZXNvdXJjZVByb3ZpZGVyKj4oY29udGV4dCk7CiAKICAgLy8gVGV4dHVyZSBkZWxldGlvbiBtdXN0IG9jY3VyIG9uIHRoZSByYXN0ZXJpemVyIHRocmVhZC4KLSAgcHJvdmlkZXItPnNlbGZfbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soRlJPTV9IRVJFLAotICAgICAgYmFzZTo6QmluZCgmRGVjb2RlVGFyZ2V0UmVsZWFzZU9uUmFzdGVyaXplciwgZGVjb2RlX3RhcmdldCkpOworICBwcm92aWRlci0+c2VsZl9tZXNzYWdlX2xvb3BfLT5Qb3N0VGFzaygKKyAgICAgIEZST01fSEVSRSwgYmFzZTo6QmluZCgmRGVjb2RlVGFyZ2V0UmVsZWFzZU9uUmFzdGVyaXplciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm92aWRlci0+Y29iYWx0X2NvbnRleHRfLCBkZWNvZGVfdGFyZ2V0KSk7CiB9Ci0jZW5kaWYgIC8vIFNCX1ZFUlNJT04oU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiAmJiBcCisgICAgICAgICAgIFNCX0hBUyhHUkFQSElDUykKIAogc2NvcGVkX3B0cjxSYXdJbWFnZU1lbW9yeT4gSGFyZHdhcmVSZXNvdXJjZVByb3ZpZGVyOjpBbGxvY2F0ZVJhd0ltYWdlTWVtb3J5KAogICAgIHNpemVfdCBzaXplX2luX2J5dGVzLCBzaXplX3QgYWxpZ25tZW50KSB7CkBAIC0zNDcsNyArMzQ1LDcgQEAKICAgU2tBdXRvVFVucmVmPFNrRGF0YT4gc2tpYV9kYXRhKFNrRGF0YTo6TmV3V2l0aENvcHkoCiAgICAgICBzYW5pdGl6ZWRfZGF0YS5nZXQoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzYW5pdGl6ZWRfZGF0YS5UZWxsKCkpKSk7CiAKLSAgU2tBdXRvVFVucmVmPFNrU3RyZWFtPiBzdHJlYW0obmV3IFNrTWVtb3J5U3RyZWFtKHNraWFfZGF0YSkpOworICBTa0F1dG9UVW5yZWY8U2tTdHJlYW1Bc3NldD4gc3RyZWFtKG5ldyBTa01lbW9yeVN0cmVhbShza2lhX2RhdGEpKTsKICAgU2tBdXRvVFVucmVmPFNrVHlwZWZhY2U+IHR5cGVmYWNlKFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtKSk7CiAgIGlmICh0eXBlZmFjZSkgewogICAgIHJldHVybiBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpUeXBlZmFjZT4obmV3IFNraWFUeXBlZmFjZSh0eXBlZmFjZSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmgKaW5kZXggMzlmMWM3Ni4uNDhmMTAyMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJkd2FyZV9yZXNvdXJjZV9wcm92aWRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX0hBUkRXQVJFX1JFU09VUkNFX1BST1ZJREVSX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfSEFSRFdBUkVfUkVTT1VSQ0VfUFJPVklERVJfSF8KQEAgLTUyLDcgKzUwLDcgQEAKICAgICAgIHNjb3BlZF9wdHI8cmVuZGVyX3RyZWU6OkltYWdlRGF0YT4gcGl4ZWxfZGF0YSkgT1ZFUlJJREU7CiAKICNpZiBTQl9IQVMoR1JBUEhJQ1MpCi0jaWYgU0JfVkVSU0lPTihTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04pCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiAKICAgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6SW1hZ2U+IENyZWF0ZUltYWdlRnJvbVNiRGVjb2RlVGFyZ2V0KAogICAgICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgT1ZFUlJJREU7CkBAIC02Niw3ICs2NCw3IEBACiAgIC8vIFdoZXRoZXIgU2JEZWNvZGVUYXJnZXRJc1N1cHBvcnRlZCBvciBub3QuCiAgIGJvb2wgU3VwcG9ydHNTYkRlY29kZVRhcmdldCgpIE9WRVJSSURFIHsgcmV0dXJuIHRydWU7IH0KIAotI2VsaWYgU0JfVkVSU0lPTigzKSAgLy8gU0JfVkVSU0lPTihTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04pCisjZWxpZiBTQl9BUElfVkVSU0lPTiA+PSAzCiAKICAgc2NvcGVkX3JlZnB0cjxyZW5kZXJfdHJlZTo6SW1hZ2U+IENyZWF0ZUltYWdlRnJvbVNiRGVjb2RlVGFyZ2V0KAogICAgICAgU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgT1ZFUlJJREUgewpAQCAtODMsNyArODEsNyBAQAogICAvLyBXaGV0aGVyIFNiRGVjb2RlVGFyZ2V0SXNTdXBwb3J0ZWQgb3Igbm90LgogICBib29sIFN1cHBvcnRzU2JEZWNvZGVUYXJnZXQoKSBPVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQogCi0jZW5kaWYgIC8vIFNCX1ZFUlNJT04oU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICNlbmRpZiAgLy8gU0JfSEFTKEdSQVBISUNTKQogCiAgIHNjb3BlZF9wdHI8cmVuZGVyX3RyZWU6OlJhd0ltYWdlTWVtb3J5PiBBbGxvY2F0ZVJhd0ltYWdlTWVtb3J5KApAQCAtMTMyLDEzICsxMzAsMTUgQEAKIAogICBUZXh0U2hhcGVyIHRleHRfc2hhcGVyXzsKIAotI2lmIFNCX1ZFUlNJT04oU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OICYmIFwKKyAgICBTQl9IQVMoR1JBUEhJQ1MpCiAgIHN0YXRpYyBTYkRlY29kZVRhcmdldCBEZWNvZGVUYXJnZXRBY3F1aXJlKHZvaWQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLCBpbnQgaGVpZ2h0KTsKICAgc3RhdGljIHZvaWQgRGVjb2RlVGFyZ2V0UmVsZWFzZSh2b2lkKiBjb250ZXh0LCBTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KTsKICAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyXzsKLSNlbmRpZiAgLy8gU0JfVkVSU0lPTihTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04pICYmIFNCX0hBUyhHUkFQSElDUykKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OICYmIFwKKyAgICAgICAgICAgU0JfSEFTKEdSQVBISUNTKQogCiAgIC8vIFdlIGtlZXAgYSBoYW5kbGUgdG8gdGhlIG1lc3NhZ2UgbG9vcCB0aGF0IHRoaXMgcmVzb3VyY2UgcHJvdmlkZXIgd2FzCiAgIC8vIGNyZWF0ZWQgb24uICBUaGlzIG1lc3NhZ2UgbG9vcCBpcyB1c2VkIHdoZW5ldmVyIHdlIG5lZWQgdG8gaXNzdWUgZ3JhcGhpY3MKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmZidXp6X2ZvbnQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJmYnV6el9mb250LmNjCmluZGV4IDYyNDkzZjMuLjA0MzRmZTIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmZidXp6X2ZvbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZmJ1enpfZm9udC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmZidXp6X2ZvbnQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZmJ1enpfZm9udC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZmJ1enpfZm9udC5oCmluZGV4IGEzN2U1YzEuLjE2YjA3ZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2hhcmZidXp6X2ZvbnQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9oYXJmYnV6el9mb250LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfSEFSRkJVWlpfRk9OVF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX0hBUkZCVVpaX0ZPTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ltYWdlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuY2MKaW5kZXggY2VhZjBjNS4uMDEzZGNmNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9pbWFnZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9pbWFnZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaW1hZ2UuaAppbmRleCA1ZTYxMmQ1Li4zOWFhZjNmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9pbWFnZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL2ltYWdlLmgKQEAgLTEsMzAgKzEsMzUgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfSU1BR0VfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9JTUFHRV9IXwogCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvdHlwZV9pZC5oIgorI2luY2x1ZGUgImNvYmFsdC9tYXRoL3JlY3QuaCIKICNpbmNsdWRlICJjb2JhbHQvbWF0aC9zaXplLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2ltYWdlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL3Jlc291cmNlX3Byb3ZpZGVyLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta0JpdG1hcC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSByZW5kZXJlciB7CisKK25hbWVzcGFjZSBiYWNrZW5kIHsKK2NsYXNzIFRleHR1cmVFR0w7Cit9ICAvLyBuYW1lc3BhY2UgYmFja2VuZAorCiBuYW1lc3BhY2UgcmFzdGVyaXplciB7CiBuYW1lc3BhY2Ugc2tpYSB7CiAKQEAgLTY2LDYgKzcxLDIwIEBACiAgIGJhc2U6OlR5cGVJZCBHZXRUeXBlSWQoKSBjb25zdCBPVkVSUklERSB7CiAgICAgcmV0dXJuIGJhc2U6OkdldFR5cGVJZDxTaW5nbGVQbGFuZUltYWdlPigpOwogICB9CisKKyAgLy8gSWYgR0xFUzIgaXMgYmFja2luZyB0aGlzIGltYWdlLCB0aGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgdG8gcmV0dXJuIGEKKyAgLy8gcmVmZXJlbmNlIHRvIHRoYXQgRUdMIHRleHR1cmUuCisgIHZpcnR1YWwgY29uc3QgYmFja2VuZDo6VGV4dHVyZUVHTCogR2V0VGV4dHVyZUVHTCgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworICAvLyBJZiBub3QtbnVsbCwgaW5kaWNhdGVzIGEgcmVjdGFuZ2xlIHdpdGhpbiB0aGUgaW1hZ2UgaW4gd2hpY2ggdGhlIHZhbGlkCisgIC8vIHBpeGVsIGRhdGEgaXMgdG8gYmUgZm91bmQuCisgIHZpcnR1YWwgY29uc3QgbWF0aDo6UmVjdCogR2V0Q29udGVudFJlZ2lvbigpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KKworICAvLyBXaGlsZSBvZiBjb3Vyc2UgbW9zdCBza2lhOjpJbWFnZSBvYmplY3RzIGNhbiBiZSByZW5kZXJlZCBpbiBTa2lhLCBzb21ldGltZXMKKyAgLy8gdGhpcyBpcyBub3QgdHJ1ZSwgc3VjaCBhcyB3aGVuIHRoZXkgYXJlIGJhY2tlZCBieSBTYkRlY29kZVRhcmdldCBvYmplY3RzCisgIC8vIHRoYXQgYXNzdW1lIGEgc3BlY2lmaWMgcmFzdGVyaXplciBzdWNoIGFzIEdMRVMyLiAgSW4gdGhpcyBjYXNlLCB3ZSBjYW4KKyAgLy8gZmFsbGJhY2sgdG8gYSByYXN0ZXJpemVyLXByb3ZpZGVkIHJlbmRlcmVyIGZ1bmN0aW9uLgorICB2aXJ0dWFsIGJvb2wgQ2FuUmVuZGVySW5Ta2lhKCkgY29uc3QgeyByZXR1cm4gdHJ1ZTsgfQogfTsKIAogLy8gQSBtdWx0aS1wbGFuZSBpbWFnZSBpcyBvbmUgd2hlcmUgZGlmZmVyZW50IGNoYW5uZWxzIG1heSBoYXZlIGRpZmZlcmVudCBwbGFuZXMKQEAgLTc1LDYgKzk0LDkgQEAKICBwdWJsaWM6CiAgIHZpcnR1YWwgcmVuZGVyX3RyZWU6Ok11bHRpUGxhbmVJbWFnZUZvcm1hdCBHZXRGb3JtYXQoKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgY29uc3QgU2tCaXRtYXAqIEdldEJpdG1hcChpbnQgcGxhbmVfaW5kZXgpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCBjb25zdCBiYWNrZW5kOjpUZXh0dXJlRUdMKiBHZXRUZXh0dXJlRUdMKGludCBwbGFuZV9pbmRleCkgY29uc3QgeworICAgIHJldHVybiBOVUxMOworICB9CiAKICAgYmFzZTo6VHlwZUlkIEdldFR5cGVJZCgpIGNvbnN0IE9WRVJSSURFIHsKICAgICByZXR1cm4gYmFzZTo6R2V0VHlwZUlkPE11bHRpUGxhbmVJbWFnZT4oKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5jYwppbmRleCA5YjE3NzU5Li5kZTMzYWEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3IuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmgiCiAKQEAgLTc4LDYgKzc2LDcgQEAKICAgICBTa0NhbnZhcyogcmVuZGVyX3RhcmdldCwKICAgICBjb25zdCBDcmVhdGVTY3JhdGNoU3VyZmFjZUZ1bmN0aW9uKiBjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uLAogICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHJlc2V0X3NraWFfY29udGV4dF9mdW5jdGlvbiwKKyAgICBjb25zdCBSZW5kZXJJbWFnZUZhbGxiYWNrRnVuY3Rpb24mIHJlbmRlcl9pbWFnZV9mYWxsYmFja19mdW5jdGlvbiwKICAgICBTdXJmYWNlQ2FjaGVEZWxlZ2F0ZSogc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZSwKICAgICBjb21tb246OlN1cmZhY2VDYWNoZSogc3VyZmFjZV9jYWNoZSwgVHlwZSB2aXNpdG9yX3R5cGUpCiAgICAgOiBkcmF3X3N0YXRlXyhyZW5kZXJfdGFyZ2V0KSwKQEAgLTg1LDcgKzg0LDggQEAKICAgICAgIHN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfKHN1cmZhY2VfY2FjaGVfZGVsZWdhdGUpLAogICAgICAgc3VyZmFjZV9jYWNoZV8oc3VyZmFjZV9jYWNoZSksCiAgICAgICB2aXNpdG9yX3R5cGVfKHZpc2l0b3JfdHlwZSksCi0gICAgICByZXNldF9za2lhX2NvbnRleHRfZnVuY3Rpb25fKHJlc2V0X3NraWFfY29udGV4dF9mdW5jdGlvbikgeworICAgICAgcmVzZXRfc2tpYV9jb250ZXh0X2Z1bmN0aW9uXyhyZXNldF9za2lhX2NvbnRleHRfZnVuY3Rpb24pLAorICAgICAgcmVuZGVyX2ltYWdlX2ZhbGxiYWNrX2Z1bmN0aW9uXyhyZW5kZXJfaW1hZ2VfZmFsbGJhY2tfZnVuY3Rpb24pIHsKICAgRENIRUNLX0VRKHN1cmZhY2VfY2FjaGVfZGVsZWdhdGVfID09IE5VTEwsIHN1cmZhY2VfY2FjaGVfID09IE5VTEwpOwogICBpZiAoc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8pIHsKICAgICAvLyBVcGRhdGUgb3VyIHN1cmZhY2UgY2FjaGUgZGVsZWdhdGUgdG8gcG9pbnQgdG8gdGhpcyByZW5kZXIgdHJlZSBub2RlCkBAIC0yNzQsNyArMjc0LDggQEAKICAgewogICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvciBzdWJfdmlzaXRvcigKICAgICAgICAgY2FudmFzLCBjcmVhdGVfc2NyYXRjaF9zdXJmYWNlX2Z1bmN0aW9uXywgcmVzZXRfc2tpYV9jb250ZXh0X2Z1bmN0aW9uXywKLSAgICAgICAgc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8sIHN1cmZhY2VfY2FjaGVfLCBrVHlwZV9TdWJWaXNpdG9yKTsKKyAgICAgICAgcmVuZGVyX2ltYWdlX2ZhbGxiYWNrX2Z1bmN0aW9uXywgc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8sCisgICAgICAgIHN1cmZhY2VfY2FjaGVfLCBrVHlwZV9TdWJWaXNpdG9yKTsKICAgICBmaWx0ZXJfbm9kZS5zb3VyY2UtPkFjY2VwdCgmc3ViX3Zpc2l0b3IpOwogICB9CiAKQEAgLTUzMiw2ICs1MzMsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbmRlclRyZWVOb2RlVmlzaXRvckRyYXdTdGF0ZSogZHJhd19zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpSZWN0RiYgZGVzdGluYXRpb25fcmVjdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXRoOjpNYXRyaXgzRiogbG9jYWxfdHJhbnNmb3JtKSB7CisgIERDSEVDSyghc2luZ2xlX3BsYW5lX2ltYWdlLT5HZXRDb250ZW50UmVnaW9uKCkpOwogICBTa1BhaW50IHBhaW50ID0gQ3JlYXRlU2tQYWludEZvckltYWdlUmVuZGVyaW5nKAogICAgICAgKmRyYXdfc3RhdGUsIHNpbmdsZV9wbGFuZV9pbWFnZS0+SXNPcGFxdWUoKSk7CiAKQEAgLTY3OSw5ICs2ODEsMTYgQEAKICAgLy8gV2UgaXNzdWUgZGlmZmVyZW50IHNraWEgcmFzdGVyaXphdGlvbiBjb21tYW5kcyB0byByZW5kZXIgdGhlIGltYWdlCiAgIC8vIGRlcGVuZGluZyBvbiB3aGV0aGVyIGl0J3Mgc2luZ2xlIG9yIG11bHRpIHBsYW5lZC4KICAgaWYgKGltYWdlLT5HZXRUeXBlSWQoKSA9PSBiYXNlOjpHZXRUeXBlSWQ8U2luZ2xlUGxhbmVJbWFnZT4oKSkgewotICAgIFJlbmRlclNpbmdsZVBsYW5lSW1hZ2UoYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8U2luZ2xlUGxhbmVJbWFnZSo+KGltYWdlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZkcmF3X3N0YXRlXywgaW1hZ2Vfbm9kZS0+ZGF0YSgpLmRlc3RpbmF0aW9uX3JlY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmKGltYWdlX25vZGUtPmRhdGEoKS5sb2NhbF90cmFuc2Zvcm0pKTsKKyAgICBTaW5nbGVQbGFuZUltYWdlKiBzaW5nbGVfcGxhbmVfaW1hZ2UgPQorICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxTaW5nbGVQbGFuZUltYWdlKj4oaW1hZ2UpOworCisgICAgaWYgKCFzaW5nbGVfcGxhbmVfaW1hZ2UtPkNhblJlbmRlckluU2tpYSgpKSB7CisgICAgICByZW5kZXJfaW1hZ2VfZmFsbGJhY2tfZnVuY3Rpb25fLlJ1bihpbWFnZV9ub2RlLCAmZHJhd19zdGF0ZV8pOworICAgIH0gZWxzZSB7CisgICAgICBSZW5kZXJTaW5nbGVQbGFuZUltYWdlKHNpbmdsZV9wbGFuZV9pbWFnZSwgJmRyYXdfc3RhdGVfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbWFnZV9ub2RlLT5kYXRhKCkuZGVzdGluYXRpb25fcmVjdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJihpbWFnZV9ub2RlLT5kYXRhKCkubG9jYWxfdHJhbnNmb3JtKSk7CisgICAgfQogICB9IGVsc2UgaWYgKGltYWdlLT5HZXRUeXBlSWQoKSA9PSBiYXNlOjpHZXRUeXBlSWQ8TXVsdGlQbGFuZUltYWdlPigpKSB7CiAgICAgUmVuZGVyTXVsdGlQbGFuZUltYWdlKGJhc2U6OnBvbHltb3JwaGljX2Rvd25jYXN0PE11bHRpUGxhbmVJbWFnZSo+KGltYWdlKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRyYXdfc3RhdGVfLCBpbWFnZV9ub2RlLT5kYXRhKCkuZGVzdGluYXRpb25fcmVjdCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmgKaW5kZXggNjVkYWMwZS4uOTQ5MGFmZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfUkVOREVSX1RSRUVfTk9ERV9WSVNJVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfUkVOREVSX1RSRUVfTk9ERV9WSVNJVE9SX0hfCkBAIC02MCw2ICs1OCwxMCBAQAogICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHNjb3BlZF9wdHI8U2NyYXRjaFN1cmZhY2U+KGNvbnN0IG1hdGg6OlNpemUmKT4KICAgICAgIENyZWF0ZVNjcmF0Y2hTdXJmYWNlRnVuY3Rpb247CiAKKyAgdHlwZWRlZiBiYXNlOjpDYWxsYmFjazx2b2lkKGNvbnN0IHJlbmRlcl90cmVlOjpJbWFnZU5vZGUqIGltYWdlX25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZW5kZXJUcmVlTm9kZVZpc2l0b3JEcmF3U3RhdGUqIGRyYXdfc3RhdGUpPgorICAgICAgUmVuZGVySW1hZ2VGYWxsYmFja0Z1bmN0aW9uOworCiAgIGVudW0gVHlwZSB7CiAgICAga1R5cGVfTm9ybWFsLAogICAgIGtUeXBlX1N1YlZpc2l0b3IsCkBAIC02OSwxMSArNzEsMTYgQEAKICAgLy8gUmVuZGVyVHJlZU5vZGVWaXNpdG9yLCBzbyBpdCBtdXN0IG91dGxpdmUgdGhlIFJlbmRlclRyZWVOb2RlVmlzaXRvcgogICAvLyBvYmplY3QuICBJZiB8aXNfc3ViX3Zpc2l0b3J8IGlzIHNldCB0byB0cnVlLCBlcnJvcnMgd2lsbCBiZSBzdXBwb3J0ZWQgZm9yCiAgIC8vIGNlcnRhaW4gb3BlcmF0aW9ucyBzdWNoIGFzIHB1bmNoIG91dCBhbHBoYSB0ZXh0dXJlcywgYXMgaXQgaXMgdW5mb3J0dW5hdGVseQotICAvLyBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IHRoZW0gd2hlbiByZW5kZXJpbmcgdG8gYSBzdWItY2FudmFzLgorICAvLyBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IHRoZW0gd2hlbiByZW5kZXJpbmcgdG8gYSBzdWItY2FudmFzLiAgSWYKKyAgLy8gfHJlbmRlcl9pbWFnZV9mYWxsYmFja19mdW5jdGlvbnwgaXMgc3BlY2lmaWVkLCBpdCB3aWxsIGJlIGludm9rZWQgd2hlbmV2ZXIKKyAgLy8gc3RhbmRhcmQgU2tpYSBwcm9jZXNzaW5nIG9mIHRoZSBpbWFnZSBpcyBub3QgcG9zc2libGUsIHdoaWNoIHVzdWFsbHkgaXMKKyAgLy8gd2hlbiB0aGUgaW1hZ2UgaXMgYmFja2VkIGJ5IGEgU2JEZWNvZGVUYXJnZXQgdGhhdCByZXF1aXJlcyBzcGVjaWFsCisgIC8vIGNvbnNpZGVyYXRpb24uCiAgIFJlbmRlclRyZWVOb2RlVmlzaXRvcigKICAgICAgIFNrQ2FudmFzKiByZW5kZXJfdGFyZ2V0LAogICAgICAgY29uc3QgQ3JlYXRlU2NyYXRjaFN1cmZhY2VGdW5jdGlvbiogY3JlYXRlX3NjcmF0Y2hfc3VyZmFjZV9mdW5jdGlvbiwKICAgICAgIGNvbnN0IGJhc2U6OkNsb3N1cmUmIHJlc2V0X3NraWFfY29udGV4dF9mdW5jdGlvbiwKKyAgICAgIGNvbnN0IFJlbmRlckltYWdlRmFsbGJhY2tGdW5jdGlvbiYgcmVuZGVyX2ltYWdlX2ZhbGxiYWNrX2Z1bmN0aW9uLAogICAgICAgU3VyZmFjZUNhY2hlRGVsZWdhdGUqIHN1cmZhY2VfY2FjaGVfZGVsZWdhdGUsCiAgICAgICBjb21tb246OlN1cmZhY2VDYWNoZSogc3VyZmFjZV9jYWNoZSwgVHlwZSB2aXNpdG9yX3R5cGUgPSBrVHlwZV9Ob3JtYWwpOwogCkBAIC0xMDcsNiArMTE0LDggQEAKIAogICBiYXNlOjpDbG9zdXJlIHJlc2V0X3NraWFfY29udGV4dF9mdW5jdGlvbl87CiAKKyAgUmVuZGVySW1hZ2VGYWxsYmFja0Z1bmN0aW9uIHJlbmRlcl9pbWFnZV9mYWxsYmFja19mdW5jdGlvbl87CisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFJlbmRlclRyZWVOb2RlVmlzaXRvcik7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3JfZHJhd19zdGF0ZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvcmVuZGVyX3RyZWVfbm9kZV92aXNpdG9yX2RyYXdfc3RhdGUuaAppbmRleCBkM2NiMGZlLi43Njk0YjRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9yZW5kZXJfdHJlZV9ub2RlX3Zpc2l0b3JfZHJhd19zdGF0ZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3JlbmRlcl90cmVlX25vZGVfdmlzaXRvcl9kcmF3X3N0YXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfUkVOREVSX1RSRUVfTk9ERV9WSVNJVE9SX0RSQVdfU1RBVEVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9SRU5ERVJfVFJFRV9OT0RFX1ZJU0lUT1JfRFJBV19TVEFURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2NyYXRjaF9zdXJmYWNlX2NhY2hlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2NyYXRjaF9zdXJmYWNlX2NhY2hlLmNjCmluZGV4IDdkZTVmZGMuLjhmYjE5MWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NjcmF0Y2hfc3VyZmFjZV9jYWNoZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2NyYXRjaF9zdXJmYWNlX2NhY2hlLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuaAppbmRleCBlYWY3ZWE1Li5kOGU0ZTE2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zY3JhdGNoX3N1cmZhY2VfY2FjaGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TQ1JBVENIX1NVUkZBQ0VfQ0FDSEVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TQ1JBVENIX1NVUkZBQ0VfQ0FDSEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvZWdsL3NyYy9ncHUvY29iYWx0L0dyR3B1RmFjdG9yeS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvZWdsL3NyYy9ncHUvY29iYWx0L0dyR3B1RmFjdG9yeS5jYwppbmRleCBjNWQ5ODQwLi5hMjA3MTM1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL2VnbC9zcmMvZ3B1L2NvYmFsdC9HckdwdUZhY3RvcnkuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9lZ2wvc3JjL2dwdS9jb2JhbHQvR3JHcHVGYWN0b3J5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9iYWNrZW5kL2VnbC9ncmFwaGljc19jb250ZXh0LmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9lZmZlY3RzL1NrTlYxMjJSR0JTaGFkZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9lZmZlY3RzL1NrTlYxMjJSR0JTaGFkZXIuY2MKaW5kZXggNzEyMjUyZS4uZTE1OTZkYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvZWZmZWN0cy9Ta05WMTIyUkdCU2hhZGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tOVjEyMlJHQlNoYWRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tOVjEyMlJHQlNoYWRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9lZmZlY3RzL1NrTlYxMjJSR0JTaGFkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tOVjEyMlJHQlNoYWRlci5oCmluZGV4IGY3ZDY1NDUuLjgzZDViMGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tOVjEyMlJHQlNoYWRlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tOVjEyMlJHQlNoYWRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX0VGRkVDVFNfU0tOVjEyMlJHQlNIQURFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX0VGRkVDVFNfU0tOVjEyMlJHQlNIQURFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvZWZmZWN0cy9Ta1lVVjJSR0JTaGFkZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9lZmZlY3RzL1NrWVVWMlJHQlNoYWRlci5jYwppbmRleCBhYWY2YmJlLi43NDJlZjI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9lZmZlY3RzL1NrWVVWMlJHQlNoYWRlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9lZmZlY3RzL1NrWVVWMlJHQlNoYWRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tZVVYyUkdCU2hhZGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tZVVYyUkdCU2hhZGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9lZmZlY3RzL1NrWVVWMlJHQlNoYWRlci5oCmluZGV4IGNmOWIwZGYuLjMzZTgxNGMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2VmZmVjdHMvU2tZVVYyUkdCU2hhZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvZWZmZWN0cy9Ta1lVVjJSR0JTaGFkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TS0lBX1NSQ19FRkZFQ1RTX1NLWVVWMlJHQlNIQURFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX0VGRkVDVFNfU0tZVVYyUkdCU0hBREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9ncHUvZ2wvR3JHTENyZWF0ZU5hdGl2ZUludGVyZmFjZV9jb2JhbHQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9ncHUvZ2wvR3JHTENyZWF0ZU5hdGl2ZUludGVyZmFjZV9jb2JhbHQuY2MKaW5kZXggMjI1MTdhOC4uZDEzNDhjYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvZ3B1L2dsL0dyR0xDcmVhdGVOYXRpdmVJbnRlcmZhY2VfY29iYWx0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL2dwdS9nbC9HckdMQ3JlYXRlTmF0aXZlSW50ZXJmYWNlX2NvYmFsdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxFR0wvZWdsLmg+CiAjaW5jbHVkZSA8R0xFUzIvZ2wyLmg+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0F0b21pY3NfY29iYWx0LmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0F0b21pY3NfY29iYWx0LmgKaW5kZXggMGZiZjdmZC4uOTQ2NGVkMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tBdG9taWNzX2NvYmFsdC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrQXRvbWljc19jb2JhbHQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TS0lBX1NSQ19QT1JUU19TS0FUT01JQ1NfQ09CQUxUX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU0tJQV9TUkNfUE9SVFNfU0tBVE9NSUNTX0NPQkFMVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tCYXJyaWVyc19jb2JhbHQuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrQmFycmllcnNfY29iYWx0LmgKaW5kZXggMzM0NmRiZi4uYWNkZDYzMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tCYXJyaWVyc19jb2JhbHQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0JhcnJpZXJzX2NvYmFsdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX1BPUlRTX1NLQkFSUklFUlNfQ09CQUxUX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU0tJQV9TUkNfUE9SVFNfU0tCQVJSSUVSU19DT0JBTFRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udENvbmZpZ1BhcnNlcl9jb2JhbHQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRDb25maWdQYXJzZXJfY29iYWx0LmNjCmluZGV4IDE4OTlhM2MuLjg5ZDllNWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udENvbmZpZ1BhcnNlcl9jb2JhbHQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnUGFyc2VyX2NvYmFsdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udENvbmZpZ1BhcnNlcl9jb2JhbHQuaCIKIApAQCAtMjczLDkgKzI3MSwxMSBAQAogdm9pZCBGb250RWxlbWVudEhhbmRsZXIoRm9udEZpbGVJbmZvKiBmaWxlLCBjb25zdCBjaGFyKiogYXR0cmlidXRlcykgewogICBEQ0hFQ0soZmlsZSAhPSBOVUxMKTsKIAotICAvLyBBIDxmb250PiBzaG91bGQgaGF2ZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLSAgLy8gd2VpZ2h0IChpbnRlZ2VyKSwgc3R5bGUgKG5vcm1hbCwgaXRhbGljKSwgZm9udF9uYW1lIChzdHJpbmcpLCBhbmQKLSAgLy8gcG9zdHNjcmlwdF9uYW1lIChzdHJpbmcpLgorICAvLyBBIDxmb250PiBtdXN0IGhhdmUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6CisgIC8vIHdlaWdodCAobm9uLW5lZ2F0aXZlIGludGVnZXIpLCBzdHlsZSAobm9ybWFsLCBpdGFsaWMpLCBmb250X25hbWUgKHN0cmluZyksCisgIC8vIGFuZCBwb3N0c2NyaXB0X25hbWUgKHN0cmluZykuCisgIC8vIEl0IG1heSBoYXZlIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKKyAgLy8gaW5kZXggKG5vbi1uZWdhdGl2ZSBpbnRlZ2VyKQogICAvLyBUaGUgZWxlbWVudCBzaG91bGQgY29udGFpbiBhIGZpbGVuYW1lLgogCiAgIGVudW0gU2VlbkF0dHJpYnV0ZUZsYWdzIHsKQEAgLTMxOSw3ICszMTksMTIgQEAKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgNToKLSAgICAgICAgaWYgKHN0cm5jbXAoInN0eWxlIiwgbmFtZSwgNSkgPT0gMCkgeworICAgICAgICBpZiAoc3RybmNtcCgiaW5kZXgiLCBuYW1lLCA1KSA9PSAwKSB7CisgICAgICAgICAgaWYgKCFQYXJzZU5vbk5lZ2F0aXZlSW50ZWdlcih2YWx1ZSwgJmZpbGUtPmluZGV4KSkgeworICAgICAgICAgICAgRExPRyhXQVJOSU5HKSA8PCAiSW52YWxpZCBmb250IGluZGV4IFsiIDw8IHZhbHVlIDw8ICJdIjsKKyAgICAgICAgICAgIGZpbGUtPmluZGV4ID0gMDsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoc3RybmNtcCgic3R5bGUiLCBuYW1lLCA1KSA9PSAwKSB7CiAgICAgICAgICAgaWYgKHN0cm5jbXAoIml0YWxpYyIsIHZhbHVlLCA2KSA9PSAwKSB7CiAgICAgICAgICAgICBmaWxlLT5zdHlsZSA9IEZvbnRGaWxlSW5mbzo6a0l0YWxpY19Gb250U3R5bGU7CiAgICAgICAgICAgICBzZWVuX2F0dHJpYnV0ZXNfZmxhZyB8PSBrU2VlblN0eWxlOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnUGFyc2VyX2NvYmFsdC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnUGFyc2VyX2NvYmFsdC5oCmluZGV4IDc4ZjI3ODEwLi5kMmNiNmQ5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRDb25maWdQYXJzZXJfY29iYWx0LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnUGFyc2VyX2NvYmFsdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX1BPUlRTX1NLRk9OVENPTkZJR1BBUlNFUl9DT0JBTFRfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TS0lBX1NSQ19QT1JUU19TS0ZPTlRDT05GSUdQQVJTRVJfQ09CQUxUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfY29iYWx0LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2NvYmFsdC5jYwppbmRleCBmZWJkNWU2Li40NzU0NmVhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfY29iYWx0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9jb2JhbHQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfY29iYWx0LmgiCiAKQEAgLTExNSw3ICsxMTMsOCBAQAogICBMT0coSU5GTykgPDwgIkxvYWRpbmcgZm9udCBmaWxlOiAiIDw8IGZpbGVfcGF0aC5jX3N0cigpOwogICBTa0ZvbnRNZ3JDVmFsczo6R2V0SW5zdGFuY2UoKS0+SW5jcmVtZW50Rm9udEZpbGVzTG9hZGVkQ291bnQoKTsKIAotICBTa0F1dG9UVW5yZWY8U2tTdHJlYW0+IGZpbGVfc3RyZWFtKFNrU3RyZWFtOjpOZXdGcm9tRmlsZShmaWxlX3BhdGguY19zdHIoKSkpOworICBTa0F1dG9UVW5yZWY8U2tTdHJlYW1Bc3NldD4gZmlsZV9zdHJlYW0oCisgICAgICBTa1N0cmVhbTo6TmV3RnJvbUZpbGUoZmlsZV9wYXRoLmNfc3RyKCkpKTsKICAgaWYgKGZpbGVfc3RyZWFtID09IE5VTEwpIHsKICAgICBMT0coRVJST1IpIDw8ICJGYWlsZWQgdG8gb3BlbiBmb250IGZpbGU6ICIgPDwgZmlsZV9wYXRoLmNfc3RyKCk7CiAgICAgcmV0dXJuIE5VTEw7CkBAIC0xNjUsNyArMTY0LDcgQEAKIAogY2xhc3MgU2tUeXBlZmFjZV9Db2JhbHRTdHJlYW0gOiBwdWJsaWMgU2tUeXBlZmFjZV9Db2JhbHQgewogIHB1YmxpYzoKLSAgU2tUeXBlZmFjZV9Db2JhbHRTdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwgaW50IGluZGV4LCBTdHlsZSBzdHlsZSwKKyAgU2tUeXBlZmFjZV9Db2JhbHRTdHJlYW0oU2tTdHJlYW1Bc3NldCogc3RyZWFtLCBpbnQgaW5kZXgsIFN0eWxlIHN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2ZpeGVkX3BpdGNoLCBjb25zdCBTa1N0cmluZyBmYW1pbHlfbmFtZSkKICAgICAgIDogSU5IRVJJVEVEKGluZGV4LCBzdHlsZSwgaXNfZml4ZWRfcGl0Y2gsIGZhbWlseV9uYW1lKSwKICAgICAgICAgc3RyZWFtXyhTa1JlZihzdHJlYW0pKSB7CkBAIC0xODQsNyArMTgzLDcgQEAKICAgICAqc2VyaWFsaXplID0gdHJ1ZTsKICAgfQogCi0gIHZpcnR1YWwgU2tTdHJlYW0qIG9uT3BlblN0cmVhbShpbnQqIHR0Y19pbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgeworICB2aXJ0dWFsIFNrU3RyZWFtQXNzZXQqIG9uT3BlblN0cmVhbShpbnQqIHR0Y19pbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgewogICAgICp0dGNfaW5kZXggPSBpbmRleF87CiAgICAgcmV0dXJuIHN0cmVhbV8tPmR1cGxpY2F0ZSgpOwogICB9CkBAIC0xOTIsNyArMTkxLDcgQEAKICBwcml2YXRlOgogICB0eXBlZGVmIFNrVHlwZWZhY2VfQ29iYWx0IElOSEVSSVRFRDsKIAotICBTa0F1dG9UVW5yZWY8U2tTdHJlYW0+IHN0cmVhbV87CisgIFNrQXV0b1RVbnJlZjxTa1N0cmVhbUFzc2V0PiBzdHJlYW1fOwogfTsKIAogY2xhc3MgU2tUeXBlZmFjZV9Db2JhbHRTeXN0ZW0gOiBwdWJsaWMgU2tUeXBlZmFjZV9Db2JhbHQgewpAQCAtMjIzLDcgKzIyMiw3IEBACiAgICAgKnNlcmlhbGl6ZSA9IGZhbHNlOwogICB9CiAKLSAgdmlydHVhbCBTa1N0cmVhbSogb25PcGVuU3RyZWFtKGludCogdHRjX2luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CisgIHZpcnR1YWwgU2tTdHJlYW1Bc3NldCogb25PcGVuU3RyZWFtKGludCogdHRjX2luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnJlbmRlcmVyIiwgIlNrVHlwZWZhY2VfQ29iYWx0U3lzdGVtOjpvbk9wZW5TdHJlYW0oKSIpOwogICAgICp0dGNfaW5kZXggPSBpbmRleF87CiAKQEAgLTQ3OSw3ICs0NzgsNyBAQAogICAgICAgICBjb250aW51ZTsKICAgICAgIH0KIAotICAgICAgR2VuZXJhdGVDaGFyYWN0ZXJNYXBGcm9tRGF0YShmb250X2RhdGEpOworICAgICAgR2VuZXJhdGVDaGFyYWN0ZXJNYXBGcm9tRGF0YShmb250X2RhdGEsIGNsb3Nlc3Rfc3R5bGUtPnR0Y19pbmRleCk7CiAKICAgICAgIC8vIElmIHRoZSBjaGFyYWN0ZXIgaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgZm9udCBzdHlsZSBzZXQsIHRoZW4gZ28gYWhlYWQKICAgICAgIC8vIGFuZCBjcmVhdGUgdGhlIHR5cGVmYWNlIHdpdGggdGhlIGxvYWRlZCBmb250IGRhdGEuIE90aGVyd2lzZSwgY3JlYXRpbmcKQEAgLTUwNyw3ICs1MDYsOCBAQAogICAgICAgICAgICAgIGZvbnRfY2hhcmFjdGVyX21hcDo6R2V0UGFnZUNoYXJhY3RlckluZGV4KGNoYXJhY3RlcikpOwogfQogCi12b2lkIFNrRm9udFN0eWxlU2V0X0NvYmFsdDo6R2VuZXJhdGVDaGFyYWN0ZXJNYXBGcm9tRGF0YShTa0RhdGEqIGZvbnRfZGF0YSkgewordm9pZCBTa0ZvbnRTdHlsZVNldF9Db2JhbHQ6OkdlbmVyYXRlQ2hhcmFjdGVyTWFwRnJvbURhdGEoU2tEYXRhKiBmb250X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHRjX2luZGV4KSB7CiAgIGlmIChpc19jaGFyYWN0ZXJfbWFwX2dlbmVyYXRlZF8pIHsKICAgICByZXR1cm47CiAgIH0KQEAgLTUyMCw3ICs1MjAsNyBAQAogCiAgIEZUX0ZhY2UgZmFjZTsKICAgRlRfRXJyb3IgZXJyID0gRlRfTmV3X01lbW9yeV9GYWNlKGZyZWV0eXBlX2xpYiwgZm9udF9kYXRhLT5ieXRlcygpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9udF9kYXRhLT5zaXplKCksIDAsICZmYWNlKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvbnRfZGF0YS0+c2l6ZSgpLCB0dGNfaW5kZXgsICZmYWNlKTsKICAgaWYgKCFlcnIpIHsKICAgICAvLyBtYXAgb3V0IHRoaXMgZm9udCdzIGNoYXJhY3RlcnMuCiAgICAgRlRfVUludCBnbHlwaF9pbmRleDsKQEAgLTU4NCw3ICs1ODQsNyBAQAogICAvLyBmYWxsYmFjayBmb250ICh3aGljaCBtZWFucyB0aGF0IGl0J2xsIG5lZWQgdGhlIGNoYXJhY3RlciBtYXAgZm9yIGNoYXJhY3RlcgogICAvLyBsb29rdXBzIGR1cmluZyBmYWxsYmFjaykuCiAgIGlmIChpc19mYWxsYmFja19mb250XykgewotICAgIEdlbmVyYXRlQ2hhcmFjdGVyTWFwRnJvbURhdGEoZGF0YSk7CisgICAgR2VuZXJhdGVDaGFyYWN0ZXJNYXBGcm9tRGF0YShkYXRhLCBzdHlsZV9lbnRyeS0+dHRjX2luZGV4KTsKICAgfQogCiAgIC8vIFBhc3MgdGhlIFNrRGF0YSBpbnRvIHRoZSBTa01lbW9yeVN0cmVhbS4KQEAgLTgwMCwxMSArODAwLDExIEBACiAKIFNrVHlwZWZhY2UqIFNrRm9udE1ncl9Db2JhbHQ6Om9uQ3JlYXRlRnJvbURhdGEoU2tEYXRhKiBkYXRhLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHRjX2luZGV4KSBjb25zdCB7Ci0gIFNrQXV0b1RVbnJlZjxTa1N0cmVhbT4gc3RyZWFtKG5ldyBTa01lbW9yeVN0cmVhbShkYXRhKSk7CisgIFNrQXV0b1RVbnJlZjxTa1N0cmVhbUFzc2V0PiBzdHJlYW0obmV3IFNrTWVtb3J5U3RyZWFtKGRhdGEpKTsKICAgcmV0dXJuIGNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtLCB0dGNfaW5kZXgpOwogfQogCi1Ta1R5cGVmYWNlKiBTa0ZvbnRNZ3JfQ29iYWx0OjpvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwKK1NrVHlwZWZhY2UqIFNrRm9udE1ncl9Db2JhbHQ6Om9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbUFzc2V0KiBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR0Y19pbmRleCkgY29uc3QgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6cmVuZGVyZXIiLCAiU2tGb250TWdyX0NvYmFsdDo6b25DcmVhdGVGcm9tU3RyZWFtKCkiKTsKICAgYm9vbCBpc19maXhlZF9waXRjaDsKQEAgLTgyMSw3ICs4MjEsNyBAQAogU2tUeXBlZmFjZSogU2tGb250TWdyX0NvYmFsdDo6b25DcmVhdGVGcm9tRmlsZShjb25zdCBjaGFyIHBhdGhbXSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR0Y19pbmRleCkgY29uc3QgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6cmVuZGVyZXIiLCAiU2tGb250TWdyX0NvYmFsdDo6b25DcmVhdGVGcm9tRmlsZSgpIik7Ci0gIFNrQXV0b1RVbnJlZjxTa1N0cmVhbT4gc3RyZWFtKFNrU3RyZWFtOjpOZXdGcm9tRmlsZShwYXRoKSk7CisgIFNrQXV0b1RVbnJlZjxTa1N0cmVhbUFzc2V0PiBzdHJlYW0oU2tTdHJlYW06Ok5ld0Zyb21GaWxlKHBhdGgpKTsKICAgcmV0dXJuIHN0cmVhbS5nZXQoKSA/IGNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtLCB0dGNfaW5kZXgpIDogTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2NvYmFsdC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2NvYmFsdC5oCmluZGV4IGNjNzQ4ODEuLjhiMzc2YzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9jb2JhbHQuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfY29iYWx0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU0tJQV9TUkNfUE9SVFNfU0tGT05UTUdSX0NPQkFMVF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX1BPUlRTX1NLRk9OVE1HUl9DT0JBTFRfSF8KQEAgLTEwNCw3ICsxMDIsNyBAQAogCiAgIGJvb2wgQ29udGFpbnNDaGFyYWN0ZXIoY29uc3QgU2tGb250U3R5bGUmIHN0eWxlLCBTa1VuaWNoYXIgY2hhcmFjdGVyKTsKICAgYm9vbCBDaGFyYWN0ZXJNYXBDb250YWluc0NoYXJhY3RlcihTa1VuaWNoYXIgY2hhcmFjdGVyKTsKLSAgdm9pZCBHZW5lcmF0ZUNoYXJhY3Rlck1hcEZyb21EYXRhKFNrRGF0YSogZm9udF9kYXRhKTsKKyAgdm9pZCBHZW5lcmF0ZUNoYXJhY3Rlck1hcEZyb21EYXRhKFNrRGF0YSogZm9udF9kYXRhLCBpbnQgdHRjX2luZGV4KTsKIAogICBpbnQgR2V0Q2xvc2VzdFN0eWxlSW5kZXgoY29uc3QgU2tGb250U3R5bGUmIHBhdHRlcm4pOwogICB2b2lkIENyZWF0ZVN5c3RlbVR5cGVmYWNlKFNrRm9udFN0eWxlU2V0RW50cnlfQ29iYWx0KiBzdHlsZSk7CkBAIC0xOTAsNyArMTg4LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB0dGNfaW5kZXgpIGNvbnN0IFNLX09WRVJSSURFOwogCiAgIC8vIE5PVEU6IFRoaXMgcmV0dXJucyBOVUxMIGlmIHRoZSB0eXBlZmFjZSBjYW5ub3QgYmUgY3JlYXRlZC4KLSAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwKKyAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW1Bc3NldCogc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdHRjX2luZGV4KSBjb25zdCBTS19PVkVSUklERTsKIAogICAvLyBOT1RFOiBUaGlzIHJldHVybnMgTlVMTCBpZiB0aGUgdHlwZWZhY2UgY2Fubm90IGJlIGNyZWF0ZWQuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfY29iYWx0X2ZhY3RvcnkuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfY29iYWx0X2ZhY3RvcnkuY2MKaW5kZXggNDU2NmQwNS4uYWVhNjlkNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2NvYmFsdF9mYWN0b3J5LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9jb2JhbHRfZmFjdG9yeS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9jb2JhbHQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250VXRpbF9jb2JhbHQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRVdGlsX2NvYmFsdC5jYwppbmRleCA2OTY2NWQ3Li5lYTZlMDAwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRVdGlsX2NvYmFsdC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRVdGlsX2NvYmFsdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udFV0aWxfY29iYWx0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udFV0aWxfY29iYWx0LmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRVdGlsX2NvYmFsdC5oCmluZGV4IDgwMjg3YTQuLjZmM2EzZjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrRm9udFV0aWxfY29iYWx0LmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tGb250VXRpbF9jb2JhbHQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TS0lBX1NSQ19QT1JUU19TS0ZPTlRVVElMX0NPQkFMVF9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX1BPUlRTX1NLRk9OVFVUSUxfQ09CQUxUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta011dGV4X3N0YXJib2FyZC5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tNdXRleF9zdGFyYm9hcmQuaAppbmRleCAwNWMwMjM3Li4xN2VmYzVjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta011dGV4X3N0YXJib2FyZC5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrTXV0ZXhfc3RhcmJvYXJkLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU0tJQV9TUkNfUE9SVFNfU0tNVVRFWF9TVEFSQk9BUkRfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TS0lBX1NSQ19QT1JUU19TS01VVEVYX1NUQVJCT0FSRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tPU0ZpbGVfY29iYWx0LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvU2tPU0ZpbGVfY29iYWx0LmNjCmluZGV4IDFkYjExYjEuLjUxNzk0MzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL1NrT1NGaWxlX2NvYmFsdC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9Ta09TRmlsZV9jb2JhbHQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tPU0ZpbGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvYXRvbWljX3R5cGVfY29udmVyc2lvbnMuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NraWEvc3JjL3BvcnRzL2F0b21pY190eXBlX2NvbnZlcnNpb25zLmgKaW5kZXggNTFjZGNjNC4uMDk2NTY5NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc2tpYS9zcmMvcG9ydHMvYXRvbWljX3R5cGVfY29udmVyc2lvbnMuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9za2lhL3NyYy9wb3J0cy9hdG9taWNfdHlwZV9jb252ZXJzaW9ucy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NLSUFfU1JDX1BPUlRTX0FUT01JQ19UWVBFX0NPTlZFUlNJT05TX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU0tJQV9TUkNfUE9SVFNfQVRPTUlDX1RZUEVfQ09OVkVSU0lPTlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX2ltYWdlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfaW1hZ2UuY2MKaW5kZXggOWMwNWE4Ni4uNTBjN2ZlYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfaW1hZ2UuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfaW1hZ2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9pbWFnZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9pbWFnZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfaW1hZ2UuaAppbmRleCA2ZDEzMDNiLi4yNzMwZmI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9pbWFnZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX2ltYWdlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU09GVFdBUkVfSU1BR0VfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TT0ZUV0FSRV9JTUFHRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuY2MKaW5kZXggODg0ZGI5ZS4uZDVlZTE1MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yYXN0ZXJpemVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5oIgogCkBAIC0xMjEsNiArMTE5LDcgQEAKICAgICAgICAgY3JlYXRlX3NjcmF0Y2hfc3VyZmFjZV9mdW5jdGlvbiA9IGJhc2U6OkJpbmQoJkNyZWF0ZVNjcmF0Y2hTdXJmYWNlKTsKICAgICBSZW5kZXJUcmVlTm9kZVZpc2l0b3IgdmlzaXRvcigKICAgICAgICAgcmVuZGVyX3RhcmdldCwgJmNyZWF0ZV9zY3JhdGNoX3N1cmZhY2VfZnVuY3Rpb24sIGJhc2U6OkNsb3N1cmUoKSwKKyAgICAgICAgUmVuZGVyVHJlZU5vZGVWaXNpdG9yOjpSZW5kZXJJbWFnZUZhbGxiYWNrRnVuY3Rpb24oKSwKICAgICAgICAgc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8gPyAmc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZV8udmFsdWUoKSA6IE5VTEwsCiAgICAgICAgIHN1cmZhY2VfY2FjaGVfID8gJnN1cmZhY2VfY2FjaGVfLnZhbHVlKCkgOiBOVUxMKTsKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmFzdGVyaXplci5oCmluZGV4IDdlY2FmMDYuLmMwYzJhN2EgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU09GVFdBUkVfUkFTVEVSSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NPRlRXQVJFX1JBU1RFUklaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKaW5kZXggMjY0NTFkOS4uMmNhNTdhZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yZXNvdXJjZV9wcm92aWRlci5oIgogCkBAIC0xODEsNyArMTc5LDcgQEAKICAgU2tBdXRvVFVucmVmPFNrRGF0YT4gc2tpYV9kYXRhKFNrRGF0YTo6TmV3V2l0aENvcHkoCiAgICAgICBzYW5pdGl6ZWRfZGF0YS5nZXQoKSwgc3RhdGljX2Nhc3Q8c2l6ZV90PihzYW5pdGl6ZWRfZGF0YS5UZWxsKCkpKSk7CiAKLSAgU2tBdXRvVFVucmVmPFNrU3RyZWFtPiBzdHJlYW0obmV3IFNrTWVtb3J5U3RyZWFtKHNraWFfZGF0YSkpOworICBTa0F1dG9UVW5yZWY8U2tTdHJlYW1Bc3NldD4gc3RyZWFtKG5ldyBTa01lbW9yeVN0cmVhbShza2lhX2RhdGEpKTsKICAgU2tBdXRvVFVucmVmPFNrVHlwZWZhY2U+IHR5cGVmYWNlKFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtKSk7CiAgIGlmICh0eXBlZmFjZSkgewogICAgIHJldHVybiBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpUeXBlZmFjZT4obmV3IFNraWFUeXBlZmFjZSh0eXBlZmFjZSkpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3NvZnR3YXJlX3Jlc291cmNlX3Byb3ZpZGVyLmgKaW5kZXggMTQ4ZTliOC4uZTdlNGQ3OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc29mdHdhcmVfcmVzb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zb2Z0d2FyZV9yZXNvdXJjZV9wcm92aWRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1NPRlRXQVJFX1JFU09VUkNFX1BST1ZJREVSX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU09GVFdBUkVfUkVTT1VSQ0VfUFJPVklERVJfSF8KQEAgLTQ2LDIwICs0NCwyMiBAQAogICBzY29wZWRfcmVmcHRyPHJlbmRlcl90cmVlOjpJbWFnZT4gQ3JlYXRlSW1hZ2UoCiAgICAgICBzY29wZWRfcHRyPHJlbmRlcl90cmVlOjpJbWFnZURhdGE+IHBpeGVsX2RhdGEpIE9WRVJSSURFOwogCi0jaWYgZGVmaW5lZChTVEFSQk9BUkQpCi0jaWYgU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMyAmJiBTQl9IQVMoR1JBUEhJQ1MpCiAgIHNjb3BlZF9yZWZwdHI8cmVuZGVyX3RyZWU6OkltYWdlPiBDcmVhdGVJbWFnZUZyb21TYkRlY29kZVRhcmdldCgKICAgICAgIFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIE9WRVJSSURFIHsKICAgICBOT1RSRUFDSEVEKCk7CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICAgICBTYkRlY29kZVRhcmdldERlc3Ryb3koZGVjb2RlX3RhcmdldCk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKGRlY29kZV90YXJnZXQpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICAgIHJldHVybiBOVUxMOwogICB9CiAKICAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciogR2V0U2JEZWNvZGVUYXJnZXRQcm92aWRlcigpIE9WRVJSSURFIHsgcmV0dXJuIE5VTEw7IH0KIAogICBib29sIFN1cHBvcnRzU2JEZWNvZGVUYXJnZXQoKSBPVkVSUklERSB7IHJldHVybiBmYWxzZTsgfQotI2VuZGlmICAvLyBTQl9WRVJTSU9OKDMpICYmIFNCX0hBUyhHUkFQSElDUykKLSNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQogCiAgIHNjb3BlZF9wdHI8cmVuZGVyX3RyZWU6OlJhd0ltYWdlTWVtb3J5PiBBbGxvY2F0ZVJhd0ltYWdlTWVtb3J5KAogICAgICAgc2l6ZV90IHNpemVfaW5fYnl0ZXMsIHNpemVfdCBhbGlnbm1lbnQpIE9WRVJSSURFOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3N1cmZhY2VfY2FjaGVfZGVsZWdhdGUuY2MKaW5kZXggMzU0YTg5OS4uM2Y4ZmRmMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zdXJmYWNlX2NhY2hlX2RlbGVnYXRlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zdXJmYWNlX2NhY2hlX2RlbGVnYXRlLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS9zdXJmYWNlX2NhY2hlX2RlbGVnYXRlLmgKaW5kZXggN2QwYTA0NS4uN2I1MjI1OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvc3VyZmFjZV9jYWNoZV9kZWxlZ2F0ZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3N1cmZhY2VfY2FjaGVfZGVsZWdhdGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9TVVJGQUNFX0NBQ0hFX0RFTEVHQVRFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfU1VSRkFDRV9DQUNIRV9ERUxFR0FURV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdGV4dF9zaGFwZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS90ZXh0X3NoYXBlci5jYwppbmRleCBmYWIyNzgwLi44YTJlODZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS90ZXh0X3NoYXBlci5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS90ZXh0X3NoYXBlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3RleHRfc2hhcGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3RleHRfc2hhcGVyLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS90ZXh0X3NoYXBlci5oCmluZGV4IDhjMDJjMGIuLjBmMDBkZTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3RleHRfc2hhcGVyLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdGV4dF9zaGFwZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1JBU1RFUklaRVJfU0tJQV9URVhUX1NIQVBFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1RFWFRfU0hBUEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS90eXBlZmFjZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3R5cGVmYWNlLmNjCmluZGV4IGJiMWQ2NGUuLmIxMDA2ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3R5cGVmYWNlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3R5cGVmYWNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdHlwZWZhY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdHlwZWZhY2UuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9za2lhL3R5cGVmYWNlLmgKaW5kZXggNGU1ZmZhYy4uZWJmYjVhYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvdHlwZWZhY2UuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc2tpYS90eXBlZmFjZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TS0lBX1RZUEVGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NLSUFfVFlQRUZBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9zdHViL3Jhc3Rlcml6ZXIuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc3R1Yi9yYXN0ZXJpemVyLmNjCmluZGV4IDJjNDViNmMuLjRhMWJmNjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9zdHViL3Jhc3Rlcml6ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3N0dWIvcmFzdGVyaXplci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9zdHViL3Jhc3Rlcml6ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3N0dWIvcmFzdGVyaXplci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3N0dWIvcmFzdGVyaXplci5oCmluZGV4IGZmNjk1MjguLjc0MzM4ZmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9zdHViL3Jhc3Rlcml6ZXIuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvc3R1Yi9yYXN0ZXJpemVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SQVNURVJJWkVSX1NUVUJfUkFTVEVSSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfUkFTVEVSSVpFUl9TVFVCX1JBU1RFUklaRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyX3RyZWVfcGl4ZWxfdGVzdGVyLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJfdHJlZV9waXhlbF90ZXN0ZXIuY2MKaW5kZXggNzE3YWIwNi4uNjAxZTZhMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJfdHJlZV9waXhlbF90ZXN0ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJfdHJlZV9waXhlbF90ZXN0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3JlbmRlcl90cmVlX3BpeGVsX3Rlc3Rlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcl90cmVlX3BpeGVsX3Rlc3Rlci5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJfdHJlZV9waXhlbF90ZXN0ZXIuaAppbmRleCAyNzc1ZTM2Li5kMGRkNDJjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcl90cmVlX3BpeGVsX3Rlc3Rlci5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyX3RyZWVfcGl4ZWxfdGVzdGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9SRU5ERVJfVFJFRV9QSVhFTF9URVNURVJfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1JFTkRFUl9UUkVFX1BJWEVMX1RFU1RFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlci5neXAgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyLmd5cAppbmRleCBkNzYxOWQ1Li45YzUwZGE5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyLmd5cAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyLmd5cApAQCAtOTgsOCArOTgsOCBAQAogICAgICAgICAnc3VibWlzc2lvbl9xdWV1ZV90ZXN0LmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ3JlbmRlcl90cmVlX3BpeGVsX3Rlc3RlcicsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmNjCmluZGV4IDIzZWU3MGUuLjAzYTk2NGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmgKaW5kZXggOTYyMjZjYS4uNjVlZWFmZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfUkVOREVSRVJfTU9EVUxFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9SRU5ERVJFUl9NT0RVTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19zdGFyYm9hcmQuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfc3RhcmJvYXJkLmNjCmluZGV4IGMxOWNjMGIuLjJlMDlmNmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc19zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGVfZGVmYXVsdF9vcHRpb25zX3N0YXJib2FyZC5jYwpAQCAtMSwyNCArMSwyMyBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlLmgiCiAKICNpbmNsdWRlICJiYXNlL2RlYnVnL3RyYWNlX2V2ZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9oYXJkd2FyZV9yYXN0ZXJpemVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvYmxpdHRlci9zb2Z0d2FyZV9yYXN0ZXJpemVyLmgiCisjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Jhc3Rlcml6ZXIvZWdsL2hhcmR3YXJlX3Jhc3Rlcml6ZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvcmFzdGVyaXplci9lZ2wvc29mdHdhcmVfcmFzdGVyaXplci5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3NraWEvaGFyZHdhcmVfcmFzdGVyaXplci5oIgogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9yYXN0ZXJpemVyL3N0dWIvcmFzdGVyaXplci5oIgpAQCAtNDAsNiArMzksMTIgQEAKICAgcmV0dXJuIHNjb3BlZF9wdHI8cmFzdGVyaXplcjo6UmFzdGVyaXplcj4oCiAgICAgICBuZXcgcmFzdGVyaXplcjo6ZWdsOjpTb2Z0d2FyZVJhc3Rlcml6ZXIoCiAgICAgICAgICAgZ3JhcGhpY3NfY29udGV4dCwgb3B0aW9ucy5zdXJmYWNlX2NhY2hlX3NpemVfaW5fYnl0ZXMpKTsKKyNlbGlmIGRlZmluZWQoQ09CQUxUX0ZPUkNFX0NVU1RPTV9SQVNURVJJWkVSKQorICByZXR1cm4gc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPigKKyAgICAgIG5ldyByYXN0ZXJpemVyOjplZ2w6OkhhcmR3YXJlUmFzdGVyaXplcigKKyAgICAgICAgICBncmFwaGljc19jb250ZXh0LCBvcHRpb25zLnNraWFfY2FjaGVfc2l6ZV9pbl9ieXRlcywKKyAgICAgICAgICBvcHRpb25zLnNjcmF0Y2hfc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzLAorICAgICAgICAgIG9wdGlvbnMuc3VyZmFjZV9jYWNoZV9zaXplX2luX2J5dGVzKSk7CiAjZWxzZQogICByZXR1cm4gc2NvcGVkX3B0cjxyYXN0ZXJpemVyOjpSYXN0ZXJpemVyPigKICAgICAgIG5ldyByYXN0ZXJpemVyOjpza2lhOjpIYXJkd2FyZVJhc3Rlcml6ZXIoCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfd2luLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZW5kZXJlcl9tb2R1bGVfZGVmYXVsdF9vcHRpb25zX3dpbi5jYwppbmRleCBiOTZjNWYwLi41ODA5ZDJjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZV9kZWZhdWx0X29wdGlvbnNfd2luLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfbW9kdWxlX2RlZmF1bHRfb3B0aW9uc193aW4uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX21vZHVsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3JlbmRlcmVyX3BhcmFtZXRlcnNfc2V0dXAuZ3lwaSBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfcGFyYW1ldGVyc19zZXR1cC5neXBpCmluZGV4IGVkMDMxM2IuLjk5ZDBlMjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfcGFyYW1ldGVyc19zZXR1cC5neXBpCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVuZGVyZXJfcGFyYW1ldGVyc19zZXR1cC5neXBpCkBAIC0zMCw1ICszMCwxMCBAQAogICAgICAgICAnQ09CQUxUX0ZPUkNFX1NUVUJfUkFTVEVSSVpFUicsCiAgICAgICBdLAogICAgIH1dLAorICAgIFsncmFzdGVyaXplcl90eXBlID09ICJjdXN0b20iJywgeworICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICdDT0JBTFRfRk9SQ0VfQ1VTVE9NX1JBU1RFUklaRVInLAorICAgICAgXSwKKyAgICB9XSwKICAgXSwKIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVzb3VyY2VfcHJvdmlkZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvcmVzb3VyY2VfcHJvdmlkZXJfdGVzdC5jYwppbmRleCBlNTExMzU0Li41N2UxNzM1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Jlc291cmNlX3Byb3ZpZGVyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9yZXNvdXJjZV9wcm92aWRlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3NpbXBsZV90aHJlYWQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zYW5kYm94L3JlbmRlcmVyX3NhbmRib3hfbWFpbi5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvc2FuZGJveC9yZW5kZXJlcl9zYW5kYm94X21haW4uY2MKaW5kZXggNjBlNzJlNi4uZGZlMmQyZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zYW5kYm94L3JlbmRlcmVyX3NhbmRib3hfbWFpbi5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3NhbmRib3gvcmVuZGVyZXJfc2FuZGJveF9tYWluLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvc2FuZGJveC9zY2FsaW5nX3RleHRfc2FuZGJveF9tYWluLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9zYW5kYm94L3NjYWxpbmdfdGV4dF9zYW5kYm94X21haW4uY2MKaW5kZXggNzFkMmYwNC4uZWJkMDM2YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zYW5kYm94L3NjYWxpbmdfdGV4dF9zYW5kYm94X21haW4uY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9zYW5kYm94L3NjYWxpbmdfdGV4dF9zYW5kYm94X21haW4uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9kZWJ1Zy90cmFjZV9ldmVudC5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zbW9vdGhlZF92YWx1ZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvc21vb3RoZWRfdmFsdWUuY2MKaW5kZXggOTcwMmZmOC4uNjU5ZjZmMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zbW9vdGhlZF92YWx1ZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Ntb290aGVkX3ZhbHVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci9zbW9vdGhlZF92YWx1ZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Ntb290aGVkX3ZhbHVlLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Ntb290aGVkX3ZhbHVlLmgKaW5kZXggZTk1NmVhNy4uNmVkNTlkNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zbW9vdGhlZF92YWx1ZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvc21vb3RoZWRfdmFsdWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1NNT09USEVEX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9TTU9PVEhFRF9WQUxVRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zbW9vdGhlZF92YWx1ZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9zbW9vdGhlZF92YWx1ZV90ZXN0LmNjCmluZGV4IGI4MDFiZGUuLmY0NmZkZDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvc21vb3RoZWRfdmFsdWVfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Ntb290aGVkX3ZhbHVlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS90aW1lLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Ntb290aGVkX3ZhbHVlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3N1Ym1pc3Npb24uaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvc3VibWlzc2lvbi5oCmluZGV4IDI2NTJlMzUuLmY5Y2RkNzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvc3VibWlzc2lvbi5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvc3VibWlzc2lvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfU1VCTUlTU0lPTl9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfU1VCTUlTU0lPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zdWJtaXNzaW9uX3F1ZXVlLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9zdWJtaXNzaW9uX3F1ZXVlLmNjCmluZGV4IDAyNjFkM2YuLjIwYTFlMzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvc3VibWlzc2lvbl9xdWV1ZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3N1Ym1pc3Npb25fcXVldWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3N1Ym1pc3Npb25fcXVldWUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zdWJtaXNzaW9uX3F1ZXVlLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3N1Ym1pc3Npb25fcXVldWUuaAppbmRleCA4NGVlNzYyLi5mMzBhMGViIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3N1Ym1pc3Npb25fcXVldWUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3N1Ym1pc3Npb25fcXVldWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1NVQk1JU1NJT05fUVVFVUVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1NVQk1JU1NJT05fUVVFVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvc3VibWlzc2lvbl9xdWV1ZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9zdWJtaXNzaW9uX3F1ZXVlX3Rlc3QuY2MKaW5kZXggMmFkYmQ4OS4uYzNkN2EzZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci9zdWJtaXNzaW9uX3F1ZXVlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci9zdWJtaXNzaW9uX3F1ZXVlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS90aW1lLmgiCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcl90cmVlL2NvbXBvc2l0aW9uX25vZGUuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2RlY29kZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2RlY29kZS5jYwppbmRleCBiNjU2MThiLi5hYjY4ZDJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ19kZWNvZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZGVjb2RlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZGVjb2RlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2RlY29kZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZGVjb2RlLmgKaW5kZXggMWJiNzkzNy4uMmZlZjhmNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZGVjb2RlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZGVjb2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9URVNUX1BOR19VVElMU19QTkdfREVDT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9URVNUX1BOR19VVElMU19QTkdfREVDT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ19kZWNvZGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2RlY29kZV90ZXN0LmNjCmluZGV4IGI4NWY0NDYuLjI4MzNlYTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2RlY29kZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2RlY29kZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCiAjaW5jbHVkZSAiYmFzZS9wYXRoX3NlcnZpY2UuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2VuY29kZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2VuY29kZS5jYwppbmRleCAyOTNlZDQ0Li45MzRkZDNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ19lbmNvZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZW5jb2RlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZW5jb2RlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX2VuY29kZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZW5jb2RlLmgKaW5kZXggMDQ3YzdiOS4uMmE2ZWNlZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZW5jb2RlLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfZW5jb2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9URVNUX1BOR19VVElMU19QTkdfRU5DT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9URVNUX1BOR19VVElMU19QTkdfRU5DT0RFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ191dGlscy5neXAgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ191dGlscy5neXAKaW5kZXggOWQxOTAwOC4uNzE5YWI4NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfdXRpbHMuZ3lwCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX3V0aWxzLmd5cApAQCAtNDAsOCArNDAsOCBAQAogICAgICAgICAncG5nX2RlY29kZV90ZXN0LmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJ3BuZ191dGlscycsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ191dGlsc19iZW5jaG1hcmsuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3QvcG5nX3V0aWxzL3BuZ191dGlsc19iZW5jaG1hcmsuY2MKaW5kZXggYjZlYjk1Zi4uMDJhMTE5YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3BuZ191dGlscy9wbmdfdXRpbHNfYmVuY2htYXJrLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9wbmdfdXRpbHMvcG5nX3V0aWxzX2JlbmNobWFyay5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgogI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2FsbF9zY2VuZXNfY29tYmluZWRfc2NlbmUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2FsbF9zY2VuZXNfY29tYmluZWRfc2NlbmUuY2MKaW5kZXggMTMzYWE4OC4uNjgxYzQ5OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9hbGxfc2NlbmVzX2NvbWJpbmVkX3NjZW5lLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvYWxsX3NjZW5lc19jb21iaW5lZF9zY2VuZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvYWxsX3NjZW5lc19jb21iaW5lZF9zY2VuZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2FsbF9zY2VuZXNfY29tYmluZWRfc2NlbmUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvYWxsX3NjZW5lc19jb21iaW5lZF9zY2VuZS5oCmluZGV4IGU1YzFlZWMuLjQ2MGRhN2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvYWxsX3NjZW5lc19jb21iaW5lZF9zY2VuZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvYWxsX3NjZW5lc19jb21iaW5lZF9zY2VuZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfVEVTVF9TQ0VORVNfQUxMX1NDRU5FU19DT01CSU5FRF9TQ0VORV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfVEVTVF9TQ0VORVNfQUxMX1NDRU5FU19DT01CSU5FRF9TQ0VORV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9ncm93aW5nX3JlY3Rfc2NlbmUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2dyb3dpbmdfcmVjdF9zY2VuZS5jYwppbmRleCAxZjA2YTRiLi5kM2Q3NTFhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2dyb3dpbmdfcmVjdF9zY2VuZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2dyb3dpbmdfcmVjdF9zY2VuZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvZ3Jvd2luZ19yZWN0X3NjZW5lLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvZ3Jvd2luZ19yZWN0X3NjZW5lLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2dyb3dpbmdfcmVjdF9zY2VuZS5oCmluZGV4IDlmZmFiYmMuLmEwMTJkNWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvZ3Jvd2luZ19yZWN0X3NjZW5lLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9ncm93aW5nX3JlY3Rfc2NlbmUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1RFU1RfU0NFTkVTX0dST1dJTkdfUkVDVF9TQ0VORV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfVEVTVF9TQ0VORVNfR1JPV0lOR19SRUNUX1NDRU5FX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2ltYWdlX3dyYXBfc2NlbmUuY2MgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2ltYWdlX3dyYXBfc2NlbmUuY2MKaW5kZXggMWFkZDViNC4uNGNiYmFkYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9pbWFnZV93cmFwX3NjZW5lLmNjCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvaW1hZ2Vfd3JhcF9zY2VuZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvaW1hZ2Vfd3JhcF9zY2VuZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL2ltYWdlX3dyYXBfc2NlbmUuaCBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvaW1hZ2Vfd3JhcF9zY2VuZS5oCmluZGV4IDI3NzI2ZmYuLjA0NjQ5ZGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvaW1hZ2Vfd3JhcF9zY2VuZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvaW1hZ2Vfd3JhcF9zY2VuZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfUkVOREVSRVJfVEVTVF9TQ0VORVNfSU1BR0VfV1JBUF9TQ0VORV9IXwogI2RlZmluZSBDT0JBTFRfUkVOREVSRVJfVEVTVF9TQ0VORVNfSU1BR0VfV1JBUF9TQ0VORV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9tYXJxdWVlX3NjZW5lLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9tYXJxdWVlX3NjZW5lLmNjCmluZGV4IDNkNDQzODIuLjM1OTBhODcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvbWFycXVlZV9zY2VuZS5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL21hcnF1ZWVfc2NlbmUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL21hcnF1ZWVfc2NlbmUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9tYXJxdWVlX3NjZW5lLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL21hcnF1ZWVfc2NlbmUuaAppbmRleCA1YjIwNTVhLi43ODEwNzhjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL21hcnF1ZWVfc2NlbmUuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL21hcnF1ZWVfc2NlbmUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1RFU1RfU0NFTkVTX01BUlFVRUVfU0NFTkVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1RFU1RfU0NFTkVTX01BUlFVRUVfU0NFTkVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvc2NhbGluZ190ZXh0X3NjZW5lLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zY2FsaW5nX3RleHRfc2NlbmUuY2MKaW5kZXggOTUyYjAzYi4uOTNkODM3ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zY2FsaW5nX3RleHRfc2NlbmUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zY2FsaW5nX3RleHRfc2NlbmUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjYWxpbmdfdGV4dF9zY2VuZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjYWxpbmdfdGV4dF9zY2VuZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zY2FsaW5nX3RleHRfc2NlbmUuaAppbmRleCA0YjMyMjZkLi5lOTQ1YmQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjYWxpbmdfdGV4dF9zY2VuZS5oCisrKyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvc2NhbGluZ190ZXh0X3NjZW5lLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9URVNUX1NDRU5FU19TQ0FMSU5HX1RFWFRfU0NFTkVfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1RFU1RfU0NFTkVTX1NDQUxJTkdfVEVYVF9TQ0VORV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zY2VuZV9oZWxwZXJzLmNjIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zY2VuZV9oZWxwZXJzLmNjCmluZGV4IDM5YWE4ZDUuLjNjNDJjZmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvc2NlbmVfaGVscGVycy5jYworKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjZW5lX2hlbHBlcnMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjZW5lX2hlbHBlcnMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zY2VuZV9oZWxwZXJzLmggYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjZW5lX2hlbHBlcnMuaAppbmRleCA3Yzg0ZDQxLi5hZGFjMDc2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjZW5lX2hlbHBlcnMuaAorKysgYi9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NjZW5lX2hlbHBlcnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1JFTkRFUkVSX1RFU1RfU0NFTkVTX1NDRU5FX0hFTFBFUlNfSF8KICNkZWZpbmUgQ09CQUxUX1JFTkRFUkVSX1RFU1RfU0NFTkVTX1NDRU5FX0hFTFBFUlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvc3Bpbm5pbmdfc3ByaXRlc19zY2VuZS5jYyBiL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvc3Bpbm5pbmdfc3ByaXRlc19zY2VuZS5jYwppbmRleCBlNTRkNGIwLi4yNWE5NzY2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3JlbmRlcmVyL3Rlc3Qvc2NlbmVzL3NwaW5uaW5nX3Nwcml0ZXNfc2NlbmUuY2MKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zcGlubmluZ19zcHJpdGVzX3NjZW5lLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zcGlubmluZ19zcHJpdGVzX3NjZW5lLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvcmVuZGVyZXIvdGVzdC9zY2VuZXMvc3Bpbm5pbmdfc3ByaXRlc19zY2VuZS5oIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zcGlubmluZ19zcHJpdGVzX3NjZW5lLmgKaW5kZXggNTY1OTVhYi4uODBiOGZhNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zcGlubmluZ19zcHJpdGVzX3NjZW5lLmgKKysrIGIvc3JjL2NvYmFsdC9yZW5kZXJlci90ZXN0L3NjZW5lcy9zcGlubmluZ19zcHJpdGVzX3NjZW5lLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9SRU5ERVJFUl9URVNUX1NDRU5FU19TUElOTklOR19TUFJJVEVTX1NDRU5FX0hfCiAjZGVmaW5lIENPQkFMVF9SRU5ERVJFUl9URVNUX1NDRU5FU19TUElOTklOR19TUFJJVEVTX1NDRU5FX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NhbXBsZXMvc2FtcGxlcy5neXAgYi9zcmMvY29iYWx0L3NhbXBsZXMvc2FtcGxlcy5neXAKaW5kZXggZGYzNGQ3ZC4uMzRkMWFhOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zYW1wbGVzL3NhbXBsZXMuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc2FtcGxlcy9zYW1wbGVzLmd5cApAQCAtOTAsOCArOTAsOCBAQAogICAgICAgICAnc2ltcGxlX2V4YW1wbGVfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICdzaW1wbGVfZXhhbXBsZV9saWInLAogICAgICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZS5jYyBiL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZS5jYwppbmRleCAxZWY5M2QwLi5mYzQ3ZmI4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NhbXBsZXMvc2ltcGxlX2V4YW1wbGUuY2MKKysrIGIvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZS5oIGIvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlLmgKaW5kZXggZWUzNGI4Yy4uY2QxOTE4NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlLmgKKysrIGIvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQU1QTEVTX1NJTVBMRV9FWEFNUExFX0hfCiAjZGVmaW5lIENPQkFMVF9TQU1QTEVTX1NJTVBMRV9FWEFNUExFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NhbXBsZXMvc2ltcGxlX2V4YW1wbGVfbWFpbi5jYyBiL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZV9tYWluLmNjCmluZGV4IGJiM2VlMWEuLjc0MDVlNjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZV9tYWluLmNjCisrKyBiL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZV9tYWluLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2FtcGxlcy9zaW1wbGVfZXhhbXBsZV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlX3Rlc3QuY2MKaW5kZXggMTc5Njc5ZS4uYjFhZmEyZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9zYW1wbGVzL3NpbXBsZV9leGFtcGxlX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NhbXBsZXMvc2ltcGxlX2V4YW1wbGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvY2FsbF9mcmFtZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvY2FsbF9mcmFtZS5oCmluZGV4IDBmNTQ1MWMuLjE3Y2RkMjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2NhbGxfZnJhbWUuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9jYWxsX2ZyYW1lLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX0NBTExfRlJBTUVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9DQUxMX0ZSQU1FX0hfCiAKQEAgLTIyLDcgKzIwLDYgQEAKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY29wZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzY3JpcHQgewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaCBiL3NyYy9jb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2Z1bmN0aW9uLmgKaW5kZXggMmVjMmY0Ni4uYjVkMDYyYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oCkBAIC0yLDIxICsyLDE5IEBACiAvLyAgICAgcHVtcC5weSBjYWxsYmFja19mdW5jdGlvbi5oLnB1bXAKIC8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKIAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9DQUxMQkFDS19GVU5DVElPTl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX0NBTExCQUNLX0ZVTkNUSU9OX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oLnB1bXAgYi9zcmMvY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oLnB1bXAKaW5kZXggZDAzYzJhNy4uZDRkZThjZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvY2FsbGJhY2tfZnVuY3Rpb24uaC5wdW1wCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2Z1bmN0aW9uLmgucHVtcApAQCAtNywyMSArNywxOSBAQAogCiAkJCBUaGlzIHNob3VsZCBiZSBubyBsYXJnZXIgdGhhbiBNQVhfQVJJVFkgaW4gYmFzZS9iaW5kLmgucHVtcC4KICR2YXIgTUFYX0FSSVRZID0gNwotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgU0NSSVBUX0NBTExCQUNLX0ZVTkNUSU9OX0hfCiAjZGVmaW5lIFNDUklQVF9DQUxMQkFDS19GVU5DVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvY2FsbGJhY2tfaW50ZXJmYWNlX3RyYWl0cy5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvY2FsbGJhY2tfaW50ZXJmYWNlX3RyYWl0cy5oCmluZGV4IGZlODRkMjIuLmE3OWE5MmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2NhbGxiYWNrX2ludGVyZmFjZV90cmFpdHMuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9jYWxsYmFja19pbnRlcmZhY2VfdHJhaXRzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfQ0FMTEJBQ0tfSU5URVJGQUNFX1RSQUlUU19IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX0NBTExCQUNLX0lOVEVSRkFDRV9UUkFJVFNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L2Vudmlyb25tZW50X3NldHRpbmdzLmggYi9zcmMvY29iYWx0L3NjcmlwdC9lbnZpcm9ubWVudF9zZXR0aW5ncy5oCmluZGV4IDgxNDgyMTcuLjJkM2I3ZGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2Vudmlyb25tZW50X3NldHRpbmdzLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvZW52aXJvbm1lbnRfc2V0dGluZ3MuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfRU5WSVJPTk1FTlRfU0VUVElOR1NfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9FTlZJUk9OTUVOVF9TRVRUSU5HU19IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9leGNlcHRpb25fbWVzc2FnZS5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9tZXNzYWdlLmNjCmluZGV4IDVjZDFjMDIuLjI1YjliODcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9tZXNzYWdlLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9tZXNzYWdlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX21lc3NhZ2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX21lc3NhZ2UuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9tZXNzYWdlLmgKaW5kZXggMDM0OGRmNi4uY2Q5Y2U5ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX21lc3NhZ2UuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9leGNlcHRpb25fbWVzc2FnZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9FWENFUFRJT05fTUVTU0FHRV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX0VYQ0VQVElPTl9NRVNTQUdFX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L2V4Y2VwdGlvbl9zdGF0ZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgKaW5kZXggY2Q0ZTdmNy4uMTRlNDY1NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvZXhjZXB0aW9uX3N0YXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX0VYQ0VQVElPTl9TVEFURV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX0VYQ0VQVElPTl9TVEFURV9IXwogCkBAIC0yNiwxMCArMjQsMjAgQEAKIAogY2xhc3MgRXhjZXB0aW9uU3RhdGUgewogIHB1YmxpYzoKKyAgLy8gVHlwZSB3aXRoIGEgY29udmVyc2lvbiBjb25zdHJ1Y3RvciBmcm9tIE1lc3NhZ2VUeXBlIHRoYXQgY2FuIGJlIHVzZWQgYXMgdGhlCisgIC8vIGxhc3QgKG9ubHkpIHBhcmFtZXRlciBiZWZvcmUgdmFyYWRpYyBhcmd1bWVudHMgdG8gYXZvaWQgcHJvbW90aW5nIHRoZSBlbnVtCisgIC8vIHRvIGFuIGludCwgd2hpY2ggaXMgYW4gZXJyb3IgaW4gbmV3ZXIgY2xhbmcgYmVjYXVzZSBwYXNzaW5nIGFuIG9iamVjdCB0aGF0CisgIC8vIHVuZGVyZ29lcyBkZWZhdWx0IGFyZ3VtZW50IHByb21vdGlvbiB0byAndmFfc3RhcnQnIGhhcyB1bmRlZmluZWQgYmVoYXZpb3IuCisgIHN0cnVjdCBNZXNzYWdlVHlwZVZhciB7CisgICAgTWVzc2FnZVR5cGUgdmFsdWU7CisgICAgLy8gTk9MSU5UTkVYVExJTkUocnVudGltZS9leHBsaWNpdCkKKyAgICBNZXNzYWdlVHlwZVZhcihNZXNzYWdlVHlwZSB2YWx1ZSkgOiB2YWx1ZSh2YWx1ZSkge30KKyAgfTsKKwogICAvLyBJREwgZm9yIHRoaXMgb2JqZWN0IG11c3QgYmUgYW4gZXhjZXB0aW9uIGludGVyZmFjZS4KICAgdmlydHVhbCB2b2lkIFNldEV4Y2VwdGlvbigKICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8U2NyaXB0RXhjZXB0aW9uPiYgZXhjZXB0aW9uKSA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRTaW1wbGVFeGNlcHRpb24oTWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLCAuLi4pID0gMDsKKyAgdmlydHVhbCB2b2lkIFNldFNpbXBsZUV4Y2VwdGlvbihNZXNzYWdlVHlwZVZhciBtZXNzYWdlX3R5cGUsIC4uLikgPSAwOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvZXhlY3V0aW9uX3N0YXRlLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvZXhlY3V0aW9uX3N0YXRlLmNjCmluZGV4IDBkNTNjZjMuLjNmMDkxMTYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2V4ZWN1dGlvbl9zdGF0ZS5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9leGVjdXRpb25fc3RhdGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9leGVjdXRpb25fc3RhdGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvZXhlY3V0aW9uX3N0YXRlLmggYi9zcmMvY29iYWx0L3NjcmlwdC9leGVjdXRpb25fc3RhdGUuaAppbmRleCAyZjM5NGMzLi4wZTg1NDJiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9leGVjdXRpb25fc3RhdGUuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9leGVjdXRpb25fc3RhdGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfRVhFQ1VUSU9OX1NUQVRFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfRVhFQ1VUSU9OX1NUQVRFX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L2Zha2VfZ2xvYmFsX2Vudmlyb25tZW50LmggYi9zcmMvY29iYWx0L3NjcmlwdC9mYWtlX2dsb2JhbF9lbnZpcm9ubWVudC5oCmluZGV4IGYzYTVlYjAuLmJhOTAxODAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2Zha2VfZ2xvYmFsX2Vudmlyb25tZW50LmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvZmFrZV9nbG9iYWxfZW52aXJvbm1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9GQUtFX0dMT0JBTF9FTlZJUk9OTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX0ZBS0VfR0xPQkFMX0VOVklST05NRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9mYWtlX3NjcmlwdF9ydW5uZXIuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L2Zha2Vfc2NyaXB0X3J1bm5lci5oCmluZGV4IDJhOWFmMmIuLjllM2I3NjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2Zha2Vfc2NyaXB0X3J1bm5lci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L2Zha2Vfc2NyaXB0X3J1bm5lci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX0ZBS0VfU0NSSVBUX1JVTk5FUl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX0ZBS0VfU0NSSVBUX1JVTk5FUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvZ2xvYmFsX2Vudmlyb25tZW50LmggYi9zcmMvY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaAppbmRleCBhZjI3OWJhLi44NmViYjg3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9nbG9iYWxfZW52aXJvbm1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfR0xPQkFMX0VOVklST05NRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfR0xPQkFMX0VOVklST05NRU5UX0hfCiAKQEAgLTIyLDcgKzIwLDcgQEAKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc3RhY2tfZnJhbWUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvamF2YXNjcmlwdF9lbmdpbmUuaAppbmRleCBjZGE0ZjkxLi44MDdlMWU0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9qYXZhc2NyaXB0X2VuZ2luZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L2phdmFzY3JpcHRfZW5naW5lLmgKQEAgLTEsMjMgKzEsMjUgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX0pBVkFTQ1JJUFRfRU5HSU5FX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfSkFWQVNDUklQVF9FTkdJTkVfSF8KIAorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvY2FsbGJhY2suaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9zb3VyY2VfbG9jYXRpb24uaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugc2NyaXB0IHsKQEAgLTI2LDYgKzI4LDkgQEAKIAogY2xhc3MgSmF2YVNjcmlwdEVuZ2luZSB7CiAgcHVibGljOgorICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoY29uc3QgYmFzZTo6U291cmNlTG9jYXRpb24mIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGVycm9yX21lc3NhZ2UpPiBFcnJvckhhbmRsZXI7CisKICAgLy8gSW5pdGlhbGl6ZSBhIEphdmFTY3JpcHQgZW5naW5lLiBUaGUgSmF2YVNjcmlwdCBlbmdpbmUgc2hvdWxkIG9ubHkgYmUKICAgLy8gYWNjZXNzZWQgZnJvbSB0aGUgdGhyZWFkIHRoYXQgY2FsbGVkIENyZWF0ZUVuZ2luZS4KICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBkZWZpbmVkIHBlci1pbXBsZW1lbnRhdGlvbi4KQEAgLTQ2LDYgKzUxLDEwIEBACiAgIC8vIGFuZCB0aGUgcGFydCB0aGF0IGlzIG5vdCB5ZXQuCiAgIHZpcnR1YWwgc2l6ZV90IFVwZGF0ZU1lbW9yeVN0YXRzQW5kUmV0dXJuUmVzZXJ2ZWQoKSA9IDA7CiAKKyAgLy8gSW5zdGFsbHMgYW4gRXJyb3JIYW5kbGVyIGZvciBsaXN0ZW5pbmcgdG8gamF2YXNjcmlwdCBlcnJvcnMuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXJyb3IgaGFuZGxlciBjb3VsZCBiZSBpbnN0YWxsZWQuIEZhbHNlIG90aGVyd2lzZS4KKyAgdmlydHVhbCBib29sIFJlZ2lzdGVyRXJyb3JIYW5kbGVyKEVycm9ySGFuZGxlciBoYW5kbGVyKSA9IDA7CisKICBwcm90ZWN0ZWQ6CiAgIHZpcnR1YWwgfkphdmFTY3JpcHRFbmdpbmUoKSB7fQogICBmcmllbmQgY2xhc3Mgc2NvcGVkX3B0cjxKYXZhU2NyaXB0RW5naW5lPjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L2xvZ2dpbmdfZXhjZXB0aW9uX3N0YXRlLmggYi9zcmMvY29iYWx0L3NjcmlwdC9sb2dnaW5nX2V4Y2VwdGlvbl9zdGF0ZS5oCmluZGV4IGFiZTc5ZDcuLmMyNGFkNjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L2xvZ2dpbmdfZXhjZXB0aW9uX3N0YXRlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbG9nZ2luZ19leGNlcHRpb25fc3RhdGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTE9HR0lOR19FWENFUFRJT05fU1RBVEVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9MT0dHSU5HX0VYQ0VQVElPTl9TVEFURV9IXwogCkBAIC0zMiwxMiArMzAsMTMgQEAKICAgICBMb2dFeGNlcHRpb24oZXhjZXB0aW9uLT5uYW1lKCksIGV4Y2VwdGlvbi0+bWVzc2FnZSgpKTsKICAgfQogCi0gIHZvaWQgU2V0U2ltcGxlRXhjZXB0aW9uKE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwgLi4uKSBPVkVSUklERSB7CisgIHZvaWQgU2V0U2ltcGxlRXhjZXB0aW9uKE1lc3NhZ2VUeXBlVmFyIG1lc3NhZ2VfdHlwZSwgLi4uKSBPVkVSUklERSB7CiAgICAgdmFfbGlzdCBhcmd1bWVudHM7CiAgICAgdmFfc3RhcnQoYXJndW1lbnRzLCBtZXNzYWdlX3R5cGUpOwogICAgIExvZ0V4Y2VwdGlvbigKLSAgICAgICAgU2ltcGxlRXhjZXB0aW9uVG9TdHJpbmcoR2V0U2ltcGxlRXhjZXB0aW9uVHlwZShtZXNzYWdlX3R5cGUpKSwKLSAgICAgICAgYmFzZTo6U3RyaW5nUHJpbnRWKEdldEV4Y2VwdGlvbk1lc3NhZ2VGb3JtYXQobWVzc2FnZV90eXBlKSwgYXJndW1lbnRzKSk7CisgICAgICAgIFNpbXBsZUV4Y2VwdGlvblRvU3RyaW5nKEdldFNpbXBsZUV4Y2VwdGlvblR5cGUobWVzc2FnZV90eXBlLnZhbHVlKSksCisgICAgICAgIGJhc2U6OlN0cmluZ1ByaW50VihHZXRFeGNlcHRpb25NZXNzYWdlRm9ybWF0KG1lc3NhZ2VfdHlwZS52YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmd1bWVudHMpKTsKICAgICB2YV9lbmQoYXJndW1lbnRzKTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgKaW5kZXggMTE2MzBiNy4uNTA4NzQwNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9DQUxMQkFDS19GVU5DVElPTl9DT05WRVJTSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfQ0FMTEJBQ0tfRlVOQ1RJT05fQ09OVkVSU0lPTl9IXwpAQCAtMjIsNyArMjAsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbG9nZ2luZ19leGNlcHRpb25fc3RhdGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTMzLDcgKzMxLDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTaWduYXR1cmU+CiB2b2lkIFRvSlNWYWx1ZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgY29uc3QgU2NyaXB0T2JqZWN0PENhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+KiBjYWxsYmFja19mdW5jdGlvbiwKKyAgICBjb25zdCBTY3JpcHRWYWx1ZTxDYWxsYmFja0Z1bmN0aW9uPFNpZ25hdHVyZT4gPiogY2FsbGJhY2tfZnVuY3Rpb24sCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKICAgaWYgKCFjYWxsYmFja19mdW5jdGlvbikgewogICAgIG91dF92YWx1ZS5zZXQoSlM6Ok51bGxWYWx1ZSgpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5jYwppbmRleCBhMzI2YmM2Li4zMzMxNTA4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmNjCkBAIC0xLDIzICsxLDIzIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVyc2lvbl9oZWxwZXJzLmgiCiAKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKIAorI2luY2x1ZGUgIm5iL21lbW9yeV9zY29wZS5oIgorCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzY3JpcHQgewogbmFtZXNwYWNlIG1vempzIHsKQEAgLTI2LDYgKzI2LDcgQEAKIHZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCiAgICAgICAgICAgICAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzLCBFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlLAogICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogb3V0X3N0cmluZykgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgRENIRUNLX0VRKGNvbnZlcnNpb25fZmxhZ3MgJiB+a0NvbnZlcnNpb25GbGFnc1N0cmluZywgMCkKICAgICAgIDw8ICJVbmV4cGVjdGVkIGNvbnZlcnNpb24gZmxhZ3MgZm91bmQ6ICI7CiAKQEAgLTYyLDYgKzYzLDcgQEAKIHZvaWQgVG9KU1ZhbHVlKEpTQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgIGNvbnN0IE9wYXF1ZUhhbmRsZUhvbGRlciogb3BhcXVlX2hhbmRsZV9ob2xkZXIsCiAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgSlM6OlJvb3RlZE9iamVjdCBqc19vYmplY3QoY29udGV4dCk7CiAgIGlmIChvcGFxdWVfaGFuZGxlX2hvbGRlcikgewogICAgIC8vIERvd25jYXN0IHRvIE1vempzT2JqZWN0SGFuZGxlSG9sZGVyIHNvIHdlIGNhbiBnZXQgdGhlIEpTIG9iamVjdC4KQEAgLTc3LDYgKzc5LDcgQEAKIHZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCiAgICAgICAgICAgICAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzLCBFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlLAogICAgICAgICAgICAgICAgICBNb3pqc09iamVjdEhhbmRsZUhvbGRlciogb3V0X2hvbGRlcikgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgRENIRUNLX0VRKGNvbnZlcnNpb25fZmxhZ3MgJiB+a0NvbnZlcnNpb25GbGFnc09iamVjdCwgMCkKICAgICAgIDw8ICJVbmV4cGVjdGVkIGNvbnZlcnNpb24gZmxhZ3MgZm91bmQuIjsKICAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1dlYklETC8jZXMtb2JqZWN0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJzaW9uX2hlbHBlcnMuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oCmluZGV4IGM2ODc2ZDAuLmQwZjhkZjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnNpb25faGVscGVycy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X0NPTlZFUlNJT05fSEVMUEVSU19IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X0NPTlZFUlNJT05fSEVMUEVSU19IXwpAQCAtMjEsNiArMTksNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgorI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiYmFzZS9zdHJpbmdwcmludGYuaCIKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9lbmFibGVfaWYuaCIKQEAgLTMyLDkgKzMxLDE0IEBACiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS91bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdXRpbC9hbGdvcml0aG1faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaCIKKyNpbmNsdWRlICJuYi9tZW1vcnlfc2NvcGUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9wdWJsaWMvQ2hhcmFjdGVyRW5jb2RpbmcuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9wdWJsaWMvQ29udmVyc2lvbnMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcnJheS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2NudHh0LmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzc3RyLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL3Byb3h5L1Byb3h5LmgiCiAKQEAgLTcwLDYgKzc0LDcgQEAKIC8vIHN0ZDo6c3RyaW5nIC0+IEpTVmFsdWUKIGlubGluZSB2b2lkIFRvSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHN0ZDo6c3RyaW5nJiBpbl9zdHJpbmcsCiAgICAgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIERDSEVDSyhKUzo6Q3VycmVudEdsb2JhbE9yTnVsbChjb250ZXh0KSk7CiAgIHNpemVfdCBsZW5ndGggPSBpbl9zdHJpbmcubGVuZ3RoKCk7CiAgIGNoYXIxNl90KiBpbmZsYXRlZF9idWZmZXIgPQpAQCAtOTQsMTIgKzk5LDE0IEBACiAvLyBiYXNlOjpUb2tlbiAtPiBKU1ZhbHVlCiBpbmxpbmUgdm9pZCBUb0pTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBiYXNlOjpUb2tlbiYgdG9rZW4sCiAgICAgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIFRvSlNWYWx1ZShjb250ZXh0LCBzdGQ6OnN0cmluZyh0b2tlbi5jX3N0cigpKSwgb3V0X3ZhbHVlKTsKIH0KIAogLy8gYm9vbCAtPiBKU1ZhbHVlCiBpbmxpbmUgdm9pZCBUb0pTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBib29sIGluX2Jvb2xlYW4sCiAgICAgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIG91dF92YWx1ZS5zZXQoSlM6OkJvb2xlYW5WYWx1ZShpbl9ib29sZWFuKSk7CiB9CiAKQEAgLTEwNyw2ICsxMTQsNyBAQAogaW5saW5lIHZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVyc2lvbl9mbGFncywgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIG91dF9ib29sZWFuKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwogICBEQ0hFQ0tfRVEoY29udmVyc2lvbl9mbGFncywga05vQ29udmVyc2lvbkZsYWdzKQogICAgICAgPDwgIk5vIGNvbnZlcnNpb24gZmxhZ3Mgc3VwcG9ydGVkLiI7CiAgIERDSEVDSyhvdXRfYm9vbGVhbik7CkBAIC0xMjMsNiArMTMxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihUKSA8PSA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVD46OnR5cGUqID0gTlVMTCkgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgb3V0X3ZhbHVlLnNldEludDMyKGluX251bWJlcik7CiB9CiAKQEAgLTEzNiw2ICsxNDUsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFQpIDw9IDQpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUPjo6dHlwZSogPSBOVUxMKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwogICBEQ0hFQ0tfRVEoY29udmVyc2lvbl9mbGFncywga05vQ29udmVyc2lvbkZsYWdzKQogICAgICAgPDwgIk5vIGNvbnZlcnNpb24gZmxhZ3Mgc3VwcG9ydGVkLiI7CiAgIERDSEVDSyhvdXRfbnVtYmVyKTsKQEAgLTE1OSw2ICsxNjksNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFQpID4gNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlKiA9IE5VTEwpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIGRvdWJsZSB0b19udW1iZXI7CiAgIEpTOjpUb051bWJlcihjb250ZXh0LCB2YWx1ZSwgJnRvX251bWJlcik7CiAKQEAgLTE4Nyw2ICsxOTgsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFQpID4gNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlKiA9IE5VTEwpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIG91dF92YWx1ZS5zZXQoSlNfTnVtYmVyVmFsdWUoaW5fbnVtYmVyKSk7CiB9CiAKQEAgLTE5OSw2ICsyMTEsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NpZ25lZCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHNpemVvZihUKSA8PSA0KSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVD46OnR5cGUqID0gTlVMTCkgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgLy8gTXVzdCBkbyBzdGF0aWMgY2FzdCBpbiB0aGUgKHZhbGlkKSBjYXNlIHdoZXJlIHdlIGdldCBhIHVpbnQ4X3Qgb3IKICAgLy8gdWludDE2X3QgYW5kIGNhbGwgdG8gfHNldE51bWJlcih7dWludDMyX3QsIGRvdWJsZX0pfCBiZWNvbWVzIGFtYmlndW91cy4KICAgb3V0X3ZhbHVlLnNldE51bWJlcihzdGF0aWNfY2FzdDx1aW50MzJfdD4oaW5fbnVtYmVyKSk7CkBAIC0yMTQsNiArMjI3LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zaWduZWQgJiYKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplb2YoVCkgPD0gNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlKiA9IE5VTEwpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIERDSEVDS19FUShjb252ZXJzaW9uX2ZsYWdzLCBrTm9Db252ZXJzaW9uRmxhZ3MpCiAgICAgICA8PCAiTm8gY29udmVyc2lvbiBmbGFncyBzdXBwb3J0ZWQuIjsKICAgRENIRUNLKG91dF9udW1iZXIpOwpAQCAtMjM3LDYgKzI1MSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFQpID4gNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlKiA9IE5VTEwpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIERDSEVDS19FUShjb252ZXJzaW9uX2ZsYWdzLCBrTm9Db252ZXJzaW9uRmxhZ3MpCiAgICAgICA8PCAiTm8gY29udmVyc2lvbiBmbGFncyBzdXBwb3J0ZWQuIjsKICAgRENIRUNLKG91dF9udW1iZXIpOwpAQCAtMjYxLDYgKzI3Niw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfc2lnbmVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKFQpID4gNCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlKiA9IE5VTEwpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIG91dF92YWx1ZS5zZXQoSlNfTnVtYmVyVmFsdWUoaW5fbnVtYmVyKSk7CiB9CiAKQEAgLTI3MSw2ICsyODcsNyBAQAogICAgIHR5cGVuYW1lIGJhc2U6OmVuYWJsZV9pZjxzdGQ6Om51bWVyaWNfbGltaXRzPFQ+Ojppc19zcGVjaWFsaXplZCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIXN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX2ludGVnZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQ+Ojp0eXBlKiA9IE5VTEwpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIG91dF92YWx1ZS5zZXREb3VibGUoaW5fbnVtYmVyKTsKIH0KIApAQCAtMjgyLDYgKzI5OSw3IEBACiAgICAgdHlwZW5hbWUgYmFzZTo6ZW5hYmxlX2lmPHN0ZDo6bnVtZXJpY19saW1pdHM8VD46OmlzX3NwZWNpYWxpemVkICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhc3RkOjpudW1lcmljX2xpbWl0czxUPjo6aXNfaW50ZWdlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVD46OnR5cGUqID0gTlVMTCkgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgRENIRUNLX0VRKGNvbnZlcnNpb25fZmxhZ3MgJiB+a0NvbnZlcnNpb25GbGFnc051bWVyaWMsIDApCiAgICAgICA8PCAiVW5leHBlY3RlZCBjb252ZXJzaW9uIGZsYWdzIGZvdW5kLiI7CiAgIERDSEVDSyhvdXRfbnVtYmVyKTsKQEAgLTMwNCw2ICszMjIsNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiBpbmxpbmUgdm9pZCBUb0pTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBiYXNlOjpvcHRpb25hbDxUPiYgaW5fb3B0aW9uYWwsCiAgICAgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIGlmICghaW5fb3B0aW9uYWwpIHsKICAgICBvdXRfdmFsdWUuc2V0TnVsbCgpOwogICAgIHJldHVybjsKQEAgLTMxNiw2ICszMzUsNyBAQAogaW5saW5lIHZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVyc2lvbl9mbGFncywgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Om9wdGlvbmFsPFQ+KiBvdXRfb3B0aW9uYWwpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIGlmICh2YWx1ZS5pc051bGwoKSkgewogICAgICpvdXRfb3B0aW9uYWwgPSBiYXNlOjpudWxsb3B0OwogICB9IGVsc2UgaWYgKHZhbHVlLmlzVW5kZWZpbmVkKCkpIHsKQEAgLTMzMiw2ICszNTIsNyBAQAogaW5saW5lIHZvaWQgRnJvbUpTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgY29udmVyc2lvbl9mbGFncywgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6Om9wdGlvbmFsPHN0ZDo6c3RyaW5nPiogb3V0X29wdGlvbmFsKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwogICBpZiAodmFsdWUuaXNOdWxsKCkpIHsKICAgICAqb3V0X29wdGlvbmFsID0gYmFzZTo6bnVsbG9wdDsKICAgfSBlbHNlIGlmICh2YWx1ZS5pc1VuZGVmaW5lZCgpICYmCkBAIC0zNjAsNiArMzgxLDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogaW5saW5lIHZvaWQgVG9KU1ZhbHVlKEpTQ29udGV4dCogY29udGV4dCwgY29uc3Qgc2NvcGVkX3JlZnB0cjxUPiYgaW5fb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwogICBpZiAoIWluX29iamVjdCkgewogICAgIG91dF92YWx1ZS5zZXROdWxsKCk7CiAgICAgcmV0dXJuOwpAQCAtMzg0LDYgKzQwNiw3IEBACiBpbmxpbmUgdm9pZCBGcm9tSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjb252ZXJzaW9uX2ZsYWdzLCBFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlLAogICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVkX3JlZnB0cjxUPiogb3V0X29iamVjdCkgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgRENIRUNLX0VRKGNvbnZlcnNpb25fZmxhZ3MgJiB+a0NvbnZlcnNpb25GbGFnc09iamVjdCwgMCkKICAgICAgIDw8ICJVbmV4cGVjdGVkIGNvbnZlcnNpb24gZmxhZ3MgZm91bmQuIjsKICAgSlM6OlJvb3RlZE9iamVjdCBqc19vYmplY3QoY29udGV4dCk7CkBAIC00MjUsOCArNDQ4LDkgQEAKIC8vIENhbGxiYWNrSW50ZXJmYWNlIC0+IEpTVmFsdWUKIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogaW5saW5lIHZvaWQgVG9KU1ZhbHVlKEpTQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY3JpcHRPYmplY3Q8VD4qIGNhbGxiYWNrX2ludGVyZmFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTY3JpcHRWYWx1ZTxUPiogY2FsbGJhY2tfaW50ZXJmYWNlLAogICAgICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwogICBpZiAoIWNhbGxiYWNrX2ludGVyZmFjZSkgewogICAgIG91dF92YWx1ZS5zZXQoSlM6Ok51bGxWYWx1ZSgpKTsKICAgICByZXR1cm47CkBAIC00NDYsNyArNDcwLDcgQEAKICAgLy8gY2FuIGdldCB0aGUgaW1wbGVtZW50aW5nIG9iamVjdC4KICAgY29uc3QgTW96anNDYWxsYmFja0ludGVyZmFjZUNsYXNzKiBtb3pqc19jYWxsYmFja19pbnRlcmZhY2UgPQogICAgICAgYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8Y29uc3QgTW96anNDYWxsYmFja0ludGVyZmFjZUNsYXNzKj4oCi0gICAgICAgICAgdXNlcl9vYmplY3RfaG9sZGVyLT5HZXRTY3JpcHRPYmplY3QoKSk7CisgICAgICAgICAgdXNlcl9vYmplY3RfaG9sZGVyLT5HZXRTY3JpcHRWYWx1ZSgpKTsKICAgRENIRUNLKG1vempzX2NhbGxiYWNrX2ludGVyZmFjZSk7CiAgIG91dF92YWx1ZS5zZXRPYmplY3RPck51bGwobW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLT5oYW5kbGUoKSk7CiB9CkBAIC00NTcsNiArNDgxLDcgQEAKICAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSwgaW50IGNvbnZlcnNpb25fZmxhZ3MsCiAgICAgRXhjZXB0aW9uU3RhdGUqIG91dF9leGNlcHRpb24sCiAgICAgTW96anNDYWxsYmFja0ludGVyZmFjZUhvbGRlcjxUPiogb3V0X2NhbGxiYWNrX2ludGVyZmFjZSkgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgdHlwZWRlZiBUIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VDbGFzczsKICAgRENIRUNLX0VRKGNvbnZlcnNpb25fZmxhZ3MgJiB+a0NvbnZlcnNpb25GbGFnc0NhbGxiYWNrRnVuY3Rpb24sIDApCiAgICAgICA8PCAiTm8gY29udmVyc2lvbiBmbGFncyBzdXBwb3J0ZWQuIjsKQEAgLTQ4Niw2ICs1MTEsMTEyIEBACiAgICAgICBpbXBsZW1lbnRpbmdfb2JqZWN0LCBjb250ZXh0LCBnbG9iYWxfZW52aXJvbm1lbnQtPndyYXBwZXJfZmFjdG9yeSgpKTsKIH0KIAordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIFRvSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IHNjcmlwdDo6U2VxdWVuY2U8VD4mIHNlcXVlbmNlLAorICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CisgIC8vIDEuIExldCBuIGJlIHRoZSBsZW5ndGggb2YgUy4KKyAgdHlwZWRlZiB0eXBlbmFtZSBzY3JpcHQ6OlNlcXVlbmNlPFQ+OjpzaXplX3R5cGUgc2l6ZV90eXBlOworICBzaXplX3R5cGUgY291bnQgPSBzZXF1ZW5jZS5zaXplKCk7CisKKyAgLy8gMi4gTGV0IEEgYmUgYSBuZXcgQXJyYXkgb2JqZWN0IGNyZWF0ZWQgYXMgaWYgYnkgdGhlIGV4cHJlc3Npb24gW10uCisgIEpTOjpSb290ZWRPYmplY3QgYXJyYXkoY29udGV4dCwganM6Ok5ld0RlbnNlRW1wdHlBcnJheShjb250ZXh0KSk7CisKKyAgLy8gMy4gSW5pdGlhbGl6ZSBpIHRvIGJlIDAuCisgIC8vIDQuIFdoaWxlIGkgPCBuOgorICBmb3IgKHNpemVfdHlwZSBpbmRleCA9IDA7IGluZGV4IDwgY291bnQ7ICsraW5kZXgpIHsKKyAgICAvLyA0LjEuIExldCBWIGJlIHRoZSB2YWx1ZSBpbiBTIGF0IGluZGV4IGkuCisgICAgLy8gNC4yLiBMZXQgRSBiZSB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgViB0byBhbiBFQ01BU2NyaXB0IHZhbHVlLgorICAgIEpTOjpSb290ZWRWYWx1ZSBlbGVtZW50KGNvbnRleHQpOworICAgIFRvSlNWYWx1ZShjb250ZXh0LCBzZXF1ZW5jZS5hdChpbmRleCksICZlbGVtZW50KTsKKworICAgIHN0ZDo6c3RyaW5nIHByb3BlcnR5ID0KKyAgICAgICAgYmFzZTo6U3RyaW5nUHJpbnRmKCIlIiBQUkl1NjQsIHN0YXRpY19jYXN0PHVpbnQ2NF90PihpbmRleCkpOworCisgICAgLy8gNC4zLiBMZXQgUCBiZSB0aGUgcmVzdWx0IG9mIGNhbGxpbmcgVG9TdHJpbmcoaSkuCisgICAgLy8gNC40LiBDYWxsIENyZWF0ZURhdGFQcm9wZXJ0eShBLCBQLCBFKS4KKyAgICBKU19TZXRQcm9wZXJ0eShjb250ZXh0LCBhcnJheSwgcHJvcGVydHkuY19zdHIoKSwgZWxlbWVudCk7CisKKyAgICAvLyA0LjUuIFNldCBpIHRvIGkgKyAxLgorICB9CisKKyAgLy8gNS4gUmV0dXJuIEEuCisgIG91dF92YWx1ZS5zZXRPYmplY3QoKmFycmF5KTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+Cit2b2lkIEZyb21KU1ZhbHVlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIHZhbHVlLAorICAgICAgICAgICAgICAgICBpbnQgY29udmVyc2lvbl9mbGFncywgRXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgc2NyaXB0OjpTZXF1ZW5jZTxUPiogb3V0X3NlcXVlbmNlKSB7CisgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOworICBEQ0hFQ0tfRVEoMCwgY29udmVyc2lvbl9mbGFncyk7CisgIERDSEVDSyhvdXRfc2VxdWVuY2UpOworCisgIC8vIEpTIC0+IElETCB0eXBlIGNvbnZlcnNpb24gcHJvY2VkdXJlIGRlc2NyaWJlZCBoZXJlOgorICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNlcy1zZXF1ZW5jZQorCisgIC8vIDEuIElmIFR5cGUoVikgaXMgbm90IE9iamVjdCwgdGhyb3cgYSBUeXBlRXJyb3IuCisgIEpTOjpSb290ZWRPYmplY3QgaXRlcmFibGUoY29udGV4dCk7CisgIGlmICghdmFsdWUuaXNPYmplY3QoKSB8fAorICAgICAgIUpTX1ZhbHVlVG9PYmplY3QoY29udGV4dCwgdmFsdWUsICZpdGVyYWJsZSkpIHsKKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrTm90T2JqZWN0VHlwZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gMi4gTGV0IG1ldGhvZCBiZSB0aGUgcmVzdWx0IG9mIEdldE1ldGhvZChWLCBAQGl0ZXJhdG9yKS4KKyAgLy8gMy4gUmV0dXJuSWZBYnJ1cHQobWV0aG9kKS4KKyAgLy8gNC4gSWYgbWV0aG9kIGlzIHVuZGVmaW5lZCwgdGhyb3cgYSBUeXBlRXJyb3IuCisgIC8vIDUuIFJldHVybiB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgc2VxdWVuY2UgZnJvbSBWIGFuZCBtZXRob2QuCisgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2NyZWF0ZS1zZXF1ZW5jZS1mcm9tLWl0ZXJhYmxlCisgIC8vIDUuMS4gTGV0IGl0ZXIgYmUgR2V0SXRlcmF0b3IoaXRlcmFibGUsIG1ldGhvZCkuCisgIEpTOjpSb290ZWRPYmplY3QgaXRlcihjb250ZXh0KTsKKyAgaWYgKCF1dGlsOjpHZXRJdGVyYXRvcihjb250ZXh0LCBpdGVyYWJsZSwgJml0ZXIpKSB7CisgICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa05vdEl0ZXJhYmxlVHlwZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgLy8gNS4yLiBSZXR1cm5JZkFicnVwdChpdGVyKS4KKyAgLy8gNS4zLiBJbml0aWFsaXplIGkgdG8gYmUgMC4KKyAgLy8gNS40LiBSZXBlYXQKKyAgd2hpbGUgKHRydWUpIHsKKyAgICAvLyA1LjQuMS4gTGV0IG5leHQgYmUgSXRlcmF0b3JTdGVwKGl0ZXIpLgorICAgIC8vIDUuNC4yLiBSZXR1cm5JZkFicnVwdChuZXh0KS4KKyAgICAvLyA1LjQuMy4gSWYgbmV4dCBpcyBmYWxzZSwgdGhlbiByZXR1cm4gYW4gSURMIHNlcXVlbmNlIHZhbHVlIG9mIHR5cGUKKyAgICAvLyAgICAgICAgc2VxdWVuY2U8VD4gb2YgbGVuZ3RoIGksIHdoZXJlIHRoZSB2YWx1ZSBvZiB0aGUgZWxlbWVudCBhdCBpbmRleCBqCisgICAgLy8gICAgICAgIGlzIFNqLgorICAgIEpTOjpSb290ZWRPYmplY3QgbmV4dChjb250ZXh0KTsKKyAgICBpZiAoIXV0aWw6Okl0ZXJhdG9yU3RlcChjb250ZXh0LCBpdGVyLCAmbmV4dCkpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKworICAgIC8vIDUuNC40LiBMZXQgbmV4dEl0ZW0gYmUgSXRlcmF0b3JWYWx1ZShuZXh0KS4KKyAgICAvLyA1LjQuNS4gUmV0dXJuSWZBYnJ1cHQobmV4dEl0ZW0pLgorICAgIEpTOjpSb290ZWRWYWx1ZSBuZXh0X2l0ZW0oY29udGV4dCk7CisgICAgaWYgKCF1dGlsOjpJdGVyYXRvclZhbHVlKGNvbnRleHQsIG5leHQsICZuZXh0X2l0ZW0pKSB7CisgICAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrRG9lc05vdEltcGxlbWVudEludGVyZmFjZSk7CisgICAgICB1dGlsOjpJdGVyYXRvckNsb3NlKGNvbnRleHQsIGl0ZXIpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIDUuNC42LiBJbml0aWFsaXplIFNpIHRvIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBuZXh0SXRlbSB0byBhbiBJREwgdmFsdWUKKyAgICAvLyAgICAgICAgb2YgdHlwZSBULgorICAgIFQgaWRsX25leHRfaXRlbTsKKyAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCBuZXh0X2l0ZW0sIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAmaWRsX25leHRfaXRlbSk7CisgICAgaWYgKGNvbnRleHQtPmlzRXhjZXB0aW9uUGVuZGluZygpKSB7CisgICAgICAvLyBFeGNlcHRpb24gY29udmVydGluZyBlbGVtZW50IGludG8gdG8gc2VxdWVuY2UgZWxlbWVudCB0eXBlLgorICAgICAgdXRpbDo6SXRlcmF0b3JDbG9zZShjb250ZXh0LCBpdGVyKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgb3V0X3NlcXVlbmNlLT5wdXNoX2JhY2soaWRsX25leHRfaXRlbSk7CisKKyAgICAvLyA1LjQuNy4gU2V0IGkgdG8gaSArIDEuCisgIH0KKworICB1dGlsOjpJdGVyYXRvckNsb3NlKGNvbnRleHQsIGl0ZXIpOworICByZXR1cm47Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAogfSAgLy8gbmFtZXNwYWNlIGNvYmFsdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVydF9jYWxsYmFja19yZXR1cm5fdmFsdWUuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2NvbnZlcnRfY2FsbGJhY2tfcmV0dXJuX3ZhbHVlLmgKaW5kZXggZDFjYmEwZS4uNTk4YTU2YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvY29udmVydF9jYWxsYmFja19yZXR1cm5fdmFsdWUuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9jb252ZXJ0X2NhbGxiYWNrX3JldHVybl92YWx1ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X0NPTlZFUlRfQ0FMTEJBQ0tfUkVUVVJOX1ZBTFVFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfQ09OVkVSVF9DQUxMQkFDS19SRVRVUk5fVkFMVUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2ludGVyZmFjZV9kYXRhLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9pbnRlcmZhY2VfZGF0YS5oCmluZGV4IDFmOGFjNjAuLjQzZmM5MjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L2ludGVyZmFjZV9kYXRhLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvaW50ZXJmYWNlX2RhdGEuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9JTlRFUkZBQ0VfREFUQV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X0lOVEVSRkFDRV9EQVRBX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy00NS5neXAgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy00NS5neXAKaW5kZXggMGViMmUyNC4uNTJmMDg1YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMtNDUuZ3lwCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzLTQ1Lmd5cApAQCAtMjksNiArMjksNyBAQAogICAgICAgICAnb3BhcXVlX3Jvb3RfdHJhY2tlci5jYycsCiAgICAgICAgICdwcm94eV9oYW5kbGVyLmNjJywKICAgICAgICAgJ3JlZmVyZW5jZWRfb2JqZWN0X21hcC5jYycsCisgICAgICAgICd1dGlsL2FsZ29yaXRobV9oZWxwZXJzLmNjJywKICAgICAgICAgJ3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuY2MnLAogICAgICAgICAnd2Vha19oZWFwX29iamVjdC5jYycsCiAgICAgICAgICd3ZWFrX2hlYXBfb2JqZWN0LmgnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMtNDVfdmFyaWFibGVzLmd5cGkgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy00NV92YXJpYWJsZXMuZ3lwaQppbmRleCBiMzA5YWM4Li42N2I3NzFjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy00NV92YXJpYWJsZXMuZ3lwaQorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy00NV92YXJpYWJsZXMuZ3lwaQpAQCAtMTYsNyArMTYsNyBAQAogICAndmFyaWFibGVzJzogewogICAgICdjb25kaXRpb25zJzogWwogICAgICAgWydqYXZhc2NyaXB0X2VuZ2luZSA9PSAibW96anMtNDUiJywgewotICAgICAgICAnZ2VuZXJhdGVkX2JpbmRpbmdzX3ByZWZpeCc6ICdNb3pqcycsCisgICAgICAgICdnZW5lcmF0ZWRfYmluZGluZ3NfcHJlZml4JzogJ21vempzJywKICAgICAgICAgJ2VuZ2luZV9pbmNsdWRlX2RpcnMnOiBbXSwKICAgICAgICAgJ2VuZ2luZV9kZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L21vempzLTQ1L21vempzLTQ1Lmd5cDptb3pqcy00NV9saWInLApAQCAtMjgsNiArMjgsNyBAQAogICAgICAgICAnZW5naW5lX3RlbXBsYXRlX2ZpbGVzJzogWwogICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS5jYy50ZW1wbGF0ZScsCiAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy00NS90ZW1wbGF0ZXMvY2FsbGJhY2staW50ZXJmYWNlLmgudGVtcGxhdGUnLAorICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2RpY3Rpb25hcnktY29udmVyc2lvbi5oLnRlbXBsYXRlJywKICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L2JpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9pbnRlcmZhY2UuY2MudGVtcGxhdGUnLAogICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmluZGluZ3MvbW96anMtNDUvdGVtcGxhdGVzL2ludGVyZmFjZS5oLnRlbXBsYXRlJywKICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L2JpbmRpbmdzL21vempzLTQ1L3RlbXBsYXRlcy9tYWNyb3MuY2MudGVtcGxhdGUnLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anMuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy5jYwppbmRleCAzMTg2MWQzLi5lZWZhOWZlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgKaW5kZXggZDlmNjhmNi4uYjUwODFiMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oCkBAIC0yLDIxICsyLDE5IEBACiAvLyAgICAgcHVtcC5weSBtb3pqc19jYWxsYmFja19mdW5jdGlvbi5oLnB1bXAKIC8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKIAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKIApAQCAtNTcsMTMgKzU1LDIwIEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbi50b09iamVjdE9yTnVsbCgpKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oKQogICAgICAgY29uc3QgT1ZFUlJJREUgewogICAgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwogICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzY3JpcHQ6Om1vempzIiwgIk1vempzQ2FsbGJhY2tGdW5jdGlvbjo6UnVuIik7CiAgICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gY2FsbGJhY2tfcmVzdWx0OwogICAgIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHRfKTsKLSAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXQoKSk7CisgICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCkpOwogICAgIGlmICghZnVuY3Rpb24pIHsKICAgICAgIERMT0coV0FSTklORykgPDwgIkZ1bmN0aW9uIHdhcyBnYXJiYWdlIGNvbGxlY3RlZC4iOwogICAgICAgY2FsbGJhY2tfcmVzdWx0LmV4Y2VwdGlvbiA9IHRydWU7CkBAIC05Myw3ICs5OCw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTExMiw2ICsxMTksMTMgQEAKICAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24pKTsKICAgfQogCisgIGV4cGxpY2l0IE1vempzQ2FsbGJhY2tGdW5jdGlvbihKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBmdW5jdGlvbikKKyAgICAgIDogY29udGV4dF8oY29udGV4dCksIHdlYWtfZnVuY3Rpb25fKGNvbnRleHQsIGZ1bmN0aW9uKSB7CisgICAgRENIRUNLKGNvbnRleHRfKTsKKyAgICBEQ0hFQ0soZnVuY3Rpb24uaXNPYmplY3QoKSk7CisgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uLnRvT2JqZWN0T3JOdWxsKCkpKTsKKyAgfQorCiAgIENhbGxiYWNrUmVzdWx0PFI+IFJ1bigKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEExPjo6Rm9yd2FyZFR5cGUgYTEpCiAgICAgICBjb25zdCBPVkVSUklERSB7CkBAIC0xMTksNyArMTMzLDcgQEAKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtMTUxLDcgKzE2NSw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTE3MCw2ICsxODYsMTMgQEAKICAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24pKTsKICAgfQogCisgIGV4cGxpY2l0IE1vempzQ2FsbGJhY2tGdW5jdGlvbihKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBmdW5jdGlvbikKKyAgICAgIDogY29udGV4dF8oY29udGV4dCksIHdlYWtfZnVuY3Rpb25fKGNvbnRleHQsIGZ1bmN0aW9uKSB7CisgICAgRENIRUNLKGNvbnRleHRfKTsKKyAgICBEQ0hFQ0soZnVuY3Rpb24uaXNPYmplY3QoKSk7CisgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uLnRvT2JqZWN0T3JOdWxsKCkpKTsKKyAgfQorCiAgIENhbGxiYWNrUmVzdWx0PFI+IFJ1bigKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEExPjo6Rm9yd2FyZFR5cGUgYTEsCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMj46OkZvcndhcmRUeXBlIGEyKQpAQCAtMTc4LDcgKzIwMSw3IEBACiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnNjcmlwdDo6bW96anMiLCAiTW96anNDYWxsYmFja0Z1bmN0aW9uOjpSdW4iKTsKICAgICBDYWxsYmFja1Jlc3VsdDxSPiBjYWxsYmFja19yZXN1bHQ7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldCgpKTsKKyAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKSk7CiAgICAgaWYgKCFmdW5jdGlvbikgewogICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRnVuY3Rpb24gd2FzIGdhcmJhZ2UgY29sbGVjdGVkLiI7CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKQEAgLTIxMSw3ICsyMzQsOSBAQAogICAgIHJldHVybiBjYWxsYmFja19yZXN1bHQ7CiAgIH0KIAotICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0KCk7IH0KKyAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpOyB9CisgIGNvbnN0IEpTOjpWYWx1ZSYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRWYWx1ZSgpOyB9CisgIGJvb2wgV2FzQ29sbGVjdGVkKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uV2FzQ29sbGVjdGVkKCk7IH0KIAogIHByaXZhdGU6CiAgIEpTQ29udGV4dCogY29udGV4dF87CkBAIC0yMzAsNiArMjU1LDEzIEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbi50b09iamVjdE9yTnVsbCgpKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMiwKQEAgLTIzOSw3ICsyNzEsNyBAQAogICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzY3JpcHQ6Om1vempzIiwgIk1vempzQ2FsbGJhY2tGdW5jdGlvbjo6UnVuIik7CiAgICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gY2FsbGJhY2tfcmVzdWx0OwogICAgIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHRfKTsKLSAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXQoKSk7CisgICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCkpOwogICAgIGlmICghZnVuY3Rpb24pIHsKICAgICAgIERMT0coV0FSTklORykgPDwgIkZ1bmN0aW9uIHdhcyBnYXJiYWdlIGNvbGxlY3RlZC4iOwogICAgICAgY2FsbGJhY2tfcmVzdWx0LmV4Y2VwdGlvbiA9IHRydWU7CkBAIC0yNzMsNyArMzA1LDkgQEAKICAgICByZXR1cm4gY2FsbGJhY2tfcmVzdWx0OwogICB9CiAKLSAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldCgpOyB9CisgIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKTsgfQorICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0VmFsdWUoKTsgfQorICBib29sIFdhc0NvbGxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLldhc0NvbGxlY3RlZCgpOyB9CiAKICBwcml2YXRlOgogICBKU0NvbnRleHQqIGNvbnRleHRfOwpAQCAtMjkyLDYgKzMyNiwxMyBAQAogICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbikpOwogICB9CiAKKyAgZXhwbGljaXQgTW96anNDYWxsYmFja0Z1bmN0aW9uKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIGZ1bmN0aW9uKQorICAgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwgd2Vha19mdW5jdGlvbl8oY29udGV4dCwgZnVuY3Rpb24pIHsKKyAgICBEQ0hFQ0soY29udGV4dF8pOworICAgIERDSEVDSyhmdW5jdGlvbi5pc09iamVjdCgpKTsKKyAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24udG9PYmplY3RPck51bGwoKSkpOworICB9CisKICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEEyPjo6Rm9yd2FyZFR5cGUgYTIsCkBAIC0zMDIsNyArMzQzLDcgQEAKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtMzM3LDcgKzM3OCw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTM1Nyw2ICs0MDAsMTMgQEAKICAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24pKTsKICAgfQogCisgIGV4cGxpY2l0IE1vempzQ2FsbGJhY2tGdW5jdGlvbihKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBmdW5jdGlvbikKKyAgICAgIDogY29udGV4dF8oY29udGV4dCksIHdlYWtfZnVuY3Rpb25fKGNvbnRleHQsIGZ1bmN0aW9uKSB7CisgICAgRENIRUNLKGNvbnRleHRfKTsKKyAgICBEQ0hFQ0soZnVuY3Rpb24uaXNPYmplY3QoKSk7CisgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uLnRvT2JqZWN0T3JOdWxsKCkpKTsKKyAgfQorCiAgIENhbGxiYWNrUmVzdWx0PFI+IFJ1bigKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEExPjo6Rm9yd2FyZFR5cGUgYTEsCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMj46OkZvcndhcmRUeXBlIGEyLApAQCAtMzY4LDcgKzQxOCw3IEBACiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnNjcmlwdDo6bW96anMiLCAiTW96anNDYWxsYmFja0Z1bmN0aW9uOjpSdW4iKTsKICAgICBDYWxsYmFja1Jlc3VsdDxSPiBjYWxsYmFja19yZXN1bHQ7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldCgpKTsKKyAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKSk7CiAgICAgaWYgKCFmdW5jdGlvbikgewogICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRnVuY3Rpb24gd2FzIGdhcmJhZ2UgY29sbGVjdGVkLiI7CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKQEAgLTQwNCw3ICs0NTQsOSBAQAogICAgIHJldHVybiBjYWxsYmFja19yZXN1bHQ7CiAgIH0KIAotICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0KCk7IH0KKyAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpOyB9CisgIGNvbnN0IEpTOjpWYWx1ZSYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRWYWx1ZSgpOyB9CisgIGJvb2wgV2FzQ29sbGVjdGVkKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uV2FzQ29sbGVjdGVkKCk7IH0KIAogIHByaXZhdGU6CiAgIEpTQ29udGV4dCogY29udGV4dF87CkBAIC00MjQsNiArNDc2LDEzIEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbi50b09iamVjdE9yTnVsbCgpKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMiwKQEAgLTQzNiw3ICs0OTUsNyBAQAogICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzY3JpcHQ6Om1vempzIiwgIk1vempzQ2FsbGJhY2tGdW5jdGlvbjo6UnVuIik7CiAgICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gY2FsbGJhY2tfcmVzdWx0OwogICAgIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHRfKTsKLSAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXQoKSk7CisgICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCkpOwogICAgIGlmICghZnVuY3Rpb24pIHsKICAgICAgIERMT0coV0FSTklORykgPDwgIkZ1bmN0aW9uIHdhcyBnYXJiYWdlIGNvbGxlY3RlZC4iOwogICAgICAgY2FsbGJhY2tfcmVzdWx0LmV4Y2VwdGlvbiA9IHRydWU7CkBAIC00NzMsNyArNTMyLDkgQEAKICAgICByZXR1cm4gY2FsbGJhY2tfcmVzdWx0OwogICB9CiAKLSAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldCgpOyB9CisgIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKTsgfQorICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0VmFsdWUoKTsgfQorICBib29sIFdhc0NvbGxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLldhc0NvbGxlY3RlZCgpOyB9CiAKICBwcml2YXRlOgogICBKU0NvbnRleHQqIGNvbnRleHRfOwpAQCAtNDkzLDYgKzU1NCwxMyBAQAogICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbikpOwogICB9CiAKKyAgZXhwbGljaXQgTW96anNDYWxsYmFja0Z1bmN0aW9uKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIGZ1bmN0aW9uKQorICAgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwgd2Vha19mdW5jdGlvbl8oY29udGV4dCwgZnVuY3Rpb24pIHsKKyAgICBEQ0hFQ0soY29udGV4dF8pOworICAgIERDSEVDSyhmdW5jdGlvbi5pc09iamVjdCgpKTsKKyAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24udG9PYmplY3RPck51bGwoKSkpOworICB9CisKICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEEyPjo6Rm9yd2FyZFR5cGUgYTIsCkBAIC01MDYsNyArNTc0LDcgQEAKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtNTQ0LDcgKzYxMiw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTU1NSw3ICs2MjUsNyBAQAogc3RydWN0IFR5cGVUcmFpdHM8Q2FsbGJhY2tGdW5jdGlvbjxTaWduYXR1cmU+ID4gewogICB0eXBlZGVmIE1vempzVXNlck9iamVjdEhvbGRlcjxNb3pqc0NhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+CiAgICAgICBDb252ZXJzaW9uVHlwZTsKLSAgdHlwZWRlZiBjb25zdCBTY3JpcHRPYmplY3Q8Q2FsbGJhY2tGdW5jdGlvbjxTaWduYXR1cmU+ID4qIFJldHVyblR5cGU7CisgIHR5cGVkZWYgY29uc3QgU2NyaXB0VmFsdWU8Q2FsbGJhY2tGdW5jdGlvbjxTaWduYXR1cmU+ID4qIFJldHVyblR5cGU7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbW96anMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgucHVtcCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgucHVtcAppbmRleCA2N2M3MWVmLi5jOTFiMWExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oLnB1bXAKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaC5wdW1wCkBAIC03LDIxICs3LDE5IEBACiAKICQkIFRoaXMgc2hvdWxkIGJlIG5vIGxhcmdlciB0aGFuIE1BWF9BUklUWSBpbiBiYXNlL2JpbmQuaC5wdW1wLgogJHZhciBNQVhfQVJJVFkgPSA3Ci0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8gY2xhbmctZm9ybWF0IG9mZgogCkBAIC03NCw2ICs3MiwxMyBAQAogICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbikpOwogICB9CiAKKyAgZXhwbGljaXQgTW96anNDYWxsYmFja0Z1bmN0aW9uKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIGZ1bmN0aW9uKQorICAgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwgd2Vha19mdW5jdGlvbl8oY29udGV4dCwgZnVuY3Rpb24pIHsKKyAgICBEQ0hFQ0soY29udGV4dF8pOworICAgIERDSEVDSyhmdW5jdGlvbi5pc09iamVjdCgpKTsKKyAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24udG9PYmplY3RPck51bGwoKSkpOworICB9CisKICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKCRmb3IgQVJHICwgW1sKIAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QSQoQVJHKT46OkZvcndhcmRUeXBlIGEkKEFSRyldXSkKQEAgLTgyLDcgKzg3LDcgQEAKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtMTIwLDcgKzEyNSw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTEzMiw3ICsxMzksNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFNpZ25hdHVyZT4KIHN0cnVjdCBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+IHsKICAgdHlwZWRlZiBNb3pqc1VzZXJPYmplY3RIb2xkZXI8TW96anNDYWxsYmFja0Z1bmN0aW9uPFNpZ25hdHVyZT4gPiBDb252ZXJzaW9uVHlwZTsKLSAgdHlwZWRlZiBjb25zdCBTY3JpcHRPYmplY3Q8Q2FsbGJhY2tGdW5jdGlvbjxTaWduYXR1cmU+ID4qIFJldHVyblR5cGU7CisgIHR5cGVkZWYgY29uc3QgU2NyaXB0VmFsdWU8Q2FsbGJhY2tGdW5jdGlvbjxTaWduYXR1cmU+ID4qIFJldHVyblR5cGU7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbW96anMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5jYwppbmRleCA3MmZiZGM3Li45ODBjMDJhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgKaW5kZXggYTZmMjExNS4uNmFmNzJiYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfQ0FMTEJBQ0tfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfQ0FMTEJBQ0tfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaG9sZGVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaG9sZGVyLmgKaW5kZXggOGRhYWJjYS4uYzE0Y2VkMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlX2hvbGRlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2NhbGxiYWNrX2ludGVyZmFjZV9ob2xkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19DQUxMQkFDS19JTlRFUkZBQ0VfSE9MREVSX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfQ0FMTEJBQ0tfSU5URVJGQUNFX0hPTERFUl9IXwpAQCAtMzUsMTMgKzMzLDE2IEBACiAgIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VIb2xkZXIoSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5KQogICAgICAgOiBCYXNlQ2xhc3Mob2JqZWN0LCBjb250ZXh0LCB3cmFwcGVyX2ZhY3RvcnkpIHt9CisgIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VIb2xkZXIoSlM6OkhhbmRsZVZhbHVlIHZhbHVlLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSkKKyAgICAgIDogQmFzZUNsYXNzKHZhbHVlLCBjb250ZXh0LCB3cmFwcGVyX2ZhY3RvcnkpIHt9CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2tJbnRlcmZhY2U+CiBzdHJ1Y3QgVHlwZVRyYWl0czxDYWxsYmFja0ludGVyZmFjZVRyYWl0czxDYWxsYmFja0ludGVyZmFjZT4gPiB7CiAgIHR5cGVkZWYgTW96anNDYWxsYmFja0ludGVyZmFjZUhvbGRlcjx0eXBlbmFtZSBDYWxsYmFja0ludGVyZmFjZVRyYWl0czwKICAgICAgIENhbGxiYWNrSW50ZXJmYWNlPjo6TW96anNDYWxsYmFja0ludGVyZmFjZUNsYXNzPiBDb252ZXJzaW9uVHlwZTsKLSAgdHlwZWRlZiBjb25zdCBTY3JpcHRPYmplY3Q8Q2FsbGJhY2tJbnRlcmZhY2U+KiBSZXR1cm5UeXBlOworICB0eXBlZGVmIGNvbnN0IFNjcmlwdFZhbHVlPENhbGxiYWNrSW50ZXJmYWNlPiogUmV0dXJuVHlwZTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZGVidWdnZXIuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19kZWJ1Z2dlci5jYwppbmRleCAyZGZiMzBlLi45MGExZDc2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19kZWJ1Z2dlci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19kZWJ1Z2dlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2RlYnVnZ2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2RlYnVnZ2VyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19kZWJ1Z2dlci5oCmluZGV4IGQxMzFjNjEuLjNiYjM3YWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2RlYnVnZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZGVidWdnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfREVCVUdHRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19ERUJVR0dFUl9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19lbmdpbmUuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19lbmdpbmUuY2MKaW5kZXggZjUzZjI5Mi4uNDA0Nzc1NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZW5naW5lLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2VuZ2luZS5jYwpAQCAtMSwyMiArMSwyMSBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2VuZ2luZS5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKQEAgLTIzMiw2ICsyMzEsMTQgQEAKICAgcmV0dXJuIEVuZ2luZVN0YXRzOjpHZXRJbnN0YW5jZSgpLT5VcGRhdGVNZW1vcnlTdGF0c0FuZFJldHVyblJlc2VydmVkKCk7CiB9CiAKK2Jvb2wgTW96anNFbmdpbmU6OlJlZ2lzdGVyRXJyb3JIYW5kbGVyKEphdmFTY3JpcHRFbmdpbmU6OkVycm9ySGFuZGxlciBoYW5kbGVyKSB7CisgIGVycm9yX2hhbmRsZXJfID0gaGFuZGxlcjsKKyAgSlNEZWJ1Z0Vycm9ySG9vayBob29rID0gRXJyb3JIb29rQ2FsbGJhY2s7CisgIHZvaWQqIGNsb3N1cmUgPSB0aGlzOworICBKU19TZXREZWJ1Z0Vycm9ySG9vayhydW50aW1lXywgaG9vaywgY2xvc3VyZSk7CisgIHJldHVybiB0cnVlOworfQorCiB2b2lkIE1vempzRW5naW5lOjpUaW1lckdhcmJhZ2VDb2xsZWN0KCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0IiwgIk1vempzRW5naW5lOjpUaW1lckdhcmJhZ2VDb2xsZWN0KCkiKTsKICAgQ29sbGVjdEdhcmJhZ2UoKTsKQEAgLTI4Nyw2ICsyOTQsMzAgQEAKICAgfQogfQogCitKU0Jvb2wgTW96anNFbmdpbmU6OkVycm9ySG9va0NhbGxiYWNrKEpTQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNFcnJvclJlcG9ydCogcmVwb3J0LCB2b2lkKiBjbG9zdXJlKSB7CisgIE1vempzRW5naW5lKiB0aGlzX3B0ciA9IHN0YXRpY19jYXN0PE1vempzRW5naW5lKj4oY2xvc3VyZSk7CisgIHJldHVybiB0aGlzX3B0ci0+UmVwb3J0SlNFcnJvcihjb250ZXh0LCBtZXNzYWdlLCByZXBvcnQpOworfQorCitKU0Jvb2wgTW96anNFbmdpbmU6OlJlcG9ydEpTRXJyb3IoSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRXJyb3JSZXBvcnQqIHJlcG9ydCkgeworICBpZiAoIWVycm9yX2hhbmRsZXJfLmlzX251bGwoKSAmJiByZXBvcnQgJiYgcmVwb3J0LT5maWxlbmFtZSkgeworICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IHJlcG9ydC0+ZmlsZW5hbWU7CisgICAgLy8gTGluZS9jb2x1bW4gY2FuIGJlIHplcm8gZm9yIGludGVybmFsIGphdmFzY3JpcHQgZXhjZXB0aW9ucy4gSW4gdGhpcworICAgIC8vIGNhc2Ugc2V0IHRoZSB2YWx1ZXMgdG8gMSwgb3RoZXJ3aXNlIHRoZSBiYXNlOjpTb3VyY2VMb2NhdGlvbiBvYmplY3QKKyAgICAvLyBiZWxvdyB3aWxsIGRjaGVjay4KKyAgICBpbnQgbGluZSA9IHN0ZDo6bWF4PGludD4oMSwgcmVwb3J0LT5saW5lbm8pOworICAgIGludCBjb2x1bW4gPSBzdGQ6Om1heDxpbnQ+KDEsIHJlcG9ydC0+Y29sdW1uKTsKKyAgICBpZiAoZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICAgIGZpbGVfbmFtZSA9ICI8aW50ZXJuYWwgZXhjZXB0aW9uPiI7CisgICAgfQorICAgIGJhc2U6OlNvdXJjZUxvY2F0aW9uIHNvdXJjZV9sb2NhdGlvbihmaWxlX25hbWUsIGxpbmUsIGNvbHVtbik7CisgICAgZXJyb3JfaGFuZGxlcl8uUnVuKHNvdXJjZV9sb2NhdGlvbiwgbWVzc2FnZSk7CisgIH0KKyAgcmV0dXJuIHRydWU7ICAvLyBBbGxvdyBlcnJvciB0byBwcm9wYWdhdGUgaW4gdGhlIG1vemlsbGEgZW5naW5lLgorfQorCiB9ICAvLyBuYW1lc3BhY2UgbW96anMKIAogc2NvcGVkX3B0cjxKYXZhU2NyaXB0RW5naW5lPiBKYXZhU2NyaXB0RW5naW5lOjpDcmVhdGVFbmdpbmUoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19lbmdpbmUuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2VuZ2luZS5oCmluZGV4IDljMzU2MmUuLmE4ZWU3ZTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2VuZ2luZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2VuZ2luZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19FTkdJTkVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19FTkdJTkVfSF8KIApAQCAtMzYsNiArMzQsNyBAQAogICB2b2lkIENvbGxlY3RHYXJiYWdlKCkgT1ZFUlJJREU7CiAgIHZvaWQgUmVwb3J0RXh0cmFNZW1vcnlDb3N0KHNpemVfdCBieXRlcykgT1ZFUlJJREU7CiAgIHNpemVfdCBVcGRhdGVNZW1vcnlTdGF0c0FuZFJldHVyblJlc2VydmVkKCkgT1ZFUlJJREU7CisgIGJvb2wgUmVnaXN0ZXJFcnJvckhhbmRsZXIoSmF2YVNjcmlwdEVuZ2luZTo6RXJyb3JIYW5kbGVyIGhhbmRsZXIpIE9WRVJSSURFOwogCiAgcHJpdmF0ZToKICAgdm9pZCBUaW1lckdhcmJhZ2VDb2xsZWN0KCk7CkBAIC00NCw2ICs0MywxMCBAQAogICBzdGF0aWMgdm9pZCBHQ0NhbGxiYWNrKEpTUnVudGltZSogcnVudGltZSwgSlNHQ1N0YXR1cyBzdGF0dXMsIHZvaWQqIGRhdGEpOwogICBzdGF0aWMgdm9pZCBGaW5hbGl6ZUNhbGxiYWNrKEpTRnJlZU9wKiBmcmVlX29wLCBKU0ZpbmFsaXplU3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2NvbXBhcnRtZW50LCB2b2lkKiBkYXRhKTsKKyAgc3RhdGljIEpTQm9vbCBFcnJvckhvb2tDYWxsYmFjayhKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNFcnJvclJlcG9ydCogcmVwb3J0LCB2b2lkKiBjbG9zdXJlKTsKKyAgSlNCb29sIFJlcG9ydEpTRXJyb3IoSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBKU0Vycm9yUmVwb3J0KiByZXBvcnQpOwogCiAgIGJhc2U6OlRocmVhZENoZWNrZXIgdGhyZWFkX2NoZWNrZXJfOwogCkBAIC02MCw2ICs2Myw5IEBACiAKICAgLy8gVXNlZCB0byB0cmlnZ2VyIGEgZ2FyYmFnZSBjb2xsZWN0aW9uIHBlcmlvZGljYWxseS4KICAgYmFzZTo6UmVwZWF0aW5nVGltZXI8TW96anNFbmdpbmU+IGdjX3RpbWVyXzsKKworICAvLyBVc2VkIHRvIGhhbmRsZSBqYXZhc2NyaXB0IGVycm9ycy4KKyAgRXJyb3JIYW5kbGVyIGVycm9yX2hhbmRsZXJfOwogfTsKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwogfSAgLy8gbmFtZXNwYWNlIHNjcmlwdApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmNjCmluZGV4IDFiNjUxZDEuLjZmNDdmMmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZXhjZXB0aW9uX3N0YXRlLmgiCiAKICNpbmNsdWRlIDxzdHJpbmc+CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19leGNlcHRpb25fc3RhdGUuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oCmluZGV4IDQxMmE3OTIuLjM3YTZlNDQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19FWENFUFRJT05fU1RBVEVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19FWENFUFRJT05fU1RBVEVfSF8KIApAQCAtMzIsNyArMzAsNyBAQAogICAgICAgOiBpc19leGNlcHRpb25fc2V0XyhmYWxzZSksIGNvbnRleHRfKGNvbnRleHQpIHt9CiAgIC8vIEV4Y2VwdGlvblN0YXRlIGludGVyZmFjZQogICB2b2lkIFNldEV4Y2VwdGlvbihjb25zdCBzY29wZWRfcmVmcHRyPFNjcmlwdEV4Y2VwdGlvbj4mIGV4Y2VwdGlvbikgT1ZFUlJJREU7Ci0gIHZvaWQgU2V0U2ltcGxlRXhjZXB0aW9uKE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwgLi4uKSBPVkVSUklERTsKKyAgdm9pZCBTZXRTaW1wbGVFeGNlcHRpb24oTWVzc2FnZVR5cGVWYXIgbWVzc2FnZV90eXBlLCAuLi4pIE9WRVJSSURFOwogCiAgIGJvb2wgaXNfZXhjZXB0aW9uX3NldCgpIGNvbnN0IHsgcmV0dXJuIGlzX2V4Y2VwdGlvbl9zZXRfOyB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYwppbmRleCBiNzZlZWU4Li4wNDQ4YmFmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaAppbmRleCBjZTE3NDUxLi45NzYyNTMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfR0xPQkFMX0VOVklST05NRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfR0xPQkFMX0VOVklST05NRU5UX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX29iamVjdF9oYW5kbGUuaAppbmRleCAxODNiOWU5Li41MjdmM2JkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19vYmplY3RfaGFuZGxlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfb2JqZWN0X2hhbmRsZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19PQkpFQ1RfSEFORExFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfT0JKRUNUX0hBTkRMRV9IXwogCkBAIC0yNywxOCArMjUsMjIgQEAKIG5hbWVzcGFjZSBzY3JpcHQgewogbmFtZXNwYWNlIG1vempzIHsKIAotLy8gQSB3cmFwcGVyIGFyb3VuZCBhIEpTT2JqZWN0IHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvIENvYmFsdCBhcyBhbgorLy8gQSB3cmFwcGVyIGFyb3VuZCBhIEpTOjpWYWx1ZSB0aGF0IGNhbiBiZSBwYXNzZWQgaW50byBDb2JhbHQgYXMgYW4KIC8vIG9wYXF1ZSBzY3JpcHQgb2JqZWN0LgogLy8gQW4gT3BhcXVlSGFuZGxlIGlzIG5ldmVyIHBhc3NlZCBpbnRvIENvYmFsdCBhcy1pcywgYnV0IG9ubHkgd2hlbiB3cmFwcGVkIGFzCi0vLyBhIFNjcmlwdE9iamVjdDxPcGFxdWVIYW5kbGU+LgorLy8gYSBTY3JpcHRWYWx1ZTxPcGFxdWVIYW5kbGU+LgogY2xhc3MgTW96anNPYmplY3RIYW5kbGUgOiBwdWJsaWMgT3BhcXVlSGFuZGxlIHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgT3BhcXVlSGFuZGxlIEJhc2VUeXBlOwotICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXy5HZXRPYmplY3QoKTsgfQorICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXy5HZXRWYWx1ZSgpOyB9CisgIGJvb2wgV2FzQ29sbGVjdGVkKCkgY29uc3QgeyByZXR1cm4gaGFuZGxlXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgTW96anNPYmplY3RIYW5kbGUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCkKICAgICAgIDogaGFuZGxlXyhjb250ZXh0LCBvYmplY3QpIHt9CisgIE1vempzT2JqZWN0SGFuZGxlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIHZhbHVlKQorICAgICAgOiBoYW5kbGVfKGNvbnRleHQsIHZhbHVlKSB7fQogICB+TW96anNPYmplY3RIYW5kbGUoKSB7fQogCiAgIFdlYWtIZWFwT2JqZWN0IGhhbmRsZV87CkBAIC01Miw3ICs1NCw3IEBACiB0ZW1wbGF0ZSA8Pgogc3RydWN0IFR5cGVUcmFpdHM8T3BhcXVlSGFuZGxlPiB7CiAgIHR5cGVkZWYgTW96anNPYmplY3RIYW5kbGVIb2xkZXIgQ29udmVyc2lvblR5cGU7Ci0gIHR5cGVkZWYgY29uc3QgU2NyaXB0T2JqZWN0PE9wYXF1ZUhhbmRsZT4qIFJldHVyblR5cGU7CisgIHR5cGVkZWYgY29uc3QgU2NyaXB0VmFsdWU8T3BhcXVlSGFuZGxlPiogUmV0dXJuVHlwZTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuY2MKaW5kZXggMzY3MmViOC4uYTAyYzJiMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oCmluZGV4IDUyYTYxZDMuLmYxZjU0MmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X01PWkpTX1BST1BFUlRZX0VOVU1FUkFUT1JfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19QUk9QRVJUWV9FTlVNRVJBVE9SX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3NvdXJjZV9jb2RlLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfc291cmNlX2NvZGUuY2MKaW5kZXggOWIxZjUwMy4uNzU1NDI2MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfc291cmNlX2NvZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfc291cmNlX2NvZGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfc291cmNlX2NvZGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19zb3VyY2VfY29kZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfc291cmNlX2NvZGUuaAppbmRleCAxMzY5Y2RlLi4wNThiZmRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19zb3VyY2VfY29kZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3NvdXJjZV9jb2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X01PWkpTX1NPVVJDRV9DT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfU09VUkNFX0NPREVfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaAppbmRleCBhMmUzNGU2Li45NTJiNGNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfVVNFUl9PQkpFQ1RfSE9MREVSX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfVVNFUl9PQkpFQ1RfSE9MREVSX0hfCiAKQEAgLTIxLDg5ICsxOSwxMTIgQEAKICNpbmNsdWRlICJjb2JhbHQvYmFzZS9wb2x5bW9ycGhpY19kb3duY2FzdC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9yZWZlcmVuY2VkX29iamVjdF9tYXAuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfdmFsdWUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKIAorI2luY2x1ZGUgIm5iL21lbW9yeV9zY29wZS5oIgorCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzY3JpcHQgewogbmFtZXNwYWNlIG1vempzIHsKIAotLy8gVGVtcGxhdGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBTY3JpcHRPYmplY3QgdGVtcGxhdGUgY2xhc3MgZm9yIGxpZmV0aW1lCisvLyBUZW1wbGF0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIFNjcmlwdFZhbHVlIHRlbXBsYXRlIGNsYXNzIGZvciBsaWZldGltZQogLy8gbWFuYWdlbWVudCBvZiBVc2VyIE9iamVjdHMgcGFzc2VkIGZyb20gdGhlIGJpbmRpbmdzIGxheWVyIGludG8gQ29iYWx0LiBTZWUKLS8vIHRoZSBkZWZpbml0aW9uIG9mIFNjcmlwdE9iamVjdCBmb3IgZnVydGhlciBkZXRhaWwuCisvLyB0aGUgZGVmaW5pdGlvbiBvZiBTY3JpcHRWYWx1ZSBmb3IgZnVydGhlciBkZXRhaWwuCiAvLyBUaGlzIGNsYXNzIGRvZXMgbm90IHJvb3QgdGhlIHVuZGVybHlpbmcgSlNPYmplY3QgdGhhdCBNb3pqc1VzZXJPYmplY3RUeXBlCiAvLyBob2xkcyBhIHJlZmVyZW5jZSB0by4gVGhlIG9iamVjdCB3aWxsIGJlIHRyYWNlZCB3aGVuIGFueSBvd25pbmcgb2JqZWN0cyBhcmUKIC8vIHRyYWNlZC4KIHRlbXBsYXRlIDx0eXBlbmFtZSBNb3pqc1VzZXJPYmplY3RUeXBlPgogY2xhc3MgTW96anNVc2VyT2JqZWN0SG9sZGVyCi0gICAgOiBwdWJsaWMgU2NyaXB0T2JqZWN0PHR5cGVuYW1lIE1vempzVXNlck9iamVjdFR5cGU6OkJhc2VUeXBlPiB7CisgICAgOiBwdWJsaWMgU2NyaXB0VmFsdWU8dHlwZW5hbWUgTW96anNVc2VyT2JqZWN0VHlwZTo6QmFzZVR5cGU+IHsKICBwdWJsaWM6Ci0gIHR5cGVkZWYgU2NyaXB0T2JqZWN0PHR5cGVuYW1lIE1vempzVXNlck9iamVjdFR5cGU6OkJhc2VUeXBlPiBCYXNlQ2xhc3M7CisgIHR5cGVkZWYgU2NyaXB0VmFsdWU8dHlwZW5hbWUgTW96anNVc2VyT2JqZWN0VHlwZTo6QmFzZVR5cGU+IEJhc2VDbGFzczsKIAogICBNb3pqc1VzZXJPYmplY3RIb2xkZXIoKSA6IGNvbnRleHRfKE5VTEwpLCB3cmFwcGVyX2ZhY3RvcnlfKE5VTEwpIHt9CiAKICAgTW96anNVc2VyT2JqZWN0SG9sZGVyKEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKU0NvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5KQotICAgICAgOiBvYmplY3RfaGFuZGxlXyhNb3pqc1VzZXJPYmplY3RUeXBlKGNvbnRleHQsIG9iamVjdCkpLAorICAgICAgOiBoYW5kbGVfKE1vempzVXNlck9iamVjdFR5cGUoY29udGV4dCwgb2JqZWN0KSksCisgICAgICAgIGNvbnRleHRfKGNvbnRleHQpLAorICAgICAgICB3cmFwcGVyX2ZhY3RvcnlfKHdyYXBwZXJfZmFjdG9yeSkge30KKworICBNb3pqc1VzZXJPYmplY3RIb2xkZXIoSlM6OkhhbmRsZVZhbHVlIHZhbHVlLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5KQorICAgICAgOiBoYW5kbGVfKE1vempzVXNlck9iamVjdFR5cGUoY29udGV4dCwgdmFsdWUpKSwKICAgICAgICAgY29udGV4dF8oY29udGV4dCksCiAgICAgICAgIHdyYXBwZXJfZmFjdG9yeV8od3JhcHBlcl9mYWN0b3J5KSB7fQogCiAgIHZvaWQgUmVnaXN0ZXJPd25lcihXcmFwcGFibGUqIG93bmVyKSBPVkVSUklERSB7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3Qgb3duZWRfb2JqZWN0KGNvbnRleHRfLCBqc19vYmplY3QoKSk7Ci0gICAgRExPR19JRihXQVJOSU5HLCAhb3duZWRfb2JqZWN0KQotICAgICAgICA8PCAiT3duZWQgb2JqZWN0IGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLiI7Ci0gICAgaWYgKG93bmVkX29iamVjdCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvd25lZF92YWx1ZShjb250ZXh0XywganNfdmFsdWUoKSk7CisgICAgRExPR19JRihXQVJOSU5HLCBoYW5kbGVfLT5XYXNDb2xsZWN0ZWQoKSkKKyAgICAgICAgPDwgIk93bmVkIHZhbHVlIGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLiI7CisgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBmb3IgbnVsbCwgYmVjYXVzZSBudWxsIGlzIGFwcGFyZW50bHkgYSBHQyBUaGluZy4KKyAgICBpZiAoIW93bmVkX3ZhbHVlLmlzTnVsbE9yVW5kZWZpbmVkKCkgJiYgb3duZWRfdmFsdWUuaXNHQ1RoaW5nKCkpIHsKICAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dF8pOwogICAgICAgaW50cHRyX3Qga2V5ID0gUmVmZXJlbmNlZE9iamVjdE1hcDo6R2V0S2V5Rm9yV3JhcHBhYmxlKG93bmVyKTsKICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+cmVmZXJlbmNlZF9vYmplY3RzKCktPkFkZFJlZmVyZW5jZWRPYmplY3QoCi0gICAgICAgICAga2V5LCBvd25lZF9vYmplY3QpOworICAgICAgICAgIGtleSwgb3duZWRfdmFsdWUpOwogICAgIH0KICAgfQogCiAgIHZvaWQgRGVyZWdpc3Rlck93bmVyKFdyYXBwYWJsZSogb3duZXIpIE9WRVJSSURFIHsKICAgICAvLyB8b3duZXJ8IG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cnVjdGVkLCBzbyBkb24ndCB1c2UgaXQuCiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3Qgb3duZWRfb2JqZWN0KGNvbnRleHRfLCBqc19vYmplY3QoKSk7Ci0gICAgaWYgKG93bmVkX29iamVjdCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvd25lZF92YWx1ZShjb250ZXh0XywganNfdmFsdWUoKSk7CisgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBmb3IgbnVsbCwgYmVjYXVzZSBudWxsIGlzIGFwcGFyZW50bHkgYSBHQyBUaGluZy4KKyAgICBpZiAoIW93bmVkX3ZhbHVlLmlzTnVsbE9yVW5kZWZpbmVkKCkgJiYgb3duZWRfdmFsdWUuaXNHQ1RoaW5nKCkpIHsKICAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dF8pOwogICAgICAgaW50cHRyX3Qga2V5ID0gUmVmZXJlbmNlZE9iamVjdE1hcDo6R2V0S2V5Rm9yV3JhcHBhYmxlKG93bmVyKTsKICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+cmVmZXJlbmNlZF9vYmplY3RzKCktPlJlbW92ZVJlZmVyZW5jZWRPYmplY3QoCi0gICAgICAgICAga2V5LCBvd25lZF9vYmplY3QpOworICAgICAgICAgIGtleSwgb3duZWRfdmFsdWUpOwogICAgIH0KICAgfQogCi0gIGNvbnN0IHR5cGVuYW1lIE1vempzVXNlck9iamVjdFR5cGU6OkJhc2VUeXBlKiBHZXRTY3JpcHRPYmplY3QoKQorICBjb25zdCB0eXBlbmFtZSBNb3pqc1VzZXJPYmplY3RUeXBlOjpCYXNlVHlwZSogR2V0U2NyaXB0VmFsdWUoKQogICAgICAgY29uc3QgT1ZFUlJJREUgewotICAgIHJldHVybiBvYmplY3RfaGFuZGxlXyA/ICZvYmplY3RfaGFuZGxlXy52YWx1ZSgpIDogTlVMTDsKKyAgICByZXR1cm4gaGFuZGxlXyA/ICZoYW5kbGVfLnZhbHVlKCkgOiBOVUxMOwogICB9CiAKICAgc2NvcGVkX3B0cjxCYXNlQ2xhc3M+IE1ha2VDb3B5KCkgY29uc3QgT1ZFUlJJREUgewotICAgIERDSEVDSyhvYmplY3RfaGFuZGxlXyk7CisgICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CisgICAgRENIRUNLKGhhbmRsZV8pOwogICAgIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHRfKTsKLSAgICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9vYmplY3QoY29udGV4dF8sIGpzX29iamVjdCgpKTsKKyAgICBKUzo6Um9vdGVkVmFsdWUgcm9vdGVkX3ZhbHVlKGNvbnRleHRfLCBqc192YWx1ZSgpKTsKICAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPEJhc2VDbGFzcz4oCi0gICAgICAgIG5ldyBNb3pqc1VzZXJPYmplY3RIb2xkZXIocm9vdGVkX29iamVjdCwgY29udGV4dF8sIHdyYXBwZXJfZmFjdG9yeV8pKTsKKyAgICAgICAgbmV3IE1vempzVXNlck9iamVjdEhvbGRlcihyb290ZWRfdmFsdWUsIGNvbnRleHRfLCB3cmFwcGVyX2ZhY3RvcnlfKSk7CiAgIH0KIAogICBib29sIEVxdWFsVG8oY29uc3QgQmFzZUNsYXNzJiBvdGhlcikgY29uc3QgT1ZFUlJJREUgewogICAgIGNvbnN0IE1vempzVXNlck9iamVjdEhvbGRlciogbW96anNfb3RoZXIgPQogICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxjb25zdCBNb3pqc1VzZXJPYmplY3RIb2xkZXIqPigmb3RoZXIpOwotICAgIGlmICghb2JqZWN0X2hhbmRsZV8pIHsKLSAgICAgIHJldHVybiAhbW96anNfb3RoZXItPm9iamVjdF9oYW5kbGVfOworICAgIGlmICghaGFuZGxlXykgeworICAgICAgcmV0dXJuICFtb3pqc19vdGhlci0+aGFuZGxlXzsKKyAgICB9IGVsc2UgaWYgKCFtb3pqc19vdGhlci0+aGFuZGxlXykgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBEQ0hFQ0sob2JqZWN0X2hhbmRsZV8pOwotICAgIERDSEVDSyhtb3pqc19vdGhlci0+b2JqZWN0X2hhbmRsZV8pOwotICAgIHJldHVybiBvYmplY3RfaGFuZGxlXy0+aGFuZGxlKCkgPT0gbW96anNfb3RoZXItPm9iamVjdF9oYW5kbGVfLT5oYW5kbGUoKTsKKworICAgIERDSEVDSyhoYW5kbGVfKTsKKyAgICBEQ0hFQ0sobW96anNfb3RoZXItPmhhbmRsZV8pOworCisgICAgSlM6OlJvb3RlZFZhbHVlIHZhbHVlMShjb250ZXh0XywganNfdmFsdWUoKSk7CisgICAgSlM6OlJvb3RlZFZhbHVlIHZhbHVlMihjb250ZXh0XywgbW96anNfb3RoZXItPmpzX3ZhbHVlKCkpOworICAgIHJldHVybiB1dGlsOjpJc1NhbWVHY1RoaW5nKGNvbnRleHRfLCB2YWx1ZTEsIHZhbHVlMik7CisgIH0KKworICBjb25zdCBKUzo6VmFsdWUmIGpzX3ZhbHVlKCkgY29uc3QgeworICAgIERDSEVDSyhoYW5kbGVfKTsKKyAgICByZXR1cm4gaGFuZGxlXy0+dmFsdWUoKTsKICAgfQogCiAgIEpTT2JqZWN0KiBqc19vYmplY3QoKSBjb25zdCB7Ci0gICAgRENIRUNLKG9iamVjdF9oYW5kbGVfKTsKLSAgICByZXR1cm4gb2JqZWN0X2hhbmRsZV8tPmhhbmRsZSgpOworICAgIERDSEVDSyhoYW5kbGVfKTsKKyAgICByZXR1cm4gaGFuZGxlXy0+aGFuZGxlKCk7CiAgIH0KIAogIHByaXZhdGU6CkBAIC0xMTEsNyArMTMyLDcgQEAKICAgICAgIFdyYXBwYWJsZUFuZFByaXZhdGVIYXNoTWFwOwogCiAgIEpTQ29udGV4dCogY29udGV4dF87Ci0gIGJhc2U6Om9wdGlvbmFsPE1vempzVXNlck9iamVjdFR5cGU+IG9iamVjdF9oYW5kbGVfOworICBiYXNlOjpvcHRpb25hbDxNb3pqc1VzZXJPYmplY3RUeXBlPiBoYW5kbGVfOwogICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5XzsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3dyYXBwZXJfaGFuZGxlLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc193cmFwcGVyX2hhbmRsZS5oCmluZGV4IDQ3MGQ5MTAuLjdmYzVmMGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX3dyYXBwZXJfaGFuZGxlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfd3JhcHBlcl9oYW5kbGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfTU9aSlNfV1JBUFBFUl9IQU5ETEVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9NT1pKU19XUkFQUEVSX0hBTkRMRV9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9vcGFxdWVfcm9vdF90cmFja2VyLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvb3BhcXVlX3Jvb3RfdHJhY2tlci5jYwppbmRleCA0NWQ0MjcxLi5mZGNlN2NmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9vcGFxdWVfcm9vdF90cmFja2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L29wYXF1ZV9yb290X3RyYWNrZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9vcGFxdWVfcm9vdF90cmFja2VyLmgiCiAKQEAgLTM5LDIwICszNywyMyBAQAogICB2b2lkIFRyYWNrUmVhY2hhYmlsaXR5KFdyYXBwZXJQcml2YXRlKiBmcm9tLCBXcmFwcGVyUHJpdmF0ZSogdG8pIHsKICAgICBpbnRwdHJfdCBmcm9tX2tleSA9IFJlZmVyZW5jZWRPYmplY3RNYXA6OkdldEtleUZvcldyYXBwYWJsZSgKICAgICAgICAgZnJvbS0+d3JhcHBhYmxlPFdyYXBwYWJsZT4oKS5nZXQoKSk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCB0b19vYmplY3QoY29udGV4dF8sIHRvLT5qc19vYmplY3RfcHJveHkoKSk7CisgICAgSlNPYmplY3QqIHRvX3Byb3h5ID0gdG8tPmpzX29iamVjdF9wcm94eSgpOworICAgIERDSEVDSyh0b19wcm94eSk7CisgICAgSlM6OlJvb3RlZFZhbHVlIHRvX3ZhbHVlKGNvbnRleHRfLCBKUzo6T2JqZWN0VmFsdWUoKnRvX3Byb3h5KSk7CiAgICAgcmVmZXJlbmNlZF9vYmplY3RzXy5wdXNoX2JhY2soCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKGZyb21fa2V5LCBXZWFrSGVhcE9iamVjdChjb250ZXh0XywgdG9fb2JqZWN0KSkpOwotICAgIHJlZmVyZW5jZWRfb2JqZWN0X21hcF8tPkFkZFJlZmVyZW5jZWRPYmplY3QoZnJvbV9rZXksIHRvX29iamVjdCk7CisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGZyb21fa2V5LCBXZWFrSGVhcE9iamVjdChjb250ZXh0XywgdG9fdmFsdWUpKSk7CisgICAgcmVmZXJlbmNlZF9vYmplY3RfbWFwXy0+QWRkUmVmZXJlbmNlZE9iamVjdChmcm9tX2tleSwgdG9fdmFsdWUpOwogICB9CiAKICAgfk9wYXF1ZVJvb3RTdGF0ZUltcGwoKSB7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwogICAgIGZvciAoUmVmZXJlbmNlZE9iamVjdFBhaXJWZWN0b3I6Oml0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlZF9vYmplY3RzXy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gcmVmZXJlbmNlZF9vYmplY3RzXy5lbmQoKTsgKytpdCkgewotICAgICAgaWYgKGl0LT5zZWNvbmQuR2V0KCkpIHsKLSAgICAgICAgSlM6OlJvb3RlZE9iamVjdCByZWFjaGFibGVfb2JqZWN0KGNvbnRleHRfLCBpdC0+c2Vjb25kLkdldCgpKTsKKyAgICAgIFdlYWtIZWFwT2JqZWN0ICZ2YWx1ZSA9IGl0LT5zZWNvbmQ7CisgICAgICBpZiAodmFsdWUuSXNHY1RoaW5nKCkgJiYgIXZhbHVlLldhc0NvbGxlY3RlZCgpKSB7CisgICAgICAgIEpTOjpSb290ZWRWYWx1ZSByZWFjaGFibGVfdmFsdWUoY29udGV4dF8sIGl0LT5zZWNvbmQuR2V0VmFsdWUoKSk7CiAgICAgICAgIHJlZmVyZW5jZWRfb2JqZWN0X21hcF8tPlJlbW92ZVJlZmVyZW5jZWRPYmplY3QoaXQtPmZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoYWJsZV9vYmplY3QpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlYWNoYWJsZV92YWx1ZSk7CiAgICAgICB9CiAgICAgfQogICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9vcGFxdWVfcm9vdF90cmFja2VyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9vcGFxdWVfcm9vdF90cmFja2VyLmgKaW5kZXggNzkzZDdiOC4uZjA5ZWQwNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvb3BhcXVlX3Jvb3RfdHJhY2tlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L29wYXF1ZV9yb290X3RyYWNrZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfT1BBUVVFX1JPT1RfVFJBQ0tFUl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X09QQVFVRV9ST09UX1RSQUNLRVJfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuY2MKaW5kZXggMzA5M2U0ZC4uNmUwY2JiMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oIgogCkBAIC01MCw2MiArNDgsMTggQEAKICAgcmV0dXJuIGpzOjpOZXdQcm94eU9iamVjdChjb250ZXh0LCBoYW5kbGVyLCBvYmplY3RfYXNfdmFsdWUsIHByb3RvdHlwZSk7CiB9CiAKLWJvb2wgUHJveHlIYW5kbGVyOjpnZXRQcm9wZXJ0eURlc2NyaXB0b3IoCitib29sIFByb3h5SGFuZGxlcjo6Z2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKAogICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwgSlM6OkhhbmRsZUlkIGlkLAogICAgIEpTOjpNdXRhYmxlSGFuZGxlPEpTUHJvcGVydHlEZXNjcmlwdG9yPiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJJREwvI2dldG93bnByb3BlcnR5Ci0gIGlmIChzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkgfHwgc3VwcG9ydHNfaW5kZXhlZF9wcm9wZXJ0aWVzKCkpIHsKLSAgICAvLyBDb252ZXJ0IHRoZSBpZCB0byBhIEpTVmFsdWUsIHNvIHdlIGNhbiBlYXNpbHkgY29udmVydCBpdCB0byBVaW50MzIgYW5kCi0gICAgLy8gSlNTdHJpbmcuCi0gICAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICAgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsIGpzOjpHZXRQcm94eVRhcmdldE9iamVjdChwcm94eSkpOwotICAgIGlmIChzdXBwb3J0c19pbmRleGVkX3Byb3BlcnRpZXMoKSkgewotICAgICAgLy8gSWYgdGhlIGludGVyZmFjZSBzdXBwb3J0cyBpbmRleGVkIHByb3BlcnRpZXMgYW5kIHRoaXMgaXMgYW4gYXJyYXkgaW5kZXgKLSAgICAgIC8vIHByb3BlcnR5IG5hbWUsIGFuZCBpdCBpcyBhIHN1cHBvcnRlZCBwcm9wZXJ0eSBpbmRleC4KLSAgICAgIHVpbnQzMl90IGluZGV4OwotICAgICAgaWYgKElzQXJyYXlJbmRleFByb3BlcnR5TmFtZShjb250ZXh0LCBpZF92YWx1ZSwgJmluZGV4KSAmJgotICAgICAgICAgIElzU3VwcG9ydGVkSW5kZXgoY29udGV4dCwgb2JqZWN0LCBpbmRleCkpIHsKLSAgICAgICAgZGVzY3JpcHRvci5vYmplY3QoKS5zZXQob2JqZWN0KTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRHZXR0ZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rc18uZ2V0dGVyKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRBdHRyaWJ1dGVzKEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFKTsKLSAgICAgICAgaWYgKGluZGV4ZWRfcHJvcGVydHlfaG9va3NfLnNldHRlcikgewotICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0U2V0dGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3NfLnNldHRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGVzY3JpcHRvci5nZXQoKS5hdHRycyB8PSBKU1BST1BfUkVBRE9OTFk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkpIHsKLSAgICAgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7Ci0gICAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKLSAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCi0gICAgICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7Ci0gICAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgewotICAgICAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQotICAgICAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgotICAgICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChJc05hbWVkUHJvcGVydHlWaXNpYmxlKGNvbnRleHQsIG9iamVjdCwgcHJvcGVydHlfbmFtZSkpIHsKLSAgICAgICAgZGVzY3JpcHRvci5vYmplY3QoKS5zZXQob2JqZWN0KTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRBdHRyaWJ1dGVzKEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFKTsKLSAgICAgICAgZGVzY3JpcHRvci5zZXRHZXR0ZXIobmFtZWRfcHJvcGVydHlfaG9va3NfLmdldHRlcik7Ci0gICAgICAgIGlmIChuYW1lZF9wcm9wZXJ0eV9ob29rc18uc2V0dGVyKSB7Ci0gICAgICAgICAgZGVzY3JpcHRvci5zZXRTZXR0ZXIobmFtZWRfcHJvcGVydHlfaG9va3NfLnNldHRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGVzY3JpcHRvci5nZXQoKS5hdHRycyB8PSBKU1BST1BfUkVBRE9OTFk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQorICBpZiAoIUxlZ2FjeVBsYXRmb3JtT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKGNvbnRleHQsIHByb3h5LCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yKSkgeworICAgIHJldHVybiBmYWxzZTsKICAgfQotICByZXR1cm4ganM6OkRpcmVjdFByb3h5SGFuZGxlcjo6Z2V0UHJvcGVydHlEZXNjcmlwdG9yKGNvbnRleHQsIHByb3h5LCBpZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yKTsKKyAgaWYgKGRlc2NyaXB0b3Iub2JqZWN0KCkgPT0gTlVMTCkgeworICAgIHJldHVybiBqczo6RGlyZWN0UHJveHlIYW5kbGVyOjpnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29udGV4dCwgcHJveHksIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcik7CisgIH0KKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgUHJveHlIYW5kbGVyOjpkZWZpbmVQcm9wZXJ0eShKU0NvbnRleHQqIGN4LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LApAQCAtMTIwLDYgKzc0LDIxIEBACiAgIHJldHVybiBqczo6RGlyZWN0UHJveHlIYW5kbGVyOjpkZWZpbmVQcm9wZXJ0eShjeCwgcHJveHksIGlkLCBkZXNjLCByZXN1bHQpOwogfQogCitib29sIFByb3h5SGFuZGxlcjo6b3duUHJvcGVydHlLZXlzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkF1dG9JZFZlY3RvciYgcHJvcGVydGllcykgY29uc3QgeworICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvV2ViSURMLyNwcm9wZXJ0eS1lbnVtZXJhdGlvbgorICAvLyBJbmRleGVkIHByb3BlcnRpZXMgZ28gZmlyc3QsIHRoZW4gbmFtZWQgcHJvcGVydGllcywgdGhlbiBldmVyeXRoaW5nCisgIC8vIGVsc2UuCisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsIGpzOjpHZXRQcm94eVRhcmdldE9iamVjdChwcm94eSkpOworICBpZiAoc3VwcG9ydHNfaW5kZXhlZF9wcm9wZXJ0aWVzKCkpIHsKKyAgICBpbmRleGVkX3Byb3BlcnR5X2hvb2tzXy5lbnVtZXJhdGVfc3VwcG9ydGVkKGNvbnRleHQsIG9iamVjdCwgJnByb3BlcnRpZXMpOworICB9CisgIGlmIChzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkpIHsKKyAgICBuYW1lZF9wcm9wZXJ0eV9ob29rc18uZW51bWVyYXRlX3N1cHBvcnRlZChjb250ZXh0LCBvYmplY3QsICZwcm9wZXJ0aWVzKTsKKyAgfQorICByZXR1cm4ganM6OkRpcmVjdFByb3h5SGFuZGxlcjo6b3duUHJvcGVydHlLZXlzKGNvbnRleHQsIHByb3h5LCBwcm9wZXJ0aWVzKTsKK30KKwogYm9vbCBQcm94eUhhbmRsZXI6OmRlbGV0ZV8oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZUlkIGlkLCBKUzo6T2JqZWN0T3BSZXN1bHQmIHJlc3VsdCkgY29uc3QgewogICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvV2ViSURMLyNkZWxldGUKQEAgLTE5MSwyMyArMTYwLDYwIEBACiAgIHJldHVybiBqczo6RGlyZWN0UHJveHlIYW5kbGVyOjpkZWxldGVfKGNvbnRleHQsIHByb3h5LCBpZCwgcmVzdWx0KTsKIH0KIAotYm9vbCBQcm94eUhhbmRsZXI6OmVudW1lcmF0ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgcHJveHksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlT2JqZWN0IG9ianApIGNvbnN0IHsKLSAgLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSL1dlYklETC8jcHJvcGVydHktZW51bWVyYXRpb24KLSAgLy8gSW5kZXhlZCBwcm9wZXJ0aWVzIGdvIGZpcnN0LCB0aGVuIG5hbWVkIHByb3BlcnRpZXMsIHRoZW4gZXZlcnl0aGluZwotICAvLyBlbHNlLgotICBKUzo6Um9vdGVkT2JqZWN0IG9iamVjdChjb250ZXh0LCBqczo6R2V0UHJveHlUYXJnZXRPYmplY3QocHJveHkpKTsKLSAgSlM6OkF1dG9JZFZlY3RvciBwcm9wZXJ0aWVzKGNvbnRleHQpOwotICBpZiAoc3VwcG9ydHNfaW5kZXhlZF9wcm9wZXJ0aWVzKCkpIHsKLSAgICBpbmRleGVkX3Byb3BlcnR5X2hvb2tzXy5lbnVtZXJhdGVfc3VwcG9ydGVkKGNvbnRleHQsIG9iamVjdCwgJnByb3BlcnRpZXMpOworYm9vbCBQcm94eUhhbmRsZXI6OkxlZ2FjeVBsYXRmb3JtT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKAorICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwgSlM6OkhhbmRsZUlkIGlkLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlPEpTUHJvcGVydHlEZXNjcmlwdG9yPiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIGlmIChzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkgfHwgc3VwcG9ydHNfaW5kZXhlZF9wcm9wZXJ0aWVzKCkpIHsKKyAgICAvLyBDb252ZXJ0IHRoZSBpZCB0byBhIEpTVmFsdWUsIHNvIHdlIGNhbiBlYXNpbHkgY29udmVydCBpdCB0byBVaW50MzIgYW5kCisgICAgLy8gSlNTdHJpbmcuCisgICAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOworICAgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCAmaWRfdmFsdWUpKSB7CisgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsIGpzOjpHZXRQcm94eVRhcmdldE9iamVjdChwcm94eSkpOworICAgIGlmIChzdXBwb3J0c19pbmRleGVkX3Byb3BlcnRpZXMoKSkgeworICAgICAgLy8gSWYgdGhlIGludGVyZmFjZSBzdXBwb3J0cyBpbmRleGVkIHByb3BlcnRpZXMgYW5kIHRoaXMgaXMgYW4gYXJyYXkgaW5kZXgKKyAgICAgIC8vIHByb3BlcnR5IG5hbWUsIGFuZCBpdCBpcyBhIHN1cHBvcnRlZCBwcm9wZXJ0eSBpbmRleC4KKyAgICAgIHVpbnQzMl90IGluZGV4OworICAgICAgaWYgKElzQXJyYXlJbmRleFByb3BlcnR5TmFtZShjb250ZXh0LCBpZF92YWx1ZSwgJmluZGV4KSAmJgorICAgICAgICAgIElzU3VwcG9ydGVkSW5kZXgoY29udGV4dCwgb2JqZWN0LCBpbmRleCkpIHsKKyAgICAgICAgZGVzY3JpcHRvci5vYmplY3QoKS5zZXQob2JqZWN0KTsKKyAgICAgICAgZGVzY3JpcHRvci5zZXRHZXR0ZXIoaW5kZXhlZF9wcm9wZXJ0eV9ob29rc18uZ2V0dGVyKTsKKyAgICAgICAgZGVzY3JpcHRvci5zZXRBdHRyaWJ1dGVzKEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFKTsKKyAgICAgICAgaWYgKGluZGV4ZWRfcHJvcGVydHlfaG9va3NfLnNldHRlcikgeworICAgICAgICAgIGRlc2NyaXB0b3Iuc2V0U2V0dGVyKGluZGV4ZWRfcHJvcGVydHlfaG9va3NfLnNldHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVzY3JpcHRvci5nZXQoKS5hdHRycyB8PSBKU1BST1BfUkVBRE9OTFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIGlmIChzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkpIHsKKyAgICAgIHN0ZDo6c3RyaW5nIHByb3BlcnR5X25hbWU7CisgICAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbl9zdGF0ZShjb250ZXh0KTsKKyAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIGlkX3ZhbHVlLCBrTm9Db252ZXJzaW9uRmxhZ3MsICZleGNlcHRpb25fc3RhdGUsCisgICAgICAgICAgICAgICAgICAmcHJvcGVydHlfbmFtZSk7CisgICAgICBpZiAoZXhjZXB0aW9uX3N0YXRlLmlzX2V4Y2VwdGlvbl9zZXQoKSkgeworICAgICAgICAvLyBUaGUgSUQgc2hvdWxkIGJlIGFuIGludGVnZXIgb3IgYSBzdHJpbmcsIHNvIHdlIHNob3VsZG4ndCBoYXZlIGFueQorICAgICAgICAvLyBleGNlcHRpb25zIGNvbnZlcnRpbmcgdG8gc3RyaW5nLgorICAgICAgICBOT1RSRUFDSEVEKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChJc05hbWVkUHJvcGVydHlWaXNpYmxlKGNvbnRleHQsIG9iamVjdCwgcHJvcGVydHlfbmFtZSkpIHsKKyAgICAgICAgZGVzY3JpcHRvci5vYmplY3QoKS5zZXQob2JqZWN0KTsKKyAgICAgICAgZGVzY3JpcHRvci5zZXRBdHRyaWJ1dGVzKEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfRU5VTUVSQVRFKTsKKyAgICAgICAgZGVzY3JpcHRvci5zZXRHZXR0ZXIobmFtZWRfcHJvcGVydHlfaG9va3NfLmdldHRlcik7CisgICAgICAgIGlmIChuYW1lZF9wcm9wZXJ0eV9ob29rc18uc2V0dGVyKSB7CisgICAgICAgICAgZGVzY3JpcHRvci5zZXRTZXR0ZXIobmFtZWRfcHJvcGVydHlfaG9va3NfLnNldHRlcik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVzY3JpcHRvci5nZXQoKS5hdHRycyB8PSBKU1BST1BfUkVBRE9OTFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQogICB9Ci0gIGlmIChzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkpIHsKLSAgICBuYW1lZF9wcm9wZXJ0eV9ob29rc18uZW51bWVyYXRlX3N1cHBvcnRlZChjb250ZXh0LCBvYmplY3QsICZwcm9wZXJ0aWVzKTsKLSAgfQotICBjb25zdCBib29sIGdldF9wcm9wZXJ0eV9rZXlzX3N1Y2Nlc3MgPQotICAgICAganM6OkdldFByb3BlcnR5S2V5cyhjb250ZXh0LCBvYmplY3QsIDAsICZwcm9wZXJ0aWVzKTsKLSAgRENIRUNLKGdldF9wcm9wZXJ0eV9rZXlzX3N1Y2Nlc3MpOwotICByZXR1cm4ganM6OkVudW1lcmF0ZWRJZFZlY3RvclRvSXRlcmF0b3IoY29udGV4dCwgcHJveHksIDAsIHByb3BlcnRpZXMsIG9ianApOworICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBQcm94eUhhbmRsZXI6OklzQXJyYXlJbmRleFByb3BlcnR5TmFtZShKU0NvbnRleHQqIGNvbnRleHQsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9wcm94eV9oYW5kbGVyLmgKaW5kZXggYWVhNTkzYy4uODc4MWU0YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvcHJveHlfaGFuZGxlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3Byb3h5X2hhbmRsZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfUFJPWFlfSEFORExFUl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1BST1hZX0hBTkRMRVJfSF8KIApAQCAtODUsMzEgKzgzLDMyIEBACiAgIFByb3h5SGFuZGxlcihjb25zdCBJbmRleGVkUHJvcGVydHlIb29rcyYgaW5kZXhlZF9ob29rcywKICAgICAgICAgICAgICAgIGNvbnN0IE5hbWVkUHJvcGVydHlIb29rcyYgbmFtZWRfaG9va3MpOwogCi0gIC8vIE92ZXJyaWRkZW4gZnVuZGFtZW50YWwgdHJhcHMuCi0gIGJvb2wgZ2V0UHJvcGVydHlEZXNjcmlwdG9yKAorICAvLyBPdmVycmlkZGVuIHN0YW5kYXJkIGludGVybmFsIG1ldGhvZHMuCisgIGJvb2wgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKAogICAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgICBKUzo6TXV0YWJsZUhhbmRsZTxKU1Byb3BlcnR5RGVzY3JpcHRvcj4gZGVzY3JpcHRvcikgY29uc3QgT1ZFUlJJREU7Ci0gIGJvb2wgZGVsZXRlXyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgcHJveHksIEpTOjpIYW5kbGVJZCBpZCwKLSAgICAgICAgICAgICAgIEpTOjpPYmplY3RPcFJlc3VsdCYgcmVzdWx0KSAgLy8gTk9MSU5UKHJ1bnRpbWUvcmVmZXJlbmNlcykKLSAgICAgIGNvbnN0IE9WRVJSSURFOwotICBib29sIGVudW1lcmF0ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgcHJveHksCi0gICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlT2JqZWN0IG9ianApIGNvbnN0IE9WRVJSSURFOworCiAgIGJvb2wgZGVmaW5lUHJvcGVydHkoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LAogICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVJZCBpZCwKICAgICAgICAgICAgICAgICAgICAgICBqczo6SGFuZGxlPEpTUHJvcGVydHlEZXNjcmlwdG9yPiBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgIEpTOjpPYmplY3RPcFJlc3VsdCYgcmVzdWx0ICAvLyBOT0xJTlRbcnVudGltZS9yZWZlcmVuY2VzXQogICAgICAgICAgICAgICAgICAgICAgICkgY29uc3QgT1ZFUlJJREU7ICAgICAgICAgICAvLyBOT0xJTlRbd2hpdGVzcGFjZS9wYXJlbnNdCi0gIGJvb2wgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKAotICAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LCBKUzo6SGFuZGxlSWQgaWQsCi0gICAgICBKUzo6TXV0YWJsZUhhbmRsZTxKU1Byb3BlcnR5RGVzY3JpcHRvcj4gZGVzY3JpcHRvcikgY29uc3QgT1ZFUlJJREUgewotICAgIHJldHVybiBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoY29udGV4dCwgcHJveHksIGlkLCBkZXNjcmlwdG9yKTsKKyAgYm9vbCBvd25Qcm9wZXJ0eUtleXMoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LAorICAgICAgICAgICAgICAgICAgICAgICBKUzo6QXV0b0lkVmVjdG9yJiBwcm9wZXJ0aWVzKSBjb25zdCBPVkVSUklERTsgLy8gTk9MSU5UW3J1bnRpbWUvcmVmZXJlbmNlc10KKyAgYm9vbCBkZWxldGVfKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwgSlM6OkhhbmRsZUlkIGlkLAorICAgICAgICAgICAgICAgSlM6Ok9iamVjdE9wUmVzdWx0JiByZXN1bHQpICAvLyBOT0xJTlQocnVudGltZS9yZWZlcmVuY2VzKQorICAgICAgY29uc3QgT1ZFUlJJREU7CisKKyAgLy8gU3RhbmRhcmQgbWV0aG9kcyB0aGF0IHdlcmUgb3ZlcnJpZGRlbiBpbiBEaXJlY3RQcm94eUhhbmRsZXIuIFRoZXNlIGFyZQorICAvLyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgc3RhbmRhcmQgaW50ZXJuYWwgbWV0aG9kcyBpbiBCYXNlUHJveHlIYW5kbGVyCisgIC8vIHNvIGVuc3VyZSB0aGF0IHdlIHVzZSB0aG9zZSwgc28gd2UgZG9uJ3QgaGF2ZSB0byBvdmVycmlkZSBhbGwgb2YgdGhlc2UuCisgIC8vIFRPRE86IENvbnNpZGVyIG92ZXJyaWRpbmcgc29tZSBvZiB0aGVzZSBhcyBwZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGlmCisgIC8vIG5lY2Vzc2FyeS4KKyAgYm9vbCBlbnVtZXJhdGUoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LAorICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZU9iamVjdCBvYmpwKSBjb25zdCBPVkVSUklERSB7CisgICAgcmV0dXJuIGpzOjpCYXNlUHJveHlIYW5kbGVyOjplbnVtZXJhdGUoY29udGV4dCwgcHJveHksIG9ianApOwogICB9CiAKLSAgLy8gVGhlIGRlcml2ZWQgdHJhcHMgaW4ganM6OkRpcmVjdFByb3h5SGFuZGxlciBhcmUgbm90IGltcGxlbWVudGVkIGluIHRlcm1zIG9mCi0gIC8vIHRoZSBmdW5kYW1lbnRhbCB0cmFwcywgd2hlcmUgdGhlIHRyYXBzIGluIGpzOjpCYXNlUHJveHlIYW5kbGVyIGFyZS4KLSAgLy8gUmVkZWZpbmluZyB0aGUgZGVyaXZlZCB0cmFwcyB0byBiZSBpbiB0ZXJtcyBvZiB0aGUgZnVuZGFtZW50YWwgdHJhcHMgbWVhbnMKLSAgLy8gdGhhdCB3ZSBvbmx5IG5lZWQgdG8gb3ZlcnJpZGUgdGhlIGZ1bmRhbWVudGFsIHRyYXBzIHdoZW4gaW1wbGVtZW50aW5nCi0gIC8vIGN1c3RvbSBiZWhhdmlvciBmb3IgaS5lLiBpbnRlcmZhY2VzIHRoYXQgc3VwcG9ydCBuYW1lZCBwcm9wZXJ0aWVzLgogICBib29sIGhhcyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgcHJveHksIEpTOjpIYW5kbGVJZCBpZCwKICAgICAgICAgICAgYm9vbCogYnApIGNvbnN0IE9WRVJSSURFIHsKICAgICByZXR1cm4ganM6OkJhc2VQcm94eUhhbmRsZXI6Omhhcyhjb250ZXh0LCBwcm94eSwgaWQsIGJwKTsKQEAgLTEyNyw5ICsxMjYsMzQgQEAKICAgICByZXR1cm4ganM6OkJhc2VQcm94eUhhbmRsZXI6OnNldChjb250ZXh0LCBwcm94eSwgaWQsIHYsIHJlY2VpdmVyLCByZXN1bHQpOwogICB9CiAKKyAgLy8gU3BpZGVyTW9ua2V5IGV4dGVuc2lvbnMgdGhhdCBzaG91bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUKKyAgLy8gc3RhbmRhcmQgbWV0aG9kcywgYXMgZGVzY3JpYmVkIGFib3ZlLgorICBib29sIGdldFByb3BlcnR5RGVzY3JpcHRvcigKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwgSlM6OkhhbmRsZUlkIGlkLAorICAgICAgSlM6Ok11dGFibGVIYW5kbGU8SlNQcm9wZXJ0eURlc2NyaXB0b3I+IGRlc2NyaXB0b3IpIGNvbnN0IE9WRVJSSURFIHsKKyAgICByZXR1cm4ganM6OkJhc2VQcm94eUhhbmRsZXI6OmdldFByb3BlcnR5RGVzY3JpcHRvcihjb250ZXh0LCBwcm94eSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcik7CisgIH0KKyAgYm9vbCBoYXNPd24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgICAgICAgICAgIGJvb2wqIGJwKSBjb25zdCBPVkVSUklERSB7CisgICAgcmV0dXJuIGpzOjpCYXNlUHJveHlIYW5kbGVyOjpoYXNPd24oY29udGV4dCwgcHJveHksIGlkLCBicCk7CisgIH0KKyAgYm9vbCBnZXRPd25FbnVtZXJhYmxlUHJvcGVydHlLZXlzKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpBdXRvSWRWZWN0b3ImIHByb3BzKSBjb25zdCBPVkVSUklERSB7ICAvLyBOT0xJTlRbcnVudGltZS9yZWZlcmVuY2VzXQorICAgIHJldHVybiBqczo6QmFzZVByb3h5SGFuZGxlcjo6Z2V0T3duRW51bWVyYWJsZVByb3BlcnR5S2V5cyhjb250ZXh0LCBwcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvcHMpOworICB9CisKICAgYm9vbCBoYXNfY3VzdG9tX3Byb3BlcnR5KCkgY29uc3QgeyByZXR1cm4gaGFzX2N1c3RvbV9wcm9wZXJ0eV87IH0KIAogIHByaXZhdGU6CisgIC8vIGh0dHBzOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI0xlZ2FjeVBsYXRmb3JtT2JqZWN0R2V0T3duUHJvcGVydHkKKyAgLy8gVGhpcyBpcyB1c2VkIHRvIHN1cHBvcnQgbmFtZWQgYW5kIGluZGV4ZWQgcHJvcGVydGllcy4KKyAgLy8gUmV0dXJucyBmYWxzZSBvbiBmYWlsdXJlLgorICBib29sIExlZ2FjeVBsYXRmb3JtT2JqZWN0R2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKAorICAgICAgSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LCBKUzo6SGFuZGxlSWQgaWQsCisgICAgICBKUzo6TXV0YWJsZUhhbmRsZTxKU1Byb3BlcnR5RGVzY3JpcHRvcj4gZGVzY3JpcHRvcikgY29uc3Q7CisKICAgYm9vbCBzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkgY29uc3QgewogICAgIHJldHVybiBuYW1lZF9wcm9wZXJ0eV9ob29rc18uZ2V0dGVyICE9IE5VTEw7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3JlZmVyZW5jZWRfb2JqZWN0X21hcC5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3JlZmVyZW5jZWRfb2JqZWN0X21hcC5jYwppbmRleCAyYzU1MDU1Li40YmFjMzhmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS9yZWZlcmVuY2VkX29iamVjdF9tYXAuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmNjCkBAIC0xLDIzICsxLDI1IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgiCiAKICNpbmNsdWRlIDx1dGlsaXR5PgogCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmgiCisjaW5jbHVkZSAibmIvbWVtb3J5X3Njb3BlLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNjcmlwdCB7CiBuYW1lc3BhY2UgbW96anMgewpAQCAtMjcsMjIgKzI5LDI1IEBACiAKIC8vIEFkZC9SZW1vdmUgYSByZWZlcmVuY2UgZnJvbSBhIFdyYXBwZXJQcml2YXRlIHRvIGEgSlNWYWx1ZS4KIHZvaWQgUmVmZXJlbmNlZE9iamVjdE1hcDo6QWRkUmVmZXJlbmNlZE9iamVjdChpbnRwdHJfdCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCByZWZlcmVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZVZhbHVlIHJlZmVyZWUpIHsKKyAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgRENIRUNLKHJlZmVyZWUpOworICBEQ0hFQ0soIXJlZmVyZWUuaXNOdWxsT3JVbmRlZmluZWQoKSk7CisgIERDSEVDSyhyZWZlcmVlLmlzR0NUaGluZygpKTsKICAgcmVmZXJlbmNlZF9vYmplY3RzXy5pbnNlcnQoCiAgICAgICBzdGQ6Om1ha2VfcGFpcihrZXksIFdlYWtIZWFwT2JqZWN0KGNvbnRleHRfLCByZWZlcmVlKSkpOwogfQogCiB2b2lkIFJlZmVyZW5jZWRPYmplY3RNYXA6OlJlbW92ZVJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgcmVmZXJlZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVWYWx1ZSByZWZlcmVlKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKICAgc3RkOjpwYWlyPFJlZmVyZW5jZWRPYmplY3RNdWx0aU1hcDo6aXRlcmF0b3IsCiAgICAgICAgICAgICBSZWZlcmVuY2VkT2JqZWN0TXVsdGlNYXA6Oml0ZXJhdG9yPiBwYWlyX3JhbmdlID0KICAgICAgIHJlZmVyZW5jZWRfb2JqZWN0c18uZXF1YWxfcmFuZ2Uoa2V5KTsKICAgZm9yIChSZWZlcmVuY2VkT2JqZWN0TXVsdGlNYXA6Oml0ZXJhdG9yIGl0ID0gcGFpcl9yYW5nZS5maXJzdDsKICAgICAgICBpdCAhPSBwYWlyX3JhbmdlLnNlY29uZDsgKytpdCkgewotICAgIGlmIChpdC0+c2Vjb25kLkdldCgpID09IHJlZmVyZWUpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgZWxlbWVudChjb250ZXh0XywgaXQtPnNlY29uZC5HZXRWYWx1ZSgpKTsKKyAgICBpZiAodXRpbDo6SXNTYW1lR2NUaGluZyhjb250ZXh0XywgcmVmZXJlZSwgZWxlbWVudCkpIHsKICAgICAgIC8vIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBtYXBwaW5ncyBiZXR3ZWVuIGEgc3BlY2lmaWMgb3duZXIgYW5kIGEgSlMKICAgICAgIC8vIG9iamVjdC4gT25seSByZW1vdmUgdGhlIGZpcnN0IG1hcHBpbmcuCiAgICAgICByZWZlcmVuY2VkX29iamVjdHNfLmVyYXNlKGl0KTsKQEAgLTY5LDExICs3NCwxMiBAQAogICBmb3IgKFJlZmVyZW5jZWRPYmplY3RNdWx0aU1hcDo6aXRlcmF0b3IgaXQgPSByZWZlcmVuY2VkX29iamVjdHNfLmJlZ2luKCk7CiAgICAgICAgaXQgIT0gcmVmZXJlbmNlZF9vYmplY3RzXy5lbmQoKTsKICAgICAgICAvKkluY3JlbWVudGVkIGluIHRoZSBsb29wICovKSB7Ci0gICAgaWYgKGl0LT5zZWNvbmQuR2V0KCkpIHsKLSAgICAgICsraXQ7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoaXQtPnNlY29uZC5XYXNDb2xsZWN0ZWQoKSkgewogICAgICAgUmVmZXJlbmNlZE9iamVjdE11bHRpTWFwOjppdGVyYXRvciBlcmFzZV9pdGVyYXRvciA9IGl0Kys7CiAgICAgICByZWZlcmVuY2VkX29iamVjdHNfLmVyYXNlKGVyYXNlX2l0ZXJhdG9yKTsKKyAgICB9IGVsc2UgeworICAgICAgRENIRUNLKGl0LT5zZWNvbmQuSXNHY1RoaW5nKCkpOworICAgICAgKytpdDsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3JlZmVyZW5jZWRfb2JqZWN0X21hcC5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgKaW5kZXggYmQyOGNmOS4uZTBkZjA1YSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1JFRkVSRU5DRURfT0JKRUNUX01BUF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1JFRkVSRU5DRURfT0JKRUNUX01BUF9IXwogCkBAIC00Myw4ICs0MSw4IEBACiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHdyYXBwYWJsZSk7CiAgIH0KIAotICB2b2lkIEFkZFJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LCBKUzo6SGFuZGxlT2JqZWN0IHJlZmVyZWUpOwotICB2b2lkIFJlbW92ZVJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LCBKUzo6SGFuZGxlT2JqZWN0IHJlZmVyZWUpOworICB2b2lkIEFkZFJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LCBKUzo6SGFuZGxlVmFsdWUgcmVmZXJlZSk7CisgIHZvaWQgUmVtb3ZlUmVmZXJlbmNlZE9iamVjdChpbnRwdHJfdCBrZXksIEpTOjpIYW5kbGVWYWx1ZSByZWZlcmVlKTsKIAogICAvLyBUcmFjZSBhbGwgb2JqZWN0cyByZWZlcmVuY2VkIGZyb20gdGhpcyBXcmFwcGVyUHJpdmF0ZSouCiAgIHZvaWQgVHJhY2VSZWZlcmVuY2VkT2JqZWN0cyhKU1RyYWNlciogdHJhY2UsIGludHB0cl90IGtleSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdHlwZV90cmFpdHMuaAppbmRleCAwNWJiNTg5Li5kNjg1ZmQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS90eXBlX3RyYWl0cy5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3R5cGVfdHJhaXRzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfVFlQRV9UUkFJVFNfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9UWVBFX1RSQUlUU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ZvcndhcmQuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3VuaW9uX3R5cGVfY29udmVyc2lvbl9mb3J3YXJkLmgKaW5kZXggNjAwMzk3NS4uMjQ3MWM3MyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ZvcndhcmQuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oCkBAIC0yLDIxICsyLDE5IEBACiAvLyAgICAgcHVtcC5weSB1bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oLnB1bXAKIC8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKIAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9VTklPTl9UWVBFX0NPTlZFUlNJT05fRk9SV0FSRF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1VOSU9OX1RZUEVfQ09OVkVSU0lPTl9GT1JXQVJEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oLnB1bXAgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oLnB1bXAKaW5kZXggYjdiODgyNS4uYTcwYTFlZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ZvcndhcmQuaC5wdW1wCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3VuaW9uX3R5cGVfY29udmVyc2lvbl9mb3J3YXJkLmgucHVtcApAQCAtNywyMSArNywxOSBAQAogCiAkJCBNYXhpbXVtIG51bWJlciBvZiBkaWZmZXJlbnQgbWVtYmVyIHR5cGVzIGluIGEgdW5pb24uCiAkdmFyIE1BWF9NRU1CRVJTID0gNAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9VTklPTl9UWVBFX0NPTlZFUlNJT05fRk9SV0FSRF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1VOSU9OX1RZUEVfQ09OVkVSU0lPTl9GT1JXQVJEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91bmlvbl90eXBlX2NvbnZlcnNpb25faW1wbC5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ltcGwuaAppbmRleCBjMmEyZTkwLi4xNGU1MTE3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91bmlvbl90eXBlX2NvbnZlcnNpb25faW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3VuaW9uX3R5cGVfY29udmVyc2lvbl9pbXBsLmgKQEAgLTIsMjEgKzIsMTkgQEAKIC8vICAgICBwdW1wLnB5IHVuaW9uX3R5cGVfY29udmVyc2lvbl9pbXBsLmgucHVtcAogLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQogCi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1VOSU9OX1RZUEVfQ09OVkVSU0lPTl9JTVBMX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfVU5JT05fVFlQRV9DT05WRVJTSU9OX0lNUExfSF8KQEAgLTM2LDggKzM0LDEwIEBACiBuYW1lc3BhY2UgbW96anMgewogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVDEsIHR5cGVuYW1lIFQyPgotdm9pZCBUb0pTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBzY3JpcHQ6OlVuaW9uVHlwZTI8VDEsIFQyPiYgaW5fdW5pb24sCi0gICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgewordm9pZCBUb0pTVmFsdWUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIGNvbnN0IHNjcmlwdDo6VW5pb25UeXBlMjxUMSwgVDI+JiBpbl91bmlvbiwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgewogICBpZiAoaW5fdW5pb24udGVtcGxhdGUgSXNUeXBlPFQxPigpKSB7CiAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIGluX3VuaW9uLnRlbXBsYXRlIEFzVHlwZTxUMT4oKSwgb3V0X3ZhbHVlKTsKICAgICByZXR1cm47CkBAIC01OCw0MCArNTgsNTEgQEAKICAgLy8gSlMgLT4gSURMIHR5cGUgY29udmVyc2lvbiBwcm9jZWR1cmUgZGVzY3JpYmVkIGhlcmU6CiAgIC8vIGh0dHA6Ly9oZXljYW0uZ2l0aHViLmlvL3dlYmlkbC8jZXMtdW5pb24KIAotICAvLyAxLiBJZiB0aGUgdW5pb24gdHlwZSBpbmNsdWRlcyBhIG51bGxhYmxlIHR5cGUgYW5kIFYgaXMgbnVsbCBvciB1bmRlZmluZWQsCisgIC8vIFRPRE86IFN1cHBvcnQgRGF0ZSwgUmVnRXhwLCBET01FeGNlcHRpb24sIEVycm9yLCBBcnJheUJ1ZmZlciwgRGF0YVZpZXcsCisgIC8vICAgICAgIFR5cGVkQXJyYXlOYW1lLCBjYWxsYmFjayBmdW5jdGlvbnMsIGRpY3Rpb25hcnkuCisKKyAgLy8gMS4gSWYgdGhlIHVuaW9uIHR5cGUgaW5jbHVkZXMgYSBudWxsYWJsZSB0eXBlIGFuZCB8VnwgaXMgbnVsbCBvciB1bmRlZmluZWQsCiAgIC8vIHRoZW4gcmV0dXJuIHRoZSBJREwgdmFsdWUgbnVsbC4KICAgaWYgKHZhbHVlLmlzTnVsbCgpIHx8IHZhbHVlLmlzVW5kZWZpbmVkKCkpIHsKLSAgICAvLyBJZiB0aGUgdHlwZSB3YXMgbnVsbGFibGUgb3IgdW5kZWZpbmVkLCB3ZSBzaG91bGQgaGF2ZSBjYXVnaHQgdGhhdCBhcyBhCi0gICAgLy8gcGFydCBvZiB0aGUgYmFzZTo6b3B0aW9uYWw8VD4gY29udmVyc2lvbi4KLSAgICBOT1RSRUFDSEVEKCk7CisgICAgLy8gU2luY2UgdGhlIG51bGxhYmlsaXR5IHNob3VsZCBoYXZlIGJlZW4gZGV0ZWN0ZWQgYnkgdGhlIGNvbnZlcnNpb24gZm9yCisgICAgLy8gYmFzZTo6b3B0aW9uYWwsIHdlIHNob3VsZCB0aHJvdywgYmVjYXVzZSBpZiB3ZSBnZXQgaGVyZSBpdCBtZWFucyB0aGUKKyAgICAvLyB1bmlvbiBkb2VzIG5vdCBpbmNsdWRlIGEgbnVsbGFibGUgdHlwZSwgYnV0IGhhdmUgYmVlbiBwYXNzZWQgYSBudWxsCisgICAgLy8gdmFsdWUuCisgICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa05vdFVuaW9uVHlwZSk7CiAgICAgcmV0dXJuOwogICB9CisKICAgLy8gVHlwZWRlZiBmb3IgcmVhZGFiaWxpdHkuCiAgIHR5cGVkZWYgOjpjb2JhbHQ6OnNjcmlwdDo6aW50ZXJuYWw6OlVuaW9uVHlwZVRyYWl0czxUMT4gVW5pb25UeXBlVHJhaXRzVDE7CiAgIHR5cGVkZWYgOjpjb2JhbHQ6OnNjcmlwdDo6aW50ZXJuYWw6OlVuaW9uVHlwZVRyYWl0czxUMj4gVW5pb25UeXBlVHJhaXRzVDI7CiAKKyAgLy8gMi4gTGV0IHx0eXBlc3wgYmUgdGhlIGZsYXR0ZW5lZCBtZW1iZXIgdHlwZXMgb2YgdGhlIHVuaW9uIHR5cGUuCiAgIC8vIEZvcndhcmQgZGVjbGFyZSBhbGwgcG90ZW50aWFsIHR5cGVzCiAgIFQxIHQxOwogICBUMiB0MjsKIAotICAvLyAzLjEgSWYgdHlwZXMgaW5jbHVkZXMgYW4gaW50ZXJmYWNlIHR5cGUgdGhhdCBWIGltcGxlbWVudHMsIHRoZW4gcmV0dXJuIHRoZQotICAvLyAgICAgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBWLgotICAvLyAzLjIgSWYgdHlwZXMgaW5jbHVkZXMgb2JqZWN0LCB0aGVuIHJldHVybiB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UKLSAgLy8gICAgIHRvIHRoZSBvYmplY3QgVi4KLSAgLy8KLSAgLy8gVGhlIHNwZWNpZmljYXRpb24gZG9lc24ndCBkaWN0YXRlIHdoYXQgc2hvdWxkIGhhcHBlbiBpZiBWIGltcGxlbWVudHMgbW9yZQotICAvLyB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UgQiBhbmQKLSAgLy8gaW50ZXJmYWNlIEIgaW5oZXJpdHMgZnJvbSBpbnRlcmZhY2UgQSwgd2hhdCBoYXBwZW5zIGlmIGJvdGggQSBhbmQgQiBhcmUKLSAgLy8gdW5pb24gbWVtYmVycz8gQmxpbmsgZG9lc24ndCBzZWVtIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoaXMgY2FzZS4KLSAgLy8gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdCBtYXRjaGVzLgorICAvLyA0LiBJZiB8VnwgaXMgYSBwbGF0Zm9ybSBvYmplY3QsIHRoZW46CisgIC8vICAgMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhbiBpbnRlcmZhY2UgdHlwZSB0aGF0IFYgaW1wbGVtZW50cywgdGhlbiByZXR1cm4KKyAgLy8gICAgICB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB8VnwuCisgIC8vICAgMi4gSWYgfHR5cGVzfCBpbmNsdWRlcyBvYmplY3QsIHRoZW4gcmV0dXJuIHRoZSBJREwgdmFsdWUgdGhhdCBpcyBhCisgIC8vICAgICAgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgfFZ8LgogICBpZiAodmFsdWUuaXNPYmplY3QoKSkgeworICAgIC8vIFRoZSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgZGljdGF0ZSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgViBpbXBsZW1lbnRzCisgICAgLy8gbW9yZSB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UKKyAgICAvLyBCIGFuZCBpbnRlcmZhY2UgQiBpbmhlcml0cyBmcm9tIGludGVyZmFjZSBBLCB3aGF0IGhhcHBlbnMgaWYgYm90aCBBIGFuZAorICAgIC8vIEIgYXJlIHVuaW9uIG1lbWJlcnM/IEJsaW5rIGRvZXNuJ3Qgc2VlbSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzCisgICAgLy8gY2FzZS4gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdAorICAgIC8vIG1hdGNoZXMuCisKICAgICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9vYmplY3QoY29udGV4dCk7CiAgICAgYm9vbCBzdWNjZXNzID0gSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB2YWx1ZSwgJnJvb3RlZF9vYmplY3QpOwogICAgIERDSEVDSyhzdWNjZXNzKTsKKwogICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CiAgICAgY29uc3QgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9CiAgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisKICAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX2ludGVyZmFjZV90eXBlICYmCiAgICAgICAgIHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKICAgICAgICAgICAgIHJvb3RlZF9vYmplY3QsIFVuaW9uVHlwZVRyYWl0c1QxOjpHZXRUeXBlSUQoKSkpIHsKQEAgLTk5LDYgKzExMCw3IEBACiAgICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGUyPFQxLCBUMj4odDEpOwogICAgICAgcmV0dXJuOwogICAgIH0KKwogICAgIGlmIChVbmlvblR5cGVUcmFpdHNUMjo6aXNfaW50ZXJmYWNlX3R5cGUgJiYKICAgICAgICAgd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAogICAgICAgICAgICAgcm9vdGVkX29iamVjdCwgVW5pb25UeXBlVHJhaXRzVDI6OkdldFR5cGVJRCgpKSkgewpAQCAtMTA4LDEyICsxMjAsMjggQEAKICAgICB9CiAgIH0KIAotICAvLyBUT0RPOiBTdXBwb3J0IERhdGUsIFJlZ0V4cCwgRE9NRXhjZXB0aW9uLCBFcnJvciwgQXJyYXlCdWZmZXIsIERhdGFWaWV3LAotICAvLyAgICAgICBUeXBlZEFycmF5TmFtZSwgY2FsbGJhY2sgZnVuY3Rpb25zLCBkaWN0aW9uYXJ5LCBhcnJheSB0eXBlLgotICAvLyAgICAgICBBbmQgc2VxdWVuY2VzIGlmIG5lY2Vzc2FyeS4KKyAgLy8gMTEuIElmIHxUeXBlKFYpfCBpcyBPYmplY3QsIHRoZW46CisgIC8vICAgMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIHNlcXVlbmNlIHR5cGUsIHRoZW4KKyAgLy8gICAgIDEuIExldCB8bWV0aG9kfCBiZSB0aGUgcmVzdWx0IG9mIEdldE1ldGhvZChWLCBAQGl0ZXJhdG9yKQorICAvLyAgICAgMi4gUmV0dXJuSWZBYnJ1cHQobWV0aG9kKQorICAvLyAgICAgMy4gSWYgbWV0aG9kIGlzIG5vdCB1bmRlZmluZWQsIHJldHVybiB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgc2VxdWVuY2UKKyAgLy8gICAgICAgIG9mIHRoYXQgdHlwZSBmcm9tIHxWfCBhbmQgfG1ldGhvZHwuCisgIGlmICh2YWx1ZS5pc09iamVjdCgpKSB7CisgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QxOjppc19zZXF1ZW5jZV90eXBlKSB7CisgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDEpOworICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMjxUMSwgVDI+KHQxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgLy8gMTQuIElmIFYgaXMgYSBCb29sZWFuIHZhbHVlLCB0aGVuOgotICAvLyAgIDEuIElmIHR5cGVzIGluY2x1ZGVzIGEgYm9vbGVhbiwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIFYKKyAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDI6OmlzX3NlcXVlbmNlX3R5cGUpIHsKKyAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0Mik7CisgICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGUyPFQxLCBUMj4odDIpOworICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIDEyLiBJZiB8VHlwZShWKXwgaXMgQm9vbGVhbiwgdGhlbjoKKyAgLy8gMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIGJvb2xlYW4sIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB8VnwKICAgLy8gICAgICB0byBib29sZWFuLgogICBpZiAodmFsdWUuaXNCb29sZWFuKCkpIHsKICAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX2Jvb2xlYW5fdHlwZSkgewpAQCAtMTI5LDkgKzE1Nyw5IEBACiAgICAgfQogICB9CiAKLSAgLy8gMTUuIElmIFYgaXMgYSBOdW1iZXIgdmFsdWUsIHRoZW46Ci0gIC8vICAgMS4gSWYgdHlwZXMgaW5jbHVkZXMgYSBudW1lcmljIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZwotICAvLyAgICAgIFYgdG8gdGhhdCBudW1lcmljIHR5cGUuCisgIC8vIDEzLiBJZiB8VHlwZShWKXwgaXMgYSBOdW1iZXIsIHRoZW46CisgIC8vICAgMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIG51bWVyaWMgdHlwZSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZgorICAvLyAgICAgIGNvbnZlcnRpbmcgfFZ8IHRvIHRoYXQgbnVtZXJpYyB0eXBlLgogICBpZiAodmFsdWUuaXNOdW1iZXIoKSkgewogICAgIGlmIChVbmlvblR5cGVUcmFpdHNUMTo6aXNfbnVtZXJpY190eXBlKSB7CiAgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDEpOwpAQCAtMTQ2LDggKzE3NCw4IEBACiAgICAgfQogICB9CiAKLSAgLy8gMTYuIElmIHR5cGVzIGluY2x1ZGVzIGEgc3RyaW5nIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBWCi0gIC8vIHRvIHRoYXQgdHlwZS4KKyAgLy8gMTQuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBzdHJpbmcgdHlwZSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nCisgIC8vICAgICB8VnwgdG8gdGhhdCB0eXBlLgogICBpZiAodmFsdWUuaXNTdHJpbmcoKSkgewogICAgIGlmIChVbmlvblR5cGVUcmFpdHNUMTo6aXNfc3RyaW5nX3R5cGUpIHsKICAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0MSk7CkBAIC0xNjIsMzggKzE5MCw0MyBAQAogICAgIH0KICAgfQogCi0gIC8vIDE3LiBJZiB0eXBlcyBpbmNsdWRlcyBhIG51bWVyaWMgdHlwZSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nCi0gIC8vIFYgdG8gdGhhdCBudW1lcmljIHR5cGUuCisgIC8vIDE1LiBJZiB8dHlwZXN8IGluY2x1ZGVzIGEgbnVtZXJpYyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mCisgIC8vICAgICBjb252ZXJ0aW5nIHxWfCB0byB0aGF0IG51bWVyaWMgdHlwZS4KICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QxOjppc19udW1lcmljX3R5cGUpIHsKICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDEpOwogICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTI8VDEsIFQyPih0MSk7CiAgICAgcmV0dXJuOwogICB9CisKICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QyOjppc19udW1lcmljX3R5cGUpIHsKICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDIpOwogICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTI8VDEsIFQyPih0Mik7CiAgICAgcmV0dXJuOwogICB9Ci0gIC8vIDE4LiBJZiB0eXBlcyBpbmNsdWRlcyBhIGJvb2xlYW4sIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBWIHRvCi0gIC8vIGJvb2xlYW4uCisKKyAgLy8gMTYuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBib29sZWFuLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgfFZ8CisgIC8vICAgICB0byBib29sZWFuLgogICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX2Jvb2xlYW5fdHlwZSkgewogICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0MSk7CiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMjxUMSwgVDI+KHQxKTsKICAgICByZXR1cm47CiAgIH0KKwogICBpZiAoVW5pb25UeXBlVHJhaXRzVDI6OmlzX2Jvb2xlYW5fdHlwZSkgewogICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0Mik7CiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMjxUMSwgVDI+KHQyKTsKICAgICByZXR1cm47CiAgIH0KLSAgLy8gMTkuIFRocm93IGEgVHlwZUVycm9yLgorCisgIC8vIDE3LiBUaHJvdyBhIFR5cGVFcnJvci4KICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa05vdFVuaW9uVHlwZSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUMSwgdHlwZW5hbWUgVDIsIHR5cGVuYW1lIFQzPgotdm9pZCBUb0pTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0OjpVbmlvblR5cGUzPFQxLCBUMiwgVDM+JiBpbl91bmlvbiwKLSAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKSB7Cit2b2lkIFRvSlNWYWx1ZSgKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgY29uc3Qgc2NyaXB0OjpVbmlvblR5cGUzPFQxLCBUMiwgVDM+JiBpbl91bmlvbiwKKyAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgewogICBpZiAoaW5fdW5pb24udGVtcGxhdGUgSXNUeXBlPFQxPigpKSB7CiAgICAgVG9KU1ZhbHVlKGNvbnRleHQsIGluX3VuaW9uLnRlbXBsYXRlIEFzVHlwZTxUMT4oKSwgb3V0X3ZhbHVlKTsKICAgICByZXR1cm47CkBAIC0yMTgsNDIgKzI1MSw1MyBAQAogICAvLyBKUyAtPiBJREwgdHlwZSBjb252ZXJzaW9uIHByb2NlZHVyZSBkZXNjcmliZWQgaGVyZToKICAgLy8gaHR0cDovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNlcy11bmlvbgogCi0gIC8vIDEuIElmIHRoZSB1bmlvbiB0eXBlIGluY2x1ZGVzIGEgbnVsbGFibGUgdHlwZSBhbmQgViBpcyBudWxsIG9yIHVuZGVmaW5lZCwKKyAgLy8gVE9ETzogU3VwcG9ydCBEYXRlLCBSZWdFeHAsIERPTUV4Y2VwdGlvbiwgRXJyb3IsIEFycmF5QnVmZmVyLCBEYXRhVmlldywKKyAgLy8gICAgICAgVHlwZWRBcnJheU5hbWUsIGNhbGxiYWNrIGZ1bmN0aW9ucywgZGljdGlvbmFyeS4KKworICAvLyAxLiBJZiB0aGUgdW5pb24gdHlwZSBpbmNsdWRlcyBhIG51bGxhYmxlIHR5cGUgYW5kIHxWfCBpcyBudWxsIG9yIHVuZGVmaW5lZCwKICAgLy8gdGhlbiByZXR1cm4gdGhlIElETCB2YWx1ZSBudWxsLgogICBpZiAodmFsdWUuaXNOdWxsKCkgfHwgdmFsdWUuaXNVbmRlZmluZWQoKSkgewotICAgIC8vIElmIHRoZSB0eXBlIHdhcyBudWxsYWJsZSBvciB1bmRlZmluZWQsIHdlIHNob3VsZCBoYXZlIGNhdWdodCB0aGF0IGFzIGEKLSAgICAvLyBwYXJ0IG9mIHRoZSBiYXNlOjpvcHRpb25hbDxUPiBjb252ZXJzaW9uLgotICAgIE5PVFJFQUNIRUQoKTsKKyAgICAvLyBTaW5jZSB0aGUgbnVsbGFiaWxpdHkgc2hvdWxkIGhhdmUgYmVlbiBkZXRlY3RlZCBieSB0aGUgY29udmVyc2lvbiBmb3IKKyAgICAvLyBiYXNlOjpvcHRpb25hbCwgd2Ugc2hvdWxkIHRocm93LCBiZWNhdXNlIGlmIHdlIGdldCBoZXJlIGl0IG1lYW5zIHRoZQorICAgIC8vIHVuaW9uIGRvZXMgbm90IGluY2x1ZGUgYSBudWxsYWJsZSB0eXBlLCBidXQgaGF2ZSBiZWVuIHBhc3NlZCBhIG51bGwKKyAgICAvLyB2YWx1ZS4KKyAgICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrTm90VW5pb25UeXBlKTsKICAgICByZXR1cm47CiAgIH0KKwogICAvLyBUeXBlZGVmIGZvciByZWFkYWJpbGl0eS4KICAgdHlwZWRlZiA6OmNvYmFsdDo6c2NyaXB0OjppbnRlcm5hbDo6VW5pb25UeXBlVHJhaXRzPFQxPiBVbmlvblR5cGVUcmFpdHNUMTsKICAgdHlwZWRlZiA6OmNvYmFsdDo6c2NyaXB0OjppbnRlcm5hbDo6VW5pb25UeXBlVHJhaXRzPFQyPiBVbmlvblR5cGVUcmFpdHNUMjsKICAgdHlwZWRlZiA6OmNvYmFsdDo6c2NyaXB0OjppbnRlcm5hbDo6VW5pb25UeXBlVHJhaXRzPFQzPiBVbmlvblR5cGVUcmFpdHNUMzsKIAorICAvLyAyLiBMZXQgfHR5cGVzfCBiZSB0aGUgZmxhdHRlbmVkIG1lbWJlciB0eXBlcyBvZiB0aGUgdW5pb24gdHlwZS4KICAgLy8gRm9yd2FyZCBkZWNsYXJlIGFsbCBwb3RlbnRpYWwgdHlwZXMKICAgVDEgdDE7CiAgIFQyIHQyOwogICBUMyB0MzsKIAotICAvLyAzLjEgSWYgdHlwZXMgaW5jbHVkZXMgYW4gaW50ZXJmYWNlIHR5cGUgdGhhdCBWIGltcGxlbWVudHMsIHRoZW4gcmV0dXJuIHRoZQotICAvLyAgICAgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBWLgotICAvLyAzLjIgSWYgdHlwZXMgaW5jbHVkZXMgb2JqZWN0LCB0aGVuIHJldHVybiB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UKLSAgLy8gICAgIHRvIHRoZSBvYmplY3QgVi4KLSAgLy8KLSAgLy8gVGhlIHNwZWNpZmljYXRpb24gZG9lc24ndCBkaWN0YXRlIHdoYXQgc2hvdWxkIGhhcHBlbiBpZiBWIGltcGxlbWVudHMgbW9yZQotICAvLyB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UgQiBhbmQKLSAgLy8gaW50ZXJmYWNlIEIgaW5oZXJpdHMgZnJvbSBpbnRlcmZhY2UgQSwgd2hhdCBoYXBwZW5zIGlmIGJvdGggQSBhbmQgQiBhcmUKLSAgLy8gdW5pb24gbWVtYmVycz8gQmxpbmsgZG9lc24ndCBzZWVtIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoaXMgY2FzZS4KLSAgLy8gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdCBtYXRjaGVzLgorICAvLyA0LiBJZiB8VnwgaXMgYSBwbGF0Zm9ybSBvYmplY3QsIHRoZW46CisgIC8vICAgMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhbiBpbnRlcmZhY2UgdHlwZSB0aGF0IFYgaW1wbGVtZW50cywgdGhlbiByZXR1cm4KKyAgLy8gICAgICB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB8VnwuCisgIC8vICAgMi4gSWYgfHR5cGVzfCBpbmNsdWRlcyBvYmplY3QsIHRoZW4gcmV0dXJuIHRoZSBJREwgdmFsdWUgdGhhdCBpcyBhCisgIC8vICAgICAgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgfFZ8LgogICBpZiAodmFsdWUuaXNPYmplY3QoKSkgeworICAgIC8vIFRoZSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgZGljdGF0ZSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgViBpbXBsZW1lbnRzCisgICAgLy8gbW9yZSB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UKKyAgICAvLyBCIGFuZCBpbnRlcmZhY2UgQiBpbmhlcml0cyBmcm9tIGludGVyZmFjZSBBLCB3aGF0IGhhcHBlbnMgaWYgYm90aCBBIGFuZAorICAgIC8vIEIgYXJlIHVuaW9uIG1lbWJlcnM/IEJsaW5rIGRvZXNuJ3Qgc2VlbSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzCisgICAgLy8gY2FzZS4gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdAorICAgIC8vIG1hdGNoZXMuCisKICAgICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9vYmplY3QoY29udGV4dCk7CiAgICAgYm9vbCBzdWNjZXNzID0gSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB2YWx1ZSwgJnJvb3RlZF9vYmplY3QpOwogICAgIERDSEVDSyhzdWNjZXNzKTsKKwogICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CiAgICAgY29uc3QgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9CiAgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisKICAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX2ludGVyZmFjZV90eXBlICYmCiAgICAgICAgIHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKICAgICAgICAgICAgIHJvb3RlZF9vYmplY3QsIFVuaW9uVHlwZVRyYWl0c1QxOjpHZXRUeXBlSUQoKSkpIHsKQEAgLTI2MSw2ICszMDUsNyBAQAogICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMzxUMSwgVDIsIFQzPih0MSk7CiAgICAgICByZXR1cm47CiAgICAgfQorCiAgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QyOjppc19pbnRlcmZhY2VfdHlwZSAmJgogICAgICAgICB3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCiAgICAgICAgICAgICByb290ZWRfb2JqZWN0LCBVbmlvblR5cGVUcmFpdHNUMjo6R2V0VHlwZUlEKCkpKSB7CkBAIC0yNjgsNiArMzEzLDcgQEAKICAgICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTM8VDEsIFQyLCBUMz4odDIpOwogICAgICAgcmV0dXJuOwogICAgIH0KKwogICAgIGlmIChVbmlvblR5cGVUcmFpdHNUMzo6aXNfaW50ZXJmYWNlX3R5cGUgJiYKICAgICAgICAgd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAogICAgICAgICAgICAgcm9vdGVkX29iamVjdCwgVW5pb25UeXBlVHJhaXRzVDM6OkdldFR5cGVJRCgpKSkgewpAQCAtMjc3LDEyICszMjMsMzQgQEAKICAgICB9CiAgIH0KIAotICAvLyBUT0RPOiBTdXBwb3J0IERhdGUsIFJlZ0V4cCwgRE9NRXhjZXB0aW9uLCBFcnJvciwgQXJyYXlCdWZmZXIsIERhdGFWaWV3LAotICAvLyAgICAgICBUeXBlZEFycmF5TmFtZSwgY2FsbGJhY2sgZnVuY3Rpb25zLCBkaWN0aW9uYXJ5LCBhcnJheSB0eXBlLgotICAvLyAgICAgICBBbmQgc2VxdWVuY2VzIGlmIG5lY2Vzc2FyeS4KKyAgLy8gMTEuIElmIHxUeXBlKFYpfCBpcyBPYmplY3QsIHRoZW46CisgIC8vICAgMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIHNlcXVlbmNlIHR5cGUsIHRoZW4KKyAgLy8gICAgIDEuIExldCB8bWV0aG9kfCBiZSB0aGUgcmVzdWx0IG9mIEdldE1ldGhvZChWLCBAQGl0ZXJhdG9yKQorICAvLyAgICAgMi4gUmV0dXJuSWZBYnJ1cHQobWV0aG9kKQorICAvLyAgICAgMy4gSWYgbWV0aG9kIGlzIG5vdCB1bmRlZmluZWQsIHJldHVybiB0aGUgcmVzdWx0IG9mIGNyZWF0aW5nIGEgc2VxdWVuY2UKKyAgLy8gICAgICAgIG9mIHRoYXQgdHlwZSBmcm9tIHxWfCBhbmQgfG1ldGhvZHwuCisgIGlmICh2YWx1ZS5pc09iamVjdCgpKSB7CisgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QxOjppc19zZXF1ZW5jZV90eXBlKSB7CisgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDEpOworICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMzxUMSwgVDIsIFQzPih0MSk7CisgICAgICByZXR1cm47CisgICAgfQogCi0gIC8vIDE0LiBJZiBWIGlzIGEgQm9vbGVhbiB2YWx1ZSwgdGhlbjoKLSAgLy8gICAxLiBJZiB0eXBlcyBpbmNsdWRlcyBhIGJvb2xlYW4sIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBWCisgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QyOjppc19zZXF1ZW5jZV90eXBlKSB7CisgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDIpOworICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMzxUMSwgVDIsIFQzPih0Mik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QzOjppc19zZXF1ZW5jZV90eXBlKSB7CisgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDMpOworICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMzxUMSwgVDIsIFQzPih0Myk7CisgICAgICByZXR1cm47CisgICAgfQorICB9CisKKyAgLy8gMTIuIElmIHxUeXBlKFYpfCBpcyBCb29sZWFuLCB0aGVuOgorICAvLyAxLiBJZiB8dHlwZXN8IGluY2x1ZGVzIGEgYm9vbGVhbiwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIHxWfAogICAvLyAgICAgIHRvIGJvb2xlYW4uCiAgIGlmICh2YWx1ZS5pc0Jvb2xlYW4oKSkgewogICAgIGlmIChVbmlvblR5cGVUcmFpdHNUMTo6aXNfYm9vbGVhbl90eXBlKSB7CkBAIC0zMDQsOSArMzcyLDkgQEAKICAgICB9CiAgIH0KIAotICAvLyAxNS4gSWYgViBpcyBhIE51bWJlciB2YWx1ZSwgdGhlbjoKLSAgLy8gICAxLiBJZiB0eXBlcyBpbmNsdWRlcyBhIG51bWVyaWMgdHlwZSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nCi0gIC8vICAgICAgViB0byB0aGF0IG51bWVyaWMgdHlwZS4KKyAgLy8gMTMuIElmIHxUeXBlKFYpfCBpcyBhIE51bWJlciwgdGhlbjoKKyAgLy8gICAxLiBJZiB8dHlwZXN8IGluY2x1ZGVzIGEgbnVtZXJpYyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mCisgIC8vICAgICAgY29udmVydGluZyB8VnwgdG8gdGhhdCBudW1lcmljIHR5cGUuCiAgIGlmICh2YWx1ZS5pc051bWJlcigpKSB7CiAgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QxOjppc19udW1lcmljX3R5cGUpIHsKICAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0MSk7CkBAIC0zMjcsOCArMzk1LDggQEAKICAgICB9CiAgIH0KIAotICAvLyAxNi4gSWYgdHlwZXMgaW5jbHVkZXMgYSBzdHJpbmcgdHlwZSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIFYKLSAgLy8gdG8gdGhhdCB0eXBlLgorICAvLyAxNC4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIHN0cmluZyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcKKyAgLy8gICAgIHxWfCB0byB0aGF0IHR5cGUuCiAgIGlmICh2YWx1ZS5pc1N0cmluZygpKSB7CiAgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QxOjppc19zdHJpbmdfdHlwZSkgewogICAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQxKTsKQEAgLTM0OSw0OCArNDE3LDU1IEBACiAgICAgfQogICB9CiAKLSAgLy8gMTcuIElmIHR5cGVzIGluY2x1ZGVzIGEgbnVtZXJpYyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcKLSAgLy8gViB0byB0aGF0IG51bWVyaWMgdHlwZS4KKyAgLy8gMTUuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBudW1lcmljIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YKKyAgLy8gICAgIGNvbnZlcnRpbmcgfFZ8IHRvIHRoYXQgbnVtZXJpYyB0eXBlLgogICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX251bWVyaWNfdHlwZSkgewogICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0MSk7CiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMzxUMSwgVDIsIFQzPih0MSk7CiAgICAgcmV0dXJuOwogICB9CisKICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QyOjppc19udW1lcmljX3R5cGUpIHsKICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDIpOwogICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTM8VDEsIFQyLCBUMz4odDIpOwogICAgIHJldHVybjsKICAgfQorCiAgIGlmIChVbmlvblR5cGVUcmFpdHNUMzo6aXNfbnVtZXJpY190eXBlKSB7CiAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQzKTsKICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGUzPFQxLCBUMiwgVDM+KHQzKTsKICAgICByZXR1cm47CiAgIH0KLSAgLy8gMTguIElmIHR5cGVzIGluY2x1ZGVzIGEgYm9vbGVhbiwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIFYgdG8KLSAgLy8gYm9vbGVhbi4KKworICAvLyAxNi4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIGJvb2xlYW4sIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZyB8VnwKKyAgLy8gICAgIHRvIGJvb2xlYW4uCiAgIGlmIChVbmlvblR5cGVUcmFpdHNUMTo6aXNfYm9vbGVhbl90eXBlKSB7CiAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQxKTsKICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGUzPFQxLCBUMiwgVDM+KHQxKTsKICAgICByZXR1cm47CiAgIH0KKwogICBpZiAoVW5pb25UeXBlVHJhaXRzVDI6OmlzX2Jvb2xlYW5fdHlwZSkgewogICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0Mik7CiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlMzxUMSwgVDIsIFQzPih0Mik7CiAgICAgcmV0dXJuOwogICB9CisKICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QzOjppc19ib29sZWFuX3R5cGUpIHsKICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDMpOwogICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTM8VDEsIFQyLCBUMz4odDMpOwogICAgIHJldHVybjsKICAgfQotICAvLyAxOS4gVGhyb3cgYSBUeXBlRXJyb3IuCisKKyAgLy8gMTcuIFRocm93IGEgVHlwZUVycm9yLgogICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrTm90VW5pb25UeXBlKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFQxLCB0eXBlbmFtZSBUMiwgdHlwZW5hbWUgVDMsIHR5cGVuYW1lIFQ0Pgotdm9pZCBUb0pTVmFsdWUoSlNDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgY29uc3Qgc2NyaXB0OjpVbmlvblR5cGU0PFQxLCBUMiwgVDMsIFQ0PiYgaW5fdW5pb24sCi0gICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgewordm9pZCBUb0pTVmFsdWUoCisgICAgSlNDb250ZXh0KiBjb250ZXh0LAorICAgIGNvbnN0IHNjcmlwdDo6VW5pb25UeXBlNDxUMSwgVDIsIFQzLCBUND4mIGluX3VuaW9uLAorICAgIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3ZhbHVlKSB7CiAgIGlmIChpbl91bmlvbi50ZW1wbGF0ZSBJc1R5cGU8VDE+KCkpIHsKICAgICBUb0pTVmFsdWUoY29udGV4dCwgaW5fdW5pb24udGVtcGxhdGUgQXNUeXBlPFQxPigpLCBvdXRfdmFsdWUpOwogICAgIHJldHVybjsKQEAgLTQxOSw0NCArNDk0LDU1IEBACiAgIC8vIEpTIC0+IElETCB0eXBlIGNvbnZlcnNpb24gcHJvY2VkdXJlIGRlc2NyaWJlZCBoZXJlOgogICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2VzLXVuaW9uCiAKLSAgLy8gMS4gSWYgdGhlIHVuaW9uIHR5cGUgaW5jbHVkZXMgYSBudWxsYWJsZSB0eXBlIGFuZCBWIGlzIG51bGwgb3IgdW5kZWZpbmVkLAorICAvLyBUT0RPOiBTdXBwb3J0IERhdGUsIFJlZ0V4cCwgRE9NRXhjZXB0aW9uLCBFcnJvciwgQXJyYXlCdWZmZXIsIERhdGFWaWV3LAorICAvLyAgICAgICBUeXBlZEFycmF5TmFtZSwgY2FsbGJhY2sgZnVuY3Rpb25zLCBkaWN0aW9uYXJ5LgorCisgIC8vIDEuIElmIHRoZSB1bmlvbiB0eXBlIGluY2x1ZGVzIGEgbnVsbGFibGUgdHlwZSBhbmQgfFZ8IGlzIG51bGwgb3IgdW5kZWZpbmVkLAogICAvLyB0aGVuIHJldHVybiB0aGUgSURMIHZhbHVlIG51bGwuCiAgIGlmICh2YWx1ZS5pc051bGwoKSB8fCB2YWx1ZS5pc1VuZGVmaW5lZCgpKSB7Ci0gICAgLy8gSWYgdGhlIHR5cGUgd2FzIG51bGxhYmxlIG9yIHVuZGVmaW5lZCwgd2Ugc2hvdWxkIGhhdmUgY2F1Z2h0IHRoYXQgYXMgYQotICAgIC8vIHBhcnQgb2YgdGhlIGJhc2U6Om9wdGlvbmFsPFQ+IGNvbnZlcnNpb24uCi0gICAgTk9UUkVBQ0hFRCgpOworICAgIC8vIFNpbmNlIHRoZSBudWxsYWJpbGl0eSBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGJ5IHRoZSBjb252ZXJzaW9uIGZvcgorICAgIC8vIGJhc2U6Om9wdGlvbmFsLCB3ZSBzaG91bGQgdGhyb3csIGJlY2F1c2UgaWYgd2UgZ2V0IGhlcmUgaXQgbWVhbnMgdGhlCisgICAgLy8gdW5pb24gZG9lcyBub3QgaW5jbHVkZSBhIG51bGxhYmxlIHR5cGUsIGJ1dCBoYXZlIGJlZW4gcGFzc2VkIGEgbnVsbAorICAgIC8vIHZhbHVlLgorICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtOb3RVbmlvblR5cGUpOwogICAgIHJldHVybjsKICAgfQorCiAgIC8vIFR5cGVkZWYgZm9yIHJlYWRhYmlsaXR5LgogICB0eXBlZGVmIDo6Y29iYWx0OjpzY3JpcHQ6OmludGVybmFsOjpVbmlvblR5cGVUcmFpdHM8VDE+IFVuaW9uVHlwZVRyYWl0c1QxOwogICB0eXBlZGVmIDo6Y29iYWx0OjpzY3JpcHQ6OmludGVybmFsOjpVbmlvblR5cGVUcmFpdHM8VDI+IFVuaW9uVHlwZVRyYWl0c1QyOwogICB0eXBlZGVmIDo6Y29iYWx0OjpzY3JpcHQ6OmludGVybmFsOjpVbmlvblR5cGVUcmFpdHM8VDM+IFVuaW9uVHlwZVRyYWl0c1QzOwogICB0eXBlZGVmIDo6Y29iYWx0OjpzY3JpcHQ6OmludGVybmFsOjpVbmlvblR5cGVUcmFpdHM8VDQ+IFVuaW9uVHlwZVRyYWl0c1Q0OwogCisgIC8vIDIuIExldCB8dHlwZXN8IGJlIHRoZSBmbGF0dGVuZWQgbWVtYmVyIHR5cGVzIG9mIHRoZSB1bmlvbiB0eXBlLgogICAvLyBGb3J3YXJkIGRlY2xhcmUgYWxsIHBvdGVudGlhbCB0eXBlcwogICBUMSB0MTsKICAgVDIgdDI7CiAgIFQzIHQzOwogICBUNCB0NDsKIAotICAvLyAzLjEgSWYgdHlwZXMgaW5jbHVkZXMgYW4gaW50ZXJmYWNlIHR5cGUgdGhhdCBWIGltcGxlbWVudHMsIHRoZW4gcmV0dXJuIHRoZQotICAvLyAgICAgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBWLgotICAvLyAzLjIgSWYgdHlwZXMgaW5jbHVkZXMgb2JqZWN0LCB0aGVuIHJldHVybiB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UKLSAgLy8gICAgIHRvIHRoZSBvYmplY3QgVi4KLSAgLy8KLSAgLy8gVGhlIHNwZWNpZmljYXRpb24gZG9lc24ndCBkaWN0YXRlIHdoYXQgc2hvdWxkIGhhcHBlbiBpZiBWIGltcGxlbWVudHMgbW9yZQotICAvLyB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UgQiBhbmQKLSAgLy8gaW50ZXJmYWNlIEIgaW5oZXJpdHMgZnJvbSBpbnRlcmZhY2UgQSwgd2hhdCBoYXBwZW5zIGlmIGJvdGggQSBhbmQgQiBhcmUKLSAgLy8gdW5pb24gbWVtYmVycz8gQmxpbmsgZG9lc24ndCBzZWVtIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoaXMgY2FzZS4KLSAgLy8gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdCBtYXRjaGVzLgorICAvLyA0LiBJZiB8VnwgaXMgYSBwbGF0Zm9ybSBvYmplY3QsIHRoZW46CisgIC8vICAgMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhbiBpbnRlcmZhY2UgdHlwZSB0aGF0IFYgaW1wbGVtZW50cywgdGhlbiByZXR1cm4KKyAgLy8gICAgICB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB8VnwuCisgIC8vICAgMi4gSWYgfHR5cGVzfCBpbmNsdWRlcyBvYmplY3QsIHRoZW4gcmV0dXJuIHRoZSBJREwgdmFsdWUgdGhhdCBpcyBhCisgIC8vICAgICAgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgfFZ8LgogICBpZiAodmFsdWUuaXNPYmplY3QoKSkgeworICAgIC8vIFRoZSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgZGljdGF0ZSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgViBpbXBsZW1lbnRzCisgICAgLy8gbW9yZSB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UKKyAgICAvLyBCIGFuZCBpbnRlcmZhY2UgQiBpbmhlcml0cyBmcm9tIGludGVyZmFjZSBBLCB3aGF0IGhhcHBlbnMgaWYgYm90aCBBIGFuZAorICAgIC8vIEIgYXJlIHVuaW9uIG1lbWJlcnM/IEJsaW5rIGRvZXNuJ3Qgc2VlbSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzCisgICAgLy8gY2FzZS4gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdAorICAgIC8vIG1hdGNoZXMuCisKICAgICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9vYmplY3QoY29udGV4dCk7CiAgICAgYm9vbCBzdWNjZXNzID0gSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB2YWx1ZSwgJnJvb3RlZF9vYmplY3QpOwogICAgIERDSEVDSyhzdWNjZXNzKTsKKwogICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CiAgICAgY29uc3QgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9CiAgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CisKICAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX2ludGVyZmFjZV90eXBlICYmCiAgICAgICAgIHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKICAgICAgICAgICAgIHJvb3RlZF9vYmplY3QsIFVuaW9uVHlwZVRyYWl0c1QxOjpHZXRUeXBlSUQoKSkpIHsKQEAgLTQ2NCw2ICs1NTAsNyBAQAogICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlNDxUMSwgVDIsIFQzLCBUND4odDEpOwogICAgICAgcmV0dXJuOwogICAgIH0KKwogICAgIGlmIChVbmlvblR5cGVUcmFpdHNUMjo6aXNfaW50ZXJmYWNlX3R5cGUgJiYKICAgICAgICAgd3JhcHBlcl9mYWN0b3J5LT5Eb2VzT2JqZWN0SW1wbGVtZW50SW50ZXJmYWNlKAogICAgICAgICAgICAgcm9vdGVkX29iamVjdCwgVW5pb25UeXBlVHJhaXRzVDI6OkdldFR5cGVJRCgpKSkgewpAQCAtNDcxLDYgKzU1OCw3IEBACiAgICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGU0PFQxLCBUMiwgVDMsIFQ0Pih0Mik7CiAgICAgICByZXR1cm47CiAgICAgfQorCiAgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QzOjppc19pbnRlcmZhY2VfdHlwZSAmJgogICAgICAgICB3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCiAgICAgICAgICAgICByb290ZWRfb2JqZWN0LCBVbmlvblR5cGVUcmFpdHNUMzo6R2V0VHlwZUlEKCkpKSB7CkBAIC00NzgsNiArNTY2LDcgQEAKICAgICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTQ8VDEsIFQyLCBUMywgVDQ+KHQzKTsKICAgICAgIHJldHVybjsKICAgICB9CisKICAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDQ6OmlzX2ludGVyZmFjZV90eXBlICYmCiAgICAgICAgIHdyYXBwZXJfZmFjdG9yeS0+RG9lc09iamVjdEltcGxlbWVudEludGVyZmFjZSgKICAgICAgICAgICAgIHJvb3RlZF9vYmplY3QsIFVuaW9uVHlwZVRyYWl0c1Q0OjpHZXRUeXBlSUQoKSkpIHsKQEAgLTQ4NywxMiArNTc2LDQwIEBACiAgICAgfQogICB9CiAKLSAgLy8gVE9ETzogU3VwcG9ydCBEYXRlLCBSZWdFeHAsIERPTUV4Y2VwdGlvbiwgRXJyb3IsIEFycmF5QnVmZmVyLCBEYXRhVmlldywKLSAgLy8gICAgICAgVHlwZWRBcnJheU5hbWUsIGNhbGxiYWNrIGZ1bmN0aW9ucywgZGljdGlvbmFyeSwgYXJyYXkgdHlwZS4KLSAgLy8gICAgICAgQW5kIHNlcXVlbmNlcyBpZiBuZWNlc3NhcnkuCisgIC8vIDExLiBJZiB8VHlwZShWKXwgaXMgT2JqZWN0LCB0aGVuOgorICAvLyAgIDEuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBzZXF1ZW5jZSB0eXBlLCB0aGVuCisgIC8vICAgICAxLiBMZXQgfG1ldGhvZHwgYmUgdGhlIHJlc3VsdCBvZiBHZXRNZXRob2QoViwgQEBpdGVyYXRvcikKKyAgLy8gICAgIDIuIFJldHVybklmQWJydXB0KG1ldGhvZCkKKyAgLy8gICAgIDMuIElmIG1ldGhvZCBpcyBub3QgdW5kZWZpbmVkLCByZXR1cm4gdGhlIHJlc3VsdCBvZiBjcmVhdGluZyBhIHNlcXVlbmNlCisgIC8vICAgICAgICBvZiB0aGF0IHR5cGUgZnJvbSB8VnwgYW5kIHxtZXRob2R8LgorICBpZiAodmFsdWUuaXNPYmplY3QoKSkgeworICAgIGlmIChVbmlvblR5cGVUcmFpdHNUMTo6aXNfc2VxdWVuY2VfdHlwZSkgeworICAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQxKTsKKyAgICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTQ8VDEsIFQyLCBUMywgVDQ+KHQxKTsKKyAgICAgIHJldHVybjsKKyAgICB9CiAKLSAgLy8gMTQuIElmIFYgaXMgYSBCb29sZWFuIHZhbHVlLCB0aGVuOgotICAvLyAgIDEuIElmIHR5cGVzIGluY2x1ZGVzIGEgYm9vbGVhbiwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIFYKKyAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDI6OmlzX3NlcXVlbmNlX3R5cGUpIHsKKyAgICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0Mik7CisgICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGU0PFQxLCBUMiwgVDMsIFQ0Pih0Mik7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QzOjppc19zZXF1ZW5jZV90eXBlKSB7CisgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDMpOworICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlNDxUMSwgVDIsIFQzLCBUND4odDMpOworICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGlmIChVbmlvblR5cGVUcmFpdHNUNDo6aXNfc2VxdWVuY2VfdHlwZSkgeworICAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQ0KTsKKyAgICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTQ8VDEsIFQyLCBUMywgVDQ+KHQ0KTsKKyAgICAgIHJldHVybjsKKyAgICB9CisgIH0KKworICAvLyAxMi4gSWYgfFR5cGUoVil8IGlzIEJvb2xlYW4sIHRoZW46CisgIC8vIDEuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBib29sZWFuLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgfFZ8CiAgIC8vICAgICAgdG8gYm9vbGVhbi4KICAgaWYgKHZhbHVlLmlzQm9vbGVhbigpKSB7CiAgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QxOjppc19ib29sZWFuX3R5cGUpIHsKQEAgLTUyMCw5ICs2MzcsOSBAQAogICAgIH0KICAgfQogCi0gIC8vIDE1LiBJZiBWIGlzIGEgTnVtYmVyIHZhbHVlLCB0aGVuOgotICAvLyAgIDEuIElmIHR5cGVzIGluY2x1ZGVzIGEgbnVtZXJpYyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcKLSAgLy8gICAgICBWIHRvIHRoYXQgbnVtZXJpYyB0eXBlLgorICAvLyAxMy4gSWYgfFR5cGUoVil8IGlzIGEgTnVtYmVyLCB0aGVuOgorICAvLyAgIDEuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBudW1lcmljIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YKKyAgLy8gICAgICBjb252ZXJ0aW5nIHxWfCB0byB0aGF0IG51bWVyaWMgdHlwZS4KICAgaWYgKHZhbHVlLmlzTnVtYmVyKCkpIHsKICAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX251bWVyaWNfdHlwZSkgewogICAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQxKTsKQEAgLTU0OSw4ICs2NjYsOCBAQAogICAgIH0KICAgfQogCi0gIC8vIDE2LiBJZiB0eXBlcyBpbmNsdWRlcyBhIHN0cmluZyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgVgotICAvLyB0byB0aGF0IHR5cGUuCisgIC8vIDE0LiBJZiB8dHlwZXN8IGluY2x1ZGVzIGEgc3RyaW5nIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZworICAvLyAgICAgfFZ8IHRvIHRoYXQgdHlwZS4KICAgaWYgKHZhbHVlLmlzU3RyaW5nKCkpIHsKICAgICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX3N0cmluZ190eXBlKSB7CiAgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDEpOwpAQCAtNTc3LDUxICs2OTQsNTkgQEAKICAgICB9CiAgIH0KIAotICAvLyAxNy4gSWYgdHlwZXMgaW5jbHVkZXMgYSBudW1lcmljIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZwotICAvLyBWIHRvIHRoYXQgbnVtZXJpYyB0eXBlLgorICAvLyAxNS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIG51bWVyaWMgdHlwZSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZgorICAvLyAgICAgY29udmVydGluZyB8VnwgdG8gdGhhdCBudW1lcmljIHR5cGUuCiAgIGlmIChVbmlvblR5cGVUcmFpdHNUMTo6aXNfbnVtZXJpY190eXBlKSB7CiAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQxKTsKICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGU0PFQxLCBUMiwgVDMsIFQ0Pih0MSk7CiAgICAgcmV0dXJuOwogICB9CisKICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QyOjppc19udW1lcmljX3R5cGUpIHsKICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDIpOwogICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTQ8VDEsIFQyLCBUMywgVDQ+KHQyKTsKICAgICByZXR1cm47CiAgIH0KKwogICBpZiAoVW5pb25UeXBlVHJhaXRzVDM6OmlzX251bWVyaWNfdHlwZSkgewogICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0Myk7CiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlNDxUMSwgVDIsIFQzLCBUND4odDMpOwogICAgIHJldHVybjsKICAgfQorCiAgIGlmIChVbmlvblR5cGVUcmFpdHNUNDo6aXNfbnVtZXJpY190eXBlKSB7CiAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQ0KTsKICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGU0PFQxLCBUMiwgVDMsIFQ0Pih0NCk7CiAgICAgcmV0dXJuOwogICB9Ci0gIC8vIDE4LiBJZiB0eXBlcyBpbmNsdWRlcyBhIGJvb2xlYW4sIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBWIHRvCi0gIC8vIGJvb2xlYW4uCisKKyAgLy8gMTYuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBib29sZWFuLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgfFZ8CisgIC8vICAgICB0byBib29sZWFuLgogICBpZiAoVW5pb25UeXBlVHJhaXRzVDE6OmlzX2Jvb2xlYW5fdHlwZSkgewogICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0MSk7CiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlNDxUMSwgVDIsIFQzLCBUND4odDEpOwogICAgIHJldHVybjsKICAgfQorCiAgIGlmIChVbmlvblR5cGVUcmFpdHNUMjo6aXNfYm9vbGVhbl90eXBlKSB7CiAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgdmFsdWUsIGNvbnZlcnNpb25fZmxhZ3MsIGV4Y2VwdGlvbl9zdGF0ZSwgJnQyKTsKICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGU0PFQxLCBUMiwgVDMsIFQ0Pih0Mik7CiAgICAgcmV0dXJuOwogICB9CisKICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QzOjppc19ib29sZWFuX3R5cGUpIHsKICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdDMpOwogICAgICpvdXRfdW5pb24gPSBzY3JpcHQ6OlVuaW9uVHlwZTQ8VDEsIFQyLCBUMywgVDQ+KHQzKTsKICAgICByZXR1cm47CiAgIH0KKwogICBpZiAoVW5pb25UeXBlVHJhaXRzVDQ6OmlzX2Jvb2xlYW5fdHlwZSkgewogICAgIEZyb21KU1ZhbHVlKGNvbnRleHQsIHZhbHVlLCBjb252ZXJzaW9uX2ZsYWdzLCBleGNlcHRpb25fc3RhdGUsICZ0NCk7CiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlNDxUMSwgVDIsIFQzLCBUND4odDQpOwogICAgIHJldHVybjsKICAgfQotICAvLyAxOS4gVGhyb3cgYSBUeXBlRXJyb3IuCisKKyAgLy8gMTcuIFRocm93IGEgVHlwZUVycm9yLgogICBleGNlcHRpb25fc3RhdGUtPlNldFNpbXBsZUV4Y2VwdGlvbihrTm90VW5pb25UeXBlKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ltcGwuaC5wdW1wIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ltcGwuaC5wdW1wCmluZGV4IDA0NTI1MjMuLjA1MWQ0NzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3VuaW9uX3R5cGVfY29udmVyc2lvbl9pbXBsLmgucHVtcAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91bmlvbl90eXBlX2NvbnZlcnNpb25faW1wbC5oLnB1bXAKQEAgLTcsMjEgKzcsMTkgQEAKIAogJCQgTWF4aW11bSBudW1iZXIgb2YgZGlmZmVyZW50IG1lbWJlciB0eXBlcyBpbiBhIHVuaW9uLgogJHZhciBNQVhfTUVNQkVSUyA9IDQKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfVU5JT05fVFlQRV9DT05WRVJTSU9OX0lNUExfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9VTklPTl9UWVBFX0NPTlZFUlNJT05fSU1QTF9IXwpAQCAtNzAsMTQgKzY4LDIwIEBACiAgIC8vIEpTIC0+IElETCB0eXBlIGNvbnZlcnNpb24gcHJvY2VkdXJlIGRlc2NyaWJlZCBoZXJlOgogICAvLyBodHRwOi8vaGV5Y2FtLmdpdGh1Yi5pby93ZWJpZGwvI2VzLXVuaW9uCiAKLSAgLy8gMS4gSWYgdGhlIHVuaW9uIHR5cGUgaW5jbHVkZXMgYSBudWxsYWJsZSB0eXBlIGFuZCBWIGlzIG51bGwgb3IgdW5kZWZpbmVkLAorICAvLyBUT0RPOiBTdXBwb3J0IERhdGUsIFJlZ0V4cCwgRE9NRXhjZXB0aW9uLCBFcnJvciwgQXJyYXlCdWZmZXIsIERhdGFWaWV3LAorICAvLyAgICAgICBUeXBlZEFycmF5TmFtZSwgY2FsbGJhY2sgZnVuY3Rpb25zLCBkaWN0aW9uYXJ5LgorCisgIC8vIDEuIElmIHRoZSB1bmlvbiB0eXBlIGluY2x1ZGVzIGEgbnVsbGFibGUgdHlwZSBhbmQgfFZ8IGlzIG51bGwgb3IgdW5kZWZpbmVkLAogICAvLyB0aGVuIHJldHVybiB0aGUgSURMIHZhbHVlIG51bGwuCiAgIGlmICh2YWx1ZS5pc051bGwoKSB8fCB2YWx1ZS5pc1VuZGVmaW5lZCgpKSB7Ci0gICAgLy8gSWYgdGhlIHR5cGUgd2FzIG51bGxhYmxlIG9yIHVuZGVmaW5lZCwgd2Ugc2hvdWxkIGhhdmUgY2F1Z2h0IHRoYXQgYXMgYQotICAgIC8vIHBhcnQgb2YgdGhlIGJhc2U6Om9wdGlvbmFsPFQ+IGNvbnZlcnNpb24uCi0gICAgTk9UUkVBQ0hFRCgpOworICAgIC8vIFNpbmNlIHRoZSBudWxsYWJpbGl0eSBzaG91bGQgaGF2ZSBiZWVuIGRldGVjdGVkIGJ5IHRoZSBjb252ZXJzaW9uIGZvcgorICAgIC8vIGJhc2U6Om9wdGlvbmFsLCB3ZSBzaG91bGQgdGhyb3csIGJlY2F1c2UgaWYgd2UgZ2V0IGhlcmUgaXQgbWVhbnMgdGhlCisgICAgLy8gdW5pb24gZG9lcyBub3QgaW5jbHVkZSBhIG51bGxhYmxlIHR5cGUsIGJ1dCBoYXZlIGJlZW4gcGFzc2VkIGEgbnVsbAorICAgIC8vIHZhbHVlLgorICAgIGV4Y2VwdGlvbl9zdGF0ZS0+U2V0U2ltcGxlRXhjZXB0aW9uKGtOb3RVbmlvblR5cGUpOwogICAgIHJldHVybjsKICAgfQorCiAgIC8vIFR5cGVkZWYgZm9yIHJlYWRhYmlsaXR5LgogCiAkZm9yIFRZUEUgW1sKQEAgLTg1LDYgKzg5LDcgQEAKIAogXV0KIAorICAvLyAyLiBMZXQgfHR5cGVzfCBiZSB0aGUgZmxhdHRlbmVkIG1lbWJlciB0eXBlcyBvZiB0aGUgdW5pb24gdHlwZS4KICAgLy8gRm9yd2FyZCBkZWNsYXJlIGFsbCBwb3RlbnRpYWwgdHlwZXMKIAogJGZvciBUWVBFIFtbCkBAIC05MiwyNiArOTcsMzAgQEAKIAogXV0KIAotICAvLyAzLjEgSWYgdHlwZXMgaW5jbHVkZXMgYW4gaW50ZXJmYWNlIHR5cGUgdGhhdCBWIGltcGxlbWVudHMsIHRoZW4gcmV0dXJuIHRoZQotICAvLyAgICAgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCBWLgotICAvLyAzLjIgSWYgdHlwZXMgaW5jbHVkZXMgb2JqZWN0LCB0aGVuIHJldHVybiB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UKLSAgLy8gICAgIHRvIHRoZSBvYmplY3QgVi4KLSAgLy8KLSAgLy8gVGhlIHNwZWNpZmljYXRpb24gZG9lc24ndCBkaWN0YXRlIHdoYXQgc2hvdWxkIGhhcHBlbiBpZiBWIGltcGxlbWVudHMgbW9yZQotICAvLyB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UgQiBhbmQKLSAgLy8gaW50ZXJmYWNlIEIgaW5oZXJpdHMgZnJvbSBpbnRlcmZhY2UgQSwgd2hhdCBoYXBwZW5zIGlmIGJvdGggQSBhbmQgQiBhcmUKLSAgLy8gdW5pb24gbWVtYmVycz8gQmxpbmsgZG9lc24ndCBzZWVtIHRvIGRvIGFueXRoaW5nIHNwZWNpYWwgZm9yIHRoaXMgY2FzZS4KLSAgLy8gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdCBtYXRjaGVzLgorICAvLyA0LiBJZiB8VnwgaXMgYSBwbGF0Zm9ybSBvYmplY3QsIHRoZW46CisgIC8vICAgMS4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhbiBpbnRlcmZhY2UgdHlwZSB0aGF0IFYgaW1wbGVtZW50cywgdGhlbiByZXR1cm4KKyAgLy8gICAgICB0aGUgSURMIHZhbHVlIHRoYXQgaXMgYSByZWZlcmVuY2UgdG8gdGhlIG9iamVjdCB8VnwuCisgIC8vICAgMi4gSWYgfHR5cGVzfCBpbmNsdWRlcyBvYmplY3QsIHRoZW4gcmV0dXJuIHRoZSBJREwgdmFsdWUgdGhhdCBpcyBhCisgIC8vICAgICAgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgfFZ8LgogICBpZiAodmFsdWUuaXNPYmplY3QoKSkgeworICAgIC8vIFRoZSBzcGVjaWZpY2F0aW9uIGRvZXNuJ3QgZGljdGF0ZSB3aGF0IHNob3VsZCBoYXBwZW4gaWYgViBpbXBsZW1lbnRzCisgICAgLy8gbW9yZSB0aGFuIG9uZSBvZiB0aGUgaW50ZXJmYWNlcy4gRm9yIGV4YW1wbGUsIGlmIFYgaW1wbGVtZW50cyBpbnRlcmZhY2UKKyAgICAvLyBCIGFuZCBpbnRlcmZhY2UgQiBpbmhlcml0cyBmcm9tIGludGVyZmFjZSBBLCB3aGF0IGhhcHBlbnMgaWYgYm90aCBBIGFuZAorICAgIC8vIEIgYXJlIHVuaW9uIG1lbWJlcnM/IEJsaW5rIGRvZXNuJ3Qgc2VlbSB0byBkbyBhbnl0aGluZyBzcGVjaWFsIGZvciB0aGlzCisgICAgLy8gY2FzZS4gSnVzdCBjaG9vc2UgdGhlIGZpcnN0IGludGVyZmFjZSBpbiB0aGUgZmxhdHRlbmVkIG1lbWJlcnMgdGhhdAorICAgIC8vIG1hdGNoZXMuCisKICAgICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9vYmplY3QoY29udGV4dCk7CiAgICAgYm9vbCBzdWNjZXNzID0gSlNfVmFsdWVUb09iamVjdChjb250ZXh0LCB2YWx1ZSwgJnJvb3RlZF9vYmplY3QpOwogICAgIERDSEVDSyhzdWNjZXNzKTsKKwogICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7CiAgICAgY29uc3QgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSA9CiAgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCk7CiAKICRmb3IgVFlQRSBbWworCiAgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QkKFRZUEUpOjppc19pbnRlcmZhY2VfdHlwZSAmJgogICAgICAgICB3cmFwcGVyX2ZhY3RvcnktPkRvZXNPYmplY3RJbXBsZW1lbnRJbnRlcmZhY2UoCiAgICAgICAgICAgICByb290ZWRfb2JqZWN0LCBVbmlvblR5cGVUcmFpdHNUJChUWVBFKTo6R2V0VHlwZUlEKCkpKSB7CkBAIC0xMjMsMTIgKzEzMiwyNiBAQAogXV0KICAgfQogCi0gIC8vIFRPRE86IFN1cHBvcnQgRGF0ZSwgUmVnRXhwLCBET01FeGNlcHRpb24sIEVycm9yLCBBcnJheUJ1ZmZlciwgRGF0YVZpZXcsCi0gIC8vICAgICAgIFR5cGVkQXJyYXlOYW1lLCBjYWxsYmFjayBmdW5jdGlvbnMsIGRpY3Rpb25hcnksIGFycmF5IHR5cGUuCi0gIC8vICAgICAgIEFuZCBzZXF1ZW5jZXMgaWYgbmVjZXNzYXJ5LgorICAvLyAxMS4gSWYgfFR5cGUoVil8IGlzIE9iamVjdCwgdGhlbjoKKyAgLy8gICAxLiBJZiB8dHlwZXN8IGluY2x1ZGVzIGEgc2VxdWVuY2UgdHlwZSwgdGhlbgorICAvLyAgICAgMS4gTGV0IHxtZXRob2R8IGJlIHRoZSByZXN1bHQgb2YgR2V0TWV0aG9kKFYsIEBAaXRlcmF0b3IpCisgIC8vICAgICAyLiBSZXR1cm5JZkFicnVwdChtZXRob2QpCisgIC8vICAgICAzLiBJZiBtZXRob2QgaXMgbm90IHVuZGVmaW5lZCwgcmV0dXJuIHRoZSByZXN1bHQgb2YgY3JlYXRpbmcgYSBzZXF1ZW5jZQorICAvLyAgICAgICAgb2YgdGhhdCB0eXBlIGZyb20gfFZ8IGFuZCB8bWV0aG9kfC4KKyAgaWYgKHZhbHVlLmlzT2JqZWN0KCkpIHsKKyRmb3IgVFlQRSBbWwogCi0gIC8vIDE0LiBJZiBWIGlzIGEgQm9vbGVhbiB2YWx1ZSwgdGhlbjoKLSAgLy8gICAxLiBJZiB0eXBlcyBpbmNsdWRlcyBhIGJvb2xlYW4sIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YgY29udmVydGluZyBWCisgICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QkKFRZUEUpOjppc19zZXF1ZW5jZV90eXBlKSB7CisgICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCB2YWx1ZSwgY29udmVyc2lvbl9mbGFncywgZXhjZXB0aW9uX3N0YXRlLCAmdCQoVFlQRSkpOworICAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlJChOVU1fTUVNQkVSUyk8JGZvciBUWVBFICwgW1tUJChUWVBFKV1dPih0JChUWVBFKSk7CisgICAgICByZXR1cm47CisgICAgfQorCitdXQorICB9CisKKyAgLy8gMTIuIElmIHxUeXBlKFYpfCBpcyBCb29sZWFuLCB0aGVuOgorICAvLyAgIDEuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBib29sZWFuLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgfFZ8CiAgIC8vICAgICAgdG8gYm9vbGVhbi4KICAgaWYgKHZhbHVlLmlzQm9vbGVhbigpKSB7CiAkZm9yIFRZUEUgW1sKQEAgLTE0Miw5ICsxNjUsOSBAQAogXV0KICAgfQogCi0gIC8vIDE1LiBJZiBWIGlzIGEgTnVtYmVyIHZhbHVlLCB0aGVuOgotICAvLyAgIDEuIElmIHR5cGVzIGluY2x1ZGVzIGEgbnVtZXJpYyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcKLSAgLy8gICAgICBWIHRvIHRoYXQgbnVtZXJpYyB0eXBlLgorICAvLyAxMy4gSWYgfFR5cGUoVil8IGlzIGEgTnVtYmVyLCB0aGVuOgorICAvLyAgIDEuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBudW1lcmljIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YKKyAgLy8gICAgICBjb252ZXJ0aW5nIHxWfCB0byB0aGF0IG51bWVyaWMgdHlwZS4KICAgaWYgKHZhbHVlLmlzTnVtYmVyKCkpIHsKICRmb3IgVFlQRSBbWwogCkBAIC0xNTcsOCArMTgwLDggQEAKIF1dCiAgIH0KIAotICAvLyAxNi4gSWYgdHlwZXMgaW5jbHVkZXMgYSBzdHJpbmcgdHlwZSwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIFYKLSAgLy8gdG8gdGhhdCB0eXBlLgorICAvLyAxNC4gSWYgfHR5cGVzfCBpbmNsdWRlcyBhIHN0cmluZyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcKKyAgLy8gICAgIHxWfCB0byB0aGF0IHR5cGUuCiAgIGlmICh2YWx1ZS5pc1N0cmluZygpKSB7CiAkZm9yIFRZUEUgW1sKIApAQCAtMTcxLDggKzE5NCw4IEBACiBdXQogICB9CiAKLSAgLy8gMTcuIElmIHR5cGVzIGluY2x1ZGVzIGEgbnVtZXJpYyB0eXBlLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcKLSAgLy8gViB0byB0aGF0IG51bWVyaWMgdHlwZS4KKyAgLy8gMTUuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBudW1lcmljIHR5cGUsIHRoZW4gcmV0dXJuIHRoZSByZXN1bHQgb2YKKyAgLy8gICAgIGNvbnZlcnRpbmcgfFZ8IHRvIHRoYXQgbnVtZXJpYyB0eXBlLgogJGZvciBUWVBFIFtbCiAKICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QkKFRZUEUpOjppc19udW1lcmljX3R5cGUpIHsKQEAgLTE4MCwxMCArMjAzLDExIEBACiAgICAgKm91dF91bmlvbiA9IHNjcmlwdDo6VW5pb25UeXBlJChOVU1fTUVNQkVSUyk8JGZvciBUWVBFICwgW1tUJChUWVBFKV1dPih0JChUWVBFKSk7CiAgICAgcmV0dXJuOwogICB9CisKIF1dCiAKLSAgLy8gMTguIElmIHR5cGVzIGluY2x1ZGVzIGEgYm9vbGVhbiwgdGhlbiByZXR1cm4gdGhlIHJlc3VsdCBvZiBjb252ZXJ0aW5nIFYgdG8KLSAgLy8gYm9vbGVhbi4KKyAgLy8gMTYuIElmIHx0eXBlc3wgaW5jbHVkZXMgYSBib29sZWFuLCB0aGVuIHJldHVybiB0aGUgcmVzdWx0IG9mIGNvbnZlcnRpbmcgfFZ8CisgIC8vICAgICB0byBib29sZWFuLgogJGZvciBUWVBFIFtbCiAKICAgaWYgKFVuaW9uVHlwZVRyYWl0c1QkKFRZUEUpOjppc19ib29sZWFuX3R5cGUpIHsKQEAgLTE5MSw5ICsyMTUsMTAgQEAKICAgICAqb3V0X3VuaW9uID0gc2NyaXB0OjpVbmlvblR5cGUkKE5VTV9NRU1CRVJTKTwkZm9yIFRZUEUgLCBbW1QkKFRZUEUpXV0+KHQkKFRZUEUpKTsKICAgICByZXR1cm47CiAgIH0KKwogXV0KIAotICAvLyAxOS4gVGhyb3cgYSBUeXBlRXJyb3IuCisgIC8vIDE3LiBUaHJvdyBhIFR5cGVFcnJvci4KICAgZXhjZXB0aW9uX3N0YXRlLT5TZXRTaW1wbGVFeGNlcHRpb24oa05vdFVuaW9uVHlwZSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5ZmY0YzcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmNjCkBAIC0wLDAgKzEsMjExIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmgiCisKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzLTQ1L21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXBpLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzYXJyYXkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNpdGVyLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNjcmlwdCB7CituYW1lc3BhY2UgbW96anMgeworbmFtZXNwYWNlIHV0aWwgeworCituYW1lc3BhY2UgeworYm9vbCBHZXRPYmplY3RQcm9wZXJ0eShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwcm9wZXJ0eV9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZU9iamVjdCBvdXRfcHJvcGVydHkpIHsKKyAgRENIRUNLKGNvbnRleHQpOworICBEQ0hFQ0sob2JqZWN0KTsKKyAgRENIRUNLKHByb3BlcnR5X25hbWUpOworCisgIEpTOjpSb290ZWRWYWx1ZSBwcm9wZXJ0eV92YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCBvYmplY3QsIHByb3BlcnR5X25hbWUsICZwcm9wZXJ0eV92YWx1ZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIXByb3BlcnR5X3ZhbHVlLmlzT2JqZWN0T3JOdWxsKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBvdXRfcHJvcGVydHkuc2V0KHByb3BlcnR5X3ZhbHVlLnRvT2JqZWN0T3JOdWxsKCkpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBHZXRTeW1ib2xJdGVyYXRvcklkKEpTQ29udGV4dCogY29udGV4dCwgSlM6Ok11dGFibGVIYW5kbGVJZCBvdXRfaWQpIHsKKyAgRENIRUNLKGNvbnRleHQpOworCisgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGVudiA9IE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpOworICBKUzo6Um9vdGVkT2JqZWN0IGdsb2JhbChjb250ZXh0LCBlbnYtPmdsb2JhbF9vYmplY3RfcHJveHkoKSk7CisgIEpTOjpSb290ZWRPYmplY3Qgc3ltYm9sKGNvbnRleHQpOworICBpZiAoIUdldE9iamVjdFByb3BlcnR5KGNvbnRleHQsIGdsb2JhbCwgIlN5bWJvbCIsICZzeW1ib2wpIHx8ICFzeW1ib2wpIHsKKyAgICBETE9HKElORk8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIEpTOjpSb290ZWRWYWx1ZSBpdGVyYXRvcl9zeW1ib2woY29udGV4dCk7CisgIGlmICghSlNfR2V0UHJvcGVydHkoY29udGV4dCwgc3ltYm9sLCAiaXRlcmF0b3IiLCAmaXRlcmF0b3Jfc3ltYm9sKSkgeworICAgIERMT0coSU5GTyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKCFpdGVyYXRvcl9zeW1ib2wuaXNTeW1ib2woKSkgeworICAgIERMT0coSU5GTyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgb3V0X2lkLnNldChTWU1CT0xfVE9fSlNJRChpdGVyYXRvcl9zeW1ib2wudG9TeW1ib2woKSkpOworICByZXR1cm4gdHJ1ZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitib29sIElzU2FtZUdjVGhpbmcoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUxLAorICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZTIpIHsKKyAgaWYgKHZhbHVlMS5pc051bGxPclVuZGVmaW5lZCgpKSB7CisgICAgcmV0dXJuIHZhbHVlMi5pc051bGxPclVuZGVmaW5lZCgpOworICB9CisKKyAgaWYgKCF2YWx1ZTEuaXNHQ1RoaW5nKCkgfHwgIXZhbHVlMi5pc0dDVGhpbmcoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHJldHVybiB2YWx1ZTEudG9HQ1RoaW5nKCkgPT0gdmFsdWUyLnRvR0NUaGluZygpOworfQorCitib29sIEdldEl0ZXJhdG9yKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlT2JqZWN0IG91dF9pdGVyYXRvcikgeworICBKUzo6Um9vdGVkSWQgaWQoY29udGV4dCk7CisgIGlmICghR2V0U3ltYm9sSXRlcmF0b3JJZChjb250ZXh0LCAmaWQpKSB7CisgICAgRExPRyhJTkZPKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBKUzo6Um9vdGVkVmFsdWUgaXRlcmF0b3JfdmFsdWUoY29udGV4dCk7CisgIGlmICghSW52b2tlMChjb250ZXh0LCBvYmplY3QsIGlkLCAmaXRlcmF0b3JfdmFsdWUpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgb3V0X2l0ZXJhdG9yLnNldChpdGVyYXRvcl92YWx1ZS50b09iamVjdE9yTnVsbCgpKTsKKyAgcmV0dXJuIG91dF9pdGVyYXRvcjsKK30KKworYm9vbCBJdGVyYXRvck5leHQoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVPYmplY3Qgb3V0X2l0ZXJhdG9yX3Jlc3VsdCkgeworICBKUzo6Um9vdGVkVmFsdWUgbW9yZShjb250ZXh0KTsKKyAgaWYgKCFqczo6SXRlcmF0b3JNb3JlKGNvbnRleHQsIGl0ZXJhdG9yLCAmbW9yZSkpIHsKKyAgICBNb3pqc0V4Y2VwdGlvblN0YXRlIGV4Y2VwdGlvbihjb250ZXh0KTsKKyAgICBleGNlcHRpb24uU2V0U2ltcGxlRXhjZXB0aW9uKGtOb3RJdGVyYWJsZVR5cGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChtb3JlLmlzTWFnaWMoSlNfTk9fSVRFUl9WQUxVRSkpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgdW5kZWZpbmVkKGNvbnRleHQsIEpTOjpVbmRlZmluZWRWYWx1ZSgpKTsKKyAgICBvdXRfaXRlcmF0b3JfcmVzdWx0LnNldCgKKyAgICAgICAganM6OkNyZWF0ZUl0clJlc3VsdE9iamVjdChjb250ZXh0LCB1bmRlZmluZWQsIHRydWUpKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIG91dF9pdGVyYXRvcl9yZXN1bHQuc2V0KGpzOjpDcmVhdGVJdHJSZXN1bHRPYmplY3QoY29udGV4dCwgbW9yZSwgZmFsc2UpKTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgSXRlcmF0b3JDb21wbGV0ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgaXRlcmF0b3JfcmVzdWx0KSB7CisgIEpTOjpSb290ZWRWYWx1ZSBkb25lKGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5KGNvbnRleHQsIGl0ZXJhdG9yX3Jlc3VsdCwgImRvbmUiLCAmZG9uZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICByZXR1cm4gSlM6OlRvQm9vbGVhbihkb25lKTsKK30KKworYm9vbCBJdGVyYXRvclZhbHVlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBpdGVyYXRvcl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfcmVzdWx0KSB7CisgIEpTOjpSb290ZWRWYWx1ZSB2YWx1ZShjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCBpdGVyYXRvcl9yZXN1bHQsICJ2YWx1ZSIsICZ2YWx1ZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBvdXRfcmVzdWx0LnNldCh2YWx1ZSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEl0ZXJhdG9yU3RlcChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgaXRlcmF0b3IsCisgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZU9iamVjdCBvdXRfaXRlcmF0b3JfcmVzdWx0KSB7CisgIEpTOjpSb290ZWRPYmplY3QgcmVzdWx0KGNvbnRleHQpOworICBpZiAoIUl0ZXJhdG9yTmV4dChjb250ZXh0LCBpdGVyYXRvciwgJnJlc3VsdCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoSXRlcmF0b3JDb21wbGV0ZShjb250ZXh0LCByZXN1bHQpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIG91dF9pdGVyYXRvcl9yZXN1bHQuc2V0KHJlc3VsdCk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIEl0ZXJhdG9yQ2xvc2UoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGl0ZXJhdG9yKSB7CisgIHJldHVybiBqczo6Q2xvc2VJdGVyYXRvcihjb250ZXh0LCBpdGVyYXRvcik7Cit9CisKK2Jvb2wgQ2FsbDAoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlRnVuY3Rpb24gZnVuY3Rpb24sCisgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgdmFsdWUsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3Jlc3VsdCkgeworICBjb25zdCBzaXplX3Qga051bUFyZ3VtZW50cyA9IDA7CisgIEpTOjpBdXRvVmFsdWVWZWN0b3IgYXJncyhjb250ZXh0KTsKKyAgcmV0dXJuIEpTOjpDYWxsKGNvbnRleHQsIHZhbHVlLCBmdW5jdGlvbiwgYXJncywgb3V0X3Jlc3VsdCk7Cit9CisKK2Jvb2wgSW52b2tlMChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcGVydHlfbmFtZSwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfcmVzdWx0KSB7CisgIEpTOjpSb290ZWRWYWx1ZSBwcm9wZXJ0eShjb250ZXh0KTsKKyAgaWYgKCFKU19HZXRQcm9wZXJ0eShjb250ZXh0LCB2YWx1ZSwgcHJvcGVydHlfbmFtZSwgJnByb3BlcnR5KSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghcHJvcGVydHkuaXNPYmplY3QoKSB8fCAhSlM6OklzQ2FsbGFibGUocHJvcGVydHkudG9PYmplY3RPck51bGwoKSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBKUzo6Um9vdGVkRnVuY3Rpb24gZnVuY3Rpb24oY29udGV4dCwgSlNfVmFsdWVUb0Z1bmN0aW9uKGNvbnRleHQsIHByb3BlcnR5KSk7CisgIERDSEVDSyhmdW5jdGlvbik7CisKKyAgcmV0dXJuIHV0aWw6OkNhbGwwKGNvbnRleHQsIGZ1bmN0aW9uLCB2YWx1ZSwgb3V0X3Jlc3VsdCk7Cit9CisKK2Jvb2wgSW52b2tlMChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgSlM6OkhhbmRsZUlkIHByb3BlcnR5X2lkLCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF9yZXN1bHQpIHsKKyAgSlM6OlJvb3RlZFZhbHVlIHByb3BlcnR5KGNvbnRleHQpOworICBpZiAoIUpTX0dldFByb3BlcnR5QnlJZChjb250ZXh0LCB2YWx1ZSwgcHJvcGVydHlfaWQsICZwcm9wZXJ0eSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBpZiAoIXByb3BlcnR5LmlzT2JqZWN0KCkgfHwgIUpTOjpJc0NhbGxhYmxlKHByb3BlcnR5LnRvT2JqZWN0T3JOdWxsKCkpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgSlM6OlJvb3RlZEZ1bmN0aW9uIGZ1bmN0aW9uKGNvbnRleHQsIEpTX1ZhbHVlVG9GdW5jdGlvbihjb250ZXh0LCBwcm9wZXJ0eSkpOworICBEQ0hFQ0soZnVuY3Rpb24pOworCisgIHJldHVybiB1dGlsOjpDYWxsMChjb250ZXh0LCBmdW5jdGlvbiwgdmFsdWUsIG91dF9yZXN1bHQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIG1vempzCit9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE4M2FkZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuaApAQCAtMCwwICsxLDcyIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1VUSUxfQUxHT1JJVEhNX0hFTFBFUlNfSF8KKyNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9VVElMX0FMR09SSVRITV9IRUxQRVJTX0hfCisKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugc2NyaXB0IHsKK25hbWVzcGFjZSBtb3pqcyB7CituYW1lc3BhY2UgdXRpbCB7CisvLyBXaGV0aGVyIHx2YWx1ZTF8IGFuZCB8dmFsdWUyfCBhcmUgYm90aCBHQyB0aGluZ3MgYW5kIGFyZSB0aGUgc2FtZSBHQyB0aGluZy4KKy8vIGkuZS4gUmV0dXJucyB8ZmFsc2V8IGlmIGVpdGhlciB2YWx1ZSBpcyBub3QgYSBHQyB0aGluZy4KK2Jvb2wgSXNTYW1lR2NUaGluZyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZVZhbHVlIHZhbHVlMik7CisKKy8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWdldGl0ZXJhdG9yCitib29sIEdldEl0ZXJhdG9yKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsCisgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlT2JqZWN0IG91dF9pdGVyYXRvcik7CisKKy8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9ybmV4dAorYm9vbCBJdGVyYXRvck5leHQoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGl0ZXJhdG9yLAorICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVPYmplY3Qgb3V0X2l0ZXJhdG9yX3Jlc3VsdCk7CisKKy8vIGh0dHBzOi8vdGMzOS5naXRodWIuaW8vZWNtYTI2Mi8jc2VjLWl0ZXJhdG9yY29tcGxldGUKK2Jvb2wgSXRlcmF0b3JDb21wbGV0ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgaXRlcmF0b3JfcmVzdWx0KTsKKworLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3J2YWx1ZQorYm9vbCBJdGVyYXRvclZhbHVlKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBpdGVyYXRvcl9yZXN1bHQsCisgICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfcmVzdWx0KTsKKworLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtaXRlcmF0b3JzdGVwCisvLworLy8gVE9ETzogb3V0X2l0ZXJhdG9yX3Jlc3VsdCBzaG91bGQgcHJvYmFibHkgYmUgYSBWYWx1ZSBzbyBpdCBjYW4gcmV0dXJuIGZhbHNlCisvLyBvciB0aGUgbmV4dCBpdGVyYXRvciByZWNvcmQuIFJpZ2h0IG5vdyB0aGlzIGFuZCBJdGVyYXRvckNvbXBsZXRlIGFyZSB0aGUgb25seQorLy8gZnVuY3Rpb25zIHdoZXJlIGEgZmFsc2UgcmV0dXJuIHZhbHVlIGRvZXNuJ3QgbmVjZXNzYXJpbHkgbWVhbiBhbiBlcnJvci4KK2Jvb2wgSXRlcmF0b3JTdGVwKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBpdGVyYXRvciwKKyAgICAgICAgICAgICAgICAgIEpTOjpNdXRhYmxlSGFuZGxlT2JqZWN0IG91dF9pdGVyYXRvcl9yZXN1bHQpOworCisvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pdGVyYXRvcmNsb3NlCitib29sIEl0ZXJhdG9yQ2xvc2UoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGl0ZXJhdG9yKTsKKworLy8gaHR0cHM6Ly90YzM5LmdpdGh1Yi5pby9lY21hMjYyLyNzZWMtY2FsbAorLy8gQ2FsbCB8ZnVuY3Rpb258IG9uIG9iamVjdCB8dmFsdWV8IHdpdGggMCBhcmd1bWVudHMuCitib29sIENhbGwwKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZUZ1bmN0aW9uIGZ1bmN0aW9uLAorICAgICAgICAgICBKUzo6SGFuZGxlT2JqZWN0IHZhbHVlLCBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF9yZXN1bHQpOworCisvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1pbnZva2UKKy8vIEludm9rZSBhIG1ldGhvZCBuYW1lZCB8cHJvcGVydHlfbmFtZXwgb24gb2JqZWN0IHx2YWx1ZXwgd2l0aCAwIGFyZ3VtZW50cy4KK2Jvb2wgSW52b2tlMChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgdmFsdWUsCisgICAgICAgICAgICAgY29uc3QgY2hhciogcHJvcGVydHlfbmFtZSwgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfcmVzdWx0KTsKKworYm9vbCBJbnZva2UwKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCB2YWx1ZSwKKyAgICAgICAgICAgICBKUzo6SGFuZGxlSWQgcHJvcGVydHlfaWQsIEpTOjpNdXRhYmxlSGFuZGxlVmFsdWUgb3V0X3Jlc3VsdCk7Cit9ICAvLyBuYW1lc3BhY2UgdXRpbAorfSAgLy8gbmFtZXNwYWNlIG1vempzCit9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CisjZW5kaWYgIC8vIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfVVRJTF9BTEdPUklUSE1fSEVMUEVSU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdXRpbC9leGNlcHRpb25faGVscGVycy5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuY2MKaW5kZXggMTgwNTI3ZC4uMjFkZmI4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdXRpbC9leGNlcHRpb25faGVscGVycy5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2V4Y2VwdGlvbl9oZWxwZXJzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvdXRpbC9leGNlcHRpb25faGVscGVycy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2V4Y2VwdGlvbl9oZWxwZXJzLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS91dGlsL2V4Y2VwdGlvbl9oZWxwZXJzLmgKaW5kZXggZDYwY2Y3YS4uYjk1MGQ2NyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvdXRpbC9leGNlcHRpb25faGVscGVycy5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfVVRJTF9FWENFUFRJT05fSEVMUEVSU19IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1VUSUxfRVhDRVBUSU9OX0hFTFBFUlNfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdC5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3QuY2MKaW5kZXggNDk5MTRkMy4uOGM5MTkzMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdC5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93ZWFrX2hlYXBfb2JqZWN0LmNjCkBAIC0xLDQ4ICsxLDcyIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdC5oIgogCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy00NS9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvZ2MvTWFya2luZy5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2FwaS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzY3JpcHQgewogbmFtZXNwYWNlIG1vempzIHsKIAotV2Vha0hlYXBPYmplY3Q6OldlYWtIZWFwT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBoYW5kbGUpIHsKK1dlYWtIZWFwT2JqZWN0OjpXZWFrSGVhcE9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSkKKyAgICA6IHdhc19jb2xsZWN0ZWRfKGZhbHNlKSB7CiAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICBNb3pqc0dsb2JhbEVudmlyb25tZW50OjpHZXRGcm9tQ29udGV4dChjb250ZXh0KTsKLSAgSW5pdGlhbGl6ZShnbG9iYWxfZW52aXJvbm1lbnQtPndlYWtfb2JqZWN0X21hbmFnZXIoKSwgaGFuZGxlKTsKKyAgSW5pdGlhbGl6ZShnbG9iYWxfZW52aXJvbm1lbnQtPndlYWtfb2JqZWN0X21hbmFnZXIoKSwgdmFsdWUpOwogfQogCi1XZWFrSGVhcE9iamVjdDo6V2Vha0hlYXBPYmplY3QoY29uc3QgV2Vha0hlYXBPYmplY3QmIG90aGVyKSB7Ci0gIEluaXRpYWxpemUob3RoZXIud2Vha19vYmplY3RfbWFuYWdlcl8sIG90aGVyLmhlYXBfKTsKK1dlYWtIZWFwT2JqZWN0OjpXZWFrSGVhcE9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0KQorICAgIDogd2FzX2NvbGxlY3RlZF8oZmFsc2UpIHsKKyAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KKyAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpOworICBJbml0aWFsaXplKGdsb2JhbF9lbnZpcm9ubWVudC0+d2Vha19vYmplY3RfbWFuYWdlcigpLAorICAgICAgICAgICAgIEpTOjpPYmplY3RWYWx1ZSgqb2JqZWN0KSk7Cit9CisKK1dlYWtIZWFwT2JqZWN0OjpXZWFrSGVhcE9iamVjdChjb25zdCBXZWFrSGVhcE9iamVjdCYgb3RoZXIpCisgICAgOiB3YXNfY29sbGVjdGVkXyhvdGhlci53YXNfY29sbGVjdGVkXykgeworICBJbml0aWFsaXplKG90aGVyLndlYWtfb2JqZWN0X21hbmFnZXJfLCBvdGhlci52YWx1ZV8pOwogfQogCiBXZWFrSGVhcE9iamVjdCYgV2Vha0hlYXBPYmplY3Q6Om9wZXJhdG9yPShjb25zdCBXZWFrSGVhcE9iamVjdCYgcmhzKSB7Ci0gIEluaXRpYWxpemUocmhzLndlYWtfb2JqZWN0X21hbmFnZXJfLCByaHMuaGVhcF8pOworICB3YXNfY29sbGVjdGVkXyA9IHJocy53YXNfY29sbGVjdGVkXzsKKyAgSW5pdGlhbGl6ZShyaHMud2Vha19vYmplY3RfbWFuYWdlcl8sIHJocy52YWx1ZV8pOwogICByZXR1cm4gKnRoaXM7CiB9CiAKIHZvaWQgV2Vha0hlYXBPYmplY3Q6OlRyYWNlKEpTVHJhY2VyKiB0cmFjZSkgewotICBpZiAoaGVhcF8pIHsKLSAgICBKU19DYWxsT2JqZWN0VHJhY2VyKHRyYWNlLCAmaGVhcF8sICJXZWFrSGVhcE9iamVjdDo6VHJhY2UiKTsKKyAgaWYgKCF2YWx1ZV8uaXNOdWxsT3JVbmRlZmluZWQoKSkgeworICAgIEpTX0NhbGxWYWx1ZVRyYWNlcih0cmFjZSwgJnZhbHVlXywgIldlYWtIZWFwT2JqZWN0OjpUcmFjZSIpOwogICB9CiB9CiAKK2Jvb2wgV2Vha0hlYXBPYmplY3Q6OklzT2JqZWN0KCkgY29uc3QgeworICByZXR1cm4gdmFsdWVfLmlzT2JqZWN0KCk7Cit9CisKK2Jvb2wgV2Vha0hlYXBPYmplY3Q6OklzR2NUaGluZygpIGNvbnN0IHsKKyAgLy8gV2UgaGF2ZSB0byBjaGVjayBJc051bGwoKSwgYmVjYXVzZSBudWxsIGlzIGFwcGFyZW50bHkgYSBHQyBUaGluZy4KKyAgcmV0dXJuICghSXNOdWxsKCkgJiYgdmFsdWVfLmlzR0NUaGluZygpKTsKK30KKworYm9vbCBXZWFrSGVhcE9iamVjdDo6V2FzQ29sbGVjdGVkKCkgY29uc3QgeworICByZXR1cm4gKHdhc19jb2xsZWN0ZWRfICYmIElzTnVsbCgpKTsKK30KKwogV2Vha0hlYXBPYmplY3Q6On5XZWFrSGVhcE9iamVjdCgpIHsKICAgLy8gSXQncyBzYWZlIHRvIGNhbGwgU3RvcFRyYWNraW5nIGV2ZW4gaWYgU3RhcnRUcmFja2luZyB3YXNuJ3QgY2FsbGVkLiB0aGUKICAgLy8gV2Vha09iamVjdE1hbmFnZXIgaGFuZGxlcyB0aGUgY2FzZSB3aGVyZSBpdCdzIG5vdCBjdXJyZW50bHkgdHJhY2tpbmcgdGhlCkBAIC01MSwxNSArNzUsMjggQEAKIH0KIAogdm9pZCBXZWFrSGVhcE9iamVjdDo6SW5pdGlhbGl6ZShXZWFrSGVhcE9iamVjdE1hbmFnZXIqIHdlYWtfaGVhcF9vYmplY3RfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNPYmplY3QqIG9iamVjdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKSB7CiAgIHdlYWtfb2JqZWN0X21hbmFnZXJfID0gd2Vha19oZWFwX29iamVjdF9tYW5hZ2VyOwotICBoZWFwXyA9IG9iamVjdDsKLSAgLy8gRG9uJ3QgYm90aGVyIHJlZ2lzdGVyaW5nIGlmIHRoZSBwb2ludGVyIGlzIGFscmVhZHkgTlVMTC4KLSAgaWYgKGhlYXBfKSB7CisgIHZhbHVlXyA9IHZhbHVlOworCisgIC8vIERvbid0IGJvdGhlciByZWdpc3RlcmluZyBpZiBub3QgYSBHQyB0aGluZy4KKyAgaWYgKElzR2NUaGluZygpKSB7CiAgICAgd2Vha19vYmplY3RfbWFuYWdlcl8tPlN0YXJ0VHJhY2tpbmcodGhpcyk7CiAgIH0KIH0KIAorYm9vbCBXZWFrSGVhcE9iamVjdDo6SXNOdWxsKCkgY29uc3QgeworICByZXR1cm4gdmFsdWVfLmlzTnVsbE9yVW5kZWZpbmVkKCk7Cit9CisKK3ZvaWQgV2Vha0hlYXBPYmplY3Q6OlVwZGF0ZVdlYWtQb2ludGVyQWZ0ZXJHYygpIHsKKyAgaWYgKGpzOjpnYzo6SXNBYm91dFRvQmVGaW5hbGl6ZWRVbmJhcnJpZXJlZCh2YWx1ZV8udW5zYWZlR2V0KCkpKSB7CisgICAgRENIRUNLKElzR2NUaGluZygpKTsKKyAgICB3YXNfY29sbGVjdGVkXyA9IHRydWU7CisgICAgdmFsdWVfLnNldE51bGwoKTsKKyAgfQorfQorCiB9ICAvLyBuYW1lc3BhY2UgbW96anMKIH0gIC8vIG5hbWVzcGFjZSBzY3JpcHQKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3QuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3QuaAppbmRleCBiNTAwNWI4Li41M2VjMjM1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93ZWFrX2hlYXBfb2JqZWN0LmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9XRUFLX0hFQVBfT0JKRUNUX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfV0VBS19IRUFQX09CSkVDVF9IXwogCkBAIC0yMywyNiArMjEsNDAgQEAKIG5hbWVzcGFjZSBzY3JpcHQgewogbmFtZXNwYWNlIG1vempzIHsKIAotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEgd2VhayByZWZlcmVuY2UgdG8gYSBKU09iamVjdC4gVGhlIEpTT2JqZWN0IHRoYXQgYW4KKy8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHdlYWsgcmVmZXJlbmNlIHRvIGEgSlM6OlZhbHVlLiBUaGUgSlM6OlZhbHVlIHRoYXQgYW4KIC8vIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgaXMgY3JlYXRlZCB3aXRoIG1heSBnZXQgZ2FyYmFnZSBjb2xsZWN0ZWQuIEluIHRoYXQKIC8vIGNhc2UsIHN1YnNlcXVlbnQgY2FsbHMgdG8gV2Vha0hlYXBPYmplY3Q6OkdldCgpIHdpbGwgcmV0dXJuIGEgTlVMTCBwb2ludGVyLgogY2xhc3MgV2Vha0hlYXBPYmplY3QgewogIHB1YmxpYzoKLSAgV2Vha0hlYXBPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGhhbmRsZSk7CisgIFdlYWtIZWFwT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIHZhbHVlKTsKKyAgV2Vha0hlYXBPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCk7CiAgIFdlYWtIZWFwT2JqZWN0KGNvbnN0IFdlYWtIZWFwT2JqZWN0JiBvdGhlcik7CiAKICAgV2Vha0hlYXBPYmplY3QmIG9wZXJhdG9yPShjb25zdCBXZWFrSGVhcE9iamVjdCYgcmhzKTsKLSAgSlNPYmplY3QqIEdldCgpIGNvbnN0IHsgcmV0dXJuIGhlYXBfOyB9CisgIGNvbnN0IEpTOjpWYWx1ZSYgR2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZV8uZ2V0KCk7IH0KKyAgSlNPYmplY3QqIEdldE9iamVjdCgpIGNvbnN0IHsKKyAgICByZXR1cm4gdmFsdWVfLnRvT2JqZWN0T3JOdWxsKCk7CisgIH0KKwogICB2b2lkIFRyYWNlKEpTVHJhY2VyKiB0cmFjZSk7CisgIGJvb2wgSXNPYmplY3QoKSBjb25zdDsKKyAgYm9vbCBJc0djVGhpbmcoKSBjb25zdDsKKworICAvLyBXaGV0aGVyIHRoZSB2YWx1ZSB3YXMgYSBHQyBUaGluZyBhbmQgaGFzIGJlZW4gYWN0dWFsbHkgR0MnZC4KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdDsKIAogICB+V2Vha0hlYXBPYmplY3QoKTsKIAogIHByaXZhdGU6CiAgIHZvaWQgSW5pdGlhbGl6ZShXZWFrSGVhcE9iamVjdE1hbmFnZXIqIHdlYWtfaGVhcF9vYmplY3RfbWFuYWdlciwKLSAgICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBvYmplY3QpOworICAgICAgICAgICAgICAgICAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSk7CisKKyAgYm9vbCBJc051bGwoKSBjb25zdDsKKyAgdm9pZCBVcGRhdGVXZWFrUG9pbnRlckFmdGVyR2MoKTsKIAogICBXZWFrSGVhcE9iamVjdE1hbmFnZXIqIHdlYWtfb2JqZWN0X21hbmFnZXJfOwotICBKUzo6SGVhcDxKU09iamVjdCo+IGhlYXBfOworICBKUzo6SGVhcDxKUzo6VmFsdWU+IHZhbHVlXzsKKyAgYm9vbCB3YXNfY29sbGVjdGVkXzsKIAogICBmcmllbmQgY2xhc3MgV2Vha0hlYXBPYmplY3RNYW5hZ2VyOwogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5jYwppbmRleCBhMmM3ZTM3Li5lYmViNDEzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93ZWFrX2hlYXBfb2JqZWN0X21hbmFnZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdF9tYW5hZ2VyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdF9tYW5hZ2VyLmgiCiAKQEAgLTIwLDggKzE4LDcgQEAKIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd2Vha19oZWFwX29iamVjdC5oIgotI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9nYy9CYXJyaWVyLmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2djL01hcmtpbmcuaCIKKyNpbmNsdWRlICJuYi9tZW1vcnlfc2NvcGUuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNhcGkuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC00OCw2ICs0NSw3IEBACiB9CiAKIHZvaWQgV2Vha0hlYXBPYmplY3RNYW5hZ2VyOjpTdGFydFRyYWNraW5nKFdlYWtIZWFwT2JqZWN0KiB3ZWFrX29iamVjdCkgeworICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgc3RkOjpwYWlyPFdlYWtIZWFwT2JqZWN0czo6aXRlcmF0b3IsIGJvb2w+IHBpYiA9CiAgICAgICB3ZWFrX29iamVjdHNfLmluc2VydCh3ZWFrX29iamVjdCk7CiAgIERDSEVDSyhwaWIuc2Vjb25kKSA8PCAiV2Vha0hlYXBPYmplY3Qgd2FzIGFscmVhZHkgYmVpbmcgdHJhY2tlZC4iOwpAQCAtNjMsOCArNjEsOCBAQAogfQogCiBib29sIFdlYWtIZWFwT2JqZWN0TWFuYWdlcjo6TWF5YmVTd2VlcChXZWFrSGVhcE9iamVjdCogd2Vha19vYmplY3QpIHsKLSAgSlNfVXBkYXRlV2Vha1BvaW50ZXJBZnRlckdDKCZ3ZWFrX29iamVjdC0+aGVhcF8pOwotICByZXR1cm4gd2Vha19vYmplY3QtPmhlYXBfID09IE5VTEw7CisgIHdlYWtfb2JqZWN0LT5VcGRhdGVXZWFrUG9pbnRlckFmdGVyR2MoKTsKKyAgcmV0dXJuIHdlYWtfb2JqZWN0LT5XYXNDb2xsZWN0ZWQoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIG1vempzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93ZWFrX2hlYXBfb2JqZWN0X21hbmFnZXIuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5oCmluZGV4IDc2YTg4MjEuLmE0NTJmM2QgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU180NV9XRUFLX0hFQVBfT0JKRUNUX01BTkFHRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU180NV9XRUFLX0hFQVBfT0JKRUNUX01BTkFHRVJfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmNjCmluZGV4IGNlOTRjM2MuLmM0ZWQ3MzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfZmFjdG9yeS5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmgiCiAKICNpbmNsdWRlIDx1dGlsaXR5PgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9mYWN0b3J5LmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaAppbmRleCAwMjQ1M2VkLi5iYTgzNzQ1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX2ZhY3RvcnkuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfV1JBUFBFUl9GQUNUT1JZX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfNDVfV1JBUFBFUl9GQUNUT1JZX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5jYwppbmRleCA5NWQyZTU2Li5lY2I5ZmRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy00NS93cmFwcGVyX3ByaXZhdGUuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzLTQ1L3dyYXBwZXJfcHJpdmF0ZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgKaW5kZXggYTdjY2NlMy4uZGMxYTk1NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMtNDUvd3JhcHBlcl9wcml2YXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1dSQVBQRVJfUFJJVkFURV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTXzQ1X1dSQVBQRVJfUFJJVkFURV9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jYWxsYmFja19mdW5jdGlvbl9jb252ZXJzaW9uLmgKaW5kZXggNjhiZDM3ZS4uODRkYTIxZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvY2FsbGJhY2tfZnVuY3Rpb25fY29udmVyc2lvbi5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NhbGxiYWNrX2Z1bmN0aW9uX2NvbnZlcnNpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19DQUxMQkFDS19GVU5DVElPTl9DT05WRVJTSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfQ0FMTEJBQ0tfRlVOQ1RJT05fQ09OVkVSU0lPTl9IXwpAQCAtMjIsNyArMjAsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbG9nZ2luZ19leGNlcHRpb25fc3RhdGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaCIKLSNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTMzLDcgKzMxLDcgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBTaWduYXR1cmU+CiB2b2lkIFRvSlNWYWx1ZSgKICAgICBKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgY29uc3QgU2NyaXB0T2JqZWN0PENhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+KiBjYWxsYmFja19mdW5jdGlvbiwKKyAgICBjb25zdCBTY3JpcHRWYWx1ZTxDYWxsYmFja0Z1bmN0aW9uPFNpZ25hdHVyZT4gPiogY2FsbGJhY2tfZnVuY3Rpb24sCiAgICAgSlM6Ok11dGFibGVIYW5kbGVWYWx1ZSBvdXRfdmFsdWUpIHsKICAgaWYgKCFjYWxsYmFja19mdW5jdGlvbikgewogICAgIG91dF92YWx1ZS5zZXQoSlM6Ok51bGxWYWx1ZSgpKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5jYwppbmRleCA5MmZlZjBiLi5lZjYzYjM1IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCiAKQEAgLTEwNiw3ICsxMDQsNyBAQAogICBEQ0hFQ0soanNfb2JqZWN0KTsKICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KICAgICAgIHN0YXRpY19jYXN0PE1vempzR2xvYmFsRW52aXJvbm1lbnQqPihKU19HZXRDb250ZXh0UHJpdmF0ZShjb250ZXh0KSk7Ci0gICpvdXRfaG9sZGVyID0gTW96anNPYmplY3RIYW5kbGVIb2xkZXIoanNfb2JqZWN0LCBjb250ZXh0LAorICAqb3V0X2hvbGRlciA9IE1vempzT2JqZWN0SGFuZGxlSG9sZGVyKHZhbHVlLCBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+d3JhcHBlcl9mYWN0b3J5KCkpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJzaW9uX2hlbHBlcnMuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oCmluZGV4IDRiMDNlOTEuLmUzOTkzMjEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX0NPTlZFUlNJT05fSEVMUEVSU19IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX0NPTlZFUlNJT05fSEVMUEVSU19IXwpAQCAtNDQ3LDcgKzQ0NSw3IEBACiAvLyBDYWxsYmFja0ludGVyZmFjZSAtPiBKU1ZhbHVlCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KIGlubGluZSB2b2lkIFRvSlNWYWx1ZShKU0NvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NyaXB0T2JqZWN0PFQ+KiBjYWxsYmFja19pbnRlcmZhY2UsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2NyaXB0VmFsdWU8VD4qIGNhbGxiYWNrX2ludGVyZmFjZSwKICAgICAgICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZVZhbHVlIG91dF92YWx1ZSkgewogICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgaWYgKCFjYWxsYmFja19pbnRlcmZhY2UpIHsKQEAgLTQ2OSw5ICs0NjcsOSBAQAogICAvLyBjYW4gZ2V0IHRoZSBpbXBsZW1lbnRpbmcgb2JqZWN0LgogICBjb25zdCBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlQ2xhc3MqIG1vempzX2NhbGxiYWNrX2ludGVyZmFjZSA9CiAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxjb25zdCBNb3pqc0NhbGxiYWNrSW50ZXJmYWNlQ2xhc3MqPigKLSAgICAgICAgICB1c2VyX29iamVjdF9ob2xkZXItPkdldFNjcmlwdE9iamVjdCgpKTsKKyAgICAgICAgICB1c2VyX29iamVjdF9ob2xkZXItPkdldFNjcmlwdFZhbHVlKCkpOwogICBEQ0hFQ0sobW96anNfY2FsbGJhY2tfaW50ZXJmYWNlKTsKLSAgb3V0X3ZhbHVlLnNldChPQkpFQ1RfVE9fSlNWQUwobW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLT5oYW5kbGUoKSkpOworICBvdXRfdmFsdWUuc2V0KG1vempzX2NhbGxiYWNrX2ludGVyZmFjZS0+dmFsdWUoKSk7CiB9CiAKIC8vIEpTVmFsdWUgLT4gQ2FsbGJhY2tJbnRlcmZhY2UKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnRfY2FsbGJhY2tfcmV0dXJuX3ZhbHVlLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJ0X2NhbGxiYWNrX3JldHVybl92YWx1ZS5oCmluZGV4IDA1YzUyNDUuLmEwYjE1NjQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnRfY2FsbGJhY2tfcmV0dXJuX3ZhbHVlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvY29udmVydF9jYWxsYmFja19yZXR1cm5fdmFsdWUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19DT05WRVJUX0NBTExCQUNLX1JFVFVSTl9WQUxVRV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX0NPTlZFUlRfQ0FMTEJBQ0tfUkVUVVJOX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9pbnRlcmZhY2VfZGF0YS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvaW50ZXJmYWNlX2RhdGEuaAppbmRleCBhODFiNjhhLi42MTM3ODBmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9pbnRlcmZhY2VfZGF0YS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL2ludGVyZmFjZV9kYXRhLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfSU5URVJGQUNFX0RBVEFfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19JTlRFUkZBQ0VfREFUQV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anMuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqcy5jYwppbmRleCAzZDc4YjE2Li4zNmJiMjg4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqcy5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxpb3N0cmVhbT4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anMuZ3lwIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anMuZ3lwCmluZGV4IDcyNjJjZGMuLjg4OTZjNzIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzLmd5cAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqcy5neXAKQEAgLTMyLDYgKzMyLDggQEAKICAgICAgICAgJ3JlZmVyZW5jZWRfb2JqZWN0X21hcC5jYycsCiAgICAgICAgICd1dGlsL2FsZ29yaXRobV9oZWxwZXJzLmNjJywKICAgICAgICAgJ3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuY2MnLAorICAgICAgICAndXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmNjJywKKyAgICAgICAgJ3V0aWwvc3RhY2tfdHJhY2VfaGVscGVycy5oJywKICAgICAgICAgJ3dlYWtfaGVhcF9vYmplY3QuY2MnLAogICAgICAgICAnd2Vha19oZWFwX29iamVjdC5oJywKICAgICAgICAgJ3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5jYycsCkBAIC04OCw3ICs5MCw4IEBACiAgICAgICAgICdtb3pqc190cmFjZV9sb2dnaW5nLmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmFzZS9iYXNlLmd5cDpiYXNlJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgICAgJzwoREVQVEgpL3RoaXJkX3BhcnR5L21vempzL21vempzLmd5cDptb3pqc19saWInLAogICAgICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oCmluZGV4IGVmNjkzMmEuLjdhMmFlYmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaApAQCAtMiwyMSArMiwxOSBAQAogLy8gICAgIHB1bXAucHkgbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaC5wdW1wCiAvLyBETyBOT1QgRURJVCBCWSBIQU5EISEhCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBjbGFuZy1mb3JtYXQgb2ZmCiAKQEAgLTI4LDYgKzI2LDcgQEAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL2NvbnZlcnNpb25faGVscGVycy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVydF9jYWxsYmFja19yZXR1cm5fdmFsdWUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3V0aWwvc3RhY2tfdHJhY2VfaGVscGVycy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd2Vha19oZWFwX29iamVjdC5oIgogI2luY2x1ZGUgIm5iL21lbW9yeV9zY29wZS5oIgogI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgpAQCAtNTcsMTMgKzU2LDIxIEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBKU1ZBTF9UT19PQkpFQ1QoZnVuY3Rpb24pKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oKQogICAgICAgY29uc3QgT1ZFUlJJREUgeworICAgIEVOQUJMRV9KU19TVEFDS19UUkFDRV9JTl9TQ09QRShjb250ZXh0Xyk7CiAgICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnNjcmlwdDo6bW96anMiLCAiTW96anNDYWxsYmFja0Z1bmN0aW9uOjpSdW4iKTsKICAgICBDYWxsYmFja1Jlc3VsdDxSPiBjYWxsYmFja19yZXN1bHQ7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldCgpKTsKKyAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKSk7CiAgICAgaWYgKCFmdW5jdGlvbikgewogICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRnVuY3Rpb24gd2FzIGdhcmJhZ2UgY29sbGVjdGVkLiI7CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKQEAgLTkzLDcgKzEwMCw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTExMiwxNCArMTIxLDIyIEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBKU1ZBTF9UT19PQkpFQ1QoZnVuY3Rpb24pKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExKQogICAgICAgY29uc3QgT1ZFUlJJREUgeworICAgIEVOQUJMRV9KU19TVEFDS19UUkFDRV9JTl9TQ09QRShjb250ZXh0Xyk7CiAgICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnNjcmlwdDo6bW96anMiLCAiTW96anNDYWxsYmFja0Z1bmN0aW9uOjpSdW4iKTsKICAgICBDYWxsYmFja1Jlc3VsdDxSPiBjYWxsYmFja19yZXN1bHQ7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldCgpKTsKKyAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKSk7CiAgICAgaWYgKCFmdW5jdGlvbikgewogICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRnVuY3Rpb24gd2FzIGdhcmJhZ2UgY29sbGVjdGVkLiI7CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKQEAgLTE1NCw3ICsxNzEsOSBAQAogICAgIHJldHVybiBjYWxsYmFja19yZXN1bHQ7CiAgIH0KIAotICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0KCk7IH0KKyAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpOyB9CisgIGNvbnN0IEpTOjpWYWx1ZSYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRWYWx1ZSgpOyB9CisgIGJvb2wgV2FzQ29sbGVjdGVkKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uV2FzQ29sbGVjdGVkKCk7IH0KIAogIHByaXZhdGU6CiAgIEpTQ29udGV4dCogY29udGV4dF87CkBAIC0xNzMsMTUgKzE5MiwyMyBAQAogICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbikpOwogICB9CiAKKyAgZXhwbGljaXQgTW96anNDYWxsYmFja0Z1bmN0aW9uKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIGZ1bmN0aW9uKQorICAgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwgd2Vha19mdW5jdGlvbl8oY29udGV4dCwgZnVuY3Rpb24pIHsKKyAgICBEQ0hFQ0soY29udGV4dF8pOworICAgIERDSEVDSyhmdW5jdGlvbi5pc09iamVjdCgpKTsKKyAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgSlNWQUxfVE9fT0JKRUNUKGZ1bmN0aW9uKSkpOworICB9CisKICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEEyPjo6Rm9yd2FyZFR5cGUgYTIpCiAgICAgICBjb25zdCBPVkVSUklERSB7CisgICAgRU5BQkxFX0pTX1NUQUNLX1RSQUNFX0lOX1NDT1BFKGNvbnRleHRfKTsKICAgICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtMjE3LDcgKzI0NCw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTIzNiwxNiArMjY1LDI0IEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBKU1ZBTF9UT19PQkpFQ1QoZnVuY3Rpb24pKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMiwKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEEzPjo6Rm9yd2FyZFR5cGUgYTMpCiAgICAgICBjb25zdCBPVkVSUklERSB7CisgICAgRU5BQkxFX0pTX1NUQUNLX1RSQUNFX0lOX1NDT1BFKGNvbnRleHRfKTsKICAgICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtMjgyLDcgKzMxOSw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTMwMSwxNyArMzQwLDI1IEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBKU1ZBTF9UT19PQkpFQ1QoZnVuY3Rpb24pKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMiwKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEEzPjo6Rm9yd2FyZFR5cGUgYTMsCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBND46OkZvcndhcmRUeXBlIGE0KQogICAgICAgY29uc3QgT1ZFUlJJREUgeworICAgIEVOQUJMRV9KU19TVEFDS19UUkFDRV9JTl9TQ09QRShjb250ZXh0Xyk7CiAgICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnNjcmlwdDo6bW96anMiLCAiTW96anNDYWxsYmFja0Z1bmN0aW9uOjpSdW4iKTsKICAgICBDYWxsYmFja1Jlc3VsdDxSPiBjYWxsYmFja19yZXN1bHQ7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldCgpKTsKKyAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKSk7CiAgICAgaWYgKCFmdW5jdGlvbikgewogICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRnVuY3Rpb24gd2FzIGdhcmJhZ2UgY29sbGVjdGVkLiI7CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKQEAgLTM0OSw3ICszOTYsOSBAQAogICAgIHJldHVybiBjYWxsYmFja19yZXN1bHQ7CiAgIH0KIAotICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0KCk7IH0KKyAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpOyB9CisgIGNvbnN0IEpTOjpWYWx1ZSYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRWYWx1ZSgpOyB9CisgIGJvb2wgV2FzQ29sbGVjdGVkKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uV2FzQ29sbGVjdGVkKCk7IH0KIAogIHByaXZhdGU6CiAgIEpTQ29udGV4dCogY29udGV4dF87CkBAIC0zNjksNiArNDE4LDEzIEBACiAgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIGZ1bmN0aW9uKSk7CiAgIH0KIAorICBleHBsaWNpdCBNb3pqc0NhbGxiYWNrRnVuY3Rpb24oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgZnVuY3Rpb24pCisgICAgICA6IGNvbnRleHRfKGNvbnRleHQpLCB3ZWFrX2Z1bmN0aW9uXyhjb250ZXh0LCBmdW5jdGlvbikgeworICAgIERDSEVDSyhjb250ZXh0Xyk7CisgICAgRENIRUNLKGZ1bmN0aW9uLmlzT2JqZWN0KCkpOworICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBKU1ZBTF9UT19PQkpFQ1QoZnVuY3Rpb24pKSk7CisgIH0KKwogICBDYWxsYmFja1Jlc3VsdDxSPiBSdW4oCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMT46OkZvcndhcmRUeXBlIGExLAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTI+OjpGb3J3YXJkVHlwZSBhMiwKQEAgLTM3NiwxMSArNDMyLDEyIEBACiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBND46OkZvcndhcmRUeXBlIGE0LAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTU+OjpGb3J3YXJkVHlwZSBhNSkKICAgICAgIGNvbnN0IE9WRVJSSURFIHsKKyAgICBFTkFCTEVfSlNfU1RBQ0tfVFJBQ0VfSU5fU0NPUEUoY29udGV4dF8pOwogICAgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwogICAgIFRSQUNFX0VWRU5UMCgiY29iYWx0OjpzY3JpcHQ6Om1vempzIiwgIk1vempzQ2FsbGJhY2tGdW5jdGlvbjo6UnVuIik7CiAgICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gY2FsbGJhY2tfcmVzdWx0OwogICAgIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHRfKTsKLSAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXQoKSk7CisgICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCkpOwogICAgIGlmICghZnVuY3Rpb24pIHsKICAgICAgIERMT0coV0FSTklORykgPDwgIkZ1bmN0aW9uIHdhcyBnYXJiYWdlIGNvbGxlY3RlZC4iOwogICAgICAgY2FsbGJhY2tfcmVzdWx0LmV4Y2VwdGlvbiA9IHRydWU7CkBAIC00MTksNyArNDc2LDkgQEAKICAgICByZXR1cm4gY2FsbGJhY2tfcmVzdWx0OwogICB9CiAKLSAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldCgpOyB9CisgIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKTsgfQorICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0VmFsdWUoKTsgfQorICBib29sIFdhc0NvbGxlY3RlZCgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLldhc0NvbGxlY3RlZCgpOyB9CiAKICBwcml2YXRlOgogICBKU0NvbnRleHQqIGNvbnRleHRfOwpAQCAtNDM5LDYgKzQ5OCwxMyBAQAogICAgIERDSEVDSyhKU19PYmplY3RJc0Z1bmN0aW9uKGNvbnRleHRfLCBmdW5jdGlvbikpOwogICB9CiAKKyAgZXhwbGljaXQgTW96anNDYWxsYmFja0Z1bmN0aW9uKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIGZ1bmN0aW9uKQorICAgICAgOiBjb250ZXh0Xyhjb250ZXh0KSwgd2Vha19mdW5jdGlvbl8oY29udGV4dCwgZnVuY3Rpb24pIHsKKyAgICBEQ0hFQ0soY29udGV4dF8pOworICAgIERDSEVDSyhmdW5jdGlvbi5pc09iamVjdCgpKTsKKyAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgSlNWQUxfVE9fT0JKRUNUKGZ1bmN0aW9uKSkpOworICB9CisKICAgQ2FsbGJhY2tSZXN1bHQ8Uj4gUnVuKAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTE+OjpGb3J3YXJkVHlwZSBhMSwKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEEyPjo6Rm9yd2FyZFR5cGUgYTIsCkBAIC00NDcsMTEgKzUxMywxMiBAQAogICAgICAgdHlwZW5hbWUgYmFzZTo6aW50ZXJuYWw6OkNhbGxiYWNrUGFyYW1UcmFpdHM8QTU+OjpGb3J3YXJkVHlwZSBhNSwKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEE2Pjo6Rm9yd2FyZFR5cGUgYTYpCiAgICAgICBjb25zdCBPVkVSUklERSB7CisgICAgRU5BQkxFX0pTX1NUQUNLX1RSQUNFX0lOX1NDT1BFKGNvbnRleHRfKTsKICAgICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtNDkxLDcgKzU1OCw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTUxMSw2ICs1ODAsMTMgQEAKICAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24pKTsKICAgfQogCisgIGV4cGxpY2l0IE1vempzQ2FsbGJhY2tGdW5jdGlvbihKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBmdW5jdGlvbikKKyAgICAgIDogY29udGV4dF8oY29udGV4dCksIHdlYWtfZnVuY3Rpb25fKGNvbnRleHQsIGZ1bmN0aW9uKSB7CisgICAgRENIRUNLKGNvbnRleHRfKTsKKyAgICBEQ0hFQ0soZnVuY3Rpb24uaXNPYmplY3QoKSk7CisgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIEpTVkFMX1RPX09CSkVDVChmdW5jdGlvbikpKTsKKyAgfQorCiAgIENhbGxiYWNrUmVzdWx0PFI+IFJ1bigKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEExPjo6Rm9yd2FyZFR5cGUgYTEsCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBMj46OkZvcndhcmRUeXBlIGEyLApAQCAtNTIwLDExICs1OTYsMTIgQEAKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEE2Pjo6Rm9yd2FyZFR5cGUgYTYsCiAgICAgICB0eXBlbmFtZSBiYXNlOjppbnRlcm5hbDo6Q2FsbGJhY2tQYXJhbVRyYWl0czxBNz46OkZvcndhcmRUeXBlIGE3KQogICAgICAgY29uc3QgT1ZFUlJJREUgeworICAgIEVOQUJMRV9KU19TVEFDS19UUkFDRV9JTl9TQ09QRShjb250ZXh0Xyk7CiAgICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgICAgVFJBQ0VfRVZFTlQwKCJjb2JhbHQ6OnNjcmlwdDo6bW96anMiLCAiTW96anNDYWxsYmFja0Z1bmN0aW9uOjpSdW4iKTsKICAgICBDYWxsYmFja1Jlc3VsdDxSPiBjYWxsYmFja19yZXN1bHQ7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldCgpKTsKKyAgICBKUzo6Um9vdGVkT2JqZWN0IGZ1bmN0aW9uKGNvbnRleHRfLCB3ZWFrX2Z1bmN0aW9uXy5HZXRPYmplY3QoKSk7CiAgICAgaWYgKCFmdW5jdGlvbikgewogICAgICAgRExPRyhXQVJOSU5HKSA8PCAiRnVuY3Rpb24gd2FzIGdhcmJhZ2UgY29sbGVjdGVkLiI7CiAgICAgICBjYWxsYmFja19yZXN1bHQuZXhjZXB0aW9uID0gdHJ1ZTsKQEAgLTU2NSw3ICs2NDIsOSBAQAogICAgIHJldHVybiBjYWxsYmFja19yZXN1bHQ7CiAgIH0KIAotICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0KCk7IH0KKyAgSlNPYmplY3QqIGhhbmRsZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpOyB9CisgIGNvbnN0IEpTOjpWYWx1ZSYgdmFsdWUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXRWYWx1ZSgpOyB9CisgIGJvb2wgV2FzQ29sbGVjdGVkKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uV2FzQ29sbGVjdGVkKCk7IH0KIAogIHByaXZhdGU6CiAgIEpTQ29udGV4dCogY29udGV4dF87CkBAIC01NzYsNyArNjU1LDcgQEAKIHN0cnVjdCBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+IHsKICAgdHlwZWRlZiBNb3pqc1VzZXJPYmplY3RIb2xkZXI8TW96anNDYWxsYmFja0Z1bmN0aW9uPFNpZ25hdHVyZT4gPgogICAgICAgQ29udmVyc2lvblR5cGU7Ci0gIHR5cGVkZWYgY29uc3QgU2NyaXB0T2JqZWN0PENhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+KiBSZXR1cm5UeXBlOworICB0eXBlZGVmIGNvbnN0IFNjcmlwdFZhbHVlPENhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+KiBSZXR1cm5UeXBlOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIG1vempzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oLnB1bXAgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19mdW5jdGlvbi5oLnB1bXAKaW5kZXggOWJmYjVmMi4uYzQ0ZDlkOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfZnVuY3Rpb24uaC5wdW1wCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2Z1bmN0aW9uLmgucHVtcApAQCAtNywyMSArNywxOSBAQAogCiAkJCBUaGlzIHNob3VsZCBiZSBubyBsYXJnZXIgdGhhbiBNQVhfQVJJVFkgaW4gYmFzZS9iaW5kLmgucHVtcC4KICR2YXIgTUFYX0FSSVRZID0gNwotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIC8vIGNsYW5nLWZvcm1hdCBvZmYKIApAQCAtMzMsNiArMzEsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvY29udmVyc2lvbl9oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9jb252ZXJ0X2NhbGxiYWNrX3JldHVybl92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0LmgiCiAjaW5jbHVkZSAibmIvbWVtb3J5X3Njb3BlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCkBAIC03NCwxNSArNzMsMjMgQEAKICAgICBEQ0hFQ0soSlNfT2JqZWN0SXNGdW5jdGlvbihjb250ZXh0XywgZnVuY3Rpb24pKTsKICAgfQogCisgIGV4cGxpY2l0IE1vempzQ2FsbGJhY2tGdW5jdGlvbihKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBmdW5jdGlvbikKKyAgICAgIDogY29udGV4dF8oY29udGV4dCksIHdlYWtfZnVuY3Rpb25fKGNvbnRleHQsIGZ1bmN0aW9uKSB7CisgICAgRENIRUNLKGNvbnRleHRfKTsKKyAgICBEQ0hFQ0soZnVuY3Rpb24uaXNPYmplY3QoKSk7CisgICAgRENIRUNLKEpTX09iamVjdElzRnVuY3Rpb24oY29udGV4dF8sIEpTVkFMX1RPX09CSkVDVChmdW5jdGlvbikpKTsKKyAgfQorCiAgIENhbGxiYWNrUmVzdWx0PFI+IFJ1bigkZm9yIEFSRyAsIFtbCiAKICAgICAgIHR5cGVuYW1lIGJhc2U6OmludGVybmFsOjpDYWxsYmFja1BhcmFtVHJhaXRzPEEkKEFSRyk+OjpGb3J3YXJkVHlwZSBhJChBUkcpXV0pCiAgICAgICBjb25zdCBPVkVSUklERSB7CisgICAgRU5BQkxFX0pTX1NUQUNLX1RSQUNFX0lOX1NDT1BFKGNvbnRleHRfKTsKICAgICBUUkFDS19NRU1PUllfU0NPUEUoIkphdmFzY3JpcHQiKTsKICAgICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0Ojptb3pqcyIsICJNb3pqc0NhbGxiYWNrRnVuY3Rpb246OlJ1biIpOwogICAgIENhbGxiYWNrUmVzdWx0PFI+IGNhbGxiYWNrX3Jlc3VsdDsKICAgICBKU0F1dG9SZXF1ZXN0IGF1dG9fcmVxdWVzdChjb250ZXh0Xyk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCBmdW5jdGlvbihjb250ZXh0Xywgd2Vha19mdW5jdGlvbl8uR2V0KCkpOworICAgIEpTOjpSb290ZWRPYmplY3QgZnVuY3Rpb24oY29udGV4dF8sIHdlYWtfZnVuY3Rpb25fLkdldE9iamVjdCgpKTsKICAgICBpZiAoIWZ1bmN0aW9uKSB7CiAgICAgICBETE9HKFdBUk5JTkcpIDw8ICJGdW5jdGlvbiB3YXMgZ2FyYmFnZSBjb2xsZWN0ZWQuIjsKICAgICAgIGNhbGxiYWNrX3Jlc3VsdC5leGNlcHRpb24gPSB0cnVlOwpAQCAtMTI0LDcgKzEzMSw5IEBACiAgICAgcmV0dXJuIGNhbGxiYWNrX3Jlc3VsdDsKICAgfQogCi0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5HZXQoKTsgfQorICBKU09iamVjdCogaGFuZGxlKCkgY29uc3QgeyByZXR1cm4gd2Vha19mdW5jdGlvbl8uR2V0T2JqZWN0KCk7IH0KKyAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuIHdlYWtfZnVuY3Rpb25fLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiB3ZWFrX2Z1bmN0aW9uXy5XYXNDb2xsZWN0ZWQoKTsgfQogCiAgcHJpdmF0ZToKICAgSlNDb250ZXh0KiBjb250ZXh0XzsKQEAgLTEzNiw3ICsxNDUsNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFNpZ25hdHVyZT4KIHN0cnVjdCBUeXBlVHJhaXRzPENhbGxiYWNrRnVuY3Rpb248U2lnbmF0dXJlPiA+IHsKICAgdHlwZWRlZiBNb3pqc1VzZXJPYmplY3RIb2xkZXI8TW96anNDYWxsYmFja0Z1bmN0aW9uPFNpZ25hdHVyZT4gPiBDb252ZXJzaW9uVHlwZTsKLSAgdHlwZWRlZiBjb25zdCBTY3JpcHRPYmplY3Q8Q2FsbGJhY2tGdW5jdGlvbjxTaWduYXR1cmU+ID4qIFJldHVyblR5cGU7CisgIHR5cGVkZWYgY29uc3QgU2NyaXB0VmFsdWU8Q2FsbGJhY2tGdW5jdGlvbjxTaWduYXR1cmU+ID4qIFJldHVyblR5cGU7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbW96anMKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5jYwppbmRleCA5MGFhMTc4Li45OWI3YTdmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2UuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2ludGVyZmFjZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgKaW5kZXggMzIxNjgyYS4uYTZkM2Y2ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfQ0FMTEJBQ0tfSU5URVJGQUNFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfQ0FMTEJBQ0tfSU5URVJGQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaG9sZGVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19jYWxsYmFja19pbnRlcmZhY2VfaG9sZGVyLmgKaW5kZXggMDA5YWNkNS4uNzQ1MDVmMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfY2FsbGJhY2tfaW50ZXJmYWNlX2hvbGRlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2NhbGxiYWNrX2ludGVyZmFjZV9ob2xkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19DQUxMQkFDS19JTlRFUkZBQ0VfSE9MREVSX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfQ0FMTEJBQ0tfSU5URVJGQUNFX0hPTERFUl9IXwpAQCAtMzUsMTMgKzMzLDE2IEBACiAgIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VIb2xkZXIoSlM6OkhhbmRsZU9iamVjdCBvYmplY3QsIEpTQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5KQogICAgICAgOiBCYXNlQ2xhc3Mob2JqZWN0LCBjb250ZXh0LCB3cmFwcGVyX2ZhY3RvcnkpIHt9CisgIE1vempzQ2FsbGJhY2tJbnRlcmZhY2VIb2xkZXIoSlM6OkhhbmRsZVZhbHVlIHZhbHVlLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV3JhcHBlckZhY3RvcnkqIHdyYXBwZXJfZmFjdG9yeSkKKyAgICAgIDogQmFzZUNsYXNzKHZhbHVlLCBjb250ZXh0LCB3cmFwcGVyX2ZhY3RvcnkpIHt9CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FsbGJhY2tJbnRlcmZhY2U+CiBzdHJ1Y3QgVHlwZVRyYWl0czxDYWxsYmFja0ludGVyZmFjZVRyYWl0czxDYWxsYmFja0ludGVyZmFjZT4gPiB7CiAgIHR5cGVkZWYgTW96anNDYWxsYmFja0ludGVyZmFjZUhvbGRlcjx0eXBlbmFtZSBDYWxsYmFja0ludGVyZmFjZVRyYWl0czwKICAgICAgIENhbGxiYWNrSW50ZXJmYWNlPjo6TW96anNDYWxsYmFja0ludGVyZmFjZUNsYXNzPiBDb252ZXJzaW9uVHlwZTsKLSAgdHlwZWRlZiBjb25zdCBTY3JpcHRPYmplY3Q8Q2FsbGJhY2tJbnRlcmZhY2U+KiBSZXR1cm5UeXBlOworICB0eXBlZGVmIGNvbnN0IFNjcmlwdFZhbHVlPENhbGxiYWNrSW50ZXJmYWNlPiogUmV0dXJuVHlwZTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZGVidWdnZXIuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19kZWJ1Z2dlci5jYwppbmRleCA4ODc2MzExLi4zNDc1MDhkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19kZWJ1Z2dlci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19kZWJ1Z2dlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2RlYnVnZ2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2RlYnVnZ2VyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19kZWJ1Z2dlci5oCmluZGV4IDBiNWUxMWQuLjQ3M2E3ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2RlYnVnZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZGVidWdnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfREVCVUdHRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19ERUJVR0dFUl9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19lbmdpbmUuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19lbmdpbmUuY2MKaW5kZXggYWY4MDcxNy4uNTlkMjk3NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZW5naW5lLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2VuZ2luZS5jYwpAQCAtMSwzMSArMSwzMyBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2VuZ2luZS5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgImJhc2UvZGVidWcvdHJhY2VfZXZlbnQuaCIKKyNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImJhc2UvbWVzc2FnZV9sb29wLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvY192YWwuaCIKICNpbmNsdWRlICJjb2JhbHQvYnJvd3Nlci9zdGFja19zaXplX2NvbnN0YW50cy5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL3N0YWNrX3RyYWNlX2hlbHBlcnMuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9jb2JhbHRfY29uZmlnL2luY2x1ZGUvanNjdXN0b21hbGxvY2F0b3IuaCIKICNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNkYmdhcGkuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugc2NyaXB0IHsKQEAgLTk5LDcgKzEwMSw2IEBACiBib29sIER1bW15UHJlc2VydmVXcmFwcGVyQ2FsbGJhY2soSlNDb250ZXh0ICpjeCwgSlNPYmplY3QgKm9iaikgewogICByZXR1cm4gdHJ1ZTsKIH0KLQogfSAgLy8gbmFtZXNwYWNlCiAKIE1vempzRW5naW5lOjpNb3pqc0VuZ2luZSgpIDogYWNjdW11bGF0ZWRfZXh0cmFfbWVtb3J5X2Nvc3RfKDApIHsKQEAgLTE4MSw2ICsxODIsMTQgQEAKICAgcmV0dXJuIEVuZ2luZVN0YXRzOjpHZXRJbnN0YW5jZSgpLT5VcGRhdGVNZW1vcnlTdGF0c0FuZFJldHVyblJlc2VydmVkKCk7CiB9CiAKK2Jvb2wgTW96anNFbmdpbmU6OlJlZ2lzdGVyRXJyb3JIYW5kbGVyKEphdmFTY3JpcHRFbmdpbmU6OkVycm9ySGFuZGxlciBoYW5kbGVyKSB7CisgIGVycm9yX2hhbmRsZXJfID0gaGFuZGxlcjsKKyAgSlNEZWJ1Z0Vycm9ySG9vayBob29rID0gRXJyb3JIb29rQ2FsbGJhY2s7CisgIHZvaWQqIGNsb3N1cmUgPSB0aGlzOworICBKU19TZXREZWJ1Z0Vycm9ySG9vayhydW50aW1lXywgaG9vaywgY2xvc3VyZSk7CisgIHJldHVybiB0cnVlOworfQorCiB2b2lkIE1vempzRW5naW5lOjpUaW1lckdhcmJhZ2VDb2xsZWN0KCkgewogICBUUkFDRV9FVkVOVDAoImNvYmFsdDo6c2NyaXB0IiwgIk1vempzRW5naW5lOjpUaW1lckdhcmJhZ2VDb2xsZWN0KCkiKTsKICAgQ29sbGVjdEdhcmJhZ2UoKTsKQEAgLTI0MSw2ICsyNTAsMzAgQEAKICAgfQogfQogCitKU0Jvb2wgTW96anNFbmdpbmU6OkVycm9ySG9va0NhbGxiYWNrKEpTQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNFcnJvclJlcG9ydCogcmVwb3J0LCB2b2lkKiBjbG9zdXJlKSB7CisgIE1vempzRW5naW5lKiB0aGlzX3B0ciA9IHN0YXRpY19jYXN0PE1vempzRW5naW5lKj4oY2xvc3VyZSk7CisgIHJldHVybiB0aGlzX3B0ci0+UmVwb3J0SlNFcnJvcihjb250ZXh0LCBtZXNzYWdlLCByZXBvcnQpOworfQorCitKU0Jvb2wgTW96anNFbmdpbmU6OlJlcG9ydEpTRXJyb3IoSlNDb250ZXh0KiBjb250ZXh0LCBjb25zdCBjaGFyKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTRXJyb3JSZXBvcnQqIHJlcG9ydCkgeworICBpZiAoIWVycm9yX2hhbmRsZXJfLmlzX251bGwoKSAmJiByZXBvcnQgJiYgcmVwb3J0LT5maWxlbmFtZSkgeworICAgIHN0ZDo6c3RyaW5nIGZpbGVfbmFtZSA9IHJlcG9ydC0+ZmlsZW5hbWU7CisgICAgLy8gTGluZS9jb2x1bW4gY2FuIGJlIHplcm8gZm9yIGludGVybmFsIGphdmFzY3JpcHQgZXhjZXB0aW9ucy4gSW4gdGhpcworICAgIC8vIGNhc2Ugc2V0IHRoZSB2YWx1ZXMgdG8gMSwgb3RoZXJ3aXNlIHRoZSBiYXNlOjpTb3VyY2VMb2NhdGlvbiBvYmplY3QKKyAgICAvLyBiZWxvdyB3aWxsIGRjaGVjay4KKyAgICBpbnQgbGluZSA9IHN0ZDo6bWF4PGludD4oMSwgcmVwb3J0LT5saW5lbm8pOworICAgIGludCBjb2x1bW4gPSBzdGQ6Om1heDxpbnQ+KDEsIHJlcG9ydC0+Y29sdW1uKTsKKyAgICBpZiAoZmlsZV9uYW1lLmVtcHR5KCkpIHsKKyAgICAgIGZpbGVfbmFtZSA9ICI8aW50ZXJuYWwgZXhjZXB0aW9uPiI7CisgICAgfQorICAgIGJhc2U6OlNvdXJjZUxvY2F0aW9uIHNvdXJjZV9sb2NhdGlvbihmaWxlX25hbWUsIGxpbmUsIGNvbHVtbik7CisgICAgZXJyb3JfaGFuZGxlcl8uUnVuKHNvdXJjZV9sb2NhdGlvbiwgbWVzc2FnZSk7CisgIH0KKyAgcmV0dXJuIHRydWU7ICAvLyBBbGxvdyBlcnJvciB0byBwcm9wYWdhdGUgaW4gdGhlIG1vemlsbGEgZW5naW5lLgorfQorCiB9ICAvLyBuYW1lc3BhY2UgbW96anMKIAogc2NvcGVkX3B0cjxKYXZhU2NyaXB0RW5naW5lPiBKYXZhU2NyaXB0RW5naW5lOjpDcmVhdGVFbmdpbmUoKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19lbmdpbmUuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2VuZ2luZS5oCmluZGV4IDU1MjkzOTQuLjQzNzllMGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2VuZ2luZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2VuZ2luZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19FTkdJTkVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19FTkdJTkVfSF8KIApAQCAtMzYsNiArMzQsNyBAQAogICB2b2lkIENvbGxlY3RHYXJiYWdlKCkgT1ZFUlJJREU7CiAgIHZvaWQgUmVwb3J0RXh0cmFNZW1vcnlDb3N0KHNpemVfdCBieXRlcykgT1ZFUlJJREU7CiAgIHNpemVfdCBVcGRhdGVNZW1vcnlTdGF0c0FuZFJldHVyblJlc2VydmVkKCkgT1ZFUlJJREU7CisgIGJvb2wgUmVnaXN0ZXJFcnJvckhhbmRsZXIoSmF2YVNjcmlwdEVuZ2luZTo6RXJyb3JIYW5kbGVyIGhhbmRsZXIpIE9WRVJSSURFOwogCiAgcHJpdmF0ZToKICAgdm9pZCBUaW1lckdhcmJhZ2VDb2xsZWN0KCk7CkBAIC00Myw2ICs0MiwxMCBAQAogICBzdGF0aWMgdm9pZCBHQ0NhbGxiYWNrKEpTUnVudGltZSogcnVudGltZSwgSlNHQ1N0YXR1cyBzdGF0dXMpOwogICBzdGF0aWMgdm9pZCBGaW5hbGl6ZUNhbGxiYWNrKEpTRnJlZU9wKiBmcmVlX29wLCBKU0ZpbmFsaXplU3RhdHVzIHN0YXR1cywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0Jvb2wgaXNfY29tcGFydG1lbnQpOworICBzdGF0aWMgSlNCb29sIEVycm9ySG9va0NhbGxiYWNrKEpTQ29udGV4dCogY29udGV4dCwgY29uc3QgY2hhciogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU0Vycm9yUmVwb3J0KiByZXBvcnQsIHZvaWQqIGNsb3N1cmUpOworICBKU0Jvb2wgUmVwb3J0SlNFcnJvcihKU0NvbnRleHQqIGNvbnRleHQsIGNvbnN0IGNoYXIqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgIEpTRXJyb3JSZXBvcnQqIHJlcG9ydCk7CiAKICAgYmFzZTo6VGhyZWFkQ2hlY2tlciB0aHJlYWRfY2hlY2tlcl87CiAKQEAgLTU5LDYgKzYyLDkgQEAKIAogICAvLyBVc2VkIHRvIHRyaWdnZXIgYSBnYXJiYWdlIGNvbGxlY3Rpb24gcGVyaW9kaWNhbGx5LgogICBiYXNlOjpSZXBlYXRpbmdUaW1lcjxNb3pqc0VuZ2luZT4gZ2NfdGltZXJfOworCisgIC8vIFVzZWQgdG8gaGFuZGxlIGphdmFzY3JpcHQgZXJyb3JzLgorICBFcnJvckhhbmRsZXIgZXJyb3JfaGFuZGxlcl87CiB9OwogfSAgLy8gbmFtZXNwYWNlIG1vempzCiB9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuY2MKaW5kZXggMzlhNjExYS4uNzlhMTUxNiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZXhjZXB0aW9uX3N0YXRlLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCIKIAogI2luY2x1ZGUgPHN0cmluZz4KQEAgLTczLDI2ICs3MSwyOCBAQAogICBpc19leGNlcHRpb25fc2V0XyA9IHRydWU7CiB9CiAKLXZvaWQgTW96anNFeGNlcHRpb25TdGF0ZTo6U2V0U2ltcGxlRXhjZXB0aW9uKE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwgLi4uKSB7Cit2b2lkIE1vempzRXhjZXB0aW9uU3RhdGU6OlNldFNpbXBsZUV4Y2VwdGlvbigKKyAgICBNZXNzYWdlVHlwZVZhciBtZXNzYWdlX3R5cGUsIC4uLikgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CiAgIERDSEVDSyghaXNfZXhjZXB0aW9uX3NldF8pOwogCiAgIHZhX2xpc3QgYXJndW1lbnRzOwogICB2YV9zdGFydChhcmd1bWVudHMsIG1lc3NhZ2VfdHlwZSk7CiAgIHN0ZDo6c3RyaW5nIGVycm9yX21lc3NhZ2UgPQotICAgICAgYmFzZTo6U3RyaW5nUHJpbnRWKEdldEV4Y2VwdGlvbk1lc3NhZ2VGb3JtYXQobWVzc2FnZV90eXBlKSwgYXJndW1lbnRzKTsKKyAgICAgIGJhc2U6OlN0cmluZ1ByaW50VihHZXRFeGNlcHRpb25NZXNzYWdlRm9ybWF0KG1lc3NhZ2VfdHlwZS52YWx1ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgYXJndW1lbnRzKTsKICAgSlNFcnJvckZvcm1hdFN0cmluZyBmb3JtYXRfc3RyaW5nOwogICBmb3JtYXRfc3RyaW5nLmZvcm1hdCA9IGVycm9yX21lc3NhZ2UuY19zdHIoKTsKICAgLy8gQWxyZWFkeSBmZWQgYXJndW1lbnRzIGZvciBmb3JtYXQuCiAgIGZvcm1hdF9zdHJpbmcuYXJnQ291bnQgPSAwOwogICBmb3JtYXRfc3RyaW5nLmV4blR5cGUgPQotICAgICAgQ29udmVydFRvTW96anNFeGNlcHRpb25UeXBlKEdldFNpbXBsZUV4Y2VwdGlvblR5cGUobWVzc2FnZV90eXBlKSk7CisgICAgICBDb252ZXJ0VG9Nb3pqc0V4Y2VwdGlvblR5cGUoR2V0U2ltcGxlRXhjZXB0aW9uVHlwZShtZXNzYWdlX3R5cGUudmFsdWUpKTsKIAogICAvLyBUaGlzIGZ1bmN0aW9uIGNyZWF0ZXMgYSBKU0Vycm9yUmVwb3J0LCBwb3B1bGF0ZSBpdCB3aXRoIGFuIGVycm9yIG1lc3NhZ2UKICAgLy8gb2J0YWluZWQgZnJvbSB0aGUgZ2l2ZW4gSlNFcnJvckNhbGxiYWNrLiBUaGUgcmVzdWx0aW5nIGVycm9yIG1lc3NhZ2UgaXMKICAgLy8gcGFzc2VkIHRvIHRoZSBjb250ZXh0J3MgSlNFcnJvclJlcG9ydGVyIGNhbGxiYWNrLgogICBKU19SZXBvcnRFcnJvck51bWJlcihjb250ZXh0XywgR2V0RXJyb3JNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4oJmZvcm1hdF9zdHJpbmcpLCBtZXNzYWdlX3R5cGUpOworICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKj4oJmZvcm1hdF9zdHJpbmcpLCBtZXNzYWdlX3R5cGUudmFsdWUpOwogICB2YV9lbmQoYXJndW1lbnRzKTsKIAogICBpc19leGNlcHRpb25fc2V0XyA9IHRydWU7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19leGNlcHRpb25fc3RhdGUuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oCmluZGV4IDM2MWRjNzAuLjk1ZTFjZDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2V4Y2VwdGlvbl9zdGF0ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19FWENFUFRJT05fU1RBVEVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19FWENFUFRJT05fU1RBVEVfSF8KIApAQCAtMzIsNyArMzAsNyBAQAogICAgICAgOiBpc19leGNlcHRpb25fc2V0XyhmYWxzZSksIGNvbnRleHRfKGNvbnRleHQpIHt9CiAgIC8vIEV4Y2VwdGlvblN0YXRlIGludGVyZmFjZQogICB2b2lkIFNldEV4Y2VwdGlvbihjb25zdCBzY29wZWRfcmVmcHRyPFNjcmlwdEV4Y2VwdGlvbj4mIGV4Y2VwdGlvbikgT1ZFUlJJREU7Ci0gIHZvaWQgU2V0U2ltcGxlRXhjZXB0aW9uKE1lc3NhZ2VUeXBlIG1lc3NhZ2VfdHlwZSwgLi4uKSBPVkVSUklERTsKKyAgdm9pZCBTZXRTaW1wbGVFeGNlcHRpb24oTWVzc2FnZVR5cGVWYXIgbWVzc2FnZV90eXBlLCAuLi4pIE9WRVJSSURFOwogCiAgIGJvb2wgaXNfZXhjZXB0aW9uX3NldCgpIGNvbnN0IHsgcmV0dXJuIGlzX2V4Y2VwdGlvbl9zZXRfOyB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5jYwppbmRleCAzMzdkYjgyLi4wNDk3ZjUxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfZ2xvYmFsX2Vudmlyb25tZW50LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgpAQCAtMjQxLDkgKzIzOSw3IEBACiAgIEpTOjpSb290ZWRWYWx1ZSByZXN1bHRfdmFsdWUoY29udGV4dF8pOwogICBib29sIHN1Y2Nlc3MgPSBFdmFsdWF0ZVNjcmlwdEludGVybmFsKHNvdXJjZV9jb2RlLCAmcmVzdWx0X3ZhbHVlKTsKICAgaWYgKHN1Y2Nlc3MgJiYgb3V0X29wYXF1ZV9oYW5kbGUpIHsKLSAgICBKUzo6Um9vdGVkT2JqZWN0IGpzX29iamVjdChjb250ZXh0Xyk7Ci0gICAgSlNfVmFsdWVUb09iamVjdChjb250ZXh0XywgcmVzdWx0X3ZhbHVlLCBqc19vYmplY3QuYWRkcmVzcygpKTsKLSAgICBNb3pqc09iamVjdEhhbmRsZUhvbGRlciBtb3pqc19vYmplY3RfaG9sZGVyKGpzX29iamVjdCwgY29udGV4dF8sCisgICAgTW96anNPYmplY3RIYW5kbGVIb2xkZXIgbW96anNfb2JqZWN0X2hvbGRlcihyZXN1bHRfdmFsdWUsIGNvbnRleHRfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JhcHBlcl9mYWN0b3J5KCkpOwogICAgIG91dF9vcGFxdWVfaGFuZGxlLT5lbXBsYWNlKG93bmluZ19vYmplY3QuZ2V0KCksIG1vempzX29iamVjdF9ob2xkZXIpOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19nbG9iYWxfZW52aXJvbm1lbnQuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oCmluZGV4IGZmNmU4M2QuLmYwMDg1NmYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19HTE9CQUxfRU5WSVJPTk1FTlRfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19HTE9CQUxfRU5WSVJPTk1FTlRfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfb2JqZWN0X2hhbmRsZS5oCmluZGV4IGU2Yzc4MjcuLmYyZWUxOTUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX29iamVjdF9oYW5kbGUuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19vYmplY3RfaGFuZGxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX01PWkpTX09CSkVDVF9IQU5ETEVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19PQkpFQ1RfSEFORExFX0hfCiAKQEAgLTI3LDE3ICsyNSwxOSBAQAogbmFtZXNwYWNlIHNjcmlwdCB7CiBuYW1lc3BhY2UgbW96anMgewogCi0vLyBBIHdyYXBwZXIgYXJvdW5kIGEgSlNPYmplY3QgdGhhdCBjYW4gYmUgcGFzc2VkIGludG8gQ29iYWx0IGFzIGFuCisvLyBBIHdyYXBwZXIgYXJvdW5kIGEgSlM6OlZhbHVlIHRoYXQgY2FuIGJlIHBhc3NlZCBpbnRvIENvYmFsdCBhcyBhbgogLy8gb3BhcXVlIHNjcmlwdCBvYmplY3QuCiAvLyBBbiBPcGFxdWVIYW5kbGUgaXMgbmV2ZXIgcGFzc2VkIGludG8gQ29iYWx0IGFzLWlzLCBidXQgb25seSB3aGVuIHdyYXBwZWQgYXMKLS8vIGEgU2NyaXB0T2JqZWN0PE9wYXF1ZUhhbmRsZT4uCisvLyBhIFNjcmlwdFZhbHVlPE9wYXF1ZUhhbmRsZT4uCiBjbGFzcyBNb3pqc09iamVjdEhhbmRsZSA6IHB1YmxpYyBPcGFxdWVIYW5kbGUgewogIHB1YmxpYzoKICAgdHlwZWRlZiBPcGFxdWVIYW5kbGUgQmFzZVR5cGU7Ci0gIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBoYW5kbGVfLkdldCgpOyB9CisgIEpTT2JqZWN0KiBoYW5kbGUoKSBjb25zdCB7IHJldHVybiBoYW5kbGVfLkdldE9iamVjdCgpOyB9CisgIGNvbnN0IEpTOjpWYWx1ZSYgdmFsdWUoKSBjb25zdCB7IHJldHVybiBoYW5kbGVfLkdldFZhbHVlKCk7IH0KKyAgYm9vbCBXYXNDb2xsZWN0ZWQoKSBjb25zdCB7IHJldHVybiBoYW5kbGVfLldhc0NvbGxlY3RlZCgpOyB9CiAKICBwcml2YXRlOgotICBNb3pqc09iamVjdEhhbmRsZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0KQorICBNb3pqc09iamVjdEhhbmRsZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSBvYmplY3QpCiAgICAgICA6IGhhbmRsZV8oY29udGV4dCwgb2JqZWN0KSB7fQogICB+TW96anNPYmplY3RIYW5kbGUoKSB7fQogCkBAIC01Miw3ICs1Miw3IEBACiB0ZW1wbGF0ZSA8Pgogc3RydWN0IFR5cGVUcmFpdHM8T3BhcXVlSGFuZGxlPiB7CiAgIHR5cGVkZWYgTW96anNPYmplY3RIYW5kbGVIb2xkZXIgQ29udmVyc2lvblR5cGU7Ci0gIHR5cGVkZWYgY29uc3QgU2NyaXB0T2JqZWN0PE9wYXF1ZUhhbmRsZT4qIFJldHVyblR5cGU7CisgIHR5cGVkZWYgY29uc3QgU2NyaXB0VmFsdWU8T3BhcXVlSGFuZGxlPiogUmV0dXJuVHlwZTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBtb3pqcwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuY2MKaW5kZXggMTBkYjBiNS4uMmY3N2VkZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaCIKIAogI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfcHJvcGVydHlfZW51bWVyYXRvci5oCmluZGV4IDZhZDI1NTMuLmVlNWNhZWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3Byb3BlcnR5X2VudW1lcmF0b3IuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX01PWkpTX1BST1BFUlRZX0VOVU1FUkFUT1JfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19QUk9QRVJUWV9FTlVNRVJBVE9SX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3NvdXJjZV9jb2RlLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfc291cmNlX2NvZGUuY2MKaW5kZXggZjYyNWI2OC4uYmQ3MmFlNyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfc291cmNlX2NvZGUuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfc291cmNlX2NvZGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvbW96anNfc291cmNlX2NvZGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19zb3VyY2VfY29kZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfc291cmNlX2NvZGUuaAppbmRleCA2MTU0MjYxLi40ZTU3MjBhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc19zb3VyY2VfY29kZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3NvdXJjZV9jb2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX01PWkpTX1NPVVJDRV9DT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfU09VUkNFX0NPREVfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdHJhY2VfbG9nZ2luZy5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3RyYWNlX2xvZ2dpbmcuY2MKaW5kZXggN2M0ODZjMC4uMTE3MDA3ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdHJhY2VfbG9nZ2luZy5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc190cmFjZV9sb2dnaW5nLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9UcmFjZUxvZ2dpbmcuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdXNlcl9vYmplY3RfaG9sZGVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaAppbmRleCA4N2ZkMDI3Li5lYTRmNDBlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc191c2VyX29iamVjdF9ob2xkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfVVNFUl9PQkpFQ1RfSE9MREVSX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfVVNFUl9PQkpFQ1RfSE9MREVSX0hfCiAKQEAgLTIxLDkgKzE5LDEwIEBACiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgiCisjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCiAKICNpbmNsdWRlICJuYi9tZW1vcnlfc2NvcGUuaCIKQEAgLTMyLDgxICszMSwxMDAgQEAKIG5hbWVzcGFjZSBzY3JpcHQgewogbmFtZXNwYWNlIG1vempzIHsKIAotLy8gVGVtcGxhdGUgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBTY3JpcHRPYmplY3QgdGVtcGxhdGUgY2xhc3MgZm9yIGxpZmV0aW1lCisvLyBUZW1wbGF0ZSBjbGFzcyB0aGF0IGltcGxlbWVudHMgdGhlIFNjcmlwdFZhbHVlIHRlbXBsYXRlIGNsYXNzIGZvciBsaWZldGltZQogLy8gbWFuYWdlbWVudCBvZiBVc2VyIE9iamVjdHMgcGFzc2VkIGZyb20gdGhlIGJpbmRpbmdzIGxheWVyIGludG8gQ29iYWx0LiBTZWUKLS8vIHRoZSBkZWZpbml0aW9uIG9mIFNjcmlwdE9iamVjdCBmb3IgZnVydGhlciBkZXRhaWwuCisvLyB0aGUgZGVmaW5pdGlvbiBvZiBTY3JpcHRWYWx1ZSBmb3IgZnVydGhlciBkZXRhaWwuCiAvLyBUaGlzIGNsYXNzIGRvZXMgbm90IHJvb3QgdGhlIHVuZGVybHlpbmcgSlNPYmplY3QgdGhhdCBNb3pqc1VzZXJPYmplY3RUeXBlCiAvLyBob2xkcyBhIHJlZmVyZW5jZSB0by4gVGhlIG9iamVjdCB3aWxsIGJlIHRyYWNlZCB3aGVuIGFueSBvd25pbmcgb2JqZWN0cyBhcmUKIC8vIHRyYWNlZC4KIHRlbXBsYXRlIDx0eXBlbmFtZSBNb3pqc1VzZXJPYmplY3RUeXBlPgogY2xhc3MgTW96anNVc2VyT2JqZWN0SG9sZGVyCi0gICAgOiBwdWJsaWMgU2NyaXB0T2JqZWN0PHR5cGVuYW1lIE1vempzVXNlck9iamVjdFR5cGU6OkJhc2VUeXBlPiB7CisgICAgOiBwdWJsaWMgU2NyaXB0VmFsdWU8dHlwZW5hbWUgTW96anNVc2VyT2JqZWN0VHlwZTo6QmFzZVR5cGU+IHsKICBwdWJsaWM6Ci0gIHR5cGVkZWYgU2NyaXB0T2JqZWN0PHR5cGVuYW1lIE1vempzVXNlck9iamVjdFR5cGU6OkJhc2VUeXBlPiBCYXNlQ2xhc3M7CisgIHR5cGVkZWYgU2NyaXB0VmFsdWU8dHlwZW5hbWUgTW96anNVc2VyT2JqZWN0VHlwZTo6QmFzZVR5cGU+IEJhc2VDbGFzczsKIAogICBNb3pqc1VzZXJPYmplY3RIb2xkZXIoKSA6IGNvbnRleHRfKE5VTEwpLCB3cmFwcGVyX2ZhY3RvcnlfKE5VTEwpIHt9CiAKICAgTW96anNVc2VyT2JqZWN0SG9sZGVyKEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LCBKU0NvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5KQotICAgICAgOiBvYmplY3RfaGFuZGxlXyhNb3pqc1VzZXJPYmplY3RUeXBlKGNvbnRleHQsIG9iamVjdCkpLAorICAgICAgOiBoYW5kbGVfKE1vempzVXNlck9iamVjdFR5cGUoY29udGV4dCwgb2JqZWN0KSksCisgICAgICAgIGNvbnRleHRfKGNvbnRleHQpLAorICAgICAgICB3cmFwcGVyX2ZhY3RvcnlfKHdyYXBwZXJfZmFjdG9yeSkge30KKworICBNb3pqc1VzZXJPYmplY3RIb2xkZXIoSlM6OkhhbmRsZVZhbHVlIHZhbHVlLCBKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5KQorICAgICAgOiBoYW5kbGVfKE1vempzVXNlck9iamVjdFR5cGUoY29udGV4dCwgdmFsdWUpKSwKICAgICAgICAgY29udGV4dF8oY29udGV4dCksCiAgICAgICAgIHdyYXBwZXJfZmFjdG9yeV8od3JhcHBlcl9mYWN0b3J5KSB7fQogCiAgIHZvaWQgUmVnaXN0ZXJPd25lcihXcmFwcGFibGUqIG93bmVyKSBPVkVSUklERSB7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3Qgb3duZWRfb2JqZWN0KGNvbnRleHRfLCBqc19vYmplY3QoKSk7Ci0gICAgRExPR19JRihXQVJOSU5HLCAhb3duZWRfb2JqZWN0KQotICAgICAgICA8PCAiT3duZWQgb2JqZWN0IGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLiI7Ci0gICAgaWYgKG93bmVkX29iamVjdCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvd25lZF92YWx1ZShjb250ZXh0XywganNfdmFsdWUoKSk7CisgICAgRExPR19JRihXQVJOSU5HLCBoYW5kbGVfLT5XYXNDb2xsZWN0ZWQoKSkKKyAgICAgICAgPDwgIk93bmVkIHZhbHVlIGhhcyBiZWVuIGdhcmJhZ2UgY29sbGVjdGVkLiI7CisgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBmb3IgbnVsbCwgYmVjYXVzZSBudWxsIGlzIGFwcGFyZW50bHkgYSBHQyBUaGluZy4KKyAgICBpZiAoIW93bmVkX3ZhbHVlLmlzTnVsbE9yVW5kZWZpbmVkKCkgJiYgb3duZWRfdmFsdWUuaXNHQ1RoaW5nKCkpIHsKICAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dF8pOwogICAgICAgaW50cHRyX3Qga2V5ID0gUmVmZXJlbmNlZE9iamVjdE1hcDo6R2V0S2V5Rm9yV3JhcHBhYmxlKG93bmVyKTsKICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+cmVmZXJlbmNlZF9vYmplY3RzKCktPkFkZFJlZmVyZW5jZWRPYmplY3QoCi0gICAgICAgICAga2V5LCBvd25lZF9vYmplY3QpOworICAgICAgICAgIGtleSwgb3duZWRfdmFsdWUpOwogICAgIH0KICAgfQogCiAgIHZvaWQgRGVyZWdpc3Rlck93bmVyKFdyYXBwYWJsZSogb3duZXIpIE9WRVJSSURFIHsKICAgICAvLyB8b3duZXJ8IG1heSBiZSBpbiB0aGUgcHJvY2VzcyBvZiBiZWluZyBkZXN0cnVjdGVkLCBzbyBkb24ndCB1c2UgaXQuCiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwotICAgIEpTOjpSb290ZWRPYmplY3Qgb3duZWRfb2JqZWN0KGNvbnRleHRfLCBqc19vYmplY3QoKSk7Ci0gICAgaWYgKG93bmVkX29iamVjdCkgeworICAgIEpTOjpSb290ZWRWYWx1ZSBvd25lZF92YWx1ZShjb250ZXh0XywganNfdmFsdWUoKSk7CisgICAgLy8gV2UgaGF2ZSB0byBjaGVjayBmb3IgbnVsbCwgYmVjYXVzZSBudWxsIGlzIGFwcGFyZW50bHkgYSBHQyBUaGluZy4KKyAgICBpZiAoIW93bmVkX3ZhbHVlLmlzTnVsbE9yVW5kZWZpbmVkKCkgJiYgb3duZWRfdmFsdWUuaXNHQ1RoaW5nKCkpIHsKICAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQqIGdsb2JhbF9lbnZpcm9ubWVudCA9CiAgICAgICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dF8pOwogICAgICAgaW50cHRyX3Qga2V5ID0gUmVmZXJlbmNlZE9iamVjdE1hcDo6R2V0S2V5Rm9yV3JhcHBhYmxlKG93bmVyKTsKICAgICAgIGdsb2JhbF9lbnZpcm9ubWVudC0+cmVmZXJlbmNlZF9vYmplY3RzKCktPlJlbW92ZVJlZmVyZW5jZWRPYmplY3QoCi0gICAgICAgICAga2V5LCBvd25lZF9vYmplY3QpOworICAgICAgICAgIGtleSwgb3duZWRfdmFsdWUpOwogICAgIH0KICAgfQogCi0gIGNvbnN0IHR5cGVuYW1lIE1vempzVXNlck9iamVjdFR5cGU6OkJhc2VUeXBlKiBHZXRTY3JpcHRPYmplY3QoKQorICBjb25zdCB0eXBlbmFtZSBNb3pqc1VzZXJPYmplY3RUeXBlOjpCYXNlVHlwZSogR2V0U2NyaXB0VmFsdWUoKQogICAgICAgY29uc3QgT1ZFUlJJREUgewotICAgIHJldHVybiBvYmplY3RfaGFuZGxlXyA/ICZvYmplY3RfaGFuZGxlXy52YWx1ZSgpIDogTlVMTDsKKyAgICByZXR1cm4gaGFuZGxlXyA/ICZoYW5kbGVfLnZhbHVlKCkgOiBOVUxMOwogICB9CiAKICAgc2NvcGVkX3B0cjxCYXNlQ2xhc3M+IE1ha2VDb3B5KCkgY29uc3QgT1ZFUlJJREUgewogICAgIFRSQUNLX01FTU9SWV9TQ09QRSgiSmF2YXNjcmlwdCIpOwotICAgIERDSEVDSyhvYmplY3RfaGFuZGxlXyk7CisgICAgRENIRUNLKGhhbmRsZV8pOwogICAgIEpTQXV0b1JlcXVlc3QgYXV0b19yZXF1ZXN0KGNvbnRleHRfKTsKLSAgICBKUzo6Um9vdGVkT2JqZWN0IHJvb3RlZF9vYmplY3QoY29udGV4dF8sIGpzX29iamVjdCgpKTsKKyAgICBKUzo6Um9vdGVkVmFsdWUgcm9vdGVkX3ZhbHVlKGNvbnRleHRfLCBqc192YWx1ZSgpKTsKICAgICByZXR1cm4gbWFrZV9zY29wZWRfcHRyPEJhc2VDbGFzcz4oCi0gICAgICAgIG5ldyBNb3pqc1VzZXJPYmplY3RIb2xkZXIocm9vdGVkX29iamVjdCwgY29udGV4dF8sIHdyYXBwZXJfZmFjdG9yeV8pKTsKKyAgICAgICAgbmV3IE1vempzVXNlck9iamVjdEhvbGRlcihyb290ZWRfdmFsdWUsIGNvbnRleHRfLCB3cmFwcGVyX2ZhY3RvcnlfKSk7CiAgIH0KIAogICBib29sIEVxdWFsVG8oY29uc3QgQmFzZUNsYXNzJiBvdGhlcikgY29uc3QgT1ZFUlJJREUgewogICAgIGNvbnN0IE1vempzVXNlck9iamVjdEhvbGRlciogbW96anNfb3RoZXIgPQogICAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxjb25zdCBNb3pqc1VzZXJPYmplY3RIb2xkZXIqPigmb3RoZXIpOwotICAgIGlmICghb2JqZWN0X2hhbmRsZV8pIHsKLSAgICAgIHJldHVybiAhbW96anNfb3RoZXItPm9iamVjdF9oYW5kbGVfOworICAgIGlmICghaGFuZGxlXykgeworICAgICAgcmV0dXJuICFtb3pqc19vdGhlci0+aGFuZGxlXzsKKyAgICB9IGVsc2UgaWYgKCFtb3pqc19vdGhlci0+aGFuZGxlXykgeworICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KLSAgICBEQ0hFQ0sob2JqZWN0X2hhbmRsZV8pOwotICAgIERDSEVDSyhtb3pqc19vdGhlci0+b2JqZWN0X2hhbmRsZV8pOwotICAgIHJldHVybiBvYmplY3RfaGFuZGxlXy0+aGFuZGxlKCkgPT0gbW96anNfb3RoZXItPm9iamVjdF9oYW5kbGVfLT5oYW5kbGUoKTsKKworICAgIERDSEVDSyhoYW5kbGVfKTsKKyAgICBEQ0hFQ0sobW96anNfb3RoZXItPmhhbmRsZV8pOworCisgICAgSlM6OlJvb3RlZFZhbHVlIHZhbHVlMShjb250ZXh0XywganNfdmFsdWUoKSk7CisgICAgSlM6OlJvb3RlZFZhbHVlIHZhbHVlMihjb250ZXh0XywgbW96anNfb3RoZXItPmpzX3ZhbHVlKCkpOworICAgIHJldHVybiB1dGlsOjpJc1NhbWVHY1RoaW5nKGNvbnRleHRfLCB2YWx1ZTEsIHZhbHVlMik7CisgIH0KKworICBjb25zdCBKUzo6VmFsdWUmIGpzX3ZhbHVlKCkgY29uc3QgeworICAgIERDSEVDSyhoYW5kbGVfKTsKKyAgICByZXR1cm4gaGFuZGxlXy0+dmFsdWUoKTsKICAgfQogCiAgIEpTT2JqZWN0KiBqc19vYmplY3QoKSBjb25zdCB7Ci0gICAgRENIRUNLKG9iamVjdF9oYW5kbGVfKTsKLSAgICByZXR1cm4gb2JqZWN0X2hhbmRsZV8tPmhhbmRsZSgpOworICAgIERDSEVDSyhoYW5kbGVfKTsKKyAgICByZXR1cm4gaGFuZGxlXy0+aGFuZGxlKCk7CiAgIH0KIAogIHByaXZhdGU6CkBAIC0xMTQsNyArMTMyLDcgQEAKICAgICAgIFdyYXBwYWJsZUFuZFByaXZhdGVIYXNoTWFwOwogCiAgIEpTQ29udGV4dCogY29udGV4dF87Ci0gIGJhc2U6Om9wdGlvbmFsPE1vempzVXNlck9iamVjdFR5cGU+IG9iamVjdF9oYW5kbGVfOworICBiYXNlOjpvcHRpb25hbDxNb3pqc1VzZXJPYmplY3RUeXBlPiBoYW5kbGVfOwogICBXcmFwcGVyRmFjdG9yeSogd3JhcHBlcl9mYWN0b3J5XzsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3ZhcmlhYmxlcy5neXBpIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdmFyaWFibGVzLmd5cGkKaW5kZXggN2FjMjJmOS4uMWZmYmM5ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdmFyaWFibGVzLmd5cGkKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfdmFyaWFibGVzLmd5cGkKQEAgLTE2LDcgKzE2LDcgQEAKICAgJ3ZhcmlhYmxlcyc6IHsKICAgICAnY29uZGl0aW9ucyc6IFsKICAgICAgIFsnamF2YXNjcmlwdF9lbmdpbmUgPT0gIm1vempzIicsIHsKLSAgICAgICAgJ2dlbmVyYXRlZF9iaW5kaW5nc19wcmVmaXgnOiAnTW96anMnLAorICAgICAgICAnZ2VuZXJhdGVkX2JpbmRpbmdzX3ByZWZpeCc6ICdtb3pqcycsCiAgICAgICAgICdlbmdpbmVfaW5jbHVkZV9kaXJzJzogW10sCiAgICAgICAgICdlbmdpbmVfZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAgICc8KERFUFRIKS90aGlyZF9wYXJ0eS9tb3pqcy9tb3pqcy5neXA6bW96anNfbGliJywKQEAgLTI4LDYgKzI4LDcgQEAKICAgICAgICAgJ2VuZ2luZV90ZW1wbGF0ZV9maWxlcyc6IFsKICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9jYWxsYmFjay1pbnRlcmZhY2UuY2MudGVtcGxhdGUnLAogICAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvYmluZGluZ3MvbW96anMvdGVtcGxhdGVzL2NhbGxiYWNrLWludGVyZmFjZS5oLnRlbXBsYXRlJywKKyAgICAgICAgICAnPChERVBUSCkvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9kaWN0aW9uYXJ5LWNvbnZlcnNpb24uaC50ZW1wbGF0ZScsCiAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvaW50ZXJmYWNlLmNjLnRlbXBsYXRlJywKICAgICAgICAgICAnPChERVBUSCkvY29iYWx0L2JpbmRpbmdzL21vempzL3RlbXBsYXRlcy9pbnRlcmZhY2UuaC50ZW1wbGF0ZScsCiAgICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9iaW5kaW5ncy9tb3pqcy90ZW1wbGF0ZXMvbWFjcm9zLmNjLnRlbXBsYXRlJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3dyYXBwZXJfaGFuZGxlLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9tb3pqc193cmFwcGVyX2hhbmRsZS5oCmluZGV4IDNmOGVmMzcuLjhiYzI3NjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL21vempzX3dyYXBwZXJfaGFuZGxlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvbW96anNfd3JhcHBlcl9oYW5kbGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfTU9aSlNfV1JBUFBFUl9IQU5ETEVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19NT1pKU19XUkFQUEVSX0hBTkRMRV9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9vcGFxdWVfcm9vdF90cmFja2VyLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvb3BhcXVlX3Jvb3RfdHJhY2tlci5jYwppbmRleCBkZmM0MDVlLi4yNjYzZTBiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9vcGFxdWVfcm9vdF90cmFja2VyLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL29wYXF1ZV9yb290X3RyYWNrZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy9vcGFxdWVfcm9vdF90cmFja2VyLmgiCiAKQEAgLTM5LDIwICszNywyMyBAQAogICB2b2lkIFRyYWNrUmVhY2hhYmlsaXR5KFdyYXBwZXJQcml2YXRlKiBmcm9tLCBXcmFwcGVyUHJpdmF0ZSogdG8pIHsKICAgICBpbnRwdHJfdCBmcm9tX2tleSA9IFJlZmVyZW5jZWRPYmplY3RNYXA6OkdldEtleUZvcldyYXBwYWJsZSgKICAgICAgICAgZnJvbS0+d3JhcHBhYmxlPFdyYXBwYWJsZT4oKS5nZXQoKSk7Ci0gICAgSlM6OlJvb3RlZE9iamVjdCB0b19vYmplY3QoY29udGV4dF8sIHRvLT5qc19vYmplY3RfcHJveHkoKSk7CisgICAgSlNPYmplY3QqIHRvX3Byb3h5ID0gdG8tPmpzX29iamVjdF9wcm94eSgpOworICAgIERDSEVDSyh0b19wcm94eSk7CisgICAgSlM6OlJvb3RlZFZhbHVlIHRvX3ZhbHVlKGNvbnRleHRfLCBKUzo6T2JqZWN0VmFsdWUoKnRvX3Byb3h5KSk7CiAgICAgcmVmZXJlbmNlZF9vYmplY3RzXy5wdXNoX2JhY2soCi0gICAgICAgIHN0ZDo6bWFrZV9wYWlyKGZyb21fa2V5LCBXZWFrSGVhcE9iamVjdChjb250ZXh0XywgdG9fb2JqZWN0KSkpOwotICAgIHJlZmVyZW5jZWRfb2JqZWN0X21hcF8tPkFkZFJlZmVyZW5jZWRPYmplY3QoZnJvbV9rZXksIHRvX29iamVjdCk7CisgICAgICAgIHN0ZDo6bWFrZV9wYWlyKGZyb21fa2V5LCBXZWFrSGVhcE9iamVjdChjb250ZXh0XywgdG9fdmFsdWUpKSk7CisgICAgcmVmZXJlbmNlZF9vYmplY3RfbWFwXy0+QWRkUmVmZXJlbmNlZE9iamVjdChmcm9tX2tleSwgdG9fdmFsdWUpOwogICB9CiAKICAgfk9wYXF1ZVJvb3RTdGF0ZUltcGwoKSB7CiAgICAgSlNBdXRvUmVxdWVzdCBhdXRvX3JlcXVlc3QoY29udGV4dF8pOwogICAgIGZvciAoUmVmZXJlbmNlZE9iamVjdFBhaXJWZWN0b3I6Oml0ZXJhdG9yIGl0ID0gcmVmZXJlbmNlZF9vYmplY3RzXy5iZWdpbigpOwogICAgICAgICAgaXQgIT0gcmVmZXJlbmNlZF9vYmplY3RzXy5lbmQoKTsgKytpdCkgewotICAgICAgaWYgKGl0LT5zZWNvbmQuR2V0KCkpIHsKLSAgICAgICAgSlM6OlJvb3RlZE9iamVjdCByZWFjaGFibGVfb2JqZWN0KGNvbnRleHRfLCBpdC0+c2Vjb25kLkdldCgpKTsKKyAgICAgIFdlYWtIZWFwT2JqZWN0ICZ2YWx1ZSA9IGl0LT5zZWNvbmQ7CisgICAgICBpZiAodmFsdWUuSXNHY1RoaW5nKCkgJiYgIXZhbHVlLldhc0NvbGxlY3RlZCgpKSB7CisgICAgICAgIEpTOjpSb290ZWRWYWx1ZSByZWFjaGFibGVfdmFsdWUoY29udGV4dF8sIHZhbHVlLkdldFZhbHVlKCkpOwogICAgICAgICByZWZlcmVuY2VkX29iamVjdF9tYXBfLT5SZW1vdmVSZWZlcmVuY2VkT2JqZWN0KGl0LT5maXJzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGFibGVfb2JqZWN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWFjaGFibGVfdmFsdWUpOwogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvb3BhcXVlX3Jvb3RfdHJhY2tlci5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvb3BhcXVlX3Jvb3RfdHJhY2tlci5oCmluZGV4IDEwNTE3YTYuLjJiM2FhZGUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL29wYXF1ZV9yb290X3RyYWNrZXIuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9vcGFxdWVfcm9vdF90cmFja2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX09QQVFVRV9ST09UX1RSQUNLRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19PUEFRVUVfUk9PVF9UUkFDS0VSX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmNjCmluZGV4IDQ5OGVkYjIuLjJjNDVkYmIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaCIKIApAQCAtNTMsNTkgKzUxLDMzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVJZCBpZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNQcm9wZXJ0eURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKSB7Ci0gIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi9XZWJJREwvI2dldG93bnByb3BlcnR5Ci0gIGlmIChzdXBwb3J0c19uYW1lZF9wcm9wZXJ0aWVzKCkgfHwgc3VwcG9ydHNfaW5kZXhlZF9wcm9wZXJ0aWVzKCkpIHsKLSAgICAvLyBDb252ZXJ0IHRoZSBpZCB0byBhIEpTVmFsdWUsIHNvIHdlIGNhbiBlYXNpbHkgY29udmVydCBpdCB0byBVaW50MzIgYW5kCi0gICAgLy8gSlNTdHJpbmcuCi0gICAgSlM6OlJvb3RlZFZhbHVlIGlkX3ZhbHVlKGNvbnRleHQpOwotICAgIGlmICghSlNfSWRUb1ZhbHVlKGNvbnRleHQsIGlkLCBpZF92YWx1ZS5hZGRyZXNzKCkpKSB7Ci0gICAgICBOT1RSRUFDSEVEKCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsIGpzOjpHZXRQcm94eVRhcmdldE9iamVjdChwcm94eSkpOwotICAgIGlmIChzdXBwb3J0c19pbmRleGVkX3Byb3BlcnRpZXMoKSkgewotICAgICAgLy8gSWYgdGhlIGludGVyZmFjZSBzdXBwb3J0cyBpbmRleGVkIHByb3BlcnRpZXMgYW5kIHRoaXMgaXMgYW4gYXJyYXkgaW5kZXgKLSAgICAgIC8vIHByb3BlcnR5IG5hbWUsIGFuZCBpdCBpcyBhIHN1cHBvcnRlZCBwcm9wZXJ0eSBpbmRleC4KLSAgICAgIHVpbnQzMl90IGluZGV4OwotICAgICAgaWYgKElzQXJyYXlJbmRleFByb3BlcnR5TmFtZShjb250ZXh0LCBpZF92YWx1ZSwgJmluZGV4KSAmJgotICAgICAgICAgIElzU3VwcG9ydGVkSW5kZXgoY29udGV4dCwgb2JqZWN0LCBpbmRleCkpIHsKLSAgICAgICAgZGVzY3JpcHRvci0+b2JqID0gb2JqZWN0OwotICAgICAgICBkZXNjcmlwdG9yLT5hdHRycyA9IEpTUFJPUF9TSEFSRUQgfCBKU1BST1BfSU5ERVggfCBKU1BST1BfRU5VTUVSQVRFOwotICAgICAgICBkZXNjcmlwdG9yLT5nZXR0ZXIgPSBpbmRleGVkX3Byb3BlcnR5X2hvb2tzXy5nZXR0ZXI7Ci0gICAgICAgIGlmIChpbmRleGVkX3Byb3BlcnR5X2hvb2tzXy5zZXR0ZXIpIHsKLSAgICAgICAgICBkZXNjcmlwdG9yLT5zZXR0ZXIgPSBpbmRleGVkX3Byb3BlcnR5X2hvb2tzXy5zZXR0ZXI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGVzY3JpcHRvci0+YXR0cnMgfD0gSlNQUk9QX1JFQURPTkxZOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoc3VwcG9ydHNfbmFtZWRfcHJvcGVydGllcygpKSB7Ci0gICAgICBzdGQ6OnN0cmluZyBwcm9wZXJ0eV9uYW1lOwotICAgICAgTW96anNFeGNlcHRpb25TdGF0ZSBleGNlcHRpb25fc3RhdGUoY29udGV4dCk7Ci0gICAgICBGcm9tSlNWYWx1ZShjb250ZXh0LCBpZF92YWx1ZSwga05vQ29udmVyc2lvbkZsYWdzLCAmZXhjZXB0aW9uX3N0YXRlLAotICAgICAgICAgICAgICAgICAgJnByb3BlcnR5X25hbWUpOwotICAgICAgaWYgKGV4Y2VwdGlvbl9zdGF0ZS5pc19leGNlcHRpb25fc2V0KCkpIHsKLSAgICAgICAgLy8gVGhlIElEIHNob3VsZCBiZSBhbiBpbnRlZ2VyIG9yIGEgc3RyaW5nLCBzbyB3ZSBzaG91bGRuJ3QgaGF2ZSBhbnkKLSAgICAgICAgLy8gZXhjZXB0aW9ucyBjb252ZXJ0aW5nIHRvIHN0cmluZy4KLSAgICAgICAgTk9UUkVBQ0hFRCgpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoSXNOYW1lZFByb3BlcnR5VmlzaWJsZShjb250ZXh0LCBvYmplY3QsIHByb3BlcnR5X25hbWUpKSB7Ci0gICAgICAgIGRlc2NyaXB0b3ItPm9iaiA9IG9iamVjdDsKLSAgICAgICAgZGVzY3JpcHRvci0+YXR0cnMgPSBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0VOVU1FUkFURTsKLSAgICAgICAgZGVzY3JpcHRvci0+Z2V0dGVyID0gbmFtZWRfcHJvcGVydHlfaG9va3NfLmdldHRlcjsKLSAgICAgICAgaWYgKG5hbWVkX3Byb3BlcnR5X2hvb2tzXy5zZXR0ZXIpIHsKLSAgICAgICAgICBkZXNjcmlwdG9yLT5zZXR0ZXIgPSBuYW1lZF9wcm9wZXJ0eV9ob29rc18uc2V0dGVyOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGRlc2NyaXB0b3ItPmF0dHJzIHw9IEpTUFJPUF9SRUFET05MWTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KKyAgaWYgKCFnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29udGV4dCwgcHJveHksIGlkLCBkZXNjcmlwdG9yLCBmbGFncykpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGRlc2NyaXB0b3ItPm9iaiA9PSBOVUxMKSB7CisgICAgSlM6OlJvb3RlZE9iamVjdCBwcm90b3R5cGUoY29udGV4dCk7CisgICAgaWYgKGdldFByb3RvdHlwZU9mKGNvbnRleHQsIHByb3h5LCAmcHJvdG90eXBlKSkgeworICAgICAgcmV0dXJuIEpTX0dldFByb3BlcnR5RGVzY3JpcHRvckJ5SWQoY29udGV4dCwgcHJvdG90eXBlLCBpZCwgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yKTsKICAgICB9CiAgIH0KLSAgcmV0dXJuIGpzOjpEaXJlY3RQcm94eUhhbmRsZXI6OmdldFByb3BlcnR5RGVzY3JpcHRvcihjb250ZXh0LCBwcm94eSwgaWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgZmxhZ3MpOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQcm94eUhhbmRsZXI6OmdldE93blByb3BlcnR5RGVzY3JpcHRvcihKU0NvbnRleHQqIGNvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgcHJveHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVJZCBpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlNQcm9wZXJ0eURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGZsYWdzKSB7CisgIGlmICghTGVnYWN5UGxhdGZvcm1PYmplY3RHZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IoY29udGV4dCwgcHJveHksIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGRlc2NyaXB0b3ItPm9iaiA9PSBOVUxMKSB7CisgICAgcmV0dXJuIGpzOjpEaXJlY3RQcm94eUhhbmRsZXI6OmdldE93blByb3BlcnR5RGVzY3JpcHRvcihjb250ZXh0LCBwcm94eSwgaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLCBmbGFncyk7CisgIH0KKyAgcmV0dXJuIHRydWU7CiB9CiAKIGJvb2wgUHJveHlIYW5kbGVyOjpkZWxldGVfKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwKQEAgLTE4OCw2ICsxNjAsNjMgQEAKICAgcmV0dXJuIGpzOjpEaXJlY3RQcm94eUhhbmRsZXI6OmRlZmluZVByb3BlcnR5KGNvbnRleHQsIHByb3h5LCBpZCwgZGVzY3JpcHRvcik7CiB9CiAKK2Jvb2wgUHJveHlIYW5kbGVyOjpMZWdhY3lQbGF0Zm9ybU9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcigKKyAgICBKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgcHJveHksIEpTOjpIYW5kbGVJZCBpZCwKKyAgICBKU1Byb3BlcnR5RGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNMZWdhY3lQbGF0Zm9ybU9iamVjdEdldE93blByb3BlcnR5CisgIEpTOjpSb290ZWRPYmplY3Qgb2JqZWN0KGNvbnRleHQsIGpzOjpHZXRQcm94eVRhcmdldE9iamVjdChwcm94eSkpOworICBpZiAoc3VwcG9ydHNfbmFtZWRfcHJvcGVydGllcygpIHx8IHN1cHBvcnRzX2luZGV4ZWRfcHJvcGVydGllcygpKSB7CisgICAgLy8gQ29udmVydCB0aGUgaWQgdG8gYSBKU1ZhbHVlLCBzbyB3ZSBjYW4gZWFzaWx5IGNvbnZlcnQgaXQgdG8gVWludDMyIGFuZAorICAgIC8vIEpTU3RyaW5nLgorICAgIEpTOjpSb290ZWRWYWx1ZSBpZF92YWx1ZShjb250ZXh0KTsKKyAgICBpZiAoIUpTX0lkVG9WYWx1ZShjb250ZXh0LCBpZCwgaWRfdmFsdWUuYWRkcmVzcygpKSkgeworICAgICAgTk9UUkVBQ0hFRCgpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoc3VwcG9ydHNfaW5kZXhlZF9wcm9wZXJ0aWVzKCkpIHsKKyAgICAgIC8vIElmIHRoZSBpbnRlcmZhY2Ugc3VwcG9ydHMgaW5kZXhlZCBwcm9wZXJ0aWVzIGFuZCB0aGlzIGlzIGFuIGFycmF5IGluZGV4CisgICAgICAvLyBwcm9wZXJ0eSBuYW1lLCBhbmQgaXQgaXMgYSBzdXBwb3J0ZWQgcHJvcGVydHkgaW5kZXguCisgICAgICB1aW50MzJfdCBpbmRleDsKKyAgICAgIGlmIChJc0FycmF5SW5kZXhQcm9wZXJ0eU5hbWUoY29udGV4dCwgaWRfdmFsdWUsICZpbmRleCkgJiYKKyAgICAgICAgICBJc1N1cHBvcnRlZEluZGV4KGNvbnRleHQsIG9iamVjdCwgaW5kZXgpKSB7CisgICAgICAgIGRlc2NyaXB0b3ItPm9iaiA9IG9iamVjdDsKKyAgICAgICAgZGVzY3JpcHRvci0+YXR0cnMgPSBKU1BST1BfU0hBUkVEIHwgSlNQUk9QX0lOREVYIHwgSlNQUk9QX0VOVU1FUkFURTsKKyAgICAgICAgZGVzY3JpcHRvci0+Z2V0dGVyID0gaW5kZXhlZF9wcm9wZXJ0eV9ob29rc18uZ2V0dGVyOworICAgICAgICBpZiAoaW5kZXhlZF9wcm9wZXJ0eV9ob29rc18uc2V0dGVyKSB7CisgICAgICAgICAgZGVzY3JpcHRvci0+c2V0dGVyID0gaW5kZXhlZF9wcm9wZXJ0eV9ob29rc18uc2V0dGVyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGRlc2NyaXB0b3ItPmF0dHJzIHw9IEpTUFJPUF9SRUFET05MWTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKHN1cHBvcnRzX25hbWVkX3Byb3BlcnRpZXMoKSkgeworICAgICAgc3RkOjpzdHJpbmcgcHJvcGVydHlfbmFtZTsKKyAgICAgIE1vempzRXhjZXB0aW9uU3RhdGUgZXhjZXB0aW9uX3N0YXRlKGNvbnRleHQpOworICAgICAgRnJvbUpTVmFsdWUoY29udGV4dCwgaWRfdmFsdWUsIGtOb0NvbnZlcnNpb25GbGFncywgJmV4Y2VwdGlvbl9zdGF0ZSwKKyAgICAgICAgICAgICAgICAgICZwcm9wZXJ0eV9uYW1lKTsKKyAgICAgIGlmIChleGNlcHRpb25fc3RhdGUuaXNfZXhjZXB0aW9uX3NldCgpKSB7CisgICAgICAgIC8vIFRoZSBJRCBzaG91bGQgYmUgYW4gaW50ZWdlciBvciBhIHN0cmluZywgc28gd2Ugc2hvdWxkbid0IGhhdmUgYW55CisgICAgICAgIC8vIGV4Y2VwdGlvbnMgY29udmVydGluZyB0byBzdHJpbmcuCisgICAgICAgIE5PVFJFQUNIRUQoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgICAgaWYgKElzTmFtZWRQcm9wZXJ0eVZpc2libGUoY29udGV4dCwgb2JqZWN0LCBwcm9wZXJ0eV9uYW1lKSkgeworICAgICAgICBkZXNjcmlwdG9yLT5vYmogPSBvYmplY3Q7CisgICAgICAgIGRlc2NyaXB0b3ItPmF0dHJzID0gSlNQUk9QX1NIQVJFRCB8IEpTUFJPUF9FTlVNRVJBVEU7CisgICAgICAgIGRlc2NyaXB0b3ItPmdldHRlciA9IG5hbWVkX3Byb3BlcnR5X2hvb2tzXy5nZXR0ZXI7CisgICAgICAgIGlmIChuYW1lZF9wcm9wZXJ0eV9ob29rc18uc2V0dGVyKSB7CisgICAgICAgICAgZGVzY3JpcHRvci0+c2V0dGVyID0gbmFtZWRfcHJvcGVydHlfaG9va3NfLnNldHRlcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBkZXNjcmlwdG9yLT5hdHRycyB8PSBKU1BST1BfUkVBRE9OTFk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCiBib29sIFByb3h5SGFuZGxlcjo6SXNTdXBwb3J0ZWRJbmRleChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaW5kZXgpIHsKICAgRENIRUNLKGluZGV4ZWRfcHJvcGVydHlfaG9va3NfLmlzX3N1cHBvcnRlZCk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9wcm94eV9oYW5kbGVyLmgKaW5kZXggZmZiYWRjYS4uYzZlZmY2ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvcHJveHlfaGFuZGxlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3Byb3h5X2hhbmRsZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfUFJPWFlfSEFORExFUl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1BST1hZX0hBTkRMRVJfSF8KIApAQCAtODksNiArODcsMTAgQEAKICAgYm9vbCBnZXRQcm9wZXJ0eURlc2NyaXB0b3IoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKUzo6SGFuZGxlSWQgaWQsIEpTUHJvcGVydHlEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBmbGFncykgT1ZFUlJJREU7CisgIGJvb2wgZ2V0T3duUHJvcGVydHlEZXNjcmlwdG9yKEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZUlkIGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBKU1Byb3BlcnR5RGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgZmxhZ3MpIE9WRVJSSURFOwogICBib29sIGRlbGV0ZV8oSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IHByb3h5LCBKUzo6SGFuZGxlSWQgaWQsCiAgICAgICAgICAgICAgICBib29sKiBzdWNjZWVkZWQpIE9WRVJSSURFOwogICBib29sIGVudW1lcmF0ZShKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3QgcHJveHksCkBAIC0xMzcsNiArMTM5LDEzIEBACiAgIGJvb2wgaGFzX2N1c3RvbV9wcm9wZXJ0eSgpIGNvbnN0IHsgcmV0dXJuIGhhc19jdXN0b21fcHJvcGVydHlfOyB9CiAKICBwcml2YXRlOgorICAvLyBodHRwczovL2hleWNhbS5naXRodWIuaW8vd2ViaWRsLyNMZWdhY3lQbGF0Zm9ybU9iamVjdEdldE93blByb3BlcnR5CisgIC8vIFRoaXMgaXMgdXNlZCB0byBzdXBwb3J0IG5hbWVkIGFuZCBpbmRleGVkIHByb3BlcnRpZXMuCisgIC8vIFJldHVybnMgZmFsc2Ugb24gaW50ZXJuYWwgZmFpbHVyZS4KKyAgYm9vbCBMZWdhY3lQbGF0Zm9ybU9iamVjdEdldE93blByb3BlcnR5RGVzY3JpcHRvcigKKyAgICAgIEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBwcm94eSwgSlM6OkhhbmRsZUlkIGlkLAorICAgICAgSlNQcm9wZXJ0eURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCiAgIGJvb2wgc3VwcG9ydHNfbmFtZWRfcHJvcGVydGllcygpIHsKICAgICByZXR1cm4gbmFtZWRfcHJvcGVydHlfaG9va3NfLmdldHRlciAhPSBOVUxMOwogICB9CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9yZWZlcmVuY2VkX29iamVjdF9tYXAuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy9yZWZlcmVuY2VkX29iamVjdF9tYXAuY2MKaW5kZXggMzhmOWFmMy4uYzEyZWFmZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3JlZmVyZW5jZWRfb2JqZWN0X21hcC5jYwpAQCAtMSwyNCArMSwyNCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3JlZmVyZW5jZWRfb2JqZWN0X21hcC5oIgogCiAjaW5jbHVkZSA8dXRpbGl0eT4KIAorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9hbGdvcml0aG1faGVscGVycy5oIgogI2luY2x1ZGUgIm5iL21lbW9yeV9zY29wZS5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2FwaS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzY3JpcHQgewpAQCAtMjksMjMgKzI5LDI1IEBACiAKIC8vIEFkZC9SZW1vdmUgYSByZWZlcmVuY2UgZnJvbSBhIFdyYXBwZXJQcml2YXRlIHRvIGEgSlNWYWx1ZS4KIHZvaWQgUmVmZXJlbmNlZE9iamVjdE1hcDo6QWRkUmVmZXJlbmNlZE9iamVjdChpbnRwdHJfdCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZU9iamVjdCByZWZlcmVlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZVZhbHVlIHJlZmVyZWUpIHsKICAgVFJBQ0tfTUVNT1JZX1NDT1BFKCJKYXZhc2NyaXB0Iik7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgRENIRUNLKHJlZmVyZWUpOworICBEQ0hFQ0soIXJlZmVyZWUuaXNOdWxsT3JVbmRlZmluZWQoKSk7CisgIERDSEVDSyhyZWZlcmVlLmlzR0NUaGluZygpKTsKICAgcmVmZXJlbmNlZF9vYmplY3RzXy5pbnNlcnQoCiAgICAgICBzdGQ6Om1ha2VfcGFpcihrZXksIFdlYWtIZWFwT2JqZWN0KGNvbnRleHRfLCByZWZlcmVlKSkpOwogfQogCiB2b2lkIFJlZmVyZW5jZWRPYmplY3RNYXA6OlJlbW92ZVJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVPYmplY3QgcmVmZXJlZSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVWYWx1ZSByZWZlcmVlKSB7CiAgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKICAgc3RkOjpwYWlyPFJlZmVyZW5jZWRPYmplY3RNdWx0aU1hcDo6aXRlcmF0b3IsCiAgICAgICAgICAgICBSZWZlcmVuY2VkT2JqZWN0TXVsdGlNYXA6Oml0ZXJhdG9yPiBwYWlyX3JhbmdlID0KICAgICAgIHJlZmVyZW5jZWRfb2JqZWN0c18uZXF1YWxfcmFuZ2Uoa2V5KTsKICAgZm9yIChSZWZlcmVuY2VkT2JqZWN0TXVsdGlNYXA6Oml0ZXJhdG9yIGl0ID0gcGFpcl9yYW5nZS5maXJzdDsKICAgICAgICBpdCAhPSBwYWlyX3JhbmdlLnNlY29uZDsgKytpdCkgewotICAgIGlmIChpdC0+c2Vjb25kLkdldCgpID09IHJlZmVyZWUpIHsKKyAgICBKUzo6Um9vdGVkVmFsdWUgZWxlbWVudChjb250ZXh0XywgaXQtPnNlY29uZC5HZXRWYWx1ZSgpKTsKKyAgICBpZiAodXRpbDo6SXNTYW1lR2NUaGluZyhjb250ZXh0XywgcmVmZXJlZSwgZWxlbWVudCkpIHsKICAgICAgIC8vIFRoZXJlIG1heSBiZSBtdWx0aXBsZSBtYXBwaW5ncyBiZXR3ZWVuIGEgc3BlY2lmaWMgb3duZXIgYW5kIGEgSlMKICAgICAgIC8vIG9iamVjdC4gT25seSByZW1vdmUgdGhlIGZpcnN0IG1hcHBpbmcuCiAgICAgICByZWZlcmVuY2VkX29iamVjdHNfLmVyYXNlKGl0KTsKQEAgLTcyLDExICs3NCwxMiBAQAogICBmb3IgKFJlZmVyZW5jZWRPYmplY3RNdWx0aU1hcDo6aXRlcmF0b3IgaXQgPSByZWZlcmVuY2VkX29iamVjdHNfLmJlZ2luKCk7CiAgICAgICAgaXQgIT0gcmVmZXJlbmNlZF9vYmplY3RzXy5lbmQoKTsKICAgICAgICAvKkluY3JlbWVudGVkIGluIHRoZSBsb29wICovKSB7Ci0gICAgaWYgKGl0LT5zZWNvbmQuR2V0KCkpIHsKLSAgICAgICsraXQ7Ci0gICAgfSBlbHNlIHsKKyAgICBpZiAoaXQtPnNlY29uZC5XYXNDb2xsZWN0ZWQoKSkgewogICAgICAgUmVmZXJlbmNlZE9iamVjdE11bHRpTWFwOjppdGVyYXRvciBlcmFzZV9pdGVyYXRvciA9IGl0Kys7CiAgICAgICByZWZlcmVuY2VkX29iamVjdHNfLmVyYXNlKGVyYXNlX2l0ZXJhdG9yKTsKKyAgICB9IGVsc2UgeworICAgICAgRENIRUNLKGl0LT5zZWNvbmQuSXNHY1RoaW5nKCkpOworICAgICAgKytpdDsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3JlZmVyZW5jZWRfb2JqZWN0X21hcC5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgKaW5kZXggYzFkNDkyNC4uNTE0NTBmNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvcmVmZXJlbmNlZF9vYmplY3RfbWFwLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX1JFRkVSRU5DRURfT0JKRUNUX01BUF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1JFRkVSRU5DRURfT0JKRUNUX01BUF9IXwogCkBAIC00Myw4ICs0MSw4IEBACiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHdyYXBwYWJsZSk7CiAgIH0KIAotICB2b2lkIEFkZFJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LCBKUzo6SGFuZGxlT2JqZWN0IHJlZmVyZWUpOwotICB2b2lkIFJlbW92ZVJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LCBKUzo6SGFuZGxlT2JqZWN0IHJlZmVyZWUpOworICB2b2lkIEFkZFJlZmVyZW5jZWRPYmplY3QoaW50cHRyX3Qga2V5LCBKUzo6SGFuZGxlVmFsdWUgcmVmZXJlZSk7CisgIHZvaWQgUmVtb3ZlUmVmZXJlbmNlZE9iamVjdChpbnRwdHJfdCBrZXksIEpTOjpIYW5kbGVWYWx1ZSByZWZlcmVlKTsKIAogICAvLyBUcmFjZSBhbGwgb2JqZWN0cyByZWZlcmVuY2VkIGZyb20gdGhpcyBXcmFwcGVyUHJpdmF0ZSouCiAgIHZvaWQgVHJhY2VSZWZlcmVuY2VkT2JqZWN0cyhKU1RyYWNlciogdHJhY2UsIGludHB0cl90IGtleSk7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdHlwZV90cmFpdHMuaAppbmRleCAzMzZkYjYzLi5kODNiOGI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy90eXBlX3RyYWl0cy5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3R5cGVfdHJhaXRzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfVFlQRV9UUkFJVFNfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19UWVBFX1RSQUlUU19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ZvcndhcmQuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3VuaW9uX3R5cGVfY29udmVyc2lvbl9mb3J3YXJkLmgKaW5kZXggOTkzZjU3Mi4uNDc1NTEyMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ZvcndhcmQuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oCkBAIC0yLDIxICsyLDE5IEBACiAvLyAgICAgcHVtcC5weSB1bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oLnB1bXAKIC8vIERPIE5PVCBFRElUIEJZIEhBTkQhISEKIAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19VTklPTl9UWVBFX0NPTlZFUlNJT05fRk9SV0FSRF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1VOSU9OX1RZUEVfQ09OVkVSU0lPTl9GT1JXQVJEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oLnB1bXAgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91bmlvbl90eXBlX2NvbnZlcnNpb25fZm9yd2FyZC5oLnB1bXAKaW5kZXggYmZkZjBiOS4uMTgzNzY2NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ZvcndhcmQuaC5wdW1wCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3VuaW9uX3R5cGVfY29udmVyc2lvbl9mb3J3YXJkLmgucHVtcApAQCAtNywyMSArNywxOSBAQAogCiAkJCBNYXhpbXVtIG51bWJlciBvZiBkaWZmZXJlbnQgbWVtYmVyIHR5cGVzIGluIGEgdW5pb24uCiAkdmFyIE1BWF9NRU1CRVJTID0gNAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19VTklPTl9UWVBFX0NPTlZFUlNJT05fRk9SV0FSRF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1VOSU9OX1RZUEVfQ09OVkVSU0lPTl9GT1JXQVJEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91bmlvbl90eXBlX2NvbnZlcnNpb25faW1wbC5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ltcGwuaAppbmRleCAyNjAzZGU2Li4yNTJiNzExIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91bmlvbl90eXBlX2NvbnZlcnNpb25faW1wbC5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3VuaW9uX3R5cGVfY29udmVyc2lvbl9pbXBsLmgKQEAgLTIsMjEgKzIsMTkgQEAKIC8vICAgICBwdW1wLnB5IHVuaW9uX3R5cGVfY29udmVyc2lvbl9pbXBsLmgucHVtcAogLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQogCi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX1VOSU9OX1RZUEVfQ09OVkVSU0lPTl9JTVBMX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfVU5JT05fVFlQRV9DT05WRVJTSU9OX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3VuaW9uX3R5cGVfY29udmVyc2lvbl9pbXBsLmgucHVtcCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3VuaW9uX3R5cGVfY29udmVyc2lvbl9pbXBsLmgucHVtcAppbmRleCBjZjFjZTY2Li43MzFhNzQ2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91bmlvbl90eXBlX2NvbnZlcnNpb25faW1wbC5oLnB1bXAKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdW5pb25fdHlwZV9jb252ZXJzaW9uX2ltcGwuaC5wdW1wCkBAIC03LDIxICs3LDE5IEBACiAKICQkIE1heGltdW0gbnVtYmVyIG9mIGRpZmZlcmVudCBtZW1iZXIgdHlwZXMgaW4gYSB1bmlvbi4KICR2YXIgTUFYX01FTUJFUlMgPSA0Ci0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX1VOSU9OX1RZUEVfQ09OVkVSU0lPTl9JTVBMX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfVU5JT05fVFlQRV9DT05WRVJTSU9OX0lNUExfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmNjCmluZGV4IDg2NTk1NmUuLjMwYWU5MGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9hbGdvcml0aG1faGVscGVycy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuaCIKIApAQCAtMjcsNiArMjUsMTkgQEAKIG5hbWVzcGFjZSBtb3pqcyB7CiBuYW1lc3BhY2UgdXRpbCB7CiAKK2Jvb2wgSXNTYW1lR2NUaGluZyhKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZTEsCisgICAgICAgICAgICAgICAgICAgSlM6OkhhbmRsZVZhbHVlIHZhbHVlMikgeworICBpZiAodmFsdWUxLmlzTnVsbE9yVW5kZWZpbmVkKCkpIHsKKyAgICByZXR1cm4gdmFsdWUyLmlzTnVsbE9yVW5kZWZpbmVkKCk7CisgIH0KKworICBpZiAoIXZhbHVlMS5pc0dDVGhpbmcoKSB8fCAhdmFsdWUyLmlzR0NUaGluZygpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHZhbHVlMS50b0dDVGhpbmcoKSA9PSB2YWx1ZTIudG9HQ1RoaW5nKCk7Cit9CisKIGJvb2wgR2V0SXRlcmF0b3IoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IG9iamVjdCwKICAgICAgICAgICAgICAgICAgSlM6Ok11dGFibGVIYW5kbGVPYmplY3Qgb3V0X2l0ZXJhdG9yKSB7CiAgIC8vIFVzZXMgdGhlIGpzaXRlciBBUEkgdG8gZ2V0IHRoZSBpdGVyYXRvciwgYXMgU00yNCBpdCBkb2Vzbid0IHNlZW0gdG8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3V0aWwvYWxnb3JpdGhtX2hlbHBlcnMuaAppbmRleCBlMDMwZDc5Li42ODQ1Y2MxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL2FsZ29yaXRobV9oZWxwZXJzLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9hbGdvcml0aG1faGVscGVycy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19VVElMX0FMR09SSVRITV9IRUxQRVJTX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfVVRJTF9BTEdPUklUSE1fSEVMUEVSU19IXwogCkBAIC0yMiw2ICsyMCwxMSBAQAogbmFtZXNwYWNlIHNjcmlwdCB7CiBuYW1lc3BhY2UgbW96anMgewogbmFtZXNwYWNlIHV0aWwgeworLy8gV2hldGhlciB8dmFsdWUxfCBhbmQgfHZhbHVlMnwgYXJlIGJvdGggR0MgdGhpbmdzIGFuZCBhcmUgdGhlIHNhbWUgR0MgdGhpbmcuCisvLyBpLmUuIFJldHVybnMgfGZhbHNlfCBpZiBlaXRoZXIgdmFsdWUgaXMgbm90IGEgR0MgdGhpbmcuCitib29sIElzU2FtZUdjVGhpbmcoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlVmFsdWUgdmFsdWUxLAorICAgICAgICAgICAgICAgICAgIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZTIpOworCiAvLyBodHRwczovL3RjMzkuZ2l0aHViLmlvL2VjbWEyNjIvI3NlYy1nZXRpdGVyYXRvcgogYm9vbCBHZXRJdGVyYXRvcihKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVPYmplY3Qgb2JqZWN0LAogICAgICAgICAgICAgICAgICBKUzo6TXV0YWJsZUhhbmRsZU9iamVjdCBvdXRfaXRlcmF0b3IpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuY2MKaW5kZXggM2E0YjgwYy4uMzRjNmFhMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL2V4Y2VwdGlvbl9oZWxwZXJzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL2V4Y2VwdGlvbl9oZWxwZXJzLmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL2V4Y2VwdGlvbl9oZWxwZXJzLmgKaW5kZXggN2U1ZTU2My4uZmYxNjQxMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9leGNlcHRpb25faGVscGVycy5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfVVRJTF9FWENFUFRJT05fSEVMUEVSU19IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1VUSUxfRVhDRVBUSU9OX0hFTFBFUlNfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzOTVjZGUKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL3N0YWNrX3RyYWNlX2hlbHBlcnMuY2MKQEAgLTAsMCArMSwxMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgTkJfU0NSSVBUX1NUQUNLVFJBQ0VfSF8KKyNkZWZpbmUgTkJfU0NSSVBUX1NUQUNLVFJBQ0VfSF8KKworI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvdXRpbC9zdGFja190cmFjZV9oZWxwZXJzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL3V0aWwvZXhjZXB0aW9uX2hlbHBlcnMuaCIKKyNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3N0YWNrX2ZyYW1lLmgiCisjaW5jbHVkZSAibmIvdGhyZWFkX2xvY2FsX29iamVjdC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9vbmNlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNjcmlwdCB7CituYW1lc3BhY2UgbW96anMgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIHsKKwordHlwZWRlZiBuYjo6VGhyZWFkTG9jYWxPYmplY3Q8U3RhY2tUcmFjZUdlbmVyYXRvcj4gVGhyZWFkTG9jYWxKc1N0YWNrVHJhY2VyOworCitTQl9PTkNFX0lOSVRJQUxJWkVfRlVOQ1RJT04oVGhyZWFkTG9jYWxKc1N0YWNrVHJhY2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNfdGhyZWFkX2xvY2FsX2pzX3N0YWNrX3RyYWNlcl9zaW5nZWx0b24pOworCit9ICAvLyBuYW1lc3BhY2UuCisKK3ZvaWQgU2V0VGhyZWFkTG9jYWxKU0NvbnRleHQoSlNDb250ZXh0KiBjb250ZXh0KSB7CisgIEdldFRocmVhZExvY2FsU3RhY2tUcmFjZUdlbmVyYXRvcigpLT5zZXRfanNfY29udGV4dChjb250ZXh0KTsKK30KKworSlNDb250ZXh0KiBHZXRUaHJlYWRMb2NhbEpTQ29udGV4dCgpIHsKKyAgcmV0dXJuIEdldFRocmVhZExvY2FsU3RhY2tUcmFjZUdlbmVyYXRvcigpLT5qc19jb250ZXh0KCk7Cit9CisKK1N0YWNrVHJhY2VHZW5lcmF0b3IqIEdldFRocmVhZExvY2FsU3RhY2tUcmFjZUdlbmVyYXRvcigpIHsKKyAgcmV0dXJuIHNfdGhyZWFkX2xvY2FsX2pzX3N0YWNrX3RyYWNlcl9zaW5nZWx0b24oKS0+R2V0T3JDcmVhdGUoKTsKK30KKworLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vIElNUEwgLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLworCitTdGFja1RyYWNlR2VuZXJhdG9yOjpTdGFja1RyYWNlR2VuZXJhdG9yKCkgOiBqc19jb250ZXh0XyhOVUxMKSB7fQorU3RhY2tUcmFjZUdlbmVyYXRvcjo6flN0YWNrVHJhY2VHZW5lcmF0b3IoKSB7fQorCitib29sIFN0YWNrVHJhY2VHZW5lcmF0b3I6OlZhbGlkKCkgeyByZXR1cm4ganNfY29udGV4dF8gIT0gTlVMTDsgfQorCitzaXplX3QgU3RhY2tUcmFjZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGFja1RyYWNlKGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8U3RhY2tGcmFtZT4qIG91dCkgeworICBpZiAoIVZhbGlkKCkpIHsKKyAgICByZXR1cm4gMDsKKyAgfQorCisgICpvdXQgPSBHZXRTdGFja1RyYWNlKGpzX2NvbnRleHRfLCBkZXB0aCk7CisgIHJldHVybiBvdXQtPnNpemUoKTsKK30KKworc2l6ZV90IFN0YWNrVHJhY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3RhY2tUcmFjZUxpbmVzKAorICAgIGludCBkZXB0aCwgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+KiBvdXQpIHsKKyAgaWYgKCFWYWxpZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGQ6OnZlY3RvcjxTdGFja0ZyYW1lPiBzdGFja19mcmFtZSA9IEdldFN0YWNrVHJhY2UoanNfY29udGV4dF8sIGRlcHRoKTsKKyAgY29uc3Qgc2l6ZV90IG4gPSBzdGFja19mcmFtZS5zaXplKCk7CisKKyAgaWYgKG4gPiBvdXQtPnNpemUoKSkgeworICAgIG91dC0+cmVzaXplKG4pOworICB9CisKKyAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIFN0YWNrRnJhbWUmIHNmID0gc3RhY2tfZnJhbWVbaV07CisgICAgc3MgPDwgc2Yuc291cmNlX3VybCA8PCAiKCIgPDwgc2YubGluZV9udW1iZXIgPDwgIiwiIDw8IHNmLmNvbHVtbl9udW1iZXIKKyAgICAgICA8PCAiKToiIDw8IHNmLmZ1bmN0aW9uX25hbWU7CisgICAgLy8gV3JpdGUgdGhlIHN0cmluZyBvdXQuCisgICAgKCpvdXQpW2ldID0gc3Muc3RyKCk7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKK2Jvb2wgU3RhY2tUcmFjZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGFja1RyYWNlU3RyaW5nKGludCBkZXB0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBvdXQpIHsKKyAgaWYgKCFWYWxpZCgpKSB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdGQ6OnZlY3RvcjxTdGFja0ZyYW1lPiBzdGFja19mcmFtZSA9IEdldFN0YWNrVHJhY2UoanNfY29udGV4dF8sIGRlcHRoKTsKKyAgY29uc3Qgc2l6ZV90IG4gPSBzdGFja19mcmFtZS5zaXplKCk7CisKKyAgaWYgKG4gPT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICBmb3IgKGludCBpID0gc3RhdGljX2Nhc3Q8aW50PihuIC0gMSk7IGkgPj0gMDsgLS1pKSB7CisgICAgY29iYWx0OjpzY3JpcHQ6OlN0YWNrRnJhbWUmIHNmID0gc3RhY2tfZnJhbWVbc3RhdGljX2Nhc3Q8c2l6ZV90PihpKV07CisgICAgZm9yIChzaXplX3QgaiA9IDA7IGogPCBpOyArK2opIHsKKyAgICAgIHNzIDw8ICIgICI7CisgICAgfQorICAgIHNzIDw8IHNmLnNvdXJjZV91cmwgPDwgIigiIDw8IHNmLmxpbmVfbnVtYmVyIDw8ICIsIiA8PCBzZi5jb2x1bW5fbnVtYmVyCisgICAgICAgPDwgIik6IiA8PCBzZi5mdW5jdGlvbl9uYW1lIDw8ICJcbiI7CisgIH0KKyAgKm91dCA9IHNzLnN0cigpOworICByZXR1cm4gdHJ1ZTsKK30KKworSlNDb250ZXh0KiBTdGFja1RyYWNlR2VuZXJhdG9yOjpqc19jb250ZXh0KCkgeyByZXR1cm4ganNfY29udGV4dF87IH0KKwordm9pZCBTdGFja1RyYWNlR2VuZXJhdG9yOjpzZXRfanNfY29udGV4dChKU0NvbnRleHQqIGpzX2N0eCkgeworICBqc19jb250ZXh0XyA9IGpzX2N0eDsKK30KKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBtb3pqcworfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIE5CX1NDUklQVF9TVEFDS1RSQUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL3N0YWNrX3RyYWNlX2hlbHBlcnMuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3V0aWwvc3RhY2tfdHJhY2VfaGVscGVycy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiNTkwZTcKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy91dGlsL3N0YWNrX3RyYWNlX2hlbHBlcnMuaApAQCAtMCwwICsxLDEwNiBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX1VUSUxfU1RBQ0tfVFJBQ0VfSEVMUEVSU19IXworI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1VUSUxfU1RBQ0tfVFJBQ0VfSEVMUEVSU19IXworCisjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc3RhY2tfZnJhbWUuaCIKKworc3RydWN0IEpTQ29udGV4dDsKKworI2lmIGRlZmluZWQoU1RBUkJPQVJEX0FMTE9XU19NRU1PUllfVFJBQ0tJTkcpCisjZGVmaW5lIEVOQUJMRV9KU19TVEFDS19UUkFDRV9JTl9TQ09QRShKU19DVFgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIDo6Y29iYWx0OjpzY3JpcHQ6Om1vempzOjp1dGlsOjpTdGFja1RyYWNlU2NvcGUgc3RhY2tfdHJhY2Vfc2NvcGVfb2JqZWN0KCBcCisgICAgICBKU19DVFgpCisjZWxzZQorI2RlZmluZSBFTkFCTEVfSlNfU1RBQ0tfVFJBQ0VfSU5fU0NPUEUoSlNfQ1RYKQorI2VuZGlmCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNjcmlwdCB7CituYW1lc3BhY2UgbW96anMgeworbmFtZXNwYWNlIHV0aWwgeworCisvLyBVc2FnZToKKy8vICAgdm9pZCBGdW5jdGlvbihKU0NvbnRleHQqIGpzX2N0eCwgLi4uKSB7CisvLyAgICAgRU5BQkxFX0pTX1NUQUNLX1RSQUNFX0lOX1NDT1BFKGpzX2N0eCk7CisvLyAgICAgLi4uCisvLyAgICAgSW52b2tlT3RoZXJGdW5jdGlvbnMoKTsKKy8vICAgfQorLy8KKy8vICB2b2lkIEludm9rZU90aGVyRnVuY3Rpb25zKCkgeworLy8gICAgLi4uCisvLyAgICBzdGQ6OnN0cmluZyBzdGFja190cmFjZV9zdHI7CisvLyAgICBpZiAoR2V0VGhyZWFkTG9jYWxTdGFja1RyYWNlR2VuZXJhdG9yKCktPkdlbmVyYXRlU3RhY2tUcmFjZVN0cmluZygKKy8vICAgICAgICAgIDIsICZzdGFja190cmFjZV9zdHIpKSB7CisvLyAgICAgIC8vIFByaW50cyB0aGUgc3RhY2sgdHJhY2UgZnJvbSBqYXZhc2NyaXB0LgorLy8gICAgICBTYkxvZ1JhdyhzdGFja190cmFjZV9zdHIuY19zdHIoKSk7CisvLyAgICB9CisvLyAgfQorY2xhc3MgU3RhY2tUcmFjZUdlbmVyYXRvciB7CisgcHVibGljOgorICBTdGFja1RyYWNlR2VuZXJhdG9yKCk7CisgIHZpcnR1YWwgflN0YWNrVHJhY2VHZW5lcmF0b3IoKTsKKworICAvLyBSZXR1cm5zIHx0cnVlfCBpZiB0aGUgY3VycmVudCBTdGFja1RyYWNlR2VuZXJhdG9yIGNhbiBnZW5lcmF0ZSBpbmZvcm1hdGlvbgorICAvLyBhYm91dCB0aGUgc3RhY2suCisgIGJvb2wgVmFsaWQoKTsKKworICAvLyBHZW5lcmF0ZXMgc3RhY2sgdHJhY2VzIGluIHRoZSByYXcgZm9ybS4KKyAgc2l6ZV90IEdlbmVyYXRlU3RhY2tUcmFjZShpbnQgZGVwdGgsIHN0ZDo6dmVjdG9yPFN0YWNrRnJhbWU+KiBvdXQpOworCisgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBzdGFjayB0cmFjZXMgd3JpdHRlbi4gVGhlIG91dHB1dCB2ZWN0b3Igd2lsbCBiZQorICAvLyBleHBhbmRlZCBpZiBuZWNlc3NhcnkuCisgIC8vIFRoZSBmaXJzdCBwb3NpdGlvbiBpcyB0aGUgbW9zdCBpbW1lZGlhdGUgc3RhY2sgZnJhbWUuCisgIHNpemVfdCBHZW5lcmF0ZVN0YWNrVHJhY2VMaW5lcyhpbnQgZGVwdGgsIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiogb3V0KTsKKworICAvLyBQcmV0dHkgcHJpbnRlZCBzdGFjayB0cmFjZSBzdHJpbmcuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorICBib29sIEdlbmVyYXRlU3RhY2tUcmFjZVN0cmluZyhpbnQgZGVwdGgsIHN0ZDo6c3RyaW5nKiBvdXQpOworCisgIC8vIEdldHMgdGhlIGludGVybmFsIGRhdGEgc3RydWN0dXJlIHVzZWQgdG8gZ2VuZXJhdGUgc3RhY2sgdHJhY2VzLgorICBKU0NvbnRleHQqIGpzX2NvbnRleHQoKTsKKworICAvLyBJbnRlcm5hbCBvbmx5LCBkbyBub3Qgc2V0LgorICB2b2lkIHNldF9qc19jb250ZXh0KEpTQ29udGV4dCoganNfY3R4KTsKKworIHByaXZhdGU6CisgIEpTQ29udGV4dCoganNfY29udGV4dF87Cit9OworCisvLyBHZXQncyB0aGUgdGhyZWFkIGxvY2FsIFN0YWNrVHJhY2VHZW5lcmF0b3IuCitTdGFja1RyYWNlR2VuZXJhdG9yKiBHZXRUaHJlYWRMb2NhbFN0YWNrVHJhY2VHZW5lcmF0b3IoKTsKKworLy8gVGhpcyBzaG91bGQgb25seSBiZSBhY2Nlc3NlZCBieSBhIHNjb3BlZCBvYmplY3QuCit2b2lkIFNldFRocmVhZExvY2FsSlNDb250ZXh0KEpTQ29udGV4dCogY29udGV4dCk7CitKU0NvbnRleHQqIEdldFRocmVhZExvY2FsSlNDb250ZXh0KCk7CisKKy8vIFVzZWZ1bCBmb3IgdXBkYXRpbmcgdGhlIG1vc3QgcmVjZW50IHN0YWNrIHRyYWNlLgorc3RydWN0IFN0YWNrVHJhY2VTY29wZSB7CisgIGV4cGxpY2l0IFN0YWNrVHJhY2VTY29wZShKU0NvbnRleHQqIGpzKQorICAgICAgOiBwcmV2X2NvbnRleHRfKEdldFRocmVhZExvY2FsSlNDb250ZXh0KCkpIHsKKyAgICBTZXRUaHJlYWRMb2NhbEpTQ29udGV4dChqcyk7CisgIH0KKyAgflN0YWNrVHJhY2VTY29wZSgpIHsgU2V0VGhyZWFkTG9jYWxKU0NvbnRleHQocHJldl9jb250ZXh0Xyk7IH0KKyAgSlNDb250ZXh0KiBwcmV2X2NvbnRleHRfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIHV0aWwKK30gIC8vIG5hbWVzcGFjZSBtb3pqcworfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9TQ1JJUFRfTU9aSlNfVVRJTF9TVEFDS19UUkFDRV9IRUxQRVJTX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0LmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd2Vha19oZWFwX29iamVjdC5jYwppbmRleCAxZmI1YzhkLi43MmQwYjY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0LmNjCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dlYWtfaGVhcF9vYmplY3QuY2MKQEAgLTEsNDggKzEsNzIgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0LmgiCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L21vempzL21vempzX2dsb2JhbF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgInRoaXJkX3BhcnR5L21vempzL2pzL3NyYy9nYy9NYXJraW5nLmgiCisjaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNjcmlwdCB7CiBuYW1lc3BhY2UgbW96anMgewogCi1XZWFrSGVhcE9iamVjdDo6V2Vha0hlYXBPYmplY3QoSlNDb250ZXh0KiBjb250ZXh0LCBKUzo6SGFuZGxlT2JqZWN0IGhhbmRsZSkgeworV2Vha0hlYXBPYmplY3Q6OldlYWtIZWFwT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZVZhbHVlIHZhbHVlKQorICAgIDogd2FzX2NvbGxlY3RlZF8oZmFsc2UpIHsKICAgTW96anNHbG9iYWxFbnZpcm9ubWVudCogZ2xvYmFsX2Vudmlyb25tZW50ID0KICAgICAgIE1vempzR2xvYmFsRW52aXJvbm1lbnQ6OkdldEZyb21Db250ZXh0KGNvbnRleHQpOwotICBJbml0aWFsaXplKGdsb2JhbF9lbnZpcm9ubWVudC0+d2Vha19vYmplY3RfbWFuYWdlcigpLCBoYW5kbGUpOworICBJbml0aWFsaXplKGdsb2JhbF9lbnZpcm9ubWVudC0+d2Vha19vYmplY3RfbWFuYWdlcigpLCB2YWx1ZSk7CiB9CiAKLVdlYWtIZWFwT2JqZWN0OjpXZWFrSGVhcE9iamVjdChjb25zdCBXZWFrSGVhcE9iamVjdCYgb3RoZXIpIHsKLSAgSW5pdGlhbGl6ZShvdGhlci53ZWFrX29iamVjdF9tYW5hZ2VyXywgb3RoZXIuaGVhcF8pOworV2Vha0hlYXBPYmplY3Q6OldlYWtIZWFwT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QpCisgICAgOiB3YXNfY29sbGVjdGVkXyhmYWxzZSkgeworICBNb3pqc0dsb2JhbEVudmlyb25tZW50KiBnbG9iYWxfZW52aXJvbm1lbnQgPQorICAgICAgTW96anNHbG9iYWxFbnZpcm9ubWVudDo6R2V0RnJvbUNvbnRleHQoY29udGV4dCk7CisgIEluaXRpYWxpemUoZ2xvYmFsX2Vudmlyb25tZW50LT53ZWFrX29iamVjdF9tYW5hZ2VyKCksCisgICAgICAgICAgICAgT0JKRUNUX1RPX0pTVkFMKG9iamVjdCkpOworfQorCitXZWFrSGVhcE9iamVjdDo6V2Vha0hlYXBPYmplY3QoY29uc3QgV2Vha0hlYXBPYmplY3QmIG90aGVyKQorICAgIDogd2FzX2NvbGxlY3RlZF8ob3RoZXIud2FzX2NvbGxlY3RlZF8pIHsKKyAgSW5pdGlhbGl6ZShvdGhlci53ZWFrX29iamVjdF9tYW5hZ2VyXywgb3RoZXIudmFsdWVfKTsKIH0KIAogV2Vha0hlYXBPYmplY3QmIFdlYWtIZWFwT2JqZWN0OjpvcGVyYXRvcj0oY29uc3QgV2Vha0hlYXBPYmplY3QmIHJocykgewotICBJbml0aWFsaXplKHJocy53ZWFrX29iamVjdF9tYW5hZ2VyXywgcmhzLmhlYXBfKTsKKyAgd2FzX2NvbGxlY3RlZF8gPSByaHMud2FzX2NvbGxlY3RlZF87CisgIEluaXRpYWxpemUocmhzLndlYWtfb2JqZWN0X21hbmFnZXJfLCByaHMudmFsdWVfKTsKICAgcmV0dXJuICp0aGlzOwogfQogCiB2b2lkIFdlYWtIZWFwT2JqZWN0OjpUcmFjZShKU1RyYWNlciogdHJhY2UpIHsKLSAgaWYgKGhlYXBfKSB7Ci0gICAgSlNfQ2FsbEhlYXBPYmplY3RUcmFjZXIodHJhY2UsICZoZWFwXywgIldlYWtIZWFwT2JqZWN0OjpUcmFjZSIpOworICBpZiAoIXZhbHVlXy5pc051bGxPclVuZGVmaW5lZCgpKSB7CisgICAgSlNfQ2FsbEhlYXBWYWx1ZVRyYWNlcih0cmFjZSwgJnZhbHVlXywgIldlYWtIZWFwT2JqZWN0OjpUcmFjZSIpOwogICB9CiB9CiAKK2Jvb2wgV2Vha0hlYXBPYmplY3Q6OklzT2JqZWN0KCkgY29uc3QgeworICByZXR1cm4gdmFsdWVfLmlzT2JqZWN0KCk7Cit9CisKK2Jvb2wgV2Vha0hlYXBPYmplY3Q6OklzR2NUaGluZygpIGNvbnN0IHsKKyAgLy8gV2UgaGF2ZSB0byBjaGVjayBJc051bGwoKSwgYmVjYXVzZSBudWxsIGlzIGFwcGFyZW50bHkgYSBHQyBUaGluZy4KKyAgcmV0dXJuICghSXNOdWxsKCkgJiYgdmFsdWVfLmlzR0NUaGluZygpKTsKK30KKworYm9vbCBXZWFrSGVhcE9iamVjdDo6V2FzQ29sbGVjdGVkKCkgY29uc3QgeworICByZXR1cm4gd2FzX2NvbGxlY3RlZF87Cit9CisKIFdlYWtIZWFwT2JqZWN0Ojp+V2Vha0hlYXBPYmplY3QoKSB7CiAgIC8vIEl0J3Mgc2FmZSB0byBjYWxsIFN0b3BUcmFja2luZyBldmVuIGlmIFN0YXJ0VHJhY2tpbmcgd2Fzbid0IGNhbGxlZC4gdGhlCiAgIC8vIFdlYWtPYmplY3RNYW5hZ2VyIGhhbmRsZXMgdGhlIGNhc2Ugd2hlcmUgaXQncyBub3QgY3VycmVudGx5IHRyYWNraW5nIHRoZQpAQCAtNTEsMTUgKzc1LDI4IEBACiB9CiAKIHZvaWQgV2Vha0hlYXBPYmplY3Q6OkluaXRpYWxpemUoV2Vha0hlYXBPYmplY3RNYW5hZ2VyKiB3ZWFrX2hlYXBfb2JqZWN0X21hbmFnZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpTT2JqZWN0KiBvYmplY3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSlM6OlZhbHVlJiB2YWx1ZSkgewogICB3ZWFrX29iamVjdF9tYW5hZ2VyXyA9IHdlYWtfaGVhcF9vYmplY3RfbWFuYWdlcjsKLSAgaGVhcF8gPSBvYmplY3Q7Ci0gIC8vIERvbid0IGJvdGhlciByZWdpc3RlcmluZyBpZiB0aGUgcG9pbnRlciBpcyBhbHJlYWR5IE5VTEwuCi0gIGlmIChoZWFwXykgeworICB2YWx1ZV8gPSB2YWx1ZTsKKworICAvLyBEb24ndCBib3RoZXIgcmVnaXN0ZXJpbmcgaWYgbm90IGEgR0MgdGhpbmcuCisgIGlmIChJc0djVGhpbmcoKSkgewogICAgIHdlYWtfb2JqZWN0X21hbmFnZXJfLT5TdGFydFRyYWNraW5nKHRoaXMpOwogICB9CiB9CiAKK2Jvb2wgV2Vha0hlYXBPYmplY3Q6OklzTnVsbCgpIGNvbnN0IHsKKyAgcmV0dXJuIHZhbHVlXy5pc051bGxPclVuZGVmaW5lZCgpOworfQorCit2b2lkIFdlYWtIZWFwT2JqZWN0OjpVcGRhdGVXZWFrUG9pbnRlckFmdGVyR2MoKSB7CisgIGlmIChqczo6Z2M6OklzVmFsdWVBYm91dFRvQmVGaW5hbGl6ZWQodmFsdWVfLnVuc2FmZUdldCgpKSkgeworICAgIERDSEVDSyhJc0djVGhpbmcoKSk7CisgICAgd2FzX2NvbGxlY3RlZF8gPSB0cnVlOworICAgIHZhbHVlXy5zZXROdWxsKCk7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIG1vempzCiB9ICAvLyBuYW1lc3BhY2Ugc2NyaXB0CiB9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0LmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0LmgKaW5kZXggNGE5YTViNi4uMjY1YWZiMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd2Vha19oZWFwX29iamVjdC5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dlYWtfaGVhcF9vYmplY3QuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfV0VBS19IRUFQX09CSkVDVF9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1dFQUtfSEVBUF9PQkpFQ1RfSF8KIApAQCAtMjMsMjYgKzIxLDQyIEBACiBuYW1lc3BhY2Ugc2NyaXB0IHsKIG5hbWVzcGFjZSBtb3pqcyB7CiAKLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhIHdlYWsgcmVmZXJlbmNlIHRvIGEgSlNPYmplY3QuIFRoZSBKU09iamVjdCB0aGF0IGFuCisvLyBUaGlzIGNsYXNzIGltcGxlbWVudHMgYSB3ZWFrIHJlZmVyZW5jZSB0byBhIEpTOjpWYWx1ZS4gVGhlIEpTOjpWYWx1ZSB0aGF0IGFuCiAvLyBpbnN0YW5jZSBvZiB0aGlzIGNsYXNzIGlzIGNyZWF0ZWQgd2l0aCBtYXkgZ2V0IGdhcmJhZ2UgY29sbGVjdGVkLiBJbiB0aGF0CiAvLyBjYXNlLCBzdWJzZXF1ZW50IGNhbGxzIHRvIFdlYWtIZWFwT2JqZWN0OjpHZXQoKSB3aWxsIHJldHVybiBhIE5VTEwgcG9pbnRlci4KIGNsYXNzIFdlYWtIZWFwT2JqZWN0IHsKICBwdWJsaWM6Ci0gIFdlYWtIZWFwT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBoYW5kbGUpOworICBXZWFrSGVhcE9iamVjdChKU0NvbnRleHQqIGNvbnRleHQsIEpTOjpIYW5kbGVWYWx1ZSB2YWx1ZSk7CisgIFdlYWtIZWFwT2JqZWN0KEpTQ29udGV4dCogY29udGV4dCwgSlM6OkhhbmRsZU9iamVjdCBvYmplY3QpOwogICBXZWFrSGVhcE9iamVjdChjb25zdCBXZWFrSGVhcE9iamVjdCYgb3RoZXIpOwogCiAgIFdlYWtIZWFwT2JqZWN0JiBvcGVyYXRvcj0oY29uc3QgV2Vha0hlYXBPYmplY3QmIHJocyk7Ci0gIEpTT2JqZWN0KiBHZXQoKSBjb25zdCB7IHJldHVybiBoZWFwXzsgfQorICBjb25zdCBKUzo6VmFsdWUmIEdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWVfLmdldCgpOyB9CisgIEpTT2JqZWN0KiBHZXRPYmplY3QoKSBjb25zdCB7CisgICAgcmV0dXJuIHZhbHVlXy50b09iamVjdE9yTnVsbCgpOworICB9CisKICAgdm9pZCBUcmFjZShKU1RyYWNlciogdHJhY2UpOworICBib29sIElzT2JqZWN0KCkgY29uc3Q7CisKKyAgLy8gV2hldGhlciB0aGUgdmFsdWUgaXMgYSBHQyBUaGluZyBhbmQgbm90IG51bGwgb3IgdW5kZWZpbmVkLgorICBib29sIElzR2NUaGluZygpIGNvbnN0OworCisgIC8vIFdoZXRoZXIgdGhlIHZhbHVlIHdhcyBhIEdDIFRoaW5nIGFuZCBoYXMgYmVlbiBhY3R1YWxseSBHQydkLgorICBib29sIFdhc0NvbGxlY3RlZCgpIGNvbnN0OwogCiAgIH5XZWFrSGVhcE9iamVjdCgpOwogCiAgcHJpdmF0ZToKICAgdm9pZCBJbml0aWFsaXplKFdlYWtIZWFwT2JqZWN0TWFuYWdlciogd2Vha19oZWFwX29iamVjdF9tYW5hZ2VyLAotICAgICAgICAgICAgICAgICAgSlNPYmplY3QqIG9iamVjdCk7CisgICAgICAgICAgICAgICAgICBjb25zdCBKUzo6VmFsdWUmIHZhbHVlKTsKKworICBib29sIElzTnVsbCgpIGNvbnN0OworICB2b2lkIFVwZGF0ZVdlYWtQb2ludGVyQWZ0ZXJHYygpOwogCiAgIFdlYWtIZWFwT2JqZWN0TWFuYWdlciogd2Vha19vYmplY3RfbWFuYWdlcl87Ci0gIEpTOjpIZWFwPEpTT2JqZWN0Kj4gaGVhcF87CisgIEpTOjpIZWFwPEpTOjpWYWx1ZT4gdmFsdWVfOworICBib29sIHdhc19jb2xsZWN0ZWRfOwogCiAgIGZyaWVuZCBjbGFzcyBXZWFrSGVhcE9iamVjdE1hbmFnZXI7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd2Vha19oZWFwX29iamVjdF9tYW5hZ2VyLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd2Vha19oZWFwX29iamVjdF9tYW5hZ2VyLmNjCmluZGV4IDM4MjdmOGMuLjRkZGQ4MDkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0X21hbmFnZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0X21hbmFnZXIuaCIKIApAQCAtMjAsOSArMTgsOCBAQAogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0LmgiCi0jaW5jbHVkZSAidGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzYXBpLmgiCi0KICNpbmNsdWRlICJuYi9tZW1vcnlfc2NvcGUuaCIKKyNpbmNsdWRlICJ0aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNhcGkuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CiBuYW1lc3BhY2Ugc2NyaXB0IHsKQEAgLTY0LDExICs2MSw4IEBACiB9CiAKIGJvb2wgV2Vha0hlYXBPYmplY3RNYW5hZ2VyOjpNYXliZVN3ZWVwKFdlYWtIZWFwT2JqZWN0KiB3ZWFrX29iamVjdCkgewotICBpZiAod2Vha19vYmplY3QtPmhlYXBfICYmCi0gICAgICBKU19Jc0Fib3V0VG9CZUZpbmFsaXplZCh3ZWFrX29iamVjdC0+aGVhcF8udW5zYWZlR2V0KCkpKSB7Ci0gICAgd2Vha19vYmplY3QtPmhlYXBfLnNldChOVUxMKTsKLSAgfQotICByZXR1cm4gd2Vha19vYmplY3QtPmhlYXBfID09IE5VTEw7CisgIHdlYWtfb2JqZWN0LT5VcGRhdGVXZWFrUG9pbnRlckFmdGVyR2MoKTsKKyAgcmV0dXJuIHdlYWtfb2JqZWN0LT5XYXNDb2xsZWN0ZWQoKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIG1vempzCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93ZWFrX2hlYXBfb2JqZWN0X21hbmFnZXIuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5oCmluZGV4IDY0ZTE1OGIuLjM0NDVhMjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dlYWtfaGVhcF9vYmplY3RfbWFuYWdlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9NT1pKU19XRUFLX0hFQVBfT0JKRUNUX01BTkFHRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9NT1pKU19XRUFLX0hFQVBfT0JKRUNUX01BTkFHRVJfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmNjCmluZGV4IGQ1MzM0NTguLjk2ODAwM2MgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfZmFjdG9yeS5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmgiCiAKICNpbmNsdWRlIDx1dGlsaXR5PgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9mYWN0b3J5LmggYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaAppbmRleCA3OWJlMWI3Li4zNTcxMzJkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX2ZhY3RvcnkuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfTU9aSlNfV1JBUFBFUl9GQUNUT1JZX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfTU9aSlNfV1JBUFBFUl9GQUNUT1JZX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5jYwppbmRleCAxYmYxNWNhLi4wMDk1MjY5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9tb3pqcy93cmFwcGVyX3ByaXZhdGUuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L21vempzL3dyYXBwZXJfcHJpdmF0ZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgKaW5kZXggYWUwMjg2ZC4uODVhMWVlNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvbW96anMvd3JhcHBlcl9wcml2YXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX01PWkpTX1dSQVBQRVJfUFJJVkFURV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX01PWkpTX1dSQVBQRVJfUFJJVkFURV9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmggYi9zcmMvY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgKaW5kZXggY2NkYzcwNS4uNTdjN2YwYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L29wYXF1ZV9oYW5kbGUuaApAQCAtMSwyMiArMSwyMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfT1BBUVVFX0hBTkRMRV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX09QQVFVRV9IQU5ETEVfSF8KIAotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNjcmlwdCB7CkBAIC0zMCw3ICsyOCw3IEBACiAgIHZpcnR1YWwgfk9wYXF1ZUhhbmRsZSgpIHt9CiB9OwogCi10eXBlZGVmIFNjcmlwdE9iamVjdDxPcGFxdWVIYW5kbGU+IE9wYXF1ZUhhbmRsZUhvbGRlcjsKK3R5cGVkZWYgU2NyaXB0VmFsdWU8T3BhcXVlSGFuZGxlPiBPcGFxdWVIYW5kbGVIb2xkZXI7CiAKIH0gIC8vIG5hbWVzcGFjZSBzY3JpcHQKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L3Byb3BlcnR5X2VudW1lcmF0b3IuaAppbmRleCAzZWU1YjY1Li4zYmRmOGNiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9wcm9wZXJ0eV9lbnVtZXJhdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvcHJvcGVydHlfZW51bWVyYXRvci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9QUk9QRVJUWV9FTlVNRVJBVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfUFJPUEVSVFlfRU5VTUVSQVRPUl9IXwogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zY29wZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2NvcGUuaAppbmRleCAwZDgyMGRiLi42MmRlNzEyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zY29wZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3Njb3BlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX1NDT1BFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfU0NPUEVfSF8KIApAQCAtMjIsNyArMjAsNiBAQAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJiYXNlL29wdGlvbmFsLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9vcGFxdWVfaGFuZGxlLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCiAKIG5hbWVzcGFjZSBjb2JhbHQgewogbmFtZXNwYWNlIHNjcmlwdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfZGVidWdnZXIuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9kZWJ1Z2dlci5oCmluZGV4IDhkNDNkMWUuLjE3Y2ZiNWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9kZWJ1Z2dlci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9kZWJ1Z2dlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1NDUklQVF9TQ1JJUFRfREVCVUdHRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9TQ1JJUFRfREVCVUdHRVJfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X2V4Y2VwdGlvbi5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X2V4Y2VwdGlvbi5oCmluZGV4IDA2M2Q0NzguLmYyNmVjYjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9leGNlcHRpb24uaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfZXhjZXB0aW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX1NDUklQVF9FWENFUFRJT05fSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9TQ1JJUFRfRVhDRVBUSU9OX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaCBiL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9vYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjQxZmFmYy4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDkgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotI2lmbmRlZiBDT0JBTFRfU0NSSVBUX1NDUklQVF9PQkpFQ1RfSF8KLSNkZWZpbmUgQ09CQUxUX1NDUklQVF9TQ1JJUFRfT0JKRUNUX0hfCi0KLSNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKLSNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKLSNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCi0KLW5hbWVzcGFjZSBjb2JhbHQgewotbmFtZXNwYWNlIHNjcmlwdCB7Ci0KLWNsYXNzIFdyYXBwYWJsZTsKLQotLy8gU2NyaXB0T2JqZWN0IGlzIGEgd3JhcHBlciBhcm91bmQgSmF2YVNjcmlwdCBvYmplY3RzIHRoYXQgYXJlIGJlaW5nIHBhc3NlZAotLy8gaW50byBDb2JhbHQuIFRoZXNlIGFyZSBvYmplY3RzIHRoYXQgZG8gbm90IGNvcnJlc3BvbmQgdG8gY29iYWx0IFdyYXBwYWJsZQotLy8gb2JqZWN0cy4gU3BlY2lmaWNhbGx5LCB0aGlzIGNvdWxkIGluY2x1ZGUgb2JqZWN0cyB0aGF0IGltcGxlbWVudCB0aGUKLS8vIEV2ZW50TGlzdGVuZXIgaW50ZXJmYWNlLCBhbmQgY2FsbGJhY2sgZnVuY3Rpb25zLgotLy8gQXMgbG9uZyBhcyBDb2JhbHQgbWFpbnRhaW5zIGEgaGFuZGxlIHRvIHN1Y2ggYW4gb2JqZWN0LCBpdCBzaG91bGQgbm90IGJlCi0vLyBnYXJiYWdlIGNvbGxlY3RlZC4gV2ViIEFQSSBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIGhvbGQgb24gdG8gYSByZWZlcmVuY2UgdG8KLS8vIGEgU2NyaXB0T2JqZWN0IGltcGxlbWVudGF0aW9uIGJ5IGNvbnN0cnVjdGluZyBhIFNjcmlwdE9iamVjdDo6UmVmZXJlbmNlCi0vLyBvYmplY3QuCi0vLyBUaGUgUmVmZXJlbmNlIGNsYXNzIHRha2VzIGFzIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyIGEgcG9pbnRlciB0byB0aGUKLS8vIFdyYXBwYWJsZSB0aGF0IGlzIGhvbGRpbmcgb250byB0aGUgU2NyaXB0T2JqZWN0LiBUaGlzIGVuc3VyZXMgdGhhdCB0aGUKLS8vIEphdmFTY3JpcHQgZW5naW5lJ3MgZ2FyYmFnZSBjb2xsZWN0aW9uIGlzIGF3YXJlIG9mIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbgotLy8gdGhlIFNjcmlwdE9iamVjdCBhbmQgdGhlIFdyYXBwYWJsZSdzIGNvcnJlc3BvbmRpbmcgSmF2YVNjcmlwdCB3cmFwcGVyLiBUaGlzCi0vLyB3aWxsIGVuc3VyZSB0aGF0IHRoZSBnYXJiYWdlIGNvbGxlY3RvciBjYW4gZGV0ZWN0IHdoZW4gdGhlc2Ugb2JqZWN0cyBhcmUKLS8vIGRldGFjaGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGdyYXBoIG9mIEphdmFTY3JpcHQgb2JqZWN0cywgYW5kIGNhbiBzYWZlbHkKLS8vIGJlIGdhcmJhZ2UgY29sbGVjdGVkLgotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1jbGFzcyBTY3JpcHRPYmplY3QgewotIHB1YmxpYzoKLSAgLy8gVGhlIFJlZmVyZW5jZSBjbGFzcyBtYWludGFpbnMgdGhlIG93bmVyc2hpcCByZWxhdGlvbnNoaXAgYmV0d2VlbiBhCi0gIC8vIFdyYXBwYWJsZSBhbmQgdGhlIEphdmFTY3JpcHQgb2JqZWN0IHdyYXBwZWQgYnkgYSBTY3JpcHRPYmplY3QuIFRoaXMgaXMgYW4KLSAgLy8gUkFJSSBvYmplY3QgaW4gdGhhdCBjcmVhdGlvbiBvZiBhIFJlZmVyZW5jZSBpbnN0YW5jZSB3aWxsIG1hcmsgdGhlCi0gIC8vIHVuZGVybHlpbmcgb2JqZWN0IGFzIG93bmVkIGJ5IHRoaXMgd3JhcHBhYmxlLCBhbmQgdGhlIHVuZGVybHlpbmcgb2JqZWN0Ci0gIC8vIHdpbGwgYmUgdW5tYXJrZWQgd2hlbiB0aGlzIFJlZmVyZW5jZSBpcyBkZXN0cnVjdGVkLgotICAvLyBUaGUgbGlmZXRpbWUgb2YgYSBSZWZlcmVuY2UgbXVzdCBiZSBhdCBsZWFzdCBhcyBsb25nIGFzIHRoZSBXcmFwcGFibGUgdGhhdAotICAvLyBoYXMgYmVlbiBwYXNzZWQgaW50byB0aGUgY29uc3RydWN0b3IuCi0gIGNsYXNzIFJlZmVyZW5jZSB7Ci0gICBwdWJsaWM6Ci0gICAgUmVmZXJlbmNlKFdyYXBwYWJsZSogd3JhcHBhYmxlLCBjb25zdCBTY3JpcHRPYmplY3QmIHNjcmlwdF9vYmplY3QpCi0gICAgICAgIDogb3duZXJfKHdyYXBwYWJsZSksIHJlZmVyZW5jZWRfb2JqZWN0XyhzY3JpcHRfb2JqZWN0Lk1ha2VDb3B5KCkpIHsKLSAgICAgIERDSEVDSyhyZWZlcmVuY2VkX29iamVjdF8pOwotICAgICAgcmVmZXJlbmNlZF9vYmplY3RfLT5SZWdpc3Rlck93bmVyKG93bmVyXyk7Ci0gICAgfQotCi0gICAgY29uc3QgVCYgdmFsdWUoKSBjb25zdCB7IHJldHVybiAqKHJlZmVyZW5jZWRfb2JqZWN0Xy0+R2V0U2NyaXB0T2JqZWN0KCkpOyB9Ci0KLSAgICAvLyBSZXR1cm4gdGhlIHJlZmVyZW5jZWQgU2NyaXB0T2JqZWN0LiBUaGlzIFNjcmlwdE9iamVjdCBjYW4KLSAgICAvLyBiZSBwYXNzZWQgYmFjayBpbnRvIHRoZSBKYXZhU2NyaXB0IGJpbmRpbmdzIGxheWVyIHdoZXJlIHRoZSByZWZlcmVuY2VkCi0gICAgLy8gSmF2YVNjcmlwdCBvYmplY3QgY2FuIGJlIGV4dHJhY3RlZCBmcm9tIHRoZSBTY3JpcHRPYmplY3QuCi0gICAgY29uc3QgU2NyaXB0T2JqZWN0PFQ+JiByZWZlcmVuY2VkX29iamVjdCgpIGNvbnN0IHsKLSAgICAgIHJldHVybiAqKHJlZmVyZW5jZWRfb2JqZWN0Xy5nZXQoKSk7Ci0gICAgfQotCi0gICAgflJlZmVyZW5jZSgpIHsgcmVmZXJlbmNlZF9vYmplY3RfLT5EZXJlZ2lzdGVyT3duZXIob3duZXJfKTsgfQotCi0gICBwcml2YXRlOgotICAgIFdyYXBwYWJsZSogY29uc3Qgb3duZXJfOwotICAgIHNjb3BlZF9wdHI8U2NyaXB0T2JqZWN0PiByZWZlcmVuY2VkX29iamVjdF87Ci0KLSAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVmZXJlbmNlKTsKLSAgfTsKLQotICAvLyBSZXR1cm4gdHJ1ZSBpZmYgfG90aGVyfCByZWZlcnMgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBKYXZhU2NyaXB0IG9iamVjdC4KLSAgdmlydHVhbCBib29sIEVxdWFsVG8oY29uc3QgU2NyaXB0T2JqZWN0JiBvdGhlcikgY29uc3QgPSAwOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGlzIFNjcmlwdE9iamVjdCBpcyByZWZlcnJpbmcgdG8gYSBOVUxMIEphdmFTY3JpcHQgb2JqZWN0LgotICBib29sIElzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIEdldFNjcmlwdE9iamVjdCgpID09IE5VTEw7IH0KLQotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB+U2NyaXB0T2JqZWN0KCkge30KLQotIHByaXZhdGU6Ci0gIC8vIE1hcmsvdW5tYXJrIHRoaXMgV3JhcHBhYmxlIGFzIG93bmluZyBhIGhhbmRsZSB0byB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0Ci0gIC8vIG9iamVjdC4KLSAgdmlydHVhbCB2b2lkIFJlZ2lzdGVyT3duZXIoV3JhcHBhYmxlKiBvd25lcikgPSAwOwotICB2aXJ0dWFsIHZvaWQgRGVyZWdpc3Rlck93bmVyKFdyYXBwYWJsZSogb3duZXIpID0gMDsKLQotICAvLyBSZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBvYmplY3QgdGhhdCB3cmFwcyB0aGUgdW5kZXJseWluZyBKYXZhU2NyaXB0IG9iamVjdC4KLSAgdmlydHVhbCBjb25zdCBUKiBHZXRTY3JpcHRPYmplY3QoKSBjb25zdCA9IDA7Ci0KLSAgLy8gTWFrZSBhIG5ldyBTY3JpcHRPYmplY3QgaW5zdGFuY2UgdGhhdCBob2xkcyBhIGhhbmRsZSB0byB0aGUgc2FtZSB1bmRlcmx5aW5nCi0gIC8vIEphdmFTY3JpcHQgb2JqZWN0LiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZvciBhIFNjcmlwdE9iamVjdCB0aGF0IGhhcyBhCi0gIC8vIE5VTEwgc2NyaXB0IG9iamVjdCAodGhhdCBpcywgR2V0U2NyaXB0T2JqZWN0KCkgcmV0dXJucyBOVUxMKS4KLSAgdmlydHVhbCBzY29wZWRfcHRyPFNjcmlwdE9iamVjdD4gTWFrZUNvcHkoKSBjb25zdCA9IDA7Ci0KLSAgZnJpZW5kIGNsYXNzIHNjb3BlZF9wdHI8U2NyaXB0T2JqZWN0PjsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBzY3JpcHQKLX0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKLQotI2VuZGlmICAvLyBDT0JBTFRfU0NSSVBUX1NDUklQVF9PQkpFQ1RfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuY2MgYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfcnVubmVyLmNjCmluZGV4IDM5MDA4ODUuLmNjOThmM2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X3J1bm5lci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X3J1bm5lci5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X3J1bm5lci5oCmluZGV4IDQyMDUyYWMuLmEwNDBlM2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF9ydW5uZXIuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9zY3JpcHRfcnVubmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX1NDUklQVF9SVU5ORVJfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9TQ1JJUFRfUlVOTkVSX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmZjMWVjYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3NjcmlwdF92YWx1ZS5oCkBAIC0wLDAgKzEsMTE3IEBACisvKgorICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIENPQkFMVF9TQ1JJUFRfU0NSSVBUX1ZBTFVFX0hfCisjZGVmaW5lIENPQkFMVF9TQ1JJUFRfU0NSSVBUX1ZBTFVFX0hfCisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHNjcmlwdCB7CisKK2NsYXNzIFdyYXBwYWJsZTsKKworLy8gU2NyaXB0VmFsdWUgaXMgYSB3cmFwcGVyIGFyb3VuZCByYXcgSmF2YVNjcmlwdCB2YWx1ZXMgdGhhdCBhcmUgYmVpbmcgcGFzc2VkCisvLyBpbnRvIENvYmFsdC4gVGhlc2UgYXJlIHZhbHVlcyB0aGF0IGRvIG5vdCBjb3JyZXNwb25kIHRvIENvYmFsdCBXcmFwcGFibGUKKy8vIG9iamVjdHMuIFNwZWNpZmljYWxseSwgdGhpcyBjb3VsZCBpbmNsdWRlIG9iamVjdHMgdGhhdCBpbXBsZW1lbnQgdGhlCisvLyBFdmVudExpc3RlbmVyIGludGVyZmFjZSwgY2FsbGJhY2sgZnVuY3Rpb25zLCBwcm9taXNlcywgb3IgYW55IEphdmFzY3JpcHQKKy8vIHZhbHVlIGF0IGFsbC4gIEFzIGxvbmcgYXMgQ29iYWx0IG1haW50YWlucyBhIGhhbmRsZSB0byBzdWNoIGFuIHZhbHVlLCBpdAorLy8gc2hvdWxkIG5vdCBiZSBnYXJiYWdlIGNvbGxlY3RlZCwgaWYgaXQgaXMgYSBnYXJiYWdlLWNvbGxlY3RpYmxlIHRoaW5nIChHQworLy8gdGhpbmcpLiBXZWIgQVBJIGltcGxlbWVudGF0aW9ucyBzaG91bGQgaG9sZCBvbiB0byBhIHJlZmVyZW5jZSB0byBhCisvLyBTY3JpcHRWYWx1ZSBpbXBsZW1lbnRhdGlvbiBieSBjb25zdHJ1Y3RpbmcgYSBTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlIG9iamVjdC4KKy8vCisvLyBUaGUgUmVmZXJlbmNlIGNsYXNzIHRha2VzIGFzIGEgY29uc3RydWN0b3IgcGFyYW1ldGVyIGEgcG9pbnRlciB0byB0aGUKKy8vIFdyYXBwYWJsZSB0aGF0IGlzIGhvbGRpbmcgb250byB0aGUgU2NyaXB0VmFsdWUuIFRoaXMgZW5zdXJlcyB0aGF0IHRoZQorLy8gSmF2YVNjcmlwdCBlbmdpbmUncyBnYXJiYWdlIGNvbGxlY3Rpb24gaXMgYXdhcmUgb2YgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuCisvLyB0aGUgU2NyaXB0VmFsdWUgYW5kIHRoZSBXcmFwcGFibGUncyBjb3JyZXNwb25kaW5nIEphdmFTY3JpcHQgd3JhcHBlci4gVGhpcworLy8gd2lsbCBlbnN1cmUgdGhhdCB0aGUgZ2FyYmFnZSBjb2xsZWN0b3IgY2FuIGRldGVjdCB3aGVuIHRoZXNlIHZhbHVlcyBhcmUKKy8vIGRldGFjaGVkIGZyb20gdGhlIHJlc3Qgb2YgdGhlIGdyYXBoIG9mIEphdmFTY3JpcHQgR0MgdGhpbmdzLCBhbmQgY2FuIHNhZmVseQorLy8gYmUgZ2FyYmFnZSBjb2xsZWN0ZWQuCit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK2NsYXNzIFNjcmlwdFZhbHVlIHsKKyBwdWJsaWM6CisgIC8vIFRoZSBSZWZlcmVuY2UgY2xhc3MgbWFpbnRhaW5zIHRoZSBvd25lcnNoaXAgcmVsYXRpb25zaGlwIGJldHdlZW4gYQorICAvLyBXcmFwcGFibGUgYW5kIHRoZSBKYXZhU2NyaXB0IHZhbHVlIHdyYXBwZWQgYnkgYSBTY3JpcHRWYWx1ZS4gVGhpcyBpcyBhbgorICAvLyBSQUlJIG9iamVjdCBpbiB0aGF0IGNyZWF0aW9uIG9mIGEgUmVmZXJlbmNlIGluc3RhbmNlIHdpbGwgbWFyayB0aGUKKyAgLy8gdW5kZXJseWluZyB2YWx1ZSBhcyBvd25lZCBieSB0aGlzIHdyYXBwYWJsZSwgYW5kIHRoZSB1bmRlcmx5aW5nIG9iamVjdCB3aWxsCisgIC8vIGJlIHVubWFya2VkIHdoZW4gdGhpcyBSZWZlcmVuY2UgaXMgZGVzdHJ1Y3RlZC4gIFRoZSBsaWZldGltZSBvZiBhIFJlZmVyZW5jZQorICAvLyBtdXN0IGJlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIFdyYXBwYWJsZSB0aGF0IGhhcyBiZWVuIHBhc3NlZCBpbnRvIHRoZQorICAvLyBjb25zdHJ1Y3Rvci4KKyAgY2xhc3MgUmVmZXJlbmNlIHsKKyAgIHB1YmxpYzoKKyAgICBSZWZlcmVuY2UoV3JhcHBhYmxlKiB3cmFwcGFibGUsIGNvbnN0IFNjcmlwdFZhbHVlJiBzY3JpcHRfdmFsdWUpCisgICAgICAgIDogb3duZXJfKHdyYXBwYWJsZSksIHJlZmVyZW5jZWRfdmFsdWVfKHNjcmlwdF92YWx1ZS5NYWtlQ29weSgpKSB7CisgICAgICBEQ0hFQ0socmVmZXJlbmNlZF92YWx1ZV8pOworICAgICAgcmVmZXJlbmNlZF92YWx1ZV8tPlJlZ2lzdGVyT3duZXIob3duZXJfKTsKKyAgICB9CisKKyAgICBjb25zdCBUJiB2YWx1ZSgpIGNvbnN0IHsgcmV0dXJuICoocmVmZXJlbmNlZF92YWx1ZV8tPkdldFNjcmlwdFZhbHVlKCkpOyB9CisKKyAgICAvLyBSZXR1cm4gdGhlIHJlZmVyZW5jZWQgU2NyaXB0VmFsdWUuIFRoaXMgU2NyaXB0VmFsdWUgY2FuCisgICAgLy8gYmUgcGFzc2VkIGJhY2sgaW50byB0aGUgSmF2YVNjcmlwdCBiaW5kaW5ncyBsYXllciB3aGVyZSB0aGUgcmVmZXJlbmNlZAorICAgIC8vIEphdmFTY3JpcHQgb2JqZWN0IGNhbiBiZSBleHRyYWN0ZWQgZnJvbSB0aGUgU2NyaXB0VmFsdWUuCisgICAgY29uc3QgU2NyaXB0VmFsdWU8VD4mIHJlZmVyZW5jZWRfdmFsdWUoKSBjb25zdCB7CisgICAgICByZXR1cm4gKihyZWZlcmVuY2VkX3ZhbHVlXy5nZXQoKSk7CisgICAgfQorCisgICAgflJlZmVyZW5jZSgpIHsgcmVmZXJlbmNlZF92YWx1ZV8tPkRlcmVnaXN0ZXJPd25lcihvd25lcl8pOyB9CisKKyAgIHByaXZhdGU6CisgICAgV3JhcHBhYmxlKiBjb25zdCBvd25lcl87CisgICAgc2NvcGVkX3B0cjxTY3JpcHRWYWx1ZT4gcmVmZXJlbmNlZF92YWx1ZV87CisKKyAgICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oUmVmZXJlbmNlKTsKKyAgfTsKKworICAvLyBSZXR1cm4gdHJ1ZSBpZmYgfG90aGVyfCByZWZlcnMgdG8gdGhlIHNhbWUgdW5kZXJseWluZyBKYXZhU2NyaXB0IG9iamVjdC4KKyAgdmlydHVhbCBib29sIEVxdWFsVG8oY29uc3QgU2NyaXB0VmFsdWUmIG90aGVyKSBjb25zdCA9IDA7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgU2NyaXB0VmFsdWUgaXMgcmVmZXJyaW5nIHRvIGEgTlVMTCBKYXZhU2NyaXB0IG9iamVjdC4KKyAgYm9vbCBJc051bGwoKSBjb25zdCB7IHJldHVybiBHZXRTY3JpcHRWYWx1ZSgpID09IE5VTEw7IH0KKworICAvLyBDcmVhdGVzIGEgbmV3IFNjcmlwdFZhbHVlIHRoYXQgY29udGFpbnMgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgc2FtZQorICAvLyB1bmRlcmx5aW5nIEphdmFTY3JpcHQgb2JqZWN0LiBOb3RlIHRoYXQgdGhpcyB3aWxsIG5vdCBwcmV2ZW50IHRoZSBvYmplY3QKKyAgLy8gZnJvbSBiZWluZyBnYXJiYWdlIGNvbGxlY3RlZCwgb25lIG11c3QgY3JlYXRlIGEgUmVmZXJlbmNlIHRvIGRvIHRoYXQuCisgIHNjb3BlZF9wdHI8U2NyaXB0VmFsdWU+IE1ha2VXZWFrQ29weSgpIGNvbnN0IHsKKyAgICByZXR1cm4gTWFrZUNvcHkoKS5QYXNzKCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgdmlydHVhbCB+U2NyaXB0VmFsdWUoKSB7fQorCisgcHJpdmF0ZToKKyAgLy8gTWFyay91bm1hcmsgdGhpcyBXcmFwcGFibGUgYXMgb3duaW5nIGEgaGFuZGxlIHRvIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQKKyAgLy8gb2JqZWN0LgorICB2aXJ0dWFsIHZvaWQgUmVnaXN0ZXJPd25lcihXcmFwcGFibGUqIG93bmVyKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBEZXJlZ2lzdGVyT3duZXIoV3JhcHBhYmxlKiBvd25lcikgPSAwOworCisgIC8vIFJldHVybiBhIHBvaW50ZXIgdG8gdGhlIG9iamVjdCB0aGF0IHdyYXBzIHRoZSB1bmRlcmx5aW5nIEphdmFTY3JpcHQgb2JqZWN0LgorICB2aXJ0dWFsIGNvbnN0IFQqIEdldFNjcmlwdFZhbHVlKCkgY29uc3QgPSAwOworCisgIC8vIE1ha2UgYSBuZXcgU2NyaXB0VmFsdWUgaW5zdGFuY2UgdGhhdCBob2xkcyBhIGhhbmRsZSB0byB0aGUgc2FtZSB1bmRlcmx5aW5nCisgIC8vIEphdmFTY3JpcHQgb2JqZWN0LiBUaGlzIHNob3VsZCBub3QgYmUgY2FsbGVkIGZvciBhIFNjcmlwdFZhbHVlIHRoYXQgaGFzIGEKKyAgLy8gTlVMTCBzY3JpcHQgb2JqZWN0ICh0aGF0IGlzLCBHZXRTY3JpcHRWYWx1ZSgpIHJldHVybnMgTlVMTCkuCisgIHZpcnR1YWwgc2NvcGVkX3B0cjxTY3JpcHRWYWx1ZT4gTWFrZUNvcHkoKSBjb25zdCA9IDA7CisKKyAgZnJpZW5kIGNsYXNzIHNjb3BlZF9wdHI8U2NyaXB0VmFsdWU+OworfTsKKworfSAgLy8gbmFtZXNwYWNlIHNjcmlwdAorfSAgLy8gbmFtZXNwYWNlIGNvYmFsdAorCisjZW5kaWYgIC8vIENPQkFMVF9TQ1JJUFRfU0NSSVBUX1ZBTFVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc2VxdWVuY2UuaAppbmRleCA3MWZkNDZiLi5hN2I5NjhiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zZXF1ZW5jZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3NlcXVlbmNlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfU0VRVUVOQ0VfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9TRVFVRU5DRV9IXwpAQCAtMjMsNyArMjEsNiBAQAogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfdmVjdG9yLmgiCi0jaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zY3JpcHRfb2JqZWN0LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKIAogbmFtZXNwYWNlIGNvYmFsdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zb3VyY2VfY29kZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc291cmNlX2NvZGUuaAppbmRleCBlMjMyY2YzLi5iMzdkNmE0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zb3VyY2VfY29kZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3NvdXJjZV9jb2RlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2lmbmRlZiBDT0JBTFRfU0NSSVBUX1NPVVJDRV9DT0RFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfU09VUkNFX0NPREVfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvc291cmNlX3Byb3ZpZGVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9zb3VyY2VfcHJvdmlkZXIuaAppbmRleCBkNmI5ZGY3Li5kZTNhNDhhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zb3VyY2VfcHJvdmlkZXIuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC9zb3VyY2VfcHJvdmlkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfU09VUkNFX1BST1ZJREVSX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfU09VUkNFX1BST1ZJREVSX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3N0YWNrX2ZyYW1lLmNjIGIvc3JjL2NvYmFsdC9zY3JpcHQvc3RhY2tfZnJhbWUuY2MKaW5kZXggNmU2ZTE1ZC4uMjdmNzRlZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvc3RhY2tfZnJhbWUuY2MKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvc3RhY2tfZnJhbWUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9zdGFja19mcmFtZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zdGFja19mcmFtZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvc3RhY2tfZnJhbWUuaAppbmRleCA2M2RiNDE5Li5jMmExMmRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC9zdGFja19mcmFtZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3N0YWNrX2ZyYW1lLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfU1RBQ0tfRlJBTUVfSF8KICNkZWZpbmUgQ09CQUxUX1NDUklQVF9TVEFDS19GUkFNRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvc3RhbmRhbG9uZV9qYXZhc2NyaXB0X3J1bm5lci5jYyBiL3NyYy9jb2JhbHQvc2NyaXB0L3N0YW5kYWxvbmVfamF2YXNjcmlwdF9ydW5uZXIuY2MKaW5kZXggZDY3Yzg3Yi4uY2E1MjU0NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvc3RhbmRhbG9uZV9qYXZhc2NyaXB0X3J1bm5lci5jYworKysgYi9zcmMvY29iYWx0L3NjcmlwdC9zdGFuZGFsb25lX2phdmFzY3JpcHRfcnVubmVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc3RhbmRhbG9uZV9qYXZhc2NyaXB0X3J1bm5lci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC9zdGFuZGFsb25lX2phdmFzY3JpcHRfcnVubmVyLmggYi9zcmMvY29iYWx0L3NjcmlwdC9zdGFuZGFsb25lX2phdmFzY3JpcHRfcnVubmVyLmgKaW5kZXggZWMzNTgzMy4uODlhNjA5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvc3RhbmRhbG9uZV9qYXZhc2NyaXB0X3J1bm5lci5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3N0YW5kYWxvbmVfamF2YXNjcmlwdF9ydW5uZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfU1RBTkRBTE9ORV9KQVZBU0NSSVBUX1JVTk5FUl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX1NUQU5EQUxPTkVfSkFWQVNDUklQVF9SVU5ORVJfSF8KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvdGVzdGluZy9tb2NrX2V4Y2VwdGlvbl9zdGF0ZS5oIGIvc3JjL2NvYmFsdC9zY3JpcHQvdGVzdGluZy9tb2NrX2V4Y2VwdGlvbl9zdGF0ZS5oCmluZGV4IGM5OWM5NDYuLmZhZGU3NTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3Rlc3RpbmcvbW9ja19leGNlcHRpb25fc3RhdGUuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC90ZXN0aW5nL21vY2tfZXhjZXB0aW9uX3N0YXRlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfVEVTVElOR19NT0NLX0VYQ0VQVElPTl9TVEFURV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX1RFU1RJTkdfTU9DS19FWENFUFRJT05fU1RBVEVfSF8KQEAgLTMxLDEwICsyOSwxMCBAQAogICBNT0NLX01FVEhPRDEoU2V0RXhjZXB0aW9uLCB2b2lkKGNvbnN0IHNjb3BlZF9yZWZwdHI8U2NyaXB0RXhjZXB0aW9uPiYpKTsKICAgTU9DS19NRVRIT0QyKFNldFNpbXBsZUV4Y2VwdGlvblZBLCB2b2lkKE1lc3NhZ2VUeXBlLCB2YV9saXN0KSk7CiAKLSAgdm9pZCBTZXRTaW1wbGVFeGNlcHRpb24oTWVzc2FnZVR5cGUgbWVzc2FnZV90eXBlLCAuLi4pIHsKKyAgdm9pZCBTZXRTaW1wbGVFeGNlcHRpb24oTWVzc2FnZVR5cGVWYXIgbWVzc2FnZV90eXBlLCAuLi4pIHsKICAgICB2YV9saXN0IGFyZ3VtZW50czsKICAgICB2YV9zdGFydChhcmd1bWVudHMsIG1lc3NhZ2VfdHlwZSk7Ci0gICAgU2V0U2ltcGxlRXhjZXB0aW9uVkEobWVzc2FnZV90eXBlLCBhcmd1bWVudHMpOworICAgIFNldFNpbXBsZUV4Y2VwdGlvblZBKG1lc3NhZ2VfdHlwZS52YWx1ZSwgYXJndW1lbnRzKTsKICAgICB2YV9lbmQoYXJndW1lbnRzKTsKICAgfQogfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3Rlc3RpbmcvbW9ja19wcm9wZXJ0eV9lbnVtZXJhdG9yLmggYi9zcmMvY29iYWx0L3NjcmlwdC90ZXN0aW5nL21vY2tfcHJvcGVydHlfZW51bWVyYXRvci5oCmluZGV4IGM4MDFkN2UuLmZhN2EzM2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc2NyaXB0L3Rlc3RpbmcvbW9ja19wcm9wZXJ0eV9lbnVtZXJhdG9yLmgKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvdGVzdGluZy9tb2NrX3Byb3BlcnR5X2VudW1lcmF0b3IuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9URVNUSU5HX01PQ0tfUFJPUEVSVFlfRU5VTUVSQVRPUl9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX1RFU1RJTkdfTU9DS19QUk9QRVJUWV9FTlVNRVJBVE9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC91bmlvbl90eXBlLmggYi9zcmMvY29iYWx0L3NjcmlwdC91bmlvbl90eXBlLmgKaW5kZXggMjQ1MTM5ZS4uYjgzNzczZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvdW5pb25fdHlwZS5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3VuaW9uX3R5cGUuaApAQCAtMywyMSArMywxOSBAQAogLy8gRE8gTk9UIEVESVQgQlkgSEFORCEhIQogCiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfVU5JT05fVFlQRV9IXwogI2RlZmluZSBDT0JBTFRfU0NSSVBUX1VOSU9OX1RZUEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc2NyaXB0L3VuaW9uX3R5cGUuaC5wdW1wIGIvc3JjL2NvYmFsdC9zY3JpcHQvdW5pb25fdHlwZS5oLnB1bXAKaW5kZXggZjRmMDIwNC4uNTM1YTJkYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvdW5pb25fdHlwZS5oLnB1bXAKKysrIGIvc3JjL2NvYmFsdC9zY3JpcHQvdW5pb25fdHlwZS5oLnB1bXAKQEAgLTgsMjEgKzgsMTkgQEAKICQkIE1heGltdW0gbnVtYmVyIG9mIGRpZmZlcmVudCBtZW1iZXIgdHlwZXMgaW4gYSB1bmlvbi4KICR2YXIgTUFYX01FTUJFUlMgPSA0CiAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIFNDUklQVF9VTklPTl9UWVBFX0hfCiAjZGVmaW5lIFNDUklQVF9VTklPTl9UWVBFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NjcmlwdC91bmlvbl90eXBlX2ludGVybmFsLmggYi9zcmMvY29iYWx0L3NjcmlwdC91bmlvbl90eXBlX2ludGVybmFsLmgKaW5kZXggNDIzZWI3MC4uYzIyZTdlOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zY3JpcHQvdW5pb25fdHlwZV9pbnRlcm5hbC5oCisrKyBiL3NyYy9jb2JhbHQvc2NyaXB0L3VuaW9uX3R5cGVfaW50ZXJuYWwuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NDUklQVF9VTklPTl9UWVBFX0lOVEVSTkFMX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfVU5JT05fVFlQRV9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zY3JpcHQvd3JhcHBhYmxlLmggYi9zcmMvY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaAppbmRleCBlNDM5MjZjLi43ZDdmMzJmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaAorKysgYi9zcmMvY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAjaWZuZGVmIENPQkFMVF9TQ1JJUFRfV1JBUFBBQkxFX0hfCiAjZGVmaW5lIENPQkFMVF9TQ1JJUFRfV1JBUFBBQkxFX0hfCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uLmlkbCBiL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWJiMWEyNC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9TcGVlY2hSZWNvZ25pdGlvbi5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL2R2Y3MudzMub3JnL2hnL3NwZWVjaC1hcGkvcmF3LWZpbGUvOWEwMDc1ZDI1MzI2L3NwZWVjaGFwaS5odG1sI3NwZWVjaHJlY28tc2VjdGlvbgotCi1bCi0gIENvbnN0cnVjdG9yLAotICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCi1dCi1pbnRlcmZhY2UgU3BlZWNoUmVjb2duaXRpb24gOiBFdmVudFRhcmdldCB7Ci0gIC8vIHJlY29nbml0aW9uIHBhcmFtZXRlcnMKLSAgYXR0cmlidXRlIERPTVN0cmluZyBsYW5nOwotICBhdHRyaWJ1dGUgYm9vbGVhbiBjb250aW51b3VzOwotICBhdHRyaWJ1dGUgYm9vbGVhbiBpbnRlcmltUmVzdWx0czsKLSAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbWF4QWx0ZXJuYXRpdmVzOwotCi0gIC8vIG1ldGhvZHMgdG8gZHJpdmUgdGhlIHNwZWVjaCBpbnRlcmFjdGlvbgotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHN0YXJ0KCk7Ci0gIHZvaWQgc3RvcCgpOwotICB2b2lkIGFib3J0KCk7Ci0KLSAgLy8gZXZlbnQgbWV0aG9kcwotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uc291bmRzdGFydDsKLSAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbnNvdW5kZW5kOwotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ucmVzdWx0OwotICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ubm9tYXRjaDsKLSAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmVycm9yOwotfTsKLQotdHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlLmlkbCBiL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjZmOTU4Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy9zcGVlY2gtYXBpL3Jhdy1maWxlLzlhMDA3NWQyNTMyNi9zcGVlY2hhcGkuaHRtbCNzcGVlY2hyZWNvLXNlY3Rpb24KLQotaW50ZXJmYWNlIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUgewotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHRyYW5zY3JpcHQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBmbG9hdCBjb25maWRlbmNlOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uRXJyb3IuaWRsIGIvc3JjL2NvYmFsdC9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25FcnJvci5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhYmQ1MjguLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25FcnJvci5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwzMyArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL2R2Y3MudzMub3JnL2hnL3NwZWVjaC1hcGkvcmF3LWZpbGUvOWEwMDc1ZDI1MzI2L3NwZWVjaGFwaS5odG1sI3NwZWVjaHJlY28tc2VjdGlvbgotCi1lbnVtIEVycm9yQ29kZSB7Ci0gICJuby1zcGVlY2giLAotICAiYWJvcnRlZCIsCi0gICJhdWRpby1jYXB0dXJlIiwKLSAgIm5ldHdvcmsiLAotICAibm90LWFsbG93ZWQiLAotICAic2VydmljZS1ub3QtYWxsb3dlZCIsCi0gICJiYWQtZ3JhbW1hciIsCi0gICJsYW5ndWFnZS1ub3Qtc3VwcG9ydGVkIgotfTsKLQotaW50ZXJmYWNlIFNwZWVjaFJlY29nbml0aW9uRXJyb3IgOiBFdmVudCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBFcnJvckNvZGUgZXJyb3I7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbWVzc2FnZTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LmlkbCBiL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uRXZlbnQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyY2QyMTMzLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uRXZlbnQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjIgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy9zcGVlY2gtYXBpL3Jhdy1maWxlLzlhMDA3NWQyNTMyNi9zcGVlY2hhcGkuaHRtbCNzcGVlY2hyZWNvLXNlY3Rpb24KLQotaW50ZXJmYWNlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQgOiBFdmVudCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHJlc3VsdEluZGV4OwotICByZWFkb25seSBhdHRyaWJ1dGUgU3BlZWNoUmVjb2duaXRpb25SZXN1bHRMaXN0IHJlc3VsdHM7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuaWRsIGIvc3JjL2NvYmFsdC9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjFlOTdkLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uUmVzdWx0LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvc3BlZWNoLWFwaS9yYXctZmlsZS85YTAwNzVkMjUzMjYvc3BlZWNoYXBpLmh0bWwjc3BlZWNocmVjby1zZWN0aW9uCi0KLWludGVyZmFjZSBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCB7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGxlbmd0aDsKLSAgZ2V0dGVyIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUgaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKLSAgLy8gaXNGaW5hbCBpcyBkaWZmZXJlbnQgZnJvbSB0aGUgc3BlYy4sIGJ1dCBmb2xsb3dzIHdpdGggQ2hyb21pdW0uCi0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBib29sZWFuIGlzRmluYWw7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25SZXN1bHRMaXN0LmlkbCBiL3NyYy9jb2JhbHQvc3BlZWNoL1NwZWVjaFJlY29nbml0aW9uUmVzdWx0TGlzdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg5ZGJlZWQuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvU3BlZWNoUmVjb2duaXRpb25SZXN1bHRMaXN0LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvc3BlZWNoLWFwaS9yYXctZmlsZS85YTAwNzVkMjUzMjYvc3BlZWNoYXBpLmh0bWwjc3BlZWNocmVjby1zZWN0aW9uCi0KLWludGVyZmFjZSBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdExpc3QgewotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7Ci0gIGdldHRlciBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCBpdGVtKHVuc2lnbmVkIGxvbmcgaW5kZXgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2F1ZGlvX2VuY29kZXJfZmxhYy5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL2F1ZGlvX2VuY29kZXJfZmxhYy5jYwppbmRleCAxNmM1NjQwLi5mNGFlNWMwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9hdWRpb19lbmNvZGVyX2ZsYWMuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvYXVkaW9fZW5jb2Rlcl9mbGFjLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zcGVlY2gvYXVkaW9fZW5jb2Rlcl9mbGFjLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2F1ZGlvX2VuY29kZXJfZmxhYy5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvYXVkaW9fZW5jb2Rlcl9mbGFjLmgKaW5kZXggNjJmY2ZiMS4uMGU1NGI2YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvYXVkaW9fZW5jb2Rlcl9mbGFjLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvYXVkaW9fZW5jb2Rlcl9mbGFjLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfQVVESU9fRU5DT0RFUl9GTEFDX0hfCiAjZGVmaW5lIENPQkFMVF9TUEVFQ0hfQVVESU9fRU5DT0RFUl9GTEFDX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9lbmRwb2ludGVyX2RlbGVnYXRlLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvZW5kcG9pbnRlcl9kZWxlZ2F0ZS5jYwppbmRleCBmOGE4MjZmLi4xNTY5MzI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9lbmRwb2ludGVyX2RlbGVnYXRlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL2VuZHBvaW50ZXJfZGVsZWdhdGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9lbmRwb2ludGVyX2RlbGVnYXRlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL2VuZHBvaW50ZXJfZGVsZWdhdGUuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL2VuZHBvaW50ZXJfZGVsZWdhdGUuaAppbmRleCBkYjZhNTI4Li5jZWE2OTEzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9lbmRwb2ludGVyX2RlbGVnYXRlLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvZW5kcG9pbnRlcl9kZWxlZ2F0ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX0VORFBPSU5URVJfREVMRUdBVEVfSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9FTkRQT0lOVEVSX0RFTEVHQVRFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3RyZWFtaW5nX2FwaS5wYi5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjCmluZGV4IDFkMzNkODAuLjI0NWEwYzEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmNjCkBAIC0xLDE0ICsxLDE3IEBACiAvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQorLy8gc291cmNlOiBnb29nbGVfc3RyZWFtaW5nX2FwaS5wcm90bwogCiAjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCisjaW5jbHVkZSAiZ29vZ2xlX3N0cmVhbWluZ19hcGkucGIuaCIKIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAotI2luY2x1ZGUgImdvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmgiCi0KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC0yMSwxMiArMjQsMTggQEAKICAgZGVsZXRlIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmRlZmF1bHRfaW5zdGFuY2VfOwogfQogCisjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgordm9pZCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvX2ltcGwoKSB7CisgIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjsKKworI2Vsc2UKIHZvaWQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpIHsKICAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7CiAgIGlmIChhbHJlYWR5X2hlcmUpIHJldHVybjsKICAgYWxyZWFkeV9oZXJlID0gdHJ1ZTsKICAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OOwogCisjZW5kaWYKICAgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU3BlZWNoUmVjb2duaXRpb25FdmVudCgpOwogICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQoKTsKICAgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSgpOwpAQCAtMzYsMTYgKzQ1LDM4IEBACiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJnByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90byk7CiB9CiAKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCitHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG9fb25jZV8pOwordm9pZCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvX29uY2VfLAorICAgICAgICAgICAgICAgICAmcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90b19pbXBsKTsKK30KKyNlbHNlCiAvLyBGb3JjZSBBZGREZXNjcmlwdG9ycygpIHRvIGJlIGNhbGxlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZS4KIHN0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8gewogICBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKSB7CiAgICAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOwogICB9CiB9IHN0YXRpY19kZXNjcmlwdG9yX2luaXRpYWxpemVyX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvXzsKKyNlbmRpZgorCituYW1lc3BhY2UgeworCitzdGF0aWMgdm9pZCBNZXJnZUZyb21GYWlsKGludCBsaW5lKSBHT09HTEVfQVRUUklCVVRFX0NPTEQ7CitHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHN0YXRpYyB2b2lkIE1lcmdlRnJvbUZhaWwoaW50IGxpbmUpIHsKKyAgR09PR0xFX0NIRUNLKGZhbHNlKSA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgbGluZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCiAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitzdGF0aWMgOjpzdGQ6OnN0cmluZyogTXV0YWJsZVVua25vd25GaWVsZHNGb3JTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KAorICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnQqIHB0cikgeworICByZXR1cm4gcHRyLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Cit9CisKIGJvb2wgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX0lzVmFsaWQoaW50IHZhbHVlKSB7CiAgIHN3aXRjaCh2YWx1ZSkgewogICAgIGNhc2UgMDoKQEAgLTYzLDcgKzk0LDcgQEAKICAgfQogfQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTVEFUVVNfU1VDQ0VTUzsKIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTVEFUVVNfTk9fU1BFRUNIOwogY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNUQVRVU19BQk9SVEVEOwpAQCAtNzYsNyArMTA3LDcgQEAKIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTdGF0dXNDb2RlX01JTjsKIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTdGF0dXNDb2RlX01BWDsKIGNvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTdGF0dXNDb2RlX0FSUkFZU0laRTsKLSNlbmRpZiAgLy8gX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGJvb2wgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7CiAgIHN3aXRjaCh2YWx1ZSkgewogICAgIGNhc2UgMDoKQEAgLTg5LDcgKzEyMCw3IEBACiAgIH0KIH0KIAotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U1RBUlRfT0ZfU1BFRUNIOwogY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkVORF9PRl9TUEVFQ0g7CiBjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6RU5EX09GX0FVRElPOwpAQCAtOTcsNDAgKzEyOCw1MyBAQAogY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkVuZHBvaW50ZXJFdmVudFR5cGVfTUlOOwogY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkVuZHBvaW50ZXJFdmVudFR5cGVfTUFYOwogY29uc3QgaW50IFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkVuZHBvaW50ZXJFdmVudFR5cGVfQVJSQVlTSVpFOwotI2VuZGlmICAvLyBfTVNDX1ZFUgotI2lmbmRlZiBfTVNDX1ZFUgorI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6a1N0YXR1c0ZpZWxkTnVtYmVyOwogY29uc3QgaW50IFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmtSZXN1bHRGaWVsZE51bWJlcjsKIGNvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjprRW5kcG9pbnRGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNwZWVjaFJlY29nbml0aW9uRXZlbnQoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpLCBfYXJlbmFfcHRyXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudCkKIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OlNwZWVjaFJlY29nbml0aW9uRXZlbnQoY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSwKKyAgICBfYXJlbmFfcHRyXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQpCiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U2hhcmVkQ3RvcigpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKICAgX2NhY2hlZF9zaXplXyA9IDA7CisgIF91bmtub3duX2ZpZWxkc18uVW5zYWZlU2V0RGVmYXVsdCgKKyAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIHN0YXR1c18gPSAwOwogICBlbmRwb2ludF8gPSAwOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwogfQogCiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50Ojp+U3BlZWNoUmVjb2duaXRpb25FdmVudCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U2hhcmVkRHRvcigpIHsKKyAgX3Vua25vd25fZmllbGRzXy5EZXN0cm95Tm9BcmVuYSgKKyAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIGlmICh0aGlzICE9ICZkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgI2Vsc2UKICAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgI2VuZGlmCiAgIH0KIH0KIApAQCAtMTQwLDY3ICsxODQsMTA4IEBACiAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwogfQogY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CisjZWxzZQorICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOworI2VuZGlmCisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87CiB9CiAKIFNwZWVjaFJlY29nbml0aW9uRXZlbnQqIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotU3BlZWNoUmVjb2duaXRpb25FdmVudCogU3BlZWNoUmVjb2duaXRpb25FdmVudDo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFNwZWVjaFJlY29nbml0aW9uRXZlbnQ7CitTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudCogbiA9IG5ldyBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgc3RhdHVzXyA9IDA7Ci0gICAgZW5kcG9pbnRfID0gMDsKLSAgfQorLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQorI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2ludmFsaWQtb2Zmc2V0b2ZcIiIpIFwKKyAgX19idWlsdGluX29mZnNldG9mKFNwZWVjaFJlY29nbml0aW9uRXZlbnQsIGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwb3AiKQorI2Vsc2UKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcCisgICZyZWludGVycHJldF9jYXN0PFNwZWVjaFJlY29nbml0aW9uRXZlbnQqPigxNiktPmYpCisjZW5kaWYKKworI2RlZmluZSBaUl8oZmlyc3QsIGxhc3QpIGRvIHtcCisgIDo6bWVtc2V0KCZmaXJzdCwgMCxcCisgICAgICAgICAgIFpSX0hFTFBFUl8obGFzdCkgLSBaUl9IRUxQRVJfKGZpcnN0KSArIHNpemVvZihsYXN0KSk7XAorfSB3aGlsZSAoMCkKKworICBaUl8oc3RhdHVzXywgZW5kcG9pbnRfKTsKKworI3VuZGVmIFpSX0hFTFBFUl8KKyN1bmRlZiBaUl8KKwogICByZXN1bHRfLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIF91bmtub3duX2ZpZWxkc18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgKKyAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiAKIGJvb2wgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpMYXp5U3RyaW5nT3V0cHV0U3RyZWFtIHVua25vd25fZmllbGRzX3N0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5ld1Blcm1hbmVudENhbGxiYWNrKAorICAgICAgICAgICZNdXRhYmxlVW5rbm93bkZpZWxkc0ZvclNwZWVjaFJlY29nbml0aW9uRXZlbnQsIHRoaXMpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0gdW5rbm93bl9maWVsZHNfc3RyZWFtKAorICAgICAgJnVua25vd25fZmllbGRzX3N0cmluZywgZmFsc2UpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuU3RhdHVzQ29kZSBzdGF0dXMgPSAxIFtkZWZhdWx0ID0gU1RBVFVTX1NVQ0NFU1NdOwogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICBpZiAodGFnID09IDgpIHsKICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKICAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAogICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwogICAgICAgICAgIGlmICg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX0lzVmFsaWQodmFsdWUpKSB7CiAgICAgICAgICAgICBzZXRfc3RhdHVzKHN0YXRpY19jYXN0PCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlID4odmFsdWUpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdW5rbm93bl9maWVsZHNfc3RyZWFtLldyaXRlVmFyaW50MzIoOCk7CisgICAgICAgICAgICB1bmtub3duX2ZpZWxkc19zdHJlYW0uV3JpdGVWYXJpbnQzMih2YWx1ZSk7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfcmVzdWx0OwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCByZXN1bHQgPSAyOwogICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxOCkgewogICAgICAgICAgcGFyc2VfcmVzdWx0OgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfcmVzdWx0OgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfcmVzdWx0KCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX3Jlc3VsdDsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2xvb3BfcmVzdWx0OworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzIpKSBnb3RvIHBhcnNlX2VuZHBvaW50OwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LkVuZHBvaW50ZXJFdmVudFR5cGUgZW5kcG9pbnQgPSA0OwogICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICBpZiAodGFnID09IDMyKSB7CiAgICAgICAgICBwYXJzZV9lbmRwb2ludDoKICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKQEAgLTIwOCw2NyArMjkzLDgyIEBACiAgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7CiAgICAgICAgICAgaWYgKDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfSXNWYWxpZCh2YWx1ZSkpIHsKICAgICAgICAgICAgIHNldF9lbmRwb2ludChzdGF0aWNfY2FzdDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZSA+KHZhbHVlKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHVua25vd25fZmllbGRzX3N0cmVhbS5Xcml0ZVZhcmludDMyKDMyKTsKKyAgICAgICAgICAgIHVua25vd25fZmllbGRzX3N0cmVhbS5Xcml0ZVZhcmludDMyKHZhbHVlKTsKICAgICAgICAgICB9CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQogICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKAorICAgICAgICAgICAgaW5wdXQsIHRhZywgJnVua25vd25fZmllbGRzX3N0cmVhbSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudCkKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQpCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudCkKICAgLy8gb3B0aW9uYWwgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5TdGF0dXNDb2RlIHN0YXR1cyA9IDEgW2RlZmF1bHQgPSBTVEFUVVNfU1VDQ0VTU107CiAgIGlmIChoYXNfc3RhdHVzKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAogICAgICAgMSwgdGhpcy0+c3RhdHVzKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQgcmVzdWx0ID0gMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5yZXN1bHRfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5yZXN1bHRfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZSgKICAgICAgIDIsIHRoaXMtPnJlc3VsdChpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LkVuZHBvaW50ZXJFdmVudFR5cGUgZW5kcG9pbnQgPSA0OwogICBpZiAoaGFzX2VuZHBvaW50KCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAogICAgICAgNCwgdGhpcy0+ZW5kcG9pbnQoKSwgb3V0cHV0KTsKICAgfQotICAKKworICBvdXRwdXQtPldyaXRlUmF3KHVua25vd25fZmllbGRzKCkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odW5rbm93bl9maWVsZHMoKS5zaXplKCkpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQogfQogCiBpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA1dSkgewogICAgIC8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuU3RhdHVzQ29kZSBzdGF0dXMgPSAxIFtkZWZhdWx0ID0gU1RBVFVTX1NVQ0NFU1NdOwogICAgIGlmIChoYXNfc3RhdHVzKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5zdGF0dXMoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5FbmRwb2ludGVyRXZlbnRUeXBlIGVuZHBvaW50ID0gNDsKICAgICBpZiAoaGFzX2VuZHBvaW50KCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5lbmRwb2ludCgpKTsKICAgICB9Ci0gICAgCisKICAgfQogICAvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCByZXN1bHQgPSAyOwogICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5yZXN1bHRfc2l6ZSgpOwpAQCAtMjc3LDcgKzM3Nyw5IEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPnJlc3VsdChpKSk7CiAgIH0KLSAgCisKKyAgdG90YWxfc2l6ZSArPSB1bmtub3duX2ZpZWxkcygpLnNpemUoKTsKKwogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwogICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CkBAIC0yOTAsNyArMzkyLDggQEAKIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpNZXJnZUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwogICByZXN1bHRfLk1lcmdlRnJvbShmcm9tLnJlc3VsdF8pOwogICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CiAgICAgaWYgKGZyb20uaGFzX3N0YXR1cygpKSB7CkBAIC0zMDAsNjkgKzQwMywxNzggQEAKICAgICAgIHNldF9lbmRwb2ludChmcm9tLmVuZHBvaW50KCkpOwogICAgIH0KICAgfQorICBpZiAoIWZyb20udW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5hcHBlbmQoZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkNvcHlGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnQmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCisKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6U3dhcChTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChzdGF0dXNfLCBvdGhlci0+c3RhdHVzXyk7Ci0gICAgcmVzdWx0Xy5Td2FwKCZvdGhlci0+cmVzdWx0Xyk7Ci0gICAgc3RkOjpzd2FwKGVuZHBvaW50Xywgb3RoZXItPmVuZHBvaW50Xyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OkludGVybmFsU3dhcChTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KiBvdGhlcikgeworICBzdGQ6OnN3YXAoc3RhdHVzXywgb3RoZXItPnN0YXR1c18pOworICByZXN1bHRfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnJlc3VsdF8pOworICBzdGQ6OnN3YXAoZW5kcG9pbnRfLCBvdGhlci0+ZW5kcG9pbnRfKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CiB9CiAKIDo6c3RkOjpzdHJpbmcgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6R2V0VHlwZU5hbWUoKSBjb25zdCB7CiAgIHJldHVybiAiY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50IjsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gU3BlZWNoUmVjb2duaXRpb25FdmVudAorCisvLyBvcHRpb25hbCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LlN0YXR1c0NvZGUgc3RhdHVzID0gMSBbZGVmYXVsdCA9IFNUQVRVU19TVUNDRVNTXTsKK2Jvb2wgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6aGFzX3N0YXR1cygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnNldF9oYXNfc3RhdHVzKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpjbGVhcl9oYXNfc3RhdHVzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Y2xlYXJfc3RhdHVzKCkgeworICBzdGF0dXNfID0gMDsKKyAgY2xlYXJfaGFzX3N0YXR1cygpOworfQorIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6c3RhdHVzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5zdGF0dXMpCisgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSA+KHN0YXR1c18pOworfQorIHZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6c2V0X3N0YXR1cyg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIHZhbHVlKSB7CisgIGFzc2VydCg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX0lzVmFsaWQodmFsdWUpKTsKKyAgc2V0X2hhc19zdGF0dXMoKTsKKyAgc3RhdHVzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5zdGF0dXMpCit9CisKKy8vIHJlcGVhdGVkIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0IHJlc3VsdCA9IDI7CitpbnQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6cmVzdWx0X3NpemUoKSBjb25zdCB7CisgIHJldHVybiByZXN1bHRfLnNpemUoKTsKK30KK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6Y2xlYXJfcmVzdWx0KCkgeworICByZXN1bHRfLkNsZWFyKCk7Cit9Citjb25zdCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnJlc3VsdChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQucmVzdWx0KQorICByZXR1cm4gcmVzdWx0Xy5HZXQoaW5kZXgpOworfQorOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjptdXRhYmxlX3Jlc3VsdChpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LnJlc3VsdCkKKyAgcmV0dXJuIHJlc3VsdF8uTXV0YWJsZShpbmRleCk7Cit9Cis6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmFkZF9yZXN1bHQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LnJlc3VsdCkKKyAgcmV0dXJuIHJlc3VsdF8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA+KgorU3BlZWNoUmVjb2duaXRpb25FdmVudDo6bXV0YWJsZV9yZXN1bHQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LnJlc3VsdCkKKyAgcmV0dXJuICZyZXN1bHRfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQgPiYKK1NwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnJlc3VsdCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LnJlc3VsdCkKKyAgcmV0dXJuIHJlc3VsdF87Cit9CisKKy8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuRW5kcG9pbnRlckV2ZW50VHlwZSBlbmRwb2ludCA9IDQ7Citib29sIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6Omhhc19lbmRwb2ludCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnNldF9oYXNfZW5kcG9pbnQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmNsZWFyX2hhc19lbmRwb2ludCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmNsZWFyX2VuZHBvaW50KCkgeworICBlbmRwb2ludF8gPSAwOworICBjbGVhcl9oYXNfZW5kcG9pbnQoKTsKK30KKyA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmVuZHBvaW50KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5lbmRwb2ludCkKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlID4oZW5kcG9pbnRfKTsKK30KKyB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnNldF9lbmRwb2ludCg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIHZhbHVlKSB7CisgIGFzc2VydCg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0lzVmFsaWQodmFsdWUpKTsKKyAgc2V0X2hhc19lbmRwb2ludCgpOworICBlbmRwb2ludF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuZW5kcG9pbnQpCit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2lmbmRlZiBfTVNDX1ZFUgorc3RhdGljIDo6c3RkOjpzdHJpbmcqIE11dGFibGVVbmtub3duRmllbGRzRm9yU3BlZWNoUmVjb2duaXRpb25SZXN1bHQoCisgICAgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIHB0cikgeworICByZXR1cm4gcHRyLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Cit9CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjprQWx0ZXJuYXRpdmVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6a0ZpbmFsRmllbGROdW1iZXI7CiBjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmtTdGFiaWxpdHlGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCksIF9hcmVuYV9wdHJfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCkKIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewogfQogCiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQoY29uc3QgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCksCisgICAgX2FyZW5hX3B0cl8oTlVMTCkgewogICBTaGFyZWRDdG9yKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCkKIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6U2hhcmVkQ3RvcigpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKICAgX2NhY2hlZF9zaXplXyA9IDA7CisgIF91bmtub3duX2ZpZWxkc18uVW5zYWZlU2V0RGVmYXVsdCgKKyAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGZpbmFsXyA9IGZhbHNlOwogICBzdGFiaWxpdHlfID0gMDsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6On5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCkKICAgU2hhcmVkRHRvcigpOwogfQogCiB2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpTaGFyZWREdG9yKCkgeworICBfdW5rbm93bl9maWVsZHNfLkRlc3Ryb3lOb0FyZW5hKAorICAgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVIKKyAgaWYgKHRoaXMgIT0gJmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAjZWxzZQogICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgeworICAjZW5kaWYKICAgfQogfQogCkBAIC0zNzIsMTI2ICs1ODQsMTc1IEBACiAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwogfQogY29uc3QgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKKyNlbHNlCisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CisjZW5kaWYKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKIH0KIAogU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLVNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OworU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIG4gPSBuZXcgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7Ci0gICAgZmluYWxfID0gZmFsc2U7Ci0gICAgc3RhYmlsaXR5XyA9IDA7Ci0gIH0KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQpCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAorICBfX2J1aWx0aW5fb2Zmc2V0b2YoU3BlZWNoUmVjb2duaXRpb25SZXN1bHQsIGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwb3AiKQorI2Vsc2UKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcCisgICZyZWludGVycHJldF9jYXN0PFNwZWVjaFJlY29nbml0aW9uUmVzdWx0Kj4oMTYpLT5mKQorI2VuZGlmCisKKyNkZWZpbmUgWlJfKGZpcnN0LCBsYXN0KSBkbyB7XAorICA6Om1lbXNldCgmZmlyc3QsIDAsXAorICAgICAgICAgICBaUl9IRUxQRVJfKGxhc3QpIC0gWlJfSEVMUEVSXyhmaXJzdCkgKyBzaXplb2YobGFzdCkpO1wKK30gd2hpbGUgKDApCisKKyAgWlJfKGZpbmFsXywgc3RhYmlsaXR5Xyk7CisKKyN1bmRlZiBaUl9IRUxQRVJfCisjdW5kZWYgWlJfCisKICAgYWx0ZXJuYXRpdmVfLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIF91bmtub3duX2ZpZWxkc18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgKKyAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiAKIGJvb2wgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6TGF6eVN0cmluZ091dHB1dFN0cmVhbSB1bmtub3duX2ZpZWxkc19zdHJpbmcoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOZXdQZXJtYW5lbnRDYWxsYmFjaygKKyAgICAgICAgICAmTXV0YWJsZVVua25vd25GaWVsZHNGb3JTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCwgdGhpcykpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSB1bmtub3duX2ZpZWxkc19zdHJlYW0oCisgICAgICAmdW5rbm93bl9maWVsZHNfc3RyaW5nLCBmYWxzZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIHJlcGVhdGVkIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUgYWx0ZXJuYXRpdmUgPSAxOwogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2FsdGVybmF0aXZlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF9hbHRlcm5hdGl2ZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2FsdGVybmF0aXZlKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2FsdGVybmF0aXZlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMCkpIGdvdG8gcGFyc2VfbG9vcF9hbHRlcm5hdGl2ZTsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9maW5hbDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgYm9vbCBmaW5hbCA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTYpIHsKICAgICAgICAgIHBhcnNlX2ZpbmFsOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmZmluYWxfKSkpOwogICAgICAgICAgIHNldF9oYXNfZmluYWwoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjkpKSBnb3RvIHBhcnNlX3N0YWJpbGl0eTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgZmxvYXQgc3RhYmlsaXR5ID0gMzsKICAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyKSB7CisgICAgICAgIGlmICh0YWcgPT0gMjkpIHsKICAgICAgICAgIHBhcnNlX3N0YWJpbGl0eToKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIGZsb2F0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GTE9BVD4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmc3RhYmlsaXR5XykpKTsKICAgICAgICAgICBzZXRfaGFzX3N0YWJpbGl0eSgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZykpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZCgKKyAgICAgICAgICAgIGlucHV0LCB0YWcsICZ1bmtub3duX2ZpZWxkc19zdHJlYW0pKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQpCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KQogICAvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlIGFsdGVybmF0aXZlID0gMTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5hbHRlcm5hdGl2ZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmFsdGVybmF0aXZlX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2UoCiAgICAgICAxLCB0aGlzLT5hbHRlcm5hdGl2ZShpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBib29sIGZpbmFsID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKICAgaWYgKGhhc19maW5hbCgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgyLCB0aGlzLT5maW5hbCgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGZsb2F0IHN0YWJpbGl0eSA9IDM7CiAgIGlmIChoYXNfc3RhYmlsaXR5KCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdCgzLCB0aGlzLT5zdGFiaWxpdHkoKSwgb3V0cHV0KTsKICAgfQotICAKKworICBvdXRwdXQtPldyaXRlUmF3KHVua25vd25fZmllbGRzKCkuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4odW5rbm93bl9maWVsZHMoKS5zaXplKCkpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCkKIH0KIAogaW50IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiA2dSkgewogICAgIC8vIG9wdGlvbmFsIGJvb2wgZmluYWwgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwogICAgIGlmIChoYXNfZmluYWwoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCBmbG9hdCBzdGFiaWxpdHkgPSAzOwogICAgIGlmIChoYXNfc3RhYmlsaXR5KCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArIDQ7CiAgICAgfQotICAgIAorCiAgIH0KICAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSBhbHRlcm5hdGl2ZSA9IDE7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmFsdGVybmF0aXZlX3NpemUoKTsKQEAgLTUwMCw3ICs3NjEsOSBAQAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAogICAgICAgICB0aGlzLT5hbHRlcm5hdGl2ZShpKSk7CiAgIH0KLSAgCisKKyAgdG90YWxfc2l6ZSArPSB1bmtub3duX2ZpZWxkcygpLnNpemUoKTsKKwogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwogICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CkBAIC01MTMsNyArNzc2LDggQEAKIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6TWVyZ2VGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwogICBhbHRlcm5hdGl2ZV8uTWVyZ2VGcm9tKGZyb20uYWx0ZXJuYXRpdmVfKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19maW5hbCgpKSB7CkBAIC01MjMsNzEgKzc4NywxNzYgQEAKICAgICAgIHNldF9zdGFiaWxpdHkoZnJvbS5zdGFiaWxpdHkoKSk7CiAgICAgfQogICB9CisgIGlmICghZnJvbS51bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPmFwcGVuZChmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OkNvcHlGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCisKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OlN3YXAoU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgYWx0ZXJuYXRpdmVfLlN3YXAoJm90aGVyLT5hbHRlcm5hdGl2ZV8pOwotICAgIHN0ZDo6c3dhcChmaW5hbF8sIG90aGVyLT5maW5hbF8pOwotICAgIHN0ZDo6c3dhcChzdGFiaWxpdHlfLCBvdGhlci0+c3RhYmlsaXR5Xyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpJbnRlcm5hbFN3YXAoU3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIG90aGVyKSB7CisgIGFsdGVybmF0aXZlXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5hbHRlcm5hdGl2ZV8pOworICBzdGQ6OnN3YXAoZmluYWxfLCBvdGhlci0+ZmluYWxfKTsKKyAgc3RkOjpzd2FwKHN0YWJpbGl0eV8sIG90aGVyLT5zdGFiaWxpdHlfKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CiB9CiAKIDo6c3RkOjpzdHJpbmcgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OkdldFR5cGVOYW1lKCkgY29uc3QgewogICByZXR1cm4gImNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQiOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdAorCisvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlIGFsdGVybmF0aXZlID0gMTsKK2ludCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6YWx0ZXJuYXRpdmVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGFsdGVybmF0aXZlXy5zaXplKCk7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpjbGVhcl9hbHRlcm5hdGl2ZSgpIHsKKyAgYWx0ZXJuYXRpdmVfLkNsZWFyKCk7Cit9Citjb25zdCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmFsdGVybmF0aXZlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuYWx0ZXJuYXRpdmUpCisgIHJldHVybiBhbHRlcm5hdGl2ZV8uR2V0KGluZGV4KTsKK30KKzo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6bXV0YWJsZV9hbHRlcm5hdGl2ZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdC5hbHRlcm5hdGl2ZSkKKyAgcmV0dXJuIGFsdGVybmF0aXZlXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6YWRkX2FsdGVybmF0aXZlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuYWx0ZXJuYXRpdmUpCisgIHJldHVybiBhbHRlcm5hdGl2ZV8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlID4qCitTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6bXV0YWJsZV9hbHRlcm5hdGl2ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0LmFsdGVybmF0aXZlKQorICByZXR1cm4gJmFsdGVybmF0aXZlXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUgPiYKK1NwZWVjaFJlY29nbml0aW9uUmVzdWx0OjphbHRlcm5hdGl2ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdC5hbHRlcm5hdGl2ZSkKKyAgcmV0dXJuIGFsdGVybmF0aXZlXzsKK30KKworLy8gb3B0aW9uYWwgYm9vbCBmaW5hbCA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Citib29sIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpoYXNfZmluYWwoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6c2V0X2hhc19maW5hbCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmNsZWFyX2hhc19maW5hbCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpjbGVhcl9maW5hbCgpIHsKKyAgZmluYWxfID0gZmFsc2U7CisgIGNsZWFyX2hhc19maW5hbCgpOworfQorIGJvb2wgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmZpbmFsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuZmluYWwpCisgIHJldHVybiBmaW5hbF87Cit9Cisgdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6c2V0X2ZpbmFsKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19maW5hbCgpOworICBmaW5hbF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0LmZpbmFsKQorfQorCisvLyBvcHRpb25hbCBmbG9hdCBzdGFiaWxpdHkgPSAzOworYm9vbCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6aGFzX3N0YWJpbGl0eSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpzZXRfaGFzX3N0YWJpbGl0eSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmNsZWFyX2hhc19zdGFiaWxpdHkoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQordm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6Y2xlYXJfc3RhYmlsaXR5KCkgeworICBzdGFiaWxpdHlfID0gMDsKKyAgY2xlYXJfaGFzX3N0YWJpbGl0eSgpOworfQorIGZsb2F0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpzdGFiaWxpdHkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdC5zdGFiaWxpdHkpCisgIHJldHVybiBzdGFiaWxpdHlfOworfQorIHZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OnNldF9zdGFiaWxpdHkoZmxvYXQgdmFsdWUpIHsKKyAgc2V0X2hhc19zdGFiaWxpdHkoKTsKKyAgc3RhYmlsaXR5XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuc3RhYmlsaXR5KQorfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSNpZm5kZWYgX01TQ19WRVIKK3N0YXRpYyA6OnN0ZDo6c3RyaW5nKiBNdXRhYmxlVW5rbm93bkZpZWxkc0ZvclNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUoCisgICAgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogcHRyKSB7CisgIHJldHVybiBwdHItPm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKK30KKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6a1RyYW5zY3JpcHRGaWVsZE51bWJlcjsKIGNvbnN0IGludCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjprQ29uZmlkZW5jZUZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlKCksIF9hcmVuYV9wdHJfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKQogfQogCiB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKIH0KIAogU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZShjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSgpLAorICAgIF9hcmVuYV9wdHJfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOwogICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSkKIH0KIAogdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpTaGFyZWRDdG9yKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICBfY2FjaGVkX3NpemVfID0gMDsKLSAgdHJhbnNjcmlwdF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIF91bmtub3duX2ZpZWxkc18uVW5zYWZlU2V0RGVmYXVsdCgKKyAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHRyYW5zY3JpcHRfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY29uZmlkZW5jZV8gPSAwOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwogfQogCiBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjp+U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRyYW5zY3JpcHRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgdHJhbnNjcmlwdF87Ci0gIH0KKyAgX3Vua25vd25fZmllbGRzXy5EZXN0cm95Tm9BcmVuYSgKKyAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHRyYW5zY3JpcHRfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIGlmICh0aGlzICE9ICZkZWZhdWx0X2luc3RhbmNlKCkpIHsKKyAgI2Vsc2UKICAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgI2VuZGlmCiAgIH0KIH0KIApAQCAtNTk3LDEwOSArOTY2LDE0MCBAQAogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKIH0KIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7ICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVIKKyAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOworI2Vsc2UKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKKyNlbmRpZgorICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwogfQogCiBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLVNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOworU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIG4gPSBuZXcgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKQorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgM3UpIHsKICAgICBpZiAoaGFzX3RyYW5zY3JpcHQoKSkgewotICAgICAgaWYgKHRyYW5zY3JpcHRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICAgICAgdHJhbnNjcmlwdF8tPmNsZWFyKCk7Ci0gICAgICB9CisgICAgICB0cmFuc2NyaXB0Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICAgIGNvbmZpZGVuY2VfID0gMDsKICAgfQogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworICBfdW5rbm93bl9maWVsZHNfLkNsZWFyVG9FbXB0eU5vQXJlbmEoCisgICAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogCiBib29sIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6TGF6eVN0cmluZ091dHB1dFN0cmVhbSB1bmtub3duX2ZpZWxkc19zdHJpbmcoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOZXdQZXJtYW5lbnRDYWxsYmFjaygKKyAgICAgICAgICAmTXV0YWJsZVVua25vd25GaWVsZHNGb3JTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlLCB0aGlzKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtIHVua25vd25fZmllbGRzX3N0cmVhbSgKKyAgICAgICZ1bmtub3duX2ZpZWxkc19zdHJpbmcsIGZhbHNlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhbnNjcmlwdCA9IDE7CiAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDEwKSB7CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3RyYW5zY3JpcHQoKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyMSkpIGdvdG8gcGFyc2VfY29uZmlkZW5jZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMikgeworICAgICAgICBpZiAodGFnID09IDIxKSB7CiAgICAgICAgICBwYXJzZV9jb25maWRlbmNlOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgZmxvYXQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0ZMT0FUPigKICAgICAgICAgICAgICAgICAgaW5wdXQsICZjb25maWRlbmNlXykpKTsKICAgICAgICAgICBzZXRfaGFzX2NvbmZpZGVuY2UoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZ290byBzdWNjZXNzOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTsKKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoCisgICAgICAgICAgICBpbnB1dCwgdGFnLCAmdW5rbm93bl9maWVsZHNfc3RyZWFtKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSkKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKQogICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhbnNjcmlwdCA9IDE7CiAgIGlmIChoYXNfdHJhbnNjcmlwdCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKICAgICAgIDEsIHRoaXMtPnRyYW5zY3JpcHQoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBmbG9hdCBjb25maWRlbmNlID0gMjsKICAgaWYgKGhhc19jb25maWRlbmNlKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdCgyLCB0aGlzLT5jb25maWRlbmNlKCksIG91dHB1dCk7CiAgIH0KLSAgCisKKyAgb3V0cHV0LT5Xcml0ZVJhdyh1bmtub3duX2ZpZWxkcygpLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHVua25vd25fZmllbGRzKCkuc2l6ZSgpKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSkKIH0KIAogaW50IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSkKICAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgM3UpIHsKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhbnNjcmlwdCA9IDE7CiAgICAgaWYgKGhhc190cmFuc2NyaXB0KCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgICAgIHRoaXMtPnRyYW5zY3JpcHQoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7CiAgICAgaWYgKGhhc19jb25maWRlbmNlKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArIDQ7CiAgICAgfQotICAgIAorCiAgIH0KKyAgdG90YWxfc2l6ZSArPSB1bmtub3duX2ZpZWxkcygpLnNpemUoKTsKKwogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwogICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CkBAIC03MTIsNDEgKzExMTIsMTMyIEBACiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6TWVyZ2VGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc190cmFuc2NyaXB0KCkpIHsKLSAgICAgIHNldF90cmFuc2NyaXB0KGZyb20udHJhbnNjcmlwdCgpKTsKKyAgICAgIHNldF9oYXNfdHJhbnNjcmlwdCgpOworICAgICAgdHJhbnNjcmlwdF8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnRyYW5zY3JpcHRfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX2NvbmZpZGVuY2UoKSkgewogICAgICAgc2V0X2NvbmZpZGVuY2UoZnJvbS5jb25maWRlbmNlKCkpOwogICAgIH0KICAgfQorICBpZiAoIWZyb20udW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5hcHBlbmQoZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkNvcHlGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCisKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6U3dhcChTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcCh0cmFuc2NyaXB0Xywgb3RoZXItPnRyYW5zY3JpcHRfKTsKLSAgICBzdGQ6OnN3YXAoY29uZmlkZW5jZV8sIG90aGVyLT5jb25maWRlbmNlXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkludGVybmFsU3dhcChTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBvdGhlcikgeworICB0cmFuc2NyaXB0Xy5Td2FwKCZvdGhlci0+dHJhbnNjcmlwdF8pOworICBzdGQ6OnN3YXAoY29uZmlkZW5jZV8sIG90aGVyLT5jb25maWRlbmNlXyk7CisgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOworICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwogfQogCiA6OnN0ZDo6c3RyaW5nIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OkdldFR5cGVOYW1lKCkgY29uc3QgewogICByZXR1cm4gImNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSI7CiB9CiAKKyNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUKKworLy8gb3B0aW9uYWwgc3RyaW5nIHRyYW5zY3JpcHQgPSAxOworYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpoYXNfdHJhbnNjcmlwdCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnNldF9oYXNfdHJhbnNjcmlwdCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6Y2xlYXJfaGFzX3RyYW5zY3JpcHQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpjbGVhcl90cmFuc2NyaXB0KCkgeworICB0cmFuc2NyaXB0Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc190cmFuc2NyaXB0KCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6dHJhbnNjcmlwdCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUudHJhbnNjcmlwdCkKKyAgcmV0dXJuIHRyYW5zY3JpcHRfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnNldF90cmFuc2NyaXB0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfdHJhbnNjcmlwdCgpOworICB0cmFuc2NyaXB0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZS50cmFuc2NyaXB0KQorfQorIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X3RyYW5zY3JpcHQoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc190cmFuc2NyaXB0KCk7CisgIHRyYW5zY3JpcHRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUudHJhbnNjcmlwdCkKK30KKyB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnNldF90cmFuc2NyaXB0KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3RyYW5zY3JpcHQoKTsKKyAgdHJhbnNjcmlwdF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlLnRyYW5zY3JpcHQpCit9CisgOjpzdGQ6OnN0cmluZyogU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6bXV0YWJsZV90cmFuc2NyaXB0KCkgeworICBzZXRfaGFzX3RyYW5zY3JpcHQoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlLnRyYW5zY3JpcHQpCisgIHJldHVybiB0cmFuc2NyaXB0Xy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnJlbGVhc2VfdHJhbnNjcmlwdCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlLnRyYW5zY3JpcHQpCisgIGNsZWFyX2hhc190cmFuc2NyaXB0KCk7CisgIHJldHVybiB0cmFuc2NyaXB0Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X2FsbG9jYXRlZF90cmFuc2NyaXB0KDo6c3RkOjpzdHJpbmcqIHRyYW5zY3JpcHQpIHsKKyAgaWYgKHRyYW5zY3JpcHQgIT0gTlVMTCkgeworICAgIHNldF9oYXNfdHJhbnNjcmlwdCgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc190cmFuc2NyaXB0KCk7CisgIH0KKyAgdHJhbnNjcmlwdF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHRyYW5zY3JpcHQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUudHJhbnNjcmlwdCkKK30KKworLy8gb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7Citib29sIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6Omhhc19jb25maWRlbmNlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK3ZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X2hhc19jb25maWRlbmNlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQordm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpjbGVhcl9oYXNfY29uZmlkZW5jZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmNsZWFyX2NvbmZpZGVuY2UoKSB7CisgIGNvbmZpZGVuY2VfID0gMDsKKyAgY2xlYXJfaGFzX2NvbmZpZGVuY2UoKTsKK30KKyBmbG9hdCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpjb25maWRlbmNlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZS5jb25maWRlbmNlKQorICByZXR1cm4gY29uZmlkZW5jZV87Cit9Cisgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpzZXRfY29uZmlkZW5jZShmbG9hdCB2YWx1ZSkgeworICBzZXRfaGFzX2NvbmZpZGVuY2UoKTsKKyAgY29uZmlkZW5jZV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUuY29uZmlkZW5jZSkKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3N0cmVhbWluZ19hcGkucGIuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmgKaW5kZXggYjY2NjQyMy4uZDcwMjgzMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvZ29vZ2xlX3N0cmVhbWluZ19hcGkucGIuaAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9nb29nbGVfc3RyZWFtaW5nX2FwaS5wYi5oCkBAIC04LDIwICs4LDI0IEBACiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAKLSNpZiBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8IDIwMDQwMDAKKyNpZiBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8IDMwMDAwMDAKICNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCiAjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZSB1cGRhdGUKICNlcnJvciB5b3VyIGhlYWRlcnMuCiAjZW5kaWYKLSNpZiAyMDA0MDAyIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgorI2lmIDMwMDAwMDAgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCiAjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKICNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCiAjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgogI2VuZGlmCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmg+CiAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCiAKIG5hbWVzcGFjZSBjb2JhbHQgewpAQCAtMjksMTMgKzMzLDEzIEBACiBuYW1lc3BhY2UgcHJvdG8gewogCiAvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCi12b2lkICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7Cit2b2lkIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOwogdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKIAorY2xhc3MgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTsKIGNsYXNzIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ7CiBjbGFzcyBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDsKLWNsYXNzIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU7CiAKIGVudW0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIHsKICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19TVUNDRVNTID0gMCwKQEAgLTcwLDUzICs3NCw5MyBAQAogIHB1YmxpYzoKICAgU3BlZWNoUmVjb2duaXRpb25FdmVudCgpOwogICB2aXJ0dWFsIH5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KCk7Ci0gIAorCiAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnQoY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50JiBvcGVyYXRvcj0oY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKworICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc18uR2V0Tm9BcmVuYSgKKyAgICAgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgfQorCisgIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfLk11dGFibGVOb0FyZW5hKAorICAgICAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICB9CisKICAgc3RhdGljIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnQmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KiBvdGhlcik7Ci0gIAorCisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIC8vIFJldHVybnMgdGhlIGludGVybmFsIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBjYW4KKyAgLy8gcmV0dXJuIE5VTEwgdGh1cyBzaG91bGQgbm90IGJlIHVzZWQgYnkgdGhlIHVzZXIuIFRoaXMgaXMgaW50ZW5kZWQKKyAgLy8gZm9yIFByb3RvYnVmIGludGVybmFsIGNvZGUuIFBsZWFzZSB1c2UgZGVmYXVsdF9pbnN0YW5jZSgpIGRlY2xhcmVkCisgIC8vIGFib3ZlIGluc3RlYWQuCisgIHN0YXRpYyBpbmxpbmUgY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCogaW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZV87CisgIH0KKyAgI2VuZGlmCisKKyAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSB2b2lkIFN3YXAoU3BlZWNoUmVjb2duaXRpb25FdmVudCogb3RoZXIpOworCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50KiBOZXcoKSBjb25zdDsKKworICBpbmxpbmUgU3BlZWNoUmVjb2duaXRpb25FdmVudCogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9CisKKyAgU3BlZWNoUmVjb2duaXRpb25FdmVudCogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSk7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25FdmVudCYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uRXZlbnQmIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CiAgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIHZvaWQgRGlzY2FyZFVua25vd25GaWVsZHMoKTsKICAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CiAgIHByaXZhdGU6CiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoU3BlZWNoUmVjb2duaXRpb25FdmVudCogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hcmVuYV9wdHJfOworICB9CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfYXJlbmFfcHRyXzsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6c3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgdHlwZWRlZiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgU3RhdHVzQ29kZTsKLSAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX1NVQ0NFU1MgPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX1NVQ0NFU1M7Ci0gIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19OT19TUEVFQ0ggPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX05PX1NQRUVDSDsKLSAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX0FCT1JURUQgPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX0FCT1JURUQ7Ci0gIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19BVURJT19DQVBUVVJFID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19BVURJT19DQVBUVVJFOwotICBzdGF0aWMgY29uc3QgU3RhdHVzQ29kZSBTVEFUVVNfTkVUV09SSyA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfTkVUV09SSzsKLSAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX05PVF9BTExPV0VEID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19OT1RfQUxMT1dFRDsKLSAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX1NFUlZJQ0VfTk9UX0FMTE9XRUQgPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX1NFUlZJQ0VfTk9UX0FMTE9XRUQ7Ci0gIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19CQURfR1JBTU1BUiA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfQkFEX0dSQU1NQVI7Ci0gIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19MQU5HVUFHRV9OT1RfU1VQUE9SVEVEID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19MQU5HVUFHRV9OT1RfU1VQUE9SVEVEOworICBzdGF0aWMgY29uc3QgU3RhdHVzQ29kZSBTVEFUVVNfU1VDQ0VTUyA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19TVUNDRVNTOworICBzdGF0aWMgY29uc3QgU3RhdHVzQ29kZSBTVEFUVVNfTk9fU1BFRUNIID0KKyAgICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX05PX1NQRUVDSDsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX0FCT1JURUQgPQorICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfQUJPUlRFRDsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX0FVRElPX0NBUFRVUkUgPQorICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfQVVESU9fQ0FQVFVSRTsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX05FVFdPUksgPQorICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfTkVUV09SSzsKKyAgc3RhdGljIGNvbnN0IFN0YXR1c0NvZGUgU1RBVFVTX05PVF9BTExPV0VEID0KKyAgICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX05PVF9BTExPV0VEOworICBzdGF0aWMgY29uc3QgU3RhdHVzQ29kZSBTVEFUVVNfU0VSVklDRV9OT1RfQUxMT1dFRCA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlX1NUQVRVU19TRVJWSUNFX05PVF9BTExPV0VEOworICBzdGF0aWMgY29uc3QgU3RhdHVzQ29kZSBTVEFUVVNfQkFEX0dSQU1NQVIgPQorICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TVEFUVVNfQkFEX0dSQU1NQVI7CisgIHN0YXRpYyBjb25zdCBTdGF0dXNDb2RlIFNUQVRVU19MQU5HVUFHRV9OT1RfU1VQUE9SVEVEID0KKyAgICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU1RBVFVTX0xBTkdVQUdFX05PVF9TVVBQT1JURUQ7CiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBTdGF0dXNDb2RlX0lzVmFsaWQoaW50IHZhbHVlKSB7CiAgICAgcmV0dXJuIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9Jc1ZhbGlkKHZhbHVlKTsKICAgfQpAQCAtMTI2LDEyICsxNzAsMTYgQEAKICAgICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfU3RhdHVzQ29kZV9NQVg7CiAgIHN0YXRpYyBjb25zdCBpbnQgU3RhdHVzQ29kZV9BUlJBWVNJWkUgPQogICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9TdGF0dXNDb2RlX0FSUkFZU0laRTsKLSAgCisKICAgdHlwZWRlZiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgRW5kcG9pbnRlckV2ZW50VHlwZTsKLSAgc3RhdGljIGNvbnN0IEVuZHBvaW50ZXJFdmVudFR5cGUgU1RBUlRfT0ZfU1BFRUNIID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX1NUQVJUX09GX1NQRUVDSDsKLSAgc3RhdGljIGNvbnN0IEVuZHBvaW50ZXJFdmVudFR5cGUgRU5EX09GX1NQRUVDSCA9IFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9FTkRfT0ZfU1BFRUNIOwotICBzdGF0aWMgY29uc3QgRW5kcG9pbnRlckV2ZW50VHlwZSBFTkRfT0ZfQVVESU8gPSBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfRU5EX09GX0FVRElPOwotICBzdGF0aWMgY29uc3QgRW5kcG9pbnRlckV2ZW50VHlwZSBFTkRfT0ZfVVRURVJBTkNFID0gU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9VVFRFUkFOQ0U7CisgIHN0YXRpYyBjb25zdCBFbmRwb2ludGVyRXZlbnRUeXBlIFNUQVJUX09GX1NQRUVDSCA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX1NUQVJUX09GX1NQRUVDSDsKKyAgc3RhdGljIGNvbnN0IEVuZHBvaW50ZXJFdmVudFR5cGUgRU5EX09GX1NQRUVDSCA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9TUEVFQ0g7CisgIHN0YXRpYyBjb25zdCBFbmRwb2ludGVyRXZlbnRUeXBlIEVORF9PRl9BVURJTyA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9BVURJTzsKKyAgc3RhdGljIGNvbnN0IEVuZHBvaW50ZXJFdmVudFR5cGUgRU5EX09GX1VUVEVSQU5DRSA9CisgICAgU3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0VORF9PRl9VVFRFUkFOQ0U7CiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBFbmRwb2ludGVyRXZlbnRUeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7CiAgICAgcmV0dXJuIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9Jc1ZhbGlkKHZhbHVlKTsKICAgfQpAQCAtMTQxLDUzICsxODksNTggQEAKICAgICBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGVfRW5kcG9pbnRlckV2ZW50VHlwZV9NQVg7CiAgIHN0YXRpYyBjb25zdCBpbnQgRW5kcG9pbnRlckV2ZW50VHlwZV9BUlJBWVNJWkUgPQogICAgIFNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9FbmRwb2ludGVyRXZlbnRUeXBlX0FSUkFZU0laRTsKLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gb3B0aW9uYWwgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5TdGF0dXNDb2RlIHN0YXR1cyA9IDEgW2RlZmF1bHQgPSBTVEFUVVNfU1VDQ0VTU107Ci0gIGlubGluZSBib29sIGhhc19zdGF0dXMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfc3RhdHVzKCk7CisgIGJvb2wgaGFzX3N0YXR1cygpIGNvbnN0OworICB2b2lkIGNsZWFyX3N0YXR1cygpOwogICBzdGF0aWMgY29uc3QgaW50IGtTdGF0dXNGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIHN0YXR1cygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfc3RhdHVzKDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgdmFsdWUpOwotICAKKyAgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSBzdGF0dXMoKSBjb25zdDsKKyAgdm9pZCBzZXRfc3RhdHVzKDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgdmFsdWUpOworCiAgIC8vIHJlcGVhdGVkIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0IHJlc3VsdCA9IDI7Ci0gIGlubGluZSBpbnQgcmVzdWx0X3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcmVzdWx0KCk7CisgIGludCByZXN1bHRfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3Jlc3VsdCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtSZXN1bHRGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBjb25zdCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIHJlc3VsdChpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBtdXRhYmxlX3Jlc3VsdChpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBhZGRfcmVzdWx0KCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA+JgotICAgICAgcmVzdWx0KCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA+KgorICBjb25zdCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIHJlc3VsdChpbnQgaW5kZXgpIGNvbnN0OworICA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQqIG11dGFibGVfcmVzdWx0KGludCBpbmRleCk7CisgIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogYWRkX3Jlc3VsdCgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCA+KgogICAgICAgbXV0YWJsZV9yZXN1bHQoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0ID4mCisgICAgICByZXN1bHQoKSBjb25zdDsKKwogICAvLyBvcHRpb25hbCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LkVuZHBvaW50ZXJFdmVudFR5cGUgZW5kcG9pbnQgPSA0OwotICBpbmxpbmUgYm9vbCBoYXNfZW5kcG9pbnQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZW5kcG9pbnQoKTsKKyAgYm9vbCBoYXNfZW5kcG9pbnQoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9lbmRwb2ludCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtFbmRwb2ludEZpZWxkTnVtYmVyID0gNDsKLSAgaW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgZW5kcG9pbnQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2VuZHBvaW50KDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X0VuZHBvaW50ZXJFdmVudFR5cGUgdmFsdWUpOwotICAKKyAgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZSBlbmRwb2ludCgpIGNvbnN0OworICB2b2lkIHNldF9lbmRwb2ludCg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIHZhbHVlKTsKKwogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50KQogIHByaXZhdGU6CiAgIGlubGluZSB2b2lkIHNldF9oYXNfc3RhdHVzKCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19zdGF0dXMoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19lbmRwb2ludCgpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZW5kcG9pbnQoKTsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgX3Vua25vd25fZmllbGRzXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogX2FyZW5hX3B0cl87CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQgPiByZXN1bHRfOwogICBpbnQgc3RhdHVzXzsKICAgaW50IGVuZHBvaW50XzsKLSAgCi0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07Ci0gIAorICAjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90b19pbXBsKCk7CisgICNlbHNlCiAgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CisgICNlbmRpZgogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgU3BlZWNoUmVjb2duaXRpb25FdmVudCogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtMTk3LDg5ICsyNTAsMTI1IEBACiAgcHVibGljOgogICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCgpOwogICB2aXJ0dWFsIH5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCgpOwotICAKKwogICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdChjb25zdCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgb3BlcmF0b3I9KGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0JiBmcm9tKSB7CiAgICAgQ29weUZyb20oZnJvbSk7CiAgICAgcmV0dXJuICp0aGlzOwogICB9Ci0gIAorCisgIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXy5HZXROb0FyZW5hKAorICAgICAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICB9CisKKyAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc18uTXV0YWJsZU5vQXJlbmEoCisgICAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIH0KKwogICBzdGF0aWMgY29uc3QgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCi0gIHZvaWQgU3dhcChTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogb3RoZXIpOwotICAKKworICAjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICAvLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBkZWZhdWx0IGluc3RhbmNlIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gY2FuCisgIC8vIHJldHVybiBOVUxMIHRodXMgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHRoZSB1c2VyLiBUaGlzIGlzIGludGVuZGVkCisgIC8vIGZvciBQcm90b2J1ZiBpbnRlcm5hbCBjb2RlLiBQbGVhc2UgdXNlIGRlZmF1bHRfaW5zdGFuY2UoKSBkZWNsYXJlZAorICAvLyBhYm92ZSBpbnN0ZWFkLgorICBzdGF0aWMgaW5saW5lIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBpbnRlcm5hbF9kZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiBkZWZhdWx0X2luc3RhbmNlXzsKKyAgfQorICAjZW5kaWYKKworICBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHZvaWQgU3dhcChTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogb3RoZXIpOworCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSk7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKICAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgdm9pZCBEaXNjYXJkVW5rbm93bkZpZWxkcygpOwogICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KICAgcHJpdmF0ZToKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9hcmVuYV9wdHJfOworICB9CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfYXJlbmFfcHRyXzsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6c3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSBhbHRlcm5hdGl2ZSA9IDE7Ci0gIGlubGluZSBpbnQgYWx0ZXJuYXRpdmVfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9hbHRlcm5hdGl2ZSgpOworICBpbnQgYWx0ZXJuYXRpdmVfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2FsdGVybmF0aXZlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0FsdGVybmF0aXZlRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGFsdGVybmF0aXZlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogbXV0YWJsZV9hbHRlcm5hdGl2ZShpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIGFkZF9hbHRlcm5hdGl2ZSgpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSA+JgotICAgICAgYWx0ZXJuYXRpdmUoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUgPioKKyAgY29uc3QgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGFsdGVybmF0aXZlKGludCBpbmRleCkgY29uc3Q7CisgIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBtdXRhYmxlX2FsdGVybmF0aXZlKGludCBpbmRleCk7CisgIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBhZGRfYWx0ZXJuYXRpdmUoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSA+KgogICAgICAgbXV0YWJsZV9hbHRlcm5hdGl2ZSgpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSA+JgorICAgICAgYWx0ZXJuYXRpdmUoKSBjb25zdDsKKwogICAvLyBvcHRpb25hbCBib29sIGZpbmFsID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaW5saW5lIGJvb2wgaGFzX2ZpbmFsKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2ZpbmFsKCk7CisgIGJvb2wgaGFzX2ZpbmFsKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZmluYWwoKTsKICAgc3RhdGljIGNvbnN0IGludCBrRmluYWxGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBib29sIGZpbmFsKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9maW5hbChib29sIHZhbHVlKTsKLSAgCisgIGJvb2wgZmluYWwoKSBjb25zdDsKKyAgdm9pZCBzZXRfZmluYWwoYm9vbCB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgZmxvYXQgc3RhYmlsaXR5ID0gMzsKLSAgaW5saW5lIGJvb2wgaGFzX3N0YWJpbGl0eSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zdGFiaWxpdHkoKTsKKyAgYm9vbCBoYXNfc3RhYmlsaXR5KCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfc3RhYmlsaXR5KCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga1N0YWJpbGl0eUZpZWxkTnVtYmVyID0gMzsKLSAgaW5saW5lIGZsb2F0IHN0YWJpbGl0eSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfc3RhYmlsaXR5KGZsb2F0IHZhbHVlKTsKLSAgCisgIGZsb2F0IHN0YWJpbGl0eSgpIGNvbnN0OworICB2b2lkIHNldF9zdGFiaWxpdHkoZmxvYXQgdmFsdWUpOworCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KQogIHByaXZhdGU6CiAgIGlubGluZSB2b2lkIHNldF9oYXNfZmluYWwoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2ZpbmFsKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfc3RhYmlsaXR5KCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19zdGFiaWxpdHkoKTsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgX3Vua25vd25fZmllbGRzXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogX2FyZW5hX3B0cl87CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSA+IGFsdGVybmF0aXZlXzsKICAgYm9vbCBmaW5hbF87CiAgIGZsb2F0IHN0YWJpbGl0eV87Ci0gIAotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOwotICAKKyAgI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVIKKyAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG9faW1wbCgpOworICAjZWxzZQogICBmcmllbmQgdm9pZCAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOworICAjZW5kaWYKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKLSAgCisKICAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgc3RhdGljIFNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBkZWZhdWx0X2luc3RhbmNlXzsKIH07CkBAIC0yODksODAgKzM3OCwxMTcgQEAKICBwdWJsaWM6CiAgIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUoKTsKICAgdmlydHVhbCB+U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSgpOwotICAKKwogICBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pOwotICAKKwogICBpbmxpbmUgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSYgb3BlcmF0b3I9KGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKKyAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfLkdldE5vQXJlbmEoCisgICAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIH0KKworICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXy5NdXRhYmxlTm9BcmVuYSgKKyAgICAgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgfQorCiAgIHN0YXRpYyBjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAotICB2b2lkIFN3YXAoU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogb3RoZXIpOwotICAKKworICAjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUgorICAvLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBkZWZhdWx0IGluc3RhbmNlIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gY2FuCisgIC8vIHJldHVybiBOVUxMIHRodXMgc2hvdWxkIG5vdCBiZSB1c2VkIGJ5IHRoZSB1c2VyLiBUaGlzIGlzIGludGVuZGVkCisgIC8vIGZvciBQcm90b2J1ZiBpbnRlcm5hbCBjb2RlLiBQbGVhc2UgdXNlIGRlZmF1bHRfaW5zdGFuY2UoKSBkZWNsYXJlZAorICAvLyBhYm92ZSBpbnN0ZWFkLgorICBzdGF0aWMgaW5saW5lIGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7CisgICAgcmV0dXJuIGRlZmF1bHRfaW5zdGFuY2VfOworICB9CisgICNlbmRpZgorCisgIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgdm9pZCBTd2FwKFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIG90aGVyKTsKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlJiBmcm9tKTsKICAgdm9pZCBDbGVhcigpOwogICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCisKICAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CiAgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwogICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICB2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKCk7CiAgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQogICBwcml2YXRlOgogICB2b2lkIFNoYXJlZEN0b3IoKTsKICAgdm9pZCBTaGFyZWREdG9yKCk7CiAgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUqIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfYXJlbmFfcHRyXzsKKyAgfQorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2FyZW5hX3B0cl87CisgIH0KICAgcHVibGljOgotICAKKwogICA6OnN0ZDo6c3RyaW5nIEdldFR5cGVOYW1lKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFuc2NyaXB0ID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3RyYW5zY3JpcHQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdHJhbnNjcmlwdCgpOworICBib29sIGhhc190cmFuc2NyaXB0KCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfdHJhbnNjcmlwdCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtUcmFuc2NyaXB0RmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgdHJhbnNjcmlwdCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfdHJhbnNjcmlwdChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF90cmFuc2NyaXB0KGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3RyYW5zY3JpcHQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdHJhbnNjcmlwdCgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV90cmFuc2NyaXB0KCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiB0cmFuc2NyaXB0KCkgY29uc3Q7CisgIHZvaWQgc2V0X3RyYW5zY3JpcHQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF90cmFuc2NyaXB0KGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfdHJhbnNjcmlwdChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3RyYW5zY3JpcHQoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV90cmFuc2NyaXB0KCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF90cmFuc2NyaXB0KDo6c3RkOjpzdHJpbmcqIHRyYW5zY3JpcHQpOworCiAgIC8vIG9wdGlvbmFsIGZsb2F0IGNvbmZpZGVuY2UgPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfY29uZmlkZW5jZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9jb25maWRlbmNlKCk7CisgIGJvb2wgaGFzX2NvbmZpZGVuY2UoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9jb25maWRlbmNlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0NvbmZpZGVuY2VGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBmbG9hdCBjb25maWRlbmNlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9jb25maWRlbmNlKGZsb2F0IHZhbHVlKTsKLSAgCisgIGZsb2F0IGNvbmZpZGVuY2UoKSBjb25zdDsKKyAgdm9pZCBzZXRfY29uZmlkZW5jZShmbG9hdCB2YWx1ZSk7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSkKICBwcml2YXRlOgogICBpbmxpbmUgdm9pZCBzZXRfaGFzX3RyYW5zY3JpcHQoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3RyYW5zY3JpcHQoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19jb25maWRlbmNlKCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19jb25maWRlbmNlKCk7Ci0gIAotICA6OnN0ZDo6c3RyaW5nKiB0cmFuc2NyaXB0XzsKLSAgZmxvYXQgY29uZmlkZW5jZV87Ci0gIAorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIF91bmtub3duX2ZpZWxkc187CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIF9hcmVuYV9wdHJfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CiAgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDIgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciB0cmFuc2NyaXB0XzsKKyAgZmxvYXQgY29uZmlkZW5jZV87CisgICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSCisgIGZyaWVuZCB2b2lkICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvX2ltcGwoKTsKKyAgI2Vsc2UKICAgZnJpZW5kIHZvaWQgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKKyAgI2VuZGlmCiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzVmc3RyZWFtaW5nXzVmYXBpXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV81ZnN0cmVhbWluZ181ZmFwaV8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBkZWZhdWx0X2luc3RhbmNlXzsKIH07CkBAIC0zNzEsNiArNDk3LDcgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisjaWYgIVBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogLy8gU3BlZWNoUmVjb2duaXRpb25FdmVudAogCiAvLyBvcHRpb25hbCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LlN0YXR1c0NvZGUgc3RhdHVzID0gMSBbZGVmYXVsdCA9IFNUQVRVU19TVUNDRVNTXTsKQEAgLTM4OCwxMiArNTE1LDE0IEBACiAgIGNsZWFyX2hhc19zdGF0dXMoKTsKIH0KIGlubGluZSA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnN0YXR1cygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuc3RhdHVzKQogICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGUgPihzdGF0dXNfKTsKIH0KIGlubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnNldF9zdGF0dXMoOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZSB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkV2ZW50X1N0YXR1c0NvZGVfSXNWYWxpZCh2YWx1ZSkpOworICBhc3NlcnQoOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfU3RhdHVzQ29kZV9Jc1ZhbGlkKHZhbHVlKSk7CiAgIHNldF9oYXNfc3RhdHVzKCk7CiAgIHN0YXR1c18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuc3RhdHVzKQogfQogCiAvLyByZXBlYXRlZCAuY29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdCByZXN1bHQgPSAyOwpAQCAtNDA0LDIyICs1MzMsMjcgQEAKICAgcmVzdWx0Xy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvblJlc3VsdCYgU3BlZWNoUmVjb2duaXRpb25FdmVudDo6cmVzdWx0KGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5yZXN1bHQpCiAgIHJldHVybiByZXN1bHRfLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjptdXRhYmxlX3Jlc3VsdChpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LnJlc3VsdCkKICAgcmV0dXJuIHJlc3VsdF8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0KiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjphZGRfcmVzdWx0KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5yZXN1bHQpCiAgIHJldHVybiByZXN1bHRfLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0ID4mCi1TcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpyZXN1bHQoKSBjb25zdCB7Ci0gIHJldHVybiByZXN1bHRfOwotfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uUmVzdWx0ID4qCiBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjptdXRhYmxlX3Jlc3VsdCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQucmVzdWx0KQogICByZXR1cm4gJnJlc3VsdF87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25SZXN1bHQgPiYKK1NwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnJlc3VsdCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkV2ZW50LnJlc3VsdCkKKyAgcmV0dXJuIHJlc3VsdF87Cit9CiAKIC8vIG9wdGlvbmFsIC5jb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuRW5kcG9pbnRlckV2ZW50VHlwZSBlbmRwb2ludCA9IDQ7CiBpbmxpbmUgYm9vbCBTcGVlY2hSZWNvZ25pdGlvbkV2ZW50OjpoYXNfZW5kcG9pbnQoKSBjb25zdCB7CkBAIC00MzYsMTIgKzU3MCwxNCBAQAogICBjbGVhcl9oYXNfZW5kcG9pbnQoKTsKIH0KIGlubGluZSA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OmVuZHBvaW50KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25FdmVudC5lbmRwb2ludCkKICAgcmV0dXJuIHN0YXRpY19jYXN0PCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlID4oZW5kcG9pbnRfKTsKIH0KIGlubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uRXZlbnQ6OnNldF9lbmRwb2ludCg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uRXZlbnRfRW5kcG9pbnRlckV2ZW50VHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIGFzc2VydCg6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlX0lzVmFsaWQodmFsdWUpKTsKICAgc2V0X2hhc19lbmRwb2ludCgpOwogICBlbmRwb2ludF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uRXZlbnQuZW5kcG9pbnQpCiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTQ1NiwyMiArNTkyLDI3IEBACiAgIGFsdGVybmF0aXZlXy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlJiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6YWx0ZXJuYXRpdmUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdC5hbHRlcm5hdGl2ZSkKICAgcmV0dXJuIGFsdGVybmF0aXZlXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlKiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6bXV0YWJsZV9hbHRlcm5hdGl2ZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdC5hbHRlcm5hdGl2ZSkKICAgcmV0dXJuIGFsdGVybmF0aXZlXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSogU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmFkZF9hbHRlcm5hdGl2ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0LmFsdGVybmF0aXZlKQogICByZXR1cm4gYWx0ZXJuYXRpdmVfLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpjb2JhbHQ6OnNwZWVjaDo6cHJvdG86OlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUgPiYKLVNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjphbHRlcm5hdGl2ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGFsdGVybmF0aXZlXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlID4qCiBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6bXV0YWJsZV9hbHRlcm5hdGl2ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0LmFsdGVybmF0aXZlKQogICByZXR1cm4gJmFsdGVybmF0aXZlXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Y29iYWx0OjpzcGVlY2g6OnByb3RvOjpTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlID4mCitTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6YWx0ZXJuYXRpdmUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuYWx0ZXJuYXRpdmUpCisgIHJldHVybiBhbHRlcm5hdGl2ZV87Cit9CiAKIC8vIG9wdGlvbmFsIGJvb2wgZmluYWwgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwogaW5saW5lIGJvb2wgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6Omhhc19maW5hbCgpIGNvbnN0IHsKQEAgLTQ4OCwxMSArNjI5LDEzIEBACiAgIGNsZWFyX2hhc19maW5hbCgpOwogfQogaW5saW5lIGJvb2wgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OmZpbmFsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuZmluYWwpCiAgIHJldHVybiBmaW5hbF87CiB9CiBpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvblJlc3VsdDo6c2V0X2ZpbmFsKGJvb2wgdmFsdWUpIHsKICAgc2V0X2hhc19maW5hbCgpOwogICBmaW5hbF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uUmVzdWx0LmZpbmFsKQogfQogCiAvLyBvcHRpb25hbCBmbG9hdCBzdGFiaWxpdHkgPSAzOwpAQCAtNTEwLDExICs2NTMsMTMgQEAKICAgY2xlYXJfaGFzX3N0YWJpbGl0eSgpOwogfQogaW5saW5lIGZsb2F0IFNwZWVjaFJlY29nbml0aW9uUmVzdWx0OjpzdGFiaWxpdHkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvblJlc3VsdC5zdGFiaWxpdHkpCiAgIHJldHVybiBzdGFiaWxpdHlfOwogfQogaW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQ6OnNldF9zdGFiaWxpdHkoZmxvYXQgdmFsdWUpIHsKICAgc2V0X2hhc19zdGFiaWxpdHkoKTsKICAgc3RhYmlsaXR5XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25SZXN1bHQuc3RhYmlsaXR5KQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MzIsNTEgKzY3Nyw0NyBAQAogICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKIH0KIGlubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmNsZWFyX3RyYW5zY3JpcHQoKSB7Ci0gIGlmICh0cmFuc2NyaXB0XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgdHJhbnNjcmlwdF8tPmNsZWFyKCk7Ci0gIH0KKyAgdHJhbnNjcmlwdF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfdHJhbnNjcmlwdCgpOwogfQogaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnRyYW5zY3JpcHQoKSBjb25zdCB7Ci0gIHJldHVybiAqdHJhbnNjcmlwdF87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlLnRyYW5zY3JpcHQpCisgIHJldHVybiB0cmFuc2NyaXB0Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpzZXRfdHJhbnNjcmlwdChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX3RyYW5zY3JpcHQoKTsKLSAgaWYgKHRyYW5zY3JpcHRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICB0cmFuc2NyaXB0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHRyYW5zY3JpcHRfLT5hc3NpZ24odmFsdWUpOworICB0cmFuc2NyaXB0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZS50cmFuc2NyaXB0KQogfQogaW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X3RyYW5zY3JpcHQoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc190cmFuc2NyaXB0KCk7Ci0gIGlmICh0cmFuc2NyaXB0XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgdHJhbnNjcmlwdF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICB0cmFuc2NyaXB0Xy0+YXNzaWduKHZhbHVlKTsKKyAgdHJhbnNjcmlwdF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZS50cmFuc2NyaXB0KQogfQogaW5saW5lIHZvaWQgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6c2V0X3RyYW5zY3JpcHQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfdHJhbnNjcmlwdCgpOwotICBpZiAodHJhbnNjcmlwdF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHRyYW5zY3JpcHRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgdHJhbnNjcmlwdF8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICB0cmFuc2NyaXB0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUudHJhbnNjcmlwdCkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjptdXRhYmxlX3RyYW5zY3JpcHQoKSB7CiAgIHNldF9oYXNfdHJhbnNjcmlwdCgpOwotICBpZiAodHJhbnNjcmlwdF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHRyYW5zY3JpcHRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIHRyYW5zY3JpcHRfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUudHJhbnNjcmlwdCkKKyAgcmV0dXJuIHRyYW5zY3JpcHRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZTo6cmVsZWFzZV90cmFuc2NyaXB0KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUudHJhbnNjcmlwdCkKICAgY2xlYXJfaGFzX3RyYW5zY3JpcHQoKTsKLSAgaWYgKHRyYW5zY3JpcHRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHRyYW5zY3JpcHRfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlOjpzZXRfYWxsb2NhdGVkX3RyYW5zY3JpcHQoOjpzdGQ6OnN0cmluZyogdHJhbnNjcmlwdCkgeworICBpZiAodHJhbnNjcmlwdCAhPSBOVUxMKSB7CisgICAgc2V0X2hhc190cmFuc2NyaXB0KCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IHRyYW5zY3JpcHRfOwotICAgIHRyYW5zY3JpcHRfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc190cmFuc2NyaXB0KCk7CiAgIH0KKyAgdHJhbnNjcmlwdF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHRyYW5zY3JpcHQpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpjb2JhbHQuc3BlZWNoLnByb3RvLlNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmUudHJhbnNjcmlwdCkKIH0KIAogLy8gb3B0aW9uYWwgZmxvYXQgY29uZmlkZW5jZSA9IDI7CkBAIC01OTQsMTMgKzczNSwyMCBAQAogICBjbGVhcl9oYXNfY29uZmlkZW5jZSgpOwogfQogaW5saW5lIGZsb2F0IFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OmNvbmZpZGVuY2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Y29iYWx0LnNwZWVjaC5wcm90by5TcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlLmNvbmZpZGVuY2UpCiAgIHJldHVybiBjb25maWRlbmNlXzsKIH0KIGlubGluZSB2b2lkIFNwZWVjaFJlY29nbml0aW9uQWx0ZXJuYXRpdmU6OnNldF9jb25maWRlbmNlKGZsb2F0IHZhbHVlKSB7CiAgIHNldF9oYXNfY29uZmlkZW5jZSgpOwogICBjb25maWRlbmNlXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OmNvYmFsdC5zcGVlY2gucHJvdG8uU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZS5jb25maWRlbmNlKQogfQogCisjZW5kaWYgIC8vICFQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiAKIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCiAKQEAgLTYwOCw2ICs3NTYsMTcgQEAKIH0gIC8vIG5hbWVzcGFjZSBzcGVlY2gKIH0gIC8vIG5hbWVzcGFjZSBjb2JhbHQKIAorI2lmbmRlZiBTV0lHCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc19wcm90b19lbnVtPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9TdGF0dXNDb2RlPiA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+IHN0cnVjdCBpc19wcm90b19lbnVtPCA6OmNvYmFsdDo6c3BlZWNoOjpwcm90bzo6U3BlZWNoUmVjb2duaXRpb25FdmVudF9FbmRwb2ludGVyRXZlbnRUeXBlPiA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSB7fTsKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIFNXSUcKKwogLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKIAogI2VuZGlmICAvLyBQUk9UT0JVRl9nb29nbGVfNWZzdHJlYW1pbmdfNWZhcGlfMmVwcm90b19fSU5DTFVERUQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmUuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmUuaAppbmRleCA0YzBkODdiLi5lNjQzY2M2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX01JQ1JPUEhPTkVfSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9NSUNST1BIT05FX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX2Zha2UuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX2Zha2UuY2MKaW5kZXggMzFkMzcyYi4uMGJiNTI3NiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9mYWtlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfZmFrZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfZmFrZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX2Zha2UuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfZmFrZS5oCmluZGV4IDA2OGVjYTMuLmYzMDRkMjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfZmFrZS5oCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfZmFrZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX01JQ1JPUEhPTkVfRkFLRV9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX01JQ1JPUEhPTkVfRkFLRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9tYW5hZ2VyLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9tYW5hZ2VyLmNjCmluZGV4IDQzMWU3YTQuLjJmYWYzMjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9tYW5hZ2VyLmggYi9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaAppbmRleCAwOGVhZjZlLi41ZWVlYmRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX21hbmFnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NQRUVDSF9NSUNST1BIT05FX01BTkFHRVJfSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9NSUNST1BIT05FX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfc3RhcmJvYXJkLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9zdGFyYm9hcmQuY2MKaW5kZXggNjc2YzBhYS4uMDdiMTNiMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9zdGFyYm9hcmQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX3N0YXJib2FyZC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX3N0YXJib2FyZC5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvbWljcm9waG9uZV9zdGFyYm9hcmQuaAppbmRleCA5ZGY4NDFhLi45OWQyY2FhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9taWNyb3Bob25lX3N0YXJib2FyZC5oCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL21pY3JvcGhvbmVfc3RhcmJvYXJkLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfTUlDUk9QSE9ORV9TVEFSQk9BUkRfSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9NSUNST1BIT05FX1NUQVJCT0FSRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvc2FuZGJveC9hdWRpb19sb2FkZXIuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L2F1ZGlvX2xvYWRlci5jYwppbmRleCAxZjgzMTMyLi45ZjI3NGZiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L2F1ZGlvX2xvYWRlci5jYworKysgYi9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L2F1ZGlvX2xvYWRlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL3NhbmRib3gvYXVkaW9fbG9hZGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NhbmRib3gvYXVkaW9fbG9hZGVyLmggYi9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L2F1ZGlvX2xvYWRlci5oCmluZGV4IDkyMTcxM2UuLjcwMGVlNTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NhbmRib3gvYXVkaW9fbG9hZGVyLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc2FuZGJveC9hdWRpb19sb2FkZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NQRUVDSF9TQU5EQk9YX0FVRElPX0xPQURFUl9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX1NBTkRCT1hfQVVESU9fTE9BREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L3NwZWVjaF9zYW5kYm94LmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvc2FuZGJveC9zcGVlY2hfc2FuZGJveC5jYwppbmRleCA3MDAxNDNkLi42M2QyODg5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L3NwZWVjaF9zYW5kYm94LmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NhbmRib3gvc3BlZWNoX3NhbmRib3guY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9zYW5kYm94L3NwZWVjaF9zYW5kYm94LmgiCiAKQEAgLTc2LDcgKzc0LDcgQEAKICAgICBjb25zdCBkb206OkRPTVNldHRpbmdzOjpPcHRpb25zJiBkb21fc2V0dGluZ3Nfb3B0aW9ucykgewogICBzY29wZWRfcHRyPHNjcmlwdDo6RW52aXJvbm1lbnRTZXR0aW5ncz4gZW52aXJvbm1lbnRfc2V0dGluZ3MoCiAgICAgICBuZXcgZG9tOjpET01TZXR0aW5ncyhrRE9NTWF4RWxlbWVudERlcHRoLCBOVUxMLCBuZXR3b3JrX21vZHVsZV8uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwgTlVMTCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvbV9zZXR0aW5nc19vcHRpb25zKSk7CiAgIERDSEVDSyhlbnZpcm9ubWVudF9zZXR0aW5ncyk7CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NhbmRib3gvc3BlZWNoX3NhbmRib3guaCBiL3NyYy9jb2JhbHQvc3BlZWNoL3NhbmRib3gvc3BlZWNoX3NhbmRib3guaAppbmRleCAxNWJiZDYwLi4xZTYxNWM4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L3NwZWVjaF9zYW5kYm94LmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc2FuZGJveC9zcGVlY2hfc2FuZGJveC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX1NBTkRCT1hfU1BFRUNIX1NBTkRCT1hfSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9TQU5EQk9YX1NQRUVDSF9TQU5EQk9YX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L3NwZWVjaF9zYW5kYm94X21haW4uY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9zYW5kYm94L3NwZWVjaF9zYW5kYm94X21haW4uY2MKaW5kZXggMmNiYjg3NC4uNDBlYTNmOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvc2FuZGJveC9zcGVlY2hfc2FuZGJveF9tYWluLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NhbmRib3gvc3BlZWNoX3NhbmRib3hfbWFpbi5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL2ZpbGVfcGF0aC5oIgogI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfY29uZmlndXJhdGlvbi5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX2NvbmZpZ3VyYXRpb24uaAppbmRleCA5N2FiNzZmLi4wNzUwYzA0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfY29uZmlndXJhdGlvbi5oCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9jb25maWd1cmF0aW9uLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfU1BFRUNIX0NPTkZJR1VSQVRJT05fSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9TUEVFQ0hfQ09ORklHVVJBVElPTl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uLmNjCmluZGV4IDA2ZGVjYTAuLjllYjhhYjggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbi5jYworKysgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb24uaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uLmggYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb24uaAppbmRleCAwMjAyMjlmLi4yMzJlMTA4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb24uaAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb24uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NQRUVDSF9TUEVFQ0hfUkVDT0dOSVRJT05fSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9TUEVFQ0hfUkVDT0dOSVRJT05fSF8KQEAgLTYyLDQzICs2MCw0MyBAQAogICB9CiAKICAgLy8gRmlyZWQgd2hlbiBzb21lIHNvdW5kLCBwb3NzaWJseSBzcGVlY2gsIGhhcyBiZWVuIGRldGVjdGVkLgotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbnNvdW5kc3RhcnQoKSBjb25zdCB7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25zb3VuZHN0YXJ0KCkgY29uc3QgewogICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6c291bmRzdGFydCgpKTsKICAgfQotICB2b2lkIHNldF9vbnNvdW5kc3RhcnQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgbGlzdGVuZXIpIHsKKyAgdm9pZCBzZXRfb25zb3VuZHN0YXJ0KGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpIHsKICAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6c291bmRzdGFydCgpLCBsaXN0ZW5lcik7CiAgIH0KIAogICAvLyBGaXJlZCB3aGVuIHNvbWUgc291bmQgaXMgbm8gbG9uZ2VyIGRldGVjdGVkLgotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbnNvdW5kZW5kKCkgY29uc3QgeworICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9uc291bmRlbmQoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpzb3VuZGVuZCgpKTsKICAgfQotICB2b2lkIHNldF9vbnNvdW5kZW5kKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKSB7CisgIHZvaWQgc2V0X29uc291bmRlbmQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lcikgewogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpzb3VuZGVuZCgpLCBsaXN0ZW5lcik7CiAgIH0KIAogICAvLyBGaXJlZCB3aGVuIHRoZSBzcGVlY2ggcmVjb2duaXplciByZXR1cm5zIGEgcmVzdWx0LgotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbnJlc3VsdCgpIGNvbnN0IHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbnJlc3VsdCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OnJlc3VsdCgpKTsKICAgfQotICB2b2lkIHNldF9vbnJlc3VsdChjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lcikgeworICB2b2lkIHNldF9vbnJlc3VsdChjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKSB7CiAgICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OnJlc3VsdCgpLCBsaXN0ZW5lcik7CiAgIH0KIAogICAvLyBGaXJlZCB3aGVuIHRoZSBzcGVlY2ggcmVjb2duaXplciByZXR1cm5zIGEgZmluYWwgcmVzdWx0IHdpdGggbm8gcmVjb2duaXRpb24KICAgLy8gaHlwb3RoZXNpcyB0aGF0IG1lZXQgb3IgZXhjZWVkIHRoZSBjb25maWRlbmNlIHRocmVzaG9sZC4KLSAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCogb25ub21hdGNoKCkgY29uc3QgeworICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9ubm9tYXRjaCgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6Om5vbWF0Y2goKSk7CiAgIH0KLSAgdm9pZCBzZXRfb25ub21hdGNoKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKSB7CisgIHZvaWQgc2V0X29ubm9tYXRjaChjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKSB7CiAgICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6Om5vbWF0Y2goKSwgbGlzdGVuZXIpOwogICB9CiAKICAgLy8gRmlyZWQgd2hlbiB0aGUgc3BlZWNoIHJlY29nbml0aW9uIGVycm9yIG9jY3Vycy4KLSAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCogb25lcnJvcigpIGNvbnN0IHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbmVycm9yKCkgY29uc3QgewogICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZXJyb3IoKSk7CiAgIH0KLSAgdm9pZCBzZXRfb25lcnJvcihjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lcikgeworICB2b2lkIHNldF9vbmVycm9yKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpIHsKICAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZXJyb3IoKSwgbGlzdGVuZXIpOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbi5pZGwgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb24uaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYzMDQ0NGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb24uaWRsCkBAIC0wLDAgKzEsNDEgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vZHZjcy53My5vcmcvaGcvc3BlZWNoLWFwaS9yYXctZmlsZS85YTAwNzVkMjUzMjYvc3BlZWNoYXBpLmh0bWwjc3BlZWNocmVjby1zZWN0aW9uCisKK1sKKyAgQ29uc3RydWN0b3IsCisgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncywKK10KK2ludGVyZmFjZSBTcGVlY2hSZWNvZ25pdGlvbiA6IEV2ZW50VGFyZ2V0IHsKKyAgLy8gcmVjb2duaXRpb24gcGFyYW1ldGVycworICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGxhbmc7CisgIGF0dHJpYnV0ZSBib29sZWFuIGNvbnRpbnVvdXM7CisgIGF0dHJpYnV0ZSBib29sZWFuIGludGVyaW1SZXN1bHRzOworICBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBtYXhBbHRlcm5hdGl2ZXM7CisKKyAgLy8gbWV0aG9kcyB0byBkcml2ZSB0aGUgc3BlZWNoIGludGVyYWN0aW9uCisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc3RhcnQoKTsKKyAgdm9pZCBzdG9wKCk7CisgIHZvaWQgYWJvcnQoKTsKKworICAvLyBldmVudCBtZXRob2RzCisgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25zb3VuZHN0YXJ0OworICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uc291bmRlbmQ7CisgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25yZXN1bHQ7CisgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25ub21hdGNoOworICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9uZXJyb3I7Cit9OworCit0eXBlZGVmIEV2ZW50TGlzdGVuZXI/IEV2ZW50SGFuZGxlcjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9hbHRlcm5hdGl2ZS5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9hbHRlcm5hdGl2ZS5jYwppbmRleCBjODg5MmY5Li42ZTcwMjRkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fYWx0ZXJuYXRpdmUuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9hbHRlcm5hdGl2ZS5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmgKaW5kZXggNDE5MWIxMy4uNGI2Njc4MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfU1BFRUNIX1JFQ09HTklUSU9OX0FMVEVSTkFUSVZFX0hfCiAjZGVmaW5lIENPQkFMVF9TUEVFQ0hfU1BFRUNIX1JFQ09HTklUSU9OX0FMVEVSTkFUSVZFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fYWx0ZXJuYXRpdmUuaWRsIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40NGQ5ZGY1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2FsdGVybmF0aXZlLmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL2R2Y3MudzMub3JnL2hnL3NwZWVjaC1hcGkvcmF3LWZpbGUvOWEwMDc1ZDI1MzI2L3NwZWVjaGFwaS5odG1sI3NwZWVjaHJlY28tc2VjdGlvbgorCitpbnRlcmZhY2UgU3BlZWNoUmVjb2duaXRpb25BbHRlcm5hdGl2ZSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgdHJhbnNjcmlwdDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGZsb2F0IGNvbmZpZGVuY2U7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2NvbmZpZy5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2NvbmZpZy5oCmluZGV4IGJlNDgyNjguLjk0OWRiZGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9jb25maWcuaAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fY29uZmlnLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfU1BFRUNIX1JFQ09HTklUSU9OX0NPTkZJR19IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX1NQRUVDSF9SRUNPR05JVElPTl9DT05GSUdfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9lcnJvci5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9lcnJvci5jYwppbmRleCA2NDJkNDllLi4zZDIyN2JmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fZXJyb3IuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9lcnJvci5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmgKaW5kZXggYTFkNDMwOS4uOWFlMzI5ZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfU1BFRUNIX1JFQ09HTklUSU9OX0VSUk9SX0hfCiAjZGVmaW5lIENPQkFMVF9TUEVFQ0hfU1BFRUNIX1JFQ09HTklUSU9OX0VSUk9SX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fZXJyb3IuaWRsIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOThkMzhlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2Vycm9yLmlkbApAQCAtMCwwICsxLDMxIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL2R2Y3MudzMub3JnL2hnL3NwZWVjaC1hcGkvcmF3LWZpbGUvOWEwMDc1ZDI1MzI2L3NwZWVjaGFwaS5odG1sI3NwZWVjaHJlY28tc2VjdGlvbgorCitlbnVtIEVycm9yQ29kZSB7CisgICJuby1zcGVlY2giLAorICAiYWJvcnRlZCIsCisgICJhdWRpby1jYXB0dXJlIiwKKyAgIm5ldHdvcmsiLAorICAibm90LWFsbG93ZWQiLAorICAic2VydmljZS1ub3QtYWxsb3dlZCIsCisgICJiYWQtZ3JhbW1hciIsCisgICJsYW5ndWFnZS1ub3Qtc3VwcG9ydGVkIgorfTsKKworaW50ZXJmYWNlIFNwZWVjaFJlY29nbml0aW9uRXJyb3IgOiBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBFcnJvckNvZGUgZXJyb3I7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgbWVzc2FnZTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fZXZlbnQuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fZXZlbnQuY2MKaW5kZXggZGNmMTE4NS4uNjU1OTkwNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2V2ZW50LmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9ldmVudC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9ldmVudC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fZXZlbnQuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9ldmVudC5oCmluZGV4IGU1MjJmYmMuLjNjYjJmNDEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9ldmVudC5oCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9ldmVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX1NQRUVDSF9SRUNPR05JVElPTl9FVkVOVF9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX1NQRUVDSF9SRUNPR05JVElPTl9FVkVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX2V2ZW50LmlkbCBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9ldmVudC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGFiN2M0MAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9ldmVudC5pZGwKQEAgLTAsMCArMSwyMCBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly9kdmNzLnczLm9yZy9oZy9zcGVlY2gtYXBpL3Jhdy1maWxlLzlhMDA3NWQyNTMyNi9zcGVlY2hhcGkuaHRtbCNzcGVlY2hyZWNvLXNlY3Rpb24KKworaW50ZXJmYWNlIFNwZWVjaFJlY29nbml0aW9uRXZlbnQgOiBFdmVudCB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHJlc3VsdEluZGV4OworICByZWFkb25seSBhdHRyaWJ1dGUgU3BlZWNoUmVjb2duaXRpb25SZXN1bHRMaXN0IHJlc3VsdHM7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fbWFuYWdlci5jYwppbmRleCA1ZTQwZWUyLi4yYWQzMWYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fbWFuYWdlci5jYworKysgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fbWFuYWdlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9tYW5hZ2VyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9tYW5hZ2VyLmggYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fbWFuYWdlci5oCmluZGV4IDMyM2MzODkuLmUxZjdmYWUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9tYW5hZ2VyLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX21hbmFnZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NQRUVDSF9TUEVFQ0hfUkVDT0dOSVRJT05fTUFOQUdFUl9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX1NQRUVDSF9SRUNPR05JVElPTl9NQU5BR0VSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0LmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdC5jYwppbmRleCBiYmY0M2QxLi5hNjBjNGRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0LmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHQuaCBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHQuaAppbmRleCBhNzQzMmIxLi5hNzdiMTBiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0LmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1BFRUNIX1NQRUVDSF9SRUNPR05JVElPTl9SRVNVTFRfSF8KICNkZWZpbmUgQ09CQUxUX1NQRUVDSF9TUEVFQ0hfUkVDT0dOSVRJT05fUkVTVUxUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0LmlkbCBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHQuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZjY1OWIKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0LmlkbApAQCAtMCwwICsxLDIyIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL2R2Y3MudzMub3JnL2hnL3NwZWVjaC1hcGkvcmF3LWZpbGUvOWEwMDc1ZDI1MzI2L3NwZWVjaGFwaS5odG1sI3NwZWVjaHJlY28tc2VjdGlvbgorCitpbnRlcmZhY2UgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQgeworICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBsZW5ndGg7CisgIGdldHRlciBTcGVlY2hSZWNvZ25pdGlvbkFsdGVybmF0aXZlIGl0ZW0odW5zaWduZWQgbG9uZyBpbmRleCk7CisgIC8vIGlzRmluYWwgaXMgZGlmZmVyZW50IGZyb20gdGhlIHNwZWMuLCBidXQgZm9sbG93cyB3aXRoIENocm9taXVtLgorICByZWFkb25seSBhdHRyaWJ1dGUgYm9vbGVhbiBpc0ZpbmFsOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHRfbGlzdC5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHRfbGlzdC5jYwppbmRleCBlYjA2NjAwLi43ZTAzY2QyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0X2xpc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdF9saXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdF9saXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pdGlvbl9yZXN1bHRfbGlzdC5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdF9saXN0LmgKaW5kZXggNWUyOWJhZi4uNjExOGFkMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdF9saXN0LmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdF9saXN0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfU1BFRUNIX1JFQ09HTklUSU9OX1JFU1VMVF9MSVNUX0hfCiAjZGVmaW5lIENPQkFMVF9TUEVFQ0hfU1BFRUNIX1JFQ09HTklUSU9OX1JFU1VMVF9MSVNUX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXRpb25fcmVzdWx0X2xpc3QuaWRsIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdF9saXN0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDhiMDNjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml0aW9uX3Jlc3VsdF9saXN0LmlkbApAQCAtMCwwICsxLDIwIEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL2R2Y3MudzMub3JnL2hnL3NwZWVjaC1hcGkvcmF3LWZpbGUvOWEwMDc1ZDI1MzI2L3NwZWVjaGFwaS5odG1sI3NwZWVjaHJlY28tc2VjdGlvbgorCitpbnRlcmZhY2UgU3BlZWNoUmVjb2duaXRpb25SZXN1bHRMaXN0IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbGVuZ3RoOworICBnZXR0ZXIgU3BlZWNoUmVjb2duaXRpb25SZXN1bHQgaXRlbSh1bnNpZ25lZCBsb25nIGluZGV4KTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXplci5jYyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pemVyLmNjCmluZGV4IDBjODBkNTcuLjkzNjA2ODggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pemVyLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pemVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogLy8gTm90ZSB0byBDb2JhbHQgcG9ydGVyczogVG8gdXNlIHRoZSB2MSBzcGVlY2gtYXBpIEFQSSwgeW91IG11c3QgcHJvdmlkZSBhbiBBUEkKIC8vIGtleSB3aXRoIHYxIHNwZWVjaC1hcGkgcXVvdGEuIFRoZSBjb2RlIGlzIHByb3ZpZGVkIGhlcmUsIGJ1dCBub3QgYW4gQVBJIGtleS4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pemVyLmggYi9zcmMvY29iYWx0L3NwZWVjaC9zcGVlY2hfcmVjb2duaXplci5oCmluZGV4IDVkYWMyYzYuLjc5ZWI2NzMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3NwZWVjaF9yZWNvZ25pemVyLmgKKysrIGIvc3JjL2NvYmFsdC9zcGVlY2gvc3BlZWNoX3JlY29nbml6ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NQRUVDSF9TUEVFQ0hfUkVDT0dOSVpFUl9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX1NQRUVDSF9SRUNPR05JWkVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3NwZWVjaC91cmxfZmV0Y2hlcl9mYWtlLmNjIGIvc3JjL2NvYmFsdC9zcGVlY2gvdXJsX2ZldGNoZXJfZmFrZS5jYwppbmRleCAyZDYyMWNiLi4xZjUwYzBkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3NwZWVjaC91cmxfZmV0Y2hlcl9mYWtlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3BlZWNoL3VybF9mZXRjaGVyX2Zha2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3NwZWVjaC91cmxfZmV0Y2hlcl9mYWtlLmgiCiAKQEAgLTIyLDYgKzIwLDcgQEAKICNpbmNsdWRlICJiYXNlL3N5c19ieXRlb3JkZXIuaCIKICNpbmNsdWRlICJjb2JhbHQvc3BlZWNoL2dvb2dsZV9zdHJlYW1pbmdfYXBpLnBiLmgiCiAjaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9mZXRjaGVyX2RlbGVnYXRlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKIG5hbWVzcGFjZSBzcGVlY2ggewpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zcGVlY2gvdXJsX2ZldGNoZXJfZmFrZS5oIGIvc3JjL2NvYmFsdC9zcGVlY2gvdXJsX2ZldGNoZXJfZmFrZS5oCmluZGV4IGNmM2MxNTAuLjI4MzhkNjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3BlZWNoL3VybF9mZXRjaGVyX2Zha2UuaAorKysgYi9zcmMvY29iYWx0L3NwZWVjaC91cmxfZmV0Y2hlcl9mYWtlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TUEVFQ0hfVVJMX0ZFVENIRVJfRkFLRV9IXwogI2RlZmluZSBDT0JBTFRfU1BFRUNIX1VSTF9GRVRDSEVSX0ZBS0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZS5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZS5jYwppbmRleCA4MGNjYjYyLi45MDZhMzY3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWUuY2MKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3NhdmVnYW1lLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZS5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lLmgKaW5kZXggNDAxZGQxMS4uZDYzNTQwMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lLmgKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TVE9SQUdFX1NBVkVHQU1FX0hfCiAjZGVmaW5lIENPQkFMVF9TVE9SQUdFX1NBVkVHQU1FX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfZmFrZS5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9mYWtlLmNjCmluZGV4IDFiY2QwM2QuLjVmNjFhNjYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9mYWtlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9mYWtlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmICFkZWZpbmVkKENPQkFMVF9CVUlMRF9UWVBFX0dPTEQpCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9mYWtlLmggYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfZmFrZS5oCmluZGV4IDBhOGZlMTguLmFiZGZjNDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9mYWtlLmgKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX2Zha2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NUT1JBR0VfU0FWRUdBTUVfRkFLRV9IXwogI2RlZmluZSBDT0JBTFRfU1RPUkFHRV9TQVZFR0FNRV9GQUtFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfZmlsZS5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9maWxlLmNjCmluZGV4IDA1MmIzMDcuLjdiYzQ2NjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9maWxlLmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9maWxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3NhdmVnYW1lLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9zdGFyYm9hcmQuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfc3RhcmJvYXJkLmNjCmluZGV4IGI0MjNjYTIuLjgyMDFiMTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV9zdGFyYm9hcmQuY2MKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX3N0YXJib2FyZC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90ZXN0LmNjCmluZGV4IDU4OWUyMTEuLjExODc1NTQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvZmlsZV9wYXRoLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfdGhyZWFkLmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX3RocmVhZC5jYwppbmRleCBkZDFjNTIzLi41MTdhZDRiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfdGhyZWFkLmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfdGhyZWFkLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuaCBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zYXZlZ2FtZV90aHJlYWQuaAppbmRleCAxZmZiZDc3Li40YjY1M2MyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc2F2ZWdhbWVfdGhyZWFkLmgKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3NhdmVnYW1lX3RocmVhZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1RPUkFHRV9TQVZFR0FNRV9USFJFQURfSF8KICNkZWZpbmUgQ09CQUxUX1NUT1JBR0VfU0FWRUdBTUVfVEhSRUFEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3FsX3Zmcy5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zcWxfdmZzLmNjCmluZGV4IDM4MTgzMTAuLjI2MmY4NzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zcWxfdmZzLmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zcWxfdmZzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3NxbF92ZnMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3NxbF92ZnMuaCBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zcWxfdmZzLmgKaW5kZXggN2QyY2Y2Zi4uODU0MGRjZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3NxbF92ZnMuaAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3FsX3Zmcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1RPUkFHRV9TUUxfVkZTX0hfCiAjZGVmaW5lIENPQkFMVF9TVE9SQUdFX1NRTF9WRlNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmNjCmluZGV4IDc5YTVjOGYuLjBmNDY3MGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oCmluZGV4IGY5MDk0MWEuLjUzY2Q0MjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXIuaAorKysgYi9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TVE9SQUdFX1NUT1JBR0VfTUFOQUdFUl9IXwogI2RlZmluZSBDT0JBTFRfU1RPUkFHRV9TVE9SQUdFX01BTkFHRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXJfdGVzdC5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS9zdG9yYWdlX21hbmFnZXJfdGVzdC5jYwppbmRleCA3MTYwODU0Li5mMmM1ZGUwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2Uvc3RvcmFnZV9tYW5hZ2VyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlcl90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3N0b3JhZ2VfbWFuYWdlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2UvdXBncmFkZS9zdG9yYWdlX3VwZ3JhZGVfdGVzdC5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS91cGdyYWRlL3N0b3JhZ2VfdXBncmFkZV90ZXN0LmNjCmluZGV4IDg3MjhiN2UuLmVmYzIyZTMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS91cGdyYWRlL3N0b3JhZ2VfdXBncmFkZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS91cGdyYWRlL3N0b3JhZ2VfdXBncmFkZV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPGNzdHJpbmc+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS91cGdyYWRlL3VwZ3JhZGVfcmVhZGVyLmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3VwZ3JhZGUvdXBncmFkZV9yZWFkZXIuY2MKaW5kZXggNjRlZjFhYS4uMjVjZWZmNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3VwZ3JhZGUvdXBncmFkZV9yZWFkZXIuY2MKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3VwZ3JhZGUvdXBncmFkZV9yZWFkZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2UvdXBncmFkZS91cGdyYWRlX3JlYWRlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2UvdXBncmFkZS91cGdyYWRlX3JlYWRlci5oIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3VwZ3JhZGUvdXBncmFkZV9yZWFkZXIuaAppbmRleCA4M2YwOTUzLi5mNTljN2JhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2UvdXBncmFkZS91cGdyYWRlX3JlYWRlci5oCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS91cGdyYWRlL3VwZ3JhZGVfcmVhZGVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TVE9SQUdFX1VQR1JBREVfVVBHUkFERV9SRUFERVJfSF8KICNkZWZpbmUgQ09CQUxUX1NUT1JBR0VfVVBHUkFERV9VUEdSQURFX1JFQURFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5jYyBiL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuY2MKaW5kZXggYmNmODA0Zi4uYTM4ZTMxZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5jYworKysgYi9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlLmggYi9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlLmgKaW5kZXggZjVhOWFlYy4uMmE4ODY3NSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZS5oCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGUuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NUT1JBR0VfVklSVFVBTF9GSUxFX0hfCiAjZGVmaW5lIENPQkFMVF9TVE9SQUdFX1ZJUlRVQUxfRklMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uY2MgYi9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbS5jYwppbmRleCA5OTUxZGY2Li42MmM2MDJlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbS5jYworKysgYi9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmggYi9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbS5oCmluZGV4IGJlZjlhNGMuLmYxNDk1NzYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtLmgKKysrIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW0uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NUT1JBR0VfVklSVFVBTF9GSUxFX1NZU1RFTV9IXwogI2RlZmluZSBDT0JBTFRfU1RPUkFHRV9WSVJUVUFMX0ZJTEVfU1lTVEVNX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbV90ZXN0LmNjIGIvc3JjL2NvYmFsdC9zdG9yYWdlL3ZpcnR1YWxfZmlsZV9zeXN0ZW1fdGVzdC5jYwppbmRleCBkZTM2ZjZmLi5iMzQwNzEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvc3RvcmFnZS92aXJ0dWFsX2ZpbGVfc3lzdGVtX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3N0b3JhZ2UvdmlydHVhbF9maWxlX3N5c3RlbS5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2FwcGxpY2F0aW9uX2V2ZW50LmggYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvYXBwbGljYXRpb25fZXZlbnQuaAppbmRleCAyNDhjZDliLi44MTUxNDcyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvYXBwbGljYXRpb25fZXZlbnQuaAorKysgYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvYXBwbGljYXRpb25fZXZlbnQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NZU1RFTV9XSU5ET1dfQVBQTElDQVRJT05fRVZFTlRfSF8KICNkZWZpbmUgQ09CQUxUX1NZU1RFTV9XSU5ET1dfQVBQTElDQVRJT05fRVZFTlRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9rZXlib2FyZF9ldmVudC5oIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2tleWJvYXJkX2V2ZW50LmgKaW5kZXggY2EzMzM0MC4uMmMzMzIwMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2tleWJvYXJkX2V2ZW50LmgKKysrIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L2tleWJvYXJkX2V2ZW50LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9TWVNURU1fV0lORE9XX0tFWUJPQVJEX0VWRU5UX0hfCiAjZGVmaW5lIENPQkFMVF9TWVNURU1fV0lORE9XX0tFWUJPQVJEX0VWRU5UX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvc3RhcmJvYXJkL3N5c3RlbV93aW5kb3cuY2MgYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvc3RhcmJvYXJkL3N5c3RlbV93aW5kb3cuY2MKaW5kZXggOTY2Mjc2Zi4uYmYxYjA3ZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N0YXJib2FyZC9zeXN0ZW1fd2luZG93LmNjCisrKyBiL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zdGFyYm9hcmQvc3lzdGVtX3dpbmRvdy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvc3RhcmJvYXJkL3N5c3RlbV93aW5kb3cuaCBiL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zdGFyYm9hcmQvc3lzdGVtX3dpbmRvdy5oCmluZGV4IGI3MzNiYjkuLjBjZDdkZTkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zdGFyYm9hcmQvc3lzdGVtX3dpbmRvdy5oCisrKyBiL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zdGFyYm9hcmQvc3lzdGVtX3dpbmRvdy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1lTVEVNX1dJTkRPV19TVEFSQk9BUkRfU1lTVEVNX1dJTkRPV19IXwogI2RlZmluZSBDT0JBTFRfU1lTVEVNX1dJTkRPV19TVEFSQk9BUkRfU1lTVEVNX1dJTkRPV19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaCBiL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93LmgKaW5kZXggODI2ODNlMC4uMTdmNWUyZiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaAorKysgYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvc3lzdGVtX3dpbmRvdy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfU1lTVEVNX1dJTkRPV19TWVNURU1fV0lORE9XX0hfCiAjZGVmaW5lIENPQkFMVF9TWVNURU1fV0lORE9XX1NZU1RFTV9XSU5ET1dfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93X2NvbW1vbi5jYyBiL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy9zeXN0ZW1fd2luZG93X2NvbW1vbi5jYwppbmRleCA1MGFlMTgzLi4yOGNhMDRmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvc3lzdGVtX3dpbmRvd19jb21tb24uY2MKKysrIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3dfY29tbW9uLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC9zeXN0ZW1fd2luZG93L3N5c3RlbV93aW5kb3cuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3dpbi9zeXN0ZW1fd2luZG93LmNjIGIvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3dpbi9zeXN0ZW1fd2luZG93LmNjCmluZGV4IDA5ZTQyMTcuLmU4NTM3MjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvc3lzdGVtX3dpbmRvdy93aW4vc3lzdGVtX3dpbmRvdy5jYworKysgYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvd2luL3N5c3RlbV93aW5kb3cuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3N5c3RlbV93aW5kb3cvd2luL3N5c3RlbV93aW5kb3cuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC9zeXN0ZW1fd2luZG93L3dpbi9zeXN0ZW1fd2luZG93LmggYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvd2luL3N5c3RlbV93aW5kb3cuaAppbmRleCA2OWFjNGU1Li42YWYyY2NmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvd2luL3N5c3RlbV93aW5kb3cuaAorKysgYi9zcmMvY29iYWx0L3N5c3RlbV93aW5kb3cvd2luL3N5c3RlbV93aW5kb3cuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1NZU1RFTV9XSU5ET1dfV0lOX1NZU1RFTV9XSU5ET1dfSF8KICNkZWZpbmUgQ09CQUxUX1NZU1RFTV9XSU5ET1dfV0lOX1NZU1RFTV9XSU5ET1dfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdGVzdC9kb2N1bWVudF9sb2FkZXIuaCBiL3NyYy9jb2JhbHQvdGVzdC9kb2N1bWVudF9sb2FkZXIuaAppbmRleCBmOTA1YTI5Li40ODRhOGZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3Rlc3QvZG9jdW1lbnRfbG9hZGVyLmgKKysrIGIvc3JjL2NvYmFsdC90ZXN0L2RvY3VtZW50X2xvYWRlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfVEVTVF9ET0NVTUVOVF9MT0FERVJfSF8KICNkZWZpbmUgQ09CQUxUX1RFU1RfRE9DVU1FTlRfTE9BREVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3Rlc3QvZW1wdHlfZG9jdW1lbnQuaCBiL3NyYy9jb2JhbHQvdGVzdC9lbXB0eV9kb2N1bWVudC5oCmluZGV4IGM2NTE1OWYuLmI2ZmZjY2YgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdGVzdC9lbXB0eV9kb2N1bWVudC5oCisrKyBiL3NyYy9jb2JhbHQvdGVzdC9lbXB0eV9kb2N1bWVudC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfVEVTVF9FTVBUWV9ET0NVTUVOVF9IXwogI2RlZmluZSBDT0JBTFRfVEVTVF9FTVBUWV9ET0NVTUVOVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90ZXN0L3J1bl9hbGxfdW5pdHRlc3RzLmNjIGIvc3JjL2NvYmFsdC90ZXN0L3J1bl9hbGxfdW5pdHRlc3RzLmNjCmluZGV4IGU2ZjI1ZWQuLjgzMzgyNjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdGVzdC9ydW5fYWxsX3VuaXR0ZXN0cy5jYworKysgYi9zcmMvY29iYWx0L3Rlc3QvcnVuX2FsbF91bml0dGVzdHMuY2MKQEAgLTE0LDYgKzE0LDcgQEAKIAogI2luY2x1ZGUgImJhc2UvYXRfZXhpdC5oIgogI2luY2x1ZGUgImJhc2UvcGF0aF9zZXJ2aWNlLmgiCisjaW5jbHVkZSAiYmFzZS90ZXN0L21haW5faG9vay5oIgogI2luY2x1ZGUgImJhc2UvdGVzdC90ZXN0X3N1aXRlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvY29iYWx0X3BhdGhzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcGF0aF9wcm92aWRlci5oIgpAQCAtMjIsNyArMjMsNyBAQAogCiBuYW1lc3BhY2UgewogaW50IEluaXRBbmRSdW5BbGxUZXN0cyhpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsKLSAgYmFzZTo6QXRFeGl0TWFuYWdlciBhdF9leGl0OworICBNYWluSG9vayBob29rKE5VTEwsIGFyZ2MsIGFyZ3YpOwogICBiYXNlOjpUZXN0U3VpdGUgdGVzdF9zdWl0ZShhcmdjLCBhcmd2KTsKICAgUGF0aFNlcnZpY2U6OlJlZ2lzdGVyUHJvdmlkZXIoJmNvYmFsdDo6UGF0aFByb3ZpZGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2JhbHQ6OnBhdGhzOjpQQVRIX0NPQkFMVF9TVEFSVCwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvYmVuY2htYXJrLmNjIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmsuY2MKaW5kZXggZjMzYTgxMC4uZDE1ODEyZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmsuY2MKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmsuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3RyYWNlX2V2ZW50L2JlbmNobWFyay5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2JlbmNobWFyay5oIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmsuaAppbmRleCBiMTA1ZjJkLi4wMzlmMmYyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2JlbmNobWFyay5oCisrKyBiL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvYmVuY2htYXJrLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9UUkFDRV9FVkVOVF9CRU5DSE1BUktfSF8KICNkZWZpbmUgQ09CQUxUX1RSQUNFX0VWRU5UX0JFTkNITUFSS19IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmtfcnVubmVyLmNjIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9iZW5jaG1hcmtfcnVubmVyLmNjCmluZGV4IDg1YTk0YmIuLjAxZTg2MDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvYmVuY2htYXJrX3J1bm5lci5jYworKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2JlbmNobWFya19ydW5uZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogI2luY2x1ZGUgPGNzdGRpbz4KICNpbmNsdWRlIDxtYXA+CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvZXZlbnRfcGFyc2VyLmNjIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9ldmVudF9wYXJzZXIuY2MKaW5kZXggZDQ3MDIxYy4uODk2ZmE0YiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9ldmVudF9wYXJzZXIuY2MKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9ldmVudF9wYXJzZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9oYXNoLmgiCiAjaW5jbHVkZSAiY29iYWx0L3RyYWNlX2V2ZW50L2V2ZW50X3BhcnNlci5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9ldmVudF9wYXJzZXIuaCBiL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvZXZlbnRfcGFyc2VyLmgKaW5kZXggMGZmOTZkYy4uNzhiNmJjOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9ldmVudF9wYXJzZXIuaAorKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2V2ZW50X3BhcnNlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfVFJBQ0VfRVZFTlRfRVZFTlRfUEFSU0VSX0hfCiAjZGVmaW5lIENPQkFMVF9UUkFDRV9FVkVOVF9FVkVOVF9QQVJTRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvZXZlbnRfcGFyc2VyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2V2ZW50X3BhcnNlcl90ZXN0LmNjCmluZGV4IGEyMzkzMzIuLjNkMjBhZmMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvZXZlbnRfcGFyc2VyX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9ldmVudF9wYXJzZXJfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvdHJhY2VfZXZlbnQvc2NvcGVkX2V2ZW50X3BhcnNlcl90cmFjZS5oIgogI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9qc29uX2ZpbGVfb3V0cHV0dGVyLmNjIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9qc29uX2ZpbGVfb3V0cHV0dGVyLmNjCmluZGV4IDFmN2EzMGIuLmViZDhjZDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvanNvbl9maWxlX291dHB1dHRlci5jYworKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2pzb25fZmlsZV9vdXRwdXR0ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3RyYWNlX2V2ZW50L2pzb25fZmlsZV9vdXRwdXR0ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9qc29uX2ZpbGVfb3V0cHV0dGVyLmggYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2pzb25fZmlsZV9vdXRwdXR0ZXIuaAppbmRleCA2ZTkyMTYwLi5kNGNmMzI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2pzb25fZmlsZV9vdXRwdXR0ZXIuaAorKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L2pzb25fZmlsZV9vdXRwdXR0ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1RSQUNFX0VWRU5UX0pTT05fRklMRV9PVVRQVVRURVJfSF8KICNkZWZpbmUgQ09CQUxUX1RSQUNFX0VWRU5UX0pTT05fRklMRV9PVVRQVVRURVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc2FtcGxlX2JlbmNobWFyay5jYyBiL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc2FtcGxlX2JlbmNobWFyay5jYwppbmRleCBmZjVjODFiLi5hODJhNDVkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3NhbXBsZV9iZW5jaG1hcmsuY2MKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zYW1wbGVfYmVuY2htYXJrLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvdGhyZWFkaW5nL3RocmVhZC5oIgogI2luY2x1ZGUgImJ1aWxkL2J1aWxkX2NvbmZpZy5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zY29wZWRfZXZlbnRfcGFyc2VyX3RyYWNlLmNjIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zY29wZWRfZXZlbnRfcGFyc2VyX3RyYWNlLmNjCmluZGV4IGM1MjE1NTEuLjE3ZTIyMmEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc2NvcGVkX2V2ZW50X3BhcnNlcl90cmFjZS5jYworKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF9ldmVudF9wYXJzZXJfdHJhY2UuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF9ldmVudF9wYXJzZXJfdHJhY2UuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zY29wZWRfZXZlbnRfcGFyc2VyX3RyYWNlLmggYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF9ldmVudF9wYXJzZXJfdHJhY2UuaAppbmRleCAxOWU0NTczLi45NWFkOGRjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF9ldmVudF9wYXJzZXJfdHJhY2UuaAorKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF9ldmVudF9wYXJzZXJfdHJhY2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1RSQUNFX0VWRU5UX1NDT1BFRF9FVkVOVF9QQVJTRVJfVFJBQ0VfSF8KICNkZWZpbmUgQ09CQUxUX1RSQUNFX0VWRU5UX1NDT1BFRF9FVkVOVF9QQVJTRVJfVFJBQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc2NvcGVkX3RyYWNlX3RvX2ZpbGUuY2MgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF90cmFjZV90b19maWxlLmNjCmluZGV4IDBiODI4YmEuLmMzYThlNDcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc2NvcGVkX3RyYWNlX3RvX2ZpbGUuY2MKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zY29wZWRfdHJhY2VfdG9fZmlsZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvdHJhY2VfZXZlbnQvc2NvcGVkX3RyYWNlX3RvX2ZpbGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zY29wZWRfdHJhY2VfdG9fZmlsZS5oIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zY29wZWRfdHJhY2VfdG9fZmlsZS5oCmluZGV4IDllNjJmNDMuLjhjMmIyZjUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc2NvcGVkX3RyYWNlX3RvX2ZpbGUuaAorKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3Njb3BlZF90cmFjZV90b19maWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9UUkFDRV9FVkVOVF9TQ09QRURfVFJBQ0VfVE9fRklMRV9IXwogI2RlZmluZSBDT0JBTFRfVFJBQ0VfRVZFTlRfU0NPUEVEX1RSQUNFX1RPX0ZJTEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc3dpdGNoZXMuY2MgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3N3aXRjaGVzLmNjCmluZGV4IDZjZjY1ZTYuLjc0YzY2YTggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc3dpdGNoZXMuY2MKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zd2l0Y2hlcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvdHJhY2VfZXZlbnQvc3dpdGNoZXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zd2l0Y2hlcy5oIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC9zd2l0Y2hlcy5oCmluZGV4IDk4ZmMwZWMuLjJhMDhhMWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvc3dpdGNoZXMuaAorKysgYi9zcmMvY29iYWx0L3RyYWNlX2V2ZW50L3N3aXRjaGVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9UUkFDRV9FVkVOVF9TV0lUQ0hFU19IXwogI2RlZmluZSBDT0JBTFRfVFJBQ0VfRVZFTlRfU1dJVENIRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvdHJhY2VfZXZlbnQvdHJhY2VfZXZlbnQuZ3lwIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC90cmFjZV9ldmVudC5neXAKaW5kZXggNGU0Mjc5ZS4uMWQ0OGRlMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC90cmFjZV9ldmVudC90cmFjZV9ldmVudC5neXAKKysrIGIvc3JjL2NvYmFsdC90cmFjZV9ldmVudC90cmFjZV9ldmVudC5neXAKQEAgLTQzLDcgKzQzLDggQEAKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvYmFzZS9iYXNlLmd5cDpiYXNlJywKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICd0cmFjZV9ldmVudCcsCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3ZlcnNpb24uaCBiL3NyYy9jb2JhbHQvdmVyc2lvbi5oCmluZGV4IGU2ZGIzZTYuLjliZTk4YWYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvdmVyc2lvbi5oCisrKyBiL3NyYy9jb2JhbHQvdmVyc2lvbi5oCkBAIC0xLDIyICsxLDIwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1ZFUlNJT05fSF8KICNkZWZpbmUgQ09CQUxUX1ZFUlNJT05fSF8KIAogLy8gQ29iYWx0IHJlbGVhc2UgbnVtYmVyLgotI2RlZmluZSBDT0JBTFRfVkVSU0lPTiAiOCIKKyNkZWZpbmUgQ09CQUxUX1ZFUlNJT04gIjkiCiAKICNlbmRpZiAgLy8gQ09CQUxUX1ZFUlNJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvQW5pbWF0YWJsZS5pZGwgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL0FuaW1hdGFibGUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTk4NWFhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvQW5pbWF0YWJsZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC13ZWItYW5pbWF0aW9ucy0xLTIwMTUwNzA3LyN0aGUtYW5pbWF0YWJsZS1pbnRlcmZhY2UKLQotLy8gVE9ETzogV2Ugd291bGQgbGlrZSB0byBiZSBhYmxlIHRvIHBhc3MgRWxlbWVudCBhbmQgUHNldWRvRWxlbWVudHMgYXJvdW5kIGFzCi0vLyAgICAgICBBbmltYXRhYmxlIG9iamVjdHMsIGJ1dCB3ZSBkb24ndCBjdXJyZW50bHkgaGF2ZSBzdXBwb3J0IGluIG91ciBwYXJzaW5nCi0vLyAgICAgICBzeXN0ZW0gdG8gc3VwcG9ydCBtdWx0aXBsZSBpbmhlcml0YW5jZSBiZXR3ZWVuIElETCBmaWxlcyBpbiBvcmRlciB0bwotLy8gICAgICAgc3VwcG9ydCB0aGlzLiAgVGhpcyBJREwgZmlsZSBleGlzdHMgY3VycmVudGx5IGFzIGEgcGxhY2Vob2xkZXIgZm9yIG5vdywKLS8vICAgICAgIGFzIHRoZSBvYmplY3QgaXMgY3JlYXRlZCBhbmQgZGVzdHJveWVkIHB1cmVseSB3aXRoaW4gQysrIGN1cnJlbnRseS4KLWludGVyZmFjZSBBbmltYXRhYmxlIHt9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9BbmltYXRpb24uaWRsIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9BbmltYXRpb24uaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxY2YzMTA0Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvQW5pbWF0aW9uLmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDMyICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI3RoZS1hbmltYXRpb24taW50ZXJmYWNlCi0KLVtDb25zdHJ1Y3RvciAob3B0aW9uYWwgQW5pbWF0aW9uRWZmZWN0UmVhZE9ubHk/IGVmZmVjdCA9IG51bGwsCi0gICAgICAgICAgICAgIG9wdGlvbmFsIEFuaW1hdGlvblRpbWVsaW5lPyB0aW1lbGluZSA9IG51bGwpXQotaW50ZXJmYWNlIEFuaW1hdGlvbiB7Ci0gIGF0dHJpYnV0ZSBBbmltYXRpb25FZmZlY3RSZWFkT25seT8gZWZmZWN0OwotICBhdHRyaWJ1dGUgQW5pbWF0aW9uVGltZWxpbmU/IHRpbWVsaW5lOwotICBhdHRyaWJ1dGUgZG91YmxlPyBzdGFydFRpbWU7Ci0gIGF0dHJpYnV0ZSBkb3VibGU/IGN1cnJlbnRUaW1lOwotICBhdHRyaWJ1dGUgZG91YmxlIHBsYXliYWNrUmF0ZTsKLSAgdm9pZCBjYW5jZWwoKTsKLSAgdm9pZCBmaW5pc2goKTsKLSAgdm9pZCBwbGF5KCk7Ci0gIHZvaWQgcGF1c2UoKTsKLSAgdm9pZCByZXZlcnNlKCk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9BbmltYXRpb25FZmZlY3RSZWFkT25seS5pZGwgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL0FuaW1hdGlvbkVmZmVjdFJlYWRPbmx5LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTZlZjViNi4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL0FuaW1hdGlvbkVmZmVjdFJlYWRPbmx5LmlkbAorKysgL2Rldi9udWxsCkBAIC0xLDIxICswLDAgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCi0KLS8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI3RoZS1hbmltYXRpb25lZmZlY3RyZWFkb25seS1pbnRlcmZhY2UKLQotaW50ZXJmYWNlIEFuaW1hdGlvbkVmZmVjdFJlYWRPbmx5IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEFuaW1hdGlvbkVmZmVjdFRpbWluZ1JlYWRPbmx5IHRpbWluZzsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL0FuaW1hdGlvbkVmZmVjdFRpbWluZ1JlYWRPbmx5LmlkbCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvQW5pbWF0aW9uRWZmZWN0VGltaW5nUmVhZE9ubHkuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNzZmMDhhLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvQW5pbWF0aW9uRWZmZWN0VGltaW5nUmVhZE9ubHkuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMzQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWFuaW1hdGlvbmVmZmVjdHRpbWluZ3JlYWRvbmx5LWludGVyZmFjZQotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC13ZWItYW5pbWF0aW9ucy0xLTIwMTUwNzA3LyN0aGUtZmlsbG1vZGUtZW51bWVyYXRpb24KLWVudW0gRmlsbE1vZGUgeyAibm9uZSIsICJmb3J3YXJkcyIsICJiYWNrd2FyZHMiLCAiYm90aCIgfTsKLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLXBsYXliYWNrZGlyZWN0aW9uLWVudW1lcmF0aW9uCi1lbnVtIFBsYXliYWNrRGlyZWN0aW9uIHsgIm5vcm1hbCIsICJyZXZlcnNlIiwgImFsdGVybmF0ZSIsICJhbHRlcm5hdGUtcmV2ZXJzZSIgfTsKLQotaW50ZXJmYWNlIEFuaW1hdGlvbkVmZmVjdFRpbWluZ1JlYWRPbmx5IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBkZWxheTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZSBlbmREZWxheTsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEZpbGxNb2RlIGZpbGw7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBQbGF5YmFja0RpcmVjdGlvbiBkaXJlY3Rpb247Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgaXRlcmF0aW9uU3RhcnQ7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnJlc3RyaWN0ZWQgZG91YmxlIGl0ZXJhdGlvbnM7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSAodW5yZXN0cmljdGVkIGRvdWJsZSBvciBET01TdHJpbmcpIGR1cmF0aW9uOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGVhc2luZzsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL0FuaW1hdGlvblRpbWVsaW5lLmlkbCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvQW5pbWF0aW9uVGltZWxpbmUuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiZTY5ODQ1Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvQW5pbWF0aW9uVGltZWxpbmUuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjYgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWFuaW1hdGlvbnRpbWVsaW5lLWludGVyZmFjZQotCi1pbnRlcmZhY2UgQW5pbWF0aW9uVGltZWxpbmUgewotICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlPyBjdXJyZW50VGltZTsKLQotICAvLyBUT0RPOiBVbmNvbW1lbnQgd2hlbiBzZXF1ZW5jZXMgYXJlIHN1cHBvcnRlZCwgYW5kIHRoZW4gcmVtb3ZlCi0gIC8vICAgICAgIG51bUFuaW1hdGlvbnMsIHdoaWNoIGlzIG5vdCBpbiB0aGUgc3BlY2lmaWNhdGlvbnMuCi0gIC8vIHNlcXVlbmNlPEFuaW1hdGlvbj4gZ2V0QW5pbWF0aW9ucygpOwotICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgbG9uZyBudW1BbmltYXRpb25zOwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvS2V5ZnJhbWUuaWRsIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9LZXlmcmFtZS5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExM2U4NGMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9LZXlmcmFtZS5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyNCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC13ZWItYW5pbWF0aW9ucy0xLTIwMTUwNzA3LyNkaWN0ZGVmLWtleWZyYW1lCi0KLS8vIFRPRE86IFRoaXMgc2hvdWxkIGFjdHVhbGx5IGJlIGEgZGljdGlvbmFyeSwgc28gd2UgbWF5IGJlIGFibGUgdG8gcmVtb3ZlIGl0Ci0vLyAgICAgICB3aGVuIHdlIHN1cHBvcnQgZGljdGlvbmFyaWVzLgotaW50ZXJmYWNlIEtleWZyYW1lIHsKLSAgYXR0cmlidXRlIGRvdWJsZT8gb2Zmc2V0OwotICBhdHRyaWJ1dGUgRE9NU3RyaW5nIGVhc2luZzsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL0tleWZyYW1lRWZmZWN0UmVhZE9ubHkuaWRsIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9LZXlmcmFtZUVmZmVjdFJlYWRPbmx5LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDAwNDU2NS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL0tleWZyYW1lRWZmZWN0UmVhZE9ubHkuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWtleWZyYW1lZWZmZWN0LWludGVyZmFjZXMKLQotLy8gVE9ETzogQWRkIHN1cHBvcnQgZm9yIHRoZSBjb25zdHJ1Y3RvciB3aGVuIHdlIHdpc2ggdG8gc3VwcG9ydCB0aGUgSmF2YVNjcmlwdAotLy8gICAgICAgV2ViIEFuaW1hdGlvbnMgQVBJLiAgRm9yIG5vdywgS2V5ZnJhbWVFZmZlY3RSZWFkT25seSBvYmplY3RzIHdpbGwKLS8vICAgICAgIGFsd2F5cyBiZSBjcmVhdGVkIGluIEMrKyAoYnkgdGhlIENTUyBBbmltYXRpb25zIG9yIENTUyBUcmFuc2l0aW9ucwotLy8gICAgICAgc3lzdGVtcykuCi1pbnRlcmZhY2UgS2V5ZnJhbWVFZmZlY3RSZWFkT25seSA6IEFuaW1hdGlvbkVmZmVjdFJlYWRPbmx5IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIEVsZW1lbnQ/IHRhcmdldDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGFibGUuaCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0YWJsZS5oCmluZGV4IDg1OTA5MDIuLjRhNDAzNmUgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0YWJsZS5oCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0YWJsZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQU5JTUFUQUJMRV9IXwogI2RlZmluZSBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQU5JTUFUQUJMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRhYmxlLmlkbCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0YWJsZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTQ1OGVmNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0YWJsZS5pZGwKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWFuaW1hdGFibGUtaW50ZXJmYWNlCisKKy8vIFRPRE86IFdlIHdvdWxkIGxpa2UgdG8gYmUgYWJsZSB0byBwYXNzIEVsZW1lbnQgYW5kIFBzZXVkb0VsZW1lbnRzIGFyb3VuZCBhcworLy8gICAgICAgQW5pbWF0YWJsZSBvYmplY3RzLCBidXQgd2UgZG9uJ3QgY3VycmVudGx5IGhhdmUgc3VwcG9ydCBpbiBvdXIgcGFyc2luZworLy8gICAgICAgc3lzdGVtIHRvIHN1cHBvcnQgbXVsdGlwbGUgaW5oZXJpdGFuY2UgYmV0d2VlbiBJREwgZmlsZXMgaW4gb3JkZXIgdG8KKy8vICAgICAgIHN1cHBvcnQgdGhpcy4gIFRoaXMgSURMIGZpbGUgZXhpc3RzIGN1cnJlbnRseSBhcyBhIHBsYWNlaG9sZGVyIGZvciBub3csCisvLyAgICAgICBhcyB0aGUgb2JqZWN0IGlzIGNyZWF0ZWQgYW5kIGRlc3Ryb3llZCBwdXJlbHkgd2l0aGluIEMrKyBjdXJyZW50bHkuCitpbnRlcmZhY2UgQW5pbWF0YWJsZSB7fTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uLmNjIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uY2MKaW5kZXggMTZjN2QzMC4uMDY3MDkzYyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uaCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uLmgKaW5kZXggMzI0MGRiZS4uY2RjYWQ1OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uaAorKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbi5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQU5JTUFUSU9OX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJfQU5JTUFUSU9OU19BTklNQVRJT05fSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uLmlkbCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODdmMWJlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uaWRsCkBAIC0wLDAgKzEsMzAgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI3RoZS1hbmltYXRpb24taW50ZXJmYWNlCisKK1tDb25zdHJ1Y3RvciAob3B0aW9uYWwgQW5pbWF0aW9uRWZmZWN0UmVhZE9ubHk/IGVmZmVjdCA9IG51bGwsCisgICAgICAgICAgICAgIG9wdGlvbmFsIEFuaW1hdGlvblRpbWVsaW5lPyB0aW1lbGluZSA9IG51bGwpXQoraW50ZXJmYWNlIEFuaW1hdGlvbiB7CisgIGF0dHJpYnV0ZSBBbmltYXRpb25FZmZlY3RSZWFkT25seT8gZWZmZWN0OworICBhdHRyaWJ1dGUgQW5pbWF0aW9uVGltZWxpbmU/IHRpbWVsaW5lOworICBhdHRyaWJ1dGUgZG91YmxlPyBzdGFydFRpbWU7CisgIGF0dHJpYnV0ZSBkb3VibGU/IGN1cnJlbnRUaW1lOworICBhdHRyaWJ1dGUgZG91YmxlIHBsYXliYWNrUmF0ZTsKKyAgdm9pZCBjYW5jZWwoKTsKKyAgdm9pZCBmaW5pc2goKTsKKyAgdm9pZCBwbGF5KCk7CisgIHZvaWQgcGF1c2UoKTsKKyAgdm9pZCByZXZlcnNlKCk7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3JlYWRfb25seS5oIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3JlYWRfb25seS5oCmluZGV4IDI0NThlODAuLjZjNzY1ZGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF9yZWFkX29ubHkuaAorKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9lZmZlY3RfcmVhZF9vbmx5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJfQU5JTUFUSU9OU19BTklNQVRJT05fRUZGRUNUX1JFQURfT05MWV9IXwogI2RlZmluZSBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQU5JTUFUSU9OX0VGRkVDVF9SRUFEX09OTFlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF9yZWFkX29ubHkuaWRsIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3JlYWRfb25seS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWQzNWE3OQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF9yZWFkX29ubHkuaWRsCkBAIC0wLDAgKzEsMTkgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI3RoZS1hbmltYXRpb25lZmZlY3RyZWFkb25seS1pbnRlcmZhY2UKKworaW50ZXJmYWNlIEFuaW1hdGlvbkVmZmVjdFJlYWRPbmx5IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIEFuaW1hdGlvbkVmZmVjdFRpbWluZ1JlYWRPbmx5IHRpbWluZzsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9lZmZlY3RfdGltaW5nX3JlYWRfb25seS5jYyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF90aW1pbmdfcmVhZF9vbmx5LmNjCmluZGV4IDA1NmJiY2YuLjg0ZDZiNDkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF90aW1pbmdfcmVhZF9vbmx5LmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF90aW1pbmdfcmVhZF9vbmx5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3RpbWluZ19yZWFkX29ubHkuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3RpbWluZ19yZWFkX29ubHkuaCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF90aW1pbmdfcmVhZF9vbmx5LmgKaW5kZXggZjA3MzU4MC4uZmVkMmFjOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3RpbWluZ19yZWFkX29ubHkuaAorKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9lZmZlY3RfdGltaW5nX3JlYWRfb25seS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQU5JTUFUSU9OX0VGRkVDVF9USU1JTkdfUkVBRF9PTkxZX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJfQU5JTUFUSU9OU19BTklNQVRJT05fRUZGRUNUX1RJTUlOR19SRUFEX09OTFlfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF90aW1pbmdfcmVhZF9vbmx5LmlkbCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF90aW1pbmdfcmVhZF9vbmx5LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43ODliYmU1Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3RpbWluZ19yZWFkX29ubHkuaWRsCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI3RoZS1hbmltYXRpb25lZmZlY3R0aW1pbmdyZWFkb25seS1pbnRlcmZhY2UKKworLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTUvV0Qtd2ViLWFuaW1hdGlvbnMtMS0yMDE1MDcwNy8jdGhlLWZpbGxtb2RlLWVudW1lcmF0aW9uCitlbnVtIEZpbGxNb2RlIHsgIm5vbmUiLCAiZm9yd2FyZHMiLCAiYmFja3dhcmRzIiwgImJvdGgiIH07CisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI3RoZS1wbGF5YmFja2RpcmVjdGlvbi1lbnVtZXJhdGlvbgorZW51bSBQbGF5YmFja0RpcmVjdGlvbiB7ICJub3JtYWwiLCAicmV2ZXJzZSIsICJhbHRlcm5hdGUiLCAiYWx0ZXJuYXRlLXJldmVyc2UiIH07CisKK2ludGVyZmFjZSBBbmltYXRpb25FZmZlY3RUaW1pbmdSZWFkT25seSB7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgZGVsYXk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBkb3VibGUgZW5kRGVsYXk7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBGaWxsTW9kZSBmaWxsOworICByZWFkb25seSBhdHRyaWJ1dGUgUGxheWJhY2tEaXJlY3Rpb24gZGlyZWN0aW9uOworICByZWFkb25seSBhdHRyaWJ1dGUgZG91YmxlIGl0ZXJhdGlvblN0YXJ0OworICByZWFkb25seSBhdHRyaWJ1dGUgdW5yZXN0cmljdGVkIGRvdWJsZSBpdGVyYXRpb25zOworICByZWFkb25seSBhdHRyaWJ1dGUgKHVucmVzdHJpY3RlZCBkb3VibGUgb3IgRE9NU3RyaW5nKSBkdXJhdGlvbjsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBlYXNpbmc7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3RpbWluZ19yZWFkX29ubHlfdGVzdC5jYyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX2VmZmVjdF90aW1pbmdfcmVhZF9vbmx5X3Rlc3QuY2MKaW5kZXggNGQyMTk2Ni4uMTFmZGIzMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fZWZmZWN0X3RpbWluZ19yZWFkX29ubHlfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9lZmZlY3RfdGltaW5nX3JlYWRfb25seV90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgPGxpbWl0cz4KIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmNjIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmNjCmluZGV4IDQ5MWQ3ZWQuLjA5YWVhOTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3NldC5jYworKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9zZXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9zZXQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fc2V0LmggYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9zZXQuaAppbmRleCBlNDQ5NjJlLi40NmZkOTViIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9zZXQuaAorKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl9zZXQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQl9BTklNQVRJT05TX0FOSU1BVElPTl9TRVRfSF8KICNkZWZpbmUgQ09CQUxUX1dFQl9BTklNQVRJT05TX0FOSU1BVElPTl9TRVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl90ZXN0LmNjCmluZGV4IGM0YmJhMmIuLjM1OTM5MmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uLmgiCiAjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl90aW1lbGluZS5jYyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3RpbWVsaW5lLmNjCmluZGV4IDA0YWRjNzMuLjNjNzc5MGYgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3RpbWVsaW5lLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3RpbWVsaW5lLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3NldC5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fdGltZWxpbmUuaCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3RpbWVsaW5lLmgKaW5kZXggMzIyNWY2Zi4uM2VkNTRiZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fdGltZWxpbmUuaAorKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2FuaW1hdGlvbl90aW1lbGluZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQU5JTUFUSU9OX1RJTUVMSU5FX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJfQU5JTUFUSU9OU19BTklNQVRJT05fVElNRUxJTkVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3RpbWVsaW5lLmlkbCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYW5pbWF0aW9uX3RpbWVsaW5lLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mYTYzODg3Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9hbmltYXRpb25fdGltZWxpbmUuaWRsCkBAIC0wLDAgKzEsMjQgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI3RoZS1hbmltYXRpb250aW1lbGluZS1pbnRlcmZhY2UKKworaW50ZXJmYWNlIEFuaW1hdGlvblRpbWVsaW5lIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGRvdWJsZT8gY3VycmVudFRpbWU7CisKKyAgLy8gVE9ETzogVW5jb21tZW50IHdoZW4gc2VxdWVuY2VzIGFyZSBzdXBwb3J0ZWQsIGFuZCB0aGVuIHJlbW92ZQorICAvLyAgICAgICBudW1BbmltYXRpb25zLCB3aGljaCBpcyBub3QgaW4gdGhlIHNwZWNpZmljYXRpb25zLgorICAvLyBzZXF1ZW5jZTxBbmltYXRpb24+IGdldEFuaW1hdGlvbnMoKTsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgbnVtQW5pbWF0aW9uczsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2Jha2VkX2FuaW1hdGlvbl9zZXQuY2MgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2Jha2VkX2FuaW1hdGlvbl9zZXQuY2MKaW5kZXggMDJkNWYyOC4uYjgxYzgxNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9iYWtlZF9hbmltYXRpb25fc2V0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYmFrZWRfYW5pbWF0aW9uX3NldC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViX2FuaW1hdGlvbnMvYmFrZWRfYW5pbWF0aW9uX3NldC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2Jha2VkX2FuaW1hdGlvbl9zZXQuaCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYmFrZWRfYW5pbWF0aW9uX3NldC5oCmluZGV4IGI0MTRhZWIuLjM4M2NhOTAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYmFrZWRfYW5pbWF0aW9uX3NldC5oCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvYmFrZWRfYW5pbWF0aW9uX3NldC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQkFLRURfQU5JTUFUSU9OX1NFVF9IXwogI2RlZmluZSBDT0JBTFRfV0VCX0FOSU1BVElPTlNfQkFLRURfQU5JTUFUSU9OX1NFVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZS5oIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZS5oCmluZGV4IDUyNWViYTUuLmVkZGUzZDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWUuaAorKysgYi9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2tleWZyYW1lLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJfQU5JTUFUSU9OU19LRVlGUkFNRV9IXwogI2RlZmluZSBDT0JBTFRfV0VCX0FOSU1BVElPTlNfS0VZRlJBTUVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWUuaWRsIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZS5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTZmZWE1ZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWUuaWRsCkBAIC0wLDAgKzEsMjIgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE1L1dELXdlYi1hbmltYXRpb25zLTEtMjAxNTA3MDcvI2RpY3RkZWYta2V5ZnJhbWUKKworLy8gVE9ETzogVGhpcyBzaG91bGQgYWN0dWFsbHkgYmUgYSBkaWN0aW9uYXJ5LCBzbyB3ZSBtYXkgYmUgYWJsZSB0byByZW1vdmUgaXQKKy8vICAgICAgIHdoZW4gd2Ugc3VwcG9ydCBkaWN0aW9uYXJpZXMuCitpbnRlcmZhY2UgS2V5ZnJhbWUgeworICBhdHRyaWJ1dGUgZG91YmxlPyBvZmZzZXQ7CisgIGF0dHJpYnV0ZSBET01TdHJpbmcgZWFzaW5nOworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWVfZWZmZWN0X3JlYWRfb25seS5jYyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWVfZWZmZWN0X3JlYWRfb25seS5jYwppbmRleCBkMDIwMTQwLi40MTAwNGMxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2tleWZyYW1lX2VmZmVjdF9yZWFkX29ubHkuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWVfZWZmZWN0X3JlYWRfb25seS5oIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmgKaW5kZXggOWE5ZDVjMS4uZmRhMzJhYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmgKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJfQU5JTUFUSU9OU19LRVlGUkFNRV9FRkZFQ1RfUkVBRF9PTkxZX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJfQU5JTUFUSU9OU19LRVlGUkFNRV9FRkZFQ1RfUkVBRF9PTkxZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL2tleWZyYW1lX2VmZmVjdF9yZWFkX29ubHkuaWRsIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNTQzYTRlCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5LmlkbApAQCAtMCwwICsxLDIzIEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNS9XRC13ZWItYW5pbWF0aW9ucy0xLTIwMTUwNzA3LyN0aGUta2V5ZnJhbWVlZmZlY3QtaW50ZXJmYWNlcworCisvLyBUT0RPOiBBZGQgc3VwcG9ydCBmb3IgdGhlIGNvbnN0cnVjdG9yIHdoZW4gd2Ugd2lzaCB0byBzdXBwb3J0IHRoZSBKYXZhU2NyaXB0CisvLyAgICAgICBXZWIgQW5pbWF0aW9ucyBBUEkuICBGb3Igbm93LCBLZXlmcmFtZUVmZmVjdFJlYWRPbmx5IG9iamVjdHMgd2lsbAorLy8gICAgICAgYWx3YXlzIGJlIGNyZWF0ZWQgaW4gQysrIChieSB0aGUgQ1NTIEFuaW1hdGlvbnMgb3IgQ1NTIFRyYW5zaXRpb25zCisvLyAgICAgICBzeXN0ZW1zKS4KK2ludGVyZmFjZSBLZXlmcmFtZUVmZmVjdFJlYWRPbmx5IDogQW5pbWF0aW9uRWZmZWN0UmVhZE9ubHkgeworICByZWFkb25seSBhdHRyaWJ1dGUgRWxlbWVudD8gdGFyZ2V0OworfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMva2V5ZnJhbWVfZWZmZWN0X3JlYWRfb25seV90ZXN0LmNjIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5X3Rlc3QuY2MKaW5kZXggNmM5MzBjZi4uYjBkM2FlYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5X3Rlc3QuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy9rZXlmcmFtZV9lZmZlY3RfcmVhZF9vbmx5X3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L2Nzc29tL2xlbmd0aF92YWx1ZS5oIgogI2luY2x1ZGUgImNvYmFsdC9jc3NvbS9udW1iZXJfdmFsdWUuaCIKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvdGltZWRfdGFza19xdWV1ZS5jYyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvdGltZWRfdGFza19xdWV1ZS5jYwppbmRleCA3ZWNiNjRiLi5jYTFmYjJhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL3RpbWVkX3Rhc2tfcXVldWUuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy90aW1lZF90YXNrX3F1ZXVlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJfYW5pbWF0aW9ucy90aW1lZF90YXNrX3F1ZXVlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvdGltZWRfdGFza19xdWV1ZS5oIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy90aW1lZF90YXNrX3F1ZXVlLmgKaW5kZXggZjNiMWNkOS4uMDQ2ZGZmNCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy90aW1lZF90YXNrX3F1ZXVlLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJfYW5pbWF0aW9ucy90aW1lZF90YXNrX3F1ZXVlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJfQU5JTUFUSU9OU19USU1FRF9UQVNLX1FVRVVFX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJfQU5JTUFUSU9OU19USU1FRF9UQVNLX1FVRVVFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYl9hbmltYXRpb25zL3dlYl9hbmltYXRpb25zLmd5cCBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvd2ViX2FuaW1hdGlvbnMuZ3lwCmluZGV4IGU0NTQ0YWMuLjQ5NWIwZjIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvd2ViX2FuaW1hdGlvbnMuZ3lwCisrKyBiL3NyYy9jb2JhbHQvd2ViX2FuaW1hdGlvbnMvd2ViX2FuaW1hdGlvbnMuZ3lwCkBAIC01NSw5ICs1NSw5IEBACiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJ3dlYl9hbmltYXRpb25zJywKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Nzc19wYXJzZXIvY3NzX3BhcnNlci5neXA6Y3NzX3BhcnNlcicsCiAgICAgICAgICc8KERFUFRIKS9jb2JhbHQvY3Nzb20vY3Nzb20uZ3lwOmNzc29tJywKKyAgICAgICAgJzwoREVQVEgpL2NvYmFsdC90ZXN0L3Rlc3QuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgIF0sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9TY3JpcHRFeGVjdXRvci5pZGwgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9TY3JpcHRFeGVjdXRvci5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFiNzdlMmYuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvU2NyaXB0RXhlY3V0b3IuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotWwotICBOb0ludGVyZmFjZU9iamVjdCwKLSAgQ29uZGl0aW9uYWw9RU5BQkxFX1dFQkRSSVZFUgotXQotaW50ZXJmYWNlIFNjcmlwdEV4ZWN1dG9yIHsKLSAgYXR0cmlidXRlIEV4ZWN1dGVGdW5jdGlvbkNhbGxiYWNrIGV4ZWN1dGVTY3JpcHRIYXJuZXNzOwotICBET01TdHJpbmcgZWxlbWVudFRvSWQoRWxlbWVudCBlbGVtZW50KTsKLSAgRWxlbWVudD8gaWRUb0VsZW1lbnQoRE9NU3RyaW5nIGlkKTsKLX07Ci0KLWNhbGxiYWNrIEV4ZWN1dGVGdW5jdGlvbkNhbGxiYWNrID0KLSAgICB2b2lkKFNjcmlwdEV4ZWN1dG9yUGFyYW1zIHBhcmFtcywgU2NyaXB0RXhlY3V0b3JSZXN1bHQgcmVzdWx0SGFuZGxlcik7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9TY3JpcHRFeGVjdXRvclBhcmFtcy5pZGwgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9TY3JpcHRFeGVjdXRvclBhcmFtcy5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkYTQ1YzUuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvU2NyaXB0RXhlY3V0b3JQYXJhbXMuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotWwotICBOb0ludGVyZmFjZU9iamVjdCwKLSAgQ29uZGl0aW9uYWw9RU5BQkxFX1dFQkRSSVZFUgotXQotaW50ZXJmYWNlIFNjcmlwdEV4ZWN1dG9yUGFyYW1zIHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIG9iamVjdCBmdW5jdGlvbk9iamVjdDsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBqc29uQXJnczsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIGxvbmc/IGFzeW5jVGltZW91dDsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9TY3JpcHRFeGVjdXRvclJlc3VsdC5pZGwgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9TY3JpcHRFeGVjdXRvclJlc3VsdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcxODA1OWMuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvU2NyaXB0RXhlY3V0b3JSZXN1bHQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotWwotICBOb0ludGVyZmFjZU9iamVjdCwKLSAgQ29uZGl0aW9uYWw9RU5BQkxFX1dFQkRSSVZFUgotXQotaW50ZXJmYWNlIFNjcmlwdEV4ZWN1dG9yUmVzdWx0IHsKLSAgdm9pZCBvblJlc3VsdChET01TdHJpbmcgcmVzdWx0KTsKLSAgdm9pZCBvblRpbWVvdXQoKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9hbGdvcml0aG1zLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvYWxnb3JpdGhtcy5jYwppbmRleCBiNjUwYjAyLi40ZDRjNTllIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9hbGdvcml0aG1zLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2FsZ29yaXRobXMuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9hbGdvcml0aG1zLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2FsZ29yaXRobXMuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2FsZ29yaXRobXMuaAppbmRleCA1ODNjOGQzLi5kNzE4OGQ3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9hbGdvcml0aG1zLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvYWxnb3JpdGhtcy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX0FMR09SSVRITVNfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9BTEdPUklUSE1TX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9jb250ZW50L3dlYmRyaXZlci1pbml0LmpzIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvY29udGVudC93ZWJkcml2ZXItaW5pdC5qcwppbmRleCAwM2M1MDk5Li4yY2E2NGQyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9jb250ZW50L3dlYmRyaXZlci1pbml0LmpzCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2NvbnRlbnQvd2ViZHJpdmVyLWluaXQuanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAvLyBSdW4gdGhlIEpTT04gZGVzZXJpYWxpemUgYWxnb3JpdGhtIG9uIHRoZSB2YWx1ZS4KIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJkcml2ZXIvI2Rmbi1qc29uLWRlc2VyaWFsaXplCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9kaXNwYXRjaGVyLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZGlzcGF0Y2hlci5jYwppbmRleCAwZWIxYmNlLi42ZDFkNDA4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9kaXNwYXRjaGVyLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2Rpc3BhdGNoZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9kaXNwYXRjaGVyLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2Rpc3BhdGNoZXIuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2Rpc3BhdGNoZXIuaAppbmRleCAyYzc2MDg3Li5jZDNlMjNlIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9kaXNwYXRjaGVyLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZGlzcGF0Y2hlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX0RJU1BBVENIRVJfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9ESVNQQVRDSEVSX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9lbGVtZW50X2RyaXZlci5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2VsZW1lbnRfZHJpdmVyLmNjCmluZGV4IGQyOTU5NzQuLjEzOTczOGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2VsZW1lbnRfZHJpdmVyLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2VsZW1lbnRfZHJpdmVyLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJkcml2ZXIvZWxlbWVudF9kcml2ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZWxlbWVudF9kcml2ZXIuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2VsZW1lbnRfZHJpdmVyLmgKaW5kZXggNjQ1YTBlMC4uNGJhMjcyNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZWxlbWVudF9kcml2ZXIuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9lbGVtZW50X2RyaXZlci5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX0VMRU1FTlRfRFJJVkVSX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfRUxFTUVOVF9EUklWRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2VsZW1lbnRfbWFwcGluZy5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZWxlbWVudF9tYXBwaW5nLmgKaW5kZXggYTNiNjI3Ni4uNDFiZmMyYiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZWxlbWVudF9tYXBwaW5nLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZWxlbWVudF9tYXBwaW5nLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfRUxFTUVOVF9NQVBQSU5HX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfRUxFTUVOVF9NQVBQSU5HX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9leGVjdXRlX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9leGVjdXRlX3Rlc3QuY2MKaW5kZXggNmVkZWMzMy4uNTAwMThkOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZXhlY3V0ZV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2V4ZWN1dGVfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dmVjdG9yPgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZ2V0X2VsZW1lbnRfdGV4dF90ZXN0LmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvZ2V0X2VsZW1lbnRfdGV4dF90ZXN0LmNjCmluZGV4IGE0MmIzYTIuLmNlY2Q1NjMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2dldF9lbGVtZW50X3RleHRfdGVzdC5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9nZXRfZWxlbWVudF90ZXh0X3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9pc19kaXNwbGF5ZWRfdGVzdC5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2lzX2Rpc3BsYXllZF90ZXN0LmNjCmluZGV4IGIzODc4OTkuLmE1MmQwMGIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2lzX2Rpc3BsYXllZF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2lzX2Rpc3BsYXllZF90ZXN0LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImJhc2UvbWVtb3J5L3JlZl9jb3VudGVkLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIva2V5Ym9hcmQuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9rZXlib2FyZC5jYwppbmRleCAzMmQ0ZmJjLi4yMTVkNWEyIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9rZXlib2FyZC5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9rZXlib2FyZC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL2tleWJvYXJkLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2tleWJvYXJkLmggYi9zcmMvY29iYWx0L3dlYmRyaXZlci9rZXlib2FyZC5oCmluZGV4IDU3YTVjNWYuLjFhY2JjNzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2tleWJvYXJkLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIva2V5Ym9hcmQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQkRSSVZFUl9LRVlCT0FSRF9IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX0tFWUJPQVJEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9rZXlib2FyZF90ZXN0LmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIva2V5Ym9hcmRfdGVzdC5jYwppbmRleCA0Y2JmNmZjLi5mODU2NzljIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9rZXlib2FyZF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL2tleWJvYXJkX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogI2luY2x1ZGUgPHZlY3Rvcj4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2NhcGFiaWxpdGllcy5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2NhcGFiaWxpdGllcy5jYwppbmRleCAyY2MzN2ZlLi5mMzI5MDc5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9jYXBhYmlsaXRpZXMuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvY2FwYWJpbGl0aWVzLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2NhcGFiaWxpdGllcy5oIgogCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvY2FwYWJpbGl0aWVzLmggYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9jYXBhYmlsaXRpZXMuaAppbmRleCBiZWIwNmFmLi4yNGYwNjgwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9jYXBhYmlsaXRpZXMuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9jYXBhYmlsaXRpZXMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9DQVBBQklMSVRJRVNfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9DQVBBQklMSVRJRVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2Nvb2tpZS5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2Nvb2tpZS5jYwppbmRleCA3Y2IxYjc4Li5iZjA0NmZmIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9jb29raWUuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvY29va2llLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvY29va2llLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2Nvb2tpZS5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvY29va2llLmgKaW5kZXggNzNlMmE0MC4uNjdkZDRlOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvY29va2llLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvY29va2llLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfQ09PS0lFX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfQ09PS0lFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9lbGVtZW50X2lkLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvZWxlbWVudF9pZC5jYwppbmRleCA5ZDAzY2Y5Li5hOGZjYzdhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9lbGVtZW50X2lkLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2VsZW1lbnRfaWQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9lbGVtZW50X2lkLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2VsZW1lbnRfaWQuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2VsZW1lbnRfaWQuaAppbmRleCBjMTlkZmI1Li44YTFkNGEzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9lbGVtZW50X2lkLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvZWxlbWVudF9pZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX0VMRU1FTlRfSURfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9FTEVNRU5UX0lEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9mcmFtZV9pZC5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2ZyYW1lX2lkLmNjCmluZGV4IGMwZTFjNTAuLmIzMDU4MTcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2ZyYW1lX2lkLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2ZyYW1lX2lkLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvZnJhbWVfaWQuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvZnJhbWVfaWQuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2ZyYW1lX2lkLmgKaW5kZXggZGZjMTFlZC4uMjI3ZjEwMSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvZnJhbWVfaWQuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9mcmFtZV9pZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX0ZSQU1FX0lEX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfRlJBTUVfSURfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2tleXMuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9rZXlzLmNjCmluZGV4IDVmMWM1MzMuLjA0ZjU5MzkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2tleXMuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wva2V5cy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2tleXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wva2V5cy5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wva2V5cy5oCmluZGV4IDg1YzhiMmYuLmY5MDM0YzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2tleXMuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9rZXlzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfS0VZU19IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX0tFWVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2xvZ19lbnRyeS5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2xvZ19lbnRyeS5jYwppbmRleCA2YzQ2NjhiLi5mOTRjZTIxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9sb2dfZW50cnkuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX2VudHJ5LmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX2VudHJ5LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2xvZ19lbnRyeS5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX2VudHJ5LmgKaW5kZXggM2FhNTdlMS4uMzc2NTE1NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX2VudHJ5LmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX2VudHJ5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfTE9HX0VOVFJZX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfTE9HX0VOVFJZX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9sb2dfdHlwZS5jYyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2xvZ190eXBlLmNjCmluZGV4IGE4ODY1NTQuLjc3OWFlYzcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2xvZ190eXBlLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2xvZ190eXBlLmNjCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX3R5cGUuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX3R5cGUuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL2xvZ190eXBlLmgKaW5kZXggM2QwNzNmOS4uNDllYjM4ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvbG9nX3R5cGUuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9sb2dfdHlwZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX0xPR19UWVBFX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfTE9HX1RZUEVfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3Byb3h5LmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvcHJveHkuY2MKaW5kZXggNjIxN2M3Zi4uNDI3MGI1ZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvcHJveHkuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvcHJveHkuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9wcm94eS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9wcm94eS5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvcHJveHkuaAppbmRleCBmMzlhMWQxLi42MDAwYzdkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9wcm94eS5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3Byb3h5LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfUFJPWFlfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9QUk9YWV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvcmVzcG9uc2UuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9yZXNwb25zZS5jYwppbmRleCAzN2I3ZjQ5Li4yY2Y2ZjllIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9yZXNwb25zZS5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9yZXNwb25zZS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3Jlc3BvbnNlLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3Jlc3BvbnNlLmggYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9yZXNwb25zZS5oCmluZGV4IDhjZmM1NDkuLjBlNjJkOGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3Jlc3BvbnNlLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvcmVzcG9uc2UuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9SRVNQT05TRV9IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1JFU1BPTlNFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zY3JpcHQuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zY3JpcHQuY2MKaW5kZXggYTMwZThkNC4uMzRjYWQyOCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2NyaXB0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NjcmlwdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NjcmlwdC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zY3JpcHQuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NjcmlwdC5oCmluZGV4IDg5NGIwNmUuLjZlNGE5ZmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NjcmlwdC5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NjcmlwdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1NDUklQVF9IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1NDUklQVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2VhcmNoX3N0cmF0ZWd5LmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2VhcmNoX3N0cmF0ZWd5LmNjCmluZGV4IGYxNTkyMzguLjBhZjAyMDMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NlYXJjaF9zdHJhdGVneS5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZWFyY2hfc3RyYXRlZ3kuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZWFyY2hfc3RyYXRlZ3kuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2VhcmNoX3N0cmF0ZWd5LmggYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZWFyY2hfc3RyYXRlZ3kuaAppbmRleCAyMTE0NmI2Li41MWY3NzMxIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZWFyY2hfc3RyYXRlZ3kuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZWFyY2hfc3RyYXRlZ3kuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9TRUFSQ0hfU1RSQVRFR1lfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9TRUFSQ0hfU1RSQVRFR1lfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NlcnZlcl9zdGF0dXMuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZXJ2ZXJfc3RhdHVzLmNjCmluZGV4IGJjYjI4M2MuLjk1M2E2OWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NlcnZlcl9zdGF0dXMuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2VydmVyX3N0YXR1cy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NlcnZlcl9zdGF0dXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2VydmVyX3N0YXR1cy5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2VydmVyX3N0YXR1cy5oCmluZGV4IGNkZWY5YTQuLjE3MGU4MGQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NlcnZlcl9zdGF0dXMuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZXJ2ZXJfc3RhdHVzLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfUFJPVE9DT0xfU0VSVkVSX1NUQVRVU19IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1NFUlZFUl9TVEFUVVNfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3Nlc3Npb25faWQuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3Nlc3Npb25faWQuaAppbmRleCA5M2NjZjkwLi5lOGUyZDY4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zZXNzaW9uX2lkLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2Vzc2lvbl9pZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1NFU1NJT05fSURfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9TRVNTSU9OX0lEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zaXplLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2l6ZS5jYwppbmRleCBmYTJmODM4Li44MTdlMmU2IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zaXplLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NpemUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zaXplLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NpemUuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3NpemUuaAppbmRleCAxNjQ5ODk4Li5kYTE0NzE5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC9zaXplLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvc2l6ZS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1NJWkVfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9QUk9UT0NPTF9TSVpFX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC93aW5kb3dfaWQuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC93aW5kb3dfaWQuY2MKaW5kZXggYWJkNjJkYS4uYWQ3NjhiNSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvd2luZG93X2lkLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3dpbmRvd19pZC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3dpbmRvd19pZC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9wcm90b2NvbC93aW5kb3dfaWQuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3dpbmRvd19pZC5oCmluZGV4IDY5NzNkNDIuLmIzZGY0MWIgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3dpbmRvd19pZC5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Byb3RvY29sL3dpbmRvd19pZC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1dJTkRPV19JRF9IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1BST1RPQ09MX1dJTkRPV19JRF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yLmNjCmluZGV4IGNkM2Q2M2YuLjUwODQ0OGEgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvci5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3IuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3IuaCIKIApAQCAtMTExLDcgKzEwOSw3IEBACiBTY3JpcHRFeGVjdXRvcjo6ZXhlY3V0ZV9zY3JpcHRfaGFybmVzcygpIHsKICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwogICBpZiAoZXhlY3V0ZV9jYWxsYmFja18pIHsKLSAgICByZXR1cm4gJihleGVjdXRlX2NhbGxiYWNrXy0+cmVmZXJlbmNlZF9vYmplY3QoKSk7CisgICAgcmV0dXJuICYoZXhlY3V0ZV9jYWxsYmFja18tPnJlZmVyZW5jZWRfdmFsdWUoKSk7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvci5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yLmgKaW5kZXggYTQ2ZjFmMi4uOWNkZjgxMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfU0NSSVBUX0VYRUNVVE9SX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfU0NSSVBUX0VYRUNVVE9SX0hfCkBAIC0yNyw3ICsyNSw3IEBACiAjaW5jbHVkZSAiY29iYWx0L2RvbS9lbGVtZW50LmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC9jYWxsYmFja19mdW5jdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvb3BhcXVlX2hhbmRsZS5oIgotI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X29iamVjdC5oIgorI2luY2x1ZGUgImNvYmFsdC9zY3JpcHQvc2NyaXB0X3ZhbHVlLmgiCiAjaW5jbHVkZSAiY29iYWx0L3NjcmlwdC93cmFwcGFibGUuaCIKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL2VsZW1lbnRfbWFwcGluZy5oIgogI2luY2x1ZGUgImNvYmFsdC93ZWJkcml2ZXIvcHJvdG9jb2wvZWxlbWVudF9pZC5oIgpAQCAtNDUsNyArNDMsNyBAQAogICB0eXBlZGVmIHNjcmlwdDo6Q2FsbGJhY2tGdW5jdGlvbjx2b2lkKAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTY3JpcHRFeGVjdXRvclBhcmFtcz4mLAogICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxTY3JpcHRFeGVjdXRvclJlc3VsdD4mKT4gRXhlY3V0ZUZ1bmN0aW9uQ2FsbGJhY2s7Ci0gIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRPYmplY3Q8RXhlY3V0ZUZ1bmN0aW9uQ2FsbGJhY2s+CisgIHR5cGVkZWYgc2NyaXB0OjpTY3JpcHRWYWx1ZTxFeGVjdXRlRnVuY3Rpb25DYWxsYmFjaz4KICAgICAgIEV4ZWN1dGVGdW5jdGlvbkNhbGxiYWNrSG9sZGVyOwogCiAgIC8vIFRoaXMgY2FuIGJlIGNhbGxlZCBvbiBhbnkgdGhyZWFkIHRvIHByZWxvYWQgdGhlIHdlYmRyaXZlciBqYXZhc2NyaXB0IGNvZGUuCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3IuaWRsIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MmQ0NTFiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yLmlkbApAQCAtMCwwICsxLDI2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCitbCisgIE5vSW50ZXJmYWNlT2JqZWN0LAorICBDb25kaXRpb25hbD1FTkFCTEVfV0VCRFJJVkVSCitdCitpbnRlcmZhY2UgU2NyaXB0RXhlY3V0b3IgeworICBhdHRyaWJ1dGUgRXhlY3V0ZUZ1bmN0aW9uQ2FsbGJhY2sgZXhlY3V0ZVNjcmlwdEhhcm5lc3M7CisgIERPTVN0cmluZyBlbGVtZW50VG9JZChFbGVtZW50IGVsZW1lbnQpOworICBFbGVtZW50PyBpZFRvRWxlbWVudChET01TdHJpbmcgaWQpOworfTsKKworY2FsbGJhY2sgRXhlY3V0ZUZ1bmN0aW9uQ2FsbGJhY2sgPQorICAgIHZvaWQoU2NyaXB0RXhlY3V0b3JQYXJhbXMgcGFyYW1zLCBTY3JpcHRFeGVjdXRvclJlc3VsdCByZXN1bHRIYW5kbGVyKTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvcl9wYXJhbXMuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3JfcGFyYW1zLmNjCmluZGV4IGQ5NmEzMjUuLmI1MGEyMWQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvcl9wYXJhbXMuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3BhcmFtcy5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvcl9wYXJhbXMuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3BhcmFtcy5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3BhcmFtcy5oCmluZGV4IDIyNTZiZWIuLjhlZjY3YjAgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvcl9wYXJhbXMuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3JfcGFyYW1zLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfU0NSSVBUX0VYRUNVVE9SX1BBUkFNU19IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1NDUklQVF9FWEVDVVRPUl9QQVJBTVNfSF8KQEAgLTQ4LDcgKzQ2LDcgQEAKICAgICAgIGJhc2U6Om9wdGlvbmFsPGJhc2U6OlRpbWVEZWx0YT4gYXN5bmNfdGltZW91dCk7CiAKICAgY29uc3Qgc2NyaXB0OjpPcGFxdWVIYW5kbGVIb2xkZXIqIGZ1bmN0aW9uX29iamVjdCgpIHsKLSAgICByZXR1cm4gZnVuY3Rpb25fb2JqZWN0XyA/ICZmdW5jdGlvbl9vYmplY3RfLT5yZWZlcmVuY2VkX29iamVjdCgpIDogTlVMTDsKKyAgICByZXR1cm4gZnVuY3Rpb25fb2JqZWN0XyA/ICZmdW5jdGlvbl9vYmplY3RfLT5yZWZlcmVuY2VkX3ZhbHVlKCkgOiBOVUxMOwogICB9CiAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBqc29uX2FyZ3MoKSB7IHJldHVybiBqc29uX2FyZ3NfOyB9CiAgIGJhc2U6Om9wdGlvbmFsPGludDMyX3Q+IGFzeW5jX3RpbWVvdXQoKSB7IHJldHVybiBhc3luY190aW1lb3V0XzsgfQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3BhcmFtcy5pZGwgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3JfcGFyYW1zLmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNWFjYjYwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3BhcmFtcy5pZGwKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworWworICBOb0ludGVyZmFjZU9iamVjdCwKKyAgQ29uZGl0aW9uYWw9RU5BQkxFX1dFQkRSSVZFUgorXQoraW50ZXJmYWNlIFNjcmlwdEV4ZWN1dG9yUGFyYW1zIHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIG9iamVjdCBmdW5jdGlvbk9iamVjdDsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBqc29uQXJnczsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIGxvbmc/IGFzeW5jVGltZW91dDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3JfcmVzdWx0LmggYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3JfcmVzdWx0LmgKaW5kZXggYWE2OGQ4MC4uNGE5OWJhZSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3Jlc3VsdC5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NjcmlwdF9leGVjdXRvcl9yZXN1bHQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQkRSSVZFUl9TQ1JJUFRfRVhFQ1VUT1JfUkVTVUxUX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfU0NSSVBUX0VYRUNVVE9SX1JFU1VMVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3Jlc3VsdC5pZGwgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zY3JpcHRfZXhlY3V0b3JfcmVzdWx0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjlhNzdiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2NyaXB0X2V4ZWN1dG9yX3Jlc3VsdC5pZGwKQEAgLTAsMCArMSwyMiBAQAorLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworWworICBOb0ludGVyZmFjZU9iamVjdCwKKyAgQ29uZGl0aW9uYWw9RU5BQkxFX1dFQkRSSVZFUgorXQoraW50ZXJmYWNlIFNjcmlwdEV4ZWN1dG9yUmVzdWx0IHsKKyAgdm9pZCBvblJlc3VsdChET01TdHJpbmcgcmVzdWx0KTsKKyAgdm9pZCBvblRpbWVvdXQoKTsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zZWFyY2guY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zZWFyY2guY2MKaW5kZXggZGFjMzI4Ny4uOGJmZTUzYSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VhcmNoLmNjCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlYXJjaC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3NlYXJjaC5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zZWFyY2guaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlYXJjaC5oCmluZGV4IDlmMTM4MGEuLmFiN2U5N2UgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlYXJjaC5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlYXJjaC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1NFQVJDSF9IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1NFQVJDSF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VydmVyLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VydmVyLmNjCmluZGV4IGIyZmRjZjcuLjMyMWM4YzQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3NlcnZlci5jYworKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2VydmVyLmggYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuaAppbmRleCBiODEwMDhhLi43MWE2NmZhIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXJ2ZXIuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQkRSSVZFUl9TRVJWRVJfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9TRVJWRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Nlc3Npb25fZHJpdmVyLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2Vzc2lvbl9kcml2ZXIuY2MKaW5kZXggNWE1OTg1My4uM2ExMmMxOSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2Vzc2lvbl9kcml2ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2Vzc2lvbl9kcml2ZXIuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci9zZXNzaW9uX2RyaXZlci5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXNzaW9uX2RyaXZlci5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvc2Vzc2lvbl9kcml2ZXIuaAppbmRleCBhYWQ5ZDMwLi43ZWJlZGEwIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci9zZXNzaW9uX2RyaXZlci5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Nlc3Npb25fZHJpdmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfU0VTU0lPTl9EUklWRVJfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9TRVNTSU9OX0RSSVZFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvdGVzdGluZy9zdHViX3dpbmRvdy5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvdGVzdGluZy9zdHViX3dpbmRvdy5oCmluZGV4IGZkZDRjYWQuLjc3MGIzNmQgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3Rlc3Rpbmcvc3R1Yl93aW5kb3cuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci90ZXN0aW5nL3N0dWJfd2luZG93LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfVEVTVElOR19TVFVCX1dJTkRPV19IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1RFU1RJTkdfU1RVQl9XSU5ET1dfSF8KQEAgLTU5LDcgKzU3LDggQEAKICAgICAgICAgYmFzZTo6QmluZCgmU3R1YkVycm9yQ2FsbGJhY2spLCBOVUxMLCBuZXR3b3JrX2JyaWRnZTo6UG9zdFNlbmRlcigpLAogICAgICAgICBzdGQ6OnN0cmluZygpIC8qIGRlZmF1bHQgc2VjdXJpdHkgcG9saWN5ICovLCBkb206OmtDc3BFbmZvcmNlbWVudEVuYWJsZSwKICAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIGNzcF9wb2xpY3lfY2hhbmdlZCAqLywKLSAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19jbG9zZSAqLyk7CisgICAgICAgIGJhc2U6OkNsb3N1cmUoKSAvKiByYW5fYW5pbWF0aW9uX2ZyYW1lX2NhbGxiYWNrcyAqLywKKyAgICAgICAgYmFzZTo6Q2xvc3VyZSgpIC8qIHdpbmRvd19jbG9zZSAqLywgTlVMTCk7CiAgICAgZ2xvYmFsX2Vudmlyb25tZW50Xy0+Q3JlYXRlR2xvYmFsT2JqZWN0KHdpbmRvd18sICZlbnZpcm9ubWVudF9zZXR0aW5nc18pOwogICB9CiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3V0aWwvY2FsbF9vbl9tZXNzYWdlX2xvb3AuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3V0aWwvY2FsbF9vbl9tZXNzYWdlX2xvb3AuaAppbmRleCBjMmExOWQyLi4zZTAyYzk0IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci91dGlsL2NhbGxfb25fbWVzc2FnZV9sb29wLmgKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvdXRpbC9jYWxsX29uX21lc3NhZ2VfbG9vcC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1VUSUxfQ0FMTF9PTl9NRVNTQUdFX0xPT1BfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9VVElMX0NBTExfT05fTUVTU0FHRV9MT09QX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci91dGlsL2NvbW1hbmRfcmVzdWx0LmggYi9zcmMvY29iYWx0L3dlYmRyaXZlci91dGlsL2NvbW1hbmRfcmVzdWx0LmgKaW5kZXggODk0NGQ0ZC4uMTNjZWIzZCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvdXRpbC9jb21tYW5kX3Jlc3VsdC5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3V0aWwvY29tbWFuZF9yZXN1bHQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1dFQkRSSVZFUl9VVElMX0NPTU1BTkRfUkVTVUxUX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfVVRJTF9DT01NQU5EX1JFU1VMVF9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvdXRpbC9kaXNwYXRjaF9jb21tYW5kX2ZhY3RvcnkuaCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3V0aWwvZGlzcGF0Y2hfY29tbWFuZF9mYWN0b3J5LmgKaW5kZXggY2ZlZDI5OS4uMjg0ZmM5OCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvdXRpbC9kaXNwYXRjaF9jb21tYW5kX2ZhY3RvcnkuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci91dGlsL2Rpc3BhdGNoX2NvbW1hbmRfZmFjdG9yeS5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfV0VCRFJJVkVSX1VUSUxfRElTUEFUQ0hfQ09NTUFORF9GQUNUT1JZX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJEUklWRVJfVVRJTF9ESVNQQVRDSF9DT01NQU5EX0ZBQ1RPUllfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYl9kcml2ZXJfbW9kdWxlLmNjIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViX2RyaXZlcl9tb2R1bGUuY2MKaW5kZXggOWI0YjlkMC4uMTYxNGZiMiAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViX2RyaXZlcl9tb2R1bGUuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViX2RyaXZlcl9tb2R1bGUuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3dlYmRyaXZlci93ZWJfZHJpdmVyX21vZHVsZS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJfZHJpdmVyX21vZHVsZS5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViX2RyaXZlcl9tb2R1bGUuaAppbmRleCBiMGM4OWVkLi4yOGU5NDZiIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJfZHJpdmVyX21vZHVsZS5oCisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYl9kcml2ZXJfbW9kdWxlLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfV0VCX0RSSVZFUl9NT0RVTEVfSF8KICNkZWZpbmUgQ09CQUxUX1dFQkRSSVZFUl9XRUJfRFJJVkVSX01PRFVMRV9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyLmd5cCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYmRyaXZlci5neXAKaW5kZXggMTQ2M2EwMS4uMjRiZDQ5MCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyLmd5cAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJkcml2ZXIuZ3lwCkBAIC04OCw5ICs4OCw2IEBACiAgICAgICAgICdjb3B5X3dlYmRyaXZlcl9kYXRhJywKICAgICAgIF0sCiAgICAgfSwKLQotCi0KICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnY29weV93ZWJkcml2ZXJfZGF0YScsCiAgICAgICAndHlwZSc6ICdub25lJywKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYmRyaXZlcl90ZXN0Lmd5cCBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dlYmRyaXZlcl90ZXN0Lmd5cAppbmRleCBkMDFiZWY1Li5jOTVkZGI3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlci93ZWJkcml2ZXJfdGVzdC5neXAKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2ViZHJpdmVyX3Rlc3QuZ3lwCkBAIC0xNCw4ICsxNCw4IEBACiAgICAgICAgIH1dLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICc8KERFUFRIKS9iYXNlL2Jhc2UuZ3lwOnJ1bl9hbGxfdW5pdHRlc3RzJywKICAgICAgICAgJzwoREVQVEgpL2NvYmFsdC9icm93c2VyL2Jyb3dzZXIuZ3lwOmJyb3dzZXInLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9nbW9jay5neXA6Z21vY2snLAogICAgICAgICAnPChERVBUSCkvdGVzdGluZy9ndGVzdC5neXA6Z3Rlc3QnLAogICAgICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dpbmRvd19kcml2ZXIuY2MgYi9zcmMvY29iYWx0L3dlYmRyaXZlci93aW5kb3dfZHJpdmVyLmNjCmluZGV4IGIyM2FiYzIuLjkyNzIxYjcgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dpbmRvd19kcml2ZXIuY2MKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2luZG93X2RyaXZlci5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2ViZHJpdmVyL3dpbmRvd19kcml2ZXIuaCIKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2luZG93X2RyaXZlci5oIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXIvd2luZG93X2RyaXZlci5oCmluZGV4IGU2OGYwNmQuLjRmNDk3M2IgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyL3dpbmRvd19kcml2ZXIuaAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlci93aW5kb3dfZHJpdmVyLmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9XRUJEUklWRVJfV0lORE9XX0RSSVZFUl9IXwogI2RlZmluZSBDT0JBTFRfV0VCRFJJVkVSX1dJTkRPV19EUklWRVJfSF8KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYWxsLnB5IGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9hbGwucHkKaW5kZXggM2NkODI2Ni4uYzA4ZDkzYyAxMDA3NTUKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9hbGwucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9hbGwucHkKQEAgLTExLDE4ICsxMSwxOSBAQAogaW1wb3J0IHVuaXR0ZXN0CiAKICMgVGhlIHBhcmVudCBkaXJlY3RvcnkgaXMgYSBtb2R1bGUKLXN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKAotICAgIG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSkpCitzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpKQogCiAjIHB5bGludDogZGlzYWJsZT1DNjIwNCxDNjIwMwogaW1wb3J0IHR2X3Rlc3RjYXNlCiAKKwogZGVmIF9hZGRfdGVzdCh0ZXN0X3N1aXRlLCBkaXJfcGF0aCwgdGVzdF9uYW1lKToKICAgaWYgb3MucGF0aC5pc2ZpbGUob3MucGF0aC5qb2luKGRpcl9wYXRoLCB0ZXN0X25hbWUgKyAiLnB5IikpOgogICAgIHByaW50KCJBZGRpbmcgdGVzdDoge30iLmZvcm1hdCh0ZXN0X25hbWUpKQogICAgIHRlc3Rfc3VpdGUuYWRkVGVzdCh1bml0dGVzdC5UZXN0TG9hZGVyKCkubG9hZFRlc3RzRnJvbU1vZHVsZSgKICAgICAgICAgaW1wb3J0bGliLmltcG9ydF9tb2R1bGUoInRlc3RzLiIgKyB0ZXN0X25hbWUpKSkKIAorCiAjIHB5bGludDogZGlzYWJsZT11bnVzZWQtYXJndW1lbnQKIGRlZiBsb2FkX3Rlc3RzKGxvYWRlciwgdGVzdHMsIHBhdHRlcm4pOgogICAiIiJUaGlzIGlzIGEgUHl0aG9uIHVuaXR0ZXN0ICJsb2FkX3Rlc3RzIHByb3RvY29sIG1ldGhvZC4iIiIKQEAgLTMxLDcgKzMyLDcgQEAKIAogICAjICJ0aW1lX3RvX3NoZWxmIiBtdXN0IGJlIHRoZSBmaXJzdCB0ZXN0IGFkZGVkLiBUaGUgdGltaW5ncyB0aGF0IGl0CiAgICMgcmVjb3JkcyByZXF1aXJlIGl0IHRvIHJ1biBmaXJzdC4KLSAgX2FkZF90ZXN0KHRlc3Rfc3VpdGUsIGRpcl9wYXRoLCAidGltZV90b19zaGVsZiIpCisgIF9hZGRfdGVzdCh0ZXN0X3N1aXRlLCBkaXJfcGF0aCwgInN0YXJ0dXAiKQogICBfYWRkX3Rlc3QodGVzdF9zdWl0ZSwgZGlyX3BhdGgsICJicm93c2VfaG9yaXpvbnRhbCIpCiAgIF9hZGRfdGVzdCh0ZXN0X3N1aXRlLCBkaXJfcGF0aCwgImJyb3dzZV92ZXJ0aWNhbCIpCiAgIF9hZGRfdGVzdCh0ZXN0X3N1aXRlLCBkaXJfcGF0aCwgImJyb3dzZV90b19ndWlkZSIpCkBAIC00MSw1ICs0Miw2IEBACiAKICAgcmV0dXJuIHRlc3Rfc3VpdGUKIAorCiBpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgogICB0dl90ZXN0Y2FzZS5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX2hvcml6b250YWwucHkgYi9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3Rlc3RzL2Jyb3dzZV9ob3Jpem9udGFsLnB5CmluZGV4IGQ1NWNiNWEuLmRkMjFiM2UgMTAwNzU1Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX2hvcml6b250YWwucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfaG9yaXpvbnRhbC5weQpAQCAtMTIsNyArMTIsNiBAQAogc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpKSkKIAogIyBweWxpbnQ6IGRpc2FibGU9QzYyMDQsQzYyMDMKLWltcG9ydCB0dgogaW1wb3J0IHR2X3Rlc3RjYXNlCiBpbXBvcnQgdHZfdGVzdGNhc2VfZXZlbnRfcmVjb3JkZXIKIGltcG9ydCB0dl90ZXN0Y2FzZV91dGlsCkBAIC0zNiwxMiArMzUsMTIgQEAKIAogICAgIGZvciBfIGluIHhyYW5nZShOVU1fTE9BRF9UVl9DQUxMUyk6CiAgICAgICBzZWxmLmxvYWRfdHYoKQotICAgICAgc2VsZi5zZW5kX2tleXModHYuRk9DVVNFRF9USUxFLCBrZXlzLktleXMuQVJST1dfUklHSFQpCisgICAgICBzZWxmLnNlbmRfa2V5cyhrZXlzLktleXMuQVJST1dfUklHSFQpCiAgICAgICBzZWxmLndhaXRfZm9yX3Byb2Nlc3NpbmdfY29tcGxldGVfYWZ0ZXJfZm9jdXNlZF9zaGVsZigpCiAKICAgICAgIGZvciBfIGluIHhyYW5nZShOVU1fSVRFUkFUSU9OU19QRVJfTE9BRF9UVl9DQUxMKToKICAgICAgICAgcmVjb3JkZXIub25fc3RhcnRfZXZlbnQoKQotICAgICAgICBzZWxmLnNlbmRfa2V5cyh0di5GT0NVU0VEX1RJTEUsIGtleXMuS2V5cy5BUlJPV19SSUdIVCkKKyAgICAgICAgc2VsZi5zZW5kX2tleXMoa2V5cy5LZXlzLkFSUk9XX1JJR0hUKQogICAgICAgICBzZWxmLndhaXRfZm9yX3Byb2Nlc3NpbmdfY29tcGxldGVfYWZ0ZXJfZm9jdXNlZF9zaGVsZigpCiAgICAgICAgIHJlY29yZGVyLm9uX2VuZF9ldmVudCgpCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX3RvX2d1aWRlLnB5IGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfdG9fZ3VpZGUucHkKaW5kZXggMjBlMTNlNS4uNGE3NGM0YSAxMDA3NTUKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfdG9fZ3VpZGUucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfdG9fZ3VpZGUucHkKQEAgLTQ4LDEzICs0OCwxMyBAQAogCiAgICAgICBmb3IgXyBpbiB4cmFuZ2UoTlVNX0lURVJBVElPTlNfUEVSX0xPQURfVFZfQ0FMTCk6CiAgICAgICAgIGJyb3dzZV90b19ndWlkZV9yZWNvcmRlci5vbl9zdGFydF9ldmVudCgpCi0gICAgICAgIHNlbGYuc2VuZF9rZXlzKHR2LkZPQ1VTRURfU0hFTEYsIGtleXMuS2V5cy5BUlJPV19MRUZUKQorICAgICAgICBzZWxmLnNlbmRfa2V5cyhrZXlzLktleXMuQVJST1dfTEVGVCkKICAgICAgICAgc2VsZi53YWl0X2Zvcl9wcm9jZXNzaW5nX2NvbXBsZXRlKCkKICAgICAgICAgc2VsZi5hc3NlcnRfZGlzcGxheWVkKHR2LkZPQ1VTRURfR1VJREUpCiAgICAgICAgIGJyb3dzZV90b19ndWlkZV9yZWNvcmRlci5vbl9lbmRfZXZlbnQoKQogCiAgICAgICAgIGd1aWRlX3RvX2Jyb3dzZV9yZWNvcmRlci5vbl9zdGFydF9ldmVudCgpCi0gICAgICAgIHNlbGYuc2VuZF9rZXlzKHR2LkZPQ1VTRURfR1VJREUsIGtleXMuS2V5cy5BUlJPV19SSUdIVCkKKyAgICAgICAgc2VsZi5zZW5kX2tleXMoa2V5cy5LZXlzLkFSUk9XX1JJR0hUKQogICAgICAgICBzZWxmLndhaXRfZm9yX3Byb2Nlc3NpbmdfY29tcGxldGVfYWZ0ZXJfZm9jdXNlZF9zaGVsZigpCiAgICAgICAgIGd1aWRlX3RvX2Jyb3dzZV9yZWNvcmRlci5vbl9lbmRfZXZlbnQoKQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3Rlc3RzL2Jyb3dzZV90b19zZWFyY2gucHkgYi9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3Rlc3RzL2Jyb3dzZV90b19zZWFyY2gucHkKaW5kZXggM2M0NzI4ZS4uNjg4ZTkzOSAxMDA3NTUKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfdG9fc2VhcmNoLnB5CisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX3RvX3NlYXJjaC5weQpAQCAtNTAsMTMgKzUwLDEzIEBACiAKICAgICAgIGZvciBfIGluIHhyYW5nZShOVU1fSVRFUkFUSU9OU19QRVJfTE9BRF9UVl9DQUxMKToKICAgICAgICAgYnJvd3NlX3RvX3NlYXJjaF9yZWNvcmRlci5vbl9zdGFydF9ldmVudCgpCi0gICAgICAgIHNlbGYuc2VuZF9rZXlzKHR2LlNFQVJDSF9MRUdFTkQsICJzIikKKyAgICAgICAgc2VsZi5zZW5kX2tleXMoInMiKQogICAgICAgICBzZWxmLndhaXRfZm9yX3Byb2Nlc3NpbmdfY29tcGxldGUoRmFsc2UpCiAgICAgICAgIHNlbGYuYXNzZXJ0X2Rpc3BsYXllZCh0di5GT0NVU0VEX1NFQVJDSCkKICAgICAgICAgYnJvd3NlX3RvX3NlYXJjaF9yZWNvcmRlci5vbl9lbmRfZXZlbnQoKQogCiAgICAgICAgIHNlYXJjaF90b19icm93c2VfcmVjb3JkZXIub25fc3RhcnRfZXZlbnQoKQotICAgICAgICBzZWxmLnNlbmRfa2V5cyh0di5TRUFSQ0gsIGtleXMuS2V5cy5FU0NBUEUpCisgICAgICAgIHNlbGYuc2VuZF9rZXlzKGtleXMuS2V5cy5FU0NBUEUpCiAgICAgICAgIHNlbGYud2FpdF9mb3JfcHJvY2Vzc2luZ19jb21wbGV0ZV9hZnRlcl9mb2N1c2VkX3NoZWxmKCkKICAgICAgICAgc2VhcmNoX3RvX2Jyb3dzZV9yZWNvcmRlci5vbl9lbmRfZXZlbnQoKQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3Rlc3RzL2Jyb3dzZV90b193YXRjaC5weSBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX3RvX3dhdGNoLnB5CmluZGV4IDk1NmQ0NGIuLmVkMmY3M2UgMTAwNzU1Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX3RvX3dhdGNoLnB5CisrKyBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX3RvX3dhdGNoLnB5CkBAIC0xMiw3ICsxMiw2IEBACiBzeXMucGF0aC5pbnNlcnQoMCwgb3MucGF0aC5kaXJuYW1lKG9zLnBhdGguZGlybmFtZShvcy5wYXRoLnJlYWxwYXRoKF9fZmlsZV9fKSkpKQogCiAjIHB5bGludDogZGlzYWJsZT1DNjIwNCxDNjIwMwotaW1wb3J0IHR2CiBpbXBvcnQgdHZfdGVzdGNhc2UKIGltcG9ydCB0dl90ZXN0Y2FzZV9ldmVudF9yZWNvcmRlcgogaW1wb3J0IHR2X3Rlc3RjYXNlX3V0aWwKQEAgLTUwLDExICs0OSwxMSBAQAogICAgICAgc2VsZi5sb2FkX3R2KCkKIAogICAgICAgZm9yIF8gaW4geHJhbmdlKE5VTV9JVEVSQVRJT05TX1BFUl9MT0FEX1RWX0NBTEwpOgotICAgICAgICBzZWxmLnNlbmRfa2V5cyh0di5GT0NVU0VEX1NIRUxGLCBrZXlzLktleXMuQVJST1dfRE9XTikKKyAgICAgICAgc2VsZi5zZW5kX2tleXMoa2V5cy5LZXlzLkFSUk9XX0RPV04pCiAgICAgICAgIHNlbGYud2FpdF9mb3JfcHJvY2Vzc2luZ19jb21wbGV0ZV9hZnRlcl9mb2N1c2VkX3NoZWxmKCkKIAogICAgICAgICBicm93c2VfdG9fd2F0Y2hfcmVjb3JkZXIub25fc3RhcnRfZXZlbnQoKQotICAgICAgICBzZWxmLnNlbmRfa2V5cyh0di5GT0NVU0VEX1RJTEUsIGtleXMuS2V5cy5FTlRFUikKKyAgICAgICAgc2VsZi5zZW5kX2tleXMoa2V5cy5LZXlzLkVOVEVSKQogICAgICAgICBzZWxmLndhaXRfZm9yX21lZGlhX2VsZW1lbnRfcGxheWluZygpCiAgICAgICAgIGJyb3dzZV90b193YXRjaF9yZWNvcmRlci5vbl9lbmRfZXZlbnQoKQogCkBAIC02Myw3ICs2Miw3IEBACiAgICAgICAgIHNlbGYud2FpdF9mb3JfdGl0bGVfY2FyZF9oaWRkZW4oKQogCiAgICAgICAgIHdhdGNoX3RvX2Jyb3dzZV9yZWNvcmRlci5vbl9zdGFydF9ldmVudCgpCi0gICAgICAgIHNlbGYuc2VuZF9rZXlzKHR2LkZPQ1VTRURfV0FUQ0gsIGtleXMuS2V5cy5FU0NBUEUpCisgICAgICAgIHNlbGYuc2VuZF9rZXlzKGtleXMuS2V5cy5FU0NBUEUpCiAgICAgICAgIHNlbGYud2FpdF9mb3JfcHJvY2Vzc2luZ19jb21wbGV0ZV9hZnRlcl9mb2N1c2VkX3NoZWxmKCkKICAgICAgICAgd2F0Y2hfdG9fYnJvd3NlX3JlY29yZGVyLm9uX2VuZF9ldmVudCgpCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvYnJvd3NlX3ZlcnRpY2FsLnB5IGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfdmVydGljYWwucHkKaW5kZXggNzZhM2ZmOC4uZmIzMWI2OSAxMDA3NTUKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfdmVydGljYWwucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9icm93c2VfdmVydGljYWwucHkKQEAgLTEyLDcgKzEyLDYgQEAKIHN5cy5wYXRoLmluc2VydCgwLCBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5kaXJuYW1lKG9zLnBhdGgucmVhbHBhdGgoX19maWxlX18pKSkpCiAKICMgcHlsaW50OiBkaXNhYmxlPUM2MjA0LEM2MjAzCi1pbXBvcnQgdHYKIGltcG9ydCB0dl90ZXN0Y2FzZQogaW1wb3J0IHR2X3Rlc3RjYXNlX2V2ZW50X3JlY29yZGVyCiBpbXBvcnQgdHZfdGVzdGNhc2VfdXRpbApAQCAtMzYsMTIgKzM1LDEyIEBACiAKICAgICBmb3IgXyBpbiB4cmFuZ2UoTlVNX0xPQURfVFZfQ0FMTFMpOgogICAgICAgc2VsZi5sb2FkX3R2KCkKLSAgICAgIHNlbGYuc2VuZF9rZXlzKHR2LkZPQ1VTRURfU0hFTEYsIGtleXMuS2V5cy5BUlJPV19ET1dOKQorICAgICAgc2VsZi5zZW5kX2tleXMoa2V5cy5LZXlzLkFSUk9XX0RPV04pCiAgICAgICBzZWxmLndhaXRfZm9yX3Byb2Nlc3NpbmdfY29tcGxldGVfYWZ0ZXJfZm9jdXNlZF9zaGVsZigpCiAKICAgICAgIGZvciBfIGluIHhyYW5nZShOVU1fSVRFUkFUSU9OU19QRVJfTE9BRF9UVl9DQUxMKToKICAgICAgICAgcmVjb3JkZXIub25fc3RhcnRfZXZlbnQoKQotICAgICAgICBzZWxmLnNlbmRfa2V5cyh0di5GT0NVU0VEX1NIRUxGLCBrZXlzLktleXMuQVJST1dfRE9XTikKKyAgICAgICAgc2VsZi5zZW5kX2tleXMoa2V5cy5LZXlzLkFSUk9XX0RPV04pCiAgICAgICAgIHNlbGYud2FpdF9mb3JfcHJvY2Vzc2luZ19jb21wbGV0ZV9hZnRlcl9mb2N1c2VkX3NoZWxmKCkKICAgICAgICAgcmVjb3JkZXIub25fZW5kX2V2ZW50KCkKIApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9zdGFydHVwLnB5IGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90ZXN0cy9zdGFydHVwLnB5Cm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmY5ZGJjMGEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3Rlc3RzL3N0YXJ0dXAucHkKQEAgLTAsMCArMSw2OCBAQAorIyEvdXNyL2Jpbi9weXRob24yCisiIiJTaW1wbGUgYmVuY2htYXJrIGZvciBtZWFzdXJpbmcgc3RhcnR1cCB0aW1lLiIiIgorCitmcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgorZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKKworIyBUaGUgcGFyZW50IGRpcmVjdG9yeSBpcyBhIG1vZHVsZQorc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpKSkKKworIyBweWxpbnQ6IGRpc2FibGU9QzYyMDQsQzYyMDMKK2ltcG9ydCB0aW1lcgoraW1wb3J0IHR2X3Rlc3RjYXNlCitpbXBvcnQgdHZfdGVzdGNhc2VfdXRpbAorCitOVU1fQkxBTktfVE9fQlJPV1NFX0lURVJBVElPTlMgPSAxMAorCitMQVVOQ0hfVE9fQkxBTksgPSAid2JTdGFydHVwRHVyTGF1bmNoVG9CbGFua1VzIgorQkxBTktfVE9fQlJPV1NFID0gIndiU3RhcnR1cER1ckJsYW5rVG9Ccm93c2VVcyIKKworCitjbGFzcyBTdGFydHVwVGVzdCh0dl90ZXN0Y2FzZS5UdlRlc3RDYXNlKToKKworICBkZWYgc2V0VXAoc2VsZik6CisgICAgIyBPdmVycmlkZSBUdlRlc3RDYXNlJ3Mgc2V0VXAoKSBzbyB0aGF0IGJsYW5rIHN0YXJ0dXAgY2FuIGZpcnN0IGJlIG1lYXN1cmVkLgorICAgIHBhc3MKKworICBkZWYgdGVzdF9zaW1wbGUoc2VsZik6CisgICAgIiIiVGhpcyB0ZXN0IHRyaWVzIHRvIG1lYXN1cmUgdGhlIHN0YXJ0dXAgdGltZSBmb3IgdGhlIFlvdVR1YmUgVFYgcGFnZS4KKworICAgIFNwZWNpZmljYWxseSwgdGhpcyB0ZXN0IHVzZXMgdGhlIENvYmFsdCBDVmFsIENvYmFsdC5MaWZldGltZSwgd2hpY2ggZ2V0cworICAgIHVwZGF0ZWQgfjYwSHogb24gYSBiZXN0IGVmZm9ydCBiYXNpcyBhbmQgaXMgaW4gbWljcm9zZWNvbmRzLCB0byBkZXRlcm1pbmUKKyAgICAid2JTdGFydHVwRHVyTGF1bmNoVG9CbGFua1VzIiBhbmQgdXNlcyBUaW1lciB0byBkZXRlcm1pbmUKKyAgICAid2JTdGFydHVwRHVyQmxhbmtUb0Jyb3dzZVVzIi4KKyAgICAiIiIKKworICAgIGR1cl9sYXVuY2hfdG9fYmxhbmtfdXMgPSBzZWxmLmdldF9jdmFsKCJDb2JhbHQuTGlmZXRpbWUiKQorCisgICAgIyBDYWxsIFR2VGVzdENhc2UncyBzZXRVcCgpIG5vdyB0aGF0IHRoZSBibGFuayBzdGFydHVwIHRpbWUgaGFzIGJlZW4KKyAgICAjIG1lYXN1cmVkLgorICAgIHN1cGVyKFN0YXJ0dXBUZXN0LCBzZWxmKS5zZXRVcCgpCisKKyAgICAjIEJsYW5rIHRvIGJyb3dzZXIgcmVjb3JkIHN0cmF0ZWdpZXMKKyAgICBibGFua190b19icm93c2VfcmVjb3JkX3N0cmF0ZWdpZXMgPSBbXQorICAgIGJsYW5rX3RvX2Jyb3dzZV9yZWNvcmRfc3RyYXRlZ2llcy5hcHBlbmQoCisgICAgICAgIHR2X3Rlc3RjYXNlX3V0aWwuUmVjb3JkU3RyYXRlZ3lNZWFuKCkpCisgICAgYmxhbmtfdG9fYnJvd3NlX3JlY29yZF9zdHJhdGVnaWVzLmFwcGVuZCgKKyAgICAgICAgdHZfdGVzdGNhc2VfdXRpbC5SZWNvcmRTdHJhdGVneVBlcmNlbnRpbGVzKCkpCisKKyAgICAjIEJsYW5rIHRvIGJyb3dzZXIgcmVjb3JkZXIKKyAgICBibGFua190b19icm93c2VfcmVjb3JkZXIgPSB0dl90ZXN0Y2FzZV91dGlsLlJlc3VsdHNSZWNvcmRlcigKKyAgICAgICAgQkxBTktfVE9fQlJPV1NFLCBibGFua190b19icm93c2VfcmVjb3JkX3N0cmF0ZWdpZXMpCisKKyAgICBmb3IgXyBpbiByYW5nZShOVU1fQkxBTktfVE9fQlJPV1NFX0lURVJBVElPTlMpOgorICAgICAgc2VsZi5sb2FkX2JsYW5rKCkKKyAgICAgIHdpdGggdGltZXIuVGltZXIoQkxBTktfVE9fQlJPV1NFKSBhcyB0OgorICAgICAgICBzZWxmLmxvYWRfdHYoKQorICAgICAgYmxhbmtfdG9fYnJvd3NlX3JlY29yZGVyLmNvbGxlY3RfdmFsdWUoaW50KHQuc2Vjb25kc19lbGFwc2VkICogMTAwMDAwMCkpCisKKyAgICB0dl90ZXN0Y2FzZV91dGlsLnJlY29yZF90ZXN0X3Jlc3VsdChMQVVOQ0hfVE9fQkxBTkssIGR1cl9sYXVuY2hfdG9fYmxhbmtfdXMpCisgICAgYmxhbmtfdG9fYnJvd3NlX3JlY29yZGVyLm9uX2VuZF90ZXN0KCkKKworCitpZiBfX25hbWVfXyA9PSAiX19tYWluX18iOgorICB0dl90ZXN0Y2FzZS5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvdGltZV90b19zaGVsZi5weSBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdGVzdHMvdGltZV90b19zaGVsZi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNGExYzZmYS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3Rlc3RzL3RpbWVfdG9fc2hlbGYucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2OSArMCwwIEBACi0jIS91c3IvYmluL3B5dGhvbjIKLSMgQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotIwotIyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0jIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0jIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotIyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0jIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSIiIkNhbGN1bGF0ZSB0aW1lIHRvIGRvd25sb2FkIFlvdVR1YmUgVFYgYXBwIGFuZCBpbml0aWFsIGxheW91dCBvZiBzaGVsdmVzLiIiIgotCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGFic29sdXRlX2ltcG9ydAotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBkaXZpc2lvbgotZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgotCi1pbXBvcnQgb3MKLWltcG9ydCBzeXMKLQotIyBUaGUgcGFyZW50IGRpcmVjdG9yeSBpcyBhIG1vZHVsZQotc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguZGlybmFtZShvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5yZWFscGF0aChfX2ZpbGVfXykpKSkKLQotIyBweWxpbnQ6IGRpc2FibGU9QzYyMDQsQzYyMDMKLWltcG9ydCB0aW1lcgotaW1wb3J0IHR2X3Rlc3RjYXNlCi1pbXBvcnQgdHZfdGVzdGNhc2VfdXRpbAotCi0KLWNsYXNzIFRpbWVUb1NoZWxmKHR2X3Rlc3RjYXNlLlR2VGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICAjIE92ZXJyaWRlIFR2VGVzdENhc2UncyBzZXRVcCgpIHNvIHRoYXQgYmxhbmsgc3RhcnR1cCBjYW4gZmlyc3QgYmUgbWVhc3VyZWQuCi0gICAgcGFzcwotCi0gIGRlZiB0ZXN0X3NpbXBsZShzZWxmKToKLSAgICAiIiJUaGlzIHRlc3QgdHJpZXMgdG8gbWVhc3VyZSB0aGUgc3RhcnR1cCB0aW1lIGZvciB0aGUgWW91VHViZSBUViBwYWdlLgotCi0gICAgU3BlY2lmaWNhbGx5LCB0aGlzIHRlc3QgdXNlcyB0aGUgQ29iYWx0IENWYWwgQ29iYWx0LkxpZmV0aW1lLCB3aGljaCBnZXRzCi0gICAgdXBkYXRlZCB+NjBIeiBvbiBhIGJlc3QgZWZmb3J0IGJhc2lzIGFuZCBpcyBpbiBtaWNyb3NlY29uZHMsIHRvIGRldGVybWluZQotICAgICJ0aW1lVG9TaGVsZkJsYW5rU3RhcnR1cFRpbWVVcyIgYW5kIHVzZXMgVGltZXIgdG8gZGV0ZXJtaW5lCi0gICAgInRpbWVUb1NoZWxmVGVzdFRpbWVTaGVsZkRpc3BsYXlNZWRpYW5VcyIuCi0gICAgIiIiCi0KLSAgICBibGFua19zdGFydHVwX3RpbWVfbWljcm9zZWNvbmRzID0gc2VsZi5nZXRfY3ZhbCgnQ29iYWx0LkxpZmV0aW1lJykKLQotICAgICMgQ2FsbCBUdlRlc3RDYXNlJ3Mgc2V0VXAoKSBub3cgdGhhdCB0aGUgYmxhbmsgc3RhcnR1cCB0aW1lIGhhcyBiZWVuCi0gICAgIyBtZWFzdXJlZC4KLSAgICBzdXBlcihUaW1lVG9TaGVsZiwgc2VsZikuc2V0VXAoKQotCi0gICAgbWV0cmljc19hcnJheSA9IFtdCi0gICAgZm9yIF8gaW4gcmFuZ2UoMTApOgotICAgICAgd2l0aCB0aW1lci5UaW1lcignVGltZVNoZWxmRGlzcGxheScpIGFzIHQ6Ci0gICAgICAgIHNlbGYubG9hZF90digpCi0gICAgICBzdGFydHVwX3RpbWVfbWljcm9zZWNvbmRzID0gaW50KHQuc2Vjb25kc19lbGFwc2VkICogMTAwMDAwMCkKLSAgICAgIG1ldHJpY3NfYXJyYXkuYXBwZW5kKHN0YXJ0dXBfdGltZV9taWNyb3NlY29uZHMpCi0KLSAgICB0dl90ZXN0Y2FzZV91dGlsLnJlY29yZF90ZXN0X3Jlc3VsdCgndGltZVRvU2hlbGZCbGFua1N0YXJ0dXBUaW1lVXMnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJsYW5rX3N0YXJ0dXBfdGltZV9taWNyb3NlY29uZHMpCi0gICAgdHZfdGVzdGNhc2VfdXRpbC5yZWNvcmRfdGVzdF9yZXN1bHRfbWVkaWFuKAotICAgICAgICAndGltZVRvU2hlbGZUZXN0VGltZVNoZWxmRGlzcGxheU1lZGlhblVzJywgbWV0cmljc19hcnJheSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB0dl90ZXN0Y2FzZS5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHYucHkgYi9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3R2LnB5CmluZGV4IDUzODJhOGQuLmIzZTZkMjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHYucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90di5weQpAQCAtOCwxMCArOCw0IEBACiBGT0NVU0VEX1NFQVJDSCA9ICcuZm9jdXNlZC5zZWFyY2gnCiBGT0NVU0VEX1NIRUxGID0gJy5mb2N1c2VkLnNlbGVjdGVkLnNoZWxmJwogRk9DVVNFRF9TSEVMRl9USVRMRSA9ICcuZm9jdXNlZC5zZWxlY3RlZC5zaGVsZiAuc2hlbGYtaGVhZGVyLXRpdGxlIC5tYWluJwotRk9DVVNFRF9USUxFID0gJy5mb2N1c2VkLnRpbGUnCi1GT0NVU0VEX1dBVENIID0gJy5mb2N1c2VkLndhdGNoJwotU0VBUkNIX0xFR0VORCA9ICcuc2VhcmNoLm5vLW1vZGVsLmxlZ2VuZC1pdGVtJwogVElUTEVfQ0FSRF9ISURERU4gPSAnLnRpdGxlLWNhcmQuaGlkZGVuJwotCi1TRUFSQ0ggPSAnI3NlYXJjaCcKLVdBVENIID0gJyN3YXRjaCcKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2UucHkgYi9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3R2X3Rlc3RjYXNlLnB5CmluZGV4IGIzNzgxYjQuLmRmZGI1ZDkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2UucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90dl90ZXN0Y2FzZS5weQpAQCAtMjEsMjEgKzIxLDE1IEBACiAKICMgc2VsZW5pdW0gaW1wb3J0cwogIyBweWxpbnQ6IGRpc2FibGU9QzAxMDMKLVdlYkRyaXZlcldhaXQgPSB0dl90ZXN0Y2FzZV91dGlsLmltcG9ydF9zZWxlbml1bV9tb2R1bGUoCi0gICAgc3VibW9kdWxlPSJ3ZWJkcml2ZXIuc3VwcG9ydC51aSIpLldlYkRyaXZlcldhaXQKLQotRWxlbWVudE5vdFZpc2libGVFeGNlcHRpb24gPSB0dl90ZXN0Y2FzZV91dGlsLmltcG9ydF9zZWxlbml1bV9tb2R1bGUoCi0gICAgc3VibW9kdWxlPSJjb21tb24uZXhjZXB0aW9ucyIpLkVsZW1lbnROb3RWaXNpYmxlRXhjZXB0aW9uCitBY3Rpb25DaGFpbnMgPSB0dl90ZXN0Y2FzZV91dGlsLmltcG9ydF9zZWxlbml1bV9tb2R1bGUoCisgICAgc3VibW9kdWxlPSJ3ZWJkcml2ZXIuY29tbW9uLmFjdGlvbl9jaGFpbnMiKS5BY3Rpb25DaGFpbnMKIAogV0lORE9XRFJJVkVSX0NSRUFURURfVElNRU9VVF9TRUNPTkRTID0gMzAKK1dFQk1PRFVMRV9MT0FERURfVElNRU9VVF9TRUNPTkRTID0gMzAKIFBBR0VfTE9BRF9XQUlUX1NFQ09ORFMgPSAzMAogUFJPQ0VTU0lOR19USU1FT1VUX1NFQ09ORFMgPSAxNQogTUVESUFfVElNRU9VVF9TRUNPTkRTID0gMzAKIFRJVExFX0NBUkRfSElEREVOX1RJTUVPVVRfU0VDT05EUyA9IDMwCi0jIEN1cnJlbnRseSwgYWZ0ZXIgbG9hZGluZyBhIG5ldyBVUkwgd2l0aCBjb29raWVzIGVuYWJsZWQsIEthYnVraSByYW5kb21pemVzCi0jIHRoZSBzaGVsZiBlbnRyaWVzIHdoZW4gdGhlIHBhZ2UgZmluaXNoZXMgbG9hZGluZy4gU2xlZXAgZm9yIGEgYml0IHRvIGFsbG93Ci0jIHRoaXMgdG8gb2NjdXIgYmVmb3JlIHN0YXJ0aW5nIGFueSBhZGRpdGlvbmFsIGxvZ2ljLgotQ09CQUxUX1BPU1RfTkFWSUdBVEVfU0xFRVBfU0VDT05EUyA9IDUKIAogX2lzX2luaXRpYWxpemVkID0gRmFsc2UKIApAQCAtNTAsNiArNDQsOSBAQAogICBjbGFzcyBXaW5kb3dEcml2ZXJDcmVhdGVkVGltZW91dEV4Y2VwdGlvbihCYXNlRXhjZXB0aW9uKToKICAgICAiIiJFeGNlcHRpb24gdGhyb3duIHdoZW4gV2luZG93RHJpdmVyIHdhcyBub3QgY3JlYXRlZCBpbiB0aW1lLiIiIgogCisgIGNsYXNzIFdlYk1vZHVsZUxvYWRlZFRpbWVvdXRFeGNlcHRpb24oQmFzZUV4Y2VwdGlvbik6CisgICAgIiIiRXhjZXB0aW9uIHRocm93biB3aGVuIFdlYk1vZHVsZSB3YXMgbm90IGxvYWRlZCBpbiB0aW1lLiIiIgorCiAgIGNsYXNzIFByb2Nlc3NpbmdUaW1lb3V0RXhjZXB0aW9uKEJhc2VFeGNlcHRpb24pOgogICAgICIiIkV4Y2VwdGlvbiB0aHJvd24gd2hlbiBwcm9jZXNzaW5nIGRpZCBub3QgY29tcGxldGUgaW4gdGltZS4iIiIKIApAQCAtODEsOSArNzgsNiBAQAogICBkZWYgZ2V0X3dlYmRyaXZlcihzZWxmKToKICAgICByZXR1cm4gdHZfdGVzdGNhc2VfcnVubmVyLkdldFdlYkRyaXZlcigpCiAKLSAgZGVmIGdldF93aW5kb3dkcml2ZXJfY3JlYXRlZChzZWxmKToKLSAgICByZXR1cm4gdHZfdGVzdGNhc2VfcnVubmVyLkdldFdpbmRvd0RyaXZlckNyZWF0ZWQoKQotCiAgIGRlZiBnZXRfY3ZhbChzZWxmLCBjdmFsX25hbWUpOgogICAgICIiIlJldHVybnMgdGhlIFB5dGhvbiBvYmplY3QgcmVwcmVzZW50ZWQgYnkgYSBKU09OIGN2YWwgc3RyaW5nLgogCkBAIC05OSw3ICs5MywxOSBAQAogICAgIGVsc2U6CiAgICAgICByZXR1cm4ganNvbi5sb2Fkcyhqc29uX3Jlc3VsdCkKIAotICBkZWYgbG9hZF90dihzZWxmLCBsYWJlbD1Ob25lLCBhZGRpdGlvbmFsX3F1ZXJ5X3BhcmFtcz1Ob25lLAorICBkZWYgbG9hZF9ibGFuayhzZWxmKToKKyAgICAiIiJMb2FkcyBhYm91dDpibGFuayBhbmQgd2FpdHMgZm9yIGl0IHRvIGZpbmlzaC4KKworICAgIFJhaXNlczoKKyAgICAgIFVuZGVybHlpbmcgV2ViRHJpdmVyIGV4Y2VwdGlvbnMKKyAgICAiIiIKKyAgICBzZWxmLmNsZWFyX3VybF9sb2FkZWRfZXZlbnRzKCkKKyAgICBzZWxmLmdldF93ZWJkcml2ZXIoKS5nZXQoImFib3V0OmJsYW5rIikKKyAgICBzZWxmLndhaXRfZm9yX3VybF9sb2FkZWRfZXZlbnRzKCkKKworICBkZWYgbG9hZF90dihzZWxmLAorICAgICAgICAgICAgICBsYWJlbD1Ob25lLAorICAgICAgICAgICAgICBhZGRpdGlvbmFsX3F1ZXJ5X3BhcmFtcz1Ob25lLAogICAgICAgICAgICAgICB0cmlnZ2Vyc19yZWxvYWQ9RmFsc2UpOgogICAgICIiIkxvYWRzIHRoZSBtYWluIFRWIHBhZ2UgYW5kIHdhaXRzIGZvciBpdCB0byBkaXNwbGF5LgogCkBAIC0xMTUsMTMgKzEyMSwxMiBAQAogICAgICAgcXVlcnlfcGFyYW1zID0geyJsYWJlbCI6IGxhYmVsfQogICAgIGlmIGFkZGl0aW9uYWxfcXVlcnlfcGFyYW1zIGlzIG5vdCBOb25lOgogICAgICAgcXVlcnlfcGFyYW1zLnVwZGF0ZShhZGRpdGlvbmFsX3F1ZXJ5X3BhcmFtcykKLSAgICBzZWxmLmdldF93aW5kb3dkcml2ZXJfY3JlYXRlZCgpLmNsZWFyKCkKKyAgICBzZWxmLmNsZWFyX3VybF9sb2FkZWRfZXZlbnRzKCkKICAgICBzZWxmLmdldF93ZWJkcml2ZXIoKS5nZXQodHZfdGVzdGNhc2VfdXRpbC5nZXRfdHZfdXJsKHF1ZXJ5X3BhcmFtcykpCi0gICAgc2VsZi53YWl0X2Zvcl93aW5kb3dkcml2ZXJfY3JlYXRlZCgpCisgICAgc2VsZi53YWl0X2Zvcl91cmxfbG9hZGVkX2V2ZW50cygpCiAgICAgaWYgdHJpZ2dlcnNfcmVsb2FkOgotICAgICAgc2VsZi5nZXRfd2luZG93ZHJpdmVyX2NyZWF0ZWQoKS5jbGVhcigpCi0gICAgICBzZWxmLndhaXRfZm9yX3dpbmRvd2RyaXZlcl9jcmVhdGVkKCkKLSAgICB0aW1lLnNsZWVwKENPQkFMVF9QT1NUX05BVklHQVRFX1NMRUVQX1NFQ09ORFMpCisgICAgICBzZWxmLmNsZWFyX3VybF9sb2FkZWRfZXZlbnRzKCkKKyAgICAgIHNlbGYud2FpdF9mb3JfdXJsX2xvYWRlZF9ldmVudHMoKQogICAgICMgTm90ZSB0aGF0IHRoZSBpbnRlcm5hbCB0ZXN0cyB1c2UgImV4cGVjdF90cmFuc2l0aW9uIiB3aGljaCBpcwogICAgICMgYSBtZWNoYW5pc20gdGhhdCBzZXRzIGEgbWF4aW11bSB0aW1lb3V0IGZvciBhICJAd2l0aF9yZXRyaWVzIgogICAgICMgZGVjb3JhdG9yLWRyaXZlbiBzdWNjZXNzIHJldHJ5IGxvb3AgZm9yIHN1YnNlcXVlbnQgd2ViZHJpdmVyIHJlcXVlc3RzLgpAQCAtMTg2LDQwICsxOTEsMzIgQEAKICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKGVsZW1lbnRzKSwgZXhwZWN0ZWRfbnVtKQogICAgIHJldHVybiBlbGVtZW50cwogCi0gIGRlZiBzZW5kX2tleXMoc2VsZiwgY3NzX3NlbGVjdG9yLCBrZXlzKToKLSAgICAiIiJTZW5kcyBrZXlzIHRvIGFuIGVsZW1lbnQgdW5pcXVlbHkgaWRlbnRpZmllZCBieSBhIHNlbGVjdG9yLgotCi0gICAgVGhpcyBtZXRob2QgcmV0cmllcyBmb3IgYSB0aW1lb3V0IHBlcmlvZCBpZiB0aGUgc2VsZWN0ZWQgZWxlbWVudAotICAgIGNvdWxkIG5vdCBiZSBpbW1lZGlhdGVseSBmb3VuZC4gSWYgdGhlIHJldHJpZXMgZG8gbm90IHN1Y2NlZWQsCi0gICAgdGhlIHVuZGVybHlpbmcgZXhjZXB0aW9uIGlzIHBhc3NlZCB0aHJvdWdoLgorICBkZWYgc2VuZF9rZXlzKHNlbGYsIGtleXMpOgorICAgICIiIlNlbmRzIGtleXMgdG8gd2hpY2hldmVyIGVsZW1lbnQgY3VycmVudGx5IGhhcyBmb2N1cy4KIAogICAgIEFyZ3M6Ci0gICAgICBjc3Nfc2VsZWN0b3I6IEEgQ1NTIHNlbGVjdG9yCiAgICAgICBrZXlzOiBrZXkgZXZlbnRzCiAKICAgICBSYWlzZXM6CiAgICAgICBVbmRlcmx5aW5nIFdlYkRyaXZlciBleGNlcHRpb25zCiAgICAgIiIiCi0gICAgc3RhcnRfdGltZSA9IHRpbWUudGltZSgpCi0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHRyeToKLSAgICAgICAgZWxlbWVudCA9IHNlbGYudW5pcXVlX2ZpbmQoY3NzX3NlbGVjdG9yKQotICAgICAgICBlbGVtZW50LnNlbmRfa2V5cyhrZXlzKQotICAgICAgICByZXR1cm4KLSAgICAgIGV4Y2VwdCBFbGVtZW50Tm90VmlzaWJsZUV4Y2VwdGlvbjoKLSAgICAgICAgIyBUT0RPIEVsZW1lbnROb3RWaXNpYmxlRXhjZXB0aW9uIHNlZW1zIHRvIGJlIGNvbnNpZGVyZWQKLSAgICAgICAgIyBhICJmYWxzeSIgZXhjZXB0aW9uIGluIHRoZSBpbnRlcm5hbCB0ZXN0cywgd2hpY2ggc2VlbXMgdG8gbWVhbgotICAgICAgICAjIGl0IHdvdWxkIG5vdCBiZSByZXRyaWVkLiBCdXQgaGVyZSwgaXQgc2VlbXMgZXNzZW50aWFsLgotICAgICAgICBpZiB0aW1lLnRpbWUoKSAtIHN0YXJ0X3RpbWUgPj0gUEFHRV9MT0FEX1dBSVRfU0VDT05EUzoKLSAgICAgICAgICByYWlzZQotICAgICAgICB0aW1lLnNsZWVwKDEpCisgICAgQWN0aW9uQ2hhaW5zKHNlbGYuZ2V0X3dlYmRyaXZlcigpKS5zZW5kX2tleXMoa2V5cykucGVyZm9ybSgpCiAKLSAgZGVmIHdhaXRfZm9yX3dpbmRvd2RyaXZlcl9jcmVhdGVkKHNlbGYpOgotICAgICIiIldhaXRzIGZvciBDb2JhbHQgdG8gY3JlYXRlIGEgV2luZG93RHJpdmVyLiIiIgotICAgIHdpbmRvd2RyaXZlcl9jcmVhdGVkID0gc2VsZi5nZXRfd2luZG93ZHJpdmVyX2NyZWF0ZWQoKQorICBkZWYgY2xlYXJfdXJsX2xvYWRlZF9ldmVudHMoc2VsZik6CisgICAgIiIiQ2xlYXIgdGhlIGV2ZW50cyB0aGF0IGluZGljYXRlIHRoYXQgQ29iYWx0IGZpbmlzaGVkIGxvYWRpbmcgYSBVUkwuIiIiCisgICAgdHZfdGVzdGNhc2VfcnVubmVyLkdldFdpbmRvd0RyaXZlckNyZWF0ZWQoKS5jbGVhcigpCisgICAgdHZfdGVzdGNhc2VfcnVubmVyLkdldFdlYk1vZHVsZUxvYWRlZCgpLmNsZWFyKCkKKworICBkZWYgd2FpdF9mb3JfdXJsX2xvYWRlZF9ldmVudHMoc2VsZik6CisgICAgIiIiV2FpdCBmb3IgdGhlIGV2ZW50cyBpbmRpY2F0aW5nIHRoYXQgQ29iYWx0IGZpbmlzaGVkIGxvYWRpbmcgYSBVUkwuIiIiCisgICAgd2luZG93ZHJpdmVyX2NyZWF0ZWQgPSB0dl90ZXN0Y2FzZV9ydW5uZXIuR2V0V2luZG93RHJpdmVyQ3JlYXRlZCgpCiAgICAgaWYgbm90IHdpbmRvd2RyaXZlcl9jcmVhdGVkLndhaXQoV0lORE9XRFJJVkVSX0NSRUFURURfVElNRU9VVF9TRUNPTkRTKToKICAgICAgIHJhaXNlIFR2VGVzdENhc2UuV2luZG93RHJpdmVyQ3JlYXRlZFRpbWVvdXRFeGNlcHRpb24oKQogCisgICAgd2VibW9kdWxlX2xvYWRlZCA9IHR2X3Rlc3RjYXNlX3J1bm5lci5HZXRXZWJNb2R1bGVMb2FkZWQoKQorICAgIGlmIG5vdCB3ZWJtb2R1bGVfbG9hZGVkLndhaXQoV0VCTU9EVUxFX0xPQURFRF9USU1FT1VUX1NFQ09ORFMpOgorICAgICAgcmFpc2UgVHZUZXN0Q2FzZS5XZWJNb2R1bGVMb2FkZWRUaW1lb3V0RXhjZXB0aW9uKCkKKwogICBkZWYgd2FpdF9mb3JfcHJvY2Vzc2luZ19jb21wbGV0ZV9hZnRlcl9mb2N1c2VkX3NoZWxmKHNlbGYpOgogICAgICIiIldhaXRzIGZvciBDb2JhbHQgdG8gZm9jdXMgb24gYSBzaGVsZiBhbmQgY29tcGxldGUgcGVuZGluZyBsYXlvdXRzLiIiIgogICAgIHNlbGYucG9sbF91bnRpbF9mb3VuZCh0di5GT0NVU0VEX1NIRUxGKQpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90dl90ZXN0Y2FzZV9ldmVudF9yZWNvcmRlci5weSBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2VfZXZlbnRfcmVjb3JkZXIucHkKaW5kZXggZDhhZWMwNy4uNzNjYTA0NCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90dl90ZXN0Y2FzZV9ldmVudF9yZWNvcmRlci5weQorKysgYi9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3R2X3Rlc3RjYXNlX2V2ZW50X3JlY29yZGVyLnB5CkBAIC02LDcgKzYsNyBAQAogZnJvbSBfX2Z1dHVyZV9fIGltcG9ydCBwcmludF9mdW5jdGlvbgogCiBpbXBvcnQgY192YWxfbmFtZXMKLWltcG9ydCB0dl90ZXN0Y2FzZV92YWx1ZV9yZWNvcmRlcgoraW1wb3J0IHR2X3Rlc3RjYXNlX3V0aWwKIAogCiBjbGFzcyBFdmVudFJlY29yZGVyT3B0aW9ucyhvYmplY3QpOgpAQCAtNDgsNyArNDgsNyBAQAogICBkZWYgX19pbml0X18oc2VsZiwgb3B0aW9ucyk6CiAgICAgIiIiSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IHJlY29yZGVyLgogCi0gICAgSGFuZGxlcyBzZXR0aW5nIHVwIHRoaXMgZXZlbnQgcmVjb3JkZXIsIGluY2x1ZGluZyBjcmVhdGluZyBhbGwgb2YgaXRzIENWYWwKKyAgICBIYW5kbGVzIHNldHRpbmcgdXAgdGhpcyBldmVudCByZWNvcmRlciwgaW5jbHVkaW5nIGNyZWF0aW5nIGFsbCBvZiBpdHMKICAgICByZWNvcmRlcnMsIGJhc2VkIHVwb24gdGhlIHBhc3NlZCBpbiBvcHRpb25zLgogCiAgICAgQXJnczoKQEAgLTcwLDQxICs3MCw4MSBAQAogICAgIHNlbGYuYW5pbWF0aW9uc19yZWNvcmRlciA9IE5vbmUKICAgICBzZWxmLnZpZGVvX2RlbGF5X3JlY29yZGVyID0gTm9uZQogCisgICAgIyBDb3VudCByZWNvcmQgc3RyYXRlZ2llcworICAgIGNvdW50X3JlY29yZF9zdHJhdGVnaWVzID0gW10KKyAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcy5hcHBlbmQodHZfdGVzdGNhc2VfdXRpbC5SZWNvcmRTdHJhdGVneU1lYW4oKSkKKyAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcy5hcHBlbmQoCisgICAgICAgIHR2X3Rlc3RjYXNlX3V0aWwuUmVjb3JkU3RyYXRlZ3lQZXJjZW50aWxlKDUwKSkKKwogICAgICMgQ291bnQgcmVjb3JkZXJzCi0gICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudERvbUV2ZW50TGlzdGVuZXJzIikKLSAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tTm9kZXMiKQotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJDbnREb21IdG1sRWxlbWVudHMiKQotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJDbnREb21IdG1sRWxlbWVudHNDcmVhdGVkIikKLSAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tSHRtbEVsZW1lbnRzRGVzdHJveWVkIikKLSAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tVXBkYXRlTWF0Y2hpbmdSdWxlcyIpCi0gICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudERvbVVwZGF0ZUNvbXB1dGVkU3R5bGUiKQotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJDbnREb21HZW5lcmF0ZUh0bWxDb21wdXRlZFN0eWxlIikKLSAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tR2VuZXJhdGVQc2V1ZG9Db21wdXRlZFN0eWxlIikKLSAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250TGF5b3V0Qm94ZXMiKQotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJDbnRMYXlvdXRCb3hlc0NyZWF0ZWQiKQotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJDbnRMYXlvdXRCb3hlc0Rlc3Ryb3llZCIpCisgICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudERvbUV2ZW50TGlzdGVuZXJzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tTm9kZXMiLCBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tSHRtbEVsZW1lbnRzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tSHRtbEVsZW1lbnRzQ3JlYXRlZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfcmVjb3JkX3N0cmF0ZWdpZXMpCisgICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudERvbUh0bWxFbGVtZW50c0Rlc3Ryb3llZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfcmVjb3JkX3N0cmF0ZWdpZXMpCisgICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudERvbVVwZGF0ZU1hdGNoaW5nUnVsZXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50X3JlY29yZF9zdHJhdGVnaWVzKQorICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJDbnREb21VcGRhdGVDb21wdXRlZFN0eWxlIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250RG9tR2VuZXJhdGVIdG1sQ29tcHV0ZWRTdHlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfcmVjb3JkX3N0cmF0ZWdpZXMpCisgICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudERvbUdlbmVyYXRlUHNldWRvQ29tcHV0ZWRTdHlsZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfcmVjb3JkX3N0cmF0ZWdpZXMpCisgICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudExheW91dEJveGVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250TGF5b3V0Qm94ZXNDcmVhdGVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250TGF5b3V0Qm94ZXNEZXN0cm95ZWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50X3JlY29yZF9zdHJhdGVnaWVzKQorICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJDbnRMYXlvdXRVcGRhdGVTaXplIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudF9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiQ250TGF5b3V0UmVuZGVyQW5kQW5pbWF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfcmVjb3JkX3N0cmF0ZWdpZXMpCisgICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkNudExheW91dFVwZGF0ZUNyb3NzUmVmZXJlbmNlcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnRfcmVjb3JkX3N0cmF0ZWdpZXMpCisKKyAgICAjIER1cmF0aW9uIHJlY29yZCBzdHJhdGVnaWVzCisgICAgZHVyYXRpb25fcmVjb3JkX3N0cmF0ZWdpZXMgPSBbXQorICAgIGR1cmF0aW9uX3JlY29yZF9zdHJhdGVnaWVzLmFwcGVuZCh0dl90ZXN0Y2FzZV91dGlsLlJlY29yZFN0cmF0ZWd5TWVhbigpKQorICAgIGR1cmF0aW9uX3JlY29yZF9zdHJhdGVnaWVzLmFwcGVuZCgKKyAgICAgICAgdHZfdGVzdGNhc2VfdXRpbC5SZWNvcmRTdHJhdGVneVBlcmNlbnRpbGVzKCkpCiAKICAgICAjIER1cmF0aW9uIHJlY29yZGVycwotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJEdXJUb3RhbFVzIikKLSAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiRHVyRG9tSW5qZWN0RXZlbnRVcyIpCi0gICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkR1ckRvbVVwZGF0ZUNvbXB1dGVkU3R5bGVVcyIpCi0gICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkR1ckxheW91dEJveFRyZWVVcyIpCi0gICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkR1ckxheW91dEJveFRyZWVCb3hHZW5lcmF0aW9uVXMiKQotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJEdXJMYXlvdXRCb3hUcmVlVXBkYXRlVXNlZFNpemVzVXMiKQotICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJEdXJMYXlvdXRSZW5kZXJBbmRBbmltYXRlVXMiKQorICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJEdXJUb3RhbFVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiRHVyRG9tSW5qZWN0RXZlbnRVcyIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHVyYXRpb25fcmVjb3JkX3N0cmF0ZWdpZXMpCisgICAgc2VsZi5fYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoIkR1ckRvbVJ1bkFuaW1hdGlvbkZyYW1lQ2FsbGJhY2tzVXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX3JlY29yZF9zdHJhdGVnaWVzKQorICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJEdXJEb21VcGRhdGVDb21wdXRlZFN0eWxlVXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX3JlY29yZF9zdHJhdGVnaWVzKQorICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJEdXJMYXlvdXRCb3hUcmVlVXMiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cmF0aW9uX3JlY29yZF9zdHJhdGVnaWVzKQorICAgIHNlbGYuX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKCJEdXJMYXlvdXRCb3hUcmVlQm94R2VuZXJhdGlvblVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiRHVyTGF5b3V0Qm94VHJlZVVwZGF0ZVVzZWRTaXplc1VzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9yZWNvcmRfc3RyYXRlZ2llcykKKyAgICBzZWxmLl9hZGRfdmFsdWVfZGljdGlvbmFyeV9yZWNvcmRlcigiRHVyTGF5b3V0UmVuZGVyQW5kQW5pbWF0ZVVzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkdXJhdGlvbl9yZWNvcmRfc3RyYXRlZ2llcykKIAogICAgICMgT3B0aW9uYWwgcmFzdGVyaXplIGFuaW1hdGlvbnMgcmVjb3JkZXJzCiAgICAgaWYgb3B0aW9ucy5yZWNvcmRfcmFzdGVyaXplX2FuaW1hdGlvbnM6Ci0gICAgICBzZWxmLmFuaW1hdGlvbnNfcmVjb3JkZXIgPSB0dl90ZXN0Y2FzZV92YWx1ZV9yZWNvcmRlci5WYWx1ZVJlY29yZGVyKAotICAgICAgICAgIHNlbGYuZXZlbnRfbmFtZSArICJEdXJSYXN0ZXJpemVBbmltYXRpb25zVXMiKQorICAgICAgc2VsZi5hbmltYXRpb25zX3JlY29yZGVyID0gdHZfdGVzdGNhc2VfdXRpbC5SZXN1bHRzUmVjb3JkZXIoCisgICAgICAgICAgc2VsZi5ldmVudF9uYW1lICsgIkR1clJhc3Rlcml6ZUFuaW1hdGlvbnNVcyIsCisgICAgICAgICAgZHVyYXRpb25fcmVjb3JkX3N0cmF0ZWdpZXMpCiAKICAgICAjIE9wdGlvbmFsIHZpZGVvIHN0YXJ0IGRlbGF5IHJlY29yZGVyCiAgICAgaWYgb3B0aW9ucy5yZWNvcmRfdmlkZW9fc3RhcnRfZGVsYXk6Ci0gICAgICBzZWxmLnZpZGVvX2RlbGF5X3JlY29yZGVyID0gdHZfdGVzdGNhc2VfdmFsdWVfcmVjb3JkZXIuVmFsdWVSZWNvcmRlcigKLSAgICAgICAgICBzZWxmLmV2ZW50X25hbWUgKyAiRHVyVmlkZW9TdGFydERlbGF5VXMiKQorICAgICAgc2VsZi52aWRlb19kZWxheV9yZWNvcmRlciA9IHR2X3Rlc3RjYXNlX3V0aWwuUmVzdWx0c1JlY29yZGVyKAorICAgICAgICAgIHNlbGYuZXZlbnRfbmFtZSArICJEdXJWaWRlb1N0YXJ0RGVsYXlVcyIsIGR1cmF0aW9uX3JlY29yZF9zdHJhdGVnaWVzKQogCi0gIGRlZiBfYWRkX3ZhbHVlX2RpY3Rpb25hcnlfcmVjb3JkZXIoc2VsZiwga2V5KToKLSAgICByZWNvcmRlciA9IHR2X3Rlc3RjYXNlX3ZhbHVlX3JlY29yZGVyLlZhbHVlUmVjb3JkZXIoc2VsZi5ldmVudF9uYW1lICsga2V5KQorICBkZWYgX2FkZF92YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVyKHNlbGYsIGtleSwgcmVjb3JkX3N0cmF0ZWdpZXMpOgorICAgIHJlY29yZGVyID0gdHZfdGVzdGNhc2VfdXRpbC5SZXN1bHRzUmVjb3JkZXIoc2VsZi5ldmVudF9uYW1lICsga2V5LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVjb3JkX3N0cmF0ZWdpZXMpCiAgICAgc2VsZi52YWx1ZV9kaWN0aW9uYXJ5X3JlY29yZGVycy5hcHBlbmQoKGtleSwgcmVjb3JkZXIpKQogCiAgIGRlZiBvbl9zdGFydF9ldmVudChzZWxmKToKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2VfcnVubmVyLnB5IGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90dl90ZXN0Y2FzZV9ydW5uZXIucHkKaW5kZXggZDU0M2M0YS4uNWYxMzY1YyAxMDA3NTUKLS0tIGEvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90dl90ZXN0Y2FzZV9ydW5uZXIucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90dl90ZXN0Y2FzZV9ydW5uZXIucHkKQEAgLTQ4LDcgKzQ4LDExIEBACiAjIG9wZW5lZC4KIFJFX1dFQkRSSVZFUl9MSVNURU4gPSByZS5jb21waWxlKHIiU3RhcnRpbmcgV2ViRHJpdmVyIHNlcnZlciBvbiBwb3J0IChcZCspIikKICMgUGF0dGVybiB0byBtYXRjaCBDb2JhbHQgbG9nIGxpbmUgZm9yIHdoZW4gYSBXaW5kb3dEcml2ZXIgaGFzIGJlZW4gY3JlYXRlZC4KLVJFX1dJTkRPV0RSSVZFUl9DUkVBVEVEID0gcmUuY29tcGlsZShyIkNyZWF0ZWQgV2luZG93RHJpdmVyOiBJRD1cUysiKQorUkVfV0lORE9XRFJJVkVSX0NSRUFURUQgPSByZS5jb21waWxlKAorICAgIHIiXlxbXGQrL1xkKzpJTkZPOmJyb3dzZXJfbW9kdWxlXC5jY1woXGQrXClcXSBDcmVhdGVkIFdpbmRvd0RyaXZlcjogSUQ9XFMrIikKKyMgUGF0dGVybiB0byBtYXRjaCBDb2JhbHQgbG9nIGxpbmUgZm9yIHdoZW4gYSBXZWJNb2R1bGUgaXMgaGFzIGJlZW4gbG9hZGVkLgorUkVfV0VCTU9EVUxFX0xPQURFRCA9IHJlLmNvbXBpbGUoCisgICAgciJeXFtcZCsvXGQrOklORk86YnJvd3Nlcl9tb2R1bGVcLmNjXChcZCtcKVxdIExvYWRlZCBXZWJNb2R1bGUiKQogCiBTVEFSVFVQX1RJTUVPVVRfU0VDT05EUyA9IDIgKiA2MAogCkBAIC02NCw2ICs2OCw3IEBACiAKIF93ZWJkcml2ZXIgPSBOb25lCiBfd2luZG93ZHJpdmVyX2NyZWF0ZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQorX3dlYm1vZHVsZV9sb2FkZWQgPSB0aHJlYWRpbmcuRXZlbnQoKQogCiAKIGRlZiBHZXRXZWJEcml2ZXIoKToKQEAgLTc2LDYgKzgxLDExIEBACiAgIHJldHVybiBfd2luZG93ZHJpdmVyX2NyZWF0ZWQKIAogCitkZWYgR2V0V2ViTW9kdWxlTG9hZGVkKCk6CisgICIiIlJldHVybnMgdGhlIFdlYk1vZHVsZSBsb2FkZWQgaW5zdGFuY2UuIiIiCisgIHJldHVybiBfd2VibW9kdWxlX2xvYWRlZAorCisKIGNsYXNzIFRpbWVvdXRFeGNlcHRpb24oRXhjZXB0aW9uKToKICAgcGFzcwogCkBAIC0xMzcsMTEgKzE0NywxNCBAQAogICBkZWYgX0hhbmRsZUxpbmUoc2VsZiwgbGluZSk6CiAgICAgIiIiSW50ZXJuYWwgbG9nIGxpbmUgY2FsbGJhY2suIiIiCiAKLSAgICAjIENoZWNrIGZvciBhIFdpbmRvd0RyaXZlciBiZWluZyBjcmVhdGVkLgogICAgIGlmIFJFX1dJTkRPV0RSSVZFUl9DUkVBVEVELnNlYXJjaChsaW5lKToKICAgICAgIF93aW5kb3dkcml2ZXJfY3JlYXRlZC5zZXQoKQogICAgICAgcmV0dXJuCiAKKyAgICBpZiBSRV9XRUJNT0RVTEVfTE9BREVELnNlYXJjaChsaW5lKToKKyAgICAgIF93ZWJtb2R1bGVfbG9hZGVkLnNldCgpCisgICAgICByZXR1cm4KKwogICAgICMgV2FpdCBmb3IgV2ViRHJpdmVyIHBvcnQgaGVyZSB0aGVuIGNvbm5lY3QKICAgICBpZiBzZWxmLnRlc3Rfc2NyaXB0X3N0YXJ0ZWQuaXNfc2V0KCk6CiAgICAgICByZXR1cm4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2VfdXRpbC5weSBiL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2VfdXRpbC5weQppbmRleCA0NTQyZTkwLi4zZTBjMTI5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3R2X3Rlc3RjYXNlX3V0aWwucHkKKysrIGIvc3JjL2NvYmFsdC93ZWJkcml2ZXJfYmVuY2htYXJrcy90dl90ZXN0Y2FzZV91dGlsLnB5CkBAIC05LDggKzksOCBAQAogaW1wb3J0IHN5cwogCiAjIHB5bGludDogZGlzYWJsZT1DNjIwNAotaW1wb3J0IHVybHBhcnNlCiBmcm9tIHVybGxpYiBpbXBvcnQgdXJsZW5jb2RlCitpbXBvcnQgdXJscGFyc2UKIAogaW1wb3J0IGNvbnRhaW5lcl91dGlsCiAKQEAgLTgyLDcgKzgyLDcgQEAKICAgIiIiUmVjb3JkcyBhbiBpbmRpdmlkdWFsIHNjYWxhciByZXN1bHQgb2YgYSBiZW5jaG1hcmsgdGVzdC4KIAogICBBcmdzOgotICAgIG5hbWU6IG5hbWUgb2YgdGVzdCBjYXNlCisgICAgbmFtZTogc3RyaW5nIG5hbWUgb2YgdGVzdCBjYXNlCiAgICAgcmVzdWx0OiBUZXN0IHJlc3VsdC4gTXVzdCBiZSBKU09OIGVuY29kYWJsZSBzY2FsYXIuCiAgICIiIgogICB2YWx1ZV90b19yZWNvcmQgPSByZXN1bHQKQEAgLTkyLDM0ICs5Miw5NiBAQAogICBzeXMuc3Rkb3V0LmZsdXNoKCkKIAogCi1kZWYgcmVjb3JkX3Rlc3RfcmVzdWx0X21lYW4obmFtZSwgcmVzdWx0cyk6Ci0gICIiIlJlY29yZHMgdGhlIG1lYW4gb2YgYW4gYXJyYXkgb2YgcmVzdWx0cy4KK2NsYXNzIFJlY29yZFN0cmF0ZWd5TWVhbihvYmplY3QpOgorICAiIiIiUmVjb3JkcyB0aGUgbWVhbiBvZiBhbiBhcnJheSBvZiB2YWx1ZXMuIiIiCiAKLSAgQXJnczoKLSAgICBuYW1lOiBuYW1lIG9mIHRlc3QgY2FzZQotICAgIHJlc3VsdHM6IFRlc3QgcmVzdWx0cyBhcnJheS4gTXVzdCBiZSBhcnJheSBvZiBKU09OIGVuY29kYWJsZSBzY2FsYXIuCi0gICIiIgotICByZWNvcmRfdGVzdF9yZXN1bHQobmFtZSwgY29udGFpbmVyX3V0aWwubWVhbihyZXN1bHRzKSkKKyAgZGVmIHJ1bihzZWxmLCBuYW1lLCB2YWx1ZXMpOgorICAgICIiIlJlY29yZHMgdGhlIG1lYW4gb2YgYW4gYXJyYXkgb2YgdmFsdWVzLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IHN0cmluZyBuYW1lIG9mIHRlc3QgY2FzZQorICAgICAgdmFsdWVzOiBtdXN0IGJlIGFycmF5IG9mIEpTT04gZW5jb2RhYmxlIHNjYWxhcgorICAgICIiIgorICAgIHJlY29yZF90ZXN0X3Jlc3VsdCgie31NZWFuIi5mb3JtYXQobmFtZSksIGNvbnRhaW5lcl91dGlsLm1lYW4odmFsdWVzKSkKIAogCi1kZWYgcmVjb3JkX3Rlc3RfcmVzdWx0X21lZGlhbihuYW1lLCByZXN1bHRzKToKLSAgIiIiUmVjb3JkcyB0aGUgbWVkaWFuIG9mIGFuIGFycmF5IG9mIHJlc3VsdHMuCitjbGFzcyBSZWNvcmRTdHJhdGVneU1lZGlhbihvYmplY3QpOgorICAiIiIiUmVjb3JkcyB0aGUgbWVkaWFuIG9mIGFuIGFycmF5IG9mIHRlc3QgcmVzdWx0cy4iIiIKIAotICBBcmdzOgotICAgIG5hbWU6IG5hbWUgb2YgdGVzdCBjYXNlCi0gICAgcmVzdWx0czogVGVzdCByZXN1bHRzIGFycmF5LiBNdXN0IGJlIGFycmF5IG9mIEpTT04gZW5jb2RhYmxlIHNjYWxhci4KLSAgIiIiCi0gIHJlY29yZF90ZXN0X3Jlc3VsdChuYW1lLCBjb250YWluZXJfdXRpbC5wZXJjZW50aWxlKHJlc3VsdHMsIDUwKSkKKyAgZGVmIHJ1bihzZWxmLCBuYW1lLCB2YWx1ZXMpOgorICAgICIiIlJlY29yZHMgdGhlIG1lZGlhbiBvZiBhbiBhcnJheSBvZiB2YWx1ZXMuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogc3RyaW5nIG5hbWUgb2YgdGVzdCBjYXNlCisgICAgICB2YWx1ZXM6IG11c3QgYmUgYXJyYXkgb2YgSlNPTiBlbmNvZGFibGUgc2NhbGFyCisgICAgIiIiCisgICAgcmVjb3JkX3Rlc3RfcmVzdWx0KCJ7fU1lZGlhbiIuZm9ybWF0KG5hbWUpLAorICAgICAgICAgICAgICAgICAgICAgICBjb250YWluZXJfdXRpbC5wZXJjZW50aWxlKHZhbHVlcywgNTApKQogCiAKLWRlZiByZWNvcmRfdGVzdF9yZXN1bHRfcGVyY2VudGlsZShuYW1lLCByZXN1bHRzLCBwZXJjZW50aWxlKToKLSAgIiIiUmVjb3JkcyB0aGUgcGVyY2VudGlsZSBvZiBhbiBhcnJheSBvZiByZXN1bHRzLgorY2xhc3MgUmVjb3JkU3RyYXRlZ3lQZXJjZW50aWxlKG9iamVjdCk6CisgICIiIiJSZWNvcmRzIHRoZSBzcGVjaWZpZWQgcGVyY2VudGlsZSBvZiBhbiBhcnJheSBvZiB0ZXN0IHJlc3VsdHMuIiIiCiAKLSAgQXJnczoKLSAgICBuYW1lOiBUaGUgKHN0cmluZykgbmFtZSBvZiB0ZXN0IGNhc2UuCi0gICAgcmVzdWx0czogVGVzdCByZXN1bHRzIGFycmF5LiBNdXN0IGJlIGFycmF5IG9mIEpTT04gZW5jb2RhYmxlIHNjYWxhcnMuCi0gICAgcGVyY2VudGlsZTogQSBudW1iZXIgcmFuZ2luZyBmcm9tIDAtMTAwLgotICBSYWlzZXM6Ci0gICAgUnVudGltZUVycm9yOiBSYWlzZWQgb24gaW52YWxpZCBhcmdzLgotICAiIiIKLSAgcmVjb3JkX3Rlc3RfcmVzdWx0KG5hbWUsIGNvbnRhaW5lcl91dGlsLnBlcmNlbnRpbGUocmVzdWx0cywgcGVyY2VudGlsZSkpCisgIGRlZiBfX2luaXRfXyhzZWxmLCBwZXJjZW50aWxlKToKKyAgICAiIiJJbml0aWFsaXplcyB0aGUgcmVjb3JkIHN0cmF0ZWd5LgorCisgICAgQXJnczoKKyAgICAgIHBlcmNlbnRpbGU6IHRoZSBwZXJjZW50aWxlIHRvIHJlY29yZAorICAgICIiIgorICAgIHNlbGYucGVyY2VudGlsZSA9IHBlcmNlbnRpbGUKKworICBkZWYgcnVuKHNlbGYsIG5hbWUsIHZhbHVlcyk6CisgICAgIiIiUmVjb3JkcyB0aGUgcGVyY2VudGlsZSBvZiBhbiBhcnJheSBvZiB2YWx1ZXMuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogc3RyaW5nIG5hbWUgb2YgdGVzdCBjYXNlCisgICAgICB2YWx1ZXM6IG11c3QgYmUgYXJyYXkgb2YgSlNPTiBlbmNvZGFibGUgc2NhbGFyCisgICAgUmFpc2VzOgorICAgICAgUnVudGltZUVycm9yOiBSYWlzZWQgb24gaW52YWxpZCBhcmdzLgorICAgICIiIgorICAgIHJlY29yZF90ZXN0X3Jlc3VsdCgie31QY3R7fSIuZm9ybWF0KG5hbWUsIHNlbGYucGVyY2VudGlsZSksCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lcl91dGlsLnBlcmNlbnRpbGUodmFsdWVzLCBzZWxmLnBlcmNlbnRpbGUpKQorCisKK2NsYXNzIFJlY29yZFN0cmF0ZWd5UGVyY2VudGlsZXMob2JqZWN0KToKKyAgIiIiIlJlY29yZHMgdGhlIDI1dGgsIDUwdGgsIDc1dGgsIGFuZCA5NXRoIHBlcmNlbnRpbGVzIG9mIHRoZSB2YWx1ZXMuIiIiCisKKyAgZGVmIHJ1bihzZWxmLCBuYW1lLCB2YWx1ZXMpOgorICAgICIiIiJSZWNvcmRzIHRoZSAyNXRoLCA1MHRoLCA3NXRoLCBhbmQgOTV0aCBwZXJjZW50aWxlcyBvZiB0aGUgdmFsdWVzLgorCisgICAgQXJnczoKKyAgICAgIG5hbWU6IHN0cmluZyBuYW1lIG9mIHRlc3QgY2FzZQorICAgICAgdmFsdWVzOiBtdXN0IGJlIGFycmF5IG9mIEpTT04gZW5jb2RhYmxlIHNjYWxhcgorICAgIFJhaXNlczoKKyAgICAgIFJ1bnRpbWVFcnJvcjogUmFpc2VkIG9uIGludmFsaWQgYXJncy4KKyAgICAiIiIKKyAgICBSZWNvcmRTdHJhdGVneVBlcmNlbnRpbGUoMjUpLnJ1bihuYW1lLCB2YWx1ZXMpCisgICAgUmVjb3JkU3RyYXRlZ3lQZXJjZW50aWxlKDUwKS5ydW4obmFtZSwgdmFsdWVzKQorICAgIFJlY29yZFN0cmF0ZWd5UGVyY2VudGlsZSg3NSkucnVuKG5hbWUsIHZhbHVlcykKKyAgICBSZWNvcmRTdHJhdGVneVBlcmNlbnRpbGUoOTUpLnJ1bihuYW1lLCB2YWx1ZXMpCisKKworY2xhc3MgUmVzdWx0c1JlY29yZGVyKG9iamVjdCk6CisgICIiIiJDb2xsZWN0cyB2YWx1ZXMgYW5kIHJlY29yZHMgcmVzdWx0cyBhZnRlciBhIGJlbmNobWFyayB0ZXN0IGVuZHMuIiIiCisKKyAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHJlY29yZF9zdHJhdGVnaWVzKToKKyAgICAiIiJJbml0aWFsaXplcyB0aGUgdmFsdWUgcmVjb3JkZXIuCisKKyAgICBBcmdzOgorICAgICAgbmFtZTogdGhlIG5hbWUgdG8gdXNlIHdoZW4gcmVjb3JkaW5nIHRlc3QgcmVzdWx0cworICAgICAgcmVjb3JkX3N0cmF0ZWdpZXM6IHRoZSBzdHJhdGVnaWVzIHRvIHVzZSB3aGVuIHRoZSB0ZXN0IGVuZHMKKyAgICAiIiIKKyAgICBzZWxmLm5hbWUgPSBuYW1lCisgICAgc2VsZi5yZWNvcmRfc3RyYXRlZ2llcyA9IHJlY29yZF9zdHJhdGVnaWVzCisgICAgc2VsZi52YWx1ZXMgPSBbXQorCisgIGRlZiBjb2xsZWN0X3ZhbHVlKHNlbGYsIHZhbHVlKToKKyAgICBzZWxmLnZhbHVlcy5hcHBlbmQodmFsdWUpCisKKyAgZGVmIG9uX2VuZF90ZXN0KHNlbGYpOgorICAgICIiIkhhbmRsZXMgbG9naWMgcmVsYXRlZCB0byB0aGUgZW5kIG9mIHRoZSBiZW5jaG1hcmsgdGVzdC4iIiIKKworICAgICMgT25seSBydW4gdGhlIHN0cmF0ZWdpZXMgaWYgdmFsdWVzIGhhdmUgYmVlbiBjb2xsZWN0ZWQuCisgICAgaWYgc2VsZi52YWx1ZXM6CisgICAgICBmb3IgcmVjb3JkX3N0cmF0ZWd5IGluIHNlbGYucmVjb3JkX3N0cmF0ZWdpZXM6CisgICAgICAgIHJlY29yZF9zdHJhdGVneS5ydW4oc2VsZi5uYW1lLCBzZWxmLnZhbHVlcykKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2VfdmFsdWVfcmVjb3JkZXIucHkgYi9zcmMvY29iYWx0L3dlYmRyaXZlcl9iZW5jaG1hcmtzL3R2X3Rlc3RjYXNlX3ZhbHVlX3JlY29yZGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYzQ4ZmQwLi4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQvd2ViZHJpdmVyX2JlbmNobWFya3MvdHZfdGVzdGNhc2VfdmFsdWVfcmVjb3JkZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NSArMCwwIEBACi0jIS91c3IvYmluL3B5dGhvbjIKLSIiIiJSZWNvcmRzIHN0YXRzIG9uIGNvbGxlY3RlZCB2YWx1ZXMgZHVyaW5nIGEgYmVuY2htYXJrIHRlc3QuIiIiCi0KLWZyb20gX19mdXR1cmVfXyBpbXBvcnQgYWJzb2x1dGVfaW1wb3J0Ci1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IGRpdmlzaW9uCi1mcm9tIF9fZnV0dXJlX18gaW1wb3J0IHByaW50X2Z1bmN0aW9uCi0KLWltcG9ydCB0dl90ZXN0Y2FzZV91dGlsCi0KLQotY2xhc3MgVmFsdWVSZWNvcmRlcihvYmplY3QpOgotICAiIiIiUmVjb3JkcyBzdGF0cyBvbiBjb2xsZWN0ZWQgdmFsdWVzIGR1cmluZyBhIGJlbmNobWFyayB0ZXN0LgotCi0gIEhhbmRsZXMgY29sbGVjdGluZyB2YWx1ZXMgYW5kIHJlY29yZHMgc3RhdGlzdGljcyBvbiB0aG9zZSB2YWx1ZXMgd2hlbiB0aGUKLSAgdGVzdCBlbmRzLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZXMgdGhlIGV2ZW50IGJlbmNobWFyayByZWNvcmRlci4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiB0aGUgbmFtZSB0byB1c2Ugd2hlbiByZWNvcmRpbmcgdGVzdCByZXN1bHRzCi0gICAgIiIiCi0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYudmFsdWVzID0gW10KLQotICBkZWYgY29sbGVjdF92YWx1ZShzZWxmLCB2YWx1ZSk6Ci0gICAgc2VsZi52YWx1ZXMuYXBwZW5kKHZhbHVlKQotCi0gIGRlZiBvbl9lbmRfdGVzdChzZWxmKToKLSAgICAiIiJIYW5kbGVzIGxvZ2ljIHJlbGF0ZWQgdG8gdGhlIGVuZCBvZiB0aGUgYmVuY2htYXJrIHRlc3QuIiIiCi0KLSAgICAjIE9ubHkgcmVjb3JkIHRoZSB0ZXN0IHJlc3VsdHMgd2hlbiB2YWx1ZXMgaGF2ZSBiZWVuIGNvbGxlY3RlZC4KLSAgICBpZiBzZWxmLnZhbHVlczoKLSAgICAgIHNlbGYuX3JlY29yZF90ZXN0X3Jlc3VsdHMoKQotCi0gIGRlZiBfcmVjb3JkX3Rlc3RfcmVzdWx0X21lYW4oc2VsZik6Ci0gICAgdHZfdGVzdGNhc2VfdXRpbC5yZWNvcmRfdGVzdF9yZXN1bHRfbWVhbigie31NZWFuIi5mb3JtYXQoc2VsZi5uYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYudmFsdWVzKQotCi0gIGRlZiBfcmVjb3JkX3Rlc3RfcmVzdWx0X3BlcmNlbnRpbGUoc2VsZiwgcGVyY2VudGlsZSk6Ci0gICAgdHZfdGVzdGNhc2VfdXRpbC5yZWNvcmRfdGVzdF9yZXN1bHRfcGVyY2VudGlsZSgie31QY3R7fSIuZm9ybWF0KAotICAgICAgICBzZWxmLm5hbWUsIHBlcmNlbnRpbGUpLCBzZWxmLnZhbHVlcywgcGVyY2VudGlsZSkKLQotICBkZWYgX3JlY29yZF90ZXN0X3Jlc3VsdHMoc2VsZik6Ci0gICAgIiIiUmVjb3JkcyB0ZXN0IHJlc3VsdHMgZm9yIHRoZSBjb2xsZWN0ZWQgdmFsdWVzLgotCi0gICAgVGhpcyBzdWJjbGFzcyByZWNvcmRzIHRoZSBtZWFuLCAyNXRoLCA1MHRoLCA3NXRoLCBhbmQgOTV0aCBwZXJjZW50aWxlcyBvZgotICAgIHRoZSBjb2xsZWN0ZWQgdmFsdWVzIHdoZW4gdGhlIHRlc3QgZW5kcy4KLSAgICAiIiIKLSAgICBzZWxmLl9yZWNvcmRfdGVzdF9yZXN1bHRfbWVhbigpCi0gICAgc2VsZi5fcmVjb3JkX3Rlc3RfcmVzdWx0X3BlcmNlbnRpbGUoMjUpCi0gICAgc2VsZi5fcmVjb3JkX3Rlc3RfcmVzdWx0X3BlcmNlbnRpbGUoNTApCi0gICAgc2VsZi5fcmVjb3JkX3Rlc3RfcmVzdWx0X3BlcmNlbnRpbGUoNzUpCi0gICAgc2VsZi5fcmVjb3JkX3Rlc3RfcmVzdWx0X3BlcmNlbnRpbGUoOTUpCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC9XZWJTb2NrZXQuaWRsIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvV2ViU29ja2V0LmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTY2MDc1NS4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC9XZWJTb2NrZXQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLyoKLSAqIENvcHlyaWdodCDCqSAyMDE1IFczQ8KuIChNSVQsIEVSQ0lNLCBLZWlvLCBCZWloYW5nKS4KLSAqIFRoaXMgc29mdHdhcmUgb3IgZG9jdW1lbnQgaW5jbHVkZXMgbWF0ZXJpYWwgY29waWVkIGZyb20gb3IgZGVyaXZlZCBmcm9tCi0gKiBUaGUgV2ViU29ja2V0IEFQSSBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic29ja2V0cy8KLSAqLwotCi1bCi0gIENvbnN0cnVjdG9yKERPTVN0cmluZyB1cmwsIG9wdGlvbmFsIERPTVN0cmluZyBwcm90b2NvbHMpLAotICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCi0gIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvcgotXQotaW50ZXJmYWNlIFdlYlNvY2tldCA6IEV2ZW50VGFyZ2V0IHsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB1cmw7Ci0KLSAgLy8gcmVhZHkgc3RhdGUKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09OTkVDVElORyA9IDA7Ci0gIGNvbnN0IHVuc2lnbmVkIHNob3J0IE9QRU4gPSAxOwotICBjb25zdCB1bnNpZ25lZCBzaG9ydCBDTE9TSU5HID0gMjsKLSAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ0xPU0VEID0gMzsKLSAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IHJlYWR5U3RhdGU7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGJ1ZmZlcmVkQW1vdW50OwotCi0gIC8vIG5ldHdvcmtpbmcKLSAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbm9wZW47Ci0gIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25lcnJvcjsKLSAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmNsb3NlOwotICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGV4dGVuc2lvbnM7Ci0gIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcHJvdG9jb2w7Ci0gIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgY2xvc2UoW0NsYW1wXSBvcHRpb25hbCB1bnNpZ25lZCBzaG9ydCBjb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIERPTVN0cmluZyByZWFzb24pOwotCi0gIC8vIG1lc3NhZ2luZwotICAgICAgICAgICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ubWVzc2FnZTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBiaW5hcnlUeXBlOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNlbmQoRE9NU3RyaW5nIGRhdGEpOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNlbmQoQmxvYiBkYXRhKTsKLSAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZW5kKEFycmF5QnVmZmVyIGRhdGEpOwotICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNlbmQoQXJyYXlCdWZmZXJWaWV3IGRhdGEpOwotfTsKLQotdHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0LmNjIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldC5jYwppbmRleCBkYjk3ODYwLi4wMjJjYzgzIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXQuY2MKQEAgLTEsMTcgKzEsMTYgQEAKLS8qIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXQuaCIKIApAQCAtMTksMTggKzE4LDIzIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogI2luY2x1ZGUgImJhc2Uvc3RyaW5nX251bWJlcl9jb252ZXJzaW9ucy5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3BpZWNlLmgiCiAjaW5jbHVkZSAiY29iYWx0L2Jhc2UvcG9seW1vcnBoaWNfZG93bmNhc3QuaCIKICNpbmNsdWRlICJjb2JhbHQvZG9tL2RvbV9zZXR0aW5ncy5oIgogI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvZ3VybC5oIgogI2luY2x1ZGUgImdvb2dsZXVybC9zcmMvdXJsX2Nhbm9uLmgiCiAjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy91cmxfY29uc3RhbnRzLmgiCiAjaW5jbHVkZSAibmV0L2Jhc2UvbmV0X3V0aWwuaCIKKyNpbmNsdWRlICJuZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzLmgiCiAKIG5hbWVzcGFjZSB7CiAKLWNvbnN0IGNoYXIga0JpbmFyeVR5cGVBcnJheUJ1ZmZlcltdID0gImFycmF5YnVmZmVyIjsKLWNvbnN0IGNoYXIga0JpbmFyeVR5cGVCbG9iW10gPSAiYmxvYiI7Cit0eXBlZGVmIHVpbnQxNiBTZXJpYWxpemVkQ2xvc2VTdGF0dXNDb2RlVHlwZTsKK2NvbnN0IGludCBrTWF4Q29udHJvbFBheWxvYWRTaXplSW5CeXRlcyA9IDEyNTsKK2NvbnN0IGludCBrTWF4Q2xvc2VSZWFzb25TaXplID0KKyAgICBrTWF4Q29udHJvbFBheWxvYWRTaXplSW5CeXRlcyAtIHNpemVvZihTZXJpYWxpemVkQ2xvc2VTdGF0dXNDb2RlVHlwZSk7CiAKIGJvb2wgSXNVUkxBYnNvbHV0ZShjb2JhbHQ6OmRvbTo6RE9NU2V0dGluZ3MqIGRvbV9zZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnN0cmluZyYgdXJsKSB7CkBAIC0xNDAsNiArMTQ0LDExIEBACiAgIHJldHVybiAoYWxsX3Byb3RvY29scy5zaXplKCkgPT0gc3ViX3Byb3RvY29scy5zaXplKCkpOwogfQogCitib29sIElzVmFsaWRCaW5hcnlUeXBlKGNvYmFsdDo6ZG9tOjpNZXNzYWdlRXZlbnQ6OlJlc3BvbnNlVHlwZUNvZGUgY29kZSkgeworICByZXR1cm4gKGNvZGUgPT0gY29iYWx0Ojpkb206Ok1lc3NhZ2VFdmVudDo6a0Jsb2IpIHx8CisgICAgICAgICAoY29kZSA9PSBjb2JhbHQ6OmRvbTo6TWVzc2FnZUV2ZW50OjprQXJyYXlCdWZmZXIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIAogbmFtZXNwYWNlIGNvYmFsdCB7CkBAIC0xNTYsOSArMTY1LDEwIEBACiAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpCiAgICAgOiBidWZmZXJlZF9hbW91bnRfKDApLAogICAgICAgcmVhZHlfc3RhdGVfKGtDb25uZWN0aW5nKSwKLSAgICAgIGJpbmFyeV90eXBlXyhrQmluYXJ5VHlwZUJsb2IpLAorICAgICAgYmluYXJ5X3R5cGVfKGRvbTo6TWVzc2FnZUV2ZW50OjprQmxvYiksCiAgICAgICBpc19zZWN1cmVfKGZhbHNlKSwKLSAgICAgIHBvcnRfKC0xKSB7CisgICAgICBwb3J0XygtMSksCisgICAgICBzZXR0aW5nc18oYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8ZG9tOjpET01TZXR0aW5ncyo+KHNldHRpbmdzKSkgewogICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gZW1wdHk7CiAgIGRvbTo6RE9NU2V0dGluZ3MqIGRvbV9zZXR0aW5ncyA9CiAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxkb206OkRPTVNldHRpbmdzKj4oc2V0dGluZ3MpOwpAQCAtMTcxLDIzICsxODEsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkKICAgICA6IGJ1ZmZlcmVkX2Ftb3VudF8oMCksCiAgICAgICByZWFkeV9zdGF0ZV8oa0Nvbm5lY3RpbmcpLAotICAgICAgYmluYXJ5X3R5cGVfKGtCaW5hcnlUeXBlQmxvYiksCisgICAgICBiaW5hcnlfdHlwZV8oZG9tOjpNZXNzYWdlRXZlbnQ6OmtCbG9iKSwKICAgICAgIGlzX3NlY3VyZV8oZmFsc2UpLAotICAgICAgcG9ydF8oLTEpIHsKKyAgICAgIHBvcnRfKC0xKSwKKyAgICAgIHNldHRpbmdzXyhiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxkb206OkRPTVNldHRpbmdzKj4oc2V0dGluZ3MpKSB7CiAgIGRvbTo6RE9NU2V0dGluZ3MqIGRvbV9zZXR0aW5ncyA9CiAgICAgICBiYXNlOjpwb2x5bW9ycGhpY19kb3duY2FzdDxkb206OkRPTVNldHRpbmdzKj4oc2V0dGluZ3MpOwogICBJbml0aWFsaXplKGRvbV9zZXR0aW5ncywgdXJsLCBzdWJfcHJvdG9jb2xzLCBleGNlcHRpb25fc3RhdGUpOwogfQogCitzdGQ6OnN0cmluZyBXZWJTb2NrZXQ6OmJpbmFyeV90eXBlKHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgeworICBpZiAoIUlzVmFsaWRCaW5hcnlUeXBlKGJpbmFyeV90eXBlXykpIHsKKyAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgYmluYXJ5X3R5cGVfIjsKKyAgICBkb206OkRPTUV4Y2VwdGlvbjo6UmFpc2UoZG9tOjpET01FeGNlcHRpb246OmtOb25lLCBleGNlcHRpb25fc3RhdGUpOworICAgIHJldHVybiBzdGQ6OnN0cmluZygpOworICB9CisgIHJldHVybiBkb206Ok1lc3NhZ2VFdmVudDo6R2V0UmVzcG9uc2VUeXBlQXNTdHJpbmcoYmluYXJ5X3R5cGVfKTsKK30KKwogLy8gSW1wbGVtZW50cyBzcGVjIGF0IGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzb2NrZXRzLyNkb20td2Vic29ja2V0LgogV2ViU29ja2V0OjpXZWJTb2NrZXQoc2NyaXB0OjpFbnZpcm9ubWVudFNldHRpbmdzKiBzZXR0aW5ncywKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBzdWJfcHJvdG9jb2wsCiAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpCiAgICAgOiBidWZmZXJlZF9hbW91bnRfKDApLAogICAgICAgcmVhZHlfc3RhdGVfKGtDb25uZWN0aW5nKSwKLSAgICAgIGJpbmFyeV90eXBlXyhrQmluYXJ5VHlwZUJsb2IpLAorICAgICAgYmluYXJ5X3R5cGVfKGRvbTo6TWVzc2FnZUV2ZW50OjprQmxvYiksCiAgICAgICBpc19zZWN1cmVfKGZhbHNlKSwKLSAgICAgIHBvcnRfKC0xKSB7CisgICAgICBwb3J0XygtMSksCisgICAgICBzZXR0aW5nc18oYmFzZTo6cG9seW1vcnBoaWNfZG93bmNhc3Q8ZG9tOjpET01TZXR0aW5ncyo+KHNldHRpbmdzKSkgewogICBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4gc3ViX3Byb3RvY29sczsKICAgc3ViX3Byb3RvY29scy5wdXNoX2JhY2soc3ViX3Byb3RvY29sKTsKICAgZG9tOjpET01TZXR0aW5ncyogZG9tX3NldHRpbmdzID0KQEAgLTIwMiw2NyArMjIzLDEzMyBAQAogICAvLyAiT24gc2V0dGluZywgaWYgdGhlIG5ldyB2YWx1ZSBpcyBlaXRoZXIgdGhlIHN0cmluZyAiYmxvYiIgb3IgdGhlIHN0cmluZwogICAvLyAiYXJyYXlidWZmZXIiLCB0aGVuIHNldCB0aGUgSURMIGF0dHJpYnV0ZSB0byB0aGlzIG5ldyB2YWx1ZS4KICAgLy8gT3RoZXJ3aXNlLCB0aHJvdyBhIFN5bnRheEVycm9yIGV4Y2VwdGlvbi4iCi0gIGlmICgoYmluYXJ5X3R5cGUuY29tcGFyZShrQmluYXJ5VHlwZUFycmF5QnVmZmVyKSA9PSAwKSB8fAotICAgICAgKGJpbmFyeV90eXBlLmNvbXBhcmUoKGtCaW5hcnlUeXBlQmxvYikpID09IDApKSB7Ci0gICAgYmluYXJ5X3R5cGVfID0gYmluYXJ5X3R5cGU7Ci0gIH0gZWxzZSB7CisgIGJhc2U6OlN0cmluZ1BpZWNlIGJpbmFyeV90eXBlX3N0cmluZ19waWVjZShiaW5hcnlfdHlwZSk7CisgIGRvbTo6TWVzc2FnZUV2ZW50OjpSZXNwb25zZVR5cGVDb2RlIHJlc3BvbnNlX2NvZGUgPQorICAgICAgZG9tOjpNZXNzYWdlRXZlbnQ6OkdldFJlc3BvbnNlVHlwZUNvZGUoYmluYXJ5X3R5cGVfc3RyaW5nX3BpZWNlKTsKKyAgaWYgKCFJc1ZhbGlkQmluYXJ5VHlwZShyZXNwb25zZV9jb2RlKSkgewogICAgIGRvbTo6RE9NRXhjZXB0aW9uOjpSYWlzZShkb206OkRPTUV4Y2VwdGlvbjo6a1N5bnRheEVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgfSBlbHNlIHsKKyAgICBiaW5hcnlfdHlwZV8gPSByZXNwb25zZV9jb2RlOwogICB9CiB9CiAKIC8vIEltcGxlbWVudHMgc3BlYyBhdCBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic29ja2V0cy8jZG9tLXdlYnNvY2tldC1jbG9zZS4KIHZvaWQgV2ViU29ja2V0OjpDbG9zZShzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW1wdHlfcmVhc29uOworICBDbG9zZShuZXQ6OmtXZWJTb2NrZXROb3JtYWxDbG9zdXJlLCBlbXB0eV9yZWFzb24sIGV4Y2VwdGlvbl9zdGF0ZSk7CiB9CiAKIC8vIEltcGxlbWVudHMgc3BlYyBhdCBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic29ja2V0cy8jZG9tLXdlYnNvY2tldC1jbG9zZS4KIHZvaWQgV2ViU29ja2V0OjpDbG9zZShjb25zdCB1aW50MTYgY29kZSwKICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGNvZGUpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcgZW1wdHlfcmVhc29uOworICBDbG9zZShjb2RlLCBlbXB0eV9yZWFzb24sIGV4Y2VwdGlvbl9zdGF0ZSk7CiB9CiAKIC8vIEltcGxlbWVudHMgc3BlYyBhdCBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic29ja2V0cy8jZG9tLXdlYnNvY2tldC1jbG9zZS4KIHZvaWQgV2ViU29ja2V0OjpDbG9zZShjb25zdCB1aW50MTYgY29kZSwgY29uc3Qgc3RkOjpzdHJpbmcmIHJlYXNvbiwKICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGNvZGUpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKHJlYXNvbik7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZXhjZXB0aW9uX3N0YXRlKTsKKworICAvLyBQZXIgc3BlYyBAIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzb2NrZXRzLyNkb20td2Vic29ja2V0LWNsb3NlCisgIC8vICJJZiByZWFzb24gaXMgbG9uZ2VyIHRoYW4gMTIzIGJ5dGVzLCB0aGVuIHRocm93IGEgU3ludGF4RXJyb3IgZXhjZXB0aW9uIGFuZAorICAvLyBhYm9ydCB0aGVzZSBzdGVwcy4iCisgIGlmIChyZWFzb24uc2l6ZSgpID4ga01heENsb3NlUmVhc29uU2l6ZSkgeworICAgIERMT0coRVJST1IpIDw8ICJSZWFzb24gc3BlY2lmaWVkIGluIFdlYlNvY2tldDo6Q2xvc2UgbXVzdCBiZSBsZXNzIHRoYW4gIgorICAgICAgICAgICAgICAgIDw8IGtNYXhDb250cm9sUGF5bG9hZFNpemVJbkJ5dGVzIDw8ICIgYnl0ZXMuIjsKKworICAgIGRvbTo6RE9NRXhjZXB0aW9uOjpSYWlzZShkb206OkRPTUV4Y2VwdGlvbjo6a1N5bnRheEVyciwgZXhjZXB0aW9uX3N0YXRlKTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoIW5ldDo6SXNWYWxpZENsb3NlU3RhdHVzQ29kZShjb2RlKSkgeworICAgIGRvbTo6RE9NRXhjZXB0aW9uOjpSYWlzZShkb206OkRPTUV4Y2VwdGlvbjo6a0ludmFsaWRBY2Nlc3NFcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuOworICB9CisKKyAgc3dpdGNoIChyZWFkeV9zdGF0ZV8pIHsKKyAgICBjYXNlIGtPcGVuOgorICAgIGNhc2Uga0Nvbm5lY3Rpbmc6CisgICAgICByZWFkeV9zdGF0ZV8gPSBrQ2xvc2luZzsKKyAgICAgIGJyZWFrOworICAgIGNhc2Uga0Nsb3Npbmc6CisgICAgY2FzZSBrQ2xvc2VkOgorICAgICAgcmV0dXJuOworICAgIGRlZmF1bHQ6CisgICAgICBOT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgcmVhZHlfc3RhdGVfICIgPDwgcmVhZHlfc3RhdGUoKQorICAgICAgICAgICAgICAgICAgIDw8ICIgaW4gV2ViU29ja2V0OjpDbG9zZS4iOworICB9Cit9CisKK2Jvb2wgV2ViU29ja2V0OjpDaGVja1JlYWR5U3RhdGUoc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKSB7CisgIERDSEVDSyhleGNlcHRpb25fc3RhdGUpOworCisgIC8vIFBlciBXZWJzb2NrZXRzIEFQSSBzcGVjOgorICAvLyAiSWYgdGhlIHJlYWR5U3RhdGUgYXR0cmlidXRlIGlzIENPTk5FQ1RJTkcsIGl0IG11c3QgdGhyb3cgYW4KKyAgLy8gSW52YWxpZFN0YXRlRXJyb3IgZXhjZXB0aW9uIgorICBpZiAocmVhZHlfc3RhdGVfID09IGtDb25uZWN0aW5nKSB7CisgICAgZG9tOjpET01FeGNlcHRpb246OlJhaXNlKGRvbTo6RE9NRXhjZXB0aW9uOjprSW52YWxpZFN0YXRlRXJyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicmVhZHlTdGF0ZSBpcyBub3QgaW4gQ09OTkVDVElORyBzdGF0ZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbl9zdGF0ZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7CiB9CiAKIC8vIEltcGxlbWVudHMgc3BlYyBhdCBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic29ja2V0cy8jZG9tLXdlYnNvY2tldC1zZW5kLgogdm9pZCBXZWJTb2NrZXQ6OlNlbmQoY29uc3Qgc3RkOjpzdHJpbmcmIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKLSAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwogICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGRhdGEpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisgIERDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgaWYgKCFDaGVja1JlYWR5U3RhdGUoZXhjZXB0aW9uX3N0YXRlKSkgeworICAgIHJldHVybjsKKyAgfQogfQogCiAvLyBJbXBsZW1lbnRzIHNwZWMgYXQgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYnNvY2tldHMvI2RvbS13ZWJzb2NrZXQtc2VuZC4KIHZvaWQgV2ViU29ja2V0OjpTZW5kKGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpCbG9iPiYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZGF0YSk7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZXhjZXB0aW9uX3N0YXRlKTsKKyAgaWYgKCFDaGVja1JlYWR5U3RhdGUoZXhjZXB0aW9uX3N0YXRlKSkgeworICAgIHJldHVybjsKKyAgfQorICBkb206OkJsb2IqIGJsb2IoZGF0YS5nZXQoKSk7CisgIGlmICghYmxvYikgeworICAgIHJldHVybjsKKyAgfQogfQogCiAvLyBJbXBsZW1lbnRzIHNwZWMgYXQgaHR0cHM6Ly93d3cudzMub3JnL1RSL3dlYnNvY2tldHMvI2RvbS13ZWJzb2NrZXQtc2VuZC4KIHZvaWQgV2ViU29ja2V0OjpTZW5kKGNvbnN0IHNjb3BlZF9yZWZwdHI8ZG9tOjpBcnJheUJ1ZmZlcj4mIGRhdGEsCiAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKICAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGRhdGEpOwotICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKGV4Y2VwdGlvbl9zdGF0ZSk7CisgIGlmICghQ2hlY2tSZWFkeVN0YXRlKGV4Y2VwdGlvbl9zdGF0ZSkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgZG9tOjpBcnJheUJ1ZmZlciogYXJyYXlfYnVmZmVyKGRhdGEuZ2V0KCkpOworICBpZiAoIWFycmF5X2J1ZmZlcikgeworICAgIHJldHVybjsKKyAgfQogfQogCiAvLyBJbXBsZW1lbnRzIHNwZWN0IGF0IGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzb2NrZXRzLyNkb20td2Vic29ja2V0LXNlbmQuCiB2b2lkIFdlYlNvY2tldDo6U2VuZChjb25zdCBzY29wZWRfcmVmcHRyPGRvbTo6QXJyYXlCdWZmZXJWaWV3PiYgZGF0YSwKICAgICAgICAgICAgICAgICAgICAgIHNjcmlwdDo6RXhjZXB0aW9uU3RhdGUqIGV4Y2VwdGlvbl9zdGF0ZSkgewogICBEQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZGF0YSk7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIoZXhjZXB0aW9uX3N0YXRlKTsKKyAgaWYgKCFDaGVja1JlYWR5U3RhdGUoZXhjZXB0aW9uX3N0YXRlKSkgeworICAgIHJldHVybjsKKyAgfQorICBzdGQ6OnN0cmluZyBlcnJvcl9tZXNzYWdlOworICBkb206OkFycmF5QnVmZmVyVmlldyogYXJyYXlfYnVmZmVyX3ZpZXcoZGF0YS5nZXQoKSk7CisgIGlmICghYXJyYXlfYnVmZmVyX3ZpZXcpIHsKKyAgICByZXR1cm47CisgIH0KIH0KIAogc3RkOjpzdHJpbmcgV2ViU29ja2V0OjpHZXRSZXNvdXJjZU5hbWUoKSBjb25zdCB7CkBAIC0yODUsNiArMzcyLDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiB1cmwsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN1Yl9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpIHsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworCiAgIGlmICghZG9tX3NldHRpbmdzKSB7CiAgICAgZG9tOjpET01FeGNlcHRpb246OlJhaXNlKGRvbTo6RE9NRXhjZXB0aW9uOjprTm9uZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkludGVybmFsIGVycm9yOiBVbmFibGUgdG8gZ2V0IERPTSBzZXR0aW5ncy4iLApAQCAtMzg2LDExICs0NzUsMTcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uX3N0YXRlKTsKICAgICByZXR1cm47CiAgIH0KKworICBDb25uZWN0KHJlc29sdmVkX3VybF8sIHN1Yl9wcm90b2NvbHMpOwogfQogCi12b2lkIFdlYlNvY2tldDo6Q29ubmVjdChjb25zdCBHVVJMJiB1cmwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b2NvbHMpIHsKK3ZvaWQgV2ViU29ja2V0OjpDb25uZWN0KGNvbnN0IEdVUkwmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgc3ViX3Byb3RvY29scykgewogICBVTlJFRkVSRU5DRURfUEFSQU1FVEVSKHVybCk7Ci0gIFVOUkVGRVJFTkNFRF9QQVJBTUVURVIocHJvdG9jb2xzKTsKKyAgVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihzdWJfcHJvdG9jb2xzKTsKKyAgRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBEQ0hFQ0soc2V0dGluZ3NfKTsKKyAgRENIRUNLKHNldHRpbmdzXy0+bmV0d29ya19tb2R1bGUoKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSB3ZWJzb2NrZXQKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXQuaCBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXQuaAppbmRleCBkNTE0Y2I4Li4wNjM2NmZjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0LmgKKysrIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldC5oCkBAIC0xLDI1ICsxLDI2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KICNpZm5kZWYgQ09CQUxUX1dFQlNPQ0tFVF9XRUJfU09DS0VUX0hfCiAjZGVmaW5lIENPQkFMVF9XRUJTT0NLRVRfV0VCX1NPQ0tFVF9IXwogCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KIAorI2luY2x1ZGUgImJhc2UvY29tcGlsZXJfc3BlY2lmaWMuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9yZWZfY291bnRlZC5oIgogI2luY2x1ZGUgImJhc2Uvb3B0aW9uYWwuaCIKKyNpbmNsdWRlICJjb2JhbHQvYmFzZS9jb21waWxlci5oIgogI2luY2x1ZGUgImNvYmFsdC9iYXNlL3Rva2Vucy5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vYXJyYXlfYnVmZmVyLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9hcnJheV9idWZmZXJfdmlldy5oIgpAQCAtMjcsNiArMjgsNyBAQAogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3NldHRpbmdzLmgiCiAjaW5jbHVkZSAiY29iYWx0L2RvbS9ldmVudF90YXJnZXQuaCIKKyNpbmNsdWRlICJjb2JhbHQvZG9tL21lc3NhZ2VfZXZlbnQuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3dyYXBwYWJsZS5oIgogCiBuYW1lc3BhY2UgY29iYWx0IHsKQEAgLTY0LDcgKzY2LDcgQEAKICAgfQogCiAgIC8vIFJlYWQrV3JpdGUgQXR0cmlidXRlcy4KLSAgc3RkOjpzdHJpbmcgYmluYXJ5X3R5cGUoc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSopIHsgcmV0dXJuIGJpbmFyeV90eXBlXzsgfQorICBzdGQ6OnN0cmluZyBiaW5hcnlfdHlwZShzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKik7CiAgIHZvaWQgc2V0X2JpbmFyeV90eXBlKGNvbnN0IHN0ZDo6c3RyaW5nJiBiaW5hcnlfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgc2NyaXB0OjpFeGNlcHRpb25TdGF0ZSogZXhjZXB0aW9uX3N0YXRlKTsKIApAQCAtODMsMzUgKzg1LDM1IEBACiAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOwogCiAgIC8vIEV2ZW50SGFuZGxlcnMuCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9uY2xvc2UoKSBjb25zdCB7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25jbG9zZSgpIGNvbnN0IHsKICAgICByZXR1cm4gR2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmNsb3NlKCkpOwogICB9CiAKLSAgdm9pZCBzZXRfb25jbG9zZShjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBldmVudF9saXN0ZW5lcikgeworICB2b2lkIHNldF9vbmNsb3NlKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgZXZlbnRfbGlzdGVuZXIpIHsKICAgICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6Y2xvc2UoKSwgZXZlbnRfbGlzdGVuZXIpOwogICB9CiAKLSAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCogb25lcnJvcigpIGNvbnN0IHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbmVycm9yKCkgY29uc3QgewogICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZXJyb3IoKSk7CiAgIH0KIAotICB2b2lkIHNldF9vbmVycm9yKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGV2ZW50X2xpc3RlbmVyKSB7CisgIHZvaWQgc2V0X29uZXJyb3IoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgewogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjplcnJvcigpLCBldmVudF9saXN0ZW5lcik7CiAgIH0KIAotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbm1lc3NhZ2UoKSBjb25zdCB7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25tZXNzYWdlKCkgY29uc3QgewogICAgIHJldHVybiBHZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6bWVzc2FnZSgpKTsKICAgfQogCi0gIHZvaWQgc2V0X29ubWVzc2FnZShjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBldmVudF9saXN0ZW5lcikgeworICB2b2lkIHNldF9vbm1lc3NhZ2UoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgewogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjptZXNzYWdlKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9ub3BlbigpIGNvbnN0IHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbm9wZW4oKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpvcGVuKCkpOwogICB9CiAKLSAgdm9pZCBzZXRfb25vcGVuKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGV2ZW50X2xpc3RlbmVyKSB7CisgIHZvaWQgc2V0X29ub3Blbihjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGV2ZW50X2xpc3RlbmVyKSB7CiAgICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6Om9wZW4oKSwgZXZlbnRfbGlzdGVuZXIpOwogICB9CiAKQEAgLTEyOCwxNCArMTMwLDE3IEBACiAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN1Yl9wcm90b2NvbHMsCiAgICAgICAgICAgICAgICAgICBzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOwogCi0gIHZvaWQgQ29ubmVjdChjb25zdCBHVVJMJiB1cmwsIGNvbnN0IHN0ZDo6c3RyaW5nJiBwcm90b2NvbHMpOworICB2b2lkIENvbm5lY3QoY29uc3QgR1VSTCYgdXJsLCBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHN1Yl9wcm90b2NvbHMpOworCisgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIGNoZWNrIGZhaWxzLgorICBib29sIENoZWNrUmVhZHlTdGF0ZShzY3JpcHQ6OkV4Y2VwdGlvblN0YXRlKiBleGNlcHRpb25fc3RhdGUpOwogCiAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzb2NrZXRzLyNkb20td2Vic29ja2V0LWJ1ZmZlcmVkYW1vdW50Ci0gIHVpbnQzMiBidWZmZXJlZF9hbW91bnRfOworICBpbnQzMiBidWZmZXJlZF9hbW91bnRfOwogICAvLyBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic29ja2V0cy8jZG9tLXdlYnNvY2tldC1yZWFkeXN0YXRlCiAgIHVpbnQxNiByZWFkeV9zdGF0ZV87CiAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzb2NrZXRzLyNkb20td2Vic29ja2V0LWJpbmFyeXR5cGUKLSAgc3RkOjpzdHJpbmcgYmluYXJ5X3R5cGVfOworICBkb206Ok1lc3NhZ2VFdmVudDo6UmVzcG9uc2VUeXBlQ29kZSBiaW5hcnlfdHlwZV87CiAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzb2NrZXRzLyNkb20td2Vic29ja2V0LWV4dGVuc2lvbnMKICAgc3RkOjpzdHJpbmcgZXh0ZW5zaW9uc187CiAgIC8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi93ZWJzb2NrZXRzLyNkb20td2Vic29ja2V0LXByb3RvY29sCkBAIC0xNDgsMTAgKzE1MywxMSBAQAogICAvLyBQYXJzZWQgZmllbGRzIHRoYXQgYXJlIHBvcHVsYXRlZCBpbiBJbml0aWFsaXplLgogICBib29sIGlzX3NlY3VyZV87CiAgIGludCBwb3J0XzsKLSAgc3RkOjpzdHJpbmcgaG9zdF87CiAgIHN0ZDo6c3RyaW5nIHJlc291cmNlX25hbWVfOyAgLy8gVGhlIHBhdGggb2YgdGhlIFVSTC4KICAgc3RkOjpzdHJpbmcgZW50cnlfc2NyaXB0X29yaWdpbl87CiAKKyAgZG9tOjpET01TZXR0aW5ncyogc2V0dGluZ3NfOworCiAgIEZSSUVORF9URVNUKFdlYlNvY2tldFRlc3QsIEdvb2RPcmlnaW4pOwogCiAgIERJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihXZWJTb2NrZXQpOwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldC5pZGwgYi9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hOTY4MTI5Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldC5pZGwKQEAgLTAsMCArMSw1NSBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworLyoKKyAqIENvcHlyaWdodCDCqSAyMDE1IFczQ8KuIChNSVQsIEVSQ0lNLCBLZWlvLCBCZWloYW5nKS4KKyAqIFRoaXMgc29mdHdhcmUgb3IgZG9jdW1lbnQgaW5jbHVkZXMgbWF0ZXJpYWwgY29waWVkIGZyb20gb3IgZGVyaXZlZCBmcm9tCisgKiBUaGUgV2ViU29ja2V0IEFQSSBodHRwczovL3d3dy53My5vcmcvVFIvd2Vic29ja2V0cy8KKyAqLworCitbCisgIENvbnN0cnVjdG9yKERPTVN0cmluZyB1cmwsIG9wdGlvbmFsIERPTVN0cmluZyBwcm90b2NvbHMpLAorICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCisgIFJhaXNlc0V4Y2VwdGlvbj1Db25zdHJ1Y3RvcgorXQoraW50ZXJmYWNlIFdlYlNvY2tldCA6IEV2ZW50VGFyZ2V0IHsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyB1cmw7CisKKyAgLy8gcmVhZHkgc3RhdGUKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ09OTkVDVElORyA9IDA7CisgIGNvbnN0IHVuc2lnbmVkIHNob3J0IE9QRU4gPSAxOworICBjb25zdCB1bnNpZ25lZCBzaG9ydCBDTE9TSU5HID0gMjsKKyAgY29uc3QgdW5zaWduZWQgc2hvcnQgQ0xPU0VEID0gMzsKKyAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IHJlYWR5U3RhdGU7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIGJ1ZmZlcmVkQW1vdW50OworCisgIC8vIG5ldHdvcmtpbmcKKyAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbm9wZW47CisgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25lcnJvcjsKKyAgYXR0cmlidXRlIEV2ZW50SGFuZGxlciBvbmNsb3NlOworICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIGV4dGVuc2lvbnM7CisgIHJlYWRvbmx5IGF0dHJpYnV0ZSBET01TdHJpbmcgcHJvdG9jb2w7CisgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgY2xvc2UoW0NsYW1wXSBvcHRpb25hbCB1bnNpZ25lZCBzaG9ydCBjb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIERPTVN0cmluZyByZWFzb24pOworCisgIC8vIG1lc3NhZ2luZworICAgICAgICAgICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ubWVzc2FnZTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gYXR0cmlidXRlIERPTVN0cmluZyBiaW5hcnlUeXBlOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNlbmQoRE9NU3RyaW5nIGRhdGEpOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNlbmQoQmxvYiBkYXRhKTsKKyAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZW5kKEFycmF5QnVmZmVyIGRhdGEpOworICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIHNlbmQoQXJyYXlCdWZmZXJWaWV3IGRhdGEpOworfTsKKwordHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2hhbmRzaGFrZV9oZWxwZXIuY2MgYi9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2hhbmRzaGFrZV9oZWxwZXIuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjZkZWYyOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaGFuZHNoYWtlX2hlbHBlci5jYwpAQCAtMCwwICsxLDMxOCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvKiBNb2RpZmljYXRpb25zOiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJjb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaGFuZHNoYWtlX2hlbHBlci5oIgorCisjaW5jbHVkZSA8c2V0PgorI2luY2x1ZGUgPHN0cmluZz4KKworI2luY2x1ZGUgImJhc2UvYmFzZTY0LmgiCisjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdfbnVtYmVyX2NvbnZlcnNpb25zLmgiCisjaW5jbHVkZSAiYmFzZS9zdHJpbmdfdXRpbC5oIgorI2luY2x1ZGUgIm5ldC9odHRwL2h0dHBfcmVxdWVzdF9oZWFkZXJzLmgiCisjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9zdGF0dXNfY29kZS5oIgorI2luY2x1ZGUgIm5ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9leHRlbnNpb24uaCIKKyNpbmNsdWRlICJuZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZXh0ZW5zaW9uX3BhcnNlci5oIgorI2luY2x1ZGUgIm5ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZS5oIgorI2luY2x1ZGUgIm5ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9oYW5kc2hha2VfY2hhbGxlbmdlLmgiCisjaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2hhbmRzaGFrZV9jb25zdGFudHMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3lzdGVtLmgiCisKK25hbWVzcGFjZSB7CisvLyBGb2xsb3dpbmcgZW51bSBhbmQgYW5vbnltb3VzIGZ1bmN0aW9ucyBhcmUgYWRhcHRlZCBmcm9tIENocm9taXVtIG5ldCBzb3VyY2UsCisvLyBjb21taXQgaWQ6IDczMjFjOWU3ZWU4MGVmMTViNjVjMmYzOTY0NmE1YTJkMjJhOWM5NTAgaW4KKy8vIHNyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfYmFzaWNfaGFuZHNoYWtlX3N0cmVhbS5jYy4KKworZW51bSBHZXRIZWFkZXJSZXN1bHQgeworICBHRVRfSEVBREVSX09LLAorICBHRVRfSEVBREVSX01JU1NJTkcsCisgIEdFVF9IRUFERVJfTVVMVElQTEUsCit9OworCitHZXRIZWFkZXJSZXN1bHQgR2V0U2luZ2xlSGVhZGVyVmFsdWUoY29uc3QgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGJhc2U6OlN0cmluZ1BpZWNlJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiB2YWx1ZSkgeworICB2b2lkKiBpdGVyID0gTlVMTDsKKyAgc2l6ZV90IG51bV92YWx1ZXMgPSAwOworICBzdGQ6OnN0cmluZyB0ZW1wX3ZhbHVlOworICBzdGQ6OnN0cmluZyBuYW1lX3N0cmluZyA9IG5hbWUuYXNfc3RyaW5nKCk7CisgIHdoaWxlIChoZWFkZXJzLT5FbnVtZXJhdGVIZWFkZXIoJml0ZXIsIG5hbWVfc3RyaW5nLCAmdGVtcF92YWx1ZSkpIHsKKyAgICBpZiAoKytudW1fdmFsdWVzID4gMSkgcmV0dXJuIEdFVF9IRUFERVJfTVVMVElQTEU7CisgICAgKnZhbHVlID0gdGVtcF92YWx1ZTsKKyAgfQorICByZXR1cm4gbnVtX3ZhbHVlcyA+IDAgPyBHRVRfSEVBREVSX09LIDogR0VUX0hFQURFUl9NSVNTSU5HOworfQorCitzdGQ6OnN0cmluZyBNaXNzaW5nSGVhZGVyTWVzc2FnZShjb25zdCBzdGQ6OnN0cmluZyYgaGVhZGVyX25hbWUpIHsKKyAgcmV0dXJuIHN0ZDo6c3RyaW5nKCInIikgKyBoZWFkZXJfbmFtZSArICInIGhlYWRlciBpcyBtaXNzaW5nIjsKK30KKworc3RkOjpzdHJpbmcgTXVsdGlwbGVIZWFkZXJWYWx1ZXNNZXNzYWdlKGNvbnN0IHN0ZDo6c3RyaW5nJiBoZWFkZXJfbmFtZSkgeworICByZXR1cm4gc3RkOjpzdHJpbmcoIiciKSArIGhlYWRlcl9uYW1lICsKKyAgICAgICAgICInIGhlYWRlciBtdXN0IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYSByZXNwb25zZSI7Cit9CisKK2Jvb2wgVmFsaWRhdGVIZWFkZXJIYXNTaW5nbGVWYWx1ZShHZXRIZWFkZXJSZXN1bHQgcmVzdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6c3RyaW5nJiBoZWFkZXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZmFpbHVyZV9tZXNzYWdlKSB7CisgIGlmIChyZXN1bHQgPT0gR0VUX0hFQURFUl9NSVNTSU5HKSB7CisgICAgKmZhaWx1cmVfbWVzc2FnZSA9IE1pc3NpbmdIZWFkZXJNZXNzYWdlKGhlYWRlcl9uYW1lKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHJlc3VsdCA9PSBHRVRfSEVBREVSX01VTFRJUExFKSB7CisgICAgKmZhaWx1cmVfbWVzc2FnZSA9IE11bHRpcGxlSGVhZGVyVmFsdWVzTWVzc2FnZShoZWFkZXJfbmFtZSk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIERDSEVDS19FUShyZXN1bHQsIEdFVF9IRUFERVJfT0spOworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWYWxpZGF0ZVVwZ3JhZGUoY29uc3QgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKiBoZWFkZXJzLAorICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZhaWx1cmVfbWVzc2FnZSkgeworICBzdGQ6OnN0cmluZyB2YWx1ZTsKKyAgR2V0SGVhZGVyUmVzdWx0IHJlc3VsdCA9CisgICAgICBHZXRTaW5nbGVIZWFkZXJWYWx1ZShoZWFkZXJzLCBuZXQ6OndlYnNvY2tldHM6OmtVcGdyYWRlLCAmdmFsdWUpOworICBpZiAoIVZhbGlkYXRlSGVhZGVySGFzU2luZ2xlVmFsdWUocmVzdWx0LCBuZXQ6OndlYnNvY2tldHM6OmtVcGdyYWRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFpbHVyZV9tZXNzYWdlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghTG93ZXJDYXNlRXF1YWxzQVNDSUkodmFsdWUsIG5ldDo6d2Vic29ja2V0czo6a1dlYlNvY2tldExvd2VyY2FzZSkpIHsKKyAgICAqZmFpbHVyZV9tZXNzYWdlID0gIidVcGdyYWRlJyBoZWFkZXIgdmFsdWUgaXMgbm90ICdXZWJTb2NrZXQnOiAiICsgdmFsdWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHJldHVybiB0cnVlOworfQorCitib29sIFZhbGlkYXRlU2VjV2ViU29ja2V0QWNjZXB0KGNvbnN0IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyogaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIGV4cGVjdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZmFpbHVyZV9tZXNzYWdlKSB7CisgIHN0ZDo6c3RyaW5nIGFjdHVhbDsKKyAgR2V0SGVhZGVyUmVzdWx0IHJlc3VsdCA9IEdldFNpbmdsZUhlYWRlclZhbHVlKAorICAgICAgaGVhZGVycywgbmV0Ojp3ZWJzb2NrZXRzOjprU2VjV2ViU29ja2V0QWNjZXB0LCAmYWN0dWFsKTsKKyAgaWYgKCFWYWxpZGF0ZUhlYWRlckhhc1NpbmdsZVZhbHVlKAorICAgICAgICAgIHJlc3VsdCwgbmV0Ojp3ZWJzb2NrZXRzOjprU2VjV2ViU29ja2V0QWNjZXB0LCBmYWlsdXJlX21lc3NhZ2UpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGV4cGVjdGVkICE9IGFjdHVhbCkgeworICAgICpmYWlsdXJlX21lc3NhZ2UgPSAiSW5jb3JyZWN0ICdTZWMtV2ViU29ja2V0LUFjY2VwdCcgaGVhZGVyIHZhbHVlIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVmFsaWRhdGVDb25uZWN0aW9uKGNvbnN0IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyogaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6c3RyaW5nKiBmYWlsdXJlX21lc3NhZ2UpIHsKKyAgLy8gQ29ubmVjdGlvbiBoZWFkZXIgaXMgcGVybWl0dGVkIHRvIGNvbnRhaW4gb3RoZXIgdG9rZW5zLgorICBpZiAoIWhlYWRlcnMtPkhhc0hlYWRlcihuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVyczo6a0Nvbm5lY3Rpb24pKSB7CisgICAgKmZhaWx1cmVfbWVzc2FnZSA9CisgICAgICAgIE1pc3NpbmdIZWFkZXJNZXNzYWdlKG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzOjprQ29ubmVjdGlvbik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghaGVhZGVycy0+SGFzSGVhZGVyVmFsdWUobmV0OjpIdHRwUmVxdWVzdEhlYWRlcnM6OmtDb25uZWN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldDo6d2Vic29ja2V0czo6a1VwZ3JhZGUpKSB7CisgICAgKmZhaWx1cmVfbWVzc2FnZSA9ICInQ29ubmVjdGlvbicgaGVhZGVyIHZhbHVlIG11c3QgY29udGFpbiAnVXBncmFkZSciOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBWYWxpZGF0ZVN1YlByb3RvY29sKAorICAgIGNvbnN0IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyogaGVhZGVycywKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxzdGQ6OnN0cmluZz4mIHJlcXVlc3RlZF9zdWJfcHJvdG9jb2xzLAorICAgIHN0ZDo6c3RyaW5nKiBzdWJfcHJvdG9jb2wsIHN0ZDo6c3RyaW5nKiBmYWlsdXJlX21lc3NhZ2UpIHsKKyAgdm9pZCogaXRlciA9IE5VTEw7CisgIHN0ZDo6c3RyaW5nIHZhbHVlOworICBzdGQ6OnNldDxzdGQ6OnN0cmluZz4gcmVxdWVzdGVkX3NldChyZXF1ZXN0ZWRfc3ViX3Byb3RvY29scy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXF1ZXN0ZWRfc3ViX3Byb3RvY29scy5lbmQoKSk7CisgIGludCBjb3VudCA9IDA7CisgIGJvb2wgaGFzX211bHRpcGxlX3Byb3RvY29scyA9IGZhbHNlOworICBib29sIGhhc19pbnZhbGlkX3Byb3RvY29sID0gZmFsc2U7CisKKyAgd2hpbGUgKCFoYXNfaW52YWxpZF9wcm90b2NvbCB8fCAhaGFzX211bHRpcGxlX3Byb3RvY29scykgeworICAgIHN0ZDo6c3RyaW5nIHRlbXBfdmFsdWU7CisgICAgaWYgKCFoZWFkZXJzLT5FbnVtZXJhdGVIZWFkZXIoJml0ZXIsIG5ldDo6d2Vic29ja2V0czo6a1NlY1dlYlNvY2tldFByb3RvY29sLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZW1wX3ZhbHVlKSkKKyAgICAgIGJyZWFrOworICAgIHZhbHVlID0gdGVtcF92YWx1ZTsKKyAgICBpZiAocmVxdWVzdGVkX3NldC5jb3VudCh2YWx1ZSkgPT0gMCkgaGFzX2ludmFsaWRfcHJvdG9jb2wgPSB0cnVlOworICAgIGlmICgrK2NvdW50ID4gMSkgaGFzX211bHRpcGxlX3Byb3RvY29scyA9IHRydWU7CisgIH0KKworICBpZiAoaGFzX211bHRpcGxlX3Byb3RvY29scykgeworICAgICpmYWlsdXJlX21lc3NhZ2UgPQorICAgICAgICBNdWx0aXBsZUhlYWRlclZhbHVlc01lc3NhZ2UobmV0Ojp3ZWJzb2NrZXRzOjprU2VjV2ViU29ja2V0UHJvdG9jb2wpOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmIChjb3VudCA+IDAgJiYgcmVxdWVzdGVkX3N1Yl9wcm90b2NvbHMuc2l6ZSgpID09IDApIHsKKyAgICAqZmFpbHVyZV9tZXNzYWdlID0gc3RkOjpzdHJpbmcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiUmVzcG9uc2UgbXVzdCBub3QgaW5jbHVkZSAnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgImhlYWRlciBpZiBub3QgcHJlc2VudCBpbiByZXF1ZXN0OiAiKSArCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOworICAgIHJldHVybiBmYWxzZTsKKyAgfSBlbHNlIGlmIChoYXNfaW52YWxpZF9wcm90b2NvbCkgeworICAgICpmYWlsdXJlX21lc3NhZ2UgPSAiJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnIGhlYWRlciB2YWx1ZSAnIiArIHZhbHVlICsKKyAgICAgICAgICAgICAgICAgICAgICAgIicgaW4gcmVzcG9uc2UgZG9lcyBub3QgbWF0Y2ggYW55IG9mIHNlbnQgdmFsdWVzIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSBpZiAocmVxdWVzdGVkX3N1Yl9wcm90b2NvbHMuc2l6ZSgpID4gMCAmJiBjb3VudCA9PSAwKSB7CisgICAgKmZhaWx1cmVfbWVzc2FnZSA9CisgICAgICAgICJTZW50IG5vbi1lbXB0eSAnU2VjLVdlYlNvY2tldC1Qcm90b2NvbCcgaGVhZGVyICIKKyAgICAgICAgImJ1dCBubyByZXNwb25zZSB3YXMgcmVjZWl2ZWQiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICAqc3ViX3Byb3RvY29sID0gdmFsdWU7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFZhbGlkYXRlRXh0ZW5zaW9ucyhjb25zdCBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnMqIGhlYWRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OnN0cmluZyogZmFpbHVyZV9tZXNzYWdlKSB7CisgIHZvaWQqIGl0ZXIgPSBOVUxMOworICBzdGQ6OnN0cmluZyBoZWFkZXJfdmFsdWU7CisgIHdoaWxlIChoZWFkZXJzLT5FbnVtZXJhdGVIZWFkZXIoCisgICAgICAmaXRlciwgbmV0Ojp3ZWJzb2NrZXRzOjprU2VjV2ViU29ja2V0RXh0ZW5zaW9ucywgJmhlYWRlcl92YWx1ZSkpIHsKKyAgICBuZXQ6OldlYlNvY2tldEV4dGVuc2lvblBhcnNlciBwYXJzZXI7CisgICAgaWYgKCFwYXJzZXIuUGFyc2UoaGVhZGVyX3ZhbHVlKSkgeworICAgICAgKmZhaWx1cmVfbWVzc2FnZSA9CisgICAgICAgICAgIidTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMnIGhlYWRlciB2YWx1ZSBpcyAiCisgICAgICAgICAgInJlamVjdGVkIGJ5IHRoZSBwYXJzZXI6ICIgKworICAgICAgICAgIGhlYWRlcl92YWx1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBjb25zdCBzdGQ6OnZlY3RvcjxuZXQ6OldlYlNvY2tldEV4dGVuc2lvbj4mIGV4dGVuc2lvbnMgPQorICAgICAgICBwYXJzZXIuZXh0ZW5zaW9ucygpOworICAgIGlmIChleHRlbnNpb25zLmVtcHR5KCkgPT0gZmFsc2UpIHsKKyAgICAgICpmYWlsdXJlX21lc3NhZ2UgPSAiQ29iYWx0IGRvZXMgbm90IHN1cHBvcnQgYW55IHdlYnNvY2tldCBleHRlbnNpb25zIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCituYW1lc3BhY2UgY29iYWx0IHsKK25hbWVzcGFjZSB3ZWJzb2NrZXQgeworCit2b2lkIFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlcjo6R2VuZXJhdGVIYW5kc2hha2VSZXF1ZXN0KAorICAgIGNvbnN0IEdVUkwmIGNvbm5lY3RfdXJsLCBjb25zdCBzdGQ6OnN0cmluZyYgb3JpZ2luLAorICAgIGNvbnN0IHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiYgZGVzaXJlZF9zdWJfcHJvdG9jb2xzLAorICAgIHN0ZDo6c3RyaW5nKiBoYW5kc2hha2VfcmVxdWVzdCkgeworICBEQ0hFQ0soaGFuZHNoYWtlX3JlcXVlc3QpOworICBHZW5lcmF0ZVNlY1dlYlNvY2tldEtleSgpOworCisgIGludCBlZmZlY3RpdmVfcG9ydCA9IGNvbm5lY3RfdXJsLkludFBvcnQoKTsKKyAgc3RkOjpzdHJpbmcgaG9zdF9oZWFkZXIoY29ubmVjdF91cmwuaG9zdCgpKTsKKyAgaWYgKGVmZmVjdGl2ZV9wb3J0ICE9IHVybF9wYXJzZTo6UE9SVF9VTlNQRUNJRklFRCkgeworICAgIGhvc3RfaGVhZGVyICs9ICI6IiArIGNvbm5lY3RfdXJsLnBvcnQoKTsKKyAgfQorCisgIHN0ZDo6c3RyaW5nJiBoZWFkZXJfc3RyaW5nKCpoYW5kc2hha2VfcmVxdWVzdCk7CisgIGhlYWRlcl9zdHJpbmcuY2xlYXIoKTsKKyAgaGVhZGVyX3N0cmluZy5yZXNlcnZlKDI1Nik7ICAvLyBUaGlzIGF2b2lkcyByZWFsbG9jYXRpb25zIGZvciBtb3N0IGNhc2VzLgorCisgIC8vIE5vdGU6IENvbmNhdGVuYXRpbmcgc3RyaW5nIGxpdGVyYWxzIGFuZCBzdGQ6OnN0cmluZyBvYmplY3RzIGFyZSBzZXBhcmF0ZWQKKyAgLy8gdG8gYXZvaWQgY3JlYXRpbmcgdW5uZWNlc3Nhcnkgc3RkOjpzdHJpbmcgb2JqZWN0cy4KKyAgaGVhZGVyX3N0cmluZyArPSAiR0VUICI7CisgIGhlYWRlcl9zdHJpbmcgKz0gY29ubmVjdF91cmwucGF0aCgpOworICBpZiAoY29ubmVjdF91cmwuaGFzX3F1ZXJ5KCkpIHsKKyAgICBoZWFkZXJfc3RyaW5nICs9ICI/IjsKKyAgICBoZWFkZXJfc3RyaW5nICs9IGNvbm5lY3RfdXJsLnF1ZXJ5KCk7CisgIH0KKyAgaGVhZGVyX3N0cmluZyArPSAiIEhUVFAvMS4xXHJcbiI7CisgIGhlYWRlcl9zdHJpbmcgKz0gIkhvc3Q6IjsKKyAgaGVhZGVyX3N0cmluZyArPSBob3N0X2hlYWRlcjsKKyAgaGVhZGVyX3N0cmluZyArPSAiXHJcbiI7CisgIGhlYWRlcl9zdHJpbmcgKz0KKyAgICAgICJDb25uZWN0aW9uOlVwZ3JhZGVcclxuIgorICAgICAgIlByYWdtYTpuby1jYWNoZVxyXG4iCisgICAgICAiQ2FjaGUtQ29udHJvbDpuby1jYWNoZVxyXG4iCisgICAgICAiVXBncmFkZTp3ZWJzb2NrZXRcclxuIgorICAgICAgIlNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9uczpcclxuIgorICAgICAgIlNlYy1XZWJTb2NrZXQtVmVyc2lvbjoxM1xyXG4iOworICBoZWFkZXJfc3RyaW5nICs9ICJPcmlnaW46IjsKKyAgaGVhZGVyX3N0cmluZyArPSBvcmlnaW47CisgIGhlYWRlcl9zdHJpbmcgKz0gIlxyXG4iOworICBoZWFkZXJfc3RyaW5nICs9ICJTZWMtV2ViU29ja2V0LUtleToiOworICBoZWFkZXJfc3RyaW5nICs9IHNlY193ZWJzb2NrZXRfa2V5Xy5rZXk7CisgIGhlYWRlcl9zdHJpbmcgKz0gIlxyXG4iOworCisgIGlmICghZGVzaXJlZF9zdWJfcHJvdG9jb2xzLmVtcHR5KCkpIHsKKyAgICBoZWFkZXJfc3RyaW5nICs9ICJTZWMtV2ViU29ja2V0LVByb3RvY29sOiI7CisgICAgaGVhZGVyX3N0cmluZyArPSBKb2luU3RyaW5nKGRlc2lyZWRfc3ViX3Byb3RvY29scywgIiwiKTsKKyAgICBoZWFkZXJfc3RyaW5nICs9ICJcclxuIjsKKyAgfQorCisgIGhlYWRlcl9zdHJpbmcgKz0gIlxyXG4iOworCisgIHJlcXVlc3RlZF9zdWJfcHJvdG9jb2xzXyA9IGRlc2lyZWRfc3ViX3Byb3RvY29sczsKKworICBzdGQ6OnN0cmluZyBrZXlfYXNfc3RyaW5nKHNlY193ZWJzb2NrZXRfa2V5Xy5rZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJyYXlzaXplKHNlY193ZWJzb2NrZXRfa2V5Xy5rZXkpKTsKKyAgaGFuZHNoYWtlX2NoYWxsZW5nZV9yZXNwb25zZV8gPSBuZXQ6OkNvbXB1dGVTZWNXZWJTb2NrZXRBY2NlcHQoa2V5X2FzX3N0cmluZyk7Cit9CisKK1dlYlNvY2tldEhhbmRzaGFrZUhlbHBlcjo6V2ViU29ja2V0SGFuZHNoYWtlSGVscGVyKCkKKyAgICA6IGtleV9nZW5lcmF0b3JfZnVuY3Rpb25fKCZuZXQ6OkdlbmVyYXRlV2ViU29ja2V0TWFza2luZ0tleSkge30KKworV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyOjpXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXIoCisgICAgV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyOjpXZWJTb2NrZXRNYXNraW5nS2V5R2VuZXJhdG9yRnVuY3Rpb24KKyAgICAgICAga2V5X2dlbmVyYXRvcl9mdW5jdGlvbikKKyAgICA6IGtleV9nZW5lcmF0b3JfZnVuY3Rpb25fKGtleV9nZW5lcmF0b3JfZnVuY3Rpb24pIHt9CisKK2Jvb2wgV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyOjpJc1Jlc3BvbnNlVmFsaWQoCisgICAgY29uc3QgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzJiBoZWFkZXJzLCBzdGQ6OnN0cmluZyogZmFpbHVyZV9tZXNzYWdlKSB7CisgIERDSEVDSyhmYWlsdXJlX21lc3NhZ2UpOworICBpbnQgcmVzcG9uc2VfY29kZSA9IGhlYWRlcnMucmVzcG9uc2VfY29kZSgpOworCisgIC8vIENoZWNrIHJlc3BvbnNlIGNvZGUgZmlyc3QuCisgIGlmIChyZXNwb25zZV9jb2RlICE9IG5ldDo6SFRUUF9TV0lUQ0hJTkdfUFJPVE9DT0xTKSB7CisgICAgKmZhaWx1cmVfbWVzc2FnZSA9CisgICAgICAgICJJbnZhbGlkIHJlc3BvbnNlIGNvZGUgIiArIGJhc2U6OkludFRvU3RyaW5nKHJlc3BvbnNlX2NvZGUpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmICghVmFsaWRhdGVVcGdyYWRlKCZoZWFkZXJzLCBmYWlsdXJlX21lc3NhZ2UpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGlmICghVmFsaWRhdGVTZWNXZWJTb2NrZXRBY2NlcHQoJmhlYWRlcnMsIGhhbmRzaGFrZV9jaGFsbGVuZ2VfcmVzcG9uc2VfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhaWx1cmVfbWVzc2FnZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFWYWxpZGF0ZUNvbm5lY3Rpb24oJmhlYWRlcnMsIGZhaWx1cmVfbWVzc2FnZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFWYWxpZGF0ZVN1YlByb3RvY29sKCZoZWFkZXJzLCByZXF1ZXN0ZWRfc3ViX3Byb3RvY29sc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZWN0ZWRfc3VicHJvdG9jb2xfLCBmYWlsdXJlX21lc3NhZ2UpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIC8vIENvYmFsdCBkb2VzIG5vdCBzdXBwb3J0IGV4dGVuc2lvbnMsIHNvIHdlIGp1c3QgbWFrZSBzdXJlIHRoYXQgbm9uZSBhcmUKKyAgLy8gYmVpbmcgc2VsZWN0ZWQuCisgIGlmICghVmFsaWRhdGVFeHRlbnNpb25zKCZoZWFkZXJzLCBmYWlsdXJlX21lc3NhZ2UpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgZmFpbHVyZV9tZXNzYWdlLT5jbGVhcigpOworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXI6OkdlbmVyYXRlU2VjV2ViU29ja2V0S2V5KCkgeworICBzZWNfd2Vic29ja2V0X2tleV8gPSBrZXlfZ2VuZXJhdG9yX2Z1bmN0aW9uXygpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd2Vic29ja2V0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2hhbmRzaGFrZV9oZWxwZXIuaCBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfaGFuZHNoYWtlX2hlbHBlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcwYWJkYzkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2hhbmRzaGFrZV9oZWxwZXIuaApAQCAtMCwwICsxLDc0IEBACisvKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgQ09CQUxUX1dFQlNPQ0tFVF9XRUJfU09DS0VUX0hBTkRTSEFLRV9IRUxQRVJfSF8KKyNkZWZpbmUgQ09CQUxUX1dFQlNPQ0tFVF9XRUJfU09DS0VUX0hBTkRTSEFLRV9IRUxQRVJfSF8KKworI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJiYXNlL2Jhc2ljdHlwZXMuaCIKKyNpbmNsdWRlICJiYXNlL2d0ZXN0X3Byb2RfdXRpbC5oIgorI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3BpZWNlLmgiCisjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCisjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9yZXNwb25zZV9oZWFkZXJzLmgiCisjaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lLmgiCisKK25hbWVzcGFjZSBjb2JhbHQgeworbmFtZXNwYWNlIHdlYnNvY2tldCB7CisKK2NsYXNzIFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlciB7CisgcHVibGljOgorICB0eXBlZGVmIG5ldDo6V2ViU29ja2V0TWFza2luZ0tleSAoKldlYlNvY2tldE1hc2tpbmdLZXlHZW5lcmF0b3JGdW5jdGlvbikoKTsKKworICBXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXIoKTsKKworICAvLyBPdmVycmlkaW5nIHRoZSBrZXktZ2VuZXJhdGlvbiBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIHRlc3RpbmcuCisgIGV4cGxpY2l0IFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlcigKKyAgICAgIFdlYlNvY2tldE1hc2tpbmdLZXlHZW5lcmF0b3JGdW5jdGlvbiBrZXlfZ2VuZXJhdG9yX2Z1bmN0aW9uKTsKKworICB2b2lkIEdlbmVyYXRlSGFuZHNoYWtlUmVxdWVzdCgKKyAgICAgIGNvbnN0IEdVUkwmIGNvbm5lY3RfdXJsLCBjb25zdCBzdGQ6OnN0cmluZyYgb3JpZ2luLAorICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8c3RkOjpzdHJpbmc+JiBkZXNpcmVkX3N1Yl9wcm90b2NvbHMsCisgICAgICBzdGQ6OnN0cmluZyogaGFuZHNoYWtlX3JlcXVlc3QpOworCisgIGJvb2wgSXNSZXNwb25zZVZhbGlkKGNvbnN0IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyYgaGVhZGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjpzdHJpbmcqIGZhaWx1cmVfbWVzc2FnZSk7CisKKyAgY29uc3Qgc3RkOjpzdHJpbmcmIEdldFNlbGVjdGVkU3ViUHJvdG9jb2woKSBjb25zdCB7CisgICAgcmV0dXJuIHNlbGVjdGVkX3N1YnByb3RvY29sXzsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gSGF2aW5nIGtleSBnZW5lcmF0b3IgZnVuY3Rpb24gcGFzc2VkIGlzIHNsaWdodGx5IHNsb3dlciwgYnV0IHZlcnkgdXNlZnVsCisgIC8vIGZvciB0ZXN0aW5nLgorICBXZWJTb2NrZXRNYXNraW5nS2V5R2VuZXJhdG9yRnVuY3Rpb24ga2V5X2dlbmVyYXRvcl9mdW5jdGlvbl87CisKKyAgc3RkOjpzdHJpbmcgaGFuZHNoYWtlX2NoYWxsZW5nZV9yZXNwb25zZV87CisgIG5ldDo6V2ViU29ja2V0TWFza2luZ0tleSBzZWNfd2Vic29ja2V0X2tleV87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiByZXF1ZXN0ZWRfc3ViX3Byb3RvY29sc187CisgIHN0ZDo6c3RyaW5nIHNlbGVjdGVkX3N1YnByb3RvY29sXzsKKworICB2b2lkIEdlbmVyYXRlU2VjV2ViU29ja2V0S2V5KCk7CisKKyAgRlJJRU5EX1RFU1RfQUxMX1BSRUZJWEVTKFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlclRlc3QsIG51bGxfa2V5KTsKKworICBESVNBTExPV19DT1BZX0FORF9BU1NJR04oV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyKTsKK307CisKK30gIC8vIG5hbWVzcGFjZSB3ZWJzb2NrZXQKK30gIC8vIG5hbWVzcGFjZSBjb2JhbHQKKworI2VuZGlmICAvLyBDT0JBTFRfV0VCU09DS0VUX1dFQl9TT0NLRVRfSEFORFNIQUtFX0hFTFBFUl9IXwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldF9oYW5kc2hha2VfaGVscGVyX3Rlc3QuY2MgYi9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2hhbmRzaGFrZV9oZWxwZXJfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MTNlMzlmCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldF9oYW5kc2hha2VfaGVscGVyX3Rlc3QuY2MKQEAgLTAsMCArMSw1NTEgQEAKKy8vIENvcHlyaWdodCAyMDEzIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgorLyogTW9kaWZpY2F0aW9uczogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaW5jbHVkZSAiY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X2hhbmRzaGFrZV9oZWxwZXIuaCIKKworI2luY2x1ZGUgImJhc2Uvc3RyaW5nX3BpZWNlLmgiCisjaW5jbHVkZSAiZ29vZ2xldXJsL3NyYy9ndXJsLmgiCisjaW5jbHVkZSAibmV0L2h0dHAvaHR0cF9yZXF1ZXN0X2hlYWRlcnMuaCIKKyNpbmNsdWRlICJuZXQvaHR0cC9odHRwX3V0aWwuaCIKKyNpbmNsdWRlICJuZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWUuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSB7CisKK25ldDo6V2ViU29ja2V0TWFza2luZ0tleSBOdWxsTWFza2luZ0tleUdlbmVyYXRvcigpIHsKKyAgbmV0OjpXZWJTb2NrZXRNYXNraW5nS2V5IGtleTsKKyAgU2JNZW1vcnlTZXQoa2V5LmtleSwgMCwgc2l6ZW9mKGtleS5rZXkpKTsKKyAgcmV0dXJuIGtleTsKK30KKworc3RkOjp2ZWN0b3I8bmV0OjpIdHRwUmVxdWVzdEhlYWRlcnM6OkhlYWRlcktleVZhbHVlUGFpcj4gUmVxdWVzdEhlYWRlcnNUb1ZlY3RvcigKKyAgICBjb25zdCBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVycyAmaGVhZGVycykgeworICBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVyczo6SXRlcmF0b3IgaXQoaGVhZGVycyk7CisgIHN0ZDo6dmVjdG9yPG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzOjpIZWFkZXJLZXlWYWx1ZVBhaXI+IHJlc3VsdDsKKyAgd2hpbGUgKGl0LkdldE5leHQoKSkKKyAgICByZXN1bHQucHVzaF9iYWNrKAorICAgICAgICBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVyczo6SGVhZGVyS2V5VmFsdWVQYWlyKGl0Lm5hbWUoKSwgaXQudmFsdWUoKSkpOworICByZXR1cm4gcmVzdWx0OworfQorCit9ICAvLyBuYW1lc3BhY2UKKworbmFtZXNwYWNlIG5ldCB7CisKK2Jvb2wgb3BlcmF0b3I9PShjb25zdCBIdHRwUmVxdWVzdEhlYWRlcnM6OkhlYWRlcktleVZhbHVlUGFpciAmbGhzLAorICAgICAgICAgICAgICAgIGNvbnN0IEh0dHBSZXF1ZXN0SGVhZGVyczo6SGVhZGVyS2V5VmFsdWVQYWlyICZyaHMpIHsKKyAgcmV0dXJuIChsaHMua2V5ID09IHJocy5rZXkpICYmIChsaHMudmFsdWUgPT0gcmhzLnZhbHVlKTsKK30KKworc3RkOjpvc3RyZWFtICZvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSAmb3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgSHR0cFJlcXVlc3RIZWFkZXJzOjpIZWFkZXJLZXlWYWx1ZVBhaXIgJm9iaikgeworICBvcyA8PCBvYmoua2V5IDw8ICI6IiA8PCBvYmoudmFsdWU7CisgIHJldHVybiBvczsKK30KK30gIC8vIG5hbWVzcGFjZSBuZXQKKworbmFtZXNwYWNlIGNvYmFsdCB7CituYW1lc3BhY2Ugd2Vic29ja2V0IHsKKworY2xhc3MgV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHB1YmxpYzoKKyAgV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCgpCisgICAgICA6IGhhbmRzaGFrZV9oZWxwZXJfKCZOdWxsTWFza2luZ0tleUdlbmVyYXRvcikge30KKworICBXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXIgaGFuZHNoYWtlX2hlbHBlcl87CisgIHN0ZDo6dmVjdG9yPHN0ZDo6c3RyaW5nPiBzdWJfcHJvdG9jb2xzXzsKK307CisKK1RFU1RfRihXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXJUZXN0LCBudWxsX2tleSkgeworICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8aW50PihuZXQ6OldlYlNvY2tldEZyYW1lSGVhZGVyOjprTWFza2luZ0tleUxlbmd0aCksIDQpOworICBFWFBFQ1RfRVEoCisgICAgICBzdGF0aWNfY2FzdDxzdGQ6OnNpemVfdD4obmV0OjpXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a01hc2tpbmdLZXlMZW5ndGgpLAorICAgICAgYXJyYXlzaXplKGhhbmRzaGFrZV9oZWxwZXJfLnNlY193ZWJzb2NrZXRfa2V5Xy5rZXkpKTsKKworICBoYW5kc2hha2VfaGVscGVyXy5HZW5lcmF0ZVNlY1dlYlNvY2tldEtleSgpOworICBzdGQ6OnN0cmluZyBudWxsX2tleShuZXQ6OldlYlNvY2tldEZyYW1lSGVhZGVyOjprTWFza2luZ0tleUxlbmd0aCwgJ1wwJyk7CisgIEVYUEVDVF9FUSgKKyAgICAgIFNiTWVtb3J5Q29tcGFyZShudWxsX2tleS5kYXRhKCksIGhhbmRzaGFrZV9oZWxwZXJfLnNlY193ZWJzb2NrZXRfa2V5Xy5rZXksCisgICAgICAgICAgICAgICAgICAgICAgbmV0OjpXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a01hc2tpbmdLZXlMZW5ndGgpLAorICAgICAgMCk7Cit9CisKK1RFU1RfRihXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXJUZXN0LCBIYW5kc2hha2VJbmZvKSB7CisgIHN0ZDo6c3RyaW5nIGhhbmRzaGFrZV9yZXF1ZXN0OworICBHVVJMIGxvY2FsaG9zdF93ZWJzb2NrZXRfZW5kcG9pbnQoIndzOi8vbG9jYWxob3N0LyIpOworICBoYW5kc2hha2VfaGVscGVyXy5HZW5lcmF0ZUhhbmRzaGFrZVJlcXVlc3QobG9jYWxob3N0X3dlYnNvY2tldF9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0Iiwgc3ViX3Byb3RvY29sc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZHNoYWtlX3JlcXVlc3QpOworCisgIGNoYXIgZW5kX29mX2xpbmVbXSA9ICJcclxuIjsKKyAgc3RkOjpzaXplX3QgZmlyc3RfbGluZV9lbmQgPSBoYW5kc2hha2VfcmVxdWVzdC5maW5kKGVuZF9vZl9saW5lKTsKKyAgQVNTRVJUX05FKGZpcnN0X2xpbmVfZW5kLCBzdGQ6OnN0cmluZzo6bnBvcyk7CisgIG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzIGhlYWRlcnM7CisgIGJhc2U6OlN0cmluZ1BpZWNlIGhhbmRzaGFrZV9yZXF1ZXN0X3N0cmluZ3BpZWNlKAorICAgICAgaGFuZHNoYWtlX3JlcXVlc3QuZGF0YSgpICsgZmlyc3RfbGluZV9lbmQgKyBzaXplb2YoZW5kX29mX2xpbmUpIC0gMSk7CisgIGhlYWRlcnMuQWRkSGVhZGVyc0Zyb21TdHJpbmcoaGFuZHNoYWtlX3JlcXVlc3Rfc3RyaW5ncGllY2UpOworICBzdGQ6OnZlY3RvcjxuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVyczo6SGVhZGVyS2V5VmFsdWVQYWlyPiByZXF1ZXN0X2hlYWRlcnMgPQorICAgICAgUmVxdWVzdEhlYWRlcnNUb1ZlY3RvcihoZWFkZXJzKTsKKworICB0eXBlZGVmIG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzOjpIZWFkZXJLZXlWYWx1ZVBhaXIgSGVhZGVyS2V5VmFsdWVQYWlyOworICBBU1NFUlRfRVEoOXUsIHJlcXVlc3RfaGVhZGVycy5zaXplKCkpOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJIb3N0IiwgImxvY2FsaG9zdCIpLCByZXF1ZXN0X2hlYWRlcnNbMF0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJDb25uZWN0aW9uIiwgIlVwZ3JhZGUiKSwgcmVxdWVzdF9oZWFkZXJzWzFdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiUHJhZ21hIiwgIm5vLWNhY2hlIiksIHJlcXVlc3RfaGVhZGVyc1syXSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIkNhY2hlLUNvbnRyb2wiLCAibm8tY2FjaGUiKSwKKyAgICAgICAgICAgIHJlcXVlc3RfaGVhZGVyc1szXSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIlVwZ3JhZGUiLCAid2Vic29ja2V0IiksIHJlcXVlc3RfaGVhZGVyc1s0XSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIlNlYy1XZWJTb2NrZXQtRXh0ZW5zaW9ucyIsICIiKSwKKyAgICAgICAgICAgIHJlcXVlc3RfaGVhZGVyc1s1XSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIlNlYy1XZWJTb2NrZXQtVmVyc2lvbiIsICIxMyIpLAorICAgICAgICAgICAgcmVxdWVzdF9oZWFkZXJzWzZdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiT3JpZ2luIiwgImh0dHA6Ly9sb2NhbGhvc3QiKSwKKyAgICAgICAgICAgIHJlcXVlc3RfaGVhZGVyc1s3XSk7CisgIEVYUEVDVF9FUSgiU2VjLVdlYlNvY2tldC1LZXkiLCByZXF1ZXN0X2hlYWRlcnNbOF0ua2V5KTsKK30KKworVEVTVF9GKFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlclRlc3QsIEhhbmRzaGFrZVdpdGhQb3J0KSB7CisgIHN0ZDo6c3RyaW5nIGhhbmRzaGFrZV9yZXF1ZXN0OworICBHVVJMIGxvY2FsaG9zdF93ZWJzb2NrZXRfZW5kcG9pbnQoIndzOi8vbG9jYWxob3N0OjQ1NDEvIik7CisgIGhhbmRzaGFrZV9oZWxwZXJfLkdlbmVyYXRlSGFuZHNoYWtlUmVxdWVzdChsb2NhbGhvc3Rfd2Vic29ja2V0X2VuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QiLCBzdWJfcHJvdG9jb2xzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kc2hha2VfcmVxdWVzdCk7CisKKyAgY2hhciBlbmRfb2ZfbGluZVtdID0gIlxyXG4iOworICBzdGQ6OnNpemVfdCBmaXJzdF9saW5lX2VuZCA9IGhhbmRzaGFrZV9yZXF1ZXN0LmZpbmQoZW5kX29mX2xpbmUpOworICBBU1NFUlRfTkUoZmlyc3RfbGluZV9lbmQsIHN0ZDo6c3RyaW5nOjpucG9zKTsKKyAgbmV0OjpIdHRwUmVxdWVzdEhlYWRlcnMgaGVhZGVyczsKKyAgYmFzZTo6U3RyaW5nUGllY2UgaGFuZHNoYWtlX3JlcXVlc3Rfc3RyaW5ncGllY2UoCisgICAgICBoYW5kc2hha2VfcmVxdWVzdC5kYXRhKCkgKyBmaXJzdF9saW5lX2VuZCArIHNpemVvZihlbmRfb2ZfbGluZSkgLSAxKTsKKyAgaGVhZGVycy5BZGRIZWFkZXJzRnJvbVN0cmluZyhoYW5kc2hha2VfcmVxdWVzdF9zdHJpbmdwaWVjZSk7CisgIHN0ZDo6dmVjdG9yPG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzOjpIZWFkZXJLZXlWYWx1ZVBhaXI+IHJlcXVlc3RfaGVhZGVycyA9CisgICAgICBSZXF1ZXN0SGVhZGVyc1RvVmVjdG9yKGhlYWRlcnMpOworCisgIHR5cGVkZWYgbmV0OjpIdHRwUmVxdWVzdEhlYWRlcnM6OkhlYWRlcktleVZhbHVlUGFpciBIZWFkZXJLZXlWYWx1ZVBhaXI7CisgIEFTU0VSVF9FUSg5dSwgcmVxdWVzdF9oZWFkZXJzLnNpemUoKSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIkhvc3QiLCAibG9jYWxob3N0OjQ1NDEiKSwgcmVxdWVzdF9oZWFkZXJzWzBdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiQ29ubmVjdGlvbiIsICJVcGdyYWRlIiksIHJlcXVlc3RfaGVhZGVyc1sxXSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIlByYWdtYSIsICJuby1jYWNoZSIpLCByZXF1ZXN0X2hlYWRlcnNbMl0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbM10pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJVcGdyYWRlIiwgIndlYnNvY2tldCIpLCByZXF1ZXN0X2hlYWRlcnNbNF0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMiLCAiIiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbNV0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJTZWMtV2ViU29ja2V0LVZlcnNpb24iLCAiMTMiKSwKKyAgICAgICAgICAgIHJlcXVlc3RfaGVhZGVyc1s2XSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIk9yaWdpbiIsICJodHRwOi8vbG9jYWxob3N0IiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbN10pOworICBFWFBFQ1RfRVEoIlNlYy1XZWJTb2NrZXQtS2V5IiwgcmVxdWVzdF9oZWFkZXJzWzhdLmtleSk7Cit9CisKK1RFU1RfRihXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXJUZXN0LCBIYW5kc2hha2VQYXRoKSB7CisgIHN0ZDo6c3RyaW5nIGhhbmRzaGFrZV9yZXF1ZXN0OworICBHVVJMIGxvY2FsaG9zdF93ZWJzb2NrZXRfZW5kcG9pbnQoIndzOi8vbG9jYWxob3N0OjQ1NDEvYWJjLWRlZiIpOworICBoYW5kc2hha2VfaGVscGVyXy5HZW5lcmF0ZUhhbmRzaGFrZVJlcXVlc3QobG9jYWxob3N0X3dlYnNvY2tldF9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0Iiwgc3ViX3Byb3RvY29sc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZHNoYWtlX3JlcXVlc3QpOworCisgIGNoYXIgZW5kX29mX2xpbmVbXSA9ICJcclxuIjsKKyAgc3RkOjpzaXplX3QgZmlyc3RfbGluZV9lbmQgPSBoYW5kc2hha2VfcmVxdWVzdC5maW5kKGVuZF9vZl9saW5lKTsKKyAgQVNTRVJUX05FKGZpcnN0X2xpbmVfZW5kLCBzdGQ6OnN0cmluZzo6bnBvcyk7CisKKyAgc3RkOjpzdHJpbmcgaHR0cF9HRVRfbGluZSA9IGhhbmRzaGFrZV9yZXF1ZXN0LnN1YnN0cigwLCBmaXJzdF9saW5lX2VuZCk7CisgIEVYUEVDVF9FUShodHRwX0dFVF9saW5lLCAiR0VUIC9hYmMtZGVmIEhUVFAvMS4xIik7CisgIG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzIGhlYWRlcnM7CisgIGJhc2U6OlN0cmluZ1BpZWNlIGhhbmRzaGFrZV9yZXF1ZXN0X3N0cmluZ3BpZWNlKAorICAgICAgaGFuZHNoYWtlX3JlcXVlc3QuZGF0YSgpICsgZmlyc3RfbGluZV9lbmQgKyBzaXplb2YoZW5kX29mX2xpbmUpIC0gMSk7CisgIGhlYWRlcnMuQWRkSGVhZGVyc0Zyb21TdHJpbmcoaGFuZHNoYWtlX3JlcXVlc3Rfc3RyaW5ncGllY2UpOworICBzdGQ6OnZlY3RvcjxuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVyczo6SGVhZGVyS2V5VmFsdWVQYWlyPiByZXF1ZXN0X2hlYWRlcnMgPQorICAgICAgUmVxdWVzdEhlYWRlcnNUb1ZlY3RvcihoZWFkZXJzKTsKKworICB0eXBlZGVmIG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzOjpIZWFkZXJLZXlWYWx1ZVBhaXIgSGVhZGVyS2V5VmFsdWVQYWlyOworICBBU1NFUlRfRVEoOXUsIHJlcXVlc3RfaGVhZGVycy5zaXplKCkpOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJIb3N0IiwgImxvY2FsaG9zdDo0NTQxIiksIHJlcXVlc3RfaGVhZGVyc1swXSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIkNvbm5lY3Rpb24iLCAiVXBncmFkZSIpLCByZXF1ZXN0X2hlYWRlcnNbMV0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJQcmFnbWEiLCAibm8tY2FjaGUiKSwgcmVxdWVzdF9oZWFkZXJzWzJdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSIpLAorICAgICAgICAgICAgcmVxdWVzdF9oZWFkZXJzWzNdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiVXBncmFkZSIsICJ3ZWJzb2NrZXQiKSwgcmVxdWVzdF9oZWFkZXJzWzRdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIiwgIiIpLAorICAgICAgICAgICAgcmVxdWVzdF9oZWFkZXJzWzVdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiU2VjLVdlYlNvY2tldC1WZXJzaW9uIiwgIjEzIiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbNl0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJPcmlnaW4iLCAiaHR0cDovL2xvY2FsaG9zdCIpLAorICAgICAgICAgICAgcmVxdWVzdF9oZWFkZXJzWzddKTsKKyAgRVhQRUNUX0VRKCJTZWMtV2ViU29ja2V0LUtleSIsIHJlcXVlc3RfaGVhZGVyc1s4XS5rZXkpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgSGFuZHNoYWtlUGF0aFdpdGhRdWVyeSkgeworICBzdGQ6OnN0cmluZyBoYW5kc2hha2VfcmVxdWVzdDsKKyAgR1VSTCBsb2NhbGhvc3Rfd2Vic29ja2V0X2VuZHBvaW50KCJ3czovL2xvY2FsaG9zdDo0NTQxL2FiYz9vbmU9MSZ0d289MiIpOworICBoYW5kc2hha2VfaGVscGVyXy5HZW5lcmF0ZUhhbmRzaGFrZVJlcXVlc3QobG9jYWxob3N0X3dlYnNvY2tldF9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0Iiwgc3ViX3Byb3RvY29sc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZHNoYWtlX3JlcXVlc3QpOworCisgIGNoYXIgZW5kX29mX2xpbmVbXSA9ICJcclxuIjsKKyAgc3RkOjpzaXplX3QgZmlyc3RfbGluZV9lbmQgPSBoYW5kc2hha2VfcmVxdWVzdC5maW5kKGVuZF9vZl9saW5lKTsKKyAgQVNTRVJUX05FKGZpcnN0X2xpbmVfZW5kLCBzdGQ6OnN0cmluZzo6bnBvcyk7CisKKyAgc3RkOjpzdHJpbmcgaHR0cF9HRVRfbGluZSA9IGhhbmRzaGFrZV9yZXF1ZXN0LnN1YnN0cigwLCBmaXJzdF9saW5lX2VuZCk7CisgIEVYUEVDVF9FUShodHRwX0dFVF9saW5lLCAiR0VUIC9hYmM/b25lPTEmdHdvPTIgSFRUUC8xLjEiKTsKKyAgbmV0OjpIdHRwUmVxdWVzdEhlYWRlcnMgaGVhZGVyczsKKyAgYmFzZTo6U3RyaW5nUGllY2UgaGFuZHNoYWtlX3JlcXVlc3Rfc3RyaW5ncGllY2UoCisgICAgICBoYW5kc2hha2VfcmVxdWVzdC5kYXRhKCkgKyBmaXJzdF9saW5lX2VuZCArIHNpemVvZihlbmRfb2ZfbGluZSkgLSAxKTsKKyAgaGVhZGVycy5BZGRIZWFkZXJzRnJvbVN0cmluZyhoYW5kc2hha2VfcmVxdWVzdF9zdHJpbmdwaWVjZSk7CisgIHN0ZDo6dmVjdG9yPG5ldDo6SHR0cFJlcXVlc3RIZWFkZXJzOjpIZWFkZXJLZXlWYWx1ZVBhaXI+IHJlcXVlc3RfaGVhZGVycyA9CisgICAgICBSZXF1ZXN0SGVhZGVyc1RvVmVjdG9yKGhlYWRlcnMpOworCisgIHR5cGVkZWYgbmV0OjpIdHRwUmVxdWVzdEhlYWRlcnM6OkhlYWRlcktleVZhbHVlUGFpciBIZWFkZXJLZXlWYWx1ZVBhaXI7CisgIEFTU0VSVF9FUSg5dSwgcmVxdWVzdF9oZWFkZXJzLnNpemUoKSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIkhvc3QiLCAibG9jYWxob3N0OjQ1NDEiKSwgcmVxdWVzdF9oZWFkZXJzWzBdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiQ29ubmVjdGlvbiIsICJVcGdyYWRlIiksIHJlcXVlc3RfaGVhZGVyc1sxXSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIlByYWdtYSIsICJuby1jYWNoZSIpLCByZXF1ZXN0X2hlYWRlcnNbMl0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJDYWNoZS1Db250cm9sIiwgIm5vLWNhY2hlIiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbM10pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJVcGdyYWRlIiwgIndlYnNvY2tldCIpLCByZXF1ZXN0X2hlYWRlcnNbNF0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnMiLCAiIiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbNV0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJTZWMtV2ViU29ja2V0LVZlcnNpb24iLCAiMTMiKSwKKyAgICAgICAgICAgIHJlcXVlc3RfaGVhZGVyc1s2XSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIk9yaWdpbiIsICJodHRwOi8vbG9jYWxob3N0IiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbN10pOworICBFWFBFQ1RfRVEoIlNlYy1XZWJTb2NrZXQtS2V5IiwgcmVxdWVzdF9oZWFkZXJzWzhdLmtleSk7Cit9CisKK1RFU1RfRihXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXJUZXN0LCBIYW5kc2hha2VQYXRoV2l0aERlc2lyZWRQcm90b2NvbHMpIHsKKyAgc3ViX3Byb3RvY29sc18ucHVzaF9iYWNrKCJjaGF0Iik7CisgIHN1Yl9wcm90b2NvbHNfLnB1c2hfYmFjaygic3VwZXJjaGF0Iik7CisKKyAgc3RkOjpzdHJpbmcgaGFuZHNoYWtlX3JlcXVlc3Q7CisgIEdVUkwgbG9jYWxob3N0X3dlYnNvY2tldF9lbmRwb2ludCgid3M6Ly9sb2NhbGhvc3QvIik7CisgIGhhbmRzaGFrZV9oZWxwZXJfLkdlbmVyYXRlSGFuZHNoYWtlUmVxdWVzdChsb2NhbGhvc3Rfd2Vic29ja2V0X2VuZHBvaW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImh0dHA6Ly9sb2NhbGhvc3QiLCBzdWJfcHJvdG9jb2xzXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZoYW5kc2hha2VfcmVxdWVzdCk7CisKKyAgY2hhciBlbmRfb2ZfbGluZVtdID0gIlxyXG4iOworICBzdGQ6OnNpemVfdCBmaXJzdF9saW5lX2VuZCA9IGhhbmRzaGFrZV9yZXF1ZXN0LmZpbmQoZW5kX29mX2xpbmUpOworICBBU1NFUlRfTkUoZmlyc3RfbGluZV9lbmQsIHN0ZDo6c3RyaW5nOjpucG9zKTsKKworICBzdGQ6OnN0cmluZyBodHRwX0dFVF9saW5lID0gaGFuZHNoYWtlX3JlcXVlc3Quc3Vic3RyKDAsIGZpcnN0X2xpbmVfZW5kKTsKKyAgRVhQRUNUX0VRKGh0dHBfR0VUX2xpbmUsICJHRVQgLyBIVFRQLzEuMSIpOworICBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVycyBoZWFkZXJzOworICBiYXNlOjpTdHJpbmdQaWVjZSBoYW5kc2hha2VfcmVxdWVzdF9zdHJpbmdwaWVjZSgKKyAgICAgIGhhbmRzaGFrZV9yZXF1ZXN0LmRhdGEoKSArIGZpcnN0X2xpbmVfZW5kICsgc2l6ZW9mKGVuZF9vZl9saW5lKSAtIDEpOworICBoZWFkZXJzLkFkZEhlYWRlcnNGcm9tU3RyaW5nKGhhbmRzaGFrZV9yZXF1ZXN0X3N0cmluZ3BpZWNlKTsKKyAgc3RkOjp2ZWN0b3I8bmV0OjpIdHRwUmVxdWVzdEhlYWRlcnM6OkhlYWRlcktleVZhbHVlUGFpcj4gcmVxdWVzdF9oZWFkZXJzID0KKyAgICAgIFJlcXVlc3RIZWFkZXJzVG9WZWN0b3IoaGVhZGVycyk7CisKKyAgdHlwZWRlZiBuZXQ6Okh0dHBSZXF1ZXN0SGVhZGVyczo6SGVhZGVyS2V5VmFsdWVQYWlyIEhlYWRlcktleVZhbHVlUGFpcjsKKyAgQVNTRVJUX0VRKDEwdSwgcmVxdWVzdF9oZWFkZXJzLnNpemUoKSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIkhvc3QiLCAibG9jYWxob3N0IiksIHJlcXVlc3RfaGVhZGVyc1swXSk7CisgIEVYUEVDVF9FUShIZWFkZXJLZXlWYWx1ZVBhaXIoIkNvbm5lY3Rpb24iLCAiVXBncmFkZSIpLCByZXF1ZXN0X2hlYWRlcnNbMV0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJQcmFnbWEiLCAibm8tY2FjaGUiKSwgcmVxdWVzdF9oZWFkZXJzWzJdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiQ2FjaGUtQ29udHJvbCIsICJuby1jYWNoZSIpLAorICAgICAgICAgICAgcmVxdWVzdF9oZWFkZXJzWzNdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiVXBncmFkZSIsICJ3ZWJzb2NrZXQiKSwgcmVxdWVzdF9oZWFkZXJzWzRdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiU2VjLVdlYlNvY2tldC1FeHRlbnNpb25zIiwgIiIpLAorICAgICAgICAgICAgcmVxdWVzdF9oZWFkZXJzWzVdKTsKKyAgRVhQRUNUX0VRKEhlYWRlcktleVZhbHVlUGFpcigiU2VjLVdlYlNvY2tldC1WZXJzaW9uIiwgIjEzIiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbNl0pOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJPcmlnaW4iLCAiaHR0cDovL2xvY2FsaG9zdCIpLAorICAgICAgICAgICAgcmVxdWVzdF9oZWFkZXJzWzddKTsKKyAgRVhQRUNUX0VRKCJTZWMtV2ViU29ja2V0LUtleSIsIHJlcXVlc3RfaGVhZGVyc1s4XS5rZXkpOworICBFWFBFQ1RfRVEoSGVhZGVyS2V5VmFsdWVQYWlyKCJTZWMtV2ViU29ja2V0LVByb3RvY29sIiwgImNoYXQsc3VwZXJjaGF0IiksCisgICAgICAgICAgICByZXF1ZXN0X2hlYWRlcnNbOV0pOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tWYWxpZFJlc3BvbnNlQ29kZSkgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiIKKyAgICAgICJcclxuIjsKKworICBzdGQ6OnN0cmluZyB0cmFuc2Zvcm1lZF9oZWFkZXJzID0gbmV0OjpIdHRwVXRpbDo6QXNzZW1ibGVSYXdIZWFkZXJzKAorICAgICAgcmVzcG9uc2Vfb25fd2lyZSwgYXJyYXlzaXplKHJlc3BvbnNlX29uX3dpcmUpKTsKKyAgc2NvcGVkX3JlZnB0cjxuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnM+IHJlc3BvbnNlSGVhZGVycyA9CisgICAgICBuZXcgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKHRyYW5zZm9ybWVkX2hlYWRlcnMpOworICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgRVhQRUNUX1RSVUUoaGFuZHNoYWtlX2hlbHBlcl8uSXNSZXNwb25zZVZhbGlkKCpyZXNwb25zZUhlYWRlcnMsICZlcnJvcikpOworICBFWFBFQ1RfVFJVRShlcnJvci5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGVycm9yLCAiIik7Cit9CisKK1RFU1RfRihXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXJUZXN0LCBDaGVja0luVmFsaWRSZXNwb25zZUNvZGUpIHsKKyAgY2hhciByZXNwb25zZV9vbl93aXJlW10gPQorICAgICAgIkhUVFAvMS4xIDIwMCBPS1xyXG4iCisgICAgICAiVXBncmFkZTogV2ViU29ja2V0XHJcbiIKKyAgICAgICJDb25uZWN0aW9uOiBVcGdyYWRlXHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUFjY2VwdDogRWk0YXhxU2hQNzRvNm5PdG1MM2U1dVJwZWk4PVxyXG4iOworICBzdGQ6OnN0cmluZyB0cmFuc2Zvcm1lZF9oZWFkZXJzID0gbmV0OjpIdHRwVXRpbDo6QXNzZW1ibGVSYXdIZWFkZXJzKAorICAgICAgcmVzcG9uc2Vfb25fd2lyZSwgYXJyYXlzaXplKHJlc3BvbnNlX29uX3dpcmUpKTsKKyAgc2NvcGVkX3JlZnB0cjxuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnM+IHJlc3BvbnNlSGVhZGVycyA9CisgICAgICBuZXcgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKHRyYW5zZm9ybWVkX2hlYWRlcnMpOworICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgRVhQRUNUX0ZBTFNFKGhhbmRzaGFrZV9oZWxwZXJfLklzUmVzcG9uc2VWYWxpZCgqcmVzcG9uc2VIZWFkZXJzLCAmZXJyb3IpKTsKKyAgRVhQRUNUX0VRKGVycm9yLCAiSW52YWxpZCByZXNwb25zZSBjb2RlIDIwMCIpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tWYWxpZFVwZ3JhZGVIZWFkZXIpIHsKKyAgY2hhciByZXNwb25zZV9vbl93aXJlW10gPQorICAgICAgIkhUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzXHJcbiIKKyAgICAgICJVcGdyYWRlOiBXZWJTb2NrZXRcclxuIgorICAgICAgIkNvbm5lY3Rpb246IFVwZ3JhZGVcclxuIgorICAgICAgIlNlYy1XZWJTb2NrZXQtQWNjZXB0OlxyXG4iOworICBzdGQ6OnN0cmluZyB0cmFuc2Zvcm1lZF9oZWFkZXJzID0gbmV0OjpIdHRwVXRpbDo6QXNzZW1ibGVSYXdIZWFkZXJzKAorICAgICAgcmVzcG9uc2Vfb25fd2lyZSwgYXJyYXlzaXplKHJlc3BvbnNlX29uX3dpcmUpKTsKKyAgc2NvcGVkX3JlZnB0cjxuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnM+IHJlc3BvbnNlSGVhZGVycyA9CisgICAgICBuZXcgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKHRyYW5zZm9ybWVkX2hlYWRlcnMpOworICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgRVhQRUNUX1RSVUUoaGFuZHNoYWtlX2hlbHBlcl8uSXNSZXNwb25zZVZhbGlkKCpyZXNwb25zZUhlYWRlcnMsICZlcnJvcikpOworICBFWFBFQ1RfVFJVRShlcnJvci5lbXB0eSgpKTsKK30KKworVEVTVF9GKFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlclRlc3QsIENoZWNrTWlzc2luZ1VwZ3JhZGVIZWFkZXIpIHsKKyAgY2hhciByZXNwb25zZV9vbl93aXJlW10gPQorICAgICAgIkhUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzXHJcbiIKKyAgICAgICJDb25uZWN0aW9uOiBVcGdyYWRlXHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUFjY2VwdDpcclxuIjsKKyAgc3RkOjpzdHJpbmcgdHJhbnNmb3JtZWRfaGVhZGVycyA9IG5ldDo6SHR0cFV0aWw6OkFzc2VtYmxlUmF3SGVhZGVycygKKyAgICAgIHJlc3BvbnNlX29uX3dpcmUsIGFycmF5c2l6ZShyZXNwb25zZV9vbl93aXJlKSk7CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzPiByZXNwb25zZUhlYWRlcnMgPQorICAgICAgbmV3IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyh0cmFuc2Zvcm1lZF9oZWFkZXJzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIEVYUEVDVF9GQUxTRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9FUShlcnJvciwgIidVcGdyYWRlJyBoZWFkZXIgaXMgbWlzc2luZyIpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tNdWx0aXBsZVVwZ3JhZGVIZWFkZXJzKSB7CisgIGNoYXIgcmVzcG9uc2Vfb25fd2lyZVtdID0KKyAgICAgICJIVFRQLzEuMSAxMDEgU3dpdGNoaW5nIFByb3RvY29sc1xyXG4iCisgICAgICAiVXBncmFkZTogV2ViU29ja2V0XHJcbiIKKyAgICAgICJVcGdyYWRlOiBIeXBlclNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiI7CisgIHN0ZDo6c3RyaW5nIHRyYW5zZm9ybWVkX2hlYWRlcnMgPSBuZXQ6Okh0dHBVdGlsOjpBc3NlbWJsZVJhd0hlYWRlcnMoCisgICAgICByZXNwb25zZV9vbl93aXJlLCBhcnJheXNpemUocmVzcG9uc2Vfb25fd2lyZSkpOworICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycz4gcmVzcG9uc2VIZWFkZXJzID0KKyAgICAgIG5ldyBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnModHJhbnNmb3JtZWRfaGVhZGVycyk7CisgIHN0ZDo6c3RyaW5nIGVycm9yOworICBFWFBFQ1RfRkFMU0UoaGFuZHNoYWtlX2hlbHBlcl8uSXNSZXNwb25zZVZhbGlkKCpyZXNwb25zZUhlYWRlcnMsICZlcnJvcikpOworICBFWFBFQ1RfRVEoZXJyb3IsCisgICAgICAgICAgICAiJ1VwZ3JhZGUnIGhlYWRlciBtdXN0IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYSByZXNwb25zZSIpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tWYWxpZFNlY1dlYlNvY2tldEFjY2VwdCkgeworICAvLyBUbyB2ZXJpZnkgU2VjLVdlYlNvY2tldC1BY2NlcHQgdmFsdWVzIGZvciB0ZXN0aW5nLCBweXRob24gd2FzIHVzZWQuCisgIC8vICBJbiBbMV06IGltcG9ydCBzdHJ1Y3QKKyAgLy8gIEluIFsyXTogaW1wb3J0IGhhc2hsaWIKKyAgLy8gIEluIFszXTogaW1wb3J0IGJhc2U2NAorICAvLyAgSW4gWzRdOiBtID0gaGFzaGxpYi5zaGExKCkKKyAgLy8gIEluIFs1XTogbS51cGRhdGUoc3RydWN0LnBhY2soJ0knLCAwKSArCisgIC8vICBiIjI1OEVBRkE1LUU5MTQtNDdEQS05NUNBLUM1QUIwREM4NUIxMSIpCisgIC8vICBJbiBbNl06IGJhc2U2NC5iNjRlbmNvZGUobS5kaWdlc3QoKSkKKyAgLy8gIE91dFs2XTogJzdkVUZIMjNxQjJTRFNHS0Y2a3p0azYrRk1JUT0nCisKKyAgY2hhciByZXNwb25zZV9vbl93aXJlW10gPQorICAgICAgIkhUVFAvMS4xIDEwMSBTd2l0Y2hpbmcgUHJvdG9jb2xzXHJcbiIKKyAgICAgICJVcGdyYWRlOiBXZWJTb2NrZXRcclxuIgorICAgICAgIkNvbm5lY3Rpb246IFVwZ3JhZGVcclxuIgorICAgICAgIlNlYy1XZWJTb2NrZXQtQWNjZXB0OjdkVUZIMjNxQjJTRFNHS0Y2a3p0azYrRk1JUT1cclxuIjsKKworICBzdGQ6OnN0cmluZyBoYW5kc2hha2VfcmVxdWVzdDsKKyAgR1VSTCBsb2NhbGhvc3Rfd2Vic29ja2V0X2VuZHBvaW50KCJ3czovL2xvY2FsaG9zdDo0NTQxL2FiYz9vbmU9MSZ0d289MiIpOworICBoYW5kc2hha2VfaGVscGVyXy5HZW5lcmF0ZUhhbmRzaGFrZVJlcXVlc3QobG9jYWxob3N0X3dlYnNvY2tldF9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0Iiwgc3ViX3Byb3RvY29sc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZHNoYWtlX3JlcXVlc3QpOworCisgIHN0ZDo6c3RyaW5nIHRyYW5zZm9ybWVkX2hlYWRlcnMgPSBuZXQ6Okh0dHBVdGlsOjpBc3NlbWJsZVJhd0hlYWRlcnMoCisgICAgICByZXNwb25zZV9vbl93aXJlLCBhcnJheXNpemUocmVzcG9uc2Vfb25fd2lyZSkpOworICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycz4gcmVzcG9uc2VIZWFkZXJzID0KKyAgICAgIG5ldyBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnModHJhbnNmb3JtZWRfaGVhZGVycyk7CisgIHN0ZDo6c3RyaW5nIGVycm9yOworICBFWFBFQ1RfVFJVRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9UUlVFKGVycm9yLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZXJyb3IsICIiKTsKK30KKworVEVTVF9GKFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlclRlc3QsIENoZWNrTWlzc2luZ1NlY1dlYlNvY2tldEFjY2VwdCkgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iOworICBzdGQ6OnN0cmluZyB0cmFuc2Zvcm1lZF9oZWFkZXJzID0gbmV0OjpIdHRwVXRpbDo6QXNzZW1ibGVSYXdIZWFkZXJzKAorICAgICAgcmVzcG9uc2Vfb25fd2lyZSwgYXJyYXlzaXplKHJlc3BvbnNlX29uX3dpcmUpKTsKKyAgc2NvcGVkX3JlZnB0cjxuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnM+IHJlc3BvbnNlSGVhZGVycyA9CisgICAgICBuZXcgbmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzKHRyYW5zZm9ybWVkX2hlYWRlcnMpOworICBzdGQ6OnN0cmluZyBlcnJvcjsKKyAgRVhQRUNUX0ZBTFNFKGhhbmRzaGFrZV9oZWxwZXJfLklzUmVzcG9uc2VWYWxpZCgqcmVzcG9uc2VIZWFkZXJzLCAmZXJyb3IpKTsKKyAgRVhQRUNUX0VRKGVycm9yLCAiJ1NlYy1XZWJTb2NrZXQtQWNjZXB0JyBoZWFkZXIgaXMgbWlzc2luZyIpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tNdWx0aXBsZVNlY1dlYlNvY2tldEFjY2VwdCkgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUFjY2VwdDpcclxuIjsKKyAgc3RkOjpzdHJpbmcgdHJhbnNmb3JtZWRfaGVhZGVycyA9IG5ldDo6SHR0cFV0aWw6OkFzc2VtYmxlUmF3SGVhZGVycygKKyAgICAgIHJlc3BvbnNlX29uX3dpcmUsIGFycmF5c2l6ZShyZXNwb25zZV9vbl93aXJlKSk7CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzPiByZXNwb25zZUhlYWRlcnMgPQorICAgICAgbmV3IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyh0cmFuc2Zvcm1lZF9oZWFkZXJzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIEVYUEVDVF9GQUxTRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9FUShlcnJvciwKKyAgICAgICAgICAgICInU2VjLVdlYlNvY2tldC1BY2NlcHQnIGhlYWRlciBtdXN0IG5vdCBhcHBlYXIgbW9yZSB0aGFuIG9uY2UgaW4gYSAiCisgICAgICAgICAgICAicmVzcG9uc2UiKTsKK30KKworVEVTVF9GKFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlclRlc3QsIENoZWNrVmFsaWRDb25uZWN0aW9uKSB7CisgIGNoYXIgcmVzcG9uc2Vfb25fd2lyZVtdID0KKyAgICAgICJIVFRQLzEuMSAxMDEgU3dpdGNoaW5nIFByb3RvY29sc1xyXG4iCisgICAgICAiVXBncmFkZTogV2ViU29ja2V0XHJcbiIKKyAgICAgICJDb25uZWN0aW9uOiBVcGdyYWRlXHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUFjY2VwdDpcclxuIjsKKyAgc3RkOjpzdHJpbmcgdHJhbnNmb3JtZWRfaGVhZGVycyA9IG5ldDo6SHR0cFV0aWw6OkFzc2VtYmxlUmF3SGVhZGVycygKKyAgICAgIHJlc3BvbnNlX29uX3dpcmUsIGFycmF5c2l6ZShyZXNwb25zZV9vbl93aXJlKSk7CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzPiByZXNwb25zZUhlYWRlcnMgPQorICAgICAgbmV3IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyh0cmFuc2Zvcm1lZF9oZWFkZXJzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIEVYUEVDVF9UUlVFKGhhbmRzaGFrZV9oZWxwZXJfLklzUmVzcG9uc2VWYWxpZCgqcmVzcG9uc2VIZWFkZXJzLCAmZXJyb3IpKTsKKyAgRVhQRUNUX1RSVUUoZXJyb3IuZW1wdHkoKSk7Cit9CisKK1RFU1RfRihXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXJUZXN0LCBDaGVja01pc3NpbmdDb25uZWN0aW9uSGVhZGVyKSB7CisgIGNoYXIgcmVzcG9uc2Vfb25fd2lyZVtdID0KKyAgICAgICJIVFRQLzEuMSAxMDEgU3dpdGNoaW5nIFByb3RvY29sc1xyXG4iCisgICAgICAiVXBncmFkZTogV2ViU29ja2V0XHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUFjY2VwdDpcclxuIjsKKyAgc3RkOjpzdHJpbmcgdHJhbnNmb3JtZWRfaGVhZGVycyA9IG5ldDo6SHR0cFV0aWw6OkFzc2VtYmxlUmF3SGVhZGVycygKKyAgICAgIHJlc3BvbnNlX29uX3dpcmUsIGFycmF5c2l6ZShyZXNwb25zZV9vbl93aXJlKSk7CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzPiByZXNwb25zZUhlYWRlcnMgPQorICAgICAgbmV3IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyh0cmFuc2Zvcm1lZF9oZWFkZXJzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIEVYUEVDVF9GQUxTRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9FUShlcnJvciwgIidDb25uZWN0aW9uJyBoZWFkZXIgaXMgbWlzc2luZyIpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tWYWxpZEludmFsaWRTdWJwcm90b2NvbCkgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LVByb3RvY29sOmNoYXRcclxuIjsKKyAgc3RkOjpzdHJpbmcgdHJhbnNmb3JtZWRfaGVhZGVycyA9IG5ldDo6SHR0cFV0aWw6OkFzc2VtYmxlUmF3SGVhZGVycygKKyAgICAgIHJlc3BvbnNlX29uX3dpcmUsIGFycmF5c2l6ZShyZXNwb25zZV9vbl93aXJlKSk7CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzPiByZXNwb25zZUhlYWRlcnMgPQorICAgICAgbmV3IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyh0cmFuc2Zvcm1lZF9oZWFkZXJzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIEVYUEVDVF9GQUxTRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9GQUxTRShlcnJvci5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGVycm9yLAorICAgICAgICAgICAgIlJlc3BvbnNlIG11c3Qgbm90IGluY2x1ZGUgJ1NlYy1XZWJTb2NrZXQtUHJvdG9jb2wnIGhlYWRlciBpZiBub3QgIgorICAgICAgICAgICAgInByZXNlbnQgaW4gcmVxdWVzdDogY2hhdCIpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tWYWxpZEludmFsaWREaWZmZXJlbnRTdWJwcm90b2NvbCkgeworICBzdWJfcHJvdG9jb2xzXy5wdXNoX2JhY2soInN1cGVyY2hhdCIpOworCisgIHN0ZDo6c3RyaW5nIGhhbmRzaGFrZV9yZXF1ZXN0OworICBHVVJMIGxvY2FsaG9zdF93ZWJzb2NrZXRfZW5kcG9pbnQoIndzOi8vbG9jYWxob3N0LyIpOworICBoYW5kc2hha2VfaGVscGVyXy5HZW5lcmF0ZUhhbmRzaGFrZVJlcXVlc3QobG9jYWxob3N0X3dlYnNvY2tldF9lbmRwb2ludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vbG9jYWxob3N0Iiwgc3ViX3Byb3RvY29sc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaGFuZHNoYWtlX3JlcXVlc3QpOworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LVByb3RvY29sOmNoYXRcclxuIjsKKyAgc3RkOjpzdHJpbmcgdHJhbnNmb3JtZWRfaGVhZGVycyA9IG5ldDo6SHR0cFV0aWw6OkFzc2VtYmxlUmF3SGVhZGVycygKKyAgICAgIHJlc3BvbnNlX29uX3dpcmUsIGFycmF5c2l6ZShyZXNwb25zZV9vbl93aXJlKSk7CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzPiByZXNwb25zZUhlYWRlcnMgPQorICAgICAgbmV3IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyh0cmFuc2Zvcm1lZF9oZWFkZXJzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIEVYUEVDVF9GQUxTRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9GQUxTRShlcnJvci5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGVycm9yLCAiSW5jb3JyZWN0ICdTZWMtV2ViU29ja2V0LUFjY2VwdCcgaGVhZGVyIHZhbHVlIik7Cit9CisKK1RFU1RfRihXZWJTb2NrZXRIYW5kc2hha2VIZWxwZXJUZXN0LCBDaGVja1N1YnByb3RvY29sSGVhZGVySXNPcHRpb25hbCkgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiI7CisgIHN0ZDo6c3RyaW5nIHRyYW5zZm9ybWVkX2hlYWRlcnMgPSBuZXQ6Okh0dHBVdGlsOjpBc3NlbWJsZVJhd0hlYWRlcnMoCisgICAgICByZXNwb25zZV9vbl93aXJlLCBhcnJheXNpemUocmVzcG9uc2Vfb25fd2lyZSkpOworICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycz4gcmVzcG9uc2VIZWFkZXJzID0KKyAgICAgIG5ldyBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnModHJhbnNmb3JtZWRfaGVhZGVycyk7CisgIHN0ZDo6c3RyaW5nIGVycm9yOworICBFWFBFQ1RfVFJVRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9UUlVFKGVycm9yLmVtcHR5KCkpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tWYWxpZEV4dGVuc2lvbkhlYWRlcikgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnM6bXV4XHJcbiI7CisgIHN0ZDo6c3RyaW5nIHRyYW5zZm9ybWVkX2hlYWRlcnMgPSBuZXQ6Okh0dHBVdGlsOjpBc3NlbWJsZVJhd0hlYWRlcnMoCisgICAgICByZXNwb25zZV9vbl93aXJlLCBhcnJheXNpemUocmVzcG9uc2Vfb25fd2lyZSkpOworICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycz4gcmVzcG9uc2VIZWFkZXJzID0KKyAgICAgIG5ldyBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnModHJhbnNmb3JtZWRfaGVhZGVycyk7CisgIHN0ZDo6c3RyaW5nIGVycm9yOworICBFWFBFQ1RfRkFMU0UoaGFuZHNoYWtlX2hlbHBlcl8uSXNSZXNwb25zZVZhbGlkKCpyZXNwb25zZUhlYWRlcnMsICZlcnJvcikpOworICBFWFBFQ1RfRVEoZXJyb3IsICJDb2JhbHQgZG9lcyBub3Qgc3VwcG9ydCBhbnkgd2Vic29ja2V0IGV4dGVuc2lvbnMiKTsKK30KKworVEVTVF9GKFdlYlNvY2tldEhhbmRzaGFrZUhlbHBlclRlc3QsIENoZWNrRXh0ZW5zaW9uSGVhZGVySXNPcHRpb25hbCkgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiI7CisgIHN0ZDo6c3RyaW5nIHRyYW5zZm9ybWVkX2hlYWRlcnMgPSBuZXQ6Okh0dHBVdGlsOjpBc3NlbWJsZVJhd0hlYWRlcnMoCisgICAgICByZXNwb25zZV9vbl93aXJlLCBhcnJheXNpemUocmVzcG9uc2Vfb25fd2lyZSkpOworICBzY29wZWRfcmVmcHRyPG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycz4gcmVzcG9uc2VIZWFkZXJzID0KKyAgICAgIG5ldyBuZXQ6Okh0dHBSZXNwb25zZUhlYWRlcnModHJhbnNmb3JtZWRfaGVhZGVycyk7CisgIHN0ZDo6c3RyaW5nIGVycm9yOworICBFWFBFQ1RfVFJVRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9UUlVFKGVycm9yLmVtcHR5KCkpOworfQorCitURVNUX0YoV2ViU29ja2V0SGFuZHNoYWtlSGVscGVyVGVzdCwgQ2hlY2tNdWx0aXBsZUV4dGVuc2lvbkhlYWRlcnNBcmVPSykgeworICBjaGFyIHJlc3BvbnNlX29uX3dpcmVbXSA9CisgICAgICAiSFRUUC8xLjEgMTAxIFN3aXRjaGluZyBQcm90b2NvbHNcclxuIgorICAgICAgIlVwZ3JhZGU6IFdlYlNvY2tldFxyXG4iCisgICAgICAiQ29ubmVjdGlvbjogVXBncmFkZVxyXG4iCisgICAgICAiU2VjLVdlYlNvY2tldC1BY2NlcHQ6XHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnM6bXV4XHJcbiIKKyAgICAgICJTZWMtV2ViU29ja2V0LUV4dGVuc2lvbnM6ZGVtdXhcclxuIjsKKyAgc3RkOjpzdHJpbmcgdHJhbnNmb3JtZWRfaGVhZGVycyA9IG5ldDo6SHR0cFV0aWw6OkFzc2VtYmxlUmF3SGVhZGVycygKKyAgICAgIHJlc3BvbnNlX29uX3dpcmUsIGFycmF5c2l6ZShyZXNwb25zZV9vbl93aXJlKSk7CisgIHNjb3BlZF9yZWZwdHI8bmV0OjpIdHRwUmVzcG9uc2VIZWFkZXJzPiByZXNwb25zZUhlYWRlcnMgPQorICAgICAgbmV3IG5ldDo6SHR0cFJlc3BvbnNlSGVhZGVycyh0cmFuc2Zvcm1lZF9oZWFkZXJzKTsKKyAgc3RkOjpzdHJpbmcgZXJyb3I7CisgIEVYUEVDVF9GQUxTRShoYW5kc2hha2VfaGVscGVyXy5Jc1Jlc3BvbnNlVmFsaWQoKnJlc3BvbnNlSGVhZGVycywgJmVycm9yKSk7CisgIEVYUEVDVF9FUShlcnJvciwgIkNvYmFsdCBkb2VzIG5vdCBzdXBwb3J0IGFueSB3ZWJzb2NrZXQgZXh0ZW5zaW9ucyIpOworfQorCit9ICAvLyBuYW1lc3BhY2Ugd2Vic29ja2V0Cit9ICAvLyBuYW1lc3BhY2UgY29iYWx0CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJfc29ja2V0X3Rlc3QuY2MKaW5kZXggZjFkYTUzZC4uZmUyYWRmMCAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYl9zb2NrZXRfdGVzdC5jYwpAQCAtMSwxNyArMSwxNiBAQAotLyogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgImNvYmFsdC93ZWJzb2NrZXQvd2ViX3NvY2tldC5oIgogCkBAIC0yMSw2ICsyMCw3IEBACiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX2V4Y2VwdGlvbi5oIgogI2luY2x1ZGUgImNvYmFsdC9kb20vZG9tX3NldHRpbmdzLmgiCisjaW5jbHVkZSAiY29iYWx0L25ldHdvcmsvbmV0d29ya19tb2R1bGUuaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3NjcmlwdF9leGNlcHRpb24uaCIKICNpbmNsdWRlICJjb2JhbHQvc2NyaXB0L3Rlc3RpbmcvbW9ja19leGNlcHRpb25fc3RhdGUuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKQEAgLTM3LDEyICszNywxNSBAQAogIHB1YmxpYzoKICAgRmFrZVNldHRpbmdzKCkKICAgICAgIDogZG9tOjpET01TZXR0aW5ncygwLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLCBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpLAotICAgICAgICBiYXNlXygiaHR0cHM6Ly9leGFtcGxlLmNvbSIpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCksCisgICAgICAgIGJhc2VfKCJodHRwczovL2V4YW1wbGUuY29tIikgeworICAgIHRoaXMtPnNldF9uZXR3b3JrX21vZHVsZSgmbmV0d29ya19tb2R1bGVfKTsKKyAgfQogICBjb25zdCBHVVJMJiBiYXNlX3VybCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGJhc2VfOyB9CiAKICAgLy8gcHVibGljIG1lbWJlcnMsIHNvIHRoYXQgdGhleSdyZSBlYXNpZXIgZm9yIHRlc3RpbmcuCiAgIEdVUkwgYmFzZV87CisgIGNvYmFsdDo6bmV0d29yazo6TmV0d29ya01vZHVsZSBuZXR3b3JrX21vZHVsZV87CiB9OwogCiBjbGFzcyBXZWJTb2NrZXRUZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJzb2NrZXQuZ3lwIGIvc3JjL2NvYmFsdC93ZWJzb2NrZXQvd2Vic29ja2V0Lmd5cAppbmRleCAzOWE3Mjc0Li5lMDIwZTM3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3dlYnNvY2tldC93ZWJzb2NrZXQuZ3lwCisrKyBiL3NyYy9jb2JhbHQvd2Vic29ja2V0L3dlYnNvY2tldC5neXAKQEAgLTIzLDYgKzIzLDggQEAKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnd2ViX3NvY2tldC5jYycsCiAgICAgICAgICd3ZWJfc29ja2V0LmgnLAorICAgICAgICAnd2ViX3NvY2tldF9oYW5kc2hha2VfaGVscGVyLmgnLAorICAgICAgICAnd2ViX3NvY2tldF9oYW5kc2hha2VfaGVscGVyLmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCkBAIC0zNiwxMCArMzgsMTIgQEAKICAgICAgICd0eXBlJzogJzwoZ3Rlc3RfdGFyZ2V0X3R5cGUpJywKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnd2ViX3NvY2tldF90ZXN0LmNjJywKKyAgICAgICAgJ3dlYl9zb2NrZXRfaGFuZHNoYWtlX2hlbHBlcl90ZXN0LmNjJywKICAgICAgIF0sCiAgICAgICAnZGVwZW5kZW5jaWVzJzogWwogICAgICAgICAnd2Vic29ja2V0JywKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAorICAgICAgICAnPChERVBUSCkvY29iYWx0L3Rlc3QvdGVzdC5neXA6cnVuX2FsbF91bml0dGVzdHMnLAorICAgICAgICAnPChERVBUSCkvZ29vZ2xldXJsL2dvb2dsZXVybC5neXA6Z29vZ2xldXJsJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ3Rlc3QuZ3lwOmd0ZXN0JywKICAgICAgIF0sCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci9YTUxIdHRwUmVxdWVzdC5pZGwgYi9zcmMvY29iYWx0L3hoci9YTUxIdHRwUmVxdWVzdC5pZGwKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZWU4YjEuLjAwMDAwMDAKLS0tIGEvc3JjL2NvYmFsdC94aHIvWE1MSHR0cFJlcXVlc3QuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvV0QtWE1MSHR0cFJlcXVlc3QtMjAxNDAxMzAvI3htbGh0dHByZXF1ZXN0Ci0KLVsKLSAgICBDb25zdHJ1Y3RvciwKLSAgICBDb25zdHJ1Y3RvckNhbGxXaXRoPUVudmlyb25tZW50U2V0dGluZ3MsCi0gICAgQWRkT3BhcXVlUm9vdHM9KCJ1cGxvYWRfb3JfbnVsbCIsInJlc3BvbnNlX2FycmF5X2J1ZmZlcl9vcl9udWxsIiksCi1dIGludGVyZmFjZSBYTUxIdHRwUmVxdWVzdCA6IFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgewotICAgIC8vIGV2ZW50IGhhbmRsZXIKLSAgICBhdHRyaWJ1dGUgRXZlbnRIYW5kbGVyIG9ucmVhZHlzdGF0ZWNoYW5nZTsKLQotICAgIC8vIHN0YXRlcwotICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IFVOU0VOVCA9IDA7Ci0gICAgY29uc3QgdW5zaWduZWQgc2hvcnQgT1BFTkVEID0gMTsKLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBIRUFERVJTX1JFQ0VJVkVEID0gMjsKLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBMT0FESU5HID0gMzsKLSAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBET05FID0gNDsKLSAgICByZWFkb25seSBhdHRyaWJ1dGUgdW5zaWduZWQgc2hvcnQgcmVhZHlTdGF0ZTsKLQotICAgIC8vIHJlcXVlc3QKLSAgICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIG9wZW4oRE9NU3RyaW5nIG1ldGhvZCwgRE9NU3RyaW5nIHVybCk7Ci0gICAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBvcGVuKERPTVN0cmluZyBtZXRob2QsIERPTVN0cmluZyB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2xlYW4gYXN5bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIERPTVN0cmluZz8gdXNlcm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsIERPTVN0cmluZz8gcGFzc3dvcmQpOwotICAgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2V0UmVxdWVzdEhlYWRlcihET01TdHJpbmcgaGVhZGVyLCBET01TdHJpbmcgdmFsdWUpOwotICAgIGF0dHJpYnV0ZSB1bnNpZ25lZCBsb25nIHRpbWVvdXQ7Ci0gICAgW1JhaXNlc0V4Y2VwdGlvbj1TZXR0ZXJdIGF0dHJpYnV0ZSBib29sZWFuIHdpdGhDcmVkZW50aWFsczsKLSAgICByZWFkb25seSBhdHRyaWJ1dGUgWE1MSHR0cFJlcXVlc3RVcGxvYWQgdXBsb2FkOwotICAgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgc2VuZChvcHRpb25hbCAoRE9NU3RyaW5nIG9yIEFycmF5QnVmZmVyVmlldyk/IHJlcXVlc3RfYm9keSk7Ci0gICAgLy8gdm9pZCBzZW5kKG9wdGlvbmFsIChBcnJheUJ1ZmZlclZpZXcgb3IgQmxvYiBvciBEb2N1bWVudCBvciBET01TdHJpbmcgb3IgRm9ybURhdGEpPyBkYXRhKTsKLSAgICB2b2lkIGFib3J0KCk7Ci0KLSAgICAvLyByZXNwb25zZQotICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCBzdGF0dXM7Ci0gICAgcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyBzdGF0dXNUZXh0OwotICAgIERPTVN0cmluZz8gZ2V0UmVzcG9uc2VIZWFkZXIoRE9NU3RyaW5nIGhlYWRlcik7Ci0gICAgRE9NU3RyaW5nIGdldEFsbFJlc3BvbnNlSGVhZGVycygpOwotICAgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgb3ZlcnJpZGVNaW1lVHlwZShET01TdHJpbmcgbWltZV90eXBlKTsKLSAgICBbUmFpc2VzRXhjZXB0aW9uPVNldHRlcl0gYXR0cmlidXRlIERPTVN0cmluZyByZXNwb25zZVR5cGU7Ci0gICAgLy8gVE9ETzogVXNlIGEgdW5pb24gdHlwZSBmb3IgYWxsIHRoZSBwb3NzaWJsZSByZXNwb25zZSB0eXBlcy4KLSAgICBbUmFpc2VzRXhjZXB0aW9uXSByZWFkb25seSBhdHRyaWJ1dGUgKERPTVN0cmluZyBvciBBcnJheUJ1ZmZlcikgcmVzcG9uc2U7Ci0gICAgW1JhaXNlc0V4Y2VwdGlvbl0gcmVhZG9ubHkgYXR0cmlidXRlIERPTVN0cmluZyByZXNwb25zZVRleHQ7Ci0gICAgW1JhaXNlc0V4Y2VwdGlvbl0gcmVhZG9ubHkgYXR0cmlidXRlIERvY3VtZW50PyByZXNwb25zZVhNTDsKLQotICAgIC8vIE5vdCBwYXJ0IG9mIHRoZSBzcGVjLiBFbmFibGUgdmVyYm9zZSBYSFIgbG9nZ2luZy4KLSAgICBzdGF0aWMgYXR0cmlidXRlIGJvb2xlYW4gdmVyYm9zZTsKLX07Ci0KLS8vIFRPRE86IFRoZSBJREwgZGVmaW5lcyBFdmVudEhhbmRsZXIgYXMgYSBudWxsYWJsZSBjYWxsYmFjayBmdW5jdGlvbi4gRGVmaW5lIGl0Ci0vLyBhcyBhIG51bGxhYmxlIEV2ZW50TGlzdGVuZXIgZm9yIG5vdyB1bnRpbCB3ZSBjYW4gZG8gc29tZSByZWZhY3RvcmluZyB0bwotLy8gYWNjZXB0IGJvdGggaW4gdGhlIEV2ZW50VGFyZ2V0IGltcGxlbWVudGF0aW9uLgotdHlwZWRlZiBFdmVudExpc3RlbmVyPyBFdmVudEhhbmRsZXI7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci9YTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0LmlkbCBiL3NyYy9jb2JhbHQveGhyL1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQuaWRsCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMTA1ZTk2Li4wMDAwMDAwCi0tLSBhL3NyYy9jb2JhbHQveGhyL1hNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQuaWRsCisrKyAvZGV2L251bGwKQEAgLTEsMjcgKzAsMCBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KLQotLy8gaHR0cHM6Ly93d3cudzMub3JnL1RSLzIwMTQvV0QtWE1MSHR0cFJlcXVlc3QtMjAxNDAxMzAvI3htbGh0dHByZXF1ZXN0ZXZlbnR0YXJnZXQKLQotaW50ZXJmYWNlIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQgOiBFdmVudFRhcmdldCB7Ci0gICAgYXR0cmlidXRlIEV2ZW50TGlzdGVuZXI/IG9uYWJvcnQ7Ci0gICAgYXR0cmlidXRlIEV2ZW50TGlzdGVuZXI/IG9uZXJyb3I7Ci0gICAgYXR0cmlidXRlIEV2ZW50TGlzdGVuZXI/IG9ubG9hZDsKLSAgICBhdHRyaWJ1dGUgRXZlbnRMaXN0ZW5lcj8gb25sb2FkZW5kOwotICAgIGF0dHJpYnV0ZSBFdmVudExpc3RlbmVyPyBvbmxvYWRzdGFydDsKLSAgICBhdHRyaWJ1dGUgRXZlbnRMaXN0ZW5lcj8gb25wcm9ncmVzczsKLSAgICBhdHRyaWJ1dGUgRXZlbnRMaXN0ZW5lcj8gb250aW1lb3V0OwotfTsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQveGhyL1hNTEh0dHBSZXF1ZXN0VXBsb2FkLmlkbCBiL3NyYy9jb2JhbHQveGhyL1hNTEh0dHBSZXF1ZXN0VXBsb2FkLmlkbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGM2NTk4NC4uMDAwMDAwMAotLS0gYS9zcmMvY29iYWx0L3hoci9YTUxIdHRwUmVxdWVzdFVwbG9hZC5pZGwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLwotCi0vLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNC9XRC1YTUxIdHRwUmVxdWVzdC0yMDE0MDEzMC8jeG1saHR0cHJlcXVlc3R1cGxvYWQKLQotaW50ZXJmYWNlIFhNTEh0dHBSZXF1ZXN0VXBsb2FkIDogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCB7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC94aHIvdGVzdGRhdGEvc2ltcGxlLXhoci9zaW1wbGUteGhyLmpzIGIvc3JjL2NvYmFsdC94aHIvdGVzdGRhdGEvc2ltcGxlLXhoci9zaW1wbGUteGhyLmpzCmluZGV4IGQ2OTQ5YmIuLjZjZTg2YWMgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQveGhyL3Rlc3RkYXRhL3NpbXBsZS14aHIvc2ltcGxlLXhoci5qcworKysgYi9zcmMvY29iYWx0L3hoci90ZXN0ZGF0YS9zaW1wbGUteGhyL3NpbXBsZS14aHIuanMKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiB2YXIgeGhyID0gbmV3IFhNTEh0dHBSZXF1ZXN0KCk7CiB4aHIub25yZWFkeXN0YXRlY2hhbmdlID0gZnVuY3Rpb24oKSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94aHIuZ3lwIGIvc3JjL2NvYmFsdC94aHIveGhyLmd5cAppbmRleCAwNmMyNGM1Li5iZjBjZGQ4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3hoci94aHIuZ3lwCisrKyBiL3NyYy9jb2JhbHQveGhyL3hoci5neXAKQEAgLTQxLDggKzQxLDggQEAKICAgICAgICAgJ3htbF9odHRwX3JlcXVlc3RfdGVzdC5jYycsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgJzwoREVQVEgpL2Jhc2UvYmFzZS5neXA6cnVuX2FsbF91bml0dGVzdHMnLAogICAgICAgICAnPChERVBUSCkvY29iYWx0L2Jhc2UvYmFzZS5neXA6YmFzZScsCisgICAgICAgICc8KERFUFRIKS9jb2JhbHQvdGVzdC90ZXN0Lmd5cDpydW5fYWxsX3VuaXR0ZXN0cycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2dtb2NrLmd5cDpnbW9jaycsCiAgICAgICAgICc8KERFUFRIKS90ZXN0aW5nL2d0ZXN0Lmd5cDpndGVzdCcsCiAgICAgICAgICd4aHInLApkaWZmIC0tZ2l0IGEvc3JjL2NvYmFsdC94aHIveGhyX3Jlc3BvbnNlX2RhdGEuY2MgYi9zcmMvY29iYWx0L3hoci94aHJfcmVzcG9uc2VfZGF0YS5jYwppbmRleCA2NDk1YmM0Li5hYzRhYjg4IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3hoci94aHJfcmVzcG9uc2VfZGF0YS5jYworKysgYi9zcmMvY29iYWx0L3hoci94aHJfcmVzcG9uc2VfZGF0YS5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQveGhyL3hocl9yZXNwb25zZV9kYXRhLmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQveGhyL3hocl9yZXNwb25zZV9kYXRhLmggYi9zcmMvY29iYWx0L3hoci94aHJfcmVzcG9uc2VfZGF0YS5oCmluZGV4IDA2YjljZjYuLmIwZWZkNjkgMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQveGhyL3hocl9yZXNwb25zZV9kYXRhLmgKKysrIGIvc3JjL2NvYmFsdC94aHIveGhyX3Jlc3BvbnNlX2RhdGEuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1hIUl9YSFJfUkVTUE9OU0VfREFUQV9IXwogI2RlZmluZSBDT0JBTFRfWEhSX1hIUl9SRVNQT05TRV9EQVRBX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94aHJfcmVzcG9uc2VfZGF0YV90ZXN0LmNjIGIvc3JjL2NvYmFsdC94aHIveGhyX3Jlc3BvbnNlX2RhdGFfdGVzdC5jYwppbmRleCBjZDdhZDhmLi5hOWJjNTc3IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3hoci94aHJfcmVzcG9uc2VfZGF0YV90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQveGhyL3hocl9yZXNwb25zZV9kYXRhX3Rlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3hoci94aHJfcmVzcG9uc2VfZGF0YS5oIgogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmNjIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdC5jYwppbmRleCA3NDAxOGRmLi4wZDg3OGM5IDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmgiCiAKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuaCBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuaAppbmRleCA4M2QyZDdmLi44ZDU4NDNjIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmgKKysrIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdC5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBDT0JBTFRfWEhSX1hNTF9IVFRQX1JFUVVFU1RfSF8KICNkZWZpbmUgQ09CQUxUX1hIUl9YTUxfSFRUUF9SRVFVRVNUX0hfCkBAIC04OCwxMCArODYsMTAgQEAKICAgICBrVGltZW91dEVycm9yLAogICB9OwogCi0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9ucmVhZHlzdGF0ZWNoYW5nZSgpIGNvbnN0IHsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbnJlYWR5c3RhdGVjaGFuZ2UoKSBjb25zdCB7CiAgICAgcmV0dXJuIEdldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpyZWFkeXN0YXRlY2hhbmdlKCkpOwogICB9Ci0gIHZvaWQgc2V0X29ucmVhZHlzdGF0ZWNoYW5nZShjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBldmVudF9saXN0ZW5lcikgeworICB2b2lkIHNldF9vbnJlYWR5c3RhdGVjaGFuZ2UoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBldmVudF9saXN0ZW5lcikgewogICAgIFNldEF0dHJpYnV0ZUV2ZW50TGlzdGVuZXIoYmFzZTo6VG9rZW5zOjpyZWFkeXN0YXRlY2hhbmdlKCksIGV2ZW50X2xpc3RlbmVyKTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmlkbCBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuaWRsCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdjMWIwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0LmlkbApAQCAtMCwwICsxLDY2IEBACisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNC9XRC1YTUxIdHRwUmVxdWVzdC0yMDE0MDEzMC8jeG1saHR0cHJlcXVlc3QKKworWworICAgIENvbnN0cnVjdG9yLAorICAgIENvbnN0cnVjdG9yQ2FsbFdpdGg9RW52aXJvbm1lbnRTZXR0aW5ncywKKyAgICBBZGRPcGFxdWVSb290cz0oInVwbG9hZF9vcl9udWxsIiwicmVzcG9uc2VfYXJyYXlfYnVmZmVyX29yX251bGwiKSwKK10gaW50ZXJmYWNlIFhNTEh0dHBSZXF1ZXN0IDogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCB7CisgICAgLy8gZXZlbnQgaGFuZGxlcgorICAgIGF0dHJpYnV0ZSBFdmVudEhhbmRsZXIgb25yZWFkeXN0YXRlY2hhbmdlOworCisgICAgLy8gc3RhdGVzCisgICAgY29uc3QgdW5zaWduZWQgc2hvcnQgVU5TRU5UID0gMDsKKyAgICBjb25zdCB1bnNpZ25lZCBzaG9ydCBPUEVORUQgPSAxOworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IEhFQURFUlNfUkVDRUlWRUQgPSAyOworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IExPQURJTkcgPSAzOworICAgIGNvbnN0IHVuc2lnbmVkIHNob3J0IERPTkUgPSA0OworICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSB1bnNpZ25lZCBzaG9ydCByZWFkeVN0YXRlOworCisgICAgLy8gcmVxdWVzdAorICAgIFtSYWlzZXNFeGNlcHRpb25dIHZvaWQgb3BlbihET01TdHJpbmcgbWV0aG9kLCBET01TdHJpbmcgdXJsKTsKKyAgICBbUmFpc2VzRXhjZXB0aW9uXSB2b2lkIG9wZW4oRE9NU3RyaW5nIG1ldGhvZCwgRE9NU3RyaW5nIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBhc3luYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgRE9NU3RyaW5nPyB1c2VybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWwgRE9NU3RyaW5nPyBwYXNzd29yZCk7CisgICAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZXRSZXF1ZXN0SGVhZGVyKERPTVN0cmluZyBoZWFkZXIsIERPTVN0cmluZyB2YWx1ZSk7CisgICAgYXR0cmlidXRlIHVuc2lnbmVkIGxvbmcgdGltZW91dDsKKyAgICBbUmFpc2VzRXhjZXB0aW9uPVNldHRlcl0gYXR0cmlidXRlIGJvb2xlYW4gd2l0aENyZWRlbnRpYWxzOworICAgIHJlYWRvbmx5IGF0dHJpYnV0ZSBYTUxIdHRwUmVxdWVzdFVwbG9hZCB1cGxvYWQ7CisgICAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBzZW5kKG9wdGlvbmFsIChET01TdHJpbmcgb3IgQXJyYXlCdWZmZXJWaWV3KT8gcmVxdWVzdF9ib2R5KTsKKyAgICAvLyB2b2lkIHNlbmQob3B0aW9uYWwgKEFycmF5QnVmZmVyVmlldyBvciBCbG9iIG9yIERvY3VtZW50IG9yIERPTVN0cmluZyBvciBGb3JtRGF0YSk/IGRhdGEpOworICAgIHZvaWQgYWJvcnQoKTsKKworICAgIC8vIHJlc3BvbnNlCisgICAgcmVhZG9ubHkgYXR0cmlidXRlIHVuc2lnbmVkIHNob3J0IHN0YXR1czsKKyAgICByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHN0YXR1c1RleHQ7CisgICAgRE9NU3RyaW5nPyBnZXRSZXNwb25zZUhlYWRlcihET01TdHJpbmcgaGVhZGVyKTsKKyAgICBET01TdHJpbmcgZ2V0QWxsUmVzcG9uc2VIZWFkZXJzKCk7CisgICAgW1JhaXNlc0V4Y2VwdGlvbl0gdm9pZCBvdmVycmlkZU1pbWVUeXBlKERPTVN0cmluZyBtaW1lX3R5cGUpOworICAgIFtSYWlzZXNFeGNlcHRpb249U2V0dGVyXSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlc3BvbnNlVHlwZTsKKyAgICAvLyBUT0RPOiBVc2UgYSB1bmlvbiB0eXBlIGZvciBhbGwgdGhlIHBvc3NpYmxlIHJlc3BvbnNlIHR5cGVzLgorICAgIFtSYWlzZXNFeGNlcHRpb25dIHJlYWRvbmx5IGF0dHJpYnV0ZSAoRE9NU3RyaW5nIG9yIEFycmF5QnVmZmVyKSByZXNwb25zZTsKKyAgICBbUmFpc2VzRXhjZXB0aW9uXSByZWFkb25seSBhdHRyaWJ1dGUgRE9NU3RyaW5nIHJlc3BvbnNlVGV4dDsKKyAgICBbUmFpc2VzRXhjZXB0aW9uXSByZWFkb25seSBhdHRyaWJ1dGUgRG9jdW1lbnQ/IHJlc3BvbnNlWE1MOworCisgICAgLy8gTm90IHBhcnQgb2YgdGhlIHNwZWMuIEVuYWJsZSB2ZXJib3NlIFhIUiBsb2dnaW5nLgorICAgIHN0YXRpYyBhdHRyaWJ1dGUgYm9vbGVhbiB2ZXJib3NlOworfTsKKworLy8gVE9ETzogVGhlIElETCBkZWZpbmVzIEV2ZW50SGFuZGxlciBhcyBhIG51bGxhYmxlIGNhbGxiYWNrIGZ1bmN0aW9uLiBEZWZpbmUgaXQKKy8vIGFzIGEgbnVsbGFibGUgRXZlbnRMaXN0ZW5lciBmb3Igbm93IHVudGlsIHdlIGNhbiBkbyBzb21lIHJlZmFjdG9yaW5nIHRvCisvLyBhY2NlcHQgYm90aCBpbiB0aGUgRXZlbnRUYXJnZXQgaW1wbGVtZW50YXRpb24uCit0eXBlZGVmIEV2ZW50TGlzdGVuZXI/IEV2ZW50SGFuZGxlcjsKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfZXZlbnRfdGFyZ2V0LmNjIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF9ldmVudF90YXJnZXQuY2MKaW5kZXggMjBiOWVlYi4uMGJkZDcxMyAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF9ldmVudF90YXJnZXQuY2MKKysrIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF9ldmVudF90YXJnZXQuY2MKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAiY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X2V2ZW50X3RhcmdldC5oIgogCkBAIC0yNCw0NiArMjIsNDYgQEAKIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6OlhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQoKSB7fQogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDo6flhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQoKSB7fQogCi1jb25zdCBkb206OkV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KgorY29uc3QgZG9tOjpFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKgogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDo6b25hYm9ydCgpIGNvbnN0IHsKLSAgcmV0dXJuIG9uYWJvcnRfbGlzdGVuZXJfID8gJm9uYWJvcnRfbGlzdGVuZXJfLnZhbHVlKCkucmVmZXJlbmNlZF9vYmplY3QoKQorICByZXR1cm4gb25hYm9ydF9saXN0ZW5lcl8gPyAmb25hYm9ydF9saXN0ZW5lcl8udmFsdWUoKS5yZWZlcmVuY2VkX3ZhbHVlKCkKICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKIH0KLWNvbnN0IGRvbTo6RXZlbnRUYXJnZXQ6OkV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqCitjb25zdCBkb206OkV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqCiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OjpvbmVycm9yKCkgY29uc3QgewotICByZXR1cm4gb25lcnJvcl9saXN0ZW5lcl8gPyAmb25lcnJvcl9saXN0ZW5lcl8udmFsdWUoKS5yZWZlcmVuY2VkX29iamVjdCgpCisgIHJldHVybiBvbmVycm9yX2xpc3RlbmVyXyA/ICZvbmVycm9yX2xpc3RlbmVyXy52YWx1ZSgpLnJlZmVyZW5jZWRfdmFsdWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOwogfQotY29uc3QgZG9tOjpFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCoKK2NvbnN0IGRvbTo6RXZlbnRUYXJnZXQ6OkV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSoKIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6Om9ubG9hZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG9ubG9hZF9saXN0ZW5lcl8gPyAmb25sb2FkX2xpc3RlbmVyXy52YWx1ZSgpLnJlZmVyZW5jZWRfb2JqZWN0KCkKKyAgcmV0dXJuIG9ubG9hZF9saXN0ZW5lcl8gPyAmb25sb2FkX2xpc3RlbmVyXy52YWx1ZSgpLnJlZmVyZW5jZWRfdmFsdWUoKQogICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7CiB9Ci1jb25zdCBkb206OkV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KgorY29uc3QgZG9tOjpFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKgogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDo6b25sb2FkZW5kKCkgY29uc3QgewotICByZXR1cm4gb25sb2FkZW5kX2xpc3RlbmVyXyA/ICZvbmxvYWRlbmRfbGlzdGVuZXJfLnZhbHVlKCkucmVmZXJlbmNlZF9vYmplY3QoKQorICByZXR1cm4gb25sb2FkZW5kX2xpc3RlbmVyXyA/ICZvbmxvYWRlbmRfbGlzdGVuZXJfLnZhbHVlKCkucmVmZXJlbmNlZF92YWx1ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKIH0KLWNvbnN0IGRvbTo6RXZlbnRUYXJnZXQ6OkV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqCitjb25zdCBkb206OkV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqCiBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OjpvbmxvYWRzdGFydCgpIGNvbnN0IHsKICAgcmV0dXJuIG9ubG9hZHN0YXJ0X2xpc3RlbmVyXwotICAgICAgICAgICAgID8gJm9ubG9hZHN0YXJ0X2xpc3RlbmVyXy52YWx1ZSgpLnJlZmVyZW5jZWRfb2JqZWN0KCkKKyAgICAgICAgICAgICA/ICZvbmxvYWRzdGFydF9saXN0ZW5lcl8udmFsdWUoKS5yZWZlcmVuY2VkX3ZhbHVlKCkKICAgICAgICAgICAgICA6IE5VTEw7CiB9Ci1jb25zdCBkb206OkV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KgorY29uc3QgZG9tOjpFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKgogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDo6b25wcm9ncmVzcygpIGNvbnN0IHsKICAgcmV0dXJuIG9ucHJvZ3Jlc3NfbGlzdGVuZXJfCi0gICAgICAgICAgICAgPyAmb25wcm9ncmVzc19saXN0ZW5lcl8udmFsdWUoKS5yZWZlcmVuY2VkX29iamVjdCgpCisgICAgICAgICAgICAgPyAmb25wcm9ncmVzc19saXN0ZW5lcl8udmFsdWUoKS5yZWZlcmVuY2VkX3ZhbHVlKCkKICAgICAgICAgICAgICA6IE5VTEw7CiB9Ci1jb25zdCBkb206OkV2ZW50VGFyZ2V0OjpFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KgorY29uc3QgZG9tOjpFdmVudFRhcmdldDo6RXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKgogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDo6b250aW1lb3V0KCkgY29uc3QgewotICByZXR1cm4gb250aW1lb3V0X2xpc3RlbmVyXyA/ICZvbnRpbWVvdXRfbGlzdGVuZXJfLnZhbHVlKCkucmVmZXJlbmNlZF9vYmplY3QoKQorICByZXR1cm4gb250aW1lb3V0X2xpc3RlbmVyXyA/ICZvbnRpbWVvdXRfbGlzdGVuZXJfLnZhbHVlKCkucmVmZXJlbmNlZF92YWx1ZSgpCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTDsKIH0KIAogdm9pZCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OjpzZXRfb25hYm9ydCgKLSAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpIHsKICAgaWYgKGxpc3RlbmVyLklzTnVsbCgpKSB7CiAgICAgb25hYm9ydF9saXN0ZW5lcl8gPSBiYXNlOjpudWxsb3B0OwogICB9IGVsc2UgewpAQCAtNzIsNyArNzAsNyBAQAogICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6YWJvcnQoKSwgbGlzdGVuZXIpOwogfQogdm9pZCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OjpzZXRfb25lcnJvcigKLSAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpIHsKICAgaWYgKGxpc3RlbmVyLklzTnVsbCgpKSB7CiAgICAgb25lcnJvcl9saXN0ZW5lcl8gPSBiYXNlOjpudWxsb3B0OwogICB9IGVsc2UgewpAQCAtODEsNyArNzksNyBAQAogICBTZXRBdHRyaWJ1dGVFdmVudExpc3RlbmVyKGJhc2U6OlRva2Vuczo6ZXJyb3IoKSwgbGlzdGVuZXIpOwogfQogdm9pZCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OjpzZXRfb25sb2FkKAotICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKSB7CisgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lcikgewogICBpZiAobGlzdGVuZXIuSXNOdWxsKCkpIHsKICAgICBvbmxvYWRfbGlzdGVuZXJfID0gYmFzZTo6bnVsbG9wdDsKICAgfSBlbHNlIHsKQEAgLTkwLDcgKzg4LDcgQEAKICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmxvYWQoKSwgbGlzdGVuZXIpOwogfQogdm9pZCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OjpzZXRfb25sb2FkZW5kKAotICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKSB7CisgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lcikgewogICBpZiAobGlzdGVuZXIuSXNOdWxsKCkpIHsKICAgICBvbmxvYWRlbmRfbGlzdGVuZXJfID0gYmFzZTo6bnVsbG9wdDsKICAgfSBlbHNlIHsKQEAgLTk5LDcgKzk3LDcgQEAKICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmxvYWRlbmQoKSwgbGlzdGVuZXIpOwogfQogdm9pZCBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0OjpzZXRfb25sb2Fkc3RhcnQoCi0gICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgbGlzdGVuZXIpIHsKKyAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKSB7CiAgIGlmIChsaXN0ZW5lci5Jc051bGwoKSkgewogICAgIG9ubG9hZHN0YXJ0X2xpc3RlbmVyXyA9IGJhc2U6Om51bGxvcHQ7CiAgIH0gZWxzZSB7CkBAIC0xMDgsNyArMTA2LDcgQEAKICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OmxvYWRzdGFydCgpLCBsaXN0ZW5lcik7CiB9CiB2b2lkIFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQ6OnNldF9vbnByb2dyZXNzKAotICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKSB7CisgICAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lcikgewogICBpZiAobGlzdGVuZXIuSXNOdWxsKCkpIHsKICAgICBvbnByb2dyZXNzX2xpc3RlbmVyXyA9IGJhc2U6Om51bGxvcHQ7CiAgIH0gZWxzZSB7CkBAIC0xMTcsNyArMTE1LDcgQEAKICAgU2V0QXR0cmlidXRlRXZlbnRMaXN0ZW5lcihiYXNlOjpUb2tlbnM6OnByb2dyZXNzKCksIGxpc3RlbmVyKTsKIH0KIHZvaWQgWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldDo6c2V0X29udGltZW91dCgKLSAgICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0JiBsaXN0ZW5lcikgeworICAgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpIHsKICAgaWYgKGxpc3RlbmVyLklzTnVsbCgpKSB7CiAgICAgb250aW1lb3V0X2xpc3RlbmVyXyA9IGJhc2U6Om51bGxvcHQ7CiAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X2V2ZW50X3RhcmdldC5oIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF9ldmVudF90YXJnZXQuaAppbmRleCAyNjlmMzBjLi5hNGY4YzZkIDEwMDY0NAotLS0gYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X2V2ZW50X3RhcmdldC5oCisrKyBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfZXZlbnRfdGFyZ2V0LmgKQEAgLTEsMTggKzEsMTYgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaWZuZGVmIENPQkFMVF9YSFJfWE1MX0hUVFBfUkVRVUVTVF9FVkVOVF9UQVJHRVRfSF8KICNkZWZpbmUgQ09CQUxUX1hIUl9YTUxfSFRUUF9SRVFVRVNUX0VWRU5UX1RBUkdFVF9IXwpAQCAtMjksMzQgKzI3LDM0IEBACiAgcHVibGljOgogICBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0KCk7CiAKLSAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCogb25hYm9ydCgpIGNvbnN0OwotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbmVycm9yKCkgY29uc3Q7Ci0gIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QqIG9ubG9hZCgpIGNvbnN0OwotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbmxvYWRlbmQoKSBjb25zdDsKLSAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCogb25sb2Fkc3RhcnQoKSBjb25zdDsKLSAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCogb25wcm9ncmVzcygpIGNvbnN0OwotICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0KiBvbnRpbWVvdXQoKSBjb25zdDsKKyAgY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlKiBvbmFib3J0KCkgY29uc3Q7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25lcnJvcigpIGNvbnN0OworICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9ubG9hZCgpIGNvbnN0OworICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9ubG9hZGVuZCgpIGNvbnN0OworICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9ubG9hZHN0YXJ0KCkgY29uc3Q7CisgIGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSogb25wcm9ncmVzcygpIGNvbnN0OworICBjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUqIG9udGltZW91dCgpIGNvbnN0OwogCi0gIHZvaWQgc2V0X29uYWJvcnQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgbGlzdGVuZXIpOwotICB2b2lkIHNldF9vbmVycm9yKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKTsKLSAgdm9pZCBzZXRfb25sb2FkKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKTsKLSAgdm9pZCBzZXRfb25sb2FkZW5kKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKTsKLSAgdm9pZCBzZXRfb25sb2Fkc3RhcnQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdCYgbGlzdGVuZXIpOwotICB2b2lkIHNldF9vbnByb2dyZXNzKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKTsKLSAgdm9pZCBzZXRfb250aW1lb3V0KGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3QmIGxpc3RlbmVyKTsKKyAgdm9pZCBzZXRfb25hYm9ydChjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKTsKKyAgdm9pZCBzZXRfb25lcnJvcihjb25zdCBFdmVudExpc3RlbmVyU2NyaXB0VmFsdWUmIGxpc3RlbmVyKTsKKyAgdm9pZCBzZXRfb25sb2FkKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpOworICB2b2lkIHNldF9vbmxvYWRlbmQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lcik7CisgIHZvaWQgc2V0X29ubG9hZHN0YXJ0KGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpOworICB2b2lkIHNldF9vbnByb2dyZXNzKGNvbnN0IEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZSYgbGlzdGVuZXIpOworICB2b2lkIHNldF9vbnRpbWVvdXQoY29uc3QgRXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlJiBsaXN0ZW5lcik7CiAKICAgREVGSU5FX1dSQVBQQUJMRV9UWVBFKFhNTEh0dHBSZXF1ZXN0RXZlbnRUYXJnZXQpOwogCiAgcHJvdGVjdGVkOgogICB+WE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCgpIE9WRVJSSURFOwogCi0gIGJhc2U6Om9wdGlvbmFsPEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3Q6OlJlZmVyZW5jZT4gb25hYm9ydF9saXN0ZW5lcl87Ci0gIGJhc2U6Om9wdGlvbmFsPEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3Q6OlJlZmVyZW5jZT4gb25lcnJvcl9saXN0ZW5lcl87Ci0gIGJhc2U6Om9wdGlvbmFsPEV2ZW50TGlzdGVuZXJTY3JpcHRPYmplY3Q6OlJlZmVyZW5jZT4gb25sb2FkX2xpc3RlbmVyXzsKLSAgYmFzZTo6b3B0aW9uYWw8RXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdDo6UmVmZXJlbmNlPiBvbmxvYWRlbmRfbGlzdGVuZXJfOwotICBiYXNlOjpvcHRpb25hbDxFdmVudExpc3RlbmVyU2NyaXB0T2JqZWN0OjpSZWZlcmVuY2U+IG9ubG9hZHN0YXJ0X2xpc3RlbmVyXzsKLSAgYmFzZTo6b3B0aW9uYWw8RXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdDo6UmVmZXJlbmNlPiBvbnByb2dyZXNzX2xpc3RlbmVyXzsKLSAgYmFzZTo6b3B0aW9uYWw8RXZlbnRMaXN0ZW5lclNjcmlwdE9iamVjdDo6UmVmZXJlbmNlPiBvbnRpbWVvdXRfbGlzdGVuZXJfOworICBiYXNlOjpvcHRpb25hbDxFdmVudExpc3RlbmVyU2NyaXB0VmFsdWU6OlJlZmVyZW5jZT4gb25hYm9ydF9saXN0ZW5lcl87CisgIGJhc2U6Om9wdGlvbmFsPEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlPiBvbmVycm9yX2xpc3RlbmVyXzsKKyAgYmFzZTo6b3B0aW9uYWw8RXZlbnRMaXN0ZW5lclNjcmlwdFZhbHVlOjpSZWZlcmVuY2U+IG9ubG9hZF9saXN0ZW5lcl87CisgIGJhc2U6Om9wdGlvbmFsPEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlPiBvbmxvYWRlbmRfbGlzdGVuZXJfOworICBiYXNlOjpvcHRpb25hbDxFdmVudExpc3RlbmVyU2NyaXB0VmFsdWU6OlJlZmVyZW5jZT4gb25sb2Fkc3RhcnRfbGlzdGVuZXJfOworICBiYXNlOjpvcHRpb25hbDxFdmVudExpc3RlbmVyU2NyaXB0VmFsdWU6OlJlZmVyZW5jZT4gb25wcm9ncmVzc19saXN0ZW5lcl87CisgIGJhc2U6Om9wdGlvbmFsPEV2ZW50TGlzdGVuZXJTY3JpcHRWYWx1ZTo6UmVmZXJlbmNlPiBvbnRpbWVvdXRfbGlzdGVuZXJfOwogCiAgcHJpdmF0ZToKICAgLy8gRnJvbSBFdmVudFRhcmdldC4KZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfZXZlbnRfdGFyZ2V0LmlkbCBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfZXZlbnRfdGFyZ2V0LmlkbApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kNDU3NmUwCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF9ldmVudF90YXJnZXQuaWRsCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKy8vIGh0dHBzOi8vd3d3LnczLm9yZy9UUi8yMDE0L1dELVhNTEh0dHBSZXF1ZXN0LTIwMTQwMTMwLyN4bWxodHRwcmVxdWVzdGV2ZW50dGFyZ2V0CisKK2ludGVyZmFjZSBYTUxIdHRwUmVxdWVzdEV2ZW50VGFyZ2V0IDogRXZlbnRUYXJnZXQgeworICAgIGF0dHJpYnV0ZSBFdmVudExpc3RlbmVyPyBvbmFib3J0OworICAgIGF0dHJpYnV0ZSBFdmVudExpc3RlbmVyPyBvbmVycm9yOworICAgIGF0dHJpYnV0ZSBFdmVudExpc3RlbmVyPyBvbmxvYWQ7CisgICAgYXR0cmlidXRlIEV2ZW50TGlzdGVuZXI/IG9ubG9hZGVuZDsKKyAgICBhdHRyaWJ1dGUgRXZlbnRMaXN0ZW5lcj8gb25sb2Fkc3RhcnQ7CisgICAgYXR0cmlidXRlIEV2ZW50TGlzdGVuZXI/IG9ucHJvZ3Jlc3M7CisgICAgYXR0cmlidXRlIEV2ZW50TGlzdGVuZXI/IG9udGltZW91dDsKK307CmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X3Rlc3QuY2MgYi9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X3Rlc3QuY2MKaW5kZXggYzFjMzYyNi4uNzdhYTg1OSAxMDA2NDQKLS0tIGEvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF90ZXN0LmNjCisrKyBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfdGVzdC5jYwpAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpbmNsdWRlICJjb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3QuaCIKIApAQCAtMzIsNyArMzAsNyBAQAogdXNpbmcgOjp0ZXN0aW5nOjpSZXR1cm47CiB1c2luZyA6OnRlc3Rpbmc6OlNhdmVBcmc7CiB1c2luZyA6OnRlc3Rpbmc6OlN0cmljdE1vY2s7Ci11c2luZyBjb2JhbHQ6OmRvbTo6dGVzdGluZzo6RmFrZVNjcmlwdE9iamVjdDsKK3VzaW5nIGNvYmFsdDo6ZG9tOjp0ZXN0aW5nOjpGYWtlU2NyaXB0VmFsdWU7CiB1c2luZyBjb2JhbHQ6OmRvbTo6dGVzdGluZzo6TW9ja0V2ZW50TGlzdGVuZXI7CiB1c2luZyBjb2JhbHQ6OnNjcmlwdDo6dGVzdGluZzo6TW9ja0V4Y2VwdGlvblN0YXRlOwogCkBAIC05NCw3ICs5Miw3IEBACiAgcHVibGljOgogICBGYWtlU2V0dGluZ3MoKQogICAgICAgOiBkb206OkRPTVNldHRpbmdzKDAsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCksCisgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgTlVMTCksCiAgICAgICAgIGV4YW1wbGVfKCJodHRwOi8vZXhhbXBsZS5jb20iKSB7fQogICBjb25zdCBHVVJMJiBiYXNlX3VybCgpIGNvbnN0IE9WRVJSSURFIHsgcmV0dXJuIGV4YW1wbGVfOyB9CiAKQEAgLTE1Myw3ICsxNTEsNyBAQAogCiBURVNUX0YoWGhyVGVzdCwgT3BlbikgewogICBzY29wZWRfcHRyPE1vY2tFdmVudExpc3RlbmVyPiBsaXN0ZW5lciA9IE1vY2tFdmVudExpc3RlbmVyOjpDcmVhdGUoKTsKLSAgRmFrZVNjcmlwdE9iamVjdCBzY3JpcHRfb2JqZWN0KGxpc3RlbmVyLmdldCgpKTsKKyAgRmFrZVNjcmlwdFZhbHVlIHNjcmlwdF9vYmplY3QobGlzdGVuZXIuZ2V0KCkpOwogICB4aHJfLT5zZXRfb25yZWFkeXN0YXRlY2hhbmdlKHNjcmlwdF9vYmplY3QpOwogICBFWFBFQ1RfQ0FMTCgKICAgICAgICpsaXN0ZW5lciwKZGlmZiAtLWdpdCBhL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfdXBsb2FkLmggYi9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X3VwbG9hZC5oCmluZGV4IDlmNzIyMWUuLjJmZTQwNzggMTAwNjQ0Ci0tLSBhL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfdXBsb2FkLmgKKysrIGIvc3JjL2NvYmFsdC94aHIveG1sX2h0dHBfcmVxdWVzdF91cGxvYWQuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgQ09CQUxUX1hIUl9YTUxfSFRUUF9SRVFVRVNUX1VQTE9BRF9IXwogI2RlZmluZSBDT0JBTFRfWEhSX1hNTF9IVFRQX1JFUVVFU1RfVVBMT0FEX0hfCmRpZmYgLS1naXQgYS9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X3VwbG9hZC5pZGwgYi9zcmMvY29iYWx0L3hoci94bWxfaHR0cF9yZXF1ZXN0X3VwbG9hZC5pZGwKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzJhMWMwZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9jb2JhbHQveGhyL3htbF9odHRwX3JlcXVlc3RfdXBsb2FkLmlkbApAQCAtMCwwICsxLDE4IEBACisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisvLyBodHRwczovL3d3dy53My5vcmcvVFIvMjAxNC9XRC1YTUxIdHRwUmVxdWVzdC0yMDE0MDEzMC8jeG1saHR0cHJlcXVlc3R1cGxvYWQKKworaW50ZXJmYWNlIFhNTEh0dHBSZXF1ZXN0VXBsb2FkIDogWE1MSHR0cFJlcXVlc3RFdmVudFRhcmdldCB7Cit9OwpkaWZmIC0tZ2l0IGEvc3JjL2NvbnRlbnQvYnJvd3Nlci9zcGVlY2gvc3BlZWNoLmd5cCBiL3NyYy9jb250ZW50L2Jyb3dzZXIvc3BlZWNoL3NwZWVjaC5neXAKaW5kZXggMmRiOWZkZi4uZTQ1NzEyNSAxMDA2NDQKLS0tIGEvc3JjL2NvbnRlbnQvYnJvd3Nlci9zcGVlY2gvc3BlZWNoLmd5cAorKysgYi9zcmMvY29udGVudC9icm93c2VyL3NwZWVjaC9zcGVlY2guZ3lwCkBAIC0yNyw5ICsyNyw2IEBACiAgICAgICAgICdlbmRwb2ludGVyL2VuZXJneV9lbmRwb2ludGVyX3BhcmFtcy5jYycsCiAgICAgICAgICdlbmRwb2ludGVyL2VuZXJneV9lbmRwb2ludGVyX3BhcmFtcy5oJywKICAgICAgIF0sCi0gICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAnPChERVBUSCkvbWVkaWEvbWVkaWEuZ3lwOm1lZGlhJywKLSAgICAgIF0sCiAgICAgfSwKICAgICB7CiAgICAgICAndGFyZ2V0X25hbWUnOiAnc3BlZWNoX3Rlc3QnLApkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuaCBiL3NyYy9tZWRpYS9iYXNlL2RhdGFfc291cmNlLmgKaW5kZXggNzhlNGNkNi4uOGRlMjIxMyAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2Jhc2UvZGF0YV9zb3VyY2UuaAorKysgYi9zcmMvbWVkaWEvYmFzZS9kYXRhX3NvdXJjZS5oCkBAIC02LDcgKzYsNiBAQAogI2RlZmluZSBNRURJQV9CQVNFX0RBVEFfU09VUkNFX0hfCiAKICNpbmNsdWRlICJiYXNlL2NhbGxiYWNrLmgiCi0jaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKICNpbmNsdWRlICJiYXNlL3RpbWUuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL21lZGlhX2V4cG9ydC5oIgogCkBAIC0zMCw3ICsyOSw3IEBACiAgIHZpcnR1YWwgfkRhdGFTb3VyY2VIb3N0KCk7CiB9OwogCi1jbGFzcyBNRURJQV9FWFBPUlQgRGF0YVNvdXJjZSA6IHB1YmxpYyBiYXNlOjpSZWZDb3VudGVkVGhyZWFkU2FmZTxEYXRhU291cmNlPiB7CitjbGFzcyBNRURJQV9FWFBPUlQgRGF0YVNvdXJjZSB7CiAgcHVibGljOgogICB0eXBlZGVmIGJhc2U6OkNhbGxiYWNrPHZvaWQoaW50NjQsIGludDY0KT4gU3RhdHVzQ2FsbGJhY2s7CiAgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8dm9pZChpbnQpPiBSZWFkQ0I7CkBAIC01MSw3ICs1MCw3IEBACiAKICAgLy8gU3RvcHMgdGhlIERhdGFTb3VyY2UuIE9uY2UgdGhpcyBpcyBjYWxsZWQgYWxsIGZ1dHVyZSBSZWFkKCkgY2FsbHMgd2lsbAogICAvLyByZXR1cm4gYW4gZXJyb3IuCi0gIHZpcnR1YWwgdm9pZCBTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTdG9wKCkgPSAwOwogCiAgIC8vIFJldHVybnMgdHJ1ZSBhbmQgdGhlIGZpbGUgc2l6ZSwgZmFsc2UgaWYgdGhlIGZpbGUgc2l6ZSBjb3VsZCBub3QgYmUKICAgLy8gcmV0cmlldmVkLgpAQCAtNjYsOCArNjUsNiBAQAogICB2aXJ0dWFsIHZvaWQgU2V0Qml0cmF0ZShpbnQgYml0cmF0ZSkgPSAwOwogCiAgcHJvdGVjdGVkOgotICAvLyBPbmx5IGFsbG93IHNjb3BlZF9yZWZwdHI8PiB0byBkZWxldGUgRGF0YVNvdXJjZS4KLSAgZnJpZW5kIGNsYXNzIGJhc2U6OlJlZkNvdW50ZWRUaHJlYWRTYWZlPERhdGFTb3VyY2U+OwogICB2aXJ0dWFsIH5EYXRhU291cmNlKCk7CiAKICAgRGF0YVNvdXJjZUhvc3QqIGhvc3QoKTsKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3BpcGVsaW5lLmggYi9zcmMvbWVkaWEvYmFzZS9waXBlbGluZS5oCmluZGV4IGVjNGJiN2MuLmJkNmE3MmEgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9iYXNlL3BpcGVsaW5lLmgKKysrIGIvc3JjL21lZGlhL2Jhc2UvcGlwZWxpbmUuaApAQCAtMTc5LDYgKzE3OSw5IEBACiAKICAgLy8gR2V0IHRoZSBTZXRCb3VuZHNDQiB1c2VkIHRvIHNldCB0aGUgYm91bmRzIG9mIHRoZSB2aWRlbyBmcmFtZS4KICAgdmlydHVhbCBTZXRCb3VuZHNDQiBHZXRTZXRCb3VuZHNDQigpIHsgcmV0dXJuIFNldEJvdW5kc0NCKCk7IH0KKworICAvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHBsYXllciBpcyBjb25maWd1cmVkIGZvciBvdXRwdXR0aW5nIGluIHB1bmNoIG91dCBtb2RlLgorICB2aXJ0dWFsIGJvb2wgSXNQdW5jaE91dE1vZGUoKSB7IHJldHVybiBmYWxzZTsgfQogfTsKIAogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zYnBsYXllcl9waXBlbGluZS5jYyBiL3NyYy9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjCmluZGV4IGZmMjE4ODMuLjY5ZWI1ODAgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjCisrKyBiL3NyYy9tZWRpYS9iYXNlL3NicGxheWVyX3BpcGVsaW5lLmNjCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSAibWVkaWEvYmFzZS9yYW5nZXMuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3NicGxheWVyX3NldF9ib3VuZHNfaGVscGVyLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgiCisjaW5jbHVkZSAibWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCiAjaW5jbHVkZSAibWVkaWEvY3J5cHRvL3N0YXJib2FyZF9kZWNyeXB0b3IuaCIKICNpbmNsdWRlICJ1aS9nZngvc2l6ZS5oIgpAQCAtMTA0LDYgKzEwNSw4IEBACiAgIFBpcGVsaW5lU3RhdGlzdGljcyBHZXRTdGF0aXN0aWNzKCkgY29uc3QgT1ZFUlJJREU7CiAgIFNldEJvdW5kc0NCIEdldFNldEJvdW5kc0NCKCkgT1ZFUlJJREU7CiAKKyAgYm9vbCBJc1B1bmNoT3V0TW9kZSgpIE9WRVJSSURFOworCiAgcHJpdmF0ZToKICAgdm9pZCBTdGFydFRhc2soY29uc3QgU3RhcnRUYXNrUGFyYW1ldGVycyYgcGFyYW1ldGVycyk7CiAgIHZvaWQgU2V0Vm9sdW1lVGFzayhmbG9hdCB2b2x1bWUpOwpAQCAtMzYwLDkgKzM2Myw2IEBACiB9CiAKIHZvaWQgU2JQbGF5ZXJQaXBlbGluZTo6U2V0UGxheWJhY2tSYXRlKGZsb2F0IHBsYXliYWNrX3JhdGUpIHsKLSAgaWYgKHBsYXliYWNrX3JhdGUgIT0gMC4wZiAmJiBwbGF5YmFja19yYXRlICE9IDEuMGYpCi0gICAgcmV0dXJuOwotCiAgIGJhc2U6OkF1dG9Mb2NrIGF1dG9fbG9jayhsb2NrXyk7CiAgIHBsYXliYWNrX3JhdGVfID0gcGxheWJhY2tfcmF0ZTsKICAgbWVzc2FnZV9sb29wXy0+UG9zdFRhc2soCkBAIC00NTAsMTEgKzQ1MCwxNiBAQAogfQogCiBQaXBlbGluZTo6U2V0Qm91bmRzQ0IgU2JQbGF5ZXJQaXBlbGluZTo6R2V0U2V0Qm91bmRzQ0IoKSB7Ci0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICByZXR1cm4gYmFzZTo6QmluZCgmU2JQbGF5ZXJTZXRCb3VuZHNIZWxwZXI6OlNldEJvdW5kcywgc2V0X2JvdW5kc19oZWxwZXJfKTsKLSNlbHNlICAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQotICByZXR1cm4gUGlwZWxpbmU6OlNldEJvdW5kc0NCKCk7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKK30KKworYm9vbCBTYlBsYXllclBpcGVsaW5lOjpJc1B1bmNoT3V0TW9kZSgpIHsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgYmFzZTo6QXV0b0xvY2sgYXV0b19sb2NrKGxvY2tfKTsKKyAgcmV0dXJuIHBsYXllcl8tPkdldFNiUGxheWVyT3V0cHV0TW9kZSgpID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dDsKKyNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgcmV0dXJuIHRydWU7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogfQogCiB2b2lkIFNiUGxheWVyUGlwZWxpbmU6OlN0YXJ0VGFzayhjb25zdCBTdGFydFRhc2tQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKSB7CkBAIC00OTAsNyArNDk1LDcgQEAKICAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgaWYgKHBsYXllcl8pIHsKLSAgICBwbGF5ZXJfLT5TZXRQYXVzZShwbGF5YmFja19yYXRlXyA9PSAwLjApOworICAgIHBsYXllcl8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlXyk7CiAgIH0KIH0KIApAQCAtNjkxLDcgKzY5Niw2IEBACiAgIH0KIAogICBpZiAoc3RhdHVzID09IERlbXV4ZXJTdHJlYW06OmtDb25maWdDaGFuZ2VkKSB7Ci0gICAgTk9USU1QTEVNRU5URUQoKSA8PCAiVXBkYXRlIGRlY29kZXIgY29uZmlnIjsKICAgICBVcGRhdGVEZWNvZGVyQ29uZmlnKHN0cmVhbSk7CiAgICAgc3RyZWFtLT5SZWFkKAogICAgICAgICBiYXNlOjpCaW5kKCZTYlBsYXllclBpcGVsaW5lOjpPbkRlbXV4ZXJTdHJlYW1SZWFkLCB0aGlzLCB0eXBlKSk7CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuY2MKaW5kZXggMjE5YzZhNS4uMDdlMWM4YSAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfZGF0YV9zb3VyY2VfcmVhZGVyLmNjCisrKyBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5jYwpAQCAtMjMsMTUgKzIzLDE2IEBACiBjb25zdCBpbnQgU2hlbGxEYXRhU291cmNlUmVhZGVyOjprUmVhZEVycm9yID0gRGF0YVNvdXJjZTo6a1JlYWRFcnJvcjsKIAogU2hlbGxEYXRhU291cmNlUmVhZGVyOjpTaGVsbERhdGFTb3VyY2VSZWFkZXIoKQotICAgIDogYmxvY2tpbmdfcmVhZF9ldmVudF8oZmFsc2UsIGZhbHNlKSwKKyAgICA6IGRhdGFfc291cmNlXyhOVUxMKSwKKyAgICAgIGJsb2NraW5nX3JlYWRfZXZlbnRfKGZhbHNlLCBmYWxzZSksCiAgICAgICBmaWxlX3NpemVfKC0xKSwKICAgICAgIHJlYWRfaGFzX2ZhaWxlZF8oZmFsc2UpLAogICAgICAgbGFzdF9ieXRlc19yZWFkXygwKSB7fQogCiBTaGVsbERhdGFTb3VyY2VSZWFkZXI6On5TaGVsbERhdGFTb3VyY2VSZWFkZXIoKSB7fQogCi12b2lkIFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6U2V0RGF0YVNvdXJjZSgKLSAgICBzY29wZWRfcmVmcHRyPERhdGFTb3VyY2U+IGRhdGFfc291cmNlKSB7Cit2b2lkIFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6U2V0RGF0YVNvdXJjZShEYXRhU291cmNlKiBkYXRhX3NvdXJjZSkgeworICBEQ0hFQ0soZGF0YV9zb3VyY2UpOwogICBkYXRhX3NvdXJjZV8gPSBkYXRhX3NvdXJjZTsKIH0KIApAQCAtODgsOCArODksMTAgQEAKIHZvaWQgU2hlbGxEYXRhU291cmNlUmVhZGVyOjpTdG9wKGNvbnN0IGJhc2U6OkNsb3N1cmUmIGNhbGxiYWNrKSB7CiAgIGlmIChkYXRhX3NvdXJjZV8pIHsKICAgICAvLyBzdG9wIHRoZSBkYXRhIHNvdXJjZSwgaXQgY2FuIGNhbGwgdGhlIGNhbGxiYWNrCi0gICAgZGF0YV9zb3VyY2VfLT5TdG9wKGNhbGxiYWNrKTsKKyAgICBkYXRhX3NvdXJjZV8tPlN0b3AoKTsKKyAgICBkYXRhX3NvdXJjZV8gPSBOVUxMOwogICB9CisgIGNhbGxiYWNrLlJ1bigpOwogfQogCiB2b2lkIFNoZWxsRGF0YVNvdXJjZVJlYWRlcjo6QmxvY2tpbmdSZWFkQ29tcGxldGVkKGludCBieXRlc19yZWFkKSB7CmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zaGVsbF9kYXRhX3NvdXJjZV9yZWFkZXIuaCBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oCmluZGV4IDY4NTY2M2YuLjAxYzUyYmQgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oCisrKyBiL3NyYy9tZWRpYS9iYXNlL3NoZWxsX2RhdGFfc291cmNlX3JlYWRlci5oCkBAIC0zOSw3ICszOSw3IEBACiAgIHN0YXRpYyBjb25zdCBpbnQga1JlYWRFcnJvcjsKIAogICBTaGVsbERhdGFTb3VyY2VSZWFkZXIoKTsKLSAgdmlydHVhbCB2b2lkIFNldERhdGFTb3VyY2Uoc2NvcGVkX3JlZnB0cjxEYXRhU291cmNlPiBkYXRhX3NvdXJjZSk7CisgIHZpcnR1YWwgdm9pZCBTZXREYXRhU291cmNlKERhdGFTb3VyY2UqIGRhdGFfc291cmNlKTsKIAogICAvLyBCbG9jayB0aGUgY2FsbGluZyB0aHJlYWQncyBtZXNzYWdlIGxvb3AgdW50aWwgcmVhZCBpcyBjb21wbGV0ZS4KICAgLy8gcmV0dXJucyBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciBrUmVhZEVycm9yIG9uIGVycm9yLgpAQCAtNTksNyArNTksNyBAQAogICAvLyBibG9ja2luZyByZWFkIGNhbGxiYWNrCiAgIHZpcnR1YWwgdm9pZCBCbG9ja2luZ1JlYWRDb21wbGV0ZWQoaW50IGJ5dGVzX3JlYWQpOwogCi0gIHNjb3BlZF9yZWZwdHI8RGF0YVNvdXJjZT4gZGF0YV9zb3VyY2VfOworICBEYXRhU291cmNlKiBkYXRhX3NvdXJjZV87CiAgIGJhc2U6OldhaXRhYmxlRXZlbnQgYmxvY2tpbmdfcmVhZF9ldmVudF87CiAgIGludDY0IGZpbGVfc2l6ZV87CiAgIGJvb2wgcmVhZF9oYXNfZmFpbGVkXzsKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmggYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF9tZWRpYV9wbGF0Zm9ybS5oCmluZGV4IDdhN2MyY2EuLjljNDlmY2UgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmgKKysrIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfcGxhdGZvcm0uaApAQCAtMjYsNiArMjYsNyBAQAogI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfYnVmZmVyX2ZhY3RvcnkuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2RhdGFfYWxsb2NhdG9yLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCiAKIG5hbWVzcGFjZSBtZWRpYSB7CiAKQEAgLTY0LDYgKzY1LDEwIEBACiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKKyAgdmlydHVhbCBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBHZXRTYkRlY29kZVRhcmdldFByb3ZpZGVyKCkgeyByZXR1cm4gTlVMTDsgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCisKICAgLy8gVG90YWwgbnVtYmVyIG9mIHZpZGVvIGZyYW1lcyB3aGljaCBhcmUgcG9wdWxhdGluZyBpbiB0aGUgcGlwZWxpbmUgd2hlbgogICAvLyBwcmVyb2xsaW5nLgogICAvLyBZb3UgY2FuIGV4cGVjdCBtb3JlIHN0YXJ0IGRlbGF5IGJ5IGluY3JlYXNpbmcgdGhpcy4KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmNjIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuY2MKaW5kZXggN2E5ZGRiMi4uMTA0ZjY0YSAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuY2MKKysrIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuY2MKQEAgLTIyLDcgKzIyLDggQEAKIAogU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI6OlNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyKAogICAgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gcHVuY2hfb3V0KQotICAgIDogcHVuY2hfb3V0XyhwdW5jaF9vdXQpLCBoYXNfY29uc3VtZWRfZnJhbWVzXyhmYWxzZSksIGRyb3BwZWRfZnJhbWVzXygwKSB7CisgICAgOiBwdW5jaF9vdXRfKHB1bmNoX291dCksIGhhc19jb25zdW1lZF9mcmFtZXNfKGZhbHNlKSwgZHJvcHBlZF9mcmFtZXNfKDApLAorICAgICAgb3V0cHV0X21vZGVfKGtPdXRwdXRNb2RlSW52YWxpZCkgewogI2lmICFkZWZpbmVkKF9fTEJfU0hFTExfX0ZPUl9SRUxFQVNFX18pCiAgIG1heF9kZWxheV9pbl9taWNyb3NlY29uZHNfID0gMDsKICNlbmRpZiAgLy8gIWRlZmluZWQoX19MQl9TSEVMTF9fRk9SX1JFTEVBU0VfXykKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmggYi9zcmMvbWVkaWEvYmFzZS9zaGVsbF92aWRlb19mcmFtZV9wcm92aWRlci5oCmluZGV4IDczNDRlNzguLjY2ODUyYzggMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9iYXNlL3NoZWxsX3ZpZGVvX2ZyYW1lX3Byb3ZpZGVyLmgKKysrIGIvc3JjL21lZGlhL2Jhc2Uvc2hlbGxfdmlkZW9fZnJhbWVfcHJvdmlkZXIuaApAQCAtMjQsNiArMjQsNyBAQAogI2luY2x1ZGUgImJhc2Uvc3luY2hyb25pemF0aW9uL2xvY2suaCIKICNpbmNsdWRlICJiYXNlL3RpbWUuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2ZyYW1lLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKIAogbmFtZXNwYWNlIG1lZGlhIHsKIApAQCAtMzYsNiArMzcsMTYgQEAKIGNsYXNzIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyCiAgICAgOiBwdWJsaWMgYmFzZTo6UmVmQ291bnRlZFRocmVhZFNhZmU8U2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXI+IHsKICBwdWJsaWM6CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIHR5cGVkZWYgYmFzZTo6Q2FsbGJhY2s8U2JEZWNvZGVUYXJnZXQoKT4gR2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb247CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCisgIGVudW0gT3V0cHV0TW9kZSB7CisgICAga091dHB1dE1vZGVQdW5jaE91dCwKKyAgICBrT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwKKyAgICBrT3V0cHV0TW9kZUludmFsaWQsCisgIH07CisKICAgZXhwbGljaXQgU2hlbGxWaWRlb0ZyYW1lUHJvdmlkZXIoc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBwdW5jaF9vdXQgPSBOVUxMKTsKIAogICAvLyBUaGUgY2FsbGluZyBiYWNrIHJldHVybnMgdGhlIGN1cnJlbnQgbWVkaWEgdGltZSBhbmQgYSBib29sIHdoaWNoIGlzIHNldCB0bwpAQCAtNTgsNiArNjksMzQgQEAKICAgLy8gcmV0dXJucyBOVUxMLgogICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBHZXRDdXJyZW50RnJhbWUoKTsKIAorICB2b2lkIFNldE91dHB1dE1vZGUoT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSkgeyBvdXRwdXRfbW9kZV8gPSBvdXRwdXRfbW9kZTsgfQorICBPdXRwdXRNb2RlIEdldE91dHB1dE1vZGUoKSBjb25zdCB7IHJldHVybiBvdXRwdXRfbW9kZV87IH0KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICAvLyBGb3IgU3RhcmJvYXJkIHBsYXRmb3JtcyB0aGF0IGhhdmUgYSBkZWNvZGUtdG8tdGV4dHVyZSBwbGF5ZXIsIHdlIGVuYWJsZQorICAvLyB0aGlzIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyIHRvIGFjdCBhcyBhIGJyaWRnZSBmb3IgQ29iYWx0IGNvZGUgdG8gcXVlcnkKKyAgLy8gZm9yIHRoZSBjdXJyZW50IFNiRGVjb2RlVGFyZ2V0LiAgSW4gZWZmZWN0LCB3ZSBieXBhc3MgYWxsIG9mCisgIC8vIFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyJ3MgbG9naWMgaW4gdGhpcyBjYXNlLCBpbnN0ZWFkIHJlbHlpbmcgb24gdGhlCisgIC8vIFN0YXJib2FyZCBpbXBsZW1lbnRhdGlvbiB0byBwcm92aWRlIHVzIHdpdGggdGhlIGN1cnJlbnQgdmlkZW8gZnJhbWUgd2hlbgorICAvLyBuZWVkZWQuCisgIHZvaWQgU2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oCisgICAgICBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbiBmdW5jdGlvbikgeworICAgIGdldF9jdXJyZW50X3NiX2RlY29kZV90YXJnZXRfZnVuY3Rpb25fID0gZnVuY3Rpb247CisgIH0KKworICB2b2lkIFJlc2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oKSB7CisgICAgZ2V0X2N1cnJlbnRfc2JfZGVjb2RlX3RhcmdldF9mdW5jdGlvbl8uUmVzZXQoKTsKKyAgfQorCisgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnRTYkRlY29kZVRhcmdldCgpIGNvbnN0IHsKKyAgICBpZiAoZ2V0X2N1cnJlbnRfc2JfZGVjb2RlX3RhcmdldF9mdW5jdGlvbl8uaXNfbnVsbCgpKSB7CisgICAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGdldF9jdXJyZW50X3NiX2RlY29kZV90YXJnZXRfZnVuY3Rpb25fLlJ1bigpOworICAgIH0KKyAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogICB2b2lkIEFkZEZyYW1lKGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKTsKICAgLy8gRmx1c2ggd2lsbCBjbGVhciBhbGwgY2FjaGVkIGZyYW1lcyBleGNlcHQgdGhlIGN1cnJlbnQgZnJhbWUuIFNvIHRoZSBjdXJyZW50CiAgIC8vIGZyYW1lIGNhbiBzdGlsbCBiZSBkaXNwbGF5ZWQgZHVyaW5nIHNlZWsuCkBAIC05MCw2ICsxMjksMTEgQEAKICAgaW50IG1heF9kZWxheV9pbl9taWNyb3NlY29uZHNfOwogI2VuZGlmICAvLyAhZGVmaW5lZChfX0xCX1NIRUxMX19GT1JfUkVMRUFTRV9fKQogCisgIE91dHB1dE1vZGUgb3V0cHV0X21vZGVfOworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXRGdW5jdGlvbiBnZXRfY3VycmVudF9zYl9kZWNvZGVfdGFyZ2V0X2Z1bmN0aW9uXzsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKICAgRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNoZWxsVmlkZW9GcmFtZVByb3ZpZGVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MgYi9zcmMvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmNjCmluZGV4IDMyYjczZDQuLjk3MTEwNTkgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuY2MKKysrIGIvc3JjL21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYwpAQCAtMTksNyArMTksOSBAQAogI2luY2x1ZGUgImJhc2UvYmluZC5oIgogI2luY2x1ZGUgImJhc2UvbG9jYXRpb24uaCIKICNpbmNsdWRlICJiYXNlL2xvZ2dpbmcuaCIKKyNpbmNsdWRlICJtZWRpYS9iYXNlL3NoZWxsX21lZGlhX3BsYXRmb3JtLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9zdGFyYm9hcmRfdXRpbHMuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKIAogbmFtZXNwYWNlIG1lZGlhIHsKQEAgLTQyLDcgKzQ0LDcgQEAKICAgICAgIGZyYW1lX2hlaWdodF8oMSksCiAgICAgICB0aWNrZXRfKFNCX1BMQVlFUl9JTklUSUFMX1RJQ0tFVCksCiAgICAgICB2b2x1bWVfKDEuMCksCi0gICAgICBwYXVzZWRfKHRydWUpLAorICAgICAgcGxheWJhY2tfcmF0ZV8oMC4wKSwKICAgICAgIHNlZWtfcGVuZGluZ18oZmFsc2UpLAogICAgICAgc3RhdGVfKGtQbGF5aW5nKSB7CiAgIERDSEVDSyhhdWRpb19jb25maWcuSXNWYWxpZENvbmZpZygpKTsKQEAgLTUzLDYgKzU1LDEwIEBACiAgIGF1ZGlvX2NvbmZpZ18uQ29weUZyb20oYXVkaW9fY29uZmlnKTsKICAgdmlkZW9fY29uZmlnXy5Db3B5RnJvbSh2aWRlb19jb25maWcpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIG91dHB1dF9tb2RlXyA9IENvbXB1dGVTYlBsYXllck91dHB1dE1vZGUoCisgICAgICBNZWRpYVZpZGVvQ29kZWNUb1NiTWVkaWFWaWRlb0NvZGVjKHZpZGVvX2NvbmZpZy5jb2RlYygpKSwgZHJtX3N5c3RlbSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICBDcmVhdGVQbGF5ZXIoKTsKIAogICBtZXNzYWdlX2xvb3AtPlBvc3RUYXNrKApAQCAtNjQsNiArNzAsMTMgQEAKICAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKICAgc2V0X2JvdW5kc19oZWxwZXJfLT5TZXRQbGF5ZXIoTlVMTCk7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgU2hlbGxNZWRpYVBsYXRmb3JtOjpJbnN0YW5jZSgpCisgICAgICAtPkdldFZpZGVvRnJhbWVQcm92aWRlcigpCisgICAgICAtPlJlc2V0R2V0Q3VycmVudFNiRGVjb2RlVGFyZ2V0RnVuY3Rpb24oKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKICAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcl8pOwogfQogCkBAIC0xNDAsNyArMTUzLDkgQEAKIHZvaWQgU3RhcmJvYXJkUGxheWVyOjpQcmVwYXJlRm9yU2VlaygpIHsKICAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAgICsrdGlja2V0XzsKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCiAgIFNiUGxheWVyU2V0UGF1c2UocGxheWVyXywgdHJ1ZSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KICAgc2Vla19wZW5kaW5nXyA9IHRydWU7CiB9CiAKQEAgLTE2Niw5ICsxODEsOSBAQAogICArK3RpY2tldF87CiAgIFNiUGxheWVyU2VlayhwbGF5ZXJfLCBUaW1lRGVsdGFUb1NiTWVkaWFUaW1lKHRpbWUpLCB0aWNrZXRfKTsKICAgc2Vla19wZW5kaW5nXyA9IGZhbHNlOwotICBpZiAoIXBhdXNlZF8pIHsKLSAgICBTYlBsYXllclNldFBhdXNlKHBsYXllcl8sIGZhbHNlKTsKLSAgfQorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgU2JQbGF5ZXJTZXRQYXVzZShwbGF5ZXJfLCBwbGF5YmFja19yYXRlXyA9PSAwLjApOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCiB9CiAKIHZvaWQgU3RhcmJvYXJkUGxheWVyOjpTZXRWb2x1bWUoZmxvYXQgdm9sdW1lKSB7CkBAIC0xODUsMTQgKzIwMCwxNiBAQAogICBTYlBsYXllclNldFZvbHVtZShwbGF5ZXJfLCB2b2x1bWUpOwogfQogCi12b2lkIFN0YXJib2FyZFBsYXllcjo6U2V0UGF1c2UoYm9vbCBwYXVzZSkgewordm9pZCBTdGFyYm9hcmRQbGF5ZXI6OlNldFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSkgewogICBEQ0hFQ0sobWVzc2FnZV9sb29wXy0+QmVsb25nc1RvQ3VycmVudFRocmVhZCgpKTsKICAgRENIRUNLKFNiUGxheWVySXNWYWxpZChwbGF5ZXJfKSk7CiAKLSAgcGF1c2VkXyA9IHBhdXNlOwotICBpZiAoIXNlZWtfcGVuZGluZ18pIHsKLSAgICBTYlBsYXllclNldFBhdXNlKHBsYXllcl8sIHBhdXNlKTsKLSAgfQorICBwbGF5YmFja19yYXRlXyA9IHBsYXliYWNrX3JhdGU7CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICBTYlBsYXllclNldFBhdXNlKHBsYXllcl8sIHBsYXliYWNrX3JhdGUgPT0gMC4wKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICBTYlBsYXllclNldFBsYXliYWNrUmF0ZShwbGF5ZXJfLCBwbGF5YmFja19yYXRlKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogfQogCiB2b2lkIFN0YXJib2FyZFBsYXllcjo6R2V0SW5mbyh1aW50MzIqIHZpZGVvX2ZyYW1lc19kZWNvZGVkLApAQCAtMjQyLDcgKzI1OSwxMSBAQAogCiAgIERDSEVDSyhTYlBsYXllcklzVmFsaWQocGxheWVyXykpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogICBTYlBsYXllclNldFBhdXNlKHBsYXllcl8sIHRydWUpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIFNiUGxheWVyU2V0UGxheWJhY2tSYXRlKHBsYXllcl8sIDAuMCk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KIAogICBiYXNlOjpBdXRvTG9jayBhdXRvX2xvY2sobG9ja18pOwogCkBAIC0zMDQsMTggKzMyNSw0OCBAQAogICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYyA9CiAgICAgICBNZWRpYVZpZGVvQ29kZWNUb1NiTWVkaWFWaWRlb0NvZGVjKHZpZGVvX2NvbmZpZ18uY29kZWMoKSk7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgRENIRUNLKFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChvdXRwdXRfbW9kZV8sIHZpZGVvX2NvZGVjLCBkcm1fc3lzdGVtXykpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogICBwbGF5ZXJfID0gU2JQbGF5ZXJDcmVhdGUoCiAgICAgICB3aW5kb3dfLCB2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIFNCX1BMQVlFUl9OT19EVVJBVElPTiwgZHJtX3N5c3RlbV8sCiAgICAgICAmYXVkaW9faGVhZGVyLCAmU3RhcmJvYXJkUGxheWVyOjpEZWFsbG9jYXRlU2FtcGxlQ0IsCiAgICAgICAmU3RhcmJvYXJkUGxheWVyOjpEZWNvZGVyU3RhdHVzQ0IsICZTdGFyYm9hcmRQbGF5ZXI6OlBsYXllclN0YXR1c0NCLCB0aGlzCi0jaWYgU0JfVkVSU0lPTigzKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICAgICAgLAotICAgICAgTlVMTCAgLy8gcHJvdmlkZXIKLSNlbmRpZgorICAgICAgb3V0cHV0X21vZGVfCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKKyAgICAgICwKKyAgICAgIFNoZWxsTWVkaWFQbGF0Zm9ybTo6SW5zdGFuY2UoKS0+R2V0U2JEZWNvZGVUYXJnZXRQcm92aWRlcigpICAvLyBwcm92aWRlcgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCiAgICAgICApOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIGlmIChvdXRwdXRfbW9kZV8gPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSkgeworICAgIC8vIElmIHRoZSBwbGF5ZXIgaXMgc2V0dXAgdG8gZGVjb2RlIHRvIHRleHR1cmUsIHRoZW4gcHJvdmlkZSBDb2JhbHQgd2l0aAorICAgIC8vIGEgbWV0aG9kIG9mIHF1ZXJ5aW5nIHRoYXQgdGV4dHVyZS4KKyAgICBTaGVsbE1lZGlhUGxhdGZvcm06Okluc3RhbmNlKCkKKyAgICAgICAgLT5HZXRWaWRlb0ZyYW1lUHJvdmlkZXIoKQorICAgICAgICAtPlNldEdldEN1cnJlbnRTYkRlY29kZVRhcmdldEZ1bmN0aW9uKAorICAgICAgICAgICAgYmFzZTo6QmluZCgmU3RhcmJvYXJkUGxheWVyOjpHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXQsCisgICAgICAgICAgICAgICAgICAgICAgIGJhc2U6OlVucmV0YWluZWQodGhpcykpKTsKKyAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogICBzZXRfYm91bmRzX2hlbHBlcl8tPlNldFBsYXllcih0aGlzKTsKIH0KIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorU2JEZWNvZGVUYXJnZXQgU3RhcmJvYXJkUGxheWVyOjpHZXRDdXJyZW50U2JEZWNvZGVUYXJnZXQoKSB7CisgIHJldHVybiBTYlBsYXllckdldEN1cnJlbnRGcmFtZShwbGF5ZXJfKTsKK30KK1NiUGxheWVyT3V0cHV0TW9kZSBTdGFyYm9hcmRQbGF5ZXI6OkdldFNiUGxheWVyT3V0cHV0TW9kZSgpIHsKKyAgcmV0dXJuIG91dHB1dF9tb2RlXzsKK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIHZvaWQgU3RhcmJvYXJkUGxheWVyOjpDbGVhckRlY29kZXJCdWZmZXJDYWNoZSgpIHsKICAgRENIRUNLKG1lc3NhZ2VfbG9vcF8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CiAKQEAgLTM4OSw5ICs0NDAsMTEgQEAKICAgICB9CiAgICAgU2JQbGF5ZXJTZWVrKHBsYXllcl8sIFRpbWVEZWx0YVRvU2JNZWRpYVRpbWUocHJlcm9sbF90aW1lc3RhbXBfKSwgdGlja2V0Xyk7CiAgICAgU2V0Vm9sdW1lKHZvbHVtZV8pOwotICAgIGlmIChwYXVzZWRfKSB7Ci0gICAgICBTZXRQYXVzZShwYXVzZWRfKTsKLSAgICB9CisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICAgIFNiUGxheWVyU2V0UGF1c2UocGxheWVyXywgcGxheWJhY2tfcmF0ZV8gPT0gMC4wKTsKKyNlbHNlICAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICAgIFNiUGxheWVyU2V0UGxheWJhY2tSYXRlKHBsYXllcl8sIHBsYXliYWNrX3JhdGVfKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogICAgIHJldHVybjsKICAgfQogICBob3N0Xy0+T25QbGF5ZXJTdGF0dXMoc3RhdGUpOwpAQCAtNDQ2LDQgKzQ5OSwyMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhlbHBlci0+d2Vha190aGlzXywgc2FtcGxlX2J1ZmZlcikpOwogfQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisvLyBzdGF0aWMKK1NiUGxheWVyT3V0cHV0TW9kZSBTdGFyYm9hcmRQbGF5ZXI6OkNvbXB1dGVTYlBsYXllck91dHB1dE1vZGUoCisgICAgU2JNZWRpYVZpZGVvQ29kZWMgY29kZWMsIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pIHsKKyAgLy8gSWYgYXZhaWxhYmxlLCBjaG9vc2UgcHVuY2gtb3V0IG1vZGUsIHNpbmNlIGl0IHdpbGwgYWxtb3N0IGFsd2F5cyBiZQorICAvLyB0aGUgbW9zdCBwZXJmb3JtYW50LiAgSWYgaXQgaXMgdW5hdmFpbGFibGUsIHRoZW4gZmFsbGJhY2sgdG8KKyAgLy8gZGVjb2RlLXRvLXRleHR1cmUuCisgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSA9IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmU7CisgIGlmIChTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWQoa1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0LCBjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkcm1fc3lzdGVtKSkgeworICAgIG91dHB1dF9tb2RlID0ga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0OworICB9CisKKyAgcmV0dXJuIG91dHB1dF9tb2RlOworfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogfSAgLy8gbmFtZXNwYWNlIG1lZGlhCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmggYi9zcmMvbWVkaWEvYmFzZS9zdGFyYm9hcmRfcGxheWVyLmgKaW5kZXggMmQ5ZGM1OC4uNmQyMmVkYiAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5oCisrKyBiL3NyYy9tZWRpYS9iYXNlL3N0YXJib2FyZF9wbGF5ZXIuaApAQCAtNjYsNyArNjYsNyBAQAogICB2b2lkIFNlZWsoYmFzZTo6VGltZURlbHRhIHRpbWUpOwogCiAgIHZvaWQgU2V0Vm9sdW1lKGZsb2F0IHZvbHVtZSk7Ci0gIHZvaWQgU2V0UGF1c2UoYm9vbCBwYXVzZSk7CisgIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKTsKICAgdm9pZCBHZXRJbmZvKHVpbnQzMiogdmlkZW9fZnJhbWVzX2RlY29kZWQsCiAgICAgICAgICAgICAgICB1aW50MzIqIHZpZGVvX2ZyYW1lc19kcm9wcGVkLAogICAgICAgICAgICAgICAgYmFzZTo6VGltZURlbHRhKiBtZWRpYV90aW1lKTsKQEAgLTc0LDYgKzc0LDExIEBACiAgIHZvaWQgU3VzcGVuZCgpOwogICB2b2lkIFJlc3VtZSgpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnRTYkRlY29kZVRhcmdldCgpOworICBTYlBsYXllck91dHB1dE1vZGUgR2V0U2JQbGF5ZXJPdXRwdXRNb2RlKCk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCiAgcHJpdmF0ZToKICAgZW51bSBTdGF0ZSB7CiAgICAga1BsYXlpbmcsCkBAIC0xMTMsNiArMTE4LDEzIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc2FtcGxlX2J1ZmZlcik7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgLy8gUmV0dXJucyB0aGUgb3V0cHV0IG1vZGUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSB2aWRlbyB3aXRoIHRoZSBnaXZlbgorICAvLyBzcGVjaWZpY2F0aW9ucy4KKyAgc3RhdGljIFNiUGxheWVyT3V0cHV0TW9kZSBDb21wdXRlU2JQbGF5ZXJPdXRwdXRNb2RlKAorICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgY29kZWMsIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogICAvLyBUaGUgZm9sbG93aW5nIHZhcmlhYmxlcyBhcmUgaW5pdGlhbGl6ZWQgaW4gdGhlIGN0b3IgYW5kIG5ldmVyIGNoYW5nZWQuCiAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wXzsKICAgQXVkaW9EZWNvZGVyQ29uZmlnIGF1ZGlvX2NvbmZpZ187CkBAIC0xMzAsNyArMTQyLDcgQEAKICAgRGVjb2RpbmdCdWZmZXJzIGRlY29kaW5nX2J1ZmZlcnNfOwogICBpbnQgdGlja2V0XzsKICAgZmxvYXQgdm9sdW1lXzsKLSAgYm9vbCBwYXVzZWRfOworICBkb3VibGUgcGxheWJhY2tfcmF0ZV87CiAgIGJvb2wgc2Vla19wZW5kaW5nXzsKICAgRGVjb2RlckJ1ZmZlckNhY2hlIGRlY29kZXJfYnVmZmVyX2NhY2hlXzsKIApAQCAtMTQyLDYgKzE1NCwxMSBAQAogICB1aW50MzIgY2FjaGVkX3ZpZGVvX2ZyYW1lc19kZWNvZGVkXzsKICAgdWludDMyIGNhY2hlZF92aWRlb19mcmFtZXNfZHJvcHBlZF87CiAgIGJhc2U6OlRpbWVEZWx0YSBwcmVyb2xsX3RpbWVzdGFtcF87CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgLy8gS2VlcCB0cmFjayBvZiB0aGUgb3V0cHV0IG1vZGUgd2UgYXJlIHN1cHBvc2VkIHRvIG91dHB1dCB0by4KKyAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlXzsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgbWVkaWEKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmggYi9zcmMvbWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oCmluZGV4IGQ4Mjg0MjAuLmY1YjYxMjIgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgKKysrIGIvc3JjL21lZGlhL2Jhc2UvdmlkZW9fZGVjb2Rlcl9jb25maWcuaApAQCAtMTUzLDYgKzE1Myw4IEBACiAgICAgcmV0dXJuIHdlYm1fY29sb3JfbWV0YWRhdGFfOwogICB9CiAKKyAgY29uc3QgQ29sb3JTcGFjZSYgY29sb3Jfc3BhY2UoKSBjb25zdCB7IHJldHVybiBjb2xvcl9zcGFjZV87IH0KKwogIHByaXZhdGU6CiAgIFZpZGVvQ29kZWMgY29kZWNfOwogICBWaWRlb0NvZGVjUHJvZmlsZSBwcm9maWxlXzsKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9kZWNyeXB0aW5nX2RlbXV4ZXJfc3RyZWFtLmNjCmluZGV4IGNkZjNjMjYuLmY5ODAzY2EgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9maWx0ZXJzL2RlY3J5cHRpbmdfZGVtdXhlcl9zdHJlYW0uY2MKKysrIGIvc3JjL21lZGlhL2ZpbHRlcnMvZGVjcnlwdGluZ19kZW11eGVyX3N0cmVhbS5jYwpAQCAtMTAsMTIgKzEwLDEyIEBACiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3BfcHJveHkuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2F1ZGlvX2RlY29kZXJfY29uZmlnLmgiCi0jaW5jbHVkZSAibWVkaWEvYmFzZS92aWRlb19kZWNvZGVyX2NvbmZpZy5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvYmluZF90b19sb29wLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9kZWNvZGVyX2J1ZmZlci5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvZGVjcnlwdG9yLmgiCiAjaW5jbHVkZSAibWVkaWEvYmFzZS9kZW11eGVyX3N0cmVhbS5oIgogI2luY2x1ZGUgIm1lZGlhL2Jhc2UvcGlwZWxpbmUuaCIKKyNpbmNsdWRlICJtZWRpYS9iYXNlL3ZpZGVvX2RlY29kZXJfY29uZmlnLmgiCiAjaWYgZGVmaW5lZChfX0xCX1NIRUxMX18pIHx8IGRlZmluZWQoQ09CQUxUKQogI2luY2x1ZGUgIm1lZGlhL2Jhc2Uvc2hlbGxfbWVkaWFfc3RhdGlzdGljcy5oIgogI2VuZGlmCkBAIC0zNTgsNyArMzU4LDE2IEBACiAgICAgICBjb25zdCBWaWRlb0RlY29kZXJDb25maWcmIGlucHV0X3ZpZGVvX2NvbmZpZyA9CiAgICAgICAgICAgc3RyZWFtLT52aWRlb19kZWNvZGVyX2NvbmZpZygpOwogICAgICAgdmlkZW9fY29uZmlnXy5yZXNldChuZXcgVmlkZW9EZWNvZGVyQ29uZmlnKCkpOwotICAgICAgdmlkZW9fY29uZmlnXy0+Q29weUZyb20oaW5wdXRfdmlkZW9fY29uZmlnKTsKKyAgICAgIHZpZGVvX2NvbmZpZ18tPkluaXRpYWxpemUoCisgICAgICAgICAgaW5wdXRfdmlkZW9fY29uZmlnLmNvZGVjKCksIGlucHV0X3ZpZGVvX2NvbmZpZy5wcm9maWxlKCksCisgICAgICAgICAgaW5wdXRfdmlkZW9fY29uZmlnLmZvcm1hdCgpLCBpbnB1dF92aWRlb19jb25maWcuY29sb3Jfc3BhY2UoKSwKKyAgICAgICAgICBpbnB1dF92aWRlb19jb25maWcuY29kZWRfc2l6ZSgpLCBpbnB1dF92aWRlb19jb25maWcudmlzaWJsZV9yZWN0KCksCisgICAgICAgICAgaW5wdXRfdmlkZW9fY29uZmlnLm5hdHVyYWxfc2l6ZSgpLCBpbnB1dF92aWRlb19jb25maWcuZXh0cmFfZGF0YSgpLAorICAgICAgICAgIGlucHV0X3ZpZGVvX2NvbmZpZy5leHRyYV9kYXRhX3NpemUoKSwKKyAgICAgICAgICBmYWxzZSwgIC8vIE91dHB1dCB2aWRlbyBpcyBub3QgZW5jcnlwdGVkLgorICAgICAgICAgIGZhbHNlKTsKKyAgICAgIHZpZGVvX2NvbmZpZ18tPnNldF93ZWJtX2NvbG9yX21ldGFkYXRhKAorICAgICAgICAgIGlucHV0X3ZpZGVvX2NvbmZpZy53ZWJtX2NvbG9yX21ldGFkYXRhKCkpOwogICAgICAgYnJlYWs7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9zdGFyYm9hcmQuY2MgYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9zdGFyYm9hcmQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGM5ZGNlYQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2F1ZGlvX3JlbmRlcmVyX3N0YXJib2FyZC5jYwpAQCAtMCwwICsxLDI5IEBACisvKg0KKyAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorICoNCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0DQorICoNCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorICoNCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlDQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kDQorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorICovDQorDQorI2luY2x1ZGUgIm1lZGlhL2ZpbHRlcnMvc2hlbGxfYXVkaW9fcmVuZGVyZXIuaCINCisNCituYW1lc3BhY2UgbWVkaWEgew0KKw0KKy8vIHN0YXRpYw0KK1NoZWxsQXVkaW9SZW5kZXJlciogU2hlbGxBdWRpb1JlbmRlcmVyOjpDcmVhdGUoDQorICAgIG1lZGlhOjpBdWRpb1JlbmRlcmVyU2luayogc2luaywNCisgICAgY29uc3QgU2V0RGVjcnlwdG9yUmVhZHlDQiYgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiwNCisgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxiYXNlOjpNZXNzYWdlTG9vcFByb3h5PiYgbWVzc2FnZV9sb29wKSB7DQorICByZXR1cm4gTlVMTDsNCit9DQorDQorfSAgLy8gbmFtZXNwYWNlIG1lZGlhDQpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5jYyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuY2MKaW5kZXggM2QxODg4OC4uMzJkN2FiNyAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5jYworKysgYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9kZW11eGVyLmNjCkBAIC0xODcsNyArMTg3LDcgQEAKIC8vCiBTaGVsbERlbXV4ZXI6OlNoZWxsRGVtdXhlcigKICAgICBjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxEYXRhU291cmNlPiYgZGF0YV9zb3VyY2UpCisgICAgRGF0YVNvdXJjZSogZGF0YV9zb3VyY2UpCiAgICAgOiBtZXNzYWdlX2xvb3BfKG1lc3NhZ2VfbG9vcCksCiAgICAgICBob3N0XyhOVUxMKSwKICAgICAgIGJsb2NraW5nX3RocmVhZF8oIlNoZWxsRGVtdXhlckJsb2NraW5nVGhyZWFkIiksCmRpZmYgLS1naXQgYS9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9kZW11eGVyLmggYi9zcmMvbWVkaWEvZmlsdGVycy9zaGVsbF9kZW11eGVyLmgKaW5kZXggODg2ZjdmYy4uN2ZjMzgxZSAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc2hlbGxfZGVtdXhlci5oCisrKyBiL3NyYy9tZWRpYS9maWx0ZXJzL3NoZWxsX2RlbXV4ZXIuaApAQCAtODgsNyArODgsNyBAQAogY2xhc3MgTUVESUFfRVhQT1JUIFNoZWxsRGVtdXhlciA6IHB1YmxpYyBEZW11eGVyIHsKICBwdWJsaWM6CiAgIFNoZWxsRGVtdXhlcihjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiBtZXNzYWdlX2xvb3AsCi0gICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPERhdGFTb3VyY2U+JiBkYXRhX3NvdXJjZSk7CisgICAgICAgICAgICAgICBEYXRhU291cmNlKiBkYXRhX3NvdXJjZSk7CiAgIHZpcnR1YWwgflNoZWxsRGVtdXhlcigpOwogCiAgIC8vIERlbXV4ZXIgaW1wbGVtZW50YXRpb24uCkBAIC0xNDAsNyArMTQwLDcgQEAKIAogICAvLyBUaHJlYWQgb24gd2hpY2ggYWxsIGJsb2NraW5nIG9wZXJhdGlvbnMgYXJlIGV4ZWN1dGVkLgogICBiYXNlOjpUaHJlYWQgYmxvY2tpbmdfdGhyZWFkXzsKLSAgc2NvcGVkX3JlZnB0cjxEYXRhU291cmNlPiBkYXRhX3NvdXJjZV87CisgIERhdGFTb3VyY2UqIGRhdGFfc291cmNlXzsKICAgc2NvcGVkX3JlZnB0cjxTaGVsbERhdGFTb3VyY2VSZWFkZXI+IHJlYWRlcl87CiAKICAgYm9vbCBzdG9wcGVkXzsKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9maWx0ZXJzL3NvdXJjZV9idWZmZXJfc3RyZWFtLmNjIGIvc3JjL21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uY2MKaW5kZXggMjViY2ZlMi4uZGZkMTU5NiAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uY2MKKysrIGIvc3JjL21lZGlhL2ZpbHRlcnMvc291cmNlX2J1ZmZlcl9zdHJlYW0uY2MKQEAgLTQyNywxMCArNDI3LDkgQEAKICAgRENIRUNLKCFidWZmZXJzLmVtcHR5KCkpOwogICBEQ0hFQ0sobWVkaWFfc2VnbWVudF9zdGFydF90aW1lXyAhPSBrTm9UaW1lc3RhbXAoKSk7CiAKLSAgLy8gTmV3IG1lZGlhIHNlZ21lbnRzIG11c3QgYmVnaW4gd2l0aCBhIGtleWZyYW1lLgorICAvLyBMb2cgaWYgbmV3IG1lZGlhIHNlZ21lbnQgZG9lc24ndCBiZWdpbiB3aXRoIGEga2V5ZnJhbWUuCiAgIGlmIChuZXdfbWVkaWFfc2VnbWVudF8gJiYgIWJ1ZmZlcnMuZnJvbnQoKS0+SXNLZXlmcmFtZSgpKSB7CiAgICAgTUVESUFfTE9HKGxvZ19jYl8pIDw8ICJNZWRpYSBzZWdtZW50IGRpZCBub3QgYmVnaW4gd2l0aCBrZXlmcmFtZS4iOwotICAgIHJldHVybiBmYWxzZTsKICAgfQogCiAgIC8vIEJ1ZmZlcnMgd2l0aGluIGEgbWVkaWEgc2VnbWVudCBzaG91bGQgYmUgbW9ub3RvbmljYWxseSBpbmNyZWFzaW5nLgpAQCAtMTI1Miw3ICsxMjUxLDYgQEAKICAgICAgIGludGVyYnVmZmVyX2Rpc3RhbmNlX2NiXyhpbnRlcmJ1ZmZlcl9kaXN0YW5jZV9jYiksCiAgICAgICBzaXplX2luX2J5dGVzXygwKSB7CiAgIERDSEVDSyghbmV3X2J1ZmZlcnMuZW1wdHkoKSk7Ci0gIERDSEVDSyhuZXdfYnVmZmVycy5mcm9udCgpLT5Jc0tleWZyYW1lKCkpOwogICBEQ0hFQ0soIWludGVyYnVmZmVyX2Rpc3RhbmNlX2NiLmlzX251bGwoKSk7CiAgIEFwcGVuZEJ1ZmZlcnNUb0VuZChuZXdfYnVmZmVycyk7CiB9CkBAIC0xMjY4LDcgKzEyNjYsNiBAQAogICAgICAgaW50ZXJidWZmZXJfZGlzdGFuY2VfY2JfKGludGVyYnVmZmVyX2Rpc3RhbmNlX2NiKSwKICAgICAgIHNpemVfaW5fYnl0ZXNfKDApIHsKICAgRENIRUNLKCFuZXdfYnVmZmVycy5lbXB0eSgpKTsKLSAgRENIRUNLKG5ld19idWZmZXJzLmZyb250KCktPklzS2V5ZnJhbWUoKSk7CiAgIERDSEVDSyghaW50ZXJidWZmZXJfZGlzdGFuY2VfY2IuaXNfbnVsbCgpKTsKICAgQXBwZW5kQnVmZmVyc1RvRW5kKG5ld19idWZmZXJzKTsKIH0KZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9tZWRpYS5neXAgYi9zcmMvbWVkaWEvbWVkaWEuZ3lwCmluZGV4IGU5YWY4ZGUuLjk0NjkyMDMgMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9tZWRpYS5neXAKKysrIGIvc3JjL21lZGlhL21lZGlhLmd5cApAQCAtNzMzLDE1ICs3MzMsMTYgQEAKICAgICAgICAgICAgICAgICAnYXVkaW8vc2hlbGxfYXVkaW9fc3RyZWFtZXJfc3RhcmJvYXJkLmNjJywKICAgICAgICAgICAgICAgICAnYmFzZS9kZWNvZGVyX2J1ZmZlcl9jYWNoZS5jYycsCiAgICAgICAgICAgICAgICAgJ2Jhc2UvZGVjb2Rlcl9idWZmZXJfY2FjaGUuaCcsCisgICAgICAgICAgICAgICAgJ2Jhc2Uvc2JwbGF5ZXJfcGlwZWxpbmUuY2MnLAogICAgICAgICAgICAgICAgICdiYXNlL3NicGxheWVyX3NldF9ib3VuZHNfaGVscGVyLmNjJywKICAgICAgICAgICAgICAgICAnYmFzZS9zYnBsYXllcl9zZXRfYm91bmRzX2hlbHBlci5oJywKLSAgICAgICAgICAgICAgICAnYmFzZS9zYnBsYXllcl9waXBlbGluZS5jYycsCiAgICAgICAgICAgICAgICAgJ2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5jYycsCiAgICAgICAgICAgICAgICAgJ2Jhc2Uvc3RhcmJvYXJkX3BsYXllci5oJywKICAgICAgICAgICAgICAgICAnYmFzZS9zdGFyYm9hcmRfdXRpbHMuY2MnLAogICAgICAgICAgICAgICAgICdiYXNlL3N0YXJib2FyZF91dGlscy5oJywKICAgICAgICAgICAgICAgICAnY3J5cHRvL3N0YXJib2FyZF9kZWNyeXB0b3IuY2MnLAogICAgICAgICAgICAgICAgICdjcnlwdG8vc3RhcmJvYXJkX2RlY3J5cHRvci5oJywKKyAgICAgICAgICAgICAgICAnZmlsdGVycy9zaGVsbF9hdWRpb19yZW5kZXJlcl9zdGFyYm9hcmQuY2MnLAogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgICAnc291cmNlcy8nOiBbCiAgICAgICAgICAgICAgICAgWydleGNsdWRlJywgJ15iYXNlL3BpcGVsaW5lX2ltcGwuY2MnXSwKZGlmZiAtLWdpdCBhL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllci5oIGIvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgKaW5kZXggNmI5NzE2MS4uN2U3MGFhOSAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgKKysrIGIvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyLmgKQEAgLTE0LDYgKzE0LDcgQEAKICNpbmNsdWRlICJiYXNlL2NvbXBpbGVyX3NwZWNpZmljLmgiCiAjaW5jbHVkZSAiYmFzZS9sb2dnaW5nLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvd2Vha19wdHIuaCIKICNpbmNsdWRlICJiYXNlL3RpbWUuaCIKICNpbmNsdWRlICJnb29nbGV1cmwvc3JjL2d1cmwuaCIKQEAgLTgzLDEwICs4NCw5IEBACiAgIHZpcnR1YWwgfldlYk1lZGlhUGxheWVyKCkge30KIAogICB2aXJ0dWFsIHZvaWQgTG9hZE1lZGlhU291cmNlKCkgPSAwOwotICB2aXJ0dWFsIHZvaWQgTG9hZFByb2dyZXNzaXZlKAotICAgICAgY29uc3QgR1VSTCYgdXJsLAotICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXJlZERhdGFTb3VyY2U+JiBkYXRhX3NvdXJjZSwKLSAgICAgIENPUlNNb2RlIGNvcnNfbW9kZSkgPSAwOworICB2aXJ0dWFsIHZvaWQgTG9hZFByb2dyZXNzaXZlKGNvbnN0IEdVUkwmIHVybCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09SU01vZGUgY29yc19tb2RlKSA9IDA7CiAgIHZpcnR1YWwgdm9pZCBDYW5jZWxMb2FkKCkgPSAwOwogCiAgIC8vIFBsYXliYWNrIGNvbnRyb2xzLgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuY2MgYi9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5jYwppbmRleCAyNDQwYzYyLi42NGNhNDM0IDEwMDY0NAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5jYworKysgYi9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5jYwpAQCAtMTYxLDE3ICsxNjEsMTAgQEAKICAgZmlsdGVyX2NvbGxlY3Rpb25fLT5BZGRWaWRlb1JlbmRlcmVyKHZpZGVvX3JlbmRlcmVyKTsKICAgcHJveHlfLT5zZXRfZnJhbWVfcHJvdmlkZXIodmlkZW9fcmVuZGVyZXIpOwogCi0jaWYgZGVmaW5lZChDT0JBTFRfVVNFX1BVTkNIT1VUKQotICAvLyBUaGUgc2l6ZSBwYXNzZWQgdG8gQ3JlYXRlUHVuY2hPdXRGcmFtZSBpcyB1c2VkIHRvIHBhc3MgdGhlIG5hdHVyYWwgc2l6ZSBvZgotICAvLyB0aGUgdmlkZW8gdG8gdGhlIHBpcGVsaW5lLiBUaGUgcGlwZWxpbmUgYWxyZWFkeSBnZXRzIHRoZSBuYXR1cmFsIHNpemUgb2YKLSAgLy8gdGhlIHZpZGVvIGZyb20gdGhlIHVuZGVybHlpbmcgcGxheWVyIHNvIHdlIHNldCB0aGlzIHRvIGdmeDo6U2l6ZSgpIHRvIGF2b2lkCi0gIC8vIHByb3BhZ2F0aW5nIHRoZSBmcmFtZSBzaXplIHRocm91Z2ggdGhlIG1lZGlhIHN0YWNrLgotICBwdW5jaF9vdXRfdmlkZW9fZnJhbWVfID0gVmlkZW9GcmFtZTo6Q3JlYXRlUHVuY2hPdXRGcmFtZShnZng6OlNpemUoKSk7Ci0jZWxzZSAgIC8vIGRlZmluZWQoQ09CQUxUX1VTRV9QVU5DSE9VVCkKLSAgRENIRUNLKGF1ZGlvX3JlbmRlcmVyX3NpbmspOwotICBmaWx0ZXJfY29sbGVjdGlvbl8tPkFkZEF1ZGlvUmVuZGVyZXIoU2hlbGxBdWRpb1JlbmRlcmVyOjpDcmVhdGUoCi0gICAgICBhdWRpb19yZW5kZXJlcl9zaW5rLCBzZXRfZGVjcnlwdG9yX3JlYWR5X2NiLCBwaXBlbGluZV9tZXNzYWdlX2xvb3ApKTsKLSNlbmRpZiAgLy8gZGVmaW5lZChDT0JBTFRfVVNFX1BVTkNIT1VUKQorICBpZiAoYXVkaW9fcmVuZGVyZXJfc2luaykgeworICAgIGZpbHRlcl9jb2xsZWN0aW9uXy0+QWRkQXVkaW9SZW5kZXJlcihTaGVsbEF1ZGlvUmVuZGVyZXI6OkNyZWF0ZSgKKyAgICAgICAgYXVkaW9fcmVuZGVyZXJfc2luaywgc2V0X2RlY3J5cHRvcl9yZWFkeV9jYiwgcGlwZWxpbmVfbWVzc2FnZV9sb29wKSk7CisgIH0KIAogICBpZiAodmlkZW9fZnJhbWVfcHJvdmlkZXJfKSB7CiAgICAgbWVkaWFfdGltZV9hbmRfc2Vla2luZ19zdGF0ZV9jYl8gPQpAQCAtMjg2LDcgKzI3OSw3IEBACiAKIHZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpMb2FkUHJvZ3Jlc3NpdmUoCiAgICAgY29uc3QgR1VSTCYgdXJsLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyZWREYXRhU291cmNlPiYgZGF0YV9zb3VyY2UsCisgICAgc2NvcGVkX3B0cjxCdWZmZXJlZERhdGFTb3VyY2U+IGRhdGFfc291cmNlLAogICAgIENPUlNNb2RlIGNvcnNfbW9kZSkgewogICBEQ0hFQ0tfRVEobWFpbl9sb29wXywgTWVzc2FnZUxvb3A6OmN1cnJlbnQoKSk7CiAgIERDSEVDSyhmaWx0ZXJfY29sbGVjdGlvbl8pOwpAQCAtMzAzLDcgKzI5Niw3IEBACiAgIHNjb3BlZF9yZWZwdHI8YmFzZTo6TWVzc2FnZUxvb3BQcm94eT4gbWVzc2FnZV9sb29wID0KICAgICAgIG1lc3NhZ2VfbG9vcF9mYWN0b3J5Xy0+R2V0TWVzc2FnZUxvb3AoTWVzc2FnZUxvb3BGYWN0b3J5OjprUGlwZWxpbmUpOwogCi0gIHByb3h5Xy0+c2V0X2RhdGFfc291cmNlKGRhdGFfc291cmNlKTsKKyAgcHJveHlfLT5zZXRfZGF0YV9zb3VyY2UoZGF0YV9zb3VyY2UuUGFzcygpKTsKIAogICBpc19sb2NhbF9zb3VyY2VfID0gIXVybC5TY2hlbWVJcygiaHR0cCIpICYmICF1cmwuU2NoZW1lSXMoImh0dHBzIik7CiAKQEAgLTYwNiwyNSArNTk5LDExIEBACiAgIGlmICh2aWRlb19mcmFtZV9wcm92aWRlcl8pIHsKICAgICByZXR1cm4gdmlkZW9fZnJhbWVfcHJvdmlkZXJfLT5HZXRDdXJyZW50RnJhbWUoKTsKICAgfQotI2lmIGRlZmluZWQoQ09CQUxUX1VTRV9QVU5DSE9VVCkKLSAgLy8gV2Ugd2FudCB0byBnaXZlIHByb3h5XyBhIGNoYW5jZSB0byBwcm9kdWNlIGEgdmFsaWQgZnJhbWUgYmVmb3JlIHJldHVybmluZwotICAvLyB0aGUgcHVuY2ggb3V0IGZyYW1lCi0gIHJldHVybiBwdW5jaF9vdXRfdmlkZW9fZnJhbWVfOwotI2Vsc2UgICAvLyBkZWZpbmVkKENPQkFMVF9VU0VfUFVOQ0hPVVQpCiAgIHJldHVybiBOVUxMOwotI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9VU0VfUFVOQ0hPVVQpCiB9CiAKIHZvaWQgV2ViTWVkaWFQbGF5ZXJJbXBsOjpQdXRDdXJyZW50RnJhbWUoCiAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgdmlkZW9fZnJhbWUpIHsKLSNpZiBkZWZpbmVkKENPQkFMVF9VU0VfUFVOQ0hPVVQpCi0gIGlmICh2aWRlb19mcmFtZSA9PSBwdW5jaF9vdXRfdmlkZW9fZnJhbWVfKSB7Ci0gICAgLy8gVGhpcyBoYXBwZW5zIHdoZW4gcHJveHlfIHJldHVybnMgTlVMTCBpbiBnZXRDdXJyZW50RnJhbWUoKSBzbyB3ZSBtYWtlCi0gICAgLy8gc3VyZSB0aGF0IGl0IGdldHMgYSBOVUxMIGJhY2sgYXMgd2VsbAotICAgIHByb3h5Xy0+UHV0Q3VycmVudEZyYW1lKE5VTEwpOwotICAgIHJldHVybjsKLSAgfQotI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9VU0VfUFVOQ0hPVVQpCiAgIGlmICh2aWRlb19mcmFtZSkgewogICAgIHByb3h5Xy0+UHV0Q3VycmVudEZyYW1lKHZpZGVvX2ZyYW1lKTsKICAgfSBlbHNlIHsKQEAgLTk4Niw2ICs5NjUsMTAgQEAKIAogICBzd2l0Y2ggKGJ1ZmZlcmluZ19zdGF0ZSkgewogICAgIGNhc2UgUGlwZWxpbmU6OmtIYXZlTWV0YWRhdGE6CisgICAgICB2aWRlb19mcmFtZV9wcm92aWRlcl8tPlNldE91dHB1dE1vZGUoCisgICAgICAgICAgKHBpcGVsaW5lXy0+SXNQdW5jaE91dE1vZGUoKSA/CisgICAgICAgICAgICAgICBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6a091dHB1dE1vZGVQdW5jaE91dCA6CisgICAgICAgICAgICAgICBTaGVsbFZpZGVvRnJhbWVQcm92aWRlcjo6a091dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUpKTsKICAgICAgIFNldFJlYWR5U3RhdGUoV2ViTWVkaWFQbGF5ZXI6OmtSZWFkeVN0YXRlSGF2ZU1ldGFkYXRhKTsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgUGlwZWxpbmU6OmtQcmVyb2xsQ29tcGxldGVkOgpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuaCBiL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9pbXBsLmgKaW5kZXggNmIxZGI3NS4uZDIxMTc3NiAxMDA2NDQKLS0tIGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX2ltcGwuaAorKysgYi9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfaW1wbC5oCkBAIC03MSw3ICs3MSw2IEBACiAjaWYgZGVmaW5lZChPU19TVEFSQk9BUkQpCiAKICNpZiBTQl9IQVMoUExBWUVSKQotI2RlZmluZSBDT0JBTFRfVVNFX1BVTkNIT1VUCiAjZGVmaW5lIENPQkFMVF9TS0lQX1NFRUtfUkVRVUVTVF9ORUFSX0VORAogI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKQogCkBAIC0xMTksNyArMTE4LDcgQEAKIAogICB2b2lkIExvYWRNZWRpYVNvdXJjZSgpIE9WRVJSSURFOwogICB2b2lkIExvYWRQcm9ncmVzc2l2ZShjb25zdCBHVVJMJiB1cmwsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyZWREYXRhU291cmNlPiYgZGF0YV9zb3VyY2UsCisgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlZF9wdHI8QnVmZmVyZWREYXRhU291cmNlPiBkYXRhX3NvdXJjZSwKICAgICAgICAgICAgICAgICAgICAgICAgQ09SU01vZGUgY29yc19tb2RlKSBPVkVSUklERTsKICAgdm9pZCBDYW5jZWxMb2FkKCkgT1ZFUlJJREU7CiAKQEAgLTI5MiwxMCArMjkxLDYgQEAKICAgc2NvcGVkX3B0cjxGaWx0ZXJDb2xsZWN0aW9uPiBmaWx0ZXJfY29sbGVjdGlvbl87CiAgIHNjb3BlZF9yZWZwdHI8UGlwZWxpbmU+IHBpcGVsaW5lXzsKIAotI2lmIGRlZmluZWQoQ09CQUxUX1VTRV9QVU5DSE9VVCkKLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBwdW5jaF9vdXRfdmlkZW9fZnJhbWVfOwotI2VuZGlmICAvLyBkZWZpbmVkKENPQkFMVF9VU0VfUFVOQ0hPVVQpCi0KICAgLy8gVGhlIGN1cnJlbnRseSBzZWxlY3RlZCBrZXkgc3lzdGVtLiBFbXB0eSBzdHJpbmcgbWVhbnMgdGhhdCBubyBrZXkgc3lzdGVtCiAgIC8vIGhhcyBiZWVuIHNlbGVjdGVkLgogICBzdGQ6OnN0cmluZyBjdXJyZW50X2tleV9zeXN0ZW1fOwpkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX3Byb3h5LmNjIGIvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX3Byb3h5LmNjCmluZGV4IDliNGFhMjguLjllYmVjNDggMTAwNjQ0Ci0tLSBhL3NyYy9tZWRpYS9wbGF5ZXIvd2ViX21lZGlhX3BsYXllcl9wcm94eS5jYworKysgYi9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuY2MKQEAgLTY5LDcgKzY5LDcgQEAKIHZvaWQgV2ViTWVkaWFQbGF5ZXJQcm94eTo6RGV0YWNoKCkgewogICBEQ0hFQ0socmVuZGVyX2xvb3BfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogICB3ZWJtZWRpYXBsYXllcl8gPSBOVUxMOwotICBkYXRhX3NvdXJjZV8gPSBOVUxMOworICBkYXRhX3NvdXJjZV8ucmVzZXQoKTsKICAgZnJhbWVfcHJvdmlkZXJfID0gTlVMTDsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL21lZGlhL3BsYXllci93ZWJfbWVkaWFfcGxheWVyX3Byb3h5LmggYi9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuaAppbmRleCBkMWE4MjBlLi5mYzA3YmE4IDEwMDY0NAotLS0gYS9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuaAorKysgYi9zcmMvbWVkaWEvcGxheWVyL3dlYl9tZWRpYV9wbGF5ZXJfcHJveHkuaApAQCAtMTEsNiArMTEsNyBAQAogCiAjaW5jbHVkZSAiYmFzZS9iaW5kLmgiCiAjaW5jbHVkZSAiYmFzZS9tZW1vcnkvcmVmX2NvdW50ZWQuaCIKKyNpbmNsdWRlICJiYXNlL21lbW9yeS9zY29wZWRfcHRyLmgiCiAjaW5jbHVkZSAiYmFzZS9tZXNzYWdlX2xvb3AuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL2RlY3J5cHRvcl9jbGllbnQuaCIKICNpbmNsdWRlICJtZWRpYS9iYXNlL3BpcGVsaW5lLmgiCkBAIC0zOSwxMSArNDAsOSBAQAogIHB1YmxpYzoKICAgV2ViTWVkaWFQbGF5ZXJQcm94eShjb25zdCBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+JiByZW5kZXJfbG9vcCwKICAgICAgICAgICAgICAgICAgICAgICBXZWJNZWRpYVBsYXllckltcGwqIHdlYm1lZGlhcGxheWVyKTsKLSAgY29uc3Qgc2NvcGVkX3JlZnB0cjxCdWZmZXJlZERhdGFTb3VyY2U+JiBkYXRhX3NvdXJjZSgpIHsKLSAgICByZXR1cm4gZGF0YV9zb3VyY2VfOwotICB9Ci0gIHZvaWQgc2V0X2RhdGFfc291cmNlKGNvbnN0IHNjb3BlZF9yZWZwdHI8QnVmZmVyZWREYXRhU291cmNlPiYgZGF0YV9zb3VyY2UpIHsKLSAgICBkYXRhX3NvdXJjZV8gPSBkYXRhX3NvdXJjZTsKKyAgQnVmZmVyZWREYXRhU291cmNlKiBkYXRhX3NvdXJjZSgpIHsgcmV0dXJuIGRhdGFfc291cmNlXy5nZXQoKTsgfQorICB2b2lkIHNldF9kYXRhX3NvdXJjZShzY29wZWRfcHRyPEJ1ZmZlcmVkRGF0YVNvdXJjZT4gZGF0YV9zb3VyY2UpIHsKKyAgICBkYXRhX3NvdXJjZV8gPSBkYXRhX3NvdXJjZS5QYXNzKCk7CiAgIH0KIAogICAvLyBUT0RPKHNjaGVya3VzKTogcmVtb3ZlIHRoaXMgb25jZSBWaWRlb1JlbmRlcmVyQmFzZTo6UGFpbnRDQiBwYXNzZXMKQEAgLTExMCw3ICsxMDksNyBAQAogICBzY29wZWRfcmVmcHRyPGJhc2U6Ok1lc3NhZ2VMb29wUHJveHk+IHJlbmRlcl9sb29wXzsKICAgV2ViTWVkaWFQbGF5ZXJJbXBsKiB3ZWJtZWRpYXBsYXllcl87CiAKLSAgc2NvcGVkX3JlZnB0cjxCdWZmZXJlZERhdGFTb3VyY2U+IGRhdGFfc291cmNlXzsKKyAgc2NvcGVkX3B0cjxCdWZmZXJlZERhdGFTb3VyY2U+IGRhdGFfc291cmNlXzsKICAgc2NvcGVkX3JlZnB0cjxWaWRlb1JlbmRlcmVyQmFzZT4gZnJhbWVfcHJvdmlkZXJfOwogICBTa0NhbnZhc1ZpZGVvUmVuZGVyZXIgdmlkZW9fcmVuZGVyZXJfOwogCmRpZmYgLS1naXQgYS9zcmMvbmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyX2hlbHBlcnMuaCBiL3NyYy9uYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaGVscGVycy5oCmluZGV4IGQ3MDMxNGEuLjRkNjAxZDYgMTAwNjQ0Ci0tLSBhL3NyYy9uYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaGVscGVycy5oCisrKyBiL3NyYy9uYi9hbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaGVscGVycy5oCkBAIC0yMyw2ICsyMyw4IEBACiAjaW5jbHVkZSAibmIvYW5hbHl0aWNzL21lbW9yeV90cmFja2VyLmgiCiAjaW5jbHVkZSAibmIvYXRvbWljLmgiCiAjaW5jbHVkZSAibmIvc2ltcGxlX3RocmVhZC5oIgorI2luY2x1ZGUgIm5iL3RocmVhZF9sb2NhbF9ib29sZWFuLmgiCisjaW5jbHVkZSAibmIvdGhyZWFkX2xvY2FsX3BvaW50ZXIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGhyZWFkLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3R5cGVzLmgiCkBAIC0zNCw1OCArMzYsNiBAQAogY2xhc3MgQWxsb2NhdGlvbkdyb3VwOwogY2xhc3MgQWxsb2NhdGlvblJlY29yZDsKIAotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1jbGFzcyBUaHJlYWRMb2NhbFBvaW50ZXIgewotIHB1YmxpYzoKLSAgVGhyZWFkTG9jYWxQb2ludGVyKCkgewotICAgIHNsb3RfID0gU2JUaHJlYWRDcmVhdGVMb2NhbEtleShOVUxMKTsgIC8vIE5vIGRlc3RydWN0b3IgZm9yIHBvaW50ZXIuCi0gICAgU0JfRENIRUNLKGtTYlRocmVhZExvY2FsS2V5SW52YWxpZCAhPSBzbG90Xyk7Ci0gIH0KLQotICB+VGhyZWFkTG9jYWxQb2ludGVyKCkgeyBTYlRocmVhZERlc3Ryb3lMb2NhbEtleShzbG90Xyk7IH0KLQotICBUeXBlKiBHZXQoKSBjb25zdCB7Ci0gICAgdm9pZCogcHRyID0gU2JUaHJlYWRHZXRMb2NhbFZhbHVlKHNsb3RfKTsKLSAgICBUeXBlKiB0eXBlX3B0ciA9IHN0YXRpY19jYXN0PFR5cGUqPihwdHIpOwotICAgIHJldHVybiB0eXBlX3B0cjsKLSAgfQotCi0gIHZvaWQgU2V0KFR5cGUqIHB0cikgewotICAgIHZvaWQqIHZvaWRfcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KHB0cik7Ci0gICAgU2JUaHJlYWRTZXRMb2NhbFZhbHVlKHNsb3RfLCB2b2lkX3B0cik7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFNiVGhyZWFkTG9jYWxLZXkgc2xvdF87Ci0gIFNCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUaHJlYWRMb2NhbFBvaW50ZXI8VHlwZT4pOwotfTsKLQotY2xhc3MgVGhyZWFkTG9jYWxCb29sZWFuIHsKLSBwdWJsaWM6Ci0gIFRocmVhZExvY2FsQm9vbGVhbigpIDogZGVmYXVsdF92YWx1ZV8oZmFsc2UpIHt9Ci0gIGV4cGxpY2l0IFRocmVhZExvY2FsQm9vbGVhbihib29sIGRlZmF1bHRfdmFsdWUpCi0gICAgICA6IGRlZmF1bHRfdmFsdWVfKGRlZmF1bHRfdmFsdWUpIHt9Ci0gIH5UaHJlYWRMb2NhbEJvb2xlYW4oKSB7fQotCi0gIGJvb2wgR2V0KCkgY29uc3QgewotICAgIGJvb2wgdmFsID0gdGxwXy5HZXQoKSAhPSBOVUxMOwotICAgIHJldHVybiB2YWwgXiBkZWZhdWx0X3ZhbHVlXzsKLSAgfQotCi0gIHZvaWQgU2V0KGJvb2wgdmFsKSB7Ci0gICAgdmFsID0gdmFsIF4gZGVmYXVsdF92YWx1ZV87Ci0gICAgdGxwXy5TZXQodmFsID8gVHJ1ZVBvaW50ZXIoKSA6IEZhbHNlUG9pbnRlcigpKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIHZvaWQqIFRydWVQb2ludGVyKCkgeyByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oMHgxKTsgfQotICBzdGF0aWMgdm9pZCogRmFsc2VQb2ludGVyKCkgeyByZXR1cm4gTlVMTDsgfQotICBUaHJlYWRMb2NhbFBvaW50ZXI8dm9pZD4gdGxwXzsKLSAgY29uc3QgYm9vbCBkZWZhdWx0X3ZhbHVlXzsKLQotICBTQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oVGhyZWFkTG9jYWxCb29sZWFuKTsKLX07Ci0KIC8vIEFuIEFsbG9jYXRpb25Hcm91cCBpcyBhIGNvbGxlY3Rpb24gb2YgYWxsb2NhdGlvbnMgdGhhdCBhcmUgbG9naWNhbGx5IGx1bXBlZAogLy8gdG9nZXRoZXIsIHN1Y2ggYXMgIkphdmFzY3JpcHQiIG9yICJHcmFwaGljcyIuCiBjbGFzcyBBbGxvY2F0aW9uR3JvdXAgewpkaWZmIC0tZ2l0IGEvc3JjL25iL2JpdF9jYXN0LmggYi9zcmMvbmIvYml0X2Nhc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZGFjNmZiCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL25iL2JpdF9jYXN0LmgKQEAgLTAsMCArMSw3OCBAQAorLy8gQ29weXJpZ2h0IChjKSAyMDExIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLg0KKy8vIFVzZSBvZiB0aGlzIHNvdXJjZSBjb2RlIGlzIGdvdmVybmVkIGJ5IGEgQlNELXN0eWxlIGxpY2Vuc2UgdGhhdCBjYW4gYmUNCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLg0KKw0KKy8qDQorKiBNb2RpZmljYXRpb25zIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuDQorKg0KKyogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7DQorKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuDQorKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQNCisqDQorKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wDQorKg0KKyogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQ0KKyogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywNCisqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLg0KKyogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZA0KKyogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuDQorKi8KKworI2lmbmRlZiBOQl9CSVRfQ0FTVF9IXworI2RlZmluZSBOQl9CSVRfQ0FTVF9IXworCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisKK25hbWVzcGFjZSBuYiB7CisKKy8vIGJpdF9jYXN0PERlc3QsU291cmNlPiBpcyBhIHRlbXBsYXRlIGZ1bmN0aW9uIHRoYXQgaW1wbGVtZW50cyB0aGUKKy8vIGVxdWl2YWxlbnQgb2YgIipyZWludGVycHJldF9jYXN0PERlc3QqPigmc291cmNlKSIuICBXZSBuZWVkIHRoaXMgaW4KKy8vIHZlcnkgbG93LWxldmVsIGZ1bmN0aW9ucyBsaWtlIGhhc2hpbmcgcG9kIGRhdGEsIHdoZXJlIHRoZSBwb2QgZGF0YSBpcworLy8gcmVpbnRlcnByZXRlZCB0byBhIGNvbnN0IGNoYXIqLgorLy8KKy8vIFRoZSBjbGFzc2ljYWwgYWRkcmVzcy1jYXN0aW5nIG1ldGhvZCBpczoKKy8vCisvLyAgIC8vIFdST05HCisvLyAgIGZsb2F0IGYgPSAzLjE0MTU5MjY1MzU4OTc5OyAgICAgICAgICAgIC8vIFdST05HCisvLyAgIGludCBpID0gKiByZWludGVycHJldF9jYXN0PGludCo+KCZmKTsgIC8vIFdST05HCisvLworLy8gVGhlIGFkZHJlc3MtY2FzdGluZyBtZXRob2QgYWN0dWFsbHkgcHJvZHVjZXMgdW5kZWZpbmVkIGJlaGF2aW9yCisvLyBhY2NvcmRpbmcgdG8gSVNPIEMrKyBzcGVjaWZpY2F0aW9uIHNlY3Rpb24gMy4xMCAtMTUgLS4gIFJvdWdobHksIHRoaXMKKy8vIHNlY3Rpb24gc2F5czogaWYgYW4gb2JqZWN0IGluIG1lbW9yeSBoYXMgb25lIHR5cGUsIGFuZCBhIHByb2dyYW0KKy8vIGFjY2Vzc2VzIGl0IHdpdGggYSBkaWZmZXJlbnQgdHlwZSwgdGhlbiB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZAorLy8gYmVoYXZpb3IgZm9yIG1vc3QgdmFsdWVzIG9mICJkaWZmZXJlbnQgdHlwZSIuCisvLworLy8gVGhpcyBpcyB0cnVlIGZvciBhbnkgY2FzdCBzeW50YXgsIGVpdGhlciAqKGludCopJmYgb3IKKy8vICpyZWludGVycHJldF9jYXN0PGludCo+KCZmKS4gIEFuZCBpdCBpcyBwYXJ0aWN1bGFybHkgdHJ1ZSBmb3IKKy8vIGNvbnZlcnNpb25zIGJldHdlZW4gaW50ZWdyYWwgbHZhbHVlcyBhbmQgZmxvYXRpbmctcG9pbnQgbHZhbHVlcy4KKy8vCisvLyBUaGUgcHVycG9zZSBvZiAzLjEwIC0xNS0gaXMgdG8gYWxsb3cgb3B0aW1pemluZyBjb21waWxlcnMgdG8gYXNzdW1lCisvLyB0aGF0IGV4cHJlc3Npb25zIHdpdGggZGlmZmVyZW50IHR5cGVzIHJlZmVyIHRvIGRpZmZlcmVudCBtZW1vcnkuICBnY2MKKy8vIDQuMC4xIGhhcyBhbiBvcHRpbWl6ZXIgdGhhdCB0YWtlcyBhZHZhbnRhZ2Ugb2YgdGhpcy4gIFNvIGEKKy8vIG5vbi1jb25mb3JtaW5nIHByb2dyYW0gcXVpZXRseSBwcm9kdWNlcyB3aWxkbHkgaW5jb3JyZWN0IG91dHB1dC4KKy8vCisvLyBUaGUgcHJvYmxlbSBpcyBub3QgdGhlIHVzZSBvZiByZWludGVycHJldF9jYXN0LiAgVGhlIHByb2JsZW0gaXMgdHlwZQorLy8gcHVubmluZzogaG9sZGluZyBhbiBvYmplY3QgaW4gbWVtb3J5IG9mIG9uZSB0eXBlIGFuZCByZWFkaW5nIGl0cyBiaXRzCisvLyBiYWNrIHVzaW5nIGEgZGlmZmVyZW50IHR5cGUuCisvLworLy8gVGhlIEMrKyBzdGFuZGFyZCBpcyBtb3JlIHN1YnRsZSBhbmQgY29tcGxleCB0aGFuIHRoaXMsIGJ1dCB0aGF0CisvLyBpcyB0aGUgYmFzaWMgaWRlYS4KKy8vCisvLyBBbnl3YXlzIC4uLgorLy8KKy8vIGJpdF9jYXN0PD4gY2FsbHMgbWVtY3B5KCkgd2hpY2ggaXMgYmxlc3NlZCBieSB0aGUgc3RhbmRhcmQsCisvLyBlc3BlY2lhbGx5IGJ5IHRoZSBleGFtcGxlIGluIHNlY3Rpb24gMy45IC4gIEFsc28sIG9mIGNvdXJzZSwKKy8vIGJpdF9jYXN0PD4gd3JhcHMgdXAgdGhlIG5hc3R5IGxvZ2ljIGluIG9uZSBwbGFjZS4KK3RlbXBsYXRlIDxjbGFzcyBEZXN0LCBjbGFzcyBTb3VyY2U+CitpbmxpbmUgRGVzdCBiaXRfY2FzdChjb25zdCBTb3VyY2UmIHNvdXJjZSkgeworICBTQl9DT01QSUxFX0FTU0VSVChzaXplb2YoRGVzdCkgPT0gc2l6ZW9mKHNvdXJjZSksCisgICAgICAgICAgICAgICAgICAgIFNvdXJjZV9hbmRfZGVzdGluYXRpb25fdHlwZXNfc2hvdWxkX2hhdmVfZXF1YWxfc2l6ZXMpOworICBEZXN0IGRlc3Q7CisgIFNiTWVtb3J5Q29weSgmZGVzdCwgJnNvdXJjZSwgc2l6ZW9mKGRlc3QpKTsKKyAgcmV0dXJuIGRlc3Q7Cit9CisKK30gIC8vIG5hbWVzcGFjZSBuYgorCisjZW5kaWYgIC8vIE5CX0NPTkNVUlJFTlRfTUFQX0hfCmRpZmYgLS1naXQgYS9zcmMvbmIvY29uY3VycmVudF9tYXAuaCBiL3NyYy9uYi9jb25jdXJyZW50X21hcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg5NGQyMTkKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbmIvY29uY3VycmVudF9tYXAuaApAQCAtMCwwICsxLDM4MCBAQAorLyoKKyAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisgKgorICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisgKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisgKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKyAqCisgKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisgKgorICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKyAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisgKi8KKworI2lmbmRlZiBOQl9DT05DVVJSRU5UX01BUF9IXworI2RlZmluZSBOQl9DT05DVVJSRU5UX01BUF9IXworCisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgIm5iL2hhc2guaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisKK25hbWVzcGFjZSBuYiB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXlULAorICAgICAgICAgIHR5cGVuYW1lIFZhbHVlVCwKKyAgICAgICAgICB0eXBlbmFtZSBIYXNoRnVuY3Rpb24sCisgICAgICAgICAgdHlwZW5hbWUgSW5uZXJNYXAgPSBzdGQ6Om1hcDxLZXlULCBWYWx1ZVQ+ID4KK2NsYXNzIENvbmN1cnJlbnRNYXA7CisKKy8vIE1hcCBvZiBpbnQgLT4gaW50Cit0eXBlZGVmIENvbmN1cnJlbnRNYXA8aW50LCBpbnQsIFBPREhhc2hlcjxpbnQ+ID4gSW50VG9JbnRDb25jdXJyZW50TWFwOworCisvLyBNYXAgb2Ygdm9pZCogLT4gdm9pZCoKK3R5cGVkZWYgQ29uY3VycmVudE1hcDxjb25zdCB2b2lkKiwgdm9pZCosIFBPREhhc2hlcjxjb25zdCB2b2lkKj4gPgorICAgIFB0clRvUHRyQ29uY3VycmVudE1hcDsKKworLy8gQ29uY3VycmVudE1hcDw+IGlzIGEgd2VsbCBwZXJmb3JtaW5nIG1hcCB3aGljaCBtYWludGFpbnMgYmV0dGVyIHBlcmZvcm1hbmNlCisvLyBmb3IgbXVsdGlwbGUgdGhyZWFkIGFjY2VzcyB0aGFuIGFuIHN0ZDo6bWFwIHdpdGggYSBzaW5nbGUgbXV0ZXguCisvLworLy8gQ29uY3VycmVudCBhY2Nlc3MgaXMgYWNoaWV2ZWQgYnkgcGFydGl0aW9uaW5nIHRoZSBrZXktc3BhY2UgaW50byBrIGJ1Y2tldHMuCisvLyBBbiBpbnB1dCBrZXkgaXMgcmFuZG9tbHkgYXNzaWduZWQgdG8gb25lIG9mIHRoZSBidWNrZXRzIGJ5IGEgaGFzaCBmdW5jdGlvbi4KKy8vIFRoZSBzZWxlY3RlZCBidWNrZXQgdGhlbiBjb250YWlucyBpdCdzIG93biBtdXRleCBhbmQgbWFwLCB3aGljaCBpcyB0aGVuCisvLyBhY2Nlc3NlZC4KKy8vCisvLyBDb250ZW50aW9uOgorLy8gIEV4YW1wbGU6CisvLyAgICBJZiB0aGVyZSBhcmUgMzIgYnVja2V0cywgdGhlbiB0d28gdGhyZWFkcyBib3RoIGV4ZWN1dGluZworLy8gICAgU2V0KGtleSx2YWx1ZSkgd2lsbCBoYXZlIGEgfjMlIGNoYW5jZSBvZiBjb250ZW50aW9uICgxLzMyKS4KKy8vICAgIEZvciBmb3VyIHRocmVhZHMgdGhlIGNoYW5jZXMgYXJlIH40MCUuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5VCwKKyAgICAgICAgICB0eXBlbmFtZSBWYWx1ZVQsCisgICAgICAgICAgdHlwZW5hbWUgSGFzaEZ1bmN0aW9uLAorICAgICAgICAgIHR5cGVuYW1lIElubmVyTWFwPgorY2xhc3MgQ29uY3VycmVudE1hcCB7CisgcHVibGljOgorICAvLyBFbnRyeUhhbmRsZSBhbmQgQ29uc3RFbnRyeUhhbmRsZSBwcm92aWRlcyBtdXR1YWxseSBleGNsdXNpdmUgYWNjZXNzIHRvCisgIC8vIGtleS12YWx1ZXMgYWNjZXNzIGluIHRoaXMgbWFwLiBUaGVzZSBoYW5kbGVzIHdpbGwgbG9jayB0aGUgZW50aXJlIGJ1Y2tldAorICAvLyBhbmQgaXQncyByZWNvbW1lbmRlZCB0aGF0IHRoZXNlIGhhbmRsZXMgYXJlIHJlbGVhc2VkIGFzIHNvb24gYXMgcG9zc2libGUuCisgIC8vIFRoZSBoYW5kbGVzIGFyZSBhdXRvbWF0aWNhbGx5IHJlbGVhc2VkIHdoZW4gdGhlIG9iamVjdCBnb2VzIG91dCBvZiBzY29wZQorICAvLyBvciBpcyBkZWxldGVkLgorICBjbGFzcyBFbnRyeUhhbmRsZTsKKyAgY2xhc3MgQ29uc3RFbnRyeUhhbmRsZTsKKyAgc3RydWN0IEJ1Y2tldDsKKworICAvLyB8bnVtX2NvbmN1cnJlbmN5X2J1Y2tldHN8IHNwZWNpZmllcyB0aGUgbnVtYmVyIG9mIGNvbmN1cnJlbmN5IGJ1Y2tldHMKKyAgLy8gdGhhdCB3aWxsIGJlIGNyZWF0ZWQuIFRoZSBoaWdoZXIgdGhlIG51bWJlciBvZiBidWNrZXRzLCB0aGUgbG93ZXIgdGhlCisgIC8vIHByb2JhYmlsaXR5IG9mIHRocmVhZCBjb250ZW50aW9uLiA1MTEgd2FzIGV4cGVyaW1lbnRhbGx5IGZvdW5kIHRvIGJlIGEKKyAgLy8gZ29vZCB2YWx1ZSBtYXhpbWl6aW5nIHBlcmZvcm1hbmNlIG9uIGEgaGlnaGx5IGNvbnRlbmRlZCBwb2ludGVyIG1hcC4KKyAgLy8gTG93ZXJpbmcgdGhlIG51bWJlciBvZiBidWNrZXRzIHdpbGwgcmVkdWNlIG1lbW9yeSBjb25zdW1wdGlvbi4KKyAgQ29uY3VycmVudE1hcChzaXplX3QgbnVtX2NvbmN1cnJlbmN5X2J1Y2tldHMgPSA1MTEpIHsKKyAgICBpZiAobnVtX2NvbmN1cnJlbmN5X2J1Y2tldHMgPCAxKSB7CisgICAgICBTQl9EQ0hFQ0soZmFsc2UpOyAgLy8gU2hvdWxkIHJlYWNoIGhlcmUuCisgICAgICBudW1fY29uY3VycmVuY3lfYnVja2V0cyA9IDE7CisgICAgfQorICAgIGJ1Y2tldF90YWJsZV8ucmVzaXplKG51bV9jb25jdXJyZW5jeV9idWNrZXRzKTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBvYmplY3Qgd2FzIHNldCB0byB0aGUgbmV3IHZhbHVlLiBPdGhlcndpc2UgZmFsc2UgbWVhbnMKKyAgLy8gdGhhdCB0aGUgb2JqZWN0IGFscmVhZHkgZXhpc3RlZC4KKyAgYm9vbCBTZXRJZk1pc3NpbmcoY29uc3QgS2V5VCYga2V5LCBjb25zdCBWYWx1ZVQmIHZhbHVlKSB7CisgICAgQnVja2V0JiBidWNrZXQgPSBHZXRCdWNrZXRGb3JLZXkoa2V5KTsKKyAgICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhidWNrZXQubXV0ZXhfKTsKKyAgICBib29sIGluc2VydGVkID0gYnVja2V0Lm1hcF8uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKGtleSwgdmFsdWUpKS5zZWNvbmQ7CisgICAgcmV0dXJuIGluc2VydGVkOworICB9CisKKyAgLy8gU2V0cyB0aGUgb2JqZWN0LiBXaGF0ZXZlciB2YWx1ZSB3YXMgcHJldmlvdXNseSB0aGVyZSBpcyByZXBsYWNlZC4KKyAgdm9pZCBTZXQoY29uc3QgS2V5VCYga2V5LCBjb25zdCBWYWx1ZVQmIHZhbHVlKSB7CisgICAgRW50cnlIYW5kbGUgZW50cnlfaGFuZGxlOworICAgIEdldE9yQ3JlYXRlKGtleSwgJmVudHJ5X2hhbmRsZSk7CisgICAgZW50cnlfaGFuZGxlLlZhbHVlTXV0YWJsZSgpID0gdmFsdWU7CisgIH0KKworICAvLyBHZXRzIHRoZSB2YWx1ZSB1c2luZyB0aGUga2V5LiBJZiB0aGUgdmFsdWUgZG9lcyBub3QgYWxyZWFkeSBleGlzdCB0aGVuCisgIC8vIGEgZGVmYXVsdCB2YWx1ZSBpcyBjcmVhdGVkLiBUaGUgcmVzdWx0aW5nIHZhbHVlIGlzIHN0b3JlZCBpbiB0aGUKKyAgLy8gRW50cnlIYW5kbGUuCisgIHZvaWQgR2V0T3JDcmVhdGUoY29uc3QgS2V5VCYga2V5LCBFbnRyeUhhbmRsZSogZW50cnlfaGFuZGxlKSB7CisgICAgVmFsdWVUIGRlZmF1bHRfdmFsID0gVmFsdWVUKCk7CisgICAgQnVja2V0JiBidWNrZXQgPSBHZXRCdWNrZXRGb3JLZXkoa2V5KTsKKyAgICBlbnRyeV9oYW5kbGUtPkFjcXVpcmVMb2NrKCZidWNrZXQpOworICAgIHR5cGVuYW1lIElubmVyTWFwOjppdGVyYXRvciBpdCA9CisgICAgICAgIGJ1Y2tldC5tYXBfLmluc2VydChzdGQ6Om1ha2VfcGFpcihrZXksIGRlZmF1bHRfdmFsKSkuZmlyc3Q7CisgICAgZW50cnlfaGFuZGxlLT5WYWxpZGF0ZUl0ZXJhdG9yKGl0KTsKKyAgfQorCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBhIHZhbHVlIGV4aXN0cyBmb3IgdGhlIGlucHV0IGtleS4KKyAgYm9vbCBIYXMoY29uc3QgS2V5VCYga2V5KSBjb25zdCB7CisgICAgY29uc3QgQnVja2V0JiBidWNrZXQgPSBHZXRCdWNrZXRGb3JLZXkoa2V5KTsKKyAgICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhidWNrZXQubXV0ZXhfKTsKKworICAgIHR5cGVuYW1lIElubmVyTWFwOjpjb25zdF9pdGVyYXRvciBmb3VuZF9pdCA9IGJ1Y2tldC5tYXBfLmZpbmQoa2V5KTsKKyAgICByZXR1cm4gZm91bmRfaXQgIT0gYnVja2V0Lm1hcF8uZW5kKCk7CisgIH0KKworICAvLyBHZXRzIHRoZSB2YWx1ZSBmcm9tIHRoZSBrZXkuIFRoZSB2YWx1ZSBpbiB0aGUgbWFwIGNhbiBiZSBhY2Nlc3NlZCBmcm9tIHRoZQorICAvLyBFbnRyeUhhbmRsZS4gVGhlIEVudHJ5SGFuZGxlIHdpbGwgaG9sZCBvbnRvIGFuIGludGVybmFsIGxvY2sgZm9yIHRoZQorICAvLyBidWNrZXQgd2hpY2ggY29udGFpbnMgdGhlIGtleS12YWx1ZSBwYWlyLiBJdCdzIHJlY29tbWVuZGVkIHRoYXQgUmVsZWFzZSgpCisgIC8vIGlzIGludm9rZWQgb24gdGhlIGVudHJ5X2hhbmRsZSBhcyBzb29uIGFzIGNhbGxlciBpcyBkb25lIGFjY2Vzc2luZyB0aGUKKyAgLy8gdmFsdWUgdG8gcmVsZWFzZSB0aGUgbG9jayBhbmQgcmVkdWNlIHBvdGVudGlhbCBjb250ZW50aW9uLgorICAvLyBSZXR1cm5zIHx0cnVlfCBpZiBhIGtleS12YWx1ZSBwYWlyIGV4aXN0ZWQgaW4gdGhlIG1hcCBhbmQgfGZhbHNlfAorICAvLyBvdGhlcndpc2UuIFdoZW4gcmV0dXJuaW5nIHx0cnVlfCB8ZW50cnlfaGFuZGxlfCB3aWxsIGJlIHNldCB0byBhIHZhbGlkCisgIC8vIHZhbHVlIHdpbGwgbWFpbnRhaW4gYSBsb2NrIG9uIHRoZSBidWNrZXQgdW50aWwgUmVsZWFzZSgpIGlzIGludm9rZWQgb3IgdGhlCisgIC8vIG9iamVjdCBnb2VzIG91dCBvZiBzY29wZS4gSWYgfGZhbHNlfCBpcyByZXR1cm5lZCB0aGVuIHRoZSBlbnRyeV9oYW5kbGUKKyAgLy8gYmUgcmVsZWFzZWQoKSBhbmQgbm8gbG9jayB3aWxsIG1haW50YWluIGFmdGVyIHRoZSBjYWxsIGNvbXBsZXRlcy4KKyAgYm9vbCBHZXQoY29uc3QgS2V5VCYga2V5LCBFbnRyeUhhbmRsZSogZW50cnlfaGFuZGxlKSB7CisgICAgQnVja2V0JiBidWNrZXQgPSBHZXRCdWNrZXRGb3JLZXkoa2V5KTsKKyAgICBlbnRyeV9oYW5kbGUtPkFjcXVpcmVMb2NrKCZidWNrZXQpOworCisgICAgdHlwZW5hbWUgSW5uZXJNYXA6Oml0ZXJhdG9yIGZvdW5kX2l0ID0gYnVja2V0Lm1hcF8uZmluZChrZXkpOworICAgIGlmIChmb3VuZF9pdCA9PSBidWNrZXQubWFwXy5lbmQoKSkgeworICAgICAgZW50cnlfaGFuZGxlLT5SZWxlYXNlTG9ja0FuZEludmFsaWRhdGUoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZW50cnlfaGFuZGxlLT5WYWxpZGF0ZUl0ZXJhdG9yKGZvdW5kX2l0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFNlZSBtdXRhYmxlIHZlcnNpb24gb2YgR2V0KCkuCisgIGJvb2wgR2V0KGNvbnN0IEtleVQmIGtleSwgQ29uc3RFbnRyeUhhbmRsZSogZW50cnlfaGFuZGxlKSBjb25zdCB7CisgICAgY29uc3QgQnVja2V0JiBidWNrZXQgPSBHZXRCdWNrZXRGb3JLZXkoa2V5KTsKKyAgICBlbnRyeV9oYW5kbGUtPkFjcXVpcmVMb2NrKCZidWNrZXQpOworCisgICAgdHlwZW5hbWUgSW5uZXJNYXA6OmNvbnN0X2l0ZXJhdG9yIGZvdW5kX2l0ID0gYnVja2V0Lm1hcF8uZmluZChrZXkpOworICAgIGlmIChmb3VuZF9pdCA9PSBidWNrZXQubWFwXy5lbmQoKSkgeworICAgICAgZW50cnlfaGFuZGxlLT5SZWxlYXNlTG9ja0FuZEludmFsaWRhdGUoKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgZW50cnlfaGFuZGxlLT5WYWxpZGF0ZUl0ZXJhdG9yKGZvdW5kX2l0KTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFJlbW92ZXMgdGhlIGtleS12YWx1ZSBtYXBwaW5nIGZyb20gdGhpcyBtYXAuIFJldHVybnMgfHRydWV8IGlmIHRoZSBtYXBwaW5nCisgIC8vIGV4aXN0ZWQsIGVsc2UgfGZhbHNlfC4KKyAgYm9vbCBSZW1vdmUoY29uc3QgS2V5VCYga2V5KSB7CisgICAgQnVja2V0JiBidWNrZXQgPSBHZXRCdWNrZXRGb3JLZXkoa2V5KTsKKyAgICBzdGFyYm9hcmQ6OlNjb3BlZExvY2sgbG9jayhidWNrZXQubXV0ZXhfKTsKKyAgICB0eXBlbmFtZSBJbm5lck1hcDo6aXRlcmF0b3IgZm91bmRfaXQgPSBidWNrZXQubWFwXy5maW5kKGtleSk7CisgICAgY29uc3QgYm9vbCBleGlzdHMgPSAoZm91bmRfaXQgIT0gYnVja2V0Lm1hcF8uZW5kKCkpOworICAgIGlmIChleGlzdHMpIHsKKyAgICAgIGJ1Y2tldC5tYXBfLmVyYXNlKGZvdW5kX2l0KTsKKyAgICB9CisgICAgcmV0dXJuIGV4aXN0czsKKyAgfQorCisgIGJvb2wgUmVtb3ZlKEVudHJ5SGFuZGxlKiBlbnRyeV9oYW5kbGUpIHsKKyAgICBpZiAoIWVudHJ5X2hhbmRsZS0+VmFsaWQoKSkgeworICAgICAgU0JfRENIRUNLKGZhbHNlKTsgIC8vIENhbid0IHJlbW92ZSBhbiBpbnZhbGlkIGVudHJ5X2hhbmRsZSEKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWNrZXQqIGJ1Y2tldCA9IGVudHJ5X2hhbmRsZS0+YnVja2V0XzsKKyAgICBidWNrZXQtPm1hcF8uZXJhc2UoZW50cnlfaGFuZGxlLT5pdGVyYXRvcl8pOworICAgIGVudHJ5X2hhbmRsZS0+UmVsZWFzZUxvY2tBbmRJbnZhbGlkYXRlKCk7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBzaXplX3QgR2V0U2l6ZSgpIGNvbnN0IHsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6dmVjdG9yPEJ1Y2tldD46OmNvbnN0X2l0ZXJhdG9yIHRhYmxlX2l0ZXJhdG9yOworCisgICAgc2l6ZV90IHN1bSA9IDA7CisgICAgZm9yICh0YWJsZV9pdGVyYXRvciBpdCA9IGJ1Y2tldF90YWJsZV8uYmVnaW4oKTsgaXQgIT0gYnVja2V0X3RhYmxlXy5lbmQoKTsKKyAgICAgICAgICsraXQpIHsKKyAgICAgIGNvbnN0IEJ1Y2tldCYgYnVja2V0ID0gKml0OworICAgICAgYnVja2V0Lm11dGV4Xy5BY3F1aXJlKCk7CisgICAgICBzdW0gKz0gYnVja2V0Lm1hcF8uc2l6ZSgpOworICAgICAgYnVja2V0Lm11dGV4Xy5SZWxlYXNlKCk7CisgICAgfQorICAgIHJldHVybiBzdW07CisgIH0KKworICBzaXplX3QgSXNFbXB0eSgpIGNvbnN0IHsgcmV0dXJuICFHZXRTaXplKCk7IH0KKworICB2b2lkIENsZWFyKCkgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QnVja2V0Pjo6aXRlcmF0b3IgdGFibGVfaXRlcmF0b3I7CisKKyAgICBmb3IgKHRhYmxlX2l0ZXJhdG9yIGl0ID0gYnVja2V0X3RhYmxlXy5iZWdpbigpOyBpdCAhPSBidWNrZXRfdGFibGVfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgQnVja2V0JiBidWNrZXQgPSAqaXQ7CisgICAgICBidWNrZXQubXV0ZXhfLkFjcXVpcmUoKTsKKyAgICAgIGJ1Y2tldC5tYXBfLmNsZWFyKCk7CisgICAgICBidWNrZXQubXV0ZXhfLlJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICAvLyBUaGUgc3VwcGxpZWQgdmlzaXRvciB3aWxsIGFjY2VwdCBldmVyeSBrZXktdmFsdWUgcGFpciBpbiB0aGUgY29uY3VycmVudAorICAvLyBtYXAuIFRoaXMgdHJhdmVyc2FsIHdpbGwgdmlzaXQgdGhlIGVsZW1lbnRzIGluIGFuIHVuZGVmaW5lZCBvcmRlci4gQQorICAvLyB3YXJuaW5nIGFib3V0IHBlcmZvcm1hbmNlOiB3aGlsZSB0cmF2ZXJzaW5nIGVsZW1lbnRzLCBhIGJ1Y2tldCBsb2NrIHdpbGwKKyAgLy8gYmUgbWFpbnRhaW5lZCBhbmQgaWYgdGhlIHZpc2l0b3IgaXMgZXhwZW5zaXZlIHRoZW4gaXQncyBwb3NzaWJsZSB0aGF0IHRoaXMKKyAgLy8gY291bGQgY2F1c2Ugb3RoZXIgdGhyZWFkcyB0byBibG9jay4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleVZhbHVlVmlzaXRvclQ+CisgIHZvaWQgRm9yRWFjaChLZXlWYWx1ZVZpc2l0b3JUKiB2aXNpdG9yKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6OnZlY3RvcjxCdWNrZXQ+OjppdGVyYXRvciBidWNrZXRfaXRlcmF0b3I7CisgICAgdHlwZWRlZiB0eXBlbmFtZSBJbm5lck1hcDo6aXRlcmF0b3IgbWFwX2l0ZXJhdG9yOworCisgICAgZm9yIChidWNrZXRfaXRlcmF0b3IgaXQgPSBidWNrZXRfdGFibGVfLmJlZ2luKCk7IGl0ICE9IGJ1Y2tldF90YWJsZV8uZW5kKCk7CisgICAgICAgICArK2l0KSB7CisgICAgICBCdWNrZXQmIGJ1Y2tldCA9ICppdDsKKyAgICAgIGJ1Y2tldC5tdXRleF8uQWNxdWlyZSgpOworICAgICAgZm9yIChtYXBfaXRlcmF0b3IgaXQgPSBidWNrZXQubWFwXy5iZWdpbigpOyBpdCAhPSBidWNrZXQubWFwXy5lbmQoKTsKKyAgICAgICAgICAgKytpdCkgeworICAgICAgICB2aXNpdG9yLT5WaXNpdChpdC0+Zmlyc3QsIGl0LT5zZWNvbmQpOworICAgICAgfQorICAgICAgYnVja2V0Lm11dGV4Xy5SZWxlYXNlKCk7CisgICAgfQorICB9CisKKyAgLy8gVW5kZXIgdGhlIGNpcmN1bXN0YW5jZXMgdGhhdCBhbiBvcGVyYXRpb24gY2FuIGJlIGFwcGxpZWQgdG8gYSBjb3B5IG9mCisgIC8vIHRoZSBpbnRlcm5hbCBkYXRhLCB0aGVuIGl0J3MgYWR2aXNlZCB0byBjb3B5IHRoaXMgZGF0YSB0byBhbiBzdGQ6OnZlY3RvcgorICAvLyBhbmQgdGhlbiBhcHBseSB0aGUgb3BlcmF0aW9uIHRvIHRoZSBkYXRhLgorICB2b2lkIENvcHlUb1N0ZFZlY3RvcihzdGQ6OnZlY3RvcjxzdGQ6OnBhaXI8S2V5VCwgVmFsdWVUPiA+KiBkZXN0aW5hdGlvbikgeworICAgIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjp2ZWN0b3I8QnVja2V0Pjo6aXRlcmF0b3IgYnVja2V0X2l0ZXJhdG9yOworICAgIHR5cGVkZWYgdHlwZW5hbWUgSW5uZXJNYXA6Oml0ZXJhdG9yIG1hcF9pdGVyYXRvcjsKKworICAgIGZvciAoYnVja2V0X2l0ZXJhdG9yIGl0ID0gYnVja2V0X3RhYmxlXy5iZWdpbigpOyBpdCAhPSBidWNrZXRfdGFibGVfLmVuZCgpOworICAgICAgICAgKytpdCkgeworICAgICAgQnVja2V0JiBidWNrZXQgPSAqaXQ7CisgICAgICBidWNrZXQubXV0ZXhfLkFjcXVpcmUoKTsKKyAgICAgIGRlc3RpbmF0aW9uLT5pbnNlcnQoZGVzdGluYXRpb24tPmVuZCgpLCBidWNrZXQubWFwXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBidWNrZXQubWFwXy5lbmQoKSk7CisgICAgICBidWNrZXQubXV0ZXhfLlJlbGVhc2UoKTsKKyAgICB9CisgIH0KKworICBjbGFzcyBFbnRyeUhhbmRsZSB7CisgICBwdWJsaWM6CisgICAgZnJpZW5kIGNsYXNzIENvbmN1cnJlbnRNYXA7CisKKyAgICBFbnRyeUhhbmRsZSgpIDogYnVja2V0XyhOVUxMKSwgaXRlcmF0b3JfKCksIGl0ZXJhdG9yX3ZhbGlkXyhmYWxzZSkge30KKyAgICB+RW50cnlIYW5kbGUoKSB7IFJlbGVhc2VMb2NrQW5kSW52YWxpZGF0ZSgpOyB9CisKKyAgICBjb25zdCBWYWx1ZVQmIFZhbHVlKCkgeworICAgICAgU0JfRENIRUNLKGl0ZXJhdG9yX3ZhbGlkXyk7CisgICAgICByZXR1cm4gaXRlcmF0b3JfLT5zZWNvbmQ7CisgICAgfQorCisgICAgVmFsdWVUJiBWYWx1ZU11dGFibGUoKSB7CisgICAgICBTQl9EQ0hFQ0soaXRlcmF0b3JfdmFsaWRfKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcl8tPnNlY29uZDsKKyAgICB9CisKKyAgICBjb25zdCBLZXlUJiBLZXkoKSB7CisgICAgICBTQl9EQ0hFQ0soaXRlcmF0b3JfdmFsaWRfKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcl8tPmZpcnN0OworICAgIH0KKworICAgIGJvb2wgVmFsaWQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcl92YWxpZF87IH0KKworICAgIHZvaWQgUmVsZWFzZUxvY2tBbmRJbnZhbGlkYXRlKCkgeworICAgICAgUmVsZWFzZUxvY2tJZk5lY2Vzc2FyeSgpOworICAgICAgaXRlcmF0b3JfdmFsaWRfID0gZmFsc2U7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHZvaWQgVmFsaWRhdGVJdGVyYXRvcih0eXBlbmFtZSBJbm5lck1hcDo6aXRlcmF0b3IgaXQpIHsKKyAgICAgIGl0ZXJhdG9yXyA9IGl0OworICAgICAgaXRlcmF0b3JfdmFsaWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIEFjcXVpcmVMb2NrKEJ1Y2tldCogYnVja2V0KSB7CisgICAgICBSZWxlYXNlTG9ja0lmTmVjZXNzYXJ5KCk7CisgICAgICBidWNrZXRfID0gYnVja2V0OworICAgICAgYnVja2V0Xy0+bXV0ZXhfLkFjcXVpcmUoKTsKKyAgICB9CisKKyAgICB2b2lkIFJlbGVhc2VMb2NrSWZOZWNlc3NhcnkoKSB7CisgICAgICBpZiAoYnVja2V0XykgeworICAgICAgICBidWNrZXRfLT5tdXRleF8uUmVsZWFzZSgpOworICAgICAgfQorICAgICAgYnVja2V0XyA9IE5VTEw7CisgICAgfQorCisgICAgQnVja2V0KiBidWNrZXRfOworICAgIHR5cGVuYW1lIElubmVyTWFwOjppdGVyYXRvciBpdGVyYXRvcl87CisgICAgYm9vbCBpdGVyYXRvcl92YWxpZF87CisKKyAgICBTQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oRW50cnlIYW5kbGUpOworICB9OworCisgIGNsYXNzIENvbnN0RW50cnlIYW5kbGUgeworICAgcHVibGljOgorICAgIGZyaWVuZCBjbGFzcyBDb25jdXJyZW50TWFwOworCisgICAgQ29uc3RFbnRyeUhhbmRsZSgpIDogYnVja2V0XyhOVUxMKSwgaXRlcmF0b3JfKCksIGl0ZXJhdG9yX3ZhbGlkXyhmYWxzZSkge30KKyAgICB+Q29uc3RFbnRyeUhhbmRsZSgpIHsgUmVsZWFzZUxvY2tBbmRJbnZhbGlkYXRlKCk7IH0KKworICAgIGNvbnN0IFZhbHVlVCYgVmFsdWUoKSB7CisgICAgICBTQl9EQ0hFQ0soaXRlcmF0b3JfdmFsaWRfKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcl8tPnNlY29uZDsKKyAgICB9CisKKyAgICBjb25zdCBLZXlUJiBLZXkoKSB7CisgICAgICBTQl9EQ0hFQ0soaXRlcmF0b3JfdmFsaWRfKTsKKyAgICAgIHJldHVybiBpdGVyYXRvcl8tPmZpcnN0OworICAgIH0KKworICAgIGJvb2wgVmFsaWQoKSBjb25zdCB7IHJldHVybiBpdGVyYXRvcl92YWxpZF87IH0KKworICAgIHZvaWQgUmVsZWFzZUxvY2tBbmRJbnZhbGlkYXRlKCkgeworICAgICAgUmVsZWFzZUxvY2tJZk5lY2Vzc2FyeSgpOworICAgICAgaXRlcmF0b3JfdmFsaWRfID0gZmFsc2U7CisgICAgfQorCisgICBwcml2YXRlOgorICAgIHZvaWQgVmFsaWRhdGVJdGVyYXRvcih0eXBlbmFtZSBJbm5lck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQpIHsKKyAgICAgIGl0ZXJhdG9yXyA9IGl0OworICAgICAgaXRlcmF0b3JfdmFsaWRfID0gdHJ1ZTsKKyAgICB9CisKKyAgICB2b2lkIEFjcXVpcmVMb2NrKGNvbnN0IEJ1Y2tldCogYnVja2V0KSB7CisgICAgICBSZWxlYXNlTG9ja0lmTmVjZXNzYXJ5KCk7CisgICAgICBidWNrZXRfID0gYnVja2V0OworICAgICAgYnVja2V0Xy0+bXV0ZXhfLkFjcXVpcmUoKTsKKyAgICB9CisKKyAgICB2b2lkIFJlbGVhc2VMb2NrSWZOZWNlc3NhcnkoKSB7CisgICAgICBpZiAoYnVja2V0XykgeworICAgICAgICBidWNrZXRfLT5tdXRleF8uUmVsZWFzZSgpOworICAgICAgfQorICAgICAgYnVja2V0XyA9IE5VTEw7CisgICAgfQorCisgICAgY29uc3QgQnVja2V0KiBidWNrZXRfOworICAgIHR5cGVuYW1lIElubmVyTWFwOjpjb25zdF9pdGVyYXRvciBpdGVyYXRvcl87CisgICAgYm9vbCBpdGVyYXRvcl92YWxpZF87CisKKyAgICBTQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29uc3RFbnRyeUhhbmRsZSk7CisgIH07CisKKyAgc3RydWN0IEJ1Y2tldCB7CisgICAgQnVja2V0KCkge30KKyAgICBCdWNrZXQoY29uc3QgQnVja2V0JiBiKSB7IG1hcF8gPSBiLm1hcF87IH0KKyAgICB2b2lkIG9wZXJhdG9yPShjb25zdCBCdWNrZXQmIGIpIHsgbWFwXyA9IGIubWFwXzsgfQorICAgIElubmVyTWFwIG1hcF87CisgICAgbXV0YWJsZSBzdGFyYm9hcmQ6Ok11dGV4IG11dGV4XzsKKyAgfTsKKworIHByaXZhdGU6CisgIEJ1Y2tldCYgR2V0QnVja2V0Rm9yS2V5KGNvbnN0IEtleVQmIGtleSkgeworICAgIHNpemVfdCB0YWJsZV9pbmRleCA9IGhhc2hlcl8oa2V5KSAlIGJ1Y2tldF90YWJsZV8uc2l6ZSgpOworICAgIHJldHVybiBidWNrZXRfdGFibGVfW3RhYmxlX2luZGV4XTsKKyAgfQorCisgIGNvbnN0IEJ1Y2tldCYgR2V0QnVja2V0Rm9yS2V5KGNvbnN0IEtleVQmIGtleSkgY29uc3QgeworICAgIHNpemVfdCB0YWJsZV9pbmRleCA9IGhhc2hlcl8oa2V5KSAlIGJ1Y2tldF90YWJsZV8uc2l6ZSgpOworICAgIHJldHVybiBidWNrZXRfdGFibGVfW3RhYmxlX2luZGV4XTsKKyAgfQorCisgIHN0ZDo6dmVjdG9yPEJ1Y2tldD4gYnVja2V0X3RhYmxlXzsKKyAgSGFzaEZ1bmN0aW9uIGhhc2hlcl87Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbmIKKworI2VuZGlmICAvLyBOQl9DT05DVVJSRU5UX01BUF9IXwpkaWZmIC0tZ2l0IGEvc3JjL25iL2NvbmN1cnJlbnRfbWFwX3Rlc3QuY2MgYi9zcmMvbmIvY29uY3VycmVudF9tYXBfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MTg2MzRkCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL25iL2NvbmN1cnJlbnRfbWFwX3Rlc3QuY2MKQEAgLTAsMCArMSwyMjcgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpbmNsdWRlICJuYi9jb25jdXJyZW50X21hcC5oIgorI2luY2x1ZGUgIm5iL2hhc2guaCIKKyNpbmNsdWRlICJuYi9zaW1wbGVfdGhyZWFkLmgiCisjaW5jbHVkZSAidGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LmgiCisKK25hbWVzcGFjZSBuYiB7CituYW1lc3BhY2UgeworCitjbGFzcyBDYXB0dXJlc0ludFZhbHVlcyB7CisgcHVibGljOgorICB2aXJ0dWFsIHZvaWQgVmlzaXQoY29uc3QgaW50JiBrZXksIGNvbnN0IGludCYgdmFsKSB7CisgICAgdmlzaXRlZF92YWx1ZXNfLnB1c2hfYmFjayhzdGQ6Om1ha2VfcGFpcihrZXksIHZhbCkpOworICB9CisKKyAgc3RkOjptYXA8aW50LCBpbnQ+IFRvTWFwKCkgY29uc3QgeworICAgIHN0ZDo6bWFwPGludCwgaW50PiBvdXRwdXQ7CisgICAgb3V0cHV0Lmluc2VydCh2aXNpdGVkX3ZhbHVlc18uYmVnaW4oKSwgdmlzaXRlZF92YWx1ZXNfLmVuZCgpKTsKKyAgICByZXR1cm4gb3V0cHV0OworICB9CisgIHN0ZDo6dmVjdG9yPHN0ZDo6cGFpcjxpbnQsIGludD4gPiB2aXNpdGVkX3ZhbHVlc187Cit9OworCitURVNUKENvbmN1cnJlbnRNYXAsIFNldElmTWlzc2luZykgeworICBJbnRUb0ludENvbmN1cnJlbnRNYXAgaW50X21hcDsKKyAgQVNTRVJUX0ZBTFNFKGludF9tYXAuSGFzKDEpKTsKKyAgQVNTRVJUX1RSVUUoaW50X21hcC5TZXRJZk1pc3NpbmcoMSwgLTEpKTsKKyAgQVNTRVJUX1RSVUUoaW50X21hcC5IYXMoMSkpOworICBBU1NFUlRfRkFMU0UoaW50X21hcC5TZXRJZk1pc3NpbmcoMSwgLTIpKTsgIC8vIEZhbHNlIGJlY2F1c2UgZXhpc3RzLgorCisgIEludFRvSW50Q29uY3VycmVudE1hcDo6RW50cnlIYW5kbGUgZW50cnlfaGFuZGxlOworCisgIEFTU0VSVF9UUlVFKGludF9tYXAuR2V0KDEsICZlbnRyeV9oYW5kbGUpKTsKKyAgQVNTRVJUX1RSVUUoZW50cnlfaGFuZGxlLlZhbGlkKCkpOworICBBU1NFUlRfRVEoLTEsIGVudHJ5X2hhbmRsZS5WYWx1ZSgpKTsKKworICAvLyAyIGlzIGEgbWlzc2luZyBrZXkgYW5kIGRvZXNuJ3QgZXhpc3QuCisgIEFTU0VSVF9GQUxTRShpbnRfbWFwLkdldCgyLCAmZW50cnlfaGFuZGxlKSk7CisgIEFTU0VSVF9GQUxTRShlbnRyeV9oYW5kbGUuVmFsaWQoKSk7Cit9CisKK1RFU1QoQ29uY3VycmVudE1hcCwgU2V0KSB7CisgIEludFRvSW50Q29uY3VycmVudE1hcCBpbnRfbWFwOworICBBU1NFUlRfRkFMU0UoaW50X21hcC5IYXMoMSkpOworICBpbnRfbWFwLlNldCgxLCAtMSk7CisgIEFTU0VSVF9UUlVFKGludF9tYXAuSGFzKDEpKTsKKyAgaW50X21hcC5TZXQoMSwgLTIpOworCisgIEludFRvSW50Q29uY3VycmVudE1hcDo6RW50cnlIYW5kbGUgZW50cnlfaGFuZGxlOworCisgIEFTU0VSVF9UUlVFKGludF9tYXAuR2V0KDEsICZlbnRyeV9oYW5kbGUpKTsKKyAgQVNTRVJUX1RSVUUoZW50cnlfaGFuZGxlLlZhbGlkKCkpOworICBBU1NFUlRfRVEoLTIsIGVudHJ5X2hhbmRsZS5WYWx1ZSgpKTsgIC8vIFZhbHVlIHdhcyByZXBsYWNlZC4KK30KKworVEVTVChDb25jdXJyZW50TWFwLCBHZXRPckNyZWF0ZSkgeworICBJbnRUb0ludENvbmN1cnJlbnRNYXAgaW50X21hcDsKKworICAvLyBDcmVhdGUgYSBkZWZhdWx0IG1hcHBpbmcgMT0+MCwgdGhlbiByZXNldCB0aGUgdmFsdWUgdG8gLTIuCisgIHsKKyAgICBJbnRUb0ludENvbmN1cnJlbnRNYXA6OkVudHJ5SGFuZGxlIGVudHJ5X2hhbmRsZTsKKworICAgIGludF9tYXAuR2V0T3JDcmVhdGUoMSwgJmVudHJ5X2hhbmRsZSk7ICAvLyBEb2VzIG5vdCBleGlzdCBwcmlvci4KKworICAgIEFTU0VSVF9UUlVFKGVudHJ5X2hhbmRsZS5WYWxpZCgpKTsgIC8vIFZhbHVlIGRlZmF1bHQgY3JlYXRlZC4KKyAgICBFWFBFQ1RfRVEoMCwgZW50cnlfaGFuZGxlLlZhbHVlKCkpOworICAgIGVudHJ5X2hhbmRsZS5WYWx1ZU11dGFibGUoKSA9IC0yOworICB9CisKKyAgLy8gR2V0IHRoZSB2YWx1ZSBhZ2FpbiwgZXhwZWN0IGl0IHRvIGJlIC0yLgorICB7CisgICAgSW50VG9JbnRDb25jdXJyZW50TWFwOjpFbnRyeUhhbmRsZSBlbnRyeV9oYW5kbGU7CisKKyAgICBFWFBFQ1RfVFJVRShpbnRfbWFwLkdldCgxLCAmZW50cnlfaGFuZGxlKSk7CisgICAgQVNTRVJUX1RSVUUoZW50cnlfaGFuZGxlLlZhbGlkKCkpOworICAgIEVYUEVDVF9FUSgtMiwgZW50cnlfaGFuZGxlLlZhbHVlKCkpOworICB9Cit9CisKK1RFU1QoQ29uY3VycmVudE1hcCwgR2V0Q29uc3QpIHsKKyAgSW50VG9JbnRDb25jdXJyZW50TWFwIGludF9tYXA7CisgIEludFRvSW50Q29uY3VycmVudE1hcDo6Q29uc3RFbnRyeUhhbmRsZSBjb25zdF9lbnRyeV9oYW5kbGU7CisKKyAgRVhQRUNUX0ZBTFNFKGludF9tYXAuR2V0KDEsICZjb25zdF9lbnRyeV9oYW5kbGUpKTsKKyAgRVhQRUNUX0ZBTFNFKGNvbnN0X2VudHJ5X2hhbmRsZS5WYWxpZCgpKTsKKworICBFWFBFQ1RfVFJVRShpbnRfbWFwLlNldElmTWlzc2luZygxLCAtMSkpOworCisgIEVYUEVDVF9UUlVFKGludF9tYXAuR2V0KDEsICZjb25zdF9lbnRyeV9oYW5kbGUpKTsKKyAgRVhQRUNUX1RSVUUoY29uc3RfZW50cnlfaGFuZGxlLlZhbGlkKCkpOworICBFWFBFQ1RfRVEoLTEsIGNvbnN0X2VudHJ5X2hhbmRsZS5WYWx1ZSgpKTsKK30KKworVEVTVChDb25jdXJyZW50TWFwLCBSZW1vdmUpIHsKKyAgSW50VG9JbnRDb25jdXJyZW50TWFwIGludF9tYXA7CisgIGludF9tYXAuU2V0KDEsIC0xKTsKKyAgRVhQRUNUX0VRKDEsIGludF9tYXAuR2V0U2l6ZSgpKTsKKworICBFWFBFQ1RfRkFMU0UoaW50X21hcC5SZW1vdmUoMikpOyAgLy8gRG9lc24ndCBleGlzdC4KKyAgRVhQRUNUX1RSVUUoaW50X21hcC5SZW1vdmUoMSkpOworICBFWFBFQ1RfRVEoMCwgaW50X21hcC5HZXRTaXplKCkpOworICBFWFBFQ1RfVFJVRShpbnRfbWFwLklzRW1wdHkoKSk7Cit9CisKK1RFU1QoQ29uY3VycmVudE1hcCwgUmVtb3ZlVXNpbmdIYW5kbGUpIHsKKyAgSW50VG9JbnRDb25jdXJyZW50TWFwIGludF9tYXA7CisgIGludF9tYXAuU2V0KDEsIC0xKTsKKyAgaW50X21hcC5TZXQoMiwgLTIpOworICBFWFBFQ1RfRVEoMiwgaW50X21hcC5HZXRTaXplKCkpOworCisgIEludFRvSW50Q29uY3VycmVudE1hcDo6RW50cnlIYW5kbGUgZW50cnlfaGFuZGxlOworICBpbnRfbWFwLkdldCgyLCAmZW50cnlfaGFuZGxlKTsKKworICBpbnRfbWFwLlJlbW92ZSgmZW50cnlfaGFuZGxlKTsKKyAgRVhQRUNUX0VRKDEsIGludF9tYXAuR2V0U2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoaW50X21hcC5IYXMoMSkpOworICBFWFBFQ1RfRkFMU0UoaW50X21hcC5IYXMoMikpOworCisgIGludF9tYXAuR2V0KDEsICZlbnRyeV9oYW5kbGUpOworICBpbnRfbWFwLlJlbW92ZSgmZW50cnlfaGFuZGxlKTsKKyAgRVhQRUNUX0VRKDAsIGludF9tYXAuR2V0U2l6ZSgpKTsKK30KKworVEVTVChDb25jdXJyZW50TWFwLCBDbGVhcikgeworICBJbnRUb0ludENvbmN1cnJlbnRNYXAgaW50X21hcDsKKyAgaW50X21hcC5TZXQoMSwgLTEpOworICBpbnRfbWFwLlNldCgyLCAtMik7CisKKyAgRVhQRUNUX0VRKDIsIGludF9tYXAuR2V0U2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDIsIGludF9tYXAuR2V0U2l6ZSgpKTsKKworICBpbnRfbWFwLkNsZWFyKCk7CisgIEVYUEVDVF9UUlVFKGludF9tYXAuSXNFbXB0eSgpKTsKKyAgRVhQRUNUX0VRKDAsIGludF9tYXAuR2V0U2l6ZSgpKTsKK30KKworVEVTVChDb25jdXJyZW50TWFwLCBGb3JFYWNoKSB7CisgIEludFRvSW50Q29uY3VycmVudE1hcCBpbnRfbWFwOworICBpbnRfbWFwLlNldCgxLCAtMSk7CisgIGludF9tYXAuU2V0KDIsIC0yKTsKKworICBDYXB0dXJlc0ludFZhbHVlcyBjYXB0dXJlc19pbnRfdmFsdWVzOworCisgIGludF9tYXAuRm9yRWFjaCgmY2FwdHVyZXNfaW50X3ZhbHVlcyk7CisKKyAgc3RkOjptYXA8aW50LCBpbnQ+IHN0ZF9pbnRfbWFwID0gY2FwdHVyZXNfaW50X3ZhbHVlcy5Ub01hcCgpOworICBFWFBFQ1RfRVEoc3RkX2ludF9tYXBbMV0sIC0xKTsKKyAgRVhQRUNUX0VRKHN0ZF9pbnRfbWFwWzJdLCAtMik7Cit9CisKK2NsYXNzIEluc2VydFRocmVhZCA6IHB1YmxpYyBTaW1wbGVUaHJlYWQgeworIHB1YmxpYzoKKyAgSW5zZXJ0VGhyZWFkKGludCBzdGFydF92YWwsIGludCBlbmRfdmFsLCBJbnRUb0ludENvbmN1cnJlbnRNYXAqIG91dHB1dCkKKyAgICAgIDogU2ltcGxlVGhyZWFkKCJJbnNlcnRUaHJlYWQiKSwKKyAgICAgICAgdGVzdF9va18odHJ1ZSksCisgICAgICAgIHN0YXJ0X3ZhbHVlXyhzdGFydF92YWwpLAorICAgICAgICBlbmRfdmFsdWVfKGVuZF92YWwpLAorICAgICAgICBjb25jdXJyZW50X21hcF8ob3V0cHV0KSB7fQorCisgIHZpcnR1YWwgdm9pZCBSdW4oKSB7CisgICAgZm9yIChpbnQgaSA9IHN0YXJ0X3ZhbHVlXzsgaSA8IGVuZF92YWx1ZV87ICsraSkgeworICAgICAgaWYgKCFjb25jdXJyZW50X21hcF8tPlNldElmTWlzc2luZyhpLCBpKSkgeworICAgICAgICB0ZXN0X29rXyA9IGZhbHNlOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGJvb2wgdGVzdF9va187CisgIGludCBzdGFydF92YWx1ZV87CisgIGludCBlbmRfdmFsdWVfOworICBJbnRUb0ludENvbmN1cnJlbnRNYXAqIGNvbmN1cnJlbnRfbWFwXzsKK307CisKK1RFU1QoQ29uY3VycmVudE1hcCwgTXVsdGlUaHJlYWRUZXN0KSB7CisgIEludFRvSW50Q29uY3VycmVudE1hcCBzaGFyZWRfaW50X21hcDsKKyAgc3RkOjp2ZWN0b3I8SW5zZXJ0VGhyZWFkKj4gdGhyZWFkczsKKworICB0aHJlYWRzLnB1c2hfYmFjayhuZXcgSW5zZXJ0VGhyZWFkKDAsIDUwMDAsICZzaGFyZWRfaW50X21hcCkpOworICB0aHJlYWRzLnB1c2hfYmFjayhuZXcgSW5zZXJ0VGhyZWFkKDUwMDAsIDEwMDAwLCAmc2hhcmVkX2ludF9tYXApKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHRocmVhZHMuc2l6ZSgpOyArK2kpIHsKKyAgICB0aHJlYWRzW2ldLT5TdGFydCgpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aHJlYWRzLnNpemUoKTsgKytpKSB7CisgICAgdGhyZWFkc1tpXS0+Sm9pbigpOworICAgIEVYUEVDVF9UUlVFKHRocmVhZHNbaV0tPnRlc3Rfb2tfKTsKKyAgICBkZWxldGUgdGhyZWFkc1tpXTsKKyAgfQorCisgIHRocmVhZHMuY2xlYXIoKTsKKworICBBU1NFUlRfRVEoc2hhcmVkX2ludF9tYXAuR2V0U2l6ZSgpLCAxMDAwMCk7CisKKyAgQ2FwdHVyZXNJbnRWYWx1ZXMgY2FwdHVyZXNfaW50X3ZhbHVlczsKKworICBzaGFyZWRfaW50X21hcC5Gb3JFYWNoKCZjYXB0dXJlc19pbnRfdmFsdWVzKTsKKworICBzdGQ6Om1hcDxpbnQsIGludD4gc3RkX2ludF9tYXAgPSBjYXB0dXJlc19pbnRfdmFsdWVzLlRvTWFwKCk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwMDsgKytpKSB7CisgICAgQVNTRVJUX0VRKHN0ZF9pbnRfbWFwW2ldLCBpKTsKKworICAgIEludFRvSW50Q29uY3VycmVudE1hcDo6Q29uc3RFbnRyeUhhbmRsZSBjb25zdF9lbnRyeV9oYW5kbGU7CisgICAgQVNTRVJUX1RSVUUoc2hhcmVkX2ludF9tYXAuR2V0KGksICZjb25zdF9lbnRyeV9oYW5kbGUpKTsKKyAgICBBU1NFUlRfVFJVRShjb25zdF9lbnRyeV9oYW5kbGUuVmFsaWQoKSk7CisgICAgQVNTRVJUX0VRKGksIGNvbnN0X2VudHJ5X2hhbmRsZS5WYWx1ZSgpKTsKKyAgfQorfQorCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBuYgpkaWZmIC0tZ2l0IGEvc3JjL25iL2hhc2guaCBiL3NyYy9uYi9oYXNoLmgKaW5kZXggZmU0OGUzZC4uODQ0NTNjZCAxMDA2NDQKLS0tIGEvc3JjL25iL2hhc2guaAorKysgYi9zcmMvbmIvaGFzaC5oCkBAIC0xNyw2ICsxNyw3IEBACiAjaWZuZGVmIE5CX0hBU0hfSF8KICNkZWZpbmUgTkJfSEFTSF9IXwogCisjaW5jbHVkZSAibmIvYml0X2Nhc3QuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKIAogbmFtZXNwYWNlIG5iIHsKQEAgLTMyLDYgKzMzLDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW5ndGgsCiAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHByZXZfaGFzaCA9IGtEZWZhdWx0U2VlZCk7CiAKKy8vIENvbnZlbmllbmNlIGZ1bmN0b3IgZm9yIGhhc2hpbmcgcGxhaW4gb2xkIGRhdGEgdHlwZXMgbGlrZSBpbnQvZmxvYXQgZXRjIGFuZAorLy8gUE9EIHN0cnVjdHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KK3N0cnVjdCBQT0RIYXNoZXIgeworICB1aW50MzJfdCBvcGVyYXRvcigpKGNvbnN0IFQmIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIFJ1bnRpbWVIYXNoMzIocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnZhbHVlKSwgc2l6ZW9mKHZhbHVlKSk7CisgIH0KK307CisKKy8vIFNwZWNpYWxpemF0aW9uIHNvIHRoYXQgYWxsIHBvaW50ZXJzIGFyZSBQT0RzLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitzdHJ1Y3QgUE9ESGFzaGVyPFQqPiB7CisgIHVpbnQzMl90IG9wZXJhdG9yKCkoY29uc3Qgdm9pZCogcHRyKSBjb25zdCB7CisgICAgdWludHB0cl90IHB0cl92YWx1ZSA9IGJpdF9jYXN0PHVpbnRwdHJfdD4ocHRyKTsKKyAgICBQT0RIYXNoZXI8dWludHB0cl90PiBwb2RfaGFzaGVyOworICAgIHJldHVybiBwb2RfaGFzaGVyKHB0cl92YWx1ZSk7CisgIH0KK307CisKIH0gIC8vIG5hbWVzcGFjZSBuYgogCiAjZW5kaWYgIC8vIE5CX0hBU0hfSF8KZGlmZiAtLWdpdCBhL3NyYy9uYi9uYi5neXAgYi9zcmMvbmIvbmIuZ3lwCmluZGV4IGQ5ZWEzNjkuLjVlYmEyZjkgMTAwNjQ0Ci0tLSBhL3NyYy9uYi9uYi5neXAKKysrIGIvc3JjL25iL25iLmd5cApAQCAtMzMsNiArMzMsOCBAQAogICAgICAgICAgICAgJ2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl9oZWxwZXJzLmNjJywKICAgICAgICAgICAgICdhbmFseXRpY3MvbWVtb3J5X3RyYWNrZXJfaGVscGVycy5oJywKICAgICAgICAgICAgICdhdG9taWMuaCcsCisgICAgICAgICAgICAnYml0X2Nhc3QuaCcsCisgICAgICAgICAgICAnY29uY3VycmVudF9tYXAuaCcsCiAgICAgICAgICAgICAnZml4ZWRfbm9fZnJlZV9hbGxvY2F0b3IuY2MnLAogICAgICAgICAgICAgJ2ZpeGVkX25vX2ZyZWVfYWxsb2NhdG9yLmgnLAogICAgICAgICAgICAgJ2hhc2guY2MnLApAQCAtNTcsNiArNTksOCBAQAogICAgICAgICAgICAgJ3RocmVhZF9jb2xsaXNpb25fd2FybmVyLmNjJywKICAgICAgICAgICAgICd0aHJlYWRfY29sbGlzaW9uX3dhcm5lci5oJywKICAgICAgICAgICAgICd0aHJlYWRfbG9jYWxfb2JqZWN0LmgnLAorICAgICAgICAgICAgJ3RocmVhZF9sb2NhbF9ib29sZWFuLmgnLAorICAgICAgICAgICAgJ3RocmVhZF9sb2NhbF9wb2ludGVyLmgnLAogICAgICAgICAgIF0sCiAgICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cDpzdGFyYm9hcmQnLApAQCAtODMsNiArODcsNyBAQAogICAgICAgICAgICAgJ2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl9pbXBsX3Rlc3QuY2MnLAogICAgICAgICAgICAgJ2FuYWx5dGljcy9tZW1vcnlfdHJhY2tlcl90ZXN0LmNjJywKICAgICAgICAgICAgICdhdG9taWNfdGVzdC5jYycsCisgICAgICAgICAgICAnY29uY3VycmVudF9tYXBfdGVzdC5jYycsCiAgICAgICAgICAgICAnZml4ZWRfbm9fZnJlZV9hbGxvY2F0b3JfdGVzdC5jYycsCiAgICAgICAgICAgICAnbGV4aWNhbF9jYXN0X3Rlc3QuY2MnLAogICAgICAgICAgICAgJ21lbW9yeV9zY29wZV90ZXN0LmNjJywKZGlmZiAtLWdpdCBhL3NyYy9uYi90aHJlYWRfbG9jYWxfYm9vbGVhbi5oIGIvc3JjL25iL3RocmVhZF9sb2NhbF9ib29sZWFuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTcwMzM2ZAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9uYi90aHJlYWRfbG9jYWxfYm9vbGVhbi5oCkBAIC0wLDAgKzEsNTIgQEAKKy8qCisgKiBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorICoKKyAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisgKgorICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorICoKKyAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKyAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisgKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKyAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKyAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorICovCisKKyNpZm5kZWYgTkJfVEhSRUFEX0xPQ0FMX0JPT0xFQU5fSF8KKyNkZWZpbmUgTkJfVEhSRUFEX0xPQ0FMX0JPT0xFQU5fSF8KKworI2luY2x1ZGUgIm5iL3RocmVhZF9sb2NhbF9wb2ludGVyLmgiCisKK25hbWVzcGFjZSBuYiB7CisKK2NsYXNzIFRocmVhZExvY2FsQm9vbGVhbiB7CisgcHVibGljOgorICBUaHJlYWRMb2NhbEJvb2xlYW4oKSA6IGRlZmF1bHRfdmFsdWVfKGZhbHNlKSB7fQorICBleHBsaWNpdCBUaHJlYWRMb2NhbEJvb2xlYW4oYm9vbCBkZWZhdWx0X3ZhbHVlKQorICAgICAgOiBkZWZhdWx0X3ZhbHVlXyhkZWZhdWx0X3ZhbHVlKSB7fQorICB+VGhyZWFkTG9jYWxCb29sZWFuKCkge30KKworICBib29sIEdldCgpIGNvbnN0IHsKKyAgICBib29sIHZhbCA9IHRscF8uR2V0KCkgIT0gTlVMTDsKKyAgICByZXR1cm4gdmFsIF4gZGVmYXVsdF92YWx1ZV87CisgIH0KKworICB2b2lkIFNldChib29sIHZhbCkgeworICAgIHZhbCA9IHZhbCBeIGRlZmF1bHRfdmFsdWVfOworICAgIHRscF8uU2V0KHZhbCA/IFRydWVQb2ludGVyKCkgOiBGYWxzZVBvaW50ZXIoKSk7CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkKiBUcnVlUG9pbnRlcigpIHsgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KDB4MSk7IH0KKyAgc3RhdGljIHZvaWQqIEZhbHNlUG9pbnRlcigpIHsgcmV0dXJuIE5VTEw7IH0KKyAgVGhyZWFkTG9jYWxQb2ludGVyPHZvaWQ+IHRscF87CisgIGNvbnN0IGJvb2wgZGVmYXVsdF92YWx1ZV87CisKKyAgU0JfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFRocmVhZExvY2FsQm9vbGVhbik7Cit9OworCit9ICAvLyBuYW1lc3BhY2UgbmIuCisKKyNlbmRpZiAgLy8gTkJfVEhSRUFEX0xPQ0FMX1BPSU5URVJfSF8KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvbmIvdGhyZWFkX2xvY2FsX3BvaW50ZXIuaCBiL3NyYy9uYi90aHJlYWRfbG9jYWxfcG9pbnRlci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVjODYyMDgKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvbmIvdGhyZWFkX2xvY2FsX3BvaW50ZXIuaApAQCAtMCwwICsxLDUzIEBACisvKgorICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKyAqCisgKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKyAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKyAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorICoKKyAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKyAqCisgKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisgKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisgKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisgKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKyAqLworCisjaWZuZGVmIE5CX1RIUkVBRF9MT0NBTF9QT0lOVEVSX0hfCisjZGVmaW5lIE5CX1RIUkVBRF9MT0NBTF9QT0lOVEVSX0hfCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKKworbmFtZXNwYWNlIG5iIHsKKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CitjbGFzcyBUaHJlYWRMb2NhbFBvaW50ZXIgeworIHB1YmxpYzoKKyAgVGhyZWFkTG9jYWxQb2ludGVyKCkgeworICAgIHNsb3RfID0gU2JUaHJlYWRDcmVhdGVMb2NhbEtleShOVUxMKTsgIC8vIE5vIGRlc3RydWN0b3IgZm9yIHBvaW50ZXIuCisgICAgU0JfRENIRUNLKGtTYlRocmVhZExvY2FsS2V5SW52YWxpZCAhPSBzbG90Xyk7CisgIH0KKworICB+VGhyZWFkTG9jYWxQb2ludGVyKCkgeyBTYlRocmVhZERlc3Ryb3lMb2NhbEtleShzbG90Xyk7IH0KKworICBUeXBlKiBHZXQoKSBjb25zdCB7CisgICAgdm9pZCogcHRyID0gU2JUaHJlYWRHZXRMb2NhbFZhbHVlKHNsb3RfKTsKKyAgICBUeXBlKiB0eXBlX3B0ciA9IHN0YXRpY19jYXN0PFR5cGUqPihwdHIpOworICAgIHJldHVybiB0eXBlX3B0cjsKKyAgfQorCisgIHZvaWQgU2V0KFR5cGUqIHB0cikgeworICAgIHZvaWQqIHZvaWRfcHRyID0gc3RhdGljX2Nhc3Q8dm9pZCo+KHB0cik7CisgICAgU2JUaHJlYWRTZXRMb2NhbFZhbHVlKHNsb3RfLCB2b2lkX3B0cik7CisgIH0KKworIHByaXZhdGU6CisgIFNiVGhyZWFkTG9jYWxLZXkgc2xvdF87CisgIFNCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihUaHJlYWRMb2NhbFBvaW50ZXI8VHlwZT4pOworfTsKKworfSAgLy8gbmFtZXNwYWNlIG5iLgorCisjZW5kaWYgIC8vIE5CX1RIUkVBRF9MT0NBTF9QT0lOVEVSX0hfClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL25ldC9iYXNlL2JpZ19lbmRpYW4uaCBiL3NyYy9uZXQvYmFzZS9iaWdfZW5kaWFuLmgKaW5kZXggY2YyZWUyNi4uM2VlMDE1ZCAxMDA2NDQKLS0tIGEvc3JjL25ldC9iYXNlL2JpZ19lbmRpYW4uaAorKysgYi9zcmMvbmV0L2Jhc2UvYmlnX2VuZGlhbi5oCkBAIC01NCw3ICs1NCw3IEBACiAgIEJpZ0VuZGlhblJlYWRlcihjb25zdCB2b2lkKiBidWYsIHNpemVfdCBsZW4pOwogCiAgIGNvbnN0IGNoYXIqIHB0cigpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KLSAgaW50IHJlbWFpbmluZygpIGNvbnN0IHsgcmV0dXJuIGVuZF8gLSBwdHJfOyB9CisgIHN0ZDo6cHRyZGlmZl90IHJlbWFpbmluZygpIGNvbnN0IHsgcmV0dXJuIGVuZF8gLSBwdHJfOyB9CiAKICAgYm9vbCBTa2lwKHNpemVfdCBsZW4pOwogICBib29sIFJlYWRCeXRlcyh2b2lkKiBvdXQsIHNpemVfdCBsZW4pOwpAQCAtODAsNyArODAsNyBAQAogICBCaWdFbmRpYW5Xcml0ZXIodm9pZCogYnVmLCBzaXplX3QgbGVuKTsKIAogICBjaGFyKiBwdHIoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9Ci0gIGludCByZW1haW5pbmcoKSBjb25zdCB7IHJldHVybiBlbmRfIC0gcHRyXzsgfQorICBzdGQ6OnB0cmRpZmZfdCByZW1haW5pbmcoKSBjb25zdCB7IHJldHVybiBlbmRfIC0gcHRyXzsgfQogCiAgIGJvb2wgU2tpcChzaXplX3QgbGVuKTsKICAgYm9vbCBXcml0ZUJ5dGVzKGNvbnN0IHZvaWQqIGJ1Ziwgc2l6ZV90IGxlbik7CmRpZmYgLS1naXQgYS9zcmMvbmV0L2Jhc2UvbmV0X2Vycm9yX2xpc3QuaCBiL3NyYy9uZXQvYmFzZS9uZXRfZXJyb3JfbGlzdC5oCmluZGV4IDg0ZDI1MGYuLjVmNDE0NDEgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvYmFzZS9uZXRfZXJyb3JfbGlzdC5oCisrKyBiL3NyYy9uZXQvYmFzZS9uZXRfZXJyb3JfbGlzdC5oCkBAIC0yNTEsNyArMjUxLDkgQEAKIAogLy8gRXJyb3IgLTE0NCB3YXMgcmVtb3ZlZCAoTElNSVRfVklPTEFUSU9OKS4KIAotLy8gRXJyb3IgLTE0NSB3YXMgcmVtb3ZlZCAoV1NfUFJPVE9DT0xfRVJST1IpLgorLy8gV2Vic29ja2V0IHByb3RvY29sIGVycm9yLiBJbmRpY2F0ZXMgdGhhdCB3ZSBhcmUgdGVybWluYXRpbmcgdGhlIGNvbm5lY3Rpb24KKy8vIGR1ZSB0byBhIG1hbGZvcm1lZCBmcmFtZSBvciBvdGhlciBwcm90b2NvbCB2aW9sYXRpb24uCitORVRfRVJST1IoV1NfUFJPVE9DT0xfRVJST1IsIC0xNDUpCiAKIC8vIENvbm5lY3Rpb24gd2FzIGFib3J0ZWQgZm9yIHN3aXRjaGluZyB0byBhbm90aGVyIHB0b3RvY29sLgogLy8gV2ViU29ja2V0IGFib3J0IFNvY2tldFN0cmVhbSBjb25uZWN0aW9uIHdoZW4gYWx0ZXJuYXRlIHByb3RvY29sIGlzIGZvdW5kLgpkaWZmIC0tZ2l0IGEvc3JjL25ldC9uZXQuZ3lwIGIvc3JjL25ldC9uZXQuZ3lwCmluZGV4IDRhMGE3NDAuLjI4MTNkYzggMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvbmV0Lmd5cAorKysgYi9zcmMvbmV0L25ldC5neXAKQEAgLTY4MCw2ICs2ODAsOCBAQAogICAgICAgICAnd2Vic29ja2V0cy93ZWJzb2NrZXRfZXh0ZW5zaW9uLmgnLAogICAgICAgICAnd2Vic29ja2V0cy93ZWJzb2NrZXRfZXh0ZW5zaW9uX3BhcnNlci5jYycsCiAgICAgICAgICd3ZWJzb2NrZXRzL3dlYnNvY2tldF9leHRlbnNpb25fcGFyc2VyLmgnLAorICAgICAgICAnd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzLmgnLAorICAgICAgICAnd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzLmNjJywKICAgICAgICAgJ3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lLmNjJywKICAgICAgICAgJ3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lLmgnLAogICAgICAgICAnd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWVfcGFyc2VyLmNjJywKQEAgLTEwNDMsNiArMTA0NSw3IEBACiAgICAgICAgICd1cmxfcmVxdWVzdC91cmxfcmVxdWVzdF90aHJvdHRsZXJfdW5pdHRlc3QuY2MnLAogICAgICAgICAndXJsX3JlcXVlc3QvdXJsX3JlcXVlc3RfdW5pdHRlc3QuY2MnLAogICAgICAgICAndXJsX3JlcXVlc3Qvdmlld19jYWNoZV9oZWxwZXJfdW5pdHRlc3QuY2MnLAorICAgICAgICAnd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzX3Rlc3QuY2MnLAogICAgICAgICAnd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWVfcGFyc2VyX3VuaXR0ZXN0LmNjJywKICAgICAgICAgJ3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lX3VuaXR0ZXN0LmNjJywKICAgICAgICAgJ3dlYnNvY2tldHMvd2Vic29ja2V0X2hhbmRzaGFrZV9jaGFsbGVuZ2VfdGVzdC5jYycsCmRpZmYgLS1naXQgYS9zcmMvbmV0L3NvY2tldF9zdHJlYW0vc29ja2V0X3N0cmVhbS5jYyBiL3NyYy9uZXQvc29ja2V0X3N0cmVhbS9zb2NrZXRfc3RyZWFtLmNjCmluZGV4IDk1ZjU2YTcuLjE1ZjYyOTQgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvc29ja2V0X3N0cmVhbS9zb2NrZXRfc3RyZWFtLmNjCisrKyBiL3NyYy9uZXQvc29ja2V0X3N0cmVhbS9zb2NrZXRfc3RyZWFtLmNjCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSAibmV0L3NvY2tldF9zdHJlYW0vc29ja2V0X3N0cmVhbV9tZXRyaWNzLmgiCiAjaW5jbHVkZSAibmV0L3VybF9yZXF1ZXN0L3VybF9yZXF1ZXN0LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCiAKIHN0YXRpYyBjb25zdCBpbnQga01heFBlbmRpbmdTZW5kQWxsb3dlZCA9IDMyNzY4OyAgLy8gMzIga2lsb2J5dGVzLgogc3RhdGljIGNvbnN0IGludCBrUmVhZEJ1ZmZlclNpemUgPSA0MDk2OwpkaWZmIC0tZ2l0IGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9lcnJvcnMuY2MgYi9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2Vycm9ycy5jYwppbmRleCA5MGYxZjVkLi42ODIzMjAzIDEwMDY0NAotLS0gYS9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2Vycm9ycy5jYworKysgYi9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2Vycm9ycy5jYwpAQCAtMiwyMyArMiw2NiBAQAogLy8gVXNlIG9mIHRoaXMgc291cmNlIGNvZGUgaXMgZ292ZXJuZWQgYnkgYSBCU0Qtc3R5bGUgbGljZW5zZSB0aGF0IGNhbiBiZQogLy8gZm91bmQgaW4gdGhlIExJQ0VOU0UgZmlsZS4KIAotI2luY2x1ZGUgIm5ldC93ZWJzb2NrZXQvd2Vic29ja2V0X2Vycm9ycy5oIgorI2luY2x1ZGUgIm5ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9lcnJvcnMuaCIKKworI2luY2x1ZGUgImJhc2UvbG9nZ2luZy5oIgogCiBuYW1lc3BhY2UgbmV0IHsKIAogRXJyb3IgV2ViU29ja2V0RXJyb3JUb05ldEVycm9yKFdlYlNvY2tldEVycm9yIGVycm9yKSB7CiAgIHN3aXRjaCAoZXJyb3IpIHsKLSAgICBjYXNlIFdFQl9TT0NLRVRfT0s6CisgICAgY2FzZSBrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZToKICAgICAgIHJldHVybiBPSzsKLSAgICBjYXNlIFdFQl9TT0NLRVRfRVJSX1BST1RPQ09MX0VSUk9SOgorCisgICAgY2FzZSBrV2ViU29ja2V0RXJyb3JHb2luZ0F3YXk6ICAvLyBUT0RPKHJpY2VhKTogTW9yZSBzcGVjaWZpYyBjb2RlPworICAgIGNhc2Uga1dlYlNvY2tldEVycm9yUHJvdG9jb2xFcnJvcjoKKyAgICBjYXNlIGtXZWJTb2NrZXRFcnJvclVuc3VwcG9ydGVkRGF0YToKKyAgICBjYXNlIGtXZWJTb2NrZXRFcnJvckludmFsaWRGcmFtZVBheWxvYWREYXRhOgorICAgIGNhc2Uga1dlYlNvY2tldEVycm9yUG9saWN5VmlvbGF0aW9uOgorICAgIGNhc2Uga1dlYlNvY2tldEVycm9yTWFuZGF0b3J5RXh0ZW5zaW9uOgorICAgIGNhc2Uga1dlYlNvY2tldEVycm9ySW50ZXJuYWxTZXJ2ZXJFcnJvcjoKICAgICAgIHJldHVybiBFUlJfV1NfUFJPVE9DT0xfRVJST1I7Ci0gICAgY2FzZSBXRUJfU09DS0VUX0VSUl9NRVNTQUdFX1RPT19CSUc6CisKKyAgICBjYXNlIGtXZWJTb2NrZXRFcnJvck5vU3RhdHVzUmVjZWl2ZWQ6CisgICAgY2FzZSBrV2ViU29ja2V0RXJyb3JBYm5vcm1hbENsb3N1cmU6CisgICAgICByZXR1cm4gRVJSX0NPTk5FQ1RJT05fQ0xPU0VEOworCisgICAgY2FzZSBrV2ViU29ja2V0RXJyb3JUbHNIYW5kc2hha2U6CisgICAgICAvLyBUaGlzIGVycm9yIHdpbGwgcHJvYmFibHkgYmUgcmVwb3J0ZWQgd2l0aCBtb3JlIGRldGFpbCBhdCBhIGxvd2VyIGxheWVyOworICAgICAgLy8gdGhpcyBpcyB0aGUgYmVzdCB3ZSBjYW4gZG8gYXQgdGhpcyBsYXllci4KKyAgICAgIHJldHVybiBFUlJfU1NMX1BST1RPQ09MX0VSUk9SOworCisgICAgY2FzZSBrV2ViU29ja2V0RXJyb3JNZXNzYWdlVG9vQmlnOgogICAgICAgcmV0dXJuIEVSUl9NU0dfVE9PX0JJRzsKKwogICAgIGRlZmF1bHQ6Ci0gICAgICBOT1RSRUFDSEVEKCk7CisgICAgICByZXR1cm4gRVJSX1VORVhQRUNURUQ7CiAgIH0KIH0KIAotfSAgLy8gbmFtZXNwYWNlIG5ldAorLy8gVGhhdCB0aGlzIGZ1bmN0aW9uIHdhcyBhZGFwdGVkIGZyb20gQ2hyb21pdW0ncyBJc1N0cmljdGx5VmFsaWRDbG9zZVN0YXR1c0NvZGUKKy8vIFRoZXkgZGlmZmVyIGluIHRoYXQgY29kZXMgMTAwNCwgMTAwNSwgYW5kIDEwMDYgYXJlIHJlc2VydmVkIGNvZGVzIGFuZCBtdXN0CisvLyBub3QgYmUgc2V0IGluIGEgQ2xvc2UgbWVzc2FnZS4gIENocm9taXVtJ3MgY2hlY2sgaXMgZGlmZmVyZW50IHNpbmNlIHRoZXkKKy8vIGNoZWNrIGZvciByZXNlcnZlZCBjb2RlcyBzZXBhcmF0ZWx5LgorYm9vbCBJc1ZhbGlkQ2xvc2VTdGF0dXNDb2RlKGludCBjb2RlKSB7CisgIHN0YXRpYyBjb25zdCBpbnQga0ludmFsaWRSYW5nZXNbXSA9IHsKKyAgICAgIC8vIFtCQUQsIE9LKQorICAgICAgMCwgICAgMTAwMCwgICAvLyAxMDAwIGlzIHRoZSBmaXJzdCB2YWxpZCBjb2RlCisgICAgICAxMDA0LCAxMDA3LCAgIC8vIDEwMDQtMTAwNiBhcmUgcmVzZXJ2ZWQuCisgICAgICAxMDE0LCAzMDAwLCAgIC8vIDEwMTQgdW5hc3NpZ25lZDsgMTAxNSB1cCB0byAyOTk5IGFyZSByZXNlcnZlZC4KKyAgICAgIDUwMDAsIDY1NTM2LCAgLy8gQ29kZXMgYWJvdmUgNTAwMCBhcmUgaW52YWxpZC4KKyAgfTsKKyAgY29uc3QgaW50KiBjb25zdCBrSW52YWxpZFJhbmdlc0VuZCA9CisgICAgICBrSW52YWxpZFJhbmdlcyArIGFycmF5c2l6ZShrSW52YWxpZFJhbmdlcyk7CiAKLSNlbmRpZiAgLy8gTkVUX1dFQlNPQ0tFVFNfV0VCU09DS0VUX0ZSQU1FX0hfCisgIERDSEVDS19HRShjb2RlLCAwKTsKKyAgRENIRUNLX0xUKGNvZGUsIDY1NTM2KTsKKyAgY29uc3QgaW50KiB1cHBlciA9IHN0ZDo6dXBwZXJfYm91bmQoa0ludmFsaWRSYW5nZXMsIGtJbnZhbGlkUmFuZ2VzRW5kLCBjb2RlKTsKKyAgRENIRUNLX05FKGtJbnZhbGlkUmFuZ2VzRW5kLCB1cHBlcik7CisgIERDSEVDS19HVCh1cHBlciwga0ludmFsaWRSYW5nZXMpOworICBEQ0hFQ0tfR1QoKnVwcGVyLCBjb2RlKTsKKyAgRENIRUNLX0xFKCoodXBwZXIgLSAxKSwgY29kZSk7CisgIHJldHVybiAoKHVwcGVyIC0ga0ludmFsaWRSYW5nZXMpICUgMikgPT0gMDsKK30KKworfSAgLy8gbmFtZXNwYWNlIG5ldApkaWZmIC0tZ2l0IGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9lcnJvcnMuaCBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzLmgKaW5kZXggM2M5NWZhYy4uNjE2ZjU3YSAxMDA2NDQKLS0tIGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9lcnJvcnMuaAorKysgYi9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2Vycm9ycy5oCkBAIC05LDE3ICs5LDUxIEBACiAKIG5hbWVzcGFjZSBuZXQgewogCi0vLyBFcnJvciB2YWx1ZXMgZm9yIFdlYlNvY2tldCBmcmFtaW5nLgotLy8gVGhpcyB2YWx1ZXMgYXJlIGNvbXBhdGlibGUgdG8gUkZDNjQ1NSBkZWZpbmVkIHN0YXR1cyBjb2Rlcy4KKy8vIFJlYXNvbiBjb2RlcyB1c2VkIHdpdGggY2xvc2UgbWVzc2FnZXMuIE5vU3RhdHVzUmVjZWl2ZWQsCisvLyBBYm5vcm1hbENsb3N1cmUgYW5kIFRsc0hhbmRzaGFrZSBhcmUgc3BlY2lhbCBpbiB0aGF0IHRoZXkKKy8vIHNob3VsZCBuZXZlciBiZSBzZW50IG9uIHRoZSB3aXJlOyB0aGV5IGFyZSBvbmx5IHVzZWQgd2l0aGluIHRoZQorLy8gaW1wbGVtZW50YXRpb24uCiBlbnVtIFdlYlNvY2tldEVycm9yIHsKLSAgV0VCX1NPQ0tFVF9PSyA9IDEwMDAsCi0gIFdFQl9TT0NLRVRfRVJSX1BST1RPQ09MX0VSUk9SID0gMTAwMiwKLSAgV0VCX1NPQ0tFVF9FUlJfTUVTU0FHRV9UT09fQklHID0gMTAwOQorICAvLyBTdGF0dXMgY29kZXMgaW4gdGhlIHJhbmdlIDAgdG8gOTk5IGFyZSBub3QgdXNlZC4KKworICAvLyBUaGUgZm9sbG93aW5nIGFyZSBkZWZpbmVkIGJ5IFJGQzY0NTUuCisgIGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlID0gMTAwMCwKKyAga1dlYlNvY2tldEVycm9yR29pbmdBd2F5ID0gMTAwMSwKKyAga1dlYlNvY2tldEVycm9yUHJvdG9jb2xFcnJvciA9IDEwMDIsCisgIGtXZWJTb2NrZXRFcnJvclVuc3VwcG9ydGVkRGF0YSA9IDEwMDMsCisgIGtXZWJTb2NrZXRFcnJvck5vU3RhdHVzUmVjZWl2ZWQgPSAxMDA1LAorICBrV2ViU29ja2V0RXJyb3JBYm5vcm1hbENsb3N1cmUgPSAxMDA2LAorICBrV2ViU29ja2V0RXJyb3JJbnZhbGlkRnJhbWVQYXlsb2FkRGF0YSA9IDEwMDcsCisgIGtXZWJTb2NrZXRFcnJvclBvbGljeVZpb2xhdGlvbiA9IDEwMDgsCisgIGtXZWJTb2NrZXRFcnJvck1lc3NhZ2VUb29CaWcgPSAxMDA5LAorICBrV2ViU29ja2V0RXJyb3JNYW5kYXRvcnlFeHRlbnNpb24gPSAxMDEwLAorICBrV2ViU29ja2V0RXJyb3JJbnRlcm5hbFNlcnZlckVycm9yID0gMTAxMSwKKyAga1dlYlNvY2tldEVycm9yVGxzSGFuZHNoYWtlID0gMTAxNSwKKworICAvLyBUaGUgcmFuZ2UgMTAwMC0yOTk5IGlzIHJlc2VydmVkIGJ5IFJGQzY0NTUgZm9yIHVzZSBieSB0aGUgV2ViU29ja2V0CisgIC8vIHByb3RvY29sIGFuZCBwdWJsaWMgZXh0ZW5zaW9ucy4KKyAga1dlYlNvY2tldEVycm9yUHJvdG9jb2xSZXNlcnZlZE1heCA9IDI5OTksCisKKyAgLy8gVGhlIHJhbmdlIDMwMDAtMzk5OSBpcyByZXNlcnZlZCBieSBSRkM2NDU1IGZvciByZWdpc3RlcmVkIHVzZSBieSBsaWJyYXJpZXMsCisgIC8vIGZyYW1ld29ya3MgYW5kIGFwcGxpY2F0aW9ucy4KKyAga1dlYlNvY2tldEVycm9yUmVnaXN0ZXJlZFJlc2VydmVkTWluID0gMzAwMCwKKyAga1dlYlNvY2tldEVycm9yUmVnaXN0ZXJlZFJlc2VydmVkTWF4ID0gMzk5OSwKKworICAvLyBUaGUgcmFuZ2UgNDAwMC00OTk5IGlzIHJlc2VydmVkIGJ5IFJGQzY0NTUgZm9yIHByaXZhdGUgdXNlIGJ5IHByaW9yCisgIC8vIGFncmVlbWVudCBvZiB0aGUgZW5kcG9pbnRzLgorICBrV2ViU29ja2V0RXJyb3JQcml2YXRlUmVzZXJ2ZWRNaW4gPSA0MDAwLAorICBrV2ViU29ja2V0RXJyb3JQcml2YXRlUmVzZXJ2ZWRNYXggPSA0OTk5LAogfTsKIAogLy8gQ29udmVydCBXZWJTb2NrZXRFcnJvciB0byBuZXQ6OkVycm9yIGRlZmluZWQgaW4gbmV0L2Jhc2UvbmV0X2Vycm9ycy5oLgogRXJyb3IgV2ViU29ja2V0RXJyb3JUb05ldEVycm9yKFdlYlNvY2tldEVycm9yIGVycm9yKTsKIAorLy8gQ2hlY2sgYSBjbG9zZSBzdGF0dXMgY29kZSBmb3Igc3RyaWN0IGNvbXBsaWFuY2Ugd2l0aCBSRkM2NDU1LgorLy8gVGhhdCB0aGlzIGZ1bmN0aW9uIHdhcyBhZGFwdGVkIGZyb20gQ2hyb21pdW0ncyBJc1N0cmljdGx5VmFsaWRDbG9zZVN0YXR1c0NvZGUKKy8vIFRoZXkgZGlmZmVyIGluIHRoYXQgY29kZXMgMTAwNCwgMTAwNSwgYW5kIDEwMDYgYXJlIHJlc2VydmVkIGNvZGVzIGFuZCBtdXN0CisvLyBub3QgYmUgc2V0IGluIGEgQ2xvc2UgbWVzc2FnZS4gIENocm9taXVtJ3MgY2hlY2sgaXMgZGlmZmVyZW50IHNpbmNlIHRoZXkKKy8vIGNoZWNrIGZvciByZXNlcnZlZCBjb2RlcyBzZXBhcmF0ZWx5LgorYm9vbCBJc1ZhbGlkQ2xvc2VTdGF0dXNDb2RlKGludCBjb2RlKTsKIH0gIC8vIG5hbWVzcGFjZSBuZXQKIAotI2VuZGlmICAvLyBORVRfV0VCU09DS0VUU19XRUJTT0NLRVRfRlJBTUVfSF8KKyNlbmRpZiAgLy8gTkVUX1dFQlNPQ0tFVFNfV0VCU09DS0VUX0VSUk9SU19IXwpkaWZmIC0tZ2l0IGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9lcnJvcnNfdGVzdC5jYyBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzX3Rlc3QuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWE4NjZhMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZXJyb3JzX3Rlc3QuY2MKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTMgVGhlIENocm9taXVtIEF1dGhvcnMuIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCisvLyBmb3VuZCBpbiB0aGUgTElDRU5TRSBmaWxlLgorCisjaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2Vycm9ycy5oIgorCisjaW5jbHVkZSAibmV0L2Jhc2UvbmV0X2Vycm9ycy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ21vY2svaW5jbHVkZS9nbW9jay9nbW9jay5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCituYW1lc3BhY2UgbmV0IHsKK25hbWVzcGFjZSB7CisKKy8vIENvbmZpcm0gdGhhdCB0aGUgcHJpbmNpcGxlIGNsYXNzZXMgb2YgZXJyb3JzIGFyZSBjb252ZXJ0ZWQgY29ycmVjdGx5LiBXZQorLy8gZG9uJ3QgZXhoYXVzdGl2ZWx5IHRlc3QgZXZlcnkgZXJyb3IgY29kZSwgYXMgaXQgd291bGQgYmUgbG9uZywgcmVwZXRpdGl2ZSwKKy8vIGFuZCBhZGQgbGl0dGxlIHZhbHVlLgorVEVTVChXZWJTb2NrZXRFcnJvclRvTmV0RXJyb3JUZXN0LCBSZXN1bHRzQXJlQ29ycmVjdCkgeworICBFWFBFQ1RfVEhBVChXZWJTb2NrZXRFcnJvclRvTmV0RXJyb3Ioa1dlYlNvY2tldE5vcm1hbENsb3N1cmUpLCBuZXQ6Ok9LKTsKKyAgRVhQRUNUX0VRKEVSUl9XU19QUk9UT0NPTF9FUlJPUiwKKyAgICAgICAgICAgIFdlYlNvY2tldEVycm9yVG9OZXRFcnJvcihrV2ViU29ja2V0RXJyb3JQcm90b2NvbEVycm9yKSk7CisgIEVYUEVDVF9FUShFUlJfTVNHX1RPT19CSUcsCisgICAgICAgICAgICBXZWJTb2NrZXRFcnJvclRvTmV0RXJyb3Ioa1dlYlNvY2tldEVycm9yTWVzc2FnZVRvb0JpZykpOworICBFWFBFQ1RfRVEoRVJSX0NPTk5FQ1RJT05fQ0xPU0VELAorICAgICAgICAgICAgV2ViU29ja2V0RXJyb3JUb05ldEVycm9yKGtXZWJTb2NrZXRFcnJvck5vU3RhdHVzUmVjZWl2ZWQpKTsKKyAgRVhQRUNUX0VRKEVSUl9TU0xfUFJPVE9DT0xfRVJST1IsCisgICAgICAgICAgICBXZWJTb2NrZXRFcnJvclRvTmV0RXJyb3Ioa1dlYlNvY2tldEVycm9yVGxzSGFuZHNoYWtlKSk7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorfSAgLy8gbmFtZXNwYWNlIG5ldApkaWZmIC0tZ2l0IGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZS5jYyBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWUuY2MKaW5kZXggMDgyNDA2My4uYjhiYTEzMCAxMDA2NDQKLS0tIGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZS5jYworKysgYi9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lLmNjCkBAIC00MCwxMyArNDAsNiBAQAogbmFtZXNwYWNlIG5ldCB7CiAKIC8vIERlZmluaXRpb25zIGZvciBpbi1zdHJ1Y3QgY29uc3RhbnRzLgotY29uc3QgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZUNvbnRpbnVhdGlvbiA9Ci0gICAgMHgwOwotY29uc3QgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZVRleHQgPSAweDE7Ci1jb25zdCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlIFdlYlNvY2tldEZyYW1lSGVhZGVyOjprT3BDb2RlQmluYXJ5ID0gMHgyOwotY29uc3QgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZUNsb3NlID0gMHg4OwotY29uc3QgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZVBpbmcgPSAweDk7Ci1jb25zdCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlIFdlYlNvY2tldEZyYW1lSGVhZGVyOjprT3BDb2RlUG9uZyA9IDB4QTsKIAogV2ViU29ja2V0RnJhbWVDaHVuazo6V2ViU29ja2V0RnJhbWVDaHVuaygpIDogZmluYWxfY2h1bmsoZmFsc2UpIHsKIH0KZGlmZiAtLWdpdCBhL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWUuaCBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWUuaAppbmRleCA0NmIwMTFmLi40NmM1ODA1IDEwMDY0NAotLS0gYS9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lLmgKKysrIGIvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZS5oCkBAIC0yMSwxMyArMjEsMTQgQEAKIC8vIE1lbWJlcnMgb2YgdGhpcyBjbGFzcyBjb3JyZXNwb25kIHRvIGVhY2ggZWxlbWVudCBpbiBXZWJTb2NrZXQgZnJhbWUgaGVhZGVyCiAvLyAoc2VlIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzY0NTUjc2VjdGlvbi01LjIpLgogc3RydWN0IE5FVF9FWFBPUlQgV2ViU29ja2V0RnJhbWVIZWFkZXIgewotICB0eXBlZGVmIGludCBPcENvZGU7Ci0gIHN0YXRpYyBjb25zdCBPcENvZGUga09wQ29kZUNvbnRpbnVhdGlvbjsKLSAgc3RhdGljIGNvbnN0IE9wQ29kZSBrT3BDb2RlVGV4dDsKLSAgc3RhdGljIGNvbnN0IE9wQ29kZSBrT3BDb2RlQmluYXJ5OwotICBzdGF0aWMgY29uc3QgT3BDb2RlIGtPcENvZGVDbG9zZTsKLSAgc3RhdGljIGNvbnN0IE9wQ29kZSBrT3BDb2RlUGluZzsKLSAgc3RhdGljIGNvbnN0IE9wQ29kZSBrT3BDb2RlUG9uZzsKKyAgZW51bSBPcENvZGUgeworICAgIGtPcENvZGVDb250aW51YXRpb24gPSAweDAsCisgICAga09wQ29kZVRleHQgPSAweDEsCisgICAga09wQ29kZUJpbmFyeSA9IDB4MiwKKyAgICBrT3BDb2RlQ2xvc2UgPSAweDgsCisgICAga09wQ29kZVBpbmcgPSAweDksCisgICAga09wQ29kZVBvbmcgPSAweEEKKyAgfTsKIAogICAvLyBUaGVzZSB2YWx1ZXMgbXVzdCBiZSBhIGNvbXBpbGUtdGltZSBjb25zdGFudC4gImVudW0gaGFjayIgaXMgdXNlZCBoZXJlCiAgIC8vIHRvIG1ha2UgTVNWQyBoYXBweS4KZGlmZiAtLWdpdCBhL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWVfcGFyc2VyLmNjIGIvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV9wYXJzZXIuY2MKaW5kZXggYjE2OTk2ZC4uYTc5Y2M2MyAxMDA2NDQKLS0tIGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV9wYXJzZXIuY2MKKysrIGIvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV9wYXJzZXIuY2MKQEAgLTM2LDcgKzM2LDcgQEAKIFdlYlNvY2tldEZyYW1lUGFyc2VyOjpXZWJTb2NrZXRGcmFtZVBhcnNlcigpCiAgICAgOiBjdXJyZW50X3JlYWRfcG9zXygwKSwKICAgICAgIGZyYW1lX29mZnNldF8oMCksCi0gICAgICB3ZWJzb2NrZXRfZXJyb3JfKFdFQl9TT0NLRVRfT0spIHsKKyAgICAgIHdlYnNvY2tldF9lcnJvcl8oa1dlYlNvY2tldE5vcm1hbENsb3N1cmUpIHsKICAgc3RkOjpmaWxsKG1hc2tpbmdfa2V5Xy5rZXksCiAgICAgICAgICAgICBtYXNraW5nX2tleV8ua2V5ICsgV2ViU29ja2V0RnJhbWVIZWFkZXI6OmtNYXNraW5nS2V5TGVuZ3RoLAogICAgICAgICAgICAgJ1wwJyk7CkBAIC00OSw3ICs0OSw3IEBACiAgICAgY29uc3QgY2hhciogZGF0YSwKICAgICBzaXplX3QgbGVuZ3RoLAogICAgIFNjb3BlZFZlY3RvcjxXZWJTb2NrZXRGcmFtZUNodW5rPiogZnJhbWVfY2h1bmtzKSB7Ci0gIGlmICh3ZWJzb2NrZXRfZXJyb3JfICE9IFdFQl9TT0NLRVRfT0spCisgIGlmICh3ZWJzb2NrZXRfZXJyb3JfICE9IGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlKQogICAgIHJldHVybiBmYWxzZTsKICAgaWYgKCFsZW5ndGgpCiAgICAgcmV0dXJuIHRydWU7CkBAIC02MSw3ICs2MSw3IEBACiAgICAgYm9vbCBmaXJzdF9jaHVuayA9IGZhbHNlOwogICAgIGlmICghY3VycmVudF9mcmFtZV9oZWFkZXJfLmdldCgpKSB7CiAgICAgICBEZWNvZGVGcmFtZUhlYWRlcigpOwotICAgICAgaWYgKHdlYnNvY2tldF9lcnJvcl8gIT0gV0VCX1NPQ0tFVF9PSykKKyAgICAgIGlmICh3ZWJzb2NrZXRfZXJyb3JfICE9IGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlKQogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICAvLyBJZiBmcmFtZSBoZWFkZXIgaXMgaW5jb21wbGV0ZSwgdGhlbiBjYXJyeSBvdmVyIHRoZSByZW1haW5pbmcKICAgICAgIC8vIGRhdGEgdG8gdGhlIG5leHQgcm91bmQgb2YgRGVjb2RlKCkuCkBAIC0xMTcsNyArMTE3LDcgQEAKICAgYm9vbCByZXNlcnZlZDEgPSAoZmlyc3RfYnl0ZSAmIGtSZXNlcnZlZDFCaXQpICE9IDA7CiAgIGJvb2wgcmVzZXJ2ZWQyID0gKGZpcnN0X2J5dGUgJiBrUmVzZXJ2ZWQyQml0KSAhPSAwOwogICBib29sIHJlc2VydmVkMyA9IChmaXJzdF9ieXRlICYga1Jlc2VydmVkM0JpdCkgIT0gMDsKLSAgT3BDb2RlIG9wY29kZSA9IGZpcnN0X2J5dGUgJiBrT3BDb2RlTWFzazsKKyAgT3BDb2RlIG9wY29kZSA9IE9wQ29kZShmaXJzdF9ieXRlICYga09wQ29kZU1hc2spOwogCiAgIGJvb2wgbWFza2VkID0gKHNlY29uZF9ieXRlICYga01hc2tCaXQpICE9IDA7CiAgIHVpbnQ2NCBwYXlsb2FkX2xlbmd0aCA9IHNlY29uZF9ieXRlICYga1BheWxvYWRMZW5ndGhNYXNrOwpAQCAtMTI5LDcgKzEyOSw3IEBACiAgICAgY3VycmVudCArPSAyOwogICAgIHBheWxvYWRfbGVuZ3RoID0gcGF5bG9hZF9sZW5ndGhfMTY7CiAgICAgaWYgKHBheWxvYWRfbGVuZ3RoIDw9IGtNYXhQYXlsb2FkTGVuZ3RoV2l0aG91dEV4dGVuZGVkTGVuZ3RoRmllbGQpCi0gICAgICB3ZWJzb2NrZXRfZXJyb3JfID0gV0VCX1NPQ0tFVF9FUlJfUFJPVE9DT0xfRVJST1I7CisgICAgICB3ZWJzb2NrZXRfZXJyb3JfID0ga1dlYlNvY2tldEVycm9yUHJvdG9jb2xFcnJvcjsKICAgfSBlbHNlIGlmIChwYXlsb2FkX2xlbmd0aCA9PSBrUGF5bG9hZExlbmd0aFdpdGhFaWdodEJ5dGVFeHRlbmRlZExlbmd0aEZpZWxkKSB7CiAgICAgaWYgKGVuZCAtIGN1cnJlbnQgPCA4KQogICAgICAgcmV0dXJuOwpAQCAtMTM3LDEyICsxMzcsMTIgQEAKICAgICBjdXJyZW50ICs9IDg7CiAgICAgaWYgKHBheWxvYWRfbGVuZ3RoIDw9IGt1aW50MTZtYXggfHwKICAgICAgICAgcGF5bG9hZF9sZW5ndGggPiBzdGF0aWNfY2FzdDx1aW50NjQ+KGtpbnQ2NG1heCkpIHsKLSAgICAgIHdlYnNvY2tldF9lcnJvcl8gPSBXRUJfU09DS0VUX0VSUl9QUk9UT0NPTF9FUlJPUjsKKyAgICAgIHdlYnNvY2tldF9lcnJvcl8gPSBrV2ViU29ja2V0RXJyb3JQcm90b2NvbEVycm9yOwogICAgIH0gZWxzZSBpZiAocGF5bG9hZF9sZW5ndGggPiBzdGF0aWNfY2FzdDx1aW50NjQ+KGtpbnQzMm1heCkpIHsKLSAgICAgIHdlYnNvY2tldF9lcnJvcl8gPSBXRUJfU09DS0VUX0VSUl9NRVNTQUdFX1RPT19CSUc7CisgICAgICB3ZWJzb2NrZXRfZXJyb3JfID0ga1dlYlNvY2tldEVycm9yTWVzc2FnZVRvb0JpZzsKICAgICB9CiAgIH0KLSAgaWYgKHdlYnNvY2tldF9lcnJvcl8gIT0gV0VCX1NPQ0tFVF9PSykgeworICBpZiAod2Vic29ja2V0X2Vycm9yXyAhPSBrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZSkgewogICAgIGJ1ZmZlcl8uY2xlYXIoKTsKICAgICBjdXJyZW50X3JlYWRfcG9zXyA9IDA7CiAgICAgY3VycmVudF9mcmFtZV9oZWFkZXJfLnJlc2V0KCk7CkBAIC0xOTAsNyArMTkwLDcgQEAKICAgaWYgKG5leHRfc2l6ZSkgewogICAgIGZyYW1lX2NodW5rLT5kYXRhID0gbmV3IElPQnVmZmVyV2l0aFNpemUoc3RhdGljX2Nhc3Q8aW50PihuZXh0X3NpemUpKTsKICAgICBjaGFyKiBpb19kYXRhID0gZnJhbWVfY2h1bmstPmRhdGEtPmRhdGEoKTsKLSAgICBtZW1jcHkoaW9fZGF0YSwgY3VycmVudCwgbmV4dF9zaXplKTsKKyAgICBTYk1lbW9yeUNvcHkoaW9fZGF0YSwgY3VycmVudCwgbmV4dF9zaXplKTsKICAgICBpZiAoY3VycmVudF9mcmFtZV9oZWFkZXJfLT5tYXNrZWQpIHsKICAgICAgIC8vIFRoZSBtYXNraW5nIGZ1bmN0aW9uIGlzIGl0cyBvd24gaW52ZXJzZSwgc28gd2UgdXNlIHRoZSBzYW1lIGZ1bmN0aW9uIHRvCiAgICAgICAvLyB1bm1hc2sgYXMgdG8gbWFzay4KZGlmZiAtLWdpdCBhL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWVfcGFyc2VyX3VuaXR0ZXN0LmNjIGIvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV9wYXJzZXJfdW5pdHRlc3QuY2MKaW5kZXggNjUzZjY2OS4uZWI1MjQyZSAxMDA2NDQKLS0tIGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV9wYXJzZXJfdW5pdHRlc3QuY2MKKysrIGIvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV9wYXJzZXJfdW5pdHRlc3QuY2MKQEAgLTM1LDE5ICszNSwxOCBAQAogfTsKIAogY29uc3QgRnJhbWVIZWFkZXJUZXN0Q2FzZSBrRnJhbWVIZWFkZXJUZXN0c1tdID0gewotICB7ICJceDgxXHgwMCIsIDIsIEdHX1VJTlQ2NF9DKDApLCBXRUJfU09DS0VUX09LIH0sCi0gIHsgIlx4ODFceDdEIiwgMiwgR0dfVUlOVDY0X0MoMTI1KSwgV0VCX1NPQ0tFVF9PSyB9LAotICB7ICJceDgxXHg3RVx4MDBceDdFIiwgNCwgR0dfVUlOVDY0X0MoMTI2KSwgV0VCX1NPQ0tFVF9PSyB9LAotICB7ICJceDgxXHg3RVx4RkZceEZGIiwgNCwgR0dfVUlOVDY0X0MoMHhGRkZGKSwgV0VCX1NPQ0tFVF9PSyB9LAotICB7ICJceDgxXHg3Rlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMVx4MDBceDAwIiwgMTAsIEdHX1VJTlQ2NF9DKDB4MTAwMDApLAotICAgIFdFQl9TT0NLRVRfT0sgfSwKLSAgeyAiXHg4MVx4N0ZceDAwXHgwMFx4MDBceDAwXHg3Rlx4RkZceEZGXHhGRiIsIDEwLCBHR19VSU5UNjRfQygweDdGRkZGRkZGKSwKLSAgICBXRUJfU09DS0VUX09LIH0sCi0gIHsgIlx4ODFceDdGXHgwMFx4MDBceDAwXHgwMFx4ODBceDAwXHgwMFx4MDAiLCAxMCwgR0dfVUlOVDY0X0MoMHg4MDAwMDAwMCksCi0gICAgV0VCX1NPQ0tFVF9FUlJfTUVTU0FHRV9UT09fQklHIH0sCi0gIHsgIlx4ODFceDdGXHg3Rlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkYiLCAxMCwKLSAgICBHR19VSU5UNjRfQygweDdGRkZGRkZGRkZGRkZGRkYpLCBXRUJfU09DS0VUX0VSUl9NRVNTQUdFX1RPT19CSUcgfQotfTsKKyAgICB7Ilx4ODFceDAwIiwgMiwgR0dfVUlOVDY0X0MoMCksIGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlfSwKKyAgICB7Ilx4ODFceDdEIiwgMiwgR0dfVUlOVDY0X0MoMTI1KSwga1dlYlNvY2tldE5vcm1hbENsb3N1cmV9LAorICAgIHsiXHg4MVx4N0VceDAwXHg3RSIsIDQsIEdHX1VJTlQ2NF9DKDEyNiksIGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlfSwKKyAgICB7Ilx4ODFceDdFXHhGRlx4RkYiLCA0LCBHR19VSU5UNjRfQygweEZGRkYpLCBrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZX0sCisgICAgeyJceDgxXHg3Rlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMVx4MDBceDAwIiwgMTAsIEdHX1VJTlQ2NF9DKDB4MTAwMDApLAorICAgICBrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZX0sCisgICAgeyJceDgxXHg3Rlx4MDBceDAwXHgwMFx4MDBceDdGXHhGRlx4RkZceEZGIiwgMTAsIEdHX1VJTlQ2NF9DKDB4N0ZGRkZGRkYpLAorICAgICBrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZX0sCisgICAgeyJceDgxXHg3Rlx4MDBceDAwXHgwMFx4MDBceDgwXHgwMFx4MDBceDAwIiwgMTAsIEdHX1VJTlQ2NF9DKDB4ODAwMDAwMDApLAorICAgICBrV2ViU29ja2V0RXJyb3JNZXNzYWdlVG9vQmlnfSwKKyAgICB7Ilx4ODFceDdGXHg3Rlx4RkZceEZGXHhGRlx4RkZceEZGXHhGRlx4RkYiLCAxMCwKKyAgICAgR0dfVUlOVDY0X0MoMHg3RkZGRkZGRkZGRkZGRkZGKSwga1dlYlNvY2tldEVycm9yTWVzc2FnZVRvb0JpZ319OwogY29uc3QgaW50IGtOdW1GcmFtZUhlYWRlclRlc3RzID0gYXJyYXlzaXplKGtGcmFtZUhlYWRlclRlc3RzKTsKIAogVEVTVChXZWJTb2NrZXRGcmFtZVBhcnNlclRlc3QsIERlY29kZU5vcm1hbEZyYW1lKSB7CkBAIC01NSw3ICs1NCw3IEBACiAKICAgU2NvcGVkVmVjdG9yPFdlYlNvY2tldEZyYW1lQ2h1bms+IGZyYW1lczsKICAgRVhQRUNUX1RSVUUocGFyc2VyLkRlY29kZShrSGVsbG9GcmFtZSwga0hlbGxvRnJhbWVMZW5ndGgsICZmcmFtZXMpKTsKLSAgRVhQRUNUX0VRKFdFQl9TT0NLRVRfT0ssIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CisgIEVYUEVDVF9FUShrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZSwgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKICAgQVNTRVJUX0VRKDF1LCBmcmFtZXMuc2l6ZSgpKTsKICAgV2ViU29ja2V0RnJhbWVDaHVuayogZnJhbWUgPSBmcmFtZXNbMF07CiAgIEFTU0VSVF9UUlVFKGZyYW1lICE9IE5VTEwpOwpAQCAtODIsNyArODEsNyBAQAogICBTY29wZWRWZWN0b3I8V2ViU29ja2V0RnJhbWVDaHVuaz4gZnJhbWVzOwogICBFWFBFQ1RfVFJVRShwYXJzZXIuRGVjb2RlKGtNYXNrZWRIZWxsb0ZyYW1lLCBrTWFza2VkSGVsbG9GcmFtZUxlbmd0aCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZnJhbWVzKSk7Ci0gIEVYUEVDVF9FUShXRUJfU09DS0VUX09LLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOworICBFWFBFQ1RfRVEoa1dlYlNvY2tldE5vcm1hbENsb3N1cmUsIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CiAgIEFTU0VSVF9FUSgxdSwgZnJhbWVzLnNpemUoKSk7CiAgIFdlYlNvY2tldEZyYW1lQ2h1bmsqIGZyYW1lID0gZnJhbWVzWzBdOwogICBBU1NFUlRfVFJVRShmcmFtZSAhPSBOVUxMKTsKQEAgLTE0MCw3ICsxMzksNyBAQAogCiAgIFNjb3BlZFZlY3RvcjxXZWJTb2NrZXRGcmFtZUNodW5rPiBmcmFtZXM7CiAgIEVYUEVDVF9UUlVFKHBhcnNlci5EZWNvZGUoJmlucHV0LmZyb250KCksIGlucHV0LnNpemUoKSwgJmZyYW1lcykpOwotICBFWFBFQ1RfRVEoV0VCX1NPQ0tFVF9PSywgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKKyAgRVhQRUNUX0VRKGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOwogICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8c2l6ZV90PihrTnVtSW5wdXRzKSwgZnJhbWVzLnNpemUoKSk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTnVtSW5wdXRzOyArK2kpIHsKQEAgLTE4Niw3ICsxODUsNyBAQAogCiAgICAgU2NvcGVkVmVjdG9yPFdlYlNvY2tldEZyYW1lQ2h1bms+IGZyYW1lczE7CiAgICAgRVhQRUNUX1RSVUUocGFyc2VyLkRlY29kZSgmaW5wdXQxLmZyb250KCksIGlucHV0MS5zaXplKCksICZmcmFtZXMxKSk7Ci0gICAgRVhQRUNUX0VRKFdFQl9TT0NLRVRfT0ssIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CisgICAgRVhQRUNUX0VRKGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOwogICAgIEVYUEVDVF9FUSgxdSwgZnJhbWVzMS5zaXplKCkpOwogICAgIGlmIChmcmFtZXMxLnNpemUoKSAhPSAxdSkKICAgICAgIGNvbnRpbnVlOwpAQCAtMjE3LDcgKzIxNiw3IEBACiAKICAgICBTY29wZWRWZWN0b3I8V2ViU29ja2V0RnJhbWVDaHVuaz4gZnJhbWVzMjsKICAgICBFWFBFQ1RfVFJVRShwYXJzZXIuRGVjb2RlKCZpbnB1dDIuZnJvbnQoKSwgaW5wdXQyLnNpemUoKSwgJmZyYW1lczIpKTsKLSAgICBFWFBFQ1RfRVEoV0VCX1NPQ0tFVF9PSywgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoa1dlYlNvY2tldE5vcm1hbENsb3N1cmUsIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CiAgICAgRVhQRUNUX0VRKDF1LCBmcmFtZXMyLnNpemUoKSk7CiAgICAgaWYgKGZyYW1lczIuc2l6ZSgpICE9IDF1KQogICAgICAgY29udGludWU7CkBAIC0yNTYsNyArMjU1LDcgQEAKIAogICAgIFNjb3BlZFZlY3RvcjxXZWJTb2NrZXRGcmFtZUNodW5rPiBmcmFtZXMxOwogICAgIEVYUEVDVF9UUlVFKHBhcnNlci5EZWNvZGUoJmlucHV0MS5mcm9udCgpLCBpbnB1dDEuc2l6ZSgpLCAmZnJhbWVzMSkpOwotICAgIEVYUEVDVF9FUShXRUJfU09DS0VUX09LLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOworICAgIEVYUEVDVF9FUShrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZSwgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKICAgICBFWFBFQ1RfRVEoMXUsIGZyYW1lczEuc2l6ZSgpKTsKICAgICBpZiAoZnJhbWVzMS5zaXplKCkgIT0gMXUpCiAgICAgICBjb250aW51ZTsKQEAgLTI4Nyw3ICsyODYsNyBAQAogCiAgICAgU2NvcGVkVmVjdG9yPFdlYlNvY2tldEZyYW1lQ2h1bms+IGZyYW1lczI7CiAgICAgRVhQRUNUX1RSVUUocGFyc2VyLkRlY29kZSgmaW5wdXQyLmZyb250KCksIGlucHV0Mi5zaXplKCksICZmcmFtZXMyKSk7Ci0gICAgRVhQRUNUX0VRKFdFQl9TT0NLRVRfT0ssIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CisgICAgRVhQRUNUX0VRKGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOwogICAgIEVYUEVDVF9FUSgxdSwgZnJhbWVzMi5zaXplKCkpOwogICAgIGlmIChmcmFtZXMyLnNpemUoKSAhPSAxdSkKICAgICAgIGNvbnRpbnVlOwpAQCAtMzI0LDEwICszMjMsMTAgQEAKICAgICBXZWJTb2NrZXRGcmFtZVBhcnNlciBwYXJzZXI7CiAKICAgICBTY29wZWRWZWN0b3I8V2ViU29ja2V0RnJhbWVDaHVuaz4gZnJhbWVzOwotICAgIEVYUEVDVF9FUShrRnJhbWVIZWFkZXJUZXN0c1tpXS5lcnJvcl9jb2RlID09IFdFQl9TT0NLRVRfT0ssCi0gICAgICAgIHBhcnNlci5EZWNvZGUoJmlucHV0LmZyb250KCksIGlucHV0LnNpemUoKSwgJmZyYW1lcykpOworICAgIEVYUEVDVF9FUShrRnJhbWVIZWFkZXJUZXN0c1tpXS5lcnJvcl9jb2RlID09IGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlLAorICAgICAgICAgICAgICBwYXJzZXIuRGVjb2RlKCZpbnB1dC5mcm9udCgpLCBpbnB1dC5zaXplKCksICZmcmFtZXMpKTsKICAgICBFWFBFQ1RfRVEoa0ZyYW1lSGVhZGVyVGVzdHNbaV0uZXJyb3JfY29kZSwgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKLSAgICBpZiAoa0ZyYW1lSGVhZGVyVGVzdHNbaV0uZXJyb3JfY29kZSAhPSBXRUJfU09DS0VUX09LKSB7CisgICAgaWYgKGtGcmFtZUhlYWRlclRlc3RzW2ldLmVycm9yX2NvZGUgIT0ga1dlYlNvY2tldE5vcm1hbENsb3N1cmUpIHsKICAgICAgIEVYUEVDVF9FUSgwdSwgZnJhbWVzLnNpemUoKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIEVYUEVDVF9FUSgxdSwgZnJhbWVzLnNpemUoKSk7CkBAIC0zODEsMTUgKzM4MCwxNiBAQAogICAgIC8vIHdoZW4gaXQgcmVjZWl2ZXMgcGFydGlhbCBmcmFtZSBoZWFkZXIuCiAgICAgc2l6ZV90IGxhc3RfYnl0ZV9vZmZzZXQgPSBmcmFtZV9oZWFkZXJfbGVuZ3RoIC0gMTsKICAgICBmb3IgKHNpemVfdCBqID0gMDsgaiA8IGZyYW1lX2hlYWRlcl9sZW5ndGg7ICsraikgewotICAgICAgYm9vbCBmYWlsZWQgPSBrRnJhbWVIZWFkZXJUZXN0c1tpXS5lcnJvcl9jb2RlICE9IFdFQl9TT0NLRVRfT0sgJiYKKyAgICAgIGJvb2wgZmFpbGVkID0KKyAgICAgICAgICBrRnJhbWVIZWFkZXJUZXN0c1tpXS5lcnJvcl9jb2RlICE9IGtXZWJTb2NrZXROb3JtYWxDbG9zdXJlICYmCiAgICAgICAgICAgaiA9PSBsYXN0X2J5dGVfb2Zmc2V0OwogICAgICAgRVhQRUNUX0VRKCFmYWlsZWQsIHBhcnNlci5EZWNvZGUoZnJhbWVfaGVhZGVyICsgaiwgMSwgJmZyYW1lcykpOwogICAgICAgaWYgKGZhaWxlZCkgewogICAgICAgICBFWFBFQ1RfRVEoa0ZyYW1lSGVhZGVyVGVzdHNbaV0uZXJyb3JfY29kZSwgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEVYUEVDVF9FUShXRUJfU09DS0VUX09LLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOworICAgICAgICBFWFBFQ1RfRVEoa1dlYlNvY2tldE5vcm1hbENsb3N1cmUsIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CiAgICAgICB9Ci0gICAgICBpZiAoa0ZyYW1lSGVhZGVyVGVzdHNbaV0uZXJyb3JfY29kZSA9PSBXRUJfU09DS0VUX09LICYmCisgICAgICBpZiAoa0ZyYW1lSGVhZGVyVGVzdHNbaV0uZXJyb3JfY29kZSA9PSBrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZSAmJgogICAgICAgICAgIGogPT0gbGFzdF9ieXRlX29mZnNldCkgewogICAgICAgICBFWFBFQ1RfRVEoMXUsIGZyYW1lcy5zaXplKCkpOwogICAgICAgfSBlbHNlIHsKQEAgLTQ0NiwxNSArNDQ2LDE1IEBACiAgICAgV2ViU29ja2V0RnJhbWVQYXJzZXIgcGFyc2VyOwogCiAgICAgU2NvcGVkVmVjdG9yPFdlYlNvY2tldEZyYW1lQ2h1bms+IGZyYW1lczsKLSAgICBFWFBFQ1RfRVEoV0VCX1NPQ0tFVF9PSywgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoa1dlYlNvY2tldE5vcm1hbENsb3N1cmUsIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CiAgICAgRVhQRUNUX0ZBTFNFKHBhcnNlci5EZWNvZGUoZnJhbWVfaGVhZGVyLCBmcmFtZV9oZWFkZXJfbGVuZ3RoLCAmZnJhbWVzKSk7Ci0gICAgRVhQRUNUX0VRKFdFQl9TT0NLRVRfRVJSX1BST1RPQ09MX0VSUk9SLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOworICAgIEVYUEVDVF9FUShrV2ViU29ja2V0RXJyb3JQcm90b2NvbEVycm9yLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOwogICAgIEVYUEVDVF9FUSgwdSwgZnJhbWVzLnNpemUoKSk7CiAKICAgICAvLyBPbmNlIHRoZSBwYXJzZXIgaGFzIGZhaWxlZCwgaXQgbm8gbG9uZ2VyIGFjY2VwdHMgYW55IGlucHV0IChldmVuIGlmCiAgICAgLy8gdGhlIGlucHV0IGlzIGVtcHR5KS4KICAgICBFWFBFQ1RfRkFMU0UocGFyc2VyLkRlY29kZSgiIiwgMCwgJmZyYW1lcykpOwotICAgIEVYUEVDVF9FUShXRUJfU09DS0VUX0VSUl9QUk9UT0NPTF9FUlJPUiwgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoa1dlYlNvY2tldEVycm9yUHJvdG9jb2xFcnJvciwgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKICAgICBFWFBFQ1RfRVEoMHUsIGZyYW1lcy5zaXplKCkpOwogICB9CiB9CkBAIC00NzQsMTYgKzQ3NCwxNiBAQAogICAgIHsgIlx4OEFceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6OmtPcENvZGVQb25nIH0sCiAgICAgLy8gVGhlc2UgYXJlIHVuZGVmaW5lZCBvcGNvZGVzLCBidXQgdGhlIHBhcnNlciBuZWVkcyB0byBiZSBhYmxlIHRvIHBhcnNlCiAgICAgLy8gdGhlbSBhbnl3YXkuCi0gICAgeyAiXHg4M1x4MDAiLCAyLCAweDMgfSwKLSAgICB7ICJceDg0XHgwMCIsIDIsIDB4NCB9LAotICAgIHsgIlx4ODVceDAwIiwgMiwgMHg1IH0sCi0gICAgeyAiXHg4Nlx4MDAiLCAyLCAweDYgfSwKLSAgICB7ICJceDg3XHgwMCIsIDIsIDB4NyB9LAotICAgIHsgIlx4OEJceDAwIiwgMiwgMHhCIH0sCi0gICAgeyAiXHg4Q1x4MDAiLCAyLCAweEMgfSwKLSAgICB7ICJceDhEXHgwMCIsIDIsIDB4RCB9LAotICAgIHsgIlx4OEVceDAwIiwgMiwgMHhFIH0sCi0gICAgeyAiXHg4Rlx4MDAiLCAyLCAweEYgfQorICAgIHsgIlx4ODNceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSgweDMpIH0sCisgICAgeyAiXHg4NFx4MDAiLCAyLCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlKDB4NCkgfSwKKyAgICB7ICJceDg1XHgwMCIsIDIsIFdlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUoMHg1KSB9LAorICAgIHsgIlx4ODZceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSgweDYpIH0sCisgICAgeyAiXHg4N1x4MDAiLCAyLCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlKDB4NykgfSwKKyAgICB7ICJceDhCXHgwMCIsIDIsIFdlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUoMHhCKSB9LAorICAgIHsgIlx4OENceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSgweEMpIH0sCisgICAgeyAiXHg4RFx4MDAiLCAyLCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlKDB4RCkgfSwKKyAgICB7ICJceDhFXHgwMCIsIDIsIFdlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUoMHhFKSB9LAorICAgIHsgIlx4OEZceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSgweEYpIH0KICAgfTsKICAgc3RhdGljIGNvbnN0IGludCBrTnVtVGVzdHMgPSBBUlJBWVNJWkVfVU5TQUZFKGtUZXN0cyk7CiAKQEAgLTQ5Niw3ICs0OTYsNyBAQAogCiAgICAgU2NvcGVkVmVjdG9yPFdlYlNvY2tldEZyYW1lQ2h1bms+IGZyYW1lczsKICAgICBFWFBFQ1RfVFJVRShwYXJzZXIuRGVjb2RlKGZyYW1lX2hlYWRlciwgZnJhbWVfaGVhZGVyX2xlbmd0aCwgJmZyYW1lcykpOwotICAgIEVYUEVDVF9FUShXRUJfU09DS0VUX09LLCBwYXJzZXIud2Vic29ja2V0X2Vycm9yKCkpOworICAgIEVYUEVDVF9FUShrV2ViU29ja2V0Tm9ybWFsQ2xvc3VyZSwgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKICAgICBFWFBFQ1RfRVEoMXUsIGZyYW1lcy5zaXplKCkpOwogICAgIGlmIChmcmFtZXMuc2l6ZSgpICE9IDF1KQogICAgICAgY29udGludWU7CkBAIC01NTIsNyArNTUyLDcgQEAKIAogICAgIFNjb3BlZFZlY3RvcjxXZWJTb2NrZXRGcmFtZUNodW5rPiBmcmFtZXM7CiAgICAgRVhQRUNUX1RSVUUocGFyc2VyLkRlY29kZShmcmFtZV9oZWFkZXIsIGZyYW1lX2hlYWRlcl9sZW5ndGgsICZmcmFtZXMpKTsKLSAgICBFWFBFQ1RfRVEoV0VCX1NPQ0tFVF9PSywgcGFyc2VyLndlYnNvY2tldF9lcnJvcigpKTsKKyAgICBFWFBFQ1RfRVEoa1dlYlNvY2tldE5vcm1hbENsb3N1cmUsIHBhcnNlci53ZWJzb2NrZXRfZXJyb3IoKSk7CiAgICAgRVhQRUNUX0VRKDF1LCBmcmFtZXMuc2l6ZSgpKTsKICAgICBpZiAoZnJhbWVzLnNpemUoKSAhPSAxdSkKICAgICAgIGNvbnRpbnVlOwpkaWZmIC0tZ2l0IGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV91bml0dGVzdC5jYyBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfZnJhbWVfdW5pdHRlc3QuY2MKaW5kZXggZTA5NzJhNy4uNTJmNGFkYSAxMDA2NDQKLS0tIGEvc3JjL25ldC93ZWJzb2NrZXRzL3dlYnNvY2tldF9mcmFtZV91bml0dGVzdC5jYworKysgYi9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2ZyYW1lX3VuaXR0ZXN0LmNjCkBAIC0xMjcsMTYgKzEyNywxNiBAQAogICAgIHsgIlx4ODlceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6OmtPcENvZGVQaW5nIH0sCiAgICAgeyAiXHg4QVx4MDAiLCAyLCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6a09wQ29kZVBvbmcgfSwKICAgICAvLyBUaGVzZSBhcmUgdW5kZWZpbmVkIG9wY29kZXMsIGJ1dCB0aGUgYnVpbGRlciBzaG91bGQgYWNjZXB0IHRoZW0gYW55d2F5LgotICAgIHsgIlx4ODNceDAwIiwgMiwgMHgzIH0sCi0gICAgeyAiXHg4NFx4MDAiLCAyLCAweDQgfSwKLSAgICB7ICJceDg1XHgwMCIsIDIsIDB4NSB9LAotICAgIHsgIlx4ODZceDAwIiwgMiwgMHg2IH0sCi0gICAgeyAiXHg4N1x4MDAiLCAyLCAweDcgfSwKLSAgICB7ICJceDhCXHgwMCIsIDIsIDB4QiB9LAotICAgIHsgIlx4OENceDAwIiwgMiwgMHhDIH0sCi0gICAgeyAiXHg4RFx4MDAiLCAyLCAweEQgfSwKLSAgICB7ICJceDhFXHgwMCIsIDIsIDB4RSB9LAotICAgIHsgIlx4OEZceDAwIiwgMiwgMHhGIH0KKyAgICB7ICJceDgzXHgwMCIsIDIsIFdlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUoMHgzKSB9LAorICAgIHsgIlx4ODRceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSgweDQpIH0sCisgICAgeyAiXHg4NVx4MDAiLCAyLCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlKDB4NSkgfSwKKyAgICB7ICJceDg2XHgwMCIsIDIsIFdlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUoMHg2KSB9LAorICAgIHsgIlx4ODdceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSgweDcpIH0sCisgICAgeyAiXHg4Qlx4MDAiLCAyLCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlKDB4QikgfSwKKyAgICB7ICJceDhDXHgwMCIsIDIsIFdlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUoMHhDKSB9LAorICAgIHsgIlx4OERceDAwIiwgMiwgV2ViU29ja2V0RnJhbWVIZWFkZXI6Ok9wQ29kZSgweEQpIH0sCisgICAgeyAiXHg4RVx4MDAiLCAyLCBXZWJTb2NrZXRGcmFtZUhlYWRlcjo6T3BDb2RlKDB4RSkgfSwKKyAgICB7ICJceDhGXHgwMCIsIDIsIFdlYlNvY2tldEZyYW1lSGVhZGVyOjpPcENvZGUoMHhGKSB9CiAgIH07CiAgIHN0YXRpYyBjb25zdCBpbnQga051bVRlc3RzID0gQVJSQVlTSVpFX1VOU0FGRShrVGVzdHMpOwogCmRpZmYgLS1naXQgYS9zcmMvbmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2pvYi5jYyBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfam9iLmNjCmluZGV4IGUwNGNlY2QuLjcxZTQ5YjUgMTAwNjQ0Ci0tLSBhL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfam9iLmNjCisrKyBiL3NyYy9uZXQvd2Vic29ja2V0cy93ZWJzb2NrZXRfam9iLmNjCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X2hhbmRzaGFrZV9oYW5kbGVyLmgiCiAjaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X25ldF9sb2dfcGFyYW1zLmgiCiAjaW5jbHVkZSAibmV0L3dlYnNvY2tldHMvd2Vic29ja2V0X3Rocm90dGxlLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogCiBzdGF0aWMgY29uc3QgaW50IGtNYXhQZW5kaW5nU2VuZEFsbG93ZWQgPSAzMjc2ODsgIC8vIDMyIGtpbG9ieXRlcy4KIApAQCAtOTksNyArMTAwLDcgQEAKICAgICBjYXNlIE9QRU46CiAgICAgICB7CiAgICAgICAgIHNjb3BlZF9yZWZwdHI8SU9CdWZmZXJXaXRoU2l6ZT4gYnVmZmVyID0gbmV3IElPQnVmZmVyV2l0aFNpemUobGVuKTsKLSAgICAgICAgbWVtY3B5KGJ1ZmZlci0+ZGF0YSgpLCBkYXRhLCBsZW4pOworICAgICAgICBTYk1lbW9yeUNvcHkoYnVmZmVyLT5kYXRhKCksIGRhdGEsIGxlbik7CiAgICAgICAgIGlmIChjdXJyZW50X3NlbmRfYnVmZmVyXyB8fCAhc2VuZF9idWZmZXJfcXVldWVfLmVtcHR5KCkpIHsKICAgICAgICAgICBzZW5kX2J1ZmZlcl9xdWV1ZV8ucHVzaF9iYWNrKGJ1ZmZlcik7CiAgICAgICAgICAgcmV0dXJuIHRydWU7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL0NIQU5HRUxPRy5tZCBiL3NyYy9zdGFyYm9hcmQvQ0hBTkdFTE9HLm1kCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzNmFkMWYKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL0NIQU5HRUxPRy5tZApAQCAtMCwwICsxLDIzIEBACisjIFN0YXJib2FyZCBWZXJzaW9uIENoYW5nZWxvZworCitUaGlzIGRvY3VtZW50IHJlY29yZHMgYWxsIGNoYW5nZXMgbWFkZSB0byB0aGUgU3RhcmJvYXJkIGludGVyZmFjZSwgdXAgdG8gdGhlCitjdXJyZW50IHZlcnNpb24sIGJ1dCBub3QgaW5jbHVkaW5nIHRoZSBleHBlcmltZW50YWwgdmVyc2lvbi4gIFRoaXMgZmlsZSB3aWxsCitiZSB1cGRhdGVkIGVhY2ggdGltZSBhIG5ldyBTdGFyYm9hcmQgdmVyc2lvbiBpcyByZWxlYXNlZC4gIEVhY2ggc2VjdGlvbiBpbgordGhpcyBmaWxlIGRlc2NyaWJlcyB0aGUgY2hhbmdlcyBtYWRlIHRvIHRoZSBTdGFyYm9hcmQgaW50ZXJmYWNlIHNpbmNlIHRoZQordmVyc2lvbiBwcmV2aW91cyB0byBpdC4KKworIyMgVmVyc2lvbiA0CisoVGhpcyBpcyBhIHRlbXBvcmFyeSB0ZW1wbGF0ZSwgYXMgdGhpcyB2ZXJzaW9uIGlzIG5vdCBhY3R1YWxseSByZWxlYXNlZCB5ZXQuKQorCisqKkludHJvZHVjZSBmZWF0dXJlIFgqKgorCitJbiBzdGFyYm9hcmQvZm9vLmgsCisKKyAgKiBJbnRyb2R1Y2UgU2JGb29CYXIoKS4KKyAgKiBSZW1vdmUgU2JGb29Eb20oKS4KKworKipJbnRyb2R1Y2UgZmVhdHVyZSBZKioKKworSW4gc3RhcmJvYXJkL2hlbGxvLmgsCisKKyAgKiBJbnRyb2R1Y2UgU2JIZWxsb1dvcmxkKCkuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2FjY2Vzc2liaWxpdHkuaCBiL3NyYy9zdGFyYm9hcmQvYWNjZXNzaWJpbGl0eS5oCmluZGV4IGZiZTRjOTcuLmIyNzRkYTAgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvYWNjZXNzaWJpbGl0eS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvYWNjZXNzaWJpbGl0eS5oCkBAIC00OCw2ICs0OCwyMyBAQAogU0JfRVhQT1JUIGJvb2wgU2JBY2Nlc3NpYmlsaXR5R2V0VGV4dFRvU3BlZWNoU2V0dGluZ3MoCiAgICAgU2JBY2Nlc3NpYmlsaXR5VGV4dFRvU3BlZWNoU2V0dGluZ3MqIG91dF9zZXR0aW5ncyk7CiAKK3R5cGVkZWYgc3RydWN0IFNiQWNjZXNzaWJpbGl0eURpc3BsYXlTZXR0aW5ncyB7CisgIC8vIFdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgYSBzeXN0ZW0gc2V0dGluZyBmb3IgaGlnaCBjb250cmFzdCB0ZXh0IG9yIG5vdC4KKyAgYm9vbCBoYXNfaGlnaF9jb250cmFzdF90ZXh0X3NldHRpbmc7CisKKyAgLy8gV2hldGhlciB0aGUgaGlnaCBjb250cmFzdCB0ZXh0IHNldHRpbmcgaXMgZW5hYmxlZCBvciBub3QuCisgIGJvb2wgaXNfaGlnaF9jb250cmFzdF90ZXh0X2VuYWJsZWQ7Cit9IFNiQWNjZXNzaWJpbGl0eURpc3BsYXlTZXR0aW5nczsKKworLy8gR2V0IHRoZSBwbGF0Zm9ybSBzZXR0aW5ncyByZWxhdGVkIHRvIGhpZ2ggY29udHJhc3QgdGV4dC4KKy8vIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBpZiB8b3V0X3NldHRpbmdzfCBpcyBOVUxMIG9yIGlmIGl0IGlzCisvLyBub3QgemVyby1pbml0aWFsaXplZC4KKy8vCisvLyB8b3V0X3NldHRpbmdzfDogQSBwb2ludGVyIHRvIGEgemVyby1pbml0aWFsaXplZAorLy8gICAgU2JBY2Nlc3NpYmlsaXR5RGlzcGxheVNldHRpbmdzKiBzdHJ1Y3QuCitTQl9FWFBPUlQgYm9vbCBTYkFjY2Vzc2liaWxpdHlHZXREaXNwbGF5U2V0dGluZ3MoCisgICAgU2JBY2Nlc3NpYmlsaXR5RGlzcGxheVNldHRpbmdzKiBvdXRfc2V0dGluZ3MpOworCiAjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgogCiAjaWZkZWYgX19jcGx1c3BsdXMKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgKaW5kZXggMjk4YTcwZi4uZjVmMzQzNCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgKKysrIGIvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgKQEAgLTE3Miw2ICsxNzIsNyBAQAogI2RlZmluZSBzdHJuY21wKHMxLCBzMiwgYykgU2JTdHJpbmdDb21wYXJlKHMxLCBzMiwgYykKICNkZWZpbmUgc3RyY21wKHMxLCBzMikgU2JTdHJpbmdDb21wYXJlQWxsKHMxLCBzMikKIAorI2RlZmluZSBtZW1jaHIocywgYywgbikgU2JNZW1vcnlGaW5kQnl0ZShzLCBjLCBuKQogI2RlZmluZSBtZW1zZXQocywgYywgbikgU2JNZW1vcnlTZXQocywgYywgbikKICNkZWZpbmUgbWVtY3B5KGQsIHMsIGMpIFNiTWVtb3J5Q29weShkLCBzLCBjKQogI2RlZmluZSBtZW1jbXAoczEsIHMyLCBuKSBTYk1lbW9yeUNvbXBhcmUoczEsIHMyLCBuKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jbGllbnRfcG9ydGluZy93cmFwX21haW4vd3JhcF9tYWluLmggYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3dyYXBfbWFpbi93cmFwX21haW4uaAppbmRleCA0NzM0NzcyLi43YjUxYTZlIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3dyYXBfbWFpbi93cmFwX21haW4uaAorKysgYi9zcmMvc3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3dyYXBfbWFpbi93cmFwX21haW4uaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIC8vIFRoaXMgaGVhZGVyIGRlZmluZXMgdHdvIG1hY3JvcywgQ09CQUxUX1dSQVBfU0lNUExFX01BSU4oKSBhbmQKIC8vIENPQkFMVF9XUkFQX0JBU0VfTUFJTigpLiBTaW1wbGUgbWFpbiBpcyBmb3IgcHJvZ3JhbXMgdGhhdCBhcmUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvY29tbW9uL21lbW9yeS5jYyBiL3NyYy9zdGFyYm9hcmQvY29tbW9uL21lbW9yeS5jYwppbmRleCA0ZWQzMzYyLi4xZGRmMjk1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2NvbW1vbi9tZW1vcnkuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9jb21tb24vbWVtb3J5LmNjCkBAIC02OSw2ICs2OSwxMSBAQAogICByZXR1cm4gbWVtb3J5OwogfQogCit2b2lkKiBTYk1lbW9yeUFsbG9jYXRlTm9SZXBvcnQoc2l6ZV90IHNpemUpIHsKKyAgdm9pZCogbWVtb3J5ID0gU2JNZW1vcnlBbGxvY2F0ZUltcGwoc2l6ZSk7CisgIHJldHVybiBtZW1vcnk7Cit9CisKIHZvaWQqIFNiTWVtb3J5QWxsb2NhdGVBbGlnbmVkKHNpemVfdCBhbGlnbm1lbnQsIHNpemVfdCBzaXplKSB7CiAgIHZvaWQqIG1lbW9yeSA9IFNiTWVtb3J5QWxsb2NhdGVBbGlnbmVkSW1wbChhbGlnbm1lbnQsIHNpemUpOwogICBTYlJlcG9ydEFsbG9jYXRpb24obWVtb3J5LCBzaXplKTsKQEAgLTg5LDYgKzk0LDEwIEBACiAgIFNiTWVtb3J5RnJlZShtZW1vcnkpOwogfQogCit2b2lkIFNiTWVtb3J5RGVhbGxvY2F0ZU5vUmVwb3J0KHZvaWQqIG1lbW9yeSkgeworICBTYk1lbW9yeUZyZWUobWVtb3J5KTsKK30KKwogdm9pZCBTYk1lbW9yeURlYWxsb2NhdGVBbGlnbmVkKHZvaWQqIG1lbW9yeSkgewogICAvLyBSZXBvcnQgbXVzdCBoYXBwZW4gZmlyc3Qgb3IgZWxzZSBhIHJhY2UgY29uZGl0aW9uIGFsbG93cyB0aGUgbWVtb3J5IHRvCiAgIC8vIGJlIGZyZWVkIGFuZCB0aGVuIHJlcG9ydGVkIGFzIGFsbG9jYXRlZCwgYmVmb3JlIHRoZSBhbGxvY2F0aW9uIGlzIHJlbW92ZWQuCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCBiL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCmluZGV4IDM0ZDJjNzIuLjg0Yjg5NTMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCisrKyBiL3NyYy9zdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oCkBAIC00Niw2ICs0Niw0OSBAQAogLy8gaW1wbGVtZW50IHRoZSBleHBlcmltZW50YWwgU3RhcmJvYXJkIEFQSSB2ZXJzaW9uLgogI2RlZmluZSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04gNAogCisvLyAtLS0gRXhwZXJpbWVudGFsIEZlYXR1cmUgRGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gTm90ZSB0aGF0IGV4cGVyaW1lbnRhbCBmZWF0dXJlIGNvbW1lbnRzIHdpbGwgYmUgbW92ZWQgaW50bworLy8gc3RhcmJvYXJkL0NIQU5HRUxPRy5tZCB3aGVuIHJlbGVhc2VkLiAgVGh1cywgeW91IGNhbiBmaW5kIGV4YW1wbGVzIG9mIHRoZQorLy8gZm9ybWF0IHlvdXIgZmVhdHVyZSBjb21tZW50cyBzaG91bGQgdGFrZSBieSBjaGVja2luZyB0aGF0IGZpbGUuCisKKy8vIEZlYXR1cmUgaW50cm9kdWNpbmcgc3VwcG9ydCBmb3IgZGVjb2RlLXRvLXRleHR1cmUgcGxheWVyIG91dHB1dCBtb2RlLCBhbmQKKy8vIHJ1bnRpbWUgcGxheWVyIG91dHB1dCBtb2RlIHNlbGVjdGlvbiBhbmQgZGV0ZWN0aW9uLgorLy8gSW4gc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCwKKy8vICAgKiBTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQsIFNCX0lTX1BMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSwgYW5kCisvLyAgICAgU0JfSVNfUExBWUVSX0NPTVBPU0lURUQgbm93IG5vIGxvbmdlciBuZWVkIHRvIGJlIGRlZmluZWQgKGFuZCBzaG91bGQgbm90CisvLyAgICAgYmUgZGVmaW5lZCkgYnkgcGxhdGZvcm1zLiAgSW5zdGVhZCwgdGhlc2UgY2FwYWJpbGl0aWVzIGFyZSBkZXRlY3RlZCBhdAorLy8gICAgIHJ1bnRpbWUgdmlhIFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZCgpLgorLy8gSW4gc3RhcmJvYXJkL3BsYXllci5oLAorLy8gICAqIFRoZSBlbnVtIFNiUGxheWVyT3V0cHV0TW9kZSBpcyBpbnRyb2R1Y2VkLgorLy8gICAqIFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZCgpIGlzIGludHJvZHVjZWQgdG8gbGV0IGFwcGxpY2F0aW9ucyBxdWVyeQorLy8gICAgIGZvciBwbGF5ZXIgb3V0cHV0IG1vZGUgc3VwcG9ydC4KKy8vICAgKiBTYlBsYXllckNyZWF0ZSgpIG5vdyB0YWtlcyBhbiBhZGRpdGlvbmFsIHBhcmFtZXRlciB0aGF0IHNwZWNpZmllcyB0aGUKKy8vICAgICBkZXNpcmVkIG91dHB1dCBtb2RlLgorLy8gICAqIFRoZSBwdW5jaCBvdXQgc3BlY2lmaWMgZnVuY3Rpb24gU2JQbGF5ZXJTZXRCb3VuZHMoKSBtdXN0IG5vdyBiZQorLy8gICAgIGRlZmluZWQgb24gYWxsIHBsYXRmb3JtcywgZXZlbiBpZiB0aGV5IGRvbid0IHN1cHBvcnQgcHVuY2ggb3V0IChpbiB3aGljaAorLy8gICAgIGNhc2UgdGhleSBjYW4gaW1wbGVtZW50IGEgc3R1YikuCisvLyAgICogVGhlIGZ1bmN0aW9uIFNiUGxheWVyR2V0Q29tcG9zaXRpb25IYW5kbGUoKSBpcyByZW1vdmVkLgorLy8gICAqIFRoZSBmdW5jdGlvbiBTYlBsYXllckdldFRleHR1cmVJZCgpIGlzIHJlcGxhY2VkIGJ5IHRoZSBuZXcKKy8vICAgICBTYlBsYXllckdldEN1cnJlbnRGcmFtZSgpLCB3aGljaCByZXR1cm5zIGEgU2JEZWNvZGVUYXJnZXQuCisvLyBJbiBzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oLAorLy8gICAqIEFsbCBnZXQgbWV0aG9kcyAoU2JEZWNvZGVUYXJnZXRHZXRQbGFuZSgpIGFuZCBTYkRlY29kZVRhcmdldEdldEZvcm1hdCgpLAorLy8gICAgIFNiRGVjb2RlVGFyZ2V0SXNPcGFxdWUoKSkgYXJlIG5vdyByZXBsYWNlZCB3aXRoIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbygpLgorLy8gICAqIFRoZSBTYkRlY29kZVRhcmdldEluZm8gc3RydWN0dXJlIGlzIGludHJvZHVjZWQgYW5kIGlzIHRoZSByZXR1cm4gdmFsdWUKKy8vICAgICB0eXBlIG9mIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbygpLgorLy8gICAqIFNiRGVjZG9kZVRhcmdldENyZWF0ZSgpIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgYWxsIGl0cyBpbnRlcm5hbAorLy8gICAgIHBsYW5lcywgYW5kIHNvIGl0cyB8cGxhbmVzfCBwYXJhbWV0ZXIgaXMgcmVwbGFjZWQgYnkgfHdpZHRofCBhbmQKKy8vICAgICB8aGVpZ2h0fCBwYXJhbWV0ZXJzLgorLy8gICAqIFRoZSBHTEVTMiB2ZXJzaW9uIG9mIFNiRGVjZG9kZVRhcmdldENyZWF0ZSgpIGhhcyBpdHMgRUdMIHR5cGVzCisvLyAgICAgKEVHTERpc3BsYXksIEVHTENvbnRleHQpIHJlcGxhY2VkIGJ5IHZvaWQqIHR5cGVzLCBzbyB0aGF0IGRlY29kZV90YXJnZXQuaAorLy8gICAgIGNhbiBhdm9pZCAjaW5jbHVkaW5nIEVHTC9HTEVTMiBoZWFkZXJzLgorLy8gICAqIFNiRGVjb2RlVGFyZ2V0RGVzdHJveSgpIGlzIHJlbmFtZWQgdG8gU2JEZWNvZGVUYXJnZXRSZWxlYXNlKCkuCisjZGVmaW5lIFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKworLy8gU3VwcG9ydCBmb3Igc2V0dGluZyB0aGUgcGxheWJhY2sgcmF0ZSBvbiBhbiBTYlBsYXllci4gIFRoaXMgYWxsb3dzIGZvcgorLy8gY29udHJvbCBvZiB0aGUgcGxheWJhY2sgc3BlZWQgb2YgdmlkZW8gYXQgcnVudGltZS4KKyNkZWZpbmUgU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKIC8vIC0tLSBDb21tb24gRGV0ZWN0ZWQgRmVhdHVyZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAjaWYgZGVmaW5lZChfX0dOVUNfXykKQEAgLTM5OCw2ICs0NDEsNyBAQAogI2Vycm9yICJZb3VyIHBsYXRmb3JtIG11c3QgZGVmaW5lIFNCX0hBU19USU1FX1RIUkVBRF9OT1cgaW4gQVBJIDMgb3IgbGF0ZXIuIgogI2VuZGlmCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogI2lmIFNCX0hBUyhQTEFZRVIpCiAjaWYgIVNCX0lTKFBMQVlFUl9DT01QT1NJVEVEKSAmJiAhU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSAmJiBcCiAgICAgIVNCX0lTKFBMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSkKQEAgLTQxNiw2ICs0NjAsMTIgQEAKICNlcnJvciAiWW91ciBwbGF5ZXIgY2FuJ3QgaGF2ZSBhIGNvbXBvc2l0aW9uIG1ldGhvZCBpZiBpdCBkb2Vzbid0IGV4aXN0LiIKICNlbmRpZgogI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKQorI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorI2lmIGRlZmluZWQoU0JfSVNfUExBWUVSX0NPTVBPU0lUSVRFRCkgfHwgZGVmaW5lZChTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQpIHx8IFwKKyAgICBkZWZpbmVkKFNCX0lTX1BMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSkKKyNlcnJvciAiTmV3IHZlcnNpb25zIG9mIFN0YXJib2FyZCBzcGVjaWZ5IHBsYXllciBvdXRwdXQgbW9kZSBhdCBydW50aW1lLiIKKyNlbmRpZgorI2VuZGlmICAvLyAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogCiAjaWYgKFNCX0hBUyhNQU5ZX0NPUkVTKSAmJiAoU0JfSEFTKDFfQ09SRSkgfHwgU0JfSEFTKDJfQ09SRVMpIHx8ICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTQl9IQVMoNF9DT1JFUykgfHwgU0JfSEFTKDZfQ09SRVMpKSkgfHwgXApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9jcmVhdG9yL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9jcmVhdG9yL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDRlNTcyZWEuLjIzYTVhZmUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvY3JlYXRvci9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2NyZWF0b3Ivc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTMyOCw2ICszMjgsNyBAQAogLy8gc3VwcG9ydGVkIGNvbXBvc2l0aW9uIG1ldGhvZHMgYmVsb3cuCiAjZGVmaW5lIFNCX0hBU19QTEFZRVIgMQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgd2lsbCBwcm9kdWNlIGFuIE9wZW5HTCB0ZXh0dXJlIHRoYXQKIC8vIHRoZSBjbGllbnQgbXVzdCBkcmF3IGV2ZXJ5IGZyYW1lIHdpdGggaXRzIGdyYXBoaWNzIHJlbmRlcmluZy4gSXQgbWF5IGJlIHRoYXQKIC8vIHdlIGdldCBhIHRleHR1cmUgaGFuZGxlLCBidXQgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9ucyBsaWtlIEdsUmVhZFBpeGVscyBvbgpAQCAtMzQ2LDYgKzM0Nyw3IEBACiAvLyB0aGlzIGNhc2UsIGNoYW5naW5nIHRoZSB2aWRlbyBib3VuZHMgbXVzdCBiZSB0aWdodGx5IHN5bmNocm9uaXplZCBiZXR3ZWVuIHRoZQogLy8gcGxheWVyIGFuZCB0aGUgZ3JhcGhpY3MgcGxhbmUuCiAjZGVmaW5lIFNCX0lTX1BMQVlFUl9QVU5DSEVEX09VVCAxCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiAKIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgYXVkaW8gYnVmZmVycyBvZiBtZWRpYSBzb3VyY2UKIC8vIGJlZm9yZSB0cmlnZ2VyaW5nIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgQSBsYXJnZSB2YWx1ZSB3aWxsIGNhdXNlIG1vcmUgbWVtb3J5CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCBiL3NyYy9zdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oCmluZGV4IDAzNjlmNmQuLjQ4MTk4ZjUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oCkBAIC0xNiw4ICsxNiw4IEBACiAvLwogLy8gQSB0YXJnZXQgZm9yIGRlY29kaW5nIGltYWdlIGFuZCB2aWRlbyBkYXRhIGludG8uIFRoaXMgY29ycmVzcG9uZHMgcm91Z2hseSB0bwogLy8gYW4gRUdMSW1hZ2UsIGJ1dCB0aGF0IGV4dGVuc2lvbiBtYXkgbm90IGJlIGZ1bGx5IHN1cHBvcnRlZCBvbiBhbGwgR0wKLS8vIHBsYXRmb3Jtcy4gU2JEZWNvZGVUYXJnZXQgc3VwcG9ydHMgbXVsdGktcGxhbmUgdGFyZ2V0cy4gV2UgbmVlZCBhIG1lY2hhbmlzbQotLy8gZm9yIFNiQmxpdHRlciBhcyB3ZWxsLCBhbmQgdGhpcyBpcyBhYmxlIHRvIG1vcmUtb3ItbGVzcyB1bmlmeSB0aGUgdHdvLgorLy8gcGxhdGZvcm1zLiBTYkRlY29kZVRhcmdldCBzdXBwb3J0cyBtdWx0aS1wbGFuZSB0YXJnZXRzLiBUaGUgU2JCbGl0dGVyIEFQSSBpcworLy8gc3VwcG9ydGVkIGFzIHdlbGwsIGFuZCB0aGlzIGlzIGFibGUgdG8gbW9yZS1vci1sZXNzIHVuaWZ5IHRoZSB0d28uCiAvLwogLy8gQW4gU2JEZWNvZGVUYXJnZXQgY2FuIGJlIHBhc3NlZCBpbnRvIGFueSBmdW5jdGlvbiB3aGljaCBkZWNvZGVzIHZpZGVvIG9yCiAvLyBpbWFnZSBkYXRhLiBUaGlzIGFsbG93cyB0aGUgYXBwbGljYXRpb24gdG8gYWxsb2NhdGUgZmFzdCBncmFwaGljcyBtZW1vcnksIGFuZApAQCAtMzksNyArMzksNyBAQAogLy8gU29tZSBjb21wb25lbnRzIG1heSBuZWVkIHRvIGFjcXVpcmUgU2JEZWNvZGVUYXJnZXRzIGNvbXBhdGlibGUgd2l0aCBhIGNlcnRhaW4KIC8vIHJlbmRlcmluZyBjb250ZXh0LCB3aGljaCBtYXkgbmVlZCB0byBiZSBjcmVhdGVkIG9uIGEgcGFydGljdWxhciB0aHJlYWQuIFRoZQogLy8gU2JEZWNvZGVUYXJnZXRQcm92aWRlciBpcyBhIHdheSBmb3IgdGhlIHByaW1hcnkgcmVuZGVyaW5nIGNvbnRleHQgdG8gcHJvdmlkZQotLy8gYW4gaW50ZXJmYWNlIHRoYXQgY2FuIGNyZWF0ZSBTYkRlY29kZVRhcmdldHMgb24gZGVtYW5kIGJ5IG90aGVyIHN5c3RlbS4KKy8vIGFuIGludGVyZmFjZSB0aGF0IGNhbiBjcmVhdGUgU2JEZWNvZGVUYXJnZXRzIG9uIGEgZGVzaWduYXRlZCB0aHJlYWQuCiAvLwogLy8gVGhlIHByaW1hcnkgdXNhZ2UgaXMgbGlrZWx5IHRvIGJlIHRoZSB0aGUgU2JQbGF5ZXIgaW1wbGVtZW50YXRpb24gb24gc29tZQogLy8gcGxhdGZvcm1zLgpAQCAtNzgsOSArNzgsMTEgQEAKIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZWRfZm9vX2RhdGFfc2l6ZSwgZm9ybWF0KTsKIC8vCiAvLyAgICAgLy8gSWYgdGhlIGRlY29kZSB3b3JrcywgeW91IGNhbiBnZXQgdGhlIHRleHR1cmUgb3V0IGFuZCByZW5kZXIgaXQuCisvLyAgICAgU2JEZWNvZGVUYXJnZXRJbmZvIGluZm87CisvLyAgICAgU2JNZW1vcnlTZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisvLyAgICAgU2JEZWNvZGVUYXJnZXRHZXRJbmZvKHRhcmdldCwgJmluZm8pOwogLy8gICAgIEdMdWludCB0ZXh0dXJlID0KLS8vICAgICAgICAgU2JEZWNvZGVUYXJnZXRHZXRQbGFuZSh0YXJnZXQsIGtTYkRlY29kZVRhcmdldFBsYW5lUkdCQSk7Ci0vLworLy8gICAgICAgICBpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkFdLnRleHR1cmU7CiAKICNpZm5kZWYgU1RBUkJPQVJEX0RFQ09ERV9UQVJHRVRfSF8KICNkZWZpbmUgU1RBUkJPQVJEX0RFQ09ERV9UQVJHRVRfSF8KQEAgLTg5LDE1ICs5MSwxNSBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9leHBvcnQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKIAotI2lmIFNCX1ZFUlNJT04oMykKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSAzCiAKICNpZiBTQl9IQVMoQkxJVFRFUikKICNpbmNsdWRlICJzdGFyYm9hcmQvYmxpdHRlci5oIgogI2VsaWYgU0JfSEFTKEdMRVMyKSAgLy8gU0JfSEFTKEJMSVRURVIpCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogI2luY2x1ZGUgPEVHTC9lZ2wuaD4KICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICNlbmRpZiAgLy8gU0JfSEFTKEJMSVRURVIpCiAKICNpZmRlZiBfX2NwbHVzcGx1cwpAQCAtMTg1LDYgKzE4Nyw3NyBAQAogICB2b2lkKiBjb250ZXh0OwogfSBTYkRlY29kZVRhcmdldFByb3ZpZGVyOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKKy8vIERlZmluZXMgYSByZWN0YW5ndWxhciBjb250ZW50IHJlZ2lvbiB3aXRoaW4gYSBTYkRlY29kZVRhcmdldEluZm9QbGFuZQorLy8gc3RydWN0dXJlLgordHlwZWRlZiBzdHJ1Y3QgU2JEZWNvZGVUYXJnZXRJbmZvQ29udGVudFJlZ2lvbiB7CisgIGludCBsZWZ0OworICBpbnQgdG9wOworICBpbnQgcmlnaHQ7CisgIGludCBib3R0b207Cit9IFNiRGVjb2RlVGFyZ2V0SW5mb0NvbnRlbnRSZWdpb247CisKKy8vIERlZmluZXMgYW4gaW1hZ2UgcGxhbmUgd2l0aGluIGEgU2JEZWNvZGVUYXJnZXRJbmZvIG9iamVjdC4KK3R5cGVkZWYgc3RydWN0IFNiRGVjb2RlVGFyZ2V0SW5mb1BsYW5lIHsKKyNpZiBTQl9IQVMoQkxJVFRFUikKKyAgLy8gQSBoYW5kbGUgdG8gdGhlIEJsaXR0ZXIgc3VyZmFjZSB0aGF0IGNhbiBiZSB1c2VkIGZvciByZW5kZXJpbmcuCisgIFNiQmxpdHRlclN1cmZhY2Ugc3VyZmFjZTsKKyNlbGlmIFNCX0hBUyhHTEVTMikgIC8vIFNCX0hBUyhCTElUVEVSKQorICAvLyBBIGhhbmRsZSB0byB0aGUgR0wgdGV4dHVyZSB0aGF0IGNhbiBiZSB1c2VkIGZvciByZW5kZXJpbmcuCisgIHVpbnQzMl90IHRleHR1cmU7CisKKyAgLy8gVGhlIEdMIHRleHR1cmUgdGFyZ2V0IHRoYXQgc2hvdWxkIGJlIHVzZWQgaW4gY2FsbHMgdG8gZ2xCaW5kVGV4dHVyZS4KKyAgLy8gVHlwaWNhbGx5IHRoaXMgd291bGQgYmUgR0xfVEVYVFVSRV8yRCwgYnV0IHNvbWUgcGxhdGZvcm1zIG1heSByZXF1aXJlCisgIC8vIHRoYXQgaXQgYmUgc2V0IHRvIHNvbWV0aGluZyBlbHNlIGxpa2UgR0xfVEVYVFVSRV9FWFRFUk5BTF9PRVMuCisgIHVpbnQzMl90IGdsX3RleHR1cmVfdGFyZ2V0OworI2VuZGlmICAgICAgICAgICAgICAgLy8gU0JfSEFTKEJMSVRURVIpCisKKyAgLy8gVGhlIHdpZHRoIG9mIHRoZSB0ZXh0dXJlL3N1cmZhY2UgZm9yIHRoaXMgcGFydGljdWxhciBwbGFuZS4KKyAgaW50IHdpZHRoOworICAvLyBUaGUgaGVpZ2h0IG9mIHRoZSB0ZXh0dXJlL3N1cmZhY2UgZm9yIHRoaXMgcGFydGljdWxhciBwbGFuZS4KKyAgaW50IGhlaWdodDsKKworICAvLyBUaGUgZm9sbG93aW5nIHByb3BlcnRpZXMgc3BlY2lmeSBhIHJlY3RhbmdsZSBpbmRpY2F0aW5nIGEgcmVnaW9uIHdpdGhpbgorICAvLyB0aGUgdGV4dHVyZS9zdXJmYWNlIHRoYXQgY29udGFpbnMgdmFsaWQgaW1hZ2UgZGF0YS4gIFRoZSB0b3AtbGVmdCBjb3JuZXIKKyAgLy8gaXMgKDAsIDApIGFuZCBpbmNyZWFzZXMgdG8gdGhlIHJpZ2h0IGFuZCB0byB0aGUgYm90dG9tLiAgVGhlIHVuaXRzCisgIC8vIHNwZWNpZmllZCBieSB0aGVzZSBwYXJhbWV0ZXJzIGFyZSBudW1iZXIgb2YgcGl4ZWxzLiAgVGhlIHJhbmdlIGZvcgorICAvLyBsZWZ0L3JpZ2h0IGlzIFswLCB3aWR0aF0sIGFuZCBmb3IgdG9wL2JvdHRvbSBpdCBpcyBbMCwgaGVpZ2h0XS4KKyAgU2JEZWNvZGVUYXJnZXRJbmZvQ29udGVudFJlZ2lvbiBjb250ZW50X3JlZ2lvbjsKK30gU2JEZWNvZGVUYXJnZXRJbmZvUGxhbmU7CisKKy8vIENvbnRhaW5zIGFsbCBpbmZvcm1hdGlvbiBhYm91dCBhIGRlY29kZSB0YXJnZXQsIGluY2x1ZGluZyBhbGwgb2YgaXRzIHBsYW5lcy4KKy8vIFRoaXMgY2FuIGJlIHF1ZXJpZWQgdmlhIGNhbGxzIHRvIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbygpLgordHlwZWRlZiBzdHJ1Y3QgU2JEZWNvZGVUYXJnZXRJbmZvIHsKKyAgLy8gVGhlIGRlY29kZSB0YXJnZXQgZm9ybWF0LCB3aGljaCB3b3VsZCBkaWN0YXRlIGhvdyBtYW55IHBsYW5lcyBjYW4gYmUKKyAgLy8gZXhwZWN0ZWQgaW4gfHBsYW5lc3wuCisgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdDsKKworICAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGUgZGVjb2RlIHRhcmdldCBpcyBvcGFxdWUuICBUaGUgdW5kZXJseWluZworICAvLyBzb3VyY2Ugb2YgdGhpcyB2YWx1ZSBpcyBleHBlY3RlZCB0byBiZSBwcm9wZXJseSBtYWludGFpbmVkIGJ5IHRoZSBTdGFyYm9hcmQKKyAgLy8gaW1wbGVtZW50YXRpb24uICBTbywgZm9yIGV4YW1wbGUsIGlmIGFuIG9wYXF1ZSBvbmx5IGltYWdlIHR5cGUgd2VyZSBkZWNvZGVkCisgIC8vIGludG8gYW4gU2JEZWNvZGVUYXJnZXQsIHRoZW4gdGhlIGltcGxlbWVudGF0aW9uIHdvdWxkIGNvbmZpZ3VyZSB0aGluZ3MgaW4KKyAgLy8gc3VjaCBhIHdheSB0aGF0IHRoaXMgdmFsdWUgaXMgc2V0IHRvIHRydWUuICBCeSBvcGFxdWUsIGl0IGlzIG1lYW50CisgIC8vIHRoYXQgYWxsIGFscGhhIHZhbHVlcyBhcmUgZ3VhcmFudGVlZCB0byBiZSAyNTUsIGlmIHRoZSBkZWNvZGUgdGFyZ2V0IGlzIG9mCisgIC8vIGEgZm9ybWF0IHRoYXQgaGFzIGFscGhhIHZhbHVlcy4gIElmIHRoZSBkZWNvZGUgdGFyZ2V0IGlzIG9mIGEgZm9ybWF0IHRoYXQKKyAgLy8gZG9lcyBub3QgaGF2ZSBhbHBoYSB2YWx1ZXMsIHRoZW4gdGhpcyB2YWx1ZSBzaG91bGQgYmUgc2V0IHRvIHRydWUuCisgIC8vIEFwcGxpY2F0aW9ucyBtYXkgcmVseSBvbiB0aGlzIHZhbHVlIGluIG9yZGVyIHRvIGltcGxlbWVudCBjZXJ0YWluCisgIC8vIG9wdGltaXphdGlvbnMgc3VjaCBhcyBvY2NsdXNpb24gY3VsbGluZy4KKyAgYm9vbCBpc19vcGFxdWU7CisKKyAgLy8gVGhlIHdpZHRoIG9mIHRoZSBpbWFnZSByZXByZXNlbnRlZCBieSB0aGlzIGRlY29kZSB0YXJnZXQuCisgIGludCB3aWR0aDsKKyAgLy8gVGhlIGhlaWdodCBvZiB0aGUgaW1hZ2UgcmVwcmVzZW50ZWQgYnkgdGhpcyBkZWNvZGUgdGFyZ2V0LgorICBpbnQgaGVpZ2h0OworCisgIC8vIFRoZSBpbWFnZSBwbGFuZXMgKGUuZy4ga1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBLCBvciB7a1NiRGVjb2RlVGFyZ2V0UGxhbmVZLAorICAvLyAga1NiRGVjb2RlVGFyZ2V0UGxhbmVVLCBrU2JEZWNvZGVUYXJnZXRQbGFuZVZ9IGFzc29jaWF0ZWQgd2l0aCB0aGlzCisgIC8vIGRlY29kZSB0YXJnZXQuCisgIFNiRGVjb2RlVGFyZ2V0SW5mb1BsYW5lIHBsYW5lc1szXTsKK30gU2JEZWNvZGVUYXJnZXRJbmZvOworCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCiAvLyAtLS0gQ29uc3RhbnRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gV2VsbC1kZWZpbmVkIHZhbHVlIGZvciBhbiBpbnZhbGlkIGRlY29kZSB0YXJnZXQgaGFuZGxlLgpAQCAtMjA1LDYgKzI3OCw4IEBACiAKICNpZiBTQl9IQVMoQkxJVFRFUikKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIC8vIENyZWF0ZXMgYSBuZXcgU2JCbGl0dGVyLWNvbXBhdGlibGUgU2JEZWNvZGVUYXJnZXQgZnJvbSBvbmUgb3IgbW9yZSB8cGxhbmVzfAogLy8gY3JlYXRlZCBmcm9tIHxkaXNwbGF5fC4KIC8vCkBAIC0yMjAsOSArMjk1LDI1IEBACiBTQl9FWFBPUlQgU2JCbGl0dGVyU3VyZmFjZSBTYkRlY29kZVRhcmdldEdldFBsYW5lKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0UGxhbmUgcGxhbmUpOwogCisjZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworLy8gQ3JlYXRlcyBhIG5ldyBTYkJsaXR0ZXItY29tcGF0aWJsZSBTYkRlY29kZVRhcmdldCBhbmQgYWxsIGludGVybmFsCisvLyBzdXJmYWNlcy9wbGFuZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCBjcmVhdGVkIGZyb20gfGRldmljZXwuCisvLworLy8gfGRldmljZXw6IFRoZSBkZXZpY2UgZnJvbSB3aGljaCB0aGUgaW50ZXJuYWwgc3VyZmFjZXMgc2hvdWxkIGJlIGNyZWF0ZWQgb24uCisvLyB8Zm9ybWF0fDogVGhlIGZvcm1hdCBvZiB0aGUgZGVjb2RlIHRhcmdldCBiZWluZyBjcmVhdGVkLgorLy8gfHdpZHRofDogVGhlIHdpZHRoIG9mIHRoZSBkZWNvZGUgdGFyZ2V0IGJlaW5nIGNyZWF0ZWQuCisvLyB8aGVpZ2h0fDogVGhlIGhlaWdodCBvZiB0aGUgZGVjb2RlIHRhcmdldCBiZWluZyBjcmVhdGVkLgorU0JfRVhQT1JUIFNiRGVjb2RlVGFyZ2V0IFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKFNiQmxpdHRlckRldmljZSBkZXZpY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KTsKKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCiAjZWxpZiBTQl9IQVMoR0xFUzIpICAvLyBTQl9IQVMoQkxJVFRFUikKIAotI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KIC8vIENyZWF0ZXMgYSBuZXcgRUdML0dMRVMyLWNvbXBhdGlibGUgU2JEZWNvZGVUYXJnZXQgZnJvbSBvbmUgb3IgbW9yZSB8cGxhbmVzfAogLy8gb3duZWQgYnkgfGNvbnRleHR8LCBjcmVhdGVkIGZyb20gfGRpc3BsYXl8LiBNdXN0IGJlIGNhbGxlZCBmcm9tIGEgdGhyZWFkCiAvLyB3aGVyZSB8Y29udGV4dHwgaXMgY3VycmVudC4KQEAgLTI0MywxMCArMzM0LDE5IEBACiAvLyBHZXRzIHRoZSB0ZXh0dXJlIHRoYXQgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gcGxhbmUuCiBTQl9FWFBPUlQgR0x1aW50IFNiRGVjb2RlVGFyZ2V0R2V0UGxhbmUoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFBsYW5lIHBsYW5lKTsKLSNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgotLy8gQ3JlYXRlcyBhIG5ldyBFR0wvR0xFUzItY29tcGF0aWJsZSBTYkRlY29kZVRhcmdldCBmcm9tIG9uZSBvciBtb3JlIHxwbGFuZXN8Ci0vLyBvd25lZCBieSB8Y29udGV4dHwsIGNyZWF0ZWQgZnJvbSB8ZGlzcGxheXwuIE11c3QgYmUgY2FsbGVkIGZyb20gYSB0aHJlYWQKLS8vIHdoZXJlIHxjb250ZXh0fCBpcyBjdXJyZW50LiBSZXR1cm5zIGtTYkRlY29kZVRhcmdldEludmFsaWQgb24gZmFpbHVyZS4KKworI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKKy8vIFNCQ0hBTkdFTE9HOiBTYkRlY29kZVRhcmdldENyZWF0ZSgpIGlzIG5vdyByZXNwb25zaWJsZSBmb3IgY3JlYXRpbmcgaXRzCisvLyAgICAgICAgICAgICAgaW50ZXJuYWwgcGxhbmVzL3RleHR1cmVzL3N1cmZhY2VzLCBpbnN0ZWFkIG9mIGV4cGVjdGluZyB0aGVtCisvLyAgICAgICAgICAgICAgdG8gYmUgZXh0ZXJuYWxseSBjcmVhdGVkIGFuZCBwYXNzZWQgaW50byBpdC4gIFRoaXMgYWxsb3dzIHRoZQorLy8gICAgICAgICAgICAgIHBsYXRmb3JtIHRvIGN1c3RvbWl6ZSB0aGUgcHJvY2VzcyBvZiBwbGFuZSBjcmVhdGlvbi4gIFRoaXMKKy8vICAgICAgICAgICAgICBjaGFuZ2UgYXBwbGllcyB0byBib3RoIEJsaXR0ZXIgQVBJIGFuZCBHTEVTIHBsYXRmb3Jtcy4KKworLy8gQ3JlYXRlcyBhIG5ldyBFR0wvR0xFUzItY29tcGF0aWJsZSBTYkRlY29kZVRhcmdldCBpbmNsdWRpbmcgYWxsIGludGVybmFsCisvLyB0ZXh0dXJlcy9wbGFuZXMgYXNzb2NpYXRlZCB3aXRoIGl0LCB3aGljaCB3aWxsIGJlIG93bmVkIGJ5IHxjb250ZXh0fCwgY3JlYXRlZAorLy8gZnJvbSB8ZGlzcGxheXwuIE11c3QgYmUgY2FsbGVkIGZyb20gYSB0aHJlYWQgd2hlcmUgfGNvbnRleHR8IGlzIGN1cnJlbnQuCisvLyBSZXR1cm5zIGtTYkRlY29kZVRhcmdldEludmFsaWQgb24gZmFpbHVyZS4KIC8vCiAvLyB2b2lkKiBpcyB1c2VkIGluIHBsYWNlIG9mIHRoZSBFR0wgdHlwZXMgc28gYXMgdG8gYXZvaWQgaW5jbHVkaW5nIEVHTCBoZWFkZXJzLAogLy8gd2hpY2ggbWF5IHRyYW5zaXRpdmVseSBpbmNsdWRlIHVuZXhwZWN0ZWQgcGxhdGZvcm0tc3BlY2lmaWMgaGVhZGVycy4gWW91IG11c3QKQEAgLTI2MCwyMSArMzYwLDEzIEBACiAvLyBtYW55IHxwbGFuZXN8IGFyZSBleHBlY3RlZCwgYW5kIHdoYXQgZm9ybWF0IHRoZXkgYXJlIGV4cGVjdGVkIHRvIGJlIGluLgogLy8gfHdpZHRofDogVGhlIHdpZHRoIG9mIHRoZSBkZWNvZGUgdGFyZ2V0IGJlaW5nIGNyZWF0ZWQuCiAvLyB8aGVpZ2h0fDogVGhlIGhlaWdodCBvZiB0aGUgZGVjb2RlIHRhcmdldCBiZWluZyBjcmVhdGVkLgotLy8gfHBsYW5lc3w6IEFuIGFycmF5IG9mIEdMRVMgdGV4dHVyZSBuYW1lcyB0byBiZSBidW5kbGVkIGludG8gYW4KLS8vIFNiRGVjb2RlVGFyZ2V0LiAgTXVzdCBub3QgYmUgTlVMTC4gSXMgZXhwZWN0ZWQgdG8gaGF2ZSB0aGUgc2FtZSBudW1iZXIgb2YKLS8vIGVudHJpZXMgYXMgdGhlIG51bWJlciBvZiBwbGFuZXMgZm9yIHxmb3JtYXR8LCBpbiB0aGUgb3JkZXIsIHNpemUsIGFuZCBmb3JtYXQKLS8vIGV4cGVjdGVkIGJ5IHRoYXQgfGZvcm1hdHwuCiBTQl9FWFBPUlQgU2JEZWNvZGVUYXJnZXQgU2JEZWNvZGVUYXJnZXRDcmVhdGUodm9pZCogZGlzcGxheSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBjb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IGZvcm1hdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogcGxhbmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KTsKIAotLy8gR2V0cyB0aGUgdGV4dHVyZSB0aGF0IHJlcHJlc2VudHMgdGhlIGdpdmVuIHBsYW5lLgotU0JfRVhQT1JUIHVpbnQzMl90IFNiRGVjb2RlVGFyZ2V0R2V0UGxhbmUoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0UGxhbmUgcGxhbmUpOwotI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogCiAjZWxzZSAgLy8gU0JfSEFTKEJMSVRURVIpCiAKQEAgLTI4NywyMyArMzc5LDExIEBACiAgIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOwogfQogCi0vLyBTdHViIGZ1bmN0aW9uIGZvciB3aGVuIGdyYXBoaWNzIGFyZW4ndCBlbmFibGVkLiAgVGhlcmUgaXMgbm8gY29uY2VwdCBvZiBhCi0vLyBwbGFuZSwgYW5kIHxOVUxMfCBpcyBhbHdheXMgcmV0dXJuZWQuCi1zdGF0aWMgU0JfQ19JTkxJTkUgdm9pZCogU2JEZWNvZGVUYXJnZXRHZXRQbGFuZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRQbGFuZSBwbGFuZSkgewotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKGRlY29kZV90YXJnZXQpOwotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHBsYW5lKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KICNlbmRpZiAgLy8gU0JfSEFTKEJMSVRURVIpCiAKLS8vIERlc3Ryb3lzIHRoZSBnaXZlbiBTYkRlY29kZVRhcmdldC4gTm90ZSB0aGF0IGNhbGxpbmcgdGhpcyBmdW5jdGlvbiBkb2VzIE5PVAotLy8gZGVzdHJveSB0aGUgYXNzb2NpYXRlZCBzdXJmYWNlcyB3aXRoIGl0LCBpbiBvcmRlciB0byBhY2NvbW1vZGF0ZSB0aGUgY2FzZQotLy8gaW4gd2hpY2ggaXQgaXMgZGVzaXJhYmxlIGZvciB0aGUgbGlmZXRpbWUgb2YgdGhlIHN1cmZhY2UgdG8gb3V0bGl2ZSB0aGUKLS8vIFNiRGVjb2RlVGFyZ2V0IHRoYXQgY29udGFpbnMgaXQuIElmIHRoZSBzdXJmYWNlcyBzaG91bGQgYmUgZGVzdHJveWVkIGFsb25nCi0vLyB3aXRoIHRoZSBTYkRlY29kZVRhcmdldCwgdGhlbiB0aGV5IHNob3VsZCBiZSBleHRyYWN0ZWQgd2l0aAotLy8gfFNiRGVjb2RlVGFyZ2V0R2V0UGxhbmV8IGFuZCBkZXN0cm95ZWQgbWFudWFsbHkgYnkgdGhlIGNsaWVudC4KKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCisvLyBEZXN0cm95cyB0aGUgZ2l2ZW4gU2JEZWNvZGVUYXJnZXQgYW5kIGFsbCBpdHMgYXNzb2NpYXRlZCBzdXJmYWNlcy4KIFNCX0VYUE9SVCB2b2lkIFNiRGVjb2RlVGFyZ2V0RGVzdHJveShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KTsKIAogLy8gR2V0cyB0aGUgZm9ybWF0IHRoYXQgfGRlY29kZV90YXJnZXR8IHdhcyBjcmVhdGVkIHdpdGguCkBAIC0zMjAsMTYgKzQwMCwyOSBAQAogLy8gbm90IGhhdmUgYWxwaGEgdmFsdWVzLCB0aGVuIHRoaXMgZnVuY3Rpb24gc2hvdWxkIHJldHVybiB8dHJ1ZXwuCiBTQl9FWFBPUlQgYm9vbCBTYkRlY29kZVRhcmdldElzT3BhcXVlKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpOwogCi0jaWYgU0JfVkVSU0lPTihTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04pCi0vLyBHZXRzIHRoZSBkaW1lbnNpb25zIG9mIHRoZSBkZWNvZGUgdGFyZ2V0LgotLy8gfG91dF93aWR0aHw6IE5vbi1udWxsIHBvaW50ZXIgdG8gYW4gaW50ZWdlciB0aGF0IHdpbGwgZ2V0IHRoZQotLy8gdGFyZ2V0J3Mgd2lkdGguIFVuZGVmaW5lZCBpZiB0aGUgZGVjb2RlIHRhcmdldCBpcyBpbnZhbGlkLgotLy8gfG91dF9oZWlnaHR8OiBOb24tbnVsbCBwb2ludGVyIHRvIGFuIGludGVnZXIgdGhhdCB3aWxsIGdldCB0aGUKLS8vIHRhcmdldCdzIGhlaWdodC4gVW5kZWZpbmVkIGlmIHRoZSBkZWNvZGUgdGFyZ2V0IGlzIGludmFsaWQuCi1TQl9FWFBPUlQgdm9pZCBTYkRlY29kZVRhcmdldEdldFNpemUoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dF9oZWlnaHQpOwotI2VuZGlmICAvLyBTQl9WRVJTSU9OKFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTikKKyNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCisvLyBTQkNIQU5HRUxPRzogUmVuYW1lIFNiRGVjb2RlVGFyZ2V0RGVzdHJveSgpIHRvIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZSgpIHRvCisvLyAgICAgICAgICAgICAgbW9yZSBhY2N1cmF0ZWx5IHJlZmxlY3QgaXRzIHBvdGVudGlhbCBzZW1hbnRpY3MgYXMgYSByZWZlcmVuY2UKKy8vICAgICAgICAgICAgICBjb3VudCBkZWNyZW1lbnRlci4KKworLy8gUmV0dXJucyBvd25lcnNoaXAgb2YgfGRlY29kZV90YXJnZXR8IHRvIHRoZSBTdGFyYm9hcmQgaW1wbGVtZW50YXRpb24uCisvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbGlrZWx5IHJlc3VsdCBpbiB0aGUgZGVzdHJ1Y3Rpb24gb2YgdGhlIFNiRGVjb2RlVGFyZ2V0IGFuZAorLy8gYWxsIGl0cyBhc3NvY2lhdGVkIHN1cmZhY2VzLCB0aG91Z2ggaW4gc29tZSBjYXNlcywgcGxhdGZvcm1zIG1heSBzaW1wbHkKKy8vIGFkanVzdCBhIHJlZmVyZW5jZSBjb3VudC4gIEluIHRoZSBjYXNlIHdoZXJlIFNCX0hBUyhHTEVTMiksIHRoaXMgZnVuY3Rpb24KKy8vIG11c3QgYmUgY2FsbGVkIG9uIGEgdGhyZWFkIHdpdGggdGhlIGNvbnRleHQKK1NCX0VYUE9SVCB2b2lkIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0KTsKKworLy8gU0JDSEFOR0VMT0c6IFJlbW92ZSBhbGwgU2JEZWNvZGVUYXJnZXQgImdldCIgZnVuY3Rpb25zIGFuZCByZXBsYWNlIHRoZW0gd2l0aAorLy8gICAgICAgICAgICAgIGEgU2JEZWNvZGVUYXJnZXRHZXRJbmZvKCkgZnVuY3Rpb24gdGhhdCByZXR1cm5zIGFsbCBpbmZvcm1hdGlvbgorLy8gICAgICAgICAgICAgIGFib3V0IGEgZGVjb2RlIHRhcmdldCBhdCBvbmNlLgorCisvLyBXcml0ZXMgYWxsIGluZm9ybWF0aW9uIGFib3V0IHxkZWNvZGVfdGFyZ2V0fCBpbnRvIHxvdXRfaW5mb3wuICBSZXR1cm5zIGZhbHNlCisvLyBpZiB0aGUgcHJvdmlkZWQgfG91dF9pbmZvfCBzdHJ1Y3R1cmUgaXMgbm90IHplcm8gaW5pdGlhbGl6ZWQuCitTQl9FWFBPUlQgYm9vbCBTYkRlY29kZVRhcmdldEdldEluZm8oU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEluZm8qIG91dF9pbmZvKTsKKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogCiAvLyBJbmxpbmUgY29udmVuaWVuY2UgZnVuY3Rpb24gdG8gYWNxdWlyZSBhbiBTYkRlY29kZVRhcmdldCBvZiB0eXBlIHxmb3JtYXR8LAogLy8gfHdpZHRofCwgYW5kIHxoZWlnaHR8IGZyb20gfHByb3ZpZGVyfC4KQEAgLTM1Miw2ICs0NDUsNiBAQAogfSAgLy8gZXh0ZXJuICJDIgogI2VuZGlmCiAKLSNlbmRpZiAgLy8gU0JfVkVSU0lPTigzKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCiAKICNlbmRpZiAgLy8gU1RBUkJPQVJEX0RFQ09ERV9UQVJHRVRfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvZG9jL3ZlcnNpb25pbmcubWQgYi9zcmMvc3RhcmJvYXJkL2RvYy92ZXJzaW9uaW5nLm1kCmluZGV4IDNlMTg5MDMuLjlmNzE0Y2IgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvZG9jL3ZlcnNpb25pbmcubWQKKysrIGIvc3JjL3N0YXJib2FyZC9kb2MvdmVyc2lvbmluZy5tZApAQCAtNzYsMTIgKzc2LDQwIEBACiBjb25zaWRlcmVkIGZyb3plbi4gQW55IFN0YXJib2FyZCBBUElzIGluIGEgZnJvemVuIHZlcnNpb24gc2hhbGwgbm90IGNoYW5nZSBhcwogbG9uZyBhcyB0aGF0IHZlcnNpb24gaXMgc3VwcG9ydGVkIGJ5IENvYmFsdC4KICMjIyBMaWZlIG9mIGEgU3RhcmJvYXJkIEFQSQotTmV3IFN0YXJib2FyZCBBUElzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBleHBlcmltZW50YWwgdmVyc2lvbi4gSW4gcHJhY3RpY2UsCi10aGV5IHNob3VsZCBiZSBkZWNsYXJlZCBhcyBmb2xsb3dzOgorTmV3IFN0YXJib2FyZCBBUElzIHNob3VsZCBiZSBkZWZpbmVkIGluIHRoZSBleHBlcmltZW50YWwgdmVyc2lvbi4KKworV2hlbiBpbnRyb2R1Y2luZyBhIG5ldyBTdGFyYm9hcmQgQVBJIChvciBtb2RpZnlpbmcgYW4gZXhpc3Rpbmcgb25lKSwgYSBuZXcKK2ZlYXR1cmUgdmVyc2lvbiBkZWZpbmUgc2hvdWxkIGJlIGNyZWF0ZWQgd2l0aGluIHRoZSAiRXhwZXJpbWVudGFsIEZlYXR1cmUKK0RlZmluZXMiIHNlY3Rpb24gb2Ygc3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCwgYW5kIHNldCB0bworYFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTmAuIEEgd2VsbCB3cml0dGVuIGNvbW1lbnQgc2hvdWxkIGJlIGFkZGVkIGluIGZyb250CitvZiB0aGUgZmVhdHVyZSBkZWZpbmUgdGhhdCBkZXNjcmliZXMgZXhhY3RseSB3aGF0IGlzIGludHJvZHVjZWQgYnkgdGhlIGZlYXR1cmUuCitJbiB0aGUgY29tbWVudCwgYWxsIG5ldy9tb2RpZmllZC9yZW1vdmVkIHN5bWJvbHMgc2hvdWxkIGJlIGlkZW50aWZpZWQsIGFuZCBhbGwKK21vZGlmaWVkIGhlYWRlciBmaWxlcyBzaG91bGQgYmUgbmFtZWQuCitGb3IgZXhhbXBsZSwKKworYGBgCisvLyAtLS0gRXhwZXJpbWVudGFsIEZlYXR1cmUgRGVmaW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLi4uCisKKy8vIEludHJvZHVjZSBhIG5ldyBBUEkgaW4gc3RhcmJvYXJkL3NjcmVlbnNhdmVyLmgsIHdoaWNoIGRlY2xhcmVzIHRoZSBmb2xsb3dpbmcKKy8vIGZ1bmN0aW9ucyBmb3IgbWFuYWdpbmcgdGhlIHBsYXRmb3JtJ3Mgc2NyZWVuc2F2ZXIgc2V0dGluZ3M6CisvLyAgIFNiU2NyZWVuc2F2ZXJEaXNhYmxlU2NyZWVuc2F2ZXIoKQorLy8gICBTYlNjcmVlbnNhdmVyRW5hYmxlU2NyZWVuc2F2ZXIoKQorLy8gQWRkaXRpb25hbGx5LCBhIG5ldyBldmVudCwga1NiRXZlbnRUeXBlU2NyZWVuc2F2ZXJTdGFydGVkLCBpcyBpbnRyb2R1Y2VkIGluCisvLyBzdGFyYm9hcmQvZXZlbnQuaC4KKyNkZWZpbmUgU0JfU0NSRUVOU0FWRVJfRkVBVFVSRV9BUElfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKworLy8gSW50cm9kdWNlIGEgbmV3IEFQSSBpbiBzdGFyYm9hcmQvbmV3X2Z1bmN0aW9uYWxpdHkuaCB3aGljaCBkZWNsYXJlcyB0aGUKKy8vIGZ1bmN0aW9uIFNiTmV3RnVuY3Rpb25hbGl0eSgpLgorI2RlZmluZSBTQl9NWV9ORVdfRkVBVFVSRV9BUElfVkVSU0lPTiBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KK2BgYAorCitXaGVuIGRlY2xhcmluZyB0aGUgbmV3IGludGVyZmFjZSwgdGhlIGZvbGxvd2luZyBzeW50YXggc2hvdWxkIGJlIHVzZWQ6CiAKIGBgYAogLy8gc3RhcmJvYXJkL25ld19mdW5jdGlvbmFsaXR5LmgKLSNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9NWV9ORVdfRkVBVFVSRV9BUElfVkVSU0lPTgogdm9pZCBTYk5ld0Z1bmN0aW9uYWxpdHkoKTsKICNlbmRpZgogYGBgCkBAIC05MCw3ICsxMTgsNyBAQAogCiBgYGAKIC8vIGNvYmFsdC9uZXdfZmVhdHVyZS5jYwotI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01ZX05FV19GRUFUVVJFX0FQSV9WRVJTSU9OCiB2b2lkIERvU29tZXRoaW5nQ29vbCgpIHsKICAgU2JOZXdGdW5jdGlvbmFsaXR5KCk7CiB9CkBAIC0xMDAsNyArMTI4LDkgQEAKIFdoZW4gYSBuZXcgdmVyc2lvbiBvZiBhIFN0YXJib2FyZCBBcHBsaWNhdGlvbiB0aGF0IHJlcXVpcmVzIG5ldyBTdGFyYm9hcmQgQVBJcwogaXMgdG8gYmUgcmVsZWFzZWQsIHRoZXNlIG5ldyBTdGFyYm9hcmQgQVBJcyB3aWxsIGJlIGZyb3plbiB0byB0aGUgdmFsdWUgb2YgdGhlCiBjdXJyZW50IGV4cGVyaW1lbnRhbCB2ZXJzaW9uLCBhbmQgdGhlIGV4cGVyaW1lbnRhbCB2ZXJzaW9uIHdpbGwgYmUgaW5jcmVtZW50ZWQKLWJ5IG9uZS4KK2J5IG9uZS4gIEFkZGl0aW9uYWxseSwgdGhlIGZlYXR1cmUgZGVmaW5lIHNob3VsZCBiZSByZW1vdmVkLCBhbmQgaXRzIGNvbW1lbnQKK21vdmVkIGludG8gdGhlIChuZXdseSBjcmVhdGVkKSBzZWN0aW9uIGZvciB0aGUgY29ycmVzcG9uZGluZyB2ZXJzaW9uIGluCitzdGFyYm9hcmQvQ0hBTkdFTE9HLm1kLgogCiBgYGAKIC8vIHN0YXJib2FyZC9uZXdfZnVuY3Rpb25hbGl0eS5oCkBAIC0xMDksNyArMTM5LDcgQEAKICNlbmRpZgogCiAvLyBzdGFyYm9hcmQvb3RoZXJfbmV3X2Z1bmN0aW9uYWxpdHkuaAotI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX01ZX09USEVSX05FV19GRUFUVVJFX0FQSV9WRVJTSU9OCiB2b2lkIFNiU3RpbGxJbkRldmVsb3BtZW50KCk7CiAjZW5kaWYKIApAQCAtMTI4LDggKzE1OCw3IEBACiByZWZlcmVuY2UgcGxhdGZvcm1zIGRlY2xhcmUgc3VwcG9ydCBmb3IgdGhlIG5ldyBleHBlcmltZW50YWwgdmVyc2lvbiB0aHJvdWdoCiB0aGVpciByZXNwZWN0aXZlIGBTQl9BUElfVkVSU0lPTmAgbWFjcm9zLgogCi0jIyBPcGVuIHF1ZXN0aW9ucwogIyMjIENvbW11bmljYXRpbmcgU3RhcmJvYXJkIEFQSSBjaGFuZ2VzIHRvIHBvcnRlcnMKLVdoZW4gYSBuZXcgdmVyc2lvbiBvZiBTdGFyYm9hcmQgaXMgcmVsZWFzZWQsIHRoZXJlIHNob3VsZCBiZSBhIHByb2Nlc3MgdG8KLWRlc2NyaWJlIHRoZSBjaGFuZ2VzIHRvIHRoZSBBUEksIHdoaWNoIENvYmFsdCBmZWF0dXJlcyBkZXBlbmQgb24gdGhlc2UsIGFuZCBhCi10aW1lbGluZSBmb3Igd2hlbiBwb3J0ZXJzIHdpbGwgYmUgcmVxdWlyZWQgdG8gbW92ZSB0byB0aGUgbmV3IHZlcnNpb24uCitXaGVuIGEgbmV3IHZlcnNpb24gb2YgU3RhcmJvYXJkIGlzIHJlbGVhc2VkLCBbc3RhcmJvYXJkL0NIQU5HRUxPRy5tZF0oLi4vQ0hBTkdFTE9HLm1kKSBzaG91bGQgYmUKK3VwZGF0ZWQgd2l0aCB0aGUgZmVhdHVyZSBkZWZpbmUgY29tbWVudHMgZm9yIGFsbCBmZWF0dXJlcyBlbmFibGVkIGluIHRoYXQKK3ZlcnNpb24uCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2V4YW1wbGVzL2dsY2xlYXIvbWFpbi5jYyBiL3NyYy9zdGFyYm9hcmQvZXhhbXBsZXMvZ2xjbGVhci9tYWluLmNjCmluZGV4IDEyOWMwNmMuLmU3Y2UxYzQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvZXhhbXBsZXMvZ2xjbGVhci9tYWluLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvZXhhbXBsZXMvZ2xjbGVhci9tYWluLmNjCkBAIC0yMTAsNyArMjEwLDcgQEAKICAgU0JfQ0hFQ0soR0xfTk9fRVJST1IgPT0gZ2xHZXRFcnJvcigpKTsKIAogICBnbENsZWFyKEdMX0NPTE9SX0JVRkZFUl9CSVQpOwotICBTQl9DSEVDSyhFR0xfU1VDQ0VTUyA9PSBlZ2xHZXRFcnJvcigpKTsKKyAgU0JfQ0hFQ0soR0xfTk9fRVJST1IgPT0gZ2xHZXRFcnJvcigpKTsKIAogICBnbEZsdXNoKCk7CiAgIFNCX0NIRUNLKEdMX05PX0VSUk9SID09IGdsR2V0RXJyb3IoKSk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaAppbmRleCA4ZjU0ZDNhLi42MzJlNGUxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKQEAgLTI2MSw2ICsyNjEsNyBAQAogLy8gc3VwcG9ydGVkIGNvbXBvc2l0aW9uIG1ldGhvZHMgYmVsb3cuCiAjZGVmaW5lIFNCX0hBU19QTEFZRVIgMQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KIC8vIFNwZWNpZmllcyB3aGV0aGVyIHRoaXMgcGxhdGZvcm0ncyBwbGF5ZXIgd2lsbCBwcm9kdWNlIGFuIE9wZW5HTCB0ZXh0dXJlIHRoYXQKIC8vIHRoZSBjbGllbnQgbXVzdCBkcmF3IGV2ZXJ5IGZyYW1lIHdpdGggaXRzIGdyYXBoaWNzIHJlbmRlcmluZy4gSXQgbWF5IGJlIHRoYXQKIC8vIHdlIGdldCBhIHRleHR1cmUgaGFuZGxlLCBidXQgY2Fubm90IHBlcmZvcm0gb3BlcmF0aW9ucyBsaWtlIEdsUmVhZFBpeGVscyBvbgpAQCAtMjc5LDYgKzI4MCw3IEBACiAvLyB0aGlzIGNhc2UsIGNoYW5naW5nIHRoZSB2aWRlbyBib3VuZHMgbXVzdCBiZSB0aWdodGx5IHN5bmNocm9uaXplZCBiZXR3ZWVuIHRoZQogLy8gcGxheWVyIGFuZCB0aGUgZ3JhcGhpY3MgcGxhbmUuCiAjZGVmaW5lIFNCX0lTX1BMQVlFUl9QVU5DSEVEX09VVCAxCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiAKIC8vIFNwZWNpZmllcyB0aGUgbWF4aW11bSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgYXVkaW8gYnVmZmVycyBvZiBtZWRpYSBzb3VyY2UKIC8vIGJlZm9yZSB0cmlnZ2VyaW5nIGEgZ2FyYmFnZSBjb2xsZWN0aW9uLiAgQSBsYXJnZSB2YWx1ZSB3aWxsIGNhdXNlIG1vcmUgbWVtb3J5CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmluZGV4IDI4MWEyOGQuLjgzMmI3M2YgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCkBAIC0yMjgsNyArMjI4LDggQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCcsCi0gICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmNjJywKKyAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuaCcsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgnLApAQCAtMjM2LDEyICsyMzcsMTUgQEAKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmgnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2Rlc3Ryb3kuY2MnLAorICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZ2V0X2luZm8uY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaCcsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2Vlay5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfYm91bmRzLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wYXVzZS5jYycsCisgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfcGxheWJhY2tfcmF0ZS5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfdm9sdW1lLmNjJywKICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYycsCiAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCcsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2F0b21pY19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvYXRvbWljX3B1YmxpYy5oCmluZGV4IDE2OWNiODkuLmIyOWQzMjIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvYXRvbWljX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvYXRvbWljX3B1YmxpYy5oCkBAIC0xLDE3ICsxLDE1IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2luY2x1ZGUgInN0YXJib2FyZC9saW51eC9zaGFyZWQvYXRvbWljX3B1YmxpYy5oIgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKaW5kZXggZGI3ZWY2ZS4uMjg1MTYwNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvY29uZmlndXJhdGlvbl9wdWJsaWMuaAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0yNSw0ICsyNSw4IEBACiAjdW5kZWYgU0JfQVBJX1ZFUlNJT04KICNkZWZpbmUgU0JfQVBJX1ZFUlNJT04gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCiAKKyN1bmRlZiBTQl9JU19QTEFZRVJfUFJPRFVDSU5HX1RFWFRVUkUKKyN1bmRlZiBTQl9JU19QTEFZRVJfQ09NUE9TSVRFRAorI3VuZGVmIFNCX0lTX1BMQVlFUl9QVU5DSEVEX09VVAorCiAjZW5kaWYgIC8vIFNUQVJCT0FSRF9MSU5VWF9YNjRESVJFQ1RGQl9GVVRVUkVfQ09ORklHVVJBVElPTl9QVUJMSUNfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9neXBfY29uZmlndXJhdGlvbi5neXBpCmluZGV4IDQ0YjkyMGQuLmZkODEzZjYgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLmd5cGkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMTMsNiArMTMsMTIgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIHsKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAjIFRoaXMgc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHZhbHVlIGluIGNvYmFsdC9iYXNlLmd5cGkuIFNlZSB0aGUgY29tbWVudAorICAgICMgdGhlcmUgZm9yIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGlzIHZhcmlhYmxlLgorICAgICdjb2JhbHRfbWVkaWFfc291cmNlXzIwMTYnOiAxLAorICB9LAorCiAgICd0YXJnZXRfZGVmYXVsdHMnOiB7CiAgICAgJ2RlZmF1bHRfY29uZmlndXJhdGlvbic6ICdsaW51eC14NjRkaXJlY3RmYi1mdXR1cmVfZGVidWcnLAogICAgICdjb25maWd1cmF0aW9ucyc6IHsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggMmY3ZmUxYi4uYjMxNzEzYSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTI3LDcgKzI3LDEyIEBACiAKIGRlZiBDcmVhdGVQbGF0Zm9ybUNvbmZpZygpOgogICB0cnk6Ci0gICAgcmV0dXJuIGd5cF9jb25maWd1cmF0aW9uLlBsYXRmb3JtQ29uZmlnKCdsaW51eC14NjRkaXJlY3RmYi1mdXR1cmUnKQorICAgIHJldHVybiBneXBfY29uZmlndXJhdGlvbi5QbGF0Zm9ybUNvbmZpZygKKyAgICAgICAgJ2xpbnV4LXg2NGRpcmVjdGZiLWZ1dHVyZScsCisgICAgICAgICMgVW5mb3J0dW5hdGVseSwgc29tZSBtZW1vcnkgbGVha3Mgb3V0c2lkZSBvZiBvdXIgY29udHJvbCwgYW5kIGRpZmZpY3VsdAorICAgICAgICAjIHRvIHBhdHRlcm4gbWF0Y2ggd2l0aCBBU0FOJ3Mgc3VwcHJlc3Npb24gbGlzdCwgYXBwZWFyIGluIERpcmVjdEZCCisgICAgICAgICMgYnVpbGRzLCBhbmQgc28gdGhpcyBtdXN0IGJlIGRpc2FibGVkLgorICAgICAgICBhc2FuX2VuYWJsZWRfYnlfZGVmYXVsdD1GYWxzZSkKICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBlOgogICAgIGxvZ2dpbmcuY3JpdGljYWwoZSkKICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZnV0dXJlL3N0YXJib2FyZF9wbGF0Zm9ybS5neXAKaW5kZXggZGQ2ZjUwMi4uOWE3YjY4ZSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9mdXR1cmUvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cAorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2Z1dHVyZS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0xOCwxMyArMTgsMTUgQEAKICAgICAgICdwcm9kdWN0X25hbWUnOiAnc3RhcmJvYXJkX3BsYXRmb3JtX2Z1dHVyZScsCiAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCiAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF9kaXNwbGF5X3NldHRpbmdzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF90ZXh0X3RvX3NwZWVjaF9zZXR0aW5ncy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9jcmVhdGVfYmxpdHRlci5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9kZXN0cm95LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9mb3JtYXQuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2luZm8uY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3BsYW5lX2JsaXR0ZXIuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3NpemUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfaXNfb3BhcXVlLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X3JlbGVhc2UuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2RlY29kZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvaW1hZ2VfaXNfZGVjb2RlX3N1cHBvcnRlZC5jYycsCiAgICAgICBdLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKaW5kZXggMDUwNjEyMS4uOTkzMzA1MiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9neXBfY29uZmlndXJhdGlvbi5weQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL2d5cF9jb25maWd1cmF0aW9uLnB5CkBAIC0yNSw4ICsyNSwxMiBAQAogCiBkZWYgQ3JlYXRlUGxhdGZvcm1Db25maWcoKToKICAgdHJ5OgotICAgIHJldHVybiBneXBfY29uZmlndXJhdGlvbi5QbGF0Zm9ybUNvbmZpZygnbGludXgteDY0ZGlyZWN0ZmInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2FuX2VuYWJsZWRfYnlfZGVmYXVsdD1GYWxzZSkKKyAgICByZXR1cm4gZ3lwX2NvbmZpZ3VyYXRpb24uUGxhdGZvcm1Db25maWcoCisgICAgICAgICdsaW51eC14NjRkaXJlY3RmYicsCisgICAgICAgICMgVW5mb3J0dW5hdGVseSwgc29tZSBtZW1vcnkgbGVha3Mgb3V0c2lkZSBvZiBvdXIgY29udHJvbCwgYW5kIGRpZmZpY3VsdAorICAgICAgICAjIHRvIHBhdHRlcm4gbWF0Y2ggd2l0aCBBU0FOJ3Mgc3VwcHJlc3Npb24gbGlzdCwgYXBwZWFyIGluIERpcmVjdEZCCisgICAgICAgICMgYnVpbGRzLCBhbmQgc28gdGhpcyBtdXN0IGJlIGRpc2FibGVkLgorICAgICAgICBhc2FuX2VuYWJsZWRfYnlfZGVmYXVsdD1GYWxzZSkKICAgZXhjZXB0IFJ1bnRpbWVFcnJvciBhcyBlOgogICAgIGxvZ2dpbmcuY3JpdGljYWwoZSkKICAgICByZXR1cm4gTm9uZQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYW5pdGl6ZXJfb3B0aW9ucy5jYyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvc2FuaXRpemVyX29wdGlvbnMuY2MKaW5kZXggZTg1ZDQ1MS4uYjVmNzJjZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi9zYW5pdGl6ZXJfb3B0aW9ucy5jYworKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NGRpcmVjdGZiL3Nhbml0aXplcl9vcHRpb25zLmNjCkBAIC0zNiw3ICszNiw5IEBACiAvLyBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9BZGRyZXNzU2FuaXRpemVyLmh0bWwjaXNzdWUtc3VwcHJlc3Npb24KIC8vIGh0dHA6Ly9sbHZtLm9yZy9zdm4vbGx2bS1wcm9qZWN0L2NvbXBpbGVyLXJ0L3RydW5rL2xpYi9zYW5pdGl6ZXJfY29tbW9uL3Nhbml0aXplcl9zdXBwcmVzc2lvbnMuY2MKIFNBTklUSVpFUl9IT09LX0FUVFJJQlVURSBjb25zdCBjaGFyKiBfX2xzYW5fZGVmYXVsdF9zdXBwcmVzc2lvbnMoKSB7Ci0gIHJldHVybiAibGVhazoqZWdsaWJjLTIuMTkqXG4iOworICByZXR1cm4KKyAgICAgIC8vIERpcmVjdEZCIGxlYWtzIF9fc3RyZHVwIGRhdGEgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4KKyAgICAgICJsZWFrOl9fc3RyZHVwXG4iCiB9CiAKICNlbmRpZiAgLy8gZGVmaW5lZChBRERSRVNTX1NBTklUSVpFUikKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0ZGlyZWN0ZmIvdGhyZWFkX3R5cGVzX3B1YmxpYy5oIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi90aHJlYWRfdHlwZXNfcHVibGljLmgKaW5kZXggNjU0OGUwMC4uZGFmNGE5YiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi90aHJlYWRfdHlwZXNfcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjRkaXJlY3RmYi90aHJlYWRfdHlwZXNfcHVibGljLmgKQEAgLTEsMTcgKzEsMTUgQEAKLS8qCi0gKiBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotICoKLSAqIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotICogeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotICogWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0gKgotICogICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotICoKLSAqIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSAqIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0gKiBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSAqIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSAqIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotICovCisvLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2xpbnV4L3NoYXJlZC90aHJlYWRfdHlwZXNfcHVibGljLmgiCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9hdG9taWNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9hdG9taWNfcHVibGljLmgKaW5kZXggNzg0NWIwMi4uNzhiZTI3ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvYXRvbWljX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2F0b21pY19wdWJsaWMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9BVE9NSUNfUFVCTElDX0hfCiAjZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfQVRPTUlDX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY2xhbmcvMy4zL2d5cF9jb25maWd1cmF0aW9uLnB5IGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY2xhbmcvMy4zL2d5cF9jb25maWd1cmF0aW9uLnB5CmluZGV4IDY5NGQ2OTUuLjdlZmQ1MjIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NsYW5nLzMuMy9neXBfY29uZmlndXJhdGlvbi5weQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jbGFuZy8zLjMvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKQEAgLTMyLDcgKzMyLDcgQEAKIGNsYXNzIFBsYXRmb3JtQ29uZmlnKHNoYXJlZF9jb25maWd1cmF0aW9uLlBsYXRmb3JtQ29uZmlnKToKICAgIiIiU3RhcmJvYXJkIExpbnV4IHBsYXRmb3JtIGNvbmZpZ3VyYXRpb24uIiIiCiAKLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBhc2FuX2VuYWJsZWRfYnlfZGVmYXVsdD1UcnVlKToKKyAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtLCBhc2FuX2VuYWJsZWRfYnlfZGVmYXVsdD1GYWxzZSk6CiAgICAgc3VwZXIoUGxhdGZvcm1Db25maWcsIHNlbGYpLl9faW5pdF9fKAogICAgICAgICBwbGF0Zm9ybSwgYXNhbl9lbmFibGVkX2J5X2RlZmF1bHQsIGdvbWFfc3VwcG9ydHNfY29tcGlsZXI9RmFsc2UpCiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NwcDExL2F0b21pY19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NwcDExL2F0b21pY19wdWJsaWMuaAppbmRleCBkNzQwOTRlLi5hMmJlNGMwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jcHAxMS9hdG9taWNfcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY3BwMTEvYXRvbWljX3B1YmxpYy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0WDExX0NQUDExX0FUT01JQ19QVUJMSUNfSF8KICNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9DUFAxMV9BVE9NSUNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jcHAxMS90aHJlYWRfdHlwZXNfcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9jcHAxMS90aHJlYWRfdHlwZXNfcHVibGljLmgKaW5kZXggOTY3NmI5OS4uOWFiMGFjMyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvY3BwMTEvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2NwcDExL3RocmVhZF90eXBlc19wdWJsaWMuaApAQCAtMSwxOCArMSwxNiBAQAotLyoKLSAqIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0gKgotICogTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0gKiB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0gKiBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSAqCi0gKiAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0gKgotICogVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotICogZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSAqIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotICogU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotICogbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0gKi8KKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKICNpZm5kZWYgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9DUFAxMV9USFJFQURfVFlQRVNfUFVCTElDX0hfCiAjZGVmaW5lIFNUQVJCT0FSRF9MSU5VWF9YNjRYMTFfQ1BQMTFfVEhSRUFEX1RZUEVTX1BVQkxJQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvZnV0dXJlL2d5cF9jb25maWd1cmF0aW9uLmd5cGkgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQppbmRleCAwY2IxMmNmLi5kN2YzYWY2IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQorKysgYi9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvZ3lwX2NvbmZpZ3VyYXRpb24uZ3lwaQpAQCAtMTMsNiArMTMsMTIgQEAKICMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKIHsKKyAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAjIFRoaXMgc2hvdWxkIGhhdmUgYSBkZWZhdWx0IHZhbHVlIGluIGNvYmFsdC9iYXNlLmd5cGkuIFNlZSB0aGUgY29tbWVudAorICAgICMgdGhlcmUgZm9yIGFjY2VwdGFibGUgdmFsdWVzIGZvciB0aGlzIHZhcmlhYmxlLgorICAgICdjb2JhbHRfbWVkaWFfc291cmNlXzIwMTYnOiAxLAorICB9LAorCiAgICd0YXJnZXRfZGVmYXVsdHMnOiB7CiAgICAgJ2RlZmF1bHRfY29uZmlndXJhdGlvbic6ICdsaW51eC14NjR4MTEtZnV0dXJlX2RlYnVnJywKICAgICAnY29uZmlndXJhdGlvbnMnOiB7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS9mdXR1cmUvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2Z1dHVyZS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmluZGV4IDNjMWFjMTEuLjM5MTIxMGEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2Z1dHVyZS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL2Z1dHVyZS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0yMiwxMyArMjIsMTUgQEAKICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKICAgICAgICdzb3VyY2VzJzogWwogICAgICAgICAnPEAoc3RhcmJvYXJkX3BsYXRmb3JtX3NvdXJjZXMpJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF9kaXNwbGF5X3NldHRpbmdzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF90ZXh0X3RvX3NwZWVjaF9zZXR0aW5ncy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9jcmVhdGVfZWdsLmNjJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2Rlc3Ryb3kuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2Zvcm1hdC5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfaW5mby5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfcGxhbmVfZWdsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9zaXplLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2lzX29wYXF1ZS5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9yZWxlYXNlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9pbWFnZV9kZWNvZGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2ltYWdlX2lzX2RlY29kZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgXSwKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3RocmVhZF90eXBlc19wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvbGludXgveDY0eDExL3RocmVhZF90eXBlc19wdWJsaWMuaAppbmRleCA3MTZjNjk3Li4wMWEzOWZkIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL2xpbnV4L3g2NHgxMS90aHJlYWRfdHlwZXNfcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9saW51eC94NjR4MTEvdGhyZWFkX3R5cGVzX3B1YmxpYy5oCkBAIC0xLDE4ICsxLDE2IEBACi0vKgotICogQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLSAqCi0gKiBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSAqIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSAqIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotICoKLSAqICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSAqCi0gKiBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0gKiBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotICogV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0gKiBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0gKiBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLSAqLworLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KIAogI2lmbmRlZiBTVEFSQk9BUkRfTElOVVhfWDY0WDExX1RIUkVBRF9UWVBFU19QVUJMSUNfSF8KICNkZWZpbmUgU1RBUkJPQVJEX0xJTlVYX1g2NFgxMV9USFJFQURfVFlQRVNfUFVCTElDX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL21lbW9yeS5oIGIvc3JjL3N0YXJib2FyZC9tZW1vcnkuaAppbmRleCAxYTdkM2U5Li4zOGJlOGQ4IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL21lbW9yeS5oCisrKyBiL3NyYy9zdGFyYm9hcmQvbWVtb3J5LmgKQEAgLTkzLDYgKzkzLDEwIEBACiAvLyAgIHBhc3NlZCB0byBTYk1lbW9yeURlYWxsb2NhdGUuCiBTQl9FWFBPUlQgdm9pZCogU2JNZW1vcnlBbGxvY2F0ZShzaXplX3Qgc2l6ZSk7CiAKKy8vIFNhbWUgYXMgU2JNZW1vcnlBbGxvY2F0ZSgpIGJ1dCB3aWxsIG5vdCByZXBvcnQgbWVtb3J5IHRvIHRoZSB0cmFja2VyLiBBdm9pZAorLy8gdXNpbmcgdGhpcyB1bmxlc3MgYWJzb2x1dGVseSBuZWNlc3NhcnkuCitTQl9FWFBPUlQgdm9pZCogU2JNZW1vcnlBbGxvY2F0ZU5vUmVwb3J0KHNpemVfdCBzaXplKTsKKwogLy8gQXR0ZW1wdHMgdG8gcmVzaXplIHxtZW1vcnl8IHRvIGJlIGF0IGxlYXN0IHxzaXplfCBieXRlcywgd2l0aG91dCB0b3VjaGluZwogLy8gdGhlIGNvbnRlbnRzIG9mIG1lbW9yeS4KIC8vIC0gSWYgdGhlIGZ1bmN0aW9uIGNhbm5vdCBwZXJmb3JtIHRoZSBmYXN0IHJlc2l6ZSwgaXQgYWxsb2NhdGVzIGEgbmV3IGNodW5rCkBAIC0xMzIsNiArMTM2LDEwIEBACiAvLyB8bWVtb3J5fDogVGhlIGNodW5rIG9mIG1lbW9yeSB0byBiZSBmcmVlZC4KIFNCX0VYUE9SVCB2b2lkIFNiTWVtb3J5RGVhbGxvY2F0ZSh2b2lkKiBtZW1vcnkpOwogCisvLyBTYW1lIGFzIFNiTWVtb3J5RGVhbGxvY2F0ZSgpIGJ1dCB3aWxsIG5vdCByZXBvcnQgbWVtb3J5IGRlYWxsb2NhdGlvbiB0byB0aGUKKy8vIHRyYWNrZXIuIFRoaXMgZnVuY3Rpb24gbXVzdCBiZSBtYXRjaGVkIHdpdGggU2JNZW1vcnlBbGxvY2F0ZU5vUmVwb3J0KCkuCitTQl9FWFBPUlQgdm9pZCBTYk1lbW9yeURlYWxsb2NhdGVOb1JlcG9ydCh2b2lkKiBtZW1vcnkpOworCiAvLyBGcmVlcyBhIHByZXZpb3VzbHkgYWxsb2NhdGVkIGNodW5rIG9mIGFsaWduZWQgbWVtb3J5LiBUaGlzIGZ1bmN0aW9uIHNob3VsZAogLy8gYmUgY2FsbGVkIGZyb20gdGhlIGNsaWVudCBjb2RlYmFzZS4gSXQgaXMgbWVhbnQgdG8gYmUgYSBkcm9wLWluIHJlcGxhY2VtZW50CiAvLyBmb3IgfF9hbGlnbmVkX2ZyZWV8LgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2FjY2Vzc2liaWxpdHlfZ2V0X3NldHRpbmdfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9hY2Nlc3NpYmlsaXR5X2dldF9zZXR0aW5nX3Rlc3QuY2MKaW5kZXggYWIxODJmNy4uM2ZmYWExOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2FjY2Vzc2liaWxpdHlfZ2V0X3NldHRpbmdfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvYWNjZXNzaWJpbGl0eV9nZXRfc2V0dGluZ190ZXN0LmNjCkBAIC0zNSw2ICszNSwyMCBAQAogICBFWFBFQ1RfRkFMU0UoU2JBY2Nlc3NpYmlsaXR5R2V0VGV4dFRvU3BlZWNoU2V0dGluZ3MoTlVMTCkpOwogfQogCitURVNUKFNiQWNjZXNzaWJpbGl0eUdldFNldHRpbmdUZXN0LCBDYW5DYWxsR2V0RGlzcGxheVNldHRpbmdzKSB7CisgIFNiQWNjZXNzaWJpbGl0eURpc3BsYXlTZXR0aW5ncyBzZXR0aW5ncyA9IHswfTsKKyAgRVhQRUNUX1RSVUUoU2JBY2Nlc3NpYmlsaXR5R2V0RGlzcGxheVNldHRpbmdzKCZzZXR0aW5ncykpOworfQorCitURVNUKFNiQWNjZXNzaWJpbGl0eUdldFNldHRpbmdUZXN0LCBDYWxsRGlzcGxheVdpdGhJbnZhbGlkQXJndW1lbnQpIHsKKyAgLy8gfHNldHRpbmdzfCBzaG91bGQgYmUgemVyby1pbml0aWFsaXplZC4KKyAgU2JBY2Nlc3NpYmlsaXR5RGlzcGxheVNldHRpbmdzIHNldHRpbmdzID0gezF9OworICBFWFBFQ1RfRkFMU0UoU2JBY2Nlc3NpYmlsaXR5R2V0RGlzcGxheVNldHRpbmdzKCZzZXR0aW5ncykpOworCisgIC8vIEFyZ3VtZW50IHNob3VsZCBub3QgYmUgTlVMTC4KKyAgRVhQRUNUX0ZBTFNFKFNiQWNjZXNzaWJpbGl0eUdldERpc3BsYXlTZXR0aW5ncyhOVUxMKSk7Cit9CisKICNlbmRpZgogCiB9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9kZWNvZGVfdGFyZ2V0X2NyZWF0ZV90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RlY29kZV90YXJnZXRfY3JlYXRlX3Rlc3QuY2MKaW5kZXggYWI0YjIyOS4uMzMyMzVlNiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2RlY29kZV90YXJnZXRfY3JlYXRlX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL2RlY29kZV90YXJnZXRfY3JlYXRlX3Rlc3QuY2MKQEAgLTE5LDcgKzE5LDcgQEAKIC8vIHdoaWNoIHdpbGwgZGVmaW5lIE5vbmUgdG8gYmUgMEwsIHdoaWNoIGNvbmZsaWN0cyB3aXRoIGd0ZXN0LgogI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiICAvLyBOT0xJTlQoYnVpbGQvaW5jbHVkZV9vcmRlcikKIAotI2lmIFNCX1ZFUlNJT04oMykgJiYgU0JfSEFTKEdSQVBISUNTKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQogCiAjaWYgU0JfSEFTKEJMSVRURVIpCiAjaW5jbHVkZSAic3RhcmJvYXJkL2JsaXR0ZXIuaCIKQEAgLTQyLDYgKzQyLDI0IEBACiAKICAgQVNTRVJUX1RSVUUoU2JCbGl0dGVyU2V0UmVuZGVyVGFyZ2V0KGVudi5jb250ZXh0KCksIGVudi5yZW5kZXJfdGFyZ2V0KCkpKTsKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBTYkRlY29kZVRhcmdldCB0YXJnZXQgPSBTYkRlY29kZVRhcmdldENyZWF0ZSgKKyAgICAgIGVudi5kZXZpY2UoKSwga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lUkdCQSwga1dpZHRoLCBrSGVpZ2h0KTsKKyAgaWYgKFNiRGVjb2RlVGFyZ2V0SXNWYWxpZCh0YXJnZXQpKSB7CisgICAgU2JEZWNvZGVUYXJnZXRJbmZvIGluZm87CisgICAgU2JNZW1vcnlTZXQoJmluZm8sIDAsIHNpemVvZihpbmZvKSk7CisgICAgU2JEZWNvZGVUYXJnZXRHZXRJbmZvKHRhcmdldCwgJmluZm8pOworCisgICAgRVhQRUNUX0VRKGtXaWR0aCwgaW5mby53aWR0aCk7CisgICAgRVhQRUNUX0VRKGtIZWlnaHQsIGluZm8uaGVpZ2h0KTsKKyAgICBFWFBFQ1RfRVEoa1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lUkdCQSwgaW5mby5mb3JtYXQpOworICAgIEVYUEVDVF9FUShrV2lkdGgsIGluZm8ucGxhbmVzW2tTYkRlY29kZVRhcmdldFBsYW5lUkdCQV0ud2lkdGgpOworICAgIEVYUEVDVF9FUShrSGVpZ2h0LCBpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkFdLmhlaWdodCk7CisgICAgRVhQRUNUX1RSVUUoCisgICAgICAgIFNiQmxpdHRlcklzU3VyZmFjZVZhbGlkKGluZm8ucGxhbmVzW2tTYkRlY29kZVRhcmdldFBsYW5lUkdCQV0uc3VyZmFjZSkpOworICB9CisgIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZSh0YXJnZXQpOworI2Vsc2UgICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICAgU2JCbGl0dGVyU3VyZmFjZSBzdXJmYWNlID0KICAgICAgIENyZWF0ZUFyYml0cmFyeVJlbmRlclRhcmdldFN1cmZhY2UoZW52LmRldmljZSgpLCBrV2lkdGgsIGtIZWlnaHQpOwogCkBAIC01MSwxNiArNjksMTAgQEAKICAgICBTYkJsaXR0ZXJTdXJmYWNlIHBsYW5lID0KICAgICAgICAgU2JEZWNvZGVUYXJnZXRHZXRQbGFuZSh0YXJnZXQsIGtTYkRlY29kZVRhcmdldFBsYW5lUkdCQSk7CiAgICAgRVhQRUNUX1RSVUUoU2JCbGl0dGVySXNTdXJmYWNlVmFsaWQocGxhbmUpKTsKLSNpZiBTQl9WRVJTSU9OKFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTikKLSAgICBpbnQgd2lkdGggPSAwOwotICAgIGludCBoZWlnaHQgPSAwOwotICAgIFNiRGVjb2RlVGFyZ2V0R2V0U2l6ZSh0YXJnZXQsICZ3aWR0aCwgJmhlaWdodCk7Ci0gICAgRVhQRUNUX0VRKGtXaWR0aCwgd2lkdGgpOwotICAgIEVYUEVDVF9FUShrSGVpZ2h0LCBoZWlnaHQpOwotI2VuZGlmICAvLyBTQl9WRVJTSU9OKFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTikKICAgfQogICBTYkRlY29kZVRhcmdldERlc3Ryb3kodGFyZ2V0KTsKICAgRVhQRUNUX1RSVUUoU2JCbGl0dGVyRGVzdHJveVN1cmZhY2Uoc3VyZmFjZSkpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KIH0KICNlbGlmIFNCX0hBUyhHTEVTMikgIC8vIFNCX0hBUyhCTElUVEVSKQogLy8gY2xhbmctZm9ybWF0IG9mZgpAQCAtMTYzLDYgKzE3NSwzMiBAQAogICBTYldpbmRvdyB3aW5kb3dfOwogfTsKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorVEVTVF9GKFNiRGVjb2RlVGFyZ2V0VGVzdCwgU3VubnlEYXlDcmVhdGUpIHsKKyAgY29uc3QgaW50IGtUZXh0dXJlV2lkdGggPSAyNTY7CisgIGNvbnN0IGludCBrVGV4dHVyZUhlaWdodCA9IDI1NjsKKworICBTYkRlY29kZVRhcmdldCB0YXJnZXQgPQorICAgICAgU2JEZWNvZGVUYXJnZXRDcmVhdGUoZGlzcGxheV8sIGNvbnRleHRfLCBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBLAorICAgICAgICAgICAgICAgICAgICAgICAgICAga1RleHR1cmVXaWR0aCwga1RleHR1cmVIZWlnaHQpOworICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKHRhcmdldCkpIHsKKyAgICBTYkRlY29kZVRhcmdldEluZm8gaW5mbzsKKyAgICBTYk1lbW9yeVNldCgmaW5mbywgMCwgc2l6ZW9mKGluZm8pKTsKKyAgICBTYkRlY29kZVRhcmdldEdldEluZm8odGFyZ2V0LCAmaW5mbyk7CisgICAgRVhQRUNUX0VRKGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEsIGluZm8uZm9ybWF0KTsKKworICAgIEVYUEVDVF9ORSgwLCBpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkFdLnRleHR1cmUpOworCisgICAgZ2xCaW5kVGV4dHVyZShpbmZvLnBsYW5lc1trU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkFdLmdsX3RleHR1cmVfdGFyZ2V0LAorICAgICAgICAgICAgICAgICAgaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBXS50ZXh0dXJlKTsKKyAgICBFWFBFQ1RfVFJVRShnbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1IpOworICAgIGdsQmluZFRleHR1cmUoaW5mby5wbGFuZXNba1NiRGVjb2RlVGFyZ2V0UGxhbmVSR0JBXS5nbF90ZXh0dXJlX3RhcmdldCwgMCk7CisgICAgRVhQRUNUX1RSVUUoZ2xHZXRFcnJvcigpID09IEdMX05PX0VSUk9SKTsKKworICAgIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZSh0YXJnZXQpOworICB9Cit9CisjZWxzZSAgIC8vICNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KIFRFU1RfRihTYkRlY29kZVRhcmdldFRlc3QsIFN1bm55RGF5Q3JlYXRlKSB7CiAgIC8vIEdlbmVyYXRlIGEgdGV4dHVyZSB0byBwdXQgaW4gdGhlIFNiRGVjb2RlVGFyZ2V0LgogICBjb25zdCBpbnQga1RleHR1cmVXaWR0aCA9IDI1NjsKQEAgLTE3OCwyNCArMjE2LDE1IEBACiAKICAgU2JEZWNvZGVUYXJnZXQgdGFyZ2V0ID0KICAgICAgIFNiRGVjb2RlVGFyZ2V0Q3JlYXRlKGRpc3BsYXlfLCBjb250ZXh0Xywga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lUkdCQSwKLSNpZiBTQl9WRVJTSU9OKFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUZXh0dXJlV2lkdGgsIGtUZXh0dXJlSGVpZ2h0LAotI2VuZGlmICAvLyBTQl9WRVJTSU9OKFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTikKICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZXh0dXJlX2hhbmRsZSk7CiAgIGlmIChTYkRlY29kZVRhcmdldElzVmFsaWQodGFyZ2V0KSkgewogICAgIEdMdWludCBwbGFuZSA9IFNiRGVjb2RlVGFyZ2V0R2V0UGxhbmUodGFyZ2V0LCBrU2JEZWNvZGVUYXJnZXRQbGFuZVJHQkEpOwogICAgIEVYUEVDVF9FUSh0ZXh0dXJlX2hhbmRsZSwgcGxhbmUpOwotI2lmIFNCX1ZFUlNJT04oU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OKQotICAgIGludCB3aWR0aCA9IDA7Ci0gICAgaW50IGhlaWdodCA9IDA7Ci0gICAgU2JEZWNvZGVUYXJnZXRHZXRTaXplKHRhcmdldCwgJndpZHRoLCAmaGVpZ2h0KTsKLSAgICBFWFBFQ1RfRVEoa1RleHR1cmVXaWR0aCwgd2lkdGgpOwotICAgIEVYUEVDVF9FUShrVGV4dHVyZUhlaWdodCwgaGVpZ2h0KTsKLSNlbmRpZiAgLy8gU0JfVkVSU0lPTihTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04pCiAgICAgU2JEZWNvZGVUYXJnZXREZXN0cm95KHRhcmdldCk7CiAgIH0KICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGV4dHVyZV9oYW5kbGUpOwogfQorI2VuZGlmICAvLyAjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiAKICNlbHNlICAvLyBTQl9IQVMoQkxJVFRFUikKIApAQCAtMjA0LDkgKzIzMyw5IEBACiAgIC8vIGtTYkRlY29kZVRhcmdldEludmFsaWQsIGFuZCBnZXQgTlVMTCBiYWNrIGZvciBwbGFuZXMuCiAgIEVYUEVDVF9FUShTYkRlY29kZVRhcmdldENyZWF0ZShrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBKSwKICAgICAgICAgICAgIGtTYkRlY29kZVRhcmdldEludmFsaWQpOwotICBFWFBFQ1RfRVEoCi0gICAgICBTYkRlY29kZVRhcmdldEdldFBsYW5lKGtTYkRlY29kZVRhcmdldEludmFsaWQsIGtTYkRlY29kZVRhcmdldFBsYW5lUkdCQSksCi0gICAgICBOVUxMKTsKKyAgU2JEZWNvZGVUYXJnZXRJbmZvIGluZm87CisgIFNiTWVtb3J5U2V0KCZpbmZvLCAwLCBzaXplb2YoaW5mbykpOworICBFWFBFQ1RfRkFMU0UoU2JEZWNvZGVUYXJnZXRHZXRJbmZvKGtTYkRlY29kZVRhcmdldEludmFsaWQsICZpbmZvKSk7CiB9CiAKICNlbmRpZiAgLy8gU0JfSEFTKEJMSVRURVIpCkBAIC0yMTUsNCArMjQ0LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBucGxiCiB9ICAvLyBuYW1lc3BhY2Ugc3RhcmJvYXJkCiAKLSNlbmRpZiAgLy8gU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMgJiYgU0JfSEFTKEdSQVBISUNTKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL2RlY29kZV90YXJnZXRfcHJvdmlkZXJfdGVzdC5jYyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9kZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyX3Rlc3QuY2MKaW5kZXggY2Q1M2U0MC4uNzhmYzQ4NSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL2RlY29kZV90YXJnZXRfcHJvdmlkZXJfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvZGVjb2RlX3RhcmdldF9wcm92aWRlcl90ZXN0LmNjCkBAIC01MCw3ICs1MCwxMSBAQAogICAgIGJvb2wgdmFsaWQgPSBTYkRlY29kZVRhcmdldElzVmFsaWQodGFyZ2V0KTsKICAgICBFWFBFQ1RfRkFMU0UodmFsaWQpOwogICAgIGlmICh2YWxpZCkgeworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICAgICAgU2JEZWNvZGVUYXJnZXRSZWxlYXNlKHRhcmdldCk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICAgICAgU2JEZWNvZGVUYXJnZXREZXN0cm95KHRhcmdldCk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICAgIH0KICAgfQogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9ucGxiL21lbW9yeV9yZXBvcnRlcl90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL21lbW9yeV9yZXBvcnRlcl90ZXN0LmNjCmluZGV4IGY0OWUzMzkuLmUyMjUzMjQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9tZW1vcnlfcmVwb3J0ZXJfdGVzdC5jYworKysgYi9zcmMvc3RhcmJvYXJkL25wbGIvbWVtb3J5X3JlcG9ydGVyX3Rlc3QuY2MKQEAgLTI4NSw3ICsyODUsNyBAQAogLy8gd2lsbCByZXBvcnQgbWVtb3J5IGFsbG9jYXRpb25zLgogVEVTVF9GKE1lbW9yeVJlcG9ydGluZ1Rlc3QsIENhcHR1cmVzQWxsb2NEZWFsbG9jKSB7CiAgIGlmICghTWVtb3J5UmVwb3J0aW5nRW5hYmxlZCgpKSB7Ci0gICAgR1RFU1RfU1VDQ0VFRCgpIDw8ICJNZW1vcnkgcmVwb3J0aW5nIGlzIGRpc2FibGVkLiI7CisgICAgU0JfRExPRyhJTkZPKSA8PCAiTWVtb3J5IHJlcG9ydGluZyBpcyBkaXNhYmxlZC4iOwogICAgIHJldHVybjsKICAgfQogICBFWFBFQ1RfRVFfTk9fVFJBQ0tJTkcoMCwgbWVtX3JlcG9ydGVyKCktPm51bWJlcl9hbGxvY3MoKSk7CkBAIC0zMDUsNyArMzA1LDcgQEAKIC8vIGRlYWxsb2NhdGlvbiBhbmQgYW4gYWxsb2NhdGlvbiB0byB0aGUgbWVtb3J5IHRyYWNrZXIuCiBURVNUX0YoTWVtb3J5UmVwb3J0aW5nVGVzdCwgQ2FwdHVyZXNSZWFsbG9jKSB7CiAgIGlmICghTWVtb3J5UmVwb3J0aW5nRW5hYmxlZCgpKSB7Ci0gICAgR1RFU1RfU1VDQ0VFRCgpIDw8ICJNZW1vcnkgcmVwb3J0aW5nIGlzIGRpc2FibGVkLiI7CisgICAgU0JfRExPRyhJTkZPKSA8PCAiTWVtb3J5IHJlcG9ydGluZyBpcyBkaXNhYmxlZC4iOwogICAgIHJldHVybjsKICAgfQogICB2b2lkKiBwcmV2X21lbW9yeSA9IFNiTWVtb3J5QWxsb2NhdGUoNCk7CkBAIC0zMjQsNyArMzI0LDcgQEAKIC8vIHdpbGwgcmVwb3J0IG1lbW9yeSBhbGxvY2F0aW9ucy4KIFRFU1RfRihNZW1vcnlSZXBvcnRpbmdUZXN0LCBDYXB0dXJlc01lbU1hcFVubWFwKSB7CiAgIGlmICghTWVtb3J5UmVwb3J0aW5nRW5hYmxlZCgpKSB7Ci0gICAgR1RFU1RfU1VDQ0VFRCgpIDw8ICJNZW1vcnkgcmVwb3J0aW5nIGlzIGRpc2FibGVkLiI7CisgICAgU0JfRExPRyhJTkZPKSA8PCAiTWVtb3J5IHJlcG9ydGluZyBpcyBkaXNhYmxlZC4iOwogICAgIHJldHVybjsKICAgfQogICBjb25zdCBpbnQ2NF90IGtNZW1TaXplID0gNDA5NjsKQEAgLTM0NCw3ICszNDQsNyBAQAogLy8gbWVtb3J5IGFsbG9jYXRpb25zLgogVEVTVF9GKE1lbW9yeVJlcG9ydGluZ1Rlc3QsIENhcHR1cmVzT3BlcmF0b3JOZXdEZWxldGUpIHsKICAgaWYgKCFNZW1vcnlSZXBvcnRpbmdFbmFibGVkKCkpIHsKLSAgICBHVEVTVF9TVUNDRUVEKCkgPDwgIk1lbW9yeSByZXBvcnRpbmcgaXMgZGlzYWJsZWQuIjsKKyAgICBTQl9ETE9HKElORk8pIDw8ICJNZW1vcnkgcmVwb3J0aW5nIGlzIGRpc2FibGVkLiI7CiAgICAgcmV0dXJuOwogICB9CiAgIEVYUEVDVF9UUlVFX05PX1RSQUNLSU5HKG1lbV9yZXBvcnRlcigpLT5udW1iZXJfYWxsb2NzKCkgPT0gMCk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvbnBsYi5neXAgYi9zcmMvc3RhcmJvYXJkL25wbGIvbnBsYi5neXAKaW5kZXggZmQ1NzhmMC4uNDM1NzZjZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9ucGxiL25wbGIuZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvbnBsYi9ucGxiLmd5cApAQCAtMjQxLDYgKzI0MSwxMCBAQAogICAgICAgICAnd2luZG93X2Rlc3Ryb3lfdGVzdC5jYycsCiAgICAgICAgICd3aW5kb3dfZ2V0X3BsYXRmb3JtX2hhbmRsZV90ZXN0LmNjJywKICAgICAgICAgJ3dpbmRvd19nZXRfc2l6ZV90ZXN0LmNjJywKKyAgICAgICAgIyBJbmNsdWRlIHByaXZhdGUgYyBoZWFkZXJzLCBpZiBwcmVzZW50LgorICAgICAgICAnPCFAKHB5dGhvbiAiPChERVBUSCkvc3RhcmJvYXJkL3Rvb2xzL2ZpbmRfcHJpdmF0ZV9maWxlcy5weSIgIjwoREVQVEgpIiAibnBsYi9pbmNsdWRlX2FsbF9wcml2YXRlLmMiKScsCisgICAgICAgICMgSW5jbHVkZSBwcml2YXRlIHRlc3RzLCBpZiBwcmVzZW50LgorICAgICAgICAnPCFAKHB5dGhvbiAiPChERVBUSCkvc3RhcmJvYXJkL3Rvb2xzL2ZpbmRfcHJpdmF0ZV9maWxlcy5weSIgIjwoREVQVEgpIiAibnBsYi8qX3Rlc3QuY2MiKScsCiAgICAgICBdLAogICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKICAgICAgICAgJzwoREVQVEgpL3Rlc3RpbmcvZ21vY2suZ3lwOmdtb2NrJywKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRlX3Rlc3QuY2MgYi9zcmMvc3RhcmJvYXJkL25wbGIvcGxheWVyX2NyZWF0ZV90ZXN0LmNjCmluZGV4IGU0NjNiOTAuLmY0MjQ3YzEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvbnBsYi9wbGF5ZXJfY3JlYXRlX3Rlc3QuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9jcmVhdGVfdGVzdC5jYwpAQCAtMTIsOCArMTIsOCBAQAogLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAogLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCiAKKyNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKLQogI2luY2x1ZGUgInN0YXJib2FyZC93aW5kb3cuaCIKICNpbmNsdWRlICJ0ZXN0aW5nL2d0ZXN0L2luY2x1ZGUvZ3Rlc3QvZ3Rlc3QuaCIKIApAQCAtMjIsNiArMjIsMTcgQEAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewogbmFtZXNwYWNlIG5wbGIgewogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMworU2JEZWNvZGVUYXJnZXQgU2JEZWNvZGVUYXJnZXRBY3F1aXJlU3R1Yih2b2lkKiAvKmNvbnRleHQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRGb3JtYXQgLypmb3JtYXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qd2lkdGgqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaGVpZ2h0Ki8pIHsKKyAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7Cit9Cit2b2lkIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZVN0dWIodm9pZCogLypjb250ZXh0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXQgLypkZWNvZGVfdGFyZ2V0Ki8pIHt9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKKwogVEVTVChTYlBsYXllclRlc3QsIFN1bm55RGF5KSB7CiAgIFNiV2luZG93T3B0aW9ucyB3aW5kb3dfb3B0aW9uczsKICAgU2JXaW5kb3dTZXREZWZhdWx0T3B0aW9ucygmd2luZG93X29wdGlvbnMpOwpAQCAtNDEsMTggKzUyLDU0IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdWRpb19oZWFkZXIubnVtYmVyX29mX2NoYW5uZWxzICoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1ZGlvX2hlYWRlci5iaXRzX3Blcl9zYW1wbGUgLyA4OwogCi0gIFNiUGxheWVyIHBsYXllciA9Ci0gICAgICBTYlBsYXllckNyZWF0ZSh3aW5kb3csIGtTYk1lZGlhVmlkZW9Db2RlY0gyNjQsIGtTYk1lZGlhQXVkaW9Db2RlY0FhYywKLSAgICAgICAgICAgICAgICAgICAgIFNCX1BMQVlFUl9OT19EVVJBVElPTiwga1NiRHJtU3lzdGVtSW52YWxpZCwgJmF1ZGlvX2hlYWRlciwKLSAgICAgICAgICAgICAgICAgICAgIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKLSNpZiBTQl9WRVJTSU9OKDMpCi0gICAgICAgICAgICAgICAgICAgICAsCi0gICAgICAgICAgICAgICAgICAgICBOVUxMCisgIFNiTWVkaWFWaWRlb0NvZGVjIGtWaWRlb0NvZGVjID0ga1NiTWVkaWFWaWRlb0NvZGVjSDI2NDsKKyAgU2JEcm1TeXN0ZW0ga0RybVN5c3RlbSA9IGtTYkRybVN5c3RlbUludmFsaWQ7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2Rlc1tdID0ge2tTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXR9OworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgU0JfQVJSQVlfU0laRV9JTlQob3V0cHV0X21vZGVzKTsgKytpKSB7CisgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlID0gb3V0cHV0X21vZGVzW2ldOworICAgIGlmICghU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkKG91dHB1dF9tb2RlLCBrVmlkZW9Db2RlYywga0RybVN5c3RlbSkpIHsKKyAgICAgIGNvbnRpbnVlOworICAgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSAzCisgICAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyOworICAgIGRlY29kZV90YXJnZXRfcHJvdmlkZXIuYWNxdWlyZSA9ICZTYkRlY29kZVRhcmdldEFjcXVpcmVTdHViOworICAgIGRlY29kZV90YXJnZXRfcHJvdmlkZXIucmVsZWFzZSA9ICZTYkRlY29kZVRhcmdldFJlbGVhc2VTdHViOworICAgIGRlY29kZV90YXJnZXRfcHJvdmlkZXIuY29udGV4dCA9IE5VTEw7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKKworICAgIFNiUGxheWVyIHBsYXllciA9CisgICAgICAgIFNiUGxheWVyQ3JlYXRlKHdpbmRvdywga1NiTWVkaWFWaWRlb0NvZGVjSDI2NCwga1NiTWVkaWFBdWRpb0NvZGVjQWFjLAorICAgICAgICAgICAgICAgICAgICAgICBTQl9QTEFZRVJfTk9fRFVSQVRJT04sIGtTYkRybVN5c3RlbUludmFsaWQsCisgICAgICAgICAgICAgICAgICAgICAgICZhdWRpb19oZWFkZXIsIE5VTEwsIE5VTEwsIE5VTEwsIE5VTEwKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbW9kZQogI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICApOyAgLy8gTk9MSU5UCi0gIEVYUEVDVF9UUlVFKFNiUGxheWVySXNWYWxpZChwbGF5ZXIpKTsKLSAgU2JQbGF5ZXJEZXN0cm95KHBsYXllcik7Ci0gIFNiV2luZG93RGVzdHJveSh3aW5kb3cpOworI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKKyAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAmZGVjb2RlX3RhcmdldF9wcm92aWRlcgorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICk7ICAvLyBOT0xJTlQKKyAgICBFWFBFQ1RfVFJVRShTYlBsYXllcklzVmFsaWQocGxheWVyKSk7CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgICBpZiAob3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSkgeworICAgICAgU2JEZWNvZGVUYXJnZXQgY3VycmVudF9mcmFtZSA9IFNiUGxheWVyR2V0Q3VycmVudEZyYW1lKHBsYXllcik7CisgICAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworICAgIFNiUGxheWVyRGVzdHJveShwbGF5ZXIpOworICAgIFNiV2luZG93RGVzdHJveSh3aW5kb3cpOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBucGxiCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL25wbGIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZF90ZXN0LmNjIGIvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWRfdGVzdC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MzM2MjA0Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9ucGxiL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWRfdGVzdC5jYwpAQCAtMCwwICsxLDQ4IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgorI2luY2x1ZGUgInRlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC5oIgorCisjaWYgU0JfSEFTKFBMQVlFUikgJiYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIG5wbGIgeworCitURVNUKFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZFRlc3QsIFN1bm55RGF5KSB7CisgIC8vIFdlIHNob3VsZCBzdXBwb3J0IGVpdGhlciBkZWNvZGUtdG8tdGV4dHVyZSBvciBwdW5jaC1vdXQgbW9kZS4KKyAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlID0ga1NiUGxheWVyT3V0cHV0TW9kZUludmFsaWQ7CisgIGlmIChTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWQoa1NiUGxheWVyT3V0cHV0TW9kZURlY29kZVRvVGV4dHVyZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9Db2RlYywga0RybVN5c3RlbSkpIHsKKyAgICBvdXRwdXRfbW9kZSA9IGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmU7CisgIH0gZWxzZSBpZiAoU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkKGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1ZpZGVvQ29kZWMsIGtEcm1TeXN0ZW0pKSB7CisgICAgb3V0cHV0X21vZGUgPSBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQ7CisgIH0KKyAgQVNTRVJUX05FKGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkLCBvdXRwdXRfbW9kZSk7Cit9CisKK1RFU1QoU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkVGVzdCwgUmFpbnlEYXlJbnZhbGlkKSB7CisgIGJvb2wgcmVzdWx0ID0gU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkKGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrVmlkZW9Db2RlYywga0RybVN5c3RlbSk7CisgIEVYUEVDVF9GQUxTRShyZXN1bHQpOworfQorCit9ICAvLyBuYW1lc3BhY2UgbnBsYgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVIpICYmIFwKKyAgICAgICAgICAgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3BsYXllci5oIGIvc3JjL3N0YXJib2FyZC9wbGF5ZXIuaAppbmRleCBjYmQxZmYzLi42OTA3NGExIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3BsYXllci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvcGxheWVyLmgKQEAgLTc5LDYgKzc5LDI5IEBACiAgIGtTYlBsYXllclN0YXRlRXJyb3IsCiB9IFNiUGxheWVyU3RhdGU7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KK3R5cGVkZWYgZW51bSBTYlBsYXllck91dHB1dE1vZGUgeworICAvLyBSZXF1ZXN0cyBmb3IgU2JQbGF5ZXIgdG8gcHJvZHVjZSBhbiBPcGVuR0wgdGV4dHVyZSB0aGF0IHRoZSBjbGllbnQgbXVzdAorICAvLyBkcmF3IGV2ZXJ5IGZyYW1lIHdpdGggaXRzIGdyYXBoaWNzIHJlbmRlcmluZy4gSXQgbWF5IGJlIHRoYXQgd2UgZ2V0IGEKKyAgLy8gdGV4dHVyZSBoYW5kbGUsIGJ1dCBjYW5ub3QgcGVyZm9ybSBvcGVyYXRpb25zIGxpa2UgZ2xSZWFkUGl4ZWxzIG9uIGl0IGlmIGl0CisgIC8vIGlzIERSTS1wcm90ZWN0ZWQsIG9yIGl0IG1heSBub3Qgc3VwcG9ydCBEUk0tcHJvdGVjdGVkIGNvbnRlbnQgYXQgYWxsLiAgV2hlbgorICAvLyB0aGlzIG91dHB1dCBtb2RlIGlzIHByb3ZpZGVkIHRvIFNiQ3JlYXRlUGxheWVyKCksIHRoZSBhcHBsaWNhdGlvbiB3aWxsIGJlCisgIC8vIGFibGUgdG8gcHVsbCBmcmFtZXMgdmlhIGNhbGxzIHRvIFNiUGxheWVyR2V0Q3VycmVudEZyYW1lKCkuCisgIGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUsCisKKyAgLy8gUmVxdWVzdHMgZm9yIFNiUGxheWVyIHRvIHVzZSBhICJwdW5jaC1vdXQiIG91dHB1dCBtb2RlLCB3aGVyZSB2aWRlbyBpcworICAvLyByZW5kZXJlZCB0byB0aGUgZmFyIGJhY2tncm91bmQsIGFuZCB0aGUgZ3JhcGhpY3MgcGxhbmUgaXMgYXV0b21hdGljYWxseQorICAvLyBjb21wb3NpdGVkIG9uIHRvcCBvZiB0aGUgdmlkZW8gYnkgdGhlIHBsYXRmb3JtLiBUaGUgY2xpZW50IG11c3QgcHVuY2ggYW4KKyAgLy8gYWxwaGEgaG9sZSBvdXQgb2YgdGhlIGdyYXBoaWNzIHBsYW5lIGZvciB2aWRlbyB0byBzaG93IHRocm91Z2guICBJbiB0aGlzCisgIC8vIGNhc2UsIGNoYW5naW5nIHRoZSB2aWRlbyBib3VuZHMgbXVzdCBiZSB0aWdodGx5IHN5bmNocm9uaXplZCBiZXR3ZWVuIHRoZQorICAvLyBwbGF5ZXIgYW5kIHRoZSBncmFwaGljcyBwbGFuZS4KKyAga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0LAorCisgIC8vIEFuIGludmFsaWQgb3V0cHV0IG1vZGUuCisgIGtTYlBsYXllck91dHB1dE1vZGVJbnZhbGlkLAorfSBTYlBsYXllck91dHB1dE1vZGU7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCiAvLyBJbmZvcm1hdGlvbiBhYm91dCB0aGUgY3VycmVudCBtZWRpYSBwbGF5YmFjayBzdGF0ZS4KIHR5cGVkZWYgc3RydWN0IFNiUGxheWVySW5mbyB7CiAgIC8vIFRoZSBwb3NpdGlvbiBvZiB0aGUgcGxheWJhY2sgaGVhZCwgYXMgcHJlY2lzZWx5IGFzIHBvc3NpYmxlLCBpbiA5MEtIeiB0aWNrcwpAQCAtMTE0LDYgKzEzNywxNiBAQAogICAvLyBUaGUgbnVtYmVyIG9mIHZpZGVvIGZyYW1lcyB0aGF0IGZhaWxlZCB0byBiZSBkZWNvZGVkIHNpbmNlIHRoZSBjcmVhdGlvbiBvZgogICAvLyB0aGUgcGxheWVyLgogICBpbnQgY29ycnVwdGVkX3ZpZGVvX2ZyYW1lczsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIC8vIFRoZSByYXRlIG9mIHBsYXliYWNrLiAgVGhlIHZpZGVvIGlzIHBsYXllZCBiYWNrIGluIGEgc3BlZWQgdGhhdCBpcworICAvLyBwcm9wb3J0aW9uYWwgdG8gdGhpcy4gIEJ5IGRlZmF1bHQgaXQgaXMgMS4wIHdoaWNoIGluZGljYXRlcyB0aGF0IHRoZQorICAvLyBwbGF5YmFjayBpcyBhdCBub3JtYWwgc3BlZWQuICBXaGVuIGl0IGlzIGdyZWF0ZXIgdGhhbiBvbmUsIHRoZSB2aWRlbyBpcworICAvLyBwbGF5ZWQgaW4gYSBmYXN0ZXIgdGhhbiBub3JtYWwgc3BlZWQuICBXaGVuIGl0IGlzIGxlc3MgdGhhbiBvbmUsIHRoZSB2aWRlbworICAvLyBpcyBwbGF5ZWQgaW4gYSBzbG93ZXIgdGhhbiBub3JtYWwgc3BlZWQuICBOZWdhdGl2ZSBzcGVlZHMgYXJlIG5vdAorICAvLyBzdXBwb3J0ZWQuCisgIGRvdWJsZSBwbGF5YmFja19yYXRlOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogfSBTYlBsYXllckluZm87CiAKIC8vIEFuIG9wYXF1ZSBoYW5kbGUgdG8gYW4gaW1wbGVtZW50YXRpb24tcHJpdmF0ZSBzdHJ1Y3R1cmUgcmVwcmVzZW50aW5nIGEKQEAgLTIzNiwxMSArMjY5LDE4IEBACiAvLyB8Y29udGV4dHw6IFRoaXMgaXMgcGFzc2VkIHRvIGFsbCBjYWxsYmFja3MgYW5kIGlzIGdlbmVyYWxseSB1c2VkIHRvIHBvaW50CiAvLyAgIGF0IGEgY2xhc3Mgb3Igc3RydWN0IHRoYXQgY29udGFpbnMgc3RhdGUgYXNzb2NpYXRlZCB3aXRoIHRoZSBwbGF5ZXIuCiAvLworLy8gfG91dHB1dF9tb2RlfDogU2VsZWN0cyBob3cgdGhlIGRlY29kZWQgdmlkZW8gZnJhbWVzIHdpbGwgYmUgb3V0cHV0LiAgRm9yCisvLyAgIGV4YW1wbGUsIGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVjb2RlZCB2aWRlbworLy8gICBmcmFtZXMgd2lsbCBiZSBvdXRwdXQgdG8gYSBiYWNrZ3JvdW5kIHZpZGVvIGxheWVyIGJ5IHRoZSBwbGF0Zm9ybSwgYW5kCisvLyAgIGtTYlBsYXllck91dHB1dERlY29kZVRvVGV4dHVyZSBpbmRpY2F0ZXMgdGhhdCB0aGUgZGVjb2RlZCB2aWRlbyBmcmFtZXMKKy8vICAgc2hvdWxkIGJlIG1hZGUgYXZhaWxhYmxlIGZvciB0aGUgYXBwbGljYXRpb24gdG8gcHVsbCB2aWEgY2FsbHMgdG8KKy8vICAgU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUoKS4KKy8vCiAvLyB8cHJvdmlkZXJ8OiBPbmx5IHByZXNlbnQgaW4gU3RhcmJvYXJkIHZlcnNpb24gMyBhbmQgdXAuICBJZiBub3QgfE5VTEx8LAotLy8gICB0aGVuIHdoZW4gU0JfSEFTKFBMQVlFUl9QUk9EVUNJTkdfVEVYVFVSRSkgaXMgdHJ1ZSwgdGhlIHBsYXllciBNQVkgdXNlIHRoZQotLy8gICBwcm92aWRlciB0byBjcmVhdGUgU2JEZWNvZGVUYXJnZXRzLiBBIHByb3ZpZGVyIGNvdWxkIGFsc28gcG90ZW50aWFsbHkgYmUKLS8vICAgcmVxdWlyZWQgYnkgdGhlIHBsYXllciwgaW4gd2hpY2ggY2FzZSwgaWYgdGhlIHByb3ZpZGVyIGlzIG5vdCBnaXZlbiwgdGhlCi0vLyAgIHBsYXllciB3aWxsIGZhaWwgYnkgcmV0dXJuaW5nIGtTYlBsYXllckludmFsaWQuCisvLyAgIHRoZW4gd2hlbiBvdXRwdXRfbW9kZSA9PSBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLCB0aGUgcGxheWVyIE1BWQorLy8gICB1c2UgdGhlIHByb3ZpZGVyIHRvIGNyZWF0ZSBTYkRlY29kZVRhcmdldHMuIEEgcHJvdmlkZXIgY291bGQgYWxzbworLy8gICBwb3RlbnRpYWxseSBiZSByZXF1aXJlZCBieSB0aGUgcGxheWVyLCBpbiB3aGljaCBjYXNlLCBpZiB0aGUgcHJvdmlkZXIgaXMKKy8vICAgbm90IGdpdmVuLCB0aGUgcGxheWVyIHdpbGwgZmFpbCBieSByZXR1cm5pbmcga1NiUGxheWVySW52YWxpZC4KIFNCX0VYUE9SVCBTYlBsYXllciBTYlBsYXllckNyZWF0ZSgKICAgICBTYldpbmRvdyB3aW5kb3csCiAgICAgU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCkBAIC0yNTIsMTIgKzI5MiwyNSBAQAogICAgIFNiUGxheWVyRGVjb2RlclN0YXR1c0Z1bmMgZGVjb2Rlcl9zdGF0dXNfZnVuYywKICAgICBTYlBsYXllclN0YXR1c0Z1bmMgcGxheWVyX3N0YXR1c19mdW5jLAogICAgIHZvaWQqIGNvbnRleHQKLSNpZiBTQl9WRVJTSU9OKDMpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgLAorICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSAzCiAgICAgLAogICAgIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIHByb3ZpZGVyCi0jZW5kaWYgIC8vIFNCX1ZFUlNJT04oMykKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwogICAgICk7ICAvLyBOT0xJTlQKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBwbGF5ZXIgb3V0cHV0IG1vZGUgaXMgc3VwcG9ydGVkIGJ5IHRoZSBwbGF0Zm9ybS4KKy8vIElmIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0cnVlLCBpdCBpcyBva2F5IHRvIGNhbGwgU2JQbGF5ZXJDcmVhdGUoKSB3aXRoCisvLyB0aGUgZ2l2ZW4gfG91dHB1dF9tb2RlfC4KK1NCX0VYUE9SVCBib29sIFNiUGxheWVyT3V0cHV0TW9kZVN1cHBvcnRlZChTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIC8vIERlc3Ryb3lzIHxwbGF5ZXJ8LCBmcmVlaW5nIGFsbCBhc3NvY2lhdGVkIHJlc291cmNlcy4gRWFjaCBjYWxsYmFjayBtdXN0CiAvLyByZWNlaXZlIG9uZSBtb3JlIGNhbGxiYWNrIHRvIHNheSB0aGF0IHRoZSBwbGF5ZXIgd2FzIGRlc3Ryb3llZC4gQ2FsbGJhY2tzCiAvLyBtYXkgYmUgaW4tZmxpZ2h0IHdoZW4gU2JQbGF5ZXJEZXN0cm95IGlzIGNhbGxlZCwgYW5kIHNob3VsZCBiZSBpZ25vcmVkIG9uY2UKQEAgLTM0MCwxMCArMzkzLDEzIEBACiBTQl9FWFBPUlQgdm9pZCBTYlBsYXllcldyaXRlRW5kT2ZTdHJlYW0oU2JQbGF5ZXIgcGxheWVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFUeXBlIHN0cmVhbV90eXBlKTsKIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIC8vIFNldHMgdGhlIHBsYXllciBib3VuZHMgdG8gdGhlIGdpdmVuIGdyYXBoaWNzIHBsYW5lIGNvb3JkaW5hdGVzLiBUaGUgY2hhbmdlcwogLy8gZG8gbm90IHRha2UgZWZmZWN0IHVudGlsIHRoZSBuZXh0IGdyYXBoaWNzIGZyYW1lIGJ1ZmZlciBzd2FwLiBUaGUgZGVmYXVsdAotLy8gYm91bmRzIGZvciBhIHBsYXllciBpcyB0aGUgZnVsbCBzY3JlZW4uCisvLyBib3VuZHMgZm9yIGEgcGxheWVyIGlzIHRoZSBmdWxsIHNjcmVlbi4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSByZWxldmFudCB3aGVuCisvLyB0aGUgfHBsYXllcnwgaXMgY3JlYXRlZCB3aXRoIHRoZSBrU2JQbGF5ZXJPdXRwdXRNb2RlUHVuY2hPdXQgb3V0cHV0IG1vZGUsIGFuZAorLy8gaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UgdGhlbiB0aGlzIGZ1bmN0aW9uIGNhbGwgY2FuIGJlIGlnbm9yZWQuCiAvLwogLy8gVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgb24gZXZlcnkgZ3JhcGhpY3MgZnJhbWUgdGhhdCBjaGFuZ2VzIHRoZSB2aWRlbwogLy8gYm91bmRzLiBGb3IgZXhhbXBsZSwgaWYgdGhlIHZpZGVvIGJvdW5kcyBhcmUgYmVpbmcgYW5pbWF0ZWQsIHRoZW4gdGhpcyB3aWxsCkBAIC0zNjEsMTMgKzQxNywzMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KTsKLSNlbmRpZgorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgICAgICAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCiAKIC8vIFBhdXNlcyBvciB1bnBhdXNlcyB0aGUgfHBsYXllcnwuIElmIHRoZSB8cGxheWVyfCdzIHN0YXRlIGlzCiAvLyB8a1BsYXllclN0YXRlUHJlcm9sbGluZ3wsIHRoaXMgZnVuY3Rpb24gc2V0cyB0aGUgaW5pdGlhbCBwYXVzZSBzdGF0ZSBmb3IKIC8vIHRoZSBjdXJyZW50IHNlZWsgdGFyZ2V0LgogU0JfRVhQT1JUIHZvaWQgU2JQbGF5ZXJTZXRQYXVzZShTYlBsYXllciBwbGF5ZXIsIGJvb2wgcGF1c2UpOwogCisjZWxzZSAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorCisvLyBTZXQgdGhlIHBsYXliYWNrIHJhdGUgb2YgdGhlIHxwbGF5ZXJ8LiAgfHJhdGV8IGlzIGRlZmF1bHQgdG8gMS4wIHdoaWNoCisvLyBpbmRpY2F0ZXMgdGhlIHBsYXliYWNrIGlzIGF0IGl0cyBvcmlnaW5hbCBzcGVlZC4gIEEgfHJhdGV8IGdyZWF0ZXIgdGhhbiBvbmUKKy8vIHdpbGwgbWFrZSB0aGUgcGxheWJhY2sgZmFzdGVyIHRoYW4gaXRzIG9yaWdpbmFsIHNwZWVkLiAgRm9yIGV4YW1wbGUsIHdoZW4KKy8vIHxyYXRlfCBpcyAyLCB0aGUgdmlkZW8gd2lsbCBiZSBwbGF5ZWQgYXQgdHdpY2UgdGhlIHNwZWVkIGFzIGl0cyBvcmlnaW5hbAorLy8gc3BlZWQuICBBIHxyYXRlfCBsZXNzIHRoYW4gMS4wIHdpbGwgbWFrZSB0aGUgcGxheWJhY2sgc2xvd2VyIHRoYW4gaXRzCisvLyBvcmlnaW5hbCBzcGVlZC4gIFdoZW4gfHJhdGV8IGlzIDAsIHRoZSBwbGF5YmFjayB3aWxsIGJlIHBhdXNlZC4KKy8vIFRoZSBmdW5jdGlvbiByZXR1cm5zIHRydWUgd2hlbiB0aGUgcGxheWJhY2sgcmF0ZSBpcyBzZXQgdG8gfHBsYXliYWNrX3JhdGV8IG9yCisvLyB0byBhIHJhdGUgdGhhdCBpcyBjbG9zZSB0byB8cGxheWJhY2tfcmF0ZXwgd2hpY2ggdGhlIGltcGxlbWVudGF0aW9uIHN1cHBvcnRzLgorLy8gSXQgcmV0dXJucyBmYWxzZSB3aGVuIHRoZSBwbGF5YmFjayByYXRlIGlzIHVuY2hhbmdlZCwgdGhpcyBjYW4gaGFwcGVuIHdoZW4KKy8vIHxwbGF5YmFja19yYXRlfCBpcyBuZWdhdGl2ZSBvciBpZiBpdCBpcyB0b28gaGlnaCB0byBzdXBwb3J0LgorU0JfRVhQT1JUIGJvb2wgU2JQbGF5ZXJTZXRQbGF5YmFja1JhdGUoU2JQbGF5ZXIgcGxheWVyLCBkb3VibGUgcGxheWJhY2tfcmF0ZSk7CisKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorCiAvLyBTZXRzIHRoZSBwbGF5ZXIncyB2b2x1bWUuCiAvLwogLy8gfHBsYXllcnw6IFRoZSBwbGF5ZXIgaW4gd2hpY2ggdGhlIHZvbHVtZSBpcyBiZWluZyBhZGp1c3RlZC4KQEAgLTM4NCw2ICs0NTksNyBAQAogLy8gfG91dF9wbGF5ZXJfaW5mb3w6IFRoZSBpbmZvcm1hdGlvbiByZXRyaWV2ZWQgZm9yIHRoZSBwbGF5ZXIuCiBTQl9FWFBPUlQgdm9pZCBTYlBsYXllckdldEluZm8oU2JQbGF5ZXIgcGxheWVyLCBTYlBsYXllckluZm8qIG91dF9wbGF5ZXJfaW5mbyk7CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogI2lmIFNCX0lTKFBMQVlFUl9DT01QT1NJVEVEKQogLy8gR2V0cyBhIGhhbmRsZSB0aGF0IHJlcHJlc2VudHMgdGhlIHBsYXllcidzIHZpZGVvIG91dHB1dCwgZm9yIHRoZSBwdXJwb3NlIG9mCiAvLyBjb21wb3Npbmcgd2l0aCB8U2JDb21wb3NpdG9yfCwgd2hpY2ggaXMgY3VycmVudGx5IHVuZGVmaW5lZC4KQEAgLTM5MSw4ICs0NjcsMTAgQEAKIC8vIHxwbGF5ZXJ8OiBUaGUgcGxheWVyIGZvciB3aGljaCB0aGUgdmlkZW8gb3V0cHV0IGhhbmRsZSBpcyByZXRyaWV2ZWQuCiBTQl9FWFBPUlQgU2JQbGF5ZXJDb21wb3NpdGlvbkhhbmRsZQogU2JQbGF5ZXJHZXRDb21wb3NpdGlvbkhhbmRsZShTYlBsYXllciBwbGF5ZXIpOwotI2VuZGlmCisjZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9DT01QT1NJVEVEKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICNpZiBTQl9JUyhQTEFZRVJfUFJPRFVDSU5HX1RFWFRVUkUpCiAvLyBHZXRzIGFuIE9wZW5HTCB0ZXh0dXJlIElEIHRoYXQgcG9pbnRzIHRvIHRoZSBwbGF5ZXIncyB2aWRlbyBvdXRwdXQgZnJhbWUgYXQKIC8vIHRoZSB0aW1lIGl0IHdhcyBjYWxsZWQuIFRoaXMgZnVuY3Rpb24gY2FuIGJlIGNhbGxlZCBvbmNlLCBhbmQgdGhlIHRleHR1cmUgSUQKQEAgLTQwMCw3ICs0NzgsMTkgQEAKIC8vCiAvLyB8cGxheWVyfDogVGhlIHBsYXllciBmb3Igd2hpY2ggdGhlIHRleHR1cmUgSUQgaXMgcmV0cmlldmVkLgogU0JfRVhQT1JUIHVpbnQzMl90IFNiUGxheWVyR2V0VGV4dHVyZUlkKFNiUGxheWVyIHBsYXllcik7Ci0jZW5kaWYKKyNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BST0RVQ0lOR19URVhUVVJFKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisvLyBHaXZlbiBhIHBsYXllciBjcmVhdGVkIHdpdGggdGhlIGtTYlBsYXllck91dHB1dE1vZGVEZWNvZGVUb1RleHR1cmUKKy8vIG91dHB1dCBtb2RlLCBpdCB3aWxsIHJldHVybiBhIFNiRGVjb2RlVGFyZ2V0IHJlcHJlc2VudGluZyB0aGUgY3VycmVudCBmcmFtZQorLy8gdG8gYmUgcmFzdGVyaXplZC4gIE9uIEdMRVMgc3lzdGVtcywgdGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCBvbiBhCisvLyB0aHJlYWQgd2l0aCBhbiBFR0xDb250ZXh0IGN1cnJlbnQsIGFuZCBzcGVjaWZpY2FsbHkgdGhlIEVHTENvbnRleHQgdGhhdCB3aWxsCisvLyBiZSB1c2VkIHRvIGV2ZW50dWFsbHkgcmVuZGVyIHRoZSBmcmFtZS4gIElmIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdpdGggYQorLy8gfHBsYXllcnwgb2JqZWN0IHRoYXQgd2FzIGNyZWF0ZWQgd2l0aCBhbiBvdXRwdXQgbW9kZSBvdGhlciB0aGFuCisvLyBrU2JQbGF5ZXJPdXRwdXRNb2RlRGVjb2RlVG9UZXh0dXJlLCBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkIGlzIHJldHVybmVkLgorU0JfRVhQT1JUIFNiRGVjb2RlVGFyZ2V0IFNiUGxheWVyR2V0Q3VycmVudEZyYW1lKFNiUGxheWVyIHBsYXllcik7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogCiAjaWZkZWYgX19jcGx1c3BsdXMKIH0gIC8vIGV4dGVybiAiQyIKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmggYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IDcxZWMwYzIuLjM5YmIxYzcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL2NvbmZpZ3VyYXRpb25fcHVibGljLmgKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvY29uZmlndXJhdGlvbl9wdWJsaWMuaApAQCAtMjYwLDYgKzI2MCw3IEBACiAvLyBzdXBwb3J0ZWQgY29tcG9zaXRpb24gbWV0aG9kcyBiZWxvdy4KICNkZWZpbmUgU0JfSEFTX1BMQVlFUiAxCiAKKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSdzIHBsYXllciB3aWxsIHByb2R1Y2UgYW4gT3BlbkdMIHRleHR1cmUgdGhhdAogLy8gdGhlIGNsaWVudCBtdXN0IGRyYXcgZXZlcnkgZnJhbWUgd2l0aCBpdHMgZ3JhcGhpY3MgcmVuZGVyaW5nLiBJdCBtYXkgYmUgdGhhdAogLy8gd2UgZ2V0IGEgdGV4dHVyZSBoYW5kbGUsIGJ1dCBjYW5ub3QgcGVyZm9ybSBvcGVyYXRpb25zIGxpa2UgR2xSZWFkUGl4ZWxzIG9uCkBAIC0yNzgsNiArMjc5LDcgQEAKIC8vIHRoaXMgY2FzZSwgY2hhbmdpbmcgdGhlIHZpZGVvIGJvdW5kcyBtdXN0IGJlIHRpZ2h0bHkgc3luY2hyb25pemVkIGJldHdlZW4gdGhlCiAvLyBwbGF5ZXIgYW5kIHRoZSBncmFwaGljcyBwbGFuZS4KICNkZWZpbmUgU0JfSVNfUExBWUVSX1BVTkNIRURfT1VUIDEKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KIAogLy8gU3BlY2lmaWVzIHRoZSBtYXhpbXVtIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSBhdWRpbyBidWZmZXJzIG9mIG1lZGlhIHNvdXJjZQogLy8gYmVmb3JlIHRyaWdnZXJpbmcgYSBnYXJiYWdlIGNvbGxlY3Rpb24uICBBIGxhcmdlIHZhbHVlIHdpbGwgY2F1c2UgbW9yZSBtZW1vcnkKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfY3JlYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9jcmVhdGUuY2MKaW5kZXggOGJmZGQ3Yi4uNzZjMzRmMyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9jcmVhdGUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9jcmVhdGUuY2MKQEAgLTE1LDM3ICsxNSw1NSBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCiAKICNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KIAogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2dsZXMvZ2xfY2FsbC5oIgogCiBTYkRlY29kZVRhcmdldCBTYkRlY29kZVRhcmdldENyZWF0ZShFR0xEaXNwbGF5IGRpc3BsYXksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFR0xDb250ZXh0IGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEZvcm1hdCBmb3JtYXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgd2lkdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50KiBwbGFuZXMpIHsKLSAgaWYgKGZvcm1hdCA9PSBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBKSB7Ci0gICAgU2JEZWNvZGVUYXJnZXRQcml2YXRlKiB0YXJnZXQgPSBuZXcgU2JEZWNvZGVUYXJnZXRQcml2YXRlOwotICAgIHRhcmdldC0+ZGlzcGxheSA9IGRpc3BsYXk7Ci0gICAgdGFyZ2V0LT5mb3JtYXQgPSBmb3JtYXQ7Ci0gICAgdGFyZ2V0LT53aWR0aCA9IHdpZHRoOwotICAgIHRhcmdldC0+aGVpZ2h0ID0gaGVpZ2h0OwotICAgIHRhcmdldC0+bnVtX3BsYW5lcyA9IDE7Ci0gICAgdGFyZ2V0LT5wbGFuZXNbMF0gPSBwbGFuZXNbMF07Ci0gICAgdGFyZ2V0LT5pbWFnZXNbMF0gPQotICAgICAgICBlZ2xDcmVhdGVJbWFnZUtIUihkaXNwbGF5LCBjb250ZXh0LCBFR0xfR0xfVEVYVFVSRV8yRF9LSFIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIChFR0xDbGllbnRCdWZmZXIpdGFyZ2V0LT5wbGFuZXNbMF0sIE5VTEwpOwotICAgIFNCX0RDSEVDSyhlZ2xHZXRFcnJvcigpID09IEVHTF9TVUNDRVNTKTsKLSAgICBTQl9EQ0hFQ0sodGFyZ2V0LT5pbWFnZXNbMF0gIT0gRUdMX05PX0lNQUdFX0tIUik7Ci0KLSAgICAvLyBEYXRhIHRvIGJlIHNldCBieSB0aGUgZGVjb2Rlci4KLSAgICB0YXJnZXQtPmlzX29wYXF1ZSA9IGZhbHNlOwotCi0gICAgcmV0dXJuIHRhcmdldDsKLSAgfSBlbHNlIHsKLSAgICBTQl9OT1RSRUFDSEVEKCkgPDwgIlVuc3VwcG9ydGVkIGZvcm1hdCAiIDw8IGZvcm1hdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKKyAgU0JfRENIRUNLKGZvcm1hdCA9PSBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBKTsKKyAgaWYgKGZvcm1hdCAhPSBrU2JEZWNvZGVUYXJnZXRGb3JtYXQxUGxhbmVSR0JBKSB7CiAgICAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7CiAgIH0KKworICBHTHVpbnQgdGV4dHVyZTsKKyAgR0xfQ0FMTChnbEdlblRleHR1cmVzKDEsICZ0ZXh0dXJlKSk7CisgIEdMX0NBTEwoZ2xCaW5kVGV4dHVyZShHTF9URVhUVVJFXzJELCB0ZXh0dXJlKSk7CisgIEdMX0NBTEwoZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUFHX0ZJTFRFUiwgR0xfTElORUFSKSk7CisgIEdMX0NBTEwoZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfTUlOX0ZJTFRFUiwgR0xfTElORUFSKSk7CisgIEdMX0NBTEwoZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9TLCBHTF9DTEFNUF9UT19FREdFKSk7CisgIEdMX0NBTEwoZ2xUZXhQYXJhbWV0ZXJpKEdMX1RFWFRVUkVfMkQsIEdMX1RFWFRVUkVfV1JBUF9ULCBHTF9DTEFNUF9UT19FREdFKSk7CisKKyAgR0xfQ0FMTChnbFRleEltYWdlMkQoR0xfVEVYVFVSRV8yRCwgMCwgR0xfUkdCQSwgd2lkdGgsIGhlaWdodCwgMCwgR0xfUkdCQSwKKyAgICAgICAgICAgICAgICAgICAgICAgR0xfVU5TSUdORURfQllURSwgTlVMTCkpOworCisgIFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZSogdGFyZ2V0ID0gbmV3IFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZTsKKyAgdGFyZ2V0LT5kaXNwbGF5ID0gZGlzcGxheTsKKyAgdGFyZ2V0LT5pbmZvLmZvcm1hdCA9IGZvcm1hdDsKKyAgLy8gRGF0YSB0byBiZSBzZXQgYnkgdGhlIGRlY29kZXIuCisgIHRhcmdldC0+aW5mby5pc19vcGFxdWUgPSBmYWxzZTsKKyAgdGFyZ2V0LT5pbmZvLndpZHRoID0gd2lkdGg7CisgIHRhcmdldC0+aW5mby5oZWlnaHQgPSBoZWlnaHQ7CisgIHRhcmdldC0+aW5mby5wbGFuZXNbMF0udGV4dHVyZSA9IHRleHR1cmU7CisgIHRhcmdldC0+aW5mby5wbGFuZXNbMF0uZ2xfdGV4dHVyZV90YXJnZXQgPSBHTF9URVhUVVJFXzJEOworICB0YXJnZXQtPmluZm8ucGxhbmVzWzBdLndpZHRoID0gd2lkdGg7CisgIHRhcmdldC0+aW5mby5wbGFuZXNbMF0uaGVpZ2h0ID0gaGVpZ2h0OworICB0YXJnZXQtPmluZm8ucGxhbmVzWzBdLmNvbnRlbnRfcmVnaW9uLmxlZnQgPSAwOworICB0YXJnZXQtPmluZm8ucGxhbmVzWzBdLmNvbnRlbnRfcmVnaW9uLnRvcCA9IDA7CisgIHRhcmdldC0+aW5mby5wbGFuZXNbMF0uY29udGVudF9yZWdpb24ucmlnaHQgPSB3aWR0aDsKKyAgdGFyZ2V0LT5pbmZvLnBsYW5lc1swXS5jb250ZW50X3JlZ2lvbi5ib3R0b20gPSBoZWlnaHQ7CisKKyAgdGFyZ2V0LT5pbWFnZXNbMF0gPQorICAgICAgZWdsQ3JlYXRlSW1hZ2VLSFIoZGlzcGxheSwgY29udGV4dCwgRUdMX0dMX1RFWFRVUkVfMkRfS0hSLAorICAgICAgICAgICAgICAgICAgICAgICAgKEVHTENsaWVudEJ1ZmZlcil0YXJnZXQtPmluZm8ucGxhbmVzWzBdLnRleHR1cmUsIE5VTEwpOworICBTQl9EQ0hFQ0soZWdsR2V0RXJyb3IoKSA9PSBFR0xfU1VDQ0VTUyk7CisgIFNCX0RDSEVDSyh0YXJnZXQtPmltYWdlc1swXSAhPSBFR0xfTk9fSU1BR0VfS0hSKTsKKworICBHTF9DQUxMKGdsQmluZFRleHR1cmUoR0xfVEVYVFVSRV8yRCwgMCkpOworCisgIHJldHVybiB0YXJnZXQ7CiB9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2Rlc3Ryb3kuY2MgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2Rlc3Ryb3kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxNGJlMzkuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9kZXN0cm95LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCi0KLSNpbmNsdWRlIDxHTEVTMi9nbDIuaD4KLSNpbmNsdWRlIDxHTEVTMi9nbDJleHQuaD4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKLQotdm9pZCBTYkRlY29kZVRhcmdldERlc3Ryb3koU2JEZWNvZGVUYXJnZXQgdGFyZ2V0KSB7Ci0gIGlmIChTYkRlY29kZVRhcmdldElzVmFsaWQodGFyZ2V0KSkgewotICAgIGZvciAoaW50IHBsYW5lID0gMDsgcGxhbmUgPCB0YXJnZXQtPm51bV9wbGFuZXM7ICsrcGxhbmUpIHsKLSAgICAgIGlmICh0YXJnZXQtPmltYWdlc1twbGFuZV0gIT0gRUdMX05PX0lNQUdFX0tIUikgewotICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIodGFyZ2V0LT5kaXNwbGF5LCB0YXJnZXQtPmltYWdlc1twbGFuZV0pOwotICAgICAgICBTQl9EQ0hFQ0soZWdsR2V0RXJyb3IoKSA9PSBFR0xfU1VDQ0VTUyk7Ci0gICAgICB9Ci0gICAgfQotICAgIGRlbGV0ZSB0YXJnZXQ7Ci0gIH0gZWxzZSB7Ci0gICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIHRhcmdldCI7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfZ2V0X2Zvcm1hdC5jYyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfZ2V0X2Zvcm1hdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzJjYjU1NS4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9mb3JtYXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKLQotU2JEZWNvZGVUYXJnZXRGb3JtYXQgU2JEZWNvZGVUYXJnZXRHZXRGb3JtYXQoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgewotICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXQpKSB7Ci0gICAgcmV0dXJuIGRlY29kZV90YXJnZXQtPmZvcm1hdDsKLSAgfSBlbHNlIHsKLSAgICBTQl9OT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgdGFyZ2V0IjsKLSAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0SW52YWxpZDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9nZXRfaW5mby5jYyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfZ2V0X2luZm8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWU4YTg2MQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfZ2V0X2luZm8uY2MKQEAgLTAsMCArMSwzMCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKKworYm9vbCBTYkRlY29kZVRhcmdldEdldEluZm8oU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0SW5mbyogb3V0X2luZm8pIHsKKyAgaWYgKCFTYk1lbW9yeUlzWmVybyhvdXRfaW5mbywgc2l6ZW9mKCpvdXRfaW5mbykpKSB7CisgICAgU0JfRENIRUNLKGZhbHNlKSA8PCAib3V0X2luZm8gbXVzdCBiZSB6ZXJvZWQgb3V0LiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgU2JNZW1vcnlDb3B5KG91dF9pbmZvLCAmZGVjb2RlX3RhcmdldC0+aW5mbywgc2l6ZW9mKCpvdXRfaW5mbykpOworCisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9nZXRfcGxhbmUuY2MgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9wbGFuZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI5NzQwZC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9wbGFuZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLwotLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0vLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCi0vLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLS8vCi0vLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0vLwotLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLS8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgotLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgotI2luY2x1ZGUgInN0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oIgotCi1HTHVpbnQgU2JEZWNvZGVUYXJnZXRHZXRQbGFuZShTYkRlY29kZVRhcmdldCBkZWNvZGVfdGFyZ2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRQbGFuZSBwbGFuZSkgewotICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXQpICYmCi0gICAgICBwbGFuZSA8IGRlY29kZV90YXJnZXQtPm51bV9wbGFuZXMpIHsKLSAgICByZXR1cm4gZGVjb2RlX3RhcmdldC0+cGxhbmVzW3BsYW5lXTsKLSAgfSBlbHNlIHsKLSAgICBTQl9OT1RSRUFDSEVEKCkgPDwgIkludmFsaWQgcGFyYW1ldGVyczogdGFyZ2V0ID0gIiA8PCBkZWNvZGVfdGFyZ2V0Ci0gICAgICAgICAgICAgICAgICAgIDw8ICIgcGxhbmUgPSAiIDw8IHBsYW5lOwotICAgIHJldHVybiAwOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9zaXplLmNjIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9nZXRfc2l6ZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwM2EyMC4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9zaXplLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vCi0vLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLS8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLS8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAotLy8KLS8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLS8vCi0vLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCi0vLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0vLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCi0vLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCi0KLSNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCi0jaW5jbHVkZSAic3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmgiCi0KLXZvaWQgU2JEZWNvZGVUYXJnZXRHZXRTaXplKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIG91dF93aWR0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0X2hlaWdodCkgewotICBpZiAoU2JEZWNvZGVUYXJnZXRJc1ZhbGlkKGRlY29kZV90YXJnZXQpKSB7Ci0gICAgKm91dF93aWR0aCA9IGRlY29kZV90YXJnZXQtPndpZHRoOwotICAgICpvdXRfaGVpZ2h0ID0gZGVjb2RlX3RhcmdldC0+aGVpZ2h0OwotICB9IGVsc2UgewotICAgIFNCX05PVFJFQUNIRUQoKSA8PCAiSW52YWxpZCB0YXJnZXQiOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2ludGVybmFsLmgKaW5kZXggMzQyYzJhZC4uOGE5M2NkMSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaApAQCAtMjMsMTMgKzIzLDkgQEAKIAogc3RydWN0IFNiRGVjb2RlVGFyZ2V0UHJpdmF0ZSB7CiAgIEVHTERpc3BsYXkgZGlzcGxheTsKLSAgU2JEZWNvZGVUYXJnZXRGb3JtYXQgZm9ybWF0OwotICBpbnQgd2lkdGg7Ci0gIGludCBoZWlnaHQ7Ci0gIGludCBudW1fcGxhbmVzOwotICBHTHVpbnQgcGxhbmVzWzFdOwogICBFR0xJbWFnZUtIUiBpbWFnZXNbMV07Ci0gIGJvb2wgaXNfb3BhcXVlOworCisgIFNiRGVjb2RlVGFyZ2V0SW5mbyBpbmZvOwogfTsKIAogI2VuZGlmICAvLyBTVEFSQk9BUkRfUkFTUElfU0hBUkVEX09QRU5fTUFYX0RFQ09ERV9UQVJHRVRfSU5URVJOQUxfSF8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfaXNfb3BhcXVlLmNjIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9pc19vcGFxdWUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDllMWJjYTQuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9pc19vcGFxdWUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKLQotI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKLSNpbmNsdWRlICJzdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfaW50ZXJuYWwuaCIKLQotYm9vbCBTYkRlY29kZVRhcmdldElzT3BhcXVlKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQpIHsKLSAgaWYgKFNiRGVjb2RlVGFyZ2V0SXNWYWxpZChkZWNvZGVfdGFyZ2V0KSkgewotICAgIHJldHVybiBkZWNvZGVfdGFyZ2V0LT5pc19vcGFxdWU7Ci0gIH0gZWxzZSB7Ci0gICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIHRhcmdldCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X3JlbGVhc2UuY2MgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X3JlbGVhc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjljZGZjNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfcmVsZWFzZS5jYwpAQCAtMCwwICsxLDQzIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKKworI2luY2x1ZGUgPEdMRVMyL2dsMi5oPgorI2luY2x1ZGUgPEdMRVMyL2dsMmV4dC5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2xvZy5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oIgorCit2b2lkIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZShTYkRlY29kZVRhcmdldCB0YXJnZXQpIHsKKyAgaWYgKFNiRGVjb2RlVGFyZ2V0SXNWYWxpZCh0YXJnZXQpKSB7CisgICAgU0JfRENIRUNLKHRhcmdldC0+aW5mby5mb3JtYXQgPT0ga1NiRGVjb2RlVGFyZ2V0Rm9ybWF0MVBsYW5lUkdCQSk7CisgICAgLy8gVGhpcyBtYXkgbmVlZCB0byBjaGFuZ2UgaWYgd2Ugc3VwcG9ydCBtb3JlIHRoYW4ganVzdAorICAgIC8vIGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEuCisgICAgY29uc3QgaW50IGtOdW1QbGFuZXMgPSAxOworCisgICAgZm9yIChpbnQgcGxhbmUgPSAwOyBwbGFuZSA8IGtOdW1QbGFuZXM7ICsrcGxhbmUpIHsKKyAgICAgIGlmICh0YXJnZXQtPmltYWdlc1twbGFuZV0gIT0gRUdMX05PX0lNQUdFX0tIUikgeworICAgICAgICBlZ2xEZXN0cm95SW1hZ2VLSFIodGFyZ2V0LT5kaXNwbGF5LCB0YXJnZXQtPmltYWdlc1twbGFuZV0pOworICAgICAgICBTQl9EQ0hFQ0soZWdsR2V0RXJyb3IoKSA9PSBFR0xfU1VDQ0VTUyk7CisKKyAgICAgICAgZ2xEZWxldGVUZXh0dXJlcygxLCAmdGFyZ2V0LT5pbmZvLnBsYW5lc1swXS50ZXh0dXJlKTsKKyAgICAgICAgU0JfRENIRUNLKGdsR2V0RXJyb3IoKSA9PSBHTF9OT19FUlJPUik7CisgICAgICB9CisgICAgfQorICAgIGRlbGV0ZSB0YXJnZXQ7CisgIH0gZWxzZSB7CisgICAgU0JfTk9UUkVBQ0hFRCgpIDw8ICJJbnZhbGlkIHRhcmdldCI7CisgIH0KK30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L29wZW5fbWF4X2ltYWdlX2RlY29kZV9jb21wb25lbnQuY2MgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9vcGVuX21heF9pbWFnZV9kZWNvZGVfY29tcG9uZW50LmNjCmluZGV4IDE5ZTE3MTIuLmYyZGZlNDQgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L29wZW5fbWF4X2ltYWdlX2RlY29kZV9jb21wb25lbnQuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvb3Blbl9tYXhfaW1hZ2VfZGVjb2RlX2NvbXBvbmVudC5jYwpAQCAtMTE5LDcgKzExOSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoZWlnaHQpIHsKICAgdGFyZ2V0XyA9IFNiRGVjb2RlVGFyZ2V0QWNxdWlyZUZyb21Qcm92aWRlcigKICAgICAgIHRhcmdldF9wcm92aWRlcl8sIGtTYkRlY29kZVRhcmdldEZvcm1hdDFQbGFuZVJHQkEsIHdpZHRoLCBoZWlnaHQpOwotICB0YXJnZXRfLT5pc19vcGFxdWUgPSAoaW5wdXRfZm9ybWF0XyA9PSBPTVhfSU1BR0VfQ29kaW5nUE5HKSA/IGZhbHNlIDogdHJ1ZTsKKyAgdGFyZ2V0Xy0+aW5mby5pc19vcGFxdWUgPQorICAgICAgKGlucHV0X2Zvcm1hdF8gPT0gT01YX0lNQUdFX0NvZGluZ1BORykgPyBmYWxzZSA6IHRydWU7CiAgIHJlbmRlcl9jb21wb25lbnRfLlNldE91dHB1dEltYWdlKHRhcmdldF8tPmltYWdlc1swXSk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L3ZpZGVvX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC92aWRlb19kZWNvZGVyLmNjCmluZGV4IDlkM2U2YjIuLmM1YzdmODggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L3ZpZGVvX2RlY29kZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvdmlkZW9fZGVjb2Rlci5jYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC92aWRlb19kZWNvZGVyLmgiCiAKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3RpbWUuaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC0yNCwxNiArMjUsMjMgQEAKIG5hbWVzcGFjZSB7CiAKIGNvbnN0IHNpemVfdCBrUmVzb3VyY2VQb29sU2l6ZSA9IDI2OworLy8gVE9ETzogTWFrZSB0aGlzIGNvbmZpZ3VyYWJsZSBpbnNpZGUgU2JQbGF5ZXJDcmVhdGUoKS4KK2NvbnN0IFNiVGltZU1vbm90b25pYyBrVXBkYXRlSW50ZXJ2YWwgPSA1ICoga1NiVGltZU1pbGxpc2Vjb25kOwogCiB9ICAvLyBuYW1lc3BhY2UKIAotVmlkZW9EZWNvZGVyOjpWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMpCitWaWRlb0RlY29kZXI6OlZpZGVvRGVjb2RlcihTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywgSm9iUXVldWUqIGpvYl9xdWV1ZSkKICAgICA6IHJlc291cmNlX3Bvb2xfKG5ldyBEaXNwbWFueFJlc291cmNlUG9vbChrUmVzb3VyY2VQb29sU2l6ZSkpLAogICAgICAgaG9zdF8oTlVMTCksCiAgICAgICBlb3Nfd3JpdHRlbl8oZmFsc2UpLAogICAgICAgdGhyZWFkXyhrU2JUaHJlYWRJbnZhbGlkKSwKLSAgICAgIHJlcXVlc3RfdGhyZWFkX3Rlcm1pbmF0aW9uXyhmYWxzZSkgeworICAgICAgcmVxdWVzdF90aHJlYWRfdGVybWluYXRpb25fKGZhbHNlKSwKKyAgICAgIGpvYl9xdWV1ZV8oam9iX3F1ZXVlKSB7CiAgIFNCX0RDSEVDSyh2aWRlb19jb2RlYyA9PSBrU2JNZWRpYVZpZGVvQ29kZWNIMjY0KTsKKyAgU0JfRENIRUNLKGpvYl9xdWV1ZV8gIT0gTlVMTCk7CisgIHVwZGF0ZV9jbG9zdXJlXyA9CisgICAgICA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6QmluZCgmVmlkZW9EZWNvZGVyOjpVcGRhdGUsIHRoaXMpOworICBqb2JfcXVldWVfLT5TY2hlZHVsZSh1cGRhdGVfY2xvc3VyZV8sIGtVcGRhdGVJbnRlcnZhbCk7CiB9CiAKIFZpZGVvRGVjb2Rlcjo6flZpZGVvRGVjb2RlcigpIHsKQEAgLTQ0LDYgKzUyLDcgQEAKICAgICB9CiAgICAgU2JUaHJlYWRKb2luKHRocmVhZF8sIE5VTEwpOwogICB9CisgIGpvYl9xdWV1ZV8tPlJlbW92ZSh1cGRhdGVfY2xvc3VyZV8pOwogfQogCiB2b2lkIFZpZGVvRGVjb2Rlcjo6U2V0SG9zdChIb3N0KiBob3N0KSB7CkBAIC04MCwxMCArODksMTAgQEAKIH0KIAogdm9pZCBWaWRlb0RlY29kZXI6OlVwZGF0ZSgpIHsKLSAgaWYgKCFlb3Nfd3JpdHRlbl8pIHsKLSAgICByZXR1cm47CisgIGlmIChlb3Nfd3JpdHRlbl8pIHsKKyAgICBUcnlUb0RlbGl2ZXJPbmVGcmFtZSgpOwogICB9Ci0gIFRyeVRvRGVsaXZlck9uZUZyYW1lKCk7CisgIGpvYl9xdWV1ZV8tPlNjaGVkdWxlKHVwZGF0ZV9jbG9zdXJlXywga1VwZGF0ZUludGVydmFsKTsKIH0KIAogYm9vbCBWaWRlb0RlY29kZXI6OlRyeVRvRGVsaXZlck9uZUZyYW1lKCkgewpAQCAtMjY4LDggKzI3NywxNiBAQAogbmFtZXNwYWNlIGZpbHRlciB7CiAKIC8vIHN0YXRpYwotVmlkZW9EZWNvZGVyKiBWaWRlb0RlY29kZXI6OkNyZWF0ZShTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYykgewotICByZXR1cm4gbmV3IHJhc3BpOjpzaGFyZWQ6Om9wZW5fbWF4OjpWaWRlb0RlY29kZXIodmlkZW9fY29kZWMpOworVmlkZW9EZWNvZGVyKiBWaWRlb0RlY29kZXI6OkNyZWF0ZShjb25zdCBQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKSB7CisgIHJldHVybiBuZXcgcmFzcGk6OnNoYXJlZDo6b3Blbl9tYXg6OlZpZGVvRGVjb2RlcihwYXJhbWV0ZXJzLnZpZGVvX2NvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyYW1ldGVycy5qb2JfcXVldWUpOworfQorCisvLyBzdGF0aWMKK2Jvb2wgVmlkZW9EZWNvZGVyOjpPdXRwdXRNb2RlU3VwcG9ydGVkKFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIGNvZGVjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEcm1TeXN0ZW0gZHJtX3N5c3RlbSkgeworICByZXR1cm4gb3V0cHV0X21vZGUgPT0ga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0OwogfQogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC92aWRlb19kZWNvZGVyLmggYi9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC92aWRlb19kZWNvZGVyLmgKaW5kZXggMTIxZTJkMy4uNDU0ZjMzYyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvdmlkZW9fZGVjb2Rlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L3ZpZGVvX2RlY29kZXIuaApAQCAtMjQsNyArMjQsOSBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGlzcG1hbnhfcmVzb3VyY2VfcG9vbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvb3Blbl9tYXhfdmlkZW9fZGVjb2RlX2NvbXBvbmVudC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9jbG9zdXJlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKIAogbmFtZXNwYWNlIHN0YXJib2FyZCB7CkBAIC0zNywxNSArMzksMTYgQEAKICBwdWJsaWM6CiAgIHR5cGVkZWYgc3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpJbnB1dEJ1ZmZlciBJbnB1dEJ1ZmZlcjsKICAgdHlwZWRlZiBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OlZpZGVvRnJhbWUgVmlkZW9GcmFtZTsKKyAgdHlwZWRlZiA6OnN0YXJib2FyZDo6c2hhcmVkOjpzdGFyYm9hcmQ6OnBsYXllcjo6Sm9iUXVldWUgSm9iUXVldWU7CisgIHR5cGVkZWYgOjpzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OkNsb3N1cmUgQ2xvc3VyZTsKIAotICBleHBsaWNpdCBWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMpOworICBWaWRlb0RlY29kZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsIEpvYlF1ZXVlKiBqb2JfcXVldWUpOwogICB+VmlkZW9EZWNvZGVyKCkgU0JfT1ZFUlJJREU7CiAKICAgdm9pZCBTZXRIb3N0KEhvc3QqIGhvc3QpIFNCX09WRVJSSURFOwogICB2b2lkIFdyaXRlSW5wdXRCdWZmZXIoY29uc3QgSW5wdXRCdWZmZXImIGlucHV0X2J1ZmZlcikgU0JfT1ZFUlJJREU7CiAgIHZvaWQgV3JpdGVFbmRPZlN0cmVhbSgpIFNCX09WRVJSSURFOwogICB2b2lkIFJlc2V0KCkgU0JfT1ZFUlJJREU7Ci0gIHZvaWQgVXBkYXRlKCkgU0JfT1ZFUlJJREU7CiAKICBwcml2YXRlOgogICBzdHJ1Y3QgRXZlbnQgewpAQCAtNjUsNiArNjgsOCBAQAogICB2b2lkIFJ1bkxvb3AoKTsKICAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBDcmVhdGVGcmFtZShjb25zdCBPTVhfQlVGRkVSSEVBREVSVFlQRSogYnVmZmVyKTsKIAorICB2b2lkIFVwZGF0ZSgpOworCiAgIC8vIFRoZXNlIHZhcmlhYmxlcyB3aWxsIGJlIGluaXRpYWxpemVkIGluc2lkZSBjdG9yIG9yIFNldEhvc3QoKSBhbmQgd2lsbCBub3QKICAgLy8gYmUgY2hhbmdlZCBkdXJpbmcgdGhlIGxpZmUgdGltZSBvZiB0aGlzIGNsYXNzLgogICBzY29wZWRfcmVmcHRyPERpc3BtYW54UmVzb3VyY2VQb29sPiByZXNvdXJjZV9wb29sXzsKQEAgLTc4LDYgKzgzLDkgQEAKICAgTXV0ZXggbXV0ZXhfOwogICBzdGQ6OnF1ZXVlPE9NWF9CVUZGRVJIRUFERVJUWVBFKj4gZmlsbGVkX2J1ZmZlcnNfOwogICBzdGQ6OnF1ZXVlPE9NWF9CVUZGRVJIRUFERVJUWVBFKj4gZnJlZWRfYnVmZmVyc187CisKKyAgSm9iUXVldWUqIGpvYl9xdWV1ZV87CisgIENsb3N1cmUgdXBkYXRlX2Nsb3N1cmVfOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIG9wZW5fbWF4CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwaSBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCmluZGV4IDlmY2JjOWYuLjFlZGVlNjggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCisrKyBiL3NyYy9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL3N0YXJib2FyZF9wbGF0Zm9ybS5neXBpCkBAIC0zOCwxMiArMzgsOSBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9kaXNwbWFueF91dGlsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9tYWluLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9jcmVhdGUuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2Rlc3Ryb3kuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9mb3JtYXQuY2MnLAotICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9wbGFuZS5jYycsCi0gICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvcmFzcGkvc2hhcmVkL29wZW5fbWF4L2RlY29kZV90YXJnZXRfZ2V0X3NpemUuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X2dldF9pbmZvLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGVjb2RlX3RhcmdldF9pc19vcGFxdWUuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kZWNvZGVfdGFyZ2V0X3JlbGVhc2UuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3Jhc3BpL3NoYXJlZC9vcGVuX21heC9kaXNwbWFueF9yZXNvdXJjZV9wb29sLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvZGlzcG1hbnhfcmVzb3VyY2VfcG9vbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9yYXNwaS9zaGFyZWQvb3Blbl9tYXgvaW1hZ2VfZGVjb2RlLmNjJywKQEAgLTI3Miw3ICsyNjksOCBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oJywKLSAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaCcsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCcsCkBAIC0yODAsMTIgKzI3OCwxNSBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZGVzdHJveS5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZ2V0X2luZm8uY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZWVrLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wYXVzZS5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3ZvbHVtZS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oJywKQEAgLTMwMiw2ICszMDMsNyBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvc3lzdGVtX2dldF9yYW5kb21fdWludDY0LmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3N5c3RlbV9yZXF1ZXN0X3N0b3AuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvd2luZG93X3NldF9kZWZhdWx0X29wdGlvbnMuY2MnLAorICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2FjY2Vzc2liaWxpdHlfZ2V0X2Rpc3BsYXlfc2V0dGluZ3MuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2FjY2Vzc2liaWxpdHlfZ2V0X3RleHRfdG9fc3BlZWNoX3NldHRpbmdzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kcm1fY2xvc2Vfc2Vzc2lvbi5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZHJtX2NyZWF0ZV9zeXN0ZW0uY2MnLApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2Fsc2EvYWxzYV9hdWRpb19zaW5rX3R5cGUuY2MKaW5kZXggNGM5MWY1Mi4uNjIzMDZjMCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX2F1ZGlvX3NpbmtfdHlwZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9hbHNhL2Fsc2FfYXVkaW9fc2lua190eXBlLmNjCkBAIC0yMCw2ICsyMCw3IEBACiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmRpdGlvbl92YXJpYWJsZS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvYWxzYS9hbHNhX3V0aWwuaCIKQEAgLTkxLDYgKzkyLDEzIEBACiAKICAgYm9vbCBJc1R5cGUoVHlwZSogdHlwZSkgU0JfT1ZFUlJJREUgeyByZXR1cm4gdHlwZV8gPT0gdHlwZTsgfQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIFNCX09WRVJSSURFIHsKKyAgICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKKyAgICBwbGF5YmFja19yYXRlXyA9IHBsYXliYWNrX3JhdGU7CisgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKwogICBib29sIGlzX3ZhbGlkKCkgeyByZXR1cm4gcGxheWJhY2tfaGFuZGxlXyAhPSBOVUxMOyB9CiAKICBwcml2YXRlOgpAQCAtMTA1LDcgKzExMyw4IEBACiAgIC8vIHNvIHdlIGNhbiBjb250aW51ZSBpbnRvIHRoZSBJZGxlTG9vcCgpLiAgSXQgcmV0dXJucyBmYWxzZSB3aGVuIGRlc3Ryb3lpbmcuCiAgIGJvb2wgUGxheWJhY2tMb29wKCk7CiAgIC8vIEhlbHBlciBmdW5jdGlvbiB0byB3cml0ZSBmcmFtZXMgY29udGFpbmVkIGluIGEgcmluZyBidWZmZXIgdG8gQUxTQS4KLSAgdm9pZCBXcml0ZUZyYW1lcyhpbnQgZnJhbWVzX3RvX3dyaXRlLAorICB2b2lkIFdyaXRlRnJhbWVzKGRvdWJsZSBwbGF5YmFja19yYXRlLAorICAgICAgICAgICAgICAgICAgIGludCBmcmFtZXNfdG9fd3JpdGUsCiAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lc19pbl9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgaW50IG9mZnNldF9pbl9mcmFtZXMpOwogCkBAIC0xMTQsNiArMTIzLDkgQEAKICAgU2JBdWRpb1NpbmtDb25zdW1lRnJhbWVzRnVuYyBjb25zdW1lX2ZyYW1lX2Z1bmNfOwogICB2b2lkKiBjb250ZXh0XzsKIAorICBkb3VibGUgcGxheWJhY2tfcmF0ZV87CisgIHN0ZDo6dmVjdG9yPHVpbnQ4X3Q+IHJlc2FtcGxlX2J1ZmZlcl87CisKICAgaW50IGNoYW5uZWxzXzsKICAgaW50IHNhbXBsaW5nX2ZyZXF1ZW5jeV9oel87CiAgIFNiTWVkaWFBdWRpb1NhbXBsZVR5cGUgc2FtcGxlX3R5cGVfOwpAQCAtMTQ0LDYgKzE1Niw5IEBACiAgICAgU2JBdWRpb1NpbmtDb25zdW1lRnJhbWVzRnVuYyBjb25zdW1lX2ZyYW1lX2Z1bmMsCiAgICAgdm9pZCogY29udGV4dCkKICAgICA6IHR5cGVfKHR5cGUpLAorICAgICAgcGxheWJhY2tfcmF0ZV8oMS4wKSwKKyAgICAgIHJlc2FtcGxlX2J1ZmZlcl8oY2hhbm5lbHMgKiBrRnJhbWVzUGVyUmVxdWVzdCAqCisgICAgICAgICAgICAgICAgICAgICAgIEdldFNhbXBsZVNpemUoc2FtcGxlX3R5cGUpKSwKICAgICAgIGNoYW5uZWxzXyhjaGFubmVscyksCiAgICAgICBzYW1wbGluZ19mcmVxdWVuY3lfaHpfKHNhbXBsaW5nX2ZyZXF1ZW5jeV9oeiksCiAgICAgICBzYW1wbGVfdHlwZV8oc2FtcGxlX3R5cGUpLApAQCAtMjI4LDE3ICsyNDMsMTkgQEAKICAgYm9vbCBkcmFpbiA9IHRydWU7CiAKICAgZm9yICg7OykgeworICAgIGRvdWJsZSBwbGF5YmFja19yYXRlOwogICAgIHsKICAgICAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwogICAgICAgaWYgKGRlc3Ryb3lpbmdfKSB7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQorICAgICAgcGxheWJhY2tfcmF0ZSA9IHBsYXliYWNrX3JhdGVfOwogICAgIH0KICAgICBpbnQgZnJhbWVzX2luX2J1ZmZlciwgb2Zmc2V0X2luX2ZyYW1lczsKICAgICBib29sIGlzX3BsYXlpbmcsIGlzX2Vvc19yZWFjaGVkOwogICAgIHVwZGF0ZV9zb3VyY2Vfc3RhdHVzX2Z1bmNfKCZmcmFtZXNfaW5fYnVmZmVyLCAmb2Zmc2V0X2luX2ZyYW1lcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXNfcGxheWluZywgJmlzX2Vvc19yZWFjaGVkLCBjb250ZXh0Xyk7Ci0gICAgaWYgKGlzX3BsYXlpbmcgJiYgZnJhbWVzX2luX2J1ZmZlciA+IDApIHsKKyAgICBpZiAoaXNfcGxheWluZyAmJiBmcmFtZXNfaW5fYnVmZmVyID4gMCAmJiBwbGF5YmFja19yYXRlID4gMC4wKSB7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgaWYgKGRyYWluKSB7CkBAIC0yNTUsMTkgKzI3MiwyMyBAQAogYm9vbCBBbHNhQXVkaW9TaW5rOjpQbGF5YmFja0xvb3AoKSB7CiAgIFNCX0RMT0coSU5GTykgPDwgImFsc2E6OkFsc2FBdWRpb1NpbmsgZW50ZXJzIHBsYXliYWNrIGxvb3AiOwogCisgIGRvdWJsZSBwbGF5YmFja19yYXRlID0gMS4wOwogICBmb3IgKDs7KSB7CiAgICAgaW50IGRlbGF5ZWRfZnJhbWUgPSBBbHNhR2V0QnVmZmVyZWRGcmFtZXMocGxheWJhY2tfaGFuZGxlXyk7Ci0KICAgICB7CiAgICAgICBTY29wZWRUcnlMb2NrIGxvY2sobXV0ZXhfKTsKICAgICAgIGlmIChsb2NrLmlzX2xvY2tlZCgpKSB7CiAgICAgICAgIGlmIChkZXN0cm95aW5nXykgewogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CisgICAgICAgIHBsYXliYWNrX3JhdGUgPSBwbGF5YmFja19yYXRlXzsKICAgICAgIH0KICAgICB9CiAKICAgICBpZiAoZGVsYXllZF9mcmFtZSA8IGtNaW5pbXVtRnJhbWVzSW5BTFNBKSB7CisgICAgICBpZiAocGxheWJhY2tfcmF0ZSA9PSAwLjApIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CiAgICAgICBpbnQgZnJhbWVzX2luX2J1ZmZlciwgb2Zmc2V0X2luX2ZyYW1lczsKICAgICAgIGJvb2wgaXNfcGxheWluZywgaXNfZW9zX3JlYWNoZWQ7CiAgICAgICB1cGRhdGVfc291cmNlX3N0YXR1c19mdW5jXygmZnJhbWVzX2luX2J1ZmZlciwgJm9mZnNldF9pbl9mcmFtZXMsCkBAIC0yNzUsNyArMjk2LDcgQEAKICAgICAgIGlmICghaXNfcGxheWluZyB8fCBmcmFtZXNfaW5fYnVmZmVyID09IDApIHsKICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICB9Ci0gICAgICBXcml0ZUZyYW1lcyhzdGQ6Om1pbihrRnJhbWVzUGVyUmVxdWVzdCwgZnJhbWVzX2luX2J1ZmZlciksCisgICAgICBXcml0ZUZyYW1lcyhwbGF5YmFja19yYXRlLCBzdGQ6Om1pbihrRnJhbWVzUGVyUmVxdWVzdCwgZnJhbWVzX2luX2J1ZmZlciksCiAgICAgICAgICAgICAgICAgICBmcmFtZXNfaW5fYnVmZmVyLCBvZmZzZXRfaW5fZnJhbWVzKTsKICAgICB9IGVsc2UgewogICAgICAgU2JUaHJlYWRTbGVlcCh0aW1lX3RvX3dhaXRfKTsKQEAgLTI4NSwzMyArMzA2LDY2IEBACiAgIHJldHVybiBmYWxzZTsKIH0KIAotdm9pZCBBbHNhQXVkaW9TaW5rOjpXcml0ZUZyYW1lcyhpbnQgZnJhbWVzX3RvX3dyaXRlLAordm9pZCBBbHNhQXVkaW9TaW5rOjpXcml0ZUZyYW1lcyhkb3VibGUgcGxheWJhY2tfcmF0ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lc190b193cml0ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZyYW1lc19pbl9idWZmZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZzZXRfaW5fZnJhbWVzKSB7Ci0gIFNCX0RDSEVDSyhmcmFtZXNfdG9fd3JpdGUgPD0gZnJhbWVzX2luX2J1ZmZlcik7CisgIGNvbnN0IGludCBieXRlc19wZXJfZnJhbWUgPSBjaGFubmVsc18gKiBHZXRTYW1wbGVTaXplKHNhbXBsZV90eXBlXyk7CisgIGlmIChwbGF5YmFja19yYXRlID09IDEuMCkgeworICAgIFNCX0RDSEVDSyhmcmFtZXNfdG9fd3JpdGUgPD0gZnJhbWVzX2luX2J1ZmZlcik7CiAKLSAgaW50IGZyYW1lc190b19idWZmZXJfZW5kID0gZnJhbWVzX3Blcl9jaGFubmVsXyAtIG9mZnNldF9pbl9mcmFtZXM7Ci0gIGlmIChmcmFtZXNfdG9fd3JpdGUgPiBmcmFtZXNfdG9fYnVmZmVyX2VuZCkgewotICAgIGludCBjb25zdW1lZCA9IEFsc2FXcml0ZUZyYW1lcygKLSAgICAgICAgcGxheWJhY2tfaGFuZGxlXywKLSAgICAgICAgSW5jcmVtZW50UG9pbnRlckJ5Qnl0ZXMoZnJhbWVfYnVmZmVyXywgb2Zmc2V0X2luX2ZyYW1lcyAqIGNoYW5uZWxzXyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRTYW1wbGVTaXplKHNhbXBsZV90eXBlXykpLAotICAgICAgICBmcmFtZXNfdG9fYnVmZmVyX2VuZCk7Ci0gICAgY29uc3VtZV9mcmFtZV9mdW5jXyhjb25zdW1lZCwgY29udGV4dF8pOwotICAgIGlmIChjb25zdW1lZCAhPSBmcmFtZXNfdG9fYnVmZmVyX2VuZCkgewotICAgICAgcmV0dXJuOworICAgIGludCBmcmFtZXNfdG9fYnVmZmVyX2VuZCA9IGZyYW1lc19wZXJfY2hhbm5lbF8gLSBvZmZzZXRfaW5fZnJhbWVzOworICAgIGlmIChmcmFtZXNfdG9fd3JpdGUgPiBmcmFtZXNfdG9fYnVmZmVyX2VuZCkgeworICAgICAgaW50IGNvbnN1bWVkID0gQWxzYVdyaXRlRnJhbWVzKAorICAgICAgICAgIHBsYXliYWNrX2hhbmRsZV8sCisgICAgICAgICAgSW5jcmVtZW50UG9pbnRlckJ5Qnl0ZXMoZnJhbWVfYnVmZmVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRfaW5fZnJhbWVzICogYnl0ZXNfcGVyX2ZyYW1lKSwKKyAgICAgICAgICBmcmFtZXNfdG9fYnVmZmVyX2VuZCk7CisgICAgICBjb25zdW1lX2ZyYW1lX2Z1bmNfKGNvbnN1bWVkLCBjb250ZXh0Xyk7CisgICAgICBpZiAoY29uc3VtZWQgIT0gZnJhbWVzX3RvX2J1ZmZlcl9lbmQpIHsKKyAgICAgICAgcmV0dXJuOworICAgICAgfQorCisgICAgICBmcmFtZXNfdG9fd3JpdGUgLT0gZnJhbWVzX3RvX2J1ZmZlcl9lbmQ7CisgICAgICBvZmZzZXRfaW5fZnJhbWVzID0gMDsKICAgICB9CiAKLSAgICBmcmFtZXNfdG9fd3JpdGUgLT0gZnJhbWVzX3RvX2J1ZmZlcl9lbmQ7Ci0gICAgb2Zmc2V0X2luX2ZyYW1lcyA9IDA7Ci0gIH0KKyAgICBpbnQgY29uc3VtZWQgPQorICAgICAgICBBbHNhV3JpdGVGcmFtZXMocGxheWJhY2tfaGFuZGxlXywKKyAgICAgICAgICAgICAgICAgICAgICAgIEluY3JlbWVudFBvaW50ZXJCeUJ5dGVzKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyYW1lX2J1ZmZlcl8sIG9mZnNldF9pbl9mcmFtZXMgKiBieXRlc19wZXJfZnJhbWUpLAorICAgICAgICAgICAgICAgICAgICAgICAgZnJhbWVzX3RvX3dyaXRlKTsKKyAgICBjb25zdW1lX2ZyYW1lX2Z1bmNfKGNvbnN1bWVkLCBjb250ZXh0Xyk7CisgIH0gZWxzZSB7CisgICAgLy8gQSB2ZXJ5IGxvdyBxdWFsaXR5IHJlc2FtcGxlciB0aGF0IHNpbXBseSBzaGlmdCB0aGUgYXVkaW8gZnJhbWVzIHRvIHBsYXkKKyAgICAvLyBhdCB0aGUgcmlnaHQgdGltZS4KKyAgICAvLyBUT0RPOiBUaGUgcGxheWJhY2sgcmF0ZSBhZGp1c3RtZW50IHNob3VsZCBiZSBkb25lIGluIEF1ZGlvUmVuZGVyZXIuICBXZQorICAgIC8vIHNob3VsZCBwcm92aWRlIGEgZGVmYXVsdCBzaW5jIHJlc2FtcGxlci4KKyAgICBkb3VibGUgc291cmNlX2ZyYW1lcyA9IDAuMDsKKyAgICBpbnQgYnVmZmVyX3NpemVfaW5fZnJhbWVzID0gcmVzYW1wbGVfYnVmZmVyXy5zaXplKCkgLyBieXRlc19wZXJfZnJhbWU7CisgICAgaW50IHRhcmdldF9mcmFtZXMgPSAwOworICAgIFNCX0RDSEVDSyhidWZmZXJfc2l6ZV9pbl9mcmFtZXMgPD0gZnJhbWVzX3RvX3dyaXRlKTsKIAotICBpbnQgY29uc3VtZWQgPSBBbHNhV3JpdGVGcmFtZXMoCi0gICAgICBwbGF5YmFja19oYW5kbGVfLAotICAgICAgSW5jcmVtZW50UG9pbnRlckJ5Qnl0ZXMoZnJhbWVfYnVmZmVyXywgb2Zmc2V0X2luX2ZyYW1lcyAqIGNoYW5uZWxzXyAqCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2V0U2FtcGxlU2l6ZShzYW1wbGVfdHlwZV8pKSwKLSAgICAgIGZyYW1lc190b193cml0ZSk7Ci0gIGNvbnN1bWVfZnJhbWVfZnVuY18oY29uc3VtZWQsIGNvbnRleHRfKTsKKyAgICAvLyBVc2UgfHBsYXliYWNrX3JhdGV8IGFzIHRoZSBncmFudWxhcml0eSBvZiBpbmNyZW1lbnQgZm9yIHNvdXJjZSBidWZmZXIuCisgICAgLy8gRm9yIGV4YW1wbGUsIHdoZW4gfHBsYXliYWNrX3JhdGV8IGlzIDAuMjUsIGV2ZXJ5IHRpbWUgYSBmcmFtZSBpcyBjb3BpZWQKKyAgICAvLyB0byB0aGUgdGFyZ2V0IGJ1ZmZlciwgdGhlIG9mZnNldCBvZiBzb3VyY2UgYnVmZmVyIHdpbGwgYmUgaW5jcmVhc2VkIGJ5CisgICAgLy8gMC4yNSwgdGhpcyBlZmZlY3RpdmVseSByZXBlYXQgdGhlIHNhbWUgZnJhbWUgZm91ciB0aW1lcyBpbnRvIHRoZSB0YXJnZXQKKyAgICAvLyBidWZmZXIgYW5kIGl0IHRha2VzIDQgdGltZXMgbG9uZ2VyIHRvIGZpbmlzaCBwbGF5aW5nIHRoZSBmcmFtZXMuCisgICAgd2hpbGUgKHN0YXRpY19jYXN0PGludD4oc291cmNlX2ZyYW1lcykgPCBmcmFtZXNfaW5fYnVmZmVyICYmCisgICAgICAgICAgIHRhcmdldF9mcmFtZXMgPCBidWZmZXJfc2l6ZV9pbl9mcmFtZXMpIHsKKyAgICAgIGNvbnN0IHVpbnQ4X3QqIHNvdXJjZV9hZGRyID0gc3RhdGljX2Nhc3Q8dWludDhfdCo+KGZyYW1lX2J1ZmZlcl8pOworICAgICAgc291cmNlX2FkZHIgKz0gc3RhdGljX2Nhc3Q8aW50PihvZmZzZXRfaW5fZnJhbWVzICsgc291cmNlX2ZyYW1lcykgJQorICAgICAgICAgICAgICAgICAgICAgZnJhbWVzX3Blcl9jaGFubmVsXyAqIGJ5dGVzX3Blcl9mcmFtZTsKKyAgICAgIFNiTWVtb3J5Q29weSgmcmVzYW1wbGVfYnVmZmVyX1swXSArIGJ5dGVzX3Blcl9mcmFtZSAqIHRhcmdldF9mcmFtZXMsCisgICAgICAgICAgICAgICAgICAgc291cmNlX2FkZHIsIGJ5dGVzX3Blcl9mcmFtZSk7CisgICAgICArK3RhcmdldF9mcmFtZXM7CisgICAgICBzb3VyY2VfZnJhbWVzICs9IHBsYXliYWNrX3JhdGU7CisgICAgfQorCisgICAgaW50IGNvbnN1bWVkID0KKyAgICAgICAgQWxzYVdyaXRlRnJhbWVzKHBsYXliYWNrX2hhbmRsZV8sICZyZXNhbXBsZV9idWZmZXJfWzBdLCB0YXJnZXRfZnJhbWVzKTsKKyAgICBjb25zdW1lX2ZyYW1lX2Z1bmNfKGNvbnN1bWVkICogcGxheWJhY2tfcmF0ZV8sIGNvbnRleHRfKTsKKyAgfQogfQogCiB9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfYXVkaW9fZGVjb2Rlci5jYwppbmRleCA0YjczZWQ3Li4zZTdlMWEyIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX2F1ZGlvX2RlY29kZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ19hdWRpb19kZWNvZGVyLmNjCkBAIC0yMzIsMTUgKzIzMiwxNCBAQAogbmFtZXNwYWNlIGZpbHRlciB7CiAKIC8vIHN0YXRpYwotQXVkaW9EZWNvZGVyKiBBdWRpb0RlY29kZXI6OkNyZWF0ZShTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIpIHsKK0F1ZGlvRGVjb2RlciogQXVkaW9EZWNvZGVyOjpDcmVhdGUoY29uc3QgUGFyYW1ldGVycyYgcGFyYW1ldGVycykgewogICBmZm1wZWc6OkF1ZGlvRGVjb2RlciogZGVjb2RlciA9Ci0gICAgICBuZXcgZmZtcGVnOjpBdWRpb0RlY29kZXIoYXVkaW9fY29kZWMsIGF1ZGlvX2hlYWRlcik7Ci0gIGlmIChkZWNvZGVyLT5pc192YWxpZCgpKSB7Ci0gICAgcmV0dXJuIGRlY29kZXI7CisgICAgICBuZXcgZmZtcGVnOjpBdWRpb0RlY29kZXIocGFyYW1ldGVycy5hdWRpb19jb2RlYywgcGFyYW1ldGVycy5hdWRpb19oZWFkZXIpOworICBpZiAoIWRlY29kZXItPmlzX3ZhbGlkKCkpIHsKKyAgICBkZWxldGUgZGVjb2RlcjsKKyAgICByZXR1cm4gTlVMTDsKICAgfQotICBkZWxldGUgZGVjb2RlcjsKLSAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBkZWNvZGVyOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9mZm1wZWcvZmZtcGVnX3ZpZGVvX2RlY29kZXIuY2MKaW5kZXggMmUwNWVlOC4uYjA0NmYzOCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvZmZtcGVnL2ZmbXBlZ192aWRlb19kZWNvZGVyLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2ZmbXBlZy9mZm1wZWdfdmlkZW9fZGVjb2Rlci5jYwpAQCAtMjk4LDE1ICsyOTgsMjggQEAKIG5hbWVzcGFjZSBmaWx0ZXIgewogCiAvLyBzdGF0aWMKLVZpZGVvRGVjb2RlciogVmlkZW9EZWNvZGVyOjpDcmVhdGUoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMpIHsKLSAgZmZtcGVnOjpWaWRlb0RlY29kZXIqIGRlY29kZXIgPSBuZXcgZmZtcGVnOjpWaWRlb0RlY29kZXIodmlkZW9fY29kZWMpOwotICBpZiAoZGVjb2Rlci0+aXNfdmFsaWQoKSkgewotICAgIHJldHVybiBkZWNvZGVyOworVmlkZW9EZWNvZGVyKiBWaWRlb0RlY29kZXI6OkNyZWF0ZShjb25zdCBQYXJhbWV0ZXJzJiBwYXJhbWV0ZXJzKSB7CisgIGZmbXBlZzo6VmlkZW9EZWNvZGVyKiBkZWNvZGVyID0KKyAgICAgIG5ldyBmZm1wZWc6OlZpZGVvRGVjb2RlcihwYXJhbWV0ZXJzLnZpZGVvX2NvZGVjKTsKKyAgaWYgKCFkZWNvZGVyLT5pc192YWxpZCgpKSB7CisgICAgZGVsZXRlIGRlY29kZXI7CisgICAgcmV0dXJuIE5VTEw7CiAgIH0KLSAgZGVsZXRlIGRlY29kZXI7Ci0gIHJldHVybiBOVUxMOworICByZXR1cm4gZGVjb2RlcjsKIH0KIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorLy8gc3RhdGljCitib29sIFZpZGVvRGVjb2Rlcjo6T3V0cHV0TW9kZVN1cHBvcnRlZChTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyBjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0pIHsKKyAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihjb2RlYyk7CisgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIoZHJtX3N5c3RlbSk7CisKKyAgcmV0dXJuIG91dHB1dF9tb2RlID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dDsKK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIH0gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2dsZXMvZ2xfY2FsbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvZ2xlcy9nbF9jYWxsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjdhMjEwNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL2dsZXMvZ2xfY2FsbC5oCkBAIC0wLDAgKzEsMzUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9HTEVTX0dMX0NBTExfSF8KKyNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9HTEVTX0dMX0NBTExfSF8KKworI2luY2x1ZGUgIkVHTC9lZ2wuaCIKKyNpbmNsdWRlICJHTEVTMi9nbDIuaCIKKworI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKworI2RlZmluZSBHTF9DQUxMKHgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB4OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFNCX0RDSEVDSyhnbEdldEVycm9yKCkgPT0gR0xfTk9fRVJST1IpOyBcCisgIH0gd2hpbGUgKGZhbHNlKQorCisjZGVmaW5lIEVHTF9DQUxMKHgpICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgU0JfRENIRUNLKGVnbEdldEVycm9yKCkgPT0gRUdMX1NVQ0NFU1MpOyBcCisgIH0gd2hpbGUgKGZhbHNlKQorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfR0xFU19HTF9DQUxMX0hfCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wb3NpeC9zb2NrZXRfcmVjZWl2ZV9mcm9tLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvcG9zaXgvc29ja2V0X3JlY2VpdmVfZnJvbS5jYwppbmRleCBjYTBjYjA0Li41Mjc1NmFhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9wb3NpeC9zb2NrZXRfcmVjZWl2ZV9mcm9tLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3Bvc2l4L3NvY2tldF9yZWNlaXZlX2Zyb20uY2MKQEAgLTIzLDYgKzIzLDE0IEBACiAKIG5hbWVzcGFjZSBzYnBvc2l4ID0gc3RhcmJvYXJkOjpzaGFyZWQ6OnBvc2l4OwogCituYW1lc3BhY2UgeworCitib29sIElzUmVwb3J0YWJsZUVycm5vKGludCBjb2RlKSB7CisgIHJldHVybiAoY29kZSAhPSBFQUdBSU4gJiYgY29kZSAhPSBFV09VTERCTE9DSyAmJiBjb2RlICE9IEVDT05OUkVTRVQpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwogaW50IFNiU29ja2V0UmVjZWl2ZUZyb20oU2JTb2NrZXQgc29ja2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogb3V0X2RhdGEsCiAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZGF0YV9zaXplLApAQCAtNjEsNyArNjksNyBAQAogICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oYnl0ZXNfcmVhZCk7CiAgICAgfQogCi0gICAgaWYgKGVycm5vICE9IEVBR0FJTiAmJiBlcnJubyAhPSBFV09VTERCTE9DSyAmJgorICAgIGlmIChJc1JlcG9ydGFibGVFcnJubyhlcnJubykgJiYKICAgICAgICAgc29ja2V0LT5lcnJvciAhPSBzYnBvc2l4OjpUcmFuc2xhdGVTb2NrZXRFcnJubyhlcnJubykpIHsKICAgICAgIFNCX0RMT0coRVJST1IpIDw8ICJyZWN2IGZhaWxlZCwgZXJybm8gPSAiIDw8IGVycm5vOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hcHBsaWNhdGlvbi5jYwppbmRleCBmNzlmNWRkLi42NzlhYjQxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmNjCkBAIC0xMjgsNyArMTI4LDEwIEBACiAgIENhbmNlbFRpbWVkRXZlbnQoaWQpOwogfQogCi0jaWYgU0JfSEFTKFBMQVlFUikgJiYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmIFNCX0hBUyhQTEFZRVIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpKQorCiB2b2lkIEFwcGxpY2F0aW9uOjpIYW5kbGVGcmFtZShTYlBsYXllciBwbGF5ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+JiBmcmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB4LApAQCAtMTM3LDcgKzE0MCw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSB7CiAgIEFjY2VwdEZyYW1lKHBsYXllciwgZnJhbWUsIHgsIHksIHdpZHRoLCBoZWlnaHQpOwogfQotI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKSAmJiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjZW5kaWYgIC8vIFNCX0hBUyhQTEFZRVIpICYmIFwKKyAgICAgICAgICAgKFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fCBcCisgICAgICAgICAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpKQogCiB2b2lkIEFwcGxpY2F0aW9uOjpTZXRTdGFydExpbmsoY29uc3QgY2hhciogc3RhcnRfbGluaykgewogICBTYk1lbW9yeURlYWxsb2NhdGUoc3RhcnRfbGlua18pOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2FwcGxpY2F0aW9uLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaAppbmRleCA5OWI0MDYxLi4zZWUxZjZiIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXBwbGljYXRpb24uaApAQCAtMjA3LDcgKzIwNyw5IEBACiAgIC8vIGV4dGVybmFsIHRocmVhZC4KICAgdm9pZCBDYW5jZWwoU2JFdmVudElkIGlkKTsKIAotI2lmIFNCX0hBUyhQTEFZRVIpICYmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9IQVMoUExBWUVSKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAoU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSkKICAgLy8gSGFuZGxlcyByZWNlaXZpbmcgYSBuZXcgdmlkZW8gZnJhbWUgb2YgfHBsYXllcnwgZnJvbSB0aGUgbWVkaWEgc3lzdGVtLiBPbmx5CiAgIC8vIHVzZWQgd2hlbiB0aGUgYXBwbGljYXRpb24gbmVlZHMgdG8gY29tcG9zaXRlIHZpZGVvIGZyYW1lcyB3aXRoIHB1bmNoLW91dAogICAvLyB2aWRlbyBtYW51YWxseSAoc2hvdWxkIGJlIHJhcmUpLiBXaWxsIGJlIGNhbGxlZCBmcm9tIGFuIGV4dGVybmFsIHRocmVhZC4KQEAgLTIxNyw3ICsyMTksOSBAQAogICAgICAgICAgICAgICAgICAgIGludCB5LAogICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KTsKLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikgJiYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKSAmJiBcCisgICAgICAgICAgIChTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgICAgICAgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSkKIAogICAvLyBSZWdpc3RlcnMgYSB8Y2FsbGJhY2t8IGZ1bmN0aW9uIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB8VGVhcmRvd258IGlzCiAgIC8vIGNhbGxlZC4KQEAgLTIzNyw3ICsyNDEsOSBAQAogICAvLyBtdXN0IGJlIHJ1biBhZnRlciB0aGUgYXBwbGljYXRpb24gc3RvcCBldmVudCBpcyBoYW5kbGVkLgogICB2aXJ0dWFsIHZvaWQgVGVhcmRvd24oKSB7fQogCi0jaWYgU0JfSEFTKFBMQVlFUikgJiYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmIFNCX0hBUyhQTEFZRVIpICYmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIChTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpKQogICAvLyBTdWJjbGFzc2VzIG1heSBvdmVycmlkZSB0aGlzIG1ldGhvZCB0byBhY2NlcHQgdmlkZW8gZnJhbWVzIGZyb20gdGhlIG1lZGlhCiAgIC8vIHN5c3RlbS4gV2lsbCBiZSBjYWxsZWQgZnJvbSBhbiBleHRlcm5hbCB0aHJlYWQuCiAgIHZpcnR1YWwgdm9pZCBBY2NlcHRGcmFtZShTYlBsYXllciBwbGF5ZXIsCkBAIC0yNDYsNyArMjUyLDkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkge30KLSNlbmRpZiAgLy8gU0JfSEFTKFBMQVlFUikgJiYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2VuZGlmICAvLyBTQl9IQVMoUExBWUVSKSAmJiBcCisgICAgICAgICAgIChTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgICAgICAgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKSkKIAogICAvLyBCbG9ja3MgdW50aWwgdGhlIG5leHQgZXZlbnQgaXMgYXZhaWxhYmxlLiBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXMKICAgLy8gbWV0aG9kIHRvIHByb3ZpZGUgZXZlbnRzIGZvciB0aGUgcGxhdGZvcm0uIEdpdmVzIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyLgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oCmluZGV4IDY1NDBkMDguLjEwYjZiNjggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL2F1ZGlvX3NpbmtfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9hdWRpb19zaW5rX2ludGVybmFsLmgKQEAgLTE2LDYgKzE2LDcgQEAKICNkZWZpbmUgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfQVVESU9fU0lOS19BVURJT19TSU5LX0lOVEVSTkFMX0hfCiAKICNpbmNsdWRlICJzdGFyYm9hcmQvYXVkaW9fc2luay5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jb25maWd1cmF0aW9uLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCiAKIHN0cnVjdCBTYkF1ZGlvU2lua1ByaXZhdGUgewpAQCAtMzgsNiArMzksOSBAQAogICB9OwogCiAgIHZpcnR1YWwgflNiQXVkaW9TaW5rUHJpdmF0ZSgpIHt9CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgdmlydHVhbCB2b2lkIFNldFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSkgPSAwOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogICB2aXJ0dWFsIGJvb2wgSXNUeXBlKFR5cGUqIHR5cGUpID0gMDsKIAogICAvLyBUaGUgZm9sbG93aW5nIHR3byBmdW5jdGlvbnMgd2lsbCBiZSBjYWxsZWQgZHVyaW5nIGFwcGxpY2F0aW9uIHN0YXJ0dXAgYW5kCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvYXVkaW9fc2luay9zdHViX2F1ZGlvX3NpbmtfdHlwZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL3N0dWJfYXVkaW9fc2lua190eXBlLmNjCmluZGV4IGNkODhkZDguLjJmZWYyNjcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL3N0dWJfYXVkaW9fc2lua190eXBlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9hdWRpb19zaW5rL3N0dWJfYXVkaW9fc2lua190eXBlLmNjCkBAIC0xNiw2ICsxNiw3IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9tdXRleC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90aHJlYWQuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvdGltZS5oIgpAQCAtMzYsNiArMzcsMTEgQEAKICAgflN0dWJBdWRpb1NpbmsoKSBTQl9PVkVSUklERTsKIAogICBib29sIElzVHlwZShUeXBlKiB0eXBlKSBTQl9PVkVSUklERSB7IHJldHVybiB0eXBlXyA9PSB0eXBlOyB9CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIFNCX09WRVJSSURFIHsKKyAgICBTQl9OT1RJTVBMRU1FTlRFRCgpOworICB9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCiAKICBwcml2YXRlOgogICBzdGF0aWMgdm9pZCogVGhyZWFkRW50cnlQb2ludCh2b2lkKiBjb250ZXh0KTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX2RlY29kZXJfaW50ZXJuYWwuaAppbmRleCA2ZmI1YWNjLi5kMGJkMWYzIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19kZWNvZGVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fZGVjb2Rlcl9pbnRlcm5hbC5oCkBAIC0yMSw2ICsyMSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9pbnRlcm5hbF9vbmx5LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2RlY29kZWRfYXVkaW9faW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvaW5wdXRfYnVmZmVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2pvYl9xdWV1ZS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC90eXBlcy5oIgogCiBuYW1lc3BhY2Ugc3RhcmJvYXJkIHsKQEAgLTU4LDEwICs1OSwxNyBAQAogICAvLyBkaWZmZXJlbnQgdGhhbiB0aGUgc2FtcGxlIHJhdGUgc3RvcmVkIGluIHRoZSBtZXRhIGRhdGEuCiAgIHZpcnR1YWwgaW50IEdldFNhbXBsZXNQZXJTZWNvbmQoKSBjb25zdCA9IDA7CiAKKyAgLy8gQSBwYXJhbWV0ZXIgc3RydWN0IHRvIHBhc3MgaW50byB8Q3JlYXRlfC4KKyAgc3RydWN0IFBhcmFtZXRlcnMgeworICAgIFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjOworICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyOworICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW07CisgICAgSm9iUXVldWUqIGpvYl9xdWV1ZTsKKyAgfTsKKwogICAvLyBJbmRpdmlkdWFsIGltcGxlbWVudGF0aW9uIGhhcyB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0byBjcmVhdGUgYW4KICAgLy8gYXVkaW8gZGVjb2Rlci4KLSAgc3RhdGljIEF1ZGlvRGVjb2RlciogQ3JlYXRlKFNiTWVkaWFBdWRpb0NvZGVjIGF1ZGlvX2NvZGVjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYUF1ZGlvSGVhZGVyJiBhdWRpb19oZWFkZXIpOworICBzdGF0aWMgQXVkaW9EZWNvZGVyKiBDcmVhdGUoY29uc3QgUGFyYW1ldGVycyYgb3B0aW9ucyk7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjCmluZGV4IDRjM2VhNjUuLjZjYmZjMTggMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmNjCkBAIC0xNyw2ICsxNyw3IEBACiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9jbG9zdXJlLmgiCiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtMzMsNiArMzQsNyBAQAogICAgICAgYnl0ZXNfcGVyX2ZyYW1lXygKICAgICAgICAgICAoZGVjb2Rlci0+R2V0U2FtcGxlVHlwZSgpID09IGtTYk1lZGlhQXVkaW9TYW1wbGVUeXBlSW50MTYgPyAyIDogNCkgKgogICAgICAgICAgIGNoYW5uZWxzXyksCisgICAgICBwbGF5YmFja19yYXRlXygxLjApLAogICAgICAgcGF1c2VkXyh0cnVlKSwKICAgICAgIHNlZWtpbmdfKGZhbHNlKSwKICAgICAgIHNlZWtpbmdfdG9fcHRzXygwKSwKQEAgLTExNCw2ICsxMTYsMTggQEAKICAgcGF1c2VkXyA9IHRydWU7CiB9CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgordm9pZCBBdWRpb1JlbmRlcmVyOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKKyAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgcGxheWJhY2tfcmF0ZV8gPSBwbGF5YmFja19yYXRlOworCisgIGlmIChhdWRpb19zaW5rXykgeworICAgIGF1ZGlvX3NpbmtfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSk7CisgIH0KK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKwogdm9pZCBBdWRpb1JlbmRlcmVyOjpTZWVrKFNiTWVkaWFUaW1lIHNlZWtfdG9fcHRzKSB7CiAgIFNCX0RDSEVDSyhqb2JfcXVldWVfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogICBTQl9EQ0hFQ0soc2Vla190b19wdHMgPj0gMCk7CkBAIC0yNTgsNiArMjcyLDkgQEAKICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxTYkF1ZGlvU2lua0ZyYW1lQnVmZmVycz4oZnJhbWVfYnVmZmVyc18pLAogICAgICAgICBrTWF4Q2FjaGVkRnJhbWVzLCAmQXVkaW9SZW5kZXJlcjo6VXBkYXRlU291cmNlU3RhdHVzRnVuYywKICAgICAgICAgJkF1ZGlvUmVuZGVyZXI6OkNvbnN1bWVGcmFtZXNGdW5jLCB0aGlzKTsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICAgIGF1ZGlvX3NpbmtfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZV8pOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9hdWRpb19yZW5kZXJlcl9pbnRlcm5hbC5oCmluZGV4IDc0NWM0ZjAuLmM3NDI4YTkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2F1ZGlvX3JlbmRlcmVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvYXVkaW9fcmVuZGVyZXJfaW50ZXJuYWwuaApAQCAtNTAsNiArNTAsOSBAQAogCiAgIHZvaWQgUGxheSgpOwogICB2b2lkIFBhdXNlKCk7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgdm9pZCBTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogICB2b2lkIFNlZWsoU2JNZWRpYVRpbWUgc2Vla190b19wdHMpOwogCiAgIGJvb2wgSXNFbmRPZlN0cmVhbVdyaXR0ZW4oKSBjb25zdCB7IHJldHVybiBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fOyB9CkBAIC05MCw2ICs5Myw4IEBACiAgIGNvbnN0IGludCBjaGFubmVsc187CiAgIGNvbnN0IGludCBieXRlc19wZXJfZnJhbWVfOwogCisgIGRvdWJsZSBwbGF5YmFja19yYXRlXzsKKwogICBNdXRleCBtdXRleF87CiAgIGJvb2wgcGF1c2VkXzsKICAgYm9vbCBzZWVraW5nXzsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmNjCmluZGV4IDQ0N2I0MTYuLjNiNjY4ZTkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5jYwpAQCAtNDAsNyArNDAsMTYgQEAKICAgICBTYk1lZGlhVmlkZW9Db2RlYyB2aWRlb19jb2RlYywKICAgICBTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtLAotICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyKQorICAgIGNvbnN0IFNiTWVkaWFBdWRpb0hlYWRlciYgYXVkaW9faGVhZGVyCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgLAorICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSAzCisgICAgLAorICAgIFNiRGVjb2RlVGFyZ2V0UHJvdmlkZXIqIHByb3ZpZGVyCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKKyAgICApCiAgICAgOiBwbGF5ZXJfd29ya2VyXyhOVUxMKSwKICAgICAgIGpvYl9xdWV1ZV8oTlVMTCksCiAgICAgICBwbGF5ZXJfKGtTYlBsYXllckludmFsaWQpLApAQCAtNTEsMTAgKzYwLDE3IEBACiAgICAgICBhdWRpb19jb2RlY18oYXVkaW9fY29kZWMpLAogICAgICAgZHJtX3N5c3RlbV8oZHJtX3N5c3RlbSksCiAgICAgICBhdWRpb19oZWFkZXJfKGF1ZGlvX2hlYWRlciksCi0gICAgICBwYXVzZWRfKGZhbHNlKSB7Ci0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorICAgICAgcGF1c2VkXyhmYWxzZSkKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgICAgICwKKyAgICAgIG91dHB1dF9tb2RlXyhvdXRwdXRfbW9kZSkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMworICAgICAgLAorICAgICAgZGVjb2RlX3RhcmdldF9wcm92aWRlcl8ocHJvdmlkZXIpCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKK3sKICAgYm91bmRzXyA9IFBsYXllcldvcmtlcjo6Qm91bmRzKCk7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIH0KIAogYm9vbCBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6OkluaXQoCkBAIC02Nyw3ICs4Myw3IEBACiAgIC8vIFRoaXMgZnVuY3Rpb24gc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uY2UuCiAgIFNCX0RDSEVDSyhwbGF5ZXJfd29ya2VyXyA9PSBOVUxMKTsKIAotICAvLyBBbGwgcGFyYW1ldGVycyBoYXMgdG8gYmUgdmFsaWQuCisgIC8vIEFsbCBwYXJhbWV0ZXJzIGhhdmUgdG8gYmUgdmFsaWQuCiAgIFNCX0RDSEVDSyhwbGF5ZXJfd29ya2VyKTsKICAgU0JfRENIRUNLKGpvYl9xdWV1ZSk7CiAgIFNCX0RDSEVDSyhqb2JfcXVldWUtPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CkBAIC04MywxOCArOTksMzMgQEAKICAgZ2V0X3BsYXllcl9zdGF0ZV9jYl8gPSBnZXRfcGxheWVyX3N0YXRlX2NiOwogICB1cGRhdGVfcGxheWVyX3N0YXRlX2NiXyA9IHVwZGF0ZV9wbGF5ZXJfc3RhdGVfY2I7CiAKKyAgQXVkaW9EZWNvZGVyOjpQYXJhbWV0ZXJzIGF1ZGlvX2RlY29kZXJfcGFyYW1ldGVycyA9IHsKKyAgICAgIGF1ZGlvX2NvZGVjXywgYXVkaW9faGVhZGVyXywgZHJtX3N5c3RlbV8sIGpvYl9xdWV1ZV99OwogICBzY29wZWRfcHRyPEF1ZGlvRGVjb2Rlcj4gYXVkaW9fZGVjb2RlcigKLSAgICAgIEF1ZGlvRGVjb2Rlcjo6Q3JlYXRlKGF1ZGlvX2NvZGVjXywgYXVkaW9faGVhZGVyXykpOwotICBzY29wZWRfcHRyPFZpZGVvRGVjb2Rlcj4gdmlkZW9fZGVjb2RlcihWaWRlb0RlY29kZXI6OkNyZWF0ZSh2aWRlb19jb2RlY18pKTsKKyAgICAgIEF1ZGlvRGVjb2Rlcjo6Q3JlYXRlKGF1ZGlvX2RlY29kZXJfcGFyYW1ldGVycykpOworICBWaWRlb0RlY29kZXI6OlBhcmFtZXRlcnMgdmlkZW9fZGVjb2Rlcl9wYXJhbWV0ZXJzID0geworICAgIHZpZGVvX2NvZGVjXywKKyAgICBkcm1fc3lzdGVtXywKKyAgICBqb2JfcXVldWVfCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgLAorICAgIG91dHB1dF9tb2RlXywKKyAgICBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyXworI2VuZGlmICAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICB9OyAgICAgIC8vIE5PTElOVCh3aGl0ZXNwYWNlL3BhcmVucykKKyAgc2NvcGVkX3B0cjxWaWRlb0RlY29kZXI+IHZpZGVvX2RlY29kZXIoCisgICAgICBWaWRlb0RlY29kZXI6OkNyZWF0ZSh2aWRlb19kZWNvZGVyX3BhcmFtZXRlcnMpKTsKIAogICBpZiAoIWF1ZGlvX2RlY29kZXIgfHwgIXZpZGVvX2RlY29kZXIpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAorICA6OnN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKHZpZGVvX3JlbmRlcmVyX2V4aXN0ZW5jZV9tdXRleF8pOworCiAgIGF1ZGlvX3JlbmRlcmVyXy5yZXNldCgKICAgICAgIG5ldyBBdWRpb1JlbmRlcmVyKGpvYl9xdWV1ZSwgYXVkaW9fZGVjb2Rlci5QYXNzKCksIGF1ZGlvX2hlYWRlcl8pKTsKLSAgdmlkZW9fcmVuZGVyZXJfLnJlc2V0KG5ldyBWaWRlb1JlbmRlcmVyKHZpZGVvX2RlY29kZXIuUGFzcygpKSk7Ci0gIGlmIChhdWRpb19yZW5kZXJlcl8tPmlzX3ZhbGlkKCkgJiYgdmlkZW9fcmVuZGVyZXJfLT5pc192YWxpZCgpKSB7CisgIHZpZGVvX3JlbmRlcmVyXyA9IFZpZGVvUmVuZGVyZXI6OkNyZWF0ZSh2aWRlb19kZWNvZGVyLlBhc3MoKSk7CisgIGlmIChhdWRpb19yZW5kZXJlcl8tPmlzX3ZhbGlkKCkgJiYgdmlkZW9fcmVuZGVyZXJfKSB7CiAgICAgdXBkYXRlX2Nsb3N1cmVfID0gQmluZCgmRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpVcGRhdGUsIHRoaXMpOwogICAgIGpvYl9xdWV1ZV8tPlNjaGVkdWxlKHVwZGF0ZV9jbG9zdXJlXywga1VwZGF0ZUludGVydmFsKTsKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTIwOSw3ICsyNDAsMTUgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KK2Jvb2wgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKKyAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CisKKyAgYXVkaW9fcmVuZGVyZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSk7CisgIHJldHVybiB0cnVlOworfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorCiBib29sIEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcjo6U2V0Qm91bmRzKAogICAgIGNvbnN0IFBsYXllcldvcmtlcjo6Qm91bmRzJiBib3VuZHMpIHsKICAgU0JfRENIRUNLKGpvYl9xdWV1ZV8tPkJlbG9uZ3NUb0N1cnJlbnRUaHJlYWQoKSk7CkBAIC0yMjMsNyArMjYyLDYgQEAKIAogICByZXR1cm4gdHJ1ZTsKIH0KLSNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogCiAvLyBUT0RPOiBUaGlzIHNob3VsZCBiZSBkcml2ZW4gYnkgY2FsbGJhY2tzIGluc3RlYWQgcG9sbGluZy4KIHZvaWQgRmlsdGVyQmFzZWRQbGF5ZXJXb3JrZXJIYW5kbGVyOjpVcGRhdGUoKSB7CkBAIC0yNTAsMTggKzI4OCwxNyBAQAogICAgIHBsYXllcl93b3JrZXJfLT5VcGRhdGVEcm9wcGVkVmlkZW9GcmFtZXMoCiAgICAgICAgIHZpZGVvX3JlbmRlcmVyXy0+R2V0RHJvcHBlZEZyYW1lcygpKTsKIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKLSAgICBzaGFyZWQ6OnN0YXJib2FyZDo6QXBwbGljYXRpb246OkdldCgpLT5IYW5kbGVGcmFtZSgKLSAgICAgICAgcGxheWVyXywgZnJhbWUsIGJvdW5kc18ueCwgYm91bmRzXy55LCBib3VuZHNfLndpZHRoLCBib3VuZHNfLmhlaWdodCk7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgICBpZiAob3V0cHV0X21vZGVfID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgeworICAgICAgc2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpHZXQoKS0+SGFuZGxlRnJhbWUoCisgICAgICAgICAgcGxheWVyXywgZnJhbWUsIGJvdW5kc18ueCwgYm91bmRzXy55LCBib3VuZHNfLndpZHRoLCBib3VuZHNfLmhlaWdodCk7CisgICAgfQogCiAgICAgKCpwbGF5ZXJfd29ya2VyXy4qdXBkYXRlX21lZGlhX3RpbWVfY2JfKShhdWRpb19yZW5kZXJlcl8tPkdldEN1cnJlbnRUaW1lKCkpOwogICB9CiAKLSAgaWYgKHZpZGVvX3JlbmRlcmVyXykgewotICAgIHZpZGVvX3JlbmRlcmVyXy0+VXBkYXRlKCk7Ci0gIH0KLQogICBqb2JfcXVldWVfLT5TY2hlZHVsZSh1cGRhdGVfY2xvc3VyZV8sIGtVcGRhdGVJbnRlcnZhbCk7CiB9CiAKQEAgLTI2OSwxNSArMzA2LDMyIEBACiAgIGpvYl9xdWV1ZV8tPlJlbW92ZSh1cGRhdGVfY2xvc3VyZV8pOwogCiAgIGF1ZGlvX3JlbmRlcmVyXy5yZXNldCgpOwotICB2aWRlb19yZW5kZXJlcl8ucmVzZXQoKTsKKyAgeworICAgIDo6c3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sodmlkZW9fcmVuZGVyZXJfZXhpc3RlbmNlX211dGV4Xyk7CisgICAgdmlkZW9fcmVuZGVyZXJfLnJlc2V0KCk7CisgIH0KIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKLSAgLy8gQ2xlYXIgdGhlIHZpZGVvIGZyYW1lIGFzIHdlIHRlcm1pbmF0ZS4KLSAgc2hhcmVkOjpzdGFyYm9hcmQ6OkFwcGxpY2F0aW9uOjpHZXQoKS0+SGFuZGxlRnJhbWUoCi0gICAgICBwbGF5ZXJfLCBWaWRlb0ZyYW1lOjpDcmVhdGVFT1NGcmFtZSgpLCAwLCAwLCAwLCAwKTsKLSNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBpZiAob3V0cHV0X21vZGVfID09IGtTYlBsYXllck91dHB1dE1vZGVQdW5jaE91dCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIHsKKyAgICAvLyBDbGVhciB0aGUgdmlkZW8gZnJhbWUgYXMgd2UgdGVybWluYXRlLgorICAgIHNoYXJlZDo6c3RhcmJvYXJkOjpBcHBsaWNhdGlvbjo6R2V0KCktPkhhbmRsZUZyYW1lKAorICAgICAgICBwbGF5ZXJfLCBWaWRlb0ZyYW1lOjpDcmVhdGVFT1NGcmFtZSgpLCAwLCAwLCAwLCAwKTsKKyAgfQogfQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCitTYkRlY29kZVRhcmdldCBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXI6OkdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSB7CisgIDo6c3RhcmJvYXJkOjpTY29wZWRMb2NrIGxvY2sodmlkZW9fcmVuZGVyZXJfZXhpc3RlbmNlX211dGV4Xyk7CisgIGlmICh2aWRlb19yZW5kZXJlcl8pIHsKKyAgICByZXR1cm4gdmlkZW9fcmVuZGVyZXJfLT5HZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCk7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7CisgIH0KK30KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIH0gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKIH0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKIH0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL2ZpbHRlcl9iYXNlZF9wbGF5ZXJfd29ya2VyX2hhbmRsZXIuaAppbmRleCAzNzAxNzhkLi40M2NlMzBmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci9maWx0ZXJfYmFzZWRfcGxheWVyX3dvcmtlcl9oYW5kbGVyLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvZmlsdGVyX2Jhc2VkX3BsYXllcl93b3JrZXJfaGFuZGxlci5oCkBAIC0xNyw2ICsxNyw5IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorI2lmIFNCX0FQSV9WRVJTSU9OID49IDMKKyNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgorI2VuZGlmCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9jbG9zdXJlLmgiCkBAIC0zOCw3ICs0MSwxMyBAQAogICBGaWx0ZXJCYXNlZFBsYXllcldvcmtlckhhbmRsZXIoU2JNZWRpYVZpZGVvQ29kZWMgdmlkZW9fY29kZWMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhQXVkaW9Db2RlYyBhdWRpb19jb2RlYywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlcik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTYk1lZGlhQXVkaW9IZWFkZXImIGF1ZGlvX2hlYWRlcgorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciogcHJvdmlkZXIKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOyAgLy8gTk9MSU5UKHdoaXRlc3BhY2UvcGFyZW5zKQogCiAgcHJpdmF0ZToKICAgYm9vbCBJbml0KFBsYXllcldvcmtlciogcGxheWVyX3dvcmtlciwKQEAgLTUxLDEzICs2MCwxOCBAQAogICBib29sIFdyaXRlU2FtcGxlKElucHV0QnVmZmVyIGlucHV0X2J1ZmZlciwgYm9vbCogd3JpdHRlbikgU0JfT1ZFUlJJREU7CiAgIGJvb2wgV3JpdGVFbmRPZlN0cmVhbShTYk1lZGlhVHlwZSBzYW1wbGVfdHlwZSkgU0JfT1ZFUlJJREU7CiAgIGJvb2wgU2V0UGF1c2UoYm9vbCBwYXVzZSkgU0JfT1ZFUlJJREU7Ci0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIGJvb2wgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSBTQl9PVkVSUklERTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KICAgYm9vbCBTZXRCb3VuZHMoY29uc3QgUGxheWVyV29ya2VyOjpCb3VuZHMmIGJvdW5kcykgU0JfT1ZFUlJJREU7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgdm9pZCBTdG9wKCkgU0JfT1ZFUlJJREU7CiAKICAgdm9pZCBVcGRhdGUoKTsKIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBTYkRlY29kZVRhcmdldCBHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgU0JfT1ZFUlJJREU7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCiAgIFBsYXllcldvcmtlciogcGxheWVyX3dvcmtlcl87CiAgIEpvYlF1ZXVlKiBqb2JfcXVldWVfOwogICBTYlBsYXllciBwbGF5ZXJfOwpAQCAtNzQsMTAgKzg4LDIzIEBACiAgIHNjb3BlZF9wdHI8VmlkZW9SZW5kZXJlcj4gdmlkZW9fcmVuZGVyZXJfOwogCiAgIGJvb2wgcGF1c2VkXzsKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIFBsYXllcldvcmtlcjo6Qm91bmRzIGJvdW5kc187Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgQ2xvc3VyZSB1cGRhdGVfY2xvc3VyZV87CisKKyAgLy8gQSBtdXRleCBndWFyZGluZyBjaGFuZ2VzIHRvIHRoZSBleGlzdGVuY2UgKGUuZy4gY3JlYXRpb24vZGVzdHJ1Y3Rpb24pCisgIC8vIG9mIHRoZSB8dmlkZW9fcmVuZGVyZXJffCBvYmplY3QuICBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGNhbGxzIHRvCisgIC8vIEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSBuZWVkIHRvIGJlIHN1cHBvcnRlZCBvbiBhcmJpdHJhcnkgdGhyZWFkcywgYW5kCisgIC8vIEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSB3aWxsIGNhbGwgaW50byB8dmlkZW9fcmVuZGVyZXJffC4gIFRoaXMgbXV0ZXgKKyAgLy8gb25seSBuZWVkcyB0byBiZSBoZWxkIHdoZW4gYW55IHRocmVhZCBjcmVhdGVzIG9yIHJlc2V0cyB8dmlkZW9fcmVuZGVyZXJffCwKKyAgLy8gYW5kIHdoZW4gR2V0Q3VycmVudERlY29kZVRhcmdldCgpIHJlYWRzIGZyb20gaXQuICBUaGlzIGlzIGJlY2F1c2UKKyAgLy8gR2V0Q3VycmVudERlY29kZVRhcmdldCgpIHdvbid0IG1vZGlmeSB8dmlkZW9fcmVuZGVyZXJffCwgYW5kIGFsbCBvdGhlcgorICAvLyBhY2Nlc3NlcyBhcmUgaGFwcGVuaW5nIGZyb20gdGhlIHNhbWUgdGhyZWFkLgorICA6OnN0YXJib2FyZDo6TXV0ZXggdmlkZW9fcmVuZGVyZXJfZXhpc3RlbmNlX211dGV4XzsKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGVfOworICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBkZWNvZGVfdGFyZ2V0X3Byb3ZpZGVyXzsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgKaW5kZXggOGYyZjFkYi4uYzdiOGFiZSAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fZGVjb2Rlcl9pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaApAQCAtMTUsOCArMTUsMTAgQEAKICNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9WSURFT19ERUNPREVSX0lOVEVSTkFMX0hfCiAjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfVklERU9fREVDT0RFUl9JTlRFUk5BTF9IXwogCisjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9pbnB1dF9idWZmZXJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvam9iX3F1ZXVlLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3ZpZGVvX2ZyYW1lX2ludGVybmFsLmgiCiAKIG5hbWVzcGFjZSBzdGFyYm9hcmQgewpAQCAtNjIsMTkgKzY0LDQxIEBACiAgIC8vIGlzIGNhbGxlZCBhZ2Fpbi4KICAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOwogCi0gIC8vIFRoaXMgZnVuY3Rpb24gaXMgcGVyaW9kaWNhbGx5IGNhbGxlZCBvbiB0aGUgcGxheWVyIHdvcmtlciB0aHJlYWQgc28gdGhlCi0gIC8vIGRlY29kZXIgY2FuIGRvIHNvbWUgcHJvY2VzcyBpbnNpZGUgaXQgd2hlbiBuZWNlc3NhcnkuCi0gIHZpcnR1YWwgdm9pZCBVcGRhdGUoKSB7fQotCiAgIC8vIEluIGNlcnRhaW4gY2FzZXMsIGEgZGVjb2RlciBtYXkgYmVuZWZpdCBmcm9tIGtub3dpbmcgdGhlIGN1cnJlbnQgdGltZSBvZgogICAvLyB0aGUgYXVkaW8gZGVjb2RlciB0aGF0IGl0IGlzIGZvbGxvd2luZy4gIFRoaXMgb3B0aW9uYWwgZnVuY3Rpb24gcHJvdmlkZXMKICAgLy8gdGhlIHJlbmRlcmVyIHRoYXQgb3ducyB0aGUgZGVjb2RlciBhbiBvcHBvcnR1bml0eSB0byBwcm92aWRlIHRoaXMKICAgLy8gaW5mb3JtYXRpb24gdG8gdGhlIGRlY29kZXIuCiAgIHZpcnR1YWwgdm9pZCBTZXRDdXJyZW50VGltZShTYk1lZGlhVGltZSBjdXJyZW50X3RpbWUpIHt9CiAKKyAgLy8gQSBwYXJhbWV0ZXIgc3RydWN0IHRvIHBhc3MgaW50byB8Q3JlYXRlfC4KKyAgc3RydWN0IFBhcmFtZXRlcnMgeworICAgIFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjOworICAgIFNiRHJtU3lzdGVtIGRybV9zeXN0ZW07CisgICAgSm9iUXVldWUqIGpvYl9xdWV1ZTsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgICBTYlBsYXllck91dHB1dE1vZGUgb3V0cHV0X21vZGU7CisgICAgU2JEZWNvZGVUYXJnZXRQcm92aWRlciogZGVjb2RlX3RhcmdldF9wcm92aWRlcjsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIH07CisKICAgLy8gSW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbiBoYXMgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gdG8gY3JlYXRlIGEgdmlkZW8KICAgLy8gZGVjb2Rlci4KLSAgc3RhdGljIFZpZGVvRGVjb2RlciogQ3JlYXRlKFNiTWVkaWFWaWRlb0NvZGVjIHZpZGVvX2NvZGVjKTsKKyAgc3RhdGljIFZpZGVvRGVjb2RlciogQ3JlYXRlKGNvbnN0IFBhcmFtZXRlcnMmIHBhcmFtZXRlcnMpOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gMworICAvLyBNYXkgYmUgY2FsbGVkIGZyb20gYW4gYXJiaXRyYXJ5IHRocmVhZCAoZS5nLiBhIHJlbmRlcmVyIHRocmVhZCkuCisgIHZpcnR1YWwgU2JEZWNvZGVUYXJnZXQgR2V0Q3VycmVudERlY29kZVRhcmdldCgpIHsKKyAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKKyAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSAzCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgLy8gSW5kaXZpZHVhbCBpbXBsZW1lbnRhdGlvbnMgbXVzdCBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0byBpbmRpY2F0ZSB3aGljaAorICAvLyBvdXRwdXQgbW9kZXMgdGhleSBzdXBwb3J0LgorICBzdGF0aWMgYm9vbCBPdXRwdXRNb2RlU3VwcG9ydGVkKFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYk1lZGlhVmlkZW9Db2RlYyBjb2RlYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gMwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmVjYmZjYwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuY2MKQEAgLTAsMCArMSwxNjUgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ltcGxfaW50ZXJuYWwuaCIKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKworbmFtZXNwYWNlIHN0YXJib2FyZCB7CituYW1lc3BhY2Ugc2hhcmVkIHsKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHBsYXllciB7CituYW1lc3BhY2UgZmlsdGVyIHsKKworVmlkZW9SZW5kZXJlckltcGw6OlZpZGVvUmVuZGVyZXJJbXBsKHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyKQorICAgIDogc2Vla2luZ18oZmFsc2UpLAorICAgICAgc2Vla2luZ190b19wdHNfKDApLAorICAgICAgZW5kX29mX3N0cmVhbV93cml0dGVuXyhmYWxzZSksCisgICAgICBuZWVkX21vcmVfaW5wdXRfKHRydWUpLAorICAgICAgZHJvcHBlZF9mcmFtZXNfKDApLAorICAgICAgZGVjb2Rlcl8oZGVjb2Rlci5QYXNzKCkpIHsKKyAgU0JfRENIRUNLKGRlY29kZXJfICE9IE5VTEwpOworICBkZWNvZGVyXy0+U2V0SG9zdCh0aGlzKTsKK30KKwordm9pZCBWaWRlb1JlbmRlcmVySW1wbDo6V3JpdGVTYW1wbGUoY29uc3QgSW5wdXRCdWZmZXImIGlucHV0X2J1ZmZlcikgeworICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgaWYgKGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8pIHsKKyAgICBTQl9MT0coRVJST1IpIDw8ICJBcHBlbmRpbmcgdmlkZW8gc2FtcGxlIGF0ICIgPDwgaW5wdXRfYnVmZmVyLnB0cygpCisgICAgICAgICAgICAgICAgICA8PCAiIGFmdGVyIEVPUyByZWFjaGVkLiI7CisgICAgcmV0dXJuOworICB9CisKKyAgeworICAgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOworICAgIG5lZWRfbW9yZV9pbnB1dF8gPSBmYWxzZTsKKyAgfQorCisgIGRlY29kZXJfLT5Xcml0ZUlucHV0QnVmZmVyKGlucHV0X2J1ZmZlcik7Cit9CisKK3ZvaWQgVmlkZW9SZW5kZXJlckltcGw6OldyaXRlRW5kT2ZTdHJlYW0oKSB7CisgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKworICBTQl9MT0dfSUYoV0FSTklORywgZW5kX29mX3N0cmVhbV93cml0dGVuXykKKyAgICAgIDw8ICJUcnkgdG8gd3JpdGUgRU9TIGFmdGVyIEVPUyBpcyByZWFjaGVkIjsKKyAgaWYgKGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8pIHsKKyAgICByZXR1cm47CisgIH0KKyAgZW5kX29mX3N0cmVhbV93cml0dGVuXyA9IHRydWU7CisgIGRlY29kZXJfLT5Xcml0ZUVuZE9mU3RyZWFtKCk7Cit9CisKK3ZvaWQgVmlkZW9SZW5kZXJlckltcGw6OlNlZWsoU2JNZWRpYVRpbWUgc2Vla190b19wdHMpIHsKKyAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOworICBTQl9EQ0hFQ0soc2Vla190b19wdHMgPj0gMCk7CisKKyAgZGVjb2Rlcl8tPlJlc2V0KCk7CisKKyAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7CisKKyAgc2Vla2luZ190b19wdHNfID0gc3RkOjptYXg8U2JNZWRpYVRpbWU+KHNlZWtfdG9fcHRzLCAwKTsKKyAgc2Vla2luZ18gPSB0cnVlOworICBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fID0gZmFsc2U7CisKKyAgZnJhbWVzXy5jbGVhcigpOworfQorCitzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IFZpZGVvUmVuZGVyZXJJbXBsOjpHZXRDdXJyZW50RnJhbWUoCisgICAgU2JNZWRpYVRpbWUgbWVkaWFfdGltZSkgeworICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7CisKKyAgZGVjb2Rlcl8tPlNldEN1cnJlbnRUaW1lKG1lZGlhX3RpbWUpOworCisgIGlmIChmcmFtZXNfLmVtcHR5KCkpIHsKKyAgICByZXR1cm4gbGFzdF9kaXNwbGF5ZWRfZnJhbWVfOworICB9CisgIC8vIFJlbW92ZSBhbnkgZnJhbWVzIHdpdGggdGltZXN0YW1wcyBlYXJsaWVyIHRoYW4gfG1lZGlhX3RpbWV8LCBidXQgYWx3YXlzCisgIC8vIGtlZXAgYXQgbGVhc3Qgb25lIG9mIHRoZSBmcmFtZXMuCisgIHdoaWxlIChmcmFtZXNfLnNpemUoKSA+IDEgJiYgZnJhbWVzXy5mcm9udCgpLT5wdHMoKSA8IG1lZGlhX3RpbWUpIHsKKyAgICBpZiAoZnJhbWVzXy5mcm9udCgpICE9IGxhc3RfZGlzcGxheWVkX2ZyYW1lXykgeworICAgICAgKytkcm9wcGVkX2ZyYW1lc187CisgICAgfQorICAgIGZyYW1lc18ucG9wX2Zyb250KCk7CisgIH0KKworICBsYXN0X2Rpc3BsYXllZF9mcmFtZV8gPSBmcmFtZXNfLmZyb250KCk7CisgIHJldHVybiBsYXN0X2Rpc3BsYXllZF9mcmFtZV87Cit9CisKK2Jvb2wgVmlkZW9SZW5kZXJlckltcGw6OklzRW5kT2ZTdHJlYW1QbGF5ZWQoKSBjb25zdCB7CisgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgcmV0dXJuIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8gJiYgZnJhbWVzXy5zaXplKCkgPD0gMTsKK30KKworYm9vbCBWaWRlb1JlbmRlcmVySW1wbDo6Q2FuQWNjZXB0TW9yZURhdGEoKSBjb25zdCB7CisgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7CisgIHJldHVybiBmcmFtZXNfLnNpemUoKSA8IGtNYXhDYWNoZWRGcmFtZXMgJiYgIWVuZF9vZl9zdHJlYW1fd3JpdHRlbl8gJiYKKyAgICAgICAgIG5lZWRfbW9yZV9pbnB1dF87Cit9CisKK2Jvb2wgVmlkZW9SZW5kZXJlckltcGw6OklzU2Vla2luZ0luUHJvZ3Jlc3MoKSBjb25zdCB7CisgIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKKyAgcmV0dXJuIHNlZWtpbmdfOworfQorCit2b2lkIFZpZGVvUmVuZGVyZXJJbXBsOjpPbkRlY29kZXJTdGF0dXNVcGRhdGUoCisgICAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzLAorICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKSB7CisgIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOworCisgIGlmIChmcmFtZSkgeworICAgIGJvb2wgZnJhbWVfdG9vX2Vhcmx5ID0gZmFsc2U7CisgICAgaWYgKHNlZWtpbmdfKSB7CisgICAgICBpZiAoZnJhbWUtPklzRW5kT2ZTdHJlYW0oKSkgeworICAgICAgICBzZWVraW5nXyA9IGZhbHNlOworICAgICAgfSBlbHNlIGlmIChmcmFtZS0+cHRzKCkgPCBzZWVraW5nX3RvX3B0c18pIHsKKyAgICAgICAgZnJhbWVfdG9vX2Vhcmx5ID0gdHJ1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgaWYgKCFmcmFtZV90b29fZWFybHkpIHsKKyAgICAgIGZyYW1lc18ucHVzaF9iYWNrKGZyYW1lKTsKKyAgICB9CisKKyAgICBpZiAoc2Vla2luZ18gJiYgZnJhbWVzXy5zaXplKCkgPj0ga1ByZXJvbGxGcmFtZXMpIHsKKyAgICAgIHNlZWtpbmdfID0gZmFsc2U7CisgICAgfQorICB9CisKKyAgbmVlZF9tb3JlX2lucHV0XyA9IChzdGF0dXMgPT0gVmlkZW9EZWNvZGVyOjprTmVlZE1vcmVJbnB1dCk7Cit9CisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KK1NiRGVjb2RlVGFyZ2V0IFZpZGVvUmVuZGVyZXJJbXBsOjpHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgeworICBpZiAoZGVjb2Rlcl8pIHsKKyAgICByZXR1cm4gZGVjb2Rlcl8tPkdldEN1cnJlbnREZWNvZGVUYXJnZXQoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKKyAgfQorfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworLy8gc3RhdGljCitzY29wZWRfcHRyPFZpZGVvUmVuZGVyZXI+IFZpZGVvUmVuZGVyZXI6OkNyZWF0ZSgKKyAgICBzY29wZWRfcHRyPFZpZGVvRGVjb2Rlcj4gdmlkZW9fZGVjb2RlcikgeworICByZXR1cm4gc2NvcGVkX3B0cjxWaWRlb1JlbmRlcmVyPihuZXcgVmlkZW9SZW5kZXJlckltcGwodmlkZW9fZGVjb2Rlci5QYXNzKCkpKTsKK30KKworfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgorfSAgLy8gbmFtZXNwYWNlIHBsYXllcgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZApkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW1wbF9pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEyYmY1NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbXBsX2ludGVybmFsLmgKQEAgLTAsMCArMSwxMDQgQEAKKy8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpZm5kZWYgU1RBUkJPQVJEX1NIQVJFRF9TVEFSQk9BUkRfUExBWUVSX0ZJTFRFUl9WSURFT19SRU5ERVJFUl9JTVBMX0lOVEVSTkFMX0hfCisjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfVklERU9fUkVOREVSRVJfSU1QTF9JTlRFUk5BTF9IXworCisjaW5jbHVkZSA8bGlzdD4KKworI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVkaWEuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbXV0ZXguaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL2ludGVybmFsX29ubHkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX2RlY29kZXJfaW50ZXJuYWwuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2lucHV0X2J1ZmZlcl9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci92aWRlb19mcmFtZV9pbnRlcm5hbC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3RocmVhZF9jaGVja2VyLmgiCisKK25hbWVzcGFjZSBzdGFyYm9hcmQgeworbmFtZXNwYWNlIHNoYXJlZCB7CituYW1lc3BhY2Ugc3RhcmJvYXJkIHsKK25hbWVzcGFjZSBwbGF5ZXIgeworbmFtZXNwYWNlIGZpbHRlciB7CisKK2NsYXNzIFZpZGVvUmVuZGVyZXJJbXBsIDogcHVibGljIFZpZGVvUmVuZGVyZXIgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgVmlkZW9SZW5kZXJlckltcGwoc2NvcGVkX3B0cjxWaWRlb0RlY29kZXI+IGRlY29kZXIpOworCisgIGludCBHZXREcm9wcGVkRnJhbWVzKCkgY29uc3QgU0JfT1ZFUlJJREUgeyByZXR1cm4gZHJvcHBlZF9mcmFtZXNfOyB9CisKKyAgdm9pZCBXcml0ZVNhbXBsZShjb25zdCBJbnB1dEJ1ZmZlciYgaW5wdXRfYnVmZmVyKSBTQl9PVkVSUklERTsKKyAgdm9pZCBXcml0ZUVuZE9mU3RyZWFtKCkgU0JfT1ZFUlJJREU7CisKKyAgdm9pZCBTZWVrKFNiTWVkaWFUaW1lIHNlZWtfdG9fcHRzKSBTQl9PVkVSUklERTsKKworICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IEdldEN1cnJlbnRGcmFtZShTYk1lZGlhVGltZSBtZWRpYV90aW1lKSBTQl9PVkVSUklERTsKKworICBib29sIElzRW5kT2ZTdHJlYW1Xcml0dGVuKCkgY29uc3QgU0JfT1ZFUlJJREUgeworICAgIHJldHVybiBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fOworICB9CisgIGJvb2wgSXNFbmRPZlN0cmVhbVBsYXllZCgpIGNvbnN0IFNCX09WRVJSSURFOworICBib29sIENhbkFjY2VwdE1vcmVEYXRhKCkgY29uc3QgU0JfT1ZFUlJJREU7CisgIGJvb2wgSXNTZWVraW5nSW5Qcm9ncmVzcygpIGNvbnN0IFNCX09WRVJSSURFOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSBTQl9PVkVSUklERTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKKyBwcml2YXRlOgorICB0eXBlZGVmIHN0ZDo6bGlzdDxzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+ID4gRnJhbWVzOworCisgIC8vIFByZXJvbGwgY29uc2lkZXJlZCBmaW5pc2hlZCBhZnRlciBlaXRoZXIga1ByZXJvbGxGcmFtZXMgaXMgY2FjaGVkIG9yIEVPUworICAvLyBpcyByZWFjaGVkLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVyb2xsRnJhbWVzID0gODsKKyAgLy8gU2V0IGEgc29mdCBsaW1pdCBmb3IgdGhlIG1heCB2aWRlbyBmcmFtZXMgd2UgY2FuIGNhY2hlIHNvIHdlIGNhbjoKKyAgLy8gMS4gQXZvaWQgdXNpbmcgdG9vIG11Y2ggbWVtb3J5LgorICAvLyAyLiBIYXZlIHRoZSBmcmFtZSBjYWNoZSBmdWxsIHRvIHNpbXVsYXRlIHRoZSBzdGF0ZSB0aGF0IHRoZSByZW5kZXJlciBjYW4KKyAgLy8gICAgbm8gbG9uZ2VyIGFjY2VwdCBtb3JlIGRhdGEuCisgIHN0YXRpYyBjb25zdCBzaXplX3Qga01heENhY2hlZEZyYW1lcyA9IDEyOworCisgIC8vIFZpZGVvRGVjb2Rlcjo6SG9zdCBtZXRob2QuCisgIHZvaWQgT25EZWNvZGVyU3RhdHVzVXBkYXRlKFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUpCisgICAgICBTQl9PVkVSUklERTsKKworICBUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKKyAgOjpzdGFyYm9hcmQ6Ok11dGV4IG11dGV4XzsKKworICBib29sIHNlZWtpbmdfOworICBGcmFtZXMgZnJhbWVzXzsKKworICAvLyBEdXJpbmcgc2Vla2luZywgYWxsIGZyYW1lcyBpbnNpZGUgfGZyYW1lc198IHdpbGwgYmUgY2xlYXJlZCBidXQgdGhlIGFwcAorICAvLyBzaG91bGQgc3RpbGwgZGlzcGxheSB0aGUgbGFzdCBmcmFtZSBpdCBpcyByZW5kZXJpbmcuICBUaGlzIGZyYW1lIHdpbGwgYmUKKyAgLy8ga2VwdCBpbnNpZGUgfGxhc3RfZGlzcGxheWVkX2ZyYW1lX3wuICBJdCBpcyBhbiBlbXB0eS9ibGFjayBmcmFtZSBiZWZvcmUgdGhlCisgIC8vIHZpZGVvIGlzIHN0YXJ0ZWQuCisgIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gbGFzdF9kaXNwbGF5ZWRfZnJhbWVfOworCisgIFNiTWVkaWFUaW1lIHNlZWtpbmdfdG9fcHRzXzsKKyAgYm9vbCBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fOworICBib29sIG5lZWRfbW9yZV9pbnB1dF87CisgIGludCBkcm9wcGVkX2ZyYW1lc187CisKKyAgc2NvcGVkX3B0cjxWaWRlb0RlY29kZXI+IGRlY29kZXJfOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGZpbHRlcgorfSAgLy8gbmFtZXNwYWNlIHBsYXllcgorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorfSAgLy8gbmFtZXNwYWNlIHNoYXJlZAorfSAgLy8gbmFtZXNwYWNlIHN0YXJib2FyZAorCisjZW5kaWYgIC8vIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfVklERU9fUkVOREVSRVJfSU1QTF9JTlRFUk5BTF9IXwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjAyNWRmZi4uMDAwMDAwMAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1NSArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oIgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotCi1uYW1lc3BhY2Ugc3RhcmJvYXJkIHsKLW5hbWVzcGFjZSBzaGFyZWQgewotbmFtZXNwYWNlIHN0YXJib2FyZCB7Ci1uYW1lc3BhY2UgcGxheWVyIHsKLW5hbWVzcGFjZSBmaWx0ZXIgewotCi1WaWRlb1JlbmRlcmVyOjpWaWRlb1JlbmRlcmVyKHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyKQotICAgIDogc2Vla2luZ18oZmFsc2UpLAotICAgICAgc2Vla2luZ190b19wdHNfKDApLAotICAgICAgZW5kX29mX3N0cmVhbV93cml0dGVuXyhmYWxzZSksCi0gICAgICBuZWVkX21vcmVfaW5wdXRfKHRydWUpLAotICAgICAgZHJvcHBlZF9mcmFtZXNfKDApLAotICAgICAgZGVjb2Rlcl8oZGVjb2Rlci5QYXNzKCkpIHsKLSAgU0JfRENIRUNLKGRlY29kZXJfICE9IE5VTEwpOwotICBkZWNvZGVyXy0+U2V0SG9zdCh0aGlzKTsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyOjpXcml0ZVNhbXBsZShjb25zdCBJbnB1dEJ1ZmZlciYgaW5wdXRfYnVmZmVyKSB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLQotICBpZiAoZW5kX29mX3N0cmVhbV93cml0dGVuXykgewotICAgIFNCX0xPRyhFUlJPUikgPDwgIkFwcGVuZGluZyB2aWRlbyBzYW1wbGUgYXQgIiA8PCBpbnB1dF9idWZmZXIucHRzKCkKLSAgICAgICAgICAgICAgICAgIDw8ICIgYWZ0ZXIgRU9TIHJlYWNoZWQuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICB7Ci0gICAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0gICAgbmVlZF9tb3JlX2lucHV0XyA9IGZhbHNlOwotICB9Ci0KLSAgZGVjb2Rlcl8tPldyaXRlSW5wdXRCdWZmZXIoaW5wdXRfYnVmZmVyKTsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyOjpXcml0ZUVuZE9mU3RyZWFtKCkgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0KLSAgU0JfTE9HX0lGKFdBUk5JTkcsIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8pCi0gICAgICA8PCAiVHJ5IHRvIHdyaXRlIEVPUyBhZnRlciBFT1MgaXMgcmVhY2hlZCI7Ci0gIGlmIChlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8gPSB0cnVlOwotICBkZWNvZGVyXy0+V3JpdGVFbmRPZlN0cmVhbSgpOwotfQotCi12b2lkIFZpZGVvUmVuZGVyZXI6OlNlZWsoU2JNZWRpYVRpbWUgc2Vla190b19wdHMpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBTQl9EQ0hFQ0soc2Vla190b19wdHMgPj0gMCk7Ci0KLSAgZGVjb2Rlcl8tPlJlc2V0KCk7Ci0KLSAgU2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7Ci0KLSAgc2Vla2luZ190b19wdHNfID0gc3RkOjptYXg8U2JNZWRpYVRpbWU+KHNlZWtfdG9fcHRzLCAwKTsKLSAgc2Vla2luZ18gPSB0cnVlOwotICBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fID0gZmFsc2U7Ci0KLSAgZnJhbWVzXy5jbGVhcigpOwotfQotCi12b2lkIFZpZGVvUmVuZGVyZXI6OlVwZGF0ZSgpIHsKLSAgaWYgKGRlY29kZXJfKSB7Ci0gICAgZGVjb2Rlcl8tPlVwZGF0ZSgpOwotICB9Ci19Ci0KLXNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gVmlkZW9SZW5kZXJlcjo6R2V0Q3VycmVudEZyYW1lKAotICAgIFNiTWVkaWFUaW1lIG1lZGlhX3RpbWUpIHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotCi0gIGRlY29kZXJfLT5TZXRDdXJyZW50VGltZShtZWRpYV90aW1lKTsKLQotICBpZiAoZnJhbWVzXy5lbXB0eSgpKSB7Ci0gICAgcmV0dXJuIGxhc3RfZGlzcGxheWVkX2ZyYW1lXzsKLSAgfQotICAvLyBSZW1vdmUgYW55IGZyYW1lcyB3aXRoIHRpbWVzdGFtcHMgZWFybGllciB0aGFuIHxtZWRpYV90aW1lfCwgYnV0IGFsd2F5cwotICAvLyBrZWVwIGF0IGxlYXN0IG9uZSBvZiB0aGUgZnJhbWVzLgotICB3aGlsZSAoZnJhbWVzXy5zaXplKCkgPiAxICYmIGZyYW1lc18uZnJvbnQoKS0+cHRzKCkgPCBtZWRpYV90aW1lKSB7Ci0gICAgaWYgKGZyYW1lc18uZnJvbnQoKSAhPSBsYXN0X2Rpc3BsYXllZF9mcmFtZV8pIHsKLSAgICAgICsrZHJvcHBlZF9mcmFtZXNfOwotICAgIH0KLSAgICBmcmFtZXNfLnBvcF9mcm9udCgpOwotICB9Ci0KLSAgbGFzdF9kaXNwbGF5ZWRfZnJhbWVfID0gZnJhbWVzXy5mcm9udCgpOwotICByZXR1cm4gbGFzdF9kaXNwbGF5ZWRfZnJhbWVfOwotfQotCi1ib29sIFZpZGVvUmVuZGVyZXI6OklzRW5kT2ZTdHJlYW1QbGF5ZWQoKSBjb25zdCB7Ci0gIFNCX0RDSEVDSyh0aHJlYWRfY2hlY2tlcl8uQ2FsbGVkT25WYWxpZFRocmVhZCgpKTsKLSAgcmV0dXJuIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl8gJiYgZnJhbWVzXy5zaXplKCkgPD0gMTsKLX0KLQotYm9vbCBWaWRlb1JlbmRlcmVyOjpDYW5BY2NlcHRNb3JlRGF0YSgpIGNvbnN0IHsKLSAgU0JfRENIRUNLKHRocmVhZF9jaGVja2VyXy5DYWxsZWRPblZhbGlkVGhyZWFkKCkpOwotICBTY29wZWRMb2NrIGxvY2sobXV0ZXhfKTsKLSAgcmV0dXJuIGZyYW1lc18uc2l6ZSgpIDwga01heENhY2hlZEZyYW1lcyAmJiAhZW5kX29mX3N0cmVhbV93cml0dGVuXyAmJgotICAgICAgICAgbmVlZF9tb3JlX2lucHV0XzsKLX0KLQotYm9vbCBWaWRlb1JlbmRlcmVyOjpJc1NlZWtpbmdJblByb2dyZXNzKCkgY29uc3QgewotICBTQl9EQ0hFQ0sodGhyZWFkX2NoZWNrZXJfLkNhbGxlZE9uVmFsaWRUaHJlYWQoKSk7Ci0gIHJldHVybiBzZWVraW5nXzsKLX0KLQotdm9pZCBWaWRlb1JlbmRlcmVyOjpPbkRlY29kZXJTdGF0dXNVcGRhdGUoCi0gICAgVmlkZW9EZWNvZGVyOjpTdGF0dXMgc3RhdHVzLAotICAgIGNvbnN0IHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4mIGZyYW1lKSB7Ci0gIFNjb3BlZExvY2sgbG9jayhtdXRleF8pOwotCi0gIGlmIChmcmFtZSkgewotICAgIGJvb2wgZnJhbWVfdG9vX2Vhcmx5ID0gZmFsc2U7Ci0gICAgaWYgKHNlZWtpbmdfKSB7Ci0gICAgICBpZiAoZnJhbWUtPklzRW5kT2ZTdHJlYW0oKSkgewotICAgICAgICBzZWVraW5nXyA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChmcmFtZS0+cHRzKCkgPCBzZWVraW5nX3RvX3B0c18pIHsKLSAgICAgICAgZnJhbWVfdG9vX2Vhcmx5ID0gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKCFmcmFtZV90b29fZWFybHkpIHsKLSAgICAgIGZyYW1lc18ucHVzaF9iYWNrKGZyYW1lKTsKLSAgICB9Ci0KLSAgICBpZiAoc2Vla2luZ18gJiYgZnJhbWVzXy5zaXplKCkgPj0ga1ByZXJvbGxGcmFtZXMpIHsKLSAgICAgIHNlZWtpbmdfID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgbmVlZF9tb3JlX2lucHV0XyA9IChzdGF0dXMgPT0gVmlkZW9EZWNvZGVyOjprTmVlZE1vcmVJbnB1dCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBmaWx0ZXIKLX0gIC8vIG5hbWVzcGFjZSBwbGF5ZXIKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKLX0gIC8vIG5hbWVzcGFjZSBzaGFyZWQKLX0gIC8vIG5hbWVzcGFjZSBzdGFyYm9hcmQKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19yZW5kZXJlcl9pbnRlcm5hbC5oCmluZGV4IDBkNTZmY2YuLmFmZjk2YzIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvZmlsdGVyL3ZpZGVvX3JlbmRlcmVyX2ludGVybmFsLmgKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9maWx0ZXIvdmlkZW9fcmVuZGVyZXJfaW50ZXJuYWwuaApAQCAtMTUsOCArMTUsNiBAQAogI2lmbmRlZiBTVEFSQk9BUkRfU0hBUkVEX1NUQVJCT0FSRF9QTEFZRVJfRklMVEVSX1ZJREVPX1JFTkRFUkVSX0lOVEVSTkFMX0hfCiAjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9GSUxURVJfVklERU9fUkVOREVSRVJfSU5URVJOQUxfSF8KIAotI2luY2x1ZGUgPGxpc3Q+Ci0KICNpbmNsdWRlICJzdGFyYm9hcmQvY29tbW9uL3Njb3BlZF9wdHIuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCkBAIC0zMyw2MSArMzEsMjcgQEAKIG5hbWVzcGFjZSBwbGF5ZXIgewogbmFtZXNwYWNlIGZpbHRlciB7CiAKLWNsYXNzIFZpZGVvUmVuZGVyZXIgOiBwcml2YXRlIFZpZGVvRGVjb2Rlcjo6SG9zdCB7CitjbGFzcyBWaWRlb1JlbmRlcmVyIDogcHJvdGVjdGVkIFZpZGVvRGVjb2Rlcjo6SG9zdCB7CiAgcHVibGljOgotICBleHBsaWNpdCBWaWRlb1JlbmRlcmVyKHNjb3BlZF9wdHI8VmlkZW9EZWNvZGVyPiBkZWNvZGVyKTsKKyAgdmlydHVhbCB+VmlkZW9SZW5kZXJlcigpIHt9CiAKLSAgYm9vbCBpc192YWxpZCgpIGNvbnN0IHsgcmV0dXJuIHRydWU7IH0KLSAgaW50IEdldERyb3BwZWRGcmFtZXMoKSBjb25zdCB7IHJldHVybiBkcm9wcGVkX2ZyYW1lc187IH0KKyAgdmlydHVhbCBpbnQgR2V0RHJvcHBlZEZyYW1lcygpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIFdyaXRlU2FtcGxlKGNvbnN0IElucHV0QnVmZmVyJiBpbnB1dF9idWZmZXIpID0gMDsKKyAgdmlydHVhbCB2b2lkIFdyaXRlRW5kT2ZTdHJlYW0oKSA9IDA7CisgIHZpcnR1YWwgdm9pZCBTZWVrKFNiTWVkaWFUaW1lIHNlZWtfdG9fcHRzKSA9IDA7CisgIHZpcnR1YWwgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBHZXRDdXJyZW50RnJhbWUoU2JNZWRpYVRpbWUgbWVkaWFfdGltZSkgPSAwOworICB2aXJ0dWFsIGJvb2wgSXNFbmRPZlN0cmVhbVdyaXR0ZW4oKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBJc0VuZE9mU3RyZWFtUGxheWVkKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGJvb2wgQ2FuQWNjZXB0TW9yZURhdGEoKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgYm9vbCBJc1NlZWtpbmdJblByb2dyZXNzKCkgY29uc3QgPSAwOworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICB2aXJ0dWFsIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSA9IDA7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogCi0gIHZvaWQgV3JpdGVTYW1wbGUoY29uc3QgSW5wdXRCdWZmZXImIGlucHV0X2J1ZmZlcik7Ci0gIHZvaWQgV3JpdGVFbmRPZlN0cmVhbSgpOwotCi0gIHZvaWQgU2VlayhTYk1lZGlhVGltZSBzZWVrX3RvX3B0cyk7Ci0gIHZvaWQgVXBkYXRlKCk7Ci0KLSAgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiBHZXRDdXJyZW50RnJhbWUoU2JNZWRpYVRpbWUgbWVkaWFfdGltZSk7Ci0KLSAgYm9vbCBJc0VuZE9mU3RyZWFtV3JpdHRlbigpIGNvbnN0IHsgcmV0dXJuIGVuZF9vZl9zdHJlYW1fd3JpdHRlbl87IH0KLSAgYm9vbCBJc0VuZE9mU3RyZWFtUGxheWVkKCkgY29uc3Q7Ci0gIGJvb2wgQ2FuQWNjZXB0TW9yZURhdGEoKSBjb25zdDsKLSAgYm9vbCBJc1NlZWtpbmdJblByb2dyZXNzKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIHN0ZDo6bGlzdDxzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+ID4gRnJhbWVzOwotCi0gIC8vIFByZXJvbGwgY29uc2lkZXJlZCBmaW5pc2hlZCBhZnRlciBlaXRoZXIga1ByZXJvbGxGcmFtZXMgaXMgY2FjaGVkIG9yIEVPUwotICAvLyBpcyByZWFjaGVkLgotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtQcmVyb2xsRnJhbWVzID0gODsKLSAgLy8gU2V0IGEgc29mdCBsaW1pdCBmb3IgdGhlIG1heCB2aWRlbyBmcmFtZXMgd2UgY2FuIGNhY2hlIHNvIHdlIGNhbjoKLSAgLy8gMS4gQXZvaWQgdXNpbmcgdG9vIG11Y2ggbWVtb3J5LgotICAvLyAyLiBIYXZlIHRoZSBmcmFtZSBjYWNoZSBmdWxsIHRvIHNpbXVsYXRlIHRoZSBzdGF0ZSB0aGF0IHRoZSByZW5kZXJlciBjYW4KLSAgLy8gICAgbm8gbG9uZ2VyIGFjY2VwdCBtb3JlIGRhdGEuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga01heENhY2hlZEZyYW1lcyA9IDEyOwotCi0gIC8vIFZpZGVvRGVjb2Rlcjo6SG9zdCBtZXRob2QuCi0gIHZvaWQgT25EZWNvZGVyU3RhdHVzVXBkYXRlKFZpZGVvRGVjb2Rlcjo6U3RhdHVzIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2NvcGVkX3JlZnB0cjxWaWRlb0ZyYW1lPiYgZnJhbWUpCi0gICAgICBTQl9PVkVSUklERTsKLQotICBUaHJlYWRDaGVja2VyIHRocmVhZF9jaGVja2VyXzsKLSAgOjpzdGFyYm9hcmQ6Ok11dGV4IG11dGV4XzsKLQotICBib29sIHNlZWtpbmdfOwotICBGcmFtZXMgZnJhbWVzXzsKLQotICAvLyBEdXJpbmcgc2Vla2luZywgYWxsIGZyYW1lcyBpbnNpZGUgfGZyYW1lc198IHdpbGwgYmUgY2xlYXJlZCBidXQgdGhlIGFwcAotICAvLyBzaG91bGQgc3RpbGwgZGlzcGxheSB0aGUgbGFzdCBmcmFtZSBpdCBpcyByZW5kZXJpbmcuICBUaGlzIGZyYW1lIHdpbGwgYmUKLSAgLy8ga2VwdCBpbnNpZGUgfGxhc3RfZGlzcGxheWVkX2ZyYW1lX3wuICBJdCBpcyBhbiBlbXB0eS9ibGFjayBmcmFtZSBiZWZvcmUgdGhlCi0gIC8vIHZpZGVvIGlzIHN0YXJ0ZWQuCi0gIHNjb3BlZF9yZWZwdHI8VmlkZW9GcmFtZT4gbGFzdF9kaXNwbGF5ZWRfZnJhbWVfOwotCi0gIFNiTWVkaWFUaW1lIHNlZWtpbmdfdG9fcHRzXzsKLSAgYm9vbCBlbmRfb2Zfc3RyZWFtX3dyaXR0ZW5fOwotICBib29sIG5lZWRfbW9yZV9pbnB1dF87Ci0gIGludCBkcm9wcGVkX2ZyYW1lc187Ci0KLSAgc2NvcGVkX3B0cjxWaWRlb0RlY29kZXI+IGRlY29kZXJfOworICAvLyBJbmRpdmlkdWFsIGltcGxlbWVudGF0aW9uIGhhcyB0byBpbXBsZW1lbnQgdGhpcyBmdW5jdGlvbiB0byBjcmVhdGUgYQorICAvLyBWaWRlb1JlbmRlcmVyLgorICBzdGF0aWMgc2NvcGVkX3B0cjxWaWRlb1JlbmRlcmVyPiBDcmVhdGUoCisgICAgICBzY29wZWRfcHRyPFZpZGVvRGVjb2Rlcj4gdmlkZW9fZGVjb2Rlcik7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgZmlsdGVyCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9jcmVhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9jcmVhdGUuY2MKaW5kZXggMDY4MDBhMS4uNWIwZTY0YyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfY3JlYXRlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2NyZWF0ZS5jYwpAQCAtMzUsMTUgKzM1LDE2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllckRlY29kZXJTdGF0dXNGdW5jIGRlY29kZXJfc3RhdHVzX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllclN0YXR1c0Z1bmMgcGxheWVyX3N0YXR1c19mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogY29udGV4dAotI2lmIFNCX1ZFUlNJT04oMykKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSAzCiAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiBwcm92aWRlcgotI2VuZGlmCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IDMKICAgICAgICAgICAgICAgICAgICAgICAgICkgewogICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHdpbmRvdyk7Ci0jaWYgU0JfVkVSU0lPTigzKQotICBTQl9VTlJFRkVSRU5DRURfUEFSQU1FVEVSKHByb3ZpZGVyKTsKLSNlbmRpZgogCiAgIGlmIChhdWRpb19jb2RlYyAhPSBrU2JNZWRpYUF1ZGlvQ29kZWNBYWMpIHsKICAgICBTQl9MT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCBhdWRpbyBjb2RlYyAiIDw8IGF1ZGlvX2NvZGVjOwpAQCAtNjAsOSArNjEsMjcgQEAKICAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKICAgfQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIGlmICghU2JQbGF5ZXJPdXRwdXRNb2RlU3VwcG9ydGVkKG91dHB1dF9tb2RlLCB2aWRlb19jb2RlYywgZHJtX3N5c3RlbSkpIHsKKyAgICBTQl9MT0coRVJST1IpIDw8ICJVbnN1cHBvcnRlZCBwbGF5ZXIgb3V0cHV0IG1vZGUgIiA8PCBvdXRwdXRfbW9kZTsKKyAgICByZXR1cm4ga1NiUGxheWVySW52YWxpZDsKKyAgfQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorICBzdGFyYm9hcmQ6OnNjb3BlZF9wdHI8UGxheWVyV29ya2VyOjpIYW5kbGVyPiBoYW5kbGVyKAorICAgICAgbmV3IEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcih2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIGRybV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphdWRpb19oZWFkZXIsIG91dHB1dF9tb2RlLCBwcm92aWRlcikpOworI2VsaWYgU0JfQVBJX1ZFUlNJT04gPj0gMworICBzdGFyYm9hcmQ6OnNjb3BlZF9wdHI8UGxheWVyV29ya2VyOjpIYW5kbGVyPiBoYW5kbGVyKAorICAgICAgbmV3IEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcih2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIGRybV9zeXN0ZW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphdWRpb19oZWFkZXIsIHByb3ZpZGVyKSk7CisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogICBzdGFyYm9hcmQ6OnNjb3BlZF9wdHI8UGxheWVyV29ya2VyOjpIYW5kbGVyPiBoYW5kbGVyKAogICAgICAgbmV3IEZpbHRlckJhc2VkUGxheWVyV29ya2VySGFuZGxlcih2aWRlb19jb2RlYywgYXVkaW9fY29kZWMsIGRybV9zeXN0ZW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICphdWRpb19oZWFkZXIpKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKICAgcmV0dXJuIG5ldyBTYlBsYXllclByaXZhdGUoZHVyYXRpb25fcHRzLCBzYW1wbGVfZGVhbGxvY2F0ZV9mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVyX3N0YXR1c19mdW5jLCBwbGF5ZXJfc3RhdHVzX2Z1bmMsIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhbmRsZXIuUGFzcygpKTsKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmZjYTQzMwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjCkBAIC0wLDAgKzEsMzIgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworU2JEZWNvZGVUYXJnZXQgU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUoU2JQbGF5ZXIgcGxheWVyKSB7CisgIGlmICghU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpIHsKKyAgICBTQl9ETE9HKFdBUk5JTkcpIDw8ICJwbGF5ZXIgaXMgaW52YWxpZC4iOworICAgIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOworICB9CisKKyAgcmV0dXJuIHBsYXllci0+R2V0Q3VycmVudERlY29kZVRhcmdldCgpOworfQorCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYwppbmRleCA5YzhhMjViLi5iM2MxMDRmIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5jYwpAQCAtNDQsNiArNDQsOSBAQAogICAgICAgZnJhbWVfd2lkdGhfKDApLAogICAgICAgZnJhbWVfaGVpZ2h0XygwKSwKICAgICAgIGlzX3BhdXNlZF8odHJ1ZSksCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgICAgIHBsYXliYWNrX3JhdGVfKDEuMCksCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCiAgICAgICB2b2x1bWVfKDEuMCksCiAgICAgICB0b3RhbF92aWRlb19mcmFtZXNfKDApLAogICAgICAgZHJvcHBlZF92aWRlb19mcmFtZXNfKDApLApAQCAtNTIsNyArNTUsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZXJfc3RhdHVzX2Z1bmMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxheWVyX3N0YXR1c19mdW5jLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkpIHt9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCkpIHsKK30KIAogdm9pZCBTYlBsYXllclByaXZhdGU6OlNlZWsoU2JNZWRpYVRpbWUgc2Vla190b19wdHMsIGludCB0aWNrZXQpIHsKICAgewpAQCAtODYsMTMgKzkwLDExIEBACiAgIHdvcmtlcl8tPldyaXRlRW5kT2ZTdHJlYW0oc3RyZWFtX3R5cGUpOwogfQogCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogdm9pZCBTYlBsYXllclByaXZhdGU6OlNldEJvdW5kcyhpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICBQbGF5ZXJXb3JrZXI6OkJvdW5kcyBib3VuZHMgPSB7eCwgeSwgd2lkdGgsIGhlaWdodH07CiAgIHdvcmtlcl8tPlNldEJvdW5kcyhib3VuZHMpOwogICAvLyBUT0RPOiBXYWl0IHVudGlsIGEgZnJhbWUgaXMgcmVuZGVyZWQgd2l0aCB0aGUgdXBkYXRlZCBib3VuZHMuCiB9Ci0jZW5kaWYKIAogdm9pZCBTYlBsYXllclByaXZhdGU6OkdldEluZm8oU2JQbGF5ZXJJbmZvKiBvdXRfcGxheWVyX2luZm8pIHsKICAgU0JfRENIRUNLKG91dF9wbGF5ZXJfaW5mbyAhPSBOVUxMKTsKQEAgLTExMiwxMiArMTE0LDIyIEBACiAgIG91dF9wbGF5ZXJfaW5mby0+dG90YWxfdmlkZW9fZnJhbWVzID0gdG90YWxfdmlkZW9fZnJhbWVzXzsKICAgb3V0X3BsYXllcl9pbmZvLT5kcm9wcGVkX3ZpZGVvX2ZyYW1lcyA9IGRyb3BwZWRfdmlkZW9fZnJhbWVzXzsKICAgb3V0X3BsYXllcl9pbmZvLT5jb3JydXB0ZWRfdmlkZW9fZnJhbWVzID0gMDsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICBvdXRfcGxheWVyX2luZm8tPnBsYXliYWNrX3JhdGUgPSBwbGF5YmFja19yYXRlXzsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KIH0KIAogdm9pZCBTYlBsYXllclByaXZhdGU6OlNldFBhdXNlKGJvb2wgcGF1c2UpIHsKICAgd29ya2VyXy0+U2V0UGF1c2UocGF1c2UpOwogfQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KK3ZvaWQgU2JQbGF5ZXJQcml2YXRlOjpTZXRQbGF5YmFja1JhdGUoZG91YmxlIHBsYXliYWNrX3JhdGUpIHsKKyAgcGxheWJhY2tfcmF0ZV8gPSBwbGF5YmFja19yYXRlOworICB3b3JrZXJfLT5TZXRQbGF5YmFja1JhdGUocGxheWJhY2tfcmF0ZSk7Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisKIHZvaWQgU2JQbGF5ZXJQcml2YXRlOjpTZXRWb2x1bWUoZG91YmxlIHZvbHVtZSkgewogICBTQl9OT1RJTVBMRU1FTlRFRCgpOwogfQpAQCAtMTM1LDMgKzE0Nyw5IEBACiAgIHN0YXJib2FyZDo6U2NvcGVkTG9jayBsb2NrKG11dGV4Xyk7CiAgIGRyb3BwZWRfdmlkZW9fZnJhbWVzXyA9IGRyb3BwZWRfdmlkZW9fZnJhbWVzOwogfQorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCitTYkRlY29kZVRhcmdldCBTYlBsYXllclByaXZhdGU6OkdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSB7CisgIHJldHVybiB3b3JrZXJfLT5HZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCk7Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgKaW5kZXggOGQ1NjliMS4uYjBjOGQyNyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfaW50ZXJuYWwuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oCkBAIC0xNiw2ICsxNiw3IEBACiAjZGVmaW5lIFNUQVJCT0FSRF9TSEFSRURfU1RBUkJPQVJEX1BMQVlFUl9QTEFZRVJfSU5URVJOQUxfSF8KIAogI2luY2x1ZGUgInN0YXJib2FyZC9jb21tb24vc2NvcGVkX3B0ci5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL21lZGlhLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvaW50ZXJuYWxfb25seS5oIgpAQCAtNDQsMTQgKzQ1LDE5IEBACiAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JNZWRpYVZpZGVvU2FtcGxlSW5mbyogdmlkZW9fc2FtcGxlX2luZm8sCiAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JEcm1TYW1wbGVJbmZvKiBzYW1wbGVfZHJtX2luZm8pOwogICB2b2lkIFdyaXRlRW5kT2ZTdHJlYW0oU2JNZWRpYVR5cGUgc3RyZWFtX3R5cGUpOwotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgdm9pZCBTZXRCb3VuZHMoaW50IHgsIGludCB5LCBpbnQgd2lkdGgsIGludCBoZWlnaHQpOwotI2VuZGlmCiAKICAgdm9pZCBHZXRJbmZvKFNiUGxheWVySW5mbyogb3V0X3BsYXllcl9pbmZvKTsKICAgdm9pZCBTZXRQYXVzZShib29sIHBhdXNlKTsKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorICB2b2lkIFNldFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCiAgIHZvaWQgU2V0Vm9sdW1lKGRvdWJsZSB2b2x1bWUpOwogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKTsKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKICBwcml2YXRlOgogICAvLyBQbGF5ZXJXb3JrZXI6Okhvc3QgbWV0aG9kcy4KICAgdm9pZCBVcGRhdGVNZWRpYVRpbWUoU2JNZWRpYVRpbWUgbWVkaWFfdGltZSwgaW50IHRpY2tldCkgU0JfT1ZFUlJJREU7CkBAIC02OCw2ICs3NCw5IEBACiAgIGludCBmcmFtZV93aWR0aF87CiAgIGludCBmcmFtZV9oZWlnaHRfOwogICBib29sIGlzX3BhdXNlZF87CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgZG91YmxlIHBsYXliYWNrX3JhdGVfOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogICBkb3VibGUgdm9sdW1lXzsKICAgaW50IHRvdGFsX3ZpZGVvX2ZyYW1lc187CiAgIGludCBkcm9wcGVkX3ZpZGVvX2ZyYW1lc187CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9vdXRwdXRfbW9kZV9zdXBwb3J0ZWQuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg4OWRkZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYwpAQCAtMCwwICsxLDMwIEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL2ZpbHRlci92aWRlb19kZWNvZGVyX2ludGVybmFsLmgiCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworYm9vbCBTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWQoU2JQbGF5ZXJPdXRwdXRNb2RlIG91dHB1dF9tb2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JNZWRpYVZpZGVvQ29kZWMgY29kZWMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRybVN5c3RlbSBkcm1fc3lzdGVtKSB7CisgIHJldHVybiBzdGFyYm9hcmQ6OnNoYXJlZDo6c3RhcmJvYXJkOjpwbGF5ZXI6OmZpbHRlcjo6VmlkZW9EZWNvZGVyOjoKKyAgICAgIE91dHB1dE1vZGVTdXBwb3J0ZWQob3V0cHV0X21vZGUsIGNvZGVjLCBkcm1fc3lzdGVtKTsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9ib3VuZHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfYm91bmRzLmNjCmluZGV4IDY2MGE5ZGEuLmEyMjc1ZWEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9ib3VuZHMuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X2JvdW5kcy5jYwpAQCAtMTcsNyArMTcsOCBAQAogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX2ludGVybmFsLmgiCiAKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAKIHZvaWQgU2JQbGF5ZXJTZXRCb3VuZHMoU2JQbGF5ZXIgcGxheWVyLCBpbnQgeCwgaW50IHksIGludCB3aWR0aCwgaW50IGhlaWdodCkgewogICBpZiAoIVNiUGxheWVySXNWYWxpZChwbGF5ZXIpKSB7CkBAIC0yNyw0ICsyOCw1IEBACiAgIHBsYXllci0+U2V0Qm91bmRzKHgsIHksIHdpZHRoLCBoZWlnaHQpOwogfQogCi0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICAgICAgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BhdXNlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BhdXNlLmNjCmluZGV4IDUyODU5MWQuLjdjZTkyMmIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wYXVzZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9zZXRfcGF1c2UuY2MKQEAgLTE3LDYgKzE3LDggQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorCiB2b2lkIFNiUGxheWVyU2V0UGF1c2UoU2JQbGF5ZXIgcGxheWVyLCBib29sIHBhdXNlKSB7CiAgIGlmICghU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpIHsKICAgICBTQl9ETE9HKFdBUk5JTkcpIDw8ICJwbGF5ZXIgaXMgaW52YWxpZC4iOwpAQCAtMjQsMyArMjYsNSBAQAogICB9CiAgIHBsYXllci0+U2V0UGF1c2UocGF1c2UpOwogfQorCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjBhYmJjNgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3NldF9wbGF5YmFja19yYXRlLmNjCkBAIC0wLDAgKzEsMzYgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl9pbnRlcm5hbC5oIgorCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKworYm9vbCBTYlBsYXllclNldFBsYXliYWNrUmF0ZShTYlBsYXllciBwbGF5ZXIsIGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CisgIGlmICghU2JQbGF5ZXJJc1ZhbGlkKHBsYXllcikpIHsKKyAgICBTQl9ETE9HKFdBUk5JTkcpIDw8ICJwbGF5ZXIgaXMgaW52YWxpZC4iOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAocGxheWJhY2tfcmF0ZSA8IDAuMCkgeworICAgIFNCX0RMT0coV0FSTklORykgPDwgInBsYXliYWNrX3JhdGUgY2Fubm90IGJlIG5lZ2F0aXZlIGJ1dCBpdCBpcyBzZXQgdG8gIgorICAgICAgICAgICAgICAgICAgICAgPDwgcGxheWJhY2tfcmF0ZSA8PCAnLic7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIHBsYXllci0+U2V0UGxheWJhY2tSYXRlKHBsYXliYWNrX3JhdGUpOworICByZXR1cm4gdHJ1ZTsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3BsYXllci9wbGF5ZXJfd29ya2VyLmNjCmluZGV4IDYzZmI0M2QuLmE1ZmU0ZDUgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuY2MKQEAgLTIzMywxNCArMjMzLDE2IEBACiAgIH0KIH0KIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIHZvaWQgUGxheWVyV29ya2VyOjpEb1NldEJvdW5kcyhCb3VuZHMgYm91bmRzKSB7CiAgIFNCX0RDSEVDSyhqb2JfcXVldWVfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogICBpZiAoIWhhbmRsZXJfLT5TZXRCb3VuZHMoYm91bmRzKSkgewogICAgIFVwZGF0ZVBsYXllclN0YXRlKGtTYlBsYXllclN0YXRlRXJyb3IpOwogICB9CiB9Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICAgICAgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogCiB2b2lkIFBsYXllcldvcmtlcjo6RG9TZXRQYXVzZShib29sIHBhdXNlKSB7CiAgIFNCX0RDSEVDSyhqb2JfcXVldWVfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwpAQCAtMjUwLDYgKzI1MiwxNiBAQAogICB9CiB9CiAKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgordm9pZCBQbGF5ZXJXb3JrZXI6OkRvU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CisgIFNCX0RDSEVDSyhqb2JfcXVldWVfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOworCisgIGlmICghaGFuZGxlcl8tPlNldFBsYXliYWNrUmF0ZShwbGF5YmFja19yYXRlKSkgeworICAgIFVwZGF0ZVBsYXllclN0YXRlKGtTYlBsYXllclN0YXRlRXJyb3IpOworICB9Cit9CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisKIHZvaWQgUGxheWVyV29ya2VyOjpEb1N0b3AoKSB7CiAgIFNCX0RDSEVDSyhqb2JfcXVldWVfLT5CZWxvbmdzVG9DdXJyZW50VGhyZWFkKCkpOwogCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdGFyYm9hcmQvcGxheWVyL3BsYXllcl93b3JrZXIuaCBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCmluZGV4IGNjZGRmMzkuLjE4MTQ5YzkgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvcGxheWVyX3dvcmtlci5oCkBAIC02Niw5ICs2Niw4IEBACiAKICAgICB2aXJ0dWFsIH5IYW5kbGVyKCkge30KIAotICAgIC8vIEFsbCB0aGUgUHJvY2VzcyogZnVuY3Rpb25zIHJldHVybiBmYWxzZSB0byBzaWduYWwgYSBmYXRhbCBlcnJvci4gIFRoZQorICAgIC8vIEFsbCB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyByZXR1cm4gZmFsc2UgdG8gc2lnbmFsIGEgZmF0YWwgZXJyb3IuICBUaGUKICAgICAvLyBldmVudCBwcm9jZXNzaW5nIGxvb3AgaW4gUGxheWVyV29ya2VyIHdpbGwgdGVybWltYXRlIGluIHRoaXMgY2FzZS4KLSAgICAvLyBBbGwgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBvbiBlcnJvci4KICAgICB2aXJ0dWFsIGJvb2wgSW5pdChQbGF5ZXJXb3JrZXIqIHBsYXllcl93b3JrZXIsCiAgICAgICAgICAgICAgICAgICAgICAgSm9iUXVldWUqIGpvYl9xdWV1ZSwKICAgICAgICAgICAgICAgICAgICAgICBTYlBsYXllciBwbGF5ZXIsCkBAIC03OSwxMiArNzgsMTkgQEAKICAgICB2aXJ0dWFsIGJvb2wgV3JpdGVTYW1wbGUoSW5wdXRCdWZmZXIgaW5wdXRfYnVmZmVyLCBib29sKiB3cml0dGVuKSA9IDA7CiAgICAgdmlydHVhbCBib29sIFdyaXRlRW5kT2ZTdHJlYW0oU2JNZWRpYVR5cGUgc2FtcGxlX3R5cGUpID0gMDsKICAgICB2aXJ0dWFsIGJvb2wgU2V0UGF1c2UoYm9vbCBwYXVzZSkgPSAwOworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgICAgdmlydHVhbCBib29sIFNldFBsYXliYWNrUmF0ZShkb3VibGUgcGxheWJhY2tfcmF0ZSkgPSAwOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgogICAgIHZpcnR1YWwgYm9vbCBTZXRCb3VuZHMoY29uc3QgQm91bmRzJiBib3VuZHMpID0gMDsKIAogICAgIC8vIE9uY2UgdGhpcyBmdW5jdGlvbiByZXR1cm5zLCBhbGwgcHJvY2Vzc2luZyBvbiB0aGUgSGFuZGxlciBhbmQgcmVsYXRlZAogICAgIC8vIG9iamVjdHMgaGFzIHRvIGJlIHN0b3BwZWQuICBUaGUgSm9iUXVldWUgd2lsbCBiZSBkZXN0cm95ZWQgaW1tZWRpYXRlbHkKICAgICAvLyBhZnRlciBhbmQgaXMgbm8gbG9uZ2VyIHNhZmUgdG8gYWNjZXNzLgogICAgIHZpcnR1YWwgdm9pZCBTdG9wKCkgPSAwOworCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgICAgdmlydHVhbCBTYkRlY29kZVRhcmdldCBHZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCkgPSAwOworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICAgfTsKIAogICBQbGF5ZXJXb3JrZXIoSG9zdCogaG9zdCwKQEAgLTExMCwyMCArMTE2LDQ3IEBACiAgICAgICAgIEJpbmQoJlBsYXllcldvcmtlcjo6RG9Xcml0ZUVuZE9mU3RyZWFtLCB0aGlzLCBzYW1wbGVfdHlwZSkpOwogICB9CiAKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIHZvaWQgU2V0Qm91bmRzKEJvdW5kcyBib3VuZHMpIHsKICAgICBqb2JfcXVldWVfLT5TY2hlZHVsZShCaW5kKCZQbGF5ZXJXb3JrZXI6OkRvU2V0Qm91bmRzLCB0aGlzLCBib3VuZHMpKTsKICAgfQotI2VuZGlmICAvLyBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fCBcCisgICAgICAgICAgIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogICB2b2lkIFNldFBhdXNlKGJvb2wgcGF1c2UpIHsKICAgICBqb2JfcXVldWVfLT5TY2hlZHVsZShCaW5kKCZQbGF5ZXJXb3JrZXI6OkRvU2V0UGF1c2UsIHRoaXMsIHBhdXNlKSk7CiAgIH0KIAorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisgIHZvaWQgU2V0UGxheWJhY2tSYXRlKGRvdWJsZSBwbGF5YmFja19yYXRlKSB7CisgICAgLy8gQXJiaXRyYXJ5IHZhbHVlcyB0byBnaXZlIHRoZSBwbGF5YmFjayByYXRlIGEgdmFsaWQgcmFuZ2UuICBBIHBhcnRpY3VsYXIKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBtYXkgaGF2ZSBzdHJpY3RlciBvciBsb29zZXIgcmVxdWlyZW1lbnQsIG9yIGV2ZW4gb25seQorICAgIC8vIHN1cHBvcnQgc2V2ZXJhbCBkaXNjcmVldCB2YWx1ZXMuCisgICAgLy8gSWRlYWxseSB0aGUgcmFuZ2Ugb2YgdGhlIHBsYXliYWNrIHJhdGUgc2hvdWxkIGJlIGRldGVybWluZWQgYnkgdGhlIGF1ZGlvCisgICAgLy8gZ3JhcGggYnV0IHRoYXQgd2lsbCBicmVhayB0aGUgdGhyZWFkIGludmFyaWFudCBvZiB0aGUgaGFuZGxlci4KKyAgICBjb25zdCBkb3VibGUga01pbmltdW1Ob25aZXJvUGxheWJhY2tSYXRlID0gMC4xOworICAgIGNvbnN0IGRvdWJsZSBrTWF4aW11bVBsYXliYWNrUmF0ZSA9IDQuMDsKKyAgICBpZiAocGxheWJhY2tfcmF0ZSA+IDAuMCAmJiBwbGF5YmFja19yYXRlIDwga01pbmltdW1Ob25aZXJvUGxheWJhY2tSYXRlKSB7CisgICAgICBwbGF5YmFja19yYXRlID0ga01pbmltdW1Ob25aZXJvUGxheWJhY2tSYXRlOworICAgIH0gZWxzZSBpZiAocGxheWJhY2tfcmF0ZSA+IGtNYXhpbXVtUGxheWJhY2tSYXRlKSB7CisgICAgICBwbGF5YmFja19yYXRlID0ga01heGltdW1QbGF5YmFja1JhdGU7CisgICAgfQorICAgIGpvYl9xdWV1ZV8tPlNjaGVkdWxlKAorICAgICAgICBCaW5kKCZQbGF5ZXJXb3JrZXI6OkRvU2V0UGxheWJhY2tSYXRlLCB0aGlzLCBwbGF5YmFja19yYXRlKSk7CisgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKwogICB2b2lkIFVwZGF0ZURyb3BwZWRWaWRlb0ZyYW1lcyhpbnQgZHJvcHBlZF92aWRlb19mcmFtZXMpIHsKICAgICBob3N0Xy0+VXBkYXRlRHJvcHBlZFZpZGVvRnJhbWVzKGRyb3BwZWRfdmlkZW9fZnJhbWVzKTsKICAgfQogCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisgIFNiRGVjb2RlVGFyZ2V0IEdldEN1cnJlbnREZWNvZGVUYXJnZXQoKSB7CisgICAgcmV0dXJuIGhhbmRsZXJfLT5HZXRDdXJyZW50RGVjb2RlVGFyZ2V0KCk7CisgIH0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKICBwcml2YXRlOgogICB2b2lkIFVwZGF0ZU1lZGlhVGltZShTYk1lZGlhVGltZSB0aW1lKTsKIApAQCAtMTM3LDEwICsxNzAsMTUgQEAKICAgdm9pZCBEb1dyaXRlU2FtcGxlKElucHV0QnVmZmVyIGlucHV0X2J1ZmZlcik7CiAgIHZvaWQgRG9Xcml0ZVBlbmRpbmdTYW1wbGVzKCk7CiAgIHZvaWQgRG9Xcml0ZUVuZE9mU3RyZWFtKFNiTWVkaWFUeXBlIHNhbXBsZV90eXBlKTsKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIHZvaWQgRG9TZXRCb3VuZHMoQm91bmRzIGJvdW5kcyk7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICAgICAgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICB2b2lkIERvU2V0UGF1c2UoYm9vbCBwYXVzZSk7CisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX1NFVF9QTEFZQkFDS19SQVRFX1ZFUlNJT04KKyAgdm9pZCBEb1NldFBsYXliYWNrUmF0ZShkb3VibGUgcmF0ZSk7CisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCiAgIHZvaWQgRG9TdG9wKCk7CiAKICAgdm9pZCBVcGRhdGVEZWNvZGVyU3RhdGUoU2JNZWRpYVR5cGUgdHlwZSwgU2JQbGF5ZXJEZWNvZGVyU3RhdGUgc3RhdGUpOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF9kaXNwbGF5X3NldHRpbmdzLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF9kaXNwbGF5X3NldHRpbmdzLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE5YTA5NGQKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2FjY2Vzc2liaWxpdHlfZ2V0X2Rpc3BsYXlfc2V0dGluZ3MuY2MKQEAgLTAsMCArMSwyOCBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9hY2Nlc3NpYmlsaXR5LmgiCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisKK2Jvb2wgU2JBY2Nlc3NpYmlsaXR5R2V0RGlzcGxheVNldHRpbmdzKAorICAgIFNiQWNjZXNzaWJpbGl0eURpc3BsYXlTZXR0aW5ncyogb3V0X3NldHRpbmcpIHsKKyAgaWYgKCFvdXRfc2V0dGluZyB8fAorICAgICAgIVNiTWVtb3J5SXNaZXJvKG91dF9zZXR0aW5nLAorICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihTYkFjY2Vzc2liaWxpdHlEaXNwbGF5U2V0dGluZ3MpKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBvdXRfc2V0dGluZy0+aGFzX2hpZ2hfY29udHJhc3RfdGV4dF9zZXR0aW5nID0gZmFsc2U7CisgIHJldHVybiB0cnVlOworfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF90ZXh0X3RvX3NwZWVjaF9zZXR0aW5ncy5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvYWNjZXNzaWJpbGl0eV9nZXRfdGV4dF90b19zcGVlY2hfc2V0dGluZ3MuY2MKaW5kZXggNmEyZDMyNi4uZDE0Mzk0MCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF90ZXh0X3RvX3NwZWVjaF9zZXR0aW5ncy5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2FjY2Vzc2liaWxpdHlfZ2V0X3RleHRfdG9fc3BlZWNoX3NldHRpbmdzLmNjCkBAIC0yMyw1ICsyMyw2IEBACiAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKFNiQWNjZXNzaWJpbGl0eVRleHRUb1NwZWVjaFNldHRpbmdzKSkpIHsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KKyAgb3V0X3NldHRpbmctPmhhc190ZXh0X3RvX3NwZWVjaF9zZXR0aW5nID0gZmFsc2U7CiAgIHJldHVybiB0cnVlOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2NyZWF0ZV9ibGl0dGVyLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2NyZWF0ZV9ibGl0dGVyLmNjCmluZGV4IDAxOTY1OGQuLjA5ODJmZTcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9jcmVhdGVfYmxpdHRlci5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfY3JlYXRlX2JsaXR0ZXIuY2MKQEAgLTE0LDcgKzE0LDIwIEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogU2JEZWNvZGVUYXJnZXQgU2JEZWNvZGVUYXJnZXRDcmVhdGUoU2JEZWNvZGVUYXJnZXRGb3JtYXQgLypmb3JtYXQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiQmxpdHRlclN1cmZhY2UqIC8qcGxhbmVzKi8pIHsKICAgcmV0dXJuIGtTYkRlY29kZVRhcmdldEludmFsaWQ7CiB9CisKKyNlbHNlICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCitTYkRlY29kZVRhcmdldCBTYkRlY29kZVRhcmdldENyZWF0ZShTYkJsaXR0ZXJEZXZpY2UgZGV2aWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRGb3JtYXQgZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHdpZHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGhlaWdodCkgeworICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2NyZWF0ZV9lZ2wuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfY3JlYXRlX2VnbC5jYwppbmRleCBjOTc4YzI2Li4xN2MzM2M1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfY3JlYXRlX2VnbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfY3JlYXRlX2VnbC5jYwpAQCAtMTQsMjAgKzE0LDE5IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogCi0jaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKyNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogU2JEZWNvZGVUYXJnZXQgU2JEZWNvZGVUYXJnZXRDcmVhdGUoRUdMRGlzcGxheSAvKmRpc3BsYXkqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVHTENvbnRleHQgLypjb250ZXh0Ki8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldEZvcm1hdCAvKmZvcm1hdCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR0x1aW50KiAvKnBsYW5lcyovKSB7CiAgIHJldHVybiBrU2JEZWNvZGVUYXJnZXRJbnZhbGlkOwogfQotI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisjZWxzZSAgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiBTYkRlY29kZVRhcmdldCBTYkRlY29kZVRhcmdldENyZWF0ZSh2b2lkKiAvKmRpc3BsYXkqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIC8qY29udGV4dCovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2JEZWNvZGVUYXJnZXRGb3JtYXQgLypmb3JtYXQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKndpZHRoKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypoZWlnaHQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiAvKnBsYW5lcyovKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLypoZWlnaHQqLykgewogICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKIH0KLSNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9kZXN0cm95LmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2Rlc3Ryb3kuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY3NjIxMjMuLjAwMDAwMDAKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2Rlc3Ryb3kuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNyArMCwwIEBACi0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOwotLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0vLwotLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAotLy8KLS8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLS8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCi0vLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLS8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLS8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgotCi0jaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKLQotdm9pZCBTYkRlY29kZVRhcmdldERlc3Ryb3koU2JEZWNvZGVUYXJnZXQgLypkZWNvZGVfdGFyZ2V0Ki8pIHt9CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2Zvcm1hdC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfZm9ybWF0LmNjCmluZGV4IGU4ZjllYTcuLmE2NDE0M2EgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfZm9ybWF0LmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfZm9ybWF0LmNjCkBAIC0xNCw2ICsxNCwxMCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIFNiRGVjb2RlVGFyZ2V0Rm9ybWF0IFNiRGVjb2RlVGFyZ2V0R2V0Rm9ybWF0KFNiRGVjb2RlVGFyZ2V0IC8qZGVjb2RlX3RhcmdldCovKSB7CiAgIHJldHVybiBrU2JEZWNvZGVUYXJnZXRGb3JtYXRJbnZhbGlkOwogfQorCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2luZm8uY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X2luZm8uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjM3ZDdlOAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfaW5mby5jYwpAQCAtMCwwICsxLDI0IEBACisvLyBDb3B5cmlnaHQgMjAxNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgorLy8KKy8vIExpY2Vuc2VkIHVuZGVyIHRoZSBBcGFjaGUgTGljZW5zZSwgVmVyc2lvbiAyLjAgKHRoZSAiTGljZW5zZSIpOworLy8geW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgorLy8gWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0CisvLworLy8gICAgIGh0dHA6Ly93d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMAorLy8KKy8vIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKKy8vIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsCisvLyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KKy8vIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKKy8vIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgorCitib29sIFNiRGVjb2RlVGFyZ2V0R2V0SW5mbyhTYkRlY29kZVRhcmdldCAvKmRlY29kZV90YXJnZXQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0SW5mbyogLypvdXRfaW5mbyovKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfcGxhbmVfYmxpdHRlci5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfcGxhbmVfYmxpdHRlci5jYwppbmRleCA3YjNhN2Y4Li43MGVjZjk1IDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3BsYW5lX2JsaXR0ZXIuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9wbGFuZV9ibGl0dGVyLmNjCkBAIC0xNCw3ICsxNCwxMSBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL2RlY29kZV90YXJnZXQuaCIKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIFNiQmxpdHRlclN1cmZhY2UgU2JEZWNvZGVUYXJnZXRHZXRQbGFuZShTYkRlY29kZVRhcmdldCAvKmRlY29kZV90YXJnZXQqLywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFBsYW5lIC8qcGxhbmUqLykgewogICByZXR1cm4ga1NiQmxpdHRlckludmFsaWRTdXJmYWNlOwogfQorCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3BsYW5lX2VnbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfcGxhbmVfZWdsLmNjCmluZGV4IDlmNWY5OGMuLjBkMDFiNTcgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfcGxhbmVfZWdsLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfcGxhbmVfZWdsLmNjCkBAIC0xNCwxNCArMTQsMTEgQEAKIAogI2luY2x1ZGUgInN0YXJib2FyZC9kZWNvZGVfdGFyZ2V0LmgiCiAKLSNpZiBTQl9BUElfVkVSU0lPTiA8IFNCX0VYUEVSSU1FTlRBTF9BUElfVkVSU0lPTgorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCisKIEdMdWludCBTYkRlY29kZVRhcmdldEdldFBsYW5lKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFBsYW5lIHBsYW5lKSB7CiAgIHJldHVybiAwOwogfQotI2Vsc2UgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCi11aW50MzJfdCBTYkRlY29kZVRhcmdldEdldFBsYW5lKFNiRGVjb2RlVGFyZ2V0IGRlY29kZV90YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRGVjb2RlVGFyZ2V0UGxhbmUgcGxhbmUpIHsKLSAgcmV0dXJuIDA7Ci19Ci0jZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OIDwgU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OCisKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfc2l6ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9nZXRfc2l6ZS5jYwppbmRleCA3OTljZTRhLi45ZTgyZjcxIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfZ2V0X3NpemUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2dldF9zaXplLmNjCkBAIC0xNCw2ICsxNCw4IEBACiAKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogdm9pZCBTYkRlY29kZVRhcmdldEdldFNpemUoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogb3V0X3dpZHRoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBvdXRfaGVpZ2h0KSB7CkBAIC0yMSwzICsyMyw1IEBACiAgIFNCX1VOUkVGRVJFTkNFRF9QQVJBTUVURVIob3V0X3dpZHRoKTsKICAgU0JfVU5SRUZFUkVOQ0VEX1BBUkFNRVRFUihvdXRfaGVpZ2h0KTsKIH0KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2lzX29wYXF1ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9pc19vcGFxdWUuY2MKaW5kZXggMTc5ODk3NS4uNWNiMzU5NiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X2lzX29wYXF1ZS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL2RlY29kZV90YXJnZXRfaXNfb3BhcXVlLmNjCkBAIC0xNSw2ICsxNSw4IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2NvbmZpZ3VyYXRpb24uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKwogI2lmICEoU0JfVkVSU0lPTigzKSAmJiBTQl9IQVMoR1JBUEhJQ1MpKQogI2Vycm9yICJTYkRlY29kZVRhcmdldElzT3BhcXVlIHJlcXVpcmVzIFNCX1ZFUlNJT04oMykgYW5kIFNCX0hBUyhHUkFQSElDUykuIgogI2VuZGlmCkBAIC0yMiwzICsyNCw1IEBACiBib29sIFNiRGVjb2RlVGFyZ2V0SXNPcGFxdWUoU2JEZWNvZGVUYXJnZXQgZGVjb2RlX3RhcmdldCkgewogICByZXR1cm4gZmFsc2U7CiB9CisKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9yZWxlYXNlLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9kZWNvZGVfdGFyZ2V0X3JlbGVhc2UuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzMxNGVkZQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvZGVjb2RlX3RhcmdldF9yZWxlYXNlLmNjCkBAIC0wLDAgKzEsMTcgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvZGVjb2RlX3RhcmdldC5oIgorCit2b2lkIFNiRGVjb2RlVGFyZ2V0UmVsZWFzZShTYkRlY29kZVRhcmdldCAvKmRlY29kZV90YXJnZXQqLykge30KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX2NyZWF0ZS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX2NyZWF0ZS5jYwppbmRleCA2MzkzMTVjLi5kZTJhZDEwIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9jcmVhdGUuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfY3JlYXRlLmNjCkBAIC0yOCw2ICsyOCwxMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgU2JQbGF5ZXJEZWNvZGVyU3RhdHVzRnVuYyAvKmRlY29kZXJfc3RhdHVzX2Z1bmMqLywKICAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyU3RhdHVzRnVuYyAvKnBsYXllcl9zdGF0dXNfZnVuYyovLAogICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogLypjb250ZXh0Ki8KKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKyAgICAgICAgICAgICAgICAgICAgICAgICwKKyAgICAgICAgICAgICAgICAgICAgICAgIFNiUGxheWVyT3V0cHV0TW9kZSBvdXRwdXRfbW9kZQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KICNpZiBTQl9WRVJTSU9OKDMpCiAgICAgICAgICAgICAgICAgICAgICAgICAsCiAgICAgICAgICAgICAgICAgICAgICAgICBTYkRlY29kZVRhcmdldFByb3ZpZGVyKiAvKnByb3ZpZGVyKi8KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmZlYzRmMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX2dldF9jdXJyZW50X2ZyYW1lLmNjCkBAIC0wLDAgKzEsMjMgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworU2JEZWNvZGVUYXJnZXQgU2JQbGF5ZXJHZXRDdXJyZW50RnJhbWUoU2JQbGF5ZXIgLypwbGF5ZXIqLykgeworICByZXR1cm4ga1NiRGVjb2RlVGFyZ2V0SW52YWxpZDsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYWM0YjhjCi0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfb3V0cHV0X21vZGVfc3VwcG9ydGVkLmNjCkBAIC0wLDAgKzEsMjUgQEAKKy8vIENvcHlyaWdodCAyMDE3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7CisvLyB5b3UgbWF5IG5vdCB1c2UgdGhpcyBmaWxlIGV4Y2VwdCBpbiBjb21wbGlhbmNlIHdpdGggdGhlIExpY2Vuc2UuCisvLyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKKy8vCisvLyAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCisvLworLy8gVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQorLy8gZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKKy8vIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELCBlaXRoZXIgZXhwcmVzcyBvciBpbXBsaWVkLgorLy8gU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAorLy8gbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCisKKyNpbmNsdWRlICJzdGFyYm9hcmQvcGxheWVyLmgiCisKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KKworYm9vbCBTYlBsYXllck91dHB1dE1vZGVTdXBwb3J0ZWQoU2JQbGF5ZXJPdXRwdXRNb2RlIC8qb3V0cHV0X21vZGUqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiTWVkaWFWaWRlb0NvZGVjIC8qY29kZWMqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNiRHJtU3lzdGVtIC8qZHJtX3N5c3RlbSovKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9ib3VuZHMuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfYm91bmRzLmNjCmluZGV4IDY4YTNjMjUuLmExZGVlY2EgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9ib3VuZHMuY2MKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X2JvdW5kcy5jYwpAQCAtMTQsNyArMTQsOCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fCBcCisgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogCiB2b2lkIFNiUGxheWVyU2V0Qm91bmRzKFNiUGxheWVyIC8qcGxheWVyKi8sCiAgICAgICAgICAgICAgICAgICAgICAgIGludCAvKngqLywKQEAgLTIyLDQgKzIzLDUgQEAKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qd2lkdGgqLywKICAgICAgICAgICAgICAgICAgICAgICAgaW50IC8qaGVpZ2h0Ki8pIHt9CiAKLSNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgICAgICAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfcGF1c2UuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfcGF1c2UuY2MKaW5kZXggZDNiYzM0NS4uNDk2NjI0YyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BhdXNlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NldF9wYXVzZS5jYwpAQCAtMTQsNCArMTQsOCBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCisjaWYgU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgorCiB2b2lkIFNiUGxheWVyU2V0UGF1c2UoU2JQbGF5ZXIgLypwbGF5ZXIqLywgYm9vbCAvKnBhdXNlKi8pIHt9CisKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPCBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfcGxheWJhY2tfcmF0ZS5jYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kOWZjMzU4Ci0tLSAvZGV2L251bGwKKysrIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MKQEAgLTAsMCArMSwyMyBAQAorLy8gQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KKy8vCisvLyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKKy8vIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KKy8vIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdAorLy8KKy8vICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKKy8vCisvLyBVbmxlc3MgcmVxdWlyZWQgYnkgYXBwbGljYWJsZSBsYXcgb3IgYWdyZWVkIHRvIGluIHdyaXRpbmcsIHNvZnR3YXJlCisvLyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAorLy8gV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCisvLyBTZWUgdGhlIExpY2Vuc2UgZm9yIHRoZSBzcGVjaWZpYyBsYW5ndWFnZSBnb3Zlcm5pbmcgcGVybWlzc2lvbnMgYW5kCisvLyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KKworI2luY2x1ZGUgInN0YXJib2FyZC9wbGF5ZXIuaCIKKworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9TRVRfUExBWUJBQ0tfUkFURV9WRVJTSU9OCisKK2Jvb2wgU2JQbGF5ZXJTZXRQbGF5YmFja1JhdGUoU2JQbGF5ZXIgLypwbGF5ZXIqLywgZG91YmxlIC8qcGxheWJhY2tfcmF0ZSovKSB7CisgIHJldHVybiBmYWxzZTsKK30KKworI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfU0VUX1BMQVlCQUNLX1JBVEVfVkVSU0lPTgpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS9hcHBsaWNhdGlvbl94MTEuY2MKaW5kZXggNzk3YzgwNy4uNWU0MGM0YiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvYXBwbGljYXRpb25feDExLmNjCkBAIC0zMSw2ICszMSw3IEBACiAjaW5jbHVkZSAic3RhcmJvYXJkL2tleS5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9sb2cuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvcG9zaXgvdGltZV9pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2F1ZGlvX3NpbmsvYXVkaW9fc2lua19pbnRlcm5hbC5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5oIgpAQCAtNjIyLDExICs2MjMsOSBAQAogQXBwbGljYXRpb25YMTE6OkFwcGxpY2F0aW9uWDExKCkKICAgICA6IHdha2VfdXBfYXRvbV8oTm9uZSksCiAgICAgICB3bV9kZWxldGVfYXRvbV8oTm9uZSksCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICAgICAgY29tcG9zaXRlX2V2ZW50X2lkXyhrU2JFdmVudElkSW52YWxpZCksCiAgICAgICBmcmFtZV9yZWFkX2luZGV4XygwKSwKICAgICAgIGZyYW1lX3dyaXR0ZW5fKGZhbHNlKSwKLSNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICAgICAgZGlzcGxheV8oTlVMTCkgewogICBTYkF1ZGlvU2lua1ByaXZhdGU6OkluaXRpYWxpemUoKTsKIH0KQEAgLTY2Miw3ICs2NjEsNiBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIG5hbWVzcGFjZSB7CiB2b2lkIENvbXBvc2l0ZUNhbGxiYWNrKHZvaWQqIGNvbnRleHQpIHsKICAgQXBwbGljYXRpb25YMTEqIGFwcGxpY2F0aW9uID0gcmVpbnRlcnByZXRfY2FzdDxBcHBsaWNhdGlvblgxMSo+KGNvbnRleHQpOwpAQCAtNzM1LDcgKzczMyw2IEBACiAgICAgZnJhbWVfd3JpdHRlbl8gPSB0cnVlOwogICB9CiB9Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogdm9pZCBBcHBsaWNhdGlvblgxMTo6SW5pdGlhbGl6ZSgpIHsKICAgLy8gTWVzYSBpcyBpbnN0YWxsZWQgb24gVWJ1bnR1IG1hY2hpbmVzIGFuZCB3aWxsIGJlIHNlbGVjdGVkIGFzIHRoZSBkZWZhdWx0CkBAIC04MDUsOSArODAyLDggQEAKICAgd2FrZV91cF9hdG9tXyA9IFhJbnRlcm5BdG9tKGRpc3BsYXlfLCAiV2FrZVVwQXRvbSIsIDApOwogICB3bV9kZWxldGVfYXRvbV8gPSBYSW50ZXJuQXRvbShkaXNwbGF5XywgIldNX0RFTEVURV9XSU5ET1ciLCBUcnVlKTsKIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgQ29tcG9zaXRlKCk7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKwogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtODE2LDEwICs4MTIsOCBAQAogICAgIHJldHVybjsKICAgfQogCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICBTYkV2ZW50Q2FuY2VsKGNvbXBvc2l0ZV9ldmVudF9pZF8pOwogICBjb21wb3NpdGVfZXZlbnRfaWRfID0ga1NiRXZlbnRJZEludmFsaWQ7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogICBYQ2xvc2VEaXNwbGF5KGRpc3BsYXlfKTsKICAgZGlzcGxheV8gPSBOVUxMOwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5oIGIvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL2FwcGxpY2F0aW9uX3gxMS5oCmluZGV4IGVmZTJhMjQuLjE4MmY1OGMgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS9hcHBsaWNhdGlvbl94MTEuaAorKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvYXBwbGljYXRpb25feDExLmgKQEAgLTQ0LDcgKzQ0LDYgQEAKICAgU2JXaW5kb3cgQ3JlYXRlV2luZG93KGNvbnN0IFNiV2luZG93T3B0aW9ucyogb3B0aW9ucyk7CiAgIGJvb2wgRGVzdHJveVdpbmRvdyhTYldpbmRvdyB3aW5kb3cpOwogCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICB2b2lkIENvbXBvc2l0ZSgpOwogCiAgcHJvdGVjdGVkOgpAQCAtNTQsNyArNTMsNiBAQAogICAgICAgICAgICAgICAgICAgIGludCB5LAogICAgICAgICAgICAgICAgICAgIGludCB3aWR0aCwKICAgICAgICAgICAgICAgICAgICBpbnQgaGVpZ2h0KSBTQl9PVkVSUklERTsKLSNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogCiAgcHJvdGVjdGVkOgogICAvLyAtLS0gQXBwbGljYXRpb24gb3ZlcnJpZGVzIC0tLQpAQCAtNjksNyArNjcsNiBAQAogIHByaXZhdGU6CiAgIHR5cGVkZWYgc3RkOjp2ZWN0b3I8U2JXaW5kb3c+IFNiV2luZG93VmVjdG9yOwogCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICBzdHJ1Y3QgRnJhbWVJbmZvIHsKICAgICBzY29wZWRfcmVmcHRyPFZpZGVvRnJhbWU+IGZyYW1lOwogICAgIGludCB4OwpAQCAtNzcsNyArNzQsNiBAQAogICAgIGludCB3aWR0aDsKICAgICBpbnQgaGVpZ2h0OwogICB9OwotI2VuZGlmICAvLyBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAKICAgLy8gRW5zdXJlcyB0aGF0IFggaXMgdXAsIGRpc3BsYXkgaXMgcG9wdWxhdGVkIGFuZCBjb25uZWN0ZWQsIHJldHVybmluZyB3aGV0aGVyCiAgIC8vIGl0IHN1Y2NlZWRlZC4KQEAgLTk2LDE0ICs5MiwxMiBAQAogICBBdG9tIHdha2VfdXBfYXRvbV87CiAgIEF0b20gd21fZGVsZXRlX2F0b21fOwogCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICBTYkV2ZW50SWQgY29tcG9zaXRlX2V2ZW50X2lkXzsKICAgTXV0ZXggZnJhbWVfbXV0ZXhfOwogICBpbnQgZnJhbWVfcmVhZF9pbmRleF87CiAgIGJvb2wgZnJhbWVfd3JpdHRlbl87CiAgIHN0YXRpYyBjb25zdCBpbnQga051bUZyYW1lcyA9IDI7CiAgIEZyYW1lSW5mbyBmcmFtZV9pbmZvc19ba051bUZyYW1lc107Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogICBEaXNwbGF5KiBkaXNwbGF5XzsKICAgU2JXaW5kb3dWZWN0b3Igd2luZG93c187CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2dldF9wbGF0Zm9ybV9oYW5kbGUuY2MKaW5kZXggY2M2Y2Q1Ni4uZjdhZjY0ZiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19nZXRfcGxhdGZvcm1faGFuZGxlLmNjCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfZ2V0X3BsYXRmb3JtX2hhbmRsZS5jYwpAQCAtMTQsNiArMTQsNyBAQAogCiAjaW5jbHVkZSAic3RhcmJvYXJkL3dpbmRvdy5oIgogCisjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5oIgogCiB2b2lkKiBTYldpbmRvd0dldFBsYXRmb3JtSGFuZGxlKFNiV2luZG93IHdpbmRvdykgewpAQCAtMjIsNyArMjMsOCBAQAogICB9CiAKICAgV2luZG93IGhhbmRsZSA9IE5vbmU7Ci0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fCBcCisgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICBoYW5kbGUgPSB3aW5kb3ctPmdsX3dpbmRvdzsKICNlbHNlCiAgIGhhbmRsZSA9IHdpbmRvdy0+d2luZG93OwpkaWZmIC0tZ2l0IGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5jYyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfaW50ZXJuYWwuY2MKaW5kZXggNzBkYWViMy4uMzI5NDU0MyAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5jYworKysgYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2ludGVybmFsLmNjCkBAIC0yNCw0MyArMjQsNTEgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9kb3VibGUuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3BsYXllci5oIgogCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fCBcCisgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogI2luY2x1ZGUgPFgxMS9leHRlbnNpb25zL1hjb21wb3NpdGUuaD4KICNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YcmVuZGVyLmg+Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8CisgICAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogbmFtZXNwYWNlIHsKIAogY29uc3QgaW50IGtXaW5kb3dXaWR0aCA9IDE5MjA7CiBjb25zdCBpbnQga1dpbmRvd0hlaWdodCA9IDEwODA7CiAKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiBib29sIEhhc05lZWRlZEV4dGVuc2lvbnNGb3JQdW5jaGVkT3V0VmlkZW8oRGlzcGxheSogZGlzcGxheSkgewogICBpbnQgZHVtbXk7CiAgIHJldHVybiAoWFJlbmRlclF1ZXJ5RXh0ZW5zaW9uKGRpc3BsYXksICZkdW1teSwgJmR1bW15KSAmJgogICAgICAgICAgIFhDb21wb3NpdGVRdWVyeUV4dGVuc2lvbihkaXNwbGF5LCAmZHVtbXksICZkdW1teSkpOwogfQotI2VuZGlmICAvLyBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCi0KKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8CisgICAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIH0gIC8vIG5hbWVzcGFjZQogCiBTYldpbmRvd1ByaXZhdGU6OlNiV2luZG93UHJpdmF0ZShEaXNwbGF5KiBkaXNwbGF5LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2JXaW5kb3dPcHRpb25zKiBvcHRpb25zKQogICAgIDogd2luZG93KE5vbmUpCi0jaWYgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQotICAgICwgd2luZG93X3BpY3R1cmUoTm9uZSkKLSAgICAsIGNvbXBvc2l0aW9uX3BpeG1hcChOb25lKQotICAgICwgY29tcG9zaXRpb25fcGljdHVyZShOb25lKQotICAgICwgdmlkZW9fcGl4bWFwKE5vbmUpCi0gICAgLCB2aWRlb19waXhtYXBfd2lkdGgoMCkKLSAgICAsIHZpZGVvX3BpeG1hcF9oZWlnaHQoMCkKLSAgICAsIHZpZGVvX3BpeG1hcF9nYyhOb25lKQotICAgICwgdmlkZW9fcGljdHVyZShOb25lKQotICAgICwgZ2xfd2luZG93KE5vbmUpCi0gICAgLCBnbF9waWN0dXJlKE5vbmUpCi0jZW5kaWYKLSAgICAsIGRpc3BsYXkoZGlzcGxheSkgeworI2lmIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fCBcCisgICAgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorICAgICAgLAorICAgICAgd2luZG93X3BpY3R1cmUoTm9uZSksCisgICAgICBjb21wb3NpdGlvbl9waXhtYXAoTm9uZSksCisgICAgICBjb21wb3NpdGlvbl9waWN0dXJlKE5vbmUpLAorICAgICAgdmlkZW9fcGl4bWFwKE5vbmUpLAorICAgICAgdmlkZW9fcGl4bWFwX3dpZHRoKDApLAorICAgICAgdmlkZW9fcGl4bWFwX2hlaWdodCgwKSwKKyAgICAgIHZpZGVvX3BpeG1hcF9nYyhOb25lKSwKKyAgICAgIHZpZGVvX3BpY3R1cmUoTm9uZSksCisgICAgICBnbF93aW5kb3coTm9uZSksCisgICAgICBnbF9waWN0dXJlKE5vbmUpCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fAorICAgICAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorICAgICAgLAorICAgICAgZGlzcGxheShkaXNwbGF5KSB7CiAgIC8vIFJlcXVlc3QgYSAzMi1iaXQgZGVwdGggdmlzdWFsIGZvciBvdXIgV2luZG93LgogICBYVmlzdWFsSW5mbyB4X3Zpc3VhbF9pbmZvID0gezB9OwogICBYTWF0Y2hWaXN1YWxJbmZvKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSksIDMyLCBUcnVlQ29sb3IsCkBAIC05OSwxNyArMTA3LDE5IEBACiAgIEF0b20gd21fZGVsZXRlID0gWEludGVybkF0b20oZGlzcGxheSwgIldNX0RFTEVURV9XSU5ET1ciLCBUcnVlKTsKICAgWFNldFdNUHJvdG9jb2xzKGRpc3BsYXksIHdpbmRvdywgJndtX2RlbGV0ZSwgMSk7CiAKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIFNCX0NIRUNLKEhhc05lZWRlZEV4dGVuc2lvbnNGb3JQdW5jaGVkT3V0VmlkZW8oZGlzcGxheSkpOwogICBnbF93aW5kb3cgPSBYQ3JlYXRlU2ltcGxlV2luZG93KGRpc3BsYXksIHdpbmRvdywgMCwgMCwgd2lkdGgsIGhlaWdodCwgMCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaGl0ZVBpeGVsKGRpc3BsYXksIERlZmF1bHRTY3JlZW4oZGlzcGxheSkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJsYWNrUGl4ZWwoZGlzcGxheSwgRGVmYXVsdFNjcmVlbihkaXNwbGF5KSkpOwogICBTQl9DSEVDSyhnbF93aW5kb3cgIT0gTm9uZSk7CiAgIFhNYXBXaW5kb3coZGlzcGxheSwgZ2xfd2luZG93KTsKLSAgLy8gTWFudWFsIHJlZGlyZWN0aW9uIG1lYW5zIHRoYXQgdGhpcyB3aW5kb3cgd2lsbCBvbmx5IGRyYXcgdG8gaXRzIHBpeG1hcCwgYW5kCi0gIC8vIHdvbid0IGJlIGF1dG9tYXRpY2FsbHkgcmVuZGVyZWQgb25zY3JlZW4uIFRoaXMgaXMgaW1wb3J0YW50LCBiZWNhdXNlIHRoZSBHTAotICAvLyBncmFwaGljcyB3aWxsIHB1bmNoIHRocm91Z2ggYW55IGxheWVycyBvZiB3aW5kb3dzIHVwIHRvLCBidXQgbm90IGluY2x1ZGluZywKLSAgLy8gdGhlIHJvb3Qgd2luZG93LiBXZSBtdXN0IGNvbXBvc2l0ZSBtYW51YWxseSwgaW4gQ29tcG9zaXRlKCksIHRvIGF2b2lkIHRoYXQuCisgIC8vIE1hbnVhbCByZWRpcmVjdGlvbiBtZWFucyB0aGF0IHRoaXMgd2luZG93IHdpbGwgb25seSBkcmF3IHRvIGl0cyBwaXhtYXAsCisgIC8vIGFuZCB3b24ndCBiZSBhdXRvbWF0aWNhbGx5IHJlbmRlcmVkIG9uc2NyZWVuLiBUaGlzIGlzIGltcG9ydGFudCwgYmVjYXVzZQorICAvLyB0aGUgR0wgZ3JhcGhpY3Mgd2lsbCBwdW5jaCB0aHJvdWdoIGFueSBsYXllcnMgb2Ygd2luZG93cyB1cCB0bywgYnV0IG5vdAorICAvLyBpbmNsdWRpbmcsIHRoZSByb290IHdpbmRvdy4gV2UgbXVzdCBjb21wb3NpdGUgbWFudWFsbHksIGluIENvbXBvc2l0ZSgpLAorICAvLyB0byBhdm9pZCB0aGF0LgogICBYQ29tcG9zaXRlUmVkaXJlY3RXaW5kb3coZGlzcGxheSwgZ2xfd2luZG93LCBDb21wb3NpdGVSZWRpcmVjdE1hbnVhbCk7CiAKICAgZ2xfcGljdHVyZSA9IFhSZW5kZXJDcmVhdGVQaWN0dXJlKApAQCAtMTIyLDEzICsxMzIsMTUgQEAKICAgICAgIFhSZW5kZXJGaW5kVmlzdWFsRm9ybWF0KGRpc3BsYXksIHhfdmlzdWFsX2luZm8udmlzdWFsKTsKICAgd2luZG93X3BpY3R1cmUgPSBYUmVuZGVyQ3JlYXRlUGljdHVyZShkaXNwbGF5LCB3aW5kb3csIHBpY3RfZm9ybWF0LCAwLCBOVUxMKTsKICAgU0JfQ0hFQ0sod2luZG93X3BpY3R1cmUgIT0gTm9uZSk7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8CisgICAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogICBYTWFwV2luZG93KGRpc3BsYXksIHdpbmRvdyk7CiB9CiAKIFNiV2luZG93UHJpdmF0ZTo6flNiV2luZG93UHJpdmF0ZSgpIHsKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OIHx8IFwKKyAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCiAgIGlmIChjb21wb3NpdGlvbl9waXhtYXAgIT0gTm9uZSkgewogICAgIFhGcmVlUGl4bWFwKGRpc3BsYXksIGNvbXBvc2l0aW9uX3BpeG1hcCk7CiAgICAgWFJlbmRlckZyZWVQaWN0dXJlKGRpc3BsYXksIGNvbXBvc2l0aW9uX3BpY3R1cmUpOwpAQCAtMTQxLDExICsxNTMsMTMgQEAKICAgWFJlbmRlckZyZWVQaWN0dXJlKGRpc3BsYXksIGdsX3BpY3R1cmUpOwogICBYRGVzdHJveVdpbmRvdyhkaXNwbGF5LCBnbF93aW5kb3cpOwogICBYUmVuZGVyRnJlZVBpY3R1cmUoZGlzcGxheSwgd2luZG93X3BpY3R1cmUpOwotI2VuZGlmICAvLyBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjZW5kaWYgIC8vIFNCX0FQSV9WRVJTSU9OID49IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTiB8fCBcCisgICAgICAgICAgIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICAgWERlc3Ryb3lXaW5kb3coZGlzcGxheSwgd2luZG93KTsKIH0KIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIHZvaWQgU2JXaW5kb3dQcml2YXRlOjpDb21wb3NpdGUoCiAgICAgaW50IGJvdW5kc194LAogICAgIGludCBib3VuZHNfeSwKQEAgLTI2Niw0ICsyODAsNSBAQAogICAgICAgICAgICAgICAgICAgIHdpbmRvd19waWN0dXJlLCAwLCAwLCAwLCAwLCAwLCAwLCB3aWR0aCwgaGVpZ2h0KTsKICAgWFN5bmNocm9uaXplKGRpc3BsYXksIEZhbHNlKTsKIH0KLSNlbmRpZiAgLy8gU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA+PSBTQl9QTEFZRVJfREVDT0RFX1RPX1RFWFRVUkVfQVBJX1ZFUlNJT04gfHwgXAorICAgICAgICAgICBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2ludGVybmFsLmggYi9zcmMvc3RhcmJvYXJkL3NoYXJlZC94MTEvd2luZG93X2ludGVybmFsLmgKaW5kZXggZTk2ZmZkYy4uZmQxNzBmZCAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zaGFyZWQveDExL3dpbmRvd19pbnRlcm5hbC5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc2hhcmVkL3gxMS93aW5kb3dfaW50ZXJuYWwuaApAQCAtMjIsOSArMjIsMTAgQEAKICNpbmNsdWRlICJzdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9wbGF5ZXIvdmlkZW9fZnJhbWVfaW50ZXJuYWwuaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvd2luZG93LmgiCiAKLSNpZiBTQl9JUyhQTEFZRVJfUFVOQ0hFRF9PVVQpCisjaWYgU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OIHx8IFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKICNpbmNsdWRlIDxYMTEvZXh0ZW5zaW9ucy9YcmVuZGVyLmg+Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OIHx8CisgICAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogc3RydWN0IFNiV2luZG93UHJpdmF0ZSB7CiAgIFNiV2luZG93UHJpdmF0ZShEaXNwbGF5KiBkaXNwbGF5LCBjb25zdCBTYldpbmRvd09wdGlvbnMqIG9wdGlvbnMpOwpAQCAtMzIsMTMgKzMzLDEzIEBACiAKICAgV2luZG93IHdpbmRvdzsKIAotI2lmIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNpZiBTQl9BUElfVkVSU0lPTiA+PSBTQl9FWFBFUklNRU5UQUxfQVBJX1ZFUlNJT04gfHwgU0JfSVMoUExBWUVSX1BVTkNIRURfT1VUKQogICB0eXBlZGVmIDo6c3RhcmJvYXJkOjpzaGFyZWQ6OnN0YXJib2FyZDo6cGxheWVyOjpWaWRlb0ZyYW1lIFZpZGVvRnJhbWU7CiAKICAgLy8gQ29tcG9zaXRlcyBncmFwaGljcyBhbmQgdGhlIGdpdmVuIHZpZGVvIGZyYW1lIHZpZGVvIGZvciB0aGlzIHdpbmRvdy4gSW4KLSAgLy8gUExBWUVSX1BVTkNIRURfT1VUIG1vZGUsIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGFueSBncmFwaGljcyBvciB2aWRlbyBpcwotICAvLyBwcmVzZW50ZWQgaW4gdGhlIHdpbmRvdy4gIFRoZSB2aWRlbyBmcmFtZSB3aWxsIGJlIHJlbmRlcmVkIGFjY29yZGluZyB0bwotICAvLyBib3VuZGFyaWVzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVycy4KKyAgLy8ga1NiUGxheWVyT3V0cHV0TW9kZVB1bmNoT3V0IG1vZGUsIHRoaXMgaXMgdGhlIG9ubHkgd2F5IGFueSBncmFwaGljcyBvcgorICAvLyB2aWRlbyBpcyBwcmVzZW50ZWQgaW4gdGhlIHdpbmRvdy4gIFRoZSB2aWRlbyBmcmFtZSB3aWxsIGJlIHJlbmRlcmVkCisgIC8vIGFjY29yZGluZyB0byBib3VuZGFyaWVzIHNwZWNpZmllZCBieSB0aGUgcGFyYW1ldGVycy4KICAgdm9pZCBDb21wb3NpdGUoaW50IGJvdW5kc194LAogICAgICAgICAgICAgICAgICBpbnQgYm91bmRzX3ksCiAgICAgICAgICAgICAgICAgIGludCBib3VuZHNfd2lkdGgsCkBAIC03OSw3ICs4MCw4IEBACiAKICAgLy8gQSBjYWNoZWQgWFJlbmRlciBQaWN0dXJlIHdyYXBwZXIgZm9yIHxnbF93aW5kb3d8LgogICBQaWN0dXJlIGdsX3BpY3R1cmU7Ci0jZW5kaWYgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKKyNlbmRpZiAgLy8gU0JfQVBJX1ZFUlNJT04gPj0gU0JfRVhQRVJJTUVOVEFMX0FQSV9WRVJTSU9OIHx8CisgICAgICAgIC8vIFNCX0lTKFBMQVlFUl9QVU5DSEVEX09VVCkKIAogICAvLyBUaGUgZGlzcGxheSB0aGF0IHRoaXMgd2luZG93IHdhcyBjcmVhdGVkIGZyb20uCiAgIERpc3BsYXkqIGRpc3BsYXk7CmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZC5neXAgYi9zcmMvc3RhcmJvYXJkL3N0YXJib2FyZC5neXAKaW5kZXggMTA4NGIxNi4uYzdkZTMwYiAxMDA2NDQKLS0tIGEvc3JjL3N0YXJib2FyZC9zdGFyYm9hcmQuZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvc3RhcmJvYXJkLmd5cApAQCAtNTksNiArNTksOCBAQAogICAgICAgICAndHlwZXMuaCcsCiAgICAgICAgICd1c2VyLmgnLAogICAgICAgICAnd2luZG93LmgnLAorICAgICAgICAjIEluY2x1ZGUgcHJpdmF0ZSBoZWFkZXJzLCBpZiBwcmVzZW50LgorICAgICAgICAnPCFAKHB5dGhvbiAiPChERVBUSCkvc3RhcmJvYXJkL3Rvb2xzL2ZpbmRfcHJpdmF0ZV9maWxlcy5weSIgIjwoREVQVEgpIiAiKi5oIiknLAogICAgICAgXSwKICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCiAgICAgICAgICc8KERFUFRIKS88KHN0YXJib2FyZF9wYXRoKS9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwOnN0YXJib2FyZF9wbGF0Zm9ybScsCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0dWIvY29uZmlndXJhdGlvbl9wdWJsaWMuaCBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCmluZGV4IGExZDU0ZWMuLjFiNjBmNzEgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCisrKyBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9jb25maWd1cmF0aW9uX3B1YmxpYy5oCkBAIC0zMzgsNiArMzM4LDggQEAKIC8vIHRoZSBzY2VuZSBoYXNuJ3QgY2hhbmdlZC4KICNkZWZpbmUgU0JfTVVTVF9GUkVRVUVOVExZX0ZMSVBfRElTUExBWV9CVUZGRVIgMAogCisjZGVmaW5lIFNCX0hBU19WSVJUVUFMX1JFQUxJVFkgMQorCiAvLyAtLS0gTWVkaWEgQ29uZmlndXJhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU3BlY2lmaWVzIHdoZXRoZXIgdGhpcyBwbGF0Zm9ybSBoYXMgc3VwcG9ydCBmb3IgYSBwb3NzaWJseS1kZWNyeXB0aW5nCkBAIC0zNDgsNiArMzUwLDcgQEAKIC8vIHN1cHBvcnRlZCBjb21wb3NpdGlvbiBtZXRob2RzIGJlbG93LgogI2RlZmluZSBTQl9IQVNfUExBWUVSIDEKIAorI2lmIFNCX0FQSV9WRVJTSU9OIDwgU0JfUExBWUVSX0RFQ09ERV9UT19URVhUVVJFX0FQSV9WRVJTSU9OCiAvLyBTcGVjaWZpZXMgd2hldGhlciB0aGlzIHBsYXRmb3JtJ3MgcGxheWVyIHdpbGwgcHJvZHVjZSBhbiBPcGVuR0wgdGV4dHVyZSB0aGF0CiAvLyB0aGUgY2xpZW50IG11c3QgZHJhdyBldmVyeSBmcmFtZSB3aXRoIGl0cyBncmFwaGljcyByZW5kZXJpbmcuIEl0IG1heSBiZSB0aGF0CiAvLyB3ZSBnZXQgYSB0ZXh0dXJlIGhhbmRsZSwgYnV0IGNhbm5vdCBwZXJmb3JtIG9wZXJhdGlvbnMgbGlrZSBHbFJlYWRQaXhlbHMgb24KQEAgLTM2Niw2ICszNjksNyBAQAogLy8gdGhpcyBjYXNlLCBjaGFuZ2luZyB0aGUgdmlkZW8gYm91bmRzIG11c3QgYmUgdGlnaHRseSBzeW5jaHJvbml6ZWQgYmV0d2VlbiB0aGUKIC8vIHBsYXllciBhbmQgdGhlIGdyYXBoaWNzIHBsYW5lLgogI2RlZmluZSBTQl9JU19QTEFZRVJfUFVOQ0hFRF9PVVQgMQorI2VuZGlmICAvLyBTQl9BUElfVkVSU0lPTiA8IFNCX1BMQVlFUl9ERUNPREVfVE9fVEVYVFVSRV9BUElfVkVSU0lPTgogCiAvLyBBZnRlciBhIHNlZWsgaXMgdHJpZ2dlcnJlZCwgdGhlIGRlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYXBwZW5kIHZpZGVvIGZyYW1lcwogLy8gZnJvbSB0aGUgbGFzdCBrZXkgZnJhbWUgYmVmb3JlIHRoZSBzZWVrIHRpbWUgYW5kIGFwcGVuZCBhdWRpbyBmcmFtZXMgZnJvbSB0aGUKZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9neXBfY29uZmlndXJhdGlvbi5weSBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9neXBfY29uZmlndXJhdGlvbi5weQppbmRleCA3NmE3M2NhLi42M2MxYzlhIDEwMDY0NAotLS0gYS9zcmMvc3RhcmJvYXJkL3N0dWIvZ3lwX2NvbmZpZ3VyYXRpb24ucHkKKysrIGIvc3JjL3N0YXJib2FyZC9zdHViL2d5cF9jb25maWd1cmF0aW9uLnB5CkBAIC0zMiw4ICszMiw5IEBACiAKICAgZGVmIF9faW5pdF9fKHNlbGYsIHBsYXRmb3JtKToKICAgICBzdXBlcihQbGF0Zm9ybUNvbmZpZywgc2VsZikuX19pbml0X18ocGxhdGZvcm0pCi0KLSAgICBzZWxmLmhvc3RfY29tcGlsZXJfZW52aXJvbm1lbnQgPSBneXBfdXRpbHMuR2V0SG9zdENvbXBpbGVyRW52aXJvbm1lbnQoKQorICAgIGdvbWFfc3VwcG9ydHNfY29tcGlsZXIgPSBUcnVlCisgICAgc2VsZi5ob3N0X2NvbXBpbGVyX2Vudmlyb25tZW50ID0gZ3lwX3V0aWxzLkdldEhvc3RDb21waWxlckVudmlyb25tZW50KAorICAgICAgICBnb21hX3N1cHBvcnRzX2NvbXBpbGVyKQogCiAgIGRlZiBHZXRWYXJpYWJsZXMoc2VsZiwgY29uZmlndXJhdGlvbik6CiAgICAgcmV0dXJuIHN1cGVyKFBsYXRmb3JtQ29uZmlnLCBzZWxmKS5HZXRWYXJpYWJsZXMoY29uZmlndXJhdGlvbiwgdXNlX2NsYW5nPTEpCmRpZmYgLS1naXQgYS9zcmMvc3RhcmJvYXJkL3N0dWIvc3RhcmJvYXJkX3BsYXRmb3JtLmd5cCBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCmluZGV4IGIyMjg5NzguLmNjZGQwNWIgMTAwNjQ0Ci0tLSBhL3NyYy9zdGFyYm9hcmQvc3R1Yi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCisrKyBiL3NyYy9zdGFyYm9hcmQvc3R1Yi9zdGFyYm9hcmRfcGxhdGZvcm0uZ3lwCkBAIC0yNSw2ICsyNSw3IEBACiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0YXJib2FyZC9maWxlX21vZGVfc3RyaW5nX3RvX2ZsYWdzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL2xvZ19tZXNzYWdlLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3RhcmJvYXJkL3F1ZXVlX2FwcGxpY2F0aW9uLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF9kaXNwbGF5X3NldHRpbmdzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hY2Nlc3NpYmlsaXR5X2dldF90ZXh0X3RvX3NwZWVjaF9zZXR0aW5ncy5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvYXRvbWljX3B1YmxpYy5oJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9hdWRpb19zaW5rX2NyZWF0ZS5jYycsCkBAIC0xMTgsMTAgKzExOSwxMyBAQAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL29uY2UuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9jcmVhdGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9kZXN0cm95LmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfZ2V0X2N1cnJlbnRfZnJhbWUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9nZXRfaW5mby5jYycsCisgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX291dHB1dF9tb2RlX3N1cHBvcnRlZC5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3NlZWsuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfYm91bmRzLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BhdXNlLmNjJywKKyAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfc2V0X3BsYXliYWNrX3JhdGUuY2MnLAogICAgICAgICAnPChERVBUSCkvc3RhcmJvYXJkL3NoYXJlZC9zdHViL3BsYXllcl9zZXRfdm9sdW1lLmNjJywKICAgICAgICAgJzwoREVQVEgpL3N0YXJib2FyZC9zaGFyZWQvc3R1Yi9wbGF5ZXJfd3JpdGVfZW5kX29mX3N0cmVhbS5jYycsCiAgICAgICAgICc8KERFUFRIKS9zdGFyYm9hcmQvc2hhcmVkL3N0dWIvcGxheWVyX3dyaXRlX3NhbXBsZS5jYycsCkBAIC0yNDcsNiArMjUxLDggQEAKICAgICAgICAgJ2F0b21pY19wdWJsaWMuaCcsCiAgICAgICAgICdtYWluLmNjJywKICAgICAgICAgJ3RocmVhZF90eXBlc19wdWJsaWMuaCcsCisgICAgICAgICMgSW5jbHVkZSBwcml2YXRlIHN0dWJzLCBpZiBwcmVzZW50LgorICAgICAgICAnPCFAKHB5dGhvbiAiPChERVBUSCkvc3RhcmJvYXJkL3Rvb2xzL2ZpbmRfcHJpdmF0ZV9maWxlcy5weSIgIjwoREVQVEgpIiAic2hhcmVkL3N0dWIvKi5jYyIpJywKICAgICAgIF0sCiAgICAgICAnZGVmaW5lcyc6IFsKICAgICAgICAgIyBUaGlzIG11c3QgYmUgZGVmaW5lZCB3aGVuIGJ1aWxkaW5nIFN0YXJib2FyZCwgYW5kIG11c3Qgbm90IHdoZW4KZGlmZiAtLWdpdCBhL3NyYy9zdGFyYm9hcmQvdG9vbHMvZmluZF9wcml2YXRlX2ZpbGVzLnB5IGIvc3JjL3N0YXJib2FyZC90b29scy9maW5kX3ByaXZhdGVfZmlsZXMucHkKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmJiMzZmNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy9zdGFyYm9hcmQvdG9vbHMvZmluZF9wcml2YXRlX2ZpbGVzLnB5CkBAIC0wLDAgKzEsNjEgQEAKKyMhL3Vzci9iaW4vZW52IHB5dGhvbg0KKyMgQ29weXJpZ2h0IDIwMTcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4NCisjDQorIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsNCisjIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4NCisjIFlvdSBtYXkgb2J0YWluIGEgY29weSBvZiB0aGUgTGljZW5zZSBhdA0KKyMNCisjICAgICBodHRwOiN3d3cuYXBhY2hlLm9yZy9saWNlbnNlcy9MSUNFTlNFLTIuMA0KKyMNCisjIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUNCisjIGRpc3RyaWJ1dGVkIHVuZGVyIHRoZSBMaWNlbnNlIGlzIGRpc3RyaWJ1dGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsDQorIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4NCisjIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQNCisjIGxpbWl0YXRpb25zIHVuZGVyIHRoZSBMaWNlbnNlLg0KKycnJ0d5cCBoZWxwZXIgdG8gZmluZCBwcml2YXRlIGZpbGVzIGlmIHByZXNlbnQuDQorDQorVGhlIGZpcnN0IGFyZ3VtZW50IGlzIHRoZSByZXN1bHQgb2YgIjwoREVQVEgpIiBmcm9tIGd5cCwgdGhlIHNlY29uZCBhcmd1bWVudA0KK2lzIHRoZSBwYXRoL3BhdHRlcm4gZnJvbSA8KERFUFRIKS9zdGFyYm9hcmQvcHJpdmF0ZS8uIFBhdHRlcm5zIHNob3VsZCBiZSBnaXZlbg0KK3VzaW5nIFVuaXggcGF0aCBzdHlsZSAnLycuDQorDQorcHl0aG9uIGZpbmRfcHJpdmF0ZV9maWxlcy5weSAiLi4iICIqLmgiDQorV291bGQgcmV0dXJuIGZpbGVzIG1hdGNoaW5nIC4uL3N0YXJib2FyZC9wcml2YXRlLyouaCBpZiBhbnkgZXhpc3QuDQorDQorcHl0aG9uIGZpbmRfcHJpdmF0ZV9maWxlcy5weSAiLi4iICJucGxiLypfdGVzdC5jYyINCitXb3VsZCByZXR1cm4gZmlsZXMgbWF0Y2hpbmcgLi4vc3RhcmJvYXJkL3ByaXZhdGUvbnBsYi8qX3Rlc3QuY2MgaWYgYW55IGV4aXN0Lg0KKw0KK05PVEU6IGd5cCBlcnJvcnMgb2Z0ZW4gcHJvZHVjZSBubyB3YXJuaW5ncy4gQmUgc3VyZSB0byBzdHJ1Y3R1cmUgdXNhZ2VzIG9mIHRoaXMNCitzY3JpcHQgYnkgZ3lwIGZpbGVzIGxpa2UgdGhlIGxpbmUgYmVsb3csIHdoZXJlIHRoZSc8IUAnIGlzIGEgZ3lwIGNvbW1hbmQNCitleHBhbnNpb24gdGhhdCB3aWxsIHByb2Nlc3MgdGhlIHJlc3VsdHMgaW50byBhIGxpc3Qgb2YgcmV0dXJuZWQgZmlsZSBwYXRocy4NCitRdW90aW5nIGFyZ3VtZW50cyBwcm90ZWN0cyBhZ2FpbnN0IHdpbGRjYXJkIGV4cGFuc2lvbiBhbmQgb3RoZXIgdW5kZXNpcmFibGUNCitneXAvc2hlbGwgYmVoYXZpb3IuDQorJzwhQChweXRob24gIjwoREVQVEgpL3N0YXJib2FyZC90b29scy9maW5kX3ByaXZhdGVfZmlsZXMucHkiICI8KERFUFRIKSIgIiouaCIpJywNCisnJycNCisNCitpbXBvcnQgZ2xvYg0KK2ltcG9ydCBvcw0KK2ltcG9ydCBzeXMNCisNCitfUFJJVkFURV9ESVJfUEFUSCA9ICdzdGFyYm9hcmQvcHJpdmF0ZScNCisNCitkZWYgZmluZF9wcml2YXRlX2ZpbGVzKGRlcHRoLCB0YXJnZXRfcGF0dGVybik6DQorICAnJydBc3NlbWJsZXMgc2VhcmNoIGdsb2IgYW5kIGZpbmRzIGZpbGVzIG1hdGNoaW5nIHRoZSB0YXJnZXQgcGF0dGVybi4NCisNCisgIEFyZ3M6DQorICAgIGRlcHRoOiBUaGUgc3RyaW5nIHJlc3VsdCBvZiAiPChERVBUSCkiIiBmcm9tIGd5cC4NCisgICAgdGFyZ2V0X3BhdHRlcm46IFRoZSBzdHJpbmcgcGF0aC9wYXR0ZXJuIGZyb20gPChERVBUSCkvc3RhcmJvYXJkL3ByaXZhdGUvLg0KKyAgJycnDQorICBwYXRoID0gb3MucGF0aC5ub3JtcGF0aChvcy5wYXRoLmpvaW4oDQorICAgICAgZGVwdGgsIF9QUklWQVRFX0RJUl9QQVRILCB0YXJnZXRfcGF0dGVybikpDQorICBmb3IgZiBpbiBnbG9iLmlnbG9iKHBhdGgpOg0KKyAgICAjIFN3aXRjaCB0byBVbml4IHN0eWxlICcvJyBmb3IgZ3lwLg0KKyAgICBwcmludCBmLnJlcGxhY2UoJ1xcJywgJy8nKQ0KKw0KKw0KK2lmIF9fbmFtZV9fID09ICdfX21haW5fXyc6DQorICBkZXB0aF9hcmcgPSBzeXMuYXJndlsxXQ0KKyAgdGFyZ2V0X3BhdHRlcm5fYXJnID0gc3lzLmFyZ3ZbMl0NCisNCisgIGZpbmRfcHJpdmF0ZV9maWxlcyhkZXB0aF9hcmcsIHRhcmdldF9wYXR0ZXJuX2FyZykNCisNCisgIHN5cy5leGl0KDApDQpkaWZmIC0tZ2l0IGEvc3JjL3Rlc3RpbmcvZ3Rlc3QvaW5jbHVkZS9ndGVzdC9ndGVzdC1tZXNzYWdlLmggYi9zcmMvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaAppbmRleCBmZTg3OWJjLi44NTk4YjhlIDEwMDY0NAotLS0gYS9zcmMvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaAorKysgYi9zcmMvdGVzdGluZy9ndGVzdC9pbmNsdWRlL2d0ZXN0L2d0ZXN0LW1lc3NhZ2UuaApAQCAtNTYsNiArNTYsMTEgQEAKIAogbmFtZXNwYWNlIHRlc3RpbmcgewogCisvLyBUT0RPOiBSZW1vdmUgY2xhbmcgdmVyc2lvbiBjaGVjayB3b3JrYXJvdW5kLgorI2lmIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPT0gMyAmJiBfX2NsYW5nX21pbm9yX18gPD0gNgorI2RlZmluZSBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgorI2VuZGlmICAvLyBfX2NsYW5nX18gJiYgX19jbGFuZ19tYWpvcl9fID09IDMgJiYgX19jbGFuZ19taW5vcl9fIDw9IDYKKwogLy8gVGhlIE1lc3NhZ2UgY2xhc3Mgd29ya3MgbGlrZSBhbiBvc3RyZWFtIHJlcGVhdGVyLgogLy8KIC8vIFR5cGljYWwgdXNhZ2U6CkBAIC05Miw2ICs5NywxNyBAQAogICAvLyBDb25zdHJ1Y3RzIGFuIGVtcHR5IE1lc3NhZ2UuCiAgIE1lc3NhZ2UoKTsKIAorI2lmIGRlZmluZWQoQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYpCisgIC8vIENvcHkgY29uc3RydWN0b3IuCisgIE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbXNnKSB7ICAvLyBOT0xJTlQKKyAgICBzc18gPDwgbXNnLkdldFN0cmluZygpOworICB9CisKKyAgLy8gQ29uc3RydWN0cyBhIE1lc3NhZ2UgZnJvbSBhIEMtc3RyaW5nLgorICBleHBsaWNpdCBNZXNzYWdlKGNvbnN0IGNoYXIqIHN0cikgeworICAgIHNzXyA8PCBzdHI7CisgIH0KKyNlbHNlCiAgIC8vIENvcHkgY29uc3RydWN0b3IuCiAgIE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbXNnKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgeyAgLy8gTk9MSU5UCiAgICAgKnNzXyA8PCBtc2cuR2V0U3RyaW5nKCk7CkBAIC0xMDEsNiArMTE3LDcgQEAKICAgZXhwbGljaXQgTWVzc2FnZShjb25zdCBjaGFyKiBzdHIpIDogc3NfKG5ldyA6OnN0ZDo6c3RyaW5nc3RyZWFtKSB7CiAgICAgKnNzXyA8PCBzdHI7CiAgIH0KKyNlbmRpZiAgLy8gQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYKIAogI2lmIEdURVNUX09TX1NZTUJJQU4KICAgLy8gU3RyZWFtcyBhIHZhbHVlIChlaXRoZXIgYSBwb2ludGVyIG9yIG5vdCkgdG8gdGhpcyBvYmplY3QuCkBAIC0xMjgsNyArMTQ1LDExIEBACiAgICAgLy8gb3ZlcmxvYWRzIG9mIDw8IGRlZmluZWQgaW4gdGhlIGdsb2JhbCBuYW1lc3BhY2UgYW5kIHRob3NlCiAgICAgLy8gdmlzaWJsZSB2aWEgS29lbmlnIGxvb2t1cCBhcmUgYm90aCBleHBvc2VkIGluIHRoaXMgZnVuY3Rpb24uCiAgICAgdXNpbmcgOjpvcGVyYXRvciA8PDsKKyNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQorICAgIHNzXyA8PCB2YWw7CisjZWxzZQogICAgICpzc18gPDwgdmFsOworI2VuZGlmICAvLyBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgogICAgIHJldHVybiAqdGhpczsKICAgfQogCkBAIC0xNDcsMTEgKzE2OCwxOSBAQAogICAvLyBhcyAiKG51bGwpIi4KICAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CiAgIGlubGluZSBNZXNzYWdlJiBvcGVyYXRvciA8PChUKiBjb25zdCYgcG9pbnRlcikgeyAgLy8gTk9MSU5UCisjaWYgZGVmaW5lZChDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNikKKyAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CisgICAgICBzc18gPDwgIihudWxsKSI7CisgICAgfSBlbHNlIHsKKyAgICAgIHNzXyA8PCBwb2ludGVyOworICAgIH0KKyNlbHNlCiAgICAgaWYgKHBvaW50ZXIgPT0gTlVMTCkgewogICAgICAgKnNzXyA8PCAiKG51bGwpIjsKICAgICB9IGVsc2UgewogICAgICAgKnNzXyA8PCBwb2ludGVyOwogICAgIH0KKyNlbmRpZiAgLy8gQ0xBTkdfTUFKT1JfM19NSU5PUl9MT1dFUl9USEFOXzYKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KICNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgpAQCAtMTYzLDcgKzE5MiwxMSBAQAogICAvLyBlbmRsIG9yIG90aGVyIGJhc2ljIElPIG1hbmlwdWxhdG9ycyB0byBNZXNzYWdlIHdpbGwgY29uZnVzZSB0aGUKICAgLy8gY29tcGlsZXIuCiAgIE1lc3NhZ2UmIG9wZXJhdG9yIDw8KEJhc2ljTmFycm93SW9NYW5pcCB2YWwpIHsKKyNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQorICAgIHNzXyA8PCB2YWw7CisjZWxzZQogICAgICpzc18gPDwgdmFsOworI2VuZGlmICAvLyBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgogICAgIHJldHVybiAqdGhpczsKICAgfQogCkBAIC0yMDQsMTEgKzIzNywxOSBAQAogICAvLyB0cjE6OnR5cGVfdHJhaXRzLWxpa2UgaXNfcG9pbnRlciB3b3JrcywgYW5kIHdlIGNhbiBvdmVybG9hZCBvbiB0aGF0LgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KICAgaW5saW5lIHZvaWQgU3RyZWFtSGVscGVyKGludGVybmFsOjp0cnVlX3R5cGUgLyppc19wb2ludGVyKi8sIFQqIHBvaW50ZXIpIHsKKyNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQorICAgIGlmIChwb2ludGVyID09IE5VTEwpIHsKKyAgICAgIHNzXyA8PCAiKG51bGwpIjsKKyAgICB9IGVsc2UgeworICAgICAgc3NfIDw8IHBvaW50ZXI7CisgICAgfQorI2Vsc2UKICAgICBpZiAocG9pbnRlciA9PSBOVUxMKSB7CiAgICAgICAqc3NfIDw8ICIobnVsbCkiOwogICAgIH0gZWxzZSB7CiAgICAgICAqc3NfIDw8IHBvaW50ZXI7CiAgICAgfQorI2VuZGlmICAvLyBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgogICB9CiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICBpbmxpbmUgdm9pZCBTdHJlYW1IZWxwZXIoaW50ZXJuYWw6OmZhbHNlX3R5cGUgLyppc19wb2ludGVyKi8sCkBAIC0yMTYsMTIgKzI1NywyMCBAQAogICAgIC8vIFNlZSB0aGUgY29tbWVudHMgaW4gTWVzc2FnZSYgb3BlcmF0b3IgPDwoY29uc3QgVCYpIGFib3ZlIGZvciB3aHkKICAgICAvLyB3ZSBuZWVkIHRoaXMgdXNpbmcgc3RhdGVtZW50LgogICAgIHVzaW5nIDo6b3BlcmF0b3IgPDw7CisjaWYgZGVmaW5lZChDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNikKKyAgICBzc18gPDwgdmFsdWU7CisjZWxzZQogICAgICpzc18gPDwgdmFsdWU7CisjZW5kaWYgIC8vIENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82CiAgIH0KICNlbmRpZiAgLy8gR1RFU1RfT1NfU1lNQklBTgogCiAgIC8vIFdlJ2xsIGhvbGQgdGhlIHRleHQgc3RyZWFtZWQgdG8gdGhpcyBvYmplY3QgaGVyZS4KKyNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQorICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHNzXzsKKyNlbHNlCiAgIGNvbnN0IGludGVybmFsOjpzY29wZWRfcHRyPCA6OnN0ZDo6c3RyaW5nc3RyZWFtPiBzc187CisjZW5kaWYgIC8vIENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82CiAKICAgLy8gV2UgZGVjbGFyZSAoYnV0IGRvbid0IGltcGxlbWVudCkgdGhpcyB0byBwcmV2ZW50IHRoZSBjb21waWxlcgogICAvLyBmcm9tIGltcGxlbWVudGluZyB0aGUgYXNzaWdubWVudCBvcGVyYXRvci4KZGlmZiAtLWdpdCBhL3NyYy90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC5jYyBiL3NyYy90ZXN0aW5nL2d0ZXN0L3NyYy9ndGVzdC5jYwppbmRleCAyZWY5MGU4Li45MjY4MjA4IDEwMDY0NAotLS0gYS9zcmMvdGVzdGluZy9ndGVzdC9zcmMvZ3Rlc3QuY2MKKysrIGIvc3JjL3Rlc3RpbmcvZ3Rlc3Qvc3JjL2d0ZXN0LmNjCkBAIC05NTAsMTEgKzk1MCwxOSBAQAogLy8gQVNTRVJUL0VYUEVDVCBpbiBhIHByb2NlZHVyZSBhZGRzIG92ZXIgMjAwIGJ5dGVzIHRvIHRoZSBwcm9jZWR1cmUncwogLy8gc3RhY2sgZnJhbWUgbGVhZGluZyB0byBodWdlIHN0YWNrIGZyYW1lcyBpbiBzb21lIGNhc2VzOyBnY2MgZG9lcyBub3QgcmV1c2UKIC8vIHRoZSBzdGFjayBzcGFjZS4KKyNpZiBkZWZpbmVkKENMQU5HX01BSk9SXzNfTUlOT1JfTE9XRVJfVEhBTl82KQorTWVzc2FnZTo6TWVzc2FnZSgpIHsKKyAgLy8gQnkgZGVmYXVsdCwgd2Ugd2FudCB0aGVyZSB0byBiZSBlbm91Z2ggcHJlY2lzaW9uIHdoZW4gcHJpbnRpbmcKKyAgLy8gYSBkb3VibGUgdG8gYSBNZXNzYWdlLgorICBzc18gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDIpOworfQorI2Vsc2UKIE1lc3NhZ2U6Ok1lc3NhZ2UoKSA6IHNzXyhuZXcgOjpzdGQ6OnN0cmluZ3N0cmVhbSkgewogICAvLyBCeSBkZWZhdWx0LCB3ZSB3YW50IHRoZXJlIHRvIGJlIGVub3VnaCBwcmVjaXNpb24gd2hlbiBwcmludGluZwogICAvLyBhIGRvdWJsZSB0byBhIE1lc3NhZ2UuCiAgICpzc18gPDwgc3RkOjpzZXRwcmVjaXNpb24oc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpkaWdpdHMxMCArIDIpOwogfQorI2VuZGlmICAvLyBDTEFOR19NQUpPUl8zX01JTk9SX0xPV0VSX1RIQU5fNgogCiAvLyBUaGVzZSB0d28gb3ZlcmxvYWRzIGFsbG93IHN0cmVhbWluZyBhIHdpZGUgQyBzdHJpbmcgdG8gYSBNZXNzYWdlCiAvLyB1c2luZyB0aGUgVVRGLTggZW5jb2RpbmcuCkBAIC05ODYsNyArOTk0LDEyIEBACiAvLyBHZXRzIHRoZSB0ZXh0IHN0cmVhbWVkIHRvIHRoaXMgb2JqZWN0IHNvIGZhciBhcyBhbiBzdGQ6OnN0cmluZy4KIC8vIEVhY2ggJ1wwJyBjaGFyYWN0ZXIgaW4gdGhlIGJ1ZmZlciBpcyByZXBsYWNlZCB3aXRoICJcXDAiLgogc3RkOjpzdHJpbmcgTWVzc2FnZTo6R2V0U3RyaW5nKCkgY29uc3QgeworI2lmIF9fY2xhbmdfXyAmJiBfX2NsYW5nX21ham9yX18gPT0gMyAmJiBfX2NsYW5nX21pbm9yX18gPD0gNgorICA6OnN0ZDo6c3RyaW5nc3RyZWFtIHN0cmVhbShzc18uc3RyKCkpOworICByZXR1cm4gaW50ZXJuYWw6OlN0cmluZ1N0cmVhbVRvU3RyaW5nKCZzdHJlYW0pOworI2Vsc2UKICAgcmV0dXJuIGludGVybmFsOjpTdHJpbmdTdHJlYW1Ub1N0cmluZyhzc18uZ2V0KCkpOworI2VuZGlmICAvLyBfX2NsYW5nX18gJiYgX19jbGFuZ19tYWpvcl9fID09IDMgJiYgX19jbGFuZ19taW5vcl9fIDw9IDYKIH0KIAogLy8gQXNzZXJ0aW9uUmVzdWx0IGNvbnN0cnVjdG9ycy4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9ibGluay9Tb3VyY2UvYmluZGluZ3Mvc2NyaXB0cy9jb21wdXRlX2ludGVyZmFjZXNfaW5mb19pbmRpdmlkdWFsLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1NvdXJjZS9iaW5kaW5ncy9zY3JpcHRzL2NvbXB1dGVfaW50ZXJmYWNlc19pbmZvX2luZGl2aWR1YWwucHkKaW5kZXggYWFlOWJlMS4uOTM5YmRkYyAxMDA3NTUKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1NvdXJjZS9iaW5kaW5ncy9zY3JpcHRzL2NvbXB1dGVfaW50ZXJmYWNlc19pbmZvX2luZGl2aWR1YWwucHkKKysrIGIvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1NvdXJjZS9iaW5kaW5ncy9zY3JpcHRzL2NvbXB1dGVfaW50ZXJmYWNlc19pbmZvX2luZGl2aWR1YWwucHkKQEAgLTIwMSw2ICsyMDEsOSBAQAogICAgICAgICAgICAgaW50ZXJmYWNlX2luZm8gPSB7CiAgICAgICAgICAgICAgICAgJ2lzX2NhbGxiYWNrX2ludGVyZmFjZSc6IEZhbHNlLAogICAgICAgICAgICAgICAgICdpc19kaWN0aW9uYXJ5JzogVHJ1ZSwKKyAgICAgICAgICAgICAgICAnaXNfZGVwZW5kZW5jeSc6IFRydWUsCisgICAgICAgICAgICAgICAgJ2NvbmRpdGlvbmFsJzogZGVmaW5pdGlvbi5leHRlbmRlZF9hdHRyaWJ1dGVzLmdldCgnQ29uZGl0aW9uYWwnLCBOb25lKSwKKyAgICAgICAgICAgICAgICAndW5zdXBwb3J0ZWQnOiAnTm90U3VwcG9ydGVkJyBpbiBkZWZpbml0aW9uLmV4dGVuZGVkX2F0dHJpYnV0ZXMsCiAgICAgICAgICAgICAgICAgJ3JlZmVyZW5jZWRfaW50ZXJmYWNlcyc6IE5vbmUsCiAgICAgICAgICAgICB9CiAgICAgICAgIGVsc2U6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvU291cmNlL2JpbmRpbmdzL3NjcmlwdHMvaWRsX2NvbXBpbGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1NvdXJjZS9iaW5kaW5ncy9zY3JpcHRzL2lkbF9jb21waWxlci5weQppbmRleCAxNzAxMGMzLi45OGNiNGRlIDEwMDc1NQotLS0gYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvU291cmNlL2JpbmRpbmdzL3NjcmlwdHMvaWRsX2NvbXBpbGVyLnB5CisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ibGluay9Tb3VyY2UvYmluZGluZ3Mvc2NyaXB0cy9pZGxfY29tcGlsZXIucHkKQEAgLTQxLDcgKzQxLDcgQEAKIGZyb20gY29kZV9nZW5lcmF0b3JfY29iYWx0IGltcG9ydCBDb2RlR2VuZXJhdG9yQ29iYWx0CiBmcm9tIGNvZGVfZ2VuZXJhdG9yX3Y4IGltcG9ydCBDb2RlR2VuZXJhdG9yRGljdGlvbmFyeUltcGwsIENvZGVHZW5lcmF0b3JWOCwgQ29kZUdlbmVyYXRvclVuaW9uVHlwZQogZnJvbSBpZGxfcmVhZGVyIGltcG9ydCBJZGxSZWFkZXIKLWZyb20gdXRpbGl0aWVzIGltcG9ydCByZWFkX2lkbF9maWxlc19saXN0X2Zyb21fZmlsZSwgd3JpdGVfZmlsZSwgaWRsX2ZpbGVuYW1lX3RvX2NvbXBvbmVudAorZnJvbSB1dGlsaXRpZXMgaW1wb3J0IHJlYWRfaWRsX2ZpbGVzX2xpc3RfZnJvbV9maWxlLCB3cml0ZV9maWxlLCBpZGxfZmlsZW5hbWVfdG9fY29tcG9uZW50LCBpZGxfZmlsZW5hbWVfdG9faW50ZXJmYWNlX25hbWUKIAogCiBkZWYgcGFyc2Vfb3B0aW9ucygpOgpAQCAtNzQsMTIgKzc0LDYgQEAKICAgICByZXR1cm4gb3B0aW9ucywgaWRsX2ZpbGVuYW1lCiAKIAotZGVmIGlkbF9maWxlbmFtZV90b19pbnRlcmZhY2VfbmFtZShpZGxfZmlsZW5hbWUpOgotICAgIGJhc2VuYW1lID0gb3MucGF0aC5iYXNlbmFtZShpZGxfZmlsZW5hbWUpCi0gICAgaW50ZXJmYWNlX25hbWUsIF8gPSBvcy5wYXRoLnNwbGl0ZXh0KGJhc2VuYW1lKQotICAgIHJldHVybiBpbnRlcmZhY2VfbmFtZQotCi0KIGNsYXNzIElkbENvbXBpbGVyKG9iamVjdCk6CiAgICAgIiIiQWJzdHJhY3QgQmFzZSBDbGFzcyBmb3IgSURMIGNvbXBpbGVycy4KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1NvdXJjZS9iaW5kaW5ncy9zY3JpcHRzL2lkbF9yZWFkZXIucHkgYi9zcmMvdGhpcmRfcGFydHkvYmxpbmsvU291cmNlL2JpbmRpbmdzL3NjcmlwdHMvaWRsX3JlYWRlci5weQppbmRleCAzYWJkN2EwLi5jOGI0M2E4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvU291cmNlL2JpbmRpbmdzL3NjcmlwdHMvaWRsX3JlYWRlci5weQorKysgYi9zcmMvdGhpcmRfcGFydHkvYmxpbmsvU291cmNlL2JpbmRpbmdzL3NjcmlwdHMvaWRsX3JlYWRlci5weQpAQCAtMzksNyArMzksNyBAQAogZnJvbSBpZGxfZGVmaW5pdGlvbnMgaW1wb3J0IElkbERlZmluaXRpb25zCiBmcm9tIGlkbF92YWxpZGF0b3IgaW1wb3J0IEVYVEVOREVEX0FUVFJJQlVURVNfUkVMQVRJVkVfUEFUSCwgSURMSW52YWxpZEV4dGVuZGVkQXR0cmlidXRlRXJyb3IsIElETEV4dGVuZGVkQXR0cmlidXRlVmFsaWRhdG9yCiBmcm9tIGludGVyZmFjZV9kZXBlbmRlbmN5X3Jlc29sdmVyIGltcG9ydCBJbnRlcmZhY2VEZXBlbmRlbmN5UmVzb2x2ZXIKLWZyb20gdXRpbGl0aWVzIGltcG9ydCBpZGxfZmlsZW5hbWVfdG9fY29tcG9uZW50Citmcm9tIHV0aWxpdGllcyBpbXBvcnQgaWRsX2ZpbGVuYW1lX3RvX2NvbXBvbmVudCwgaWRsX2ZpbGVuYW1lX3RvX2ludGVyZmFjZV9uYW1lCiAKIAogY2xhc3MgSWRsUmVhZGVyKG9iamVjdCk6CkBAIC04Myw4ICs4Myw4IEBACiAgICAgICAgIGlmIGFzdC5HZXRQcm9wZXJ0eSgnRVJST1JTJyk6CiAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oJ0VuY291bnRlcmVkICVkIGVycm9yKHMpIHBhcnNpbmcgJXMnICUgKAogICAgICAgICAgICAgICAgIGFzdC5HZXRQcm9wZXJ0eSgnRVJST1JTJyksIGlkbF9maWxlbmFtZSkpCi0gICAgICAgIGlkbF9maWxlX2Jhc2VuYW1lLCBfID0gb3MucGF0aC5zcGxpdGV4dChvcy5wYXRoLmJhc2VuYW1lKGlkbF9maWxlbmFtZSkpCi0gICAgICAgIGRlZmluaXRpb25zID0gSWRsRGVmaW5pdGlvbnMoaWRsX2ZpbGVfYmFzZW5hbWUsIGFzdCkKKyAgICAgICAgaWRsX2ludGVyZmFjZV9uYW1lID0gaWRsX2ZpbGVuYW1lX3RvX2ludGVyZmFjZV9uYW1lKGlkbF9maWxlbmFtZSkKKyAgICAgICAgZGVmaW5pdGlvbnMgPSBJZGxEZWZpbml0aW9ucyhpZGxfaW50ZXJmYWNlX25hbWUsIGFzdCkKIAogICAgICAgICAjIFZhbGlkYXRlIGZpbGUgY29udGVudHMgd2l0aCBmaWxlbmFtZSBjb252ZW50aW9uCiAgICAgICAgICMgVGhlIEJsaW5rIElETCBmaWxlbmFtaW5nIGNvbnZlbnRpb24gaXMgdGhhdCB0aGUgZmlsZQpAQCAtMTAwLDEwICsxMDAsMjAgQEAKICAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgZXhhY3RseSAxIGRlZmluaXRpb24gaW4gZmlsZSB7MH0sIGJ1dCBmb3VuZCB7MX0nCiAgICAgICAgICAgICAgICAgLmZvcm1hdChpZGxfZmlsZW5hbWUsIG51bWJlcl9vZl90YXJnZXRzKSkKICAgICAgICAgdGFyZ2V0ID0gdGFyZ2V0c1swXQotICAgICAgICBpZiBub3QgdGFyZ2V0LmlzX3BhcnRpYWwgYW5kIHRhcmdldC5uYW1lICE9IGlkbF9maWxlX2Jhc2VuYW1lOgotICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICdEZWZpbml0aW9uIG5hbWUgInswfSIgZGlzYWdyZWVzIHdpdGggSURMIGZpbGUgYmFzZW5hbWUgInsxfSIuJwotICAgICAgICAgICAgICAgIC5mb3JtYXQodGFyZ2V0Lm5hbWUsIGlkbF9maWxlX2Jhc2VuYW1lKSkKKyAgICAgICAgaWYgbm90IHRhcmdldC5pc19wYXJ0aWFsIGFuZCB0YXJnZXQubmFtZSAhPSBpZGxfaW50ZXJmYWNlX25hbWU6CisgICAgICAgICAgICBpZiB0YXJnZXQubmFtZS5sb3dlcigpID09IGlkbF9pbnRlcmZhY2VfbmFtZS5sb3dlcigpOgorICAgICAgICAgICAgICAgICMgTmFtZXMgZGlmZmVyIG9ubHkgYnkgY2FwaXRhbGl6YXRpb24uIFRoaXMgY291bGQgaW5kaWNhdGUgYQorICAgICAgICAgICAgICAgICMgcHJvYmxlbSB3aXRoIHRoZSBzcGVjaWFsIHRva2VucyBpbiB0aGUgc25ha2VfY2FzZS0+VGl0bGVDYXNlCisgICAgICAgICAgICAgICAgIyBjb252ZXJzaW9uIGluCisgICAgICAgICAgICAgICAgcmFpc2UgRXhjZXB0aW9uKAorICAgICAgICAgICAgICAgICAgICAnIlVuZXhwZWN0ZWQgY2FwaXRhbGl6YXRpb24gb2YgZGVmaW5pdGlvbiBuYW1lICJ7MH0iIGZvciBJREwgZmlsZSBuYW1lICJ7MX0iLiAnCisgICAgICAgICAgICAgICAgICAgICdEb2VzIGEgc3BlY2lhbCB0b2tlbiBuZWVkIHRvIGJlIGFkZGVkIHRvICcKKyAgICAgICAgICAgICAgICAgICAgJ2lkbF9maWxlbmFtZV90b19pbnRlcmZhY2VfbmFtZSBpbiB1dGlsaXRpZXMucHk/JworICAgICAgICAgICAgICAgICAgICAuZm9ybWF0KHRhcmdldC5uYW1lLCBvcy5wYXRoLmJhc2VuYW1lKGlkbF9maWxlbmFtZSkpKQorICAgICAgICAgICAgZWxzZToKKyAgICAgICAgICAgICAgICByYWlzZSBFeGNlcHRpb24oCisgICAgICAgICAgICAgICAgICAgICdEZWZpbml0aW9uIG5hbWUgInswfSIgZGlzYWdyZWVzIHdpdGggSURMIGZpbGUgbmFtZSAiezF9Ii4nCisgICAgICAgICAgICAgICAgICAgIC5mb3JtYXQodGFyZ2V0Lm5hbWUsIG9zLnBhdGguYmFzZW5hbWUoaWRsX2ZpbGVuYW1lKSkpCiAKICAgICAgICAgIyBWYWxpZGF0ZSBleHRlbmRlZCBhdHRyaWJ1dGVzCiAgICAgICAgIGlmIG5vdCBzZWxmLmV4dGVuZGVkX2F0dHJpYnV0ZV92YWxpZGF0b3I6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvU291cmNlL2JpbmRpbmdzL3NjcmlwdHMvdXRpbGl0aWVzLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1NvdXJjZS9iaW5kaW5ncy9zY3JpcHRzL3V0aWxpdGllcy5weQppbmRleCBjMDE3MGQ2Li4yZDQ3ZjNmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvU291cmNlL2JpbmRpbmdzL3NjcmlwdHMvdXRpbGl0aWVzLnB5CisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ibGluay9Tb3VyY2UvYmluZGluZ3Mvc2NyaXB0cy91dGlsaXRpZXMucHkKQEAgLTI0LDYgKzI0LDcgQEAKICAgICAgICAgJ2RlYnVnJywKICAgICAgICAgJ2RvbScsCiAgICAgICAgICdoNXZjYycsCisgICAgICAgICdtZWRpYV9zZXNzaW9uJywKICAgICAgICAgJ3NwZWVjaCcsCiAgICAgICAgICd0ZXN0aW5nJywKICAgICAgICAgJ3dlYl9hbmltYXRpb25zJywKQEAgLTMyLDEwICszMywyNyBAQAogICAgICAgICAneGhyJywKICAgICBdKQogCisjIExpc3Qgb2YgcmVndWxhciBleHByZXNzaW9ucyBmaW5kaW5nIHRva2VucyB0aGF0IHdvdWxkIGFwcGVhciBpbiBhIG5hbWUgdGhhdAorIyB3YXMgY29udmVydGVkIGZyb20gc25ha2VfY2FzZSB0byBUaXRsZUNhc2UsIGJ1dCBieSBjb252ZW50aW9uIHNob3VsZCBiZSBpbgorIyBBTEwgQ0FQUyBpLmUuIGh0bWxfaHRtbF9lbGVtZW50IC0+IEh0bWxIdG1sRWxlbWVudCAtPiBIVE1MSHRtbEVsZW1lbnQKK3NwZWNpYWxfdG9rZW5fbGlzdCA9IFsnM2QnLCAnQnInLCAnQ2RhdGEnLCAnQ3NzJywgJ0RvbScsICdeSHRtbCcsICdJZGw/JywgJ1VpKD8hbnQpJywgJ1VybCcsICdYbWwnXQorCisKKyMgUmVndWxhciBleHByZXNzaW9uIHRvIGNhcHR1cmUgYWxsIG9mIHRoZSBzcGVjaWFsIHRva2Vucy4KK3NwZWNpYWxfdG9rZW5fcmUgPSByZS5jb21waWxlKCd8Jy5qb2luKHNwZWNpYWxfdG9rZW5fbGlzdCkpCisKIAogZGVmIGlkbF9maWxlbmFtZV90b19pbnRlcmZhY2VfbmFtZShpZGxfZmlsZW5hbWUpOgotICAgICMgaW50ZXJmYWNlIG5hbWUgaXMgdGhlIHJvb3Qgb2YgdGhlIGJhc2VuYW1lOiBJbnRlcmZhY2VOYW1lLmlkbAotICAgIHJldHVybiBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoaWRsX2ZpbGVuYW1lKSlbMF0KKyAgICAiIiJHZXQgSW50ZXJmYWNlTmFtZSBmcm9tIGludGVyZmFjZV9uYW1lLmlkbCIiIgorICAgICMgQ29udmVydCB0aGUgbmFtZSB0byBUaXRsZUNhc2UuCisgICAgYmFzZW5hbWUgPSBvcy5wYXRoLnNwbGl0ZXh0KG9zLnBhdGguYmFzZW5hbWUoaWRsX2ZpbGVuYW1lKSlbMF0KKyAgICB0aXRsZV9jYXNlX25hbWUgPSAiIi5qb2luKHRva2VuLmNhcGl0YWxpemUoKSBmb3IgdG9rZW4gaW4gYmFzZW5hbWUuc3BsaXQoIl8iKSkKKyAgICAjIEZpbmQgYW55IHNwZWNpYWwgdG9rZW5zIHRoYXQgc2hvdWxkIGJlIGluIFVQUEVSIENBU0UuCisgICAgZm9yIG1hdGNoIGluIHNwZWNpYWxfdG9rZW5fcmUuZmluZGl0ZXIodGl0bGVfY2FzZV9uYW1lKToKKyAgICAgICAgdGl0bGVfY2FzZV9uYW1lID0gKHRpdGxlX2Nhc2VfbmFtZVs6bWF0Y2guc3RhcnQoKV0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVfY2FzZV9uYW1lW21hdGNoLnN0YXJ0KCk6bWF0Y2guZW5kKCldLnVwcGVyKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGl0bGVfY2FzZV9uYW1lW21hdGNoLmVuZCgpOl0pCisgICAgcmV0dXJuIHRpdGxlX2Nhc2VfbmFtZQogCiAKIGRlZiBpZGxfZmlsZW5hbWVfdG9fY29tcG9uZW50KGlkbF9maWxlbmFtZSk6CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9iaW5kaW5ncy9tYWluLnB5IGIvc3JjL3RoaXJkX3BhcnR5L2JsaW5rL1Rvb2xzL1NjcmlwdHMvd2Via2l0cHkvYmluZGluZ3MvbWFpbi5weQppbmRleCAzMGE2MTE5Li4yMjU5ZjliIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvYmxpbmsvVG9vbHMvU2NyaXB0cy93ZWJraXRweS9iaW5kaW5ncy9tYWluLnB5CisrKyBiL3NyYy90aGlyZF9wYXJ0eS9ibGluay9Ub29scy9TY3JpcHRzL3dlYmtpdHB5L2JpbmRpbmdzL21haW4ucHkKQEAgLTE4OCwxNCArMTg4LDEzIEBACiAgICAgZXhlY3V0aXZlID0gRXhlY3V0aXZlKCkKIAogICAgIGRlZiBsaXN0X2ZpbGVzKGRpcmVjdG9yeSk6Ci0gICAgICAgIGZpbGVzID0gW10KKyAgICAgICAgYWxsX2ZpbGVzID0gW10KICAgICAgICAgZm9yIGNvbXBvbmVudCBpbiBvcy5saXN0ZGlyKGRpcmVjdG9yeSk6CiAgICAgICAgICAgICBpZiBjb21wb25lbnQgbm90IGluIGNvbXBvbmVudF9kaXJlY3RvcmllczoKICAgICAgICAgICAgICAgICBjb250aW51ZQotICAgICAgICAgICAgZGlyZWN0b3J5X3dpdGhfY29tcG9uZW50ID0gb3MucGF0aC5qb2luKGRpcmVjdG9yeSwgY29tcG9uZW50KQotICAgICAgICAgICAgZm9yIGZpbGVuYW1lIGluIG9zLmxpc3RkaXIoZGlyZWN0b3J5X3dpdGhfY29tcG9uZW50KToKLSAgICAgICAgICAgICAgICBmaWxlcy5hcHBlbmQob3MucGF0aC5qb2luKGRpcmVjdG9yeV93aXRoX2NvbXBvbmVudCwgZmlsZW5hbWUpKQotICAgICAgICByZXR1cm4gZmlsZXMKKyAgICAgICAgICAgIGZvciByb290LCBfLCBmaWxlcyBpbiBvcy53YWxrKG9zLnBhdGguam9pbihkaXJlY3RvcnksIGNvbXBvbmVudCkpOgorICAgICAgICAgICAgICAgIGFsbF9maWxlcy5leHRlbmQoW29zLnBhdGguam9pbihyb290LCBmaWxlKSBmb3IgZmlsZSBpbiBmaWxlc10pCisgICAgICAgIHJldHVybiBhbGxfZmlsZXMKIAogICAgIGRlZiBkaWZmKGZpbGVuYW1lMSwgZmlsZW5hbWUyKToKICAgICAgICAgIyBQeXRob24ncyBkaWZmbGliIG1vZHVsZSBpcyB0b28gc2xvdywgZXNwZWNpYWxseSBvbiBsb25nIG91dHB1dCwgc28KQEAgLTIxNCw4ICsyMTMsMTAgQEAKIAogICAgIGRlZiBkZWxldGVfY2FjaGVfZmlsZXMoKToKICAgICAgICAgIyBGSVhNRTogSW5zdGVhZCBvZiBkZWxldGluZyBjYWNoZSBmaWxlcywgZG9uJ3QgZ2VuZXJhdGUgdGhlbS4KLSAgICAgICAgY2FjaGVfZmlsZXMgPSBbcGF0aCBmb3IgcGF0aCBpbiBsaXN0X2ZpbGVzKG91dHB1dF9kaXJlY3RvcnkpCi0gICAgICAgICAgICAgICAgICAgICAgIGlmIGlzX2NhY2hlX2ZpbGUob3MucGF0aC5iYXNlbmFtZShwYXRoKSldCisgICAgICAgIGNhY2hlX2ZpbGVzID0gW10KKyAgICAgICAgZm9yIHJvb3QsIF8sIGZpbGVzIGluIG9zLndhbGsob3V0cHV0X2RpcmVjdG9yeSk6CisgICAgICAgICAgICBjYWNoZV9maWxlcy5leHRlbmQoW29zLnBhdGguam9pbihyb290LCBwYXRoKSBmb3IgcGF0aCBpbiBmaWxlcworICAgICAgICAgICAgICAgICAgICAgICBpZiBpc19jYWNoZV9maWxlKHBhdGgpXSkKICAgICAgICAgZm9yIGNhY2hlX2ZpbGUgaW4gY2FjaGVfZmlsZXM6CiAgICAgICAgICAgICBvcy5yZW1vdmUoY2FjaGVfZmlsZSkKIApAQCAtMzA0LDcgKzMwNSw4IEBACiAgICAgICAgICAgICBlbHNlOgogICAgICAgICAgICAgICAgIGlkbF9wYXJ0aWFsX2ludGVyZmFjZV9jb21waWxlciA9IE5vbmUKIAotICAgICAgICAgICAgZGljdGlvbmFyeV9pbXBsX2NvbXBpbGVyID0gSWRsQ29tcGlsZXJEaWN0aW9uYXJ5SW1wbCgKKyAgICAgICAgICAgIGRpY3Rpb25hcnlfaW1wbF9jb21waWxlciA9IGlkbF9jb21waWxlcl9jb25zdHJ1Y3RvcigKKyAgICAgICAgICAgICAgICBjb2RlX2dlbmVyYXRvcl9jb25zdHJ1Y3RvciwKICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyLCBpbnRlcmZhY2VzX2luZm89aW50ZXJmYWNlc19pbmZvLAogICAgICAgICAgICAgICAgIG9ubHlfaWZfY2hhbmdlZD1UcnVlLAogICAgICAgICAgICAgICAgIGV4dGVuZGVkX2F0dHJpYnV0ZXNfZmlsZXBhdGg9ZXh0ZW5kZWRfYXR0cmlidXRlc19wYXRoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2NudHh0LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9tb3pqcy00NS9qcy9zcmMvanNjbnR4dC5jcHAKaW5kZXggNmIxMTNkNS4uZDczNThjZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L21vempzLTQ1L2pzL3NyYy9qc2NudHh0LmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvbW96anMtNDUvanMvc3JjL2pzY250eHQuY3BwCkBAIC03ODAsMTEgKzc4MCwxMSBAQAogc3RhdGljIGJvb2wKIEV4cGFuZEVycm9yQXJndW1lbnRzKEV4Y2x1c2l2ZUNvbnRleHQqIGN4LCBKU0Vycm9yQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICB2b2lkKiB1c2VyUmVmLCBjb25zdCB1bnNpZ25lZCBlcnJvck51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIqKiBtZXNzYWdlcCwgSlNFcnJvclJlcG9ydCogcmVwb3J0cCwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yQXJndW1lbnRzVHlwZSBhcmd1bWVudHNUeXBlLCAuLi4pCisgICAgICAgICAgICAgICAgICAgICBjaGFyKiogbWVzc2FnZXAsIEVycm9yQXJndW1lbnRzVHlwZSBhcmd1bWVudHNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgSlNFcnJvclJlcG9ydCogcmVwb3J0cCwgLi4uKQogewogICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGFyZ3VtZW50c1R5cGUpOworICAgIHZhX3N0YXJ0KGFwLCByZXBvcnRwKTsKICAgICBib29sIGV4cGFuZGVkID0ganM6OkV4cGFuZEVycm9yQXJndW1lbnRzVkEoY3gsIGNhbGxiYWNrLCB1c2VyUmVmLCBlcnJvck51bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZXAsIHJlcG9ydHAsIGFyZ3VtZW50c1R5cGUsIGFwKTsKICAgICB2YV9lbmQoYXApOwpAQCAtODA4LDcgKzgwOCw3IEBACiAKICAgICBjaGFyKiBtZXNzYWdlOwogICAgIGlmICghRXhwYW5kRXJyb3JBcmd1bWVudHMoY3gsIGNhbGxiYWNrLCB1c2VyUmVmLCBlcnJvck51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtZXNzYWdlLCAmcmVwb3J0LCBBcmd1bWVudHNBcmVVbmljb2RlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsIEFyZ3VtZW50c0FyZVVuaWNvZGUsICZyZXBvcnQpKSB7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNjbnR4dC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvbW96anMvanMvc3JjL2pzY250eHQuY3BwCmluZGV4IGVjOTM0ZWMuLmE1Y2EwYjAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9tb3pqcy9qcy9zcmMvanNjbnR4dC5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L21vempzL2pzL3NyYy9qc2NudHh0LmNwcApAQCAtOTU1LDExICs5NTUsMTEgQEAKIHN0YXRpYyBib29sCiBqc19FeHBhbmRFcnJvckFyZ3VtZW50cyhKU0NvbnRleHQgKmN4LCBKU0Vycm9yQ2FsbGJhY2sgY2FsbGJhY2ssCiAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1c2VyUmVmLCBjb25zdCB1bnNpZ25lZCBlcnJvck51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiptZXNzYWdlcCwgSlNFcnJvclJlcG9ydCAqcmVwb3J0cCwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yQXJndW1lbnRzVHlwZSBhcmd1bWVudHNUeXBlLCAuLi4pCisgICAgICAgICAgICAgICAgICAgICBjaGFyICoqbWVzc2FnZXAsIEVycm9yQXJndW1lbnRzVHlwZSBhcmd1bWVudHNUeXBlLAorICAgICAgICAgICAgICAgICAgICAgSlNFcnJvclJlcG9ydCAqcmVwb3J0cCwgLi4uKQogewogICAgIHZhX2xpc3QgYXA7Ci0gICAgdmFfc3RhcnQoYXAsIGFyZ3VtZW50c1R5cGUpOworICAgIHZhX3N0YXJ0KGFwLCByZXBvcnRwKTsKICAgICBib29sIGV4cGFuZGVkID0ganNfRXhwYW5kRXJyb3JBcmd1bWVudHNWQShjeCwgY2FsbGJhY2ssIHVzZXJSZWYsIGVycm9yTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlcCwgcmVwb3J0cCwgYXJndW1lbnRzVHlwZSwgYXApOwogICAgIHZhX2VuZChhcCk7CkBAIC05ODUsNyArOTg1LDcgQEAKIAogICAgIGNoYXIgKm1lc3NhZ2U7CiAgICAgaWYgKCFqc19FeHBhbmRFcnJvckFyZ3VtZW50cyhjeCwgY2FsbGJhY2ssIHVzZXJSZWYsIGVycm9yTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1lc3NhZ2UsICZyZXBvcnQsIEFyZ3VtZW50c0FyZVVuaWNvZGUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWVzc2FnZSwgQXJndW1lbnRzQXJlVW5pY29kZSwgJnJlcG9ydCkpIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvQ0hBTkdFUy50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9DSEFOR0VTLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ1OWNjYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9DSEFOR0VTLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDExODIgKzAsMCBAQAotMjAxNi0wNS0xNiB2ZXJzaW9uIDMuMC4wLWJldGEtMyAoQysrL0phdmEvUHl0aG9uL1J1YnkvTmFuby9PYmplY3RpdmUtQy9DIy9KYXZhU2NyaXB0KQotICBHZW5lcmFsCi0gICogU3VwcG9ydGVkIFByb3RvMyBsaXRlLXJ1bnRpbWUgaW4gQysrL0phdmEgZm9yIG1vYmlsZSBwbGF0Zm9ybXMuCi0gICogQW55IHR5cGUgbm93IHN1cHBvcnRzIEFQSXMgdG8gc3BlY2lmeSBwcmVmaXhlcyBvdGhlciB0aGFuCi0gICAgdHlwZS5nb29nbGVhcGlzLmNvbQotICAqIFJlbW92ZWQgamF2YW5hbm9fdXNlX2RlcHJlY2F0ZWRfcGFja2FnZSBvcHRpb247IE5hbm8gd2lsbCBhbHdheXMgaGFzIGl0cyBvd24KLSAgICAiLm5hbm8iIHBhY2thZ2UuCi0KLSAgQysrIChCZXRhKQotICAqIEltcHJvdmVkIGhhc2ggbWFwcy4KLSAgICAgIC0gSW1wcm92ZWQgaGFzaCBtYXBzIGNvbW1lbnRzLiBJbiBwYXJ0aWN1bGFyLCBwbGVhc2Ugbm90ZSB0aGF0IGVxdWFsIGhhc2gKLSAgICAgICAgbWFwcyB3aWxsIG5vdCBuZWNlc3NhcmlseSBoYXZlIHRoZSBzYW1lIGl0ZXJhdGlvbiBvcmRlciBhbmQKLSAgICAgICAgc2VyaWFsaXphdGlvbi4KLSAgICAgIC0gQWRkZWQgYSBuZXcgaGFzaCBtYXBzIGltcGxlbWVudGF0aW9uIHRoYXQgd2lsbCBiZWNvbWUgdGhlIGRlZmF1bHQgaW4gYQotICAgICAgICBsYXRlciByZWxlYXNlLgotICAqIEFyZW5hcwotICAgICAgLSBTZXZlcmFsIGlubGluZWQgbWV0aG9kcyBpbiBBcmVuYSB3ZXJlIG1vdmVkIHRvIG91dC1vZi1saW5lIHRvIGltcHJvdmUKLSAgICAgICAgYnVpbGQgcGVyZm9ybWFuY2UgYW5kIGNvZGUgc2l6ZS4KLSAgICAgIC0gQWRkZWQgU3BhY2VBbGxvY2F0ZWRBbmRVc2VkKCkgdG8gcmVwb3J0IGJvdGggc3BhY2UgdXNlZCBhbmQgYWxsb2NhdGVkCi0gICAgICAtIEFkZGVkIGNvbnZlbmllbnQgY2xhc3MgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyCi0gICogQW55Ci0gICAgICAtIEFsbG93IGN1c3RvbSB0eXBlIFVSTCBwcmVmaXhlcyBpbiBBbnkgcGFja2luZy4KLSAgICAgIC0gVGV4dEZvcm1hdCBub3cgZXhwYW5kIHRoZSBBbnkgdHlwZSByYXRoZXIgdGhhbiBwcmludGluZyBieXRlcy4KLSAgKiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGFuZCB2YXJpb3VzIGJ1ZyBmaXhlcy4KLQotICBKYXZhIChCZXRhKQotICAqIEludHJvZHVjZWQgYW4gRXhwZXJpbWVudGFsQXBpIGFubm90YXRpb24uIEFubm90YXRlZCBBUElzIGFyZSBleHBlcmltZW50YWwKLSAgICBhbmQgYXJlIHN1YmplY3QgdG8gY2hhbmdlIGluIGEgYmFja3dhcmQgaW5jb21wYXRpYmxlIHdheSBpbiBmdXR1cmUgcmVsZWFzZXMuCi0gICogSW50cm9kdWNlZCB6ZXJvLWNvcHkgc2VyaWFsaXphdGlvbiBhcyBhbiBFeHBlcmltZW50YWxBcGkKLSAgICAgIC0gSW50cm9kdWN0aW9uIG9mIHRoZSBgQnl0ZU91dHB1dGAgaW50ZXJmYWNlLiBUaGlzIGlzIHNpbWlsYXIgdG8KLSAgICAgICAgYE91dHB1dFN0cmVhbWAgYnV0IHByb3ZpZGVzIHNlbWFudGljcyBmb3IgbGF6eSB3cml0aW5nIChpLmUuIG5vCi0gICAgICAgIGltbWVkaWF0ZSBjb3B5IHJlcXVpcmVkKSBvZiBmaWVsZHMgdGhhdCBhcmUgY29uc2lkZXJlZCB0byBiZSBpbW11dGFibGUuCi0gICAgICAtIGBCeXRlU3RyaW5nYCBub3cgc3VwcG9ydHMgd3JpdGluZyB0byBhIGBCeXRlT3V0cHV0YCwgd2hpY2ggd2lsbCBkaXJlY3RseQotICAgICAgICBleHBvc2UgdGhlIGludGVybmFscyBvZiB0aGUgYEJ5dGVTdHJpbmdgIChpLmUuIGBieXRlW11gIG9yIGBCeXRlQnVmZmVyYCkKLSAgICAgICAgdG8gdGhlIGBCeXRlT3V0cHV0YCB3aXRob3V0IGNvcHlpbmcuCi0gICAgICAtIGBDb2RlZE91dHB1dFN0cmVhbWAgbm93IHN1cHBvcnRzIHdyaXRpbmcgdG8gYSBgQnl0ZU91dHB1dGAuIGBCeXRlU3RyaW5nYAotICAgICAgICBpbnN0YW5jZXMgdGhhdCBhcmUgdG9vIGxhcmdlIHRvIGZpdCBpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHdpbGwgYmUKLSAgICAgICAgKGxhemlseSkgd3JpdHRlbiB0byB0aGUgYEJ5dGVPdXRwdXRgIGRpcmVjdGx5LgotICAgICAgLSBUaGlzIGFsbG93cyBhcHBsaWNhdGlvbnMgdXNpbmcgbGFyZ2UgYEJ5dGVTdHJpbmdgIGZpZWxkcyB0byBhdm9pZAotICAgICAgICBkdXBsaWNhdGlvbiBvZiB0aGVzZSBmaWVsZHMgZW50aXJlbHkuIFN1Y2ggYW4gYXBwbGljYXRpb24gY2FuIHN1cHBseSBhCi0gICAgICAgIGBCeXRlT3V0cHV0YCB0aGF0IGNoYWlucyB0b2dldGhlciB0aGUgY2h1bmtzIHJlY2VpdmVkIGZyb20KLSAgICAgICAgYENvZGVkT3V0cHV0U3RyZWFtYCBiZWZvcmUgZm9yd2FyZGluZyB0aGVtIG9udG8gdGhlIElPIHN5c3RlbS4KLSAgKiBPdGhlciByZWxhdGVkIGNoYW5nZXMgdG8gYENvZGVkT3V0cHV0U3RyZWFtYAotICAgICAgLSBBZGRpdGlvbmFsIHVzZSBvZiBgc3VuLm1pc2MuVW5zYWZlYCB3aGVyZSBwb3NzaWJsZSB0byBwZXJmb3JtIGZhc3QKLSAgICAgICAgYWNjZXNzIHRvIGBieXRlW11gIGFuZCBgQnl0ZUJ1ZmZlcmAgdmFsdWVzIGFuZCBhdm9pZGluZyB1bm5lY2Vzc2FyeQotICAgICAgICByYW5nZSBjaGVja2luZy4KLSAgICAgIC0gYEJ5dGVCdWZmZXJgLWJhY2tlZCBgQ29kZWRPdXRwdXRTdHJlYW1gIG5vdyB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlCi0gICAgICAgIGBCeXRlQnVmZmVyYCByYXRoZXIgdGhhbiB0byBhbiBpbnRlcm1lZGlhdGUgYXJyYXkuCi0gICogSW1wcm92ZWQgbGl0ZS1ydW50aW1lLgotICAgICAgLSBMaXRlIHByb3RvcyBub3cgaW1wbGVtZW50IGRlZXAgZXF1YWxzL2hhc2hDb2RlL3RvU3RyaW5nCi0gICAgICAtIFNpZ25pZmljYW50bHkgaW1wcm92ZWQgdGhlIHBlcmZvcm1hbmNlIG9mIEJ1aWxkZXIjbWVyZ2VGcm9tKCkgYW5kCi0gICAgICAgIEJ1aWxkZXIjbWVyZ2VEZWxpbWl0ZWRGcm9tKCkKLSAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBhbmQgc21hbGwgZmVhdHVyZSBlbmhhbmNlbWVudC4KLSAgICAgIC0gRml4ZWQgc3RhY2sgb3ZlcmZsb3cgd2hlbiBpbiBoYXNoQ29kZSgpIGZvciBpbmZpbml0ZSByZWN1cnNpdmUgb25lb2ZzLgotICAgICAgLSBGaXhlZCB0aGUgbGF6eSBmaWVsZCBwYXJzaW5nIGluIGxpdGUgdG8gbWVyZ2UgcmF0aGVyIHRoYW4gb3ZlcndyaXRlLgotICAgICAgLSBUZXh0Rm9ybWF0IG5vdyBzdXBwb3J0cyByZXBvcnRpbmcgbGluZS9jb2x1bW4gbnVtYmVycyBvbiBlcnJvcnMuCi0gICAgICAtIFVwZGF0ZWQgdG8gYWRkIGFwcHJvcHJpYXRlIEBPdmVycmlkZSBmb3IgYmV0dGVyIGNvbXBpbGVyIGVycm9ycy4KLQotICBQeXRob24gKEJldGEpCi0gICogQWRkZWQgSlNPTiBmb3JtYXQgZm9yIEFueSwgU3RydWN0LCBWYWx1ZSBhbmQgTGlzdFZhbHVlCi0gICogWyBdIGlzIG5vdyBhY2NlcHRlZCBmb3IgYm90aCByZXBlYXRlZCBzY2FsYXIgZmllbGRzIGFuZCByZXBlYXRlZCBtZXNzYWdlCi0gICAgZmllbGRzIGluIHRleHQgZm9ybWF0IHBhcnNlci4KLSAgKiBOdW1lcmljYWwgZmllbGQgbmFtZSBpcyBub3cgc3VwcG9ydGVkIGluIHRleHQgZm9ybWF0LgotICAqIEFkZGVkIERpc2NhcmRVbmtub3duRmllbGRzIEFQSSBmb3IgcHl0aG9uIHByb3RvYnVmIG1lc3NhZ2UuCi0KLSAgT2JqZWN0aXZlLUMgKEJldGEpCi0gICogUHJvdG8gY29tbWVudHMgbm93IGNvbWUgb3ZlciBhcyBIZWFkZXJEb2MgY29tbWVudHMgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2VzCi0gICAgc28gWGNvZGUgY2FuIHBpY2sgdGhlbSB1cCBhbmQgZGlzcGxheSB0aGVtLgotICAqIFRoZSBsaWJyYXJ5IGhlYWRlcnMgaGF2ZSBiZWVuIHVwZGF0ZWQgdG8gdXNlIEhlYWRlckRvYyBjb21tZW50cyBzbyBYY29kZSBjYW4KLSAgICBwaWNrIHRoZW0gdXAgYW5kIGRpc3BsYXkgdGhlbS4KLSAgKiBUaGUgcGVyIG1lc3NhZ2UgYW5kIHBlciBmaWVsZCBvdmVyaGVhZCBpbiBib3RoIGdlbmVyYXRlZCBjb2RlIGFuZCBydW50aW1lCi0gICAgb2JqZWN0IHNpemVzIHdhcyByZWR1Y2VkLgotICAqIEdlbmVyYXRlZCBjb2RlIG5vdyBpbmNsdWRlIGRlcHJlY2F0ZWQgYW5ub3RhdGlvbnMgd2hlbiB0aGUgcHJvdG8gZmlsZQotICAgIGluY2x1ZGVkIHRoZW0uCi0KLSAgQyMgKEJldGEpCi0gIEluIGdlbmVyYWw6IHNvbWUgY2hhbmdlcyBhcmUgYnJlYWtpbmcsIHdoaWNoIHJlcXVpcmUgcmVnZW5lcmF0aW5nIG1lc3NhZ2VzLgotICBNb3N0IHVzZXItd3JpdHRlbiBjb2RlIHdpbGwgbm90IGJlIGltcGFjdGVkICpleGNlcHQqIGZvciB0aGUgcmVuYW1pbmcgb2YgZW51bQotICB2YWx1ZXMuCi0KLSAgKiBBbGxvdyBjdXN0b20gdHlwZSBVUkwgcHJlZml4ZXMgaW4gYEFueWAgcGFja2luZywgYW5kIGlnbm9yZSB0aGVtIHdoZW4KLSAgICB1bnBhY2tpbmcKLSAgKiBgcHJvdG9jYCBpcyBub3cgaW4gYSBzZXBhcmF0ZSBOdUdldCBwYWNrYWdlIChHb29nbGUuUHJvdG9idWYuVG9vbHMpCi0gICogTmV3IG9wdGlvbjogYGludGVybmFsX2FjY2Vzc2AgdG8gZ2VuZXJhdGUgaW50ZXJuYWwgY2xhc3NlcwotICAqIEVudW0gdmFsdWVzIGFyZSBub3cgUGFzY2FsQ2FzZWQsIGFuZCBpZiB0aGVyZSdzIGEgcHJlZml4IHdoaWNoIG1hdGNoZXMgdGhlCi0gICAgbmFtZSBvZiB0aGUgZW51bSwgdGhhdCBpcyByZW1vdmVkIChzbyBhbiBlbnVtIGBDT0xPUmAgd2l0aCBhIHZhbHVlCi0gICAgYENPTE9SX0JMVUVgIHdvdWxkIGdlbmVyYXRlIGEgdmFsdWUgb2YganVzdCBgQmx1ZWApLiBBbiBvcHRpb24KLSAgICAoYGxlZ2FjeV9lbnVtX3ZhbHVlc2ApIGlzIHRlbXBvcmFyaWx5IGF2YWlsYWJsZSB0byBkaXNhYmxlIHRoaXMsIGJ1dCB0aGUKLSAgICBvcHRpb24gd2lsbCBiZSByZW1vdmVkIGZvciBHQS4KLSAgKiBganNvbl9uYW1lYCBvcHRpb24gaXMgbm93IGhvbm9yZWQKLSAgKiBJZiBncm91cCB0YWdzIGFyZSBlbmNvdW50ZXJlZCB3aGVuIHBhcnNpbmcsIHRoZXkgYXJlIHZhbGlkYXRlZCBtb3JlCi0gICAgdGhvcm91Z2hseSAoYWx0aG91Z2ggd2UgZG9uJ3Qgc3VwcG9ydCBhY3R1YWwgZ3JvdXBzKQotICAqIE51R2V0IGRlcGVuZGVuY2llcyBhcmUgYmV0dGVyIHNwZWNpZmllZAotICAqIEJyZWFraW5nOiBgUHJlY29uZGl0aW9uc2AgaXMgcmVuYW1lZCB0byBgUHJvdG9QcmVjb25kaXRpb25zYAotICAqIEJyZWFraW5nOiBgR2VuZXJhdGVkQ29kZUluZm9gIGlzIHJlbmFtZWQgdG8gYEdlbmVyYXRlZENsclR5cGVJbmZvYAotICAqIGBKc29uRm9ybWF0dGVyYCBub3cgYWxsb3dzIHdyaXRpbmcgdG8gYSBgVGV4dFdyaXRlcmAKLSAgKiBOZXcgaW50ZXJmYWNlLCBgSUN1c3RvbURpYWdub3N0aWNNZXNzYWdlYCB0byBhbGxvdyBtb3JlIGNvbXBhY3QKLSAgICByZXByZXNlbnRhdGlvbnMgZnJvbSBgVG9TdHJpbmdgCi0gICogYENvZGVkSW5wdXRTdHJlYW1gIGFuZCBgQ29kZWRPdXRwdXRTdHJlYW1gIG5vdyBpbXBsZW1lbnQgYElEaXNwb3NhYmxlYCwKLSAgICB3aGljaCBzaW1wbHkgZGlzcG9zZXMgb2YgdGhlIHN0cmVhbXMgdGhleSB3ZXJlIGNvbnN0cnVjdGVkIHdpdGgKLSAgKiBNYXAgZmllbGRzIG5vIGxvbmdlciBzdXBwb3J0IG51bGwgdmFsdWVzIChpbiBsaW5lIHdpdGggb3RoZXIgbGFuZ3VhZ2VzKQotICAqIEltcHJvdmVtZW50cyBpbiBKU09OIGZvcm1hdHRpbmcgYW5kIHBhcnNpbmcKLQotICBKYXZhc2NyaXB0IChBbHBoYSkKLSAgKiBCZXR0ZXIgc3VwcG9ydCBmb3IgImJ5dGVzIiBmaWVsZHM6IGJ5dGVzIGZpZWxkcyBjYW4gYmUgcmVhZCBhcyBlaXRoZXIgYQotICAgIGJhc2U2NCBzdHJpbmcgb3IgVUludDhBcnJheSAoaW4gZW52aXJvbm1lbnRzIHdoZXJlIFR5cGVkQXJyYXkgaXMgc3VwcG9ydGVkKS4KLSAgKiBOZXcgc3VwcG9ydCBmb3IgQ29tbW9uSlMgaW1wb3J0cy4gIFRoaXMgc2hvdWxkIG1ha2UgaXQgZWFzaWVyIHRvIHVzZSB0aGUKLSAgICBKYXZhU2NyaXB0IHN1cHBvcnQgaW4gTm9kZS5qcyBhbmQgdG9vbHMgbGlrZSBXZWJQYWNrLiAgU2VlIGpzL1JFQURNRS5tZCBmb3IKLSAgICBtb3JlIGluZm9ybWF0aW9uLgotICAqIFNvbWUgc2lnbmlmaWNhbnQgaW50ZXJuYWwgcmVmYWN0b3JpbmcgdG8gc2ltcGxpZnkgYW5kIG1vZHVsYXJpemUgdGhlIGNvZGUuCi0KLSAgUnVieSAoQWxwaGEpCi0gICogSlNPTiBzZXJpYWxpemF0aW9uIG5vdyBwcm9wZXJseSB1c2VzIGNhbWVsQ2FzZWQgbmFtZXMsIHdpdGggYSBydW50aW1lIG9wdGlvbgotICAgIHRoYXQgd2lsbCBwcmVzZXJ2ZSBvcmlnaW5hbCBuYW1lcyBmcm9tIC5wcm90byBmaWxlcyBpbnN0ZWFkLgotICAqIFdlbGwta25vd24gdHlwZXMgYXJlIG5vdyBpbmNsdWRlZCBpbiB0aGUgZGlzdHJpYnV0aW9uLgotICAqIFJlbGVhc2Ugbm93IGluY2x1ZGVzIGJpbmFyeSBnZW1zIGZvciBXaW5kb3dzLCBNYWMsIGFuZCBMaW51eCBpbnN0ZWFkIG9mIGp1c3QKLSAgICBzb3VyY2UgZ2Vtcy4KLSAgKiBCdWdmaXggZm9yIHNlcmlhbGl6aW5nIG9uZW9mcy4KLQotICBDKysvSmF2YSBMaXRlIChBbHBoYSkKLSAgICBBIG5ldyAibGl0ZSIgZ2VuZXJhdG9yIHBhcmFtZXRlciB3YXMgaW50cm9kdWNlZCBpbiB0aGUgcHJvdG9jIGZvciBDKysgYW5kCi0gICAgSmF2YSBmb3IgUHJvdG8zIHN5bnRheCBtZXNzYWdlcy4gRXhhbXBsZSB1c2FnZToKLQotICAgICAuL3Byb3RvYyAtLWNwcF9vdXQ9bGl0ZTokT1VUUFVUX1BBVEggZm9vLnByb3RvCi0KLSAgICBUaGUgcHJvdG9jIHdpbGwgdHJlYXQgdGhlIGN1cnJlbnQgaW5wdXQgYW5kIGFsbCB0aGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMKLSAgICBhcyBMSVRFLiBUaGUgc2FtZSBnZW5lcmF0b3IgcGFyYW1ldGVyIG11c3QgYmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUKLSAgICBkZXBlbmRlbmNpZXMuCi0KLSAgICBJbiBQcm90bzMgc3ludGF4IGZpbGVzLCAib3B0aW1pemVkX2Zvcj1MSVRFX1JVTlRJTUUiIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuCi0KLQotMjAxNS0xMi0zMCB2ZXJzaW9uIDMuMC4wLWJldGEtMiAoQysrL0phdmEvUHl0aG9uL1J1YnkvTmFuby9PYmplY3RpdmUtQy9DIy9KYXZhU2NyaXB0KQotICBHZW5lcmFsCi0gICogSW50cm9kdWNlZCBhIG5ldyBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbjogSmF2YVNjcmlwdC4KLSAgKiBBZGRlZCBhIG5ldyBmaWVsZCBvcHRpb24gImpzb25fbmFtZSIuIEJ5IGRlZmF1bHQgcHJvdG8gZmllbGQgbmFtZXMgYXJlCi0gICAgY29udmVydGVkIHRvICJsb3dlckNhbWVsQ2FzZSIgaW4gcHJvdG8zIEpTT04gZm9ybWF0LiBUaGlzIG9wdGlvbiBjYW4gYmUKLSAgICB1c2VkIHRvIG92ZXJyaWRlIHRoaXMgYmVoYXZpb3IgYW5kIHNwZWNpZnkgYSBkaWZmZXJlbnQgSlNPTiBuYW1lIGZvciB0aGUKLSAgICBmaWVsZC4KLSAgKiBBZGRlZCBjb25mb3JtYW5jZSB0ZXN0cyB0byBlbnN1cmUgaW1wbGVtZW50YXRpb25zIGFyZSBmb2xsb3dpbmcgcHJvdG8zIEpTT04KLSAgICBzcGVjaWZpY2F0aW9uLgotCi0gIEMrKyAoQmV0YSkKLSAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIHRoZSBKU09OIHN1cHBvcnQgdXRpbGl0eToKLSAgICAgIC0gRHVwbGljYXRlIG1hcCBrZXlzIGluIEpTT04gYXJlIG5vdyByZWplY3RlZCAoaS5lLiwgdHJhbnNsYXRpb24gd2lsbAotICAgICAgICBmYWlsKS4KLSAgICAgIC0gRml4ZWQgd2lyZS1mb3JtYXQgZm9yIGdvb2dsZS5wcm90b2J1Zi5WYWx1ZS9MaXN0VmFsdWUuCi0gICAgICAtIEZpeGVkIHByZWNpc2lvbiBsb3NzIHdoZW4gY29udmVydGluZyBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wLgotICAgICAgLSBGaXhlZCBhIGJ1ZyB3aGVuIHBhcnNpbmcgaW52YWxpZCBVVEYtOCBjb2RlIHBvaW50cy4KLSAgICAgIC0gRml4ZWQgYSBtZW1vcnkgbGVhay4KLSAgICAgIC0gUmVkdWNlZCBjYWxsIHN0YWNrIHVzYWdlLgotCi0gIEphdmEgKEJldGEpCi0gICogQ2xlYW5lZCB1cCBzb21lIHVudXNlZCBtZXRob2RzIG9uIENvZGVkT3V0cHV0U3RyZWFtLgotICAqIFByZXNpemVkIGxpc3RzIGZvciBwYWNrZWQgZmllbGRzIGR1cmluZyBwYXJzaW5nIGluIHRoZSBsaXRlIHJ1bnRpbWUgdG8KLSAgICByZWR1Y2UgYWxsb2NhdGlvbnMgYW5kIGltcHJvdmUgcGVyZm9ybWFuY2UuCi0gICogSW1wcm92ZWQgdGhlIHBlcmZvcm1hbmNlIG9mIHVua25vd24gZmllbGRzIGluIHRoZSBsaXRlIHJ1bnRpbWUuCi0gICogSW50cm9kdWNlZCBVbnNhZmVCeXRlU3RyaW5ncyB0byBzdXBwb3J0IHplcm8tY29weSBCeXRlU3RyaW5nIGNyZWF0aW9uLgotICAqIFZhcmlvdXMgYnVnIGZpeGVzIGFuZCBpbXByb3ZlbWVudHMgdG8gdGhlIEpTT04gc3VwcG9ydCB1dGlsaXR5OgotICAgICAgLSBGaXhlZCBhIHRocmVhZC1zYWZldHkgYnVnLgotICAgICAgLSBBZGRlZCBhIG5ldyBvcHRpb24g4oCccHJlc2VydmluZ1Byb3RvRmllbGROYW1lc+KAnSB0byBKc29uRm9ybWF0LgotICAgICAgLSBBZGRlZCBhIG5ldyBvcHRpb24g4oCcaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRz4oCdIHRvIEpzb25Gb3JtYXQuCi0gICAgICAtIFVwZGF0ZWQgdGhlIEpTT04gdXRpbGl0eSB0byBjb21wbHkgd2l0aCBwcm90bzMgSlNPTiBzcGVjaWZpY2F0aW9uLgotCi0gIFB5dGhvbiAoQmV0YSkKLSAgKiBBZGRlZCBwcm90bzMgSlNPTiBmb3JtYXQgdXRpbGl0eS4gSXQgaW5jbHVkZXMgc3VwcG9ydCBmb3IgYWxsIGZpZWxkIHR5cGVzCi0gICAgYW5kIGEgZmV3IHdlbGwta25vd24gdHlwZXMgZXhjZXB0IGZvciBBbnkgYW5kIFN0cnVjdC4KLSAgKiBBZGRlZCBydW50aW1lIHN1cHBvcnQgZm9yIEFueSwgVGltZXN0YW1wLCBEdXJhdGlvbiBhbmQgRmllbGRNYXNrLgotICAqIFsgXSBpcyBub3cgYWNjZXB0ZWQgZm9yIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMgaW4gdGV4dCBmb3JtYXQgcGFyc2VyLgotICAqIE1hcCBmaWVsZHMgbm93IGhhdmUgcHJvcGVyIE8oMSkgcGVyZm9ybWFuY2UgZm9yIGxvb2t1cC9pbnNlcnQvZGVsZXRlCi0gICAgd2hlbiB1c2luZyB0aGUgUHl0aG9uL0MrKyBpbXBsZW1lbnRhdGlvbi4gVGhleSB3ZXJlIHByZXZpb3VzbHkgdXNpbmcgTyhuKQotICAgIHNlYXJjaC1iYXNlZCBhbGdvcml0aG1zIGJlY2F1c2UgdGhlIEMrKyByZWZsZWN0aW9uIGludGVyZmFjZSBkaWRuJ3QKLSAgICBzdXBwb3J0IHRydWUgbWFwIG9wZXJhdGlvbnMuCi0KLSAgT2JqZWN0aXZlLUMgKEJldGEpCi0gICogVmFyaW91cyBidWctZml4ZXMgYW5kIGNvZGUgdHdlYWtzIHRvIHBhc3MgbW9yZSBzdHJpY3QgY29tcGlsZXIgd2FybmluZ3MuCi0gICogTm93IGhhcyBjb25mb3JtYW5jZSB0ZXN0IGNvdmVyYWdlIGFuZCBpcyBwYXNzaW5nIGFsbCB0ZXN0cy4KLQotICBDIyAoQmV0YSkKLSAgKiBWYXJpb3VzIGJ1Zy1maXhlcy4KLSAgKiBDb2RlIGdlbmVyYXRpb246IEZpbGVzIGdlbmVyYXRlZCBpbiBkaXJlY3RvcmllcyBiYXNlZCBvbiBuYW1lc3BhY2UuCi0gICogQ29kZSBnZW5lcmF0aW9uOiBJbmNsdWRlIGNvbW1lbnRzIGZyb20gLnByb3RvIGZpbGVzIGluIFhNTCBkb2MKLSAgICBjb21tZW50cyAobmFpdmVseSkKLSAgKiBDb2RlIGdlbmVyYXRpb246IENoYW5nZSBvcmdhbml6YXRpb24vbmFtaW5nIG9mICJyZWZsZWN0aW9uIGNsYXNzIiAoYWNjZXNzCi0gICAgdG8gZmlsZSBkZXNjcmlwdG9yKQotICAqIENvZGUgZ2VuZXJhdGlvbiBhbmQgbGlicmFyeTogQWRkIFBhcnNlciBwcm9wZXJ0eSB0byBNZXNzYWdlRGVzY3JpcHRvciwKLSAgICBhbmQgaW50cm9kdWNlIGEgbm9uLWdlbmVyaWMgcGFyc2VyIHR5cGUuCi0gICogTGlicmFyeTogQWRkZWQgVHlwZVJlZ2lzdHJ5IHRvIHN1cHBvcnQgSlNPTiBwYXJzaW5nL2Zvcm1hdHRpbmcgb2YgQW55LgotICAqIExpYnJhcnk6IEFkZGVkIEFueS5QYWNrL1VucGFjayBzdXBwb3J0LgotICAqIExpYnJhcnk6IEltcGxlbWVudGVkIEpTT04gcGFyc2luZy4KLQotICBKYXZhc2NyaXB0IChBbHBoYSkKLSAgKiBBZGRlZCBwcm90bzMgc3VwcG9ydCBmb3IgSmF2YVNjcmlwdC4gVGhlIHJ1bnRpbWUgaXMgd3JpdHRlbiBpbiBwdXJlCi0gICAgSmF2YVNjcmlwdCBhbmQgd29ya3MgaW4gYnJvd3NlcnMgYW5kIGluIE5vZGUuanMuIFRvIGdlbmVyYXRlIEphdmFTY3JpcHQKLSAgICBjb2RlIGZvciB5b3VyIHByb3RvLCBpbnZva2UgcHJvdG9jIHdpdGggIi0tanNfb3V0Ii4gU2VlIGpzL1JFQURNRS5tZAotICAgIGZvciBtb3JlIGJ1aWxkIGluc3RydWN0aW9ucy4KLQotMjAxNS0wOC0yNiB2ZXJzaW9uIDMuMC4wLWJldGEtMSAoQysrL0phdmEvUHl0aG9uL1J1YnkvTmFuby9PYmplY3RpdmUtQy9DIykKLSAgQWJvdXQgQmV0YQotICAqIFRoaXMgaXMgdGhlIGZpcnN0IGJldGEgcmVsZWFzZSBvZiBwcm90b2J1ZiB2My4wLjAuIE5vdCBhbGwgbGFuZ3VhZ2VzCi0gICAgaGF2ZSByZWFjaGVkIGJldGEgc3RhZ2UuIExhbmd1YWdlcyBub3QgbWFya2VkIGFzIGJldGEgYXJlIHN0aWxsIGluCi0gICAgYWxwaGEgKGkuZS4sIGJlIHByZXBhcmVkIGZvciBBUEkgYnJlYWtpbmcgY2hhbmdlcykuCi0KLSAgR2VuZXJhbAotICAqIFByb3RvMyBKU09OIGlzIHN1cHBvcnRlZCBpbiBzZXZlcmFsIGxhbmd1YWdlcyAoZnVsbHkgc3VwcG9ydGVkIGluIEMrKwotICAgIGFuZCBKYXZhLCBwYXJ0aWFsbHkgc3VwcG9ydGVkIGluIFJ1YnkvQyMpLiBUaGUgSlNPTiBzcGVjIGlzIGRlZmluZWQgaW4KLSAgICB0aGUgcHJvdG8zIGxhbmd1YWdlIGd1aWRlOgotCi0gICAgICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8zI2pzb24KLQotICAgIFdlIHdpbGwgcHVibGlzaCBhIG1vcmUgZGV0YWlsZWQgc3BlYyB0byBkZWZpbmUgdGhlIGV4YWN0IGJlaGF2aW9yIG9mCi0gICAgcHJvdG8zLWNvbmZvcm1hbnQgSlNPTiBzZXJpYWxpemVycyBhbmQgcGFyc2Vycy4gVW50aWwgdGhlbiwgZG8gbm90IHJlbHkKLSAgICBvbiBzcGVjaWZpYyBiZWhhdmlvcnMgb2YgdGhlIGltcGxlbWVudGF0aW9uIGlmIGl04oCZcyBub3QgZG9jdW1lbnRlZCBpbgotICAgIHRoZSBhYm92ZSBzcGVjLiBNb3JlIHNwZWNpZmljYWxseSwgdGhlIGJlaGF2aW9yIGlzIG5vdCB5ZXQgZmluYWxpemVkIGZvcgotICAgIHRoZSBmb2xsb3dpbmc6Ci0gICAgICAtIFBhcnNpbmcgaW52YWxpZCBKU09OIGlucHV0IChlLmcuLCBpbnB1dCB3aXRoIHRyYWlsaW5nIGNvbW1hcykuCi0gICAgICAtIE5vbi1jYW1lbENhc2UgbmFtZXMgaW4gSlNPTiBpbnB1dC4KLSAgICAgIC0gVGhlIHNhbWUgZmllbGQgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiBKU09OIGlucHV0LgotICAgICAgLSBKU09OIGFycmF5cyBjb250YWluIOKAnG51bGzigJ0gdmFsdWVzLgotICAgICAgLSBUaGUgbWVzc2FnZSBoYXMgdW5rbm93biBmaWVsZHMuCi0KLSAgKiBQcm90bzMgbm93IGVuZm9yY2VzIHN0cmljdCBVVEYtOCBjaGVja2luZy4gUGFyc2luZyB3aWxsIGZhaWwgaWYgYSBzdHJpbmcKLSAgICBmaWVsZCBjb250YWlucyBub24gVVRGLTggZGF0YS4KLQotICBDKysgKEJldGEpCi0gICogSW50cm9kdWNlZCBuZXcgdXRpbGl0eSBmdW5jdGlvbnMvY2xhc3NlcyBpbiB0aGUgZ29vZ2xlL3Byb3RvYnVmL3V0aWwKLSAgICBkaXJlY3Rvcnk6Ci0gICAgICAtIE1lc3NhZ2VEaWZmZXJlbmNlcjogY29tcGFyZSB0d28gcHJvdG8gbWVzc2FnZXMgYW5kIHJlcG9ydCB0aGVpcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRpZmZlcmVuY2VzLgotICAgICAgLSBKc29uVXRpbDogc3VwcG9ydCBjb252ZXJ0aW5nIHByb3RvYnVmIGJpbmFyeSBmb3JtYXQgdG8vZnJvbSBKU09OLgotICAgICAgLSBUaW1lVXRpbDogdXRpbGl0eSBmdW5jdGlvbnMgdG8gd29yayB3aXRoIHdlbGwta25vd24gdHlwZXMgVGltZXN0YW1wCi0gICAgICAgICAgICAgICAgICBhbmQgRHVyYXRpb24uCi0gICAgICAtIEZpZWxkTWFza1V0aWw6IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBGaWVsZE1hc2suCi0KLSAgKiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb24gb2YgYXJlbmEgY29uc3RydWN0aW9uIGFuZCBkZXN0cnVjdGlvbi4KLSAgKiBCdWcgZml4ZXMgZm9yIGFyZW5hIGFuZCBtYXBzIHN1cHBvcnQuCi0gICogQ2hhbmdlZCB0byB1c2UgY21ha2UgZm9yIFdpbmRvd3MgVmlzdWFsIFN0dWRpbyBidWlsZHMuCi0gICogQWRkZWQgQmF6ZWwgc3VwcG9ydC4KLQotICBKYXZhIChCZXRhKQotICAqIEludHJvZHVjZWQgYSBuZXcgdXRpbCBwYWNrYWdlIHRoYXQgd2lsbCBiZSBkaXN0cmlidXRlZCBhcyBhIHNlcGFyYXRlCi0gICAgYXJ0aWZhY3QgaW4gbWF2ZW4uIEl0IGNvbnRhaW5zOgotICAgICAgLSBKc29uRm9ybWF0OiBjb252ZXJ0IHByb3RvIG1lc3NhZ2VzIHRvL2Zyb20gSlNPTi4KLSAgICAgIC0gVGltZVV0aWw6IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCBUaW1lc3RhbXAgYW5kIER1cmF0aW9uLgotICAgICAgLSBGaWVsZE1hc2tVdGlsOiB1dGlsaXR5IGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggRmllbGRNYXNrLgotCi0gICogVGhlIHN0YXRpYyBQQVJTRVIgaW4gZWFjaCBnZW5lcmF0ZWQgbWVzc2FnZSBpcyBkZXByZWNhdGVkLCBhbmQgaXQgd2lsbAotICAgIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4gQSBzdGF0aWMgcGFyc2VyKCkgZ2V0dGVyIGlzIGdlbmVyYXRlZAotICAgIGZvciBlYWNoIG1lc3NhZ2UgdHlwZSBpbnN0ZWFkLgotICAqIFBlcmZvcm1hbmNlIG9wdGltaXphdGlvbnMgZm9yIFN0cmluZyBmaWVsZHMgc2VyaWFsaXphdGlvbi4KLSAgKiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGZvciBMaXRlIHJ1bnRpbWUgb24gQW5kcm9pZDoKLSAgICAgIC0gUmVkdWNlZCBhbGxvY2F0aW9ucwotICAgICAgLSBSZWR1Y2VkIG1ldGhvZCBvdmVyaGVhZCBhZnRlciBQcm9HdWFyZGluZwotICAgICAgLSBSZWR1Y2VkIGNvZGUgc2l6ZSBhZnRlciBQcm9HdWFyZGluZwotCi0gIFB5dGhvbiAoQWxwaGEpCi0gICogUmVtb3ZlZCBsZWdhY3kgUHl0aG9uIDIuNSBzdXBwb3J0LgotICAqIE1vdmVkIHRvIGEgc2luZ2xlIFB5dGhvbiAyLngvMy54LWNvbXBhdGlibGUgY29kZWJhc2UsIGluc3RlYWQgb2YgdXNpbmcgMnRvMy4KLSAgKiBGaXhlZCBidWlsZC90ZXN0cyBvbiBQeXRob24gMi42LCAyLjcsIDMuMywgYW5kIDMuNC4KLSAgICAgIC0gUHVyZS1QeXRob24gd29ya3Mgb24gYWxsIGZvdXIuCi0gICAgICAtIFB5dGhvbi9DKysgaW1wbGVtZW50YXRpb24gd29ya3Mgb24gYWxsIGJ1dCAzLjQsIGR1ZSB0byBjaGFuZ2VzIGluIHRoZQotICAgICAgICBQeXRob24vQysrIEFQSSBpbiAzLjQuCi0gICogU29tZSBwcmVsaW1pbmFyeSB3b3JrIGhhcyBiZWVuIGRvbmUgdG8gYWxsb3cgZm9yIG11bHRpcGxlIERlc2NyaXB0b3JQb29scwotICAgIHdpdGggUHl0aG9uL0MrKy4KLQotICBSdWJ5IChBbHBoYSkKLSAgKiBNYW55IGJ1Z2ZpeGVzOgotICAgICAgLSBmaXhlZCBwYXJzaW5nL3NlcmlhbGl6YXRpb24gb2YgYnl0ZXMsIHNpbnQsIHNmaXhlZCB0eXBlcwotICAgICAgLSBvdGhlciBwYXJzZXIgYnVnZml4ZXMKLSAgICAgIC0gZml4ZWQgbWVtb3J5IGxlYWsgYWZmZWN0aW5nIFJ1YnkgMi4yCi0KLSAgSmF2YU5hbm8gKEFscGhhKQotICAqIEphdmFOYW5vIGdlbmVyYXRlZCBjb2RlIG5vdyB3aWxsIGJlIHB1dCBpbiBhIG5hbm8gcGFja2FnZSBieSBkZWZhdWx0IHRvCi0gICAgYXZvaWQgY29uZmxpY3RzIHdpdGggSmF2YSBnZW5lcmF0ZWQgY29kZS4KLQotICBPYmplY3RpdmUtQyAoQWxwaGEpCi0gICogQWRkZWQgbm9uLW51bGwgbWFya3VwIHRvIE9iakMgbGlicmFyeS4gUmVxdWlyZXMgU0RLIDguNCsgdG8gYnVpbGQuCi0gICogTWFueSBidWdmaXhlczoKLSAgICAgIC0gUmVtb3ZlZCB0aGUgY2xhc3MvZW51bSBmaWx0ZXIuCi0gICAgICAtIFJlbmFtZWQgc29tZSBpbnRlcm5hbCB0eXBlcyB0byBhdm9pZCBjb25mbGljdHMgd2l0aCB0aGUgd2VsbC1rbm93biB0eXBlcwotICAgICAgICBwcm90b3MuCi0gICAgICAtIEFkZGVkIG1pc3Npbmcgc3VwcG9ydCBmb3IgcGFyc2luZyByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIGluIHBhY2tlZCBvcgotICAgICAgICB1bnBhY2tlZCBmb3Jtcy4KLSAgICAgIC0gQWRkZWQgKkNvdW50IGZvciByZXBlYXRlZCBhbmQgbWFwPD4gZmllbGRzIHRvIGF2b2lkIGF1dG8tY3JlYXRlIHdoZW4KLSAgICAgICAgY2hlY2tpbmcgZm9yIHRoZW0gYmVpbmcgc2V0LgotCi0gIEMjIChBbHBoYSkKLSAgKiBOYW1lc3BhY2UgY2hhbmdlZCB0byBHb29nbGUuUHJvdG9idWYgKGFuZCBOdUdldCBwYWNrYWdlIHdpbGwgYmUgbmFtZWQKLSAgICBjb3JyZXNwb25kaW5nbHkpLgotICAqIFRhcmdldCBwbGF0Zm9ybXMgbm93IC5ORVQgNC41IGFuZCBzZWxlY3RlZCBwb3J0YWJsZSBzdWJzZXRzIG9ubHkuCi0gICogUmVtb3ZlZCBsaXRlIHJ1bnRpbWUuCi0gICogUmVpbXBsZW1lbnRhdGlvbiB0byB1c2UgbXV0YWJsZSBtZXNzYWdlIHR5cGVzLgotICAqIE51bGwgcmVmZXJlbmNlcyB1c2VkIHRvIHJlcHJlc2VudCAibm8gdmFsdWUiIGZvciBtZXNzYWdlIHR5cGUgZmllbGRzLgotICAqIFByb3RvMyBzZW1hbnRpY3Mgc3VwcG9ydGVkOyBwcm90bzIgZmlsZXMgYXJlIHByb2hpYml0ZWQgZm9yIEMjIGNvZGVnZW4uCi0gICAgTW9zdCBwcm90bzMgZmVhdHVyZXMgc3VwcG9ydGVkOgotICAgICAgLSBKU09OIGZvcm1hdHRpbmcgKGEuay5hLiBzZXJpYWxpemF0aW9uIHRvIEpTT04pLCBpbmNsdWRpbmcgd2VsbC1rbm93bgotICAgICAgICB0eXBlcyAoZXhjZXB0IGZvciBBbnkpLgotICAgICAgLSBXcmFwcGVyIHR5cGVzIG1hcHBlZCB0byBudWxsYWJsZSB2YWx1ZSB0eXBlcyAob3Igc3RyaW5nL0J5dGVTdHJpbmcKLSAgICAgICAgYWxsb3dpbmcgbnVsbGFiaWxpdHkpLiBKU09OIHBhcnNpbmcgaXMgbm90IHN1cHBvcnRlZCB5ZXQuCi0gICAgICAtIG1hcHMKLSAgICAgIC0gb25lb2YKLSAgICAgIC0gZW51bSB1bmtub3duIHZhbHVlIHByZXNlcnZhdGlvbgotCi0yMDE1LTA1LTI1IHZlcnNpb24gMy4wLjAtYWxwaGEtMyAoT2JqZWN0aXZlLUMvQyMpOgotICBHZW5lcmFsCi0gICogSW50cm9kdWNlZCB0d28gbmV3IGxhbmd1YWdlIGltcGxlbWVudGF0aW9ucyAoT2JqZWN0aXZlLUMsIEMjKSB0byBwcm90bzMuCi0gICogRXhwbGljaXQgIm9wdGlvbmFsIiBrZXl3b3JkIGFyZSBkaXNhbGxvd2VkIGluIHByb3RvMyBzeW50YXgsIGFzIGZpZWxkcyBhcmUKLSAgICBvcHRpb25hbCBieSBkZWZhdWx0LgotICAqIEdyb3VwIGZpZWxkcyBhcmUgbm8gbG9uZ2VyIHN1cHBvcnRlZCBpbiBwcm90bzMgc3ludGF4LgotICAqIENoYW5nZWQgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyB0byB1c2UgcGFja2VkIHNlcmlhbGl6YXRpb24gYnkgZGVmYXVsdCBpbgotICAgIHByb3RvMyAoaW1wbGVtZW50ZWQgZm9yIEMrKywgSmF2YSwgUHl0aG9uIGluIHRoaXMgcmVsZWFzZSkuICBUaGUgdXNlciBjYW4KLSAgICBzdGlsbCBkaXNhYmxlIHBhY2tlZCBzZXJpYWxpemF0aW9uIGJ5IHNldHRpbmcgcGFja2VkIHRvIGZhbHNlIGZvciBub3cuCi0gICogQWRkZWQgd2VsbC1rbm93biB0eXBlIHByb3RvcyAoYW55LnByb3RvLCBlbXB0eS5wcm90bywgdGltZXN0YW1wLnByb3RvLAotICAgIGR1cmF0aW9uLnByb3RvLCBldGMuKS4gVXNlcnMgY2FuIGltcG9ydCBhbmQgdXNlIHRoZXNlIHByb3RvcyBqdXN0IGxpa2UKLSAgICByZWd1bGFyIHByb3RvIGZpbGVzLiBBZGRpdGlvbmFsIHJ1bnRpbWUgc3VwcG9ydCB3aWxsIGJlIGFkZGVkIGZvciB0aGVtIGluCi0gICAgZnV0dXJlIHJlbGVhc2VzIChpbiB0aGUgZm9ybSBvZiB1dGlsaXR5IGhlbHBlciBmdW5jdGlvbnMsIG9yIGhhdmluZyB0aGVtCi0gICAgcmVwbGFjZWQgYnkgbGFuZ3VhZ2Ugc3BlY2lmaWMgdHlwZXMgaW4gZ2VuZXJhdGVkIGNvZGUpLgotICAqIEFkZGVkIGEgInJlc2VydmVkIiBrZXl3b3JkIGluIGJvdGggcHJvdG8yIGFuZCBwcm90bzMgc3ludGF4LiBVc2VyIGNhbiB1c2UKLSAgICB0aGlzIGtleXdvcmQgdG8gZGVjbGFyZSByZXNlcnZlZCBmaWVsZCBudW1iZXJzIGFuZCBuYW1lcyB0byBwcmV2ZW50IHRoZW0KLSAgICBmcm9tIGJlaW5nIHJldXNlZCBieSBvdGhlciBmaWVsZHMgaW4gdGhlIHNhbWUgbWVzc2FnZS4KLQotICAgIFRvIHJlc2VydmUgZmllbGQgbnVtYmVycywgYWRkIGEgcmVzZXJ2ZWQgZGVjbGFyYXRpb24gaW4geW91ciBtZXNzYWdlOgotCi0gICAgICBtZXNzYWdlIFRlc3RNZXNzYWdlIHsKLSAgICAgICAgcmVzZXJ2ZWQgMiwgMTUsIDkgdG8gMTEsIDM7Ci0gICAgICB9Ci0KLSAgICBUaGlzIHJlc2VydmVzIGZpZWxkIG51bWJlcnMgMiwgMywgOSwgMTAsIDExIGFuZCAxNS4gSWYgYSB1c2VyIHVzZXMgYW55IG9mCi0gICAgdGhlc2UgYXMgZmllbGQgbnVtYmVycywgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlciB3aWxsIHJlcG9ydCBhbiBlcnJvci4KLQotICAgIEZpZWxkIG5hbWVzIGNhbiBhbHNvIGJlIHJlc2VydmVkOgotCi0gICAgICBtZXNzYWdlIFRlc3RNZXNzYWdlIHsKLSAgICAgICAgcmVzZXJ2ZWQgImZvbyIsICJiYXIiOwotICAgICAgfQotCi0gICogVmFyaW91cyBidWcgZml4ZXMgc2luY2UgMy4wLjAtYWxwaGEtMgotCi0gIE9iamVjdGl2ZS1DCi0gICAgT2JqZWN0aXZlLUMgaW5jbHVkZXMgYSBjb2RlIGdlbmVyYXRvciBhbmQgYSBuYXRpdmUgb2JqZWN0aXZlLWMgcnVudGltZQotICAgIGxpYnJhcnkuICBCeSBhZGRpbmcg4oCcLS1vYmpjX291dOKAnSB0byBwcm90b2MsIHRoZSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlCi0gICAgYSBoZWFkZXIoKi5wYm9iamMuaCkgYW5kIGFuIGltcGxlbWVudGF0aW9uIGZpbGUoKi5wYm9iamMubSkgZm9yIGVhY2ggcHJvdG8KLSAgICBmaWxlLgotCi0gICAgSW4gdGhpcyBmaXJzdCByZWxlYXNlLCB0aGUgZ2VuZXJhdGVkIGludGVyZmFjZSBwcm92aWRlczogZW51bXMsIG1lc3NhZ2VzLAotICAgIGZpZWxkIHN1cHBvcnQoc2luZ2xlLCByZXBlYXRlZCwgbWFwLCBvbmVvZiksIHByb3RvMiBhbmQgcHJvdG8zIHN5bnRheAotICAgIHN1cHBvcnQsIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24uIEl04oCZcyAgY29tcGF0aWJsZSB3aXRoIEFSQyBhbmQgbm9uLUFSQwotICAgIHVzYWdlLiBCZXNpZGVzLCB1c2VyIGNhbiBhbHNvIGFjY2VzcyBpdCB2aWEgdGhlIHN3aWZ0IGJyaWRnaW5nIGhlYWRlci4KLQotICAgIFNlZSBvYmplY3RpdmVjL1JFQURNRS5tZCBmb3IgZGV0YWlscy4KLQotICBDIwotICAgICogQyMgcHJvdG9idWZzIGFyZSBiYXNlZCBvbiBwcm9qZWN0Ci0gICAgICBodHRwczovL2dpdGh1Yi5jb20vanNrZWV0L3Byb3RvYnVmLWNzaGFycC1wb3J0LiBUaGUgb3JpZ2luYWwgcHJvamVjdCB3YXMKLSAgICAgIGZyb3plbiBhbmQgYWxsIHRoZSBuZXcgZGV2ZWxvcG1lbnQgd2lsbCBoYXBwZW4gaGVyZS4KLSAgICAqIENvZGVnZW4gcGx1Z2luIGZvciBDIyB3YXMgY29tcGxldGVseSByZXdyaXR0ZW4gdG8gQysrIGFuZCBpcyBub3cgYW4KLSAgICAgIGludGVncmFsIHBhcnQgb2YgcHJvdG9jLgotICAgICogU29tZSByZWZhY3RvcmluZ3MgYW5kIGNsZWFudXAgaGFzIGJlZW4gYXBwbGllZCB0byB0aGUgQyMgcnVudGltZSBsaWJyYXJ5LgotICAgICogT25seSBwcm90bzIgaXMgc3VwcG9ydGVkIGluIEMjIGF0IHRoZSBtb21lbnQsIHByb3RvMyBzdXBwb3J0IGlzIGluCi0gICAgICBwcm9ncmVzcyBhbmQgd2lsbCBsaWtlbHkgYnJpbmcgc2lnbmlmaWNhbnQgYnJlYWtpbmcgY2hhbmdlcyB0byB0aGUgQVBJLgotCi0gICAgU2VlIGNzaGFycC9SRUFETUUubWQgZm9yIGRldGFpbHMuCi0KLSAgQysrCi0gICAgKiBBZGRlZCBydW50aW1lIHN1cHBvcnQgZm9yIEFueSB0eXBlLiBUbyB1c2UgQW55IGluIHlvdXIgcHJvdG8gZmlsZSwgZmlyc3QKLSAgICAgIGltcG9ydCB0aGUgZGVmaW5pdGlvbiBvZiBBbnk6Ci0KLSAgICAgICAgLy8gZm9vLnByb3RvCi0gICAgICAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byI7Ci0gICAgICAgIG1lc3NhZ2UgRm9vIHsKLSAgICAgICAgICBnb29nbGUucHJvdG9idWYuQW55IGFueV9maWVsZCA9IDE7Ci0gICAgICAgIH0KLSAgICAgICAgbWVzc2FnZSBCYXIgewotICAgICAgICAgIGludDMyIHZhbHVlID0gMTsKLSAgICAgICAgfQotCi0gICAgICBUaGVuIGluIEMrKyB5b3UgY2FuIGFjY2VzcyB0aGUgQW55IGZpZWxkIHVzaW5nIFBhY2tGcm9tKCkvVW5wYWNrVG8oKQotICAgICAgbWV0aG9kczoKLQotICAgICAgICBGb28gZm9vOwotICAgICAgICBCYXIgYmFyID0gLi4uOwotICAgICAgICBmb28ubXV0YWJsZV9hbnlfZmllbGQoKS0+UGFja0Zyb20oYmFyKTsKLSAgICAgICAgLi4uCi0gICAgICAgIGlmIChmb28uYW55X2ZpZWxkKCkuSXNUeXBlPEJhcj4oKSkgewotICAgICAgICAgIGZvby5hbnlfZmllbGQoKS5VbnBhY2tUbygmYmFyKTsKLSAgICAgICAgICAuLi4KLSAgICAgICAgfQotICAgICogSW4gdGV4dCBmb3JtYXQsIGVudHJpZXMgb2YgYSBtYXAgZmllbGQgd2lsbCBiZSBzb3J0ZWQgYnkga2V5LgotCi0gIEphdmEKLSAgICAqIENvbnRpbnVlZCBvcHRpbWl6YXRpb25zIG9uIHRoZSBsaXRlIHJ1bnRpbWUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBmb3IKLSAgICAgIEFuZHJvaWQuCi0KLSAgUHl0aG9uCi0gICAgKiBBZGRlZCBtYXAgc3VwcG9ydC4KLSAgICAgIC0gbWFwcyBub3cgaGF2ZSBhIGRpY3QtbGlrZSBpbnRlcmZhY2UgKG1zZy5tYXBfZmllbGRba2V5XSA9IHZhbHVlKQotICAgICAgLSBleGlzdGluZyBjb2RlIHRoYXQgbW9kaWZpZXMgbWFwcyB2aWEgdGhlIHJlcGVhdGVkIGZpZWxkIGludGVyZmFjZQotICAgICAgICB3aWxsIG5lZWQgdG8gYmUgdXBkYXRlZC4KLQotICBSdWJ5Ci0gICAgKiBJbXByb3ZlbWVudHMgdG8gUmVwZWF0ZWRGaWVsZCdzIGVtdWxhdGlvbiBvZiB0aGUgUnVieSBBcnJheSBBUEkuCi0gICAgKiBWYXJpb3VzIHNwZWVkdXBzIGFuZCBpbnRlcm5hbCBjbGVhbnVwcy4KLQotMjAxNS0wMi0yNiB2ZXJzaW9uIDMuMC4wLWFscGhhLTIgKFB5dGhvbi9SdWJ5L0phdmFOYW5vKToKLSAgR2VuZXJhbAotICAqIEludHJvZHVjZWQgdGhyZWUgbmV3IGxhbmd1YWdlIGltcGxlbWVudGF0aW9ucyAoUnVieSwgSmF2YU5hbm8sIGFuZAotICAgIFB5dGhvbikgdG8gcHJvdG8zLgotICAqIFZhcmlvdXMgYnVnIGZpeGVzIHNpbmNlIDMuMC4wLWFscGhhLTEKLQotICBQeXRob246Ci0gICAgUHl0aG9uIGhhcyByZWNlaXZlZCBzZXZlcmFsIHVwZGF0ZXMsIG1vc3Qgbm90YWJseSBzdXBwb3J0IGZvciBwcm90bzMKLSAgICBzZW1hbnRpY3MgaW4gYW55IC5wcm90byBmaWxlIHRoYXQgZGVjbGFyZXMgc3ludGF4PSJwcm90bzMiLgotICAgIE1lc3NhZ2VzIGRlY2xhcmVkIGluIHByb3RvMyBmaWxlcyBubyBsb25nZXIgcmVwcmVzZW50IGZpZWxkIHByZXNlbmNlCi0gICAgZm9yIHNjYWxhciBmaWVsZHMgKG51bWJlciwgZW51bXMsIGJvb2xlYW5zLCBvciBzdHJpbmdzKS4gIFlvdSBjYW4KLSAgICBubyBsb25nZXIgY2FsbCBIYXNGaWVsZCgpIGZvciBzdWNoIGZpZWxkcywgYW5kIHRoZXkgYXJlIHNlcmlhbGl6ZWQKLSAgICBiYXNlZCBvbiB3aGV0aGVyIHRoZXkgaGF2ZSBhIG5vbi16ZXJvL2VtcHR5L2ZhbHNlIHZhbHVlLgotCi0gICAgT25lIG90aGVyIG5vdGFibGUgY2hhbmdlIGlzIGluIHRoZSBDKystYWNjZWxlcmF0ZWQgaW1wbGVtZW50YXRpb24uCi0gICAgRGVzY3JpcHRvciBvYmplY3RzICh3aGljaCBkZXNjcmliZSB0aGUgcHJvdG9idWYgc2NoZW1hIGFuZCBhbGxvdwotICAgIHJlZmxlY3Rpb24gb3ZlciBpdCkgYXJlIG5vIGxvbmdlciBkdXBsaWNhdGVkIGJldHdlZW4gdGhlIFB5dGhvbgotICAgIGFuZCBDKysgbGF5ZXJzLiAgVGhlIFB5dGhvbiBkZXNjcmlwdG9ycyBhcmUgbm93IHNpbXBsZSB3cmFwcGVycwotICAgIGFyb3VuZCB0aGUgQysrIGRlc2NyaXB0b3JzLiAgVGhpcyBjaGFuZ2Ugc2hvdWxkIHNpZ25pZmljYW50bHkKLSAgICByZWR1Y2UgdGhlIG1lbW9yeSB1c2FnZSBvZiBwcm9ncmFtcyB0aGF0IHVzZSBhIGxvdCBvZiBtZXNzYWdlCi0gICAgdHlwZXMuCi0KLSAgUnVieToKLSAgICBXZSBoYXZlIGFkZGVkIHByb3RvMyBzdXBwb3J0IGZvciBSdWJ5IHZpYSBhIG5hdGl2ZSBDIGV4dGVuc2lvbi4KLQotICAgIFRoZSBSdWJ5IGV4dGVuc2lvbiBpdHNlbGYgaXMgaW5jbHVkZWQgaW4gdGhlIHJ1YnkvIGRpcmVjdG9yeSwgYW5kIGRldGFpbHMgb24KLSAgICBidWlsZGluZyBhbmQgaW5zdGFsbGluZyB0aGUgZXh0ZW5zaW9uIGFyZSBpbiBydWJ5L1JFQURNRS5tZC4gVGhlIGV4dGVuc2lvbgotICAgIHdpbGwgYWxzbyBiZSBwdWJsaXNoZWQgYXMgYSBSdWJ5IGdlbS4gQ29kZSBnZW5lcmF0b3Igc3VwcG9ydCBpcyBpbmNsdWRlZCBhcwotICAgIHBhcnQgb2YgYHByb3RvY2Agd2l0aCB0aGUgYC0tcnVieV9vdXRgIGZsYWcuCi0KLSAgICBUaGUgUnVieSBleHRlbnNpb24gaW1wbGVtZW50cyBhIHVzZXItZnJpZW5kbHkgRFNMIHRvIGRlZmluZSBtZXNzYWdlIHR5cGVzCi0gICAgKGFsc28gZ2VuZXJhdGVkIGJ5IHRoZSBjb2RlIGdlbmVyYXRvciBmcm9tIGAucHJvdG9gIGZpbGVzKS4gIE9uY2UgYSBtZXNzYWdlCi0gICAgdHlwZSBpcyBkZWZpbmVkLCB0aGUgdXNlciBtYXkgY3JlYXRlIGluc3RhbmNlcyBvZiB0aGUgbWVzc2FnZSB0aGF0IGJlaGF2ZSBpbgotICAgIHdheXMgaWRpb21hdGljIHRvIFJ1YnkuIEZvciBleGFtcGxlOgotCi0gICAgLSBNZXNzYWdlIGZpZWxkcyBhcmUgcHJlc2VudCBhcyBvcmRpbmFyeSBSdWJ5IHByb3BlcnRpZXMgKGdldHRlciBtZXRob2QKLSAgICAgIGBmb29gIGFuZCBzZXR0ZXIgbWV0aG9kIGBmb289YCkuCi0gICAgLSBSZXBlYXRlZCBmaWVsZCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgY29udGFpbmVyIHRoYXQgYWN0cyBsaWtlIGEgbmF0aXZlCi0gICAgICBSdWJ5IGFycmF5LCBhbmQgbWFwIGVsZW1lbnRzIGFyZSBzdG9yZWQgaW4gYSBjb250YWluZXIgdGhhdCBhY3RzIGxpa2UgYQotICAgICAgbmF0aXZlIFJ1YnkgaGFzaG1hcC4KLSAgICAtIFRoZSB1c3VhbCB3ZWxsLWtub3duIG1ldGhvZHMsIHN1Y2ggYXMgYCN0b19zYCwgYCNkdXBgLCBhbmQgdGhlIGxpa2UsIGFyZQotICAgICAgcHJlc2VudC4KLQotICAgIFVubGlrZSBzZXZlcmFsIGV4aXN0aW5nIHRoaXJkLXBhcnR5IFJ1YnkgZXh0ZW5zaW9ucyBmb3IgcHJvdG9idWYsIHRoaXMKLSAgICBleHRlbnNpb24gaXMgYnVpbHQgb24gYSAic3Ryb25nbHktdHlwZWQiIHBoaWxvc29waHk6IG1lc3NhZ2UgZmllbGRzIGFuZAotICAgIGFycmF5L21hcCBjb250YWluZXJzIHdpbGwgdGhyb3cgZXhjZXB0aW9ucyBlYWdlcmx5IHdoZW4gdmFsdWVzIG9mIHRoZQotICAgIGluY29ycmVjdCB0eXBlIGFyZSBpbnNlcnRlZC4KLQotICAgIFNlZSBydWJ5L1JFQURNRS5tZCBmb3IgZGV0YWlscy4KLQotICBKYXZhTmFubzoKLSAgICBKYXZhTmFubyBpcyBhIHNwZWNpYWwgY29kZSBnZW5lcmF0b3IgYW5kIHJ1bnRpbWUgbGlicmFyeSBkZXNpZ25lZCBlc3BlY2lhbGx5Ci0gICAgZm9yIHJlc291cmNlLXJlc3RyaWN0ZWQgc3lzdGVtcywgbGlrZSBBbmRyb2lkLiBJdCBpcyB2ZXJ5IHJlc291cmNlLWZyaWVuZGx5Ci0gICAgaW4gYm90aCB0aGUgYW1vdW50IG9mIGNvZGUgYW5kIHRoZSBydW50aW1lIG92ZXJoZWFkLiBIZXJlIGlzIGFuIGFuIG92ZXJ2aWV3Ci0gICAgb2YgSmF2YU5hbm8gZmVhdHVyZXMgY29tcGFyZWQgd2l0aCB0aGUgb2ZmaWNpYWwgSmF2YSBwcm90b2J1ZjoKLQotICAgIC0gTm8gZGVzY3JpcHRvcnMgb3IgbWVzc2FnZSBidWlsZGVycy4KLSAgICAtIEFsbCBtZXNzYWdlcyBhcmUgbXV0YWJsZTsgZmllbGRzIGFyZSBwdWJsaWMgSmF2YSBmaWVsZHMuCi0gICAgLSBGb3Igb3B0aW9uYWwgZmllbGRzIG9ubHksIGVuY2Fwc3VsYXRpb24gYmVoaW5kIHNldHRlci9nZXR0ZXIvaGF6emVyLwotICAgICAgY2xlYXJlciBmdW5jdGlvbnMgaXMgb3B0LWluLCB3aGljaCBwcm92aWRlIHByb3BlciAnaGFzJyBzdGF0ZSBzdXBwb3J0LgotICAgIC0gRm9yIHByb3RvMiwgaWYgbm90IG9wdGVkIGluLCBoYXMgc3RhdGUgKGZpZWxkIHByZXNlbmNlKSBpcyBub3QgYXZhaWxhYmxlLgotICAgICAgU2VyaWFsaXphdGlvbiBvdXRwdXRzIGFsbCBmaWVsZHMgbm90IGVxdWFsIHRvIHRoZWlyIGRlZmF1bHRzLgotICAgICAgVGhlIGJlaGF2aW9yIGlzIGNvbnNpc3RlbnQgd2l0aCBwcm90bzMgc2VtYW50aWNzLgotICAgIC0gUmVxdWlyZWQgZmllbGRzIChwcm90bzIgb25seSkgYXJlIGFsd2F5cyBzZXJpYWxpemVkLgotICAgIC0gRW51bSBjb25zdGFudHMgYXJlIGludGVnZXJzOyBwcm90ZWN0aW9uIGFnYWluc3QgaW52YWxpZCB2YWx1ZXMgb25seQotICAgICAgd2hlbiBwYXJzaW5nIGZyb20gdGhlIHdpcmUuCi0gICAgLSBFbnVtIGNvbnN0YW50cyBjYW4gYmUgZ2VuZXJhdGVkIGludG8gY29udGFpbmVyIGludGVyZmFjZXMgYmVhcmluZwotICAgICAgdGhlIGVudW0ncyBuYW1lIChzbyB0aGUgcmVmZXJlbmNpbmcgY29kZSBpcyBpbiBKYXZhIHN0eWxlKS4KLSAgICAtIENvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyBjYW4gb25seSB0YWtlIGJ5dGVbXSAobm90IElucHV0U3RyZWFtKS4KLSAgICAtIFNpbWlsYXJseSBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIGNhbiBvbmx5IHdyaXRlIHRvIGJ5dGVbXS4KLSAgICAtIFJlcGVhdGVkIGZpZWxkcyBhcmUgaW4gYXJyYXlzLCBub3QgQXJyYXlMaXN0IG9yIFZlY3Rvci4gTnVsbCBhcnJheQotICAgICAgZWxlbWVudHMgYXJlIGFsbG93ZWQgYW5kIHNpbGVudGx5IGlnbm9yZWQuCi0gICAgLSBGdWxsIHN1cHBvcnQgZm9yIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgcmVwZWF0ZWQgcGFja2VkIGZpZWxkcy4KLSAgICAtIFN1cHBvcnQgIGV4dGVuc2lvbnMgKGluIHByb3RvMikuCi0gICAgLSBVbnNldCBtZXNzYWdlcy9ncm91cHMgYXJlIG51bGwsIG5vdCBhbiBpbW11dGFibGUgZW1wdHkgZGVmYXVsdAotICAgICAgaW5zdGFuY2UuCi0gICAgLSB0b0J5dGVBcnJheSguLi4pIGFuZCBtZXJnZUZyb20oLi4uKSBhcmUgbm93IHN0YXRpYyBmdW5jdGlvbnMgb2YKLSAgICAgIE1lc3NhZ2VOYW5vLgotICAgIC0gVGhlICdieXRlcycgdHlwZSB0cmFuc2xhdGVzIHRvIHRoZSBKYXZhIHR5cGUgYnl0ZVtdLgotCi0gICAgU2VlIGphdmFuYW5vL1JFQURNRS50eHQgZm9yIGRldGFpbHMuCi0KLTIwMTQtMTItMDEgdmVyc2lvbiAzLjAuMC1hbHBoYS0xIChDKysvSmF2YSk6Ci0KLSAgR2VuZXJhbAotICAqIEludHJvZHVjZWQgUHJvdG9jb2wgQnVmZmVycyBsYW5ndWFnZSB2ZXJzaW9uIDMgKGFrYSBwcm90bzMpLgotCi0gICAgV2hlbiBwcm90b2J1ZiB3YXMgaW5pdGlhbGx5IG9wZW5zb3VyY2VkIGl0IGltcGxlbWVudGVkIFByb3RvY29sIEJ1ZmZlcnMKLSAgICBsYW5ndWFnZSB2ZXJzaW9uIDIgKGFrYSBwcm90bzIpLCB3aGljaCBpcyB3aHkgdGhlIHZlcnNpb24gbnVtYmVyCi0gICAgc3RhcnRlZCBmcm9tIHYyLjAuMC4gRnJvbSB2My4wLjAsIGEgbmV3IGxhbmd1YWdlIHZlcnNpb24gKHByb3RvMykgaXMKLSAgICBpbnRyb2R1Y2VkIHdoaWxlIHRoZSBvbGQgdmVyc2lvbiAocHJvdG8yKSB3aWxsIGNvbnRpbnVlIHRvIGJlIHN1cHBvcnRlZC4KLQotICAgIFRoZSBtYWluIGludGVudCBvZiBpbnRyb2R1Y2luZyBwcm90bzMgaXMgdG8gY2xlYW4gdXAgcHJvdG9idWYgYmVmb3JlCi0gICAgcHVzaGluZyB0aGUgbGFuZ3VhZ2UgYXMgdGhlIGZvdW5kYXRpb24gb2YgR29vZ2xlJ3MgbmV3IEFQSSBwbGF0Zm9ybS4KLSAgICBJbiBwcm90bzMsIHRoZSBsYW5ndWFnZSBpcyBzaW1wbGlmaWVkLCBib3RoIGZvciBlYXNlIG9mIHVzZSBhbmQgIHRvCi0gICAgbWFrZSBpdCBhdmFpbGFibGUgaW4gYSB3aWRlciByYW5nZSBvZiBwcm9ncmFtbWluZyBsYW5ndWFnZXMuIEF0IHRoZQotICAgIHNhbWUgdGltZSBhIGZldyBmZWF0dXJlcyBhcmUgYWRkZWQgdG8gYmV0dGVyIHN1cHBvcnQgY29tbW9uIGlkaW9tcwotICAgIGZvdW5kIGluIEFQSXMuCi0KLSAgICBUaGUgZm9sbG93aW5nIGFyZSB0aGUgbWFpbiBuZXcgZmVhdHVyZXMgaW4gbGFuZ3VhZ2UgdmVyc2lvbiAzOgotCi0gICAgICAxLiBSZW1vdmFsIG9mIGZpZWxkIHByZXNlbmNlIGxvZ2ljIGZvciBwcmltaXRpdmUgdmFsdWUgZmllbGRzLCByZW1vdmFsCi0gICAgICAgICBvZiByZXF1aXJlZCBmaWVsZHMsIGFuZCByZW1vdmFsIG9mIGRlZmF1bHQgdmFsdWVzLiBUaGlzIG1ha2VzIHByb3RvMwotICAgICAgICAgc2lnbmlmaWNhbnRseSBlYXNpZXIgdG8gaW1wbGVtZW50IHdpdGggb3BlbiBzdHJ1Y3QgcmVwcmVzZW50YXRpb25zLAotICAgICAgICAgYXMgaW4gbGFuZ3VhZ2VzIGxpa2UgQW5kcm9pZCBKYXZhLCBPYmplY3RpdmUgQywgb3IgR28uCi0gICAgICAyLiBSZW1vdmFsIG9mIHVua25vd24gZmllbGRzLgotICAgICAgMy4gUmVtb3ZhbCBvZiBleHRlbnNpb25zLCB3aGljaCBhcmUgaW5zdGVhZCByZXBsYWNlZCBieSBhIG5ldyBzdGFuZGFyZAotICAgICAgICAgdHlwZSBjYWxsZWQgQW55LgotICAgICAgNC4gRml4IHNlbWFudGljcyBmb3IgdW5rbm93biBlbnVtIHZhbHVlcy4KLSAgICAgIDUuIEFkZGl0aW9uIG9mIG1hcHMuCi0gICAgICA2LiBBZGRpdGlvbiBvZiBhIHNtYWxsIHNldCBvZiBzdGFuZGFyZCB0eXBlcyBmb3IgcmVwcmVzZW50YXRpb24gb2YgdGltZSwKLSAgICAgICAgIGR5bmFtaWMgZGF0YSwgZXRjLgotICAgICAgNy4gQSB3ZWxsLWRlZmluZWQgZW5jb2RpbmcgaW4gSlNPTiBhcyBhbiBhbHRlcm5hdGl2ZSB0byBiaW5hcnkgcHJvdG8KLSAgICAgICAgIGVuY29kaW5nLgotCi0gICAgVGhpcyByZWxlYXNlICh2My4wLjAtYWxwaGEtMSkgaW5jbHVkZXMgcGFydGlhbCBwcm90bzMgc3VwcG9ydCBmb3IgQysrIGFuZAotICAgIEphdmEuIEl0ZW1zIDYgKHdlbGwta25vd24gdHlwZXMpIGFuZCA3IChKU09OIGZvcm1hdCkgaW4gdGhlIGFib3ZlIGZlYXR1cmUKLSAgICBsaXN0IGFyZSBub3QgaW1wbGVtZW50ZWQuCi0KLSAgICBBIG5ldyBub3Rpb24gInN5bnRheCIgaXMgaW50cm9kdWNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgYSAucHJvdG8gZmlsZQotICAgIHVzZXMgcHJvdG8yIG9yIHByb3RvMzoKLQotICAgICAgLy8gZm9vLnByb3RvCi0gICAgICBzeW50YXggPSAicHJvdG8zIjsKLSAgICAgIG1lc3NhZ2UgQmFyIHsuLi59Ci0KLSAgICBJZiBvbWl0dGVkLCB0aGUgcHJvdG9jb2wgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhIHdhcm5pbmcgYW5kICJwcm90bzIiIHdpbGwKLSAgICBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0LiBUaGlzIHdhcm5pbmcgd2lsbCBiZSB0dXJuZWQgaW50byBhbiBlcnJvciBpbiBhCi0gICAgZnV0dXJlIHJlbGVhc2UuCi0KLSAgICBXZSByZWNvbW1lbmQgdGhhdCBuZXcgUHJvdG9jb2wgQnVmZmVycyB1c2VycyB1c2UgcHJvdG8zLiBIb3dldmVyLCB3ZSBkbyBub3QKLSAgICBnZW5lcmFsbHkgcmVjb21tZW5kIHRoYXQgZXhpc3RpbmcgdXNlcnMgbWlncmF0ZSBmcm9tIHByb3RvMiBmcm9tIHByb3RvMyBkdWUKLSAgICB0byBBUEkgaW5jb21wYXRpYmlsaXR5LCBhbmQgd2Ugd2lsbCBjb250aW51ZSB0byBzdXBwb3J0IHByb3RvMiBmb3IgYSBsb25nCi0gICAgdGltZS4KLQotICAqIEFkZGVkIHN1cHBvcnQgZm9yIG1hcCBmaWVsZHMgKGltcGxlbWVudGVkIGluIEMrKy9KYXZhIGZvciBib3RoIHByb3RvMiBhbmQKLSAgICBwcm90bzMpLgotCi0gICAgTWFwIGZpZWxkcyBjYW4gYmUgZGVjbGFyZWQgdXNpbmcgdGhlIGZvbGxvd2luZyBzeW50YXg6Ci0KLSAgICAgIG1lc3NhZ2UgRm9vIHsKLSAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YWx1ZXMgPSAxOwotICAgICAgfQotCi0gICAgRGF0YSBvZiBhIG1hcCBmaWVsZCB3aWxsIGJlIHN0b3JlZCBpbiBtZW1vcnkgYXMgYW4gdW5vcmRlcmVkIG1hcCBhbmQgaXQKLSAgICBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCBnZW5lcmF0ZWQgYWNjZXNzb3JzLgotCi0gIEMrKwotICAqIEFkZGVkIGFyZW5hIGFsbG9jYXRpb24gc3VwcG9ydCAoZm9yIGJvdGggcHJvdG8yIGFuZCBwcm90bzMpLgotCi0gICAgUHJvZmlsaW5nIHNob3dzIG1lbW9yeSBhbGxvY2F0aW9uIGFuZCBkZWFsbG9jYXRpb24gY29uc3RpdHV0ZXMgYSBzaWduaWZpY2FudAotICAgIGZyYWN0aW9uIG9mIENQVS10aW1lIHNwZW50IGluIHByb3RvYnVmIGNvZGUgYW5kIGFyZW5hIGFsbG9jYXRpb24gaXMgYQotICAgIHRlY2huaXF1ZSBpbnRyb2R1Y2VkIHRvIHJlZHVjZSB0aGlzIGNvc3QuIFdpdGggYXJlbmEgYWxsb2NhdGlvbiwgbmV3Ci0gICAgb2JqZWN0cyB3aWxsIGJlIGFsbG9jYXRlZCBmcm9tIGEgbGFyZ2UgcGllY2Ugb2YgcHJlYWxsb2NhdGVkIG1lbW9yeSBhbmQKLSAgICBkZWFsbG9jYXRpb24gb2YgdGhlc2Ugb2JqZWN0cyBpcyBhbG1vc3QgZnJlZS4gRWFybHkgYWRvcHRpb24gc2hvd3MgMjAlIHRvCi0gICAgNTAlIGltcHJvdmVtZW50IGluIHNvbWUgR29vZ2xlIGJpbmFyaWVzLgotCi0gICAgVG8gZW5hYmxlIGFyZW5hIHN1cHBvcnQsIGFkZCB0aGUgZm9sbG93aW5nIG9wdGlvbiB0byB5b3VyIC5wcm90byBmaWxlOgotCi0gICAgICBvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7Ci0KLSAgICBQcm90b2NvbCBjb21waWxlciB3aWxsIGdlbmVyYXRlIGFkZGl0aW9uYWwgY29kZSB0byBtYWtlIHRoZSBnZW5lcmF0ZWQKLSAgICBtZXNzYWdlIGNsYXNzZXMgd29yayB3aXRoIGFyZW5hcy4gVGhpcyBkb2VzIG5vdCBjaGFuZ2UgdGhlIGV4aXN0aW5nIEFQSQotICAgIG9mIHByb3RvYnVmIG1lc3NhZ2VzIGFuZCBkb2VzIG5vdCBhZmZlY3Qgd2lyZSBmb3JtYXQuIFlvdXIgZXhpc3RpbmcgY29kZQotICAgIHNob3VsZCBjb250aW51ZSB0byB3b3JrIGFmdGVyIGFkZGluZyB0aGlzIG9wdGlvbi4gSW4gdGhlIGZ1dHVyZSB3ZSB3aWxsCi0gICAgbWFrZSB0aGlzIG9wdGlvbiBlbmFibGVkIGJ5IGRlZmF1bHQuCi0KLSAgICBUbyBhY3R1YWxseSB0YWtlIGFkdmFudGFnZSBvZiBhcmVuYSBhbGxvY2F0aW9uLCB5b3UgbmVlZCB0byB1c2UgdGhlIGFyZW5hCi0gICAgQVBJcyB3aGVuIGNyZWF0aW5nIG1lc3NhZ2VzLiBBIHF1aWNrIGV4YW1wbGUgb2YgdXNpbmcgdGhlIGFyZW5hIEFQSToKLQotICAgICAgewotICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSBhcmVuYTsKLSAgICAgICAgLy8gQWxsb2NhdGUgYSBwcm90b2J1ZiBtZXNzYWdlIGluIHRoZSBhcmVuYS4KLSAgICAgICAgTXlNZXNzYWdlKiBtZXNzYWdlID0gQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8TXlNZXNzYWdlPigmYXJlbmEpOwotICAgICAgICAvLyBBbGwgc3VibWVzc2FnZXMgd2lsbCBiZSBhbGxvY2F0ZWQgaW4gdGhlIHNhbWUgYXJlbmEuCi0gICAgICAgIGlmICghbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpKSB7Ci0gICAgICAgICAgLy8gRGVhbCB3aXRoIG1hbGZvcm1lZCBpbnB1dCBkYXRhLgotICAgICAgICB9Ci0gICAgICAgIC8vIE11c3Qgbm90IGRlbGV0ZSB0aGUgbWVzc2FnZSBoZXJlLiBJdCB3aWxsIGJlIGRlbGV0ZWQgYXV0b21hdGljYWxseQotICAgICAgICAvLyB3aGVuIHRoZSBhcmVuYSBpcyBkZXN0cm95ZWQuCi0gICAgICB9Ci0KLSAgICBDdXJyZW50bHkgYXJlbmEgZG9lcyBub3Qgd29yayB3aXRoIG1hcCBmaWVsZHMuIEVuYWJsaW5nIGFyZW5hIGluIGEgLnByb3RvCi0gICAgZmlsZSBjb250YWluaW5nIG1hcCBmaWVsZHMgd2lsbCByZXN1bHQgaW4gY29tcGlsZSBlcnJvcnMgaW4gdGhlIGdlbmVyYXRlZAotICAgIGNvZGUuIFRoaXMgd2lsbCBiZSBhZGRyZXNzZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KLQotMjAxNC0xMC0yMCB2ZXJzaW9uIDIuNi4xOgotCi0gIEMrKwotICAqIEFkZGVkIGF0b21pY29wcyBzdXBwb3J0IGZvciBTb2xhcmlzLgotICAqIFJlbGVhc2VkIG1lbW9yeSBhbGxvY2F0ZWQgYnkgSW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpIGFuZAotICAgIEdldEVtcHR5U3RyaW5nKCkuIFNvbWUgbWVtb3J5IHNhbml0aXplcnMgcmVwb3J0ZWQgdGhlbSBhcyBtZW1vcnkgbGVha3MuCi0KLSAgSmF2YQotICAqIFVwZGF0ZWQgRHluYW1pY01lc3NhZ2Uuc2V0RmllbGQoKSB0byBoYW5kbGUgcmVwZWF0ZWQgZW51bSB2YWx1ZXMKLSAgICBjb3JyZWN0bHkuCi0gICogRml4ZWQgYSBidWcgdGhhdCBjYXVzZWQgTnVsbFBvaW50ZXJFeGNlcHRpb24gdG8gYmUgdGhyb3duIHdoZW4KLSAgICBjb252ZXJ0aW5nIG1hbnVhbGx5IGNvbnN0cnVjdGVkIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8KLSAgICBGaWxlRGVzY3JpcHRvci4KLQotICBQeXRob24KLSAgKiBGaXhlZCBXaGljaE9uZW9mKCkgdG8gd29yayB3aXRoIGRlLXNlcmlhbGl6ZWQgcHJvdG9idWYgbWVzc2FnZXMuCi0gICogRml4ZWQgYSBtaXNzaW5nIGZpbGUgcHJvYmxlbSBvZiBQeXRob24gQysrIGltcGxlbWVudGF0aW9uLgotCi0yMDE0LTA4LTE1IHZlcnNpb24gMi42LjA6Ci0KLSAgR2VuZXJhbAotICAqIEFkZGVkIG9uZW9mcyh1bmlvbnMpIGZlYXR1cmUuIEZpZWxkcyBpbiB0aGUgc2FtZSBvbmVvZiB3aWxsIHNoYXJlCi0gICAgbWVtb3J5IGFuZCBhdCBtb3N0IG9uZSBmaWVsZCBjYW4gYmUgc2V0IGF0IHRoZSBzYW1lIHRpbWUuIFVzZSB0aGUKLSAgICBvbmVvZiBrZXl3b3JkIHRvIGRlZmluZSBhIG9uZW9mIGxpa2U6Ci0gICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2UgewotICAgICAgICBvbmVvZiB0ZXN0X29uZW9mIHsKLSAgICAgICAgICBzdHJpbmcgbmFtZSA9IDQ7Ci0gICAgICAgICAgWW91ck1lc3NhZ2Ugc3ViX21lc3NhZ2UgPSA5OwotICAgICAgICB9Ci0gICAgICB9Ci0gICogRmlsZXMsIHNlcnZpY2VzLCBlbnVtcywgbWVzc2FnZXMsIG1ldGhvZHMgYW5kIGVudW0gdmFsdWVzIGNhbiBiZSBtYXJrZWQKLSAgICBhcyBkZXByZWNhdGVkIG5vdy4KLSAgKiBBZGRlZCBTdXBwb3J0IGZvciBsaXN0IHZhbHVlcywgaW5jbHVkaW5nIGxpc3RzIG9mIG1lc3NhZ2VzLCB3aGVuCi0gICAgcGFyc2luZyB0ZXh0LWZvcm1hdHRlZCBwcm90b3MgaW4gQysrIGFuZCBKYXZhLgotICAgICAgRm9yIGV4YW1wbGU6ICBmb286IFsxLCAyLCAzXQotCi0gIEMrKwotICAqIEVuaGFuY2VkIGN1c3RvbWl6YXRpb24gb24gVGVzdEZvcm1hdCBwcmludGluZy4KLSAgKiBBZGRlZCBTd2FwRmllbGRzKCkgaW4gcmVmbGVjdGlvbiBBUEkgdG8gc3dhcCBhIHN1YnNldCBvZiBmaWVsZHMuCi0gICAgQWRkZWQgU2V0QWxsb2NhdGVkTWVzc2FnZSgpIGluIHJlZmxlY3Rpb24gQVBJLgotICAqIFJlcGVhdGVkIHByaW1pdGl2ZSBleHRlbnNpb25zIGFyZSBub3cgcGFja2FibGUuIFRoZQotICAgIFtwYWNrZWQ9dHJ1ZV0gb3B0aW9uIG9ubHkgYWZmZWN0cyBzZXJpYWxpemVycy4gVGhlcmVmb3JlLCBpdCBpcwotICAgIHBvc3NpYmxlIHRvIHN3aXRjaCBhIHJlcGVhdGVkIGV4dGVuc2lvbiBmaWVsZCB0byBwYWNrZWQgZm9ybWF0Ci0gICAgd2l0aG91dCBicmVha2luZyBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KLSAgKiBWYXJpb3VzIHNwZWVkIG9wdGltaXphdGlvbnMuCi0KLSAgSmF2YQotICAqIHdyaXRlVG8oKSBtZXRob2QgaW4gQnl0ZVN0cmluZyBjYW4gbm93IHdyaXRlIGEgc3Vic3RyaW5nIHRvIGFuCi0gICAgb3V0cHV0IHN0cmVhbS4gQWRkZWQgZW5kV2l0aCgpIG1ldGhvZCBmb3IgQnl0ZVN0cmluZy4KLSAgKiBCeXRlU3RyaW5nIGFuZCBCeXRlQnVmZmVyIGFyZSBub3cgc3VwcG9ydGVkIGluIENvZGVkSW5wdXRTdHJlYW0KLSAgICBhbmQgQ29kZWRPdXRwdXRTdHJlYW0uCi0gICogamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggY2FuIG5vdyBiZSB1c2VkIHdpdGggdGhlIExJVEVfUlVOVElNRS4KLQotICBQeXRob24KLSAgKiBBIG5ldyBDKystYmFja2VkIGV4dGVuc2lvbiBtb2R1bGUgKGFrYSAiY3BwIGFwaSB2MiIpIHRoYXQgcmVwbGFjZXMgdGhlCi0gICAgb2xkICgiY3BwIGFwaSB2MSIpIG9uZS4gIE11Y2ggZmFzdGVyIHRoYW4gdGhlIHB1cmUgUHl0aG9uIGNvZGUuICBUaGlzIG9uZQotICAgIHJlc29sdmVzIG1hbnkgYnVncyBhbmQgaXMgcmVjb21tZW5kZWQgZm9yIGdlbmVyYWwgdXNlIG92ZXIgdGhlCi0gICAgcHVyZSBQeXRob24gd2hlbiBwb3NzaWJsZS4KLSAgKiBEZXNjcmlwdG9ycyBub3cgaGF2ZSBlbnVtX3R5cGVzX2J5X25hbWUgYW5kIGV4dGVuc2lvbl90eXBlc19ieV9uYW1lIGRpY3QKLSAgICBhdHRyaWJ1dGVzLgotICAqIFN1cHBvcnQgZm9yIFB5dGhvbiAzLgotCi0yMDEzLTAyLTI3IHZlcnNpb24gMi41LjA6Ci0KLSAgR2VuZXJhbAotICAqIE5ldyBub3Rpb24gImltcG9ydCBwdWJsaWMiIHRoYXQgYWxsb3dzIGEgcHJvdG8gZmlsZSB0byBmb3J3YXJkIHRoZSBjb250ZW50Ci0gICAgaXQgaW1wb3J0cyB0byBpdHMgaW1wb3J0ZXJzLiBGb3IgZXhhbXBsZSwKLSAgICAgIC8vIGZvby5wcm90bwotICAgICAgaW1wb3J0IHB1YmxpYyAiYmFyLnByb3RvIjsKLSAgICAgIGltcG9ydCAiYmF6LnByb3RvIjsKLQotICAgICAgLy8gcXV4LnByb3RvCi0gICAgICBpbXBvcnQgImZvby5wcm90byI7Ci0gICAgICAvLyBTdHVmZiBkZWZpbmVkIGluIGJhci5wcm90byBtYXkgYmUgdXNlZCBpbiB0aGlzIGZpbGUsIGJ1dCBzdHVmZiBmcm9tCi0gICAgICAvLyBiYXoucHJvdG8gbWF5IE5PVCBiZSB1c2VkIHdpdGhvdXQgaW1wb3J0aW5nIGl0IGV4cGxpY2l0bHkuCi0gICAgVGhpcyBpcyB1c2VmdWwgZm9yIG1vdmluZyBwcm90byBmaWxlcy4gVG8gbW92ZSBhIHByb3RvIGZpbGUsIGp1c3QgbGVhdmUKLSAgICBhIHNpbmdsZSAiaW1wb3J0IHB1YmxpYyIgaW4gdGhlIG9sZCBwcm90byBmaWxlLgotICAqIE5ldyBlbnVtIG9wdGlvbiAiYWxsb3dfYWxpYXMiIHRoYXQgc3BlY2lmaWVzIHdoZXRoZXIgZGlmZmVyZW50IHN5bWJvbHMgY2FuCi0gICAgYmUgYXNzaWduZWQgdGhlIHNhbWUgbnVtZXJpYyB2YWx1ZS4gRGVmYXVsdCB2YWx1ZSBpcyAidHJ1ZSIuIFNldHRpbmcgaXQgdG8KLSAgICBmYWxzZSBjYXVzZXMgdGhlIGNvbXBpbGVyIHRvIHJlamVjdCBlbnVtIGRlZmluaXRpb25zIHdoZXJlIG11bHRpcGxlIHN5bWJvbHMKLSAgICBoYXZlIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUuCi0gICAgTm90ZTogV2UgcGxhbiB0byBmbGlwIHRoZSBkZWZhdWx0IHZhbHVlIHRvICJmYWxzZSIgaW4gYSBmdXR1cmUgcmVsZWFzZS4KLSAgICBQcm9qZWN0cyB1c2luZyBlbnVtIGFsaWFzZXMgc2hvdWxkIHNldCB0aGUgb3B0aW9uIHRvICJ0cnVlIiBpbiB0aGVpciAucHJvdG8KLSAgICBmaWxlcy4KLQotICBDKysKLSAgKiBOZXcgZ2VuZXJhdGVkIG1ldGhvZCBzZXRfYWxsb2NhdGVkX2ZvbyhUeXBlKiBmb28pIGZvciBtZXNzYWdlIGFuZCBzdHJpbmcKLSAgICBmaWVsZHMuIFRoaXMgbWV0aG9kIGFsbG93cyB5b3UgdG8gc2V0IHRoZSBmaWVsZCB0byBhIHByZS1hbGxvY2F0ZWQgb2JqZWN0Ci0gICAgYW5kIHRoZSBjb250YWluaW5nIG1lc3NhZ2UgdGFrZXMgdGhlIG93bmVyc2hpcCBvZiB0aGF0IG9iamVjdC4KLSAgKiBBZGRlZCBTZXRBbGxvY2F0ZWRFeHRlbnNpb24oKSBhbmQgUmVsZWFzZUV4dGVuc2lvbigpIHRvIGV4dGVuc2lvbnMgQVBJLgotICAqIEN1c3RvbSBvcHRpb25zIGFyZSBub3cgZm9ybWF0dGVkIGNvcnJlY3RseSB3aGVuIGRlc2NyaXB0b3JzIGFyZSBwcmludGVkIGluCi0gICAgdGV4dCBmb3JtYXQuCi0gICogVmFyaW91cyBzcGVlZCBvcHRpbWl6YXRpb25zLgotCi0gIEphdmEKLSAgKiBDb21tZW50cyBpbiBwcm90byBmaWxlcyBhcmUgbm93IGNvbGxlY3RlZCBhbmQgcHV0IGludG8gZ2VuZXJhdGVkIGNvZGUgYXMKLSAgICBjb21tZW50cyBmb3IgY29ycmVzcG9uZGluZyBjbGFzc2VzIGFuZCBkYXRhIG1lbWJlcnMuCi0gICogQWRkZWQgUGFyc2VyIHRvIHBhcnNlIGRpcmVjdGx5IGludG8gbWVzc2FnZXMgd2l0aG91dCBhIEJ1aWxkZXIuIEZvcgotICAgIGV4YW1wbGUsCi0gICAgICBGb28gZm9vID0gRm9vLlBBUlNFUi5QYXJzZUZyb20oaW5wdXQpOwotICAgIFVzaW5nIFBhcnNlciBpcyB+MjUlIGZhc3RlciB0aGFuIHVzaW5nIEJ1aWxkZXIgdG8gcGFyc2UgbWVzc2FnZXMuCi0gICogQWRkZWQgZ2V0dGVycy9zZXR0ZXJzIHRvIGFjY2VzcyB0aGUgdW5kZXJseWluZyBCeXRlU3RyaW5nIG9mIGEgc3RyaW5nIGZpZWxkCi0gICAgZGlyZWN0bHkuCi0gICogQnl0ZVN0cmluZyBub3cgc3VwcG9ydHMgbW9yZSBvcGVyYXRpb25zOiBzdWJzdHJpbmcoKSwgcHJlcGVuZCgpLCBhbmQKLSAgICBhcHBlbmQoKS4gVGhlIGltcGxlbWVudGF0aW9uIG9mIEJ5dGVTdHJpbmcgdXNlcyBhIGJpbmFyeSB0cmVlIHN0cnVjdHVyZQotICAgIHRvIHN1cHBvcnQgdGhlc2Ugb3BlcmF0aW9ucyBlZmZpY2llbnRseS4KLSAgKiBOZXcgbWV0aG9kIGZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpIHRoYXQgbGlzdHMgYWxsIG1pc3NpbmcgcmVxdWlyZWQKLSAgICBmaWVsZHMuCi0gICogVmFyaW91cyBjb2RlIHNpemUgYW5kIHNwZWVkIG9wdGltaXphdGlvbnMuCi0KLSAgUHl0aG9uCi0gICogQWRkZWQgc3VwcG9ydCBmb3IgZHluYW1pYyBtZXNzYWdlIGNyZWF0aW9uLiBEZXNjcmlwdG9yRGF0YWJhc2UsCi0gICAgRGVzY3JpcHRvclBvb2wsIGFuZCBNZXNzYWdlRmFjdG9yeSB3b3JrIGxpa2UgdGhlaXIgQysrIGNvdW50ZXJwYXJ0cyB0bwotICAgIHNpbXBsaWZ5IERlc2NyaXB0b3IgY29uc3RydWN0aW9uIGZyb20gKkRlc2NyaXB0b3JQcm90b3MsIGFuZCBNZXNzYWdlRmFjdG9yeQotICAgIHByb3ZpZGVzIGEgbWVzc2FnZSBpbnN0YW5jZSBmcm9tIGEgRGVzY3JpcHRvci4KLSAgKiBBZGRlZCBwaWNrbGUgc3VwcG9ydCBmb3IgcHJvdG9idWYgbWVzc2FnZXMuCi0gICogVW5rbm93biBmaWVsZHMgYXJlIG5vdyBwcmVzZXJ2ZWQgYWZ0ZXIgcGFyc2luZy4KLSAgKiBGaXhlZCBidWcgd2hlcmUgY3VzdG9tIG9wdGlvbnMgd2VyZSBub3QgY29ycmVjdGx5IHBvcHVsYXRlZC4gQ3VzdG9tCi0gICAgb3B0aW9ucyBjYW4gYmUgYWNjZXNzZWQgbm93LgotICAqIEFkZGVkIEVudW1UeXBlV3JhcHBlciB0aGF0IHByb3ZpZGVzIGJldHRlciBhY2Nlc3NpYmlsaXR5IHRvIGVudW0gdHlwZXMuCi0gICogQWRkZWQgUGFyc2VNZXNzYWdlKGRlc2NyaXB0b3IsIGJ5dGVzKSB0byBnZW5lcmF0ZSBhIG5ldyBNZXNzYWdlIGluc3RhbmNlCi0gICAgZnJvbSBhIGRlc2NyaXB0b3IgYW5kIGEgYnl0ZSBzdHJpbmcuCi0KLTIwMTEtMDUtMDEgdmVyc2lvbiAyLjQuMToKLQotICBDKysKLSAgKiBGaXhlZCB0aGUgZnJpZW5kc2hpcCBwcm9ibGVtIGZvciBvbGQgY29tcGlsZXJzIHRvIG1ha2UgdGhlIGxpYnJhcnkgbm93IGdjYyAzCi0gICAgY29tcGF0aWJsZSBhZ2Fpbi4KLSAgKiBGaXhlZCB2Y3Byb2plY3RzL2V4dHJhY3RfaW5jbHVkZXMuYmF0IHRvIGV4dHJhY3QgY29tcGlsZXIvcGx1Z2luLmguCi0KLSAgSmF2YQotICAqIFJlbW92ZWQgdXNhZ2VzIG9mIEpESyAxLjYgb25seSBmZWF0dXJlcyB0byBtYWtlIHRoZSBsaWJyYXJ5IG5vdyBKREsgMS41Ci0gICAgY29tcGF0aWJsZSBhZ2Fpbi4KLSAgKiBGaXhlZCBhIGJ1ZyBhYm91dCBuZWdhdGl2ZSBlbnVtIHZhbHVlcy4KLSAgKiBzZXJpYWxWZXJzaW9uVUlEIGlzIG5vdyBkZWZpbmVkIGluIGdlbmVyYXRlZCBtZXNzYWdlcyBmb3IgamF2YSBzZXJpYWxpemluZy4KLSAgKiBGaXhlZCBwcm90b2MgdG8gdXNlIGphdmEubGFuZy5PYmplY3QsIHdoaWNoIG1ha2VzICJPYmplY3QiIG5vdyBhIHZhbGlkCi0gICAgbWVzc2FnZSBuYW1lIGFnYWluLgotCi0gIFB5dGhvbgotICAqIEV4cGVyaW1lbnRhbCBDKysgaW1wbGVtZW50YXRpb24gbm93IHJlcXVpcmVzIEMrKyBwcm90b2J1ZiBsaWJyYXJ5IGluc3RhbGxlZC4KLSAgICBTZWUgdGhlIFJFQURNRS50eHQgaW4gdGhlIHB5dGhvbiBkaXJlY3RvcnkgZm9yIGRldGFpbHMuCi0KLTIwMTEtMDItMDIgdmVyc2lvbiAyLjQuMDoKLQotICBHZW5lcmFsCi0gICogVGhlIFJQQyAoY2N8amF2YXxweSlfZ2VuZXJpY19zZXJ2aWNlcyBkZWZhdWx0IHZhbHVlIGlzIG5vdyBmYWxzZSBpbnN0ZWFkIG9mCi0gICAgdHJ1ZS4KLSAgKiBDdXN0b20gb3B0aW9ucyBjYW4gaGF2ZSBhZ2dyZWdhdGUgdHlwZXMuIEZvciBleGFtcGxlLAotICAgICAgbWVzc2FnZSBNeU9wdGlvbiB7Ci0gICAgICAgIG9wdGlvbmFsIHN0cmluZyBjb21tZW50ID0gMTsKLSAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGF1dGhvciA9IDI7Ci0gICAgICB9Ci0gICAgICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyB7Ci0gICAgICAgIG9wdGlvbmFsIE15T3B0aW9uIG15b3B0aW9uID0gMTIzNDU7Ci0gICAgICB9Ci0gICAgVGhpcyBvcHRpb24gY2FuIG5vdyBiZSBzZXQgYXMgZm9sbG93czoKLSAgICAgIG1lc3NhZ2UgU29tZVR5cGUgewotICAgICAgICBvcHRpb25hbCBpbnQzMiBmaWVsZCA9IDEgWyhteW9wdGlvbikgPSB7IGNvbW1lbnQ6J3gnIGF1dGhvcjoneScgfV07Ci0gICAgICB9Ci0KLSAgQysrCi0gICogVmFyaW91cyBzcGVlZCBhbmQgY29kZSBzaXplIG9wdGltaXphdGlvbnMuCi0gICogQWRkZWQgYSByZWxlYXNlX2ZvbygpIG1ldGhvZCBvbiBzdHJpbmcgYW5kIG1lc3NhZ2UgZmllbGRzLgotICAqIEZpeGVkIGd6aXBfb3V0cHV0X3N0cmVhbSBzdWItc3RyZWFtIGhhbmRsaW5nLgotCi0gIEphdmEKLSAgKiBCdWlsZGVycyBub3cgbWFpbnRhaW4gc3ViLWJ1aWxkZXJzIGZvciBzdWItbWVzc2FnZXMuIFVzZSBnZXRGb29CdWlsZGVyKCkgdG8KLSAgICBnZXQgdGhlIGJ1aWxkZXIgZm9yIHRoZSBzdWItbWVzc2FnZSAiZm9vIi4gVGhpcyBhbGxvd3MgeW91IHRvIHJlcGVhdGVkbHkKLSAgICBtb2RpZnkgZGVlcGx5LW5lc3RlZCBzdWItbWVzc2FnZXMgd2l0aG91dCByZWJ1aWxkaW5nIHRoZW0uCi0gICogQnVpbGRlci5idWlsZCgpIG5vIGxvbmdlciBpbnZhbGlkYXRlcyB0aGUgQnVpbGRlciBmb3IgZ2VuZXJhdGVkIG1lc3NhZ2VzCi0gICAgKFlvdSBtYXkgY29udGludWUgdG8gbW9kaWZ5IGl0IGFuZCB0aGVuIGJ1aWxkIGFub3RoZXIgbWVzc2FnZSkuCi0gICogQ29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZSBlZmZpY2llbnQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkKLSAgICBpbXBsZW1lbnRhdGlvbnMgaWYgbmV3IG9wdGlvbiBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCBpcyBlbmFibGVkLgotICAgIChPdGhlcndpc2UsIHJlZmxlY3Rpb24tYmFzZWQgaW1wbGVtZW50YXRpb25zIGFyZSB1c2VkLikKLSAgKiBHZW5lcmF0ZWQgbWVzc2FnZXMgbm93IGltcGxlbWVudCBTZXJpYWxpemFibGUuCi0gICogRmllbGRzIHdpdGggW2RlcHJlY2F0ZWQ9dHJ1ZV0gd2lsbCBiZSBtYXJrZWQgd2l0aCBARGVwcmVjYXRlZCBpbiBKYXZhLgotICAqIEFkZGVkIGxhenkgY29udmVyc2lvbiBvZiBVVEYtOCBlbmNvZGVkIHN0cmluZ3MgdG8gU3RyaW5nIG9iamVjdHMgdG8gaW1wcm92ZQotICAgIHBlcmZvcm1hbmNlLgotICAqIFZhcmlvdXMgb3B0aW1pemF0aW9ucy4KLSAgKiBFbnVtIHZhbHVlIGNhbiBiZSBhY2Nlc3NlZCBkaXJlY3RseSwgaW5zdGVhZCBvZiBjYWxsaW5nIGdldE51bWJlcigpIG9uIHRoZQotICAgIGVudW0gbWVtYmVyLgotICAqIEZvciBlYWNoIGVudW0gdmFsdWUsIGFuIGludGVnZXIgY29uc3RhbnQgaXMgYWxzbyBnZW5lcmF0ZWQgd2l0aCB0aGUgc3VmZml4Ci0gICAgX1ZBTFVFLgotCi0gIFB5dGhvbgotICAqIEFkZGVkIGFuIGV4cGVyaW1lbnRhbCAgQysrIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24gbWVzc2FnZXMgdmlhIGEgUHl0aG9uCi0gICAgZXh0ZW5zaW9uLiBJbXBsZW1lbnRhdGlvbiB0eXBlIGlzIGNvbnRyb2xsZWQgYnkgYW4gZW52aXJvbm1lbnQgdmFyaWFibGUKLSAgICBQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTiAodmFsaWQgdmFsdWVzOiAiY3BwIiBhbmQgInB5dGhvbiIpCi0gICAgVGhlIGRlZmF1bHQgdmFsdWUgaXMgY3VycmVudGx5ICJweXRob24iIGJ1dCB3aWxsIGJlIGNoYW5nZWQgdG8gImNwcCIgaW4KLSAgICBmdXR1cmUgcmVsZWFzZS4KLSAgKiBJbXByb3ZlZCBwZXJmb3JtYW5jZSBvbiBtZXNzYWdlIGluc3RhbnRpYXRpb24gc2lnbmlmaWNhbnRseS4KLSAgICBNb3N0IG9mIHRoZSB3b3JrIG9uIG1lc3NhZ2UgaW5zdGFudGlhdGlvbiBpcyBkb25lIGp1c3Qgb25jZSBwZXIgbWVzc2FnZQotICAgIGNsYXNzLCBpbnN0ZWFkIG9mIG9uY2UgcGVyIG1lc3NhZ2UgaW5zdGFuY2UuCi0gICogSW1wcm92ZWQgcGVyZm9ybWFuY2Ugb24gdGV4dCBtZXNzYWdlIHBhcnNpbmcuCi0gICogQWxsb3cgYWRkKCkgdG8gZm9yd2FyZCBrZXl3b3JkIGFyZ3VtZW50cyB0byB0aGUgY29uY3JldGUgY2xhc3MuCi0gICAgICBFLmcuIGluc3RlYWQgb2YKLSAgICAgICAgaXRlbSA9IHJlcGVhdGVkX2ZpZWxkLmFkZCgpCi0gICAgICAgIGl0ZW0uZm9vID0gYmFyCi0gICAgICAgIGl0ZW0uYmF6ID0gcXV1eAotICAgICAgWW91IGNhbiBkbzoKLSAgICAgICAgcmVwZWF0ZWRfZmllbGQuYWRkKGZvbz1iYXIsIGJhej1xdXV4KQotICAqIEFkZGVkIGEgc29ydCgpIGludGVyZmFjZSB0byB0aGUgQmFzZUNvbnRhaW5lci4KLSAgKiBBZGRlZCBhbiBleHRlbmQoKSBtZXRob2QgdG8gcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4KLSAgKiBBZGRlZCBVVEY4IGRlYnVnIHN0cmluZyBzdXBwb3J0LgotCi0yMDEwLTAxLTA4IHZlcnNpb24gMi4zLjA6Ci0KLSAgR2VuZXJhbAotICAqIFBhcnNlcnMgZm9yIHJlcGVhdGVkIG51bWVyaWMgZmllbGRzIG5vdyBhbHdheXMgYWNjZXB0IGJvdGggcGFja2VkIGFuZAotICAgIHVucGFja2VkIGlucHV0LiAgVGhlIFtwYWNrZWQ9dHJ1ZV0gb3B0aW9uIG9ubHkgYWZmZWN0cyBzZXJpYWxpemVycy4KLSAgICBUaGVyZWZvcmUsIGl0IGlzIHBvc3NpYmxlIHRvIHN3aXRjaCBhIGZpZWxkIHRvIHBhY2tlZCBmb3JtYXQgd2l0aG91dAotICAgIGJyZWFraW5nIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IC0tIGFzIGxvbmcgYXMgYWxsIHBhcnRpZXMgYXJlIHVzaW5nCi0gICAgcHJvdG9idWYgMi4zLjAgb3IgYWJvdmUsIGF0IGxlYXN0LgotICAqIFRoZSBnZW5lcmljIFJQQyBzZXJ2aWNlIGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBDKyssIEphdmEsIGFuZCBQeXRob24KLSAgICBnZW5lcmF0b3JzIGNhbiBiZSBkaXNhYmxlZCB2aWEgZmlsZSBvcHRpb25zOgotICAgICAgb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSBmYWxzZTsKLSAgICAgIG9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSBmYWxzZTsKLSAgICAgIG9wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gZmFsc2U7Ci0gICAgVGhpcyBhbGxvd3MgcGx1Z2lucyB0byBnZW5lcmF0ZSBhbHRlcm5hdGl2ZSBjb2RlLCBwb3NzaWJseSBzcGVjaWZpYyB0byBzb21lCi0gICAgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uCi0KLSAgcHJvdG9jCi0gICogTm93IHN1cHBvcnRzIGEgcGx1Z2luIHN5c3RlbSBmb3IgY29kZSBnZW5lcmF0b3JzLiAgUGx1Z2lucyBjYW4gZ2VuZXJhdGUKLSAgICBjb2RlIGZvciBuZXcgbGFuZ3VhZ2VzIG9yIGluamVjdCBhZGRpdGlvbmFsIGNvZGUgaW50byB0aGUgb3V0cHV0IG9mIG90aGVyCi0gICAgY29kZSBnZW5lcmF0b3JzLiAgUGx1Z2lucyBhcmUganVzdCBiaW5hcmllcyB3aGljaCBhY2NlcHQgYSBwcm90b2NvbCBidWZmZXIKLSAgICBvbiBzdGRpbiBhbmQgd3JpdGUgYSBwcm90b2NvbCBidWZmZXIgdG8gc3Rkb3V0LCBzbyB0aGV5IG1heSBiZSB3cml0dGVuIGluCi0gICAgYW55IGxhbmd1YWdlLiAgU2VlIHNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvLgotICAgICoqV0FSTklORyoqOiAgUGx1Z2lucyBhcmUgZXhwZXJpbWVudGFsLiAgVGhlIGludGVyZmFjZSBtYXkgY2hhbmdlIGluIGEKLSAgICBmdXR1cmUgdmVyc2lvbi4KLSAgKiBJZiB0aGUgb3V0cHV0IGxvY2F0aW9uIGVuZHMgaW4gLnppcCBvciAuamFyLCBwcm90b2Mgd2lsbCB3cml0ZSBpdHMgb3V0cHV0Ci0gICAgdG8gYSB6aXAvamFyIGFyY2hpdmUgaW5zdGVhZCBvZiBhIGRpcmVjdG9yeS4gIEZvciBleGFtcGxlOgotICAgICAgcHJvdG9jIC0tamF2YV9vdXQ9bXlwcm90b19zcmNzLmphciAtLXB5dGhvbl9vdXQ9bXlwcm90by56aXAgbXlwcm90by5wcm90bwotICAgIEN1cnJlbnRseSB0aGUgYXJjaGl2ZSBjb250ZW50cyBhcmUgbm90IGNvbXByZXNzZWQsIHRob3VnaCB0aGlzIGNvdWxkIGNoYW5nZQotICAgIGluIHRoZSBmdXR1cmUuCi0gICogaW5mLCAtaW5mLCBhbmQgbmFuIGNhbiBub3cgYmUgdXNlZCBhcyBkZWZhdWx0IHZhbHVlcyBmb3IgZmxvYXQgYW5kIGRvdWJsZQotICAgIGZpZWxkcy4KLQotICBDKysKLSAgKiBWYXJpb3VzIHNwZWVkIGFuZCBjb2RlIHNpemUgb3B0aW1pemF0aW9ucy4KLSAgKiBEeW5hbWljTWVzc2FnZUZhY3RvcnkgaXMgbm93IGZ1bGx5IHRocmVhZC1zYWZlLgotICAqIE1lc3NhZ2U6OlV0ZjhEZWJ1Z1N0cmluZygpIG1ldGhvZCBpcyBsaWtlIERlYnVnU3RyaW5nKCkgYnV0IGF2b2lkcyBlc2NhcGluZwotICAgIFVURi04IGJ5dGVzLgotICAqIENvbXBpbGVkLWluIG1lc3NhZ2UgdHlwZXMgY2FuIG5vdyBjb250YWluIGR5bmFtaWMgZXh0ZW5zaW9ucywgdGhyb3VnaCB1c2UKLSAgICBvZiBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeSgpLgotICAqIE5vdyBjb21waWxlcyBzaGFyZWQgbGlicmFyaWVzIChETExzKSBieSBkZWZhdWx0IG9uIEN5Z3dpbiBhbmQgTWluR1csIHRvCi0gICAgbWF0Y2ggb3RoZXIgcGxhdGZvcm1zLiAgVXNlIC0tZGlzYWJsZS1zaGFyZWQgdG8gYXZvaWQgdGhpcy4KLQotICBKYXZhCi0gICogcGFyc2VEZWxpbWl0ZWRGcm9tKCkgYW5kIG1lcmdlRGVsaW1pdGVkRnJvbSgpIG5vdyBkZXRlY3QgRU9GIGFuZCByZXR1cm4KLSAgICBmYWxzZS9udWxsIGluc3RlYWQgb2YgdGhyb3dpbmcgYW4gZXhjZXB0aW9uLgotICAqIEZpeGVkIHNvbWUgaW5pdGlhbGl6YXRpb24gb3JkZXJpbmcgYnVncy4KLSAgKiBGaXhlcyBmb3IgT3BlbkpESyA3LgotCi0gIFB5dGhvbgotICAqIDEwLTI1IHRpbWVzIGZhc3RlciB0aGFuIDIuMi4wLCBzdGlsbCBwdXJlLVB5dGhvbi4KLSAgKiBDYWxsaW5nIGEgbXV0YXRpbmcgbWV0aG9kIG9uIGEgc3ViLW1lc3NhZ2UgYWx3YXlzIGluc3RhbnRpYXRlcyB0aGUgbWVzc2FnZQotICAgIGluIGl0cyBwYXJlbnQgZXZlbiBpZiB0aGUgbXV0YXRpbmcgbWV0aG9kIGRvZXNuJ3QgYWN0dWFsbHkgbXV0YXRlIGFueXRoaW5nCi0gICAgKGUuZy4gcGFyc2luZyBmcm9tIGFuIGVtcHR5IHN0cmluZykuCi0gICogRXhwYW5kZWQgZGVzY3JpcHRvcnMgYSBiaXQuCi0KLTIwMDktMDgtMTEgdmVyc2lvbiAyLjIuMDoKLQotICBDKysKLSAgKiBMaXRlIG1vZGU6ICBUaGUgIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSIgb3B0aW9uIGNhdXNlcyB0aGUgY29tcGlsZXIKLSAgICB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgZGVwZW5kcyBsaWJwcm90b2J1Zi1saXRlLCB3aGljaCBpcyBtdWNoIHNtYWxsZXIKLSAgICB0aGFuIGxpYnByb3RvYnVmIGJ1dCBsYWNrcyBkZXNjcmlwdG9ycywgcmVmbGVjdGlvbiwgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMuCi0gICogRml4ZWQgYnVnIHdoZXJlIE1lc3NhZ2UuU3dhcChNZXNzYWdlKSB3YXMgb25seSBpbXBsZW1lbnRlZCBmb3IKLSAgICBvcHRpbWl6ZV9mb3Jfc3BlZWQuICBTd2FwIG5vdyBwcm9wZXJseSBpbXBsZW1lbnRlZCBpbiBib3RoIG1vZGVzCi0gICAgKElzc3VlIDkxKS4KLSAgKiBBZGRlZCBSZW1vdmVMYXN0IGFuZCBTd2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpIHRvIFJlZmxlY3Rpb24KLSAgICBpbnRlcmZhY2UgZm9yIHJlcGVhdGVkIGVsZW1lbnRzLgotICAqIEFkZGVkIFN3YXAoTWVzc2FnZSkgdG8gUmVmbGVjdGlvbiBpbnRlcmZhY2UuCi0gICogRmxvYXRpbmctcG9pbnQgbGl0ZXJhbHMgaW4gZ2VuZXJhdGVkIGNvZGUgdGhhdCBhcmUgaW50ZW5kZWQgdG8gYmUKLSAgICBzaW5nbGUtcHJlY2lzaW9uIG5vdyBleHBsaWNpdGx5IGhhdmUgJ2YnIHN1ZmZpeCB0byBhdm9pZCBwZWRhbnRpYyB3YXJuaW5ncwotICAgIHByb2R1Y2VkIGJ5IHNvbWUgY29tcGlsZXJzLgotICAqIFRoZSBbZGVwcmVjYXRlZD10cnVlXSBvcHRpb24gbm93IGNhdXNlcyB0aGUgQysrIGNvZGUgZ2VuZXJhdG9yIHRvIGdlbmVyYXRlCi0gICAgYSBHQ0Mtc3R5bGUgZGVwcmVjYXRpb24gYW5ub3RhdGlvbiAobm8tb3Agb24gb3RoZXIgY29tcGlsZXJzKS4KLSAgKiBnb29nbGU6OnByb3RvYnVmOjpHZXRFbnVtRGVzY3JpcHRvcjxTb21lR2VuZXJhdGVkRW51bVR5cGU+KCkgcmV0dXJucyB0aGUKLSAgICBFbnVtRGVzY3JpcHRvciBmb3IgdGhhdCB0eXBlIC0tIHVzZWZ1bCBmb3IgdGVtcGxhdGVzIHdoaWNoIGNhbm5vdCBjYWxsCi0gICAgU29tZUdlbmVyYXRlZEVudW1UeXBlX2Rlc2NyaXB0b3IoKS4KLSAgKiBWYXJpb3VzIG9wdGltaXphdGlvbnMgYW5kIG9ic2N1cmUgYnVnIGZpeGVzLgotCi0gIEphdmEKLSAgKiBMaXRlIG1vZGU6ICBUaGUgIm9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSIgb3B0aW9uIGNhdXNlcyB0aGUgY29tcGlsZXIKLSAgICB0byBnZW5lcmF0ZSBjb2RlIHdoaWNoIG9ubHkgZGVwZW5kcyBsaWJwcm90b2J1Zi1saXRlLCB3aGljaCBpcyBtdWNoIHNtYWxsZXIKLSAgICB0aGFuIGxpYnByb3RvYnVmIGJ1dCBsYWNrcyBkZXNjcmlwdG9ycywgcmVmbGVjdGlvbiwgYW5kIHNvbWUgb3RoZXIgZmVhdHVyZXMuCi0gICogTG90cyBvZiBzdHlsZSBjbGVhbnVwcy4KLQotICBQeXRob24KLSAgKiBGaXhlZCBlbmRpYW5uZXNzIGJ1ZyB3aXRoIGZsb2F0cyBhbmQgZG91Ymxlcy4KLSAgKiBUZXh0IGZvcm1hdCBwYXJzaW5nIHN1cHBvcnQuCi0gICogRml4IGJ1ZyB3aXRoIHBhcnNpbmcgcGFja2VkIHJlcGVhdGVkIGZpZWxkcyBpbiBlbWJlZGRlZCBtZXNzYWdlcy4KLSAgKiBBYmlsaXR5IHRvIGluaXRpYWxpemUgZmllbGRzIGJ5IHBhc3Npbmcga2V5d29yZCBhcmdzIHRvIGNvbnN0cnVjdG9yLgotICAqIFN1cHBvcnQgaXRlcmF0b3JzIGluIGV4dGVuZCBhbmQgX19zZXRzbGljZV9fIGZvciBjb250YWluZXJzLgotCi0yMDA5LTA1LTEzIHZlcnNpb24gMi4xLjA6Ci0KLSAgR2VuZXJhbAotICAqIFJlcGVhdGVkIGZpZWxkcyBvZiBwcmltaXRpdmUgdHlwZXMgKHR5cGVzIG90aGVyIHRoYXQgc3RyaW5nLCBncm91cCwgYW5kCi0gICAgbmVzdGVkIG1lc3NhZ2VzKSBtYXkgbm93IHVzZSB0aGUgb3B0aW9uIFtwYWNrZWQgPSB0cnVlXSB0byBnZXQgYSBtb3JlCi0gICAgZWZmaWNpZW50IGVuY29kaW5nLiAgSW4gdGhlIG5ldyBlbmNvZGluZywgdGhlIGVudGlyZSBsaXN0IGlzIHdyaXR0ZW4KLSAgICBhcyBhIHNpbmdsZSBieXRlIGJsb2IgdXNpbmcgdGhlICJsZW5ndGgtZGVsaW1pdGVkIiB3aXJlIHR5cGUuICBXaXRoaW4KLSAgICB0aGlzIGJsb2IsIHRoZSBpbmRpdmlkdWFsIHZhbHVlcyBhcmUgZW5jb2RlZCB0aGUgc2FtZSB3YXkgdGhleSB3b3VsZAotICAgIGJlIG5vcm1hbGx5IGV4Y2VwdCB3aXRob3V0IGEgdGFnIGJlZm9yZSBlYWNoIHZhbHVlICh0aHVzLCB0aGV5IGFyZQotICAgIHRpZ2h0bHkgInBhY2tlZCIpLgotICAqIEZvciBlYWNoIGZpZWxkLCB0aGUgZ2VuZXJhdGVkIGNvZGUgY29udGFpbnMgYW4gaW50ZWdlciBjb25zdGFudCBhc3NpZ25lZAotICAgIHRvIHRoZSBmaWVsZCBudW1iZXIuICBGb3IgZXhhbXBsZSwgdGhlIC5wcm90byBmaWxlOgotICAgICAgbWVzc2FnZSBGb28geyBvcHRpb25hbCBpbnQgYmFyX2JheiA9IDEyMzsgfQotICAgIHdvdWxkIGdlbmVyYXRlIHRoZSBmb2xsb3dpbmcgY29uc3RhbnRzLCBhbGwgd2l0aCB0aGUgaW50ZWdlciB2YWx1ZSAxMjM6Ci0gICAgICBDKys6ICAgICBGb286OmtCYXJCYXpGaWVsZE51bWJlcgotICAgICAgSmF2YTogICAgRm9vLkJBUl9CQVpfRklFTERfTlVNQkVSCi0gICAgICBQeXRob246ICBGb28uQkFSX0JBWl9GSUVMRF9OVU1CRVIKLSAgICBDb25zdGFudHMgYXJlIGFsc28gZ2VuZXJhdGVkIGZvciBleHRlbnNpb25zLCB3aXRoIHRoZSBzYW1lIG5hbWluZyBzY2hlbWUuCi0gICAgVGhlc2UgY29uc3RhbnRzIG1heSBiZSB1c2VkIGFzIHN3aXRjaCBjYXNlcy4KLSAgKiBVcGRhdGVkIGJ1bmRsZWQgR29vZ2xlIFRlc3QgdG8gdmVyc2lvbiAxLjMuMC4gIEdvb2dsZSBUZXN0IGlzIG5vdyBidW5kbGVkCi0gICAgaW4gaXRzIHZlcmJhdGltIGZvcm0gYXMgYSBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28geW91IGNhbiBkcm9wIGluIGFueQotICAgIG90aGVyIHZlcnNpb24gb2YgR29vZ2xlIFRlc3QgaWYgbmVlZGVkLgotICAqIG9wdGltaXplX2ZvciA9IFNQRUVEIGlzIG5vdyB0aGUgZGVmYXVsdCwgYnkgcG9wdWxhciBkZW1hbmQuICBVc2UKLSAgICBvcHRpbWl6ZV9mb3IgPSBDT0RFX1NJWkUgaWYgY29kZSBzaXplIGlzIG1vcmUgaW1wb3J0YW50IGluIHlvdXIgYXBwLgotICAqIEl0IGlzIG5vdyBhbiBlcnJvciB0byBkZWZpbmUgYSBkZWZhdWx0IHZhbHVlIGZvciBhIHJlcGVhdGVkIGZpZWxkLgotICAgIFByZXZpb3VzbHksIHRoaXMgd2FzIHNpbGVudGx5IGlnbm9yZWQgKGl0IGhhZCBubyBlZmZlY3Qgb24gdGhlIGdlbmVyYXRlZAotICAgIGNvZGUpLgotICAqIEZpZWxkcyBjYW4gbm93IGJlIG1hcmtlZCBkZXByZWNhdGVkIGxpa2U6Ci0gICAgICBvcHRpb25hbCBpbnQzMiBmb28gPSAxIFtkZXByZWNhdGVkID0gdHJ1ZV07Ci0gICAgQ3VycmVudGx5IHRoaXMgZG9lcyBub3QgaGF2ZSBhbnkgYWN0dWFsIGVmZmVjdCwgYnV0IGluIHRoZSBmdXR1cmUgdGhlIGNvZGUKLSAgICBnZW5lcmF0b3JzIG1heSBnZW5lcmF0ZSBkZXByZWNhdGlvbiBhbm5vdGF0aW9ucyBpbiBlYWNoIGxhbmd1YWdlLgotICAqIENyb3NzLWNvbXBpbGluZyBzaG91bGQgbm93IGJlIHBvc3NpYmxlIHVzaW5nIHRoZSAtLXdpdGgtcHJvdG9jIG9wdGlvbiB0bwotICAgIGNvbmZpZ3VyZS4gIFNlZSBSRUFETUUudHh0IGZvciBtb3JlIGluZm8uCi0KLSAgcHJvdG9jCi0gICogLS1lcnJvcl9mb3JtYXQ9bXN2cyBvcHRpb24gY2F1c2VzIGVycm9ycyB0byBiZSBwcmludGVkIGluIFZpc3VhbCBTdHVkaW8KLSAgICBmb3JtYXQsIHdoaWNoIHNob3VsZCBhbGxvdyB0aGVtIHRvIGJlIGNsaWNrZWQgb24gaW4gdGhlIGJ1aWxkIGxvZyB0byBnbwotICAgIGRpcmVjdGx5IHRvIHRoZSBlcnJvciBsb2NhdGlvbi4KLSAgKiBUaGUgdHlwZSBuYW1lIHJlc29sdmVyIHdpbGwgbm8gbG9uZ2VyIHJlc29sdmUgdHlwZSBuYW1lcyB0byBmaWVsZHMuICBGb3IKLSAgICBleGFtcGxlLCB0aGlzIG5vdyB3b3JrczoKLSAgICAgIG1lc3NhZ2UgRm9vIHt9Ci0gICAgICBtZXNzYWdlIEJhciB7Ci0gICAgICAgIG9wdGlvbmFsIGludDMyIEZvbyA9IDE7Ci0gICAgICAgIG9wdGlvbmFsIEZvbyBiYXogPSAyOwotICAgICAgfQotICAgIFByZXZpb3VzbHksIHRoZSB0eXBlIG9mICJiYXoiIHdvdWxkIHJlc29sdmUgdG8gIkJhci5Gb28iLCBhbmQgeW91J2QgZ2V0Ci0gICAgYW4gZXJyb3IgYmVjYXVzZSBCYXIuRm9vIGlzIGEgZmllbGQsIG5vdCBhIHR5cGUuICBOb3cgdGhlIHR5cGUgb2YgImJheiIKLSAgICByZXNvbHZlcyB0byB0aGUgbWVzc2FnZSB0eXBlIEZvby4gIFRoaXMgY2hhbmdlIGlzIHVubGlrZWx5IHRvIG1ha2UgYQotICAgIGRpZmZlcmVuY2UgdG8gYW55b25lIHdobyBmb2xsb3dzIHRoZSBQcm90b2NvbCBCdWZmZXJzIHN0eWxlIGd1aWRlLgotCi0gIEMrKwotICAqIFNldmVyYWwgb3B0aW1pemF0aW9ucywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0bzoKLSAgICAtIFNlcmlhbGl6YXRpb24sIGVzcGVjaWFsbHkgdG8gZmxhdCBhcnJheXMsIGlzIDEwJS01MCUgZmFzdGVyLCBwb3NzaWJseQotICAgICAgbW9yZSBmb3Igc21hbGwgb2JqZWN0cy4KLSAgICAtIFNldmVyYWwgZGVzY3JpcHRvciBvcGVyYXRpb25zIHdoaWNoIHByZXZpb3VzbHkgcmVxdWlyZWQgbG9ja2luZyBubyBsb25nZXIKLSAgICAgIGRvLgotICAgIC0gRGVzY3JpcHRvcnMgYXJlIG5vdyBjb25zdHJ1Y3RlZCBsYXppbHkgb24gZmlyc3QgdXNlLCByYXRoZXIgdGhhbiBhdAotICAgICAgcHJvY2VzcyBzdGFydHVwIHRpbWUuICBUaGlzIHNob3VsZCBzYXZlIG1lbW9yeSBpbiBwcm9ncmFtcyB3aGljaCBkbyBub3QKLSAgICAgIHVzZSBkZXNjcmlwdG9ycyBvciByZWZsZWN0aW9uLgotICAgIC0gVW5rbm93bkZpZWxkU2V0IGNvbXBsZXRlbHkgcmVkZXNpZ25lZCB0byBiZSBtb3JlIGVmZmljaWVudCAoZXNwZWNpYWxseSBpbgotICAgICAgdGVybXMgb2YgbWVtb3J5IHVzYWdlKS4KLSAgICAtIFZhcmlvdXMgb3B0aW1pemF0aW9ucyB0byByZWR1Y2UgY29kZSBzaXplICh0aG91Z2ggdGhlIHNlcmlhbGl6YXRpb24gc3BlZWQKLSAgICAgIG9wdGltaXphdGlvbnMgaW5jcmVhc2VkIGNvZGUgc2l6ZSkuCi0gICogTWVzc2FnZSBpbnRlcmZhY2UgaGFzIG1ldGhvZCBQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oKSB3aGljaCBwYXJzZXMKLSAgICBhIGxpbWl0ZWQgbnVtYmVyIG9mIGJ5dGVzIGZyb20gYW4gaW5wdXQgc3RyZWFtIHJhdGhlciB0aGFuIHBhcnNpbmcgdW50aWwKLSAgICBFT0YuCi0gICogR3ppcElucHV0U3RyZWFtIGFuZCBHemlwT3V0cHV0U3RyZWFtIHN1cHBvcnQgcmVhZGluZy93cml0aW5nIGd6aXAtIG9yCi0gICAgemxpYi1jb21wcmVzc2VkIHN0cmVhbXMgaWYgemxpYiBpcyBhdmFpbGFibGUuCi0gICAgKGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oKQotICAqIERlc2NyaXB0b3JQb29sOjpGaW5kQWxsRXh0ZW5zaW9ucygpIGFuZCBjb3JyZXNwb25kaW5nCi0gICAgRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kQWxsRXh0ZW5zaW9ucygpIGNhbiBiZSB1c2VkIHRvIGVudW1lcmF0ZSBhbGwKLSAgICBleHRlbnNpb25zIG9mIGEgZ2l2ZW4gdHlwZS4KLSAgKiBGb3IgZWFjaCBlbnVtIHR5cGUgRm9vLCBwcm90b2Mgd2lsbCBnZW5lcmF0ZSBmdW5jdGlvbnM6Ci0gICAgICBjb25zdCBzdHJpbmcmIEZvb19OYW1lKEZvbyB2YWx1ZSk7Ci0gICAgICBib29sIEZvb19QYXJzZShjb25zdCBzdHJpbmcmIG5hbWUsIEZvbyogcmVzdWx0KTsKLSAgICBUaGUgZm9ybWVyIHJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW0gY29uc3RhbnQgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLSAgICB2YWx1ZSB3aGlsZSB0aGUgbGF0dGVyIGZpbmRzIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIGEgbmFtZS4KLSAgKiBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIG5vdyBoYXZlIGJhY2staW5zZXJ0aW9uIGl0ZXJhdG9ycy4KLSAgKiBTdHJpbmcgZmllbGRzIG5vdyBoYXZlIHNldHRlcnMgdGhhdCB0YWtlIGEgY2hhciogYW5kIGEgc2l6ZSwgaW4gYWRkaXRpb24KLSAgICB0byB0aGUgZXhpc3Rpbmcgb25lcyB0aGF0IHRvb2sgY2hhciogb3IgY29uc3Qgc3RyaW5nJi4KLSAgKiBEZXNjcmlwdG9yUG9vbDo6QWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgbWF5IGJlIHVzZWQgdG8gdGVsbAotICAgIERlc2NyaXB0b3JQb29sIHRvIGNyZWF0ZSBwbGFjZWhvbGRlciBkZXNjcmlwdG9ycyBmb3IgdW5rbm93biBlbnRpdGllcwotICAgIHJlZmVyZW5jZWQgaW4gYSBGaWxlRGVzY3JpcHRvclByb3RvLiAgVGhpcyBjYW4gYWxsb3cgeW91IHRvIHBhcnNlIGEgLnByb3RvCi0gICAgZmlsZSB3aXRob3V0IGhhdmluZyBhY2Nlc3MgdG8gb3RoZXIgLnByb3RvIGZpbGVzIHRoYXQgaXQgaW1wb3J0cywgZm9yCi0gICAgZXhhbXBsZS4KLSAgKiBVcGRhdGVkIGd0ZXN0IHRvIGxhdGVzdCB2ZXJzaW9uLiAgVGhlIGd0ZXN0IHBhY2thZ2UgaXMgbm93IGluY2x1ZGVkIGFzIGEKLSAgICBuZXN0ZWQgYXV0b2NvbmYgcGFja2FnZSwgc28gaXQgc2hvdWxkIGJlIGFibGUgdG8gZHJvcCBuZXcgdmVyc2lvbnMgaW50byB0aGUKLSAgICAiZ3Rlc3QiIHN1YmRpcmVjdG9yeSB3aXRob3V0IG1vZGlmaWNhdGlvbi4KLQotICBKYXZhCi0gICogRml4ZWQgYnVnIHdoZXJlIE1lc3NhZ2UubWVyZ2VGcm9tKE1lc3NhZ2UpIGZhaWxlZCB0byBtZXJnZSBleHRlbnNpb25zLgotICAqIE1lc3NhZ2UgaW50ZXJmYWNlIGhhcyBuZXcgbWV0aG9kIHRvQnVpbGRlcigpIHdoaWNoIGlzIGVxdWl2YWxlbnQgdG8KLSAgICBuZXdCdWlsZGVyRm9yVHlwZSgpLm1lcmdlRnJvbSh0aGlzKS4KLSAgKiBBbGwgZW51bXMgbm93IGltcGxlbWVudCB0aGUgUHJvdG9jb2xNZXNzYWdlRW51bSBpbnRlcmZhY2UuCi0gICogU2V0dGluZyBhIGZpZWxkIHRvIG51bGwgbm93IHRocm93cyBOdWxsUG9pbnRlckV4Y2VwdGlvbi4KLSAgKiBGaXhlZCB0ZW5kZW5jeSBmb3IgVGV4dEZvcm1hdCdzIHBhcnNpbmcgdG8gb3ZlcmZsb3cgdGhlIHN0YWNrIHdoZW4KLSAgICBwYXJzaW5nIGxhcmdlIHN0cmluZyB2YWx1ZXMuICBUaGUgdW5kZXJseWluZyBwcm9ibGVtIGlzIHdpdGggSmF2YSdzCi0gICAgcmVnZXggaW1wbGVtZW50YXRpb24gKHdoaWNoIHVuZm9ydHVuYXRlbHkgdXNlcyByZWN1cnNpdmUgYmFja3RyYWNraW5nCi0gICAgcmF0aGVyIHRoYW4gYnVpbGRpbmcgYW4gTkZBKS4gIFdvcmtlZCBhcm91bmQgYnkgbWFraW5nIHVzZSBvZiBwb3NzZXNzaXZlCi0gICAgcXVhbnRpZmllcnMuCi0gICogR2VuZXJhdGVkIHNlcnZpY2UgY2xhc3NlcyBub3cgYWxzbyBnZW5lcmF0ZSBwdXJlIGludGVyZmFjZXMuICBGb3IgYSBzZXJ2aWNlCi0gICAgRm9vLCBGb28uSW50ZXJmYWNlIGlzIGEgcHVyZSBpbnRlcmZhY2UgY29udGFpbmluZyBhbGwgb2YgdGhlIHNlcnZpY2UncwotICAgIGRlZmluZWQgbWV0aG9kcy4gIEZvby5uZXdSZWZsZWN0aXZlU2VydmljZSgpIGNhbiBiZSBjYWxsZWQgdG8gd3JhcCBhbgotICAgIGluc3RhbmNlIG9mIHRoaXMgaW50ZXJmYWNlIGluIGEgY2xhc3MgdGhhdCBpbXBsZW1lbnRzIHRoZSBnZW5lcmljCi0gICAgUnBjU2VydmljZSBpbnRlcmZhY2UsIHdoaWNoIHByb3ZpZGVzIHJlZmxlY3Rpb24gc3VwcG9ydCB0aGF0IGlzIHVzdWFsbHkKLSAgICBuZWVkZWQgYnkgUlBDIHNlcnZlciBpbXBsZW1lbnRhdGlvbnMuCi0gICogUlBDIGludGVyZmFjZXMgbm93IHN1cHBvcnQgYmxvY2tpbmcgb3BlcmF0aW9uIGluIGFkZGl0aW9uIHRvIG5vbi1ibG9ja2luZy4KLSAgICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgZ2VuZXJhdGVzIHNlcGFyYXRlIGJsb2NraW5nIGFuZCBub24tYmxvY2tpbmcgc3R1YnMKLSAgICB3aGljaCBvcGVyYXRlIGFnYWluc3Qgc2VwYXJhdGUgYmxvY2tpbmcgYW5kIG5vbi1ibG9ja2luZyBSUEMgaW50ZXJmYWNlcy4KLSAgICBSUEMgaW1wbGVtZW50YXRpb25zIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2VzIGluIG9yZGVyIHRvCi0gICAgc3VwcG9ydCBibG9ja2luZyBtb2RlLgotICAqIE5ldyBJL08gbWV0aG9kcyBwYXJzZURlbGltaXRlZEZyb20oKSwgbWVyZ2VEZWxpbWl0ZWRGcm9tKCksIGFuZAotICAgIHdyaXRlRGVsaW1pdGVkVG8oKSByZWFkIGFuZCB3cml0ZSAiZGVsaW1pdGVkIiBtZXNzYWdlcyBmcm9tL3RvIGEgc3RyZWFtLAotICAgIG1lYW5pbmcgdGhhdCB0aGUgbWVzc2FnZSBzaXplIHByZWNlZGVzIHRoZSBkYXRhLiAgVGhpcyB3YXksIHlvdSBjYW4gd3JpdGUKLSAgICBtdWx0aXBsZSBtZXNzYWdlcyB0byBhIHN0cmVhbSB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCBkZWxpbWl0aW5nCi0gICAgdGhlbSB5b3Vyc2VsZi4KLSAgKiBUaHJvdyBhIG1vcmUgZGVzY3JpcHRpdmUgZXhjZXB0aW9uIHdoZW4gYnVpbGQoKSBpcyBkb3VibGUtY2FsbGVkLgotICAqIEFkZCBhIG1ldGhvZCB0byBxdWVyeSB3aGV0aGVyIENvZGVkSW5wdXRTdHJlYW0gaXMgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQKLSAgICBzdHJlYW0uCi0gICogQWRkIGEgbWV0aG9kIHRvIHJlc2V0IGEgQ29kZWRJbnB1dFN0cmVhbSdzIHNpemUgY291bnRlcjsgdXNlZnVsIHdoZW4KLSAgICByZWFkaW5nIG1hbnkgbWVzc2FnZXMgd2l0aCB0aGUgc2FtZSBzdHJlYW0uCi0gICogZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkgbm93IGFjY291bnQgZm9yIHVua25vd24gZmllbGRzLgotCi0gIFB5dGhvbgotICAqIEFkZGVkIHNsaWNpbmcgc3VwcG9ydCBmb3IgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcy4gQWRkZWQgc2xpY2UgcmV0cmlldmFsIGFuZAotICAgIHJlbW92YWwgb2YgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4KLSAgKiBVcGRhdGVkIFJQQyBpbnRlcmZhY2VzIHRvIGFsbG93IGZvciBibG9ja2luZyBvcGVyYXRpb24uICBBIGNsaWVudCBtYXkKLSAgICBub3cgcGFzcyBOb25lIGZvciBhIGNhbGxiYWNrIHdoZW4gbWFraW5nIGFuIFJQQywgaW4gd2hpY2ggY2FzZSB0aGUKLSAgICBjYWxsIHdpbGwgYmxvY2sgdW50aWwgdGhlIHJlc3BvbnNlIGlzIHJlY2VpdmVkLCBhbmQgdGhlIHJlc3BvbnNlCi0gICAgb2JqZWN0IHdpbGwgYmUgcmV0dXJuZWQgZGlyZWN0bHkgdG8gdGhlIGNhbGxlci4gIFRoaXMgaW50ZXJmYWNlIGNoYW5nZQotICAgIGNhbm5vdCBiZSB1c2VkIGluIHByYWN0aWNlIHVudGlsIFJQQyBpbXBsZW1lbnRhdGlvbnMgYXJlIHVwZGF0ZWQgdG8KLSAgICBpbXBsZW1lbnQgaXQuCi0gICogQ2hhbmdlcyB0byBpbnB1dF9zdHJlYW0ucHkgc2hvdWxkIG1ha2UgcHJvdG9idWYgY29tcGF0aWJsZSB3aXRoIGFwcGVuZ2luZS4KLQotMjAwOC0xMS0yNSB2ZXJzaW9uIDIuMC4zOgotCi0gIHByb3RvYwotICAqIEVudW0gdmFsdWVzIG1heSBub3cgaGF2ZSBjdXN0b20gb3B0aW9ucywgdXNpbmcgc3ludGF4IHNpbWlsYXIgdG8gZmllbGQKLSAgICBvcHRpb25zLgotICAqIEZpeGVkIGJ1ZyB3aGVyZSAucHJvdG8gZmlsZXMgd2hpY2ggdXNlIGN1c3RvbSBvcHRpb25zIGJ1dCBkb24ndCBhY3R1YWxseQotICAgIGRlZmluZSB0aGVtIChpLmUuIHRoZXkgaW1wb3J0IGFub3RoZXIgLnByb3RvIGZpbGUgZGVmaW5pbmcgdGhlIG9wdGlvbnMpCi0gICAgaGFkIHRvIGV4cGxpY2l0bHkgaW1wb3J0IGRlc2NyaXB0b3IucHJvdG8uCi0gICogQWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzIGluIC5wcm90byBmaWxlcyB3aWxsIG5vdyBiZSBjb25jYXRlbmF0ZWQsIGxpa2UgaW4KLSAgICBDLgotICAqIElmIGFuIGlucHV0IGZpbGUgaXMgYSBXaW5kb3dzIGFic29sdXRlIHBhdGggKGUuZy4gIkM6XGZvb1xiYXIucHJvdG8iKSBhbmQKLSAgICB0aGUgaW1wb3J0IHBhdGggb25seSBjb250YWlucyAiLiIgKG9yIGNvbnRhaW5zICIuIiBidXQgZG9lcyBub3QgY29udGFpbgotICAgIHRoZSBmaWxlKSwgcHJvdG9jIGluY29ycmVjdGx5IHRob3VnaHQgdGhhdCB0aGUgZmlsZSB3YXMgdW5kZXIgIi4iLCBiZWNhdXNlCi0gICAgaXQgdGhvdWdodCB0aGF0IHRoZSBwYXRoIHdhcyByZWxhdGl2ZSAoc2luY2UgaXQgZGlkbid0IHN0YXJ0IHdpdGggYSBzbGFzaCkuCi0gICAgVGhpcyBoYXMgYmVlbiBmaXhlZC4KLQotICBDKysKLSAgKiBHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIG5vdyBoYXZlIGEgU3dhcCgpIG1ldGhvZCB3aGljaCBlZmZpY2llbnRseSBzd2FwcwotICAgIHRoZSBjb250ZW50cyBvZiB0d28gb2JqZWN0cy4KLSAgKiBBbGwgbWVzc2FnZSBjbGFzc2VzIG5vdyBoYXZlIGEgU3BhY2VVc2VkKCkgbWV0aG9kIHdoaWNoIHJldHVybnMgYW4gZXN0aW1hdGUKLSAgICBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIG9mIGFsbG9jYXRlZCBtZW1vcnkgY3VycmVudGx5IG93bmVkIGJ5IHRoZSBvYmplY3QuCi0gICAgVGhpcyBpcyBwYXJ0aWN1bGFybHkgdXNlZnVsIHdoZW4geW91IGFyZSByZXVzaW5nIGEgc2luZ2xlIG1lc3NhZ2Ugb2JqZWN0Ci0gICAgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBidXQgd2FudCB0byBtYWtlIHN1cmUgaXQgZG9lc24ndCBibG9hdCB1cCB0b28gbGFyZ2UuCi0gICogTmV3IG1ldGhvZCBNZXNzYWdlOjpTZXJpYWxpemVBc1N0cmluZygpIHJldHVybnMgYSBzdHJpbmcgY29udGFpbmluZyB0aGUKLSAgICBzZXJpYWxpemVkIGRhdGEuICBNYXkgYmUgbW9yZSBjb252ZW5pZW50IHRoYW4gY2FsbGluZwotICAgIFNlcmlhbGl6ZVRvU3RyaW5nKHN0cmluZyopLgotICAqIEluIGRlYnVnIG1vZGUsIGxvZyBlcnJvciBtZXNzYWdlcyB3aGVuIHN0cmluZy10eXBlIGZpZWxkcyBhcmUgZm91bmQgdG8KLSAgICBjb250YWluIGJ5dGVzIHRoYXQgYXJlIG5vdCB2YWxpZCBVVEYtOC4KLSAgKiBGaXhlZCBidWcgd2hlcmUgYSBtZXNzYWdlIHdpdGggbXVsdGlwbGUgZXh0ZW5zaW9uIHJhbmdlcyBjb3VsZG4ndCBwYXJzZQotICAgIGV4dGVuc2lvbnMuCi0gICogRml4ZWQgYnVnIHdoZXJlIE1lcmdlRnJvbShjb25zdCBNZXNzYWdlJikgZGlkbid0IGRvIGFueXRoaW5nIGlmIGludm9rZWQgb24KLSAgICBhIG1lc3NhZ2UgdGhhdCBjb250YWluZWQgbm8gZmllbGRzIChidXQgcG9zc2libHkgY29udGFpbmVkIGV4dGVuc2lvbnMpLgotICAqIEZpeGVkIFNob3J0RGVidWdTdHJpbmcoKSB0byBub3QgYmUgTyhuXjIpLiAgRHVyci4KLSAgKiBGaXhlZCBjcmFzaCBpbiBUZXh0Rm9ybWF0IHBhcnNpbmcgaWYgdGhlIGZpcnN0IHRva2VuIGluIHRoZSBpbnB1dCBjYXVzZWQgYQotICAgIHRva2VuaXphdGlvbiBlcnJvci4KLSAgKiBGaXhlZCBvYnNjdXJlIGJ1Z3MgaW4gemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjLgotICAqIEFkZGVkIHN1cHBvcnQgZm9yIEhQIEMrKyBvbiBUcnU2NC4KLSAgKiBPbmx5IGJ1aWxkIHRlc3RzIG9uICJtYWtlIGNoZWNrIiwgbm90ICJtYWtlIi4KLSAgKiBGaXhlZCBhbGlnbm1lbnQgaXNzdWUgdGhhdCBjYXVzZWQgY3Jhc2hlcyB3aGVuIHVzaW5nIER5bmFtaWNNZXNzYWdlIG9uCi0gICAgNjQtYml0IFNwYXJjIG1hY2hpbmVzLgotICAqIFNpbXBsaWZ5IHRlbXBsYXRlIHVzYWdlIHRvIHdvcmsgd2l0aCBNU1ZDIDIwMDMuCi0gICogV29yayBhcm91bmQgR0NDIDQuMy54IHg4Nl82NCBjb21waWxlciBidWcgdGhhdCBjYXVzZWQgY3Jhc2hlcyBvbiBzdGFydHVwLgotICAgIChUaGlzIGFmZmVjdGVkIEZlZG9yYSA5IGluIHBhcnRpY3VsYXIuKQotICAqIE5vdyB3b3JrcyBvbiAiU29sYXJpcyAxMCB1c2luZyByZWNlbnQgU3VuIFN0dWRpbyIuCi0KLSAgSmF2YQotICAqIE5ldyBvdmVybG9hZCBvZiBtZXJnZUZyb20oKSB3aGljaCBwYXJzZXMgYSBzbGljZSBvZiBhIGJ5dGUgYXJyYXkgaW5zdGVhZAotICAgIG9mIHRoZSB3aG9sZSB0aGluZy4KLSAgKiBOZXcgbWV0aG9kIEJ5dGVTdHJpbmcuYXNSZWFkT25seUJ5dGVCdWZmZXIoKSBkb2VzIHdoYXQgaXQgc291bmRzIGxpa2UuCi0gICogSW1wcm92ZWQgcGVyZm9ybWFuY2Ugb2YgaXNJbml0aWFsaXplZCgpIHdoZW4gb3B0aW1pemluZyBmb3IgY29kZSBzaXplLgotCi0gIFB5dGhvbgotICAqIENvcnJlY3RlZCBMaXN0RmllbGRzKCkgc2lnbmF0dXJlIGluIE1lc3NhZ2UgYmFzZSBjbGFzcyB0byBtYXRjaCB3aGF0Ci0gICAgc3ViY2xhc3NlcyBhY3R1YWxseSBpbXBsZW1lbnQuCi0gICogU29tZSBtaW5vciByZWZhY3RvcmluZy4KLSAgKiBEb24ndCBwYXNzIHNlbGYgYXMgZmlyc3QgYXJndW1lbnQgdG8gc3VwZXJjbGFzcyBjb25zdHJ1Y3RvciAobm8gbG9uZ2VyCi0gICAgYWxsb3dlZCBpbiBQeXRob24gMi42KS4KLQotMjAwOC0wOS0yOSB2ZXJzaW9uIDIuMC4yOgotCi0gIEdlbmVyYWwKLSAgKiBMaWNlbnNlIGNoYW5nZWQgZnJvbSBBcGFjaGUgMi4wIHRvIE5ldyBCU0QuCi0gICogSXQgaXMgbm93IHBvc3NpYmxlIHRvIGRlZmluZSBjdXN0b20gIm9wdGlvbnMiLCB3aGljaCBhcmUgYmFzaWNhbGx5Ci0gICAgYW5ub3RhdGlvbnMgd2hpY2ggbWF5IGJlIHBsYWNlZCBvbiBkZWZpbml0aW9ucyBpbiBhIC5wcm90byBmaWxlLgotICAgIEZvciBleGFtcGxlLCB5b3UgbWlnaHQgZGVmaW5lIGEgZmllbGQgb3B0aW9uIGNhbGxlZCAiZm9vIiBsaWtlIHNvOgotICAgICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIKLSAgICAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsKLSAgICAgICAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDEyMzQ1OwotICAgICAgfQotICAgIFRoZW4geW91IGFubm90YXRlIGEgZmllbGQgdXNpbmcgdGhlICJmb28iIG9wdGlvbjoKLSAgICAgIG1lc3NhZ2UgTXlNZXNzYWdlIHsKLSAgICAgICAgb3B0aW9uYWwgaW50MzIgc29tZV9maWVsZCA9IDEgWyhmb28pID0gImJhciJdCi0gICAgICB9Ci0gICAgVGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uIGlzIHRoZW4gdmlzaWJsZSB2aWEgdGhlIG1lc3NhZ2UncwotICAgIERlc2NyaXB0b3I6Ci0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KLSAgICAgICAgTXlNZXNzYWdlOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgic29tZV9maWVsZCIpOwotICAgICAgYXNzZXJ0KGZpZWxkLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKGZvbykgPT0gImJhciIpOwotICAgIFRoaXMgZmVhdHVyZSBoYXMgYmVlbiBpbXBsZW1lbnRlZCBhbmQgdGVzdGVkIGluIEMrKyBhbmQgSmF2YS4KLSAgICBPdGhlciBsYW5ndWFnZXMgbWF5IG9yIG1heSBub3QgbmVlZCB0byBkbyBleHRyYSB3b3JrIHRvIHN1cHBvcnQKLSAgICBjdXN0b20gb3B0aW9ucywgZGVwZW5kaW5nIG9uIGhvdyB0aGV5IGNvbnN0cnVjdCBkZXNjcmlwdG9ycy4KLQotICBDKysKLSAgKiBGaXhlZCBzb21lIEdDQyB3YXJuaW5ncyB0aGF0IG9ubHkgb2NjdXIgd2hlbiB1c2luZyAtcGVkYW50aWMuCi0gICogSW1wcm92ZWQgc3RhdGljIGluaXRpYWxpemF0aW9uIGNvZGUsIG1ha2luZyBvcmRlcmluZyBtb3JlCi0gICAgcHJlZGljdGFibGUgYW1vbmcgb3RoZXIgdGhpbmdzLgotICAqIFRleHRGb3JtYXQgd2lsbCBubyBsb25nZXIgYWNjZXB0IG1lc3NhZ2VzIHdoaWNoIGNvbnRhaW4gbXVsdGlwbGUKLSAgICBpbnN0YW5jZXMgb2YgYSBzaW5ndWxhciBmaWVsZC4gIFByZXZpb3VzbHksIHRoZSBsYXR0ZXIgaW5zdGFuY2UKLSAgICB3b3VsZCBvdmVyd3JpdGUgdGhlIGZvcm1lci4KLSAgKiBOb3cgd29ya3Mgb24gc3lzdGVtcyB0aGF0IGRvbid0IGhhdmUgaGFzaF9tYXAuCi0KLSAgSmF2YQotICAqIFByaW50IEBPdmVycmlkZSBhbm5vdGF0aW9uIGluIGdlbmVyYXRlZCBjb2RlIHdoZXJlIGFwcHJvcHJpYXRlLgotCi0gIFB5dGhvbgotICAqIFN0cmluZ3Mgbm93IHVzZSB0aGUgInVuaWNvZGUiIHR5cGUgcmF0aGVyIHRoYW4gdGhlICJzdHIiIHR5cGUuCi0gICAgU3RyaW5nIGZpZWxkcyBtYXkgc3RpbGwgYmUgYXNzaWduZWQgQVNDSUkgInN0ciIgdmFsdWVzOyB0aGV5IHdpbGwKLSAgICBhdXRvbWF0aWNhbGx5IGJlIGNvbnZlcnRlZC4KLSAgKiBBZGRpbmcgYSBwcm9wZXJ0eSB0byBhbiBvYmplY3QgcmVwcmVzZW50aW5nIGEgcmVwZWF0ZWQgZmllbGQgbm93Ci0gICAgcmFpc2VzIGFuIGV4Y2VwdGlvbi4gIEZvciBleGFtcGxlOgotICAgICAgIyBObyBsb25nZXIgd29ya3MgKGFuZCBuZXZlciBzaG91bGQgaGF2ZSkuCi0gICAgICBtZXNzYWdlLnNvbWVfcmVwZWF0ZWRfZmllbGQuZm9vID0gMQotCi0gIFdpbmRvd3MKLSAgKiBXZSBub3cgYnVpbGQgc3RhdGljIGxpYnJhcmllcyByYXRoZXIgdGhhbiBETExzIGJ5IGRlZmF1bHQgb24gTVNWQy4KLSAgICBTZWUgdnNwcm9qZWN0cy9yZWFkbWUudHh0IGZvciBtb3JlIGluZm9ybWF0aW9uLgotCi0yMDA4LTA4LTE1IHZlcnNpb24gMi4wLjE6Ci0KLSAgcHJvdG9jCi0gICogTmV3IGZsYWdzIC0tZW5jb2RlIGFuZCAtLWRlY29kZSBjYW4gYmUgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gcHJvdG9idWYgdGV4dAotICAgIGZvcm1hdCBhbmQgYmluYXJ5IGZvcm1hdCBmcm9tIHRoZSBjb21tYW5kLWxpbmUuCi0gICogTmV3IGZsYWcgLS1kZXNjcmlwdG9yX3NldF9vdXQgY2FuIGJlIHVzZWQgdG8gd3JpdGUgRmlsZURlc2NyaXB0b3JQcm90b3MgZm9yCi0gICAgYWxsIHBhcnNlZCBmaWxlcyBkaXJlY3RseSBpbnRvIGEgc2luZ2xlIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBwYXJ0aWN1bGFybHkKLSAgICB1c2VmdWwgaWYgeW91IHdpc2ggdG8gcGFyc2UgLnByb3RvIGZpbGVzIGZyb20gcHJvZ3JhbXMgd3JpdHRlbiBpbiBsYW5ndWFnZXMKLSAgICBvdGhlciB0aGFuIEMrKzoganVzdCBydW4gcHJvdG9jIGFzIGEgYmFja2dyb3VuZCBwcm9jZXNzIGFuZCBoYXZlIGl0IG91dHB1dAotICAgIGEgRmlsZURlc2NyaXB0b3JMaXN0LCB0aGVuIHBhcnNlIHRoYXQgbmF0aXZlbHkuCi0gICogSW1wcm92ZWQgZXJyb3IgbWVzc2FnZSB3aGVuIGFuIGVudW0gdmFsdWUncyBuYW1lIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIKLSAgICBzeW1ib2wgZGVmaW5lZCBpbiB0aGUgZW51bSB0eXBlJ3Mgc2NvcGUsIGUuZy4gaWYgdHdvIGVudW0gdHlwZXMgZGVjbGFyZWQKLSAgICBpbiB0aGUgc2FtZSBzY29wZSBoYXZlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG5hbWUuICBUaGlzIGlzIGRpc2FsbG93ZWQgZm9yCi0gICAgY29tcGF0aWJpbGl0eSB3aXRoIEMrKywgYnV0IHRoaXMgd2Fzbid0IGNsZWFyIGZyb20gdGhlIGVycm9yLgotICAqIEZpeGVkIGFic29sdXRlIG91dHB1dCBwYXRocyBvbiBXaW5kb3dzLgotICAqIEFsbG93IHRyYWlsaW5nIHNsYXNoZXMgaW4gLS1wcm90b19wYXRoIG1hcHBpbmdzLgotCi0gIEMrKwotICAqIFJlZmxlY3Rpb24gb2JqZWN0cyBhcmUgbm93IHBlci1jbGFzcyByYXRoZXIgdGhhbiBwZXItaW5zdGFuY2UuICBUbyBtYWtlIHRoaXMKLSAgICBwb3NzaWJsZSwgdGhlIFJlZmxlY3Rpb24gaW50ZXJmYWNlIGhhZCB0byBiZSBjaGFuZ2VkIHN1Y2ggdGhhdCBhbGwgbWV0aG9kcwotICAgIHRha2UgdGhlIE1lc3NhZ2UgaW5zdGFuY2UgYXMgYSBwYXJhbWV0ZXIuICBUaGlzIGNoYW5nZSBpbXByb3ZlcyBwZXJmb3JtYW5jZQotICAgIHNpZ25pZmljYW50bHkgaW4gbWVtb3J5LWJhbmR3aWR0aC1saW1pdGVkIHVzZSBjYXNlcywgc2luY2UgaXQgbWFrZXMgdGhlCi0gICAgbWVzc2FnZSBvYmplY3RzIHNtYWxsZXIuICBOb3RlIHRoYXQgc291cmNlLWluY29tcGF0aWJsZSBpbnRlcmZhY2UgY2hhbmdlcwotICAgIGxpa2UgdGhpcyB3aWxsIG5vdCBiZSBtYWRlIGFnYWluIGFmdGVyIHRoZSBsaWJyYXJ5IGxlYXZlcyBiZXRhLgotICAqIEhldXJpc3RpY2FsbHkgZGV0ZWN0IHN1Yi1tZXNzYWdlcyB3aGVuIHByaW50aW5nIHVua25vd24gZmllbGRzLgotICAqIEZpeCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb3JkZXJpbmcgYnVnIHRoYXQgY2F1c2VkIGNyYXNoZXMgYXQgc3RhcnR1cCB3aGVuCi0gICAgY29tcGlsaW5nIG9uIE1hYyB3aXRoIHN0YXRpYyBsaW5raW5nLgotICAqIEZpeGVkIFRva2VuaXplclRlc3Qgd2hlbiBjb21waWxpbmcgd2l0aCAtRE5ERUJVRyBvbiBMaW51eC4KLSAgKiBGaXhlZCBpbmNvcnJlY3QgZGVmaW5pdGlvbiBvZiBraW50MzJtaW4uCi0gICogRml4IGJ5dGVzIHR5cGUgc2V0dGVyIHRvIHdvcmsgd2l0aCBieXRlIHNlcXVlbmNlcyB3aXRoIGVtYmVkZGVkIE5VTExzLgotICAqIE90aGVyIGlycmVsZXZhbnQgdHdlYWtzLgotCi0gIEphdmEKLSAgKiBGaXhlZCBVbmtub3duRmllbGRTZXQncyBwYXJzaW5nIG9mIHZhcmludHMgbGFyZ2VyIHRoYW4gMzIgYml0cy4KLSAgKiBGaXhlZCBUZXh0Rm9ybWF0J3MgcGFyc2luZyBvZiAiaW5mIiBhbmQgIm5hbiIuCi0gICogRml4ZWQgVGV4dEZvcm1hdCdzIHBhcnNpbmcgb2YgY29tbWVudHMuCi0gICogQWRkZWQgaW5mbyB0byBKYXZhIFBPTSB0aGF0IHdpbGwgYmUgcmVxdWlyZWQgd2hlbiB3ZSB1cGxvYWQgdGhlCi0gICAgcGFja2FnZSB0byBhIE1hdmVuIHJlcG8uCi0KLSAgUHl0aG9uCi0gICogTWVyZ2VGcm9tKG1lc3NhZ2UpIGFuZCBDb3B5RnJvbShtZXNzYWdlKSBhcmUgbm93IGltcGxlbWVudGVkLgotICAqIFNlcmlhbGl6ZVRvU3RyaW5nKCkgcmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkCi0gICAgZmllbGRzLgotICAqIENvZGUgb3JnYW5pemF0aW9uIGltcHJvdmVtZW50cy4KLSAgKiBGaXhlZCBkb2MgY29tbWVudHMgZm9yIFJwY0NvbnRyb2xsZXIgYW5kIFJwY0NoYW5uZWwsIHdoaWNoIGhhZCBzb21laG93IGJlZW4KLSAgICBzd2FwcGVkLgotICAqIEZpeGVkIHRleHRfZm9ybWF0X3Rlc3Qgb24gV2luZG93cyB3aGVyZSBmbG9hdGluZy1wb2ludCBleHBvbmVudHMgc29tZXRpbWVzCi0gICAgY29udGFpbiBleHRyYSB6ZXJvcy4KLSAgKiBGaXggUHl0aG9uIHNlcnZpY2UgQ2FsbE1ldGhvZCgpIGltcGxlbWVudGF0aW9uLgotCi0gIE90aGVyCi0gICogSW1wcm92ZWQgcmVhZG1lcy4KLSAgKiBWSU0gc3ludGF4IGhpZ2hsaWdodGluZyBpbXByb3ZlbWVudHMuCi0KLTIwMDgtMDctMDcgdmVyc2lvbiAyLjAuMDoKLQotICAqIEZpcnN0IHB1YmxpYyByZWxlYXNlLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvQ09OVFJJQlVUT1JTLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL0NPTlRSSUJVVE9SUy50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDk3ZmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvQ09OVFJJQlVUT1JTLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi1UaGlzIGZpbGUgY29udGFpbnMgYSBsaXN0IG9mIHBlb3BsZSB3aG8gaGF2ZSBtYWRlIGxhcmdlIGNvbnRyaWJ1dGlvbnMKLXRvIHRoZSBwdWJsaWMgdmVyc2lvbiBvZiBQcm90b2NvbCBCdWZmZXJzLgotCi1PcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBhbmQgaW1wbGVtZW50YXRpb246Ci0gIFNhbmpheSBHaGVtYXdhdCA8c2FuamF5QGdvb2dsZS5jb20+Ci0gIEplZmYgRGVhbiA8amVmZkBnb29nbGUuY29tPgotICBEYW5pZWwgRHVsaXR6IDxkYW5pZWxAZ29vZ2xlLmNvbT4KLSAgQ3JhaWcgU2lsdmVyc3RlaW4KLSAgUGF1bCBIYWFociA8aGFhaHJAZ29vZ2xlLmNvbT4KLSAgQ29yZXkgQW5kZXJzb24gPGNvcmluQGdvb2dsZS5jb20+Ci0gIChhbmQgbWFueSBvdGhlcnMpCi0KLVByb3RvMiBDKysgYW5kIEphdmEgcHJpbWFyeSBhdXRob3I6Ci0gIEtlbnRvbiBWYXJkYSA8a2VudG9uQGdvb2dsZS5jb20+Ci0KLVByb3RvMiBQeXRob24gcHJpbWFyeSBhdXRob3JzOgotICBXaWxsIFJvYmluc29uIDxyb2JpbnNvbkBnb29nbGUuY29tPgotICBQZXRhciBQZXRyb3YgPHBldGFyQGdvb2dsZS5jb20+Ci0KLUphdmEgTmFubyBwcmltYXJ5IGF1dGhvcnM6Ci0gIEJyaWFuIER1ZmYgPGJkdWZmQGdvb2dsZS5jb20+Ci0gIFRvbSBDaGFvIDxjaGFvdEBnb29nbGUuY29tPgotICBNYXggQ2FpIDxtYXh0cm95QGdvb2dsZS5jb20+Ci0gIFVsYXMgS2lyYXpjaSA8dWxhc0Bnb29nbGUuY29tPgotCi1MYXJnZSBjb2RlIGNvbnRyaWJ1dGlvbnM6Ci0gIEphc29uIEhzdWVoIDxqYXNvbmhAZ29vZ2xlLmNvbT4KLSAgSm9zZXBoIFNjaG9yciA8anNjaG9yckBnb29nbGUuY29tPgotICBXZW5ibyBaaHUgPHdlbmJvekBnb29nbGUuY29tPgotCi1MYXJnZSBxdWFudGl0eSBvZiBjb2RlIHJldmlld3M6Ci0gIFNjb3R0IEJydWNlIDxzYnJ1Y2VAZ29vZ2xlLmNvbT4KLSAgRnJhbmsgWWVsbGluCi0gIE5lYWwgTm9yd2l0eiA8bm5vcndpdHpAZ29vZ2xlLmNvbT4KLSAgSmVmZnJleSBZYXNza2luIDxqeWFzc2tpbkBnb29nbGUuY29tPgotICBBbWJyb3NlIEZlaW5zdGVpbiA8YW1icm9zZUBnb29nbGUuY29tPgotCi1Eb2N1bWVudGF0aW9uOgotICBMaXNhIENhcmV5IDxsY2FyZXlAZ29vZ2xlLmNvbT4KLQotTWF2ZW4gcGFja2FnaW5nOgotICBHcmVnb3J5IEtpY2sgPGdha0Bnb29nbGUuY29tPgotCi1QYXRjaCBjb250cmlidXRvcnM6Ci0gIEtldmluIEtvIDxrZXZpbi5zLmtvQGdtYWlsLmNvbT4KLSAgICAqIFNtYWxsIHBhdGNoIHRvIGhhbmRsZSB0cmFpbGluZyBzbGFzaGVzIGluIC0tcHJvdG9fcGF0aCBmbGFnLgotICBKb2hhbiBFdXBocm9zaW5lIDxwcm9wcHlAYW1pbmNoZS5jb20+Ci0gICAgKiBTbWFsbCBwYXRjaCB0byBmaXggUHl0aG9uIENhbGxNZXRob2QoKS4KLSAgVWxyaWNoIEt1bml0eiA8a3VuZUBkZWluZS10YWxlci5kZT4KLSAgICAqIFNtYWxsIG9wdGltaXphdGlvbnMgdG8gUHl0aG9uIHNlcmlhbGl6YXRpb24uCi0gIExlYW5kcm8gTHVjYXJlbGxhIDxsbHVjYXhAZ21haWwuY29tPgotICAgICogVkkgc3ludGF4IGhpZ2hsaWdodGluZyB0d2Vha3MuCi0gICAgKiBGaXggY29tcGlsZXIgdG8gbm90IG1ha2Ugb3V0cHV0IGV4ZWN1dGFibGUuCi0gIERpbGlwIEpvc2VwaCA8ZGlsaXAuYW50b255Lmpvc2VwaEBnbWFpbC5jb20+Ci0gICAgKiBIZXVyaXN0aWMgZGV0ZWN0aW9uIG9mIHN1Yi1tZXNzYWdlcyB3aGVuIHByaW50aW5nIHVua25vd24gZmllbGRzIGluCi0gICAgICB0ZXh0IGZvcm1hdC4KLSAgQnJpYW4gQXRraW5zb24gPG5haXJiNzc0QGdtYWlsLmNvbT4KLSAgICAqIEFkZGVkIEBPdmVycmlkZSBhbm5vdGF0aW9uIHRvIGdlbmVyYXRlZCBKYXZhIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuCi0gIFZpbmNlbnQgQ2hvaW5pw6hyZSA8Q2hvaW5pZXJlLlZpbmNlbnRAaHlkcm8ucWMuY2E+Ci0gICAgKiBUcnU2NCBzdXBwb3J0LgotICBNb250eSBUYXlsb3IgPG1vbnR5LnRheWxvckBnbWFpbC5jb20+Ci0gICAgKiBTb2xhcmlzIDEwICsgU3VuIFN0dWRpbyBmaXhlcy4KLSAgQWxlayBTdG9ybSA8YWxlay5zdG9ybUBnbWFpbC5jb20+Ci0gICAgKiBTbGljaW5nIHN1cHBvcnQgZm9yIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMgZm9yIHRoZSBQeXRob24gQVBJLgotICBPbGVnIFNtb2xza3kgPG9sZWcuc21vbHNreUBnbWFpbC5jb20+Ci0gICAgKiBNUyBWaXN1YWwgU3R1ZGlvIGVycm9yIGZvcm1hdCBvcHRpb24uCi0gICAgKiBEZXRlY3QgdW5vcmRlcmVkX21hcCBpbiBzdGxfaGFzaC5tNC4KLSAgQnJpYW4gT2xzb24gPGJyaWFub2xzb25AZ29vZ2xlLmNvbT4KLSAgICAqIGd6aXAvemxpYiBJL08gc3VwcG9ydC4KLSAgTWljaGFlbCBQb29sZSA8bWRwb29sZUB0cm9pbHVzLm9yZz4KLSAgICAqIEZpeGVkIHdhcm5pbmdzIGFib3V0IGdlbmVyYXRlZCBjb25zdHJ1Y3RvcnMgbm90IGV4cGxpY2l0bHkgaW5pdGlhbGl6aW5nCi0gICAgICBhbGwgZmllbGRzIChvbmx5IHByZXNlbnQgd2l0aCBjZXJ0YWluIGNvbXBpbGVyIHNldHRpbmdzKS4KLSAgICAqIEFkZGVkIGdlbmVyYXRpb24gb2YgZmllbGQgbnVtYmVyIGNvbnN0YW50cy4KLSAgV2luayBTYXZpbGxlIDx3aW5rQGdvb2dsZS5jb20+Ci0gICAgKiBGaXhlZCBpbml0aWFsaXphdGlvbiBvcmRlcmluZyBwcm9ibGVtIGluIGxvZ2dpbmcgY29kZS4KLSAgV2lsbCBQaWVyY2UgPHdpbGxwQG51Y2xlaS5jb20+Ci0gICAgKiBTbWFsbCBwYXRjaCBpbXByb3ZpbmcgcGVyZm9ybWFuY2Ugb2YgaW4gUHl0aG9uIHNlcmlhbGl6YXRpb24uCi0gIEFsZXhhbmRyZSBWYXNzYWxvdHRpIDxhbGV4YW5kcmVAcGVhZHJvcC5jb20+Ci0gICAgKiBFbWFjcyBtb2RlIGZvciBQcm90b2NvbCBCdWZmZXJzIChlZGl0b3JzL3Byb3RvYnVmLW1vZGUuZWwpLgotICBTY290dCBTdGFmZm9yZCA8c2NvdHQuc3RhZmZvcmRAZ21haWwuY29tPgotICAgICogQWRkZWQgU3dhcCgpLCBTd2FwRWxlbWVudHMoKSwgYW5kIFJlbW92ZUxhc3QoKSB0byBSZWZsZWN0aW9uIGludGVyZmFjZS4KLSAgQWxleGFuZGVyIE1lbG5pa292IDxhbG1Ac2libWFpbC5ydT4KLSAgICAqIEhQVVggc3VwcG9ydC4KLSAgT2xpdmVyIEpvd2V0dCA8b2xpdmVyLmpvd2V0dEBnbWFpbC5jb20+Ci0gICAgKiBEZXRlY3Qgd2hldGhlciB6bGliIGlzIG5ldyBlbm91Z2ggaW4gY29uZmlndXJlIHNjcmlwdC4KLSAgICAqIEZpeGVzIGZvciBTb2xhcmlzIDEwIDMyLzY0LWJpdCBjb25mdXNpb24uCi0gIEV2YW4gSm9uZXMgPGV2YW5qQG1pdC5lZHU+Ci0gICAgKiBPcHRpbWl6ZSBKYXZhIHNlcmlhbGl6YXRpb24gY29kZSB3aGVuIHdyaXRpbmcgYSBzbWFsbCBtZXNzYWdlIHRvIGEgc3RyZWFtLgotICAgICogT3B0aW1pemUgSmF2YSBzZXJpYWxpemF0aW9uIG9mIHN0cmluZ3Mgc28gdGhhdCBVVEYtOCBlbmNvZGluZyBoYXBwZW5zIG9ubHkKLSAgICAgIG9uY2UgcGVyIHN0cmluZyBwZXIgc2VyaWFsaXphdGlvbiBjYWxsLgotICAgICogQ2xlYW4gdXAgc29tZSBKYXZhIHdhcm5pbmdzLgotICAgICogRml4IGJ1ZyB3aXRoIHBlcm1hbmVudCBjYWxsYmFja3MgdGhhdCBkZWxldGUgdGhlbXNlbHZlcyB3aGVuIHJ1bi4KLSAgTWljaGFlbCBLdWNoYXJza2kgPG0ua3VjaGFyc2tpQGdtYWlsLmNvbT4KLSAgICAqIEFkZGVkIENvZGVkSW5wdXRTdHJlYW0uZ2V0VG90YWxCeXRlc1JlYWQoKS4KLSAgS2FjcGVyIEtvd2FsaWsgPHhhcnRoaXNpdXMua2tAZ21haWwuY29tPgotICAgICogRml4ZWQgbTQvYWN4X3B0aHJlYWQubTQgcHJvYmxlbSBmb3Igc29tZSBMaW51eCBkaXN0cmlidXRpb25zLgotICBXaWxsaWFtIE9yciA8d2lsbEB3b3JyYmFzZS5jb20+Ci0gICAgKiBGaXhlZCBkZXRlY3Rpb24gb2Ygc2NoZWRfeWllbGQgb24gU29sYXJpcy4KLSAgICAqIEFkZGVkIGF0b21pY29wcyBmb3IgU29sYXJpcwotICBBbmRyZXcgUGFwcm9ja2kgPGFuZHJld0Bpc2hpYm9vLmNvbT4KLSAgICAqIEZpeGVkIG1pbm9yIElCTSB4bEMgY29tcGlsZXIgYnVpbGQgaXNzdWVzCi0gICAgKiBBZGRlZCBhdG9taWNvcHMgZm9yIEFJWCAoUE9XRVIpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9SRUFETUUuY2hyb21pdW0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9SRUFETUUuY2hyb21pdW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4MzhmYmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvUkVBRE1FLmNocm9taXVtCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotTmFtZTogUHJvdG9jb2wgQnVmZmVycwotU2hvcnQgTmFtZTogcHJvdG9idWYKLVVSTDogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1ZgotTGljZW5zZTogQlNECi1MaWNlbnNlIEZpbGU6IExJQ0VOU0UKLVZlcnNpb246IDMuMC4wLWJldGEtMwotUmV2aXNpb246IDM0NzBiNjg5NWFhNjU5Yjc1NTllZDY3OGUwMjlhNTMzOGU1MzVmMTQKLVNlY3VyaXR5IENyaXRpY2FsOiB5ZXMKLQotU3RlcHMgdXNlZCB0byBjcmVhdGUgdGhlIGN1cnJlbnQgdmVyc2lvbjoKLTEuIFB1bGwgdGhlIHJlbGVhc2UgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmL3JlbGVhc2VzCi0yLiBBZGQgYnVpbGQgZmlsZXMgKEJVSUxELmduLCBwcm90b19saWJyYXJ5LmduaSwgcHJvdG9idWYuZ3lwLAotICAgcHJvdG9idWZfbGl0ZS5neXBpLCBwcm90b2J1Zl9uYWNsLmd5cCkuCi0KLSAgIEJlIHN1cmUgdG8gdXBkYXRlIHRoZSBsaXN0IG9mIHNvdXJjZSBmaWxlcywgYXMgYWRkaXRpb25hbCAuY2MgZmlsZXMgYW5kCi0gICBoZWFkZXJzIG1pZ2h0IGhhdmUgYmVlbiBhZGRlZCAtLSB5b3UgbmVlZCB0byBmaW5kIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YKLSAgIGluY2x1ZGUgZmlsZXMgcmVxdWlyZWQgYnkgdGFyZ2V0cy4KLQotICAgT3RoZXIgdGhpbmdzIHRvIGNhcmUgYWJvdXQgYXJlIGRlZmluZXMgcmVxdWlyZWQgYnkgcHJvdG9idWYgb24gdmFyaW91cwotICAgcGxhdGZvcm1zLCB3YXJuaW5ncyBnZW5lcmF0ZWQgYnkgY29tcGlsZXJzLCBhbmQgbmV3IGRlcGVuZGVuY2llcyBpbnRyb2R1Y2VkLgotMy4gR2V0IG9wZW4tc291cmNlIGxpYnJhcnkgc2l4LnB5IGZyb20gaHR0cHM6Ly9weXBpLnB5dGhvbi5vcmcvcHlwaS9zaXgvIGFuZCBhZGQKLSAgIGl0IHRvIHByb3RvYnVmL3RoaXJkX3BhcnR5L3NpeC9zaXgucHkuCi00LiBBcHBseSBwYXRjaGVzIGluIHBhdGNoZXMvIChzZWUgdGhlIGRlc2NyaXB0aW9uIGJlbG93KToKLQotICAgJCBmb3IgcGF0Y2ggaW4gcGF0Y2hlcy8qOyBkbyBwYXRjaCAtcyAtcDEgPCAkcGF0Y2g7IGRvbmUKLQotICAgRm9yIGZ1dHVyZSByZWxlYXNlcywgaXQgd2lsbCBiZSB3b3J0aCBsb29raW5nIGludG8gd2hpY2ggcGF0Y2hlcyBzdGlsbCBuZWVkCi0gICB0byBiZSBhcHBsaWVkLgotNS4gR2VuZXJhdGUgZGVzY3JpcHRvcl9wYjIucHkgdXNpbmcgc29tZXRoaW5nIGxpa2UgdGhlIGZvbGxvd2luZyBzdGVwcy4gTWFrZQotICAgc3VyZSB5b3UndmUgcmVnZW5lcmF0ZWQgeW91ciBidWlsZGZpbGVzIGFuZCB3aWxsIGJ1aWxkIHByb3RvYyBmcm9tIHRoZQotICAgbmV3bHktbW9kaWZpZWQgc291cmNlcyBhYm92ZS4KLQotICAgJCBjZCAkU1JDX0RJUgotICAgJCBuaW5qYSAtQyBvdXQvRGVidWcgcHJvdG9jCi0gICAkIGNkIHRoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYwotICAgJCAuLi8uLi8uLi9vdXQvRGVidWcvcHJvdG9jIC0tcHl0aG9uX291dD0uLi9weXRob24gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KLQotNi4gQWRkIGFuIF9faW5pdF9fLnB5IHRvIHByb3RvYnVmLyB0aGF0IGFkZHMgdGhpcmRfcGFydHkvc2l4LyB0byBQeXRob24gcGF0aC4KLTcuIFVwZGF0ZSBSRUFETUUuY2hyb21pdW0uCi0KLURlc2NyaXB0aW9uIG9mIHRoZSBwYXRjaGVzOgotCi0tIDAwMDMtcmVtb3ZlLXN0YXRpYy1pbml0aWFsaXplcnMucGF0Y2gKLQotICBUaGlzIHBhdGNoIHJlbW92ZXMgYWxsIHN0YXRpYyBpbml0aWFsaXplcnMgZnJvbSBDaHJvbWl1bS4gVGhlIGNoYW5nZSBpbiBTdGF0dXMKLSAgY2xhc3MgaXMgbm90IGNvbXBsZXRlbHkgY29tcGF0aWJsZSB3aXRoIHVwc3RyZWFtLCBidXQgaXQncyBjb21wYXRpYmxlIGVub3VnaAotICB0byB3b3JrIGluIENocm9taXVtLCB3aGljaCBkb2Vzbid0IHVzZSB0aGlzIGZ1bmN0aW9uYWxpdHkgeWV0LiBUaGUgd29yayBvbgotICB1cHN0cmVhbWluZyB0aGUgcmVtb3ZhbCBvZiBzdGF0aWMgaW5pdGlhbGl6ZXJzIGlzIGluIHByb2dyZXNzOgotICBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmL2lzc3Vlcy8xNDA0Ci0KLS0gMDAwNC1maXgtaW50ZWdlci10eXBlcy1hbmQtc2hhcmVkLWxpYnJhcnktZXhwb3J0cy5wYXRjaAotCi0gIFRoaXMgcGF0Y2ggbWFrZXMgcHJvdG9idWYgaW50NjQgdG8gYmUgaW50NjRfdCAoYXMgb3Bwb3NlZCB0byBsb25nIGxvbmcgaW4KLSAgdXBzdHJlYW0pLCBhbmQgc2ltaWxhcmx5IGZvciBvdGhlciBpbnRlZ2VyIHR5cGVzLiBJdCBhbHNvIGFsbG93cyBleHBvcnRpbmcKLSAgcHJvdG9idWYgc3ltYm9scyBpbiBMaW51eCAuc28gbGlicmFyaWVzLCBzbyB0aGF0IHByb3RvYnVmIGNhbiBiZSBidWlsdCBhcyBhCi0gIGNvbXBvbmVudCAoc2VlIGh0dHA6Ly9jcnJldi5jb20vMTc5ODA2KS4KLQotLSAwMDA1LWZpeC1pbmNsdWRlLWpzLWdlbmVyYXRvci5wcm90b2J1ZgotCi0gIER1cmluZyBtZXJnZSB3aXRoIGludGVybmFsIGJyYW5jaCwgdGhlIDw+IGluIG9uZSBvZiB0aGUgI2luY2x1ZGVzIHdlcmUKLSAgYWNjaWRlbnRhbGx5IHJlcGxhY2VkIHdpdGggIiIsIHdoaWNoIHJlc3VsdHMgaW4gYSBmYWlsdXJlIGluIGNoZWNrZGVwcy4KLQotICBGaXhlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmL3B1bGwvMTU0Ny4KLQotLSAwMDA3LXVuaW5saW5lX2dvb2dsZW9uY2UucGF0Y2gKLS0gMDAwOC11bmlubGluZV9nZXRfZW1wdHlfc3RyaW5nLnBhdGNoCi0tIDAwMDktdW5pbmxpbmUtYXJlbmFzdHJpbmcucGF0Y2gKLS0gMDAxMC11bmlubGluZS1nZW5lcmF0ZWQtY29kZS5wYXRjaAotCi0gIFRoZXNlIHBhdGNoZXMgdW5pbmxpbmUgc29tZSBmdW5jdGlvbnMsIHJlc3VsdGluZyBpbiBhIHNpZ25pZmljYW50IHJlZHVjdGlvbgotICAoc29tZXdoZXJlIGJldHdlZW4gNTAwIEtCIGFuZCAxIE1CKSBvZiBiaW5hcnkgc2l6ZS4KLQotLSAwMDExLWxpYnByb3RvYnVmX2V4cG9ydC5wYXRjaAotCi0gIER1cmluZyBtZXJnZSB3aXRoIGludGVybmFsIGJyYW5jaCwgdGhlIGRsbCBleHBvcnQgYXR0cmlidXRlIHdhcyBhY2NpZGVudGFsbHkKLSAgcmVtb3ZlZCBpbiBDKysxMSBtb2RlLgotCi0gIEZpeGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvcHVsbC8xNTQ5CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9fX2luaXRfXy5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWUxY2YyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL19faW5pdF9fLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi1pbXBvcnQgc3lzCi1pbXBvcnQgb3MKLQotVEhJU19ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKLQotc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihUSElTX0RJUiwgInRoaXJkX3BhcnR5IiwgInNpeCIpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL0NIQU5HRVMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL0NIQU5HRVMudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODdjZDRkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9DSEFOR0VTLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1XZWxjb21lIHRvIHRoZSBDIyBwb3J0IG9mIEdvb2dsZSBQcm90b2NvbCBCdWZmZXJzLCB3cml0dGVuIGJ5IEpvbiBTa2VldAotKHNrZWV0QHBvYm94LmNvbSkgYmFzZWQgb24gdGhlIHdvcmsgb2YgbWFueSB0YWxlbnRlZCBwZW9wbGUuCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJFTEVBU0UgTk9URVMgLSBDb2RlIGltcG9ydGVkIGludG8gR29vZ2xlJ3MgbWFpbiBwcm90b2J1ZiByZXBvc2l0b3J5Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUV2ZXJ5dGhpbmcgYmVsb3cgbm90ZSB0aGlzIHJlcHJlc2VudHMgaGlzdG9yeSBvZiBwcm90b2J1Zi1jc2hhcnAtcG9ydCBwcm9qZWN0Ci1iZWZvcmUgdGhlIGNvZGUgd2FzIG1lcmdlZCBpbnRvIGNzaGFycC8gc3VidHJlZSBvZiBHaXRIdWIgZ29vZ2xlL3Byb3RvYnVmCi1yZXBvc2l0b3J5LgotRnJvemVuIGxlZ2FjeSB2ZXJzaW9uIG9mIHRoZSBvcmlnaW5hbCBwcm9qZWN0IGlzIGF2YWlsYWJsZSBpbgotaHR0cHM6Ly9naXRodWIuY29tL2pza2VldC9wcm90b2J1Zi1jc2hhcnAtcG9ydC4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkVMRUFTRSBOT1RFUyAtIFZlcnNpb24gMi40LjEuNTU1Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNoYW5nZXM6Ci0tIFVwZ3JhZGUgc29sdXRpb24gZm9ybWF0IHRvIFZpc3VhbCBTdHVkaW8gMjAxMi4KLS0gQWRkIHRoZSBhYmlsaXR5IHRvIHByaW50IGEgYnVpbGRlciAobm90IGp1c3QgYSBtZXNzYWdlKQotLSBUZXh0R2VuZXJhdG9yIGludHJvZHVjZXMgYSBuZXcgb3ZlcmxvYWQgb2YgUHJpbnRUbwotLSBNdW5nZSBwcm90b2MncyBlcnJvciBmb3JtYXQgaW50byBhIFZTLUMjLWNvbXBhdGlibGUgb3V0cHV0IGZvcm1hdC4KLS0gV29yayB0byBtYWtlIFByb3RvR2VuIGNsb25lIHRoYXQgYWN0cyBhcyBhIHByb3RvYy5leGUgcGx1Z2luLgotLSBBZGRlZCB0aGUgQWxsb3dQYXJ0aWFsbHlUcnVzdGVkQ2FsbGVycyBhdHRyaWJ1dGUKLS0gT3B0aW1pemVkIGVudW0gcGFyc2luZy4KLQotRml4ZXM6Ci0tIEZpeCBmb3IgYnVnIGluIGxpbWl0ZWQgaW5wdXQgc3RyZWFtJ3MgUG9zaXRpb24sIEludHJvZHVjZWQgUG9zaXRpb24gb24gCi0gIG91dHB1dCBzdHJlYW0KLS0gRml4IGZvciB3cml0aW5nIGEgY2hhcmFjdGVyIHRvIGEgSlNPTiBvdXRwdXQgb3ZlcmZsb3dzIGFsbG9jYXRlZCBidWZmZXIKLS0gT3B0aW1pemUgRnJvbUJhc2U2NFN0cmluZyB0byByZXR1cm4gRW1wdHkgd2hlbiBwcmVzZW50ZWQgd2l0aCBlbXB0eSBzdHJpbmcuCi0tIFVzZSBzdHJpbmcuQ29uY2F0IGluc3RlYWQgb2Ygb3BlcmF0b3IgdG8gYXZvaWQgcG90ZW50aWFsIGltcG9ydCBwcm9ibGVtcwotLSBJc3N1ZSA4MTogcXVvdGluZyBmb3IgTlVuaXQgcGFyYW1ldGVycy4KLS0gSXNzdWUgNTY6IE51R2V0IHBhY2thZ2UgaXMgbm9pc3kKLS0gSXNzdWUgNzA6IFBvcnRhYmxlIGxpYnJhcnkgcHJvamVjdCBoYXMgc29tZSBpbnZhbGlkIE51bml0LWJhc2VkIGNvZGUuCi0tIElzc3VlIDcxOiBDb2RlZElucHV0U3RyZWFtLlJlYWRCeXRlcyBnbyB0byBzbG93IHBhdGggdW5uZWNlc3NhcmlseQotLSBJc3N1ZSA4NDogd2FybmluZyBDUzAyMTk6IFRoZSB2YXJpYWJsZSBgc2l6ZScgaXMgYXNzaWduZWQgYnV0IG5ldmVyIHVzZWQKLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotUkVMRUFTRSBOT1RFUyAtIFZlcnNpb24gMi40LjEuNTIxCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUNoYW5nZXM6Ci0tIEFkZCBnZW5lcmF0ZWRfY29kZV9hdHRyaWJ1dGVzIG9wdGlvbiwgZGVmYXVsdGVkIHRvIGZhbHNlCi0tIEFkZGVkIHN1cHBvcnQgZm9yIFBvcnRhYmxlIGxpYnJhcnkKLS0gQWRkZWQgJ1Vuc2FmZScgc3RhdGljIHR5cGUgaW4gQnl0ZVN0cmluZyB0byBhbGxvdyBkaXJlY3QgYnVmZmVyIGFjY2VzcwotCi1GaXhlczoKLS0gSXNzdWUgNTA6IFRoZSBYTUwgc2VyaWFsaXplciB3aWxsIGZhaWwgdG8gZGVzZXJpYWxpemUgYSBtZXNzYWdlIHdpdGggZW1wdHkgCi0gIGNoaWxkIG1lc3NhZ2UKLS0gSXNzdWUgNDU6IFVzZSBvZiAnaXRlbScgYXMgYSBmaWVsZCBuYW1lIGNhdXNlcyBBbWJpZ3VvdXNNYXRjaEV4Y2VwdGlvbgotLSBJc3N1ZSA0OTogR2VuZXJhdGVkIG5lc3RlZCBzdGF0aWMgVHlwZXMgY2xhc3Mgc2hvdWxkIGJlIHBhcnRpYWwKLS0gSXNzdWUgMzg6IERpc2FibGUgQ0xTQ29tcGxpYW50IHdhcm5pbmdzICgzMDIxKQotLSBJc3N1ZSA0MDogcHJvdG9fcGF0aCBkb2VzIG5vdCB3b3JrIGZvciBjb21tYW5kLWxpbmUgZmlsZSBuYW1lcwotLSBJc3N1ZSA1NDogc2hvdWxkIHJldGlyZSBhbGwgYnl0ZXMgaW4gYnVmZmVyIChidWZmZXJTaXplKQotLSBJc3N1ZSA0MzogRml4IHRvIGNvcnJlY3QgaWRlbnRpY2FsICd1bWJyZWxsYV9jbGFzc25hbWUnIG9wdGlvbnMgZnJvbSB0cnlpbmcgCi0gIHRvIHdyaXRlIHRvIHRoZSBzYW1lIGZpbGVuYW1lLgotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SRUxFQVNFIE5PVEVTIC0gVmVyc2lvbiAyLjQuMS40NzMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRmVhdHVyZXM6Ci0tIEFkZGVkIG9wdGlvbiBzZXJ2aWNlX2dlbmVyYXRvcl90eXBlIHRvIGNvbnRyb2wgc2VydmljZSBnZW5lcmF0aW9uIHdpdGgKLSAgTk9ORSwgR0VORVJJQywgSU5URVJGQUNFLCBvciBJUlBDRElTUEFUQ0gKLS0gQWRkZWQgaW50ZXJmYWNlcyBJUnBjRGlzcGF0Y2ggYW5kIElScGNTZXJ2ZXJTdHViIHRvIHByb3ZpZGUgZm9yIGJsb2NraW5nCi0gIHNlcnZpY2VzIGFuZCBpbXBsZW1lbnRhdGlvbnMuCi0tIEFkZGVkIFByb3RvR2VuLmV4ZSBjb21tYW5kLWxpbmUgYXJndW1lbnQgIi0tcHJvdG9jX2Rpcj0iIHRvIHNwZWNpZnkgdGhlIAotICBsb2NhdGlvbiBvZiBwcm90b2MuZXhlLgotLSBFeHRyYWN0ZWQgaW50ZXJmYWNlcyBmb3IgSUNvZGVkSW5wdXRTdHJlYW0gYW5kIElDb2RlZE91dHB1dFN0cmVhbSB0byBhbGxvdwotICBjdXN0b20gaW1wbGVtZW50YXRpb24gb2Ygd3JpdGVycyB3aXRoIGJvdGggc3BlZWQgYW5kIHNpemUgb3B0aW1pemF0aW9ucy4KLS0gQWRkaXRpb24gb2YgdGhlICJHb29nbGUuUHJvdG9CdWZmZXJzLlNlcmlhbGl6YXRpb24iIGFzc2VtYmx5IHRvIHN1cHBvcnQKLSAgcmVhZGluZyBhbmQgd3JpdGluZyBtZXNzYWdlcyB0by9mcm9tIFhNTCwgSlNPTiwgSURpY3Rpb25hcnk8LD4gYW5kIG90aGVycy4KLS0gU2V2ZXJhbCBwZXJmb3JtYW5jZSByZWxhdGVkIGZpeGVzIGFuZCB0d2Vla3MKLS0gSXNzdWUgMzoJQWRkIG9wdGlvbiB0byBtYXJrIGdlbmVyYXRlZCBjb2RlIHdpdGggYXR0cmlidXRlCi0tIElzc3VlIDIwOglTdXBwb3J0IGZvciBkZWNvcmF0aW5nIGNsYXNzZXMgW1NlcmlhbGl6YWJsZV0KLS0gSXNzdWUgMjE6CURlY29yYXRlIGZpZWxkcyB3aXRoIFtkZXByZWNhdGVkPXRydWVdIGFzIFtTeXN0ZW0uT2Jzb2xldGVdCi0tIElzc3VlIDIyOglSZXVzYWJsZSBCdWlsZGVyIGNsYXNzZXMKLS0gSXNzdWUgMjQ6CVN1cHBvcnQgZm9yIHVzaW5nIEpzb24vWG1sIGZvcm1hdHMgd2l0aCBJQ29kZWRJbnB1dFN0cmVhbQotLSBJc3N1ZSAyNTogQWRkZWQgc3VwcG9ydCBmb3IgTnVHZXQgcGFja2FnZXMKLS0gSXNzdWUgMzE6IFVwZ3JhZGVkIHByb3RvYy5leGUgYW5kIGRlc2NyaXB0b3IgdG8gMi40LjEKLQotRml4ZXM6Ci0tIElzc3VlIDEzOglNZXNzYWdlIHdpdGggRmllbGQgc2FtZSBuYW1lIGFzIG1lc3NhZ2UgY2F1c2VzIHVuY29tcGlsYWJsZSAuY3MKLS0gSXNzdWUgMTY6CURvZXMgbm90IGludGVncmF0ZSB3ZWxsIHdpdGggb3RoZXIgdG9vbGluZwotLSBJc3N1ZSAxOToJU3VwcG9ydCBmb3IgbmVnYXRpdmUgZW51bSB2YWx1ZXMKLS0gSXNzdWUgMjY6CUFkZFJhbmdlIGluIEdlbmVyYXRlZEJ1aWxkZXIgaXRlcmF0ZXMgdHdpY2UuCi0tIElzc3VlIDI3OglSZW1vdmUgWE1MIGRvY3VtZW50YXRpb24gb3V0cHV0IGZyb20gdGVzdCBwcm9qZWN0cyB0byBjbGVhciAKLSAgd2FybmluZ3MvZXJyb3JzLgotLSBJc3N1ZSAyODogQ2lyY3VsYXIgbWVzc2FnZSBkZXBlbmRlbmNpZXMgcmVzdWx0IGluIG51bGwgZGVmYXVsdCB2YWx1ZXMgZm9yIAotICBNZXNzYWdlIGZpZWxkcy4KLS0gSXNzdWUgMjk6IE1lc3NhZ2UgY2xhc3NlcyBnZW5lcmF0ZWQgaGF2ZSBhIHB1YmxpYyBkZWZhdWx0IGNvbnN0cnVjdG9yLiAgWW91Ci0gIGNhbiBkaXNhYmxlIHByaXZhdGUgY3RvciBnZW5lcmF0aW9uIHdpdGggdGhlIG9wdGlvbiBnZW5lcmF0ZV9wcml2YXRlX2N0b3IuCi0tIElzc3VlIDM1OiBGaXhlZCBhIGJ1ZyBpbiBQcm90b0dlbiBoYW5kbGluZyBvZiBhcmd1bWVudHMgd2l0aCB0cmFpbGluZyBcCi0tIEJpZy1lbmRpYW4gc3VwcG9ydCBmb3IgZmxvYXQsIGFuZCBkb3VibGUgb24gU2lsdmVybGlnaHQKLS0gUGFja2VkIGFuZCBVbnBhY2tlZCBwYXJzaW5nIGFsbG93IGZvciBhbGwgcmVwZWF0ZWQsIGFzIHBlciB2ZXJzaW9uIDIuMwotLSBGaXggZm9yIGxlYXZpbmcgQnVpbGRlciBhIHB1YmxpYyBjdG9yIG9uIGludGVybmFsIGNsYXNzZXMgZm9yIHVzZSB3aXRoCi0gIGdlbmVyaWMgIndoZXJlIFQ6IG5ldygpIiBjb25zdHJhaW50cy4KLQotT3RoZXI6Ci0tIENoYW5nZWQgdGhlIGNvZGUgc2lnbmluZyBrZXkgdG8gYSBwcml2YXRlbHkgaGVsZCBrZXkKLS0gUmVmb3JtYXR0ZWQgYWxsIGNvZGUgYW5kIGxpbmUtZW5kaW5ncyB0byBDIyBkZWZhdWx0cwotLSBSZXdvcmtpbmcgb2YgcGVyZm9ybWFuY2UgYmVuY2htYXJrcyB0byBwcm9kdWNlIHJlbGlhYmxlIHJlc3VsdHMsIG9wdGlvbiAvdjIKLS0gSXNzdWUgMzQ6IFNpbHZlcmxpZ2h0IGFzc2VtYmxpZXMgYXJlIG5vdyB1bml0IHRlc3RlZAotCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1SRUxFQVNFIE5PVEVTIC0gVmVyc2lvbiAyLjMuMC4yNzcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRmVhdHVyZXM6Ci0tIEFkZGVkIGNsc19jb21wbGlhbmNlIG9wdGlvbiB0byBnZW5lcmF0ZSBhdHRyaWJ1dGVzIGluZGljYXRpbmcgCi0gIG5vbi1DTFMtY29tcGxpYW5jZS4KLS0gQWRkZWQgZmlsZV9leHRlbnNpb24gb3B0aW9uIHRvIGNvbnRyb2wgdGhlIGdlbmVyYXRlZCBvdXRwdXQgZmlsZSdzIGV4dGVuc2lvbi4KLS0gQWRkZWQgdW1icmVsbGFfbmFtZXNwYWNlIG9wdGlvbiB0byBwbGFjZSB0aGUgdW1icmVsbGEgY2xhc3MgaW50byBhIG5lc3RlZAotICBuYW1lc3BhY2UgdG8gYWRkcmVzcyBpc3N1ZXMgd2l0aCBwcm90byBmaWxlcyBoYXZpbmcgdGhlIHNhbWUgbmFtZSBhcyBhIAotICBtZXNzYWdlIGl0IGNvbnRhaW5zLgotLSBBZGRlZCBvdXRwdXRfZGlyZWN0b3J5IG9wdGlvbiB0byBzZXQgdGhlIG91dHB1dCBwYXRoIGZvciB0aGUgc291cmNlIGZpbGUocykuCi0tIEFkZGVkIGlnbm9yZV9nb29nbGVfcHJvdG9idWYgb3B0aW9uIHRvIGF2b2lkIGdlbmVyYXRpbmcgY29kZSBmb3IgaW5jbHVkZXMgCi0gIGZyb20gdGhlIGdvb2dsZS5wcm90b2J1ZiBwYWNrYWdlLgotLSBBZGRlZCB0aGUgTElURSBmcmFtZXdvcmsgKEdvb2dsZS5Qcm90b0J1ZmZlcnNMaXRlLmRsbCkgYW5kIHRoZSBhYmlsaXR5IHRvCi0gIGdlbmVyYXRlIGNvZGUgd2l0aCAib3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsiLgotLSBBZGRlZCBhYmlsaXR5IHRvIGludm9rZSBwcm90b2MuZXhlIGZyb20gd2l0aGluIFByb3RvR2VuLmV4ZS4KLS0gVXBncmFkZWQgdG8gcHJvdG9jLmV4ZSAoMi4zKSBjb21waWxlci4KLQotRml4ZXM6Ci0tIElzc3VlIDk6CUNsYXNzIGNhbm5vdCBiZSBzdGF0aWMgYW5kIHNlYWxlZCBlcnJvcgotLSBJc3N1ZSAxMjoJZGVmYXVsdCB2YWx1ZSBmb3IgZW51bWVyYXRlIGZpZWxkcyBtdXN0IGJlIGZpbGxlZCBvdXQKLQotT3RoZXI6Ci0tIFJld3JpdGUgb2YgYnVpbGQgdXNpbmcgTVNidWlsZCBpbnN0ZWFkIG9mIE5BbnQKLS0gTW92ZWQgdG8gTlVuaXQgVmVyc2lvbiAyLjIuOC4wCi0tIENoYW5nZWQgdG8gdXNpbmcgc2VjdXJlIC5zbmsgZm9yIHJlbGVhc2VzCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJFTEVBU0UgTk9URVMgLSBWZXJzaW9uIDAuOS4xCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZpeGVzOgotLSBpc3N1ZSAxMDoJSW5jb3JyZWN0IGVuY29kaW5nIG9mIHBhY2tlZCBmaWVsZHMgd2hlbiBzZXJpYWxpemVkCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLVJFTEVBU0UgTk9URVMgLSBWZXJzaW9uIDAuOS4wCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS0gSW5pdGlhbCByZWxlYXNlCi0KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvR29vZ2xlLlByb3RvYnVmLlRvb2xzLm51c3BlYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9Hb29nbGUuUHJvdG9idWYuVG9vbHMubnVzcGVjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNDI0MGRhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9Hb29nbGUuUHJvdG9idWYuVG9vbHMubnVzcGVjCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxwYWNrYWdlPgotICA8bWV0YWRhdGE+Ci0gICAgPGlkPkdvb2dsZS5Qcm90b2J1Zi5Ub29sczwvaWQ+Ci0gICAgPHRpdGxlPkdvb2dsZSBQcm90b2NvbCBCdWZmZXJzIHRvb2xzPC90aXRsZT4KLSAgICA8c3VtbWFyeT5Ub29scyBmb3IgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ljwvc3VtbWFyeT4KLSAgICA8ZGVzY3JpcHRpb24+U2VlIHByb2plY3Qgc2l0ZSBmb3IgbW9yZSBpbmZvLjwvZGVzY3JpcHRpb24+Ci0gICAgPHZlcnNpb24+My4wLjAtYmV0YTM8L3ZlcnNpb24+Ci0gICAgPGF1dGhvcnM+R29vZ2xlIEluYy48L2F1dGhvcnM+Ci0gICAgPG93bmVycz5wcm90b2J1Zi1wYWNrYWdlczwvb3duZXJzPgotICAgIDxsaWNlbnNlVXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvYmxvYi9tYXN0ZXIvTElDRU5TRTwvbGljZW5zZVVybD4KLSAgICA8cHJvamVjdFVybD5odHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmPC9wcm9qZWN0VXJsPgotICAgIDxyZXF1aXJlTGljZW5zZUFjY2VwdGFuY2U+ZmFsc2U8L3JlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT4KLSAgICA8cmVsZWFzZU5vdGVzPlRvb2xzIGZvciBQcm90b2NvbCBCdWZmZXJzPC9yZWxlYXNlTm90ZXM+Ci0gICAgPGNvcHlyaWdodD5Db3B5cmlnaHQgMjAxNSwgR29vZ2xlIEluYy48L2NvcHlyaWdodD4KLSAgICA8dGFncz5Qcm90b2NvbCBCdWZmZXJzIEJpbmFyeSBTZXJpYWxpemF0aW9uIEZvcm1hdCBHb29nbGUgcHJvdG8gcHJvdG8zPC90YWdzPgotICA8L21ldGFkYXRhPgotICA8ZmlsZXM+Ci0gICAgPGZpbGUgc3JjPSJwcm90b2Ncd2luZG93c194ODZccHJvdG9jLmV4ZSIgdGFyZ2V0PSJ0b29sc1x3aW5kb3dzX3g4Nlxwcm90b2MuZXhlIiAvPgotICAgIDxmaWxlIHNyYz0icHJvdG9jXHdpbmRvd3NfeDY0XHByb3RvYy5leGUiIHRhcmdldD0idG9vbHNcd2luZG93c194NjRccHJvdG9jLmV4ZSIgLz4KLSAgICA8ZmlsZSBzcmM9InByb3RvY1xsaW51eF94ODZccHJvdG9jIiB0YXJnZXQ9InRvb2xzXGxpbnV4X3g4Nlxwcm90b2MiIC8+Ci0gICAgPGZpbGUgc3JjPSJwcm90b2NcbGludXhfeDY0XHByb3RvYyIgdGFyZ2V0PSJ0b29sc1xsaW51eF94NjRccHJvdG9jIiAvPgotICAgIDxmaWxlIHNyYz0icHJvdG9jXG1hY29zeF94ODZccHJvdG9jIiB0YXJnZXQ9InRvb2xzXG1hY29zeF94ODZccHJvdG9jIiAvPgotICAgIDxmaWxlIHNyYz0icHJvdG9jXG1hY29zeF94NjRccHJvdG9jIiB0YXJnZXQ9InRvb2xzXG1hY29zeF94NjRccHJvdG9jIiAvPgotICAgIDxmaWxlIHNyYz0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxhbnkucHJvdG8iIHRhcmdldD0idG9vbHNcZ29vZ2xlXHByb3RvYnVmIiAvPgotICAgIDxmaWxlIHNyYz0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxhcGkucHJvdG8iIHRhcmdldD0idG9vbHNcZ29vZ2xlXHByb3RvYnVmIiAvPgotICAgIDxmaWxlIHNyYz0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnByb3RvIiB0YXJnZXQ9InRvb2xzXGdvb2dsZVxwcm90b2J1ZiIgLz4KLSAgICA8ZmlsZSBzcmM9Ii4uXHNyY1xnb29nbGVccHJvdG9idWZcZHVyYXRpb24ucHJvdG8iIHRhcmdldD0idG9vbHNcZ29vZ2xlXHByb3RvYnVmIiAvPgotICAgIDxmaWxlIHNyYz0iLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxlbXB0eS5wcm90byIgdGFyZ2V0PSJ0b29sc1xnb29nbGVccHJvdG9idWYiIC8+Ci0gICAgPGZpbGUgc3JjPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGZpZWxkX21hc2sucHJvdG8iIHRhcmdldD0idG9vbHNcZ29vZ2xlXHByb3RvYnVmIiAvPgotICAgIDxmaWxlIHNyYz0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxzb3VyY2VfY29udGV4dC5wcm90byIgdGFyZ2V0PSJ0b29sc1xnb29nbGVccHJvdG9idWYiIC8+Ci0gICAgPGZpbGUgc3JjPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0cnVjdC5wcm90byIgdGFyZ2V0PSJ0b29sc1xnb29nbGVccHJvdG9idWYiIC8+Ci0gICAgPGZpbGUgc3JjPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHRpbWVzdGFtcC5wcm90byIgdGFyZ2V0PSJ0b29sc1xnb29nbGVccHJvdG9idWYiIC8+Ci0gICAgPGZpbGUgc3JjPSIuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHR5cGUucHJvdG8iIHRhcmdldD0idG9vbHNcZ29vZ2xlXHByb3RvYnVmIiAvPgotICAgIDxmaWxlIHNyYz0iLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3cmFwcGVycy5wcm90byIgdGFyZ2V0PSJ0b29sc1xnb29nbGVccHJvdG9idWYiIC8+Ci0gIDwvZmlsZXM+Ci08L3BhY2thZ2U+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL1JFQURNRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMzOTkzZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIEMjIFByb3RvY29sIEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5LgotCi1TdGF0dXM6IEJldGEgLSByZWFkeSBmb3IgZXh0ZXJuYWwgdGVzdGluZwotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVXNhZ2UKLT09PT09Ci0KLVRoZSBlYXNpZXN0IHdheSBob3cgdG8gdXNlIEMjIHByb3RvYnVmcyBpcyB2aWEgdGhlIGBHb29nbGUuUHJvdG9idWZgCi1OdUdldCBwYWNrYWdlLiBKdXN0IGFkZCB0aGUgTnVHZXQgcGFja2FnZSB0byB5b3VyIFZTIHByb2plY3QuCi0KLUJlc2lkZXMgQyMgcnVudGltZSBsaWJyYXJ5LCB0aGUgTnVHZXQgcGFja2FnZSBhbHNvIGNvbnRhaW5zIAotcHJlY29tcGlsZWQgdmVyc2lvbiBvZiBgcHJvdG9jLmV4ZWAgYW5kIGEgY29weSBvZiB3ZWxsIGtub3duIGAucHJvdG9gCi1maWxlcyB1bmRlciB0aGUgcGFja2FnZSdzIGB0b29sc2AgZGlyZWN0b3J5LgotCi1UbyBnZW5lcmF0ZSBDIyBmaWxlcyBmcm9tIHlvdXIgYC5wcm90b2AgZmlsZXMsIGludm9rZSBgcHJvdG9jYCB3aXRoIHRoZSAKLWAtLWNzaGFycF9vdXRgIG9wdGlvbi4KLQotU3VwcG9ydGVkIHBsYXRmb3JtcwotPT09PT09PT09PT09PT09PT09PQotCi1UaGUgcnVudGltZSBsaWJyYXJ5IGlzIGJ1aWx0IGFzIGEgcG9ydGFibGUgY2xhc3MgbGlicmFyeSwgc3VwcG9ydGluZzoKLQotLSAuTkVUIDQuNQotLSBXaW5kb3dzIDgKLS0gV2luZG93cyBQaG9uZSBTaWx2ZXJsaWdodCA4Ci0tIFdpbmRvd3MgUGhvbmUgOC4xCi0tIC5ORVQgQ29yZQotCi1Zb3Ugc2hvdWxkIGJlIGFibGUgdG8gdXNlIFByb3RvY29sIEJ1ZmZlcnMgaW4gVmlzdWFsIFN0dWRpbyAyMDEyIGFuZAotYWxsIGxhdGVyIHZlcnNpb25zLiBUaGlzIGluY2x1ZGVzIGFsbCBjb2RlIGdlbmVyYXRlZCBieSBgcHJvdG9jYCwKLXdoaWNoIG9ubHkgdXNlcyBmZWF0dXJlcyBmcm9tIEMjIDMgYW5kIGVhcmxpZXIuCi0KLUJ1aWxkaW5nCi09PT09PT09PQotCi1PcGVuIHRoZSBgc3JjL0dvb2dsZS5Qcm90b2J1Zi5zbG5gIHNvbHV0aW9uIGluIFZpc3VhbCBTdHVkaW8gMjAxNSBvcgotbGF0ZXIuIFlvdSBzaG91bGQgYmUgYWJsZSB0byBydW4gdGhlIE5Vbml0IHRlc3QgZnJvbSBUZXN0IEV4cGxvcmVyCi0oeW91IG1pZ2h0IG5lZWQgdG8gaW5zdGFsbCBOVW5pdCBWaXN1YWwgU3R1ZGlvIGFkZC1pbikuCi0KLUFsdGhvdWdoICp1c2Vycyogb2YgdGhpcyBwcm9qZWN0IGFyZSBvbmx5IGV4cGVjdGVkIHRvIGhhdmUgVmlzdWFsCi1TdHVkaW8gMjAxMiBvciBsYXRlciwgKmRldmVsb3BlcnMqIG9mIHRoZSBsaWJyYXJ5IGFyZSByZXF1aXJlZCB0bwotaGF2ZSBWaXN1YWwgU3R1ZGlvIDIwMTUgb3IgbGF0ZXIsIGFzIHRoZSBsaWJyYXJ5IHVzZXMgQyMgNiBmZWF0dXJlcwotaW4gaXRzIGltcGxlbWVudGF0aW9uLiBUaGVzZSBmZWF0dXJlcyBoYXZlIG5vIGltcGFjdCB3aGVuIHVzaW5nIHRoZQotY29tcGlsZWQgY29kZSAtIHRoZXkncmUgb25seSByZWxldmFudCB3aGVuIGJ1aWxkaW5nIHRoZQotYEdvb2dsZS5Qcm90b2J1ZmAgYXNzZW1ibHkuCi0KLUhpc3Rvcnkgb2YgQyMgcHJvdG9idWZzCi09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGlzIHN1YnRyZWUgd2FzIG9yaWdpbmFsbHkgaW1wb3J0ZWQgZnJvbSBodHRwczovL2dpdGh1Yi5jb20vanNrZWV0L3Byb3RvYnVmLWNzaGFycC1wb3J0Ci1hbmQgcmVwcmVzZW50cyB0aGUgbGF0ZXN0IGRldmVsb3BtZW50IHZlcnNpb24gb2YgQyMgcHJvdG9idWZzLCB0aGF0IHdpbGwgbm93IGJlIGRldmVsb3BlZAotYW5kIG1haW50YWluZWQgYnkgR29vZ2xlLiBBbGwgdGhlIGRldmVsb3BtZW50IHdpbGwgYmUgZG9uZSBpbiBvcGVuLCB1bmRlciB0aGlzIHJlcG9zaXRvcnkKLShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmKS4KLQotVGhlIHByZXZpb3VzIHByb2plY3QgZGlmZmVycyBmcm9tIHRoaXMgcHJvamVjdCBpbiBhIG51bWJlciBvZiB3YXlzOgotCi0tIFRoZSBvbGQgY29kZSBvbmx5IHN1cHBvcnRlZCBwcm90bzI7IHRoZSBuZXcgY29kZSBvbmx5IHN1cHBvcnRzCi1wcm90bzMgKHNvIG5vIHVua25vd24gZmllbGRzLCBubyByZXF1aXJlZC9vcHRpb25hbCBkaXN0aW5jdGlvbiwgbm8KLWV4dGVuc2lvbnMpCi0tIFRoZSBvbGQgY29kZSB3YXMgYmFzZWQgb24gaW1tdXRhYmxlIG1lc3NhZ2UgdHlwZXMgYW5kIGJ1aWxkZXJzIGZvcgotdGhlbQotLSBUaGUgb2xkIGNvZGUgZGlkIG5vdCBzdXBwb3J0IG1hcHMgb3IgYG9uZW9mYAotLSBUaGUgb2xkIGNvZGUgaGFkIGl0cyBvd24gSlNPTiByZXByZXNlbnRhdGlvbiwgd2hlcmVhcyB0aGUgbmV3IGNvZGUKLXVzZXMgdGhlIHN0YW5kYXJkIHByb3RvYnVmIEpTT04gcmVwcmVzZW50YXRpb24KLS0gVGhlIG9sZCBjb2RlIGhhZCBubyBub3Rpb24gb2YgdGhlICJ3ZWxsLWtub3duIHR5cGVzIiB3aGljaCBoYXZlCi1zcGVjaWFsIHN1cHBvcnQgaW4gdGhlIG5ldyBjb2RlCi0tIFRoZSBvbGQgcHJvamVjdCBzdXBwb3J0ZWQgc29tZSBvbGRlciBwbGF0Zm9ybXMgKHN1Y2ggYXMgb2xkZXIKLXZlcnNpb25zIG9mIFNpbHZlcmxpZ2h0KSB3aGljaCBhcmUgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQgaW4gdGhlCi1uZXcgcHJvamVjdApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL2J1aWxkX3BhY2thZ2VzLmJhdCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9idWlsZF9wYWNrYWdlcy5iYXQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1MDJmMDYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL2J1aWxkX3BhY2thZ2VzLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDEzICswLDAgQEAKLUByZW0gQnVpbGRzIEdvb2dsZS5Qcm90b2J1ZiBOdUdldCBwYWNrYWdlcwotCi1AcmVtIEFkanVzdCB0aGUgbG9jYXRpb24gb2YgbnVnZXQuZXhlCi1zZXQgTlVHRVQ9QzpcbnVnZXRcbnVnZXQuZXhlCi0KLUByZW0gQnVpbGQgc3JjL0dvb2dsZS5Qcm90b2J1Zi5zbG4gc29sdXRpb24gaW4gUmVsZWFzZSBjb25maWd1cmF0aW9uIGZpcnN0LgotJU5VR0VUJSBwYWNrIHNyY1xHb29nbGUuUHJvdG9idWZcR29vZ2xlLlByb3RvYnVmLm51c3BlYyAtU3ltYm9scyB8fCBnb3RvIDplcnJvcgotCi1nb3RvIDpFT0YKLQotOmVycm9yCi1lY2hvIEZhaWxlZCEKLWV4aXQgL2IgJWVycm9ybGV2ZWwlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvYnVpbGRhbGwuc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvYnVpbGRhbGwuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDQ1YWY3MDUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL2J1aWxkYWxsLnNoCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyEvYmluL2Jhc2gKLSMgVXNlIG1vbm8gdG8gYnVpbGQgc29sdXRpb24gYW5kIHJ1biBhbGwgdGVzdHMuCi0KLSMgQWRqdXN0IHRoZXNlIHRvIHJlZmxlY3QgdGhlIGxvY2F0aW9uIG9mIG51bml0LWNvbnNvbGUgaW4geW91ciBzeXN0ZW0uCi1OVU5JVF9DT05TT0xFPW51bml0LWNvbnNvbGUKLQotIyBUaGUgcmVzdCB5b3UgY2FuIGxlYXZlIGludGFjdAotQ09ORklHPVJlbGVhc2UKLVNSQz0kKGRpcm5hbWUgJDApL3NyYwotCi1zZXQgLWV4Ci0KLWVjaG8gQnVpbGRpbmcgdGhlIHNvbHV0aW9uLgoteGJ1aWxkIC9wOkNvbmZpZ3VyYXRpb249JENPTkZJRyAkU1JDL0dvb2dsZS5Qcm90b2J1Zi5zbG4KLQotZWNobyBSdW5uaW5nIHRlc3RzLgotJE5VTklUX0NPTlNPTEUgJFNSQy9Hb29nbGUuUHJvdG9idWYuVGVzdC9iaW4vJENPTkZJRy9Hb29nbGUuUHJvdG9idWYuVGVzdC5kbGwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9nZW5lcmF0ZV9wcm90b3Muc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvZ2VuZXJhdGVfcHJvdG9zLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkOTc5YWE1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9nZW5lcmF0ZV9wcm90b3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi0jIS9iaW4vYmFzaAotIyBHZW5lcmF0ZXMgQyMgc291cmNlIGZpbGVzIGZyb20gLnByb3RvIGZpbGVzLgotIyBZb3UgZmlyc3QgbmVlZCB0byBtYWtlIHN1cmUgcHJvdG9jIGhhcyBiZWVuIGJ1aWx0IChzZWUgaW5zdHJ1Y3Rpb25zIG9uCi0jIGJ1aWxkaW5nIHByb3RvYyBpbiByb290IG9mIHRoaXMgcmVwb3NpdG9yeSkKLQotc2V0IC1leAotCi0jIGNkIHRvIHJlcG9zaXRvcnkgcm9vdAotcHVzaGQgJChkaXJuYW1lICQwKS8uLgotCi0jIFByb3RvY29sIGJ1ZmZlciBjb21waWxlciB0byB1c2UuIElmIHRoZSBQUk9UT0MgdmFyaWFibGUgaXMgc2V0LAotIyB1c2UgdGhhdC4gT3RoZXJ3aXNlLCBwcm9iZSBmb3IgZXhwZWN0ZWQgbG9jYXRpb25zIHVuZGVyIGJvdGgKLSMgV2luZG93cyBhbmQgVW5peC4KLWlmIFsgLXogIiRQUk9UT0MiIF07IHRoZW4KLSAgIyBUT0RPKGpvbnNrZWV0KTogVXNlIGFuIGFycmF5IGFuZCBhIGZvciBsb29wIGluc3RlYWQ/Ci0gIGlmIFsgLXggY21ha2UvYnVpbGQvRGVidWcvcHJvdG9jLmV4ZSBdOyB0aGVuCi0gICAgUFJPVE9DPWNtYWtlL2J1aWxkL0RlYnVnL3Byb3RvYy5leGUKLSAgZWxpZiBbIC14IGNtYWtlL2J1aWxkL1JlbGVhc2UvcHJvdG9jLmV4ZSBdOyB0aGVuCi0gICAgUFJPVE9DPWNtYWtlL2J1aWxkL1JlbGVhc2UvcHJvdG9jLmV4ZQotICBlbGlmIFsgLXggc3JjL3Byb3RvYyBdOyB0aGVuCi0gICAgUFJPVE9DPXNyYy9wcm90b2MKLSAgZWxzZQotICAgIGVjaG8gIlVuYWJsZSB0byBmaW5kIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4iCi0gICAgZXhpdCAxCi0gIGZpCi1maQotCi0jIGRlc2NyaXB0b3IucHJvdG8gYW5kIHdlbGwta25vd24gdHlwZXMKLSRQUk9UT0MgLUlzcmMgLS1jc2hhcnBfb3V0PWNzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmIFwKLSAgICAtLWNzaGFycF9vcHQ9YmFzZV9uYW1lc3BhY2U9R29vZ2xlLlByb3RvYnVmIFwKLSAgICBzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gXAotICAgIHNyYy9nb29nbGUvcHJvdG9idWYvYW55LnByb3RvIFwKLSAgICBzcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byBcCi0gICAgc3JjL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byBcCi0gICAgc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byBcCi0gICAgc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvIFwKLSAgICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIFwKLSAgICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byBcCi0gICAgc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8gXAotICAgIHNyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wcm90byBcCi0gICAgc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bwotCi0jIFRlc3QgcHJvdG9zIHdoZXJlIHRoZSBuYW1lc3BhY2UgbWF0Y2hlcyB0aGUgdGFyZ2V0IGxvY2F0aW9uCi0kUFJPVE9DIC1Jc3JjIC0tY3NoYXJwX291dD1jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0IFwKLSAgICAtLWNzaGFycF9vcHQ9YmFzZV9uYW1lc3BhY2U9R29vZ2xlLlByb3RvYnVmIFwKLSAgICBzcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdF9wcm90bzMucHJvdG8gXAotICAgIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnByb3RvIFwKLSAgICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wcm90bzMucHJvdG8gXAotICAgIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wcm90bzMucHJvdG8gXAotICAgIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90bwotCi0jIERpZmZlcmVudCBiYXNlIG5hbWVzcGFjZSB0byB0aGUgcHJvdG9zIGFib3ZlCi0kUFJPVE9DIC1JY3NoYXJwL3Byb3RvcyAtLWNzaGFycF9vdXQ9Y3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdCBcCi0gICAgLS1jc2hhcnBfb3B0PWJhc2VfbmFtZXNwYWNlPVVuaXRUZXN0Lklzc3VlcyBcCi0gICAgY3NoYXJwL3Byb3Rvcy91bml0dGVzdF9pc3N1ZXMucHJvdG8KLQotIyBBZGRyZXNzQm9vayBzYW1wbGUgcHJvdG9zCi0kUFJPVE9DIC1JZXhhbXBsZXMgLS1jc2hhcnBfb3V0PWNzaGFycC9zcmMvQWRkcmVzc0Jvb2sgXAotICAgIGV4YW1wbGVzL2FkZHJlc3Nib29rLnByb3RvCi0KLSRQUk9UT0MgLUljb25mb3JtYW5jZSAtSXNyYyAtLWNzaGFycF9vdXQ9Y3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UgXAotICAgIGNvbmZvcm1hbmNlL2NvbmZvcm1hbmNlLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAva2V5cy9Hb29nbGUuUHJvdG9idWYucHVibGljLnNuayBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9rZXlzL0dvb2dsZS5Qcm90b2J1Zi5wdWJsaWMuc25rCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OWNkMzY5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9rZXlzL0dvb2dsZS5Qcm90b2J1Zi5wdWJsaWMuc25rCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL2tleXMvR29vZ2xlLlByb3RvYnVmLnNuayBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9rZXlzL0dvb2dsZS5Qcm90b2J1Zi5zbmsKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc1MTU0NDMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL2tleXMvR29vZ2xlLlByb3RvYnVmLnNuaworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9rZXlzL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9rZXlzL1JFQURNRS5tZApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWRlNjczNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAva2V5cy9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSw5ICswLDAgQEAKLUNvbnRlbnRzCi0tLS0tLS0tLQotCi0tIEdvb2dsZS5Qcm90b2J1Zi5wdWJsaWMuc25rOgotICBQdWJsaWMga2V5IHRvIHZlcmlmeSBzdHJvbmcgbmFtZSBvZiBHb29nbGUuUHJvdG9idWYgYXNzZW1ibGllcy4KLS0gR29vZ2xlLlByb3RvYnVmLnNuazoKLSAgU2lnbmluZyBrZXkgdG8gcHJvdmlkZSBzdHJvbmcgbmFtZSBvZiBHb29nbGUuUHJvdG9idWYgYXNzZW1ibGllcy4KLSAgQXMgcGVyIFtNaWNyb3NvZnQgZ3VpZGFuY2VdKGh0dHBzOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvd2Q0MHQ3YWQodj12cy4xMTApLmFzcHgpCi0gIHNpZ25pbmcga2V5IHNob3VsZCBiZSBjaGVja2VkIGludG8gdGhlIHJlcG9zaXRvcnkuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvcHJvdG9zL3VuaXR0ZXN0X2lzc3Vlcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9wcm90b3MvdW5pdHRlc3RfaXNzdWVzLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzlmNzYzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9wcm90b3MvdW5pdHRlc3RfaXNzdWVzLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTI2ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi0vLyBUaGVzZSBwcm90byBkZXNjcmlwdG9ycyBoYXZlIGF0IG9uZSB0aW1lIGJlZW4gcmVwb3J0ZWQgYXMgYW4gaXNzdWUgb3IgZGVmZWN0LgotLy8gVGhleSBhcmUga2VwdCBoZXJlIHRvIHJlcGxpY2F0ZSB0aGUgaXNzdWUsIGFuZCBjb250aW51ZSB0byB2ZXJpZnkgdGhlIGZpeC4KLQotLy8gSXNzdWU6IE5vbi0iR29vZ2xlLlByb3RvYnVmZmVycyIgbmFtZXNwYWNlIHdpbGwgZW5zdXJlIHRoYXQgcHJvdG9idWZmZXIgbGlicmFyeSB0eXBlcyBhcmUgcXVhbGlmaWVkCi1vcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3RvcyI7Ci0KLXBhY2thZ2UgdW5pdHRlc3RfaXNzdWVzOwotb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOwotCi0vLyBJc3N1ZSAzMDc6IHdoZW4gZ2VuZXJhdGluZyBkb3VibHktbmVzdGVkIHR5cGVzLCBhbnkgcmVmZXJlbmNlcwotLy8gc2hvdWxkIGJlIG9mIHRoZSBmb3JtIEEuVHlwZXMuQi5UeXBlcy5DLgotbWVzc2FnZSBJc3N1ZTMwNyB7Ci0gIG1lc3NhZ2UgTmVzdGVkT25jZSB7Ci0gICAgbWVzc2FnZSBOZXN0ZWRUd2ljZSB7Ci0gICAgfQotICB9Ci19Ci0KLS8vIE9sZCBpc3N1ZSAxMzogaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLWNzaGFycC1wb3J0L2lzc3Vlcy9kZXRhaWw/aWQ9MTMKLS8vIE5ldyBpc3N1ZSAzMDk6IGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvaXNzdWVzLzMwOQotIAotLy8gbWVzc2FnZSBBIHsKLS8vICAgIG9wdGlvbmFsIGludDMyIF9BID0gMTsKLS8vIH0KLQotLy8gbWVzc2FnZSBCIHsKLS8vICAgIG9wdGlvbmFsIGludDMyIEJfID0gMTsKLS8vIH0KLQotLy9tZXNzYWdlIEFCIHsKLS8vICAgIG9wdGlvbmFsIGludDMyIGFfYiA9IDE7Ci0vL30KLQotLy8gU2ltaWxhciBpc3N1ZSB3aXRoIG51bWVyaWMgbmFtZXMKLS8vIEphdmEgY29kZSBmYWlsZWQgdG9vLCBzbyBwcm9iYWJseSBiZXN0IGZvciB0aGlzIHRvIGJlIGEgcmVzdHJpY3Rpb24uCi0vLyBTZWUgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi9pc3N1ZXMvMzA4Ci0vLyBtZXNzYWdlIE51bWJlckZpZWxkIHsKLS8vICAgIG9wdGlvbmFsIGludDMyIF8wMSA9IDE7Ci0vLyB9Ci0KLS8vIGlzc3VlIDE5IC0gbmVnYXRpdmUgZW51bSB2YWx1ZXMKLQotZW51bSBOZWdhdGl2ZUVudW0gewotICAgIE5FR0FUSVZFX0VOVU1fWkVSTyA9IDA7Ci0gICAgRml2ZUJlbG93ID0gLTU7Ci0gICAgTWludXNPbmUgPSAtMTsKLX0KLQotbWVzc2FnZSBOZWdhdGl2ZUVudW1NZXNzYWdlIHsKLSAgICBOZWdhdGl2ZUVudW0gdmFsdWUgPSAxOwotICAgIHJlcGVhdGVkIE5lZ2F0aXZlRW51bSB2YWx1ZXMgPSAyIFtwYWNrZWQgPSBmYWxzZV07Ci0gICAgcmVwZWF0ZWQgTmVnYXRpdmVFbnVtIHBhY2tlZF92YWx1ZXMgPSAzIFtwYWNrZWQ9dHJ1ZV07Ci19Ci0KLS8vIElzc3VlIDIxOiBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYtY3NoYXJwLXBvcnQvaXNzdWVzL2RldGFpbD9pZD0yMQotLy8gRGVjb3JhdGUgZmllbGRzIHdpdGggW2RlcHJlY2F0ZWQ9dHJ1ZV0gYXMgW1N5c3RlbS5PYnNvbGV0ZV0KLQotbWVzc2FnZSBEZXByZWNhdGVkQ2hpbGQgewotfQotCi1lbnVtIERlcHJlY2F0ZWRFbnVtIHsKLSAgICBERVBSRUNBVEVEX1pFUk8gPSAwOwotICAgIG9uZSA9IDE7Ci19Ci0KLW1lc3NhZ2UgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgewotICAgIGludDMyIFByaW1pdGl2ZVZhbHVlID0gMSBbZGVwcmVjYXRlZCA9IHRydWVdOwotICAgIHJlcGVhdGVkIGludDMyIFByaW1pdGl2ZUFycmF5ID0gMiBbZGVwcmVjYXRlZCA9IHRydWVdOwotCi0gICAgRGVwcmVjYXRlZENoaWxkIE1lc3NhZ2VWYWx1ZSA9IDMgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKLSAgICByZXBlYXRlZCBEZXByZWNhdGVkQ2hpbGQgTWVzc2FnZUFycmF5ID0gNCBbZGVwcmVjYXRlZCA9IHRydWVdOwotCi0gICAgRGVwcmVjYXRlZEVudW0gRW51bVZhbHVlID0gNSBbZGVwcmVjYXRlZCA9IHRydWVdOwotICAgIHJlcGVhdGVkIERlcHJlY2F0ZWRFbnVtIEVudW1BcnJheSA9IDYgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKLX0KLQotLy8gSXNzdWUgNDU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi1jc2hhcnAtcG9ydC9pc3N1ZXMvZGV0YWlsP2lkPTQ1Ci1tZXNzYWdlIEl0ZW1GaWVsZCB7Ci0gIGludDMyIGl0ZW0gPSAxOwotfQotCi1tZXNzYWdlIFJlc2VydmVkTmFtZXMgewotICAvLyBGb3JjZSBhIG5lc3RlZCB0eXBlIGNhbGxlZCBUeXBlcwotICBtZXNzYWdlIFNvbWVOZXN0ZWRUeXBlIHsKLSAgfQotCi0gIGludDMyIHR5cGVzID0gMTsKLSAgaW50MzIgZGVzY3JpcHRvciA9IDI7Ci19Ci0KLW1lc3NhZ2UgVGVzdEpzb25GaWVsZE9yZGVyaW5nIHsKLSAgLy8gVGhlc2UgZmllbGRzIGFyZSBkZWxpYmVyYXRlbHkgbm90IGRlY2xhcmVkIGluIG51bWVyaWMKLSAgLy8gb3JkZXIsIGFuZCB0aGUgb25lb2YgZmllbGRzIGFyZW4ndCBjb250aWd1b3VzIGVpdGhlci4KLSAgLy8gVGhpcyBhbGxvd3MgZm9yIHJlYXNvbmFibHkgcm9idXN0IHRlc3RzIG9mIEpTT04gb3V0cHV0Ci0gIC8vIG9yZGVyaW5nLgotICAvLyBUZXN0RmllbGRPcmRlcmluZ3MgaW4gdW5pdHRlc3RfcHJvdG8zLnByb3RvIGlzIHNpbWlsYXIsCi0gIC8vIGJ1dCBkb2Vzbid0IGluY2x1ZGUgb25lb2ZzLgotICAvLyBUT0RPOiBDb25zaWRlciBhZGRpbmcgb25lb2ZzIHRvIFRlc3RGaWVsZE9yZGVyaW5ncywgYWx0aG91Z2gKLSAgLy8gdGhhdCB3aWxsIHJlcXVpcmUgZml4aW5nIG90aGVyIHRlc3RzIGluIG11bHRpcGxlIHBsYXRmb3Jtcy4KLSAgLy8gQWx0ZXJuYXRpdmVseSwgY29uc2lkZXIganVzdCBhZGRpbmcgdGhpcyB0bwotICAvLyB1bml0dGVzdF9wcm90bzMucHJvdG8gaWYgbXVsdGlwbGUgcGxhdGZvcm1zIHdhbnQgaXQuCi0gIAotICBpbnQzMiBwbGFpbl9pbnQzMiA9IDQ7Ci0KLSAgb25lb2YgbzEgewotICAgIHN0cmluZyBvMV9zdHJpbmcgPSAyOwotICAgIGludDMyIG8xX2ludDMyID0gNTsKLSAgfQotICAKLSAgc3RyaW5nIHBsYWluX3N0cmluZyA9IDE7Ci0gIAotICBvbmVvZiBvMiB7Ci0gICAgaW50MzIgbzJfaW50MzIgPSA2OwotICAgIHN0cmluZyBvMl9zdHJpbmcgPSAzOwotICB9Ci0gIAotfQotCi1tZXNzYWdlIFRlc3RKc29uTmFtZSB7Ci0gIC8vIE1lc3NhZ2UgZm9yIHRlc3RpbmcgdGhlIGVmZmVjdHMgZm9yIG9mIHRoZSBqc29uX25hbWUgb3B0aW9uCi0gIHN0cmluZyBuYW1lID0gMTsKLSAgc3RyaW5nIGRlc2NyaXB0aW9uID0gMiBbanNvbl9uYW1lID0gImRlc2MiXTsKLSAgc3RyaW5nIGd1aWQgPSAzIFtqc29uX25hbWUgPSAiZXhpZCJdOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9BZGRQZXJzb24uY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZFBlcnNvbi5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDg0ZjFlYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZFBlcnNvbi5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uSU87Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2sKLXsKLSAgICBpbnRlcm5hbCBjbGFzcyBBZGRQZXJzb24KLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJ1aWxkcyBhIHBlcnNvbiBiYXNlZCBvbiB1c2VyIGlucHV0Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIFBlcnNvbiBQcm9tcHRGb3JBZGRyZXNzKFRleHRSZWFkZXIgaW5wdXQsIFRleHRXcml0ZXIgb3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBQZXJzb24gcGVyc29uID0gbmV3IFBlcnNvbigpOwotCi0gICAgICAgICAgICBvdXRwdXQuV3JpdGUoIkVudGVyIHBlcnNvbiBJRDogIik7Ci0gICAgICAgICAgICBwZXJzb24uSWQgPSBpbnQuUGFyc2UoaW5wdXQuUmVhZExpbmUoKSk7Ci0KLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZSgiRW50ZXIgbmFtZTogIik7Ci0gICAgICAgICAgICBwZXJzb24uTmFtZSA9IGlucHV0LlJlYWRMaW5lKCk7Ci0KLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZSgiRW50ZXIgZW1haWwgYWRkcmVzcyAoYmxhbmsgZm9yIG5vbmUpOiAiKTsKLSAgICAgICAgICAgIHN0cmluZyBlbWFpbCA9IGlucHV0LlJlYWRMaW5lKCk7Ci0gICAgICAgICAgICBpZiAoZW1haWwuTGVuZ3RoID4gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwZXJzb24uRW1haWwgPSBlbWFpbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKCJFbnRlciBhIHBob25lIG51bWJlciAob3IgbGVhdmUgYmxhbmsgdG8gZmluaXNoKTogIik7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIG51bWJlciA9IGlucHV0LlJlYWRMaW5lKCk7Ci0gICAgICAgICAgICAgICAgaWYgKG51bWJlci5MZW5ndGggPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIFBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciBwaG9uZU51bWJlciA9IG5ldyBQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIgeyBOdW1iZXIgPSBudW1iZXIgfTsKLQotICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZSgiSXMgdGhpcyBhIG1vYmlsZSwgaG9tZSwgb3Igd29yayBwaG9uZT8gIik7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIHR5cGUgPSBpbnB1dC5SZWFkTGluZSgpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIm1vYmlsZSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlci5UeXBlID0gUGVyc29uLlR5cGVzLlBob25lVHlwZS5Nb2JpbGU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAiaG9tZSI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBwaG9uZU51bWJlci5UeXBlID0gUGVyc29uLlR5cGVzLlBob25lVHlwZS5Ib21lOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgIndvcmsiOgotICAgICAgICAgICAgICAgICAgICAgICAgcGhvbmVOdW1iZXIuVHlwZSA9IFBlcnNvbi5UeXBlcy5QaG9uZVR5cGUuV29yazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKCJVbmtub3duIHBob25lIHR5cGUuIFVzaW5nIGRlZmF1bHQuIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwZXJzb24uUGhvbmVzLkFkZChwaG9uZU51bWJlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcGVyc29uOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRW50cnkgcG9pbnQgLSBsb2FkcyBhbiBleGlzdGluZyBhZGRyZXNzYm9vayBvciBjcmVhdGVzIGEgbmV3IG9uZSwKLSAgICAgICAgLy8vIHRoZW4gd3JpdGVzIGl0IGJhY2sgdG8gdGhlIGZpbGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoICE9IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIlVzYWdlOiAgQWRkUGVyc29uIEFERFJFU1NfQk9PS19GSUxFIik7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBZGRyZXNzQm9vayBhZGRyZXNzQm9vazsKLQotICAgICAgICAgICAgaWYgKEZpbGUuRXhpc3RzKGFyZ3NbMF0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gZmlsZSA9IEZpbGUuT3BlblJlYWQoYXJnc1swXSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBhZGRyZXNzQm9vayA9IEFkZHJlc3NCb29rLlBhcnNlci5QYXJzZUZyb20oZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH06IEZpbGUgbm90IGZvdW5kLiBDcmVhdGluZyBhIG5ldyBmaWxlLiIsIGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgIGFkZHJlc3NCb29rID0gbmV3IEFkZHJlc3NCb29rKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIEFkZCBhbiBhZGRyZXNzLgotICAgICAgICAgICAgYWRkcmVzc0Jvb2suUGVvcGxlLkFkZChQcm9tcHRGb3JBZGRyZXNzKENvbnNvbGUuSW4sIENvbnNvbGUuT3V0KSk7Ci0KLSAgICAgICAgICAgIC8vIFdyaXRlIHRoZSBuZXcgYWRkcmVzcyBib29rIGJhY2sgdG8gZGlzay4KLSAgICAgICAgICAgIHVzaW5nIChTdHJlYW0gb3V0cHV0ID0gRmlsZS5PcGVuV3JpdGUoYXJnc1swXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYWRkcmVzc0Jvb2suV3JpdGVUbyhvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9BZGRyZXNzQm9vay5jc3Byb2ogYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZHJlc3NCb29rLmNzcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDIxNjQ3Zi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZHJlc3NCb29rLmNzcHJvagorKysgL2Rldi9udWxsCkBAIC0xLDc1ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08UHJvamVjdCBUb29sc1ZlcnNpb249IjQuMCIgRGVmYXVsdFRhcmdldHM9IkJ1aWxkIiB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9kZXZlbG9wZXIvbXNidWlsZC8yMDAzIj4KLSAgPFByb3BlcnR5R3JvdXA+Ci0gICAgPENvbmZpZ3VyYXRpb24gQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbiknID09ICcnICI+RGVidWc8L0NvbmZpZ3VyYXRpb24+Ci0gICAgPFBsYXRmb3JtIENvbmRpdGlvbj0iICckKFBsYXRmb3JtKScgPT0gJycgIj5BbnlDUFU8L1BsYXRmb3JtPgotICAgIDxQcm9kdWN0VmVyc2lvbj45LjAuMzA3Mjk8L1Byb2R1Y3RWZXJzaW9uPgotICAgIDxTY2hlbWFWZXJzaW9uPjIuMDwvU2NoZW1hVmVyc2lvbj4KLSAgICA8UHJvamVjdEd1aWQ+e0EzMUY1RkIyLTRGRjMtNDMyQS1CMzVCLTVDRDIwMzYwNjMxMX08L1Byb2plY3RHdWlkPgotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFkZHJlc3NCb29rPC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+QWRkcmVzc0Jvb2s8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgICA8U3RhcnR1cE9iamVjdD5Hb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUHJvZ3JhbTwvU3RhcnR1cE9iamVjdD4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KLSAgICA8L1RhcmdldEZyYW1ld29ya1Byb2ZpbGU+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+Ci0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+Ci0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWc8L091dHB1dFBhdGg+Ci0gICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlPC9PdXRwdXRQYXRoPgotICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5EYXRhIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQWRkUGVyc29uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkFkZHJlc3Nib29rLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZVVzYWdlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ikxpc3RQZW9wbGUuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cR29vZ2xlLlByb3RvYnVmXEdvb2dsZS5Qcm90b2J1Zi5jc3Byb2oiPgotICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+Ci0gICAgICA8TmFtZT5Hb29nbGUuUHJvdG9idWY8L05hbWU+Ci0gICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Tm9uZSBJbmNsdWRlPSJhcHAuY29uZmlnIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZHJlc3Nib29rLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9BZGRyZXNzYm9vay5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzYyZTFjYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL0FkZHJlc3Nib29rLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDczICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGFkZHJlc3Nib29rLnByb3RvCi0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxCi0jcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCi0KLXVzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWY7Ci11c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5Db2xsZWN0aW9uczsKLXVzaW5nIHBiciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb247Ci11c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vayB7Ci0KLSAgLy8vIDxzdW1tYXJ5PkhvbGRlciBmb3IgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZnJvbSBhZGRyZXNzYm9vay5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIEFkZHJlc3Nib29rUmVmbGVjdGlvbiB7Ci0KLSAgICAjcmVnaW9uIERlc2NyaXB0b3IKLSAgICAvLy8gPHN1bW1hcnk+RmlsZSBkZXNjcmlwdG9yIGZvciBhZGRyZXNzYm9vay5wcm90bzwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICBzdGF0aWMgQWRkcmVzc2Jvb2tSZWZsZWN0aW9uKCkgewotICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKAotICAgICAgICAgIHN0cmluZy5Db25jYXQoCi0gICAgICAgICAgICAiQ2hGaFpHUnlaWE56WW05dmF5NXdjbTkwYnhJSWRIVjBiM0pwWVd3aTFRRUtCbEJsY25OdmJoSU1DZ1J1IiwKLSAgICAgICAgICAgICJZVzFsR0FFZ0FTZ0pFZ29LQW1sa0dBSWdBU2dGRWcwS0JXVnRZV2xzR0FNZ0FTZ0pFaXdLQm5Cb2IyNWwiLAotICAgICAgICAgICAgImN4Z0VJQU1vQ3pJY0xuUjFkRzl5YVdGc0xsQmxjbk52Ymk1UWFHOXVaVTUxYldKbGNocEhDZ3RRYUc5dSIsCi0gICAgICAgICAgICAiWlU1MWJXSmxjaElPQ2dadWRXMWlaWElZQVNBQktBa1NLQW9FZEhsd1pSZ0NJQUVvRGpJYUxuUjFkRzl5IiwKLSAgICAgICAgICAgICJhV0ZzTGxCbGNuTnZiaTVRYUc5dVpWUjVjR1VpS3dvSlVHaHZibVZVZVhCbEVnb0tCazFQUWtsTVJSQUEiLAotICAgICAgICAgICAgIkVnZ0tCRWhQVFVVUUFSSUlDZ1JYVDFKTEVBSWlMd29MUVdSa2NtVnpjMEp2YjJzU0lBb0djR1Z2Y0d4bCIsCi0gICAgICAgICAgICAiR0FFZ0F5Z0xNaEF1ZEhWMGIzSnBZV3d1VUdWeWMyOXVRbEFLRkdOdmJTNWxlR0Z0Y0d4bExuUjFkRzl5IiwKLSAgICAgICAgICAgICJhV0ZzUWhGQlpHUnlaWE56UW05dmExQnliM1J2YzZvQ0pFZHZiMmRzWlM1UWNtOTBiMkoxWmk1RmVHRnQiLAotICAgICAgICAgICAgImNHeGxjeTVCWkdSeVpYTnpRbTl2YTJJR2NISnZkRzh6IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlBhcnNlciwgbmV3W117ICJOYW1lIiwgIklkIiwgIkVtYWlsIiwgIlBob25lcyIgfSwgbnVsbCwgbmV3W117IHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVUeXBlKSB9LCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlci5QYXJzZXIsIG5ld1tdeyAiTnVtYmVyIiwgIlR5cGUiIH0sIG51bGwsIG51bGwsIG51bGwpfSksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suQWRkcmVzc0Jvb2spLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5BZGRyZXNzQm9vay5QYXJzZXIsIG5ld1tdeyAiUGVvcGxlIiB9LCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgIH0pKTsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgW1NUQVJUIG1lc3NhZ2VzXQotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgUGVyc29uIDogcGI6OklNZXNzYWdlPFBlcnNvbj4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFBlcnNvbj4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxQZXJzb24+KCgpID0+IG5ldyBQZXJzb24oKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxQZXJzb24+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5BZGRyZXNzYm9va1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbigpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgUGVyc29uKFBlcnNvbiBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgIGlkXyA9IG90aGVyLmlkXzsKLSAgICAgIGVtYWlsXyA9IG90aGVyLmVtYWlsXzsKLSAgICAgIHBob25lc18gPSBvdGhlci5waG9uZXNfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFBlcnNvbiBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgUGVyc29uKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiaWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IElkRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgaW50IGlkXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBVbmlxdWUgSUQgbnVtYmVyIGZvciB0aGlzIHBlcnNvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnQgSWQgewotICAgICAgZ2V0IHsgcmV0dXJuIGlkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgaWRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJlbWFpbCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRW1haWxGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgZW1haWxfID0gIiI7Ci0gICAgcHVibGljIHN0cmluZyBFbWFpbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZW1haWxfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBlbWFpbF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwaG9uZXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBob25lc0ZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXI+IF9yZXBlYXRlZF9waG9uZXNfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDM0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVOdW1iZXI+IHBob25lc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlcj4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZU51bWJlcj4gUGhvbmVzIHsKLSAgICAgIGdldCB7IHJldHVybiBwaG9uZXNfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBQZXJzb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhQZXJzb24gb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKE5hbWUgIT0gb3RoZXIuTmFtZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKElkICE9IG90aGVyLklkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRW1haWwgIT0gb3RoZXIuRW1haWwpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwaG9uZXNfLkVxdWFscyhvdGhlci5waG9uZXNfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IE5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChJZCAhPSAwKSBoYXNoIF49IElkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRW1haWwuTGVuZ3RoICE9IDApIGhhc2ggXj0gRW1haWwuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGhvbmVzXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoSWQgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihJZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoRW1haWwuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKEVtYWlsKTsKLSAgICAgIH0KLSAgICAgIHBob25lc18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9waG9uZXNfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChJZCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKElkKTsKLSAgICAgIH0KLSAgICAgIGlmIChFbWFpbC5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoRW1haWwpOwotICAgICAgfQotICAgICAgc2l6ZSArPSBwaG9uZXNfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3Bob25lc19jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oUGVyc29uIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5JZCAhPSAwKSB7Ci0gICAgICAgIElkID0gb3RoZXIuSWQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRW1haWwuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgRW1haWwgPSBvdGhlci5FbWFpbDsKLSAgICAgIH0KLSAgICAgIHBob25lc18uQWRkKG90aGVyLnBob25lc18pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgSWQgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI2OiB7Ci0gICAgICAgICAgICBFbWFpbCA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDM0OiB7Ci0gICAgICAgICAgICBwaG9uZXNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcGhvbmVzX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBQZXJzb24gbWVzc2FnZSB0eXBlLjwvc3VtbWFyeT4KLSAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7Ci0gICAgICBwdWJsaWMgZW51bSBQaG9uZVR5cGUgewotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIk1PQklMRSIpXSBNb2JpbGUgPSAwLAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkhPTUUiKV0gSG9tZSA9IDEsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiV09SSyIpXSBXb3JrID0gMiwKLSAgICAgIH0KLQotICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBQaG9uZU51bWJlciA6IHBiOjpJTWVzc2FnZTxQaG9uZU51bWJlcj4gewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxQaG9uZU51bWJlcj4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxQaG9uZU51bWJlcj4oKCkgPT4gbmV3IFBob25lTnVtYmVyKCkpOwotICAgICAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFBob25lTnVtYmVyPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQaG9uZU51bWJlcigpIHsKLSAgICAgICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICAgICAgcHVibGljIFBob25lTnVtYmVyKFBob25lTnVtYmVyIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICAgICAgbnVtYmVyXyA9IG90aGVyLm51bWJlcl87Ci0gICAgICAgICAgdHlwZV8gPSBvdGhlci50eXBlXzsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBQaG9uZU51bWJlciBDbG9uZSgpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFBob25lTnVtYmVyKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJudW1iZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNvbnN0IGludCBOdW1iZXJGaWVsZE51bWJlciA9IDE7Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIG51bWJlcl8gPSAiIjsKLSAgICAgICAgcHVibGljIHN0cmluZyBOdW1iZXIgewotICAgICAgICAgIGdldCB7IHJldHVybiBudW1iZXJfOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIG51bWJlcl8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ0eXBlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVHlwZUZpZWxkTnVtYmVyID0gMjsKLSAgICAgICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24uVHlwZXMuUGhvbmVUeXBlIHR5cGVfID0gMDsKLSAgICAgICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFkZHJlc3NCb29rLlBlcnNvbi5UeXBlcy5QaG9uZVR5cGUgVHlwZSB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVfOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIHR5cGVfID0gdmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgUGhvbmVOdW1iZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKFBob25lTnVtYmVyIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoTnVtYmVyICE9IG90aGVyLk51bWJlcikgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlmIChUeXBlICE9IG90aGVyLlR5cGUpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgICAgIGlmIChOdW1iZXIuTGVuZ3RoICE9IDApIGhhc2ggXj0gTnVtYmVyLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgICAgaWYgKFR5cGUgIT0gMCkgaGFzaCBePSBUeXBlLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgICAgICBpZiAoTnVtYmVyLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKE51bWJlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChUeXBlICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNik7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpIFR5cGUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgaWYgKE51bWJlci5MZW5ndGggIT0gMCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE51bWJlcik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChUeXBlICE9IDApIHsKLSAgICAgICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgVHlwZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFBob25lTnVtYmVyIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG90aGVyLk51bWJlci5MZW5ndGggIT0gMCkgewotICAgICAgICAgICAgTnVtYmVyID0gb3RoZXIuTnVtYmVyOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAob3RoZXIuVHlwZSAhPSAwKSB7Ci0gICAgICAgICAgICBUeXBlID0gb3RoZXIuVHlwZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgICAgICB1aW50IHRhZzsKLSAgICAgICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgICAgIE51bWJlciA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICAgICAgdHlwZV8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlR5cGVzLlBob25lVHlwZSkgaW5wdXQuUmVhZEVudW0oKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgT3VyIGFkZHJlc3MgYm9vayBmaWxlIGlzIGp1c3Qgb25lIG9mIHRoZXNlLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQWRkcmVzc0Jvb2sgOiBwYjo6SU1lc3NhZ2U8QWRkcmVzc0Jvb2s+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxBZGRyZXNzQm9vaz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxBZGRyZXNzQm9vaz4oKCkgPT4gbmV3IEFkZHJlc3NCb29rKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8QWRkcmVzc0Jvb2s+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5BZGRyZXNzYm9va1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEFkZHJlc3NCb29rKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBBZGRyZXNzQm9vayhBZGRyZXNzQm9vayBvdGhlcikgOiB0aGlzKCkgewotICAgICAgcGVvcGxlXyA9IG90aGVyLnBlb3BsZV8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQWRkcmVzc0Jvb2sgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEFkZHJlc3NCb29rKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicGVvcGxlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQZW9wbGVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uPiBfcmVwZWF0ZWRfcGVvcGxlX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgxMCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2suUGVyc29uPiBwZW9wbGVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vay5QZXJzb24+IFBlb3BsZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGVvcGxlXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgQWRkcmVzc0Jvb2spOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhBZGRyZXNzQm9vayBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZighcGVvcGxlXy5FcXVhbHMob3RoZXIucGVvcGxlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IHBlb3BsZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgcGVvcGxlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3Blb3BsZV9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSBwZW9wbGVfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3Blb3BsZV9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oQWRkcmVzc0Jvb2sgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBlb3BsZV8uQWRkKG90aGVyLnBlb3BsZV8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIHBlb3BsZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9wZW9wbGVfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLX0KLQotI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9MaXN0UGVvcGxlLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9BZGRyZXNzQm9vay9MaXN0UGVvcGxlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MTU3MjI4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svTGlzdFBlb3BsZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5FeGFtcGxlcy5BZGRyZXNzQm9vawotewotICAgIGludGVybmFsIGNsYXNzIExpc3RQZW9wbGUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEl0ZXJhdGVzIHRob3VnaCBhbGwgcGVvcGxlIGluIHRoZSBBZGRyZXNzQm9vayBhbmQgcHJpbnRzIGluZm8gYWJvdXQgdGhlbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBQcmludChBZGRyZXNzQm9vayBhZGRyZXNzQm9vaykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAoUGVyc29uIHBlcnNvbiBpbiBhZGRyZXNzQm9vay5QZW9wbGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIlBlcnNvbiBJRDogezB9IiwgcGVyc29uLklkKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBOYW1lOiB7MH0iLCBwZXJzb24uTmFtZSk7Ci0gICAgICAgICAgICAgICAgaWYgKHBlcnNvbi5FbWFpbCAhPSAiIikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIEUtbWFpbCBhZGRyZXNzOiB7MH0iLCBwZXJzb24uRW1haWwpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKFBlcnNvbi5UeXBlcy5QaG9uZU51bWJlciBwaG9uZU51bWJlciBpbiBwZXJzb24uUGhvbmVzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoIChwaG9uZU51bWJlci5UeXBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFBlcnNvbi5UeXBlcy5QaG9uZVR5cGUuTW9iaWxlOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGUoIiAgTW9iaWxlIHBob25lICM6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQZXJzb24uVHlwZXMuUGhvbmVUeXBlLkhvbWU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiICBIb21lIHBob25lICM6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBQZXJzb24uVHlwZXMuUGhvbmVUeXBlLldvcms6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZSgiICBXb3JrIHBob25lICM6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKHBob25lTnVtYmVyLk51bWJlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRW50cnkgcG9pbnQgLSBsb2FkcyB0aGUgYWRkcmVzc2Jvb2sgYW5kIHRoZW4gZGlzcGxheXMgaXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IE1haW4oc3RyaW5nW10gYXJncykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFyZ3MuTGVuZ3RoICE9IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIlVzYWdlOiAgTGlzdFBlb3BsZSBBRERSRVNTX0JPT0tfRklMRSIpOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIUZpbGUuRXhpc3RzKGFyZ3NbMF0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJ7MH0gZG9lc24ndCBleGlzdC4gQWRkIGEgcGVyc29uIHRvIGNyZWF0ZSB0aGUgZmlsZSBmaXJzdC4iLCBhcmdzWzBdKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gUmVhZCB0aGUgZXhpc3RpbmcgYWRkcmVzcyBib29rLgotICAgICAgICAgICAgdXNpbmcgKFN0cmVhbSBzdHJlYW0gPSBGaWxlLk9wZW5SZWFkKGFyZ3NbMF0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZHJlc3NCb29rIGFkZHJlc3NCb29rID0gQWRkcmVzc0Jvb2suUGFyc2VyLlBhcnNlRnJvbShzdHJlYW0pOwotICAgICAgICAgICAgICAgIFByaW50KGFkZHJlc3NCb29rKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svUHJvZ3JhbS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svUHJvZ3JhbS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODE2NGY0NC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL1Byb2dyYW0uY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5NSArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuRXhhbXBsZXMuQWRkcmVzc0Jvb2sKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEVudHJ5IHBvaW50LiBSZXBlYXRlZGx5IHByb21wdHMgdXNlciBmb3IgYW4gYWN0aW9uIHRvIHRha2UsIGRlbGVnYXRpbmcgYWN0dWFsIGJlaGF2aW91cgotICAgIC8vLyB0byBpbmRpdmlkdWFsIGFjdGlvbnMuIEVhY2ggYWN0aW9uIGhhcyBpdHMgb3duIE1haW4gbWV0aG9kLCBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGFzIGFuCi0gICAgLy8vIGludmlkdWFsIGNvbXBsZXRlIHByb2dyYW0uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBjbGFzcyBQcm9ncmFtCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggPiAxKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJVc2FnZTogQWRkcmVzc0Jvb2sgW2ZpbGVdIik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIklmIHRoZSBmaWxlbmFtZSBpc24ndCBzcGVjaWZpZWQsIFwiYWRkcmVzc2Jvb2suZGF0YVwiIGlzIHVzZWQgaW5zdGVhZC4iKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN0cmluZyBhZGRyZXNzQm9va0ZpbGUgPSBhcmdzLkxlbmd0aCA+IDAgPyBhcmdzWzBdIDogImFkZHJlc3Nib29rLmRhdGEiOwotCi0gICAgICAgICAgICBib29sIHN0b3BwaW5nID0gZmFsc2U7Ci0gICAgICAgICAgICB3aGlsZSAoIXN0b3BwaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCJPcHRpb25zOiIpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIEw6IExpc3QgY29udGVudHMiKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiICBBOiBBZGQgbmV3IHBlcnNvbiIpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCIgIFE6IFF1aXQiKTsKLSAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlKCJBY3Rpb24/ICIpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuT3V0LkZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgY2hhciBjaG9pY2UgPSBDb25zb2xlLlJlYWRLZXkoKS5LZXlDaGFyOwotICAgICAgICAgICAgICAgIENvbnNvbGUuV3JpdGVMaW5lKCk7Ci0gICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGNob2ljZSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnQSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdhJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRQZXJzb24uTWFpbihuZXcgc3RyaW5nW10ge2FkZHJlc3NCb29rRmlsZX0pOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnTCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdsJzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBMaXN0UGVvcGxlLk1haW4obmV3IHN0cmluZ1tdIHthZGRyZXNzQm9va0ZpbGV9KTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1EnOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAncSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcHBpbmcgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zb2xlLldyaXRlTGluZSgiVW5rbm93biBvcHRpb246IHswfSIsIGNob2ljZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoIkV4Y2VwdGlvbiBleGVjdXRpbmcgYWN0aW9uOiB7MH0iLCBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNDUyZjdhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svUHJvcGVydGllcy9Bc3NlbWJseUluZm8uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbS5SdW50aW1lLkludGVyb3BTZXJ2aWNlczsKLQotLy8gR2VuZXJhbCBJbmZvcm1hdGlvbiBhYm91dCBhbiBhc3NlbWJseSBpcyBjb250cm9sbGVkIHRocm91Z2ggdGhlIGZvbGxvd2luZyAKLS8vIHNldCBvZiBhdHRyaWJ1dGVzLiBDaGFuZ2UgdGhlc2UgYXR0cmlidXRlIHZhbHVlcyB0byBtb2RpZnkgdGhlIGluZm9ybWF0aW9uCi0vLyBhc3NvY2lhdGVkIHdpdGggYW4gYXNzZW1ibHkuCi0KLVthc3NlbWJseTogQXNzZW1ibHlUaXRsZSgiQWRkcmVzc0Jvb2siKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiQWRkcmVzc0Jvb2siKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb3B5cmlnaHQoIkNvcHlyaWdodCDCqSAgMjAxNSIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseVRyYWRlbWFyaygiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q3VsdHVyZSgiIildCi0KLVthc3NlbWJseTogQXNzZW1ibHlWZXJzaW9uKCIzLjAuMC4wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5RmlsZVZlcnNpb24oIjMuMC4wLjAiKV0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svU2FtcGxlVXNhZ2UuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL1NhbXBsZVVzYWdlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWQ3ZDcwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svU2FtcGxlVXNhZ2UuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw3MyArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotICAgIAotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLkV4YW1wbGVzLkFkZHJlc3NCb29rCi17Ci0gICAgaW50ZXJuYWwgY2xhc3MgU2FtcGxlVXNhZ2UKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTWFpbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlczsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhIG5ldyBwZXJzb24KLSAgICAgICAgICAgIFBlcnNvbiBwZXJzb24gPSBuZXcgUGVyc29uCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSWQgPSAxLAotICAgICAgICAgICAgICAgIE5hbWUgPSAiRm9vIiwKLSAgICAgICAgICAgICAgICBFbWFpbCA9ICJmb29AYmFyIiwKLSAgICAgICAgICAgICAgICBQaG9uZXMgPSB7IG5ldyBQZXJzb24uVHlwZXMuUGhvbmVOdW1iZXIgeyBOdW1iZXIgPSAiNTU1LTEyMTIiIH0gfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHVzaW5nIChNZW1vcnlTdHJlYW0gc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFNhdmUgdGhlIHBlcnNvbiB0byBhIHN0cmVhbQotICAgICAgICAgICAgICAgIHBlcnNvbi5Xcml0ZVRvKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgYnl0ZXMgPSBzdHJlYW0uVG9BcnJheSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUGVyc29uIGNvcHkgPSBQZXJzb24uUGFyc2VyLlBhcnNlRnJvbShieXRlcyk7Ci0KLSAgICAgICAgICAgIEFkZHJlc3NCb29rIGJvb2sgPSBuZXcgQWRkcmVzc0Jvb2sKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBQZW9wbGUgPSB7IGNvcHkgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIGJ5dGVzID0gYm9vay5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgLy8gQW5kIHJlYWQgdGhlIGFkZHJlc3MgYm9vayBiYWNrIGFnYWluCi0gICAgICAgICAgICBBZGRyZXNzQm9vayByZXN0b3JlZCA9IEFkZHJlc3NCb29rLlBhcnNlci5QYXJzZUZyb20oYnl0ZXMpOwotICAgICAgICAgICAgLy8gVGhlIG1lc3NhZ2UgcGVyZm9ybXMgYSBkZWVwLWNvbXBhcmlzb24gb24gZXF1YWxpdHk6Ci0gICAgICAgICAgICBpZiAocmVzdG9yZWQuUGVvcGxlLkNvdW50ICE9IDEgfHwgIXBlcnNvbi5FcXVhbHMocmVzdG9yZWQuUGVvcGxlWzBdKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXBwbGljYXRpb25FeGNlcHRpb24oIlRoZXJlIGlzIGEgYmFkIHBlcnNvbiBpbiBoZXJlISIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svYXBwLmNvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvQWRkcmVzc0Jvb2svYXBwLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgwODEzYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0FkZHJlc3NCb29rL2FwcC5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSwzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCI/PgotPGNvbmZpZ3VyYXRpb24+Ci0JPHN0YXJ0dXA+PHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjQuMCIgc2t1PSIuTkVURnJhbWV3b3JrLFZlcnNpb249djQuNSIvPjwvc3RhcnR1cD48L2NvbmZpZ3VyYXRpb24+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS9BcHAuY29uZmlnIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UvQXBwLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGUxNTY0Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS9BcHAuY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCIgPz4KLTxjb25maWd1cmF0aW9uPgotICAgIDxzdGFydHVwPiAKLSAgICAgICAgPHN1cHBvcnRlZFJ1bnRpbWUgdmVyc2lvbj0idjQuMCIgc2t1PSIuTkVURnJhbWV3b3JrLFZlcnNpb249djQuNSIgLz4KLSAgICA8L3N0YXJ0dXA+Ci08L2NvbmZpZ3VyYXRpb24+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UvQ29uZm9ybWFuY2UuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS9Db25mb3JtYW5jZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTY3NGE2Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS9Db25mb3JtYW5jZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDM3MDggKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogY29uZm9ybWFuY2UucHJvdG8KLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEKLSNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotdXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1ZjsKLXVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zOwotdXNpbmcgcGJyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci1uYW1lc3BhY2UgQ29uZm9ybWFuY2UgewotCi0gIC8vLyA8c3VtbWFyeT5Ib2xkZXIgZm9yIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGZyb20gY29uZm9ybWFuY2UucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBDb25mb3JtYW5jZVJlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgY29uZm9ybWFuY2UucHJvdG88L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgc3RhdGljIENvbmZvcm1hbmNlUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNoRmpiMjVtYjNKdFlXNWpaUzV3Y205MGJ4SUxZMjl1Wm05eWJXRnVZMlVhR1dkdmIyZHNaUzl3Y205MCIsCi0gICAgICAgICAgICAiYjJKMVppOWhibmt1Y0hKdmRHOGFIbWR2YjJkc1pTOXdjbTkwYjJKMVppOWtkWEpoZEdsdmJpNXdjbTkwIiwKLSAgICAgICAgICAgICJieG9nWjI5dloyeGxMM0J5YjNSdlluVm1MMlpwWld4a1gyMWhjMnN1Y0hKdmRHOGFIR2R2YjJkc1pTOXciLAotICAgICAgICAgICAgImNtOTBiMkoxWmk5emRISjFZM1F1Y0hKdmRHOGFIMmR2YjJkc1pTOXdjbTkwYjJKMVppOTBhVzFsYzNSaCIsCi0gICAgICAgICAgICAiYlhBdWNISnZkRzhhSG1kdmIyZHNaUzl3Y205MGIySjFaaTkzY21Gd2NHVnljeTV3Y205MGJ5S05BUW9TIiwKLSAgICAgICAgICAgICJRMjl1Wm05eWJXRnVZMlZTWlhGMVpYTjBFaG9LRUhCeWIzUnZZblZtWDNCaGVXeHZZV1FZQVNBQktBeEkiLAotICAgICAgICAgICAgIkFCSVdDZ3hxYzI5dVgzQmhlV3h2WVdRWUFpQUJLQWxJQUJJNENoZHlaWEYxWlhOMFpXUmZiM1YwY0hWMCIsCi0gICAgICAgICAgICAiWDJadmNtMWhkQmdESUFFb0RqSVhMbU52Ym1admNtMWhibU5sTGxkcGNtVkdiM0p0WVhSQ0NRb0hjR0Y1IiwKLSAgICAgICAgICAgICJiRzloWkNLeEFRb1RRMjl1Wm05eWJXRnVZMlZTWlhOd2IyNXpaUklWQ2d0d1lYSnpaVjlsY25KdmNoZ0IiLAotICAgICAgICAgICAgIklBRW9DVWdBRWhrS0QzTmxjbWxoYkdsNlpWOWxjbkp2Y2hnR0lBRW9DVWdBRWhjS0RYSjFiblJwYldWZiIsCi0gICAgICAgICAgICAiWlhKeWIzSVlBaUFCS0FsSUFCSWFDaEJ3Y205MGIySjFabDl3WVhsc2IyRmtHQU1nQVNnTVNBQVNGZ29NIiwKLSAgICAgICAgICAgICJhbk52Ymw5d1lYbHNiMkZrR0FRZ0FTZ0pTQUFTRVFvSGMydHBjSEJsWkJnRklBRW9DVWdBUWdnS0JuSmwiLAotICAgICAgICAgICAgImMzVnNkQ0xWTWdvTVZHVnpkRUZzYkZSNWNHVnpFaFlLRG05d2RHbHZibUZzWDJsdWRETXlHQUVnQVNnRiIsCi0gICAgICAgICAgICAiRWhZS0RtOXdkR2x2Ym1Gc1gybHVkRFkwR0FJZ0FTZ0RFaGNLRDI5d2RHbHZibUZzWDNWcGJuUXpNaGdEIiwKLSAgICAgICAgICAgICJJQUVvRFJJWENnOXZjSFJwYjI1aGJGOTFhVzUwTmpRWUJDQUJLQVFTRndvUGIzQjBhVzl1WVd4ZmMybHUiLAotICAgICAgICAgICAgImRETXlHQVVnQVNnUkVoY0tEMjl3ZEdsdmJtRnNYM05wYm5RMk5CZ0dJQUVvRWhJWUNoQnZjSFJwYjI1aCIsCi0gICAgICAgICAgICAiYkY5bWFYaGxaRE15R0FjZ0FTZ0hFaGdLRUc5d2RHbHZibUZzWDJacGVHVmtOalFZQ0NBQktBWVNHUW9SIiwKLSAgICAgICAgICAgICJiM0IwYVc5dVlXeGZjMlpwZUdWa016SVlDU0FCS0E4U0dRb1JiM0IwYVc5dVlXeGZjMlpwZUdWa05qUVkiLAotICAgICAgICAgICAgIkNpQUJLQkFTRmdvT2IzQjBhVzl1WVd4ZlpteHZZWFFZQ3lBQktBSVNGd29QYjNCMGFXOXVZV3hmWkc5MSIsCi0gICAgICAgICAgICAiWW14bEdBd2dBU2dCRWhVS0RXOXdkR2x2Ym1Gc1gySnZiMndZRFNBQktBZ1NGd29QYjNCMGFXOXVZV3hmIiwKLSAgICAgICAgICAgICJjM1J5YVc1bkdBNGdBU2dKRWhZS0RtOXdkR2x2Ym1Gc1gySjVkR1Z6R0E4Z0FTZ01Fa2dLRjI5d2RHbHYiLAotICAgICAgICAgICAgImJtRnNYMjVsYzNSbFpGOXRaWE56WVdkbEdCSWdBU2dMTWljdVkyOXVabTl5YldGdVkyVXVWR1Z6ZEVGcyIsCi0gICAgICAgICAgICAiYkZSNWNHVnpMazVsYzNSbFpFMWxjM05oWjJVU1BRb1liM0IwYVc5dVlXeGZabTl5WldsbmJsOXRaWE56IiwKLSAgICAgICAgICAgICJZV2RsR0JNZ0FTZ0xNaHN1WTI5dVptOXliV0Z1WTJVdVJtOXlaV2xuYmsxbGMzTmhaMlVTUWdvVWIzQjAiLAotICAgICAgICAgICAgImFXOXVZV3hmYm1WemRHVmtYMlZ1ZFcwWUZTQUJLQTR5SkM1amIyNW1iM0p0WVc1alpTNVVaWE4wUVd4cyIsCi0gICAgICAgICAgICAiVkhsd1pYTXVUbVZ6ZEdWa1JXNTFiUkkzQ2hWdmNIUnBiMjVoYkY5bWIzSmxhV2R1WDJWdWRXMFlGaUFCIiwKLSAgICAgICAgICAgICJLQTR5R0M1amIyNW1iM0p0WVc1alpTNUdiM0psYVdkdVJXNTFiUkloQ2hWdmNIUnBiMjVoYkY5emRISnAiLAotICAgICAgICAgICAgImJtZGZjR2xsWTJVWUdDQUJLQWxDQWdnQ0Voa0tEVzl3ZEdsdmJtRnNYMk52Y21RWUdTQUJLQWxDQWdnQiIsCi0gICAgICAgICAgICAiRWpRS0VYSmxZM1Z5YzJsMlpWOXRaWE56WVdkbEdCc2dBU2dMTWhrdVkyOXVabTl5YldGdVkyVXVWR1Z6IiwKLSAgICAgICAgICAgICJkRUZzYkZSNWNHVnpFaFlLRG5KbGNHVmhkR1ZrWDJsdWRETXlHQjhnQXlnRkVoWUtEbkpsY0dWaGRHVmsiLAotICAgICAgICAgICAgIlgybHVkRFkwR0NBZ0F5Z0RFaGNLRDNKbGNHVmhkR1ZrWDNWcGJuUXpNaGdoSUFNb0RSSVhDZzl5WlhCbCIsCi0gICAgICAgICAgICAiWVhSbFpGOTFhVzUwTmpRWUlpQURLQVFTRndvUGNtVndaV0YwWldSZmMybHVkRE15R0NNZ0F5Z1JFaGNLIiwKLSAgICAgICAgICAgICJEM0psY0dWaGRHVmtYM05wYm5RMk5CZ2tJQU1vRWhJWUNoQnlaWEJsWVhSbFpGOW1hWGhsWkRNeUdDVWciLAotICAgICAgICAgICAgIkF5Z0hFaGdLRUhKbGNHVmhkR1ZrWDJacGVHVmtOalFZSmlBREtBWVNHUW9SY21Wd1pXRjBaV1JmYzJacCIsCi0gICAgICAgICAgICAiZUdWa016SVlKeUFES0E4U0dRb1JjbVZ3WldGMFpXUmZjMlpwZUdWa05qUVlLQ0FES0JBU0Znb09jbVZ3IiwKLSAgICAgICAgICAgICJaV0YwWldSZlpteHZZWFFZS1NBREtBSVNGd29QY21Wd1pXRjBaV1JmWkc5MVlteGxHQ29nQXlnQkVoVUsiLAotICAgICAgICAgICAgIkRYSmxjR1ZoZEdWa1gySnZiMndZS3lBREtBZ1NGd29QY21Wd1pXRjBaV1JmYzNSeWFXNW5HQ3dnQXlnSiIsCi0gICAgICAgICAgICAiRWhZS0RuSmxjR1ZoZEdWa1gySjVkR1Z6R0MwZ0F5Z01Fa2dLRjNKbGNHVmhkR1ZrWDI1bGMzUmxaRjl0IiwKLSAgICAgICAgICAgICJaWE56WVdkbEdEQWdBeWdMTWljdVkyOXVabTl5YldGdVkyVXVWR1Z6ZEVGc2JGUjVjR1Z6TGs1bGMzUmwiLAotICAgICAgICAgICAgIlpFMWxjM05oWjJVU1BRb1ljbVZ3WldGMFpXUmZabTl5WldsbmJsOXRaWE56WVdkbEdERWdBeWdMTWhzdSIsCi0gICAgICAgICAgICAiWTI5dVptOXliV0Z1WTJVdVJtOXlaV2xuYmsxbGMzTmhaMlVTUWdvVWNtVndaV0YwWldSZmJtVnpkR1ZrIiwKLSAgICAgICAgICAgICJYMlZ1ZFcwWU15QURLQTR5SkM1amIyNW1iM0p0WVc1alpTNVVaWE4wUVd4c1ZIbHdaWE11VG1WemRHVmsiLAotICAgICAgICAgICAgIlJXNTFiUkkzQ2hWeVpYQmxZWFJsWkY5bWIzSmxhV2R1WDJWdWRXMFlOQ0FES0E0eUdDNWpiMjVtYjNKdCIsCi0gICAgICAgICAgICAiWVc1alpTNUdiM0psYVdkdVJXNTFiUkloQ2hWeVpYQmxZWFJsWkY5emRISnBibWRmY0dsbFkyVVlOaUFEIiwKLSAgICAgICAgICAgICJLQWxDQWdnQ0Voa0tEWEpsY0dWaGRHVmtYMk52Y21RWU55QURLQWxDQWdnQkVrVUtEMjFoY0Y5cGJuUXoiLAotICAgICAgICAgICAgIk1sOXBiblF6TWhnNElBTW9DeklzTG1OdmJtWnZjbTFoYm1ObExsUmxjM1JCYkd4VWVYQmxjeTVOWVhCSiIsCi0gICAgICAgICAgICAiYm5Rek1rbHVkRE15Ulc1MGNua1NSUW9QYldGd1gybHVkRFkwWDJsdWREWTBHRGtnQXlnTE1pd3VZMjl1IiwKLSAgICAgICAgICAgICJabTl5YldGdVkyVXVWR1Z6ZEVGc2JGUjVjR1Z6TGsxaGNFbHVkRFkwU1c1ME5qUkZiblJ5ZVJKSkNoRnQiLAotICAgICAgICAgICAgIllYQmZkV2x1ZERNeVgzVnBiblF6TWhnNklBTW9Dekl1TG1OdmJtWnZjbTFoYm1ObExsUmxjM1JCYkd4VSIsCi0gICAgICAgICAgICAiZVhCbGN5NU5ZWEJWYVc1ME16SlZhVzUwTXpKRmJuUnllUkpKQ2hGdFlYQmZkV2x1ZERZMFgzVnBiblEyIiwKLSAgICAgICAgICAgICJOQmc3SUFNb0N6SXVMbU52Ym1admNtMWhibU5sTGxSbGMzUkJiR3hVZVhCbGN5NU5ZWEJWYVc1ME5qUlYiLAotICAgICAgICAgICAgImFXNTBOalJGYm5SeWVSSkpDaEZ0WVhCZmMybHVkRE15WDNOcGJuUXpNaGc4SUFNb0N6SXVMbU52Ym1adiIsCi0gICAgICAgICAgICAiY20xaGJtTmxMbFJsYzNSQmJHeFVlWEJsY3k1TllYQlRhVzUwTXpKVGFXNTBNekpGYm5SeWVSSkpDaEZ0IiwKLSAgICAgICAgICAgICJZWEJmYzJsdWREWTBYM05wYm5RMk5CZzlJQU1vQ3pJdUxtTnZibVp2Y20xaGJtTmxMbFJsYzNSQmJHeFUiLAotICAgICAgICAgICAgImVYQmxjeTVOWVhCVGFXNTBOalJUYVc1ME5qUkZiblJ5ZVJKTkNoTnRZWEJmWm1sNFpXUXpNbDltYVhobCIsCi0gICAgICAgICAgICAiWkRNeUdENGdBeWdMTWpBdVkyOXVabTl5YldGdVkyVXVWR1Z6ZEVGc2JGUjVjR1Z6TGsxaGNFWnBlR1ZrIiwKLSAgICAgICAgICAgICJNekpHYVhobFpETXlSVzUwY25rU1RRb1RiV0Z3WDJacGVHVmtOalJmWm1sNFpXUTJOQmcvSUFNb0N6SXciLAotICAgICAgICAgICAgIkxtTnZibVp2Y20xaGJtTmxMbFJsYzNSQmJHeFVlWEJsY3k1TllYQkdhWGhsWkRZMFJtbDRaV1EyTkVWdSIsCi0gICAgICAgICAgICAiZEhKNUVsRUtGVzFoY0Y5elptbDRaV1F6TWw5elptbDRaV1F6TWhoQUlBTW9Dekl5TG1OdmJtWnZjbTFoIiwKLSAgICAgICAgICAgICJibU5sTGxSbGMzUkJiR3hVZVhCbGN5NU5ZWEJUWm1sNFpXUXpNbE5tYVhobFpETXlSVzUwY25rU1VRb1YiLAotICAgICAgICAgICAgImJXRndYM05tYVhobFpEWTBYM05tYVhobFpEWTBHRUVnQXlnTE1qSXVZMjl1Wm05eWJXRnVZMlV1VkdWeiIsCi0gICAgICAgICAgICAiZEVGc2JGUjVjR1Z6TGsxaGNGTm1hWGhsWkRZMFUyWnBlR1ZrTmpSRmJuUnllUkpGQ2c5dFlYQmZhVzUwIiwKLSAgICAgICAgICAgICJNekpmWm14dllYUVlRaUFES0FzeUxDNWpiMjVtYjNKdFlXNWpaUzVVWlhOMFFXeHNWSGx3WlhNdVRXRnciLAotICAgICAgICAgICAgIlNXNTBNekpHYkc5aGRFVnVkSEo1RWtjS0VHMWhjRjlwYm5Rek1sOWtiM1ZpYkdVWVF5QURLQXN5TFM1aiIsCi0gICAgICAgICAgICAiYjI1bWIzSnRZVzVqWlM1VVpYTjBRV3hzVkhsd1pYTXVUV0Z3U1c1ME16SkViM1ZpYkdWRmJuUnllUkpCIiwKLSAgICAgICAgICAgICJDZzF0WVhCZlltOXZiRjlpYjI5c0dFUWdBeWdMTWlvdVkyOXVabTl5YldGdVkyVXVWR1Z6ZEVGc2JGUjUiLAotICAgICAgICAgICAgImNHVnpMazFoY0VKdmIyeENiMjlzUlc1MGNua1NTUW9SYldGd1gzTjBjbWx1WjE5emRISnBibWNZUlNBRCIsCi0gICAgICAgICAgICAiS0FzeUxpNWpiMjVtYjNKdFlXNWpaUzVVWlhOMFFXeHNWSGx3WlhNdVRXRndVM1J5YVc1blUzUnlhVzVuIiwKLSAgICAgICAgICAgICJSVzUwY25rU1J3b1FiV0Z3WDNOMGNtbHVaMTlpZVhSbGN4aEdJQU1vQ3pJdExtTnZibVp2Y20xaGJtTmwiLAotICAgICAgICAgICAgIkxsUmxjM1JCYkd4VWVYQmxjeTVOWVhCVGRISnBibWRDZVhSbGMwVnVkSEo1RWxnS0dXMWhjRjl6ZEhKcCIsCi0gICAgICAgICAgICAiYm1kZmJtVnpkR1ZrWDIxbGMzTmhaMlVZUnlBREtBc3lOUzVqYjI1bWIzSnRZVzVqWlM1VVpYTjBRV3hzIiwKLSAgICAgICAgICAgICJWSGx3WlhNdVRXRndVM1J5YVc1blRtVnpkR1ZrVFdWemMyRm5aVVZ1ZEhKNUVsb0tHbTFoY0Y5emRISnAiLAotICAgICAgICAgICAgImJtZGZabTl5WldsbmJsOXRaWE56WVdkbEdFZ2dBeWdMTWpZdVkyOXVabTl5YldGdVkyVXVWR1Z6ZEVGcyIsCi0gICAgICAgICAgICAiYkZSNWNHVnpMazFoY0ZOMGNtbHVaMFp2Y21WcFoyNU5aWE56WVdkbFJXNTBjbmtTVWdvV2JXRndYM04wIiwKLSAgICAgICAgICAgICJjbWx1WjE5dVpYTjBaV1JmWlc1MWJSaEpJQU1vQ3pJeUxtTnZibVp2Y20xaGJtTmxMbFJsYzNSQmJHeFUiLAotICAgICAgICAgICAgImVYQmxjeTVOWVhCVGRISnBibWRPWlhOMFpXUkZiblZ0Ulc1MGNua1NWQW9YYldGd1gzTjBjbWx1WjE5bSIsCi0gICAgICAgICAgICAiYjNKbGFXZHVYMlZ1ZFcwWVNpQURLQXN5TXk1amIyNW1iM0p0WVc1alpTNVVaWE4wUVd4c1ZIbHdaWE11IiwKLSAgICAgICAgICAgICJUV0Z3VTNSeWFXNW5SbTl5WldsbmJrVnVkVzFGYm5SeWVSSVdDZ3h2Ym1WdlpsOTFhVzUwTXpJWWJ5QUIiLAotICAgICAgICAgICAgIktBMUlBQkpIQ2hSdmJtVnZabDl1WlhOMFpXUmZiV1Z6YzJGblpSaHdJQUVvQ3pJbkxtTnZibVp2Y20xaCIsCi0gICAgICAgICAgICAiYm1ObExsUmxjM1JCYkd4VWVYQmxjeTVPWlhOMFpXUk5aWE56WVdkbFNBQVNGZ29NYjI1bGIyWmZjM1J5IiwKLSAgICAgICAgICAgICJhVzVuR0hFZ0FTZ0pTQUFTRlFvTGIyNWxiMlpmWW5sMFpYTVljaUFCS0F4SUFCSTZDaFZ2Y0hScGIyNWgiLAotICAgICAgICAgICAgImJGOWliMjlzWDNkeVlYQndaWElZeVFFZ0FTZ0xNaG91WjI5dloyeGxMbkJ5YjNSdlluVm1Ma0p2YjJ4VyIsCi0gICAgICAgICAgICAiWVd4MVpSSThDaFp2Y0hScGIyNWhiRjlwYm5Rek1sOTNjbUZ3Y0dWeUdNb0JJQUVvQ3pJYkxtZHZiMmRzIiwKLSAgICAgICAgICAgICJaUzV3Y205MGIySjFaaTVKYm5Rek1sWmhiSFZsRWp3S0ZtOXdkR2x2Ym1Gc1gybHVkRFkwWDNkeVlYQnciLAotICAgICAgICAgICAgIlpYSVl5d0VnQVNnTE1oc3VaMjl2WjJ4bExuQnliM1J2WW5WbUxrbHVkRFkwVm1Gc2RXVVNQZ29YYjNCMCIsCi0gICAgICAgICAgICAiYVc5dVlXeGZkV2x1ZERNeVgzZHlZWEJ3WlhJWXpBRWdBU2dMTWh3dVoyOXZaMnhsTG5CeWIzUnZZblZtIiwKLSAgICAgICAgICAgICJMbFZKYm5Rek1sWmhiSFZsRWo0S0YyOXdkR2x2Ym1Gc1gzVnBiblEyTkY5M2NtRndjR1Z5R00wQklBRW8iLAotICAgICAgICAgICAgIkN6SWNMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVZTVzUwTmpSV1lXeDFaUkk4Q2hadmNIUnBiMjVoYkY5bSIsCi0gICAgICAgICAgICAiYkc5aGRGOTNjbUZ3Y0dWeUdNNEJJQUVvQ3pJYkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1R2JHOWhkRlpoIiwKLSAgICAgICAgICAgICJiSFZsRWo0S0YyOXdkR2x2Ym1Gc1gyUnZkV0pzWlY5M2NtRndjR1Z5R004QklBRW9DekljTG1kdmIyZHMiLAotICAgICAgICAgICAgIlpTNXdjbTkwYjJKMVppNUViM1ZpYkdWV1lXeDFaUkkrQ2hkdmNIUnBiMjVoYkY5emRISnBibWRmZDNKaCIsCi0gICAgICAgICAgICAiY0hCbGNoalFBU0FCS0FzeUhDNW5iMjluYkdVdWNISnZkRzlpZFdZdVUzUnlhVzVuVm1Gc2RXVVNQQW9XIiwKLSAgICAgICAgICAgICJiM0IwYVc5dVlXeGZZbmwwWlhOZmQzSmhjSEJsY2hqUkFTQUJLQXN5R3k1bmIyOW5iR1V1Y0hKdmRHOWkiLAotICAgICAgICAgICAgImRXWXVRbmwwWlhOV1lXeDFaUkk2Q2hWeVpYQmxZWFJsWkY5aWIyOXNYM2R5WVhCd1pYSVkwd0VnQXlnTCIsCi0gICAgICAgICAgICAiTWhvdVoyOXZaMnhsTG5CeWIzUnZZblZtTGtKdmIyeFdZV3gxWlJJOENoWnlaWEJsWVhSbFpGOXBiblF6IiwKLSAgICAgICAgICAgICJNbDkzY21Gd2NHVnlHTlFCSUFNb0N6SWJMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUpiblF6TWxaaGJIVmwiLAotICAgICAgICAgICAgIkVqd0tGbkpsY0dWaGRHVmtYMmx1ZERZMFgzZHlZWEJ3WlhJWTFRRWdBeWdMTWhzdVoyOXZaMnhsTG5CeSIsCi0gICAgICAgICAgICAiYjNSdlluVm1Ma2x1ZERZMFZtRnNkV1VTUGdvWGNtVndaV0YwWldSZmRXbHVkRE15WDNkeVlYQndaWElZIiwKLSAgICAgICAgICAgICIxZ0VnQXlnTE1od3VaMjl2WjJ4bExuQnliM1J2WW5WbUxsVkpiblF6TWxaaGJIVmxFajRLRjNKbGNHVmgiLAotICAgICAgICAgICAgImRHVmtYM1ZwYm5RMk5GOTNjbUZ3Y0dWeUdOY0JJQU1vQ3pJY0xtZHZiMmRzWlM1d2NtOTBiMkoxWmk1ViIsCi0gICAgICAgICAgICAiU1c1ME5qUldZV3gxWlJJOENoWnlaWEJsWVhSbFpGOW1iRzloZEY5M2NtRndjR1Z5R05nQklBTW9DekliIiwKLSAgICAgICAgICAgICJMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUdiRzloZEZaaGJIVmxFajRLRjNKbGNHVmhkR1ZrWDJSdmRXSnMiLAotICAgICAgICAgICAgIlpWOTNjbUZ3Y0dWeUdOa0JJQU1vQ3pJY0xtZHZiMmRzWlM1d2NtOTBiMkoxWmk1RWIzVmliR1ZXWVd4MSIsCi0gICAgICAgICAgICAiWlJJK0NoZHlaWEJsWVhSbFpGOXpkSEpwYm1kZmQzSmhjSEJsY2hqYUFTQURLQXN5SEM1bmIyOW5iR1V1IiwKLSAgICAgICAgICAgICJjSEp2ZEc5aWRXWXVVM1J5YVc1blZtRnNkV1VTUEFvV2NtVndaV0YwWldSZllubDBaWE5mZDNKaGNIQmwiLAotICAgICAgICAgICAgImNoamJBU0FES0FzeUd5NW5iMjluYkdVdWNISnZkRzlpZFdZdVFubDBaWE5XWVd4MVpSSTFDaEZ2Y0hScCIsCi0gICAgICAgICAgICAiYjI1aGJGOWtkWEpoZEdsdmJoaXRBaUFCS0FzeUdTNW5iMjluYkdVdWNISnZkRzlpZFdZdVJIVnlZWFJwIiwKLSAgICAgICAgICAgICJiMjRTTndvU2IzQjBhVzl1WVd4ZmRHbHRaWE4wWVcxd0dLNENJQUVvQ3pJYUxtZHZiMmRzWlM1d2NtOTAiLAotICAgICAgICAgICAgImIySjFaaTVVYVcxbGMzUmhiWEFTT0FvVGIzQjBhVzl1WVd4ZlptbGxiR1JmYldGemF4aXZBaUFCS0FzeSIsCi0gICAgICAgICAgICAiR2k1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Um1sbGJHUk5ZWE5yRWpFS0QyOXdkR2x2Ym1Gc1gzTjBjblZqIiwKLSAgICAgICAgICAgICJkQml3QWlBQktBc3lGeTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVVM1J5ZFdOMEVpc0tERzl3ZEdsdmJtRnMiLAotICAgICAgICAgICAgIlgyRnVlUml4QWlBQktBc3lGQzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVRVzU1RWk4S0RtOXdkR2x2Ym1GcyIsCi0gICAgICAgICAgICAiWDNaaGJIVmxHTElDSUFFb0N6SVdMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVdZV3gxWlJJMUNoRnlaWEJsIiwKLSAgICAgICAgICAgICJZWFJsWkY5a2RYSmhkR2x2YmhpM0FpQURLQXN5R1M1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1UkhWeVlYUnAiLAotICAgICAgICAgICAgImIyNFNOd29TY21Wd1pXRjBaV1JmZEdsdFpYTjBZVzF3R0xnQ0lBTW9DeklhTG1kdmIyZHNaUzV3Y205MCIsCi0gICAgICAgICAgICAiYjJKMVppNVVhVzFsYzNSaGJYQVNOd29TY21Wd1pXRjBaV1JmWm1sbGJHUnRZWE5yR0xrQ0lBTW9DeklhIiwKLSAgICAgICAgICAgICJMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUdhV1ZzWkUxaGMyc1NNUW9QY21Wd1pXRjBaV1JmYzNSeWRXTjAiLAotICAgICAgICAgICAgIkdNUUNJQU1vQ3pJWExtZHZiMmRzWlM1d2NtOTBiMkoxWmk1VGRISjFZM1FTS3dvTWNtVndaV0YwWldSZiIsCi0gICAgICAgICAgICAiWVc1NUdMc0NJQU1vQ3pJVUxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1QmJua1NMd29PY21Wd1pXRjBaV1JmIiwKLSAgICAgICAgICAgICJkbUZzZFdVWXZBSWdBeWdMTWhZdVoyOXZaMnhsTG5CeWIzUnZZblZtTGxaaGJIVmxFaE1LQ21acFpXeGsiLAotICAgICAgICAgICAgImJtRnRaVEVZa1FNZ0FTZ0ZFaFFLQzJacFpXeGtYMjVoYldVeUdKSURJQUVvQlJJVkNneGZabWxsYkdSZiIsCi0gICAgICAgICAgICAiYm1GdFpUTVlrd01nQVNnRkVoWUtEV1pwWld4a1gxOXVZVzFsTkY4WWxBTWdBU2dGRWhRS0MyWnBaV3hrIiwKLSAgICAgICAgICAgICJNRzVoYldVMUdKVURJQUVvQlJJV0NnMW1hV1ZzWkY4d1gyNWhiV1UyR0pZRElBRW9CUklUQ2dwbWFXVnMiLAotICAgICAgICAgICAgIlpFNWhiV1UzR0pjRElBRW9CUklUQ2dwR2FXVnNaRTVoYldVNEdKZ0RJQUVvQlJJVUNndG1hV1ZzWkY5TyIsCi0gICAgICAgICAgICAiWVcxbE9SaVpBeUFCS0FVU0ZRb01SbWxsYkdSZlRtRnRaVEV3R0pvRElBRW9CUklWQ2d4R1NVVk1SRjlPIiwKLSAgICAgICAgICAgICJRVTFGTVRFWW13TWdBU2dGRWhVS0RFWkpSVXhFWDI1aGJXVXhNaGljQXlBQktBVWFTZ29OVG1WemRHVmsiLAotICAgICAgICAgICAgIlRXVnpjMkZuWlJJSkNnRmhHQUVnQVNnRkVpNEtDMk52Y21WamRYSnphWFpsR0FJZ0FTZ0xNaGt1WTI5dSIsCi0gICAgICAgICAgICAiWm05eWJXRnVZMlV1VkdWemRFRnNiRlI1Y0dWekdqUUtFazFoY0VsdWRETXlTVzUwTXpKRmJuUnllUklMIiwKLSAgICAgICAgICAgICJDZ05yWlhrWUFTQUJLQVVTRFFvRmRtRnNkV1VZQWlBQktBVTZBamdCR2pRS0VrMWhjRWx1ZERZMFNXNTAiLAotICAgICAgICAgICAgIk5qUkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBTVNEUW9GZG1Gc2RXVVlBaUFCS0FNNkFqZ0JHallLRkUxaCIsCi0gICAgICAgICAgICAiY0ZWcGJuUXpNbFZwYm5Rek1rVnVkSEo1RWdzS0EydGxlUmdCSUFFb0RSSU5DZ1YyWVd4MVpSZ0NJQUVvIiwKLSAgICAgICAgICAgICJEVG9DT0FFYU5nb1VUV0Z3VldsdWREWTBWV2x1ZERZMFJXNTBjbmtTQ3dvRGEyVjVHQUVnQVNnRUVnMEsiLAotICAgICAgICAgICAgIkJYWmhiSFZsR0FJZ0FTZ0VPZ0k0QVJvMkNoUk5ZWEJUYVc1ME16SlRhVzUwTXpKRmJuUnllUklMQ2dOciIsCi0gICAgICAgICAgICAiWlhrWUFTQUJLQkVTRFFvRmRtRnNkV1VZQWlBQktCRTZBamdCR2pZS0ZFMWhjRk5wYm5RMk5GTnBiblEyIiwKLSAgICAgICAgICAgICJORVZ1ZEhKNUVnc0tBMnRsZVJnQklBRW9FaElOQ2dWMllXeDFaUmdDSUFFb0Vqb0NPQUVhT0FvV1RXRnciLAotICAgICAgICAgICAgIlJtbDRaV1F6TWtacGVHVmtNekpGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQWNTRFFvRmRtRnNkV1VZQWlBQiIsCi0gICAgICAgICAgICAiS0FjNkFqZ0JHamdLRmsxaGNFWnBlR1ZrTmpSR2FYaGxaRFkwUlc1MGNua1NDd29EYTJWNUdBRWdBU2dHIiwKLSAgICAgICAgICAgICJFZzBLQlhaaGJIVmxHQUlnQVNnR09nSTRBUm82Q2hoTllYQlRabWw0WldRek1sTm1hWGhsWkRNeVJXNTAiLAotICAgICAgICAgICAgImNua1NDd29EYTJWNUdBRWdBU2dQRWcwS0JYWmhiSFZsR0FJZ0FTZ1BPZ0k0QVJvNkNoaE5ZWEJUWm1sNCIsCi0gICAgICAgICAgICAiWldRMk5GTm1hWGhsWkRZMFJXNTBjbmtTQ3dvRGEyVjVHQUVnQVNnUUVnMEtCWFpoYkhWbEdBSWdBU2dRIiwKLSAgICAgICAgICAgICJPZ0k0QVJvMENoSk5ZWEJKYm5Rek1rWnNiMkYwUlc1MGNua1NDd29EYTJWNUdBRWdBU2dGRWcwS0JYWmgiLAotICAgICAgICAgICAgImJIVmxHQUlnQVNnQ09nSTRBUm8xQ2hOTllYQkpiblF6TWtSdmRXSnNaVVZ1ZEhKNUVnc0tBMnRsZVJnQiIsCi0gICAgICAgICAgICAiSUFFb0JSSU5DZ1YyWVd4MVpSZ0NJQUVvQVRvQ09BRWFNZ29RVFdGd1FtOXZiRUp2YjJ4RmJuUnllUklMIiwKLSAgICAgICAgICAgICJDZ05yWlhrWUFTQUJLQWdTRFFvRmRtRnNkV1VZQWlBQktBZzZBamdCR2pZS0ZFMWhjRk4wY21sdVoxTjAiLAotICAgICAgICAgICAgImNtbHVaMFZ1ZEhKNUVnc0tBMnRsZVJnQklBRW9DUklOQ2dWMllXeDFaUmdDSUFFb0NUb0NPQUVhTlFvVCIsCi0gICAgICAgICAgICAiVFdGd1UzUnlhVzVuUW5sMFpYTkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBa1NEUW9GZG1Gc2RXVVlBaUFCIiwKLSAgICAgICAgICAgICJLQXc2QWpnQkdtWUtHMDFoY0ZOMGNtbHVaMDVsYzNSbFpFMWxjM05oWjJWRmJuUnllUklMQ2dOclpYa1kiLAotICAgICAgICAgICAgIkFTQUJLQWtTTmdvRmRtRnNkV1VZQWlBQktBc3lKeTVqYjI1bWIzSnRZVzVqWlM1VVpYTjBRV3hzVkhsdyIsCi0gICAgICAgICAgICAiWlhNdVRtVnpkR1ZrVFdWemMyRm5aVG9DT0FFYVd3b2NUV0Z3VTNSeWFXNW5SbTl5WldsbmJrMWxjM05oIiwKLSAgICAgICAgICAgICJaMlZGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQWtTS2dvRmRtRnNkV1VZQWlBQktBc3lHeTVqYjI1bWIzSnQiLAotICAgICAgICAgICAgIllXNWpaUzVHYjNKbGFXZHVUV1Z6YzJGblpUb0NPQUVhWUFvWVRXRndVM1J5YVc1blRtVnpkR1ZrUlc1MSIsCi0gICAgICAgICAgICAiYlVWdWRISjVFZ3NLQTJ0bGVSZ0JJQUVvQ1JJekNnVjJZV3gxWlJnQ0lBRW9EaklrTG1OdmJtWnZjbTFoIiwKLSAgICAgICAgICAgICJibU5sTGxSbGMzUkJiR3hVZVhCbGN5NU9aWE4wWldSRmJuVnRPZ0k0QVJwVkNobE5ZWEJUZEhKcGJtZEciLAotICAgICAgICAgICAgImIzSmxhV2R1Ulc1MWJVVnVkSEo1RWdzS0EydGxlUmdCSUFFb0NSSW5DZ1YyWVd4MVpSZ0NJQUVvRGpJWSIsCi0gICAgICAgICAgICAiTG1OdmJtWnZjbTFoYm1ObExrWnZjbVZwWjI1RmJuVnRPZ0k0QVNJNUNncE9aWE4wWldSRmJuVnRFZ2NLIiwKLSAgICAgICAgICAgICJBMFpQVHhBQUVnY0tBMEpCVWhBQkVnY0tBMEpCV2hBQ0VoQUtBMDVGUnhELy8vLy8vLy8vLy84QlFnMEsiLAotICAgICAgICAgICAgIkMyOXVaVzltWDJacFpXeGtJaHNLRGtadmNtVnBaMjVOWlhOellXZGxFZ2tLQVdNWUFTQUJLQVVxTlFvSyIsCi0gICAgICAgICAgICAiVjJseVpVWnZjbTFoZEJJUENndFZUbE5RUlVOSlJrbEZSQkFBRWd3S0NGQlNUMVJQUWxWR0VBRVNDQW9FIiwKLSAgICAgICAgICAgICJTbE5QVGhBQ0trQUtDMFp2Y21WcFoyNUZiblZ0RWc4S0MwWlBVa1ZKUjA1ZlJrOVBFQUFTRHdvTFJrOVMiLAotICAgICAgICAgICAgIlJVbEhUbDlDUVZJUUFSSVBDZ3RHVDFKRlNVZE9YMEpCV2hBQ1FpRUtIMk52YlM1bmIyOW5iR1V1Y0hKdiIsCi0gICAgICAgICAgICAiZEc5aWRXWXVZMjl1Wm05eWJXRnVZMlZpQm5CeWIzUnZNdz09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueVJlZmxlY3Rpb24uRGVzY3JpcHRvciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb25SZWZsZWN0aW9uLkRlc2NyaXB0b3IsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFza1JlZmxlY3Rpb24uRGVzY3JpcHRvciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0UmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXBSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLldyYXBwZXJzUmVmbGVjdGlvbi5EZXNjcmlwdG9yLCB9LAotICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKG5ld1tdIHt0eXBlb2YoZ2xvYmFsOjpDb25mb3JtYW5jZS5XaXJlRm9ybWF0KSwgdHlwZW9mKGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbkVudW0pLCB9LCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6OkNvbmZvcm1hbmNlLkNvbmZvcm1hbmNlUmVxdWVzdCksIGdsb2JhbDo6Q29uZm9ybWFuY2UuQ29uZm9ybWFuY2VSZXF1ZXN0LlBhcnNlciwgbmV3W117ICJQcm90b2J1ZlBheWxvYWQiLCAiSnNvblBheWxvYWQiLCAiUmVxdWVzdGVkT3V0cHV0Rm9ybWF0IiB9LCBuZXdbXXsgIlBheWxvYWQiIH0sIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6Q29uZm9ybWFuY2UuQ29uZm9ybWFuY2VSZXNwb25zZSksIGdsb2JhbDo6Q29uZm9ybWFuY2UuQ29uZm9ybWFuY2VSZXNwb25zZS5QYXJzZXIsIG5ld1tdeyAiUGFyc2VFcnJvciIsICJTZXJpYWxpemVFcnJvciIsICJSdW50aW1lRXJyb3IiLCAiUHJvdG9idWZQYXlsb2FkIiwgIkpzb25QYXlsb2FkIiwgIlNraXBwZWQiIH0sIG5ld1tdeyAiUmVzdWx0IiB9LCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcyksIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlBhcnNlciwgbmV3W117ICJPcHRpb25hbEludDMyIiwgIk9wdGlvbmFsSW50NjQiLCAiT3B0aW9uYWxVaW50MzIiLCAiT3B0aW9uYWxVaW50NjQiLCAiT3B0aW9uYWxTaW50MzIiLCAiT3B0aW9uYWxTaW50NjQiLCAiT3B0aW9uYWxGaXhlZDMyIiwgIk9wdGlvbmFsRml4ZWQ2NCIsICJPcHRpb25hbFNmaXhlZDMyIiwgIk9wdGlvbmFsU2ZpeGVkNjQiLCAiT3B0aW9uYWxGbG9hdCIsICJPcHRpb25hbERvdWJsZSIsICJPcHRpb25hbEJvb2wiLCAiT3B0aW9uYWxTdHJpbmciLCAiT3B0aW9uYWxCeXRlcyIsICJPcHRpb25hbE5lc3RlZE1lc3NhZ2UiLCAiT3B0aW9uYWxGb3JlaWduTWVzc2FnZSIsICJPcHRpb25hbE5lc3RlZEVudW0iLCAiT3B0aW9uYWxGb3JlaWduRW51bSIsICJPcHRpb25hbFN0cmluZ1BpZWNlIiwgIk9wdGlvbmFsQ29yZCIsICJSZWN1cnNpdmVNZXNzYWdlIiwgIlJlcGVhdGVkSW50MzIiLCAiUmVwZWF0ZWRJbnQ2NCIsICJSZXBlYXRlZFVpbnQzMiIsICJSZXBlYXRlZFVpbnQ2NCIsICJSZXBlYXRlZFNpbnQzMiIsICJSZXBlYXRlZFNpbnQ2NCIsICJSZXBlYXRlZEZpeGVkMzIiLCAiUmVwZWF0ZWRGaXhlZDY0IiwgIlJlcGVhdGVkU2ZpeGVkMzIiLCAiUmVwZWF0ZWRTZml4ZWQ2NCIsICJSZXBlYXRlZEZsb2F0IiwgIlJlcGVhdGVkRG91YmxlIiwgIlJlcGVhdGVkQm9vbCIsICJSZXBlYXRlZFN0cmluZyIsICJSZXBlYXRlZEJ5dGVzIiwgIlJlcGVhdGVkTmVzdGVkTWVzc2FnZSIsICJSZXBlYXRlZEZvcmVpZ25NZXNzYWdlIiwgIlJlcGVhdGVkTmVzdGVkRW51bSIsICJSZXBlYXRlZEZvcmVpZ25FbnVtIiwgIlJlcGVhdGVkU3RyaW5nUGllY2UiLCAiUmVwZWF0ZWRDb3JkIiwgIk1hcEludDMySW50MzIiLCAiTWFwSW50NjRJbnQ2NCIsICJNYXBVaW50MzJVaW50MzIiLCAiTWFwVWludDY0VWludDY0IiwgIk1hcFNpbnQzMlNpbnQzMiIsICJNYXBTaW50NjRTaW50NjQiLCAiTWFwRml4ZWQzMkZpeGVkMzIiLCAiTWFwRml4ZWQ2NEZpeGVkNjQiLCAiTWFwU2ZpeGVkMzJTZml4ZWQzMiIsICJNYXBTZml4ZWQ2NFNmaXhlZDY0IiwgIk1hcEludDMyRmxvYXQiLCAiTWFwSW50MzJEb3VibGUiLCAiTWFwQm9vbEJvb2wiLCAiTWFwU3RyaW5nU3RyaW5nIiwgIk1hcFN0cmluZ0J5dGVzIiwgIk1hcFN0cmluZ05lc3RlZE1lc3NhZ2UiLCAiTWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2UiLCAiTWFwU3RyaW5nTmVzdGVkRW51bSIsICJNYXBTdHJpbmdGb3JlaWduRW51bSIsICJPbmVvZlVpbnQzMiIsICJPbmVvZk5lc3RlZE1lc3NhZ2UiLCAiT25lb2ZTdHJpbmciLCAiT25lb2ZCeXRlcyIsICJPcHRpb25hbEJvb2xXcmFwcGVyIiwgIk9wdGlvbmFsSW50MzJXcmFwcGVyIiwgIk9wdGlvbmFsSW50NjRXcmFwcGVyIiwgIk9wdGlvbmFsVWludDMyV3JhcHBlciIsICJPcHRpb25hbFVpbnQ2NFdyYXBwZXIiLCAiT3B0aW9uYWxGbG9hdFdyYXBwZXIiLCAiT3B0aW9uYWxEb3VibGVXcmFwcGVyIiwgIk9wdGlvbmFsU3RyaW5nV3JhcHBlciIsICJPcHRpb25hbEJ5dGVzV3JhcHBlciIsICJSZXBlYXRlZEJvb2xXcmFwcGVyIiwgIlJlcGVhdGVkSW50MzJXcmFwcGVyIiwgIlJlcGVhdGVkSW50NjRXcmFwcGVyIiwgIlJlcGVhdGVkVWludDMyV3JhcHBlciIsICJSZXBlYXRlZFVpbnQ2NFdyYXBwZXIiLCAiUmVwZWF0ZWRGbG9hdFdyYXBwZXIiLCAiUmVwZWF0ZWREb3VibGVXcmFwcGVyIiwgIlJlcGVhdGVkU3RyaW5nV3JhcHBlciIsICJSZXBlYXRlZEJ5dGVzV3JhcHBlciIsICJPcHRpb25hbER1cmF0aW9uIiwgIk9wdGlvbmFsVGltZXN0YW1wIiwgIk9wdGlvbmFsRmllbGRNYXNrIiwgIk9wdGlvbmFsU3RydWN0IiwgIk9wdGlvbmFsQW55IiwgIk9wdGlvbmFsVmFsdWUiLCAiUmVwZWF0ZWREdXJhdGlvbiIsICJSZXBlYXRlZFRpbWVzdGFtcCIsICJSZXBlYXRlZEZpZWxkbWFzayIsICJSZXBlYXRlZFN0cnVjdCIsICJSZXBlYXRlZEFueSIsICJSZXBlYXRlZFZhbHVlIiwgIkZpZWxkbmFtZTEiLCAiRmllbGROYW1lMiIsICJGaWVsZE5hbWUzIiwgIkZpZWxkTmFtZTQiLCAiRmllbGQwTmFtZTUiLCAiRmllbGQwTmFtZTYiLCAiRmllbGROYW1lNyIsICJGaWVsZE5hbWU4IiwgIkZpZWxkTmFtZTkiLCAiRmllbGROYW1lMTAiLCAiRklFTEROQU1FMTEiLCAiRklFTEROYW1lMTIiIH0sIG5ld1tdeyAiT25lb2ZGaWVsZCIgfSwgbmV3W117IHR5cGVvZihnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtKSB9LCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UpLCBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLlBhcnNlciwgbmV3W117ICJBIiwgIkNvcmVjdXJzaXZlIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIG51bGwsIH0pLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbk1lc3NhZ2UpLCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlLlBhcnNlciwgbmV3W117ICJDIiB9LCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgIH0pKTsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLSAgI3JlZ2lvbiBFbnVtcwotICBwdWJsaWMgZW51bSBXaXJlRm9ybWF0IHsKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlVOU1BFQ0lGSUVEIildIFVuc3BlY2lmaWVkID0gMCwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlBST1RPQlVGIildIFByb3RvYnVmID0gMSwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkpTT04iKV0gSnNvbiA9IDIsCi0gIH0KLQotICBwdWJsaWMgZW51bSBGb3JlaWduRW51bSB7Ci0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJGT1JFSUdOX0ZPTyIpXSBGb3JlaWduRm9vID0gMCwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkZPUkVJR05fQkFSIildIEZvcmVpZ25CYXIgPSAxLAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiRk9SRUlHTl9CQVoiKV0gRm9yZWlnbkJheiA9IDIsCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgUmVwcmVzZW50cyBhIHNpbmdsZSB0ZXN0IGNhc2UncyBpbnB1dC4gIFRoZSB0ZXN0ZWUgc2hvdWxkOgotICAvLy8KLSAgLy8vICAgIDEuIHBhcnNlIHRoaXMgcHJvdG8gKHdoaWNoIHNob3VsZCBhbHdheXMgc3VjY2VlZCkKLSAgLy8vICAgIDIuIHBhcnNlIHRoZSBwcm90b2J1ZiBvciBKU09OIHBheWxvYWQgaW4gInBheWxvYWQiICh3aGljaCBtYXkgZmFpbCkKLSAgLy8vICAgIDMuIGlmIHRoZSBwYXJzZSBzdWNjZWVkZWQsIHNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBpbiB0aGUgcmVxdWVzdGVkIGZvcm1hdC4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENvbmZvcm1hbmNlUmVxdWVzdCA6IHBiOjpJTWVzc2FnZTxDb25mb3JtYW5jZVJlcXVlc3Q+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxDb25mb3JtYW5jZVJlcXVlc3Q+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8Q29uZm9ybWFuY2VSZXF1ZXN0PigoKSA9PiBuZXcgQ29uZm9ybWFuY2VSZXF1ZXN0KCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8Q29uZm9ybWFuY2VSZXF1ZXN0PiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpDb25mb3JtYW5jZS5Db25mb3JtYW5jZVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZvcm1hbmNlUmVxdWVzdCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgQ29uZm9ybWFuY2VSZXF1ZXN0KENvbmZvcm1hbmNlUmVxdWVzdCBvdGhlcikgOiB0aGlzKCkgewotICAgICAgcmVxdWVzdGVkT3V0cHV0Rm9ybWF0XyA9IG90aGVyLnJlcXVlc3RlZE91dHB1dEZvcm1hdF87Ci0gICAgICBzd2l0Y2ggKG90aGVyLlBheWxvYWRDYXNlKSB7Ci0gICAgICAgIGNhc2UgUGF5bG9hZE9uZW9mQ2FzZS5Qcm90b2J1ZlBheWxvYWQ6Ci0gICAgICAgICAgUHJvdG9idWZQYXlsb2FkID0gb3RoZXIuUHJvdG9idWZQYXlsb2FkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFBheWxvYWRPbmVvZkNhc2UuSnNvblBheWxvYWQ6Ci0gICAgICAgICAgSnNvblBheWxvYWQgPSBvdGhlci5Kc29uUGF5bG9hZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBDb25mb3JtYW5jZVJlcXVlc3QgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IENvbmZvcm1hbmNlUmVxdWVzdCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInByb3RvYnVmX3BheWxvYWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFByb3RvYnVmUGF5bG9hZEZpZWxkTnVtYmVyID0gMTsKLSAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgUHJvdG9idWZQYXlsb2FkIHsKLSAgICAgIGdldCB7IHJldHVybiBwYXlsb2FkQ2FzZV8gPT0gUGF5bG9hZE9uZW9mQ2FzZS5Qcm90b2J1ZlBheWxvYWQgPyAocGI6OkJ5dGVTdHJpbmcpIHBheWxvYWRfIDogcGI6OkJ5dGVTdHJpbmcuRW1wdHk7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHBheWxvYWRfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgICBwYXlsb2FkQ2FzZV8gPSBQYXlsb2FkT25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImpzb25fcGF5bG9hZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSnNvblBheWxvYWRGaWVsZE51bWJlciA9IDI7Ci0gICAgcHVibGljIHN0cmluZyBKc29uUGF5bG9hZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGF5bG9hZENhc2VfID09IFBheWxvYWRPbmVvZkNhc2UuSnNvblBheWxvYWQgPyAoc3RyaW5nKSBwYXlsb2FkXyA6ICIiOyB9Ci0gICAgICBzZXQgewotICAgICAgICBwYXlsb2FkXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgICAgcGF5bG9hZENhc2VfID0gUGF5bG9hZE9uZW9mQ2FzZS5Kc29uUGF5bG9hZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcXVlc3RlZF9vdXRwdXRfZm9ybWF0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXF1ZXN0ZWRPdXRwdXRGb3JtYXRGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6OkNvbmZvcm1hbmNlLldpcmVGb3JtYXQgcmVxdWVzdGVkT3V0cHV0Rm9ybWF0XyA9IDA7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgV2hpY2ggZm9ybWF0IHNob3VsZCB0aGUgdGVzdGVlIHNlcmlhbGl6ZSBpdHMgbWVzc2FnZSB0bz8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6OkNvbmZvcm1hbmNlLldpcmVGb3JtYXQgUmVxdWVzdGVkT3V0cHV0Rm9ybWF0IHsKLSAgICAgIGdldCB7IHJldHVybiByZXF1ZXN0ZWRPdXRwdXRGb3JtYXRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICByZXF1ZXN0ZWRPdXRwdXRGb3JtYXRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBvYmplY3QgcGF5bG9hZF87Ci0gICAgLy8vIDxzdW1tYXJ5PkVudW0gb2YgcG9zc2libGUgY2FzZXMgZm9yIHRoZSAicGF5bG9hZCIgb25lb2YuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIFBheWxvYWRPbmVvZkNhc2UgewotICAgICAgTm9uZSA9IDAsCi0gICAgICBQcm90b2J1ZlBheWxvYWQgPSAxLAotICAgICAgSnNvblBheWxvYWQgPSAyLAotICAgIH0KLSAgICBwcml2YXRlIFBheWxvYWRPbmVvZkNhc2UgcGF5bG9hZENhc2VfID0gUGF5bG9hZE9uZW9mQ2FzZS5Ob25lOwotICAgIHB1YmxpYyBQYXlsb2FkT25lb2ZDYXNlIFBheWxvYWRDYXNlIHsKLSAgICAgIGdldCB7IHJldHVybiBwYXlsb2FkQ2FzZV87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBDbGVhclBheWxvYWQoKSB7Ci0gICAgICBwYXlsb2FkQ2FzZV8gPSBQYXlsb2FkT25lb2ZDYXNlLk5vbmU7Ci0gICAgICBwYXlsb2FkXyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBDb25mb3JtYW5jZVJlcXVlc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhDb25mb3JtYW5jZVJlcXVlc3Qgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKFByb3RvYnVmUGF5bG9hZCAhPSBvdGhlci5Qcm90b2J1ZlBheWxvYWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChKc29uUGF5bG9hZCAhPSBvdGhlci5Kc29uUGF5bG9hZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFJlcXVlc3RlZE91dHB1dEZvcm1hdCAhPSBvdGhlci5SZXF1ZXN0ZWRPdXRwdXRGb3JtYXQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChQYXlsb2FkQ2FzZSAhPSBvdGhlci5QYXlsb2FkQ2FzZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChwYXlsb2FkQ2FzZV8gPT0gUGF5bG9hZE9uZW9mQ2FzZS5Qcm90b2J1ZlBheWxvYWQpIGhhc2ggXj0gUHJvdG9idWZQYXlsb2FkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAocGF5bG9hZENhc2VfID09IFBheWxvYWRPbmVvZkNhc2UuSnNvblBheWxvYWQpIGhhc2ggXj0gSnNvblBheWxvYWQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChSZXF1ZXN0ZWRPdXRwdXRGb3JtYXQgIT0gMCkgaGFzaCBePSBSZXF1ZXN0ZWRPdXRwdXRGb3JtYXQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gKGludCkgcGF5bG9hZENhc2VfOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAocGF5bG9hZENhc2VfID09IFBheWxvYWRPbmVvZkNhc2UuUHJvdG9idWZQYXlsb2FkKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKFByb3RvYnVmUGF5bG9hZCk7Ci0gICAgICB9Ci0gICAgICBpZiAocGF5bG9hZENhc2VfID09IFBheWxvYWRPbmVvZkNhc2UuSnNvblBheWxvYWQpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKEpzb25QYXlsb2FkKTsKLSAgICAgIH0KLSAgICAgIGlmIChSZXF1ZXN0ZWRPdXRwdXRGb3JtYXQgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpIFJlcXVlc3RlZE91dHB1dEZvcm1hdCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKHBheWxvYWRDYXNlXyA9PSBQYXlsb2FkT25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZShQcm90b2J1ZlBheWxvYWQpOwotICAgICAgfQotICAgICAgaWYgKHBheWxvYWRDYXNlXyA9PSBQYXlsb2FkT25lb2ZDYXNlLkpzb25QYXlsb2FkKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShKc29uUGF5bG9hZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVxdWVzdGVkT3V0cHV0Rm9ybWF0ICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBSZXF1ZXN0ZWRPdXRwdXRGb3JtYXQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKENvbmZvcm1hbmNlUmVxdWVzdCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlJlcXVlc3RlZE91dHB1dEZvcm1hdCAhPSAwKSB7Ci0gICAgICAgIFJlcXVlc3RlZE91dHB1dEZvcm1hdCA9IG90aGVyLlJlcXVlc3RlZE91dHB1dEZvcm1hdDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAob3RoZXIuUGF5bG9hZENhc2UpIHsKLSAgICAgICAgY2FzZSBQYXlsb2FkT25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZDoKLSAgICAgICAgICBQcm90b2J1ZlBheWxvYWQgPSBvdGhlci5Qcm90b2J1ZlBheWxvYWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUGF5bG9hZE9uZW9mQ2FzZS5Kc29uUGF5bG9hZDoKLSAgICAgICAgICBKc29uUGF5bG9hZCA9IG90aGVyLkpzb25QYXlsb2FkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgUHJvdG9idWZQYXlsb2FkID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgSnNvblBheWxvYWQgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgICAgcmVxdWVzdGVkT3V0cHV0Rm9ybWF0XyA9IChnbG9iYWw6OkNvbmZvcm1hbmNlLldpcmVGb3JtYXQpIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBSZXByZXNlbnRzIGEgc2luZ2xlIHRlc3QgY2FzZSdzIG91dHB1dC4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIENvbmZvcm1hbmNlUmVzcG9uc2UgOiBwYjo6SU1lc3NhZ2U8Q29uZm9ybWFuY2VSZXNwb25zZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPENvbmZvcm1hbmNlUmVzcG9uc2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8Q29uZm9ybWFuY2VSZXNwb25zZT4oKCkgPT4gbmV3IENvbmZvcm1hbmNlUmVzcG9uc2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxDb25mb3JtYW5jZVJlc3BvbnNlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpDb25mb3JtYW5jZS5Db25mb3JtYW5jZVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIENvbmZvcm1hbmNlUmVzcG9uc2UoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIENvbmZvcm1hbmNlUmVzcG9uc2UoQ29uZm9ybWFuY2VSZXNwb25zZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgc3dpdGNoIChvdGhlci5SZXN1bHRDYXNlKSB7Ci0gICAgICAgIGNhc2UgUmVzdWx0T25lb2ZDYXNlLlBhcnNlRXJyb3I6Ci0gICAgICAgICAgUGFyc2VFcnJvciA9IG90aGVyLlBhcnNlRXJyb3I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVzdWx0T25lb2ZDYXNlLlNlcmlhbGl6ZUVycm9yOgotICAgICAgICAgIFNlcmlhbGl6ZUVycm9yID0gb3RoZXIuU2VyaWFsaXplRXJyb3I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVzdWx0T25lb2ZDYXNlLlJ1bnRpbWVFcnJvcjoKLSAgICAgICAgICBSdW50aW1lRXJyb3IgPSBvdGhlci5SdW50aW1lRXJyb3I7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVzdWx0T25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZDoKLSAgICAgICAgICBQcm90b2J1ZlBheWxvYWQgPSBvdGhlci5Qcm90b2J1ZlBheWxvYWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVzdWx0T25lb2ZDYXNlLkpzb25QYXlsb2FkOgotICAgICAgICAgIEpzb25QYXlsb2FkID0gb3RoZXIuSnNvblBheWxvYWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUmVzdWx0T25lb2ZDYXNlLlNraXBwZWQ6Ci0gICAgICAgICAgU2tpcHBlZCA9IG90aGVyLlNraXBwZWQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQ29uZm9ybWFuY2VSZXNwb25zZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgQ29uZm9ybWFuY2VSZXNwb25zZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhcnNlX2Vycm9yIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQYXJzZUVycm9yRmllbGROdW1iZXIgPSAxOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoaXMgc3RyaW5nIHNob3VsZCBiZSBzZXQgdG8gaW5kaWNhdGUgcGFyc2luZyBmYWlsZWQuICBUaGUgc3RyaW5nIGNhbgotICAgIC8vLyAgcHJvdmlkZSBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJzZSBlcnJvciBpZiBpdCBpcyBhdmFpbGFibGUuCi0gICAgLy8vCi0gICAgLy8vICBTZXR0aW5nIHRoaXMgc3RyaW5nIGRvZXMgbm90IG5lY2Vzc2FyaWx5IG1lYW4gdGhlIHRlc3RlZSBmYWlsZWQgdGhlCi0gICAgLy8vICB0ZXN0LiAgU29tZSBvZiB0aGUgdGVzdCBjYXNlcyBhcmUgaW50ZW50aW9uYWxseSBpbnZhbGlkIGlucHV0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBQYXJzZUVycm9yIHsKLSAgICAgIGdldCB7IHJldHVybiByZXN1bHRDYXNlXyA9PSBSZXN1bHRPbmVvZkNhc2UuUGFyc2VFcnJvciA/IChzdHJpbmcpIHJlc3VsdF8gOiAiIjsgfQotICAgICAgc2V0IHsKLSAgICAgICAgcmVzdWx0XyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgICAgcmVzdWx0Q2FzZV8gPSBSZXN1bHRPbmVvZkNhc2UuUGFyc2VFcnJvcjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNlcmlhbGl6ZV9lcnJvciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2VyaWFsaXplRXJyb3JGaWVsZE51bWJlciA9IDY7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgSWYgdGhlIGlucHV0IHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkIGJ1dCBlcnJvcnMgb2NjdXJyZWQgd2hlbgotICAgIC8vLyAgc2VyaWFsaXppbmcgaXQgdG8gdGhlIHJlcXVlc3RlZCBvdXRwdXQgZm9ybWF0LCBzZXQgdGhlIGVycm9yIG1lc3NhZ2UgaW4KLSAgICAvLy8gIHRoaXMgZmllbGQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFNlcmlhbGl6ZUVycm9yIHsKLSAgICAgIGdldCB7IHJldHVybiByZXN1bHRDYXNlXyA9PSBSZXN1bHRPbmVvZkNhc2UuU2VyaWFsaXplRXJyb3IgPyAoc3RyaW5nKSByZXN1bHRfIDogIiI7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHJlc3VsdF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgIHJlc3VsdENhc2VfID0gUmVzdWx0T25lb2ZDYXNlLlNlcmlhbGl6ZUVycm9yOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicnVudGltZV9lcnJvciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUnVudGltZUVycm9yRmllbGROdW1iZXIgPSAyOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoaXMgc2hvdWxkIGJlIHNldCBpZiBzb21lIG90aGVyIGVycm9yIG9jY3VycmVkLiAgVGhpcyB3aWxsIGFsd2F5cwotICAgIC8vLyAgaW5kaWNhdGUgdGhhdCB0aGUgdGVzdCBmYWlsZWQuICBUaGUgc3RyaW5nIGNhbiBwcm92aWRlIG1vcmUgaW5mb3JtYXRpb24KLSAgICAvLy8gIGFib3V0IHRoZSBmYWlsdXJlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBSdW50aW1lRXJyb3IgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5SdW50aW1lRXJyb3IgPyAoc3RyaW5nKSByZXN1bHRfIDogIiI7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHJlc3VsdF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgIHJlc3VsdENhc2VfID0gUmVzdWx0T25lb2ZDYXNlLlJ1bnRpbWVFcnJvcjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInByb3RvYnVmX3BheWxvYWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFByb3RvYnVmUGF5bG9hZEZpZWxkTnVtYmVyID0gMzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBJZiB0aGUgaW5wdXQgd2FzIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYW5kIHRoZSByZXF1ZXN0ZWQgb3V0cHV0IHdhcwotICAgIC8vLyAgcHJvdG9idWYsIHNlcmlhbGl6ZSBpdCB0byBwcm90b2J1ZiBhbmQgc2V0IGl0IGluIHRoaXMgZmllbGQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgUHJvdG9idWZQYXlsb2FkIHsKLSAgICAgIGdldCB7IHJldHVybiByZXN1bHRDYXNlXyA9PSBSZXN1bHRPbmVvZkNhc2UuUHJvdG9idWZQYXlsb2FkID8gKHBiOjpCeXRlU3RyaW5nKSByZXN1bHRfIDogcGI6OkJ5dGVTdHJpbmcuRW1wdHk7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHJlc3VsdF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgIHJlc3VsdENhc2VfID0gUmVzdWx0T25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImpzb25fcGF5bG9hZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSnNvblBheWxvYWRGaWVsZE51bWJlciA9IDQ7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgSWYgdGhlIGlucHV0IHdhcyBzdWNjZXNzZnVsbHkgcGFyc2VkIGFuZCB0aGUgcmVxdWVzdGVkIG91dHB1dCB3YXMgSlNPTiwKLSAgICAvLy8gIHNlcmlhbGl6ZSB0byBKU09OIGFuZCBzZXQgaXQgaW4gdGhpcyBmaWVsZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgSnNvblBheWxvYWQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5Kc29uUGF5bG9hZCA/IChzdHJpbmcpIHJlc3VsdF8gOiAiIjsgfQotICAgICAgc2V0IHsKLSAgICAgICAgcmVzdWx0XyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgICAgcmVzdWx0Q2FzZV8gPSBSZXN1bHRPbmVvZkNhc2UuSnNvblBheWxvYWQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJza2lwcGVkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTa2lwcGVkRmllbGROdW1iZXIgPSA1OwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEZvciB3aGVuIHRoZSB0ZXN0ZWUgc2tpcHBlZCB0aGUgdGVzdCwgbGlrZWx5IGJlY2F1c2UgYSBjZXJ0YWluIGZlYXR1cmUKLSAgICAvLy8gIHdhc24ndCBzdXBwb3J0ZWQsIGxpa2UgSlNPTiBpbnB1dC9vdXRwdXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFNraXBwZWQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5Ta2lwcGVkID8gKHN0cmluZykgcmVzdWx0XyA6ICIiOyB9Ci0gICAgICBzZXQgewotICAgICAgICByZXN1bHRfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgICByZXN1bHRDYXNlXyA9IFJlc3VsdE9uZW9mQ2FzZS5Ta2lwcGVkOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgb2JqZWN0IHJlc3VsdF87Ci0gICAgLy8vIDxzdW1tYXJ5PkVudW0gb2YgcG9zc2libGUgY2FzZXMgZm9yIHRoZSAicmVzdWx0IiBvbmVvZi48L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gUmVzdWx0T25lb2ZDYXNlIHsKLSAgICAgIE5vbmUgPSAwLAotICAgICAgUGFyc2VFcnJvciA9IDEsCi0gICAgICBTZXJpYWxpemVFcnJvciA9IDYsCi0gICAgICBSdW50aW1lRXJyb3IgPSAyLAotICAgICAgUHJvdG9idWZQYXlsb2FkID0gMywKLSAgICAgIEpzb25QYXlsb2FkID0gNCwKLSAgICAgIFNraXBwZWQgPSA1LAotICAgIH0KLSAgICBwcml2YXRlIFJlc3VsdE9uZW9mQ2FzZSByZXN1bHRDYXNlXyA9IFJlc3VsdE9uZW9mQ2FzZS5Ob25lOwotICAgIHB1YmxpYyBSZXN1bHRPbmVvZkNhc2UgUmVzdWx0Q2FzZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVzdWx0Q2FzZV87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBDbGVhclJlc3VsdCgpIHsKLSAgICAgIHJlc3VsdENhc2VfID0gUmVzdWx0T25lb2ZDYXNlLk5vbmU7Ci0gICAgICByZXN1bHRfID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIENvbmZvcm1hbmNlUmVzcG9uc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhDb25mb3JtYW5jZVJlc3BvbnNlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChQYXJzZUVycm9yICE9IG90aGVyLlBhcnNlRXJyb3IpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChTZXJpYWxpemVFcnJvciAhPSBvdGhlci5TZXJpYWxpemVFcnJvcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFJ1bnRpbWVFcnJvciAhPSBvdGhlci5SdW50aW1lRXJyb3IpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChQcm90b2J1ZlBheWxvYWQgIT0gb3RoZXIuUHJvdG9idWZQYXlsb2FkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoSnNvblBheWxvYWQgIT0gb3RoZXIuSnNvblBheWxvYWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChTa2lwcGVkICE9IG90aGVyLlNraXBwZWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChSZXN1bHRDYXNlICE9IG90aGVyLlJlc3VsdENhc2UpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAocmVzdWx0Q2FzZV8gPT0gUmVzdWx0T25lb2ZDYXNlLlBhcnNlRXJyb3IpIGhhc2ggXj0gUGFyc2VFcnJvci5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5TZXJpYWxpemVFcnJvcikgaGFzaCBePSBTZXJpYWxpemVFcnJvci5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5SdW50aW1lRXJyb3IpIGhhc2ggXj0gUnVudGltZUVycm9yLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAocmVzdWx0Q2FzZV8gPT0gUmVzdWx0T25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZCkgaGFzaCBePSBQcm90b2J1ZlBheWxvYWQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChyZXN1bHRDYXNlXyA9PSBSZXN1bHRPbmVvZkNhc2UuSnNvblBheWxvYWQpIGhhc2ggXj0gSnNvblBheWxvYWQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChyZXN1bHRDYXNlXyA9PSBSZXN1bHRPbmVvZkNhc2UuU2tpcHBlZCkgaGFzaCBePSBTa2lwcGVkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IChpbnQpIHJlc3VsdENhc2VfOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAocmVzdWx0Q2FzZV8gPT0gUmVzdWx0T25lb2ZDYXNlLlBhcnNlRXJyb3IpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKFBhcnNlRXJyb3IpOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5SdW50aW1lRXJyb3IpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKFJ1bnRpbWVFcnJvcik7Ci0gICAgICB9Ci0gICAgICBpZiAocmVzdWx0Q2FzZV8gPT0gUmVzdWx0T25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcyhQcm90b2J1ZlBheWxvYWQpOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5Kc29uUGF5bG9hZCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMzQpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoSnNvblBheWxvYWQpOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5Ta2lwcGVkKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0Mik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhTa2lwcGVkKTsKLSAgICAgIH0KLSAgICAgIGlmIChyZXN1bHRDYXNlXyA9PSBSZXN1bHRPbmVvZkNhc2UuU2VyaWFsaXplRXJyb3IpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDUwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKFNlcmlhbGl6ZUVycm9yKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAocmVzdWx0Q2FzZV8gPT0gUmVzdWx0T25lb2ZDYXNlLlBhcnNlRXJyb3IpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFBhcnNlRXJyb3IpOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5TZXJpYWxpemVFcnJvcikgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoU2VyaWFsaXplRXJyb3IpOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5SdW50aW1lRXJyb3IpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFJ1bnRpbWVFcnJvcik7Ci0gICAgICB9Ci0gICAgICBpZiAocmVzdWx0Q2FzZV8gPT0gUmVzdWx0T25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZShQcm90b2J1ZlBheWxvYWQpOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5Kc29uUGF5bG9hZCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoSnNvblBheWxvYWQpOwotICAgICAgfQotICAgICAgaWYgKHJlc3VsdENhc2VfID09IFJlc3VsdE9uZW9mQ2FzZS5Ta2lwcGVkKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShTa2lwcGVkKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShDb25mb3JtYW5jZVJlc3BvbnNlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBzd2l0Y2ggKG90aGVyLlJlc3VsdENhc2UpIHsKLSAgICAgICAgY2FzZSBSZXN1bHRPbmVvZkNhc2UuUGFyc2VFcnJvcjoKLSAgICAgICAgICBQYXJzZUVycm9yID0gb3RoZXIuUGFyc2VFcnJvcjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSZXN1bHRPbmVvZkNhc2UuU2VyaWFsaXplRXJyb3I6Ci0gICAgICAgICAgU2VyaWFsaXplRXJyb3IgPSBvdGhlci5TZXJpYWxpemVFcnJvcjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSZXN1bHRPbmVvZkNhc2UuUnVudGltZUVycm9yOgotICAgICAgICAgIFJ1bnRpbWVFcnJvciA9IG90aGVyLlJ1bnRpbWVFcnJvcjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSZXN1bHRPbmVvZkNhc2UuUHJvdG9idWZQYXlsb2FkOgotICAgICAgICAgIFByb3RvYnVmUGF5bG9hZCA9IG90aGVyLlByb3RvYnVmUGF5bG9hZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSZXN1bHRPbmVvZkNhc2UuSnNvblBheWxvYWQ6Ci0gICAgICAgICAgSnNvblBheWxvYWQgPSBvdGhlci5Kc29uUGF5bG9hZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBSZXN1bHRPbmVvZkNhc2UuU2tpcHBlZDoKLSAgICAgICAgICBTa2lwcGVkID0gb3RoZXIuU2tpcHBlZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIFBhcnNlRXJyb3IgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgUnVudGltZUVycm9yID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIFByb3RvYnVmUGF5bG9hZCA9IGlucHV0LlJlYWRCeXRlcygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzQ6IHsKLSAgICAgICAgICAgIEpzb25QYXlsb2FkID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDI6IHsKLSAgICAgICAgICAgIFNraXBwZWQgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1MDogewotICAgICAgICAgICAgU2VyaWFsaXplRXJyb3IgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUaGlzIHByb3RvIGluY2x1ZGVzIGV2ZXJ5IHR5cGUgb2YgZmllbGQgaW4gYm90aCBzaW5ndWxhciBhbmQgcmVwZWF0ZWQKLSAgLy8vICBmb3Jtcy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RBbGxUeXBlcyA6IHBiOjpJTWVzc2FnZTxUZXN0QWxsVHlwZXM+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0QWxsVHlwZXM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEFsbFR5cGVzPigoKSA9PiBuZXcgVGVzdEFsbFR5cGVzKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEFsbFR5cGVzPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpDb25mb3JtYW5jZS5Db25mb3JtYW5jZVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RBbGxUeXBlcygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdEFsbFR5cGVzKFRlc3RBbGxUeXBlcyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgb3B0aW9uYWxJbnQzMl8gPSBvdGhlci5vcHRpb25hbEludDMyXzsKLSAgICAgIG9wdGlvbmFsSW50NjRfID0gb3RoZXIub3B0aW9uYWxJbnQ2NF87Ci0gICAgICBvcHRpb25hbFVpbnQzMl8gPSBvdGhlci5vcHRpb25hbFVpbnQzMl87Ci0gICAgICBvcHRpb25hbFVpbnQ2NF8gPSBvdGhlci5vcHRpb25hbFVpbnQ2NF87Ci0gICAgICBvcHRpb25hbFNpbnQzMl8gPSBvdGhlci5vcHRpb25hbFNpbnQzMl87Ci0gICAgICBvcHRpb25hbFNpbnQ2NF8gPSBvdGhlci5vcHRpb25hbFNpbnQ2NF87Ci0gICAgICBvcHRpb25hbEZpeGVkMzJfID0gb3RoZXIub3B0aW9uYWxGaXhlZDMyXzsKLSAgICAgIG9wdGlvbmFsRml4ZWQ2NF8gPSBvdGhlci5vcHRpb25hbEZpeGVkNjRfOwotICAgICAgb3B0aW9uYWxTZml4ZWQzMl8gPSBvdGhlci5vcHRpb25hbFNmaXhlZDMyXzsKLSAgICAgIG9wdGlvbmFsU2ZpeGVkNjRfID0gb3RoZXIub3B0aW9uYWxTZml4ZWQ2NF87Ci0gICAgICBvcHRpb25hbEZsb2F0XyA9IG90aGVyLm9wdGlvbmFsRmxvYXRfOwotICAgICAgb3B0aW9uYWxEb3VibGVfID0gb3RoZXIub3B0aW9uYWxEb3VibGVfOwotICAgICAgb3B0aW9uYWxCb29sXyA9IG90aGVyLm9wdGlvbmFsQm9vbF87Ci0gICAgICBvcHRpb25hbFN0cmluZ18gPSBvdGhlci5vcHRpb25hbFN0cmluZ187Ci0gICAgICBvcHRpb25hbEJ5dGVzXyA9IG90aGVyLm9wdGlvbmFsQnl0ZXNfOwotICAgICAgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gb3RoZXIub3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyAhPSBudWxsID8gb3RoZXIuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlLkNsb25lKCkgOiBudWxsOwotICAgICAgT3B0aW9uYWxGb3JlaWduTWVzc2FnZSA9IG90aGVyLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfICE9IG51bGwgPyBvdGhlci5PcHRpb25hbEZvcmVpZ25NZXNzYWdlLkNsb25lKCkgOiBudWxsOwotICAgICAgb3B0aW9uYWxOZXN0ZWRFbnVtXyA9IG90aGVyLm9wdGlvbmFsTmVzdGVkRW51bV87Ci0gICAgICBvcHRpb25hbEZvcmVpZ25FbnVtXyA9IG90aGVyLm9wdGlvbmFsRm9yZWlnbkVudW1fOwotICAgICAgb3B0aW9uYWxTdHJpbmdQaWVjZV8gPSBvdGhlci5vcHRpb25hbFN0cmluZ1BpZWNlXzsKLSAgICAgIG9wdGlvbmFsQ29yZF8gPSBvdGhlci5vcHRpb25hbENvcmRfOwotICAgICAgUmVjdXJzaXZlTWVzc2FnZSA9IG90aGVyLnJlY3Vyc2l2ZU1lc3NhZ2VfICE9IG51bGwgPyBvdGhlci5SZWN1cnNpdmVNZXNzYWdlLkNsb25lKCkgOiBudWxsOwotICAgICAgcmVwZWF0ZWRJbnQzMl8gPSBvdGhlci5yZXBlYXRlZEludDMyXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRJbnQ2NF8gPSBvdGhlci5yZXBlYXRlZEludDY0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRVaW50MzJfID0gb3RoZXIucmVwZWF0ZWRVaW50MzJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZFVpbnQ2NF8gPSBvdGhlci5yZXBlYXRlZFVpbnQ2NF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkU2ludDMyXyA9IG90aGVyLnJlcGVhdGVkU2ludDMyXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRTaW50NjRfID0gb3RoZXIucmVwZWF0ZWRTaW50NjRfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEZpeGVkMzJfID0gb3RoZXIucmVwZWF0ZWRGaXhlZDMyXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRGaXhlZDY0XyA9IG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkU2ZpeGVkMzJfID0gb3RoZXIucmVwZWF0ZWRTZml4ZWQzMl8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfID0gb3RoZXIucmVwZWF0ZWRTZml4ZWQ2NF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkRmxvYXRfID0gb3RoZXIucmVwZWF0ZWRGbG9hdF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkRG91YmxlXyA9IG90aGVyLnJlcGVhdGVkRG91YmxlXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRCb29sXyA9IG90aGVyLnJlcGVhdGVkQm9vbF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkU3RyaW5nXyA9IG90aGVyLnJlcGVhdGVkU3RyaW5nXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRCeXRlc18gPSBvdGhlci5yZXBlYXRlZEJ5dGVzXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyA9IG90aGVyLnJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfID0gb3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkTmVzdGVkRW51bV8gPSBvdGhlci5yZXBlYXRlZE5lc3RlZEVudW1fLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25FbnVtXyA9IG90aGVyLnJlcGVhdGVkRm9yZWlnbkVudW1fLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZFN0cmluZ1BpZWNlXyA9IG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZENvcmRfID0gb3RoZXIucmVwZWF0ZWRDb3JkXy5DbG9uZSgpOwotICAgICAgbWFwSW50MzJJbnQzMl8gPSBvdGhlci5tYXBJbnQzMkludDMyXy5DbG9uZSgpOwotICAgICAgbWFwSW50NjRJbnQ2NF8gPSBvdGhlci5tYXBJbnQ2NEludDY0Xy5DbG9uZSgpOwotICAgICAgbWFwVWludDMyVWludDMyXyA9IG90aGVyLm1hcFVpbnQzMlVpbnQzMl8uQ2xvbmUoKTsKLSAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8gPSBvdGhlci5tYXBVaW50NjRVaW50NjRfLkNsb25lKCk7Ci0gICAgICBtYXBTaW50MzJTaW50MzJfID0gb3RoZXIubWFwU2ludDMyU2ludDMyXy5DbG9uZSgpOwotICAgICAgbWFwU2ludDY0U2ludDY0XyA9IG90aGVyLm1hcFNpbnQ2NFNpbnQ2NF8uQ2xvbmUoKTsKLSAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXyA9IG90aGVyLm1hcEZpeGVkMzJGaXhlZDMyXy5DbG9uZSgpOwotICAgICAgbWFwRml4ZWQ2NEZpeGVkNjRfID0gb3RoZXIubWFwRml4ZWQ2NEZpeGVkNjRfLkNsb25lKCk7Ci0gICAgICBtYXBTZml4ZWQzMlNmaXhlZDMyXyA9IG90aGVyLm1hcFNmaXhlZDMyU2ZpeGVkMzJfLkNsb25lKCk7Ci0gICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0XyA9IG90aGVyLm1hcFNmaXhlZDY0U2ZpeGVkNjRfLkNsb25lKCk7Ci0gICAgICBtYXBJbnQzMkZsb2F0XyA9IG90aGVyLm1hcEludDMyRmxvYXRfLkNsb25lKCk7Ci0gICAgICBtYXBJbnQzMkRvdWJsZV8gPSBvdGhlci5tYXBJbnQzMkRvdWJsZV8uQ2xvbmUoKTsKLSAgICAgIG1hcEJvb2xCb29sXyA9IG90aGVyLm1hcEJvb2xCb29sXy5DbG9uZSgpOwotICAgICAgbWFwU3RyaW5nU3RyaW5nXyA9IG90aGVyLm1hcFN0cmluZ1N0cmluZ18uQ2xvbmUoKTsKLSAgICAgIG1hcFN0cmluZ0J5dGVzXyA9IG90aGVyLm1hcFN0cmluZ0J5dGVzXy5DbG9uZSgpOwotICAgICAgbWFwU3RyaW5nTmVzdGVkTWVzc2FnZV8gPSBvdGhlci5tYXBTdHJpbmdOZXN0ZWRNZXNzYWdlXy5DbG9uZSgpOwotICAgICAgbWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2VfID0gb3RoZXIubWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2VfLkNsb25lKCk7Ci0gICAgICBtYXBTdHJpbmdOZXN0ZWRFbnVtXyA9IG90aGVyLm1hcFN0cmluZ05lc3RlZEVudW1fLkNsb25lKCk7Ci0gICAgICBtYXBTdHJpbmdGb3JlaWduRW51bV8gPSBvdGhlci5tYXBTdHJpbmdGb3JlaWduRW51bV8uQ2xvbmUoKTsKLSAgICAgIE9wdGlvbmFsQm9vbFdyYXBwZXIgPSBvdGhlci5PcHRpb25hbEJvb2xXcmFwcGVyOwotICAgICAgT3B0aW9uYWxJbnQzMldyYXBwZXIgPSBvdGhlci5PcHRpb25hbEludDMyV3JhcHBlcjsKLSAgICAgIE9wdGlvbmFsSW50NjRXcmFwcGVyID0gb3RoZXIuT3B0aW9uYWxJbnQ2NFdyYXBwZXI7Ci0gICAgICBPcHRpb25hbFVpbnQzMldyYXBwZXIgPSBvdGhlci5PcHRpb25hbFVpbnQzMldyYXBwZXI7Ci0gICAgICBPcHRpb25hbFVpbnQ2NFdyYXBwZXIgPSBvdGhlci5PcHRpb25hbFVpbnQ2NFdyYXBwZXI7Ci0gICAgICBPcHRpb25hbEZsb2F0V3JhcHBlciA9IG90aGVyLk9wdGlvbmFsRmxvYXRXcmFwcGVyOwotICAgICAgT3B0aW9uYWxEb3VibGVXcmFwcGVyID0gb3RoZXIuT3B0aW9uYWxEb3VibGVXcmFwcGVyOwotICAgICAgT3B0aW9uYWxTdHJpbmdXcmFwcGVyID0gb3RoZXIuT3B0aW9uYWxTdHJpbmdXcmFwcGVyOwotICAgICAgT3B0aW9uYWxCeXRlc1dyYXBwZXIgPSBvdGhlci5PcHRpb25hbEJ5dGVzV3JhcHBlcjsKLSAgICAgIHJlcGVhdGVkQm9vbFdyYXBwZXJfID0gb3RoZXIucmVwZWF0ZWRCb29sV3JhcHBlcl8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkSW50MzJXcmFwcGVyXyA9IG90aGVyLnJlcGVhdGVkSW50MzJXcmFwcGVyXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRJbnQ2NFdyYXBwZXJfID0gb3RoZXIucmVwZWF0ZWRJbnQ2NFdyYXBwZXJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZFVpbnQzMldyYXBwZXJfID0gb3RoZXIucmVwZWF0ZWRVaW50MzJXcmFwcGVyXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRVaW50NjRXcmFwcGVyXyA9IG90aGVyLnJlcGVhdGVkVWludDY0V3JhcHBlcl8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkRmxvYXRXcmFwcGVyXyA9IG90aGVyLnJlcGVhdGVkRmxvYXRXcmFwcGVyXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWREb3VibGVXcmFwcGVyXyA9IG90aGVyLnJlcGVhdGVkRG91YmxlV3JhcHBlcl8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkU3RyaW5nV3JhcHBlcl8gPSBvdGhlci5yZXBlYXRlZFN0cmluZ1dyYXBwZXJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEJ5dGVzV3JhcHBlcl8gPSBvdGhlci5yZXBlYXRlZEJ5dGVzV3JhcHBlcl8uQ2xvbmUoKTsKLSAgICAgIE9wdGlvbmFsRHVyYXRpb24gPSBvdGhlci5vcHRpb25hbER1cmF0aW9uXyAhPSBudWxsID8gb3RoZXIuT3B0aW9uYWxEdXJhdGlvbi5DbG9uZSgpIDogbnVsbDsKLSAgICAgIE9wdGlvbmFsVGltZXN0YW1wID0gb3RoZXIub3B0aW9uYWxUaW1lc3RhbXBfICE9IG51bGwgPyBvdGhlci5PcHRpb25hbFRpbWVzdGFtcC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIE9wdGlvbmFsRmllbGRNYXNrID0gb3RoZXIub3B0aW9uYWxGaWVsZE1hc2tfICE9IG51bGwgPyBvdGhlci5PcHRpb25hbEZpZWxkTWFzay5DbG9uZSgpIDogbnVsbDsKLSAgICAgIE9wdGlvbmFsU3RydWN0ID0gb3RoZXIub3B0aW9uYWxTdHJ1Y3RfICE9IG51bGwgPyBvdGhlci5PcHRpb25hbFN0cnVjdC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIE9wdGlvbmFsQW55ID0gb3RoZXIub3B0aW9uYWxBbnlfICE9IG51bGwgPyBvdGhlci5PcHRpb25hbEFueS5DbG9uZSgpIDogbnVsbDsKLSAgICAgIE9wdGlvbmFsVmFsdWUgPSBvdGhlci5vcHRpb25hbFZhbHVlXyAhPSBudWxsID8gb3RoZXIuT3B0aW9uYWxWYWx1ZS5DbG9uZSgpIDogbnVsbDsKLSAgICAgIHJlcGVhdGVkRHVyYXRpb25fID0gb3RoZXIucmVwZWF0ZWREdXJhdGlvbl8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkVGltZXN0YW1wXyA9IG90aGVyLnJlcGVhdGVkVGltZXN0YW1wXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRGaWVsZG1hc2tfID0gb3RoZXIucmVwZWF0ZWRGaWVsZG1hc2tfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZFN0cnVjdF8gPSBvdGhlci5yZXBlYXRlZFN0cnVjdF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkQW55XyA9IG90aGVyLnJlcGVhdGVkQW55Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRWYWx1ZV8gPSBvdGhlci5yZXBlYXRlZFZhbHVlXy5DbG9uZSgpOwotICAgICAgZmllbGRuYW1lMV8gPSBvdGhlci5maWVsZG5hbWUxXzsKLSAgICAgIGZpZWxkTmFtZTJfID0gb3RoZXIuZmllbGROYW1lMl87Ci0gICAgICBGaWVsZE5hbWUzXyA9IG90aGVyLkZpZWxkTmFtZTNfOwotICAgICAgZmllbGROYW1lNF8gPSBvdGhlci5maWVsZE5hbWU0XzsKLSAgICAgIGZpZWxkME5hbWU1XyA9IG90aGVyLmZpZWxkME5hbWU1XzsKLSAgICAgIGZpZWxkME5hbWU2XyA9IG90aGVyLmZpZWxkME5hbWU2XzsKLSAgICAgIGZpZWxkTmFtZTdfID0gb3RoZXIuZmllbGROYW1lN187Ci0gICAgICBmaWVsZE5hbWU4XyA9IG90aGVyLmZpZWxkTmFtZThfOwotICAgICAgZmllbGROYW1lOV8gPSBvdGhlci5maWVsZE5hbWU5XzsKLSAgICAgIGZpZWxkTmFtZTEwXyA9IG90aGVyLmZpZWxkTmFtZTEwXzsKLSAgICAgIGZJRUxETkFNRTExXyA9IG90aGVyLmZJRUxETkFNRTExXzsKLSAgICAgIGZJRUxETmFtZTEyXyA9IG90aGVyLmZJRUxETmFtZTEyXzsKLSAgICAgIHN3aXRjaCAob3RoZXIuT25lb2ZGaWVsZENhc2UpIHsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyOgotICAgICAgICAgIE9uZW9mVWludDMyID0gb3RoZXIuT25lb2ZVaW50MzI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZk5lc3RlZE1lc3NhZ2U6Ci0gICAgICAgICAgT25lb2ZOZXN0ZWRNZXNzYWdlID0gb3RoZXIuT25lb2ZOZXN0ZWRNZXNzYWdlLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZzoKLSAgICAgICAgICBPbmVvZlN0cmluZyA9IG90aGVyLk9uZW9mU3RyaW5nOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlczoKLSAgICAgICAgICBPbmVvZkJ5dGVzID0gb3RoZXIuT25lb2ZCeXRlczsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0QWxsVHlwZXMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RBbGxUeXBlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2ludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgaW50IG9wdGlvbmFsSW50MzJfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFNpbmd1bGFyCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50IE9wdGlvbmFsSW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsSW50MzJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbEludDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50NjRGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBsb25nIG9wdGlvbmFsSW50NjRfOwotICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsSW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsSW50NjRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbEludDY0XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfdWludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQzMkZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIHVpbnQgb3B0aW9uYWxVaW50MzJfOwotICAgIHB1YmxpYyB1aW50IE9wdGlvbmFsVWludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQzMl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsVWludDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfdWludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQ2NEZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHVsb25nIG9wdGlvbmFsVWludDY0XzsKLSAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxVaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsVWludDY0XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxVaW50NjRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9zaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ludDMyRmllbGROdW1iZXIgPSA1OwotICAgIHByaXZhdGUgaW50IG9wdGlvbmFsU2ludDMyXzsKLSAgICBwdWJsaWMgaW50IE9wdGlvbmFsU2ludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFNpbnQzMl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsU2ludDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfc2ludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFNpbnQ2NEZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIGxvbmcgb3B0aW9uYWxTaW50NjRfOwotICAgIHB1YmxpYyBsb25nIE9wdGlvbmFsU2ludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFNpbnQ2NF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsU2ludDY0XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfZml4ZWQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGaXhlZDMyRmllbGROdW1iZXIgPSA3OwotICAgIHByaXZhdGUgdWludCBvcHRpb25hbEZpeGVkMzJfOwotICAgIHB1YmxpYyB1aW50IE9wdGlvbmFsRml4ZWQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxGaXhlZDMyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxGaXhlZDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGaXhlZDY0RmllbGROdW1iZXIgPSA4OwotICAgIHByaXZhdGUgdWxvbmcgb3B0aW9uYWxGaXhlZDY0XzsKLSAgICBwdWJsaWMgdWxvbmcgT3B0aW9uYWxGaXhlZDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZpeGVkNjRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbEZpeGVkNjRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9zZml4ZWQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTZml4ZWQzMkZpZWxkTnVtYmVyID0gOTsKLSAgICBwcml2YXRlIGludCBvcHRpb25hbFNmaXhlZDMyXzsKLSAgICBwdWJsaWMgaW50IE9wdGlvbmFsU2ZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU2ZpeGVkMzJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbFNmaXhlZDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfc2ZpeGVkNjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU2ZpeGVkNjRGaWVsZE51bWJlciA9IDEwOwotICAgIHByaXZhdGUgbG9uZyBvcHRpb25hbFNmaXhlZDY0XzsKLSAgICBwdWJsaWMgbG9uZyBPcHRpb25hbFNmaXhlZDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFNmaXhlZDY0XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxTZml4ZWQ2NF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2Zsb2F0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEZsb2F0RmllbGROdW1iZXIgPSAxMTsKLSAgICBwcml2YXRlIGZsb2F0IG9wdGlvbmFsRmxvYXRfOwotICAgIHB1YmxpYyBmbG9hdCBPcHRpb25hbEZsb2F0IHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZsb2F0XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxGbG9hdF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2RvdWJsZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxEb3VibGVGaWVsZE51bWJlciA9IDEyOwotICAgIHByaXZhdGUgZG91YmxlIG9wdGlvbmFsRG91YmxlXzsKLSAgICBwdWJsaWMgZG91YmxlIE9wdGlvbmFsRG91YmxlIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbERvdWJsZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsRG91YmxlXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfYm9vbCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxCb29sRmllbGROdW1iZXIgPSAxMzsKLSAgICBwcml2YXRlIGJvb2wgb3B0aW9uYWxCb29sXzsKLSAgICBwdWJsaWMgYm9vbCBPcHRpb25hbEJvb2wgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsQm9vbF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsQm9vbF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX3N0cmluZyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdGaWVsZE51bWJlciA9IDE0OwotICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsU3RyaW5nXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxTdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU3RyaW5nXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxTdHJpbmdfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfYnl0ZXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQnl0ZXNGaWVsZE51bWJlciA9IDE1OwotICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgb3B0aW9uYWxCeXRlc18gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsKLSAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgT3B0aW9uYWxCeXRlcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxCeXRlc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsQnl0ZXNfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsTmVzdGVkTWVzc2FnZUZpZWxkTnVtYmVyID0gMTg7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV87Ci0gICAgcHVibGljIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgT3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbE5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDE5OwotICAgIHByaXZhdGUgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduTWVzc2FnZSBvcHRpb25hbEZvcmVpZ25NZXNzYWdlXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduTWVzc2FnZSBPcHRpb25hbEZvcmVpZ25NZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZvcmVpZ25NZXNzYWdlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX25lc3RlZF9lbnVtIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbE5lc3RlZEVudW1GaWVsZE51bWJlciA9IDIxOwotICAgIHByaXZhdGUgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBvcHRpb25hbE5lc3RlZEVudW1fID0gMDsKLSAgICBwdWJsaWMgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBPcHRpb25hbE5lc3RlZEVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsTmVzdGVkRW51bV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsTmVzdGVkRW51bV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxGb3JlaWduRW51bUZpZWxkTnVtYmVyID0gMjI7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25FbnVtIG9wdGlvbmFsRm9yZWlnbkVudW1fID0gMDsKLSAgICBwdWJsaWMgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduRW51bSBPcHRpb25hbEZvcmVpZ25FbnVtIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEZvcmVpZ25FbnVtXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxGb3JlaWduRW51bV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX3N0cmluZ19waWVjZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdQaWVjZUZpZWxkTnVtYmVyID0gMjQ7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgb3B0aW9uYWxTdHJpbmdQaWVjZV8gPSAiIjsKLSAgICBwdWJsaWMgc3RyaW5nIE9wdGlvbmFsU3RyaW5nUGllY2UgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU3RyaW5nUGllY2VfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbFN0cmluZ1BpZWNlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2NvcmQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQ29yZEZpZWxkTnVtYmVyID0gMjU7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgb3B0aW9uYWxDb3JkXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgT3B0aW9uYWxDb3JkIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbENvcmRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbENvcmRfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVjdXJzaXZlX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlY3Vyc2l2ZU1lc3NhZ2VGaWVsZE51bWJlciA9IDI3OwotICAgIHByaXZhdGUgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMgcmVjdXJzaXZlTWVzc2FnZV87Ci0gICAgcHVibGljIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzIFJlY3Vyc2l2ZU1lc3NhZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlY3Vyc2l2ZU1lc3NhZ2VfOyB9Ci0gICAgICBzZXQgewotICAgICAgICByZWN1cnNpdmVNZXNzYWdlXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50MzJGaWVsZE51bWJlciA9IDMxOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3JlcGVhdGVkSW50MzJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMigyNTApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcmVwZWF0ZWRJbnQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBSZXBlYXRlZAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IFJlcGVhdGVkSW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW50MzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9pbnQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQ2NEZpZWxkTnVtYmVyID0gMzI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz4gX3JlcGVhdGVkX3JlcGVhdGVkSW50NjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQ2NCgyNTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IHJlcGVhdGVkSW50NjRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gUmVwZWF0ZWRJbnQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3VpbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50MzJGaWVsZE51bWJlciA9IDMzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHVpbnQ+IF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclVJbnQzMigyNjYpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+IHJlcGVhdGVkVWludDMyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+IFJlcGVhdGVkVWludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3VpbnQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50NjRGaWVsZE51bWJlciA9IDM0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHVsb25nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRVaW50NjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JVSW50NjQoMjc0KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4gcmVwZWF0ZWRVaW50NjRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPiBSZXBlYXRlZFVpbnQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRVaW50NjRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9zaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ludDMyRmllbGROdW1iZXIgPSAzNTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ+IF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclNJbnQzMigyODIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcmVwZWF0ZWRTaW50MzJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IFJlcGVhdGVkU2ludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNpbnQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3NpbnQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTaW50NjRGaWVsZE51bWJlciA9IDM2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGxvbmc+IF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclNJbnQ2NCgyOTApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IHJlcGVhdGVkU2ludDY0XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IFJlcGVhdGVkU2ludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQzMkZpZWxkTnVtYmVyID0gMzc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWludD4gX3JlcGVhdGVkX3JlcGVhdGVkRml4ZWQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckZpeGVkMzIoMjk4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PiByZXBlYXRlZEZpeGVkMzJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD4gUmVwZWF0ZWRGaXhlZDMyIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZpeGVkMzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9maXhlZDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZpeGVkNjRGaWVsZE51bWJlciA9IDM4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHVsb25nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDY0X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQ2NCgzMDYpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPiByZXBlYXRlZEZpeGVkNjRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPiBSZXBlYXRlZEZpeGVkNjQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRml4ZWQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3NmaXhlZDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNmaXhlZDMyRmllbGROdW1iZXIgPSAzOTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ+IF9yZXBlYXRlZF9yZXBlYXRlZFNmaXhlZDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU0ZpeGVkMzIoMzE0KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IHJlcGVhdGVkU2ZpeGVkMzJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IFJlcGVhdGVkU2ZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU2ZpeGVkMzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9zZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gNDA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz4gX3JlcGVhdGVkX3JlcGVhdGVkU2ZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQ2NCgzMjIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IHJlcGVhdGVkU2ZpeGVkNjRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gUmVwZWF0ZWRTZml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTZml4ZWQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2Zsb2F0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZsb2F0RmllbGROdW1iZXIgPSA0MTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxmbG9hdD4gX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JGbG9hdCgzMzApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGZsb2F0PiByZXBlYXRlZEZsb2F0XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8ZmxvYXQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD4gUmVwZWF0ZWRGbG9hdCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGbG9hdF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2RvdWJsZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWREb3VibGVGaWVsZE51bWJlciA9IDQyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGRvdWJsZT4gX3JlcGVhdGVkX3JlcGVhdGVkRG91YmxlX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRG91YmxlKDMzOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8ZG91YmxlPiByZXBlYXRlZERvdWJsZV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGRvdWJsZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGRvdWJsZT4gUmVwZWF0ZWREb3VibGUgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRG91YmxlXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfYm9vbCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRCb29sRmllbGROdW1iZXIgPSA0MzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxib29sPiBfcmVwZWF0ZWRfcmVwZWF0ZWRCb29sX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yQm9vbCgzNDYpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGJvb2w+IHJlcGVhdGVkQm9vbF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGJvb2w+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxib29sPiBSZXBlYXRlZEJvb2wgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQm9vbF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3N0cmluZyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZE51bWJlciA9IDQ0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHN0cmluZz4gX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RyaW5nKDM1NCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiByZXBlYXRlZFN0cmluZ18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4gUmVwZWF0ZWRTdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfYnl0ZXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQnl0ZXNGaWVsZE51bWJlciA9IDQ1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHBiOjpCeXRlU3RyaW5nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRCeXRlc19jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckJ5dGVzKDM2Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8cGI6OkJ5dGVTdHJpbmc+IHJlcGVhdGVkQnl0ZXNfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxwYjo6Qnl0ZVN0cmluZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHBiOjpCeXRlU3RyaW5nPiBSZXBlYXRlZEJ5dGVzIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEJ5dGVzXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkTWVzc2FnZUZpZWxkTnVtYmVyID0gNDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkTWVzc2FnZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMzg2LCBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+IFJlcGVhdGVkTmVzdGVkTWVzc2FnZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlRmllbGROdW1iZXIgPSA0OTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlPiBfcmVwZWF0ZWRfcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMzk0LCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduTWVzc2FnZT4gcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbk1lc3NhZ2U+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlPiBSZXBlYXRlZEZvcmVpZ25NZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfbmVzdGVkX2VudW0iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkRW51bUZpZWxkTnVtYmVyID0gNTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4gX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkRW51bV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckVudW0oNDEwLCB4ID0+IChpbnQpIHgsIHggPT4gKGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0pIHgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IHJlcGVhdGVkTmVzdGVkRW51bV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBSZXBlYXRlZE5lc3RlZEVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTmVzdGVkRW51bV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUZpZWxkTnVtYmVyID0gNTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduRW51bT4gX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbkVudW1fY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JFbnVtKDQxOCwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25FbnVtKSB4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25FbnVtPiByZXBlYXRlZEZvcmVpZ25FbnVtXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduRW51bT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbkVudW0+IFJlcGVhdGVkRm9yZWlnbkVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbkVudW1fOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9zdHJpbmdfcGllY2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nUGllY2VGaWVsZE51bWJlciA9IDU0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHN0cmluZz4gX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nUGllY2VfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJpbmcoNDM0KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHJlcGVhdGVkU3RyaW5nUGllY2VfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+IFJlcGVhdGVkU3RyaW5nUGllY2UgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nUGllY2VfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9jb3JkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZENvcmRGaWVsZE51bWJlciA9IDU1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHN0cmluZz4gX3JlcGVhdGVkX3JlcGVhdGVkQ29yZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cmluZyg0NDIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4gcmVwZWF0ZWRDb3JkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBSZXBlYXRlZENvcmQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQ29yZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9pbnQzMl9pbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwSW50MzJJbnQzMkZpZWxkTnVtYmVyID0gNTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMgX21hcF9tYXBJbnQzMkludDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMigxNiksIDQ1MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgaW50PiBtYXBJbnQzMkludDMyXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50PigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIE1hcAotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IE1hcEludDMySW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMySW50MzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50NjRfaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDY0SW50NjRGaWVsZE51bWJlciA9IDU3OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4uQ29kZWMgX21hcF9tYXBJbnQ2NEludDY0X2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50NjQoOCksIHBiOjpGaWVsZENvZGVjLkZvckludDY0KDE2KSwgNDU4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4gbWFwSW50NjRJbnQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IE1hcEludDY0SW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDY0SW50NjRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfdWludDMyX3VpbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwVWludDMyVWludDMyRmllbGROdW1iZXIgPSA1ODsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+LkNvZGVjIF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yVUludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JVSW50MzIoMTYpLCA0NjYpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1aW50LCB1aW50PiBtYXBVaW50MzJVaW50MzJfID0gbmV3IHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDx1aW50LCB1aW50PiBNYXBVaW50MzJVaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFVpbnQzMlVpbnQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF91aW50NjRfdWludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBVaW50NjRVaW50NjRGaWVsZE51bWJlciA9IDU5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPi5Db2RlYyBfbWFwX21hcFVpbnQ2NFVpbnQ2NF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPHVsb25nLCB1bG9uZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yVUludDY0KDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JVSW50NjQoMTYpLCA0NzQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+IG1hcFVpbnQ2NFVpbnQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPiBNYXBVaW50NjRVaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFVpbnQ2NFVpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9zaW50MzJfc2ludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBTaW50MzJTaW50MzJGaWVsZE51bWJlciA9IDYwOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjIF9tYXBfbWFwU2ludDMyU2ludDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvclNJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yU0ludDMyKDE2KSwgNDgyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IG1hcFNpbnQzMlNpbnQzMl8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4gTWFwU2ludDMyU2ludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBTaW50MzJTaW50MzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfc2ludDY0X3NpbnQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwU2ludDY0U2ludDY0RmllbGROdW1iZXIgPSA2MTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+LkNvZGVjIF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU0ludDY0KDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JTSW50NjQoMTYpLCA0OTApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPiBtYXBTaW50NjRTaW50NjRfID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPiBNYXBTaW50NjRTaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFNpbnQ2NFNpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9maXhlZDMyX2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEZpeGVkMzJGaXhlZDMyRmllbGROdW1iZXIgPSA2MjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+LkNvZGVjIF9tYXBfbWFwRml4ZWQzMkZpeGVkMzJfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDx1aW50LCB1aW50Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JGaXhlZDMyKDEzKSwgcGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQzMigyMSksIDQ5OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+IG1hcEZpeGVkMzJGaXhlZDMyXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4gTWFwRml4ZWQzMkZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEZpeGVkMzJGaXhlZDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ZpeGVkNjRfZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwRml4ZWQ2NEZpeGVkNjRGaWVsZE51bWJlciA9IDYzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPi5Db2RlYyBfbWFwX21hcEZpeGVkNjRGaXhlZDY0X2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JGaXhlZDY0KDkpLCBwYjo6RmllbGRDb2RlYy5Gb3JGaXhlZDY0KDE3KSwgNTA2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPiBtYXBGaXhlZDY0Rml4ZWQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPiBNYXBGaXhlZDY0Rml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwRml4ZWQ2NEZpeGVkNjRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfc2ZpeGVkMzJfc2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFNmaXhlZDMyU2ZpeGVkMzJGaWVsZE51bWJlciA9IDY0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjIF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQzMigxMyksIHBiOjpGaWVsZENvZGVjLkZvclNGaXhlZDMyKDIxKSwgNTE0KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IG1hcFNmaXhlZDMyU2ZpeGVkMzJfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IE1hcFNmaXhlZDMyU2ZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFNmaXhlZDMyU2ZpeGVkMzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFNmaXhlZDY0U2ZpeGVkNjRGaWVsZE51bWJlciA9IDY1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4uQ29kZWMgX21hcF9tYXBTZml4ZWQ2NFNmaXhlZDY0X2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU0ZpeGVkNjQoOSksIHBiOjpGaWVsZENvZGVjLkZvclNGaXhlZDY0KDE3KSwgNTIyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4gbWFwU2ZpeGVkNjRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IE1hcFNmaXhlZDY0U2ZpeGVkNjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFNmaXhlZDY0U2ZpeGVkNjRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50MzJfZmxvYXQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDMyRmxvYXRGaWVsZE51bWJlciA9IDY2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBmbG9hdD4uQ29kZWMgX21hcF9tYXBJbnQzMkZsb2F0X2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBmbG9hdD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvckZsb2F0KDIxKSwgNTMwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBmbG9hdD4gbWFwSW50MzJGbG9hdF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGZsb2F0PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ+IE1hcEludDMyRmxvYXQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMyRmxvYXRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50MzJfZG91YmxlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBJbnQzMkRvdWJsZUZpZWxkTnVtYmVyID0gNjc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGRvdWJsZT4uQ29kZWMgX21hcF9tYXBJbnQzMkRvdWJsZV9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZG91YmxlPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yRG91YmxlKDE3KSwgNTM4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBkb3VibGU+IG1hcEludDMyRG91YmxlXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZG91YmxlPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZG91YmxlPiBNYXBJbnQzMkRvdWJsZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwSW50MzJEb3VibGVfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfYm9vbF9ib29sIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBCb29sQm9vbEZpZWxkTnVtYmVyID0gNjg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxib29sLCBib29sPi5Db2RlYyBfbWFwX21hcEJvb2xCb29sX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8Ym9vbCwgYm9vbD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yQm9vbCg4KSwgcGI6OkZpZWxkQ29kZWMuRm9yQm9vbCgxNiksIDU0Nik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGJvb2wsIGJvb2w+IG1hcEJvb2xCb29sXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGJvb2wsIGJvb2w+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8Ym9vbCwgYm9vbD4gTWFwQm9vbEJvb2wgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEJvb2xCb29sXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3N0cmluZ19zdHJpbmciIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFN0cmluZ1N0cmluZ0ZpZWxkTnVtYmVyID0gNjk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4uQ29kZWMgX21hcF9tYXBTdHJpbmdTdHJpbmdfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU3RyaW5nKDEwKSwgcGI6OkZpZWxkQ29kZWMuRm9yU3RyaW5nKDE4KSwgNTU0KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IG1hcFN0cmluZ1N0cmluZ18gPSBuZXcgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4gTWFwU3RyaW5nU3RyaW5nIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBTdHJpbmdTdHJpbmdfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfc3RyaW5nX2J5dGVzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBTdHJpbmdCeXRlc0ZpZWxkTnVtYmVyID0gNzA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHBiOjpCeXRlU3RyaW5nPi5Db2RlYyBfbWFwX21hcFN0cmluZ0J5dGVzX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBwYjo6Qnl0ZVN0cmluZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU3RyaW5nKDEwKSwgcGI6OkZpZWxkQ29kZWMuRm9yQnl0ZXMoMTgpLCA1NjIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHBiOjpCeXRlU3RyaW5nPiBtYXBTdHJpbmdCeXRlc18gPSBuZXcgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHBiOjpCeXRlU3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgcGI6OkJ5dGVTdHJpbmc+IE1hcFN0cmluZ0J5dGVzIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBTdHJpbmdCeXRlc187IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9zdHJpbmdfbmVzdGVkX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFN0cmluZ05lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDcxOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPi5Db2RlYyBfbWFwX21hcFN0cmluZ05lc3RlZE1lc3NhZ2VfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvclN0cmluZygxMCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuUGFyc2VyKSwgNTcwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBtYXBTdHJpbmdOZXN0ZWRNZXNzYWdlXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2U+IE1hcFN0cmluZ05lc3RlZE1lc3NhZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFN0cmluZ05lc3RlZE1lc3NhZ2VfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfc3RyaW5nX2ZvcmVpZ25fbWVzc2FnZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDcyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlPi5Db2RlYyBfbWFwX21hcFN0cmluZ0ZvcmVpZ25NZXNzYWdlX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTdHJpbmcoMTApLCBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlLlBhcnNlciksIDU3OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHN0cmluZywgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduTWVzc2FnZT4gbWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2VfID0gbmV3IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25NZXNzYWdlPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduTWVzc2FnZT4gTWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFN0cmluZ0ZvcmVpZ25NZXNzYWdlXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3N0cmluZ19uZXN0ZWRfZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwU3RyaW5nTmVzdGVkRW51bUZpZWxkTnVtYmVyID0gNzM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+LkNvZGVjIF9tYXBfbWFwU3RyaW5nTmVzdGVkRW51bV9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU3RyaW5nKDEwKSwgcGI6OkZpZWxkQ29kZWMuRm9yRW51bSgxNiwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtKSB4KSwgNTg2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBtYXBTdHJpbmdOZXN0ZWRFbnVtXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IE1hcFN0cmluZ05lc3RlZEVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFN0cmluZ05lc3RlZEVudW1fOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfc3RyaW5nX2ZvcmVpZ25fZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwU3RyaW5nRm9yZWlnbkVudW1GaWVsZE51bWJlciA9IDc0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25FbnVtPi5Db2RlYyBfbWFwX21hcFN0cmluZ0ZvcmVpZ25FbnVtX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6OkNvbmZvcm1hbmNlLkZvcmVpZ25FbnVtPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTdHJpbmcoMTApLCBwYjo6RmllbGRDb2RlYy5Gb3JFbnVtKDE2LCB4ID0+IChpbnQpIHgsIHggPT4gKGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbkVudW0pIHgpLCA1OTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbkVudW0+IG1hcFN0cmluZ0ZvcmVpZ25FbnVtXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduRW51bT4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbkVudW0+IE1hcFN0cmluZ0ZvcmVpZ25FbnVtIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBTdHJpbmdGb3JlaWduRW51bV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9uZW9mX3VpbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT25lb2ZVaW50MzJGaWVsZE51bWJlciA9IDExMTsKLSAgICBwdWJsaWMgdWludCBPbmVvZlVpbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZVaW50MzIgPyAodWludCkgb25lb2ZGaWVsZF8gOiAwOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib25lb2ZfbmVzdGVkX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9uZW9mTmVzdGVkTWVzc2FnZUZpZWxkTnVtYmVyID0gMTEyOwotICAgIHB1YmxpYyBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIE9uZW9mTmVzdGVkTWVzc2FnZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZOZXN0ZWRNZXNzYWdlID8gKGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UpIG9uZW9mRmllbGRfIDogbnVsbDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSB2YWx1ZTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gdmFsdWUgPT0gbnVsbCA/IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZSA6IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZOZXN0ZWRNZXNzYWdlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib25lb2Zfc3RyaW5nIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPbmVvZlN0cmluZ0ZpZWxkTnVtYmVyID0gMTEzOwotICAgIHB1YmxpYyBzdHJpbmcgT25lb2ZTdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mU3RyaW5nID8gKHN0cmluZykgb25lb2ZGaWVsZF8gOiAiIjsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZTdHJpbmc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvbmVvZl9ieXRlcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT25lb2ZCeXRlc0ZpZWxkTnVtYmVyID0gMTE0OwotICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBPbmVvZkJ5dGVzIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZkJ5dGVzID8gKHBiOjpCeXRlU3RyaW5nKSBvbmVvZkZpZWxkXyA6IHBiOjpCeXRlU3RyaW5nLkVtcHR5OyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZkJ5dGVzOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfYm9vbF93cmFwcGVyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEJvb2xXcmFwcGVyRmllbGROdW1iZXIgPSAyMDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Ym9vbD8+IF9zaW5nbGVfb3B0aW9uYWxCb29sV3JhcHBlcl9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8Ym9vbD4oMTYxMCk7Ci0gICAgcHJpdmF0ZSBib29sPyBvcHRpb25hbEJvb2xXcmFwcGVyXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBXZWxsLWtub3duIHR5cGVzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbD8gT3B0aW9uYWxCb29sV3JhcHBlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxCb29sV3JhcHBlcl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsQm9vbFdyYXBwZXJfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9pbnQzMl93cmFwcGVyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbEludDMyV3JhcHBlckZpZWxkTnVtYmVyID0gMjAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD8+IF9zaW5nbGVfb3B0aW9uYWxJbnQzMldyYXBwZXJfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGludD4oMTYxOCk7Ci0gICAgcHJpdmF0ZSBpbnQ/IG9wdGlvbmFsSW50MzJXcmFwcGVyXzsKLSAgICBwdWJsaWMgaW50PyBPcHRpb25hbEludDMyV3JhcHBlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQzMldyYXBwZXJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbEludDMyV3JhcHBlcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2ludDY0X3dyYXBwZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50NjRXcmFwcGVyRmllbGROdW1iZXIgPSAyMDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz8+IF9zaW5nbGVfb3B0aW9uYWxJbnQ2NFdyYXBwZXJfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGxvbmc+KDE2MjYpOwotICAgIHByaXZhdGUgbG9uZz8gb3B0aW9uYWxJbnQ2NFdyYXBwZXJfOwotICAgIHB1YmxpYyBsb25nPyBPcHRpb25hbEludDY0V3JhcHBlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxJbnQ2NFdyYXBwZXJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbEludDY0V3JhcHBlcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX3VpbnQzMl93cmFwcGVyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25hbFVpbnQzMldyYXBwZXJGaWVsZE51bWJlciA9IDIwNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzx1aW50Pz4gX3NpbmdsZV9vcHRpb25hbFVpbnQzMldyYXBwZXJfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVpbnQ+KDE2MzQpOwotICAgIHByaXZhdGUgdWludD8gb3B0aW9uYWxVaW50MzJXcmFwcGVyXzsKLSAgICBwdWJsaWMgdWludD8gT3B0aW9uYWxVaW50MzJXcmFwcGVyIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbFVpbnQzMldyYXBwZXJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbFVpbnQzMldyYXBwZXJfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF91aW50NjRfd3JhcHBlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxVaW50NjRXcmFwcGVyRmllbGROdW1iZXIgPSAyMDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc/PiBfc2luZ2xlX29wdGlvbmFsVWludDY0V3JhcHBlcl9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8dWxvbmc+KDE2NDIpOwotICAgIHByaXZhdGUgdWxvbmc/IG9wdGlvbmFsVWludDY0V3JhcHBlcl87Ci0gICAgcHVibGljIHVsb25nPyBPcHRpb25hbFVpbnQ2NFdyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsVWludDY0V3JhcHBlcl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsVWludDY0V3JhcHBlcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2Zsb2F0X3dyYXBwZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRmxvYXRXcmFwcGVyRmllbGROdW1iZXIgPSAyMDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8ZmxvYXQ/PiBfc2luZ2xlX29wdGlvbmFsRmxvYXRXcmFwcGVyX2NvZGVjID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxmbG9hdD4oMTY1MCk7Ci0gICAgcHJpdmF0ZSBmbG9hdD8gb3B0aW9uYWxGbG9hdFdyYXBwZXJfOwotICAgIHB1YmxpYyBmbG9hdD8gT3B0aW9uYWxGbG9hdFdyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRmxvYXRXcmFwcGVyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxGbG9hdFdyYXBwZXJfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9kb3VibGVfd3JhcHBlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxEb3VibGVXcmFwcGVyRmllbGROdW1iZXIgPSAyMDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8ZG91YmxlPz4gX3NpbmdsZV9vcHRpb25hbERvdWJsZVdyYXBwZXJfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGRvdWJsZT4oMTY1OCk7Ci0gICAgcHJpdmF0ZSBkb3VibGU/IG9wdGlvbmFsRG91YmxlV3JhcHBlcl87Ci0gICAgcHVibGljIGRvdWJsZT8gT3B0aW9uYWxEb3VibGVXcmFwcGVyIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbERvdWJsZVdyYXBwZXJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbERvdWJsZVdyYXBwZXJfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9zdHJpbmdfd3JhcHBlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxTdHJpbmdXcmFwcGVyRmllbGROdW1iZXIgPSAyMDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8c3RyaW5nPiBfc2luZ2xlX29wdGlvbmFsU3RyaW5nV3JhcHBlcl9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxzdHJpbmc+KDE2NjYpOwotICAgIHByaXZhdGUgc3RyaW5nIG9wdGlvbmFsU3RyaW5nV3JhcHBlcl87Ci0gICAgcHVibGljIHN0cmluZyBPcHRpb25hbFN0cmluZ1dyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU3RyaW5nV3JhcHBlcl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbmFsU3RyaW5nV3JhcHBlcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2J5dGVzX3dyYXBwZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQnl0ZXNXcmFwcGVyRmllbGROdW1iZXIgPSAyMDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8cGI6OkJ5dGVTdHJpbmc+IF9zaW5nbGVfb3B0aW9uYWxCeXRlc1dyYXBwZXJfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JDbGFzc1dyYXBwZXI8cGI6OkJ5dGVTdHJpbmc+KDE2NzQpOwotICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgb3B0aW9uYWxCeXRlc1dyYXBwZXJfOwotICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBPcHRpb25hbEJ5dGVzV3JhcHBlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxCeXRlc1dyYXBwZXJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbEJ5dGVzV3JhcHBlcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2Jvb2xfd3JhcHBlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRCb29sV3JhcHBlckZpZWxkTnVtYmVyID0gMjExOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGJvb2w/PiBfcmVwZWF0ZWRfcmVwZWF0ZWRCb29sV3JhcHBlcl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8Ym9vbD4oMTY5MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Ym9vbD8+IHJlcGVhdGVkQm9vbFdyYXBwZXJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxib29sPz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGJvb2w/PiBSZXBlYXRlZEJvb2xXcmFwcGVyIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEJvb2xXcmFwcGVyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfaW50MzJfd3JhcHBlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMldyYXBwZXJGaWVsZE51bWJlciA9IDIxMjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ/PiBfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQzMldyYXBwZXJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGludD4oMTY5OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8aW50Pz4gcmVwZWF0ZWRJbnQzMldyYXBwZXJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ/PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50Pz4gUmVwZWF0ZWRJbnQzMldyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW50MzJXcmFwcGVyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfaW50NjRfd3JhcHBlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQ2NFdyYXBwZXJGaWVsZE51bWJlciA9IDIxMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPz4gX3JlcGVhdGVkX3JlcGVhdGVkSW50NjRXcmFwcGVyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxsb25nPigxNzA2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPz4gcmVwZWF0ZWRJbnQ2NFdyYXBwZXJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc/PiBSZXBlYXRlZEludDY0V3JhcHBlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQ2NFdyYXBwZXJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF91aW50MzJfd3JhcHBlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRVaW50MzJXcmFwcGVyRmllbGROdW1iZXIgPSAyMTQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWludD8+IF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQzMldyYXBwZXJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVpbnQ+KDE3MTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ/PiByZXBlYXRlZFVpbnQzMldyYXBwZXJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50Pz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ/PiBSZXBlYXRlZFVpbnQzMldyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkVWludDMyV3JhcHBlcl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3VpbnQ2NF93cmFwcGVyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFVpbnQ2NFdyYXBwZXJGaWVsZE51bWJlciA9IDIxNTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzx1bG9uZz8+IF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NFdyYXBwZXJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVsb25nPigxNzIyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz8+IHJlcGVhdGVkVWludDY0V3JhcHBlcl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPz4gUmVwZWF0ZWRVaW50NjRXcmFwcGVyIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQ2NFdyYXBwZXJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9mbG9hdF93cmFwcGVyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEZsb2F0V3JhcHBlckZpZWxkTnVtYmVyID0gMjE2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGZsb2F0Pz4gX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRXcmFwcGVyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxmbG9hdD4oMTczMCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8ZmxvYXQ/PiByZXBlYXRlZEZsb2F0V3JhcHBlcl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGZsb2F0Pz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGZsb2F0Pz4gUmVwZWF0ZWRGbG9hdFdyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRmxvYXRXcmFwcGVyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZG91YmxlX3dyYXBwZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRG91YmxlV3JhcHBlckZpZWxkTnVtYmVyID0gMjE3OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGRvdWJsZT8+IF9yZXBlYXRlZF9yZXBlYXRlZERvdWJsZVdyYXBwZXJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGRvdWJsZT4oMTczOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8ZG91YmxlPz4gcmVwZWF0ZWREb3VibGVXcmFwcGVyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8ZG91YmxlPz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGRvdWJsZT8+IFJlcGVhdGVkRG91YmxlV3JhcHBlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWREb3VibGVXcmFwcGVyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfc3RyaW5nX3dyYXBwZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nV3JhcHBlckZpZWxkTnVtYmVyID0gMjE4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHN0cmluZz4gX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nV3JhcHBlcl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxzdHJpbmc+KDE3NDYpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4gcmVwZWF0ZWRTdHJpbmdXcmFwcGVyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ1dyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RyaW5nV3JhcHBlcl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2J5dGVzX3dyYXBwZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkQnl0ZXNXcmFwcGVyRmllbGROdW1iZXIgPSAyMTk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8cGI6OkJ5dGVTdHJpbmc+IF9yZXBlYXRlZF9yZXBlYXRlZEJ5dGVzV3JhcHBlcl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxwYjo6Qnl0ZVN0cmluZz4oMTc1NCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8cGI6OkJ5dGVTdHJpbmc+IHJlcGVhdGVkQnl0ZXNXcmFwcGVyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8cGI6OkJ5dGVTdHJpbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxwYjo6Qnl0ZVN0cmluZz4gUmVwZWF0ZWRCeXRlc1dyYXBwZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQnl0ZXNXcmFwcGVyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfZHVyYXRpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRHVyYXRpb25GaWVsZE51bWJlciA9IDMwMTsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uIG9wdGlvbmFsRHVyYXRpb25fOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbiBPcHRpb25hbER1cmF0aW9uIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbER1cmF0aW9uXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxEdXJhdGlvbl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX3RpbWVzdGFtcCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxUaW1lc3RhbXBGaWVsZE51bWJlciA9IDMwMjsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCBvcHRpb25hbFRpbWVzdGFtcF87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCBPcHRpb25hbFRpbWVzdGFtcCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uYWxUaW1lc3RhbXBfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbFRpbWVzdGFtcF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbmFsX2ZpZWxkX21hc2siIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsRmllbGRNYXNrRmllbGROdW1iZXIgPSAzMDM7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2sgb3B0aW9uYWxGaWVsZE1hc2tfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2sgT3B0aW9uYWxGaWVsZE1hc2sgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsRmllbGRNYXNrXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxGaWVsZE1hc2tfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9zdHJ1Y3QiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsU3RydWN0RmllbGROdW1iZXIgPSAzMDQ7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3Qgb3B0aW9uYWxTdHJ1Y3RfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3QgT3B0aW9uYWxTdHJ1Y3QgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsU3RydWN0XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxTdHJ1Y3RfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF9hbnkiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsQW55RmllbGROdW1iZXIgPSAzMDU7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Bbnkgb3B0aW9uYWxBbnlfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BbnkgT3B0aW9uYWxBbnkgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsQW55XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxBbnlfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25hbF92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uYWxWYWx1ZUZpZWxkTnVtYmVyID0gMzA2OwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVmFsdWUgb3B0aW9uYWxWYWx1ZV87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlIE9wdGlvbmFsVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbmFsVmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25hbFZhbHVlXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZHVyYXRpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRHVyYXRpb25GaWVsZE51bWJlciA9IDMxMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbj4gX3JlcGVhdGVkX3JlcGVhdGVkRHVyYXRpb25fY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDI0OTAsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24+IHJlcGVhdGVkRHVyYXRpb25fID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbj4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uPiBSZXBlYXRlZER1cmF0aW9uIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZER1cmF0aW9uXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfdGltZXN0YW1wIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFRpbWVzdGFtcEZpZWxkTnVtYmVyID0gMzEyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcD4gX3JlcGVhdGVkX3JlcGVhdGVkVGltZXN0YW1wX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgyNDk4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXAuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXA+IHJlcGVhdGVkVGltZXN0YW1wXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wPiBSZXBlYXRlZFRpbWVzdGFtcCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRUaW1lc3RhbXBfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9maWVsZG1hc2siIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmllbGRtYXNrRmllbGROdW1iZXIgPSAzMTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrPiBfcmVwZWF0ZWRfcmVwZWF0ZWRGaWVsZG1hc2tfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDI1MDYsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFzay5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFzaz4gcmVwZWF0ZWRGaWVsZG1hc2tfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2s+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2s+IFJlcGVhdGVkRmllbGRtYXNrIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZpZWxkbWFza187IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3N0cnVjdCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTdHJ1Y3RGaWVsZE51bWJlciA9IDMyNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3Q+IF9yZXBlYXRlZF9yZXBlYXRlZFN0cnVjdF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMjU5NCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0LlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0PiByZXBlYXRlZFN0cnVjdF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdD4gUmVwZWF0ZWRTdHJ1Y3QgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU3RydWN0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfYW55IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEFueUZpZWxkTnVtYmVyID0gMzE1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueT4gX3JlcGVhdGVkX3JlcGVhdGVkQW55X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgyNTIyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BbnkuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Bbnk+IHJlcGVhdGVkQW55XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55PiBSZXBlYXRlZEFueSB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRBbnlfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRWYWx1ZUZpZWxkTnVtYmVyID0gMzE2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlPiBfcmVwZWF0ZWRfcmVwZWF0ZWRWYWx1ZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMjUzMCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVmFsdWUuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZT4gcmVwZWF0ZWRWYWx1ZV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVmFsdWU+IFJlcGVhdGVkVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkVmFsdWVfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmaWVsZG5hbWUxIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGaWVsZG5hbWUxRmllbGROdW1iZXIgPSA0MDE7Ci0gICAgcHJpdmF0ZSBpbnQgZmllbGRuYW1lMV87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGVzdCBmaWVsZC1uYW1lLXRvLUpTT04tbmFtZSBjb252ZW50aW9uLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludCBGaWVsZG5hbWUxIHsKLSAgICAgIGdldCB7IHJldHVybiBmaWVsZG5hbWUxXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZmllbGRuYW1lMV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZpZWxkX25hbWUyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGaWVsZE5hbWUyRmllbGROdW1iZXIgPSA0MDI7Ci0gICAgcHJpdmF0ZSBpbnQgZmllbGROYW1lMl87Ci0gICAgcHVibGljIGludCBGaWVsZE5hbWUyIHsKLSAgICAgIGdldCB7IHJldHVybiBmaWVsZE5hbWUyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZmllbGROYW1lMl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIl9maWVsZF9uYW1lMyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGROYW1lM0ZpZWxkTnVtYmVyID0gNDAzOwotICAgIHByaXZhdGUgaW50IEZpZWxkTmFtZTNfOwotICAgIHB1YmxpYyBpbnQgRmllbGROYW1lMyB7Ci0gICAgICBnZXQgeyByZXR1cm4gRmllbGROYW1lM187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIEZpZWxkTmFtZTNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmaWVsZF9fbmFtZTRfIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGaWVsZE5hbWU0RmllbGROdW1iZXIgPSA0MDQ7Ci0gICAgcHJpdmF0ZSBpbnQgZmllbGROYW1lNF87Ci0gICAgcHVibGljIGludCBGaWVsZE5hbWU0IHsKLSAgICAgIGdldCB7IHJldHVybiBmaWVsZE5hbWU0XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZmllbGROYW1lNF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZpZWxkMG5hbWU1IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGaWVsZDBOYW1lNUZpZWxkTnVtYmVyID0gNDA1OwotICAgIHByaXZhdGUgaW50IGZpZWxkME5hbWU1XzsKLSAgICBwdWJsaWMgaW50IEZpZWxkME5hbWU1IHsKLSAgICAgIGdldCB7IHJldHVybiBmaWVsZDBOYW1lNV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGZpZWxkME5hbWU1XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZmllbGRfMF9uYW1lNiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGQwTmFtZTZGaWVsZE51bWJlciA9IDQwNjsKLSAgICBwcml2YXRlIGludCBmaWVsZDBOYW1lNl87Ci0gICAgcHVibGljIGludCBGaWVsZDBOYW1lNiB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGQwTmFtZTZfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBmaWVsZDBOYW1lNl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZpZWxkTmFtZTciIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkTmFtZTdGaWVsZE51bWJlciA9IDQwNzsKLSAgICBwcml2YXRlIGludCBmaWVsZE5hbWU3XzsKLSAgICBwdWJsaWMgaW50IEZpZWxkTmFtZTcgewotICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkTmFtZTdfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBmaWVsZE5hbWU3XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiRmllbGROYW1lOCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGROYW1lOEZpZWxkTnVtYmVyID0gNDA4OwotICAgIHByaXZhdGUgaW50IGZpZWxkTmFtZThfOwotICAgIHB1YmxpYyBpbnQgRmllbGROYW1lOCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGROYW1lOF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGZpZWxkTmFtZThfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmaWVsZF9OYW1lOSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGROYW1lOUZpZWxkTnVtYmVyID0gNDA5OwotICAgIHByaXZhdGUgaW50IGZpZWxkTmFtZTlfOwotICAgIHB1YmxpYyBpbnQgRmllbGROYW1lOSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGROYW1lOV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGZpZWxkTmFtZTlfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJGaWVsZF9OYW1lMTAiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkTmFtZTEwRmllbGROdW1iZXIgPSA0MTA7Ci0gICAgcHJpdmF0ZSBpbnQgZmllbGROYW1lMTBfOwotICAgIHB1YmxpYyBpbnQgRmllbGROYW1lMTAgewotICAgICAgZ2V0IHsgcmV0dXJuIGZpZWxkTmFtZTEwXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZmllbGROYW1lMTBfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJGSUVMRF9OQU1FMTEiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZJRUxETkFNRTExRmllbGROdW1iZXIgPSA0MTE7Ci0gICAgcHJpdmF0ZSBpbnQgZklFTEROQU1FMTFfOwotICAgIHB1YmxpYyBpbnQgRklFTEROQU1FMTEgewotICAgICAgZ2V0IHsgcmV0dXJuIGZJRUxETkFNRTExXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZklFTEROQU1FMTFfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJGSUVMRF9uYW1lMTIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZJRUxETmFtZTEyRmllbGROdW1iZXIgPSA0MTI7Ci0gICAgcHJpdmF0ZSBpbnQgZklFTEROYW1lMTJfOwotICAgIHB1YmxpYyBpbnQgRklFTEROYW1lMTIgewotICAgICAgZ2V0IHsgcmV0dXJuIGZJRUxETmFtZTEyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZklFTEROYW1lMTJfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBvYmplY3Qgb25lb2ZGaWVsZF87Ci0gICAgLy8vIDxzdW1tYXJ5PkVudW0gb2YgcG9zc2libGUgY2FzZXMgZm9yIHRoZSAib25lb2ZfZmllbGQiIG9uZW9mLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBPbmVvZkZpZWxkT25lb2ZDYXNlIHsKLSAgICAgIE5vbmUgPSAwLAotICAgICAgT25lb2ZVaW50MzIgPSAxMTEsCi0gICAgICBPbmVvZk5lc3RlZE1lc3NhZ2UgPSAxMTIsCi0gICAgICBPbmVvZlN0cmluZyA9IDExMywKLSAgICAgIE9uZW9mQnl0ZXMgPSAxMTQsCi0gICAgfQotICAgIHByaXZhdGUgT25lb2ZGaWVsZE9uZW9mQ2FzZSBvbmVvZkZpZWxkQ2FzZV8gPSBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmU7Ci0gICAgcHVibGljIE9uZW9mRmllbGRPbmVvZkNhc2UgT25lb2ZGaWVsZENhc2UgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIENsZWFyT25lb2ZGaWVsZCgpIHsKLSAgICAgIG9uZW9mRmllbGRDYXNlXyA9IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZTsKLSAgICAgIG9uZW9mRmllbGRfID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3RBbGxUeXBlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFRlc3RBbGxUeXBlcyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxJbnQzMiAhPSBvdGhlci5PcHRpb25hbEludDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxJbnQ2NCAhPSBvdGhlci5PcHRpb25hbEludDY0KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxVaW50MzIgIT0gb3RoZXIuT3B0aW9uYWxVaW50MzIpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpb25hbFVpbnQ2NCAhPSBvdGhlci5PcHRpb25hbFVpbnQ2NCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsU2ludDMyICE9IG90aGVyLk9wdGlvbmFsU2ludDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxTaW50NjQgIT0gb3RoZXIuT3B0aW9uYWxTaW50NjQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpb25hbEZpeGVkMzIgIT0gb3RoZXIuT3B0aW9uYWxGaXhlZDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxGaXhlZDY0ICE9IG90aGVyLk9wdGlvbmFsRml4ZWQ2NCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsU2ZpeGVkMzIgIT0gb3RoZXIuT3B0aW9uYWxTZml4ZWQzMikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsU2ZpeGVkNjQgIT0gb3RoZXIuT3B0aW9uYWxTZml4ZWQ2NCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsRmxvYXQgIT0gb3RoZXIuT3B0aW9uYWxGbG9hdCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsRG91YmxlICE9IG90aGVyLk9wdGlvbmFsRG91YmxlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxCb29sICE9IG90aGVyLk9wdGlvbmFsQm9vbCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsU3RyaW5nICE9IG90aGVyLk9wdGlvbmFsU3RyaW5nKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxCeXRlcyAhPSBvdGhlci5PcHRpb25hbEJ5dGVzKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoT3B0aW9uYWxOZXN0ZWRNZXNzYWdlLCBvdGhlci5PcHRpb25hbE5lc3RlZE1lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoT3B0aW9uYWxGb3JlaWduTWVzc2FnZSwgb3RoZXIuT3B0aW9uYWxGb3JlaWduTWVzc2FnZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpb25hbE5lc3RlZEVudW0gIT0gb3RoZXIuT3B0aW9uYWxOZXN0ZWRFbnVtKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxGb3JlaWduRW51bSAhPSBvdGhlci5PcHRpb25hbEZvcmVpZ25FbnVtKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxTdHJpbmdQaWVjZSAhPSBvdGhlci5PcHRpb25hbFN0cmluZ1BpZWNlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxDb3JkICE9IG90aGVyLk9wdGlvbmFsQ29yZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFJlY3Vyc2l2ZU1lc3NhZ2UsIG90aGVyLlJlY3Vyc2l2ZU1lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRJbnQzMl8uRXF1YWxzKG90aGVyLnJlcGVhdGVkSW50MzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkSW50NjRfLkVxdWFscyhvdGhlci5yZXBlYXRlZEludDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFVpbnQzMl8uRXF1YWxzKG90aGVyLnJlcGVhdGVkVWludDMyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFVpbnQ2NF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkVWludDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFNpbnQzMl8uRXF1YWxzKG90aGVyLnJlcGVhdGVkU2ludDMyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFNpbnQ2NF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkU2ludDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEZpeGVkMzJfLkVxdWFscyhvdGhlci5yZXBlYXRlZEZpeGVkMzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRml4ZWQ2NF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRTZml4ZWQzMl8uRXF1YWxzKG90aGVyLnJlcGVhdGVkU2ZpeGVkMzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkU2ZpeGVkNjRfLkVxdWFscyhvdGhlci5yZXBlYXRlZFNmaXhlZDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEZsb2F0Xy5FcXVhbHMob3RoZXIucmVwZWF0ZWRGbG9hdF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWREb3VibGVfLkVxdWFscyhvdGhlci5yZXBlYXRlZERvdWJsZV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRCb29sXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRCb29sXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFN0cmluZ18uRXF1YWxzKG90aGVyLnJlcGVhdGVkU3RyaW5nXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEJ5dGVzXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRCeXRlc18pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5FcXVhbHMob3RoZXIucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWROZXN0ZWRFbnVtXy5FcXVhbHMob3RoZXIucmVwZWF0ZWROZXN0ZWRFbnVtXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEZvcmVpZ25FbnVtXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRGb3JlaWduRW51bV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRTdHJpbmdQaWVjZV8uRXF1YWxzKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkQ29yZF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkQ29yZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEludDMySW50MzIuRXF1YWxzKG90aGVyLk1hcEludDMySW50MzIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEludDY0SW50NjQuRXF1YWxzKG90aGVyLk1hcEludDY0SW50NjQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFVpbnQzMlVpbnQzMi5FcXVhbHMob3RoZXIuTWFwVWludDMyVWludDMyKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBVaW50NjRVaW50NjQuRXF1YWxzKG90aGVyLk1hcFVpbnQ2NFVpbnQ2NCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU2ludDMyU2ludDMyLkVxdWFscyhvdGhlci5NYXBTaW50MzJTaW50MzIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFNpbnQ2NFNpbnQ2NC5FcXVhbHMob3RoZXIuTWFwU2ludDY0U2ludDY0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBGaXhlZDMyRml4ZWQzMi5FcXVhbHMob3RoZXIuTWFwRml4ZWQzMkZpeGVkMzIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEZpeGVkNjRGaXhlZDY0LkVxdWFscyhvdGhlci5NYXBGaXhlZDY0Rml4ZWQ2NCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU2ZpeGVkMzJTZml4ZWQzMi5FcXVhbHMob3RoZXIuTWFwU2ZpeGVkMzJTZml4ZWQzMikpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU2ZpeGVkNjRTZml4ZWQ2NC5FcXVhbHMob3RoZXIuTWFwU2ZpeGVkNjRTZml4ZWQ2NCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwSW50MzJGbG9hdC5FcXVhbHMob3RoZXIuTWFwSW50MzJGbG9hdCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwSW50MzJEb3VibGUuRXF1YWxzKG90aGVyLk1hcEludDMyRG91YmxlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBCb29sQm9vbC5FcXVhbHMob3RoZXIuTWFwQm9vbEJvb2wpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFN0cmluZ1N0cmluZy5FcXVhbHMob3RoZXIuTWFwU3RyaW5nU3RyaW5nKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBTdHJpbmdCeXRlcy5FcXVhbHMob3RoZXIuTWFwU3RyaW5nQnl0ZXMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFN0cmluZ05lc3RlZE1lc3NhZ2UuRXF1YWxzKG90aGVyLk1hcFN0cmluZ05lc3RlZE1lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFN0cmluZ0ZvcmVpZ25NZXNzYWdlLkVxdWFscyhvdGhlci5NYXBTdHJpbmdGb3JlaWduTWVzc2FnZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU3RyaW5nTmVzdGVkRW51bS5FcXVhbHMob3RoZXIuTWFwU3RyaW5nTmVzdGVkRW51bSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU3RyaW5nRm9yZWlnbkVudW0uRXF1YWxzKG90aGVyLk1hcFN0cmluZ0ZvcmVpZ25FbnVtKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9uZW9mVWludDMyICE9IG90aGVyLk9uZW9mVWludDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoT25lb2ZOZXN0ZWRNZXNzYWdlLCBvdGhlci5PbmVvZk5lc3RlZE1lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT25lb2ZTdHJpbmcgIT0gb3RoZXIuT25lb2ZTdHJpbmcpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPbmVvZkJ5dGVzICE9IG90aGVyLk9uZW9mQnl0ZXMpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpb25hbEJvb2xXcmFwcGVyICE9IG90aGVyLk9wdGlvbmFsQm9vbFdyYXBwZXIpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpb25hbEludDMyV3JhcHBlciAhPSBvdGhlci5PcHRpb25hbEludDMyV3JhcHBlcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsSW50NjRXcmFwcGVyICE9IG90aGVyLk9wdGlvbmFsSW50NjRXcmFwcGVyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxVaW50MzJXcmFwcGVyICE9IG90aGVyLk9wdGlvbmFsVWludDMyV3JhcHBlcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsVWludDY0V3JhcHBlciAhPSBvdGhlci5PcHRpb25hbFVpbnQ2NFdyYXBwZXIpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpb25hbEZsb2F0V3JhcHBlciAhPSBvdGhlci5PcHRpb25hbEZsb2F0V3JhcHBlcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9wdGlvbmFsRG91YmxlV3JhcHBlciAhPSBvdGhlci5PcHRpb25hbERvdWJsZVdyYXBwZXIpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpb25hbFN0cmluZ1dyYXBwZXIgIT0gb3RoZXIuT3B0aW9uYWxTdHJpbmdXcmFwcGVyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxCeXRlc1dyYXBwZXIgIT0gb3RoZXIuT3B0aW9uYWxCeXRlc1dyYXBwZXIpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEJvb2xXcmFwcGVyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRCb29sV3JhcHBlcl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRJbnQzMldyYXBwZXJfLkVxdWFscyhvdGhlci5yZXBlYXRlZEludDMyV3JhcHBlcl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRJbnQ2NFdyYXBwZXJfLkVxdWFscyhvdGhlci5yZXBlYXRlZEludDY0V3JhcHBlcl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRVaW50MzJXcmFwcGVyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRVaW50MzJXcmFwcGVyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFVpbnQ2NFdyYXBwZXJfLkVxdWFscyhvdGhlci5yZXBlYXRlZFVpbnQ2NFdyYXBwZXJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRmxvYXRXcmFwcGVyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRGbG9hdFdyYXBwZXJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRG91YmxlV3JhcHBlcl8uRXF1YWxzKG90aGVyLnJlcGVhdGVkRG91YmxlV3JhcHBlcl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRTdHJpbmdXcmFwcGVyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRTdHJpbmdXcmFwcGVyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEJ5dGVzV3JhcHBlcl8uRXF1YWxzKG90aGVyLnJlcGVhdGVkQnl0ZXNXcmFwcGVyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhPcHRpb25hbER1cmF0aW9uLCBvdGhlci5PcHRpb25hbER1cmF0aW9uKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKE9wdGlvbmFsVGltZXN0YW1wLCBvdGhlci5PcHRpb25hbFRpbWVzdGFtcCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhPcHRpb25hbEZpZWxkTWFzaywgb3RoZXIuT3B0aW9uYWxGaWVsZE1hc2spKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoT3B0aW9uYWxTdHJ1Y3QsIG90aGVyLk9wdGlvbmFsU3RydWN0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKE9wdGlvbmFsQW55LCBvdGhlci5PcHRpb25hbEFueSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhPcHRpb25hbFZhbHVlLCBvdGhlci5PcHRpb25hbFZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRHVyYXRpb25fLkVxdWFscyhvdGhlci5yZXBlYXRlZER1cmF0aW9uXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFRpbWVzdGFtcF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkVGltZXN0YW1wXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEZpZWxkbWFza18uRXF1YWxzKG90aGVyLnJlcGVhdGVkRmllbGRtYXNrXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFN0cnVjdF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkU3RydWN0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEFueV8uRXF1YWxzKG90aGVyLnJlcGVhdGVkQW55XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFZhbHVlXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRWYWx1ZV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRmllbGRuYW1lMSAhPSBvdGhlci5GaWVsZG5hbWUxKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRmllbGROYW1lMiAhPSBvdGhlci5GaWVsZE5hbWUyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRmllbGROYW1lMyAhPSBvdGhlci5GaWVsZE5hbWUzKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRmllbGROYW1lNCAhPSBvdGhlci5GaWVsZE5hbWU0KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRmllbGQwTmFtZTUgIT0gb3RoZXIuRmllbGQwTmFtZTUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChGaWVsZDBOYW1lNiAhPSBvdGhlci5GaWVsZDBOYW1lNikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEZpZWxkTmFtZTcgIT0gb3RoZXIuRmllbGROYW1lNykgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEZpZWxkTmFtZTggIT0gb3RoZXIuRmllbGROYW1lOCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEZpZWxkTmFtZTkgIT0gb3RoZXIuRmllbGROYW1lOSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEZpZWxkTmFtZTEwICE9IG90aGVyLkZpZWxkTmFtZTEwKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRklFTEROQU1FMTEgIT0gb3RoZXIuRklFTEROQU1FMTEpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChGSUVMRE5hbWUxMiAhPSBvdGhlci5GSUVMRE5hbWUxMikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9uZW9mRmllbGRDYXNlICE9IG90aGVyLk9uZW9mRmllbGRDYXNlKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKE9wdGlvbmFsSW50MzIgIT0gMCkgaGFzaCBePSBPcHRpb25hbEludDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoT3B0aW9uYWxJbnQ2NCAhPSAwTCkgaGFzaCBePSBPcHRpb25hbEludDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoT3B0aW9uYWxVaW50MzIgIT0gMCkgaGFzaCBePSBPcHRpb25hbFVpbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsVWludDY0ICE9IDBVTCkgaGFzaCBePSBPcHRpb25hbFVpbnQ2NC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsU2ludDMyICE9IDApIGhhc2ggXj0gT3B0aW9uYWxTaW50MzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpb25hbFNpbnQ2NCAhPSAwTCkgaGFzaCBePSBPcHRpb25hbFNpbnQ2NC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsRml4ZWQzMiAhPSAwKSBoYXNoIF49IE9wdGlvbmFsRml4ZWQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsRml4ZWQ2NCAhPSAwVUwpIGhhc2ggXj0gT3B0aW9uYWxGaXhlZDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoT3B0aW9uYWxTZml4ZWQzMiAhPSAwKSBoYXNoIF49IE9wdGlvbmFsU2ZpeGVkMzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpb25hbFNmaXhlZDY0ICE9IDBMKSBoYXNoIF49IE9wdGlvbmFsU2ZpeGVkNjQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpb25hbEZsb2F0ICE9IDBGKSBoYXNoIF49IE9wdGlvbmFsRmxvYXQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpb25hbERvdWJsZSAhPSAwRCkgaGFzaCBePSBPcHRpb25hbERvdWJsZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsQm9vbCAhPSBmYWxzZSkgaGFzaCBePSBPcHRpb25hbEJvb2wuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpb25hbFN0cmluZy5MZW5ndGggIT0gMCkgaGFzaCBePSBPcHRpb25hbFN0cmluZy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsQnl0ZXMuTGVuZ3RoICE9IDApIGhhc2ggXj0gT3B0aW9uYWxCeXRlcy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25hbE5lc3RlZE1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbEZvcmVpZ25NZXNzYWdlXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpb25hbE5lc3RlZEVudW0gIT0gMCkgaGFzaCBePSBPcHRpb25hbE5lc3RlZEVudW0uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpb25hbEZvcmVpZ25FbnVtICE9IDApIGhhc2ggXj0gT3B0aW9uYWxGb3JlaWduRW51bS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsU3RyaW5nUGllY2UuTGVuZ3RoICE9IDApIGhhc2ggXj0gT3B0aW9uYWxTdHJpbmdQaWVjZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsQ29yZC5MZW5ndGggIT0gMCkgaGFzaCBePSBPcHRpb25hbENvcmQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChyZWN1cnNpdmVNZXNzYWdlXyAhPSBudWxsKSBoYXNoIF49IFJlY3Vyc2l2ZU1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRJbnQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRJbnQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRVaW50MzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkVWludDY0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFNpbnQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRTaW50NjRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRml4ZWQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRGaXhlZDY0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFNmaXhlZDMyXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFNmaXhlZDY0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEZsb2F0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZERvdWJsZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRCb29sXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFN0cmluZ18uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRCeXRlc18uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZE5lc3RlZEVudW1fLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRm9yZWlnbkVudW1fLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkU3RyaW5nUGllY2VfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkQ29yZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwSW50MzJJbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBJbnQ2NEludDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcFVpbnQzMlVpbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBVaW50NjRVaW50NjQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwU2ludDMyU2ludDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcFNpbnQ2NFNpbnQ2NC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBGaXhlZDMyRml4ZWQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBGaXhlZDY0Rml4ZWQ2NC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBTZml4ZWQzMlNmaXhlZDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcFNmaXhlZDY0U2ZpeGVkNjQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwSW50MzJGbG9hdC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBJbnQzMkRvdWJsZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBCb29sQm9vbC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBTdHJpbmdTdHJpbmcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwU3RyaW5nQnl0ZXMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwU3RyaW5nTmVzdGVkTWVzc2FnZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBTdHJpbmdGb3JlaWduTWVzc2FnZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBTdHJpbmdOZXN0ZWRFbnVtLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcFN0cmluZ0ZvcmVpZ25FbnVtLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZVaW50MzIpIGhhc2ggXj0gT25lb2ZVaW50MzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZk5lc3RlZE1lc3NhZ2UpIGhhc2ggXj0gT25lb2ZOZXN0ZWRNZXNzYWdlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZTdHJpbmcpIGhhc2ggXj0gT25lb2ZTdHJpbmcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZkJ5dGVzKSBoYXNoIF49IE9uZW9mQnl0ZXMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbEJvb2xXcmFwcGVyXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbmFsQm9vbFdyYXBwZXIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbEludDMyV3JhcHBlcl8gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25hbEludDMyV3JhcHBlci5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbmFsSW50NjRXcmFwcGVyXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbmFsSW50NjRXcmFwcGVyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob3B0aW9uYWxVaW50MzJXcmFwcGVyXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbmFsVWludDMyV3JhcHBlci5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbmFsVWludDY0V3JhcHBlcl8gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25hbFVpbnQ2NFdyYXBwZXIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbEZsb2F0V3JhcHBlcl8gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25hbEZsb2F0V3JhcHBlci5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbmFsRG91YmxlV3JhcHBlcl8gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25hbERvdWJsZVdyYXBwZXIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbFN0cmluZ1dyYXBwZXJfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9uYWxTdHJpbmdXcmFwcGVyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob3B0aW9uYWxCeXRlc1dyYXBwZXJfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9uYWxCeXRlc1dyYXBwZXIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRCb29sV3JhcHBlcl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRJbnQzMldyYXBwZXJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkSW50NjRXcmFwcGVyXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFVpbnQzMldyYXBwZXJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkVWludDY0V3JhcHBlcl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRGbG9hdFdyYXBwZXJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRG91YmxlV3JhcHBlcl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRTdHJpbmdXcmFwcGVyXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEJ5dGVzV3JhcHBlcl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbER1cmF0aW9uXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbmFsRHVyYXRpb24uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbFRpbWVzdGFtcF8gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25hbFRpbWVzdGFtcC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbmFsRmllbGRNYXNrXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbmFsRmllbGRNYXNrLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob3B0aW9uYWxTdHJ1Y3RfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9uYWxTdHJ1Y3QuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25hbEFueV8gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25hbEFueS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbmFsVmFsdWVfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9uYWxWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZER1cmF0aW9uXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFRpbWVzdGFtcF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRGaWVsZG1hc2tfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkU3RydWN0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEFueV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRWYWx1ZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChGaWVsZG5hbWUxICE9IDApIGhhc2ggXj0gRmllbGRuYW1lMS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEZpZWxkTmFtZTIgIT0gMCkgaGFzaCBePSBGaWVsZE5hbWUyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRmllbGROYW1lMyAhPSAwKSBoYXNoIF49IEZpZWxkTmFtZTMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChGaWVsZE5hbWU0ICE9IDApIGhhc2ggXj0gRmllbGROYW1lNC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEZpZWxkME5hbWU1ICE9IDApIGhhc2ggXj0gRmllbGQwTmFtZTUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChGaWVsZDBOYW1lNiAhPSAwKSBoYXNoIF49IEZpZWxkME5hbWU2LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRmllbGROYW1lNyAhPSAwKSBoYXNoIF49IEZpZWxkTmFtZTcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChGaWVsZE5hbWU4ICE9IDApIGhhc2ggXj0gRmllbGROYW1lOC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEZpZWxkTmFtZTkgIT0gMCkgaGFzaCBePSBGaWVsZE5hbWU5LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRmllbGROYW1lMTAgIT0gMCkgaGFzaCBePSBGaWVsZE5hbWUxMC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEZJRUxETkFNRTExICE9IDApIGhhc2ggXj0gRklFTEROQU1FMTEuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChGSUVMRE5hbWUxMiAhPSAwKSBoYXNoIF49IEZJRUxETmFtZTEyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IChpbnQpIG9uZW9mRmllbGRDYXNlXzsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKE9wdGlvbmFsSW50MzIgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKE9wdGlvbmFsSW50MzIpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsSW50NjQgIT0gMEwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoT3B0aW9uYWxJbnQ2NCk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxVaW50MzIgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoT3B0aW9uYWxVaW50MzIpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsVWludDY0ICE9IDBVTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMzIpOwotICAgICAgICBvdXRwdXQuV3JpdGVVSW50NjQoT3B0aW9uYWxVaW50NjQpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsU2ludDMyICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU0ludDMyKE9wdGlvbmFsU2ludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFNpbnQ2NCAhPSAwTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjQoT3B0aW9uYWxTaW50NjQpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsRml4ZWQzMiAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg2MSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkMzIoT3B0aW9uYWxGaXhlZDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbEZpeGVkNjQgIT0gMFVMKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg2NSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUZpeGVkNjQoT3B0aW9uYWxGaXhlZDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFNmaXhlZDMyICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDc3KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzIoT3B0aW9uYWxTZml4ZWQzMik7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxTZml4ZWQ2NCAhPSAwTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoODEpOwotICAgICAgICBvdXRwdXQuV3JpdGVTRml4ZWQ2NChPcHRpb25hbFNmaXhlZDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbEZsb2F0ICE9IDBGKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg5Myk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUZsb2F0KE9wdGlvbmFsRmxvYXQpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsRG91YmxlICE9IDBEKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg5Nyk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZShPcHRpb25hbERvdWJsZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxCb29sICE9IGZhbHNlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMDQpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKE9wdGlvbmFsQm9vbCk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxTdHJpbmcuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDExNCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhPcHRpb25hbFN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxCeXRlcy5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTIyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoT3B0aW9uYWxCeXRlcyk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNDYsIDEpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTU0LCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbE5lc3RlZEVudW0gIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTY4LCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBPcHRpb25hbE5lc3RlZEVudW0pOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsRm9yZWlnbkVudW0gIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTc2LCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBPcHRpb25hbEZvcmVpZ25FbnVtKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFN0cmluZ1BpZWNlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOTQsIDEpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoT3B0aW9uYWxTdHJpbmdQaWVjZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxDb3JkLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyMDIsIDEpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoT3B0aW9uYWxDb3JkKTsKLSAgICAgIH0KLSAgICAgIGlmIChyZWN1cnNpdmVNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyMTgsIDEpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFJlY3Vyc2l2ZU1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmVwZWF0ZWRJbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDMyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkSW50NjRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFVpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQzMl9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFVpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFNpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQzMl9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFNpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZpeGVkMzJfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDMyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkNjRfY29kZWMpOwotICAgICAgcmVwZWF0ZWRTZml4ZWQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFNmaXhlZDMyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRTZml4ZWQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZsb2F0Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRfY29kZWMpOwotICAgICAgcmVwZWF0ZWREb3VibGVfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWREb3VibGVfY29kZWMpOwotICAgICAgcmVwZWF0ZWRCb29sXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQm9vbF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFN0cmluZ18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ19jb2RlYyk7Ci0gICAgICByZXBlYXRlZEJ5dGVzXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQnl0ZXNfY29kZWMpOwotICAgICAgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkTWVzc2FnZV9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgICAgcmVwZWF0ZWROZXN0ZWRFbnVtXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkRW51bV9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25FbnVtXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbkVudW1fY29kZWMpOwotICAgICAgcmVwZWF0ZWRTdHJpbmdQaWVjZV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ1BpZWNlX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkQ29yZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZENvcmRfY29kZWMpOwotICAgICAgbWFwSW50MzJJbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwSW50MzJJbnQzMl9jb2RlYyk7Ci0gICAgICBtYXBJbnQ2NEludDY0Xy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBJbnQ2NEludDY0X2NvZGVjKTsKLSAgICAgIG1hcFVpbnQzMlVpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjKTsKLSAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwVWludDY0VWludDY0X2NvZGVjKTsKLSAgICAgIG1hcFNpbnQzMlNpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU2ludDMyU2ludDMyX2NvZGVjKTsKLSAgICAgIG1hcFNpbnQ2NFNpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjKTsKLSAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBGaXhlZDMyRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBtYXBGaXhlZDY0Rml4ZWQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwRml4ZWQ2NEZpeGVkNjRfY29kZWMpOwotICAgICAgbWFwU2ZpeGVkMzJTZml4ZWQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYyk7Ci0gICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0Xy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBTZml4ZWQ2NFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgIG1hcEludDMyRmxvYXRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcEludDMyRmxvYXRfY29kZWMpOwotICAgICAgbWFwSW50MzJEb3VibGVfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcEludDMyRG91YmxlX2NvZGVjKTsKLSAgICAgIG1hcEJvb2xCb29sXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBCb29sQm9vbF9jb2RlYyk7Ci0gICAgICBtYXBTdHJpbmdTdHJpbmdfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcFN0cmluZ1N0cmluZ19jb2RlYyk7Ci0gICAgICBtYXBTdHJpbmdCeXRlc18uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU3RyaW5nQnl0ZXNfY29kZWMpOwotICAgICAgbWFwU3RyaW5nTmVzdGVkTWVzc2FnZV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU3RyaW5nTmVzdGVkTWVzc2FnZV9jb2RlYyk7Ci0gICAgICBtYXBTdHJpbmdGb3JlaWduTWVzc2FnZV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgICAgbWFwU3RyaW5nTmVzdGVkRW51bV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU3RyaW5nTmVzdGVkRW51bV9jb2RlYyk7Ci0gICAgICBtYXBTdHJpbmdGb3JlaWduRW51bV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU3RyaW5nRm9yZWlnbkVudW1fY29kZWMpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNDgsIDYpOwotICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoT25lb2ZVaW50MzIpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mTmVzdGVkTWVzc2FnZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTMwLCA3KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPbmVvZk5lc3RlZE1lc3NhZ2UpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mU3RyaW5nKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMzgsIDcpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoT25lb2ZTdHJpbmcpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mQnl0ZXMpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE0NiwgNyk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKE9uZW9mQnl0ZXMpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsQm9vbFdyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgX3NpbmdsZV9vcHRpb25hbEJvb2xXcmFwcGVyX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCBPcHRpb25hbEJvb2xXcmFwcGVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25hbEludDMyV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBfc2luZ2xlX29wdGlvbmFsSW50MzJXcmFwcGVyX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCBPcHRpb25hbEludDMyV3JhcHBlcik7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxJbnQ2NFdyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgX3NpbmdsZV9vcHRpb25hbEludDY0V3JhcHBlcl9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgT3B0aW9uYWxJbnQ2NFdyYXBwZXIpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsVWludDMyV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBfc2luZ2xlX29wdGlvbmFsVWludDMyV3JhcHBlcl9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgT3B0aW9uYWxVaW50MzJXcmFwcGVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25hbFVpbnQ2NFdyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgX3NpbmdsZV9vcHRpb25hbFVpbnQ2NFdyYXBwZXJfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIE9wdGlvbmFsVWludDY0V3JhcHBlcik7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxGbG9hdFdyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgX3NpbmdsZV9vcHRpb25hbEZsb2F0V3JhcHBlcl9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgT3B0aW9uYWxGbG9hdFdyYXBwZXIpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsRG91YmxlV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBfc2luZ2xlX29wdGlvbmFsRG91YmxlV3JhcHBlcl9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgT3B0aW9uYWxEb3VibGVXcmFwcGVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25hbFN0cmluZ1dyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgX3NpbmdsZV9vcHRpb25hbFN0cmluZ1dyYXBwZXJfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIE9wdGlvbmFsU3RyaW5nV3JhcHBlcik7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxCeXRlc1dyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgX3NpbmdsZV9vcHRpb25hbEJ5dGVzV3JhcHBlcl9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgT3B0aW9uYWxCeXRlc1dyYXBwZXIpOwotICAgICAgfQotICAgICAgcmVwZWF0ZWRCb29sV3JhcHBlcl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEJvb2xXcmFwcGVyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkSW50MzJXcmFwcGVyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkSW50MzJXcmFwcGVyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkSW50NjRXcmFwcGVyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkSW50NjRXcmFwcGVyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkVWludDMyV3JhcHBlcl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQzMldyYXBwZXJfY29kZWMpOwotICAgICAgcmVwZWF0ZWRVaW50NjRXcmFwcGVyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkVWludDY0V3JhcHBlcl9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZsb2F0V3JhcHBlcl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEZsb2F0V3JhcHBlcl9jb2RlYyk7Ci0gICAgICByZXBlYXRlZERvdWJsZVdyYXBwZXJfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWREb3VibGVXcmFwcGVyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkU3RyaW5nV3JhcHBlcl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ1dyYXBwZXJfY29kZWMpOwotICAgICAgcmVwZWF0ZWRCeXRlc1dyYXBwZXJfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRCeXRlc1dyYXBwZXJfY29kZWMpOwotICAgICAgaWYgKG9wdGlvbmFsRHVyYXRpb25fICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDIzNCwgMTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKE9wdGlvbmFsRHVyYXRpb24pOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsVGltZXN0YW1wXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNDIsIDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPcHRpb25hbFRpbWVzdGFtcCk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxGaWVsZE1hc2tfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI1MCwgMTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKE9wdGlvbmFsRmllbGRNYXNrKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25hbFN0cnVjdF8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTMwLCAxOSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoT3B0aW9uYWxTdHJ1Y3QpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsQW55XyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMzgsIDE5KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPcHRpb25hbEFueSk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxWYWx1ZV8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTQ2LCAxOSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoT3B0aW9uYWxWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICByZXBlYXRlZER1cmF0aW9uXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRHVyYXRpb25fY29kZWMpOwotICAgICAgcmVwZWF0ZWRUaW1lc3RhbXBfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRUaW1lc3RhbXBfY29kZWMpOwotICAgICAgcmVwZWF0ZWRGaWVsZG1hc2tfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGaWVsZG1hc2tfY29kZWMpOwotICAgICAgcmVwZWF0ZWRBbnlfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRBbnlfY29kZWMpOwotICAgICAgcmVwZWF0ZWRWYWx1ZV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFZhbHVlX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkU3RydWN0Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU3RydWN0X2NvZGVjKTsKLSAgICAgIGlmIChGaWVsZG5hbWUxICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEzNiwgMjUpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihGaWVsZG5hbWUxKTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZE5hbWUyICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE0NCwgMjUpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihGaWVsZE5hbWUyKTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZE5hbWUzICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE1MiwgMjUpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihGaWVsZE5hbWUzKTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZE5hbWU0ICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2MCwgMjUpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihGaWVsZE5hbWU0KTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZDBOYW1lNSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNjgsIDI1KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoRmllbGQwTmFtZTUpOwotICAgICAgfQotICAgICAgaWYgKEZpZWxkME5hbWU2ICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE3NiwgMjUpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihGaWVsZDBOYW1lNik7Ci0gICAgICB9Ci0gICAgICBpZiAoRmllbGROYW1lNyAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxODQsIDI1KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoRmllbGROYW1lNyk7Ci0gICAgICB9Ci0gICAgICBpZiAoRmllbGROYW1lOCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOTIsIDI1KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoRmllbGROYW1lOCk7Ci0gICAgICB9Ci0gICAgICBpZiAoRmllbGROYW1lOSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyMDAsIDI1KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoRmllbGROYW1lOSk7Ci0gICAgICB9Ci0gICAgICBpZiAoRmllbGROYW1lMTAgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjA4LCAyNSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEZpZWxkTmFtZTEwKTsKLSAgICAgIH0KLSAgICAgIGlmIChGSUVMRE5BTUUxMSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyMTYsIDI1KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoRklFTEROQU1FMTEpOwotICAgICAgfQotICAgICAgaWYgKEZJRUxETmFtZTEyICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDIyNCwgMjUpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihGSUVMRE5hbWUxMik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKE9wdGlvbmFsSW50MzIgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShPcHRpb25hbEludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbEludDY0ICE9IDBMKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKE9wdGlvbmFsSW50NjQpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsVWludDMyICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKE9wdGlvbmFsVWludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFVpbnQ2NCAhPSAwVUwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKE9wdGlvbmFsVWludDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFNpbnQzMiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZShPcHRpb25hbFNpbnQzMik7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxTaW50NjQgIT0gMEwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplKE9wdGlvbmFsU2ludDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbEZpeGVkMzIgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyA0OwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsRml4ZWQ2NCAhPSAwVUwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgODsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFNmaXhlZDMyICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgNDsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFNmaXhlZDY0ICE9IDBMKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDg7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxGbG9hdCAhPSAwRikgewotICAgICAgICBzaXplICs9IDEgKyA0OwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsRG91YmxlICE9IDBEKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDg7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxCb29sICE9IGZhbHNlKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxTdHJpbmcuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE9wdGlvbmFsU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbEJ5dGVzLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKE9wdGlvbmFsQnl0ZXMpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKE9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICAgICAgfQotICAgICAgaWYgKE9wdGlvbmFsTmVzdGVkRW51bSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgT3B0aW9uYWxOZXN0ZWRFbnVtKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbEZvcmVpZ25FbnVtICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBPcHRpb25hbEZvcmVpZ25FbnVtKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbFN0cmluZ1BpZWNlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShPcHRpb25hbFN0cmluZ1BpZWNlKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpb25hbENvcmQuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE9wdGlvbmFsQ29yZCk7Ci0gICAgICB9Ci0gICAgICBpZiAocmVjdXJzaXZlTWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFJlY3Vyc2l2ZU1lc3NhZ2UpOwotICAgICAgfQotICAgICAgc2l6ZSArPSByZXBlYXRlZEludDMyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRJbnQ2NF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkVWludDMyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkVWludDY0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkU2ludDMyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkU2ludDY0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkRml4ZWQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRGaXhlZDY0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkNjRfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZFNmaXhlZDMyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFNmaXhlZDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRTZml4ZWQ2NF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRTZml4ZWQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkRmxvYXRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZERvdWJsZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWREb3VibGVfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEJvb2xfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkQm9vbF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkU3RyaW5nXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ19jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkQnl0ZXNfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkQnl0ZXNfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkTWVzc2FnZV9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZE5lc3RlZEVudW1fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkRW51bV9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkRm9yZWlnbkVudW1fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbkVudW1fY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZFN0cmluZ1BpZWNlXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ1BpZWNlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRDb3JkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZENvcmRfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBJbnQzMkludDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwSW50MzJJbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEludDY0SW50NjRfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBJbnQ2NEludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwVWludDMyVWludDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwVWludDY0VWludDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwVWludDY0VWludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwU2ludDMyU2ludDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU2ludDMyU2ludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwU2ludDY0U2ludDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwRml4ZWQzMkZpeGVkMzJfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBGaXhlZDMyRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEZpeGVkNjRGaXhlZDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwRml4ZWQ2NEZpeGVkNjRfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBTZml4ZWQzMlNmaXhlZDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFNmaXhlZDY0U2ZpeGVkNjRfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBTZml4ZWQ2NFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwSW50MzJGbG9hdF8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEludDMyRmxvYXRfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBJbnQzMkRvdWJsZV8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEludDMyRG91YmxlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwQm9vbEJvb2xfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBCb29sQm9vbF9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFN0cmluZ1N0cmluZ18uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcFN0cmluZ1N0cmluZ19jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFN0cmluZ0J5dGVzXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU3RyaW5nQnl0ZXNfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBTdHJpbmdOZXN0ZWRNZXNzYWdlXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU3RyaW5nTmVzdGVkTWVzc2FnZV9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFN0cmluZ0ZvcmVpZ25NZXNzYWdlXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBTdHJpbmdOZXN0ZWRFbnVtXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU3RyaW5nTmVzdGVkRW51bV9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFN0cmluZ0ZvcmVpZ25FbnVtXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU3RyaW5nRm9yZWlnbkVudW1fY29kZWMpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZShPbmVvZlVpbnQzMik7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZOZXN0ZWRNZXNzYWdlKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoT25lb2ZOZXN0ZWRNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZykgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoT25lb2ZTdHJpbmcpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mQnl0ZXMpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoT25lb2ZCeXRlcyk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxCb29sV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IF9zaW5nbGVfb3B0aW9uYWxCb29sV3JhcHBlcl9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhPcHRpb25hbEJvb2xXcmFwcGVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25hbEludDMyV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IF9zaW5nbGVfb3B0aW9uYWxJbnQzMldyYXBwZXJfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoT3B0aW9uYWxJbnQzMldyYXBwZXIpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsSW50NjRXcmFwcGVyXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9vcHRpb25hbEludDY0V3JhcHBlcl9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhPcHRpb25hbEludDY0V3JhcHBlcik7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxVaW50MzJXcmFwcGVyXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9vcHRpb25hbFVpbnQzMldyYXBwZXJfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoT3B0aW9uYWxVaW50MzJXcmFwcGVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25hbFVpbnQ2NFdyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSBfc2luZ2xlX29wdGlvbmFsVWludDY0V3JhcHBlcl9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhPcHRpb25hbFVpbnQ2NFdyYXBwZXIpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsRmxvYXRXcmFwcGVyXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9vcHRpb25hbEZsb2F0V3JhcHBlcl9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhPcHRpb25hbEZsb2F0V3JhcHBlcik7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uYWxEb3VibGVXcmFwcGVyXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9vcHRpb25hbERvdWJsZVdyYXBwZXJfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoT3B0aW9uYWxEb3VibGVXcmFwcGVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25hbFN0cmluZ1dyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSBfc2luZ2xlX29wdGlvbmFsU3RyaW5nV3JhcHBlcl9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhPcHRpb25hbFN0cmluZ1dyYXBwZXIpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsQnl0ZXNXcmFwcGVyXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9vcHRpb25hbEJ5dGVzV3JhcHBlcl9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhPcHRpb25hbEJ5dGVzV3JhcHBlcik7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHJlcGVhdGVkQm9vbFdyYXBwZXJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkQm9vbFdyYXBwZXJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEludDMyV3JhcHBlcl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQzMldyYXBwZXJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEludDY0V3JhcHBlcl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQ2NFdyYXBwZXJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZFVpbnQzMldyYXBwZXJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkVWludDMyV3JhcHBlcl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkVWludDY0V3JhcHBlcl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRVaW50NjRXcmFwcGVyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRGbG9hdFdyYXBwZXJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRXcmFwcGVyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWREb3VibGVXcmFwcGVyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZERvdWJsZVdyYXBwZXJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZFN0cmluZ1dyYXBwZXJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nV3JhcHBlcl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkQnl0ZXNXcmFwcGVyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEJ5dGVzV3JhcHBlcl9jb2RlYyk7Ci0gICAgICBpZiAob3B0aW9uYWxEdXJhdGlvbl8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKE9wdGlvbmFsRHVyYXRpb24pOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsVGltZXN0YW1wXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoT3B0aW9uYWxUaW1lc3RhbXApOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsRmllbGRNYXNrXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoT3B0aW9uYWxGaWVsZE1hc2spOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsU3RydWN0XyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoT3B0aW9uYWxTdHJ1Y3QpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsQW55XyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoT3B0aW9uYWxBbnkpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbmFsVmFsdWVfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShPcHRpb25hbFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gcmVwZWF0ZWREdXJhdGlvbl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWREdXJhdGlvbl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkVGltZXN0YW1wXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFRpbWVzdGFtcF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkRmllbGRtYXNrXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEZpZWxkbWFza19jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkU3RydWN0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFN0cnVjdF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkQW55Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEFueV9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkVmFsdWVfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkVmFsdWVfY29kZWMpOwotICAgICAgaWYgKEZpZWxkbmFtZTEgIT0gMCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShGaWVsZG5hbWUxKTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZE5hbWUyICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoRmllbGROYW1lMik7Ci0gICAgICB9Ci0gICAgICBpZiAoRmllbGROYW1lMyAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZpZWxkTmFtZTMpOwotICAgICAgfQotICAgICAgaWYgKEZpZWxkTmFtZTQgIT0gMCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShGaWVsZE5hbWU0KTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZDBOYW1lNSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZpZWxkME5hbWU1KTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZDBOYW1lNiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZpZWxkME5hbWU2KTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZE5hbWU3ICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoRmllbGROYW1lNyk7Ci0gICAgICB9Ci0gICAgICBpZiAoRmllbGROYW1lOCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZpZWxkTmFtZTgpOwotICAgICAgfQotICAgICAgaWYgKEZpZWxkTmFtZTkgIT0gMCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShGaWVsZE5hbWU5KTsKLSAgICAgIH0KLSAgICAgIGlmIChGaWVsZE5hbWUxMCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZpZWxkTmFtZTEwKTsKLSAgICAgIH0KLSAgICAgIGlmIChGSUVMRE5BTUUxMSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZJRUxETkFNRTExKTsKLSAgICAgIH0KLSAgICAgIGlmIChGSUVMRE5hbWUxMiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZJRUxETmFtZTEyKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0QWxsVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PcHRpb25hbEludDMyICE9IDApIHsKLSAgICAgICAgT3B0aW9uYWxJbnQzMiA9IG90aGVyLk9wdGlvbmFsSW50MzI7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3B0aW9uYWxJbnQ2NCAhPSAwTCkgewotICAgICAgICBPcHRpb25hbEludDY0ID0gb3RoZXIuT3B0aW9uYWxJbnQ2NDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PcHRpb25hbFVpbnQzMiAhPSAwKSB7Ci0gICAgICAgIE9wdGlvbmFsVWludDMyID0gb3RoZXIuT3B0aW9uYWxVaW50MzI7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3B0aW9uYWxVaW50NjQgIT0gMFVMKSB7Ci0gICAgICAgIE9wdGlvbmFsVWludDY0ID0gb3RoZXIuT3B0aW9uYWxVaW50NjQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3B0aW9uYWxTaW50MzIgIT0gMCkgewotICAgICAgICBPcHRpb25hbFNpbnQzMiA9IG90aGVyLk9wdGlvbmFsU2ludDMyOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9wdGlvbmFsU2ludDY0ICE9IDBMKSB7Ci0gICAgICAgIE9wdGlvbmFsU2ludDY0ID0gb3RoZXIuT3B0aW9uYWxTaW50NjQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3B0aW9uYWxGaXhlZDMyICE9IDApIHsKLSAgICAgICAgT3B0aW9uYWxGaXhlZDMyID0gb3RoZXIuT3B0aW9uYWxGaXhlZDMyOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9wdGlvbmFsRml4ZWQ2NCAhPSAwVUwpIHsKLSAgICAgICAgT3B0aW9uYWxGaXhlZDY0ID0gb3RoZXIuT3B0aW9uYWxGaXhlZDY0OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9wdGlvbmFsU2ZpeGVkMzIgIT0gMCkgewotICAgICAgICBPcHRpb25hbFNmaXhlZDMyID0gb3RoZXIuT3B0aW9uYWxTZml4ZWQzMjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PcHRpb25hbFNmaXhlZDY0ICE9IDBMKSB7Ci0gICAgICAgIE9wdGlvbmFsU2ZpeGVkNjQgPSBvdGhlci5PcHRpb25hbFNmaXhlZDY0OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9wdGlvbmFsRmxvYXQgIT0gMEYpIHsKLSAgICAgICAgT3B0aW9uYWxGbG9hdCA9IG90aGVyLk9wdGlvbmFsRmxvYXQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3B0aW9uYWxEb3VibGUgIT0gMEQpIHsKLSAgICAgICAgT3B0aW9uYWxEb3VibGUgPSBvdGhlci5PcHRpb25hbERvdWJsZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PcHRpb25hbEJvb2wgIT0gZmFsc2UpIHsKLSAgICAgICAgT3B0aW9uYWxCb29sID0gb3RoZXIuT3B0aW9uYWxCb29sOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9wdGlvbmFsU3RyaW5nLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE9wdGlvbmFsU3RyaW5nID0gb3RoZXIuT3B0aW9uYWxTdHJpbmc7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3B0aW9uYWxCeXRlcy5MZW5ndGggIT0gMCkgewotICAgICAgICBPcHRpb25hbEJ5dGVzID0gb3RoZXIuT3B0aW9uYWxCeXRlczsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbE5lc3RlZE1lc3NhZ2VfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPT0gbnVsbCkgewotICAgICAgICAgIG9wdGlvbmFsTmVzdGVkTWVzc2FnZV8gPSBuZXcgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIE9wdGlvbmFsTmVzdGVkTWVzc2FnZS5NZXJnZUZyb20ob3RoZXIuT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbEZvcmVpZ25NZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvcHRpb25hbEZvcmVpZ25NZXNzYWdlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgb3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSBuZXcgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuTWVyZ2VGcm9tKG90aGVyLk9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9wdGlvbmFsTmVzdGVkRW51bSAhPSAwKSB7Ci0gICAgICAgIE9wdGlvbmFsTmVzdGVkRW51bSA9IG90aGVyLk9wdGlvbmFsTmVzdGVkRW51bTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PcHRpb25hbEZvcmVpZ25FbnVtICE9IDApIHsKLSAgICAgICAgT3B0aW9uYWxGb3JlaWduRW51bSA9IG90aGVyLk9wdGlvbmFsRm9yZWlnbkVudW07Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3B0aW9uYWxTdHJpbmdQaWVjZS5MZW5ndGggIT0gMCkgewotICAgICAgICBPcHRpb25hbFN0cmluZ1BpZWNlID0gb3RoZXIuT3B0aW9uYWxTdHJpbmdQaWVjZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PcHRpb25hbENvcmQuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgT3B0aW9uYWxDb3JkID0gb3RoZXIuT3B0aW9uYWxDb3JkOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLnJlY3Vyc2l2ZU1lc3NhZ2VfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHJlY3Vyc2l2ZU1lc3NhZ2VfID09IG51bGwpIHsKLSAgICAgICAgICByZWN1cnNpdmVNZXNzYWdlXyA9IG5ldyBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcygpOwotICAgICAgICB9Ci0gICAgICAgIFJlY3Vyc2l2ZU1lc3NhZ2UuTWVyZ2VGcm9tKG90aGVyLlJlY3Vyc2l2ZU1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmVwZWF0ZWRJbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkSW50MzJfKTsKLSAgICAgIHJlcGVhdGVkSW50NjRfLkFkZChvdGhlci5yZXBlYXRlZEludDY0Xyk7Ci0gICAgICByZXBlYXRlZFVpbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkVWludDMyXyk7Ci0gICAgICByZXBlYXRlZFVpbnQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkVWludDY0Xyk7Ci0gICAgICByZXBlYXRlZFNpbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ludDMyXyk7Ci0gICAgICByZXBlYXRlZFNpbnQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkU2ludDY0Xyk7Ci0gICAgICByZXBlYXRlZEZpeGVkMzJfLkFkZChvdGhlci5yZXBlYXRlZEZpeGVkMzJfKTsKLSAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8pOwotICAgICAgcmVwZWF0ZWRTZml4ZWQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ZpeGVkMzJfKTsKLSAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfLkFkZChvdGhlci5yZXBlYXRlZFNmaXhlZDY0Xyk7Ci0gICAgICByZXBlYXRlZEZsb2F0Xy5BZGQob3RoZXIucmVwZWF0ZWRGbG9hdF8pOwotICAgICAgcmVwZWF0ZWREb3VibGVfLkFkZChvdGhlci5yZXBlYXRlZERvdWJsZV8pOwotICAgICAgcmVwZWF0ZWRCb29sXy5BZGQob3RoZXIucmVwZWF0ZWRCb29sXyk7Ci0gICAgICByZXBlYXRlZFN0cmluZ18uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nXyk7Ci0gICAgICByZXBlYXRlZEJ5dGVzXy5BZGQob3RoZXIucmVwZWF0ZWRCeXRlc18pOwotICAgICAgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8pOwotICAgICAgcmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGQob3RoZXIucmVwZWF0ZWROZXN0ZWRFbnVtXyk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25FbnVtXy5BZGQob3RoZXIucmVwZWF0ZWRGb3JlaWduRW51bV8pOwotICAgICAgcmVwZWF0ZWRTdHJpbmdQaWVjZV8uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nUGllY2VfKTsKLSAgICAgIHJlcGVhdGVkQ29yZF8uQWRkKG90aGVyLnJlcGVhdGVkQ29yZF8pOwotICAgICAgbWFwSW50MzJJbnQzMl8uQWRkKG90aGVyLm1hcEludDMySW50MzJfKTsKLSAgICAgIG1hcEludDY0SW50NjRfLkFkZChvdGhlci5tYXBJbnQ2NEludDY0Xyk7Ci0gICAgICBtYXBVaW50MzJVaW50MzJfLkFkZChvdGhlci5tYXBVaW50MzJVaW50MzJfKTsKLSAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8uQWRkKG90aGVyLm1hcFVpbnQ2NFVpbnQ2NF8pOwotICAgICAgbWFwU2ludDMyU2ludDMyXy5BZGQob3RoZXIubWFwU2ludDMyU2ludDMyXyk7Ci0gICAgICBtYXBTaW50NjRTaW50NjRfLkFkZChvdGhlci5tYXBTaW50NjRTaW50NjRfKTsKLSAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXy5BZGQob3RoZXIubWFwRml4ZWQzMkZpeGVkMzJfKTsKLSAgICAgIG1hcEZpeGVkNjRGaXhlZDY0Xy5BZGQob3RoZXIubWFwRml4ZWQ2NEZpeGVkNjRfKTsKLSAgICAgIG1hcFNmaXhlZDMyU2ZpeGVkMzJfLkFkZChvdGhlci5tYXBTZml4ZWQzMlNmaXhlZDMyXyk7Ci0gICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0Xy5BZGQob3RoZXIubWFwU2ZpeGVkNjRTZml4ZWQ2NF8pOwotICAgICAgbWFwSW50MzJGbG9hdF8uQWRkKG90aGVyLm1hcEludDMyRmxvYXRfKTsKLSAgICAgIG1hcEludDMyRG91YmxlXy5BZGQob3RoZXIubWFwSW50MzJEb3VibGVfKTsKLSAgICAgIG1hcEJvb2xCb29sXy5BZGQob3RoZXIubWFwQm9vbEJvb2xfKTsKLSAgICAgIG1hcFN0cmluZ1N0cmluZ18uQWRkKG90aGVyLm1hcFN0cmluZ1N0cmluZ18pOwotICAgICAgbWFwU3RyaW5nQnl0ZXNfLkFkZChvdGhlci5tYXBTdHJpbmdCeXRlc18pOwotICAgICAgbWFwU3RyaW5nTmVzdGVkTWVzc2FnZV8uQWRkKG90aGVyLm1hcFN0cmluZ05lc3RlZE1lc3NhZ2VfKTsKLSAgICAgIG1hcFN0cmluZ0ZvcmVpZ25NZXNzYWdlXy5BZGQob3RoZXIubWFwU3RyaW5nRm9yZWlnbk1lc3NhZ2VfKTsKLSAgICAgIG1hcFN0cmluZ05lc3RlZEVudW1fLkFkZChvdGhlci5tYXBTdHJpbmdOZXN0ZWRFbnVtXyk7Ci0gICAgICBtYXBTdHJpbmdGb3JlaWduRW51bV8uQWRkKG90aGVyLm1hcFN0cmluZ0ZvcmVpZ25FbnVtXyk7Ci0gICAgICBpZiAob3RoZXIub3B0aW9uYWxCb29sV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxCb29sV3JhcHBlcl8gPT0gbnVsbCB8fCBvdGhlci5PcHRpb25hbEJvb2xXcmFwcGVyICE9IGZhbHNlKSB7Ci0gICAgICAgICAgT3B0aW9uYWxCb29sV3JhcHBlciA9IG90aGVyLk9wdGlvbmFsQm9vbFdyYXBwZXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbEludDMyV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxJbnQzMldyYXBwZXJfID09IG51bGwgfHwgb3RoZXIuT3B0aW9uYWxJbnQzMldyYXBwZXIgIT0gMCkgewotICAgICAgICAgIE9wdGlvbmFsSW50MzJXcmFwcGVyID0gb3RoZXIuT3B0aW9uYWxJbnQzMldyYXBwZXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbEludDY0V3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxJbnQ2NFdyYXBwZXJfID09IG51bGwgfHwgb3RoZXIuT3B0aW9uYWxJbnQ2NFdyYXBwZXIgIT0gMEwpIHsKLSAgICAgICAgICBPcHRpb25hbEludDY0V3JhcHBlciA9IG90aGVyLk9wdGlvbmFsSW50NjRXcmFwcGVyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIub3B0aW9uYWxVaW50MzJXcmFwcGVyXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvcHRpb25hbFVpbnQzMldyYXBwZXJfID09IG51bGwgfHwgb3RoZXIuT3B0aW9uYWxVaW50MzJXcmFwcGVyICE9IDApIHsKLSAgICAgICAgICBPcHRpb25hbFVpbnQzMldyYXBwZXIgPSBvdGhlci5PcHRpb25hbFVpbnQzMldyYXBwZXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbFVpbnQ2NFdyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG9wdGlvbmFsVWludDY0V3JhcHBlcl8gPT0gbnVsbCB8fCBvdGhlci5PcHRpb25hbFVpbnQ2NFdyYXBwZXIgIT0gMFVMKSB7Ci0gICAgICAgICAgT3B0aW9uYWxVaW50NjRXcmFwcGVyID0gb3RoZXIuT3B0aW9uYWxVaW50NjRXcmFwcGVyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIub3B0aW9uYWxGbG9hdFdyYXBwZXJfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG9wdGlvbmFsRmxvYXRXcmFwcGVyXyA9PSBudWxsIHx8IG90aGVyLk9wdGlvbmFsRmxvYXRXcmFwcGVyICE9IDBGKSB7Ci0gICAgICAgICAgT3B0aW9uYWxGbG9hdFdyYXBwZXIgPSBvdGhlci5PcHRpb25hbEZsb2F0V3JhcHBlcjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLm9wdGlvbmFsRG91YmxlV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxEb3VibGVXcmFwcGVyXyA9PSBudWxsIHx8IG90aGVyLk9wdGlvbmFsRG91YmxlV3JhcHBlciAhPSAwRCkgewotICAgICAgICAgIE9wdGlvbmFsRG91YmxlV3JhcHBlciA9IG90aGVyLk9wdGlvbmFsRG91YmxlV3JhcHBlcjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLm9wdGlvbmFsU3RyaW5nV3JhcHBlcl8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxTdHJpbmdXcmFwcGVyXyA9PSBudWxsIHx8IG90aGVyLk9wdGlvbmFsU3RyaW5nV3JhcHBlciAhPSAiIikgewotICAgICAgICAgIE9wdGlvbmFsU3RyaW5nV3JhcHBlciA9IG90aGVyLk9wdGlvbmFsU3RyaW5nV3JhcHBlcjsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLm9wdGlvbmFsQnl0ZXNXcmFwcGVyXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvcHRpb25hbEJ5dGVzV3JhcHBlcl8gPT0gbnVsbCB8fCBvdGhlci5PcHRpb25hbEJ5dGVzV3JhcHBlciAhPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eSkgewotICAgICAgICAgIE9wdGlvbmFsQnl0ZXNXcmFwcGVyID0gb3RoZXIuT3B0aW9uYWxCeXRlc1dyYXBwZXI7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJlcGVhdGVkQm9vbFdyYXBwZXJfLkFkZChvdGhlci5yZXBlYXRlZEJvb2xXcmFwcGVyXyk7Ci0gICAgICByZXBlYXRlZEludDMyV3JhcHBlcl8uQWRkKG90aGVyLnJlcGVhdGVkSW50MzJXcmFwcGVyXyk7Ci0gICAgICByZXBlYXRlZEludDY0V3JhcHBlcl8uQWRkKG90aGVyLnJlcGVhdGVkSW50NjRXcmFwcGVyXyk7Ci0gICAgICByZXBlYXRlZFVpbnQzMldyYXBwZXJfLkFkZChvdGhlci5yZXBlYXRlZFVpbnQzMldyYXBwZXJfKTsKLSAgICAgIHJlcGVhdGVkVWludDY0V3JhcHBlcl8uQWRkKG90aGVyLnJlcGVhdGVkVWludDY0V3JhcHBlcl8pOwotICAgICAgcmVwZWF0ZWRGbG9hdFdyYXBwZXJfLkFkZChvdGhlci5yZXBlYXRlZEZsb2F0V3JhcHBlcl8pOwotICAgICAgcmVwZWF0ZWREb3VibGVXcmFwcGVyXy5BZGQob3RoZXIucmVwZWF0ZWREb3VibGVXcmFwcGVyXyk7Ci0gICAgICByZXBlYXRlZFN0cmluZ1dyYXBwZXJfLkFkZChvdGhlci5yZXBlYXRlZFN0cmluZ1dyYXBwZXJfKTsKLSAgICAgIHJlcGVhdGVkQnl0ZXNXcmFwcGVyXy5BZGQob3RoZXIucmVwZWF0ZWRCeXRlc1dyYXBwZXJfKTsKLSAgICAgIGlmIChvdGhlci5vcHRpb25hbER1cmF0aW9uXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvcHRpb25hbER1cmF0aW9uXyA9PSBudWxsKSB7Ci0gICAgICAgICAgb3B0aW9uYWxEdXJhdGlvbl8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBPcHRpb25hbER1cmF0aW9uLk1lcmdlRnJvbShvdGhlci5PcHRpb25hbER1cmF0aW9uKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbFRpbWVzdGFtcF8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxUaW1lc3RhbXBfID09IG51bGwpIHsKLSAgICAgICAgICBvcHRpb25hbFRpbWVzdGFtcF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3B0aW9uYWxUaW1lc3RhbXAuTWVyZ2VGcm9tKG90aGVyLk9wdGlvbmFsVGltZXN0YW1wKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbEZpZWxkTWFza18gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxGaWVsZE1hc2tfID09IG51bGwpIHsKLSAgICAgICAgICBvcHRpb25hbEZpZWxkTWFza18gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3B0aW9uYWxGaWVsZE1hc2suTWVyZ2VGcm9tKG90aGVyLk9wdGlvbmFsRmllbGRNYXNrKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbFN0cnVjdF8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxTdHJ1Y3RfID09IG51bGwpIHsKLSAgICAgICAgICBvcHRpb25hbFN0cnVjdF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3B0aW9uYWxTdHJ1Y3QuTWVyZ2VGcm9tKG90aGVyLk9wdGlvbmFsU3RydWN0KTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbEFueV8gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uYWxBbnlfID09IG51bGwpIHsKLSAgICAgICAgICBvcHRpb25hbEFueV8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55KCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3B0aW9uYWxBbnkuTWVyZ2VGcm9tKG90aGVyLk9wdGlvbmFsQW55KTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25hbFZhbHVlXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvcHRpb25hbFZhbHVlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgb3B0aW9uYWxWYWx1ZV8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgICBPcHRpb25hbFZhbHVlLk1lcmdlRnJvbShvdGhlci5PcHRpb25hbFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJlcGVhdGVkRHVyYXRpb25fLkFkZChvdGhlci5yZXBlYXRlZER1cmF0aW9uXyk7Ci0gICAgICByZXBlYXRlZFRpbWVzdGFtcF8uQWRkKG90aGVyLnJlcGVhdGVkVGltZXN0YW1wXyk7Ci0gICAgICByZXBlYXRlZEZpZWxkbWFza18uQWRkKG90aGVyLnJlcGVhdGVkRmllbGRtYXNrXyk7Ci0gICAgICByZXBlYXRlZFN0cnVjdF8uQWRkKG90aGVyLnJlcGVhdGVkU3RydWN0Xyk7Ci0gICAgICByZXBlYXRlZEFueV8uQWRkKG90aGVyLnJlcGVhdGVkQW55Xyk7Ci0gICAgICByZXBlYXRlZFZhbHVlXy5BZGQob3RoZXIucmVwZWF0ZWRWYWx1ZV8pOwotICAgICAgaWYgKG90aGVyLkZpZWxkbmFtZTEgIT0gMCkgewotICAgICAgICBGaWVsZG5hbWUxID0gb3RoZXIuRmllbGRuYW1lMTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5GaWVsZE5hbWUyICE9IDApIHsKLSAgICAgICAgRmllbGROYW1lMiA9IG90aGVyLkZpZWxkTmFtZTI7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRmllbGROYW1lMyAhPSAwKSB7Ci0gICAgICAgIEZpZWxkTmFtZTMgPSBvdGhlci5GaWVsZE5hbWUzOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkZpZWxkTmFtZTQgIT0gMCkgewotICAgICAgICBGaWVsZE5hbWU0ID0gb3RoZXIuRmllbGROYW1lNDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5GaWVsZDBOYW1lNSAhPSAwKSB7Ci0gICAgICAgIEZpZWxkME5hbWU1ID0gb3RoZXIuRmllbGQwTmFtZTU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRmllbGQwTmFtZTYgIT0gMCkgewotICAgICAgICBGaWVsZDBOYW1lNiA9IG90aGVyLkZpZWxkME5hbWU2OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkZpZWxkTmFtZTcgIT0gMCkgewotICAgICAgICBGaWVsZE5hbWU3ID0gb3RoZXIuRmllbGROYW1lNzsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5GaWVsZE5hbWU4ICE9IDApIHsKLSAgICAgICAgRmllbGROYW1lOCA9IG90aGVyLkZpZWxkTmFtZTg7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRmllbGROYW1lOSAhPSAwKSB7Ci0gICAgICAgIEZpZWxkTmFtZTkgPSBvdGhlci5GaWVsZE5hbWU5OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkZpZWxkTmFtZTEwICE9IDApIHsKLSAgICAgICAgRmllbGROYW1lMTAgPSBvdGhlci5GaWVsZE5hbWUxMDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5GSUVMRE5BTUUxMSAhPSAwKSB7Ci0gICAgICAgIEZJRUxETkFNRTExID0gb3RoZXIuRklFTEROQU1FMTE7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRklFTEROYW1lMTIgIT0gMCkgewotICAgICAgICBGSUVMRE5hbWUxMiA9IG90aGVyLkZJRUxETmFtZTEyOwotICAgICAgfQotICAgICAgc3dpdGNoIChvdGhlci5PbmVvZkZpZWxkQ2FzZSkgewotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZVaW50MzI6Ci0gICAgICAgICAgT25lb2ZVaW50MzIgPSBvdGhlci5PbmVvZlVpbnQzMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mTmVzdGVkTWVzc2FnZToKLSAgICAgICAgICBPbmVvZk5lc3RlZE1lc3NhZ2UgPSBvdGhlci5PbmVvZk5lc3RlZE1lc3NhZ2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZzoKLSAgICAgICAgICBPbmVvZlN0cmluZyA9IG90aGVyLk9uZW9mU3RyaW5nOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlczoKLSAgICAgICAgICBPbmVvZkJ5dGVzID0gb3RoZXIuT25lb2ZCeXRlczsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgT3B0aW9uYWxJbnQzMiA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsSW50NjQgPSBpbnB1dC5SZWFkSW50NjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI0OiB7Ci0gICAgICAgICAgICBPcHRpb25hbFVpbnQzMiA9IGlucHV0LlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyOiB7Ci0gICAgICAgICAgICBPcHRpb25hbFVpbnQ2NCA9IGlucHV0LlJlYWRVSW50NjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQwOiB7Ci0gICAgICAgICAgICBPcHRpb25hbFNpbnQzMiA9IGlucHV0LlJlYWRTSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQ4OiB7Ci0gICAgICAgICAgICBPcHRpb25hbFNpbnQ2NCA9IGlucHV0LlJlYWRTSW50NjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDYxOiB7Ci0gICAgICAgICAgICBPcHRpb25hbEZpeGVkMzIgPSBpbnB1dC5SZWFkRml4ZWQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjU6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsRml4ZWQ2NCA9IGlucHV0LlJlYWRGaXhlZDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NzogewotICAgICAgICAgICAgT3B0aW9uYWxTZml4ZWQzMiA9IGlucHV0LlJlYWRTRml4ZWQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODE6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsU2ZpeGVkNjQgPSBpbnB1dC5SZWFkU0ZpeGVkNjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDkzOiB7Ci0gICAgICAgICAgICBPcHRpb25hbEZsb2F0ID0gaW5wdXQuUmVhZEZsb2F0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5NzogewotICAgICAgICAgICAgT3B0aW9uYWxEb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDQ6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsQm9vbCA9IGlucHV0LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMTQ6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsU3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTIyOiB7Ci0gICAgICAgICAgICBPcHRpb25hbEJ5dGVzID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNDY6IHsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbE5lc3RlZE1lc3NhZ2VfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlXyA9IG5ldyBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShvcHRpb25hbE5lc3RlZE1lc3NhZ2VfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE1NDogewotICAgICAgICAgICAgaWYgKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgb3B0aW9uYWxGb3JlaWduTWVzc2FnZV8gPSBuZXcgZ2xvYmFsOjpDb25mb3JtYW5jZS5Gb3JlaWduTWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uob3B0aW9uYWxGb3JlaWduTWVzc2FnZV8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY4OiB7Ci0gICAgICAgICAgICBvcHRpb25hbE5lc3RlZEVudW1fID0gKGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0pIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNzY6IHsKLSAgICAgICAgICAgIG9wdGlvbmFsRm9yZWlnbkVudW1fID0gKGdsb2JhbDo6Q29uZm9ybWFuY2UuRm9yZWlnbkVudW0pIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxOTQ6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsU3RyaW5nUGllY2UgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyMDI6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsQ29yZCA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDIxODogewotICAgICAgICAgICAgaWYgKHJlY3Vyc2l2ZU1lc3NhZ2VfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgcmVjdXJzaXZlTWVzc2FnZV8gPSBuZXcgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHJlY3Vyc2l2ZU1lc3NhZ2VfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI1MDoKLSAgICAgICAgICBjYXNlIDI0ODogewotICAgICAgICAgICAgcmVwZWF0ZWRJbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI1ODoKLSAgICAgICAgICBjYXNlIDI1NjogewotICAgICAgICAgICAgcmVwZWF0ZWRJbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI2NjoKLSAgICAgICAgICBjYXNlIDI2NDogewotICAgICAgICAgICAgcmVwZWF0ZWRVaW50MzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRVaW50MzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjc0OgotICAgICAgICAgIGNhc2UgMjcyOiB7Ci0gICAgICAgICAgICByZXBlYXRlZFVpbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyODI6Ci0gICAgICAgICAgY2FzZSAyODA6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkU2ludDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU2ludDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI5MDoKLSAgICAgICAgICBjYXNlIDI4ODogewotICAgICAgICAgICAgcmVwZWF0ZWRTaW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRTaW50NjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjk4OgotICAgICAgICAgIGNhc2UgMzAxOiB7Ci0gICAgICAgICAgICByZXBlYXRlZEZpeGVkMzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMwNjoKLSAgICAgICAgICBjYXNlIDMwNTogewotICAgICAgICAgICAgcmVwZWF0ZWRGaXhlZDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRml4ZWQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMTQ6Ci0gICAgICAgICAgY2FzZSAzMTc6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkU2ZpeGVkMzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRTZml4ZWQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMjI6Ci0gICAgICAgICAgY2FzZSAzMjE6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRTZml4ZWQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMzA6Ci0gICAgICAgICAgY2FzZSAzMzM6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkRmxvYXRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGbG9hdF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMzg6Ci0gICAgICAgICAgY2FzZSAzMzc6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkRG91YmxlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRG91YmxlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDM0NjoKLSAgICAgICAgICBjYXNlIDM0NDogewotICAgICAgICAgICAgcmVwZWF0ZWRCb29sXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQm9vbF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNTQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkU3RyaW5nXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDM2MjogewotICAgICAgICAgICAgcmVwZWF0ZWRCeXRlc18uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEJ5dGVzX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDM4NjogewotICAgICAgICAgICAgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkTWVzc2FnZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzOTQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MTA6Ci0gICAgICAgICAgY2FzZSA0MDg6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkTmVzdGVkRW51bV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZE5lc3RlZEVudW1fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDE4OgotICAgICAgICAgIGNhc2UgNDE2OiB7Ci0gICAgICAgICAgICByZXBlYXRlZEZvcmVpZ25FbnVtXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbkVudW1fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDM0OiB7Ci0gICAgICAgICAgICByZXBlYXRlZFN0cmluZ1BpZWNlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nUGllY2VfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDQyOiB7Ci0gICAgICAgICAgICByZXBlYXRlZENvcmRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRDb3JkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQ1MDogewotICAgICAgICAgICAgbWFwSW50MzJJbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwSW50MzJJbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0NTg6IHsKLSAgICAgICAgICAgIG1hcEludDY0SW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEludDY0SW50NjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDY2OiB7Ci0gICAgICAgICAgICBtYXBVaW50MzJVaW50MzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcFVpbnQzMlVpbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0NzQ6IHsKLSAgICAgICAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwVWludDY0VWludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQ4MjogewotICAgICAgICAgICAgbWFwU2ludDMyU2ludDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTaW50MzJTaW50MzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDkwOiB7Ci0gICAgICAgICAgICBtYXBTaW50NjRTaW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcFNpbnQ2NFNpbnQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0OTg6IHsKLSAgICAgICAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBGaXhlZDMyRml4ZWQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1MDY6IHsKLSAgICAgICAgICAgIG1hcEZpeGVkNjRGaXhlZDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBGaXhlZDY0Rml4ZWQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1MTQ6IHsKLSAgICAgICAgICAgIG1hcFNmaXhlZDMyU2ZpeGVkMzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcFNmaXhlZDMyU2ZpeGVkMzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTIyOiB7Ci0gICAgICAgICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTZml4ZWQ2NFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUzMDogewotICAgICAgICAgICAgbWFwSW50MzJGbG9hdF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwSW50MzJGbG9hdF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1Mzg6IHsKLSAgICAgICAgICAgIG1hcEludDMyRG91YmxlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBJbnQzMkRvdWJsZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1NDY6IHsKLSAgICAgICAgICAgIG1hcEJvb2xCb29sXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBCb29sQm9vbF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1NTQ6IHsKLSAgICAgICAgICAgIG1hcFN0cmluZ1N0cmluZ18uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwU3RyaW5nU3RyaW5nX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDU2MjogewotICAgICAgICAgICAgbWFwU3RyaW5nQnl0ZXNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcFN0cmluZ0J5dGVzX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDU3MDogewotICAgICAgICAgICAgbWFwU3RyaW5nTmVzdGVkTWVzc2FnZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwU3RyaW5nTmVzdGVkTWVzc2FnZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1Nzg6IHsKLSAgICAgICAgICAgIG1hcFN0cmluZ0ZvcmVpZ25NZXNzYWdlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTdHJpbmdGb3JlaWduTWVzc2FnZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1ODY6IHsKLSAgICAgICAgICAgIG1hcFN0cmluZ05lc3RlZEVudW1fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcFN0cmluZ05lc3RlZEVudW1fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTk0OiB7Ci0gICAgICAgICAgICBtYXBTdHJpbmdGb3JlaWduRW51bV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwU3RyaW5nRm9yZWlnbkVudW1fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODg4OiB7Ci0gICAgICAgICAgICBPbmVvZlVpbnQzMiA9IGlucHV0LlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDg5ODogewotICAgICAgICAgICAgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBzdWJCdWlsZGVyID0gbmV3IGdsb2JhbDo6Q29uZm9ybWFuY2UuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZk5lc3RlZE1lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oT25lb2ZOZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIpOwotICAgICAgICAgICAgT25lb2ZOZXN0ZWRNZXNzYWdlID0gc3ViQnVpbGRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDkwNjogewotICAgICAgICAgICAgT25lb2ZTdHJpbmcgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MTQ6IHsKLSAgICAgICAgICAgIE9uZW9mQnl0ZXMgPSBpbnB1dC5SZWFkQnl0ZXMoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2MTA6IHsKLSAgICAgICAgICAgIGJvb2w/IHZhbHVlID0gX3NpbmdsZV9vcHRpb25hbEJvb2xXcmFwcGVyX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKG9wdGlvbmFsQm9vbFdyYXBwZXJfID09IG51bGwgfHwgdmFsdWUgIT0gZmFsc2UpIHsKLSAgICAgICAgICAgICAgT3B0aW9uYWxCb29sV3JhcHBlciA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTYxODogewotICAgICAgICAgICAgaW50PyB2YWx1ZSA9IF9zaW5nbGVfb3B0aW9uYWxJbnQzMldyYXBwZXJfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxJbnQzMldyYXBwZXJfID09IG51bGwgfHwgdmFsdWUgIT0gMCkgewotICAgICAgICAgICAgICBPcHRpb25hbEludDMyV3JhcHBlciA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTYyNjogewotICAgICAgICAgICAgbG9uZz8gdmFsdWUgPSBfc2luZ2xlX29wdGlvbmFsSW50NjRXcmFwcGVyX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKG9wdGlvbmFsSW50NjRXcmFwcGVyXyA9PSBudWxsIHx8IHZhbHVlICE9IDBMKSB7Ci0gICAgICAgICAgICAgIE9wdGlvbmFsSW50NjRXcmFwcGVyID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjM0OiB7Ci0gICAgICAgICAgICB1aW50PyB2YWx1ZSA9IF9zaW5nbGVfb3B0aW9uYWxVaW50MzJXcmFwcGVyX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKG9wdGlvbmFsVWludDMyV3JhcHBlcl8gPT0gbnVsbCB8fCB2YWx1ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgIE9wdGlvbmFsVWludDMyV3JhcHBlciA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY0MjogewotICAgICAgICAgICAgdWxvbmc/IHZhbHVlID0gX3NpbmdsZV9vcHRpb25hbFVpbnQ2NFdyYXBwZXJfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxVaW50NjRXcmFwcGVyXyA9PSBudWxsIHx8IHZhbHVlICE9IDBVTCkgewotICAgICAgICAgICAgICBPcHRpb25hbFVpbnQ2NFdyYXBwZXIgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2NTA6IHsKLSAgICAgICAgICAgIGZsb2F0PyB2YWx1ZSA9IF9zaW5nbGVfb3B0aW9uYWxGbG9hdFdyYXBwZXJfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxGbG9hdFdyYXBwZXJfID09IG51bGwgfHwgdmFsdWUgIT0gMEYpIHsKLSAgICAgICAgICAgICAgT3B0aW9uYWxGbG9hdFdyYXBwZXIgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2NTg6IHsKLSAgICAgICAgICAgIGRvdWJsZT8gdmFsdWUgPSBfc2luZ2xlX29wdGlvbmFsRG91YmxlV3JhcHBlcl9jb2RlYy5SZWFkKGlucHV0KTsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbERvdWJsZVdyYXBwZXJfID09IG51bGwgfHwgdmFsdWUgIT0gMEQpIHsKLSAgICAgICAgICAgICAgT3B0aW9uYWxEb3VibGVXcmFwcGVyID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjY2OiB7Ci0gICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSBfc2luZ2xlX29wdGlvbmFsU3RyaW5nV3JhcHBlcl9jb2RlYy5SZWFkKGlucHV0KTsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbFN0cmluZ1dyYXBwZXJfID09IG51bGwgfHwgdmFsdWUgIT0gIiIpIHsKLSAgICAgICAgICAgICAgT3B0aW9uYWxTdHJpbmdXcmFwcGVyID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjc0OiB7Ci0gICAgICAgICAgICBwYjo6Qnl0ZVN0cmluZyB2YWx1ZSA9IF9zaW5nbGVfb3B0aW9uYWxCeXRlc1dyYXBwZXJfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxCeXRlc1dyYXBwZXJfID09IG51bGwgfHwgdmFsdWUgIT0gcGI6OkJ5dGVTdHJpbmcuRW1wdHkpIHsKLSAgICAgICAgICAgICAgT3B0aW9uYWxCeXRlc1dyYXBwZXIgPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2OTA6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkQm9vbFdyYXBwZXJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRCb29sV3JhcHBlcl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjk4OiB7Ci0gICAgICAgICAgICByZXBlYXRlZEludDMyV3JhcHBlcl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDMyV3JhcHBlcl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNzA2OiB7Ci0gICAgICAgICAgICByZXBlYXRlZEludDY0V3JhcHBlcl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDY0V3JhcHBlcl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNzE0OiB7Ci0gICAgICAgICAgICByZXBlYXRlZFVpbnQzMldyYXBwZXJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRVaW50MzJXcmFwcGVyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE3MjI6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkVWludDY0V3JhcHBlcl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NFdyYXBwZXJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTczMDogewotICAgICAgICAgICAgcmVwZWF0ZWRGbG9hdFdyYXBwZXJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGbG9hdFdyYXBwZXJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTczODogewotICAgICAgICAgICAgcmVwZWF0ZWREb3VibGVXcmFwcGVyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRG91YmxlV3JhcHBlcl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNzQ2OiB7Ci0gICAgICAgICAgICByZXBlYXRlZFN0cmluZ1dyYXBwZXJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRTdHJpbmdXcmFwcGVyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE3NTQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkQnl0ZXNXcmFwcGVyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQnl0ZXNXcmFwcGVyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI0MTA6IHsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbER1cmF0aW9uXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIG9wdGlvbmFsRHVyYXRpb25fID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShvcHRpb25hbER1cmF0aW9uXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDE4OiB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxUaW1lc3RhbXBfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgb3B0aW9uYWxUaW1lc3RhbXBfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uob3B0aW9uYWxUaW1lc3RhbXBfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI0MjY6IHsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbEZpZWxkTWFza18gPT0gbnVsbCkgewotICAgICAgICAgICAgICBvcHRpb25hbEZpZWxkTWFza18gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShvcHRpb25hbEZpZWxkTWFza18pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQzNDogewotICAgICAgICAgICAgaWYgKG9wdGlvbmFsU3RydWN0XyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIG9wdGlvbmFsU3RydWN0XyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKG9wdGlvbmFsU3RydWN0Xyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDQyOiB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uYWxBbnlfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgb3B0aW9uYWxBbnlfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uob3B0aW9uYWxBbnlfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI0NTA6IHsKLSAgICAgICAgICAgIGlmIChvcHRpb25hbFZhbHVlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIG9wdGlvbmFsVmFsdWVfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShvcHRpb25hbFZhbHVlXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDkwOiB7Ci0gICAgICAgICAgICByZXBlYXRlZER1cmF0aW9uXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRHVyYXRpb25fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQ5ODogewotICAgICAgICAgICAgcmVwZWF0ZWRUaW1lc3RhbXBfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRUaW1lc3RhbXBfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjUwNjogewotICAgICAgICAgICAgcmVwZWF0ZWRGaWVsZG1hc2tfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGaWVsZG1hc2tfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjUyMjogewotICAgICAgICAgICAgcmVwZWF0ZWRBbnlfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRBbnlfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjUzMDogewotICAgICAgICAgICAgcmVwZWF0ZWRWYWx1ZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFZhbHVlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI1OTQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkU3RydWN0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU3RydWN0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyMDg6IHsKLSAgICAgICAgICAgIEZpZWxkbmFtZTEgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyMTY6IHsKLSAgICAgICAgICAgIEZpZWxkTmFtZTIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyMjQ6IHsKLSAgICAgICAgICAgIEZpZWxkTmFtZTMgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyMzI6IHsKLSAgICAgICAgICAgIEZpZWxkTmFtZTQgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyNDA6IHsKLSAgICAgICAgICAgIEZpZWxkME5hbWU1ID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMjQ4OiB7Ci0gICAgICAgICAgICBGaWVsZDBOYW1lNiA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzI1NjogewotICAgICAgICAgICAgRmllbGROYW1lNyA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzI2NDogewotICAgICAgICAgICAgRmllbGROYW1lOCA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzI3MjogewotICAgICAgICAgICAgRmllbGROYW1lOSA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzI4MDogewotICAgICAgICAgICAgRmllbGROYW1lMTAgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyODg6IHsKLSAgICAgICAgICAgIEZJRUxETkFNRTExID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMjk2OiB7Ci0gICAgICAgICAgICBGSUVMRE5hbWUxMiA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMKLSAgICAvLy8gPHN1bW1hcnk+Q29udGFpbmVyIGZvciBuZXN0ZWQgdHlwZXMgZGVjbGFyZWQgaW4gdGhlIFRlc3RBbGxUeXBlcyBtZXNzYWdlIHR5cGUuPC9zdW1tYXJ5PgotICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsKLSAgICAgIHB1YmxpYyBlbnVtIE5lc3RlZEVudW0gewotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkZPTyIpXSBGb28gPSAwLAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkJBUiIpXSBCYXIgPSAxLAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkJBWiIpXSBCYXogPSAyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgSW50ZW50aW9uYWxseSBuZWdhdGl2ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJORUciKV0gTmVnID0gLTEsCi0gICAgICB9Ci0KLSAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTmVzdGVkTWVzc2FnZSA6IHBiOjpJTWVzc2FnZTxOZXN0ZWRNZXNzYWdlPiB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZE1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8TmVzdGVkTWVzc2FnZT4oKCkgPT4gbmV3IE5lc3RlZE1lc3NhZ2UoKSk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8TmVzdGVkTWVzc2FnZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBOZXN0ZWRNZXNzYWdlKCkgewotICAgICAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgICAgICBwdWJsaWMgTmVzdGVkTWVzc2FnZShOZXN0ZWRNZXNzYWdlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICAgICAgYV8gPSBvdGhlci5hXzsKLSAgICAgICAgICBDb3JlY3Vyc2l2ZSA9IG90aGVyLmNvcmVjdXJzaXZlXyAhPSBudWxsID8gb3RoZXIuQ29yZWN1cnNpdmUuQ2xvbmUoKSA6IG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTmVzdGVkTWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IE5lc3RlZE1lc3NhZ2UodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImEiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOwotICAgICAgICBwcml2YXRlIGludCBhXzsKLSAgICAgICAgcHVibGljIGludCBBIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gYV87IH0KLSAgICAgICAgICBzZXQgewotICAgICAgICAgICAgYV8gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImNvcmVjdXJzaXZlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgQ29yZWN1cnNpdmVGaWVsZE51bWJlciA9IDI7Ci0gICAgICAgIHByaXZhdGUgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMgY29yZWN1cnNpdmVfOwotICAgICAgICBwdWJsaWMgZ2xvYmFsOjpDb25mb3JtYW5jZS5UZXN0QWxsVHlwZXMgQ29yZWN1cnNpdmUgewotICAgICAgICAgIGdldCB7IHJldHVybiBjb3JlY3Vyc2l2ZV87IH0KLSAgICAgICAgICBzZXQgewotICAgICAgICAgICAgY29yZWN1cnNpdmVfID0gdmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgTmVzdGVkTWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoTmVzdGVkTWVzc2FnZSBvdGhlcikgewotICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKEEgIT0gb3RoZXIuQSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlmICghb2JqZWN0LkVxdWFscyhDb3JlY3Vyc2l2ZSwgb3RoZXIuQ29yZWN1cnNpdmUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgICAgIGludCBoYXNoID0gMTsKLSAgICAgICAgICBpZiAoQSAhPSAwKSBoYXNoIF49IEEuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICBpZiAoY29yZWN1cnNpdmVfICE9IG51bGwpIGhhc2ggXj0gQ29yZWN1cnNpdmUuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgICAgIGlmIChBICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29yZWN1cnNpdmVfICE9IG51bGwpIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKENvcmVjdXJzaXZlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgIGlmIChBICE9IDApIHsKLSAgICAgICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEEpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoY29yZWN1cnNpdmVfICE9IG51bGwpIHsKLSAgICAgICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoQ29yZWN1cnNpdmUpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShOZXN0ZWRNZXNzYWdlIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG90aGVyLkEgIT0gMCkgewotICAgICAgICAgICAgQSA9IG90aGVyLkE7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChvdGhlci5jb3JlY3Vyc2l2ZV8gIT0gbnVsbCkgewotICAgICAgICAgICAgaWYgKGNvcmVjdXJzaXZlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIGNvcmVjdXJzaXZlXyA9IG5ldyBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29yZWN1cnNpdmUuTWVyZ2VGcm9tKG90aGVyLkNvcmVjdXJzaXZlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgICAgICB1aW50IHRhZzsKLSAgICAgICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgICAgQSA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgICAgICBpZiAoY29yZWN1cnNpdmVfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgIGNvcmVjdXJzaXZlXyA9IG5ldyBnbG9iYWw6OkNvbmZvcm1hbmNlLlRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShjb3JlY3Vyc2l2ZV8pOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLQotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGb3JlaWduTWVzc2FnZSA6IHBiOjpJTWVzc2FnZTxGb3JlaWduTWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEZvcmVpZ25NZXNzYWdlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEZvcmVpZ25NZXNzYWdlPigoKSA9PiBuZXcgRm9yZWlnbk1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxGb3JlaWduTWVzc2FnZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6Q29uZm9ybWFuY2UuQ29uZm9ybWFuY2VSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGb3JlaWduTWVzc2FnZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2Ugb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGNfID0gb3RoZXIuY187Ci0gICAgfQotCi0gICAgcHVibGljIEZvcmVpZ25NZXNzYWdlIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBGb3JlaWduTWVzc2FnZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IENGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBpbnQgY187Ci0gICAgcHVibGljIGludCBDIHsKLSAgICAgIGdldCB7IHJldHVybiBjXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgY18gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEZvcmVpZ25NZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRm9yZWlnbk1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKEMgIT0gb3RoZXIuQykgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChDICE9IDApIGhhc2ggXj0gQy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoQyAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoQyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKEMgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShDKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShGb3JlaWduTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkMgIT0gMCkgewotICAgICAgICBDID0gb3RoZXIuQzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIEMgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS5jc3Byb2ogYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS9Hb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmY3MjhkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi3vu788P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPFByb2plY3QgVG9vbHNWZXJzaW9uPSIxNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZEV4dGVuc2lvbnNQYXRoKVwkKE1TQnVpbGRUb29sc1ZlcnNpb24pXE1pY3Jvc29mdC5Db21tb24ucHJvcHMiIENvbmRpdGlvbj0iRXhpc3RzKCckKE1TQnVpbGRFeHRlbnNpb25zUGF0aClcJChNU0J1aWxkVG9vbHNWZXJzaW9uKVxNaWNyb3NvZnQuQ29tbW9uLnByb3BzJykiIC8+Ci0gIDxQcm9wZXJ0eUdyb3VwPgotICAgIDxDb25maWd1cmF0aW9uIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pJyA9PSAnJyAiPkRlYnVnPC9Db25maWd1cmF0aW9uPgotICAgIDxQbGF0Zm9ybSBDb25kaXRpb249IiAnJChQbGF0Zm9ybSknID09ICcnICI+QW55Q1BVPC9QbGF0Zm9ybT4KLSAgICA8UHJvamVjdEd1aWQ+ezA2MDdEMUI4LTgwRDYtNEIzNS05ODU3LTEyNjNDMUIzMkI5NH08L1Byb2plY3RHdWlkPgotICAgIDxPdXRwdXRUeXBlPkV4ZTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlPC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlPC9Bc3NlbWJseU5hbWU+Ci0gICAgPFRhcmdldEZyYW1ld29ya1ZlcnNpb24+djQuNTwvVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj4KLSAgICA8RmlsZUFsaWdubWVudD41MTI8L0ZpbGVBbGlnbm1lbnQ+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+Ci0gICAgPFBsYXRmb3JtVGFyZ2V0PkFueUNQVTwvUGxhdGZvcm1UYXJnZXQ+Ci0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+Ci0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWdcPC9PdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxQbGF0Zm9ybVRhcmdldD5BbnlDUFU8L1BsYXRmb3JtVGFyZ2V0PgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVw8L091dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0iIC8+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJTeXN0ZW0uQ29yZSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Ik1pY3Jvc29mdC5DU2hhcnAiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbmZvcm1hbmNlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb2dyYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvcGVydGllc1xBc3NlbWJseUluZm8uY3MiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxOb25lIEluY2x1ZGU9IkFwcC5jb25maWciIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxQcm9qZWN0UmVmZXJlbmNlIEluY2x1ZGU9Ii4uXEdvb2dsZS5Qcm90b2J1ZlxHb29nbGUuUHJvdG9idWYuY3Nwcm9qIj4KLSAgICAgIDxQcm9qZWN0Pns2OTA4YmRjZS1kOTI1LTQzZjMtOTRhYy1hNTMxZTZkZjI1OTF9PC9Qcm9qZWN0PgotICAgICAgPE5hbWU+R29vZ2xlLlByb3RvYnVmPC9OYW1lPgotICAgIDwvUHJvamVjdFJlZmVyZW5jZT4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkVG9vbHNQYXRoKVxNaWNyb3NvZnQuQ1NoYXJwLnRhcmdldHMiIC8+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KLSAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgotICA8L1RhcmdldD4KLSAgLS0+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UvUHJvZ3JhbS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlL1Byb2dyYW0uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5ODI3YzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UvUHJvZ3JhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDE0MiArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBDb25mb3JtYW5jZTsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBDb25mb3JtYW5jZSB0ZXN0cy4gVGhlIHRlc3QgcnVubmVyIHdpbGwgcHJvdmlkZSBKU09OIG9yIHByb3RvIGRhdGEgb24gc3RkaW4sCi0gICAgLy8vIGFuZCB0aGlzIHByb2dyYW0gd2lsbCBwcm9kdWNlIGl0cyBvdXRwdXQgb24gc3Rkb3V0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgY2xhc3MgUHJvZ3JhbQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBNYWluKHN0cmluZ1tdIGFyZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgd2F5IHdlIGdldCB0aGUgYmluYXJ5IHN0cmVhbXMgaW5zdGVhZCBvZiByZWFkZXJzL3dyaXRlcnMuCi0gICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgQmluYXJ5UmVhZGVyKENvbnNvbGUuT3BlblN0YW5kYXJkSW5wdXQoKSk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IEJpbmFyeVdyaXRlcihDb25zb2xlLk9wZW5TdGFuZGFyZE91dHB1dCgpKTsKLSAgICAgICAgICAgIHZhciB0eXBlUmVnaXN0cnkgPSBUeXBlUmVnaXN0cnkuRnJvbU1lc3NhZ2VzKFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yKTsKLQotICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChSdW5UZXN0KGlucHV0LCBvdXRwdXQsIHR5cGVSZWdpc3RyeSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQrKzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJSZWNlaXZlZCBFT0YgYWZ0ZXIgezB9IHRlc3RzIiwgY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYm9vbCBSdW5UZXN0KEJpbmFyeVJlYWRlciBpbnB1dCwgQmluYXJ5V3JpdGVyIG91dHB1dCwgVHlwZVJlZ2lzdHJ5IHR5cGVSZWdpc3RyeSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50PyBzaXplID0gUmVhZEludDMyKGlucHV0KTsKLSAgICAgICAgICAgIGlmIChzaXplID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnl0ZVtdIGlucHV0RGF0YSA9IGlucHV0LlJlYWRCeXRlcyhzaXplLlZhbHVlKTsKLSAgICAgICAgICAgIGlmIChpbnB1dERhdGEuTGVuZ3RoICE9IHNpemUuVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuZE9mU3RyZWFtRXhjZXB0aW9uKCJSZWFkICIgKyBpbnB1dERhdGEuTGVuZ3RoICsgIiBieXRlcyBvZiBkYXRhIHdoZW4gZXhwZWN0aW5nICIgKyBzaXplKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIENvbmZvcm1hbmNlUmVxdWVzdCByZXF1ZXN0ID0gQ29uZm9ybWFuY2VSZXF1ZXN0LlBhcnNlci5QYXJzZUZyb20oaW5wdXREYXRhKTsKLSAgICAgICAgICAgIENvbmZvcm1hbmNlUmVzcG9uc2UgcmVzcG9uc2UgPSBQZXJmb3JtUmVxdWVzdChyZXF1ZXN0LCB0eXBlUmVnaXN0cnkpOwotICAgICAgICAgICAgYnl0ZVtdIG91dHB1dERhdGEgPSByZXNwb25zZS5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlKG91dHB1dERhdGEuTGVuZ3RoKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZShvdXRwdXREYXRhKTsKLSAgICAgICAgICAgIC8vIFJlYWR5IGZvciBhbm90aGVyIHRlc3QuLi4KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgQ29uZm9ybWFuY2VSZXNwb25zZSBQZXJmb3JtUmVxdWVzdChDb25mb3JtYW5jZVJlcXVlc3QgcmVxdWVzdCwgVHlwZVJlZ2lzdHJ5IHR5cGVSZWdpc3RyeSkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlcXVlc3QuUGF5bG9hZENhc2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbmZvcm1hbmNlUmVxdWVzdC5QYXlsb2FkT25lb2ZDYXNlLkpzb25QYXlsb2FkOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBKc29uUGFyc2VyKG5ldyBKc29uUGFyc2VyLlNldHRpbmdzKDIwLCB0eXBlUmVnaXN0cnkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBwYXJzZXIuUGFyc2U8VGVzdEFsbFR5cGVzPihyZXF1ZXN0Lkpzb25QYXlsb2FkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbmZvcm1hbmNlUmVxdWVzdC5QYXlsb2FkT25lb2ZDYXNlLlByb3RvYnVmUGF5bG9hZDoKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlRnJvbShyZXF1ZXN0LlByb3RvYnVmUGF5bG9hZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBFeGNlcHRpb24oIlVuc3VwcG9ydGVkIHJlcXVlc3QgcGF5bG9hZDogIiArIHJlcXVlc3QuUGF5bG9hZENhc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbmZvcm1hbmNlUmVzcG9uc2UgeyBQYXJzZUVycm9yID0gZS5NZXNzYWdlIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW52YWxpZEpzb25FeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbmZvcm1hbmNlUmVzcG9uc2UgeyBQYXJzZUVycm9yID0gZS5NZXNzYWdlIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHJlcXVlc3QuUmVxdWVzdGVkT3V0cHV0Rm9ybWF0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBnbG9iYWw6OkNvbmZvcm1hbmNlLldpcmVGb3JtYXQuSnNvbjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBmb3JtYXR0ZXIgPSBuZXcgSnNvbkZvcm1hdHRlcihuZXcgSnNvbkZvcm1hdHRlci5TZXR0aW5ncyhmYWxzZSwgdHlwZVJlZ2lzdHJ5KSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbmZvcm1hbmNlUmVzcG9uc2UgeyBKc29uUGF5bG9hZCA9IGZvcm1hdHRlci5Gb3JtYXQobWVzc2FnZSkgfTsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBnbG9iYWw6OkNvbmZvcm1hbmNlLldpcmVGb3JtYXQuUHJvdG9idWY6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IENvbmZvcm1hbmNlUmVzcG9uc2UgeyBQcm90b2J1ZlBheWxvYWQgPSBtZXNzYWdlLlRvQnl0ZVN0cmluZygpIH07Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRXhjZXB0aW9uKCJVbnN1cHBvcnRlZCByZXF1ZXN0IG91dHB1dCBmb3JtYXQ6ICIgKyByZXF1ZXN0LlBheWxvYWRDYXNlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQ29uZm9ybWFuY2VSZXNwb25zZSB7IFNlcmlhbGl6ZUVycm9yID0gZS5NZXNzYWdlIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQ/IFJlYWRJbnQzMihCaW5hcnlSZWFkZXIgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IGlucHV0LlJlYWRCeXRlcyg0KTsKLSAgICAgICAgICAgIGlmIChieXRlcy5MZW5ndGggPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBDbGVhbmx5IHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtCi0gICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoYnl0ZXMuTGVuZ3RoICE9IDQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEVuZE9mU3RyZWFtRXhjZXB0aW9uKCJSZWFkICIgKyBieXRlcy5MZW5ndGggKyAiIGJ5dGVzIG9mIHNpemUgd2hlbiBleHBlY3RpbmcgNCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ5dGVzWzBdIHwgKGJ5dGVzWzFdIDw8IDgpIHwgKGJ5dGVzWzJdIDw8IDE2KSB8IChieXRlc1szXSA8PCAyNCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Db25mb3JtYW5jZS9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMjJlOTBmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci0KLS8vIEdlbmVyYWwgSW5mb3JtYXRpb24gYWJvdXQgYW4gYXNzZW1ibHkgaXMgY29udHJvbGxlZCB0aHJvdWdoIHRoZSBmb2xsb3dpbmcgCi0vLyBzZXQgb2YgYXR0cmlidXRlcy4gQ2hhbmdlIHRoZXNlIGF0dHJpYnV0ZSB2YWx1ZXMgdG8gbW9kaWZ5IHRoZSBpbmZvcm1hdGlvbgotLy8gYXNzb2NpYXRlZCB3aXRoIGFuIGFzc2VtYmx5LgotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJHb29nbGUuUHJvdG9idWYuQ29uZm9ybWFuY2UiKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiR29vZ2xlLlByb3RvYnVmLkNvbmZvcm1hbmNlIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTUiKV0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQotCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMy4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIzLjAuMC4wIildCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcC9Hb29nbGUuUHJvdG9idWYuSnNvbkR1bXAuY3Nwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuSnNvbkR1bXAvR29vZ2xlLlByb3RvYnVmLkpzb25EdW1wLmNzcHJvagpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjdhY2Y2Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcC9Hb29nbGUuUHJvdG9idWYuSnNvbkR1bXAuY3Nwcm9qCisrKyAvZGV2L251bGwKQEAgLTEsNjggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57RDcyODJFOTktMkRDMy00MDVCLTk0NkYtMTc3REIyRkQyQUUyfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+RXhlPC9PdXRwdXRUeXBlPgotICAgIDxBcHBEZXNpZ25lckZvbGRlcj5Qcm9wZXJ0aWVzPC9BcHBEZXNpZ25lckZvbGRlcj4KLSAgICA8Um9vdE5hbWVzcGFjZT5Hb29nbGUuUHJvdG9idWYuSnNvbkR1bXA8L1Jvb3ROYW1lc3BhY2U+Ci0gICAgPEFzc2VtYmx5TmFtZT5Hb29nbGUuUHJvdG9idWYuSnNvbkR1bXA8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KLSAgICA8L1RhcmdldEZyYW1ld29ya1Byb2ZpbGU+Ci0gIDwvUHJvcGVydHlHcm91cD4KLSAgPFByb3BlcnR5R3JvdXAgQ29uZGl0aW9uPSIgJyQoQ29uZmlndXJhdGlvbil8JChQbGF0Zm9ybSknID09ICdEZWJ1Z3xBbnlDUFUnICI+Ci0gICAgPERlYnVnU3ltYm9scz50cnVlPC9EZWJ1Z1N5bWJvbHM+Ci0gICAgPERlYnVnVHlwZT5mdWxsPC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPmZhbHNlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cRGVidWc8L091dHB1dFBhdGg+Ci0gICAgPEludGVybWVkaWF0ZU91dHB1dFBhdGg+b2JqXERlYnVnXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZXxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlPC9PdXRwdXRQYXRoPgotICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxSZWxlYXNlXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUHJvZ3JhbS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cR29vZ2xlLlByb3RvYnVmXEdvb2dsZS5Qcm90b2J1Zi5jc3Byb2oiPgotICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+Ci0gICAgICA8TmFtZT5Hb29nbGUuUHJvdG9idWY8L05hbWU+Ci0gICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Tm9uZSBJbmNsdWRlPSJhcHAuY29uZmlnIiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEltcG9ydCBQcm9qZWN0PSIkKE1TQnVpbGRUb29sc1BhdGgpXE1pY3Jvc29mdC5DU2hhcnAudGFyZ2V0cyIgLz4KLSAgPCEtLSBUbyBtb2RpZnkgeW91ciBidWlsZCBwcm9jZXNzLCBhZGQgeW91ciB0YXNrIGluc2lkZSBvbmUgb2YgdGhlIHRhcmdldHMgYmVsb3cgYW5kIHVuY29tbWVudCBpdC4gCi0gICAgICAgT3RoZXIgc2ltaWxhciBleHRlbnNpb24gcG9pbnRzIGV4aXN0LCBzZWUgTWljcm9zb2Z0LkNvbW1vbi50YXJnZXRzLgotICA8VGFyZ2V0IE5hbWU9IkJlZm9yZUJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIDxUYXJnZXQgTmFtZT0iQWZ0ZXJCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICAtLT4KLTwvUHJvamVjdD4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcC9Qcm9ncmFtLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuSnNvbkR1bXAvUHJvZ3JhbS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZThhNjA3My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcC9Qcm9ncmFtLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlByb3RvRHVtcAotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gU21hbGwgdXRpbGl0eSB0byBsb2FkIGEgYmluYXJ5IG1lc3NhZ2UgYW5kIGR1bXAgaXQgaW4gSlNPTiBmb3JtYXQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBjbGFzcyBQcm9ncmFtCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyBpbnQgTWFpbihzdHJpbmdbXSBhcmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYXJncy5MZW5ndGggIT0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb25zb2xlLkVycm9yLldyaXRlTGluZSgiVXNhZ2U6IEdvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcCA8ZGVzY3JpcHRvciB0eXBlIG5hbWU+IDxpbnB1dCBkYXRhPiIpOwotICAgICAgICAgICAgICAgIENvbnNvbGUuRXJyb3IuV3JpdGVMaW5lKCJUaGUgZGVzY3JpcHRvciB0eXBlIG5hbWUgaXMgdGhlIGZ1bGx5LXF1YWxpZmllZCBtZXNzYWdlIG5hbWUsIik7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoImluY2x1ZGluZyBhc3NlbWJseSBlLmcuIFByb2plY3ROYW1lc3BhY2UuTWVzc2FnZSxDb21wYW55LlByb2plY3QiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFR5cGUgdHlwZSA9IFR5cGUuR2V0VHlwZShhcmdzWzBdKTsKLSAgICAgICAgICAgIGlmICh0eXBlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIlVuYWJsZSB0byBsb2FkIHR5cGUgezB9LiIsIGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCF0eXBlb2YoSU1lc3NhZ2UpLklzQXNzaWduYWJsZUZyb20odHlwZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29uc29sZS5FcnJvci5Xcml0ZUxpbmUoIlR5cGUgezB9IGRvZXNuJ3QgaW1wbGVtZW50IElNZXNzYWdlLiIsIGFyZ3NbMF0pOwotICAgICAgICAgICAgICAgIHJldHVybiAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IChJTWVzc2FnZSkgQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHR5cGUpOwotICAgICAgICAgICAgdXNpbmcgKHZhciBpbnB1dCA9IEZpbGUuT3BlblJlYWQoYXJnc1sxXSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5NZXJnZUZyb20oaW5wdXQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ29uc29sZS5Xcml0ZUxpbmUobWVzc2FnZSk7Ci0gICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLkpzb25EdW1wL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYTI5ZDJkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLkpzb25EdW1wL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTkgKzAsMCBAQAotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLQotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJQcm90b0R1bXAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiUHJvdG9EdW1wIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTUiKV0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQotCi1bYXNzZW1ibHk6IEFzc2VtYmx5VmVyc2lvbigiMy4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUZpbGVWZXJzaW9uKCIzLjAuMC4wIildCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcC9hcHAuY29uZmlnIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuSnNvbkR1bXAvYXBwLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEyNzhhNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5Kc29uRHVtcC9hcHAuY29uZmlnCisrKyAvZGV2L251bGwKQEAgLTEsMyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJ1dGYtOCI/PgotPGNvbmZpZ3VyYXRpb24+Ci08c3RhcnR1cD48c3VwcG9ydGVkUnVudGltZSB2ZXJzaW9uPSJ2NC4wIiBza3U9Ii5ORVRGcmFtZXdvcmssVmVyc2lvbj12NC41Ii8+PC9zdGFydHVwPjwvY29uZmlndXJhdGlvbj4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvQnl0ZVN0cmluZ1Rlc3QuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0J5dGVTdHJpbmdUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTM1Yjc4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvQnl0ZVN0cmluZ1Rlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzEgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBOVW5pdC5GcmFtZXdvcms7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICBwdWJsaWMgY2xhc3MgQnl0ZVN0cmluZ1Rlc3QKLSAgICB7Ci0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBFcXVhbGl0eSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEJ5dGVTdHJpbmcgYjEgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMpOwotICAgICAgICAgICAgQnl0ZVN0cmluZyBiMiA9IEJ5dGVTdHJpbmcuQ29weUZyb20oMSwgMiwgMyk7Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGIzID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCA0KTsKLSAgICAgICAgICAgIEJ5dGVTdHJpbmcgYjQgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMsIDQpOwotICAgICAgICAgICAgRXF1YWxpdHlUZXN0ZXIuQXNzZXJ0RXF1YWxpdHkoYjEsIGIxKTsKLSAgICAgICAgICAgIEVxdWFsaXR5VGVzdGVyLkFzc2VydEVxdWFsaXR5KGIxLCBiMik7Ci0gICAgICAgICAgICBFcXVhbGl0eVRlc3Rlci5Bc3NlcnRJbmVxdWFsaXR5KGIxLCBiMyk7Ci0gICAgICAgICAgICBFcXVhbGl0eVRlc3Rlci5Bc3NlcnRJbmVxdWFsaXR5KGIxLCBiNCk7Ci0gICAgICAgICAgICBFcXVhbGl0eVRlc3Rlci5Bc3NlcnRJbmVxdWFsaXR5KGIxLCBudWxsKTsKLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE3MTggLy8gRGVsaWJlcmF0ZWx5IGNhbGxpbmcgPT0oYjEsIGIxKSBhbmQgIT0oYjEsIGIxKQotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShiMSA9PSBiMSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGIxID09IGIyKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGIxID09IGIzKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGIxID09IGI0KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGIxID09IG51bGwpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZSgoQnl0ZVN0cmluZykgbnVsbCA9PSBudWxsKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGIxICE9IGIxKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGIxICE9IGIyKTsKLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE3MTgKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoYjEgIT0gYjMpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShiMSAhPSBiNCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGIxICE9IG51bGwpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoKEJ5dGVTdHJpbmcpIG51bGwgIT0gbnVsbCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRW1wdHlCeXRlU3RyaW5nSGFzWmVyb1NpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgQnl0ZVN0cmluZy5FbXB0eS5MZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlGcm9tU3RyaW5nV2l0aEV4cGxpY2l0RW5jb2RpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGJzID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgiQUIiLCBFbmNvZGluZy5Vbmljb2RlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCBicy5MZW5ndGgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDY1LCBic1swXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgYnNbMV0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDY2LCBic1syXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgYnNbM10pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElzRW1wdHlXaGVuRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCIiKS5Jc0VtcHR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJc0VtcHR5V2hlbk5vdEVtcHR5KCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIlgiKS5Jc0VtcHR5KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDb3B5RnJvbUJ5dGVBcnJheUNvcGllc0NvbnRlbnRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVsxXTsKLSAgICAgICAgICAgIGRhdGFbMF0gPSAxMDsKLSAgICAgICAgICAgIEJ5dGVTdHJpbmcgYnMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKGRhdGEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwLCBic1swXSk7Ci0gICAgICAgICAgICBkYXRhWzBdID0gNTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgYnNbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvQnl0ZUFycmF5Q29waWVzQ29udGVudHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGJzID0gQnl0ZVN0cmluZy5Db3B5RnJvbVV0ZjgoIkhlbGxvIik7Ci0gICAgICAgICAgICBieXRlW10gZGF0YSA9IGJzLlRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKGJ5dGUpJ0gnLCBkYXRhWzBdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoYnl0ZSknSCcsIGJzWzBdKTsKLSAgICAgICAgICAgIGRhdGFbMF0gPSAwOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGRhdGFbMF0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKChieXRlKSdIJywgYnNbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlGcm9tVXRmOFVzZXNVdGY4KCkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZVN0cmluZyBicyA9IEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCJcdTIwYWMiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBicy5MZW5ndGgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4ZTIsIGJzWzBdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDgyLCBic1sxXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHhhYywgYnNbMl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlGcm9tUG9ydGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBkYXRhID0gbmV3IGJ5dGVbXSB7MCwgMSwgMiwgMywgNCwgNSwgNn07Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGJzID0gQnl0ZVN0cmluZy5Db3B5RnJvbShkYXRhLCAyLCAzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBicy5MZW5ndGgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGJzWzBdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBic1sxXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdVdGY4KCkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZVN0cmluZyBicyA9IEJ5dGVTdHJpbmcuQ29weUZyb21VdGY4KCJcdTIwYWMiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiXHUyMGFjIiwgYnMuVG9TdHJpbmdVdGY4KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nV2l0aEV4cGxpY2l0RW5jb2RpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGJzID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgiXHUyMGFjIiwgRW5jb2RpbmcuVW5pY29kZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlx1MjBhYyIsIGJzLlRvU3RyaW5nKEVuY29kaW5nLlVuaWNvZGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBGcm9tQmFzZTY0X1dpdGhUZXh0KCkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGRhdGEgPSBuZXcgYnl0ZVtdIHswLCAxLCAyLCAzLCA0LCA1LCA2fTsKLSAgICAgICAgICAgIHN0cmluZyBiYXNlNjQgPSBDb252ZXJ0LlRvQmFzZTY0U3RyaW5nKGRhdGEpOwotICAgICAgICAgICAgQnl0ZVN0cmluZyBicyA9IEJ5dGVTdHJpbmcuRnJvbUJhc2U2NChiYXNlNjQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGEsIGJzLlRvQnl0ZUFycmF5KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZyb21CYXNlNjRfRW1wdHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBPcHRpbWl6YXRpb24gd2hpY2ggYWxzbyBmaXhlcyBpc3N1ZSA2MS4KLSAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKEJ5dGVTdHJpbmcuRW1wdHksIEJ5dGVTdHJpbmcuRnJvbUJhc2U2NCgiIikpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvQ29kZWRJbnB1dFN0cmVhbUV4dGVuc2lvbnMuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvZGVkSW5wdXRTdHJlYW1FeHRlbnNpb25zLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyM2FmMjg4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvQ29kZWRJbnB1dFN0cmVhbUV4dGVuc2lvbnMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBOVW5pdC5GcmFtZXdvcms7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbUV4dGVuc2lvbnMKLSAgICB7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBBc3NlcnROZXh0VGFnKHRoaXMgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgdWludCBleHBlY3RlZFRhZykKLSAgICAgICAgewotICAgICAgICAgICAgdWludCB0YWcgPSBpbnB1dC5SZWFkVGFnKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRUYWcsIHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIFQgUmVhZE1lc3NhZ2U8VD4odGhpcyBDb2RlZElucHV0U3RyZWFtIHN0cmVhbSwgTWVzc2FnZVBhcnNlcjxUPiBwYXJzZXIpCi0gICAgICAgICAgICB3aGVyZSBUIDogSU1lc3NhZ2U8VD4KLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBwYXJzZXIuQ3JlYXRlVGVtcGxhdGUoKTsKLSAgICAgICAgICAgIHN0cmVhbS5SZWFkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db2RlZElucHV0U3RyZWFtVGVzdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvQ29kZWRJbnB1dFN0cmVhbVRlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2MjhlY2MuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db2RlZElucHV0U3RyZWFtVGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDU5OCArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvczsKLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIHB1YmxpYyBjbGFzcyBDb2RlZElucHV0U3RyZWFtVGVzdAotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSGVscGVyIHRvIGNvbnN0cnVjdCBhIGJ5dGUgYXJyYXkgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKLSAgICAgICAgLy8vIGFjdHVhbGx5IGludHMgc28gdGhhdCBJIGNhbiB1c2UgaGV4IG5vdGF0aW9uIGFuZCBub3QgZ2V0IHN0dXBpZCBlcnJvcnMKLSAgICAgICAgLy8vIGFib3V0IHByZWNpc2lvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIEJ5dGVzKHBhcmFtcyBpbnRbXSBieXRlc0FzSW50cykKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMuTGVuZ3RoXTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNBc0ludHMuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNBc0ludHNbaV07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIFJlYWRSYXdWYXJpbnQzMigpIGFuZCBSZWFkUmF3VmFyaW50NjQoKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydFJlYWRWYXJpbnQoYnl0ZVtdIGRhdGEsIHVsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZGF0YSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKHVpbnQpIHZhbHVlLCBpbnB1dC5SZWFkUmF3VmFyaW50MzIoKSk7Ci0KLSAgICAgICAgICAgIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZGF0YSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGlucHV0LlJlYWRSYXdWYXJpbnQ2NCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuSXNBdEVuZCk7Ci0KLSAgICAgICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCi0gICAgICAgICAgICBmb3IgKGludCBidWZmZXJTaXplID0gMTsgYnVmZmVyU2l6ZSA8PSAxNjsgYnVmZmVyU2l6ZSAqPSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0obmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBidWZmZXJTaXplKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCh1aW50KSB2YWx1ZSwgaW5wdXQuUmVhZFJhd1ZhcmludDMyKCkpOwotCi0gICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJ1ZmZlclNpemUpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGlucHV0LlJlYWRSYXdWYXJpbnQ2NCgpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUcnkgcmVhZGluZyBkaXJlY3RseSBmcm9tIGEgTWVtb3J5U3RyZWFtLiBXZSB3YW50IHRvIHZlcmlmeSB0aGF0IGl0Ci0gICAgICAgICAgICAvLyBkb2Vzbid0IHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbnB1dCwgc28gd3JpdGUgYW4gZXh0cmEgYnl0ZSAtIHRoaXMKLSAgICAgICAgICAgIC8vIGxldHMgdXMgdGVzdCB0aGUgcG9zaXRpb24gYXQgdGhlIGVuZC4KLSAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICBtZW1vcnlTdHJlYW0uV3JpdGUoZGF0YSwgMCwgZGF0YS5MZW5ndGgpOwotICAgICAgICAgICAgbWVtb3J5U3RyZWFtLldyaXRlQnl0ZSgwKTsKLSAgICAgICAgICAgIG1lbW9yeVN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKHVpbnQpIHZhbHVlLCBDb2RlZElucHV0U3RyZWFtLlJlYWRSYXdWYXJpbnQzMihtZW1vcnlTdHJlYW0pKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLkxlbmd0aCwgbWVtb3J5U3RyZWFtLlBvc2l0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgUmVhZFJhd1ZhcmludDMyKCkgYW5kIFJlYWRSYXdWYXJpbnQ2NCgpIGFuZAotICAgICAgICAvLy8gZXhwZWN0cyB0aGVtIHRvIGZhaWwgd2l0aCBhbiBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gd2hvc2UKLSAgICAgICAgLy8vIGRlc2NyaXB0aW9uIG1hdGNoZXMgdGhlIGdpdmVuIG9uZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRSZWFkVmFyaW50RmFpbHVyZShJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZXhwZWN0ZWQsIGJ5dGVbXSBkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZGF0YSk7Ci0gICAgICAgICAgICB2YXIgZXhjZXB0aW9uID0gQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IGlucHV0LlJlYWRSYXdWYXJpbnQzMigpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZC5NZXNzYWdlLCBleGNlcHRpb24uTWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZGF0YSk7Ci0gICAgICAgICAgICBleGNlcHRpb24gPSBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gaW5wdXQuUmVhZFJhd1ZhcmludDY0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLk1lc3NhZ2UsIGV4Y2VwdGlvbi5NZXNzYWdlKTsKLQotICAgICAgICAgICAgLy8gTWFrZSBzdXJlIHdlIGdldCB0aGUgc2FtZSBlcnJvciB3aGVuIHJlYWRpbmcgZGlyZWN0bHkgZnJvbSBhIFN0cmVhbS4KLSAgICAgICAgICAgIGV4Y2VwdGlvbiA9IEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBDb2RlZElucHV0U3RyZWFtLlJlYWRSYXdWYXJpbnQzMihuZXcgTWVtb3J5U3RyZWFtKGRhdGEpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQuTWVzc2FnZSwgZXhjZXB0aW9uLk1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRWYXJpbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRSZWFkVmFyaW50KEJ5dGVzKDB4MDApLCAwKTsKLSAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnQoQnl0ZXMoMHgwMSksIDEpOwotICAgICAgICAgICAgQXNzZXJ0UmVhZFZhcmludChCeXRlcygweDdmKSwgMTI3KTsKLSAgICAgICAgICAgIC8vIDE0ODgyCi0gICAgICAgICAgICBBc3NlcnRSZWFkVmFyaW50KEJ5dGVzKDB4YTIsIDB4NzQpLCAoMHgyMiA8PCAwKSB8ICgweDc0IDw8IDcpKTsKLSAgICAgICAgICAgIC8vIDI5NjE0ODg4MzAKLSAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnQoQnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwYkwgPDwgMjgpKTsKLQotICAgICAgICAgICAgLy8gNjQtYml0Ci0gICAgICAgICAgICAvLyA3MjU2NDU2MTI2Ci0gICAgICAgICAgICBBc3NlcnRSZWFkVmFyaW50KEJ5dGVzKDB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MWIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MWJMIDw8IDI4KSk7Ci0gICAgICAgICAgICAvLyA0MTI1NjIwMjU4MDcxODMzNgotICAgICAgICAgICAgQXNzZXJ0UmVhZFZhcmludChCeXRlcygweDgwLCAweGU2LCAweGViLCAweDljLCAweGMzLCAweGM5LCAweGE0LCAweDQ5KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDQzTCA8PCAyOCkgfCAoMHg0OUwgPDwgMzUpIHwgKDB4MjRMIDw8IDQyKSB8ICgweDQ5TCA8PCA0OSkpOwotICAgICAgICAgICAgLy8gMTE5NjQzNzgzMzA5Nzg3MzUxMzEKLSAgICAgICAgICAgIEFzc2VydFJlYWRWYXJpbnQoQnl0ZXMoMHg5YiwgMHhhOCwgMHhmOSwgMHhjMiwgMHhiYiwgMHhkNiwgMHg4MCwgMHg4NSwgMHhhNiwgMHgwMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzYlVMIDw8IDI4KSB8ICgweDU2VUwgPDwgMzUpIHwgKDB4MDBVTCA8PCA0MikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNVVMIDw8IDQ5KSB8ICgweDI2VUwgPDwgNTYpIHwgKDB4MDFVTCA8PCA2MykpOwotCi0gICAgICAgICAgICAvLyBGYWlsdXJlcwotICAgICAgICAgICAgQXNzZXJ0UmVhZFZhcmludEZhaWx1cmUoCi0gICAgICAgICAgICAgICAgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLk1hbGZvcm1lZFZhcmludCgpLAotICAgICAgICAgICAgICAgIEJ5dGVzKDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCi0gICAgICAgICAgICAgICAgICAgICAgMHgwMCkpOwotICAgICAgICAgICAgQXNzZXJ0UmVhZFZhcmludEZhaWx1cmUoCi0gICAgICAgICAgICAgICAgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlRydW5jYXRlZE1lc3NhZ2UoKSwKLSAgICAgICAgICAgICAgICBCeXRlcygweDgwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIFJlYWRSYXdMaXR0bGVFbmRpYW4zMigpIGFuZCBjaGVja3MKLSAgICAgICAgLy8vIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZVtdIGRhdGEsIHVpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShkYXRhKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh2YWx1ZSwgaW5wdXQuUmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5Jc0F0RW5kKTsKLQotICAgICAgICAgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICAgICAgICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGlucHV0LlJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyBSZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSBhbmQgY2hlY2tzCi0gICAgICAgIC8vLyB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0UmVhZExpdHRsZUVuZGlhbjY0KGJ5dGVbXSBkYXRhLCB1bG9uZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKGRhdGEpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHZhbHVlLCBpbnB1dC5SZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOwotCi0gICAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgICAgICAgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh2YWx1ZSwgaW5wdXQuUmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuSXNBdEVuZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZExpdHRsZUVuZGlhbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFJlYWRMaXR0bGVFbmRpYW4zMihCeXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyKSwgMHgxMjM0NTY3OCk7Ci0gICAgICAgICAgICBBc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoQnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksIDB4OWFiY2RlZjApOwotCi0gICAgICAgICAgICBBc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoQnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHgxMjM0NTY3ODlhYmNkZWYwTCk7Ci0gICAgICAgICAgICBBc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoCi0gICAgICAgICAgICAgICAgQnl0ZXMoMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksIDB4OWFiY2RlZjAxMjM0NTY3OFVMKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBEZWNvZGVaaWdaYWczMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzMyKDApKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigxKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigyKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTIsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnMzIoMykpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4M0ZGRkZGRkYsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnMzIoMHg3RkZGRkZGRSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHVuY2hlY2tlZCgoaW50KSAweEMwMDAwMDAwKSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigweDdGRkZGRkZGKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHg3RkZGRkZGRiwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMigweEZGRkZGRkZFKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodW5jaGVja2VkKChpbnQpIDB4ODAwMDAwMDApLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzMyKDB4RkZGRkZGRkYpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBEZWNvZGVaaWdaYWc2NCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KDApKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NCgxKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NCgyKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTIsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMykpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MDAwMDAwMDAzRkZGRkZGRkwsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZFTCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHVuY2hlY2tlZCgobG9uZykgMHhGRkZGRkZGRkMwMDAwMDAwTCksIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZGTCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MDAwMDAwMDA3RkZGRkZGRkwsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMEZGRkZGRkZFTCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHVuY2hlY2tlZCgobG9uZykgMHhGRkZGRkZGRjgwMDAwMDAwTCksIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMEZGRkZGRkZGTCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4N0ZGRkZGRkZGRkZGRkZGRkwsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkZGRkZGRkZFTCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHVuY2hlY2tlZCgobG9uZykgMHg4MDAwMDAwMDAwMDAwMDAwTCksIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkZGRkZGRkZGTCkpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZFdob2xlTWVzc2FnZV9WYXJ5aW5nQmxvY2tTaXplcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpOwotCi0gICAgICAgICAgICBieXRlW10gcmF3Qnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwocmF3Qnl0ZXMuTGVuZ3RoLCBtZXNzYWdlLkNhbGN1bGF0ZVNpemUoKSk7Ci0gICAgICAgICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlRnJvbShyYXdCeXRlcyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZSwgbWVzc2FnZTIpOwotCi0gICAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgICAgICAgICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDwgMjU2OyBibG9ja1NpemUgKj0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VGcm9tKG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0ocmF3Qnl0ZXMsIGJsb2NrU2l6ZSkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBtZXNzYWdlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgICAgICAgICAKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlYWRIdWdlQmxvYigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGEgMU1CIGJsb2IuCi0gICAgICAgICAgICBieXRlW10gYmxvYiA9IG5ldyBieXRlWzEgPDwgMjBdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9iLkxlbmd0aDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJsb2JbaV0gPSAoYnl0ZSkgaTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTWFrZSBhIG1lc3NhZ2UgY29udGFpbmluZyBpdC4KLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcyB7IFNpbmdsZUJ5dGVzID0gQnl0ZVN0cmluZy5Db3B5RnJvbShibG9iKSB9OwotCi0gICAgICAgICAgICAvLyBTZXJpYWxpemUgYW5kIHBhcnNlIGl0LiAgTWFrZSBzdXJlIHRvIHBhcnNlIGZyb20gYW4gSW5wdXRTdHJlYW0sIG5vdAotICAgICAgICAgICAgLy8gZGlyZWN0bHkgZnJvbSBhIEJ5dGVTdHJpbmcsIHNvIHRoYXQgQ29kZWRJbnB1dFN0cmVhbSB1c2VzIGJ1ZmZlcmVkCi0gICAgICAgICAgICAvLyByZWFkaW5nLgotICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUZyb20obWVzc2FnZS5Ub0J5dGVTdHJpbmcoKSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBtZXNzYWdlMik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVhZE1hbGljaW91c2x5TGFyZ2VCbG9iKCkKLSAgICAgICAgewotICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKG1zKTsKLQotICAgICAgICAgICAgdWludCB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VmFyaW50MzIodGFnKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDMyKDB4N0ZGRkZGRkYpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3Qnl0ZXMobmV3IGJ5dGVbMzJdKTsgLy8gUGFkIHdpdGggYSBmZXcgcmFuZG9tIGJ5dGVzLgotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICBtcy5Qb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShtcyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodGFnLCBpbnB1dC5SZWFkVGFnKCkpOwotCi0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gaW5wdXQuUmVhZEJ5dGVzKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlIE1ha2VSZWN1cnNpdmVNZXNzYWdlKGludCBkZXB0aCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRlcHRoID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0UmVjdXJzaXZlTWVzc2FnZSB7IEkgPSA1IH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUZXN0UmVjdXJzaXZlTWVzc2FnZSB7IEEgPSBNYWtlUmVjdXJzaXZlTWVzc2FnZShkZXB0aCAtIDEpIH07Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBBc3NlcnRNZXNzYWdlRGVwdGgoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgbWVzc2FnZSwgaW50IGRlcHRoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG1lc3NhZ2UuQSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIG1lc3NhZ2UuSSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChtZXNzYWdlLkEpOwotICAgICAgICAgICAgICAgIEFzc2VydE1lc3NhZ2VEZXB0aChtZXNzYWdlLkEsIGRlcHRoIC0gMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTWFsaWNpb3VzUmVjdXJzaW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZVN0cmluZyBkYXRhNjQgPSBNYWtlUmVjdXJzaXZlTWVzc2FnZSg2NCkuVG9CeXRlU3RyaW5nKCk7Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGE2NSA9IE1ha2VSZWN1cnNpdmVNZXNzYWdlKDY1KS5Ub0J5dGVTdHJpbmcoKTsKLQotICAgICAgICAgICAgQXNzZXJ0TWVzc2FnZURlcHRoKFRlc3RSZWN1cnNpdmVNZXNzYWdlLlBhcnNlci5QYXJzZUZyb20oZGF0YTY0KSwgNjQpOwotCi0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UuUGFyc2VyLlBhcnNlRnJvbShkYXRhNjUpKTsKLQotICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlV2l0aExpbWl0cyhuZXcgTWVtb3J5U3RyZWFtKGRhdGE2NC5Ub0J5dGVBcnJheSgpKSwgMTAwMDAwMCwgNjMpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IFRlc3RSZWN1cnNpdmVNZXNzYWdlLlBhcnNlci5QYXJzZUZyb20oaW5wdXQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTaXplTGltaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIYXZlIHRvIHVzZSBhIFN0cmVhbSByYXRoZXIgdGhhbiBCeXRlU3RyaW5nLkNyZWF0ZUNvZGVkSW5wdXQgYXMgU2l6ZUxpbWl0IGRvZXNuJ3QKLSAgICAgICAgICAgIC8vIGFwcGx5IHRvIHRoZSBsYXR0ZXIgY2FzZS4KLSAgICAgICAgICAgIE1lbW9yeVN0cmVhbSBtcyA9IG5ldyBNZW1vcnlTdHJlYW0oU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpLlRvQnl0ZUFycmF5KCkpOwotICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlV2l0aExpbWl0cyhtcywgMTYsIDEwMCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUZyb20oaW5wdXQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRlc3RzIHRoYXQgaWYgd2UgcmVhZCBhbiBzdHJpbmcgdGhhdCBjb250YWlucyBpbnZhbGlkIFVURi04LCBubyBleGNlcHRpb24KLSAgICAgICAgLy8vIGlzIHRocm93bi4gIEluc3RlYWQsIHRoZSBpbnZhbGlkIGJ5dGVzIGFyZSByZXBsYWNlZCB3aXRoIHRoZSBVbmljb2RlCi0gICAgICAgIC8vLyAicmVwbGFjZW1lbnQgY2hhcmFjdGVyIiBVK0ZGRkQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkSW52YWxpZFV0ZjgoKQotICAgICAgICB7Ci0gICAgICAgICAgICBNZW1vcnlTdHJlYW0gbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0obXMpOwotCi0gICAgICAgICAgICB1aW50IHRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdWYXJpbnQzMih0YWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VmFyaW50MzIoMSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVtdIHsweDgwfSk7Ci0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIG1zLlBvc2l0aW9uID0gMDsKLQotICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKG1zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHRhZywgaW5wdXQuUmVhZFRhZygpKTsKLSAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCdcdWZmZmQnLCB0ZXh0WzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgc3RyZWFtIHdoaWNoIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGl0IHJlYWRzIGF0IGEgdGltZS4KLSAgICAgICAgLy8vIFdlIHVzZSB0aGlzIHRvIG1ha2Ugc3VyZSB0aGF0IENvZGVkSW5wdXRTdHJlYW0gZG9lc24ndCBzY3JldyB1cCB3aGVuCi0gICAgICAgIC8vLyByZWFkaW5nIGluIHNtYWxsIGJsb2Nrcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzZWFsZWQgY2xhc3MgU21hbGxCbG9ja0lucHV0U3RyZWFtIDogTWVtb3J5U3RyZWFtCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGJsb2NrU2l6ZTsKLQotICAgICAgICAgICAgcHVibGljIFNtYWxsQmxvY2tJbnB1dFN0cmVhbShieXRlW10gZGF0YSwgaW50IGJsb2NrU2l6ZSkKLSAgICAgICAgICAgICAgICA6IGJhc2UoZGF0YSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gYmFzZS5SZWFkKGJ1ZmZlciwgb2Zmc2V0LCBNYXRoLk1pbihjb3VudCwgYmxvY2tTaXplKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdE5lZ2F0aXZlRW51bSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IHsgMHhGRSwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHhGRiwgMHgwMSB9OwotICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoaW50KVNhbXBsZUVudW0uTmVnYXRpdmVWYWx1ZSwgaW5wdXQuUmVhZEVudW0oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy9Jc3N1ZSA3MToJQ29kZWRJbnB1dFN0cmVhbS5SZWFkQnl0ZXMgZ28gdG8gc2xvdyBwYXRoIHVubmVjZXNzYXJpbHkKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRlc3RTbG93UGF0aEF2b2lkYW5jZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgbXMgPSBuZXcgTWVtb3J5U3RyZWFtKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKG1zKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKEJ5dGVTdHJpbmcuQ29weUZyb20obmV3IGJ5dGVbMTAwXSkpOwotICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxMDBdKSk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0KLSAgICAgICAgICAgICAgICBtcy5Qb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKG1zLCBuZXcgYnl0ZVttcy5MZW5ndGggLyAyXSwgMCwgMCk7Ci0KLSAgICAgICAgICAgICAgICB1aW50IHRhZyA9IGlucHV0LlJlYWRUYWcoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgV2lyZUZvcm1hdC5HZXRUYWdGaWVsZE51bWJlcih0YWcpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAwLCBpbnB1dC5SZWFkQnl0ZXMoKS5MZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgdGFnID0gaW5wdXQuUmVhZFRhZygpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBXaXJlRm9ybWF0LkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDAsIGlucHV0LlJlYWRCeXRlcygpLkxlbmd0aCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVGFnMFRocm93cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKG5ldyBieXRlW10geyAwIH0pOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IGlucHV0LlJlYWRUYWcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2tpcEdyb3VwKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQ3JlYXRlIGFuIG91dHB1dCBzdHJlYW0gd2l0aCBhIGdyb3VwIGluOgotICAgICAgICAgICAgLy8gRmllbGQgMTogc3RyaW5nICJmaWVsZCAxIgotICAgICAgICAgICAgLy8gRmllbGQgMjogZ3JvdXAgY29udGFpbmluZzoKLSAgICAgICAgICAgIC8vICAgRmllbGQgMTogZml4ZWQgaW50MzIgdmFsdWUgMTAwCi0gICAgICAgICAgICAvLyAgIEZpZWxkIDI6IHN0cmluZyAiaWdub3JlIG1lIgotICAgICAgICAgICAgLy8gICBGaWVsZCAzOiBuZXN0ZWQgZ3JvdXAgY29udGFpbmluZwotICAgICAgICAgICAgLy8gICAgICBGaWVsZCAxOiBmaXhlZCBpbnQ2NCB2YWx1ZSAxMDAwCi0gICAgICAgICAgICAvLyBGaWVsZCAzOiBzdHJpbmcgImZpZWxkIDMiCi0gICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygiZmllbGQgMSIpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICAvLyBUaGUgb3V0ZXIgZ3JvdXAuLi4KLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXApOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMik7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyKDEwMCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMiwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKCJpZ25vcmUgbWUiKTsKLSAgICAgICAgICAgIC8vIFRoZSBuZXN0ZWQgZ3JvdXAuLi4KLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygzLCBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXApOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQ2NCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0KDEwMDApOwotICAgICAgICAgICAgLy8gTm90ZTogTm90IHN1cmUgdGhlIGZpZWxkIG51bWJlciBpcyByZWxldmFudCBmb3IgZW5kIGdyb3VwLi4uCi0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMywgV2lyZUZvcm1hdC5XaXJlVHlwZS5FbmRHcm91cCk7Ci0KLSAgICAgICAgICAgIC8vIEVuZCB0aGUgb3V0ZXIgZ3JvdXAKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkVuZEdyb3VwKTsKLQotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDMsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygiZmllbGQgMyIpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICBzdHJlYW0uUG9zaXRpb24gPSAwOwotCi0gICAgICAgICAgICAvLyBOb3cgYWN0IGxpa2UgYSBnZW5lcmF0ZWQgY2xpZW50Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFdpcmVGb3JtYXQuTWFrZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCksIGlucHV0LlJlYWRUYWcoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImZpZWxkIDEiLCBpbnB1dC5SZWFkU3RyaW5nKCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFdpcmVGb3JtYXQuTWFrZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXApLCBpbnB1dC5SZWFkVGFnKCkpOwotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOyAvLyBTaG91bGQgY29uc3VtZSB0aGUgd2hvbGUgZ3JvdXAsIGluY2x1ZGluZyB0aGUgbmVzdGVkIG9uZS4KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChXaXJlRm9ybWF0Lk1ha2VUYWcoMywgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpLCBpbnB1dC5SZWFkVGFnKCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJmaWVsZCAzIiwgaW5wdXQuUmVhZFN0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTa2lwR3JvdXBfV3JvbmdFbmRHcm91cFRhZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIENyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIHdpdGg6Ci0gICAgICAgICAgICAvLyBGaWVsZCAxOiBzdHJpbmcgImZpZWxkIDEiCi0gICAgICAgICAgICAvLyBTdGFydCBncm91cCAyCi0gICAgICAgICAgICAvLyAgIEZpZWxkIDM6IGZpeGVkIGludDMyCi0gICAgICAgICAgICAvLyBFbmQgZ3JvdXAgNCAoc2hvdWxkIGdpdmUgYW4gZXJyb3IpCi0gICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZygiZmllbGQgMSIpOwotCi0gICAgICAgICAgICAvLyBUaGUgb3V0ZXIgZ3JvdXAuLi4KLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXApOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDMsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMik7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyKDEwMCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoNCwgV2lyZUZvcm1hdC5XaXJlVHlwZS5FbmRHcm91cCk7Ci0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBhY3QgbGlrZSBhIGdlbmVyYXRlZCBjbGllbnQKLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV2lyZUZvcm1hdC5NYWtlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKSwgaW5wdXQuUmVhZFRhZygpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZmllbGQgMSIsIGlucHV0LlJlYWRTdHJpbmcoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV2lyZUZvcm1hdC5NYWtlVGFnKDIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuU3RhcnRHcm91cCksIGlucHV0LlJlYWRUYWcoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oaW5wdXQuU2tpcExhc3RGaWVsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUm9ndWVFbmRHcm91cFRhZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIElmIHdlIGhhdmUgYW4gZW5kLWdyb3VwIHRhZyB3aXRob3V0IGEgbGVhZGluZyBzdGFydC1ncm91cCB0YWcsIGdlbmVyYXRlZAotICAgICAgICAgICAgLy8gY29kZSB3aWxsIGp1c3QgY2FsbCBTa2lwTGFzdEZpZWxkLi4uIHNvIHRoYXQgc2hvdWxkIGZhaWwuCi0KLSAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5FbmRHcm91cCk7Ci0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV2lyZUZvcm1hdC5NYWtlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXApLCBpbnB1dC5SZWFkVGFnKCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KGlucHV0LlNraXBMYXN0RmllbGQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVuZE9mU3RyZWFtUmVhY2hlZFdoaWxlU2tpcHBpbmdHcm91cCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5TdGFydEdyb3VwKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXApOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRW5kR3JvdXApOwotCi0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIC8vIE5vdyBhY3QgbGlrZSBhIGdlbmVyYXRlZCBjbGllbnQKLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBpbnB1dC5SZWFkVGFnKCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oaW5wdXQuU2tpcExhc3RGaWVsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVjdXJzaW9uTGltaXRBcHBsaWVkV2hpbGVTa2lwcGluZ0dyb3VwKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgQ29kZWRJbnB1dFN0cmVhbS5EZWZhdWx0UmVjdXJzaW9uTGltaXQgKyAxOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuU3RhcnRHcm91cCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENvZGVkSW5wdXRTdHJlYW0uRGVmYXVsdFJlY3Vyc2lvbkxpbWl0ICsgMTsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLkVuZEdyb3VwKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsKLQotICAgICAgICAgICAgLy8gTm93IGFjdCBsaWtlIGEgZ2VuZXJhdGVkIGNsaWVudAotICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChXaXJlRm9ybWF0Lk1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5TdGFydEdyb3VwKSwgaW5wdXQuUmVhZFRhZygpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPihpbnB1dC5Ta2lwTGFzdEZpZWxkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDb25zdHJ1Y3Rpb25fSW52YWxpZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBuZXcgQ29kZWRJbnB1dFN0cmVhbSgoYnl0ZVtdKSBudWxsKSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbmV3IENvZGVkSW5wdXRTdHJlYW0obnVsbCwgMCwgMCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IG5ldyBDb2RlZElucHV0U3RyZWFtKChTdHJlYW0pIG51bGwpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uPigoKSA9PiBuZXcgQ29kZWRJbnB1dFN0cmVhbShuZXcgYnl0ZVsxMF0sIDEwMCwgMCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24+KCgpID0+IG5ldyBDb2RlZElucHV0U3RyZWFtKG5ldyBieXRlWzEwXSwgNSwgMTApKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDcmVhdGVXaXRoTGltaXRzX0ludmFsaWRMaW1pdHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24+KCgpID0+IENvZGVkSW5wdXRTdHJlYW0uQ3JlYXRlV2l0aExpbWl0cyhzdHJlYW0sIDAsIDEpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uPigoKSA9PiBDb2RlZElucHV0U3RyZWFtLkNyZWF0ZVdpdGhMaW1pdHMoc3RyZWFtLCAxLCAwKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZV9EaXNwb3Nlc1VuZGVybHlpbmdTdHJlYW0oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZW1vcnlTdHJlYW0uQ2FuUmVhZCk7Ci0gICAgICAgICAgICB1c2luZyAodmFyIGNpcyA9IG5ldyBDb2RlZElucHV0U3RyZWFtKG1lbW9yeVN0cmVhbSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZW1vcnlTdHJlYW0uQ2FuUmVhZCk7IC8vIERpc3Bvc2VkCi0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZV9XaXRoTGVhdmVPcGVuKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVtb3J5U3RyZWFtLkNhblJlYWQpOwotICAgICAgICAgICAgdXNpbmcgKHZhciBjaXMgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShtZW1vcnlTdHJlYW0sIHRydWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZW1vcnlTdHJlYW0uQ2FuUmVhZCk7IC8vIFdlIGxlZnQgdGhlIHN0cmVhbSBvcGVuCi0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db2RlZE91dHB1dFN0cmVhbVRlc3QuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNiY2IxNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDQxOSArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvczsKLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIHB1YmxpYyBjbGFzcyBDb2RlZE91dHB1dFN0cmVhbVRlc3QKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyB0aGUgZ2l2ZW4gdmFsdWUgdXNpbmcgV3JpdGVSYXdWYXJpbnQzMigpIGFuZCBXcml0ZVJhd1ZhcmludDY0KCkgYW5kCi0gICAgICAgIC8vLyBjaGVja3MgdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIGJ5dGVzCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZVtdIGRhdGEsIHVsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBPbmx5IGRvIDMyLWJpdCB3cml0ZSBpZiB0aGUgdmFsdWUgZml0cyBpbiAzMiBiaXRzLgotICAgICAgICAgICAgaWYgKCh2YWx1ZSA+PiAzMikgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZW1vcnlTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShyYXdPdXRwdXQpOwotICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDMyKCh1aW50KSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGEsIHJhd091dHB1dC5Ub0FycmF5KCkpOwotICAgICAgICAgICAgICAgIC8vIEFsc28gdHJ5IGNvbXB1dGluZyBzaXplLgotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLkxlbmd0aCwgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgdmFsdWUpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1lbW9yeVN0cmVhbSByYXdPdXRwdXQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd091dHB1dCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VmFyaW50NjQodmFsdWUpOwotICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLCByYXdPdXRwdXQuVG9BcnJheSgpKTsKLQotICAgICAgICAgICAgICAgIC8vIEFsc28gdHJ5IGNvbXB1dGluZyBzaXplLgotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLkxlbmd0aCwgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVJhd1ZhcmludDY0U2l6ZSh2YWx1ZSkpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBUcnkgZGlmZmVyZW50IGJ1ZmZlciBzaXplcy4KLSAgICAgICAgICAgIGZvciAoaW50IGJ1ZmZlclNpemUgPSAxOyBidWZmZXJTaXplIDw9IDE2OyBidWZmZXJTaXplICo9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gT25seSBkbyAzMi1iaXQgd3JpdGUgaWYgdGhlIHZhbHVlIGZpdHMgaW4gMzIgYml0cy4KLSAgICAgICAgICAgICAgICBpZiAoKHZhbHVlID4+IDMyKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0KLSAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBDb2RlZE91dHB1dFN0cmVhbShyYXdPdXRwdXQsIGJ1ZmZlclNpemUpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdWYXJpbnQzMigodWludCkgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRhdGEsIHJhd091dHB1dC5Ub0FycmF5KCkpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd091dHB1dCwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLCByYXdPdXRwdXQuVG9BcnJheSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUZXN0cyBXcml0ZVJhd1ZhcmludDMyKCkgYW5kIFdyaXRlUmF3VmFyaW50NjQoKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVWYXJpbnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweDAwfSwgMCk7Ci0gICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweDAxfSwgMSk7Ci0gICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweDdmfSwgMTI3KTsKLSAgICAgICAgICAgIC8vIDE0ODgyCi0gICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweGEyLCAweDc0fSwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KSk7Ci0gICAgICAgICAgICAvLyAyOTYxNDg4ODMwCi0gICAgICAgICAgICBBc3NlcnRXcml0ZVZhcmludChuZXcgYnl0ZVtdIHsweGJlLCAweGY3LCAweDkyLCAweDg0LCAweDBifSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKDB4MGJMIDw8IDI4KSk7Ci0KLSAgICAgICAgICAgIC8vIDY0LWJpdAotICAgICAgICAgICAgLy8gNzI1NjQ1NjEyNgotICAgICAgICAgICAgQXNzZXJ0V3JpdGVWYXJpbnQobmV3IGJ5dGVbXSB7MHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYn0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDFiTCA8PCAyOCkpOwotICAgICAgICAgICAgLy8gNDEyNTYyMDI1ODA3MTgzMzYKLSAgICAgICAgICAgIEFzc2VydFdyaXRlVmFyaW50KAotICAgICAgICAgICAgICAgIG5ldyBieXRlW10gezB4ODAsIDB4ZTYsIDB4ZWIsIDB4OWMsIDB4YzMsIDB4YzksIDB4YTQsIDB4NDl9LAotICAgICAgICAgICAgICAgICgweDAwIDw8IDApIHwgKDB4NjYgPDwgNykgfCAoMHg2YiA8PCAxNCkgfCAoMHgxYyA8PCAyMSkgfAotICAgICAgICAgICAgICAgICgweDQzVUwgPDwgMjgpIHwgKDB4NDlMIDw8IDM1KSB8ICgweDI0VUwgPDwgNDIpIHwgKDB4NDlVTCA8PCA0OSkpOwotICAgICAgICAgICAgLy8gMTE5NjQzNzgzMzA5Nzg3MzUxMzEKLSAgICAgICAgICAgIEFzc2VydFdyaXRlVmFyaW50KAotICAgICAgICAgICAgICAgIG5ldyBieXRlW10gezB4OWIsIDB4YTgsIDB4ZjksIDB4YzIsIDB4YmIsIDB4ZDYsIDB4ODAsIDB4ODUsIDB4YTYsIDB4MDF9LAotICAgICAgICAgICAgICAgIHVuY2hlY2tlZCgodWxvbmcpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgoMHgxYiA8PCAwKSB8ICgweDI4IDw8IDcpIHwgKDB4NzkgPDwgMTQpIHwgKDB4NDIgPDwgMjEpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgweDNiTCA8PCAyOCkgfCAoMHg1NkwgPDwgMzUpIHwgKDB4MDBMIDw8IDQyKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwNUwgPDwgNDkpIHwgKDB4MjZMIDw8IDU2KSB8ICgweDAxTCA8PCA2MykpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIFdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgY2hlY2tzCi0gICAgICAgIC8vLyB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlW10gZGF0YSwgdWludCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShyYXdPdXRwdXQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0YSwgcmF3T3V0cHV0LlRvQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgYnVmZmVyIHNpemVzLgotICAgICAgICAgICAgZm9yIChpbnQgYnVmZmVyU2l6ZSA9IDE7IGJ1ZmZlclNpemUgPD0gMTY7IGJ1ZmZlclNpemUgKj0gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByYXdPdXRwdXQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd091dHB1dCwgYnVmZmVyU2l6ZSk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOwotICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRhLCByYXdPdXRwdXQuVG9BcnJheSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgV3JpdGVSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MKLSAgICAgICAgLy8vIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KGJ5dGVbXSBkYXRhLCB1bG9uZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShyYXdPdXRwdXQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3TGl0dGxlRW5kaWFuNjQodmFsdWUpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0YSwgcmF3T3V0cHV0LlRvQXJyYXkoKSk7Ci0KLSAgICAgICAgICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCi0gICAgICAgICAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ocmF3T3V0cHV0LCBibG9ja1NpemUpOwotICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd0xpdHRsZUVuZGlhbjY0KHZhbHVlKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZGF0YSwgcmF3T3V0cHV0LlRvQXJyYXkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUZXN0cyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlTGl0dGxlRW5kaWFuKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihuZXcgYnl0ZVtdIHsweDc4LCAweDU2LCAweDM0LCAweDEyfSwgMHgxMjM0NTY3OCk7Ci0gICAgICAgICAgICBBc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyKG5ldyBieXRlW10gezB4ZjAsIDB4ZGUsIDB4YmMsIDB4OWF9LCAweDlhYmNkZWYwKTsKLQotICAgICAgICAgICAgQXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW42NCgKLSAgICAgICAgICAgICAgICBuZXcgYnl0ZVtdIHsweGYwLCAweGRlLCAweGJjLCAweDlhLCAweDc4LCAweDU2LCAweDM0LCAweDEyfSwKLSAgICAgICAgICAgICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsKLSAgICAgICAgICAgIEFzc2VydFdyaXRlTGl0dGxlRW5kaWFuNjQoCi0gICAgICAgICAgICAgICAgbmV3IGJ5dGVbXSB7MHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhkZSwgMHhiYywgMHg5YX0sCi0gICAgICAgICAgICAgICAgMHg5YWJjZGVmMDEyMzQ1Njc4VUwpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlV2hvbGVNZXNzYWdlX1ZhcnlpbmdCbG9ja1NpemVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSByYXdCeXRlcyA9IG1lc3NhZ2UuVG9CeXRlQXJyYXkoKTsKLQotICAgICAgICAgICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICAgICAgICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8IDI1NjsgYmxvY2tTaXplICo9IDIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWVtb3J5U3RyZWFtIHJhd091dHB1dCA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ocmF3T3V0cHV0LCBibG9ja1NpemUpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuV3JpdGVUbyhvdXRwdXQpOwotICAgICAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChyYXdCeXRlcywgcmF3T3V0cHV0LlRvQXJyYXkoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBFbmNvZGVaaWdaYWczMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwdSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnMzIoMCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDF1LCBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigtMSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJ1LCBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigxKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoM3UsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKC0yKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHg3RkZGRkZGRXUsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKDB4M0ZGRkZGRkYpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDdGRkZGRkZGdSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnMzIodW5jaGVja2VkKChpbnQpIDB4QzAwMDAwMDApKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHhGRkZGRkZGRXUsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweEZGRkZGRkZGdSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnMzIodW5jaGVja2VkKChpbnQpIDB4ODAwMDAwMDApKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRW5jb2RlWmlnWmFnNjQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHUsIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KDApKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxdSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQoLTEpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgydSwgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQoMSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDN1LCBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCgtMikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MDAwMDAwMDA3RkZGRkZGRXVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KHVuY2hlY2tlZCgobG9uZykgMHgwMDAwMDAwMDNGRkZGRkZGVUwpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHgwMDAwMDAwMDdGRkZGRkZGdUwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQodW5jaGVja2VkKChsb25nKSAweEZGRkZGRkZGQzAwMDAwMDBVTCkpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgweDAwMDAwMDAwRkZGRkZGRkV1TCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCh1bmNoZWNrZWQoKGxvbmcpIDB4MDAwMDAwMDA3RkZGRkZGRlVMKSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4MDAwMDAwMDBGRkZGRkZGRnVMLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KHVuY2hlY2tlZCgobG9uZykgMHhGRkZGRkZGRjgwMDAwMDAwVUwpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMHhGRkZGRkZGRkZGRkZGRkZFTCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCh1bmNoZWNrZWQoKGxvbmcpIDB4N0ZGRkZGRkZGRkZGRkZGRlVMKSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDB4RkZGRkZGRkZGRkZGRkZGRkwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnNjQodW5jaGVja2VkKChsb25nKSAweDgwMDAwMDAwMDAwMDAwMDBVTCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZFRyaXBaaWdaYWczMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFNvbWUgZWFzaWVyLXRvLXZlcmlmeSByb3VuZC10cmlwIHRlc3RzLiAgVGhlIGlucHV0cyAob3RoZXIgdGhhbiAwLCAxLCAtMSkKLSAgICAgICAgICAgIC8vIHdlcmUgY2hvc2VuIHNlbWktcmFuZG9tbHkgdmlhIGtleWJvYXJkIGJhc2hpbmcuCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMihDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigwKSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIENvZGVkSW5wdXRTdHJlYW0uRGVjb2RlWmlnWmFnMzIoQ29kZWRPdXRwdXRTdHJlYW0uRW5jb2RlWmlnWmFnMzIoMSkpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMihDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigtMSkpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxNDkyNywgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMihDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigxNDkyNykpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMzYxMiwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWczMihDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWczMigtMzYxMikpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZFRyaXBaaWdaYWc2NCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KDApKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgQ29kZWRJbnB1dFN0cmVhbS5EZWNvZGVaaWdaYWc2NChDb2RlZE91dHB1dFN0cmVhbS5FbmNvZGVaaWdaYWc2NCgxKSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0xLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KC0xKSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE0OTI3LCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KDE0OTI3KSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKC0zNjEyLCBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KC0zNjEyKSkpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoODU2OTEyMzA0ODAxNDE2TCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KDg1NjkxMjMwNDgwMTQxNkwpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoLTc1MTIzOTA1NDM5NTcxMjU2TCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLkRlY29kZVppZ1phZzY0KENvZGVkT3V0cHV0U3RyZWFtLkVuY29kZVppZ1phZzY0KC03NTEyMzkwNTQzOTU3MTI1NkwpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdE5lZ2F0aXZlRW51bU5vVGFnKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKC0yKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAsIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBTYW1wbGVFbnVtLk5lZ2F0aXZlVmFsdWUpKTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTBdOwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgU2FtcGxlRW51bS5OZWdhdGl2ZVZhbHVlKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG91dHB1dC5TcGFjZUxlZnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGRS1GRi1GRi1GRi1GRi1GRi1GRi1GRi1GRi0wMSIsIEJpdENvbnZlcnRlci5Ub1N0cmluZyhieXRlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRlc3RDb2RlZElucHV0T3V0cHV0UG9zaXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICBieXRlW10gY29udGVudCA9IG5ldyBieXRlWzExMF07Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRlbnQuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgY29udGVudFtpXSA9IChieXRlKWk7Ci0KLSAgICAgICAgICAgIGJ5dGVbXSBjaGlsZCA9IG5ldyBieXRlWzEyMF07Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWVtb3J5U3RyZWFtIG1zID0gbmV3IE1lbW9yeVN0cmVhbShjaGlsZCk7Ci0gICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gY291dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShtcywgMjApOwotICAgICAgICAgICAgICAgIC8vIEZpZWxkIDExOiBudW1lcmljIHZhbHVlOiA1MDAKLSAgICAgICAgICAgICAgICBjb3V0LldyaXRlVGFnKDExLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGNvdXQuUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVJbnQzMig1MDApOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBjb3V0LlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAvL0ZpZWxkIDEyOiBsZW5ndGggZGVsaW1pdGVkIDEyMCBieXRlcwotICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVUYWcoMTIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgY291dC5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgY291dC5Xcml0ZUJ5dGVzKEJ5dGVTdHJpbmcuQ29weUZyb20oY29udGVudCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMTUsIGNvdXQuUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIC8vIEZpZWxkIDEzOiBmaXhlZCBudW1lcmljIHZhbHVlOiA1MDEKLSAgICAgICAgICAgICAgICBjb3V0LldyaXRlVGFnKDEzLCBXaXJlRm9ybWF0LldpcmVUeXBlLkZpeGVkMzIpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMTYsIGNvdXQuUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGNvdXQuV3JpdGVTRml4ZWQzMig1MDEpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMjAsIGNvdXQuUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIGNvdXQuRmx1c2goKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbMTMwXTsKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBjb3V0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgICAgICAvLyBGaWVsZCAxOiBudW1lcmljIHZhbHVlOiA1MDAKLSAgICAgICAgICAgICAgICBjb3V0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgY291dC5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgY291dC5Xcml0ZUludDMyKDUwMCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIGNvdXQuUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIC8vRmllbGQgMjogbGVuZ3RoIGRlbGltaXRlZCAxMjAgYnl0ZXMKLSAgICAgICAgICAgICAgICBjb3V0LldyaXRlVGFnKDIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNCwgY291dC5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgY291dC5Xcml0ZUJ5dGVzKEJ5dGVTdHJpbmcuQ29weUZyb20oY2hpbGQpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTI1LCBjb3V0LlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAvLyBGaWVsZCAzOiBmaXhlZCBudW1lcmljIHZhbHVlOiA1MDAKLSAgICAgICAgICAgICAgICBjb3V0LldyaXRlVGFnKDMsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyNiwgY291dC5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgY291dC5Xcml0ZVNGaXhlZDMyKDUwMSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEzMCwgY291dC5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgY291dC5GbHVzaCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gTm93IHRlc3QgSW5wdXQgc3RyZWFtOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gY2luID0gbmV3IENvZGVkSW5wdXRTdHJlYW0obmV3IE1lbW9yeVN0cmVhbShieXRlcyksIG5ldyBieXRlWzUwXSwgMCwgMCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGNpbi5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgLy8gRmllbGQgMToKLSAgICAgICAgICAgICAgICB1aW50IHRhZyA9IGNpbi5SZWFkVGFnKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHRhZyA+PiAzKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgY2luLlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTAwLCBjaW4uUmVhZEludDMyKCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBjaW4uUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIC8vRmllbGQgMjoKLSAgICAgICAgICAgICAgICB0YWcgPSBjaW4uUmVhZFRhZygpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB0YWcgPj4gMyk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDQsIGNpbi5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaW50IGNoaWxkbGVuID0gY2luLlJlYWRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIwLCBjaGlsZGxlbik7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIGNpbi5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgaW50IG9sZGxpbWl0ID0gY2luLlB1c2hMaW1pdCgoaW50KWNoaWxkbGVuKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNSwgY2luLlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAvLyBOb3cgd2UgYXJlIHJlYWRpbmcgY2hpbGQgbWVzc2FnZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgMTE6IG51bWVyaWMgdmFsdWU6IDUwMAotICAgICAgICAgICAgICAgICAgICB0YWcgPSBjaW4uUmVhZFRhZygpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTEsIHRhZyA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYsIGNpbi5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDAsIGNpbi5SZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg4LCBjaW4uUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICAvL0ZpZWxkIDEyOiBsZW5ndGggZGVsaW1pdGVkIDEyMCBieXRlcwotICAgICAgICAgICAgICAgICAgICB0YWcgPSBjaW4uUmVhZFRhZygpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIsIHRhZyA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDksIGNpbi5Qb3NpdGlvbik7Ci0gICAgICAgICAgICAgICAgICAgIEJ5dGVTdHJpbmcgYnN0ciA9IGNpbi5SZWFkQnl0ZXMoKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDExMCwgYnN0ci5MZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKGJ5dGUpIDEwOSwgYnN0clsxMDldKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyMCwgY2luLlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gRmllbGQgMTM6IGZpeGVkIG51bWVyaWMgdmFsdWU6IDUwMQotICAgICAgICAgICAgICAgICAgICB0YWcgPSBjaW4uUmVhZFRhZygpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTMsIHRhZyA+PiAzKTsKLSAgICAgICAgICAgICAgICAgICAgLy8gUk9LIC0gUHJldmlvdXNseSBicm9rZW4gaGVyZSwgdGhpcyByZXR1cm5lZCAxMjYgZmFpbGluZyB0byBhY2NvdW50IGZvciBidWZmZXJTaXplQWZ0ZXJMaW1pdAotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIxLCBjaW4uUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNTAxLCBjaW4uUmVhZFNGaXhlZDMyKCkpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTI1LCBjaW4uUG9zaXRpb24pOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNpbi5Jc0F0RW5kKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2luLlBvcExpbWl0KG9sZGxpbWl0KTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTI1LCBjaW4uUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIC8vIEZpZWxkIDM6IGZpeGVkIG51bWVyaWMgdmFsdWU6IDUwMQotICAgICAgICAgICAgICAgIHRhZyA9IGNpbi5SZWFkVGFnKCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDMsIHRhZyA+PiAzKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTI2LCBjaW4uUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1MDEsIGNpbi5SZWFkU0ZpeGVkMzIoKSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEzMCwgY2luLlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGNpbi5Jc0F0RW5kKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlX0Rpc3Bvc2VzVW5kZXJseWluZ1N0cmVhbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lbW9yeVN0cmVhbS5DYW5Xcml0ZSk7Ci0gICAgICAgICAgICB1c2luZyAodmFyIGNvcyA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShtZW1vcnlTdHJlYW0pKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvcy5Xcml0ZVJhd0J5dGUoMCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lbW9yeVN0cmVhbS5Qb3NpdGlvbik7IC8vIE5vdCBmbHVzaGVkIHlldAotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1lbW9yeVN0cmVhbS5Ub0FycmF5KCkuTGVuZ3RoKTsgLy8gRmx1c2hlZCBkYXRhIGZyb20gQ29kZWRPdXRwdXRTdHJlYW0gdG8gTWVtb3J5U3RyZWFtCi0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtZW1vcnlTdHJlYW0uQ2FuV3JpdGUpOyAvLyBEaXNwb3NlZAotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERpc3Bvc2VfV2l0aExlYXZlT3BlbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1lbW9yeVN0cmVhbS5DYW5Xcml0ZSk7Ci0gICAgICAgICAgICB1c2luZyAodmFyIGNvcyA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShtZW1vcnlTdHJlYW0sIHRydWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvcy5Xcml0ZVJhd0J5dGUoMCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lbW9yeVN0cmVhbS5Qb3NpdGlvbik7IC8vIE5vdCBmbHVzaGVkIHlldAotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1lbW9yeVN0cmVhbS5Qb3NpdGlvbik7IC8vIEZsdXNoZWQgZGF0YSBmcm9tIENvZGVkT3V0cHV0U3RyZWFtIHRvIE1lbW9yeVN0cmVhbQotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShtZW1vcnlTdHJlYW0uQ2FuV3JpdGUpOyAvLyBXZSBsZWZ0IHRoZSBzdHJlYW0gb3BlbgotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvQ29sbGVjdGlvbnMvTWFwRmllbGRUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db2xsZWN0aW9ucy9NYXBGaWVsZFRlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljODQ1OTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db2xsZWN0aW9ucy9NYXBGaWVsZFRlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1MzIgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvczsKLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKLXVzaW5nIFN5c3RlbS5MaW5xOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUZXN0cyBmb3IgTWFwRmllbGQgd2hpY2ggYXJlbid0IHJlbGlhbnQgb24gdGhlIGVuY29kZWQgZm9ybWF0IC0KLSAgICAvLy8gdGVzdHMgZm9yIHNlcmlhbGl6YXRpb24vZGVzZXJpYWxpemF0aW9uIGFyZSBwYXJ0IG9mIEdlbmVyYXRlZE1lc3NhZ2VUZXN0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIE1hcEZpZWxkVGVzdAotICAgIHsKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsb25lX0Nsb25lc01lc3NhZ2VzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgRm9yZWlnbk1lc3NhZ2UgeyBDID0gMjAgfTsKLSAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBGb3JlaWduTWVzc2FnZT4geyB7ICJ4IiwgbWVzc2FnZSB9IH07Ci0gICAgICAgICAgICB2YXIgY2xvbmUgPSBtYXAuQ2xvbmUoKTsKLSAgICAgICAgICAgIG1hcFsieCJdLkMgPSAzMDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyMCwgY2xvbmVbIngiXS5DKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBOdWxsVmFsdWVzUHJvaGliaXRlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRlc3ROdWxsVmFsdWVzPGludD8+KDApOwotICAgICAgICAgICAgVGVzdE51bGxWYWx1ZXMoIiIpOwotICAgICAgICAgICAgVGVzdE51bGxWYWx1ZXMobmV3IFRlc3RBbGxUeXBlcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBUZXN0TnVsbFZhbHVlczxUPihUIG5vbk51bGxWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxpbnQsIFQ+KCk7Ci0gICAgICAgICAgICB2YXIgbnVsbFZhbHVlID0gKFQpIChvYmplY3QpIG51bGw7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbWFwLkFkZCgwLCBudWxsVmFsdWUpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBtYXBbMF0gPSBudWxsVmFsdWUpOwotICAgICAgICAgICAgbWFwLkFkZCgxLCBub25OdWxsVmFsdWUpOwotICAgICAgICAgICAgbWFwWzFdID0gbm9uTnVsbFZhbHVlOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZF9Gb3JiaWRzTnVsbEtleXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgRm9yZWlnbk1lc3NhZ2U+KCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbWFwLkFkZChudWxsLCBuZXcgRm9yZWlnbk1lc3NhZ2UoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluZGV4ZXJfRm9yYmlkc051bGxLZXlzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIEZvcmVpZ25NZXNzYWdlPigpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IG1hcFtudWxsXSA9IG5ldyBGb3JlaWduTWVzc2FnZSgpKTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZFByZXNlcnZlc0luc2VydGlvbk9yZGVyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4oKTsKLSAgICAgICAgICAgIG1hcC5BZGQoImEiLCAidjEiKTsKLSAgICAgICAgICAgIG1hcC5BZGQoImIiLCAidjIiKTsKLSAgICAgICAgICAgIG1hcC5BZGQoImMiLCAidjMiKTsKLSAgICAgICAgICAgIG1hcC5SZW1vdmUoImIiKTsKLSAgICAgICAgICAgIG1hcC5BZGQoImQiLCAidjQiKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAiYSIsICJjIiwgImQiIH0sIG1hcC5LZXlzKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAidjEiLCAidjMiLCAidjQiIH0sIG1hcC5WYWx1ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVxdWFsaXR5SXNPcmRlckluc2Vuc2l0aXZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcDEgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBtYXAxLkFkZCgiYSIsICJ2MSIpOwotICAgICAgICAgICAgbWFwMS5BZGQoImIiLCAidjIiKTsKLQotICAgICAgICAgICAgdmFyIG1hcDIgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBtYXAyLkFkZCgiYiIsICJ2MiIpOwotICAgICAgICAgICAgbWFwMi5BZGQoImEiLCAidjEiKTsKLQotICAgICAgICAgICAgRXF1YWxpdHlUZXN0ZXIuQXNzZXJ0RXF1YWxpdHkobWFwMSwgbWFwMik7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRXF1YWxpdHlJc0tleVNlbnNpdGl2ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtYXAxID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgICAgICAgICAgbWFwMS5BZGQoImZpcnN0IGtleSIsICJ2MSIpOwotICAgICAgICAgICAgbWFwMS5BZGQoInNlY29uZCBrZXkiLCAidjIiKTsKLQotICAgICAgICAgICAgdmFyIG1hcDIgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBtYXAyLkFkZCgidGhpcmQga2V5IiwgInYxIik7Ci0gICAgICAgICAgICBtYXAyLkFkZCgiZm91cnRoIGtleSIsICJ2MiIpOwotCi0gICAgICAgICAgICBFcXVhbGl0eVRlc3Rlci5Bc3NlcnRJbmVxdWFsaXR5KG1hcDEsIG1hcDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVxdWFsaXR5X1NpbXBsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBFcXVhbGl0eVRlc3Rlci5Bc3NlcnRFcXVhbGl0eShtYXAsIG1hcCk7Ci0gICAgICAgICAgICBFcXVhbGl0eVRlc3Rlci5Bc3NlcnRJbmVxdWFsaXR5KG1hcCwgbnVsbCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtYXAuRXF1YWxzKG5ldyBvYmplY3QoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVxdWFsaXR5SXNWYWx1ZVNlbnNpdGl2ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IFdpdGhvdXQgc29tZSBjYXJlLCBpdCdzIGEgbGl0dGxlIGVhc2llciB0aGFuIG9uZSBtaWdodAotICAgICAgICAgICAgLy8gaG9wZSB0byBzZWUgaGFzaCBjb2xsaXNpb25zLCBidXQgb25seSBpbiBzb21lIGVudmlyb25tZW50cy4uLgotICAgICAgICAgICAgdmFyIG1hcDEgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBtYXAxLkFkZCgiYSIsICJmaXJzdCB2YWx1ZSIpOwotICAgICAgICAgICAgbWFwMS5BZGQoImIiLCAic2Vjb25kIHZhbHVlIik7Ci0KLSAgICAgICAgICAgIHZhciBtYXAyID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgICAgICAgICAgbWFwMi5BZGQoImEiLCAidGhpcmQgdmFsdWUiKTsKLSAgICAgICAgICAgIG1hcDIuQWRkKCJiIiwgImZvdXJ0aCB2YWx1ZSIpOwotCi0gICAgICAgICAgICBFcXVhbGl0eVRlc3Rlci5Bc3NlcnRJbmVxdWFsaXR5KG1hcDEsIG1hcDIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZF9EaWN0aW9uYXJ5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcDEgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeyAieCIsICJ5IiB9LAotICAgICAgICAgICAgICAgIHsgImEiLCAiYiIgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHZhciBtYXAyID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPgotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHsgImJlZm9yZSIsICIiIH0sCi0gICAgICAgICAgICAgICAgbWFwMSwKLSAgICAgICAgICAgICAgICB7ICJhZnRlciIsICIiIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeyAiYmVmb3JlIiwgIiIgfSwKLSAgICAgICAgICAgICAgICB7ICJ4IiwgInkiIH0sCi0gICAgICAgICAgICAgICAgeyAiYSIsICJiIiB9LAotICAgICAgICAgICAgICAgIHsgImFmdGVyIiwgIiIgfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgbWFwMik7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgImJlZm9yZSIsICJ4IiwgImEiLCAiYWZ0ZXIiIH0sIG1hcDIuS2V5cyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBHZW5lcmFsIElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4gYmVoYXZpb3IgdGVzdHMKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZF9LZXlBbHJlYWR5RXhpc3RzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4oKTsKLSAgICAgICAgICAgIG1hcC5BZGQoImZvbyIsICJiYXIiKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRFeGNlcHRpb24+KCgpID0+IG1hcC5BZGQoImZvbyIsICJiYXoiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkX1BhaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgICAgICAgICAgSUNvbGxlY3Rpb248S2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPj4gY29sbGVjdGlvbiA9IG1hcDsKLSAgICAgICAgICAgIGNvbGxlY3Rpb24uQWRkKE5ld0tleVZhbHVlUGFpcigieCIsICJ5IikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ5IiwgbWFwWyJ4Il0pOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudEV4Y2VwdGlvbj4oKCkgPT4gY29sbGVjdGlvbi5BZGQoTmV3S2V5VmFsdWVQYWlyKCJ4IiwgInoiKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENvbnRhaW5zX1BhaXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPiB7IHsgIngiLCAieSIgfSB9OwotICAgICAgICAgICAgSUNvbGxlY3Rpb248S2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPj4gY29sbGVjdGlvbiA9IG1hcDsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY29sbGVjdGlvbi5Db250YWlucyhOZXdLZXlWYWx1ZVBhaXIoIngiLCAieSIpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShjb2xsZWN0aW9uLkNvbnRhaW5zKE5ld0tleVZhbHVlUGFpcigieCIsICJ6IikpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGNvbGxlY3Rpb24uQ29udGFpbnMoTmV3S2V5VmFsdWVQYWlyKCJ6IiwgInkiKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZV9LZXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgICAgICAgICAgbWFwLkFkZCgiZm9vIiwgImJhciIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1hcC5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShtYXAuUmVtb3ZlKCJtaXNzaW5nIikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIG1hcC5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKG1hcC5SZW1vdmUoImZvbyIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtYXAuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IG1hcC5SZW1vdmUobnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZV9QYWlyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4oKTsKLSAgICAgICAgICAgIG1hcC5BZGQoImZvbyIsICJiYXIiKTsKLSAgICAgICAgICAgIElDb2xsZWN0aW9uPEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz4+IGNvbGxlY3Rpb24gPSBtYXA7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbWFwLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGNvbGxlY3Rpb24uUmVtb3ZlKE5ld0tleVZhbHVlUGFpcigid3Jvbmcga2V5IiwgImJhciIpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbWFwLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGNvbGxlY3Rpb24uUmVtb3ZlKE5ld0tleVZhbHVlUGFpcigiZm9vIiwgIndyb25nIHZhbHVlIikpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtYXAuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjb2xsZWN0aW9uLlJlbW92ZShOZXdLZXlWYWx1ZVBhaXIoImZvbyIsICJiYXIiKSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1hcC5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiBjb2xsZWN0aW9uLlJlbW92ZShuZXcgS2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPihudWxsLCAiIikpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG9fUGFpcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+KCk7Ci0gICAgICAgICAgICBtYXAuQWRkKCJmb28iLCAiYmFyIik7Ci0gICAgICAgICAgICBJQ29sbGVjdGlvbjxLZXlWYWx1ZVBhaXI8c3RyaW5nLCBzdHJpbmc+PiBjb2xsZWN0aW9uID0gbWFwOwotICAgICAgICAgICAgS2V5VmFsdWVQYWlyPHN0cmluZywgc3RyaW5nPltdIGFycmF5ID0gbmV3IEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz5bM107Ci0gICAgICAgICAgICBjb2xsZWN0aW9uLkNvcHlUbyhhcnJheSwgMSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoTmV3S2V5VmFsdWVQYWlyKCJmb28iLCAiYmFyIiksIGFycmF5WzFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IHsgeyAieCIsICJ5IiB9IH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgbWFwLkNvdW50KTsKLSAgICAgICAgICAgIG1hcC5DbGVhcigpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1hcC5Db3VudCk7Ci0gICAgICAgICAgICBtYXAuQWRkKCJ4IiwgInkiKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBtYXAuQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEluZGV4ZXJfR2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieSIsIG1hcFsieCJdKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8S2V5Tm90Rm91bmRFeGNlcHRpb24+KCgpID0+IHsgdmFyIGlnbm9yZWQgPSBtYXBbInoiXTsgfSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSW5kZXhlcl9TZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgICAgICAgICAgbWFwWyJ4Il0gPSAieSI7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInkiLCBtYXBbIngiXSk7Ci0gICAgICAgICAgICBtYXBbIngiXSA9ICJ6IjsgLy8gVGhpcyB3b24ndCB0aHJvdywgdW5saWtlIEFkZC4KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieiIsIG1hcFsieCJdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBHZXRFbnVtZXJhdG9yX05vbkdlbmVyaWMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRW51bWVyYWJsZSBtYXAgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IHsgeyAieCIsICJ5IiB9IH07Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgbmV3IEtleVZhbHVlUGFpcjxzdHJpbmcsIHN0cmluZz4oIngiLCAieSIpIH0sCi0gICAgICAgICAgICAgICAgbWFwLkNhc3Q8b2JqZWN0PigpLlRvTGlzdCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRlc3QgZm9yIHRoZSBleHBsaWNpdGx5LWltcGxlbWVudGVkIG5vbi1nZW5lcmljIElEaWN0aW9uYXJ5IGludGVyZmFjZQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSURpY3Rpb25hcnlfR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIHZhciBlbnVtZXJhdG9yID0gbWFwLkdldEVudW1lcmF0b3IoKTsKLQotICAgICAgICAgICAgLy8gQ29tbWVudGVkIGFzc2VydGlvbnMgc2hvdyBhbiBpZGVhbCBzaXR1YXRpb24gLSBpdCBsb29rcyBsaWtlCi0gICAgICAgICAgICAvLyB0aGUgTGlua2VkTGlzdCBlbnVtZXJhdG9yIGRvZXNuJ3QgdGhyb3cgd2hlbiB5b3UgYXNrIGZvciB0aGUgY3VycmVudCBlbnRyeQotICAgICAgICAgICAgLy8gYXQgYW4gaW5hcHByb3ByaWF0ZSB0aW1lOyBmaXhpbmcgdGhpcyB3b3VsZCBiZSBtb3JlIHdvcmsgdGhhbiBpdCdzIHdvcnRoLgotICAgICAgICAgICAgLy8gQXNzZXJ0LlRocm93czxJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uPigoKSA9PiBlbnVtZXJhdG9yLkN1cnJlbnQuR2V0SGFzaENvZGUoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGVudW1lcmF0b3IuTW92ZU5leHQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIngiLCBlbnVtZXJhdG9yLktleSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInkiLCBlbnVtZXJhdG9yLlZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRGljdGlvbmFyeUVudHJ5KCJ4IiwgInkiKSwgZW51bWVyYXRvci5DdXJyZW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRGljdGlvbmFyeUVudHJ5KCJ4IiwgInkiKSwgZW51bWVyYXRvci5FbnRyeSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShlbnVtZXJhdG9yLk1vdmVOZXh0KCkpOwotICAgICAgICAgICAgLy8gQXNzZXJ0LlRocm93czxJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uPigoKSA9PiBlbnVtZXJhdG9yLkN1cnJlbnQuR2V0SGFzaENvZGUoKSk7Ci0gICAgICAgICAgICBlbnVtZXJhdG9yLlJlc2V0KCk7Ci0gICAgICAgICAgICAvLyBBc3NlcnQuVGhyb3dzPEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24+KCgpID0+IGVudW1lcmF0b3IuQ3VycmVudC5HZXRIYXNoQ29kZSgpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieCIsIGVudW1lcmF0b3IuS2V5KTsgLy8gQXNzdW1lIHRoZSByZXN0IGFyZSBva2F5Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSURpY3Rpb25hcnlfQWRkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBtYXA7Ci0gICAgICAgICAgICBkaWN0aW9uYXJ5LkFkZCgiYSIsICJiIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImIiLCBtYXBbImEiXSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiBkaWN0aW9uYXJ5LkFkZCgiYSIsICJkdXBsaWNhdGUiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRDYXN0RXhjZXB0aW9uPigoKSA9PiBkaWN0aW9uYXJ5LkFkZChuZXcgb2JqZWN0KCksICJrZXkgaXMgYmFkIikpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkQ2FzdEV4Y2VwdGlvbj4oKCkgPT4gZGljdGlvbmFyeS5BZGQoInZhbHVlIGlzIGJhZCIsIG5ldyBvYmplY3QoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElEaWN0aW9uYXJ5X0NvbnRhaW5zKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBtYXA7Ci0KLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGRpY3Rpb25hcnkuQ29udGFpbnMoImEiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShkaWN0aW9uYXJ5LkNvbnRhaW5zKDUpKTsKLSAgICAgICAgICAgIC8vIFN1cnByaXNpbmcsIGJ1dCBJRGljdGlvbmFyeS5Db250YWlucyBpcyBvbmx5IGFib3V0IGtleXMuCi0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShkaWN0aW9uYXJ5LkNvbnRhaW5zKG5ldyBEaWN0aW9uYXJ5RW50cnkoIngiLCAieSIpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGRpY3Rpb25hcnkuQ29udGFpbnMoIngiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSURpY3Rpb25hcnlfUmVtb3ZlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBtYXA7Ci0gICAgICAgICAgICBkaWN0aW9uYXJ5LlJlbW92ZSgiYSIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIGRpY3Rpb25hcnkuQ291bnQpOwotICAgICAgICAgICAgZGljdGlvbmFyeS5SZW1vdmUoNSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZGljdGlvbmFyeS5Db3VudCk7Ci0gICAgICAgICAgICBkaWN0aW9uYXJ5LlJlbW92ZShuZXcgRGljdGlvbmFyeUVudHJ5KCJ4IiwgInkiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgZGljdGlvbmFyeS5Db3VudCk7Ci0gICAgICAgICAgICBkaWN0aW9uYXJ5LlJlbW92ZSgieCIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGRpY3Rpb25hcnkuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IGRpY3Rpb25hcnkuUmVtb3ZlKG51bGwpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJRGljdGlvbmFyeV9Db3B5VG8oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPiB7IHsgIngiLCAieSIgfSB9OwotICAgICAgICAgICAgSURpY3Rpb25hcnkgZGljdGlvbmFyeSA9IG1hcDsKLSAgICAgICAgICAgIHZhciBhcnJheSA9IG5ldyBEaWN0aW9uYXJ5RW50cnlbM107Ci0gICAgICAgICAgICBkaWN0aW9uYXJ5LkNvcHlUbyhhcnJheSwgMSk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgZGVmYXVsdChEaWN0aW9uYXJ5RW50cnkpLCBuZXcgRGljdGlvbmFyeUVudHJ5KCJ4IiwgInkiKSwgZGVmYXVsdChEaWN0aW9uYXJ5RW50cnkpIH0sCi0gICAgICAgICAgICAgICAgYXJyYXkpOwotICAgICAgICAgICAgdmFyIG9iamVjdEFycmF5ID0gbmV3IG9iamVjdFszXTsKLSAgICAgICAgICAgIGRpY3Rpb25hcnkuQ29weVRvKG9iamVjdEFycmF5LCAxKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3IG9iamVjdFtdIHsgbnVsbCwgbmV3IERpY3Rpb25hcnlFbnRyeSgieCIsICJ5IiksIG51bGwgfSwKLSAgICAgICAgICAgICAgICBvYmplY3RBcnJheSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSURpY3Rpb25hcnlfSXNGaXhlZFNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPiB7IHsgIngiLCAieSIgfSB9OwotICAgICAgICAgICAgSURpY3Rpb25hcnkgZGljdGlvbmFyeSA9IG1hcDsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGRpY3Rpb25hcnkuSXNGaXhlZFNpemUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElEaWN0aW9uYXJ5X0tleXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRGljdGlvbmFyeSBkaWN0aW9uYXJ5ID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPiB7IHsgIngiLCAieSIgfSB9OwotICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChuZXdbXSB7ICJ4IiB9LCBkaWN0aW9uYXJ5LktleXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElEaWN0aW9uYXJ5X1ZhbHVlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IHsgeyAieCIsICJ5IiB9IH07Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgInkiIH0sIGRpY3Rpb25hcnkuVmFsdWVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJRGljdGlvbmFyeV9Jc1N5bmNocm9uaXplZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IHsgeyAieCIsICJ5IiB9IH07Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShkaWN0aW9uYXJ5LklzU3luY2hyb25pemVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJRGljdGlvbmFyeV9TeW5jUm9vdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IHsgeyAieCIsICJ5IiB9IH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShkaWN0aW9uYXJ5LCBkaWN0aW9uYXJ5LlN5bmNSb290KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJRGljdGlvbmFyeV9JbmRleGVyX0dldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IHsgeyAieCIsICJ5IiB9IH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInkiLCBkaWN0aW9uYXJ5WyJ4Il0pOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChkaWN0aW9uYXJ5WyJhIl0pOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChkaWN0aW9uYXJ5WzVdKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBkaWN0aW9uYXJ5W251bGxdLkdldEhhc2hDb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElEaWN0aW9uYXJ5X0luZGV4ZXJfU2V0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSBtYXA7Ci0gICAgICAgICAgICBtYXBbImEiXSA9ICJiIjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiYiIsIG1hcFsiYSJdKTsKLSAgICAgICAgICAgIG1hcFsiYSJdID0gImMiOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJjIiwgbWFwWyJhIl0pOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkQ2FzdEV4Y2VwdGlvbj4oKCkgPT4gZGljdGlvbmFyeVs1XSA9ICJ4Iik7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRDYXN0RXhjZXB0aW9uPigoKSA9PiBkaWN0aW9uYXJ5WyJ4Il0gPSA1KTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBkaWN0aW9uYXJ5W251bGxdID0gInoiKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBkaWN0aW9uYXJ5WyJ4Il0gPSBudWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBLZXlzUmV0dXJuc0xpdmVWaWV3KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4oKTsKLSAgICAgICAgICAgIHZhciBrZXlzID0gbWFwLktleXM7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ldyBzdHJpbmdbMF0sIGtleXMpOwotICAgICAgICAgICAgbWFwWyJmb28iXSA9ICJiYXIiOwotICAgICAgICAgICAgbWFwWyJ4Il0gPSAieSI7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgImZvbyIsICJ4IiB9LCBrZXlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBWYWx1ZXNSZXR1cm5zTGl2ZVZpZXcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG1hcC5WYWx1ZXM7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ldyBzdHJpbmdbMF0sIHZhbHVlcyk7Ci0gICAgICAgICAgICBtYXBbImZvbyJdID0gImJhciI7Ci0gICAgICAgICAgICBtYXBbIngiXSA9ICJ5IjsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAiYmFyIiwgInkiIH0sIHZhbHVlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBKdXN0IHRlc3Qga2V5cyAtIHdlIGtub3cgdGhlIGltcGxlbWVudGF0aW9uIGlzIHRoZSBzYW1lIGZvciB2YWx1ZXMKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFZpZXdzQXJlUmVhZE9ubHkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgICAgICAgICAgdmFyIGtleXMgPSBtYXAuS2V5czsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoa2V5cy5Jc1JlYWRPbmx5KTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8Tm90U3VwcG9ydGVkRXhjZXB0aW9uPigoKSA9PiBrZXlzLkNsZWFyKCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxOb3RTdXBwb3J0ZWRFeGNlcHRpb24+KCgpID0+IGtleXMuUmVtb3ZlKCJhIikpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxOb3RTdXBwb3J0ZWRFeGNlcHRpb24+KCgpID0+IGtleXMuQWRkKCJhIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gSnVzdCB0ZXN0IGtleXMgLSB3ZSBrbm93IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgc2FtZSBmb3IgdmFsdWVzCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBWaWV3Q29weVRvKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJmb28iLCAiYmFyIiB9LCB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIHZhciBrZXlzID0gbWFwLktleXM7Ci0gICAgICAgICAgICB2YXIgYXJyYXkgPSBuZXcgc3RyaW5nWzRdOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudEV4Y2VwdGlvbj4oKCkgPT4ga2V5cy5Db3B5VG8oYXJyYXksIDMpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uPigoKSA9PiBrZXlzLkNvcHlUbyhhcnJheSwgLTEpKTsKLSAgICAgICAgICAgIGtleXMuQ29weVRvKGFycmF5LCAxKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyBudWxsLCAiZm9vIiwgIngiLCBudWxsIH0sIGFycmF5KTsKLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8gSnVzdCB0ZXN0IGtleXMgLSB3ZSBrbm93IHRoZSBpbXBsZW1lbnRhdGlvbiBpcyB0aGUgc2FtZSBmb3IgdmFsdWVzCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBOb25HZW5lcmljVmlld0NvcHlUbygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IG1hcCA9IG5ldyBNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4geyB7ICJmb28iLCAiYmFyIiB9LCB7ICJ4IiwgInkiIH0gfTsKLSAgICAgICAgICAgIElDb2xsZWN0aW9uIGtleXMgPSBtYXAuS2V5czsKLSAgICAgICAgICAgIC8vIE5vdGUgdGhlIHVzZSBvZiB0aGUgQXJyYXkgdHlwZSBoZXJlIHJhdGhlciB0aGFuIHN0cmluZ1tdCi0gICAgICAgICAgICBBcnJheSBhcnJheSA9IG5ldyBzdHJpbmdbNF07Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiBrZXlzLkNvcHlUbyhhcnJheSwgMykpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24+KCgpID0+IGtleXMuQ29weVRvKGFycmF5LCAtMSkpOwotICAgICAgICAgICAga2V5cy5Db3B5VG8oYXJyYXksIDEpOwotICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChuZXdbXSB7IG51bGwsICJmb28iLCAieCIsIG51bGwgfSwgYXJyYXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEtleXNDb250YWlucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgTWFwRmllbGQ8c3RyaW5nLCBzdHJpbmc+IHsgeyAiZm9vIiwgImJhciIgfSwgeyAieCIsICJ5IiB9IH07Ci0gICAgICAgICAgICB2YXIga2V5cyA9IG1hcC5LZXlzOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShrZXlzLkNvbnRhaW5zKCJmb28iKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShrZXlzLkNvbnRhaW5zKCJiYXIiKSk7IC8vIEl0J3MgYSB2YWx1ZSEKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGtleXMuQ29udGFpbnMoIjEiKSk7Ci0gICAgICAgICAgICAvLyBLZXlzIGNhbid0IGJlIG51bGwsIHNvIHdlIHNob3VsZCBwcmV2ZW50IGNvbnRhaW5zIGNoZWNrCi0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4ga2V5cy5Db250YWlucyhudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVmFsdWVzQ29udGFpbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPiB7IHsgImZvbyIsICJiYXIiIH0sIHsgIngiLCAieSIgfSB9OwotICAgICAgICAgICAgdmFyIHZhbHVlcyA9IG1hcC5WYWx1ZXM7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKHZhbHVlcy5Db250YWlucygiYmFyIikpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UodmFsdWVzLkNvbnRhaW5zKCJmb28iKSk7IC8vIEl0J3MgYSBrZXkhCi0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZSh2YWx1ZXMuQ29udGFpbnMoIjEiKSk7Ci0gICAgICAgICAgICAvLyBWYWx1ZXMgY2FuIGJlIG51bGwsIHNvIHRoaXMgbWFrZXMgc2Vuc2UKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKHZhbHVlcy5Db250YWlucyhudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdfU3RyaW5nVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IE1hcEZpZWxkPHN0cmluZywgc3RyaW5nPiB7IHsgImZvbyIsICJiYXIiIH0sIHsgIngiLCAieSIgfSB9OwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ7IFwiZm9vXCI6IFwiYmFyXCIsIFwieFwiOiBcInlcIiB9IiwgbWFwLlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX1Vuc3VwcG9ydGVkS2V5VHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtYXAgPSBuZXcgTWFwRmllbGQ8Ynl0ZSwgc3RyaW5nPiB7IHsgMTAsICJmb28iIH0gfTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRFeGNlcHRpb24+KCgpID0+IG1hcC5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IE5ld0tleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+KFRLZXkga2V5LCBUVmFsdWUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4oa2V5LCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvbGxlY3Rpb25zL1JlcGVhdGVkRmllbGRUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db2xsZWN0aW9ucy9SZXBlYXRlZEZpZWxkVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGVkNTRjZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvbGxlY3Rpb25zL1JlcGVhdGVkRmllbGRUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjYwICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzOwotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zCi17Ci0gICAgcHVibGljIGNsYXNzIFJlcGVhdGVkRmllbGRUZXN0Ci0gICAgewotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTnVsbFZhbHVlc1JlamVjdGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+KCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbGlzdC5BZGQoKHN0cmluZyludWxsKSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbGlzdC5BZGQoKElFbnVtZXJhYmxlPHN0cmluZz4pbnVsbCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IGxpc3QuQWRkKChSZXBlYXRlZEZpZWxkPHN0cmluZz4pbnVsbCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IGxpc3QuQ29udGFpbnMobnVsbCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IGxpc3QuSW5kZXhPZihudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkX1NpbmdsZUl0ZW0oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4oKTsKLSAgICAgICAgICAgIGxpc3QuQWRkKCJmb28iKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBsaXN0LkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZm9vIiwgbGlzdFswXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkX1NlcXVlbmNlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+KCk7Ci0gICAgICAgICAgICBsaXN0LkFkZChuZXdbXSB7ICJmb28iLCAiYmFyIiB9KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCBsaXN0LkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZm9vIiwgbGlzdFswXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImJhciIsIGxpc3RbMV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZF9SZXBlYXRlZEZpZWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgIm9yaWdpbmFsIiB9OwotICAgICAgICAgICAgbGlzdC5BZGQobmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPiB7ICJmb28iLCAiYmFyIiB9KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBsaXN0LkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgib3JpZ2luYWwiLCBsaXN0WzBdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZm9vIiwgbGlzdFsxXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImJhciIsIGxpc3RbMl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0X1ZhbGlkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiwgInNlY29uZCIsICJ0aGlyZCIgfTsKLSAgICAgICAgICAgIGxpc3QuUmVtb3ZlQXQoMSk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgImZpcnN0IiwgInRoaXJkIiB9LCBsaXN0KTsKLSAgICAgICAgICAgIC8vIEp1c3QgY2hlY2sgdGhhdCB0aGVzZSBkb24ndCB0aHJvdy4uLgotICAgICAgICAgICAgbGlzdC5SZW1vdmVBdChsaXN0LkNvdW50IC0gMSk7IC8vIE5vdyB0aGUgY291bnQgd2lsbCBiZSAxLi4uCi0gICAgICAgICAgICBsaXN0LlJlbW92ZUF0KDApOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIGxpc3QuQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlbW92ZUF0X0ludmFsaWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiwgInRoaXJkIiB9OwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24+KCgpID0+IGxpc3QuUmVtb3ZlQXQoLTEpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uPigoKSA9PiBsaXN0LlJlbW92ZUF0KDMpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnRfVmFsaWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgbGlzdC5JbnNlcnQoMSwgIm1pZGRsZSIpOwotICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChuZXdbXSB7ICJmaXJzdCIsICJtaWRkbGUiLCAic2Vjb25kIiB9LCBsaXN0KTsKLSAgICAgICAgICAgIGxpc3QuSW5zZXJ0KDMsICJlbmQiKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAiZmlyc3QiLCAibWlkZGxlIiwgInNlY29uZCIsICJlbmQiIH0sIGxpc3QpOwotICAgICAgICAgICAgbGlzdC5JbnNlcnQoMCwgInN0YXJ0Iik7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgInN0YXJ0IiwgImZpcnN0IiwgIm1pZGRsZSIsICJzZWNvbmQiLCAiZW5kIiB9LCBsaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJbnNlcnRfSW52YWxpZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPiB7ICJmaXJzdCIsICJzZWNvbmQiIH07Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbj4oKCkgPT4gbGlzdC5JbnNlcnQoLTEsICJmb28iKSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbj4oKCkgPT4gbGlzdC5JbnNlcnQoMywgImZvbyIpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBsaXN0Lkluc2VydCgwLCBudWxsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRXF1YWxzX1JlcGVhdGVkRmllbGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdC5FcXVhbHMoKFJlcGVhdGVkRmllbGQ8c3RyaW5nPikgbnVsbCkpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShsaXN0LkVxdWFscyhsaXN0KSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShsaXN0LkVxdWFscyhuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiwgInRoaXJkIiB9KSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShsaXN0LkVxdWFscyhuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiB9KSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxpc3QuRXF1YWxzKG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRXF1YWxzX09iamVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPiB7ICJmaXJzdCIsICJzZWNvbmQiIH07Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShsaXN0LkVxdWFscygob2JqZWN0KSBudWxsKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGxpc3QuRXF1YWxzKChvYmplY3QpIGxpc3QpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3QuRXF1YWxzKChvYmplY3QpIG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAidGhpcmQiIH0pKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3QuRXF1YWxzKChvYmplY3QpIG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiIH0pKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobGlzdC5FcXVhbHMoKG9iamVjdCkgbmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPiB7ICJmaXJzdCIsICJzZWNvbmQiIH0pKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGxpc3QuRXF1YWxzKG5ldyBvYmplY3QoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEdldEVudW1lcmF0b3JfR2VuZXJpY0ludGVyZmFjZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElFbnVtZXJhYmxlPHN0cmluZz4gbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgLy8gU2VsZWN0IGdldHMgcmlkIG9mIHRoZSBvcHRpbWl6YXRpb25zIGluIFRvTGlzdC4uLgotICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChuZXdbXSB7ICJmaXJzdCIsICJzZWNvbmQiIH0sIGxpc3QuU2VsZWN0KHggPT4geCkuVG9MaXN0KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEdldEVudW1lcmF0b3JfTm9uR2VuZXJpY0ludGVyZmFjZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElFbnVtZXJhYmxlIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiwgInNlY29uZCIgfTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAiZmlyc3QiLCAic2Vjb25kIiB9LCBsaXN0LkNhc3Q8b2JqZWN0PigpLlRvTGlzdCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgc3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgc3RyaW5nWzRdOwotICAgICAgICAgICAgbGlzdC5Db3B5VG8oc3RyaW5nQXJyYXksIDEpOwotICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChuZXdbXSB7IG51bGwsICJmaXJzdCIsICJzZWNvbmQiLCBudWxsIH0sIHN0cmluZ0FycmF5KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJbmRleGVyX0dldCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPiB7ICJmaXJzdCIsICJzZWNvbmQiIH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImZpcnN0IiwgbGlzdFswXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInNlY29uZCIsIGxpc3RbMV0pOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24+KCgpID0+IGxpc3RbLTFdLkdldEhhc2hDb2RlKCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24+KCgpID0+IGxpc3RbMl0uR2V0SGFzaENvZGUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSW5kZXhlcl9TZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgbGlzdFswXSA9ICJjaGFuZ2VkIjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiY2hhbmdlZCIsIGxpc3RbMF0pOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IGxpc3RbMF0gPSBudWxsKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uPigoKSA9PiBsaXN0Wy0xXSA9ICJiYWQiKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uPigoKSA9PiBsaXN0WzJdID0gImJhZCIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsb25lX1JldHVybnNNdXRhYmxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxpbnQ+IHsgMCB9OwotICAgICAgICAgICAgdmFyIGNsb25lID0gbGlzdC5DbG9uZSgpOwotICAgICAgICAgICAgY2xvbmVbMF0gPSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgdXNpbmcgKHZhciBlbnVtZXJhdG9yID0gbGlzdC5HZXRFbnVtZXJhdG9yKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShlbnVtZXJhdG9yLk1vdmVOZXh0KCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZmlyc3QiLCBlbnVtZXJhdG9yLkN1cnJlbnQpOwotICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInNlY29uZCIsIGVudW1lcmF0b3IuQ3VycmVudCk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UoZW51bWVyYXRvci5Nb3ZlTmV4dCgpKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShlbnVtZXJhdG9yLk1vdmVOZXh0KCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZEVudHJpZXNGcm9tX1BhY2tlZEludDMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdWludCBwYWNrZWRUYWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMTAsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICB2YXIgbGVuZ3RoID0gQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgxMCkKLSAgICAgICAgICAgICAgICArIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoOTk5KQotICAgICAgICAgICAgICAgICsgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZSgtMTAwMCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcocGFja2VkVGFnKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDMyKCh1aW50KSBsZW5ndGgpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoMTApOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoOTk5KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKC0xMDAwKTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsKLQotICAgICAgICAgICAgLy8gRGVsaWJlcmF0ZWx5ICJleHBlY3RpbmciIGEgbm9uLXBhY2tlZCB0YWcsIGJ1dCB3ZSBkZXRlY3QgdGhhdCB0aGUgZGF0YSBpcwotICAgICAgICAgICAgLy8gYWN0dWFsbHkgcGFja2VkLgotICAgICAgICAgICAgdWludCBub25QYWNrZWRUYWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMTAsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBpbnB1dC5Bc3NlcnROZXh0VGFnKHBhY2tlZFRhZyk7Ci0gICAgICAgICAgICBmaWVsZC5BZGRFbnRyaWVzRnJvbShpbnB1dCwgRmllbGRDb2RlYy5Gb3JJbnQzMihub25QYWNrZWRUYWcpKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAxMCwgOTk5LCAtMTAwMCB9LCBmaWVsZCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZEVudHJpZXNGcm9tX05vblBhY2tlZEludDMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdWludCBub25QYWNrZWRUYWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMTAsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcobm9uUGFja2VkVGFnKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKDEwKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyhub25QYWNrZWRUYWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoOTk5KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyhub25QYWNrZWRUYWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoLTEwMDApOyAvLyBKdXN0IGZvciB2YXJpZXR5Li4uCi0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIC8vIERlbGliZXJhdGVseSAiZXhwZWN0aW5nIiBhIHBhY2tlZCB0YWcsIGJ1dCB3ZSBkZXRlY3QgdGhhdCB0aGUgZGF0YSBpcwotICAgICAgICAgICAgLy8gYWN0dWFsbHkgbm90IHBhY2tlZC4KLSAgICAgICAgICAgIHVpbnQgcGFja2VkVGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDEwLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgUmVwZWF0ZWRGaWVsZDxpbnQ+KCk7Ci0gICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgaW5wdXQuQXNzZXJ0TmV4dFRhZyhub25QYWNrZWRUYWcpOwotICAgICAgICAgICAgZmllbGQuQWRkRW50cmllc0Zyb20oaW5wdXQsIEZpZWxkQ29kZWMuRm9ySW50MzIocGFja2VkVGFnKSk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgMTAsIDk5OSwgLTEwMDAgfSwgZmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5Jc0F0RW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBZGRFbnRyaWVzRnJvbV9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICB1aW50IHRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZygxMCwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh0YWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKCJGb28iKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh0YWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKCIiKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh0YWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKCJCYXIiKTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsKLQotICAgICAgICAgICAgdmFyIGZpZWxkID0gbmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPigpOwotICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIGlucHV0LkFzc2VydE5leHRUYWcodGFnKTsKLSAgICAgICAgICAgIGZpZWxkLkFkZEVudHJpZXNGcm9tKGlucHV0LCBGaWVsZENvZGVjLkZvclN0cmluZyh0YWcpKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAiRm9vIiwgIiIsICJCYXIiIH0sIGZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuSXNBdEVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkRW50cmllc0Zyb21fTWVzc2FnZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlMSA9IG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAyMDAwIH07Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZTIgPSBuZXcgRm9yZWlnbk1lc3NhZ2UgeyBDID0gLTI1MCB9OwotCi0gICAgICAgICAgICB1aW50IHRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZygxMCwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh0YWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShtZXNzYWdlMSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcodGFnKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UobWVzc2FnZTIpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICBzdHJlYW0uUG9zaXRpb24gPSAwOwotCi0gICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgUmVwZWF0ZWRGaWVsZDxGb3JlaWduTWVzc2FnZT4oKTsKLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBpbnB1dC5Bc3NlcnROZXh0VGFnKHRhZyk7Ci0gICAgICAgICAgICBmaWVsZC5BZGRFbnRyaWVzRnJvbShpbnB1dCwgRmllbGRDb2RlYy5Gb3JNZXNzYWdlKHRhZywgRm9yZWlnbk1lc3NhZ2UuUGFyc2VyKSk7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgbWVzc2FnZTEsIG1lc3NhZ2UyfSwgZmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5Jc0F0RW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvX1BhY2tlZEludDMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdWludCB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMTAsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBSZXBlYXRlZEZpZWxkPGludD4geyAxMCwgMTAwMCwgMTAwMDAwMCB9OwotICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIGZpZWxkLldyaXRlVG8ob3V0cHV0LCBGaWVsZENvZGVjLkZvckludDMyKHRhZykpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICBzdHJlYW0uUG9zaXRpb24gPSAwOwotCi0gICAgICAgICAgICB2YXIgaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgaW5wdXQuQXNzZXJ0TmV4dFRhZyh0YWcpOwotICAgICAgICAgICAgdmFyIGxlbmd0aCA9IGlucHV0LlJlYWRMZW5ndGgoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMCwgaW5wdXQuUmVhZEludDMyKCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwMDAsIGlucHV0LlJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDAwMDAwLCBpbnB1dC5SZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNUcnVlKGlucHV0LklzQXRFbmQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEgKyBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTGVuZ3RoU2l6ZShsZW5ndGgpICsgbGVuZ3RoLCBzdHJlYW0uTGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvX05vblBhY2tlZEludDMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdWludCB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMTAsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBSZXBlYXRlZEZpZWxkPGludD4geyAxMCwgMTAwMCwgMTAwMDAwMH07Ci0gICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgZmllbGQuV3JpdGVUbyhvdXRwdXQsIEZpZWxkQ29kZWMuRm9ySW50MzIodGFnKSk7Ci0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBpbnB1dC5Bc3NlcnROZXh0VGFnKHRhZyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAsIGlucHV0LlJlYWRJbnQzMigpKTsKLSAgICAgICAgICAgIGlucHV0LkFzc2VydE5leHRUYWcodGFnKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMDAwLCBpbnB1dC5SZWFkSW50MzIoKSk7Ci0gICAgICAgICAgICBpbnB1dC5Bc3NlcnROZXh0VGFnKHRhZyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTAwMDAwMCwgaW5wdXQuUmVhZEludDMyKCkpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShpbnB1dC5Jc0F0RW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvX1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVpbnQgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDEwLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgIkZvbyIsICIiLCAiQmFyIiB9OwotICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIGZpZWxkLldyaXRlVG8ob3V0cHV0LCBGaWVsZENvZGVjLkZvclN0cmluZyh0YWcpKTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsKLQotICAgICAgICAgICAgdmFyIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgIGlucHV0LkFzc2VydE5leHRUYWcodGFnKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRm9vIiwgaW5wdXQuUmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIGlucHV0LkFzc2VydE5leHRUYWcodGFnKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiIiwgaW5wdXQuUmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIGlucHV0LkFzc2VydE5leHRUYWcodGFnKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiQmFyIiwgaW5wdXQuUmVhZFN0cmluZygpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuSXNBdEVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUb19NZXNzYWdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UxID0gbmV3IEZvcmVpZ25NZXNzYWdlIHsgQyA9IDIwIH07Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZTIgPSBuZXcgRm9yZWlnbk1lc3NhZ2UgeyBDID0gMjUgfTsKLSAgICAgICAgICAgIHVpbnQgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDEwLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICB2YXIgZmllbGQgPSBuZXcgUmVwZWF0ZWRGaWVsZDxGb3JlaWduTWVzc2FnZT4geyBtZXNzYWdlMSwgbWVzc2FnZTIgfTsKLSAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBmaWVsZC5Xcml0ZVRvKG91dHB1dCwgRmllbGRDb2RlYy5Gb3JNZXNzYWdlKHRhZywgRm9yZWlnbk1lc3NhZ2UuUGFyc2VyKSk7Ci0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0KLSAgICAgICAgICAgIHZhciBpbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICBpbnB1dC5Bc3NlcnROZXh0VGFnKHRhZyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZTEsIGlucHV0LlJlYWRNZXNzYWdlKEZvcmVpZ25NZXNzYWdlLlBhcnNlcikpOwotICAgICAgICAgICAgaW5wdXQuQXNzZXJ0TmV4dFRhZyh0YWcpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UyLCBpbnB1dC5SZWFkTWVzc2FnZShGb3JlaWduTWVzc2FnZS5QYXJzZXIpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoaW5wdXQuSXNBdEVuZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FsY3VsYXRlU2l6ZV9WYXJpYWJsZVNpemVOb25QYWNrZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPGludD4geyAxLCA1MDAsIDEgfTsKLSAgICAgICAgICAgIHZhciB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOwotICAgICAgICAgICAgLy8gMiBieXRlcyBmb3IgdGhlIGZpcnN0IGVudHJ5LCAzIGJ5dGVzIGZvciB0aGUgc2Vjb25kLCAyIGJ5dGVzIGZvciB0aGUgdGhpcmQKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg3LCBsaXN0LkNhbGN1bGF0ZVNpemUoRmllbGRDb2RlYy5Gb3JJbnQzMih0YWcpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FsY3VsYXRlU2l6ZV9GaXhlZFNpemVOb25QYWNrZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPGludD4geyAxLCA1MDAsIDEgfTsKLSAgICAgICAgICAgIHZhciB0YWcgPSBXaXJlRm9ybWF0Lk1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDMyKTsKLSAgICAgICAgICAgIC8vIDUgYnl0ZXMgZm9yIHRoZSBlYWNoIGVudHJ5Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTUsIGxpc3QuQ2FsY3VsYXRlU2l6ZShGaWVsZENvZGVjLkZvclNGaXhlZDMyKHRhZykpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDYWxjdWxhdGVTaXplX1ZhcmlhYmxlU2l6ZVBhY2tlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8aW50PiB7IDEsIDUwMCwgMX07Ci0gICAgICAgICAgICB2YXIgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIC8vIDEgYnl0ZSBmb3IgdGhlIHRhZywgMSBieXRlIGZvciB0aGUgbGVuZ3RoLAotICAgICAgICAgICAgLy8gMSBieXRlIGZvciB0aGUgZmlyc3QgZW50cnksIDIgYnl0ZXMgZm9yIHRoZSBzZWNvbmQsIDEgYnl0ZSBmb3IgdGhlIHRoaXJkCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoNiwgbGlzdC5DYWxjdWxhdGVTaXplKEZpZWxkQ29kZWMuRm9ySW50MzIodGFnKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENhbGN1bGF0ZVNpemVfRml4ZWRTaXplUGFja2VkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxpbnQ+IHsgMSwgNTAwLCAxIH07Ci0gICAgICAgICAgICB2YXIgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIC8vIDEgYnl0ZSBmb3IgdGhlIHRhZywgMSBieXRlIGZvciB0aGUgbGVuZ3RoLCA0IGJ5dGVzIHBlciBlbnRyeQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDE0LCBsaXN0LkNhbGN1bGF0ZVNpemUoRmllbGRDb2RlYy5Gb3JTRml4ZWQzMih0YWcpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVGVzdE5lZ2F0aXZlRW51bUFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGFycmF5U2l6ZSA9IDEgKyAxICsgKDExICogNSk7Ci0gICAgICAgICAgICBpbnQgbXNnU2l6ZSA9IGFycmF5U2l6ZTsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW21zZ1NpemVdOwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgIHVpbnQgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDgsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpID49IC01OyBpLS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKHRhZyk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlRW51bShpKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG91dHB1dC5TcGFjZUxlZnQpOwotCi0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICAgICAgdGFnID0gaW5wdXQuUmVhZFRhZygpOwotCi0gICAgICAgICAgICBSZXBlYXRlZEZpZWxkPFNhbXBsZUVudW0+IHZhbHVlcyA9IG5ldyBSZXBlYXRlZEZpZWxkPFNhbXBsZUVudW0+KCk7Ci0gICAgICAgICAgICB2YWx1ZXMuQWRkRW50cmllc0Zyb20oaW5wdXQsIEZpZWxkQ29kZWMuRm9yRW51bSh0YWcsIHggPT4gKGludCl4LCB4ID0+IChTYW1wbGVFbnVtKXgpKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYsIHZhbHVlcy5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoU2FtcGxlRW51bS5Ob25lLCB2YWx1ZXNbMF0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCgoU2FtcGxlRW51bSkoLTEpKSwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChTYW1wbGVFbnVtLk5lZ2F0aXZlVmFsdWUsIHZhbHVlc1syXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKChTYW1wbGVFbnVtKSgtMykpLCB2YWx1ZXNbM10pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCgoU2FtcGxlRW51bSkoLTQpKSwgdmFsdWVzWzRdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoKFNhbXBsZUVudW0pKC01KSksIHZhbHVlc1s1XSk7Ci0gICAgICAgIH0KLQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUZXN0TmVnYXRpdmVFbnVtUGFja2VkQXJyYXkoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgYXJyYXlTaXplID0gMSArICgxMCAqIDUpOwotICAgICAgICAgICAgaW50IG1zZ1NpemUgPSAxICsgMSArIGFycmF5U2l6ZTsKLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW21zZ1NpemVdOwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgICAgIC8vIExlbmd0aC1kZWxpbWl0ZWQgdG8gc2hvdyB3ZSB3YW50IHRoZSBwYWNrZWQgcmVwcmVzZW50YXRpb24KLSAgICAgICAgICAgIHVpbnQgdGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKDgsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh0YWcpOwotICAgICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPj0gLTU7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzaXplICs9IENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZShpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1ZhcmludDMyKCh1aW50KXNpemUpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPj0gLTU7IGktLSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKGkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG91dHB1dC5TcGFjZUxlZnQpOwotCi0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oYnl0ZXMpOwotICAgICAgICAgICAgdGFnID0gaW5wdXQuUmVhZFRhZygpOwotCi0gICAgICAgICAgICBSZXBlYXRlZEZpZWxkPFNhbXBsZUVudW0+IHZhbHVlcyA9IG5ldyBSZXBlYXRlZEZpZWxkPFNhbXBsZUVudW0+KCk7Ci0gICAgICAgICAgICB2YWx1ZXMuQWRkRW50cmllc0Zyb20oaW5wdXQsIEZpZWxkQ29kZWMuRm9yRW51bSh0YWcsIHggPT4gKGludCl4LCB4ID0+IChTYW1wbGVFbnVtKXgpKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYsIHZhbHVlcy5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoU2FtcGxlRW51bS5Ob25lLCB2YWx1ZXNbMF0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCgoU2FtcGxlRW51bSkoLTEpKSwgdmFsdWVzWzFdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChTYW1wbGVFbnVtLk5lZ2F0aXZlVmFsdWUsIHZhbHVlc1syXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoKChTYW1wbGVFbnVtKSgtMykpLCB2YWx1ZXNbM10pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCgoU2FtcGxlRW51bSkoLTQpKSwgdmFsdWVzWzRdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgoKFNhbXBsZUVudW0pKC01KSksIHZhbHVlc1s1XSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGYWlybHkgcGVyZnVuY3RvcnkgdGVzdHMgZm9yIHRoZSBub24tZ2VuZXJpYyBJTGlzdCBpbXBsZW1lbnRhdGlvbgotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSUxpc3RfSW5kZXhlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgSUxpc3QgbGlzdCA9IGZpZWxkOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJmaXJzdCIsIGxpc3RbMF0pOwotICAgICAgICAgICAgbGlzdFsxXSA9ICJjaGFuZ2VkIjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiY2hhbmdlZCIsIGZpZWxkWzFdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJTGlzdF9Db250YWlucygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElMaXN0IGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiwgInNlY29uZCIgfTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobGlzdC5Db250YWlucygic2Vjb25kIikpOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdC5Db250YWlucygidGhpcmQiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShsaXN0LkNvbnRhaW5zKG5ldyBvYmplY3QoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElMaXN0X0FkZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElMaXN0IGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiwgInNlY29uZCIgfTsKLSAgICAgICAgICAgIGxpc3QuQWRkKCJ0aGlyZCIpOwotICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChuZXdbXSB7ICJmaXJzdCIsICJzZWNvbmQiLCAidGhpcmQiIH0sIGxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElMaXN0X1JlbW92ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElMaXN0IGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiwgInNlY29uZCIgfTsKLSAgICAgICAgICAgIGxpc3QuUmVtb3ZlKCJ0aGlyZCIpOyAvLyBOby1vcCwgbm8gZXhjZXB0aW9uCi0gICAgICAgICAgICBsaXN0LlJlbW92ZShuZXcgb2JqZWN0KCkpOyAvLyBOby1vcCwgbm8gZXhjZXB0aW9uCi0gICAgICAgICAgICBsaXN0LlJlbW92ZSgiZmlyc3QiKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAic2Vjb25kIiB9LCBsaXN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJTGlzdF9Jc0ZpeGVkU2l6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaWVsZCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgSUxpc3QgbGlzdCA9IGZpZWxkOwotICAgICAgICAgICAgQXNzZXJ0LklzRmFsc2UobGlzdC5Jc0ZpeGVkU2l6ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSUxpc3RfSW5kZXhPZigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElMaXN0IGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHsgImZpcnN0IiwgInNlY29uZCIgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBsaXN0LkluZGV4T2YoInNlY29uZCIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgbGlzdC5JbmRleE9mKCJ0aGlyZCIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtMSwgbGlzdC5JbmRleE9mKG5ldyBvYmplY3QoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElMaXN0X1N5bmNSb290KCkKLSAgICAgICAgewotICAgICAgICAgICAgSUxpc3QgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUobGlzdCwgbGlzdC5TeW5jUm9vdCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSUxpc3RfQ29weVRvKCkKLSAgICAgICAgewotICAgICAgICAgICAgSUxpc3QgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAiZmlyc3QiLCAic2Vjb25kIiB9OwotICAgICAgICAgICAgc3RyaW5nW10gc3RyaW5nQXJyYXkgPSBuZXcgc3RyaW5nWzRdOwotICAgICAgICAgICAgbGlzdC5Db3B5VG8oc3RyaW5nQXJyYXksIDEpOwotICAgICAgICAgICAgQ29sbGVjdGlvbkFzc2VydC5BcmVFcXVhbChuZXdbXSB7IG51bGwsICJmaXJzdCIsICAic2Vjb25kIiwgbnVsbCB9LCBzdHJpbmdBcnJheSk7Ci0KLSAgICAgICAgICAgIG9iamVjdFtdIG9iamVjdEFycmF5ID0gbmV3IG9iamVjdFs0XTsKLSAgICAgICAgICAgIGxpc3QuQ29weVRvKG9iamVjdEFycmF5LCAxKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyBudWxsLCAiZmlyc3QiLCAic2Vjb25kIiwgbnVsbCB9LCBvYmplY3RBcnJheSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJyYXlUeXBlTWlzbWF0Y2hFeGNlcHRpb24+KCgpID0+IGxpc3QuQ29weVRvKG5ldyBTdHJpbmdCdWlsZGVyWzRdLCAxKSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFycmF5VHlwZU1pc21hdGNoRXhjZXB0aW9uPigoKSA9PiBsaXN0LkNvcHlUbyhuZXcgaW50WzRdLCAxKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSUxpc3RfSXNTeW5jaHJvbml6ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTGlzdCBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPiB7ICJmaXJzdCIsICJzZWNvbmQiIH07Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShsaXN0LklzU3luY2hyb25pemVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJTGlzdF9JbnNlcnQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTGlzdCBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8c3RyaW5nPiB7ICJmaXJzdCIsICJzZWNvbmQiIH07Ci0gICAgICAgICAgICBsaXN0Lkluc2VydCgxLCAibWlkZGxlIik7Ci0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWFsKG5ld1tdIHsgImZpcnN0IiwgIm1pZGRsZSIsICJzZWNvbmQiIH0sIGxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX0ludGVnZXJzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxpbnQ+IHsgNSwgMTAsIDIwIH07Ci0gICAgICAgICAgICB2YXIgdGV4dCA9IGxpc3QuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiWyA1LCAxMCwgMjAgXSIsIHRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX1N0cmluZ3MoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPHN0cmluZz4geyAieCIsICJ5IiwgInoiIH07Ci0gICAgICAgICAgICB2YXIgdGV4dCA9IGxpc3QuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiWyBcInhcIiwgXCJ5XCIsIFwielwiIF0iLCB0ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUb1N0cmluZ19NZXNzYWdlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8VGVzdEFsbFR5cGVzPiB7IG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVEb3VibGUgPSAxLjUgfSwgbmV3IFRlc3RBbGxUeXBlcyB7IFNpbmdsZUludDMyID0gMTAgfSB9OwotICAgICAgICAgICAgdmFyIHRleHQgPSBsaXN0LlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlsgeyBcInNpbmdsZURvdWJsZVwiOiAxLjUgfSwgeyBcInNpbmdsZUludDMyXCI6IDEwIH0gXSIsIHRleHQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX0VtcHR5KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGxpc3QgPSBuZXcgUmVwZWF0ZWRGaWVsZDxUZXN0QWxsVHlwZXM+IHsgfTsKLSAgICAgICAgICAgIHZhciB0ZXh0ID0gbGlzdC5Ub1N0cmluZygpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJbIF0iLCB0ZXh0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUb1N0cmluZ19JbnZhbGlkRWxlbWVudFR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPGRlY2ltYWw+IHsgMTVtIH07Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50RXhjZXB0aW9uPigoKSA9PiBsaXN0LlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX1RpbWVzdGFtcCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBsaXN0ID0gbmV3IFJlcGVhdGVkRmllbGQ8VGltZXN0YW1wPiB7IFRpbWVzdGFtcC5Gcm9tRGF0ZVRpbWUobmV3IERhdGVUaW1lKDIwMTUsIDEwLCAxLCAxMiwgMzQsIDU2LCBEYXRlVGltZUtpbmQuVXRjKSkgfTsKLSAgICAgICAgICAgIHZhciB0ZXh0ID0gbGlzdC5Ub1N0cmluZygpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJbIFwiMjAxNS0xMC0wMVQxMjozNDo1NlpcIiBdIiwgdGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdfU3RydWN0KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgU3RydWN0IHsgRmllbGRzID0geyB7ICJmb28iLCBuZXcgVmFsdWUgeyBOdW1iZXJWYWx1ZSA9IDIwIH0gfSB9IH07Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IG5ldyBSZXBlYXRlZEZpZWxkPFN0cnVjdD4geyBtZXNzYWdlIH07Ci0gICAgICAgICAgICB2YXIgdGV4dCA9IGxpc3QuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0ZXh0LCAiWyB7IFwiZm9vXCI6IDIwIH0gXSIsIG1lc3NhZ2UuVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvbXBhdGliaWxpdHkvUHJvcGVydHlJbmZvRXh0ZW5zaW9uc1Rlc3QuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvbXBhdGliaWxpdHkvUHJvcGVydHlJbmZvRXh0ZW5zaW9uc1Rlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRmMjNhMDkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db21wYXRpYmlsaXR5L1Byb3BlcnR5SW5mb0V4dGVuc2lvbnNUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsOTggKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuQ29tcGF0aWJpbGl0eQotewotICAgIHB1YmxpYyBjbGFzcyBQcm9wZXJ0eUluZm9FeHRlbnNpb25zVGVzdAotICAgIHsKLSAgICAgICAgcHVibGljIHN0cmluZyBQdWJsaWNSZWFkV3JpdGUgeyBnZXQ7IHNldDsgfQotICAgICAgICBwcml2YXRlIHN0cmluZyBQcml2YXRlUmVhZFdyaXRlIHsgZ2V0OyBzZXQ7IH0KLSAgICAgICAgcHVibGljIHN0cmluZyBQdWJsaWNSZWFkUHJpdmF0ZVdyaXRlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotICAgICAgICBwdWJsaWMgc3RyaW5nIFByaXZhdGVSZWFkUHVibGljV3JpdGUgeyBwcml2YXRlIGdldDsgc2V0OyB9Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgUHVibGljUmVhZE9ubHkgeyBnZXQgeyByZXR1cm4gbnVsbDsgfSB9Ci0gICAgICAgIHByaXZhdGUgc3RyaW5nIFByaXZhdGVSZWFkT25seSB7IGdldCB7IHJldHVybiBudWxsOyB9IH0KLSAgICAgICAgcHVibGljIHN0cmluZyBQdWJsaWNXcml0ZU9ubHkgeyBzZXQgeyB9IH0KLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgUHJpdmF0ZVdyaXRlT25seSB7IHNldCB7ICB9IH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJQdWJsaWNSZWFkV3JpdGUiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJQdWJsaWNSZWFkUHJpdmF0ZVdyaXRlIildCi0gICAgICAgIFtUZXN0Q2FzZSgiUHVibGljUmVhZE9ubHkiKV0KLSAgICAgICAgcHVibGljIHZvaWQgR2V0R2V0TWV0aG9kX1N1Y2Nlc3Moc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSB0eXBlb2YoUHJvcGVydHlJbmZvRXh0ZW5zaW9uc1Rlc3QpCi0gICAgICAgICAgICAgICAgLkdldFByb3BlcnR5KG5hbWUsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5Ob25QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoUHJvcGVydHlJbmZvRXh0ZW5zaW9ucy5HZXRHZXRNZXRob2QocHJvcGVydHlJbmZvKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJQcml2YXRlUmVhZFdyaXRlIildCi0gICAgICAgIFtUZXN0Q2FzZSgiUHJpdmF0ZVJlYWRQdWJsaWNXcml0ZSIpXQotICAgICAgICBbVGVzdENhc2UoIlByaXZhdGVSZWFkT25seSIpXQotICAgICAgICBbVGVzdENhc2UoIlB1YmxpY1dyaXRlT25seSIpXQotICAgICAgICBbVGVzdENhc2UoIlByaXZhdGVXcml0ZU9ubHkiKV0KLSAgICAgICAgcHVibGljIHZvaWQgR2V0R2V0TWV0aG9kX05vQWNjZXNzaWJsZUdldHRlcihzdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHByb3BlcnR5SW5mbyA9IHR5cGVvZihQcm9wZXJ0eUluZm9FeHRlbnNpb25zVGVzdCkKLSAgICAgICAgICAgICAgICAuR2V0UHJvcGVydHkobmFtZSwgQmluZGluZ0ZsYWdzLkluc3RhbmNlIHwgQmluZGluZ0ZsYWdzLk5vblB1YmxpYyB8IEJpbmRpbmdGbGFncy5QdWJsaWMpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChQcm9wZXJ0eUluZm9FeHRlbnNpb25zLkdldEdldE1ldGhvZChwcm9wZXJ0eUluZm8pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIlB1YmxpY1JlYWRXcml0ZSIpXQotICAgICAgICBbVGVzdENhc2UoIlByaXZhdGVSZWFkUHVibGljV3JpdGUiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJQdWJsaWNXcml0ZU9ubHkiKV0KLSAgICAgICAgcHVibGljIHZvaWQgR2V0U2V0TWV0aG9kX1N1Y2Nlc3Moc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBwcm9wZXJ0eUluZm8gPSB0eXBlb2YoUHJvcGVydHlJbmZvRXh0ZW5zaW9uc1Rlc3QpCi0gICAgICAgICAgICAgICAgLkdldFByb3BlcnR5KG5hbWUsIEJpbmRpbmdGbGFncy5JbnN0YW5jZSB8IEJpbmRpbmdGbGFncy5Ob25QdWJsaWMgfCBCaW5kaW5nRmxhZ3MuUHVibGljKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwoUHJvcGVydHlJbmZvRXh0ZW5zaW9ucy5HZXRTZXRNZXRob2QocHJvcGVydHlJbmZvKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJQdWJsaWNSZWFkUHJpdmF0ZVdyaXRlIildCi0gICAgICAgIFtUZXN0Q2FzZSgiUHJpdmF0ZVJlYWRXcml0ZSIpXQotICAgICAgICBbVGVzdENhc2UoIlByaXZhdGVSZWFkT25seSIpXQotICAgICAgICBbVGVzdENhc2UoIlB1YmxpY1JlYWRPbmx5IildCi0gICAgICAgIFtUZXN0Q2FzZSgiUHJpdmF0ZVdyaXRlT25seSIpXQotICAgICAgICBwdWJsaWMgdm9pZCBHZXRTZXRNZXRob2RfTm9BY2Nlc3NpYmxlR2V0dGVyKHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcHJvcGVydHlJbmZvID0gdHlwZW9mKFByb3BlcnR5SW5mb0V4dGVuc2lvbnNUZXN0KQotICAgICAgICAgICAgICAgIC5HZXRQcm9wZXJ0eShuYW1lLCBCaW5kaW5nRmxhZ3MuSW5zdGFuY2UgfCBCaW5kaW5nRmxhZ3MuTm9uUHVibGljIHwgQmluZGluZ0ZsYWdzLlB1YmxpYyk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKFByb3BlcnR5SW5mb0V4dGVuc2lvbnMuR2V0U2V0TWV0aG9kKHByb3BlcnR5SW5mbykpOwotICAgICAgICB9Ci0gICAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvbXBhdGliaWxpdHkvVHlwZUV4dGVuc2lvbnNUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Db21wYXRpYmlsaXR5L1R5cGVFeHRlbnNpb25zVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjBjOGQzYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0NvbXBhdGliaWxpdHkvVHlwZUV4dGVuc2lvbnNUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTMzICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi11c2luZyBOVW5pdC5GcmFtZXdvcms7Ci11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLkNvbXBhdGliaWxpdHkKLXsKLSAgICBwdWJsaWMgY2xhc3MgVHlwZUV4dGVuc2lvbnNUZXN0Ci0gICAgewotICAgICAgICBwdWJsaWMgY2xhc3MgRGVyaXZlZExpc3QgOiBMaXN0PHN0cmluZz4geyB9Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgUHVibGljUHJvcGVydHkgeyBnZXQ7IHNldDsgfQotICAgICAgICBwcml2YXRlIHN0cmluZyBQcml2YXRlUHJvcGVydHkgeyBnZXQ7IHNldDsgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFB1YmxpY01ldGhvZCgpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBQcml2YXRlTWV0aG9kKCkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoaW50KSwgdHJ1ZSldCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoaW50PyksIHRydWUpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKE51bGxhYmxlPD4pLCB0cnVlKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihXaXJlRm9ybWF0LldpcmVUeXBlKSwgdHJ1ZSldCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2Yoc3RyaW5nKSwgZmFsc2UpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKG9iamVjdCksIGZhbHNlKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihFbnVtKSwgZmFsc2UpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKFZhbHVlVHlwZSksIGZhbHNlKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihUeXBlRXh0ZW5zaW9uc1Rlc3QpLCBmYWxzZSldCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoQWN0aW9uKSwgZmFsc2UpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKEFjdGlvbjw+KSwgZmFsc2UpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKElEaXNwb3NhYmxlKSwgZmFsc2UpXQotICAgICAgICBwdWJsaWMgdm9pZCBJc1ZhbHVlVHlwZShUeXBlIHR5cGUsIGJvb2wgZXhwZWN0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgVHlwZUV4dGVuc2lvbnMuSXNWYWx1ZVR5cGUodHlwZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2Yob2JqZWN0KSwgdHlwZW9mKHN0cmluZyksIHRydWUpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKG9iamVjdCksIHR5cGVvZihpbnQpLCB0cnVlKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihzdHJpbmcpLCB0eXBlb2Yoc3RyaW5nKSwgdHJ1ZSldCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2Yoc3RyaW5nKSwgdHlwZW9mKG9iamVjdCksIGZhbHNlKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihzdHJpbmcpLCB0eXBlb2YoaW50KSwgZmFsc2UpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKGludCksIHR5cGVvZihpbnQpLCB0cnVlKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihWYWx1ZVR5cGUpLCB0eXBlb2YoaW50KSwgdHJ1ZSldCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YobG9uZyksIHR5cGVvZihpbnQpLCBmYWxzZSldIC8vIAotICAgICAgICBwdWJsaWMgdm9pZCBJc0Fzc2lnbmFibGVGcm9tKFR5cGUgdGFyZ2V0LCBUeXBlIGFyZ3VtZW50LCBib29sIGV4cGVjdGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIFR5cGVFeHRlbnNpb25zLklzQXNzaWduYWJsZUZyb20odGFyZ2V0LCBhcmd1bWVudCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoRGVyaXZlZExpc3QpLCAiQ291bnQiKV0gLy8gR28gdXAgdGhlIHR5cGUgaGllcmFyY2h5Ci0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoTGlzdDxzdHJpbmc+KSwgIkNvdW50IildCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoTGlzdDw+KSwgIkNvdW50IildCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoVHlwZUV4dGVuc2lvbnNUZXN0KSwgIlB1YmxpY1Byb3BlcnR5IildCi0gICAgICAgIHB1YmxpYyB2b2lkIEdldFByb3BlcnR5X1N1Y2Nlc3MoVHlwZSB0eXBlLCBzdHJpbmcgbmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHByb3BlcnR5ID0gVHlwZUV4dGVuc2lvbnMuR2V0UHJvcGVydHkodHlwZSwgbmFtZSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOb3ROdWxsKHByb3BlcnR5KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuYW1lLCBwcm9wZXJ0eS5OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKFR5cGVFeHRlbnNpb25zVGVzdCksICJQcml2YXRlUHJvcGVydHkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihUeXBlRXh0ZW5zaW9uc1Rlc3QpLCAiR2FyYmFnZSIpXQotICAgICAgICBwdWJsaWMgdm9pZCBHZXRQcm9wZXJ0eV9Ob1N1Y2hQcm9wZXJ0eShUeXBlIHR5cGUsIHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcHJvcGVydHkgPSBUeXBlRXh0ZW5zaW9ucy5HZXRQcm9wZXJ0eSh0eXBlLCBuYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwocHJvcGVydHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoRGVyaXZlZExpc3QpLCAiUmVtb3ZlQXQiKV0gLy8gR28gdXAgdGhlIHR5cGUgaGllcmFyY2h5Ci0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoTGlzdDw+KSwgIlJlbW92ZUF0IildCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoVHlwZUV4dGVuc2lvbnNUZXN0KSwgIlB1YmxpY01ldGhvZCIpXQotICAgICAgICBwdWJsaWMgdm9pZCBHZXRNZXRob2RfU3VjY2VzcyhUeXBlIHR5cGUsIHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWV0aG9kID0gVHlwZUV4dGVuc2lvbnMuR2V0TWV0aG9kKHR5cGUsIG5hbWUpOwotICAgICAgICAgICAgQXNzZXJ0LklzTm90TnVsbChtZXRob2QpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5hbWUsIG1ldGhvZC5OYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKFR5cGVFeHRlbnNpb25zVGVzdCksICJQcml2YXRlTWV0aG9kIildCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoVHlwZUV4dGVuc2lvbnNUZXN0KSwgIkdhcmJhZ2VNZXRob2QiKV0KLSAgICAgICAgcHVibGljIHZvaWQgR2V0TWV0aG9kX05vU3VjaE1ldGhvZChUeXBlIHR5cGUsIHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWV0aG9kID0gVHlwZUV4dGVuc2lvbnMuR2V0TWV0aG9kKHR5cGUsIG5hbWUpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXRob2QpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoTGlzdDxzdHJpbmc+KSwgIkluZGV4T2YiKV0KLSAgICAgICAgcHVibGljIHZvaWQgR2V0TWV0aG9kX0FtYmlndW91cyhUeXBlIHR5cGUsIHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFtYmlndW91c01hdGNoRXhjZXB0aW9uPigoKSA9PiBUeXBlRXh0ZW5zaW9ucy5HZXRNZXRob2QodHlwZSwgbmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9EZXByZWNhdGVkTWVtYmVyVGVzdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvRGVwcmVjYXRlZE1lbWJlclRlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkZmFkOGIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9EZXByZWNhdGVkTWVtYmVyVGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDU1ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0gICAgCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zOwotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgcHVibGljIGNsYXNzIERlcHJlY2F0ZWRNZW1iZXJUZXN0Ci0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydElzRGVwcmVjYXRlZChNZW1iZXJJbmZvIG1lbWJlcikKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0Lk5vdE51bGwobWVtYmVyKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUobWVtYmVyLklzRGVmaW5lZCh0eXBlb2YoT2Jzb2xldGVBdHRyaWJ1dGUpLCBmYWxzZSksICJNZW1iZXIgbm90IG9ic29sZXRlOiAiICsgbWVtYmVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUZXN0RGVwcmVhdGVkUHJpbWl0aXZlVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRJc0RlcHJlY2F0ZWQodHlwZW9mKFRlc3REZXByZWNhdGVkRmllbGRzKS5HZXRQcm9wZXJ0eSgiRGVwcmVjYXRlZEludDMyIikpOwotICAgICAgICB9Ci0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0VxdWFsaXR5VGVzdGVyLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9FcXVhbGl0eVRlc3Rlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTY2OWJhYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0VxdWFsaXR5VGVzdGVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBIZWxwZXIgbWV0aG9kcyB3aGVuIHRlc3RpbmcgZXF1YWxpdHkuIE5Vbml0J3MgQXNzZXJ0LkFyZUVxdWFsIGFuZAotICAgIC8vLyBBc3NlcnQuQXJlTm90RXF1YWwgbWV0aG9kcyB0cnkgdG8gYmUgY2xldmVyIHdpdGggY29sbGVjdGlvbnMsIHdoaWNoIGNhbgotICAgIC8vLyBiZSBhbm5veWluZy4uLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIEVxdWFsaXR5VGVzdGVyCi0gICAgewotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgQXNzZXJ0RXF1YWxpdHk8VD4oVCBmaXJzdCwgVCBzZWNvbmQpIHdoZXJlIFQgOiBJRXF1YXRhYmxlPFQ+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoZmlyc3QuRXF1YWxzKHNlY29uZCkpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShmaXJzdC5FcXVhbHMoKG9iamVjdCkgc2Vjb25kKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmlyc3QuR2V0SGFzaENvZGUoKSwgc2Vjb25kLkdldEhhc2hDb2RlKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIEFzc2VydEluZXF1YWxpdHk8VD4oVCBmaXJzdCwgVCBzZWNvbmQpIHdoZXJlIFQgOiBJRXF1YXRhYmxlPFQ+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGZpcnN0LkVxdWFscyhzZWNvbmQpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGZpcnN0LkVxdWFscygob2JqZWN0KSBzZWNvbmQpKTsKLSAgICAgICAgICAgIC8vIFdoaWxlIHRoaXMgaXNuJ3QgYSByZXF1aXJlbWVudCwgdGhlIGNoYW5jZXMgb2YgdGhpcyB0ZXN0IGZhaWxpbmcgZHVlIHRvCi0gICAgICAgICAgICAvLyBjb2luY2lkZW5jZSByYXRoZXIgdGhhbiBhIGJ1ZyBhcmUgdmVyeSBzbWFsbC4KLSAgICAgICAgICAgIGlmIChmaXJzdCAhPSBudWxsICYmIHNlY29uZCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChmaXJzdC5HZXRIYXNoQ29kZSgpLCBzZWNvbmQuR2V0SGFzaENvZGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0ZpZWxkQ29kZWNUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9GaWVsZENvZGVjVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzYxNjQ3MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0ZpZWxkQ29kZWNUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3M7Ci11c2luZyBOVW5pdC5GcmFtZXdvcms7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICBwdWJsaWMgY2xhc3MgRmllbGRDb2RlY1Rlc3QKLSAgICB7Ci0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAwNDE0IC8vIFVzZWQgYnkgdGVzdHMgdmlhIHJlZmxlY3Rpb24gLSBkbyBub3QgcmVtb3ZlIQotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBMaXN0PElDb2RlY1Rlc3REYXRhPiBDb2RlY3MgPSBuZXcgTGlzdDxJQ29kZWNUZXN0RGF0YT4KLSAgICAgICAgewotICAgICAgICAgICAgbmV3IEZpZWxkQ29kZWNUZXN0RGF0YTxib29sPihGaWVsZENvZGVjLkZvckJvb2woMTAwKSwgdHJ1ZSwgIkJvb2wiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZENvZGVjVGVzdERhdGE8c3RyaW5nPihGaWVsZENvZGVjLkZvclN0cmluZygxMDApLCAic2FtcGxlIiwgIlN0cmluZyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkQ29kZWNUZXN0RGF0YTxCeXRlU3RyaW5nPihGaWVsZENvZGVjLkZvckJ5dGVzKDEwMCksIEJ5dGVTdHJpbmcuQ29weUZyb20oMSwgMiwgMyksICJCeXRlcyIpLAotICAgICAgICAgICAgbmV3IEZpZWxkQ29kZWNUZXN0RGF0YTxpbnQ+KEZpZWxkQ29kZWMuRm9ySW50MzIoMTAwKSwgLTEwMDAsICJJbnQzMiIpLAotICAgICAgICAgICAgbmV3IEZpZWxkQ29kZWNUZXN0RGF0YTxpbnQ+KEZpZWxkQ29kZWMuRm9yU0ludDMyKDEwMCksIC0xMDAwLCAiU0ludDMyIiksCi0gICAgICAgICAgICBuZXcgRmllbGRDb2RlY1Rlc3REYXRhPGludD4oRmllbGRDb2RlYy5Gb3JTRml4ZWQzMigxMDApLCAtMTAwMCwgIlNGaXhlZDMyIiksCi0gICAgICAgICAgICBuZXcgRmllbGRDb2RlY1Rlc3REYXRhPHVpbnQ+KEZpZWxkQ29kZWMuRm9yVUludDMyKDEwMCksIDEyMzQsICJVSW50MzIiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZENvZGVjVGVzdERhdGE8dWludD4oRmllbGRDb2RlYy5Gb3JGaXhlZDMyKDEwMCksIDEyMzQsICJGaXhlZDMyIiksCi0gICAgICAgICAgICBuZXcgRmllbGRDb2RlY1Rlc3REYXRhPGxvbmc+KEZpZWxkQ29kZWMuRm9ySW50NjQoMTAwKSwgLTEwMDAsICJJbnQ2NCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkQ29kZWNUZXN0RGF0YTxsb25nPihGaWVsZENvZGVjLkZvclNJbnQ2NCgxMDApLCAtMTAwMCwgIlNJbnQ2NCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkQ29kZWNUZXN0RGF0YTxsb25nPihGaWVsZENvZGVjLkZvclNGaXhlZDY0KDEwMCksIC0xMDAwLCAiU0ZpeGVkNjQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZENvZGVjVGVzdERhdGE8dWxvbmc+KEZpZWxkQ29kZWMuRm9yVUludDY0KDEwMCksIDEyMzQsICJVSW50NjQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZENvZGVjVGVzdERhdGE8dWxvbmc+KEZpZWxkQ29kZWMuRm9yRml4ZWQ2NCgxMDApLCAxMjM0LCAiRml4ZWQ2NCIpLAotICAgICAgICAgICAgbmV3IEZpZWxkQ29kZWNUZXN0RGF0YTxmbG9hdD4oRmllbGRDb2RlYy5Gb3JGbG9hdCgxMDApLCAxMjM0LjVmLCAiRmxvYXQiKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZENvZGVjVGVzdERhdGE8ZG91YmxlPihGaWVsZENvZGVjLkZvckRvdWJsZSgxMDApLCAxMjM0NTY3ODkwLjVkLCAiRG91YmxlIiksCi0gICAgICAgICAgICBuZXcgRmllbGRDb2RlY1Rlc3REYXRhPEZvcmVpZ25FbnVtPigKLSAgICAgICAgICAgICAgICBGaWVsZENvZGVjLkZvckVudW0oMTAwLCB0ID0+IChpbnQpIHQsIHQgPT4gKEZvcmVpZ25FbnVtKSB0KSwgRm9yZWlnbkVudW0uRm9yZWlnbkJheiwgIkVudW0iKSwKLSAgICAgICAgICAgIG5ldyBGaWVsZENvZGVjVGVzdERhdGE8Rm9yZWlnbk1lc3NhZ2U+KAotICAgICAgICAgICAgICAgIEZpZWxkQ29kZWMuRm9yTWVzc2FnZSgxMDAsIEZvcmVpZ25NZXNzYWdlLlBhcnNlciksIG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAxMCB9LCAiTWVzc2FnZSIpLAotICAgICAgICB9OwotI3ByYWdtYSB3YXJuaW5nIHJlc3RvcmUgMDQxNAotCi0gICAgICAgIFtUZXN0LCBUZXN0Q2FzZVNvdXJjZSgiQ29kZWNzIildCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kVHJpcFdpdGhUYWcoSUNvZGVjVGVzdERhdGEgY29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZGVjLlRlc3RSb3VuZFRyaXBXaXRoVGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdCwgVGVzdENhc2VTb3VyY2UoIkNvZGVjcyIpXQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZFRyaXBSYXcoSUNvZGVjVGVzdERhdGEgY29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZGVjLlRlc3RSb3VuZFRyaXBSYXcoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0LCBUZXN0Q2FzZVNvdXJjZSgiQ29kZWNzIildCi0gICAgICAgIHB1YmxpYyB2b2lkIENhbGN1bGF0ZVNpemUoSUNvZGVjVGVzdERhdGEgY29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZGVjLlRlc3RDYWxjdWxhdGVTaXplV2l0aFRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3QsIFRlc3RDYXNlU291cmNlKCJDb2RlY3MiKV0KLSAgICAgICAgcHVibGljIHZvaWQgRGVmYXVsdFZhbHVlKElDb2RlY1Rlc3REYXRhIGNvZGVjKQotICAgICAgICB7Ci0gICAgICAgICAgICBjb2RlYy5UZXN0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdCwgVGVzdENhc2VTb3VyY2UoIkNvZGVjcyIpXQotICAgICAgICBwdWJsaWMgdm9pZCBGaXhlZFNpemUoSUNvZGVjVGVzdERhdGEgY29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNvZGVjLlRlc3RGaXhlZFNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIFRoaXMgaXMgdWdseSwgYnV0IGl0IG1lYW5zIHdlIGNhbiBoYXZlIGEgbm9uLWdlbmVyaWMgaW50ZXJmYWNlLgotICAgICAgICAvLyBJdCBmZWVscyBsaWtlIE5Vbml0IHNob3VsZCBzdXBwb3J0IHRoaXMgYmV0dGVyLCBidXQgSSBkb24ndCBrbm93Ci0gICAgICAgIC8vIG9mIGFueSBiZXR0ZXIgd2F5cyByaWdodCBub3cuCi0gICAgICAgIHB1YmxpYyBpbnRlcmZhY2UgSUNvZGVjVGVzdERhdGEKLSAgICAgICAgewotICAgICAgICAgICAgdm9pZCBUZXN0Um91bmRUcmlwUmF3KCk7Ci0gICAgICAgICAgICB2b2lkIFRlc3RSb3VuZFRyaXBXaXRoVGFnKCk7Ci0gICAgICAgICAgICB2b2lkIFRlc3RDYWxjdWxhdGVTaXplV2l0aFRhZygpOwotICAgICAgICAgICAgdm9pZCBUZXN0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICB2b2lkIFRlc3RGaXhlZFNpemUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBjbGFzcyBGaWVsZENvZGVjVGVzdERhdGE8VD4gOiBJQ29kZWNUZXN0RGF0YQotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkQ29kZWM8VD4gY29kZWM7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFQgc2FtcGxlVmFsdWU7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBuYW1lOwotCi0gICAgICAgICAgICBwdWJsaWMgRmllbGRDb2RlY1Rlc3REYXRhKEZpZWxkQ29kZWM8VD4gY29kZWMsIFQgc2FtcGxlVmFsdWUsIHN0cmluZyBuYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuY29kZWMgPSBjb2RlYzsKLSAgICAgICAgICAgICAgICB0aGlzLnNhbXBsZVZhbHVlID0gc2FtcGxlVmFsdWU7Ci0gICAgICAgICAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgVGVzdFJvdW5kVHJpcFJhdygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB2YXIgY29kZWRPdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjb2RlYy5WYWx1ZVdyaXRlcihjb2RlZE91dHB1dCwgc2FtcGxlVmFsdWUpOwotICAgICAgICAgICAgICAgIGNvZGVkT3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICB2YXIgY29kZWRJbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHNhbXBsZVZhbHVlLCBjb2RlYy5WYWx1ZVJlYWRlcihjb2RlZElucHV0KSk7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShjb2RlZElucHV0LklzQXRFbmQpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Um91bmRUcmlwV2l0aFRhZygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgICAgICB2YXIgY29kZWRPdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKGNvZGVkT3V0cHV0LCBzYW1wbGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY29kZWRPdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgICAgICBzdHJlYW0uUG9zaXRpb24gPSAwOwotICAgICAgICAgICAgICAgIHZhciBjb2RlZElucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oc3RyZWFtKTsKLSAgICAgICAgICAgICAgICBjb2RlZElucHV0LkFzc2VydE5leHRUYWcoY29kZWMuVGFnKTsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoc2FtcGxlVmFsdWUsIGNvZGVjLlJlYWQoY29kZWRJbnB1dCkpOwotICAgICAgICAgICAgICAgIEFzc2VydC5Jc1RydWUoY29kZWRJbnB1dC5Jc0F0RW5kKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIHZvaWQgVGVzdENhbGN1bGF0ZVNpemVXaXRoVGFnKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgICAgIHZhciBjb2RlZE91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgICAgIGNvZGVjLldyaXRlVGFnQW5kVmFsdWUoY29kZWRPdXRwdXQsIHNhbXBsZVZhbHVlKTsKLSAgICAgICAgICAgICAgICBjb2RlZE91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChzdHJlYW0uUG9zaXRpb24sIGNvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKHNhbXBsZVZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIFRlc3REZWZhdWx0VmFsdWUoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFdyaXRlVGFnQW5kVmFsdWUgaWdub3JlcyBkZWZhdWx0IHZhbHVlcwotICAgICAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICAgICAgdmFyIGNvZGVkT3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShjb2RlZE91dHB1dCwgY29kZWMuRGVmYXVsdFZhbHVlKTsKLSAgICAgICAgICAgICAgICBjb2RlZE91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBzdHJlYW0uUG9zaXRpb24pOwotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBjb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhjb2RlYy5EZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICBpZiAodHlwZW9mKFQpLklzVmFsdWVUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGRlZmF1bHQoVCksIGNvZGVjLkRlZmF1bHRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gVGhlIHBsYWluIFZhbHVlV3JpdGVyL1ZhbHVlUmVhZGVyIGRlbGVnYXRlcyBkb24ndC4KLSAgICAgICAgICAgICAgICBpZiAoY29kZWMuRGVmYXVsdFZhbHVlICE9IG51bGwpIC8vIFRoaXMgcGFydCBpc24ndCBhcHByb3ByaWF0ZSBmb3IgbWVzc2FnZSB0eXBlcy4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVkT3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVjLlZhbHVlV3JpdGVyKGNvZGVkT3V0cHV0LCBjb2RlYy5EZWZhdWx0VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICBjb2RlZE91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwoMCwgc3RyZWFtLlBvc2l0aW9uKTsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHN0cmVhbS5Qb3NpdGlvbiwgY29kZWMuVmFsdWVTaXplQ2FsY3VsYXRvcihjb2RlYy5EZWZhdWx0VmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGNvZGVkSW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY29kZWMuRGVmYXVsdFZhbHVlLCBjb2RlYy5WYWx1ZVJlYWRlcihjb2RlZElucHV0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Rml4ZWRTaXplKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmFtZS5Db250YWlucygiRml4ZWQiKSwgY29kZWMuRml4ZWRTaXplICE9IDApOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0dlbmVyYXRlZE1lc3NhZ2VUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMDI5NTUxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw3MjMgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3M7Ci11c2luZyBOVW5pdC5GcmFtZXdvcms7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUZXN0cyBhcm91bmQgdGhlIGdlbmVyYXRlZCBUZXN0QWxsVHlwZXMgbWVzc2FnZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlVGVzdAotICAgIHsKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVtcHR5TWVzc2FnZUZpZWxkRGlzdGluY3RGcm9tTWlzc2luZ01lc3NhZ2VGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoaXMgZGVtb25zdHJhdGVzIHdoYXQgd2UncmUgcmVhbGx5IGludGVyZXN0ZWQgaW4uLi4KLSAgICAgICAgICAgIHZhciBtZXNzYWdlMSA9IG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVGb3JlaWduTWVzc2FnZSA9IG5ldyBGb3JlaWduTWVzc2FnZSgpIH07Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZTIgPSBuZXcgVGVzdEFsbFR5cGVzKCk7IC8vIFNpbmdsZUZvcmVpZ25NZXNzYWdlIGlzIG51bGwKLSAgICAgICAgICAgIEVxdWFsaXR5VGVzdGVyLkFzc2VydEluZXF1YWxpdHkobWVzc2FnZTEsIG1lc3NhZ2UyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBEZWZhdWx0VmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2luZ2xlIGZpZWxkcwotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmFsc2UsIG1lc3NhZ2UuU2luZ2xlQm9vbCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5FbXB0eSwgbWVzc2FnZS5TaW5nbGVCeXRlcyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMC4wLCBtZXNzYWdlLlNpbmdsZURvdWJsZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5TaW5nbGVGaXhlZDMyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwTCwgbWVzc2FnZS5TaW5nbGVGaXhlZDY0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLjBmLCBtZXNzYWdlLlNpbmdsZUZsb2F0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduRW51bS5Gb3JlaWduVW5zcGVjaWZpZWQsIG1lc3NhZ2UuU2luZ2xlRm9yZWlnbkVudW0pOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLlNpbmdsZUZvcmVpZ25NZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChJbXBvcnRFbnVtLlVuc3BlY2lmaWVkLCBtZXNzYWdlLlNpbmdsZUltcG9ydEVudW0pOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLlNpbmdsZUltcG9ydE1lc3NhZ2UpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuU2luZ2xlSW50MzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBMLCBtZXNzYWdlLlNpbmdsZUludDY0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5VbnNwZWNpZmllZCwgbWVzc2FnZS5TaW5nbGVOZXN0ZWRFbnVtKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5TaW5nbGVOZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5TaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlNpbmdsZVNmaXhlZDMyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwTCwgbWVzc2FnZS5TaW5nbGVTZml4ZWQ2NCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5TaW5nbGVTaW50MzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBMLCBtZXNzYWdlLlNpbmdsZVNpbnQ2NCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIG1lc3NhZ2UuU2luZ2xlU3RyaW5nKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwVSwgbWVzc2FnZS5TaW5nbGVVaW50MzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBVTCwgbWVzc2FnZS5TaW5nbGVVaW50NjQpOwotCi0gICAgICAgICAgICAvLyBSZXBlYXRlZCBmaWVsZHMKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkQm9vbC5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEJ5dGVzLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkRG91YmxlLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkRml4ZWQzMi5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEZpeGVkNjQuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRGbG9hdC5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZEZvcmVpZ25FbnVtLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRJbXBvcnRFbnVtLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkSW1wb3J0TWVzc2FnZS5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZE5lc3RlZEVudW0uQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZS5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWVzc2FnZS5SZXBlYXRlZFNmaXhlZDMyLkNvdW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLlJlcGVhdGVkU2ZpeGVkNjQuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRTaW50MzIuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRTaW50NjQuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRTdHJpbmcuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRVaW50MzIuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuUmVwZWF0ZWRVaW50NjQuQ291bnQpOwotCi0gICAgICAgICAgICAvLyBPbmVvZiBmaWVsZHMKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lLCBtZXNzYWdlLk9uZW9mRmllbGRDYXNlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLk9uZW9mVWludDMyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiIiwgbWVzc2FnZS5PbmVvZlN0cmluZyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5FbXB0eSwgbWVzc2FnZS5PbmVvZkJ5dGVzKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5PbmVvZk5lc3RlZE1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE51bGxTdHJpbmdBbmRCeXRlc1JlamVjdGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbWVzc2FnZS5TaW5nbGVTdHJpbmcgPSBudWxsKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBtZXNzYWdlLk9uZW9mU3RyaW5nID0gbnVsbCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbWVzc2FnZS5TaW5nbGVCeXRlcyA9IG51bGwpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IG1lc3NhZ2UuT25lb2ZCeXRlcyA9IG51bGwpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kVHJpcF9FbXB0eSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgLy8gV2l0aG91dCBzZXR0aW5nIGFueSB2YWx1ZXMsIHRoZXJlJ3Mgbm90aGluZyB0byB3cml0ZS4KLSAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG1lc3NhZ2UuVG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBieXRlcy5MZW5ndGgpOwotICAgICAgICAgICAgVGVzdEFsbFR5cGVzIHBhcnNlZCA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VGcm9tKGJ5dGVzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBwYXJzZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJvdW5kVHJpcF9TaW5nbGVWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTaW5nbGVCb29sID0gdHJ1ZSwKLSAgICAgICAgICAgICAgICBTaW5nbGVCeXRlcyA9IEJ5dGVTdHJpbmcuQ29weUZyb20oMSwgMiwgMywgNCksCi0gICAgICAgICAgICAgICAgU2luZ2xlRG91YmxlID0gMjMuNSwKLSAgICAgICAgICAgICAgICBTaW5nbGVGaXhlZDMyID0gMjMsCi0gICAgICAgICAgICAgICAgU2luZ2xlRml4ZWQ2NCA9IDEyMzQ1Njc4OTAxMjMsCi0gICAgICAgICAgICAgICAgU2luZ2xlRmxvYXQgPSAxMi4yNWYsCi0gICAgICAgICAgICAgICAgU2luZ2xlRm9yZWlnbkVudW0gPSBGb3JlaWduRW51bS5Gb3JlaWduQmFyLAotICAgICAgICAgICAgICAgIFNpbmdsZUZvcmVpZ25NZXNzYWdlID0gbmV3IEZvcmVpZ25NZXNzYWdlIHsgQyA9IDEwIH0sCi0gICAgICAgICAgICAgICAgU2luZ2xlSW1wb3J0RW51bSA9IEltcG9ydEVudW0uSW1wb3J0QmF6LAotICAgICAgICAgICAgICAgIFNpbmdsZUltcG9ydE1lc3NhZ2UgPSBuZXcgSW1wb3J0TWVzc2FnZSB7IEQgPSAyMCB9LAotICAgICAgICAgICAgICAgIFNpbmdsZUludDMyID0gMTAwLAotICAgICAgICAgICAgICAgIFNpbmdsZUludDY0ID0gMzIxMDk4NzY1NDMyMSwKLSAgICAgICAgICAgICAgICBTaW5nbGVOZXN0ZWRFbnVtID0gVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRm9vLAotICAgICAgICAgICAgICAgIFNpbmdsZU5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgeyBCYiA9IDM1IH0sCi0gICAgICAgICAgICAgICAgU2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZSA9IG5ldyBQdWJsaWNJbXBvcnRNZXNzYWdlIHsgRSA9IDU0IH0sCi0gICAgICAgICAgICAgICAgU2luZ2xlU2ZpeGVkMzIgPSAtMTIzLAotICAgICAgICAgICAgICAgIFNpbmdsZVNmaXhlZDY0ID0gLTEyMzQ1Njc4OTAxMjM0LAotICAgICAgICAgICAgICAgIFNpbmdsZVNpbnQzMiA9IC00NTYsCi0gICAgICAgICAgICAgICAgU2luZ2xlU2ludDY0ID0gLTEyMzQ1Njc4OTAxMjM1LAotICAgICAgICAgICAgICAgIFNpbmdsZVN0cmluZyA9ICJ0ZXN0IiwKLSAgICAgICAgICAgICAgICBTaW5nbGVVaW50MzIgPSB1aW50Lk1heFZhbHVlLAotICAgICAgICAgICAgICAgIFNpbmdsZVVpbnQ2NCA9IHVsb25nLk1heFZhbHVlCi0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBUZXN0QWxsVHlwZXMgcGFyc2VkID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUZyb20oYnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIHBhcnNlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUm91bmRUcmlwX1JlcGVhdGVkVmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVwZWF0ZWRCb29sID0geyB0cnVlLCBmYWxzZSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkQnl0ZXMgPSB7IEJ5dGVTdHJpbmcuQ29weUZyb20oMSwgMiwgMywgNCksIEJ5dGVTdHJpbmcuQ29weUZyb20oNSwgNikgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZERvdWJsZSA9IHsgLTEyLjI1LCAyMy41IH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRGaXhlZDMyID0geyB1aW50Lk1heFZhbHVlLCAyMyB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkRml4ZWQ2NCA9IHsgdWxvbmcuTWF4VmFsdWUsIDEyMzQ1Njc4OTAxMjMgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEZsb2F0ID0geyAxMDBmLCAxMi4yNWYgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEZvcmVpZ25FbnVtID0geyBGb3JlaWduRW51bS5Gb3JlaWduRm9vLCBGb3JlaWduRW51bS5Gb3JlaWduQmFyIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSA9IHsgbmV3IEZvcmVpZ25NZXNzYWdlKCksIG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAxMCB9IH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRJbXBvcnRFbnVtID0geyBJbXBvcnRFbnVtLkltcG9ydEJheiwgSW1wb3J0RW51bS5VbnNwZWNpZmllZCB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkSW1wb3J0TWVzc2FnZSA9IHsgbmV3IEltcG9ydE1lc3NhZ2UgeyBEID0gMjAgfSwgbmV3IEltcG9ydE1lc3NhZ2UgeyBEID0gMjUgfSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkSW50MzIgPSB7IDEwMCwgMjAwIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRJbnQ2NCA9IHsgMzIxMDk4NzY1NDMyMSwgbG9uZy5NYXhWYWx1ZSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkTmVzdGVkRW51bSA9IHsgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRm9vLCBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5OZWcgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgPSB7IG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB7IEJiID0gMzUgfSwgbmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHsgQmIgPSAxMCB9IH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlID0geyBuZXcgUHVibGljSW1wb3J0TWVzc2FnZSB7IEUgPSA1NCB9LCBuZXcgUHVibGljSW1wb3J0TWVzc2FnZSB7IEUgPSAtMSB9IH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRTZml4ZWQzMiA9IHsgLTEyMywgMTIzIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRTZml4ZWQ2NCA9IHsgLTEyMzQ1Njc4OTAxMjM0LCAxMjM0NTY3ODkwMTIzNCB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkU2ludDMyID0geyAtNDU2LCAxMDAgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZFNpbnQ2NCA9IHsgLTEyMzQ1Njc4OTAxMjM1LCAxMjMgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZFN0cmluZyA9IHsgImZvbyIsICJiYXIiIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRVaW50MzIgPSB7IHVpbnQuTWF4VmFsdWUsIHVpbnQuTWluVmFsdWUgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZFVpbnQ2NCA9IHsgdWxvbmcuTWF4VmFsdWUsIHVpbnQuTWluVmFsdWUgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbWVzc2FnZS5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgVGVzdEFsbFR5cGVzIHBhcnNlZCA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VGcm9tKGJ5dGVzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBwYXJzZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90ZSB0aGF0IG5vdCBldmVyeSBtYXAgd2l0aGluIG1hcF91bml0dGVzdF9wcm90bzMgaXMgdXNlZC4gVGhleSBhbGwgZ28gdGhyb3VnaCB2ZXJ5Ci0gICAgICAgIC8vIHNpbWlsYXIgY29kZSBwYXRocy4gVGhlIGZhY3QgdGhhdCBhbGwgbWFwcyBhcmUgcHJlc2VudCBpcyB2YWxpZGF0aW9uIHRoYXQgd2UgaGF2ZSBjb2RlY3MKLSAgICAgICAgLy8gZm9yIGV2ZXJ5IHR5cGUuCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBSb3VuZFRyaXBfTWFwcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RNYXAKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNYXBCb29sQm9vbCA9IHsKLSAgICAgICAgICAgICAgICAgICAgeyBmYWxzZSwgdHJ1ZSB9LAotICAgICAgICAgICAgICAgICAgICB7IHRydWUsIGZhbHNlIH0KLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIE1hcEludDMyQnl0ZXMgPSB7Ci0gICAgICAgICAgICAgICAgICAgIHsgNSwgQnl0ZVN0cmluZy5Db3B5RnJvbSg2LCA3LCA4KSB9LAotICAgICAgICAgICAgICAgICAgICB7IDI1LCBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMsIDQsIDUpIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgMTAsIEJ5dGVTdHJpbmcuRW1wdHkgfQotICAgICAgICAgICAgICAgIH0sCi0gICAgICAgICAgICAgICAgTWFwSW50MzJGb3JlaWduTWVzc2FnZSA9IHsKLSAgICAgICAgICAgICAgICAgICAgeyAwLCBuZXcgRm9yZWlnbk1lc3NhZ2UgeyBDID0gMTAgfSB9LAotICAgICAgICAgICAgICAgICAgICB7IDUsIG5ldyBGb3JlaWduTWVzc2FnZSgpIH0sCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICBNYXBJbnQzMkVudW0gPSB7Ci0gICAgICAgICAgICAgICAgICAgIHsgMSwgTWFwRW51bS5CYXIgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAyMDAwLCBNYXBFbnVtLkZvbyB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbWVzc2FnZS5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgVGVzdE1hcCBwYXJzZWQgPSBUZXN0TWFwLlBhcnNlci5QYXJzZUZyb20oYnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIHBhcnNlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTWFwV2l0aEVtcHR5RW50cnkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0TWFwCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWFwSW50MzJCeXRlcyA9IHsgeyAwLCBCeXRlU3RyaW5nLkVtcHR5IH0gfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbWVzc2FnZS5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGJ5dGVzLkxlbmd0aCk7IC8vIFRhZyBmb3IgZmllbGQgZW50cnkgKDEgYnl0ZSksIGxlbmd0aCBvZiBlbnRyeSAoMDsgMSBieXRlKQotCi0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdE1hcC5QYXJzZXIuUGFyc2VGcm9tKGJ5dGVzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBwYXJzZWQuTWFwSW50MzJCeXRlcy5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5FbXB0eSwgcGFyc2VkLk1hcEludDMyQnl0ZXNbMF0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hcFdpdGhPbmx5VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIYW5kLWNyYWZ0IHRoZSBzdHJlYW0gdG8gY29udGFpbiBhIHNpbmdsZSBlbnRyeSB3aXRoIGp1c3QgYSB2YWx1ZS4KLSAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKG1lbW9yeVN0cmVhbSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoVGVzdE1hcC5NYXBJbnQzMkZvcmVpZ25NZXNzYWdlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIHZhciBuZXN0ZWRNZXNzYWdlID0gbmV3IEZvcmVpZ25NZXNzYWdlIHsgQyA9IDIwIH07Ci0gICAgICAgICAgICAvLyBTaXplIG9mIHRoZSBlbnRyeSAodGFnLCBzaXplIHdyaXR0ZW4gYnkgV3JpdGVNZXNzYWdlLCBkYXRhIHdyaXR0ZW4gYnkgV3JpdGVNZXNzYWdlKQotICAgICAgICAgICAgb3V0cHV0LldyaXRlTGVuZ3RoKDIgKyBuZXN0ZWRNZXNzYWdlLkNhbGN1bGF0ZVNpemUoKSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMiwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShuZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotCi0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdE1hcC5QYXJzZXIuUGFyc2VGcm9tKG1lbW9yeVN0cmVhbS5Ub0FycmF5KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5lc3RlZE1lc3NhZ2UsIHBhcnNlZC5NYXBJbnQzMkZvcmVpZ25NZXNzYWdlWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBNYXBXaXRoT25seUtleV9QcmltaXRpdmVWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEhhbmQtY3JhZnQgdGhlIHN0cmVhbSB0byBjb250YWluIGEgc2luZ2xlIGVudHJ5IHdpdGgganVzdCBhIGtleS4KLSAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKG1lbW9yeVN0cmVhbSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoVGVzdE1hcC5NYXBJbnQzMkRvdWJsZUZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICBpbnQga2V5ID0gMTA7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVMZW5ndGgoMSArIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoa2V5KSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoa2V5KTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotCi0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdE1hcC5QYXJzZXIuUGFyc2VGcm9tKG1lbW9yeVN0cmVhbS5Ub0FycmF5KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAuMCwgcGFyc2VkLk1hcEludDMyRG91YmxlW2tleV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hcFdpdGhPbmx5S2V5X01lc3NhZ2VWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEhhbmQtY3JhZnQgdGhlIHN0cmVhbSB0byBjb250YWluIGEgc2luZ2xlIGVudHJ5IHdpdGgganVzdCBhIGtleS4KLSAgICAgICAgICAgIHZhciBtZW1vcnlTdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKG1lbW9yeVN0cmVhbSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoVGVzdE1hcC5NYXBJbnQzMkZvcmVpZ25NZXNzYWdlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIGludCBrZXkgPSAxMDsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUxlbmd0aCgxICsgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShrZXkpKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihrZXkpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0KLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBUZXN0TWFwLlBhcnNlci5QYXJzZUZyb20obWVtb3J5U3RyZWFtLlRvQXJyYXkoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IEZvcmVpZ25NZXNzYWdlKCksIHBhcnNlZC5NYXBJbnQzMkZvcmVpZ25NZXNzYWdlW2tleV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hcElnbm9yZXNFeHRyYUZpZWxkc1dpdGhpbkVudHJ5TWVzc2FnZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBIYW5kLWNyYWZ0IHRoZSBzdHJlYW0gdG8gY29udGFpbiBhIHNpbmdsZSBlbnRyeSB3aXRoIHRocmVlIGZpZWxkcwotICAgICAgICAgICAgdmFyIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0obWVtb3J5U3RyZWFtKTsKLQotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKFRlc3RNYXAuTWFwSW50MzJJbnQzMkZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0KLSAgICAgICAgICAgIHZhciBrZXkgPSAxMDsgLy8gRmllbGQgMSAKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IDIwOyAvLyBGaWVsZCAyCi0gICAgICAgICAgICB2YXIgZXh0cmEgPSAzMDsgLy8gRmllbGQgMwotCi0gICAgICAgICAgICAvLyBFYWNoIGZpZWxkIGNhbiBiZSByZXByZXNlbnRlZCBpbiBhIHNpbmdsZSBieXRlLCB3aXRoIGEgc2luZ2xlIGJ5dGUgdGFnLgotICAgICAgICAgICAgLy8gVG90YWwgbWVzc2FnZSBzaXplOiA2IGJ5dGVzLgotICAgICAgICAgICAgb3V0cHV0LldyaXRlTGVuZ3RoKDYpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKGtleSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMiwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIodmFsdWUpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDMsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKGV4dHJhKTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotCi0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdE1hcC5QYXJzZXIuUGFyc2VGcm9tKG1lbW9yeVN0cmVhbS5Ub0FycmF5KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHZhbHVlLCBwYXJzZWQuTWFwSW50MzJJbnQzMltrZXldKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBNYXBGaWVsZE9yZGVySXNJcnJlbGV2YW50KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0obWVtb3J5U3RyZWFtKTsKLQotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKFRlc3RNYXAuTWFwSW50MzJJbnQzMkZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0KLSAgICAgICAgICAgIHZhciBrZXkgPSAxMDsKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IDIwOwotCi0gICAgICAgICAgICAvLyBFYWNoIGZpZWxkIGNhbiBiZSByZXByZXNlbnRlZCBpbiBhIHNpbmdsZSBieXRlLCB3aXRoIGEgc2luZ2xlIGJ5dGUgdGFnLgotICAgICAgICAgICAgLy8gVG90YWwgbWVzc2FnZSBzaXplOiA0IGJ5dGVzLgotICAgICAgICAgICAgb3V0cHV0LldyaXRlTGVuZ3RoKDQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKHZhbHVlKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihrZXkpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0KLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBUZXN0TWFwLlBhcnNlci5QYXJzZUZyb20obWVtb3J5U3RyZWFtLlRvQXJyYXkoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIHBhcnNlZC5NYXBJbnQzMkludDMyW2tleV0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hcE5vbkNvbnRpZ3VvdXNFbnRyaWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lbW9yeVN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0obWVtb3J5U3RyZWFtKTsKLQotICAgICAgICAgICAgLy8gTWVzc2FnZSBzdHJ1Y3R1cmU6Ci0gICAgICAgICAgICAvLyBFbnRyeSBmb3IgTWFwSW50MzJJbnQzMgotICAgICAgICAgICAgLy8gRW50cnkgZm9yIE1hcFN0cmluZ1N0cmluZwotICAgICAgICAgICAgLy8gRW50cnkgZm9yIE1hcEludDMySW50MzIKLQotICAgICAgICAgICAgLy8gRmlyc3QgZW50cnkKLSAgICAgICAgICAgIHZhciBrZXkxID0gMTA7Ci0gICAgICAgICAgICB2YXIgdmFsdWUxID0gMjA7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoVGVzdE1hcC5NYXBJbnQzMkludDMyRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUxlbmd0aCg0KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihrZXkxKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMih2YWx1ZTEpOwotCi0gICAgICAgICAgICAvLyBTZWNvbmQgZW50cnkKLSAgICAgICAgICAgIHZhciBrZXkyID0gImEiOwotICAgICAgICAgICAgdmFyIHZhbHVlMiA9ICJiIjsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyhUZXN0TWFwLk1hcFN0cmluZ1N0cmluZ0ZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVMZW5ndGgoNik7IC8vIDMgYnl0ZXMgcGVyIGVudHJ5OiB0YWcsIHNpemUsIGNoYXJhY3RlcgotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhrZXkyKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcodmFsdWUyKTsKLQotICAgICAgICAgICAgLy8gVGhpcmQgZW50cnkKLSAgICAgICAgICAgIHZhciBrZXkzID0gMTU7Ci0gICAgICAgICAgICB2YXIgdmFsdWUzID0gMjU7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoVGVzdE1hcC5NYXBJbnQzMkludDMyRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUxlbmd0aCg0KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihrZXkzKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygyLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMih2YWx1ZTMpOwotCi0gICAgICAgICAgICBvdXRwdXQuRmx1c2goKTsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBUZXN0TWFwLlBhcnNlci5QYXJzZUZyb20obWVtb3J5U3RyZWFtLlRvQXJyYXkoKSk7Ci0gICAgICAgICAgICB2YXIgZXhwZWN0ZWQgPSBuZXcgVGVzdE1hcAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE1hcEludDMySW50MzIgPSB7IHsga2V5MSwgdmFsdWUxIH0sIHsga2V5MywgdmFsdWUzIH0gfSwKLSAgICAgICAgICAgICAgICBNYXBTdHJpbmdTdHJpbmcgPSB7IHsga2V5MiwgdmFsdWUyIH0gfQotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgcGFyc2VkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBEdXBsaWNhdGVLZXlzX0xhc3RFbnRyeVdpbnMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVtb3J5U3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShtZW1vcnlTdHJlYW0pOwotCi0gICAgICAgICAgICB2YXIga2V5ID0gMTA7Ci0gICAgICAgICAgICB2YXIgdmFsdWUxID0gMjA7Ci0gICAgICAgICAgICB2YXIgdmFsdWUyID0gMzA7Ci0KLSAgICAgICAgICAgIC8vIEZpcnN0IGVudHJ5Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoVGVzdE1hcC5NYXBJbnQzMkludDMyRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUxlbmd0aCg0KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZygxLCBXaXJlRm9ybWF0LldpcmVUeXBlLlZhcmludCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihrZXkpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKHZhbHVlMSk7Ci0KLSAgICAgICAgICAgIC8vIFNlY29uZCBlbnRyeSAtIHNhbWUga2V5LCBkaWZmZXJlbnQgdmFsdWUKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyhUZXN0TWFwLk1hcEludDMySW50MzJGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlTGVuZ3RoKDQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKGtleSk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMiwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIodmFsdWUyKTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotCi0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdE1hcC5QYXJzZXIuUGFyc2VGcm9tKG1lbW9yeVN0cmVhbS5Ub0FycmF5KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKHZhbHVlMiwgcGFyc2VkLk1hcEludDMySW50MzJba2V5XSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xvbmVTaW5nbGVOb25NZXNzYWdlVmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG9yaWdpbmFsID0gbmV3IFRlc3RBbGxUeXBlcwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNpbmdsZUJvb2wgPSB0cnVlLAotICAgICAgICAgICAgICAgIFNpbmdsZUJ5dGVzID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzLCA0KSwKLSAgICAgICAgICAgICAgICBTaW5nbGVEb3VibGUgPSAyMy41LAotICAgICAgICAgICAgICAgIFNpbmdsZUZpeGVkMzIgPSAyMywKLSAgICAgICAgICAgICAgICBTaW5nbGVGaXhlZDY0ID0gMTIzNDU2Nzg5MDEyMywKLSAgICAgICAgICAgICAgICBTaW5nbGVGbG9hdCA9IDEyLjI1ZiwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbnQzMiA9IDEwMCwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbnQ2NCA9IDMyMTA5ODc2NTQzMjEsCi0gICAgICAgICAgICAgICAgU2luZ2xlTmVzdGVkRW51bSA9IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZvbywKLSAgICAgICAgICAgICAgICBTaW5nbGVTZml4ZWQzMiA9IC0xMjMsCi0gICAgICAgICAgICAgICAgU2luZ2xlU2ZpeGVkNjQgPSAtMTIzNDU2Nzg5MDEyMzQsCi0gICAgICAgICAgICAgICAgU2luZ2xlU2ludDMyID0gLTQ1NiwKLSAgICAgICAgICAgICAgICBTaW5nbGVTaW50NjQgPSAtMTIzNDU2Nzg5MDEyMzUsCi0gICAgICAgICAgICAgICAgU2luZ2xlU3RyaW5nID0gInRlc3QiLAotICAgICAgICAgICAgICAgIFNpbmdsZVVpbnQzMiA9IHVpbnQuTWF4VmFsdWUsCi0gICAgICAgICAgICAgICAgU2luZ2xlVWludDY0ID0gdWxvbmcuTWF4VmFsdWUKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB2YXIgY2xvbmUgPSBvcmlnaW5hbC5DbG9uZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChvcmlnaW5hbCwgY2xvbmUpOwotICAgICAgICAgICAgLy8gSnVzdCBhcyBhIHNpbmdsZSBleGFtcGxlCi0gICAgICAgICAgICBjbG9uZS5TaW5nbGVJbnQzMiA9IDE1MDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChvcmlnaW5hbCwgY2xvbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsb25lUmVwZWF0ZWROb25NZXNzYWdlVmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG9yaWdpbmFsID0gbmV3IFRlc3RBbGxUeXBlcwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlcGVhdGVkQm9vbCA9IHsgdHJ1ZSwgZmFsc2UgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEJ5dGVzID0geyBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMsIDQpLCBCeXRlU3RyaW5nLkNvcHlGcm9tKDUsIDYpIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWREb3VibGUgPSB7IC0xMi4yNSwgMjMuNSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkRml4ZWQzMiA9IHsgdWludC5NYXhWYWx1ZSwgMjMgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEZpeGVkNjQgPSB7IHVsb25nLk1heFZhbHVlLCAxMjM0NTY3ODkwMTIzIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRGbG9hdCA9IHsgMTAwZiwgMTIuMjVmIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRJbnQzMiA9IHsgMTAwLCAyMDAgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEludDY0ID0geyAzMjEwOTg3NjU0MzIxLCBsb25nLk1heFZhbHVlIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWROZXN0ZWRFbnVtID0geyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bS5Gb28sIFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLk5lZyB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkU2ZpeGVkMzIgPSB7IC0xMjMsIDEyMyB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkU2ZpeGVkNjQgPSB7IC0xMjM0NTY3ODkwMTIzNCwgMTIzNDU2Nzg5MDEyMzQgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZFNpbnQzMiA9IHsgLTQ1NiwgMTAwIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRTaW50NjQgPSB7IC0xMjM0NTY3ODkwMTIzNSwgMTIzIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRTdHJpbmcgPSB7ICJmb28iLCAiYmFyIiB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkVWludDMyID0geyB1aW50Lk1heFZhbHVlLCB1aW50Lk1pblZhbHVlIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRVaW50NjQgPSB7IHVsb25nLk1heFZhbHVlLCB1aW50Lk1pblZhbHVlIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHZhciBjbG9uZSA9IG9yaWdpbmFsLkNsb25lKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlTm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG9yaWdpbmFsLCBjbG9uZSk7Ci0gICAgICAgICAgICAvLyBKdXN0IGFzIGEgc2luZ2xlIGV4YW1wbGUKLSAgICAgICAgICAgIGNsb25lLlJlcGVhdGVkRG91YmxlLkFkZCgyNS41KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChvcmlnaW5hbCwgY2xvbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsb25lU2luZ2xlTWVzc2FnZUZpZWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG9yaWdpbmFsID0gbmV3IFRlc3RBbGxUeXBlcwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNpbmdsZU5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgeyBCYiA9IDIwIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHZhciBjbG9uZSA9IG9yaWdpbmFsLkNsb25lKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlTm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdFNhbWUob3JpZ2luYWwuU2luZ2xlTmVzdGVkTWVzc2FnZSwgY2xvbmUuU2luZ2xlTmVzdGVkTWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwob3JpZ2luYWwsIGNsb25lKTsKLQotICAgICAgICAgICAgY2xvbmUuU2luZ2xlTmVzdGVkTWVzc2FnZS5CYiA9IDMwOwotICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdEVxdWFsKG9yaWdpbmFsLCBjbG9uZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xvbmVSZXBlYXRlZE1lc3NhZ2VGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBvcmlnaW5hbCA9IG5ldyBUZXN0QWxsVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgPSB7IG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB7IEJiID0gMjAgfSB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICB2YXIgY2xvbmUgPSBvcmlnaW5hbC5DbG9uZSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZU5vdFNhbWUob3JpZ2luYWwsIGNsb25lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVOb3RTYW1lKG9yaWdpbmFsLlJlcGVhdGVkTmVzdGVkTWVzc2FnZSwgY2xvbmUuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVOb3RTYW1lKG9yaWdpbmFsLlJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXSwgY2xvbmUuUmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzBdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChvcmlnaW5hbCwgY2xvbmUpOwotCi0gICAgICAgICAgICBjbG9uZS5SZXBlYXRlZE5lc3RlZE1lc3NhZ2VbMF0uQmIgPSAzMDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVOb3RFcXVhbChvcmlnaW5hbCwgY2xvbmUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsb25lT25lb2ZGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBvcmlnaW5hbCA9IG5ldyBUZXN0QWxsVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPbmVvZk5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgeyBCYiA9IDIwIH0KLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHZhciBjbG9uZSA9IG9yaWdpbmFsLkNsb25lKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlTm90U2FtZShvcmlnaW5hbCwgY2xvbmUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG9yaWdpbmFsLCBjbG9uZSk7Ci0KLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBoYXZlIGNsb25lZCB0aGUgbWVzc2FnZQotICAgICAgICAgICAgb3JpZ2luYWwuT25lb2ZOZXN0ZWRNZXNzYWdlLkJiID0gMzA7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwob3JpZ2luYWwsIGNsb25lKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBPbmVvZlByb3BlcnRpZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTd2l0Y2ggdGhlIG9uZW9mIGNhc2UgYmV0d2VlbiBlYWNoIG9mIHRoZSBkaWZmZXJlbnQgb3B0aW9ucywgYW5kIGNoZWNrIGV2ZXJ5dGhpbmcgYmVoYXZlcwotICAgICAgICAgICAgLy8gYXMgZXhwZWN0ZWQgaW4gZWFjaCBjYXNlLgotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIG1lc3NhZ2UuT25lb2ZTdHJpbmcpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuT25lb2ZVaW50MzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJ5dGVTdHJpbmcuRW1wdHksIG1lc3NhZ2UuT25lb2ZCeXRlcyk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG1lc3NhZ2UuT25lb2ZOZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lLCBtZXNzYWdlLk9uZW9mRmllbGRDYXNlKTsKLQotICAgICAgICAgICAgbWVzc2FnZS5PbmVvZlN0cmluZyA9ICJzYW1wbGUiOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJzYW1wbGUiLCBtZXNzYWdlLk9uZW9mU3RyaW5nKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLk9uZW9mVWludDMyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChCeXRlU3RyaW5nLkVtcHR5LCBtZXNzYWdlLk9uZW9mQnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLk9uZW9mTmVzdGVkTWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLk9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZTdHJpbmcsIG1lc3NhZ2UuT25lb2ZGaWVsZENhc2UpOwotCi0gICAgICAgICAgICB2YXIgYnl0ZXMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMpOwotICAgICAgICAgICAgbWVzc2FnZS5PbmVvZkJ5dGVzID0gYnl0ZXM7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIG1lc3NhZ2UuT25lb2ZTdHJpbmcpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIG1lc3NhZ2UuT25lb2ZVaW50MzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGJ5dGVzLCBtZXNzYWdlLk9uZW9mQnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLk9uZW9mTmVzdGVkTWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLk9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlcywgbWVzc2FnZS5PbmVvZkZpZWxkQ2FzZSk7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2UuT25lb2ZVaW50MzIgPSAyMDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiIiwgbWVzc2FnZS5PbmVvZlN0cmluZyk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMjAsIG1lc3NhZ2UuT25lb2ZVaW50MzIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJ5dGVTdHJpbmcuRW1wdHksIG1lc3NhZ2UuT25lb2ZCeXRlcyk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG1lc3NhZ2UuT25lb2ZOZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlVpbnQzMiwgbWVzc2FnZS5PbmVvZkZpZWxkQ2FzZSk7Ci0KLSAgICAgICAgICAgIHZhciBuZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHsgQmIgPSAyNSB9OwotICAgICAgICAgICAgbWVzc2FnZS5PbmVvZk5lc3RlZE1lc3NhZ2UgPSBuZXN0ZWRNZXNzYWdlOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBtZXNzYWdlLk9uZW9mU3RyaW5nKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLk9uZW9mVWludDMyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChCeXRlU3RyaW5nLkVtcHR5LCBtZXNzYWdlLk9uZW9mQnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5lc3RlZE1lc3NhZ2UsIG1lc3NhZ2UuT25lb2ZOZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZk5lc3RlZE1lc3NhZ2UsIG1lc3NhZ2UuT25lb2ZGaWVsZENhc2UpOwotCi0gICAgICAgICAgICBtZXNzYWdlLkNsZWFyT25lb2ZGaWVsZCgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCIiLCBtZXNzYWdlLk9uZW9mU3RyaW5nKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBtZXNzYWdlLk9uZW9mVWludDMyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChCeXRlU3RyaW5nLkVtcHR5LCBtZXNzYWdlLk9uZW9mQnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLk9uZW9mTmVzdGVkTWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLk9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZSwgbWVzc2FnZS5PbmVvZkZpZWxkQ2FzZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgT25lb2ZfRGVmYXVsdFZhbHVlc05vdEVxdWFsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UxID0gbmV3IFRlc3RBbGxUeXBlcyB7IE9uZW9mU3RyaW5nID0gIiIgfTsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlMiA9IG5ldyBUZXN0QWxsVHlwZXMgeyBPbmVvZlVpbnQzMiA9IDAgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZywgbWVzc2FnZTEuT25lb2ZGaWVsZENhc2UpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5PbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyLCBtZXNzYWdlMi5PbmVvZkZpZWxkQ2FzZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlTm90RXF1YWwobWVzc2FnZTEsIG1lc3NhZ2UyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBPbmVvZlNlcmlhbGl6YXRpb25fTm9uRGVmYXVsdFZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICBtZXNzYWdlLk9uZW9mU3RyaW5nID0gInRoaXMgd291bGQgdGFrZSBhIGJpdCBvZiBzcGFjZSI7Ci0gICAgICAgICAgICBtZXNzYWdlLk9uZW9mVWludDMyID0gMTA7Ci0gICAgICAgICAgICB2YXIgYnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMywgYnl0ZXMuTGVuZ3RoKTsgLy8gMiBieXRlcyBmb3IgdGhlIHRhZyArIDEgZm9yIHRoZSB2YWx1ZSAtIG5vIHN0cmluZyEKLQotICAgICAgICAgICAgdmFyIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUZyb20oYnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIG1lc3NhZ2UyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlVpbnQzMiwgbWVzc2FnZTIuT25lb2ZGaWVsZENhc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9uZW9mU2VyaWFsaXphdGlvbl9EZWZhdWx0VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMoKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuT25lb2ZTdHJpbmcgPSAidGhpcyB3b3VsZCB0YWtlIGEgYml0IG9mIHNwYWNlIjsKLSAgICAgICAgICAgIG1lc3NhZ2UuT25lb2ZVaW50MzIgPSAwOyAvLyBUaGlzIGlzIHRoZSBkZWZhdWx0IHZhbHVlIGZvciBVSW50MzI7IG5vcm1hbGx5IHdvdWxkbid0IGJlIHNlcmlhbGl6ZWQKLSAgICAgICAgICAgIHZhciBieXRlcyA9IG1lc3NhZ2UuVG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCBieXRlcy5MZW5ndGgpOyAvLyAyIGJ5dGVzIGZvciB0aGUgdGFnICsgMSBmb3IgdGhlIHZhbHVlIC0gaXQncyBzdGlsbCBzZXJpYWxpemVkCi0KLSAgICAgICAgICAgIHZhciBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VGcm9tKGJ5dGVzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBtZXNzYWdlMik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLk9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZVaW50MzIsIG1lc3NhZ2UyLk9uZW9mRmllbGRDYXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJZ25vcmVVbmtub3duRmllbGRzX1JlYWxEYXRhU3RpbGxSZWFkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpOwotICAgICAgICAgICAgdmFyIG91dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgdmFyIHVudXNlZEZpZWxkTnVtYmVyID0gMjM0NTY7Ci0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShUZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5GaWVsZHMuSW5EZWNsYXJhdGlvbk9yZGVyKCkuU2VsZWN0KHggPT4geC5GaWVsZE51bWJlcikuQ29udGFpbnModW51c2VkRmllbGROdW1iZXIpKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh1bnVzZWRGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKCJpZ25vcmUgbWUiKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuV3JpdGVUbyhvdXRwdXQpOwotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0KLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUZyb20oc3RyZWFtKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBwYXJzZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIElnbm9yZVVua25vd25GaWVsZHNfQWxsVHlwZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBTaW1wbGUgd2F5IG9mIGVuc3VyaW5nIHdlIGNhbiBza2lwIGFsbCBraW5kcyBvZiBmaWVsZHMuCi0gICAgICAgICAgICB2YXIgZGF0YSA9IFNhbXBsZU1lc3NhZ2VzLkNyZWF0ZUZ1bGxUZXN0QWxsVHlwZXMoKS5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgdmFyIGVtcHR5ID0gRW1wdHkuUGFyc2VyLlBhcnNlRnJvbShkYXRhKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRW1wdHkoKSwgZW1wdHkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhpcyB3YXMgb3JpZ2luYWxseSBzZWVuIGFzIGEgY29uZm9ybWFuY2UgdGVzdCBmYWlsdXJlLgotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVHJ1bmNhdGVkTWVzc2FnZUZpZWxkVGhyb3dzKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gMTMwLCAzIGlzIHRoZSBtZXNzYWdlIHRhZwotICAgICAgICAgICAgLy8gMSBpcyB0aGUgZGF0YSBsZW5ndGggLSBidXQgdGhlcmUncyBubyBkYXRhLgotICAgICAgICAgICAgdmFyIGRhdGEgPSBuZXcgYnl0ZVtdIHsgMTMwLCAzLCAxIH07Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUZyb20oZGF0YSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVtb25zdHJhdGVzIGN1cnJlbnQgYmVoYXZpb3VyIHdpdGggYW4gZXh0cmFuZW91cyBlbmQgZ3JvdXAgdGFnIC0gc2VlIGlzc3VlIDY4OAotICAgICAgICAvLy8gZm9yIGRldGFpbHM7IHdlIG1heSB3YW50IHRvIGNoYW5nZSB0aGlzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRXh0cmFFbmRHcm91cFRocm93cygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgdmFyIHN0cmVhbSA9IG5ldyBNZW1vcnlTdHJlYW0oKTsKLSAgICAgICAgICAgIHZhciBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oc3RyZWFtKTsKLQotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKFRlc3RBbGxUeXBlcy5TaW5nbGVGaXhlZDMyRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMik7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDMyKDEyMyk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoMTAwLCBXaXJlRm9ybWF0LldpcmVUeXBlLkVuZEdyb3VwKTsKLQotICAgICAgICAgICAgb3V0cHV0LkZsdXNoKCk7Ci0KLSAgICAgICAgICAgIHN0cmVhbS5Qb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUZyb20oc3RyZWFtKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3VzdG9tRGlhZ25vc3RpY01lc3NhZ2VfRGlyZWN0VG9TdHJpbmdDYWxsKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgRm9yZWlnbk1lc3NhZ2UgeyBDID0gMzEgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieyBcImNcIjogMzEsIFwiQGNJbkhleFwiOiBcIjFmXCIgfSIsIG1lc3NhZ2UuVG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInsgXCJjXCI6IDMxIH0iLCBKc29uRm9ybWF0dGVyLkRlZmF1bHQuRm9ybWF0KG1lc3NhZ2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBDdXN0b21EaWFnbm9zdGljTWVzc2FnZV9OZXN0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVGb3JlaWduTWVzc2FnZSA9IG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAxNiB9IH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInsgXCJzaW5nbGVGb3JlaWduTWVzc2FnZVwiOiB7IFwiY1wiOiAxNiwgXCJAY0luSGV4XCI6IFwiMTBcIiB9IH0iLCBtZXNzYWdlLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ7IFwic2luZ2xlRm9yZWlnbk1lc3NhZ2VcIjogeyBcImNcIjogMTYgfSB9IiwgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ3VzdG9tRGlhZ25vc3RpY01lc3NhZ2VfRGlyZWN0VG9UZXh0V3JpdGVyQ2FsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IEZvcmVpZ25NZXNzYWdlIHsgQyA9IDMxIH07Ci0gICAgICAgICAgICB2YXIgd3JpdGVyID0gbmV3IFN0cmluZ1dyaXRlcigpOwotICAgICAgICAgICAgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlLCB3cml0ZXIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ7IFwiY1wiOiAzMSB9Iiwgd3JpdGVyLlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvR29vZ2xlLlByb3RvYnVmLlRlc3QuY3Nwcm9qIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Hb29nbGUuUHJvdG9idWYuVGVzdC5jc3Byb2oKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkM2RlNGEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Hb29nbGUuUHJvdG9idWYuVGVzdC5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxNDMgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57REQwMUVEMjQtMzc1MC00NTY3LTlBMjMtMURCNjc2QTE1NjEwfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvYnVmPC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvYnVmLlRlc3Q8L0Fzc2VtYmx5TmFtZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgotICAgIDxUYXJnZXRGcmFtZXdvcmtQcm9maWxlPgotICAgIDwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KLSAgICA8TnVHZXRQYWNrYWdlSW1wb3J0U3RhbXA+Ci0gICAgPC9OdUdldFBhY2thZ2VJbXBvcnRTdGFtcD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4KLSAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPgotICAgIDxEZWZpbmVDb25zdGFudHM+REVCVUc7VFJBQ0U7JChFbnZpcm9ubWVudEZsYXZvcik7JChFbnZpcm9ubWVudFRlbXBsYXRlKTwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4KLSAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+Ci0gICAgPFByZWZlcjMyQml0PmZhbHNlPC9QcmVmZXIzMkJpdD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZTwvT3V0cHV0UGF0aD4KLSAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+Ci0gICAgPERlZmluZUNvbnN0YW50cz5UUkFDRTskKEVudmlyb25tZW50Rmxhdm9yKTskKEVudmlyb25tZW50VGVtcGxhdGUpPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4KLSAgICA8UHJlZmVyMzJCaXQ+ZmFsc2U8L1ByZWZlcjMyQml0PgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxQcm9wZXJ0eUdyb3VwIENvbmRpdGlvbj0iICckKENvbmZpZ3VyYXRpb24pfCQoUGxhdGZvcm0pJyA9PSAnUmVsZWFzZVNpZ25lZHxBbnlDUFUnICI+Ci0gICAgPERlYnVnVHlwZT5wZGJvbmx5PC9EZWJ1Z1R5cGU+Ci0gICAgPE9wdGltaXplPnRydWU8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxSZWxlYXNlU2lnbmVkPC9PdXRwdXRQYXRoPgotICAgIDxJbnRlcm1lZGlhdGVPdXRwdXRQYXRoPm9ialxSZWxlYXNlU2lnbmVkXDwvSW50ZXJtZWRpYXRlT3V0cHV0UGF0aD4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFOyQoRW52aXJvbm1lbnRGbGF2b3IpOyQoRW52aXJvbm1lbnRUZW1wbGF0ZSk8L0RlZmluZUNvbnN0YW50cz4KLSAgICA8RXJyb3JSZXBvcnQ+cHJvbXB0PC9FcnJvclJlcG9ydD4KLSAgICA8V2FybmluZ0xldmVsPjQ8L1dhcm5pbmdMZXZlbD4KLSAgICA8Tm9TdGRMaWI+dHJ1ZTwvTm9TdGRMaWI+Ci0gICAgPEdlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+T2ZmPC9HZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPgotICAgIDxQcmVmZXIzMkJpdD5mYWxzZTwvUHJlZmVyMzJCaXQ+Ci0gICAgPFNpZ25Bc3NlbWJseT5UcnVlPC9TaWduQXNzZW1ibHk+Ci0gICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9idWYuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmNvcmUsIFZlcnNpb249Mi42LjQuMTQzNTAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OTZkMDlhMWViN2Y0NGE3NywgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgotICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE5Vbml0VGVzdEFkYXB0ZXIuMi4wLjBcbGliXG51bml0LmNvcmUuZGxsPC9IaW50UGF0aD4KLSAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+Ci0gICAgPC9SZWZlcmVuY2U+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJudW5pdC5jb3JlLmludGVyZmFjZXMsIFZlcnNpb249Mi42LjQuMTQzNTAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OTZkMDlhMWViN2Y0NGE3NywgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgotICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE5Vbml0VGVzdEFkYXB0ZXIuMi4wLjBcbGliXG51bml0LmNvcmUuaW50ZXJmYWNlcy5kbGw8L0hpbnRQYXRoPgotICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KLSAgICA8L1JlZmVyZW5jZT4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LmZyYW1ld29yaywgVmVyc2lvbj0yLjYuNC4xNDM1MCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj05NmQwOWExZWI3ZjQ0YTc3LCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+Ci0gICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTlVuaXQuMi42LjRcbGliXG51bml0LmZyYW1ld29yay5kbGw8L0hpbnRQYXRoPgotICAgICAgPFByaXZhdGU+VHJ1ZTwvUHJpdmF0ZT4KLSAgICA8L1JlZmVyZW5jZT4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9Im51bml0LnV0aWwsIFZlcnNpb249Mi42LjQuMTQzNTAsIEN1bHR1cmU9bmV1dHJhbCwgUHVibGljS2V5VG9rZW49OTZkMDlhMWViN2Y0NGE3NywgcHJvY2Vzc29yQXJjaGl0ZWN0dXJlPU1TSUwiPgotICAgICAgPEhpbnRQYXRoPi4uXHBhY2thZ2VzXE5Vbml0VGVzdEFkYXB0ZXIuMi4wLjBcbGliXG51bml0LnV0aWwuZGxsPC9IaW50UGF0aD4KLSAgICAgIDxQcml2YXRlPlRydWU8L1ByaXZhdGU+Ci0gICAgPC9SZWZlcmVuY2U+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJOVW5pdC5WaXN1YWxTdHVkaW8uVGVzdEFkYXB0ZXIsIFZlcnNpb249Mi4wLjAuMCwgQ3VsdHVyZT1uZXV0cmFsLCBQdWJsaWNLZXlUb2tlbj00Y2I0MGQzNTQ5NDY5MWFjLCBwcm9jZXNzb3JBcmNoaXRlY3R1cmU9TVNJTCI+Ci0gICAgICA8SGludFBhdGg+Li5ccGFja2FnZXNcTlVuaXRUZXN0QWRhcHRlci4yLjAuMFxsaWJcTlVuaXQuVmlzdWFsU3R1ZGlvLlRlc3RBZGFwdGVyLmRsbDwvSGludFBhdGg+Ci0gICAgICA8UHJpdmF0ZT5UcnVlPC9Qcml2YXRlPgotICAgIDwvUmVmZXJlbmNlPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtIiAvPgotICAgIDxSZWZlcmVuY2UgSW5jbHVkZT0iU3lzdGVtLlhtbCIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQnl0ZVN0cmluZ1Rlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbUV4dGVuc2lvbnMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRJbnB1dFN0cmVhbVRlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW1UZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcUHJvcGVydHlJbmZvRXh0ZW5zaW9uc1Rlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxUeXBlRXh0ZW5zaW9uc1Rlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRXF1YWxpdHlUZXN0ZXIuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRDb2RlY1Rlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iR2VuZXJhdGVkTWVzc2FnZVRlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTWFwRmllbGRUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlcGVhdGVkRmllbGRUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Gb3JtYXR0ZXJUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25QYXJzZXJUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Ub2tlbml6ZXJUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cRGVzY3JpcHRvcnNUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cRmllbGRBY2Nlc3NUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cVHlwZVJlZ2lzdHJ5VGVzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJTYW1wbGVFbnVtLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlNhbXBsZU1lc3NhZ2VzLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcRm9yZWlnbk1lc3NhZ2VQYXJ0aWFsLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcTWFwVW5pdHRlc3RQcm90bzMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0dGVzdEltcG9ydFByb3RvMy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXR0ZXN0SW1wb3J0UHVibGljUHJvdG8zLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RQcm90b3NcVW5pdHRlc3RJc3N1ZXMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iVGVzdFByb3Rvc1xVbml0dGVzdFByb3RvMy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJEZXByZWNhdGVkTWVtYmVyVGVzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJJc3N1ZXNUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlByb3BlcnRpZXNcQXNzZW1ibHlJbmZvLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlRlc3RDb3JuZXJDYXNlcy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJUZXN0UHJvdG9zXFVuaXR0ZXN0V2VsbEtub3duVHlwZXMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV2VsbEtub3duVHlwZXNcQW55VGVzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xEdXJhdGlvblRlc3QuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV2VsbEtub3duVHlwZXNcRmllbGRNYXNrVGVzdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xUaW1lc3RhbXBUZXN0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IldlbGxLbm93blR5cGVzXFdyYXBwZXJzVGVzdC5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFByb2plY3RSZWZlcmVuY2UgSW5jbHVkZT0iLi5cR29vZ2xlLlByb3RvYnVmXEdvb2dsZS5Qcm90b2J1Zi5jc3Byb2oiPgotICAgICAgPFByb2plY3Q+ezY5MDhCRENFLUQ5MjUtNDNGMy05NEFDLUE1MzFFNkRGMjU5MX08L1Byb2plY3Q+Ci0gICAgICA8TmFtZT5Hb29nbGUuUHJvdG9idWY8L05hbWU+Ci0gICAgPC9Qcm9qZWN0UmVmZXJlbmNlPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cD4KLSAgICA8Tm9uZSBJbmNsdWRlPSJwYWNrYWdlcy5jb25maWciIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxTZXJ2aWNlIEluY2x1ZGU9Ins4MkE3RjQ4RC0zQjUwLTRCMUUtQjgyRS0zQURBODIxMEMzNTh9IiAvPgotICA8L0l0ZW1Hcm91cD4KLSAgPEl0ZW1Hcm91cCAvPgotICA8SW1wb3J0IFByb2plY3Q9IiQoTVNCdWlsZFRvb2xzUGF0aClcTWljcm9zb2Z0LkNTaGFycC50YXJnZXRzIiAvPgotICA8IS0tIFRvIG1vZGlmeSB5b3VyIGJ1aWxkIHByb2Nlc3MsIGFkZCB5b3VyIHRhc2sgaW5zaWRlIG9uZSBvZiB0aGUgdGFyZ2V0cyBiZWxvdyBhbmQgdW5jb21tZW50IGl0LiAKLSAgICAgICBPdGhlciBzaW1pbGFyIGV4dGVuc2lvbiBwb2ludHMgZXhpc3QsIHNlZSBNaWNyb3NvZnQuQ29tbW9uLnRhcmdldHMuCi0gIDxUYXJnZXQgTmFtZT0iQmVmb3JlQnVpbGQiPgotICA8L1RhcmdldD4KLSAgPFRhcmdldCBOYW1lPSJBZnRlckJ1aWxkIj4KLSAgPC9UYXJnZXQ+Ci0gIC0tPgotPC9Qcm9qZWN0PgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvSXNzdWVzVGVzdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvSXNzdWVzVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGRiMjNhYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0lzc3Vlc1Rlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIFVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zOwotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotCi0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFRlc3RzIGZvciBpc3N1ZXMgd2hpY2ggYXJlbid0IGVhc2lseSBjb21wYXJ0bWVudGFsaXplZCBpbnRvIG90aGVyIHVuaXQgdGVzdHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgSXNzdWVzVGVzdAotICAgIHsKLSAgICAgICAgLy8gSXNzdWUgNDUKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkQ2FsbGVkSXRlbSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEl0ZW1GaWVsZCBtZXNzYWdlID0gbmV3IEl0ZW1GaWVsZCB7IEl0ZW0gPSAzIH07Ci0gICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBJdGVtRmllbGQuRGVzY3JpcHRvci5GaW5kRmllbGRCeU5hbWUoIml0ZW0iKTsKLSAgICAgICAgICAgIEFzc2VydC5Ob3ROdWxsKGZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzLCAoaW50KWZpZWxkLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBSZXNlcnZlZE5hbWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgUmVzZXJ2ZWROYW1lcyB7IFR5cGVzXyA9IDEwLCBEZXNjcmlwdG9yXyA9IDIwIH07Ci0gICAgICAgICAgICAvLyBVbmRlcnNjb3JlcyBhcmVuJ3QgcmVmbGVjdGVkIGluIHRoZSBKU09OLgotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ7IFwidHlwZXNcIjogMTAsIFwiZGVzY3JpcHRvclwiOiAyMCB9IiwgbWVzc2FnZS5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBKc29uTmFtZVBhcnNlVGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzZXR0aW5ncyA9IG5ldyBKc29uUGFyc2VyLlNldHRpbmdzKDEwLCBUeXBlUmVnaXN0cnkuRnJvbUZpbGVzKFVuaXR0ZXN0SXNzdWVzUmVmbGVjdGlvbi5EZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEpzb25QYXJzZXIoc2V0dGluZ3MpOwotCi0gICAgICAgICAgICAvLyBJdCBpcyBzYWZlIHRvIHVzZSBlaXRoZXIgb3JpZ2luYWwgZmllbGQgbmFtZSBvciBleHBsaWNpdGx5IHNwZWNpZmllZCBqc29uX25hbWUKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgVGVzdEpzb25OYW1lIHsgTmFtZSA9ICJ0ZXN0IiwgRGVzY3JpcHRpb24gPSAidGVzdDIiLCBHdWlkID0gInRlc3QzIiB9LAotICAgICAgICAgICAgICAgIHBhcnNlci5QYXJzZTxUZXN0SnNvbk5hbWU+KCJ7IFwibmFtZVwiOiBcInRlc3RcIiwgXCJkZXNjXCI6IFwidGVzdDJcIiwgXCJndWlkXCI6IFwidGVzdDNcIiB9IikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEpzb25OYW1lRm9ybWF0VGVzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RKc29uTmFtZSB7IE5hbWUgPSAidGVzdCIsIERlc2NyaXB0aW9uID0gInRlc3QyIiwgR3VpZCA9ICJ0ZXN0MyIgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieyBcIm5hbWVcIjogXCJ0ZXN0XCIsIFwiZGVzY1wiOiBcInRlc3QyXCIsIFwiZXhpZFwiOiBcInRlc3QzXCIgfSIsCi0gICAgICAgICAgICAgICAgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0pzb25Gb3JtYXR0ZXJUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Kc29uRm9ybWF0dGVyVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3YTc1OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0pzb25Gb3JtYXR0ZXJUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTI2ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zOwotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotdXNpbmcgVW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3M7Ci11c2luZyBHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXM7Ci11c2luZyBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLQotdXNpbmcgc3RhdGljIEdvb2dsZS5Qcm90b2J1Zi5Kc29uUGFyc2VyVGVzdDsgLy8gRm9yIFdyYXBJblF1b3RlcwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUZXN0cyBmb3IgdGhlIEpTT04gZm9ybWF0dGVyLiBOb3RlIHRoYXQgaW4gdGhlc2UgdGVzdHMsIGRvdWJsZSBxdW90ZXMgYXJlIHJlcGxhY2VkIHdpdGggYXBvc3Ryb3BoZXMKLSAgICAvLy8gZm9yIHRoZSBzYWtlIG9mIHJlYWRhYmlsaXR5IChlbWJlZGRpbmcgXCIgZXZlcnl3aGVyZSBpcyBwYWluZnVsKS4gU2VlIHRoZSBBc3NlcnRKc29uIG1ldGhvZCBmb3IgZGV0YWlscy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBKc29uRm9ybWF0dGVyVGVzdAotICAgIHsKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlZmF1bHRWYWx1ZXNfV2hlbk9taXR0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZm9ybWF0dGVyID0gbmV3IEpzb25Gb3JtYXR0ZXIobmV3IEpzb25Gb3JtYXR0ZXIuU2V0dGluZ3MoZm9ybWF0RGVmYXVsdFZhbHVlczogZmFsc2UpKTsKLQotICAgICAgICAgICAgQXNzZXJ0SnNvbigieyB9IiwgZm9ybWF0dGVyLkZvcm1hdChuZXcgRm9yZWlnbk1lc3NhZ2UoKSkpOwotICAgICAgICAgICAgQXNzZXJ0SnNvbigieyB9IiwgZm9ybWF0dGVyLkZvcm1hdChuZXcgVGVzdEFsbFR5cGVzKCkpKTsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgfSIsIGZvcm1hdHRlci5Gb3JtYXQobmV3IFRlc3RNYXAoKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlZmF1bHRWYWx1ZXNfV2hlbkluY2x1ZGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IG5ldyBKc29uRm9ybWF0dGVyKG5ldyBKc29uRm9ybWF0dGVyLlNldHRpbmdzKGZvcm1hdERlZmF1bHRWYWx1ZXM6IHRydWUpKTsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ2MnOiAwIH0iLCBmb3JtYXR0ZXIuRm9ybWF0KG5ldyBGb3JlaWduTWVzc2FnZSgpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQWxsU2luZ2xlRmllbGRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2luZ2xlQm9vbCA9IHRydWUsCi0gICAgICAgICAgICAgICAgU2luZ2xlQnl0ZXMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMsIDQpLAotICAgICAgICAgICAgICAgIFNpbmdsZURvdWJsZSA9IDIzLjUsCi0gICAgICAgICAgICAgICAgU2luZ2xlRml4ZWQzMiA9IDIzLAotICAgICAgICAgICAgICAgIFNpbmdsZUZpeGVkNjQgPSAxMjM0NTY3ODkwMTIzLAotICAgICAgICAgICAgICAgIFNpbmdsZUZsb2F0ID0gMTIuMjVmLAotICAgICAgICAgICAgICAgIFNpbmdsZUZvcmVpZ25FbnVtID0gRm9yZWlnbkVudW0uRm9yZWlnbkJhciwKLSAgICAgICAgICAgICAgICBTaW5nbGVGb3JlaWduTWVzc2FnZSA9IG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAxMCB9LAotICAgICAgICAgICAgICAgIFNpbmdsZUltcG9ydEVudW0gPSBJbXBvcnRFbnVtLkltcG9ydEJheiwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbXBvcnRNZXNzYWdlID0gbmV3IEltcG9ydE1lc3NhZ2UgeyBEID0gMjAgfSwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbnQzMiA9IDEwMCwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbnQ2NCA9IDMyMTA5ODc2NTQzMjEsCi0gICAgICAgICAgICAgICAgU2luZ2xlTmVzdGVkRW51bSA9IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZvbywKLSAgICAgICAgICAgICAgICBTaW5nbGVOZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHsgQmIgPSAzNSB9LAotICAgICAgICAgICAgICAgIFNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UgPSBuZXcgUHVibGljSW1wb3J0TWVzc2FnZSB7IEUgPSA1NCB9LAotICAgICAgICAgICAgICAgIFNpbmdsZVNmaXhlZDMyID0gLTEyMywKLSAgICAgICAgICAgICAgICBTaW5nbGVTZml4ZWQ2NCA9IC0xMjM0NTY3ODkwMTIzNCwKLSAgICAgICAgICAgICAgICBTaW5nbGVTaW50MzIgPSAtNDU2LAotICAgICAgICAgICAgICAgIFNpbmdsZVNpbnQ2NCA9IC0xMjM0NTY3ODkwMTIzNSwKLSAgICAgICAgICAgICAgICBTaW5nbGVTdHJpbmcgPSAidGVzdFx0d2l0aFx0dGFicyIsCi0gICAgICAgICAgICAgICAgU2luZ2xlVWludDMyID0gdWludC5NYXhWYWx1ZSwKLSAgICAgICAgICAgICAgICBTaW5nbGVVaW50NjQgPSB1bG9uZy5NYXhWYWx1ZSwKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICB2YXIgYWN0dWFsVGV4dCA9IEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIC8vIEZpZWxkcyBpbiBudW1lcmljIG9yZGVyCi0gICAgICAgICAgICB2YXIgZXhwZWN0ZWRUZXh0ID0gInsgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVJbnQzMic6IDEwMCwgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVJbnQ2NCc6ICczMjEwOTg3NjU0MzIxJywgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVVaW50MzInOiA0Mjk0OTY3Mjk1LCAiICsKLSAgICAgICAgICAgICAgICAiJ3NpbmdsZVVpbnQ2NCc6ICcxODQ0Njc0NDA3MzcwOTU1MTYxNScsICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlU2ludDMyJzogLTQ1NiwgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVTaW50NjQnOiAnLTEyMzQ1Njc4OTAxMjM1JywgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVGaXhlZDMyJzogMjMsICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlRml4ZWQ2NCc6ICcxMjM0NTY3ODkwMTIzJywgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVTZml4ZWQzMic6IC0xMjMsICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlU2ZpeGVkNjQnOiAnLTEyMzQ1Njc4OTAxMjM0JywgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVGbG9hdCc6IDEyLjI1LCAiICsKLSAgICAgICAgICAgICAgICAiJ3NpbmdsZURvdWJsZSc6IDIzLjUsICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlQm9vbCc6IHRydWUsICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlU3RyaW5nJzogJ3Rlc3RcXHR3aXRoXFx0dGFicycsICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlQnl0ZXMnOiAnQVFJREJBPT0nLCAiICsKLSAgICAgICAgICAgICAgICAiJ3NpbmdsZU5lc3RlZE1lc3NhZ2UnOiB7ICdiYic6IDM1IH0sICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlRm9yZWlnbk1lc3NhZ2UnOiB7ICdjJzogMTAgfSwgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVJbXBvcnRNZXNzYWdlJzogeyAnZCc6IDIwIH0sICIgKwotICAgICAgICAgICAgICAgICInc2luZ2xlTmVzdGVkRW51bSc6ICdGT08nLCAiICsKLSAgICAgICAgICAgICAgICAiJ3NpbmdsZUZvcmVpZ25FbnVtJzogJ0ZPUkVJR05fQkFSJywgIiArCi0gICAgICAgICAgICAgICAgIidzaW5nbGVJbXBvcnRFbnVtJzogJ0lNUE9SVF9CQVonLCAiICsKLSAgICAgICAgICAgICAgICAiJ3NpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UnOiB7ICdlJzogNTQgfSIgKwotICAgICAgICAgICAgICAgICIgfSI7Ci0gICAgICAgICAgICBBc3NlcnRKc29uKGV4cGVjdGVkVGV4dCwgYWN0dWFsVGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVwZWF0ZWRGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ3JlcGVhdGVkSW50MzInOiBbIDEsIDIsIDMsIDQsIDUgXSB9IiwKLSAgICAgICAgICAgICAgICBKc29uRm9ybWF0dGVyLkRlZmF1bHQuRm9ybWF0KG5ldyBUZXN0QWxsVHlwZXMgeyBSZXBlYXRlZEludDMyID0geyAxLCAyLCAzLCA0LCA1IH0gfSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hcEZpZWxkX1N0cmluZ1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ21hcFN0cmluZ1N0cmluZyc6IHsgJ3dpdGggc3BhY2VzJzogJ2JhcicsICdhJzogJ2InIH0gfSIsCi0gICAgICAgICAgICAgICAgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChuZXcgVGVzdE1hcCB7IE1hcFN0cmluZ1N0cmluZyA9IHsgeyAid2l0aCBzcGFjZXMiLCAiYmFyIiB9LCB7ICJhIiwgImIiIH0gfSB9KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTWFwRmllbGRfSW50MzJJbnQzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBrZXlzIGFyZSBxdW90ZWQsIGJ1dCB0aGUgdmFsdWVzIGFyZW4ndC4KLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ21hcEludDMySW50MzInOiB7ICcwJzogMSwgJzInOiAzIH0gfSIsCi0gICAgICAgICAgICAgICAgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChuZXcgVGVzdE1hcCB7IE1hcEludDMySW50MzIgPSB7IHsgMCwgMSB9LCB7IDIsIDMgfSB9IH0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBNYXBGaWVsZF9Cb29sQm9vbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBrZXlzIGFyZSBxdW90ZWQsIGJ1dCB0aGUgdmFsdWVzIGFyZW4ndC4KLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ21hcEJvb2xCb29sJzogeyAnZmFsc2UnOiB0cnVlLCAndHJ1ZSc6IGZhbHNlIH0gfSIsCi0gICAgICAgICAgICAgICAgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChuZXcgVGVzdE1hcCB7IE1hcEJvb2xCb29sID0geyB7IGZhbHNlLCB0cnVlIH0sIHsgdHJ1ZSwgZmFsc2UgfSB9IH0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0Q2FzZSgxLjAsICIxIildCi0gICAgICAgIFtUZXN0Q2FzZShkb3VibGUuTmFOLCAiJ05hTiciKV0KLSAgICAgICAgW1Rlc3RDYXNlKGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5LCAiJ0luZmluaXR5JyIpXQotICAgICAgICBbVGVzdENhc2UoZG91YmxlLk5lZ2F0aXZlSW5maW5pdHksICInLUluZmluaXR5JyIpXQotICAgICAgICBwdWJsaWMgdm9pZCBEb3VibGVSZXByZXNlbnRhdGlvbnMoZG91YmxlIHZhbHVlLCBzdHJpbmcgZXhwZWN0ZWRWYWx1ZVRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcyB7IFNpbmdsZURvdWJsZSA9IHZhbHVlIH07Ci0gICAgICAgICAgICBzdHJpbmcgYWN0dWFsVGV4dCA9IEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSk7Ci0gICAgICAgICAgICBzdHJpbmcgZXhwZWN0ZWRUZXh0ID0gInsgJ3NpbmdsZURvdWJsZSc6ICIgKyBleHBlY3RlZFZhbHVlVGV4dCArICIgfSI7Ci0gICAgICAgICAgICBBc3NlcnRKc29uKGV4cGVjdGVkVGV4dCwgYWN0dWFsVGV4dCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVW5rbm93bkVudW1WYWx1ZU51bWVyaWNfU2luZ2xlRmllbGQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVGb3JlaWduRW51bSA9IChGb3JlaWduRW51bSkgMTAwIH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdzaW5nbGVGb3JlaWduRW51bSc6IDEwMCB9IiwgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVW5rbm93bkVudW1WYWx1ZU51bWVyaWNfUmVwZWF0ZWRGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcyB7IFJlcGVhdGVkRm9yZWlnbkVudW0gPSB7IEZvcmVpZ25FbnVtLkZvcmVpZ25CYXosIChGb3JlaWduRW51bSkgMTAwLCBGb3JlaWduRW51bS5Gb3JlaWduRm9vIH0gfTsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ3JlcGVhdGVkRm9yZWlnbkVudW0nOiBbICdGT1JFSUdOX0JBWicsIDEwMCwgJ0ZPUkVJR05fRk9PJyBdIH0iLCBKc29uRm9ybWF0dGVyLkRlZmF1bHQuRm9ybWF0KG1lc3NhZ2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBVbmtub3duRW51bVZhbHVlTnVtZXJpY19NYXBGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RNYXAgeyBNYXBJbnQzMkVudW0gPSB7IHsgMSwgTWFwRW51bS5Gb28gfSwgeyAyLCAoTWFwRW51bSkgMTAwIH0sIHsgMywgTWFwRW51bS5CYXIgfSB9IH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdtYXBJbnQzMkVudW0nOiB7ICcxJzogJ01BUF9FTlVNX0ZPTycsICcyJzogMTAwLCAnMyc6ICdNQVBfRU5VTV9CQVInIH0gfSIsIEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFVua25vd25FbnVtVmFsdWVfUmVwZWF0ZWRGaWVsZF9BbGxFbnRyaWVzVW5rbm93bigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcyB7IFJlcGVhdGVkRm9yZWlnbkVudW0gPSB7IChGb3JlaWduRW51bSkgMjAwLCAoRm9yZWlnbkVudW0pIDEwMCB9IH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdyZXBlYXRlZEZvcmVpZ25FbnVtJzogWyAyMDAsIDEwMCBdIH0iLCBKc29uRm9ybWF0dGVyLkRlZmF1bHQuRm9ybWF0KG1lc3NhZ2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoImFcdTE3YjRiIiwgImFcXHUxN2I0YiIpXSAvLyBFeHBsaWNpdAotICAgICAgICBbVGVzdENhc2UoImFcdTA2MDFiIiwgImFcXHUwNjAxYiIpXSAvLyBSYW5nZWQKLSAgICAgICAgW1Rlc3RDYXNlKCJhXHUwNjA1YiIsICJhXHUwNjA1YiIpXSAvLyBQYXNzdGhyb3VnaCAobm90ZSBsYWNrIG9mIGRvdWJsZSBiYWNrc2xhc2guLi4pCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpbXBsZU5vbkFzY2lpKHN0cmluZyB0ZXh0LCBzdHJpbmcgZW5jb2RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzIHsgU2luZ2xlU3RyaW5nID0gdGV4dCB9OwotICAgICAgICAgICAgQXNzZXJ0SnNvbigieyAnc2luZ2xlU3RyaW5nJzogJyIgKyBlbmNvZGVkICsgIicgfSIsIEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFN1cnJvZ2F0ZVBhaXJFc2NhcGluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcyB7IFNpbmdsZVN0cmluZyA9ICJhXHVEODAxXHVEQzAxYiIgfTsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ3NpbmdsZVN0cmluZyc6ICdhXFx1ZDgwMVxcdWRjMDFiJyB9IiwgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSW52YWxpZFN1cnJvZ2F0ZVBhaXJzRmFpbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IGRvbid0IHVzZSBUZXN0Q2FzZSBmb3IgdGhlc2UsIGFzIHRoZSBzdHJpbmdzIGNhbid0IGJlIHJlbGlhYmx5IHJlcHJlc2VudGVkIAotICAgICAgICAgICAgLy8gU2VlIGh0dHA6Ly9jb2RlYmxvZy5qb25za2VldC51ay8yMDE0LzExLzA3L3doZW4taXMtYS1zdHJpbmctbm90LWEtc3RyaW5nLwotCi0gICAgICAgICAgICAvLyBMb25lIGxvdyBzdXJyb2dhdGUKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcyB7IFNpbmdsZVN0cmluZyA9ICJhXHVEQzAxYiIgfTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRFeGNlcHRpb24+KCgpID0+IEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSkpOwotCi0gICAgICAgICAgICAvLyBMb25lIGhpZ2ggc3Vycm9nYXRlCi0gICAgICAgICAgICBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcyB7IFNpbmdsZVN0cmluZyA9ICJhXHVEODAxYiIgfTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnRFeGNlcHRpb24+KCgpID0+IEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiZm9vX2JhciIsICJmb29CYXIiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJiYW5hbmFCYW5hbmEiLCAiYmFuYW5hQmFuYW5hIildCi0gICAgICAgIFtUZXN0Q2FzZSgiQkFOQU5BQmFuYW5hIiwgImJhbmFuYUJhbmFuYSIpXQotICAgICAgICBwdWJsaWMgdm9pZCBUb0NhbWVsQ2FzZShzdHJpbmcgb3JpZ2luYWwsIHN0cmluZyBleHBlY3RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBKc29uRm9ybWF0dGVyLlRvQ2FtZWxDYXNlKG9yaWdpbmFsKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKG51bGwsICJ7IH0iKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJ4IiwgInsgJ2Zvb1N0cmluZyc6ICd4JyB9IildCi0gICAgICAgIFtUZXN0Q2FzZSgiIiwgInsgJ2Zvb1N0cmluZyc6ICcnIH0iKV0KLSAgICAgICAgcHVibGljIHZvaWQgT25lb2Yoc3RyaW5nIGZvb1N0cmluZ1ZhbHVlLCBzdHJpbmcgZXhwZWN0ZWRKc29uKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0T25lb2YoKTsKLSAgICAgICAgICAgIGlmIChmb29TdHJpbmdWYWx1ZSAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1lc3NhZ2UuRm9vU3RyaW5nID0gZm9vU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdlIHNob3VsZCBnZXQgdGhlIHNhbWUgcmVzdWx0IGJvdGggd2l0aCBhbmQgd2l0aG91dCAiZm9ybWF0IGRlZmF1bHQgdmFsdWVzIi4KLSAgICAgICAgICAgIHZhciBmb3JtYXR0ZXIgPSBuZXcgSnNvbkZvcm1hdHRlcihuZXcgSnNvbkZvcm1hdHRlci5TZXR0aW5ncyhmYWxzZSkpOwotICAgICAgICAgICAgQXNzZXJ0SnNvbihleHBlY3RlZEpzb24sIGZvcm1hdHRlci5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICAgICAgZm9ybWF0dGVyID0gbmV3IEpzb25Gb3JtYXR0ZXIobmV3IEpzb25Gb3JtYXR0ZXIuU2V0dGluZ3ModHJ1ZSkpOwotICAgICAgICAgICAgQXNzZXJ0SnNvbihleHBlY3RlZEpzb24sIGZvcm1hdHRlci5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyYXBwZXJGb3JtYXR0aW5nX1NpbmdsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEp1c3QgYSBmZXcgZXhhbXBsZXMsIGhhbmRsaW5nIGJvdGggY2xhc3NlcyBhbmQgdmFsdWUgdHlwZXMsIGFuZAotICAgICAgICAgICAgLy8gZGVmYXVsdCB2cyBub24tZGVmYXVsdCB2YWx1ZXMKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEludDY0RmllbGQgPSAxMCwKLSAgICAgICAgICAgICAgICBJbnQzMkZpZWxkID0gMCwKLSAgICAgICAgICAgICAgICBCeXRlc0ZpZWxkID0gQnl0ZVN0cmluZy5Gcm9tQmFzZTY0KCJBQkNEIiksCi0gICAgICAgICAgICAgICAgU3RyaW5nRmllbGQgPSAiIgotICAgICAgICAgICAgfTsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZEpzb24gPSAieyAnaW50NjRGaWVsZCc6ICcxMCcsICdpbnQzMkZpZWxkJzogMCwgJ3N0cmluZ0ZpZWxkJzogJycsICdieXRlc0ZpZWxkJzogJ0FCQ0QnIH0iOwotICAgICAgICAgICAgQXNzZXJ0SnNvbihleHBlY3RlZEpzb24sIEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyYXBwZXJGb3JtYXR0aW5nX01lc3NhZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlwiXCIiLCBKc29uRm9ybWF0dGVyLkRlZmF1bHQuRm9ybWF0KG5ldyBTdHJpbmdWYWx1ZSgpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIjAiLCBKc29uRm9ybWF0dGVyLkRlZmF1bHQuRm9ybWF0KG5ldyBJbnQzMlZhbHVlKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBXcmFwcGVyRm9ybWF0dGluZ19JbmNsdWRlTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRoZSBhY3R1YWwgSlNPTiBoZXJlIGlzIHZlcnkgbGFyZ2UgYmVjYXVzZSB0aGVyZSBhcmUgbG90cyBvZiBmaWVsZHMuIEp1c3QgdGVzdCBhIGNvdXBsZSBvZiB0aGVtLgotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgSW50MzJGaWVsZCA9IDEwIH07Ci0gICAgICAgICAgICB2YXIgZm9ybWF0dGVyID0gbmV3IEpzb25Gb3JtYXR0ZXIobmV3IEpzb25Gb3JtYXR0ZXIuU2V0dGluZ3ModHJ1ZSkpOwotICAgICAgICAgICAgdmFyIGFjdHVhbEpzb24gPSBmb3JtYXR0ZXIuRm9ybWF0KG1lc3NhZ2UpOwotICAgICAgICAgICAgQXNzZXJ0LklzVHJ1ZShhY3R1YWxKc29uLkNvbnRhaW5zKCJcImludDY0RmllbGRcIjogbnVsbCIpKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc0ZhbHNlKGFjdHVhbEpzb24uQ29udGFpbnMoIlwiaW50MzJGaWVsZFwiOiBudWxsIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE91dHB1dElzSW5OdW1lcmljRmllbGRPcmRlcl9Ob0RlZmF1bHRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IG5ldyBKc29uRm9ybWF0dGVyKG5ldyBKc29uRm9ybWF0dGVyLlNldHRpbmdzKGZhbHNlKSk7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0SnNvbkZpZWxkT3JkZXJpbmcgeyBQbGFpblN0cmluZyA9ICJwMSIsIFBsYWluSW50MzIgPSAyIH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdwbGFpblN0cmluZyc6ICdwMScsICdwbGFpbkludDMyJzogMiB9IiwgZm9ybWF0dGVyLkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgICAgICBtZXNzYWdlID0gbmV3IFRlc3RKc29uRmllbGRPcmRlcmluZyB7IE8xSW50MzIgPSA1LCBPMlN0cmluZyA9ICJvMiIsIFBsYWluSW50MzIgPSAxMCwgUGxhaW5TdHJpbmcgPSAicGxhaW4iIH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdwbGFpblN0cmluZyc6ICdwbGFpbicsICdvMlN0cmluZyc6ICdvMicsICdwbGFpbkludDMyJzogMTAsICdvMUludDMyJzogNSB9IiwgZm9ybWF0dGVyLkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgICAgICBtZXNzYWdlID0gbmV3IFRlc3RKc29uRmllbGRPcmRlcmluZyB7IE8xU3RyaW5nID0gIiIsIE8ySW50MzIgPSAwLCBQbGFpbkludDMyID0gMTAsIFBsYWluU3RyaW5nID0gInBsYWluIiB9OwotICAgICAgICAgICAgQXNzZXJ0SnNvbigieyAncGxhaW5TdHJpbmcnOiAncGxhaW4nLCAnbzFTdHJpbmcnOiAnJywgJ3BsYWluSW50MzInOiAxMCwgJ28ySW50MzInOiAwIH0iLCBmb3JtYXR0ZXIuRm9ybWF0KG1lc3NhZ2UpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBPdXRwdXRJc0luTnVtZXJpY0ZpZWxkT3JkZXJfV2l0aERlZmF1bHRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IG5ldyBKc29uRm9ybWF0dGVyKG5ldyBKc29uRm9ybWF0dGVyLlNldHRpbmdzKHRydWUpKTsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RKc29uRmllbGRPcmRlcmluZygpOwotICAgICAgICAgICAgQXNzZXJ0SnNvbigieyAncGxhaW5TdHJpbmcnOiAnJywgJ3BsYWluSW50MzInOiAwIH0iLCBmb3JtYXR0ZXIuRm9ybWF0KG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVGVzdEpzb25GaWVsZE9yZGVyaW5nIHsgTzFJbnQzMiA9IDUsIE8yU3RyaW5nID0gIm8yIiwgUGxhaW5JbnQzMiA9IDEwLCBQbGFpblN0cmluZyA9ICJwbGFpbiIgfTsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ3BsYWluU3RyaW5nJzogJ3BsYWluJywgJ28yU3RyaW5nJzogJ28yJywgJ3BsYWluSW50MzInOiAxMCwgJ28xSW50MzInOiA1IH0iLCBmb3JtYXR0ZXIuRm9ybWF0KG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIG1lc3NhZ2UgPSBuZXcgVGVzdEpzb25GaWVsZE9yZGVyaW5nIHsgTzFTdHJpbmcgPSAiIiwgTzJJbnQzMiA9IDAsIFBsYWluSW50MzIgPSAxMCwgUGxhaW5TdHJpbmcgPSAicGxhaW4iIH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdwbGFpblN0cmluZyc6ICdwbGFpbicsICdvMVN0cmluZyc6ICcnLCAncGxhaW5JbnQzMic6IDEwLCAnbzJJbnQzMic6IDAgfSIsIGZvcm1hdHRlci5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMTk3MC0wMS0wMVQwMDowMDowMFoiLCAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAwMDAwMVoiLCAxKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAwMDAxMFoiLCAxMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMDAwMDAxMDBaIiwgMTAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAwMVoiLCAxMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAxMFoiLCAxMDAwMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTk3MC0wMS0wMVQwMDowMDowMC4wMDAxMDBaIiwgMTAwMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMVoiLCAxMDAwMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAxMFoiLCAxMDAwMDAwMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTk3MC0wMS0wMVQwMDowMDowMC4xMDBaIiwgMTAwMDAwMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjEyMFoiLCAxMjAwMDAwMDApXQotICAgICAgICBbVGVzdENhc2UoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMTIzWiIsIDEyMzAwMDAwMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTk3MC0wMS0wMVQwMDowMDowMC4xMjM0MDBaIiwgMTIzNDAwMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjEyMzQ1MFoiLCAxMjM0NTAwMDApXQotICAgICAgICBbVGVzdENhc2UoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMTIzNDU2WiIsIDEyMzQ1NjAwMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTk3MC0wMS0wMVQwMDowMDowMC4xMjM0NTY3MDBaIiwgMTIzNDU2NzAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjEyMzQ1Njc4MFoiLCAxMjM0NTY3ODApXQotICAgICAgICBbVGVzdENhc2UoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMTIzNDU2Nzg5WiIsIDEyMzQ1Njc4OSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFRpbWVzdGFtcFN0YW5kYWxvbmUoc3RyaW5nIGV4cGVjdGVkLCBpbnQgbmFub3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChXcmFwSW5RdW90ZXMoZXhwZWN0ZWQpLCBuZXcgVGltZXN0YW1wIHsgTmFub3MgPSBuYW5vcyB9LlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRpbWVzdGFtcFN0YW5kYWxvbmVfRnJvbURhdGVUaW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gT25lIGJlZm9yZSBhbmQgb25lIGFmdGVyIHRoZSBVbml4IGVwb2NoLCBtb3JlIGVhc2lseSByZXByZXNlbnRlZCB2aWEgRGF0ZVRpbWUuCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIlwiMTY3My0wNi0xOVQxMjozNDo1NlpcIiIsCi0gICAgICAgICAgICAgICAgbmV3IERhdGVUaW1lKDE2NzMsIDYsIDE5LCAxMiwgMzQsIDU2LCBEYXRlVGltZUtpbmQuVXRjKS5Ub1RpbWVzdGFtcCgpLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJcIjIwMTUtMDctMzFUMTA6Mjk6MzRaXCIiLAotICAgICAgICAgICAgICAgIG5ldyBEYXRlVGltZSgyMDE1LCA3LCAzMSwgMTAsIDI5LCAzNCwgRGF0ZVRpbWVLaW5kLlV0YykuVG9UaW1lc3RhbXAoKS5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoLTEsIC0xKV0gLy8gV291bGQgYmUgdmFsaWQgYXMgZHVyYXRpb24KLSAgICAgICAgW1Rlc3RDYXNlKDEsIFRpbWVzdGFtcC5NYXhOYW5vcyArIDEpXQotICAgICAgICBbVGVzdENhc2UoVGltZXN0YW1wLlVuaXhTZWNvbmRzQXRCY2xNYXhWYWx1ZSArIDEsIDApXQotICAgICAgICBbVGVzdENhc2UoVGltZXN0YW1wLlVuaXhTZWNvbmRzQXRCY2xNaW5WYWx1ZSAtIDEsIDApXQotICAgICAgICBwdWJsaWMgdm9pZCBUaW1lc3RhbXBTdGFuZGFsb25lX05vbk5vcm1hbGl6ZWQobG9uZyBzZWNvbmRzLCBpbnQgbmFub3NlY29uZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0aW1lc3RhbXAgPSBuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IHNlY29uZHMsIE5hbm9zID0gbmFub3NlY29uZHMgfTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbj4oKCkgPT4gSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdCh0aW1lc3RhbXApKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUaW1lc3RhbXBGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcyB7IFRpbWVzdGFtcEZpZWxkID0gbmV3IFRpbWVzdGFtcCgpIH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICd0aW1lc3RhbXBGaWVsZCc6ICcxOTcwLTAxLTAxVDAwOjAwOjAwWicgfSIsIEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgwLCAwLCAiMHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDEsIDAsICIxcyIpXQotICAgICAgICBbVGVzdENhc2UoLTEsIDAsICItMXMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEsICIwLjAwMDAwMDAwMXMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEwLCAiMC4wMDAwMDAwMTBzIildCi0gICAgICAgIFtUZXN0Q2FzZSgwLCAxMDAsICIwLjAwMDAwMDEwMHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEwMDAsICIwLjAwMDAwMXMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEwMDAwLCAiMC4wMDAwMTBzIildCi0gICAgICAgIFtUZXN0Q2FzZSgwLCAxMDAwMDAsICIwLjAwMDEwMHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEwMDAwMDAsICIwLjAwMXMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEwMDAwMDAwLCAiMC4wMTBzIildCi0gICAgICAgIFtUZXN0Q2FzZSgwLCAxMDAwMDAwMDAsICIwLjEwMHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEyMDAwMDAwMCwgIjAuMTIwcyIpXQotICAgICAgICBbVGVzdENhc2UoMCwgMTIzMDAwMDAwLCAiMC4xMjNzIildCi0gICAgICAgIFtUZXN0Q2FzZSgwLCAxMjM0MDAwMDAsICIwLjEyMzQwMHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEyMzQ1MDAwMCwgIjAuMTIzNDUwcyIpXQotICAgICAgICBbVGVzdENhc2UoMCwgMTIzNDU2MDAwLCAiMC4xMjM0NTZzIildCi0gICAgICAgIFtUZXN0Q2FzZSgwLCAxMjM0NTY3MDAsICIwLjEyMzQ1NjcwMHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDEyMzQ1Njc4MCwgIjAuMTIzNDU2NzgwcyIpXQotICAgICAgICBbVGVzdENhc2UoMCwgMTIzNDU2Nzg5LCAiMC4xMjM0NTY3ODlzIildCi0gICAgICAgIFtUZXN0Q2FzZSgwLCAtMTAwMDAwMDAwLCAiLTAuMTAwcyIpXQotICAgICAgICBbVGVzdENhc2UoMSwgMTAwMDAwMDAwLCAiMS4xMDBzIildCi0gICAgICAgIFtUZXN0Q2FzZSgtMSwgLTEwMDAwMDAwMCwgIi0xLjEwMHMiKV0KLSAgICAgICAgcHVibGljIHZvaWQgRHVyYXRpb25TdGFuZGFsb25lKGxvbmcgc2Vjb25kcywgaW50IG5hbm9zZWNvbmRzLCBzdHJpbmcgZXhwZWN0ZWQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBqc29uID0gSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gc2Vjb25kcywgTmFub3MgPSBuYW5vc2Vjb25kcyB9KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChXcmFwSW5RdW90ZXMoZXhwZWN0ZWQpLCBqc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoMSwgMjEyMzQ1Njc4OSldCi0gICAgICAgIFtUZXN0Q2FzZSgxLCAtMTAwMDAwMDAwKV0KLSAgICAgICAgcHVibGljIHZvaWQgRHVyYXRpb25TdGFuZGFsb25lX05vbk5vcm1hbGl6ZWQobG9uZyBzZWNvbmRzLCBpbnQgbmFub3NlY29uZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG5ldyBEdXJhdGlvbiB7IFNlY29uZHMgPSBzZWNvbmRzLCBOYW5vcyA9IG5hbm9zZWNvbmRzIH07Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24+KCgpID0+IEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQoZHVyYXRpb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBEdXJhdGlvbkZpZWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgRHVyYXRpb25GaWVsZCA9IG5ldyBEdXJhdGlvbigpIH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdkdXJhdGlvbkZpZWxkJzogJzBzJyB9IiwgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RydWN0U2FtcGxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgU3RydWN0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRmllbGRzID0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHsgImEiLCBWYWx1ZS5Gb3JOdWxsKCkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAiYiIsIFZhbHVlLkZvckJvb2woZmFsc2UpIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgImMiLCBWYWx1ZS5Gb3JOdW1iZXIoMTAuNSkgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAiZCIsIFZhbHVlLkZvclN0cmluZygidGV4dCIpIH0sCi0gICAgICAgICAgICAgICAgICAgIHsgImUiLCBWYWx1ZS5Gb3JMaXN0KFZhbHVlLkZvclN0cmluZygidDEiKSwgVmFsdWUuRm9yTnVtYmVyKDUpKSB9LAotICAgICAgICAgICAgICAgICAgICB7ICJmIiwgVmFsdWUuRm9yU3RydWN0KG5ldyBTdHJ1Y3QgeyBGaWVsZHMgPSB7IHsgIm5lc3RlZCIsIFZhbHVlLkZvclN0cmluZygidmFsdWUiKSB9IH0gfSkgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdhJzogbnVsbCwgJ2InOiBmYWxzZSwgJ2MnOiAxMC41LCAnZCc6ICd0ZXh0JywgJ2UnOiBbICd0MScsIDUgXSwgJ2YnOiB7ICduZXN0ZWQnOiAndmFsdWUnIH0gfSIsIG1lc3NhZ2UuVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJmb29fX2JhciIpXQotICAgICAgICBbVGVzdENhc2UoImZvb18zX2FyIildCi0gICAgICAgIFtUZXN0Q2FzZSgiZm9vQmFyIildCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkTWFza0ludmFsaWQoc3RyaW5nIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFzayA9IG5ldyBGaWVsZE1hc2sgeyBQYXRocyA9IHsgaW5wdXQgfSB9OwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uPigoKSA9PiBKc29uRm9ybWF0dGVyLkRlZmF1bHQuRm9ybWF0KG1hc2spKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBGaWVsZE1hc2tTdGFuZGFsb25lKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZpZWxkTWFzayA9IG5ldyBGaWVsZE1hc2sgeyBQYXRocyA9IHsgIiIsICJzaW5nbGUiLCAid2l0aF91bmRlcnNjb3JlIiwgIm5lc3RlZC5maWVsZC5uYW1lIiwgIm5lc3RlZC4uZG91YmxlX2RvdCIgfSB9OwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJcIixzaW5nbGUsd2l0aFVuZGVyc2NvcmUsbmVzdGVkLmZpZWxkLm5hbWUsbmVzdGVkLi5kb3VibGVEb3RcIiIsIGZpZWxkTWFzay5Ub1N0cmluZygpKTsKLQotICAgICAgICAgICAgLy8gSW52YWxpZCwgYnV0IHdlIHNob3VsZG4ndCBjcmVhdGUgYnJva2VuIEpTT04uLi4KLSAgICAgICAgICAgIGZpZWxkTWFzayA9IG5ldyBGaWVsZE1hc2sgeyBQYXRocyA9IHsgInhcXHkiIH0gfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChAIiIieFxceSIiIiwgZmllbGRNYXNrLlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkTWFza0ZpZWxkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgRmllbGRNYXNrRmllbGQgPSBuZXcgRmllbGRNYXNrIHsgUGF0aHMgPSB7ICJ1c2VyLmRpc3BsYXlfbmFtZSIsICJwaG90byIgfSB9IH07Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdmaWVsZE1hc2tGaWVsZCc6ICd1c2VyLmRpc3BsYXlOYW1lLHBob3RvJyB9IiwgSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTb3VyY2VDb250ZXh0IGlzIGFuIGV4YW1wbGUgb2YgYSB3ZWxsLWtub3duIHR5cGUgd2l0aCBubyBzcGVjaWFsIEpTT04gaGFuZGxpbmcKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNvdXJjZUNvbnRleHRTdGFuZGFsb25lKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgU291cmNlQ29udGV4dCB7IEZpbGVOYW1lID0gImZvby5wcm90byIgfTsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ2ZpbGVOYW1lJzogJ2Zvby5wcm90bycgfSIsIEpzb25Gb3JtYXR0ZXIuRGVmYXVsdC5Gb3JtYXQobWVzc2FnZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFueVdlbGxLbm93blR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZm9ybWF0dGVyID0gbmV3IEpzb25Gb3JtYXR0ZXIobmV3IEpzb25Gb3JtYXR0ZXIuU2V0dGluZ3MoZmFsc2UsIFR5cGVSZWdpc3RyeS5Gcm9tTWVzc2FnZXMoVGltZXN0YW1wLkRlc2NyaXB0b3IpKSk7Ci0gICAgICAgICAgICB2YXIgdGltZXN0YW1wID0gbmV3IERhdGVUaW1lKDE2NzMsIDYsIDE5LCAxMiwgMzQsIDU2LCBEYXRlVGltZUtpbmQuVXRjKS5Ub1RpbWVzdGFtcCgpOwotICAgICAgICAgICAgdmFyIGFueSA9IEFueS5QYWNrKHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICBBc3NlcnRKc29uKCJ7ICdAdHlwZSc6ICd0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAnLCAndmFsdWUnOiAnMTY3My0wNi0xOVQxMjozNDo1NlonIH0iLCBmb3JtYXR0ZXIuRm9ybWF0KGFueSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFueU1lc3NhZ2VUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IG5ldyBKc29uRm9ybWF0dGVyKG5ldyBKc29uRm9ybWF0dGVyLlNldHRpbmdzKGZhbHNlLCBUeXBlUmVnaXN0cnkuRnJvbU1lc3NhZ2VzKFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yKSkpOwotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzIHsgU2luZ2xlSW50MzIgPSAxMCwgU2luZ2xlTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB7IEJiID0gMjAgfSB9OwotICAgICAgICAgICAgdmFyIGFueSA9IEFueS5QYWNrKG1lc3NhZ2UpOwotICAgICAgICAgICAgQXNzZXJ0SnNvbigieyAnQHR5cGUnOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnLCAnc2luZ2xlSW50MzInOiAxMCwgJ3NpbmdsZU5lc3RlZE1lc3NhZ2UnOiB7ICdiYic6IDIwIH0gfSIsIGZvcm1hdHRlci5Gb3JtYXQoYW55KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQW55TWVzc2FnZVR5cGVfQ3VzdG9tUHJlZml4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IG5ldyBKc29uRm9ybWF0dGVyKG5ldyBKc29uRm9ybWF0dGVyLlNldHRpbmdzKGZhbHNlLCBUeXBlUmVnaXN0cnkuRnJvbU1lc3NhZ2VzKFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yKSkpOwotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzIHsgU2luZ2xlSW50MzIgPSAxMCB9OwotICAgICAgICAgICAgdmFyIGFueSA9IEFueS5QYWNrKG1lc3NhZ2UsICJmb28uYmFyL2JheiIpOwotICAgICAgICAgICAgQXNzZXJ0SnNvbigieyAnQHR5cGUnOiAnZm9vLmJhci9iYXovcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJywgJ3NpbmdsZUludDMyJzogMTAgfSIsIGZvcm1hdHRlci5Gb3JtYXQoYW55KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQW55TmVzdGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0gVHlwZVJlZ2lzdHJ5LkZyb21NZXNzYWdlcyhUZXN0V2VsbEtub3duVHlwZXMuRGVzY3JpcHRvciwgVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IpOwotICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IG5ldyBKc29uRm9ybWF0dGVyKG5ldyBKc29uRm9ybWF0dGVyLlNldHRpbmdzKGZhbHNlLCByZWdpc3RyeSkpOwotCi0gICAgICAgICAgICAvLyBOZXN0IGFuIEFueSBhcyB0aGUgdmFsdWUgb2YgYW4gQW55LgotICAgICAgICAgICAgdmFyIGRvdWJsZU5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzIHsgU2luZ2xlSW50MzIgPSAyMCB9OwotICAgICAgICAgICAgdmFyIG5lc3RlZE1lc3NhZ2UgPSBBbnkuUGFjayhkb3VibGVOZXN0ZWRNZXNzYWdlKTsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcyB7IEFueUZpZWxkID0gQW55LlBhY2sobmVzdGVkTWVzc2FnZSkgfTsKLSAgICAgICAgICAgIEFzc2VydEpzb24oInsgJ2FueUZpZWxkJzogeyAnQHR5cGUnOiAndHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuQW55JywgJ3ZhbHVlJzogeyAnQHR5cGUnOiAndHlwZS5nb29nbGVhcGlzLmNvbS9wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnLCAnc2luZ2xlSW50MzInOiAyMCB9IH0gfSIsCi0gICAgICAgICAgICAgICAgZm9ybWF0dGVyLkZvcm1hdChtZXNzYWdlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQW55VW5rbm93blR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGUgZGVmYXVsdCB0eXBlIHJlZ2lzdHJ5IGRvZXNuJ3QgaGF2ZSBhbnkgdHlwZXMgaW4gaXQuCi0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMoKTsKLSAgICAgICAgICAgIHZhciBhbnkgPSBBbnkuUGFjayhtZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbj4oKCkgPT4gSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChhbnkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENoZWNrcyB0aGF0IHRoZSBhY3R1YWwgSlNPTiBpcyB0aGUgc2FtZSBhcyB0aGUgZXhwZWN0ZWQgSlNPTiAtIGJ1dCBhZnRlciByZXBsYWNpbmcKLSAgICAgICAgLy8vIGFsbCBhcG9zdHJvcGhlcyBpbiB0aGUgZXhwZWN0ZWQgSlNPTiB3aXRoIGRvdWJsZSBxdW90ZXMuIFRoaXMgYmFzaWNhbGx5IG1ha2VzIHRoZSB0ZXN0cyBlYXNpZXIKLSAgICAgICAgLy8vIHRvIHJlYWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQXNzZXJ0SnNvbihzdHJpbmcgZXhwZWN0ZWRKc29uV2l0aEFwb3N0cm9waGVzLCBzdHJpbmcgYWN0dWFsSnNvbikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGV4cGVjdGVkSnNvbiA9IGV4cGVjdGVkSnNvbldpdGhBcG9zdHJvcGhlcy5SZXBsYWNlKCInIiwgIlwiIik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRKc29uLCBhY3R1YWxKc29uKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvSnNvblBhcnNlclRlc3QuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0pzb25QYXJzZXJUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjM2FkODUxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvSnNvblBhcnNlclRlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MzYgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb247Ci11c2luZyBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvczsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlczsKLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLXVzaW5nIFN5c3RlbTsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVW5pdCB0ZXN0cyBmb3IgSlNPTiBwYXJzaW5nLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGNsYXNzIEpzb25QYXJzZXJUZXN0Ci0gICAgewotICAgICAgICAvLyBTYW5pdHkgc21va2UgdGVzdAotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQWxsVHlwZXNSb3VuZHRyaXAoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRSb3VuZHRyaXAoU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBNYXBzKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0Um91bmR0cmlwKG5ldyBUZXN0TWFwIHsgTWFwU3RyaW5nU3RyaW5nID0geyB7ICJ3aXRoIHNwYWNlcyIsICJiYXIiIH0sIHsgImEiLCAiYiIgfSB9IH0pOwotICAgICAgICAgICAgQXNzZXJ0Um91bmR0cmlwKG5ldyBUZXN0TWFwIHsgTWFwSW50MzJJbnQzMiA9IHsgeyAwLCAxIH0sIHsgMiwgMyB9IH0gfSk7Ci0gICAgICAgICAgICBBc3NlcnRSb3VuZHRyaXAobmV3IFRlc3RNYXAgeyBNYXBCb29sQm9vbCA9IHsgeyBmYWxzZSwgdHJ1ZSB9LCB7IHRydWUsIGZhbHNlIH0gfSB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIiAxICIpXQotICAgICAgICBbVGVzdENhc2UoIisxIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMSwwMDAiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjUiKV0KLSAgICAgICAgcHVibGljIHZvaWQgSW50ZWdlck1hcEtleXNBcmVTdHJpY3Qoc3RyaW5nIGtleVRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRlc3QgdGhhdCBpbnRlZ2VyIHBhcnNpbmcgaXMgc3RyaWN0LiBXZSBhc3N1bWUgdGhhdCBpZiB0aGlzIGlzIGNvcnJlY3QgZm9yIGludDMyLAotICAgICAgICAgICAgLy8gaXQncyBjb3JyZWN0IGZvciBvdGhlciBudW1lcmljIGtleSB0eXBlcy4KLSAgICAgICAgICAgIHZhciBqc29uID0gInsgXCJtYXBJbnQzMkludDMyXCI6IHsgXCIiICsga2V5VGV4dCArICJcIiA6IFwiMVwiIH0gfSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gSnNvblBhcnNlci5EZWZhdWx0LlBhcnNlPFRlc3RNYXA+KGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBPcmlnaW5hbEZpZWxkTmFtZUFjY2VwdGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGpzb24gPSAieyBcInNpbmdsZV9pbnQzMlwiOiAxMCB9IjsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVJbnQzMiA9IDEwIH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTb3VyY2VDb250ZXh0Um91bmR0cmlwKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0Um91bmR0cmlwKG5ldyBTb3VyY2VDb250ZXh0IHsgRmlsZU5hbWUgPSAiZm9vLnByb3RvIiB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTaW5ndWxhcldyYXBwZXJzX0RlZmF1bHROb25OdWxsVmFsdWVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nRmllbGQgPSAiIiwKLSAgICAgICAgICAgICAgICBCeXRlc0ZpZWxkID0gQnl0ZVN0cmluZy5FbXB0eSwKLSAgICAgICAgICAgICAgICBCb29sRmllbGQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICBGbG9hdEZpZWxkID0gMGYsCi0gICAgICAgICAgICAgICAgRG91YmxlRmllbGQgPSAwZCwKLSAgICAgICAgICAgICAgICBJbnQzMkZpZWxkID0gMCwKLSAgICAgICAgICAgICAgICBJbnQ2NEZpZWxkID0gMCwKLSAgICAgICAgICAgICAgICBVaW50MzJGaWVsZCA9IDAsCi0gICAgICAgICAgICAgICAgVWludDY0RmllbGQgPSAwCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgQXNzZXJ0Um91bmR0cmlwKG1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpbmd1bGFyV3JhcHBlcnNfTm9uRGVmYXVsdFZhbHVlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFN0cmluZ0ZpZWxkID0gIngiLAotICAgICAgICAgICAgICAgIEJ5dGVzRmllbGQgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMpLAotICAgICAgICAgICAgICAgIEJvb2xGaWVsZCA9IHRydWUsCi0gICAgICAgICAgICAgICAgRmxvYXRGaWVsZCA9IDEyLjVmLAotICAgICAgICAgICAgICAgIERvdWJsZUZpZWxkID0gMTIuMjVkLAotICAgICAgICAgICAgICAgIEludDMyRmllbGQgPSAxLAotICAgICAgICAgICAgICAgIEludDY0RmllbGQgPSAyLAotICAgICAgICAgICAgICAgIFVpbnQzMkZpZWxkID0gMywKLSAgICAgICAgICAgICAgICBVaW50NjRGaWVsZCA9IDQKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBBc3NlcnRSb3VuZHRyaXAobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2luZ3VsYXJXcmFwcGVyc19FeHBsaWNpdE51bGxzKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gV2hlbiB3ZSBwYXJzZSB0aGUgInZhbHVlRmllbGQiOiBudWxsIHBhcnQsIHdlIHJlbWVtYmVyIGl0Li4uIGJhc2ljYWxseSwgaXQncyBvbmUgY2FzZQotICAgICAgICAgICAgLy8gd2hlcmUgZXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgZG9uJ3QgZnVsbHkgcm91bmR0cmlwLgotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgVmFsdWVGaWVsZCA9IFZhbHVlLkZvck51bGwoKSB9OwotICAgICAgICAgICAgdmFyIGpzb24gPSBuZXcgSnNvbkZvcm1hdHRlcihuZXcgSnNvbkZvcm1hdHRlci5TZXR0aW5ncyh0cnVlKSkuRm9ybWF0KG1lc3NhZ2UpOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IEpzb25QYXJzZXIuRGVmYXVsdC5QYXJzZTxUZXN0V2VsbEtub3duVHlwZXM+KGpzb24pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIHBhcnNlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihJbnQzMlZhbHVlKSwgIjMyIiwgMzIpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKEludDY0VmFsdWUpLCAiMzIiLCAzMkwpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKFVJbnQzMlZhbHVlKSwgIjMyIiwgMzJVKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihVSW50NjRWYWx1ZSksICIzMiIsIDMyVUwpXQotICAgICAgICBbVGVzdENhc2UodHlwZW9mKFN0cmluZ1ZhbHVlKSwgIlwiZm9vXCIiLCAiZm9vIildCi0gICAgICAgIFtUZXN0Q2FzZSh0eXBlb2YoRmxvYXRWYWx1ZSksICIxLjUiLCAxLjVmKV0KLSAgICAgICAgW1Rlc3RDYXNlKHR5cGVvZihEb3VibGVWYWx1ZSksICIxLjUiLCAxLjVkKV0KLSAgICAgICAgcHVibGljIHZvaWQgV3JhcHBlcnNfU3RhbmRhbG9uZShTeXN0ZW0uVHlwZSB3cmFwcGVyVHlwZSwgc3RyaW5nIGpzb24sIG9iamVjdCBleHBlY3RlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTWVzc2FnZSBwYXJzZWQgPSAoSU1lc3NhZ2UpQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKHdyYXBwZXJUeXBlKTsKLSAgICAgICAgICAgIElNZXNzYWdlIGV4cGVjdGVkID0gKElNZXNzYWdlKUFjdGl2YXRvci5DcmVhdGVJbnN0YW5jZSh3cmFwcGVyVHlwZSk7Ci0gICAgICAgICAgICBKc29uUGFyc2VyLkRlZmF1bHQuTWVyZ2UocGFyc2VkLCAibnVsbCIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBwYXJzZWQpOwotCi0gICAgICAgICAgICBKc29uUGFyc2VyLkRlZmF1bHQuTWVyZ2UocGFyc2VkLCBqc29uKTsKLSAgICAgICAgICAgIGV4cGVjdGVkLkRlc2NyaXB0b3IuRmllbGRzW1dyYXBwZXJzUmVmbGVjdGlvbi5XcmFwcGVyVmFsdWVGaWVsZE51bWJlcl0uQWNjZXNzb3IuU2V0VmFsdWUoZXhwZWN0ZWQsIGV4cGVjdGVkVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBwYXJzZWQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEV4cGxpY2l0TnVsbFZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAie1widmFsdWVGaWVsZFwiOiBudWxsfSI7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IEpzb25QYXJzZXIuRGVmYXVsdC5QYXJzZTxUZXN0V2VsbEtub3duVHlwZXM+KGpzb24pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBUZXN0V2VsbEtub3duVHlwZXMgeyBWYWx1ZUZpZWxkID0gVmFsdWUuRm9yTnVsbCgpIH0sIG1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ5dGVzV3JhcHBlcl9TdGFuZGFsb25lKCkKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZVN0cmluZyBkYXRhID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzKTsKLSAgICAgICAgICAgIC8vIENhbid0IGRvIHRoaXMgd2l0aCBhdHRyaWJ1dGVzLi4uCi0gICAgICAgICAgICB2YXIgcGFyc2VkID0gSnNvblBhcnNlci5EZWZhdWx0LlBhcnNlPEJ5dGVzVmFsdWU+KFdyYXBJblF1b3RlcyhkYXRhLlRvQmFzZTY0KCkpKTsKLSAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBCeXRlc1ZhbHVlIHsgVmFsdWUgPSBkYXRhIH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIHBhcnNlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVwZWF0ZWRXcmFwcGVycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFJlcGVhdGVkV2VsbEtub3duVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCb29sRmllbGQgPSB7IHRydWUsIGZhbHNlIH0sCi0gICAgICAgICAgICAgICAgQnl0ZXNGaWVsZCA9IHsgQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzKSwgQnl0ZVN0cmluZy5Db3B5RnJvbSg0LCA1LCA2KSwgQnl0ZVN0cmluZy5FbXB0eSB9LAotICAgICAgICAgICAgICAgIERvdWJsZUZpZWxkID0geyAxMi41LCAtMS41LCAwZCB9LAotICAgICAgICAgICAgICAgIEZsb2F0RmllbGQgPSB7IDEyMy4yNWYsIC0yMGYsIDBmIH0sCi0gICAgICAgICAgICAgICAgSW50MzJGaWVsZCA9IHsgaW50Lk1heFZhbHVlLCBpbnQuTWluVmFsdWUsIDAgfSwKLSAgICAgICAgICAgICAgICBJbnQ2NEZpZWxkID0geyBsb25nLk1heFZhbHVlLCBsb25nLk1pblZhbHVlLCAwTCB9LAotICAgICAgICAgICAgICAgIFN0cmluZ0ZpZWxkID0geyAiRmlyc3QiLCAiU2Vjb25kIiwgIiIgfSwKLSAgICAgICAgICAgICAgICBVaW50MzJGaWVsZCA9IHsgdWludC5NYXhWYWx1ZSwgdWludC5NaW5WYWx1ZSwgMFUgfSwKLSAgICAgICAgICAgICAgICBVaW50NjRGaWVsZCA9IHsgdWxvbmcuTWF4VmFsdWUsIHVsb25nLk1pblZhbHVlLCAwVUwgfSwKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBBc3NlcnRSb3VuZHRyaXAobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVwZWF0ZWRGaWVsZF9OdWxsRWxlbWVudFByb2hpYml0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlXCI6IFtudWxsXSB9IjsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVwZWF0ZWRGaWVsZF9OdWxsT3ZlcmFsbFZhbHVlQWxsb3dlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VcIjogbnVsbCB9IjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgVGVzdEFsbFR5cGVzKCksIFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoInsgXCJtYXBJbnQzMkludDMyXCI6IHsgXCIxMFwiOiBudWxsIH0iKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJ7IFwibWFwU3RyaW5nU3RyaW5nXCI6IHsgXCJhYmNcIjogbnVsbCB9IildCi0gICAgICAgIFtUZXN0Q2FzZSgieyBcIm1hcEludDMyRm9yZWlnbk1lc3NhZ2VcIjogeyBcIjEwXCI6IG51bGwgfSIpXQotICAgICAgICBwdWJsaWMgdm9pZCBNYXBGaWVsZF9OdWxsVmFsdWVQcm9oaWJpdGVkKHN0cmluZyBqc29uKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdE1hcC5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBNYXBGaWVsZF9OdWxsT3ZlcmFsbFZhbHVlQWxsb3dlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJtYXBJbnQzMkludDMyXCI6IG51bGwgfSI7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IFRlc3RNYXAoKSwgVGVzdE1hcC5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBJbmRpdmlkdWFsV3JhcHBlclR5cGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBTdHJpbmdWYWx1ZSB7IFZhbHVlID0gImZvbyIgfSwgU3RyaW5nVmFsdWUuUGFyc2VyLlBhcnNlSnNvbigiXCJmb29cIiIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgSW50MzJWYWx1ZSB7IFZhbHVlID0gMSB9LCBJbnQzMlZhbHVlLlBhcnNlci5QYXJzZUpzb24oIjEiKSk7Ci0gICAgICAgICAgICAvLyBDYW4gcGFyc2Ugc3RyaW5ncyBkaXJlY3RseSB0b28KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgSW50MzJWYWx1ZSB7IFZhbHVlID0gMSB9LCBJbnQzMlZhbHVlLlBhcnNlci5QYXJzZUpzb24oIlwiMVwiIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRSb3VuZHRyaXA8VD4oVCBtZXNzYWdlKSB3aGVyZSBUIDogSU1lc3NhZ2U8VD4sIG5ldygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjbG9uZSA9IG1lc3NhZ2UuQ2xvbmUoKTsKLSAgICAgICAgICAgIHZhciBqc29uID0gSnNvbkZvcm1hdHRlci5EZWZhdWx0LkZvcm1hdChtZXNzYWdlKTsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBKc29uUGFyc2VyLkRlZmF1bHQuUGFyc2U8VD4oanNvbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoY2xvbmUsIHBhcnNlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCIwIiwgMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTAiLCAwKV0gLy8gTm90IGVudGlyZWx5IGNsZWFyIHdoZXRoZXIgd2UgaW50ZW5kIHRvIGFsbG93IHRoaXMuLi4KLSAgICAgICAgW1Rlc3RDYXNlKCIxIiwgMSldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEiLCAtMSldCi0gICAgICAgIFtUZXN0Q2FzZSgiMjE0NzQ4MzY0NyIsIDIxNDc0ODM2NDcpXQotICAgICAgICBbVGVzdENhc2UoIi0yMTQ3NDgzNjQ4IiwgLTIxNDc0ODM2NDgpXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJpbmdUb0ludDMyX1ZhbGlkKHN0cmluZyBqc29uVmFsdWUsIGludCBleHBlY3RlZFBhcnNlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlSW50MzJcIjogXCIiICsganNvblZhbHVlICsgIlwifSI7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRQYXJzZWRWYWx1ZSwgcGFyc2VkLlNpbmdsZUludDMyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIiswIildCi0gICAgICAgIFtUZXN0Q2FzZSgiIDEiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxICIpXQotICAgICAgICBbVGVzdENhc2UoIjAwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLTAwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLS0xIildCi0gICAgICAgIFtUZXN0Q2FzZSgiKzEiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjUiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxZTEwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjE0NzQ4MzY0OCIpXQotICAgICAgICBbVGVzdENhc2UoIi0yMTQ3NDgzNjQ5IildCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0cmluZ1RvSW50MzJfSW52YWxpZChzdHJpbmcganNvblZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlSW50MzJcIjogXCIiICsganNvblZhbHVlICsgIlwifSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMCIsIDBVKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxIiwgMVUpXQotICAgICAgICBbVGVzdENhc2UoIjQyOTQ5NjcyOTUiLCA0Mjk0OTY3Mjk1VSldCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0cmluZ1RvVUludDMyX1ZhbGlkKHN0cmluZyBqc29uVmFsdWUsIHVpbnQgZXhwZWN0ZWRQYXJzZWRWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAieyBcInNpbmdsZVVpbnQzMlwiOiBcIiIgKyBqc29uVmFsdWUgKyAiXCJ9IjsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFBhcnNlZFZhbHVlLCBwYXJzZWQuU2luZ2xlVWludDMyKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IGFueXRoaW5nIG5vbi1ib3VuZHMtcmVsYXRlZCBpcyBjb3ZlcmVkIGluIHRoZSBJbnQzMiBjYXNlCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIi0xIildCi0gICAgICAgIFtUZXN0Q2FzZSgiNDI5NDk2NzI5NiIpXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJpbmdUb1VJbnQzMl9JbnZhbGlkKHN0cmluZyBqc29uVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJzaW5nbGVVaW50MzJcIjogXCIiICsganNvblZhbHVlICsgIlwifSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMCIsIDBMKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxIiwgMUwpXQotICAgICAgICBbVGVzdENhc2UoIi0xIiwgLTFMKV0KLSAgICAgICAgW1Rlc3RDYXNlKCI5MjIzMzcyMDM2ODU0Nzc1ODA3IiwgOTIyMzM3MjAzNjg1NDc3NTgwNyldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiLCAtOTIyMzM3MjAzNjg1NDc3NTgwOCldCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0cmluZ1RvSW50NjRfVmFsaWQoc3RyaW5nIGpzb25WYWx1ZSwgbG9uZyBleHBlY3RlZFBhcnNlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlSW50NjRcIjogXCIiICsganNvblZhbHVlICsgIlwifSI7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRQYXJzZWRWYWx1ZSwgcGFyc2VkLlNpbmdsZUludDY0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IGFueXRoaW5nIG5vbi1ib3VuZHMtcmVsYXRlZCBpcyBjb3ZlcmVkIGluIHRoZSBJbnQzMiBjYXNlCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIi05MjIzMzcyMDM2ODU0Nzc1ODA5IildCi0gICAgICAgIFtUZXN0Q2FzZSgiOTIyMzM3MjAzNjg1NDc3NTgwOCIpXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJpbmdUb0ludDY0X0ludmFsaWQoc3RyaW5nIGpzb25WYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAieyBcInNpbmdsZUludDY0XCI6IFwiIiArIGpzb25WYWx1ZSArICJcIn0iOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIjAiLCAwVUwpXQotICAgICAgICBbVGVzdENhc2UoIjEiLCAxVUwpXQotICAgICAgICBbVGVzdENhc2UoIjE4NDQ2NzQ0MDczNzA5NTUxNjE1IiwgMTg0NDY3NDQwNzM3MDk1NTE2MTUpXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJpbmdUb1VJbnQ2NF9WYWxpZChzdHJpbmcganNvblZhbHVlLCB1bG9uZyBleHBlY3RlZFBhcnNlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlVWludDY0XCI6IFwiIiArIGpzb25WYWx1ZSArICJcIn0iOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUGFyc2VkVmFsdWUsIHBhcnNlZC5TaW5nbGVVaW50NjQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gQXNzdW1lIHRoYXQgYW55dGhpbmcgbm9uLWJvdW5kcy1yZWxhdGVkIGlzIGNvdmVyZWQgaW4gdGhlIEludDMyIGNhc2UKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxODQ0Njc0NDA3MzcwOTU1MTYxNiIpXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJpbmdUb1VJbnQ2NF9JbnZhbGlkKHN0cmluZyBqc29uVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJzaW5nbGVVaW50NjRcIjogXCIiICsganNvblZhbHVlICsgIlwifSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMCIsIDBkKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxIiwgMWQpXQotICAgICAgICBbVGVzdENhc2UoIjEuMDAwMDAwIiwgMWQpXQotICAgICAgICBbVGVzdENhc2UoIjEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSIsIDFkKV0gLy8gV2UgZG9uJ3Qgbm90aWNlIHRoYXQgd2UgaGF2ZW4ndCBwcmVzZXJ2ZWQgdGhlIGV4YWN0IHZhbHVlCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEiLCAtMWQpXQotICAgICAgICBbVGVzdENhc2UoIjFlMSIsIDEwZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMWUwMSIsIDEwZCldIC8vIExlYWRpbmcgZGVjaW1hbHMgYXJlIGFsbG93ZWQgaW4gZXhwb25lbnRzCi0gICAgICAgIFtUZXN0Q2FzZSgiMUUxIiwgMTBkKV0gLy8gRWl0aGVyIGNhc2UgaXMgZmluZQotICAgICAgICBbVGVzdENhc2UoIi0xZTEiLCAtMTBkKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjVlMSIsIDE1ZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEuNWUxIiwgLTE1ZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTVlLTEiLCAxLjVkKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMTVlLTEiLCAtMS41ZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMS43OTc2OWUzMDgiLCAxLjc5NzY5ZTMwOCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEuNzk3NjllMzA4IiwgLTEuNzk3NjllMzA4KV0KLSAgICAgICAgW1Rlc3RDYXNlKCJJbmZpbml0eSIsIGRvdWJsZS5Qb3NpdGl2ZUluZmluaXR5KV0KLSAgICAgICAgW1Rlc3RDYXNlKCItSW5maW5pdHkiLCBkb3VibGUuTmVnYXRpdmVJbmZpbml0eSldCi0gICAgICAgIFtUZXN0Q2FzZSgiTmFOIiwgZG91YmxlLk5hTildCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0cmluZ1RvRG91YmxlX1ZhbGlkKHN0cmluZyBqc29uVmFsdWUsIGRvdWJsZSBleHBlY3RlZFBhcnNlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlRG91YmxlXCI6IFwiIiArIGpzb25WYWx1ZSArICJcIn0iOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUGFyc2VkVmFsdWUsIHBhcnNlZC5TaW5nbGVEb3VibGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMS43OTc3ZTMwOCIpXQotICAgICAgICBbVGVzdENhc2UoIi0xLjc5NzdlMzA4IildCi0gICAgICAgIFtUZXN0Q2FzZSgiMWUzMDkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLDAiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjAuMCIpXQotICAgICAgICBbVGVzdENhc2UoIisxIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMDAiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIwMSIpXQotICAgICAgICBbVGVzdENhc2UoIi0wMCIpXQotICAgICAgICBbVGVzdENhc2UoIi0wMSIpXQotICAgICAgICBbVGVzdENhc2UoIi0tMSIpXQotICAgICAgICBbVGVzdENhc2UoIiBJbmZpbml0eSIpXQotICAgICAgICBbVGVzdENhc2UoIiAtSW5maW5pdHkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJOYU4gIildCi0gICAgICAgIFtUZXN0Q2FzZSgiSW5maW5pdHkgIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLUluZmluaXR5ICIpXQotICAgICAgICBbVGVzdENhc2UoIiBOYU4iKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJJTkZJTklUWSIpXQotICAgICAgICBbVGVzdENhc2UoIm5hbiIpXQotICAgICAgICBbVGVzdENhc2UoIlx1MDBCRCIpXSAvLyAxLzIgYXMgYSBzaW5nbGUgVW5pY29kZSBjaGFyYWN0ZXIuIEp1c3Qgc2FuaXR5IGNoZWNraW5nLi4uCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0cmluZ1RvRG91YmxlX0ludmFsaWQoc3RyaW5nIGpzb25WYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAieyBcInNpbmdsZURvdWJsZVwiOiBcIiIgKyBqc29uVmFsdWUgKyAiXCJ9IjsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCIwIiwgMGYpXQotICAgICAgICBbVGVzdENhc2UoIjEiLCAxZildCi0gICAgICAgIFtUZXN0Q2FzZSgiMS4wMDAwMDAiLCAxZildCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEiLCAtMWYpXQotICAgICAgICBbVGVzdENhc2UoIjMuNDAyODIzZTM4IiwgMy40MDI4MjNlMzhmKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMy40MDI4MjNlMzgiLCAtMy40MDI4MjNlMzhmKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjVlMSIsIDE1ZildCi0gICAgICAgIFtUZXN0Q2FzZSgiMTVlLTEiLCAxLjVmKV0KLSAgICAgICAgcHVibGljIHZvaWQgU3RyaW5nVG9GbG9hdF9WYWxpZChzdHJpbmcganNvblZhbHVlLCBmbG9hdCBleHBlY3RlZFBhcnNlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlRmxvYXRcIjogXCIiICsganNvblZhbHVlICsgIlwifSI7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRQYXJzZWRWYWx1ZSwgcGFyc2VkLlNpbmdsZUZsb2F0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIjMuNDAyODI0ZTM4IildCi0gICAgICAgIFtUZXN0Q2FzZSgiLTMuNDAyODI0ZTM4IildCi0gICAgICAgIFtUZXN0Q2FzZSgiMSwwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMS4wLjAiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIrMSIpXQotICAgICAgICBbVGVzdENhc2UoIjAwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLS0xIildCi0gICAgICAgIHB1YmxpYyB2b2lkIFN0cmluZ1RvRmxvYXRfSW52YWxpZChzdHJpbmcganNvblZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlRmxvYXRcIjogXCIiICsganNvblZhbHVlICsgIlwifSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMCIsIDApXQotICAgICAgICBbVGVzdENhc2UoIi0wIiwgMCldIC8vIE5vdCBlbnRpcmVseSBjbGVhciB3aGV0aGVyIHdlIGludGVuZCB0byBhbGxvdyB0aGlzLi4uCi0gICAgICAgIFtUZXN0Q2FzZSgiMSIsIDEpXQotICAgICAgICBbVGVzdENhc2UoIi0xIiwgLTEpXQotICAgICAgICBbVGVzdENhc2UoIjIxNDc0ODM2NDciLCAyMTQ3NDgzNjQ3KV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMjE0NzQ4MzY0OCIsIC0yMTQ3NDgzNjQ4KV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxZTEiLCAxMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTFlMSIsIC0xMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTAuMDAiLCAxMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEwLjAwIiwgLTEwKV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9JbnQzMl9WYWxpZChzdHJpbmcganNvblZhbHVlLCBpbnQgZXhwZWN0ZWRQYXJzZWRWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAieyBcInNpbmdsZUludDMyXCI6ICIgKyBqc29uVmFsdWUgKyAifSI7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRQYXJzZWRWYWx1ZSwgcGFyc2VkLlNpbmdsZUludDMyKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIiswIiwgdHlwZW9mKEludmFsaWRKc29uRXhjZXB0aW9uKSldCi0gICAgICAgIFtUZXN0Q2FzZSgiMDAiLCB0eXBlb2YoSW52YWxpZEpzb25FeGNlcHRpb24pKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMDAiLCB0eXBlb2YoSW52YWxpZEpzb25FeGNlcHRpb24pKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItLTEiLCB0eXBlb2YoSW52YWxpZEpzb25FeGNlcHRpb24pKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIrMSIsIHR5cGVvZihJbnZhbGlkSnNvbkV4Y2VwdGlvbikpXQotICAgICAgICBbVGVzdENhc2UoIjEuNSIsIHR5cGVvZihJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24pKV0KLSAgICAgICAgLy8gVmFsdWUgaXMgb3V0IG9mIHJhbmdlCi0gICAgICAgIFtUZXN0Q2FzZSgiMWUxMCIsIHR5cGVvZihJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24pKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMTQ3NDgzNjQ4IiwgdHlwZW9mKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbikpXQotICAgICAgICBbVGVzdENhc2UoIi0yMTQ3NDgzNjQ5IiwgdHlwZW9mKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBOdW1iZXJUb0ludDMyX0ludmFsaWQoc3RyaW5nIGpzb25WYWx1ZSwgU3lzdGVtLlR5cGUgZXhwZWN0ZWRFeGNlcHRpb25UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlSW50MzJcIjogIiArIGpzb25WYWx1ZSArICJ9IjsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3MoZXhwZWN0ZWRFeGNlcHRpb25UeXBlLCAoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCIwIiwgMFUpXQotICAgICAgICBbVGVzdENhc2UoIjEiLCAxVSldCi0gICAgICAgIFtUZXN0Q2FzZSgiNDI5NDk2NzI5NSIsIDQyOTQ5NjcyOTVVKV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9VSW50MzJfVmFsaWQoc3RyaW5nIGpzb25WYWx1ZSwgdWludCBleHBlY3RlZFBhcnNlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlVWludDMyXCI6ICIgKyBqc29uVmFsdWUgKyAifSI7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRQYXJzZWRWYWx1ZSwgcGFyc2VkLlNpbmdsZVVpbnQzMik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCBhbnl0aGluZyBub24tYm91bmRzLXJlbGF0ZWQgaXMgY292ZXJlZCBpbiB0aGUgSW50MzIgY2FzZQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCItMSIpXQotICAgICAgICBbVGVzdENhc2UoIjQyOTQ5NjcyOTYiKV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9VSW50MzJfSW52YWxpZChzdHJpbmcganNvblZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlVWludDMyXCI6ICIgKyBqc29uVmFsdWUgKyAifSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMCIsIDBMKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxIiwgMUwpXQotICAgICAgICBbVGVzdENhc2UoIi0xIiwgLTFMKV0KLSAgICAgICAgLy8gbG9uZy5NYXhWYWx1ZSBpc24ndCBhY3R1YWxseSByZXByZXNlbnRhYmxlIGFzIGEgZG91YmxlLiBUaGlzIHN0cmluZyB2YWx1ZSBpcyB0aGUgaGlnaGVzdAotICAgICAgICAvLyByZXByZXNlbnRhYmxlIHZhbHVlIHdoaWNoIGlzbid0IGdyZWF0ZXIgdGhhbiBsb25nLk1heFZhbHVlLgotICAgICAgICBbVGVzdENhc2UoIjkyMjMzNzIwMzY4NTQ3NzQ3ODQiLCA5MjIzMzcyMDM2ODU0Nzc0Nzg0KV0KLSAgICAgICAgW1Rlc3RDYXNlKCItOTIyMzM3MjAzNjg1NDc3NTgwOCIsIC05MjIzMzcyMDM2ODU0Nzc1ODA4KV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9JbnQ2NF9WYWxpZChzdHJpbmcganNvblZhbHVlLCBsb25nIGV4cGVjdGVkUGFyc2VkVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJzaW5nbGVJbnQ2NFwiOiAiICsganNvblZhbHVlICsgIn0iOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkUGFyc2VkVmFsdWUsIHBhcnNlZC5TaW5nbGVJbnQ2NCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBc3N1bWUgdGhhdCBhbnl0aGluZyBub24tYm91bmRzLXJlbGF0ZWQgaXMgY292ZXJlZCBpbiB0aGUgSW50MzIgY2FzZQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCI5MjIzMzcyMDM2ODU0Nzc1ODA4IildCi0gICAgICAgIC8vIFRoZW9yZXRpY2FsIGJvdW5kIHdvdWxkIGJlIC05MjIzMzcyMDM2ODU0Nzc1ODA5LCBidXQgd2hlbiB0aGF0IGlzIHBhcnNlZCB0byBhIGRvdWJsZQotICAgICAgICAvLyB3ZSBlbmQgdXAgd2l0aCB0aGUgZXhhY3QgdmFsdWUgb2YgbG9uZy5NaW5WYWx1ZSBkdWUgdG8gbGFjayBvZiBwcmVjaXNpb24uIFRoZSB2YWx1ZSBoZXJlCi0gICAgICAgIC8vIGlzIHRoZSAibmV4dCBkb3VibGUgZG93biIuCi0gICAgICAgIFtUZXN0Q2FzZSgiLTkyMjMzNzIwMzY4NTQ3ODAwMDAiKV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9JbnQ2NF9JbnZhbGlkKHN0cmluZyBqc29uVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJzaW5nbGVJbnQ2NFwiOiAiICsganNvblZhbHVlICsgIn0iOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIjAiLCAwVUwpXQotICAgICAgICBbVGVzdENhc2UoIjEiLCAxVUwpXQotICAgICAgICAvLyB1bG9uZy5NYXhWYWx1ZSBpc24ndCByZXByZXNlbnRhYmxlIGFzIGEgZG91YmxlLiBUaGlzIHZhbHVlIGlzIHRoZSBsYXJnZXN0IGRvdWJsZSB3aXRoaW4KLSAgICAgICAgLy8gdGhlIHJhbmdlIG9mIHVsb25nLgotICAgICAgICBbVGVzdENhc2UoIjE4NDQ2NzQ0MDczNzA5NTQ5NTY4IiwgMTg0NDY3NDQwNzM3MDk1NDk1NjhVTCldCi0gICAgICAgIHB1YmxpYyB2b2lkIE51bWJlclRvVUludDY0X1ZhbGlkKHN0cmluZyBqc29uVmFsdWUsIHVsb25nIGV4cGVjdGVkUGFyc2VkVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJzaW5nbGVVaW50NjRcIjogIiArIGpzb25WYWx1ZSArICJ9IjsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFBhcnNlZFZhbHVlLCBwYXJzZWQuU2luZ2xlVWludDY0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEFzc3VtZSB0aGF0IGFueXRoaW5nIG5vbi1ib3VuZHMtcmVsYXRlZCBpcyBjb3ZlcmVkIGluIHRoZSBJbnQzMiBjYXNlCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIi0xIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMTg0NDY3NDQwNzM3MDk1NTE2MTYiKV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9VSW50NjRfSW52YWxpZChzdHJpbmcganNvblZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlVWludDY0XCI6ICIgKyBqc29uVmFsdWUgKyAifSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gVGVzdEFsbFR5cGVzLlBhcnNlci5QYXJzZUpzb24oanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMCIsIDBkKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxIiwgMWQpXQotICAgICAgICBbVGVzdENhc2UoIjEuMDAwMDAwIiwgMWQpXQotICAgICAgICBbVGVzdENhc2UoIjEuMDAwMDAwMDAwMDAwMDAwMDAwMDAwMDAwMSIsIDFkKV0gLy8gV2UgZG9uJ3Qgbm90aWNlIHRoYXQgd2UgaGF2ZW4ndCBwcmVzZXJ2ZWQgdGhlIGV4YWN0IHZhbHVlCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEiLCAtMWQpXQotICAgICAgICBbVGVzdENhc2UoIjFlMSIsIDEwZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMWUwMSIsIDEwZCldIC8vIExlYWRpbmcgZGVjaW1hbHMgYXJlIGFsbG93ZWQgaW4gZXhwb25lbnRzCi0gICAgICAgIFtUZXN0Q2FzZSgiMUUxIiwgMTBkKV0gLy8gRWl0aGVyIGNhc2UgaXMgZmluZQotICAgICAgICBbVGVzdENhc2UoIi0xZTEiLCAtMTBkKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjVlMSIsIDE1ZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEuNWUxIiwgLTE1ZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTVlLTEiLCAxLjVkKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMTVlLTEiLCAtMS41ZCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMS43OTc2OWUzMDgiLCAxLjc5NzY5ZTMwOCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEuNzk3NjllMzA4IiwgLTEuNzk3NjllMzA4KV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9Eb3VibGVfVmFsaWQoc3RyaW5nIGpzb25WYWx1ZSwgZG91YmxlIGV4cGVjdGVkUGFyc2VkVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJzaW5nbGVEb3VibGVcIjogIiArIGpzb25WYWx1ZSArICJ9IjsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFBhcnNlZFZhbHVlLCBwYXJzZWQuU2luZ2xlRG91YmxlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIjEuNzk3N2UzMDgiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMS43OTc3ZTMwOCIpXQotICAgICAgICBbVGVzdENhc2UoIjFlMzA5IildCi0gICAgICAgIFtUZXN0Q2FzZSgiMSwwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMS4wLjAiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIrMSIpXQotICAgICAgICBbVGVzdENhc2UoIjAwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLS0xIildCi0gICAgICAgIFtUZXN0Q2FzZSgiXHUwMEJEIildIC8vIDEvMiBhcyBhIHNpbmdsZSBVbmljb2RlIGNoYXJhY3Rlci4gSnVzdCBzYW5pdHkgY2hlY2tpbmcuLi4KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9Eb3VibGVfSW52YWxpZChzdHJpbmcganNvblZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlRG91YmxlXCI6ICIgKyBqc29uVmFsdWUgKyAifSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRKc29uRXhjZXB0aW9uPigoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCIwIiwgMGYpXQotICAgICAgICBbVGVzdENhc2UoIjEiLCAxZildCi0gICAgICAgIFtUZXN0Q2FzZSgiMS4wMDAwMDAiLCAxZildCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEiLCAtMWYpXQotICAgICAgICBbVGVzdENhc2UoIjMuNDAyODIzZTM4IiwgMy40MDI4MjNlMzhmKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMy40MDI4MjNlMzgiLCAtMy40MDI4MjNlMzhmKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjVlMSIsIDE1ZildCi0gICAgICAgIFtUZXN0Q2FzZSgiMTVlLTEiLCAxLjVmKV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVG9GbG9hdF9WYWxpZChzdHJpbmcganNvblZhbHVlLCBmbG9hdCBleHBlY3RlZFBhcnNlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlRmxvYXRcIjogIiArIGpzb25WYWx1ZSArICJ9IjsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFBhcnNlZFZhbHVlLCBwYXJzZWQuU2luZ2xlRmxvYXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMy40MDI4MjRlMzgiLCB0eXBlb2YoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKSldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTMuNDAyODI0ZTM4IiwgdHlwZW9mKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbikpXQotICAgICAgICBbVGVzdENhc2UoIjEsMCIsIHR5cGVvZihJbnZhbGlkSnNvbkV4Y2VwdGlvbikpXQotICAgICAgICBbVGVzdENhc2UoIjEuMC4wIiwgdHlwZW9mKEludmFsaWRKc29uRXhjZXB0aW9uKSldCi0gICAgICAgIFtUZXN0Q2FzZSgiKzEiLCB0eXBlb2YoSW52YWxpZEpzb25FeGNlcHRpb24pKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIwMCIsIHR5cGVvZihJbnZhbGlkSnNvbkV4Y2VwdGlvbikpXQotICAgICAgICBbVGVzdENhc2UoIi0tMSIsIHR5cGVvZihJbnZhbGlkSnNvbkV4Y2VwdGlvbikpXQotICAgICAgICBwdWJsaWMgdm9pZCBOdW1iZXJUb0Zsb2F0X0ludmFsaWQoc3RyaW5nIGpzb25WYWx1ZSwgU3lzdGVtLlR5cGUgZXhwZWN0ZWRFeGNlcHRpb25UeXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlRmxvYXRcIjogIiArIGpzb25WYWx1ZSArICJ9IjsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3MoZXhwZWN0ZWRFeGNlcHRpb25UeXBlLCAoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUaGUgc2ltcGxlc3Qgd2F5IG9mIHRlc3RpbmcgdGhhdCB0aGUgdmFsdWUgaGFzIHBhcnNlZCBjb3JyZWN0bHkgaXMgdG8gcmVmb3JtYXQgaXQsCi0gICAgICAgIC8vIGFzIHdlIHRydXN0IHRoZSBmb3JtYXR0aW5nLiBJbiBtYW55IGNhc2VzIHRoYXQgd2lsbCBnaXZlIHRoZSBzYW1lIHJlc3VsdCBhcyB0aGUgaW5wdXQsCi0gICAgICAgIC8vIHNvIGluIHRob3NlIGNhc2VzIHdlIGFjY2VwdCBhbiBleHBlY3RlZEZvcm1hdHRlZCB2YWx1ZSBvZiBudWxsLiBTb21ldGltZXMgdGhlIHJlc3VsdHMKLSAgICAgICAgLy8gd2lsbCBiZSBkaWZmZXJlbnQgdGhvdWdoLCBkdWUgdG8gYSBkaWZmZXJlbnQgbnVtYmVyIG9mIGRpZ2l0cyBiZWluZyBwcm92aWRlZC4KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIC8vIFogb2Zmc2V0Ci0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTY3ODlaIiwgbnVsbCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTZaIiwgbnVsbCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjNaIiwgbnVsbCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyM1oiLCBudWxsKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1NjAwMFoiLCAiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTZaIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTYwWiIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1NloiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzAwMDAwMFoiLCAiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjNaIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjMwWiIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyM1oiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjAwWiIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzWiIpXQotCi0gICAgICAgIC8vICswMDowMCBvZmZzZXQKLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OSswMDowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1NiswMDowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1NloiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMyswMDowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyM1oiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzKzAwOjAwIiwgIjIwMTUtMTAtMDlUMTQ6NDY6MjNaIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTYwMDArMDA6MDAiLCAiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTZaIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTYwKzAwOjAwIiwgIjIwMTUtMTAtMDlUMTQ6NDY6MjMuMTIzNDU2WiIpXQotICAgICAgICBbVGVzdENhc2UoIjIwMTUtMTAtMDlUMTQ6NDY6MjMuMTIzMDAwMDAwKzAwOjAwIiwgIjIwMTUtMTAtMDlUMTQ6NDY6MjMuMTIzWiIpXQotICAgICAgICBbVGVzdENhc2UoIjIwMTUtMTAtMDlUMTQ6NDY6MjMuMTIzMCswMDowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyM1oiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjAwKzAwOjAwIiwgIjIwMTUtMTAtMDlUMTQ6NDY6MjNaIildCi0KLSAgICAgICAgLy8gT3RoZXIgb2Zmc2V0cyAoYXNzdW1lIGJ5IG5vdyB0aGF0IHRoZSBzdWJzZWNvbmQgaGFuZGxpbmcgaXMgb2theSkKLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE1OjQ2OjIzLjEyMzQ1Njc4OSswMTowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDEzOjQ2OjIzLjEyMzQ1Njc4OS0wMTowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE1OjE2OjIzLjEyMzQ1Njc4OSswMDozMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjE2OjIzLjEyMzQ1Njc4OS0wMDozMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE2OjMxOjIzLjEyMzQ1Njc4OSswMTo0NSIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDEzOjAxOjIzLjEyMzQ1Njc4OS0wMTo0NSIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTEwVDA4OjQ2OjIzLjEyMzQ1Njc4OSsxODowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA4VDIwOjQ2OjIzLjEyMzQ1Njc4OS0xODowMCIsICIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiKV0KLQotICAgICAgICAvLyBMZWFwIHllYXJzIGFuZCBtaW4vbWF4Ci0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNi0wMi0yOVQxNDo0NjoyMy4xMjM0NTY3ODlaIiwgbnVsbCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAwMC0wMi0yOVQxNDo0NjoyMy4xMjM0NTY3ODlaIiwgbnVsbCldCi0gICAgICAgIFtUZXN0Q2FzZSgiMDAwMS0wMS0wMVQwMDowMDowMFoiLCBudWxsKV0KLSAgICAgICAgW1Rlc3RDYXNlKCI5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVoiLCBudWxsKV0KLSAgICAgICAgcHVibGljIHZvaWQgVGltZXN0YW1wX1ZhbGlkKHN0cmluZyBqc29uVmFsdWUsIHN0cmluZyBleHBlY3RlZEZvcm1hdHRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0ZWRGb3JtYXR0ZWQgPSBleHBlY3RlZEZvcm1hdHRlZCA/PyBqc29uVmFsdWU7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9IFdyYXBJblF1b3Rlcyhqc29uVmFsdWUpOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IFRpbWVzdGFtcC5QYXJzZXIuUGFyc2VKc29uKGpzb24pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFdyYXBJblF1b3RlcyhleHBlY3RlZEZvcm1hdHRlZCksIHBhcnNlZC5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIjIwMTUtMTAtMDkgMTQ6NDY6MjMuMTIzNDU2Nzg5WiIsIERlc2NyaXB0aW9uID0gIk5vIFQgYmV0d2VlbiBkYXRlIGFuZCB0aW1lIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS8xMC8wOVQxNDo0NjoyMy4xMjM0NTY3ODlaIiwgRGVzY3JpcHRpb24gPSAiV3JvbmcgZGF0ZSBzZXBhcmF0b3JzIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNC40Ni4yMy4xMjM0NTY3ODlaIiwgRGVzY3JpcHRpb24gPSAiV3JvbmcgdGltZSBzZXBhcmF0b3JzIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMywxMjM0NTY3ODlaIiwgRGVzY3JpcHRpb24gPSAiV3JvbmcgZnJhY3Rpb25hbCBzZWNvbmQgc2VwYXJhdG9ycyAodmFsaWQgSVNPLTg2MDEgdGhvdWdoKSIpXQotICAgICAgICBbVGVzdENhc2UoIiAyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiLCBEZXNjcmlwdGlvbiA9ICJXaGl0ZXNwYWNlIGF0IHN0YXJ0IildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTY3ODlaICIsIERlc2NyaXB0aW9uID0gIldoaXRlc3BhY2UgYXQgZW5kIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTY3ODkwIiwgRGVzY3JpcHRpb24gPSAiVG9vIG1hbnkgZGlnaXRzIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTY3ODkiLCBEZXNjcmlwdGlvbiA9ICJObyBvZmZzZXQiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEzLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiLCBEZXNjcmlwdGlvbiA9ICJJbnZhbGlkIG1vbnRoIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0zMlQxNDo0NjoyMy4xMjM0NTY3ODlaIiwgRGVzY3JpcHRpb24gPSAiSW52YWxpZCBkYXkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDI0OjAwOjAwLjAwMDAwMDAwMFoiLCBEZXNjcmlwdGlvbiA9ICJJbnZhbGlkIGhvdXIgKHZhbGlkIElTTy04NjAxIHRob3VnaCkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjYwOjIzLjEyMzQ1Njc4OVoiLCBEZXNjcmlwdGlvbiA9ICJJbnZhbGlkIG1pbnV0ZXMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjYwLjEyMzQ1Njc4OVoiLCBEZXNjcmlwdGlvbiA9ICJJbnZhbGlkIHNlY29uZHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMDE1LTEwLTA5VDE0OjQ2OjIzLjEyMzQ1Njc4OSsxODowMSIsIERlc2NyaXB0aW9uID0gIk9mZnNldCB0b28gbGFyZ2UgKHBvc2l0aXZlKSIpXQotICAgICAgICBbVGVzdENhc2UoIjIwMTUtMTAtMDlUMTQ6NDY6MjMuMTIzNDU2Nzg5LTE4OjAxIiwgRGVzY3JpcHRpb24gPSAiT2Zmc2V0IHRvbyBsYXJnZSAobmVnYXRpdmUpIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMjAxNS0xMC0wOVQxNDo0NjoyMy4xMjM0NTY3ODktMDA6MDAiLCBEZXNjcmlwdGlvbiA9ICJMb2NhbCBvZmZzZXQgKC0wMDowMCkgbWFrZXMgbm8gc2Vuc2UgaGVyZSIpXQotICAgICAgICBbVGVzdENhc2UoIjAwMDEtMDEtMDFUMDA6MDA6MDArMDA6MDEiLCBEZXNjcmlwdGlvbiA9ICJWYWx1ZSBiZWZvcmUgZWFybGllc3Qgd2hlbiBvZmZzZXQgYXBwbGllZCIpXQotICAgICAgICBbVGVzdENhc2UoIjk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5LTAwOjAxIiwgRGVzY3JpcHRpb24gPSAiVmFsdWUgYWZ0ZXIgbGF0ZXN0IHdoZW4gb2Zmc2V0IGFwcGxpZWQiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIyMTAwLTAyLTI5VDE0OjQ2OjIzLjEyMzQ1Njc4OVoiLCBEZXNjcmlwdGlvbiA9ICJGZWIgMjl0aCBvbiBhIG5vbi1sZWFwLXllYXIiKV0KLSAgICAgICAgcHVibGljIHZvaWQgVGltZXN0YW1wX0ludmFsaWQoc3RyaW5nIGpzb25WYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSBXcmFwSW5RdW90ZXMoanNvblZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBUaW1lc3RhbXAuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RydWN0VmFsdWVfTnVsbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgVmFsdWUgeyBOdWxsVmFsdWUgPSAwIH0sIFZhbHVlLlBhcnNlci5QYXJzZUpzb24oIm51bGwiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RydWN0VmFsdWVfU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBWYWx1ZSB7IFN0cmluZ1ZhbHVlID0gImhpIiB9LCBWYWx1ZS5QYXJzZXIuUGFyc2VKc29uKCJcImhpXCIiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RydWN0VmFsdWVfQm9vbCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgVmFsdWUgeyBCb29sVmFsdWUgPSB0cnVlIH0sIFZhbHVlLlBhcnNlci5QYXJzZUpzb24oInRydWUiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IFZhbHVlIHsgQm9vbFZhbHVlID0gZmFsc2UgfSwgVmFsdWUuUGFyc2VyLlBhcnNlSnNvbigiZmFsc2UiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU3RydWN0VmFsdWVfTGlzdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChWYWx1ZS5Gb3JMaXN0KFZhbHVlLkZvck51bWJlcigxKSwgVmFsdWUuRm9yU3RyaW5nKCJ4IikpLCBWYWx1ZS5QYXJzZXIuUGFyc2VKc29uKCJbMSwgXCJ4XCJdIikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFBhcnNlTGlzdFZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBMaXN0VmFsdWUgeyBWYWx1ZXMgPSB7IFZhbHVlLkZvck51bWJlcigxKSwgVmFsdWUuRm9yU3RyaW5nKCJ4IikgfSB9LCBMaXN0VmFsdWUuUGFyc2VyLlBhcnNlSnNvbigiWzEsIFwieFwiXSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJ1Y3RWYWx1ZV9TdHJ1Y3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoCi0gICAgICAgICAgICAgICAgVmFsdWUuRm9yU3RydWN0KG5ldyBTdHJ1Y3QgeyBGaWVsZHMgPSB7IHsgIngiLCBWYWx1ZS5Gb3JOdW1iZXIoMSkgfSwgeyAieSIsIFZhbHVlLkZvclN0cmluZygieiIpIH0gfSB9KSwKLSAgICAgICAgICAgICAgICBWYWx1ZS5QYXJzZXIuUGFyc2VKc29uKCJ7IFwieFwiOiAxLCBcInlcIjogXCJ6XCIgfSIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBQYXJzZVN0cnVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgU3RydWN0IHsgRmllbGRzID0geyB7ICJ4IiwgVmFsdWUuRm9yTnVtYmVyKDEpIH0sIHsgInkiLCBWYWx1ZS5Gb3JTdHJpbmcoInoiKSB9IH0gfSwKLSAgICAgICAgICAgICAgICBTdHJ1Y3QuUGFyc2VyLlBhcnNlSnNvbigieyBcInhcIjogMSwgXCJ5XCI6IFwielwiIH0iKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBUT0RPIGZvciBkdXJhdGlvbiBwYXJzaW5nOiB1cHBlciBhbmQgbG93ZXIgYm91bmRzLgotICAgICAgICAvLyArLy0gMzE1NTc2MDAwMDAwIHNlY29uZHMKLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjEyMzQ1Njc4OXMiLCBudWxsKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjEyMzQ1NnMiLCBudWxsKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjEyM3MiLCBudWxsKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjEyMzAwcyIsICIxLjEyM3MiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjEyMzQ1cyIsICIxLjEyMzQ1MHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxcyIsIG51bGwpXQotICAgICAgICBbVGVzdENhc2UoIi0xLjEyMzQ1Njc4OXMiLCBudWxsKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMS4xMjM0NTZzIiwgbnVsbCldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEuMTIzcyIsIG51bGwpXQotICAgICAgICBbVGVzdENhc2UoIi0xcyIsIG51bGwpXQotICAgICAgICBbVGVzdENhc2UoIjAuMTIzcyIsIG51bGwpXQotICAgICAgICBbVGVzdENhc2UoIi0wLjEyM3MiLCBudWxsKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxMjM0NTYuMTIzcyIsIG51bGwpXQotICAgICAgICBbVGVzdENhc2UoIi0xMjM0NTYuMTIzcyIsIG51bGwpXQotICAgICAgICAvLyBVcHBlciBhbmQgbG93ZXIgYm91bmRzCi0gICAgICAgIFtUZXN0Q2FzZSgiMzE1NTc2MDAwMDAwcyIsIG51bGwpXQotICAgICAgICBbVGVzdENhc2UoIi0zMTU1NzYwMDAwMDBzIiwgbnVsbCldCi0gICAgICAgIHB1YmxpYyB2b2lkIER1cmF0aW9uX1ZhbGlkKHN0cmluZyBqc29uVmFsdWUsIHN0cmluZyBleHBlY3RlZEZvcm1hdHRlZCkKLSAgICAgICAgewotICAgICAgICAgICAgZXhwZWN0ZWRGb3JtYXR0ZWQgPSBleHBlY3RlZEZvcm1hdHRlZCA/PyBqc29uVmFsdWU7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9IFdyYXBJblF1b3Rlcyhqc29uVmFsdWUpOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IER1cmF0aW9uLlBhcnNlci5QYXJzZUpzb24oanNvbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoV3JhcEluUXVvdGVzKGV4cGVjdGVkRm9ybWF0dGVkKSwgcGFyc2VkLlRvU3RyaW5nKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGhlIHNpbXBsZXN0IHdheSBvZiB0ZXN0aW5nIHRoYXQgdGhlIHZhbHVlIGhhcyBwYXJzZWQgY29ycmVjdGx5IGlzIHRvIHJlZm9ybWF0IGl0LAotICAgICAgICAvLyBhcyB3ZSB0cnVzdCB0aGUgZm9ybWF0dGluZy4gSW4gbWFueSBjYXNlcyB0aGF0IHdpbGwgZ2l2ZSB0aGUgc2FtZSByZXN1bHQgYXMgdGhlIGlucHV0LAotICAgICAgICAvLyBzbyBpbiB0aG9zZSBjYXNlcyB3ZSBhY2NlcHQgYW4gZXhwZWN0ZWRGb3JtYXR0ZWQgdmFsdWUgb2YgbnVsbC4gU29tZXRpbWVzIHRoZSByZXN1bHRzCi0gICAgICAgIC8vIHdpbGwgYmUgZGlmZmVyZW50IHRob3VnaCwgZHVlIHRvIGEgZGlmZmVyZW50IG51bWJlciBvZiBkaWdpdHMgYmVpbmcgcHJvdmlkZWQuCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIjEuMTIzNDU2Nzg5MHMiLCBEZXNjcmlwdGlvbiA9ICJUb28gbWFueSBkaWdpdHMiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjEyMzQ1Njc4OSIsIERlc2NyaXB0aW9uID0gIk5vIHN1ZmZpeCIpXQotICAgICAgICBbVGVzdENhc2UoIjEuMTIzNDU2Nzg5c3MiLCBEZXNjcmlwdGlvbiA9ICJUb28gbXVjaCBzdWZmaXgiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLjEyMzQ1Njc4OVMiLCBEZXNjcmlwdGlvbiA9ICJVcHBlciBjYXNlIHN1ZmZpeCIpXQotICAgICAgICBbVGVzdENhc2UoIisxLjEyMzQ1Njc4OXMiLCBEZXNjcmlwdGlvbiA9ICJMZWFkaW5nICsiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIuMTIzNDU2Nzg5cyIsIERlc2NyaXB0aW9uID0gIk5vIGludGVnZXIgYmVmb3JlIHRoZSBmcmFjdGlvbiIpXQotICAgICAgICBbVGVzdENhc2UoIjEsMTIzNDU2Nzg5cyIsIERlc2NyaXB0aW9uID0gIkNvbW1hIGFzIGRlY2ltYWwgc2VwYXJhdG9yIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMXgxLjEyMzQ1Njc4OXMiLCBEZXNjcmlwdGlvbiA9ICJOb24tZGlnaXQgaW4gaW50ZWdlciBwYXJ0IildCi0gICAgICAgIFtUZXN0Q2FzZSgiMS4xeDM0NTY3ODlzIiwgRGVzY3JpcHRpb24gPSAiTm9uLWRpZ2l0IGluIGZyYWN0aW9uYWwgcGFydCIpXQotICAgICAgICBbVGVzdENhc2UoIiAxLjEyMzQ1Njc4OXMiLCBEZXNjcmlwdGlvbiA9ICJXaGl0ZXNwYWNlIGJlZm9yZSBmcmFjdGlvbiIpXQotICAgICAgICBbVGVzdENhc2UoIjEuMTIzNDU2Nzg5cyAiLCBEZXNjcmlwdGlvbiA9ICJXaGl0ZXNwYWNlIGFmdGVyIHZhbHVlIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMDEuMTIzNDU2Nzg5cyIsIERlc2NyaXB0aW9uID0gIkxlYWRpbmcgemVybyAocG9zaXRpdmUpIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLTAxLjEyMzQ1Njc4OXMiLCBEZXNjcmlwdGlvbiA9ICJMZWFkaW5nIHplcm8gKG5lZ2F0aXZlKSIpXQotICAgICAgICBbVGVzdENhc2UoIi0tMC4xMjM0NTY3ODlzIiwgRGVzY3JpcHRpb24gPSAiRG91YmxlIG1pbnVzIHNpZ24iKV0KLSAgICAgICAgLy8gVmlvbGF0ZSB1cHBlci9sb3dlciBib3VuZHMgaW4gdmFyaW91cyB3YXlzCi0gICAgICAgIFtUZXN0Q2FzZSgiMzE1NTc2MDAwMDAxcyIsIERlc2NyaXB0aW9uID0gIkludGVnZXIgcGFydCB0b28gbGFyZ2UiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIzMTU1NzYwMDAwMDAwcyIsIERlc2NyaXB0aW9uID0gIkludGVnZXIgcGFydCB0b28gbG9uZyAocG9zaXRpdmUpIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLTMxNTU3NjAwMDAwMDBzIiwgRGVzY3JpcHRpb24gPSAiSW50ZWdlciBwYXJ0IHRvbyBsb25nIChuZWdhdGl2ZSkiKV0KLSAgICAgICAgcHVibGljIHZvaWQgRHVyYXRpb25fSW52YWxpZChzdHJpbmcganNvblZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9IFdyYXBJblF1b3Rlcyhqc29uVmFsdWUpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IER1cmF0aW9uLlBhcnNlci5QYXJzZUpzb24oanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gTm90IGFzIG1hbnkgdGVzdHMgZm9yIGZpZWxkIG1hc2tzIGFzIEknZCBsaWtlOyBtb3JlIHRvIGJlIGFkZGVkIHdoZW4gd2UgaGF2ZSBtb3JlCi0gICAgICAgIC8vIGRldGFpbGVkIHNwZWNpZmljYXRpb25zLgotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIiIpXQotICAgICAgICBbVGVzdENhc2UoImZvbyIsICJmb28iKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJmb28sYmFyIiwgImZvbyIsICJiYXIiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJmb28uYmFyIiwgImZvby5iYXIiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJmb29CYXIiLCAiZm9vX2JhciIpXQotICAgICAgICBbVGVzdENhc2UoImZvb0Jhci5iYXpRdXgiLCAiZm9vX2Jhci5iYXpfcXV4IildCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkTWFza19WYWxpZChzdHJpbmcganNvblZhbHVlLCBwYXJhbXMgc3RyaW5nW10gZXhwZWN0ZWRQYXRocykKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSBXcmFwSW5RdW90ZXMoanNvblZhbHVlKTsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBGaWVsZE1hc2suUGFyc2VyLlBhcnNlSnNvbihqc29uKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRQYXRocywgcGFyc2VkLlBhdGhzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoImZvb19iYXIiKV0KLSAgICAgICAgcHVibGljIHZvaWQgRmllbGRNYXNrX0ludmFsaWQoc3RyaW5nIGpzb25WYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSBXcmFwSW5RdW90ZXMoanNvblZhbHVlKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBGaWVsZE1hc2suUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQW55X1JlZ3VsYXJNZXNzYWdlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0gVHlwZVJlZ2lzdHJ5LkZyb21NZXNzYWdlcyhUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB2YXIgZm9ybWF0dGVyID0gbmV3IEpzb25Gb3JtYXR0ZXIobmV3IEpzb25Gb3JtYXR0ZXIuU2V0dGluZ3MoZmFsc2UsIFR5cGVSZWdpc3RyeS5Gcm9tTWVzc2FnZXMoVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IpKSk7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVJbnQzMiA9IDEwLCBTaW5nbGVOZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHsgQmIgPSAyMCB9IH07Ci0gICAgICAgICAgICB2YXIgb3JpZ2luYWwgPSBBbnkuUGFjayhtZXNzYWdlKTsKLSAgICAgICAgICAgIHZhciBqc29uID0gZm9ybWF0dGVyLkZvcm1hdChvcmlnaW5hbCk7IC8vIFRoaXMgaXMgdGVzdGVkIGluIEpzb25Gb3JtYXR0ZXJUZXN0Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEpzb25QYXJzZXIobmV3IEpzb25QYXJzZXIuU2V0dGluZ3MoMTAsIHJlZ2lzdHJ5KSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwob3JpZ2luYWwsIHBhcnNlci5QYXJzZTxBbnk+KGpzb24pKTsKLSAgICAgICAgICAgIHN0cmluZyB2YWx1ZUZpcnN0SnNvbiA9ICJ7IFwic2luZ2xlSW50MzJcIjogMTAsIFwic2luZ2xlTmVzdGVkTWVzc2FnZVwiOiB7IFwiYmJcIjogMjAgfSwgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIgfSI7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwob3JpZ2luYWwsIHBhcnNlci5QYXJzZTxBbnk+KHZhbHVlRmlyc3RKc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQW55X0N1c3RvbVByZWZpeCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IFR5cGVSZWdpc3RyeS5Gcm9tTWVzc2FnZXMoVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IpOwotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzIHsgU2luZ2xlSW50MzIgPSAxMCB9OwotICAgICAgICAgICAgdmFyIG9yaWdpbmFsID0gQW55LlBhY2sobWVzc2FnZSwgImN1c3RvbS5wcmVmaXgvbWlkZGxlLXBhcnQiKTsKLSAgICAgICAgICAgIHZhciBwYXJzZXIgPSBuZXcgSnNvblBhcnNlcihuZXcgSnNvblBhcnNlci5TZXR0aW5ncygxMCwgcmVnaXN0cnkpKTsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJAdHlwZVwiOiBcImN1c3RvbS5wcmVmaXgvbWlkZGxlLXBhcnQvcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIsIFwic2luZ2xlSW50MzJcIjogMTAgfSI7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwob3JpZ2luYWwsIHBhcnNlci5QYXJzZTxBbnk+KGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBbnlfVW5rbm93blR5cGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwiQHR5cGVcIjogXCJ0eXBlLmdvb2dsZWFwaXMuY29tL2JvZ3VzXCIgfSI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24+KCgpID0+IEFueS5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBbnlfTm9UeXBlVXJsKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAieyBcImZvb1wiOiBcImJhclwiIH0iOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IEFueS5QYXJzZXIuUGFyc2VKc29uKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBbnlfV2VsbEtub3duVHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IFR5cGVSZWdpc3RyeS5Gcm9tTWVzc2FnZXMoVGltZXN0YW1wLkRlc2NyaXB0b3IpOwotICAgICAgICAgICAgdmFyIGZvcm1hdHRlciA9IG5ldyBKc29uRm9ybWF0dGVyKG5ldyBKc29uRm9ybWF0dGVyLlNldHRpbmdzKGZhbHNlLCByZWdpc3RyeSkpOwotICAgICAgICAgICAgdmFyIHRpbWVzdGFtcCA9IG5ldyBEYXRlVGltZSgxNjczLCA2LCAxOSwgMTIsIDM0LCA1NiwgRGF0ZVRpbWVLaW5kLlV0YykuVG9UaW1lc3RhbXAoKTsKLSAgICAgICAgICAgIHZhciBvcmlnaW5hbCA9IEFueS5QYWNrKHRpbWVzdGFtcCk7Ci0gICAgICAgICAgICB2YXIganNvbiA9IGZvcm1hdHRlci5Gb3JtYXQob3JpZ2luYWwpOyAvLyBUaGlzIGlzIHRlc3RlZCBpbiBKc29uRm9ybWF0dGVyVGVzdAotICAgICAgICAgICAgdmFyIHBhcnNlciA9IG5ldyBKc29uUGFyc2VyKG5ldyBKc29uUGFyc2VyLlNldHRpbmdzKDEwLCByZWdpc3RyeSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG9yaWdpbmFsLCBwYXJzZXIuUGFyc2U8QW55Pihqc29uKSk7Ci0gICAgICAgICAgICBzdHJpbmcgdmFsdWVGaXJzdEpzb24gPSAieyBcInZhbHVlXCI6IFwiMTY3My0wNi0xOVQxMjozNDo1NlpcIiwgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFwiIH0iOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG9yaWdpbmFsLCBwYXJzZXIuUGFyc2U8QW55Pih2YWx1ZUZpcnN0SnNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEFueV9OZXN0ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgcmVnaXN0cnkgPSBUeXBlUmVnaXN0cnkuRnJvbU1lc3NhZ2VzKFRlc3RXZWxsS25vd25UeXBlcy5EZXNjcmlwdG9yLCBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICB2YXIgZm9ybWF0dGVyID0gbmV3IEpzb25Gb3JtYXR0ZXIobmV3IEpzb25Gb3JtYXR0ZXIuU2V0dGluZ3MoZmFsc2UsIHJlZ2lzdHJ5KSk7Ci0gICAgICAgICAgICB2YXIgcGFyc2VyID0gbmV3IEpzb25QYXJzZXIobmV3IEpzb25QYXJzZXIuU2V0dGluZ3MoMTAsIHJlZ2lzdHJ5KSk7Ci0gICAgICAgICAgICB2YXIgZG91YmxlTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVJbnQzMiA9IDIwIH07Ci0gICAgICAgICAgICB2YXIgbmVzdGVkTWVzc2FnZSA9IEFueS5QYWNrKGRvdWJsZU5lc3RlZE1lc3NhZ2UpOwotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgQW55RmllbGQgPSBBbnkuUGFjayhuZXN0ZWRNZXNzYWdlKSB9OwotICAgICAgICAgICAgdmFyIGpzb24gPSBmb3JtYXR0ZXIuRm9ybWF0KG1lc3NhZ2UpOwotICAgICAgICAgICAgLy8gVXNlIHRoZSBkZXNjcmlwdG9yLWJhc2VkIHBhcnNlciBqdXN0IGZvciBhIGNoYW5nZS4KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBwYXJzZXIuUGFyc2UoanNvbiwgVGVzdFdlbGxLbm93blR5cGVzLkRlc2NyaXB0b3IpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBEYXRhQWZ0ZXJPYmplY3QoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7fSAxMCI7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRKc29uRXhjZXB0aW9uPigoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBKU09OIGVxdWl2YWxlbnQgdG8gPHNlZSBjcmVmPSJDb2RlZElucHV0U3RyZWFtVGVzdC5NYWxpY2lvdXNSZWN1cnNpb24iLz4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hbGljaW91c1JlY3Vyc2lvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBkYXRhNjQgPSBDb2RlZElucHV0U3RyZWFtVGVzdC5NYWtlUmVjdXJzaXZlTWVzc2FnZSg2NCkuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIHN0cmluZyBkYXRhNjUgPSBDb2RlZElucHV0U3RyZWFtVGVzdC5NYWtlUmVjdXJzaXZlTWVzc2FnZSg2NSkuVG9TdHJpbmcoKTsKLQotICAgICAgICAgICAgdmFyIHBhcnNlcjY0ID0gbmV3IEpzb25QYXJzZXIobmV3IEpzb25QYXJzZXIuU2V0dGluZ3MoNjQpKTsKLSAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW1UZXN0LkFzc2VydE1lc3NhZ2VEZXB0aChwYXJzZXI2NC5QYXJzZTxUZXN0UmVjdXJzaXZlTWVzc2FnZT4oZGF0YTY0KSwgNjQpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24+KCgpID0+IHBhcnNlcjY0LlBhcnNlPFRlc3RSZWN1cnNpdmVNZXNzYWdlPihkYXRhNjUpKTsKLQotICAgICAgICAgICAgdmFyIHBhcnNlcjYzID0gbmV3IEpzb25QYXJzZXIobmV3IEpzb25QYXJzZXIuU2V0dGluZ3MoNjMpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBwYXJzZXI2My5QYXJzZTxUZXN0UmVjdXJzaXZlTWVzc2FnZT4oZGF0YTY0KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJBUUkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJfLT09IildCi0gICAgICAgIHB1YmxpYyB2b2lkIEJ5dGVzX0ludmFsaWRCYXNlNjQoc3RyaW5nIGJhZEJhc2U2NCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAieyBcInNpbmdsZUJ5dGVzXCI6IFwiIiArIGJhZEJhc2U2NCArICJcIiB9IjsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJcIkZPUkVJR05fQkFSXCIiLCBGb3JlaWduRW51bS5Gb3JlaWduQmFyKV0KLSAgICAgICAgW1Rlc3RDYXNlKCI1IiwgRm9yZWlnbkVudW0uRm9yZWlnbkJhcildCi0gICAgICAgIFtUZXN0Q2FzZSgiMTAwIiwgKEZvcmVpZ25FbnVtKTEwMCldCi0gICAgICAgIHB1YmxpYyB2b2lkIEVudW1WYWxpZChzdHJpbmcgdmFsdWUsIEZvcmVpZ25FbnVtIGV4cGVjdGVkVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJzaW5nbGVGb3JlaWduRW51bVwiOiAiICsgdmFsdWUgKyAiIH0iOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IFRlc3RBbGxUeXBlcy5QYXJzZXIuUGFyc2VKc29uKGpzb24pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBUZXN0QWxsVHlwZXMgeyBTaW5nbGVGb3JlaWduRW51bSA9IGV4cGVjdGVkVmFsdWUgfSwgcGFyc2VkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIlwiTk9UX0FfVkFMSURfVkFMVUVcIiIpXQotICAgICAgICBbVGVzdENhc2UoIjUuNSIpXQotICAgICAgICBwdWJsaWMgdm9pZCBFbnVtX0ludmFsaWQoc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwic2luZ2xlRm9yZWlnbkVudW1cIjogIiArIHZhbHVlICsgIiB9IjsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgT25lb2ZEdXBsaWNhdGVfSW52YWxpZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBqc29uID0gInsgXCJvbmVvZlN0cmluZ1wiOiBcInhcIiwgXCJvbmVvZlVpbnQzMlwiOiAxMCB9IjsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPigoKSA9PiBUZXN0QWxsVHlwZXMuUGFyc2VyLlBhcnNlSnNvbihqc29uKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBWYXJpb3VzIHRlc3RzIHVzZSBzdHJpbmdzIHdoaWNoIGhhdmUgcXVvdGVzIHJvdW5kIHRoZW0gZm9yIHBhcnNpbmcgb3IgYXMgdGhlIHJlc3VsdAotICAgICAgICAvLy8gb2YgZm9ybWF0dGluZywgYnV0IHdpdGhvdXQgdGhvc2UgcXVvdGVzIGJlaW5nIHNwZWNpZmllZCBpbiB0aGUgdGVzdHMgKGZvciB0aGUgc2FrZSBvZiByZWFkYWJpbGl0eSkuCi0gICAgICAgIC8vLyBUaGlzIG1ldGhvZCBzaW1wbHkgcmV0dXJucyB0aGUgaW5wdXQsIHdyYXBwZWQgaW4gZG91YmxlIHF1b3Rlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBXcmFwSW5RdW90ZXMoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAnIicgKyB0ZXh0ICsgJyInOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvSnNvblRva2VuaXplclRlc3QuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L0pzb25Ub2tlbml6ZXJUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjdhYjMzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvSnNvblRva2VuaXplclRlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MDggKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIHB1YmxpYyBjbGFzcyBKc29uVG9rZW5pemVyVGVzdAotICAgIHsKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEVtcHR5T2JqZWN0VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRUb2tlbnMoInt9IiwgSnNvblRva2VuLlN0YXJ0T2JqZWN0LCBKc29uVG9rZW4uRW5kT2JqZWN0KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBFbXB0eUFycmF5VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRUb2tlbnMoIltdIiwgSnNvblRva2VuLlN0YXJ0QXJyYXksIEpzb25Ub2tlbi5FbmRBcnJheSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJmb28iLCAiZm9vIildCi0gICAgICAgIFtUZXN0Q2FzZSgidGFiXFx0IiwgInRhYlx0IildCi0gICAgICAgIFtUZXN0Q2FzZSgibGluZVxcbmZlZWQiLCAibGluZVxuZmVlZCIpXQotICAgICAgICBbVGVzdENhc2UoImNhcnJpYWdlXFxycmV0dXJuIiwgImNhcnJpYWdlXHJyZXR1cm4iKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJiYWNrXFxic3BhY2UiLCAiYmFja1xic3BhY2UiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJmb3JtXFxmZmVlZCIsICJmb3JtXGZmZWVkIildCi0gICAgICAgIFtUZXN0Q2FzZSgiZXNjYXBlZFxcL3NsYXNoIiwgImVzY2FwZWQvc2xhc2giKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJlc2NhcGVkXFxcXGJhY2tzbGFzaCIsICJlc2NhcGVkXFxiYWNrc2xhc2giKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJlc2NhcGVkXFxcInF1b3RlIiwgImVzY2FwZWRcInF1b3RlIildCi0gICAgICAgIFtUZXN0Q2FzZSgiZm9vIHt9W10gYmFyIiwgImZvbyB7fVtdIGJhciIpXQotICAgICAgICBbVGVzdENhc2UoImZvb1xcdTA5YUZiYXIiLCAiZm9vXHUwOWFmYmFyIildIC8vIERpZ2l0cywgdXBwZXIgaGV4LCBsb3dlciBoZXgKLSAgICAgICAgW1Rlc3RDYXNlKCJhYlx1ZDgwMFx1ZGMwMGNkIiwgImFiXHVkODAwXHVkYzAwY2QiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJhYlxcdWQ4MDBcXHVkYzAwY2QiLCAiYWJcdWQ4MDBcdWRjMDBjZCIpXQotICAgICAgICBwdWJsaWMgdm9pZCBTdHJpbmdWYWx1ZShzdHJpbmcganNvbiwgc3RyaW5nIGV4cGVjdGVkVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFRva2Vuc05vUmVwbGFjZW1lbnQoIlwiIiArIGpzb24gKyAiXCIiLCBKc29uVG9rZW4uVmFsdWUoZXhwZWN0ZWRWYWx1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVmFsaWQgc3Vycm9nYXRlIHBhaXJzLCB3aXRoIG1peGVkIGVzY2FwaW5nLiBUaGVzZSB0ZXN0IGNhc2VzIGNhbid0IGJlIGV4cHJlc3NlZAotICAgICAgICAvLyB1c2luZyBUZXN0Q2FzZSBhcyB0aGV5IGhhdmUgbm8gdmFsaWQgVVRGLTggcmVwcmVzZW50YXRpb24uCi0gICAgICAgIC8vIEl0J3MgdW5jbGVhciBleGFjdGx5IGhvdyB3ZSBzaG91bGQgaGFuZGxlIGEgbWl4dHVyZSBvZiBlc2NhcGVkIG9yIG5vdDogdGhhdCBjYW4ndAotICAgICAgICAvLyBjb21lIGZyb20gVVRGLTggdGV4dCwgYnV0IGNvdWxkIGNvbWUgZnJvbSBhIC5ORVQgc3RyaW5nLiBGb3IgdGhlIG1vbWVudCwKLSAgICAgICAgLy8gdHJlYXQgaXQgYXMgdmFsaWQgaW4gdGhlIG9idmlvdXMgd2F5LgotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTWl4ZWRTdXJyb2dhdGVQYWlycygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHN0cmluZyBleHBlY3RlZCA9ICJcdWQ4MDBcdWRjMDAiOwotICAgICAgICAgICAgQXNzZXJ0VG9rZW5zKCInXFx1ZDgwMFx1ZGMwMCciLCBKc29uVG9rZW4uVmFsdWUoZXhwZWN0ZWQpKTsKLSAgICAgICAgICAgIEFzc2VydFRva2VucygiJ1x1ZDgwMFxcdWRjMDAnIiwgSnNvblRva2VuLlZhbHVlKGV4cGVjdGVkKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgT2JqZWN0RGVwdGgoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzdHJpbmcganNvbiA9ICJ7IFwiZm9vXCI6IHsgXCJ4XCI6IDEsIFwieVwiOiBbIDAgXSB9IH0iOwotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IEpzb25Ub2tlbml6ZXIuRnJvbVRleHRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7Ci0gICAgICAgICAgICAvLyBJZiB3ZSBoYWQgbW9yZSB0ZXN0cyBsaWtlIHRoaXMsIEknZCBpbnRyb2R1Y2UgYSBoZWxwZXIgbWV0aG9kLi4uIGJ1dCBmb3Igb25lIHRlc3QsIGl0J3Mgbm90IHdvcnRoIGl0LgotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHRva2VuaXplci5PYmplY3REZXB0aCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSnNvblRva2VuLlN0YXJ0T2JqZWN0LCB0b2tlbml6ZXIuTmV4dCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCB0b2tlbml6ZXIuT2JqZWN0RGVwdGgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEpzb25Ub2tlbi5OYW1lKCJmb28iKSwgdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChKc29uVG9rZW4uU3RhcnRPYmplY3QsIHRva2VuaXplci5OZXh0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRva2VuaXplci5PYmplY3REZXB0aCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSnNvblRva2VuLk5hbWUoIngiKSwgdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChKc29uVG9rZW4uVmFsdWUoMSksIHRva2VuaXplci5OZXh0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRva2VuaXplci5PYmplY3REZXB0aCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSnNvblRva2VuLk5hbWUoInkiKSwgdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChKc29uVG9rZW4uU3RhcnRBcnJheSwgdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsgLy8gRGVwdGggaGFzbid0IGNoYW5nZWQgaW4gYXJyYXkKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChKc29uVG9rZW4uVmFsdWUoMCksIHRva2VuaXplci5OZXh0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIHRva2VuaXplci5PYmplY3REZXB0aCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSnNvblRva2VuLkVuZEFycmF5LCB0b2tlbml6ZXIuTmV4dCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgyLCB0b2tlbml6ZXIuT2JqZWN0RGVwdGgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEpzb25Ub2tlbi5FbmRPYmplY3QsIHRva2VuaXplci5OZXh0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHRva2VuaXplci5PYmplY3REZXB0aCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSnNvblRva2VuLkVuZE9iamVjdCwgdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChKc29uVG9rZW4uRW5kRG9jdW1lbnQsIHRva2VuaXplci5OZXh0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHRva2VuaXplci5PYmplY3REZXB0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgT2JqZWN0RGVwdGhfV2l0aFB1c2hCYWNrKCkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIGpzb24gPSAie30iOwotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IEpzb25Ub2tlbml6ZXIuRnJvbVRleHRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcihqc29uKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIC8vIFdoZW4gd2UgcHVzaCBiYWNrIGEgInN0YXJ0IG9iamVjdCIsIHdlIHNob3VsZCBlZmZlY3RpdmVseSBiZSBiYWNrIHRvIHRoZSBwcmV2aW91cyBkZXB0aC4KLSAgICAgICAgICAgIHRva2VuaXplci5QdXNoQmFjayh0b2tlbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIC8vIFJlYWQgdGhlIHNhbWUgdG9rZW4gYWdhaW4sIGFuZCBnZXQgYmFjayB0byBkZXB0aCAxCi0gICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLQotICAgICAgICAgICAgLy8gTm93IHRoZSBzYW1lIGluIHJldmVyc2UsIHdpdGggRW5kT2JqZWN0Ci0gICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIHRva2VuaXplci5QdXNoQmFjayh0b2tlbik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMSwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgICAgIHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgdG9rZW5pemVyLk9iamVjdERlcHRoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoImVtYmVkZGVkIHRhYlx0IildCi0gICAgICAgIFtUZXN0Q2FzZSgiZW1iZWRkZWQgQ1JcciIpXQotICAgICAgICBbVGVzdENhc2UoImVtYmVkZGVkIExGXG4iKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJlbWJlZGRlZCBiZWxsXHUwMDA3IildCi0gICAgICAgIFtUZXN0Q2FzZSgiYmFkIGVzY2FwZVxcYSIpXQotICAgICAgICBbVGVzdENhc2UoImluY29tcGxldGUgZXNjYXBlXFwiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJpbmNvbXBsZXRlIFVuaWNvZGUgZXNjYXBlXFx1MDAwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiaW52YWxpZCBVbmljb2RlIGVzY2FwZVxcdTAwMEgiKV0KLSAgICAgICAgLy8gU3Vycm9nYXRlIHBhaXIgaGFuZGxpbmcsIGJvdGggaW4gcmF3IC5ORVQgc3RyaW5ncyBhbmQgZXNjYXBlZC4gV2Ugb25seSBuZWVkCi0gICAgICAgIC8vIHRvIGRldGVjdCB0aGlzIGluIHN0cmluZ3MsIGFzIG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFueXdoZXJlIG90aGVyIHRoYW4gaW4gc3RyaW5ncwotICAgICAgICAvLyB3aWxsIGFscmVhZHkgbGVhZCB0byBwYXJzaW5nIGVycm9ycy4KLSAgICAgICAgW1Rlc3RDYXNlKCJcXHVkODAwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiXFx1ZGMwMCIpXQotICAgICAgICBbVGVzdENhc2UoIlxcdWQ4MDB4IildCi0gICAgICAgIFtUZXN0Q2FzZSgiXFx1ZGMwMHgiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJcXHVkYzAwXFx1ZDgwMHkiKV0KLSAgICAgICAgcHVibGljIHZvaWQgSW52YWxpZFN0cmluZ1ZhbHVlKHN0cmluZyBqc29uKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRUaHJvd3NBZnRlcigiXCIiICsganNvbiArICJcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGVzdHMgZm9yIGludmFsaWQgc3RyaW5ncyB0aGF0IGNhbid0IGJlIGV4cHJlc3NlZCBpbiBhdHRyaWJ1dGVzLAotICAgICAgICAvLyBhcyB0aGUgY29uc3RhbnRzIGNhbid0IGJlIGV4cHJlc3NlZCBhcyBVVEYtOCBzdHJpbmdzLgotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgSW52YWxpZFN1cnJvZ2F0ZVBhaXJzKCkKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0VGhyb3dzQWZ0ZXIoIlwiXHVkODAweFwiIik7Ci0gICAgICAgICAgICBBc3NlcnRUaHJvd3NBZnRlcigiXCJcdWRjMDB5XCIiKTsKLSAgICAgICAgICAgIEFzc2VydFRocm93c0FmdGVyKCJcIlx1ZGMwMFx1ZDgwMHlcIiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgiMCIsIDApXQotICAgICAgICBbVGVzdENhc2UoIi0wIiwgMCldIC8vIFdlIGRvbid0IGRpc3Rpbmd1aXNoIGJldHdlZW4gcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIDAKLSAgICAgICAgW1Rlc3RDYXNlKCIxIiwgMSldCi0gICAgICAgIFtUZXN0Q2FzZSgiLTEiLCAtMSldCi0gICAgICAgIC8vIEZyb20gaGVyZSBvbiwgYXNzdW1lIGxlYWRpbmcgc2lnbiBpcyBva2F5Li4uCi0gICAgICAgIFtUZXN0Q2FzZSgiMS4xMjUiLCAxLjEyNSldCi0gICAgICAgIFtUZXN0Q2FzZSgiMS4wIiwgMSldCi0gICAgICAgIFtUZXN0Q2FzZSgiMWU1IiwgMTAwMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxZTAwMDAwMCIsIDEpXSAvLyBXZWlyZCwgYnV0IG5vdCBwcm9oaWJpdGVkIGJ5IHRoZSBzcGVjCi0gICAgICAgIFtUZXN0Q2FzZSgiMUU1IiwgMTAwMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxZSs1IiwgMTAwMDAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxRS01IiwgMC4wMDAwMSldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTIzRS0yIiwgMS4yMyldCi0gICAgICAgIFtUZXN0Q2FzZSgiMTIzLjQ1RTMiLCAxMjM0NTApXQotICAgICAgICBbVGVzdENhc2UoIiAgIDEgICAiLCAxKV0KLSAgICAgICAgcHVibGljIHZvaWQgTnVtYmVyVmFsdWUoc3RyaW5nIGpzb24sIGRvdWJsZSBleHBlY3RlZFZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRUb2tlbnMoanNvbiwgSnNvblRva2VuLlZhbHVlKGV4cGVjdGVkVmFsdWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIjAwIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLjUiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIxLiIpXQotICAgICAgICBbVGVzdENhc2UoIjFlIildCi0gICAgICAgIFtUZXN0Q2FzZSgiMWUtIildCi0gICAgICAgIFtUZXN0Q2FzZSgiLS0iKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItLTEiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCItMS43OTc3ZTMwOCIpXQotICAgICAgICBbVGVzdENhc2UoIjEuNzk3N2UzMDgiKV0KLSAgICAgICAgcHVibGljIHZvaWQgSW52YWxpZE51bWJlclZhbHVlKHN0cmluZyBqc29uKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRUaHJvd3NBZnRlcihqc29uKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIm51bCIpXQotICAgICAgICBbVGVzdENhc2UoIm5vdGhpbmciKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJ0cnV0aCIpXQotICAgICAgICBbVGVzdENhc2UoImZBTFNFaG9vZCIpXQotICAgICAgICBwdWJsaWMgdm9pZCBJbnZhbGlkTGl0ZXJhbHMoc3RyaW5nIGpzb24pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFRocm93c0FmdGVyKGpzb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE51bGxWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFRva2VucygibnVsbCIsIEpzb25Ub2tlbi5OdWxsKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUcnVlVmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnRUb2tlbnMoInRydWUiLCBKc29uVG9rZW4uVHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRmFsc2VWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFRva2VucygiZmFsc2UiLCBKc29uVG9rZW4uRmFsc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNpbXBsZU9iamVjdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFRva2Vucygieyd4JzogJ3knfSIsCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLlN0YXJ0T2JqZWN0LCBKc29uVG9rZW4uTmFtZSgieCIpLCBKc29uVG9rZW4uVmFsdWUoInkiKSwgSnNvblRva2VuLkVuZE9iamVjdCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIlsxMCwgMjAiLCAzKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJbMTAsIiwgMildCi0gICAgICAgIFtUZXN0Q2FzZSgiWzEwOjIwXSIsIDIpXQotICAgICAgICBbVGVzdENhc2UoIlsiLCAxKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJbLCIsIDEpXQotICAgICAgICBbVGVzdENhc2UoInsiLCAxKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJ7LCIsIDEpXQotICAgICAgICBbVGVzdENhc2UoIntbIiwgMSldCi0gICAgICAgIFtUZXN0Q2FzZSgie3siLCAxKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJ7MCIsIDEpXQotICAgICAgICBbVGVzdENhc2UoIntudWxsIiwgMSldCi0gICAgICAgIFtUZXN0Q2FzZSgie2ZhbHNlIiwgMSldCi0gICAgICAgIFtUZXN0Q2FzZSgie3RydWUiLCAxKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJ9IiwgMCldCi0gICAgICAgIFtUZXN0Q2FzZSgiXSIsIDApXQotICAgICAgICBbVGVzdENhc2UoIiwiLCAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCInZm9vJyAnYmFyJyIsIDEpXQotICAgICAgICBbVGVzdENhc2UoIjoiLCAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKCInZm9vIiwgMCldIC8vIEluY29tcGxldGUgc3RyaW5nCi0gICAgICAgIFtUZXN0Q2FzZSgieyAnZm9vJyB9IiwgMildCi0gICAgICAgIFtUZXN0Q2FzZSgieyB4OjEiLCAxKV0gLy8gUHJvcGVydHkgbmFtZXMgbXVzdCBiZSBxdW90ZWQKLSAgICAgICAgW1Rlc3RDYXNlKCJ7XSIsIDEpXQotICAgICAgICBbVGVzdENhc2UoIlt9IiwgMSldCi0gICAgICAgIFtUZXN0Q2FzZSgiWzEsIiwgMildCi0gICAgICAgIFtUZXN0Q2FzZSgieyd4JzowXSIsIDMpXQotICAgICAgICBbVGVzdENhc2UoInsgJ2Zvbyc6IH0iLCAyKV0KLSAgICAgICAgW1Rlc3RDYXNlKCJ7ICdmb28nOidiYXInLCB9IiwgMyldCi0gICAgICAgIHB1YmxpYyB2b2lkIEludmFsaWRTdHJ1Y3R1cmUoc3RyaW5nIGpzb24sIGludCBleHBlY3RlZFZhbGlkVG9rZW5zKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB3ZSBkb24ndCB0ZXN0IHRoYXQgdGhlIGVhcmxpZXIgdG9rZW5zIGFyZSBleGFjdGx5IGFzIGV4cGVjdGVkLAotICAgICAgICAgICAgLy8gcGFydGx5IGJlY2F1c2UgdGhhdCdzIGhhcmQgdG8gcGFyYW1ldGVyaXplLgotICAgICAgICAgICAgdmFyIHJlYWRlciA9IG5ldyBTdHJpbmdSZWFkZXIoanNvbi5SZXBsYWNlKCdcJycsICciJykpOwotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IEpzb25Ub2tlbml6ZXIuRnJvbVRleHRSZWFkZXIocmVhZGVyKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRWYWxpZFRva2VuczsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5Jc05vdE51bGwodG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRKc29uRXhjZXB0aW9uPigoKSA9PiB0b2tlbml6ZXIuTmV4dCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBcnJheU1peGVkVHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFRva2VucygiWzEsICdmb28nLCBudWxsLCBmYWxzZSwgdHJ1ZSwgWzJdLCB7J3gnOid5JyB9XSIsCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLlN0YXJ0QXJyYXksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLlZhbHVlKDEpLAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5WYWx1ZSgiZm9vIiksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk51bGwsCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLkZhbHNlLAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5UcnVlLAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5TdGFydEFycmF5LAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5WYWx1ZSgyKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uRW5kQXJyYXksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLlN0YXJ0T2JqZWN0LAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5OYW1lKCJ4IiksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLlZhbHVlKCJ5IiksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLkVuZE9iamVjdCwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uRW5kQXJyYXkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE9iamVjdE1peGVkVHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydFRva2VucyhAInsnYSc6IDEsICdiJzogJ2JhcicsICdjJzogbnVsbCwgJ2QnOiBmYWxzZSwgJ2UnOiB0cnVlLCAKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICdmJzogWzJdLCAnZyc6IHsneCc6J3knIH19IiwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uU3RhcnRPYmplY3QsCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk5hbWUoImEiKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uVmFsdWUoMSksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk5hbWUoImIiKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uVmFsdWUoImJhciIpLAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5OYW1lKCJjIiksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk51bGwsCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk5hbWUoImQiKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uRmFsc2UsCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk5hbWUoImUiKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uVHJ1ZSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uTmFtZSgiZiIpLAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5TdGFydEFycmF5LAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5WYWx1ZSgyKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uRW5kQXJyYXksCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk5hbWUoImciKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uU3RhcnRPYmplY3QsCi0gICAgICAgICAgICAgICAgSnNvblRva2VuLk5hbWUoIngiKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uVmFsdWUoInkiKSwKLSAgICAgICAgICAgICAgICBKc29uVG9rZW4uRW5kT2JqZWN0LAotICAgICAgICAgICAgICAgIEpzb25Ub2tlbi5FbmRPYmplY3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5leHRBZnRlckVuZERvY3VtZW50VGhyb3dzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IEpzb25Ub2tlbml6ZXIuRnJvbVRleHRSZWFkZXIobmV3IFN0cmluZ1JlYWRlcigibnVsbCIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChKc29uVG9rZW4uTnVsbCwgdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSnNvblRva2VuLkVuZERvY3VtZW50LCB0b2tlbml6ZXIuTmV4dCgpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbj4oKCkgPT4gdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2FuUHVzaEJhY2tFbmREb2N1bWVudCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbml6ZXIgPSBKc29uVG9rZW5pemVyLkZyb21UZXh0UmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoIm51bGwiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoSnNvblRva2VuLk51bGwsIHRva2VuaXplci5OZXh0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEpzb25Ub2tlbi5FbmREb2N1bWVudCwgdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgICAgICB0b2tlbml6ZXIuUHVzaEJhY2soSnNvblRva2VuLkVuZERvY3VtZW50KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChKc29uVG9rZW4uRW5kRG9jdW1lbnQsIHRva2VuaXplci5OZXh0KCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uPigoKSA9PiB0b2tlbml6ZXIuTmV4dCgpKTsKLSAgICAgICAgfQotICAgICAgIAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBc3NlcnRzIHRoYXQgdGhlIHNwZWNpZmllZCBKU09OIGlzIHRva2VuaXplZCBpbnRvIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiB0b2tlbnMuCi0gICAgICAgIC8vLyBBbGwgYXBvc3Ryb3BoZXMgYXJlIGZpcnN0IGNvbnZlcnRlZCB0byBkb3VibGUgcXVvdGVzLCBhbGxvd2luZyBhbnkgdGVzdHMKLSAgICAgICAgLy8vIHRoYXQgZG9uJ3QgbmVlZCB0byBjaGVjayBhY3R1YWwgYXBvc3Ryb3BoZSBoYW5kbGluZyB0byB1c2UgYXBvc3Ryb3BoZXMgaW4gdGhlIEpTT04sIGF2b2lkaW5nCi0gICAgICAgIC8vLyBtZXNzeSBzdHJpbmcgbGl0ZXJhbCBlc2NhcGluZy4gVGhlICJlbmQgZG9jdW1lbnQiIHRva2VuIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGxpc3Qgb2YgCi0gICAgICAgIC8vLyBleHBlY3RlZCB0b2tlbnMsIGJ1dCBpcyBpbXBsaWNpdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRUb2tlbnMoc3RyaW5nIGpzb24sIHBhcmFtcyBKc29uVG9rZW5bXSBleHBlY3RlZFRva2VucykKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0VG9rZW5zTm9SZXBsYWNlbWVudChqc29uLlJlcGxhY2UoJ1wnJywgJyInKSwgZXhwZWN0ZWRUb2tlbnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQXNzZXJ0cyB0aGF0IHRoZSBzcGVjaWZpZWQgSlNPTiBpcyB0b2tlbml6ZWQgaW50byB0aGUgZ2l2ZW4gc2VxdWVuY2Ugb2YgdG9rZW5zLgotICAgICAgICAvLy8gVW5saWtlIDxzZWUgY3JlZj0iQXNzZXJ0VG9rZW5zKHN0cmluZywgSnNvblRva2VuW10pIi8+LCB0aGlzIGRvZXMgbm90IHBlcmZvcm0gYW55IGNoYXJhY3RlcgotICAgICAgICAvLy8gcmVwbGFjZW1lbnQgb24gdGhlIHNwZWNpZmllZCBKU09OLCBhbmQgc2hvdWxkIGJlIHVzZWQgd2hlbiB0aGUgdGV4dCBjb250YWlucyBhcG9zdHJvcGhlcyB3aGljaAotICAgICAgICAvLy8gYXJlIGV4cGVjdGVkIHRvIGJlIHVzZWQgKmFzKiBhcG9zdHJvcGhlcy4gVGhlICJlbmQgZG9jdW1lbnQiIHRva2VuIGlzIG5vdCBzcGVjaWZpZWQgaW4gdGhlIGxpc3Qgb2YgCi0gICAgICAgIC8vLyBleHBlY3RlZCB0b2tlbnMsIGJ1dCBpcyBpbXBsaWNpdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRUb2tlbnNOb1JlcGxhY2VtZW50KHN0cmluZyBqc29uLCBwYXJhbXMgSnNvblRva2VuW10gZXhwZWN0ZWRUb2tlbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGpzb24pOwotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IEpzb25Ub2tlbml6ZXIuRnJvbVRleHRSZWFkZXIocmVhZGVyKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlbnMuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGFjdHVhbFRva2VuID0gdG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsVG9rZW4gPT0gSnNvblRva2VuLkVuZERvY3VtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkV4cGVjdGVkIHswfSBidXQgcmVhY2hlZCBlbmQgb2YgdG9rZW4gc3RyZWFtIiwgZXhwZWN0ZWRUb2tlbnNbaV0pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRUb2tlbnNbaV0sIGFjdHVhbFRva2VuKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBmaW5hbFRva2VuID0gdG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgIGlmIChmaW5hbFRva2VuICE9IEpzb25Ub2tlbi5FbmREb2N1bWVudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuRmFpbCgiRXhwZWN0ZWQgdG9rZW4gc3RyZWFtIHRvIGJlIGV4aGF1c3RlZDsgcmVjZWl2ZWQgezB9IiwgZmluYWxUb2tlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydFRocm93c0FmdGVyKHN0cmluZyBqc29uLCBwYXJhbXMgSnNvblRva2VuW10gZXhwZWN0ZWRUb2tlbnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZWFkZXIgPSBuZXcgU3RyaW5nUmVhZGVyKGpzb24pOwotICAgICAgICAgICAgdmFyIHRva2VuaXplciA9IEpzb25Ub2tlbml6ZXIuRnJvbVRleHRSZWFkZXIocmVhZGVyKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXhwZWN0ZWRUb2tlbnMuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGFjdHVhbFRva2VuID0gdG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAoYWN0dWFsVG9rZW4gPT0gSnNvblRva2VuLkVuZERvY3VtZW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQXNzZXJ0LkZhaWwoIkV4cGVjdGVkIHswfSBidXQgcmVhY2hlZCBlbmQgb2YgZG9jdW1lbnQiLCBleHBlY3RlZFRva2Vuc1tpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZFRva2Vuc1tpXSwgYWN0dWFsVG9rZW4pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkSnNvbkV4Y2VwdGlvbj4oKCkgPT4gdG9rZW5pemVyLk5leHQoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Byb3BlcnRpZXMvQXBwTWFuaWZlc3QueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Qcm9wZXJ0aWVzL0FwcE1hbmlmZXN0LnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcxMmExMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Byb3BlcnRpZXMvQXBwTWFuaWZlc3QueG1sCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi3vu788RGVwbG95bWVudCB4bWxucz0iaHR0cDovL3NjaGVtYXMubWljcm9zb2Z0LmNvbS9jbGllbnQvMjAwNy9kZXBsb3ltZW50IgotICAgICAgICB4bWxuczp4PSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL3dpbmZ4LzIwMDYveGFtbCIKLT4KLSAgICA8RGVwbG95bWVudC5QYXJ0cz4KLSAgICA8L0RlcGxveW1lbnQuUGFydHM+Ci08L0RlcGxveW1lbnQ+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUwOTQwZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjAgKzAsMCBAQAotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlJ1bnRpbWUuSW50ZXJvcFNlcnZpY2VzOwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLQotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJHb29nbGUuUHJvdG9idWYuVGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseURlc2NyaXB0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb25maWd1cmF0aW9uKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDb21wYW55KCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlQcm9kdWN0KCJHb29nbGUuUHJvdG9idWYuVGVzdCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUNvcHlyaWdodCgiQ29weXJpZ2h0IMKpICAyMDE1IildCi1bYXNzZW1ibHk6IEFzc2VtYmx5VHJhZGVtYXJrKCIiKV0KLVthc3NlbWJseTogQXNzZW1ibHlDdWx0dXJlKCIiKV0KLQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjMuMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMy4wLjAuMCIpXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9SZWZsZWN0aW9uL0Rlc2NyaXB0b3JzVGVzdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvUmVmbGVjdGlvbi9EZXNjcmlwdG9yc1Rlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUyZDVhNjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9SZWZsZWN0aW9uL0Rlc2NyaXB0b3JzVGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDI1OSArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zOwotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotdXNpbmcgVW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3M7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGVzdHMgZm9yIGRlc2NyaXB0b3JzLiAoTm90IGluIGl0cyBvd24gbmFtZXNwYWNlIG9yIGJyb2tlbiB1cCBpbnRvIGluZGl2aWR1YWwgY2xhc3NlcyBhcyB0aGUKLSAgICAvLy8gc2l6ZSBkb2Vzbid0IHdhcnJhbnQgaXQuIE9uIHRoZSBvdGhlciBoYW5kLCB0aGlzIG1ha2VzIG1lIGZlZWwgYSBiaXQgZGlydHkuLi4pCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY2xhc3MgRGVzY3JpcHRvcnNUZXN0Ci0gICAgewotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRmlsZURlc2NyaXB0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlID0gVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3I7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wcm90byIsIGZpbGUuTmFtZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInByb3RvYnVmX3VuaXR0ZXN0IiwgZmlsZS5QYWNrYWdlKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJVbml0dGVzdFByb3RvIiwgZmlsZS5Qcm90by5PcHRpb25zLkphdmFPdXRlckNsYXNzbmFtZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucHJvdG8iLCBmaWxlLlByb3RvLk5hbWUpOwotCi0gICAgICAgICAgICAvLyB1bml0dGVzdC5wcm90byBkb2Vzbid0IGhhdmUgYW55IHB1YmxpYyBpbXBvcnRzLCBidXQgdW5pdHRlc3RfaW1wb3J0LnByb3RvIGRvZXMuCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgZmlsZS5QdWJsaWNEZXBlbmRlbmNpZXMuQ291bnQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIFVuaXR0ZXN0SW1wb3J0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLlB1YmxpY0RlcGVuZGVuY2llcy5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5pdHRlc3RJbXBvcnRQdWJsaWNQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIFVuaXR0ZXN0SW1wb3J0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLlB1YmxpY0RlcGVuZGVuY2llc1swXSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBmaWxlLkRlcGVuZGVuY2llcy5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVW5pdHRlc3RJbXBvcnRQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIGZpbGUuRGVwZW5kZW5jaWVzWzBdKTsKLQotICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKHR5cGVvZihUZXN0QWxsVHlwZXMpLCBtZXNzYWdlVHlwZS5DbHJUeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKFRlc3RBbGxUeXBlcy5QYXJzZXIsIG1lc3NhZ2VUeXBlLlBhcnNlcik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZVR5cGUsIGZpbGUuTWVzc2FnZVR5cGVzWzBdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlVHlwZSwgZmlsZS5GaW5kVHlwZUJ5TmFtZTxNZXNzYWdlRGVzY3JpcHRvcj4oIlRlc3RBbGxUeXBlcyIpKTsKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKGZpbGUuRmluZFR5cGVCeU5hbWU8TWVzc2FnZURlc2NyaXB0b3I+KCJOb1N1Y2hUeXBlIikpOwotICAgICAgICAgICAgQXNzZXJ0Lk51bGwoZmlsZS5GaW5kVHlwZUJ5TmFtZTxNZXNzYWdlRGVzY3JpcHRvcj4oInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5NZXNzYWdlVHlwZXMuQ291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoaSwgZmlsZS5NZXNzYWdlVHlwZXNbaV0uSW5kZXgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmlsZS5FbnVtVHlwZXNbMF0sIGZpbGUuRmluZFR5cGVCeU5hbWU8RW51bURlc2NyaXB0b3I+KCJGb3JlaWduRW51bSIpKTsKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKGZpbGUuRmluZFR5cGVCeU5hbWU8RW51bURlc2NyaXB0b3I+KCJOb1N1Y2hUeXBlIikpOwotICAgICAgICAgICAgQXNzZXJ0Lk51bGwoZmlsZS5GaW5kVHlwZUJ5TmFtZTxFbnVtRGVzY3JpcHRvcj4oInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtIikpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIFVuaXR0ZXN0SW1wb3J0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLkVudW1UeXBlcy5Db3VudCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIkltcG9ydEVudW0iLCBVbml0dGVzdEltcG9ydFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5FbnVtVHlwZXNbMF0uTmFtZSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuRW51bVR5cGVzLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIGZpbGUuRW51bVR5cGVzW2ldLkluZGV4KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEwLCBmaWxlLlNlcmlhbGl6ZWREYXRhWzBdKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBNZXNzYWdlRGVzY3JpcHRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE1lc3NhZ2VEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlID0gVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBuZXN0ZWRUeXBlID0gVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuRGVzY3JpcHRvcjsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0QWxsVHlwZXMiLCBtZXNzYWdlVHlwZS5OYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUuRnVsbE5hbWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBtZXNzYWdlVHlwZS5GaWxlKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZVR5cGUuQ29udGFpbmluZ1R5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlVHlwZS5Qcm90by5PcHRpb25zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJUZXN0QWxsVHlwZXMiLCBtZXNzYWdlVHlwZS5OYW1lKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOZXN0ZWRNZXNzYWdlIiwgbmVzdGVkVHlwZS5OYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UiLCBuZXN0ZWRUeXBlLkZ1bGxOYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvciwgbmVzdGVkVHlwZS5GaWxlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlVHlwZSwgbmVzdGVkVHlwZS5Db250YWluaW5nVHlwZSk7Ci0KLSAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IG1lc3NhZ2VUeXBlLkZpZWxkcy5JbkRlY2xhcmF0aW9uT3JkZXIoKVswXTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgic2luZ2xlX2ludDMyIiwgZmllbGQuTmFtZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmllbGQsIG1lc3NhZ2VUeXBlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oInNpbmdsZV9pbnQzMiIpKTsKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKG1lc3NhZ2VUeXBlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oIm5vX3N1Y2hfZmllbGQiKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZmllbGQsIG1lc3NhZ2VUeXBlLkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKG1lc3NhZ2VUeXBlLkZpbmRGaWVsZEJ5TnVtYmVyKDU3MTI4MykpOwotICAgICAgICAgICAgdmFyIGZpZWxkc0luRGVjbGFyYXRpb25PcmRlciA9IG1lc3NhZ2VUeXBlLkZpZWxkcy5JbkRlY2xhcmF0aW9uT3JkZXIoKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzSW5EZWNsYXJhdGlvbk9yZGVyLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIGZpZWxkc0luRGVjbGFyYXRpb25PcmRlcltpXS5JbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXN0ZWRUeXBlLCBtZXNzYWdlVHlwZS5OZXN0ZWRUeXBlc1swXSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmVzdGVkVHlwZSwgbWVzc2FnZVR5cGUuRmluZERlc2NyaXB0b3I8TWVzc2FnZURlc2NyaXB0b3I+KCJOZXN0ZWRNZXNzYWdlIikpOwotICAgICAgICAgICAgQXNzZXJ0Lk51bGwobWVzc2FnZVR5cGUuRmluZERlc2NyaXB0b3I8TWVzc2FnZURlc2NyaXB0b3I+KCJOb1N1Y2hUeXBlIikpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZS5OZXN0ZWRUeXBlcy5Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChpLCBtZXNzYWdlVHlwZS5OZXN0ZWRUeXBlc1tpXS5JbmRleCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlVHlwZS5FbnVtVHlwZXNbMF0sIG1lc3NhZ2VUeXBlLkZpbmREZXNjcmlwdG9yPEVudW1EZXNjcmlwdG9yPigiTmVzdGVkRW51bSIpKTsKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKG1lc3NhZ2VUeXBlLkZpbmREZXNjcmlwdG9yPEVudW1EZXNjcmlwdG9yPigiTm9TdWNoVHlwZSIpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGUuRW51bVR5cGVzLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIG1lc3NhZ2VUeXBlLkVudW1UeXBlc1tpXS5JbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRmllbGREZXNjcmlwdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcjsKLSAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBwcmltaXRpdmVGaWVsZCA9IG1lc3NhZ2VUeXBlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oInNpbmdsZV9pbnQzMiIpOwotICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGVudW1GaWVsZCA9IG1lc3NhZ2VUeXBlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oInNpbmdsZV9uZXN0ZWRfZW51bSIpOwotICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIG1lc3NhZ2VGaWVsZCA9IG1lc3NhZ2VUeXBlLkZpbmREZXNjcmlwdG9yPEZpZWxkRGVzY3JpcHRvcj4oInNpbmdsZV9mb3JlaWduX21lc3NhZ2UiKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJzaW5nbGVfaW50MzIiLCBwcmltaXRpdmVGaWVsZC5OYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLnNpbmdsZV9pbnQzMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbWl0aXZlRmllbGQuRnVsbE5hbWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEsIHByaW1pdGl2ZUZpZWxkLkZpZWxkTnVtYmVyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlVHlwZSwgcHJpbWl0aXZlRmllbGQuQ29udGFpbmluZ1R5cGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBwcmltaXRpdmVGaWVsZC5GaWxlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGaWVsZFR5cGUuSW50MzIsIHByaW1pdGl2ZUZpZWxkLkZpZWxkVHlwZSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHByaW1pdGl2ZUZpZWxkLlByb3RvLk9wdGlvbnMpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInNpbmdsZV9uZXN0ZWRfZW51bSIsIGVudW1GaWVsZC5OYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGaWVsZFR5cGUuRW51bSwgZW51bUZpZWxkLkZpZWxkVHlwZSk7Ci0gICAgICAgICAgICAvLyBBc3NlcnQuQXJlRXF1YWwoVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uRGVzY3JpcHRvclByb3RvRmlsZSwgZW51bUZpZWxkLkVudW1UeXBlKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJzaW5nbGVfZm9yZWlnbl9tZXNzYWdlIiwgbWVzc2FnZUZpZWxkLk5hbWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEZpZWxkVHlwZS5NZXNzYWdlLCBtZXNzYWdlRmllbGQuRmllbGRUeXBlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChGb3JlaWduTWVzc2FnZS5EZXNjcmlwdG9yLCBtZXNzYWdlRmllbGQuTWVzc2FnZVR5cGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkRGVzY3JpcHRvckxhYmVsKCkKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIHNpbmdsZUZpZWxkID0KLSAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJzaW5nbGVfaW50MzIiKTsKLSAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciByZXBlYXRlZEZpZWxkID0KLSAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxGaWVsZERlc2NyaXB0b3I+KCJyZXBlYXRlZF9pbnQzMiIpOwotCi0gICAgICAgICAgICBBc3NlcnQuSXNGYWxzZShzaW5nbGVGaWVsZC5Jc1JlcGVhdGVkKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc1RydWUocmVwZWF0ZWRGaWVsZC5Jc1JlcGVhdGVkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBFbnVtRGVzY3JpcHRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE5vdGU6IHRoaXMgdGVzdCBpcyBhIGJpdCBkaWZmZXJlbnQgdG8gdGhlIEphdmEgdmVyc2lvbiBiZWNhdXNlIHRoZXJlJ3Mgbm8gc3RhdGljIHdheSBvZiBnZXR0aW5nIHRvIHRoZSBkZXNjcmlwdG9yCi0gICAgICAgICAgICBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IFVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLkZpbmRUeXBlQnlOYW1lPEVudW1EZXNjcmlwdG9yPigiRm9yZWlnbkVudW0iKTsKLSAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yIG5lc3RlZFR5cGUgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxFbnVtRGVzY3JpcHRvcj4oIk5lc3RlZEVudW0iKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJGb3JlaWduRW51bSIsIGVudW1UeXBlLk5hbWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bSIsIGVudW1UeXBlLkZ1bGxOYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvciwgZW51bVR5cGUuRmlsZSk7Ci0gICAgICAgICAgICBBc3NlcnQuTnVsbChlbnVtVHlwZS5Db250YWluaW5nVHlwZSk7Ci0gICAgICAgICAgICBBc3NlcnQuTnVsbChlbnVtVHlwZS5Qcm90by5PcHRpb25zKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJOZXN0ZWRFbnVtIiwgbmVzdGVkVHlwZS5OYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZFR5cGUuRnVsbE5hbWUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBuZXN0ZWRUeXBlLkZpbGUpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yLCBuZXN0ZWRUeXBlLkNvbnRhaW5pbmdUeXBlKTsKLQotICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvciB2YWx1ZSA9IGVudW1UeXBlLkZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9GT08iKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh2YWx1ZSwgZW51bVR5cGUuVmFsdWVzWzFdKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiRk9SRUlHTl9GT08iLCB2YWx1ZS5OYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0LCB2YWx1ZS5OdW1iZXIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKChpbnQpIEZvcmVpZ25FbnVtLkZvcmVpZ25Gb28sIHZhbHVlLk51bWJlcik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwodmFsdWUsIGVudW1UeXBlLkZpbmRWYWx1ZUJ5TnVtYmVyKDQpKTsKLSAgICAgICAgICAgIEFzc2VydC5OdWxsKGVudW1UeXBlLkZpbmRWYWx1ZUJ5TmFtZSgiTk9fU1VDSF9WQUxVRSIpKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVR5cGUuVmFsdWVzLkNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGksIGVudW1UeXBlLlZhbHVlc1tpXS5JbmRleCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgT25lb2ZEZXNjcmlwdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgT25lb2ZEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5GaW5kRGVzY3JpcHRvcjxPbmVvZkRlc2NyaXB0b3I+KCJvbmVvZl9maWVsZCIpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJvbmVvZl9maWVsZCIsIGRlc2NyaXB0b3IuTmFtZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5vbmVvZl9maWVsZCIsIGRlc2NyaXB0b3IuRnVsbE5hbWUpOwotCi0gICAgICAgICAgICB2YXIgZXhwZWN0ZWRGaWVsZHMgPSBuZXdbXSB7Ci0gICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLk9uZW9mQnl0ZXNGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuT25lb2ZOZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLk9uZW9mU3RyaW5nRmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLk9uZW9mVWludDMyRmllbGROdW1iZXIgfQotICAgICAgICAgICAgICAgIC5TZWxlY3QoZmllbGROdW1iZXIgPT4gVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmluZEZpZWxkQnlOdW1iZXIoZmllbGROdW1iZXIpKQotICAgICAgICAgICAgICAgIC5Ub0xpc3QoKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWVsZCBpbiBleHBlY3RlZEZpZWxkcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBc3NlcnQuQXJlU2FtZShkZXNjcmlwdG9yLCBmaWVsZC5Db250YWluaW5nT25lb2YpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBDb2xsZWN0aW9uQXNzZXJ0LkFyZUVxdWl2YWxlbnQoZXhwZWN0ZWRGaWVsZHMsIGRlc2NyaXB0b3IuRmllbGRzKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBNYXBFbnRyeU1lc3NhZ2VEZXNjcmlwdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBNYXBXZWxsS25vd25UeXBlcy5EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzBdOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChkZXNjcmlwdG9yLlBhcnNlcik7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGRlc2NyaXB0b3IuQ2xyVHlwZSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGRlc2NyaXB0b3IuRmllbGRzWzFdLkFjY2Vzc29yKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEZyb20gVGVzdEZpZWxkT3JkZXJpbmc6Ci0gICAgICAgIC8vIHN0cmluZyBteV9zdHJpbmcgPSAxMTsKLSAgICAgICAgLy8gaW50NjQgbXlfaW50ID0gMTsKLSAgICAgICAgLy8gZmxvYXQgbXlfZmxvYXQgPSAxMDE7Ci0gICAgICAgIC8vIE5lc3RlZE1lc3NhZ2Ugc2luZ2xlX25lc3RlZF9tZXNzYWdlID0gMjAwOwotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRmllbGRMaXN0T3JkZXJpbmdzKCkKLSAgICAgICAgeyAKLSAgICAgICAgICAgIHZhciBmaWVsZHMgPSBUZXN0RmllbGRPcmRlcmluZ3MuRGVzY3JpcHRvci5GaWVsZHM7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3W10geyAxMSwgMSwgMTAxLCAyMDAgfSwgZmllbGRzLkluRGVjbGFyYXRpb25PcmRlcigpLlNlbGVjdCh4ID0+IHguRmllbGROdW1iZXIpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXdbXSB7IDEsIDExLCAxMDEsIDIwMCB9LCBmaWVsZHMuSW5GaWVsZE51bWJlck9yZGVyKCkuU2VsZWN0KHggPT4geC5GaWVsZE51bWJlcikpOwotICAgICAgICB9Ci0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgRGVzY3JpcHRvclByb3RvRmlsZURlc2NyaXB0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVEZXNjcmlwdG9yLkRlc2NyaXB0b3JQcm90b0ZpbGVEZXNjcmlwdG9yOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIsIGRlc2NyaXB0b3IuTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1JlZmxlY3Rpb24vRmllbGRBY2Nlc3NUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9SZWZsZWN0aW9uL0ZpZWxkQWNjZXNzVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTQ4OGFmMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1JlZmxlY3Rpb24vRmllbGRBY2Nlc3NUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zOwotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIHB1YmxpYyBjbGFzcyBGaWVsZEFjY2Vzc1Rlc3QKLSAgICB7Ci0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBHZXRWYWx1ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgdmFyIGZpZWxkcyA9IFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yLkZpZWxkczsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlNpbmdsZUJvb2wsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlQm9vbEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVCeXRlcywgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVCeXRlc0ZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVEb3VibGUsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlRG91YmxlRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlNpbmdsZUZpeGVkMzIsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlRml4ZWQzMkZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVGaXhlZDY0LCBmaWVsZHNbVGVzdEFsbFR5cGVzLlNpbmdsZUZpeGVkNjRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuU2luZ2xlRmxvYXQsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlRmxvYXRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuU2luZ2xlRm9yZWlnbkVudW0sIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlRm9yZWlnbkVudW1GaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuU2luZ2xlRm9yZWlnbk1lc3NhZ2UsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuU2luZ2xlSW1wb3J0RW51bSwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVJbXBvcnRFbnVtRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlNpbmdsZUltcG9ydE1lc3NhZ2UsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlSW1wb3J0TWVzc2FnZUZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVJbnQzMiwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVJbnQzMkZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVJbnQ2NCwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVJbnQ2NEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVOZXN0ZWRFbnVtLCBmaWVsZHNbVGVzdEFsbFR5cGVzLlNpbmdsZU5lc3RlZEVudW1GaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuU2luZ2xlTmVzdGVkTWVzc2FnZSwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVOZXN0ZWRNZXNzYWdlRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZUZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVTaW50MzIsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlU2ludDMyRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlNpbmdsZVNpbnQ2NCwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVTaW50NjRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuU2luZ2xlU3RyaW5nLCBmaWVsZHNbVGVzdEFsbFR5cGVzLlNpbmdsZVN0cmluZ0ZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVTZml4ZWQzMiwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVTZml4ZWQzMkZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVTZml4ZWQ2NCwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVTZml4ZWQ2NEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5TaW5nbGVVaW50MzIsIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlVWludDMyRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlNpbmdsZVVpbnQ2NCwgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVVaW50NjRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuT25lb2ZCeXRlcywgZmllbGRzW1Rlc3RBbGxUeXBlcy5PbmVvZkJ5dGVzRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLk9uZW9mU3RyaW5nLCBmaWVsZHNbVGVzdEFsbFR5cGVzLk9uZW9mU3RyaW5nRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLk9uZW9mTmVzdGVkTWVzc2FnZSwgZmllbGRzW1Rlc3RBbGxUeXBlcy5PbmVvZk5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuT25lb2ZVaW50MzIsIGZpZWxkc1tUZXN0QWxsVHlwZXMuT25lb2ZVaW50MzJGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotCi0gICAgICAgICAgICAvLyBKdXN0IG9uZSBleGFtcGxlIGZvciByZXBlYXRlZCBmaWVsZHMgLSB0aGV5J3JlIGFsbCBqdXN0IHJldHVybmluZyB0aGUgbGlzdAotICAgICAgICAgICAgdmFyIGxpc3QgPSAoSUxpc3QpIGZpZWxkc1tUZXN0QWxsVHlwZXMuUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLlJlcGVhdGVkSW50MzIsIGxpc3QpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuUmVwZWF0ZWRJbnQzMlswXSwgbGlzdFswXSk7IC8vIEp1c3QgaW4gY2FzZSB0aGVyZSB3YXMgYW55IGRvdWJ0Li4uCi0KLSAgICAgICAgICAgIC8vIEp1c3QgYSBzaW5nbGUgbWFwIGZpZWxkLCBmb3IgdGhlIHNhbWUgcmVhc29uCi0gICAgICAgICAgICB2YXIgbWFwTWVzc2FnZSA9IG5ldyBUZXN0TWFwIHsgTWFwU3RyaW5nU3RyaW5nID0geyB7ICJrZXkxIiwgInZhbHVlMSIgfSwgeyAia2V5MiIsICJ2YWx1ZTIiIH0gfSB9OwotICAgICAgICAgICAgZmllbGRzID0gVGVzdE1hcC5EZXNjcmlwdG9yLkZpZWxkczsKLSAgICAgICAgICAgIHZhciBkaWN0aW9uYXJ5ID0gKElEaWN0aW9uYXJ5KSBmaWVsZHNbVGVzdE1hcC5NYXBTdHJpbmdTdHJpbmdGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWFwTWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWFwTWVzc2FnZS5NYXBTdHJpbmdTdHJpbmcsIGRpY3Rpb25hcnkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ2YWx1ZTEiLCBkaWN0aW9uYXJ5WyJrZXkxIl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgZmllbGRzID0gVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmllbGRzOwotICAgICAgICAgICAgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVCb29sRmllbGROdW1iZXJdLkFjY2Vzc29yLkNsZWFyKG1lc3NhZ2UpOwotICAgICAgICAgICAgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVJbnQzMkZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5DbGVhcihtZXNzYWdlKTsKLSAgICAgICAgICAgIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlU3RyaW5nRmllbGROdW1iZXJdLkFjY2Vzc29yLkNsZWFyKG1lc3NhZ2UpOwotICAgICAgICAgICAgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVCeXRlc0ZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5DbGVhcihtZXNzYWdlKTsKLSAgICAgICAgICAgIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlRm9yZWlnbkVudW1GaWVsZE51bWJlcl0uQWNjZXNzb3IuQ2xlYXIobWVzc2FnZSk7Ci0gICAgICAgICAgICBmaWVsZHNbVGVzdEFsbFR5cGVzLlNpbmdsZUZvcmVpZ25NZXNzYWdlRmllbGROdW1iZXJdLkFjY2Vzc29yLkNsZWFyKG1lc3NhZ2UpOwotICAgICAgICAgICAgZmllbGRzW1Rlc3RBbGxUeXBlcy5SZXBlYXRlZERvdWJsZUZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5DbGVhcihtZXNzYWdlKTsKLQotICAgICAgICAgICAgdmFyIGV4cGVjdGVkID0gbmV3IFRlc3RBbGxUeXBlcyhTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2luZ2xlQm9vbCA9IGZhbHNlLAotICAgICAgICAgICAgICAgIFNpbmdsZUludDMyID0gMCwKLSAgICAgICAgICAgICAgICBTaW5nbGVTdHJpbmcgPSAiIiwKLSAgICAgICAgICAgICAgICBTaW5nbGVCeXRlcyA9IEJ5dGVTdHJpbmcuRW1wdHksCi0gICAgICAgICAgICAgICAgU2luZ2xlRm9yZWlnbkVudW0gPSAwLAotICAgICAgICAgICAgICAgIFNpbmdsZUZvcmVpZ25NZXNzYWdlID0gbnVsbCwKLSAgICAgICAgICAgIH07Ci0gICAgICAgICAgICBleHBlY3RlZC5SZXBlYXRlZERvdWJsZS5DbGVhcigpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIG1lc3NhZ2UpOwotCi0gICAgICAgICAgICAvLyBTZXBhcmF0ZWx5LCBtYXBzLgotICAgICAgICAgICAgdmFyIG1hcE1lc3NhZ2UgPSBuZXcgVGVzdE1hcCB7IE1hcFN0cmluZ1N0cmluZyA9IHsgeyAia2V5MSIsICJ2YWx1ZTEiIH0sIHsgImtleTIiLCAidmFsdWUyIiB9IH0gfTsKLSAgICAgICAgICAgIGZpZWxkcyA9IFRlc3RNYXAuRGVzY3JpcHRvci5GaWVsZHM7Ci0gICAgICAgICAgICBmaWVsZHNbVGVzdE1hcC5NYXBTdHJpbmdTdHJpbmdGaWVsZE51bWJlcl0uQWNjZXNzb3IuQ2xlYXIobWFwTWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMCwgbWFwTWVzc2FnZS5NYXBTdHJpbmdTdHJpbmcuQ291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFNldFZhbHVlX1NpbmdsZUZpZWxkcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEp1c3QgYSBzYW1wbGUgKHByaW1pdGl2ZXMsIG1lc3NhZ2VzLCBlbnVtcywgc3RyaW5ncywgYnl0ZSBzdHJpbmdzKQotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgZmllbGRzID0gVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3IuRmllbGRzOwotICAgICAgICAgICAgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVCb29sRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIGZhbHNlKTsKLSAgICAgICAgICAgIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlSW50MzJGaWVsZE51bWJlcl0uQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgNTAwKTsKLSAgICAgICAgICAgIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlU3RyaW5nRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsICJJdCdzIGEgc3RyaW5nIik7Ci0gICAgICAgICAgICBmaWVsZHNbVGVzdEFsbFR5cGVzLlNpbmdsZUJ5dGVzRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIEJ5dGVTdHJpbmcuQ29weUZyb20oOTksIDk4LCA5NykpOwotICAgICAgICAgICAgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVGb3JlaWduRW51bUZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5TZXRWYWx1ZShtZXNzYWdlLCBGb3JlaWduRW51bS5Gb3JlaWduRm9vKTsKLSAgICAgICAgICAgIGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlcl0uQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgbmV3IEZvcmVpZ25NZXNzYWdlIHsgQyA9IDEyMzQ1IH0pOwotICAgICAgICAgICAgZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVEb3VibGVGaWVsZE51bWJlcl0uQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgMjAxNTA3MDEuNSk7Ci0KLSAgICAgICAgICAgIHZhciBleHBlY3RlZCA9IG5ldyBUZXN0QWxsVHlwZXMoU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFNpbmdsZUJvb2wgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbnQzMiA9IDUwMCwKLSAgICAgICAgICAgICAgICBTaW5nbGVTdHJpbmcgPSAiSXQncyBhIHN0cmluZyIsCi0gICAgICAgICAgICAgICAgU2luZ2xlQnl0ZXMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKDk5LCA5OCwgOTcpLAotICAgICAgICAgICAgICAgIFNpbmdsZUZvcmVpZ25FbnVtID0gRm9yZWlnbkVudW0uRm9yZWlnbkZvbywKLSAgICAgICAgICAgICAgICBTaW5nbGVGb3JlaWduTWVzc2FnZSA9IG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAxMjM0NSB9LAotICAgICAgICAgICAgICAgIFNpbmdsZURvdWJsZSA9IDIwMTUwNzAxLjUKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChleHBlY3RlZCwgbWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0VmFsdWVfU2luZ2xlRmllbGRzX1dyb25nVHlwZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElNZXNzYWdlIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgZmllbGRzID0gbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkczsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZENhc3RFeGNlcHRpb24+KCgpID0+IGZpZWxkc1tUZXN0QWxsVHlwZXMuU2luZ2xlQm9vbEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5TZXRWYWx1ZShtZXNzYWdlLCAiVGhpcyBpc24ndCBhIGJvb2wiKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0VmFsdWVfTWFwRmllbGRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBUZXN0TWFwKCk7Ci0gICAgICAgICAgICB2YXIgZmllbGRzID0gbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkczsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8SW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbj4oKCkgPT4gZmllbGRzW1Rlc3RNYXAuTWFwU3RyaW5nU3RyaW5nRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgc3RyaW5nPigpKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgU2V0VmFsdWVfUmVwZWF0ZWRGaWVsZHMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgdmFyIGZpZWxkcyA9IG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHM7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24+KCgpID0+IGZpZWxkc1tUZXN0QWxsVHlwZXMuUmVwZWF0ZWREb3VibGVGaWVsZE51bWJlcl0uQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgbmV3IGRvdWJsZVsxMF0pKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBHZXRWYWx1ZV9JbmNvcnJlY3RUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IFNhbXBsZU1lc3NhZ2VzLkNyZWF0ZUZ1bGxUZXN0QWxsVHlwZXMoKTsKLSAgICAgICAgICAgIHZhciBmaWVsZHMgPSBtZXNzYWdlLkRlc2NyaXB0b3IuRmllbGRzOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkQ2FzdEV4Y2VwdGlvbj4oKCkgPT4gZmllbGRzW1Rlc3RBbGxUeXBlcy5TaW5nbGVCb29sRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG5ldyBUZXN0TWFwKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBPbmVvZigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBkZXNjcmlwdG9yLk9uZW9mcy5Db3VudCk7Ci0gICAgICAgICAgICB2YXIgb25lb2YgPSBkZXNjcmlwdG9yLk9uZW9mc1swXTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgib25lb2ZfZmllbGQiLCBvbmVvZi5OYW1lKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwob25lb2YuQWNjZXNzb3IuR2V0Q2FzZUZpZWxkRGVzY3JpcHRvcihtZXNzYWdlKSk7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2UuT25lb2ZTdHJpbmcgPSAiZm9vIjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKGRlc2NyaXB0b3IuRmllbGRzW1Rlc3RBbGxUeXBlcy5PbmVvZlN0cmluZ0ZpZWxkTnVtYmVyXSwgb25lb2YuQWNjZXNzb3IuR2V0Q2FzZUZpZWxkRGVzY3JpcHRvcihtZXNzYWdlKSk7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2UuT25lb2ZVaW50MzIgPSAxMDsKLSAgICAgICAgICAgIEFzc2VydC5BcmVTYW1lKGRlc2NyaXB0b3IuRmllbGRzW1Rlc3RBbGxUeXBlcy5PbmVvZlVpbnQzMkZpZWxkTnVtYmVyXSwgb25lb2YuQWNjZXNzb3IuR2V0Q2FzZUZpZWxkRGVzY3JpcHRvcihtZXNzYWdlKSk7Ci0KLSAgICAgICAgICAgIG9uZW9mLkFjY2Vzc29yLkNsZWFyKG1lc3NhZ2UpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKFRlc3RBbGxUeXBlcy5PbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUsIG1lc3NhZ2UuT25lb2ZGaWVsZENhc2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkRGVzY3JpcHRvcl9CeU5hbWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlcy5EZXNjcmlwdG9yOwotICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZHNbVGVzdEFsbFR5cGVzLlNpbmdsZUJvb2xGaWVsZE51bWJlcl0sCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZHNbInNpbmdsZV9ib29sIl0pOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIEZpZWxkRGVzY3JpcHRvcl9Ob3RGb3VuZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBkZXNjcmlwdG9yID0gVGVzdEFsbFR5cGVzLkRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEtleU5vdEZvdW5kRXhjZXB0aW9uPigoKSA9PiBkZXNjcmlwdG9yLkZpZWxkc1s5OTk5OTldLlRvU3RyaW5nKCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxLZXlOb3RGb3VuZEV4Y2VwdGlvbj4oKCkgPT4gZGVzY3JpcHRvci5GaWVsZHNbIm5vdCBmb3VuZCJdLlRvU3RyaW5nKCkpOwotICAgICAgICB9ICAgICAgICAKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1JlZmxlY3Rpb24vVHlwZVJlZ2lzdHJ5VGVzdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvUmVmbGVjdGlvbi9UeXBlUmVnaXN0cnlUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1YmU3Y2EyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvUmVmbGVjdGlvbi9UeXBlUmVnaXN0cnlUZXN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsOTQgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3M7Ci11c2luZyBHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXM7Ci11c2luZyBOVW5pdC5GcmFtZXdvcms7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIHB1YmxpYyBjbGFzcyBUeXBlUmVnaXN0cnlUZXN0Ci0gICAgewotICAgICAgICAvLyBNb3N0IG9mIG91ciB0ZXN0cyB1c2UgbWVzc2FnZXMuIFNpbXBsZSB0ZXN0IHRoYXQgd2UgcmVhbGx5IGNhbiB1c2UgZmlsZXMuLi4KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIENyZWF0ZVdpdGhGaWxlRGVzY3JpcHRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IFR5cGVSZWdpc3RyeS5Gcm9tRmlsZXMoRHVyYXRpb25SZWZsZWN0aW9uLkRlc2NyaXB0b3IsIFN0cnVjdFJlZmxlY3Rpb24uRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBBc3NlcnREZXNjcmlwdG9yUHJlc2VudChyZWdpc3RyeSwgRHVyYXRpb24uRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBBc3NlcnREZXNjcmlwdG9yUHJlc2VudChyZWdpc3RyeSwgTGlzdFZhbHVlLkRlc2NyaXB0b3IpOwotICAgICAgICAgICAgQXNzZXJ0RGVzY3JpcHRvckFic2VudChyZWdpc3RyeSwgVGltZXN0YW1wLkRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFR5cGVzRnJvbVNhbWVGaWxlKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSnVzdCBmb3Iga2lja3MsIGxldCdzIHN0YXJ0IHdpdGggYSBuZXN0ZWQgdHlwZQotICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0gVHlwZVJlZ2lzdHJ5LkZyb21NZXNzYWdlcyhUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5EZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIC8vIFRvcC1sZXZlbC4uLgotICAgICAgICAgICAgQXNzZXJ0RGVzY3JpcHRvclByZXNlbnQocmVnaXN0cnksIFRlc3RGaWVsZE9yZGVyaW5ncy5EZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIC8vIC4uLiBhbmQgbmVzdGVkIChub3QgdGhlIHNhbWUgYXMgdGhlIG9yaWdpbmFsIE5lc3RlZE1lc3NhZ2UhKQotICAgICAgICAgICAgQXNzZXJ0RGVzY3JpcHRvclByZXNlbnQocmVnaXN0cnksIFRlc3RGaWVsZE9yZGVyaW5ncy5UeXBlcy5OZXN0ZWRNZXNzYWdlLkRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIERlcGVuZGVuY2llc0FyZUluY2x1ZGVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHJlZ2lzdHJ5ID0gVHlwZVJlZ2lzdHJ5LkZyb21NZXNzYWdlcyhUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAvLyBEaXJlY3QgZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICBBc3NlcnREZXNjcmlwdG9yUHJlc2VudChyZWdpc3RyeSwgSW1wb3J0TWVzc2FnZS5EZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIC8vIFB1YmxpYyBkZXBlbmRlbmNpZXMKLSAgICAgICAgICAgIEFzc2VydERlc2NyaXB0b3JQcmVzZW50KHJlZ2lzdHJ5LCBQdWJsaWNJbXBvcnRNZXNzYWdlLkRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIER1cGxpY2F0ZUZpbGVzKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRHVwbGljYXRlcyB2aWEgZGVwZW5kZW5jaWVzIGFuZCBzaW1wbHkgdmlhIHJlcGV0aXRpb24KLSAgICAgICAgICAgIHZhciByZWdpc3RyeSA9IFR5cGVSZWdpc3RyeS5Gcm9tRmlsZXMoCi0gICAgICAgICAgICAgICAgVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIFVuaXR0ZXN0SW1wb3J0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgIFRpbWVzdGFtcFJlZmxlY3Rpb24uRGVzY3JpcHRvciwgVGltZXN0YW1wUmVmbGVjdGlvbi5EZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIEFzc2VydERlc2NyaXB0b3JQcmVzZW50KHJlZ2lzdHJ5LCBUZXN0QWxsVHlwZXMuRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBBc3NlcnREZXNjcmlwdG9yUHJlc2VudChyZWdpc3RyeSwgSW1wb3J0TWVzc2FnZS5EZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIEFzc2VydERlc2NyaXB0b3JQcmVzZW50KHJlZ2lzdHJ5LCBUaW1lc3RhbXAuRGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydERlc2NyaXB0b3JQcmVzZW50KFR5cGVSZWdpc3RyeSByZWdpc3RyeSwgTWVzc2FnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgICAgICAgewotICAgICAgICAgICAgQXNzZXJ0LkFyZVNhbWUoZGVzY3JpcHRvciwgcmVnaXN0cnkuRmluZChkZXNjcmlwdG9yLkZ1bGxOYW1lKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIEFzc2VydERlc2NyaXB0b3JBYnNlbnQoVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5LCBNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKHJlZ2lzdHJ5LkZpbmQoZGVzY3JpcHRvci5GdWxsTmFtZSkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9TYW1wbGVFbnVtLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9TYW1wbGVFbnVtLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NzQ0N2FmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvU2FtcGxlRW51bS5jcworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0gICAgCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8gSnVzdCBhIHNhbXBsZSBlbnVtIHdpdGggcG9zaXRpdmUgYW5kIG5lZ2F0aXZlIHZhbHVlcyB0byBiZSB1c2VkIGluIHRlc3RzLgotICAgIGludGVybmFsIGVudW0gU2FtcGxlRW51bQotICAgIHsKLSAgICAgICAgTmVnYXRpdmVWYWx1ZSA9IC0yLAotICAgICAgICBOb25lID0gMCwKLSAgICAgICAgUG9zaXRpdmVWYWx1ZSA9IDMKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1NhbXBsZU1lc3NhZ2VzLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9TYW1wbGVNZXNzYWdlcy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhNGUyYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1NhbXBsZU1lc3NhZ2VzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3M7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEhlbHBlciBtZXRob2RzIHRvIGNyZWF0ZSBzYW1wbGUgaW5zdGFuY2VzIG9mIHR5cGVzIGdlbmVyYXRlZCBmcm9tIHVuaXQgdGVzdCBtZXNzYWdlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBTYW1wbGVNZXNzYWdlcwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBzYW1wbGUgVGVzdEFsbFR5cGVzIG1lc3NhZ2Ugd2l0aCBhbGwgZmllbGRzIHBvcHVsYXRlZC4KLSAgICAgICAgLy8vIFRoZSAib25lb2YiIGZpZWxkIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBzdHJpbmcgcHJvcGVydHkgKE9uZW9mU3RyaW5nKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBUZXN0QWxsVHlwZXMgQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGVzdEFsbFR5cGVzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU2luZ2xlQm9vbCA9IHRydWUsCi0gICAgICAgICAgICAgICAgU2luZ2xlQnl0ZXMgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKDEsIDIsIDMsIDQpLAotICAgICAgICAgICAgICAgIFNpbmdsZURvdWJsZSA9IDIzLjUsCi0gICAgICAgICAgICAgICAgU2luZ2xlRml4ZWQzMiA9IDIzLAotICAgICAgICAgICAgICAgIFNpbmdsZUZpeGVkNjQgPSAxMjM0NTY3ODkwMTIzLAotICAgICAgICAgICAgICAgIFNpbmdsZUZsb2F0ID0gMTIuMjVmLAotICAgICAgICAgICAgICAgIFNpbmdsZUZvcmVpZ25FbnVtID0gRm9yZWlnbkVudW0uRm9yZWlnbkJhciwKLSAgICAgICAgICAgICAgICBTaW5nbGVGb3JlaWduTWVzc2FnZSA9IG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAxMCB9LAotICAgICAgICAgICAgICAgIFNpbmdsZUltcG9ydEVudW0gPSBJbXBvcnRFbnVtLkltcG9ydEJheiwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbXBvcnRNZXNzYWdlID0gbmV3IEltcG9ydE1lc3NhZ2UgeyBEID0gMjAgfSwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbnQzMiA9IDEwMCwKLSAgICAgICAgICAgICAgICBTaW5nbGVJbnQ2NCA9IDMyMTA5ODc2NTQzMjEsCi0gICAgICAgICAgICAgICAgU2luZ2xlTmVzdGVkRW51bSA9IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZvbywKLSAgICAgICAgICAgICAgICBTaW5nbGVOZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIHsgQmIgPSAzNSB9LAotICAgICAgICAgICAgICAgIFNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UgPSBuZXcgUHVibGljSW1wb3J0TWVzc2FnZSB7IEUgPSA1NCB9LAotICAgICAgICAgICAgICAgIFNpbmdsZVNmaXhlZDMyID0gLTEyMywKLSAgICAgICAgICAgICAgICBTaW5nbGVTZml4ZWQ2NCA9IC0xMjM0NTY3ODkwMTIzNCwKLSAgICAgICAgICAgICAgICBTaW5nbGVTaW50MzIgPSAtNDU2LAotICAgICAgICAgICAgICAgIFNpbmdsZVNpbnQ2NCA9IC0xMjM0NTY3ODkwMTIzNSwKLSAgICAgICAgICAgICAgICBTaW5nbGVTdHJpbmcgPSAidGVzdCIsCi0gICAgICAgICAgICAgICAgU2luZ2xlVWludDMyID0gVUludDMyLk1heFZhbHVlLAotICAgICAgICAgICAgICAgIFNpbmdsZVVpbnQ2NCA9IFVJbnQ2NC5NYXhWYWx1ZSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEJvb2wgPSB7IHRydWUsIGZhbHNlIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRCeXRlcyA9IHsgQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzLCA0KSwgQnl0ZVN0cmluZy5Db3B5RnJvbSg1LCA2KSwgQnl0ZVN0cmluZy5Db3B5RnJvbShuZXcgYnl0ZVsxMDAwXSkgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZERvdWJsZSA9IHsgLTEyLjI1LCAyMy41IH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRGaXhlZDMyID0geyBVSW50MzIuTWF4VmFsdWUsIDIzIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRGaXhlZDY0ID0geyBVSW50NjQuTWF4VmFsdWUsIDEyMzQ1Njc4OTAxMjMgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEZsb2F0ID0geyAxMDBmLCAxMi4yNWYgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZEZvcmVpZ25FbnVtID0geyBGb3JlaWduRW51bS5Gb3JlaWduRm9vLCBGb3JlaWduRW51bS5Gb3JlaWduQmFyIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSA9IHsgbmV3IEZvcmVpZ25NZXNzYWdlKCksIG5ldyBGb3JlaWduTWVzc2FnZSB7IEMgPSAxMCB9IH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRJbXBvcnRFbnVtID0geyBJbXBvcnRFbnVtLkltcG9ydEJheiwgSW1wb3J0RW51bS5VbnNwZWNpZmllZCB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkSW1wb3J0TWVzc2FnZSA9IHsgbmV3IEltcG9ydE1lc3NhZ2UgeyBEID0gMjAgfSwgbmV3IEltcG9ydE1lc3NhZ2UgeyBEID0gMjUgfSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkSW50MzIgPSB7IDEwMCwgMjAwIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRJbnQ2NCA9IHsgMzIxMDk4NzY1NDMyMSwgSW50NjQuTWF4VmFsdWUgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZE5lc3RlZEVudW0gPSB7IFRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtLkZvbywgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0uTmVnIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0geyBuZXcgVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgeyBCYiA9IDM1IH0sIG5ldyBUZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSB7IEJiID0gMTAgfSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZSA9IHsgbmV3IFB1YmxpY0ltcG9ydE1lc3NhZ2UgeyBFID0gNTQgfSwgbmV3IFB1YmxpY0ltcG9ydE1lc3NhZ2UgeyBFID0gLTEgfSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkU2ZpeGVkMzIgPSB7IC0xMjMsIDEyMyB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkU2ZpeGVkNjQgPSB7IC0xMjM0NTY3ODkwMTIzNCwgMTIzNDU2Nzg5MDEyMzQgfSwKLSAgICAgICAgICAgICAgICBSZXBlYXRlZFNpbnQzMiA9IHsgLTQ1NiwgMTAwIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRTaW50NjQgPSB7IC0xMjM0NTY3ODkwMTIzNSwgMTIzIH0sCi0gICAgICAgICAgICAgICAgUmVwZWF0ZWRTdHJpbmcgPSB7ICJmb28iLCAiYmFyIiB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkVWludDMyID0geyBVSW50MzIuTWF4VmFsdWUsIFVJbnQzMi5NaW5WYWx1ZSB9LAotICAgICAgICAgICAgICAgIFJlcGVhdGVkVWludDY0ID0geyBVSW50NjQuTWF4VmFsdWUsIFVJbnQzMi5NaW5WYWx1ZSB9LAotICAgICAgICAgICAgICAgIE9uZW9mU3RyaW5nID0gIk9uZW9mIHN0cmluZyIKLSAgICAgICAgICAgIH07Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9UZXN0Q29ybmVyQ2FzZXMuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RDb3JuZXJDYXNlcy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmQ3NWIxOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RDb3JuZXJDYXNlcy5jcworKysgL2Rldi9udWxsCkBAIC0xLDYyICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0gICAgCi11c2luZyBVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3RvczsKLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIHB1YmxpYyBjbGFzcyBUZXN0Q29ybmVyQ2FzZXMKLSAgICB7Ci0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUZXN0Um91bmRUcmlwTmVnYXRpdmVFbnVtcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5lZ2F0aXZlRW51bU1lc3NhZ2UgbXNnID0gbmV3IE5lZ2F0aXZlRW51bU1lc3NhZ2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBWYWx1ZSA9IE5lZ2F0aXZlRW51bS5NaW51c09uZSwKLSAgICAgICAgICAgICAgICBWYWx1ZXMgPSB7IE5lZ2F0aXZlRW51bS5aZXJvLCBOZWdhdGl2ZUVudW0uTWludXNPbmUsIE5lZ2F0aXZlRW51bS5GaXZlQmVsb3cgfSwKLSAgICAgICAgICAgICAgICBQYWNrZWRWYWx1ZXMgPSB7IE5lZ2F0aXZlRW51bS5aZXJvLCBOZWdhdGl2ZUVudW0uTWludXNPbmUsIE5lZ2F0aXZlRW51bS5GaXZlQmVsb3cgfQotICAgICAgICAgICAgfTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDU4LCBtc2cuQ2FsY3VsYXRlU2l6ZSgpKTsKLQotICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbNThdOwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKGJ5dGVzKTsKLQotICAgICAgICAgICAgbXNnLldyaXRlVG8ob3V0cHV0KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwLCBvdXRwdXQuU3BhY2VMZWZ0KTsKLQotICAgICAgICAgICAgTmVnYXRpdmVFbnVtTWVzc2FnZSBjb3B5ID0gTmVnYXRpdmVFbnVtTWVzc2FnZS5QYXJzZXIuUGFyc2VGcm9tKGJ5dGVzKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtc2csIGNvcHkpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9UZXN0UHJvdG9zL0ZvcmVpZ25NZXNzYWdlUGFydGlhbC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Gb3JlaWduTWVzc2FnZVBhcnRpYWwuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2NjNhNjkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9UZXN0UHJvdG9zL0ZvcmVpZ25NZXNzYWdlUGFydGlhbC5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvcwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBtZXNzYWdlIHdpdGggY3VzdG9tIGRpYWdub3N0aWNzICh0byB0ZXN0IHRoYXQgdGhleSB3b3JrKS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIEZvcmVpZ25NZXNzYWdlIDogSUN1c3RvbURpYWdub3N0aWNNZXNzYWdlCi0gICAgewotICAgICAgICBwdWJsaWMgc3RyaW5nIFRvRGlhZ25vc3RpY1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAkInt7IFwiY1wiOiB7Q30sIFwiQGNJbkhleFwiOiBcIntDOnh9XCIgfX0iOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9UZXN0UHJvdG9zL01hcFVuaXR0ZXN0UHJvdG8zLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9UZXN0UHJvdG9zL01hcFVuaXR0ZXN0UHJvdG8zLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmE0YTJiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9NYXBVbml0dGVzdFByb3RvMy5jcworKysgL2Rldi9udWxsCkBAIC0xLDE0NzEgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdF9wcm90bzMucHJvdG8KLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEKLSNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotdXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1ZjsKLXVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zOwotdXNpbmcgcGJyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MgewotCi0gIC8vLyA8c3VtbWFyeT5Ib2xkZXIgZm9yIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGZyb20gZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdF9wcm90bzMucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBNYXBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdF9wcm90bzMucHJvdG88L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgc3RhdGljIE1hcFVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNpbG5iMjluYkdVdmNISnZkRzlpZFdZdmJXRndYM1Z1YVhSMFpYTjBYM0J5YjNSdk15NXdjbTkwYnhJUiIsCi0gICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1FhSldkdmIyZHNaUzl3Y205MGIySjFaaTkxYm1sMGRHVnpkRjl3IiwKLSAgICAgICAgICAgICJjbTkwYnpNdWNISnZkRzhpbGhJS0IxUmxjM1JOWVhBU1Jnb1BiV0Z3WDJsdWRETXlYMmx1ZERNeUdBRWciLAotICAgICAgICAgICAgIkF5Z0xNaTB1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFMWhjQzVOWVhCSmJuUXpNa2x1ZERNeSIsCi0gICAgICAgICAgICAiUlc1MGNua1NSZ29QYldGd1gybHVkRFkwWDJsdWREWTBHQUlnQXlnTE1pMHVjSEp2ZEc5aWRXWmZkVzVwIiwKLSAgICAgICAgICAgICJkSFJsYzNRdVZHVnpkRTFoY0M1TllYQkpiblEyTkVsdWREWTBSVzUwY25rU1Nnb1JiV0Z3WDNWcGJuUXoiLAotICAgICAgICAgICAgIk1sOTFhVzUwTXpJWUF5QURLQXN5THk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBUV0Z3TGsxaCIsCi0gICAgICAgICAgICAiY0ZWcGJuUXpNbFZwYm5Rek1rVnVkSEo1RWtvS0VXMWhjRjkxYVc1ME5qUmZkV2x1ZERZMEdBUWdBeWdMIiwKLSAgICAgICAgICAgICJNaTh1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFMWhjQzVOWVhCVmFXNTBOalJWYVc1ME5qUkYiLAotICAgICAgICAgICAgImJuUnllUkpLQ2hGdFlYQmZjMmx1ZERNeVgzTnBiblF6TWhnRklBTW9Dekl2TG5CeWIzUnZZblZtWDNWdSIsCi0gICAgICAgICAgICAiYVhSMFpYTjBMbFJsYzNSTllYQXVUV0Z3VTJsdWRETXlVMmx1ZERNeVJXNTBjbmtTU2dvUmJXRndYM05wIiwKLSAgICAgICAgICAgICJiblEyTkY5emFXNTBOalFZQmlBREtBc3lMeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFRXRnciLAotICAgICAgICAgICAgIkxrMWhjRk5wYm5RMk5GTnBiblEyTkVWdWRISjVFazRLRTIxaGNGOW1hWGhsWkRNeVgyWnBlR1ZrTXpJWSIsCi0gICAgICAgICAgICAiQnlBREtBc3lNUzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFRXRndMazFoY0VacGVHVmtNekpHIiwKLSAgICAgICAgICAgICJhWGhsWkRNeVJXNTBjbmtTVGdvVGJXRndYMlpwZUdWa05qUmZabWw0WldRMk5CZ0lJQU1vQ3pJeExuQnkiLAotICAgICAgICAgICAgImIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbGMzUk5ZWEF1VFdGd1JtbDRaV1EyTkVacGVHVmtOalJGYm5SeSIsCi0gICAgICAgICAgICAiZVJKU0NoVnRZWEJmYzJacGVHVmtNekpmYzJacGVHVmtNeklZQ1NBREtBc3lNeTV3Y205MGIySjFabDkxIiwKLSAgICAgICAgICAgICJibWwwZEdWemRDNVVaWE4wVFdGd0xrMWhjRk5tYVhobFpETXlVMlpwZUdWa016SkZiblJ5ZVJKU0NoVnQiLAotICAgICAgICAgICAgIllYQmZjMlpwZUdWa05qUmZjMlpwZUdWa05qUVlDaUFES0FzeU15NXdjbTkwYjJKMVpsOTFibWwwZEdWeiIsCi0gICAgICAgICAgICAiZEM1VVpYTjBUV0Z3TGsxaGNGTm1hWGhsWkRZMFUyWnBlR1ZrTmpSRmJuUnllUkpHQ2c5dFlYQmZhVzUwIiwKLSAgICAgICAgICAgICJNekpmWm14dllYUVlDeUFES0FzeUxTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVFdGd0xrMWgiLAotICAgICAgICAgICAgImNFbHVkRE15Um14dllYUkZiblJ5ZVJKSUNoQnRZWEJmYVc1ME16SmZaRzkxWW14bEdBd2dBeWdMTWk0dSIsCi0gICAgICAgICAgICAiY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFMWhjQzVOWVhCSmJuUXpNa1J2ZFdKc1pVVnVkSEo1IiwKLSAgICAgICAgICAgICJFa0lLRFcxaGNGOWliMjlzWDJKdmIyd1lEU0FES0FzeUt5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVUiLAotICAgICAgICAgICAgIlpYTjBUV0Z3TGsxaGNFSnZiMnhDYjI5c1JXNTBjbmtTU2dvUmJXRndYM04wY21sdVoxOXpkSEpwYm1jWSIsCi0gICAgICAgICAgICAiRGlBREtBc3lMeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFRXRndMazFoY0ZOMGNtbHVaMU4wIiwKLSAgICAgICAgICAgICJjbWx1WjBWdWRISjVFa1lLRDIxaGNGOXBiblF6TWw5aWVYUmxjeGdQSUFNb0N6SXRMbkJ5YjNSdlluVm0iLAotICAgICAgICAgICAgIlgzVnVhWFIwWlhOMExsUmxjM1JOWVhBdVRXRndTVzUwTXpKQ2VYUmxjMFZ1ZEhKNUVrUUtEbTFoY0Y5cCIsCi0gICAgICAgICAgICAiYm5Rek1sOWxiblZ0R0JBZ0F5Z0xNaXd1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFMWhjQzVOIiwKLSAgICAgICAgICAgICJZWEJKYm5Rek1rVnVkVzFGYm5SeWVSSlpDaGx0WVhCZmFXNTBNekpmWm05eVpXbG5ibDl0WlhOellXZGwiLAotICAgICAgICAgICAgIkdCRWdBeWdMTWpZdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRTFoY0M1TllYQkpiblF6TWtadiIsCi0gICAgICAgICAgICAiY21WcFoyNU5aWE56WVdkbFJXNTBjbmthTkFvU1RXRndTVzUwTXpKSmJuUXpNa1Z1ZEhKNUVnc0tBMnRsIiwKLSAgICAgICAgICAgICJlUmdCSUFFb0JSSU5DZ1YyWVd4MVpSZ0NJQUVvQlRvQ09BRWFOQW9TVFdGd1NXNTBOalJKYm5RMk5FVnUiLAotICAgICAgICAgICAgImRISjVFZ3NLQTJ0bGVSZ0JJQUVvQXhJTkNnVjJZV3gxWlJnQ0lBRW9Bem9DT0FFYU5nb1VUV0Z3VldsdSIsCi0gICAgICAgICAgICAiZERNeVZXbHVkRE15Ulc1MGNua1NDd29EYTJWNUdBRWdBU2dORWcwS0JYWmhiSFZsR0FJZ0FTZ05PZ0k0IiwKLSAgICAgICAgICAgICJBUm8yQ2hSTllYQlZhVzUwTmpSVmFXNTBOalJGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQVFTRFFvRmRtRnMiLAotICAgICAgICAgICAgImRXVVlBaUFCS0FRNkFqZ0JHallLRkUxaGNGTnBiblF6TWxOcGJuUXpNa1Z1ZEhKNUVnc0tBMnRsZVJnQiIsCi0gICAgICAgICAgICAiSUFFb0VSSU5DZ1YyWVd4MVpSZ0NJQUVvRVRvQ09BRWFOZ29VVFdGd1UybHVkRFkwVTJsdWREWTBSVzUwIiwKLSAgICAgICAgICAgICJjbmtTQ3dvRGEyVjVHQUVnQVNnU0VnMEtCWFpoYkhWbEdBSWdBU2dTT2dJNEFSbzRDaFpOWVhCR2FYaGwiLAotICAgICAgICAgICAgIlpETXlSbWw0WldRek1rVnVkSEo1RWdzS0EydGxlUmdCSUFFb0J4SU5DZ1YyWVd4MVpSZ0NJQUVvQnpvQyIsCi0gICAgICAgICAgICAiT0FFYU9Bb1dUV0Z3Um1sNFpXUTJORVpwZUdWa05qUkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBWVNEUW9GIiwKLSAgICAgICAgICAgICJkbUZzZFdVWUFpQUJLQVk2QWpnQkdqb0tHRTFoY0ZObWFYaGxaRE15VTJacGVHVmtNekpGYm5SeWVSSUwiLAotICAgICAgICAgICAgIkNnTnJaWGtZQVNBQktBOFNEUW9GZG1Gc2RXVVlBaUFCS0E4NkFqZ0JHam9LR0UxaGNGTm1hWGhsWkRZMCIsCi0gICAgICAgICAgICAiVTJacGVHVmtOalJGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQkFTRFFvRmRtRnNkV1VZQWlBQktCQTZBamdCIiwKLSAgICAgICAgICAgICJHalFLRWsxaGNFbHVkRE15Um14dllYUkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBVVNEUW9GZG1Gc2RXVVkiLAotICAgICAgICAgICAgIkFpQUJLQUk2QWpnQkdqVUtFMDFoY0VsdWRETXlSRzkxWW14bFJXNTBjbmtTQ3dvRGEyVjVHQUVnQVNnRiIsCi0gICAgICAgICAgICAiRWcwS0JYWmhiSFZsR0FJZ0FTZ0JPZ0k0QVJveUNoQk5ZWEJDYjI5c1FtOXZiRVZ1ZEhKNUVnc0tBMnRsIiwKLSAgICAgICAgICAgICJlUmdCSUFFb0NCSU5DZ1YyWVd4MVpSZ0NJQUVvQ0RvQ09BRWFOZ29VVFdGd1UzUnlhVzVuVTNSeWFXNW4iLAotICAgICAgICAgICAgIlJXNTBjbmtTQ3dvRGEyVjVHQUVnQVNnSkVnMEtCWFpoYkhWbEdBSWdBU2dKT2dJNEFSbzBDaEpOWVhCSiIsCi0gICAgICAgICAgICAiYm5Rek1rSjVkR1Z6Ulc1MGNua1NDd29EYTJWNUdBRWdBU2dGRWcwS0JYWmhiSFZsR0FJZ0FTZ01PZ0k0IiwKLSAgICAgICAgICAgICJBUnBQQ2hGTllYQkpiblF6TWtWdWRXMUZiblJ5ZVJJTENnTnJaWGtZQVNBQktBVVNLUW9GZG1Gc2RXVVkiLAotICAgICAgICAgICAgIkFpQUJLQTR5R2k1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1TllYQkZiblZ0T2dJNEFScGdDaHROWVhCSiIsCi0gICAgICAgICAgICAiYm5Rek1rWnZjbVZwWjI1TlpYTnpZV2RsUlc1MGNua1NDd29EYTJWNUdBRWdBU2dGRWpBS0JYWmhiSFZsIiwKLSAgICAgICAgICAgICJHQUlnQVNnTE1pRXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVSbTl5WldsbmJrMWxjM05oWjJVNkFqZ0IiLAotICAgICAgICAgICAgIklrRUtFVlJsYzNSTllYQlRkV0p0WlhOellXZGxFaXdLQ0hSbGMzUmZiV0Z3R0FFZ0FTZ0xNaG91Y0hKdiIsCi0gICAgICAgICAgICAiZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6ZEUxaGNDSzhBUW9PVkdWemRFMWxjM05oWjJWTllYQVNVUW9SIiwKLSAgICAgICAgICAgICJiV0Z3WDJsdWRETXlYMjFsYzNOaFoyVVlBU0FES0FzeU5pNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVUiLAotICAgICAgICAgICAgIlpYTjBUV1Z6YzJGblpVMWhjQzVOWVhCSmJuUXpNazFsYzNOaFoyVkZiblJ5ZVJwWENoUk5ZWEJKYm5ReiIsCi0gICAgICAgICAgICAiTWsxbGMzTmhaMlZGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQVVTTGdvRmRtRnNkV1VZQWlBQktBc3lIeTV3IiwKLSAgICAgICAgICAgICJjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVd4c1ZIbHdaWE02QWpnQkl1TUJDZzlVWlhOMFUyRnQiLAotICAgICAgICAgICAgIlpWUjVjR1ZOWVhBU09nb0ViV0Z3TVJnQklBTW9DeklzTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGxSbCIsCi0gICAgICAgICAgICAiYzNSVFlXMWxWSGx3WlUxaGNDNU5ZWEF4Ulc1MGNua1NPZ29FYldGd01oZ0NJQU1vQ3pJc0xuQnliM1J2IiwKLSAgICAgICAgICAgICJZblZtWDNWdWFYUjBaWE4wTGxSbGMzUlRZVzFsVkhsd1pVMWhjQzVOWVhBeVJXNTBjbmthS3dvSlRXRnciLAotICAgICAgICAgICAgIk1VVnVkSEo1RWdzS0EydGxlUmdCSUFFb0JSSU5DZ1YyWVd4MVpSZ0NJQUVvQlRvQ09BRWFLd29KVFdGdyIsCi0gICAgICAgICAgICAiTWtWdWRISjVFZ3NLQTJ0bGVSZ0JJQUVvQlJJTkNnVjJZV3gxWlJnQ0lBRW9CVG9DT0FFaTVCQUtERlJsIiwKLSAgICAgICAgICAgICJjM1JCY21WdVlVMWhjQkpMQ2c5dFlYQmZhVzUwTXpKZmFXNTBNeklZQVNBREtBc3lNaTV3Y205MGIySjEiLAotICAgICAgICAgICAgIlpsOTFibWwwZEdWemRDNVVaWE4wUVhKbGJtRk5ZWEF1VFdGd1NXNTBNekpKYm5Rek1rVnVkSEo1RWtzSyIsCi0gICAgICAgICAgICAiRDIxaGNGOXBiblEyTkY5cGJuUTJOQmdDSUFNb0N6SXlMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsIiwKLSAgICAgICAgICAgICJjM1JCY21WdVlVMWhjQzVOWVhCSmJuUTJORWx1ZERZMFJXNTBjbmtTVHdvUmJXRndYM1ZwYm5Rek1sOTEiLAotICAgICAgICAgICAgImFXNTBNeklZQXlBREtBc3lOQzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFYSmxibUZOWVhBdSIsCi0gICAgICAgICAgICAiVFdGd1ZXbHVkRE15VldsdWRETXlSVzUwY25rU1R3b1JiV0Z3WDNWcGJuUTJORjkxYVc1ME5qUVlCQ0FEIiwKLSAgICAgICAgICAgICJLQXN5TkM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1VVpYTjBRWEpsYm1GTllYQXVUV0Z3VldsdWREWTAiLAotICAgICAgICAgICAgIlZXbHVkRFkwUlc1MGNua1NUd29SYldGd1gzTnBiblF6TWw5emFXNTBNeklZQlNBREtBc3lOQzV3Y205MCIsCi0gICAgICAgICAgICAiYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVhKbGJtRk5ZWEF1VFdGd1UybHVkRE15VTJsdWRETXlSVzUwIiwKLSAgICAgICAgICAgICJjbmtTVHdvUmJXRndYM05wYm5RMk5GOXphVzUwTmpRWUJpQURLQXN5TkM1d2NtOTBiMkoxWmw5MWJtbDAiLAotICAgICAgICAgICAgImRHVnpkQzVVWlhOMFFYSmxibUZOWVhBdVRXRndVMmx1ZERZMFUybHVkRFkwUlc1MGNua1NVd29UYldGdyIsCi0gICAgICAgICAgICAiWDJacGVHVmtNekpmWm1sNFpXUXpNaGdISUFNb0N6STJMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsIiwKLSAgICAgICAgICAgICJjM1JCY21WdVlVMWhjQzVOWVhCR2FYaGxaRE15Um1sNFpXUXpNa1Z1ZEhKNUVsTUtFMjFoY0Y5bWFYaGwiLAotICAgICAgICAgICAgIlpEWTBYMlpwZUdWa05qUVlDQ0FES0FzeU5pNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVhKbCIsCi0gICAgICAgICAgICAiYm1GTllYQXVUV0Z3Um1sNFpXUTJORVpwZUdWa05qUkZiblJ5ZVJKWENoVnRZWEJmYzJacGVHVmtNekpmIiwKLSAgICAgICAgICAgICJjMlpwZUdWa016SVlDU0FES0FzeU9DNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wUVhKbGJtRk4iLAotICAgICAgICAgICAgIllYQXVUV0Z3VTJacGVHVmtNekpUWm1sNFpXUXpNa1Z1ZEhKNUVsY0tGVzFoY0Y5elptbDRaV1EyTkY5eiIsCi0gICAgICAgICAgICAiWm1sNFpXUTJOQmdLSUFNb0N6STRMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMbFJsYzNSQmNtVnVZVTFoIiwKLSAgICAgICAgICAgICJjQzVOWVhCVFptbDRaV1EyTkZObWFYaGxaRFkwUlc1MGNua1NTd29QYldGd1gybHVkRE15WDJac2IyRjAiLAotICAgICAgICAgICAgIkdBc2dBeWdMTWpJdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZ5Wlc1aFRXRndMazFoY0VsdSIsCi0gICAgICAgICAgICAiZERNeVJteHZZWFJGYm5SeWVSSk5DaEJ0WVhCZmFXNTBNekpmWkc5MVlteGxHQXdnQXlnTE1qTXVjSEp2IiwKLSAgICAgICAgICAgICJkRzlpZFdaZmRXNXBkSFJsYzNRdVZHVnpkRUZ5Wlc1aFRXRndMazFoY0VsdWRETXlSRzkxWW14bFJXNTAiLAotICAgICAgICAgICAgImNua1NSd29OYldGd1gySnZiMnhmWW05dmJCZ05JQU1vQ3pJd0xuQnliM1J2WW5WbVgzVnVhWFIwWlhOMCIsCi0gICAgICAgICAgICAiTGxSbGMzUkJjbVZ1WVUxaGNDNU5ZWEJDYjI5c1FtOXZiRVZ1ZEhKNUVra0tEbTFoY0Y5cGJuUXpNbDlsIiwKLSAgICAgICAgICAgICJiblZ0R0E0Z0F5Z0xNakV1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnlaVzVoVFdGd0xrMWgiLAotICAgICAgICAgICAgImNFbHVkRE15Ulc1MWJVVnVkSEo1RWw0S0dXMWhjRjlwYm5Rek1sOW1iM0psYVdkdVgyMWxjM05oWjJVWSIsCi0gICAgICAgICAgICAiRHlBREtBc3lPeTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFYSmxibUZOWVhBdVRXRndTVzUwIiwKLSAgICAgICAgICAgICJNekpHYjNKbGFXZHVUV1Z6YzJGblpVVnVkSEo1R2pRS0VrMWhjRWx1ZERNeVNXNTBNekpGYm5SeWVSSUwiLAotICAgICAgICAgICAgIkNnTnJaWGtZQVNBQktBVVNEUW9GZG1Gc2RXVVlBaUFCS0FVNkFqZ0JHalFLRWsxaGNFbHVkRFkwU1c1MCIsCi0gICAgICAgICAgICAiTmpSRmJuUnllUklMQ2dOclpYa1lBU0FCS0FNU0RRb0ZkbUZzZFdVWUFpQUJLQU02QWpnQkdqWUtGRTFoIiwKLSAgICAgICAgICAgICJjRlZwYm5Rek1sVnBiblF6TWtWdWRISjVFZ3NLQTJ0bGVSZ0JJQUVvRFJJTkNnVjJZV3gxWlJnQ0lBRW8iLAotICAgICAgICAgICAgIkRUb0NPQUVhTmdvVVRXRndWV2x1ZERZMFZXbHVkRFkwUlc1MGNua1NDd29EYTJWNUdBRWdBU2dFRWcwSyIsCi0gICAgICAgICAgICAiQlhaaGJIVmxHQUlnQVNnRU9nSTRBUm8yQ2hSTllYQlRhVzUwTXpKVGFXNTBNekpGYm5SeWVSSUxDZ05yIiwKLSAgICAgICAgICAgICJaWGtZQVNBQktCRVNEUW9GZG1Gc2RXVVlBaUFCS0JFNkFqZ0JHallLRkUxaGNGTnBiblEyTkZOcGJuUTIiLAotICAgICAgICAgICAgIk5FVnVkSEo1RWdzS0EydGxlUmdCSUFFb0VoSU5DZ1YyWVd4MVpSZ0NJQUVvRWpvQ09BRWFPQW9XVFdGdyIsCi0gICAgICAgICAgICAiUm1sNFpXUXpNa1pwZUdWa016SkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBY1NEUW9GZG1Gc2RXVVlBaUFCIiwKLSAgICAgICAgICAgICJLQWM2QWpnQkdqZ0tGazFoY0VacGVHVmtOalJHYVhobFpEWTBSVzUwY25rU0N3b0RhMlY1R0FFZ0FTZ0ciLAotICAgICAgICAgICAgIkVnMEtCWFpoYkhWbEdBSWdBU2dHT2dJNEFSbzZDaGhOWVhCVFptbDRaV1F6TWxObWFYaGxaRE15Ulc1MCIsCi0gICAgICAgICAgICAiY25rU0N3b0RhMlY1R0FFZ0FTZ1BFZzBLQlhaaGJIVmxHQUlnQVNnUE9nSTRBUm82Q2hoTllYQlRabWw0IiwKLSAgICAgICAgICAgICJaV1EyTkZObWFYaGxaRFkwUlc1MGNua1NDd29EYTJWNUdBRWdBU2dRRWcwS0JYWmhiSFZsR0FJZ0FTZ1EiLAotICAgICAgICAgICAgIk9nSTRBUm8wQ2hKTllYQkpiblF6TWtac2IyRjBSVzUwY25rU0N3b0RhMlY1R0FFZ0FTZ0ZFZzBLQlhaaCIsCi0gICAgICAgICAgICAiYkhWbEdBSWdBU2dDT2dJNEFSbzFDaE5OWVhCSmJuUXpNa1J2ZFdKc1pVVnVkSEo1RWdzS0EydGxlUmdCIiwKLSAgICAgICAgICAgICJJQUVvQlJJTkNnVjJZV3gxWlJnQ0lBRW9BVG9DT0FFYU1nb1FUV0Z3UW05dmJFSnZiMnhGYm5SeWVSSUwiLAotICAgICAgICAgICAgIkNnTnJaWGtZQVNBQktBZ1NEUW9GZG1Gc2RXVVlBaUFCS0FnNkFqZ0JHazhLRVUxaGNFbHVkRE15Ulc1MSIsCi0gICAgICAgICAgICAiYlVWdWRISjVFZ3NLQTJ0bGVSZ0JJQUVvQlJJcENnVjJZV3gxWlJnQ0lBRW9EaklhTG5CeWIzUnZZblZtIiwKLSAgICAgICAgICAgICJYM1Z1YVhSMFpYTjBMazFoY0VWdWRXMDZBamdCR21BS0cwMWhjRWx1ZERNeVJtOXlaV2xuYmsxbGMzTmgiLAotICAgICAgICAgICAgIloyVkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBVVNNQW9GZG1Gc2RXVVlBaUFCS0FzeUlTNXdjbTkwYjJKMSIsCi0gICAgICAgICAgICAiWmw5MWJtbDBkR1Z6ZEM1R2IzSmxhV2R1VFdWemMyRm5aVG9DT0FFaTVBRUtIMDFsYzNOaFoyVkRiMjUwIiwKLSAgICAgICAgICAgICJZV2x1YVc1blJXNTFiVU5oYkd4bFpGUjVjR1VTU2dvRWRIbHdaUmdCSUFNb0N6SThMbkJ5YjNSdlluVm0iLAotICAgICAgICAgICAgIlgzVnVhWFIwWlhOMExrMWxjM05oWjJWRGIyNTBZV2x1YVc1blJXNTFiVU5oYkd4bFpGUjVjR1V1VkhsdyIsCi0gICAgICAgICAgICAiWlVWdWRISjVHbDhLQ1ZSNWNHVkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBVVNRUW9GZG1Gc2RXVVlBaUFCIiwKLSAgICAgICAgICAgICJLQXN5TWk1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1TlpYTnpZV2RsUTI5dWRHRnBibWx1WjBWdWRXMUQiLAotICAgICAgICAgICAgIllXeHNaV1JVZVhCbE9nSTRBU0lVQ2dSVWVYQmxFZ3dLQ0ZSWlVFVmZSazlQRUFBaW5RRUtIMDFsYzNOaCIsCi0gICAgICAgICAgICAiWjJWRGIyNTBZV2x1YVc1blRXRndRMkZzYkdWa1JXNTBjbmtTVEFvRlpXNTBjbmtZQVNBREtBc3lQUzV3IiwKLSAgICAgICAgICAgICJjbTkwYjJKMVpsOTFibWwwZEdWemRDNU5aWE56WVdkbFEyOXVkR0ZwYm1sdVowMWhjRU5oYkd4bFpFVnUiLAotICAgICAgICAgICAgImRISjVMa1Z1ZEhKNVJXNTBjbmthTEFvS1JXNTBjbmxGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQVVTRFFvRiIsCi0gICAgICAgICAgICAiZG1Gc2RXVVlBaUFCS0FVNkFqZ0JLajhLQjAxaGNFVnVkVzBTRUFvTVRVRlFYMFZPVlUxZlJrOVBFQUFTIiwKLSAgICAgICAgICAgICJFQW9NVFVGUVgwVk9WVTFmUWtGU0VBRVNFQW9NVFVGUVgwVk9WVTFmUWtGYUVBSkNJUGdCQWFvQ0drZHYiLAotICAgICAgICAgICAgImIyZHNaUzVRY205MGIySjFaaTVVWlhOMFVISnZkRzl6WWdad2NtOTBiek09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obmV3W10ge3R5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1hcEVudW0pLCB9LCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNYXApLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNYXAuUGFyc2VyLCBuZXdbXXsgIk1hcEludDMySW50MzIiLCAiTWFwSW50NjRJbnQ2NCIsICJNYXBVaW50MzJVaW50MzIiLCAiTWFwVWludDY0VWludDY0IiwgIk1hcFNpbnQzMlNpbnQzMiIsICJNYXBTaW50NjRTaW50NjQiLCAiTWFwRml4ZWQzMkZpeGVkMzIiLCAiTWFwRml4ZWQ2NEZpeGVkNjQiLCAiTWFwU2ZpeGVkMzJTZml4ZWQzMiIsICJNYXBTZml4ZWQ2NFNmaXhlZDY0IiwgIk1hcEludDMyRmxvYXQiLCAiTWFwSW50MzJEb3VibGUiLCAiTWFwQm9vbEJvb2wiLCAiTWFwU3RyaW5nU3RyaW5nIiwgIk1hcEludDMyQnl0ZXMiLCAiTWFwSW50MzJFbnVtIiwgIk1hcEludDMyRm9yZWlnbk1lc3NhZ2UiIH0sIG51bGwsIG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB9KSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNYXBTdWJtZXNzYWdlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0TWFwU3VibWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiVGVzdE1hcCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0TWVzc2FnZU1hcCksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdE1lc3NhZ2VNYXAuUGFyc2VyLCBuZXdbXXsgIk1hcEludDMyTWVzc2FnZSIgfSwgbnVsbCwgbnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7IG51bGwsIH0pLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdFNhbWVUeXBlTWFwKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0U2FtZVR5cGVNYXAuUGFyc2VyLCBuZXdbXXsgIk1hcDEiLCAiTWFwMiIgfSwgbnVsbCwgbnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7IG51bGwsIG51bGwsIH0pLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFyZW5hTWFwKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QXJlbmFNYXAuUGFyc2VyLCBuZXdbXXsgIk1hcEludDMySW50MzIiLCAiTWFwSW50NjRJbnQ2NCIsICJNYXBVaW50MzJVaW50MzIiLCAiTWFwVWludDY0VWludDY0IiwgIk1hcFNpbnQzMlNpbnQzMiIsICJNYXBTaW50NjRTaW50NjQiLCAiTWFwRml4ZWQzMkZpeGVkMzIiLCAiTWFwRml4ZWQ2NEZpeGVkNjQiLCAiTWFwU2ZpeGVkMzJTZml4ZWQzMiIsICJNYXBTZml4ZWQ2NFNmaXhlZDY0IiwgIk1hcEludDMyRmxvYXQiLCAiTWFwSW50MzJEb3VibGUiLCAiTWFwQm9vbEJvb2wiLCAiTWFwSW50MzJFbnVtIiwgIk1hcEludDMyRm9yZWlnbk1lc3NhZ2UiIH0sIG51bGwsIG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB9KSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUuUGFyc2VyLCBuZXdbXXsgIlR5cGUiIH0sIG51bGwsIG5ld1tdeyB0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlLlR5cGVzLlR5cGUpIH0sIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBudWxsLCB9KSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkuUGFyc2VyLCBuZXdbXXsgIkVudHJ5IiB9LCBudWxsLCBudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsgbnVsbCwgfSkKLSAgICAgICAgICB9KSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0gICNyZWdpb24gRW51bXMKLSAgcHVibGljIGVudW0gTWFwRW51bSB7Ci0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJNQVBfRU5VTV9GT08iKV0gRm9vID0gMCwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIk1BUF9FTlVNX0JBUiIpXSBCYXIgPSAxLAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiTUFQX0VOVU1fQkFaIildIEJheiA9IDIsCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgVGVzdHMgbWFwcy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNYXAgOiBwYjo6SU1lc3NhZ2U8VGVzdE1hcD4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RNYXA+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE1hcD4oKCkgPT4gbmV3IFRlc3RNYXAoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0TWFwPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNYXAoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3RNYXAoVGVzdE1hcCBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbWFwSW50MzJJbnQzMl8gPSBvdGhlci5tYXBJbnQzMkludDMyXy5DbG9uZSgpOwotICAgICAgbWFwSW50NjRJbnQ2NF8gPSBvdGhlci5tYXBJbnQ2NEludDY0Xy5DbG9uZSgpOwotICAgICAgbWFwVWludDMyVWludDMyXyA9IG90aGVyLm1hcFVpbnQzMlVpbnQzMl8uQ2xvbmUoKTsKLSAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8gPSBvdGhlci5tYXBVaW50NjRVaW50NjRfLkNsb25lKCk7Ci0gICAgICBtYXBTaW50MzJTaW50MzJfID0gb3RoZXIubWFwU2ludDMyU2ludDMyXy5DbG9uZSgpOwotICAgICAgbWFwU2ludDY0U2ludDY0XyA9IG90aGVyLm1hcFNpbnQ2NFNpbnQ2NF8uQ2xvbmUoKTsKLSAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXyA9IG90aGVyLm1hcEZpeGVkMzJGaXhlZDMyXy5DbG9uZSgpOwotICAgICAgbWFwRml4ZWQ2NEZpeGVkNjRfID0gb3RoZXIubWFwRml4ZWQ2NEZpeGVkNjRfLkNsb25lKCk7Ci0gICAgICBtYXBTZml4ZWQzMlNmaXhlZDMyXyA9IG90aGVyLm1hcFNmaXhlZDMyU2ZpeGVkMzJfLkNsb25lKCk7Ci0gICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0XyA9IG90aGVyLm1hcFNmaXhlZDY0U2ZpeGVkNjRfLkNsb25lKCk7Ci0gICAgICBtYXBJbnQzMkZsb2F0XyA9IG90aGVyLm1hcEludDMyRmxvYXRfLkNsb25lKCk7Ci0gICAgICBtYXBJbnQzMkRvdWJsZV8gPSBvdGhlci5tYXBJbnQzMkRvdWJsZV8uQ2xvbmUoKTsKLSAgICAgIG1hcEJvb2xCb29sXyA9IG90aGVyLm1hcEJvb2xCb29sXy5DbG9uZSgpOwotICAgICAgbWFwU3RyaW5nU3RyaW5nXyA9IG90aGVyLm1hcFN0cmluZ1N0cmluZ18uQ2xvbmUoKTsKLSAgICAgIG1hcEludDMyQnl0ZXNfID0gb3RoZXIubWFwSW50MzJCeXRlc18uQ2xvbmUoKTsKLSAgICAgIG1hcEludDMyRW51bV8gPSBvdGhlci5tYXBJbnQzMkVudW1fLkNsb25lKCk7Ci0gICAgICBtYXBJbnQzMkZvcmVpZ25NZXNzYWdlXyA9IG90aGVyLm1hcEludDMyRm9yZWlnbk1lc3NhZ2VfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNYXAgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RNYXAodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50MzJfaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDMySW50MzJGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMgX21hcF9tYXBJbnQzMkludDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMigxNiksIDEwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IG1hcEludDMySW50MzJfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IE1hcEludDMySW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMySW50MzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50NjRfaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDY0SW50NjRGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyBfbWFwX21hcEludDY0SW50NjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQ2NCg4KSwgcGI6OkZpZWxkQ29kZWMuRm9ySW50NjQoMTYpLCAxOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IG1hcEludDY0SW50NjRfID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPiBNYXBJbnQ2NEludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBJbnQ2NEludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3VpbnQzMl91aW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFVpbnQzMlVpbnQzMkZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+LkNvZGVjIF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yVUludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JVSW50MzIoMTYpLCAyNik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+IG1hcFVpbnQzMlVpbnQzMl8gPSBuZXcgcGJjOjpNYXBGaWVsZDx1aW50LCB1aW50PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+IE1hcFVpbnQzMlVpbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwVWludDMyVWludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3VpbnQ2NF91aW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFVpbnQ2NFVpbnQ2NEZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVsb25nLCB1bG9uZz4uQ29kZWMgX21hcF9tYXBVaW50NjRVaW50NjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvclVJbnQ2NCg4KSwgcGI6OkZpZWxkQ29kZWMuRm9yVUludDY0KDE2KSwgMzQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+IG1hcFVpbnQ2NFVpbnQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPiBNYXBVaW50NjRVaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFVpbnQ2NFVpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9zaW50MzJfc2ludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBTaW50MzJTaW50MzJGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMgX21hcF9tYXBTaW50MzJTaW50MzJfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU0ludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JTSW50MzIoMTYpLCA0Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgaW50PiBtYXBTaW50MzJTaW50MzJfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IE1hcFNpbnQzMlNpbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwU2ludDMyU2ludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3NpbnQ2NF9zaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFNpbnQ2NFNpbnQ2NEZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+LkNvZGVjIF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU0ludDY0KDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JTSW50NjQoMTYpLCA1MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IG1hcFNpbnQ2NFNpbnQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IE1hcFNpbnQ2NFNpbnQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwU2ludDY0U2ludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ZpeGVkMzJfZml4ZWQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwRml4ZWQzMkZpeGVkMzJGaWVsZE51bWJlciA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1aW50LCB1aW50Pi5Db2RlYyBfbWFwX21hcEZpeGVkMzJGaXhlZDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQzMigxMyksIHBiOjpGaWVsZENvZGVjLkZvckZpeGVkMzIoMjEpLCA1OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+IG1hcEZpeGVkMzJGaXhlZDMyXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4gTWFwRml4ZWQzMkZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEZpeGVkMzJGaXhlZDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ZpeGVkNjRfZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwRml4ZWQ2NEZpeGVkNjRGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+LkNvZGVjIF9tYXBfbWFwRml4ZWQ2NEZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckZpeGVkNjQoOSksIHBiOjpGaWVsZENvZGVjLkZvckZpeGVkNjQoMTcpLCA2Nik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVsb25nLCB1bG9uZz4gbWFwRml4ZWQ2NEZpeGVkNjRfID0gbmV3IHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPHVsb25nLCB1bG9uZz4gTWFwRml4ZWQ2NEZpeGVkNjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEZpeGVkNjRGaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3NmaXhlZDMyX3NmaXhlZDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBTZml4ZWQzMlNmaXhlZDMyRmllbGROdW1iZXIgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjIF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQzMigxMyksIHBiOjpGaWVsZENvZGVjLkZvclNGaXhlZDMyKDIxKSwgNzQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4gbWFwU2ZpeGVkMzJTZml4ZWQzMl8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4gTWFwU2ZpeGVkMzJTZml4ZWQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwU2ZpeGVkMzJTZml4ZWQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwU2ZpeGVkNjRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyBfbWFwX21hcFNmaXhlZDY0U2ZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQ2NCg5KSwgcGI6OkZpZWxkQ29kZWMuRm9yU0ZpeGVkNjQoMTcpLCA4Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IG1hcFNmaXhlZDY0U2ZpeGVkNjRfID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPiBNYXBTZml4ZWQ2NFNmaXhlZDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBTZml4ZWQ2NFNmaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ludDMyX2Zsb2F0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBJbnQzMkZsb2F0RmllbGROdW1iZXIgPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ+LkNvZGVjIF9tYXBfbWFwSW50MzJGbG9hdF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JGbG9hdCgyMSksIDkwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBmbG9hdD4gbWFwSW50MzJGbG9hdF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGZsb2F0PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ+IE1hcEludDMyRmxvYXQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMyRmxvYXRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50MzJfZG91YmxlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBJbnQzMkRvdWJsZUZpZWxkTnVtYmVyID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGRvdWJsZT4uQ29kZWMgX21hcF9tYXBJbnQzMkRvdWJsZV9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZG91YmxlPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yRG91YmxlKDE3KSwgOTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGRvdWJsZT4gbWFwSW50MzJEb3VibGVfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBkb3VibGU+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBkb3VibGU+IE1hcEludDMyRG91YmxlIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBJbnQzMkRvdWJsZV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9ib29sX2Jvb2wiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEJvb2xCb29sRmllbGROdW1iZXIgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGJvb2wsIGJvb2w+LkNvZGVjIF9tYXBfbWFwQm9vbEJvb2xfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxib29sLCBib29sPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JCb29sKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JCb29sKDE2KSwgMTA2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8Ym9vbCwgYm9vbD4gbWFwQm9vbEJvb2xfID0gbmV3IHBiYzo6TWFwRmllbGQ8Ym9vbCwgYm9vbD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxib29sLCBib29sPiBNYXBCb29sQm9vbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwQm9vbEJvb2xfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfc3RyaW5nX3N0cmluZyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwU3RyaW5nU3RyaW5nRmllbGROdW1iZXIgPSAxNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHN0cmluZywgc3RyaW5nPi5Db2RlYyBfbWFwX21hcFN0cmluZ1N0cmluZ19jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgc3RyaW5nPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTdHJpbmcoMTApLCBwYjo6RmllbGRDb2RlYy5Gb3JTdHJpbmcoMTgpLCAxMTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIHN0cmluZz4gbWFwU3RyaW5nU3RyaW5nXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgc3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPHN0cmluZywgc3RyaW5nPiBNYXBTdHJpbmdTdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFN0cmluZ1N0cmluZ187IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9pbnQzMl9ieXRlcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwSW50MzJCeXRlc0ZpZWxkTnVtYmVyID0gMTU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIHBiOjpCeXRlU3RyaW5nPi5Db2RlYyBfbWFwX21hcEludDMyQnl0ZXNfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIHBiOjpCeXRlU3RyaW5nPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yQnl0ZXMoMTgpLCAxMjIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIHBiOjpCeXRlU3RyaW5nPiBtYXBJbnQzMkJ5dGVzXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgcGI6OkJ5dGVTdHJpbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBwYjo6Qnl0ZVN0cmluZz4gTWFwSW50MzJCeXRlcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwSW50MzJCeXRlc187IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9pbnQzMl9lbnVtIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBJbnQzMkVudW1GaWVsZE51bWJlciA9IDE2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1hcEVudW0+LkNvZGVjIF9tYXBfbWFwSW50MzJFbnVtX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1hcEVudW0+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JFbnVtKDE2LCB4ID0+IChpbnQpIHgsIHggPT4gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTWFwRW51bSkgeCksIDEzMCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBFbnVtPiBtYXBJbnQzMkVudW1fID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1hcEVudW0+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1hcEVudW0+IE1hcEludDMyRW51bSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwSW50MzJFbnVtXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwSW50MzJGb3JlaWduTWVzc2FnZUZpZWxkTnVtYmVyID0gMTc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+LkNvZGVjIF9tYXBfbWFwSW50MzJGb3JlaWduTWVzc2FnZV9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuUGFyc2VyKSwgMTM4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiBtYXBJbnQzMkZvcmVpZ25NZXNzYWdlXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IE1hcEludDMyRm9yZWlnbk1lc3NhZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMyRm9yZWlnbk1lc3NhZ2VfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBUZXN0TWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdE1hcCBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoIU1hcEludDMySW50MzIuRXF1YWxzKG90aGVyLk1hcEludDMySW50MzIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEludDY0SW50NjQuRXF1YWxzKG90aGVyLk1hcEludDY0SW50NjQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFVpbnQzMlVpbnQzMi5FcXVhbHMob3RoZXIuTWFwVWludDMyVWludDMyKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBVaW50NjRVaW50NjQuRXF1YWxzKG90aGVyLk1hcFVpbnQ2NFVpbnQ2NCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU2ludDMyU2ludDMyLkVxdWFscyhvdGhlci5NYXBTaW50MzJTaW50MzIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFNpbnQ2NFNpbnQ2NC5FcXVhbHMob3RoZXIuTWFwU2ludDY0U2ludDY0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBGaXhlZDMyRml4ZWQzMi5FcXVhbHMob3RoZXIuTWFwRml4ZWQzMkZpeGVkMzIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEZpeGVkNjRGaXhlZDY0LkVxdWFscyhvdGhlci5NYXBGaXhlZDY0Rml4ZWQ2NCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU2ZpeGVkMzJTZml4ZWQzMi5FcXVhbHMob3RoZXIuTWFwU2ZpeGVkMzJTZml4ZWQzMikpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU2ZpeGVkNjRTZml4ZWQ2NC5FcXVhbHMob3RoZXIuTWFwU2ZpeGVkNjRTZml4ZWQ2NCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwSW50MzJGbG9hdC5FcXVhbHMob3RoZXIuTWFwSW50MzJGbG9hdCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwSW50MzJEb3VibGUuRXF1YWxzKG90aGVyLk1hcEludDMyRG91YmxlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBCb29sQm9vbC5FcXVhbHMob3RoZXIuTWFwQm9vbEJvb2wpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFN0cmluZ1N0cmluZy5FcXVhbHMob3RoZXIuTWFwU3RyaW5nU3RyaW5nKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBJbnQzMkJ5dGVzLkVxdWFscyhvdGhlci5NYXBJbnQzMkJ5dGVzKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBJbnQzMkVudW0uRXF1YWxzKG90aGVyLk1hcEludDMyRW51bSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwSW50MzJGb3JlaWduTWVzc2FnZS5FcXVhbHMob3RoZXIuTWFwSW50MzJGb3JlaWduTWVzc2FnZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IE1hcEludDMySW50MzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwSW50NjRJbnQ2NC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBVaW50MzJVaW50MzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwVWludDY0VWludDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcFNpbnQzMlNpbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBTaW50NjRTaW50NjQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwRml4ZWQzMkZpeGVkMzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwRml4ZWQ2NEZpeGVkNjQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwU2ZpeGVkMzJTZml4ZWQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBTZml4ZWQ2NFNmaXhlZDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEludDMyRmxvYXQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwSW50MzJEb3VibGUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwQm9vbEJvb2wuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwU3RyaW5nU3RyaW5nLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEludDMyQnl0ZXMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwSW50MzJFbnVtLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEludDMyRm9yZWlnbk1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgbWFwSW50MzJJbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwSW50MzJJbnQzMl9jb2RlYyk7Ci0gICAgICBtYXBJbnQ2NEludDY0Xy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBJbnQ2NEludDY0X2NvZGVjKTsKLSAgICAgIG1hcFVpbnQzMlVpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjKTsKLSAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwVWludDY0VWludDY0X2NvZGVjKTsKLSAgICAgIG1hcFNpbnQzMlNpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU2ludDMyU2ludDMyX2NvZGVjKTsKLSAgICAgIG1hcFNpbnQ2NFNpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjKTsKLSAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBGaXhlZDMyRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBtYXBGaXhlZDY0Rml4ZWQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwRml4ZWQ2NEZpeGVkNjRfY29kZWMpOwotICAgICAgbWFwU2ZpeGVkMzJTZml4ZWQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYyk7Ci0gICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0Xy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBTZml4ZWQ2NFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgIG1hcEludDMyRmxvYXRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcEludDMyRmxvYXRfY29kZWMpOwotICAgICAgbWFwSW50MzJEb3VibGVfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcEludDMyRG91YmxlX2NvZGVjKTsKLSAgICAgIG1hcEJvb2xCb29sXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBCb29sQm9vbF9jb2RlYyk7Ci0gICAgICBtYXBTdHJpbmdTdHJpbmdfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcFN0cmluZ1N0cmluZ19jb2RlYyk7Ci0gICAgICBtYXBJbnQzMkJ5dGVzXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBJbnQzMkJ5dGVzX2NvZGVjKTsKLSAgICAgIG1hcEludDMyRW51bV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwSW50MzJFbnVtX2NvZGVjKTsKLSAgICAgIG1hcEludDMyRm9yZWlnbk1lc3NhZ2VfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcEludDMyRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHNpemUgKz0gbWFwSW50MzJJbnQzMl8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEludDMySW50MzJfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBJbnQ2NEludDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwSW50NjRJbnQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFVpbnQzMlVpbnQzMl8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcFVpbnQzMlVpbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFVpbnQ2NFVpbnQ2NF8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcFVpbnQ2NFVpbnQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFNpbnQzMlNpbnQzMl8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcFNpbnQzMlNpbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFNpbnQ2NFNpbnQ2NF8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcFNpbnQ2NFNpbnQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEZpeGVkMzJGaXhlZDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwRml4ZWQzMkZpeGVkMzJfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBGaXhlZDY0Rml4ZWQ2NF8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEZpeGVkNjRGaXhlZDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwU2ZpeGVkMzJTZml4ZWQzMl8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcFNmaXhlZDMyU2ZpeGVkMzJfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBTZml4ZWQ2NFNmaXhlZDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU2ZpeGVkNjRTZml4ZWQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEludDMyRmxvYXRfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBJbnQzMkZsb2F0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwSW50MzJEb3VibGVfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBJbnQzMkRvdWJsZV9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEJvb2xCb29sXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwQm9vbEJvb2xfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBTdHJpbmdTdHJpbmdfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBTdHJpbmdTdHJpbmdfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBJbnQzMkJ5dGVzXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwSW50MzJCeXRlc19jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEludDMyRW51bV8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEludDMyRW51bV9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEludDMyRm9yZWlnbk1lc3NhZ2VfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBJbnQzMkZvcmVpZ25NZXNzYWdlX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0TWFwIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBtYXBJbnQzMkludDMyXy5BZGQob3RoZXIubWFwSW50MzJJbnQzMl8pOwotICAgICAgbWFwSW50NjRJbnQ2NF8uQWRkKG90aGVyLm1hcEludDY0SW50NjRfKTsKLSAgICAgIG1hcFVpbnQzMlVpbnQzMl8uQWRkKG90aGVyLm1hcFVpbnQzMlVpbnQzMl8pOwotICAgICAgbWFwVWludDY0VWludDY0Xy5BZGQob3RoZXIubWFwVWludDY0VWludDY0Xyk7Ci0gICAgICBtYXBTaW50MzJTaW50MzJfLkFkZChvdGhlci5tYXBTaW50MzJTaW50MzJfKTsKLSAgICAgIG1hcFNpbnQ2NFNpbnQ2NF8uQWRkKG90aGVyLm1hcFNpbnQ2NFNpbnQ2NF8pOwotICAgICAgbWFwRml4ZWQzMkZpeGVkMzJfLkFkZChvdGhlci5tYXBGaXhlZDMyRml4ZWQzMl8pOwotICAgICAgbWFwRml4ZWQ2NEZpeGVkNjRfLkFkZChvdGhlci5tYXBGaXhlZDY0Rml4ZWQ2NF8pOwotICAgICAgbWFwU2ZpeGVkMzJTZml4ZWQzMl8uQWRkKG90aGVyLm1hcFNmaXhlZDMyU2ZpeGVkMzJfKTsKLSAgICAgIG1hcFNmaXhlZDY0U2ZpeGVkNjRfLkFkZChvdGhlci5tYXBTZml4ZWQ2NFNmaXhlZDY0Xyk7Ci0gICAgICBtYXBJbnQzMkZsb2F0Xy5BZGQob3RoZXIubWFwSW50MzJGbG9hdF8pOwotICAgICAgbWFwSW50MzJEb3VibGVfLkFkZChvdGhlci5tYXBJbnQzMkRvdWJsZV8pOwotICAgICAgbWFwQm9vbEJvb2xfLkFkZChvdGhlci5tYXBCb29sQm9vbF8pOwotICAgICAgbWFwU3RyaW5nU3RyaW5nXy5BZGQob3RoZXIubWFwU3RyaW5nU3RyaW5nXyk7Ci0gICAgICBtYXBJbnQzMkJ5dGVzXy5BZGQob3RoZXIubWFwSW50MzJCeXRlc18pOwotICAgICAgbWFwSW50MzJFbnVtXy5BZGQob3RoZXIubWFwSW50MzJFbnVtXyk7Ci0gICAgICBtYXBJbnQzMkZvcmVpZ25NZXNzYWdlXy5BZGQob3RoZXIubWFwSW50MzJGb3JlaWduTWVzc2FnZV8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIG1hcEludDMySW50MzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEludDMySW50MzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIG1hcEludDY0SW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEludDY0SW50NjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIG1hcFVpbnQzMlVpbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDM0OiB7Ci0gICAgICAgICAgICBtYXBVaW50NjRVaW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcFVpbnQ2NFVpbnQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MjogewotICAgICAgICAgICAgbWFwU2ludDMyU2ludDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTaW50MzJTaW50MzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTA6IHsKLSAgICAgICAgICAgIG1hcFNpbnQ2NFNpbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDU4OiB7Ci0gICAgICAgICAgICBtYXBGaXhlZDMyRml4ZWQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwRml4ZWQzMkZpeGVkMzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjY6IHsKLSAgICAgICAgICAgIG1hcEZpeGVkNjRGaXhlZDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBGaXhlZDY0Rml4ZWQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NDogewotICAgICAgICAgICAgbWFwU2ZpeGVkMzJTZml4ZWQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MjogewotICAgICAgICAgICAgbWFwU2ZpeGVkNjRTZml4ZWQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwU2ZpeGVkNjRTZml4ZWQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgbWFwSW50MzJGbG9hdF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwSW50MzJGbG9hdF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5ODogewotICAgICAgICAgICAgbWFwSW50MzJEb3VibGVfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEludDMyRG91YmxlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEwNjogewotICAgICAgICAgICAgbWFwQm9vbEJvb2xfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEJvb2xCb29sX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDExNDogewotICAgICAgICAgICAgbWFwU3RyaW5nU3RyaW5nXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTdHJpbmdTdHJpbmdfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTIyOiB7Ci0gICAgICAgICAgICBtYXBJbnQzMkJ5dGVzXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBJbnQzMkJ5dGVzX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEzMDogewotICAgICAgICAgICAgbWFwSW50MzJFbnVtXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBJbnQzMkVudW1fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTM4OiB7Ci0gICAgICAgICAgICBtYXBJbnQzMkZvcmVpZ25NZXNzYWdlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBJbnQzMkZvcmVpZ25NZXNzYWdlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNYXBTdWJtZXNzYWdlIDogcGI6OklNZXNzYWdlPFRlc3RNYXBTdWJtZXNzYWdlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE1hcFN1Ym1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE1hcFN1Ym1lc3NhZ2U+KCgpID0+IG5ldyBUZXN0TWFwU3VibWVzc2FnZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RNYXBTdWJtZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNYXBTdWJtZXNzYWdlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUZXN0TWFwU3VibWVzc2FnZShUZXN0TWFwU3VibWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgVGVzdE1hcCA9IG90aGVyLnRlc3RNYXBfICE9IG51bGwgPyBvdGhlci5UZXN0TWFwLkNsb25lKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0TWFwU3VibWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgVGVzdE1hcFN1Ym1lc3NhZ2UodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ0ZXN0X21hcCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVGVzdE1hcEZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdE1hcCB0ZXN0TWFwXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0TWFwIFRlc3RNYXAgewotICAgICAgZ2V0IHsgcmV0dXJuIHRlc3RNYXBfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB0ZXN0TWFwXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdE1hcFN1Ym1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhUZXN0TWFwU3VibWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoVGVzdE1hcCwgb3RoZXIuVGVzdE1hcCkpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAodGVzdE1hcF8gIT0gbnVsbCkgaGFzaCBePSBUZXN0TWFwLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmICh0ZXN0TWFwXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoVGVzdE1hcCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKHRlc3RNYXBfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShUZXN0TWFwKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0TWFwU3VibWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLnRlc3RNYXBfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHRlc3RNYXBfID09IG51bGwpIHsKLSAgICAgICAgICB0ZXN0TWFwXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNYXAoKTsKLSAgICAgICAgfQotICAgICAgICBUZXN0TWFwLk1lcmdlRnJvbShvdGhlci5UZXN0TWFwKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBpZiAodGVzdE1hcF8gPT0gbnVsbCkgewotICAgICAgICAgICAgICB0ZXN0TWFwXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNYXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHRlc3RNYXBfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNZXNzYWdlTWFwIDogcGI6OklNZXNzYWdlPFRlc3RNZXNzYWdlTWFwPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE1lc3NhZ2VNYXA+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE1lc3NhZ2VNYXA+KCgpID0+IG5ldyBUZXN0TWVzc2FnZU1hcCgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RNZXNzYWdlTWFwPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNZXNzYWdlTWFwKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUZXN0TWVzc2FnZU1hcChUZXN0TWVzc2FnZU1hcCBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbWFwSW50MzJNZXNzYWdlXyA9IG90aGVyLm1hcEludDMyTWVzc2FnZV8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdE1lc3NhZ2VNYXAgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RNZXNzYWdlTWFwKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ludDMyX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDMyTWVzc2FnZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXM+LkNvZGVjIF9tYXBfbWFwSW50MzJNZXNzYWdlX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlBhcnNlciksIDEwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcz4gbWFwSW50MzJNZXNzYWdlXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXM+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcz4gTWFwSW50MzJNZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBJbnQzMk1lc3NhZ2VfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBUZXN0TWVzc2FnZU1hcCk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFRlc3RNZXNzYWdlTWFwIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghTWFwSW50MzJNZXNzYWdlLkVxdWFscyhvdGhlci5NYXBJbnQzMk1lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaGFzaCBePSBNYXBJbnQzMk1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgbWFwSW50MzJNZXNzYWdlXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBJbnQzMk1lc3NhZ2VfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHNpemUgKz0gbWFwSW50MzJNZXNzYWdlXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwSW50MzJNZXNzYWdlX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0TWVzc2FnZU1hcCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbWFwSW50MzJNZXNzYWdlXy5BZGQob3RoZXIubWFwSW50MzJNZXNzYWdlXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgbWFwSW50MzJNZXNzYWdlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBJbnQzMk1lc3NhZ2VfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgVHdvIG1hcCBmaWVsZHMgc2hhcmUgdGhlIHNhbWUgZW50cnkgZGVmYXVsdCBpbnN0YW5jZS4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RTYW1lVHlwZU1hcCA6IHBiOjpJTWVzc2FnZTxUZXN0U2FtZVR5cGVNYXA+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0U2FtZVR5cGVNYXA+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFNhbWVUeXBlTWFwPigoKSA9PiBuZXcgVGVzdFNhbWVUeXBlTWFwKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFNhbWVUeXBlTWFwPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbM107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RTYW1lVHlwZU1hcCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdFNhbWVUeXBlTWFwKFRlc3RTYW1lVHlwZU1hcCBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbWFwMV8gPSBvdGhlci5tYXAxXy5DbG9uZSgpOwotICAgICAgbWFwMl8gPSBvdGhlci5tYXAyXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0U2FtZVR5cGVNYXAgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RTYW1lVHlwZU1hcCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcDEiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcDFGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMgX21hcF9tYXAxX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMigxNiksIDEwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IG1hcDFfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IE1hcDEgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcDFfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXAyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXAyRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjIF9tYXBfbWFwMl9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoMTYpLCAxOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgaW50PiBtYXAyXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgaW50PiBNYXAyIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXAyXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdFNhbWVUeXBlTWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdFNhbWVUeXBlTWFwIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghTWFwMS5FcXVhbHMob3RoZXIuTWFwMSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwMi5FcXVhbHMob3RoZXIuTWFwMikpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IE1hcDEuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwMi5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBtYXAxXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXAxX2NvZGVjKTsKLSAgICAgIG1hcDJfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcDJfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHNpemUgKz0gbWFwMV8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcDFfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXAyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwMl9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVGVzdFNhbWVUeXBlTWFwIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBtYXAxXy5BZGQob3RoZXIubWFwMV8pOwotICAgICAgbWFwMl8uQWRkKG90aGVyLm1hcDJfKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBtYXAxXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXAxX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4OiB7Ci0gICAgICAgICAgICBtYXAyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXAyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RBcmVuYU1hcCA6IHBiOjpJTWVzc2FnZTxUZXN0QXJlbmFNYXA+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0QXJlbmFNYXA+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEFyZW5hTWFwPigoKSA9PiBuZXcgVGVzdEFyZW5hTWFwKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEFyZW5hTWFwPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RBcmVuYU1hcCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdEFyZW5hTWFwKFRlc3RBcmVuYU1hcCBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbWFwSW50MzJJbnQzMl8gPSBvdGhlci5tYXBJbnQzMkludDMyXy5DbG9uZSgpOwotICAgICAgbWFwSW50NjRJbnQ2NF8gPSBvdGhlci5tYXBJbnQ2NEludDY0Xy5DbG9uZSgpOwotICAgICAgbWFwVWludDMyVWludDMyXyA9IG90aGVyLm1hcFVpbnQzMlVpbnQzMl8uQ2xvbmUoKTsKLSAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8gPSBvdGhlci5tYXBVaW50NjRVaW50NjRfLkNsb25lKCk7Ci0gICAgICBtYXBTaW50MzJTaW50MzJfID0gb3RoZXIubWFwU2ludDMyU2ludDMyXy5DbG9uZSgpOwotICAgICAgbWFwU2ludDY0U2ludDY0XyA9IG90aGVyLm1hcFNpbnQ2NFNpbnQ2NF8uQ2xvbmUoKTsKLSAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXyA9IG90aGVyLm1hcEZpeGVkMzJGaXhlZDMyXy5DbG9uZSgpOwotICAgICAgbWFwRml4ZWQ2NEZpeGVkNjRfID0gb3RoZXIubWFwRml4ZWQ2NEZpeGVkNjRfLkNsb25lKCk7Ci0gICAgICBtYXBTZml4ZWQzMlNmaXhlZDMyXyA9IG90aGVyLm1hcFNmaXhlZDMyU2ZpeGVkMzJfLkNsb25lKCk7Ci0gICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0XyA9IG90aGVyLm1hcFNmaXhlZDY0U2ZpeGVkNjRfLkNsb25lKCk7Ci0gICAgICBtYXBJbnQzMkZsb2F0XyA9IG90aGVyLm1hcEludDMyRmxvYXRfLkNsb25lKCk7Ci0gICAgICBtYXBJbnQzMkRvdWJsZV8gPSBvdGhlci5tYXBJbnQzMkRvdWJsZV8uQ2xvbmUoKTsKLSAgICAgIG1hcEJvb2xCb29sXyA9IG90aGVyLm1hcEJvb2xCb29sXy5DbG9uZSgpOwotICAgICAgbWFwSW50MzJFbnVtXyA9IG90aGVyLm1hcEludDMyRW51bV8uQ2xvbmUoKTsKLSAgICAgIG1hcEludDMyRm9yZWlnbk1lc3NhZ2VfID0gb3RoZXIubWFwSW50MzJGb3JlaWduTWVzc2FnZV8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEFyZW5hTWFwIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0QXJlbmFNYXAodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50MzJfaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDMySW50MzJGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMgX21hcF9tYXBJbnQzMkludDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMigxNiksIDEwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IG1hcEludDMySW50MzJfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IE1hcEludDMySW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMySW50MzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50NjRfaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDY0SW50NjRGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyBfbWFwX21hcEludDY0SW50NjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQ2NCg4KSwgcGI6OkZpZWxkQ29kZWMuRm9ySW50NjQoMTYpLCAxOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IG1hcEludDY0SW50NjRfID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPiBNYXBJbnQ2NEludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBJbnQ2NEludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3VpbnQzMl91aW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFVpbnQzMlVpbnQzMkZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+LkNvZGVjIF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yVUludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JVSW50MzIoMTYpLCAyNik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+IG1hcFVpbnQzMlVpbnQzMl8gPSBuZXcgcGJjOjpNYXBGaWVsZDx1aW50LCB1aW50PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+IE1hcFVpbnQzMlVpbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwVWludDMyVWludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3VpbnQ2NF91aW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFVpbnQ2NFVpbnQ2NEZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVsb25nLCB1bG9uZz4uQ29kZWMgX21hcF9tYXBVaW50NjRVaW50NjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvclVJbnQ2NCg4KSwgcGI6OkZpZWxkQ29kZWMuRm9yVUludDY0KDE2KSwgMzQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+IG1hcFVpbnQ2NFVpbnQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPiBNYXBVaW50NjRVaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcFVpbnQ2NFVpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9zaW50MzJfc2ludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBTaW50MzJTaW50MzJGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMgX21hcF9tYXBTaW50MzJTaW50MzJfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU0ludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JTSW50MzIoMTYpLCA0Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgaW50PiBtYXBTaW50MzJTaW50MzJfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+IE1hcFNpbnQzMlNpbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwU2ludDMyU2ludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3NpbnQ2NF9zaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcFNpbnQ2NFNpbnQ2NEZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+LkNvZGVjIF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yU0ludDY0KDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JTSW50NjQoMTYpLCA1MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IG1hcFNpbnQ2NFNpbnQ2NF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IE1hcFNpbnQ2NFNpbnQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwU2ludDY0U2ludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ZpeGVkMzJfZml4ZWQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwRml4ZWQzMkZpeGVkMzJGaWVsZE51bWJlciA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1aW50LCB1aW50Pi5Db2RlYyBfbWFwX21hcEZpeGVkMzJGaXhlZDMyX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQzMigxMyksIHBiOjpGaWVsZENvZGVjLkZvckZpeGVkMzIoMjEpLCA1OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+IG1hcEZpeGVkMzJGaXhlZDMyXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPHVpbnQsIHVpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8dWludCwgdWludD4gTWFwRml4ZWQzMkZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEZpeGVkMzJGaXhlZDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ZpeGVkNjRfZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwRml4ZWQ2NEZpeGVkNjRGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+LkNvZGVjIF9tYXBfbWFwRml4ZWQ2NEZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDx1bG9uZywgdWxvbmc+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckZpeGVkNjQoOSksIHBiOjpGaWVsZENvZGVjLkZvckZpeGVkNjQoMTcpLCA2Nik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHVsb25nLCB1bG9uZz4gbWFwRml4ZWQ2NEZpeGVkNjRfID0gbmV3IHBiYzo6TWFwRmllbGQ8dWxvbmcsIHVsb25nPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPHVsb25nLCB1bG9uZz4gTWFwRml4ZWQ2NEZpeGVkNjQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEZpeGVkNjRGaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX3NmaXhlZDMyX3NmaXhlZDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBTZml4ZWQzMlNmaXhlZDMyRmllbGROdW1iZXIgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ+LkNvZGVjIF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQzMigxMyksIHBiOjpGaWVsZENvZGVjLkZvclNGaXhlZDMyKDIxKSwgNzQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4gbWFwU2ZpeGVkMzJTZml4ZWQzMl8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4gTWFwU2ZpeGVkMzJTZml4ZWQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwU2ZpeGVkMzJTZml4ZWQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwU2ZpeGVkNjRTZml4ZWQ2NEZpZWxkTnVtYmVyID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyBfbWFwX21hcFNmaXhlZDY0U2ZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQ2NCg5KSwgcGI6OkZpZWxkQ29kZWMuRm9yU0ZpeGVkNjQoMTcpLCA4Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGxvbmcsIGxvbmc+IG1hcFNmaXhlZDY0U2ZpeGVkNjRfID0gbmV3IHBiYzo6TWFwRmllbGQ8bG9uZywgbG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxsb25nLCBsb25nPiBNYXBTZml4ZWQ2NFNmaXhlZDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBTZml4ZWQ2NFNmaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2ludDMyX2Zsb2F0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBJbnQzMkZsb2F0RmllbGROdW1iZXIgPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ+LkNvZGVjIF9tYXBfbWFwSW50MzJGbG9hdF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JGbG9hdCgyMSksIDkwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBmbG9hdD4gbWFwSW50MzJGbG9hdF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGZsb2F0PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ+IE1hcEludDMyRmxvYXQgewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMyRmxvYXRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50MzJfZG91YmxlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBJbnQzMkRvdWJsZUZpZWxkTnVtYmVyID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGRvdWJsZT4uQ29kZWMgX21hcF9tYXBJbnQzMkRvdWJsZV9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZG91YmxlPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yRG91YmxlKDE3KSwgOTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGRvdWJsZT4gbWFwSW50MzJEb3VibGVfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBkb3VibGU+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBkb3VibGU+IE1hcEludDMyRG91YmxlIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBJbnQzMkRvdWJsZV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9ib29sX2Jvb2wiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEJvb2xCb29sRmllbGROdW1iZXIgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGJvb2wsIGJvb2w+LkNvZGVjIF9tYXBfbWFwQm9vbEJvb2xfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxib29sLCBib29sPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JCb29sKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JCb29sKDE2KSwgMTA2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8Ym9vbCwgYm9vbD4gbWFwQm9vbEJvb2xfID0gbmV3IHBiYzo6TWFwRmllbGQ8Ym9vbCwgYm9vbD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxib29sLCBib29sPiBNYXBCb29sQm9vbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWFwQm9vbEJvb2xfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtYXBfaW50MzJfZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWFwSW50MzJFbnVtRmllbGROdW1iZXIgPSAxNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBFbnVtPi5Db2RlYyBfbWFwX21hcEludDMyRW51bV9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBFbnVtPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yRW51bSgxNiwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1hcEVudW0pIHgpLCAxMTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTWFwRW51bT4gbWFwSW50MzJFbnVtXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBFbnVtPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBFbnVtPiBNYXBJbnQzMkVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIG1hcEludDMyRW51bV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1hcEludDMyRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDE1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPi5Db2RlYyBfbWFwX21hcEludDMyRm9yZWlnbk1lc3NhZ2VfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLlBhcnNlciksIDEyMik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gbWFwSW50MzJGb3JlaWduTWVzc2FnZV8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiBNYXBJbnQzMkZvcmVpZ25NZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBJbnQzMkZvcmVpZ25NZXNzYWdlXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdEFyZW5hTWFwKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdEFyZW5hTWFwIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghTWFwSW50MzJJbnQzMi5FcXVhbHMob3RoZXIuTWFwSW50MzJJbnQzMikpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwSW50NjRJbnQ2NC5FcXVhbHMob3RoZXIuTWFwSW50NjRJbnQ2NCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwVWludDMyVWludDMyLkVxdWFscyhvdGhlci5NYXBVaW50MzJVaW50MzIpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcFVpbnQ2NFVpbnQ2NC5FcXVhbHMob3RoZXIuTWFwVWludDY0VWludDY0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBTaW50MzJTaW50MzIuRXF1YWxzKG90aGVyLk1hcFNpbnQzMlNpbnQzMikpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwU2ludDY0U2ludDY0LkVxdWFscyhvdGhlci5NYXBTaW50NjRTaW50NjQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEZpeGVkMzJGaXhlZDMyLkVxdWFscyhvdGhlci5NYXBGaXhlZDMyRml4ZWQzMikpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwRml4ZWQ2NEZpeGVkNjQuRXF1YWxzKG90aGVyLk1hcEZpeGVkNjRGaXhlZDY0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBTZml4ZWQzMlNmaXhlZDMyLkVxdWFscyhvdGhlci5NYXBTZml4ZWQzMlNmaXhlZDMyKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBTZml4ZWQ2NFNmaXhlZDY0LkVxdWFscyhvdGhlci5NYXBTZml4ZWQ2NFNmaXhlZDY0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBJbnQzMkZsb2F0LkVxdWFscyhvdGhlci5NYXBJbnQzMkZsb2F0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFNYXBJbnQzMkRvdWJsZS5FcXVhbHMob3RoZXIuTWFwSW50MzJEb3VibGUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEJvb2xCb29sLkVxdWFscyhvdGhlci5NYXBCb29sQm9vbCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghTWFwSW50MzJFbnVtLkVxdWFscyhvdGhlci5NYXBJbnQzMkVudW0pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIU1hcEludDMyRm9yZWlnbk1lc3NhZ2UuRXF1YWxzKG90aGVyLk1hcEludDMyRm9yZWlnbk1lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaGFzaCBePSBNYXBJbnQzMkludDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEludDY0SW50NjQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwVWludDMyVWludDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcFVpbnQ2NFVpbnQ2NC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBTaW50MzJTaW50MzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwU2ludDY0U2ludDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEZpeGVkMzJGaXhlZDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEZpeGVkNjRGaXhlZDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcFNmaXhlZDMyU2ZpeGVkMzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gTWFwU2ZpeGVkNjRTZml4ZWQ2NC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBJbnQzMkZsb2F0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEludDMyRG91YmxlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEJvb2xCb29sLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IE1hcEludDMyRW51bS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBNYXBJbnQzMkZvcmVpZ25NZXNzYWdlLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIG1hcEludDMySW50MzJfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcEludDMySW50MzJfY29kZWMpOwotICAgICAgbWFwSW50NjRJbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwSW50NjRJbnQ2NF9jb2RlYyk7Ci0gICAgICBtYXBVaW50MzJVaW50MzJfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcFVpbnQzMlVpbnQzMl9jb2RlYyk7Ci0gICAgICBtYXBVaW50NjRVaW50NjRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcFVpbnQ2NFVpbnQ2NF9jb2RlYyk7Ci0gICAgICBtYXBTaW50MzJTaW50MzJfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcFNpbnQzMlNpbnQzMl9jb2RlYyk7Ci0gICAgICBtYXBTaW50NjRTaW50NjRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcFNpbnQ2NFNpbnQ2NF9jb2RlYyk7Ci0gICAgICBtYXBGaXhlZDMyRml4ZWQzMl8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwRml4ZWQzMkZpeGVkMzJfY29kZWMpOwotICAgICAgbWFwRml4ZWQ2NEZpeGVkNjRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcEZpeGVkNjRGaXhlZDY0X2NvZGVjKTsKLSAgICAgIG1hcFNmaXhlZDMyU2ZpeGVkMzJfLldyaXRlVG8ob3V0cHV0LCBfbWFwX21hcFNmaXhlZDMyU2ZpeGVkMzJfY29kZWMpOwotICAgICAgbWFwU2ZpeGVkNjRTZml4ZWQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwU2ZpeGVkNjRTZml4ZWQ2NF9jb2RlYyk7Ci0gICAgICBtYXBJbnQzMkZsb2F0Xy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBJbnQzMkZsb2F0X2NvZGVjKTsKLSAgICAgIG1hcEludDMyRG91YmxlXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBJbnQzMkRvdWJsZV9jb2RlYyk7Ci0gICAgICBtYXBCb29sQm9vbF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwQm9vbEJvb2xfY29kZWMpOwotICAgICAgbWFwSW50MzJFbnVtXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9tYXBJbnQzMkVudW1fY29kZWMpOwotICAgICAgbWFwSW50MzJGb3JlaWduTWVzc2FnZV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfbWFwSW50MzJGb3JlaWduTWVzc2FnZV9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSBtYXBJbnQzMkludDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwSW50MzJJbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEludDY0SW50NjRfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBJbnQ2NEludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwVWludDMyVWludDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwVWludDMyVWludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwVWludDY0VWludDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwVWludDY0VWludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwU2ludDMyU2ludDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU2ludDMyU2ludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwU2ludDY0U2ludDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU2ludDY0U2ludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwRml4ZWQzMkZpeGVkMzJfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBGaXhlZDMyRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEZpeGVkNjRGaXhlZDY0Xy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwRml4ZWQ2NEZpeGVkNjRfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBTZml4ZWQzMlNmaXhlZDMyXy5DYWxjdWxhdGVTaXplKF9tYXBfbWFwU2ZpeGVkMzJTZml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcFNmaXhlZDY0U2ZpeGVkNjRfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBTZml4ZWQ2NFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwSW50MzJGbG9hdF8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEludDMyRmxvYXRfY29kZWMpOwotICAgICAgc2l6ZSArPSBtYXBJbnQzMkRvdWJsZV8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEludDMyRG91YmxlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gbWFwQm9vbEJvb2xfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBCb29sQm9vbF9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEludDMyRW51bV8uQ2FsY3VsYXRlU2l6ZShfbWFwX21hcEludDMyRW51bV9jb2RlYyk7Ci0gICAgICBzaXplICs9IG1hcEludDMyRm9yZWlnbk1lc3NhZ2VfLkNhbGN1bGF0ZVNpemUoX21hcF9tYXBJbnQzMkZvcmVpZ25NZXNzYWdlX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0QXJlbmFNYXAgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG1hcEludDMySW50MzJfLkFkZChvdGhlci5tYXBJbnQzMkludDMyXyk7Ci0gICAgICBtYXBJbnQ2NEludDY0Xy5BZGQob3RoZXIubWFwSW50NjRJbnQ2NF8pOwotICAgICAgbWFwVWludDMyVWludDMyXy5BZGQob3RoZXIubWFwVWludDMyVWludDMyXyk7Ci0gICAgICBtYXBVaW50NjRVaW50NjRfLkFkZChvdGhlci5tYXBVaW50NjRVaW50NjRfKTsKLSAgICAgIG1hcFNpbnQzMlNpbnQzMl8uQWRkKG90aGVyLm1hcFNpbnQzMlNpbnQzMl8pOwotICAgICAgbWFwU2ludDY0U2ludDY0Xy5BZGQob3RoZXIubWFwU2ludDY0U2ludDY0Xyk7Ci0gICAgICBtYXBGaXhlZDMyRml4ZWQzMl8uQWRkKG90aGVyLm1hcEZpeGVkMzJGaXhlZDMyXyk7Ci0gICAgICBtYXBGaXhlZDY0Rml4ZWQ2NF8uQWRkKG90aGVyLm1hcEZpeGVkNjRGaXhlZDY0Xyk7Ci0gICAgICBtYXBTZml4ZWQzMlNmaXhlZDMyXy5BZGQob3RoZXIubWFwU2ZpeGVkMzJTZml4ZWQzMl8pOwotICAgICAgbWFwU2ZpeGVkNjRTZml4ZWQ2NF8uQWRkKG90aGVyLm1hcFNmaXhlZDY0U2ZpeGVkNjRfKTsKLSAgICAgIG1hcEludDMyRmxvYXRfLkFkZChvdGhlci5tYXBJbnQzMkZsb2F0Xyk7Ci0gICAgICBtYXBJbnQzMkRvdWJsZV8uQWRkKG90aGVyLm1hcEludDMyRG91YmxlXyk7Ci0gICAgICBtYXBCb29sQm9vbF8uQWRkKG90aGVyLm1hcEJvb2xCb29sXyk7Ci0gICAgICBtYXBJbnQzMkVudW1fLkFkZChvdGhlci5tYXBJbnQzMkVudW1fKTsKLSAgICAgIG1hcEludDMyRm9yZWlnbk1lc3NhZ2VfLkFkZChvdGhlci5tYXBJbnQzMkZvcmVpZ25NZXNzYWdlXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgbWFwSW50MzJJbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwSW50MzJJbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgbWFwSW50NjRJbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwSW50NjRJbnQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjogewotICAgICAgICAgICAgbWFwVWludDMyVWludDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBVaW50MzJVaW50MzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzQ6IHsKLSAgICAgICAgICAgIG1hcFVpbnQ2NFVpbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwVWludDY0VWludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQyOiB7Ci0gICAgICAgICAgICBtYXBTaW50MzJTaW50MzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcFNpbnQzMlNpbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1MDogewotICAgICAgICAgICAgbWFwU2ludDY0U2ludDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTaW50NjRTaW50NjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTg6IHsKLSAgICAgICAgICAgIG1hcEZpeGVkMzJGaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBGaXhlZDMyRml4ZWQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA2NjogewotICAgICAgICAgICAgbWFwRml4ZWQ2NEZpeGVkNjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEZpeGVkNjRGaXhlZDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc0OiB7Ci0gICAgICAgICAgICBtYXBTZml4ZWQzMlNmaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTZml4ZWQzMlNmaXhlZDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDgyOiB7Ci0gICAgICAgICAgICBtYXBTZml4ZWQ2NFNmaXhlZDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBTZml4ZWQ2NFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDkwOiB7Ci0gICAgICAgICAgICBtYXBJbnQzMkZsb2F0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9tYXBJbnQzMkZsb2F0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDk4OiB7Ci0gICAgICAgICAgICBtYXBJbnQzMkRvdWJsZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwSW50MzJEb3VibGVfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTA2OiB7Ci0gICAgICAgICAgICBtYXBCb29sQm9vbF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfbWFwQm9vbEJvb2xfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTE0OiB7Ci0gICAgICAgICAgICBtYXBJbnQzMkVudW1fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEludDMyRW51bV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMjI6IHsKLSAgICAgICAgICAgIG1hcEludDMyRm9yZWlnbk1lc3NhZ2VfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX21hcEludDMyRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgUHJldmlvdXNseSwgbWVzc2FnZSBjb250YWluaW5nIGVudW0gY2FsbGVkIFR5cGUgY2Fubm90IGJlIHVzZWQgYXMgdmFsdWUgb2YKLSAgLy8vICBtYXAgZmllbGQuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlIDogcGI6OklNZXNzYWdlPE1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGU+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGU+KCgpID0+IG5ldyBNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8TWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTWFwVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzVdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlKE1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHR5cGVfID0gb3RoZXIudHlwZV8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInR5cGUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZT4uQ29kZWMgX21hcF90eXBlX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGU+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUuUGFyc2VyKSwgMTApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZT4gdHlwZV8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZT4gVHlwZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdHlwZV87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE1lc3NhZ2VDb250YWluaW5nRW51bUNhbGxlZFR5cGUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghVHlwZS5FcXVhbHMob3RoZXIuVHlwZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IFR5cGUuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgdHlwZV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfdHlwZV9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSB0eXBlXy5DYWxjdWxhdGVTaXplKF9tYXBfdHlwZV9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTWVzc2FnZUNvbnRhaW5pbmdFbnVtQ2FsbGVkVHlwZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgdHlwZV8uQWRkKG90aGVyLnR5cGVfKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICB0eXBlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF90eXBlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBNZXNzYWdlQ29udGFpbmluZ0VudW1DYWxsZWRUeXBlIG1lc3NhZ2UgdHlwZS48L3N1bW1hcnk+Ci0gICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgewotICAgICAgcHVibGljIGVudW0gVHlwZSB7Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9GT08iKV0gRm9vID0gMCwKLSAgICAgIH0KLQotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBQcmV2aW91c2x5LCBtZXNzYWdlIGNhbm5vdCBjb250YWluIG1hcCBmaWVsZCBjYWxsZWQgImVudHJ5Ii4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkgOiBwYjo6SU1lc3NhZ2U8TWVzc2FnZUNvbnRhaW5pbmdNYXBDYWxsZWRFbnRyeT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnk+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8TWVzc2FnZUNvbnRhaW5pbmdNYXBDYWxsZWRFbnRyeT4oKCkgPT4gbmV3IE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxNZXNzYWdlQ29udGFpbmluZ01hcENhbGxlZEVudHJ5PiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkoTWVzc2FnZUNvbnRhaW5pbmdNYXBDYWxsZWRFbnRyeSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgZW50cnlfID0gb3RoZXIuZW50cnlfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJlbnRyeSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRW50cnlGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4uQ29kZWMgX21hcF9lbnRyeV9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoMTYpLCAxMCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgaW50PiBlbnRyeV8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGludD4gRW50cnkgewotICAgICAgZ2V0IHsgcmV0dXJuIGVudHJ5XzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgTWVzc2FnZUNvbnRhaW5pbmdNYXBDYWxsZWRFbnRyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKE1lc3NhZ2VDb250YWluaW5nTWFwQ2FsbGVkRW50cnkgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCFFbnRyeS5FcXVhbHMob3RoZXIuRW50cnkpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaGFzaCBePSBFbnRyeS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBlbnRyeV8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfZW50cnlfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHNpemUgKz0gZW50cnlfLkNhbGN1bGF0ZVNpemUoX21hcF9lbnRyeV9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTWVzc2FnZUNvbnRhaW5pbmdNYXBDYWxsZWRFbnRyeSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZW50cnlfLkFkZChvdGhlci5lbnRyeV8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGVudHJ5Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9lbnRyeV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gICNlbmRyZWdpb24KLQotfQotCi0jZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RQcm90b3MvVW5pdHRlc3RJbXBvcnRQcm90bzMuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RQcm90b3MvVW5pdHRlc3RJbXBvcnRQcm90bzMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI2M2UxN2MwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Vbml0dGVzdEltcG9ydFByb3RvMy5jcworKysgL2Rldi9udWxsCkBAIC0xLDE2MSArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3Byb3RvMy5wcm90bwotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQotI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi11c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmOwotdXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvcyB7Ci0KLSAgLy8vIDxzdW1tYXJ5PkhvbGRlciBmb3IgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZnJvbSBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3Byb3RvMy5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXR0ZXN0SW1wb3J0UHJvdG8zUmVmbGVjdGlvbiB7Ci0KLSAgICAjcmVnaW9uIERlc2NyaXB0b3IKLSAgICAvLy8gPHN1bW1hcnk+RmlsZSBkZXNjcmlwdG9yIGZvciBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3Byb3RvMy5wcm90bzwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICBzdGF0aWMgVW5pdHRlc3RJbXBvcnRQcm90bzNSZWZsZWN0aW9uKCkgewotICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKAotICAgICAgICAgIHN0cmluZy5Db25jYXQoCi0gICAgICAgICAgICAiQ2l4bmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZFc1cGRIUmxjM1JmYVcxd2IzSjBYM0J5YjNSdk15NXdjbTkwIiwKLSAgICAgICAgICAgICJieElZY0hKdmRHOWlkV1pmZFc1cGRIUmxjM1JmYVcxd2IzSjBHak5uYjI5bmJHVXZjSEp2ZEc5aWRXWXYiLAotICAgICAgICAgICAgImRXNXBkSFJsYzNSZmFXMXdiM0owWDNCMVlteHBZMTl3Y205MGJ6TXVjSEp2ZEc4aUdnb05TVzF3YjNKMCIsCi0gICAgICAgICAgICAiVFdWemMyRm5aUklKQ2dGa0dBRWdBU2dGS2xrS0NrbHRjRzl5ZEVWdWRXMFNHd29YU1UxUVQxSlVYMFZPIiwKLSAgICAgICAgICAgICJWVTFmVlU1VFVFVkRTVVpKUlVRUUFCSU9DZ3BKVFZCUFVsUmZSazlQRUFjU0Rnb0tTVTFRVDFKVVgwSkIiLAotICAgICAgICAgICAgIlVoQUlFZzRLQ2tsTlVFOVNWRjlDUVZvUUNVSThDaGhqYjIwdVoyOXZaMnhsTG5CeWIzUnZZblZtTG5SbCIsCi0gICAgICAgICAgICAiYzNSSUFmZ0JBYW9DR2tkdmIyZHNaUzVRY205MGIySjFaaTVVWlhOMFVISnZkRzl6VUFCaUJuQnliM1J2IiwKLSAgICAgICAgICAgICJNdz09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RJbXBvcnRQdWJsaWNQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obmV3W10ge3R5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydEVudW0pLCB9LCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UuUGFyc2VyLCBuZXdbXXsgIkQiIH0sIG51bGwsIG51bGwsIG51bGwpCi0gICAgICAgICAgfSkpOwotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotICAjcmVnaW9uIEVudW1zCi0gIHB1YmxpYyBlbnVtIEltcG9ydEVudW0gewotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiSU1QT1JUX0VOVU1fVU5TUEVDSUZJRUQiKV0gVW5zcGVjaWZpZWQgPSAwLAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiSU1QT1JUX0ZPTyIpXSBJbXBvcnRGb28gPSA3LAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiSU1QT1JUX0JBUiIpXSBJbXBvcnRCYXIgPSA4LAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiSU1QT1JUX0JBWiIpXSBJbXBvcnRCYXogPSA5LAotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi0gICNyZWdpb24gTWVzc2FnZXMKLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEltcG9ydE1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8SW1wb3J0TWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEltcG9ydE1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8SW1wb3J0TWVzc2FnZT4oKCkgPT4gbmV3IEltcG9ydE1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxJbXBvcnRNZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdEltcG9ydFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEltcG9ydE1lc3NhZ2UoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEltcG9ydE1lc3NhZ2UoSW1wb3J0TWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgZF8gPSBvdGhlci5kXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW1wb3J0TWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgSW1wb3J0TWVzc2FnZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBpbnQgZF87Ci0gICAgcHVibGljIGludCBEIHsKLSAgICAgIGdldCB7IHJldHVybiBkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEltcG9ydE1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhJbXBvcnRNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChEICE9IG90aGVyLkQpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoRCAhPSAwKSBoYXNoIF49IEQuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKEQgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEQpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChEICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoRCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oSW1wb3J0TWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkQgIT0gMCkgewotICAgICAgICBEID0gb3RoZXIuRDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIEQgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Vbml0dGVzdEltcG9ydFB1YmxpY1Byb3RvMy5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Vbml0dGVzdEltcG9ydFB1YmxpY1Byb3RvMy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjQ3MWE4Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RQcm90b3MvVW5pdHRlc3RJbXBvcnRQdWJsaWNQcm90bzMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDcgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcHJvdG8zLnByb3RvCi0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxCi0jcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCi0KLXVzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWY7Ci11c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5Db2xsZWN0aW9uczsKLXVzaW5nIHBiciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb247Ci11c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zIHsKLQotICAvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciByZWZsZWN0aW9uIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBmcm9tIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX3Byb3RvMy5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXR0ZXN0SW1wb3J0UHVibGljUHJvdG8zUmVmbGVjdGlvbiB7Ci0KLSAgICAjcmVnaW9uIERlc2NyaXB0b3IKLSAgICAvLy8gPHN1bW1hcnk+RmlsZSBkZXNjcmlwdG9yIGZvciBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wcm90bzMucHJvdG88L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgc3RhdGljIFVuaXR0ZXN0SW1wb3J0UHVibGljUHJvdG8zUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNqTm5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNSZmFXMXdiM0owWDNCMVlteHBZMTl3Y205MCIsCi0gICAgICAgICAgICAiYnpNdWNISnZkRzhTR0hCeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJsdGNHOXlkQ0lnQ2hOUWRXSnNhV05KIiwKLSAgICAgICAgICAgICJiWEJ2Y25STlpYTnpZV2RsRWdrS0FXVVlBU0FCS0FWQ053b1lZMjl0TG1kdmIyZHNaUzV3Y205MGIySjEiLAotICAgICAgICAgICAgIlppNTBaWE4wcWdJYVIyOXZaMnhsTGxCeWIzUnZZblZtTGxSbGMzUlFjbTkwYjNOaUJuQnliM1J2TXc9PSIpKTsKLSAgICAgIGRlc2NyaXB0b3IgPSBwYnI6OkZpbGVEZXNjcmlwdG9yLkZyb21HZW5lcmF0ZWRDb2RlKGRlc2NyaXB0b3JEYXRhLAotICAgICAgICAgIG5ldyBwYnI6OkZpbGVEZXNjcmlwdG9yW10geyB9LAotICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10gewotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHVibGljSW1wb3J0TWVzc2FnZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHVibGljSW1wb3J0TWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiRSIgfSwgbnVsbCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICB9KSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0gICNyZWdpb24gTWVzc2FnZXMKLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFB1YmxpY0ltcG9ydE1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8UHVibGljSW1wb3J0TWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFB1YmxpY0ltcG9ydE1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8UHVibGljSW1wb3J0TWVzc2FnZT4oKCkgPT4gbmV3IFB1YmxpY0ltcG9ydE1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxQdWJsaWNJbXBvcnRNZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdEltcG9ydFB1YmxpY1Byb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFB1YmxpY0ltcG9ydE1lc3NhZ2UoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFB1YmxpY0ltcG9ydE1lc3NhZ2UoUHVibGljSW1wb3J0TWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgZV8gPSBvdGhlci5lXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUHVibGljSW1wb3J0TWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgUHVibGljSW1wb3J0TWVzc2FnZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBpbnQgZV87Ci0gICAgcHVibGljIGludCBFIHsKLSAgICAgIGdldCB7IHJldHVybiBlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFB1YmxpY0ltcG9ydE1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhQdWJsaWNJbXBvcnRNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChFICE9IG90aGVyLkUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoRSAhPSAwKSBoYXNoIF49IEUuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKEUgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChFICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoRSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oUHVibGljSW1wb3J0TWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkUgIT0gMCkgewotICAgICAgICBFID0gb3RoZXIuRTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIEUgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Vbml0dGVzdElzc3Vlcy5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Vbml0dGVzdElzc3Vlcy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2Q0NDUxYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RQcm90b3MvVW5pdHRlc3RJc3N1ZXMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY5ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IHVuaXR0ZXN0X2lzc3Vlcy5wcm90bwotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQotI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi11c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmOwotdXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLW5hbWVzcGFjZSBVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3RvcyB7Ci0KLSAgLy8vIDxzdW1tYXJ5PkhvbGRlciBmb3IgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZnJvbSB1bml0dGVzdF9pc3N1ZXMucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0dGVzdElzc3Vlc1JlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgdW5pdHRlc3RfaXNzdWVzLnByb3RvPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgIHN0YXRpYyBVbml0dGVzdElzc3Vlc1JlZmxlY3Rpb24oKSB7Ci0gICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoCi0gICAgICAgICAgc3RyaW5nLkNvbmNhdCgKLSAgICAgICAgICAgICJDaFYxYm1sMGRHVnpkRjlwYzNOMVpYTXVjSEp2ZEc4U0QzVnVhWFIwWlhOMFgybHpjM1ZsY3lJbkNnaEoiLAotICAgICAgICAgICAgImMzTjFaVE13TnhvYkNncE9aWE4wWldSUGJtTmxHZzBLQzA1bGMzUmxaRlIzYVdObElyQUJDaE5PWldkaCIsCi0gICAgICAgICAgICAiZEdsMlpVVnVkVzFOWlhOellXZGxFaXdLQlhaaGJIVmxHQUVnQVNnT01oMHVkVzVwZEhSbGMzUmZhWE56IiwKLSAgICAgICAgICAgICJkV1Z6TGs1bFoyRjBhWFpsUlc1MWJSSXhDZ1oyWVd4MVpYTVlBaUFES0E0eUhTNTFibWwwZEdWemRGOXAiLAotICAgICAgICAgICAgImMzTjFaWE11VG1WbllYUnBkbVZGYm5WdFFnSVFBQkk0Q2cxd1lXTnJaV1JmZG1Gc2RXVnpHQU1nQXlnTyIsCi0gICAgICAgICAgICAiTWgwdWRXNXBkSFJsYzNSZmFYTnpkV1Z6TGs1bFoyRjBhWFpsUlc1MWJVSUNFQUVpRVFvUFJHVndjbVZqIiwKLSAgICAgICAgICAgICJZWFJsWkVOb2FXeGtJcmtDQ2hkRVpYQnlaV05oZEdWa1JtbGxiR1J6VFdWemMyRm5aUklhQ2c1UWNtbHQiLAotICAgICAgICAgICAgImFYUnBkbVZXWVd4MVpSZ0JJQUVvQlVJQ0dBRVNHZ29PVUhKcGJXbDBhWFpsUVhKeVlYa1lBaUFES0FWQyIsCi0gICAgICAgICAgICAiQWhnQkVqb0tERTFsYzNOaFoyVldZV3gxWlJnRElBRW9DeklnTG5WdWFYUjBaWE4wWDJsemMzVmxjeTVFIiwKLSAgICAgICAgICAgICJaWEJ5WldOaGRHVmtRMmhwYkdSQ0FoZ0JFam9LREUxbGMzTmhaMlZCY25KaGVSZ0VJQU1vQ3pJZ0xuVnUiLAotICAgICAgICAgICAgImFYUjBaWE4wWDJsemMzVmxjeTVFWlhCeVpXTmhkR1ZrUTJocGJHUkNBaGdCRWpZS0NVVnVkVzFXWVd4MSIsCi0gICAgICAgICAgICAiWlJnRklBRW9EaklmTG5WdWFYUjBaWE4wWDJsemMzVmxjeTVFWlhCeVpXTmhkR1ZrUlc1MWJVSUNHQUVTIiwKLSAgICAgICAgICAgICJOZ29KUlc1MWJVRnljbUY1R0FZZ0F5Z09NaDh1ZFc1cGRIUmxjM1JmYVhOemRXVnpMa1JsY0hKbFkyRjAiLAotICAgICAgICAgICAgIlpXUkZiblZ0UWdJWUFTSVpDZ2xKZEdWdFJtbGxiR1FTREFvRWFYUmxiUmdCSUFFb0JTSkVDZzFTWlhObCIsCi0gICAgICAgICAgICAiY25abFpFNWhiV1Z6RWcwS0JYUjVjR1Z6R0FFZ0FTZ0ZFaElLQ21SbGMyTnlhWEIwYjNJWUFpQUJLQVVhIiwKLSAgICAgICAgICAgICJFQW9PVTI5dFpVNWxjM1JsWkZSNWNHVWlvQUVLRlZSbGMzUktjMjl1Um1sbGJHUlBjbVJsY21sdVp4SVQiLAotICAgICAgICAgICAgIkNndHdiR0ZwYmw5cGJuUXpNaGdFSUFFb0JSSVRDZ2x2TVY5emRISnBibWNZQWlBQktBbElBQklTQ2dodiIsCi0gICAgICAgICAgICAiTVY5cGJuUXpNaGdGSUFFb0JVZ0FFaFFLREhCc1lXbHVYM04wY21sdVp4Z0JJQUVvQ1JJU0NnaHZNbDlwIiwKLSAgICAgICAgICAgICJiblF6TWhnR0lBRW9CVWdCRWhNS0NXOHlYM04wY21sdVp4Z0RJQUVvQ1VnQlFnUUtBbTh4UWdRS0FtOHkiLAotICAgICAgICAgICAgIklrc0tERlJsYzNSS2MyOXVUbUZ0WlJJTUNnUnVZVzFsR0FFZ0FTZ0pFaGtLQzJSbGMyTnlhWEIwYVc5dSIsCi0gICAgICAgICAgICAiR0FJZ0FTZ0pVZ1JrWlhOakVoSUtCR2QxYVdRWUF5QUJLQWxTQkdWNGFXUXFWUW9NVG1WbllYUnBkbVZGIiwKLSAgICAgICAgICAgICJiblZ0RWhZS0VrNUZSMEZVU1ZaRlgwVk9WVTFmV2tWU1R4QUFFaFlLQ1VacGRtVkNaV3h2ZHhENy8vLy8iLAotICAgICAgICAgICAgIi8vLy8vLzhCRWhVS0NFMXBiblZ6VDI1bEVQLy8vLy8vLy8vLy93RXFMZ29PUkdWd2NtVmpZWFJsWkVWdSIsCi0gICAgICAgICAgICAiZFcwU0V3b1BSRVZRVWtWRFFWUkZSRjlhUlZKUEVBQVNCd29EYjI1bEVBRkNIMGdCcWdJYVZXNXBkRlJsIiwKLSAgICAgICAgICAgICJjM1F1U1hOemRXVnpMbFJsYzNSUWNtOTBiM05pQm5CeWIzUnZNdz09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obmV3W10ge3R5cGVvZihnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bSksIHR5cGVvZihnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRFbnVtKSwgfSwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Jc3N1ZTMwNyksIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuSXNzdWUzMDcuUGFyc2VyLCBudWxsLCBudWxsLCBudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuSXNzdWUzMDcuVHlwZXMuTmVzdGVkT25jZSksIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuSXNzdWUzMDcuVHlwZXMuTmVzdGVkT25jZS5QYXJzZXIsIG51bGwsIG51bGwsIG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Jc3N1ZTMwNy5UeXBlcy5OZXN0ZWRPbmNlLlR5cGVzLk5lc3RlZFR3aWNlKSwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Jc3N1ZTMwNy5UeXBlcy5OZXN0ZWRPbmNlLlR5cGVzLk5lc3RlZFR3aWNlLlBhcnNlciwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCl9KX0pLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtTWVzc2FnZSksIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtTWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiVmFsdWUiLCAiVmFsdWVzIiwgIlBhY2tlZFZhbHVlcyIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQpLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZC5QYXJzZXIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UpLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlLlBhcnNlciwgbmV3W117ICJQcmltaXRpdmVWYWx1ZSIsICJQcmltaXRpdmVBcnJheSIsICJNZXNzYWdlVmFsdWUiLCAiTWVzc2FnZUFycmF5IiwgIkVudW1WYWx1ZSIsICJFbnVtQXJyYXkiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuSXRlbUZpZWxkKSwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5JdGVtRmllbGQuUGFyc2VyLCBuZXdbXXsgIkl0ZW0iIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuUmVzZXJ2ZWROYW1lcyksIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuUmVzZXJ2ZWROYW1lcy5QYXJzZXIsIG5ld1tdeyAiVHlwZXNfIiwgIkRlc2NyaXB0b3JfIiB9LCBudWxsLCBudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuUmVzZXJ2ZWROYW1lcy5UeXBlcy5Tb21lTmVzdGVkVHlwZSksIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuUmVzZXJ2ZWROYW1lcy5UeXBlcy5Tb21lTmVzdGVkVHlwZS5QYXJzZXIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpfSksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5UZXN0SnNvbkZpZWxkT3JkZXJpbmcpLCBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlRlc3RKc29uRmllbGRPcmRlcmluZy5QYXJzZXIsIG5ld1tdeyAiUGxhaW5JbnQzMiIsICJPMVN0cmluZyIsICJPMUludDMyIiwgIlBsYWluU3RyaW5nIiwgIk8ySW50MzIiLCAiTzJTdHJpbmciIH0sIG5ld1tdeyAiTzEiLCAiTzIiIH0sIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVGVzdEpzb25OYW1lKSwgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5UZXN0SnNvbk5hbWUuUGFyc2VyLCBuZXdbXXsgIk5hbWUiLCAiRGVzY3JpcHRpb24iLCAiR3VpZCIgfSwgbnVsbCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICB9KSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0gICNyZWdpb24gRW51bXMKLSAgcHVibGljIGVudW0gTmVnYXRpdmVFbnVtIHsKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIk5FR0FUSVZFX0VOVU1fWkVSTyIpXSBaZXJvID0gMCwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkZpdmVCZWxvdyIpXSBGaXZlQmVsb3cgPSAtNSwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIk1pbnVzT25lIildIE1pbnVzT25lID0gLTEsCi0gIH0KLQotICBwdWJsaWMgZW51bSBEZXByZWNhdGVkRW51bSB7Ci0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJERVBSRUNBVEVEX1pFUk8iKV0gRGVwcmVjYXRlZFplcm8gPSAwLAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgib25lIildIE9uZSA9IDEsCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgSXNzdWUgMzA3OiB3aGVuIGdlbmVyYXRpbmcgZG91Ymx5LW5lc3RlZCB0eXBlcywgYW55IHJlZmVyZW5jZXMKLSAgLy8vICBzaG91bGQgYmUgb2YgdGhlIGZvcm0gQS5UeXBlcy5CLlR5cGVzLkMuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBJc3N1ZTMwNyA6IHBiOjpJTWVzc2FnZTxJc3N1ZTMwNz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPElzc3VlMzA3PiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPElzc3VlMzA3PigoKSA9PiBuZXcgSXNzdWUzMDcoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxJc3N1ZTMwNz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdHRlc3RJc3N1ZXNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBJc3N1ZTMwNygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgSXNzdWUzMDcoSXNzdWUzMDcgb3RoZXIpIDogdGhpcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSXNzdWUzMDcgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IElzc3VlMzA3KHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgSXNzdWUzMDcpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhJc3N1ZTMwNyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKElzc3VlMzA3IG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcwotICAgIC8vLyA8c3VtbWFyeT5Db250YWluZXIgZm9yIG5lc3RlZCB0eXBlcyBkZWNsYXJlZCBpbiB0aGUgSXNzdWUzMDcgbWVzc2FnZSB0eXBlLjwvc3VtbWFyeT4KLSAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7Ci0gICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE5lc3RlZE9uY2UgOiBwYjo6SU1lc3NhZ2U8TmVzdGVkT25jZT4gewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxOZXN0ZWRPbmNlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZE9uY2U+KCgpID0+IG5ldyBOZXN0ZWRPbmNlKCkpOwotICAgICAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZE9uY2U+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuSXNzdWUzMDcuRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBOZXN0ZWRPbmNlKCkgewotICAgICAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgICAgICBwdWJsaWMgTmVzdGVkT25jZShOZXN0ZWRPbmNlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTmVzdGVkT25jZSBDbG9uZSgpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IE5lc3RlZE9uY2UodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBOZXN0ZWRPbmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEVxdWFscyhOZXN0ZWRPbmNlIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKE5lc3RlZE9uY2Ugb3RoZXIpIHsKLSAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgICAgIC8vLyA8c3VtbWFyeT5Db250YWluZXIgZm9yIG5lc3RlZCB0eXBlcyBkZWNsYXJlZCBpbiB0aGUgTmVzdGVkT25jZSBtZXNzYWdlIHR5cGUuPC9zdW1tYXJ5PgotICAgICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgICAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgewotICAgICAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE5lc3RlZFR3aWNlIDogcGI6OklNZXNzYWdlPE5lc3RlZFR3aWNlPiB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxOZXN0ZWRUd2ljZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxOZXN0ZWRUd2ljZT4oKCkgPT4gbmV3IE5lc3RlZFR3aWNlKCkpOwotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxOZXN0ZWRUd2ljZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgICAgICAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLklzc3VlMzA3LlR5cGVzLk5lc3RlZE9uY2UuRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIE5lc3RlZFR3aWNlKCkgewotICAgICAgICAgICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgICAgICAgICAgcHVibGljIE5lc3RlZFR3aWNlKE5lc3RlZFR3aWNlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBOZXN0ZWRUd2ljZSBDbG9uZSgpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIG5ldyBOZXN0ZWRUd2ljZSh0aGlzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgICAgICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE5lc3RlZFR3aWNlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKE5lc3RlZFR3aWNlIG90aGVyKSB7Ci0gICAgICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICAgICAgICAgIGludCBoYXNoID0gMTsKLSAgICAgICAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICAgICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShOZXN0ZWRUd2ljZSBvdGhlcikgewotICAgICAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgICAgICAgICAgdWludCB0YWc7Ci0gICAgICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgIH0KLQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgfQotCi0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE5lZ2F0aXZlRW51bU1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8TmVnYXRpdmVFbnVtTWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE5lZ2F0aXZlRW51bU1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8TmVnYXRpdmVFbnVtTWVzc2FnZT4oKCkgPT4gbmV3IE5lZ2F0aXZlRW51bU1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxOZWdhdGl2ZUVudW1NZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5Vbml0dGVzdElzc3Vlc1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UoTmVnYXRpdmVFbnVtTWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgdmFsdWVfID0gb3RoZXIudmFsdWVfOwotICAgICAgdmFsdWVzXyA9IG90aGVyLnZhbHVlc18uQ2xvbmUoKTsKLSAgICAgIHBhY2tlZFZhbHVlc18gPSBvdGhlci5wYWNrZWRWYWx1ZXNfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE5lZ2F0aXZlRW51bU1lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IE5lZ2F0aXZlRW51bU1lc3NhZ2UodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ2YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bSB2YWx1ZV8gPSAwOwotICAgIHB1YmxpYyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bSBWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInZhbHVlcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVzRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPiBfcmVwZWF0ZWRfdmFsdWVzX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRW51bSgxNiwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bSkgeCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0+IHZhbHVlc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0+IFZhbHVlcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gdmFsdWVzXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicGFja2VkX3ZhbHVlcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkVmFsdWVzRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPiBfcmVwZWF0ZWRfcGFja2VkVmFsdWVzX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRW51bSgyNiwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLk5lZ2F0aXZlRW51bSkgeCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0+IHBhY2tlZFZhbHVlc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuTmVnYXRpdmVFbnVtPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0+IFBhY2tlZFZhbHVlcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGFja2VkVmFsdWVzXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgTmVnYXRpdmVFbnVtTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKE5lZ2F0aXZlRW51bU1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKFZhbHVlICE9IG90aGVyLlZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdmFsdWVzXy5FcXVhbHMob3RoZXIudmFsdWVzXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwYWNrZWRWYWx1ZXNfLkVxdWFscyhvdGhlci5wYWNrZWRWYWx1ZXNfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChWYWx1ZSAhPSAwKSBoYXNoIF49IFZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHZhbHVlc18uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGFja2VkVmFsdWVzXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoVmFsdWUgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgVmFsdWUpOwotICAgICAgfQotICAgICAgdmFsdWVzXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3ZhbHVlc19jb2RlYyk7Ci0gICAgICBwYWNrZWRWYWx1ZXNfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGFja2VkVmFsdWVzX2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoVmFsdWUgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKChpbnQpIFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gdmFsdWVzXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF92YWx1ZXNfY29kZWMpOwotICAgICAgc2l6ZSArPSBwYWNrZWRWYWx1ZXNfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3BhY2tlZFZhbHVlc19jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTmVnYXRpdmVFbnVtTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlZhbHVlICE9IDApIHsKLSAgICAgICAgVmFsdWUgPSBvdGhlci5WYWx1ZTsKLSAgICAgIH0KLSAgICAgIHZhbHVlc18uQWRkKG90aGVyLnZhbHVlc18pOwotICAgICAgcGFja2VkVmFsdWVzXy5BZGQob3RoZXIucGFja2VkVmFsdWVzXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICB2YWx1ZV8gPSAoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5OZWdhdGl2ZUVudW0pIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODoKLSAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICB2YWx1ZXNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdmFsdWVzX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI2OgotICAgICAgICAgIGNhc2UgMjQ6IHsKLSAgICAgICAgICAgIHBhY2tlZFZhbHVlc18uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9wYWNrZWRWYWx1ZXNfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRGVwcmVjYXRlZENoaWxkIDogcGI6OklNZXNzYWdlPERlcHJlY2F0ZWRDaGlsZD4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPERlcHJlY2F0ZWRDaGlsZD4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxEZXByZWNhdGVkQ2hpbGQ+KCgpID0+IG5ldyBEZXByZWNhdGVkQ2hpbGQoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxEZXByZWNhdGVkQ2hpbGQ+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXR0ZXN0SXNzdWVzUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVwcmVjYXRlZENoaWxkKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBEZXByZWNhdGVkQ2hpbGQoRGVwcmVjYXRlZENoaWxkIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIERlcHJlY2F0ZWRDaGlsZCBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRGVwcmVjYXRlZENoaWxkKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRGVwcmVjYXRlZENoaWxkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRGVwcmVjYXRlZENoaWxkIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRGVwcmVjYXRlZENoaWxkIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSA6IHBiOjpJTWVzc2FnZTxEZXByZWNhdGVkRmllbGRzTWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlPigoKSA9PiBuZXcgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxEZXByZWNhdGVkRmllbGRzTWVzc2FnZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdHRlc3RJc3N1ZXNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBEZXByZWNhdGVkRmllbGRzTWVzc2FnZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UoRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2Ugb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHByaW1pdGl2ZVZhbHVlXyA9IG90aGVyLnByaW1pdGl2ZVZhbHVlXzsKLSAgICAgIHByaW1pdGl2ZUFycmF5XyA9IG90aGVyLnByaW1pdGl2ZUFycmF5Xy5DbG9uZSgpOwotICAgICAgTWVzc2FnZVZhbHVlID0gb3RoZXIubWVzc2FnZVZhbHVlXyAhPSBudWxsID8gb3RoZXIuTWVzc2FnZVZhbHVlLkNsb25lKCkgOiBudWxsOwotICAgICAgbWVzc2FnZUFycmF5XyA9IG90aGVyLm1lc3NhZ2VBcnJheV8uQ2xvbmUoKTsKLSAgICAgIGVudW1WYWx1ZV8gPSBvdGhlci5lbnVtVmFsdWVfOwotICAgICAgZW51bUFycmF5XyA9IG90aGVyLmVudW1BcnJheV8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiUHJpbWl0aXZlVmFsdWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFByaW1pdGl2ZVZhbHVlRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgaW50IHByaW1pdGl2ZVZhbHVlXzsKLSAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgaW50IFByaW1pdGl2ZVZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiBwcmltaXRpdmVWYWx1ZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHByaW1pdGl2ZVZhbHVlXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiUHJpbWl0aXZlQXJyYXkiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFByaW1pdGl2ZUFycmF5RmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3ByaW1pdGl2ZUFycmF5X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoMTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcHJpbWl0aXZlQXJyYXlfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+KCk7Ci0gICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldCi0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IFByaW1pdGl2ZUFycmF5IHsKLSAgICAgIGdldCB7IHJldHVybiBwcmltaXRpdmVBcnJheV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIk1lc3NhZ2VWYWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZVZhbHVlRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQgbWVzc2FnZVZhbHVlXzsKLSAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQgTWVzc2FnZVZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlVmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBtZXNzYWdlVmFsdWVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJNZXNzYWdlQXJyYXkiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1lc3NhZ2VBcnJheUZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZD4gX3JlcGVhdGVkX21lc3NhZ2VBcnJheV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMzQsIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQ+IG1lc3NhZ2VBcnJheV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZENoaWxkPigpOwotICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQ+IE1lc3NhZ2VBcnJheSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWVzc2FnZUFycmF5XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiRW51bVZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBFbnVtVmFsdWVGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRFbnVtIGVudW1WYWx1ZV8gPSAwOwotICAgIFtnbG9iYWw6OlN5c3RlbS5PYnNvbGV0ZUF0dHJpYnV0ZSgpXQotICAgIHB1YmxpYyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRFbnVtIEVudW1WYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZW51bVZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZW51bVZhbHVlXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiRW51bUFycmF5IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBFbnVtQXJyYXlGaWVsZE51bWJlciA9IDY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bT4gX3JlcGVhdGVkX2VudW1BcnJheV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckVudW0oNTAsIHggPT4gKGludCkgeCwgeCA9PiAoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bSkgeCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bT4gZW51bUFycmF5XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bT4oKTsKLSAgICBbZ2xvYmFsOjpTeXN0ZW0uT2Jzb2xldGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuRGVwcmVjYXRlZEVudW0+IEVudW1BcnJheSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZW51bUFycmF5XzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRGVwcmVjYXRlZEZpZWxkc01lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhEZXByZWNhdGVkRmllbGRzTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoUHJpbWl0aXZlVmFsdWUgIT0gb3RoZXIuUHJpbWl0aXZlVmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwcmltaXRpdmVBcnJheV8uRXF1YWxzKG90aGVyLnByaW1pdGl2ZUFycmF5XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhNZXNzYWdlVmFsdWUsIG90aGVyLk1lc3NhZ2VWYWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFtZXNzYWdlQXJyYXlfLkVxdWFscyhvdGhlci5tZXNzYWdlQXJyYXlfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEVudW1WYWx1ZSAhPSBvdGhlci5FbnVtVmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFlbnVtQXJyYXlfLkVxdWFscyhvdGhlci5lbnVtQXJyYXlfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChQcmltaXRpdmVWYWx1ZSAhPSAwKSBoYXNoIF49IFByaW1pdGl2ZVZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHByaW1pdGl2ZUFycmF5Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG1lc3NhZ2VWYWx1ZV8gIT0gbnVsbCkgaGFzaCBePSBNZXNzYWdlVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gbWVzc2FnZUFycmF5Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEVudW1WYWx1ZSAhPSAwKSBoYXNoIF49IEVudW1WYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBlbnVtQXJyYXlfLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChQcmltaXRpdmVWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoUHJpbWl0aXZlVmFsdWUpOwotICAgICAgfQotICAgICAgcHJpbWl0aXZlQXJyYXlfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcHJpbWl0aXZlQXJyYXlfY29kZWMpOwotICAgICAgaWYgKG1lc3NhZ2VWYWx1ZV8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKE1lc3NhZ2VWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBtZXNzYWdlQXJyYXlfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfbWVzc2FnZUFycmF5X2NvZGVjKTsKLSAgICAgIGlmIChFbnVtVmFsdWUgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNDApOwotICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpIEVudW1WYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBlbnVtQXJyYXlfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfZW51bUFycmF5X2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoUHJpbWl0aXZlVmFsdWUgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShQcmltaXRpdmVWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHByaW1pdGl2ZUFycmF5Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9wcmltaXRpdmVBcnJheV9jb2RlYyk7Ci0gICAgICBpZiAobWVzc2FnZVZhbHVlXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoTWVzc2FnZVZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gbWVzc2FnZUFycmF5Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9tZXNzYWdlQXJyYXlfY29kZWMpOwotICAgICAgaWYgKEVudW1WYWx1ZSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgRW51bVZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gZW51bUFycmF5Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9lbnVtQXJyYXlfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKERlcHJlY2F0ZWRGaWVsZHNNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuUHJpbWl0aXZlVmFsdWUgIT0gMCkgewotICAgICAgICBQcmltaXRpdmVWYWx1ZSA9IG90aGVyLlByaW1pdGl2ZVZhbHVlOwotICAgICAgfQotICAgICAgcHJpbWl0aXZlQXJyYXlfLkFkZChvdGhlci5wcmltaXRpdmVBcnJheV8pOwotICAgICAgaWYgKG90aGVyLm1lc3NhZ2VWYWx1ZV8gIT0gbnVsbCkgewotICAgICAgICBpZiAobWVzc2FnZVZhbHVlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgbWVzc2FnZVZhbHVlXyA9IG5ldyBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLkRlcHJlY2F0ZWRDaGlsZCgpOwotICAgICAgICB9Ci0gICAgICAgIE1lc3NhZ2VWYWx1ZS5NZXJnZUZyb20ob3RoZXIuTWVzc2FnZVZhbHVlKTsKLSAgICAgIH0KLSAgICAgIG1lc3NhZ2VBcnJheV8uQWRkKG90aGVyLm1lc3NhZ2VBcnJheV8pOwotICAgICAgaWYgKG90aGVyLkVudW1WYWx1ZSAhPSAwKSB7Ci0gICAgICAgIEVudW1WYWx1ZSA9IG90aGVyLkVudW1WYWx1ZTsKLSAgICAgIH0KLSAgICAgIGVudW1BcnJheV8uQWRkKG90aGVyLmVudW1BcnJheV8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgUHJpbWl0aXZlVmFsdWUgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4OgotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgIHByaW1pdGl2ZUFycmF5Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3ByaW1pdGl2ZUFycmF5X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI2OiB7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZVZhbHVlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIG1lc3NhZ2VWYWx1ZV8gPSBuZXcgZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkQ2hpbGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKG1lc3NhZ2VWYWx1ZV8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzQ6IHsKLSAgICAgICAgICAgIG1lc3NhZ2VBcnJheV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9tZXNzYWdlQXJyYXlfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDA6IHsKLSAgICAgICAgICAgIGVudW1WYWx1ZV8gPSAoZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5EZXByZWNhdGVkRW51bSkgaW5wdXQuUmVhZEVudW0oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOgotICAgICAgICAgIGNhc2UgNDg6IHsKLSAgICAgICAgICAgIGVudW1BcnJheV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9lbnVtQXJyYXlfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgSXNzdWUgNDU6IGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi1jc2hhcnAtcG9ydC9pc3N1ZXMvZGV0YWlsP2lkPTQ1Ci0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBJdGVtRmllbGQgOiBwYjo6SU1lc3NhZ2U8SXRlbUZpZWxkPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8SXRlbUZpZWxkPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEl0ZW1GaWVsZD4oKCkgPT4gbmV3IEl0ZW1GaWVsZCgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEl0ZW1GaWVsZD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdHRlc3RJc3N1ZXNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzRdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBJdGVtRmllbGQoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEl0ZW1GaWVsZChJdGVtRmllbGQgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGl0ZW1fID0gb3RoZXIuaXRlbV87Ci0gICAgfQotCi0gICAgcHVibGljIEl0ZW1GaWVsZCBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgSXRlbUZpZWxkKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiaXRlbSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSXRlbUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGludCBpdGVtXzsKLSAgICBwdWJsaWMgaW50IEl0ZW0gewotICAgICAgZ2V0IHsgcmV0dXJuIGl0ZW1fOyB9Ci0gICAgICBzZXQgewotICAgICAgICBpdGVtXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgSXRlbUZpZWxkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoSXRlbUZpZWxkIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChJdGVtICE9IG90aGVyLkl0ZW0pIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoSXRlbSAhPSAwKSBoYXNoIF49IEl0ZW0uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKEl0ZW0gIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEl0ZW0pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChJdGVtICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoSXRlbSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oSXRlbUZpZWxkIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuSXRlbSAhPSAwKSB7Ci0gICAgICAgIEl0ZW0gPSBvdGhlci5JdGVtOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgSXRlbSA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgUmVzZXJ2ZWROYW1lcyA6IHBiOjpJTWVzc2FnZTxSZXNlcnZlZE5hbWVzPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8UmVzZXJ2ZWROYW1lcz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxSZXNlcnZlZE5hbWVzPigoKSA9PiBuZXcgUmVzZXJ2ZWROYW1lcygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFJlc2VydmVkTmFtZXM+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXR0ZXN0SXNzdWVzUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s1XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgUmVzZXJ2ZWROYW1lcygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgUmVzZXJ2ZWROYW1lcyhSZXNlcnZlZE5hbWVzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICB0eXBlc18gPSBvdGhlci50eXBlc187Ci0gICAgICBkZXNjcmlwdG9yXyA9IG90aGVyLmRlc2NyaXB0b3JfOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXNlcnZlZE5hbWVzIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBSZXNlcnZlZE5hbWVzKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidHlwZXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVzX0ZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGludCB0eXBlc187Ci0gICAgcHVibGljIGludCBUeXBlc18gewotICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVzXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgdHlwZXNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkZXNjcmlwdG9yIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEZXNjcmlwdG9yX0ZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIGludCBkZXNjcmlwdG9yXzsKLSAgICBwdWJsaWMgaW50IERlc2NyaXB0b3JfIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVzY3JpcHRvcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFJlc2VydmVkTmFtZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhSZXNlcnZlZE5hbWVzIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChUeXBlc18gIT0gb3RoZXIuVHlwZXNfKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRGVzY3JpcHRvcl8gIT0gb3RoZXIuRGVzY3JpcHRvcl8pIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoVHlwZXNfICE9IDApIGhhc2ggXj0gVHlwZXNfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRGVzY3JpcHRvcl8gIT0gMCkgaGFzaCBePSBEZXNjcmlwdG9yXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoVHlwZXNfICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihUeXBlc18pOwotICAgICAgfQotICAgICAgaWYgKERlc2NyaXB0b3JfICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoRGVzY3JpcHRvcl8pOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChUeXBlc18gIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShUeXBlc18pOwotICAgICAgfQotICAgICAgaWYgKERlc2NyaXB0b3JfICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoRGVzY3JpcHRvcl8pOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFJlc2VydmVkTmFtZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5UeXBlc18gIT0gMCkgewotICAgICAgICBUeXBlc18gPSBvdGhlci5UeXBlc187Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRGVzY3JpcHRvcl8gIT0gMCkgewotICAgICAgICBEZXNjcmlwdG9yXyA9IG90aGVyLkRlc2NyaXB0b3JfOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgVHlwZXNfID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgRGVzY3JpcHRvcl8gPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBSZXNlcnZlZE5hbWVzIG1lc3NhZ2UgdHlwZS48L3N1bW1hcnk+Ci0gICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgewotICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgLy8vICBGb3JjZSBhIG5lc3RlZCB0eXBlIGNhbGxlZCBUeXBlcwotICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU29tZU5lc3RlZFR5cGUgOiBwYjo6SU1lc3NhZ2U8U29tZU5lc3RlZFR5cGU+IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8U29tZU5lc3RlZFR5cGU+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8U29tZU5lc3RlZFR5cGU+KCgpID0+IG5ldyBTb21lTmVzdGVkVHlwZSgpKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxTb21lTmVzdGVkVHlwZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpVbml0VGVzdC5Jc3N1ZXMuVGVzdFByb3Rvcy5SZXNlcnZlZE5hbWVzLkRlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07IH0KLSAgICAgICAgfQotCi0gICAgICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgU29tZU5lc3RlZFR5cGUoKSB7Ci0gICAgICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgICAgIHB1YmxpYyBTb21lTmVzdGVkVHlwZShTb21lTmVzdGVkVHlwZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFNvbWVOZXN0ZWRUeXBlIENsb25lKCkgewotICAgICAgICAgIHJldHVybiBuZXcgU29tZU5lc3RlZFR5cGUodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBTb21lTmVzdGVkVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoU29tZU5lc3RlZFR5cGUgb3RoZXIpIHsKLSAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oU29tZU5lc3RlZFR5cGUgb3RoZXIpIHsKLSAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgVGhlc2UgZmllbGRzIGFyZSBkZWxpYmVyYXRlbHkgbm90IGRlY2xhcmVkIGluIG51bWVyaWMKLSAgLy8vICBvcmRlciwgYW5kIHRoZSBvbmVvZiBmaWVsZHMgYXJlbid0IGNvbnRpZ3VvdXMgZWl0aGVyLgotICAvLy8gIFRoaXMgYWxsb3dzIGZvciByZWFzb25hYmx5IHJvYnVzdCB0ZXN0cyBvZiBKU09OIG91dHB1dAotICAvLy8gIG9yZGVyaW5nLgotICAvLy8gIFRlc3RGaWVsZE9yZGVyaW5ncyBpbiB1bml0dGVzdF9wcm90bzMucHJvdG8gaXMgc2ltaWxhciwKLSAgLy8vICBidXQgZG9lc24ndCBpbmNsdWRlIG9uZW9mcy4KLSAgLy8vICBUT0RPOiBDb25zaWRlciBhZGRpbmcgb25lb2ZzIHRvIFRlc3RGaWVsZE9yZGVyaW5ncywgYWx0aG91Z2gKLSAgLy8vICB0aGF0IHdpbGwgcmVxdWlyZSBmaXhpbmcgb3RoZXIgdGVzdHMgaW4gbXVsdGlwbGUgcGxhdGZvcm1zLgotICAvLy8gIEFsdGVybmF0aXZlbHksIGNvbnNpZGVyIGp1c3QgYWRkaW5nIHRoaXMgdG8KLSAgLy8vICB1bml0dGVzdF9wcm90bzMucHJvdG8gaWYgbXVsdGlwbGUgcGxhdGZvcm1zIHdhbnQgaXQuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0SnNvbkZpZWxkT3JkZXJpbmcgOiBwYjo6SU1lc3NhZ2U8VGVzdEpzb25GaWVsZE9yZGVyaW5nPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEpzb25GaWVsZE9yZGVyaW5nPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RKc29uRmllbGRPcmRlcmluZz4oKCkgPT4gbmV3IFRlc3RKc29uRmllbGRPcmRlcmluZygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RKc29uRmllbGRPcmRlcmluZz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6VW5pdFRlc3QuSXNzdWVzLlRlc3RQcm90b3MuVW5pdHRlc3RJc3N1ZXNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzZdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0SnNvbkZpZWxkT3JkZXJpbmcoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3RKc29uRmllbGRPcmRlcmluZyhUZXN0SnNvbkZpZWxkT3JkZXJpbmcgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHBsYWluSW50MzJfID0gb3RoZXIucGxhaW5JbnQzMl87Ci0gICAgICBwbGFpblN0cmluZ18gPSBvdGhlci5wbGFpblN0cmluZ187Ci0gICAgICBzd2l0Y2ggKG90aGVyLk8xQ2FzZSkgewotICAgICAgICBjYXNlIE8xT25lb2ZDYXNlLk8xU3RyaW5nOgotICAgICAgICAgIE8xU3RyaW5nID0gb3RoZXIuTzFTdHJpbmc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTzFPbmVvZkNhc2UuTzFJbnQzMjoKLSAgICAgICAgICBPMUludDMyID0gb3RoZXIuTzFJbnQzMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgc3dpdGNoIChvdGhlci5PMkNhc2UpIHsKLSAgICAgICAgY2FzZSBPMk9uZW9mQ2FzZS5PMkludDMyOgotICAgICAgICAgIE8ySW50MzIgPSBvdGhlci5PMkludDMyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE8yT25lb2ZDYXNlLk8yU3RyaW5nOgotICAgICAgICAgIE8yU3RyaW5nID0gb3RoZXIuTzJTdHJpbmc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEpzb25GaWVsZE9yZGVyaW5nIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0SnNvbkZpZWxkT3JkZXJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwbGFpbl9pbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGxhaW5JbnQzMkZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIGludCBwbGFpbkludDMyXzsKLSAgICBwdWJsaWMgaW50IFBsYWluSW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHBsYWluSW50MzJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBwbGFpbkludDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibzFfc3RyaW5nIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPMVN0cmluZ0ZpZWxkTnVtYmVyID0gMjsKLSAgICBwdWJsaWMgc3RyaW5nIE8xU3RyaW5nIHsKLSAgICAgIGdldCB7IHJldHVybiBvMUNhc2VfID09IE8xT25lb2ZDYXNlLk8xU3RyaW5nID8gKHN0cmluZykgbzFfIDogIiI7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG8xXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgICAgbzFDYXNlXyA9IE8xT25lb2ZDYXNlLk8xU3RyaW5nOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibzFfaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE8xSW50MzJGaWVsZE51bWJlciA9IDU7Ci0gICAgcHVibGljIGludCBPMUludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBvMUNhc2VfID09IE8xT25lb2ZDYXNlLk8xSW50MzIgPyAoaW50KSBvMV8gOiAwOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvMV8gPSB2YWx1ZTsKLSAgICAgICAgbzFDYXNlXyA9IE8xT25lb2ZDYXNlLk8xSW50MzI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwbGFpbl9zdHJpbmciIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBsYWluU3RyaW5nRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIHBsYWluU3RyaW5nXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgUGxhaW5TdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIHBsYWluU3RyaW5nXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgcGxhaW5TdHJpbmdfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibzJfaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE8ySW50MzJGaWVsZE51bWJlciA9IDY7Ci0gICAgcHVibGljIGludCBPMkludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBvMkNhc2VfID09IE8yT25lb2ZDYXNlLk8ySW50MzIgPyAoaW50KSBvMl8gOiAwOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvMl8gPSB2YWx1ZTsKLSAgICAgICAgbzJDYXNlXyA9IE8yT25lb2ZDYXNlLk8ySW50MzI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvMl9zdHJpbmciIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE8yU3RyaW5nRmllbGROdW1iZXIgPSAzOwotICAgIHB1YmxpYyBzdHJpbmcgTzJTdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIG8yQ2FzZV8gPT0gTzJPbmVvZkNhc2UuTzJTdHJpbmcgPyAoc3RyaW5nKSBvMl8gOiAiIjsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbzJfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgICBvMkNhc2VfID0gTzJPbmVvZkNhc2UuTzJTdHJpbmc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBvYmplY3QgbzFfOwotICAgIC8vLyA8c3VtbWFyeT5FbnVtIG9mIHBvc3NpYmxlIGNhc2VzIGZvciB0aGUgIm8xIiBvbmVvZi48L3N1bW1hcnk+Ci0gICAgcHVibGljIGVudW0gTzFPbmVvZkNhc2UgewotICAgICAgTm9uZSA9IDAsCi0gICAgICBPMVN0cmluZyA9IDIsCi0gICAgICBPMUludDMyID0gNSwKLSAgICB9Ci0gICAgcHJpdmF0ZSBPMU9uZW9mQ2FzZSBvMUNhc2VfID0gTzFPbmVvZkNhc2UuTm9uZTsKLSAgICBwdWJsaWMgTzFPbmVvZkNhc2UgTzFDYXNlIHsKLSAgICAgIGdldCB7IHJldHVybiBvMUNhc2VfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgQ2xlYXJPMSgpIHsKLSAgICAgIG8xQ2FzZV8gPSBPMU9uZW9mQ2FzZS5Ob25lOwotICAgICAgbzFfID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIG9iamVjdCBvMl87Ci0gICAgLy8vIDxzdW1tYXJ5PkVudW0gb2YgcG9zc2libGUgY2FzZXMgZm9yIHRoZSAibzIiIG9uZW9mLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBPMk9uZW9mQ2FzZSB7Ci0gICAgICBOb25lID0gMCwKLSAgICAgIE8ySW50MzIgPSA2LAotICAgICAgTzJTdHJpbmcgPSAzLAotICAgIH0KLSAgICBwcml2YXRlIE8yT25lb2ZDYXNlIG8yQ2FzZV8gPSBPMk9uZW9mQ2FzZS5Ob25lOwotICAgIHB1YmxpYyBPMk9uZW9mQ2FzZSBPMkNhc2UgewotICAgICAgZ2V0IHsgcmV0dXJuIG8yQ2FzZV87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBDbGVhck8yKCkgewotICAgICAgbzJDYXNlXyA9IE8yT25lb2ZDYXNlLk5vbmU7Ci0gICAgICBvMl8gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdEpzb25GaWVsZE9yZGVyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdEpzb25GaWVsZE9yZGVyaW5nIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChQbGFpbkludDMyICE9IG90aGVyLlBsYWluSW50MzIpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPMVN0cmluZyAhPSBvdGhlci5PMVN0cmluZykgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE8xSW50MzIgIT0gb3RoZXIuTzFJbnQzMikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFBsYWluU3RyaW5nICE9IG90aGVyLlBsYWluU3RyaW5nKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTzJJbnQzMiAhPSBvdGhlci5PMkludDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTzJTdHJpbmcgIT0gb3RoZXIuTzJTdHJpbmcpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPMUNhc2UgIT0gb3RoZXIuTzFDYXNlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTzJDYXNlICE9IG90aGVyLk8yQ2FzZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChQbGFpbkludDMyICE9IDApIGhhc2ggXj0gUGxhaW5JbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG8xQ2FzZV8gPT0gTzFPbmVvZkNhc2UuTzFTdHJpbmcpIGhhc2ggXj0gTzFTdHJpbmcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvMUNhc2VfID09IE8xT25lb2ZDYXNlLk8xSW50MzIpIGhhc2ggXj0gTzFJbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFBsYWluU3RyaW5nLkxlbmd0aCAhPSAwKSBoYXNoIF49IFBsYWluU3RyaW5nLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAobzJDYXNlXyA9PSBPMk9uZW9mQ2FzZS5PMkludDMyKSBoYXNoIF49IE8ySW50MzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvMkNhc2VfID09IE8yT25lb2ZDYXNlLk8yU3RyaW5nKSBoYXNoIF49IE8yU3RyaW5nLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IChpbnQpIG8xQ2FzZV87Ci0gICAgICBoYXNoIF49IChpbnQpIG8yQ2FzZV87Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChQbGFpblN0cmluZy5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoUGxhaW5TdHJpbmcpOwotICAgICAgfQotICAgICAgaWYgKG8xQ2FzZV8gPT0gTzFPbmVvZkNhc2UuTzFTdHJpbmcpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKE8xU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGlmIChvMkNhc2VfID09IE8yT25lb2ZDYXNlLk8yU3RyaW5nKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhPMlN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoUGxhaW5JbnQzMiAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzMik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKFBsYWluSW50MzIpOwotICAgICAgfQotICAgICAgaWYgKG8xQ2FzZV8gPT0gTzFPbmVvZkNhc2UuTzFJbnQzMikgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNDApOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihPMUludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvMkNhc2VfID09IE8yT25lb2ZDYXNlLk8ySW50MzIpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQ4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoTzJJbnQzMik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKFBsYWluSW50MzIgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShQbGFpbkludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvMUNhc2VfID09IE8xT25lb2ZDYXNlLk8xU3RyaW5nKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShPMVN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAobzFDYXNlXyA9PSBPMU9uZW9mQ2FzZS5PMUludDMyKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKE8xSW50MzIpOwotICAgICAgfQotICAgICAgaWYgKFBsYWluU3RyaW5nLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShQbGFpblN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAobzJDYXNlXyA9PSBPMk9uZW9mQ2FzZS5PMkludDMyKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKE8ySW50MzIpOwotICAgICAgfQotICAgICAgaWYgKG8yQ2FzZV8gPT0gTzJPbmVvZkNhc2UuTzJTdHJpbmcpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE8yU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0SnNvbkZpZWxkT3JkZXJpbmcgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5QbGFpbkludDMyICE9IDApIHsKLSAgICAgICAgUGxhaW5JbnQzMiA9IG90aGVyLlBsYWluSW50MzI7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuUGxhaW5TdHJpbmcuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgUGxhaW5TdHJpbmcgPSBvdGhlci5QbGFpblN0cmluZzsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAob3RoZXIuTzFDYXNlKSB7Ci0gICAgICAgIGNhc2UgTzFPbmVvZkNhc2UuTzFTdHJpbmc6Ci0gICAgICAgICAgTzFTdHJpbmcgPSBvdGhlci5PMVN0cmluZzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPMU9uZW9mQ2FzZS5PMUludDMyOgotICAgICAgICAgIE8xSW50MzIgPSBvdGhlci5PMUludDMyOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBzd2l0Y2ggKG90aGVyLk8yQ2FzZSkgewotICAgICAgICBjYXNlIE8yT25lb2ZDYXNlLk8ySW50MzI6Ci0gICAgICAgICAgTzJJbnQzMiA9IG90aGVyLk8ySW50MzI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgTzJPbmVvZkNhc2UuTzJTdHJpbmc6Ci0gICAgICAgICAgTzJTdHJpbmcgPSBvdGhlci5PMlN0cmluZzsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIFBsYWluU3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIE8xU3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIE8yU3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzI6IHsKLSAgICAgICAgICAgIFBsYWluSW50MzIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQwOiB7Ci0gICAgICAgICAgICBPMUludDMyID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0ODogewotICAgICAgICAgICAgTzJJbnQzMiA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdEpzb25OYW1lIDogcGI6OklNZXNzYWdlPFRlc3RKc29uTmFtZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RKc29uTmFtZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0SnNvbk5hbWU+KCgpID0+IG5ldyBUZXN0SnNvbk5hbWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0SnNvbk5hbWU+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6OlVuaXRUZXN0Lklzc3Vlcy5UZXN0UHJvdG9zLlVuaXR0ZXN0SXNzdWVzUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s3XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEpzb25OYW1lKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUZXN0SnNvbk5hbWUoVGVzdEpzb25OYW1lIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBuYW1lXyA9IG90aGVyLm5hbWVfOwotICAgICAgZGVzY3JpcHRpb25fID0gb3RoZXIuZGVzY3JpcHRpb25fOwotICAgICAgZ3VpZF8gPSBvdGhlci5ndWlkXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEpzb25OYW1lIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0SnNvbk5hbWUodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgTWVzc2FnZSBmb3IgdGVzdGluZyB0aGUgZWZmZWN0cyBmb3Igb2YgdGhlIGpzb25fbmFtZSBvcHRpb24KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGVzY3JpcHRpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERlc2NyaXB0aW9uRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RyaW5nIGRlc2NyaXB0aW9uXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgRGVzY3JpcHRpb24gewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0aW9uXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVzY3JpcHRpb25fID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZ3VpZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgR3VpZEZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIHN0cmluZyBndWlkXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgR3VpZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ3VpZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGd1aWRfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdEpzb25OYW1lKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdEpzb25OYW1lIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChOYW1lICE9IG90aGVyLk5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChEZXNjcmlwdGlvbiAhPSBvdGhlci5EZXNjcmlwdGlvbikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEd1aWQgIT0gb3RoZXIuR3VpZCkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IE5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChEZXNjcmlwdGlvbi5MZW5ndGggIT0gMCkgaGFzaCBePSBEZXNjcmlwdGlvbi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEd1aWQuTGVuZ3RoICE9IDApIGhhc2ggXj0gR3VpZC5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoRGVzY3JpcHRpb24uTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKERlc2NyaXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIGlmIChHdWlkLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhHdWlkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoRGVzY3JpcHRpb24uTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKERlc2NyaXB0aW9uKTsKLSAgICAgIH0KLSAgICAgIGlmIChHdWlkLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShHdWlkKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0SnNvbk5hbWUgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkRlc2NyaXB0aW9uLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIERlc2NyaXB0aW9uID0gb3RoZXIuRGVzY3JpcHRpb247Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuR3VpZC5MZW5ndGggIT0gMCkgewotICAgICAgICBHdWlkID0gb3RoZXIuR3VpZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBOYW1lID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIERlc2NyaXB0aW9uID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIEd1aWQgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gICNlbmRyZWdpb24KLQotfQotCi0jZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RQcm90b3MvVW5pdHRlc3RQcm90bzMuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RQcm90b3MvVW5pdHRlc3RQcm90bzMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZDE1OWIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9UZXN0UHJvdG9zL1VuaXR0ZXN0UHJvdG8zLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjA2NCArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnByb3RvCi0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxCi0jcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCi0KLXVzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWY7Ci11c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5Db2xsZWN0aW9uczsKLXVzaW5nIHBiciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb247Ci11c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zIHsKLQotICAvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciByZWZsZWN0aW9uIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBmcm9tIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBVbml0dGVzdFByb3RvM1JlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvMy5wcm90bzwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICBzdGF0aWMgVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uKCkgewotICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKAotICAgICAgICAgIHN0cmluZy5Db25jYXQoCi0gICAgICAgICAgICAiQ2lWbmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZFc1cGRIUmxjM1JmY0hKdmRHOHpMbkJ5YjNSdkVoRndjbTkwIiwKLSAgICAgICAgICAgICJiMkoxWmw5MWJtbDBkR1Z6ZEJvc1oyOXZaMnhsTDNCeWIzUnZZblZtTDNWdWFYUjBaWE4wWDJsdGNHOXkiLAotICAgICAgICAgICAgImRGOXdjbTkwYnpNdWNISnZkRzhpOEE4S0RGUmxjM1JCYkd4VWVYQmxjeElVQ2d4emFXNW5iR1ZmYVc1MCIsCi0gICAgICAgICAgICAiTXpJWUFTQUJLQVVTRkFvTWMybHVaMnhsWDJsdWREWTBHQUlnQVNnREVoVUtEWE5wYm1kc1pWOTFhVzUwIiwKLSAgICAgICAgICAgICJNeklZQXlBQktBMFNGUW9OYzJsdVoyeGxYM1ZwYm5RMk5CZ0VJQUVvQkJJVkNnMXphVzVuYkdWZmMybHUiLAotICAgICAgICAgICAgImRETXlHQVVnQVNnUkVoVUtEWE5wYm1kc1pWOXphVzUwTmpRWUJpQUJLQklTRmdvT2MybHVaMnhsWDJacCIsCi0gICAgICAgICAgICAiZUdWa016SVlCeUFCS0FjU0Znb09jMmx1WjJ4bFgyWnBlR1ZrTmpRWUNDQUJLQVlTRndvUGMybHVaMnhsIiwKLSAgICAgICAgICAgICJYM05tYVhobFpETXlHQWtnQVNnUEVoY0tEM05wYm1kc1pWOXpabWw0WldRMk5CZ0tJQUVvRUJJVUNneHoiLAotICAgICAgICAgICAgImFXNW5iR1ZmWm14dllYUVlDeUFCS0FJU0ZRb05jMmx1WjJ4bFgyUnZkV0pzWlJnTUlBRW9BUklUQ2d0eiIsCi0gICAgICAgICAgICAiYVc1bmJHVmZZbTl2YkJnTklBRW9DQklWQ2cxemFXNW5iR1ZmYzNSeWFXNW5HQTRnQVNnSkVoUUtESE5wIiwKLSAgICAgICAgICAgICJibWRzWlY5aWVYUmxjeGdQSUFFb0RCSk1DaFZ6YVc1bmJHVmZibVZ6ZEdWa1gyMWxjM05oWjJVWUVpQUIiLAotICAgICAgICAgICAgIktBc3lMUzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMFFXeHNWSGx3WlhNdVRtVnpkR1ZrVFdWeiIsCi0gICAgICAgICAgICAiYzJGblpSSkJDaFp6YVc1bmJHVmZabTl5WldsbmJsOXRaWE56WVdkbEdCTWdBU2dMTWlFdWNISnZkRzlpIiwKLSAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1Um05eVpXbG5iazFsYzNOaFoyVVNSZ29WYzJsdVoyeGxYMmx0Y0c5eWRGOXQiLAotICAgICAgICAgICAgIlpYTnpZV2RsR0JRZ0FTZ0xNaWN1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1JmYVcxd2IzSjBMa2x0Y0c5eSIsCi0gICAgICAgICAgICAiZEUxbGMzTmhaMlVTUmdvU2MybHVaMnhsWDI1bGMzUmxaRjlsYm5WdEdCVWdBU2dPTWlvdWNISnZkRzlpIiwKLSAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1VkdWemRFRnNiRlI1Y0dWekxrNWxjM1JsWkVWdWRXMFNPd29UYzJsdVoyeGwiLAotICAgICAgICAgICAgIlgyWnZjbVZwWjI1ZlpXNTFiUmdXSUFFb0RqSWVMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2Y21WcCIsCi0gICAgICAgICAgICAiWjI1RmJuVnRFa0FLRW5OcGJtZHNaVjlwYlhCdmNuUmZaVzUxYlJnWElBRW9EaklrTG5CeWIzUnZZblZtIiwKLSAgICAgICAgICAgICJYM1Z1YVhSMFpYTjBYMmx0Y0c5eWRDNUpiWEJ2Y25SRmJuVnRFbE1LSEhOcGJtZHNaVjl3ZFdKc2FXTmYiLAotICAgICAgICAgICAgImFXMXdiM0owWDIxbGMzTmhaMlVZR2lBQktBc3lMUzV3Y205MGIySjFabDkxYm1sMGRHVnpkRjlwYlhCdiIsCi0gICAgICAgICAgICAiY25RdVVIVmliR2xqU1cxd2IzSjBUV1Z6YzJGblpSSVdDZzV5WlhCbFlYUmxaRjlwYm5Rek1oZ2ZJQU1vIiwKLSAgICAgICAgICAgICJCUklXQ2c1eVpYQmxZWFJsWkY5cGJuUTJOQmdnSUFNb0F4SVhDZzl5WlhCbFlYUmxaRjkxYVc1ME16SVkiLAotICAgICAgICAgICAgIklTQURLQTBTRndvUGNtVndaV0YwWldSZmRXbHVkRFkwR0NJZ0F5Z0VFaGNLRDNKbGNHVmhkR1ZrWDNOcCIsCi0gICAgICAgICAgICAiYm5Rek1oZ2pJQU1vRVJJWENnOXlaWEJsWVhSbFpGOXphVzUwTmpRWUpDQURLQklTR0FvUWNtVndaV0YwIiwKLSAgICAgICAgICAgICJaV1JmWm1sNFpXUXpNaGdsSUFNb0J4SVlDaEJ5WlhCbFlYUmxaRjltYVhobFpEWTBHQ1lnQXlnR0Voa0siLAotICAgICAgICAgICAgIkVYSmxjR1ZoZEdWa1gzTm1hWGhsWkRNeUdDY2dBeWdQRWhrS0VYSmxjR1ZoZEdWa1gzTm1hWGhsWkRZMCIsCi0gICAgICAgICAgICAiR0NnZ0F5Z1FFaFlLRG5KbGNHVmhkR1ZrWDJac2IyRjBHQ2tnQXlnQ0VoY0tEM0psY0dWaGRHVmtYMlJ2IiwKLSAgICAgICAgICAgICJkV0pzWlJncUlBTW9BUklWQ2cxeVpYQmxZWFJsWkY5aWIyOXNHQ3NnQXlnSUVoY0tEM0psY0dWaGRHVmsiLAotICAgICAgICAgICAgIlgzTjBjbWx1Wnhnc0lBTW9DUklXQ2c1eVpYQmxZWFJsWkY5aWVYUmxjeGd0SUFNb0RCSk9DaGR5WlhCbCIsCi0gICAgICAgICAgICAiWVhSbFpGOXVaWE4wWldSZmJXVnpjMkZuWlJnd0lBTW9Dekl0TG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wIiwKLSAgICAgICAgICAgICJMbFJsYzNSQmJHeFVlWEJsY3k1T1pYTjBaV1JOWlhOellXZGxFa01LR0hKbGNHVmhkR1ZrWDJadmNtVnAiLAotICAgICAgICAgICAgIloyNWZiV1Z6YzJGblpSZ3hJQU1vQ3pJaExuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrWnZjbVZwWjI1TiIsCi0gICAgICAgICAgICAiWlhOellXZGxFa2dLRjNKbGNHVmhkR1ZrWDJsdGNHOXlkRjl0WlhOellXZGxHRElnQXlnTE1pY3VjSEp2IiwKLSAgICAgICAgICAgICJkRzlpZFdaZmRXNXBkSFJsYzNSZmFXMXdiM0owTGtsdGNHOXlkRTFsYzNOaFoyVVNTQW9VY21Wd1pXRjAiLAotICAgICAgICAgICAgIlpXUmZibVZ6ZEdWa1gyVnVkVzBZTXlBREtBNHlLaTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVVWlhOMCIsCi0gICAgICAgICAgICAiUVd4c1ZIbHdaWE11VG1WemRHVmtSVzUxYlJJOUNoVnlaWEJsWVhSbFpGOW1iM0psYVdkdVgyVnVkVzBZIiwKLSAgICAgICAgICAgICJOQ0FES0E0eUhpNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUdiM0psYVdkdVJXNTFiUkpDQ2hSeVpYQmwiLAotICAgICAgICAgICAgIllYUmxaRjlwYlhCdmNuUmZaVzUxYlJnMUlBTW9EaklrTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJsdCIsCi0gICAgICAgICAgICAiY0c5eWRDNUpiWEJ2Y25SRmJuVnRFbFVLSG5KbGNHVmhkR1ZrWDNCMVlteHBZMTlwYlhCdmNuUmZiV1Z6IiwKLSAgICAgICAgICAgICJjMkZuWlJnMklBTW9Dekl0TG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wWDJsdGNHOXlkQzVRZFdKc2FXTkoiLAotICAgICAgICAgICAgImJYQnZjblJOWlhOellXZGxFaFlLREc5dVpXOW1YM1ZwYm5Rek1oaHZJQUVvRFVnQUVrMEtGRzl1Wlc5bSIsCi0gICAgICAgICAgICAiWDI1bGMzUmxaRjl0WlhOellXZGxHSEFnQVNnTE1pMHVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVWR1Z6IiwKLSAgICAgICAgICAgICJkRUZzYkZSNWNHVnpMazVsYzNSbFpFMWxjM05oWjJWSUFCSVdDZ3h2Ym1WdlpsOXpkSEpwYm1jWWNTQUIiLAotICAgICAgICAgICAgIktBbElBQklWQ2d0dmJtVnZabDlpZVhSbGN4aHlJQUVvREVnQUdoc0tEVTVsYzNSbFpFMWxjM05oWjJVUyIsCi0gICAgICAgICAgICAiQ2dvQ1ltSVlBU0FCS0FVaVZnb0tUbVZ6ZEdWa1JXNTFiUkliQ2hkT1JWTlVSVVJmUlU1VlRWOVZUbE5RIiwKLSAgICAgICAgICAgICJSVU5KUmtsRlJCQUFFZ2NLQTBaUFR4QUJFZ2NLQTBKQlVoQUNFZ2NLQTBKQldoQURFaEFLQTA1RlJ4RC8iLAotICAgICAgICAgICAgIi8vLy8vLy8vLy84QlFnMEtDMjl1Wlc5bVgyWnBaV3hrSXJzQkNoSk9aWE4wWldSVVpYTjBRV3hzVkhsdyIsCi0gICAgICAgICAgICAiWlhNU05Bb0ZZMmhwYkdRWUFTQUJLQXN5SlM1d2NtOTBiMkoxWmw5MWJtbDBkR1Z6ZEM1T1pYTjBaV1JVIiwKLSAgICAgICAgICAgICJaWE4wUVd4c1ZIbHdaWE1TTUFvSGNHRjViRzloWkJnQ0lBRW9DeklmTG5CeWIzUnZZblZtWDNWdWFYUjAiLAotICAgICAgICAgICAgIlpYTjBMbFJsYzNSQmJHeFVlWEJsY3hJOUNnNXlaWEJsWVhSbFpGOWphR2xzWkJnRElBTW9DeklsTG5CeSIsCi0gICAgICAgICAgICAiYjNSdlluVm1YM1Z1YVhSMFpYTjBMazVsYzNSbFpGUmxjM1JCYkd4VWVYQmxjeUkwQ2hSVVpYTjBSR1Z3IiwKLSAgICAgICAgICAgICJjbVZqWVhSbFpFWnBaV3hrY3hJY0NoQmtaWEJ5WldOaGRHVmtYMmx1ZERNeUdBRWdBU2dGUWdJWUFTSWIiLAotICAgICAgICAgICAgIkNnNUdiM0psYVdkdVRXVnpjMkZuWlJJSkNnRmpHQUVnQVNnRklqQUtFbFJsYzNSU1pYTmxjblpsWkVacCIsCi0gICAgICAgICAgICAiWld4a2Mwb0VDQUlRQTBvRUNBOFFFRW9FQ0FrUURGSURZbUZ5VWdOaVlYb2lXZ29SVkdWemRFWnZjbVZwIiwKLSAgICAgICAgICAgICJaMjVPWlhOMFpXUVNSUW9PWm05eVpXbG5ibDl1WlhOMFpXUVlBU0FCS0FzeUxTNXdjbTkwYjJKMVpsOTEiLAotICAgICAgICAgICAgImJtbDBkR1Z6ZEM1VVpYTjBRV3hzVkhsd1pYTXVUbVZ6ZEdWa1RXVnpjMkZuWlNJMENoaFVaWE4wVW1WaCIsCi0gICAgICAgICAgICAiYkd4NVRHRnlaMlZVWVdkT2RXMWlaWElTQ1FvQllSZ0JJQUVvQlJJTkNnSmlZaGovLy85L0lBRW9CU0pWIiwKLSAgICAgICAgICAgICJDaFJVWlhOMFVtVmpkWEp6YVhabFRXVnpjMkZuWlJJeUNnRmhHQUVnQVNnTE1pY3VjSEp2ZEc5aWRXWmYiLAotICAgICAgICAgICAgImRXNXBkSFJsYzNRdVZHVnpkRkpsWTNWeWMybDJaVTFsYzNOaFoyVVNDUW9CYVJnQ0lBRW9CU0pMQ2hSVSIsCi0gICAgICAgICAgICAiWlhOMFRYVjBkV0ZzVW1WamRYSnphVzl1UVJJekNnSmlZaGdCSUFFb0N6SW5MbkJ5YjNSdlluVm1YM1Z1IiwKLSAgICAgICAgICAgICJhWFIwWlhOMExsUmxjM1JOZFhSMVlXeFNaV04xY25OcGIyNUNJbUlLRkZSbGMzUk5kWFIxWVd4U1pXTjEiLAotICAgICAgICAgICAgImNuTnBiMjVDRWpJS0FXRVlBU0FCS0FzeUp5NXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVFhWMCIsCi0gICAgICAgICAgICAiZFdGc1VtVmpkWEp6YVc5dVFSSVdDZzV2Y0hScGIyNWhiRjlwYm5Rek1oZ0NJQUVvQlNMckFnb1hWR1Z6IiwKLSAgICAgICAgICAgICJkRU5oYldWc1EyRnpaVVpwWld4a1RtRnRaWE1TRmdvT1VISnBiV2wwYVhabFJtbGxiR1FZQVNBQktBVVMiLAotICAgICAgICAgICAgIkV3b0xVM1J5YVc1blJtbGxiR1FZQWlBQktBa1NNUW9KUlc1MWJVWnBaV3hrR0FNZ0FTZ09NaDR1Y0hKdiIsCi0gICAgICAgICAgICAiZEc5aWRXWmZkVzVwZEhSbGMzUXVSbTl5WldsbmJrVnVkVzBTTndvTVRXVnpjMkZuWlVacFpXeGtHQVFnIiwKLSAgICAgICAgICAgICJBU2dMTWlFdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVJtOXlaV2xuYmsxbGMzTmhaMlVTSGdvV1VtVnciLAotICAgICAgICAgICAgIlpXRjBaV1JRY21sdGFYUnBkbVZHYVdWc1pCZ0hJQU1vQlJJYkNoTlNaWEJsWVhSbFpGTjBjbWx1WjBacCIsCi0gICAgICAgICAgICAiWld4a0dBZ2dBeWdKRWprS0VWSmxjR1ZoZEdWa1JXNTFiVVpwWld4a0dBa2dBeWdPTWg0dWNISnZkRzlpIiwKLSAgICAgICAgICAgICJkV1pmZFc1cGRIUmxjM1F1Um05eVpXbG5ia1Z1ZFcwU1B3b1VVbVZ3WldGMFpXUk5aWE56WVdkbFJtbGwiLAotICAgICAgICAgICAgImJHUVlDaUFES0FzeUlTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUdiM0psYVdkdVRXVnpjMkZuWlNMSCIsCi0gICAgICAgICAgICAiQVFvU1ZHVnpkRVpwWld4a1QzSmtaWEpwYm1kekVoRUtDVzE1WDNOMGNtbHVaeGdMSUFFb0NSSU9DZ1p0IiwKLSAgICAgICAgICAgICJlVjlwYm5RWUFTQUJLQU1TRUFvSWJYbGZabXh2WVhRWVpTQUJLQUlTVXdvVmMybHVaMnhsWDI1bGMzUmwiLAotICAgICAgICAgICAgIlpGOXRaWE56WVdkbEdNZ0JJQUVvQ3pJekxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExsUmxjM1JHYVdWcyIsCi0gICAgICAgICAgICAiWkU5eVpHVnlhVzVuY3k1T1pYTjBaV1JOWlhOellXZGxHaWNLRFU1bGMzUmxaRTFsYzNOaFoyVVNDZ29DIiwKLSAgICAgICAgICAgICJiMjhZQWlBQktBTVNDZ29DWW1JWUFTQUJLQVVpU3dvUlUzQmhjbk5sUlc1MWJVMWxjM05oWjJVU05nb0wiLAotICAgICAgICAgICAgImMzQmhjbk5sWDJWdWRXMFlBU0FCS0E0eUlTNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNVVaWE4wVTNCaCIsCi0gICAgICAgICAgICAiY25ObFJXNTFiU0laQ2dsUGJtVlRkSEpwYm1jU0RBb0VaR0YwWVJnQklBRW9DU0lhQ2dwTmIzSmxVM1J5IiwKLSAgICAgICAgICAgICJhVzVuRWd3S0JHUmhkR0VZQVNBREtBa2lHQW9JVDI1bFFubDBaWE1TREFvRVpHRjBZUmdCSUFFb0RDSVoiLAotICAgICAgICAgICAgIkNnbE5iM0psUW5sMFpYTVNEQW9FWkdGMFlSZ0JJQUVvRENJY0NneEpiblF6TWsxbGMzTmhaMlVTREFvRSIsCi0gICAgICAgICAgICAiWkdGMFlSZ0JJQUVvQlNJZENnMVZhVzUwTXpKTlpYTnpZV2RsRWd3S0JHUmhkR0VZQVNBQktBMGlIQW9NIiwKLSAgICAgICAgICAgICJTVzUwTmpSTlpYTnpZV2RsRWd3S0JHUmhkR0VZQVNBQktBTWlIUW9OVldsdWREWTBUV1Z6YzJGblpSSU0iLAotICAgICAgICAgICAgIkNnUmtZWFJoR0FFZ0FTZ0VJaHNLQzBKdmIyeE5aWE56WVdkbEVnd0tCR1JoZEdFWUFTQUJLQWdpY3dvSiIsCi0gICAgICAgICAgICAiVkdWemRFOXVaVzltRWhFS0IyWnZiMTlwYm5RWUFTQUJLQVZJQUJJVUNncG1iMjlmYzNSeWFXNW5HQUlnIiwKLSAgICAgICAgICAgICJBU2dKU0FBU05nb0xabTl2WDIxbGMzTmhaMlVZQXlBQktBc3lIeTV3Y205MGIySjFabDkxYm1sMGRHVnoiLAotICAgICAgICAgICAgImRDNVVaWE4wUVd4c1ZIbHdaWE5JQUVJRkNnTm1iMjhpcWdNS0QxUmxjM1JRWVdOclpXUlVlWEJsY3hJWSIsCi0gICAgICAgICAgICAiQ2d4d1lXTnJaV1JmYVc1ME16SVlXaUFES0FWQ0FoQUJFaGdLREhCaFkydGxaRjlwYm5RMk5CaGJJQU1vIiwKLSAgICAgICAgICAgICJBMElDRUFFU0dRb05jR0ZqYTJWa1gzVnBiblF6TWhoY0lBTW9EVUlDRUFFU0dRb05jR0ZqYTJWa1gzVnAiLAotICAgICAgICAgICAgImJuUTJOQmhkSUFNb0JFSUNFQUVTR1FvTmNHRmphMlZrWDNOcGJuUXpNaGhlSUFNb0VVSUNFQUVTR1FvTiIsCi0gICAgICAgICAgICAiY0dGamEyVmtYM05wYm5RMk5CaGZJQU1vRWtJQ0VBRVNHZ29PY0dGamEyVmtYMlpwZUdWa016SVlZQ0FEIiwKLSAgICAgICAgICAgICJLQWRDQWhBQkVob0tEbkJoWTJ0bFpGOW1hWGhsWkRZMEdHRWdBeWdHUWdJUUFSSWJDZzl3WVdOclpXUmYiLAotICAgICAgICAgICAgImMyWnBlR1ZrTXpJWVlpQURLQTlDQWhBQkVoc0tEM0JoWTJ0bFpGOXpabWw0WldRMk5CaGpJQU1vRUVJQyIsCi0gICAgICAgICAgICAiRUFFU0dBb01jR0ZqYTJWa1gyWnNiMkYwR0dRZ0F5Z0NRZ0lRQVJJWkNnMXdZV05yWldSZlpHOTFZbXhsIiwKLSAgICAgICAgICAgICJHR1VnQXlnQlFnSVFBUklYQ2d0d1lXTnJaV1JmWW05dmJCaG1JQU1vQ0VJQ0VBRVNOd29MY0dGamEyVmsiLAotICAgICAgICAgICAgIlgyVnVkVzBZWnlBREtBNHlIaTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVHYjNKbGFXZHVSVzUxYlVJQyIsCi0gICAgICAgICAgICAiRUFFaXlBTUtFVlJsYzNSVmJuQmhZMnRsWkZSNWNHVnpFaG9LRG5WdWNHRmphMlZrWDJsdWRETXlHRm9nIiwKLSAgICAgICAgICAgICJBeWdGUWdJUUFCSWFDZzUxYm5CaFkydGxaRjlwYm5RMk5CaGJJQU1vQTBJQ0VBQVNHd29QZFc1d1lXTnIiLAotICAgICAgICAgICAgIlpXUmZkV2x1ZERNeUdGd2dBeWdOUWdJUUFCSWJDZzkxYm5CaFkydGxaRjkxYVc1ME5qUVlYU0FES0FSQyIsCi0gICAgICAgICAgICAiQWhBQUVoc0tEM1Z1Y0dGamEyVmtYM05wYm5Rek1oaGVJQU1vRVVJQ0VBQVNHd29QZFc1d1lXTnJaV1JmIiwKLSAgICAgICAgICAgICJjMmx1ZERZMEdGOGdBeWdTUWdJUUFCSWNDaEIxYm5CaFkydGxaRjltYVhobFpETXlHR0FnQXlnSFFnSVEiLAotICAgICAgICAgICAgIkFCSWNDaEIxYm5CaFkydGxaRjltYVhobFpEWTBHR0VnQXlnR1FnSVFBQklkQ2hGMWJuQmhZMnRsWkY5eiIsCi0gICAgICAgICAgICAiWm1sNFpXUXpNaGhpSUFNb0QwSUNFQUFTSFFvUmRXNXdZV05yWldSZmMyWnBlR1ZrTmpRWVl5QURLQkJDIiwKLSAgICAgICAgICAgICJBaEFBRWhvS0RuVnVjR0ZqYTJWa1gyWnNiMkYwR0dRZ0F5Z0NRZ0lRQUJJYkNnOTFibkJoWTJ0bFpGOWsiLAotICAgICAgICAgICAgImIzVmliR1VZWlNBREtBRkNBaEFBRWhrS0RYVnVjR0ZqYTJWa1gySnZiMndZWmlBREtBaENBaEFBRWprSyIsCi0gICAgICAgICAgICAiRFhWdWNHRmphMlZrWDJWdWRXMFlaeUFES0E0eUhpNXdjbTkwYjJKMVpsOTFibWwwZEdWemRDNUdiM0psIiwKLSAgICAgICAgICAgICJhV2R1Ulc1MWJVSUNFQUFpd0FFS0kxUmxjM1JTWlhCbFlYUmxaRk5qWVd4aGNrUnBabVpsY21WdWRGUmgiLAotICAgICAgICAgICAgIloxTnBlbVZ6RWhnS0VISmxjR1ZoZEdWa1gyWnBlR1ZrTXpJWURDQURLQWNTRmdvT2NtVndaV0YwWldSZiIsCi0gICAgICAgICAgICAiYVc1ME16SVlEU0FES0FVU0dRb1FjbVZ3WldGMFpXUmZabWw0WldRMk5CaitEeUFES0FZU0Z3b09jbVZ3IiwKLSAgICAgICAgICAgICJaV0YwWldSZmFXNTBOalFZL3c4Z0F5Z0RFaGdLRG5KbGNHVmhkR1ZrWDJac2IyRjBHUDcvRHlBREtBSVMiLAotICAgICAgICAgICAgIkdRb1BjbVZ3WldGMFpXUmZkV2x1ZERZMEdQLy9EeUFES0FRaUtBb2JWR1Z6ZEVOdmJXMWxiblJKYm1wbCIsCi0gICAgICAgICAgICAiWTNScGIyNU5aWE56WVdkbEVna0tBV0VZQVNBQktBa2lEQW9LUm05dlVtVnhkV1Z6ZENJTkNndEdiMjlTIiwKLSAgICAgICAgICAgICJaWE53YjI1elpTSVNDaEJHYjI5RGJHbGxiblJOWlhOellXZGxJaElLRUVadmIxTmxjblpsY2sxbGMzTmgiLAotICAgICAgICAgICAgIloyVWlEQW9LUW1GeVVtVnhkV1Z6ZENJTkNndENZWEpTWlhOd2IyNXpaU3BaQ2d0R2IzSmxhV2R1Ulc1MSIsCi0gICAgICAgICAgICAiYlJJWENoTkdUMUpGU1VkT1gxVk9VMUJGUTBsR1NVVkVFQUFTRHdvTFJrOVNSVWxIVGw5R1QwOFFCQklQIiwKLSAgICAgICAgICAgICJDZ3RHVDFKRlNVZE9YMEpCVWhBRkVnOEtDMFpQVWtWSlIwNWZRa0ZhRUFZcWRRb1VWR1Z6ZEVWdWRXMVgiLAotICAgICAgICAgICAgImFYUm9SSFZ3Vm1Gc2RXVVNLQW9rVkVWVFZGOUZUbFZOWDFkSlZFaGZSRlZRWDFaQlRGVkZYMVZPVTFCRiIsCi0gICAgICAgICAgICAiUTBsR1NVVkVFQUFTQ0FvRVJrOVBNUkFCRWdnS0JFSkJVakVRQWhJSENnTkNRVm9RQXhJSUNnUkdUMDh5IiwKLSAgICAgICAgICAgICJFQUVTQ0FvRVFrRlNNaEFDR2dJUUFTcWRBUW9PVkdWemRGTndZWEp6WlVWdWRXMFNJQW9jVkVWVFZGOVQiLAotICAgICAgICAgICAgIlVFRlNVMFZmUlU1VlRWOVZUbE5RUlVOSlJrbEZSQkFBRWd3S0NGTlFRVkpUUlY5QkVIc1NEZ29JVTFCQiIsCi0gICAgICAgICAgICAiVWxORlgwSVFwdWNERWc4S0NGTlFRVkpUUlY5REVMS3hnQVlTRlFvSVUxQkJVbE5GWDBRUThmLy8vLy8vIiwKLSAgICAgICAgICAgICIvLy8vQVJJVkNnaFRVRUZTVTBWZlJSQzAzdnovLy8vLy8vOEJFZ3dLQ0ZOUVFWSlRSVjlIRUFJeW1RRUsiLAotICAgICAgICAgICAgIkMxUmxjM1JUWlhKMmFXTmxFa1FLQTBadmJ4SWRMbkJ5YjNSdlluVm1YM1Z1YVhSMFpYTjBMa1p2YjFKbCIsCi0gICAgICAgICAgICAiY1hWbGMzUWFIaTV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVHYjI5U1pYTndiMjV6WlJKRUNnTkNZWElTIiwKLSAgICAgICAgICAgICJIUzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVDWVhKU1pYRjFaWE4wR2g0dWNISnZkRzlpZFdaZmRXNXAiLAotICAgICAgICAgICAgImRIUmxjM1F1UW1GeVVtVnpjRzl1YzJWQ09rSU5WVzVwZEhSbGMzUlFjbTkwYjBnQmdBRUJpQUVCa0FFQiIsCi0gICAgICAgICAgICAiK0FFQnFnSWFSMjl2WjJ4bExsQnliM1J2WW5WbUxsUmxjM1JRY205MGIzTmlCbkJ5YjNSdk13PT0iKSk7Ci0gICAgICBkZXNjcmlwdG9yID0gcGJyOjpGaWxlRGVzY3JpcHRvci5Gcm9tR2VuZXJhdGVkQ29kZShkZXNjcmlwdG9yRGF0YSwKLSAgICAgICAgICBuZXcgcGJyOjpGaWxlRGVzY3JpcHRvcltdIHsgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdEltcG9ydFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvciwgfSwKLSAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyhuZXdbXSB7dHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0pLCB0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0RW51bVdpdGhEdXBWYWx1ZSksIHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RTcGFyc2VFbnVtKSwgfSwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5QYXJzZXIsIG5ld1tdeyAiU2luZ2xlSW50MzIiLCAiU2luZ2xlSW50NjQiLCAiU2luZ2xlVWludDMyIiwgIlNpbmdsZVVpbnQ2NCIsICJTaW5nbGVTaW50MzIiLCAiU2luZ2xlU2ludDY0IiwgIlNpbmdsZUZpeGVkMzIiLCAiU2luZ2xlRml4ZWQ2NCIsICJTaW5nbGVTZml4ZWQzMiIsICJTaW5nbGVTZml4ZWQ2NCIsICJTaW5nbGVGbG9hdCIsICJTaW5nbGVEb3VibGUiLCAiU2luZ2xlQm9vbCIsICJTaW5nbGVTdHJpbmciLCAiU2luZ2xlQnl0ZXMiLCAiU2luZ2xlTmVzdGVkTWVzc2FnZSIsICJTaW5nbGVGb3JlaWduTWVzc2FnZSIsICJTaW5nbGVJbXBvcnRNZXNzYWdlIiwgIlNpbmdsZU5lc3RlZEVudW0iLCAiU2luZ2xlRm9yZWlnbkVudW0iLCAiU2luZ2xlSW1wb3J0RW51bSIsICJTaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlIiwgIlJlcGVhdGVkSW50MzIiLCAiUmVwZWF0ZWRJbnQ2NCIsICJSZXBlYXRlZFVpbnQzMiIsICJSZXBlYXRlZFVpbnQ2NCIsICJSZXBlYXRlZFNpbnQzMiIsICJSZXBlYXRlZFNpbnQ2NCIsICJSZXBlYXRlZEZpeGVkMzIiLCAiUmVwZWF0ZWRGaXhlZDY0IiwgIlJlcGVhdGVkU2ZpeGVkMzIiLCAiUmVwZWF0ZWRTZml4ZWQ2NCIsICJSZXBlYXRlZEZsb2F0IiwgIlJlcGVhdGVkRG91YmxlIiwgIlJlcGVhdGVkQm9vbCIsICJSZXBlYXRlZFN0cmluZyIsICJSZXBlYXRlZEJ5dGVzIiwgIlJlcGVhdGVkTmVzdGVkTWVzc2FnZSIsICJSZXBlYXRlZEZvcmVpZ25NZXNzYWdlIiwgIlJlcGVhdGVkSW1wb3J0TWVzc2FnZSIsICJSZXBlYXRlZE5lc3RlZEVudW0iLCAiUmVwZWF0ZWRGb3JlaWduRW51bSIsICJSZXBlYXRlZEltcG9ydEVudW0iLCAiUmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlIiwgIk9uZW9mVWludDMyIiwgIk9uZW9mTmVzdGVkTWVzc2FnZSIsICJPbmVvZlN0cmluZyIsICJPbmVvZkJ5dGVzIiB9LCBuZXdbXXsgIk9uZW9mRmllbGQiIH0sIG5ld1tdeyB0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSkgfSwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7IG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiQmIiIH0sIG51bGwsIG51bGwsIG51bGwpfSksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5OZXN0ZWRUZXN0QWxsVHlwZXMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk5lc3RlZFRlc3RBbGxUeXBlcy5QYXJzZXIsIG5ld1tdeyAiQ2hpbGQiLCAiUGF5bG9hZCIsICJSZXBlYXRlZENoaWxkIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3REZXByZWNhdGVkRmllbGRzKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0RGVwcmVjYXRlZEZpZWxkcy5QYXJzZXIsIG5ld1tdeyAiRGVwcmVjYXRlZEludDMyIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiQyIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0UmVzZXJ2ZWRGaWVsZHMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RSZXNlcnZlZEZpZWxkcy5QYXJzZXIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEZvcmVpZ25OZXN0ZWQpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RGb3JlaWduTmVzdGVkLlBhcnNlciwgbmV3W117ICJGb3JlaWduTmVzdGVkIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyLlBhcnNlciwgbmV3W117ICJBIiwgIkJiIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0UmVjdXJzaXZlTWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiQSIsICJJIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQS5QYXJzZXIsIG5ld1tdeyAiQmIiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CLlBhcnNlciwgbmV3W117ICJBIiwgIk9wdGlvbmFsSW50MzIiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RDYW1lbENhc2VGaWVsZE5hbWVzLlBhcnNlciwgbmV3W117ICJQcmltaXRpdmVGaWVsZCIsICJTdHJpbmdGaWVsZCIsICJFbnVtRmllbGQiLCAiTWVzc2FnZUZpZWxkIiwgIlJlcGVhdGVkUHJpbWl0aXZlRmllbGQiLCAiUmVwZWF0ZWRTdHJpbmdGaWVsZCIsICJSZXBlYXRlZEVudW1GaWVsZCIsICJSZXBlYXRlZE1lc3NhZ2VGaWVsZCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RGaWVsZE9yZGVyaW5ncy5QYXJzZXIsIG5ld1tdeyAiTXlTdHJpbmciLCAiTXlJbnQiLCAiTXlGbG9hdCIsICJTaW5nbGVOZXN0ZWRNZXNzYWdlIiB9LCBudWxsLCBudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLlR5cGVzLk5lc3RlZE1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RGaWVsZE9yZGVyaW5ncy5UeXBlcy5OZXN0ZWRNZXNzYWdlLlBhcnNlciwgbmV3W117ICJPbyIsICJCYiIgfSwgbnVsbCwgbnVsbCwgbnVsbCl9KSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlNwYXJzZUVudW1NZXNzYWdlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5TcGFyc2VFbnVtTWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiU3BhcnNlRW51bSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5PbmVTdHJpbmcpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk9uZVN0cmluZy5QYXJzZXIsIG5ld1tdeyAiRGF0YSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Nb3JlU3RyaW5nKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Nb3JlU3RyaW5nLlBhcnNlciwgbmV3W117ICJEYXRhIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk9uZUJ5dGVzKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5PbmVCeXRlcy5QYXJzZXIsIG5ld1tdeyAiRGF0YSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Nb3JlQnl0ZXMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1vcmVCeXRlcy5QYXJzZXIsIG5ld1tdeyAiRGF0YSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5JbnQzMk1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkludDMyTWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiRGF0YSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5VaW50MzJNZXNzYWdlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5VaW50MzJNZXNzYWdlLlBhcnNlciwgbmV3W117ICJEYXRhIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkludDY0TWVzc2FnZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuSW50NjRNZXNzYWdlLlBhcnNlciwgbmV3W117ICJEYXRhIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVpbnQ2NE1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVpbnQ2NE1lc3NhZ2UuUGFyc2VyLCBuZXdbXXsgIkRhdGEiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuQm9vbE1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkJvb2xNZXNzYWdlLlBhcnNlciwgbmV3W117ICJEYXRhIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RPbmVvZiksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdE9uZW9mLlBhcnNlciwgbmV3W117ICJGb29JbnQiLCAiRm9vU3RyaW5nIiwgIkZvb01lc3NhZ2UiIH0sIG5ld1tdeyAiRm9vIiB9LCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RQYWNrZWRUeXBlcyksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdFBhY2tlZFR5cGVzLlBhcnNlciwgbmV3W117ICJQYWNrZWRJbnQzMiIsICJQYWNrZWRJbnQ2NCIsICJQYWNrZWRVaW50MzIiLCAiUGFja2VkVWludDY0IiwgIlBhY2tlZFNpbnQzMiIsICJQYWNrZWRTaW50NjQiLCAiUGFja2VkRml4ZWQzMiIsICJQYWNrZWRGaXhlZDY0IiwgIlBhY2tlZFNmaXhlZDMyIiwgIlBhY2tlZFNmaXhlZDY0IiwgIlBhY2tlZEZsb2F0IiwgIlBhY2tlZERvdWJsZSIsICJQYWNrZWRCb29sIiwgIlBhY2tlZEVudW0iIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdFVucGFja2VkVHlwZXMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RVbnBhY2tlZFR5cGVzLlBhcnNlciwgbmV3W117ICJVbnBhY2tlZEludDMyIiwgIlVucGFja2VkSW50NjQiLCAiVW5wYWNrZWRVaW50MzIiLCAiVW5wYWNrZWRVaW50NjQiLCAiVW5wYWNrZWRTaW50MzIiLCAiVW5wYWNrZWRTaW50NjQiLCAiVW5wYWNrZWRGaXhlZDMyIiwgIlVucGFja2VkRml4ZWQ2NCIsICJVbnBhY2tlZFNmaXhlZDMyIiwgIlVucGFja2VkU2ZpeGVkNjQiLCAiVW5wYWNrZWRGbG9hdCIsICJVbnBhY2tlZERvdWJsZSIsICJVbnBhY2tlZEJvb2wiLCAiVW5wYWNrZWRFbnVtIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcy5QYXJzZXIsIG5ld1tdeyAiUmVwZWF0ZWRGaXhlZDMyIiwgIlJlcGVhdGVkSW50MzIiLCAiUmVwZWF0ZWRGaXhlZDY0IiwgIlJlcGVhdGVkSW50NjQiLCAiUmVwZWF0ZWRGbG9hdCIsICJSZXBlYXRlZFVpbnQ2NCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0Q29tbWVudEluamVjdGlvbk1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZS5QYXJzZXIsIG5ld1tdeyAiQSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb29SZXF1ZXN0LlBhcnNlciwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb29SZXNwb25zZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9vUmVzcG9uc2UuUGFyc2VyLCBudWxsLCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvb0NsaWVudE1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvb0NsaWVudE1lc3NhZ2UuUGFyc2VyLCBudWxsLCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvb1NlcnZlck1lc3NhZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvb1NlcnZlck1lc3NhZ2UuUGFyc2VyLCBudWxsLCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkJhclJlcXVlc3QpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkJhclJlcXVlc3QuUGFyc2VyLCBudWxsLCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkJhclJlc3BvbnNlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5CYXJSZXNwb25zZS5QYXJzZXIsIG51bGwsIG51bGwsIG51bGwsIG51bGwpCi0gICAgICAgICAgfSkpOwotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotICAjcmVnaW9uIEVudW1zCi0gIHB1YmxpYyBlbnVtIEZvcmVpZ25FbnVtIHsKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkZPUkVJR05fVU5TUEVDSUZJRUQiKV0gRm9yZWlnblVuc3BlY2lmaWVkID0gMCwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkZPUkVJR05fRk9PIildIEZvcmVpZ25Gb28gPSA0LAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiRk9SRUlHTl9CQVIiKV0gRm9yZWlnbkJhciA9IDUsCi0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJGT1JFSUdOX0JBWiIpXSBGb3JlaWduQmF6ID0gNiwKLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUZXN0IGFuIGVudW0gdGhhdCBoYXMgbXVsdGlwbGUgdmFsdWVzIHdpdGggdGhlIHNhbWUgbnVtYmVyLgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBUZXN0RW51bVdpdGhEdXBWYWx1ZSB7Ci0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJURVNUX0VOVU1fV0lUSF9EVVBfVkFMVUVfVU5TUEVDSUZJRUQiKV0gVW5zcGVjaWZpZWQgPSAwLAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiRk9PMSIpXSBGb28xID0gMSwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkJBUjEiKV0gQmFyMSA9IDIsCi0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJCQVoiKV0gQmF6ID0gMywKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkZPTzIiKV0gRm9vMiA9IDEsCi0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJCQVIyIildIEJhcjIgPSAyLAotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIFRlc3QgYW4gZW51bSB3aXRoIGxhcmdlLCB1bm9yZGVyZWQgdmFsdWVzLgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBUZXN0U3BhcnNlRW51bSB7Ci0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJURVNUX1NQQVJTRV9FTlVNX1VOU1BFQ0lGSUVEIildIFVuc3BlY2lmaWVkID0gMCwKLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlNQQVJTRV9BIildIFNwYXJzZUEgPSAxMjMsCi0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJTUEFSU0VfQiIpXSBTcGFyc2VCID0gNjIzNzQsCi0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJTUEFSU0VfQyIpXSBTcGFyc2VDID0gMTI1ODkyMzQsCi0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJTUEFSU0VfRCIpXSBTcGFyc2VEID0gLTE1LAotICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiU1BBUlNFX0UiKV0gU3BhcnNlRSA9IC01MzQ1MiwKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBJbiBwcm90bzMsIHZhbHVlIDAgbXVzdCBiZSB0aGUgZmlyc3Qgb25lIHNwZWNpZmllZAotICAgIC8vLyAgU1BBUlNFX0YgPSAwOwotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJTUEFSU0VfRyIpXSBTcGFyc2VHID0gMiwKLSAgfQotCi0gICNlbmRyZWdpb24KLQotICAjcmVnaW9uIE1lc3NhZ2VzCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUaGlzIHByb3RvIGluY2x1ZGVzIGV2ZXJ5IHR5cGUgb2YgZmllbGQgaW4gYm90aCBzaW5ndWxhciBhbmQgcmVwZWF0ZWQKLSAgLy8vICBmb3Jtcy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RBbGxUeXBlcyA6IHBiOjpJTWVzc2FnZTxUZXN0QWxsVHlwZXM+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0QWxsVHlwZXM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEFsbFR5cGVzPigoKSA9PiBuZXcgVGVzdEFsbFR5cGVzKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEFsbFR5cGVzPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RBbGxUeXBlcygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdEFsbFR5cGVzKFRlc3RBbGxUeXBlcyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgc2luZ2xlSW50MzJfID0gb3RoZXIuc2luZ2xlSW50MzJfOwotICAgICAgc2luZ2xlSW50NjRfID0gb3RoZXIuc2luZ2xlSW50NjRfOwotICAgICAgc2luZ2xlVWludDMyXyA9IG90aGVyLnNpbmdsZVVpbnQzMl87Ci0gICAgICBzaW5nbGVVaW50NjRfID0gb3RoZXIuc2luZ2xlVWludDY0XzsKLSAgICAgIHNpbmdsZVNpbnQzMl8gPSBvdGhlci5zaW5nbGVTaW50MzJfOwotICAgICAgc2luZ2xlU2ludDY0XyA9IG90aGVyLnNpbmdsZVNpbnQ2NF87Ci0gICAgICBzaW5nbGVGaXhlZDMyXyA9IG90aGVyLnNpbmdsZUZpeGVkMzJfOwotICAgICAgc2luZ2xlRml4ZWQ2NF8gPSBvdGhlci5zaW5nbGVGaXhlZDY0XzsKLSAgICAgIHNpbmdsZVNmaXhlZDMyXyA9IG90aGVyLnNpbmdsZVNmaXhlZDMyXzsKLSAgICAgIHNpbmdsZVNmaXhlZDY0XyA9IG90aGVyLnNpbmdsZVNmaXhlZDY0XzsKLSAgICAgIHNpbmdsZUZsb2F0XyA9IG90aGVyLnNpbmdsZUZsb2F0XzsKLSAgICAgIHNpbmdsZURvdWJsZV8gPSBvdGhlci5zaW5nbGVEb3VibGVfOwotICAgICAgc2luZ2xlQm9vbF8gPSBvdGhlci5zaW5nbGVCb29sXzsKLSAgICAgIHNpbmdsZVN0cmluZ18gPSBvdGhlci5zaW5nbGVTdHJpbmdfOwotICAgICAgc2luZ2xlQnl0ZXNfID0gb3RoZXIuc2luZ2xlQnl0ZXNfOwotICAgICAgU2luZ2xlTmVzdGVkTWVzc2FnZSA9IG90aGVyLnNpbmdsZU5lc3RlZE1lc3NhZ2VfICE9IG51bGwgPyBvdGhlci5TaW5nbGVOZXN0ZWRNZXNzYWdlLkNsb25lKCkgOiBudWxsOwotICAgICAgU2luZ2xlRm9yZWlnbk1lc3NhZ2UgPSBvdGhlci5zaW5nbGVGb3JlaWduTWVzc2FnZV8gIT0gbnVsbCA/IG90aGVyLlNpbmdsZUZvcmVpZ25NZXNzYWdlLkNsb25lKCkgOiBudWxsOwotICAgICAgU2luZ2xlSW1wb3J0TWVzc2FnZSA9IG90aGVyLnNpbmdsZUltcG9ydE1lc3NhZ2VfICE9IG51bGwgPyBvdGhlci5TaW5nbGVJbXBvcnRNZXNzYWdlLkNsb25lKCkgOiBudWxsOwotICAgICAgc2luZ2xlTmVzdGVkRW51bV8gPSBvdGhlci5zaW5nbGVOZXN0ZWRFbnVtXzsKLSAgICAgIHNpbmdsZUZvcmVpZ25FbnVtXyA9IG90aGVyLnNpbmdsZUZvcmVpZ25FbnVtXzsKLSAgICAgIHNpbmdsZUltcG9ydEVudW1fID0gb3RoZXIuc2luZ2xlSW1wb3J0RW51bV87Ci0gICAgICBTaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlID0gb3RoZXIuc2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZV8gIT0gbnVsbCA/IG90aGVyLlNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UuQ2xvbmUoKSA6IG51bGw7Ci0gICAgICByZXBlYXRlZEludDMyXyA9IG90aGVyLnJlcGVhdGVkSW50MzJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEludDY0XyA9IG90aGVyLnJlcGVhdGVkSW50NjRfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZFVpbnQzMl8gPSBvdGhlci5yZXBlYXRlZFVpbnQzMl8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkVWludDY0XyA9IG90aGVyLnJlcGVhdGVkVWludDY0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRTaW50MzJfID0gb3RoZXIucmVwZWF0ZWRTaW50MzJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZFNpbnQ2NF8gPSBvdGhlci5yZXBlYXRlZFNpbnQ2NF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkRml4ZWQzMl8gPSBvdGhlci5yZXBlYXRlZEZpeGVkMzJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEZpeGVkNjRfID0gb3RoZXIucmVwZWF0ZWRGaXhlZDY0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRTZml4ZWQzMl8gPSBvdGhlci5yZXBlYXRlZFNmaXhlZDMyXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRTZml4ZWQ2NF8gPSBvdGhlci5yZXBlYXRlZFNmaXhlZDY0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRGbG9hdF8gPSBvdGhlci5yZXBlYXRlZEZsb2F0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWREb3VibGVfID0gb3RoZXIucmVwZWF0ZWREb3VibGVfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEJvb2xfID0gb3RoZXIucmVwZWF0ZWRCb29sXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRTdHJpbmdfID0gb3RoZXIucmVwZWF0ZWRTdHJpbmdfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEJ5dGVzXyA9IG90aGVyLnJlcGVhdGVkQnl0ZXNfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfID0gb3RoZXIucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8gPSBvdGhlci5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXyA9IG90aGVyLnJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkTmVzdGVkRW51bV8gPSBvdGhlci5yZXBlYXRlZE5lc3RlZEVudW1fLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25FbnVtXyA9IG90aGVyLnJlcGVhdGVkRm9yZWlnbkVudW1fLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEltcG9ydEVudW1fID0gb3RoZXIucmVwZWF0ZWRJbXBvcnRFbnVtXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlXyA9IG90aGVyLnJlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZV8uQ2xvbmUoKTsKLSAgICAgIHN3aXRjaCAob3RoZXIuT25lb2ZGaWVsZENhc2UpIHsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyOgotICAgICAgICAgIE9uZW9mVWludDMyID0gb3RoZXIuT25lb2ZVaW50MzI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZk5lc3RlZE1lc3NhZ2U6Ci0gICAgICAgICAgT25lb2ZOZXN0ZWRNZXNzYWdlID0gb3RoZXIuT25lb2ZOZXN0ZWRNZXNzYWdlLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZzoKLSAgICAgICAgICBPbmVvZlN0cmluZyA9IG90aGVyLk9uZW9mU3RyaW5nOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlczoKLSAgICAgICAgICBPbmVvZkJ5dGVzID0gb3RoZXIuT25lb2ZCeXRlczsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0QWxsVHlwZXMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RBbGxUeXBlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9pbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlSW50MzJGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBpbnQgc2luZ2xlSW50MzJfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFNpbmd1bGFyCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50IFNpbmdsZUludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVJbnQzMl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNpbmdsZUludDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX2ludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVJbnQ2NEZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIGxvbmcgc2luZ2xlSW50NjRfOwotICAgIHB1YmxpYyBsb25nIFNpbmdsZUludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVJbnQ2NF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNpbmdsZUludDY0XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX3VpbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlVWludDMyRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgdWludCBzaW5nbGVVaW50MzJfOwotICAgIHB1YmxpYyB1aW50IFNpbmdsZVVpbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlVWludDMyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlVWludDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX3VpbnQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlVWludDY0RmllbGROdW1iZXIgPSA0OwotICAgIHByaXZhdGUgdWxvbmcgc2luZ2xlVWludDY0XzsKLSAgICBwdWJsaWMgdWxvbmcgU2luZ2xlVWludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVVaW50NjRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzaW5nbGVVaW50NjRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzaW5nbGVfc2ludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVTaW50MzJGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBpbnQgc2luZ2xlU2ludDMyXzsKLSAgICBwdWJsaWMgaW50IFNpbmdsZVNpbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlU2ludDMyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlU2ludDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX3NpbnQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlU2ludDY0RmllbGROdW1iZXIgPSA2OwotICAgIHByaXZhdGUgbG9uZyBzaW5nbGVTaW50NjRfOwotICAgIHB1YmxpYyBsb25nIFNpbmdsZVNpbnQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlU2ludDY0XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlU2ludDY0XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNpbmdsZUZpeGVkMzJGaWVsZE51bWJlciA9IDc7Ci0gICAgcHJpdmF0ZSB1aW50IHNpbmdsZUZpeGVkMzJfOwotICAgIHB1YmxpYyB1aW50IFNpbmdsZUZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHNpbmdsZUZpeGVkMzJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzaW5nbGVGaXhlZDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX2ZpeGVkNjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNpbmdsZUZpeGVkNjRGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSB1bG9uZyBzaW5nbGVGaXhlZDY0XzsKLSAgICBwdWJsaWMgdWxvbmcgU2luZ2xlRml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlRml4ZWQ2NF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNpbmdsZUZpeGVkNjRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzaW5nbGVfc2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNpbmdsZVNmaXhlZDMyRmllbGROdW1iZXIgPSA5OwotICAgIHByaXZhdGUgaW50IHNpbmdsZVNmaXhlZDMyXzsKLSAgICBwdWJsaWMgaW50IFNpbmdsZVNmaXhlZDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVTZml4ZWQzMl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNpbmdsZVNmaXhlZDMyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX3NmaXhlZDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVTZml4ZWQ2NEZpZWxkTnVtYmVyID0gMTA7Ci0gICAgcHJpdmF0ZSBsb25nIHNpbmdsZVNmaXhlZDY0XzsKLSAgICBwdWJsaWMgbG9uZyBTaW5nbGVTZml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlU2ZpeGVkNjRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzaW5nbGVTZml4ZWQ2NF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9mbG9hdCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlRmxvYXRGaWVsZE51bWJlciA9IDExOwotICAgIHByaXZhdGUgZmxvYXQgc2luZ2xlRmxvYXRfOwotICAgIHB1YmxpYyBmbG9hdCBTaW5nbGVGbG9hdCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlRmxvYXRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzaW5nbGVGbG9hdF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9kb3VibGUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNpbmdsZURvdWJsZUZpZWxkTnVtYmVyID0gMTI7Ci0gICAgcHJpdmF0ZSBkb3VibGUgc2luZ2xlRG91YmxlXzsKLSAgICBwdWJsaWMgZG91YmxlIFNpbmdsZURvdWJsZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlRG91YmxlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlRG91YmxlXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX2Jvb2wiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNpbmdsZUJvb2xGaWVsZE51bWJlciA9IDEzOwotICAgIHByaXZhdGUgYm9vbCBzaW5nbGVCb29sXzsKLSAgICBwdWJsaWMgYm9vbCBTaW5nbGVCb29sIHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVCb29sXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlQm9vbF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9zdHJpbmciIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNpbmdsZVN0cmluZ0ZpZWxkTnVtYmVyID0gMTQ7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgc2luZ2xlU3RyaW5nXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgU2luZ2xlU3RyaW5nIHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVTdHJpbmdfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzaW5nbGVTdHJpbmdfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX2J5dGVzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVCeXRlc0ZpZWxkTnVtYmVyID0gMTU7Ci0gICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBzaW5nbGVCeXRlc18gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsKLSAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgU2luZ2xlQnl0ZXMgewotICAgICAgZ2V0IHsgcmV0dXJuIHNpbmdsZUJ5dGVzXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlQnl0ZXNfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2luZ2xlX25lc3RlZF9tZXNzYWdlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVOZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSAxODsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2Ugc2luZ2xlTmVzdGVkTWVzc2FnZV87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UgU2luZ2xlTmVzdGVkTWVzc2FnZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlTmVzdGVkTWVzc2FnZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNpbmdsZU5lc3RlZE1lc3NhZ2VfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzaW5nbGVfZm9yZWlnbl9tZXNzYWdlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVGb3JlaWduTWVzc2FnZUZpZWxkTnVtYmVyID0gMTk7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIHNpbmdsZUZvcmVpZ25NZXNzYWdlXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBTaW5nbGVGb3JlaWduTWVzc2FnZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlRm9yZWlnbk1lc3NhZ2VfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzaW5nbGVGb3JlaWduTWVzc2FnZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9pbXBvcnRfbWVzc2FnZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlSW1wb3J0TWVzc2FnZUZpZWxkTnVtYmVyID0gMjA7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2Ugc2luZ2xlSW1wb3J0TWVzc2FnZV87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuSW1wb3J0TWVzc2FnZSBTaW5nbGVJbXBvcnRNZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVJbXBvcnRNZXNzYWdlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlSW1wb3J0TWVzc2FnZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9uZXN0ZWRfZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlTmVzdGVkRW51bUZpZWxkTnVtYmVyID0gMjE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtIHNpbmdsZU5lc3RlZEVudW1fID0gMDsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSBTaW5nbGVOZXN0ZWRFbnVtIHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVOZXN0ZWRFbnVtXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlTmVzdGVkRW51bV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9mb3JlaWduX2VudW0iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNpbmdsZUZvcmVpZ25FbnVtRmllbGROdW1iZXIgPSAyMjsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0gc2luZ2xlRm9yZWlnbkVudW1fID0gMDsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBTaW5nbGVGb3JlaWduRW51bSB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlRm9yZWlnbkVudW1fOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzaW5nbGVGb3JlaWduRW51bV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9pbXBvcnRfZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlSW1wb3J0RW51bUZpZWxkTnVtYmVyID0gMjM7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydEVudW0gc2luZ2xlSW1wb3J0RW51bV8gPSAwOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydEVudW0gU2luZ2xlSW1wb3J0RW51bSB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlSW1wb3J0RW51bV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNpbmdsZUltcG9ydEVudW1fID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzaW5nbGVfcHVibGljX2ltcG9ydF9tZXNzYWdlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlRmllbGROdW1iZXIgPSAyNjsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHVibGljSW1wb3J0TWVzc2FnZSBzaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBEZWZpbmVkIGluIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlB1YmxpY0ltcG9ydE1lc3NhZ2UgU2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2VfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9pbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyID0gMzE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8aW50PiBfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckludDMyKDI1MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiByZXBlYXRlZEludDMyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFJlcGVhdGVkCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gUmVwZWF0ZWRJbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbnQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2ludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEludDY0RmllbGROdW1iZXIgPSAzMjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckludDY0KDI1OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gcmVwZWF0ZWRJbnQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPiBSZXBlYXRlZEludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfdWludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFVpbnQzMkZpZWxkTnVtYmVyID0gMzM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWludD4gX3JlcGVhdGVkX3JlcGVhdGVkVWludDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yVUludDMyKDI2Nik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD4gcmVwZWF0ZWRVaW50MzJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD4gUmVwZWF0ZWRVaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkVWludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfdWludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFVpbnQ2NEZpZWxkTnVtYmVyID0gMzQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc+IF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclVJbnQ2NCgyNzQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPiByZXBlYXRlZFVpbnQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IFJlcGVhdGVkVWludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFVpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3NpbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRTaW50MzJGaWVsZE51bWJlciA9IDM1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3JlcGVhdGVkU2ludDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU0ludDMyKDI4Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiByZXBlYXRlZFNpbnQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gUmVwZWF0ZWRTaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU2ludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfc2ludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNpbnQ2NEZpZWxkTnVtYmVyID0gMzY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz4gX3JlcGVhdGVkX3JlcGVhdGVkU2ludDY0X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU0ludDY0KDI5MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gcmVwZWF0ZWRTaW50NjRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gUmVwZWF0ZWRTaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkU2ludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZml4ZWQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGaXhlZDMyRmllbGROdW1iZXIgPSAzNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzx1aW50PiBfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQzMigyOTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+IHJlcGVhdGVkRml4ZWQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PiBSZXBlYXRlZEZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRml4ZWQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2ZpeGVkNjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQ2NEZpZWxkTnVtYmVyID0gMzg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc+IF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JGaXhlZDY0KDMwNik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IHJlcGVhdGVkRml4ZWQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfc2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU2ZpeGVkMzJGaWVsZE51bWJlciA9IDM5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3JlcGVhdGVkU2ZpeGVkMzJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQzMigzMTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcmVwZWF0ZWRTZml4ZWQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gUmVwZWF0ZWRTZml4ZWQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTZml4ZWQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3NmaXhlZDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFNmaXhlZDY0RmllbGROdW1iZXIgPSA0MDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRTZml4ZWQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclNGaXhlZDY0KDMyMik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gcmVwZWF0ZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPiBSZXBlYXRlZFNmaXhlZDY0IHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFNmaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZmxvYXQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmxvYXRGaWVsZE51bWJlciA9IDQxOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGZsb2F0PiBfcmVwZWF0ZWRfcmVwZWF0ZWRGbG9hdF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckZsb2F0KDMzMCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8ZmxvYXQ+IHJlcGVhdGVkRmxvYXRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGZsb2F0PiBSZXBlYXRlZEZsb2F0IHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEZsb2F0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZG91YmxlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZERvdWJsZUZpZWxkTnVtYmVyID0gNDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8ZG91YmxlPiBfcmVwZWF0ZWRfcmVwZWF0ZWREb3VibGVfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JEb3VibGUoMzM4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxkb3VibGU+IHJlcGVhdGVkRG91YmxlXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8ZG91YmxlPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8ZG91YmxlPiBSZXBlYXRlZERvdWJsZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWREb3VibGVfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9ib29sIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEJvb2xGaWVsZE51bWJlciA9IDQzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGJvb2w+IF9yZXBlYXRlZF9yZXBlYXRlZEJvb2xfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JCb29sKDM0Nik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Ym9vbD4gcmVwZWF0ZWRCb29sXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Ym9vbD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGJvb2w+IFJlcGVhdGVkQm9vbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRCb29sXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfc3RyaW5nIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZFN0cmluZ0ZpZWxkTnVtYmVyID0gNDQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8c3RyaW5nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRTdHJpbmdfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJpbmcoMzU0KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+IHJlcGVhdGVkU3RyaW5nXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBSZXBlYXRlZFN0cmluZyB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRTdHJpbmdfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9ieXRlcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRCeXRlc0ZpZWxkTnVtYmVyID0gNDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8cGI6OkJ5dGVTdHJpbmc+IF9yZXBlYXRlZF9yZXBlYXRlZEJ5dGVzX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yQnl0ZXMoMzYyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxwYjo6Qnl0ZVN0cmluZz4gcmVwZWF0ZWRCeXRlc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHBiOjpCeXRlU3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8cGI6OkJ5dGVTdHJpbmc+IFJlcGVhdGVkQnl0ZXMgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkQnl0ZXNfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIgPSA0ODsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiBfcmVwZWF0ZWRfcmVwZWF0ZWROZXN0ZWRNZXNzYWdlX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgzODYsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZT4gUmVwZWF0ZWROZXN0ZWRNZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VGaWVsZE51bWJlciA9IDQ5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IF9yZXBlYXRlZF9yZXBlYXRlZEZvcmVpZ25NZXNzYWdlX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgzOTQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2U+IFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbXBvcnRNZXNzYWdlRmllbGROdW1iZXIgPSA1MDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+IF9yZXBlYXRlZF9yZXBlYXRlZEltcG9ydE1lc3NhZ2VfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDQwMiwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlPiByZXBlYXRlZEltcG9ydE1lc3NhZ2VfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2U+IFJlcGVhdGVkSW1wb3J0TWVzc2FnZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfbmVzdGVkX2VudW0iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTmVzdGVkRW51bUZpZWxkTnVtYmVyID0gNTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bT4gX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkRW51bV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckVudW0oNDEwLCB4ID0+IChpbnQpIHgsIHggPT4gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0pIHgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+IHJlcGVhdGVkTmVzdGVkRW51bV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZEVudW0+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRFbnVtPiBSZXBlYXRlZE5lc3RlZEVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTmVzdGVkRW51bV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGb3JlaWduRW51bUZpZWxkTnVtYmVyID0gNTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbkVudW1fY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JFbnVtKDQxOCwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtKSB4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiByZXBlYXRlZEZvcmVpZ25FbnVtXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFJlcGVhdGVkRm9yZWlnbkVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRm9yZWlnbkVudW1fOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF9pbXBvcnRfZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRJbXBvcnRFbnVtRmllbGROdW1iZXIgPSA1MzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydEVudW0+IF9yZXBlYXRlZF9yZXBlYXRlZEltcG9ydEVudW1fY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JFbnVtKDQyNiwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydEVudW0pIHgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuSW1wb3J0RW51bT4gcmVwZWF0ZWRJbXBvcnRFbnVtXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5JbXBvcnRFbnVtPiBSZXBlYXRlZEltcG9ydEVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkSW1wb3J0RW51bV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlRmllbGROdW1iZXIgPSA1NDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlB1YmxpY0ltcG9ydE1lc3NhZ2U+IF9yZXBlYXRlZF9yZXBlYXRlZFB1YmxpY0ltcG9ydE1lc3NhZ2VfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDQzNCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5QdWJsaWNJbXBvcnRNZXNzYWdlLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5QdWJsaWNJbXBvcnRNZXNzYWdlPiByZXBlYXRlZFB1YmxpY0ltcG9ydE1lc3NhZ2VfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlB1YmxpY0ltcG9ydE1lc3NhZ2U+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgRGVmaW5lZCBpbiB1bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHVibGljSW1wb3J0TWVzc2FnZT4gUmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFB1YmxpY0ltcG9ydE1lc3NhZ2VfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvbmVvZl91aW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9uZW9mVWludDMyRmllbGROdW1iZXIgPSAxMTE7Ci0gICAgcHVibGljIHVpbnQgT25lb2ZVaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyID8gKHVpbnQpIG9uZW9mRmllbGRfIDogMDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSB2YWx1ZTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlVpbnQzMjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9uZW9mX25lc3RlZF9tZXNzYWdlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPbmVvZk5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciA9IDExMjsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSBPbmVvZk5lc3RlZE1lc3NhZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mTmVzdGVkTWVzc2FnZSA/IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlKSBvbmVvZkZpZWxkXyA6IG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gdmFsdWU7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IHZhbHVlID09IG51bGwgPyBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUgOiBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mTmVzdGVkTWVzc2FnZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9uZW9mX3N0cmluZyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT25lb2ZTdHJpbmdGaWVsZE51bWJlciA9IDExMzsKLSAgICBwdWJsaWMgc3RyaW5nIE9uZW9mU3RyaW5nIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZyA/IChzdHJpbmcpIG9uZW9mRmllbGRfIDogIiI7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mU3RyaW5nOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib25lb2ZfYnl0ZXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9uZW9mQnl0ZXNGaWVsZE51bWJlciA9IDExNDsKLSAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgT25lb2ZCeXRlcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlcyA/IChwYjo6Qnl0ZVN0cmluZykgb25lb2ZGaWVsZF8gOiBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIG9iamVjdCBvbmVvZkZpZWxkXzsKLSAgICAvLy8gPHN1bW1hcnk+RW51bSBvZiBwb3NzaWJsZSBjYXNlcyBmb3IgdGhlICJvbmVvZl9maWVsZCIgb25lb2YuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIE9uZW9mRmllbGRPbmVvZkNhc2UgewotICAgICAgTm9uZSA9IDAsCi0gICAgICBPbmVvZlVpbnQzMiA9IDExMSwKLSAgICAgIE9uZW9mTmVzdGVkTWVzc2FnZSA9IDExMiwKLSAgICAgIE9uZW9mU3RyaW5nID0gMTEzLAotICAgICAgT25lb2ZCeXRlcyA9IDExNCwKLSAgICB9Ci0gICAgcHJpdmF0ZSBPbmVvZkZpZWxkT25lb2ZDYXNlIG9uZW9mRmllbGRDYXNlXyA9IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZTsKLSAgICBwdWJsaWMgT25lb2ZGaWVsZE9uZW9mQ2FzZSBPbmVvZkZpZWxkQ2FzZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgQ2xlYXJPbmVvZkZpZWxkKCkgewotICAgICAgb25lb2ZGaWVsZENhc2VfID0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lOwotICAgICAgb25lb2ZGaWVsZF8gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdEFsbFR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdEFsbFR5cGVzIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVJbnQzMiAhPSBvdGhlci5TaW5nbGVJbnQzMikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZUludDY0ICE9IG90aGVyLlNpbmdsZUludDY0KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU2luZ2xlVWludDMyICE9IG90aGVyLlNpbmdsZVVpbnQzMikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZVVpbnQ2NCAhPSBvdGhlci5TaW5nbGVVaW50NjQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChTaW5nbGVTaW50MzIgIT0gb3RoZXIuU2luZ2xlU2ludDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU2luZ2xlU2ludDY0ICE9IG90aGVyLlNpbmdsZVNpbnQ2NCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZUZpeGVkMzIgIT0gb3RoZXIuU2luZ2xlRml4ZWQzMikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZUZpeGVkNjQgIT0gb3RoZXIuU2luZ2xlRml4ZWQ2NCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZVNmaXhlZDMyICE9IG90aGVyLlNpbmdsZVNmaXhlZDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU2luZ2xlU2ZpeGVkNjQgIT0gb3RoZXIuU2luZ2xlU2ZpeGVkNjQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChTaW5nbGVGbG9hdCAhPSBvdGhlci5TaW5nbGVGbG9hdCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZURvdWJsZSAhPSBvdGhlci5TaW5nbGVEb3VibGUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChTaW5nbGVCb29sICE9IG90aGVyLlNpbmdsZUJvb2wpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChTaW5nbGVTdHJpbmcgIT0gb3RoZXIuU2luZ2xlU3RyaW5nKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU2luZ2xlQnl0ZXMgIT0gb3RoZXIuU2luZ2xlQnl0ZXMpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhTaW5nbGVOZXN0ZWRNZXNzYWdlLCBvdGhlci5TaW5nbGVOZXN0ZWRNZXNzYWdlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFNpbmdsZUZvcmVpZ25NZXNzYWdlLCBvdGhlci5TaW5nbGVGb3JlaWduTWVzc2FnZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhTaW5nbGVJbXBvcnRNZXNzYWdlLCBvdGhlci5TaW5nbGVJbXBvcnRNZXNzYWdlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZU5lc3RlZEVudW0gIT0gb3RoZXIuU2luZ2xlTmVzdGVkRW51bSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNpbmdsZUZvcmVpZ25FbnVtICE9IG90aGVyLlNpbmdsZUZvcmVpZ25FbnVtKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU2luZ2xlSW1wb3J0RW51bSAhPSBvdGhlci5TaW5nbGVJbXBvcnRFbnVtKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoU2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZSwgb3RoZXIuU2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEludDMyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRJbnQzMl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRJbnQ2NF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkSW50NjRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkVWludDMyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRVaW50MzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkVWludDY0Xy5FcXVhbHMob3RoZXIucmVwZWF0ZWRVaW50NjRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkU2ludDMyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRTaW50MzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkU2ludDY0Xy5FcXVhbHMob3RoZXIucmVwZWF0ZWRTaW50NjRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRml4ZWQzMl8uRXF1YWxzKG90aGVyLnJlcGVhdGVkRml4ZWQzMl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRGaXhlZDY0Xy5FcXVhbHMob3RoZXIucmVwZWF0ZWRGaXhlZDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFNmaXhlZDMyXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRTZml4ZWQzMl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRTZml4ZWQ2NF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkU2ZpeGVkNjRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRmxvYXRfLkVxdWFscyhvdGhlci5yZXBlYXRlZEZsb2F0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZERvdWJsZV8uRXF1YWxzKG90aGVyLnJlcGVhdGVkRG91YmxlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEJvb2xfLkVxdWFscyhvdGhlci5yZXBlYXRlZEJvb2xfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkU3RyaW5nXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRTdHJpbmdfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkQnl0ZXNfLkVxdWFscyhvdGhlci5yZXBlYXRlZEJ5dGVzXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkVxdWFscyhvdGhlci5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkVxdWFscyhvdGhlci5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkVxdWFscyhvdGhlci5yZXBlYXRlZEltcG9ydE1lc3NhZ2VfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkTmVzdGVkRW51bV8uRXF1YWxzKG90aGVyLnJlcGVhdGVkTmVzdGVkRW51bV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRGb3JlaWduRW51bV8uRXF1YWxzKG90aGVyLnJlcGVhdGVkRm9yZWlnbkVudW1fKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkSW1wb3J0RW51bV8uRXF1YWxzKG90aGVyLnJlcGVhdGVkSW1wb3J0RW51bV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPbmVvZlVpbnQzMiAhPSBvdGhlci5PbmVvZlVpbnQzMikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKE9uZW9mTmVzdGVkTWVzc2FnZSwgb3RoZXIuT25lb2ZOZXN0ZWRNZXNzYWdlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9uZW9mU3RyaW5nICE9IG90aGVyLk9uZW9mU3RyaW5nKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT25lb2ZCeXRlcyAhPSBvdGhlci5PbmVvZkJ5dGVzKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT25lb2ZGaWVsZENhc2UgIT0gb3RoZXIuT25lb2ZGaWVsZENhc2UpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoU2luZ2xlSW50MzIgIT0gMCkgaGFzaCBePSBTaW5nbGVJbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFNpbmdsZUludDY0ICE9IDBMKSBoYXNoIF49IFNpbmdsZUludDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU2luZ2xlVWludDMyICE9IDApIGhhc2ggXj0gU2luZ2xlVWludDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU2luZ2xlVWludDY0ICE9IDBVTCkgaGFzaCBePSBTaW5nbGVVaW50NjQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTaW5nbGVTaW50MzIgIT0gMCkgaGFzaCBePSBTaW5nbGVTaW50MzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTaW5nbGVTaW50NjQgIT0gMEwpIGhhc2ggXj0gU2luZ2xlU2ludDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU2luZ2xlRml4ZWQzMiAhPSAwKSBoYXNoIF49IFNpbmdsZUZpeGVkMzIuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTaW5nbGVGaXhlZDY0ICE9IDBVTCkgaGFzaCBePSBTaW5nbGVGaXhlZDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU2luZ2xlU2ZpeGVkMzIgIT0gMCkgaGFzaCBePSBTaW5nbGVTZml4ZWQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFNpbmdsZVNmaXhlZDY0ICE9IDBMKSBoYXNoIF49IFNpbmdsZVNmaXhlZDY0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU2luZ2xlRmxvYXQgIT0gMEYpIGhhc2ggXj0gU2luZ2xlRmxvYXQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTaW5nbGVEb3VibGUgIT0gMEQpIGhhc2ggXj0gU2luZ2xlRG91YmxlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU2luZ2xlQm9vbCAhPSBmYWxzZSkgaGFzaCBePSBTaW5nbGVCb29sLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU2luZ2xlU3RyaW5nLkxlbmd0aCAhPSAwKSBoYXNoIF49IFNpbmdsZVN0cmluZy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFNpbmdsZUJ5dGVzLkxlbmd0aCAhPSAwKSBoYXNoIF49IFNpbmdsZUJ5dGVzLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoc2luZ2xlTmVzdGVkTWVzc2FnZV8gIT0gbnVsbCkgaGFzaCBePSBTaW5nbGVOZXN0ZWRNZXNzYWdlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoc2luZ2xlRm9yZWlnbk1lc3NhZ2VfICE9IG51bGwpIGhhc2ggXj0gU2luZ2xlRm9yZWlnbk1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChzaW5nbGVJbXBvcnRNZXNzYWdlXyAhPSBudWxsKSBoYXNoIF49IFNpbmdsZUltcG9ydE1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTaW5nbGVOZXN0ZWRFbnVtICE9IDApIGhhc2ggXj0gU2luZ2xlTmVzdGVkRW51bS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFNpbmdsZUZvcmVpZ25FbnVtICE9IDApIGhhc2ggXj0gU2luZ2xlRm9yZWlnbkVudW0uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTaW5nbGVJbXBvcnRFbnVtICE9IDApIGhhc2ggXj0gU2luZ2xlSW1wb3J0RW51bS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2VfICE9IG51bGwpIGhhc2ggXj0gU2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEludDMyXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEludDY0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFVpbnQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRVaW50NjRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkU2ludDMyXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZFNpbnQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRGaXhlZDMyXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEZpeGVkNjRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkU2ZpeGVkMzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkU2ZpeGVkNjRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRmxvYXRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRG91YmxlXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEJvb2xfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkU3RyaW5nXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEJ5dGVzXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZE5lc3RlZE1lc3NhZ2VfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWROZXN0ZWRFbnVtXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEZvcmVpZ25FbnVtXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZEltcG9ydEVudW1fLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlVpbnQzMikgaGFzaCBePSBPbmVvZlVpbnQzMi5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mTmVzdGVkTWVzc2FnZSkgaGFzaCBePSBPbmVvZk5lc3RlZE1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZykgaGFzaCBePSBPbmVvZlN0cmluZy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mQnl0ZXMpIGhhc2ggXj0gT25lb2ZCeXRlcy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSAoaW50KSBvbmVvZkZpZWxkQ2FzZV87Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChTaW5nbGVJbnQzMiAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoU2luZ2xlSW50MzIpOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZUludDY0ICE9IDBMKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDY0KFNpbmdsZUludDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVVaW50MzIgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoU2luZ2xlVWludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVVaW50NjQgIT0gMFVMKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzMik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NChTaW5nbGVVaW50NjQpOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZVNpbnQzMiAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVNJbnQzMihTaW5nbGVTaW50MzIpOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZVNpbnQ2NCAhPSAwTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVTSW50NjQoU2luZ2xlU2ludDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVGaXhlZDMyICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDYxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlRml4ZWQzMihTaW5nbGVGaXhlZDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVGaXhlZDY0ICE9IDBVTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNjUpOwotICAgICAgICBvdXRwdXQuV3JpdGVGaXhlZDY0KFNpbmdsZUZpeGVkNjQpOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZVNmaXhlZDMyICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDc3KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU0ZpeGVkMzIoU2luZ2xlU2ZpeGVkMzIpOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZVNmaXhlZDY0ICE9IDBMKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4MSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVNGaXhlZDY0KFNpbmdsZVNmaXhlZDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVGbG9hdCAhPSAwRikgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOTMpOwotICAgICAgICBvdXRwdXQuV3JpdGVGbG9hdChTaW5nbGVGbG9hdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlRG91YmxlICE9IDBEKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg5Nyk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZShTaW5nbGVEb3VibGUpOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZUJvb2wgIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEwNCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJvb2woU2luZ2xlQm9vbCk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlU3RyaW5nLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMTQpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoU2luZ2xlU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVCeXRlcy5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTIyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoU2luZ2xlQnl0ZXMpOwotICAgICAgfQotICAgICAgaWYgKHNpbmdsZU5lc3RlZE1lc3NhZ2VfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE0NiwgMSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU2luZ2xlTmVzdGVkTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoc2luZ2xlRm9yZWlnbk1lc3NhZ2VfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE1NCwgMSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU2luZ2xlRm9yZWlnbk1lc3NhZ2UpOwotICAgICAgfQotICAgICAgaWYgKHNpbmdsZUltcG9ydE1lc3NhZ2VfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2MiwgMSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU2luZ2xlSW1wb3J0TWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlTmVzdGVkRW51bSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNjgsIDEpOwotICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpIFNpbmdsZU5lc3RlZEVudW0pOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZUZvcmVpZ25FbnVtICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE3NiwgMSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgU2luZ2xlRm9yZWlnbkVudW0pOwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZUltcG9ydEVudW0gIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTg0LCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBTaW5nbGVJbXBvcnRFbnVtKTsKLSAgICAgIH0KLSAgICAgIGlmIChzaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyMTAsIDEpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmVwZWF0ZWRJbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDMyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkSW50NjRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFVpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQzMl9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFVpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFNpbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQzMl9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFNpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZpeGVkMzJfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDMyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkNjRfY29kZWMpOwotICAgICAgcmVwZWF0ZWRTZml4ZWQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFNmaXhlZDMyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRTZml4ZWQ2NF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZsb2F0Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRfY29kZWMpOwotICAgICAgcmVwZWF0ZWREb3VibGVfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWREb3VibGVfY29kZWMpOwotICAgICAgcmVwZWF0ZWRCb29sXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQm9vbF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFN0cmluZ18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ19jb2RlYyk7Ci0gICAgICByZXBlYXRlZEJ5dGVzXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQnl0ZXNfY29kZWMpOwotICAgICAgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkTWVzc2FnZV9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgICAgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkSW1wb3J0TWVzc2FnZV9jb2RlYyk7Ci0gICAgICByZXBlYXRlZE5lc3RlZEVudW1fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWROZXN0ZWRFbnVtX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkRm9yZWlnbkVudW1fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGb3JlaWduRW51bV9jb2RlYyk7Ci0gICAgICByZXBlYXRlZEltcG9ydEVudW1fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRJbXBvcnRFbnVtX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFB1YmxpY0ltcG9ydE1lc3NhZ2VfY29kZWMpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mVWludDMyKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNDgsIDYpOwotICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoT25lb2ZVaW50MzIpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mTmVzdGVkTWVzc2FnZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTMwLCA3KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPbmVvZk5lc3RlZE1lc3NhZ2UpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mU3RyaW5nKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMzgsIDcpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoT25lb2ZTdHJpbmcpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mQnl0ZXMpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE0NiwgNyk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKE9uZW9mQnl0ZXMpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChTaW5nbGVJbnQzMiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKFNpbmdsZUludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVJbnQ2NCAhPSAwTCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZShTaW5nbGVJbnQ2NCk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlVWludDMyICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKFNpbmdsZVVpbnQzMik7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlVWludDY0ICE9IDBVTCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUoU2luZ2xlVWludDY0KTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVTaW50MzIgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQzMlNpemUoU2luZ2xlU2ludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVTaW50NjQgIT0gMEwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTSW50NjRTaXplKFNpbmdsZVNpbnQ2NCk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlRml4ZWQzMiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDQ7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlRml4ZWQ2NCAhPSAwVUwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgODsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVTZml4ZWQzMiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDQ7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlU2ZpeGVkNjQgIT0gMEwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgODsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVGbG9hdCAhPSAwRikgewotICAgICAgICBzaXplICs9IDEgKyA0OwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZURvdWJsZSAhPSAwRCkgewotICAgICAgICBzaXplICs9IDEgKyA4OwotICAgICAgfQotICAgICAgaWYgKFNpbmdsZUJvb2wgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVTdHJpbmcuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFNpbmdsZVN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlQnl0ZXMuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoU2luZ2xlQnl0ZXMpOwotICAgICAgfQotICAgICAgaWYgKHNpbmdsZU5lc3RlZE1lc3NhZ2VfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShTaW5nbGVOZXN0ZWRNZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChzaW5nbGVGb3JlaWduTWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFNpbmdsZUZvcmVpZ25NZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChzaW5nbGVJbXBvcnRNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoU2luZ2xlSW1wb3J0TWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlTmVzdGVkRW51bSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgU2luZ2xlTmVzdGVkRW51bSk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2luZ2xlRm9yZWlnbkVudW0gIT0gMCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKChpbnQpIFNpbmdsZUZvcmVpZ25FbnVtKTsKLSAgICAgIH0KLSAgICAgIGlmIChTaW5nbGVJbXBvcnRFbnVtICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBTaW5nbGVJbXBvcnRFbnVtKTsKLSAgICAgIH0KLSAgICAgIGlmIChzaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoU2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHJlcGVhdGVkSW50MzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkSW50MzJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEludDY0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRVaW50MzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkVWludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRVaW50NjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkVWludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRTaW50MzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkU2ludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRTaW50NjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkU2ludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRGaXhlZDMyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkMzJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEZpeGVkNjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkRml4ZWQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkU2ZpeGVkMzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkU2ZpeGVkMzJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZFNmaXhlZDY0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRGbG9hdF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRGbG9hdF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkRG91YmxlXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZERvdWJsZV9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkQm9vbF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRCb29sX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRTdHJpbmdfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRCeXRlc18uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRCeXRlc19jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWROZXN0ZWRNZXNzYWdlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRGb3JlaWduTWVzc2FnZV9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkSW1wb3J0TWVzc2FnZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRJbXBvcnRNZXNzYWdlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWROZXN0ZWRFbnVtXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZE5lc3RlZEVudW1fY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEZvcmVpZ25FbnVtXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEZvcmVpZ25FbnVtX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRJbXBvcnRFbnVtXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEltcG9ydEVudW1fY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZFB1YmxpY0ltcG9ydE1lc3NhZ2VfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZV9jb2RlYyk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZVaW50MzIpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50MzJTaXplKE9uZW9mVWludDMyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZk5lc3RlZE1lc3NhZ2UpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShPbmVvZk5lc3RlZE1lc3NhZ2UpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mU3RyaW5nKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShPbmVvZlN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlcykgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUJ5dGVzU2l6ZShPbmVvZkJ5dGVzKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0QWxsVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5TaW5nbGVJbnQzMiAhPSAwKSB7Ci0gICAgICAgIFNpbmdsZUludDMyID0gb3RoZXIuU2luZ2xlSW50MzI7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2luZ2xlSW50NjQgIT0gMEwpIHsKLSAgICAgICAgU2luZ2xlSW50NjQgPSBvdGhlci5TaW5nbGVJbnQ2NDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5TaW5nbGVVaW50MzIgIT0gMCkgewotICAgICAgICBTaW5nbGVVaW50MzIgPSBvdGhlci5TaW5nbGVVaW50MzI7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2luZ2xlVWludDY0ICE9IDBVTCkgewotICAgICAgICBTaW5nbGVVaW50NjQgPSBvdGhlci5TaW5nbGVVaW50NjQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2luZ2xlU2ludDMyICE9IDApIHsKLSAgICAgICAgU2luZ2xlU2ludDMyID0gb3RoZXIuU2luZ2xlU2ludDMyOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlNpbmdsZVNpbnQ2NCAhPSAwTCkgewotICAgICAgICBTaW5nbGVTaW50NjQgPSBvdGhlci5TaW5nbGVTaW50NjQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2luZ2xlRml4ZWQzMiAhPSAwKSB7Ci0gICAgICAgIFNpbmdsZUZpeGVkMzIgPSBvdGhlci5TaW5nbGVGaXhlZDMyOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlNpbmdsZUZpeGVkNjQgIT0gMFVMKSB7Ci0gICAgICAgIFNpbmdsZUZpeGVkNjQgPSBvdGhlci5TaW5nbGVGaXhlZDY0OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlNpbmdsZVNmaXhlZDMyICE9IDApIHsKLSAgICAgICAgU2luZ2xlU2ZpeGVkMzIgPSBvdGhlci5TaW5nbGVTZml4ZWQzMjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5TaW5nbGVTZml4ZWQ2NCAhPSAwTCkgewotICAgICAgICBTaW5nbGVTZml4ZWQ2NCA9IG90aGVyLlNpbmdsZVNmaXhlZDY0OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlNpbmdsZUZsb2F0ICE9IDBGKSB7Ci0gICAgICAgIFNpbmdsZUZsb2F0ID0gb3RoZXIuU2luZ2xlRmxvYXQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2luZ2xlRG91YmxlICE9IDBEKSB7Ci0gICAgICAgIFNpbmdsZURvdWJsZSA9IG90aGVyLlNpbmdsZURvdWJsZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5TaW5nbGVCb29sICE9IGZhbHNlKSB7Ci0gICAgICAgIFNpbmdsZUJvb2wgPSBvdGhlci5TaW5nbGVCb29sOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlNpbmdsZVN0cmluZy5MZW5ndGggIT0gMCkgewotICAgICAgICBTaW5nbGVTdHJpbmcgPSBvdGhlci5TaW5nbGVTdHJpbmc7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2luZ2xlQnl0ZXMuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgU2luZ2xlQnl0ZXMgPSBvdGhlci5TaW5nbGVCeXRlczsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5zaW5nbGVOZXN0ZWRNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChzaW5nbGVOZXN0ZWRNZXNzYWdlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgc2luZ2xlTmVzdGVkTWVzc2FnZV8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIFNpbmdsZU5lc3RlZE1lc3NhZ2UuTWVyZ2VGcm9tKG90aGVyLlNpbmdsZU5lc3RlZE1lc3NhZ2UpOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLnNpbmdsZUZvcmVpZ25NZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChzaW5nbGVGb3JlaWduTWVzc2FnZV8gPT0gbnVsbCkgewotICAgICAgICAgIHNpbmdsZUZvcmVpZ25NZXNzYWdlXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2luZ2xlRm9yZWlnbk1lc3NhZ2UuTWVyZ2VGcm9tKG90aGVyLlNpbmdsZUZvcmVpZ25NZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5zaW5nbGVJbXBvcnRNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChzaW5nbGVJbXBvcnRNZXNzYWdlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgc2luZ2xlSW1wb3J0TWVzc2FnZV8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5JbXBvcnRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgU2luZ2xlSW1wb3J0TWVzc2FnZS5NZXJnZUZyb20ob3RoZXIuU2luZ2xlSW1wb3J0TWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2luZ2xlTmVzdGVkRW51bSAhPSAwKSB7Ci0gICAgICAgIFNpbmdsZU5lc3RlZEVudW0gPSBvdGhlci5TaW5nbGVOZXN0ZWRFbnVtOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlNpbmdsZUZvcmVpZ25FbnVtICE9IDApIHsKLSAgICAgICAgU2luZ2xlRm9yZWlnbkVudW0gPSBvdGhlci5TaW5nbGVGb3JlaWduRW51bTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5TaW5nbGVJbXBvcnRFbnVtICE9IDApIHsKLSAgICAgICAgU2luZ2xlSW1wb3J0RW51bSA9IG90aGVyLlNpbmdsZUltcG9ydEVudW07Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuc2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBpZiAoc2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZV8gPT0gbnVsbCkgewotICAgICAgICAgIHNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2VfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuUHVibGljSW1wb3J0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIFNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UuTWVyZ2VGcm9tKG90aGVyLlNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmVwZWF0ZWRJbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkSW50MzJfKTsKLSAgICAgIHJlcGVhdGVkSW50NjRfLkFkZChvdGhlci5yZXBlYXRlZEludDY0Xyk7Ci0gICAgICByZXBlYXRlZFVpbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkVWludDMyXyk7Ci0gICAgICByZXBlYXRlZFVpbnQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkVWludDY0Xyk7Ci0gICAgICByZXBlYXRlZFNpbnQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ludDMyXyk7Ci0gICAgICByZXBlYXRlZFNpbnQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkU2ludDY0Xyk7Ci0gICAgICByZXBlYXRlZEZpeGVkMzJfLkFkZChvdGhlci5yZXBlYXRlZEZpeGVkMzJfKTsKLSAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uQWRkKG90aGVyLnJlcGVhdGVkRml4ZWQ2NF8pOwotICAgICAgcmVwZWF0ZWRTZml4ZWQzMl8uQWRkKG90aGVyLnJlcGVhdGVkU2ZpeGVkMzJfKTsKLSAgICAgIHJlcGVhdGVkU2ZpeGVkNjRfLkFkZChvdGhlci5yZXBlYXRlZFNmaXhlZDY0Xyk7Ci0gICAgICByZXBlYXRlZEZsb2F0Xy5BZGQob3RoZXIucmVwZWF0ZWRGbG9hdF8pOwotICAgICAgcmVwZWF0ZWREb3VibGVfLkFkZChvdGhlci5yZXBlYXRlZERvdWJsZV8pOwotICAgICAgcmVwZWF0ZWRCb29sXy5BZGQob3RoZXIucmVwZWF0ZWRCb29sXyk7Ci0gICAgICByZXBlYXRlZFN0cmluZ18uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nXyk7Ci0gICAgICByZXBlYXRlZEJ5dGVzXy5BZGQob3RoZXIucmVwZWF0ZWRCeXRlc18pOwotICAgICAgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWROZXN0ZWRNZXNzYWdlXyk7Ci0gICAgICByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZV8pOwotICAgICAgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlXy5BZGQob3RoZXIucmVwZWF0ZWRJbXBvcnRNZXNzYWdlXyk7Ci0gICAgICByZXBlYXRlZE5lc3RlZEVudW1fLkFkZChvdGhlci5yZXBlYXRlZE5lc3RlZEVudW1fKTsKLSAgICAgIHJlcGVhdGVkRm9yZWlnbkVudW1fLkFkZChvdGhlci5yZXBlYXRlZEZvcmVpZ25FbnVtXyk7Ci0gICAgICByZXBlYXRlZEltcG9ydEVudW1fLkFkZChvdGhlci5yZXBlYXRlZEltcG9ydEVudW1fKTsKLSAgICAgIHJlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZV8uQWRkKG90aGVyLnJlcGVhdGVkUHVibGljSW1wb3J0TWVzc2FnZV8pOwotICAgICAgc3dpdGNoIChvdGhlci5PbmVvZkZpZWxkQ2FzZSkgewotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZVaW50MzI6Ci0gICAgICAgICAgT25lb2ZVaW50MzIgPSBvdGhlci5PbmVvZlVpbnQzMjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLk9uZW9mTmVzdGVkTWVzc2FnZToKLSAgICAgICAgICBPbmVvZk5lc3RlZE1lc3NhZ2UgPSBvdGhlci5PbmVvZk5lc3RlZE1lc3NhZ2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5PbmVvZlN0cmluZzoKLSAgICAgICAgICBPbmVvZlN0cmluZyA9IG90aGVyLk9uZW9mU3RyaW5nOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZCeXRlczoKLSAgICAgICAgICBPbmVvZkJ5dGVzID0gb3RoZXIuT25lb2ZCeXRlczsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgU2luZ2xlSW50MzIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICBTaW5nbGVJbnQ2NCA9IGlucHV0LlJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQ6IHsKLSAgICAgICAgICAgIFNpbmdsZVVpbnQzMiA9IGlucHV0LlJlYWRVSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDMyOiB7Ci0gICAgICAgICAgICBTaW5nbGVVaW50NjQgPSBpbnB1dC5SZWFkVUludDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MDogewotICAgICAgICAgICAgU2luZ2xlU2ludDMyID0gaW5wdXQuUmVhZFNJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDg6IHsKLSAgICAgICAgICAgIFNpbmdsZVNpbnQ2NCA9IGlucHV0LlJlYWRTSW50NjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDYxOiB7Ci0gICAgICAgICAgICBTaW5nbGVGaXhlZDMyID0gaW5wdXQuUmVhZEZpeGVkMzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDY1OiB7Ci0gICAgICAgICAgICBTaW5nbGVGaXhlZDY0ID0gaW5wdXQuUmVhZEZpeGVkNjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc3OiB7Ci0gICAgICAgICAgICBTaW5nbGVTZml4ZWQzMiA9IGlucHV0LlJlYWRTRml4ZWQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODE6IHsKLSAgICAgICAgICAgIFNpbmdsZVNmaXhlZDY0ID0gaW5wdXQuUmVhZFNGaXhlZDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MzogewotICAgICAgICAgICAgU2luZ2xlRmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDk3OiB7Ci0gICAgICAgICAgICBTaW5nbGVEb3VibGUgPSBpbnB1dC5SZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDQ6IHsKLSAgICAgICAgICAgIFNpbmdsZUJvb2wgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTE0OiB7Ci0gICAgICAgICAgICBTaW5nbGVTdHJpbmcgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMjI6IHsKLSAgICAgICAgICAgIFNpbmdsZUJ5dGVzID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNDY6IHsKLSAgICAgICAgICAgIGlmIChzaW5nbGVOZXN0ZWRNZXNzYWdlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHNpbmdsZU5lc3RlZE1lc3NhZ2VfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHNpbmdsZU5lc3RlZE1lc3NhZ2VfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE1NDogewotICAgICAgICAgICAgaWYgKHNpbmdsZUZvcmVpZ25NZXNzYWdlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHNpbmdsZUZvcmVpZ25NZXNzYWdlXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzaW5nbGVGb3JlaWduTWVzc2FnZV8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTYyOiB7Ci0gICAgICAgICAgICBpZiAoc2luZ2xlSW1wb3J0TWVzc2FnZV8gPT0gbnVsbCkgewotICAgICAgICAgICAgICBzaW5nbGVJbXBvcnRNZXNzYWdlXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkltcG9ydE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHNpbmdsZUltcG9ydE1lc3NhZ2VfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2ODogewotICAgICAgICAgICAgc2luZ2xlTmVzdGVkRW51bV8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkRW51bSkgaW5wdXQuUmVhZEVudW0oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE3NjogewotICAgICAgICAgICAgc2luZ2xlRm9yZWlnbkVudW1fID0gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0pIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODQ6IHsKLSAgICAgICAgICAgIHNpbmdsZUltcG9ydEVudW1fID0gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuSW1wb3J0RW51bSkgaW5wdXQuUmVhZEVudW0oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDIxMDogewotICAgICAgICAgICAgaWYgKHNpbmdsZVB1YmxpY0ltcG9ydE1lc3NhZ2VfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgc2luZ2xlUHVibGljSW1wb3J0TWVzc2FnZV8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5QdWJsaWNJbXBvcnRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzaW5nbGVQdWJsaWNJbXBvcnRNZXNzYWdlXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNTA6Ci0gICAgICAgICAgY2FzZSAyNDg6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkSW50MzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNTg6Ci0gICAgICAgICAgY2FzZSAyNTY6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkSW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRJbnQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjY6Ci0gICAgICAgICAgY2FzZSAyNjQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkVWludDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkVWludDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI3NDoKLSAgICAgICAgICBjYXNlIDI3MjogewotICAgICAgICAgICAgcmVwZWF0ZWRVaW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRVaW50NjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjgyOgotICAgICAgICAgIGNhc2UgMjgwOiB7Ci0gICAgICAgICAgICByZXBlYXRlZFNpbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFNpbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyOTA6Ci0gICAgICAgICAgY2FzZSAyODg6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkU2ludDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU2ludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI5ODoKLSAgICAgICAgICBjYXNlIDMwMTogewotICAgICAgICAgICAgcmVwZWF0ZWRGaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRml4ZWQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMDY6Ci0gICAgICAgICAgY2FzZSAzMDU6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkNjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzE0OgotICAgICAgICAgIGNhc2UgMzE3OiB7Ci0gICAgICAgICAgICByZXBlYXRlZFNmaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU2ZpeGVkMzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzIyOgotICAgICAgICAgIGNhc2UgMzIxOiB7Ci0gICAgICAgICAgICByZXBlYXRlZFNmaXhlZDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU2ZpeGVkNjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzMwOgotICAgICAgICAgIGNhc2UgMzMzOiB7Ci0gICAgICAgICAgICByZXBlYXRlZEZsb2F0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzM4OgotICAgICAgICAgIGNhc2UgMzM3OiB7Ci0gICAgICAgICAgICByZXBlYXRlZERvdWJsZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZERvdWJsZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDY6Ci0gICAgICAgICAgY2FzZSAzNDQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkQm9vbF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEJvb2xfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzU0OiB7Ci0gICAgICAgICAgICByZXBlYXRlZFN0cmluZ18uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ19jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNjI6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkQnl0ZXNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRCeXRlc19jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzODY6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkTmVzdGVkTWVzc2FnZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZE5lc3RlZE1lc3NhZ2VfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzk0OiB7Ci0gICAgICAgICAgICByZXBlYXRlZEZvcmVpZ25NZXNzYWdlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRm9yZWlnbk1lc3NhZ2VfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDAyOiB7Ci0gICAgICAgICAgICByZXBlYXRlZEltcG9ydE1lc3NhZ2VfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRJbXBvcnRNZXNzYWdlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQxMDoKLSAgICAgICAgICBjYXNlIDQwODogewotICAgICAgICAgICAgcmVwZWF0ZWROZXN0ZWRFbnVtXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkTmVzdGVkRW51bV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MTg6Ci0gICAgICAgICAgY2FzZSA0MTY6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkRm9yZWlnbkVudW1fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGb3JlaWduRW51bV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MjY6Ci0gICAgICAgICAgY2FzZSA0MjQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkSW1wb3J0RW51bV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEltcG9ydEVudW1fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDM0OiB7Ci0gICAgICAgICAgICByZXBlYXRlZFB1YmxpY0ltcG9ydE1lc3NhZ2VfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRQdWJsaWNJbXBvcnRNZXNzYWdlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDg4ODogewotICAgICAgICAgICAgT25lb2ZVaW50MzIgPSBpbnB1dC5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4OTg6IHsKLSAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzLlR5cGVzLk5lc3RlZE1lc3NhZ2Ugc3ViQnVpbGRlciA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuT25lb2ZOZXN0ZWRNZXNzYWdlKSB7Ci0gICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKE9uZW9mTmVzdGVkTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyKTsKLSAgICAgICAgICAgIE9uZW9mTmVzdGVkTWVzc2FnZSA9IHN1YkJ1aWxkZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDY6IHsKLSAgICAgICAgICAgIE9uZW9mU3RyaW5nID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgOTE0OiB7Ci0gICAgICAgICAgICBPbmVvZkJ5dGVzID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcwotICAgIC8vLyA8c3VtbWFyeT5Db250YWluZXIgZm9yIG5lc3RlZCB0eXBlcyBkZWNsYXJlZCBpbiB0aGUgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgdHlwZS48L3N1bW1hcnk+Ci0gICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgewotICAgICAgcHVibGljIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiTkVTVEVEX0VOVU1fVU5TUEVDSUZJRUQiKV0gVW5zcGVjaWZpZWQgPSAwLAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkZPTyIpXSBGb28gPSAxLAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkJBUiIpXSBCYXIgPSAyLAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkJBWiIpXSBCYXogPSAzLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgSW50ZW50aW9uYWxseSBuZWdhdGl2ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJORUciKV0gTmVnID0gLTEsCi0gICAgICB9Ci0KLSAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTmVzdGVkTWVzc2FnZSA6IHBiOjpJTWVzc2FnZTxOZXN0ZWRNZXNzYWdlPiB7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZE1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8TmVzdGVkTWVzc2FnZT4oKCkgPT4gbmV3IE5lc3RlZE1lc3NhZ2UoKSk7Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8TmVzdGVkTWVzc2FnZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBOZXN0ZWRNZXNzYWdlKCkgewotICAgICAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgICAgICBwdWJsaWMgTmVzdGVkTWVzc2FnZShOZXN0ZWRNZXNzYWdlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICAgICAgYmJfID0gb3RoZXIuYmJfOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIE5lc3RlZE1lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBOZXN0ZWRNZXNzYWdlKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJiYiIgZmllbGQuPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJiRmllbGROdW1iZXIgPSAxOwotICAgICAgICBwcml2YXRlIGludCBiYl87Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBUaGUgZmllbGQgbmFtZSAiYiIgZmFpbHMgdG8gY29tcGlsZSBpbiBwcm90bzEgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aAotICAgICAgICAvLy8gIGEgbG9jYWwgdmFyaWFibGUgbmFtZWQgImIiIGluIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuICBEb2guCi0gICAgICAgIC8vLyAgVGhpcyBmaWxlIG5lZWRzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIHRvIHRlc3QgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgQmIgewotICAgICAgICAgIGdldCB7IHJldHVybiBiYl87IH0KLSAgICAgICAgICBzZXQgewotICAgICAgICAgICAgYmJfID0gdmFsdWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgTmVzdGVkTWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoTmVzdGVkTWVzc2FnZSBvdGhlcikgewotICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKEJiICE9IG90aGVyLkJiKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgICAgIGludCBoYXNoID0gMTsKLSAgICAgICAgICBpZiAoQmIgIT0gMCkgaGFzaCBePSBCYi5HZXRIYXNoQ29kZSgpOwotICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICAgICAgaWYgKEJiICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEJiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgIGlmIChCYiAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShCYik7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKE5lc3RlZE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAob3RoZXIuQmIgIT0gMCkgewotICAgICAgICAgICAgQmIgPSBvdGhlci5CYjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgICAgICB1aW50IHRhZzsKLSAgICAgICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgICAgQmIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgVGhpcyBwcm90byBpbmNsdWRlcyBhIHJlY3VzaXZlbHkgbmVzdGVkIG1lc3NhZ2UuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBOZXN0ZWRUZXN0QWxsVHlwZXMgOiBwYjo6SU1lc3NhZ2U8TmVzdGVkVGVzdEFsbFR5cGVzPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8TmVzdGVkVGVzdEFsbFR5cGVzPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZFRlc3RBbGxUeXBlcz4oKCkgPT4gbmV3IE5lc3RlZFRlc3RBbGxUeXBlcygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZFRlc3RBbGxUeXBlcz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBOZXN0ZWRUZXN0QWxsVHlwZXMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIE5lc3RlZFRlc3RBbGxUeXBlcyhOZXN0ZWRUZXN0QWxsVHlwZXMgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIENoaWxkID0gb3RoZXIuY2hpbGRfICE9IG51bGwgPyBvdGhlci5DaGlsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIFBheWxvYWQgPSBvdGhlci5wYXlsb2FkXyAhPSBudWxsID8gb3RoZXIuUGF5bG9hZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIHJlcGVhdGVkQ2hpbGRfID0gb3RoZXIucmVwZWF0ZWRDaGlsZF8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTmVzdGVkVGVzdEFsbFR5cGVzIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBOZXN0ZWRUZXN0QWxsVHlwZXModGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJjaGlsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQ2hpbGRGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk5lc3RlZFRlc3RBbGxUeXBlcyBjaGlsZF87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTmVzdGVkVGVzdEFsbFR5cGVzIENoaWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBjaGlsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGNoaWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicGF5bG9hZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGF5bG9hZEZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzIHBheWxvYWRfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcyBQYXlsb2FkIHsKLSAgICAgIGdldCB7IHJldHVybiBwYXlsb2FkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgcGF5bG9hZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2NoaWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZENoaWxkRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTmVzdGVkVGVzdEFsbFR5cGVzPiBfcmVwZWF0ZWRfcmVwZWF0ZWRDaGlsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMjYsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTmVzdGVkVGVzdEFsbFR5cGVzLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5OZXN0ZWRUZXN0QWxsVHlwZXM+IHJlcGVhdGVkQ2hpbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk5lc3RlZFRlc3RBbGxUeXBlcz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuTmVzdGVkVGVzdEFsbFR5cGVzPiBSZXBlYXRlZENoaWxkIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZENoaWxkXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgTmVzdGVkVGVzdEFsbFR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoTmVzdGVkVGVzdEFsbFR5cGVzIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhDaGlsZCwgb3RoZXIuQ2hpbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoUGF5bG9hZCwgb3RoZXIuUGF5bG9hZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZENoaWxkXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRDaGlsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKGNoaWxkXyAhPSBudWxsKSBoYXNoIF49IENoaWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAocGF5bG9hZF8gIT0gbnVsbCkgaGFzaCBePSBQYXlsb2FkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkQ2hpbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChjaGlsZF8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKENoaWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChwYXlsb2FkXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoUGF5bG9hZCk7Ci0gICAgICB9Ci0gICAgICByZXBlYXRlZENoaWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQ2hpbGRfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChjaGlsZF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKENoaWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChwYXlsb2FkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoUGF5bG9hZCk7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHJlcGVhdGVkQ2hpbGRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkQ2hpbGRfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKE5lc3RlZFRlc3RBbGxUeXBlcyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLmNoaWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChjaGlsZF8gPT0gbnVsbCkgewotICAgICAgICAgIGNoaWxkXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk5lc3RlZFRlc3RBbGxUeXBlcygpOwotICAgICAgICB9Ci0gICAgICAgIENoaWxkLk1lcmdlRnJvbShvdGhlci5DaGlsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIucGF5bG9hZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAocGF5bG9hZF8gPT0gbnVsbCkgewotICAgICAgICAgIHBheWxvYWRfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUGF5bG9hZC5NZXJnZUZyb20ob3RoZXIuUGF5bG9hZCk7Ci0gICAgICB9Ci0gICAgICByZXBlYXRlZENoaWxkXy5BZGQob3RoZXIucmVwZWF0ZWRDaGlsZF8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGlmIChjaGlsZF8gPT0gbnVsbCkgewotICAgICAgICAgICAgICBjaGlsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5OZXN0ZWRUZXN0QWxsVHlwZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKGNoaWxkXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgaWYgKHBheWxvYWRfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgcGF5bG9hZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHBheWxvYWRfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI2OiB7Ci0gICAgICAgICAgICByZXBlYXRlZENoaWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkQ2hpbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdERlcHJlY2F0ZWRGaWVsZHMgOiBwYjo6SU1lc3NhZ2U8VGVzdERlcHJlY2F0ZWRGaWVsZHM+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0RGVwcmVjYXRlZEZpZWxkcz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0RGVwcmVjYXRlZEZpZWxkcz4oKCkgPT4gbmV3IFRlc3REZXByZWNhdGVkRmllbGRzKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdERlcHJlY2F0ZWRGaWVsZHM+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3REZXByZWNhdGVkRmllbGRzKFRlc3REZXByZWNhdGVkRmllbGRzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBkZXByZWNhdGVkSW50MzJfID0gb3RoZXIuZGVwcmVjYXRlZEludDMyXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdERlcHJlY2F0ZWRGaWVsZHMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3REZXByZWNhdGVkRmllbGRzKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGVwcmVjYXRlZF9pbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGVwcmVjYXRlZEludDMyRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgaW50IGRlcHJlY2F0ZWRJbnQzMl87Ci0gICAgW2dsb2JhbDo6U3lzdGVtLk9ic29sZXRlQXR0cmlidXRlKCldCi0gICAgcHVibGljIGludCBEZXByZWNhdGVkSW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlcHJlY2F0ZWRJbnQzMl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGRlcHJlY2F0ZWRJbnQzMl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3REZXByZWNhdGVkRmllbGRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdERlcHJlY2F0ZWRGaWVsZHMgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKERlcHJlY2F0ZWRJbnQzMiAhPSBvdGhlci5EZXByZWNhdGVkSW50MzIpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoRGVwcmVjYXRlZEludDMyICE9IDApIGhhc2ggXj0gRGVwcmVjYXRlZEludDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChEZXByZWNhdGVkSW50MzIgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKERlcHJlY2F0ZWRJbnQzMik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKERlcHJlY2F0ZWRJbnQzMiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKERlcHJlY2F0ZWRJbnQzMik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVGVzdERlcHJlY2F0ZWRGaWVsZHMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EZXByZWNhdGVkSW50MzIgIT0gMCkgewotICAgICAgICBEZXByZWNhdGVkSW50MzIgPSBvdGhlci5EZXByZWNhdGVkSW50MzI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBEZXByZWNhdGVkSW50MzIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIERlZmluZSB0aGVzZSBhZnRlciBUZXN0QWxsVHlwZXMgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBjYW4gaGFuZGxlCi0gIC8vLyAgdGhhdC4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZvcmVpZ25NZXNzYWdlIDogcGI6OklNZXNzYWdlPEZvcmVpZ25NZXNzYWdlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8Rm9yZWlnbk1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8Rm9yZWlnbk1lc3NhZ2U+KCgpID0+IG5ldyBGb3JlaWduTWVzc2FnZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEZvcmVpZ25NZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbM107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEZvcmVpZ25NZXNzYWdlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgY18gPSBvdGhlci5jXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9yZWlnbk1lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEZvcmVpZ25NZXNzYWdlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQ0ZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGludCBjXzsKLSAgICBwdWJsaWMgaW50IEMgewotICAgICAgZ2V0IHsgcmV0dXJuIGNfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBjXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRm9yZWlnbk1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhGb3JlaWduTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoQyAhPSBvdGhlci5DKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKEMgIT0gMCkgaGFzaCBePSBDLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChDICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihDKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoQyAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEMpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEZvcmVpZ25NZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuQyAhPSAwKSB7Ci0gICAgICAgIEMgPSBvdGhlci5DOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgQyA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFJlc2VydmVkRmllbGRzIDogcGI6OklNZXNzYWdlPFRlc3RSZXNlcnZlZEZpZWxkcz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RSZXNlcnZlZEZpZWxkcz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0UmVzZXJ2ZWRGaWVsZHM+KCgpID0+IG5ldyBUZXN0UmVzZXJ2ZWRGaWVsZHMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0UmVzZXJ2ZWRGaWVsZHM+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s0XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFJlc2VydmVkRmllbGRzKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUZXN0UmVzZXJ2ZWRGaWVsZHMoVGVzdFJlc2VydmVkRmllbGRzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RSZXNlcnZlZEZpZWxkcyBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgVGVzdFJlc2VydmVkRmllbGRzKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdFJlc2VydmVkRmllbGRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdFJlc2VydmVkRmllbGRzIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVGVzdFJlc2VydmVkRmllbGRzIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUZXN0IHRoYXQgd2UgY2FuIHVzZSBOZXN0ZWRNZXNzYWdlIGZyb20gb3V0c2lkZSBUZXN0QWxsVHlwZXMuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0Rm9yZWlnbk5lc3RlZCA6IHBiOjpJTWVzc2FnZTxUZXN0Rm9yZWlnbk5lc3RlZD4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RGb3JlaWduTmVzdGVkPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RGb3JlaWduTmVzdGVkPigoKSA9PiBuZXcgVGVzdEZvcmVpZ25OZXN0ZWQoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0Rm9yZWlnbk5lc3RlZD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzVdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Rm9yZWlnbk5lc3RlZCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdEZvcmVpZ25OZXN0ZWQoVGVzdEZvcmVpZ25OZXN0ZWQgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIEZvcmVpZ25OZXN0ZWQgPSBvdGhlci5mb3JlaWduTmVzdGVkXyAhPSBudWxsID8gb3RoZXIuRm9yZWlnbk5lc3RlZC5DbG9uZSgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEZvcmVpZ25OZXN0ZWQgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RGb3JlaWduTmVzdGVkKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZm9yZWlnbl9uZXN0ZWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZvcmVpZ25OZXN0ZWRGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIGZvcmVpZ25OZXN0ZWRfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlIEZvcmVpZ25OZXN0ZWQgewotICAgICAgZ2V0IHsgcmV0dXJuIGZvcmVpZ25OZXN0ZWRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBmb3JlaWduTmVzdGVkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdEZvcmVpZ25OZXN0ZWQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhUZXN0Rm9yZWlnbk5lc3RlZCBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoRm9yZWlnbk5lc3RlZCwgb3RoZXIuRm9yZWlnbk5lc3RlZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoZm9yZWlnbk5lc3RlZF8gIT0gbnVsbCkgaGFzaCBePSBGb3JlaWduTmVzdGVkLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChmb3JlaWduTmVzdGVkXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoRm9yZWlnbk5lc3RlZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGZvcmVpZ25OZXN0ZWRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShGb3JlaWduTmVzdGVkKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0Rm9yZWlnbk5lc3RlZCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLmZvcmVpZ25OZXN0ZWRfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKGZvcmVpZ25OZXN0ZWRfID09IG51bGwpIHsKLSAgICAgICAgICBmb3JlaWduTmVzdGVkXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcy5UeXBlcy5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRm9yZWlnbk5lc3RlZC5NZXJnZUZyb20ob3RoZXIuRm9yZWlnbk5lc3RlZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgaWYgKGZvcmVpZ25OZXN0ZWRfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgZm9yZWlnbk5lc3RlZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0QWxsVHlwZXMuVHlwZXMuTmVzdGVkTWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2UoZm9yZWlnbk5lc3RlZF8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgVGVzdCB0aGF0IHJlYWxseSBsYXJnZSB0YWcgbnVtYmVycyBkb24ndCBicmVhayBhbnl0aGluZy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciA6IHBiOjpJTWVzc2FnZTxUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXI+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXI+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyPigoKSA9PiBuZXcgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcigpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyKFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBvdGhlcikgOiB0aGlzKCkgewotICAgICAgYV8gPSBvdGhlci5hXzsKLSAgICAgIGJiXyA9IG90aGVyLmJiXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJhIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBBRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgaW50IGFfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBsYXJnZXN0IHBvc3NpYmxlIHRhZyBudW1iZXIgaXMgMl4yOCAtIDEsIHNpbmNlIHRoZSB3aXJlIGZvcm1hdCB1c2VzCi0gICAgLy8vICB0aHJlZSBiaXRzIHRvIGNvbW11bmljYXRlIHdpcmUgdHlwZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnQgQSB7Ci0gICAgICBnZXQgeyByZXR1cm4gYV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGFfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJiYiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQmJGaWVsZE51bWJlciA9IDI2ODQzNTQ1NTsKLSAgICBwcml2YXRlIGludCBiYl87Ci0gICAgcHVibGljIGludCBCYiB7Ci0gICAgICBnZXQgeyByZXR1cm4gYmJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBiYl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlcik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFRlc3RSZWFsbHlMYXJnZVRhZ051bWJlciBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoQSAhPSBvdGhlci5BKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQmIgIT0gb3RoZXIuQmIpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoQSAhPSAwKSBoYXNoIF49IEEuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChCYiAhPSAwKSBoYXNoIF49IEJiLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChBICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihBKTsKLSAgICAgIH0KLSAgICAgIGlmIChCYiAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNDgsIDI1NSwgMjU1LCAyNTUsIDcpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihCYik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKEEgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShBKTsKLSAgICAgIH0KLSAgICAgIGlmIChCYiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gNSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEJiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5BICE9IDApIHsKLSAgICAgICAgQSA9IG90aGVyLkE7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuQmIgIT0gMCkgewotICAgICAgICBCYiA9IG90aGVyLkJiOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgQSA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjE0NzQ4MzY0MDogewotICAgICAgICAgICAgQmIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RSZWN1cnNpdmVNZXNzYWdlIDogcGI6OklNZXNzYWdlPFRlc3RSZWN1cnNpdmVNZXNzYWdlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFJlY3Vyc2l2ZU1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFJlY3Vyc2l2ZU1lc3NhZ2U+KCgpID0+IG5ldyBUZXN0UmVjdXJzaXZlTWVzc2FnZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RSZWN1cnNpdmVNZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbN107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RSZWN1cnNpdmVNZXNzYWdlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUZXN0UmVjdXJzaXZlTWVzc2FnZShUZXN0UmVjdXJzaXZlTWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgQSA9IG90aGVyLmFfICE9IG51bGwgPyBvdGhlci5BLkNsb25lKCkgOiBudWxsOwotICAgICAgaV8gPSBvdGhlci5pXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RSZWN1cnNpdmVNZXNzYWdlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYV87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgQSB7Ci0gICAgICBnZXQgeyByZXR1cm4gYV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGFfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJpIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBJRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgaW50IGlfOwotICAgIHB1YmxpYyBpbnQgSSB7Ci0gICAgICBnZXQgeyByZXR1cm4gaV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGlfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBUZXN0UmVjdXJzaXZlTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFRlc3RSZWN1cnNpdmVNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhBLCBvdGhlci5BKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEkgIT0gb3RoZXIuSSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChhXyAhPSBudWxsKSBoYXNoIF49IEEuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChJICE9IDApIGhhc2ggXj0gSS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoYV8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKEEpOwotICAgICAgfQotICAgICAgaWYgKEkgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihJKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoYV8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKEEpOwotICAgICAgfQotICAgICAgaWYgKEkgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShJKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0UmVjdXJzaXZlTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLmFfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKGFfID09IG51bGwpIHsKLSAgICAgICAgICBhXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RSZWN1cnNpdmVNZXNzYWdlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQS5NZXJnZUZyb20ob3RoZXIuQSk7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuSSAhPSAwKSB7Ci0gICAgICAgIEkgPSBvdGhlci5JOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGlmIChhXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIGFfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKGFfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICBJID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUZXN0IHRoYXQgbXV0dWFsIHJlY3Vyc2lvbiB3b3Jrcy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RNdXR1YWxSZWN1cnNpb25BIDogcGI6OklNZXNzYWdlPFRlc3RNdXR1YWxSZWN1cnNpb25BPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE11dHVhbFJlY3Vyc2lvbkE+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE11dHVhbFJlY3Vyc2lvbkE+KCgpID0+IG5ldyBUZXN0TXV0dWFsUmVjdXJzaW9uQSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RNdXR1YWxSZWN1cnNpb25BPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbOF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNdXR1YWxSZWN1cnNpb25BKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQShUZXN0TXV0dWFsUmVjdXJzaW9uQSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgQmIgPSBvdGhlci5iYl8gIT0gbnVsbCA/IG90aGVyLkJiLkNsb25lKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgVGVzdE11dHVhbFJlY3Vyc2lvbkEodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJiYiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQmJGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CIGJiXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQiBCYiB7Ci0gICAgICBnZXQgeyByZXR1cm4gYmJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBiYl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3RNdXR1YWxSZWN1cnNpb25BKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdE11dHVhbFJlY3Vyc2lvbkEgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKEJiLCBvdGhlci5CYikpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoYmJfICE9IG51bGwpIGhhc2ggXj0gQmIuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKGJiXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoQmIpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChiYl8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKEJiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0TXV0dWFsUmVjdXJzaW9uQSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLmJiXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChiYl8gPT0gbnVsbCkgewotICAgICAgICAgIGJiXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25CKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQmIuTWVyZ2VGcm9tKG90aGVyLkJiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBpZiAoYmJfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgYmJfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKGJiXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0TXV0dWFsUmVjdXJzaW9uQiA6IHBiOjpJTWVzc2FnZTxUZXN0TXV0dWFsUmVjdXJzaW9uQj4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RNdXR1YWxSZWN1cnNpb25CPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RNdXR1YWxSZWN1cnNpb25CPigoKSA9PiBuZXcgVGVzdE11dHVhbFJlY3Vyc2lvbkIoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0TXV0dWFsUmVjdXJzaW9uQj4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzldOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0TXV0dWFsUmVjdXJzaW9uQigpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdE11dHVhbFJlY3Vyc2lvbkIoVGVzdE11dHVhbFJlY3Vyc2lvbkIgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIEEgPSBvdGhlci5hXyAhPSBudWxsID8gb3RoZXIuQS5DbG9uZSgpIDogbnVsbDsKLSAgICAgIG9wdGlvbmFsSW50MzJfID0gb3RoZXIub3B0aW9uYWxJbnQzMl87Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RNdXR1YWxSZWN1cnNpb25CIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0TXV0dWFsUmVjdXJzaW9uQih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImEiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEFGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BIGFfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RNdXR1YWxSZWN1cnNpb25BIEEgewotICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBhXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9uYWxfaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbmFsSW50MzJGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBpbnQgb3B0aW9uYWxJbnQzMl87Ci0gICAgcHVibGljIGludCBPcHRpb25hbEludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25hbEludDMyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3B0aW9uYWxJbnQzMl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3RNdXR1YWxSZWN1cnNpb25CKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdE11dHVhbFJlY3Vyc2lvbkIgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKEEsIG90aGVyLkEpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT3B0aW9uYWxJbnQzMiAhPSBvdGhlci5PcHRpb25hbEludDMyKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKGFfICE9IG51bGwpIGhhc2ggXj0gQS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9wdGlvbmFsSW50MzIgIT0gMCkgaGFzaCBePSBPcHRpb25hbEludDMyLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChhXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoQSk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxJbnQzMiAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKE9wdGlvbmFsSW50MzIpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChhXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoQSk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3B0aW9uYWxJbnQzMiAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKE9wdGlvbmFsSW50MzIpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFRlc3RNdXR1YWxSZWN1cnNpb25CIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuYV8gIT0gbnVsbCkgewotICAgICAgICBpZiAoYV8gPT0gbnVsbCkgewotICAgICAgICAgIGFfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdE11dHVhbFJlY3Vyc2lvbkEoKTsKLSAgICAgICAgfQotICAgICAgICBBLk1lcmdlRnJvbShvdGhlci5BKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PcHRpb25hbEludDMyICE9IDApIHsKLSAgICAgICAgT3B0aW9uYWxJbnQzMiA9IG90aGVyLk9wdGlvbmFsSW50MzI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgaWYgKGFfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgYV8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2UoYV8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgIE9wdGlvbmFsSW50MzIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIFRlc3QgbWVzc2FnZSB3aXRoIENhbWVsQ2FzZSBmaWVsZCBuYW1lcy4gIFRoaXMgdmlvbGF0ZXMgUHJvdG9jb2wgQnVmZmVyCi0gIC8vLyAgc3RhbmRhcmQgc3R5bGUuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyA6IHBiOjpJTWVzc2FnZTxUZXN0Q2FtZWxDYXNlRmllbGROYW1lcz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzPigoKSA9PiBuZXcgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0Q2FtZWxDYXNlRmllbGROYW1lcz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzEwXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzKFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBwcmltaXRpdmVGaWVsZF8gPSBvdGhlci5wcmltaXRpdmVGaWVsZF87Ci0gICAgICBzdHJpbmdGaWVsZF8gPSBvdGhlci5zdHJpbmdGaWVsZF87Ci0gICAgICBlbnVtRmllbGRfID0gb3RoZXIuZW51bUZpZWxkXzsKLSAgICAgIE1lc3NhZ2VGaWVsZCA9IG90aGVyLm1lc3NhZ2VGaWVsZF8gIT0gbnVsbCA/IG90aGVyLk1lc3NhZ2VGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfID0gb3RoZXIucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkU3RyaW5nRmllbGRfID0gb3RoZXIucmVwZWF0ZWRTdHJpbmdGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHJlcGVhdGVkRW51bUZpZWxkXyA9IG90aGVyLnJlcGVhdGVkRW51bUZpZWxkXy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRNZXNzYWdlRmllbGRfID0gb3RoZXIucmVwZWF0ZWRNZXNzYWdlRmllbGRfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIlByaW1pdGl2ZUZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQcmltaXRpdmVGaWVsZEZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGludCBwcmltaXRpdmVGaWVsZF87Ci0gICAgcHVibGljIGludCBQcmltaXRpdmVGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcHJpbWl0aXZlRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBwcmltaXRpdmVGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIlN0cmluZ0ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTdHJpbmdGaWVsZEZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIHN0cmluZyBzdHJpbmdGaWVsZF8gPSAiIjsKLSAgICBwdWJsaWMgc3RyaW5nIFN0cmluZ0ZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBzdHJpbmdGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHN0cmluZ0ZpZWxkXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIkVudW1GaWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bUZpZWxkRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBlbnVtRmllbGRfID0gMDsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSBFbnVtRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIGVudW1GaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGVudW1GaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIk1lc3NhZ2VGaWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZUZpZWxkRmllbGROdW1iZXIgPSA0OwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZSBtZXNzYWdlRmllbGRfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlIE1lc3NhZ2VGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWVzc2FnZUZpZWxkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbWVzc2FnZUZpZWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiUmVwZWF0ZWRQcmltaXRpdmVGaWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEZpZWxkTnVtYmVyID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ+IF9yZXBlYXRlZF9yZXBlYXRlZFByaW1pdGl2ZUZpZWxkX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoNTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gUmVwZWF0ZWRQcmltaXRpdmVGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIlJlcGVhdGVkU3RyaW5nRmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkU3RyaW5nRmllbGRGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8c3RyaW5nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRTdHJpbmdGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cmluZyg2Nik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiByZXBlYXRlZFN0cmluZ0ZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBSZXBlYXRlZFN0cmluZ0ZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZFN0cmluZ0ZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiUmVwZWF0ZWRFbnVtRmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRW51bUZpZWxkRmllbGROdW1iZXIgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IF9yZXBlYXRlZF9yZXBlYXRlZEVudW1GaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckVudW0oNzQsIHggPT4gKGludCkgeCwgeCA9PiAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bSkgeCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gcmVwZWF0ZWRFbnVtRmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gUmVwZWF0ZWRFbnVtRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRW51bUZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiUmVwZWF0ZWRNZXNzYWdlRmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkRmllbGROdW1iZXIgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPiBfcmVwZWF0ZWRfcmVwZWF0ZWRNZXNzYWdlRmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDgyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gcmVwZWF0ZWRNZXNzYWdlRmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduTWVzc2FnZT4gUmVwZWF0ZWRNZXNzYWdlRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkTWVzc2FnZUZpZWxkXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoUHJpbWl0aXZlRmllbGQgIT0gb3RoZXIuUHJpbWl0aXZlRmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChTdHJpbmdGaWVsZCAhPSBvdGhlci5TdHJpbmdGaWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEVudW1GaWVsZCAhPSBvdGhlci5FbnVtRmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhNZXNzYWdlRmllbGQsIG90aGVyLk1lc3NhZ2VGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRTdHJpbmdGaWVsZF8uRXF1YWxzKG90aGVyLnJlcGVhdGVkU3RyaW5nRmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkRW51bUZpZWxkXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRFbnVtRmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkTWVzc2FnZUZpZWxkXy5FcXVhbHMob3RoZXIucmVwZWF0ZWRNZXNzYWdlRmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChQcmltaXRpdmVGaWVsZCAhPSAwKSBoYXNoIF49IFByaW1pdGl2ZUZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU3RyaW5nRmllbGQuTGVuZ3RoICE9IDApIGhhc2ggXj0gU3RyaW5nRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChFbnVtRmllbGQgIT0gMCkgaGFzaCBePSBFbnVtRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChtZXNzYWdlRmllbGRfICE9IG51bGwpIGhhc2ggXj0gTWVzc2FnZUZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkU3RyaW5nRmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRW51bUZpZWxkXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSByZXBlYXRlZE1lc3NhZ2VGaWVsZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKFByaW1pdGl2ZUZpZWxkICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihQcmltaXRpdmVGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoU3RyaW5nRmllbGQuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKFN0cmluZ0ZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChFbnVtRmllbGQgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpIEVudW1GaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAobWVzc2FnZUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzNCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoTWVzc2FnZUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFN0cmluZ0ZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkU3RyaW5nRmllbGRfY29kZWMpOwotICAgICAgcmVwZWF0ZWRFbnVtRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRFbnVtRmllbGRfY29kZWMpOwotICAgICAgcmVwZWF0ZWRNZXNzYWdlRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRNZXNzYWdlRmllbGRfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChQcmltaXRpdmVGaWVsZCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKFByaW1pdGl2ZUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChTdHJpbmdGaWVsZC5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoU3RyaW5nRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKEVudW1GaWVsZCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgRW51bUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChtZXNzYWdlRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShNZXNzYWdlRmllbGQpOwotICAgICAgfQotICAgICAgc2l6ZSArPSByZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZFByaW1pdGl2ZUZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRTdHJpbmdGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcmVwZWF0ZWRTdHJpbmdGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkRW51bUZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEVudW1GaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkTWVzc2FnZUZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZE1lc3NhZ2VGaWVsZF9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVGVzdENhbWVsQ2FzZUZpZWxkTmFtZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5QcmltaXRpdmVGaWVsZCAhPSAwKSB7Ci0gICAgICAgIFByaW1pdGl2ZUZpZWxkID0gb3RoZXIuUHJpbWl0aXZlRmllbGQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU3RyaW5nRmllbGQuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgU3RyaW5nRmllbGQgPSBvdGhlci5TdHJpbmdGaWVsZDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5FbnVtRmllbGQgIT0gMCkgewotICAgICAgICBFbnVtRmllbGQgPSBvdGhlci5FbnVtRmllbGQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIubWVzc2FnZUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChtZXNzYWdlRmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICBtZXNzYWdlRmllbGRfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbk1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBNZXNzYWdlRmllbGQuTWVyZ2VGcm9tKG90aGVyLk1lc3NhZ2VGaWVsZCk7Ci0gICAgICB9Ci0gICAgICByZXBlYXRlZFByaW1pdGl2ZUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRQcmltaXRpdmVGaWVsZF8pOwotICAgICAgcmVwZWF0ZWRTdHJpbmdGaWVsZF8uQWRkKG90aGVyLnJlcGVhdGVkU3RyaW5nRmllbGRfKTsKLSAgICAgIHJlcGVhdGVkRW51bUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRFbnVtRmllbGRfKTsKLSAgICAgIHJlcGVhdGVkTWVzc2FnZUZpZWxkXy5BZGQob3RoZXIucmVwZWF0ZWRNZXNzYWdlRmllbGRfKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIFByaW1pdGl2ZUZpZWxkID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgU3RyaW5nRmllbGQgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgICAgZW51bUZpZWxkXyA9IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtKSBpbnB1dC5SZWFkRW51bSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzQ6IHsKLSAgICAgICAgICAgIGlmIChtZXNzYWdlRmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgbWVzc2FnZUZpZWxkXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25NZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShtZXNzYWdlRmllbGRfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDU4OgotICAgICAgICAgIGNhc2UgNTY6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkUHJpbWl0aXZlRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRQcmltaXRpdmVGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA2NjogewotICAgICAgICAgICAgcmVwZWF0ZWRTdHJpbmdGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFN0cmluZ0ZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc0OgotICAgICAgICAgIGNhc2UgNzI6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkRW51bUZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRW51bUZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDgyOiB7Ci0gICAgICAgICAgICByZXBlYXRlZE1lc3NhZ2VGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZE1lc3NhZ2VGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBXZSBsaXN0IGZpZWxkcyBvdXQgb2Ygb3JkZXIsIHRvIGVuc3VyZSB0aGF0IHdlJ3JlIHVzaW5nIGZpZWxkIG51bWJlciBhbmQgbm90Ci0gIC8vLyAgZmllbGQgaW5kZXggdG8gZGV0ZXJtaW5lIHNlcmlhbGl6YXRpb24gb3JkZXIuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0RmllbGRPcmRlcmluZ3MgOiBwYjo6SU1lc3NhZ2U8VGVzdEZpZWxkT3JkZXJpbmdzPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdEZpZWxkT3JkZXJpbmdzPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RGaWVsZE9yZGVyaW5ncz4oKCkgPT4gbmV3IFRlc3RGaWVsZE9yZGVyaW5ncygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RGaWVsZE9yZGVyaW5ncz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzExXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdEZpZWxkT3JkZXJpbmdzKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUZXN0RmllbGRPcmRlcmluZ3MoVGVzdEZpZWxkT3JkZXJpbmdzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBteVN0cmluZ18gPSBvdGhlci5teVN0cmluZ187Ci0gICAgICBteUludF8gPSBvdGhlci5teUludF87Ci0gICAgICBteUZsb2F0XyA9IG90aGVyLm15RmxvYXRfOwotICAgICAgU2luZ2xlTmVzdGVkTWVzc2FnZSA9IG90aGVyLnNpbmdsZU5lc3RlZE1lc3NhZ2VfICE9IG51bGwgPyBvdGhlci5TaW5nbGVOZXN0ZWRNZXNzYWdlLkNsb25lKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0RmllbGRPcmRlcmluZ3MgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RGaWVsZE9yZGVyaW5ncyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm15X3N0cmluZyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTXlTdHJpbmdGaWVsZE51bWJlciA9IDExOwotICAgIHByaXZhdGUgc3RyaW5nIG15U3RyaW5nXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgTXlTdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIG15U3RyaW5nXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbXlTdHJpbmdfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibXlfaW50IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNeUludEZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGxvbmcgbXlJbnRfOwotICAgIHB1YmxpYyBsb25nIE15SW50IHsKLSAgICAgIGdldCB7IHJldHVybiBteUludF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG15SW50XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibXlfZmxvYXQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE15RmxvYXRGaWVsZE51bWJlciA9IDEwMTsKLSAgICBwcml2YXRlIGZsb2F0IG15RmxvYXRfOwotICAgIHB1YmxpYyBmbG9hdCBNeUZsb2F0IHsKLSAgICAgIGdldCB7IHJldHVybiBteUZsb2F0XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbXlGbG9hdF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNpbmdsZV9uZXN0ZWRfbWVzc2FnZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2luZ2xlTmVzdGVkTWVzc2FnZUZpZWxkTnVtYmVyID0gMjAwOwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuVHlwZXMuTmVzdGVkTWVzc2FnZSBzaW5nbGVOZXN0ZWRNZXNzYWdlXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0RmllbGRPcmRlcmluZ3MuVHlwZXMuTmVzdGVkTWVzc2FnZSBTaW5nbGVOZXN0ZWRNZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBzaW5nbGVOZXN0ZWRNZXNzYWdlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc2luZ2xlTmVzdGVkTWVzc2FnZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3RGaWVsZE9yZGVyaW5ncyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFRlc3RGaWVsZE9yZGVyaW5ncyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTXlTdHJpbmcgIT0gb3RoZXIuTXlTdHJpbmcpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChNeUludCAhPSBvdGhlci5NeUludCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE15RmxvYXQgIT0gb3RoZXIuTXlGbG9hdCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFNpbmdsZU5lc3RlZE1lc3NhZ2UsIG90aGVyLlNpbmdsZU5lc3RlZE1lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKE15U3RyaW5nLkxlbmd0aCAhPSAwKSBoYXNoIF49IE15U3RyaW5nLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoTXlJbnQgIT0gMEwpIGhhc2ggXj0gTXlJbnQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChNeUZsb2F0ICE9IDBGKSBoYXNoIF49IE15RmxvYXQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChzaW5nbGVOZXN0ZWRNZXNzYWdlXyAhPSBudWxsKSBoYXNoIF49IFNpbmdsZU5lc3RlZE1lc3NhZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKE15SW50ICE9IDBMKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoTXlJbnQpOwotICAgICAgfQotICAgICAgaWYgKE15U3RyaW5nLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg5MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhNeVN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoTXlGbG9hdCAhPSAwRikgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTczLCA2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoTXlGbG9hdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc2luZ2xlTmVzdGVkTWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTk0LCAxMik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU2luZ2xlTmVzdGVkTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKE15U3RyaW5nLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShNeVN0cmluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoTXlJbnQgIT0gMEwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoTXlJbnQpOwotICAgICAgfQotICAgICAgaWYgKE15RmxvYXQgIT0gMEYpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgNDsKLSAgICAgIH0KLSAgICAgIGlmIChzaW5nbGVOZXN0ZWRNZXNzYWdlXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMiArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoU2luZ2xlTmVzdGVkTWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVGVzdEZpZWxkT3JkZXJpbmdzIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuTXlTdHJpbmcuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTXlTdHJpbmcgPSBvdGhlci5NeVN0cmluZzsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5NeUludCAhPSAwTCkgewotICAgICAgICBNeUludCA9IG90aGVyLk15SW50OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk15RmxvYXQgIT0gMEYpIHsKLSAgICAgICAgTXlGbG9hdCA9IG90aGVyLk15RmxvYXQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuc2luZ2xlTmVzdGVkTWVzc2FnZV8gIT0gbnVsbCkgewotICAgICAgICBpZiAoc2luZ2xlTmVzdGVkTWVzc2FnZV8gPT0gbnVsbCkgewotICAgICAgICAgIHNpbmdsZU5lc3RlZE1lc3NhZ2VfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLlR5cGVzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICBTaW5nbGVOZXN0ZWRNZXNzYWdlLk1lcmdlRnJvbShvdGhlci5TaW5nbGVOZXN0ZWRNZXNzYWdlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIE15SW50ID0gaW5wdXQuUmVhZEludDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgTXlTdHJpbmcgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MTM6IHsKLSAgICAgICAgICAgIE15RmxvYXQgPSBpbnB1dC5SZWFkRmxvYXQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2MDI6IHsKLSAgICAgICAgICAgIGlmIChzaW5nbGVOZXN0ZWRNZXNzYWdlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHNpbmdsZU5lc3RlZE1lc3NhZ2VfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLlR5cGVzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHNpbmdsZU5lc3RlZE1lc3NhZ2VfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBUZXN0RmllbGRPcmRlcmluZ3MgbWVzc2FnZSB0eXBlLjwvc3VtbWFyeT4KLSAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7Ci0gICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgICAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE5lc3RlZE1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8TmVzdGVkTWVzc2FnZT4gewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxOZXN0ZWRNZXNzYWdlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZE1lc3NhZ2U+KCgpID0+IG5ldyBOZXN0ZWRNZXNzYWdlKCkpOwotICAgICAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE5lc3RlZE1lc3NhZ2U+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEZpZWxkT3JkZXJpbmdzLkRlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07IH0KLSAgICAgICAgfQotCi0gICAgICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTmVzdGVkTWVzc2FnZSgpIHsKLSAgICAgICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICAgICAgcHVibGljIE5lc3RlZE1lc3NhZ2UoTmVzdGVkTWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgICAgIG9vXyA9IG90aGVyLm9vXzsKLSAgICAgICAgICBiYl8gPSBvdGhlci5iYl87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTmVzdGVkTWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IE5lc3RlZE1lc3NhZ2UodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9vIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgT29GaWVsZE51bWJlciA9IDI7Ci0gICAgICAgIHByaXZhdGUgbG9uZyBvb187Ci0gICAgICAgIHB1YmxpYyBsb25nIE9vIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gb29fOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIG9vXyA9IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYmIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNvbnN0IGludCBCYkZpZWxkTnVtYmVyID0gMTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYmJfOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKLSAgICAgICAgLy8vICBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgotICAgICAgICAvLy8gIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEJiIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gYmJfOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIGJiXyA9IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE5lc3RlZE1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKE5lc3RlZE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChPbyAhPSBvdGhlci5PbykgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlmIChCYiAhPSBvdGhlci5CYikgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICAgICAgaWYgKE9vICE9IDBMKSBoYXNoIF49IE9vLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgICAgaWYgKEJiICE9IDApIGhhc2ggXj0gQmIuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgICAgIGlmIChCYiAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihCYik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChPbyAhPSAwTCkgewotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDY0KE9vKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICAgIGlmIChPbyAhPSAwTCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoT28pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoQmIgIT0gMCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoQmIpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShOZXN0ZWRNZXNzYWdlIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG90aGVyLk9vICE9IDBMKSB7Ci0gICAgICAgICAgICBPbyA9IG90aGVyLk9vOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAob3RoZXIuQmIgIT0gMCkgewotICAgICAgICAgICAgQmIgPSBvdGhlci5CYjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgICAgICB1aW50IHRhZzsKLSAgICAgICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICAgICAgQmIgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICAgICAgT28gPSBpbnB1dC5SZWFkSW50NjQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU3BhcnNlRW51bU1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8U3BhcnNlRW51bU1lc3NhZ2U+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxTcGFyc2VFbnVtTWVzc2FnZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxTcGFyc2VFbnVtTWVzc2FnZT4oKCkgPT4gbmV3IFNwYXJzZUVudW1NZXNzYWdlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8U3BhcnNlRW51bU1lc3NhZ2U+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFNwYXJzZUVudW1NZXNzYWdlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBTcGFyc2VFbnVtTWVzc2FnZShTcGFyc2VFbnVtTWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgc3BhcnNlRW51bV8gPSBvdGhlci5zcGFyc2VFbnVtXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3BhcnNlRW51bU1lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFNwYXJzZUVudW1NZXNzYWdlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic3BhcnNlX2VudW0iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNwYXJzZUVudW1GaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RTcGFyc2VFbnVtIHNwYXJzZUVudW1fID0gMDsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0U3BhcnNlRW51bSBTcGFyc2VFbnVtIHsKLSAgICAgIGdldCB7IHJldHVybiBzcGFyc2VFbnVtXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc3BhcnNlRW51bV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFNwYXJzZUVudW1NZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoU3BhcnNlRW51bU1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKFNwYXJzZUVudW0gIT0gb3RoZXIuU3BhcnNlRW51bSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChTcGFyc2VFbnVtICE9IDApIGhhc2ggXj0gU3BhcnNlRW51bS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoU3BhcnNlRW51bSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBTcGFyc2VFbnVtKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoU3BhcnNlRW51bSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgU3BhcnNlRW51bSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oU3BhcnNlRW51bU1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5TcGFyc2VFbnVtICE9IDApIHsKLSAgICAgICAgU3BhcnNlRW51bSA9IG90aGVyLlNwYXJzZUVudW07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBzcGFyc2VFbnVtXyA9IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RTcGFyc2VFbnVtKSBpbnB1dC5SZWFkRW51bSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgVGVzdCBTdHJpbmcgYW5kIEJ5dGVzOiBzdHJpbmcgaXMgZm9yIHZhbGlkIFVURi04IHN0cmluZ3MKLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE9uZVN0cmluZyA6IHBiOjpJTWVzc2FnZTxPbmVTdHJpbmc+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxPbmVTdHJpbmc+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8T25lU3RyaW5nPigoKSA9PiBuZXcgT25lU3RyaW5nKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8T25lU3RyaW5nPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTNdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBPbmVTdHJpbmcoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIE9uZVN0cmluZyhPbmVTdHJpbmcgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGRhdGFfID0gb3RoZXIuZGF0YV87Ci0gICAgfQotCi0gICAgcHVibGljIE9uZVN0cmluZyBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgT25lU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGF0YSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGF0YUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBkYXRhXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgRGF0YSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGF0YV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGRhdGFfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgT25lU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoT25lU3RyaW5nIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChEYXRhICE9IG90aGVyLkRhdGEpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoRGF0YS5MZW5ndGggIT0gMCkgaGFzaCBePSBEYXRhLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChEYXRhLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhEYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoRGF0YS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoRGF0YSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oT25lU3RyaW5nIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRGF0YS5MZW5ndGggIT0gMCkgewotICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBEYXRhID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTW9yZVN0cmluZyA6IHBiOjpJTWVzc2FnZTxNb3JlU3RyaW5nPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8TW9yZVN0cmluZz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxNb3JlU3RyaW5nPigoKSA9PiBuZXcgTW9yZVN0cmluZygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE1vcmVTdHJpbmc+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxNF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIE1vcmVTdHJpbmcoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIE1vcmVTdHJpbmcoTW9yZVN0cmluZyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgZGF0YV8gPSBvdGhlci5kYXRhXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNb3JlU3RyaW5nIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBNb3JlU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGF0YSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGF0YUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxzdHJpbmc+IF9yZXBlYXRlZF9kYXRhX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RyaW5nKDEwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+IGRhdGFfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+IERhdGEgewotICAgICAgZ2V0IHsgcmV0dXJuIGRhdGFfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBNb3JlU3RyaW5nKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoTW9yZVN0cmluZyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZighZGF0YV8uRXF1YWxzKG90aGVyLmRhdGFfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGhhc2ggXj0gZGF0YV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgZGF0YV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9kYXRhX2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBzaXplICs9IGRhdGFfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX2RhdGFfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKE1vcmVTdHJpbmcgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGRhdGFfLkFkZChvdGhlci5kYXRhXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgZGF0YV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9kYXRhX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE9uZUJ5dGVzIDogcGI6OklNZXNzYWdlPE9uZUJ5dGVzPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8T25lQnl0ZXM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8T25lQnl0ZXM+KCgpID0+IG5ldyBPbmVCeXRlcygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE9uZUJ5dGVzPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTVdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBPbmVCeXRlcygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgT25lQnl0ZXMoT25lQnl0ZXMgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGRhdGFfID0gb3RoZXIuZGF0YV87Ci0gICAgfQotCi0gICAgcHVibGljIE9uZUJ5dGVzIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBPbmVCeXRlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRhdGEiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERhdGFGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBkYXRhXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5OwotICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBEYXRhIHsKLSAgICAgIGdldCB7IHJldHVybiBkYXRhXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGF0YV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBPbmVCeXRlcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKE9uZUJ5dGVzIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChEYXRhICE9IG90aGVyLkRhdGEpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoRGF0YS5MZW5ndGggIT0gMCkgaGFzaCBePSBEYXRhLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChEYXRhLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKERhdGEpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChEYXRhLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKERhdGEpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKE9uZUJ5dGVzIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRGF0YS5MZW5ndGggIT0gMCkgewotICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBEYXRhID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBNb3JlQnl0ZXMgOiBwYjo6SU1lc3NhZ2U8TW9yZUJ5dGVzPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8TW9yZUJ5dGVzPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE1vcmVCeXRlcz4oKCkgPT4gbmV3IE1vcmVCeXRlcygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE1vcmVCeXRlcz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE2XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTW9yZUJ5dGVzKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBNb3JlQnl0ZXMoTW9yZUJ5dGVzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBkYXRhXyA9IG90aGVyLmRhdGFfOwotICAgIH0KLQotICAgIHB1YmxpYyBNb3JlQnl0ZXMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IE1vcmVCeXRlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRhdGEiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERhdGFGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBkYXRhXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5OwotICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBEYXRhIHsKLSAgICAgIGdldCB7IHJldHVybiBkYXRhXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGF0YV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBNb3JlQnl0ZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhNb3JlQnl0ZXMgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKERhdGEgIT0gb3RoZXIuRGF0YSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChEYXRhLkxlbmd0aCAhPSAwKSBoYXNoIF49IERhdGEuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKERhdGEuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQnl0ZXMoRGF0YSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKERhdGEuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoRGF0YSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTW9yZUJ5dGVzIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRGF0YS5MZW5ndGggIT0gMCkgewotICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBEYXRhID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUZXN0IGludDMyLCB1aW50MzIsIGludDY0LCB1aW50NjQsIGFuZCBib29sIGFyZSBhbGwgY29tcGF0aWJsZQotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgSW50MzJNZXNzYWdlIDogcGI6OklNZXNzYWdlPEludDMyTWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEludDMyTWVzc2FnZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxJbnQzMk1lc3NhZ2U+KCgpID0+IG5ldyBJbnQzMk1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxJbnQzMk1lc3NhZ2U+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxN107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEludDMyTWVzc2FnZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgSW50MzJNZXNzYWdlKEludDMyTWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgZGF0YV8gPSBvdGhlci5kYXRhXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50MzJNZXNzYWdlIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBJbnQzMk1lc3NhZ2UodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkYXRhIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEYXRhRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgaW50IGRhdGFfOwotICAgIHB1YmxpYyBpbnQgRGF0YSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGF0YV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGRhdGFfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBJbnQzMk1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhJbnQzMk1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKERhdGEgIT0gb3RoZXIuRGF0YSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChEYXRhICE9IDApIGhhc2ggXj0gRGF0YS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoRGF0YSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoRGF0YSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKERhdGEgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShEYXRhKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShJbnQzMk1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EYXRhICE9IDApIHsKLSAgICAgICAgRGF0YSA9IG90aGVyLkRhdGE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBEYXRhID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBVaW50MzJNZXNzYWdlIDogcGI6OklNZXNzYWdlPFVpbnQzMk1lc3NhZ2U+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxVaW50MzJNZXNzYWdlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFVpbnQzMk1lc3NhZ2U+KCgpID0+IG5ldyBVaW50MzJNZXNzYWdlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VWludDMyTWVzc2FnZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE4XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVWludDMyTWVzc2FnZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVWludDMyTWVzc2FnZShVaW50MzJNZXNzYWdlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBkYXRhXyA9IG90aGVyLmRhdGFfOwotICAgIH0KLQotICAgIHB1YmxpYyBVaW50MzJNZXNzYWdlIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBVaW50MzJNZXNzYWdlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGF0YSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGF0YUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHVpbnQgZGF0YV87Ci0gICAgcHVibGljIHVpbnQgRGF0YSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGF0YV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGRhdGFfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBVaW50MzJNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVWludDMyTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoRGF0YSAhPSBvdGhlci5EYXRhKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKERhdGEgIT0gMCkgaGFzaCBePSBEYXRhLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChEYXRhICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVVSW50MzIoRGF0YSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKERhdGEgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemUoRGF0YSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVWludDMyTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkRhdGEgIT0gMCkgewotICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIERhdGEgPSBpbnB1dC5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBJbnQ2NE1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8SW50NjRNZXNzYWdlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8SW50NjRNZXNzYWdlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEludDY0TWVzc2FnZT4oKCkgPT4gbmV3IEludDY0TWVzc2FnZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEludDY0TWVzc2FnZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE5XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50NjRNZXNzYWdlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBJbnQ2NE1lc3NhZ2UoSW50NjRNZXNzYWdlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBkYXRhXyA9IG90aGVyLmRhdGFfOwotICAgIH0KLQotICAgIHB1YmxpYyBJbnQ2NE1lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEludDY0TWVzc2FnZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRhdGEiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERhdGFGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBsb25nIGRhdGFfOwotICAgIHB1YmxpYyBsb25nIERhdGEgewotICAgICAgZ2V0IHsgcmV0dXJuIGRhdGFfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBkYXRhXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgSW50NjRNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoSW50NjRNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChEYXRhICE9IG90aGVyLkRhdGEpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoRGF0YSAhPSAwTCkgaGFzaCBePSBEYXRhLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChEYXRhICE9IDBMKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoRGF0YSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKERhdGEgIT0gMEwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoRGF0YSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oSW50NjRNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRGF0YSAhPSAwTCkgewotICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIERhdGEgPSBpbnB1dC5SZWFkSW50NjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFVpbnQ2NE1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8VWludDY0TWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFVpbnQ2NE1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VWludDY0TWVzc2FnZT4oKCkgPT4gbmV3IFVpbnQ2NE1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxVaW50NjRNZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBVaW50NjRNZXNzYWdlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBVaW50NjRNZXNzYWdlKFVpbnQ2NE1lc3NhZ2Ugb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGRhdGFfID0gb3RoZXIuZGF0YV87Ci0gICAgfQotCi0gICAgcHVibGljIFVpbnQ2NE1lc3NhZ2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFVpbnQ2NE1lc3NhZ2UodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkYXRhIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEYXRhRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgdWxvbmcgZGF0YV87Ci0gICAgcHVibGljIHVsb25nIERhdGEgewotICAgICAgZ2V0IHsgcmV0dXJuIGRhdGFfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBkYXRhXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVWludDY0TWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFVpbnQ2NE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKERhdGEgIT0gb3RoZXIuRGF0YSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChEYXRhICE9IDBVTCkgaGFzaCBePSBEYXRhLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChEYXRhICE9IDBVTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NChEYXRhKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoRGF0YSAhPSAwVUwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVVSW50NjRTaXplKERhdGEpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFVpbnQ2NE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EYXRhICE9IDBVTCkgewotICAgICAgICBEYXRhID0gb3RoZXIuRGF0YTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIERhdGEgPSBpbnB1dC5SZWFkVUludDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCb29sTWVzc2FnZSA6IHBiOjpJTWVzc2FnZTxCb29sTWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEJvb2xNZXNzYWdlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEJvb2xNZXNzYWdlPigoKSA9PiBuZXcgQm9vbE1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxCb29sTWVzc2FnZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzIxXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQm9vbE1lc3NhZ2UoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEJvb2xNZXNzYWdlKEJvb2xNZXNzYWdlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBkYXRhXyA9IG90aGVyLmRhdGFfOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sTWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgQm9vbE1lc3NhZ2UodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkYXRhIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEYXRhRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgYm9vbCBkYXRhXzsKLSAgICBwdWJsaWMgYm9vbCBEYXRhIHsKLSAgICAgIGdldCB7IHJldHVybiBkYXRhXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGF0YV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEJvb2xNZXNzYWdlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoQm9vbE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKERhdGEgIT0gb3RoZXIuRGF0YSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChEYXRhICE9IGZhbHNlKSBoYXNoIF49IERhdGEuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKERhdGEgIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKERhdGEpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChEYXRhICE9IGZhbHNlKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDE7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oQm9vbE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EYXRhICE9IGZhbHNlKSB7Ci0gICAgICAgIERhdGEgPSBvdGhlci5EYXRhOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgRGF0YSA9IGlucHV0LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUZXN0IG9uZW9mcy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RPbmVvZiA6IHBiOjpJTWVzc2FnZTxUZXN0T25lb2Y+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0T25lb2Y+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE9uZW9mPigoKSA9PiBuZXcgVGVzdE9uZW9mKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdE9uZW9mPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjJdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0T25lb2YoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3RPbmVvZihUZXN0T25lb2Ygb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHN3aXRjaCAob3RoZXIuRm9vQ2FzZSkgewotICAgICAgICBjYXNlIEZvb09uZW9mQ2FzZS5Gb29JbnQ6Ci0gICAgICAgICAgRm9vSW50ID0gb3RoZXIuRm9vSW50OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZvb09uZW9mQ2FzZS5Gb29TdHJpbmc6Ci0gICAgICAgICAgRm9vU3RyaW5nID0gb3RoZXIuRm9vU3RyaW5nOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZvb09uZW9mQ2FzZS5Gb29NZXNzYWdlOgotICAgICAgICAgIEZvb01lc3NhZ2UgPSBvdGhlci5Gb29NZXNzYWdlLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdE9uZW9mIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0T25lb2YodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmb29faW50IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGb29JbnRGaWVsZE51bWJlciA9IDE7Ci0gICAgcHVibGljIGludCBGb29JbnQgewotICAgICAgZ2V0IHsgcmV0dXJuIGZvb0Nhc2VfID09IEZvb09uZW9mQ2FzZS5Gb29JbnQgPyAoaW50KSBmb29fIDogMDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZm9vXyA9IHZhbHVlOwotICAgICAgICBmb29DYXNlXyA9IEZvb09uZW9mQ2FzZS5Gb29JbnQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmb29fc3RyaW5nIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGb29TdHJpbmdGaWVsZE51bWJlciA9IDI7Ci0gICAgcHVibGljIHN0cmluZyBGb29TdHJpbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIGZvb0Nhc2VfID09IEZvb09uZW9mQ2FzZS5Gb29TdHJpbmcgPyAoc3RyaW5nKSBmb29fIDogIiI7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGZvb18gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgIGZvb0Nhc2VfID0gRm9vT25lb2ZDYXNlLkZvb1N0cmluZzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZvb19tZXNzYWdlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGb29NZXNzYWdlRmllbGROdW1iZXIgPSAzOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcyBGb29NZXNzYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBmb29DYXNlXyA9PSBGb29PbmVvZkNhc2UuRm9vTWVzc2FnZSA/IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcykgZm9vXyA6IG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGZvb18gPSB2YWx1ZTsKLSAgICAgICAgZm9vQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gRm9vT25lb2ZDYXNlLk5vbmUgOiBGb29PbmVvZkNhc2UuRm9vTWVzc2FnZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIG9iamVjdCBmb29fOwotICAgIC8vLyA8c3VtbWFyeT5FbnVtIG9mIHBvc3NpYmxlIGNhc2VzIGZvciB0aGUgImZvbyIgb25lb2YuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEZvb09uZW9mQ2FzZSB7Ci0gICAgICBOb25lID0gMCwKLSAgICAgIEZvb0ludCA9IDEsCi0gICAgICBGb29TdHJpbmcgPSAyLAotICAgICAgRm9vTWVzc2FnZSA9IDMsCi0gICAgfQotICAgIHByaXZhdGUgRm9vT25lb2ZDYXNlIGZvb0Nhc2VfID0gRm9vT25lb2ZDYXNlLk5vbmU7Ci0gICAgcHVibGljIEZvb09uZW9mQ2FzZSBGb29DYXNlIHsKLSAgICAgIGdldCB7IHJldHVybiBmb29DYXNlXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIENsZWFyRm9vKCkgewotICAgICAgZm9vQ2FzZV8gPSBGb29PbmVvZkNhc2UuTm9uZTsKLSAgICAgIGZvb18gPSBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdE9uZW9mKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdE9uZW9mIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChGb29JbnQgIT0gb3RoZXIuRm9vSW50KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRm9vU3RyaW5nICE9IG90aGVyLkZvb1N0cmluZykgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKEZvb01lc3NhZ2UsIG90aGVyLkZvb01lc3NhZ2UpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRm9vQ2FzZSAhPSBvdGhlci5Gb29DYXNlKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKGZvb0Nhc2VfID09IEZvb09uZW9mQ2FzZS5Gb29JbnQpIGhhc2ggXj0gRm9vSW50LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoZm9vQ2FzZV8gPT0gRm9vT25lb2ZDYXNlLkZvb1N0cmluZykgaGFzaCBePSBGb29TdHJpbmcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChmb29DYXNlXyA9PSBGb29PbmVvZkNhc2UuRm9vTWVzc2FnZSkgaGFzaCBePSBGb29NZXNzYWdlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IChpbnQpIGZvb0Nhc2VfOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoZm9vQ2FzZV8gPT0gRm9vT25lb2ZDYXNlLkZvb0ludCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEZvb0ludCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZm9vQ2FzZV8gPT0gRm9vT25lb2ZDYXNlLkZvb1N0cmluZykgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoRm9vU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGlmIChmb29DYXNlXyA9PSBGb29PbmVvZkNhc2UuRm9vTWVzc2FnZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKEZvb01lc3NhZ2UpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChmb29DYXNlXyA9PSBGb29PbmVvZkNhc2UuRm9vSW50KSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEZvb0ludCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZm9vQ2FzZV8gPT0gRm9vT25lb2ZDYXNlLkZvb1N0cmluZykgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoRm9vU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIGlmIChmb29DYXNlXyA9PSBGb29PbmVvZkNhc2UuRm9vTWVzc2FnZSkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKEZvb01lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFRlc3RPbmVvZiBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc3dpdGNoIChvdGhlci5Gb29DYXNlKSB7Ci0gICAgICAgIGNhc2UgRm9vT25lb2ZDYXNlLkZvb0ludDoKLSAgICAgICAgICBGb29JbnQgPSBvdGhlci5Gb29JbnQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRm9vT25lb2ZDYXNlLkZvb1N0cmluZzoKLSAgICAgICAgICBGb29TdHJpbmcgPSBvdGhlci5Gb29TdHJpbmc7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRm9vT25lb2ZDYXNlLkZvb01lc3NhZ2U6Ci0gICAgICAgICAgRm9vTWVzc2FnZSA9IG90aGVyLkZvb01lc3NhZ2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIEZvb0ludCA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIEZvb1N0cmluZyA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI2OiB7Ci0gICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RBbGxUeXBlcyBzdWJCdWlsZGVyID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICBpZiAoZm9vQ2FzZV8gPT0gRm9vT25lb2ZDYXNlLkZvb01lc3NhZ2UpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oRm9vTWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyKTsKLSAgICAgICAgICAgIEZvb01lc3NhZ2UgPSBzdWJCdWlsZGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFBhY2tlZFR5cGVzIDogcGI6OklNZXNzYWdlPFRlc3RQYWNrZWRUeXBlcz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RQYWNrZWRUeXBlcz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0UGFja2VkVHlwZXM+KCgpID0+IG5ldyBUZXN0UGFja2VkVHlwZXMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0UGFja2VkVHlwZXM+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syM107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RQYWNrZWRUeXBlcygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdFBhY2tlZFR5cGVzKFRlc3RQYWNrZWRUeXBlcyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgcGFja2VkSW50MzJfID0gb3RoZXIucGFja2VkSW50MzJfLkNsb25lKCk7Ci0gICAgICBwYWNrZWRJbnQ2NF8gPSBvdGhlci5wYWNrZWRJbnQ2NF8uQ2xvbmUoKTsKLSAgICAgIHBhY2tlZFVpbnQzMl8gPSBvdGhlci5wYWNrZWRVaW50MzJfLkNsb25lKCk7Ci0gICAgICBwYWNrZWRVaW50NjRfID0gb3RoZXIucGFja2VkVWludDY0Xy5DbG9uZSgpOwotICAgICAgcGFja2VkU2ludDMyXyA9IG90aGVyLnBhY2tlZFNpbnQzMl8uQ2xvbmUoKTsKLSAgICAgIHBhY2tlZFNpbnQ2NF8gPSBvdGhlci5wYWNrZWRTaW50NjRfLkNsb25lKCk7Ci0gICAgICBwYWNrZWRGaXhlZDMyXyA9IG90aGVyLnBhY2tlZEZpeGVkMzJfLkNsb25lKCk7Ci0gICAgICBwYWNrZWRGaXhlZDY0XyA9IG90aGVyLnBhY2tlZEZpeGVkNjRfLkNsb25lKCk7Ci0gICAgICBwYWNrZWRTZml4ZWQzMl8gPSBvdGhlci5wYWNrZWRTZml4ZWQzMl8uQ2xvbmUoKTsKLSAgICAgIHBhY2tlZFNmaXhlZDY0XyA9IG90aGVyLnBhY2tlZFNmaXhlZDY0Xy5DbG9uZSgpOwotICAgICAgcGFja2VkRmxvYXRfID0gb3RoZXIucGFja2VkRmxvYXRfLkNsb25lKCk7Ci0gICAgICBwYWNrZWREb3VibGVfID0gb3RoZXIucGFja2VkRG91YmxlXy5DbG9uZSgpOwotICAgICAgcGFja2VkQm9vbF8gPSBvdGhlci5wYWNrZWRCb29sXy5DbG9uZSgpOwotICAgICAgcGFja2VkRW51bV8gPSBvdGhlci5wYWNrZWRFbnVtXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0UGFja2VkVHlwZXMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RQYWNrZWRUeXBlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF9pbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkSW50MzJGaWVsZE51bWJlciA9IDkwOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3BhY2tlZEludDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoNzIyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IHBhY2tlZEludDMyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiBQYWNrZWRJbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGFja2VkSW50MzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrZWRfaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEludDY0RmllbGROdW1iZXIgPSA5MTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPiBfcmVwZWF0ZWRfcGFja2VkSW50NjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQ2NCg3MzApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IHBhY2tlZEludDY0XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IFBhY2tlZEludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBwYWNrZWRJbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF91aW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFVpbnQzMkZpZWxkTnVtYmVyID0gOTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWludD4gX3JlcGVhdGVkX3BhY2tlZFVpbnQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclVJbnQzMig3MzgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+IHBhY2tlZFVpbnQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PiBQYWNrZWRVaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFVpbnQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF91aW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFVpbnQ2NEZpZWxkTnVtYmVyID0gOTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc+IF9yZXBlYXRlZF9wYWNrZWRVaW50NjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JVSW50NjQoNzQ2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4gcGFja2VkVWludDY0XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4gUGFja2VkVWludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBwYWNrZWRVaW50NjRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrZWRfc2ludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRTaW50MzJGaWVsZE51bWJlciA9IDk0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3BhY2tlZFNpbnQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclNJbnQzMig3NTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcGFja2VkU2ludDMyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiBQYWNrZWRTaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFNpbnQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF9zaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNpbnQ2NEZpZWxkTnVtYmVyID0gOTU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz4gX3JlcGVhdGVkX3BhY2tlZFNpbnQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclNJbnQ2NCg3NjIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IHBhY2tlZFNpbnQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPiBQYWNrZWRTaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZFNpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF9maXhlZDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRGaXhlZDMyRmllbGROdW1iZXIgPSA5NjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzx1aW50PiBfcmVwZWF0ZWRfcGFja2VkRml4ZWQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckZpeGVkMzIoNzcwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PiBwYWNrZWRGaXhlZDMyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+IFBhY2tlZEZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEZpeGVkMzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrZWRfZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRml4ZWQ2NEZpZWxkTnVtYmVyID0gOTc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc+IF9yZXBlYXRlZF9wYWNrZWRGaXhlZDY0X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQ2NCg3NzgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPiBwYWNrZWRGaXhlZDY0XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4gUGFja2VkRml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGFja2VkRml4ZWQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF9zZml4ZWQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkU2ZpeGVkMzJGaWVsZE51bWJlciA9IDk4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3BhY2tlZFNmaXhlZDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU0ZpeGVkMzIoNzg2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IHBhY2tlZFNmaXhlZDMyXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiBQYWNrZWRTZml4ZWQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGFja2VkU2ZpeGVkMzJfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrZWRfc2ZpeGVkNjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZFNmaXhlZDY0RmllbGROdW1iZXIgPSA5OTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPiBfcmVwZWF0ZWRfcGFja2VkU2ZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQ2NCg3OTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IHBhY2tlZFNmaXhlZDY0XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+IFBhY2tlZFNmaXhlZDY0IHsKLSAgICAgIGdldCB7IHJldHVybiBwYWNrZWRTZml4ZWQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF9mbG9hdCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRmxvYXRGaWVsZE51bWJlciA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxmbG9hdD4gX3JlcGVhdGVkX3BhY2tlZEZsb2F0X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRmxvYXQoODAyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD4gcGFja2VkRmxvYXRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGZsb2F0PiBQYWNrZWRGbG9hdCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGFja2VkRmxvYXRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrZWRfZG91YmxlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQYWNrZWREb3VibGVGaWVsZE51bWJlciA9IDEwMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxkb3VibGU+IF9yZXBlYXRlZF9wYWNrZWREb3VibGVfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JEb3VibGUoODEwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxkb3VibGU+IHBhY2tlZERvdWJsZV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGRvdWJsZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGRvdWJsZT4gUGFja2VkRG91YmxlIHsKLSAgICAgIGdldCB7IHJldHVybiBwYWNrZWREb3VibGVfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrZWRfYm9vbCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkQm9vbEZpZWxkTnVtYmVyID0gMTAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGJvb2w+IF9yZXBlYXRlZF9wYWNrZWRCb29sX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yQm9vbCg4MTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGJvb2w+IHBhY2tlZEJvb2xfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxib29sPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Ym9vbD4gUGFja2VkQm9vbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGFja2VkQm9vbF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZF9lbnVtIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQYWNrZWRFbnVtRmllbGROdW1iZXIgPSAxMDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gX3JlcGVhdGVkX3BhY2tlZEVudW1fY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JFbnVtKDgyNiwgeCA9PiAoaW50KSB4LCB4ID0+IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtKSB4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBwYWNrZWRFbnVtXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IFBhY2tlZEVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZEVudW1fOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBUZXN0UGFja2VkVHlwZXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhUZXN0UGFja2VkVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYoIXBhY2tlZEludDMyXy5FcXVhbHMob3RoZXIucGFja2VkSW50MzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXBhY2tlZEludDY0Xy5FcXVhbHMob3RoZXIucGFja2VkSW50NjRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXBhY2tlZFVpbnQzMl8uRXF1YWxzKG90aGVyLnBhY2tlZFVpbnQzMl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcGFja2VkVWludDY0Xy5FcXVhbHMob3RoZXIucGFja2VkVWludDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwYWNrZWRTaW50MzJfLkVxdWFscyhvdGhlci5wYWNrZWRTaW50MzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXBhY2tlZFNpbnQ2NF8uRXF1YWxzKG90aGVyLnBhY2tlZFNpbnQ2NF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcGFja2VkRml4ZWQzMl8uRXF1YWxzKG90aGVyLnBhY2tlZEZpeGVkMzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXBhY2tlZEZpeGVkNjRfLkVxdWFscyhvdGhlci5wYWNrZWRGaXhlZDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwYWNrZWRTZml4ZWQzMl8uRXF1YWxzKG90aGVyLnBhY2tlZFNmaXhlZDMyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwYWNrZWRTZml4ZWQ2NF8uRXF1YWxzKG90aGVyLnBhY2tlZFNmaXhlZDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwYWNrZWRGbG9hdF8uRXF1YWxzKG90aGVyLnBhY2tlZEZsb2F0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwYWNrZWREb3VibGVfLkVxdWFscyhvdGhlci5wYWNrZWREb3VibGVfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXBhY2tlZEJvb2xfLkVxdWFscyhvdGhlci5wYWNrZWRCb29sXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwYWNrZWRFbnVtXy5FcXVhbHMob3RoZXIucGFja2VkRW51bV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaGFzaCBePSBwYWNrZWRJbnQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGFja2VkSW50NjRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHBhY2tlZFVpbnQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGFja2VkVWludDY0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBwYWNrZWRTaW50MzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHBhY2tlZFNpbnQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGFja2VkRml4ZWQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGFja2VkRml4ZWQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGFja2VkU2ZpeGVkMzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHBhY2tlZFNmaXhlZDY0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBwYWNrZWRGbG9hdF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcGFja2VkRG91YmxlXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBwYWNrZWRCb29sXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBwYWNrZWRFbnVtXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBwYWNrZWRJbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9wYWNrZWRJbnQzMl9jb2RlYyk7Ci0gICAgICBwYWNrZWRJbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9wYWNrZWRJbnQ2NF9jb2RlYyk7Ci0gICAgICBwYWNrZWRVaW50MzJfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGFja2VkVWludDMyX2NvZGVjKTsKLSAgICAgIHBhY2tlZFVpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9wYWNrZWRVaW50NjRfY29kZWMpOwotICAgICAgcGFja2VkU2ludDMyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3BhY2tlZFNpbnQzMl9jb2RlYyk7Ci0gICAgICBwYWNrZWRTaW50NjRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGFja2VkU2ludDY0X2NvZGVjKTsKLSAgICAgIHBhY2tlZEZpeGVkMzJfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGFja2VkRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBwYWNrZWRGaXhlZDY0Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3BhY2tlZEZpeGVkNjRfY29kZWMpOwotICAgICAgcGFja2VkU2ZpeGVkMzJfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGFja2VkU2ZpeGVkMzJfY29kZWMpOwotICAgICAgcGFja2VkU2ZpeGVkNjRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGFja2VkU2ZpeGVkNjRfY29kZWMpOwotICAgICAgcGFja2VkRmxvYXRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGFja2VkRmxvYXRfY29kZWMpOwotICAgICAgcGFja2VkRG91YmxlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3BhY2tlZERvdWJsZV9jb2RlYyk7Ci0gICAgICBwYWNrZWRCb29sXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3BhY2tlZEJvb2xfY29kZWMpOwotICAgICAgcGFja2VkRW51bV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9wYWNrZWRFbnVtX2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBzaXplICs9IHBhY2tlZEludDMyXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9wYWNrZWRJbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHBhY2tlZEludDY0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9wYWNrZWRJbnQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHBhY2tlZFVpbnQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcGFja2VkVWludDMyX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcGFja2VkVWludDY0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9wYWNrZWRVaW50NjRfY29kZWMpOwotICAgICAgc2l6ZSArPSBwYWNrZWRTaW50MzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3BhY2tlZFNpbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHBhY2tlZFNpbnQ2NF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcGFja2VkU2ludDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcGFja2VkRml4ZWQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcGFja2VkRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHBhY2tlZEZpeGVkNjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3BhY2tlZEZpeGVkNjRfY29kZWMpOwotICAgICAgc2l6ZSArPSBwYWNrZWRTZml4ZWQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcGFja2VkU2ZpeGVkMzJfY29kZWMpOwotICAgICAgc2l6ZSArPSBwYWNrZWRTZml4ZWQ2NF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcGFja2VkU2ZpeGVkNjRfY29kZWMpOwotICAgICAgc2l6ZSArPSBwYWNrZWRGbG9hdF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcGFja2VkRmxvYXRfY29kZWMpOwotICAgICAgc2l6ZSArPSBwYWNrZWREb3VibGVfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3BhY2tlZERvdWJsZV9jb2RlYyk7Ci0gICAgICBzaXplICs9IHBhY2tlZEJvb2xfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3BhY2tlZEJvb2xfY29kZWMpOwotICAgICAgc2l6ZSArPSBwYWNrZWRFbnVtXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9wYWNrZWRFbnVtX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0UGFja2VkVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHBhY2tlZEludDMyXy5BZGQob3RoZXIucGFja2VkSW50MzJfKTsKLSAgICAgIHBhY2tlZEludDY0Xy5BZGQob3RoZXIucGFja2VkSW50NjRfKTsKLSAgICAgIHBhY2tlZFVpbnQzMl8uQWRkKG90aGVyLnBhY2tlZFVpbnQzMl8pOwotICAgICAgcGFja2VkVWludDY0Xy5BZGQob3RoZXIucGFja2VkVWludDY0Xyk7Ci0gICAgICBwYWNrZWRTaW50MzJfLkFkZChvdGhlci5wYWNrZWRTaW50MzJfKTsKLSAgICAgIHBhY2tlZFNpbnQ2NF8uQWRkKG90aGVyLnBhY2tlZFNpbnQ2NF8pOwotICAgICAgcGFja2VkRml4ZWQzMl8uQWRkKG90aGVyLnBhY2tlZEZpeGVkMzJfKTsKLSAgICAgIHBhY2tlZEZpeGVkNjRfLkFkZChvdGhlci5wYWNrZWRGaXhlZDY0Xyk7Ci0gICAgICBwYWNrZWRTZml4ZWQzMl8uQWRkKG90aGVyLnBhY2tlZFNmaXhlZDMyXyk7Ci0gICAgICBwYWNrZWRTZml4ZWQ2NF8uQWRkKG90aGVyLnBhY2tlZFNmaXhlZDY0Xyk7Ci0gICAgICBwYWNrZWRGbG9hdF8uQWRkKG90aGVyLnBhY2tlZEZsb2F0Xyk7Ci0gICAgICBwYWNrZWREb3VibGVfLkFkZChvdGhlci5wYWNrZWREb3VibGVfKTsKLSAgICAgIHBhY2tlZEJvb2xfLkFkZChvdGhlci5wYWNrZWRCb29sXyk7Ci0gICAgICBwYWNrZWRFbnVtXy5BZGQob3RoZXIucGFja2VkRW51bV8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgNzIyOgotICAgICAgICAgIGNhc2UgNzIwOiB7Ci0gICAgICAgICAgICBwYWNrZWRJbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9wYWNrZWRJbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3MzA6Ci0gICAgICAgICAgY2FzZSA3Mjg6IHsKLSAgICAgICAgICAgIHBhY2tlZEludDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhY2tlZEludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDczODoKLSAgICAgICAgICBjYXNlIDczNjogewotICAgICAgICAgICAgcGFja2VkVWludDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhY2tlZFVpbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NDY6Ci0gICAgICAgICAgY2FzZSA3NDQ6IHsKLSAgICAgICAgICAgIHBhY2tlZFVpbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9wYWNrZWRVaW50NjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzU0OgotICAgICAgICAgIGNhc2UgNzUyOiB7Ci0gICAgICAgICAgICBwYWNrZWRTaW50MzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcGFja2VkU2ludDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc2MjoKLSAgICAgICAgICBjYXNlIDc2MDogewotICAgICAgICAgICAgcGFja2VkU2ludDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhY2tlZFNpbnQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NzA6Ci0gICAgICAgICAgY2FzZSA3NzM6IHsKLSAgICAgICAgICAgIHBhY2tlZEZpeGVkMzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcGFja2VkRml4ZWQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3Nzg6Ci0gICAgICAgICAgY2FzZSA3Nzc6IHsKLSAgICAgICAgICAgIHBhY2tlZEZpeGVkNjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcGFja2VkRml4ZWQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3ODY6Ci0gICAgICAgICAgY2FzZSA3ODk6IHsKLSAgICAgICAgICAgIHBhY2tlZFNmaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhY2tlZFNmaXhlZDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc5NDoKLSAgICAgICAgICBjYXNlIDc5MzogewotICAgICAgICAgICAgcGFja2VkU2ZpeGVkNjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcGFja2VkU2ZpeGVkNjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODAyOgotICAgICAgICAgIGNhc2UgODA1OiB7Ci0gICAgICAgICAgICBwYWNrZWRGbG9hdF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9wYWNrZWRGbG9hdF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MTA6Ci0gICAgICAgICAgY2FzZSA4MDk6IHsKLSAgICAgICAgICAgIHBhY2tlZERvdWJsZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9wYWNrZWREb3VibGVfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODE4OgotICAgICAgICAgIGNhc2UgODE2OiB7Ci0gICAgICAgICAgICBwYWNrZWRCb29sXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhY2tlZEJvb2xfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODI2OgotICAgICAgICAgIGNhc2UgODI0OiB7Ci0gICAgICAgICAgICBwYWNrZWRFbnVtXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhY2tlZEVudW1fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgQSBtZXNzYWdlIHdpdGggdGhlIHNhbWUgZmllbGRzIGFzIFRlc3RQYWNrZWRUeXBlcywgYnV0IHdpdGhvdXQgcGFja2luZy4gVXNlZAotICAvLy8gIHRvIHRlc3QgcGFja2VkICZsdDstPiB1bnBhY2tlZCB3aXJlIGNvbXBhdGliaWxpdHkuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUZXN0VW5wYWNrZWRUeXBlcyA6IHBiOjpJTWVzc2FnZTxUZXN0VW5wYWNrZWRUeXBlcz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RVbnBhY2tlZFR5cGVzPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RVbnBhY2tlZFR5cGVzPigoKSA9PiBuZXcgVGVzdFVucGFja2VkVHlwZXMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0VW5wYWNrZWRUeXBlcz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzI0XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFVucGFja2VkVHlwZXMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3RVbnBhY2tlZFR5cGVzKFRlc3RVbnBhY2tlZFR5cGVzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICB1bnBhY2tlZEludDMyXyA9IG90aGVyLnVucGFja2VkSW50MzJfLkNsb25lKCk7Ci0gICAgICB1bnBhY2tlZEludDY0XyA9IG90aGVyLnVucGFja2VkSW50NjRfLkNsb25lKCk7Ci0gICAgICB1bnBhY2tlZFVpbnQzMl8gPSBvdGhlci51bnBhY2tlZFVpbnQzMl8uQ2xvbmUoKTsKLSAgICAgIHVucGFja2VkVWludDY0XyA9IG90aGVyLnVucGFja2VkVWludDY0Xy5DbG9uZSgpOwotICAgICAgdW5wYWNrZWRTaW50MzJfID0gb3RoZXIudW5wYWNrZWRTaW50MzJfLkNsb25lKCk7Ci0gICAgICB1bnBhY2tlZFNpbnQ2NF8gPSBvdGhlci51bnBhY2tlZFNpbnQ2NF8uQ2xvbmUoKTsKLSAgICAgIHVucGFja2VkRml4ZWQzMl8gPSBvdGhlci51bnBhY2tlZEZpeGVkMzJfLkNsb25lKCk7Ci0gICAgICB1bnBhY2tlZEZpeGVkNjRfID0gb3RoZXIudW5wYWNrZWRGaXhlZDY0Xy5DbG9uZSgpOwotICAgICAgdW5wYWNrZWRTZml4ZWQzMl8gPSBvdGhlci51bnBhY2tlZFNmaXhlZDMyXy5DbG9uZSgpOwotICAgICAgdW5wYWNrZWRTZml4ZWQ2NF8gPSBvdGhlci51bnBhY2tlZFNmaXhlZDY0Xy5DbG9uZSgpOwotICAgICAgdW5wYWNrZWRGbG9hdF8gPSBvdGhlci51bnBhY2tlZEZsb2F0Xy5DbG9uZSgpOwotICAgICAgdW5wYWNrZWREb3VibGVfID0gb3RoZXIudW5wYWNrZWREb3VibGVfLkNsb25lKCk7Ci0gICAgICB1bnBhY2tlZEJvb2xfID0gb3RoZXIudW5wYWNrZWRCb29sXy5DbG9uZSgpOwotICAgICAgdW5wYWNrZWRFbnVtXyA9IG90aGVyLnVucGFja2VkRW51bV8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFVucGFja2VkVHlwZXMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFRlc3RVbnBhY2tlZFR5cGVzKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfaW50MzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkSW50MzJGaWVsZE51bWJlciA9IDkwOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3VucGFja2VkSW50MzJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig3MjApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gdW5wYWNrZWRJbnQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gVW5wYWNrZWRJbnQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRJbnQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVucGFja2VkX2ludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZEludDY0RmllbGROdW1iZXIgPSA5MTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPiBfcmVwZWF0ZWRfdW5wYWNrZWRJbnQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckludDY0KDcyOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gdW5wYWNrZWRJbnQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPiBVbnBhY2tlZEludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZEludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfdWludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFVpbnQzMkZpZWxkTnVtYmVyID0gOTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWludD4gX3JlcGVhdGVkX3VucGFja2VkVWludDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yVUludDMyKDczNik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD4gdW5wYWNrZWRVaW50MzJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD4gVW5wYWNrZWRVaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkVWludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfdWludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFVpbnQ2NEZpZWxkTnVtYmVyID0gOTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc+IF9yZXBlYXRlZF91bnBhY2tlZFVpbnQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclVJbnQ2NCg3NDQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPiB1bnBhY2tlZFVpbnQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IFVucGFja2VkVWludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZFVpbnQ2NF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVucGFja2VkX3NpbnQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRTaW50MzJGaWVsZE51bWJlciA9IDk0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3VucGFja2VkU2ludDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU0ludDMyKDc1Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiB1bnBhY2tlZFNpbnQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gVW5wYWNrZWRTaW50MzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkU2ludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfc2ludDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNpbnQ2NEZpZWxkTnVtYmVyID0gOTU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz4gX3JlcGVhdGVkX3VucGFja2VkU2ludDY0X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU0ludDY0KDc2MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gdW5wYWNrZWRTaW50NjRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gVW5wYWNrZWRTaW50NjQgewotICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkU2ludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfZml4ZWQzMiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRGaXhlZDMyRmllbGROdW1iZXIgPSA5NjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzx1aW50PiBfcmVwZWF0ZWRfdW5wYWNrZWRGaXhlZDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQzMig3NzMpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+IHVucGFja2VkRml4ZWQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PiBVbnBhY2tlZEZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkRml4ZWQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVucGFja2VkX2ZpeGVkNjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkRml4ZWQ2NEZpZWxkTnVtYmVyID0gOTc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc+IF9yZXBlYXRlZF91bnBhY2tlZEZpeGVkNjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JGaXhlZDY0KDc3Nyk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IHVucGFja2VkRml4ZWQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IFVucGFja2VkRml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRGaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfc2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkU2ZpeGVkMzJGaWVsZE51bWJlciA9IDk4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3VucGFja2VkU2ZpeGVkMzJfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTRml4ZWQzMig3ODkpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gdW5wYWNrZWRTZml4ZWQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gVW5wYWNrZWRTZml4ZWQzMiB7Ci0gICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRTZml4ZWQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVucGFja2VkX3NmaXhlZDY0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbnBhY2tlZFNmaXhlZDY0RmllbGROdW1iZXIgPSA5OTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPiBfcmVwZWF0ZWRfdW5wYWNrZWRTZml4ZWQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclNGaXhlZDY0KDc5Myk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gdW5wYWNrZWRTZml4ZWQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPiBVbnBhY2tlZFNmaXhlZDY0IHsKLSAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZFNmaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfZmxvYXQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkRmxvYXRGaWVsZE51bWJlciA9IDEwMDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxmbG9hdD4gX3JlcGVhdGVkX3VucGFja2VkRmxvYXRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JGbG9hdCg4MDUpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGZsb2F0PiB1bnBhY2tlZEZsb2F0XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8ZmxvYXQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD4gVW5wYWNrZWRGbG9hdCB7Ci0gICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRGbG9hdF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVucGFja2VkX2RvdWJsZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWREb3VibGVGaWVsZE51bWJlciA9IDEwMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxkb3VibGU+IF9yZXBlYXRlZF91bnBhY2tlZERvdWJsZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckRvdWJsZSg4MDkpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGRvdWJsZT4gdW5wYWNrZWREb3VibGVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxkb3VibGU+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxkb3VibGU+IFVucGFja2VkRG91YmxlIHsKLSAgICAgIGdldCB7IHJldHVybiB1bnBhY2tlZERvdWJsZV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVucGFja2VkX2Jvb2wiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVucGFja2VkQm9vbEZpZWxkTnVtYmVyID0gMTAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGJvb2w+IF9yZXBlYXRlZF91bnBhY2tlZEJvb2xfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JCb29sKDgxNik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Ym9vbD4gdW5wYWNrZWRCb29sXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Ym9vbD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGJvb2w+IFVucGFja2VkQm9vbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gdW5wYWNrZWRCb29sXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5wYWNrZWRfZW51bSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVW5wYWNrZWRFbnVtRmllbGROdW1iZXIgPSAxMDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Gb3JlaWduRW51bT4gX3JlcGVhdGVkX3VucGFja2VkRW51bV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckVudW0oODI0LCB4ID0+IChpbnQpIHgsIHggPT4gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0pIHgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+IHVucGFja2VkRW51bV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuRm9yZWlnbkVudW0+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLkZvcmVpZ25FbnVtPiBVbnBhY2tlZEVudW0gewotICAgICAgZ2V0IHsgcmV0dXJuIHVucGFja2VkRW51bV87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3RVbnBhY2tlZFR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdFVucGFja2VkVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYoIXVucGFja2VkSW50MzJfLkVxdWFscyhvdGhlci51bnBhY2tlZEludDMyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1bnBhY2tlZEludDY0Xy5FcXVhbHMob3RoZXIudW5wYWNrZWRJbnQ2NF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5wYWNrZWRVaW50MzJfLkVxdWFscyhvdGhlci51bnBhY2tlZFVpbnQzMl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5wYWNrZWRVaW50NjRfLkVxdWFscyhvdGhlci51bnBhY2tlZFVpbnQ2NF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5wYWNrZWRTaW50MzJfLkVxdWFscyhvdGhlci51bnBhY2tlZFNpbnQzMl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5wYWNrZWRTaW50NjRfLkVxdWFscyhvdGhlci51bnBhY2tlZFNpbnQ2NF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5wYWNrZWRGaXhlZDMyXy5FcXVhbHMob3RoZXIudW5wYWNrZWRGaXhlZDMyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1bnBhY2tlZEZpeGVkNjRfLkVxdWFscyhvdGhlci51bnBhY2tlZEZpeGVkNjRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXVucGFja2VkU2ZpeGVkMzJfLkVxdWFscyhvdGhlci51bnBhY2tlZFNmaXhlZDMyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1bnBhY2tlZFNmaXhlZDY0Xy5FcXVhbHMob3RoZXIudW5wYWNrZWRTZml4ZWQ2NF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5wYWNrZWRGbG9hdF8uRXF1YWxzKG90aGVyLnVucGFja2VkRmxvYXRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXVucGFja2VkRG91YmxlXy5FcXVhbHMob3RoZXIudW5wYWNrZWREb3VibGVfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXVucGFja2VkQm9vbF8uRXF1YWxzKG90aGVyLnVucGFja2VkQm9vbF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5wYWNrZWRFbnVtXy5FcXVhbHMob3RoZXIudW5wYWNrZWRFbnVtXykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IHVucGFja2VkSW50MzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHVucGFja2VkSW50NjRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHVucGFja2VkVWludDMyXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB1bnBhY2tlZFVpbnQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5wYWNrZWRTaW50MzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHVucGFja2VkU2ludDY0Xy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB1bnBhY2tlZEZpeGVkMzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHVucGFja2VkRml4ZWQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5wYWNrZWRTZml4ZWQzMl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5wYWNrZWRTZml4ZWQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5wYWNrZWRGbG9hdF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5wYWNrZWREb3VibGVfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHVucGFja2VkQm9vbF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5wYWNrZWRFbnVtXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICB1bnBhY2tlZEludDMyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VucGFja2VkSW50MzJfY29kZWMpOwotICAgICAgdW5wYWNrZWRJbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91bnBhY2tlZEludDY0X2NvZGVjKTsKLSAgICAgIHVucGFja2VkVWludDMyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VucGFja2VkVWludDMyX2NvZGVjKTsKLSAgICAgIHVucGFja2VkVWludDY0Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VucGFja2VkVWludDY0X2NvZGVjKTsKLSAgICAgIHVucGFja2VkU2ludDMyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VucGFja2VkU2ludDMyX2NvZGVjKTsKLSAgICAgIHVucGFja2VkU2ludDY0Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VucGFja2VkU2ludDY0X2NvZGVjKTsKLSAgICAgIHVucGFja2VkRml4ZWQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91bnBhY2tlZEZpeGVkMzJfY29kZWMpOwotICAgICAgdW5wYWNrZWRGaXhlZDY0Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VucGFja2VkRml4ZWQ2NF9jb2RlYyk7Ci0gICAgICB1bnBhY2tlZFNmaXhlZDMyXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VucGFja2VkU2ZpeGVkMzJfY29kZWMpOwotICAgICAgdW5wYWNrZWRTZml4ZWQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91bnBhY2tlZFNmaXhlZDY0X2NvZGVjKTsKLSAgICAgIHVucGFja2VkRmxvYXRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdW5wYWNrZWRGbG9hdF9jb2RlYyk7Ci0gICAgICB1bnBhY2tlZERvdWJsZV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91bnBhY2tlZERvdWJsZV9jb2RlYyk7Ci0gICAgICB1bnBhY2tlZEJvb2xfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdW5wYWNrZWRCb29sX2NvZGVjKTsKLSAgICAgIHVucGFja2VkRW51bV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91bnBhY2tlZEVudW1fY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHNpemUgKz0gdW5wYWNrZWRJbnQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5wYWNrZWRJbnQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHVucGFja2VkSW50NjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VucGFja2VkSW50NjRfY29kZWMpOwotICAgICAgc2l6ZSArPSB1bnBhY2tlZFVpbnQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5wYWNrZWRVaW50MzJfY29kZWMpOwotICAgICAgc2l6ZSArPSB1bnBhY2tlZFVpbnQ2NF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5wYWNrZWRVaW50NjRfY29kZWMpOwotICAgICAgc2l6ZSArPSB1bnBhY2tlZFNpbnQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5wYWNrZWRTaW50MzJfY29kZWMpOwotICAgICAgc2l6ZSArPSB1bnBhY2tlZFNpbnQ2NF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5wYWNrZWRTaW50NjRfY29kZWMpOwotICAgICAgc2l6ZSArPSB1bnBhY2tlZEZpeGVkMzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VucGFja2VkRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHVucGFja2VkRml4ZWQ2NF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5wYWNrZWRGaXhlZDY0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gdW5wYWNrZWRTZml4ZWQzMl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5wYWNrZWRTZml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHVucGFja2VkU2ZpeGVkNjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VucGFja2VkU2ZpeGVkNjRfY29kZWMpOwotICAgICAgc2l6ZSArPSB1bnBhY2tlZEZsb2F0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF91bnBhY2tlZEZsb2F0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gdW5wYWNrZWREb3VibGVfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VucGFja2VkRG91YmxlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gdW5wYWNrZWRCb29sXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF91bnBhY2tlZEJvb2xfY29kZWMpOwotICAgICAgc2l6ZSArPSB1bnBhY2tlZEVudW1fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VucGFja2VkRW51bV9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVGVzdFVucGFja2VkVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHVucGFja2VkSW50MzJfLkFkZChvdGhlci51bnBhY2tlZEludDMyXyk7Ci0gICAgICB1bnBhY2tlZEludDY0Xy5BZGQob3RoZXIudW5wYWNrZWRJbnQ2NF8pOwotICAgICAgdW5wYWNrZWRVaW50MzJfLkFkZChvdGhlci51bnBhY2tlZFVpbnQzMl8pOwotICAgICAgdW5wYWNrZWRVaW50NjRfLkFkZChvdGhlci51bnBhY2tlZFVpbnQ2NF8pOwotICAgICAgdW5wYWNrZWRTaW50MzJfLkFkZChvdGhlci51bnBhY2tlZFNpbnQzMl8pOwotICAgICAgdW5wYWNrZWRTaW50NjRfLkFkZChvdGhlci51bnBhY2tlZFNpbnQ2NF8pOwotICAgICAgdW5wYWNrZWRGaXhlZDMyXy5BZGQob3RoZXIudW5wYWNrZWRGaXhlZDMyXyk7Ci0gICAgICB1bnBhY2tlZEZpeGVkNjRfLkFkZChvdGhlci51bnBhY2tlZEZpeGVkNjRfKTsKLSAgICAgIHVucGFja2VkU2ZpeGVkMzJfLkFkZChvdGhlci51bnBhY2tlZFNmaXhlZDMyXyk7Ci0gICAgICB1bnBhY2tlZFNmaXhlZDY0Xy5BZGQob3RoZXIudW5wYWNrZWRTZml4ZWQ2NF8pOwotICAgICAgdW5wYWNrZWRGbG9hdF8uQWRkKG90aGVyLnVucGFja2VkRmxvYXRfKTsKLSAgICAgIHVucGFja2VkRG91YmxlXy5BZGQob3RoZXIudW5wYWNrZWREb3VibGVfKTsKLSAgICAgIHVucGFja2VkQm9vbF8uQWRkKG90aGVyLnVucGFja2VkQm9vbF8pOwotICAgICAgdW5wYWNrZWRFbnVtXy5BZGQob3RoZXIudW5wYWNrZWRFbnVtXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA3MjI6Ci0gICAgICAgICAgY2FzZSA3MjA6IHsKLSAgICAgICAgICAgIHVucGFja2VkSW50MzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5wYWNrZWRJbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3MzA6Ci0gICAgICAgICAgY2FzZSA3Mjg6IHsKLSAgICAgICAgICAgIHVucGFja2VkSW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5wYWNrZWRJbnQ2NF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3Mzg6Ci0gICAgICAgICAgY2FzZSA3MzY6IHsKLSAgICAgICAgICAgIHVucGFja2VkVWludDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VucGFja2VkVWludDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc0NjoKLSAgICAgICAgICBjYXNlIDc0NDogewotICAgICAgICAgICAgdW5wYWNrZWRVaW50NjRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5wYWNrZWRVaW50NjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzU0OgotICAgICAgICAgIGNhc2UgNzUyOiB7Ci0gICAgICAgICAgICB1bnBhY2tlZFNpbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF91bnBhY2tlZFNpbnQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NjI6Ci0gICAgICAgICAgY2FzZSA3NjA6IHsKLSAgICAgICAgICAgIHVucGFja2VkU2ludDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VucGFja2VkU2ludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc3MDoKLSAgICAgICAgICBjYXNlIDc3MzogewotICAgICAgICAgICAgdW5wYWNrZWRGaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VucGFja2VkRml4ZWQzMl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3Nzg6Ci0gICAgICAgICAgY2FzZSA3Nzc6IHsKLSAgICAgICAgICAgIHVucGFja2VkRml4ZWQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF91bnBhY2tlZEZpeGVkNjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzg2OgotICAgICAgICAgIGNhc2UgNzg5OiB7Ci0gICAgICAgICAgICB1bnBhY2tlZFNmaXhlZDMyXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VucGFja2VkU2ZpeGVkMzJfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzk0OgotICAgICAgICAgIGNhc2UgNzkzOiB7Ci0gICAgICAgICAgICB1bnBhY2tlZFNmaXhlZDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VucGFja2VkU2ZpeGVkNjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODAyOgotICAgICAgICAgIGNhc2UgODA1OiB7Ci0gICAgICAgICAgICB1bnBhY2tlZEZsb2F0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VucGFja2VkRmxvYXRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODEwOgotICAgICAgICAgIGNhc2UgODA5OiB7Ci0gICAgICAgICAgICB1bnBhY2tlZERvdWJsZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF91bnBhY2tlZERvdWJsZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MTg6Ci0gICAgICAgICAgY2FzZSA4MTY6IHsKLSAgICAgICAgICAgIHVucGFja2VkQm9vbF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF91bnBhY2tlZEJvb2xfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODI2OgotICAgICAgICAgIGNhc2UgODI0OiB7Ci0gICAgICAgICAgICB1bnBhY2tlZEVudW1fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5wYWNrZWRFbnVtX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIDogcGI6OklNZXNzYWdlPFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXM+KCgpID0+IG5ldyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjVdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMoVGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHJlcGVhdGVkRml4ZWQzMl8gPSBvdGhlci5yZXBlYXRlZEZpeGVkMzJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEludDMyXyA9IG90aGVyLnJlcGVhdGVkSW50MzJfLkNsb25lKCk7Ci0gICAgICByZXBlYXRlZEZpeGVkNjRfID0gb3RoZXIucmVwZWF0ZWRGaXhlZDY0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRJbnQ2NF8gPSBvdGhlci5yZXBlYXRlZEludDY0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRGbG9hdF8gPSBvdGhlci5yZXBlYXRlZEZsb2F0Xy5DbG9uZSgpOwotICAgICAgcmVwZWF0ZWRVaW50NjRfID0gb3RoZXIucmVwZWF0ZWRVaW50NjRfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2ZpeGVkMzIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRml4ZWQzMkZpZWxkTnVtYmVyID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWludD4gX3JlcGVhdGVkX3JlcGVhdGVkRml4ZWQzMl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckZpeGVkMzIoOTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+IHJlcGVhdGVkRml4ZWQzMl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVpbnQ+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUGFyc2luZyByZXBlYXRlZCBmaXhlZCBzaXplIHZhbHVlcyB1c2VkIHRvIGZhaWwuIFRoaXMgbWVzc2FnZSBuZWVkcyB0byBiZQotICAgIC8vLyAgdXNlZCBpbiBvcmRlciB0byBnZXQgYSB0YWcgb2YgdGhlIHJpZ2h0IHNpemU7IGFsbCBvZiB0aGUgcmVwZWF0ZWQgZmllbGRzCi0gICAgLy8vICBpbiBUZXN0QWxsVHlwZXMgZGlkbid0IHRyaWdnZXIgdGhlIGNoZWNrLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50PiBSZXBlYXRlZEZpeGVkMzIgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRml4ZWQzMl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcGVhdGVkX2ludDMyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXBlYXRlZEludDMyRmllbGROdW1iZXIgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ+IF9yZXBlYXRlZF9yZXBlYXRlZEludDMyX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoMTA2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IHJlcGVhdGVkSW50MzJfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgQ2hlY2sgZm9yIGEgdmFyaW50IHR5cGUsIGp1c3QgZm9yIGdvb2QgbWVhc3VyZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiBSZXBlYXRlZEludDMyIHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDMyXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZml4ZWQ2NCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVwZWF0ZWRGaXhlZDY0RmllbGROdW1iZXIgPSAyMDQ2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHVsb25nPiBfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDY0X2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yRml4ZWQ2NCgxNjM3MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IHJlcGVhdGVkRml4ZWQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZXNlIGhhdmUgdHdvLWJ5dGUgdGFncy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8dWxvbmc+IFJlcGVhdGVkRml4ZWQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRGaXhlZDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfaW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkSW50NjRGaWVsZE51bWJlciA9IDIwNDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz4gX3JlcGVhdGVkX3JlcGVhdGVkSW50NjRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQ2NCgxNjM3OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz4gcmVwZWF0ZWRJbnQ2NF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPiBSZXBlYXRlZEludDY0IHsKLSAgICAgIGdldCB7IHJldHVybiByZXBlYXRlZEludDY0XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVwZWF0ZWRfZmxvYXQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkRmxvYXRGaWVsZE51bWJlciA9IDI2MjE0MjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxmbG9hdD4gX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JGbG9hdCgyMDk3MTM4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD4gcmVwZWF0ZWRGbG9hdF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGZsb2F0PigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRocmVlIGJ5dGUgdGFncy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8ZmxvYXQ+IFJlcGVhdGVkRmxvYXQgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcGVhdGVkRmxvYXRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXBlYXRlZF91aW50NjQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcGVhdGVkVWludDY0RmllbGROdW1iZXIgPSAyNjIxNDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc+IF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclVJbnQ2NCgyMDk3MTQ2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4gcmVwZWF0ZWRVaW50NjRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPiBSZXBlYXRlZFVpbnQ2NCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVwZWF0ZWRVaW50NjRfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmKCFyZXBlYXRlZEZpeGVkMzJfLkVxdWFscyhvdGhlci5yZXBlYXRlZEZpeGVkMzJfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkSW50MzJfLkVxdWFscyhvdGhlci5yZXBlYXRlZEludDMyXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEZpeGVkNjRfLkVxdWFscyhvdGhlci5yZXBlYXRlZEZpeGVkNjRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlcGVhdGVkSW50NjRfLkVxdWFscyhvdGhlci5yZXBlYXRlZEludDY0XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFyZXBlYXRlZEZsb2F0Xy5FcXVhbHMob3RoZXIucmVwZWF0ZWRGbG9hdF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVwZWF0ZWRVaW50NjRfLkVxdWFscyhvdGhlci5yZXBlYXRlZFVpbnQ2NF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaGFzaCBePSByZXBlYXRlZEZpeGVkMzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkSW50MzJfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHJlcGVhdGVkRml4ZWQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRJbnQ2NF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRGbG9hdF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVwZWF0ZWRVaW50NjRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIHJlcGVhdGVkRml4ZWQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkMzJfY29kZWMpOwotICAgICAgcmVwZWF0ZWRJbnQzMl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDMyX2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkNjRfY29kZWMpOwotICAgICAgcmVwZWF0ZWRJbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDY0X2NvZGVjKTsKLSAgICAgIHJlcGVhdGVkRmxvYXRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGbG9hdF9jb2RlYyk7Ci0gICAgICByZXBlYXRlZFVpbnQ2NF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9yZXBlYXRlZFVpbnQ2NF9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEZpeGVkMzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkRml4ZWQzMl9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkSW50MzJfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkSW50MzJfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEZpeGVkNjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkRml4ZWQ2NF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHJlcGVhdGVkSW50NjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkSW50NjRfY29kZWMpOwotICAgICAgc2l6ZSArPSByZXBlYXRlZEZsb2F0Xy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXBlYXRlZEZsb2F0X2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVwZWF0ZWRVaW50NjRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3JlcGVhdGVkVWludDY0X2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0UmVwZWF0ZWRTY2FsYXJEaWZmZXJlbnRUYWdTaXplcyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcmVwZWF0ZWRGaXhlZDMyXy5BZGQob3RoZXIucmVwZWF0ZWRGaXhlZDMyXyk7Ci0gICAgICByZXBlYXRlZEludDMyXy5BZGQob3RoZXIucmVwZWF0ZWRJbnQzMl8pOwotICAgICAgcmVwZWF0ZWRGaXhlZDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRGaXhlZDY0Xyk7Ci0gICAgICByZXBlYXRlZEludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRJbnQ2NF8pOwotICAgICAgcmVwZWF0ZWRGbG9hdF8uQWRkKG90aGVyLnJlcGVhdGVkRmxvYXRfKTsKLSAgICAgIHJlcGVhdGVkVWludDY0Xy5BZGQob3RoZXIucmVwZWF0ZWRVaW50NjRfKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDk4OgotICAgICAgICAgIGNhc2UgMTAxOiB7Ci0gICAgICAgICAgICByZXBlYXRlZEZpeGVkMzJfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVwZWF0ZWRGaXhlZDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEwNjoKLSAgICAgICAgICBjYXNlIDEwNDogewotICAgICAgICAgICAgcmVwZWF0ZWRJbnQzMl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDMyX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2MzcwOgotICAgICAgICAgIGNhc2UgMTYzNjk6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkRml4ZWQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEZpeGVkNjRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTYzNzg6Ci0gICAgICAgICAgY2FzZSAxNjM3NjogewotICAgICAgICAgICAgcmVwZWF0ZWRJbnQ2NF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXBlYXRlZEludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDIwOTcxMzg6Ci0gICAgICAgICAgY2FzZSAyMDk3MTQxOiB7Ci0gICAgICAgICAgICByZXBlYXRlZEZsb2F0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkRmxvYXRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjA5NzE0NjoKLSAgICAgICAgICBjYXNlIDIwOTcxNDQ6IHsKLSAgICAgICAgICAgIHJlcGVhdGVkVWludDY0Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3JlcGVhdGVkVWludDY0X2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFRlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZSA6IHBiOjpJTWVzc2FnZTxUZXN0Q29tbWVudEluamVjdGlvbk1lc3NhZ2U+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0Q29tbWVudEluamVjdGlvbk1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdENvbW1lbnRJbmplY3Rpb25NZXNzYWdlPigoKSA9PiBuZXcgVGVzdENvbW1lbnRJbmplY3Rpb25NZXNzYWdlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VGVzdENvbW1lbnRJbmplY3Rpb25NZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjZdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0Q29tbWVudEluamVjdGlvbk1lc3NhZ2UoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZShUZXN0Q29tbWVudEluamVjdGlvbk1lc3NhZ2Ugb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGFfID0gb3RoZXIuYV87Ci0gICAgfQotCi0gICAgcHVibGljIFRlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgVGVzdENvbW1lbnRJbmplY3Rpb25NZXNzYWdlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBhXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gICovICZsdDstIFRoaXMgc2hvdWxkIG5vdCBjbG9zZSB0aGUgZ2VuZXJhdGVkIGRvYyBjb21tZW50Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIEEgewotICAgICAgZ2V0IHsgcmV0dXJuIGFfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBhXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFRlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFRlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoQSAhPSBvdGhlci5BKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKEEuTGVuZ3RoICE9IDApIGhhc2ggXj0gQS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoQS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoQSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKEEuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKEEpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFRlc3RDb21tZW50SW5qZWN0aW9uTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkEuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgQSA9IG90aGVyLkE7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgQSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIFRlc3QgdGhhdCBSUEMgc2VydmljZXMgd29yay4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZvb1JlcXVlc3QgOiBwYjo6SU1lc3NhZ2U8Rm9vUmVxdWVzdD4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEZvb1JlcXVlc3Q+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8Rm9vUmVxdWVzdD4oKCkgPT4gbmV3IEZvb1JlcXVlc3QoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxGb29SZXF1ZXN0PiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjddOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGb29SZXF1ZXN0KCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBGb29SZXF1ZXN0KEZvb1JlcXVlc3Qgb3RoZXIpIDogdGhpcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9vUmVxdWVzdCBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRm9vUmVxdWVzdCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEZvb1JlcXVlc3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhGb29SZXF1ZXN0IG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRm9vUmVxdWVzdCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRm9vUmVzcG9uc2UgOiBwYjo6SU1lc3NhZ2U8Rm9vUmVzcG9uc2U+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxGb29SZXNwb25zZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxGb29SZXNwb25zZT4oKCkgPT4gbmV3IEZvb1Jlc3BvbnNlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8Rm9vUmVzcG9uc2U+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syOF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEZvb1Jlc3BvbnNlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBGb29SZXNwb25zZShGb29SZXNwb25zZSBvdGhlcikgOiB0aGlzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBGb29SZXNwb25zZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRm9vUmVzcG9uc2UodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBGb29SZXNwb25zZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEZvb1Jlc3BvbnNlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRm9vUmVzcG9uc2Ugb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZvb0NsaWVudE1lc3NhZ2UgOiBwYjo6SU1lc3NhZ2U8Rm9vQ2xpZW50TWVzc2FnZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEZvb0NsaWVudE1lc3NhZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8Rm9vQ2xpZW50TWVzc2FnZT4oKCkgPT4gbmV3IEZvb0NsaWVudE1lc3NhZ2UoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxGb29DbGllbnRNZXNzYWdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMjldOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGb29DbGllbnRNZXNzYWdlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBGb29DbGllbnRNZXNzYWdlKEZvb0NsaWVudE1lc3NhZ2Ugb3RoZXIpIDogdGhpcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRm9vQ2xpZW50TWVzc2FnZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRm9vQ2xpZW50TWVzc2FnZSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEZvb0NsaWVudE1lc3NhZ2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhGb29DbGllbnRNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRm9vQ2xpZW50TWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRm9vU2VydmVyTWVzc2FnZSA6IHBiOjpJTWVzc2FnZTxGb29TZXJ2ZXJNZXNzYWdlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8Rm9vU2VydmVyTWVzc2FnZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxGb29TZXJ2ZXJNZXNzYWdlPigoKSA9PiBuZXcgRm9vU2VydmVyTWVzc2FnZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEZvb1NlcnZlck1lc3NhZ2U+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0UHJvdG8zUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1szMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEZvb1NlcnZlck1lc3NhZ2UoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEZvb1NlcnZlck1lc3NhZ2UoRm9vU2VydmVyTWVzc2FnZSBvdGhlcikgOiB0aGlzKCkgewotICAgIH0KLQotICAgIHB1YmxpYyBGb29TZXJ2ZXJNZXNzYWdlIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBGb29TZXJ2ZXJNZXNzYWdlKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRm9vU2VydmVyTWVzc2FnZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEZvb1NlcnZlck1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShGb29TZXJ2ZXJNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBCYXJSZXF1ZXN0IDogcGI6OklNZXNzYWdlPEJhclJlcXVlc3Q+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxCYXJSZXF1ZXN0PiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEJhclJlcXVlc3Q+KCgpID0+IG5ldyBCYXJSZXF1ZXN0KCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8QmFyUmVxdWVzdD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RQcm90bzNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzMxXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQmFyUmVxdWVzdCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgQmFyUmVxdWVzdChCYXJSZXF1ZXN0IG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEJhclJlcXVlc3QgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEJhclJlcXVlc3QodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBCYXJSZXF1ZXN0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoQmFyUmVxdWVzdCBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEJhclJlcXVlc3Qgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJhclJlc3BvbnNlIDogcGI6OklNZXNzYWdlPEJhclJlc3BvbnNlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8QmFyUmVzcG9uc2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8QmFyUmVzcG9uc2U+KCgpID0+IG5ldyBCYXJSZXNwb25zZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEJhclJlc3BvbnNlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFByb3RvM1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMzJdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBCYXJSZXNwb25zZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgQmFyUmVzcG9uc2UoQmFyUmVzcG9uc2Ugb3RoZXIpIDogdGhpcygpIHsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQmFyUmVzcG9uc2UgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEJhclJlc3BvbnNlKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgQmFyUmVzcG9uc2UpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhCYXJSZXNwb25zZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEJhclJlc3BvbnNlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gICNlbmRyZWdpb24KLQotfQotCi0jZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1Rlc3RQcm90b3MvVW5pdHRlc3RXZWxsS25vd25UeXBlcy5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Vbml0dGVzdFdlbGxLbm93blR5cGVzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZTEyZjRhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvVGVzdFByb3Rvcy9Vbml0dGVzdFdlbGxLbm93blR5cGVzLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMjQxMyArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90bwotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQotI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi11c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmOwotdXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvcyB7Ci0KLSAgLy8vIDxzdW1tYXJ5PkhvbGRlciBmb3IgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZnJvbSBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFVuaXR0ZXN0V2VsbEtub3duVHlwZXNSZWZsZWN0aW9uIHsKLQotICAgICNyZWdpb24gRGVzY3JpcHRvcgotICAgIC8vLyA8c3VtbWFyeT5GaWxlIGRlc2NyaXB0b3IgZm9yIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnByb3RvPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgIHN0YXRpYyBVbml0dGVzdFdlbGxLbm93blR5cGVzUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNpOW5iMjluYkdVdmNISnZkRzlpZFdZdmRXNXBkSFJsYzNSZmQyVnNiRjlyYm05M2JsOTBlWEJsY3k1dyIsCi0gICAgICAgICAgICAiY205MGJ4SVJjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUWFHV2R2YjJkc1pTOXdjbTkwYjJKMVppOWhibmt1IiwKLSAgICAgICAgICAgICJjSEp2ZEc4YUdXZHZiMmRzWlM5d2NtOTBiMkoxWmk5aGNHa3VjSEp2ZEc4YUhtZHZiMmRzWlM5d2NtOTAiLAotICAgICAgICAgICAgImIySjFaaTlrZFhKaGRHbHZiaTV3Y205MGJ4b2JaMjl2WjJ4bEwzQnliM1J2WW5WbUwyVnRjSFI1TG5CeSIsCi0gICAgICAgICAgICAiYjNSdkdpQm5iMjluYkdVdmNISnZkRzlpZFdZdlptbGxiR1JmYldGemF5NXdjbTkwYnhva1oyOXZaMnhsIiwKLSAgICAgICAgICAgICJMM0J5YjNSdlluVm1MM052ZFhKalpWOWpiMjUwWlhoMExuQnliM1J2R2h4bmIyOW5iR1V2Y0hKdmRHOWkiLAotICAgICAgICAgICAgImRXWXZjM1J5ZFdOMExuQnliM1J2R2g5bmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZEdsdFpYTjBZVzF3TG5CeSIsCi0gICAgICAgICAgICAiYjNSdkdocG5iMjluYkdVdmNISnZkRzlpZFdZdmRIbHdaUzV3Y205MGJ4b2VaMjl2WjJ4bEwzQnliM1J2IiwKLSAgICAgICAgICAgICJZblZtTDNkeVlYQndaWEp6TG5CeWIzUnZJcjRIQ2hKVVpYTjBWMlZzYkV0dWIzZHVWSGx3WlhNU0p3b0oiLAotICAgICAgICAgICAgIllXNTVYMlpwWld4a0dBRWdBU2dMTWhRdVoyOXZaMnhsTG5CeWIzUnZZblZtTGtGdWVSSW5DZ2xoY0dsZiIsCi0gICAgICAgICAgICAiWm1sbGJHUVlBaUFCS0FzeUZDNW5iMjluYkdVdWNISnZkRzlpZFdZdVFYQnBFakVLRG1SMWNtRjBhVzl1IiwKLSAgICAgICAgICAgICJYMlpwWld4a0dBTWdBU2dMTWhrdVoyOXZaMnhsTG5CeWIzUnZZblZtTGtSMWNtRjBhVzl1RWlzS0MyVnQiLAotICAgICAgICAgICAgImNIUjVYMlpwWld4a0dBUWdBU2dMTWhZdVoyOXZaMnhsTG5CeWIzUnZZblZtTGtWdGNIUjVFalFLRUdacCIsCi0gICAgICAgICAgICAiWld4a1gyMWhjMnRmWm1sbGJHUVlCU0FCS0FzeUdpNW5iMjluYkdVdWNISnZkRzlpZFdZdVJtbGxiR1JOIiwKLSAgICAgICAgICAgICJZWE5yRWp3S0ZITnZkWEpqWlY5amIyNTBaWGgwWDJacFpXeGtHQVlnQVNnTE1oNHVaMjl2WjJ4bExuQnkiLAotICAgICAgICAgICAgImIzUnZZblZtTGxOdmRYSmpaVU52Ym5SbGVIUVNMUW9NYzNSeWRXTjBYMlpwWld4a0dBY2dBU2dMTWhjdSIsCi0gICAgICAgICAgICAiWjI5dloyeGxMbkJ5YjNSdlluVm1MbE4wY25WamRCSXpDZzkwYVcxbGMzUmhiWEJmWm1sbGJHUVlDQ0FCIiwKLSAgICAgICAgICAgICJLQXN5R2k1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VkdsdFpYTjBZVzF3RWlrS0NuUjVjR1ZmWm1sbGJHUVkiLAotICAgICAgICAgICAgIkNTQUJLQXN5RlM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Vkhsd1pSSXlDZ3hrYjNWaWJHVmZabWxsYkdRWSIsCi0gICAgICAgICAgICAiQ2lBQktBc3lIQzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVSRzkxWW14bFZtRnNkV1VTTUFvTFpteHZZWFJmIiwKLSAgICAgICAgICAgICJabWxsYkdRWUN5QUJLQXN5R3k1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Um14dllYUldZV3gxWlJJd0NndHAiLAotICAgICAgICAgICAgImJuUTJORjltYVdWc1pCZ01JQUVvQ3pJYkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1SmJuUTJORlpoYkhWbCIsCi0gICAgICAgICAgICAiRWpJS0RIVnBiblEyTkY5bWFXVnNaQmdOSUFFb0N6SWNMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVZTVzUwIiwKLSAgICAgICAgICAgICJOalJXWVd4MVpSSXdDZ3RwYm5Rek1sOW1hV1ZzWkJnT0lBRW9DekliTG1kdmIyZHNaUzV3Y205MGIySjEiLAotICAgICAgICAgICAgIlppNUpiblF6TWxaaGJIVmxFaklLREhWcGJuUXpNbDltYVdWc1pCZ1BJQUVvQ3pJY0xtZHZiMmRzWlM1dyIsCi0gICAgICAgICAgICAiY205MGIySjFaaTVWU1c1ME16SldZV3gxWlJJdUNncGliMjlzWDJacFpXeGtHQkFnQVNnTE1ob3VaMjl2IiwKLSAgICAgICAgICAgICJaMnhsTG5CeWIzUnZZblZtTGtKdmIyeFdZV3gxWlJJeUNneHpkSEpwYm1kZlptbGxiR1FZRVNBQktBc3kiLAotICAgICAgICAgICAgIkhDNW5iMjluYkdVdWNISnZkRzlpZFdZdVUzUnlhVzVuVm1Gc2RXVVNNQW9MWW5sMFpYTmZabWxsYkdRWSIsCi0gICAgICAgICAgICAiRWlBQktBc3lHeTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVRbmwwWlhOV1lXeDFaUklyQ2d0MllXeDFaVjltIiwKLSAgICAgICAgICAgICJhV1ZzWkJnVElBRW9DeklXTG1kdmIyZHNaUzV3Y205MGIySjFaaTVXWVd4MVpTS1ZCd29XVW1Wd1pXRjAiLAotICAgICAgICAgICAgIlpXUlhaV3hzUzI1dmQyNVVlWEJsY3hJbkNnbGhibmxmWm1sbGJHUVlBU0FES0FzeUZDNW5iMjluYkdVdSIsCi0gICAgICAgICAgICAiY0hKdmRHOWlkV1l1UVc1NUVpY0tDV0Z3YVY5bWFXVnNaQmdDSUFNb0N6SVVMbWR2YjJkc1pTNXdjbTkwIiwKLSAgICAgICAgICAgICJiMkoxWmk1QmNHa1NNUW9PWkhWeVlYUnBiMjVmWm1sbGJHUVlBeUFES0FzeUdTNW5iMjluYkdVdWNISnYiLAotICAgICAgICAgICAgImRHOWlkV1l1UkhWeVlYUnBiMjRTS3dvTFpXMXdkSGxmWm1sbGJHUVlCQ0FES0FzeUZpNW5iMjluYkdVdSIsCi0gICAgICAgICAgICAiY0hKdmRHOWlkV1l1Ulcxd2RIa1NOQW9RWm1sbGJHUmZiV0Z6YTE5bWFXVnNaQmdGSUFNb0N6SWFMbWR2IiwKLSAgICAgICAgICAgICJiMmRzWlM1d2NtOTBiMkoxWmk1R2FXVnNaRTFoYzJzU1BBb1VjMjkxY21ObFgyTnZiblJsZUhSZlptbGwiLAotICAgICAgICAgICAgImJHUVlCaUFES0FzeUhpNW5iMjluYkdVdWNISnZkRzlpZFdZdVUyOTFjbU5sUTI5dWRHVjRkQkl0Q2d4eiIsCi0gICAgICAgICAgICAiZEhKMVkzUmZabWxsYkdRWUJ5QURLQXN5Rnk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VTNSeWRXTjBFak1LIiwKLSAgICAgICAgICAgICJEM1JwYldWemRHRnRjRjltYVdWc1pCZ0lJQU1vQ3pJYUxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1VWFXMWwiLAotICAgICAgICAgICAgImMzUmhiWEFTS1FvS2RIbHdaVjltYVdWc1pCZ0pJQU1vQ3pJVkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1VSIsCi0gICAgICAgICAgICAiZVhCbEVqSUtER1J2ZFdKc1pWOW1hV1ZzWkJnS0lBTW9DekljTG1kdmIyZHNaUzV3Y205MGIySjFaaTVFIiwKLSAgICAgICAgICAgICJiM1ZpYkdWV1lXeDFaUkl3Q2d0bWJHOWhkRjltYVdWc1pCZ0xJQU1vQ3pJYkxtZHZiMmRzWlM1d2NtOTAiLAotICAgICAgICAgICAgImIySjFaaTVHYkc5aGRGWmhiSFZsRWpBS0MybHVkRFkwWDJacFpXeGtHQXdnQXlnTE1oc3VaMjl2WjJ4bCIsCi0gICAgICAgICAgICAiTG5CeWIzUnZZblZtTGtsdWREWTBWbUZzZFdVU01nb01kV2x1ZERZMFgyWnBaV3hrR0EwZ0F5Z0xNaHd1IiwKLSAgICAgICAgICAgICJaMjl2WjJ4bExuQnliM1J2WW5WbUxsVkpiblEyTkZaaGJIVmxFakFLQzJsdWRETXlYMlpwWld4a0dBNGciLAotICAgICAgICAgICAgIkF5Z0xNaHN1WjI5dloyeGxMbkJ5YjNSdlluVm1Ma2x1ZERNeVZtRnNkV1VTTWdvTWRXbHVkRE15WDJacCIsCi0gICAgICAgICAgICAiWld4a0dBOGdBeWdMTWh3dVoyOXZaMnhsTG5CeWIzUnZZblZtTGxWSmJuUXpNbFpoYkhWbEVpNEtDbUp2IiwKLSAgICAgICAgICAgICJiMnhmWm1sbGJHUVlFQ0FES0FzeUdpNW5iMjluYkdVdWNISnZkRzlpZFdZdVFtOXZiRlpoYkhWbEVqSUsiLAotICAgICAgICAgICAgIkRITjBjbWx1WjE5bWFXVnNaQmdSSUFNb0N6SWNMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVRkSEpwYm1kVyIsCi0gICAgICAgICAgICAiWVd4MVpSSXdDZ3RpZVhSbGMxOW1hV1ZzWkJnU0lBTW9DekliTG1kdmIyZHNaUzV3Y205MGIySjFaaTVDIiwKLSAgICAgICAgICAgICJlWFJsYzFaaGJIVmxJc1VIQ2hOUGJtVnZabGRsYkd4TGJtOTNibFI1Y0dWekVpa0tDV0Z1ZVY5bWFXVnMiLAotICAgICAgICAgICAgIlpCZ0JJQUVvQ3pJVUxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1QmJubElBQklwQ2dsaGNHbGZabWxsYkdRWSIsCi0gICAgICAgICAgICAiQWlBQktBc3lGQzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVRWEJwU0FBU013b09aSFZ5WVhScGIyNWZabWxsIiwKLSAgICAgICAgICAgICJiR1FZQXlBQktBc3lHUzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVSSFZ5WVhScGIyNUlBQkl0Q2d0bGJYQjAiLAotICAgICAgICAgICAgImVWOW1hV1ZzWkJnRUlBRW9DeklXTG1kdmIyZHNaUzV3Y205MGIySjFaaTVGYlhCMGVVZ0FFallLRUdacCIsCi0gICAgICAgICAgICAiWld4a1gyMWhjMnRmWm1sbGJHUVlCU0FCS0FzeUdpNW5iMjluYkdVdWNISnZkRzlpZFdZdVJtbGxiR1JOIiwKLSAgICAgICAgICAgICJZWE5yU0FBU1Bnb1VjMjkxY21ObFgyTnZiblJsZUhSZlptbGxiR1FZQmlBQktBc3lIaTVuYjI5bmJHVXUiLAotICAgICAgICAgICAgImNISnZkRzlpZFdZdVUyOTFjbU5sUTI5dWRHVjRkRWdBRWk4S0RITjBjblZqZEY5bWFXVnNaQmdISUFFbyIsCi0gICAgICAgICAgICAiQ3pJWExtZHZiMmRzWlM1d2NtOTBiMkoxWmk1VGRISjFZM1JJQUJJMUNnOTBhVzFsYzNSaGJYQmZabWxsIiwKLSAgICAgICAgICAgICJiR1FZQ0NBQktBc3lHaTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVWR2x0WlhOMFlXMXdTQUFTS3dvS2RIbHciLAotICAgICAgICAgICAgIlpWOW1hV1ZzWkJnSklBRW9DeklWTG1kdmIyZHNaUzV3Y205MGIySjFaaTVVZVhCbFNBQVNOQW9NWkc5MSIsCi0gICAgICAgICAgICAiWW14bFgyWnBaV3hrR0FvZ0FTZ0xNaHd1WjI5dloyeGxMbkJ5YjNSdlluVm1Ma1J2ZFdKc1pWWmhiSFZsIiwKLSAgICAgICAgICAgICJTQUFTTWdvTFpteHZZWFJmWm1sbGJHUVlDeUFCS0FzeUd5NW5iMjluYkdVdWNISnZkRzlpZFdZdVJteHYiLAotICAgICAgICAgICAgIllYUldZV3gxWlVnQUVqSUtDMmx1ZERZMFgyWnBaV3hrR0F3Z0FTZ0xNaHN1WjI5dloyeGxMbkJ5YjNSdiIsCi0gICAgICAgICAgICAiWW5WbUxrbHVkRFkwVm1Gc2RXVklBQkkwQ2d4MWFXNTBOalJmWm1sbGJHUVlEU0FCS0FzeUhDNW5iMjluIiwKLSAgICAgICAgICAgICJiR1V1Y0hKdmRHOWlkV1l1VlVsdWREWTBWbUZzZFdWSUFCSXlDZ3RwYm5Rek1sOW1hV1ZzWkJnT0lBRW8iLAotICAgICAgICAgICAgIkN6SWJMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUpiblF6TWxaaGJIVmxTQUFTTkFvTWRXbHVkRE15WDJacCIsCi0gICAgICAgICAgICAiWld4a0dBOGdBU2dMTWh3dVoyOXZaMnhsTG5CeWIzUnZZblZtTGxWSmJuUXpNbFpoYkhWbFNBQVNNQW9LIiwKLSAgICAgICAgICAgICJZbTl2YkY5bWFXVnNaQmdRSUFFb0N6SWFMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUNiMjlzVm1Gc2RXVkkiLAotICAgICAgICAgICAgIkFCSTBDZ3h6ZEhKcGJtZGZabWxsYkdRWUVTQUJLQXN5SEM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VTNSeSIsCi0gICAgICAgICAgICAiYVc1blZtRnNkV1ZJQUJJeUNndGllWFJsYzE5bWFXVnNaQmdTSUFFb0N6SWJMbWR2YjJkc1pTNXdjbTkwIiwKLSAgICAgICAgICAgICJiMkoxWmk1Q2VYUmxjMVpoYkhWbFNBQkNEUW9MYjI1bGIyWmZabWxsYkdRaWxoWUtFVTFoY0ZkbGJHeEwiLAotICAgICAgICAgICAgImJtOTNibFI1Y0dWekVrVUtDV0Z1ZVY5bWFXVnNaQmdCSUFNb0N6SXlMbkJ5YjNSdlluVm1YM1Z1YVhSMCIsCi0gICAgICAgICAgICAiWlhOMExrMWhjRmRsYkd4TGJtOTNibFI1Y0dWekxrRnVlVVpwWld4a1JXNTBjbmtTUlFvSllYQnBYMlpwIiwKLSAgICAgICAgICAgICJaV3hrR0FJZ0F5Z0xNakl1Y0hKdmRHOWlkV1pmZFc1cGRIUmxjM1F1VFdGd1YyVnNiRXR1YjNkdVZIbHciLAotICAgICAgICAgICAgIlpYTXVRWEJwUm1sbGJHUkZiblJ5ZVJKUENnNWtkWEpoZEdsdmJsOW1hV1ZzWkJnRElBTW9DekkzTG5CeSIsCi0gICAgICAgICAgICAiYjNSdlluVm1YM1Z1YVhSMFpYTjBMazFoY0ZkbGJHeExibTkzYmxSNWNHVnpMa1IxY21GMGFXOXVSbWxsIiwKLSAgICAgICAgICAgICJiR1JGYm5SeWVSSkpDZ3RsYlhCMGVWOW1hV1ZzWkJnRUlBTW9DekkwTG5CeWIzUnZZblZtWDNWdWFYUjAiLAotICAgICAgICAgICAgIlpYTjBMazFoY0ZkbGJHeExibTkzYmxSNWNHVnpMa1Z0Y0hSNVJtbGxiR1JGYm5SeWVSSlNDaEJtYVdWcyIsCi0gICAgICAgICAgICAiWkY5dFlYTnJYMlpwWld4a0dBVWdBeWdMTWpndWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVRXRndWMlZzIiwKLSAgICAgICAgICAgICJiRXR1YjNkdVZIbHdaWE11Um1sbGJHUk5ZWE5yUm1sbGJHUkZiblJ5ZVJKYUNoUnpiM1Z5WTJWZlkyOXUiLAotICAgICAgICAgICAgImRHVjRkRjltYVdWc1pCZ0dJQU1vQ3pJOExuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrMWhjRmRsYkd4TCIsCi0gICAgICAgICAgICAiYm05M2JsUjVjR1Z6TGxOdmRYSmpaVU52Ym5SbGVIUkdhV1ZzWkVWdWRISjVFa3NLREhOMGNuVmpkRjltIiwKLSAgICAgICAgICAgICJhV1ZzWkJnSElBTW9DekkxTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGsxaGNGZGxiR3hMYm05M2JsUjUiLAotICAgICAgICAgICAgImNHVnpMbE4wY25WamRFWnBaV3hrUlc1MGNua1NVUW9QZEdsdFpYTjBZVzF3WDJacFpXeGtHQWdnQXlnTCIsCi0gICAgICAgICAgICAiTWpndWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVRXRndWMlZzYkV0dWIzZHVWSGx3WlhNdVZHbHRaWE4wIiwKLSAgICAgICAgICAgICJZVzF3Um1sbGJHUkZiblJ5ZVJKSENncDBlWEJsWDJacFpXeGtHQWtnQXlnTE1qTXVjSEp2ZEc5aWRXWmYiLAotICAgICAgICAgICAgImRXNXBkSFJsYzNRdVRXRndWMlZzYkV0dWIzZHVWSGx3WlhNdVZIbHdaVVpwWld4a1JXNTBjbmtTU3dvTSIsCi0gICAgICAgICAgICAiWkc5MVlteGxYMlpwWld4a0dBb2dBeWdMTWpVdWNISnZkRzlpZFdaZmRXNXBkSFJsYzNRdVRXRndWMlZzIiwKLSAgICAgICAgICAgICJiRXR1YjNkdVZIbHdaWE11Ukc5MVlteGxSbWxsYkdSRmJuUnllUkpKQ2d0bWJHOWhkRjltYVdWc1pCZ0wiLAotICAgICAgICAgICAgIklBTW9DekkwTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGsxaGNGZGxiR3hMYm05M2JsUjVjR1Z6TGtacyIsCi0gICAgICAgICAgICAiYjJGMFJtbGxiR1JGYm5SeWVSSkpDZ3RwYm5RMk5GOW1hV1ZzWkJnTUlBTW9DekkwTG5CeWIzUnZZblZtIiwKLSAgICAgICAgICAgICJYM1Z1YVhSMFpYTjBMazFoY0ZkbGJHeExibTkzYmxSNWNHVnpMa2x1ZERZMFJtbGxiR1JGYm5SeWVSSkwiLAotICAgICAgICAgICAgIkNneDFhVzUwTmpSZlptbGxiR1FZRFNBREtBc3lOUzV3Y205MGIySjFabDkxYm1sMGRHVnpkQzVOWVhCWCIsCi0gICAgICAgICAgICAiWld4c1MyNXZkMjVVZVhCbGN5NVZhVzUwTmpSR2FXVnNaRVZ1ZEhKNUVra0tDMmx1ZERNeVgyWnBaV3hrIiwKLSAgICAgICAgICAgICJHQTRnQXlnTE1qUXVjSEp2ZEc5aWRXWmZkVzVwZEhSbGMzUXVUV0Z3VjJWc2JFdHViM2R1Vkhsd1pYTXUiLAotICAgICAgICAgICAgIlNXNTBNekpHYVdWc1pFVnVkSEo1RWtzS0RIVnBiblF6TWw5bWFXVnNaQmdQSUFNb0N6STFMbkJ5YjNSdiIsCi0gICAgICAgICAgICAiWW5WbVgzVnVhWFIwWlhOMExrMWhjRmRsYkd4TGJtOTNibFI1Y0dWekxsVnBiblF6TWtacFpXeGtSVzUwIiwKLSAgICAgICAgICAgICJjbmtTUndvS1ltOXZiRjltYVdWc1pCZ1FJQU1vQ3pJekxuQnliM1J2WW5WbVgzVnVhWFIwWlhOMExrMWgiLAotICAgICAgICAgICAgImNGZGxiR3hMYm05M2JsUjVjR1Z6TGtKdmIyeEdhV1ZzWkVWdWRISjVFa3NLREhOMGNtbHVaMTltYVdWcyIsCi0gICAgICAgICAgICAiWkJnUklBTW9DekkxTG5CeWIzUnZZblZtWDNWdWFYUjBaWE4wTGsxaGNGZGxiR3hMYm05M2JsUjVjR1Z6IiwKLSAgICAgICAgICAgICJMbE4wY21sdVowWnBaV3hrUlc1MGNua1NTUW9MWW5sMFpYTmZabWxsYkdRWUVpQURLQXN5TkM1d2NtOTAiLAotICAgICAgICAgICAgImIySjFabDkxYm1sMGRHVnpkQzVOWVhCWFpXeHNTMjV2ZDI1VWVYQmxjeTVDZVhSbGMwWnBaV3hrUlc1MCIsCi0gICAgICAgICAgICAiY25rYVJRb05RVzU1Um1sbGJHUkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBVVNJd29GZG1Gc2RXVVlBaUFCIiwKLSAgICAgICAgICAgICJLQXN5RkM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1UVc1NU9nSTRBUnBGQ2cxQmNHbEdhV1ZzWkVWdWRISjUiLAotICAgICAgICAgICAgIkVnc0tBMnRsZVJnQklBRW9CUklqQ2dWMllXeDFaUmdDSUFFb0N6SVVMbWR2YjJkc1pTNXdjbTkwYjJKMSIsCi0gICAgICAgICAgICAiWmk1QmNHazZBamdCR2s4S0VrUjFjbUYwYVc5dVJtbGxiR1JGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQVVTIiwKLSAgICAgICAgICAgICJLQW9GZG1Gc2RXVVlBaUFCS0FzeUdTNW5iMjluYkdVdWNISnZkRzlpZFdZdVJIVnlZWFJwYjI0NkFqZ0IiLAotICAgICAgICAgICAgIkdra0tEMFZ0Y0hSNVJtbGxiR1JGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQVVTSlFvRmRtRnNkV1VZQWlBQiIsCi0gICAgICAgICAgICAiS0FzeUZpNW5iMjluYkdVdWNISnZkRzlpZFdZdVJXMXdkSGs2QWpnQkdsRUtFMFpwWld4a1RXRnphMFpwIiwKLSAgICAgICAgICAgICJaV3hrUlc1MGNua1NDd29EYTJWNUdBRWdBU2dGRWlrS0JYWmhiSFZsR0FJZ0FTZ0xNaG91WjI5dloyeGwiLAotICAgICAgICAgICAgIkxuQnliM1J2WW5WbUxrWnBaV3hrVFdGemF6b0NPQUVhV1FvWFUyOTFjbU5sUTI5dWRHVjRkRVpwWld4ayIsCi0gICAgICAgICAgICAiUlc1MGNua1NDd29EYTJWNUdBRWdBU2dGRWkwS0JYWmhiSFZsR0FJZ0FTZ0xNaDR1WjI5dloyeGxMbkJ5IiwKLSAgICAgICAgICAgICJiM1J2WW5WbUxsTnZkWEpqWlVOdmJuUmxlSFE2QWpnQkdrc0tFRk4wY25WamRFWnBaV3hrUlc1MGNua1MiLAotICAgICAgICAgICAgIkN3b0RhMlY1R0FFZ0FTZ0ZFaVlLQlhaaGJIVmxHQUlnQVNnTE1oY3VaMjl2WjJ4bExuQnliM1J2WW5WbSIsCi0gICAgICAgICAgICAiTGxOMGNuVmpkRG9DT0FFYVVRb1RWR2x0WlhOMFlXMXdSbWxsYkdSRmJuUnllUklMQ2dOclpYa1lBU0FCIiwKLSAgICAgICAgICAgICJLQVVTS1FvRmRtRnNkV1VZQWlBQktBc3lHaTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVWR2x0WlhOMFlXMXciLAotICAgICAgICAgICAgIk9nSTRBUnBIQ2c1VWVYQmxSbWxsYkdSRmJuUnllUklMQ2dOclpYa1lBU0FCS0FVU0pBb0ZkbUZzZFdVWSIsCi0gICAgICAgICAgICAiQWlBQktBc3lGUzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVWSGx3WlRvQ09BRWFVQW9RUkc5MVlteGxSbWxsIiwKLSAgICAgICAgICAgICJiR1JGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQVVTS3dvRmRtRnNkV1VZQWlBQktBc3lIQzVuYjI5bmJHVXUiLAotICAgICAgICAgICAgImNISnZkRzlpZFdZdVJHOTFZbXhsVm1Gc2RXVTZBamdCR2s0S0QwWnNiMkYwUm1sbGJHUkZiblJ5ZVJJTCIsCi0gICAgICAgICAgICAiQ2dOclpYa1lBU0FCS0FVU0tnb0ZkbUZzZFdVWUFpQUJLQXN5R3k1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1IiwKLSAgICAgICAgICAgICJSbXh2WVhSV1lXeDFaVG9DT0FFYVRnb1BTVzUwTmpSR2FXVnNaRVZ1ZEhKNUVnc0tBMnRsZVJnQklBRW8iLAotICAgICAgICAgICAgIkJSSXFDZ1YyWVd4MVpSZ0NJQUVvQ3pJYkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1SmJuUTJORlpoYkhWbCIsCi0gICAgICAgICAgICAiT2dJNEFScFFDaEJWYVc1ME5qUkdhV1ZzWkVWdWRISjVFZ3NLQTJ0bGVSZ0JJQUVvQlJJckNnVjJZV3gxIiwKLSAgICAgICAgICAgICJaUmdDSUFFb0N6SWNMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVZTVzUwTmpSV1lXeDFaVG9DT0FFYVRnb1AiLAotICAgICAgICAgICAgIlNXNTBNekpHYVdWc1pFVnVkSEo1RWdzS0EydGxlUmdCSUFFb0JSSXFDZ1YyWVd4MVpSZ0NJQUVvQ3pJYiIsCi0gICAgICAgICAgICAiTG1kdmIyZHNaUzV3Y205MGIySjFaaTVKYm5Rek1sWmhiSFZsT2dJNEFScFFDaEJWYVc1ME16SkdhV1ZzIiwKLSAgICAgICAgICAgICJaRVZ1ZEhKNUVnc0tBMnRsZVJnQklBRW9CUklyQ2dWMllXeDFaUmdDSUFFb0N6SWNMbWR2YjJkc1pTNXciLAotICAgICAgICAgICAgImNtOTBiMkoxWmk1VlNXNTBNekpXWVd4MVpUb0NPQUVhVEFvT1FtOXZiRVpwWld4a1JXNTBjbmtTQ3dvRCIsCi0gICAgICAgICAgICAiYTJWNUdBRWdBU2dGRWlrS0JYWmhiSFZsR0FJZ0FTZ0xNaG91WjI5dloyeGxMbkJ5YjNSdlluVm1Ma0p2IiwKLSAgICAgICAgICAgICJiMnhXWVd4MVpUb0NPQUVhVUFvUVUzUnlhVzVuUm1sbGJHUkZiblJ5ZVJJTENnTnJaWGtZQVNBQktBVVMiLAotICAgICAgICAgICAgIkt3b0ZkbUZzZFdVWUFpQUJLQXN5SEM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VTNSeWFXNW5WbUZzZFdVNiIsCi0gICAgICAgICAgICAiQWpnQkdrNEtEMEo1ZEdWelJtbGxiR1JGYm5SeWVSSUxDZ05yWlhrWUFTQUJLQVVTS2dvRmRtRnNkV1VZIiwKLSAgICAgICAgICAgICJBaUFCS0FzeUd5NW5iMjluYkdVdWNISnZkRzlpZFdZdVFubDBaWE5XWVd4MVpUb0NPQUZDT1FvWVkyOXQiLAotICAgICAgICAgICAgIkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1MFpYTjBVQUdxQWhwSGIyOW5iR1V1VUhKdmRHOWlkV1l1VkdWeiIsCi0gICAgICAgICAgICAiZEZCeWIzUnZjMklHY0hKdmRHOHoiKSk7Ci0gICAgICBkZXNjcmlwdG9yID0gcGJyOjpGaWxlRGVzY3JpcHRvci5Gcm9tR2VuZXJhdGVkQ29kZShkZXNjcmlwdG9yRGF0YSwKLSAgICAgICAgICBuZXcgcGJyOjpGaWxlRGVzY3JpcHRvcltdIHsgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55UmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGlSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uUmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbXB0eVJlZmxlY3Rpb24uRGVzY3JpcHRvciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrUmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0UmVmbGVjdGlvbi5EZXNjcmlwdG9yLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3RSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcFJlZmxlY3Rpb24uRGVzY3JpcHRvciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZVJlZmxlY3Rpb24uRGVzY3JpcHRvciwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuV3JhcHBlcnNSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5UZXN0V2VsbEtub3duVHlwZXMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlRlc3RXZWxsS25vd25UeXBlcy5QYXJzZXIsIG5ld1tdeyAiQW55RmllbGQiLCAiQXBpRmllbGQiLCAiRHVyYXRpb25GaWVsZCIsICJFbXB0eUZpZWxkIiwgIkZpZWxkTWFza0ZpZWxkIiwgIlNvdXJjZUNvbnRleHRGaWVsZCIsICJTdHJ1Y3RGaWVsZCIsICJUaW1lc3RhbXBGaWVsZCIsICJUeXBlRmllbGQiLCAiRG91YmxlRmllbGQiLCAiRmxvYXRGaWVsZCIsICJJbnQ2NEZpZWxkIiwgIlVpbnQ2NEZpZWxkIiwgIkludDMyRmllbGQiLCAiVWludDMyRmllbGQiLCAiQm9vbEZpZWxkIiwgIlN0cmluZ0ZpZWxkIiwgIkJ5dGVzRmllbGQiLCAiVmFsdWVGaWVsZCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5SZXBlYXRlZFdlbGxLbm93blR5cGVzKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5SZXBlYXRlZFdlbGxLbm93blR5cGVzLlBhcnNlciwgbmV3W117ICJBbnlGaWVsZCIsICJBcGlGaWVsZCIsICJEdXJhdGlvbkZpZWxkIiwgIkVtcHR5RmllbGQiLCAiRmllbGRNYXNrRmllbGQiLCAiU291cmNlQ29udGV4dEZpZWxkIiwgIlN0cnVjdEZpZWxkIiwgIlRpbWVzdGFtcEZpZWxkIiwgIlR5cGVGaWVsZCIsICJEb3VibGVGaWVsZCIsICJGbG9hdEZpZWxkIiwgIkludDY0RmllbGQiLCAiVWludDY0RmllbGQiLCAiSW50MzJGaWVsZCIsICJVaW50MzJGaWVsZCIsICJCb29sRmllbGQiLCAiU3RyaW5nRmllbGQiLCAiQnl0ZXNGaWVsZCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5PbmVvZldlbGxLbm93blR5cGVzKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5PbmVvZldlbGxLbm93blR5cGVzLlBhcnNlciwgbmV3W117ICJBbnlGaWVsZCIsICJBcGlGaWVsZCIsICJEdXJhdGlvbkZpZWxkIiwgIkVtcHR5RmllbGQiLCAiRmllbGRNYXNrRmllbGQiLCAiU291cmNlQ29udGV4dEZpZWxkIiwgIlN0cnVjdEZpZWxkIiwgIlRpbWVzdGFtcEZpZWxkIiwgIlR5cGVGaWVsZCIsICJEb3VibGVGaWVsZCIsICJGbG9hdEZpZWxkIiwgIkludDY0RmllbGQiLCAiVWludDY0RmllbGQiLCAiSW50MzJGaWVsZCIsICJVaW50MzJGaWVsZCIsICJCb29sRmllbGQiLCAiU3RyaW5nRmllbGQiLCAiQnl0ZXNGaWVsZCIgfSwgbmV3W117ICJPbmVvZkZpZWxkIiB9LCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLk1hcFdlbGxLbm93blR5cGVzKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5NYXBXZWxsS25vd25UeXBlcy5QYXJzZXIsIG5ld1tdeyAiQW55RmllbGQiLCAiQXBpRmllbGQiLCAiRHVyYXRpb25GaWVsZCIsICJFbXB0eUZpZWxkIiwgIkZpZWxkTWFza0ZpZWxkIiwgIlNvdXJjZUNvbnRleHRGaWVsZCIsICJTdHJ1Y3RGaWVsZCIsICJUaW1lc3RhbXBGaWVsZCIsICJUeXBlRmllbGQiLCAiRG91YmxlRmllbGQiLCAiRmxvYXRGaWVsZCIsICJJbnQ2NEZpZWxkIiwgIlVpbnQ2NEZpZWxkIiwgIkludDMyRmllbGQiLCAiVWludDMyRmllbGQiLCAiQm9vbEZpZWxkIiwgIlN0cmluZ0ZpZWxkIiwgIkJ5dGVzRmllbGQiIH0sIG51bGwsIG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCBudWxsLCB9KQotICAgICAgICAgIH0pKTsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgVGVzdCB0aGF0IHdlIGNhbiBpbmNsdWRlIGFsbCB3ZWxsLWtub3duIHR5cGVzLgotICAvLy8gIEVhY2ggd3JhcHBlciB0eXBlIGlzIGluY2x1ZGVkIHNlcGFyYXRlbHksIGFzIGxhbmd1YWdlcwotICAvLy8gIG1hcCBoYW5kbGUgZGlmZmVyZW50IHdyYXBwZXJzIGluIGRpZmZlcmVudCB3YXlzLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGVzdFdlbGxLbm93blR5cGVzIDogcGI6OklNZXNzYWdlPFRlc3RXZWxsS25vd25UeXBlcz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRlc3RXZWxsS25vd25UeXBlcz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0V2VsbEtub3duVHlwZXM+KCgpID0+IG5ldyBUZXN0V2VsbEtub3duVHlwZXMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUZXN0V2VsbEtub3duVHlwZXM+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5UZXN0UHJvdG9zLlVuaXR0ZXN0V2VsbEtub3duVHlwZXNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUZXN0V2VsbEtub3duVHlwZXMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRlc3RXZWxsS25vd25UeXBlcyhUZXN0V2VsbEtub3duVHlwZXMgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIEFueUZpZWxkID0gb3RoZXIuYW55RmllbGRfICE9IG51bGwgPyBvdGhlci5BbnlGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIEFwaUZpZWxkID0gb3RoZXIuYXBpRmllbGRfICE9IG51bGwgPyBvdGhlci5BcGlGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIER1cmF0aW9uRmllbGQgPSBvdGhlci5kdXJhdGlvbkZpZWxkXyAhPSBudWxsID8gb3RoZXIuRHVyYXRpb25GaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIEVtcHR5RmllbGQgPSBvdGhlci5lbXB0eUZpZWxkXyAhPSBudWxsID8gb3RoZXIuRW1wdHlGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIEZpZWxkTWFza0ZpZWxkID0gb3RoZXIuZmllbGRNYXNrRmllbGRfICE9IG51bGwgPyBvdGhlci5GaWVsZE1hc2tGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIFNvdXJjZUNvbnRleHRGaWVsZCA9IG90aGVyLnNvdXJjZUNvbnRleHRGaWVsZF8gIT0gbnVsbCA/IG90aGVyLlNvdXJjZUNvbnRleHRGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIFN0cnVjdEZpZWxkID0gb3RoZXIuc3RydWN0RmllbGRfICE9IG51bGwgPyBvdGhlci5TdHJ1Y3RGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIFRpbWVzdGFtcEZpZWxkID0gb3RoZXIudGltZXN0YW1wRmllbGRfICE9IG51bGwgPyBvdGhlci5UaW1lc3RhbXBGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIFR5cGVGaWVsZCA9IG90aGVyLnR5cGVGaWVsZF8gIT0gbnVsbCA/IG90aGVyLlR5cGVGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIERvdWJsZUZpZWxkID0gb3RoZXIuRG91YmxlRmllbGQ7Ci0gICAgICBGbG9hdEZpZWxkID0gb3RoZXIuRmxvYXRGaWVsZDsKLSAgICAgIEludDY0RmllbGQgPSBvdGhlci5JbnQ2NEZpZWxkOwotICAgICAgVWludDY0RmllbGQgPSBvdGhlci5VaW50NjRGaWVsZDsKLSAgICAgIEludDMyRmllbGQgPSBvdGhlci5JbnQzMkZpZWxkOwotICAgICAgVWludDMyRmllbGQgPSBvdGhlci5VaW50MzJGaWVsZDsKLSAgICAgIEJvb2xGaWVsZCA9IG90aGVyLkJvb2xGaWVsZDsKLSAgICAgIFN0cmluZ0ZpZWxkID0gb3RoZXIuU3RyaW5nRmllbGQ7Ci0gICAgICBCeXRlc0ZpZWxkID0gb3RoZXIuQnl0ZXNGaWVsZDsKLSAgICAgIFZhbHVlRmllbGQgPSBvdGhlci52YWx1ZUZpZWxkXyAhPSBudWxsID8gb3RoZXIuVmFsdWVGaWVsZC5DbG9uZSgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVGVzdFdlbGxLbm93blR5cGVzIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUZXN0V2VsbEtub3duVHlwZXModGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJhbnlfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEFueUZpZWxkRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55IGFueUZpZWxkXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55IEFueUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBhbnlGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGFueUZpZWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYXBpX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBBcGlGaWVsZEZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFwaSBhcGlGaWVsZF87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFwaSBBcGlGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gYXBpRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBhcGlGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImR1cmF0aW9uX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEdXJhdGlvbkZpZWxkRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24gZHVyYXRpb25GaWVsZF87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uIER1cmF0aW9uRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIGR1cmF0aW9uRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBkdXJhdGlvbkZpZWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZW1wdHlfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEVtcHR5RmllbGRGaWVsZE51bWJlciA9IDQ7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbXB0eSBlbXB0eUZpZWxkXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHkgRW1wdHlGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZW1wdHlGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGVtcHR5RmllbGRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmaWVsZF9tYXNrX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGaWVsZE1hc2tGaWVsZEZpZWxkTnVtYmVyID0gNTsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFzayBmaWVsZE1hc2tGaWVsZF87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFzayBGaWVsZE1hc2tGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGRNYXNrRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBmaWVsZE1hc2tGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNvdXJjZV9jb250ZXh0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTb3VyY2VDb250ZXh0RmllbGRGaWVsZE51bWJlciA9IDY7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0IHNvdXJjZUNvbnRleHRGaWVsZF87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQgU291cmNlQ29udGV4dEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBzb3VyY2VDb250ZXh0RmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzb3VyY2VDb250ZXh0RmllbGRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzdHJ1Y3RfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN0cnVjdEZpZWxkRmllbGROdW1iZXIgPSA3OwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0IHN0cnVjdEZpZWxkXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0IFN0cnVjdEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBzdHJ1Y3RGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHN0cnVjdEZpZWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidGltZXN0YW1wX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBUaW1lc3RhbXBGaWVsZEZpZWxkTnVtYmVyID0gODsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCB0aW1lc3RhbXBGaWVsZF87Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCBUaW1lc3RhbXBGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gdGltZXN0YW1wRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB0aW1lc3RhbXBGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInR5cGVfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVGaWVsZEZpZWxkTnVtYmVyID0gOTsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGUgdHlwZUZpZWxkXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZSBUeXBlRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHR5cGVGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRvdWJsZV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRG91YmxlRmllbGRGaWVsZE51bWJlciA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGRvdWJsZT8+IF9zaW5nbGVfZG91YmxlRmllbGRfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGRvdWJsZT4oODIpOwotICAgIHByaXZhdGUgZG91YmxlPyBkb3VibGVGaWVsZF87Ci0gICAgcHVibGljIGRvdWJsZT8gRG91YmxlRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIGRvdWJsZUZpZWxkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZG91YmxlRmllbGRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmbG9hdF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmxvYXRGaWVsZEZpZWxkTnVtYmVyID0gMTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8ZmxvYXQ/PiBfc2luZ2xlX2Zsb2F0RmllbGRfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGZsb2F0Pig5MCk7Ci0gICAgcHJpdmF0ZSBmbG9hdD8gZmxvYXRGaWVsZF87Ci0gICAgcHVibGljIGZsb2F0PyBGbG9hdEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBmbG9hdEZpZWxkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZmxvYXRGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImludDY0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBJbnQ2NEZpZWxkRmllbGROdW1iZXIgPSAxMjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxsb25nPz4gX3NpbmdsZV9pbnQ2NEZpZWxkX2NvZGVjID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxsb25nPig5OCk7Ci0gICAgcHJpdmF0ZSBsb25nPyBpbnQ2NEZpZWxkXzsKLSAgICBwdWJsaWMgbG9uZz8gSW50NjRGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gaW50NjRGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGludDY0RmllbGRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ1aW50NjRfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVpbnQ2NEZpZWxkRmllbGROdW1iZXIgPSAxMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzx1bG9uZz8+IF9zaW5nbGVfdWludDY0RmllbGRfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVsb25nPigxMDYpOwotICAgIHByaXZhdGUgdWxvbmc/IHVpbnQ2NEZpZWxkXzsKLSAgICBwdWJsaWMgdWxvbmc/IFVpbnQ2NEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiB1aW50NjRGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHVpbnQ2NEZpZWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiaW50MzJfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEludDMyRmllbGRGaWVsZE51bWJlciA9IDE0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD8+IF9zaW5nbGVfaW50MzJGaWVsZF9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8aW50PigxMTQpOwotICAgIHByaXZhdGUgaW50PyBpbnQzMkZpZWxkXzsKLSAgICBwdWJsaWMgaW50PyBJbnQzMkZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBpbnQzMkZpZWxkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgaW50MzJGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVpbnQzMl9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVWludDMyRmllbGRGaWVsZE51bWJlciA9IDE1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHVpbnQ/PiBfc2luZ2xlX3VpbnQzMkZpZWxkX2NvZGVjID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjx1aW50PigxMjIpOwotICAgIHByaXZhdGUgdWludD8gdWludDMyRmllbGRfOwotICAgIHB1YmxpYyB1aW50PyBVaW50MzJGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gdWludDMyRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB1aW50MzJGaWVsZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImJvb2xfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEJvb2xGaWVsZEZpZWxkTnVtYmVyID0gMTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Ym9vbD8+IF9zaW5nbGVfYm9vbEZpZWxkX2NvZGVjID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxib29sPigxMzApOwotICAgIHByaXZhdGUgYm9vbD8gYm9vbEZpZWxkXzsKLSAgICBwdWJsaWMgYm9vbD8gQm9vbEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBib29sRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBib29sRmllbGRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzdHJpbmdfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ0ZpZWxkRmllbGROdW1iZXIgPSAxNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxzdHJpbmc+IF9zaW5nbGVfc3RyaW5nRmllbGRfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JDbGFzc1dyYXBwZXI8c3RyaW5nPigxMzgpOwotICAgIHByaXZhdGUgc3RyaW5nIHN0cmluZ0ZpZWxkXzsKLSAgICBwdWJsaWMgc3RyaW5nIFN0cmluZ0ZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBzdHJpbmdGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHN0cmluZ0ZpZWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYnl0ZXNfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEJ5dGVzRmllbGRGaWVsZE51bWJlciA9IDE4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHBiOjpCeXRlU3RyaW5nPiBfc2luZ2xlX2J5dGVzRmllbGRfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JDbGFzc1dyYXBwZXI8cGI6OkJ5dGVTdHJpbmc+KDE0Nik7Ci0gICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyBieXRlc0ZpZWxkXzsKLSAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgQnl0ZXNGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gYnl0ZXNGaWVsZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGJ5dGVzRmllbGRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ2YWx1ZV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZEZpZWxkTnVtYmVyID0gMTk7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZSB2YWx1ZUZpZWxkXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBQYXJ0IG9mIHN0cnVjdCwgYnV0IHVzZWZ1bCB0byBiZSBhYmxlIHRvIHRlc3Qgc2VwYXJhdGVseQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlIFZhbHVlRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlRmllbGRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB2YWx1ZUZpZWxkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGVzdFdlbGxLbm93blR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGVzdFdlbGxLbm93blR5cGVzIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhBbnlGaWVsZCwgb3RoZXIuQW55RmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoQXBpRmllbGQsIG90aGVyLkFwaUZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKER1cmF0aW9uRmllbGQsIG90aGVyLkR1cmF0aW9uRmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoRW1wdHlGaWVsZCwgb3RoZXIuRW1wdHlGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhGaWVsZE1hc2tGaWVsZCwgb3RoZXIuRmllbGRNYXNrRmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoU291cmNlQ29udGV4dEZpZWxkLCBvdGhlci5Tb3VyY2VDb250ZXh0RmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoU3RydWN0RmllbGQsIG90aGVyLlN0cnVjdEZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFRpbWVzdGFtcEZpZWxkLCBvdGhlci5UaW1lc3RhbXBGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhUeXBlRmllbGQsIG90aGVyLlR5cGVGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChEb3VibGVGaWVsZCAhPSBvdGhlci5Eb3VibGVGaWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEZsb2F0RmllbGQgIT0gb3RoZXIuRmxvYXRGaWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEludDY0RmllbGQgIT0gb3RoZXIuSW50NjRGaWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFVpbnQ2NEZpZWxkICE9IG90aGVyLlVpbnQ2NEZpZWxkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoSW50MzJGaWVsZCAhPSBvdGhlci5JbnQzMkZpZWxkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoVWludDMyRmllbGQgIT0gb3RoZXIuVWludDMyRmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChCb29sRmllbGQgIT0gb3RoZXIuQm9vbEZpZWxkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU3RyaW5nRmllbGQgIT0gb3RoZXIuU3RyaW5nRmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChCeXRlc0ZpZWxkICE9IG90aGVyLkJ5dGVzRmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhWYWx1ZUZpZWxkLCBvdGhlci5WYWx1ZUZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChhbnlGaWVsZF8gIT0gbnVsbCkgaGFzaCBePSBBbnlGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKGFwaUZpZWxkXyAhPSBudWxsKSBoYXNoIF49IEFwaUZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoZHVyYXRpb25GaWVsZF8gIT0gbnVsbCkgaGFzaCBePSBEdXJhdGlvbkZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoZW1wdHlGaWVsZF8gIT0gbnVsbCkgaGFzaCBePSBFbXB0eUZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoZmllbGRNYXNrRmllbGRfICE9IG51bGwpIGhhc2ggXj0gRmllbGRNYXNrRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChzb3VyY2VDb250ZXh0RmllbGRfICE9IG51bGwpIGhhc2ggXj0gU291cmNlQ29udGV4dEZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoc3RydWN0RmllbGRfICE9IG51bGwpIGhhc2ggXj0gU3RydWN0RmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmICh0aW1lc3RhbXBGaWVsZF8gIT0gbnVsbCkgaGFzaCBePSBUaW1lc3RhbXBGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHR5cGVGaWVsZF8gIT0gbnVsbCkgaGFzaCBePSBUeXBlRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChkb3VibGVGaWVsZF8gIT0gbnVsbCkgaGFzaCBePSBEb3VibGVGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKGZsb2F0RmllbGRfICE9IG51bGwpIGhhc2ggXj0gRmxvYXRGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKGludDY0RmllbGRfICE9IG51bGwpIGhhc2ggXj0gSW50NjRGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHVpbnQ2NEZpZWxkXyAhPSBudWxsKSBoYXNoIF49IFVpbnQ2NEZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoaW50MzJGaWVsZF8gIT0gbnVsbCkgaGFzaCBePSBJbnQzMkZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAodWludDMyRmllbGRfICE9IG51bGwpIGhhc2ggXj0gVWludDMyRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChib29sRmllbGRfICE9IG51bGwpIGhhc2ggXj0gQm9vbEZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoc3RyaW5nRmllbGRfICE9IG51bGwpIGhhc2ggXj0gU3RyaW5nRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChieXRlc0ZpZWxkXyAhPSBudWxsKSBoYXNoIF49IEJ5dGVzRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmICh2YWx1ZUZpZWxkXyAhPSBudWxsKSBoYXNoIF49IFZhbHVlRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKGFueUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoQW55RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGFwaUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoQXBpRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGR1cmF0aW9uRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShEdXJhdGlvbkZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChlbXB0eUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzNCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoRW1wdHlGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRNYXNrRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShGaWVsZE1hc2tGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc291cmNlQ29udGV4dEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg1MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU291cmNlQ29udGV4dEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChzdHJ1Y3RGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFN0cnVjdEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmICh0aW1lc3RhbXBGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFRpbWVzdGFtcEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBlRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDc0KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShUeXBlRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGRvdWJsZUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIF9zaW5nbGVfZG91YmxlRmllbGRfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIERvdWJsZUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChmbG9hdEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIF9zaW5nbGVfZmxvYXRGaWVsZF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgRmxvYXRGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaW50NjRGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBfc2luZ2xlX2ludDY0RmllbGRfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIEludDY0RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKHVpbnQ2NEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIF9zaW5nbGVfdWludDY0RmllbGRfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIFVpbnQ2NEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChpbnQzMkZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIF9zaW5nbGVfaW50MzJGaWVsZF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgSW50MzJGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAodWludDMyRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgX3NpbmdsZV91aW50MzJGaWVsZF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgVWludDMyRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGJvb2xGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBfc2luZ2xlX2Jvb2xGaWVsZF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgQm9vbEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChzdHJpbmdGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBfc2luZ2xlX3N0cmluZ0ZpZWxkX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCBTdHJpbmdGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoYnl0ZXNGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBfc2luZ2xlX2J5dGVzRmllbGRfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIEJ5dGVzRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKHZhbHVlRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE1NCwgMSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoVmFsdWVGaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGFueUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoQW55RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGFwaUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoQXBpRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGR1cmF0aW9uRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShEdXJhdGlvbkZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChlbXB0eUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoRW1wdHlGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGRNYXNrRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShGaWVsZE1hc2tGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc291cmNlQ29udGV4dEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoU291cmNlQ29udGV4dEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChzdHJ1Y3RGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFN0cnVjdEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmICh0aW1lc3RhbXBGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFRpbWVzdGFtcEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBlRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShUeXBlRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGRvdWJsZUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9kb3VibGVGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhEb3VibGVGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZmxvYXRGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IF9zaW5nbGVfZmxvYXRGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhGbG9hdEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChpbnQ2NEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9pbnQ2NEZpZWxkX2NvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKEludDY0RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKHVpbnQ2NEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV91aW50NjRGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhVaW50NjRGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoaW50MzJGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IF9zaW5nbGVfaW50MzJGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhJbnQzMkZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmICh1aW50MzJGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IF9zaW5nbGVfdWludDMyRmllbGRfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoVWludDMyRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKGJvb2xGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IF9zaW5nbGVfYm9vbEZpZWxkX2NvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKEJvb2xGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoc3RyaW5nRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSBfc2luZ2xlX3N0cmluZ0ZpZWxkX2NvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKFN0cmluZ0ZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChieXRlc0ZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gX3NpbmdsZV9ieXRlc0ZpZWxkX2NvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKEJ5dGVzRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKHZhbHVlRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShWYWx1ZUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShUZXN0V2VsbEtub3duVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5hbnlGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoYW55RmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICBhbnlGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55KCk7Ci0gICAgICAgIH0KLSAgICAgICAgQW55RmllbGQuTWVyZ2VGcm9tKG90aGVyLkFueUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5hcGlGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoYXBpRmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICBhcGlGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpKCk7Ci0gICAgICAgIH0KLSAgICAgICAgQXBpRmllbGQuTWVyZ2VGcm9tKG90aGVyLkFwaUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5kdXJhdGlvbkZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChkdXJhdGlvbkZpZWxkXyA9PSBudWxsKSB7Ci0gICAgICAgICAgZHVyYXRpb25GaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBEdXJhdGlvbkZpZWxkLk1lcmdlRnJvbShvdGhlci5EdXJhdGlvbkZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5lbXB0eUZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChlbXB0eUZpZWxkXyA9PSBudWxsKSB7Ci0gICAgICAgICAgZW1wdHlGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHkoKTsKLSAgICAgICAgfQotICAgICAgICBFbXB0eUZpZWxkLk1lcmdlRnJvbShvdGhlci5FbXB0eUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5maWVsZE1hc2tGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoZmllbGRNYXNrRmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICBmaWVsZE1hc2tGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrKCk7Ci0gICAgICAgIH0KLSAgICAgICAgRmllbGRNYXNrRmllbGQuTWVyZ2VGcm9tKG90aGVyLkZpZWxkTWFza0ZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5zb3VyY2VDb250ZXh0RmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNvbnRleHRGaWVsZF8gPT0gbnVsbCkgewotICAgICAgICAgIHNvdXJjZUNvbnRleHRGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIFNvdXJjZUNvbnRleHRGaWVsZC5NZXJnZUZyb20ob3RoZXIuU291cmNlQ29udGV4dEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5zdHJ1Y3RGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoc3RydWN0RmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICBzdHJ1Y3RGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU3RydWN0RmllbGQuTWVyZ2VGcm9tKG90aGVyLlN0cnVjdEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci50aW1lc3RhbXBGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAodGltZXN0YW1wRmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICB0aW1lc3RhbXBGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wKCk7Ci0gICAgICAgIH0KLSAgICAgICAgVGltZXN0YW1wRmllbGQuTWVyZ2VGcm9tKG90aGVyLlRpbWVzdGFtcEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci50eXBlRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHR5cGVGaWVsZF8gPT0gbnVsbCkgewotICAgICAgICAgIHR5cGVGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZSgpOwotICAgICAgICB9Ci0gICAgICAgIFR5cGVGaWVsZC5NZXJnZUZyb20ob3RoZXIuVHlwZUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5kb3VibGVGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoZG91YmxlRmllbGRfID09IG51bGwgfHwgb3RoZXIuRG91YmxlRmllbGQgIT0gMEQpIHsKLSAgICAgICAgICBEb3VibGVGaWVsZCA9IG90aGVyLkRvdWJsZUZpZWxkOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuZmxvYXRGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoZmxvYXRGaWVsZF8gPT0gbnVsbCB8fCBvdGhlci5GbG9hdEZpZWxkICE9IDBGKSB7Ci0gICAgICAgICAgRmxvYXRGaWVsZCA9IG90aGVyLkZsb2F0RmllbGQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5pbnQ2NEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChpbnQ2NEZpZWxkXyA9PSBudWxsIHx8IG90aGVyLkludDY0RmllbGQgIT0gMEwpIHsKLSAgICAgICAgICBJbnQ2NEZpZWxkID0gb3RoZXIuSW50NjRGaWVsZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLnVpbnQ2NEZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmICh1aW50NjRGaWVsZF8gPT0gbnVsbCB8fCBvdGhlci5VaW50NjRGaWVsZCAhPSAwVUwpIHsKLSAgICAgICAgICBVaW50NjRGaWVsZCA9IG90aGVyLlVpbnQ2NEZpZWxkOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuaW50MzJGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoaW50MzJGaWVsZF8gPT0gbnVsbCB8fCBvdGhlci5JbnQzMkZpZWxkICE9IDApIHsKLSAgICAgICAgICBJbnQzMkZpZWxkID0gb3RoZXIuSW50MzJGaWVsZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLnVpbnQzMkZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmICh1aW50MzJGaWVsZF8gPT0gbnVsbCB8fCBvdGhlci5VaW50MzJGaWVsZCAhPSAwKSB7Ci0gICAgICAgICAgVWludDMyRmllbGQgPSBvdGhlci5VaW50MzJGaWVsZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLmJvb2xGaWVsZF8gIT0gbnVsbCkgewotICAgICAgICBpZiAoYm9vbEZpZWxkXyA9PSBudWxsIHx8IG90aGVyLkJvb2xGaWVsZCAhPSBmYWxzZSkgewotICAgICAgICAgIEJvb2xGaWVsZCA9IG90aGVyLkJvb2xGaWVsZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLnN0cmluZ0ZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChzdHJpbmdGaWVsZF8gPT0gbnVsbCB8fCBvdGhlci5TdHJpbmdGaWVsZCAhPSAiIikgewotICAgICAgICAgIFN0cmluZ0ZpZWxkID0gb3RoZXIuU3RyaW5nRmllbGQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5ieXRlc0ZpZWxkXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChieXRlc0ZpZWxkXyA9PSBudWxsIHx8IG90aGVyLkJ5dGVzRmllbGQgIT0gcGI6OkJ5dGVTdHJpbmcuRW1wdHkpIHsKLSAgICAgICAgICBCeXRlc0ZpZWxkID0gb3RoZXIuQnl0ZXNGaWVsZDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKG90aGVyLnZhbHVlRmllbGRfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHZhbHVlRmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICB2YWx1ZUZpZWxkXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICAgIFZhbHVlRmllbGQuTWVyZ2VGcm9tKG90aGVyLlZhbHVlRmllbGQpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGlmIChhbnlGaWVsZF8gPT0gbnVsbCkgewotICAgICAgICAgICAgICBhbnlGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShhbnlGaWVsZF8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIGlmIChhcGlGaWVsZF8gPT0gbnVsbCkgewotICAgICAgICAgICAgICBhcGlGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShhcGlGaWVsZF8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIGlmIChkdXJhdGlvbkZpZWxkXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIGR1cmF0aW9uRmllbGRfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShkdXJhdGlvbkZpZWxkXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgaWYgKGVtcHR5RmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgZW1wdHlGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHkoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKGVtcHR5RmllbGRfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQyOiB7Ci0gICAgICAgICAgICBpZiAoZmllbGRNYXNrRmllbGRfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgZmllbGRNYXNrRmllbGRfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFzaygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2UoZmllbGRNYXNrRmllbGRfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOiB7Ci0gICAgICAgICAgICBpZiAoc291cmNlQ29udGV4dEZpZWxkXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHNvdXJjZUNvbnRleHRGaWVsZF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc291cmNlQ29udGV4dEZpZWxkXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1ODogewotICAgICAgICAgICAgaWYgKHN0cnVjdEZpZWxkXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHN0cnVjdEZpZWxkXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3QoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN0cnVjdEZpZWxkXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA2NjogewotICAgICAgICAgICAgaWYgKHRpbWVzdGFtcEZpZWxkXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHRpbWVzdGFtcEZpZWxkXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXAoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHRpbWVzdGFtcEZpZWxkXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NDogewotICAgICAgICAgICAgaWYgKHR5cGVGaWVsZF8gPT0gbnVsbCkgewotICAgICAgICAgICAgICB0eXBlRmllbGRfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHR5cGVGaWVsZF8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODI6IHsKLSAgICAgICAgICAgIGRvdWJsZT8gdmFsdWUgPSBfc2luZ2xlX2RvdWJsZUZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKGRvdWJsZUZpZWxkXyA9PSBudWxsIHx8IHZhbHVlICE9IDBEKSB7Ci0gICAgICAgICAgICAgIERvdWJsZUZpZWxkID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgZmxvYXQ/IHZhbHVlID0gX3NpbmdsZV9mbG9hdEZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKGZsb2F0RmllbGRfID09IG51bGwgfHwgdmFsdWUgIT0gMEYpIHsKLSAgICAgICAgICAgICAgRmxvYXRGaWVsZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgOTg6IHsKLSAgICAgICAgICAgIGxvbmc/IHZhbHVlID0gX3NpbmdsZV9pbnQ2NEZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKGludDY0RmllbGRfID09IG51bGwgfHwgdmFsdWUgIT0gMEwpIHsKLSAgICAgICAgICAgICAgSW50NjRGaWVsZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTA2OiB7Ci0gICAgICAgICAgICB1bG9uZz8gdmFsdWUgPSBfc2luZ2xlX3VpbnQ2NEZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKHVpbnQ2NEZpZWxkXyA9PSBudWxsIHx8IHZhbHVlICE9IDBVTCkgewotICAgICAgICAgICAgICBVaW50NjRGaWVsZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTE0OiB7Ci0gICAgICAgICAgICBpbnQ/IHZhbHVlID0gX3NpbmdsZV9pbnQzMkZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKGludDMyRmllbGRfID09IG51bGwgfHwgdmFsdWUgIT0gMCkgewotICAgICAgICAgICAgICBJbnQzMkZpZWxkID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMjI6IHsKLSAgICAgICAgICAgIHVpbnQ/IHZhbHVlID0gX3NpbmdsZV91aW50MzJGaWVsZF9jb2RlYy5SZWFkKGlucHV0KTsKLSAgICAgICAgICAgIGlmICh1aW50MzJGaWVsZF8gPT0gbnVsbCB8fCB2YWx1ZSAhPSAwKSB7Ci0gICAgICAgICAgICAgIFVpbnQzMkZpZWxkID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMzA6IHsKLSAgICAgICAgICAgIGJvb2w/IHZhbHVlID0gX3NpbmdsZV9ib29sRmllbGRfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBpZiAoYm9vbEZpZWxkXyA9PSBudWxsIHx8IHZhbHVlICE9IGZhbHNlKSB7Ci0gICAgICAgICAgICAgIEJvb2xGaWVsZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTM4OiB7Ci0gICAgICAgICAgICBzdHJpbmcgdmFsdWUgPSBfc2luZ2xlX3N0cmluZ0ZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKHN0cmluZ0ZpZWxkXyA9PSBudWxsIHx8IHZhbHVlICE9ICIiKSB7Ci0gICAgICAgICAgICAgIFN0cmluZ0ZpZWxkID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNDY6IHsKLSAgICAgICAgICAgIHBiOjpCeXRlU3RyaW5nIHZhbHVlID0gX3NpbmdsZV9ieXRlc0ZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgaWYgKGJ5dGVzRmllbGRfID09IG51bGwgfHwgdmFsdWUgIT0gcGI6OkJ5dGVTdHJpbmcuRW1wdHkpIHsKLSAgICAgICAgICAgICAgQnl0ZXNGaWVsZCA9IHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTU0OiB7Ci0gICAgICAgICAgICBpZiAodmFsdWVGaWVsZF8gPT0gbnVsbCkgewotICAgICAgICAgICAgICB2YWx1ZUZpZWxkXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2UodmFsdWVGaWVsZF8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgQSByZXBlYXRlZCBmaWVsZCBmb3IgZWFjaCB3ZWxsLWtub3duIHR5cGUuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBSZXBlYXRlZFdlbGxLbm93blR5cGVzIDogcGI6OklNZXNzYWdlPFJlcGVhdGVkV2VsbEtub3duVHlwZXM+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxSZXBlYXRlZFdlbGxLbm93blR5cGVzPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFJlcGVhdGVkV2VsbEtub3duVHlwZXM+KCgpID0+IG5ldyBSZXBlYXRlZFdlbGxLbm93blR5cGVzKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8UmVwZWF0ZWRXZWxsS25vd25UeXBlcz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RXZWxsS25vd25UeXBlc1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFJlcGVhdGVkV2VsbEtub3duVHlwZXMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFJlcGVhdGVkV2VsbEtub3duVHlwZXMoUmVwZWF0ZWRXZWxsS25vd25UeXBlcyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgYW55RmllbGRfID0gb3RoZXIuYW55RmllbGRfLkNsb25lKCk7Ci0gICAgICBhcGlGaWVsZF8gPSBvdGhlci5hcGlGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGR1cmF0aW9uRmllbGRfID0gb3RoZXIuZHVyYXRpb25GaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGVtcHR5RmllbGRfID0gb3RoZXIuZW1wdHlGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGZpZWxkTWFza0ZpZWxkXyA9IG90aGVyLmZpZWxkTWFza0ZpZWxkXy5DbG9uZSgpOwotICAgICAgc291cmNlQ29udGV4dEZpZWxkXyA9IG90aGVyLnNvdXJjZUNvbnRleHRGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHN0cnVjdEZpZWxkXyA9IG90aGVyLnN0cnVjdEZpZWxkXy5DbG9uZSgpOwotICAgICAgdGltZXN0YW1wRmllbGRfID0gb3RoZXIudGltZXN0YW1wRmllbGRfLkNsb25lKCk7Ci0gICAgICB0eXBlRmllbGRfID0gb3RoZXIudHlwZUZpZWxkXy5DbG9uZSgpOwotICAgICAgZG91YmxlRmllbGRfID0gb3RoZXIuZG91YmxlRmllbGRfLkNsb25lKCk7Ci0gICAgICBmbG9hdEZpZWxkXyA9IG90aGVyLmZsb2F0RmllbGRfLkNsb25lKCk7Ci0gICAgICBpbnQ2NEZpZWxkXyA9IG90aGVyLmludDY0RmllbGRfLkNsb25lKCk7Ci0gICAgICB1aW50NjRGaWVsZF8gPSBvdGhlci51aW50NjRGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGludDMyRmllbGRfID0gb3RoZXIuaW50MzJGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHVpbnQzMkZpZWxkXyA9IG90aGVyLnVpbnQzMkZpZWxkXy5DbG9uZSgpOwotICAgICAgYm9vbEZpZWxkXyA9IG90aGVyLmJvb2xGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHN0cmluZ0ZpZWxkXyA9IG90aGVyLnN0cmluZ0ZpZWxkXy5DbG9uZSgpOwotICAgICAgYnl0ZXNGaWVsZF8gPSBvdGhlci5ieXRlc0ZpZWxkXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBSZXBlYXRlZFdlbGxLbm93blR5cGVzIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFdlbGxLbm93blR5cGVzKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYW55X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBBbnlGaWVsZEZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Bbnk+IF9yZXBlYXRlZF9hbnlGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTAsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueS5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueT4gYW55RmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Bbnk+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Bbnk+IEFueUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBhbnlGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImFwaV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQXBpRmllbGRGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpPiBfcmVwZWF0ZWRfYXBpRmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGkuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGk+IGFwaUZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpPiBBcGlGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gYXBpRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkdXJhdGlvbl9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRHVyYXRpb25GaWVsZEZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbj4gX3JlcGVhdGVkX2R1cmF0aW9uRmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDI2LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbi5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uPiBkdXJhdGlvbkZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbj4gRHVyYXRpb25GaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZHVyYXRpb25GaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImVtcHR5X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBFbXB0eUZpZWxkRmllbGROdW1iZXIgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5PiBfcmVwZWF0ZWRfZW1wdHlGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMzQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5LlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHk+IGVtcHR5RmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbXB0eT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5PiBFbXB0eUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBlbXB0eUZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZmllbGRfbWFza19maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGRNYXNrRmllbGRGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrPiBfcmVwZWF0ZWRfZmllbGRNYXNrRmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDQyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2suUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2s+IGZpZWxkTWFza0ZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrPiBGaWVsZE1hc2tGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGRNYXNrRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzb3VyY2VfY29udGV4dF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU291cmNlQ29udGV4dEZpZWxkRmllbGROdW1iZXIgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQ+IF9yZXBlYXRlZF9zb3VyY2VDb250ZXh0RmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDUwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0LlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dD4gc291cmNlQ29udGV4dEZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dD4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQ+IFNvdXJjZUNvbnRleHRGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc291cmNlQ29udGV4dEZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic3RydWN0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTdHJ1Y3RGaWVsZEZpZWxkTnVtYmVyID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3Q+IF9yZXBlYXRlZF9zdHJ1Y3RGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdC5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdD4gc3RydWN0RmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3Q+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3Q+IFN0cnVjdEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBzdHJ1Y3RGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInRpbWVzdGFtcF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVGltZXN0YW1wRmllbGRGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wPiBfcmVwZWF0ZWRfdGltZXN0YW1wRmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDY2LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXAuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXA+IHRpbWVzdGFtcEZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wPiBUaW1lc3RhbXBGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gdGltZXN0YW1wRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ0eXBlX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBUeXBlRmllbGRGaWVsZE51bWJlciA9IDk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZT4gX3JlcGVhdGVkX3R5cGVGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNzQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGUuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlPiB0eXBlRmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZT4gVHlwZUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiB0eXBlRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkb3VibGVfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERvdWJsZUZpZWxkRmllbGROdW1iZXIgPSAxMDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxkb3VibGU/PiBfcmVwZWF0ZWRfZG91YmxlRmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGRvdWJsZT4oODIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGRvdWJsZT8+IGRvdWJsZUZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8ZG91YmxlPz4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGVzZSBkb24ndCBhY3R1YWxseSBtYWtlIGEgbG90IG9mIHNlbnNlLCBidXQgdGhleSdyZSBub3QgcHJvaGliaXRlZC4uLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxkb3VibGU/PiBEb3VibGVGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZG91YmxlRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmbG9hdF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmxvYXRGaWVsZEZpZWxkTnVtYmVyID0gMTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8ZmxvYXQ/PiBfcmVwZWF0ZWRfZmxvYXRGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8ZmxvYXQ+KDkwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD8+IGZsb2F0RmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxmbG9hdD8+IEZsb2F0RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIGZsb2F0RmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJpbnQ2NF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSW50NjRGaWVsZEZpZWxkTnVtYmVyID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz8+IF9yZXBlYXRlZF9pbnQ2NEZpZWxkX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxsb25nPig5OCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8bG9uZz8+IGludDY0RmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxsb25nPz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGxvbmc/PiBJbnQ2NEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBpbnQ2NEZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidWludDY0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVaW50NjRGaWVsZEZpZWxkTnVtYmVyID0gMTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc/PiBfcmVwZWF0ZWRfdWludDY0RmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVsb25nPigxMDYpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHVsb25nPz4gdWludDY0RmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1bG9uZz8+IFVpbnQ2NEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiB1aW50NjRGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImludDMyX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBJbnQzMkZpZWxkRmllbGROdW1iZXIgPSAxNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ/PiBfcmVwZWF0ZWRfaW50MzJGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8aW50PigxMTQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD8+IGludDMyRmllbGRfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ/PigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50Pz4gSW50MzJGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gaW50MzJGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVpbnQzMl9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVWludDMyRmllbGRGaWVsZE51bWJlciA9IDE1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHVpbnQ/PiBfcmVwZWF0ZWRfdWludDMyRmllbGRfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVpbnQ+KDEyMik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD8+IHVpbnQzMkZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8dWludD8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDx1aW50Pz4gVWludDMyRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHVpbnQzMkZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYm9vbF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQm9vbEZpZWxkRmllbGROdW1iZXIgPSAxNjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxib29sPz4gX3JlcGVhdGVkX2Jvb2xGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8Ym9vbD4oMTMwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxib29sPz4gYm9vbEZpZWxkXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Ym9vbD8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxib29sPz4gQm9vbEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBib29sRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzdHJpbmdfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ0ZpZWxkRmllbGROdW1iZXIgPSAxNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxzdHJpbmc+IF9yZXBlYXRlZF9zdHJpbmdGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxzdHJpbmc+KDEzOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBzdHJpbmdGaWVsZF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4gU3RyaW5nRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHN0cmluZ0ZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYnl0ZXNfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEJ5dGVzRmllbGRGaWVsZE51bWJlciA9IDE4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHBiOjpCeXRlU3RyaW5nPiBfcmVwZWF0ZWRfYnl0ZXNGaWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxwYjo6Qnl0ZVN0cmluZz4oMTQ2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxwYjo6Qnl0ZVN0cmluZz4gYnl0ZXNGaWVsZF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHBiOjpCeXRlU3RyaW5nPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8cGI6OkJ5dGVTdHJpbmc+IEJ5dGVzRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIGJ5dGVzRmllbGRfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBSZXBlYXRlZFdlbGxLbm93blR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoUmVwZWF0ZWRXZWxsS25vd25UeXBlcyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZighYW55RmllbGRfLkVxdWFscyhvdGhlci5hbnlGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighYXBpRmllbGRfLkVxdWFscyhvdGhlci5hcGlGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighZHVyYXRpb25GaWVsZF8uRXF1YWxzKG90aGVyLmR1cmF0aW9uRmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIWVtcHR5RmllbGRfLkVxdWFscyhvdGhlci5lbXB0eUZpZWxkXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFmaWVsZE1hc2tGaWVsZF8uRXF1YWxzKG90aGVyLmZpZWxkTWFza0ZpZWxkXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFzb3VyY2VDb250ZXh0RmllbGRfLkVxdWFscyhvdGhlci5zb3VyY2VDb250ZXh0RmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXN0cnVjdEZpZWxkXy5FcXVhbHMob3RoZXIuc3RydWN0RmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXRpbWVzdGFtcEZpZWxkXy5FcXVhbHMob3RoZXIudGltZXN0YW1wRmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXR5cGVGaWVsZF8uRXF1YWxzKG90aGVyLnR5cGVGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighZG91YmxlRmllbGRfLkVxdWFscyhvdGhlci5kb3VibGVGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighZmxvYXRGaWVsZF8uRXF1YWxzKG90aGVyLmZsb2F0RmllbGRfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIWludDY0RmllbGRfLkVxdWFscyhvdGhlci5pbnQ2NEZpZWxkXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1aW50NjRGaWVsZF8uRXF1YWxzKG90aGVyLnVpbnQ2NEZpZWxkXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFpbnQzMkZpZWxkXy5FcXVhbHMob3RoZXIuaW50MzJGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdWludDMyRmllbGRfLkVxdWFscyhvdGhlci51aW50MzJGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighYm9vbEZpZWxkXy5FcXVhbHMob3RoZXIuYm9vbEZpZWxkXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFzdHJpbmdGaWVsZF8uRXF1YWxzKG90aGVyLnN0cmluZ0ZpZWxkXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFieXRlc0ZpZWxkXy5FcXVhbHMob3RoZXIuYnl0ZXNGaWVsZF8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaGFzaCBePSBhbnlGaWVsZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gYXBpRmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IGR1cmF0aW9uRmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IGVtcHR5RmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IGZpZWxkTWFza0ZpZWxkXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBzb3VyY2VDb250ZXh0RmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHN0cnVjdEZpZWxkXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB0aW1lc3RhbXBGaWVsZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdHlwZUZpZWxkXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBkb3VibGVGaWVsZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gZmxvYXRGaWVsZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gaW50NjRGaWVsZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdWludDY0RmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IGludDMyRmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHVpbnQzMkZpZWxkXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBib29sRmllbGRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHN0cmluZ0ZpZWxkXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBieXRlc0ZpZWxkXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBhbnlGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9hbnlGaWVsZF9jb2RlYyk7Ci0gICAgICBhcGlGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9hcGlGaWVsZF9jb2RlYyk7Ci0gICAgICBkdXJhdGlvbkZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX2R1cmF0aW9uRmllbGRfY29kZWMpOwotICAgICAgZW1wdHlGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9lbXB0eUZpZWxkX2NvZGVjKTsKLSAgICAgIGZpZWxkTWFza0ZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX2ZpZWxkTWFza0ZpZWxkX2NvZGVjKTsKLSAgICAgIHNvdXJjZUNvbnRleHRGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9zb3VyY2VDb250ZXh0RmllbGRfY29kZWMpOwotICAgICAgc3RydWN0RmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfc3RydWN0RmllbGRfY29kZWMpOwotICAgICAgdGltZXN0YW1wRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdGltZXN0YW1wRmllbGRfY29kZWMpOwotICAgICAgdHlwZUZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3R5cGVGaWVsZF9jb2RlYyk7Ci0gICAgICBkb3VibGVGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9kb3VibGVGaWVsZF9jb2RlYyk7Ci0gICAgICBmbG9hdEZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX2Zsb2F0RmllbGRfY29kZWMpOwotICAgICAgaW50NjRGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9pbnQ2NEZpZWxkX2NvZGVjKTsKLSAgICAgIHVpbnQ2NEZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3VpbnQ2NEZpZWxkX2NvZGVjKTsKLSAgICAgIGludDMyRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfaW50MzJGaWVsZF9jb2RlYyk7Ci0gICAgICB1aW50MzJGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91aW50MzJGaWVsZF9jb2RlYyk7Ci0gICAgICBib29sRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfYm9vbEZpZWxkX2NvZGVjKTsKLSAgICAgIHN0cmluZ0ZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3N0cmluZ0ZpZWxkX2NvZGVjKTsKLSAgICAgIGJ5dGVzRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfYnl0ZXNGaWVsZF9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSBhbnlGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfYW55RmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSBhcGlGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfYXBpRmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSBkdXJhdGlvbkZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9kdXJhdGlvbkZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gZW1wdHlGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZW1wdHlGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IGZpZWxkTWFza0ZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9maWVsZE1hc2tGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHNvdXJjZUNvbnRleHRGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfc291cmNlQ29udGV4dEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gc3RydWN0RmllbGRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3N0cnVjdEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gdGltZXN0YW1wRmllbGRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3RpbWVzdGFtcEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gdHlwZUZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF90eXBlRmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSBkb3VibGVGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZG91YmxlRmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSBmbG9hdEZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9mbG9hdEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gaW50NjRGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfaW50NjRGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHVpbnQ2NEZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF91aW50NjRGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IGludDMyRmllbGRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX2ludDMyRmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSB1aW50MzJGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdWludDMyRmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSBib29sRmllbGRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX2Jvb2xGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHN0cmluZ0ZpZWxkXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9zdHJpbmdGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IGJ5dGVzRmllbGRfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX2J5dGVzRmllbGRfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFJlcGVhdGVkV2VsbEtub3duVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGFueUZpZWxkXy5BZGQob3RoZXIuYW55RmllbGRfKTsKLSAgICAgIGFwaUZpZWxkXy5BZGQob3RoZXIuYXBpRmllbGRfKTsKLSAgICAgIGR1cmF0aW9uRmllbGRfLkFkZChvdGhlci5kdXJhdGlvbkZpZWxkXyk7Ci0gICAgICBlbXB0eUZpZWxkXy5BZGQob3RoZXIuZW1wdHlGaWVsZF8pOwotICAgICAgZmllbGRNYXNrRmllbGRfLkFkZChvdGhlci5maWVsZE1hc2tGaWVsZF8pOwotICAgICAgc291cmNlQ29udGV4dEZpZWxkXy5BZGQob3RoZXIuc291cmNlQ29udGV4dEZpZWxkXyk7Ci0gICAgICBzdHJ1Y3RGaWVsZF8uQWRkKG90aGVyLnN0cnVjdEZpZWxkXyk7Ci0gICAgICB0aW1lc3RhbXBGaWVsZF8uQWRkKG90aGVyLnRpbWVzdGFtcEZpZWxkXyk7Ci0gICAgICB0eXBlRmllbGRfLkFkZChvdGhlci50eXBlRmllbGRfKTsKLSAgICAgIGRvdWJsZUZpZWxkXy5BZGQob3RoZXIuZG91YmxlRmllbGRfKTsKLSAgICAgIGZsb2F0RmllbGRfLkFkZChvdGhlci5mbG9hdEZpZWxkXyk7Ci0gICAgICBpbnQ2NEZpZWxkXy5BZGQob3RoZXIuaW50NjRGaWVsZF8pOwotICAgICAgdWludDY0RmllbGRfLkFkZChvdGhlci51aW50NjRGaWVsZF8pOwotICAgICAgaW50MzJGaWVsZF8uQWRkKG90aGVyLmludDMyRmllbGRfKTsKLSAgICAgIHVpbnQzMkZpZWxkXy5BZGQob3RoZXIudWludDMyRmllbGRfKTsKLSAgICAgIGJvb2xGaWVsZF8uQWRkKG90aGVyLmJvb2xGaWVsZF8pOwotICAgICAgc3RyaW5nRmllbGRfLkFkZChvdGhlci5zdHJpbmdGaWVsZF8pOwotICAgICAgYnl0ZXNGaWVsZF8uQWRkKG90aGVyLmJ5dGVzRmllbGRfKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBhbnlGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9hbnlGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgYXBpRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfYXBpRmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIGR1cmF0aW9uRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfZHVyYXRpb25GaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgZW1wdHlGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9lbXB0eUZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQyOiB7Ci0gICAgICAgICAgICBmaWVsZE1hc2tGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9maWVsZE1hc2tGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1MDogewotICAgICAgICAgICAgc291cmNlQ29udGV4dEZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3NvdXJjZUNvbnRleHRGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1ODogewotICAgICAgICAgICAgc3RydWN0RmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfc3RydWN0RmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjY6IHsKLSAgICAgICAgICAgIHRpbWVzdGFtcEZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3RpbWVzdGFtcEZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc0OiB7Ci0gICAgICAgICAgICB0eXBlRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdHlwZUZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDgyOiB7Ci0gICAgICAgICAgICBkb3VibGVGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9kb3VibGVGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgZmxvYXRGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9mbG9hdEZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDk4OiB7Ci0gICAgICAgICAgICBpbnQ2NEZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX2ludDY0RmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTA2OiB7Ci0gICAgICAgICAgICB1aW50NjRGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF91aW50NjRGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMTQ6IHsKLSAgICAgICAgICAgIGludDMyRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfaW50MzJGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMjI6IHsKLSAgICAgICAgICAgIHVpbnQzMkZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VpbnQzMkZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEzMDogewotICAgICAgICAgICAgYm9vbEZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX2Jvb2xGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMzg6IHsKLSAgICAgICAgICAgIHN0cmluZ0ZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3N0cmluZ0ZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE0NjogewotICAgICAgICAgICAgYnl0ZXNGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9ieXRlc0ZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE9uZW9mV2VsbEtub3duVHlwZXMgOiBwYjo6SU1lc3NhZ2U8T25lb2ZXZWxsS25vd25UeXBlcz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE9uZW9mV2VsbEtub3duVHlwZXM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8T25lb2ZXZWxsS25vd25UeXBlcz4oKCkgPT4gbmV3IE9uZW9mV2VsbEtub3duVHlwZXMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxPbmVvZldlbGxLbm93blR5cGVzPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuVGVzdFByb3Rvcy5Vbml0dGVzdFdlbGxLbm93blR5cGVzUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT25lb2ZXZWxsS25vd25UeXBlcygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgT25lb2ZXZWxsS25vd25UeXBlcyhPbmVvZldlbGxLbm93blR5cGVzIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBzd2l0Y2ggKG90aGVyLk9uZW9mRmllbGRDYXNlKSB7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5BbnlGaWVsZDoKLSAgICAgICAgICBBbnlGaWVsZCA9IG90aGVyLkFueUZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5BcGlGaWVsZDoKLSAgICAgICAgICBBcGlGaWVsZCA9IG90aGVyLkFwaUZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5EdXJhdGlvbkZpZWxkOgotICAgICAgICAgIER1cmF0aW9uRmllbGQgPSBvdGhlci5EdXJhdGlvbkZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5FbXB0eUZpZWxkOgotICAgICAgICAgIEVtcHR5RmllbGQgPSBvdGhlci5FbXB0eUZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5GaWVsZE1hc2tGaWVsZDoKLSAgICAgICAgICBGaWVsZE1hc2tGaWVsZCA9IG90aGVyLkZpZWxkTWFza0ZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5Tb3VyY2VDb250ZXh0RmllbGQ6Ci0gICAgICAgICAgU291cmNlQ29udGV4dEZpZWxkID0gb3RoZXIuU291cmNlQ29udGV4dEZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5TdHJ1Y3RGaWVsZDoKLSAgICAgICAgICBTdHJ1Y3RGaWVsZCA9IG90aGVyLlN0cnVjdEZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5UaW1lc3RhbXBGaWVsZDoKLSAgICAgICAgICBUaW1lc3RhbXBGaWVsZCA9IG90aGVyLlRpbWVzdGFtcEZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5UeXBlRmllbGQ6Ci0gICAgICAgICAgVHlwZUZpZWxkID0gb3RoZXIuVHlwZUZpZWxkLkNsb25lKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5Eb3VibGVGaWVsZDoKLSAgICAgICAgICBEb3VibGVGaWVsZCA9IG90aGVyLkRvdWJsZUZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuRmxvYXRGaWVsZDoKLSAgICAgICAgICBGbG9hdEZpZWxkID0gb3RoZXIuRmxvYXRGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLkludDY0RmllbGQ6Ci0gICAgICAgICAgSW50NjRGaWVsZCA9IG90aGVyLkludDY0RmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5VaW50NjRGaWVsZDoKLSAgICAgICAgICBVaW50NjRGaWVsZCA9IG90aGVyLlVpbnQ2NEZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuSW50MzJGaWVsZDoKLSAgICAgICAgICBJbnQzMkZpZWxkID0gb3RoZXIuSW50MzJGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLlVpbnQzMkZpZWxkOgotICAgICAgICAgIFVpbnQzMkZpZWxkID0gb3RoZXIuVWludDMyRmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5Cb29sRmllbGQ6Ci0gICAgICAgICAgQm9vbEZpZWxkID0gb3RoZXIuQm9vbEZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuU3RyaW5nRmllbGQ6Ci0gICAgICAgICAgU3RyaW5nRmllbGQgPSBvdGhlci5TdHJpbmdGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLkJ5dGVzRmllbGQ6Ci0gICAgICAgICAgQnl0ZXNGaWVsZCA9IG90aGVyLkJ5dGVzRmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT25lb2ZXZWxsS25vd25UeXBlcyBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgT25lb2ZXZWxsS25vd25UeXBlcyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImFueV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQW55RmllbGRGaWVsZE51bWJlciA9IDE7Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueSBBbnlGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQW55RmllbGQgPyAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55KSBvbmVvZkZpZWxkXyA6IG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gdmFsdWU7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IHZhbHVlID09IG51bGwgPyBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUgOiBPbmVvZkZpZWxkT25lb2ZDYXNlLkFueUZpZWxkOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYXBpX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBBcGlGaWVsZEZpZWxkTnVtYmVyID0gMjsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpIEFwaUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5BcGlGaWVsZCA/IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGkpIG9uZW9mRmllbGRfIDogbnVsbDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSB2YWx1ZTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gdmFsdWUgPT0gbnVsbCA/IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZSA6IE9uZW9mRmllbGRPbmVvZkNhc2UuQXBpRmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkdXJhdGlvbl9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRHVyYXRpb25GaWVsZEZpZWxkTnVtYmVyID0gMzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24gRHVyYXRpb25GaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuRHVyYXRpb25GaWVsZCA/IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbikgb25lb2ZGaWVsZF8gOiBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lIDogT25lb2ZGaWVsZE9uZW9mQ2FzZS5EdXJhdGlvbkZpZWxkOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZW1wdHlfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEVtcHR5RmllbGRGaWVsZE51bWJlciA9IDQ7Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5IEVtcHR5RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkVtcHR5RmllbGQgPyAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHkpIG9uZW9mRmllbGRfIDogbnVsbDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSB2YWx1ZTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gdmFsdWUgPT0gbnVsbCA/IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZSA6IE9uZW9mRmllbGRPbmVvZkNhc2UuRW1wdHlGaWVsZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZpZWxkX21hc2tfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkTWFza0ZpZWxkRmllbGROdW1iZXIgPSA1OwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2sgRmllbGRNYXNrRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkZpZWxkTWFza0ZpZWxkID8gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFzaykgb25lb2ZGaWVsZF8gOiBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lIDogT25lb2ZGaWVsZE9uZW9mQ2FzZS5GaWVsZE1hc2tGaWVsZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNvdXJjZV9jb250ZXh0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTb3VyY2VDb250ZXh0RmllbGRGaWVsZE51bWJlciA9IDY7Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQgU291cmNlQ29udGV4dEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Tb3VyY2VDb250ZXh0RmllbGQgPyAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCkgb25lb2ZGaWVsZF8gOiBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lIDogT25lb2ZGaWVsZE9uZW9mQ2FzZS5Tb3VyY2VDb250ZXh0RmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzdHJ1Y3RfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN0cnVjdEZpZWxkRmllbGROdW1iZXIgPSA3OwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3QgU3RydWN0RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cnVjdEZpZWxkID8gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdCkgb25lb2ZGaWVsZF8gOiBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lIDogT25lb2ZGaWVsZE9uZW9mQ2FzZS5TdHJ1Y3RGaWVsZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInRpbWVzdGFtcF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVGltZXN0YW1wRmllbGRGaWVsZE51bWJlciA9IDg7Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCBUaW1lc3RhbXBGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuVGltZXN0YW1wRmllbGQgPyAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wKSBvbmVvZkZpZWxkXyA6IG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gdmFsdWU7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IHZhbHVlID09IG51bGwgPyBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUgOiBPbmVvZkZpZWxkT25lb2ZDYXNlLlRpbWVzdGFtcEZpZWxkOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidHlwZV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVHlwZUZpZWxkRmllbGROdW1iZXIgPSA5OwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlIFR5cGVGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuVHlwZUZpZWxkID8gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGUpIG9uZW9mRmllbGRfIDogbnVsbDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSB2YWx1ZTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gdmFsdWUgPT0gbnVsbCA/IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZSA6IE9uZW9mRmllbGRPbmVvZkNhc2UuVHlwZUZpZWxkOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZG91YmxlX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEb3VibGVGaWVsZEZpZWxkTnVtYmVyID0gMTA7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8ZG91YmxlPz4gX29uZW9mX2RvdWJsZUZpZWxkX2NvZGVjID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxkb3VibGU+KDgyKTsKLSAgICBwdWJsaWMgZG91YmxlPyBEb3VibGVGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuRG91YmxlRmllbGQgPyAoZG91YmxlPykgb25lb2ZGaWVsZF8gOiAoZG91YmxlPykgbnVsbDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSB2YWx1ZTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gdmFsdWUgPT0gbnVsbCA/IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZSA6IE9uZW9mRmllbGRPbmVvZkNhc2UuRG91YmxlRmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmbG9hdF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmxvYXRGaWVsZEZpZWxkTnVtYmVyID0gMTE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8ZmxvYXQ/PiBfb25lb2ZfZmxvYXRGaWVsZF9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8ZmxvYXQ+KDkwKTsKLSAgICBwdWJsaWMgZmxvYXQ/IEZsb2F0RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkZsb2F0RmllbGQgPyAoZmxvYXQ/KSBvbmVvZkZpZWxkXyA6IChmbG9hdD8pIG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gdmFsdWU7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IHZhbHVlID09IG51bGwgPyBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUgOiBPbmVvZkZpZWxkT25lb2ZDYXNlLkZsb2F0RmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJpbnQ2NF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSW50NjRGaWVsZEZpZWxkTnVtYmVyID0gMTI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8bG9uZz8+IF9vbmVvZl9pbnQ2NEZpZWxkX2NvZGVjID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxsb25nPig5OCk7Ci0gICAgcHVibGljIGxvbmc/IEludDY0RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkludDY0RmllbGQgPyAobG9uZz8pIG9uZW9mRmllbGRfIDogKGxvbmc/KSBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lIDogT25lb2ZGaWVsZE9uZW9mQ2FzZS5JbnQ2NEZpZWxkOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidWludDY0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVaW50NjRGaWVsZEZpZWxkTnVtYmVyID0gMTM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8dWxvbmc/PiBfb25lb2ZfdWludDY0RmllbGRfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVsb25nPigxMDYpOwotICAgIHB1YmxpYyB1bG9uZz8gVWludDY0RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlVpbnQ2NEZpZWxkID8gKHVsb25nPykgb25lb2ZGaWVsZF8gOiAodWxvbmc/KSBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lIDogT25lb2ZGaWVsZE9uZW9mQ2FzZS5VaW50NjRGaWVsZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImludDMyX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBJbnQzMkZpZWxkRmllbGROdW1iZXIgPSAxNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ/PiBfb25lb2ZfaW50MzJGaWVsZF9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8aW50PigxMTQpOwotICAgIHB1YmxpYyBpbnQ/IEludDMyRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkludDMyRmllbGQgPyAoaW50Pykgb25lb2ZGaWVsZF8gOiAoaW50PykgbnVsbDsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb25lb2ZGaWVsZF8gPSB2YWx1ZTsKLSAgICAgICAgb25lb2ZGaWVsZENhc2VfID0gdmFsdWUgPT0gbnVsbCA/IE9uZW9mRmllbGRPbmVvZkNhc2UuTm9uZSA6IE9uZW9mRmllbGRPbmVvZkNhc2UuSW50MzJGaWVsZDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVpbnQzMl9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVWludDMyRmllbGRGaWVsZE51bWJlciA9IDE1OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHVpbnQ/PiBfb25lb2ZfdWludDMyRmllbGRfY29kZWMgPSBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPHVpbnQ+KDEyMik7Ci0gICAgcHVibGljIHVpbnQ/IFVpbnQzMkZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5VaW50MzJGaWVsZCA/ICh1aW50Pykgb25lb2ZGaWVsZF8gOiAodWludD8pIG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gdmFsdWU7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IHZhbHVlID09IG51bGwgPyBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUgOiBPbmVvZkZpZWxkT25lb2ZDYXNlLlVpbnQzMkZpZWxkOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYm9vbF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQm9vbEZpZWxkRmllbGROdW1iZXIgPSAxNjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxib29sPz4gX29uZW9mX2Jvb2xGaWVsZF9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8Ym9vbD4oMTMwKTsKLSAgICBwdWJsaWMgYm9vbD8gQm9vbEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Cb29sRmllbGQgPyAoYm9vbD8pIG9uZW9mRmllbGRfIDogKGJvb2w/KSBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvbmVvZkZpZWxkXyA9IHZhbHVlOwotICAgICAgICBvbmVvZkZpZWxkQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lIDogT25lb2ZGaWVsZE9uZW9mQ2FzZS5Cb29sRmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzdHJpbmdfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ0ZpZWxkRmllbGROdW1iZXIgPSAxNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxzdHJpbmc+IF9vbmVvZl9zdHJpbmdGaWVsZF9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxzdHJpbmc+KDEzOCk7Ci0gICAgcHVibGljIHN0cmluZyBTdHJpbmdGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuU3RyaW5nRmllbGQgPyAoc3RyaW5nKSBvbmVvZkZpZWxkXyA6IChzdHJpbmcpIG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gdmFsdWU7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IHZhbHVlID09IG51bGwgPyBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUgOiBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cmluZ0ZpZWxkOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYnl0ZXNfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEJ5dGVzRmllbGRGaWVsZE51bWJlciA9IDE4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHBiOjpCeXRlU3RyaW5nPiBfb25lb2ZfYnl0ZXNGaWVsZF9jb2RlYyA9IHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxwYjo6Qnl0ZVN0cmluZz4oMTQ2KTsKLSAgICBwdWJsaWMgcGI6OkJ5dGVTdHJpbmcgQnl0ZXNGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQnl0ZXNGaWVsZCA/IChwYjo6Qnl0ZVN0cmluZykgb25lb2ZGaWVsZF8gOiAocGI6OkJ5dGVTdHJpbmcpIG51bGw7IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mRmllbGRfID0gdmFsdWU7Ci0gICAgICAgIG9uZW9mRmllbGRDYXNlXyA9IHZhbHVlID09IG51bGwgPyBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmUgOiBPbmVvZkZpZWxkT25lb2ZDYXNlLkJ5dGVzRmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBvYmplY3Qgb25lb2ZGaWVsZF87Ci0gICAgLy8vIDxzdW1tYXJ5PkVudW0gb2YgcG9zc2libGUgY2FzZXMgZm9yIHRoZSAib25lb2ZfZmllbGQiIG9uZW9mLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZW51bSBPbmVvZkZpZWxkT25lb2ZDYXNlIHsKLSAgICAgIE5vbmUgPSAwLAotICAgICAgQW55RmllbGQgPSAxLAotICAgICAgQXBpRmllbGQgPSAyLAotICAgICAgRHVyYXRpb25GaWVsZCA9IDMsCi0gICAgICBFbXB0eUZpZWxkID0gNCwKLSAgICAgIEZpZWxkTWFza0ZpZWxkID0gNSwKLSAgICAgIFNvdXJjZUNvbnRleHRGaWVsZCA9IDYsCi0gICAgICBTdHJ1Y3RGaWVsZCA9IDcsCi0gICAgICBUaW1lc3RhbXBGaWVsZCA9IDgsCi0gICAgICBUeXBlRmllbGQgPSA5LAotICAgICAgRG91YmxlRmllbGQgPSAxMCwKLSAgICAgIEZsb2F0RmllbGQgPSAxMSwKLSAgICAgIEludDY0RmllbGQgPSAxMiwKLSAgICAgIFVpbnQ2NEZpZWxkID0gMTMsCi0gICAgICBJbnQzMkZpZWxkID0gMTQsCi0gICAgICBVaW50MzJGaWVsZCA9IDE1LAotICAgICAgQm9vbEZpZWxkID0gMTYsCi0gICAgICBTdHJpbmdGaWVsZCA9IDE3LAotICAgICAgQnl0ZXNGaWVsZCA9IDE4LAotICAgIH0KLSAgICBwcml2YXRlIE9uZW9mRmllbGRPbmVvZkNhc2Ugb25lb2ZGaWVsZENhc2VfID0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lOwotICAgIHB1YmxpYyBPbmVvZkZpZWxkT25lb2ZDYXNlIE9uZW9mRmllbGRDYXNlIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZkZpZWxkQ2FzZV87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBDbGVhck9uZW9mRmllbGQoKSB7Ci0gICAgICBvbmVvZkZpZWxkQ2FzZV8gPSBPbmVvZkZpZWxkT25lb2ZDYXNlLk5vbmU7Ci0gICAgICBvbmVvZkZpZWxkXyA9IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBPbmVvZldlbGxLbm93blR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoT25lb2ZXZWxsS25vd25UeXBlcyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoQW55RmllbGQsIG90aGVyLkFueUZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKEFwaUZpZWxkLCBvdGhlci5BcGlGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhEdXJhdGlvbkZpZWxkLCBvdGhlci5EdXJhdGlvbkZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKEVtcHR5RmllbGQsIG90aGVyLkVtcHR5RmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoRmllbGRNYXNrRmllbGQsIG90aGVyLkZpZWxkTWFza0ZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFNvdXJjZUNvbnRleHRGaWVsZCwgb3RoZXIuU291cmNlQ29udGV4dEZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFN0cnVjdEZpZWxkLCBvdGhlci5TdHJ1Y3RGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhUaW1lc3RhbXBGaWVsZCwgb3RoZXIuVGltZXN0YW1wRmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoVHlwZUZpZWxkLCBvdGhlci5UeXBlRmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRG91YmxlRmllbGQgIT0gb3RoZXIuRG91YmxlRmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChGbG9hdEZpZWxkICE9IG90aGVyLkZsb2F0RmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChJbnQ2NEZpZWxkICE9IG90aGVyLkludDY0RmllbGQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChVaW50NjRGaWVsZCAhPSBvdGhlci5VaW50NjRGaWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEludDMyRmllbGQgIT0gb3RoZXIuSW50MzJGaWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFVpbnQzMkZpZWxkICE9IG90aGVyLlVpbnQzMkZpZWxkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQm9vbEZpZWxkICE9IG90aGVyLkJvb2xGaWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFN0cmluZ0ZpZWxkICE9IG90aGVyLlN0cmluZ0ZpZWxkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQnl0ZXNGaWVsZCAhPSBvdGhlci5CeXRlc0ZpZWxkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoT25lb2ZGaWVsZENhc2UgIT0gb3RoZXIuT25lb2ZGaWVsZENhc2UpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQW55RmllbGQpIGhhc2ggXj0gQW55RmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5BcGlGaWVsZCkgaGFzaCBePSBBcGlGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkR1cmF0aW9uRmllbGQpIGhhc2ggXj0gRHVyYXRpb25GaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkVtcHR5RmllbGQpIGhhc2ggXj0gRW1wdHlGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkZpZWxkTWFza0ZpZWxkKSBoYXNoIF49IEZpZWxkTWFza0ZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuU291cmNlQ29udGV4dEZpZWxkKSBoYXNoIF49IFNvdXJjZUNvbnRleHRGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cnVjdEZpZWxkKSBoYXNoIF49IFN0cnVjdEZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuVGltZXN0YW1wRmllbGQpIGhhc2ggXj0gVGltZXN0YW1wRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5UeXBlRmllbGQpIGhhc2ggXj0gVHlwZUZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuRG91YmxlRmllbGQpIGhhc2ggXj0gRG91YmxlRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5GbG9hdEZpZWxkKSBoYXNoIF49IEZsb2F0RmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5JbnQ2NEZpZWxkKSBoYXNoIF49IEludDY0RmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5VaW50NjRGaWVsZCkgaGFzaCBePSBVaW50NjRGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkludDMyRmllbGQpIGhhc2ggXj0gSW50MzJGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlVpbnQzMkZpZWxkKSBoYXNoIF49IFVpbnQzMkZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQm9vbEZpZWxkKSBoYXNoIF49IEJvb2xGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cmluZ0ZpZWxkKSBoYXNoIF49IFN0cmluZ0ZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQnl0ZXNGaWVsZCkgaGFzaCBePSBCeXRlc0ZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IChpbnQpIG9uZW9mRmllbGRDYXNlXzsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkFueUZpZWxkKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoQW55RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkFwaUZpZWxkKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoQXBpRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkR1cmF0aW9uRmllbGQpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShEdXJhdGlvbkZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5FbXB0eUZpZWxkKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzNCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoRW1wdHlGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuRmllbGRNYXNrRmllbGQpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShGaWVsZE1hc2tGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuU291cmNlQ29udGV4dEZpZWxkKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg1MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU291cmNlQ29udGV4dEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5TdHJ1Y3RGaWVsZCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFN0cnVjdEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5UaW1lc3RhbXBGaWVsZCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFRpbWVzdGFtcEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5UeXBlRmllbGQpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDc0KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShUeXBlRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkRvdWJsZUZpZWxkKSB7Ci0gICAgICAgIF9vbmVvZl9kb3VibGVGaWVsZF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgKGRvdWJsZT8pIG9uZW9mRmllbGRfKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5GbG9hdEZpZWxkKSB7Ci0gICAgICAgIF9vbmVvZl9mbG9hdEZpZWxkX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCAoZmxvYXQ/KSBvbmVvZkZpZWxkXyk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuSW50NjRGaWVsZCkgewotICAgICAgICBfb25lb2ZfaW50NjRGaWVsZF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgKGxvbmc/KSBvbmVvZkZpZWxkXyk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuVWludDY0RmllbGQpIHsKLSAgICAgICAgX29uZW9mX3VpbnQ2NEZpZWxkX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCAodWxvbmc/KSBvbmVvZkZpZWxkXyk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuSW50MzJGaWVsZCkgewotICAgICAgICBfb25lb2ZfaW50MzJGaWVsZF9jb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlKG91dHB1dCwgKGludD8pIG9uZW9mRmllbGRfKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5VaW50MzJGaWVsZCkgewotICAgICAgICBfb25lb2ZfdWludDMyRmllbGRfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsICh1aW50Pykgb25lb2ZGaWVsZF8pOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkJvb2xGaWVsZCkgewotICAgICAgICBfb25lb2ZfYm9vbEZpZWxkX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCAoYm9vbD8pIG9uZW9mRmllbGRfKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5TdHJpbmdGaWVsZCkgewotICAgICAgICBfb25lb2Zfc3RyaW5nRmllbGRfY29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIChzdHJpbmcpIG9uZW9mRmllbGRfKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5CeXRlc0ZpZWxkKSB7Ci0gICAgICAgIF9vbmVvZl9ieXRlc0ZpZWxkX2NvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCAocGI6OkJ5dGVTdHJpbmcpIG9uZW9mRmllbGRfKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQW55RmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShBbnlGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQXBpRmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShBcGlGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuRHVyYXRpb25GaWVsZCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKER1cmF0aW9uRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkVtcHR5RmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShFbXB0eUZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5GaWVsZE1hc2tGaWVsZCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKEZpZWxkTWFza0ZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5Tb3VyY2VDb250ZXh0RmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShTb3VyY2VDb250ZXh0RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cnVjdEZpZWxkKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoU3RydWN0RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlRpbWVzdGFtcEZpZWxkKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoVGltZXN0YW1wRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlR5cGVGaWVsZCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFR5cGVGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuRG91YmxlRmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSBfb25lb2ZfZG91YmxlRmllbGRfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoRG91YmxlRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkZsb2F0RmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSBfb25lb2ZfZmxvYXRGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhGbG9hdEZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5JbnQ2NEZpZWxkKSB7Ci0gICAgICAgIHNpemUgKz0gX29uZW9mX2ludDY0RmllbGRfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoSW50NjRGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuVWludDY0RmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSBfb25lb2ZfdWludDY0RmllbGRfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoVWludDY0RmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkludDMyRmllbGQpIHsKLSAgICAgICAgc2l6ZSArPSBfb25lb2ZfaW50MzJGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhJbnQzMkZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5VaW50MzJGaWVsZCkgewotICAgICAgICBzaXplICs9IF9vbmVvZl91aW50MzJGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhVaW50MzJGaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQm9vbEZpZWxkKSB7Ci0gICAgICAgIHNpemUgKz0gX29uZW9mX2Jvb2xGaWVsZF9jb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyhCb29sRmllbGQpOwotICAgICAgfQotICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cmluZ0ZpZWxkKSB7Ci0gICAgICAgIHNpemUgKz0gX29uZW9mX3N0cmluZ0ZpZWxkX2NvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKFN0cmluZ0ZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5CeXRlc0ZpZWxkKSB7Ci0gICAgICAgIHNpemUgKz0gX29uZW9mX2J5dGVzRmllbGRfY29kZWMuQ2FsY3VsYXRlU2l6ZVdpdGhUYWcoQnl0ZXNGaWVsZCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oT25lb2ZXZWxsS25vd25UeXBlcyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgc3dpdGNoIChvdGhlci5PbmVvZkZpZWxkQ2FzZSkgewotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuQW55RmllbGQ6Ci0gICAgICAgICAgQW55RmllbGQgPSBvdGhlci5BbnlGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLkFwaUZpZWxkOgotICAgICAgICAgIEFwaUZpZWxkID0gb3RoZXIuQXBpRmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5EdXJhdGlvbkZpZWxkOgotICAgICAgICAgIER1cmF0aW9uRmllbGQgPSBvdGhlci5EdXJhdGlvbkZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuRW1wdHlGaWVsZDoKLSAgICAgICAgICBFbXB0eUZpZWxkID0gb3RoZXIuRW1wdHlGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLkZpZWxkTWFza0ZpZWxkOgotICAgICAgICAgIEZpZWxkTWFza0ZpZWxkID0gb3RoZXIuRmllbGRNYXNrRmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5Tb3VyY2VDb250ZXh0RmllbGQ6Ci0gICAgICAgICAgU291cmNlQ29udGV4dEZpZWxkID0gb3RoZXIuU291cmNlQ29udGV4dEZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuU3RydWN0RmllbGQ6Ci0gICAgICAgICAgU3RydWN0RmllbGQgPSBvdGhlci5TdHJ1Y3RGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLlRpbWVzdGFtcEZpZWxkOgotICAgICAgICAgIFRpbWVzdGFtcEZpZWxkID0gb3RoZXIuVGltZXN0YW1wRmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5UeXBlRmllbGQ6Ci0gICAgICAgICAgVHlwZUZpZWxkID0gb3RoZXIuVHlwZUZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuRG91YmxlRmllbGQ6Ci0gICAgICAgICAgRG91YmxlRmllbGQgPSBvdGhlci5Eb3VibGVGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLkZsb2F0RmllbGQ6Ci0gICAgICAgICAgRmxvYXRGaWVsZCA9IG90aGVyLkZsb2F0RmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5JbnQ2NEZpZWxkOgotICAgICAgICAgIEludDY0RmllbGQgPSBvdGhlci5JbnQ2NEZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuVWludDY0RmllbGQ6Ci0gICAgICAgICAgVWludDY0RmllbGQgPSBvdGhlci5VaW50NjRGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLkludDMyRmllbGQ6Ci0gICAgICAgICAgSW50MzJGaWVsZCA9IG90aGVyLkludDMyRmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5VaW50MzJGaWVsZDoKLSAgICAgICAgICBVaW50MzJGaWVsZCA9IG90aGVyLlVpbnQzMkZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIE9uZW9mRmllbGRPbmVvZkNhc2UuQm9vbEZpZWxkOgotICAgICAgICAgIEJvb2xGaWVsZCA9IG90aGVyLkJvb2xGaWVsZDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cmluZ0ZpZWxkOgotICAgICAgICAgIFN0cmluZ0ZpZWxkID0gb3RoZXIuU3RyaW5nRmllbGQ7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgT25lb2ZGaWVsZE9uZW9mQ2FzZS5CeXRlc0ZpZWxkOgotICAgICAgICAgIEJ5dGVzRmllbGQgPSBvdGhlci5CeXRlc0ZpZWxkOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55IHN1YkJ1aWxkZXIgPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55KCk7Ci0gICAgICAgICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQW55RmllbGQpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oQW55RmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlcik7Ci0gICAgICAgICAgICBBbnlGaWVsZCA9IHN1YkJ1aWxkZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpIHN1YkJ1aWxkZXIgPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpKCk7Ci0gICAgICAgICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuQXBpRmllbGQpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oQXBpRmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlcik7Ci0gICAgICAgICAgICBBcGlGaWVsZCA9IHN1YkJ1aWxkZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjogewotICAgICAgICAgICAgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24gc3ViQnVpbGRlciA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbigpOwotICAgICAgICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLkR1cmF0aW9uRmllbGQpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oRHVyYXRpb25GaWVsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyKTsKLSAgICAgICAgICAgIER1cmF0aW9uRmllbGQgPSBzdWJCdWlsZGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzQ6IHsKLSAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5IHN1YkJ1aWxkZXIgPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHkoKTsKLSAgICAgICAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5FbXB0eUZpZWxkKSB7Ci0gICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKEVtcHR5RmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlcik7Ci0gICAgICAgICAgICBFbXB0eUZpZWxkID0gc3ViQnVpbGRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQyOiB7Ci0gICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2sgc3ViQnVpbGRlciA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2soKTsKLSAgICAgICAgICAgIGlmIChvbmVvZkZpZWxkQ2FzZV8gPT0gT25lb2ZGaWVsZE9uZW9mQ2FzZS5GaWVsZE1hc2tGaWVsZCkgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShGaWVsZE1hc2tGaWVsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyKTsKLSAgICAgICAgICAgIEZpZWxkTWFza0ZpZWxkID0gc3ViQnVpbGRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOiB7Ci0gICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0IHN1YkJ1aWxkZXIgPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCgpOwotICAgICAgICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlNvdXJjZUNvbnRleHRGaWVsZCkgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShTb3VyY2VDb250ZXh0RmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc3ViQnVpbGRlcik7Ci0gICAgICAgICAgICBTb3VyY2VDb250ZXh0RmllbGQgPSBzdWJCdWlsZGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTg6IHsKLSAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdCBzdWJCdWlsZGVyID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdCgpOwotICAgICAgICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlN0cnVjdEZpZWxkKSB7Ci0gICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFN0cnVjdEZpZWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIpOwotICAgICAgICAgICAgU3RydWN0RmllbGQgPSBzdWJCdWlsZGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjY6IHsKLSAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCBzdWJCdWlsZGVyID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcCgpOwotICAgICAgICAgICAgaWYgKG9uZW9mRmllbGRDYXNlXyA9PSBPbmVvZkZpZWxkT25lb2ZDYXNlLlRpbWVzdGFtcEZpZWxkKSB7Ci0gICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFRpbWVzdGFtcEZpZWxkKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIpOwotICAgICAgICAgICAgVGltZXN0YW1wRmllbGQgPSBzdWJCdWlsZGVyOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzQ6IHsKLSAgICAgICAgICAgIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGUgc3ViQnVpbGRlciA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlKCk7Ci0gICAgICAgICAgICBpZiAob25lb2ZGaWVsZENhc2VfID09IE9uZW9mRmllbGRPbmVvZkNhc2UuVHlwZUZpZWxkKSB7Ci0gICAgICAgICAgICAgIHN1YkJ1aWxkZXIuTWVyZ2VGcm9tKFR5cGVGaWVsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyKTsKLSAgICAgICAgICAgIFR5cGVGaWVsZCA9IHN1YkJ1aWxkZXI7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MjogewotICAgICAgICAgICAgRG91YmxlRmllbGQgPSBfb25lb2ZfZG91YmxlRmllbGRfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgRmxvYXRGaWVsZCA9IF9vbmVvZl9mbG9hdEZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgOTg6IHsKLSAgICAgICAgICAgIEludDY0RmllbGQgPSBfb25lb2ZfaW50NjRGaWVsZF9jb2RlYy5SZWFkKGlucHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEwNjogewotICAgICAgICAgICAgVWludDY0RmllbGQgPSBfb25lb2ZfdWludDY0RmllbGRfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMTQ6IHsKLSAgICAgICAgICAgIEludDMyRmllbGQgPSBfb25lb2ZfaW50MzJGaWVsZF9jb2RlYy5SZWFkKGlucHV0KTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEyMjogewotICAgICAgICAgICAgVWludDMyRmllbGQgPSBfb25lb2ZfdWludDMyRmllbGRfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMzA6IHsKLSAgICAgICAgICAgIEJvb2xGaWVsZCA9IF9vbmVvZl9ib29sRmllbGRfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMzg6IHsKLSAgICAgICAgICAgIFN0cmluZ0ZpZWxkID0gX29uZW9mX3N0cmluZ0ZpZWxkX2NvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTQ2OiB7Ci0gICAgICAgICAgICBCeXRlc0ZpZWxkID0gX29uZW9mX2J5dGVzRmllbGRfY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBBIG1hcCBmaWVsZCBmb3IgZWFjaCB3ZWxsLWtub3duIHR5cGUuIFdlIG9ubHkKLSAgLy8vICBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoZSB2YWx1ZSBwYXJ0IG9mIHRoZSBtYXAgYmVpbmcgdGhlCi0gIC8vLyAgd2VsbC1rbm93biB0eXBlcywgYXMgbWVzc2FnZXMgY2FuJ3QgYmUgbWFwIGtleXMuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBNYXBXZWxsS25vd25UeXBlcyA6IHBiOjpJTWVzc2FnZTxNYXBXZWxsS25vd25UeXBlcz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE1hcFdlbGxLbm93blR5cGVzPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE1hcFdlbGxLbm93blR5cGVzPigoKSA9PiBuZXcgTWFwV2VsbEtub3duVHlwZXMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxNYXBXZWxsS25vd25UeXBlcz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3MuVW5pdHRlc3RXZWxsS25vd25UeXBlc1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbM107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIE1hcFdlbGxLbm93blR5cGVzKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBNYXBXZWxsS25vd25UeXBlcyhNYXBXZWxsS25vd25UeXBlcyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgYW55RmllbGRfID0gb3RoZXIuYW55RmllbGRfLkNsb25lKCk7Ci0gICAgICBhcGlGaWVsZF8gPSBvdGhlci5hcGlGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGR1cmF0aW9uRmllbGRfID0gb3RoZXIuZHVyYXRpb25GaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGVtcHR5RmllbGRfID0gb3RoZXIuZW1wdHlGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGZpZWxkTWFza0ZpZWxkXyA9IG90aGVyLmZpZWxkTWFza0ZpZWxkXy5DbG9uZSgpOwotICAgICAgc291cmNlQ29udGV4dEZpZWxkXyA9IG90aGVyLnNvdXJjZUNvbnRleHRGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHN0cnVjdEZpZWxkXyA9IG90aGVyLnN0cnVjdEZpZWxkXy5DbG9uZSgpOwotICAgICAgdGltZXN0YW1wRmllbGRfID0gb3RoZXIudGltZXN0YW1wRmllbGRfLkNsb25lKCk7Ci0gICAgICB0eXBlRmllbGRfID0gb3RoZXIudHlwZUZpZWxkXy5DbG9uZSgpOwotICAgICAgZG91YmxlRmllbGRfID0gb3RoZXIuZG91YmxlRmllbGRfLkNsb25lKCk7Ci0gICAgICBmbG9hdEZpZWxkXyA9IG90aGVyLmZsb2F0RmllbGRfLkNsb25lKCk7Ci0gICAgICBpbnQ2NEZpZWxkXyA9IG90aGVyLmludDY0RmllbGRfLkNsb25lKCk7Ci0gICAgICB1aW50NjRGaWVsZF8gPSBvdGhlci51aW50NjRGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIGludDMyRmllbGRfID0gb3RoZXIuaW50MzJGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHVpbnQzMkZpZWxkXyA9IG90aGVyLnVpbnQzMkZpZWxkXy5DbG9uZSgpOwotICAgICAgYm9vbEZpZWxkXyA9IG90aGVyLmJvb2xGaWVsZF8uQ2xvbmUoKTsKLSAgICAgIHN0cmluZ0ZpZWxkXyA9IG90aGVyLnN0cmluZ0ZpZWxkXy5DbG9uZSgpOwotICAgICAgYnl0ZXNGaWVsZF8gPSBvdGhlci5ieXRlc0ZpZWxkXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNYXBXZWxsS25vd25UeXBlcyBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgTWFwV2VsbEtub3duVHlwZXModGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJhbnlfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEFueUZpZWxkRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Bbnk+LkNvZGVjIF9tYXBfYW55RmllbGRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueT4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueS5QYXJzZXIpLCAxMCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55PiBhbnlGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueT4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueT4gQW55RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIGFueUZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYXBpX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBBcGlGaWVsZEZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpPi5Db2RlYyBfbWFwX2FwaUZpZWxkX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGk+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGkuUGFyc2VyKSwgMTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFwaT4gYXBpRmllbGRfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGk+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BcGk+IEFwaUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBhcGlGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImR1cmF0aW9uX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEdXJhdGlvbkZpZWxkRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbj4uQ29kZWMgX21hcF9kdXJhdGlvbkZpZWxkX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbj4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uLlBhcnNlciksIDI2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbj4gZHVyYXRpb25GaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkR1cmF0aW9uPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24+IER1cmF0aW9uRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIGR1cmF0aW9uRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJlbXB0eV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRW1wdHlGaWVsZEZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHk+LkNvZGVjIF9tYXBfZW1wdHlGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHk+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbXB0eS5QYXJzZXIpLCAzNCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW1wdHk+IGVtcHR5RmllbGRfID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbXB0eT4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5PiBFbXB0eUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBlbXB0eUZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZmllbGRfbWFza19maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGRNYXNrRmllbGRGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkTWFzaz4uQ29kZWMgX21hcF9maWVsZE1hc2tGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgxOCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrLlBhcnNlciksIDQyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2s+IGZpZWxkTWFza0ZpZWxkXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrPigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrPiBGaWVsZE1hc2tGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGRNYXNrRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzb3VyY2VfY29udGV4dF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU291cmNlQ29udGV4dEZpZWxkRmllbGROdW1iZXIgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0Pi5Db2RlYyBfbWFwX3NvdXJjZUNvbnRleHRGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQuUGFyc2VyKSwgNTApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQ+IHNvdXJjZUNvbnRleHRGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQ+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0PiBTb3VyY2VDb250ZXh0RmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHNvdXJjZUNvbnRleHRGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInN0cnVjdF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU3RydWN0RmllbGRGaWVsZE51bWJlciA9IDc7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdD4uQ29kZWMgX21hcF9zdHJ1Y3RGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgxOCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0LlBhcnNlciksIDU4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3Q+IHN0cnVjdEZpZWxkXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0PiBTdHJ1Y3RGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc3RydWN0RmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ0aW1lc3RhbXBfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFRpbWVzdGFtcEZpZWxkRmllbGROdW1iZXIgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXA+LkNvZGVjIF9tYXBfdGltZXN0YW1wRmllbGRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcD4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcC5QYXJzZXIpLCA2Nik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wPiB0aW1lc3RhbXBGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcD4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlRpbWVzdGFtcD4gVGltZXN0YW1wRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHRpbWVzdGFtcEZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidHlwZV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVHlwZUZpZWxkRmllbGROdW1iZXIgPSA5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlPi5Db2RlYyBfbWFwX3R5cGVGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZT4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGUuUGFyc2VyKSwgNzQpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGU+IHR5cGVGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGU+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlPiBUeXBlRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRvdWJsZV9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRG91YmxlRmllbGRGaWVsZE51bWJlciA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBkb3VibGU/Pi5Db2RlYyBfbWFwX2RvdWJsZUZpZWxkX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBkb3VibGU/Pi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4KSwgcGI6OkZpZWxkQ29kZWMuRm9yU3RydWN0V3JhcHBlcjxkb3VibGU+KDE4KSwgODIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGRvdWJsZT8+IGRvdWJsZUZpZWxkXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgZG91YmxlPz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGRvdWJsZT8+IERvdWJsZUZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBkb3VibGVGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZsb2F0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBGbG9hdEZpZWxkRmllbGROdW1iZXIgPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgZmxvYXQ/Pi5Db2RlYyBfbWFwX2Zsb2F0RmllbGRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGZsb2F0Pz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8ZmxvYXQ+KDE4KSwgOTApOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGZsb2F0Pz4gZmxvYXRGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGZsb2F0Pz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIGZsb2F0Pz4gRmxvYXRGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmxvYXRGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImludDY0X2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBJbnQ2NEZpZWxkRmllbGROdW1iZXIgPSAxMjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgbG9uZz8+LkNvZGVjIF9tYXBfaW50NjRGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgbG9uZz8+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGxvbmc+KDE4KSwgOTgpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGxvbmc/PiBpbnQ2NEZpZWxkXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgbG9uZz8+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBsb25nPz4gSW50NjRGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gaW50NjRGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVpbnQ2NF9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVWludDY0RmllbGRGaWVsZE51bWJlciA9IDEzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCB1bG9uZz8+LkNvZGVjIF9tYXBfdWludDY0RmllbGRfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIHVsb25nPz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8dWxvbmc+KDE4KSwgMTA2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCB1bG9uZz8+IHVpbnQ2NEZpZWxkXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgdWxvbmc/PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgdWxvbmc/PiBVaW50NjRGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gdWludDY0RmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJpbnQzMl9maWVsZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSW50MzJGaWVsZEZpZWxkTnVtYmVyID0gMTQ7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGludD8+LkNvZGVjIF9tYXBfaW50MzJGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgaW50Pz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8aW50PigxOCksIDExNCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgaW50Pz4gaW50MzJGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIGludD8+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBpbnQ/PiBJbnQzMkZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBpbnQzMkZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidWludDMyX2ZpZWxkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVaW50MzJGaWVsZEZpZWxkTnVtYmVyID0gMTU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIHVpbnQ/Pi5Db2RlYyBfbWFwX3VpbnQzMkZpZWxkX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCB1aW50Pz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvclN0cnVjdFdyYXBwZXI8dWludD4oMTgpLCAxMjIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIHVpbnQ/PiB1aW50MzJGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIHVpbnQ/PigpOwotICAgIHB1YmxpYyBwYmM6Ok1hcEZpZWxkPGludCwgdWludD8+IFVpbnQzMkZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiB1aW50MzJGaWVsZF87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImJvb2xfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEJvb2xGaWVsZEZpZWxkTnVtYmVyID0gMTY7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIGJvb2w/Pi5Db2RlYyBfbWFwX2Jvb2xGaWVsZF9jb2RlYwotICAgICAgICA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgYm9vbD8+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JTdHJ1Y3RXcmFwcGVyPGJvb2w+KDE4KSwgMTMwKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBib29sPz4gYm9vbEZpZWxkXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgYm9vbD8+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBib29sPz4gQm9vbEZpZWxkIHsKLSAgICAgIGdldCB7IHJldHVybiBib29sRmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzdHJpbmdfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ0ZpZWxkRmllbGROdW1iZXIgPSAxNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgc3RyaW5nPi5Db2RlYyBfbWFwX3N0cmluZ0ZpZWxkX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBzdHJpbmc+LkNvZGVjKHBiOjpGaWVsZENvZGVjLkZvckludDMyKDgpLCBwYjo6RmllbGRDb2RlYy5Gb3JDbGFzc1dyYXBwZXI8c3RyaW5nPigxOCksIDEzOCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPGludCwgc3RyaW5nPiBzdHJpbmdGaWVsZF8gPSBuZXcgcGJjOjpNYXBGaWVsZDxpbnQsIHN0cmluZz4oKTsKLSAgICBwdWJsaWMgcGJjOjpNYXBGaWVsZDxpbnQsIHN0cmluZz4gU3RyaW5nRmllbGQgewotICAgICAgZ2V0IHsgcmV0dXJuIHN0cmluZ0ZpZWxkXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYnl0ZXNfZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEJ5dGVzRmllbGRGaWVsZE51bWJlciA9IDE4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8aW50LCBwYjo6Qnl0ZVN0cmluZz4uQ29kZWMgX21hcF9ieXRlc0ZpZWxkX2NvZGVjCi0gICAgICAgID0gbmV3IHBiYzo6TWFwRmllbGQ8aW50LCBwYjo6Qnl0ZVN0cmluZz4uQ29kZWMocGI6OkZpZWxkQ29kZWMuRm9ySW50MzIoOCksIHBiOjpGaWVsZENvZGVjLkZvckNsYXNzV3JhcHBlcjxwYjo6Qnl0ZVN0cmluZz4oMTgpLCAxNDYpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpNYXBGaWVsZDxpbnQsIHBiOjpCeXRlU3RyaW5nPiBieXRlc0ZpZWxkXyA9IG5ldyBwYmM6Ok1hcEZpZWxkPGludCwgcGI6OkJ5dGVTdHJpbmc+KCk7Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8aW50LCBwYjo6Qnl0ZVN0cmluZz4gQnl0ZXNGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gYnl0ZXNGaWVsZF87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE1hcFdlbGxLbm93blR5cGVzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoTWFwV2VsbEtub3duVHlwZXMgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCFBbnlGaWVsZC5FcXVhbHMob3RoZXIuQW55RmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIUFwaUZpZWxkLkVxdWFscyhvdGhlci5BcGlGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghRHVyYXRpb25GaWVsZC5FcXVhbHMob3RoZXIuRHVyYXRpb25GaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghRW1wdHlGaWVsZC5FcXVhbHMob3RoZXIuRW1wdHlGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghRmllbGRNYXNrRmllbGQuRXF1YWxzKG90aGVyLkZpZWxkTWFza0ZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFTb3VyY2VDb250ZXh0RmllbGQuRXF1YWxzKG90aGVyLlNvdXJjZUNvbnRleHRGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghU3RydWN0RmllbGQuRXF1YWxzKG90aGVyLlN0cnVjdEZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFUaW1lc3RhbXBGaWVsZC5FcXVhbHMob3RoZXIuVGltZXN0YW1wRmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIVR5cGVGaWVsZC5FcXVhbHMob3RoZXIuVHlwZUZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFEb3VibGVGaWVsZC5FcXVhbHMob3RoZXIuRG91YmxlRmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIUZsb2F0RmllbGQuRXF1YWxzKG90aGVyLkZsb2F0RmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIUludDY0RmllbGQuRXF1YWxzKG90aGVyLkludDY0RmllbGQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIVVpbnQ2NEZpZWxkLkVxdWFscyhvdGhlci5VaW50NjRGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghSW50MzJGaWVsZC5FcXVhbHMob3RoZXIuSW50MzJGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghVWludDMyRmllbGQuRXF1YWxzKG90aGVyLlVpbnQzMkZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFCb29sRmllbGQuRXF1YWxzKG90aGVyLkJvb2xGaWVsZCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghU3RyaW5nRmllbGQuRXF1YWxzKG90aGVyLlN0cmluZ0ZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFCeXRlc0ZpZWxkLkVxdWFscyhvdGhlci5CeXRlc0ZpZWxkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGhhc2ggXj0gQW55RmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gQXBpRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gRHVyYXRpb25GaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBFbXB0eUZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IEZpZWxkTWFza0ZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IFNvdXJjZUNvbnRleHRGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBTdHJ1Y3RGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBUaW1lc3RhbXBGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBUeXBlRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gRG91YmxlRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gRmxvYXRGaWVsZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBJbnQ2NEZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IFVpbnQ2NEZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IEludDMyRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gVWludDMyRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gQm9vbEZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IFN0cmluZ0ZpZWxkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IEJ5dGVzRmllbGQuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgYW55RmllbGRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX2FueUZpZWxkX2NvZGVjKTsKLSAgICAgIGFwaUZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9hcGlGaWVsZF9jb2RlYyk7Ci0gICAgICBkdXJhdGlvbkZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9kdXJhdGlvbkZpZWxkX2NvZGVjKTsKLSAgICAgIGVtcHR5RmllbGRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX2VtcHR5RmllbGRfY29kZWMpOwotICAgICAgZmllbGRNYXNrRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX2ZpZWxkTWFza0ZpZWxkX2NvZGVjKTsKLSAgICAgIHNvdXJjZUNvbnRleHRGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfc291cmNlQ29udGV4dEZpZWxkX2NvZGVjKTsKLSAgICAgIHN0cnVjdEZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9zdHJ1Y3RGaWVsZF9jb2RlYyk7Ci0gICAgICB0aW1lc3RhbXBGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfdGltZXN0YW1wRmllbGRfY29kZWMpOwotICAgICAgdHlwZUZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX21hcF90eXBlRmllbGRfY29kZWMpOwotICAgICAgZG91YmxlRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX2RvdWJsZUZpZWxkX2NvZGVjKTsKLSAgICAgIGZsb2F0RmllbGRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX2Zsb2F0RmllbGRfY29kZWMpOwotICAgICAgaW50NjRGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfaW50NjRGaWVsZF9jb2RlYyk7Ci0gICAgICB1aW50NjRGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfdWludDY0RmllbGRfY29kZWMpOwotICAgICAgaW50MzJGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfaW50MzJGaWVsZF9jb2RlYyk7Ci0gICAgICB1aW50MzJGaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9tYXBfdWludDMyRmllbGRfY29kZWMpOwotICAgICAgYm9vbEZpZWxkXy5Xcml0ZVRvKG91dHB1dCwgX21hcF9ib29sRmllbGRfY29kZWMpOwotICAgICAgc3RyaW5nRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX3N0cmluZ0ZpZWxkX2NvZGVjKTsKLSAgICAgIGJ5dGVzRmllbGRfLldyaXRlVG8ob3V0cHV0LCBfbWFwX2J5dGVzRmllbGRfY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHNpemUgKz0gYW55RmllbGRfLkNhbGN1bGF0ZVNpemUoX21hcF9hbnlGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IGFwaUZpZWxkXy5DYWxjdWxhdGVTaXplKF9tYXBfYXBpRmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSBkdXJhdGlvbkZpZWxkXy5DYWxjdWxhdGVTaXplKF9tYXBfZHVyYXRpb25GaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IGVtcHR5RmllbGRfLkNhbGN1bGF0ZVNpemUoX21hcF9lbXB0eUZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gZmllbGRNYXNrRmllbGRfLkNhbGN1bGF0ZVNpemUoX21hcF9maWVsZE1hc2tGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHNvdXJjZUNvbnRleHRGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfbWFwX3NvdXJjZUNvbnRleHRGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IHN0cnVjdEZpZWxkXy5DYWxjdWxhdGVTaXplKF9tYXBfc3RydWN0RmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSB0aW1lc3RhbXBGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfbWFwX3RpbWVzdGFtcEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gdHlwZUZpZWxkXy5DYWxjdWxhdGVTaXplKF9tYXBfdHlwZUZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gZG91YmxlRmllbGRfLkNhbGN1bGF0ZVNpemUoX21hcF9kb3VibGVGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IGZsb2F0RmllbGRfLkNhbGN1bGF0ZVNpemUoX21hcF9mbG9hdEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gaW50NjRGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfbWFwX2ludDY0RmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSB1aW50NjRGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfbWFwX3VpbnQ2NEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gaW50MzJGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfbWFwX2ludDMyRmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSB1aW50MzJGaWVsZF8uQ2FsY3VsYXRlU2l6ZShfbWFwX3VpbnQzMkZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gYm9vbEZpZWxkXy5DYWxjdWxhdGVTaXplKF9tYXBfYm9vbEZpZWxkX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gc3RyaW5nRmllbGRfLkNhbGN1bGF0ZVNpemUoX21hcF9zdHJpbmdGaWVsZF9jb2RlYyk7Ci0gICAgICBzaXplICs9IGJ5dGVzRmllbGRfLkNhbGN1bGF0ZVNpemUoX21hcF9ieXRlc0ZpZWxkX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShNYXBXZWxsS25vd25UeXBlcyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgYW55RmllbGRfLkFkZChvdGhlci5hbnlGaWVsZF8pOwotICAgICAgYXBpRmllbGRfLkFkZChvdGhlci5hcGlGaWVsZF8pOwotICAgICAgZHVyYXRpb25GaWVsZF8uQWRkKG90aGVyLmR1cmF0aW9uRmllbGRfKTsKLSAgICAgIGVtcHR5RmllbGRfLkFkZChvdGhlci5lbXB0eUZpZWxkXyk7Ci0gICAgICBmaWVsZE1hc2tGaWVsZF8uQWRkKG90aGVyLmZpZWxkTWFza0ZpZWxkXyk7Ci0gICAgICBzb3VyY2VDb250ZXh0RmllbGRfLkFkZChvdGhlci5zb3VyY2VDb250ZXh0RmllbGRfKTsKLSAgICAgIHN0cnVjdEZpZWxkXy5BZGQob3RoZXIuc3RydWN0RmllbGRfKTsKLSAgICAgIHRpbWVzdGFtcEZpZWxkXy5BZGQob3RoZXIudGltZXN0YW1wRmllbGRfKTsKLSAgICAgIHR5cGVGaWVsZF8uQWRkKG90aGVyLnR5cGVGaWVsZF8pOwotICAgICAgZG91YmxlRmllbGRfLkFkZChvdGhlci5kb3VibGVGaWVsZF8pOwotICAgICAgZmxvYXRGaWVsZF8uQWRkKG90aGVyLmZsb2F0RmllbGRfKTsKLSAgICAgIGludDY0RmllbGRfLkFkZChvdGhlci5pbnQ2NEZpZWxkXyk7Ci0gICAgICB1aW50NjRGaWVsZF8uQWRkKG90aGVyLnVpbnQ2NEZpZWxkXyk7Ci0gICAgICBpbnQzMkZpZWxkXy5BZGQob3RoZXIuaW50MzJGaWVsZF8pOwotICAgICAgdWludDMyRmllbGRfLkFkZChvdGhlci51aW50MzJGaWVsZF8pOwotICAgICAgYm9vbEZpZWxkXy5BZGQob3RoZXIuYm9vbEZpZWxkXyk7Ci0gICAgICBzdHJpbmdGaWVsZF8uQWRkKG90aGVyLnN0cmluZ0ZpZWxkXyk7Ci0gICAgICBieXRlc0ZpZWxkXy5BZGQob3RoZXIuYnl0ZXNGaWVsZF8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGFueUZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9hbnlGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgYXBpRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX2FwaUZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI2OiB7Ci0gICAgICAgICAgICBkdXJhdGlvbkZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9kdXJhdGlvbkZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDM0OiB7Ci0gICAgICAgICAgICBlbXB0eUZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9lbXB0eUZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQyOiB7Ci0gICAgICAgICAgICBmaWVsZE1hc2tGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfZmllbGRNYXNrRmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTA6IHsKLSAgICAgICAgICAgIHNvdXJjZUNvbnRleHRGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfc291cmNlQ29udGV4dEZpZWxkX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDU4OiB7Ci0gICAgICAgICAgICBzdHJ1Y3RGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfc3RydWN0RmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjY6IHsKLSAgICAgICAgICAgIHRpbWVzdGFtcEZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF90aW1lc3RhbXBGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NDogewotICAgICAgICAgICAgdHlwZUZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF90eXBlRmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgODI6IHsKLSAgICAgICAgICAgIGRvdWJsZUZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9kb3VibGVGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgZmxvYXRGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfZmxvYXRGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5ODogewotICAgICAgICAgICAgaW50NjRGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfaW50NjRGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMDY6IHsKLSAgICAgICAgICAgIHVpbnQ2NEZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF91aW50NjRGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMTQ6IHsKLSAgICAgICAgICAgIGludDMyRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX2ludDMyRmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTIyOiB7Ci0gICAgICAgICAgICB1aW50MzJGaWVsZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9tYXBfdWludDMyRmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTMwOiB7Ci0gICAgICAgICAgICBib29sRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX2Jvb2xGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxMzg6IHsKLSAgICAgICAgICAgIHN0cmluZ0ZpZWxkXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9zdHJpbmdGaWVsZF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNDY6IHsKLSAgICAgICAgICAgIGJ5dGVzRmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfbWFwX2J5dGVzRmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLX0KLQotI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9XZWxsS25vd25UeXBlcy9BbnlUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9XZWxsS25vd25UeXBlcy9BbnlUZXN0LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjFiZTdkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvV2VsbEtub3duVHlwZXMvQW55VGVzdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBHb29nbGUuUHJvdG9idWYuVGVzdFByb3RvczsKLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcwotewotICAgIHB1YmxpYyBjbGFzcyBBbnlUZXN0Ci0gICAgewotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUGFjaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgdmFyIGFueSA9IEFueS5QYWNrKG1lc3NhZ2UpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ0eXBlLmdvb2dsZWFwaXMuY29tL3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIsIGFueS5UeXBlVXJsKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLkNhbGN1bGF0ZVNpemUoKSwgYW55LlZhbHVlLkxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUGFja19XaXRoQ3VzdG9tUHJlZml4KCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgYW55ID0gQW55LlBhY2sobWVzc2FnZSwgImZvby5iYXIvYmF6Iik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoImZvby5iYXIvYmF6L3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIsIGFueS5UeXBlVXJsKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLkNhbGN1bGF0ZVNpemUoKSwgYW55LlZhbHVlLkxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUGFja19XaXRoQ3VzdG9tUHJlZml4VHJhaWxpbmdTbGFzaCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgdmFyIGFueSA9IEFueS5QYWNrKG1lc3NhZ2UsICJmb28uYmFyL2Jhei8iKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiZm9vLmJhci9iYXovcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiwgYW55LlR5cGVVcmwpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UuQ2FsY3VsYXRlU2l6ZSgpLCBhbnkuVmFsdWUuTGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBVbnBhY2tfV3JvbmdUeXBlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgYW55ID0gQW55LlBhY2sobWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbj4oKCkgPT4gYW55LlVucGFjazxUZXN0T25lb2Y+KCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFVucGFja19TdWNjZXNzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgYW55ID0gQW55LlBhY2sobWVzc2FnZSk7Ci0gICAgICAgICAgICB2YXIgdW5wYWNrZWQgPSBhbnkuVW5wYWNrPFRlc3RBbGxUeXBlcz4oKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCB1bnBhY2tlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVW5wYWNrX0N1c3RvbVByZWZpeF9TdWNjZXNzKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBTYW1wbGVNZXNzYWdlcy5DcmVhdGVGdWxsVGVzdEFsbFR5cGVzKCk7Ci0gICAgICAgICAgICB2YXIgYW55ID0gQW55LlBhY2sobWVzc2FnZSwgImZvby5iYXIvYmF6Iik7Ci0gICAgICAgICAgICB2YXIgdW5wYWNrZWQgPSBhbnkuVW5wYWNrPFRlc3RBbGxUeXBlcz4oKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCB1bnBhY2tlZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdfV2l0aFZhbHVlcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gU2FtcGxlTWVzc2FnZXMuQ3JlYXRlRnVsbFRlc3RBbGxUeXBlcygpOwotICAgICAgICAgICAgdmFyIGFueSA9IEFueS5QYWNrKG1lc3NhZ2UpOwotICAgICAgICAgICAgdmFyIHRleHQgPSBhbnkuVG9TdHJpbmcoKTsKLSAgICAgICAgICAgIEFzc2VydC5UaGF0KHRleHQsIElzLlN0cmluZ0NvbnRhaW5pbmcoIlwiQHZhbHVlXCI6IFwiIiArIG1lc3NhZ2UuVG9CeXRlU3RyaW5nKCkuVG9CYXNlNjQoKSArICJcIiIpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUb1N0cmluZ19FbXB0eSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBhbnkgPSBuZXcgQW55KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInsgXCJAdHlwZVwiOiBcIlwiLCBcIkB2YWx1ZVwiOiBcIlwiIH0iLCBhbnkuVG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9TdHJpbmdfTWVzc2FnZUNvbnRhaW5pbmdBbnkoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0V2VsbEtub3duVHlwZXMgeyBBbnlGaWVsZCA9IG5ldyBBbnkoKSB9OwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ7IFwiYW55RmllbGRcIjogeyBcIkB0eXBlXCI6IFwiXCIsIFwiQHZhbHVlXCI6IFwiXCIgfSB9IiwgbWVzc2FnZS5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvV2VsbEtub3duVHlwZXMvRHVyYXRpb25UZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9XZWxsS25vd25UeXBlcy9EdXJhdGlvblRlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MWZhZjguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9XZWxsS25vd25UeXBlcy9EdXJhdGlvblRlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzIgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotdXNpbmcgU3lzdGVtOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzCi17Ci0gICAgcHVibGljIGNsYXNzIER1cmF0aW9uVGVzdAotICAgIHsKLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvVGltZVNwYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGltZVNwYW4uRnJvbVNlY29uZHMoMSksIG5ldyBEdXJhdGlvbiB7IFNlY29uZHMgPSAxIH0uVG9UaW1lU3BhbigpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUaW1lU3Bhbi5Gcm9tU2Vjb25kcygtMSksIG5ldyBEdXJhdGlvbiB7IFNlY29uZHMgPSAtMSB9LlRvVGltZVNwYW4oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGltZVNwYW4uRnJvbU1pbGxpc2Vjb25kcygxKSwgbmV3IER1cmF0aW9uIHsgTmFub3MgPSAxMDAwMDAwIH0uVG9UaW1lU3BhbigpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChUaW1lU3Bhbi5Gcm9tTWlsbGlzZWNvbmRzKC0xKSwgbmV3IER1cmF0aW9uIHsgTmFub3MgPSAtMTAwMDAwMCB9LlRvVGltZVNwYW4oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGltZVNwYW4uRnJvbVRpY2tzKDEpLCBuZXcgRHVyYXRpb24geyBOYW5vcyA9IDEwMCB9LlRvVGltZVNwYW4oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGltZVNwYW4uRnJvbVRpY2tzKC0xKSwgbmV3IER1cmF0aW9uIHsgTmFub3MgPSAtMTAwIH0uVG9UaW1lU3BhbigpKTsKLQotICAgICAgICAgICAgLy8gUm91bmRpbmcgaXMgdG93YXJkcyAwCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGltZVNwYW4uRnJvbVRpY2tzKDIpLCBuZXcgRHVyYXRpb24geyBOYW5vcyA9IDI1MCB9LlRvVGltZVNwYW4oKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoVGltZVNwYW4uRnJvbVRpY2tzKC0yKSwgbmV3IER1cmF0aW9uIHsgTmFub3MgPSAtMjUwIH0uVG9UaW1lU3BhbigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBZGRpdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMiwgTmFub3MgPSAxMDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMSwgTmFub3MgPSA2MDAwMDAwMDAgfSArIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gNTAwMDAwMDAwIH0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBEdXJhdGlvbiB7IFNlY29uZHMgPSAtMiwgTmFub3MgPSAtMTAwMDAwMDAwIH0sCi0gICAgICAgICAgICAgICAgbmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IC0xLCBOYW5vcyA9IC02MDAwMDAwMDAgfSArIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gLTUwMDAwMDAwMCB9KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMSwgTmFub3MgPSAxMDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMSwgTmFub3MgPSA2MDAwMDAwMDAgfSArIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gLTUwMDAwMDAwMCB9KTsKLQotICAgICAgICAgICAgLy8gTm9uLW5vcm1hbGl6ZWQgZHVyYXRpb25zLCBvciBub24tbm9ybWFsaXplZCBpbnRlcm1lZGlhdGUgcmVzdWx0cwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBEdXJhdGlvbiB7IFNlY29uZHMgPSAxIH0sCi0gICAgICAgICAgICAgICAgbmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IDEsIE5hbm9zID0gLTUwMDAwMDAwMCB9ICsgbmV3IER1cmF0aW9uIHsgTmFub3MgPSA1MDAwMDAwMDAgfSk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRHVyYXRpb24geyBOYW5vcyA9IC05MDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gLTEsIE5hbm9zID0gLTEwMDAwMDAwMCB9ICsgbmV3IER1cmF0aW9uIHsgTmFub3MgPSAyMDAwMDAwMDAgfSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IER1cmF0aW9uIHsgTmFub3MgPSA5MDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMSwgTmFub3MgPSAxMDAwMDAwMDAgfSArIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gLTIwMDAwMDAwMCB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBTdWJ0cmFjdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMSwgTmFub3MgPSAxMDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMSwgTmFub3MgPSA2MDAwMDAwMDAgfSAtIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gNTAwMDAwMDAwIH0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG5ldyBEdXJhdGlvbiB7IFNlY29uZHMgPSAtMSwgTmFub3MgPSAtMTAwMDAwMDAwIH0sCi0gICAgICAgICAgICAgICAgbmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IC0xLCBOYW5vcyA9IC02MDAwMDAwMDAgfSAtIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gLTUwMDAwMDAwMCB9KTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMiwgTmFub3MgPSAxMDAwMDAwMDAgfSwKLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMSwgTmFub3MgPSA2MDAwMDAwMDAgfSAtIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gLTUwMDAwMDAwMCB9KTsKLQotICAgICAgICAgICAgLy8gTm9uLW5vcm1hbGl6ZWQgZHVyYXRpb25zCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IER1cmF0aW9uKCksCi0gICAgICAgICAgICAgICAgbmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IDEsIE5hbm9zID0gLTUwMDAwMDAwMCB9IC0gbmV3IER1cmF0aW9uIHsgTmFub3MgPSA1MDAwMDAwMDAgfSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IDEgfSwKLSAgICAgICAgICAgICAgICBuZXcgRHVyYXRpb24geyBOYW5vcyA9IDIwMDAwMDAwMDAgfSAtIG5ldyBEdXJhdGlvbiB7IE5hbm9zID0gMTAwMDAwMDAwMCB9KTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBGcm9tVGltZVNwYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IDEgfSwgRHVyYXRpb24uRnJvbVRpbWVTcGFuKFRpbWVTcGFuLkZyb21TZWNvbmRzKDEpKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IER1cmF0aW9uIHsgTmFub3MgPSBEdXJhdGlvbi5OYW5vc2Vjb25kc1BlclRpY2sgfSwgRHVyYXRpb24uRnJvbVRpbWVTcGFuKFRpbWVTcGFuLkZyb21UaWNrcygxKSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgwLCBEdXJhdGlvbi5NYXhOYW5vc2Vjb25kcyArIDEpXQotICAgICAgICBbVGVzdENhc2UoMCwgRHVyYXRpb24uTWluTmFub3NlY29uZHMgLSAxKV0KLSAgICAgICAgW1Rlc3RDYXNlKER1cmF0aW9uLk1pblNlY29uZHMgLSAxLCAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKER1cmF0aW9uLk1heFNlY29uZHMgKyAxLCAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKDEsIC0xKV0KLSAgICAgICAgW1Rlc3RDYXNlKC0xLCAxKV0KLSAgICAgICAgcHVibGljIHZvaWQgVG9UaW1lU3Bhbl9JbnZhbGlkKGxvbmcgc2Vjb25kcywgaW50IG5hbm9zZWNvbmRzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gc2Vjb25kcywgTmFub3MgPSBuYW5vc2Vjb25kcyB9OwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uPigoKSA9PiBkdXJhdGlvbi5Ub1RpbWVTcGFuKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZSgwLCBEdXJhdGlvbi5NYXhOYW5vc2Vjb25kcyldCi0gICAgICAgIFtUZXN0Q2FzZSgwLCBEdXJhdGlvbi5NaW5OYW5vc2Vjb25kcyldCi0gICAgICAgIFtUZXN0Q2FzZShEdXJhdGlvbi5NaW5TZWNvbmRzLCBEdXJhdGlvbi5NaW5OYW5vc2Vjb25kcyldCi0gICAgICAgIFtUZXN0Q2FzZShEdXJhdGlvbi5NYXhTZWNvbmRzLCBEdXJhdGlvbi5NYXhOYW5vc2Vjb25kcyldCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvVGltZVNwYW5fVmFsaWQobG9uZyBzZWNvbmRzLCBpbnQgbmFub3NlY29uZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE9ubHkgdGVzdGluZyB0aGF0IHRoZXNlIHZhbHVlcyBkb24ndCB0aHJvdywgdW5saWtlIHRoZWlyIHNpbWlsYXIgdGVzdHMgaW4gVG9UaW1lU3Bhbl9JbnZhbGlkCi0gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gc2Vjb25kcywgTmFub3MgPSBuYW5vc2Vjb25kcyB9OwotICAgICAgICAgICAgZHVyYXRpb24uVG9UaW1lU3BhbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX05vbk5vcm1hbGl6ZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBKdXN0IGEgc2luZ2xlIGV4YW1wbGUgc2hvdWxkIGJlIHN1ZmZpY2llbnQuLi4KLSAgICAgICAgICAgIHZhciBkdXJhdGlvbiA9IG5ldyBEdXJhdGlvbiB7IFNlY29uZHMgPSAxLCBOYW5vcyA9IC0xIH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoInsgXCJAd2FybmluZ1wiOiBcIkludmFsaWQgRHVyYXRpb25cIiwgXCJzZWNvbmRzXCI6IFwiMVwiLCBcIm5hbm9zXCI6IC0xIH0iLCBkdXJhdGlvbi5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvV2VsbEtub3duVHlwZXMvRmllbGRNYXNrVGVzdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvV2VsbEtub3duVHlwZXMvRmllbGRNYXNrVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODliYzgyNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1dlbGxLbm93blR5cGVzL0ZpZWxkTWFza1Rlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MiArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi0KLXVzaW5nIE5Vbml0LkZyYW1ld29yazsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcwotewotICAgIHB1YmxpYyBjbGFzcyBGaWVsZE1hc2tUZXN0Ci0gICAgewotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKCJmb29fX2JhciIpXQotICAgICAgICBbVGVzdENhc2UoImZvb18zX2FyIildCi0gICAgICAgIFtUZXN0Q2FzZSgiZm9vQmFyIildCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX0ludmFsaWQoc3RyaW5nIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFzayA9IG5ldyBGaWVsZE1hc2sgeyBQYXRocyA9IHsgaW5wdXQgfSB9OwotICAgICAgICAgICAgdmFyIHRleHQgPSBtYXNrLlRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAvLyBNb3JlIHNwZWNpZmljIHRlc3QgYmVsb3cKLSAgICAgICAgICAgIEFzc2VydC5UaGF0KHRleHQsIElzLlN0cmluZ0NvbnRhaW5pbmcoIkB3YXJuaW5nIikpOwotICAgICAgICAgICAgQXNzZXJ0LlRoYXQodGV4dCwgSXMuU3RyaW5nQ29udGFpbmluZyhpbnB1dCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFRvU3RyaW5nX0ludmFsaWRfUHJlY2lzZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtYXNrID0gbmV3IEZpZWxkTWFzayB7IFBhdGhzID0geyAieCIsICJmb29fX2JhciIsIEAieFx5IiB9IH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoCi0gICAgICAgICAgICAgICAgInsgXCJAd2FybmluZ1wiOiBcIkludmFsaWQgRmllbGRNYXNrXCIsIFwicGF0aHNcIjogWyBcInhcIiwgXCJmb29fX2JhclwiLCBcInhcXFxceVwiIF0gfSIsCi0gICAgICAgICAgICAgICAgbWFzay5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvV2VsbEtub3duVHlwZXMvVGltZXN0YW1wVGVzdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvV2VsbEtub3duVHlwZXMvVGltZXN0YW1wVGVzdC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWVjZDI0Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L1dlbGxLbm93blR5cGVzL1RpbWVzdGFtcFRlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgTlVuaXQuRnJhbWV3b3JrOwotdXNpbmcgU3lzdGVtOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzCi17Ci0gICAgcHVibGljIGNsYXNzIFRpbWVzdGFtcFRlc3QKLSAgICB7Ci0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBGcm9tQW5kVG9EYXRlVGltZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERhdGVUaW1lIHV0Y01pbiA9IERhdGVUaW1lLlNwZWNpZnlLaW5kKERhdGVUaW1lLk1pblZhbHVlLCBEYXRlVGltZUtpbmQuVXRjKTsKLSAgICAgICAgICAgIERhdGVUaW1lIHV0Y01heCA9IERhdGVUaW1lLlNwZWNpZnlLaW5kKERhdGVUaW1lLk1heFZhbHVlLCBEYXRlVGltZUtpbmQuVXRjKTsKLSAgICAgICAgICAgIEFzc2VydFJvdW5kdHJpcChuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IC02MjEzNTU5NjgwMCB9LCB1dGNNaW4pOwotICAgICAgICAgICAgQXNzZXJ0Um91bmR0cmlwKG5ldyBUaW1lc3RhbXAgeyBTZWNvbmRzID0gMjUzNDAyMzAwNzk5LCBOYW5vcyA9IDk5OTk5OTkwMCB9LCB1dGNNYXgpOwotICAgICAgICAgICAgQXNzZXJ0Um91bmR0cmlwKG5ldyBUaW1lc3RhbXAoKSwgbmV3IERhdGVUaW1lKDE5NzAsIDEsIDEsIDAsIDAsIDAsIERhdGVUaW1lS2luZC5VdGMpKTsKLSAgICAgICAgICAgIEFzc2VydFJvdW5kdHJpcChuZXcgVGltZXN0YW1wIHsgTmFub3MgPSAxMDAwMDAwfSwgbmV3IERhdGVUaW1lKDE5NzAsIDEsIDEsIDAsIDAsIDAsIDEsIERhdGVUaW1lS2luZC5VdGMpKTsKLSAgICAgICAgICAgIEFzc2VydFJvdW5kdHJpcChuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IC0xLCBOYW5vcyA9IDk5OTAwMDAwMCB9LCBuZXcgRGF0ZVRpbWUoMTk2OSwgMTIsIDMxLCAyMywgNTksIDU5LCA5OTksIERhdGVUaW1lS2luZC5VdGMpKTsKLSAgICAgICAgICAgIEFzc2VydFJvdW5kdHJpcChuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IDM2MDAgfSwgbmV3IERhdGVUaW1lKDE5NzAsIDEsIDEsIDEsIDAsIDAsIERhdGVUaW1lS2luZC5VdGMpKTsKLSAgICAgICAgICAgIEFzc2VydFJvdW5kdHJpcChuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IC0zNjAwIH0sIG5ldyBEYXRlVGltZSgxOTY5LCAxMiwgMzEsIDIzLCAwLCAwLCBEYXRlVGltZUtpbmQuVXRjKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgVG9EYXRlVGltZVRydW5jYXRpb24oKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdDEgPSBuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IDEsIE5hbm9zID0gMTAwMDAwMCArIER1cmF0aW9uLk5hbm9zZWNvbmRzUGVyVGljayAtIDEgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChuZXcgRGF0ZVRpbWUoMTk3MCwgMSwgMSwgMCwgMCwgMSwgRGF0ZVRpbWVLaW5kLlV0YykuQWRkTWlsbGlzZWNvbmRzKDEpLCB0MS5Ub0RhdGVUaW1lKCkpOwotCi0gICAgICAgICAgICB2YXIgdDIgPSBuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IC0xLCBOYW5vcyA9IDEwMDAwMDAgKyBEdXJhdGlvbi5OYW5vc2Vjb25kc1BlclRpY2sgLSAxIH07Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobmV3IERhdGVUaW1lKDE5NjksIDEyLCAzMSwgMjMsIDU5LCA1OSkuQWRkTWlsbGlzZWNvbmRzKDEpLCB0Mi5Ub0RhdGVUaW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIFtUZXN0Q2FzZShUaW1lc3RhbXAuVW5peFNlY29uZHNBdEJjbE1pblZhbHVlIC0gMSwgVGltZXN0YW1wLk1heE5hbm9zKV0KLSAgICAgICAgW1Rlc3RDYXNlKFRpbWVzdGFtcC5Vbml4U2Vjb25kc0F0QmNsTWF4VmFsdWUgKyAxLCAwKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIC0xKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIFRpbWVzdGFtcC5NYXhOYW5vcyArIDEpXQotICAgICAgICBwdWJsaWMgdm9pZCBUb0RhdGVUaW1lX091dE9mUmFuZ2UobG9uZyBzZWNvbmRzLCBpbnQgbmFub3NlY29uZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5ldyBUaW1lc3RhbXAgeyBTZWNvbmRzID0gc2Vjb25kcywgTmFub3MgPSBuYW5vc2Vjb25kcyB9OwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uPigoKSA9PiB2YWx1ZS5Ub0RhdGVUaW1lKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gMW5zIGxhcmdlciBvciBzbWFsbGVyIHRoYW4gdGhlIGFib3ZlIHZhbHVlcwotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKFRpbWVzdGFtcC5Vbml4U2Vjb25kc0F0QmNsTWluVmFsdWUsIDApXQotICAgICAgICBbVGVzdENhc2UoVGltZXN0YW1wLlVuaXhTZWNvbmRzQXRCY2xNYXhWYWx1ZSwgVGltZXN0YW1wLk1heE5hbm9zKV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIDApXQotICAgICAgICBbVGVzdENhc2UoMCwgVGltZXN0YW1wLk1heE5hbm9zKV0KLSAgICAgICAgcHVibGljIHZvaWQgVG9EYXRlVGltZV9WYWxpZEJvdW5kYXJpZXMobG9uZyBzZWNvbmRzLCBpbnQgbmFub3NlY29uZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5ldyBUaW1lc3RhbXAgeyBTZWNvbmRzID0gc2Vjb25kcywgTmFub3MgPSBuYW5vc2Vjb25kcyB9OwotICAgICAgICAgICAgdmFsdWUuVG9EYXRlVGltZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBBc3NlcnRSb3VuZHRyaXAoVGltZXN0YW1wIHRpbWVzdGFtcCwgRGF0ZVRpbWUgZGF0ZVRpbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0aW1lc3RhbXAsIFRpbWVzdGFtcC5Gcm9tRGF0ZVRpbWUoZGF0ZVRpbWUpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkYXRlVGltZSwgdGltZXN0YW1wLlRvRGF0ZVRpbWUoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoRGF0ZVRpbWVLaW5kLlV0YywgdGltZXN0YW1wLlRvRGF0ZVRpbWUoKS5LaW5kKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBBcml0aG1ldGljKCkKLSAgICAgICAgewotICAgICAgICAgICAgVGltZXN0YW1wIHQxID0gbmV3IFRpbWVzdGFtcCB7IFNlY29uZHMgPSAxMDAwMCwgTmFub3MgPSA1MDAwIH07Ci0gICAgICAgICAgICBUaW1lc3RhbXAgdDIgPSBuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IDgwMDAsIE5hbm9zID0gMTAwMDAgfTsKLSAgICAgICAgICAgIER1cmF0aW9uIGRpZmZlcmVuY2UgPSBuZXcgRHVyYXRpb24geyBTZWNvbmRzID0gMTk5OSwgTmFub3MgPSBEdXJhdGlvbi5OYW5vc2Vjb25kc1BlclNlY29uZCAtIDUwMDAgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChkaWZmZXJlbmNlLCB0MSAtIHQyKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgtZGlmZmVyZW5jZSwgdDIgLSB0MSk7Ci0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0MSwgdDIgKyBkaWZmZXJlbmNlKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0MiwgdDEgLSBkaWZmZXJlbmNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBUb1N0cmluZ19Ob25Ob3JtYWxpemVkKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSnVzdCBhIHNpbmdsZSBleGFtcGxlIHNob3VsZCBiZSBzdWZmaWNpZW50Li4uCi0gICAgICAgICAgICB2YXIgZHVyYXRpb24gPSBuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IDEsIE5hbm9zID0gLTEgfTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgieyBcIkB3YXJuaW5nXCI6IFwiSW52YWxpZCBUaW1lc3RhbXBcIiwgXCJzZWNvbmRzXCI6IFwiMVwiLCBcIm5hbm9zXCI6IC0xIH0iLCBkdXJhdGlvbi5Ub1N0cmluZygpKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmLlRlc3QvV2VsbEtub3duVHlwZXMvV3JhcHBlcnNUZXN0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9XZWxsS25vd25UeXBlcy9XcmFwcGVyc1Rlc3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDViNzE4NWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9XZWxsS25vd25UeXBlcy9XcmFwcGVyc1Rlc3QuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw0MjEgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLlRlc3RQcm90b3M7Ci11c2luZyBOVW5pdC5GcmFtZXdvcms7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW0uSU87Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMKLXsKLSAgICBwdWJsaWMgY2xhc3MgV3JhcHBlcnNUZXN0Ci0gICAgewotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTnVsbElzRGVmYXVsdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcygpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLlN0cmluZ0ZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5CeXRlc0ZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5Cb29sRmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLkZsb2F0RmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LklzTnVsbChtZXNzYWdlLkRvdWJsZUZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5JbnQzMkZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5JbnQ2NEZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwobWVzc2FnZS5VaW50MzJGaWVsZCk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG1lc3NhZ2UuVWludDY0RmllbGQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE5vbkRlZmF1bHRTaW5nbGVWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0V2VsbEtub3duVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdGaWVsZCA9ICJ4IiwKLSAgICAgICAgICAgICAgICBCeXRlc0ZpZWxkID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzKSwKLSAgICAgICAgICAgICAgICBCb29sRmllbGQgPSB0cnVlLAotICAgICAgICAgICAgICAgIEZsb2F0RmllbGQgPSAxMi41ZiwKLSAgICAgICAgICAgICAgICBEb3VibGVGaWVsZCA9IDEyLjI1ZCwKLSAgICAgICAgICAgICAgICBJbnQzMkZpZWxkID0gMSwKLSAgICAgICAgICAgICAgICBJbnQ2NEZpZWxkID0gMiwKLSAgICAgICAgICAgICAgICBVaW50MzJGaWVsZCA9IDMsCi0gICAgICAgICAgICAgICAgVWludDY0RmllbGQgPSA0Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICB2YXIgYnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdFdlbGxLbm93blR5cGVzLlBhcnNlci5QYXJzZUZyb20oYnl0ZXMpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIngiLCBwYXJzZWQuU3RyaW5nRmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKEJ5dGVTdHJpbmcuQ29weUZyb20oMSwgMiwgMyksIHBhcnNlZC5CeXRlc0ZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBwYXJzZWQuQm9vbEZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxMi41ZiwgcGFyc2VkLkZsb2F0RmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDEyLjI1ZCwgcGFyc2VkLkRvdWJsZUZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBwYXJzZWQuSW50MzJGaWVsZCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMkwsIHBhcnNlZC5JbnQ2NEZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgzVSwgcGFyc2VkLlVpbnQzMkZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0VUwsIHBhcnNlZC5VaW50NjRGaWVsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTm9uTnVsbERlZmF1bHRJc1ByZXNlcnZlZFRocm91Z2hTZXJpYWxpemF0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nRmllbGQgPSAiIiwKLSAgICAgICAgICAgICAgICBCeXRlc0ZpZWxkID0gQnl0ZVN0cmluZy5FbXB0eSwKLSAgICAgICAgICAgICAgICBCb29sRmllbGQgPSBmYWxzZSwKLSAgICAgICAgICAgICAgICBGbG9hdEZpZWxkID0gMGYsCi0gICAgICAgICAgICAgICAgRG91YmxlRmllbGQgPSAwZCwKLSAgICAgICAgICAgICAgICBJbnQzMkZpZWxkID0gMCwKLSAgICAgICAgICAgICAgICBJbnQ2NEZpZWxkID0gMCwKLSAgICAgICAgICAgICAgICBVaW50MzJGaWVsZCA9IDAsCi0gICAgICAgICAgICAgICAgVWludDY0RmllbGQgPSAwCi0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICB2YXIgYnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICB2YXIgcGFyc2VkID0gVGVzdFdlbGxLbm93blR5cGVzLlBhcnNlci5QYXJzZUZyb20oYnl0ZXMpOwotCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoIiIsIHBhcnNlZC5TdHJpbmdGaWVsZCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5FbXB0eSwgcGFyc2VkLkJ5dGVzRmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGZhbHNlLCBwYXJzZWQuQm9vbEZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwZiwgcGFyc2VkLkZsb2F0RmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBkLCBwYXJzZWQuRG91YmxlRmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDAsIHBhcnNlZC5JbnQzMkZpZWxkKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgwTCwgcGFyc2VkLkludDY0RmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBVLCBwYXJzZWQuVWludDMyRmllbGQpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDBVTCwgcGFyc2VkLlVpbnQ2NEZpZWxkKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBwdWJsaWMgdm9pZCBSZXBlYXRlZFdyYXBwZXJzUHJvaGliaXROdWxsSXRlbXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBSZXBlYXRlZFdlbGxLbm93blR5cGVzKCk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbWVzc2FnZS5Cb29sRmllbGQuQWRkKChib29sPykgbnVsbCkpOwotICAgICAgICAgICAgQXNzZXJ0LlRocm93czxBcmd1bWVudE51bGxFeGNlcHRpb24+KCgpID0+IG1lc3NhZ2UuSW50MzJGaWVsZC5BZGQoKGludD8pIG51bGwpKTsKLSAgICAgICAgICAgIEFzc2VydC5UaHJvd3M8QXJndW1lbnROdWxsRXhjZXB0aW9uPigoKSA9PiBtZXNzYWdlLlN0cmluZ0ZpZWxkLkFkZCgoc3RyaW5nKSBudWxsKSk7Ci0gICAgICAgICAgICBBc3NlcnQuVGhyb3dzPEFyZ3VtZW50TnVsbEV4Y2VwdGlvbj4oKCkgPT4gbWVzc2FnZS5CeXRlc0ZpZWxkLkFkZCgoQnl0ZVN0cmluZykgbnVsbCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlcGVhdGVkV3JhcHBlcnNTZXJpYWxpemVEZXNlcmlhbGl6ZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFJlcGVhdGVkV2VsbEtub3duVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCb29sRmllbGQgPSB7IHRydWUsIGZhbHNlIH0sCi0gICAgICAgICAgICAgICAgQnl0ZXNGaWVsZCA9IHsgQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzKSwgQnl0ZVN0cmluZy5Db3B5RnJvbSg0LCA1LCA2KSwgQnl0ZVN0cmluZy5FbXB0eSB9LAotICAgICAgICAgICAgICAgIERvdWJsZUZpZWxkID0geyAxMi41LCAtMS41LCAwZCB9LAotICAgICAgICAgICAgICAgIEZsb2F0RmllbGQgPSB7IDEyMy4yNWYsIC0yMGYsIDBmIH0sCi0gICAgICAgICAgICAgICAgSW50MzJGaWVsZCA9IHsgaW50Lk1heFZhbHVlLCBpbnQuTWluVmFsdWUsIDAgfSwKLSAgICAgICAgICAgICAgICBJbnQ2NEZpZWxkID0geyBsb25nLk1heFZhbHVlLCBsb25nLk1pblZhbHVlLCAwTCB9LCAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBTdHJpbmdGaWVsZCA9IHsgIkZpcnN0IiwgIlNlY29uZCIsICIiIH0sCi0gICAgICAgICAgICAgICAgVWludDMyRmllbGQgPSB7IHVpbnQuTWF4VmFsdWUsIHVpbnQuTWluVmFsdWUsIDBVIH0sCi0gICAgICAgICAgICAgICAgVWludDY0RmllbGQgPSB7IHVsb25nLk1heFZhbHVlLCB1bG9uZy5NaW5WYWx1ZSwgMFVMIH0sCi0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdmFyIGJ5dGVzID0gbWVzc2FnZS5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgdmFyIHBhcnNlZCA9IFJlcGVhdGVkV2VsbEtub3duVHlwZXMuUGFyc2VyLlBhcnNlRnJvbShieXRlcyk7Ci0KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChtZXNzYWdlLCBwYXJzZWQpOwotICAgICAgICAgICAgLy8gSnVzdCB0byB0ZXN0IGEgc2luZ2xlIHZhbHVlIGZvciBzYW5pdHkuLi4KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgiU2Vjb25kIiwgbWVzc2FnZS5TdHJpbmdGaWVsZFsxXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVwZWF0ZWRXcmFwcGVyc0JpbmFyeUZvcm1hdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEF0IG9uZSBwb2ludCB3ZSBhY2NpZGVudGFsbHkgdXNlZCBhIHBhY2tlZCBmb3JtYXQgZm9yIHJlcGVhdGVkIHdyYXBwZXJzLCB3aGljaCBpcyB3cm9uZyAoYW5kIHdlaXJkKS4KLSAgICAgICAgICAgIC8vIFRoaXMgdGVzdCBpcyBqdXN0IHRvIHByb3ZlIHRoYXQgd2UgdXNlIHRoZSByaWdodCBmb3JtYXQuCi0KLSAgICAgICAgICAgIHZhciByYXdPdXRwdXQgPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd091dHB1dCk7Ci0gICAgICAgICAgICAvLyBXcml0ZSBhIHZhbHVlIG9mIDUKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyhSZXBlYXRlZFdlbGxLbm93blR5cGVzLkludDMyRmllbGRGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlTGVuZ3RoKDIpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKFdyYXBwZXJzUmVmbGVjdGlvbi5XcmFwcGVyVmFsdWVGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNSk7Ci0gICAgICAgICAgICAvLyBXcml0ZSBhIHZhbHVlIG9mIDAgKGVtcHR5IG1lc3NhZ2UpCi0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcoUmVwZWF0ZWRXZWxsS25vd25UeXBlcy5JbnQzMkZpZWxkRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUxlbmd0aCgwKTsKLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgdmFyIGV4cGVjdGVkQnl0ZXMgPSByYXdPdXRwdXQuVG9BcnJheSgpOwotCi0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBSZXBlYXRlZFdlbGxLbm93blR5cGVzIHsgSW50MzJGaWVsZCA9IHsgNSwgMCB9IH07Ci0gICAgICAgICAgICB2YXIgYWN0dWFsQnl0ZXMgPSBtZXNzYWdlLlRvQnl0ZUFycmF5KCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRCeXRlcywgYWN0dWFsQnl0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1hcFdyYXBwZXJzU2VyaWFsaXplRGVzZXJpYWxpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBubyBudWxsIHZhbHVlcyBoZXJlLCBhcyB0aGV5IGFyZSBwcm9oaWJpdGVkIGluIG1hcCBmaWVsZHMKLSAgICAgICAgICAgIC8vIChkZXNwaXRlIGJlaW5nIHJlcHJlc2VudGFibGUpLgotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgTWFwV2VsbEtub3duVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCb29sRmllbGQgPSB7IHsgMTAsIGZhbHNlIH0sIHsgMjAsIHRydWUgfSB9LAotICAgICAgICAgICAgICAgIEJ5dGVzRmllbGQgPSB7Ci0gICAgICAgICAgICAgICAgICAgIHsgLTEsIEJ5dGVTdHJpbmcuQ29weUZyb20oMSwgMiwgMykgfSwKLSAgICAgICAgICAgICAgICAgICAgeyAxMCwgQnl0ZVN0cmluZy5Db3B5RnJvbSg0LCA1LCA2KSB9LAotICAgICAgICAgICAgICAgICAgICB7IDEwMDAsIEJ5dGVTdHJpbmcuRW1wdHkgfSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgIERvdWJsZUZpZWxkID0geyB7IDEsIDEyLjUgfSwgeyAxMCwgLTEuNSB9LCB7IDIwLCAwZCB9IH0sCi0gICAgICAgICAgICAgICAgRmxvYXRGaWVsZCA9IHsgeyAyLCAxMjMuMjVmIH0sIHsgMywgLTIwZiB9LCB7IDQsIDBmIH0gfSwKLSAgICAgICAgICAgICAgICBJbnQzMkZpZWxkID0geyB7IDUsIGludC5NYXhWYWx1ZSB9LCB7IDYsIGludC5NaW5WYWx1ZSB9LCB7IDcsIDAgfSB9LAotICAgICAgICAgICAgICAgIEludDY0RmllbGQgPSB7IHsgOCwgbG9uZy5NYXhWYWx1ZSB9LCB7IDksIGxvbmcuTWluVmFsdWUgfSwgeyAxMCwgMEwgfSB9LAotICAgICAgICAgICAgICAgIFN0cmluZ0ZpZWxkID0geyB7IDExLCAiRmlyc3QiIH0sIHsgMTIsICJTZWNvbmQiIH0sIHsgMTMsICIiIH0gfSwKLSAgICAgICAgICAgICAgICBVaW50MzJGaWVsZCA9IHsgeyAxNSwgdWludC5NYXhWYWx1ZSB9LCB7IDE2LCB1aW50Lk1pblZhbHVlIH0sIHsgMTcsIDBVIH0gfSwKLSAgICAgICAgICAgICAgICBVaW50NjRGaWVsZCA9IHsgeyAxOCwgdWxvbmcuTWF4VmFsdWUgfSwgeyAxOSwgdWxvbmcuTWluVmFsdWUgfSwgeyAyMCwgMFVMIH0gfSwKLSAgICAgICAgICAgIH07Ci0KLSAgICAgICAgICAgIHZhciBieXRlcyA9IG1lc3NhZ2UuVG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBNYXBXZWxsS25vd25UeXBlcy5QYXJzZXIuUGFyc2VGcm9tKGJ5dGVzKTsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIHBhcnNlZCk7Ci0gICAgICAgICAgICAvLyBKdXN0IHRvIHRlc3QgYSBzaW5nbGUgdmFsdWUgZm9yIHNhbml0eS4uLgotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJTZWNvbmQiLCBtZXNzYWdlLlN0cmluZ0ZpZWxkWzEyXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVmbGVjdGlvbl9TaW5nbGVWYWx1ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0V2VsbEtub3duVHlwZXMKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBTdHJpbmdGaWVsZCA9ICJ4IiwKLSAgICAgICAgICAgICAgICBCeXRlc0ZpZWxkID0gQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzKSwKLSAgICAgICAgICAgICAgICBCb29sRmllbGQgPSB0cnVlLAotICAgICAgICAgICAgICAgIEZsb2F0RmllbGQgPSAxMi41ZiwKLSAgICAgICAgICAgICAgICBEb3VibGVGaWVsZCA9IDEyLjI1ZCwKLSAgICAgICAgICAgICAgICBJbnQzMkZpZWxkID0gMSwKLSAgICAgICAgICAgICAgICBJbnQ2NEZpZWxkID0gMiwKLSAgICAgICAgICAgICAgICBVaW50MzJGaWVsZCA9IDMsCi0gICAgICAgICAgICAgICAgVWludDY0RmllbGQgPSA0Ci0gICAgICAgICAgICB9OwotICAgICAgICAgICAgdmFyIGZpZWxkcyA9IFRlc3RXZWxsS25vd25UeXBlcy5EZXNjcmlwdG9yLkZpZWxkczsKLQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKCJ4IiwgZmllbGRzW1Rlc3RXZWxsS25vd25UeXBlcy5TdHJpbmdGaWVsZEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoQnl0ZVN0cmluZy5Db3B5RnJvbSgxLCAyLCAzKSwgZmllbGRzW1Rlc3RXZWxsS25vd25UeXBlcy5CeXRlc0ZpZWxkRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCh0cnVlLCBmaWVsZHNbVGVzdFdlbGxLbm93blR5cGVzLkJvb2xGaWVsZEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIuNWYsIGZpZWxkc1tUZXN0V2VsbEtub3duVHlwZXMuRmxvYXRGaWVsZEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMTIuMjVkLCBmaWVsZHNbVGVzdFdlbGxLbm93blR5cGVzLkRvdWJsZUZpZWxkRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCgxLCBmaWVsZHNbVGVzdFdlbGxLbm93blR5cGVzLkludDMyRmllbGRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDJMLCBmaWVsZHNbVGVzdFdlbGxLbm93blR5cGVzLkludDY0RmllbGRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDNVLCBmaWVsZHNbVGVzdFdlbGxLbm93blR5cGVzLlVpbnQzMkZpZWxkRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg0VUwsIGZpZWxkc1tUZXN0V2VsbEtub3duVHlwZXMuVWludDY0RmllbGRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSkpOwotCi0gICAgICAgICAgICAvLyBBbmQgYSBjb3VwbGUgb2YgbnVsbCBmaWVsZHMuLi4KLSAgICAgICAgICAgIG1lc3NhZ2UuU3RyaW5nRmllbGQgPSBudWxsOwotICAgICAgICAgICAgbWVzc2FnZS5GbG9hdEZpZWxkID0gbnVsbDsKLSAgICAgICAgICAgIEFzc2VydC5Jc051bGwoZmllbGRzW1Rlc3RXZWxsS25vd25UeXBlcy5TdHJpbmdGaWVsZEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKGZpZWxkc1tUZXN0V2VsbEtub3duVHlwZXMuRmxvYXRGaWVsZEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgUmVmbGVjdGlvbl9SZXBlYXRlZEZpZWxkcygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEp1c3QgYSBzaW5nbGUgZXhhbXBsZS4uLiBub3RlIHRoYXQgd2UgY2FuJ3QgaGF2ZSBhIG51bGwgdmFsdWUgaGVyZQotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgUmVwZWF0ZWRXZWxsS25vd25UeXBlcyB7IEludDMyRmllbGQgPSB7IDEsIDIgfSB9OwotICAgICAgICAgICAgdmFyIGZpZWxkcyA9IFJlcGVhdGVkV2VsbEtub3duVHlwZXMuRGVzY3JpcHRvci5GaWVsZHM7Ci0gICAgICAgICAgICB2YXIgbGlzdCA9IChJTGlzdCkgZmllbGRzW1JlcGVhdGVkV2VsbEtub3duVHlwZXMuSW50MzJGaWVsZEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKTsKLSAgICAgICAgICAgIENvbGxlY3Rpb25Bc3NlcnQuQXJlRXF1YWwobmV3W10geyAxLCAyIH0sIGxpc3QpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFJlZmxlY3Rpb25fTWFwRmllbGRzKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gSnVzdCBhIHNpbmdsZSBleGFtcGxlLi4uIG5vdGUgdGhhdCB3ZSBjYW4ndCBoYXZlIGEgbnVsbCB2YWx1ZSBoZXJlIGRlc3BpdGUgdGhlIHZhbHVlIHR5cGUgYmVpbmcgaW50PwotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgTWFwV2VsbEtub3duVHlwZXMgeyBJbnQzMkZpZWxkID0geyB7IDEsIDIgfSB9IH07Ci0gICAgICAgICAgICB2YXIgZmllbGRzID0gTWFwV2VsbEtub3duVHlwZXMuRGVzY3JpcHRvci5GaWVsZHM7Ci0gICAgICAgICAgICB2YXIgZGljdGlvbmFyeSA9IChJRGljdGlvbmFyeSkgZmllbGRzW01hcFdlbGxLbm93blR5cGVzLkludDMyRmllbGRGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoMiwgZGljdGlvbmFyeVsxXSk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgT25lb2YoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBPbmVvZldlbGxLbm93blR5cGVzIHsgRW1wdHlGaWVsZCA9IG5ldyBFbXB0eSgpIH07Ci0gICAgICAgICAgICAvLyBTdGFydCBvZmYgd2l0aCBhIG5vbi13cmFwcGVyCi0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoT25lb2ZXZWxsS25vd25UeXBlcy5PbmVvZkZpZWxkT25lb2ZDYXNlLkVtcHR5RmllbGQsIG1lc3NhZ2UuT25lb2ZGaWVsZENhc2UpOwotICAgICAgICAgICAgQXNzZXJ0T25lb2ZSb3VuZFRyaXAobWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2UuU3RyaW5nRmllbGQgPSAiZm9vIjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChPbmVvZldlbGxLbm93blR5cGVzLk9uZW9mRmllbGRPbmVvZkNhc2UuU3RyaW5nRmllbGQsIG1lc3NhZ2UuT25lb2ZGaWVsZENhc2UpOwotICAgICAgICAgICAgQXNzZXJ0T25lb2ZSb3VuZFRyaXAobWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2UuU3RyaW5nRmllbGQgPSAiZm9vIjsKLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbChPbmVvZldlbGxLbm93blR5cGVzLk9uZW9mRmllbGRPbmVvZkNhc2UuU3RyaW5nRmllbGQsIG1lc3NhZ2UuT25lb2ZGaWVsZENhc2UpOwotICAgICAgICAgICAgQXNzZXJ0T25lb2ZSb3VuZFRyaXAobWVzc2FnZSk7Ci0KLSAgICAgICAgICAgIG1lc3NhZ2UuRG91YmxlRmllbGQgPSAwLjBmOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKE9uZW9mV2VsbEtub3duVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5Eb3VibGVGaWVsZCwgbWVzc2FnZS5PbmVvZkZpZWxkQ2FzZSk7Ci0gICAgICAgICAgICBBc3NlcnRPbmVvZlJvdW5kVHJpcChtZXNzYWdlKTsKLQotICAgICAgICAgICAgbWVzc2FnZS5Eb3VibGVGaWVsZCA9IDEuMGY7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoT25lb2ZXZWxsS25vd25UeXBlcy5PbmVvZkZpZWxkT25lb2ZDYXNlLkRvdWJsZUZpZWxkLCBtZXNzYWdlLk9uZW9mRmllbGRDYXNlKTsKLSAgICAgICAgICAgIEFzc2VydE9uZW9mUm91bmRUcmlwKG1lc3NhZ2UpOwotCi0gICAgICAgICAgICBtZXNzYWdlLkNsZWFyT25lb2ZGaWVsZCgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKE9uZW9mV2VsbEtub3duVHlwZXMuT25lb2ZGaWVsZE9uZW9mQ2FzZS5Ob25lLCBtZXNzYWdlLk9uZW9mRmllbGRDYXNlKTsKLSAgICAgICAgICAgIEFzc2VydE9uZW9mUm91bmRUcmlwKG1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEFzc2VydE9uZW9mUm91bmRUcmlwKE9uZW9mV2VsbEtub3duVHlwZXMgbWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm9ybWFsIHJvdW5kdHJpcCwgYnV0IGV4cGxpY2l0bHkgY2hlY2tpbmcgdGhlIGNhc2UuLi4KLSAgICAgICAgICAgIHZhciBieXRlcyA9IG1lc3NhZ2UuVG9CeXRlQXJyYXkoKTsKLSAgICAgICAgICAgIHZhciBwYXJzZWQgPSBPbmVvZldlbGxLbm93blR5cGVzLlBhcnNlci5QYXJzZUZyb20oYnl0ZXMpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKG1lc3NhZ2UsIHBhcnNlZCk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwobWVzc2FnZS5PbmVvZkZpZWxkQ2FzZSwgcGFyc2VkLk9uZW9mRmllbGRDYXNlKTsKLSAgICAgICAgfQotCi0gICAgICAgIFtUZXN0XQotICAgICAgICBbVGVzdENhc2UoIngiLCAieSIsICJ5IildCi0gICAgICAgIFtUZXN0Q2FzZSgieCIsICIiLCAieCIpXQotICAgICAgICBbVGVzdENhc2UoIngiLCBudWxsLCAieCIpXQotICAgICAgICBbVGVzdENhc2UoIiIsICJ5IiwgInkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKCIiLCAiIiwgIiIpXQotICAgICAgICBbVGVzdENhc2UoIiIsIG51bGwsICIiKV0KLSAgICAgICAgW1Rlc3RDYXNlKG51bGwsICJ5IiwgInkiKV0KLSAgICAgICAgW1Rlc3RDYXNlKG51bGwsICIiLCAiIildCi0gICAgICAgIFtUZXN0Q2FzZShudWxsLCBudWxsLCBudWxsKV0KLSAgICAgICAgcHVibGljIHZvaWQgTWVyZ2luZyhzdHJpbmcgb3JpZ2luYWwsIHN0cmluZyBtZXJnZWQsIHN0cmluZyBleHBlY3RlZCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG9yaWdpbmFsTWVzc2FnZSA9IG5ldyBUZXN0V2VsbEtub3duVHlwZXMgeyBTdHJpbmdGaWVsZCA9IG9yaWdpbmFsIH07Ci0gICAgICAgICAgICB2YXIgbWVyZ2luZ01lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgU3RyaW5nRmllbGQgPSBtZXJnZWQgfTsKLSAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5NZXJnZUZyb20obWVyZ2luZ01lc3NhZ2UpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKGV4cGVjdGVkLCBvcmlnaW5hbE1lc3NhZ2UuU3RyaW5nRmllbGQpOwotCi0gICAgICAgICAgICAvLyBUcnkgaXQgdXNpbmcgTWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pIHRvby4uLgotICAgICAgICAgICAgb3JpZ2luYWxNZXNzYWdlID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcyB7IFN0cmluZ0ZpZWxkID0gb3JpZ2luYWwgfTsKLSAgICAgICAgICAgIG9yaWdpbmFsTWVzc2FnZS5NZXJnZUZyb20obWVyZ2luZ01lc3NhZ2UuVG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWQsIG9yaWdpbmFsTWVzc2FnZS5TdHJpbmdGaWVsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBNZXJnaW5nIGlzIG9kZCB3aXRoIHdyYXBwZXIgdHlwZXMsIGR1ZSB0byB0aGUgd2F5IHRoYXQgZGVmYXVsdCB2YWx1ZXMgYXJlbid0IGVtaXR0ZWQgaW4KLSAgICAgICAgLy8gdGhlIGJpbmFyeSBzdHJlYW0uIEluIGZhY3Qgd2UgY2hlYXQgYSBsaXR0bGUgYml0IC0gYSBtZXNzYWdlIHdpdGggYW4gZXhwbGljaXRseSBwcmVzZW50IGRlZmF1bHQKLSAgICAgICAgLy8gdmFsdWUgd2lsbCBoYXZlIHRoYXQgZGVmYXVsdCB2YWx1ZSBpZ25vcmVkLiBTZWUgaXNzdWUgNjE1LiBGaXhpbmcgdGhpcyB3b3VsZCByZXF1aXJlIHNpZ25pZmljYW50IHVwaGVhdmFsIHRvCi0gICAgICAgIC8vIHRoZSBGaWVsZENvZGVjIHNpZGUgb2YgdGhpbmdzLgotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgTWVyZ2luZ1N0cmVhbUV4cGxpY2l0VmFsdWUoKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBUZXN0V2VsbEtub3duVHlwZXMgeyBJbnQzMkZpZWxkID0gNSB9OwotCi0gICAgICAgICAgICAvLyBDcmVhdGUgYSBieXRlIGFycmF5IHdoaWNoIGhhcyB0aGUgZGF0YSBvZiBhbiBJbnQzMlZhbHVlIGV4cGxpY2l0bHkgY29udGFpbmluZyBhIHZhbHVlIG9mIDAuCi0gICAgICAgICAgICAvLyBUaGlzIHdvdWxkbid0IG5vcm1hbGx5IGhhcHBlbi4KLSAgICAgICAgICAgIGJ5dGVbXSBieXRlczsKLSAgICAgICAgICAgIHZhciB3cmFwcGVyVGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKFRlc3RXZWxsS25vd25UeXBlcy5JbnQzMkZpZWxkRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKTsKLSAgICAgICAgICAgIHZhciB2YWx1ZVRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZyhJbnQzMlZhbHVlLlZhbHVlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KTsKLSAgICAgICAgICAgIHVzaW5nICh2YXIgc3RyZWFtID0gbmV3IE1lbW9yeVN0cmVhbSgpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBjb2RlZCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShzdHJlYW0pOwotICAgICAgICAgICAgICAgIGNvZGVkLldyaXRlVGFnKHdyYXBwZXJUYWcpOwotICAgICAgICAgICAgICAgIGNvZGVkLldyaXRlTGVuZ3RoKDIpOyAvLyB2YWx1ZVRhZyArIGEgdmFsdWUgMCwgZWFjaCBvbmUgYnl0ZQotICAgICAgICAgICAgICAgIGNvZGVkLldyaXRlVGFnKHZhbHVlVGFnKTsKLSAgICAgICAgICAgICAgICBjb2RlZC5Xcml0ZUludDMyKDApOwotICAgICAgICAgICAgICAgIGNvZGVkLkZsdXNoKCk7Ci0gICAgICAgICAgICAgICAgYnl0ZXMgPSBzdHJlYW0uVG9BcnJheSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBtZXNzYWdlLk1lcmdlRnJvbShieXRlcyk7Ci0gICAgICAgICAgICAvLyBBIG5vcm1hbCBpbXBsZW1lbnRhdGlvbiB3b3VsZCBoYXZlIDAgbm93LCBhcyB0aGUgZXhwbGljaXQgZGVmYXVsdCB3b3VsZCBoYXZlIGJlZW4gb3ZlcndyaXR0ZW4gdGhlIDUuCi0gICAgICAgICAgICAvLyBXaXRoIHRoZSBGaWVsZENvZGVjIGZvciBOdWxsYWJsZTxpbnQ+LCB3ZSBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gYW4gaW1wbGljaXQgMCBhbmQgYW4gZXhwbGljaXQgMC4KLSAgICAgICAgICAgIEFzc2VydC5BcmVFcXVhbCg1LCBtZXNzYWdlLkludDMyRmllbGQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdpbmdTdHJlYW1Ob1ZhbHVlKCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgSW50MzJGaWVsZCA9IDUgfTsKLQotICAgICAgICAgICAgLy8gQ3JlYXRlIGEgYnl0ZSBhcnJheSB3aGljaCBhbiBJbnQzMiBmaWVsZCwgYnV0IHdpdGggbm8gdmFsdWUuCi0gICAgICAgICAgICB2YXIgYnl0ZXMgPSBuZXcgVGVzdFdlbGxLbm93blR5cGVzIHsgSW50MzJGaWVsZCA9IDAgfS5Ub0J5dGVBcnJheSgpOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDIsIGJ5dGVzLkxlbmd0aCk7IC8vIFRoZSB0YWcgZm9yIEludDMyRmllbGQgaXMgYSBzaW5nbGUgYnl0ZSwgdGhlbiBhIGJ5dGUgaW5kaWNhdGluZyBhIDAtbGVuZ3RoIG1lc3NhZ2UuCi0gICAgICAgICAgICBtZXNzYWdlLk1lcmdlRnJvbShieXRlcyk7Ci0KLSAgICAgICAgICAgIC8vIFRoZSAiaW1wbGljaXQiIDAgZGlkICpub3QqIG92ZXJ3cml0ZSB0aGUgdmFsdWUuCi0gICAgICAgICAgICAvLyAoVGhpcyBpcyB0aGUgY29ycmVjdCBiZWhhdmlvdXIuKQotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDUsIG1lc3NhZ2UuSW50MzJGaWVsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBBbGwgcGVybXV0YXRpb25zIG9mIG9yaWdpbi9tZXJnaW5nIHZhbHVlIGJlaW5nIG51bGwsIHplcm8gKGRlZmF1bHQpIG9yIG5vbi1kZWZhdWx0LgotICAgICAgICAvLyBBcyB0aGlzIGlzIHRoZSBpbi1tZW1vcnkgdmVyc2lvbiwgd2UgZG9uJ3QgbmVlZCB0byB3b3JyeSBhYm91dCB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIGltcGxpY2l0IGFuZCBleHBsaWNpdCAwLgotICAgICAgICBbVGVzdF0KLSAgICAgICAgW1Rlc3RDYXNlKG51bGwsIG51bGwsIG51bGwpXQotICAgICAgICBbVGVzdENhc2UobnVsbCwgMCwgMCldCi0gICAgICAgIFtUZXN0Q2FzZShudWxsLCA1LCA1KV0KLSAgICAgICAgW1Rlc3RDYXNlKDAsIG51bGwsIDApXQotICAgICAgICBbVGVzdENhc2UoMCwgMCwgMCldCi0gICAgICAgIFtUZXN0Q2FzZSgwLCA1LCA1KV0KLSAgICAgICAgW1Rlc3RDYXNlKDUsIG51bGwsIDUpXQotICAgICAgICBbVGVzdENhc2UoNSwgMCwgNSldCi0gICAgICAgIFtUZXN0Q2FzZSg1LCAxMCwgMTApXQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnaW5nTWVzc2FnZVdpdGhaZXJvKGludD8gb3JpZ2luVmFsdWUsIGludD8gbWVyZ2luZ1ZhbHVlLCBpbnQ/IGV4cGVjdGVkUmVzdWx0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgTWVyZ2luZ1N0cmVhbUNvcm5lckNhc2UgYmVjYXVzZSB3aGVuIHdlIG1lcmdlIG1lc3NhZ2UgKm9iamVjdHMqLAotICAgICAgICAgICAgLy8gd2UgaWdub3JlIGRlZmF1bHQgdmFsdWVzIGZyb20gdGhlICJzb3VyY2UiLgotICAgICAgICAgICAgdmFyIG1lc3NhZ2UxID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcyB7IEludDMyRmllbGQgPSBvcmlnaW5WYWx1ZSB9OwotICAgICAgICAgICAgdmFyIG1lc3NhZ2UyID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcyB7IEludDMyRmllbGQgPSBtZXJnaW5nVmFsdWUgfTsKLSAgICAgICAgICAgIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7Ci0gICAgICAgICAgICBBc3NlcnQuQXJlRXF1YWwoZXhwZWN0ZWRSZXN1bHQsIG1lc3NhZ2UxLkludDMyRmllbGQpOwotICAgICAgICB9Ci0KLSAgICAgICAgW1Rlc3RdCi0gICAgICAgIHB1YmxpYyB2b2lkIFVua25vd25GaWVsZEluV3JhcHBlcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzdHJlYW0gPSBuZXcgTWVtb3J5U3RyZWFtKCk7Ci0gICAgICAgICAgICB2YXIgb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHN0cmVhbSk7Ci0gICAgICAgICAgICB2YXIgd3JhcHBlclRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZyhUZXN0V2VsbEtub3duVHlwZXMuSW50MzJGaWVsZEZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgICAgICB2YXIgdW5rbm93blRhZyA9IFdpcmVGb3JtYXQuTWFrZVRhZygxNSwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOwotICAgICAgICAgICAgdmFyIHZhbHVlVGFnID0gV2lyZUZvcm1hdC5NYWtlVGFnKEludDMyVmFsdWUuVmFsdWVGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpOwotCi0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcod3JhcHBlclRhZyk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVMZW5ndGgoNCk7IC8vIHVua25vd25UYWcgKyB2YWx1ZSA1ICsgdmFsdWVUeXBlICsgdmFsdWUgNiwgZWFjaCAxIGJ5dGUKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh1bmtub3duVGFnKTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKChpbnQpIHZhbHVlVGFnKTsgLy8gU25lYWtpbHkgInByZXRlbmQiIGl0J3MgYSB0YWcgd2hlbiBpdCdzIHJlYWxseSBhIHZhbHVlCi0gICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcodmFsdWVUYWcpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoNik7Ci0KLSAgICAgICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICAgICAgc3RyZWFtLlBvc2l0aW9uID0gMDsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSBUZXN0V2VsbEtub3duVHlwZXMuUGFyc2VyLlBhcnNlRnJvbShzdHJlYW0pOwotICAgICAgICAgICAgQXNzZXJ0LkFyZUVxdWFsKDYsIG1lc3NhZ2UuSW50MzJGaWVsZCk7Ci0gICAgICAgIH0KLQotICAgICAgICBbVGVzdF0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYXJXaXRoUmVmbGVjdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFN0cmluZyBhbmQgQnl0ZXMgYXJlIHRoZSB0cmlja3kgb25lcyBoZXJlLCBhcyB0aGUgQ0xSIHR5cGUgb2YgdGhlIHByb3BlcnR5Ci0gICAgICAgICAgICAvLyBpcyB0aGUgc2FtZSBiZXR3ZWVuIHRoZSB3cmFwcGVyIGFuZCBub24td3JhcHBlciB0eXBlcy4KLSAgICAgICAgICAgIHZhciBtZXNzYWdlID0gbmV3IFRlc3RXZWxsS25vd25UeXBlcyB7IFN0cmluZ0ZpZWxkID0gImZvbyIgfTsKLSAgICAgICAgICAgIFRlc3RXZWxsS25vd25UeXBlcy5EZXNjcmlwdG9yLkZpZWxkc1tUZXN0V2VsbEtub3duVHlwZXMuU3RyaW5nRmllbGRGaWVsZE51bWJlcl0uQWNjZXNzb3IuQ2xlYXIobWVzc2FnZSk7Ci0gICAgICAgICAgICBBc3NlcnQuSXNOdWxsKG1lc3NhZ2UuU3RyaW5nRmllbGQpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYuVGVzdC9wYWNrYWdlcy5jb25maWcgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L3BhY2thZ2VzLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzc2NTM5OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi5UZXN0L3BhY2thZ2VzLmNvbmZpZworKysgL2Rldi9udWxsCkBAIC0xLDUgKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxwYWNrYWdlcz4KLSAgPHBhY2thZ2UgaWQ9Ik5Vbml0IiB2ZXJzaW9uPSIyLjYuNCIgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgdXNlckluc3RhbGxlZD0idHJ1ZSIgLz4KLSAgPHBhY2thZ2UgaWQ9Ik5Vbml0VGVzdEFkYXB0ZXIiIHZlcnNpb249IjIuMC4wIiB0YXJnZXRGcmFtZXdvcms9Im5ldDQ1IiB1c2VySW5zdGFsbGVkPSJ0cnVlIiAvPgotPC9wYWNrYWdlcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9CeXRlQXJyYXkuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9CeXRlQXJyYXkuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxOTk2MjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQnl0ZUFycmF5LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzkgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQcm92aWRlcyBhIHV0aWxpdHkgcm91dGluZSB0byBjb3B5IHNtYWxsIGFycmF5cyBtdWNoIG1vcmUgcXVpY2tseSB0aGFuIEJ1ZmZlci5CbG9ja0NvcHkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBCeXRlQXJyYXkKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB0aHJlc2hvbGQgYWJvdmUgd2hpY2ggeW91IHNob3VsZCB1c2UgQnVmZmVyLkJsb2NrQ29weSByYXRoZXIgdGhhbiBCeXRlQXJyYXkuQ29weQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBDb3B5VGhyZXNob2xkID0gMTI7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGV0ZXJtaW5lcyB3aGljaCBjb3B5IHJvdXRpbmUgdG8gdXNlIGJhc2VkIG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgY29waWVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBDb3B5KGJ5dGVbXSBzcmMsIGludCBzcmNPZmZzZXQsIGJ5dGVbXSBkc3QsIGludCBkc3RPZmZzZXQsIGludCBjb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvdW50ID4gQ29weVRocmVzaG9sZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBCdWZmZXIuQmxvY2tDb3B5KHNyYywgc3JjT2Zmc2V0LCBkc3QsIGRzdE9mZnNldCwgY291bnQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBzdG9wID0gc3JjT2Zmc2V0ICsgY291bnQ7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IHNyY09mZnNldDsgaSA8IHN0b3A7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGRzdFtkc3RPZmZzZXQrK10gPSBzcmNbaV07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV2ZXJzZXMgdGhlIG9yZGVyIG9mIGJ5dGVzIGluIHRoZSBhcnJheQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBSZXZlcnNlKGJ5dGVbXSBieXRlcykKLSAgICAgICAgewotICAgICAgICAgICAgZm9yIChpbnQgZmlyc3QgPSAwLCBsYXN0ID0gYnl0ZXMuTGVuZ3RoIC0gMTsgZmlyc3QgPCBsYXN0OyBmaXJzdCsrLCBsYXN0LS0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZSB0ZW1wID0gYnl0ZXNbZmlyc3RdOwotICAgICAgICAgICAgICAgIGJ5dGVzW2ZpcnN0XSA9IGJ5dGVzW2xhc3RdOwotICAgICAgICAgICAgICAgIGJ5dGVzW2xhc3RdID0gdGVtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9CeXRlU3RyaW5nLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQnl0ZVN0cmluZy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFhZDYyMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9CeXRlU3RyaW5nLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzQ1ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEltbXV0YWJsZSBhcnJheSBvZiBieXRlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgQnl0ZVN0cmluZyA6IElFbnVtZXJhYmxlPGJ5dGU+LCBJRXF1YXRhYmxlPEJ5dGVTdHJpbmc+Ci0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBCeXRlU3RyaW5nIGVtcHR5ID0gbmV3IEJ5dGVTdHJpbmcobmV3IGJ5dGVbMF0pOwotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgYnl0ZVtdIGJ5dGVzOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVuc2FmZSBvcGVyYXRpb25zIHRoYXQgY2FuIGNhdXNlIElPIEZhaWx1cmUgYW5kL29yIG90aGVyIGNhdGVzdHJvcGhpYyBzaWRlLWVmZmVjdHMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBVbnNhZmUKLSAgICAgICAgewotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIENvbnN0cnVjdHMgYSBuZXcgQnl0ZVN0cmluZyBmcm9tIHRoZSBnaXZlbiBieXRlIGFycmF5LiBUaGUgYXJyYXkgaXMKLSAgICAgICAgICAgIC8vLyAqbm90KiBjb3BpZWQsIGFuZCBtdXN0IG5vdCBiZSBtb2RpZmllZCBhZnRlciB0aGlzIGNvbnN0cnVjdG9yIGlzIGNhbGxlZC4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBpbnRlcm5hbCBzdGF0aWMgQnl0ZVN0cmluZyBGcm9tQnl0ZXMoYnl0ZVtdIGJ5dGVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZyhieXRlcyk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBQcm92aWRlcyBkaXJlY3QsIHVucmVzdHJpY3RlZCBhY2Nlc3MgdG8gdGhlIGJ5dGVzIGNvbnRhaW5lZCBpbiB0aGlzIGluc3RhbmNlLgotICAgICAgICAgICAgLy8vIFlvdSBtdXN0IG5vdCBtb2RpZnkgb3IgcmVzaXplIHRoZSBieXRlIGFycmF5IHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIGludGVybmFsIHN0YXRpYyBieXRlW10gR2V0QnVmZmVyKEJ5dGVTdHJpbmcgYnl0ZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzLmJ5dGVzOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW50ZXJuYWwgdXNlIG9ubHkuICBFbnN1cmUgdGhhdCB0aGUgcHJvdmlkZWQgYXJyYXkgaXMgbm90IG11dGF0ZWQgYW5kIGJlbG9uZ3MgdG8gdGhpcyBpbnN0YW5jZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEJ5dGVTdHJpbmcgQXR0YWNoQnl0ZXMoYnl0ZVtdIGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcoYnl0ZXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0cyBhIG5ldyBCeXRlU3RyaW5nIGZyb20gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuIFRoZSBhcnJheSBpcwotICAgICAgICAvLy8gKm5vdCogY29waWVkLCBhbmQgbXVzdCBub3QgYmUgbW9kaWZpZWQgYWZ0ZXIgdGhpcyBjb25zdHJ1Y3RvciBpcyBjYWxsZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgQnl0ZVN0cmluZyhieXRlW10gYnl0ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuYnl0ZXMgPSBieXRlczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYW4gZW1wdHkgQnl0ZVN0cmluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIEVtcHR5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBlbXB0eTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgbGVuZ3RoIG9mIHRoaXMgQnl0ZVN0cmluZyBpbiBieXRlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBMZW5ndGgKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGJ5dGVzLkxlbmd0aDsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyA8Yz50cnVlPC9jPiBpZiB0aGlzIGJ5dGUgc3RyaW5nIGlzIGVtcHR5LCA8Yz5mYWxzZTwvYz4gb3RoZXJ3aXNlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJc0VtcHR5Ci0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBMZW5ndGggPT0gMDsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVydHMgdGhpcyA8c2VlIGNyZWY9IkJ5dGVTdHJpbmciLz4gaW50byBhIGJ5dGUgYXJyYXkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5UaGUgZGF0YSBpcyBjb3BpZWQgLSBjaGFuZ2VzIHRvIHRoZSByZXR1cm5lZCBhcnJheSB3aWxsIG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhpcyA8Yz5CeXRlU3RyaW5nPC9jPi48L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGJ5dGUgYXJyYXkgd2l0aCB0aGUgc2FtZSBkYXRhIGFzIHRoaXMgPGM+Qnl0ZVN0cmluZzwvYz4uPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYnl0ZVtdIFRvQnl0ZUFycmF5KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChieXRlW10pIGJ5dGVzLkNsb25lKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGlzIDxzZWUgY3JlZj0iQnl0ZVN0cmluZyIvPiBpbnRvIGEgc3RhbmRhcmQgYmFzZTY0IHJlcHJlc2VudGF0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+QSBiYXNlNjQgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8Yz5CeXRlU3RyaW5nPC9jPi48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9CYXNlNjQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29udmVydC5Ub0Jhc2U2NFN0cmluZyhieXRlcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgPHNlZSBjcmVmPSJCeXRlU3RyaW5nIiAvPiBmcm9tIHRoZSBCYXNlNjQgRW5jb2RlZCBTdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBGcm9tQmFzZTY0KHN0cmluZyBieXRlcykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQnkgaGFuZGxpbmcgdGhlIGVtcHR5IHN0cmluZyBleHBsaWNpdGx5LCB3ZSBub3Qgb25seSBvcHRpbWl6ZSBidXQgd2UgZml4IGEKLSAgICAgICAgICAgIC8vIHByb2JsZW0gb24gQ0YgMi4wLiBTZWUgaXNzdWUgNjEgZm9yIGRldGFpbHMuCi0gICAgICAgICAgICByZXR1cm4gYnl0ZXMgPT0gIiIgPyBFbXB0eSA6IG5ldyBCeXRlU3RyaW5nKENvbnZlcnQuRnJvbUJhc2U2NFN0cmluZyhieXRlcykpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29uc3RydWN0cyBhIDxzZWUgY3JlZj0iQnl0ZVN0cmluZyIgLz4gZnJvbSB0aGUgZ2l2ZW4gYXJyYXkuIFRoZSBjb250ZW50cwotICAgICAgICAvLy8gYXJlIGNvcGllZCwgc28gZnVydGhlciBtb2RpZmljYXRpb25zIHRvIHRoZSBhcnJheSB3aWxsIG5vdAotICAgICAgICAvLy8gYmUgcmVmbGVjdGVkIGluIHRoZSByZXR1cm5lZCBCeXRlU3RyaW5nLgotICAgICAgICAvLy8gVGhpcyBtZXRob2QgY2FuIGFsc28gYmUgaW52b2tlZCBpbiA8Yz5CeXRlU3RyaW5nLkNvcHlGcm9tKDB4YWEsIDB4YmIsIC4uLik8L2M+IGZvcm0KLSAgICAgICAgLy8vIHdoaWNoIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHRlc3RpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBDb3B5RnJvbShwYXJhbXMgYnl0ZVtdIGJ5dGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcoKGJ5dGVbXSkgYnl0ZXMuQ2xvbmUoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgPHNlZSBjcmVmPSJCeXRlU3RyaW5nIiAvPiBmcm9tIGEgcG9ydGlvbiBvZiBhIGJ5dGUgYXJyYXkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBDb3B5RnJvbShieXRlW10gYnl0ZXMsIGludCBvZmZzZXQsIGludCBjb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIHBvcnRpb24gPSBuZXcgYnl0ZVtjb3VudF07Ci0gICAgICAgICAgICBCeXRlQXJyYXkuQ29weShieXRlcywgb2Zmc2V0LCBwb3J0aW9uLCAwLCBjb3VudCk7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcocG9ydGlvbik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IDxzZWUgY3JlZj0iQnl0ZVN0cmluZyIgLz4gYnkgZW5jb2RpbmcgdGhlIHNwZWNpZmllZCB0ZXh0IHdpdGgKLSAgICAgICAgLy8vIHRoZSBnaXZlbiBlbmNvZGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIENvcHlGcm9tKHN0cmluZyB0ZXh0LCBFbmNvZGluZyBlbmNvZGluZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKGVuY29kaW5nLkdldEJ5dGVzKHRleHQpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgPHNlZSBjcmVmPSJCeXRlU3RyaW5nIiAvPiBieSBlbmNvZGluZyB0aGUgc3BlY2lmaWVkIHRleHQgaW4gVVRGLTguCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBDb3B5RnJvbVV0Zjgoc3RyaW5nIHRleHQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb3B5RnJvbSh0ZXh0LCBFbmNvZGluZy5VVEY4KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVucyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBieXRlIHRoaXNbaW50IGluZGV4XQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gYnl0ZXNbaW5kZXhdOyB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGlzIDxzZWUgY3JlZj0iQnl0ZVN0cmluZyIvPiBpbnRvIGEgc3RyaW5nIGJ5IGFwcGx5aW5nIHRoZSBnaXZlbiBlbmNvZGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBjb252ZXJ0IGJpbmFyeSBkYXRhIHdoaWNoIHdhcyB0aGUgcmVzdWx0IG9mIGVuY29kaW5nCi0gICAgICAgIC8vLyB0ZXh0IHdpdGggdGhlIGdpdmVuIGVuY29kaW5nLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImVuY29kaW5nIj5UaGUgZW5jb2RpbmcgdG8gdXNlIHRvIGRlY29kZSB0aGUgYmluYXJ5IGRhdGEgaW50byB0ZXh0LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgcmVzdWx0IG9mIGRlY29kaW5nIHRoZSBiaW5hcnkgZGF0YSB3aXRoIHRoZSBnaXZlbiBkZWNvZGluZy48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9TdHJpbmcoRW5jb2RpbmcgZW5jb2RpbmcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBlbmNvZGluZy5HZXRTdHJpbmcoYnl0ZXMsIDAsIGJ5dGVzLkxlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGlzIDxzZWUgY3JlZj0iQnl0ZVN0cmluZyIvPiBpbnRvIGEgc3RyaW5nIGJ5IGFwcGx5aW5nIHRoZSBVVEYtOCBlbmNvZGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUgdXNlZCB0byBjb252ZXJ0IGJpbmFyeSBkYXRhIHdoaWNoIHdhcyB0aGUgcmVzdWx0IG9mIGVuY29kaW5nCi0gICAgICAgIC8vLyB0ZXh0IHdpdGggVVRGLTguCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgcmVzdWx0IG9mIGRlY29kaW5nIHRoZSBiaW5hcnkgZGF0YSB3aXRoIHRoZSBnaXZlbiBkZWNvZGluZy48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9TdHJpbmdVdGY4KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRvU3RyaW5nKEVuY29kaW5nLlVURjgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhbiBpdGVyYXRvciBvdmVyIHRoZSBieXRlcyBpbiB0aGlzIDxzZWUgY3JlZj0iQnl0ZVN0cmluZyIvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkFuIGl0ZXJhdG9yIG92ZXIgdGhlIGJ5dGVzIGluIHRoaXMgb2JqZWN0LjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPGJ5dGU+IEdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKChJRW51bWVyYWJsZTxieXRlPikgYnl0ZXMpLkdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYW4gaXRlcmF0b3Igb3ZlciB0aGUgYnl0ZXMgaW4gdGhpcyA8c2VlIGNyZWY9IkJ5dGVTdHJpbmciLz4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BbiBpdGVyYXRvciBvdmVyIHRoZSBieXRlcyBpbiB0aGlzIG9iamVjdC48L3JldHVybnM+Ci0gICAgICAgIElFbnVtZXJhdG9yIElFbnVtZXJhYmxlLkdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIENvZGVkSW5wdXRTdHJlYW0gZnJvbSB0aGlzIEJ5dGVTdHJpbmcncyBkYXRhLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgQ29kZWRJbnB1dFN0cmVhbSBDcmVhdGVDb2RlZElucHV0KCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gV2UgdHJ1c3QgQ29kZWRJbnB1dFN0cmVhbSBub3QgdG8gcmV2ZWFsIHRoZSBwcm92aWRlZCBieXRlIGFycmF5IG9yIG1vZGlmeSBpdAotICAgICAgICAgICAgcmV0dXJuIG5ldyBDb2RlZElucHV0U3RyZWFtKGJ5dGVzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXBhcmVzIHR3byBieXRlIHN0cmluZ3MgZm9yIGVxdWFsaXR5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxocyI+VGhlIGZpcnN0IGJ5dGUgc3RyaW5nIHRvIGNvbXBhcmUuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyaHMiPlRoZSBzZWNvbmQgYnl0ZSBzdHJpbmcgdG8gY29tcGFyZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PGM+dHJ1ZTwvYz4gaWYgdGhlIGJ5dGUgc3RyaW5ncyBhcmUgZXF1YWw7IGZhbHNlIG90aGVyd2lzZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBvcGVyYXRvciA9PShCeXRlU3RyaW5nIGxocywgQnl0ZVN0cmluZyByaHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMobGhzLCByaHMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhsaHMsIG51bGwpIHx8IFJlZmVyZW5jZUVxdWFscyhyaHMsIG51bGwpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsaHMuYnl0ZXMuTGVuZ3RoICE9IHJocy5ieXRlcy5MZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaHMuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHJocy5ieXRlc1tpXSAhPSBsaHMuYnl0ZXNbaV0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wYXJlcyB0d28gYnl0ZSBzdHJpbmdzIGZvciBpbmVxdWFsaXR5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxocyI+VGhlIGZpcnN0IGJ5dGUgc3RyaW5nIHRvIGNvbXBhcmUuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyaHMiPlRoZSBzZWNvbmQgYnl0ZSBzdHJpbmcgdG8gY29tcGFyZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PGM+ZmFsc2U8L2M+IGlmIHRoZSBieXRlIHN0cmluZ3MgYXJlIGVxdWFsOyB0cnVlIG90aGVyd2lzZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgYm9vbCBvcGVyYXRvciAhPShCeXRlU3RyaW5nIGxocywgQnl0ZVN0cmluZyByaHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAhKGxocyA9PSByaHMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcGFyZXMgdGhpcyBieXRlIHN0cmluZyB3aXRoIGFub3RoZXIgb2JqZWN0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im9iaiI+VGhlIG9iamVjdCB0byBjb21wYXJlIHRoaXMgd2l0aC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PGM+dHJ1ZTwvYz4gaWYgPHBhcmFtcmVmIG5hbWU9Im9iaiIvPiByZWZlcnMgdG8gYW4gZXF1YWwgPHNlZSBjcmVmPSJCeXRlU3RyaW5nIi8+OyA8Yz5mYWxzZTwvYz4gb3RoZXJ3aXNlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvYmopCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB0aGlzID09IChvYmogYXMgQnl0ZVN0cmluZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGEgaGFzaCBjb2RlIGZvciB0aGlzIG9iamVjdC4gVHdvIGVxdWFsIGJ5dGUgc3RyaW5ncwotICAgICAgICAvLy8gd2lsbCByZXR1cm4gdGhlIHNhbWUgaGFzaCBjb2RlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+QSBoYXNoIGNvZGUgZm9yIHRoaXMgb2JqZWN0LjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXQgPSAyMzsKLSAgICAgICAgICAgIGZvcmVhY2ggKGJ5dGUgYiBpbiBieXRlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXQgPSAocmV0IDw8IDgpIHwgYjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wYXJlcyB0aGlzIGJ5dGUgc3RyaW5nIHdpdGggYW5vdGhlci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdGhlciI+VGhlIDxzZWUgY3JlZj0iQnl0ZVN0cmluZyIvPiB0byBjb21wYXJlIHRoaXMgd2l0aC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+PGM+dHJ1ZTwvYz4gaWYgPHBhcmFtcmVmIG5hbWU9Im90aGVyIi8+IHJlZmVycyB0byBhbiBlcXVhbCBieXRlIHN0cmluZzsgPGM+ZmFsc2U8L2M+IG90aGVyd2lzZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBib29sIEVxdWFscyhCeXRlU3RyaW5nIG90aGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcyA9PSBvdGhlcjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFVzZWQgaW50ZXJuYWxseSBieSBDb2RlZE91dHB1dFN0cmVhbSB0byBhdm9pZCBjcmVhdGluZyBhIGNvcHkgZm9yIHRoZSB3cml0ZQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCB2b2lkIFdyaXRlUmF3Qnl0ZXNUbyhDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZVJhd0J5dGVzKGJ5dGVzLCAwLCBieXRlcy5MZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29waWVzIHRoZSBlbnRpcmUgYnl0ZSBhcnJheSB0byB0aGUgZGVzdGluYXRpb24gYXJyYXkgcHJvdmlkZWQgYXQgdGhlIG9mZnNldCBzcGVjaWZpZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhieXRlW10gYXJyYXksIGludCBwb3NpdGlvbikKLSAgICAgICAgewotICAgICAgICAgICAgQnl0ZUFycmF5LkNvcHkoYnl0ZXMsIDAsIGFycmF5LCBwb3NpdGlvbiwgYnl0ZXMuTGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyB0aGUgZW50aXJlIGJ5dGUgYXJyYXkgdG8gdGhlIHByb3ZpZGVkIHN0cmVhbQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKFN0cmVhbSBvdXRwdXRTdHJlYW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIG91dHB1dFN0cmVhbS5Xcml0ZShieXRlcywgMCwgYnl0ZXMuTGVuZ3RoKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzQ4NDQ1Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTI3NyArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5JTzsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVhZHMgYW5kIGRlY29kZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBUaGlzIGNsYXNzIGlzIGdlbmVyYWxseSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlIHRvIHJlYWQgYXBwcm9wcmlhdGUKLSAgICAvLy8gcHJpbWl0aXZlcyBmcm9tIHRoZSBzdHJlYW0uIEl0IGVmZmVjdGl2ZWx5IGVuY2Fwc3VsYXRlcyB0aGUgbG93ZXN0Ci0gICAgLy8vIGxldmVscyBvZiBwcm90b2NvbCBidWZmZXIgZm9ybWF0LgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBSZXBlYXRlZCBmaWVsZHMgYW5kIG1hcCBmaWVsZHMgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoaXMgY2xhc3M7IHVzZSA8c2VlIGNyZWY9IlJlcGVhdGVkRmllbGR7VH0iLz4KLSAgICAvLy8gYW5kIDxzZWUgY3JlZj0iTWFwRmllbGR7VEtleSwgVFZhbHVlfSIvPiB0byBzZXJpYWxpemUgc3VjaCBmaWVsZHMuCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbSA6IElEaXNwb3NhYmxlCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXaGV0aGVyIHRvIGxlYXZlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBvcGVuIHdoZW4gZGlzcG9zaW5nIG9mIHRoaXMgc3RyZWFtLgotICAgICAgICAvLy8gVGhpcyBpcyBhbHdheXMgdHJ1ZSB3aGVuIHRoZXJlJ3Mgbm8gc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgbGVhdmVPcGVuOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJ1ZmZlciBvZiBkYXRhIHJlYWQgZnJvbSB0aGUgc3RyZWFtIG9yIHByb3ZpZGVkIGF0IGNvbnN0cnVjdGlvbiB0aW1lLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBidWZmZXI7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGluZGV4IG9mIHRoZSBidWZmZXIgYXQgd2hpY2ggd2UgbmVlZCB0byByZWZpbGwgZnJvbSB0aGUgc3RyZWFtIChpZiB0aGVyZSBpcyBvbmUpLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIGludCBidWZmZXJTaXplOwotCi0gICAgICAgIHByaXZhdGUgaW50IGJ1ZmZlclNpemVBZnRlckxpbWl0ID0gMDsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXIgKGkuZS4gdGhlIG5leHQgYnl0ZSB0byByZWFkKQotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIGludCBidWZmZXJQb3MgPSAwOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBzdHJlYW0gdG8gcmVhZCBmdXJ0aGVyIGlucHV0IGZyb20sIG9yIG51bGwgaWYgdGhlIGJ5dGUgYXJyYXkgYnVmZmVyIHdhcyBwcm92aWRlZAotICAgICAgICAvLy8gZGlyZWN0bHkgb24gY29uc3RydWN0aW9uLCB3aXRoIG5vIGZ1cnRoZXIgZGF0YSBhdmFpbGFibGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU3RyZWFtIGlucHV0OwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBsYXN0IHRhZyB3ZSByZWFkLiAwIGluZGljYXRlcyB3ZSd2ZSByZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbQotICAgICAgICAvLy8gKG9yIGhhdmVuJ3QgcmVhZCBhbnl0aGluZyB5ZXQpLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHVpbnQgbGFzdFRhZyA9IDA7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIG5leHQgdGFnLCB1c2VkIHRvIHN0b3JlIHRoZSB2YWx1ZSByZWFkIGJ5IFBlZWtUYWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdWludCBuZXh0VGFnID0gMDsKLSAgICAgICAgcHJpdmF0ZSBib29sIGhhc05leHRUYWcgPSBmYWxzZTsKLQotICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgRGVmYXVsdFJlY3Vyc2lvbkxpbWl0ID0gNjQ7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IGludCBEZWZhdWx0U2l6ZUxpbWl0ID0gNjQgPDwgMjA7IC8vIDY0TUIKLSAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IEJ1ZmZlclNpemUgPSA0MDk2OwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBiZWZvcmUgdGhlIGN1cnJlbnQgYnVmZmVyLiBUaGUKLSAgICAgICAgLy8vIHRvdGFsIGJ5dGVzIHJlYWQgdXAgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24gY2FuIGJlIGNvbXB1dGVkIGFzCi0gICAgICAgIC8vLyB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBpbnQgdG90YWxCeXRlc1JldGlyZWQgPSAwOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+IAotICAgICAgICBwcml2YXRlIGludCBjdXJyZW50TGltaXQgPSBpbnQuTWF4VmFsdWU7Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgcmVjdXJzaW9uRGVwdGggPSAwOwotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IHJlY3Vyc2lvbkxpbWl0OwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCBzaXplTGltaXQ7Ci0KLSAgICAgICAgI3JlZ2lvbiBDb25zdHJ1Y3Rpb24KLSAgICAgICAgLy8gTm90ZSB0aGF0IHRoZSBjaGVja3MgYXJlIHBlcmZvcm1lZCBzdWNoIHRoYXQgd2UgZG9uJ3QgZW5kIHVwIGNoZWNraW5nIG9idmlvdXNseS12YWxpZCB0aGluZ3MKLSAgICAgICAgLy8gbGlrZSBub24tbnVsbCByZWZlcmVuY2VzIGZvciBhcnJheXMgd2UndmUganVzdCBjcmVhdGVkLgotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBhcnJheS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIENvZGVkSW5wdXRTdHJlYW0oYnl0ZVtdIGJ1ZmZlcikgOiB0aGlzKG51bGwsIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwoYnVmZmVyLCAiYnVmZmVyIiksIDAsIGJ1ZmZlci5MZW5ndGgpCi0gICAgICAgIHsgICAgICAgICAgICAKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgPHNlZSBjcmVmPSJDb2RlZElucHV0U3RyZWFtIi8+IHRoYXQgcmVhZHMgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBzbGljZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIENvZGVkSW5wdXRTdHJlYW0oYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgIDogdGhpcyhudWxsLCBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGJ1ZmZlciwgImJ1ZmZlciIpLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkKLSAgICAgICAgeyAgICAgICAgICAgIAotICAgICAgICAgICAgaWYgKG9mZnNldCA8IDAgfHwgb2Zmc2V0ID4gYnVmZmVyLkxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJvZmZzZXQiLCAiT2Zmc2V0IG11c3QgYmUgd2l0aGluIHRoZSBidWZmZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZW5ndGggPCAwIHx8IG9mZnNldCArIGxlbmd0aCA+IGJ1ZmZlci5MZW5ndGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigibGVuZ3RoIiwgIkxlbmd0aCBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgd2l0aGluIHRoZSBidWZmZXIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgPHNlZSBjcmVmPSJDb2RlZElucHV0U3RyZWFtIi8+IHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0sIHdoaWNoIHdpbGwgYmUgZGlzcG9zZWQKLSAgICAgICAgLy8vIHdoZW4gdGhlIHJldHVybmVkIG9iamVjdCBpcyBkaXNwb3NlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIHN0cmVhbSB0byByZWFkIGZyb20uPC9wYXJhbT4KLSAgICAgICAgcHVibGljIENvZGVkSW5wdXRTdHJlYW0oU3RyZWFtIGlucHV0KSA6IHRoaXMoaW5wdXQsIGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IDxzZWUgY3JlZj0iQ29kZWRJbnB1dFN0cmVhbSIvPiByZWFkaW5nIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0Ij5UaGUgc3RyZWFtIHRvIHJlYWQgZnJvbS48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxlYXZlT3BlbiI+PGM+dHJ1ZTwvYz4gdG8gbGVhdmUgPHBhcmFtcmVmIG5hbWU9ImlucHV0Ii8+IG9wZW4gd2hlbiB0aGUgcmV0dXJuZWQKLSAgICAgICAgLy8vIDxjIGNyZWY9IkNvZGVkSW5wdXRTdHJlYW0iLz4gaXMgZGlzcG9zZWQ7IDxjPmZhbHNlPC9jPiB0byBkaXNwb3NlIG9mIHRoZSBnaXZlbiBzdHJlYW0gd2hlbiB0aGUKLSAgICAgICAgLy8vIHJldHVybmVkIG9iamVjdCBpcyBkaXNwb3NlZC48L3BhcmFtPgotICAgICAgICBwdWJsaWMgQ29kZWRJbnB1dFN0cmVhbShTdHJlYW0gaW5wdXQsIGJvb2wgbGVhdmVPcGVuKQotICAgICAgICAgICAgOiB0aGlzKFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwoaW5wdXQsICJpbnB1dCIpLCBuZXcgYnl0ZVtCdWZmZXJTaXplXSwgMCwgMCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5sZWF2ZU9wZW4gPSBsZWF2ZU9wZW47Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSByZWFkaW5nIGRhdGEgZnJvbSB0aGUgZ2l2ZW4KLSAgICAgICAgLy8vIHN0cmVhbSBhbmQgYnVmZmVyLCB1c2luZyB0aGUgZGVmYXVsdCBsaW1pdHMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIENvZGVkSW5wdXRTdHJlYW0oU3RyZWFtIGlucHV0LCBieXRlW10gYnVmZmVyLCBpbnQgYnVmZmVyUG9zLCBpbnQgYnVmZmVyU2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5pbnB1dCA9IGlucHV0OwotICAgICAgICAgICAgdGhpcy5idWZmZXIgPSBidWZmZXI7Ci0gICAgICAgICAgICB0aGlzLmJ1ZmZlclBvcyA9IGJ1ZmZlclBvczsKLSAgICAgICAgICAgIHRoaXMuYnVmZmVyU2l6ZSA9IGJ1ZmZlclNpemU7Ci0gICAgICAgICAgICB0aGlzLnNpemVMaW1pdCA9IERlZmF1bHRTaXplTGltaXQ7Ci0gICAgICAgICAgICB0aGlzLnJlY3Vyc2lvbkxpbWl0ID0gRGVmYXVsdFJlY3Vyc2lvbkxpbWl0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHJlYWRpbmcgZGF0YSBmcm9tIHRoZSBnaXZlbgotICAgICAgICAvLy8gc3RyZWFtIGFuZCBidWZmZXIsIHVzaW5nIHRoZSBzcGVjaWZpZWQgbGltaXRzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIGNoYWlucyB0byB0aGUgdmVyc2lvbiB3aXRoIHRoZSBkZWZhdWx0IGxpbWl0cyBpbnN0ZWFkIG9mIHZpY2UgdmVyc2EgdG8gYXZvaWQKLSAgICAgICAgLy8vIGhhdmluZyB0byBjaGVjayB0aGF0IHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUgdmFsaWQgZXZlcnkgdGltZS4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgaW50ZXJuYWwgQ29kZWRJbnB1dFN0cmVhbShTdHJlYW0gaW5wdXQsIGJ5dGVbXSBidWZmZXIsIGludCBidWZmZXJQb3MsIGludCBidWZmZXJTaXplLCBpbnQgc2l6ZUxpbWl0LCBpbnQgcmVjdXJzaW9uTGltaXQpCi0gICAgICAgICAgICA6IHRoaXMoaW5wdXQsIGJ1ZmZlciwgYnVmZmVyUG9zLCBidWZmZXJTaXplKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoc2l6ZUxpbWl0IDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigic2l6ZUxpbWl0IiwgIlNpemUgbGltaXQgbXVzdCBiZSBwb3NpdGl2ZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbkxpbWl0IDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigicmVjdXJzaW9uTGltaXQhIiwgIlJlY3Vyc2lvbiBsaW1pdCBtdXN0IGJlIHBvc2l0aXZlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzLnNpemVMaW1pdCA9IHNpemVMaW1pdDsKLSAgICAgICAgICAgIHRoaXMucmVjdXJzaW9uTGltaXQgPSByZWN1cnNpb25MaW1pdDsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIDxzZWUgY3JlZj0iQ29kZWRJbnB1dFN0cmVhbSIvPiB3aXRoIHRoZSBzcGVjaWZpZWQgc2l6ZSBhbmQgcmVjdXJzaW9uIGxpbWl0cywgcmVhZGluZwotICAgICAgICAvLy8gZnJvbSBhbiBpbnB1dCBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGV4aXN0cyBzZXBhcmF0ZWx5IGZyb20gdGhlIGNvbnN0cnVjdG9yIHRvIHJlZHVjZSB0aGUgbnVtYmVyIG9mIGNvbnN0cnVjdG9yIG92ZXJsb2Fkcy4KLSAgICAgICAgLy8vIEl0IGlzIGxpa2VseSB0byBiZSB1c2VkIGNvbnNpZGVyYWJseSBsZXNzIGZyZXF1ZW50bHkgdGhhbiB0aGUgY29uc3RydWN0b3JzLCBhcyB0aGUgZGVmYXVsdCBsaW1pdHMKLSAgICAgICAgLy8vIGFyZSBzdWl0YWJsZSBmb3IgbW9zdCB1c2UgY2FzZXMuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzaXplTGltaXQiPlRoZSB0b3RhbCBsaW1pdCBvZiBkYXRhIHRvIHJlYWQgZnJvbSB0aGUgc3RyZWFtLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVjdXJzaW9uTGltaXQiPlRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aCB0byBhbGxvdyB3aGlsZSByZWFkaW5nLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIDxjPkNvZGVkSW5wdXRTdHJlYW08L2M+IHJlYWRpbmcgZnJvbSA8cGFyYW1yZWYgbmFtZT0iaW5wdXQiLz4gd2l0aCB0aGUgc3BlY2lmaWVkIHNpemUKLSAgICAgICAgLy8vIGFuZCByZWN1cnNpb24gbGltaXRzLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIENyZWF0ZVdpdGhMaW1pdHMoU3RyZWFtIGlucHV0LCBpbnQgc2l6ZUxpbWl0LCBpbnQgcmVjdXJzaW9uTGltaXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgQ29kZWRJbnB1dFN0cmVhbShpbnB1dCwgbmV3IGJ5dGVbQnVmZmVyU2l6ZV0sIDAsIDAsIHNpemVMaW1pdCwgcmVjdXJzaW9uTGltaXQpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgY3VycmVudCBwb3NpdGlvbiBpbiB0aGUgaW5wdXQgc3RyZWFtLCBvciB0aGUgcG9zaXRpb24gaW4gdGhlIGlucHV0IGJ1ZmZlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgbG9uZyBQb3NpdGlvbiAKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGlucHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gaW5wdXQuUG9zaXRpb24gLSAoKGJ1ZmZlclNpemUgKyBidWZmZXJTaXplQWZ0ZXJMaW1pdCkgLSBidWZmZXJQb3MpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnVmZmVyUG9zOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgbGFzdCB0YWcgcmVhZCwgb3IgMCBpZiBubyB0YWdzIGhhdmUgYmVlbiByZWFkIG9yIHdlJ3ZlIHJlYWQgYmV5b25kCi0gICAgICAgIC8vLyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHVpbnQgTGFzdFRhZyB7IGdldCB7IHJldHVybiBsYXN0VGFnOyB9IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBzaXplIGxpbWl0IGZvciB0aGlzIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhpcyBsaW1pdCBpcyBhcHBsaWVkIHdoZW4gcmVhZGluZyBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgYXMgYSBzYW5pdHkgY2hlY2suIEl0IGlzCi0gICAgICAgIC8vLyBub3QgYXBwbGllZCB3aGVuIHJlYWRpbmcgZnJvbSBhIGJ5dGUgYXJyYXkgZGF0YSBzb3VyY2Ugd2l0aG91dCBhbiB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICAgICAgLy8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIDY0TUIuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBUaGUgc2l6ZSBsaW1pdC4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBpbnQgU2l6ZUxpbWl0IHsgZ2V0IHsgcmV0dXJuIHNpemVMaW1pdDsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgcmVjdXJzaW9uIGxpbWl0IGZvciB0aGlzIHN0cmVhbS4gVGhpcyBsaW1pdCBpcyBhcHBsaWVkIHdoaWxzdCByZWFkaW5nIG1lc3NhZ2VzLAotICAgICAgICAvLy8gdG8gYXZvaWQgbWFsaWNpb3VzbHktcmVjdXJzaXZlIGRhdGEuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0LgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAvLy8gVGhlIHJlY3Vyc2lvbiBsaW1pdCBmb3IgdGhpcyBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgaW50IFJlY3Vyc2lvbkxpbWl0IHsgZ2V0IHsgcmV0dXJuIHJlY3Vyc2lvbkxpbWl0OyB9IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEaXNwb3NlcyBvZiB0aGlzIGluc3RhbmNlLCBwb3RlbnRpYWxseSBjbG9zaW5nIGFueSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gQXMgdGhlcmUgaXMgbm8gZmx1c2hpbmcgdG8gcGVyZm9ybSBoZXJlLCBkaXNwb3Npbmcgb2YgYSA8c2VlIGNyZWY9IkNvZGVkSW5wdXRTdHJlYW0iLz4gd2hpY2gKLSAgICAgICAgLy8vIHdhcyBjb25zdHJ1Y3RlZCB3aXRoIHRoZSA8Yz5sZWF2ZU9wZW48L2M+IG9wdGlvbiBwYXJhbWV0ZXIgc2V0IHRvIDxjPnRydWU8L2M+IChvciBvbmUgd2hpY2gKLSAgICAgICAgLy8vIHdhcyBjb25zdHJ1Y3RlZCB0byByZWFkIGZyb20gYSBieXRlIGFycmF5KSBoYXMgbm8gZWZmZWN0LgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICBwdWJsaWMgdm9pZCBEaXNwb3NlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFsZWF2ZU9wZW4pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW5wdXQuRGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBWYWxpZGF0aW9uCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZlcmlmaWVzIHRoYXQgdGhlIGxhc3QgY2FsbCB0byBSZWFkVGFnKCkgcmV0dXJuZWQgdGFnIDAgLSBpbiBvdGhlciB3b3JkcywKLSAgICAgICAgLy8vIHdlJ3ZlIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHdoZW4gd2UgZXhwZWN0ZWQgdG8uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiI+VGhlIAotICAgICAgICAvLy8gdGFnIHJlYWQgd2FzIG5vdCB0aGUgb25lIHNwZWNpZmllZDwvZXhjZXB0aW9uPgotICAgICAgICBpbnRlcm5hbCB2b2lkIENoZWNrUmVhZEVuZE9mU3RyZWFtVGFnKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxhc3RUYWcgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uTW9yZURhdGFBdmFpbGFibGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBSZWFkaW5nIG9mIHRhZ3MgZXRjCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGVla3MgYXQgdGhlIG5leHQgZmllbGQgdGFnLiBUaGlzIGlzIGxpa2UgY2FsbGluZyA8c2VlIGNyZWY9IlJlYWRUYWciLz4sIGJ1dCB0aGUKLSAgICAgICAgLy8vIHRhZyBpcyBub3QgY29uc3VtZWQuIChTbyBhIHN1YnNlcXVlbnQgY2FsbCB0byA8c2VlIGNyZWY9IlJlYWRUYWciLz4gd2lsbCByZXR1cm4gdGhlCi0gICAgICAgIC8vLyBzYW1lIHZhbHVlLikKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHVpbnQgUGVla1RhZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChoYXNOZXh0VGFnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0VGFnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB1aW50IHNhdmVkTGFzdCA9IGxhc3RUYWc7Ci0gICAgICAgICAgICBuZXh0VGFnID0gUmVhZFRhZygpOwotICAgICAgICAgICAgaGFzTmV4dFRhZyA9IHRydWU7Ci0gICAgICAgICAgICBsYXN0VGFnID0gc2F2ZWRMYXN0OyAvLyBVbmRvIHRoZSBzaWRlIGVmZmVjdCBvZiBSZWFkVGFnCi0gICAgICAgICAgICByZXR1cm4gbmV4dFRhZzsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgZmllbGQgdGFnLCByZXR1cm5pbmcgdGhlIHRhZyBvZiAwIGZvciAiZW5kIG9mIHN0cmVhbSIuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIElmIHRoaXMgbWV0aG9kIHJldHVybnMgMCwgaXQgZG9lc24ndCBuZWNlc3NhcmlseSBtZWFuIHRoZSBlbmQgb2YgYWxsCi0gICAgICAgIC8vLyB0aGUgZGF0YSBpbiB0aGlzIENvZGVkSW5wdXRTdHJlYW07IGl0IG1heSBiZSB0aGUgZW5kIG9mIHRoZSBsb2dpY2FsIHN0cmVhbQotICAgICAgICAvLy8gZm9yIGFuIGVtYmVkZGVkIG1lc3NhZ2UsIGZvciBleGFtcGxlLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5leHQgZmllbGQgdGFnLCBvciAwIGZvciBlbmQgb2Ygc3RyZWFtLiAoMCBpcyBuZXZlciBhIHZhbGlkIHRhZy4pPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgdWludCBSZWFkVGFnKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGhhc05leHRUYWcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbGFzdFRhZyA9IG5leHRUYWc7Ci0gICAgICAgICAgICAgICAgaGFzTmV4dFRhZyA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHJldHVybiBsYXN0VGFnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBPcHRpbWl6ZSBmb3IgdGhlIGluY3JlZGlibHkgY29tbW9uIGNhc2Ugb2YgaGF2aW5nIGF0IGxlYXN0IHR3byBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIsCi0gICAgICAgICAgICAvLyBhbmQgdGhvc2UgdHdvIGJ5dGVzIGJlaW5nIGVub3VnaCB0byBnZXQgdGhlIHRhZy4gVGhpcyB3aWxsIGJlIHRydWUgZm9yIGZpZWxkcyB1cCB0byA0MDk1LgotICAgICAgICAgICAgaWYgKGJ1ZmZlclBvcyArIDIgPD0gYnVmZmVyU2l6ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgdG1wID0gYnVmZmVyW2J1ZmZlclBvcysrXTsKLSAgICAgICAgICAgICAgICBpZiAodG1wIDwgMTI4KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFRhZyA9ICh1aW50KXRtcDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IHRtcCAmIDB4N2Y7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodG1wID0gYnVmZmVyW2J1ZmZlclBvcysrXSkgPCAxMjgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgNzsKLSAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RUYWcgPSAodWludCkgcmVzdWx0OwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgLy8gTm9wZSwgcmV3aW5kIGFuZCBnbyB0aGUgcG90ZW50aWFsbHkgc2xvdyByb3V0ZS4KLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyAtPSAyOwotICAgICAgICAgICAgICAgICAgICAgICAgbGFzdFRhZyA9IFJlYWRSYXdWYXJpbnQzMigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChJc0F0RW5kKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbGFzdFRhZyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOyAvLyBUaGlzIGlzIHRoZSBvbmx5IGNhc2UgaW4gd2hpY2ggd2UgcmV0dXJuIDAuCi0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgbGFzdFRhZyA9IFJlYWRSYXdWYXJpbnQzMigpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGxhc3RUYWcgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBJZiB3ZSBhY3R1YWxseSByZWFkIHplcm8sIHRoYXQncyBub3QgYSB2YWxpZCB0YWcuCi0gICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkludmFsaWRUYWcoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBsYXN0VGFnOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2tpcHMgdGhlIGRhdGEgZm9yIHRoZSBmaWVsZCB3aXRoIHRoZSB0YWcgd2UndmUganVzdCByZWFkLgotICAgICAgICAvLy8gVGhpcyBzaG91bGQgYmUgY2FsbGVkIGRpcmVjdGx5IGFmdGVyIDxzZWUgY3JlZj0iUmVhZFRhZyIvPiwgd2hlbgotICAgICAgICAvLy8gdGhlIGNhbGxlciB3aXNoZXMgdG8gc2tpcCBhbiB1bmtub3duIGZpZWxkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIG1ldGhvZCB0aHJvd3MgPHNlZSBjcmVmPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iLz4gaWYgdGhlIGxhc3QtcmVhZCB0YWcgd2FzIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICAgIC8vLyBJZiBhIGNhbGxlciB3aXNoZXMgdG8gc2tpcCBhIGdyb3VwLCB0aGV5IHNob3VsZCBza2lwIHRoZSB3aG9sZSBncm91cCwgYnkgY2FsbGluZyB0aGlzIG1ldGhvZCBhZnRlciByZWFkaW5nIHRoZQotICAgICAgICAvLy8gc3RhcnQtZ3JvdXAgdGFnLiBUaGlzIGJlaGF2aW9yIGFsbG93cyBjYWxsZXJzIHRvIGNhbGwgdGhpcyBtZXRob2Qgb24gYW55IGZpZWxkIHRoZXkgZG9uJ3QgdW5kZXJzdGFuZCwgY29ycmVjdGx5Ci0gICAgICAgIC8vLyByZXN1bHRpbmcgaW4gYW4gZXJyb3IgaWYgYW4gZW5kLWdyb3VwIHRhZyBoYXMgbm90IGJlZW4gcGFpcmVkIHdpdGggYW4gZWFybGllciBzdGFydC1ncm91cCB0YWcuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiI+VGhlIGxhc3QgdGFnIHdhcyBhbiBlbmQtZ3JvdXAgdGFnPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iPlRoZSBsYXN0IHJlYWQgb3BlcmF0aW9uIHJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgbG9naWNhbCBzdHJlYW08L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIHZvaWQgU2tpcExhc3RGaWVsZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChsYXN0VGFnID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlNraXBMYXN0RmllbGQgY2Fubm90IGJlIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGEgc3RyZWFtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzd2l0Y2ggKFdpcmVGb3JtYXQuR2V0VGFnV2lyZVR5cGUobGFzdFRhZykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLlN0YXJ0R3JvdXA6Ci0gICAgICAgICAgICAgICAgICAgIFNraXBHcm91cChsYXN0VGFnKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLkVuZEdyb3VwOgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlNraXBMYXN0RmllbGQgY2FsbGVkIG9uIGFuIGVuZC1ncm91cCB0YWcsIGluZGljYXRpbmcgdGhhdCB0aGUgY29ycmVzcG9uZGluZyBzdGFydC1ncm91cCB3YXMgbWlzc2luZyIpOwotICAgICAgICAgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XaXJlVHlwZS5GaXhlZDMyOgotICAgICAgICAgICAgICAgICAgICBSZWFkRml4ZWQzMigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQ2NDoKLSAgICAgICAgICAgICAgICAgICAgUmVhZEZpeGVkNjQoKTsKLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZDoKLSAgICAgICAgICAgICAgICAgICAgdmFyIGxlbmd0aCA9IFJlYWRMZW5ndGgoKTsKLSAgICAgICAgICAgICAgICAgICAgU2tpcFJhd0J5dGVzKGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQ6Ci0gICAgICAgICAgICAgICAgICAgIFJlYWRSYXdWYXJpbnQzMigpOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBTa2lwR3JvdXAodWludCBzdGFydEdyb3VwVGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RlOiBDdXJyZW50bHkgd2UgZXhwZWN0IHRoaXMgdG8gYmUgdGhlIHdheSB0aGF0IGdyb3VwcyBhcmUgcmVhZC4gV2UgY291bGQgcHV0IHRoZSByZWN1cnNpb24KLSAgICAgICAgICAgIC8vIGRlcHRoIGNoYW5nZXMgaW50byB0aGUgUmVhZFRhZyBtZXRob2QgaW5zdGVhZCwgcG90ZW50aWFsbHkuLi4KLSAgICAgICAgICAgIHJlY3Vyc2lvbkRlcHRoKys7Ci0gICAgICAgICAgICBpZiAocmVjdXJzaW9uRGVwdGggPj0gcmVjdXJzaW9uTGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgICAgd2hpbGUgKHRydWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGFnID0gUmVhZFRhZygpOwotICAgICAgICAgICAgICAgIGlmICh0YWcgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIENhbid0IGNhbGwgU2tpcExhc3RGaWVsZCBmb3IgdGhpcyBjYXNlLSB0aGF0IHdvdWxkIHRocm93LgotICAgICAgICAgICAgICAgIGlmIChXaXJlRm9ybWF0LkdldFRhZ1dpcmVUeXBlKHRhZykgPT0gV2lyZUZvcm1hdC5XaXJlVHlwZS5FbmRHcm91cCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBUaGlzIHJlY3Vyc2lvbiB3aWxsIGFsbG93IHVzIHRvIGhhbmRsZSBuZXN0ZWQgZ3JvdXBzLgotICAgICAgICAgICAgICAgIFNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCBzdGFydEZpZWxkID0gV2lyZUZvcm1hdC5HZXRUYWdGaWVsZE51bWJlcihzdGFydEdyb3VwVGFnKTsKLSAgICAgICAgICAgIGludCBlbmRGaWVsZCA9IFdpcmVGb3JtYXQuR2V0VGFnRmllbGROdW1iZXIodGFnKTsKLSAgICAgICAgICAgIGlmIChzdGFydEZpZWxkICE9IGVuZEZpZWxkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICQiTWlzbWF0Y2hlZCBlbmQtZ3JvdXAgdGFnLiBTdGFydGVkIHdpdGggZmllbGQge3N0YXJ0RmllbGR9OyBlbmRlZCB3aXRoIGZpZWxkIHtlbmRGaWVsZH0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJlY3Vyc2lvbkRlcHRoLS07Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhIGRvdWJsZSBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBkb3VibGUgUmVhZERvdWJsZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBCaXRDb252ZXJ0ZXIuSW50NjRCaXRzVG9Eb3VibGUoKGxvbmcpIFJlYWRSYXdMaXR0bGVFbmRpYW42NCgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgZmxvYXQgZmllbGQgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZmxvYXQgUmVhZEZsb2F0KCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKEJpdENvbnZlcnRlci5Jc0xpdHRsZUVuZGlhbiAmJiA0IDw9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmxvYXQgcmV0ID0gQml0Q29udmVydGVyLlRvU2luZ2xlKGJ1ZmZlciwgYnVmZmVyUG9zKTsKLSAgICAgICAgICAgICAgICBidWZmZXJQb3MgKz0gNDsKLSAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGVbXSByYXdCeXRlcyA9IFJlYWRSYXdCeXRlcyg0KTsKLSAgICAgICAgICAgICAgICBpZiAoIUJpdENvbnZlcnRlci5Jc0xpdHRsZUVuZGlhbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5SZXZlcnNlKHJhd0J5dGVzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEJpdENvbnZlcnRlci5Ub1NpbmdsZShyYXdCeXRlcywgMCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhIHVpbnQ2NCBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB1bG9uZyBSZWFkVUludDY0KCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFJlYWRSYXdWYXJpbnQ2NCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVhZHMgYW4gaW50NjQgZmllbGQgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgbG9uZyBSZWFkSW50NjQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGxvbmcpIFJlYWRSYXdWYXJpbnQ2NCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVhZHMgYW4gaW50MzIgZmllbGQgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFJlYWRJbnQzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoaW50KSBSZWFkUmF3VmFyaW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgZml4ZWQ2NCBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB1bG9uZyBSZWFkRml4ZWQ2NCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBSZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgZml4ZWQzMiBmaWVsZCBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB1aW50IFJlYWRGaXhlZDMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFJlYWRSYXdMaXR0bGVFbmRpYW4zMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVhZHMgYSBib29sIGZpZWxkIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgUmVhZEJvb2woKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gUmVhZFJhd1ZhcmludDMyKCkgIT0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgc3RyaW5nIGZpZWxkIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBSZWFkU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxlbmd0aCA9IFJlYWRMZW5ndGgoKTsKLSAgICAgICAgICAgIC8vIE5vIG5lZWQgdG8gcmVhZCBhbnkgZGF0YSBmb3IgYW4gZW1wdHkgc3RyaW5nLgotICAgICAgICAgICAgaWYgKGxlbmd0aCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAiIjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChsZW5ndGggPD0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCi0gICAgICAgICAgICAgICAgLy8gICBqdXN0IGNvcHkgZGlyZWN0bHkgZnJvbSBpdC4KLSAgICAgICAgICAgICAgICBTdHJpbmcgcmVzdWx0ID0gQ29kZWRPdXRwdXRTdHJlYW0uVXRmOEVuY29kaW5nLkdldFN0cmluZyhidWZmZXIsIGJ1ZmZlclBvcywgbGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBidWZmZXJQb3MgKz0gbGVuZ3RoOwotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBTbG93IHBhdGg6IEJ1aWxkIGEgYnl0ZSBhcnJheSBmaXJzdCB0aGVuIGNvcHkgaXQuCi0gICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uVXRmOEVuY29kaW5nLkdldFN0cmluZyhSZWFkUmF3Qnl0ZXMobGVuZ3RoKSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIAotICAgICAgICBwdWJsaWMgdm9pZCBSZWFkTWVzc2FnZShJTWVzc2FnZSBidWlsZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gUmVhZExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5SZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnQgb2xkTGltaXQgPSBQdXNoTGltaXQobGVuZ3RoKTsKLSAgICAgICAgICAgICsrcmVjdXJzaW9uRGVwdGg7Ci0gICAgICAgICAgICBidWlsZGVyLk1lcmdlRnJvbSh0aGlzKTsKLSAgICAgICAgICAgIENoZWNrUmVhZEVuZE9mU3RyZWFtVGFnKCk7Ci0gICAgICAgICAgICAvLyBDaGVjayB0aGF0IHdlJ3ZlIHJlYWQgZXhhY3RseSBhcyBtdWNoIGRhdGEgYXMgZXhwZWN0ZWQuCi0gICAgICAgICAgICBpZiAoIVJlYWNoZWRMaW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLS1yZWN1cnNpb25EZXB0aDsKLSAgICAgICAgICAgIFBvcExpbWl0KG9sZExpbWl0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgYnl0ZXMgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIAotICAgICAgICBwdWJsaWMgQnl0ZVN0cmluZyBSZWFkQnl0ZXMoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgbGVuZ3RoID0gUmVhZExlbmd0aCgpOwotICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zICYmIGxlbmd0aCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRmFzdCBwYXRoOiAgV2UgYWxyZWFkeSBoYXZlIHRoZSBieXRlcyBpbiBhIGNvbnRpZ3VvdXMgYnVmZmVyLCBzbwotICAgICAgICAgICAgICAgIC8vICAganVzdCBjb3B5IGRpcmVjdGx5IGZyb20gaXQuCi0gICAgICAgICAgICAgICAgQnl0ZVN0cmluZyByZXN1bHQgPSBCeXRlU3RyaW5nLkNvcHlGcm9tKGJ1ZmZlciwgYnVmZmVyUG9zLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyArPSBsZW5ndGg7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgYW5kIGF0dGFjaCBpdCB0byBhIG5ldyBCeXRlU3RyaW5nLgotICAgICAgICAgICAgICAgIHJldHVybiBCeXRlU3RyaW5nLkF0dGFjaEJ5dGVzKFJlYWRSYXdCeXRlcyhsZW5ndGgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgdWludDMyIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAKLSAgICAgICAgcHVibGljIHVpbnQgUmVhZFVJbnQzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBSZWFkUmF3VmFyaW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGFuIGVudW0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiBJZiB0aGUgZW51bSBpcyB2YWxpZCBmb3IgdHlwZSBULAotICAgICAgICAvLy8gdGhlbiB0aGUgcmVmIHZhbHVlIGlzIHNldCBhbmQgaXQgcmV0dXJucyB0cnVlLiAgT3RoZXJ3aXNlIHRoZSB1bmtub3duIG91dHB1dAotICAgICAgICAvLy8gdmFsdWUgaXMgc2V0IGFuZCB0aGlzIG1ldGhvZCByZXR1cm5zIGZhbHNlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIAotICAgICAgICBwdWJsaWMgaW50IFJlYWRFbnVtKCkKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQ3VycmVudGx5IGp1c3QgYSBwYXNzLXRocm91Z2gsIGJ1dCBpdCdzIG5pY2UgdG8gc2VwYXJhdGUgaXQgbG9naWNhbGx5IGZyb20gV3JpdGVJbnQzMi4KLSAgICAgICAgICAgIHJldHVybiAoaW50KSBSZWFkUmF3VmFyaW50MzIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGFuIHNmaXhlZDMyIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAKLSAgICAgICAgcHVibGljIGludCBSZWFkU0ZpeGVkMzIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkgUmVhZFJhd0xpdHRsZUVuZGlhbjMyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhbiBzZml4ZWQ2NCBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+ICAgCi0gICAgICAgIHB1YmxpYyBsb25nIFJlYWRTRml4ZWQ2NCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAobG9uZykgUmVhZFJhd0xpdHRsZUVuZGlhbjY0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhbiBzaW50MzIgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PiAgIAotICAgICAgICBwdWJsaWMgaW50IFJlYWRTSW50MzIoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRGVjb2RlWmlnWmFnMzIoUmVhZFJhd1ZhcmludDMyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVhZHMgYW4gc2ludDY0IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4gICAKLSAgICAgICAgcHVibGljIGxvbmcgUmVhZFNJbnQ2NCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBEZWNvZGVaaWdaYWc2NChSZWFkUmF3VmFyaW50NjQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhIGxlbmd0aCBmb3IgbGVuZ3RoLWRlbGltaXRlZCBkYXRhLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIGlzIGludGVybmFsbHkganVzdCByZWFkaW5nIGEgdmFyaW50LCBidXQgdGhpcyBtZXRob2QgZXhpc3RzCi0gICAgICAgIC8vLyB0byBtYWtlIHRoZSBjYWxsaW5nIGNvZGUgY2xlYXJlci4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIGludCBSZWFkTGVuZ3RoKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChpbnQpIFJlYWRSYXdWYXJpbnQzMigpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGVla3MgYXQgdGhlIG5leHQgdGFnIGluIHRoZSBzdHJlYW0uIElmIGl0IG1hdGNoZXMgPHBhcmFtcmVmIG5hbWU9InRhZyIvPiwKLSAgICAgICAgLy8vIHRoZSB0YWcgaXMgY29uc3VtZWQgYW5kIHRoZSBtZXRob2QgcmV0dXJucyA8Yz50cnVlPC9jPjsgb3RoZXJ3aXNlLCB0aGUKLSAgICAgICAgLy8vIHN0cmVhbSBpcyBsZWZ0IGluIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBhbmQgdGhlIG1ldGhvZCByZXR1cm5zIDxjPmZhbHNlPC9jPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgTWF5YmVDb25zdW1lVGFnKHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUGVla1RhZygpID09IHRhZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYXNOZXh0VGFnID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgI3JlZ2lvbiBVbmRlcmx5aW5nIHJlYWRpbmcgcHJpbWl0aXZlcwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNhbWUgY29kZSBhcyBSZWFkUmF3VmFyaW50MzIsIGJ1dCByZWFkIGVhY2ggYnl0ZSBpbmRpdmlkdWFsbHksIGNoZWNraW5nIGZvcgotICAgICAgICAvLy8gYnVmZmVyIG92ZXJmbG93LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHVpbnQgU2xvd1JlYWRSYXdWYXJpbnQzMigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCB0bXAgPSBSZWFkUmF3Qnl0ZSgpOwotICAgICAgICAgICAgaWYgKHRtcCA8IDEyOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQpIHRtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCByZXN1bHQgPSB0bXAgJiAweDdmOwotICAgICAgICAgICAgaWYgKCh0bXAgPSBSZWFkUmF3Qnl0ZSgpKSA8IDEyOCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCA3OwotICAgICAgICAgICAgICAgIGlmICgodG1wID0gUmVhZFJhd0J5dGUoKSkgPCAxMjgpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDE0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDE0OwotICAgICAgICAgICAgICAgICAgICBpZiAoKHRtcCA9IFJlYWRSYXdCeXRlKCkpIDwgMTI4KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDIxOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCAyMTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAodG1wID0gUmVhZFJhd0J5dGUoKSkgPDwgMjg7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAodG1wID49IDEyOCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEaXNjYXJkIHVwcGVyIDMyIGJpdHMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFJhd0J5dGUoKSA8IDEyOCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50KSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLk1hbGZvcm1lZFZhcmludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICh1aW50KSByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhIHJhdyBWYXJpbnQgZnJvbSB0aGUgc3RyZWFtLiAgSWYgbGFyZ2VyIHRoYW4gMzIgYml0cywgZGlzY2FyZCB0aGUgdXBwZXIgYml0cy4KLSAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGlzIG9wdGltaXNlZCBmb3IgdGhlIGNhc2Ugd2hlcmUgd2UndmUgZ290IGxvdHMgb2YgZGF0YSBpbiB0aGUgYnVmZmVyLgotICAgICAgICAvLy8gVGhhdCBtZWFucyB3ZSBjYW4gY2hlY2sgdGhlIHNpemUganVzdCBvbmNlLCB0aGVuIGp1c3QgcmVhZCBkaXJlY3RseSBmcm9tIHRoZSBidWZmZXIKLSAgICAgICAgLy8vIHdpdGhvdXQgY29uc3RhbnQgcmVjaGVja2luZyBvZiB0aGUgYnVmZmVyIGxlbmd0aC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgdWludCBSZWFkUmF3VmFyaW50MzIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoYnVmZmVyUG9zICsgNSA+IGJ1ZmZlclNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFNsb3dSZWFkUmF3VmFyaW50MzIoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50IHRtcCA9IGJ1ZmZlcltidWZmZXJQb3MrK107Ci0gICAgICAgICAgICBpZiAodG1wIDwgMTI4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgdG1wOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW50IHJlc3VsdCA9IHRtcCAmIDB4N2Y7Ci0gICAgICAgICAgICBpZiAoKHRtcCA9IGJ1ZmZlcltidWZmZXJQb3MrK10pIDwgMTI4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDc7Ci0gICAgICAgICAgICAgICAgaWYgKCh0bXAgPSBidWZmZXJbYnVmZmVyUG9zKytdKSA8IDEyOCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMTQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgMTQ7Ci0gICAgICAgICAgICAgICAgICAgIGlmICgodG1wID0gYnVmZmVyW2J1ZmZlclBvcysrXSkgPCAxMjgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMjE7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDIxOwotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh0bXAgPSBidWZmZXJbYnVmZmVyUG9zKytdKSA8PCAyODsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh0bXAgPj0gMTI4KQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERpc2NhcmQgdXBwZXIgMzIgYml0cy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBoYXMgdG8gdXNlIFJlYWRSYXdCeXRlKCkgYXMgd2Ugb25seSBlbnN1cmUgd2UndmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnb3QgYXQgbGVhc3QgNSBieXRlcyBhdCB0aGUgc3RhcnQgb2YgdGhlIG1ldGhvZC4gVGhpcyBsZXRzIHVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdXNlIHRoZSBmYXN0IHBhdGggaW4gbW9yZSBjYXNlcywgYW5kIHdlIHJhcmVseSBoaXQgdGhpcyBzZWN0aW9uIG9mIGNvZGUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoUmVhZFJhd0J5dGUoKSA8IDEyOCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50KSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLk1hbGZvcm1lZFZhcmludCgpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICh1aW50KSByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhIHZhcmludCBmcm9tIHRoZSBpbnB1dCBvbmUgYnl0ZSBhdCBhIHRpbWUsIHNvIHRoYXQgaXQgZG9lcyBub3QKLSAgICAgICAgLy8vIHJlYWQgYW55IGJ5dGVzIGFmdGVyIHRoZSBlbmQgb2YgdGhlIHZhcmludC4gSWYgeW91IHNpbXBseSB3cmFwcGVkIHRoZQotICAgICAgICAvLy8gc3RyZWFtIGluIGEgQ29kZWRJbnB1dFN0cmVhbSBhbmQgdXNlZCBSZWFkUmF3VmFyaW50MzIoU3RyZWFtKQotICAgICAgICAvLy8gdGhlbiB5b3Ugd291bGQgcHJvYmFibHkgZW5kIHVwIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2YXJpbnQgc2luY2UKLSAgICAgICAgLy8vIENvZGVkSW5wdXRTdHJlYW0gYnVmZmVycyBpdHMgaW5wdXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyB1aW50IFJlYWRSYXdWYXJpbnQzMihTdHJlYW0gaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgICAgICAgaW50IG9mZnNldCA9IDA7Ci0gICAgICAgICAgICBmb3IgKDsgb2Zmc2V0IDwgMzI7IG9mZnNldCArPSA3KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBiID0gaW5wdXQuUmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYiA9PSAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IG9mZnNldDsKLSAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1aW50KSByZXN1bHQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gS2VlcCByZWFkaW5nIHVwIHRvIDY0IGJpdHMuCi0gICAgICAgICAgICBmb3IgKDsgb2Zmc2V0IDwgNjQ7IG9mZnNldCArPSA3KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBiID0gaW5wdXQuUmVhZEJ5dGUoKTsKLSAgICAgICAgICAgICAgICBpZiAoYiA9PSAtMSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICgoYiAmIDB4ODApID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVpbnQpIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uTWFsZm9ybWVkVmFyaW50KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhIHJhdyB2YXJpbnQgZnJvbSB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCB1bG9uZyBSZWFkUmF3VmFyaW50NjQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgc2hpZnQgPSAwOwotICAgICAgICAgICAgdWxvbmcgcmVzdWx0ID0gMDsKLSAgICAgICAgICAgIHdoaWxlIChzaGlmdCA8IDY0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ5dGUgYiA9IFJlYWRSYXdCeXRlKCk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0IHw9ICh1bG9uZykgKGIgJiAweDdGKSA8PCBzaGlmdDsKLSAgICAgICAgICAgICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc2hpZnQgKz0gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5NYWxmb3JtZWRWYXJpbnQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHVpbnQgUmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkKLSAgICAgICAgewotICAgICAgICAgICAgdWludCBiMSA9IFJlYWRSYXdCeXRlKCk7Ci0gICAgICAgICAgICB1aW50IGIyID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVpbnQgYjMgPSBSZWFkUmF3Qnl0ZSgpOwotICAgICAgICAgICAgdWludCBiNCA9IFJlYWRSYXdCeXRlKCk7Ci0gICAgICAgICAgICByZXR1cm4gYjEgfCAoYjIgPDwgOCkgfCAoYjMgPDwgMTYpIHwgKGI0IDw8IDI0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGEgNjQtYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHVsb25nIFJlYWRSYXdMaXR0bGVFbmRpYW42NCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVsb25nIGIxID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVsb25nIGIyID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVsb25nIGIzID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVsb25nIGI0ID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVsb25nIGI1ID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVsb25nIGI2ID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVsb25nIGI3ID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHVsb25nIGI4ID0gUmVhZFJhd0J5dGUoKTsKLSAgICAgICAgICAgIHJldHVybiBiMSB8IChiMiA8PCA4KSB8IChiMyA8PCAxNikgfCAoYjQgPDwgMjQpCi0gICAgICAgICAgICAgICAgICAgfCAoYjUgPDwgMzIpIHwgKGI2IDw8IDQwKSB8IChiNyA8PCA0OCkgfCAoYjggPDwgNTYpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGVjb2RlIGEgMzItYml0IHZhbHVlIHdpdGggWmlnWmFnIGVuY29kaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkKLSAgICAgICAgLy8vIGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLCBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSAKLSAgICAgICAgLy8vIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwgdGh1cyBhbHdheXMgdGFraW5nCi0gICAgICAgIC8vLyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBpbnQgRGVjb2RlWmlnWmFnMzIodWludCBuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKGludCkobiA+PiAxKSBeIC0oaW50KShuICYgMSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZWNvZGUgYSAzMi1iaXQgdmFsdWUgd2l0aCBaaWdaYWcgZW5jb2RpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFppZ1phZyBlbmNvZGVzIHNpZ25lZCBpbnRlZ2VycyBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseQotICAgICAgICAvLy8gZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIAotICAgICAgICAvLy8gc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLCB0aHVzIGFsd2F5cyB0YWtpbmcKLSAgICAgICAgLy8vIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIGxvbmcgRGVjb2RlWmlnWmFnNjQodWxvbmcgbikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChsb25nKShuID4+IDEpIF4gLShsb25nKShuICYgMSk7Ci0gICAgICAgIH0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgICNyZWdpb24gSW50ZXJuYWwgcmVhZGluZyBhbmQgYnVmZmVyIG1hbmFnZW1lbnQKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZXRzIGN1cnJlbnRMaW1pdCB0byAoY3VycmVudCBwb3NpdGlvbikgKyBieXRlTGltaXQuIFRoaXMgaXMgY2FsbGVkCi0gICAgICAgIC8vLyB3aGVuIGRlc2NlbmRpbmcgaW50byBhIGxlbmd0aC1kZWxpbWl0ZWQgZW1iZWRkZWQgbWVzc2FnZS4gVGhlIHByZXZpb3VzCi0gICAgICAgIC8vLyBsaW1pdCBpcyByZXR1cm5lZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBvbGQgbGltaXQuPC9yZXR1cm5zPgotICAgICAgICBpbnRlcm5hbCBpbnQgUHVzaExpbWl0KGludCBieXRlTGltaXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChieXRlTGltaXQgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5OZWdhdGl2ZVNpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ5dGVMaW1pdCArPSB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKLSAgICAgICAgICAgIGludCBvbGRMaW1pdCA9IGN1cnJlbnRMaW1pdDsKLSAgICAgICAgICAgIGlmIChieXRlTGltaXQgPiBvbGRMaW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY3VycmVudExpbWl0ID0gYnl0ZUxpbWl0OwotCi0gICAgICAgICAgICBSZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpOwotCi0gICAgICAgICAgICByZXR1cm4gb2xkTGltaXQ7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgUmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICBidWZmZXJTaXplICs9IGJ1ZmZlclNpemVBZnRlckxpbWl0OwotICAgICAgICAgICAgaW50IGJ1ZmZlckVuZCA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgIGlmIChidWZmZXJFbmQgPiBjdXJyZW50TGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTGltaXQgaXMgaW4gY3VycmVudCBidWZmZXIuCi0gICAgICAgICAgICAgICAgYnVmZmVyU2l6ZUFmdGVyTGltaXQgPSBidWZmZXJFbmQgLSBjdXJyZW50TGltaXQ7Ci0gICAgICAgICAgICAgICAgYnVmZmVyU2l6ZSAtPSBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXJTaXplQWZ0ZXJMaW1pdCA9IDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEaXNjYXJkcyB0aGUgY3VycmVudCBsaW1pdCwgcmV0dXJuaW5nIHRoZSBwcmV2aW91cyBsaW1pdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBQb3BMaW1pdChpbnQgb2xkTGltaXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGN1cnJlbnRMaW1pdCA9IG9sZExpbWl0OwotICAgICAgICAgICAgUmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgd2hldGhlciBvciBub3QgYWxsIHRoZSBkYXRhIGJlZm9yZSB0aGUgbGltaXQgaGFzIGJlZW4gcmVhZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBSZWFjaGVkTGltaXQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGN1cnJlbnRMaW1pdCA9PSBpbnQuTWF4VmFsdWUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBjdXJyZW50QWJzb2x1dGVQb3NpdGlvbiA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zOwotICAgICAgICAgICAgICAgIHJldHVybiBjdXJyZW50QWJzb2x1dGVQb3NpdGlvbiA+PSBjdXJyZW50TGltaXQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gVGhpcyBpcyB0aGUKLSAgICAgICAgLy8vIGNhc2UgaWYgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHVuZGVybHlpbmcgaW5wdXQgc291cmNlIGhhcyBiZWVuIHJlYWNoZWQgb3IKLSAgICAgICAgLy8vIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgYSBsaW1pdCBjcmVhdGVkIHVzaW5nIFB1c2hMaW1pdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSXNBdEVuZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gYnVmZmVyUG9zID09IGJ1ZmZlclNpemUgJiYgIVJlZmlsbEJ1ZmZlcihmYWxzZSk7IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENhbGxlZCB3aGVuIGJ1ZmZlciBpcyBlbXB0eSB0byByZWFkIG1vcmUgYnl0ZXMgZnJvbSB0aGUKLSAgICAgICAgLy8vIGlucHV0LiAgSWYgPHBhcmFtcmVmIG5hbWU9Im11c3RTdWNjZWVkIi8+IGlzIHRydWUsIFJlZmlsbEJ1ZmZlcigpIGd1cmFudGVlcyB0aGF0Ci0gICAgICAgIC8vLyBlaXRoZXIgdGhlcmUgd2lsbCBiZSBhdCBsZWFzdCBvbmUgYnl0ZSBpbiB0aGUgYnVmZmVyIHdoZW4gaXQgcmV0dXJucwotICAgICAgICAvLy8gb3IgaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uICBJZiA8cGFyYW1yZWYgbmFtZT0ibXVzdFN1Y2NlZWQiLz4gaXMgZmFsc2UsCi0gICAgICAgIC8vLyBSZWZpbGxCdWZmZXIoKSByZXR1cm5zIGZhbHNlIGlmIG5vIG1vcmUgYnl0ZXMgd2VyZSBhdmFpbGFibGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibXVzdFN1Y2NlZWQiPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHByaXZhdGUgYm9vbCBSZWZpbGxCdWZmZXIoYm9vbCBtdXN0U3VjY2VlZCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZmZlclBvcyA8IGJ1ZmZlclNpemUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlJlZmlsbEJ1ZmZlcigpIGNhbGxlZCB3aGVuIGJ1ZmZlciB3YXNuJ3QgZW1wdHkuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclNpemUgPT0gY3VycmVudExpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE9vcHMsIHdlIGhpdCBhIGxpbWl0LgotICAgICAgICAgICAgICAgIGlmIChtdXN0U3VjY2VlZCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRvdGFsQnl0ZXNSZXRpcmVkICs9IGJ1ZmZlclNpemU7Ci0KLSAgICAgICAgICAgIGJ1ZmZlclBvcyA9IDA7Ci0gICAgICAgICAgICBidWZmZXJTaXplID0gKGlucHV0ID09IG51bGwpID8gMCA6IGlucHV0LlJlYWQoYnVmZmVyLCAwLCBidWZmZXIuTGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChidWZmZXJTaXplIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3RyZWFtLlJlYWQgcmV0dXJuZWQgYSBuZWdhdGl2ZSBjb3VudCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGJ1ZmZlclNpemUgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobXVzdFN1Y2NlZWQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlY29tcHV0ZUJ1ZmZlclNpemVBZnRlckxpbWl0KCk7Ci0gICAgICAgICAgICAgICAgaW50IHRvdGFsQnl0ZXNSZWFkID0KLSAgICAgICAgICAgICAgICAgICAgdG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJTaXplICsgYnVmZmVyU2l6ZUFmdGVyTGltaXQ7Ci0gICAgICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkID4gc2l6ZUxpbWl0IHx8IHRvdGFsQnl0ZXNSZWFkIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5TaXplTGltaXRFeGNlZWRlZCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWQgb25lIGJ5dGUgZnJvbSB0aGUgaW5wdXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiI+Ci0gICAgICAgIC8vLyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gb3IgdGhlIGN1cnJlbnQgbGltaXQgd2FzIHJlYWNoZWQKLSAgICAgICAgLy8vIDwvZXhjZXB0aW9uPgotICAgICAgICBpbnRlcm5hbCBieXRlIFJlYWRSYXdCeXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZmZlclBvcyA9PSBidWZmZXJTaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZmlsbEJ1ZmZlcih0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBidWZmZXJbYnVmZmVyUG9zKytdOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVhZHMgYSBmaXhlZCBzaXplIG9mIGJ5dGVzIGZyb20gdGhlIGlucHV0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iPgotICAgICAgICAvLy8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIG9yIHRoZSBjdXJyZW50IGxpbWl0IHdhcyByZWFjaGVkCi0gICAgICAgIC8vLyA8L2V4Y2VwdGlvbj4KLSAgICAgICAgaW50ZXJuYWwgYnl0ZVtdIFJlYWRSYXdCeXRlcyhpbnQgc2l6ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHNpemUgPCAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5OZWdhdGl2ZVNpemUoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zICsgc2l6ZSA+IGN1cnJlbnRMaW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSAodXAgdG8gdGhlIGN1cnJlbnQgbGltaXQpIGFueXdheS4KLSAgICAgICAgICAgICAgICBTa2lwUmF3Qnl0ZXMoY3VycmVudExpbWl0IC0gdG90YWxCeXRlc1JldGlyZWQgLSBidWZmZXJQb3MpOwotICAgICAgICAgICAgICAgIC8vIFRoZW4gZmFpbC4KLSAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoc2l6ZSA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFdlIGhhdmUgYWxsIHRoZSBieXRlcyB3ZSBuZWVkIGFscmVhZHkuCi0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICAgICAgICAgICAgQnl0ZUFycmF5LkNvcHkoYnVmZmVyLCBidWZmZXJQb3MsIGJ5dGVzLCAwLCBzaXplKTsKLSAgICAgICAgICAgICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmIChzaXplIDwgYnVmZmVyLkxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBSZWFkaW5nIG1vcmUgYnl0ZXMgdGhhbiBhcmUgaW4gdGhlIGJ1ZmZlciwgYnV0IG5vdCBhbiBleGNlc3NpdmUgbnVtYmVyCi0gICAgICAgICAgICAgICAgLy8gb2YgYnl0ZXMuICBXZSBjYW4gc2FmZWx5IGFsbG9jYXRlIHRoZSByZXN1bHRpbmcgYXJyYXkgYWhlYWQgb2YgdGltZS4KLQotICAgICAgICAgICAgICAgIC8vIEZpcnN0IGNvcHkgd2hhdCB3ZSBoYXZlLgotICAgICAgICAgICAgICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOwotICAgICAgICAgICAgICAgIGludCBwb3MgPSBidWZmZXJTaXplIC0gYnVmZmVyUG9zOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KGJ1ZmZlciwgYnVmZmVyUG9zLCBieXRlcywgMCwgcG9zKTsKLSAgICAgICAgICAgICAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOwotCi0gICAgICAgICAgICAgICAgLy8gV2Ugd2FudCB0byB1c2UgUmVmaWxsQnVmZmVyKCkgYW5kIHRoZW4gY29weSBmcm9tIHRoZSBidWZmZXIgaW50byBvdXIKLSAgICAgICAgICAgICAgICAvLyBieXRlIGFycmF5IHJhdGhlciB0aGFuIHJlYWRpbmcgZGlyZWN0bHkgaW50byBvdXIgYnl0ZSBhcnJheSBiZWNhdXNlCi0gICAgICAgICAgICAgICAgLy8gdGhlIGlucHV0IG1heSBiZSB1bmJ1ZmZlcmVkLgotICAgICAgICAgICAgICAgIFJlZmlsbEJ1ZmZlcih0cnVlKTsKLQotICAgICAgICAgICAgICAgIHdoaWxlIChzaXplIC0gcG9zID4gYnVmZmVyU2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEJ1ZmZlci5CbG9ja0NvcHkoYnVmZmVyLCAwLCBieXRlcywgcG9zLCBidWZmZXJTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgcG9zICs9IGJ1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyA9IGJ1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgICAgIFJlZmlsbEJ1ZmZlcih0cnVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBCeXRlQXJyYXkuQ29weShidWZmZXIsIDAsIGJ5dGVzLCBwb3MsIHNpemUgLSBwb3MpOwotICAgICAgICAgICAgICAgIGJ1ZmZlclBvcyA9IHNpemUgLSBwb3M7Ci0KLSAgICAgICAgICAgICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNpemUgaXMgdmVyeSBsYXJnZS4gIEZvciBzZWN1cml0eSByZWFzb25zLCB3ZSBjYW4ndCBhbGxvY2F0ZSB0aGUKLSAgICAgICAgICAgICAgICAvLyBlbnRpcmUgYnl0ZSBhcnJheSB5ZXQuICBUaGUgc2l6ZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBpbnB1dCwgc28gYQotICAgICAgICAgICAgICAgIC8vIG1hbGljaW91c2x5LWNyYWZ0ZWQgbWVzc2FnZSBjb3VsZCBwcm92aWRlIGEgYm9ndXMgdmVyeSBsYXJnZSBzaXplIGluCi0gICAgICAgICAgICAgICAgLy8gb3JkZXIgdG8gdHJpY2sgdGhlIGFwcCBpbnRvIGFsbG9jYXRpbmcgYSBsb3Qgb2YgbWVtb3J5LiAgV2UgYXZvaWQgdGhpcwotICAgICAgICAgICAgICAgIC8vIGJ5IGFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgb25seSBhIHNtYWxsIGNodW5rIGF0IGEgdGltZSwgc28gdGhhdCB0aGUKLSAgICAgICAgICAgICAgICAvLyBtYWxpY2lvdXMgbWVzc2FnZSBtdXN0IGFjdHVhbGx5ICpiZSogZXh0cmVtZWx5IGxhcmdlIHRvIGNhdXNlCi0gICAgICAgICAgICAgICAgLy8gcHJvYmxlbXMuICBNZWFud2hpbGUsIHdlIGxpbWl0IHRoZSBhbGxvd2VkIHNpemUgb2YgYSBtZXNzYWdlIGVsc2V3aGVyZS4KLQotICAgICAgICAgICAgICAgIC8vIFJlbWVtYmVyIHRoZSBidWZmZXIgbWFya2VycyBzaW5jZSB3ZSdsbCBoYXZlIHRvIGNvcHkgdGhlIGJ5dGVzIG91dCBvZgotICAgICAgICAgICAgICAgIC8vIGl0IGxhdGVyLgotICAgICAgICAgICAgICAgIGludCBvcmlnaW5hbEJ1ZmZlclBvcyA9IGJ1ZmZlclBvczsKLSAgICAgICAgICAgICAgICBpbnQgb3JpZ2luYWxCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKLQotICAgICAgICAgICAgICAgIC8vIE1hcmsgdGhlIGN1cnJlbnQgYnVmZmVyIGNvbnN1bWVkLgotICAgICAgICAgICAgICAgIHRvdGFsQnl0ZXNSZXRpcmVkICs9IGJ1ZmZlclNpemU7Ci0gICAgICAgICAgICAgICAgYnVmZmVyUG9zID0gMDsKLSAgICAgICAgICAgICAgICBidWZmZXJTaXplID0gMDsKLQotICAgICAgICAgICAgICAgIC8vIFJlYWQgYWxsIHRoZSByZXN0IG9mIHRoZSBieXRlcyB3ZSBuZWVkLgotICAgICAgICAgICAgICAgIGludCBzaXplTGVmdCA9IHNpemUgLSAob3JpZ2luYWxCdWZmZXJTaXplIC0gb3JpZ2luYWxCdWZmZXJQb3MpOwotICAgICAgICAgICAgICAgIExpc3Q8Ynl0ZVtdPiBjaHVua3MgPSBuZXcgTGlzdDxieXRlW10+KCk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAoc2l6ZUxlZnQgPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGNodW5rID0gbmV3IGJ5dGVbTWF0aC5NaW4oc2l6ZUxlZnQsIGJ1ZmZlci5MZW5ndGgpXTsKLSAgICAgICAgICAgICAgICAgICAgaW50IHBvcyA9IDA7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlIChwb3MgPCBjaHVuay5MZW5ndGgpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBuID0gKGlucHV0ID09IG51bGwpID8gLTEgOiBpbnB1dC5SZWFkKGNodW5rLCBwb3MsIGNodW5rLkxlbmd0aCAtIHBvcyk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAobiA8PSAwKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBuOwotICAgICAgICAgICAgICAgICAgICAgICAgcG9zICs9IG47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgc2l6ZUxlZnQgLT0gY2h1bmsuTGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBjaHVua3MuQWRkKGNodW5rKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBPSywgZ290IGV2ZXJ5dGhpbmcuICBOb3cgY29uY2F0ZW5hdGUgaXQgYWxsIGludG8gb25lIGJ1ZmZlci4KLSAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKLQotICAgICAgICAgICAgICAgIC8vIFN0YXJ0IGJ5IGNvcHlpbmcgdGhlIGxlZnRvdmVyIGJ5dGVzIGZyb20gdGhpcy5idWZmZXIuCi0gICAgICAgICAgICAgICAgaW50IG5ld1BvcyA9IG9yaWdpbmFsQnVmZmVyU2l6ZSAtIG9yaWdpbmFsQnVmZmVyUG9zOwotICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KGJ1ZmZlciwgb3JpZ2luYWxCdWZmZXJQb3MsIGJ5dGVzLCAwLCBuZXdQb3MpOwotCi0gICAgICAgICAgICAgICAgLy8gQW5kIG5vdyBhbGwgdGhlIGNodW5rcy4KLSAgICAgICAgICAgICAgICBmb3JlYWNoIChieXRlW10gY2h1bmsgaW4gY2h1bmtzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQnVmZmVyLkJsb2NrQ29weShjaHVuaywgMCwgYnl0ZXMsIG5ld1BvcywgY2h1bmsuTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICAgICAgbmV3UG9zICs9IGNodW5rLkxlbmd0aDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBEb25lLgotICAgICAgICAgICAgICAgIHJldHVybiBieXRlczsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlYWRzIGFuZCBkaXNjYXJkcyA8cGFyYW1yZWYgbmFtZT0ic2l6ZSIvPiBieXRlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIj50aGUgZW5kIG9mIHRoZSBzdHJlYW0KLSAgICAgICAgLy8vIG9yIHRoZSBjdXJyZW50IGxpbWl0IHdhcyByZWFjaGVkPC9leGNlcHRpb24+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBTa2lwUmF3Qnl0ZXMoaW50IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChzaXplIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uTmVnYXRpdmVTaXplKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmICh0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvcyArIHNpemUgPiBjdXJyZW50TGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gUmVhZCB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYW55d2F5LgotICAgICAgICAgICAgICAgIFNraXBSYXdCeXRlcyhjdXJyZW50TGltaXQgLSB0b3RhbEJ5dGVzUmV0aXJlZCAtIGJ1ZmZlclBvcyk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlbiBmYWlsLgotICAgICAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5UcnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChzaXplIDw9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSBhbGwgdGhlIGJ5dGVzIHdlIG5lZWQgYWxyZWFkeS4KLSAgICAgICAgICAgICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBTa2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gYXJlIGluIHRoZSBidWZmZXIuICBGaXJzdCBza2lwIHdoYXQgd2UgaGF2ZS4KLSAgICAgICAgICAgICAgICBpbnQgcG9zID0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvczsKLQotICAgICAgICAgICAgICAgIC8vIFJPSyA1LzcvMjAxMyBJc3N1ZSAjNTQ6IHNob3VsZCByZXRpcmUgYWxsIGJ5dGVzIGluIGJ1ZmZlciAoYnVmZmVyU2l6ZSkKLSAgICAgICAgICAgICAgICAvLyB0b3RhbEJ5dGVzUmV0aXJlZCArPSBwb3M7Ci0gICAgICAgICAgICAgICAgdG90YWxCeXRlc1JldGlyZWQgKz0gYnVmZmVyU2l6ZTsKLSAgICAgICAgICAgICAgICAKLSAgICAgICAgICAgICAgICBidWZmZXJQb3MgPSAwOwotICAgICAgICAgICAgICAgIGJ1ZmZlclNpemUgPSAwOwotCi0gICAgICAgICAgICAgICAgLy8gVGhlbiBza2lwIGRpcmVjdGx5IGZyb20gdGhlIElucHV0U3RyZWFtIGZvciB0aGUgcmVzdC4KLSAgICAgICAgICAgICAgICBpZiAocG9zIDwgc2l6ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChpbnB1dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIFNraXBJbXBsKHNpemUgLSBwb3MpOwotICAgICAgICAgICAgICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBzaXplIC0gcG9zOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFic3RyYWN0aW9uIG9mIHNraXBwaW5nIHRvIGNvcGUgd2l0aCBzdHJlYW1zIHdoaWNoIGNhbid0IHJlYWxseSBza2lwLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHZvaWQgU2tpcEltcGwoaW50IGFtb3VudFRvU2tpcCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGlucHV0LkNhblNlZWspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbG9uZyBwcmV2aW91c1Bvc2l0aW9uID0gaW5wdXQuUG9zaXRpb247Ci0gICAgICAgICAgICAgICAgaW5wdXQuUG9zaXRpb24gKz0gYW1vdW50VG9Ta2lwOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dC5Qb3NpdGlvbiAhPSBwcmV2aW91c1Bvc2l0aW9uICsgYW1vdW50VG9Ta2lwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLlRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIHNraXBCdWZmZXIgPSBuZXcgYnl0ZVtNYXRoLk1pbigxMDI0LCBhbW91bnRUb1NraXApXTsKLSAgICAgICAgICAgICAgICB3aGlsZSAoYW1vdW50VG9Ta2lwID4gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGludCBieXRlc1JlYWQgPSBpbnB1dC5SZWFkKHNraXBCdWZmZXIsIDAsIE1hdGguTWluKHNraXBCdWZmZXIuTGVuZ3RoLCBhbW91bnRUb1NraXApKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGJ5dGVzUmVhZCA8PSAwKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uVHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGFtb3VudFRvU2tpcCAtPSBieXRlc1JlYWQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU2l6ZS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjI5MzdjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzA0ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vIFRoaXMgcGFydCBvZiBDb2RlZE91dHB1dFN0cmVhbSBwcm92aWRlcyBhbGwgdGhlIHN0YXRpYyBlbnRyeSBwb2ludHMgdGhhdCBhcmUgdXNlZAotICAgIC8vIGJ5IGdlbmVyYXRlZCBjb2RlIGFuZCBpbnRlcm5hbGx5IHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgbWVzc2FnZXMgcHJpb3IgdG8gYmVpbmcKLSAgICAvLyB3cml0dGVuIHRvIGFuIGluc3RhbmNlIG9mIENvZGVkT3V0cHV0U3RyZWFtLgotICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBDb2RlZE91dHB1dFN0cmVhbQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgTGl0dGxlRW5kaWFuNjRTaXplID0gODsKLSAgICAgICAgcHJpdmF0ZSBjb25zdCBpbnQgTGl0dGxlRW5kaWFuMzJTaXplID0gNDsgICAgICAgIAotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICAgICAgLy8vIGRvdWJsZSBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVEb3VibGVTaXplKGRvdWJsZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExpdHRsZUVuZGlhbjY0U2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICAgICAgLy8vIGZsb2F0IGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUZsb2F0U2l6ZShmbG9hdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExpdHRsZUVuZGlhbjMyU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICAgICAgLy8vIHVpbnQ2NCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVVSW50NjRTaXplKHVsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVJhd1ZhcmludDY0U2l6ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgICAgICAvLy8gaW50NjQgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlSW50NjRTaXplKGxvbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50NjRTaXplKCh1bG9uZykgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICAgICAgLy8vIGludDMyIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUludDMyU2l6ZShpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA+PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50MzJTaXplKCh1aW50KSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICAgICAgICAgICAgICByZXR1cm4gMTA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAgICAgIC8vLyBmaXhlZDY0IGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZUZpeGVkNjRTaXplKHVsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTGl0dGxlRW5kaWFuNjRTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgICAgICAvLy8gZml4ZWQzMiBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVGaXhlZDMyU2l6ZSh1aW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gTGl0dGxlRW5kaWFuMzJTaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgICAgICAvLy8gYm9vbCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVCb29sU2l6ZShib29sIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICAgICAgLy8vIHN0cmluZyBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVTdHJpbmdTaXplKFN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGJ5dGVBcnJheVNpemUgPSBVdGY4RW5jb2RpbmcuR2V0Qnl0ZUNvdW50KHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybiBDb21wdXRlTGVuZ3RoU2l6ZShieXRlQXJyYXlTaXplKSArIGJ5dGVBcnJheVNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAgICAgIC8vLyBncm91cCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVHcm91cFNpemUoSU1lc3NhZ2UgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiB2YWx1ZS5DYWxjdWxhdGVTaXplKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgICAgICAvLy8gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVNZXNzYWdlU2l6ZShJTWVzc2FnZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IHNpemUgPSB2YWx1ZS5DYWxjdWxhdGVTaXplKCk7Ci0gICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUxlbmd0aFNpemUoc2l6ZSkgKyBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgICAgICAvLy8gYnl0ZXMgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlQnl0ZXNTaXplKEJ5dGVTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb21wdXRlTGVuZ3RoU2l6ZSh2YWx1ZS5MZW5ndGgpICsgdmFsdWUuTGVuZ3RoOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgICAgICAvLy8gdWludDMyIGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZVVJbnQzMlNpemUodWludCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgICAgICAvLy8gZW51bSBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCi0gICAgICAgIC8vLyBjb252ZXJ0aW5nIHRoZSBlbnVtIHZhbHVlIHRvIGl0cyBudW1lcmljIHZhbHVlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlRW51bVNpemUoaW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDdXJyZW50bHkganVzdCBhIHBhc3MtdGhyb3VnaCwgYnV0IGl0J3MgbmljZSB0byBzZXBhcmF0ZSBpdCBsb2dpY2FsbHkuCi0gICAgICAgICAgICByZXR1cm4gQ29tcHV0ZUludDMyU2l6ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgICAgICAvLy8gc2ZpeGVkMzIgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlU0ZpeGVkMzJTaXplKGludCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExpdHRsZUVuZGlhbjMyU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAgICAgIC8vLyBzZml4ZWQ2NCBmaWVsZCwgaW5jbHVkaW5nIHRoZSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVTRml4ZWQ2NFNpemUobG9uZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIExpdHRsZUVuZGlhbjY0U2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAgICAgIC8vLyBzaW50MzIgZmllbGQsIGluY2x1ZGluZyB0aGUgdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlU0ludDMyU2l6ZShpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBDb21wdXRlUmF3VmFyaW50MzJTaXplKEVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wdXRlcyB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgICAgICAvLy8gc2ludDY0IGZpZWxkLCBpbmNsdWRpbmcgdGhlIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBpbnQgQ29tcHV0ZVNJbnQ2NFNpemUobG9uZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVSYXdWYXJpbnQ2NFNpemUoRW5jb2RlWmlnWmFnNjQodmFsdWUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEgbGVuZ3RoLAotICAgICAgICAvLy8gYXMgd3JpdHRlbiBieSA8c2VlIGNyZWY9IldyaXRlTGVuZ3RoIi8+LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlTGVuZ3RoU2l6ZShpbnQgbGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgodWludCkgbGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbXB1dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEgdmFyaW50LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBDb21wdXRlUmF3VmFyaW50MzJTaXplKHVpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCA3KSkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCAxNCkpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmYgPDwgMjEpKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDI4KSkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiA1OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB2YXJpbnQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVSYXdWYXJpbnQ2NFNpemUodWxvbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA3KSkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAxNCkpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMjEpKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAzOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDI4KSkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAzNSkpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNDIpKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiA2OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDQ5KSkgPT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA1NikpID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNjMpKSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiA5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIDEwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgaW50IENvbXB1dGVUYWdTaXplKGludCBmaWVsZE51bWJlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIENvbXB1dGVSYXdWYXJpbnQzMlNpemUoV2lyZUZvcm1hdC5NYWtlVGFnKGZpZWxkTnVtYmVyLCAwKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW0uY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODI3ZjAzOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbS5jcworKysgL2Rldi9udWxsCkBAIC0xLDc2MSArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uVGV4dDsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRW5jb2RlcyBhbmQgd3JpdGVzIHByb3RvY29sIG1lc3NhZ2UgZmllbGRzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyA8cGFyYT4KLSAgICAvLy8gVGhpcyBjbGFzcyBpcyBnZW5lcmFsbHkgdXNlZCBieSBnZW5lcmF0ZWQgY29kZSB0byB3cml0ZSBhcHByb3ByaWF0ZQotICAgIC8vLyBwcmltaXRpdmVzIHRvIHRoZSBzdHJlYW0uIEl0IGVmZmVjdGl2ZWx5IGVuY2Fwc3VsYXRlcyB0aGUgbG93ZXN0Ci0gICAgLy8vIGxldmVscyBvZiBwcm90b2NvbCBidWZmZXIgZm9ybWF0LiBVbmxpa2Ugc29tZSBvdGhlciBpbXBsZW1lbnRhdGlvbnMsCi0gICAgLy8vIHRoaXMgZG9lcyBub3QgaW5jbHVkZSBjb21iaW5lZCAid3JpdGUgdGFnIGFuZCB2YWx1ZSIgbWV0aG9kcy4gR2VuZXJhdGVkCi0gICAgLy8vIGNvZGUga25vd3MgdGhlIGV4YWN0IGJ5dGUgcmVwcmVzZW50YXRpb25zIG9mIHRoZSB0YWdzIHRoZXkncmUgZ29pbmcgdG8gd3JpdGUsCi0gICAgLy8vIHNvIHRoZXJlJ3Mgbm8gbmVlZCB0byByZS1lbmNvZGUgdGhlbSBlYWNoIHRpbWUuIE1hbnVhbGx5LXdyaXR0ZW4gY29kZSBjYWxsaW5nCi0gICAgLy8vIHRoaXMgY2xhc3Mgc2hvdWxkIGp1c3QgY2FsbCBvbmUgb2YgdGhlIDxjPldyaXRlVGFnPC9jPiBvdmVybG9hZHMgYmVmb3JlIGVhY2ggdmFsdWUuCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPHBhcmE+Ci0gICAgLy8vIFJlcGVhdGVkIGZpZWxkcyBhbmQgbWFwIGZpZWxkcyBhcmUgbm90IGhhbmRsZWQgYnkgdGhpcyBjbGFzczsgdXNlIDxjPlJlcGVhdGVkRmllbGQmbHQ7VCZndDs8L2M+Ci0gICAgLy8vIGFuZCA8Yz5NYXBGaWVsZCZsdDtUS2V5LCBUVmFsdWUmZ3Q7PC9jPiB0byBzZXJpYWxpemUgc3VjaCBmaWVsZHMuCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBDb2RlZE91dHB1dFN0cmVhbSA6IElEaXNwb3NhYmxlCi0gICAgewotICAgICAgICAvLyAiTG9jYWwiIGNvcHkgb2YgRW5jb2RpbmcuVVRGOCwgZm9yIGVmZmljaWVuY3kuIChZZXMsIGl0IG1ha2VzIGEgZGlmZmVyZW5jZS4pCi0gICAgICAgIGludGVybmFsIHN0YXRpYyByZWFkb25seSBFbmNvZGluZyBVdGY4RW5jb2RpbmcgPSBFbmNvZGluZy5VVEY4OwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBidWZmZXIgc2l6ZSB1c2VkIGJ5IENyZWF0ZUluc3RhbmNlKFN0cmVhbSkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgcmVhZG9ubHkgaW50IERlZmF1bHRCdWZmZXJTaXplID0gNDA5NjsKLQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJvb2wgbGVhdmVPcGVuOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGJ5dGVbXSBidWZmZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGxpbWl0OwotICAgICAgICBwcml2YXRlIGludCBwb3NpdGlvbjsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTdHJlYW0gb3V0cHV0OwotCi0gICAgICAgICNyZWdpb24gQ29uc3RydWN0aW9uCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0gdGhhdCB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlIGdpdmVuCi0gICAgICAgIC8vLyBieXRlIGFycmF5LiBJZiBtb3JlIGJ5dGVzIGFyZSB3cml0dGVuIHRoYW4gZml0IGluIHRoZSBhcnJheSwKLSAgICAgICAgLy8vIE91dE9mU3BhY2VFeGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBDb2RlZE91dHB1dFN0cmVhbShieXRlW10gZmxhdEFycmF5KSA6IHRoaXMoZmxhdEFycmF5LCAwLCBmbGF0QXJyYXkuTGVuZ3RoKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IENvZGVkT3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBnaXZlbgotICAgICAgICAvLy8gYnl0ZSBhcnJheSBzbGljZS4gSWYgbW9yZSBieXRlcyBhcmUgd3JpdHRlbiB0aGFuIGZpdCBpbiB0aGUgYXJyYXksCi0gICAgICAgIC8vLyBPdXRPZlNwYWNlRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIENvZGVkT3V0cHV0U3RyZWFtKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0ID0gbnVsbDsKLSAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IG9mZnNldDsKLSAgICAgICAgICAgIHRoaXMubGltaXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0gICAgICAgICAgICBsZWF2ZU9wZW4gPSB0cnVlOyAvLyBTaW1wbGUgd2F5IG9mIGF2b2lkaW5nIHRyeWluZyB0byBkaXNwb3NlIG9mIGEgbnVsbCByZWZlcmVuY2UKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgQ29kZWRPdXRwdXRTdHJlYW0oU3RyZWFtIG91dHB1dCwgYnl0ZVtdIGJ1ZmZlciwgYm9vbCBsZWF2ZU9wZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMub3V0cHV0ID0gUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChvdXRwdXQsIG5hbWVvZihvdXRwdXQpKTsKLSAgICAgICAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgICAgICAgICAgdGhpcy5wb3NpdGlvbiA9IDA7Ci0gICAgICAgICAgICB0aGlzLmxpbWl0ID0gYnVmZmVyLkxlbmd0aDsKLSAgICAgICAgICAgIHRoaXMubGVhdmVPcGVuID0gbGVhdmVPcGVuOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyA8c2VlIGNyZWY9IkNvZGVkT3V0cHV0U3RyZWFtIiAvPiB3aGljaCB3cml0ZSB0byB0aGUgZ2l2ZW4gc3RyZWFtLCBhbmQgZGlzcG9zZXMgb2YgdGhhdAotICAgICAgICAvLy8gc3RyZWFtIHdoZW4gdGhlIHJldHVybmVkIDxjPkNvZGVkT3V0cHV0U3RyZWFtPC9jPiBpcyBkaXNwb3NlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPlRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uIEl0IHdpbGwgYmUgZGlzcG9zZWQgd2hlbiB0aGUgcmV0dXJuZWQgPGM+Q29kZWRPdXRwdXRTdHJlYW0gaXMgZGlzcG9zZWQuPC9jPjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBDb2RlZE91dHB1dFN0cmVhbShTdHJlYW0gb3V0cHV0KSA6IHRoaXMob3V0cHV0LCBEZWZhdWx0QnVmZmVyU2l6ZSwgZmFsc2UpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0gd2hpY2ggd3JpdGUgdG8gdGhlIGdpdmVuIHN0cmVhbSBhbmQgdXNlcwotICAgICAgICAvLy8gdGhlIHNwZWNpZmllZCBidWZmZXIgc2l6ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPlRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uIEl0IHdpbGwgYmUgZGlzcG9zZWQgd2hlbiB0aGUgcmV0dXJuZWQgPGM+Q29kZWRPdXRwdXRTdHJlYW0gaXMgZGlzcG9zZWQuPC9jPjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyU2l6ZSI+VGhlIHNpemUgb2YgYnVmZmVyIHRvIHVzZSBpbnRlcm5hbGx5LjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBDb2RlZE91dHB1dFN0cmVhbShTdHJlYW0gb3V0cHV0LCBpbnQgYnVmZmVyU2l6ZSkgOiB0aGlzKG91dHB1dCwgbmV3IGJ5dGVbYnVmZmVyU2l6ZV0sIGZhbHNlKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IENvZGVkT3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlIHRvIHRoZSBnaXZlbiBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij5UaGUgc3RyZWFtIHRvIHdyaXRlIHRvLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj5JZiA8Yz50cnVlPC9jPiwgPHBhcmFtcmVmIG5hbWU9Im91dHB1dCIvPiBpcyBsZWZ0IG9wZW4gd2hlbiB0aGUgcmV0dXJuZWQgPGM+Q29kZWRPdXRwdXRTdHJlYW08L2M+IGlzIGRpc3Bvc2VkOwotICAgICAgICAvLy8gaWYgPGM+ZmFsc2U8L2M+LCB0aGUgcHJvdmlkZWQgc3RyZWFtIGlzIGRpc3Bvc2VkIGFzIHdlbGwuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIENvZGVkT3V0cHV0U3RyZWFtKFN0cmVhbSBvdXRwdXQsIGJvb2wgbGVhdmVPcGVuKSA6IHRoaXMob3V0cHV0LCBEZWZhdWx0QnVmZmVyU2l6ZSwgbGVhdmVPcGVuKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IENvZGVkT3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlIHRvIHRoZSBnaXZlbiBzdHJlYW0gYW5kIHVzZXMKLSAgICAgICAgLy8vIHRoZSBzcGVjaWZpZWQgYnVmZmVyIHNpemUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij5UaGUgc3RyZWFtIHRvIHdyaXRlIHRvLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYnVmZmVyU2l6ZSI+VGhlIHNpemUgb2YgYnVmZmVyIHRvIHVzZSBpbnRlcm5hbGx5LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGVhdmVPcGVuIj5JZiA8Yz50cnVlPC9jPiwgPHBhcmFtcmVmIG5hbWU9Im91dHB1dCIvPiBpcyBsZWZ0IG9wZW4gd2hlbiB0aGUgcmV0dXJuZWQgPGM+Q29kZWRPdXRwdXRTdHJlYW08L2M+IGlzIGRpc3Bvc2VkOwotICAgICAgICAvLy8gaWYgPGM+ZmFsc2U8L2M+LCB0aGUgcHJvdmlkZWQgc3RyZWFtIGlzIGRpc3Bvc2VkIGFzIHdlbGwuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIENvZGVkT3V0cHV0U3RyZWFtKFN0cmVhbSBvdXRwdXQsIGludCBidWZmZXJTaXplLCBib29sIGxlYXZlT3BlbikgOiB0aGlzKG91dHB1dCwgbmV3IGJ5dGVbYnVmZmVyU2l6ZV0sIGxlYXZlT3BlbikKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBjdXJyZW50IHBvc2l0aW9uIGluIHRoZSBzdHJlYW0sIG9yIHRoZSBwb3NpdGlvbiBpbiB0aGUgb3V0cHV0IGJ1ZmZlcgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgbG9uZyBQb3NpdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gb3V0cHV0LlBvc2l0aW9uICsgcG9zaXRpb247Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBwb3NpdGlvbjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgICNyZWdpb24gV3JpdGluZyBvZiB2YWx1ZXMgKG5vdCBpbmNsdWRpbmcgdGFncykKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgYSBkb3VibGUgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byB3cml0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRG91YmxlKGRvdWJsZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgV3JpdGVSYXdMaXR0bGVFbmRpYW42NCgodWxvbmcpQml0Q29udmVydGVyLkRvdWJsZVRvSW50NjRCaXRzKHZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgYSBmbG9hdCBmaWVsZCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIHRvIHdyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVGbG9hdChmbG9hdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gQml0Q29udmVydGVyLkdldEJ5dGVzKHZhbHVlKTsKLSAgICAgICAgICAgIGlmICghQml0Q29udmVydGVyLklzTGl0dGxlRW5kaWFuKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5SZXZlcnNlKHJhd0J5dGVzKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGxpbWl0IC0gcG9zaXRpb24gPj0gNCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSByYXdCeXRlc1swXTsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSByYXdCeXRlc1sxXTsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSByYXdCeXRlc1syXTsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSByYXdCeXRlc1szXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZVJhd0J5dGVzKHJhd0J5dGVzLCAwLCA0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIHVpbnQ2NCBmaWVsZCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIHRvIHdyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVVSW50NjQodWxvbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50NjQodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIGFuIGludDY0IGZpZWxkIHZhbHVlLCB3aXRob3V0IGEgdGFnLCB0byB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgdG8gd3JpdGU8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUludDY0KGxvbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50NjQoKHVsb25nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgYW4gaW50MzIgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byB3cml0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlSW50MzIoaW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodmFsdWUgPj0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKCh1aW50KSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICAgICAgICAgICAgICBXcml0ZVJhd1ZhcmludDY0KCh1bG9uZykgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIGEgZml4ZWQ2NCBmaWVsZCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIHRvIHdyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVGaXhlZDY0KHVsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd0xpdHRsZUVuZGlhbjY0KHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIGZpeGVkMzIgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byB3cml0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRml4ZWQzMih1aW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd0xpdHRsZUVuZGlhbjMyKHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIGJvb2wgZmllbGQgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byB3cml0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlQm9vbChib29sIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd0J5dGUodmFsdWUgPyAoYnl0ZSkgMSA6IChieXRlKSAwKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIHN0cmluZyBmaWVsZCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIFRoZSBkYXRhIGlzIGxlbmd0aC1wcmVmaXhlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIHRvIHdyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVTdHJpbmcoc3RyaW5nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBPcHRpbWlzZSB0aGUgY2FzZSB3aGVyZSB3ZSBoYXZlIGVub3VnaCBzcGFjZSB0byB3cml0ZQotICAgICAgICAgICAgLy8gdGhlIHN0cmluZyBkaXJlY3RseSB0byB0aGUgYnVmZmVyLCB3aGljaCBzaG91bGQgYmUgY29tbW9uLgotICAgICAgICAgICAgaW50IGxlbmd0aCA9IFV0ZjhFbmNvZGluZy5HZXRCeXRlQ291bnQodmFsdWUpOwotICAgICAgICAgICAgV3JpdGVMZW5ndGgobGVuZ3RoKTsKLSAgICAgICAgICAgIGlmIChsaW1pdCAtIHBvc2l0aW9uID49IGxlbmd0aCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAobGVuZ3RoID09IHZhbHVlLkxlbmd0aCkgLy8gTXVzdCBiZSBhbGwgQVNDSUkuLi4KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbiArIGldID0gKGJ5dGUpdmFsdWVbaV07Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgVXRmOEVuY29kaW5nLkdldEJ5dGVzKHZhbHVlLCAwLCB2YWx1ZS5MZW5ndGgsIGJ1ZmZlciwgcG9zaXRpb24pOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzID0gVXRmOEVuY29kaW5nLkdldEJ5dGVzKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBXcml0ZVJhd0J5dGVzKGJ5dGVzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIG1lc3NhZ2UsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyBUaGUgZGF0YSBpcyBsZW5ndGgtcHJlZml4ZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byB3cml0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlTWVzc2FnZShJTWVzc2FnZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgV3JpdGVMZW5ndGgodmFsdWUuQ2FsY3VsYXRlU2l6ZSgpKTsKLSAgICAgICAgICAgIHZhbHVlLldyaXRlVG8odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZSBhIGJ5dGUgc3RyaW5nLCB3aXRob3V0IGEgdGFnLCB0byB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gVGhlIGRhdGEgaXMgbGVuZ3RoLXByZWZpeGVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgdG8gd3JpdGU8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZUJ5dGVzKEJ5dGVTdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlTGVuZ3RoKHZhbHVlLkxlbmd0aCk7Ci0gICAgICAgICAgICB2YWx1ZS5Xcml0ZVJhd0J5dGVzVG8odGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgYSB1aW50MzIgdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byB3cml0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVUludDMyKHVpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIGFuIGVudW0gdmFsdWUsIHdpdGhvdXQgYSB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byB3cml0ZTwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlRW51bShpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlSW50MzIodmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIGFuIHNmaXhlZDMyIHZhbHVlLCB3aXRob3V0IGEgdGFnLCB0byB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgdG8gd3JpdGUuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVTRml4ZWQzMihpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoKHVpbnQpIHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhbiBzZml4ZWQ2NCB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIHRvIHdyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVTRml4ZWQ2NChsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd0xpdHRsZUVuZGlhbjY0KCh1bG9uZykgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIGFuIHNpbnQzMiB2YWx1ZSwgd2l0aG91dCBhIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VGhlIHZhbHVlIHRvIHdyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVTSW50MzIoaW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKEVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgYW4gc2ludDY0IHZhbHVlLCB3aXRob3V0IGEgdGFnLCB0byB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InZhbHVlIj5UaGUgdmFsdWUgdG8gd3JpdGU8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVNJbnQ2NChsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd1ZhcmludDY0KEVuY29kZVppZ1phZzY0KHZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgYSBsZW5ndGggKGluIGJ5dGVzKSBmb3IgbGVuZ3RoLWRlbGltaXRlZCBkYXRhLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIG1ldGhvZCBzaW1wbHkgd3JpdGVzIGEgcmF3aW50LCBidXQgZXhpc3RzIGZvciBjbGFyaXR5IGluIGNhbGxpbmcgY29kZS4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsZW5ndGgiPkxlbmd0aCB2YWx1ZSwgaW4gYnl0ZXMuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVMZW5ndGgoaW50IGxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgV3JpdGVSYXdWYXJpbnQzMigodWludCkgbGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIFJhdyB0YWcgd3JpdGluZwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBFbmNvZGVzIGFuZCB3cml0ZXMgYSB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZmllbGROdW1iZXIiPlRoZSBudW1iZXIgb2YgdGhlIGZpZWxkIHRvIHdyaXRlIHRoZSB0YWcgZm9yPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlIj5UaGUgd2lyZSBmb3JtYXQgdHlwZSBvZiB0aGUgdGFnIHRvIHdyaXRlPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUYWcoaW50IGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldpcmVUeXBlIHR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3VmFyaW50MzIoV2lyZUZvcm1hdC5NYWtlVGFnKGZpZWxkTnVtYmVyLCB0eXBlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgYW4gYWxyZWFkeS1lbmNvZGVkIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSBlbmNvZGVkIHRhZzwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVGFnKHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd1ZhcmludDMyKHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgdGhlIGdpdmVuIHNpbmdsZS1ieXRlIHRhZyBkaXJlY3RseSB0byB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIxIj5UaGUgZW5jb2RlZCB0YWc8L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVJhd1RhZyhieXRlIGIxKQotICAgICAgICB7Ci0gICAgICAgICAgICBXcml0ZVJhd0J5dGUoYjEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIHRoZSBnaXZlbiB0d28tYnl0ZSB0YWcgZGlyZWN0bHkgdG8gdGhlIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiMSI+VGhlIGZpcnN0IGJ5dGUgb2YgdGhlIGVuY29kZWQgdGFnPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiMiI+VGhlIHNlY29uZCBieXRlIG9mIHRoZSBlbmNvZGVkIHRhZzwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUmF3VGFnKGJ5dGUgYjEsIGJ5dGUgYjIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZShiMSk7Ci0gICAgICAgICAgICBXcml0ZVJhd0J5dGUoYjIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIHRoZSBnaXZlbiB0aHJlZS1ieXRlIHRhZyBkaXJlY3RseSB0byB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIxIj5UaGUgZmlyc3QgYnl0ZSBvZiB0aGUgZW5jb2RlZCB0YWc8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIyIj5UaGUgc2Vjb25kIGJ5dGUgb2YgdGhlIGVuY29kZWQgdGFnPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiMyI+VGhlIHRoaXJkIGJ5dGUgb2YgdGhlIGVuY29kZWQgdGFnPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVSYXdUYWcoYnl0ZSBiMSwgYnl0ZSBiMiwgYnl0ZSBiMykKLSAgICAgICAgewotICAgICAgICAgICAgV3JpdGVSYXdCeXRlKGIxKTsKLSAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZShiMik7Ci0gICAgICAgICAgICBXcml0ZVJhd0J5dGUoYjMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIHRoZSBnaXZlbiBmb3VyLWJ5dGUgdGFnIGRpcmVjdGx5IHRvIHRoZSBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYjEiPlRoZSBmaXJzdCBieXRlIG9mIHRoZSBlbmNvZGVkIHRhZzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYjIiPlRoZSBzZWNvbmQgYnl0ZSBvZiB0aGUgZW5jb2RlZCB0YWc8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIzIj5UaGUgdGhpcmQgYnl0ZSBvZiB0aGUgZW5jb2RlZCB0YWc8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImI0Ij5UaGUgZm91cnRoIGJ5dGUgb2YgdGhlIGVuY29kZWQgdGFnPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVSYXdUYWcoYnl0ZSBiMSwgYnl0ZSBiMiwgYnl0ZSBiMywgYnl0ZSBiNCkKLSAgICAgICAgewotICAgICAgICAgICAgV3JpdGVSYXdCeXRlKGIxKTsKLSAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZShiMik7Ci0gICAgICAgICAgICBXcml0ZVJhd0J5dGUoYjMpOwotICAgICAgICAgICAgV3JpdGVSYXdCeXRlKGI0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyB0aGUgZ2l2ZW4gZml2ZS1ieXRlIHRhZyBkaXJlY3RseSB0byB0aGUgc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIxIj5UaGUgZmlyc3QgYnl0ZSBvZiB0aGUgZW5jb2RlZCB0YWc8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImIyIj5UaGUgc2Vjb25kIGJ5dGUgb2YgdGhlIGVuY29kZWQgdGFnPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiMyI+VGhlIHRoaXJkIGJ5dGUgb2YgdGhlIGVuY29kZWQgdGFnPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJiNCI+VGhlIGZvdXJ0aCBieXRlIG9mIHRoZSBlbmNvZGVkIHRhZzwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYjUiPlRoZSBmaWZ0aCBieXRlIG9mIHRoZSBlbmNvZGVkIHRhZzwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlUmF3VGFnKGJ5dGUgYjEsIGJ5dGUgYjIsIGJ5dGUgYjMsIGJ5dGUgYjQsIGJ5dGUgYjUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZShiMSk7Ci0gICAgICAgICAgICBXcml0ZVJhd0J5dGUoYjIpOwotICAgICAgICAgICAgV3JpdGVSYXdCeXRlKGIzKTsKLSAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZShiNCk7Ci0gICAgICAgICAgICBXcml0ZVJhd0J5dGUoYjUpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICAjcmVnaW9uIFVuZGVybHlpbmcgd3JpdGluZyBwcmltaXRpdmVzCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIDMyIGJpdCB2YWx1ZSBhcyBhIHZhcmludC4gVGhlIGZhc3Qgcm91dGUgaXMgdGFrZW4gd2hlbgotICAgICAgICAvLy8gdGhlcmUncyBlbm91Z2ggYnVmZmVyIHNwYWNlIGxlZnQgdG8gd2hpenogdGhyb3VnaCB3aXRob3V0IGNoZWNraW5nCi0gICAgICAgIC8vLyBmb3IgZWFjaCBieXRlOyBvdGhlcndpc2UsIHdlIHJlc29ydCB0byBjYWxsaW5nIFdyaXRlUmF3Qnl0ZSBlYWNoIHRpbWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVSYXdWYXJpbnQzMih1aW50IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBPcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIGEgc2luZ2xlIGJ5dGUgdmFsdWUKLSAgICAgICAgICAgIGlmICh2YWx1ZSA8IDEyOCAmJiBwb3NpdGlvbiA8IGxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKXZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgd2hpbGUgKHZhbHVlID4gMTI3ICYmIHBvc2l0aW9uIDwgbGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgodmFsdWUgJiAweDdGKSB8IDB4ODApOwotICAgICAgICAgICAgICAgIHZhbHVlID4+PSA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgd2hpbGUgKHZhbHVlID4gMTI3KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKCh2YWx1ZSAmIDB4N0YpIHwgMHg4MCkpOwotICAgICAgICAgICAgICAgIHZhbHVlID4+PSA3OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHBvc2l0aW9uIDwgbGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpIHZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBXcml0ZVJhd1ZhcmludDY0KHVsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB3aGlsZSAodmFsdWUgPiAxMjcgJiYgcG9zaXRpb24gPCBsaW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3aGlsZSAodmFsdWUgPiAxMjcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAoKHZhbHVlICYgMHg3RikgfCAweDgwKSk7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPj49IDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gPCBsaW1pdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCB2b2lkIFdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodWludCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBvc2l0aW9uICsgNCA+IGxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgdmFsdWUpOwotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKHZhbHVlID4+IDgpKTsKLSAgICAgICAgICAgICAgICBXcml0ZVJhd0J5dGUoKGJ5dGUpICh2YWx1ZSA+PiAxNikpOwotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKHZhbHVlID4+IDI0KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gOCkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9ICgoYnl0ZSkgKHZhbHVlID4+IDE2KSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gMjQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVSYXdMaXR0bGVFbmRpYW42NCh1bG9uZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHBvc2l0aW9uICsgOCA+IGxpbWl0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgdmFsdWUpOwotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKHZhbHVlID4+IDgpKTsKLSAgICAgICAgICAgICAgICBXcml0ZVJhd0J5dGUoKGJ5dGUpICh2YWx1ZSA+PiAxNikpOwotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKHZhbHVlID4+IDI0KSk7Ci0gICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gMzIpKTsKLSAgICAgICAgICAgICAgICBXcml0ZVJhd0J5dGUoKGJ5dGUpICh2YWx1ZSA+PiA0MCkpOwotICAgICAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgKHZhbHVlID4+IDQ4KSk7Ci0gICAgICAgICAgICAgICAgV3JpdGVSYXdCeXRlKChieXRlKSAodmFsdWUgPj4gNTYpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoKGJ5dGUpIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoKGJ5dGUpICh2YWx1ZSA+PiA4KSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gMTYpKTsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoKGJ5dGUpICh2YWx1ZSA+PiAyNCkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9ICgoYnl0ZSkgKHZhbHVlID4+IDMyKSk7Ci0gICAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKChieXRlKSAodmFsdWUgPj4gNDApKTsKLSAgICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoKGJ5dGUpICh2YWx1ZSA+PiA0OCkpOwotICAgICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9ICgoYnl0ZSkgKHZhbHVlID4+IDU2KSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCB2b2lkIFdyaXRlUmF3Qnl0ZShieXRlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAocG9zaXRpb24gPT0gbGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVmcmVzaEJ1ZmZlcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVSYXdCeXRlKHVpbnQgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFdyaXRlUmF3Qnl0ZSgoYnl0ZSkgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIG91dCBhbiBhcnJheSBvZiBieXRlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBXcml0ZVJhd0J5dGVzKGJ5dGVbXSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgV3JpdGVSYXdCeXRlcyh2YWx1ZSwgMCwgdmFsdWUuTGVuZ3RoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBvdXQgcGFydCBvZiBhbiBhcnJheSBvZiBieXRlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBXcml0ZVJhd0J5dGVzKGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGxpbWl0IC0gcG9zaXRpb24gPj0gbGVuZ3RoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEJ5dGVBcnJheS5Db3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgcG9zaXRpb24sIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgLy8gV2UgaGF2ZSByb29tIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICAgICAgICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV3JpdGUgZXh0ZW5kcyBwYXN0IGN1cnJlbnQgYnVmZmVyLiAgRmlsbCB0aGUgcmVzdCBvZiB0aGlzIGJ1ZmZlciBhbmQKLSAgICAgICAgICAgICAgICAvLyBmbHVzaC4KLSAgICAgICAgICAgICAgICBpbnQgYnl0ZXNXcml0dGVuID0gbGltaXQgLSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICBCeXRlQXJyYXkuQ29weSh2YWx1ZSwgb2Zmc2V0LCBidWZmZXIsIHBvc2l0aW9uLCBieXRlc1dyaXR0ZW4pOwotICAgICAgICAgICAgICAgIG9mZnNldCArPSBieXRlc1dyaXR0ZW47Ci0gICAgICAgICAgICAgICAgbGVuZ3RoIC09IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxpbWl0OwotICAgICAgICAgICAgICAgIFJlZnJlc2hCdWZmZXIoKTsKLQotICAgICAgICAgICAgICAgIC8vIE5vdyBkZWFsIHdpdGggdGhlIHJlc3QuCi0gICAgICAgICAgICAgICAgLy8gU2luY2Ugd2UgaGF2ZSBhbiBvdXRwdXQgc3RyZWFtLCB0aGlzIGlzIG91ciBidWZmZXIKLSAgICAgICAgICAgICAgICAvLyBhbmQgYnVmZmVyIG9mZnNldCA9PSAwCi0gICAgICAgICAgICAgICAgaWYgKGxlbmd0aCA8PSBsaW1pdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIEZpdHMgaW4gbmV3IGJ1ZmZlci4KLSAgICAgICAgICAgICAgICAgICAgQnl0ZUFycmF5LkNvcHkodmFsdWUsIG9mZnNldCwgYnVmZmVyLCAwLCBsZW5ndGgpOwotICAgICAgICAgICAgICAgICAgICBwb3NpdGlvbiA9IGxlbmd0aDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gV3JpdGUgaXMgdmVyeSBiaWcuICBMZXQncyBkbyBpdCBhbGwgYXQgb25jZS4KLSAgICAgICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlKHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgI2VuZHJlZ2lvbgotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEVuY29kZSBhIDMyLWJpdCB2YWx1ZSB3aXRoIFppZ1phZyBlbmNvZGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5Ci0gICAgICAgIC8vLyBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwgbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgCi0gICAgICAgIC8vLyBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsIHRodXMgYWx3YXlzIHRha2luZwotICAgICAgICAvLy8gMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdWludCBFbmNvZGVaaWdaYWczMihpbnQgbikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMKLSAgICAgICAgICAgIHJldHVybiAodWludCkgKChuIDw8IDEpIF4gKG4gPj4gMzEpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEVuY29kZSBhIDY0LWJpdCB2YWx1ZSB3aXRoIFppZ1phZyBlbmNvZGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5Ci0gICAgICAgIC8vLyBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwgbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgCi0gICAgICAgIC8vLyBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsIHRodXMgYWx3YXlzIHRha2luZwotICAgICAgICAvLy8gMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdWxvbmcgRW5jb2RlWmlnWmFnNjQobG9uZyBuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKHVsb25nKSAoKG4gPDwgMSkgXiAobiA+PiA2MykpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFJlZnJlc2hCdWZmZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2UncmUgd3JpdGluZyB0byBhIHNpbmdsZSBidWZmZXIuCi0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gU2luY2Ugd2UgaGF2ZSBhbiBvdXRwdXQgc3RyZWFtLCB0aGlzIGlzIG91ciBidWZmZXIKLSAgICAgICAgICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDAKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZShidWZmZXIsIDAsIHBvc2l0aW9uKTsKLSAgICAgICAgICAgIHBvc2l0aW9uID0gMDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEluZGljYXRlcyB0aGF0IGEgQ29kZWRPdXRwdXRTdHJlYW0gd3JhcHBpbmcgYSBmbGF0IGJ5dGUgYXJyYXkKLSAgICAgICAgLy8vIHJhbiBvdXQgb2Ygc3BhY2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgT3V0T2ZTcGFjZUV4Y2VwdGlvbiA6IElPRXhjZXB0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludGVybmFsIE91dE9mU3BhY2VFeGNlcHRpb24oKQotICAgICAgICAgICAgICAgIDogYmFzZSgiQ29kZWRPdXRwdXRTdHJlYW0gd2FzIHdyaXRpbmcgdG8gYSBmbGF0IGJ5dGUgYXJyYXkgYW5kIHJhbiBvdXQgb2Ygc3BhY2UuIikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZsdXNoZXMgYW55IGJ1ZmZlcmVkIGRhdGEgYW5kIG9wdGlvbmFsbHkgY2xvc2VzIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSwgaWYgYW55LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYT4KLSAgICAgICAgLy8vIEJ5IGRlZmF1bHQsIGFueSB1bmRlcmx5aW5nIHN0cmVhbSBpcyBjbG9zZWQgYnkgdGhpcyBtZXRob2QuIFRvIGNvbmZpZ3VyZSB0aGlzIGJlaGF2aW91ciwKLSAgICAgICAgLy8vIHVzZSBhIGNvbnN0cnVjdG9yIG92ZXJsb2FkIHdpdGggYSA8Yz5sZWF2ZU9wZW48L2M+IHBhcmFtZXRlci4gSWYgdGhpcyBpbnN0YW5jZSBkb2VzIG5vdAotICAgICAgICAvLy8gaGF2ZSBhbiB1bmRlcmx5aW5nIHN0cmVhbSwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotICAgICAgICAvLy8gPC9wYXJhPgotICAgICAgICAvLy8gPHBhcmE+Ci0gICAgICAgIC8vLyBGb3IgdGhlIHNha2Ugb2YgZWZmaWNpZW5jeSwgY2FsbGluZyB0aGlzIG1ldGhvZCBkb2VzIG5vdCBwcmV2ZW50IGZ1dHVyZSB3cml0ZSBjYWxscyAtIGJ1dAotICAgICAgICAvLy8gaWYgYSBsYXRlciB3cml0ZSBlbmRzIHVwIHdyaXRpbmcgdG8gYSBzdHJlYW0gd2hpY2ggaGFzIGJlZW4gZGlzcG9zZWQsIHRoYXQgaXMgbGlrZWx5IHRvCi0gICAgICAgIC8vLyBmYWlsLiBJdCBpcyByZWNvbW1lbmQgdGhhdCB5b3Ugbm90IGNhbGwgYW55IG90aGVyIG1ldGhvZHMgYWZ0ZXIgdGhpcy4KLSAgICAgICAgLy8vIDwvcGFyYT4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIHZvaWQgRGlzcG9zZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZsdXNoKCk7Ci0gICAgICAgICAgICBpZiAoIWxlYXZlT3BlbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvdXRwdXQuRGlzcG9zZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmx1c2hlcyBhbnkgYnVmZmVyZWQgZGF0YSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0gKGlmIHRoZXJlIGlzIG9uZSkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEZsdXNoKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG91dHB1dCAhPSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFJlZnJlc2hCdWZmZXIoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZlcmlmaWVzIHRoYXQgU3BhY2VMZWZ0IHJldHVybnMgemVyby4gSXQncyBjb21tb24gdG8gY3JlYXRlIGEgYnl0ZSBhcnJheQotICAgICAgICAvLy8gdGhhdCBpcyBleGFjdGx5IGJpZyBlbm91Z2ggdG8gaG9sZCBhIG1lc3NhZ2UsIHRoZW4gd3JpdGUgdG8gaXQgd2l0aAotICAgICAgICAvLy8gYSBDb2RlZE91dHB1dFN0cmVhbS4gQ2FsbGluZyBDaGVja05vU3BhY2VMZWZ0IGFmdGVyIHdyaXRpbmcgdmVyaWZpZXMgdGhhdAotICAgICAgICAvLy8gdGhlIG1lc3NhZ2Ugd2FzIGFjdHVhbGx5IGFzIGJpZyBhcyBleHBlY3RlZCwgd2hpY2ggY2FuIGhlbHAgYnVncy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHZvaWQgQ2hlY2tOb1NwYWNlTGVmdCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChTcGFjZUxlZnQgIT0gMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiRGlkIG5vdCB3cml0ZSBhcyBtdWNoIGRhdGEgYXMgZXhwZWN0ZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJZiB3cml0aW5nIHRvIGEgZmxhdCBhcnJheSwgcmV0dXJucyB0aGUgc3BhY2UgbGVmdCBpbiB0aGUgYXJyYXkuIE90aGVyd2lzZSwKLSAgICAgICAgLy8vIHRocm93cyBhbiBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IFNwYWNlTGVmdAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob3V0cHV0ID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gbGltaXQgLSBwb3NpdGlvbjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgICAiU3BhY2VMZWZ0IGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBDb2RlZE91dHB1dFN0cmVhbXMgdGhhdCBhcmUgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAid3JpdGluZyB0byBhIGZsYXQgYXJyYXkuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQ29sbGVjdGlvbnMvTWFwRmllbGQuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2xsZWN0aW9ucy9NYXBGaWVsZC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkzYTg5ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2xsZWN0aW9ucy9NYXBGaWVsZC5jcworKysgL2Rldi9udWxsCkBAIC0xLDc2MCArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5Db21wYXRpYmlsaXR5OwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZXByZXNlbnRhdGlvbiBvZiBhIG1hcCBmaWVsZCBpbiBhIFByb3RvY29sIEJ1ZmZlciBtZXNzYWdlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVEtleSI+S2V5IHR5cGUgaW4gdGhlIG1hcC4gTXVzdCBiZSBhIHR5cGUgc3VwcG9ydGVkIGJ5IFByb3RvY29sIEJ1ZmZlciBtYXAga2V5cy48L3R5cGVwYXJhbT4KLSAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUVmFsdWUiPlZhbHVlIHR5cGUgaW4gdGhlIG1hcC4gTXVzdCBiZSBhIHR5cGUgc3VwcG9ydGVkIGJ5IFByb3RvY29sIEJ1ZmZlcnMuPC90eXBlcGFyYW0+Ci0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyA8cGFyYT4KLSAgICAvLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBwcmVzZXJ2ZXMgaW5zZXJ0aW9uIG9yZGVyIGZvciBzaW1wbGljaXR5IG9mIHRlc3RpbmcKLSAgICAvLy8gY29kZSB1c2luZyBtYXBzIGZpZWxkcy4gT3ZlcndyaXRpbmcgYW4gZXhpc3RpbmcgZW50cnkgZG9lcyBub3QgY2hhbmdlIHRoZQotICAgIC8vLyBwb3NpdGlvbiBvZiB0aGF0IGVudHJ5IHdpdGhpbiB0aGUgbWFwLiBFcXVhbGl0eSBpcyBub3Qgb3JkZXItc2Vuc2l0aXZlLgotICAgIC8vLyBGb3Igc3RyaW5nIGtleXMsIHRoZSBlcXVhbGl0eSBjb21wYXJpc29uIGlzIHByb3ZpZGVkIGJ5IDxzZWUgY3JlZj0iU3RyaW5nQ29tcGFyZXIuT3JkaW5hbCIgLz4uCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPHBhcmE+Ci0gICAgLy8vIE51bGwgdmFsdWVzIGFyZSBub3QgcGVybWl0dGVkIGluIHRoZSBtYXAsIGVpdGhlciBmb3Igd3JhcHBlciB0eXBlcyBvciByZWd1bGFyIG1lc3NhZ2VzLgotICAgIC8vLyBJZiBhIG1hcCBpcyBkZXNlcmlhbGl6ZWQgZnJvbSBhIGRhdGEgc3RyZWFtIGFuZCB0aGUgdmFsdWUgaXMgbWlzc2luZyBmcm9tIGFuIGVudHJ5LCBhIGRlZmF1bHQgdmFsdWUKLSAgICAvLy8gaXMgY3JlYXRlZCBpbnN0ZWFkLiBGb3IgcHJpbWl0aXZlIHR5cGVzLCB0aGF0IGlzIHRoZSByZWd1bGFyIGRlZmF1bHQgdmFsdWUgKDAsIHRoZSBlbXB0eSBzdHJpbmcgYW5kIHNvCi0gICAgLy8vIG9uKTsgZm9yIG1lc3NhZ2UgdHlwZXMsIGFuIGVtcHR5IGluc3RhbmNlIG9mIHRoZSBtZXNzYWdlIGlzIGNyZWF0ZWQsIGFzIGlmIHRoZSBtYXAgZW50cnkgY29udGFpbmVkIGEgMC1sZW5ndGgKLSAgICAvLy8gZW5jb2RlZCB2YWx1ZSBmb3IgdGhlIGZpZWxkLgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBUaGlzIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGdlbmVyYWxseSBwcm9oaWJpdCB0aGUgdXNlIG9mIGtleS92YWx1ZSB0eXBlcyB3aGljaCBhcmUgbm90Ci0gICAgLy8vIHN1cHBvcnRlZCBieSBQcm90b2NvbCBCdWZmZXJzIChlLmcuIHVzaW5nIGEga2V5IHR5cGUgb2YgPGNvZGU+Ynl0ZTwvY29kZT4pIGJ1dCBub3IgZG9lcyBpdCBndWFyYW50ZWUKLSAgICAvLy8gdGhhdCBhbGwgb3BlcmF0aW9ucyB3aWxsIHdvcmsgaW4gc3VjaCBjYXNlcy4KLSAgICAvLy8gPC9wYXJhPgotICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBNYXBGaWVsZDxUS2V5LCBUVmFsdWU+IDogSURlZXBDbG9uZWFibGU8TWFwRmllbGQ8VEtleSwgVFZhbHVlPj4sIElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4sIElFcXVhdGFibGU8TWFwRmllbGQ8VEtleSwgVFZhbHVlPj4sIElEaWN0aW9uYXJ5Ci0gICAgewotICAgICAgICAvLyBUT0RPOiBEb24ndCBjcmVhdGUgdGhlIG1hcC9saXN0IHVudGlsIHdlIGhhdmUgYW4gZW50cnkuIChBc3N1bWUgbWFueSBtYXBzIHdpbGwgYmUgZW1wdHkuKQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8VEtleSwgTGlua2VkTGlzdE5vZGU8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+PiBtYXAgPQotICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8VEtleSwgTGlua2VkTGlzdE5vZGU8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+PigpOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IExpbmtlZExpc3Q8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+IGxpc3QgPSBuZXcgTGlua2VkTGlzdDxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4oKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgZGVlcCBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPgotICAgICAgICAvLy8gQSBkZWVwIGNsb25lIG9mIHRoaXMgb2JqZWN0LgotICAgICAgICAvLy8gPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgTWFwRmllbGQ8VEtleSwgVFZhbHVlPiBDbG9uZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjbG9uZSA9IG5ldyBNYXBGaWVsZDxUS2V5LCBUVmFsdWU+KCk7Ci0gICAgICAgICAgICAvLyBLZXlzIGFyZSBuZXZlciBjbG9uZWFibGUuIFZhbHVlcyBtaWdodCBiZS4KLSAgICAgICAgICAgIGlmICh0eXBlb2YoSURlZXBDbG9uZWFibGU8VFZhbHVlPikuSXNBc3NpZ25hYmxlRnJvbSh0eXBlb2YoVFZhbHVlKSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZm9yZWFjaCAodmFyIHBhaXIgaW4gbGlzdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNsb25lLkFkZChwYWlyLktleSwgKChJRGVlcENsb25lYWJsZTxUVmFsdWU+KXBhaXIuVmFsdWUpLkNsb25lKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGlzIGNsb25lYWJsZSwgc28gd2UgZG9uJ3QgbmVlZCB0byB3b3JyeS4KLSAgICAgICAgICAgICAgICBjbG9uZS5BZGQodGhpcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIgdG8gdGhlIG1hcC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhpcyBvcGVyYXRpb24gZmFpbHMgaWYgdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgbWFwLiBUbyByZXBsYWNlIGFuIGV4aXN0aW5nIGVudHJ5LCB1c2UgdGhlIGluZGV4ZXIuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij5UaGUga2V5IHRvIGFkZDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSB2YWx1ZSB0byBhZGQuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iU3lzdGVtLkFyZ3VtZW50RXhjZXB0aW9uIj5UaGUgZ2l2ZW4ga2V5IGFscmVhZHkgZXhpc3RzIGluIG1hcC48L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIHZvaWQgQWRkKFRLZXkga2V5LCBUVmFsdWUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFZhbGlkYXRpb24gb2YgYXJndW1lbnRzIGhhcHBlbnMgaW4gQ29udGFpbnNLZXkgYW5kIHRoZSBpbmRleGVyCi0gICAgICAgICAgICBpZiAoQ29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIktleSBhbHJlYWR5IGV4aXN0cyBpbiBtYXAiLCAia2V5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0aGlzW2tleV0gPSB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERldGVybWluZXMgd2hldGhlciB0aGUgc3BlY2lmaWVkIGtleSBpcyBwcmVzZW50IGluIHRoZSBtYXAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ia2V5Ij5UaGUga2V5IHRvIGNoZWNrLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48Yz50cnVlPC9jPiBpZiB0aGUgbWFwIGNvbnRhaW5zIHRoZSBnaXZlbiBrZXk7IDxjPmZhbHNlPC9jPiBvdGhlcndpc2UuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYm9vbCBDb250YWluc0tleShUS2V5IGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbFVuY29uc3RyYWluZWQoa2V5LCAia2V5Iik7Ci0gICAgICAgICAgICByZXR1cm4gbWFwLkNvbnRhaW5zS2V5KGtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGJvb2wgQ29udGFpbnNWYWx1ZShUVmFsdWUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBjb21wYXJlciA9IEVxdWFsaXR5Q29tcGFyZXI8VFZhbHVlPi5EZWZhdWx0OwotICAgICAgICAgICAgcmV0dXJuIGxpc3QuQW55KHBhaXIgPT4gY29tcGFyZXIuRXF1YWxzKHBhaXIuVmFsdWUsIHZhbHVlKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIHRoZSBlbnRyeSBpZGVudGlmaWVkIGJ5IHRoZSBnaXZlbiBrZXkgZnJvbSB0aGUgbWFwLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+VGhlIGtleSBpbmRpY2F0aW5nIHRoZSBlbnRyeSB0byByZW1vdmUgZnJvbSB0aGUgbWFwLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48Yz50cnVlPC9jPiBpZiB0aGUgbWFwIGNvbnRhaW5lZCB0aGUgZ2l2ZW4ga2V5IGJlZm9yZSB0aGUgZW50cnkgd2FzIHJlbW92ZWQ7IDxjPmZhbHNlPC9jPiBvdGhlcndpc2UuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVEtleSBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGxVbmNvbnN0cmFpbmVkKGtleSwgImtleSIpOwotICAgICAgICAgICAgTGlua2VkTGlzdE5vZGU8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+IG5vZGU7Ci0gICAgICAgICAgICBpZiAobWFwLlRyeUdldFZhbHVlKGtleSwgb3V0IG5vZGUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hcC5SZW1vdmUoa2V5KTsKLSAgICAgICAgICAgICAgICBub2RlLkxpc3QuUmVtb3ZlKG5vZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXkiPlRoZSBrZXkgd2hvc2UgdmFsdWUgdG8gZ2V0LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPldoZW4gdGhpcyBtZXRob2QgcmV0dXJucywgdGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleSwgaWYgdGhlIGtleSBpcyBmb3VuZDsKLSAgICAgICAgLy8vIG90aGVyd2lzZSwgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSB0eXBlIG9mIHRoZSA8cGFyYW1yZWYgbmFtZT0idmFsdWUiLz4gcGFyYW1ldGVyLgotICAgICAgICAvLy8gVGhpcyBwYXJhbWV0ZXIgaXMgcGFzc2VkIHVuaW5pdGlhbGl6ZWQuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjxjPnRydWU8L2M+IGlmIHRoZSBtYXAgY29udGFpbnMgYW4gZWxlbWVudCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5OyBvdGhlcndpc2UsIDxjPmZhbHNlPC9jPi48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBib29sIFRyeUdldFZhbHVlKFRLZXkga2V5LCBvdXQgVFZhbHVlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBMaW5rZWRMaXN0Tm9kZTxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4gbm9kZTsKLSAgICAgICAgICAgIGlmIChtYXAuVHJ5R2V0VmFsdWUoa2V5LCBvdXQgbm9kZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBub2RlLlZhbHVlLlZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhbHVlID0gZGVmYXVsdChUVmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgb3Igc2V0cyB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBzcGVjaWZpZWQga2V5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImtleSI+VGhlIGtleSBvZiB0aGUgdmFsdWUgdG8gZ2V0IG9yIHNldC48L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJLZXlOb3RGb3VuZEV4Y2VwdGlvbiI+VGhlIHByb3BlcnR5IGlzIHJldHJpZXZlZCBhbmQga2V5IGRvZXMgbm90IGV4aXN0IGluIHRoZSBjb2xsZWN0aW9uLjwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHZhbHVlIGFzc29jaWF0ZWQgd2l0aCB0aGUgc3BlY2lmaWVkIGtleS4gSWYgdGhlIHNwZWNpZmllZCBrZXkgaXMgbm90IGZvdW5kLAotICAgICAgICAvLy8gYSBnZXQgb3BlcmF0aW9uIHRocm93cyBhIDxzZWUgY3JlZj0iS2V5Tm90Rm91bmRFeGNlcHRpb24iLz4sIGFuZCBhIHNldCBvcGVyYXRpb24gY3JlYXRlcyBhIG5ldyBlbGVtZW50IHdpdGggdGhlIHNwZWNpZmllZCBrZXkuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgVFZhbHVlIHRoaXNbVEtleSBrZXldCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGxVbmNvbnN0cmFpbmVkKGtleSwgImtleSIpOwotICAgICAgICAgICAgICAgIFRWYWx1ZSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAoVHJ5R2V0VmFsdWUoa2V5LCBvdXQgdmFsdWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgS2V5Tm90Rm91bmRFeGNlcHRpb24oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHNldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGxVbmNvbnN0cmFpbmVkKGtleSwgImtleSIpOwotICAgICAgICAgICAgICAgIC8vIHZhbHVlID09IG51bGwgY2hlY2sgaGVyZSBpcyByZWR1bmRhbnQsIGJ1dCBhdm9pZHMgYm94aW5nLgotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbFVuY29uc3RyYWluZWQodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBMaW5rZWRMaXN0Tm9kZTxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4gbm9kZTsKLSAgICAgICAgICAgICAgICB2YXIgcGFpciA9IG5ldyBLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPihrZXksIHZhbHVlKTsKLSAgICAgICAgICAgICAgICBpZiAobWFwLlRyeUdldFZhbHVlKGtleSwgb3V0IG5vZGUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbm9kZS5WYWx1ZSA9IHBhaXI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5vZGUgPSBsaXN0LkFkZExhc3QocGFpcik7Ci0gICAgICAgICAgICAgICAgICAgIG1hcFtrZXldID0gbm9kZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIGEgY29sbGVjdGlvbiBjb250YWluaW5nIHRoZSBrZXlzIGluIHRoZSBtYXAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBJQ29sbGVjdGlvbjxUS2V5PiBLZXlzIHsgZ2V0IHsgcmV0dXJuIG5ldyBNYXBWaWV3PFRLZXk+KHRoaXMsIHBhaXIgPT4gcGFpci5LZXksIENvbnRhaW5zS2V5KTsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyBhIGNvbGxlY3Rpb24gY29udGFpbmluZyB0aGUgdmFsdWVzIGluIHRoZSBtYXAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBJQ29sbGVjdGlvbjxUVmFsdWU+IFZhbHVlcyB7IGdldCB7IHJldHVybiBuZXcgTWFwVmlldzxUVmFsdWU+KHRoaXMsIHBhaXIgPT4gcGFpci5WYWx1ZSwgQ29udGFpbnNWYWx1ZSk7IH0gfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgdGhlIHNwZWNpZmllZCBlbnRyaWVzIHRvIHRoZSBtYXAuIFRoZSBrZXlzIGFuZCB2YWx1ZXMgYXJlIG5vdCBhdXRvbWF0aWNhbGx5IGNsb25lZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJlbnRyaWVzIj5UaGUgZW50cmllcyB0byBhZGQgdG8gdGhlIG1hcC48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBBZGQoSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiBlbnRyaWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGVudHJpZXMsICJlbnRyaWVzIik7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFpciBpbiBlbnRyaWVzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZChwYWlyLktleSwgcGFpci5WYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGFuIGVudW1lcmF0b3IgdGhhdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBjb2xsZWN0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+Ci0gICAgICAgIC8vLyBBbiBlbnVtZXJhdG9yIHRoYXQgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb2xsZWN0aW9uLgotICAgICAgICAvLy8gPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+IEdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbGlzdC5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGFuIGVudW1lcmF0b3IgdGhhdCBpdGVyYXRlcyB0aHJvdWdoIGEgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPgotICAgICAgICAvLy8gQW4gPHNlZSBjcmVmPSJUOlN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciIgLz4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb2xsZWN0aW9uLgotICAgICAgICAvLy8gPC9yZXR1cm5zPgotICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBtYXAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gYWRkIHRvIHRoZSBtYXAuPC9wYXJhbT4KLSAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4uQWRkKEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IGl0ZW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZChpdGVtLktleSwgaXRlbS5WYWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIGFsbCBpdGVtcyBmcm9tIHRoZSBtYXAuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgbGlzdC5DbGVhcigpOwotICAgICAgICAgICAgbWFwLkNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgbWFwIGNvbnRhaW5zIGFuIGVudHJ5IGVxdWl2YWxlbnQgdG8gdGhlIGdpdmVuIGtleS92YWx1ZSBwYWlyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBrZXkvdmFsdWUgcGFpciB0byBmaW5kLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIGJvb2wgSUNvbGxlY3Rpb248S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+LkNvbnRhaW5zKEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+IGl0ZW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIFRWYWx1ZSB2YWx1ZTsKLSAgICAgICAgICAgIHJldHVybiBUcnlHZXRWYWx1ZShpdGVtLktleSwgb3V0IHZhbHVlKQotICAgICAgICAgICAgICAgICYmIEVxdWFsaXR5Q29tcGFyZXI8VFZhbHVlPi5EZWZhdWx0LkVxdWFscyhpdGVtLlZhbHVlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb3BpZXMgdGhlIGtleS92YWx1ZSBwYWlycyBpbiB0aGlzIG1hcCB0byBhbiBhcnJheS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJhcnJheSI+VGhlIGFycmF5IHRvIGNvcHkgdGhlIGVudHJpZXMgaW50by48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImFycmF5SW5kZXgiPlRoZSBpbmRleCBvZiB0aGUgYXJyYXkgYXQgd2hpY2ggdG8gc3RhcnQgY29weWluZyB2YWx1ZXMuPC9wYXJhbT4KLSAgICAgICAgdm9pZCBJQ29sbGVjdGlvbjxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4uQ29weVRvKEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+W10gYXJyYXksIGludCBhcnJheUluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBsaXN0LkNvcHlUbyhhcnJheSwgYXJyYXlJbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIHRoZSBzcGVjaWZpZWQga2V5L3ZhbHVlIHBhaXIgZnJvbSB0aGUgbWFwLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Qm90aCB0aGUga2V5IGFuZCB0aGUgdmFsdWUgbXVzdCBiZSBmb3VuZCBmb3IgdGhlIGVudHJ5IHRvIGJlIHJlbW92ZWQuPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBrZXkvdmFsdWUgcGFpciB0byByZW1vdmUuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjxjPnRydWU8L2M+IGlmIHRoZSBrZXkvdmFsdWUgcGFpciB3YXMgZm91bmQgYW5kIHJlbW92ZWQ7IDxjPmZhbHNlPC9jPiBvdGhlcndpc2UuPC9yZXR1cm5zPgotICAgICAgICBib29sIElDb2xsZWN0aW9uPEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+Pi5SZW1vdmUoS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4gaXRlbSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGl0ZW0uS2V5ID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJLZXkgaXMgbnVsbCIsICJpdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBMaW5rZWRMaXN0Tm9kZTxLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPj4gbm9kZTsKLSAgICAgICAgICAgIGlmIChtYXAuVHJ5R2V0VmFsdWUoaXRlbS5LZXksIG91dCBub2RlKSAmJgotICAgICAgICAgICAgICAgIEVxdWFsaXR5Q29tcGFyZXI8VFZhbHVlPi5EZWZhdWx0LkVxdWFscyhpdGVtLlZhbHVlLCBub2RlLlZhbHVlLlZhbHVlKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtYXAuUmVtb3ZlKGl0ZW0uS2V5KTsKLSAgICAgICAgICAgICAgICBub2RlLkxpc3QuUmVtb3ZlKG5vZGUpOwotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEdldHMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBjb250YWluZWQgaW4gdGhlIG1hcC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldCB7IHJldHVybiBsaXN0LkNvdW50OyB9IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIGEgdmFsdWUgaW5kaWNhdGluZyB3aGV0aGVyIHRoZSBtYXAgaXMgcmVhZC1vbmx5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJc1JlYWRPbmx5IHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZXRlcm1pbmVzIHdoZXRoZXIgdGhlIHNwZWNpZmllZCA8c2VlIGNyZWY9IlN5c3RlbS5PYmplY3QiIC8+LCBpcyBlcXVhbCB0byB0aGlzIGluc3RhbmNlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im90aGVyIj5UaGUgPHNlZSBjcmVmPSJTeXN0ZW0uT2JqZWN0IiAvPiB0byBjb21wYXJlIHdpdGggdGhpcyBpbnN0YW5jZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+Ci0gICAgICAgIC8vLyAgIDxjPnRydWU8L2M+IGlmIHRoZSBzcGVjaWZpZWQgPHNlZSBjcmVmPSJTeXN0ZW0uT2JqZWN0IiAvPiBpcyBlcXVhbCB0byB0aGlzIGluc3RhbmNlOyBvdGhlcndpc2UsIDxjPmZhbHNlPC9jPi4KLSAgICAgICAgLy8vIDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBNYXBGaWVsZDxUS2V5LCBUVmFsdWU+KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIHRoaXMgaW5zdGFuY2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz4KLSAgICAgICAgLy8vIEEgaGFzaCBjb2RlIGZvciB0aGlzIGluc3RhbmNlLCBzdWl0YWJsZSBmb3IgdXNlIGluIGhhc2hpbmcgYWxnb3JpdGhtcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGxpa2UgYSBoYXNoIHRhYmxlLiAKLSAgICAgICAgLy8vIDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB2YWx1ZUNvbXBhcmVyID0gRXF1YWxpdHlDb21wYXJlcjxUVmFsdWU+LkRlZmF1bHQ7Ci0gICAgICAgICAgICBpbnQgaGFzaCA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgcGFpciBpbiBsaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGhhc2ggXj0gcGFpci5LZXkuR2V0SGFzaENvZGUoKSAqIDMxICsgdmFsdWVDb21wYXJlci5HZXRIYXNoQ29kZShwYWlyLlZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcGFyZXMgdGhpcyBtYXAgd2l0aCBhbm90aGVyIGZvciBlcXVhbGl0eS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhlIG9yZGVyIG9mIHRoZSBrZXkvdmFsdWUgcGFpcnMgaW4gdGhlIG1hcHMgaXMgbm90IGRlZW1lZCBzaWduaWZpY2FudCBpbiB0aGlzIGNvbXBhcmlzb24uCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3RoZXIiPlRoZSBtYXAgdG8gY29tcGFyZSB0aGlzIHdpdGguPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjxjPnRydWU8L2M+IGlmIDxwYXJhbXJlZiBuYW1lPSJvdGhlciIvPiByZWZlcnMgdG8gYW4gZXF1YWwgbWFwOyA8Yz5mYWxzZTwvYz4gb3RoZXJ3aXNlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKE1hcEZpZWxkPFRLZXksIFRWYWx1ZT4gb3RoZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvdGhlciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChvdGhlciA9PSB0aGlzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKG90aGVyLkNvdW50ICE9IHRoaXMuQ291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHZhbHVlQ29tcGFyZXIgPSBFcXVhbGl0eUNvbXBhcmVyPFRWYWx1ZT4uRGVmYXVsdDsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBwYWlyIGluIHRoaXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgVFZhbHVlIHZhbHVlOwotICAgICAgICAgICAgICAgIGlmICghb3RoZXIuVHJ5R2V0VmFsdWUocGFpci5LZXksIG91dCB2YWx1ZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICghdmFsdWVDb21wYXJlci5FcXVhbHModmFsdWUsIHBhaXIuVmFsdWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBlbnRyaWVzIHRvIHRoZSBtYXAgZnJvbSB0aGUgZ2l2ZW4gc3RyZWFtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIHN0cmVhbSBpcyBpbml0aWFsbHkgcG9zaXRpb25lZCBhZnRlciB0aGUgdGFnIHNwZWNpZmllZCBieSB0aGUgY29kZWMuCi0gICAgICAgIC8vLyBUaGlzIG1ldGhvZCB3aWxsIGNvbnRpbnVlIHJlYWRpbmcgZW50cmllcyBmcm9tIHRoZSBzdHJlYW0gdW50aWwgdGhlIGVuZCBpcyByZWFjaGVkLCBvcgotICAgICAgICAvLy8gYSBkaWZmZXJlbnQgdGFnIGlzIGVuY291bnRlcmVkLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0Ij5TdHJlYW0gdG8gcmVhZCBmcm9tPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJjb2RlYyI+Q29kZWMgZGVzY3JpYmluZyBob3cgdGhlIGtleS92YWx1ZSBwYWlycyBhcmUgZW5jb2RlZDwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFkZEVudHJpZXNGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIENvZGVjIGNvZGVjKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgYWRhcHRlciA9IG5ldyBDb2RlYy5NZXNzYWdlQWRhcHRlcihjb2RlYyk7Ci0gICAgICAgICAgICBkbwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGFkYXB0ZXIuUmVzZXQoKTsKLSAgICAgICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShhZGFwdGVyKTsKLSAgICAgICAgICAgICAgICB0aGlzW2FkYXB0ZXIuS2V5XSA9IGFkYXB0ZXIuVmFsdWU7Ci0gICAgICAgICAgICB9IHdoaWxlIChpbnB1dC5NYXliZUNvbnN1bWVUYWcoY29kZWMuTWFwVGFnKSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgbWFwIHRvIHRoZSBnaXZlbiBjb2RlZCBvdXRwdXQgc3RyZWFtLCB1c2luZyB0aGUgc3BlY2lmaWVkIGNvZGVjCi0gICAgICAgIC8vLyB0byBlbmNvZGUgZWFjaCBlbnRyeS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPlRoZSBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRvLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29kZWMiPlRoZSBjb2RlYyB0byB1c2UgZm9yIGVhY2ggZW50cnkuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQsIENvZGVjIGNvZGVjKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBDb2RlYy5NZXNzYWdlQWRhcHRlcihjb2RlYyk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZW50cnkgaW4gbGlzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLktleSA9IGVudHJ5LktleTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLlZhbHVlID0gZW50cnkuVmFsdWU7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKGNvZGVjLk1hcFRhZyk7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBtYXAgYmFzZWQgb24gdGhlIGdpdmVuIGVudHJ5IGNvZGVjLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvZGVjIj5UaGUgY29kZWMgdG8gdXNlIHRvIGVuY29kZSBlYWNoIGVudHJ5LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZShDb2RlYyBjb2RlYykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKENvdW50ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIDA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbWVzc2FnZSA9IG5ldyBDb2RlYy5NZXNzYWdlQWRhcHRlcihjb2RlYyk7Ci0gICAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZW50cnkgaW4gbGlzdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLktleSA9IGVudHJ5LktleTsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLlZhbHVlID0gZW50cnkuVmFsdWU7Ci0gICAgICAgICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlUmF3VmFyaW50MzJTaXplKGNvZGVjLk1hcFRhZyk7Ci0gICAgICAgICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUobWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZXBlYXRlZCBmaWVsZCwgaW4gdGhlIHNhbWUKLSAgICAgICAgLy8vIHdheSBhcyBpdCB3b3VsZCBiZSByZXByZXNlbnRlZCBieSB0aGUgZGVmYXVsdCBKU09OIGZvcm1hdHRlci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBKc29uRm9ybWF0dGVyLkRlZmF1bHQuV3JpdGVEaWN0aW9uYXJ5KHdyaXRlciwgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm4gd3JpdGVyLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAjcmVnaW9uIElEaWN0aW9uYXJ5IGV4cGxpY2l0IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbgotICAgICAgICB2b2lkIElEaWN0aW9uYXJ5LkFkZChvYmplY3Qga2V5LCBvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEFkZCgoVEtleSlrZXksIChUVmFsdWUpdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBJRGljdGlvbmFyeS5Db250YWlucyhvYmplY3Qga2V5KQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIShrZXkgaXMgVEtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIENvbnRhaW5zS2V5KChUS2V5KWtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICBJRGljdGlvbmFyeUVudW1lcmF0b3IgSURpY3Rpb25hcnkuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRGljdGlvbmFyeUVudW1lcmF0b3IoR2V0RW51bWVyYXRvcigpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZvaWQgSURpY3Rpb25hcnkuUmVtb3ZlKG9iamVjdCBrZXkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwoa2V5LCAia2V5Iik7Ci0gICAgICAgICAgICBpZiAoIShrZXkgaXMgVEtleSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUmVtb3ZlKChUS2V5KWtleSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIElDb2xsZWN0aW9uLkNvcHlUbyhBcnJheSBhcnJheSwgaW50IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUaGlzIGlzIHVnbHkgYW5kIHNsb3cgYXMgaGVjaywgYnV0IHdpdGggYW55IGx1Y2sgaXQgd2lsbCBuZXZlciBiZSB1c2VkIGFueXdheS4KLSAgICAgICAgICAgIElDb2xsZWN0aW9uIHRlbXAgPSB0aGlzLlNlbGVjdChwYWlyID0+IG5ldyBEaWN0aW9uYXJ5RW50cnkocGFpci5LZXksIHBhaXIuVmFsdWUpKS5Ub0xpc3QoKTsKLSAgICAgICAgICAgIHRlbXAuQ29weVRvKGFycmF5LCBpbmRleCk7Ci0gICAgICAgIH0KLQotICAgICAgICBib29sIElEaWN0aW9uYXJ5LklzRml4ZWRTaXplIHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9IH0KLQotICAgICAgICBJQ29sbGVjdGlvbiBJRGljdGlvbmFyeS5LZXlzIHsgZ2V0IHsgcmV0dXJuIChJQ29sbGVjdGlvbilLZXlzOyB9IH0KLQotICAgICAgICBJQ29sbGVjdGlvbiBJRGljdGlvbmFyeS5WYWx1ZXMgeyBnZXQgeyByZXR1cm4gKElDb2xsZWN0aW9uKVZhbHVlczsgfSB9Ci0KLSAgICAgICAgYm9vbCBJQ29sbGVjdGlvbi5Jc1N5bmNocm9uaXplZCB7IGdldCB7IHJldHVybiBmYWxzZTsgfSB9Ci0KLSAgICAgICAgb2JqZWN0IElDb2xsZWN0aW9uLlN5bmNSb290IHsgZ2V0IHsgcmV0dXJuIHRoaXM7IH0gfQotCi0gICAgICAgIG9iamVjdCBJRGljdGlvbmFyeS50aGlzW29iamVjdCBrZXldCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwoa2V5LCAia2V5Iik7Ci0gICAgICAgICAgICAgICAgaWYgKCEoa2V5IGlzIFRLZXkpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIFRWYWx1ZSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBUcnlHZXRWYWx1ZSgoVEtleSlrZXksIG91dCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzZXQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzWyhUS2V5KWtleV0gPSAoVFZhbHVlKXZhbHVlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24KLQotICAgICAgICBwcml2YXRlIGNsYXNzIERpY3Rpb25hcnlFbnVtZXJhdG9yIDogSURpY3Rpb25hcnlFbnVtZXJhdG9yCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUVudW1lcmF0b3I8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4+IGVudW1lcmF0b3I7Ci0KLSAgICAgICAgICAgIGludGVybmFsIERpY3Rpb25hcnlFbnVtZXJhdG9yKElFbnVtZXJhdG9yPEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+PiBlbnVtZXJhdG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMuZW51bWVyYXRvciA9IGVudW1lcmF0b3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sIE1vdmVOZXh0KCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZW51bWVyYXRvci5Nb3ZlTmV4dCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBSZXNldCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZW51bWVyYXRvci5SZXNldCgpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgb2JqZWN0IEN1cnJlbnQgeyBnZXQgeyByZXR1cm4gRW50cnk7IH0gfQotICAgICAgICAgICAgcHVibGljIERpY3Rpb25hcnlFbnRyeSBFbnRyeSB7IGdldCB7IHJldHVybiBuZXcgRGljdGlvbmFyeUVudHJ5KEtleSwgVmFsdWUpOyB9IH0KLSAgICAgICAgICAgIHB1YmxpYyBvYmplY3QgS2V5IHsgZ2V0IHsgcmV0dXJuIGVudW1lcmF0b3IuQ3VycmVudC5LZXk7IH0gfQotICAgICAgICAgICAgcHVibGljIG9iamVjdCBWYWx1ZSB7IGdldCB7IHJldHVybiBlbnVtZXJhdG9yLkN1cnJlbnQuVmFsdWU7IH0gfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBjb2RlYyBmb3IgYSBzcGVjaWZpYyBtYXAgZmllbGQuIFRoaXMgY29udGFpbnMgYWxsIHRoZSBpbmZvcm1hdGlvbiByZXF1aXJlZCB0byBlbmNvZGUgYW5kCi0gICAgICAgIC8vLyBkZWNvZGUgdGhlIG5lc3RlZCBtZXNzYWdlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHNlYWxlZCBjbGFzcyBDb2RlYwotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkQ29kZWM8VEtleT4ga2V5Q29kZWM7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpZWxkQ29kZWM8VFZhbHVlPiB2YWx1ZUNvZGVjOwotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSB1aW50IG1hcFRhZzsKLQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgZW50cnkgY29kZWMgYmFzZWQgb24gYSBzZXBhcmF0ZSBrZXkgY29kZWMgYW5kIHZhbHVlIGNvZGVjLAotICAgICAgICAgICAgLy8vIGFuZCB0aGUgdGFnIHRvIHVzZSBmb3IgZWFjaCBtYXAgZW50cnkuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJrZXlDb2RlYyI+VGhlIGtleSBjb2RlYy48L3BhcmFtPgotICAgICAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZUNvZGVjIj5UaGUgdmFsdWUgY29kZWMuPC9wYXJhbT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWFwVGFnIj5UaGUgbWFwIHRhZyB0byB1c2UgdG8gaW50cm9kdWNlIGVhY2ggbWFwIGVudHJ5LjwvcGFyYW0+Ci0gICAgICAgICAgICBwdWJsaWMgQ29kZWMoRmllbGRDb2RlYzxUS2V5PiBrZXlDb2RlYywgRmllbGRDb2RlYzxUVmFsdWU+IHZhbHVlQ29kZWMsIHVpbnQgbWFwVGFnKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRoaXMua2V5Q29kZWMgPSBrZXlDb2RlYzsKLSAgICAgICAgICAgICAgICB0aGlzLnZhbHVlQ29kZWMgPSB2YWx1ZUNvZGVjOwotICAgICAgICAgICAgICAgIHRoaXMubWFwVGFnID0gbWFwVGFnOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gVGhlIHRhZyB1c2VkIGluIHRoZSBlbmNsb3NpbmcgbWVzc2FnZSB0byBpbmRpY2F0ZSBtYXAgZW50cmllcy4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBpbnRlcm5hbCB1aW50IE1hcFRhZyB7IGdldCB7IHJldHVybiBtYXBUYWc7IH0gfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQSBtdXRhYmxlIG1lc3NhZ2UgY2xhc3MsIHVzZWQgZm9yIHBhcnNpbmcgYW5kIHNlcmlhbGl6aW5nLiBUaGlzCi0gICAgICAgICAgICAvLy8gZGVsZWdhdGVzIHRoZSB3b3JrIHRvIGEgY29kZWMsIGJ1dCBpbXBsZW1lbnRzIHRoZSA8c2VlIGNyZWY9IklNZXNzYWdlIi8+IGludGVyZmFjZQotICAgICAgICAgICAgLy8vIGZvciBpbnRlcm9wIHdpdGggPHNlZSBjcmVmPSJDb2RlZElucHV0U3RyZWFtIi8+IGFuZCA8c2VlIGNyZWY9IkNvZGVkT3V0cHV0U3RyZWFtIi8+LgotICAgICAgICAgICAgLy8vIFRoaXMgaXMgbmVzdGVkIGluc2lkZSBDb2RlYyBhcyBpdCdzIHRpZ2h0bHkgY291cGxlZCB0byB0aGUgYXNzb2NpYXRlZCBjb2RlYywKLSAgICAgICAgICAgIC8vLyBhbmQgaXQncyBzaW1wbGVyIGlmIGl0IGhhcyBkaXJlY3QgYWNjZXNzIHRvIGFsbCBpdHMgZmllbGRzLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIGludGVybmFsIGNsYXNzIE1lc3NhZ2VBZGFwdGVyIDogSU1lc3NhZ2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBieXRlW10gWmVyb0xlbmd0aE1lc3NhZ2VTdHJlYW1EYXRhID0gbmV3IGJ5dGVbXSB7IDAgfTsKLQotICAgICAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQ29kZWMgY29kZWM7Ci0gICAgICAgICAgICAgICAgaW50ZXJuYWwgVEtleSBLZXkgeyBnZXQ7IHNldDsgfQotICAgICAgICAgICAgICAgIGludGVybmFsIFRWYWx1ZSBWYWx1ZSB7IGdldDsgc2V0OyB9Ci0KLSAgICAgICAgICAgICAgICBpbnRlcm5hbCBNZXNzYWdlQWRhcHRlcihDb2RlYyBjb2RlYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuY29kZWMgPSBjb2RlYzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnRlcm5hbCB2b2lkIFJlc2V0KCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEtleSA9IGNvZGVjLmtleUNvZGVjLkRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBjb2RlYy52YWx1ZUNvZGVjLkRlZmF1bHRWYWx1ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSBjb2RlYy5rZXlDb2RlYy5UYWcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgS2V5ID0gY29kZWMua2V5Q29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0YWcgPT0gY29kZWMudmFsdWVDb2RlYy5UYWcpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsdWUgPSBjb2RlYy52YWx1ZUNvZGVjLlJlYWQoaW5wdXQpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSAKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICAvLyBDb3JuZXIgY2FzZTogYSBtYXAgZW50cnkgd2l0aCBhIGtleSBidXQgbm8gdmFsdWUsIHdoZXJlIHRoZSB2YWx1ZSB0eXBlIGlzIGEgbWVzc2FnZS4KLSAgICAgICAgICAgICAgICAgICAgLy8gUmVhZCBpdCBhcyBpZiB3ZSdkIHNlZW4gYW4gaW5wdXQgc3RyZWFtIHdpdGggbm8gZGF0YSAoaS5lLiBjcmVhdGUgYSAiZGVmYXVsdCIgbWVzc2FnZSkuCi0gICAgICAgICAgICAgICAgICAgIGlmIChWYWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWYWx1ZSA9IGNvZGVjLnZhbHVlQ29kZWMuUmVhZChuZXcgQ29kZWRJbnB1dFN0cmVhbShaZXJvTGVuZ3RoTWVzc2FnZVN0cmVhbURhdGEpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29kZWMua2V5Q29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIEtleSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvZGVjLnZhbHVlQ29kZWMuV3JpdGVUYWdBbmRWYWx1ZShvdXRwdXQsIFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGNvZGVjLmtleUNvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKEtleSkgKyBjb2RlYy52YWx1ZUNvZGVjLkNhbGN1bGF0ZVNpemVXaXRoVGFnKFZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBJTWVzc2FnZS5EZXNjcmlwdG9yIHsgZ2V0IHsgcmV0dXJuIG51bGw7IH0gfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBjbGFzcyBNYXBWaWV3PFQ+IDogSUNvbGxlY3Rpb248VD4sIElDb2xsZWN0aW9uCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgTWFwRmllbGQ8VEtleSwgVFZhbHVlPiBwYXJlbnQ7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8S2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4sIFQ+IHByb2plY3Rpb247Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8VCwgYm9vbD4gY29udGFpbnNDaGVjazsKLQotICAgICAgICAgICAgaW50ZXJuYWwgTWFwVmlldygKLSAgICAgICAgICAgICAgICBNYXBGaWVsZDxUS2V5LCBUVmFsdWU+IHBhcmVudCwKLSAgICAgICAgICAgICAgICBGdW5jPEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+LCBUPiBwcm9qZWN0aW9uLAotICAgICAgICAgICAgICAgIEZ1bmM8VCwgYm9vbD4gY29udGFpbnNDaGVjaykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICAgICAgICAgICAgICB0aGlzLnByb2plY3Rpb24gPSBwcm9qZWN0aW9uOwotICAgICAgICAgICAgICAgIHRoaXMuY29udGFpbnNDaGVjayA9IGNvbnRhaW5zQ2hlY2s7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBpbnQgQ291bnQgeyBnZXQgeyByZXR1cm4gcGFyZW50LkNvdW50OyB9IH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2wgSXNSZWFkT25seSB7IGdldCB7IHJldHVybiB0cnVlOyB9IH0KLQotICAgICAgICAgICAgcHVibGljIGJvb2wgSXNTeW5jaHJvbml6ZWQgeyBnZXQgeyByZXR1cm4gZmFsc2U7IH0gfQotCi0gICAgICAgICAgICBwdWJsaWMgb2JqZWN0IFN5bmNSb290IHsgZ2V0IHsgcmV0dXJuIHBhcmVudDsgfSB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIEFkZChUIGl0ZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRhaW5zQ2hlY2soaXRlbSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhUW10gYXJyYXksIGludCBhcnJheUluZGV4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChhcnJheUluZGV4IDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImFycmF5SW5kZXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGFycmF5SW5kZXggKyBDb3VudCAgPj0gYXJyYXkuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBhcnJheSIsICJhcnJheSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiB0aGlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXlbYXJyYXlJbmRleCsrXSA9IGl0ZW07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgSUVudW1lcmF0b3I8VD4gR2V0RW51bWVyYXRvcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHBhcmVudC5saXN0LlNlbGVjdChwcm9qZWN0aW9uKS5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShUIGl0ZW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gR2V0RW51bWVyYXRvcigpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oQXJyYXkgYXJyYXksIGludCBpbmRleCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoaW5kZXggPCAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiaW5kZXgiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4ICsgQ291bnQgPj0gYXJyYXkuTGVuZ3RoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJOb3QgZW5vdWdoIHNwYWNlIGluIHRoZSBhcnJheSIsICJhcnJheSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgaXRlbSBpbiB0aGlzKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYXJyYXkuU2V0VmFsdWUoaXRlbSwgaW5kZXgrKyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQ29sbGVjdGlvbnMvUmVhZE9ubHlEaWN0aW9uYXJ5LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQ29sbGVjdGlvbnMvUmVhZE9ubHlEaWN0aW9uYXJ5LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODUzMGEyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvbGxlY3Rpb25zL1JlYWRPbmx5RGljdGlvbmFyeS5jcworKysgL2Rldi9udWxsCkBAIC0xLDE0NyArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5Db2xsZWN0aW9ucwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVhZC1vbmx5IHdyYXBwZXIgYXJvdW5kIGFub3RoZXIgZGljdGlvbmFyeS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBSZWFkT25seURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiA6IElEaWN0aW9uYXJ5PFRLZXksIFRWYWx1ZT4KLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiB3cmFwcGVkOwotCi0gICAgICAgIHB1YmxpYyBSZWFkT25seURpY3Rpb25hcnkoSURpY3Rpb25hcnk8VEtleSwgVFZhbHVlPiB3cmFwcGVkKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLndyYXBwZWQgPSB3cmFwcGVkOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQWRkKFRLZXkga2V5LCBUVmFsdWUgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBDb250YWluc0tleShUS2V5IGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuQ29udGFpbnNLZXkoa2V5KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBJQ29sbGVjdGlvbjxUS2V5PiBLZXlzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkLktleXM7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShUS2V5IGtleSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIFRyeUdldFZhbHVlKFRLZXkga2V5LCBvdXQgVFZhbHVlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5UcnlHZXRWYWx1ZShrZXksIG91dCB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgSUNvbGxlY3Rpb248VFZhbHVlPiBWYWx1ZXMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWQuVmFsdWVzOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgVFZhbHVlIHRoaXNbVEtleSBrZXldCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiB3cmFwcGVkW2tleV07IH0KLSAgICAgICAgICAgIHNldCB7IHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCk7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIEFkZChLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPiBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgQ2xlYXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2wgQ29udGFpbnMoS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT4gaXRlbSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuQ29udGFpbnMoaXRlbSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBDb3B5VG8oS2V5VmFsdWVQYWlyPFRLZXksIFRWYWx1ZT5bXSBhcnJheSwgaW50IGFycmF5SW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyYXBwZWQuQ29weVRvKGFycmF5LCBhcnJheUluZGV4KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgQ291bnQKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHdyYXBwZWQuQ291bnQ7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRydWU7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIFJlbW92ZShLZXlWYWx1ZVBhaXI8VEtleSwgVFZhbHVlPiBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPEtleVZhbHVlUGFpcjxUS2V5LCBUVmFsdWU+PiBHZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuR2V0RW51bWVyYXRvcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgSUVudW1lcmF0b3IgSUVudW1lcmFibGUuR2V0RW51bWVyYXRvcigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAoKElFbnVtZXJhYmxlKSB3cmFwcGVkKS5HZXRFbnVtZXJhdG9yKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuRXF1YWxzKG9iaik7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIHdyYXBwZWQuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gd3JhcHBlZC5Ub1N0cmluZygpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvbGxlY3Rpb25zL1JlcGVhdGVkRmllbGQuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db2xsZWN0aW9ucy9SZXBlYXRlZEZpZWxkLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMWRiODU2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvbGxlY3Rpb25zL1JlcGVhdGVkRmllbGQuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1NjggKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uVGV4dDsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5Db2xsZWN0aW9ucwotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhlIGNvbnRlbnRzIG9mIGEgcmVwZWF0ZWQgZmllbGQ6IGVzc2VudGlhbGx5LCBhIGNvbGxlY3Rpb24gd2l0aCBzb21lIGV4dHJhCi0gICAgLy8vIHJlc3RyaWN0aW9ucyAobm8gbnVsbCB2YWx1ZXMpIGFuZCBjYXBhYmlsaXRpZXMgKGRlZXAgY2xvbmluZykuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIFRoaXMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgZ2VuZXJhbGx5IHByb2hpYml0IHRoZSB1c2Ugb2YgdHlwZXMgd2hpY2ggYXJlIG5vdAotICAgIC8vLyBzdXBwb3J0ZWQgYnkgUHJvdG9jb2wgQnVmZmVycyBidXQgbm9yIGRvZXMgaXQgZ3VhcmFudGVlIHRoYXQgYWxsIG9wZXJhdGlvbnMgd2lsbCB3b3JrIGluIHN1Y2ggY2FzZXMuCi0gICAgLy8vIDwvcmVtYXJrcz4KLSAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgZWxlbWVudCB0eXBlIG9mIHRoZSByZXBlYXRlZCBmaWVsZC48L3R5cGVwYXJhbT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIFJlcGVhdGVkRmllbGQ8VD4gOiBJTGlzdDxUPiwgSUxpc3QsIElEZWVwQ2xvbmVhYmxlPFJlcGVhdGVkRmllbGQ8VD4+LCBJRXF1YXRhYmxlPFJlcGVhdGVkRmllbGQ8VD4+Ci0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBUW10gRW1wdHlBcnJheSA9IG5ldyBUWzBdOwotICAgICAgICBwcml2YXRlIGNvbnN0IGludCBNaW5BcnJheVNpemUgPSA4OwotCi0gICAgICAgIHByaXZhdGUgVFtdIGFycmF5ID0gRW1wdHlBcnJheTsKLSAgICAgICAgcHJpdmF0ZSBpbnQgY291bnQgPSAwOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBkZWVwIGNsb25lIG9mIHRoaXMgcmVwZWF0ZWQgZmllbGQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIElmIHRoZSBmaWVsZCB0eXBlIGlzCi0gICAgICAgIC8vLyBhIG1lc3NhZ2UgdHlwZSwgZWFjaCBlbGVtZW50IGlzIGFsc28gY2xvbmVkOyBvdGhlcndpc2UsIGl0IGlzCi0gICAgICAgIC8vLyBhc3N1bWVkIHRoYXQgdGhlIGZpZWxkIHR5cGUgaXMgcHJpbWl0aXZlIChpbmNsdWRpbmcgc3RyaW5nIGFuZAotICAgICAgICAvLy8gYnl0ZXMsIGJvdGggb2Ygd2hpY2ggYXJlIGltbXV0YWJsZSkgYW5kIHNvIGEgc2ltcGxlIGNvcHkgaXMKLSAgICAgICAgLy8vIGVxdWl2YWxlbnQgdG8gYSBkZWVwIGNsb25lLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHJldHVybnM+QSBkZWVwIGNsb25lIG9mIHRoaXMgcmVwZWF0ZWQgZmllbGQuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgUmVwZWF0ZWRGaWVsZDxUPiBDbG9uZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8VD4gY2xvbmUgPSBuZXcgUmVwZWF0ZWRGaWVsZDxUPigpOwotICAgICAgICAgICAgaWYgKGFycmF5ICE9IEVtcHR5QXJyYXkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2xvbmUuYXJyYXkgPSAoVFtdKWFycmF5LkNsb25lKCk7Ci0gICAgICAgICAgICAgICAgSURlZXBDbG9uZWFibGU8VD5bXSBjbG9uZWFibGVBcnJheSA9IGNsb25lLmFycmF5IGFzIElEZWVwQ2xvbmVhYmxlPFQ+W107Ci0gICAgICAgICAgICAgICAgaWYgKGNsb25lYWJsZUFycmF5ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNsb25lLmFycmF5W2ldID0gY2xvbmVhYmxlQXJyYXlbaV0uQ2xvbmUoKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNsb25lLmNvdW50ID0gY291bnQ7Ci0gICAgICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIHRoZSBlbnRyaWVzIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbSwgZGVjb2RpbmcgdGhlbSB3aXRoIHRoZSBzcGVjaWZpZWQgY29kZWMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBpbnB1dCBzdHJlYW0gdG8gcmVhZCBmcm9tLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iY29kZWMiPlRoZSBjb2RlYyB0byB1c2UgaW4gb3JkZXIgdG8gcmVhZCBlYWNoIGVudHJ5LjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEFkZEVudHJpZXNGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIEZpZWxkQ29kZWM8VD4gY29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IElubGluZSBzb21lIG9mIHRoZSBBZGQgY29kZSwgc28gd2UgY2FuIGF2b2lkIGNoZWNraW5nIHRoZSBzaXplIG9uIGV2ZXJ5Ci0gICAgICAgICAgICAvLyBpdGVyYXRpb24uCi0gICAgICAgICAgICB1aW50IHRhZyA9IGlucHV0Lkxhc3RUYWc7Ci0gICAgICAgICAgICB2YXIgcmVhZGVyID0gY29kZWMuVmFsdWVSZWFkZXI7Ci0gICAgICAgICAgICAvLyBOb24tbnVsbGFibGUgdmFsdWUgdHlwZXMgY2FuIGJlIHBhY2tlZCBvciBub3QuCi0gICAgICAgICAgICBpZiAoRmllbGRDb2RlYzxUPi5Jc1BhY2tlZFJlcGVhdGVkRmllbGQodGFnKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgbGVuZ3RoID0gaW5wdXQuUmVhZExlbmd0aCgpOwotICAgICAgICAgICAgICAgIGlmIChsZW5ndGggPiAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaW50IG9sZExpbWl0ID0gaW5wdXQuUHVzaExpbWl0KGxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgICAgIHdoaWxlICghaW5wdXQuUmVhY2hlZExpbWl0KQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBBZGQocmVhZGVyKGlucHV0KSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaW5wdXQuUG9wTGltaXQob2xkTGltaXQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBFbXB0eSBwYWNrZWQgZmllbGQuIE9kZCwgYnV0IHZhbGlkIC0ganVzdCBpZ25vcmUuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gTm90IHBhY2tlZC4uLiAocG9zc2libHkgbm90IHBhY2thYmxlKQotICAgICAgICAgICAgICAgIGRvCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBBZGQocmVhZGVyKGlucHV0KSk7Ci0gICAgICAgICAgICAgICAgfSB3aGlsZSAoaW5wdXQuTWF5YmVDb25zdW1lVGFnKHRhZykpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiB0aGlzIGNvbGxlY3Rpb24gYmFzZWQgb24gdGhlIGdpdmVuIGNvZGVjLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvZGVjIj5UaGUgY29kZWMgdG8gdXNlIHdoZW4gZW5jb2RpbmcgZWFjaCBmaWVsZC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIHdyaXR0ZW4gdG8gYSA8c2VlIGNyZWY9IkNvZGVkT3V0cHV0U3RyZWFtIi8+IGJ5IDxzZWUgY3JlZj0iV3JpdGVUbyIvPiwKLSAgICAgICAgLy8vIHVzaW5nIHRoZSBzYW1lIGNvZGVjLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKEZpZWxkQ29kZWM8VD4gY29kZWMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChjb3VudCA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdWludCB0YWcgPSBjb2RlYy5UYWc7Ci0gICAgICAgICAgICBpZiAoY29kZWMuUGFja2VkUmVwZWF0ZWRGaWVsZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZGF0YVNpemUgPSBDYWxjdWxhdGVQYWNrZWREYXRhU2l6ZShjb2RlYyk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVSYXdWYXJpbnQzMlNpemUodGFnKSArCi0gICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVMZW5ndGhTaXplKGRhdGFTaXplKSArCi0gICAgICAgICAgICAgICAgICAgIGRhdGFTaXplOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBzaXplQ2FsY3VsYXRvciA9IGNvZGVjLlZhbHVlU2l6ZUNhbGN1bGF0b3I7Ci0gICAgICAgICAgICAgICAgaW50IHNpemUgPSBjb3VudCAqIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVSYXdWYXJpbnQzMlNpemUodGFnKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzaXplICs9IHNpemVDYWxjdWxhdG9yKGFycmF5W2ldKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGludCBDYWxjdWxhdGVQYWNrZWREYXRhU2l6ZShGaWVsZENvZGVjPFQ+IGNvZGVjKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZml4ZWRTaXplID0gY29kZWMuRml4ZWRTaXplOwotICAgICAgICAgICAgaWYgKGZpeGVkU2l6ZSA9PSAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBjYWxjdWxhdG9yID0gY29kZWMuVmFsdWVTaXplQ2FsY3VsYXRvcjsKLSAgICAgICAgICAgICAgICBpbnQgdG1wID0gMDsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0bXAgKz0gY2FsY3VsYXRvcihhcnJheVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB0bXA7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpeGVkU2l6ZSAqIENvdW50OwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIHRoZSBjb250ZW50cyBvZiB0aGlzIGNvbGxlY3Rpb24gdG8gdGhlIGdpdmVuIDxzZWUgY3JlZj0iQ29kZWRPdXRwdXRTdHJlYW0iLz4sCi0gICAgICAgIC8vLyBlbmNvZGluZyBlYWNoIHZhbHVlIHVzaW5nIHRoZSBzcGVjaWZpZWQgY29kZWMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij5UaGUgb3V0cHV0IHN0cmVhbSB0byB3cml0ZSB0by48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImNvZGVjIj5UaGUgY29kZWMgdG8gdXNlIHdoZW4gZW5jb2RpbmcgZWFjaCB2YWx1ZS48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCwgRmllbGRDb2RlYzxUPiBjb2RlYykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGNvdW50ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHdyaXRlciA9IGNvZGVjLlZhbHVlV3JpdGVyOwotICAgICAgICAgICAgdmFyIHRhZyA9IGNvZGVjLlRhZzsKLSAgICAgICAgICAgIGlmIChjb2RlYy5QYWNrZWRSZXBlYXRlZEZpZWxkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFBhY2tlZCBwcmltaXRpdmUgdHlwZQotICAgICAgICAgICAgICAgIHVpbnQgc2l6ZSA9ICh1aW50KUNhbGN1bGF0ZVBhY2tlZERhdGFTaXplKGNvZGVjKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVUYWcodGFnKTsKLSAgICAgICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdWYXJpbnQzMihzaXplKTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIob3V0cHV0LCBhcnJheVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE5vdCBwYWNrZWQ6IGEgc2ltcGxlIHRhZy92YWx1ZSBwYWlyIGZvciBlYWNoIHZhbHVlLgotICAgICAgICAgICAgICAgIC8vIENhbid0IHVzZSBjb2RlYy5Xcml0ZVRhZ0FuZFZhbHVlLCBhcyB0aGF0IG9taXRzIGRlZmF1bHQgdmFsdWVzLgotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZVRhZyh0YWcpOwotICAgICAgICAgICAgICAgICAgICB3cml0ZXIob3V0cHV0LCBhcnJheVtpXSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIEVuc3VyZVNpemUoaW50IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChhcnJheS5MZW5ndGggPCBzaXplKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNpemUgPSBNYXRoLk1heChzaXplLCBNaW5BcnJheVNpemUpOwotICAgICAgICAgICAgICAgIGludCBuZXdTaXplID0gTWF0aC5NYXgoYXJyYXkuTGVuZ3RoICogMiwgc2l6ZSk7Ci0gICAgICAgICAgICAgICAgdmFyIHRtcCA9IG5ldyBUW25ld1NpemVdOwotICAgICAgICAgICAgICAgIEFycmF5LkNvcHkoYXJyYXksIDAsIHRtcCwgMCwgYXJyYXkuTGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBhcnJheSA9IHRtcDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEFkZHMgdGhlIHNwZWNpZmllZCBpdGVtIHRvIHRoZSBjb2xsZWN0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Iml0ZW0iPlRoZSBpdGVtIHRvIGFkZC48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBBZGQoVCBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoaXRlbSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oIml0ZW0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVuc3VyZVNpemUoY291bnQgKyAxKTsKLSAgICAgICAgICAgIGFycmF5W2NvdW50KytdID0gaXRlbTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJlbW92ZXMgYWxsIGl0ZW1zIGZyb20gdGhlIGNvbGxlY3Rpb24uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIENsZWFyKCkKLSAgICAgICAgewotICAgICAgICAgICAgYXJyYXkgPSBFbXB0eUFycmF5OwotICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoaXMgY29sbGVjdGlvbiBjb250YWlucyB0aGUgZ2l2ZW4gaXRlbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byBmaW5kLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48Yz50cnVlPC9jPiBpZiB0aGlzIGNvbGxlY3Rpb24gY29udGFpbnMgdGhlIGdpdmVuIGl0ZW07IDxjPmZhbHNlPC9jPiBvdGhlcndpc2UuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYm9vbCBDb250YWlucyhUIGl0ZW0pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBJbmRleE9mKGl0ZW0pICE9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29waWVzIHRoaXMgY29sbGVjdGlvbiB0byB0aGUgZ2l2ZW4gYXJyYXkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJyYXkiPlRoZSBhcnJheSB0byBjb3B5IHRvLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYXJyYXlJbmRleCI+VGhlIGZpcnN0IGluZGV4IG9mIHRoZSBhcnJheSB0byBjb3B5IHRvLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIENvcHlUbyhUW10gYXJyYXksIGludCBhcnJheUluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnJheS5Db3B5KHRoaXMuYXJyYXksIDAsIGFycmF5LCBhcnJheUluZGV4LCBjb3VudCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZW1vdmVzIHRoZSBzcGVjaWZpZWQgaXRlbSBmcm9tIHRoZSBjb2xsZWN0aW9uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gcmVtb3ZlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz48Yz50cnVlPC9jPiBpZiB0aGUgaXRlbSB3YXMgZm91bmQgYW5kIHJlbW92ZWQ7IDxjPmZhbHNlPC9jPiBvdGhlcndpc2UuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYm9vbCBSZW1vdmUoVCBpdGVtKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgaW5kZXggPSBJbmRleE9mKGl0ZW0pOwotICAgICAgICAgICAgaWYgKGluZGV4ID09IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0gICAgICAgICAgICAKLSAgICAgICAgICAgIEFycmF5LkNvcHkoYXJyYXksIGluZGV4ICsgMSwgYXJyYXksIGluZGV4LCBjb3VudCAtIGluZGV4IC0gMSk7Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgYXJyYXlbY291bnRdID0gZGVmYXVsdChUKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGNvbnRhaW5lZCBpbiB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBDb3VudCB7IGdldCB7IHJldHVybiBjb3VudDsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyBhIHZhbHVlIGluZGljYXRpbmcgd2hldGhlciB0aGUgY29sbGVjdGlvbiBpcyByZWFkLW9ubHkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIElzUmVhZE9ubHkgeyBnZXQgeyByZXR1cm4gZmFsc2U7IH0gfQotCi0gICAgICAgIC8vIFRPRE86IFJlbW92ZSB0aGlzIG92ZXJsb2FkIGFuZCBqdXN0IGhhbmRsZSBpdCBpbiB0aGUgb25lIGJlbG93LCBhdCBleGVjdXRpb24gdGltZT8KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGFsbCBvZiB0aGUgc3BlY2lmaWVkIHZhbHVlcyBpbnRvIHRoaXMgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZXMiPlRoZSB2YWx1ZXMgdG8gYWRkIHRvIHRoaXMgY29sbGVjdGlvbi48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBBZGQoUmVwZWF0ZWRGaWVsZDxUPiB2YWx1ZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJ2YWx1ZXMiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVuc3VyZVNpemUoY291bnQgKyB2YWx1ZXMuY291bnQpOwotICAgICAgICAgICAgLy8gV2Uga25vdyB0aGF0IGFsbCB0aGUgdmFsdWVzIHdpbGwgYmUgdmFsaWQsIGJlY2F1c2UgaXQncyBhIFJlcGVhdGVkRmllbGQuCi0gICAgICAgICAgICBBcnJheS5Db3B5KHZhbHVlcy5hcnJheSwgMCwgYXJyYXksIGNvdW50LCB2YWx1ZXMuY291bnQpOwotICAgICAgICAgICAgY291bnQgKz0gdmFsdWVzLmNvdW50OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhbGwgb2YgdGhlIHNwZWNpZmllZCB2YWx1ZXMgaW50byB0aGlzIGNvbGxlY3Rpb24uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWVzIj5UaGUgdmFsdWVzIHRvIGFkZCB0byB0aGlzIGNvbGxlY3Rpb24uPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHZvaWQgQWRkKElFbnVtZXJhYmxlPFQ+IHZhbHVlcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlcyA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24oInZhbHVlcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgZm9yIElDb2xsZWN0aW9uIGFuZCBnZXQgdGhlIENvdW50LCB0byBvcHRpbWl6ZT8KLSAgICAgICAgICAgIGZvcmVhY2ggKFQgaXRlbSBpbiB2YWx1ZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgQWRkKGl0ZW0pOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhbiBlbnVtZXJhdG9yIHRoYXQgaXRlcmF0ZXMgdGhyb3VnaCB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPgotICAgICAgICAvLy8gQW4gZW51bWVyYXRvciB0aGF0IGNhbiBiZSB1c2VkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElFbnVtZXJhdG9yPFQ+IEdldEVudW1lcmF0b3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeWllbGQgcmV0dXJuIGFycmF5W2ldOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRGV0ZXJtaW5lcyB3aGV0aGVyIHRoZSBzcGVjaWZpZWQgPHNlZSBjcmVmPSJTeXN0ZW0uT2JqZWN0IiAvPiwgaXMgZXF1YWwgdG8gdGhpcyBpbnN0YW5jZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvYmoiPlRoZSA8c2VlIGNyZWY9IlN5c3RlbS5PYmplY3QiIC8+IHRvIGNvbXBhcmUgd2l0aCB0aGlzIGluc3RhbmNlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz4KLSAgICAgICAgLy8vICAgPGM+dHJ1ZTwvYz4gaWYgdGhlIHNwZWNpZmllZCA8c2VlIGNyZWY9IlN5c3RlbS5PYmplY3QiIC8+IGlzIGVxdWFsIHRvIHRoaXMgaW5zdGFuY2U7IG90aGVyd2lzZSwgPGM+ZmFsc2U8L2M+LgotICAgICAgICAvLy8gPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEVxdWFscyhvYmogYXMgUmVwZWF0ZWRGaWVsZDxUPik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGFuIGVudW1lcmF0b3IgdGhhdCBpdGVyYXRlcyB0aHJvdWdoIGEgY29sbGVjdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPgotICAgICAgICAvLy8gQW4gPHNlZSBjcmVmPSJUOlN5c3RlbS5Db2xsZWN0aW9ucy5JRW51bWVyYXRvciIgLz4gb2JqZWN0IHRoYXQgY2FuIGJlIHVzZWQgdG8gaXRlcmF0ZSB0aHJvdWdoIHRoZSBjb2xsZWN0aW9uLgotICAgICAgICAvLy8gPC9yZXR1cm5zPgotICAgICAgICBJRW51bWVyYXRvciBJRW51bWVyYWJsZS5HZXRFbnVtZXJhdG9yKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEdldEVudW1lcmF0b3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBoYXNoIGNvZGUgZm9yIHRoaXMgaW5zdGFuY2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz4KLSAgICAgICAgLy8vIEEgaGFzaCBjb2RlIGZvciB0aGlzIGluc3RhbmNlLCBzdWl0YWJsZSBmb3IgdXNlIGluIGhhc2hpbmcgYWxnb3JpdGhtcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzIGxpa2UgYSBoYXNoIHRhYmxlLiAKLSAgICAgICAgLy8vIDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBoYXNoID0gMDsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDMxICsgYXJyYXlbaV0uR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29tcGFyZXMgdGhpcyByZXBlYXRlZCBmaWVsZCB3aXRoIGFub3RoZXIgZm9yIGVxdWFsaXR5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im90aGVyIj5UaGUgcmVwZWF0ZWQgZmllbGQgdG8gY29tcGFyZSB0aGlzIHdpdGguPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjxjPnRydWU8L2M+IGlmIDxwYXJhbXJlZiBuYW1lPSJvdGhlciIvPiByZWZlcnMgdG8gYW4gZXF1YWwgcmVwZWF0ZWQgZmllbGQ7IDxjPmZhbHNlPC9jPiBvdGhlcndpc2UuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoUmVwZWF0ZWRGaWVsZDxUPiBvdGhlcikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAob3RoZXIuQ291bnQgIT0gdGhpcy5Db3VudCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFcXVhbGl0eUNvbXBhcmVyPFQ+IGNvbXBhcmVyID0gRXF1YWxpdHlDb21wYXJlcjxUPi5EZWZhdWx0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghY29tcGFyZXIuRXF1YWxzKGFycmF5W2ldLCBvdGhlci5hcnJheVtpXSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBpbmRleCBvZiB0aGUgZ2l2ZW4gaXRlbSB3aXRoaW4gdGhlIGNvbGxlY3Rpb24sIG9yIC0xIGlmIHRoZSBpdGVtIGlzIG5vdAotICAgICAgICAvLy8gcHJlc2VudC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpdGVtIj5UaGUgaXRlbSB0byBmaW5kIGluIHRoZSBjb2xsZWN0aW9uLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgaXRlbSwgb3IgLTEgaWYgaXQgaXMgbm90IGZvdW5kLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIGludCBJbmRleE9mKFQgaXRlbSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBFcXVhbGl0eUNvbXBhcmVyPFQ+IGNvbXBhcmVyID0gRXF1YWxpdHlDb21wYXJlcjxUPi5EZWZhdWx0OwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChjb21wYXJlci5FcXVhbHMoYXJyYXlbaV0sIGl0ZW0pKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5zZXJ0cyB0aGUgZ2l2ZW4gaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij5UaGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBpdGVtLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaXRlbSI+VGhlIGl0ZW0gdG8gaW5zZXJ0LjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyB2b2lkIEluc2VydChpbnQgaW5kZXgsIFQgaXRlbSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGl0ZW0gPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnROdWxsRXhjZXB0aW9uKCJpdGVtIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gY291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiaW5kZXgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEVuc3VyZVNpemUoY291bnQgKyAxKTsKLSAgICAgICAgICAgIEFycmF5LkNvcHkoYXJyYXksIGluZGV4LCBhcnJheSwgaW5kZXggKyAxLCBjb3VudCAtIGluZGV4KTsKLSAgICAgICAgICAgIGFycmF5W2luZGV4XSA9IGl0ZW07Ci0gICAgICAgICAgICBjb3VudCsrOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmVtb3ZlcyB0aGUgaXRlbSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5kZXgiPlRoZSB6ZXJvLWJhc2VkIGluZGV4IG9mIHRoZSBpdGVtIHRvIHJlbW92ZS48L3BhcmFtPgotICAgICAgICBwdWJsaWMgdm9pZCBSZW1vdmVBdChpbnQgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50T3V0T2ZSYW5nZUV4Y2VwdGlvbigiaW5kZXgiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIEFycmF5LkNvcHkoYXJyYXksIGluZGV4ICsgMSwgYXJyYXksIGluZGV4LCBjb3VudCAtIGluZGV4IC0gMSk7Ci0gICAgICAgICAgICBjb3VudC0tOwotICAgICAgICAgICAgYXJyYXlbY291bnRdID0gZGVmYXVsdChUKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyByZXBlYXRlZCBmaWVsZCwgaW4gdGhlIHNhbWUKLSAgICAgICAgLy8vIHdheSBhcyBpdCB3b3VsZCBiZSByZXByZXNlbnRlZCBieSB0aGUgZGVmYXVsdCBKU09OIGZvcm1hdHRlci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICBKc29uRm9ybWF0dGVyLkRlZmF1bHQuV3JpdGVMaXN0KHdyaXRlciwgdGhpcyk7Ci0gICAgICAgICAgICByZXR1cm4gd3JpdGVyLlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIG9yIHNldHMgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBpbmRleC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImluZGV4Ij5UaGUgemVyby1iYXNlZCBpbmRleCBvZiB0aGUgZWxlbWVudCB0byBnZXQgb3Igc2V0LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIFQgdGhpc1tpbnQgaW5kZXhdCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gY291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRPdXRPZlJhbmdlRXhjZXB0aW9uKCJpbmRleCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gYXJyYXlbaW5kZXhdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgc2V0Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBjb3VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE91dE9mUmFuZ2VFeGNlcHRpb24oImluZGV4Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbigidmFsdWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYXJyYXlbaW5kZXhdID0gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAjcmVnaW9uIEV4cGxpY2l0IGludGVyZmFjZSBpbXBsZW1lbnRhdGlvbiBmb3IgSUxpc3QgYW5kIElDb2xsZWN0aW9uLgotICAgICAgICBib29sIElMaXN0LklzRml4ZWRTaXplIHsgZ2V0IHsgcmV0dXJuIGZhbHNlOyB9IH0KLQotICAgICAgICB2b2lkIElDb2xsZWN0aW9uLkNvcHlUbyhBcnJheSBhcnJheSwgaW50IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBBcnJheS5Db3B5KHRoaXMuYXJyYXksIDAsIGFycmF5LCBpbmRleCwgY291bnQpOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBJQ29sbGVjdGlvbi5Jc1N5bmNocm9uaXplZCB7IGdldCB7IHJldHVybiBmYWxzZTsgfSB9Ci0KLSAgICAgICAgb2JqZWN0IElDb2xsZWN0aW9uLlN5bmNSb290IHsgZ2V0IHsgcmV0dXJuIHRoaXM7IH0gfQotCi0gICAgICAgIG9iamVjdCBJTGlzdC50aGlzW2ludCBpbmRleF0KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIHRoaXNbaW5kZXhdOyB9Ci0gICAgICAgICAgICBzZXQgeyB0aGlzW2luZGV4XSA9IChUKXZhbHVlOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgSUxpc3QuQWRkKG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgQWRkKChUKSB2YWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gY291bnQgLSAxOwotICAgICAgICB9Ci0KLSAgICAgICAgYm9vbCBJTGlzdC5Db250YWlucyhvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAodmFsdWUgaXMgVCAmJiBDb250YWlucygoVCl2YWx1ZSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50IElMaXN0LkluZGV4T2Yob2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpcyBUKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gSW5kZXhPZigoVCl2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICB2b2lkIElMaXN0Lkluc2VydChpbnQgaW5kZXgsIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgSW5zZXJ0KGluZGV4LCAoVCkgdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgdm9pZCBJTGlzdC5SZW1vdmUob2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoISh2YWx1ZSBpcyBUKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSZW1vdmUoKFQpdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgICNlbmRyZWdpb24gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvbXBhdGliaWxpdHkvUHJvcGVydHlJbmZvRXh0ZW5zaW9ucy5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvbXBhdGliaWxpdHkvUHJvcGVydHlJbmZvRXh0ZW5zaW9ucy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGE2ZmVmYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Db21wYXRpYmlsaXR5L1Byb3BlcnR5SW5mb0V4dGVuc2lvbnMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5Db21wYXRpYmlsaXR5Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBFeHRlbnNpb24gbWV0aG9kcyBmb3IgPHNlZSBjcmVmPSJQcm9wZXJ0eUluZm8iLz4sIGVmZmVjdGl2ZWx5IHByb3ZpZGluZwotICAgIC8vLyB0aGUgZmFtaWxpYXIgbWVtYmVycyBmcm9tIHByZXZpb3VzIGRlc2t0b3AgZnJhbWV3b3JrIHZlcnNpb25zIHdoaWxlCi0gICAgLy8vIHRhcmdldGluZyB0aGUgbmV3ZXIgcmVsZWFzZXMsIC5ORVQgQ29yZSBldGMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBzdGF0aWMgY2xhc3MgUHJvcGVydHlJbmZvRXh0ZW5zaW9ucwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgcHVibGljIGdldHRlciBvZiBhIHByb3BlcnR5LCBvciBudWxsIGlmIHRoZXJlIGlzIG5vIHN1Y2ggZ2V0dGVyCi0gICAgICAgIC8vLyAoZWl0aGVyIGJlY2F1c2UgaXQncyByZWFkLW9ubHksIG9yIHRoZSBnZXR0ZXIgaXNuJ3QgcHVibGljKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIE1ldGhvZEluZm8gR2V0R2V0TWV0aG9kKHRoaXMgUHJvcGVydHlJbmZvIHRhcmdldCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG1ldGhvZCA9IHRhcmdldC5HZXRNZXRob2Q7Ci0gICAgICAgICAgICByZXR1cm4gbWV0aG9kICE9IG51bGwgJiYgbWV0aG9kLklzUHVibGljID8gbWV0aG9kIDogbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHB1YmxpYyBzZXR0ZXIgb2YgYSBwcm9wZXJ0eSwgb3IgbnVsbCBpZiB0aGVyZSBpcyBubyBzdWNoIHNldHRlcgotICAgICAgICAvLy8gKGVpdGhlciBiZWNhdXNlIGl0J3Mgd3JpdGUtb25seSwgb3IgdGhlIHNldHRlciBpc24ndCBwdWJsaWMpLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgTWV0aG9kSW5mbyBHZXRTZXRNZXRob2QodGhpcyBQcm9wZXJ0eUluZm8gdGFyZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWV0aG9kID0gdGFyZ2V0LlNldE1ldGhvZDsKLSAgICAgICAgICAgIHJldHVybiBtZXRob2QgIT0gbnVsbCAmJiBtZXRob2QuSXNQdWJsaWMgPyBtZXRob2QgOiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQ29tcGF0aWJpbGl0eS9UeXBlRXh0ZW5zaW9ucy5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0NvbXBhdGliaWxpdHkvVHlwZUV4dGVuc2lvbnMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2MmEyOWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvQ29tcGF0aWJpbGl0eS9UeXBlRXh0ZW5zaW9ucy5jcworKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5Db21wYXRpYmlsaXR5Ci17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBQcm92aWRlcyBleHRlbnNpb24gbWV0aG9kcyBvbiBUeXBlIHRoYXQganVzdCBwcm94eSB0byBUeXBlSW5mby4KLSAgICAvLy8gVGhlc2UgYXJlIHVzZWQgdG8gc3VwcG9ydCB0aGUgbmV3IHR5cGUgc3lzdGVtIGZyb20gLk5FVCA0LjUsIHdpdGhvdXQKLSAgICAvLy8gaGF2aW5nIGNhbGxzIHRvIEdldFR5cGVJbmZvIGFsbCBvdmVyIHRoZSBwbGFjZS4gV2hpbGUgdGhlIG1ldGhvZHMgaGVyZSBhcmUgbWVhbnQgdG8gYmUKLSAgICAvLy8gYnJvYWRseSBjb21wYXRpYmxlIHdpdGggdGhlIGRlc2t0b3AgZnJhbWV3b3JrLCB0aGVyZSBhcmUgc29tZSBzdWJ0bGUgZGlmZmVyZW5jZXMgaW4gYmVoYXZpb3VyIC0gYnV0Ci0gICAgLy8vIHRoZXkncmUgbm90IGV4cGVjdGVkIHRvIGFmZmVjdCBvdXIgdXNlIGNhc2VzLiBXaGlsZSB0aGUgY2xhc3MgaXMgaW50ZXJuYWwsIHRoYXQgc2hvdWxkIGJlIGZpbmU6IHdlIGNhbgotICAgIC8vLyBldmFsdWF0ZSBlYWNoIG5ldyB1c2UgYXBwcm9wcmlhdGVseS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBUeXBlRXh0ZW5zaW9ucwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0YXJnZXQgdHlwZSBpcyBhIHZhbHVlIHR5cGUsIGluY2x1ZGluZyBhIG51bGxhYmxlIHZhbHVlIHR5cGUgb3IgYW4gZW51bSwgb3IgZmFsc2UKLSAgICAgICAgLy8vIGlmIGl0J3MgYSByZWZlcmVuY2UgdHlwZSAoY2xhc3MsIGRlbGVnYXRlLCBpbnRlcmZhY2UgLSBpbmNsdWRpbmcgU3lzdGVtLlZhbHVlVHlwZSBhbmQgU3lzdGVtLkVudW0pLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc1ZhbHVlVHlwZSh0aGlzIFR5cGUgdGFyZ2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LkdldFR5cGVJbmZvKCkuSXNWYWx1ZVR5cGU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTZWUgaHR0cHM6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9zeXN0ZW0udHlwZS5pc2Fzc2lnbmFibGVmcm9tCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIElzQXNzaWduYWJsZUZyb20odGhpcyBUeXBlIHRhcmdldCwgVHlwZSBjKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0LkdldFR5cGVJbmZvKCkuSXNBc3NpZ25hYmxlRnJvbShjLkdldFR5cGVJbmZvKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBwdWJsaWMgcHJvcGVydHkgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiB0eXBlLAotICAgICAgICAvLy8gaW5jbHVkaW5nIGluaGVyaXRlZCBwcm9wZXJ0aWVzIG9yIG51bGwgaWYgdGhlcmUgaXMgbm8gc3VjaCBwdWJsaWMgcHJvcGVydHkuCi0gICAgICAgIC8vLyBIZXJlLCAicHVibGljIHByb3BlcnR5IiBtZWFucyBhIHByb3BlcnR5IHdoZXJlIGVpdGhlciB0aGUgZ2V0dGVyLCBvciB0aGUgc2V0dGVyLCBvciBib3RoLCBpcyBwdWJsaWMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBQcm9wZXJ0eUluZm8gR2V0UHJvcGVydHkodGhpcyBUeXBlIHRhcmdldCwgc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldERlY2xhcmVkUHJvcGVydHkgb25seSByZXR1cm5zIHByb3BlcnRpZXMgZGVjbGFyZWQgaW4gdGhlIGdpdmVuIHR5cGUsIHNvIHdlIG5lZWQgdG8gcmVjdXJzZS4KLSAgICAgICAgICAgIHdoaWxlICh0YXJnZXQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgdHlwZUluZm8gPSB0YXJnZXQuR2V0VHlwZUluZm8oKTsKLSAgICAgICAgICAgICAgICB2YXIgcmV0ID0gdHlwZUluZm8uR2V0RGVjbGFyZWRQcm9wZXJ0eShuYW1lKTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ICE9IG51bGwgJiYgKChyZXQuQ2FuUmVhZCAmJiByZXQuR2V0TWV0aG9kLklzUHVibGljKSB8fCAocmV0LkNhbldyaXRlICYmIHJldC5TZXRNZXRob2QuSXNQdWJsaWMpKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRhcmdldCA9IHR5cGVJbmZvLkJhc2VUeXBlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGEgcmVwcmVzZW50YXRpb24gb2YgdGhlIHB1YmxpYyBtZXRob2QgYXNzb2NpYXRlZCB3aXRoIHRoZSBnaXZlbiBuYW1lIGluIHRoZSBnaXZlbiB0eXBlLAotICAgICAgICAvLy8gaW5jbHVkaW5nIGluaGVyaXRlZCBtZXRob2RzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIGhhcyBhIGZldyBkaWZmZXJlbmNlcyBjb21wYXJlZCB3aXRoIFR5cGUuR2V0TWV0aG9kIGluIHRoZSBkZXNrdG9wIGZyYW1ld29yay4gSXQgd2lsbCB0aHJvdwotICAgICAgICAvLy8gaWYgdGhlcmUgaXMgYW4gYW1iaWd1b3VzIG1hdGNoIGV2ZW4gYmV0d2VlbiBhIHByaXZhdGUgbWV0aG9kIGFuZCBhIHB1YmxpYyBvbmUsIGJ1dCBpdCAqd29uJ3QqIHRocm93Ci0gICAgICAgIC8vLyBpZiB0aGVyZSBhcmUgdHdvIG92ZXJsb2FkcyBhdCBkaWZmZXJlbnQgbGV2ZWxzIGluIHRoZSB0eXBlIGhpZXJhcmNoeSAoZS5nLiBjbGFzcyBCYXNlIGRlY2xhcmVzIHB1YmxpYyB2b2lkIEZvbyhpbnQpIGFuZAotICAgICAgICAvLy8gY2xhc3MgQ2hpbGQgOiBCYXNlIGRlY2xhcmVzIHB1YmxpYyB2b2lkIEZvbyhsb25nKSkuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkFtYmlndW91c01hdGNoRXhjZXB0aW9uIj5PbmUgdHlwZSBpbiB0aGUgaGllcmFyY2h5IGRlY2xhcmVkIG1vcmUgdGhhbiBvbmUgbWV0aG9kIHdpdGggdGhlIHNhbWUgbmFtZTwvZXhjZXB0aW9uPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgTWV0aG9kSW5mbyBHZXRNZXRob2QodGhpcyBUeXBlIHRhcmdldCwgc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEdldERlY2xhcmVkTWV0aG9kIG9ubHkgcmV0dXJucyBtZXRob2RzIGRlY2xhcmVkIGluIHRoZSBnaXZlbiB0eXBlLCBzbyB3ZSBuZWVkIHRvIHJlY3Vyc2UuCi0gICAgICAgICAgICB3aGlsZSAodGFyZ2V0ICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIHR5cGVJbmZvID0gdGFyZ2V0LkdldFR5cGVJbmZvKCk7Ci0gICAgICAgICAgICAgICAgdmFyIHJldCA9IHR5cGVJbmZvLkdldERlY2xhcmVkTWV0aG9kKG5hbWUpOwotICAgICAgICAgICAgICAgIGlmIChyZXQgIT0gbnVsbCAmJiByZXQuSXNQdWJsaWMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB0YXJnZXQgPSB0eXBlSW5mby5CYXNlVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvRmllbGRDb2RlYy5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0ZpZWxkQ29kZWMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4MzEzMDguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvRmllbGRDb2RlYy5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ3MyArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBHb29nbGUuUHJvdG9idWYuQ29tcGF0aWJpbGl0eTsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlczsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBGYWN0b3J5IG1ldGhvZHMgZm9yIDxzZWUgY3JlZj0iRmllbGRDb2RlY3tUfSIvPi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgRmllbGRDb2RlYwotICAgIHsKLSAgICAgICAgLy8gVE9ETzogQXZvaWQgdGhlICJkdWFsIGhpdCIgb2YgbGFtYmRhIGV4cHJlc3Npb25zOiBjcmVhdGUgb3BlbiBkZWxlZ2F0ZXMgaW5zdGVhZC4gKEF0IGxlYXN0IHRlc3QuLi4pCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGEgc3RyaW5nIGZpZWxkIHdpdGggdGhlIGdpdmVuIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSB0YWcuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgY29kZWMgZm9yIHRoZSBnaXZlbiB0YWcuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkQ29kZWM8c3RyaW5nPiBGb3JTdHJpbmcodWludCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzxzdHJpbmc+KGlucHV0ID0+IGlucHV0LlJlYWRTdHJpbmcoKSwgKG91dHB1dCwgdmFsdWUpID0+IG91dHB1dC5Xcml0ZVN0cmluZyh2YWx1ZSksIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplLCB0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGEgYnl0ZXMgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRhZyI+VGhlIHRhZy48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+QSBjb2RlYyBmb3IgdGhlIGdpdmVuIHRhZy48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgRmllbGRDb2RlYzxCeXRlU3RyaW5nPiBGb3JCeXRlcyh1aW50IHRhZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENvZGVjPEJ5dGVTdHJpbmc+KGlucHV0ID0+IGlucHV0LlJlYWRCeXRlcygpLCAob3V0cHV0LCB2YWx1ZSkgPT4gb3V0cHV0LldyaXRlQnl0ZXModmFsdWUpLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplLCB0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGEgYm9vbCBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPGJvb2w+IEZvckJvb2wodWludCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzxib29sPihpbnB1dCA9PiBpbnB1dC5SZWFkQm9vbCgpLCAob3V0cHV0LCB2YWx1ZSkgPT4gb3V0cHV0LldyaXRlQm9vbCh2YWx1ZSksIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCb29sU2l6ZSwgdGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHJpZXZlcyBhIGNvZGVjIHN1aXRhYmxlIGZvciBhbiBpbnQzMiBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPGludD4gRm9ySW50MzIodWludCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzxpbnQ+KGlucHV0ID0+IGlucHV0LlJlYWRJbnQzMigpLCAob3V0cHV0LCB2YWx1ZSkgPT4gb3V0cHV0LldyaXRlSW50MzIodmFsdWUpLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplLCB0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGFuIHNpbnQzMiBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPGludD4gRm9yU0ludDMyKHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29kZWM8aW50PihpbnB1dCA9PiBpbnB1dC5SZWFkU0ludDMyKCksIChvdXRwdXQsIHZhbHVlKSA9PiBvdXRwdXQuV3JpdGVTSW50MzIodmFsdWUpLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU0ludDMyU2l6ZSwgdGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHJpZXZlcyBhIGNvZGVjIHN1aXRhYmxlIGZvciBhIGZpeGVkMzIgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRhZyI+VGhlIHRhZy48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+QSBjb2RlYyBmb3IgdGhlIGdpdmVuIHRhZy48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgRmllbGRDb2RlYzx1aW50PiBGb3JGaXhlZDMyKHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29kZWM8dWludD4oaW5wdXQgPT4gaW5wdXQuUmVhZEZpeGVkMzIoKSwgKG91dHB1dCwgdmFsdWUpID0+IG91dHB1dC5Xcml0ZUZpeGVkMzIodmFsdWUpLCA0LCB0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGFuIHNmaXhlZDMyIGZpZWxkIHdpdGggdGhlIGdpdmVuIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSB0YWcuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgY29kZWMgZm9yIHRoZSBnaXZlbiB0YWcuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkQ29kZWM8aW50PiBGb3JTRml4ZWQzMih1aW50IHRhZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENvZGVjPGludD4oaW5wdXQgPT4gaW5wdXQuUmVhZFNGaXhlZDMyKCksIChvdXRwdXQsIHZhbHVlKSA9PiBvdXRwdXQuV3JpdGVTRml4ZWQzMih2YWx1ZSksIDQsIHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXRyaWV2ZXMgYSBjb2RlYyBzdWl0YWJsZSBmb3IgYSB1aW50MzIgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRhZyI+VGhlIHRhZy48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+QSBjb2RlYyBmb3IgdGhlIGdpdmVuIHRhZy48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgRmllbGRDb2RlYzx1aW50PiBGb3JVSW50MzIodWludCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzx1aW50PihpbnB1dCA9PiBpbnB1dC5SZWFkVUludDMyKCksIChvdXRwdXQsIHZhbHVlKSA9PiBvdXRwdXQuV3JpdGVVSW50MzIodmFsdWUpLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlVUludDMyU2l6ZSwgdGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHJpZXZlcyBhIGNvZGVjIHN1aXRhYmxlIGZvciBhbiBpbnQ2NCBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPGxvbmc+IEZvckludDY0KHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29kZWM8bG9uZz4oaW5wdXQgPT4gaW5wdXQuUmVhZEludDY0KCksIChvdXRwdXQsIHZhbHVlKSA9PiBvdXRwdXQuV3JpdGVJbnQ2NCh2YWx1ZSksIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUsIHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXRyaWV2ZXMgYSBjb2RlYyBzdWl0YWJsZSBmb3IgYW4gc2ludDY0IGZpZWxkIHdpdGggdGhlIGdpdmVuIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSB0YWcuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgY29kZWMgZm9yIHRoZSBnaXZlbiB0YWcuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkQ29kZWM8bG9uZz4gRm9yU0ludDY0KHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29kZWM8bG9uZz4oaW5wdXQgPT4gaW5wdXQuUmVhZFNJbnQ2NCgpLCAob3V0cHV0LCB2YWx1ZSkgPT4gb3V0cHV0LldyaXRlU0ludDY0KHZhbHVlKSwgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVNJbnQ2NFNpemUsIHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXRyaWV2ZXMgYSBjb2RlYyBzdWl0YWJsZSBmb3IgYSBmaXhlZDY0IGZpZWxkIHdpdGggdGhlIGdpdmVuIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSB0YWcuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgY29kZWMgZm9yIHRoZSBnaXZlbiB0YWcuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkQ29kZWM8dWxvbmc+IEZvckZpeGVkNjQodWludCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzx1bG9uZz4oaW5wdXQgPT4gaW5wdXQuUmVhZEZpeGVkNjQoKSwgKG91dHB1dCwgdmFsdWUpID0+IG91dHB1dC5Xcml0ZUZpeGVkNjQodmFsdWUpLCA4LCB0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGFuIHNmaXhlZDY0IGZpZWxkIHdpdGggdGhlIGdpdmVuIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0YWciPlRoZSB0YWcuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgY29kZWMgZm9yIHRoZSBnaXZlbiB0YWcuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkQ29kZWM8bG9uZz4gRm9yU0ZpeGVkNjQodWludCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzxsb25nPihpbnB1dCA9PiBpbnB1dC5SZWFkU0ZpeGVkNjQoKSwgKG91dHB1dCwgdmFsdWUpID0+IG91dHB1dC5Xcml0ZVNGaXhlZDY0KHZhbHVlKSwgOCwgdGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHJpZXZlcyBhIGNvZGVjIHN1aXRhYmxlIGZvciBhIHVpbnQ2NCBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPHVsb25nPiBGb3JVSW50NjQodWludCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzx1bG9uZz4oaW5wdXQgPT4gaW5wdXQuUmVhZFVJbnQ2NCgpLCAob3V0cHV0LCB2YWx1ZSkgPT4gb3V0cHV0LldyaXRlVUludDY0KHZhbHVlKSwgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUsIHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXRyaWV2ZXMgYSBjb2RlYyBzdWl0YWJsZSBmb3IgYSBmbG9hdCBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPGZsb2F0PiBGb3JGbG9hdCh1aW50IHRhZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENvZGVjPGZsb2F0PihpbnB1dCA9PiBpbnB1dC5SZWFkRmxvYXQoKSwgKG91dHB1dCwgdmFsdWUpID0+IG91dHB1dC5Xcml0ZUZsb2F0KHZhbHVlKSwgQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUZsb2F0U2l6ZSwgdGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHJpZXZlcyBhIGNvZGVjIHN1aXRhYmxlIGZvciBhIGRvdWJsZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPGRvdWJsZT4gRm9yRG91YmxlKHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29kZWM8ZG91YmxlPihpbnB1dCA9PiBpbnB1dC5SZWFkRG91YmxlKCksIChvdXRwdXQsIHZhbHVlKSA9PiBvdXRwdXQuV3JpdGVEb3VibGUodmFsdWUpLCBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRG91YmxlU2l6ZSwgdGFnKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVudW1zIGFyZSB0cmlja3kuIFdlIGNhbiBwcm9iYWJseSB1c2UgZXhwcmVzc2lvbiB0cmVlcyB0byBidWlsZCB0aGVzZSBkZWxlZ2F0ZXMgYXV0b21hdGljYWxseSwKLSAgICAgICAgLy8gYnV0IGl0J3MgZWFzeSB0byBnZW5lcmF0ZSB0aGUgY29kZSBmb3IgaXQuCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGFuIGVudW0gZmllbGQgd2l0aCB0aGUgZ2l2ZW4gdGFnLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRhZyI+VGhlIHRhZy48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InRvSW50MzIiPkEgY29udmVyc2lvbiBmdW5jdGlvbiBmcm9tIDxzZWUgY3JlZj0iSW50MzIiLz4gdG8gdGhlIGVudW0gdHlwZS48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZyb21JbnQzMiI+QSBjb252ZXJzaW9uIGZ1bmN0aW9uIGZyb20gdGhlIGVudW0gdHlwZSB0byA8c2VlIGNyZWY9IkludDMyIi8+LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIGNvZGVjIGZvciB0aGUgZ2l2ZW4gdGFnLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPFQ+IEZvckVudW08VD4odWludCB0YWcsIEZ1bmM8VCwgaW50PiB0b0ludDMyLCBGdW5jPGludCwgVD4gZnJvbUludDMyKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29kZWM8VD4oaW5wdXQgPT4gZnJvbUludDMyKAotICAgICAgICAgICAgICAgIGlucHV0LlJlYWRFbnVtKCkpLAotICAgICAgICAgICAgICAgIChvdXRwdXQsIHZhbHVlKSA9PiBvdXRwdXQuV3JpdGVFbnVtKHRvSW50MzIodmFsdWUpKSwKLSAgICAgICAgICAgICAgICB2YWx1ZSA9PiBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUodG9JbnQzMih2YWx1ZSkpLCB0YWcpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0cmlldmVzIGEgY29kZWMgc3VpdGFibGUgZm9yIGEgbWVzc2FnZSBmaWVsZCB3aXRoIHRoZSBnaXZlbiB0YWcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGFnIj5UaGUgdGFnLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icGFyc2VyIj5BIHBhcnNlciB0byB1c2UgZm9yIHRoZSBtZXNzYWdlIHR5cGUuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgY29kZWMgZm9yIHRoZSBnaXZlbiB0YWcuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkQ29kZWM8VD4gRm9yTWVzc2FnZTxUPih1aW50IHRhZywgTWVzc2FnZVBhcnNlcjxUPiBwYXJzZXIpIHdoZXJlIFQgOiBJTWVzc2FnZTxUPgotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEZpZWxkQ29kZWM8VD4oaW5wdXQgPT4geyBUIG1lc3NhZ2UgPSBwYXJzZXIuQ3JlYXRlVGVtcGxhdGUoKTsgaW5wdXQuUmVhZE1lc3NhZ2UobWVzc2FnZSk7IHJldHVybiBtZXNzYWdlOyB9LAotICAgICAgICAgICAgICAgIChvdXRwdXQsIHZhbHVlKSA9PiBvdXRwdXQuV3JpdGVNZXNzYWdlKHZhbHVlKSwgbWVzc2FnZSA9PiBDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUobWVzc2FnZSksIHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgY29kZWMgZm9yIGEgd3JhcHBlciB0eXBlIG9mIGEgY2xhc3MgLSB3aGljaCBtdXN0IGJlIHN0cmluZyBvciBCeXRlU3RyaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpZWxkQ29kZWM8VD4gRm9yQ2xhc3NXcmFwcGVyPFQ+KHVpbnQgdGFnKSB3aGVyZSBUIDogY2xhc3MKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIG5lc3RlZENvZGVjID0gV3JhcHBlckNvZGVjcy5HZXRDb2RlYzxUPigpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBGaWVsZENvZGVjPFQ+KAotICAgICAgICAgICAgICAgIGlucHV0ID0+IFdyYXBwZXJDb2RlY3MuUmVhZDxUPihpbnB1dCwgbmVzdGVkQ29kZWMpLAotICAgICAgICAgICAgICAgIChvdXRwdXQsIHZhbHVlKSA9PiBXcmFwcGVyQ29kZWNzLldyaXRlPFQ+KG91dHB1dCwgdmFsdWUsIG5lc3RlZENvZGVjKSwKLSAgICAgICAgICAgICAgICB2YWx1ZSA9PiBXcmFwcGVyQ29kZWNzLkNhbGN1bGF0ZVNpemU8VD4odmFsdWUsIG5lc3RlZENvZGVjKSwKLSAgICAgICAgICAgICAgICB0YWcsCi0gICAgICAgICAgICAgICAgbnVsbCk7IC8vIERlZmF1bHQgdmFsdWUgZm9yIHRoZSB3cmFwcGVyCi0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgY29kZWMgZm9yIGEgd3JhcHBlciB0eXBlIG9mIGEgc3RydWN0IC0gd2hpY2ggbXVzdCBiZSBJbnQzMiwgSW50NjQsIFVJbnQzMiwgVUludDY0LAotICAgICAgICAvLy8gQm9vbCwgU2luZ2xlIG9yIERvdWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBGaWVsZENvZGVjPFQ/PiBGb3JTdHJ1Y3RXcmFwcGVyPFQ+KHVpbnQgdGFnKSB3aGVyZSBUIDogc3RydWN0Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBuZXN0ZWRDb2RlYyA9IFdyYXBwZXJDb2RlY3MuR2V0Q29kZWM8VD4oKTsKLSAgICAgICAgICAgIHJldHVybiBuZXcgRmllbGRDb2RlYzxUPz4oCi0gICAgICAgICAgICAgICAgaW5wdXQgPT4gV3JhcHBlckNvZGVjcy5SZWFkPFQ+KGlucHV0LCBuZXN0ZWRDb2RlYyksCi0gICAgICAgICAgICAgICAgKG91dHB1dCwgdmFsdWUpID0+IFdyYXBwZXJDb2RlY3MuV3JpdGU8VD4ob3V0cHV0LCB2YWx1ZS5WYWx1ZSwgbmVzdGVkQ29kZWMpLAotICAgICAgICAgICAgICAgIHZhbHVlID0+IHZhbHVlID09IG51bGwgPyAwIDogV3JhcHBlckNvZGVjcy5DYWxjdWxhdGVTaXplPFQ+KHZhbHVlLlZhbHVlLCBuZXN0ZWRDb2RlYyksCi0gICAgICAgICAgICAgICAgdGFnLAotICAgICAgICAgICAgICAgIG51bGwpOyAvLyBEZWZhdWx0IHZhbHVlIGZvciB0aGUgd3JhcHBlcgotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSGVscGVyIGNvZGUgdG8gY3JlYXRlIGNvZGVjcyBmb3Igd3JhcHBlciB0eXBlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gU29tZXdoYXQgdWdseSB3aXRoIGFsbCB0aGUgc3RhdGljIG1ldGhvZHMsIGJ1dCB0aGUgY29udmVyc2lvbnMgaW52b2x2ZWQgdG8vZnJvbSBudWxsYWJsZSB0eXBlcyBtYWtlIGl0Ci0gICAgICAgIC8vLyBzbGlnaHRseSB0cmlja3kgdG8gaW1wcm92ZS4gU28gbG9uZyBhcyB3ZSBrZWVwIHRoZSBwdWJsaWMgQVBJIChGb3JDbGFzc1dyYXBwZXIsIEZvclN0cnVjdFdyYXBwZXIpIGluIHBsYWNlLAotICAgICAgICAvLy8gd2UgY2FuIHJlZmFjdG9yIGxhdGVyIGlmIHdlIGNvbWUgdXAgd2l0aCBzb21ldGhpbmcgY2xlYW5lci4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHBlckNvZGVjcwotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBEaWN0aW9uYXJ5PFN5c3RlbS5UeXBlLCBvYmplY3Q+IENvZGVjcyA9IG5ldyBEaWN0aW9uYXJ5PFN5c3RlbS5UeXBlLCBvYmplY3Q+Ci0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgeyB0eXBlb2YoYm9vbCksIEZvckJvb2woV2lyZUZvcm1hdC5NYWtlVGFnKFdyYXBwZXJzUmVmbGVjdGlvbi5XcmFwcGVyVmFsdWVGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpKSB9LAotICAgICAgICAgICAgICAgIHsgdHlwZW9mKGludCksIEZvckludDMyKFdpcmVGb3JtYXQuTWFrZVRhZyhXcmFwcGVyc1JlZmxlY3Rpb24uV3JhcHBlclZhbHVlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KSkgfSwKLSAgICAgICAgICAgICAgICB7IHR5cGVvZihsb25nKSwgRm9ySW50NjQoV2lyZUZvcm1hdC5NYWtlVGFnKFdyYXBwZXJzUmVmbGVjdGlvbi5XcmFwcGVyVmFsdWVGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpKSB9LAotICAgICAgICAgICAgICAgIHsgdHlwZW9mKHVpbnQpLCBGb3JVSW50MzIoV2lyZUZvcm1hdC5NYWtlVGFnKFdyYXBwZXJzUmVmbGVjdGlvbi5XcmFwcGVyVmFsdWVGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5WYXJpbnQpKSB9LAotICAgICAgICAgICAgICAgIHsgdHlwZW9mKHVsb25nKSwgRm9yVUludDY0KFdpcmVGb3JtYXQuTWFrZVRhZyhXcmFwcGVyc1JlZmxlY3Rpb24uV3JhcHBlclZhbHVlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuVmFyaW50KSkgfSwKLSAgICAgICAgICAgICAgICB7IHR5cGVvZihmbG9hdCksIEZvckZsb2F0KFdpcmVGb3JtYXQuTWFrZVRhZyhXcmFwcGVyc1JlZmxlY3Rpb24uV3JhcHBlclZhbHVlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQzMikpIH0sCi0gICAgICAgICAgICAgICAgeyB0eXBlb2YoZG91YmxlKSwgRm9yRG91YmxlKFdpcmVGb3JtYXQuTWFrZVRhZyhXcmFwcGVyc1JlZmxlY3Rpb24uV3JhcHBlclZhbHVlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuRml4ZWQ2NCkpIH0sCi0gICAgICAgICAgICAgICAgeyB0eXBlb2Yoc3RyaW5nKSwgRm9yU3RyaW5nKFdpcmVGb3JtYXQuTWFrZVRhZyhXcmFwcGVyc1JlZmxlY3Rpb24uV3JhcHBlclZhbHVlRmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV2lyZVR5cGUuTGVuZ3RoRGVsaW1pdGVkKSkgfSwKLSAgICAgICAgICAgICAgICB7IHR5cGVvZihCeXRlU3RyaW5nKSwgRm9yQnl0ZXMoV2lyZUZvcm1hdC5NYWtlVGFnKFdyYXBwZXJzUmVmbGVjdGlvbi5XcmFwcGVyVmFsdWVGaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XaXJlVHlwZS5MZW5ndGhEZWxpbWl0ZWQpKSB9Ci0gICAgICAgICAgICB9OwotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gUmV0dXJucyBhIGZpZWxkIGNvZGVjIHdoaWNoIGVmZmVjdGl2ZWx5IHdyYXBzIGEgdmFsdWUgb2YgdHlwZSBUIGluIGEgbWVzc2FnZS4KLSAgICAgICAgICAgIC8vLyAKLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRmllbGRDb2RlYzxUPiBHZXRDb2RlYzxUPigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb2JqZWN0IHZhbHVlOwotICAgICAgICAgICAgICAgIGlmICghQ29kZWNzLlRyeUdldFZhbHVlKHR5cGVvZihUKSwgb3V0IHZhbHVlKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJJbnZhbGlkIHR5cGUgYXJndW1lbnQgcmVxdWVzdGVkIGZvciB3cmFwcGVyIGNvZGVjOiAiICsgdHlwZW9mKFQpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIChGaWVsZENvZGVjPFQ+KSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIFQgUmVhZDxUPihDb2RlZElucHV0U3RyZWFtIGlucHV0LCBGaWVsZENvZGVjPFQ+IGNvZGVjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBsZW5ndGggPSBpbnB1dC5SZWFkTGVuZ3RoKCk7Ci0gICAgICAgICAgICAgICAgaW50IG9sZExpbWl0ID0gaW5wdXQuUHVzaExpbWl0KGxlbmd0aCk7Ci0KLSAgICAgICAgICAgICAgICB1aW50IHRhZzsKLSAgICAgICAgICAgICAgICBUIHZhbHVlID0gY29kZWMuRGVmYXVsdFZhbHVlOwotICAgICAgICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRhZyA9PSBjb2RlYy5UYWcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlID0gY29kZWMuUmVhZChpbnB1dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpbnB1dC5DaGVja1JlYWRFbmRPZlN0cmVhbVRhZygpOwotICAgICAgICAgICAgICAgIGlucHV0LlBvcExpbWl0KG9sZExpbWl0KTsKLQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgV3JpdGU8VD4oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0LCBUIHZhbHVlLCBGaWVsZENvZGVjPFQ+IGNvZGVjKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG91dHB1dC5Xcml0ZUxlbmd0aChjb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyh2YWx1ZSkpOwotICAgICAgICAgICAgICAgIGNvZGVjLldyaXRlVGFnQW5kVmFsdWUob3V0cHV0LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludGVybmFsICBzdGF0aWMgaW50IENhbGN1bGF0ZVNpemU8VD4oVCB2YWx1ZSwgRmllbGRDb2RlYzxUPiBjb2RlYykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZmllbGRMZW5ndGggPSBjb2RlYy5DYWxjdWxhdGVTaXplV2l0aFRhZyh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVMZW5ndGhTaXplKGZpZWxkTGVuZ3RoKSArIGZpZWxkTGVuZ3RoOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyA8cGFyYT4KLSAgICAvLy8gQW4gZW5jb2RlL2RlY29kZSBwYWlyIGZvciBhIHNpbmdsZSBmaWVsZC4gVGhpcyBlZmZlY3RpdmVseSBlbmNhcHN1bGF0ZXMKLSAgICAvLy8gYWxsIHRoZSBpbmZvcm1hdGlvbiBuZWVkZWQgdG8gcmVhZCBvciB3cml0ZSB0aGUgZmllbGQgdmFsdWUgZnJvbS90byBhIGNvZGVkCi0gICAgLy8vIHN0cmVhbS4KLSAgICAvLy8gPC9wYXJhPgotICAgIC8vLyA8cGFyYT4KLSAgICAvLy8gVGhpcyBjbGFzcyBpcyBwdWJsaWMgYW5kIGhhcyB0byBiZSBhcyBpdCBpcyB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlLCBidXQgaXRzIHB1YmxpYwotICAgIC8vLyBBUEkgaXMgdmVyeSBsaW1pdGVkIC0ganVzdCB3aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBuZWVkcyB0byBjYWxsIGRpcmVjdGx5LgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIFRoaXMgbmV2ZXIgd3JpdGVzIGRlZmF1bHQgdmFsdWVzIHRvIHRoZSBzdHJlYW0sIGFuZCBkb2VzIG5vdCBhZGRyZXNzICJwYWNrZWRuZXNzIgotICAgIC8vLyBpbiByZXBlYXRlZCBmaWVsZHMgaXRzZWxmLCBvdGhlciB0aGFuIHRvIGtub3cgd2hldGhlciBvciBub3QgdGhlIGZpZWxkICpzaG91bGQqIGJlIHBhY2tlZC4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgRmllbGRDb2RlYzxUPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgVCBEZWZhdWx0RGVmYXVsdDsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgYm9vbCBUeXBlU3VwcG9ydHNQYWNraW5nID0gdHlwZW9mKFQpLklzVmFsdWVUeXBlKCkgJiYgTnVsbGFibGUuR2V0VW5kZXJseWluZ1R5cGUodHlwZW9mKFQpKSA9PSBudWxsOwotCi0gICAgICAgIHN0YXRpYyBGaWVsZENvZGVjKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHR5cGVvZihUKSA9PSB0eXBlb2Yoc3RyaW5nKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWZhdWx0RGVmYXVsdCA9IChUKShvYmplY3QpIiI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0eXBlb2YoVCkgPT0gdHlwZW9mKEJ5dGVTdHJpbmcpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERlZmF1bHREZWZhdWx0ID0gKFQpKG9iamVjdClCeXRlU3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gT3RoZXJ3aXNlIGl0J3MgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhlIENMUiB0eXBlCi0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgYm9vbCBJc1BhY2tlZFJlcGVhdGVkRmllbGQodWludCB0YWcpID0+Ci0gICAgICAgICAgICBUeXBlU3VwcG9ydHNQYWNraW5nICYmIFdpcmVGb3JtYXQuR2V0VGFnV2lyZVR5cGUodGFnKSA9PSBXaXJlRm9ybWF0LldpcmVUeXBlLkxlbmd0aERlbGltaXRlZDsKLQotICAgICAgICBpbnRlcm5hbCBib29sIFBhY2tlZFJlcGVhdGVkRmllbGQgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGEgZGVsZWdhdGUgdG8gd3JpdGUgYSB2YWx1ZSAodW5jb25kaXRpb25hbGx5KSB0byBhIGNvZGVkIG91dHB1dCBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIEFjdGlvbjxDb2RlZE91dHB1dFN0cmVhbSwgVD4gVmFsdWVXcml0ZXIgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBzaXplIGNhbGN1bGF0b3IgZm9yIGp1c3QgYSB2YWx1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgRnVuYzxULCBpbnQ+IFZhbHVlU2l6ZUNhbGN1bGF0b3IgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGEgZGVsZWdhdGUgdG8gcmVhZCBhIHZhbHVlIGZyb20gYSBjb2RlZCBpbnB1dCBzdHJlYW0uIEl0IGlzIGFzc3VtZWQgdGhhdAotICAgICAgICAvLy8gdGhlIHN0cmVhbSBpcyBhbHJlYWR5IHBvc2l0aW9uZWQgb24gdGhlIGFwcHJvcHJpYXRlIHRhZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgRnVuYzxDb2RlZElucHV0U3RyZWFtLCBUPiBWYWx1ZVJlYWRlciB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIGZpeGVkIHNpemUgZm9yIGFuIGVudHJ5LCBvciAwIGlmIHNpemVzIHZhcnkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIGludCBGaXhlZFNpemUgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIHRoZSB0YWcgb2YgdGhlIGNvZGVjLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAvLy8gVGhlIHRhZyBvZiB0aGUgY29kZWMuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBpbnRlcm5hbCB1aW50IFRhZyB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIERlZmF1bHQgdmFsdWUgZm9yIHRoaXMgY29kZWMuIFVzdWFsbHkgdGhlIHNhbWUgZm9yIGV2ZXJ5IGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUsIGJ1dAotICAgICAgICAvLy8gZm9yIHN0cmluZy9CeXRlU3RyaW5nIHdyYXBwZXIgZmllbGRzIHRoZSBjb2RlYydzIGRlZmF1bHQgdmFsdWUgaXMgbnVsbCwgd2hlcmVhcyBmb3IKLSAgICAgICAgLy8vIG90aGVyIHN0cmluZy9CeXRlU3RyaW5nIGZpZWxkcyBpdCdzICIiIG9yIEJ5dGVTdHJpbmcuRW1wdHkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBUaGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgY29kZWMncyB0eXBlLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgaW50ZXJuYWwgVCBEZWZhdWx0VmFsdWUgeyBnZXQ7IH0KLQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGludCB0YWdTaXplOwotICAgICAgICAKLSAgICAgICAgaW50ZXJuYWwgRmllbGRDb2RlYygKLSAgICAgICAgICAgICAgICBGdW5jPENvZGVkSW5wdXRTdHJlYW0sIFQ+IHJlYWRlciwKLSAgICAgICAgICAgICAgICBBY3Rpb248Q29kZWRPdXRwdXRTdHJlYW0sIFQ+IHdyaXRlciwKLSAgICAgICAgICAgICAgICBpbnQgZml4ZWRTaXplLAotICAgICAgICAgICAgICAgIHVpbnQgdGFnKSA6IHRoaXMocmVhZGVyLCB3cml0ZXIsIF8gPT4gZml4ZWRTaXplLCB0YWcpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEZpeGVkU2l6ZSA9IGZpeGVkU2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEZpZWxkQ29kZWMoCi0gICAgICAgICAgICBGdW5jPENvZGVkSW5wdXRTdHJlYW0sIFQ+IHJlYWRlciwKLSAgICAgICAgICAgIEFjdGlvbjxDb2RlZE91dHB1dFN0cmVhbSwgVD4gd3JpdGVyLAotICAgICAgICAgICAgRnVuYzxULCBpbnQ+IHNpemVDYWxjdWxhdG9yLAotICAgICAgICAgICAgdWludCB0YWcpIDogdGhpcyhyZWFkZXIsIHdyaXRlciwgc2l6ZUNhbGN1bGF0b3IsIHRhZywgRGVmYXVsdERlZmF1bHQpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIEZpZWxkQ29kZWMoCi0gICAgICAgICAgICBGdW5jPENvZGVkSW5wdXRTdHJlYW0sIFQ+IHJlYWRlciwKLSAgICAgICAgICAgIEFjdGlvbjxDb2RlZE91dHB1dFN0cmVhbSwgVD4gd3JpdGVyLAotICAgICAgICAgICAgRnVuYzxULCBpbnQ+IHNpemVDYWxjdWxhdG9yLAotICAgICAgICAgICAgdWludCB0YWcsCi0gICAgICAgICAgICBUIGRlZmF1bHRWYWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgVmFsdWVSZWFkZXIgPSByZWFkZXI7Ci0gICAgICAgICAgICBWYWx1ZVdyaXRlciA9IHdyaXRlcjsKLSAgICAgICAgICAgIFZhbHVlU2l6ZUNhbGN1bGF0b3IgPSBzaXplQ2FsY3VsYXRvcjsKLSAgICAgICAgICAgIEZpeGVkU2l6ZSA9IDA7Ci0gICAgICAgICAgICBUYWcgPSB0YWc7Ci0gICAgICAgICAgICBEZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICAgICAgICB0YWdTaXplID0gQ29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh0YWcpOwotICAgICAgICAgICAgLy8gRGV0ZWN0IHBhY2tlZC1uZXNzIG9uY2UsIHNvIHdlIGNhbiBjaGVjayBmb3IgaXQgd2l0aGluIFJlcGVhdGVkRmllbGQ8VD4uCi0gICAgICAgICAgICBQYWNrZWRSZXBlYXRlZEZpZWxkID0gSXNQYWNrZWRSZXBlYXRlZEZpZWxkKHRhZyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZSBhIHRhZyBhbmQgdGhlIGdpdmVuIHZhbHVlLCAqaWYqIHRoZSB2YWx1ZSBpcyBub3QgdGhlIGRlZmF1bHQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVGFnQW5kVmFsdWUoQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0LCBUIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIUlzRGVmYXVsdCh2YWx1ZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgb3V0cHV0LldyaXRlVGFnKFRhZyk7Ci0gICAgICAgICAgICAgICAgVmFsdWVXcml0ZXIob3V0cHV0LCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZWFkcyBhIHZhbHVlIG9mIHRoZSBjb2RlYyB0eXBlIGZyb20gdGhlIGdpdmVuIDxzZWUgY3JlZj0iQ29kZWRJbnB1dFN0cmVhbSIvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB2YWx1ZSByZWFkIGZyb20gdGhlIHN0cmVhbS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBUIFJlYWQoQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgPT4gVmFsdWVSZWFkZXIoaW5wdXQpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENhbGN1bGF0ZXMgdGhlIHNpemUgcmVxdWlyZWQgdG8gd3JpdGUgdGhlIGdpdmVuIHZhbHVlLCB3aXRoIGEgdGFnLAotICAgICAgICAvLy8gaWYgdGhlIHZhbHVlIGlzIG5vdCB0aGUgZGVmYXVsdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplV2l0aFRhZyhUIHZhbHVlKSA9PiBJc0RlZmF1bHQodmFsdWUpID8gMCA6IFZhbHVlU2l6ZUNhbGN1bGF0b3IodmFsdWUpICsgdGFnU2l6ZTsKLQotICAgICAgICBwcml2YXRlIGJvb2wgSXNEZWZhdWx0KFQgdmFsdWUpID0+IEVxdWFsaXR5Q29tcGFyZXI8VD4uRGVmYXVsdC5FcXVhbHModmFsdWUsIERlZmF1bHRWYWx1ZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvRnJhbWV3b3JrUG9ydGFiaWxpdHkuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9GcmFtZXdvcmtQb3J0YWJpbGl0eS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgwNjBmNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9GcmFtZXdvcmtQb3J0YWJpbGl0eS5jcworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ2xhc3MgY29udGFpbmluZyBoZWxwZnVsIHdvcmthcm91bmRzIGZvciB2YXJpb3VzIHBsYXRmb3JtIGNvbXBhdGliaWxpdHkKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBGcmFtZXdvcmtQb3J0YWJpbGl0eQotICAgIHsKLSAgICAgICAgLy8gVGhlIHZhbHVlIG9mIFJlZ2V4T3B0aW9ucy5Db21waWxlZCBpcyA4LiBXZSBjYW4gdGVzdCBmb3IgdGhlIHByZXNlbmNlIGF0Ci0gICAgICAgIC8vIGV4ZWN1dGlvbiB0aW1lIHVzaW5nIEVudW0uSXNEZWZpbmVkLCBzbyBhIHNpbmdsZSBidWlsZCB3aWxsIGRvIHRoZSByaWdodCB0aGluZwotICAgICAgICAvLyBvbiBlYWNoIHBsYXRmb3JtLiAoUmVnZXhPcHRpb25zLkNvbXBpbGVkIGlzbid0IHN1cHBvcnRlZCBieSBQQ0xzLikKLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IFJlZ2V4T3B0aW9ucyBDb21waWxlZFJlZ2V4V2hlcmVBdmFpbGFibGUgPQotICAgICAgICAgICAgRW51bS5Jc0RlZmluZWQodHlwZW9mKFJlZ2V4T3B0aW9ucyksIDgpID8gKFJlZ2V4T3B0aW9ucyk4IDogUmVnZXhPcHRpb25zLk5vbmU7Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0dvb2dsZS5Qcm90b2J1Zi5jc3Byb2ogYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Hb29nbGUuUHJvdG9idWYuY3Nwcm9qCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZGQ5N2RkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0dvb2dsZS5Qcm90b2J1Zi5jc3Byb2oKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAot77u/PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4KLTxQcm9qZWN0IFRvb2xzVmVyc2lvbj0iNC4wIiBEZWZhdWx0VGFyZ2V0cz0iQnVpbGQiIHhtbG5zPSJodHRwOi8vc2NoZW1hcy5taWNyb3NvZnQuY29tL2RldmVsb3Blci9tc2J1aWxkLzIwMDMiPgotICA8UHJvcGVydHlHcm91cD4KLSAgICA8Q29uZmlndXJhdGlvbiBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKScgPT0gJycgIj5EZWJ1ZzwvQ29uZmlndXJhdGlvbj4KLSAgICA8UGxhdGZvcm0gQ29uZGl0aW9uPSIgJyQoUGxhdGZvcm0pJyA9PSAnJyAiPkFueUNQVTwvUGxhdGZvcm0+Ci0gICAgPFByb2R1Y3RWZXJzaW9uPjkuMC4zMDcyOTwvUHJvZHVjdFZlcnNpb24+Ci0gICAgPFNjaGVtYVZlcnNpb24+Mi4wPC9TY2hlbWFWZXJzaW9uPgotICAgIDxQcm9qZWN0R3VpZD57NjkwOEJEQ0UtRDkyNS00M0YzLTk0QUMtQTUzMUU2REYyNTkxfTwvUHJvamVjdEd1aWQ+Ci0gICAgPE91dHB1dFR5cGU+TGlicmFyeTwvT3V0cHV0VHlwZT4KLSAgICA8QXBwRGVzaWduZXJGb2xkZXI+UHJvcGVydGllczwvQXBwRGVzaWduZXJGb2xkZXI+Ci0gICAgPFJvb3ROYW1lc3BhY2U+R29vZ2xlLlByb3RvYnVmPC9Sb290TmFtZXNwYWNlPgotICAgIDxBc3NlbWJseU5hbWU+R29vZ2xlLlByb3RvYnVmPC9Bc3NlbWJseU5hbWU+Ci0gICAgPFByb2plY3RUeXBlR3VpZHM+ezc4NkM4MzBGLTA3QTEtNDA4Qi1CRDdGLTZFRTA0ODA5RDZEQn07e0ZBRTA0RUMwLTMwMUYtMTFEMy1CRjRCLTAwQzA0Rjc5RUZCQ308L1Byb2plY3RUeXBlR3VpZHM+Ci0gICAgPFRhcmdldEZyYW1ld29ya1Byb2ZpbGU+UHJvZmlsZTI1OTwvVGFyZ2V0RnJhbWV3b3JrUHJvZmlsZT4KLSAgICA8VGFyZ2V0RnJhbWV3b3JrVmVyc2lvbj52NC41PC9UYXJnZXRGcmFtZXdvcmtWZXJzaW9uPgotICAgIDxGaWxlQWxpZ25tZW50PjUxMjwvRmlsZUFsaWdubWVudD4KLSAgICA8T2xkVG9vbHNWZXJzaW9uPjMuNTwvT2xkVG9vbHNWZXJzaW9uPgotICAgIDxNaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4xMC4wPC9NaW5pbXVtVmlzdWFsU3R1ZGlvVmVyc2lvbj4KLSAgICA8TnVHZXRQYWNrYWdlSW1wb3J0U3RhbXA+Ci0gICAgPC9OdUdldFBhY2thZ2VJbXBvcnRTdGFtcD4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ0RlYnVnfEFueUNQVScgIj4KLSAgICA8RGVidWdTeW1ib2xzPnRydWU8L0RlYnVnU3ltYm9scz4KLSAgICA8RGVidWdUeXBlPmZ1bGw8L0RlYnVnVHlwZT4KLSAgICA8T3B0aW1pemU+ZmFsc2U8L09wdGltaXplPgotICAgIDxPdXRwdXRQYXRoPmJpblxEZWJ1ZzwvT3V0cHV0UGF0aD4KLSAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcRGVidWdcPC9JbnRlcm1lZGlhdGVPdXRwdXRQYXRoPgotICAgIDxEb2N1bWVudGF0aW9uRmlsZT5iaW5cRGVidWdcR29vZ2xlLlByb3RvYnVmLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+Ci0gICAgPE5vV2Fybj4KLSAgICA8L05vV2Fybj4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPkRFQlVHO1RSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4KLSAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2V8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZTwvT3V0cHV0UGF0aD4KLSAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUmVsZWFzZVw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+Ci0gICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+Ci0gICAgPE5vV2Fybj4KLSAgICA8L05vV2Fybj4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFPC9EZWZpbmVDb25zdGFudHM+Ci0gICAgPEVycm9yUmVwb3J0PnByb21wdDwvRXJyb3JSZXBvcnQ+Ci0gICAgPFdhcm5pbmdMZXZlbD40PC9XYXJuaW5nTGV2ZWw+Ci0gICAgPE5vU3RkTGliPnRydWU8L05vU3RkTGliPgotICAgIDxHZW5lcmF0ZVNlcmlhbGl6YXRpb25Bc3NlbWJsaWVzPk9mZjwvR2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz4KLSAgICA8VHJlYXRXYXJuaW5nc0FzRXJyb3JzPnRydWU8L1RyZWF0V2FybmluZ3NBc0Vycm9ycz4KLSAgPC9Qcm9wZXJ0eUdyb3VwPgotICA8UHJvcGVydHlHcm91cCBDb25kaXRpb249IiAnJChDb25maWd1cmF0aW9uKXwkKFBsYXRmb3JtKScgPT0gJ1JlbGVhc2VTaWduZWR8QW55Q1BVJyAiPgotICAgIDxEZWJ1Z1R5cGU+cGRib25seTwvRGVidWdUeXBlPgotICAgIDxPcHRpbWl6ZT50cnVlPC9PcHRpbWl6ZT4KLSAgICA8T3V0cHV0UGF0aD5iaW5cUmVsZWFzZVNpZ25lZDwvT3V0cHV0UGF0aD4KLSAgICA8SW50ZXJtZWRpYXRlT3V0cHV0UGF0aD5vYmpcUmVsZWFzZVNpZ25lZFw8L0ludGVybWVkaWF0ZU91dHB1dFBhdGg+Ci0gICAgPERvY3VtZW50YXRpb25GaWxlPiQoT3V0cHV0UGF0aClcJChBc3NlbWJseU5hbWUpLnhtbDwvRG9jdW1lbnRhdGlvbkZpbGU+Ci0gICAgPE5vV2Fybj4KLSAgICA8L05vV2Fybj4KLSAgICA8RGVmaW5lQ29uc3RhbnRzPlRSQUNFO1NJR05FRDwvRGVmaW5lQ29uc3RhbnRzPgotICAgIDxFcnJvclJlcG9ydD5wcm9tcHQ8L0Vycm9yUmVwb3J0PgotICAgIDxXYXJuaW5nTGV2ZWw+NDwvV2FybmluZ0xldmVsPgotICAgIDxOb1N0ZExpYj50cnVlPC9Ob1N0ZExpYj4KLSAgICA8R2VuZXJhdGVTZXJpYWxpemF0aW9uQXNzZW1ibGllcz5PZmY8L0dlbmVyYXRlU2VyaWFsaXphdGlvbkFzc2VtYmxpZXM+Ci0gICAgPFNpZ25Bc3NlbWJseT5UcnVlPC9TaWduQXNzZW1ibHk+Ci0gICAgPEFzc2VtYmx5T3JpZ2luYXRvcktleUZpbGU+Li5cLi5ca2V5c1xHb29nbGUuUHJvdG9idWYuc25rPC9Bc3NlbWJseU9yaWdpbmF0b3JLZXlGaWxlPgotICAgIDxUcmVhdFdhcm5pbmdzQXNFcnJvcnM+dHJ1ZTwvVHJlYXRXYXJuaW5nc0FzRXJyb3JzPgotICA8L1Byb3BlcnR5R3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPFJlZmVyZW5jZSBJbmNsdWRlPSJtc2NvcmxpYiIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbSIgLz4KLSAgICA8UmVmZXJlbmNlIEluY2x1ZGU9IlN5c3RlbS5YbWwiIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkJ5dGVBcnJheS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJCeXRlU3RyaW5nLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTaXplLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvZGVkSW5wdXRTdHJlYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29kZWRPdXRwdXRTdHJlYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcTWFwRmllbGQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29sbGVjdGlvbnNcUmVhZE9ubHlEaWN0aW9uYXJ5LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbGxlY3Rpb25zXFJlcGVhdGVkRmllbGQuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iQ29tcGF0aWJpbGl0eVxQcm9wZXJ0eUluZm9FeHRlbnNpb25zLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkNvbXBhdGliaWxpdHlcVHlwZUV4dGVuc2lvbnMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iRmllbGRDb2RlYy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJGcmFtZXdvcmtQb3J0YWJpbGl0eS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJJQ3VzdG9tRGlhZ25vc3RpY01lc3NhZ2UuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iSURlZXBDbG9uZWFibGUuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iSW52YWxpZEpzb25FeGNlcHRpb24uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iSnNvbkZvcm1hdHRlci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uUGFyc2VyLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ikpzb25Ub2tlbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJKc29uVG9rZW5pemVyLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9Ik1lc3NhZ2VFeHRlbnNpb25zLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IklNZXNzYWdlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJMaW1pdGVkSW5wdXRTdHJlYW0uY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iTWVzc2FnZVBhcnNlci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm9wZXJ0aWVzXEFzc2VtYmx5SW5mby5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXERlc2NyaXB0b3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblxEZXNjcmlwdG9yQmFzZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXERlc2NyaXB0b3JQb29sLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cRGVzY3JpcHRvclV0aWwuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblxEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbi5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXEVudW1EZXNjcmlwdG9yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cRW51bVZhbHVlRGVzY3JpcHRvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXEZpZWxkQWNjZXNzb3JCYXNlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cRmllbGREZXNjcmlwdG9yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cRmllbGRUeXBlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cRmlsZURlc2NyaXB0b3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblxHZW5lcmF0ZWRDbHJUeXBlSW5mby5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXElEZXNjcmlwdG9yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cSUZpZWxkQWNjZXNzb3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblxNYXBGaWVsZEFjY2Vzc29yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cTWVzc2FnZURlc2NyaXB0b3IuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblxNZXRob2REZXNjcmlwdG9yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cT25lb2ZBY2Nlc3Nvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXE9uZW9mRGVzY3JpcHRvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXE9yaWdpbmFsTmFtZUF0dHJpYnV0ZS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXFBhY2thZ2VEZXNjcmlwdG9yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cUGFydGlhbENsYXNzZXMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblxSZWZsZWN0aW9uVXRpbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXFJlcGVhdGVkRmllbGRBY2Nlc3Nvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJSZWZsZWN0aW9uXFNlcnZpY2VEZXNjcmlwdG9yLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IlJlZmxlY3Rpb25cU2luZ2xlRmllbGRBY2Nlc3Nvci5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJQcm90b1ByZWNvbmRpdGlvbnMuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iUmVmbGVjdGlvblxUeXBlUmVnaXN0cnkuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV2VsbEtub3duVHlwZXNcQW55LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IldlbGxLbm93blR5cGVzXEFueVBhcnRpYWwuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV2VsbEtub3duVHlwZXNcQXBpLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IldlbGxLbm93blR5cGVzXER1cmF0aW9uLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IldlbGxLbm93blR5cGVzXER1cmF0aW9uUGFydGlhbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xFbXB0eS5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xGaWVsZE1hc2suY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV2VsbEtub3duVHlwZXNcRmllbGRNYXNrUGFydGlhbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xTb3VyY2VDb250ZXh0LmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IldlbGxLbm93blR5cGVzXFN0cnVjdC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xUaW1lRXh0ZW5zaW9ucy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xUaW1lc3RhbXAuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV2VsbEtub3duVHlwZXNcVGltZXN0YW1wUGFydGlhbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xUeXBlLmNzIiAvPgotICAgIDxDb21waWxlIEluY2x1ZGU9IldlbGxLbm93blR5cGVzXFZhbHVlUGFydGlhbC5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xXcmFwcGVycy5jcyIgLz4KLSAgICA8Q29tcGlsZSBJbmNsdWRlPSJXZWxsS25vd25UeXBlc1xXcmFwcGVyc1BhcnRpYWwuY3MiIC8+Ci0gICAgPENvbXBpbGUgSW5jbHVkZT0iV2lyZUZvcm1hdC5jcyIgLz4KLSAgPC9JdGVtR3JvdXA+Ci0gIDxJdGVtR3JvdXA+Ci0gICAgPE5vbmUgSW5jbHVkZT0iR29vZ2xlLlByb3RvYnVmLm51c3BlYyIgLz4KLSAgICA8Tm9uZSBJbmNsdWRlPSJwYWNrYWdlcy5jb25maWciIC8+Ci0gIDwvSXRlbUdyb3VwPgotICA8SXRlbUdyb3VwIC8+Ci0gIDxJbXBvcnQgUHJvamVjdD0iJChNU0J1aWxkRXh0ZW5zaW9uc1BhdGgzMilcTWljcm9zb2Z0XFBvcnRhYmxlXCQoVGFyZ2V0RnJhbWV3b3JrVmVyc2lvbilcTWljcm9zb2Z0LlBvcnRhYmxlLkNTaGFycC50YXJnZXRzIiAvPgotICA8SW1wb3J0IFByb2plY3Q9Ii4uXHBhY2thZ2VzXE51U3BlYy5SZWZlcmVuY2VHZW5lcmF0b3IuMS40LjFcYnVpbGRccG9ydGFibGUtbmV0NDUrd2luK3dwYTgxK3dwODArTW9ub0FuZHJvaWQxMCt4YW1hcmluaW9zMTArTW9ub1RvdWNoMTBcTnVTcGVjLlJlZmVyZW5jZUdlbmVyYXRvci50YXJnZXRzIiBDb25kaXRpb249IkV4aXN0cygnLi5ccGFja2FnZXNcTnVTcGVjLlJlZmVyZW5jZUdlbmVyYXRvci4xLjQuMVxidWlsZFxwb3J0YWJsZS1uZXQ0NSt3aW4rd3BhODErd3A4MCtNb25vQW5kcm9pZDEwK3hhbWFyaW5pb3MxMCtNb25vVG91Y2gxMFxOdVNwZWMuUmVmZXJlbmNlR2VuZXJhdG9yLnRhcmdldHMnKSIgLz4KLSAgPFRhcmdldCBOYW1lPSJFbnN1cmVOdUdldFBhY2thZ2VCdWlsZEltcG9ydHMiIEJlZm9yZVRhcmdldHM9IlByZXBhcmVGb3JCdWlsZCI+Ci0gICAgPFByb3BlcnR5R3JvdXA+Ci0gICAgICA8RXJyb3JUZXh0PlRoaXMgcHJvamVjdCByZWZlcmVuY2VzIE51R2V0IHBhY2thZ2UocykgdGhhdCBhcmUgbWlzc2luZyBvbiB0aGlzIGNvbXB1dGVyLiBVc2UgTnVHZXQgUGFja2FnZSBSZXN0b3JlIHRvIGRvd25sb2FkIHRoZW0uICBGb3IgbW9yZSBpbmZvcm1hdGlvbiwgc2VlIGh0dHA6Ly9nby5taWNyb3NvZnQuY29tL2Z3bGluay8/TGlua0lEPTMyMjEwNS4gVGhlIG1pc3NpbmcgZmlsZSBpcyB7MH0uPC9FcnJvclRleHQ+Ci0gICAgPC9Qcm9wZXJ0eUdyb3VwPgotICAgIDxFcnJvciBDb25kaXRpb249IiFFeGlzdHMoJy4uXHBhY2thZ2VzXE51U3BlYy5SZWZlcmVuY2VHZW5lcmF0b3IuMS40LjFcYnVpbGRccG9ydGFibGUtbmV0NDUrd2luK3dwYTgxK3dwODArTW9ub0FuZHJvaWQxMCt4YW1hcmluaW9zMTArTW9ub1RvdWNoMTBcTnVTcGVjLlJlZmVyZW5jZUdlbmVyYXRvci50YXJnZXRzJykiIFRleHQ9IiQoW1N5c3RlbS5TdHJpbmddOjpGb3JtYXQoJyQoRXJyb3JUZXh0KScsICcuLlxwYWNrYWdlc1xOdVNwZWMuUmVmZXJlbmNlR2VuZXJhdG9yLjEuNC4xXGJ1aWxkXHBvcnRhYmxlLW5ldDQ1K3dpbit3cGE4MSt3cDgwK01vbm9BbmRyb2lkMTAreGFtYXJpbmlvczEwK01vbm9Ub3VjaDEwXE51U3BlYy5SZWZlcmVuY2VHZW5lcmF0b3IudGFyZ2V0cycpKSIgLz4KLSAgPC9UYXJnZXQ+Ci0gIDwhLS0gVG8gbW9kaWZ5IHlvdXIgYnVpbGQgcHJvY2VzcywgYWRkIHlvdXIgdGFzayBpbnNpZGUgb25lIG9mIHRoZSB0YXJnZXRzIGJlbG93IGFuZCB1bmNvbW1lbnQgaXQuIAotICAgICAgIE90aGVyIHNpbWlsYXIgZXh0ZW5zaW9uIHBvaW50cyBleGlzdCwgc2VlIE1pY3Jvc29mdC5Db21tb24udGFyZ2V0cy4KLSAgPFRhcmdldCBOYW1lPSJCZWZvcmVCdWlsZCI+Ci0gIDwvVGFyZ2V0PgotICA8VGFyZ2V0IE5hbWU9IkFmdGVyQnVpbGQiPgotICA8L1RhcmdldD4KLSAgLS0+Ci08L1Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvR29vZ2xlLlByb3RvYnVmLm51c3BlYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0dvb2dsZS5Qcm90b2J1Zi5udXNwZWMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwZTNkYTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvR29vZ2xlLlByb3RvYnVmLm51c3BlYworKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cGFja2FnZT4KLSAgPG1ldGFkYXRhPgotICAgIDxpZD5Hb29nbGUuUHJvdG9idWY8L2lkPgotICAgIDx0aXRsZT5Hb29nbGUgUHJvdG9jb2wgQnVmZmVycyBDIzwvdGl0bGU+Ci0gICAgPHN1bW1hcnk+QyMgcnVudGltZSBsaWJyYXJ5IGZvciBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQuPC9zdW1tYXJ5PgotICAgIDxkZXNjcmlwdGlvbj5TZWUgcHJvamVjdCBzaXRlIGZvciBtb3JlIGluZm8uPC9kZXNjcmlwdGlvbj4KLSAgICA8dmVyc2lvbj4zLjAuMC1iZXRhMzwvdmVyc2lvbj4KLSAgICA8YXV0aG9ycz5Hb29nbGUgSW5jLjwvYXV0aG9ycz4KLSAgICA8b3duZXJzPnByb3RvYnVmLXBhY2thZ2VzPC9vd25lcnM+Ci0gICAgPGxpY2Vuc2VVcmw+aHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi9ibG9iL21hc3Rlci9MSUNFTlNFPC9saWNlbnNlVXJsPgotICAgIDxwcm9qZWN0VXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWY8L3Byb2plY3RVcmw+Ci0gICAgPHJlcXVpcmVMaWNlbnNlQWNjZXB0YW5jZT5mYWxzZTwvcmVxdWlyZUxpY2Vuc2VBY2NlcHRhbmNlPgotICAgIDxyZWxlYXNlTm90ZXM+QyMgcHJvdG8zIHN1cHBvcnQ8L3JlbGVhc2VOb3Rlcz4KLSAgICA8Y29weXJpZ2h0PkNvcHlyaWdodCAyMDE1LCBHb29nbGUgSW5jLjwvY29weXJpZ2h0PgotICAgIDx0YWdzPlByb3RvY29sIEJ1ZmZlcnMgQmluYXJ5IFNlcmlhbGl6YXRpb24gRm9ybWF0IEdvb2dsZSBwcm90byBwcm90bzM8L3RhZ3M+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgIDwhLS0gRGVwZW5kZW5jaWVzIGZvciBvbGRlciwgbW9ub2xpdGhpYy1hc3NlbWJseSBwbGF0Zm9ybXMgLS0+Ci0gICAgICA8Z3JvdXAgdGFyZ2V0RnJhbWV3b3JrPSJuZXQ0NSIgLz4KLSAgICAgIDxncm91cCB0YXJnZXRGcmFtZXdvcms9IndwOCIgLz4KLSAgICAgIDxncm91cCB0YXJnZXRGcmFtZXdvcms9IndpbjgiIC8+Ci0gICAgICA8Z3JvdXAgdGFyZ2V0RnJhbWV3b3JrPSJ3cGE4MSIgLz4KLSAgICAgIDxncm91cCB0YXJnZXRGcmFtZXdvcms9InhhbWFyaW4uaW9zIiAvPgotICAgICAgPGdyb3VwIHRhcmdldEZyYW1ld29yaz0ibW9ub3RvdWNoIiAvPgotICAgICAgPGdyb3VwIHRhcmdldEZyYW1ld29yaz0ibW9ub2FuZHJvaWQiIC8+Ci0gICAgICA8IS0tIERlcGVuZGVuY2llcyBmb3IgbmV3ZXIsIG1vcmUgZ3JhbnVsYXIgcGxhdGZvcm1zICguTkVUIENvcmUgZXRjKSAtLT4KLSAgICAgIDxncm91cCB0YXJnZXRGcmFtZXdvcms9ImRvdG5ldCI+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGlkPSJTeXN0ZW0uQ29sbGVjdGlvbnMiIHZlcnNpb249IjQuMC4wIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBpZD0iU3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnIiB2ZXJzaW9uPSI0LjAuMCIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgaWQ9IlN5c3RlbS5HbG9iYWxpemF0aW9uIiB2ZXJzaW9uPSI0LjAuMCIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgaWQ9IlN5c3RlbS5JTyIgdmVyc2lvbj0iNC4wLjAiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGlkPSJTeXN0ZW0uTGlucSIgdmVyc2lvbj0iNC4wLjAiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGlkPSJTeXN0ZW0uTGlucS5FeHByZXNzaW9ucyIgdmVyc2lvbj0iNC4wLjAiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGlkPSJTeXN0ZW0uT2JqZWN0TW9kZWwiIHZlcnNpb249IjQuMC4wIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBpZD0iU3lzdGVtLlJlZmxlY3Rpb24iIHZlcnNpb249IjQuMC4wIiAvPgotICAgICAgICA8ZGVwZW5kZW5jeSBpZD0iU3lzdGVtLlJlZmxlY3Rpb24uRXh0ZW5zaW9ucyIgdmVyc2lvbj0iNC4wLjAiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGlkPSJTeXN0ZW0uUnVudGltZSIgdmVyc2lvbj0iNC4wLjAiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGlkPSJTeXN0ZW0uUnVudGltZS5FeHRlbnNpb25zIiB2ZXJzaW9uPSI0LjAuMCIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgaWQ9IlN5c3RlbS5UZXh0LkVuY29kaW5nIiB2ZXJzaW9uPSI0LjAuMCIgLz4KLSAgICAgICAgPGRlcGVuZGVuY3kgaWQ9IlN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9ucyIgdmVyc2lvbj0iNC4wLjAiIC8+Ci0gICAgICAgIDxkZXBlbmRlbmN5IGlkPSJTeXN0ZW0uVGhyZWFkaW5nIiB2ZXJzaW9uPSI0LjAuMCIgLz4KLSAgICAgIDwvZ3JvdXA+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gIDwvbWV0YWRhdGE+Ci0gIDxmaWxlcz4KLSAgICA8ZmlsZSBzcmM9ImJpbi9SZWxlYXNlU2lnbmVkL0dvb2dsZS5Qcm90b2J1Zi5kbGwiIHRhcmdldD0ibGliL3BvcnRhYmxlLW5ldDQ1K25ldGNvcmU0NSt3cGE4MSt3cDgiIC8+Ci0gICAgPGZpbGUgc3JjPSJiaW4vUmVsZWFzZVNpZ25lZC9Hb29nbGUuUHJvdG9idWYucGRiIiB0YXJnZXQ9ImxpYi9wb3J0YWJsZS1uZXQ0NStuZXRjb3JlNDUrd3BhODErd3A4IiAvPgotICAgIDxmaWxlIHNyYz0iYmluL1JlbGVhc2VTaWduZWQvR29vZ2xlLlByb3RvYnVmLnhtbCIgdGFyZ2V0PSJsaWIvcG9ydGFibGUtbmV0NDUrbmV0Y29yZTQ1K3dwYTgxK3dwOCIgLz4KLSAgICA8ZmlsZSBzcmM9ImJpbi9SZWxlYXNlU2lnbmVkL0dvb2dsZS5Qcm90b2J1Zi5kbGwiIHRhcmdldD0ibGliL2RvdG5ldCIgLz4KLSAgICA8ZmlsZSBzcmM9ImJpbi9SZWxlYXNlU2lnbmVkL0dvb2dsZS5Qcm90b2J1Zi5wZGIiIHRhcmdldD0ibGliL2RvdG5ldCIgLz4KLSAgICA8ZmlsZSBzcmM9ImJpbi9SZWxlYXNlU2lnbmVkL0dvb2dsZS5Qcm90b2J1Zi54bWwiIHRhcmdldD0ibGliL2RvdG5ldCIgLz4KLSAgICA8ZmlsZSBzcmM9IioqXCouY3MiIHRhcmdldD0ic3JjIiAvPgotICA8L2ZpbGVzPgotPC9wYWNrYWdlPgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvSUN1c3RvbURpYWdub3N0aWNNZXNzYWdlLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvSUN1c3RvbURpYWdub3N0aWNNZXNzYWdlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMDA5MDU2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0lDdXN0b21EaWFnbm9zdGljTWVzc2FnZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEEgbWVzc2FnZSB0eXBlIHRoYXQgaGFzIGEgY3VzdG9tIHN0cmluZyBmb3JtYXQgZm9yIGRpYWdub3N0aWMgcHVycG9zZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBDYWxsaW5nIDxzZWUgY3JlZj0ib2JqZWN0LlRvU3RyaW5nIi8+IG9uIGEgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSBub3JtYWxseQotICAgIC8vLyByZXR1cm5zIHRoZSBKU09OIHJlcHJlc2VudGF0aW9uLiBJZiBhIG1lc3NhZ2UgdHlwZSBpbXBsZW1lbnRzIHRoaXMgaW50ZXJmYWNlLAotICAgIC8vLyB0aGVuIHRoZSA8c2VlIGNyZWY9IlRvRGlhZ25vc3RpY1N0cmluZyIvPiBtZXRob2Qgd2lsbCBiZSBjYWxsZWQgaW5zdGVhZCBvZiB0aGUgcmVndWxhcgotICAgIC8vLyBKU09OIGZvcm1hdHRpbmcgY29kZSwgYnV0IG9ubHkgd2hlbiA8Yz5Ub1N0cmluZygpPC9jPiBpcyBjYWxsZWQgZWl0aGVyIG9uIHRoZSBtZXNzYWdlIGl0c2VsZgotICAgIC8vLyBvciBvbiBhbm90aGVyIG1lc3NhZ2Ugd2hpY2ggY29udGFpbnMgaXQuIFRoaXMgZG9lcyBub3QgYWZmZWN0IHRoZSBub3JtYWwgSlNPTiBmb3JtYXR0aW5nIG9mCi0gICAgLy8vIHRoZSBtZXNzYWdlLgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBGb3IgZXhhbXBsZSwgaWYgeW91IGNyZWF0ZSBhIHByb3RvIG1lc3NhZ2UgcmVwcmVzZW50aW5nIGEgR1VJRCwgdGhlIGludGVybmFsCi0gICAgLy8vIHJlcHJlc2VudGF0aW9uIG1heSBiZSBhIDxjPmJ5dGVzPC9jPiBmaWVsZCBvciBmb3VyIDxjPmZpeGVkMzI8L2M+IGZpZWxkcy4gSG93ZXZlciwgd2hlbiBkZWJ1Z2dpbmcKLSAgICAvLy8gaXQgbWF5IGJlIG1vcmUgY29udmVuaWVudCB0byBzZWUgYSByZXN1bHQgaW4gdGhlIHNhbWUgZm9ybWF0IGFzIDxzZWUgY3JlZj0iU3lzdGVtLkd1aWQiLz4gcHJvdmlkZXMuCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPHBhcmE+VGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyA8c2VlIGNyZWY9IklNZXNzYWdlIi8+IHRvIGF2b2lkIGl0IGFjY2lkZW50YWxseSBiZWluZyBpbXBsZW1lbnRlZAotICAgIC8vLyBvbiB0eXBlcyBvdGhlciB0aGFuIG1lc3NhZ2VzLCB3aGVyZSBpdCB3b3VsZCBub3QgYmUgdXNlZCBieSBhbnl0aGluZyBpbiB0aGUgZnJhbWV3b3JrLjwvcGFyYT4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSUN1c3RvbURpYWdub3N0aWNNZXNzYWdlIDogSU1lc3NhZ2UKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyBvYmplY3QsIGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgd2hlbiBhIG1lc3NhZ2UgaXMgZm9ybWF0dGVkIGFzIHBhcnQgb2YgYSA8c2VlIGNyZWY9Im9iamVjdC5Ub1N0cmluZyIvPgotICAgICAgICAvLy8gY2FsbC4gSXQgZG9lcyBub3QgYWZmZWN0IHRoZSBKU09OIHJlcHJlc2VudGF0aW9uIHVzZWQgYnkgPHNlZSBjcmVmPSJKc29uRm9ybWF0dGVyIi8+IG90aGVyIHRoYW4KLSAgICAgICAgLy8vIGluIGNhbGxzIHRvIDxzZWUgY3JlZj0iSnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcoSU1lc3NhZ2UpIi8+LiBXaGlsZSBpdCBpcyByZWNvbW1lbmRlZAotICAgICAgICAvLy8gdGhhdCB0aGUgcmVzdWx0IGlzIHZhbGlkIEpTT04sIHRoaXMgaXMgbmV2ZXIgYXNzdW1lZCBieSB0aGUgUHJvdG9idWYgbGlicmFyeS4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgb2JqZWN0LCBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy48L3JldHVybnM+Ci0gICAgICAgIHN0cmluZyBUb0RpYWdub3N0aWNTdHJpbmcoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9JRGVlcENsb25lYWJsZS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0lEZWVwQ2xvbmVhYmxlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWM3MWJiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0lEZWVwQ2xvbmVhYmxlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gR2VuZXJpYyBpbnRlcmZhY2UgZm9yIGEgZGVlcGx5IGNsb25lYWJsZSB0eXBlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyA8cGFyYT4KLSAgICAvLy8gQWxsIGdlbmVyYXRlZCBtZXNzYWdlcyBpbXBsZW1lbnQgdGhpcyBpbnRlcmZhY2UsIGJ1dCBzbyBkbyBzb21lIG5vbi1tZXNzYWdlIHR5cGVzLgotICAgIC8vLyBBZGRpdGlvbmFsbHksIGR1ZSB0byB0aGUgdHlwZSBjb25zdHJhaW50IG9uIDxjPlQ8L2M+IGluIDxzZWUgY3JlZj0iSU1lc3NhZ2V7VH0iLz4sCi0gICAgLy8vIGl0IGlzIHNpbXBsZXIgdG8ga2VlcCB0aGlzIGFzIGEgc2VwYXJhdGUgaW50ZXJmYWNlLgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDwvcmVtYXJrcz4KLSAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBpdHNlbGYsIHJldHVybmVkIGJ5IHRoZSA8c2VlIGNyZWY9IkNsb25lIi8+IG1ldGhvZC48L3R5cGVwYXJhbT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElEZWVwQ2xvbmVhYmxlPFQ+Ci0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgZGVlcCBjbG9uZSBvZiB0aGlzIG9iamVjdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgZGVlcCBjbG9uZSBvZiB0aGlzIG9iamVjdC48L3JldHVybnM+Ci0gICAgICAgIFQgQ2xvbmUoKTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9JTWVzc2FnZS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0lNZXNzYWdlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTY0NGMxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0lNZXNzYWdlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb247Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEludGVyZmFjZSBmb3IgYSBQcm90b2NvbCBCdWZmZXJzIG1lc3NhZ2UsIHN1cHBvcnRpbmcKLSAgICAvLy8gYmFzaWMgb3BlcmF0aW9ucyByZXF1aXJlZCBmb3Igc2VyaWFsaXphdGlvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnRlcmZhY2UgSU1lc3NhZ2UKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1lcmdlcyB0aGUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgY29kZWQgaW5wdXQgc3RyZWFtIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPlNlZSB0aGUgdXNlciBndWlkZSBmb3IgcHJlY2lzZSBtZXJnZSBzZW1hbnRpY3MuPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImlucHV0Ij48L3BhcmFtPgotICAgICAgICB2b2lkIE1lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgdGhlIGRhdGEgdG8gdGhlIGdpdmVuIGNvZGVkIG91dHB1dCBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ib3V0cHV0Ij5Db2RlZCBvdXRwdXQgc3RyZWFtIHRvIHdyaXRlIHRoZSBkYXRhIHRvLiBNdXN0IG5vdCBiZSBudWxsLjwvcGFyYW0+Ci0gICAgICAgIHZvaWQgV3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENhbGN1bGF0ZXMgdGhlIHNpemUgb2YgdGhpcyBtZXNzYWdlIGluIFByb3RvY29sIEJ1ZmZlciB3aXJlIGZvcm1hdCwgaW4gYnl0ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIHdyaXRlIHRoaXMgbWVzc2FnZQotICAgICAgICAvLy8gdG8gYSBjb2RlZCBvdXRwdXQgc3RyZWFtLjwvcmV0dXJucz4KLSAgICAgICAgaW50IENhbGN1bGF0ZVNpemUoKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBEZXNjcmlwdG9yIGZvciB0aGlzIG1lc3NhZ2UuIEFsbCBpbnN0YW5jZXMgYXJlIGV4cGVjdGVkIHRvIHJldHVybiB0aGUgc2FtZSBkZXNjcmlwdG9yLAotICAgICAgICAvLy8gYW5kIGZvciBnZW5lcmF0ZWQgdHlwZXMgdGhpcyB3aWxsIGJlIGFuIGV4cGxpY2l0bHktaW1wbGVtZW50ZWQgbWVtYmVyLCByZXR1cm5pbmcgdGhlCi0gICAgICAgIC8vLyBzYW1lIHZhbHVlIGFzIHRoZSBzdGF0aWMgcHJvcGVydHkgZGVjbGFyZWQgb24gdGhlIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgeyBnZXQ7IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEdlbmVyaWMgaW50ZXJmYWNlIGZvciBhIFByb3RvY29sIEJ1ZmZlcnMgbWVzc2FnZSwKLSAgICAvLy8gd2hlcmUgdGhlIHR5cGUgcGFyYW1ldGVyIGlzIGV4cGVjdGVkIHRvIGJlIHRoZSBzYW1lIHR5cGUgYXMKLSAgICAvLy8gdGhlIGltcGxlbWVudGF0aW9uIGNsYXNzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIG1lc3NhZ2UgdHlwZS48L3R5cGVwYXJhbT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElNZXNzYWdlPFQ+IDogSU1lc3NhZ2UsIElFcXVhdGFibGU8VD4sIElEZWVwQ2xvbmVhYmxlPFQ+IHdoZXJlIFQgOiBJTWVzc2FnZTxUPgotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWVyZ2VzIHRoZSBnaXZlbiBtZXNzYWdlIGludG8gdGhpcyBvbmUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5TZWUgdGhlIHVzZXIgZ3VpZGUgZm9yIHByZWNpc2UgbWVyZ2Ugc2VtYW50aWNzLjwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBtZXJnZSB3aXRoIHRoaXMgb25lLiBNdXN0IG5vdCBiZSBudWxsLjwvcGFyYW0+Ci0gICAgICAgIHZvaWQgTWVyZ2VGcm9tKFQgbWVzc2FnZSk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvSW52YWxpZEpzb25FeGNlcHRpb24uY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9JbnZhbGlkSnNvbkV4Y2VwdGlvbi5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU0MzQyMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9JbnZhbGlkSnNvbkV4Y2VwdGlvbi5jcworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbS5JTzsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gVGhyb3duIHdoZW4gYW4gYXR0ZW1wdCBpcyBtYWRlIHRvIHBhcnNlIGludmFsaWQgSlNPTiwgZS5nLiB1c2luZwotICAgIC8vLyBhIG5vbi1zdHJpbmcgcHJvcGVydHkga2V5LCBvciBpbmNsdWRpbmcgYSByZWR1bmRhbnQgY29tbWEuIFBhcnNpbmcgYSBwcm90b2NvbCBidWZmZXIKLSAgICAvLy8gbWVzc2FnZSByZXByZXNlbnRlZCBpbiBKU09OIHVzaW5nIDxzZWUgY3JlZj0iSnNvblBhcnNlciIvPiBjYW4gdGhyb3cgYm90aCB0aGlzCi0gICAgLy8vIGV4Y2VwdGlvbiBhbmQgPHNlZSBjcmVmPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iLz4gZGVwZW5kaW5nIG9uIHRoZSBzaXR1YXRpb24uIFRoaXMKLSAgICAvLy8gZXhjZXB0aW9uIGlzIG9ubHkgdGhyb3duIGZvciAicHVyZSBKU09OIiBlcnJvcnMsIHdoZXJlYXMgPGM+SW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uPC9jPgotICAgIC8vLyBpcyB0aHJvd24gd2hlbiB0aGUgSlNPTiBtYXkgYmUgdmFsaWQgaW4gYW5kIG9mIGl0c2VsZiwgYnV0IGNhbm5vdCBiZSBwYXJzZWQgYXMgYSBwcm90b2NvbCBidWZmZXIKLSAgICAvLy8gbWVzc2FnZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgSW52YWxpZEpzb25FeGNlcHRpb24gOiBJT0V4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgSW52YWxpZEpzb25FeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZhZWZiNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjkgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLklPOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaHJvd24gd2hlbiBhIHByb3RvY29sIG1lc3NhZ2UgYmVpbmcgcGFyc2VkIGlzIGludmFsaWQgaW4gc29tZSB3YXksCi0gICAgLy8vIGUuZy4gaXQgY29udGFpbnMgYSBtYWxmb3JtZWQgdmFyaW50IG9yIGEgbmVnYXRpdmUgYnl0ZSBsZW5ndGguCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiA6IElPRXhjZXB0aW9uCi0gICAgewotICAgICAgICBpbnRlcm5hbCBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oc3RyaW5nIG1lc3NhZ2UpCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlLCBFeGNlcHRpb24gaW5uZXJFeGNlcHRpb24pCi0gICAgICAgICAgICA6IGJhc2UobWVzc2FnZSwgaW5uZXJFeGNlcHRpb24pCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gTW9yZURhdGFBdmFpbGFibGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ29tcGxldGVkIHJlYWRpbmcgYSBtZXNzYWdlIHdoaWxlIG1vcmUgZGF0YSB3YXMgYXZhaWxhYmxlIGluIHRoZSBzdHJlYW0uIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFRydW5jYXRlZE1lc3NhZ2UoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiV2hpbGUgcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UsIHRoZSBpbnB1dCBlbmRlZCB1bmV4cGVjdGVkbHkgIiArCi0gICAgICAgICAgICAgICAgImluIHRoZSBtaWRkbGUgb2YgYSBmaWVsZC4gIFRoaXMgY291bGQgbWVhbiBlaXRoZXIgdGhhbiB0aGUgIiArCi0gICAgICAgICAgICAgICAgImlucHV0IGhhcyBiZWVuIHRydW5jYXRlZCBvciB0aGF0IGFuIGVtYmVkZGVkIG1lc3NhZ2UgIiArCi0gICAgICAgICAgICAgICAgIm1pc3JlcG9ydGVkIGl0cyBvd24gbGVuZ3RoLiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBOZWdhdGl2ZVNpemUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiQ29kZWRJbnB1dFN0cmVhbSBlbmNvdW50ZXJlZCBhbiBlbWJlZGRlZCBzdHJpbmcgb3IgbWVzc2FnZSAiICsKLSAgICAgICAgICAgICAgICAid2hpY2ggY2xhaW1lZCB0byBoYXZlIG5lZ2F0aXZlIHNpemUuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIE1hbGZvcm1lZFZhcmludCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJDb2RlZElucHV0U3RyZWFtIGVuY291bnRlcmVkIGEgbWFsZm9ybWVkIHZhcmludC4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYW4gZXhjZXB0aW9uIGZvciBhbiBlcnJvciBjb25kaXRpb24gb2YgYW4gaW52YWxpZCB0YWcgYmVpbmcgZW5jb3VudGVyZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gSW52YWxpZFRhZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIGNvbnRhaW5lZCBhbiBpbnZhbGlkIHRhZyAoemVybykuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIEludmFsaWRCYXNlNjQoRXhjZXB0aW9uIGlubmVyRXhjZXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiSW52YWxpZCBiYXNlNjQgZGF0YSIsIGlubmVyRXhjZXB0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gSW52YWxpZEVuZFRhZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIGVuZC1ncm91cCB0YWcgZGlkIG5vdCBtYXRjaCBleHBlY3RlZCB0YWcuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAiUHJvdG9jb2wgbWVzc2FnZSBoYWQgdG9vIG1hbnkgbGV2ZWxzIG9mIG5lc3RpbmcuICBNYXkgYmUgbWFsaWNpb3VzLiAgIiArCi0gICAgICAgICAgICAgICAgIlVzZSBDb2RlZElucHV0U3RyZWFtLlNldFJlY3Vyc2lvbkxpbWl0KCkgdG8gaW5jcmVhc2UgdGhlIGRlcHRoIGxpbWl0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBKc29uUmVjdXJzaW9uTGltaXRFeGNlZWRlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIGhhZCB0b28gbWFueSBsZXZlbHMgb2YgbmVzdGluZy4gIE1heSBiZSBtYWxpY2lvdXMuICAiICsKLSAgICAgICAgICAgICAgICAiVXNlIEpzb25QYXJzZXIuU2V0dGluZ3MgdG8gaW5jcmVhc2UgdGhlIGRlcHRoIGxpbWl0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBTaXplTGltaXRFeGNlZWRlZCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIHdhcyB0b28gbGFyZ2UuICBNYXkgYmUgbWFsaWNpb3VzLiAgIiArCi0gICAgICAgICAgICAgICAgIlVzZSBDb2RlZElucHV0U3RyZWFtLlNldFNpemVMaW1pdCgpIHRvIGluY3JlYXNlIHRoZSBzaXplIGxpbWl0LiIpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBJbnZhbGlkTWVzc2FnZVN0cmVhbVRhZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJTdHJlYW0gb2YgcHJvdG9jb2wgbWVzc2FnZXMgaGFkIGludmFsaWQgdGFnLiBFeHBlY3RlZCB0YWcgaXMgbGVuZ3RoLWRlbGltaXRlZCBmaWVsZCAxLiIpOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0pzb25Gb3JtYXR0ZXIuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Kc29uRm9ybWF0dGVyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4Mzc3MjQ3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0pzb25Gb3JtYXR0ZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MTIgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBSZWZsZWN0aW9uLWJhc2VkIGNvbnZlcnRlciBmcm9tIG1lc3NhZ2VzIHRvIEpTT04uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBJbnN0YW5jZXMgb2YgdGhpcyBjbGFzcyBhcmUgdGhyZWFkLXNhZmUsIHdpdGggbm8gbXV0YWJsZSBzdGF0ZS4KLSAgICAvLy8gPC9wYXJhPgotICAgIC8vLyA8cGFyYT4KLSAgICAvLy8gVGhpcyBpcyBhIHNpbXBsZSBzdGFydCB0byBnZXQgSlNPTiBmb3JtYXR0aW5nIHdvcmtpbmcuIEFzIGl0J3MgcmVmbGVjdGlvbi1iYXNlZCwKLSAgICAvLy8gaXQncyBub3QgYXMgcXVpY2sgYXMgYmFraW5nIGNhbGxzIGludG8gZ2VuZXJhdGVkIG1lc3NhZ2VzIC0gYnV0IGlzIGEgc2ltcGxlciBpbXBsZW1lbnRhdGlvbi4KLSAgICAvLy8gKFRoaXMgY29kZSBpcyBnZW5lcmFsbHkgbm90IGhlYXZpbHkgb3B0aW1pemVkLikKLSAgICAvLy8gPC9wYXJhPgotICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBKc29uRm9ybWF0dGVyCi0gICAgewotICAgICAgICBpbnRlcm5hbCBjb25zdCBzdHJpbmcgQW55VHlwZVVybEZpZWxkID0gIkB0eXBlIjsKLSAgICAgICAgaW50ZXJuYWwgY29uc3Qgc3RyaW5nIEFueURpYWdub3N0aWNWYWx1ZUZpZWxkID0gIkB2YWx1ZSI7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IHN0cmluZyBBbnlXZWxsS25vd25UeXBlVmFsdWVGaWVsZCA9ICJ2YWx1ZSI7Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIFR5cGVVcmxQcmVmaXggPSAidHlwZS5nb29nbGVhcGlzLmNvbSI7Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIE5hbWVWYWx1ZVNlcGFyYXRvciA9ICI6ICI7Ci0gICAgICAgIHByaXZhdGUgY29uc3Qgc3RyaW5nIFByb3BlcnR5U2VwYXJhdG9yID0gIiwgIjsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIGEgZm9ybWF0dGVyIHVzaW5nIHRoZSBkZWZhdWx0IHNldHRpbmdzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIEpzb25Gb3JtYXR0ZXIgRGVmYXVsdCB7IGdldDsgfSA9IG5ldyBKc29uRm9ybWF0dGVyKFNldHRpbmdzLkRlZmF1bHQpOwotCi0gICAgICAgIC8vIEEgSlNPTiBmb3JtYXR0ZXIgd2hpY2ggKm9ubHkqIGV4aXN0cyAKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSnNvbkZvcm1hdHRlciBkaWFnbm9zdGljRm9ybWF0dGVyID0gbmV3IEpzb25Gb3JtYXR0ZXIoU2V0dGluZ3MuRGVmYXVsdCk7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpcnN0IDE2MCBjaGFyYWN0ZXJzIG9mIFVuaWNvZGUuCi0gICAgICAgIC8vLyBFbXB0eSBzdHJpbmdzIGFyZSByZXBsYWNlZCBieSB0aGUgc3RhdGljIGNvbnN0cnVjdG9yLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBzdHJpbmdbXSBDb21tb25SZXByZXNlbnRhdGlvbnMgPSB7Ci0gICAgICAgICAgICAvLyBDMCAoQVNDSUkgYW5kIGRlcml2YXRpdmVzKSBjb250cm9sIGNoYXJhY3RlcnMKLSAgICAgICAgICAgICJcXHUwMDAwIiwgIlxcdTAwMDEiLCAiXFx1MDAwMiIsICJcXHUwMDAzIiwgIC8vIDB4MDAKLSAgICAgICAgICAiXFx1MDAwNCIsICJcXHUwMDA1IiwgIlxcdTAwMDYiLCAiXFx1MDAwNyIsCi0gICAgICAgICAgIlxcYiIsICAgICAiXFx0IiwgICAgICJcXG4iLCAgICAgIlxcdTAwMGIiLAotICAgICAgICAgICJcXGYiLCAgICAgIlxcciIsICAgICAiXFx1MDAwZSIsICJcXHUwMDBmIiwKLSAgICAgICAgICAiXFx1MDAxMCIsICJcXHUwMDExIiwgIlxcdTAwMTIiLCAiXFx1MDAxMyIsICAvLyAweDEwCi0gICAgICAgICAgIlxcdTAwMTQiLCAiXFx1MDAxNSIsICJcXHUwMDE2IiwgIlxcdTAwMTciLAotICAgICAgICAgICJcXHUwMDE4IiwgIlxcdTAwMTkiLCAiXFx1MDAxYSIsICJcXHUwMDFiIiwKLSAgICAgICAgICAiXFx1MDAxYyIsICJcXHUwMDFkIiwgIlxcdTAwMWUiLCAiXFx1MDAxZiIsCi0gICAgICAgICAgICAvLyBFc2NhcGluZyBvZiAiIGFuZCBcIGFyZSByZXF1aXJlZCBieSB3d3cuanNvbi5vcmcgc3RyaW5nIGRlZmluaXRpb24uCi0gICAgICAgICAgICAvLyBFc2NhcGluZyBvZiA8IGFuZCA+IGFyZSByZXF1aXJlZCBmb3IgSFRNTCBzZWN1cml0eS4KLSAgICAgICAgICAgICIiLCAiIiwgIlxcXCIiLCAiIiwgIiIsICAgICAgICAiIiwgIiIsICAgICAgICAiIiwgIC8vIDB4MjAKLSAgICAgICAgICAiIiwgIiIsICIiLCAgICAgIiIsICIiLCAgICAgICAgIiIsICIiLCAgICAgICAgIiIsCi0gICAgICAgICAgIiIsICIiLCAiIiwgICAgICIiLCAiIiwgICAgICAgICIiLCAiIiwgICAgICAgICIiLCAgLy8gMHgzMAotICAgICAgICAgICIiLCAiIiwgIiIsICAgICAiIiwgIlxcdTAwM2MiLCAiIiwgIlxcdTAwM2UiLCAiIiwKLSAgICAgICAgICAiIiwgIiIsICIiLCAgICAgIiIsICIiLCAgICAgICAgIiIsICIiLCAgICAgICAgIiIsICAvLyAweDQwCi0gICAgICAgICAgIiIsICIiLCAiIiwgICAgICIiLCAiIiwgICAgICAgICIiLCAiIiwgICAgICAgICIiLAotICAgICAgICAgICIiLCAiIiwgIiIsICAgICAiIiwgIiIsICAgICAgICAiIiwgIiIsICAgICAgICAiIiwgIC8vIDB4NTAKLSAgICAgICAgICAiIiwgIiIsICIiLCAgICAgIiIsICJcXFxcIiwgICAgIiIsICIiLCAgICAgICAgIiIsCi0gICAgICAgICAgIiIsICIiLCAiIiwgICAgICIiLCAiIiwgICAgICAgICIiLCAiIiwgICAgICAgICIiLCAgLy8gMHg2MAotICAgICAgICAgICIiLCAiIiwgIiIsICAgICAiIiwgIiIsICAgICAgICAiIiwgIiIsICAgICAgICAiIiwKLSAgICAgICAgICAiIiwgIiIsICIiLCAgICAgIiIsICIiLCAgICAgICAgIiIsICIiLCAgICAgICAgIiIsICAvLyAweDcwCi0gICAgICAgICAgIiIsICIiLCAiIiwgICAgICIiLCAiIiwgICAgICAgICIiLCAiIiwgICAgICAgICJcXHUwMDdmIiwKLSAgICAgICAgICAgIC8vIEMxIChJU08gODg1OSBhbmQgVW5pY29kZSkgZXh0ZW5kZWQgY29udHJvbCBjaGFyYWN0ZXJzCi0gICAgICAgICAgICAiXFx1MDA4MCIsICJcXHUwMDgxIiwgIlxcdTAwODIiLCAiXFx1MDA4MyIsICAvLyAweDgwCi0gICAgICAgICAgIlxcdTAwODQiLCAiXFx1MDA4NSIsICJcXHUwMDg2IiwgIlxcdTAwODciLAotICAgICAgICAgICJcXHUwMDg4IiwgIlxcdTAwODkiLCAiXFx1MDA4YSIsICJcXHUwMDhiIiwKLSAgICAgICAgICAiXFx1MDA4YyIsICJcXHUwMDhkIiwgIlxcdTAwOGUiLCAiXFx1MDA4ZiIsCi0gICAgICAgICAgIlxcdTAwOTAiLCAiXFx1MDA5MSIsICJcXHUwMDkyIiwgIlxcdTAwOTMiLCAgLy8gMHg5MAotICAgICAgICAgICJcXHUwMDk0IiwgIlxcdTAwOTUiLCAiXFx1MDA5NiIsICJcXHUwMDk3IiwKLSAgICAgICAgICAiXFx1MDA5OCIsICJcXHUwMDk5IiwgIlxcdTAwOWEiLCAiXFx1MDA5YiIsCi0gICAgICAgICAgIlxcdTAwOWMiLCAiXFx1MDA5ZCIsICJcXHUwMDllIiwgIlxcdTAwOWYiCi0gICAgICAgIH07Ci0KLSAgICAgICAgc3RhdGljIEpzb25Gb3JtYXR0ZXIoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IENvbW1vblJlcHJlc2VudGF0aW9ucy5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoQ29tbW9uUmVwcmVzZW50YXRpb25zW2ldID09ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgQ29tbW9uUmVwcmVzZW50YXRpb25zW2ldID0gKChjaGFyKSBpKS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU2V0dGluZ3Mgc2V0dGluZ3M7Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sIERpYWdub3N0aWNPbmx5ID0+IFJlZmVyZW5jZUVxdWFscyh0aGlzLCBkaWFnbm9zdGljRm9ybWF0dGVyKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgbmV3IGZvcm1hdHRlZCB3aXRoIHRoZSBnaXZlbiBzZXR0aW5ncy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZXR0aW5ncyI+VGhlIHNldHRpbmdzLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBKc29uRm9ybWF0dGVyKFNldHRpbmdzIHNldHRpbmdzKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLnNldHRpbmdzID0gc2V0dGluZ3M7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGb3JtYXRzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBhcyBKU09OLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIGZvcm1hdC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGZvcm1hdHRlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0cmluZyBGb3JtYXQoSU1lc3NhZ2UgbWVzc2FnZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHdyaXRlciA9IG5ldyBTdHJpbmdXcml0ZXIoKTsKLSAgICAgICAgICAgIEZvcm1hdChtZXNzYWdlLCB3cml0ZXIpOwotICAgICAgICAgICAgcmV0dXJuIHdyaXRlci5Ub1N0cmluZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRm9ybWF0cyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXMgSlNPTi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byBmb3JtYXQuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ3cml0ZXIiPlRoZSBUZXh0V3JpdGVyIHRvIHdyaXRlIHRoZSBmb3JtYXR0ZWQgbWVzc2FnZSB0by48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGZvcm1hdHRlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHZvaWQgRm9ybWF0KElNZXNzYWdlIG1lc3NhZ2UsIFRleHRXcml0ZXIgd3JpdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2UsIG5hbWVvZihtZXNzYWdlKSk7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHdyaXRlciwgbmFtZW9mKHdyaXRlcikpOwotCi0gICAgICAgICAgICBpZiAobWVzc2FnZS5EZXNjcmlwdG9yLklzV2VsbEtub3duVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZVdlbGxLbm93blR5cGVWYWx1ZSh3cml0ZXIsIG1lc3NhZ2UuRGVzY3JpcHRvciwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVNZXNzYWdlKHdyaXRlciwgbWVzc2FnZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyBhIG1lc3NhZ2UgdG8gSlNPTiBmb3IgZGlhZ25vc3RpYyBwdXJwb3NlcyB3aXRoIG5vIGV4dHJhIGNvbnRleHQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhPgotICAgICAgICAvLy8gVGhpcyBkaWZmZXJzIGZyb20gY2FsbGluZyA8c2VlIGNyZWY9IkZvcm1hdChJTWVzc2FnZSkiLz4gb24gdGhlIGRlZmF1bHQgSlNPTgotICAgICAgICAvLy8gZm9ybWF0dGVyIGluIGl0cyBoYW5kbGluZyBvZiA8c2VlIGNyZWY9IkFueSIvPi4gQXMgbm8gdHlwZSByZWdpc3RyeSBpcyBhdmFpbGFibGUKLSAgICAgICAgLy8vIGluIDxzZWUgY3JlZj0ib2JqZWN0LlRvU3RyaW5nIi8+IGNhbGxzLCB0aGUgbm9ybWFsIHdheSBvZiByZXNvbHZpbmcgdGhlIHR5cGUgb2YKLSAgICAgICAgLy8vIGFuIDxjPkFueTwvYz4gbWVzc2FnZSBjYW5ub3QgYmUgYXBwbGllZC4gSW5zdGVhZCwgYSBKU09OIHByb3BlcnR5IG5hbWVkIDxjPkB2YWx1ZTwvYz4KLSAgICAgICAgLy8vIGlzIGluY2x1ZGVkIHdpdGggdGhlIGJhc2U2NCBkYXRhIGZyb20gdGhlIDxzZWUgY3JlZj0iQW55LlZhbHVlIi8+IHByb3BlcnR5IG9mIHRoZSBtZXNzYWdlLgotICAgICAgICAvLy8gPC9wYXJhPgotICAgICAgICAvLy8gPHBhcmE+VGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgbWV0aG9kIGlzIG9ubHkgZGVzaWduZWQgdG8gYmUgdXNlZCBmb3IgZGlhZ25vc3RpYwotICAgICAgICAvLy8gcHVycG9zZXMuIEl0IG1heSBub3QgYmUgcGFyc2FibGUgYnkgPHNlZSBjcmVmPSJKc29uUGFyc2VyIi8+LCBhbmQgbWF5IG5vdCBiZSBwYXJzYWJsZQotICAgICAgICAvLy8gYnkgb3RoZXIgUHJvdG9jb2wgQnVmZmVyIGltcGxlbWVudGF0aW9ucy48L3BhcmE+Ci0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gZm9ybWF0IGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZGlhZ25vc3RpYy1vbmx5IEpTT04gcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2U8L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgc3RyaW5nIFRvRGlhZ25vc3RpY1N0cmluZyhJTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2UsIG5hbWVvZihtZXNzYWdlKSk7Ci0gICAgICAgICAgICByZXR1cm4gZGlhZ25vc3RpY0Zvcm1hdHRlci5Gb3JtYXQobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVNZXNzYWdlKFRleHRXcml0ZXIgd3JpdGVyLCBJTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAobWVzc2FnZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlTnVsbCh3cml0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChEaWFnbm9zdGljT25seSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJQ3VzdG9tRGlhZ25vc3RpY01lc3NhZ2UgY3VzdG9tRGlhZ25vc3RpY01lc3NhZ2UgPSBtZXNzYWdlIGFzIElDdXN0b21EaWFnbm9zdGljTWVzc2FnZTsKLSAgICAgICAgICAgICAgICBpZiAoY3VzdG9tRGlhZ25vc3RpY01lc3NhZ2UgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShjdXN0b21EaWFnbm9zdGljTWVzc2FnZS5Ub0RpYWdub3N0aWNTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoInsgIik7Ci0gICAgICAgICAgICBib29sIHdyaXR0ZW5GaWVsZHMgPSBXcml0ZU1lc3NhZ2VGaWVsZHMod3JpdGVyLCBtZXNzYWdlLCBmYWxzZSk7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUod3JpdHRlbkZpZWxkcyA/ICIgfSIgOiAifSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBib29sIFdyaXRlTWVzc2FnZUZpZWxkcyhUZXh0V3JpdGVyIHdyaXRlciwgSU1lc3NhZ2UgbWVzc2FnZSwgYm9vbCBhc3N1bWVGaXJzdEZpZWxkV3JpdHRlbikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZpZWxkcyA9IG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHM7Ci0gICAgICAgICAgICBib29sIGZpcnN0ID0gIWFzc3VtZUZpcnN0RmllbGRXcml0dGVuOwotICAgICAgICAgICAgLy8gRmlyc3Qgbm9uLW9uZW9mIGZpZWxkcwotICAgICAgICAgICAgZm9yZWFjaCAodmFyIGZpZWxkIGluIGZpZWxkcy5JbkZpZWxkTnVtYmVyT3JkZXIoKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB2YXIgYWNjZXNzb3IgPSBmaWVsZC5BY2Nlc3NvcjsKLSAgICAgICAgICAgICAgICBpZiAoZmllbGQuQ29udGFpbmluZ09uZW9mICE9IG51bGwgJiYgZmllbGQuQ29udGFpbmluZ09uZW9mLkFjY2Vzc29yLkdldENhc2VGaWVsZERlc2NyaXB0b3IobWVzc2FnZSkgIT0gZmllbGQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gT21pdCBkZWZhdWx0IHZhbHVlcyB1bmxlc3Mgd2UncmUgYXNrZWQgdG8gZm9ybWF0IHRoZW0sIG9yIHRoZXkncmUgb25lb2ZzICh3aGVyZSB0aGUgZGVmYXVsdAotICAgICAgICAgICAgICAgIC8vIHZhbHVlIGlzIHN0aWxsIGZvcm1hdHRlZCByZWdhcmRsZXNzLCBiZWNhdXNlIHRoYXQncyBob3cgd2UgcHJlc2VydmUgdGhlIG9uZW9mIGNhc2UpLgotICAgICAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9IGFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpOwotICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Db250YWluaW5nT25lb2YgPT0gbnVsbCAmJiAhc2V0dGluZ3MuRm9ybWF0RGVmYXVsdFZhbHVlcyAmJiBJc0RlZmF1bHRWYWx1ZShhY2Nlc3NvciwgdmFsdWUpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgLy8gT2theSwgYWxsIHRlc3RzIGNvbXBsZXRlOiBsZXQncyB3cml0ZSB0aGUgZmllbGQgdmFsdWUuLi4KLSAgICAgICAgICAgICAgICBpZiAoIWZpcnN0KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKFByb3BlcnR5U2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBXcml0ZVN0cmluZyh3cml0ZXIsIGFjY2Vzc29yLkRlc2NyaXB0b3IuSnNvbk5hbWUpOwotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShOYW1lVmFsdWVTZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIFdyaXRlVmFsdWUod3JpdGVyLCB2YWx1ZSk7Ci0KLSAgICAgICAgICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuICFmaXJzdDsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENhbWVsLWNhc2UgY29udmVydGVyIHdpdGggYWRkZWQgc3RyaWN0bmVzcyBmb3IgZmllbGQgbWFzayBmb3JtYXR0aW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj5UaGUgZmllbGQgbWFzayBpcyBpbnZhbGlkIGZvciBKU09OIHJlcHJlc2VudGF0aW9uPC9leGNlcHRpb24+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUb0NhbWVsQ2FzZUZvckZpZWxkTWFzayhzdHJpbmcgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gaW5wdXRbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oJCJJbnZhbGlkIGZpZWxkIG1hc2sgdG8gYmUgY29udmVydGVkIHRvIEpTT046IHtpbnB1dH0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGMgPT0gJ18nICYmIGkgPCBpbnB1dC5MZW5ndGggLSAxKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBuZXh0ID0gaW5wdXRbaSArIDFdOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA8ICdhJyB8fCBuZXh0ID4gJ3onKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigkIkludmFsaWQgZmllbGQgbWFzayB0byBiZSBjb252ZXJ0ZWQgdG8gSlNPTjoge2lucHV0fSIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFRvQ2FtZWxDYXNlKGlucHV0KTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbnZlcnRlZCBmcm9tIHNyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjIFRvQ2FtZWxDYXNlCi0gICAgICAgIC8vIFRPRE86IFVzZSB0aGUgbmV3IGZpZWxkIGluIEZpZWxkRGVzY3JpcHRvci4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBUb0NhbWVsQ2FzZShzdHJpbmcgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGJvb2wgY2FwaXRhbGl6ZU5leHQgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgd2FzQ2FwID0gdHJ1ZTsKLSAgICAgICAgICAgIGJvb2wgaXNDYXAgPSBmYWxzZTsKLSAgICAgICAgICAgIGJvb2wgZmlyc3RXb3JkID0gdHJ1ZTsKLSAgICAgICAgICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoaW5wdXQuTGVuZ3RoKTsKLQotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5MZW5ndGg7IGkrKywgd2FzQ2FwID0gaXNDYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaXNDYXAgPSBjaGFyLklzVXBwZXIoaW5wdXRbaV0pOwotICAgICAgICAgICAgICAgIGlmIChpbnB1dFtpXSA9PSAnXycpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXBpdGFsaXplTmV4dCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuTGVuZ3RoICE9IDApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0V29yZCA9IGZhbHNlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmaXJzdFdvcmQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBDb25zaWRlciB3aGVuIHRoZSBjdXJyZW50IGNoYXJhY3RlciBCIGlzIGNhcGl0YWxpemVkLAotICAgICAgICAgICAgICAgICAgICAvLyBmaXJzdCB3b3JkIGVuZHMgd2hlbjoKLSAgICAgICAgICAgICAgICAgICAgLy8gMSkgZm9sbG93aW5nIGEgbG93ZXJjYXNlOiAgICIuLi5hQi4uLiIKLSAgICAgICAgICAgICAgICAgICAgLy8gMikgZm9sbG93ZWQgYnkgYSBsb3dlcmNhc2U6ICIuLi5BQmMuLi4iCi0gICAgICAgICAgICAgICAgICAgIGlmIChyZXN1bHQuTGVuZ3RoICE9IDAgJiYgaXNDYXAgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICghd2FzQ2FwIHx8IChpICsgMSA8IGlucHV0Lkxlbmd0aCAmJiBjaGFyLklzTG93ZXIoaW5wdXRbaSArIDFdKSkpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaXJzdFdvcmQgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5BcHBlbmQoY2hhci5Ub0xvd2VySW52YXJpYW50KGlucHV0W2ldKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjYXBpdGFsaXplTmV4dCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNhcGl0YWxpemVOZXh0ID0gZmFsc2U7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjaGFyLklzTG93ZXIoaW5wdXRbaV0pKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQuQXBwZW5kKGNoYXIuVG9VcHBlckludmFyaWFudChpbnB1dFtpXSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmVzdWx0LkFwcGVuZChpbnB1dFtpXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0LlRvU3RyaW5nKCk7Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgV3JpdGVOdWxsKFRleHRXcml0ZXIgd3JpdGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoIm51bGwiKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNEZWZhdWx0VmFsdWUoSUZpZWxkQWNjZXNzb3IgYWNjZXNzb3IsIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGFjY2Vzc29yLkRlc2NyaXB0b3IuSXNNYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSURpY3Rpb25hcnkgZGljdGlvbmFyeSA9IChJRGljdGlvbmFyeSkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRpY3Rpb25hcnkuQ291bnQgPT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChhY2Nlc3Nvci5EZXNjcmlwdG9yLklzUmVwZWF0ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSUxpc3QgbGlzdCA9IChJTGlzdCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGxpc3QuQ291bnQgPT0gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHN3aXRjaCAoYWNjZXNzb3IuRGVzY3JpcHRvci5GaWVsZFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuQm9vbDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChib29sKSB2YWx1ZSA9PSBmYWxzZTsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChCeXRlU3RyaW5nKSB2YWx1ZSA9PSBCeXRlU3RyaW5nLkVtcHR5OwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlN0cmluZzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChzdHJpbmcpIHZhbHVlID09ICIiOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkRvdWJsZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChkb3VibGUpIHZhbHVlID09IDAuMDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50MzI6Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuSW50MzI6Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRW51bToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlID09IDA7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50MzI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgdmFsdWUgPT0gMDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDY0OgotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICh1bG9uZykgdmFsdWUgPT0gMDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50NjQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAobG9uZykgdmFsdWUgPT0gMDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GbG9hdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChmbG9hdCkgdmFsdWUgPT0gMGY7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuTWVzc2FnZToKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Hcm91cDogLy8gTmV2ZXIgZXhwZWN0IHRvIGdldCB0aGlzLCBidXQuLi4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlID09IG51bGw7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJJbnZhbGlkIGZpZWxkIHR5cGUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlVmFsdWUoVGV4dFdyaXRlciB3cml0ZXIsIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVOdWxsKHdyaXRlcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBib29sKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgoYm9vbCl2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgQnl0ZVN0cmluZykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBOb3RoaW5nIGluIEJhc2U2NCBuZWVkcyBlc2NhcGluZwotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgnIicpOwotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgoKEJ5dGVTdHJpbmcpdmFsdWUpLlRvQmFzZTY0KCkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgnIicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgc3RyaW5nKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlU3RyaW5nKHdyaXRlciwgKHN0cmluZyl2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBJRGljdGlvbmFyeSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZURpY3Rpb25hcnkod3JpdGVyLCAoSURpY3Rpb25hcnkpdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgSUxpc3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVMaXN0KHdyaXRlciwgKElMaXN0KXZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIGludCB8fCB2YWx1ZSBpcyB1aW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIElGb3JtYXR0YWJsZSBmb3JtYXR0YWJsZSA9IChJRm9ybWF0dGFibGUpIHZhbHVlOwotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShmb3JtYXR0YWJsZS5Ub1N0cmluZygiZCIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHZhbHVlIGlzIGxvbmcgfHwgdmFsdWUgaXMgdWxvbmcpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCciJyk7Ci0gICAgICAgICAgICAgICAgSUZvcm1hdHRhYmxlIGZvcm1hdHRhYmxlID0gKElGb3JtYXR0YWJsZSkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKGZvcm1hdHRhYmxlLlRvU3RyaW5nKCJkIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgnIicpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgU3lzdGVtLkVudW0pCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBPcmlnaW5hbEVudW1WYWx1ZUhlbHBlci5HZXRPcmlnaW5hbE5hbWUodmFsdWUpOwotICAgICAgICAgICAgICAgIGlmIChuYW1lICE9IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBXcml0ZVN0cmluZyh3cml0ZXIsIG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBXcml0ZVZhbHVlKHdyaXRlciwgKGludCl2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodmFsdWUgaXMgZmxvYXQgfHwgdmFsdWUgaXMgZG91YmxlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyB0ZXh0ID0gKChJRm9ybWF0dGFibGUpIHZhbHVlKS5Ub1N0cmluZygiciIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgIGlmICh0ZXh0ID09ICJOYU4iIHx8IHRleHQgPT0gIkluZmluaXR5IiB8fCB0ZXh0ID09ICItSW5maW5pdHkiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCciJyk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSh0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKCciJyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSh0ZXh0KTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh2YWx1ZSBpcyBJTWVzc2FnZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gKElNZXNzYWdlKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBpZiAobWVzc2FnZS5EZXNjcmlwdG9yLklzV2VsbEtub3duVHlwZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlV2VsbEtub3duVHlwZVZhbHVlKHdyaXRlciwgbWVzc2FnZS5EZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIFdyaXRlTWVzc2FnZSh3cml0ZXIsIChJTWVzc2FnZSl2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiVW5hYmxlIHRvIGZvcm1hdCB2YWx1ZSBvZiB0eXBlICIgKyB2YWx1ZS5HZXRUeXBlKCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ2VudHJhbCBpbnRlcmNlcHRpb24gcG9pbnQgZm9yIHdlbGwta25vd24gdHlwZSBmb3JtYXR0aW5nLiBBbnkgd2VsbC1rbm93biB0eXBlcyB3aGljaAotICAgICAgICAvLy8gZG9uJ3QgbmVlZCBzcGVjaWFsIGhhbmRsaW5nIGNhbiBmYWxsIGJhY2sgdG8gV3JpdGVNZXNzYWdlLiBXZSBhdm9pZCBhc3N1bWluZyB0aGF0IHRoZQotICAgICAgICAvLy8gdmFsdWVzIGFyZSB1c2luZyB0aGUgZW1iZWRkZWQgd2VsbC1rbm93biB0eXBlcywgaW4gb3JkZXIgdG8gYWxsb3cgZm9yIGR5bmFtaWMgbWVzc2FnZXMKLSAgICAgICAgLy8vIGluIHRoZSBmdXR1cmUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVdlbGxLbm93blR5cGVWYWx1ZShUZXh0V3JpdGVyIHdyaXRlciwgTWVzc2FnZURlc2NyaXB0b3IgZGVzY3JpcHRvciwgb2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBDdXJyZW50bHksIHdlIGNhbiBuZXZlciBhY3R1YWxseSBnZXQgaGVyZSwgYmVjYXVzZSBudWxsIHZhbHVlcyBhcmUgYWx3YXlzIGhhbmRsZWQgYnkgdGhlIGNhbGxlci4gQnV0IGlmIHdlICpjb3VsZCosCi0gICAgICAgICAgICAvLyB0aGlzIHdvdWxkIGRvIHRoZSByaWdodCB0aGluZy4KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlTnVsbCh3cml0ZXIpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIEZvciB3cmFwcGVyIHR5cGVzLCB0aGUgdmFsdWUgd2lsbCBlaXRoZXIgYmUgdGhlIChwb3NzaWJseSBib3hlZCkgIm5hdGl2ZSIgdmFsdWUsCi0gICAgICAgICAgICAvLyBvciB0aGUgbWVzc2FnZSBpdHNlbGYgaWYgd2UncmUgZm9ybWF0dGluZyBpdCBhdCB0aGUgdG9wIGxldmVsIChlLmcuIGp1c3QgY2FsbGluZyBUb1N0cmluZyBvbiB0aGUgb2JqZWN0IGl0c2VsZikuCi0gICAgICAgICAgICAvLyBJZiBpdCdzIHRoZSBtZXNzYWdlIGZvcm0sIHdlIGNhbiBleHRyYWN0IHRoZSB2YWx1ZSBmaXJzdCwgd2hpY2ggKndpbGwqIGJlIHRoZSAocG9zc2libHkgYm94ZWQpIG5hdGl2ZSB2YWx1ZSwKLSAgICAgICAgICAgIC8vIGFuZCB0aGVuIHByb2NlZWQsIHdyaXRpbmcgaXQgYXMgaWYgd2Ugd2VyZSBkZWZpbml0ZWx5IGluIGEgZmllbGQuIChXZSBuZXZlciBuZWVkIHRvIHdyYXAgaXQgaW4gYW4gZXh0cmEgc3RyaW5nLi4uCi0gICAgICAgICAgICAvLyBXcml0ZVZhbHVlIHdpbGwgZG8gdGhlIHJpZ2h0IHRoaW5nLikKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLklzV3JhcHBlclR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGlzIElNZXNzYWdlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG1lc3NhZ2UgPSAoSU1lc3NhZ2UpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHNbV3JhcHBlcnNSZWZsZWN0aW9uLldyYXBwZXJWYWx1ZUZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgV3JpdGVWYWx1ZSh3cml0ZXIsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5GdWxsTmFtZSA9PSBUaW1lc3RhbXAuRGVzY3JpcHRvci5GdWxsTmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZVRpbWVzdGFtcCh3cml0ZXIsIChJTWVzc2FnZSl2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuRnVsbE5hbWUgPT0gRHVyYXRpb24uRGVzY3JpcHRvci5GdWxsTmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZUR1cmF0aW9uKHdyaXRlciwgKElNZXNzYWdlKXZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5GdWxsTmFtZSA9PSBGaWVsZE1hc2suRGVzY3JpcHRvci5GdWxsTmFtZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZUZpZWxkTWFzayh3cml0ZXIsIChJTWVzc2FnZSl2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuRnVsbE5hbWUgPT0gU3RydWN0LkRlc2NyaXB0b3IuRnVsbE5hbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVTdHJ1Y3Qod3JpdGVyLCAoSU1lc3NhZ2UpdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLkZ1bGxOYW1lID09IExpc3RWYWx1ZS5EZXNjcmlwdG9yLkZ1bGxOYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciBmaWVsZEFjY2Vzc29yID0gZGVzY3JpcHRvci5GaWVsZHNbTGlzdFZhbHVlLlZhbHVlc0ZpZWxkTnVtYmVyXS5BY2Nlc3NvcjsKLSAgICAgICAgICAgICAgICBXcml0ZUxpc3Qod3JpdGVyLCAoSUxpc3QpZmllbGRBY2Nlc3Nvci5HZXRWYWx1ZSgoSU1lc3NhZ2UpdmFsdWUpKTsKLSAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5GdWxsTmFtZSA9PSBWYWx1ZS5EZXNjcmlwdG9yLkZ1bGxOYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFdyaXRlU3RydWN0RmllbGRWYWx1ZSh3cml0ZXIsIChJTWVzc2FnZSl2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuRnVsbE5hbWUgPT0gQW55LkRlc2NyaXB0b3IuRnVsbE5hbWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgV3JpdGVBbnkod3JpdGVyLCAoSU1lc3NhZ2UpdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFdyaXRlTWVzc2FnZSh3cml0ZXIsIChJTWVzc2FnZSl2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVUaW1lc3RhbXAoVGV4dFdyaXRlciB3cml0ZXIsIElNZXNzYWdlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBJbiB0aGUgY29tbW9uIGNhc2Ugd2hlcmUgdGhpcyAqaXMqIHVzaW5nIHRoZSBidWlsdC1pbiBUaW1lc3RhbXAgdHlwZSwgd2UgY291bGQKLSAgICAgICAgICAgIC8vIGF2b2lkIGFsbCB0aGUgcmVmbGVjdGlvbiBhdCB0aGlzIHBvaW50LCBieSBjYXN0aW5nIHRvIFRpbWVzdGFtcC4gSW4gdGhlIGludGVyZXN0cyBvZgotICAgICAgICAgICAgLy8gYXZvaWRpbmcgc3VidGxlIGJ1Z3MsIGRvbid0IGRvIHRoYXQgdW50aWwgd2UndmUgaW1wbGVtZW50ZWQgRHluYW1pY01lc3NhZ2Ugc28gdGhhdCB3ZSBjYW4gcHJvdmUKLSAgICAgICAgICAgIC8vIGl0IHN0aWxsIHdvcmtzIGluIHRoYXQgY2FzZS4KLSAgICAgICAgICAgIGludCBuYW5vcyA9IChpbnQpIHZhbHVlLkRlc2NyaXB0b3IuRmllbGRzW1RpbWVzdGFtcC5OYW5vc0ZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICBsb25nIHNlY29uZHMgPSAobG9uZykgdmFsdWUuRGVzY3JpcHRvci5GaWVsZHNbVGltZXN0YW1wLlNlY29uZHNGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUodmFsdWUpOwotICAgICAgICAgICAgd3JpdGVyLldyaXRlKFRpbWVzdGFtcC5Ub0pzb24oc2Vjb25kcywgbmFub3MsIERpYWdub3N0aWNPbmx5KSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVEdXJhdGlvbihUZXh0V3JpdGVyIHdyaXRlciwgSU1lc3NhZ2UgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIFRPRE86IFNhbWUgYXMgZm9yIFdyaXRlVGltZXN0YW1wCi0gICAgICAgICAgICBpbnQgbmFub3MgPSAoaW50KSB2YWx1ZS5EZXNjcmlwdG9yLkZpZWxkc1tEdXJhdGlvbi5OYW5vc0ZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICBsb25nIHNlY29uZHMgPSAobG9uZykgdmFsdWUuRGVzY3JpcHRvci5GaWVsZHNbRHVyYXRpb24uU2Vjb25kc0ZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoRHVyYXRpb24uVG9Kc29uKHNlY29uZHMsIG5hbm9zLCBEaWFnbm9zdGljT25seSkpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIFdyaXRlRmllbGRNYXNrKFRleHRXcml0ZXIgd3JpdGVyLCBJTWVzc2FnZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHBhdGhzID0gKElMaXN0PHN0cmluZz4pIHZhbHVlLkRlc2NyaXB0b3IuRmllbGRzW0ZpZWxkTWFzay5QYXRoc0ZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoRmllbGRNYXNrLlRvSnNvbihwYXRocywgRGlhZ25vc3RpY09ubHkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZUFueShUZXh0V3JpdGVyIHdyaXRlciwgSU1lc3NhZ2UgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChEaWFnbm9zdGljT25seSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZURpYWdub3N0aWNPbmx5QW55KHdyaXRlciwgdmFsdWUpOwotICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgc3RyaW5nIHR5cGVVcmwgPSAoc3RyaW5nKSB2YWx1ZS5EZXNjcmlwdG9yLkZpZWxkc1tBbnkuVHlwZVVybEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGEgPSAoQnl0ZVN0cmluZykgdmFsdWUuRGVzY3JpcHRvci5GaWVsZHNbQW55LlZhbHVlRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIHN0cmluZyB0eXBlTmFtZSA9IEFueS5HZXRUeXBlTmFtZSh0eXBlVXJsKTsKLSAgICAgICAgICAgIE1lc3NhZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBzZXR0aW5ncy5UeXBlUmVnaXN0cnkuRmluZCh0eXBlTmFtZSk7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCQiVHlwZSByZWdpc3RyeSBoYXMgbm8gZGVzY3JpcHRvciBmb3IgdHlwZSBuYW1lICd7dHlwZU5hbWV9JyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IGRlc2NyaXB0b3IuUGFyc2VyLlBhcnNlRnJvbShkYXRhKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgieyAiKTsKLSAgICAgICAgICAgIFdyaXRlU3RyaW5nKHdyaXRlciwgQW55VHlwZVVybEZpZWxkKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShOYW1lVmFsdWVTZXBhcmF0b3IpOwotICAgICAgICAgICAgV3JpdGVTdHJpbmcod3JpdGVyLCB0eXBlVXJsKTsKLQotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IuSXNXZWxsS25vd25UeXBlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShQcm9wZXJ0eVNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgV3JpdGVTdHJpbmcod3JpdGVyLCBBbnlXZWxsS25vd25UeXBlVmFsdWVGaWVsZCk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKE5hbWVWYWx1ZVNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgV3JpdGVXZWxsS25vd25UeXBlVmFsdWUod3JpdGVyLCBkZXNjcmlwdG9yLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBXcml0ZU1lc3NhZ2VGaWVsZHMod3JpdGVyLCBtZXNzYWdlLCB0cnVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiIH0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZURpYWdub3N0aWNPbmx5QW55KFRleHRXcml0ZXIgd3JpdGVyLCBJTWVzc2FnZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgc3RyaW5nIHR5cGVVcmwgPSAoc3RyaW5nKSB2YWx1ZS5EZXNjcmlwdG9yLkZpZWxkc1tBbnkuVHlwZVVybEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5HZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgICAgICAgICBCeXRlU3RyaW5nIGRhdGEgPSAoQnl0ZVN0cmluZykgdmFsdWUuRGVzY3JpcHRvci5GaWVsZHNbQW55LlZhbHVlRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKHZhbHVlKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgieyAiKTsKLSAgICAgICAgICAgIFdyaXRlU3RyaW5nKHdyaXRlciwgQW55VHlwZVVybEZpZWxkKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShOYW1lVmFsdWVTZXBhcmF0b3IpOwotICAgICAgICAgICAgV3JpdGVTdHJpbmcod3JpdGVyLCB0eXBlVXJsKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShQcm9wZXJ0eVNlcGFyYXRvcik7Ci0gICAgICAgICAgICBXcml0ZVN0cmluZyh3cml0ZXIsIEFueURpYWdub3N0aWNWYWx1ZUZpZWxkKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShOYW1lVmFsdWVTZXBhcmF0b3IpOwotICAgICAgICAgICAgd3JpdGVyLldyaXRlKCciJyk7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoZGF0YS5Ub0Jhc2U2NCgpKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgnIicpOwotICAgICAgICAgICAgd3JpdGVyLldyaXRlKCIgfSIpOwotICAgICAgICB9ICAgICAgICAKLQotICAgICAgICBwcml2YXRlIHZvaWQgV3JpdGVTdHJ1Y3QoVGV4dFdyaXRlciB3cml0ZXIsIElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgieyAiKTsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGZpZWxkcyA9IChJRGljdGlvbmFyeSkgbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkc1tTdHJ1Y3QuRmllbGRzRmllbGROdW1iZXJdLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpOwotICAgICAgICAgICAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gICAgICAgICAgICBmb3JlYWNoIChEaWN0aW9uYXJ5RW50cnkgZW50cnkgaW4gZmllbGRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHN0cmluZyBrZXkgPSAoc3RyaW5nKSBlbnRyeS5LZXk7Ci0gICAgICAgICAgICAgICAgSU1lc3NhZ2UgdmFsdWUgPSAoSU1lc3NhZ2UpIGVudHJ5LlZhbHVlOwotICAgICAgICAgICAgICAgIGlmIChzdHJpbmcuSXNOdWxsT3JFbXB0eShrZXkpIHx8IHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiU3RydWN0IGZpZWxkcyBjYW5ub3QgaGF2ZSBhbiBlbXB0eSBrZXkgb3IgYSBudWxsIHZhbHVlLiIpOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoUHJvcGVydHlTZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBXcml0ZVN0cmluZyh3cml0ZXIsIGtleSk7Ci0gICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKE5hbWVWYWx1ZVNlcGFyYXRvcik7Ci0gICAgICAgICAgICAgICAgV3JpdGVTdHJ1Y3RGaWVsZFZhbHVlKHdyaXRlciwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoZmlyc3QgPyAifSIgOiAiIH0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBXcml0ZVN0cnVjdEZpZWxkVmFsdWUoVGV4dFdyaXRlciB3cml0ZXIsIElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBzcGVjaWZpZWRGaWVsZCA9IG1lc3NhZ2UuRGVzY3JpcHRvci5PbmVvZnNbMF0uQWNjZXNzb3IuR2V0Q2FzZUZpZWxkRGVzY3JpcHRvcihtZXNzYWdlKTsKLSAgICAgICAgICAgIGlmIChzcGVjaWZpZWRGaWVsZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJWYWx1ZSBtZXNzYWdlIG11c3QgY29udGFpbiBhIHZhbHVlIGZvciB0aGUgb25lb2YuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9IHNwZWNpZmllZEZpZWxkLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBzd2l0Y2ggKHNwZWNpZmllZEZpZWxkLkZpZWxkTnVtYmVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNhc2UgVmFsdWUuQm9vbFZhbHVlRmllbGROdW1iZXI6Ci0gICAgICAgICAgICAgICAgY2FzZSBWYWx1ZS5TdHJpbmdWYWx1ZUZpZWxkTnVtYmVyOgotICAgICAgICAgICAgICAgIGNhc2UgVmFsdWUuTnVtYmVyVmFsdWVGaWVsZE51bWJlcjoKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVWYWx1ZSh3cml0ZXIsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgVmFsdWUuU3RydWN0VmFsdWVGaWVsZE51bWJlcjoKLSAgICAgICAgICAgICAgICBjYXNlIFZhbHVlLkxpc3RWYWx1ZUZpZWxkTnVtYmVyOgotICAgICAgICAgICAgICAgICAgICAvLyBTdHJ1Y3RzIGFuZCBMaXN0VmFsdWVzIGFyZSBuZXN0ZWQgbWVzc2FnZXMsIGFuZCBhbHJlYWR5IHdlbGwta25vd24gdHlwZXMuCi0gICAgICAgICAgICAgICAgICAgIHZhciBuZXN0ZWRNZXNzYWdlID0gKElNZXNzYWdlKSBzcGVjaWZpZWRGaWVsZC5BY2Nlc3Nvci5HZXRWYWx1ZShtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVXZWxsS25vd25UeXBlVmFsdWUod3JpdGVyLCBuZXN0ZWRNZXNzYWdlLkRlc2NyaXB0b3IsIG5lc3RlZE1lc3NhZ2UpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBWYWx1ZS5OdWxsVmFsdWVGaWVsZE51bWJlcjoKLSAgICAgICAgICAgICAgICAgICAgV3JpdGVOdWxsKHdyaXRlcik7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5leHBlY3RlZCBjYXNlIGluIHN0cnVjdCBmaWVsZDogIiArIHNwZWNpZmllZEZpZWxkLkZpZWxkTnVtYmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVMaXN0KFRleHRXcml0ZXIgd3JpdGVyLCBJTGlzdCBsaXN0KQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoIlsgIik7Ci0gICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciB2YWx1ZSBpbiBsaXN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoUHJvcGVydHlTZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBXcml0ZVZhbHVlKHdyaXRlciwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoZmlyc3QgPyAiXSIgOiAiIF0iKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHZvaWQgV3JpdGVEaWN0aW9uYXJ5KFRleHRXcml0ZXIgd3JpdGVyLCBJRGljdGlvbmFyeSBkaWN0aW9uYXJ5KQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoInsgIik7Ci0gICAgICAgICAgICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBib3ggZWFjaCBwYWlyLiBDb3VsZCB1c2UgSURpY3Rpb25hcnlFbnVtZXJhdG9yLCBidXQgdGhhdCdzIHVnbHkgaW4gdGVybXMgb2YgZGlzcG9zYWwuCi0gICAgICAgICAgICBmb3JlYWNoIChEaWN0aW9uYXJ5RW50cnkgcGFpciBpbiBkaWN0aW9uYXJ5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghZmlyc3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoUHJvcGVydHlTZXBhcmF0b3IpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzdHJpbmcga2V5VGV4dDsKLSAgICAgICAgICAgICAgICBpZiAocGFpci5LZXkgaXMgc3RyaW5nKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga2V5VGV4dCA9IChzdHJpbmcpIHBhaXIuS2V5OwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChwYWlyLktleSBpcyBib29sKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAga2V5VGV4dCA9IChib29sKSBwYWlyLktleSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKHBhaXIuS2V5IGlzIGludCB8fCBwYWlyLktleSBpcyB1aW50IHwgcGFpci5LZXkgaXMgbG9uZyB8fCBwYWlyLktleSBpcyB1bG9uZykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGtleVRleHQgPSAoKElGb3JtYXR0YWJsZSkgcGFpci5LZXkpLlRvU3RyaW5nKCJkIiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChwYWlyLktleSA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkRpY3Rpb25hcnkgaGFzIGVudHJ5IHdpdGggbnVsbCBrZXkiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIlVuaGFuZGxlZCBkaWN0aW9uYXJ5IGtleSB0eXBlOiAiICsgcGFpci5LZXkuR2V0VHlwZSgpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgV3JpdGVTdHJpbmcod3JpdGVyLCBrZXlUZXh0KTsKLSAgICAgICAgICAgICAgICB3cml0ZXIuV3JpdGUoTmFtZVZhbHVlU2VwYXJhdG9yKTsKLSAgICAgICAgICAgICAgICBXcml0ZVZhbHVlKHdyaXRlciwgcGFpci5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShmaXJzdCA/ICJ9IiA6ICIgfSIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB3aGV0aGVyIG9yIG5vdCBhIHNpbmd1bGFyIHZhbHVlIGNhbiBiZSByZXByZXNlbnRlZCBpbiBKU09OLgotICAgICAgICAvLy8gQ3VycmVudGx5IG9ubHkgcmVsZXZhbnQgZm9yIGVudW1zLCB3aGVyZSB1bmtub3duIHZhbHVlcyBjYW4ndCBiZSByZXByZXNlbnRlZC4KLSAgICAgICAgLy8vIEZvciByZXBlYXRlZC9tYXAgZmllbGRzLCB0aGlzIGFsd2F5cyByZXR1cm5zIHRydWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgYm9vbCBDYW5Xcml0ZVNpbmdsZVZhbHVlKG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlIGlzIFN5c3RlbS5FbnVtKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBTeXN0ZW0uRW51bS5Jc0RlZmluZWQodmFsdWUuR2V0VHlwZSgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdyaXRlcyBhIHN0cmluZyAoaW5jbHVkaW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIGRvdWJsZSBxdW90ZXMpIHRvIGEgYnVpbGRlciwgZXNjYXBpbmcgYXMgcmVxdWlyZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIE90aGVyIHRoYW4gc3Vycm9nYXRlIHBhaXIgaGFuZGxpbmcsIHRoaXMgY29kZSBpcyBtb3N0bHkgdGFrZW4gZnJvbSBzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5jYy4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHZvaWQgV3JpdGVTdHJpbmcoVGV4dFdyaXRlciB3cml0ZXIsIHN0cmluZyB0ZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoJyInKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjaGFyIGMgPSB0ZXh0W2ldOwotICAgICAgICAgICAgICAgIGlmIChjIDwgMHhhMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZShDb21tb25SZXByZXNlbnRhdGlvbnNbY10pOwotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKGNoYXIuSXNIaWdoU3Vycm9nYXRlKGMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gRW5jb3VudGVyZWQgZmlyc3QgcGFydCBvZiBhIHN1cnJvZ2F0ZSBwYWlyLgotICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayB0aGF0IHdlIGhhdmUgdGhlIHdob2xlIHBhaXIsIGFuZCBlbmNvZGUgYm90aCBwYXJ0cyBhcyBoZXguCi0gICAgICAgICAgICAgICAgICAgIGkrKzsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGkgPT0gdGV4dC5MZW5ndGggfHwgIWNoYXIuSXNMb3dTdXJyb2dhdGUodGV4dFtpXSkpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiU3RyaW5nIGNvbnRhaW5zIGxvdyBzdXJyb2dhdGUgbm90IGZvbGxvd2VkIGJ5IGhpZ2ggc3Vycm9nYXRlIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgSGV4RW5jb2RlVXRmMTZDb2RlVW5pdCh3cml0ZXIsIGMpOwotICAgICAgICAgICAgICAgICAgICBIZXhFbmNvZGVVdGYxNkNvZGVVbml0KHdyaXRlciwgdGV4dFtpXSk7Ci0gICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChjaGFyLklzTG93U3Vycm9nYXRlKGMpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJTdHJpbmcgY29udGFpbnMgaGlnaCBzdXJyb2dhdGUgbm90IHByZWNlZGVkIGJ5IGxvdyBzdXJyb2dhdGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3dpdGNoICgodWludCkgYykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRoZXNlIGFyZSBub3QgcmVxdWlyZWQgYnkganNvbiBzcGVjCi0gICAgICAgICAgICAgICAgICAgIC8vIGJ1dCB1c2VkIHRvIHByZXZlbnQgc2VjdXJpdHkgYnVncyBpbiBqYXZhc2NyaXB0LgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ZmVmZjogIC8vIFplcm8gd2lkdGggbm8tYnJlYWsgc3BhY2UKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweGZmZjk6ICAvLyBJbnRlcmxpbmVhciBhbm5vdGF0aW9uIGFuY2hvcgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4ZmZmYTogIC8vIEludGVybGluZWFyIGFubm90YXRpb24gc2VwYXJhdG9yCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHhmZmZiOiAgLy8gSW50ZXJsaW5lYXIgYW5ub3RhdGlvbiB0ZXJtaW5hdG9yCi0KLSAgICAgICAgICAgICAgICAgICAgY2FzZSAweDAwYWQ6ICAvLyBTb2Z0LWh5cGhlbgotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDZkZDogIC8vIEFyYWJpYyBlbmQgb2YgYXlhaAotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MDcwZjogIC8vIFN5cmlhYyBhYmJyZXZpYXRpb24gbWFyawotICAgICAgICAgICAgICAgICAgICBjYXNlIDB4MTdiNDogIC8vIEtobWVyIHZvd2VsIGluaGVyZW50IEFxCi0gICAgICAgICAgICAgICAgICAgIGNhc2UgMHgxN2I1OiAgLy8gS2htZXIgdm93ZWwgaW5oZXJlbnQgQWEKLSAgICAgICAgICAgICAgICAgICAgICAgIEhleEVuY29kZVV0ZjE2Q29kZVVuaXQod3JpdGVyLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoKGMgPj0gMHgwNjAwICYmIGMgPD0gMHgwNjAzKSB8fCAgLy8gQXJhYmljIHNpZ25zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gMHgyMDBiICYmIGMgPD0gMHgyMDBmKSB8fCAgLy8gWmVybyB3aWR0aCBldGMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gMHgyMDI4ICYmIGMgPD0gMHgyMDJlKSB8fCAgLy8gU2VwYXJhdG9ycyBldGMuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKGMgPj0gMHgyMDYwICYmIGMgPD0gMHgyMDY0KSB8fCAgLy8gSW52aXNpYmxlIGV0Yy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA+PSAweDIwNmEgJiYgYyA8PSAweDIwNmYpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhleEVuY29kZVV0ZjE2Q29kZVVuaXQod3JpdGVyLCBjKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBObyBoYW5kbGluZyBvZiBzdXJyb2dhdGVzIGhlcmUgLSB0aGF0J3MgZG9uZSBlYXJsaWVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgd3JpdGVyLldyaXRlKGMpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgd3JpdGVyLldyaXRlKCciJyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBIZXggPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgSGV4RW5jb2RlVXRmMTZDb2RlVW5pdChUZXh0V3JpdGVyIHdyaXRlciwgY2hhciBjKQotICAgICAgICB7Ci0gICAgICAgICAgICB3cml0ZXIuV3JpdGUoIlxcdSIpOwotICAgICAgICAgICAgd3JpdGVyLldyaXRlKEhleFsoYyA+PiAxMikgJiAweGZdKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShIZXhbKGMgPj4gOCkgJiAweGZdKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShIZXhbKGMgPj4gNCkgJiAweGZdKTsKLSAgICAgICAgICAgIHdyaXRlci5Xcml0ZShIZXhbKGMgPj4gMCkgJiAweGZdKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFNldHRpbmdzIGNvbnRyb2xsaW5nIEpTT04gZm9ybWF0dGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHNlYWxlZCBjbGFzcyBTZXR0aW5ncwotICAgICAgICB7Ci0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gRGVmYXVsdCBzZXR0aW5ncywgYXMgdXNlZCBieSA8c2VlIGNyZWY9Ikpzb25Gb3JtYXR0ZXIuRGVmYXVsdCIvPgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHB1YmxpYyBzdGF0aWMgU2V0dGluZ3MgRGVmYXVsdCB7IGdldDsgfQotCi0gICAgICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciB0aGUgTW9ubyBjb21waWxlciBjb21wbGFpbmluZyBhYm91dCBYTUwgY29tbWVudHMgbm90IGJlaW5nIG9uCi0gICAgICAgICAgICAvLyB2YWxpZCBsYW5ndWFnZSBlbGVtZW50cy4KLSAgICAgICAgICAgIHN0YXRpYyBTZXR0aW5ncygpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRGVmYXVsdCA9IG5ldyBTZXR0aW5ncyhmYWxzZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBXaGV0aGVyIGZpZWxkcyB3aG9zZSB2YWx1ZXMgYXJlIHRoZSBkZWZhdWx0IGZvciB0aGUgZmllbGQgdHlwZSAoZS5nLiAwIGZvciBpbnRlZ2VycykKLSAgICAgICAgICAgIC8vLyBzaG91bGQgYmUgZm9ybWF0dGVkICh0cnVlKSBvciBvbWl0dGVkIChmYWxzZSkuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgcHVibGljIGJvb2wgRm9ybWF0RGVmYXVsdFZhbHVlcyB7IGdldDsgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gVGhlIHR5cGUgcmVnaXN0cnkgdXNlZCB0byBmb3JtYXQgPHNlZSBjcmVmPSJBbnkiLz4gbWVzc2FnZXMuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgcHVibGljIFR5cGVSZWdpc3RyeSBUeXBlUmVnaXN0cnkgeyBnZXQ7IH0KLQotICAgICAgICAgICAgLy8gVE9ETzogV29yayBvdXQgaG93IHdlJ3JlIGdvaW5nIHRvIHNjYWxlIHRoaXMgdG8gbXVsdGlwbGUgc2V0dGluZ3MuICJXaXRoWHl6IiBtZXRob2RzPwotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyA8c2VlIGNyZWY9IlNldHRpbmdzIi8+IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0dGluZyBvZiBkZWZhdWx0IHZhbHVlcwotICAgICAgICAgICAgLy8vIGFuZCBhbiBlbXB0eSB0eXBlIHJlZ2lzdHJ5LgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybWF0RGVmYXVsdFZhbHVlcyI+PGM+dHJ1ZTwvYz4gaWYgZGVmYXVsdCB2YWx1ZXMgKDAsIGVtcHR5IHN0cmluZ3MgZXRjKSBzaG91bGQgYmUgZm9ybWF0dGVkOyA8Yz5mYWxzZTwvYz4gb3RoZXJ3aXNlLjwvcGFyYW0+Ci0gICAgICAgICAgICBwdWJsaWMgU2V0dGluZ3MoYm9vbCBmb3JtYXREZWZhdWx0VmFsdWVzKSA6IHRoaXMoZm9ybWF0RGVmYXVsdFZhbHVlcywgVHlwZVJlZ2lzdHJ5LkVtcHR5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyA8c2VlIGNyZWY9IlNldHRpbmdzIi8+IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgZm9ybWF0dGluZyBvZiBkZWZhdWx0IHZhbHVlcwotICAgICAgICAgICAgLy8vIGFuZCB0eXBlIHJlZ2lzdHJ5LgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZm9ybWF0RGVmYXVsdFZhbHVlcyI+PGM+dHJ1ZTwvYz4gaWYgZGVmYXVsdCB2YWx1ZXMgKDAsIGVtcHR5IHN0cmluZ3MgZXRjKSBzaG91bGQgYmUgZm9ybWF0dGVkOyA8Yz5mYWxzZTwvYz4gb3RoZXJ3aXNlLjwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGVSZWdpc3RyeSI+VGhlIDxzZWUgY3JlZj0iVHlwZVJlZ2lzdHJ5Ii8+IHRvIHVzZSB3aGVuIGZvcm1hdHRpbmcgPHNlZSBjcmVmPSJBbnkiLz4gbWVzc2FnZXMuPC9wYXJhbT4KLSAgICAgICAgICAgIHB1YmxpYyBTZXR0aW5ncyhib29sIGZvcm1hdERlZmF1bHRWYWx1ZXMsIFR5cGVSZWdpc3RyeSB0eXBlUmVnaXN0cnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgRm9ybWF0RGVmYXVsdFZhbHVlcyA9IGZvcm1hdERlZmF1bHRWYWx1ZXM7Ci0gICAgICAgICAgICAgICAgVHlwZVJlZ2lzdHJ5ID0gUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh0eXBlUmVnaXN0cnksIG5hbWVvZih0eXBlUmVnaXN0cnkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vIEVmZmVjdGl2ZWx5IGEgY2FjaGUgb2YgbWFwcGluZyBmcm9tIGVudW0gdmFsdWVzIHRvIHRoZSBvcmlnaW5hbCBuYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgcHJvdG8gZmlsZSwKLSAgICAgICAgLy8gZmV0Y2hlZCBieSByZWZsZWN0aW9uLgotICAgICAgICAvLyBUaGUgbmVlZCBmb3IgdGhpcyBpcyB1bmZvcnR1bmF0ZSwgYXMgaXMgaXRzIHVuYm91bmRlZCBzaXplLCBidXQgcmVhbGlzdGljYWxseSBpdCBzaG91bGRuJ3QgY2F1c2UgaXNzdWVzLgotICAgICAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBPcmlnaW5hbEVudW1WYWx1ZUhlbHBlcgotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBUT0RPOiBJbiB0aGUgZnV0dXJlIHdlIG1pZ2h0IHdhbnQgdG8gdXNlIENvbmN1cnJlbnREaWN0aW9uYXJ5LCBhdCB0aGUgcG9pbnQgd2hlcmUgYWxsCi0gICAgICAgICAgICAvLyB0aGUgcGxhdGZvcm1zIHdlIHRhcmdldCBoYXZlIGl0LgotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRGljdGlvbmFyeTxTeXN0ZW0uVHlwZSwgRGljdGlvbmFyeTxvYmplY3QsIHN0cmluZz4+IGRpY3Rpb25hcmllcwotICAgICAgICAgICAgICAgID0gbmV3IERpY3Rpb25hcnk8U3lzdGVtLlR5cGUsIERpY3Rpb25hcnk8b2JqZWN0LCBzdHJpbmc+PigpOwotICAgICAgICAgICAgCi0gICAgICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIEdldE9yaWdpbmFsTmFtZShvYmplY3QgdmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGVudW1UeXBlID0gdmFsdWUuR2V0VHlwZSgpOwotICAgICAgICAgICAgICAgIERpY3Rpb25hcnk8b2JqZWN0LCBzdHJpbmc+IG5hbWVNYXBwaW5nOwotICAgICAgICAgICAgICAgIGxvY2sgKGRpY3Rpb25hcmllcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghZGljdGlvbmFyaWVzLlRyeUdldFZhbHVlKGVudW1UeXBlLCBvdXQgbmFtZU1hcHBpbmcpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lTWFwcGluZyA9IEdldE5hbWVNYXBwaW5nKGVudW1UeXBlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRpY3Rpb25hcmllc1tlbnVtVHlwZV0gPSBuYW1lTWFwcGluZzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIHN0cmluZyBvcmlnaW5hbE5hbWU7Ci0gICAgICAgICAgICAgICAgLy8gSWYgdGhpcyByZXR1cm5zIGZhbHNlLCBvcmlnaW5hbE5hbWUgd2lsbCBiZSBudWxsLCB3aGljaCBpcyB3aGF0IHdlIHdhbnQuCi0gICAgICAgICAgICAgICAgbmFtZU1hcHBpbmcuVHJ5R2V0VmFsdWUodmFsdWUsIG91dCBvcmlnaW5hbE5hbWUpOwotICAgICAgICAgICAgICAgIHJldHVybiBvcmlnaW5hbE5hbWU7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgc3RhdGljIERpY3Rpb25hcnk8b2JqZWN0LCBzdHJpbmc+IEdldE5hbWVNYXBwaW5nKFN5c3RlbS5UeXBlIGVudW1UeXBlKSA9PgotICAgICAgICAgICAgICAgIGVudW1UeXBlLkdldFR5cGVJbmZvKCkuRGVjbGFyZWRGaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgLldoZXJlKGYgPT4gZi5Jc1N0YXRpYykKLSAgICAgICAgICAgICAgICAgICAgLlRvRGljdGlvbmFyeShmID0+IGYuR2V0VmFsdWUobnVsbCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZiA9PiBmLkdldEN1c3RvbUF0dHJpYnV0ZXM8T3JpZ2luYWxOYW1lQXR0cmlidXRlPigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLkZpcnN0T3JEZWZhdWx0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBJZiB0aGUgYXR0cmlidXRlIGhhc24ndCBiZWVuIGFwcGxpZWQsIGZhbGwgYmFjayB0byB0aGUgbmFtZSBvZiB0aGUgZmllbGQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPy5OYW1lID8/IGYuTmFtZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Kc29uUGFyc2VyLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvSnNvblBhcnNlci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDczOGViYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Kc29uUGFyc2VyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTAxOCArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlczsKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uVGV4dDsKLXVzaW5nIFN5c3RlbS5UZXh0LlJlZ3VsYXJFeHByZXNzaW9uczsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVmbGVjdGlvbi1iYXNlZCBjb252ZXJ0ZXIgZnJvbSBKU09OIHRvIG1lc3NhZ2VzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyA8cGFyYT4KLSAgICAvLy8gSW5zdGFuY2VzIG9mIHRoaXMgY2xhc3MgYXJlIHRocmVhZC1zYWZlLCB3aXRoIG5vIG11dGFibGUgc3RhdGUuCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPHBhcmE+Ci0gICAgLy8vIFRoaXMgaXMgYSBzaW1wbGUgc3RhcnQgdG8gZ2V0IEpTT04gcGFyc2luZyB3b3JraW5nLiBBcyBpdCdzIHJlZmxlY3Rpb24tYmFzZWQsCi0gICAgLy8vIGl0J3Mgbm90IGFzIHF1aWNrIGFzIGJha2luZyBjYWxscyBpbnRvIGdlbmVyYXRlZCBtZXNzYWdlcyAtIGJ1dCBpcyBhIHNpbXBsZXIgaW1wbGVtZW50YXRpb24uCi0gICAgLy8vIChUaGlzIGNvZGUgaXMgZ2VuZXJhbGx5IG5vdCBoZWF2aWx5IG9wdGltaXplZC4pCi0gICAgLy8vIDwvcGFyYT4KLSAgICAvLy8gPC9yZW1hcmtzPgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgSnNvblBhcnNlcgotICAgIHsKLSAgICAgICAgLy8gTm90ZTogdXNpbmcgMC05IGluc3RlYWQgb2YgXGQgdG8gZW5zdXJlIG5vIG5vbi1BU0NJSSBkaWdpdHMuCi0gICAgICAgIC8vIFRoaXMgcmVnZXggaXNuJ3QgYSBjb21wbGV0ZSB2YWxpZGF0b3IsIGJ1dCB3aWxsIHJlbW92ZSAqbW9zdCogaW52YWxpZCBpbnB1dC4gV2UgcmVseSBvbiBwYXJzaW5nIHRvIGRvIHRoZSByZXN0LgotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZWdleCBUaW1lc3RhbXBSZWdleCA9IG5ldyBSZWdleChAIl4oPzxkYXRldGltZT5bMC05XXs0fS1bMDFdWzAtOV0tWzAtM11bMC05XVRbMDEyXVswLTldOlswLTVdWzAtOV06WzAtNV1bMC05XSkoPzxzdWJzZWNvbmRzPlwuWzAtOV17MSw5fSk/KD88b2Zmc2V0PihafFsrLV1bMC0xXVswLTldOlswLTVdWzAtOV0pKSQiLCBGcmFtZXdvcmtQb3J0YWJpbGl0eS5Db21waWxlZFJlZ2V4V2hlcmVBdmFpbGFibGUpOwotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZWdleCBEdXJhdGlvblJlZ2V4ID0gbmV3IFJlZ2V4KEAiXig/PHNpZ24+LSk/KD88aW50PlswLTldezEsMTJ9KSg/PHN1YnNlY29uZHM+XC5bMC05XXsxLDl9KT9zJCIsIEZyYW1ld29ya1BvcnRhYmlsaXR5LkNvbXBpbGVkUmVnZXhXaGVyZUF2YWlsYWJsZSk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IGludFtdIFN1YnNlY29uZFNjYWxpbmdGYWN0b3JzID0geyAwLCAxMDAwMDAwMDAsIDEwMDAwMDAwMCwgMTAwMDAwMDAsIDEwMDAwMDAsIDEwMDAwMCwgMTAwMDAsIDEwMDAsIDEwMCwgMTAsIDEgfTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgY2hhcltdIEZpZWxkTWFza1BhdGhTZXBhcmF0b3JzID0gbmV3W10geyAnLCcgfTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBKc29uUGFyc2VyIGRlZmF1bHRJbnN0YW5jZSA9IG5ldyBKc29uUGFyc2VyKFNldHRpbmdzLkRlZmF1bHQpOwotCi0gICAgICAgIC8vIFRPRE86IENvbnNpZGVyIGludHJvZHVjaW5nIGEgY2xhc3MgY29udGFpbmluZyBwYXJzZSBzdGF0ZSBvZiB0aGUgcGFyc2VyLCB0b2tlbml6ZXIgYW5kIGRlcHRoLiBUaGF0IHdvdWxkIHNpbXBsaWZ5IHRoZXNlIGhhbmRsZXJzCi0gICAgICAgIC8vIGFuZCB0aGUgc2lnbmF0dXJlcyBvZiB2YXJpb3VzIG1ldGhvZHMuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBBY3Rpb248SnNvblBhcnNlciwgSU1lc3NhZ2UsIEpzb25Ub2tlbml6ZXI+PgotICAgICAgICAgICAgV2VsbEtub3duVHlwZUhhbmRsZXJzID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBBY3Rpb248SnNvblBhcnNlciwgSU1lc3NhZ2UsIEpzb25Ub2tlbml6ZXI+PgotICAgICAgICB7Ci0gICAgICAgICAgICB7IFRpbWVzdGFtcC5EZXNjcmlwdG9yLkZ1bGxOYW1lLCAocGFyc2VyLCBtZXNzYWdlLCB0b2tlbml6ZXIpID0+IE1lcmdlVGltZXN0YW1wKG1lc3NhZ2UsIHRva2VuaXplci5OZXh0KCkpIH0sCi0gICAgICAgICAgICB7IER1cmF0aW9uLkRlc2NyaXB0b3IuRnVsbE5hbWUsIChwYXJzZXIsIG1lc3NhZ2UsIHRva2VuaXplcikgPT4gTWVyZ2VEdXJhdGlvbihtZXNzYWdlLCB0b2tlbml6ZXIuTmV4dCgpKSB9LAotICAgICAgICAgICAgeyBWYWx1ZS5EZXNjcmlwdG9yLkZ1bGxOYW1lLCAocGFyc2VyLCBtZXNzYWdlLCB0b2tlbml6ZXIpID0+IHBhcnNlci5NZXJnZVN0cnVjdFZhbHVlKG1lc3NhZ2UsIHRva2VuaXplcikgfSwKLSAgICAgICAgICAgIHsgTGlzdFZhbHVlLkRlc2NyaXB0b3IuRnVsbE5hbWUsIChwYXJzZXIsIG1lc3NhZ2UsIHRva2VuaXplcikgPT4KLSAgICAgICAgICAgICAgICBwYXJzZXIuTWVyZ2VSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHNbTGlzdFZhbHVlLlZhbHVlc0ZpZWxkTnVtYmVyXSwgdG9rZW5pemVyKSB9LAotICAgICAgICAgICAgeyBTdHJ1Y3QuRGVzY3JpcHRvci5GdWxsTmFtZSwgKHBhcnNlciwgbWVzc2FnZSwgdG9rZW5pemVyKSA9PiBwYXJzZXIuTWVyZ2VTdHJ1Y3QobWVzc2FnZSwgdG9rZW5pemVyKSB9LAotICAgICAgICAgICAgeyBBbnkuRGVzY3JpcHRvci5GdWxsTmFtZSwgKHBhcnNlciwgbWVzc2FnZSwgdG9rZW5pemVyKSA9PiBwYXJzZXIuTWVyZ2VBbnkobWVzc2FnZSwgdG9rZW5pemVyKSB9LAotICAgICAgICAgICAgeyBGaWVsZE1hc2suRGVzY3JpcHRvci5GdWxsTmFtZSwgKHBhcnNlciwgbWVzc2FnZSwgdG9rZW5pemVyKSA9PiBNZXJnZUZpZWxkTWFzayhtZXNzYWdlLCB0b2tlbml6ZXIuTmV4dCgpKSB9LAotICAgICAgICAgICAgeyBJbnQzMlZhbHVlLkRlc2NyaXB0b3IuRnVsbE5hbWUsIE1lcmdlV3JhcHBlckZpZWxkIH0sCi0gICAgICAgICAgICB7IEludDY0VmFsdWUuRGVzY3JpcHRvci5GdWxsTmFtZSwgTWVyZ2VXcmFwcGVyRmllbGQgfSwKLSAgICAgICAgICAgIHsgVUludDMyVmFsdWUuRGVzY3JpcHRvci5GdWxsTmFtZSwgTWVyZ2VXcmFwcGVyRmllbGQgfSwKLSAgICAgICAgICAgIHsgVUludDY0VmFsdWUuRGVzY3JpcHRvci5GdWxsTmFtZSwgTWVyZ2VXcmFwcGVyRmllbGQgfSwKLSAgICAgICAgICAgIHsgRmxvYXRWYWx1ZS5EZXNjcmlwdG9yLkZ1bGxOYW1lLCBNZXJnZVdyYXBwZXJGaWVsZCB9LAotICAgICAgICAgICAgeyBEb3VibGVWYWx1ZS5EZXNjcmlwdG9yLkZ1bGxOYW1lLCBNZXJnZVdyYXBwZXJGaWVsZCB9LAotICAgICAgICAgICAgeyBCeXRlc1ZhbHVlLkRlc2NyaXB0b3IuRnVsbE5hbWUsIE1lcmdlV3JhcHBlckZpZWxkIH0sCi0gICAgICAgICAgICB7IFN0cmluZ1ZhbHVlLkRlc2NyaXB0b3IuRnVsbE5hbWUsIE1lcmdlV3JhcHBlckZpZWxkIH0KLSAgICAgICAgfTsKLQotICAgICAgICAvLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gYXZvaWQgaGF2aW5nIHRvIHJlcGVhdCB0aGUgc2FtZSBjb2RlIG11bHRpcGxlIHRpbWVzIGluIHRoZSBhYm92ZQotICAgICAgICAvLyBkaWN0aW9uYXJ5IGluaXRpYWxpemF0aW9uLgotICAgICAgICBwcml2YXRlIHN0YXRpYyB2b2lkIE1lcmdlV3JhcHBlckZpZWxkKEpzb25QYXJzZXIgcGFyc2VyLCBJTWVzc2FnZSBtZXNzYWdlLCBKc29uVG9rZW5pemVyIHRva2VuaXplcikKLSAgICAgICAgewotICAgICAgICAgICAgcGFyc2VyLk1lcmdlRmllbGQobWVzc2FnZSwgbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkc1tXcmFwcGVyc1JlZmxlY3Rpb24uV3JhcHBlclZhbHVlRmllbGROdW1iZXJdLCB0b2tlbml6ZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhIGZvcm1hdHRlciB1c2luZyB0aGUgZGVmYXVsdCBzZXR0aW5ncy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBKc29uUGFyc2VyIERlZmF1bHQgeyBnZXQgeyByZXR1cm4gZGVmYXVsdEluc3RhbmNlOyB9IH0KLQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IFNldHRpbmdzIHNldHRpbmdzOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgZm9ybWF0dGVkIHdpdGggdGhlIGdpdmVuIHNldHRpbmdzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNldHRpbmdzIj5UaGUgc2V0dGluZ3MuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIEpzb25QYXJzZXIoU2V0dGluZ3Mgc2V0dGluZ3MpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuc2V0dGluZ3MgPSBzZXR0aW5nczsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyA8cGFyYW1yZWYgbmFtZT0ianNvbiIvPiBhbmQgbWVyZ2VzIHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIG1lcmdlIHRoZSBKU09OIGluZm9ybWF0aW9uIGludG8uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJqc29uIj5UaGUgSlNPTiB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICBpbnRlcm5hbCB2b2lkIE1lcmdlKElNZXNzYWdlIG1lc3NhZ2UsIHN0cmluZyBqc29uKQotICAgICAgICB7Ci0gICAgICAgICAgICBNZXJnZShtZXNzYWdlLCBuZXcgU3RyaW5nUmVhZGVyKGpzb24pKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyBKU09OIHJlYWQgZnJvbSA8cGFyYW1yZWYgbmFtZT0ianNvblJlYWRlciIvPiBhbmQgbWVyZ2VzIHRoZSBpbmZvcm1hdGlvbiBpbnRvIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIG1lcmdlIHRoZSBKU09OIGluZm9ybWF0aW9uIGludG8uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJqc29uUmVhZGVyIj5SZWFkZXIgcHJvdmlkaW5nIHRoZSBKU09OIHRvIHBhcnNlLjwvcGFyYW0+Ci0gICAgICAgIGludGVybmFsIHZvaWQgTWVyZ2UoSU1lc3NhZ2UgbWVzc2FnZSwgVGV4dFJlYWRlciBqc29uUmVhZGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW5pemVyID0gSnNvblRva2VuaXplci5Gcm9tVGV4dFJlYWRlcihqc29uUmVhZGVyKTsKLSAgICAgICAgICAgIE1lcmdlKG1lc3NhZ2UsIHRva2VuaXplcik7Ci0gICAgICAgICAgICB2YXIgbGFzdFRva2VuID0gdG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgIGlmIChsYXN0VG9rZW4gIT0gSnNvblRva2VuLkVuZERvY3VtZW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkV4cGVjdGVkIGVuZCBvZiBKU09OIGFmdGVyIG9iamVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWVyZ2VzIHRoZSBnaXZlbiBtZXNzYWdlIHVzaW5nIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gdG9rZW5pemVyLiBJbiBtb3N0IGNhc2VzLCB0aGUgbmV4dAotICAgICAgICAvLy8gdG9rZW4gc2hvdWxkIGJlIGEgInN0YXJ0IG9iamVjdCIgdG9rZW4sIGJ1dCB3cmFwcGVyIHR5cGVzIGFuZCBudWxsaXR5IGNhbiBpbnZhbGlkYXRlCi0gICAgICAgIC8vLyB0aGF0IGFzc3VtcHRpb24uIFRoaXMgaXMgaW1wbGVtZW50ZWQgYXMgYW4gTEwoMSkgcmVjdXJzaXZlIGRlc2NlbnQgcGFyc2VyIG92ZXIgdGhlIHN0cmVhbQotICAgICAgICAvLy8gb2YgdG9rZW5zIHByb3ZpZGVkIGJ5IHRoZSB0b2tlbml6ZXIuIFRoaXMgdG9rZW4gc3RyZWFtIGlzIGFzc3VtZWQgdG8gYmUgdmFsaWQgSlNPTiwgd2l0aCB0aGUKLSAgICAgICAgLy8vIHRva2VuaXplciBwZXJmb3JtaW5nIHRoYXQgdmFsaWRhdGlvbiAtIGJ1dCBub3QgZXZlcnkgdG9rZW4gc3RyZWFtIGlzIHZhbGlkICJwcm90b2J1ZiBKU09OIi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSB2b2lkIE1lcmdlKElNZXNzYWdlIG1lc3NhZ2UsIEpzb25Ub2tlbml6ZXIgdG9rZW5pemVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG9rZW5pemVyLk9iamVjdERlcHRoID4gc2V0dGluZ3MuUmVjdXJzaW9uTGltaXQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLkpzb25SZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAobWVzc2FnZS5EZXNjcmlwdG9yLklzV2VsbEtub3duVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBY3Rpb248SnNvblBhcnNlciwgSU1lc3NhZ2UsIEpzb25Ub2tlbml6ZXI+IGhhbmRsZXI7Ci0gICAgICAgICAgICAgICAgaWYgKFdlbGxLbm93blR5cGVIYW5kbGVycy5UcnlHZXRWYWx1ZShtZXNzYWdlLkRlc2NyaXB0b3IuRnVsbE5hbWUsIG91dCBoYW5kbGVyKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGhhbmRsZXIodGhpcywgbWVzc2FnZSwgdG9rZW5pemVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAvLyBXZWxsLWtub3duIHR5cGVzIHdpdGggbm8gc3BlY2lhbCBoYW5kbGluZyBjb250aW51ZSBpbiB0aGUgbm9ybWFsIHdheS4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9rZW4uVHlwZSAhPSBKc29uVG9rZW4uVG9rZW5UeXBlLlN0YXJ0T2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkV4cGVjdGVkIGFuIG9iamVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkRlc2NyaXB0b3I7Ci0gICAgICAgICAgICB2YXIganNvbkZpZWxkTWFwID0gZGVzY3JpcHRvci5GaWVsZHMuQnlKc29uTmFtZSgpOwotICAgICAgICAgICAgLy8gQWxsIHRoZSBvbmVvZiBmaWVsZHMgd2UndmUgYWxyZWFkeSBhY2NvdW50ZWQgZm9yIC0gd2UgY2FuIG9ubHkgc2VlIGVhY2ggb2YgdGhlbSBvbmNlLgotICAgICAgICAgICAgLy8gVGhlIHNldCBpcyBjcmVhdGVkIGxhemlseSB0byBhdm9pZCB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgYSBzZXQgZm9yIGV2ZXJ5IG1lc3NhZ2UKLSAgICAgICAgICAgIC8vIHdlIHBhcnNlZCwgd2hlbiBvbmVvZnMgYXJlIHJlbGF0aXZlbHkgcmFyZS4KLSAgICAgICAgICAgIEhhc2hTZXQ8T25lb2ZEZXNjcmlwdG9yPiBzZWVuT25lb2ZzID0gbnVsbDsKLSAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRva2VuID0gdG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4uVHlwZSA9PSBKc29uVG9rZW4uVG9rZW5UeXBlLkVuZE9iamVjdCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgIT0gSnNvblRva2VuLlRva2VuVHlwZS5OYW1lKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlVuZXhwZWN0ZWQgdG9rZW4gdHlwZSAiICsgdG9rZW4uVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHN0cmluZyBuYW1lID0gdG9rZW4uU3RyaW5nVmFsdWU7Ci0gICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkOwotICAgICAgICAgICAgICAgIGlmIChqc29uRmllbGRNYXAuVHJ5R2V0VmFsdWUobmFtZSwgb3V0IGZpZWxkKSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Db250YWluaW5nT25lb2YgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHNlZW5PbmVvZnMgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWVuT25lb2ZzID0gbmV3IEhhc2hTZXQ8T25lb2ZEZXNjcmlwdG9yPigpOwotICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFzZWVuT25lb2ZzLkFkZChmaWVsZC5Db250YWluaW5nT25lb2YpKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oJCJNdWx0aXBsZSB2YWx1ZXMgc3BlY2lmaWVkIGZvciBvbmVvZiB7ZmllbGQuQ29udGFpbmluZ09uZW9mLk5hbWV9Iik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgTWVyZ2VGaWVsZChtZXNzYWdlLCBmaWVsZCwgdG9rZW5pemVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogSXMgdGhpcyB3aGF0IHdlIHdhbnQgdG8gZG8/IElmIG5vdCwgd2UnbGwgbmVlZCB0byBza2lwIHRoZSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgLy8gd2hpY2ggbWF5IGJlIGFuIG9iamVjdCBvciBhcnJheS4gKFdlIG1pZ2h0IHdhbnQgdG8gcHV0IGNvZGUgaW4gdGhlIHRva2VuaXplcgotICAgICAgICAgICAgICAgICAgICAvLyB0byBkbyB0aGF0LikKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiVW5rbm93biBmaWVsZDogIiArIG5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBNZXJnZUZpZWxkKElNZXNzYWdlIG1lc3NhZ2UsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgSnNvblRva2VuaXplciB0b2tlbml6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9rZW4uVHlwZSA9PSBKc29uVG9rZW4uVG9rZW5UeXBlLk51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gQ2xlYXIgdGhlIGZpZWxkIGlmIHdlIHNlZSBhIG51bGwgdG9rZW4sIHVubGVzcyBpdCdzIGZvciBhIHNpbmd1bGFyIGZpZWxkIG9mIHR5cGUKLSAgICAgICAgICAgICAgICAvLyBnb29nbGUucHJvdG9idWYuVmFsdWUuCi0gICAgICAgICAgICAgICAgLy8gTm90ZTogZGlmZmVyZW50IGZyb20gSmF2YSBBUEksIHdoaWNoIGp1c3QgaWdub3JlcyBpdC4KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBCcmluZyBpdCBtb3JlIGluIGxpbmU/IERpc2N1c3MuLi4KLSAgICAgICAgICAgICAgICBpZiAoZmllbGQuSXNNYXAgfHwgZmllbGQuSXNSZXBlYXRlZCB8fCAhSXNHb29nbGVQcm90b2J1ZlZhbHVlRmllbGQoZmllbGQpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmllbGQuQWNjZXNzb3IuQ2xlYXIobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0b2tlbml6ZXIuUHVzaEJhY2sodG9rZW4pOwotCi0gICAgICAgICAgICBpZiAoZmllbGQuSXNNYXApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWVyZ2VNYXBGaWVsZChtZXNzYWdlLCBmaWVsZCwgdG9rZW5pemVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKGZpZWxkLklzUmVwZWF0ZWQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWVyZ2VSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLCB0b2tlbml6ZXIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IFBhcnNlU2luZ2xlVmFsdWUoZmllbGQsIHRva2VuaXplcik7Ci0gICAgICAgICAgICAgICAgZmllbGQuQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIE1lcmdlUmVwZWF0ZWRGaWVsZChJTWVzc2FnZSBtZXNzYWdlLCBGaWVsZERlc2NyaXB0b3IgZmllbGQsIEpzb25Ub2tlbml6ZXIgdG9rZW5pemVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbml6ZXIuTmV4dCgpOwotICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgIT0gSnNvblRva2VuLlRva2VuVHlwZS5TdGFydEFycmF5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIlJlcGVhdGVkIGZpZWxkIHZhbHVlIHdhcyBub3QgYW4gYXJyYXkuIFRva2VuIHR5cGU6ICIgKyB0b2tlbi5UeXBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgSUxpc3QgbGlzdCA9IChJTGlzdCkgZmllbGQuQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSk7Ci0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgPT0gSnNvblRva2VuLlRva2VuVHlwZS5FbmRBcnJheSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgdG9rZW5pemVyLlB1c2hCYWNrKHRva2VuKTsKLSAgICAgICAgICAgICAgICBpZiAodG9rZW4uVHlwZSA9PSBKc29uVG9rZW4uVG9rZW5UeXBlLk51bGwpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJSZXBlYXRlZCBmaWVsZCBlbGVtZW50cyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBsaXN0LkFkZChQYXJzZVNpbmdsZVZhbHVlKGZpZWxkLCB0b2tlbml6ZXIpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBNZXJnZU1hcEZpZWxkKElNZXNzYWdlIG1lc3NhZ2UsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgSnNvblRva2VuaXplciB0b2tlbml6ZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIE1hcCBmaWVsZHMgYXJlIGFsd2F5cyBvYmplY3RzLCBldmVuIGlmIHRoZSB2YWx1ZXMgYXJlIHdlbGwta25vd24gdHlwZXM6IFBhcnNlU2luZ2xlVmFsdWUgaGFuZGxlcyB0aG9zZS4KLSAgICAgICAgICAgIHZhciB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9rZW4uVHlwZSAhPSBKc29uVG9rZW4uVG9rZW5UeXBlLlN0YXJ0T2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkV4cGVjdGVkIGFuIG9iamVjdCB0byBwb3B1bGF0ZSBhIG1hcCIpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICB2YXIgdHlwZSA9IGZpZWxkLk1lc3NhZ2VUeXBlOwotICAgICAgICAgICAgdmFyIGtleUZpZWxkID0gdHlwZS5GaW5kRmllbGRCeU51bWJlcigxKTsKLSAgICAgICAgICAgIHZhciB2YWx1ZUZpZWxkID0gdHlwZS5GaW5kRmllbGRCeU51bWJlcigyKTsKLSAgICAgICAgICAgIGlmIChrZXlGaWVsZCA9PSBudWxsIHx8IHZhbHVlRmllbGQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJJbnZhbGlkIG1hcCBmaWVsZDogIiArIGZpZWxkLkZ1bGxOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGRpY3Rpb25hcnkgPSAoSURpY3Rpb25hcnkpIGZpZWxkLkFjY2Vzc29yLkdldFZhbHVlKG1lc3NhZ2UpOwotCi0gICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgPT0gSnNvblRva2VuLlRva2VuVHlwZS5FbmRPYmplY3QpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG9iamVjdCBrZXkgPSBQYXJzZU1hcEtleShrZXlGaWVsZCwgdG9rZW4uU3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgICAgIG9iamVjdCB2YWx1ZSA9IFBhcnNlU2luZ2xlVmFsdWUodmFsdWVGaWVsZCwgdG9rZW5pemVyKTsKLSAgICAgICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIk1hcCB2YWx1ZXMgbXVzdCBub3QgYmUgbnVsbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBkaWN0aW9uYXJ5W2tleV0gPSB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIGJvb2wgSXNHb29nbGVQcm90b2J1ZlZhbHVlRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmllbGQuRmllbGRUeXBlID09IEZpZWxkVHlwZS5NZXNzYWdlICYmCi0gICAgICAgICAgICAgICAgZmllbGQuTWVzc2FnZVR5cGUuRnVsbE5hbWUgPT0gVmFsdWUuRGVzY3JpcHRvci5GdWxsTmFtZTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgb2JqZWN0IFBhcnNlU2luZ2xlVmFsdWUoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBKc29uVG9rZW5pemVyIHRva2VuaXplcikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgIGlmICh0b2tlbi5UeXBlID09IEpzb25Ub2tlbi5Ub2tlblR5cGUuTnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBJbiBvcmRlciB0byBzdXBwb3J0IGR5bmFtaWMgbWVzc2FnZXMsIHdlIHNob3VsZCByZWFsbHkgYnVpbGQgdGhpcyB1cAotICAgICAgICAgICAgICAgIC8vIGR5bmFtaWNhbGx5LgotICAgICAgICAgICAgICAgIGlmIChJc0dvb2dsZVByb3RvYnVmVmFsdWVGaWVsZChmaWVsZCkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gVmFsdWUuRm9yTnVsbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgdmFyIGZpZWxkVHlwZSA9IGZpZWxkLkZpZWxkVHlwZTsKLSAgICAgICAgICAgIGlmIChmaWVsZFR5cGUgPT0gRmllbGRUeXBlLk1lc3NhZ2UpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gUGFyc2Ugd3JhcHBlciB0eXBlcyBhcyB0aGVpciBjb25zdGl0dWVudCB0eXBlcy4KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBXaGF0IGRvZXMgdGhpcyBtZWFuIGZvciBudWxsPwotICAgICAgICAgICAgICAgIGlmIChmaWVsZC5NZXNzYWdlVHlwZS5Jc1dyYXBwZXJUeXBlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgZmllbGQgPSBmaWVsZC5NZXNzYWdlVHlwZS5GaWVsZHNbV3JhcHBlcnNSZWZsZWN0aW9uLldyYXBwZXJWYWx1ZUZpZWxkTnVtYmVyXTsKLSAgICAgICAgICAgICAgICAgICAgZmllbGRUeXBlID0gZmllbGQuRmllbGRUeXBlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBNZXJnZSB0aGUgY3VycmVudCB2YWx1ZSBpbiBtZXNzYWdlPyAoUHVibGljIEFQSSBjdXJyZW50bHkgZG9lc24ndCBtYWtlIHRoaXMgcmVsZXZhbnQgYXMgd2UgZG9uJ3QgZXhwb3NlIG1lcmdpbmcuKQotICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIuUHVzaEJhY2sodG9rZW4pOwotICAgICAgICAgICAgICAgICAgICBJTWVzc2FnZSBzdWJNZXNzYWdlID0gTmV3TWVzc2FnZUZvckZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgTWVyZ2Uoc3ViTWVzc2FnZSwgdG9rZW5pemVyKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHN1Yk1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBzd2l0Y2ggKHRva2VuLlR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBKc29uVG9rZW4uVG9rZW5UeXBlLlRydWU6Ci0gICAgICAgICAgICAgICAgY2FzZSBKc29uVG9rZW4uVG9rZW5UeXBlLkZhbHNlOgotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRUeXBlID09IEZpZWxkVHlwZS5Cb29sKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdG9rZW4uVHlwZSA9PSBKc29uVG9rZW4uVG9rZW5UeXBlLlRydWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gRmFsbCB0aHJvdWdoIHRvICJ3ZSBkb24ndCBzdXBwb3J0IHRoaXMgdHlwZSBmb3IgdGhpcyBjYXNlIjsgY291bGQgZHVwbGljYXRlIHRoZSBiZWhhdmlvdXIgb2YgdGhlIGRlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSBpbnN0ZWFkLCBidXQgdGhpcyB3YXkgd2UnZCBvbmx5IG5lZWQgdG8gY2hhbmdlIG9uZSBwbGFjZS4KLSAgICAgICAgICAgICAgICAgICAgZ290byBkZWZhdWx0OwotICAgICAgICAgICAgICAgIGNhc2UgSnNvblRva2VuLlRva2VuVHlwZS5TdHJpbmdWYWx1ZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlU2luZ2xlU3RyaW5nVmFsdWUoZmllbGQsIHRva2VuLlN0cmluZ1ZhbHVlKTsKLSAgICAgICAgICAgICAgICAvLyBOb3RlOiBub3QgcGFzc2luZyB0aGUgbnVtYmVyIHZhbHVlIGl0c2VsZiBoZXJlLCBhcyB3ZSBtYXkgZW5kIHVwIHN0b3JpbmcgdGhlIHN0cmluZyB2YWx1ZSBpbiB0aGUgdG9rZW4gdG9vLgotICAgICAgICAgICAgICAgIGNhc2UgSnNvblRva2VuLlRva2VuVHlwZS5OdW1iZXI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZVNpbmdsZU51bWJlclZhbHVlKGZpZWxkLCB0b2tlbik7Ci0gICAgICAgICAgICAgICAgY2FzZSBKc29uVG9rZW4uVG9rZW5UeXBlLk51bGw6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBOb3RJbXBsZW1lbnRlZEV4Y2VwdGlvbigiSGF2ZW4ndCB3b3JrZWQgb3V0IHdoYXQgdG8gZG8gZm9yIG51bGwgeWV0Iik7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiVW5zdXBwb3J0ZWQgSlNPTiB0b2tlbiB0eXBlICIgKyB0b2tlbi5UeXBlICsgIiBmb3IgZmllbGQgdHlwZSAiICsgZmllbGRUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyA8cGFyYW1yZWYgbmFtZT0ianNvbiIvPiBpbnRvIGEgbmV3IG1lc3NhZ2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIG1lc3NhZ2UgdG8gY3JlYXRlLjwvdHlwZXBhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Impzb24iPlRoZSBKU09OIHRvIHBhcnNlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRKc29uRXhjZXB0aW9uIj5UaGUgSlNPTiBkb2VzIG5vdCBjb21wbHkgd2l0aCBSRkMgNzE1OTwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iPlRoZSBKU09OIGRvZXMgbm90IHJlcHJlc2VudCBhIFByb3RvY29sIEJ1ZmZlcnMgbWVzc2FnZSBjb3JyZWN0bHk8L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIFQgUGFyc2U8VD4oc3RyaW5nIGpzb24pIHdoZXJlIFQgOiBJTWVzc2FnZSwgbmV3KCkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChqc29uLCBuYW1lb2YoanNvbikpOwotICAgICAgICAgICAgcmV0dXJuIFBhcnNlPFQ+KG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFyc2VzIEpTT04gcmVhZCBmcm9tIDxwYXJhbXJlZiBuYW1lPSJqc29uUmVhZGVyIi8+IGludG8gYSBuZXcgbWVzc2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgbWVzc2FnZSB0byBjcmVhdGUuPC90eXBlcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ianNvblJlYWRlciI+UmVhZGVyIHByb3ZpZGluZyB0aGUgSlNPTiB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkSnNvbkV4Y2VwdGlvbiI+VGhlIEpTT04gZG9lcyBub3QgY29tcGx5IHdpdGggUkZDIDcxNTk8L2V4Y2VwdGlvbj4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIj5UaGUgSlNPTiBkb2VzIG5vdCByZXByZXNlbnQgYSBQcm90b2NvbCBCdWZmZXJzIG1lc3NhZ2UgY29ycmVjdGx5PC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBUIFBhcnNlPFQ+KFRleHRSZWFkZXIganNvblJlYWRlcikgd2hlcmUgVCA6IElNZXNzYWdlLCBuZXcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGpzb25SZWFkZXIsIG5hbWVvZihqc29uUmVhZGVyKSk7Ci0gICAgICAgICAgICBUIG1lc3NhZ2UgPSBuZXcgVCgpOwotICAgICAgICAgICAgTWVyZ2UobWVzc2FnZSwganNvblJlYWRlcik7Ci0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyA8cGFyYW1yZWYgbmFtZT0ianNvbiIvPiBpbnRvIGEgbmV3IG1lc3NhZ2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ianNvbiI+VGhlIEpTT04gdG8gcGFyc2UuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkZXNjcmlwdG9yIj5EZXNjcmlwdG9yIG9mIG1lc3NhZ2UgdHlwZSB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkSnNvbkV4Y2VwdGlvbiI+VGhlIEpTT04gZG9lcyBub3QgY29tcGx5IHdpdGggUkZDIDcxNTk8L2V4Y2VwdGlvbj4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIj5UaGUgSlNPTiBkb2VzIG5vdCByZXByZXNlbnQgYSBQcm90b2NvbCBCdWZmZXJzIG1lc3NhZ2UgY29ycmVjdGx5PC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBJTWVzc2FnZSBQYXJzZShzdHJpbmcganNvbiwgTWVzc2FnZURlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChqc29uLCBuYW1lb2YoanNvbikpOwotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChkZXNjcmlwdG9yLCBuYW1lb2YoZGVzY3JpcHRvcikpOwotICAgICAgICAgICAgcmV0dXJuIFBhcnNlKG5ldyBTdHJpbmdSZWFkZXIoanNvbiksIGRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFyc2VzIEpTT04gcmVhZCBmcm9tIDxwYXJhbXJlZiBuYW1lPSJqc29uUmVhZGVyIi8+IGludG8gYSBuZXcgbWVzc2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJqc29uUmVhZGVyIj5SZWFkZXIgcHJvdmlkaW5nIHRoZSBKU09OIHRvIHBhcnNlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGVzY3JpcHRvciI+RGVzY3JpcHRvciBvZiBtZXNzYWdlIHR5cGUgdG8gcGFyc2UuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZEpzb25FeGNlcHRpb24iPlRoZSBKU09OIGRvZXMgbm90IGNvbXBseSB3aXRoIFJGQyA3MTU5PC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiI+VGhlIEpTT04gZG9lcyBub3QgcmVwcmVzZW50IGEgUHJvdG9jb2wgQnVmZmVycyBtZXNzYWdlIGNvcnJlY3RseTwvZXhjZXB0aW9uPgotICAgICAgICBwdWJsaWMgSU1lc3NhZ2UgUGFyc2UoVGV4dFJlYWRlciBqc29uUmVhZGVyLCBNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGpzb25SZWFkZXIsIG5hbWVvZihqc29uUmVhZGVyKSk7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGRlc2NyaXB0b3IsIG5hbWVvZihkZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gZGVzY3JpcHRvci5QYXJzZXIuQ3JlYXRlVGVtcGxhdGUoKTsKLSAgICAgICAgICAgIE1lcmdlKG1lc3NhZ2UsIGpzb25SZWFkZXIpOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgTWVyZ2VTdHJ1Y3RWYWx1ZShJTWVzc2FnZSBtZXNzYWdlLCBKc29uVG9rZW5pemVyIHRva2VuaXplcikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGZpcnN0VG9rZW4gPSB0b2tlbml6ZXIuTmV4dCgpOwotICAgICAgICAgICAgdmFyIGZpZWxkcyA9IG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHM7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZpcnN0VG9rZW4uVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIEpzb25Ub2tlbi5Ub2tlblR5cGUuTnVsbDoKLSAgICAgICAgICAgICAgICAgICAgZmllbGRzW1ZhbHVlLk51bGxWYWx1ZUZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5TZXRWYWx1ZShtZXNzYWdlLCAwKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgIGNhc2UgSnNvblRva2VuLlRva2VuVHlwZS5TdHJpbmdWYWx1ZToKLSAgICAgICAgICAgICAgICAgICAgZmllbGRzW1ZhbHVlLlN0cmluZ1ZhbHVlRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIGZpcnN0VG9rZW4uU3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBKc29uVG9rZW4uVG9rZW5UeXBlLk51bWJlcjoKLSAgICAgICAgICAgICAgICAgICAgZmllbGRzW1ZhbHVlLk51bWJlclZhbHVlRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIGZpcnN0VG9rZW4uTnVtYmVyVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBKc29uVG9rZW4uVG9rZW5UeXBlLkZhbHNlOgotICAgICAgICAgICAgICAgIGNhc2UgSnNvblRva2VuLlRva2VuVHlwZS5UcnVlOgotICAgICAgICAgICAgICAgICAgICBmaWVsZHNbVmFsdWUuQm9vbFZhbHVlRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIGZpcnN0VG9rZW4uVHlwZSA9PSBKc29uVG9rZW4uVG9rZW5UeXBlLlRydWUpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgY2FzZSBKc29uVG9rZW4uVG9rZW5UeXBlLlN0YXJ0T2JqZWN0OgotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgZmllbGQgPSBmaWVsZHNbVmFsdWUuU3RydWN0VmFsdWVGaWVsZE51bWJlcl07Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YXIgc3RydWN0TWVzc2FnZSA9IE5ld01lc3NhZ2VGb3JGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0b2tlbml6ZXIuUHVzaEJhY2soZmlyc3RUb2tlbik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBNZXJnZShzdHJ1Y3RNZXNzYWdlLCB0b2tlbml6ZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgc3RydWN0TWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjYXNlIEpzb25Ub2tlbi5Ub2tlblR5cGUuU3RhcnRBcnJheToKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkID0gZmllbGRzW1ZhbHVlLkxpc3RWYWx1ZUZpZWxkTnVtYmVyXTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhciBsaXN0ID0gTmV3TWVzc2FnZUZvckZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRva2VuaXplci5QdXNoQmFjayhmaXJzdFRva2VuKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIE1lcmdlKGxpc3QsIHRva2VuaXplcik7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5BY2Nlc3Nvci5TZXRWYWx1ZShtZXNzYWdlLCBsaXN0KTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJVbmV4cGVjdGVkIHRva2VuIHR5cGU6ICIgKyBmaXJzdFRva2VuLlR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSB2b2lkIE1lcmdlU3RydWN0KElNZXNzYWdlIG1lc3NhZ2UsIEpzb25Ub2tlbml6ZXIgdG9rZW5pemVyKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgdG9rZW4gPSB0b2tlbml6ZXIuTmV4dCgpOwotICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgIT0gSnNvblRva2VuLlRva2VuVHlwZS5TdGFydE9iamVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJFeHBlY3RlZCBvYmplY3QgdmFsdWUgZm9yIFN0cnVjdCIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdG9rZW5pemVyLlB1c2hCYWNrKHRva2VuKTsKLQotICAgICAgICAgICAgdmFyIGZpZWxkID0gbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkc1tTdHJ1Y3QuRmllbGRzRmllbGROdW1iZXJdOwotICAgICAgICAgICAgTWVyZ2VNYXBGaWVsZChtZXNzYWdlLCBmaWVsZCwgdG9rZW5pemVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBNZXJnZUFueShJTWVzc2FnZSBtZXNzYWdlLCBKc29uVG9rZW5pemVyIHRva2VuaXplcikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gUmVjb3JkIHRoZSB0b2tlbiBzdHJlYW0gdW50aWwgd2Ugc2VlIHRoZSBAdHlwZSBwcm9wZXJ0eS4gQXQgdGhhdCBwb2ludCwgd2UgY2FuIHRha2UgdGhlIHZhbHVlLCBjb25zdWx0Ci0gICAgICAgICAgICAvLyB0aGUgdHlwZSByZWdpc3RyeSBmb3IgdGhlIHJlbGV2YW50IG1lc3NhZ2UsIGFuZCByZXBsYXkgdGhlIHN0cmVhbSwgb21pdHRpbmcgdGhlIEB0eXBlIHByb3BlcnR5LgotICAgICAgICAgICAgdmFyIHRva2VucyA9IG5ldyBMaXN0PEpzb25Ub2tlbj4oKTsKLQotICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgIGlmICh0b2tlbi5UeXBlICE9IEpzb25Ub2tlbi5Ub2tlblR5cGUuU3RhcnRPYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiRXhwZWN0ZWQgb2JqZWN0IHZhbHVlIGZvciBBbnkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGludCB0eXBlVXJsT2JqZWN0RGVwdGggPSB0b2tlbml6ZXIuT2JqZWN0RGVwdGg7Ci0KLSAgICAgICAgICAgIC8vIFRoZSBjaGVjayBmb3IgdGhlIHByb3BlcnR5IGRlcHRoIHByb3RlY3RzIHVzIGZyb20gbmVzdGVkIEFueSB2YWx1ZXMgd2hpY2ggb2NjdXIgYmVmb3JlIHRoZSB0eXBlIFVSTAotICAgICAgICAgICAgLy8gZm9yICp0aGlzKiBBbnkuCi0gICAgICAgICAgICB3aGlsZSAodG9rZW4uVHlwZSAhPSBKc29uVG9rZW4uVG9rZW5UeXBlLk5hbWUgfHwKLSAgICAgICAgICAgICAgICB0b2tlbi5TdHJpbmdWYWx1ZSAhPSBKc29uRm9ybWF0dGVyLkFueVR5cGVVcmxGaWVsZCB8fAotICAgICAgICAgICAgICAgIHRva2VuaXplci5PYmplY3REZXB0aCAhPSB0eXBlVXJsT2JqZWN0RGVwdGgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdG9rZW5zLkFkZCh0b2tlbik7Ci0gICAgICAgICAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIuTmV4dCgpOwotCi0gICAgICAgICAgICAgICAgaWYgKHRva2VuaXplci5PYmplY3REZXB0aCA8IHR5cGVVcmxPYmplY3REZXB0aCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkFueSBtZXNzYWdlIHdpdGggbm8gQHR5cGUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIERvbid0IGFkZCB0aGUgQHR5cGUgcHJvcGVydHkgb3IgaXRzIHZhbHVlIHRvIHRoZSByZWNvcmRlZCB0b2tlbiBsaXN0Ci0gICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICBpZiAodG9rZW4uVHlwZSAhPSBKc29uVG9rZW4uVG9rZW5UeXBlLlN0cmluZ1ZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkV4cGVjdGVkIHN0cmluZyB2YWx1ZSBmb3IgQW55LkB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzdHJpbmcgdHlwZVVybCA9IHRva2VuLlN0cmluZ1ZhbHVlOwotICAgICAgICAgICAgc3RyaW5nIHR5cGVOYW1lID0gQW55LkdldFR5cGVOYW1lKHR5cGVVcmwpOwotCi0gICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gc2V0dGluZ3MuVHlwZVJlZ2lzdHJ5LkZpbmQodHlwZU5hbWUpOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigkIlR5cGUgcmVnaXN0cnkgaGFzIG5vIGRlc2NyaXB0b3IgZm9yIHR5cGUgbmFtZSAne3R5cGVOYW1lfSciKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm93IHJlcGxheSB0aGUgdG9rZW4gc3RyZWFtIHdlJ3ZlIGFscmVhZHkgcmVhZCBhbmQgYW55dGhpbmcgdGhhdCByZW1haW5zIG9mIHRoZSBvYmplY3QsIGp1c3QgcGFyc2luZyBpdAotICAgICAgICAgICAgLy8gYXMgbm9ybWFsLiBPdXIgb3JpZ2luYWwgdG9rZW5pemVyIHNob3VsZCBlbmQgdXAgYXQgdGhlIGVuZCBvZiB0aGUgb2JqZWN0LgotICAgICAgICAgICAgdmFyIHJlcGxheSA9IEpzb25Ub2tlbml6ZXIuRnJvbVJlcGxheWVkVG9rZW5zKHRva2VucywgdG9rZW5pemVyKTsKLSAgICAgICAgICAgIHZhciBib2R5ID0gZGVzY3JpcHRvci5QYXJzZXIuQ3JlYXRlVGVtcGxhdGUoKTsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLklzV2VsbEtub3duVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBNZXJnZVdlbGxLbm93blR5cGVBbnlCb2R5KGJvZHksIHJlcGxheSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgTWVyZ2UoYm9keSwgcmVwbGF5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBkYXRhID0gYm9keS5Ub0J5dGVTdHJpbmcoKTsKLQotICAgICAgICAgICAgLy8gTm93IHRoYXQgd2UgaGF2ZSB0aGUgbWVzc2FnZSBkYXRhLCB3ZSBjYW4gcGFjayBpdCBpbnRvIGFuIEFueSAodGhlIG1lc3NhZ2UgcmVjZWl2ZWQgYXMgYSBwYXJhbWV0ZXIpLgotICAgICAgICAgICAgbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkc1tBbnkuVHlwZVVybEZpZWxkTnVtYmVyXS5BY2Nlc3Nvci5TZXRWYWx1ZShtZXNzYWdlLCB0eXBlVXJsKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHNbQW55LlZhbHVlRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIGRhdGEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2VsbC1rbm93biB0eXBlcyBlbmQgdXAgaW4gYSBwcm9wZXJ0eSBjYWxsZWQgInZhbHVlIiBpbiB0aGUgSlNPTi4gQXMgdGhlcmUncyBubyBsb25nZXIgYSBAdHlwZSBwcm9wZXJ0eQotICAgICAgICAvLyBpbiB0aGUgZ2l2ZW4gSlNPTiB0b2tlbiBzdHJlYW0sIHdlIHNob3VsZCAqb25seSogaGF2ZSB0b2tlbnMgb2Ygc3RhcnQtb2JqZWN0LCBuYW1lKCJ2YWx1ZSIpLCB0aGUgdmFsdWUKLSAgICAgICAgLy8gaXRzZWxmLCBhbmQgdGhlbiBlbmQtb2JqZWN0LgotICAgICAgICBwcml2YXRlIHZvaWQgTWVyZ2VXZWxsS25vd25UeXBlQW55Qm9keShJTWVzc2FnZSBib2R5LCBKc29uVG9rZW5pemVyIHRva2VuaXplcikKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIHRva2VuID0gdG9rZW5pemVyLk5leHQoKTsgLy8gRGVmaW5pdGVseSBzdGFydC1vYmplY3Q7IGNoZWNrZWQgaW4gcHJldmlvdXMgbWV0aG9kCi0gICAgICAgICAgICB0b2tlbiA9IHRva2VuaXplci5OZXh0KCk7Ci0gICAgICAgICAgICAvLyBUT0RPOiBXaGF0IGFib3V0IGFuIGFic2VudCBJbnQzMlZhbHVlLCBmb3IgZXhhbXBsZT8KLSAgICAgICAgICAgIGlmICh0b2tlbi5UeXBlICE9IEpzb25Ub2tlbi5Ub2tlblR5cGUuTmFtZSB8fCB0b2tlbi5TdHJpbmdWYWx1ZSAhPSBKc29uRm9ybWF0dGVyLkFueVdlbGxLbm93blR5cGVWYWx1ZUZpZWxkKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oJCJFeHBlY3RlZCAne0pzb25Gb3JtYXR0ZXIuQW55V2VsbEtub3duVHlwZVZhbHVlRmllbGR9JyBwcm9wZXJ0eSBmb3Igd2VsbC1rbm93biB0eXBlIEFueSBib2R5Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBNZXJnZShib2R5LCB0b2tlbml6ZXIpOwotICAgICAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIuTmV4dCgpOwotICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgIT0gSnNvblRva2VuLlRva2VuVHlwZS5FbmRPYmplY3QpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIkV4cGVjdGVkIGVuZC1vYmplY3QgdG9rZW4gYWZ0ZXIgQHR5cGUvdmFsdWUgZm9yIHdlbGwta25vd24gdHlwZSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgI3JlZ2lvbiBVdGlsaXR5IG1ldGhvZHMgd2hpY2ggZG9uJ3QgZGVwZW5kIG9uIHRoZSBzdGF0ZSAob3Igc2V0dGluZ3MpIG9mIHRoZSBwYXJzZXIuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBQYXJzZU1hcEtleShGaWVsZERlc2NyaXB0b3IgZmllbGQsIHN0cmluZyBrZXlUZXh0KQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLkZpZWxkVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5Cb29sOgotICAgICAgICAgICAgICAgICAgICBpZiAoa2V5VGV4dCA9PSAidHJ1ZSIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChrZXlUZXh0ID09ICJmYWxzZSIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJJbnZhbGlkIHN0cmluZyBmb3IgYm9vbCBtYXAga2V5OiAiICsga2V5VGV4dCk7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU3RyaW5nOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4ga2V5VGV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50MzI6Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkMzI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZU51bWVyaWNTdHJpbmcoa2V5VGV4dCwgaW50LlBhcnNlKTsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50MzI6Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlTnVtZXJpY1N0cmluZyhrZXlUZXh0LCB1aW50LlBhcnNlKTsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TSW50NjQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU0ZpeGVkNjQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZU51bWVyaWNTdHJpbmcoa2V5VGV4dCwgbG9uZy5QYXJzZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuVUludDY0OgotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBQYXJzZU51bWVyaWNTdHJpbmcoa2V5VGV4dCwgdWxvbmcuUGFyc2UpOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgZmllbGQgdHlwZSBmb3IgbWFwOiAiICsgZmllbGQuRmllbGRUeXBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIG9iamVjdCBQYXJzZVNpbmdsZU51bWJlclZhbHVlKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgSnNvblRva2VuIHRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICBkb3VibGUgdmFsdWUgPSB0b2tlbi5OdW1iZXJWYWx1ZTsKLSAgICAgICAgICAgIGNoZWNrZWQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0cnkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGQuRmllbGRUeXBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSW50ZWdlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuVUludDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDaGVja0ludGVnZXIodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAodWludCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5JbnQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNGaXhlZDY0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENoZWNrSW50ZWdlcih2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChsb25nKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZpeGVkNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tJbnRlZ2VyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKHVsb25nKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkRvdWJsZToKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GbG9hdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLklzTmFOKHZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdC5OYU47Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWx1ZSA+IGZsb2F0Lk1heFZhbHVlIHx8IHZhbHVlIDwgZmxvYXQuTWluVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZG91YmxlLklzUG9zaXRpdmVJbmZpbml0eSh2YWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmbG9hdC5Qb3NpdGl2ZUluZmluaXR5OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkb3VibGUuSXNOZWdhdGl2ZUluZmluaXR5KHZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZsb2F0Lk5lZ2F0aXZlSW5maW5pdHk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIlZhbHVlIG91dCBvZiByYW5nZToge3ZhbHVlfSIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gKGZsb2F0KSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkVudW06Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2hlY2tJbnRlZ2VyKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBKdXN0IHJldHVybiBpdCBhcyBhbiBpbnQsIGFuZCBsZXQgdGhlIENMUiBjb252ZXJ0IGl0LgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGUgdGhhdCB3ZSBkZWxpYmVyYXRlbHkgZG9uJ3QgY2hlY2sgdGhhdCBpdCdzIGEga25vd24gdmFsdWUuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIChpbnQpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCQiVW5zdXBwb3J0ZWQgY29udmVyc2lvbiBmcm9tIEpTT04gbnVtYmVyIGZvciBmaWVsZCB0eXBlIHtmaWVsZC5GaWVsZFR5cGV9Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2F0Y2ggKE92ZXJmbG93RXhjZXB0aW9uKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIlZhbHVlIG91dCBvZiByYW5nZToge3ZhbHVlfSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgQ2hlY2tJbnRlZ2VyKGRvdWJsZSB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGRvdWJsZS5Jc0luZmluaXR5KHZhbHVlKSB8fCBkb3VibGUuSXNOYU4odmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oJCJWYWx1ZSBub3QgYW4gaW50ZWdlcjoge3ZhbHVlfSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHZhbHVlICE9IE1hdGguRmxvb3IodmFsdWUpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oJCJWYWx1ZSBub3QgYW4gaW50ZWdlcjoge3ZhbHVlfSIpOwotICAgICAgICAgICAgfSAgICAgICAgICAgIAotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgb2JqZWN0IFBhcnNlU2luZ2xlU3RyaW5nVmFsdWUoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBzdHJpbmcgdGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgc3dpdGNoIChmaWVsZC5GaWVsZFR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuU3RyaW5nOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gdGV4dDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5CeXRlczoKLSAgICAgICAgICAgICAgICAgICAgdHJ5Ci0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBCeXRlU3RyaW5nLkZyb21CYXNlNjQodGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbiBlKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uSW52YWxpZEJhc2U2NChlKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDMyOgotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQzMjoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQzMjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlTnVtZXJpY1N0cmluZyh0ZXh0LCBpbnQuUGFyc2UpOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlVJbnQzMjoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5GaXhlZDMyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gUGFyc2VOdW1lcmljU3RyaW5nKHRleHQsIHVpbnQuUGFyc2UpOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkludDY0OgotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLlNJbnQ2NDoKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5TRml4ZWQ2NDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlTnVtZXJpY1N0cmluZyh0ZXh0LCBsb25nLlBhcnNlKTsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5VSW50NjQ6Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRml4ZWQ2NDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIFBhcnNlTnVtZXJpY1N0cmluZyh0ZXh0LCB1bG9uZy5QYXJzZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZFR5cGUuRG91YmxlOgotICAgICAgICAgICAgICAgICAgICBkb3VibGUgZCA9IFBhcnNlTnVtZXJpY1N0cmluZyh0ZXh0LCBkb3VibGUuUGFyc2UpOwotICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZUluZmluaXR5QW5kTmFuKHRleHQsIGRvdWJsZS5Jc1Bvc2l0aXZlSW5maW5pdHkoZCksIGRvdWJsZS5Jc05lZ2F0aXZlSW5maW5pdHkoZCksIGRvdWJsZS5Jc05hTihkKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGRUeXBlLkZsb2F0OgotICAgICAgICAgICAgICAgICAgICBmbG9hdCBmID0gUGFyc2VOdW1lcmljU3RyaW5nKHRleHQsIGZsb2F0LlBhcnNlKTsKLSAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVJbmZpbml0eUFuZE5hbih0ZXh0LCBmbG9hdC5Jc1Bvc2l0aXZlSW5maW5pdHkoZiksIGZsb2F0LklzTmVnYXRpdmVJbmZpbml0eShmKSwgZmxvYXQuSXNOYU4oZikpOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZjsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkVHlwZS5FbnVtOgotICAgICAgICAgICAgICAgICAgICB2YXIgZW51bVZhbHVlID0gZmllbGQuRW51bVR5cGUuRmluZFZhbHVlQnlOYW1lKHRleHQpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZW51bVZhbHVlID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oJCJJbnZhbGlkIGVudW0gdmFsdWU6IHt0ZXh0fSBmb3IgZW51bSB0eXBlOiB7ZmllbGQuRW51bVR5cGUuRnVsbE5hbWV9Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSnVzdCByZXR1cm4gaXQgYXMgYW4gaW50LCBhbmQgbGV0IHRoZSBDTFIgY29udmVydCBpdC4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGVudW1WYWx1ZS5OdW1iZXI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIlVuc3VwcG9ydGVkIGNvbnZlcnNpb24gZnJvbSBKU09OIHN0cmluZyBmb3IgZmllbGQgdHlwZSB7ZmllbGQuRmllbGRUeXBlfSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgbWVzc2FnZSB0eXBlIGZvciB0aGUgZ2l2ZW4gZmllbGQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIElNZXNzYWdlIE5ld01lc3NhZ2VGb3JGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBmaWVsZC5NZXNzYWdlVHlwZS5QYXJzZXIuQ3JlYXRlVGVtcGxhdGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFQgUGFyc2VOdW1lcmljU3RyaW5nPFQ+KHN0cmluZyB0ZXh0LCBGdW5jPHN0cmluZywgTnVtYmVyU3R5bGVzLCBJRm9ybWF0UHJvdmlkZXIsIFQ+IHBhcnNlcikKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQ2FuJ3QgcHJvaGliaXQgdGhpcyB3aXRoIE51bWJlclN0eWxlcy4KLSAgICAgICAgICAgIGlmICh0ZXh0LlN0YXJ0c1dpdGgoIisiKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCQiSW52YWxpZCBudW1lcmljIHZhbHVlOiB7dGV4dH0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0ZXh0LlN0YXJ0c1dpdGgoIjAiKSAmJiB0ZXh0Lkxlbmd0aCA+IDEpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKHRleHRbMV0gPj0gJzAnICYmIHRleHRbMV0gPD0gJzknKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIkludmFsaWQgbnVtZXJpYyB2YWx1ZToge3RleHR9Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodGV4dC5TdGFydHNXaXRoKCItMCIpICYmIHRleHQuTGVuZ3RoID4gMikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAodGV4dFsyXSA+PSAnMCcgJiYgdGV4dFsyXSA8PSAnOScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCQiSW52YWxpZCBudW1lcmljIHZhbHVlOiB7dGV4dH0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB0cnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyc2VyKHRleHQsIE51bWJlclN0eWxlcy5BbGxvd0xlYWRpbmdTaWduIHwgTnVtYmVyU3R5bGVzLkFsbG93RGVjaW1hbFBvaW50IHwgTnVtYmVyU3R5bGVzLkFsbG93RXhwb25lbnQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCQiSW52YWxpZCBudW1lcmljIHZhbHVlIGZvciB0eXBlOiB7dGV4dH0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChPdmVyZmxvd0V4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCQiVmFsdWUgb3V0IG9mIHJhbmdlOiB7dGV4dH0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENoZWNrcyB0aGF0IGFueSBpbmZpbml0ZS9OYU4gdmFsdWVzIG9yaWdpbmF0ZWQgZnJvbSB0aGUgY29ycmVjdCB0ZXh0LgotICAgICAgICAvLy8gVGhpcyBjb3JyZWN0cyB0aGUgbGVuaWVudCB3aGl0ZXNwYWNlIGhhbmRsaW5nIG9mIGRvdWJsZS5QYXJzZS9mbG9hdC5QYXJzZSwgYXMgd2VsbCBhcyB0aGUKLSAgICAgICAgLy8vIHdheSB0aGF0IE1vbm8gcGFyc2VzIG91dC1vZi1yYW5nZSB2YWx1ZXMgYXMgaW5maW5pdHkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVmFsaWRhdGVJbmZpbml0eUFuZE5hbihzdHJpbmcgdGV4dCwgYm9vbCBpc1Bvc2l0aXZlSW5maW5pdHksIGJvb2wgaXNOZWdhdGl2ZUluZmluaXR5LCBib29sIGlzTmFOKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoKGlzUG9zaXRpdmVJbmZpbml0eSAmJiB0ZXh0ICE9ICJJbmZpbml0eSIpIHx8Ci0gICAgICAgICAgICAgICAgKGlzTmVnYXRpdmVJbmZpbml0eSAmJiB0ZXh0ICE9ICItSW5maW5pdHkiKSB8fAotICAgICAgICAgICAgICAgIChpc05hTiAmJiB0ZXh0ICE9ICJOYU4iKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCQiSW52YWxpZCBudW1lcmljIHZhbHVlOiB7dGV4dH0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgTWVyZ2VUaW1lc3RhbXAoSU1lc3NhZ2UgbWVzc2FnZSwgSnNvblRva2VuIHRva2VuKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAodG9rZW4uVHlwZSAhPSBKc29uVG9rZW4uVG9rZW5UeXBlLlN0cmluZ1ZhbHVlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkV4cGVjdGVkIHN0cmluZyB2YWx1ZSBmb3IgVGltZXN0YW1wIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbWF0Y2ggPSBUaW1lc3RhbXBSZWdleC5NYXRjaCh0b2tlbi5TdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICBpZiAoIW1hdGNoLlN1Y2Nlc3MpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIkludmFsaWQgVGltZXN0YW1wIHZhbHVlOiB7dG9rZW4uU3RyaW5nVmFsdWV9Iik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgZGF0ZVRpbWUgPSBtYXRjaC5Hcm91cHNbImRhdGV0aW1lIl0uVmFsdWU7Ci0gICAgICAgICAgICB2YXIgc3Vic2Vjb25kcyA9IG1hdGNoLkdyb3Vwc1sic3Vic2Vjb25kcyJdLlZhbHVlOwotICAgICAgICAgICAgdmFyIG9mZnNldCA9IG1hdGNoLkdyb3Vwc1sib2Zmc2V0Il0uVmFsdWU7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERhdGVUaW1lIHBhcnNlZCA9IERhdGVUaW1lLlBhcnNlRXhhY3QoCi0gICAgICAgICAgICAgICAgICAgIGRhdGVUaW1lLAotICAgICAgICAgICAgICAgICAgICAieXl5eS1NTS1kZCdUJ0hIOm1tOnNzIiwKLSAgICAgICAgICAgICAgICAgICAgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgRGF0ZVRpbWVTdHlsZXMuQXNzdW1lVW5pdmVyc2FsIHwgRGF0ZVRpbWVTdHlsZXMuQWRqdXN0VG9Vbml2ZXJzYWwpOwotICAgICAgICAgICAgICAgIC8vIFRPRE86IEl0IHdvdWxkIGJlIG5pY2Ugbm90IHRvIGhhdmUgdG8gY3JlYXRlIGFsbCB0aGVzZSBvYmplY3RzLi4uIGVhc3kgdG8gb3B0aW1pemUgbGF0ZXIgdGhvdWdoLgotICAgICAgICAgICAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXAgPSBUaW1lc3RhbXAuRnJvbURhdGVUaW1lKHBhcnNlZCk7Ci0gICAgICAgICAgICAgICAgaW50IG5hbm9zVG9BZGQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChzdWJzZWNvbmRzICE9ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYWx3YXlzIHdvcmssIGFzIHdlJ3ZlIGdvdCAxLTkgZGlnaXRzLgotICAgICAgICAgICAgICAgICAgICBpbnQgcGFyc2VkRnJhY3Rpb24gPSBpbnQuUGFyc2Uoc3Vic2Vjb25kcy5TdWJzdHJpbmcoMSksIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpOwotICAgICAgICAgICAgICAgICAgICBuYW5vc1RvQWRkID0gcGFyc2VkRnJhY3Rpb24gKiBTdWJzZWNvbmRTY2FsaW5nRmFjdG9yc1tzdWJzZWNvbmRzLkxlbmd0aF07Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBzZWNvbmRzVG9BZGQgPSAwOwotICAgICAgICAgICAgICAgIGlmIChvZmZzZXQgIT0gIloiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyB0aGUgYW1vdW50IHdlIG5lZWQgdG8gKnN1YnRyYWN0KiBmcm9tIHRoZSBsb2NhbCB0aW1lIHRvIGdldCB0byBVVEMgLSBoZW5jZSAtID0+ICsxIGFuZCB2aWNlIHZlcnNhLgotICAgICAgICAgICAgICAgICAgICBpbnQgc2lnbiA9IG9mZnNldFswXSA9PSAnLScgPyAxIDogLTE7Ci0gICAgICAgICAgICAgICAgICAgIGludCBob3VycyA9IGludC5QYXJzZShvZmZzZXQuU3Vic3RyaW5nKDEsIDIpLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKTsKLSAgICAgICAgICAgICAgICAgICAgaW50IG1pbnV0ZXMgPSBpbnQuUGFyc2Uob2Zmc2V0LlN1YnN0cmluZyg0LCAyKSk7Ci0gICAgICAgICAgICAgICAgICAgIGludCB0b3RhbE1pbnV0ZXMgPSBob3VycyAqIDYwICsgbWludXRlczsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHRvdGFsTWludXRlcyA+IDE4ICogNjApCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgVGltZXN0YW1wIHZhbHVlOiAiICsgdG9rZW4uU3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmICh0b3RhbE1pbnV0ZXMgPT0gMCAmJiBzaWduID09IDEpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoaXMgaXMgYW4gb2Zmc2V0IG9mIC0wMDowMCwgd2hpY2ggbWVhbnMgInVua25vd24gbG9jYWwgb2Zmc2V0Ii4gSXQgbWFrZXMgbm8gc2Vuc2UgZm9yIGEgdGltZXN0YW1wLgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiSW52YWxpZCBUaW1lc3RhbXAgdmFsdWU6ICIgKyB0b2tlbi5TdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byAqc3VidHJhY3QqIHRoZSBvZmZzZXQgZnJvbSBsb2NhbCB0aW1lIHRvIGdldCBVVEMuCi0gICAgICAgICAgICAgICAgICAgIHNlY29uZHNUb0FkZCA9IHNpZ24gKiB0b3RhbE1pbnV0ZXMgKiA2MDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgLy8gRW5zdXJlIHdlJ3ZlIGdvdCB0aGUgcmlnaHQgc2lnbnMuIEN1cnJlbnRseSB1bm5lY2Vzc2FyeSwgYnV0IGVhc3kgdG8gZG8uCi0gICAgICAgICAgICAgICAgaWYgKHNlY29uZHNUb0FkZCA8IDAgJiYgbmFub3NUb0FkZCA+IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBzZWNvbmRzVG9BZGQrKzsKLSAgICAgICAgICAgICAgICAgICAgbmFub3NUb0FkZCA9IG5hbm9zVG9BZGQgLSBEdXJhdGlvbi5OYW5vc2Vjb25kc1BlclNlY29uZDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHNlY29uZHNUb0FkZCAhPSAwIHx8IG5hbm9zVG9BZGQgIT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRpbWVzdGFtcCArPSBuZXcgRHVyYXRpb24geyBOYW5vcyA9IG5hbm9zVG9BZGQsIFNlY29uZHMgPSBzZWNvbmRzVG9BZGQgfTsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhlIHJlc3VsdGluZyB0aW1lc3RhbXAgYWZ0ZXIgb2Zmc2V0IGNoYW5nZSB3b3VsZCBiZSBvdXQgb2Ygb3VyIGV4cGVjdGVkIHJhbmdlLiBDdXJyZW50bHkgdGhlIFRpbWVzdGFtcCBtZXNzYWdlIGRvZXNuJ3QgdmFsaWRhdGUgdGhpcwotICAgICAgICAgICAgICAgICAgICAvLyBhbnl3aGVyZSwgYnV0IHdlIHNob3VsZG4ndCBwYXJzZSBpdC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKHRpbWVzdGFtcC5TZWNvbmRzIDwgVGltZXN0YW1wLlVuaXhTZWNvbmRzQXRCY2xNaW5WYWx1ZSB8fCB0aW1lc3RhbXAuU2Vjb25kcyA+IFRpbWVzdGFtcC5Vbml4U2Vjb25kc0F0QmNsTWF4VmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgVGltZXN0YW1wIHZhbHVlOiAiICsgdG9rZW4uU3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHNbVGltZXN0YW1wLlNlY29uZHNGaWVsZE51bWJlcl0uQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgdGltZXN0YW1wLlNlY29uZHMpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHNbVGltZXN0YW1wLk5hbm9zRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIHRpbWVzdGFtcC5OYW5vcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBjYXRjaCAoRm9ybWF0RXhjZXB0aW9uKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgVGltZXN0YW1wIHZhbHVlOiAiICsgdG9rZW4uU3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBNZXJnZUR1cmF0aW9uKElNZXNzYWdlIG1lc3NhZ2UsIEpzb25Ub2tlbiB0b2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHRva2VuLlR5cGUgIT0gSnNvblRva2VuLlRva2VuVHlwZS5TdHJpbmdWYWx1ZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJFeHBlY3RlZCBzdHJpbmcgdmFsdWUgZm9yIER1cmF0aW9uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICB2YXIgbWF0Y2ggPSBEdXJhdGlvblJlZ2V4Lk1hdGNoKHRva2VuLlN0cmluZ1ZhbHVlKTsKLSAgICAgICAgICAgIGlmICghbWF0Y2guU3VjY2VzcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJJbnZhbGlkIER1cmF0aW9uIHZhbHVlOiAiICsgdG9rZW4uU3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHNpZ24gPSBtYXRjaC5Hcm91cHNbInNpZ24iXS5WYWx1ZTsKLSAgICAgICAgICAgIHZhciBzZWNvbmRzVGV4dCA9IG1hdGNoLkdyb3Vwc1siaW50Il0uVmFsdWU7Ci0gICAgICAgICAgICAvLyBQcm9oaWJpdCBsZWFkaW5nIGluc2lnbmZpY2FudCB6ZXJvZXMKLSAgICAgICAgICAgIGlmIChzZWNvbmRzVGV4dFswXSA9PSAnMCcgJiYgc2Vjb25kc1RleHQuTGVuZ3RoID4gMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJJbnZhbGlkIER1cmF0aW9uIHZhbHVlOiAiICsgdG9rZW4uU3RyaW5nVmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdmFyIHN1YnNlY29uZHMgPSBtYXRjaC5Hcm91cHNbInN1YnNlY29uZHMiXS5WYWx1ZTsKLSAgICAgICAgICAgIHZhciBtdWx0aXBsaWVyID0gc2lnbiA9PSAiLSIgPyAtMSA6IDE7Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgc2Vjb25kcyA9IGxvbmcuUGFyc2Uoc2Vjb25kc1RleHQsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpICogbXVsdGlwbGllcjsKLSAgICAgICAgICAgICAgICBpbnQgbmFub3MgPSAwOwotICAgICAgICAgICAgICAgIGlmIChzdWJzZWNvbmRzICE9ICIiKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVGhpcyBzaG91bGQgYWx3YXlzIHdvcmssIGFzIHdlJ3ZlIGdvdCAxLTkgZGlnaXRzLgotICAgICAgICAgICAgICAgICAgICBpbnQgcGFyc2VkRnJhY3Rpb24gPSBpbnQuUGFyc2Uoc3Vic2Vjb25kcy5TdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgICAgICAgICBuYW5vcyA9IHBhcnNlZEZyYWN0aW9uICogU3Vic2Vjb25kU2NhbGluZ0ZhY3RvcnNbc3Vic2Vjb25kcy5MZW5ndGhdICogbXVsdGlwbGllcjsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKCFEdXJhdGlvbi5Jc05vcm1hbGl6ZWQoc2Vjb25kcywgbmFub3MpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIkludmFsaWQgRHVyYXRpb24gdmFsdWU6IHt0b2tlbi5TdHJpbmdWYWx1ZX0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkc1tEdXJhdGlvbi5TZWNvbmRzRmllbGROdW1iZXJdLkFjY2Vzc29yLlNldFZhbHVlKG1lc3NhZ2UsIHNlY29uZHMpOwotICAgICAgICAgICAgICAgIG1lc3NhZ2UuRGVzY3JpcHRvci5GaWVsZHNbRHVyYXRpb24uTmFub3NGaWVsZE51bWJlcl0uQWNjZXNzb3IuU2V0VmFsdWUobWVzc2FnZSwgbmFub3MpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKEZvcm1hdEV4Y2VwdGlvbikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCQiSW52YWxpZCBEdXJhdGlvbiB2YWx1ZToge3Rva2VuLlN0cmluZ1ZhbHVlfSIpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBNZXJnZUZpZWxkTWFzayhJTWVzc2FnZSBtZXNzYWdlLCBKc29uVG9rZW4gdG9rZW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh0b2tlbi5UeXBlICE9IEpzb25Ub2tlbi5Ub2tlblR5cGUuU3RyaW5nVmFsdWUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiRXhwZWN0ZWQgc3RyaW5nIHZhbHVlIGZvciBGaWVsZE1hc2siKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE86IERvIHdlICp3YW50KiB0byByZW1vdmUgZW1wdHkgZW50cmllcz8gUHJvYmFibHkgb2theSB0byB0cmVhdCAiIiBhcyAibm8gcGF0aHMiLCBidXQgImZvbywsYmFyIj8KLSAgICAgICAgICAgIHN0cmluZ1tdIGpzb25QYXRocyA9IHRva2VuLlN0cmluZ1ZhbHVlLlNwbGl0KEZpZWxkTWFza1BhdGhTZXBhcmF0b3JzLCBTdHJpbmdTcGxpdE9wdGlvbnMuUmVtb3ZlRW1wdHlFbnRyaWVzKTsKLSAgICAgICAgICAgIElMaXN0IG1lc3NhZ2VQYXRocyA9IChJTGlzdCkgbWVzc2FnZS5EZXNjcmlwdG9yLkZpZWxkc1tGaWVsZE1hc2suUGF0aHNGaWVsZE51bWJlcl0uQWNjZXNzb3IuR2V0VmFsdWUobWVzc2FnZSk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgcGF0aCBpbiBqc29uUGF0aHMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZVBhdGhzLkFkZChUb1NuYWtlQ2FzZShwYXRoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIC8vIFBvcnRlZCBmcm9tIHNyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBUb1NuYWtlQ2FzZShzdHJpbmcgdGV4dCkKLSAgICAgICAgewotICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcih0ZXh0Lkxlbmd0aCAqIDIpOwotICAgICAgICAgICAgLy8gTm90ZTogdGhpcyBpcyBwcm9iYWJseSB1bm5lY2Vzc2FyeSBub3csIGJ1dCBjdXJyZW50bHkgcmV0YWluZWQgdG8gYmUgYXMgY2xvc2UgYXMgcG9zc2libGUgdG8gdGhlCi0gICAgICAgICAgICAvLyBDKyssIHdoaWxzdCBzdGlsbCB0aHJvd2luZyBhbiBleGNlcHRpb24gb24gdW5kZXJzY29yZXMuCi0gICAgICAgICAgICBib29sIHdhc05vdFVuZGVyc2NvcmUgPSBmYWxzZTsgIC8vIEluaXRpYWxpemUgdG8gZmFsc2UgZm9yIGNhc2UgMSAoYmVsb3cpCi0gICAgICAgICAgICBib29sIHdhc05vdENhcCA9IGZhbHNlOwotCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gdGV4dFtpXTsKLSAgICAgICAgICAgICAgICBpZiAoYyA+PSAnQScgJiYgYyA8PSAnWicpIC8vIGFzY2lpX2lzdXBwZXIKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENvbnNpZGVyIHdoZW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIEIgaXMgY2FwaXRhbGl6ZWQ6Ci0gICAgICAgICAgICAgICAgICAgIC8vIDEpIEF0IGJlZ2lubmluZyBvZiBpbnB1dDogICAiQi4uLiIgPT4gImIuLi4iCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIChlLmcuICJCaXNjdWl0IiA9PiAiYmlzY3VpdCIpCi0gICAgICAgICAgICAgICAgICAgIC8vIDIpIEZvbGxvd2luZyBhIGxvd2VyY2FzZTogICAiLi4uYUIuLi4iID0+ICIuLi5hX2IuLi4iCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIChlLmcuICJnQmlrZSIgPT4gImdfYmlrZSIpCi0gICAgICAgICAgICAgICAgICAgIC8vIDMpIEF0IHRoZSBlbmQgb2YgaW5wdXQ6ICAgICAiLi4uQUIiID0+ICIuLi5hYiIKLSAgICAgICAgICAgICAgICAgICAgLy8gICAgKGUuZy4gIkdvb2dsZUxBQiIgPT4gImdvb2dsZV9sYWIiKQotICAgICAgICAgICAgICAgICAgICAvLyA0KSBGb2xsb3dlZCBieSBhIGxvd2VyY2FzZTogIi4uLkFCYy4uLiIgPT4gIi4uLmFfYmMuLi4iCi0gICAgICAgICAgICAgICAgICAgIC8vICAgIChlLmcuICJHQmlrZSIgPT4gImdfYmlrZSIpCi0gICAgICAgICAgICAgICAgICAgIGlmICh3YXNOb3RVbmRlcnNjb3JlICYmICAgICAgICAgICAgICAgLy8gICAgICAgICAgICBjYXNlIDEgb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAod2FzTm90Q2FwIHx8ICAgICAgICAgICAgICAgICAgICAgLy8gY2FzZSAyIGluLCBjYXNlIDMgb3V0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKGkgKyAxIDwgdGV4dC5MZW5ndGggJiYgICAgICAgICAvLyAgICAgICAgICAgIGNhc2UgMyBvdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKHRleHRbaSArIDFdID49ICdhJyAmJiB0ZXh0W2kgKyAxXSA8PSAneicpKSkpIC8vIGFzY2lpX2lzbG93ZXIodGV4dFtpICsgMV0pCi0gICAgICAgICAgICAgICAgICAgIHsgIC8vIGNhc2UgNCBpbgotICAgICAgICAgICAgICAgICAgICAgICAvLyBXZSBhZGQgYW4gdW5kZXJzY29yZSBmb3IgY2FzZSAyIGFuZCBjYXNlIDQuCi0gICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgnXycpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIGFzY2lpX3RvbG93ZXIsIGJ1dCB3ZSBhbHJlYWR5IGtub3cgdGhhdCBjICppcyogYW4gdXBwZXIgY2FzZSBBU0NJSSBjaGFyYWN0ZXIuLi4KLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoKGNoYXIpIChjICsgJ2EnIC0gJ0EnKSk7Ci0gICAgICAgICAgICAgICAgICAgIHdhc05vdFVuZGVyc2NvcmUgPSB0cnVlOwotICAgICAgICAgICAgICAgICAgICB3YXNOb3RDYXAgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdfJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigkIkludmFsaWQgZmllbGQgbWFzazoge3RleHR9Iik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgd2FzTm90VW5kZXJzY29yZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgICAgIHdhc05vdENhcCA9IHRydWU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIGJ1aWxkZXIuVG9TdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgICAjZW5kcmVnaW9uCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU2V0dGluZ3MgY29udHJvbGxpbmcgSlNPTiBwYXJzaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIFNldHRpbmdzCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBEZWZhdWx0IHNldHRpbmdzLCBhcyB1c2VkIGJ5IDxzZWUgY3JlZj0iSnNvblBhcnNlci5EZWZhdWx0Ii8+LiBUaGlzIGhhcyB0aGUgc2FtZSBkZWZhdWx0Ci0gICAgICAgICAgICAvLy8gcmVjdXJzaW9uIGxpbWl0IGFzIDxzZWUgY3JlZj0iQ29kZWRJbnB1dFN0cmVhbSIvPiwgYW5kIGFuIGVtcHR5IHR5cGUgcmVnaXN0cnkuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgcHVibGljIHN0YXRpYyBTZXR0aW5ncyBEZWZhdWx0IHsgZ2V0OyB9Ci0KLSAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIHRoZSBNb25vIGNvbXBpbGVyIGNvbXBsYWluaW5nIGFib3V0IFhNTCBjb21tZW50cyBub3QgYmVpbmcgb24KLSAgICAgICAgICAgIC8vIHZhbGlkIGxhbmd1YWdlIGVsZW1lbnRzLgotICAgICAgICAgICAgc3RhdGljIFNldHRpbmdzKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBEZWZhdWx0ID0gbmV3IFNldHRpbmdzKENvZGVkSW5wdXRTdHJlYW0uRGVmYXVsdFJlY3Vyc2lvbkxpbWl0KTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFRoZSBtYXhpbXVtIGRlcHRoIG9mIG1lc3NhZ2VzIHRvIHBhcnNlLiBOb3RlIHRoYXQgdGhpcyBsaW1pdCBvbmx5IGFwcGxpZXMgdG8gcGFyc2luZwotICAgICAgICAgICAgLy8vIG1lc3NhZ2VzLCBub3QgY29sbGVjdGlvbnMgLSBzbyBhIG1lc3NhZ2Ugd2l0aGluIGEgY29sbGVjdGlvbiB3aXRoaW4gYSBtZXNzYWdlIG9ubHkgY291bnRzIGFzCi0gICAgICAgICAgICAvLy8gZGVwdGggMiwgbm90IDMuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgcHVibGljIGludCBSZWN1cnNpb25MaW1pdCB7IGdldDsgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gVGhlIHR5cGUgcmVnaXN0cnkgdXNlZCB0byBwYXJzZSA8c2VlIGNyZWY9IkFueSIvPiBtZXNzYWdlcy4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBwdWJsaWMgVHlwZVJlZ2lzdHJ5IFR5cGVSZWdpc3RyeSB7IGdldDsgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyA8c2VlIGNyZWY9IlNldHRpbmdzIi8+IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVjdXJzaW9uIGxpbWl0LgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVjdXJzaW9uTGltaXQiPlRoZSBtYXhpbXVtIGRlcHRoIG9mIG1lc3NhZ2VzIHRvIHBhcnNlPC9wYXJhbT4KLSAgICAgICAgICAgIHB1YmxpYyBTZXR0aW5ncyhpbnQgcmVjdXJzaW9uTGltaXQpIDogdGhpcyhyZWN1cnNpb25MaW1pdCwgVHlwZVJlZ2lzdHJ5LkVtcHR5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyA8c2VlIGNyZWY9IlNldHRpbmdzIi8+IG9iamVjdCB3aXRoIHRoZSBzcGVjaWZpZWQgcmVjdXJzaW9uIGxpbWl0IGFuZCB0eXBlIHJlZ2lzdHJ5LgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmVjdXJzaW9uTGltaXQiPlRoZSBtYXhpbXVtIGRlcHRoIG9mIG1lc3NhZ2VzIHRvIHBhcnNlPC9wYXJhbT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idHlwZVJlZ2lzdHJ5Ij5UaGUgdHlwZSByZWdpc3RyeSB1c2VkIHRvIHBhcnNlIDxzZWUgY3JlZj0iQW55Ii8+IG1lc3NhZ2VzPC9wYXJhbT4KLSAgICAgICAgICAgIHB1YmxpYyBTZXR0aW5ncyhpbnQgcmVjdXJzaW9uTGltaXQsIFR5cGVSZWdpc3RyeSB0eXBlUmVnaXN0cnkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgUmVjdXJzaW9uTGltaXQgPSByZWN1cnNpb25MaW1pdDsKLSAgICAgICAgICAgICAgICBUeXBlUmVnaXN0cnkgPSBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHR5cGVSZWdpc3RyeSwgbmFtZW9mKHR5cGVSZWdpc3RyeSkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvSnNvblRva2VuLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvSnNvblRva2VuLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzAxMzhjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL0pzb25Ub2tlbi5jcworKysgL2Rldi9udWxsCkBAIC0xLDE2NiArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICBpbnRlcm5hbCBzZWFsZWQgY2xhc3MgSnNvblRva2VuIDogSUVxdWF0YWJsZTxKc29uVG9rZW4+Ci0gICAgewotICAgICAgICAvLyBUb2tlbnMgd2l0aCBubyB2YWx1ZSBjYW4gYmUgcmV1c2VkLgotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBKc29uVG9rZW4gX3RydWUgPSBuZXcgSnNvblRva2VuKFRva2VuVHlwZS5UcnVlKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSnNvblRva2VuIF9mYWxzZSA9IG5ldyBKc29uVG9rZW4oVG9rZW5UeXBlLkZhbHNlKTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSnNvblRva2VuIF9udWxsID0gbmV3IEpzb25Ub2tlbihUb2tlblR5cGUuTnVsbCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEpzb25Ub2tlbiBzdGFydE9iamVjdCA9IG5ldyBKc29uVG9rZW4oVG9rZW5UeXBlLlN0YXJ0T2JqZWN0KTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSnNvblRva2VuIGVuZE9iamVjdCA9IG5ldyBKc29uVG9rZW4oVG9rZW5UeXBlLkVuZE9iamVjdCk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEpzb25Ub2tlbiBzdGFydEFycmF5ID0gbmV3IEpzb25Ub2tlbihUb2tlblR5cGUuU3RhcnRBcnJheSk7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEpzb25Ub2tlbiBlbmRBcnJheSA9IG5ldyBKc29uVG9rZW4oVG9rZW5UeXBlLkVuZEFycmF5KTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgSnNvblRva2VuIGVuZERvY3VtZW50ID0gbmV3IEpzb25Ub2tlbihUb2tlblR5cGUuRW5kRG9jdW1lbnQpOwotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBKc29uVG9rZW4gTnVsbCB7IGdldCB7IHJldHVybiBfbnVsbDsgfSB9Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBKc29uVG9rZW4gRmFsc2UgeyBnZXQgeyByZXR1cm4gX2ZhbHNlOyB9IH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEpzb25Ub2tlbiBUcnVlIHsgZ2V0IHsgcmV0dXJuIF90cnVlOyB9IH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEpzb25Ub2tlbiBTdGFydE9iamVjdHsgZ2V0IHsgcmV0dXJuIHN0YXJ0T2JqZWN0OyB9IH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEpzb25Ub2tlbiBFbmRPYmplY3QgeyBnZXQgeyByZXR1cm4gZW5kT2JqZWN0OyB9IH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEpzb25Ub2tlbiBTdGFydEFycmF5IHsgZ2V0IHsgcmV0dXJuIHN0YXJ0QXJyYXk7IH0gfQotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSnNvblRva2VuIEVuZEFycmF5IHsgZ2V0IHsgcmV0dXJuIGVuZEFycmF5OyB9IH0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEpzb25Ub2tlbiBFbmREb2N1bWVudCB7IGdldCB7IHJldHVybiBlbmREb2N1bWVudDsgfSB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEpzb25Ub2tlbiBOYW1lKHN0cmluZyBuYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEpzb25Ub2tlbihUb2tlblR5cGUuTmFtZSwgc3RyaW5nVmFsdWU6IG5hbWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEpzb25Ub2tlbiBWYWx1ZShzdHJpbmcgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSnNvblRva2VuKFRva2VuVHlwZS5TdHJpbmdWYWx1ZSwgc3RyaW5nVmFsdWU6IHZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBKc29uVG9rZW4gVmFsdWUoZG91YmxlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEpzb25Ub2tlbihUb2tlblR5cGUuTnVtYmVyLCBudW1iZXJWYWx1ZTogdmFsdWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgZW51bSBUb2tlblR5cGUKLSAgICAgICAgewotICAgICAgICAgICAgTnVsbCwKLSAgICAgICAgICAgIEZhbHNlLAotICAgICAgICAgICAgVHJ1ZSwKLSAgICAgICAgICAgIFN0cmluZ1ZhbHVlLAotICAgICAgICAgICAgTnVtYmVyLAotICAgICAgICAgICAgTmFtZSwKLSAgICAgICAgICAgIFN0YXJ0T2JqZWN0LAotICAgICAgICAgICAgRW5kT2JqZWN0LAotICAgICAgICAgICAgU3RhcnRBcnJheSwKLSAgICAgICAgICAgIEVuZEFycmF5LAotICAgICAgICAgICAgRW5kRG9jdW1lbnQKLSAgICAgICAgfQotCi0gICAgICAgIC8vIEEgdmFsdWUgaXMgYSBzdHJpbmcsIG51bWJlciwgYXJyYXksIG9iamVjdCwgbnVsbCwgdHJ1ZSBvciBmYWxzZQotICAgICAgICAvLyBBcnJheXMgYW5kIG9iamVjdHMgaGF2ZSBzdGFydC9lbmQKLSAgICAgICAgLy8gQSBkb2N1bWVudCBjb25zaXN0cyBvZiBhIHZhbHVlCi0gICAgICAgIC8vIE9iamVjdHMgYXJlIG5hbWUvdmFsdWUgc2VxdWVuY2VzLgotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVG9rZW5UeXBlIHR5cGU7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIHN0cmluZ1ZhbHVlOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IGRvdWJsZSBudW1iZXJWYWx1ZTsKLQotICAgICAgICBpbnRlcm5hbCBUb2tlblR5cGUgVHlwZSB7IGdldCB7IHJldHVybiB0eXBlOyB9IH0KLSAgICAgICAgaW50ZXJuYWwgc3RyaW5nIFN0cmluZ1ZhbHVlIHsgZ2V0IHsgcmV0dXJuIHN0cmluZ1ZhbHVlOyB9IH0KLSAgICAgICAgaW50ZXJuYWwgZG91YmxlIE51bWJlclZhbHVlIHsgZ2V0IHsgcmV0dXJuIG51bWJlclZhbHVlOyB9IH0KLQotICAgICAgICBwcml2YXRlIEpzb25Ub2tlbihUb2tlblR5cGUgdHlwZSwgc3RyaW5nIHN0cmluZ1ZhbHVlID0gbnVsbCwgZG91YmxlIG51bWJlclZhbHVlID0gMCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgICAgICAgIHRoaXMuc3RyaW5nVmFsdWUgPSBzdHJpbmdWYWx1ZTsKLSAgICAgICAgICAgIHRoaXMubnVtYmVyVmFsdWUgPSBudW1iZXJWYWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb2JqKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRXF1YWxzKG9iaiBhcyBKc29uVG9rZW4pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHVuY2hlY2tlZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBoYXNoID0gMTc7Ci0gICAgICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAzMSArIChpbnQpIHR5cGU7Ci0gICAgICAgICAgICAgICAgaGFzaCA9IGhhc2ggKiAzMSArIHN0cmluZ1ZhbHVlID09IG51bGwgPyAwIDogc3RyaW5nVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICBoYXNoID0gaGFzaCAqIDMxICsgbnVtYmVyVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBUb2tlblR5cGUuTnVsbDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJudWxsIjsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5UcnVlOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInRydWUiOwotICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLkZhbHNlOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImZhbHNlIjsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5OYW1lOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gIm5hbWUgKCIgKyBzdHJpbmdWYWx1ZSArICIpIjsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5TdHJpbmdWYWx1ZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJ2YWx1ZSAoIiArIHN0cmluZ1ZhbHVlICsgIikiOwotICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLk51bWJlcjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJudW1iZXIgKCIgKyBudW1iZXJWYWx1ZSArICIpIjsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5TdGFydE9iamVjdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJzdGFydC1vYmplY3QiOwotICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLkVuZE9iamVjdDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlbmQtb2JqZWN0IjsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5TdGFydEFycmF5OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gInN0YXJ0LWFycmF5IjsKLSAgICAgICAgICAgICAgICBjYXNlIFRva2VuVHlwZS5FbmRBcnJheToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuICJlbmQtYXJyYXkiOwotICAgICAgICAgICAgICAgIGNhc2UgVG9rZW5UeXBlLkVuZERvY3VtZW50OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gImVuZC1kb2N1bWVudCI7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlRva2VuIGlzIG9mIHVua25vd24gdHlwZSAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoSnNvblRva2VuIG90aGVyKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBOb3RlIHVzZSBvZiBvdGhlci5udW1iZXJWYWx1ZS5FcXVhbHMgcmF0aGVyIHRoYW4gPT0sIHNvIHRoYXQgTmFOIGNvbXBhcmVzIGFwcHJvcHJpYXRlbHkuCi0gICAgICAgICAgICByZXR1cm4gb3RoZXIudHlwZSA9PSB0eXBlICYmIG90aGVyLnN0cmluZ1ZhbHVlID09IHN0cmluZ1ZhbHVlICYmIG90aGVyLm51bWJlclZhbHVlLkVxdWFscyhudW1iZXJWYWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Kc29uVG9rZW5pemVyLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvSnNvblRva2VuaXplci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDlhNmQ0My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Kc29uVG9rZW5pemVyLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzM4ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5HbG9iYWxpemF0aW9uOwotdXNpbmcgU3lzdGVtLklPOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFNpbXBsZSBidXQgc3RyaWN0IEpTT04gdG9rZW5pemVyLCByaWdpZGx5IGZvbGxvd2luZyBSRkMgNzE1OS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIC8vLyA8cmVtYXJrcz4KLSAgICAvLy8gPHBhcmE+Ci0gICAgLy8vIFRoaXMgdG9rZW5pemVyIGlzIHN0YXRlZnVsLCBhbmQgb25seSByZXR1cm5zICJ1c2VmdWwiIHRva2VucyAtIG5hbWVzLCB2YWx1ZXMgZXRjLgotICAgIC8vLyBJdCBkb2VzIG5vdCBjcmVhdGUgdG9rZW5zIGZvciB0aGUgc2VwYXJhdG9yIGJldHdlZW4gbmFtZXMgYW5kIHZhbHVlcywgb3IgZm9yIHRoZSBjb21tYQotICAgIC8vLyBiZXR3ZWVuIHZhbHVlcy4gSXQgdmFsaWRhdGVzIHRoZSB0b2tlbiBzdHJlYW0gYXMgaXQgZ29lcyAtIHNvIGNhbGxlcnMgY2FuIGFzc3VtZSB0aGF0IHRoZQotICAgIC8vLyB0b2tlbnMgaXQgcHJvZHVjZXMgYXJlIGFwcHJvcHJpYXRlLiBGb3IgZXhhbXBsZSwgaXQgd291bGQgbmV2ZXIgcHJvZHVjZSAic3RhcnQgb2JqZWN0LCBlbmQgYXJyYXkuIgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDxwYXJhPkltcGxlbWVudGF0aW9uIGRldGFpbHM6IHRoZSBiYXNlIGNsYXNzIGhhbmRsZXMgc2luZ2xlIHRva2VuIHB1c2gtYmFjayBhbmQgPC9wYXJhPgotICAgIC8vLyA8cGFyYT5Ob3QgdGhyZWFkLXNhZmUuPC9wYXJhPgotICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgaW50ZXJuYWwgYWJzdHJhY3QgY2xhc3MgSnNvblRva2VuaXplcgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBKc29uVG9rZW4gYnVmZmVyZWRUb2tlbjsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgQ3JlYXRlcyBhIHRva2VuaXplciB0aGF0IHJlYWRzIGZyb20gdGhlIGdpdmVuIHRleHQgcmVhZGVyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSnNvblRva2VuaXplciBGcm9tVGV4dFJlYWRlcihUZXh0UmVhZGVyIHJlYWRlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBKc29uVGV4dFRva2VuaXplcihyZWFkZXIpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIHRva2VuaXplciB0aGF0IGZpcnN0IHJlcGxheXMgdGhlIGdpdmVuIGxpc3Qgb2YgdG9rZW5zLCB0aGVuIGNvbnRpbnVlcyByZWFkaW5nCi0gICAgICAgIC8vLyBmcm9tIGFub3RoZXIgdG9rZW5pemVyLiBOb3RlIHRoYXQgaWYgdGhlIHJldHVybmVkIHRva2VuaXplciBpcyAicHVzaGVkIGJhY2siLCB0aGF0IGRvZXMgbm90IHB1c2ggYmFjawotICAgICAgICAvLy8gb24gdGhlIGNvbnRpbnVhdGlvbiB0b2tlbml6ZXIsIG9yIHZpY2UgdmVyc2EuIENhcmUgc2hvdWxkIGJlIHRha2VuIHdoZW4gdXNpbmcgdGhpcyBtZXRob2QgLSBpdCB3YXMKLSAgICAgICAgLy8vIGNyZWF0ZWQgZm9yIHRoZSBzYWtlIG9mIEFueSBwYXJzaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSnNvblRva2VuaXplciBGcm9tUmVwbGF5ZWRUb2tlbnMoSUxpc3Q8SnNvblRva2VuPiB0b2tlbnMsIEpzb25Ub2tlbml6ZXIgY29udGludWF0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEpzb25SZXBsYXlUb2tlbml6ZXIodG9rZW5zLCBjb250aW51YXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZGVwdGggb2YgdGhlIHN0YWNrLCBwdXJlbHkgaW4gb2JqZWN0cyAobm90IGNvbGxlY3Rpb25zKS4KLSAgICAgICAgLy8vIEluZm9ybWFsbHksIHRoaXMgaXMgdGhlIG51bWJlciBvZiByZW1haW5pbmcgdW5jbG9zZWQgJ3snIGNoYXJhY3RlcnMgd2UgaGF2ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgaW50IE9iamVjdERlcHRoIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotCi0gICAgICAgIC8vIFRPRE86IFdoeSBkbyB3ZSBhbGxvdyBhIGRpZmZlcmVudCB0b2tlbiB0byBiZSBwdXNoZWQgYmFjaz8gSXQgbWlnaHQgYmUgYmV0dGVyIHRvIGFsd2F5cyByZW1lbWJlciB0aGUgcHJldmlvdXMKLSAgICAgICAgLy8gdG9rZW4gcmV0dXJuZWQsIGFuZCBhbGxvdyBhIHBhcmFtZXRlcmxlc3MgUmV3aW5kKCkgbWV0aG9kICh3aGljaCBjb3VsZCBvbmx5IGJlIGNhbGxlZCBvbmNlLCBqdXN0IGxpa2UgdGhlIGN1cnJlbnQgUHVzaEJhY2spLgotICAgICAgICBpbnRlcm5hbCB2b2lkIFB1c2hCYWNrKEpzb25Ub2tlbiB0b2tlbikKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkVG9rZW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiQ2FuJ3QgcHVzaCBiYWNrIHR3aWNlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBidWZmZXJlZFRva2VuID0gdG9rZW47Ci0gICAgICAgICAgICBpZiAodG9rZW4uVHlwZSA9PSBKc29uVG9rZW4uVG9rZW5UeXBlLlN0YXJ0T2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdERlcHRoLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlIGlmICh0b2tlbi5UeXBlID09IEpzb25Ub2tlbi5Ub2tlblR5cGUuRW5kT2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdERlcHRoKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBuZXh0IEpTT04gdG9rZW4gaW4gdGhlIHN0cmVhbS4gQW4gRW5kRG9jdW1lbnQgdG9rZW4gaXMgcmV0dXJuZWQgdG8gaW5kaWNhdGUgdGhlIGVuZCBvZiB0aGUgc3RyZWFtLAotICAgICAgICAvLy8gYWZ0ZXIgd2hpY2ggcG9pbnQgPGM+TmV4dCgpPC9jPiBzaG91bGQgbm90IGJlIGNhbGxlZCBhZ2Fpbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPlRoaXMgaW1wbGVtZW50YXRpb24gcHJvdmlkZXMgc2luZ2xlLXRva2VuIGJ1ZmZlcmluZywgYW5kIGNhbGxzIDxzZWUgY3JlZj0iTmV4dEltcGwiLz4gaWYgdGhlcmUgaXMgbm8gYnVmZmVyZWQgdG9rZW4uPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5leHQgdG9rZW4gaW4gdGhlIHN0cmVhbS4gVGhpcyBpcyBuZXZlciBudWxsLjwvcmV0dXJucz4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiI+VGhpcyBtZXRob2QgaXMgY2FsbGVkIGFmdGVyIGFuIEVuZERvY3VtZW50IHRva2VuIGhhcyBiZWVuIHJldHVybmVkPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRKc29uRXhjZXB0aW9uIj5UaGUgaW5wdXQgdGV4dCBkb2VzIG5vdCBjb21wbHkgd2l0aCBSRkMgNzE1OTwvZXhjZXB0aW9uPgotICAgICAgICBpbnRlcm5hbCBKc29uVG9rZW4gTmV4dCgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEpzb25Ub2tlbiB0b2tlblRvUmV0dXJuOwotICAgICAgICAgICAgaWYgKGJ1ZmZlcmVkVG9rZW4gIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b2tlblRvUmV0dXJuID0gYnVmZmVyZWRUb2tlbjsKLSAgICAgICAgICAgICAgICBidWZmZXJlZFRva2VuID0gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0b2tlblRvUmV0dXJuID0gTmV4dEltcGwoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICh0b2tlblRvUmV0dXJuLlR5cGUgPT0gSnNvblRva2VuLlRva2VuVHlwZS5TdGFydE9iamVjdCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBPYmplY3REZXB0aCsrOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZSBpZiAodG9rZW5Ub1JldHVybi5UeXBlID09IEpzb25Ub2tlbi5Ub2tlblR5cGUuRW5kT2JqZWN0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIE9iamVjdERlcHRoLS07Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdG9rZW5Ub1JldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIG5leHQgSlNPTiB0b2tlbiBpbiB0aGUgc3RyZWFtLCB3aGVuIHJlcXVlc3RlZCBieSB0aGUgYmFzZSBjbGFzcy4gKFRoZSA8c2VlIGNyZWY9Ik5leHQiLz4gbWV0aG9kIGRlbGVnYXRlcwotICAgICAgICAvLy8gdG8gdGhpcyBpZiBpdCBkb2Vzbid0IGhhdmUgYSBidWZmZXJlZCB0b2tlbi4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iPlRoaXMgbWV0aG9kIGlzIGNhbGxlZCBhZnRlciBhbiBFbmREb2N1bWVudCB0b2tlbiBoYXMgYmVlbiByZXR1cm5lZDwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkSnNvbkV4Y2VwdGlvbiI+VGhlIGlucHV0IHRleHQgZG9lcyBub3QgY29tcGx5IHdpdGggUkZDIDcxNTk8L2V4Y2VwdGlvbj4KLSAgICAgICAgcHJvdGVjdGVkIGFic3RyYWN0IEpzb25Ub2tlbiBOZXh0SW1wbCgpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRva2VuaXplciB3aGljaCBmaXJzdCBleGhhdXN0cyBhIGxpc3Qgb2YgdG9rZW5zLCB0aGVuIGNvbnN1bHRzIGFub3RoZXIgdG9rZW5pemVyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIGNsYXNzIEpzb25SZXBsYXlUb2tlbml6ZXIgOiBKc29uVG9rZW5pemVyCi0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8SnNvblRva2VuPiB0b2tlbnM7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEpzb25Ub2tlbml6ZXIgbmV4dFRva2VuaXplcjsKLSAgICAgICAgICAgIHByaXZhdGUgaW50IG5leHRUb2tlbkluZGV4OwotCi0gICAgICAgICAgICBpbnRlcm5hbCBKc29uUmVwbGF5VG9rZW5pemVyKElMaXN0PEpzb25Ub2tlbj4gdG9rZW5zLCBKc29uVG9rZW5pemVyIG5leHRUb2tlbml6ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy50b2tlbnMgPSB0b2tlbnM7Ci0gICAgICAgICAgICAgICAgdGhpcy5uZXh0VG9rZW5pemVyID0gbmV4dFRva2VuaXplcjsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gRklYTUU6IE9iamVjdCBkZXB0aCBub3QgbWFpbnRhaW5lZC4uLgotICAgICAgICAgICAgcHJvdGVjdGVkIG92ZXJyaWRlIEpzb25Ub2tlbiBOZXh0SW1wbCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKG5leHRUb2tlbkluZGV4ID49IHRva2Vucy5Db3VudCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0VG9rZW5pemVyLk5leHQoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHRva2Vuc1tuZXh0VG9rZW5JbmRleCsrXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRva2VuaXplciB3aGljaCBkb2VzIGFsbCB0aGUgKnJlYWwqIHdvcmsgb2YgcGFyc2luZyBKU09OLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHNlYWxlZCBjbGFzcyBKc29uVGV4dFRva2VuaXplciA6IEpzb25Ub2tlbml6ZXIKLSAgICAgICAgewotICAgICAgICAgICAgLy8gVGhlIHNldCBvZiBzdGF0ZXMgaW4gd2hpY2ggYSB2YWx1ZSBpcyB2YWxpZCBuZXh0IHRva2VuLgotICAgICAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgU3RhdGUgVmFsdWVTdGF0ZXMgPSBTdGF0ZS5BcnJheVN0YXJ0IHwgU3RhdGUuQXJyYXlBZnRlckNvbW1hIHwgU3RhdGUuT2JqZWN0QWZ0ZXJDb2xvbiB8IFN0YXRlLlN0YXJ0T2ZEb2N1bWVudDsKLQotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTdGFjazxDb250YWluZXJUeXBlPiBjb250YWluZXJTdGFjayA9IG5ldyBTdGFjazxDb250YWluZXJUeXBlPigpOwotICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBQdXNoQmFja1JlYWRlciByZWFkZXI7Ci0gICAgICAgICAgICBwcml2YXRlIFN0YXRlIHN0YXRlOwotCi0gICAgICAgICAgICBpbnRlcm5hbCBKc29uVGV4dFRva2VuaXplcihUZXh0UmVhZGVyIHJlYWRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLnJlYWRlciA9IG5ldyBQdXNoQmFja1JlYWRlcihyZWFkZXIpOwotICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuU3RhcnRPZkRvY3VtZW50OwotICAgICAgICAgICAgICAgIGNvbnRhaW5lclN0YWNrLlB1c2goQ29udGFpbmVyVHlwZS5Eb2N1bWVudCk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgICAgIC8vLyBUaGlzIG1ldGhvZCBlc3NlbnRpYWxseSBqdXN0IGxvb3BzIHRocm91Z2ggY2hhcmFjdGVycyBza2lwcGluZyB3aGl0ZXNwYWNlLCB2YWxpZGF0aW5nIGFuZAotICAgICAgICAgICAgLy8vIGNoYW5naW5nIHN0YXRlIChlLmcuIGZyb20gT2JqZWN0QmVmb3JlQ29sb24gdG8gT2JqZWN0QWZ0ZXJDb2xvbikKLSAgICAgICAgICAgIC8vLyB1bnRpbCBpdCByZWFjaGVzIHNvbWV0aGluZyB3aGljaCB3aWxsIGJlIGEgZ2VudWluZSB0b2tlbiAoZS5nLiBhIHN0YXJ0IG9iamVjdCwgb3IgYSB2YWx1ZSkgYXQgd2hpY2ggcG9pbnQKLSAgICAgICAgICAgIC8vLyBpdCByZXR1cm5zIHRoZSB0b2tlbi4gQWx0aG91Z2ggdGhlIG1ldGhvZCBpcyBsYXJnZSwgaXQgd291bGQgYmUgcmVsYXRpdmVseSBoYXJkIHRvIGJyZWFrIGRvd24gZnVydGhlci4uLiBtb3N0Ci0gICAgICAgICAgICAvLy8gb2YgaXQgaXMgdGhlIGxhcmdlIHN3aXRjaCBzdGF0ZW1lbnQsIHdoaWNoIHNvbWV0aW1lcyByZXR1cm5zIGFuZCBzb21ldGltZXMgZG9lc24ndC4KLSAgICAgICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgICAgICBwcm90ZWN0ZWQgb3ZlcnJpZGUgSnNvblRva2VuIE5leHRJbXBsKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAoc3RhdGUgPT0gU3RhdGUuUmVhZGVyRXhoYXVzdGVkKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIk5leHQoKSBjYWxsZWQgYWZ0ZXIgZW5kIG9mIGRvY3VtZW50Iik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIG5leHQgPSByZWFkZXIuUmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZVN0YXRlKFN0YXRlLkV4cGVjdGVkRW5kT2ZEb2N1bWVudCwgIlVuZXhwZWN0ZWQgZW5kIG9mIGRvY3VtZW50IGluIHN0YXRlOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuUmVhZGVyRXhoYXVzdGVkOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzb25Ub2tlbi5FbmREb2N1bWVudDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKG5leHQuVmFsdWUpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNraXAgd2hpdGVzcGFjZSBiZXR3ZWVuIHRva2VucwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnICc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcdCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdccic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICdcbic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc6JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZVN0YXRlKFN0YXRlLk9iamVjdEJlZm9yZUNvbG9uLCAiSW52YWxpZCBzdGF0ZSB0byByZWFkIGEgY29sb246ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuT2JqZWN0QWZ0ZXJDb2xvbjsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJywnOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlU3RhdGUoU3RhdGUuT2JqZWN0QWZ0ZXJQcm9wZXJ0eSB8IFN0YXRlLkFycmF5QWZ0ZXJWYWx1ZSwgIkludmFsaWQgc3RhdGUgdG8gcmVhZCBhIGNvbG9uOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IHN0YXRlID09IFN0YXRlLk9iamVjdEFmdGVyUHJvcGVydHkgPyBTdGF0ZS5PYmplY3RBZnRlckNvbW1hIDogU3RhdGUuQXJyYXlBZnRlckNvbW1hOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnIic6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIHN0cmluZ1ZhbHVlID0gUmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoc3RhdGUgJiAoU3RhdGUuT2JqZWN0U3RhcnQgfCBTdGF0ZS5PYmplY3RBZnRlckNvbW1hKSkgIT0gMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuT2JqZWN0QmVmb3JlQ29sb247Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKc29uVG9rZW4uTmFtZShzdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlQW5kTW9kaWZ5U3RhdGVGb3JWYWx1ZSgiSW52YWxpZCBzdGF0ZSB0byByZWFkIGEgZG91YmxlIHF1b3RlOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzb25Ub2tlbi5WYWx1ZShzdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAneyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVTdGF0ZShWYWx1ZVN0YXRlcywgIkludmFsaWQgc3RhdGUgdG8gcmVhZCBhbiBvcGVuIGJyYWNlOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLk9iamVjdFN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclN0YWNrLlB1c2goQ29udGFpbmVyVHlwZS5PYmplY3QpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKc29uVG9rZW4uU3RhcnRPYmplY3Q7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICd9JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZVN0YXRlKFN0YXRlLk9iamVjdEFmdGVyUHJvcGVydHkgfCBTdGF0ZS5PYmplY3RTdGFydCwgIkludmFsaWQgc3RhdGUgdG8gcmVhZCBhIGNsb3NlIGJyYWNlOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBQb3BDb250YWluZXIoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSnNvblRva2VuLkVuZE9iamVjdDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ1snOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbGlkYXRlU3RhdGUoVmFsdWVTdGF0ZXMsICJJbnZhbGlkIHN0YXRlIHRvIHJlYWQgYW4gb3BlbiBzcXVhcmUgYnJhY2tldDogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5BcnJheVN0YXJ0OwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5lclN0YWNrLlB1c2goQ29udGFpbmVyVHlwZS5BcnJheSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzb25Ub2tlbi5TdGFydEFycmF5OwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnXSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVTdGF0ZShTdGF0ZS5BcnJheUFmdGVyVmFsdWUgfCBTdGF0ZS5BcnJheVN0YXJ0LCAiSW52YWxpZCBzdGF0ZSB0byByZWFkIGEgY2xvc2Ugc3F1YXJlIGJyYWNrZXQ6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBvcENvbnRhaW5lcigpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKc29uVG9rZW4uRW5kQXJyYXk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICduJzogLy8gU3RhcnQgb2YgbnVsbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN1bWVMaXRlcmFsKCJudWxsIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVBbmRNb2RpZnlTdGF0ZUZvclZhbHVlKCJJbnZhbGlkIHN0YXRlIHRvIHJlYWQgYSBudWxsIGxpdGVyYWw6ICIpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBKc29uVG9rZW4uTnVsbDsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOiAvLyBTdGFydCBvZiB0cnVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZUxpdGVyYWwoInRydWUiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZUFuZE1vZGlmeVN0YXRlRm9yVmFsdWUoIkludmFsaWQgc3RhdGUgdG8gcmVhZCBhIHRydWUgbGl0ZXJhbDogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzb25Ub2tlbi5UcnVlOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnZic6IC8vIFN0YXJ0IG9mIGZhbHNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3VtZUxpdGVyYWwoImZhbHNlIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVmFsaWRhdGVBbmRNb2RpZnlTdGF0ZUZvclZhbHVlKCJJbnZhbGlkIHN0YXRlIHRvIHJlYWQgYSBmYWxzZSBsaXRlcmFsOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gSnNvblRva2VuLkZhbHNlOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnLSc6IC8vIFN0YXJ0IG9mIGEgbnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICcwJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzEnOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnMic6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICczJzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzQnOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnNSc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc2JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgJzcnOgotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAnOCc6Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlICc5JzoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgbnVtYmVyID0gUmVhZE51bWJlcihuZXh0LlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBWYWxpZGF0ZUFuZE1vZGlmeVN0YXRlRm9yVmFsdWUoIkludmFsaWQgc3RhdGUgdG8gcmVhZCBhIG51bWJlciB0b2tlbjogIik7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEpzb25Ub2tlbi5WYWx1ZShudW1iZXIpOwotICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEpzb25FeGNlcHRpb24oIkludmFsaWQgZmlyc3QgY2hhcmFjdGVyIG9mIHRva2VuOiAiICsgbmV4dC5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZVN0YXRlKFN0YXRlIHZhbGlkU3RhdGVzLCBzdHJpbmcgZXJyb3JQcmVmaXgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCh2YWxpZFN0YXRlcyAmIHN0YXRlKSA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVhZGVyLkNyZWF0ZUV4Y2VwdGlvbihlcnJvclByZWZpeCArIHN0YXRlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBSZWFkcyBhIHN0cmluZyB0b2tlbi4gSXQgaXMgYXNzdW1lZCB0aGF0IHRoZSBvcGVuaW5nICIgaGFzIGFscmVhZHkgYmVlbiByZWFkLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHByaXZhdGUgc3RyaW5nIFJlYWRTdHJpbmcoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB2YWx1ZSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgICAgICAgICAgYm9vbCBoYXZlSGlnaFN1cnJvZ2F0ZSA9IGZhbHNlOwotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhciBjID0gcmVhZGVyLlJlYWRPckZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIHRleHQgd2hpbGUgcmVhZGluZyBzdHJpbmciKTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGMgPCAnICcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlYWRlci5DcmVhdGVFeGNlcHRpb24oc3RyaW5nLkZvcm1hdChDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlLCAiSW52YWxpZCBjaGFyYWN0ZXIgaW4gc3RyaW5nIGxpdGVyYWw6IFUrezA6eDR9IiwgKGludCkgYykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICciJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVIaWdoU3Vycm9nYXRlKQotICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlYWRlci5DcmVhdGVFeGNlcHRpb24oIkludmFsaWQgdXNlIG9mIHN1cnJvZ2F0ZSBwYWlyIGNvZGUgdW5pdHMiKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZS5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID09ICdcXCcpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPSBSZWFkRXNjYXBlZENoYXJhY3RlcigpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IENvbnNpZGVyIG9ubHkgYWxsb3dpbmcgc3Vycm9nYXRlIHBhaXJzIHRoYXQgYXJlIGVpdGhlciBib3RoIGVzY2FwZWQsCi0gICAgICAgICAgICAgICAgICAgIC8vIG9yIGJvdGggbm90IGVzY2FwZWQuIEl0IHdvdWxkIGJlIGEgdmVyeSBvZGQgdGV4dCBzdHJlYW0gdGhhdCBjb250YWluZWQgYSAibG9uZSIgaGlnaCBzdXJyb2dhdGUKLSAgICAgICAgICAgICAgICAgICAgLy8gZm9sbG93ZWQgYnkgYW4gZXNjYXBlZCBsb3cgc3Vycm9nYXRlIG9yIHZpY2UgdmVyc2EuLi4gYW5kIHRoYXQgY291bGRuJ3QgZXZlbiBiZSByZXByZXNlbnRlZCBpbiBVVEYtOC4KLSAgICAgICAgICAgICAgICAgICAgaWYgKGhhdmVIaWdoU3Vycm9nYXRlICE9IGNoYXIuSXNMb3dTdXJyb2dhdGUoYykpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJlYWRlci5DcmVhdGVFeGNlcHRpb24oIkludmFsaWQgdXNlIG9mIHN1cnJvZ2F0ZSBwYWlyIGNvZGUgdW5pdHMiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBoYXZlSGlnaFN1cnJvZ2F0ZSA9IGNoYXIuSXNIaWdoU3Vycm9nYXRlKGMpOwotICAgICAgICAgICAgICAgICAgICB2YWx1ZS5BcHBlbmQoYyk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gUmVhZHMgYW4gZXNjYXBlZCBjaGFyYWN0ZXIuIEl0IGlzIGFzc3VtZWQgdGhhdCB0aGUgbGVhZGluZyBiYWNrc2xhc2ggaGFzIGFscmVhZHkgYmVlbiByZWFkLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHByaXZhdGUgY2hhciBSZWFkRXNjYXBlZENoYXJhY3RlcigpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gcmVhZGVyLlJlYWRPckZhaWwoIlVuZXhwZWN0ZWQgZW5kIG9mIHRleHQgd2hpbGUgcmVhZGluZyBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlIik7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChjKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnbic6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJ1xuJzsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnXFwnOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcXCc7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2InOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcYic7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ2YnOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcZic7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3InOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdccic7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJ3QnOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICdcdCc7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgJyInOgotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuICciJzsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSAnLyc6Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gJy8nOwotICAgICAgICAgICAgICAgICAgICBjYXNlICd1JzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBSZWFkVW5pY29kZUVzY2FwZSgpOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVhZGVyLkNyZWF0ZUV4Y2VwdGlvbihzdHJpbmcuRm9ybWF0KEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsICJJbnZhbGlkIGNoYXJhY3RlciBpbiBjaGFyYWN0ZXIgZXNjYXBlIHNlcXVlbmNlOiBVK3swOng0fSIsIChpbnQpIGMpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBSZWFkcyBhbiBlc2NhcGVkIFVuaWNvZGUgNC1ueWJibGUgaGV4IHNlcXVlbmNlLiBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGxlYWRpbmcgXHUgaGFzIGFscmVhZHkgYmVlbiByZWFkLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHByaXZhdGUgY2hhciBSZWFkVW5pY29kZUVzY2FwZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyIGMgPSByZWFkZXIuUmVhZE9yRmFpbCgiVW5leHBlY3RlZCBlbmQgb2YgdGV4dCB3aGlsZSByZWFkaW5nIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlIik7Ci0gICAgICAgICAgICAgICAgICAgIGludCBueWJibGU7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChjID49ICcwJyAmJiBjIDw9ICc5JykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbnliYmxlID0gYyAtICcwJzsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjID49ICdhJyAmJiBjIDw9ICdmJykKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbnliYmxlID0gYyAtICdhJyArIDEwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ0YnKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBueWJibGUgPSBjIC0gJ0EnICsgMTA7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWFkZXIuQ3JlYXRlRXhjZXB0aW9uKHN0cmluZy5Gb3JtYXQoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwgIkludmFsaWQgY2hhcmFjdGVyIGluIGNoYXJhY3RlciBlc2NhcGUgc2VxdWVuY2U6IFUrezA6eDR9IiwgKGludCkgYykpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJlc3VsdCA9IChyZXN1bHQgPDwgNCkgKyBueWJibGU7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiAoY2hhcikgcmVzdWx0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQ29uc3VtZXMgYSB0ZXh0LW9ubHkgbGl0ZXJhbCwgdGhyb3dpbmcgYW4gZXhjZXB0aW9uIGlmIHRoZSByZWFkIHRleHQgZG9lc24ndCBtYXRjaCBpdC4KLSAgICAgICAgICAgIC8vLyBJdCBpcyBhc3N1bWVkIHRoYXQgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgbGl0ZXJhbCBoYXMgYWxyZWFkeSBiZWVuIHJlYWQuCi0gICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgcHJpdmF0ZSB2b2lkIENvbnN1bWVMaXRlcmFsKHN0cmluZyB0ZXh0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdGV4dC5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGNoYXI/IG5leHQgPSByZWFkZXIuUmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWFkZXIuQ3JlYXRlRXhjZXB0aW9uKCJVbmV4cGVjdGVkIGVuZCBvZiB0ZXh0IHdoaWxlIHJlYWRpbmcgbGl0ZXJhbCB0b2tlbiAiICsgdGV4dCk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHQuVmFsdWUgIT0gdGV4dFtpXSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVhZGVyLkNyZWF0ZUV4Y2VwdGlvbigiVW5leHBlY3RlZCBjaGFyYWN0ZXIgd2hpbGUgcmVhZGluZyBsaXRlcmFsIHRva2VuICIgKyB0ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBkb3VibGUgUmVhZE51bWJlcihjaGFyIGluaXRpYWxDaGFyYWN0ZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgICBpZiAoaW5pdGlhbENoYXJhY3RlciA9PSAnLScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgiLSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIuUHVzaEJhY2soaW5pdGlhbENoYXJhY3Rlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIEVhY2ggbWV0aG9kIHJldHVybnMgdGhlIGNoYXJhY3RlciBpdCByZWFkIHRoYXQgZG9lc24ndCBiZWxvbmcgaW4gdGhhdCBwYXJ0LAotICAgICAgICAgICAgICAgIC8vIHNvIHdlIGtub3cgd2hhdCB0byBkbyBuZXh0LCBpbmNsdWRpbmcgcHVzaGluZyB0aGUgY2hhcmFjdGVyIGJhY2sgYXQgdGhlIGVuZC4KLSAgICAgICAgICAgICAgICAvLyBudWxsIGlzIHJldHVybmVkIGZvciAiZW5kIG9mIHRleHQiLgotICAgICAgICAgICAgICAgIGNoYXI/IG5leHQgPSBSZWFkSW50KGJ1aWxkZXIpOwotICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICcuJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIG5leHQgPSBSZWFkRnJhYyhidWlsZGVyKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKG5leHQgPT0gJ2UnIHx8IG5leHQgPT0gJ0UnKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbmV4dCA9IFJlYWRFeHAoYnVpbGRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIElmIHdlIHJlYWQgYSBjaGFyYWN0ZXIgd2hpY2ggd2Fzbid0IHBhcnQgb2YgdGhlIG51bWJlciwgcHVzaCBpdCBiYWNrIHNvIHdlIGNhbiByZWFkIGl0IGFnYWluCi0gICAgICAgICAgICAgICAgLy8gdG8gcGFyc2UgdGhlIG5leHQgdG9rZW4uCi0gICAgICAgICAgICAgICAgaWYgKG5leHQgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJlYWRlci5QdXNoQmFjayhuZXh0LlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBXaGF0IGV4Y2VwdGlvbiBzaG91bGQgd2UgdGhyb3cgaWYgdGhlIHZhbHVlIGNhbid0IGJlIHJlcHJlc2VudGVkIGFzIGEgZG91YmxlPwotICAgICAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGRvdWJsZS5QYXJzZShidWlsZGVyLlRvU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBOdW1iZXJTdHlsZXMuQWxsb3dMZWFkaW5nU2lnbiB8IE51bWJlclN0eWxlcy5BbGxvd0RlY2ltYWxQb2ludCB8IE51bWJlclN0eWxlcy5BbGxvd0V4cG9uZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGNhdGNoIChPdmVyZmxvd0V4Y2VwdGlvbikKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHJlYWRlci5DcmVhdGVFeGNlcHRpb24oIk51bWVyaWMgdmFsdWUgb3V0IG9mIHJhbmdlOiAiICsgYnVpbGRlcik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIGNoYXI/IFJlYWRJbnQoU3RyaW5nQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNoYXIgZmlyc3QgPSByZWFkZXIuUmVhZE9yRmFpbCgiSW52YWxpZCBudW1lcmljIGxpdGVyYWwiKTsKLSAgICAgICAgICAgICAgICBpZiAoZmlyc3QgPCAnMCcgfHwgZmlyc3QgPiAnOScpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyByZWFkZXIuQ3JlYXRlRXhjZXB0aW9uKCJJbnZhbGlkIG51bWVyaWMgbGl0ZXJhbCIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZChmaXJzdCk7Ci0gICAgICAgICAgICAgICAgaW50IGRpZ2l0Q291bnQ7Ci0gICAgICAgICAgICAgICAgY2hhcj8gbmV4dCA9IENvbnN1bWVEaWdpdHMoYnVpbGRlciwgb3V0IGRpZ2l0Q291bnQpOwotICAgICAgICAgICAgICAgIGlmIChmaXJzdCA9PSAnMCcgJiYgZGlnaXRDb3VudCAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVhZGVyLkNyZWF0ZUV4Y2VwdGlvbigiSW52YWxpZCBudW1lcmljIGxpdGVyYWw6IGxlYWRpbmcgMCBmb3Igbm9uLXplcm8gdmFsdWUuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBuZXh0OwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIGNoYXI/IFJlYWRGcmFjKFN0cmluZ0J1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgnLicpOyAvLyBBbHJlYWR5IGNvbnN1bWVkIHRoaXMKLSAgICAgICAgICAgICAgICBpbnQgZGlnaXRDb3VudDsKLSAgICAgICAgICAgICAgICBjaGFyPyBuZXh0ID0gQ29uc3VtZURpZ2l0cyhidWlsZGVyLCBvdXQgZGlnaXRDb3VudCk7Ci0gICAgICAgICAgICAgICAgaWYgKGRpZ2l0Q291bnQgPT0gMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHJlYWRlci5DcmVhdGVFeGNlcHRpb24oIkludmFsaWQgbnVtZXJpYyBsaXRlcmFsOiBmcmFjdGlvbiB3aXRoIG5vIHRyYWlsaW5nIGRpZ2l0cyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHJpdmF0ZSBjaGFyPyBSZWFkRXhwKFN0cmluZ0J1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgnRScpOyAvLyBBbHJlYWR5IGNvbnN1bWVkIHRoaXMgKG9yICdlJykKLSAgICAgICAgICAgICAgICBjaGFyPyBuZXh0ID0gcmVhZGVyLlJlYWQoKTsKLSAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVhZGVyLkNyZWF0ZUV4Y2VwdGlvbigiSW52YWxpZCBudW1lcmljIGxpdGVyYWw6IGV4cG9uZW50IHdpdGggbm8gdHJhaWxpbmcgZGlnaXRzIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChuZXh0ID09ICctJyB8fCBuZXh0ID09ICcrJykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKG5leHQuVmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZWFkZXIuUHVzaEJhY2sobmV4dC5WYWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGludCBkaWdpdENvdW50OwotICAgICAgICAgICAgICAgIG5leHQgPSBDb25zdW1lRGlnaXRzKGJ1aWxkZXIsIG91dCBkaWdpdENvdW50KTsKLSAgICAgICAgICAgICAgICBpZiAoZGlnaXRDb3VudCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcmVhZGVyLkNyZWF0ZUV4Y2VwdGlvbigiSW52YWxpZCBudW1lcmljIGxpdGVyYWw6IGV4cG9uZW50IHdpdGhvdXQgdmFsdWUiKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5leHQ7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHByaXZhdGUgY2hhcj8gQ29uc3VtZURpZ2l0cyhTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIG91dCBpbnQgY291bnQpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY291bnQgPSAwOwotICAgICAgICAgICAgICAgIHdoaWxlICh0cnVlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2hhcj8gbmV4dCA9IHJlYWRlci5SZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0ID09IG51bGwgfHwgbmV4dC5WYWx1ZSA8ICcwJyB8fCBuZXh0LlZhbHVlID4gJzknKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gbmV4dDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBjb3VudCsrOwotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZChuZXh0LlZhbHVlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBWYWxpZGF0ZXMgdGhhdCB3ZSdyZSBpbiBhIHZhbGlkIHN0YXRlIHRvIHJlYWQgYSB2YWx1ZSAodXNpbmcgdGhlIGdpdmVuIGVycm9yIHByZWZpeCBpZiBuZWNlc3NhcnkpCi0gICAgICAgICAgICAvLy8gYW5kIGNoYW5nZXMgdGhlIHN0YXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBvbmUsIGUuZy4gT2JqZWN0QWZ0ZXJDb2xvbiB0byBPYmplY3RBZnRlclByb3BlcnR5LgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBWYWxpZGF0ZUFuZE1vZGlmeVN0YXRlRm9yVmFsdWUoc3RyaW5nIGVycm9yUHJlZml4KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIFZhbGlkYXRlU3RhdGUoVmFsdWVTdGF0ZXMsIGVycm9yUHJlZml4KTsKLSAgICAgICAgICAgICAgICBzd2l0Y2ggKHN0YXRlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTdGF0ZS5TdGFydE9mRG9jdW1lbnQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZSA9IFN0YXRlLkV4cGVjdGVkRW5kT2ZEb2N1bWVudDsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBTdGF0ZS5PYmplY3RBZnRlckNvbG9uOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PYmplY3RBZnRlclByb3BlcnR5OwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFN0YXRlLkFycmF5U3RhcnQ6Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgU3RhdGUuQXJyYXlBZnRlckNvbW1hOgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5BcnJheUFmdGVyVmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVmFsaWRhdGVBbmRNb2RpZnlTdGF0ZUZvclZhbHVlIGRvZXMgbm90IGhhbmRsZSBhbGwgdmFsdWUgc3RhdGVzIChhbmQgc2hvdWxkKSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFBvcHMgdGhlIHRvcC1tb3N0IGNvbnRhaW5lciwgYW5kIHNldHMgdGhlIHN0YXRlIHRvIHRoZSBhcHByb3ByaWF0ZSBvbmUgZm9yIHRoZSBlbmQgb2YgYSB2YWx1ZQotICAgICAgICAgICAgLy8vIGluIHRoZSBwYXJlbnQgY29udGFpbmVyLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHByaXZhdGUgdm9pZCBQb3BDb250YWluZXIoKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGNvbnRhaW5lclN0YWNrLlBvcCgpOwotICAgICAgICAgICAgICAgIHZhciBwYXJlbnQgPSBjb250YWluZXJTdGFjay5QZWVrKCk7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChwYXJlbnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjYXNlIENvbnRhaW5lclR5cGUuT2JqZWN0OgotICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUgPSBTdGF0ZS5PYmplY3RBZnRlclByb3BlcnR5OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29udGFpbmVyVHlwZS5BcnJheToKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuQXJyYXlBZnRlclZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQ29udGFpbmVyVHlwZS5Eb2N1bWVudDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlID0gU3RhdGUuRXhwZWN0ZWRFbmRPZkRvY3VtZW50OwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiVW5leHBlY3RlZCBjb250YWluZXIgdHlwZTogIiArIHBhcmVudCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIGVudW0gQ29udGFpbmVyVHlwZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIERvY3VtZW50LCBPYmplY3QsIEFycmF5Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBQb3NzaWJsZSBzdGF0ZXMgb2YgdGhlIHRva2VuaXplci4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgICAgICAvLy8gPHBhcmE+VGhpcyBpcyBhIGZsYWdzIGVudW0gcHVyZWx5IHNvIHdlIGNhbiBzaW1wbHkgYW5kIGVmZmljaWVudGx5IHJlcHJlc2VudCBhIHNldCBvZiB2YWxpZCBzdGF0ZXMKLSAgICAgICAgICAgIC8vLyBmb3IgY2hlY2tpbmcuPC9wYXJhPgotICAgICAgICAgICAgLy8vIDxwYXJhPgotICAgICAgICAgICAgLy8vIEVhY2ggaXMgZG9jdW1lbnRlZCB3aXRoIGFuIGV4YW1wbGUsCi0gICAgICAgICAgICAvLy8gd2hlcmUgXiByZXByZXNlbnRzIHRoZSBjdXJyZW50IHBvc2l0aW9uIHdpdGhpbiB0aGUgdGV4dCBzdHJlYW0uIFRoZSBleGFtcGxlcyBhbGwgdXNlIHN0cmluZyB2YWx1ZXMsCi0gICAgICAgICAgICAvLy8gYnV0IGNvdWxkIGJlIGFueSB2YWx1ZSwgaW5jbHVkaW5nIG5lc3RlZCBvYmplY3RzL2FycmF5cy4KLSAgICAgICAgICAgIC8vLyBUaGUgY29tcGxldGUgc3RhdGUgb2YgdGhlIHRva2VuaXplciBhbHNvIGluY2x1ZGVzIGEgc3RhY2sgdG8gaW5kaWNhdGUgdGhlIGNvbnRleHRzIChhcnJheXMvb2JqZWN0cykuCi0gICAgICAgICAgICAvLy8gQW55IGFkZGl0aW9uYWwgbm90aW9uYWwgc3RhdGUgb2YgIkFmdGVyVmFsdWUiIGluZGljYXRlcyB0aGF0IGEgdmFsdWUgaGFzIGJlZW4gY29tcGxldGVkLCBhdCB3aGljaCAKLSAgICAgICAgICAgIC8vLyBwb2ludCB0aGVyZSdzIGFuIGltbWVkaWF0ZSB0cmFuc2l0aW9uIHRvIEV4cGVjdGVkRW5kT2ZEb2N1bWVudCwgIE9iamVjdEFmdGVyUHJvcGVydHkgb3IgQXJyYXlBZnRlclZhbHVlLgotICAgICAgICAgICAgLy8vIDwvcGFyYT4KLSAgICAgICAgICAgIC8vLyA8cGFyYT4KLSAgICAgICAgICAgIC8vLyBUaGVzZSBzdGF0ZXMgd2VyZSBkZXJpdmVkIG1hbnVhbGx5IGJ5IHJlYWRpbmcgUkZDIDcxNTkgY2FyZWZ1bGx5LgotICAgICAgICAgICAgLy8vIDwvcGFyYT4KLSAgICAgICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgICAgICBbRmxhZ3NdCi0gICAgICAgICAgICBwcml2YXRlIGVudW0gU3RhdGUKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAgICAgLy8vIF4geyAiZm9vIjogImJhciIgfQotICAgICAgICAgICAgICAgIC8vLyBCZWZvcmUgdGhlIHZhbHVlIGluIGEgZG9jdW1lbnQuIE5leHQgc3RhdGVzOiBPYmplY3RTdGFydCwgQXJyYXlTdGFydCwgIkFmdGVyVmFsdWUiCi0gICAgICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgICAgICBTdGFydE9mRG9jdW1lbnQgPSAxIDw8IDAsCi0gICAgICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgICAgIC8vLyB7ICJmb28iOiAiYmFyIiB9IF4KLSAgICAgICAgICAgICAgICAvLy8gQWZ0ZXIgdGhlIHZhbHVlIGluIGEgZG9jdW1lbnQuIE5leHQgc3RhdGVzOiBSZWFkZXJFeGhhdXN0ZWQKLSAgICAgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgICAgIEV4cGVjdGVkRW5kT2ZEb2N1bWVudCA9IDEgPDwgMSwKLSAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAgICAgLy8vIHsgImZvbyI6ICJiYXIiIH0gXiAoYW5kIGFscmVhZHkgcmVhZCB0byB0aGUgZW5kIG9mIHRoZSByZWFkZXIpCi0gICAgICAgICAgICAgICAgLy8vIFRlcm1pbmFsIHN0YXRlLgotICAgICAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAgICAgUmVhZGVyRXhoYXVzdGVkID0gMSA8PCAyLAotICAgICAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgICAgICAvLy8geyBeICJmb28iOiAiYmFyIiB9Ci0gICAgICAgICAgICAgICAgLy8vIEJlZm9yZSB0aGUgKmZpcnN0KiBwcm9wZXJ0eSBpbiBhbiBvYmplY3QuCi0gICAgICAgICAgICAgICAgLy8vIE5leHQgc3RhdGVzOgotICAgICAgICAgICAgICAgIC8vLyAiQWZ0ZXJWYWx1ZSIgKGVtcHR5IG9iamVjdCkKLSAgICAgICAgICAgICAgICAvLy8gT2JqZWN0QmVmb3JlQ29sb24gKHJlYWQgYSBuYW1lKQotICAgICAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAgICAgT2JqZWN0U3RhcnQgPSAxIDw8IDMsCi0gICAgICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgICAgIC8vLyB7ICJmb28iIF4gOiAiYmFyIiwgIngiOiAieSIgfQotICAgICAgICAgICAgICAgIC8vLyBOZXh0IHN0YXRlOiBPYmplY3RBZnRlckNvbG9uCi0gICAgICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgICAgICBPYmplY3RCZWZvcmVDb2xvbiA9IDEgPDwgNCwKLSAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAgICAgLy8vIHsgImZvbyIgOiBeICJiYXIiLCAieCI6ICJ5IiB9Ci0gICAgICAgICAgICAgICAgLy8vIEJlZm9yZSBhbnkgcHJvcGVydHkgb3RoZXIgdGhhbiB0aGUgZmlyc3QgaW4gYW4gb2JqZWN0LgotICAgICAgICAgICAgICAgIC8vLyAoRXF1aXZhbGVudGx5OiBhZnRlciBhbnkgcHJvcGVydHkgaW4gYW4gb2JqZWN0KSAKLSAgICAgICAgICAgICAgICAvLy8gTmV4dCBzdGF0ZXM6Ci0gICAgICAgICAgICAgICAgLy8vICJBZnRlclZhbHVlIiAodmFsdWUgaXMgc2ltcGxlKQotICAgICAgICAgICAgICAgIC8vLyBPYmplY3RTdGFydCAodmFsdWUgaXMgb2JqZWN0KQotICAgICAgICAgICAgICAgIC8vLyBBcnJheVN0YXJ0ICh2YWx1ZSBpcyBhcnJheSkKLSAgICAgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgICAgIE9iamVjdEFmdGVyQ29sb24gPSAxIDw8IDUsCi0gICAgICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgICAgIC8vLyB7ICJmb28iIDogImJhciIgXiAsICJ4IiA6ICJ5IiB9Ci0gICAgICAgICAgICAgICAgLy8vIEF0IHRoZSBlbmQgb2YgYSBwcm9wZXJ0eSwgc28gZXhwZWN0aW5nIGVpdGhlciBhIGNvbW1hIG9yIGVuZC1vZi1vYmplY3QKLSAgICAgICAgICAgICAgICAvLy8gTmV4dCBzdGF0ZXM6IE9iamVjdEFmdGVyQ29tbWEgb3IgIkFmdGVyVmFsdWUiCi0gICAgICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgICAgICBPYmplY3RBZnRlclByb3BlcnR5ID0gMSA8PCA2LAotICAgICAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgICAgICAvLy8geyAiZm9vIjoiYmFyIiwgXiAieCI6InkiIH0KLSAgICAgICAgICAgICAgICAvLy8gUmVhZCB0aGUgY29tbWEgYWZ0ZXIgdGhlIHByZXZpb3VzIHByb3BlcnR5LCBzbyBleHBlY3RpbmcgYW5vdGhlciBwcm9wZXJ0eS4KLSAgICAgICAgICAgICAgICAvLy8gVGhpcyBpcyBsaWtlIE9iamVjdFN0YXJ0LCBidXQgY2xvc2luZyBicmFjZSBpc24ndCB2YWxpZCBoZXJlCi0gICAgICAgICAgICAgICAgLy8vIE5leHQgc3RhdGU6IE9iamVjdEJlZm9yZUNvbG9uLgotICAgICAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAgICAgT2JqZWN0QWZ0ZXJDb21tYSA9IDEgPDwgNywKLSAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAgICAgLy8vIFsgXiAiZm9vIiwgImJhciIgXQotICAgICAgICAgICAgICAgIC8vLyBCZWZvcmUgdGhlICpmaXJzdCogdmFsdWUgaW4gYW4gYXJyYXkuCi0gICAgICAgICAgICAgICAgLy8vIE5leHQgc3RhdGVzOgotICAgICAgICAgICAgICAgIC8vLyAiQWZ0ZXJWYWx1ZSIgKHJlYWQgYSB2YWx1ZSkKLSAgICAgICAgICAgICAgICAvLy8gIkFmdGVyVmFsdWUiIChlbmQgb2YgYXJyYXk7IHdpbGwgcG9wIHN0YWNrKQotICAgICAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAgICAgQXJyYXlTdGFydCA9IDEgPDwgOCwKLSAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAgICAgLy8vIFsgImZvbyIgXiAsICJiYXIiIF0KLSAgICAgICAgICAgICAgICAvLy8gQWZ0ZXIgYW55IHZhbHVlIGluIGFuIGFycmF5LCBzbyBleHBlY3RpbmcgZWl0aGVyIGEgY29tbWEgb3IgZW5kLW9mLWFycmF5Ci0gICAgICAgICAgICAgICAgLy8vIE5leHQgc3RhdGVzOiBBcnJheUFmdGVyQ29tbWEgb3IgIkFmdGVyVmFsdWUiCi0gICAgICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgICAgICBBcnJheUFmdGVyVmFsdWUgPSAxIDw8IDksCi0gICAgICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgICAgIC8vLyBbICJmb28iLCBeICJiYXIiIF0KLSAgICAgICAgICAgICAgICAvLy8gQWZ0ZXIgYSBjb21tYSBpbiBhbiBhcnJheSwgc28gdGhlcmUgKm11c3QqIGJlIGFub3RoZXIgdmFsdWUgKHNpbXBsZSBvciBjb21wbGV4KS4KLSAgICAgICAgICAgICAgICAvLy8gTmV4dCBzdGF0ZXM6ICJBZnRlclZhbHVlIiAoc2ltcGxlIHZhbHVlKSwgU3RhcnRPYmplY3QsIFN0YXJ0QXJyYXkKLSAgICAgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgICAgIEFycmF5QWZ0ZXJDb21tYSA9IDEgPDwgMTAKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFdyYXBwZXIgYXJvdW5kIGEgdGV4dCByZWFkZXIgYWxsb3dpbmcgc21hbGwgYW1vdW50cyBvZiBidWZmZXJpbmcgYW5kIGxvY2F0aW9uIGhhbmRsaW5nLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIHByaXZhdGUgY2xhc3MgUHVzaEJhY2tSZWFkZXIKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAvLyBUT0RPOiBBZGQgbG9jYXRpb25zIGZvciBlcnJvcnMgZXRjLgotCi0gICAgICAgICAgICAgICAgcHJpdmF0ZSByZWFkb25seSBUZXh0UmVhZGVyIHJlYWRlcjsKLQotICAgICAgICAgICAgICAgIGludGVybmFsIFB1c2hCYWNrUmVhZGVyKFRleHRSZWFkZXIgcmVhZGVyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogV3JhcCB0aGUgcmVhZGVyIGluIGEgQnVmZmVyZWRSZWFkZXI/Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMucmVhZGVyID0gcmVhZGVyOwotICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgICAgICAvLy8gVGhlIGJ1ZmZlcmVkIG5leHQgY2hhcmFjdGVyLCBpZiB3ZSBoYXZlIG9uZS4KLSAgICAgICAgICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAgICAgICAgIHByaXZhdGUgY2hhcj8gbmV4dENoYXI7Ci0KLSAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAgICAgLy8vIFJldHVybnMgdGhlIG5leHQgY2hhcmFjdGVyIGluIHRoZSBzdHJlYW0sIG9yIG51bGwgaWYgd2UgaGF2ZSByZWFjaGVkIHRoZSBlbmQuCi0gICAgICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgICAgICAvLy8gPHJldHVybnM+PC9yZXR1cm5zPgotICAgICAgICAgICAgICAgIGludGVybmFsIGNoYXI/IFJlYWQoKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKG5leHRDaGFyICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNoYXI/IHRtcCA9IG5leHRDaGFyOwotICAgICAgICAgICAgICAgICAgICAgICAgbmV4dENoYXIgPSBudWxsOwotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHRtcDsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBpbnQgbmV4dCA9IHJlYWRlci5SZWFkKCk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBuZXh0ID09IC0xID8gbnVsbCA6IChjaGFyPykgbmV4dDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpbnRlcm5hbCBjaGFyIFJlYWRPckZhaWwoc3RyaW5nIG1lc3NhZ2VPbkZhaWx1cmUpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyPyBuZXh0ID0gUmVhZCgpOwotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dCA9PSBudWxsKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBDcmVhdGVFeGNlcHRpb24obWVzc2FnZU9uRmFpbHVyZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5leHQuVmFsdWU7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBQdXNoQmFjayhjaGFyIGMpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAobmV4dENoYXIgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkNhbm5vdCBwdXNoIGJhY2sgd2hlbiBhbHJlYWR5IGJ1ZmZlcmluZyBhIGNoYXJhY3RlciIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIG5leHRDaGFyID0gYzsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAgICAgLy8vIENyZWF0ZXMgYSBuZXcgZXhjZXB0aW9uIGFwcHJvcHJpYXRlIGZvciB0aGUgY3VycmVudCBzdGF0ZSBvZiB0aGUgcmVhZGVyLgotICAgICAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAgICAgaW50ZXJuYWwgSW52YWxpZEpzb25FeGNlcHRpb24gQ3JlYXRlRXhjZXB0aW9uKHN0cmluZyBtZXNzYWdlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogS2VlcCB0cmFjayBvZiBhbmQgdXNlIHRoZSBsb2NhdGlvbi4KLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBJbnZhbGlkSnNvbkV4Y2VwdGlvbihtZXNzYWdlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9MaW1pdGVkSW5wdXRTdHJlYW0uY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9MaW1pdGVkSW5wdXRTdHJlYW0uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMWQxOWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvTGltaXRlZElucHV0U3RyZWFtLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0gICAgCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uSU87Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYKLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFN0cmVhbSBpbXBsZW1lbnRhdGlvbiB3aGljaCBwcm94aWVzIGFub3RoZXIgc3RyZWFtLCBvbmx5IGFsbG93aW5nIGEgY2VydGFpbiBhbW91bnQKLSAgICAvLy8gb2YgZGF0YSB0byBiZSByZWFkLiBOb3RlIHRoYXQgdGhpcyBpcyBvbmx5IHVzZWQgdG8gcmVhZCBkZWxpbWl0ZWQgc3RyZWFtcywgc28gaXQKLSAgICAvLy8gZG9lc24ndCBhdHRlbXB0IHRvIGltcGxlbWVudCBldmVyeXRoaW5nLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIExpbWl0ZWRJbnB1dFN0cmVhbSA6IFN0cmVhbQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTdHJlYW0gcHJveGllZDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgYnl0ZXNMZWZ0OwotCi0gICAgICAgIGludGVybmFsIExpbWl0ZWRJbnB1dFN0cmVhbShTdHJlYW0gcHJveGllZCwgaW50IHNpemUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJveGllZCA9IHByb3hpZWQ7Ci0gICAgICAgICAgICBieXRlc0xlZnQgPSBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuUmVhZAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gdHJ1ZTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgQ2FuU2VlawotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gZmFsc2U7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIENhbldyaXRlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBmYWxzZTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgRmx1c2goKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBMZW5ndGgKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgdGhyb3cgbmV3IE5vdFN1cHBvcnRlZEV4Y2VwdGlvbigpOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgbG9uZyBQb3NpdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7IH0KLSAgICAgICAgICAgIHNldCB7IHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBSZWFkKGJ5dGVbXSBidWZmZXIsIGludCBvZmZzZXQsIGludCBjb3VudCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKGJ5dGVzTGVmdCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IHByb3hpZWQuUmVhZChidWZmZXIsIG9mZnNldCwgTWF0aC5NaW4oYnl0ZXNMZWZ0LCBjb3VudCkpOwotICAgICAgICAgICAgICAgIGJ5dGVzTGVmdCAtPSBieXRlc1JlYWQ7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGJ5dGVzUmVhZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGxvbmcgU2Vlayhsb25nIG9mZnNldCwgU2Vla09yaWdpbiBvcmlnaW4pCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldExlbmd0aChsb25nIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm90U3VwcG9ydGVkRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBXcml0ZShieXRlW10gYnVmZmVyLCBpbnQgb2Zmc2V0LCBpbnQgY291bnQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOb3RTdXBwb3J0ZWRFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL01lc3NhZ2VFeHRlbnNpb25zLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvTWVzc2FnZUV4dGVuc2lvbnMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0NzE1NmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvTWVzc2FnZUV4dGVuc2lvbnMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTcgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtLklPOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBFeHRlbnNpb24gbWV0aG9kcyBvbiA8c2VlIGNyZWY9IklNZXNzYWdlIi8+IGFuZCA8c2VlIGNyZWY9IklNZXNzYWdle1R9Ii8+LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBNZXNzYWdlRXh0ZW5zaW9ucwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWVyZ2VzIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBpbnRvIGFuIGV4aXN0aW5nIG1lc3NhZ2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gbWVyZ2UgdGhlIGRhdGEgaW50by48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIG1lcmdlLCB3aGljaCBtdXN0IGJlIHByb3RvYnVmLWVuY29kZWQgYmluYXJ5IGRhdGEuPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIE1lcmdlRnJvbSh0aGlzIElNZXNzYWdlIG1lc3NhZ2UsIGJ5dGVbXSBkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2UsICJtZXNzYWdlIik7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGRhdGEsICJkYXRhIik7Ci0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZGF0YSk7Ci0gICAgICAgICAgICBtZXNzYWdlLk1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgICAgICBpbnB1dC5DaGVja1JlYWRFbmRPZlN0cmVhbVRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWVyZ2VzIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gYnl0ZSBzdHJpbmcgaW50byBhbiBleGlzdGluZyBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIG1lcmdlIHRoZSBkYXRhIGludG8uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byBtZXJnZSwgd2hpY2ggbXVzdCBiZSBwcm90b2J1Zi1lbmNvZGVkIGJpbmFyeSBkYXRhLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBNZXJnZUZyb20odGhpcyBJTWVzc2FnZSBtZXNzYWdlLCBCeXRlU3RyaW5nIGRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwobWVzc2FnZSwgIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwoZGF0YSwgImRhdGEiKTsKLSAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhLkNyZWF0ZUNvZGVkSW5wdXQoKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKGlucHV0KTsKLSAgICAgICAgICAgIGlucHV0LkNoZWNrUmVhZEVuZE9mU3RyZWFtVGFnKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBNZXJnZXMgZGF0YSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0gaW50byBhbiBleGlzdGluZyBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIG1lcmdlIHRoZSBkYXRhIGludG8uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+U3RyZWFtIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gbWVyZ2UsIHdoaWNoIG11c3QgYmUgcHJvdG9idWYtZW5jb2RlZCBiaW5hcnkgZGF0YS48L3BhcmFtPgotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWVyZ2VGcm9tKHRoaXMgSU1lc3NhZ2UgbWVzc2FnZSwgU3RyZWFtIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2UsICJtZXNzYWdlIik7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGlucHV0LCAiaW5wdXQiKTsKLSAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IG5ldyBDb2RlZElucHV0U3RyZWFtKGlucHV0KTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKGNvZGVkSW5wdXQpOwotICAgICAgICAgICAgY29kZWRJbnB1dC5DaGVja1JlYWRFbmRPZlN0cmVhbVRhZygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gTWVyZ2VzIGxlbmd0aC1kZWxpbWl0ZWQgZGF0YSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0gaW50byBhbiBleGlzdGluZyBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGUgc3RyZWFtIGlzIGV4cGVjdGVkIHRvIGNvbnRhaW4gYSBsZW5ndGggYW5kIHRoZW4gdGhlIGRhdGEuIE9ubHkgdGhlIGFtb3VudCBvZiBkYXRhCi0gICAgICAgIC8vLyBzcGVjaWZpZWQgYnkgdGhlIGxlbmd0aCB3aWxsIGJlIGNvbnN1bWVkLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIG1lcmdlIHRoZSBkYXRhIGludG8uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+U3RyZWFtIGNvbnRhaW5pbmcgdGhlIGRhdGEgdG8gbWVyZ2UsIHdoaWNoIG11c3QgYmUgcHJvdG9idWYtZW5jb2RlZCBiaW5hcnkgZGF0YS48L3BhcmFtPgotICAgICAgICBwdWJsaWMgc3RhdGljIHZvaWQgTWVyZ2VEZWxpbWl0ZWRGcm9tKHRoaXMgSU1lc3NhZ2UgbWVzc2FnZSwgU3RyZWFtIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2UsICJtZXNzYWdlIik7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGlucHV0LCAiaW5wdXQiKTsKLSAgICAgICAgICAgIGludCBzaXplID0gKGludCkgQ29kZWRJbnB1dFN0cmVhbS5SZWFkUmF3VmFyaW50MzIoaW5wdXQpOwotICAgICAgICAgICAgU3RyZWFtIGxpbWl0ZWRTdHJlYW0gPSBuZXcgTGltaXRlZElucHV0U3RyZWFtKGlucHV0LCBzaXplKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKGxpbWl0ZWRTdHJlYW0pOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVydHMgdGhlIGdpdmVuIG1lc3NhZ2UgaW50byBhIGJ5dGUgYXJyYXkgaW4gcHJvdG9idWYgZW5jb2RpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gY29udmVydC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG1lc3NhZ2UgZGF0YSBhcyBhIGJ5dGUgYXJyYXkuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBUb0J5dGVBcnJheSh0aGlzIElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwobWVzc2FnZSwgIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVttZXNzYWdlLkNhbGN1bGF0ZVNpemUoKV07Ci0gICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ocmVzdWx0KTsKLSAgICAgICAgICAgIG1lc3NhZ2UuV3JpdGVUbyhvdXRwdXQpOwotICAgICAgICAgICAgb3V0cHV0LkNoZWNrTm9TcGFjZUxlZnQoKTsKLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBXcml0ZXMgdGhlIGdpdmVuIG1lc3NhZ2UgZGF0YSB0byB0aGUgZ2l2ZW4gc3RyZWFtIGluIHByb3RvYnVmIGVuY29kaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIHdyaXRlIHRvIHRoZSBzdHJlYW0uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJvdXRwdXQiPlRoZSBzdHJlYW0gdG8gd3JpdGUgdG8uPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFdyaXRlVG8odGhpcyBJTWVzc2FnZSBtZXNzYWdlLCBTdHJlYW0gb3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2UsICJtZXNzYWdlIik7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG91dHB1dCwgIm91dHB1dCIpOwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLSAgICAgICAgICAgIG1lc3NhZ2UuV3JpdGVUbyhjb2RlZE91dHB1dCk7Ci0gICAgICAgICAgICBjb2RlZE91dHB1dC5GbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gV3JpdGVzIHRoZSBsZW5ndGggYW5kIHRoZW4gZGF0YSBvZiB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBhIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJtZXNzYWdlIj5UaGUgbWVzc2FnZSB0byB3cml0ZS48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im91dHB1dCI+VGhlIG91dHB1dCBzdHJlYW0gdG8gd3JpdGUgdG8uPC9wYXJhbT4KLSAgICAgICAgcHVibGljIHN0YXRpYyB2b2lkIFdyaXRlRGVsaW1pdGVkVG8odGhpcyBJTWVzc2FnZSBtZXNzYWdlLCBTdHJlYW0gb3V0cHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2UsICJtZXNzYWdlIik7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG91dHB1dCwgIm91dHB1dCIpOwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ob3V0cHV0KTsKLSAgICAgICAgICAgIGNvZGVkT3V0cHV0LldyaXRlUmF3VmFyaW50MzIoKHVpbnQpbWVzc2FnZS5DYWxjdWxhdGVTaXplKCkpOwotICAgICAgICAgICAgbWVzc2FnZS5Xcml0ZVRvKGNvZGVkT3V0cHV0KTsKLSAgICAgICAgICAgIGNvZGVkT3V0cHV0LkZsdXNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gbWVzc2FnZSBpbnRvIGEgYnl0ZSBzdHJpbmcgaW4gcHJvdG9idWYgZW5jb2RpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZSI+VGhlIG1lc3NhZ2UgdG8gY29udmVydC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG1lc3NhZ2UgZGF0YSBhcyBhIGJ5dGUgc3RyaW5nLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIFRvQnl0ZVN0cmluZyh0aGlzIElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwobWVzc2FnZSwgIm1lc3NhZ2UiKTsKLSAgICAgICAgICAgIHJldHVybiBCeXRlU3RyaW5nLkF0dGFjaEJ5dGVzKG1lc3NhZ2UuVG9CeXRlQXJyYXkoKSk7Ci0gICAgICAgIH0gICAgICAgIAotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL01lc3NhZ2VQYXJzZXIuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9NZXNzYWdlUGFyc2VyLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ODg5NjM4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL01lc3NhZ2VQYXJzZXIuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjcgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLSAgICAKLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5JTzsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQSBnZW5lcmFsIG1lc3NhZ2UgcGFyc2VyLCB0eXBpY2FsbHkgdXNlZCBieSByZWZsZWN0aW9uLWJhc2VkIGNvZGUgYXMgYWxsIHRoZSBtZXRob2RzCi0gICAgLy8vIHJldHVybiBzaW1wbGUgPHNlZSBjcmVmPSJJTWVzc2FnZSIvPi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjbGFzcyBNZXNzYWdlUGFyc2VyCi0gICAgewotICAgICAgICBwcml2YXRlIEZ1bmM8SU1lc3NhZ2U+IGZhY3Rvcnk7Ci0KLSAgICAgICAgaW50ZXJuYWwgTWVzc2FnZVBhcnNlcihGdW5jPElNZXNzYWdlPiBmYWN0b3J5KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZhY3RvcnkgPSBmYWN0b3J5OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIHRlbXBsYXRlIGluc3RhbmNlIHJlYWR5IGZvciBwb3B1bGF0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+QW4gZW1wdHkgbWVzc2FnZS48L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIElNZXNzYWdlIENyZWF0ZVRlbXBsYXRlKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIGZhY3RvcnkoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyBhIG1lc3NhZ2UgZnJvbSBhIGJ5dGUgYXJyYXkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0YSI+VGhlIGJ5dGUgYXJyYXkgY29udGFpbmluZyB0aGUgbWVzc2FnZS4gTXVzdCBub3QgYmUgbnVsbC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG5ld2x5IHBhcnNlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElNZXNzYWdlIFBhcnNlRnJvbShieXRlW10gZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChkYXRhLCAiZGF0YSIpOwotICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkoKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGJ5dGUgc3RyaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRhdGEiPlRoZSBkYXRhIHRvIHBhcnNlLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgcGFyc2VkIG1lc3NhZ2UuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgSU1lc3NhZ2UgUGFyc2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChkYXRhLCAiZGF0YSIpOwotICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkoKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIHN0cmVhbSB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHBhcnNlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElNZXNzYWdlIFBhcnNlRnJvbShTdHJlYW0gaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElNZXNzYWdlIG1lc3NhZ2UgPSBmYWN0b3J5KCk7Ci0gICAgICAgICAgICBtZXNzYWdlLk1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhcnNlcyBhIGxlbmd0aC1kZWxpbWl0ZWQgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFRoZSBzdHJlYW0gaXMgZXhwZWN0ZWQgdG8gY29udGFpbiBhIGxlbmd0aCBhbmQgdGhlbiB0aGUgZGF0YS4gT25seSB0aGUgYW1vdW50IG9mIGRhdGEKLSAgICAgICAgLy8vIHNwZWNpZmllZCBieSB0aGUgbGVuZ3RoIHdpbGwgYmUgY29uc3VtZWQuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBzdHJlYW0gdG8gcGFyc2UuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBwYXJzZWQgbWVzc2FnZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBJTWVzc2FnZSBQYXJzZURlbGltaXRlZEZyb20oU3RyZWFtIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeSgpOwotICAgICAgICAgICAgbWVzc2FnZS5NZXJnZURlbGltaXRlZEZyb20oaW5wdXQpOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIGNvZGVkIGlucHV0IHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIHN0cmVhbSB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHBhcnNlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIElNZXNzYWdlIFBhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICB7Ci0gICAgICAgICAgICBJTWVzc2FnZSBtZXNzYWdlID0gZmFjdG9yeSgpOwotICAgICAgICAgICAgbWVzc2FnZS5NZXJnZUZyb20oaW5wdXQpOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIEpTT04uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ianNvbiI+VGhlIEpTT04gdG8gcGFyc2UuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBwYXJzZWQgbWVzc2FnZS48L3JldHVybnM+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRKc29uRXhjZXB0aW9uIj5UaGUgSlNPTiBkb2VzIG5vdCBjb21wbHkgd2l0aCBSRkMgNzE1OTwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iPlRoZSBKU09OIGRvZXMgbm90IHJlcHJlc2VudCBhIFByb3RvY29sIEJ1ZmZlcnMgbWVzc2FnZSBjb3JyZWN0bHk8L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIElNZXNzYWdlIFBhcnNlSnNvbihzdHJpbmcganNvbikKLSAgICAgICAgewotICAgICAgICAgICAgSU1lc3NhZ2UgbWVzc2FnZSA9IGZhY3RvcnkoKTsKLSAgICAgICAgICAgIEpzb25QYXJzZXIuRGVmYXVsdC5NZXJnZShtZXNzYWdlLCBqc29uKTsKLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBIHBhcnNlciBmb3IgYSBzcGVjaWZpYyBtZXNzYWdlIHR5cGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICAvLy8gPHJlbWFya3M+Ci0gICAgLy8vIDxwPgotICAgIC8vLyBUaGlzIGRlbGVnYXRlcyBtb3N0IGJlaGF2aW9yIHRvIHRoZQotICAgIC8vLyA8c2VlIGNyZWY9IklNZXNzYWdlLk1lcmdlRnJvbSIvPiBpbXBsZW1lbnRhdGlvbiB3aXRoaW4gdGhlIG9yaWdpbmFsIHR5cGUsIGJ1dAotICAgIC8vLyBwcm92aWRlcyBjb252ZW5pZW50IG92ZXJsb2FkcyB0byBwYXJzZSBmcm9tIGEgdmFyaWV0eSBvZiBzb3VyY2VzLgotICAgIC8vLyA8L3A+Ci0gICAgLy8vIDxwPgotICAgIC8vLyBNb3N0IGFwcGxpY2F0aW9ucyB3aWxsIG5ldmVyIG5lZWQgdG8gY3JlYXRlIHRoZWlyIG93biBpbnN0YW5jZXMgb2YgdGhpcyB0eXBlOwotICAgIC8vLyBpbnN0ZWFkLCB1c2UgdGhlIHN0YXRpYyA8Yz5QYXJzZXI8L2M+IHByb3BlcnR5IG9mIGEgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSB0byBvYnRhaW4gYQotICAgIC8vLyBwYXJzZXIgZm9yIHRoYXQgdHlwZS4KLSAgICAvLy8gPC9wPgotICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgbWVzc2FnZSB0byBiZSBwYXJzZWQuPC90eXBlcGFyYW0+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBNZXNzYWdlUGFyc2VyPFQ+IDogTWVzc2FnZVBhcnNlciB3aGVyZSBUIDogSU1lc3NhZ2U8VD4KLSAgICB7Ci0gICAgICAgIC8vIEltcGxlbWVudGF0aW9uIG5vdGU6IGFsbCB0aGUgbWV0aG9kcyBoZXJlICpjb3VsZCoganVzdCBkZWxlZ2F0ZSB1cCB0byB0aGUgYmFzZSBjbGFzcyBhbmQgY2FzdCB0aGUgcmVzdWx0LgotICAgICAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBhdm9pZHMgYSB2aXJ0dWFsIG1ldGhvZCBjYWxsIGFuZCBhIGNhc3QsIHdoaWNoICptYXkqIGJlIHNpZ25pZmljYW50IGluIHNvbWUgY2FzZXMuCi0gICAgICAgIC8vIEJlbmNobWFya2luZyB3b3JrIGlzIHJlcXVpcmVkIHRvIG1lYXN1cmUgdGhlIHNpZ25pZmljYW5jZSAtIGJ1dCBpdCdzIG9ubHkgYSBmZXcgbGluZXMgb2YgY29kZSBpbiBhbnkgY2FzZS4KLSAgICAgICAgLy8gVGhlIEFQSSB3b3VsZG4ndCBjaGFuZ2UgYW55d2F5IC0ganVzdCB0aGUgaW1wbGVtZW50YXRpb24gLSBzbyB0aGlzIHdvcmsgY2FuIGJlIGRlZmVycmVkLgotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8VD4gZmFjdG9yeTsgCi0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIG5ldyBwYXJzZXIuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFRoZSBmYWN0b3J5IG1ldGhvZCBpcyBlZmZlY3RpdmVseSBhbiBvcHRpbWl6YXRpb24gb3ZlciB1c2luZyBhIGdlbmVyaWMgY29uc3RyYWludAotICAgICAgICAvLy8gdG8gcmVxdWlyZSBhIHBhcmFtZXRlcmxlc3MgY29uc3RydWN0b3I6IGRlbGVnYXRlcyBhcmUgc2lnbmlmaWNhbnRseSBmYXN0ZXIgdG8gZXhlY3V0ZS4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmYWN0b3J5Ij5GdW5jdGlvbiB0byBpbnZva2Ugd2hlbiBhIG5ldywgZW1wdHkgbWVzc2FnZSBpcyByZXF1aXJlZC48L3BhcmFtPgotICAgICAgICBwdWJsaWMgTWVzc2FnZVBhcnNlcihGdW5jPFQ+IGZhY3RvcnkpIDogYmFzZSgoKSA9PiBmYWN0b3J5KCkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMuZmFjdG9yeSA9IGZhY3Rvcnk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgdGVtcGxhdGUgaW5zdGFuY2UgcmVhZHkgZm9yIHBvcHVsYXRpb24uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BbiBlbXB0eSBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgbmV3IFQgQ3JlYXRlVGVtcGxhdGUoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZmFjdG9yeSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFyc2VzIGEgbWVzc2FnZSBmcm9tIGEgYnl0ZSBhcnJheS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgYnl0ZSBhcnJheSBjb250YWluaW5nIHRoZSBtZXNzYWdlLiBNdXN0IG5vdCBiZSBudWxsLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgbmV3bHkgcGFyc2VkIG1lc3NhZ2UuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgbmV3IFQgUGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGRhdGEsICJkYXRhIik7Ci0gICAgICAgICAgICBUIG1lc3NhZ2UgPSBmYWN0b3J5KCk7Ci0gICAgICAgICAgICBtZXNzYWdlLk1lcmdlRnJvbShkYXRhKTsKLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFyc2VzIGEgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBieXRlIHN0cmluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRhIj5UaGUgZGF0YSB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHBhcnNlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG5ldyBUIFBhcnNlRnJvbShCeXRlU3RyaW5nIGRhdGEpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwoZGF0YSwgImRhdGEiKTsKLSAgICAgICAgICAgIFQgbWVzc2FnZSA9IGZhY3RvcnkoKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKGRhdGEpOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIHN0cmVhbSB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHBhcnNlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG5ldyBUIFBhcnNlRnJvbShTdHJlYW0gaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFQgbWVzc2FnZSA9IGZhY3RvcnkoKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKGlucHV0KTsKLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFyc2VzIGEgbGVuZ3RoLWRlbGltaXRlZCBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIHN0cmVhbS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhlIHN0cmVhbSBpcyBleHBlY3RlZCB0byBjb250YWluIGEgbGVuZ3RoIGFuZCB0aGVuIHRoZSBkYXRhLiBPbmx5IHRoZSBhbW91bnQgb2YgZGF0YQotICAgICAgICAvLy8gc3BlY2lmaWVkIGJ5IHRoZSBsZW5ndGggd2lsbCBiZSBjb25zdW1lZC4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJpbnB1dCI+VGhlIHN0cmVhbSB0byBwYXJzZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHBhcnNlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG5ldyBUIFBhcnNlRGVsaW1pdGVkRnJvbShTdHJlYW0gaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFQgbWVzc2FnZSA9IGZhY3RvcnkoKTsKLSAgICAgICAgICAgIG1lc3NhZ2UuTWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KTsKLSAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFyc2VzIGEgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBjb2RlZCBpbnB1dCBzdHJlYW0uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iaW5wdXQiPlRoZSBzdHJlYW0gdG8gcGFyc2UuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBwYXJzZWQgbWVzc2FnZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBuZXcgVCBQYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgewotICAgICAgICAgICAgVCBtZXNzYWdlID0gZmFjdG9yeSgpOwotICAgICAgICAgICAgbWVzc2FnZS5NZXJnZUZyb20oaW5wdXQpOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBQYXJzZXMgYSBtZXNzYWdlIGZyb20gdGhlIGdpdmVuIEpTT04uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ianNvbiI+VGhlIEpTT04gdG8gcGFyc2UuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBwYXJzZWQgbWVzc2FnZS48L3JldHVybnM+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRKc29uRXhjZXB0aW9uIj5UaGUgSlNPTiBkb2VzIG5vdCBjb21wbHkgd2l0aCBSRkMgNzE1OTwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24iPlRoZSBKU09OIGRvZXMgbm90IHJlcHJlc2VudCBhIFByb3RvY29sIEJ1ZmZlcnMgbWVzc2FnZSBjb3JyZWN0bHk8L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIG5ldyBUIFBhcnNlSnNvbihzdHJpbmcganNvbikKLSAgICAgICAgewotICAgICAgICAgICAgVCBtZXNzYWdlID0gZmFjdG9yeSgpOwotICAgICAgICAgICAgSnNvblBhcnNlci5EZWZhdWx0Lk1lcmdlKG1lc3NhZ2UsIGpzb24pOwotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9Qcm9wZXJ0aWVzL0Fzc2VtYmx5SW5mby5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDg1MmViLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1Byb3BlcnRpZXMvQXNzZW1ibHlJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjcgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBTeXN0ZW0uUnVudGltZS5Db21waWxlclNlcnZpY2VzOwotdXNpbmcgU3lzdGVtLlNlY3VyaXR5OwotCi0vLyBHZW5lcmFsIEluZm9ybWF0aW9uIGFib3V0IGFuIGFzc2VtYmx5IGlzIGNvbnRyb2xsZWQgdGhyb3VnaCB0aGUgZm9sbG93aW5nIAotLy8gc2V0IG9mIGF0dHJpYnV0ZXMuIENoYW5nZSB0aGVzZSBhdHRyaWJ1dGUgdmFsdWVzIHRvIG1vZGlmeSB0aGUgaW5mb3JtYXRpb24KLS8vIGFzc29jaWF0ZWQgd2l0aCBhbiBhc3NlbWJseS4KLQotW2Fzc2VtYmx5OiBBc3NlbWJseVRpdGxlKCJHb29nbGUuUHJvdG9idWYiKV0KLVthc3NlbWJseTogQXNzZW1ibHlEZXNjcmlwdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29uZmlndXJhdGlvbigiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29tcGFueSgiIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5UHJvZHVjdCgiR29vZ2xlLlByb3RvYnVmIildCi1bYXNzZW1ibHk6IEFzc2VtYmx5Q29weXJpZ2h0KCJDb3B5cmlnaHQgwqkgIDIwMTUiKV0KLVthc3NlbWJseTogQXNzZW1ibHlUcmFkZW1hcmsoIiIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUN1bHR1cmUoIiIpXQotCi0jaWYgIU5DUlVOQ0gKLVthc3NlbWJseTogQWxsb3dQYXJ0aWFsbHlUcnVzdGVkQ2FsbGVyc10KLSNlbmRpZgotCi0jaWYgU0lHTkVECi1bYXNzZW1ibHk6IEludGVybmFsc1Zpc2libGVUbygiR29vZ2xlLlByb3RvYnVmLlRlc3QsIFB1YmxpY0tleT0iICsKLSAgICAiMDAyNDAwMDAwNDgwMDAwMDk0MDAwMDAwMDYwMjAwMDAwMDI0MDAwMDUyNTM0MTMxMDAwNDAwMDAwMTAwMDEwMDI1ODAwZmJjZmM2M2ExIiArCi0gICAgIjdjNjZiMzAzYWFlODBiMDNhNmJlYWExNzZiYjZiZWY4ODNiZTQzNmYyYTE1NzllZGQ4MGNlMjNlZGYxNTFhMWY0Y2VkOTdhZjgzYWJjZCIgKwotICAgICI5ODEyMDcwNDFmZDViMmRhM2I0OTgzNDZmY2ZjZDk0OTEwZDUyZjI1NTM3YzRhNDNjZTNmYmUxN2RjN2Q0M2U2Y2JkYjRkOGYxMjQyZGMiICsKLSAgICAiYjZiZDliNTkwNmJlNzRkYThkYWE3ZDcyODBmOTcxMzBmMzE4YTE2YzA3YmFmMTE4ODM5YjE1NjI5OWE0ODUyMmY5ZmFlMjM3MWM5NjY1IiArCi0gICAgImM1YWU5Y2I2IildCi0jZWxzZQotW2Fzc2VtYmx5OiBJbnRlcm5hbHNWaXNpYmxlVG8oIkdvb2dsZS5Qcm90b2J1Zi5UZXN0IildCi0jZW5kaWYKLQotW2Fzc2VtYmx5OiBBc3NlbWJseVZlcnNpb24oIjMuMC4wLjAiKV0KLVthc3NlbWJseTogQXNzZW1ibHlGaWxlVmVyc2lvbigiMy4wLjAuMCIpXQotW2Fzc2VtYmx5OiBBc3NlbWJseUluZm9ybWF0aW9uYWxWZXJzaW9uKCIzLjAuMC1iZXRhMyIpXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUHJvdG9QcmVjb25kaXRpb25zLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUHJvdG9QcmVjb25kaXRpb25zLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYmFlYjliLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1Byb3RvUHJlY29uZGl0aW9ucy5jcworKysgL2Rldi9udWxsCkBAIC0xLDc5ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1ZgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gSGVscGVyIG1ldGhvZHMgZm9yIHRocm93aW5nIGV4Y2VwdGlvbnMgd2hlbiBwcmVjb25kaXRpb25zIGFyZSBub3QgbWV0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgLy8vIDxyZW1hcmtzPgotICAgIC8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBhbmQgYnkgZ2VuZXJhdGVkIGNvZGU7IGl0IGlzIG5vdCBwYXJ0aWN1bGFybHkKLSAgICAvLy8gZXhwZWN0ZWQgdG8gYmUgdXNlZCBmcm9tIGFwcGxpY2F0aW9uIGNvZGUsIGFsdGhvdWdoIG5vdGhpbmcgcHJldmVudHMgaXQKLSAgICAvLy8gZnJvbSBiZWluZyB1c2VkIHRoYXQgd2F5LgotICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBQcm90b1ByZWNvbmRpdGlvbnMKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRocm93cyBhbiBBcmd1bWVudE51bGxFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG51bGwsIG90aGVyd2lzZQotICAgICAgICAvLy8gcmV0dXJuIHRoZSB2YWx1ZSB0byB0aGUgY2FsbGVyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIFQgQ2hlY2tOb3ROdWxsPFQ+KFQgdmFsdWUsIHN0cmluZyBuYW1lKSB3aGVyZSBUIDogY2xhc3MKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50TnVsbEV4Y2VwdGlvbihuYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRocm93cyBhbiBBcmd1bWVudE51bGxFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHZhbHVlIGlzIG51bGwsIG90aGVyd2lzZQotICAgICAgICAvLy8gcmV0dXJuIHRoZSB2YWx1ZSB0byB0aGUgY2FsbGVyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gPHNlZSBjcmVmPSJDaGVja05vdE51bGx7VH0oVCwgc3RyaW5nKSIvPiBidXQgd2l0aG91dCB0aGUgdHlwZSBwYXJhbWV0ZXIKLSAgICAgICAgLy8vIGNvbnN0cmFpbnQuIEluIG1vc3QgY2FzZXMsIHRoZSBjb25zdHJhaW50IGlzIHVzZWZ1bCB0byBwcmV2ZW50IHlvdSBmcm9tIGNhbGxpbmcgQ2hlY2tOb3ROdWxsCi0gICAgICAgIC8vLyB3aXRoIGEgdmFsdWUgdHlwZSAtIGJ1dCBpdCBnZXRzIGluIHRoZSB3YXkgaWYgZWl0aGVyIHlvdSB3YW50IHRvIHVzZSBpdCB3aXRoIGEgbnVsbGFibGUKLSAgICAgICAgLy8vIHZhbHVlIHR5cGUsIG9yIHlvdSB3YW50IHRvIHVzZSBpdCB3aXRoIGFuIHVuY29uc3RyYWluZWQgdHlwZSBwYXJhbWV0ZXIuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBUIENoZWNrTm90TnVsbFVuY29uc3RyYWluZWQ8VD4oVCB2YWx1ZSwgc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudE51bGxFeGNlcHRpb24obmFtZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTEzOGRmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRGVzY3JpcHRvci5jcworKysgL2Rldi9udWxsCkBAIC0xLDU0MjEgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEKLSNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotdXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1ZjsKLXVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zOwotdXNpbmcgcGJyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24gewotCi0gIC8vLyA8c3VtbWFyeT5Ib2xkZXIgZm9yIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGZyb20gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIGludGVybmFsIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIERlc2NyaXB0b3JSZWZsZWN0aW9uIHsKLQotICAgICNyZWdpb24gRGVzY3JpcHRvcgotICAgIC8vLyA8c3VtbWFyeT5GaWxlIGRlc2NyaXB0b3IgZm9yIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgIHN0YXRpYyBEZXNjcmlwdG9yUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNpQm5iMjluYkdVdmNISnZkRzlpZFdZdlpHVnpZM0pwY0hSdmNpNXdjbTkwYnhJUFoyOXZaMnhsTG5CeSIsCi0gICAgICAgICAgICAiYjNSdlluVm1Ja2NLRVVacGJHVkVaWE5qY21sd2RHOXlVMlYwRWpJS0JHWnBiR1VZQVNBREtBc3lKQzVuIiwKLSAgICAgICAgICAgICJiMjluYkdVdWNISnZkRzlpZFdZdVJtbHNaVVJsYzJOeWFYQjBiM0pRY205MGJ5TGJBd29UUm1sc1pVUmwiLAotICAgICAgICAgICAgImMyTnlhWEIwYjNKUWNtOTBieElNQ2dSdVlXMWxHQUVnQVNnSkVnOEtCM0JoWTJ0aFoyVVlBaUFCS0FrUyIsCi0gICAgICAgICAgICAiRWdvS1pHVndaVzVrWlc1amVSZ0RJQU1vQ1JJWkNoRndkV0pzYVdOZlpHVndaVzVrWlc1amVSZ0tJQU1vIiwKLSAgICAgICAgICAgICJCUklYQ2c5M1pXRnJYMlJsY0dWdVpHVnVZM2tZQ3lBREtBVVNOZ29NYldWemMyRm5aVjkwZVhCbEdBUWciLAotICAgICAgICAgICAgIkF5Z0xNaUF1WjI5dloyeGxMbkJ5YjNSdlluVm1Ma1JsYzJOeWFYQjBiM0pRY205MGJ4STNDZ2xsYm5WdCIsCi0gICAgICAgICAgICAiWDNSNWNHVVlCU0FES0FzeUpDNW5iMjluYkdVdWNISnZkRzlpZFdZdVJXNTFiVVJsYzJOeWFYQjBiM0pRIiwKLSAgICAgICAgICAgICJjbTkwYnhJNENnZHpaWEoyYVdObEdBWWdBeWdMTWljdVoyOXZaMnhsTG5CeWIzUnZZblZtTGxObGNuWnAiLAotICAgICAgICAgICAgIlkyVkVaWE5qY21sd2RHOXlVSEp2ZEc4U09Bb0paWGgwWlc1emFXOXVHQWNnQXlnTE1pVXVaMjl2WjJ4bCIsCi0gICAgICAgICAgICAiTG5CeWIzUnZZblZtTGtacFpXeGtSR1Z6WTNKcGNIUnZjbEJ5YjNSdkVpMEtCMjl3ZEdsdmJuTVlDQ0FCIiwKLSAgICAgICAgICAgICJLQXN5SEM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Um1sc1pVOXdkR2x2Ym5NU09Rb1FjMjkxY21ObFgyTnYiLAotICAgICAgICAgICAgIlpHVmZhVzVtYnhnSklBRW9DeklmTG1kdmIyZHNaUzV3Y205MGIySjFaaTVUYjNWeVkyVkRiMlJsU1c1bSIsCi0gICAgICAgICAgICAiYnhJT0NnWnplVzUwWVhnWURDQUJLQWtpOEFRS0QwUmxjMk55YVhCMGIzSlFjbTkwYnhJTUNnUnVZVzFsIiwKLSAgICAgICAgICAgICJHQUVnQVNnSkVqUUtCV1pwWld4a0dBSWdBeWdMTWlVdVoyOXZaMnhsTG5CeWIzUnZZblZtTGtacFpXeGsiLAotICAgICAgICAgICAgIlJHVnpZM0pwY0hSdmNsQnliM1J2RWpnS0NXVjRkR1Z1YzJsdmJoZ0dJQU1vQ3pJbExtZHZiMmRzWlM1dyIsCi0gICAgICAgICAgICAiY205MGIySjFaaTVHYVdWc1pFUmxjMk55YVhCMGIzSlFjbTkwYnhJMUNndHVaWE4wWldSZmRIbHdaUmdEIiwKLSAgICAgICAgICAgICJJQU1vQ3pJZ0xtZHZiMmRzWlM1d2NtOTBiMkoxWmk1RVpYTmpjbWx3ZEc5eVVISnZkRzhTTndvSlpXNTEiLAotICAgICAgICAgICAgImJWOTBlWEJsR0FRZ0F5Z0xNaVF1WjI5dloyeGxMbkJ5YjNSdlluVm1Ma1Z1ZFcxRVpYTmpjbWx3ZEc5eSIsCi0gICAgICAgICAgICAiVUhKdmRHOFNTQW9QWlhoMFpXNXphVzl1WDNKaGJtZGxHQVVnQXlnTE1pOHVaMjl2WjJ4bExuQnliM1J2IiwKLSAgICAgICAgICAgICJZblZtTGtSbGMyTnlhWEIwYjNKUWNtOTBieTVGZUhSbGJuTnBiMjVTWVc1blpSSTVDZ3B2Ym1WdlpsOWsiLAotICAgICAgICAgICAgIlpXTnNHQWdnQXlnTE1pVXVaMjl2WjJ4bExuQnliM1J2WW5WbUxrOXVaVzltUkdWelkzSnBjSFJ2Y2xCeSIsCi0gICAgICAgICAgICAiYjNSdkVqQUtCMjl3ZEdsdmJuTVlCeUFCS0FzeUh5NW5iMjluYkdVdWNISnZkRzlpZFdZdVRXVnpjMkZuIiwKLSAgICAgICAgICAgICJaVTl3ZEdsdmJuTVNSZ29PY21WelpYSjJaV1JmY21GdVoyVVlDU0FES0FzeUxpNW5iMjluYkdVdWNISnYiLAotICAgICAgICAgICAgImRHOWlkV1l1UkdWelkzSnBjSFJ2Y2xCeWIzUnZMbEpsYzJWeWRtVmtVbUZ1WjJVU0ZRb05jbVZ6WlhKMiIsCi0gICAgICAgICAgICAiWldSZmJtRnRaUmdLSUFNb0NSb3NDZzVGZUhSbGJuTnBiMjVTWVc1blpSSU5DZ1Z6ZEdGeWRCZ0JJQUVvIiwKLSAgICAgICAgICAgICJCUklMQ2dObGJtUVlBaUFCS0FVYUt3b05VbVZ6WlhKMlpXUlNZVzVuWlJJTkNnVnpkR0Z5ZEJnQklBRW8iLAotICAgICAgICAgICAgIkJSSUxDZ05sYm1RWUFpQUJLQVVpdkFVS0ZFWnBaV3hrUkdWelkzSnBjSFJ2Y2xCeWIzUnZFZ3dLQkc1aCIsCi0gICAgICAgICAgICAiYldVWUFTQUJLQWtTRGdvR2JuVnRZbVZ5R0FNZ0FTZ0ZFam9LQld4aFltVnNHQVFnQVNnT01pc3VaMjl2IiwKLSAgICAgICAgICAgICJaMnhsTG5CeWIzUnZZblZtTGtacFpXeGtSR1Z6WTNKcGNIUnZjbEJ5YjNSdkxreGhZbVZzRWpnS0JIUjUiLAotICAgICAgICAgICAgImNHVVlCU0FCS0E0eUtpNW5iMjluYkdVdWNISnZkRzlpZFdZdVJtbGxiR1JFWlhOamNtbHdkRzl5VUhKdiIsCi0gICAgICAgICAgICAiZEc4dVZIbHdaUklSQ2dsMGVYQmxYMjVoYldVWUJpQUJLQWtTRUFvSVpYaDBaVzVrWldVWUFpQUJLQWtTIiwKLSAgICAgICAgICAgICJGUW9OWkdWbVlYVnNkRjkyWVd4MVpSZ0hJQUVvQ1JJVENndHZibVZ2Wmw5cGJtUmxlQmdKSUFFb0JSSVIiLAotICAgICAgICAgICAgIkNnbHFjMjl1WDI1aGJXVVlDaUFCS0FrU0xnb0hiM0IwYVc5dWN4Z0lJQUVvQ3pJZExtZHZiMmRzWlM1dyIsCi0gICAgICAgICAgICAiY205MGIySjFaaTVHYVdWc1pFOXdkR2x2Ym5NaXRnSUtCRlI1Y0dVU0R3b0xWRmxRUlY5RVQxVkNURVVRIiwKLSAgICAgICAgICAgICJBUklPQ2dwVVdWQkZYMFpNVDBGVUVBSVNEZ29LVkZsUVJWOUpUbFEyTkJBREVnOEtDMVJaVUVWZlZVbE8iLAotICAgICAgICAgICAgIlZEWTBFQVFTRGdvS1ZGbFFSVjlKVGxRek1oQUZFaEFLREZSWlVFVmZSa2xZUlVRMk5CQUdFaEFLREZSWiIsCi0gICAgICAgICAgICAiVUVWZlJrbFlSVVF6TWhBSEVnMEtDVlJaVUVWZlFrOVBUQkFJRWc4S0MxUlpVRVZmVTFSU1NVNUhFQWtTIiwKLSAgICAgICAgICAgICJEZ29LVkZsUVJWOUhVazlWVUJBS0VoQUtERlJaVUVWZlRVVlRVMEZIUlJBTEVnNEtDbFJaVUVWZlFsbFUiLAotICAgICAgICAgICAgIlJWTVFEQklQQ2d0VVdWQkZYMVZKVGxRek1oQU5FZzBLQ1ZSWlVFVmZSVTVWVFJBT0VoRUtEVlJaVUVWZiIsCi0gICAgICAgICAgICAiVTBaSldFVkVNeklRRHhJUkNnMVVXVkJGWDFOR1NWaEZSRFkwRUJBU0R3b0xWRmxRUlY5VFNVNVVNeklRIiwKLSAgICAgICAgICAgICJFUklQQ2d0VVdWQkZYMU5KVGxRMk5CQVNJa01LQlV4aFltVnNFaElLRGt4QlFrVk1YMDlRVkVsUFRrRk0iLAotICAgICAgICAgICAgIkVBRVNFZ29PVEVGQ1JVeGZVa1ZSVlVsU1JVUVFBaElTQ2c1TVFVSkZURjlTUlZCRlFWUkZSQkFESWlRSyIsCi0gICAgICAgICAgICAiRkU5dVpXOW1SR1Z6WTNKcGNIUnZjbEJ5YjNSdkVnd0tCRzVoYldVWUFTQUJLQWtpakFFS0UwVnVkVzFFIiwKLSAgICAgICAgICAgICJaWE5qY21sd2RHOXlVSEp2ZEc4U0RBb0VibUZ0WlJnQklBRW9DUkk0Q2dWMllXeDFaUmdDSUFNb0N6SXAiLAotICAgICAgICAgICAgIkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1RmJuVnRWbUZzZFdWRVpYTmpjbWx3ZEc5eVVISnZkRzhTTFFvSCIsCi0gICAgICAgICAgICAiYjNCMGFXOXVjeGdESUFFb0N6SWNMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUZiblZ0VDNCMGFXOXVjeUpzIiwKLSAgICAgICAgICAgICJDaGhGYm5WdFZtRnNkV1ZFWlhOamNtbHdkRzl5VUhKdmRHOFNEQW9FYm1GdFpSZ0JJQUVvQ1JJT0NnWnUiLAotICAgICAgICAgICAgImRXMWlaWElZQWlBQktBVVNNZ29IYjNCMGFXOXVjeGdESUFFb0N6SWhMbWR2YjJkc1pTNXdjbTkwYjJKMSIsCi0gICAgICAgICAgICAiWmk1RmJuVnRWbUZzZFdWUGNIUnBiMjV6SXBBQkNoWlRaWEoyYVdObFJHVnpZM0pwY0hSdmNsQnliM1J2IiwKLSAgICAgICAgICAgICJFZ3dLQkc1aGJXVVlBU0FCS0FrU05nb0diV1YwYUc5a0dBSWdBeWdMTWlZdVoyOXZaMnhsTG5CeWIzUnYiLAotICAgICAgICAgICAgIlluVm1MazFsZEdodlpFUmxjMk55YVhCMGIzSlFjbTkwYnhJd0NnZHZjSFJwYjI1ekdBTWdBU2dMTWg4dSIsCi0gICAgICAgICAgICAiWjI5dloyeGxMbkJ5YjNSdlluVm1MbE5sY25acFkyVlBjSFJwYjI1eklzRUJDaFZOWlhSb2IyUkVaWE5qIiwKLSAgICAgICAgICAgICJjbWx3ZEc5eVVISnZkRzhTREFvRWJtRnRaUmdCSUFFb0NSSVNDZ3BwYm5CMWRGOTBlWEJsR0FJZ0FTZ0oiLAotICAgICAgICAgICAgIkVoTUtDMjkxZEhCMWRGOTBlWEJsR0FNZ0FTZ0pFaThLQjI5d2RHbHZibk1ZQkNBQktBc3lIaTVuYjI5biIsCi0gICAgICAgICAgICAiYkdVdWNISnZkRzlpZFdZdVRXVjBhRzlrVDNCMGFXOXVjeElmQ2hCamJHbGxiblJmYzNSeVpXRnRhVzVuIiwKLSAgICAgICAgICAgICJHQVVnQVNnSU9nVm1ZV3h6WlJJZkNoQnpaWEoyWlhKZmMzUnlaV0Z0YVc1bkdBWWdBU2dJT2dWbVlXeHoiLAotICAgICAgICAgICAgIlpTS0hCUW9MUm1sc1pVOXdkR2x2Ym5NU0ZBb01hbUYyWVY5d1lXTnJZV2RsR0FFZ0FTZ0pFaHdLRkdwaCIsCi0gICAgICAgICAgICAiZG1GZmIzVjBaWEpmWTJ4aGMzTnVZVzFsR0FnZ0FTZ0pFaUlLRTJwaGRtRmZiWFZzZEdsd2JHVmZabWxzIiwKLSAgICAgICAgICAgICJaWE1ZQ2lBQktBZzZCV1poYkhObEVpd0tIV3BoZG1GZloyVnVaWEpoZEdWZlpYRjFZV3h6WDJGdVpGOW8iLAotICAgICAgICAgICAgIllYTm9HQlFnQVNnSU9nVm1ZV3h6WlJJbENoWnFZWFpoWDNOMGNtbHVaMTlqYUdWamExOTFkR1k0R0JzZyIsCi0gICAgICAgICAgICAiQVNnSU9nVm1ZV3h6WlJKR0NneHZjSFJwYldsNlpWOW1iM0lZQ1NBQktBNHlLUzVuYjI5bmJHVXVjSEp2IiwKLSAgICAgICAgICAgICJkRzlpZFdZdVJtbHNaVTl3ZEdsdmJuTXVUM0IwYVcxcGVtVk5iMlJsT2dWVFVFVkZSQklTQ2dwbmIxOXciLAotICAgICAgICAgICAgIllXTnJZV2RsR0FzZ0FTZ0pFaUlLRTJOalgyZGxibVZ5YVdOZmMyVnlkbWxqWlhNWUVDQUJLQWc2QldaaCIsCi0gICAgICAgICAgICAiYkhObEVpUUtGV3BoZG1GZloyVnVaWEpwWTE5elpYSjJhV05sY3hnUklBRW9DRG9GWm1Gc2MyVVNJZ29UIiwKLSAgICAgICAgICAgICJjSGxmWjJWdVpYSnBZMTl6WlhKMmFXTmxjeGdTSUFFb0NEb0ZabUZzYzJVU0dRb0taR1Z3Y21WallYUmwiLAotICAgICAgICAgICAgIlpCZ1hJQUVvQ0RvRlptRnNjMlVTSHdvUVkyTmZaVzVoWW14bFgyRnlaVzVoY3hnZklBRW9DRG9GWm1GcyIsCi0gICAgICAgICAgICAiYzJVU0dRb1JiMkpxWTE5amJHRnpjMTl3Y21WbWFYZ1lKQ0FCS0FrU0dBb1FZM05vWVhKd1gyNWhiV1Z6IiwKLSAgICAgICAgICAgICJjR0ZqWlJnbElBRW9DUkpEQ2hSMWJtbHVkR1Z5Y0hKbGRHVmtYMjl3ZEdsdmJoam5CeUFES0FzeUpDNW4iLAotICAgICAgICAgICAgImIyOW5iR1V1Y0hKdmRHOWlkV1l1Vlc1cGJuUmxjbkJ5WlhSbFpFOXdkR2x2YmlJNkNneFBjSFJwYldsNiIsCi0gICAgICAgICAgICAiWlUxdlpHVVNDUW9GVTFCRlJVUVFBUklOQ2dsRFQwUkZYMU5KV2tVUUFoSVFDZ3hNU1ZSRlgxSlZUbFJKIiwKLSAgICAgICAgICAgICJUVVVRQXlvSkNPZ0hFSUNBZ0lBQ1NnUUlKaEFuSXVZQkNnNU5aWE56WVdkbFQzQjBhVzl1Y3hJbUNoZHQiLAotICAgICAgICAgICAgIlpYTnpZV2RsWDNObGRGOTNhWEpsWDJadmNtMWhkQmdCSUFFb0NEb0ZabUZzYzJVU0xnb2ZibTlmYzNSaCIsCi0gICAgICAgICAgICAiYm1SaGNtUmZaR1Z6WTNKcGNIUnZjbDloWTJObGMzTnZjaGdDSUFFb0NEb0ZabUZzYzJVU0dRb0taR1Z3IiwKLSAgICAgICAgICAgICJjbVZqWVhSbFpCZ0RJQUVvQ0RvRlptRnNjMlVTRVFvSmJXRndYMlZ1ZEhKNUdBY2dBU2dJRWtNS0ZIVnUiLAotICAgICAgICAgICAgImFXNTBaWEp3Y21WMFpXUmZiM0IwYVc5dUdPY0hJQU1vQ3pJa0xtZHZiMmRzWlM1d2NtOTBiMkoxWmk1ViIsCi0gICAgICAgICAgICAiYm1sdWRHVnljSEpsZEdWa1QzQjBhVzl1S2drSTZBY1FnSUNBZ0FJaW1BTUtERVpwWld4a1QzQjBhVzl1IiwKLSAgICAgICAgICAgICJjeEk2Q2dWamRIbHdaUmdCSUFFb0RqSWpMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUdhV1ZzWkU5d2RHbHYiLAotICAgICAgICAgICAgImJuTXVRMVI1Y0dVNkJsTlVVa2xPUnhJT0NnWndZV05yWldRWUFpQUJLQWdTUHdvR2FuTjBlWEJsR0FZZyIsCi0gICAgICAgICAgICAiQVNnT01pUXVaMjl2WjJ4bExuQnliM1J2WW5WbUxrWnBaV3hrVDNCMGFXOXVjeTVLVTFSNWNHVTZDVXBUIiwKLSAgICAgICAgICAgICJYMDVQVWsxQlRCSVRDZ1JzWVhwNUdBVWdBU2dJT2dWbVlXeHpaUklaQ2dwa1pYQnlaV05oZEdWa0dBTWciLAotICAgICAgICAgICAgIkFTZ0lPZ1ZtWVd4elpSSVRDZ1IzWldGckdBb2dBU2dJT2dWbVlXeHpaUkpEQ2hSMWJtbHVkR1Z5Y0hKbCIsCi0gICAgICAgICAgICAiZEdWa1gyOXdkR2x2YmhqbkJ5QURLQXN5SkM1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1Vlc1cGJuUmxjbkJ5IiwKLSAgICAgICAgICAgICJaWFJsWkU5d2RHbHZiaUl2Q2dWRFZIbHdaUklLQ2daVFZGSkpUa2NRQUJJSUNnUkRUMUpFRUFFU0VBb00iLAotICAgICAgICAgICAgIlUxUlNTVTVIWDFCSlJVTkZFQUlpTlFvR1NsTlVlWEJsRWcwS0NVcFRYMDVQVWsxQlRCQUFFZzBLQ1VwVCIsCi0gICAgICAgICAgICAiWDFOVVVrbE9SeEFCRWcwS0NVcFRYMDVWVFVKRlVoQUNLZ2tJNkFjUWdJQ0FnQUlpalFFS0MwVnVkVzFQIiwKLSAgICAgICAgICAgICJjSFJwYjI1ekVoTUtDMkZzYkc5M1gyRnNhV0Z6R0FJZ0FTZ0lFaGtLQ21SbGNISmxZMkYwWldRWUF5QUIiLAotICAgICAgICAgICAgIktBZzZCV1poYkhObEVrTUtGSFZ1YVc1MFpYSndjbVYwWldSZmIzQjBhVzl1R09jSElBTW9DeklrTG1kdiIsCi0gICAgICAgICAgICAiYjJkc1pTNXdjbTkwYjJKMVppNVZibWx1ZEdWeWNISmxkR1ZrVDNCMGFXOXVLZ2tJNkFjUWdJQ0FnQUlpIiwKLSAgICAgICAgICAgICJmUW9RUlc1MWJWWmhiSFZsVDNCMGFXOXVjeElaQ2dwa1pYQnlaV05oZEdWa0dBRWdBU2dJT2dWbVlXeHoiLAotICAgICAgICAgICAgIlpSSkRDaFIxYm1sdWRHVnljSEpsZEdWa1gyOXdkR2x2YmhqbkJ5QURLQXN5SkM1bmIyOW5iR1V1Y0hKdiIsCi0gICAgICAgICAgICAiZEc5aWRXWXVWVzVwYm5SbGNuQnlaWFJsWkU5d2RHbHZiaW9KQ09nSEVJQ0FnSUFDSW5zS0RsTmxjblpwIiwKLSAgICAgICAgICAgICJZMlZQY0hScGIyNXpFaGtLQ21SbGNISmxZMkYwWldRWUlTQUJLQWc2QldaaGJITmxFa01LRkhWdWFXNTAiLAotICAgICAgICAgICAgIlpYSndjbVYwWldSZmIzQjBhVzl1R09jSElBTW9DeklrTG1kdmIyZHNaUzV3Y205MGIySjFaaTVWYm1sdSIsCi0gICAgICAgICAgICAiZEdWeWNISmxkR1ZrVDNCMGFXOXVLZ2tJNkFjUWdJQ0FnQUlpZWdvTlRXVjBhRzlrVDNCMGFXOXVjeElaIiwKLSAgICAgICAgICAgICJDZ3BrWlhCeVpXTmhkR1ZrR0NFZ0FTZ0lPZ1ZtWVd4elpSSkRDaFIxYm1sdWRHVnljSEpsZEdWa1gyOXciLAotICAgICAgICAgICAgImRHbHZiaGpuQnlBREtBc3lKQzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVWVzVwYm5SbGNuQnlaWFJsWkU5dyIsCi0gICAgICAgICAgICAiZEdsdmJpb0pDT2dIRUlDQWdJQUNJcDRDQ2hOVmJtbHVkR1Z5Y0hKbGRHVmtUM0IwYVc5dUVqc0tCRzVoIiwKLSAgICAgICAgICAgICJiV1VZQWlBREtBc3lMUzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVWVzVwYm5SbGNuQnlaWFJsWkU5d2RHbHYiLAotICAgICAgICAgICAgImJpNU9ZVzFsVUdGeWRCSVlDaEJwWkdWdWRHbG1hV1Z5WDNaaGJIVmxHQU1nQVNnSkVob0tFbkJ2YzJsMCIsCi0gICAgICAgICAgICAiYVhabFgybHVkRjkyWVd4MVpSZ0VJQUVvQkJJYUNoSnVaV2RoZEdsMlpWOXBiblJmZG1Gc2RXVVlCU0FCIiwKLSAgICAgICAgICAgICJLQU1TRkFvTVpHOTFZbXhsWDNaaGJIVmxHQVlnQVNnQkVoUUtESE4wY21sdVoxOTJZV3gxWlJnSElBRW8iLAotICAgICAgICAgICAgIkRCSVhDZzloWjJkeVpXZGhkR1ZmZG1Gc2RXVVlDQ0FCS0FrYU13b0lUbUZ0WlZCaGNuUVNFUW9KYm1GdCIsCi0gICAgICAgICAgICAiWlY5d1lYSjBHQUVnQWlnSkVoUUtER2x6WDJWNGRHVnVjMmx2YmhnQ0lBSW9DQ0xWQVFvT1UyOTFjbU5sIiwKLSAgICAgICAgICAgICJRMjlrWlVsdVptOFNPZ29JYkc5allYUnBiMjRZQVNBREtBc3lLQzVuYjI5bmJHVXVjSEp2ZEc5aWRXWXUiLAotICAgICAgICAgICAgIlUyOTFjbU5sUTI5a1pVbHVabTh1VEc5allYUnBiMjRhaGdFS0NFeHZZMkYwYVc5dUVoQUtCSEJoZEdnWSIsCi0gICAgICAgICAgICAiQVNBREtBVkNBaEFCRWhBS0JITndZVzRZQWlBREtBVkNBaEFCRWhnS0VHeGxZV1JwYm1kZlkyOXRiV1Z1IiwKLSAgICAgICAgICAgICJkSE1ZQXlBQktBa1NHUW9SZEhKaGFXeHBibWRmWTI5dGJXVnVkSE1ZQkNBQktBa1NJUW9aYkdWaFpHbHUiLAotICAgICAgICAgICAgIloxOWtaWFJoWTJobFpGOWpiMjF0Wlc1MGN4Z0dJQU1vQ1NLbkFRb1JSMlZ1WlhKaGRHVmtRMjlrWlVsdSIsCi0gICAgICAgICAgICAiWm04U1FRb0tZVzV1YjNSaGRHbHZiaGdCSUFNb0N6SXRMbWR2YjJkc1pTNXdjbTkwYjJKMVppNUhaVzVsIiwKLSAgICAgICAgICAgICJjbUYwWldSRGIyUmxTVzVtYnk1QmJtNXZkR0YwYVc5dUdrOEtDa0Z1Ym05MFlYUnBiMjRTRUFvRWNHRjAiLAotICAgICAgICAgICAgImFCZ0JJQU1vQlVJQ0VBRVNFd29MYzI5MWNtTmxYMlpwYkdVWUFpQUJLQWtTRFFvRlltVm5hVzRZQXlBQiIsCi0gICAgICAgICAgICAiS0FVU0N3b0RaVzVrR0FRZ0FTZ0ZRbGdLRTJOdmJTNW5iMjluYkdVdWNISnZkRzlpZFdaQ0VFUmxjMk55IiwKLSAgICAgICAgICAgICJhWEIwYjNKUWNtOTBiM05JQVZvS1pHVnpZM0pwY0hSdmNxSUNBMGRRUXFvQ0drZHZiMmRzWlM1UWNtOTAiLAotICAgICAgICAgICAgImIySjFaaTVTWldac1pXTjBhVzl1IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWxlRGVzY3JpcHRvclNldCksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmlsZURlc2NyaXB0b3JTZXQuUGFyc2VyLCBuZXdbXXsgIkZpbGUiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmlsZURlc2NyaXB0b3JQcm90byksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmlsZURlc2NyaXB0b3JQcm90by5QYXJzZXIsIG5ld1tdeyAiTmFtZSIsICJQYWNrYWdlIiwgIkRlcGVuZGVuY3kiLCAiUHVibGljRGVwZW5kZW5jeSIsICJXZWFrRGVwZW5kZW5jeSIsICJNZXNzYWdlVHlwZSIsICJFbnVtVHlwZSIsICJTZXJ2aWNlIiwgIkV4dGVuc2lvbiIsICJPcHRpb25zIiwgIlNvdXJjZUNvZGVJbmZvIiwgIlN5bnRheCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8pLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90by5QYXJzZXIsIG5ld1tdeyAiTmFtZSIsICJGaWVsZCIsICJFeHRlbnNpb24iLCAiTmVzdGVkVHlwZSIsICJFbnVtVHlwZSIsICJFeHRlbnNpb25SYW5nZSIsICJPbmVvZkRlY2wiLCAiT3B0aW9ucyIsICJSZXNlcnZlZFJhbmdlIiwgIlJlc2VydmVkTmFtZSIgfSwgbnVsbCwgbnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7IG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlLlBhcnNlciwgbmV3W117ICJTdGFydCIsICJFbmQiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvLlR5cGVzLlJlc2VydmVkUmFuZ2UpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90by5UeXBlcy5SZXNlcnZlZFJhbmdlLlBhcnNlciwgbmV3W117ICJTdGFydCIsICJFbmQiIH0sIG51bGwsIG51bGwsIG51bGwpfSksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZERlc2NyaXB0b3JQcm90byksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8uUGFyc2VyLCBuZXdbXXsgIk5hbWUiLCAiTnVtYmVyIiwgIkxhYmVsIiwgIlR5cGUiLCAiVHlwZU5hbWUiLCAiRXh0ZW5kZWUiLCAiRGVmYXVsdFZhbHVlIiwgIk9uZW9mSW5kZXgiLCAiSnNvbk5hbWUiLCAiT3B0aW9ucyIgfSwgbnVsbCwgbmV3W117IHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUpLCB0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5MYWJlbCkgfSwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5PbmVvZkRlc2NyaXB0b3JQcm90byksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uT25lb2ZEZXNjcmlwdG9yUHJvdG8uUGFyc2VyLCBuZXdbXXsgIk5hbWUiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bURlc2NyaXB0b3JQcm90byksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bURlc2NyaXB0b3JQcm90by5QYXJzZXIsIG5ld1tdeyAiTmFtZSIsICJWYWx1ZSIsICJPcHRpb25zIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLlBhcnNlciwgbmV3W117ICJOYW1lIiwgIk51bWJlciIsICJPcHRpb25zIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uUGFyc2VyLCBuZXdbXXsgIk5hbWUiLCAiTWV0aG9kIiwgIk9wdGlvbnMiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uTWV0aG9kRGVzY3JpcHRvclByb3RvKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXRob2REZXNjcmlwdG9yUHJvdG8uUGFyc2VyLCBuZXdbXXsgIk5hbWUiLCAiSW5wdXRUeXBlIiwgIk91dHB1dFR5cGUiLCAiT3B0aW9ucyIsICJDbGllbnRTdHJlYW1pbmciLCAiU2VydmVyU3RyZWFtaW5nIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVPcHRpb25zKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWxlT3B0aW9ucy5QYXJzZXIsIG5ld1tdeyAiSmF2YVBhY2thZ2UiLCAiSmF2YU91dGVyQ2xhc3NuYW1lIiwgIkphdmFNdWx0aXBsZUZpbGVzIiwgIkphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2giLCAiSmF2YVN0cmluZ0NoZWNrVXRmOCIsICJPcHRpbWl6ZUZvciIsICJHb1BhY2thZ2UiLCAiQ2NHZW5lcmljU2VydmljZXMiLCAiSmF2YUdlbmVyaWNTZXJ2aWNlcyIsICJQeUdlbmVyaWNTZXJ2aWNlcyIsICJEZXByZWNhdGVkIiwgIkNjRW5hYmxlQXJlbmFzIiwgIk9iamNDbGFzc1ByZWZpeCIsICJDc2hhcnBOYW1lc3BhY2UiLCAiVW5pbnRlcnByZXRlZE9wdGlvbiIgfSwgbnVsbCwgbmV3W117IHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZSkgfSwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXNzYWdlT3B0aW9ucyksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uTWVzc2FnZU9wdGlvbnMuUGFyc2VyLCBuZXdbXXsgIk1lc3NhZ2VTZXRXaXJlRm9ybWF0IiwgIk5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3IiLCAiRGVwcmVjYXRlZCIsICJNYXBFbnRyeSIsICJVbmludGVycHJldGVkT3B0aW9uIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkT3B0aW9ucyksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGRPcHRpb25zLlBhcnNlciwgbmV3W117ICJDdHlwZSIsICJQYWNrZWQiLCAiSnN0eXBlIiwgIkxhenkiLCAiRGVwcmVjYXRlZCIsICJXZWFrIiwgIlVuaW50ZXJwcmV0ZWRPcHRpb24iIH0sIG51bGwsIG5ld1tdeyB0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZE9wdGlvbnMuVHlwZXMuQ1R5cGUpLCB0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZE9wdGlvbnMuVHlwZXMuSlNUeXBlKSB9LCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1PcHRpb25zKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtT3B0aW9ucy5QYXJzZXIsIG5ld1tdeyAiQWxsb3dBbGlhcyIsICJEZXByZWNhdGVkIiwgIlVuaW50ZXJwcmV0ZWRPcHRpb24iIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlT3B0aW9ucyksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlT3B0aW9ucy5QYXJzZXIsIG5ld1tdeyAiRGVwcmVjYXRlZCIsICJVbmludGVycHJldGVkT3B0aW9uIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNlcnZpY2VPcHRpb25zKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5TZXJ2aWNlT3B0aW9ucy5QYXJzZXIsIG5ld1tdeyAiRGVwcmVjYXRlZCIsICJVbmludGVycHJldGVkT3B0aW9uIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLk1ldGhvZE9wdGlvbnMpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLk1ldGhvZE9wdGlvbnMuUGFyc2VyLCBuZXdbXXsgIkRlcHJlY2F0ZWQiLCAiVW5pbnRlcnByZXRlZE9wdGlvbiIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uLlBhcnNlciwgbmV3W117ICJOYW1lIiwgIklkZW50aWZpZXJWYWx1ZSIsICJQb3NpdGl2ZUludFZhbHVlIiwgIk5lZ2F0aXZlSW50VmFsdWUiLCAiRG91YmxlVmFsdWUiLCAiU3RyaW5nVmFsdWUiLCAiQWdncmVnYXRlVmFsdWUiIH0sIG51bGwsIG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uLlR5cGVzLk5hbWVQYXJ0KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uLlR5cGVzLk5hbWVQYXJ0LlBhcnNlciwgbmV3W117ICJOYW1lUGFydF8iLCAiSXNFeHRlbnNpb24iIH0sIG51bGwsIG51bGwsIG51bGwpfSksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5Tb3VyY2VDb2RlSW5mbyksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU291cmNlQ29kZUluZm8uUGFyc2VyLCBuZXdbXXsgIkxvY2F0aW9uIiB9LCBudWxsLCBudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24pLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uLlBhcnNlciwgbmV3W117ICJQYXRoIiwgIlNwYW4iLCAiTGVhZGluZ0NvbW1lbnRzIiwgIlRyYWlsaW5nQ29tbWVudHMiLCAiTGVhZGluZ0RldGFjaGVkQ29tbWVudHMiIH0sIG51bGwsIG51bGwsIG51bGwpfSksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5HZW5lcmF0ZWRDb2RlSW5mbyksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uR2VuZXJhdGVkQ29kZUluZm8uUGFyc2VyLCBuZXdbXXsgIkFubm90YXRpb24iIH0sIG51bGwsIG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5HZW5lcmF0ZWRDb2RlSW5mby5UeXBlcy5Bbm5vdGF0aW9uKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5HZW5lcmF0ZWRDb2RlSW5mby5UeXBlcy5Bbm5vdGF0aW9uLlBhcnNlciwgbmV3W117ICJQYXRoIiwgIlNvdXJjZUZpbGUiLCAiQmVnaW4iLCAiRW5kIiB9LCBudWxsLCBudWxsLCBudWxsKX0pCi0gICAgICAgICAgfSkpOwotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotICAjcmVnaW9uIE1lc3NhZ2VzCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY2FuIG91dHB1dCBhIEZpbGVEZXNjcmlwdG9yU2V0IGNvbnRhaW5pbmcgdGhlIC5wcm90bwotICAvLy8gIGZpbGVzIGl0IHBhcnNlcy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRmlsZURlc2NyaXB0b3JTZXQgOiBwYjo6SU1lc3NhZ2U8RmlsZURlc2NyaXB0b3JTZXQ+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxGaWxlRGVzY3JpcHRvclNldD4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxGaWxlRGVzY3JpcHRvclNldD4oKCkgPT4gbmV3IEZpbGVEZXNjcmlwdG9yU2V0KCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8RmlsZURlc2NyaXB0b3JTZXQ+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvclNldCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3JTZXQoRmlsZURlc2NyaXB0b3JTZXQgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGZpbGVfID0gb3RoZXIuZmlsZV8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3JTZXQgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEZpbGVEZXNjcmlwdG9yU2V0KHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZmlsZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmlsZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVEZXNjcmlwdG9yUHJvdG8+IF9yZXBlYXRlZF9maWxlX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgxMCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWxlRGVzY3JpcHRvclByb3RvLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWxlRGVzY3JpcHRvclByb3RvPiBmaWxlXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWxlRGVzY3JpcHRvclByb3RvPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWxlRGVzY3JpcHRvclByb3RvPiBGaWxlIHsKLSAgICAgIGdldCB7IHJldHVybiBmaWxlXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRmlsZURlc2NyaXB0b3JTZXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhGaWxlRGVzY3JpcHRvclNldCBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZighZmlsZV8uRXF1YWxzKG90aGVyLmZpbGVfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGhhc2ggXj0gZmlsZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgZmlsZV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9maWxlX2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBzaXplICs9IGZpbGVfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX2ZpbGVfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEZpbGVEZXNjcmlwdG9yU2V0IG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBmaWxlXy5BZGQob3RoZXIuZmlsZV8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGZpbGVfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfZmlsZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBEZXNjcmliZXMgYSBjb21wbGV0ZSAucHJvdG8gZmlsZS4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90byA6IHBiOjpJTWVzc2FnZTxGaWxlRGVzY3JpcHRvclByb3RvPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8RmlsZURlc2NyaXB0b3JQcm90bz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxGaWxlRGVzY3JpcHRvclByb3RvPigoKSA9PiBuZXcgRmlsZURlc2NyaXB0b3JQcm90bygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEZpbGVEZXNjcmlwdG9yUHJvdG8+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvclByb3RvKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvclByb3RvKEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87Ci0gICAgICBwYWNrYWdlXyA9IG90aGVyLnBhY2thZ2VfOwotICAgICAgZGVwZW5kZW5jeV8gPSBvdGhlci5kZXBlbmRlbmN5Xy5DbG9uZSgpOwotICAgICAgcHVibGljRGVwZW5kZW5jeV8gPSBvdGhlci5wdWJsaWNEZXBlbmRlbmN5Xy5DbG9uZSgpOwotICAgICAgd2Vha0RlcGVuZGVuY3lfID0gb3RoZXIud2Vha0RlcGVuZGVuY3lfLkNsb25lKCk7Ci0gICAgICBtZXNzYWdlVHlwZV8gPSBvdGhlci5tZXNzYWdlVHlwZV8uQ2xvbmUoKTsKLSAgICAgIGVudW1UeXBlXyA9IG90aGVyLmVudW1UeXBlXy5DbG9uZSgpOwotICAgICAgc2VydmljZV8gPSBvdGhlci5zZXJ2aWNlXy5DbG9uZSgpOwotICAgICAgZXh0ZW5zaW9uXyA9IG90aGVyLmV4dGVuc2lvbl8uQ2xvbmUoKTsKLSAgICAgIE9wdGlvbnMgPSBvdGhlci5vcHRpb25zXyAhPSBudWxsID8gb3RoZXIuT3B0aW9ucy5DbG9uZSgpIDogbnVsbDsKLSAgICAgIFNvdXJjZUNvZGVJbmZvID0gb3RoZXIuc291cmNlQ29kZUluZm9fICE9IG51bGwgPyBvdGhlci5Tb3VyY2VDb2RlSW5mby5DbG9uZSgpIDogbnVsbDsKLSAgICAgIHN5bnRheF8gPSBvdGhlci5zeW50YXhfOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvclByb3RvIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBGaWxlRGVzY3JpcHRvclByb3RvKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZQotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBOYW1lIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrYWdlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQYWNrYWdlRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RyaW5nIHBhY2thZ2VfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgZS5nLiAiZm9vIiwgImZvby5iYXIiLCBldGMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFBhY2thZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIHBhY2thZ2VfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBwYWNrYWdlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRlcGVuZGVuY3kiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERlcGVuZGVuY3lGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8c3RyaW5nPiBfcmVwZWF0ZWRfZGVwZW5kZW5jeV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cmluZygyNik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBkZXBlbmRlbmN5XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIE5hbWVzIG9mIGZpbGVzIGltcG9ydGVkIGJ5IHRoaXMgZmlsZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBEZXBlbmRlbmN5IHsKLSAgICAgIGdldCB7IHJldHVybiBkZXBlbmRlbmN5XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicHVibGljX2RlcGVuZGVuY3kiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFB1YmxpY0RlcGVuZGVuY3lGaWVsZE51bWJlciA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGludD4gX3JlcGVhdGVkX3B1YmxpY0RlcGVuZGVuY3lfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMig4MCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiBwdWJsaWNEZXBlbmRlbmN5XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEluZGV4ZXMgb2YgdGhlIHB1YmxpYyBpbXBvcnRlZCBmaWxlcyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0IGFib3ZlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IFB1YmxpY0RlcGVuZGVuY3kgewotICAgICAgZ2V0IHsgcmV0dXJuIHB1YmxpY0RlcGVuZGVuY3lfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ3ZWFrX2RlcGVuZGVuY3kiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFdlYWtEZXBlbmRlbmN5RmllbGROdW1iZXIgPSAxMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ+IF9yZXBlYXRlZF93ZWFrRGVwZW5kZW5jeV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckludDMyKDg4KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IHdlYWtEZXBlbmRlbmN5XyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEluZGV4ZXMgb2YgdGhlIHdlYWsgaW1wb3J0ZWQgZmlsZXMgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdC4KLSAgICAvLy8gIEZvciBHb29nbGUtaW50ZXJuYWwgbWlncmF0aW9uIG9ubHkuIERvIG5vdCB1c2UuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gV2Vha0RlcGVuZGVuY3kgewotICAgICAgZ2V0IHsgcmV0dXJuIHdlYWtEZXBlbmRlbmN5XzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWVzc2FnZV90eXBlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNZXNzYWdlVHlwZUZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90bz4gX3JlcGVhdGVkX21lc3NhZ2VUeXBlX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgzNCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90bz4gbWVzc2FnZVR5cGVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90bz4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBBbGwgdG9wLWxldmVsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8+IE1lc3NhZ2VUeXBlIHsKLSAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlVHlwZV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImVudW1fdHlwZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRW51bVR5cGVGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtRGVzY3JpcHRvclByb3RvPiBfcmVwZWF0ZWRfZW51bVR5cGVfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDQyLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1EZXNjcmlwdG9yUHJvdG8uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1EZXNjcmlwdG9yUHJvdG8+IGVudW1UeXBlXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtRGVzY3JpcHRvclByb3RvPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtRGVzY3JpcHRvclByb3RvPiBFbnVtVHlwZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZW51bVR5cGVfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzZXJ2aWNlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTZXJ2aWNlRmllbGROdW1iZXIgPSA2OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU2VydmljZURlc2NyaXB0b3JQcm90bz4gX3JlcGVhdGVkX3NlcnZpY2VfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDUwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+IHNlcnZpY2VfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+IFNlcnZpY2UgewotICAgICAgZ2V0IHsgcmV0dXJuIHNlcnZpY2VfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJleHRlbnNpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvPiBfcmVwZWF0ZWRfZXh0ZW5zaW9uX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSg1OCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZERlc2NyaXB0b3JQcm90by5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8+IGV4dGVuc2lvbl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvPiBFeHRlbnNpb24gewotICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvbl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbnMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbnNGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVPcHRpb25zIG9wdGlvbnNfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVPcHRpb25zIE9wdGlvbnMgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25zXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic291cmNlX2NvZGVfaW5mbyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU291cmNlQ29kZUluZm9GaWVsZE51bWJlciA9IDk7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNvdXJjZUNvZGVJbmZvIHNvdXJjZUNvZGVJbmZvXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGlzIGZpZWxkIGNvbnRhaW5zIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KLSAgICAvLy8gIFlvdSBtYXkgc2FmZWx5IHJlbW92ZSB0aGlzIGVudGlyZSBmaWVsZCB3aXRob3V0IGhhcm1pbmcgcnVudGltZQotICAgIC8vLyAgZnVuY3Rpb25hbGl0eSBvZiB0aGUgZGVzY3JpcHRvcnMgLS0gdGhlIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBvbmx5IGJ5Ci0gICAgLy8vICBkZXZlbG9wbWVudCB0b29scy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNvdXJjZUNvZGVJbmZvIFNvdXJjZUNvZGVJbmZvIHsKLSAgICAgIGdldCB7IHJldHVybiBzb3VyY2VDb2RlSW5mb187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNvdXJjZUNvZGVJbmZvXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic3ludGF4IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTeW50YXhGaWVsZE51bWJlciA9IDEyOwotICAgIHByaXZhdGUgc3RyaW5nIHN5bnRheF8gPSAiIjsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgc3ludGF4IG9mIHRoZSBwcm90byBmaWxlLgotICAgIC8vLyAgVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlICJwcm90bzIiIGFuZCAicHJvdG8zIi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgU3ludGF4IHsKLSAgICAgIGdldCB7IHJldHVybiBzeW50YXhfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzeW50YXhfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRmlsZURlc2NyaXB0b3JQcm90byk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKE5hbWUgIT0gb3RoZXIuTmFtZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFBhY2thZ2UgIT0gb3RoZXIuUGFja2FnZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIWRlcGVuZGVuY3lfLkVxdWFscyhvdGhlci5kZXBlbmRlbmN5XykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFwdWJsaWNEZXBlbmRlbmN5Xy5FcXVhbHMob3RoZXIucHVibGljRGVwZW5kZW5jeV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighd2Vha0RlcGVuZGVuY3lfLkVxdWFscyhvdGhlci53ZWFrRGVwZW5kZW5jeV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighbWVzc2FnZVR5cGVfLkVxdWFscyhvdGhlci5tZXNzYWdlVHlwZV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighZW51bVR5cGVfLkVxdWFscyhvdGhlci5lbnVtVHlwZV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighc2VydmljZV8uRXF1YWxzKG90aGVyLnNlcnZpY2VfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIWV4dGVuc2lvbl8uRXF1YWxzKG90aGVyLmV4dGVuc2lvbl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoT3B0aW9ucywgb3RoZXIuT3B0aW9ucykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhTb3VyY2VDb2RlSW5mbywgb3RoZXIuU291cmNlQ29kZUluZm8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU3ludGF4ICE9IG90aGVyLlN5bnRheCkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IE5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChQYWNrYWdlLkxlbmd0aCAhPSAwKSBoYXNoIF49IFBhY2thZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gZGVwZW5kZW5jeV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcHVibGljRGVwZW5kZW5jeV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gd2Vha0RlcGVuZGVuY3lfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IG1lc3NhZ2VUeXBlXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBlbnVtVHlwZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gc2VydmljZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gZXh0ZW5zaW9uXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9ucy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHNvdXJjZUNvZGVJbmZvXyAhPSBudWxsKSBoYXNoIF49IFNvdXJjZUNvZGVJbmZvLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoU3ludGF4Lkxlbmd0aCAhPSAwKSBoYXNoIF49IFN5bnRheC5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoUGFja2FnZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoUGFja2FnZSk7Ci0gICAgICB9Ci0gICAgICBkZXBlbmRlbmN5Xy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX2RlcGVuZGVuY3lfY29kZWMpOwotICAgICAgbWVzc2FnZVR5cGVfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfbWVzc2FnZVR5cGVfY29kZWMpOwotICAgICAgZW51bVR5cGVfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfZW51bVR5cGVfY29kZWMpOwotICAgICAgc2VydmljZV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9zZXJ2aWNlX2NvZGVjKTsKLSAgICAgIGV4dGVuc2lvbl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9leHRlbnNpb25fY29kZWMpOwotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDY2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPcHRpb25zKTsKLSAgICAgIH0KLSAgICAgIGlmIChzb3VyY2VDb2RlSW5mb18gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNzQpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFNvdXJjZUNvZGVJbmZvKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpY0RlcGVuZGVuY3lfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcHVibGljRGVwZW5kZW5jeV9jb2RlYyk7Ci0gICAgICB3ZWFrRGVwZW5kZW5jeV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF93ZWFrRGVwZW5kZW5jeV9jb2RlYyk7Ci0gICAgICBpZiAoU3ludGF4Lkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg5OCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhTeW50YXgpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChQYWNrYWdlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShQYWNrYWdlKTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gZGVwZW5kZW5jeV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZGVwZW5kZW5jeV9jb2RlYyk7Ci0gICAgICBzaXplICs9IHB1YmxpY0RlcGVuZGVuY3lfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3B1YmxpY0RlcGVuZGVuY3lfY29kZWMpOwotICAgICAgc2l6ZSArPSB3ZWFrRGVwZW5kZW5jeV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfd2Vha0RlcGVuZGVuY3lfY29kZWMpOwotICAgICAgc2l6ZSArPSBtZXNzYWdlVHlwZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfbWVzc2FnZVR5cGVfY29kZWMpOwotICAgICAgc2l6ZSArPSBlbnVtVHlwZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZW51bVR5cGVfY29kZWMpOwotICAgICAgc2l6ZSArPSBzZXJ2aWNlXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9zZXJ2aWNlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gZXh0ZW5zaW9uXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9leHRlbnNpb25fY29kZWMpOwotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShPcHRpb25zKTsKLSAgICAgIH0KLSAgICAgIGlmIChzb3VyY2VDb2RlSW5mb18gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFNvdXJjZUNvZGVJbmZvKTsKLSAgICAgIH0KLSAgICAgIGlmIChTeW50YXguTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFN5bnRheCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRmlsZURlc2NyaXB0b3JQcm90byBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuUGFja2FnZS5MZW5ndGggIT0gMCkgewotICAgICAgICBQYWNrYWdlID0gb3RoZXIuUGFja2FnZTsKLSAgICAgIH0KLSAgICAgIGRlcGVuZGVuY3lfLkFkZChvdGhlci5kZXBlbmRlbmN5Xyk7Ci0gICAgICBwdWJsaWNEZXBlbmRlbmN5Xy5BZGQob3RoZXIucHVibGljRGVwZW5kZW5jeV8pOwotICAgICAgd2Vha0RlcGVuZGVuY3lfLkFkZChvdGhlci53ZWFrRGVwZW5kZW5jeV8pOwotICAgICAgbWVzc2FnZVR5cGVfLkFkZChvdGhlci5tZXNzYWdlVHlwZV8pOwotICAgICAgZW51bVR5cGVfLkFkZChvdGhlci5lbnVtVHlwZV8pOwotICAgICAgc2VydmljZV8uQWRkKG90aGVyLnNlcnZpY2VfKTsKLSAgICAgIGV4dGVuc2lvbl8uQWRkKG90aGVyLmV4dGVuc2lvbl8pOwotICAgICAgaWYgKG90aGVyLm9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG9wdGlvbnNfID09IG51bGwpIHsKLSAgICAgICAgICBvcHRpb25zXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVPcHRpb25zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3B0aW9ucy5NZXJnZUZyb20ob3RoZXIuT3B0aW9ucyk7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuc291cmNlQ29kZUluZm9fICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNvZGVJbmZvXyA9PSBudWxsKSB7Ci0gICAgICAgICAgc291cmNlQ29kZUluZm9fID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU291cmNlQ29kZUluZm8oKTsKLSAgICAgICAgfQotICAgICAgICBTb3VyY2VDb2RlSW5mby5NZXJnZUZyb20ob3RoZXIuU291cmNlQ29kZUluZm8pOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlN5bnRheC5MZW5ndGggIT0gMCkgewotICAgICAgICBTeW50YXggPSBvdGhlci5TeW50YXg7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4OiB7Ci0gICAgICAgICAgICBQYWNrYWdlID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIGRlcGVuZGVuY3lfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfZGVwZW5kZW5jeV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgbWVzc2FnZVR5cGVfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfbWVzc2FnZVR5cGVfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDI6IHsKLSAgICAgICAgICAgIGVudW1UeXBlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX2VudW1UeXBlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOiB7Ci0gICAgICAgICAgICBzZXJ2aWNlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3NlcnZpY2VfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTg6IHsKLSAgICAgICAgICAgIGV4dGVuc2lvbl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9leHRlbnNpb25fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjY6IHsKLSAgICAgICAgICAgIGlmIChvcHRpb25zXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIG9wdGlvbnNfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmlsZU9wdGlvbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKG9wdGlvbnNfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc0OiB7Ci0gICAgICAgICAgICBpZiAoc291cmNlQ29kZUluZm9fID09IG51bGwpIHsKLSAgICAgICAgICAgICAgc291cmNlQ29kZUluZm9fID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU291cmNlQ29kZUluZm8oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHNvdXJjZUNvZGVJbmZvXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MjoKLSAgICAgICAgICBjYXNlIDgwOiB7Ci0gICAgICAgICAgICBwdWJsaWNEZXBlbmRlbmN5Xy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3B1YmxpY0RlcGVuZGVuY3lfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgOTA6Ci0gICAgICAgICAgY2FzZSA4ODogewotICAgICAgICAgICAgd2Vha0RlcGVuZGVuY3lfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfd2Vha0RlcGVuZGVuY3lfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgOTg6IHsKLSAgICAgICAgICAgIFN5bnRheCA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIERlc2NyaWJlcyBhIG1lc3NhZ2UgdHlwZS4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRGVzY3JpcHRvclByb3RvIDogcGI6OklNZXNzYWdlPERlc2NyaXB0b3JQcm90bz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPERlc2NyaXB0b3JQcm90bz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxEZXNjcmlwdG9yUHJvdG8+KCgpID0+IG5ldyBEZXNjcmlwdG9yUHJvdG8oKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxEZXNjcmlwdG9yUHJvdG8+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzJdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdG9yUHJvdG8oKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIERlc2NyaXB0b3JQcm90byhEZXNjcmlwdG9yUHJvdG8gb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87Ci0gICAgICBmaWVsZF8gPSBvdGhlci5maWVsZF8uQ2xvbmUoKTsKLSAgICAgIGV4dGVuc2lvbl8gPSBvdGhlci5leHRlbnNpb25fLkNsb25lKCk7Ci0gICAgICBuZXN0ZWRUeXBlXyA9IG90aGVyLm5lc3RlZFR5cGVfLkNsb25lKCk7Ci0gICAgICBlbnVtVHlwZV8gPSBvdGhlci5lbnVtVHlwZV8uQ2xvbmUoKTsKLSAgICAgIGV4dGVuc2lvblJhbmdlXyA9IG90aGVyLmV4dGVuc2lvblJhbmdlXy5DbG9uZSgpOwotICAgICAgb25lb2ZEZWNsXyA9IG90aGVyLm9uZW9mRGVjbF8uQ2xvbmUoKTsKLSAgICAgIE9wdGlvbnMgPSBvdGhlci5vcHRpb25zXyAhPSBudWxsID8gb3RoZXIuT3B0aW9ucy5DbG9uZSgpIDogbnVsbDsKLSAgICAgIHJlc2VydmVkUmFuZ2VfID0gb3RoZXIucmVzZXJ2ZWRSYW5nZV8uQ2xvbmUoKTsKLSAgICAgIHJlc2VydmVkTmFtZV8gPSBvdGhlci5yZXNlcnZlZE5hbWVfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3JQcm90byBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRGVzY3JpcHRvclByb3RvKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZmllbGQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8+IF9yZXBlYXRlZF9maWVsZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvPiBmaWVsZF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvPiBGaWVsZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGRfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJleHRlbnNpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEV4dGVuc2lvbkZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvPiBfcmVwZWF0ZWRfZXh0ZW5zaW9uX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSg1MCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZERlc2NyaXB0b3JQcm90by5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8+IGV4dGVuc2lvbl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvPiBFeHRlbnNpb24gewotICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvbl87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm5lc3RlZF90eXBlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOZXN0ZWRUeXBlRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvPiBfcmVwZWF0ZWRfbmVzdGVkVHlwZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMjYsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8+IG5lc3RlZFR5cGVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90bz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvPiBOZXN0ZWRUeXBlIHsKLSAgICAgIGdldCB7IHJldHVybiBuZXN0ZWRUeXBlXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZW51bV90eXBlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBFbnVtVHlwZUZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1EZXNjcmlwdG9yUHJvdG8+IF9yZXBlYXRlZF9lbnVtVHlwZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMzQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bURlc2NyaXB0b3JQcm90by5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bURlc2NyaXB0b3JQcm90bz4gZW51bVR5cGVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1EZXNjcmlwdG9yUHJvdG8+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1EZXNjcmlwdG9yUHJvdG8+IEVudW1UeXBlIHsKLSAgICAgIGdldCB7IHJldHVybiBlbnVtVHlwZV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImV4dGVuc2lvbl9yYW5nZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2U+IF9yZXBlYXRlZF9leHRlbnNpb25SYW5nZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNDIsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvLlR5cGVzLkV4dGVuc2lvblJhbmdlLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2U+IGV4dGVuc2lvblJhbmdlXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuRXh0ZW5zaW9uUmFuZ2U+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90by5UeXBlcy5FeHRlbnNpb25SYW5nZT4gRXh0ZW5zaW9uUmFuZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuc2lvblJhbmdlXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib25lb2ZfZGVjbCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT25lb2ZEZWNsRmllbGROdW1iZXIgPSA4OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uT25lb2ZEZXNjcmlwdG9yUHJvdG8+IF9yZXBlYXRlZF9vbmVvZkRlY2xfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDY2LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLk9uZW9mRGVzY3JpcHRvclByb3RvLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5PbmVvZkRlc2NyaXB0b3JQcm90bz4gb25lb2ZEZWNsXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5PbmVvZkRlc2NyaXB0b3JQcm90bz4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uT25lb2ZEZXNjcmlwdG9yUHJvdG8+IE9uZW9mRGVjbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZEZWNsXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9ucyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uc0ZpZWxkTnVtYmVyID0gNzsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uTWVzc2FnZU9wdGlvbnMgb3B0aW9uc187Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uTWVzc2FnZU9wdGlvbnMgT3B0aW9ucyB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbnNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXNlcnZlZF9yYW5nZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUmVzZXJ2ZWRSYW5nZUZpZWxkTnVtYmVyID0gOTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90by5UeXBlcy5SZXNlcnZlZFJhbmdlPiBfcmVwZWF0ZWRfcmVzZXJ2ZWRSYW5nZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNzQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvLlR5cGVzLlJlc2VydmVkUmFuZ2UuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90by5UeXBlcy5SZXNlcnZlZFJhbmdlPiByZXNlcnZlZFJhbmdlXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8uVHlwZXMuUmVzZXJ2ZWRSYW5nZT4oKTsKLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclByb3RvLlR5cGVzLlJlc2VydmVkUmFuZ2U+IFJlc2VydmVkUmFuZ2UgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlc2VydmVkUmFuZ2VfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJyZXNlcnZlZF9uYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXNlcnZlZE5hbWVGaWVsZE51bWJlciA9IDEwOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHN0cmluZz4gX3JlcGVhdGVkX3Jlc2VydmVkTmFtZV9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cmluZyg4Mik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiByZXNlcnZlZE5hbWVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVzZXJ2ZWQgZmllbGQgbmFtZXMsIHdoaWNoIG1heSBub3QgYmUgdXNlZCBieSBmaWVsZHMgaW4gdGhlIHNhbWUgbWVzc2FnZS4KLSAgICAvLy8gIEEgZ2l2ZW4gbmFtZSBtYXkgb25seSBiZSByZXNlcnZlZCBvbmNlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+IFJlc2VydmVkTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gcmVzZXJ2ZWROYW1lXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRGVzY3JpcHRvclByb3RvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRGVzY3JpcHRvclByb3RvIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChOYW1lICE9IG90aGVyLk5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFmaWVsZF8uRXF1YWxzKG90aGVyLmZpZWxkXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFleHRlbnNpb25fLkVxdWFscyhvdGhlci5leHRlbnNpb25fKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIW5lc3RlZFR5cGVfLkVxdWFscyhvdGhlci5uZXN0ZWRUeXBlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFlbnVtVHlwZV8uRXF1YWxzKG90aGVyLmVudW1UeXBlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFleHRlbnNpb25SYW5nZV8uRXF1YWxzKG90aGVyLmV4dGVuc2lvblJhbmdlXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFvbmVvZkRlY2xfLkVxdWFscyhvdGhlci5vbmVvZkRlY2xfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKE9wdGlvbnMsIG90aGVyLk9wdGlvbnMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighcmVzZXJ2ZWRSYW5nZV8uRXF1YWxzKG90aGVyLnJlc2VydmVkUmFuZ2VfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXJlc2VydmVkTmFtZV8uRXF1YWxzKG90aGVyLnJlc2VydmVkTmFtZV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gTmFtZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBmaWVsZF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gZXh0ZW5zaW9uXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBuZXN0ZWRUeXBlXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBlbnVtVHlwZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gZXh0ZW5zaW9uUmFuZ2VfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IG9uZW9mRGVjbF8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25zXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbnMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVzZXJ2ZWRSYW5nZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gcmVzZXJ2ZWROYW1lXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBmaWVsZF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9maWVsZF9jb2RlYyk7Ci0gICAgICBuZXN0ZWRUeXBlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX25lc3RlZFR5cGVfY29kZWMpOwotICAgICAgZW51bVR5cGVfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfZW51bVR5cGVfY29kZWMpOwotICAgICAgZXh0ZW5zaW9uUmFuZ2VfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfZXh0ZW5zaW9uUmFuZ2VfY29kZWMpOwotICAgICAgZXh0ZW5zaW9uXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX2V4dGVuc2lvbl9jb2RlYyk7Ci0gICAgICBpZiAob3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKE9wdGlvbnMpOwotICAgICAgfQotICAgICAgb25lb2ZEZWNsXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX29uZW9mRGVjbF9jb2RlYyk7Ci0gICAgICByZXNlcnZlZFJhbmdlXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3Jlc2VydmVkUmFuZ2VfY29kZWMpOwotICAgICAgcmVzZXJ2ZWROYW1lXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3Jlc2VydmVkTmFtZV9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE5hbWUpOwotICAgICAgfQotICAgICAgc2l6ZSArPSBmaWVsZF8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZmllbGRfY29kZWMpOwotICAgICAgc2l6ZSArPSBleHRlbnNpb25fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX2V4dGVuc2lvbl9jb2RlYyk7Ci0gICAgICBzaXplICs9IG5lc3RlZFR5cGVfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX25lc3RlZFR5cGVfY29kZWMpOwotICAgICAgc2l6ZSArPSBlbnVtVHlwZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZW51bVR5cGVfY29kZWMpOwotICAgICAgc2l6ZSArPSBleHRlbnNpb25SYW5nZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZXh0ZW5zaW9uUmFuZ2VfY29kZWMpOwotICAgICAgc2l6ZSArPSBvbmVvZkRlY2xfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX29uZW9mRGVjbF9jb2RlYyk7Ci0gICAgICBpZiAob3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKE9wdGlvbnMpOwotICAgICAgfQotICAgICAgc2l6ZSArPSByZXNlcnZlZFJhbmdlXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXNlcnZlZFJhbmdlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gcmVzZXJ2ZWROYW1lXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9yZXNlcnZlZE5hbWVfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKERlc2NyaXB0b3JQcm90byBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7Ci0gICAgICB9Ci0gICAgICBmaWVsZF8uQWRkKG90aGVyLmZpZWxkXyk7Ci0gICAgICBleHRlbnNpb25fLkFkZChvdGhlci5leHRlbnNpb25fKTsKLSAgICAgIG5lc3RlZFR5cGVfLkFkZChvdGhlci5uZXN0ZWRUeXBlXyk7Ci0gICAgICBlbnVtVHlwZV8uQWRkKG90aGVyLmVudW1UeXBlXyk7Ci0gICAgICBleHRlbnNpb25SYW5nZV8uQWRkKG90aGVyLmV4dGVuc2lvblJhbmdlXyk7Ci0gICAgICBvbmVvZkRlY2xfLkFkZChvdGhlci5vbmVvZkRlY2xfKTsKLSAgICAgIGlmIChvdGhlci5vcHRpb25zXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvcHRpb25zXyA9PSBudWxsKSB7Ci0gICAgICAgICAgb3B0aW9uc18gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXNzYWdlT3B0aW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIE9wdGlvbnMuTWVyZ2VGcm9tKG90aGVyLk9wdGlvbnMpOwotICAgICAgfQotICAgICAgcmVzZXJ2ZWRSYW5nZV8uQWRkKG90aGVyLnJlc2VydmVkUmFuZ2VfKTsKLSAgICAgIHJlc2VydmVkTmFtZV8uQWRkKG90aGVyLnJlc2VydmVkTmFtZV8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgZmllbGRfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfZmllbGRfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIG5lc3RlZFR5cGVfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfbmVzdGVkVHlwZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgZW51bVR5cGVfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfZW51bVR5cGVfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDI6IHsKLSAgICAgICAgICAgIGV4dGVuc2lvblJhbmdlXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX2V4dGVuc2lvblJhbmdlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOiB7Ci0gICAgICAgICAgICBleHRlbnNpb25fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfZXh0ZW5zaW9uX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDU4OiB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uc18gPT0gbnVsbCkgewotICAgICAgICAgICAgICBvcHRpb25zXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLk1lc3NhZ2VPcHRpb25zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShvcHRpb25zXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA2NjogewotICAgICAgICAgICAgb25lb2ZEZWNsXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX29uZW9mRGVjbF9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3NDogewotICAgICAgICAgICAgcmVzZXJ2ZWRSYW5nZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9yZXNlcnZlZFJhbmdlX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDgyOiB7Ci0gICAgICAgICAgICByZXNlcnZlZE5hbWVfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfcmVzZXJ2ZWROYW1lX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZSB0eXBlLjwvc3VtbWFyeT4KLSAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBUeXBlcyB7Ci0gICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgICAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRXh0ZW5zaW9uUmFuZ2UgOiBwYjo6SU1lc3NhZ2U8RXh0ZW5zaW9uUmFuZ2U+IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8RXh0ZW5zaW9uUmFuZ2U+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8RXh0ZW5zaW9uUmFuZ2U+KCgpID0+IG5ldyBFeHRlbnNpb25SYW5nZSgpKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxFeHRlbnNpb25SYW5nZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUHJvdG8uRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBFeHRlbnNpb25SYW5nZSgpIHsKLSAgICAgICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICAgICAgcHVibGljIEV4dGVuc2lvblJhbmdlKEV4dGVuc2lvblJhbmdlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICAgICAgc3RhcnRfID0gb3RoZXIuc3RhcnRfOwotICAgICAgICAgIGVuZF8gPSBvdGhlci5lbmRfOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEV4dGVuc2lvblJhbmdlIENsb25lKCkgewotICAgICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uUmFuZ2UodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInN0YXJ0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgU3RhcnRGaWVsZE51bWJlciA9IDE7Ci0gICAgICAgIHByaXZhdGUgaW50IHN0YXJ0XzsKLSAgICAgICAgcHVibGljIGludCBTdGFydCB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIHN0YXJ0XzsgfQotICAgICAgICAgIHNldCB7Ci0gICAgICAgICAgICBzdGFydF8gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImVuZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVuZEZpZWxkTnVtYmVyID0gMjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgZW5kXzsKLSAgICAgICAgcHVibGljIGludCBFbmQgewotICAgICAgICAgIGdldCB7IHJldHVybiBlbmRfOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIGVuZF8gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBFeHRlbnNpb25SYW5nZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRXh0ZW5zaW9uUmFuZ2Ugb3RoZXIpIHsKLSAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChTdGFydCAhPSBvdGhlci5TdGFydCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlmIChFbmQgIT0gb3RoZXIuRW5kKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgICAgIGludCBoYXNoID0gMTsKLSAgICAgICAgICBpZiAoU3RhcnQgIT0gMCkgaGFzaCBePSBTdGFydC5HZXRIYXNoQ29kZSgpOwotICAgICAgICAgIGlmIChFbmQgIT0gMCkgaGFzaCBePSBFbmQuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgICAgIGlmIChTdGFydCAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihTdGFydCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChFbmQgIT0gMCkgewotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUludDMyKEVuZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgICBpZiAoU3RhcnQgIT0gMCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoU3RhcnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoRW5kICE9IDApIHsKLSAgICAgICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEVuZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEV4dGVuc2lvblJhbmdlIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG90aGVyLlN0YXJ0ICE9IDApIHsKLSAgICAgICAgICAgIFN0YXJ0ID0gb3RoZXIuU3RhcnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChvdGhlci5FbmQgIT0gMCkgewotICAgICAgICAgICAgRW5kID0gb3RoZXIuRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICBTdGFydCA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgICAgICBFbmQgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgIC8vLyAgUmFuZ2Ugb2YgcmVzZXJ2ZWQgdGFnIG51bWJlcnMuIFJlc2VydmVkIHRhZyBudW1iZXJzIG1heSBub3QgYmUgdXNlZCBieQotICAgICAgLy8vICBmaWVsZHMgb3IgZXh0ZW5zaW9uIHJhbmdlcyBpbiB0aGUgc2FtZSBtZXNzYWdlLiBSZXNlcnZlZCByYW5nZXMgbWF5Ci0gICAgICAvLy8gIG5vdCBvdmVybGFwLgotICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBSZXNlcnZlZFJhbmdlIDogcGI6OklNZXNzYWdlPFJlc2VydmVkUmFuZ2U+IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8UmVzZXJ2ZWRSYW5nZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxSZXNlcnZlZFJhbmdlPigoKSA9PiBuZXcgUmVzZXJ2ZWRSYW5nZSgpKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxSZXNlcnZlZFJhbmdlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JQcm90by5EZXNjcmlwdG9yLk5lc3RlZFR5cGVzWzFdOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIFJlc2VydmVkUmFuZ2UoKSB7Ci0gICAgICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgICAgIHB1YmxpYyBSZXNlcnZlZFJhbmdlKFJlc2VydmVkUmFuZ2Ugb3RoZXIpIDogdGhpcygpIHsKLSAgICAgICAgICBzdGFydF8gPSBvdGhlci5zdGFydF87Ci0gICAgICAgICAgZW5kXyA9IG90aGVyLmVuZF87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgUmVzZXJ2ZWRSYW5nZSBDbG9uZSgpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IFJlc2VydmVkUmFuZ2UodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInN0YXJ0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgU3RhcnRGaWVsZE51bWJlciA9IDE7Ci0gICAgICAgIHByaXZhdGUgaW50IHN0YXJ0XzsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEluY2x1c2l2ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBTdGFydCB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIHN0YXJ0XzsgfQotICAgICAgICAgIHNldCB7Ci0gICAgICAgICAgICBzdGFydF8gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImVuZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVuZEZpZWxkTnVtYmVyID0gMjsKLSAgICAgICAgcHJpdmF0ZSBpbnQgZW5kXzsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEV4Y2x1c2l2ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBFbmQgewotICAgICAgICAgIGdldCB7IHJldHVybiBlbmRfOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIGVuZF8gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBSZXNlcnZlZFJhbmdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEVxdWFscyhSZXNlcnZlZFJhbmdlIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoU3RhcnQgIT0gb3RoZXIuU3RhcnQpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBpZiAoRW5kICE9IG90aGVyLkVuZCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICAgICAgaWYgKFN0YXJ0ICE9IDApIGhhc2ggXj0gU3RhcnQuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICBpZiAoRW5kICE9IDApIGhhc2ggXj0gRW5kLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgICAgICBpZiAoU3RhcnQgIT0gMCkgewotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoU3RhcnQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoRW5kICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNik7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihFbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgaWYgKFN0YXJ0ICE9IDApIHsKLSAgICAgICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKFN0YXJ0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKEVuZCAhPSAwKSB7Ci0gICAgICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShFbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShSZXNlcnZlZFJhbmdlIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG90aGVyLlN0YXJ0ICE9IDApIHsKLSAgICAgICAgICAgIFN0YXJ0ID0gb3RoZXIuU3RhcnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChvdGhlci5FbmQgIT0gMCkgewotICAgICAgICAgICAgRW5kID0gb3RoZXIuRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICBTdGFydCA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgICAgICBFbmQgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgRGVzY3JpYmVzIGEgZmllbGQgd2l0aGluIGEgbWVzc2FnZS4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG8gOiBwYjo6SU1lc3NhZ2U8RmllbGREZXNjcmlwdG9yUHJvdG8+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxGaWVsZERlc2NyaXB0b3JQcm90bz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxGaWVsZERlc2NyaXB0b3JQcm90bz4oKCkgPT4gbmV3IEZpZWxkRGVzY3JpcHRvclByb3RvKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8RmllbGREZXNjcmlwdG9yUHJvdG8+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3JQcm90bygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yUHJvdG8oRmllbGREZXNjcmlwdG9yUHJvdG8gb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87Ci0gICAgICBudW1iZXJfID0gb3RoZXIubnVtYmVyXzsKLSAgICAgIGxhYmVsXyA9IG90aGVyLmxhYmVsXzsKLSAgICAgIHR5cGVfID0gb3RoZXIudHlwZV87Ci0gICAgICB0eXBlTmFtZV8gPSBvdGhlci50eXBlTmFtZV87Ci0gICAgICBleHRlbmRlZV8gPSBvdGhlci5leHRlbmRlZV87Ci0gICAgICBkZWZhdWx0VmFsdWVfID0gb3RoZXIuZGVmYXVsdFZhbHVlXzsKLSAgICAgIG9uZW9mSW5kZXhfID0gb3RoZXIub25lb2ZJbmRleF87Ci0gICAgICBqc29uTmFtZV8gPSBvdGhlci5qc29uTmFtZV87Ci0gICAgICBPcHRpb25zID0gb3RoZXIub3B0aW9uc18gIT0gbnVsbCA/IG90aGVyLk9wdGlvbnMuQ2xvbmUoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEZpZWxkRGVzY3JpcHRvclByb3RvIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBGaWVsZERlc2NyaXB0b3JQcm90byh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm5hbWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsKLSAgICBwdWJsaWMgc3RyaW5nIE5hbWUgewotICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBuYW1lXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm51bWJlciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTnVtYmVyRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgaW50IG51bWJlcl87Ci0gICAgcHVibGljIGludCBOdW1iZXIgewotICAgICAgZ2V0IHsgcmV0dXJuIG51bWJlcl87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG51bWJlcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImxhYmVsIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBMYWJlbEZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuTGFiZWwgbGFiZWxfID0gMDsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5MYWJlbCBMYWJlbCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbGFiZWxfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBsYWJlbF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInR5cGUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUgdHlwZV8gPSAwOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElmIHR5cGVfbmFtZSBpcyBzZXQsIHRoaXMgbmVlZCBub3QgYmUgc2V0LiAgSWYgYm90aCB0aGlzIGFuZCB0eXBlX25hbWUKLSAgICAvLy8gIGFyZSBzZXQsIHRoaXMgbXVzdCBiZSBvbmUgb2YgVFlQRV9FTlVNLCBUWVBFX01FU1NBR0Ugb3IgVFlQRV9HUk9VUC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUgVHlwZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdHlwZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHR5cGVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ0eXBlX25hbWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFR5cGVOYW1lRmllbGROdW1iZXIgPSA2OwotICAgIHByaXZhdGUgc3RyaW5nIHR5cGVOYW1lXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEZvciBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLCB0aGlzIGlzIHRoZSBuYW1lIG9mIHRoZSB0eXBlLiAgSWYgdGhlIG5hbWUKLSAgICAvLy8gIHN0YXJ0cyB3aXRoIGEgJy4nLCBpdCBpcyBmdWxseS1xdWFsaWZpZWQuICBPdGhlcndpc2UsIEMrKy1saWtlIHNjb3BpbmcKLSAgICAvLy8gIHJ1bGVzIGFyZSB1c2VkIHRvIGZpbmQgdGhlIHR5cGUgKGkuZS4gZmlyc3QgdGhlIG5lc3RlZCB0eXBlcyB3aXRoaW4gdGhpcwotICAgIC8vLyAgbWVzc2FnZSBhcmUgc2VhcmNoZWQsIHRoZW4gd2l0aGluIHRoZSBwYXJlbnQsIG9uIHVwIHRvIHRoZSByb290Ci0gICAgLy8vICBuYW1lc3BhY2UpLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBUeXBlTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdHlwZU5hbWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB0eXBlTmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJleHRlbmRlZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRXh0ZW5kZWVGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgZXh0ZW5kZWVfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgRm9yIGV4dGVuc2lvbnMsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgYmVpbmcgZXh0ZW5kZWQuICBJdCBpcwotICAgIC8vLyAgcmVzb2x2ZWQgaW4gdGhlIHNhbWUgbWFubmVyIGFzIHR5cGVfbmFtZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgRXh0ZW5kZWUgewotICAgICAgZ2V0IHsgcmV0dXJuIGV4dGVuZGVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZXh0ZW5kZWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGVmYXVsdF92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFZhbHVlRmllbGROdW1iZXIgPSA3OwotICAgIHByaXZhdGUgc3RyaW5nIGRlZmF1bHRWYWx1ZV8gPSAiIjsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBGb3IgbnVtZXJpYyB0eXBlcywgY29udGFpbnMgdGhlIG9yaWdpbmFsIHRleHQgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlLgotICAgIC8vLyAgRm9yIGJvb2xlYW5zLCAidHJ1ZSIgb3IgImZhbHNlIi4KLSAgICAvLy8gIEZvciBzdHJpbmdzLCBjb250YWlucyB0aGUgZGVmYXVsdCB0ZXh0IGNvbnRlbnRzIChub3QgZXNjYXBlZCBpbiBhbnkgd2F5KS4KLSAgICAvLy8gIEZvciBieXRlcywgY29udGFpbnMgdGhlIEMgZXNjYXBlZCB2YWx1ZS4gIEFsbCBieXRlcyA+PSAxMjggYXJlIGVzY2FwZWQuCi0gICAgLy8vICBUT0RPKGtlbnRvbik6ICBCYXNlLTY0IGVuY29kZT8KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgRGVmYXVsdFZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiBkZWZhdWx0VmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBkZWZhdWx0VmFsdWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib25lb2ZfaW5kZXgiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9uZW9mSW5kZXhGaWVsZE51bWJlciA9IDk7Ci0gICAgcHJpdmF0ZSBpbnQgb25lb2ZJbmRleF87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgSWYgc2V0LCBnaXZlcyB0aGUgaW5kZXggb2YgYSBvbmVvZiBpbiB0aGUgY29udGFpbmluZyB0eXBlJ3Mgb25lb2ZfZGVjbAotICAgIC8vLyAgbGlzdC4gIFRoaXMgZmllbGQgaXMgYSBtZW1iZXIgb2YgdGhhdCBvbmVvZi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnQgT25lb2ZJbmRleCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZJbmRleF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mSW5kZXhfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJqc29uX25hbWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEpzb25OYW1lRmllbGROdW1iZXIgPSAxMDsKLSAgICBwcml2YXRlIHN0cmluZyBqc29uTmFtZV8gPSAiIjsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBKU09OIG5hbWUgb2YgdGhpcyBmaWVsZC4gVGhlIHZhbHVlIGlzIHNldCBieSBwcm90b2NvbCBjb21waWxlci4gSWYgdGhlCi0gICAgLy8vICB1c2VyIGhhcyBzZXQgYSAianNvbl9uYW1lIiBvcHRpb24gb24gdGhpcyBmaWVsZCwgdGhhdCBvcHRpb24ncyB2YWx1ZQotICAgIC8vLyAgd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UsIGl0J3MgZGVkdWNlZCBmcm9tIHRoZSBmaWVsZCdzIG5hbWUgYnkgY29udmVydGluZwotICAgIC8vLyAgaXQgdG8gY2FtZWxDYXNlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBKc29uTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4ganNvbk5hbWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBqc29uTmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25zIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSA4OwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZE9wdGlvbnMgb3B0aW9uc187Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGRPcHRpb25zIE9wdGlvbnMgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25zXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRmllbGREZXNjcmlwdG9yUHJvdG8pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhGaWVsZERlc2NyaXB0b3JQcm90byBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZSAhPSBvdGhlci5OYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTnVtYmVyICE9IG90aGVyLk51bWJlcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKExhYmVsICE9IG90aGVyLkxhYmVsKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoVHlwZSAhPSBvdGhlci5UeXBlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoVHlwZU5hbWUgIT0gb3RoZXIuVHlwZU5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChFeHRlbmRlZSAhPSBvdGhlci5FeHRlbmRlZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKERlZmF1bHRWYWx1ZSAhPSBvdGhlci5EZWZhdWx0VmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPbmVvZkluZGV4ICE9IG90aGVyLk9uZW9mSW5kZXgpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChKc29uTmFtZSAhPSBvdGhlci5Kc29uTmFtZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKE9wdGlvbnMsIG90aGVyLk9wdGlvbnMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gTmFtZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE51bWJlciAhPSAwKSBoYXNoIF49IE51bWJlci5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKExhYmVsICE9IDApIGhhc2ggXj0gTGFiZWwuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChUeXBlICE9IDApIGhhc2ggXj0gVHlwZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFR5cGVOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IFR5cGVOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRXh0ZW5kZWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gRXh0ZW5kZWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChEZWZhdWx0VmFsdWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gRGVmYXVsdFZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoT25lb2ZJbmRleCAhPSAwKSBoYXNoIF49IE9uZW9mSW5kZXguR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChKc29uTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBKc29uTmFtZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9ucy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoRXh0ZW5kZWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKEV4dGVuZGVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChOdW1iZXIgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihOdW1iZXIpOwotICAgICAgfQotICAgICAgaWYgKExhYmVsICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDMyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBMYWJlbCk7Ci0gICAgICB9Ci0gICAgICBpZiAoVHlwZSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgVHlwZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoVHlwZU5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDUwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKFR5cGVOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChEZWZhdWx0VmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDU4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKERlZmF1bHRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKE9wdGlvbnMpOwotICAgICAgfQotICAgICAgaWYgKE9uZW9mSW5kZXggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNzIpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihPbmVvZkluZGV4KTsKLSAgICAgIH0KLSAgICAgIGlmIChKc29uTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoODIpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoSnNvbk5hbWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChOdW1iZXIgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShOdW1iZXIpOwotICAgICAgfQotICAgICAgaWYgKExhYmVsICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBMYWJlbCk7Ci0gICAgICB9Ci0gICAgICBpZiAoVHlwZSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgVHlwZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoVHlwZU5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFR5cGVOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChFeHRlbmRlZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoRXh0ZW5kZWUpOwotICAgICAgfQotICAgICAgaWYgKERlZmF1bHRWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoRGVmYXVsdFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChPbmVvZkluZGV4ICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoT25lb2ZJbmRleCk7Ci0gICAgICB9Ci0gICAgICBpZiAoSnNvbk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKEpzb25OYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25zXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoT3B0aW9ucyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRmllbGREZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk51bWJlciAhPSAwKSB7Ci0gICAgICAgIE51bWJlciA9IG90aGVyLk51bWJlcjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5MYWJlbCAhPSAwKSB7Ci0gICAgICAgIExhYmVsID0gb3RoZXIuTGFiZWw7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVHlwZSAhPSAwKSB7Ci0gICAgICAgIFR5cGUgPSBvdGhlci5UeXBlOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlR5cGVOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIFR5cGVOYW1lID0gb3RoZXIuVHlwZU5hbWU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRXh0ZW5kZWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgRXh0ZW5kZWUgPSBvdGhlci5FeHRlbmRlZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EZWZhdWx0VmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgRGVmYXVsdFZhbHVlID0gb3RoZXIuRGVmYXVsdFZhbHVlOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9uZW9mSW5kZXggIT0gMCkgewotICAgICAgICBPbmVvZkluZGV4ID0gb3RoZXIuT25lb2ZJbmRleDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5Kc29uTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBKc29uTmFtZSA9IG90aGVyLkpzb25OYW1lOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLm9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG9wdGlvbnNfID09IG51bGwpIHsKLSAgICAgICAgICBvcHRpb25zXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkT3B0aW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIE9wdGlvbnMuTWVyZ2VGcm9tKG90aGVyLk9wdGlvbnMpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgRXh0ZW5kZWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgICAgTnVtYmVyID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMjogewotICAgICAgICAgICAgbGFiZWxfID0gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuTGFiZWwpIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MDogewotICAgICAgICAgICAgdHlwZV8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlKSBpbnB1dC5SZWFkRW51bSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTA6IHsKLSAgICAgICAgICAgIFR5cGVOYW1lID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTg6IHsKLSAgICAgICAgICAgIERlZmF1bHRWYWx1ZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDY2OiB7Ci0gICAgICAgICAgICBpZiAob3B0aW9uc18gPT0gbnVsbCkgewotICAgICAgICAgICAgICBvcHRpb25zXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkT3B0aW9ucygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uob3B0aW9uc18pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzI6IHsKLSAgICAgICAgICAgIE9uZW9mSW5kZXggPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDgyOiB7Ci0gICAgICAgICAgICBKc29uTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBGaWVsZERlc2NyaXB0b3JQcm90byBtZXNzYWdlIHR5cGUuPC9zdW1tYXJ5PgotICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsKLSAgICAgIGludGVybmFsIGVudW0gVHlwZSB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuCi0gICAgICAgIC8vLyAgT3JkZXIgaXMgd2VpcmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX0RPVUJMRSIpXSBEb3VibGUgPSAxLAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfRkxPQVQiKV0gRmxvYXQgPSAyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDY0IGlmCi0gICAgICAgIC8vLyAgbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9JTlQ2NCIpXSBJbnQ2NCA9IDMsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9VSU5UNjQiKV0gVWludDY0ID0gNCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQzMiBpZgotICAgICAgICAvLy8gIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfSU5UMzIiKV0gSW50MzIgPSA1LAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfRklYRUQ2NCIpXSBGaXhlZDY0ID0gNiwKLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX0ZJWEVEMzIiKV0gRml4ZWQzMiA9IDcsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9CT09MIildIEJvb2wgPSA4LAotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfU1RSSU5HIildIFN0cmluZyA9IDksCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBUYWctZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX0dST1VQIildIEdyb3VwID0gMTAsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBMZW5ndGgtZGVsaW1pdGVkIGFnZ3JlZ2F0ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX01FU1NBR0UiKV0gTWVzc2FnZSA9IDExLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgTmV3IGluIHZlcnNpb24gMi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX0JZVEVTIildIEJ5dGVzID0gMTIsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9VSU5UMzIiKV0gVWludDMyID0gMTMsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9FTlVNIildIEVudW0gPSAxNCwKLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX1NGSVhFRDMyIildIFNmaXhlZDMyID0gMTUsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9TRklYRUQ2NCIpXSBTZml4ZWQ2NCA9IDE2LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgVXNlcyBaaWdaYWcgZW5jb2RpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9TSU5UMzIiKV0gU2ludDMyID0gMTcsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBVc2VzIFppZ1phZyBlbmNvZGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX1NJTlQ2NCIpXSBTaW50NjQgPSAxOCwKLSAgICAgIH0KLQotICAgICAgaW50ZXJuYWwgZW51bSBMYWJlbCB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJMQUJFTF9PUFRJT05BTCIpXSBPcHRpb25hbCA9IDEsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiTEFCRUxfUkVRVUlSRUQiKV0gUmVxdWlyZWQgPSAyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgVE9ETyhzYW5qYXkpOiBTaG91bGQgd2UgYWRkIExBQkVMX01BUD8KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJMQUJFTF9SRVBFQVRFRCIpXSBSZXBlYXRlZCA9IDMsCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgRGVzY3JpYmVzIGEgb25lb2YuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE9uZW9mRGVzY3JpcHRvclByb3RvIDogcGI6OklNZXNzYWdlPE9uZW9mRGVzY3JpcHRvclByb3RvPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8T25lb2ZEZXNjcmlwdG9yUHJvdG8+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8T25lb2ZEZXNjcmlwdG9yUHJvdG8+KCgpID0+IG5ldyBPbmVvZkRlc2NyaXB0b3JQcm90bygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE9uZW9mRGVzY3JpcHRvclByb3RvPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s0XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgT25lb2ZEZXNjcmlwdG9yUHJvdG8oKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIE9uZW9mRGVzY3JpcHRvclByb3RvKE9uZW9mRGVzY3JpcHRvclByb3RvIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBuYW1lXyA9IG90aGVyLm5hbWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBPbmVvZkRlc2NyaXB0b3JQcm90byBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgT25lb2ZEZXNjcmlwdG9yUHJvdG8odGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7Ci0gICAgcHVibGljIHN0cmluZyBOYW1lIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBPbmVvZkRlc2NyaXB0b3JQcm90byk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKE9uZW9mRGVzY3JpcHRvclByb3RvIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChOYW1lICE9IG90aGVyLk5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhOYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oT25lb2ZEZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBEZXNjcmliZXMgYW4gZW51bSB0eXBlLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvIDogcGI6OklNZXNzYWdlPEVudW1EZXNjcmlwdG9yUHJvdG8+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtRGVzY3JpcHRvclByb3RvPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEVudW1EZXNjcmlwdG9yUHJvdG8+KCgpID0+IG5ldyBFbnVtRGVzY3JpcHRvclByb3RvKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8RW51bURlc2NyaXB0b3JQcm90bz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1EZXNjcmlwdG9yUHJvdG8oKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEVudW1EZXNjcmlwdG9yUHJvdG8oRW51bURlc2NyaXB0b3JQcm90byBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXy5DbG9uZSgpOwotICAgICAgT3B0aW9ucyA9IG90aGVyLm9wdGlvbnNfICE9IG51bGwgPyBvdGhlci5PcHRpb25zLkNsb25lKCkgOiBudWxsOwotICAgIH0KLQotICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvclByb3RvIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBFbnVtRGVzY3JpcHRvclByb3RvKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidmFsdWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlRGVzY3JpcHRvclByb3RvPiBfcmVwZWF0ZWRfdmFsdWVfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlRGVzY3JpcHRvclByb3RvPiB2YWx1ZV8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlRGVzY3JpcHRvclByb3RvPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8+IFZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiB2YWx1ZV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbnMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbnNGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1PcHRpb25zIG9wdGlvbnNfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1PcHRpb25zIE9wdGlvbnMgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25zXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRW51bURlc2NyaXB0b3JQcm90byk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEVudW1EZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKE5hbWUgIT0gb3RoZXIuTmFtZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXZhbHVlXy5FcXVhbHMob3RoZXIudmFsdWVfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKE9wdGlvbnMsIG90aGVyLk9wdGlvbnMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gTmFtZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB2YWx1ZV8uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChvcHRpb25zXyAhPSBudWxsKSBoYXNoIF49IE9wdGlvbnMuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKE5hbWUpOwotICAgICAgfQotICAgICAgdmFsdWVfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdmFsdWVfY29kZWMpOwotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPcHRpb25zKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHZhbHVlXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF92YWx1ZV9jb2RlYyk7Ci0gICAgICBpZiAob3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKE9wdGlvbnMpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEVudW1EZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOwotICAgICAgfQotICAgICAgdmFsdWVfLkFkZChvdGhlci52YWx1ZV8pOwotICAgICAgaWYgKG90aGVyLm9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG9wdGlvbnNfID09IG51bGwpIHsKLSAgICAgICAgICBvcHRpb25zXyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkVudW1PcHRpb25zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3B0aW9ucy5NZXJnZUZyb20ob3RoZXIuT3B0aW9ucyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4OiB7Ci0gICAgICAgICAgICB2YWx1ZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF92YWx1ZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjogewotICAgICAgICAgICAgaWYgKG9wdGlvbnNfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgb3B0aW9uc18gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtT3B0aW9ucygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uob3B0aW9uc18pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgRGVzY3JpYmVzIGEgdmFsdWUgd2l0aGluIGFuIGVudW0uCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA6IHBiOjpJTWVzc2FnZTxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8RW51bVZhbHVlRGVzY3JpcHRvclByb3RvPigoKSA9PiBuZXcgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8RW51bVZhbHVlRGVzY3JpcHRvclByb3RvPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s2XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBuYW1lXyA9IG90aGVyLm5hbWVfOwotICAgICAgbnVtYmVyXyA9IG90aGVyLm51bWJlcl87Ci0gICAgICBPcHRpb25zID0gb3RoZXIub3B0aW9uc18gIT0gbnVsbCA/IG90aGVyLk9wdGlvbnMuQ2xvbmUoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibnVtYmVyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOdW1iZXJGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyXzsKLSAgICBwdWJsaWMgaW50IE51bWJlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gbnVtYmVyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbnVtYmVyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9ucyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uc0ZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zXzsKLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtVmFsdWVPcHRpb25zIE9wdGlvbnMgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpb25zXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChOYW1lICE9IG90aGVyLk5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChOdW1iZXIgIT0gb3RoZXIuTnVtYmVyKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoT3B0aW9ucywgb3RoZXIuT3B0aW9ucykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoTnVtYmVyICE9IDApIGhhc2ggXj0gTnVtYmVyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAob3B0aW9uc18gIT0gbnVsbCkgaGFzaCBePSBPcHRpb25zLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChOdW1iZXIgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihOdW1iZXIpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShPcHRpb25zKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoTnVtYmVyICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoTnVtYmVyKTsKLSAgICAgIH0KLSAgICAgIGlmIChvcHRpb25zXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoT3B0aW9ucyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OdW1iZXIgIT0gMCkgewotICAgICAgICBOdW1iZXIgPSBvdGhlci5OdW1iZXI7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIub3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uc18gPT0gbnVsbCkgewotICAgICAgICAgIG9wdGlvbnNfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRW51bVZhbHVlT3B0aW9ucygpOwotICAgICAgICB9Ci0gICAgICAgIE9wdGlvbnMuTWVyZ2VGcm9tKG90aGVyLk9wdGlvbnMpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgTnVtYmVyID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjogewotICAgICAgICAgICAgaWYgKG9wdGlvbnNfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgb3B0aW9uc18gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5FbnVtVmFsdWVPcHRpb25zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShvcHRpb25zXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBEZXNjcmliZXMgYSBzZXJ2aWNlLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIDogcGI6OklNZXNzYWdlPFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxTZXJ2aWNlRGVzY3JpcHRvclByb3RvPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+KCgpID0+IG5ldyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8U2VydmljZURlc2NyaXB0b3JQcm90bz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbN107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oU2VydmljZURlc2NyaXB0b3JQcm90byBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgIG1ldGhvZF8gPSBvdGhlci5tZXRob2RfLkNsb25lKCk7Ci0gICAgICBPcHRpb25zID0gb3RoZXIub3B0aW9uc18gIT0gbnVsbCA/IG90aGVyLk9wdGlvbnMuQ2xvbmUoKSA6IG51bGw7Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8odGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7Ci0gICAgcHVibGljIHN0cmluZyBOYW1lIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtZXRob2QiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1ldGhvZEZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLk1ldGhvZERlc2NyaXB0b3JQcm90bz4gX3JlcGVhdGVkX21ldGhvZF9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uTWV0aG9kRGVzY3JpcHRvclByb3RvLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXRob2REZXNjcmlwdG9yUHJvdG8+IG1ldGhvZF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uTWV0aG9kRGVzY3JpcHRvclByb3RvPigpOwotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXRob2REZXNjcmlwdG9yUHJvdG8+IE1ldGhvZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWV0aG9kXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9ucyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uc0ZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU2VydmljZU9wdGlvbnMgb3B0aW9uc187Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU2VydmljZU9wdGlvbnMgT3B0aW9ucyB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbnNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoU2VydmljZURlc2NyaXB0b3JQcm90byBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZSAhPSBvdGhlci5OYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighbWV0aG9kXy5FcXVhbHMob3RoZXIubWV0aG9kXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhPcHRpb25zLCBvdGhlci5PcHRpb25zKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IE5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gbWV0aG9kXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9ucy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBtZXRob2RfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfbWV0aG9kX2NvZGVjKTsKLSAgICAgIGlmIChvcHRpb25zXyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoT3B0aW9ucyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE5hbWUpOwotICAgICAgfQotICAgICAgc2l6ZSArPSBtZXRob2RfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX21ldGhvZF9jb2RlYyk7Ci0gICAgICBpZiAob3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKE9wdGlvbnMpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOwotICAgICAgfQotICAgICAgbWV0aG9kXy5BZGQob3RoZXIubWV0aG9kXyk7Ci0gICAgICBpZiAob3RoZXIub3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBpZiAob3B0aW9uc18gPT0gbnVsbCkgewotICAgICAgICAgIG9wdGlvbnNfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU2VydmljZU9wdGlvbnMoKTsKLSAgICAgICAgfQotICAgICAgICBPcHRpb25zLk1lcmdlRnJvbShvdGhlci5PcHRpb25zKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBOYW1lID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIG1ldGhvZF8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9tZXRob2RfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIGlmIChvcHRpb25zXyA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIG9wdGlvbnNfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU2VydmljZU9wdGlvbnMoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKG9wdGlvbnNfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIERlc2NyaWJlcyBhIG1ldGhvZCBvZiBhIHNlcnZpY2UuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE1ldGhvZERlc2NyaXB0b3JQcm90byA6IHBiOjpJTWVzc2FnZTxNZXRob2REZXNjcmlwdG9yUHJvdG8+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxNZXRob2REZXNjcmlwdG9yUHJvdG8+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8TWV0aG9kRGVzY3JpcHRvclByb3RvPigoKSA9PiBuZXcgTWV0aG9kRGVzY3JpcHRvclByb3RvKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8TWV0aG9kRGVzY3JpcHRvclByb3RvPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1s4XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRvclByb3RvKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdG9yUHJvdG8oTWV0aG9kRGVzY3JpcHRvclByb3RvIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBuYW1lXyA9IG90aGVyLm5hbWVfOwotICAgICAgaW5wdXRUeXBlXyA9IG90aGVyLmlucHV0VHlwZV87Ci0gICAgICBvdXRwdXRUeXBlXyA9IG90aGVyLm91dHB1dFR5cGVfOwotICAgICAgT3B0aW9ucyA9IG90aGVyLm9wdGlvbnNfICE9IG51bGwgPyBvdGhlci5PcHRpb25zLkNsb25lKCkgOiBudWxsOwotICAgICAgY2xpZW50U3RyZWFtaW5nXyA9IG90aGVyLmNsaWVudFN0cmVhbWluZ187Ci0gICAgICBzZXJ2ZXJTdHJlYW1pbmdfID0gb3RoZXIuc2VydmVyU3RyZWFtaW5nXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRvclByb3RvIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBNZXRob2REZXNjcmlwdG9yUHJvdG8odGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7Ci0gICAgcHVibGljIHN0cmluZyBOYW1lIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJpbnB1dF90eXBlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBJbnB1dFR5cGVGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgaW5wdXRUeXBlXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElucHV0IGFuZCBvdXRwdXQgdHlwZSBuYW1lcy4gIFRoZXNlIGFyZSByZXNvbHZlZCBpbiB0aGUgc2FtZSB3YXkgYXMKLSAgICAvLy8gIEZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSwgYnV0IG11c3QgcmVmZXIgdG8gYSBtZXNzYWdlIHR5cGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIElucHV0VHlwZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gaW5wdXRUeXBlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgaW5wdXRUeXBlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm91dHB1dF90eXBlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPdXRwdXRUeXBlRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgc3RyaW5nIG91dHB1dFR5cGVfID0gIiI7Ci0gICAgcHVibGljIHN0cmluZyBPdXRwdXRUeXBlIHsKLSAgICAgIGdldCB7IHJldHVybiBvdXRwdXRUeXBlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb3V0cHV0VHlwZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25zIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSA0OwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXRob2RPcHRpb25zIG9wdGlvbnNfOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLk1ldGhvZE9wdGlvbnMgT3B0aW9ucyB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9wdGlvbnNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJjbGllbnRfc3RyZWFtaW5nIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBDbGllbnRTdHJlYW1pbmdGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBib29sIGNsaWVudFN0cmVhbWluZ187Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgSWRlbnRpZmllcyBpZiBjbGllbnQgc3RyZWFtcyBtdWx0aXBsZSBjbGllbnQgbWVzc2FnZXMKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIENsaWVudFN0cmVhbWluZyB7Ci0gICAgICBnZXQgeyByZXR1cm4gY2xpZW50U3RyZWFtaW5nXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgY2xpZW50U3RyZWFtaW5nXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2VydmVyX3N0cmVhbWluZyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2VydmVyU3RyZWFtaW5nRmllbGROdW1iZXIgPSA2OwotICAgIHByaXZhdGUgYm9vbCBzZXJ2ZXJTdHJlYW1pbmdfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElkZW50aWZpZXMgaWYgc2VydmVyIHN0cmVhbXMgbXVsdGlwbGUgc2VydmVyIG1lc3NhZ2VzCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBTZXJ2ZXJTdHJlYW1pbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIHNlcnZlclN0cmVhbWluZ187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNlcnZlclN0cmVhbWluZ18gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE1ldGhvZERlc2NyaXB0b3JQcm90byk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKE1ldGhvZERlc2NyaXB0b3JQcm90byBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZSAhPSBvdGhlci5OYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoSW5wdXRUeXBlICE9IG90aGVyLklucHV0VHlwZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE91dHB1dFR5cGUgIT0gb3RoZXIuT3V0cHV0VHlwZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKE9wdGlvbnMsIG90aGVyLk9wdGlvbnMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQ2xpZW50U3RyZWFtaW5nICE9IG90aGVyLkNsaWVudFN0cmVhbWluZykgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFNlcnZlclN0cmVhbWluZyAhPSBvdGhlci5TZXJ2ZXJTdHJlYW1pbmcpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoSW5wdXRUeXBlLkxlbmd0aCAhPSAwKSBoYXNoIF49IElucHV0VHlwZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE91dHB1dFR5cGUuTGVuZ3RoICE9IDApIGhhc2ggXj0gT3V0cHV0VHlwZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIGhhc2ggXj0gT3B0aW9ucy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKENsaWVudFN0cmVhbWluZyAhPSBmYWxzZSkgaGFzaCBePSBDbGllbnRTdHJlYW1pbmcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTZXJ2ZXJTdHJlYW1pbmcgIT0gZmFsc2UpIGhhc2ggXj0gU2VydmVyU3RyZWFtaW5nLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChJbnB1dFR5cGUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKElucHV0VHlwZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoT3V0cHV0VHlwZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoT3V0cHV0VHlwZSk7Ci0gICAgICB9Ci0gICAgICBpZiAob3B0aW9uc18gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMzQpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKE9wdGlvbnMpOwotICAgICAgfQotICAgICAgaWYgKENsaWVudFN0cmVhbWluZyAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNDApOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKENsaWVudFN0cmVhbWluZyk7Ci0gICAgICB9Ci0gICAgICBpZiAoU2VydmVyU3RyZWFtaW5nICE9IGZhbHNlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0OCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJvb2woU2VydmVyU3RyZWFtaW5nKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoSW5wdXRUeXBlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShJbnB1dFR5cGUpOwotICAgICAgfQotICAgICAgaWYgKE91dHB1dFR5cGUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE91dHB1dFR5cGUpOwotICAgICAgfQotICAgICAgaWYgKG9wdGlvbnNfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShPcHRpb25zKTsKLSAgICAgIH0KLSAgICAgIGlmIChDbGllbnRTdHJlYW1pbmcgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChTZXJ2ZXJTdHJlYW1pbmcgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShNZXRob2REZXNjcmlwdG9yUHJvdG8gb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLklucHV0VHlwZS5MZW5ndGggIT0gMCkgewotICAgICAgICBJbnB1dFR5cGUgPSBvdGhlci5JbnB1dFR5cGU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuT3V0cHV0VHlwZS5MZW5ndGggIT0gMCkgewotICAgICAgICBPdXRwdXRUeXBlID0gb3RoZXIuT3V0cHV0VHlwZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5vcHRpb25zXyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChvcHRpb25zXyA9PSBudWxsKSB7Ci0gICAgICAgICAgb3B0aW9uc18gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXRob2RPcHRpb25zKCk7Ci0gICAgICAgIH0KLSAgICAgICAgT3B0aW9ucy5NZXJnZUZyb20ob3RoZXIuT3B0aW9ucyk7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuQ2xpZW50U3RyZWFtaW5nICE9IGZhbHNlKSB7Ci0gICAgICAgIENsaWVudFN0cmVhbWluZyA9IG90aGVyLkNsaWVudFN0cmVhbWluZzsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5TZXJ2ZXJTdHJlYW1pbmcgIT0gZmFsc2UpIHsKLSAgICAgICAgU2VydmVyU3RyZWFtaW5nID0gb3RoZXIuU2VydmVyU3RyZWFtaW5nOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgSW5wdXRUeXBlID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIE91dHB1dFR5cGUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgaWYgKG9wdGlvbnNfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgb3B0aW9uc18gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5NZXRob2RPcHRpb25zKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShvcHRpb25zXyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MDogewotICAgICAgICAgICAgQ2xpZW50U3RyZWFtaW5nID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQ4OiB7Ci0gICAgICAgICAgICBTZXJ2ZXJTdHJlYW1pbmcgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBGaWxlT3B0aW9ucyA6IHBiOjpJTWVzc2FnZTxGaWxlT3B0aW9ucz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEZpbGVPcHRpb25zPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEZpbGVPcHRpb25zPigoKSA9PiBuZXcgRmlsZU9wdGlvbnMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxGaWxlT3B0aW9ucz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbOV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEZpbGVPcHRpb25zKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBGaWxlT3B0aW9ucyhGaWxlT3B0aW9ucyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgamF2YVBhY2thZ2VfID0gb3RoZXIuamF2YVBhY2thZ2VfOwotICAgICAgamF2YU91dGVyQ2xhc3NuYW1lXyA9IG90aGVyLmphdmFPdXRlckNsYXNzbmFtZV87Ci0gICAgICBqYXZhTXVsdGlwbGVGaWxlc18gPSBvdGhlci5qYXZhTXVsdGlwbGVGaWxlc187Ci0gICAgICBqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoXyA9IG90aGVyLmphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hfOwotICAgICAgamF2YVN0cmluZ0NoZWNrVXRmOF8gPSBvdGhlci5qYXZhU3RyaW5nQ2hlY2tVdGY4XzsKLSAgICAgIG9wdGltaXplRm9yXyA9IG90aGVyLm9wdGltaXplRm9yXzsKLSAgICAgIGdvUGFja2FnZV8gPSBvdGhlci5nb1BhY2thZ2VfOwotICAgICAgY2NHZW5lcmljU2VydmljZXNfID0gb3RoZXIuY2NHZW5lcmljU2VydmljZXNfOwotICAgICAgamF2YUdlbmVyaWNTZXJ2aWNlc18gPSBvdGhlci5qYXZhR2VuZXJpY1NlcnZpY2VzXzsKLSAgICAgIHB5R2VuZXJpY1NlcnZpY2VzXyA9IG90aGVyLnB5R2VuZXJpY1NlcnZpY2VzXzsKLSAgICAgIGRlcHJlY2F0ZWRfID0gb3RoZXIuZGVwcmVjYXRlZF87Ci0gICAgICBjY0VuYWJsZUFyZW5hc18gPSBvdGhlci5jY0VuYWJsZUFyZW5hc187Ci0gICAgICBvYmpjQ2xhc3NQcmVmaXhfID0gb3RoZXIub2JqY0NsYXNzUHJlZml4XzsKLSAgICAgIGNzaGFycE5hbWVzcGFjZV8gPSBvdGhlci5jc2hhcnBOYW1lc3BhY2VfOwotICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBvdGhlci51bmludGVycHJldGVkT3B0aW9uXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWxlT3B0aW9ucyBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRmlsZU9wdGlvbnModGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJqYXZhX3BhY2thZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEphdmFQYWNrYWdlRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIGphdmFQYWNrYWdlXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFNldHMgdGhlIEphdmEgcGFja2FnZSB3aGVyZSBjbGFzc2VzIGdlbmVyYXRlZCBmcm9tIHRoaXMgLnByb3RvIHdpbGwgYmUKLSAgICAvLy8gIHBsYWNlZC4gIEJ5IGRlZmF1bHQsIHRoZSBwcm90byBwYWNrYWdlIGlzIHVzZWQsIGJ1dCB0aGlzIGlzIG9mdGVuCi0gICAgLy8vICBpbmFwcHJvcHJpYXRlIGJlY2F1c2UgcHJvdG8gcGFja2FnZXMgZG8gbm90IG5vcm1hbGx5IHN0YXJ0IHdpdGggYmFja3dhcmRzCi0gICAgLy8vICBkb21haW4gbmFtZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIEphdmFQYWNrYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBqYXZhUGFja2FnZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGphdmFQYWNrYWdlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImphdmFfb3V0ZXJfY2xhc3NuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBKYXZhT3V0ZXJDbGFzc25hbWVGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgamF2YU91dGVyQ2xhc3NuYW1lXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElmIHNldCwgYWxsIHRoZSBjbGFzc2VzIGZyb20gdGhlIC5wcm90byBmaWxlIGFyZSB3cmFwcGVkIGluIGEgc2luZ2xlCi0gICAgLy8vICBvdXRlciBjbGFzcyB3aXRoIHRoZSBnaXZlbiBuYW1lLiAgVGhpcyBhcHBsaWVzIHRvIGJvdGggUHJvdG8xCi0gICAgLy8vICAoZXF1aXZhbGVudCB0byB0aGUgb2xkICItLW9uZV9qYXZhX2ZpbGUiIG9wdGlvbikgYW5kIFByb3RvMiAod2hlcmUKLSAgICAvLy8gIGEgLnByb3RvIGFsd2F5cyB0cmFuc2xhdGVzIHRvIGEgc2luZ2xlIGNsYXNzLCBidXQgeW91IG1heSB3YW50IHRvCi0gICAgLy8vICBleHBsaWNpdGx5IGNob29zZSB0aGUgY2xhc3MgbmFtZSkuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIEphdmFPdXRlckNsYXNzbmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gamF2YU91dGVyQ2xhc3NuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgamF2YU91dGVyQ2xhc3NuYW1lXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImphdmFfbXVsdGlwbGVfZmlsZXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEphdmFNdWx0aXBsZUZpbGVzRmllbGROdW1iZXIgPSAxMDsKLSAgICBwcml2YXRlIGJvb2wgamF2YU11bHRpcGxlRmlsZXNfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgYSBzZXBhcmF0ZSAuamF2YQotICAgIC8vLyAgZmlsZSBmb3IgZWFjaCB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgYW5kIHNlcnZpY2UgZGVmaW5lZCBpbiB0aGUgLnByb3RvCi0gICAgLy8vICBmaWxlLiAgVGh1cywgdGhlc2UgdHlwZXMgd2lsbCAqbm90KiBiZSBuZXN0ZWQgaW5zaWRlIHRoZSBvdXRlciBjbGFzcwotICAgIC8vLyAgbmFtZWQgYnkgamF2YV9vdXRlcl9jbGFzc25hbWUuICBIb3dldmVyLCB0aGUgb3V0ZXIgY2xhc3Mgd2lsbCBzdGlsbCBiZQotICAgIC8vLyAgZ2VuZXJhdGVkIHRvIGNvbnRhaW4gdGhlIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzIHdlbGwgYXMgYW55Ci0gICAgLy8vICB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWZpbmVkIGluIHRoZSBmaWxlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGJvb2wgSmF2YU11bHRpcGxlRmlsZXMgewotICAgICAgZ2V0IHsgcmV0dXJuIGphdmFNdWx0aXBsZUZpbGVzXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgamF2YU11bHRpcGxlRmlsZXNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaEZpZWxkTnVtYmVyID0gMjA7Ci0gICAgcHJpdmF0ZSBib29sIGphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhIGNvZGUgZ2VuZXJhdG9yIHdpbGwgZ2VuZXJhdGUgZXF1YWxzKCkgYW5kCi0gICAgLy8vICBoYXNoQ29kZSgpIG1ldGhvZHMgZm9yIGFsbCBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICAvLy8gIFRoaXMgaW5jcmVhc2VzIGdlbmVyYXRlZCBjb2RlIHNpemUsIHBvdGVudGlhbGx5IHN1YnN0YW50aWFsbHkgZm9yIGxhcmdlCi0gICAgLy8vICBwcm90b3MsIHdoaWNoIG1heSBoYXJtIGEgbWVtb3J5LWNvbnN0cmFpbmVkIGFwcGxpY2F0aW9uLgotICAgIC8vLyAgLSBJbiB0aGUgZnVsbCBydW50aW1lIHRoaXMgaXMgYSBzcGVlZCBvcHRpbWl6YXRpb24sIGFzIHRoZQotICAgIC8vLyAgQWJzdHJhY3RNZXNzYWdlIGJhc2UgY2xhc3MgaW5jbHVkZXMgcmVmbGVjdGlvbi1iYXNlZCBpbXBsZW1lbnRhdGlvbnMgb2YKLSAgICAvLy8gIHRoZXNlIG1ldGhvZHMuCi0gICAgLy8vICAtIEluIHRoZSBsaXRlIHJ1bnRpbWUsIHNldHRpbmcgdGhpcyBvcHRpb24gY2hhbmdlcyB0aGUgc2VtYW50aWNzIG9mCi0gICAgLy8vICBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSB0byBtb3JlIGNsb3NlbHkgbWF0Y2ggdGhvc2Ugb2YgdGhlIGZ1bGwgcnVudGltZTsKLSAgICAvLy8gIHRoZSBnZW5lcmF0ZWQgbWV0aG9kcyBjb21wdXRlIHRoZWlyIHJlc3VsdHMgYmFzZWQgb24gZmllbGQgdmFsdWVzIHJhdGhlcgotICAgIC8vLyAgdGhhbiBvYmplY3QgaWRlbnRpdHkuIChJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBoYXNoY29kZXMKLSAgICAvLy8gIHdpbGwgYmUgY29uc2lzdGVudCBhY3Jvc3MgcnVudGltZXMgb3IgdmVyc2lvbnMgb2YgdGhlIHByb3RvY29sIGNvbXBpbGVyLikKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIEphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2ggewotICAgICAgZ2V0IHsgcmV0dXJuIGphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBqYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiamF2YV9zdHJpbmdfY2hlY2tfdXRmOCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSmF2YVN0cmluZ0NoZWNrVXRmOEZpZWxkTnVtYmVyID0gMjc7Ci0gICAgcHJpdmF0ZSBib29sIGphdmFTdHJpbmdDaGVja1V0ZjhfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhMiBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdAotICAgIC8vLyAgdGhyb3dzIGFuIGV4Y2VwdGlvbiB3aGVuZXZlciBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYXNzaWduIGEgbm9uLVVURi04Ci0gICAgLy8vICBieXRlIHNlcXVlbmNlIHRvIGEgc3RyaW5nIGZpZWxkLgotICAgIC8vLyAgTWVzc2FnZSByZWZsZWN0aW9uIHdpbGwgZG8gdGhlIHNhbWUuCi0gICAgLy8vICBIb3dldmVyLCBhbiBleHRlbnNpb24gZmllbGQgc3RpbGwgYWNjZXB0cyBub24tVVRGLTggYnl0ZSBzZXF1ZW5jZXMuCi0gICAgLy8vICBUaGlzIG9wdGlvbiBoYXMgbm8gZWZmZWN0IG9uIHdoZW4gdXNlZCB3aXRoIHRoZSBsaXRlIHJ1bnRpbWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBKYXZhU3RyaW5nQ2hlY2tVdGY4IHsKLSAgICAgIGdldCB7IHJldHVybiBqYXZhU3RyaW5nQ2hlY2tVdGY4XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgamF2YVN0cmluZ0NoZWNrVXRmOF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGltaXplX2ZvciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW1pemVGb3JGaWVsZE51bWJlciA9IDk7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZSBvcHRpbWl6ZUZvcl8gPSAwOwotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpbGVPcHRpb25zLlR5cGVzLk9wdGltaXplTW9kZSBPcHRpbWl6ZUZvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW1pemVGb3JfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBvcHRpbWl6ZUZvcl8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImdvX3BhY2thZ2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEdvUGFja2FnZUZpZWxkTnVtYmVyID0gMTE7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgZ29QYWNrYWdlXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFNldHMgdGhlIEdvIHBhY2thZ2Ugd2hlcmUgc3RydWN0cyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCi0gICAgLy8vICBwbGFjZWQuIElmIG9taXR0ZWQsIHRoZSBHbyBwYWNrYWdlIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmc6Ci0gICAgLy8vICAgIC0gVGhlIGJhc2VuYW1lIG9mIHRoZSBwYWNrYWdlIGltcG9ydCBwYXRoLCBpZiBwcm92aWRlZC4KLSAgICAvLy8gICAgLSBPdGhlcndpc2UsIHRoZSBwYWNrYWdlIHN0YXRlbWVudCBpbiB0aGUgLnByb3RvIGZpbGUsIGlmIHByZXNlbnQuCi0gICAgLy8vICAgIC0gT3RoZXJ3aXNlLCB0aGUgYmFzZW5hbWUgb2YgdGhlIC5wcm90byBmaWxlLCB3aXRob3V0IGV4dGVuc2lvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgR29QYWNrYWdlIHsKLSAgICAgIGdldCB7IHJldHVybiBnb1BhY2thZ2VfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBnb1BhY2thZ2VfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiY2NfZ2VuZXJpY19zZXJ2aWNlcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQ2NHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE2OwotICAgIHByaXZhdGUgYm9vbCBjY0dlbmVyaWNTZXJ2aWNlc187Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgU2hvdWxkIGdlbmVyaWMgc2VydmljZXMgYmUgZ2VuZXJhdGVkIGluIGVhY2ggbGFuZ3VhZ2U/ICAiR2VuZXJpYyIgc2VydmljZXMKLSAgICAvLy8gIGFyZSBub3Qgc3BlY2lmaWMgdG8gYW55IHBhcnRpY3VsYXIgUlBDIHN5c3RlbS4gIFRoZXkgYXJlIGdlbmVyYXRlZCBieSB0aGUKLSAgICAvLy8gIG1haW4gY29kZSBnZW5lcmF0b3JzIGluIGVhY2ggbGFuZ3VhZ2UgKHdpdGhvdXQgYWRkaXRpb25hbCBwbHVnaW5zKS4KLSAgICAvLy8gIEdlbmVyaWMgc2VydmljZXMgd2VyZSB0aGUgb25seSBraW5kIG9mIHNlcnZpY2UgZ2VuZXJhdGlvbiBzdXBwb3J0ZWQgYnkKLSAgICAvLy8gIGVhcmx5IHZlcnNpb25zIG9mIGdvb2dsZS5wcm90b2J1Zi4KLSAgICAvLy8KLSAgICAvLy8gIEdlbmVyaWMgc2VydmljZXMgYXJlIG5vdyBjb25zaWRlcmVkIGRlcHJlY2F0ZWQgaW4gZmF2b3Igb2YgdXNpbmcgcGx1Z2lucwotICAgIC8vLyAgdGhhdCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHlvdXIgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhlcmVmb3JlLAotICAgIC8vLyAgdGhlc2UgZGVmYXVsdCB0byBmYWxzZS4gIE9sZCBjb2RlIHdoaWNoIGRlcGVuZHMgb24gZ2VuZXJpYyBzZXJ2aWNlcyBzaG91bGQKLSAgICAvLy8gIGV4cGxpY2l0bHkgc2V0IHRoZW0gdG8gdHJ1ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIENjR2VuZXJpY1NlcnZpY2VzIHsKLSAgICAgIGdldCB7IHJldHVybiBjY0dlbmVyaWNTZXJ2aWNlc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGNjR2VuZXJpY1NlcnZpY2VzXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiamF2YV9nZW5lcmljX3NlcnZpY2VzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBKYXZhR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXIgPSAxNzsKLSAgICBwcml2YXRlIGJvb2wgamF2YUdlbmVyaWNTZXJ2aWNlc187Ci0gICAgcHVibGljIGJvb2wgSmF2YUdlbmVyaWNTZXJ2aWNlcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gamF2YUdlbmVyaWNTZXJ2aWNlc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGphdmFHZW5lcmljU2VydmljZXNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJweV9nZW5lcmljX3NlcnZpY2VzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQeUdlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyID0gMTg7Ci0gICAgcHJpdmF0ZSBib29sIHB5R2VuZXJpY1NlcnZpY2VzXzsKLSAgICBwdWJsaWMgYm9vbCBQeUdlbmVyaWNTZXJ2aWNlcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gcHlHZW5lcmljU2VydmljZXNfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBweUdlbmVyaWNTZXJ2aWNlc18gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRlcHJlY2F0ZWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDIzOwotICAgIHByaXZhdGUgYm9vbCBkZXByZWNhdGVkXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBJcyB0aGlzIGZpbGUgZGVwcmVjYXRlZD8KLSAgICAvLy8gIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKLSAgICAvLy8gIGZvciBldmVyeXRoaW5nIGluIHRoZSBmaWxlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkKLSAgICAvLy8gIGxlYXN0LCB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgZmlsZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBEZXByZWNhdGVkIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXByZWNhdGVkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImNjX2VuYWJsZV9hcmVuYXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IENjRW5hYmxlQXJlbmFzRmllbGROdW1iZXIgPSAzMTsKLSAgICBwcml2YXRlIGJvb2wgY2NFbmFibGVBcmVuYXNfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEVuYWJsZXMgdGhlIHVzZSBvZiBhcmVuYXMgZm9yIHRoZSBwcm90byBtZXNzYWdlcyBpbiB0aGlzIGZpbGUuIFRoaXMgYXBwbGllcwotICAgIC8vLyAgb25seSB0byBnZW5lcmF0ZWQgY2xhc3NlcyBmb3IgQysrLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGJvb2wgQ2NFbmFibGVBcmVuYXMgewotICAgICAgZ2V0IHsgcmV0dXJuIGNjRW5hYmxlQXJlbmFzXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgY2NFbmFibGVBcmVuYXNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvYmpjX2NsYXNzX3ByZWZpeCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT2JqY0NsYXNzUHJlZml4RmllbGROdW1iZXIgPSAzNjsKLSAgICBwcml2YXRlIHN0cmluZyBvYmpjQ2xhc3NQcmVmaXhfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgU2V0cyB0aGUgb2JqZWN0aXZlIGMgY2xhc3MgcHJlZml4IHdoaWNoIGlzIHByZXBlbmRlZCB0byBhbGwgb2JqZWN0aXZlIGMKLSAgICAvLy8gIGdlbmVyYXRlZCBjbGFzc2VzIGZyb20gdGhpcyAucHJvdG8uIFRoZXJlIGlzIG5vIGRlZmF1bHQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIE9iamNDbGFzc1ByZWZpeCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb2JqY0NsYXNzUHJlZml4XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgb2JqY0NsYXNzUHJlZml4XyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImNzaGFycF9uYW1lc3BhY2UiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IENzaGFycE5hbWVzcGFjZUZpZWxkTnVtYmVyID0gMzc7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgY3NoYXJwTmFtZXNwYWNlXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIE5hbWVzcGFjZSBmb3IgZ2VuZXJhdGVkIGNsYXNzZXM7IGRlZmF1bHRzIHRvIHRoZSBwYWNrYWdlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBDc2hhcnBOYW1lc3BhY2UgewotICAgICAgZ2V0IHsgcmV0dXJuIGNzaGFycE5hbWVzcGFjZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIGNzaGFycE5hbWVzcGFjZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ1bmludGVycHJldGVkX29wdGlvbiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4gX3JlcGVhdGVkX3VuaW50ZXJwcmV0ZWRPcHRpb25fY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDc5OTQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbi5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4gdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uIHsKLSAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRmlsZU9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhGaWxlT3B0aW9ucyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoSmF2YVBhY2thZ2UgIT0gb3RoZXIuSmF2YVBhY2thZ2UpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChKYXZhT3V0ZXJDbGFzc25hbWUgIT0gb3RoZXIuSmF2YU91dGVyQ2xhc3NuYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoSmF2YU11bHRpcGxlRmlsZXMgIT0gb3RoZXIuSmF2YU11bHRpcGxlRmlsZXMpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoICE9IG90aGVyLkphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2gpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChKYXZhU3RyaW5nQ2hlY2tVdGY4ICE9IG90aGVyLkphdmFTdHJpbmdDaGVja1V0ZjgpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPcHRpbWl6ZUZvciAhPSBvdGhlci5PcHRpbWl6ZUZvcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEdvUGFja2FnZSAhPSBvdGhlci5Hb1BhY2thZ2UpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChDY0dlbmVyaWNTZXJ2aWNlcyAhPSBvdGhlci5DY0dlbmVyaWNTZXJ2aWNlcykgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKEphdmFHZW5lcmljU2VydmljZXMgIT0gb3RoZXIuSmF2YUdlbmVyaWNTZXJ2aWNlcykgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFB5R2VuZXJpY1NlcnZpY2VzICE9IG90aGVyLlB5R2VuZXJpY1NlcnZpY2VzKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBvdGhlci5EZXByZWNhdGVkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQ2NFbmFibGVBcmVuYXMgIT0gb3RoZXIuQ2NFbmFibGVBcmVuYXMpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChPYmpjQ2xhc3NQcmVmaXggIT0gb3RoZXIuT2JqY0NsYXNzUHJlZml4KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQ3NoYXJwTmFtZXNwYWNlICE9IG90aGVyLkNzaGFycE5hbWVzcGFjZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIXVuaW50ZXJwcmV0ZWRPcHRpb25fLkVxdWFscyhvdGhlci51bmludGVycHJldGVkT3B0aW9uXykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoSmF2YVBhY2thZ2UuTGVuZ3RoICE9IDApIGhhc2ggXj0gSmF2YVBhY2thZ2UuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChKYXZhT3V0ZXJDbGFzc25hbWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gSmF2YU91dGVyQ2xhc3NuYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoSmF2YU11bHRpcGxlRmlsZXMgIT0gZmFsc2UpIGhhc2ggXj0gSmF2YU11bHRpcGxlRmlsZXMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoICE9IGZhbHNlKSBoYXNoIF49IEphdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2guR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChKYXZhU3RyaW5nQ2hlY2tVdGY4ICE9IGZhbHNlKSBoYXNoIF49IEphdmFTdHJpbmdDaGVja1V0ZjguR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChPcHRpbWl6ZUZvciAhPSAwKSBoYXNoIF49IE9wdGltaXplRm9yLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoR29QYWNrYWdlLkxlbmd0aCAhPSAwKSBoYXNoIF49IEdvUGFja2FnZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKENjR2VuZXJpY1NlcnZpY2VzICE9IGZhbHNlKSBoYXNoIF49IENjR2VuZXJpY1NlcnZpY2VzLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoSmF2YUdlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgaGFzaCBePSBKYXZhR2VuZXJpY1NlcnZpY2VzLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoUHlHZW5lcmljU2VydmljZXMgIT0gZmFsc2UpIGhhc2ggXj0gUHlHZW5lcmljU2VydmljZXMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChEZXByZWNhdGVkICE9IGZhbHNlKSBoYXNoIF49IERlcHJlY2F0ZWQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChDY0VuYWJsZUFyZW5hcyAhPSBmYWxzZSkgaGFzaCBePSBDY0VuYWJsZUFyZW5hcy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9iamNDbGFzc1ByZWZpeC5MZW5ndGggIT0gMCkgaGFzaCBePSBPYmpjQ2xhc3NQcmVmaXguR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChDc2hhcnBOYW1lc3BhY2UuTGVuZ3RoICE9IDApIGhhc2ggXj0gQ3NoYXJwTmFtZXNwYWNlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IHVuaW50ZXJwcmV0ZWRPcHRpb25fLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChKYXZhUGFja2FnZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoSmF2YVBhY2thZ2UpOwotICAgICAgfQotICAgICAgaWYgKEphdmFPdXRlckNsYXNzbmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNjYpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoSmF2YU91dGVyQ2xhc3NuYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpbWl6ZUZvciAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg3Mik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgT3B0aW1pemVGb3IpOwotICAgICAgfQotICAgICAgaWYgKEphdmFNdWx0aXBsZUZpbGVzICE9IGZhbHNlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJvb2woSmF2YU11bHRpcGxlRmlsZXMpOwotICAgICAgfQotICAgICAgaWYgKEdvUGFja2FnZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoR29QYWNrYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChDY0dlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTI4LCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChDY0dlbmVyaWNTZXJ2aWNlcyk7Ci0gICAgICB9Ci0gICAgICBpZiAoSmF2YUdlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTM2LCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChKYXZhR2VuZXJpY1NlcnZpY2VzKTsKLSAgICAgIH0KLSAgICAgIGlmIChQeUdlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTQ0LCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChQeUdlbmVyaWNTZXJ2aWNlcyk7Ci0gICAgICB9Ci0gICAgICBpZiAoSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYwLCAxKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoKTsKLSAgICAgIH0KLSAgICAgIGlmIChEZXByZWNhdGVkICE9IGZhbHNlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxODQsIDEpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKERlcHJlY2F0ZWQpOwotICAgICAgfQotICAgICAgaWYgKEphdmFTdHJpbmdDaGVja1V0ZjggIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDIxNiwgMSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJvb2woSmF2YVN0cmluZ0NoZWNrVXRmOCk7Ci0gICAgICB9Ci0gICAgICBpZiAoQ2NFbmFibGVBcmVuYXMgIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI0OCwgMSk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJvb2woQ2NFbmFibGVBcmVuYXMpOwotICAgICAgfQotICAgICAgaWYgKE9iamNDbGFzc1ByZWZpeC5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYyLCAyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKE9iamNDbGFzc1ByZWZpeCk7Ci0gICAgICB9Ci0gICAgICBpZiAoQ3NoYXJwTmFtZXNwYWNlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNzAsIDIpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoQ3NoYXJwTmFtZXNwYWNlKTsKLSAgICAgIH0KLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKEphdmFQYWNrYWdlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShKYXZhUGFja2FnZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoSmF2YU91dGVyQ2xhc3NuYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShKYXZhT3V0ZXJDbGFzc25hbWUpOwotICAgICAgfQotICAgICAgaWYgKEphdmFNdWx0aXBsZUZpbGVzICE9IGZhbHNlKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDIgKyAxOwotICAgICAgfQotICAgICAgaWYgKEphdmFTdHJpbmdDaGVja1V0ZjggIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChPcHRpbWl6ZUZvciAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgT3B0aW1pemVGb3IpOwotICAgICAgfQotICAgICAgaWYgKEdvUGFja2FnZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoR29QYWNrYWdlKTsKLSAgICAgIH0KLSAgICAgIGlmIChDY0dlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDIgKyAxOwotICAgICAgfQotICAgICAgaWYgKEphdmFHZW5lcmljU2VydmljZXMgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChQeUdlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDIgKyAxOwotICAgICAgfQotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChDY0VuYWJsZUFyZW5hcyAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDIgKyAxOwotICAgICAgfQotICAgICAgaWYgKE9iamNDbGFzc1ByZWZpeC5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDIgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoT2JqY0NsYXNzUHJlZml4KTsKLSAgICAgIH0KLSAgICAgIGlmIChDc2hhcnBOYW1lc3BhY2UuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAyICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKENzaGFycE5hbWVzcGFjZSk7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHVuaW50ZXJwcmV0ZWRPcHRpb25fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VuaW50ZXJwcmV0ZWRPcHRpb25fY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEZpbGVPcHRpb25zIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuSmF2YVBhY2thZ2UuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgSmF2YVBhY2thZ2UgPSBvdGhlci5KYXZhUGFja2FnZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5KYXZhT3V0ZXJDbGFzc25hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgSmF2YU91dGVyQ2xhc3NuYW1lID0gb3RoZXIuSmF2YU91dGVyQ2xhc3NuYW1lOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkphdmFNdWx0aXBsZUZpbGVzICE9IGZhbHNlKSB7Ci0gICAgICAgIEphdmFNdWx0aXBsZUZpbGVzID0gb3RoZXIuSmF2YU11bHRpcGxlRmlsZXM7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaCAhPSBmYWxzZSkgewotICAgICAgICBKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoID0gb3RoZXIuSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5KYXZhU3RyaW5nQ2hlY2tVdGY4ICE9IGZhbHNlKSB7Ci0gICAgICAgIEphdmFTdHJpbmdDaGVja1V0ZjggPSBvdGhlci5KYXZhU3RyaW5nQ2hlY2tVdGY4OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk9wdGltaXplRm9yICE9IDApIHsKLSAgICAgICAgT3B0aW1pemVGb3IgPSBvdGhlci5PcHRpbWl6ZUZvcjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5Hb1BhY2thZ2UuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgR29QYWNrYWdlID0gb3RoZXIuR29QYWNrYWdlOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkNjR2VuZXJpY1NlcnZpY2VzICE9IGZhbHNlKSB7Ci0gICAgICAgIENjR2VuZXJpY1NlcnZpY2VzID0gb3RoZXIuQ2NHZW5lcmljU2VydmljZXM7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuSmF2YUdlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgewotICAgICAgICBKYXZhR2VuZXJpY1NlcnZpY2VzID0gb3RoZXIuSmF2YUdlbmVyaWNTZXJ2aWNlczsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5QeUdlbmVyaWNTZXJ2aWNlcyAhPSBmYWxzZSkgewotICAgICAgICBQeUdlbmVyaWNTZXJ2aWNlcyA9IG90aGVyLlB5R2VuZXJpY1NlcnZpY2VzOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkRlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgRGVwcmVjYXRlZCA9IG90aGVyLkRlcHJlY2F0ZWQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuQ2NFbmFibGVBcmVuYXMgIT0gZmFsc2UpIHsKLSAgICAgICAgQ2NFbmFibGVBcmVuYXMgPSBvdGhlci5DY0VuYWJsZUFyZW5hczsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PYmpjQ2xhc3NQcmVmaXguTGVuZ3RoICE9IDApIHsKLSAgICAgICAgT2JqY0NsYXNzUHJlZml4ID0gb3RoZXIuT2JqY0NsYXNzUHJlZml4OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkNzaGFycE5hbWVzcGFjZS5MZW5ndGggIT0gMCkgewotICAgICAgICBDc2hhcnBOYW1lc3BhY2UgPSBvdGhlci5Dc2hhcnBOYW1lc3BhY2U7Ci0gICAgICB9Ci0gICAgICB1bmludGVycHJldGVkT3B0aW9uXy5BZGQob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIEphdmFQYWNrYWdlID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNjY6IHsKLSAgICAgICAgICAgIEphdmFPdXRlckNsYXNzbmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDcyOiB7Ci0gICAgICAgICAgICBvcHRpbWl6ZUZvcl8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWxlT3B0aW9ucy5UeXBlcy5PcHRpbWl6ZU1vZGUpIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MDogewotICAgICAgICAgICAgSmF2YU11bHRpcGxlRmlsZXMgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgOTA6IHsKLSAgICAgICAgICAgIEdvUGFja2FnZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDEyODogewotICAgICAgICAgICAgQ2NHZW5lcmljU2VydmljZXMgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTM2OiB7Ci0gICAgICAgICAgICBKYXZhR2VuZXJpY1NlcnZpY2VzID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE0NDogewotICAgICAgICAgICAgUHlHZW5lcmljU2VydmljZXMgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTYwOiB7Ci0gICAgICAgICAgICBKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4NDogewotICAgICAgICAgICAgRGVwcmVjYXRlZCA9IGlucHV0LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyMTY6IHsKLSAgICAgICAgICAgIEphdmFTdHJpbmdDaGVja1V0ZjggPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQ4OiB7Ci0gICAgICAgICAgICBDY0VuYWJsZUFyZW5hcyA9IGlucHV0LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyOTA6IHsKLSAgICAgICAgICAgIE9iamNDbGFzc1ByZWZpeCA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI5ODogewotICAgICAgICAgICAgQ3NoYXJwTmFtZXNwYWNlID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzk5NDogewotICAgICAgICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF91bmludGVycHJldGVkT3B0aW9uX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBGaWxlT3B0aW9ucyBtZXNzYWdlIHR5cGUuPC9zdW1tYXJ5PgotICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsKLSAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgIC8vLyAgR2VuZXJhdGVkIGNsYXNzZXMgY2FuIGJlIG9wdGltaXplZCBmb3Igc3BlZWQgb3IgY29kZSBzaXplLgotICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIGludGVybmFsIGVudW0gT3B0aW1pemVNb2RlIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEdlbmVyYXRlIGNvbXBsZXRlIGNvZGUgZm9yIHBhcnNpbmcsIHNlcmlhbGl6YXRpb24sCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiU1BFRUQiKV0gU3BlZWQgPSAxLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgZXRjLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkNPREVfU0laRSIpXSBDb2RlU2l6ZSA9IDIsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBHZW5lcmF0ZSBjb2RlIHVzaW5nIE1lc3NhZ2VMaXRlIGFuZCB0aGUgbGl0ZSBydW50aW1lLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkxJVEVfUlVOVElNRSIpXSBMaXRlUnVudGltZSA9IDMsCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBNZXNzYWdlT3B0aW9ucyA6IHBiOjpJTWVzc2FnZTxNZXNzYWdlT3B0aW9ucz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE1lc3NhZ2VPcHRpb25zPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE1lc3NhZ2VPcHRpb25zPigoKSA9PiBuZXcgTWVzc2FnZU9wdGlvbnMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxNZXNzYWdlT3B0aW9ucz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlT3B0aW9ucygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgTWVzc2FnZU9wdGlvbnMoTWVzc2FnZU9wdGlvbnMgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIG1lc3NhZ2VTZXRXaXJlRm9ybWF0XyA9IG90aGVyLm1lc3NhZ2VTZXRXaXJlRm9ybWF0XzsKLSAgICAgIG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3JfID0gb3RoZXIubm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3Nvcl87Ci0gICAgICBkZXByZWNhdGVkXyA9IG90aGVyLmRlcHJlY2F0ZWRfOwotICAgICAgbWFwRW50cnlfID0gb3RoZXIubWFwRW50cnlfOwotICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBvdGhlci51bmludGVycHJldGVkT3B0aW9uXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlT3B0aW9ucyBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgTWVzc2FnZU9wdGlvbnModGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTWVzc2FnZVNldFdpcmVGb3JtYXRGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBib29sIG1lc3NhZ2VTZXRXaXJlRm9ybWF0XzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBTZXQgdHJ1ZSB0byB1c2UgdGhlIG9sZCBwcm90bzEgTWVzc2FnZVNldCB3aXJlIGZvcm1hdCBmb3IgZXh0ZW5zaW9ucy4KLSAgICAvLy8gIFRoaXMgaXMgcHJvdmlkZWQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggdGhlIE1lc3NhZ2VTZXQgd2lyZQotICAgIC8vLyAgZm9ybWF0LiAgWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZm9yIGFueSBvdGhlciByZWFzb246ICBJdCdzIGxlc3MKLSAgICAvLy8gIGVmZmljaWVudCwgaGFzIGZld2VyIGZlYXR1cmVzLCBhbmQgaXMgbW9yZSBjb21wbGljYXRlZC4KLSAgICAvLy8KLSAgICAvLy8gIFRoZSBtZXNzYWdlIG11c3QgYmUgZGVmaW5lZCBleGFjdGx5IGFzIGZvbGxvd3M6Ci0gICAgLy8vICAgIG1lc3NhZ2UgRm9vIHsKLSAgICAvLy8gICAgICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOwotICAgIC8vLyAgICAgIGV4dGVuc2lvbnMgNCB0byBtYXg7Ci0gICAgLy8vICAgIH0KLSAgICAvLy8gIE5vdGUgdGhhdCB0aGUgbWVzc2FnZSBjYW5ub3QgaGF2ZSBhbnkgZGVmaW5lZCBmaWVsZHM7IE1lc3NhZ2VTZXRzIG9ubHkKLSAgICAvLy8gIGhhdmUgZXh0ZW5zaW9ucy4KLSAgICAvLy8KLSAgICAvLy8gIEFsbCBleHRlbnNpb25zIG9mIHlvdXIgdHlwZSBtdXN0IGJlIHNpbmd1bGFyIG1lc3NhZ2VzOyBlLmcuIHRoZXkgY2Fubm90Ci0gICAgLy8vICBiZSBpbnQzMnMsIGVudW1zLCBvciByZXBlYXRlZCBtZXNzYWdlcy4KLSAgICAvLy8KLSAgICAvLy8gIEJlY2F1c2UgdGhpcyBpcyBhbiBvcHRpb24sIHRoZSBhYm92ZSB0d28gcmVzdHJpY3Rpb25zIGFyZSBub3QgZW5mb3JjZWQgYnkKLSAgICAvLy8gIHRoZSBwcm90b2NvbCBjb21waWxlci4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIE1lc3NhZ2VTZXRXaXJlRm9ybWF0IHsKLSAgICAgIGdldCB7IHJldHVybiBtZXNzYWdlU2V0V2lyZUZvcm1hdF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG1lc3NhZ2VTZXRXaXJlRm9ybWF0XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvckZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIGJvb2wgbm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3Nvcl87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgRGlzYWJsZXMgdGhlIGdlbmVyYXRpb24gb2YgdGhlIHN0YW5kYXJkICJkZXNjcmlwdG9yKCkiIGFjY2Vzc29yLCB3aGljaCBjYW4KLSAgICAvLy8gIGNvbmZsaWN0IHdpdGggYSBmaWVsZCBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyBtZWFudCB0byBtYWtlIG1pZ3JhdGlvbgotICAgIC8vLyAgZnJvbSBwcm90bzEgZWFzaWVyOyBuZXcgY29kZSBzaG91bGQgYXZvaWQgZmllbGRzIG5hbWVkICJkZXNjcmlwdG9yIi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIE5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3IgewotICAgICAgZ2V0IHsgcmV0dXJuIG5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3JfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBub1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGVwcmVjYXRlZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIGJvb2wgZGVwcmVjYXRlZF87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgSXMgdGhpcyBtZXNzYWdlIGRlcHJlY2F0ZWQ/Ci0gICAgLy8vICBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCi0gICAgLy8vICBmb3IgdGhlIG1lc3NhZ2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKLSAgICAvLy8gIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBtZXNzYWdlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIERlcHJlY2F0ZWQgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlcHJlY2F0ZWRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBkZXByZWNhdGVkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibWFwX2VudHJ5IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBNYXBFbnRyeUZpZWxkTnVtYmVyID0gNzsKLSAgICBwcml2YXRlIGJvb2wgbWFwRW50cnlfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFdoZXRoZXIgdGhlIG1lc3NhZ2UgaXMgYW4gYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgbWFwIGVudHJ5IHR5cGUgZm9yIHRoZQotICAgIC8vLyAgbWFwcyBmaWVsZC4KLSAgICAvLy8KLSAgICAvLy8gIEZvciBtYXBzIGZpZWxkczoKLSAgICAvLy8gICAgICBtYXAmbHQ7S2V5VHlwZSwgVmFsdWVUeXBlPiBtYXBfZmllbGQgPSAxOwotICAgIC8vLyAgVGhlIHBhcnNlZCBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6Ci0gICAgLy8vICAgICAgbWVzc2FnZSBNYXBGaWVsZEVudHJ5IHsKLSAgICAvLy8gICAgICAgICAgb3B0aW9uIG1hcF9lbnRyeSA9IHRydWU7Ci0gICAgLy8vICAgICAgICAgIG9wdGlvbmFsIEtleVR5cGUga2V5ID0gMTsKLSAgICAvLy8gICAgICAgICAgb3B0aW9uYWwgVmFsdWVUeXBlIHZhbHVlID0gMjsKLSAgICAvLy8gICAgICB9Ci0gICAgLy8vICAgICAgcmVwZWF0ZWQgTWFwRmllbGRFbnRyeSBtYXBfZmllbGQgPSAxOwotICAgIC8vLwotICAgIC8vLyAgSW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2Ugbm90IHRvIGdlbmVyYXRlIHRoZSBtYXBfZW50cnk9dHJ1ZSBtZXNzYWdlLCBidXQKLSAgICAvLy8gIHVzZSBhIG5hdGl2ZSBtYXAgaW4gdGhlIHRhcmdldCBsYW5ndWFnZSB0byBob2xkIHRoZSBrZXlzIGFuZCB2YWx1ZXMuCi0gICAgLy8vICBUaGUgcmVmbGVjdGlvbiBBUElzIGluIHN1Y2ggaW1wbGVtZW50aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKLSAgICAvLy8gIGlmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQuCi0gICAgLy8vCi0gICAgLy8vICBOT1RFOiBEbyBub3Qgc2V0IHRoZSBvcHRpb24gaW4gLnByb3RvIGZpbGVzLiBBbHdheXMgdXNlIHRoZSBtYXBzIHN5bnRheAotICAgIC8vLyAgaW5zdGVhZC4gVGhlIG9wdGlvbiBzaG91bGQgb25seSBiZSBpbXBsaWNpdGx5IHNldCBieSB0aGUgcHJvdG8gY29tcGlsZXIKLSAgICAvLy8gIHBhcnNlci4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIE1hcEVudHJ5IHsKLSAgICAgIGdldCB7IHJldHVybiBtYXBFbnRyeV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG1hcEVudHJ5XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5pbnRlcnByZXRlZF9vcHRpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+IF9yZXBlYXRlZF91bmludGVycHJldGVkT3B0aW9uX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSg3OTk0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+IHVuaW50ZXJwcmV0ZWRPcHRpb25fID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbiB7Ci0gICAgICBnZXQgeyByZXR1cm4gdW5pbnRlcnByZXRlZE9wdGlvbl87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE1lc3NhZ2VPcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoTWVzc2FnZU9wdGlvbnMgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKE1lc3NhZ2VTZXRXaXJlRm9ybWF0ICE9IG90aGVyLk1lc3NhZ2VTZXRXaXJlRm9ybWF0KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciAhPSBvdGhlci5Ob1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBvdGhlci5EZXByZWNhdGVkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTWFwRW50cnkgIT0gb3RoZXIuTWFwRW50cnkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1bmludGVycHJldGVkT3B0aW9uXy5FcXVhbHMob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKE1lc3NhZ2VTZXRXaXJlRm9ybWF0ICE9IGZhbHNlKSBoYXNoIF49IE1lc3NhZ2VTZXRXaXJlRm9ybWF0LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciAhPSBmYWxzZSkgaGFzaCBePSBOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBmYWxzZSkgaGFzaCBePSBEZXByZWNhdGVkLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoTWFwRW50cnkgIT0gZmFsc2UpIGhhc2ggXj0gTWFwRW50cnkuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5pbnRlcnByZXRlZE9wdGlvbl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKE1lc3NhZ2VTZXRXaXJlRm9ybWF0ICE9IGZhbHNlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChNZXNzYWdlU2V0V2lyZUZvcm1hdCk7Ci0gICAgICB9Ci0gICAgICBpZiAoTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKE5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3IpOwotICAgICAgfQotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI0KTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChEZXByZWNhdGVkKTsKLSAgICAgIH0KLSAgICAgIGlmIChNYXBFbnRyeSAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKE1hcEVudHJ5KTsKLSAgICAgIH0KLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKE1lc3NhZ2VTZXRXaXJlRm9ybWF0ICE9IGZhbHNlKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDE7Ci0gICAgICB9Ci0gICAgICBpZiAoTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDEgKyAxOwotICAgICAgfQotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChNYXBFbnRyeSAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDEgKyAxOwotICAgICAgfQotICAgICAgc2l6ZSArPSB1bmludGVycHJldGVkT3B0aW9uXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF91bmludGVycHJldGVkT3B0aW9uX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShNZXNzYWdlT3B0aW9ucyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk1lc3NhZ2VTZXRXaXJlRm9ybWF0ICE9IGZhbHNlKSB7Ci0gICAgICAgIE1lc3NhZ2VTZXRXaXJlRm9ybWF0ID0gb3RoZXIuTWVzc2FnZVNldFdpcmVGb3JtYXQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvciAhPSBmYWxzZSkgewotICAgICAgICBOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yID0gb3RoZXIuTm9TdGFuZGFyZERlc2NyaXB0b3JBY2Nlc3NvcjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EZXByZWNhdGVkICE9IGZhbHNlKSB7Ci0gICAgICAgIERlcHJlY2F0ZWQgPSBvdGhlci5EZXByZWNhdGVkOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk1hcEVudHJ5ICE9IGZhbHNlKSB7Ci0gICAgICAgIE1hcEVudHJ5ID0gb3RoZXIuTWFwRW50cnk7Ci0gICAgICB9Ci0gICAgICB1bmludGVycHJldGVkT3B0aW9uXy5BZGQob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgTWVzc2FnZVNldFdpcmVGb3JtYXQgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgIE5vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3IgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjQ6IHsKLSAgICAgICAgICAgIERlcHJlY2F0ZWQgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTY6IHsKLSAgICAgICAgICAgIE1hcEVudHJ5ID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc5OTQ6IHsKLSAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEZpZWxkT3B0aW9ucyA6IHBiOjpJTWVzc2FnZTxGaWVsZE9wdGlvbnM+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxGaWVsZE9wdGlvbnM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8RmllbGRPcHRpb25zPigoKSA9PiBuZXcgRmllbGRPcHRpb25zKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8RmllbGRPcHRpb25zPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEZpZWxkT3B0aW9ucygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRmllbGRPcHRpb25zKEZpZWxkT3B0aW9ucyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgY3R5cGVfID0gb3RoZXIuY3R5cGVfOwotICAgICAgcGFja2VkXyA9IG90aGVyLnBhY2tlZF87Ci0gICAgICBqc3R5cGVfID0gb3RoZXIuanN0eXBlXzsKLSAgICAgIGxhenlfID0gb3RoZXIubGF6eV87Ci0gICAgICBkZXByZWNhdGVkXyA9IG90aGVyLmRlcHJlY2F0ZWRfOwotICAgICAgd2Vha18gPSBvdGhlci53ZWFrXzsKLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fID0gb3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRmllbGRPcHRpb25zIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBGaWVsZE9wdGlvbnModGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJjdHlwZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQ3R5cGVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkT3B0aW9ucy5UeXBlcy5DVHlwZSBjdHlwZV8gPSAwOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBjdHlwZSBvcHRpb24gaW5zdHJ1Y3RzIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgdG8gdXNlIGEgZGlmZmVyZW50Ci0gICAgLy8vICByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmllbGQgdGhhbiBpdCBub3JtYWxseSB3b3VsZC4gIFNlZSB0aGUgc3BlY2lmaWMKLSAgICAvLy8gIG9wdGlvbnMgYmVsb3cuICBUaGlzIG9wdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIHRoZSBvcGVuIHNvdXJjZQotICAgIC8vLyAgcmVsZWFzZSAtLSBzb3JyeSwgd2UnbGwgdHJ5IHRvIGluY2x1ZGUgaXQgaW4gYSBmdXR1cmUgdmVyc2lvbiEKLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkT3B0aW9ucy5UeXBlcy5DVHlwZSBDdHlwZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gY3R5cGVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBjdHlwZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhY2tlZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUGFja2VkRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgYm9vbCBwYWNrZWRfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQotICAgIC8vLyAgYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQotICAgIC8vLyAgd3JpdGluZyB0aGUgdGFnIGFuZCB0eXBlIGZvciBlYWNoIGVsZW1lbnQsIHRoZSBlbnRpcmUgYXJyYXkgaXMgZW5jb2RlZCBhcwotICAgIC8vLyAgYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLiBJbiBwcm90bzMsIG9ubHkgZXhwbGljaXQgc2V0dGluZyBpdCB0bwotICAgIC8vLyAgZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBQYWNrZWQgewotICAgICAgZ2V0IHsgcmV0dXJuIHBhY2tlZF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHBhY2tlZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImpzdHlwZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgSnN0eXBlRmllbGROdW1iZXIgPSA2OwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZE9wdGlvbnMuVHlwZXMuSlNUeXBlIGpzdHlwZV8gPSAwOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBqc3R5cGUgb3B0aW9uIGRldGVybWluZXMgdGhlIEphdmFTY3JpcHQgdHlwZSB1c2VkIGZvciB2YWx1ZXMgb2YgdGhlCi0gICAgLy8vICBmaWVsZC4gIFRoZSBvcHRpb24gaXMgcGVybWl0dGVkIG9ubHkgZm9yIDY0IGJpdCBpbnRlZ3JhbCBhbmQgZml4ZWQgdHlwZXMKLSAgICAvLy8gIChpbnQ2NCwgdWludDY0LCBzaW50NjQsIGZpeGVkNjQsIHNmaXhlZDY0KS4gIEJ5IGRlZmF1bHQgdGhlc2UgdHlwZXMgYXJlCi0gICAgLy8vICByZXByZXNlbnRlZCBhcyBKYXZhU2NyaXB0IHN0cmluZ3MuICBUaGlzIGF2b2lkcyBsb3NzIG9mIHByZWNpc2lvbiB0aGF0IGNhbgotICAgIC8vLyAgaGFwcGVuIHdoZW4gYSBsYXJnZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBmbG9hdGluZyBwb2ludCBKYXZhU2NyaXB0Ci0gICAgLy8vICBudW1iZXJzLiAgU3BlY2lmeWluZyBKU19OVU1CRVIgZm9yIHRoZSBqc3R5cGUgY2F1c2VzIHRoZSBnZW5lcmF0ZWQKLSAgICAvLy8gIEphdmFTY3JpcHQgY29kZSB0byB1c2UgdGhlIEphdmFTY3JpcHQgIm51bWJlciIgdHlwZSBpbnN0ZWFkIG9mIHN0cmluZ3MuCi0gICAgLy8vICBUaGlzIG9wdGlvbiBpcyBhbiBlbnVtIHRvIHBlcm1pdCBhZGRpdGlvbmFsIHR5cGVzIHRvIGJlIGFkZGVkLAotICAgIC8vLyAgZS5nLiBnb29nLm1hdGguSW50ZWdlci4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkZpZWxkT3B0aW9ucy5UeXBlcy5KU1R5cGUgSnN0eXBlIHsKLSAgICAgIGdldCB7IHJldHVybiBqc3R5cGVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBqc3R5cGVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJsYXp5IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBMYXp5RmllbGROdW1iZXIgPSA1OwotICAgIHByaXZhdGUgYm9vbCBsYXp5XzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBTaG91bGQgdGhpcyBmaWVsZCBiZSBwYXJzZWQgbGF6aWx5PyAgTGF6eSBhcHBsaWVzIG9ubHkgdG8gbWVzc2FnZS10eXBlCi0gICAgLy8vICBmaWVsZHMuICBJdCBtZWFucyB0aGF0IHdoZW4gdGhlIG91dGVyIG1lc3NhZ2UgaXMgaW5pdGlhbGx5IHBhcnNlZCwgdGhlCi0gICAgLy8vICBpbm5lciBtZXNzYWdlJ3MgY29udGVudHMgd2lsbCBub3QgYmUgcGFyc2VkIGJ1dCBpbnN0ZWFkIHN0b3JlZCBpbiBlbmNvZGVkCi0gICAgLy8vICBmb3JtLiAgVGhlIGlubmVyIG1lc3NhZ2Ugd2lsbCBhY3R1YWxseSBiZSBwYXJzZWQgd2hlbiBpdCBpcyBmaXJzdCBhY2Nlc3NlZC4KLSAgICAvLy8KLSAgICAvLy8gIFRoaXMgaXMgb25seSBhIGhpbnQuICBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCi0gICAgLy8vICBlYWdlciBvciBsYXp5IHBhcnNpbmcgcmVnYXJkbGVzcyBvZiB0aGUgdmFsdWUgb2YgdGhpcyBvcHRpb24uICBIb3dldmVyLAotICAgIC8vLyAgc2V0dGluZyB0aGlzIG9wdGlvbiB0cnVlIHN1Z2dlc3RzIHRoYXQgdGhlIHByb3RvY29sIGF1dGhvciBiZWxpZXZlcyB0aGF0Ci0gICAgLy8vICB1c2luZyBsYXp5IHBhcnNpbmcgb24gdGhpcyBmaWVsZCBpcyB3b3J0aCB0aGUgYWRkaXRpb25hbCBib29ra2VlcGluZwotICAgIC8vLyAgb3ZlcmhlYWQgdHlwaWNhbGx5IG5lZWRlZCB0byBpbXBsZW1lbnQgaXQuCi0gICAgLy8vCi0gICAgLy8vICBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYW55IGdlbmVyYXRlZCBjb2RlOwotICAgIC8vLyAgYWxsIG1ldGhvZCBzaWduYXR1cmVzIHJlbWFpbiB0aGUgc2FtZS4gIEZ1cnRoZXJtb3JlLCB0aHJlYWQtc2FmZXR5IG9mIHRoZQotICAgIC8vLyAgaW50ZXJmYWNlIGlzIG5vdCBhZmZlY3RlZCBieSB0aGlzIG9wdGlvbjsgY29uc3QgbWV0aG9kcyByZW1haW4gc2FmZSB0bwotICAgIC8vLyAgY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB3aGlsZSBub24tY29uc3QgbWV0aG9kcyBjb250aW51ZQotICAgIC8vLyAgdG8gcmVxdWlyZSBleGNsdXNpdmUgYWNjZXNzLgotICAgIC8vLwotICAgIC8vLyAgTm90ZSB0aGF0IGltcGxlbWVudGF0aW9ucyBtYXkgY2hvb3NlIG5vdCB0byBjaGVjayByZXF1aXJlZCBmaWVsZHMgd2l0aGluCi0gICAgLy8vICBhIGxhenkgc3ViLW1lc3NhZ2UuICBUaGF0IGlzLCBjYWxsaW5nIElzSW5pdGlhbGl6ZWQoKSBvbiB0aGUgb3V0aGVyIG1lc3NhZ2UKLSAgICAvLy8gIG1heSByZXR1cm4gdHJ1ZSBldmVuIGlmIHRoZSBpbm5lciBtZXNzYWdlIGhhcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KLSAgICAvLy8gIFRoaXMgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBpbm5lciBtZXNzYWdlIHdvdWxkIGhhdmUgdG8gYmUKLSAgICAvLy8gIHBhcnNlZCBpbiBvcmRlciB0byBwZXJmb3JtIHRoZSBjaGVjaywgZGVmZWF0aW5nIHRoZSBwdXJwb3NlIG9mIGxhenkKLSAgICAvLy8gIHBhcnNpbmcuICBBbiBpbXBsZW1lbnRhdGlvbiB3aGljaCBjaG9vc2VzIG5vdCB0byBjaGVjayByZXF1aXJlZCBmaWVsZHMKLSAgICAvLy8gIG11c3QgYmUgY29uc2lzdGVudCBhYm91dCBpdC4gIFRoYXQgaXMsIGZvciBhbnkgcGFydGljdWxhciBzdWItbWVzc2FnZSwgdGhlCi0gICAgLy8vICBpbXBsZW1lbnRhdGlvbiBtdXN0IGVpdGhlciAqYWx3YXlzKiBjaGVjayBpdHMgcmVxdWlyZWQgZmllbGRzLCBvciAqbmV2ZXIqCi0gICAgLy8vICBjaGVjayBpdHMgcmVxdWlyZWQgZmllbGRzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIGhhcwotICAgIC8vLyAgYmVlbiBwYXJzZWQuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBMYXp5IHsKLSAgICAgIGdldCB7IHJldHVybiBsYXp5XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbGF6eV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRlcHJlY2F0ZWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBib29sIGRlcHJlY2F0ZWRfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElzIHRoaXMgZmllbGQgZGVwcmVjYXRlZD8KLSAgICAvLy8gIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKLSAgICAvLy8gIGZvciBhY2Nlc3NvcnMsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwgdGhpcwotICAgIC8vLyAgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBmaWVsZHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBEZXByZWNhdGVkIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXByZWNhdGVkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIndlYWsiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFdlYWtGaWVsZE51bWJlciA9IDEwOwotICAgIHByaXZhdGUgYm9vbCB3ZWFrXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBGb3IgR29vZ2xlLWludGVybmFsIG1pZ3JhdGlvbiBvbmx5LiBEbyBub3QgdXNlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGJvb2wgV2VhayB7Ci0gICAgICBnZXQgeyByZXR1cm4gd2Vha187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHdlYWtfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ1bmludGVycHJldGVkX29wdGlvbiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4gX3JlcGVhdGVkX3VuaW50ZXJwcmV0ZWRPcHRpb25fY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDc5OTQsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbi5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4gdW5pbnRlcnByZXRlZE9wdGlvbl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiBVbmludGVycHJldGVkT3B0aW9uIHsKLSAgICAgIGdldCB7IHJldHVybiB1bmludGVycHJldGVkT3B0aW9uXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRmllbGRPcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRmllbGRPcHRpb25zIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChDdHlwZSAhPSBvdGhlci5DdHlwZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFBhY2tlZCAhPSBvdGhlci5QYWNrZWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChKc3R5cGUgIT0gb3RoZXIuSnN0eXBlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTGF6eSAhPSBvdGhlci5MYXp5KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBvdGhlci5EZXByZWNhdGVkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoV2VhayAhPSBvdGhlci5XZWFrKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5pbnRlcnByZXRlZE9wdGlvbl8uRXF1YWxzKG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChDdHlwZSAhPSAwKSBoYXNoIF49IEN0eXBlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoUGFja2VkICE9IGZhbHNlKSBoYXNoIF49IFBhY2tlZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEpzdHlwZSAhPSAwKSBoYXNoIF49IEpzdHlwZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKExhenkgIT0gZmFsc2UpIGhhc2ggXj0gTGF6eS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIGhhc2ggXj0gRGVwcmVjYXRlZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFdlYWsgIT0gZmFsc2UpIGhhc2ggXj0gV2Vhay5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB1bmludGVycHJldGVkT3B0aW9uXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoQ3R5cGUgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgQ3R5cGUpOwotICAgICAgfQotICAgICAgaWYgKFBhY2tlZCAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKFBhY2tlZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKERlcHJlY2F0ZWQpOwotICAgICAgfQotICAgICAgaWYgKExhenkgIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChMYXp5KTsKLSAgICAgIH0KLSAgICAgIGlmIChKc3R5cGUgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpIEpzdHlwZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoV2VhayAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoODApOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKFdlYWspOwotICAgICAgfQotICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91bmludGVycHJldGVkT3B0aW9uX2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoQ3R5cGUgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKChpbnQpIEN0eXBlKTsKLSAgICAgIH0KLSAgICAgIGlmIChQYWNrZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChKc3R5cGUgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKChpbnQpIEpzdHlwZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoTGF6eSAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDEgKyAxOwotICAgICAgfQotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChXZWFrICE9IGZhbHNlKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDE7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHVuaW50ZXJwcmV0ZWRPcHRpb25fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VuaW50ZXJwcmV0ZWRPcHRpb25fY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEZpZWxkT3B0aW9ucyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkN0eXBlICE9IDApIHsKLSAgICAgICAgQ3R5cGUgPSBvdGhlci5DdHlwZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5QYWNrZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgUGFja2VkID0gb3RoZXIuUGFja2VkOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkpzdHlwZSAhPSAwKSB7Ci0gICAgICAgIEpzdHlwZSA9IG90aGVyLkpzdHlwZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5MYXp5ICE9IGZhbHNlKSB7Ci0gICAgICAgIExhenkgPSBvdGhlci5MYXp5OwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkRlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgRGVwcmVjYXRlZCA9IG90aGVyLkRlcHJlY2F0ZWQ7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuV2VhayAhPSBmYWxzZSkgewotICAgICAgICBXZWFrID0gb3RoZXIuV2VhazsKLSAgICAgIH0KLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZChvdGhlci51bmludGVycHJldGVkT3B0aW9uXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBjdHlwZV8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5GaWVsZE9wdGlvbnMuVHlwZXMuQ1R5cGUpIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgUGFja2VkID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI0OiB7Ci0gICAgICAgICAgICBEZXByZWNhdGVkID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQwOiB7Ci0gICAgICAgICAgICBMYXp5ID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQ4OiB7Ci0gICAgICAgICAgICBqc3R5cGVfID0gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRmllbGRPcHRpb25zLlR5cGVzLkpTVHlwZSkgaW5wdXQuUmVhZEVudW0oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDgwOiB7Ci0gICAgICAgICAgICBXZWFrID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc5OTQ6IHsKLSAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcwotICAgIC8vLyA8c3VtbWFyeT5Db250YWluZXIgZm9yIG5lc3RlZCB0eXBlcyBkZWNsYXJlZCBpbiB0aGUgRmllbGRPcHRpb25zIG1lc3NhZ2UgdHlwZS48L3N1bW1hcnk+Ci0gICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgewotICAgICAgaW50ZXJuYWwgZW51bSBDVHlwZSB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBEZWZhdWx0IG1vZGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiU1RSSU5HIildIFN0cmluZyA9IDAsCi0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiQ09SRCIpXSBDb3JkID0gMSwKLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJTVFJJTkdfUElFQ0UiKV0gU3RyaW5nUGllY2UgPSAyLAotICAgICAgfQotCi0gICAgICBpbnRlcm5hbCBlbnVtIEpTVHlwZSB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBVc2UgdGhlIGRlZmF1bHQgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJKU19OT1JNQUwiKV0gSnNOb3JtYWwgPSAwLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgVXNlIEphdmFTY3JpcHQgc3RyaW5ncy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJKU19TVFJJTkciKV0gSnNTdHJpbmcgPSAxLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgVXNlIEphdmFTY3JpcHQgbnVtYmVycy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJKU19OVU1CRVIiKV0gSnNOdW1iZXIgPSAyLAotICAgICAgfQotCi0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRW51bU9wdGlvbnMgOiBwYjo6SU1lc3NhZ2U8RW51bU9wdGlvbnM+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtT3B0aW9ucz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtT3B0aW9ucz4oKCkgPT4gbmV3IEVudW1PcHRpb25zKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8RW51bU9wdGlvbnM+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzEyXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bU9wdGlvbnMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEVudW1PcHRpb25zKEVudW1PcHRpb25zIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBhbGxvd0FsaWFzXyA9IG90aGVyLmFsbG93QWxpYXNfOwotICAgICAgZGVwcmVjYXRlZF8gPSBvdGhlci5kZXByZWNhdGVkXzsKLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fID0gb3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bU9wdGlvbnMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEVudW1PcHRpb25zKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYWxsb3dfYWxpYXMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEFsbG93QWxpYXNGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBib29sIGFsbG93QWxpYXNfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFNldCB0aGlzIG9wdGlvbiB0byB0cnVlIHRvIGFsbG93IG1hcHBpbmcgZGlmZmVyZW50IHRhZyBuYW1lcyB0byB0aGUgc2FtZQotICAgIC8vLyAgdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBBbGxvd0FsaWFzIHsKLSAgICAgIGdldCB7IHJldHVybiBhbGxvd0FsaWFzXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgYWxsb3dBbGlhc18gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRlcHJlY2F0ZWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBib29sIGRlcHJlY2F0ZWRfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElzIHRoaXMgZW51bSBkZXByZWNhdGVkPwotICAgIC8vLyAgRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwotICAgIC8vLyAgZm9yIHRoZSBlbnVtLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsIHRoaXMKLSAgICAvLy8gIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgZW51bXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBEZXByZWNhdGVkIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXByZWNhdGVkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNzk5NCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiB1bmludGVycHJldGVkT3B0aW9uXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+IFVuaW50ZXJwcmV0ZWRPcHRpb24gewotICAgICAgZ2V0IHsgcmV0dXJuIHVuaW50ZXJwcmV0ZWRPcHRpb25fOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBFbnVtT3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEVudW1PcHRpb25zIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChBbGxvd0FsaWFzICE9IG90aGVyLkFsbG93QWxpYXMpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChEZXByZWNhdGVkICE9IG90aGVyLkRlcHJlY2F0ZWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1bmludGVycHJldGVkT3B0aW9uXy5FcXVhbHMob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKEFsbG93QWxpYXMgIT0gZmFsc2UpIGhhc2ggXj0gQWxsb3dBbGlhcy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIGhhc2ggXj0gRGVwcmVjYXRlZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB1bmludGVycHJldGVkT3B0aW9uXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoQWxsb3dBbGlhcyAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKEFsbG93QWxpYXMpOwotICAgICAgfQotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI0KTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChEZXByZWNhdGVkKTsKLSAgICAgIH0KLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKEFsbG93QWxpYXMgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChEZXByZWNhdGVkICE9IGZhbHNlKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIDE7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IHVuaW50ZXJwcmV0ZWRPcHRpb25fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3VuaW50ZXJwcmV0ZWRPcHRpb25fY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEVudW1PcHRpb25zIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuQWxsb3dBbGlhcyAhPSBmYWxzZSkgewotICAgICAgICBBbGxvd0FsaWFzID0gb3RoZXIuQWxsb3dBbGlhczsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EZXByZWNhdGVkICE9IGZhbHNlKSB7Ci0gICAgICAgIERlcHJlY2F0ZWQgPSBvdGhlci5EZXByZWNhdGVkOwotICAgICAgfQotICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICBBbGxvd0FsaWFzID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDI0OiB7Ci0gICAgICAgICAgICBEZXByZWNhdGVkID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc5OTQ6IHsKLSAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEVudW1WYWx1ZU9wdGlvbnMgOiBwYjo6SU1lc3NhZ2U8RW51bVZhbHVlT3B0aW9ucz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEVudW1WYWx1ZU9wdGlvbnM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8RW51bVZhbHVlT3B0aW9ucz4oKCkgPT4gbmV3IEVudW1WYWx1ZU9wdGlvbnMoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtVmFsdWVPcHRpb25zPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxM107IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1WYWx1ZU9wdGlvbnMoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEVudW1WYWx1ZU9wdGlvbnMoRW51bVZhbHVlT3B0aW9ucyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgZGVwcmVjYXRlZF8gPSBvdGhlci5kZXByZWNhdGVkXzsKLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fID0gb3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bVZhbHVlT3B0aW9ucyBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRW51bVZhbHVlT3B0aW9ucyh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRlcHJlY2F0ZWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IERlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBib29sIGRlcHJlY2F0ZWRfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElzIHRoaXMgZW51bSB2YWx1ZSBkZXByZWNhdGVkPwotICAgIC8vLyAgRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwotICAgIC8vLyAgZm9yIHRoZSBlbnVtIHZhbHVlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCi0gICAgLy8vICB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgZW51bSB2YWx1ZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBEZXByZWNhdGVkIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXByZWNhdGVkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNzk5NCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiB1bmludGVycHJldGVkT3B0aW9uXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+IFVuaW50ZXJwcmV0ZWRPcHRpb24gewotICAgICAgZ2V0IHsgcmV0dXJuIHVuaW50ZXJwcmV0ZWRPcHRpb25fOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBFbnVtVmFsdWVPcHRpb25zKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRW51bVZhbHVlT3B0aW9ucyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBvdGhlci5EZXByZWNhdGVkKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighdW5pbnRlcnByZXRlZE9wdGlvbl8uRXF1YWxzKG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChEZXByZWNhdGVkICE9IGZhbHNlKSBoYXNoIF49IERlcHJlY2F0ZWQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gdW5pbnRlcnByZXRlZE9wdGlvbl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKERlcHJlY2F0ZWQpOwotICAgICAgfQotICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF91bmludGVycHJldGVkT3B0aW9uX2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDEgKyAxOwotICAgICAgfQotICAgICAgc2l6ZSArPSB1bmludGVycHJldGVkT3B0aW9uXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF91bmludGVycHJldGVkT3B0aW9uX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShFbnVtVmFsdWVPcHRpb25zIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuRGVwcmVjYXRlZCAhPSBmYWxzZSkgewotICAgICAgICBEZXByZWNhdGVkID0gb3RoZXIuRGVwcmVjYXRlZDsKLSAgICAgIH0KLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZChvdGhlci51bmludGVycHJldGVkT3B0aW9uXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBEZXByZWNhdGVkID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc5OTQ6IHsKLSAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFNlcnZpY2VPcHRpb25zIDogcGI6OklNZXNzYWdlPFNlcnZpY2VPcHRpb25zPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8U2VydmljZU9wdGlvbnM+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8U2VydmljZU9wdGlvbnM+KCgpID0+IG5ldyBTZXJ2aWNlT3B0aW9ucygpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFNlcnZpY2VPcHRpb25zPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5EZXNjcmlwdG9yUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1sxNF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFNlcnZpY2VPcHRpb25zKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBTZXJ2aWNlT3B0aW9ucyhTZXJ2aWNlT3B0aW9ucyBvdGhlcikgOiB0aGlzKCkgewotICAgICAgZGVwcmVjYXRlZF8gPSBvdGhlci5kZXByZWNhdGVkXzsKLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fID0gb3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU2VydmljZU9wdGlvbnMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFNlcnZpY2VPcHRpb25zKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGVwcmVjYXRlZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMzM7Ci0gICAgcHJpdmF0ZSBib29sIGRlcHJlY2F0ZWRfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElzIHRoaXMgc2VydmljZSBkZXByZWNhdGVkPwotICAgIC8vLyAgRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwotICAgIC8vLyAgZm9yIHRoZSBzZXJ2aWNlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCi0gICAgLy8vICB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgc2VydmljZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBEZXByZWNhdGVkIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXByZWNhdGVkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNzk5NCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPiB1bmludGVycHJldGVkT3B0aW9uXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+IFVuaW50ZXJwcmV0ZWRPcHRpb24gewotICAgICAgZ2V0IHsgcmV0dXJuIHVuaW50ZXJwcmV0ZWRPcHRpb25fOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBTZXJ2aWNlT3B0aW9ucyk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFNlcnZpY2VPcHRpb25zIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChEZXByZWNhdGVkICE9IG90aGVyLkRlcHJlY2F0ZWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1bmludGVycHJldGVkT3B0aW9uXy5FcXVhbHMob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIGhhc2ggXj0gRGVwcmVjYXRlZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB1bmludGVycHJldGVkT3B0aW9uXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTM2LCAyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChEZXByZWNhdGVkKTsKLSAgICAgIH0KLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgMTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gdW5pbnRlcnByZXRlZE9wdGlvbl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oU2VydmljZU9wdGlvbnMgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EZXByZWNhdGVkICE9IGZhbHNlKSB7Ci0gICAgICAgIERlcHJlY2F0ZWQgPSBvdGhlci5EZXByZWNhdGVkOwotICAgICAgfQotICAgICAgdW5pbnRlcnByZXRlZE9wdGlvbl8uQWRkKG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDI2NDogewotICAgICAgICAgICAgRGVwcmVjYXRlZCA9IGlucHV0LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA3OTk0OiB7Ci0gICAgICAgICAgICB1bmludGVycHJldGVkT3B0aW9uXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3VuaW50ZXJwcmV0ZWRPcHRpb25fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBNZXRob2RPcHRpb25zIDogcGI6OklNZXNzYWdlPE1ldGhvZE9wdGlvbnM+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxNZXRob2RPcHRpb25zPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE1ldGhvZE9wdGlvbnM+KCgpID0+IG5ldyBNZXRob2RPcHRpb25zKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8TWV0aG9kT3B0aW9ucz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTVdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2RPcHRpb25zKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBNZXRob2RPcHRpb25zKE1ldGhvZE9wdGlvbnMgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGRlcHJlY2F0ZWRfID0gb3RoZXIuZGVwcmVjYXRlZF87Ci0gICAgICB1bmludGVycHJldGVkT3B0aW9uXyA9IG90aGVyLnVuaW50ZXJwcmV0ZWRPcHRpb25fLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZE9wdGlvbnMgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IE1ldGhvZE9wdGlvbnModGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJkZXByZWNhdGVkIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzMzsKLSAgICBwcml2YXRlIGJvb2wgZGVwcmVjYXRlZF87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgSXMgdGhpcyBtZXRob2QgZGVwcmVjYXRlZD8KLSAgICAvLy8gIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKLSAgICAvLy8gIGZvciB0aGUgbWV0aG9kLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCi0gICAgLy8vICB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgbWV0aG9kcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIERlcHJlY2F0ZWQgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlcHJlY2F0ZWRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBkZXByZWNhdGVkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidW5pbnRlcnByZXRlZF9vcHRpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+IF9yZXBlYXRlZF91bmludGVycHJldGVkT3B0aW9uX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSg3OTk0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+IHVuaW50ZXJwcmV0ZWRPcHRpb25fID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbj4gVW5pbnRlcnByZXRlZE9wdGlvbiB7Ci0gICAgICBnZXQgeyByZXR1cm4gdW5pbnRlcnByZXRlZE9wdGlvbl87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE1ldGhvZE9wdGlvbnMpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhNZXRob2RPcHRpb25zIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChEZXByZWNhdGVkICE9IG90aGVyLkRlcHJlY2F0ZWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCF1bmludGVycHJldGVkT3B0aW9uXy5FcXVhbHMob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIGhhc2ggXj0gRGVwcmVjYXRlZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSB1bmludGVycHJldGVkT3B0aW9uXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoRGVwcmVjYXRlZCAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTM2LCAyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChEZXByZWNhdGVkKTsKLSAgICAgIH0KLSAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKERlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAyICsgMTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gdW5pbnRlcnByZXRlZE9wdGlvbl8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTWV0aG9kT3B0aW9ucyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkRlcHJlY2F0ZWQgIT0gZmFsc2UpIHsKLSAgICAgICAgRGVwcmVjYXRlZCA9IG90aGVyLkRlcHJlY2F0ZWQ7Ci0gICAgICB9Ci0gICAgICB1bmludGVycHJldGVkT3B0aW9uXy5BZGQob3RoZXIudW5pbnRlcnByZXRlZE9wdGlvbl8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMjY0OiB7Ci0gICAgICAgICAgICBEZXByZWNhdGVkID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDc5OTQ6IHsKLSAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRPcHRpb25fLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdW5pbnRlcnByZXRlZE9wdGlvbl9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBBIG1lc3NhZ2UgcmVwcmVzZW50aW5nIGEgb3B0aW9uIHRoZSBwYXJzZXIgZG9lcyBub3QgcmVjb2duaXplLiBUaGlzIG9ubHkKLSAgLy8vICBhcHBlYXJzIGluIG9wdGlvbnMgcHJvdG9zIGNyZWF0ZWQgYnkgdGhlIGNvbXBpbGVyOjpQYXJzZXIgY2xhc3MuCi0gIC8vLyAgRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKLSAgLy8vICBvcHRpb25zIHByb3RvcyBpbiBkZXNjcmlwdG9yIG9iamVjdHMgKGUuZy4gcmV0dXJuZWQgYnkgRGVzY3JpcHRvcjo6b3B0aW9ucygpLAotICAvLy8gIG9yIHByb2R1Y2VkIGJ5IERlc2NyaXB0b3I6OkNvcHlUbygpKSB3aWxsIG5ldmVyIGhhdmUgVW5pbnRlcnByZXRlZE9wdGlvbnMKLSAgLy8vICBpbiB0aGVtLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBVbmludGVycHJldGVkT3B0aW9uIDogcGI6OklNZXNzYWdlPFVuaW50ZXJwcmV0ZWRPcHRpb24+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxVbmludGVycHJldGVkT3B0aW9uPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFVuaW50ZXJwcmV0ZWRPcHRpb24+KCgpID0+IG5ldyBVbmludGVycHJldGVkT3B0aW9uKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VW5pbnRlcnByZXRlZE9wdGlvbj4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMTZdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBVbmludGVycHJldGVkT3B0aW9uKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBVbmludGVycHJldGVkT3B0aW9uKFVuaW50ZXJwcmV0ZWRPcHRpb24gb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIG5hbWVfID0gb3RoZXIubmFtZV8uQ2xvbmUoKTsKLSAgICAgIGlkZW50aWZpZXJWYWx1ZV8gPSBvdGhlci5pZGVudGlmaWVyVmFsdWVfOwotICAgICAgcG9zaXRpdmVJbnRWYWx1ZV8gPSBvdGhlci5wb3NpdGl2ZUludFZhbHVlXzsKLSAgICAgIG5lZ2F0aXZlSW50VmFsdWVfID0gb3RoZXIubmVnYXRpdmVJbnRWYWx1ZV87Ci0gICAgICBkb3VibGVWYWx1ZV8gPSBvdGhlci5kb3VibGVWYWx1ZV87Ci0gICAgICBzdHJpbmdWYWx1ZV8gPSBvdGhlci5zdHJpbmdWYWx1ZV87Ci0gICAgICBhZ2dyZWdhdGVWYWx1ZV8gPSBvdGhlci5hZ2dyZWdhdGVWYWx1ZV87Ci0gICAgfQotCi0gICAgcHVibGljIFVuaW50ZXJwcmV0ZWRPcHRpb24gQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFVuaW50ZXJwcmV0ZWRPcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uVW5pbnRlcnByZXRlZE9wdGlvbi5UeXBlcy5OYW1lUGFydD4gX3JlcGVhdGVkX25hbWVfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQuUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQ+IG5hbWVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQ+KCk7Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlVuaW50ZXJwcmV0ZWRPcHRpb24uVHlwZXMuTmFtZVBhcnQ+IE5hbWUgewotICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJpZGVudGlmaWVyX3ZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgaWRlbnRpZmllclZhbHVlXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSB2YWx1ZSBvZiB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24sIGluIHdoYXRldmVyIHR5cGUgdGhlIHRva2VuaXplcgotICAgIC8vLyAgaWRlbnRpZmllZCBpdCBhcyBkdXJpbmcgcGFyc2luZy4gRXhhY3RseSBvbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIHNldC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgSWRlbnRpZmllclZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiBpZGVudGlmaWVyVmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBpZGVudGlmaWVyVmFsdWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicG9zaXRpdmVfaW50X3ZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQb3NpdGl2ZUludFZhbHVlRmllbGROdW1iZXIgPSA0OwotICAgIHByaXZhdGUgdWxvbmcgcG9zaXRpdmVJbnRWYWx1ZV87Ci0gICAgcHVibGljIHVsb25nIFBvc2l0aXZlSW50VmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIHBvc2l0aXZlSW50VmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBwb3NpdGl2ZUludFZhbHVlXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmVnYXRpdmVfaW50X3ZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOZWdhdGl2ZUludFZhbHVlRmllbGROdW1iZXIgPSA1OwotICAgIHByaXZhdGUgbG9uZyBuZWdhdGl2ZUludFZhbHVlXzsKLSAgICBwdWJsaWMgbG9uZyBOZWdhdGl2ZUludFZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiBuZWdhdGl2ZUludFZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmVnYXRpdmVJbnRWYWx1ZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImRvdWJsZV92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRG91YmxlVmFsdWVGaWVsZE51bWJlciA9IDY7Ci0gICAgcHJpdmF0ZSBkb3VibGUgZG91YmxlVmFsdWVfOwotICAgIHB1YmxpYyBkb3VibGUgRG91YmxlVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIGRvdWJsZVZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZG91YmxlVmFsdWVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzdHJpbmdfdmFsdWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN0cmluZ1ZhbHVlRmllbGROdW1iZXIgPSA3OwotICAgIHByaXZhdGUgcGI6OkJ5dGVTdHJpbmcgc3RyaW5nVmFsdWVfID0gcGI6OkJ5dGVTdHJpbmcuRW1wdHk7Ci0gICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIFN0cmluZ1ZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiBzdHJpbmdWYWx1ZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHN0cmluZ1ZhbHVlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImFnZ3JlZ2F0ZV92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQWdncmVnYXRlVmFsdWVGaWVsZE51bWJlciA9IDg7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgYWdncmVnYXRlVmFsdWVfID0gIiI7Ci0gICAgcHVibGljIHN0cmluZyBBZ2dyZWdhdGVWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gYWdncmVnYXRlVmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBhZ2dyZWdhdGVWYWx1ZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBVbmludGVycHJldGVkT3B0aW9uKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVW5pbnRlcnByZXRlZE9wdGlvbiBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZighbmFtZV8uRXF1YWxzKG90aGVyLm5hbWVfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKElkZW50aWZpZXJWYWx1ZSAhPSBvdGhlci5JZGVudGlmaWVyVmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChQb3NpdGl2ZUludFZhbHVlICE9IG90aGVyLlBvc2l0aXZlSW50VmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChOZWdhdGl2ZUludFZhbHVlICE9IG90aGVyLk5lZ2F0aXZlSW50VmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChEb3VibGVWYWx1ZSAhPSBvdGhlci5Eb3VibGVWYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFN0cmluZ1ZhbHVlICE9IG90aGVyLlN0cmluZ1ZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQWdncmVnYXRlVmFsdWUgIT0gb3RoZXIuQWdncmVnYXRlVmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IG5hbWVfLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoSWRlbnRpZmllclZhbHVlLkxlbmd0aCAhPSAwKSBoYXNoIF49IElkZW50aWZpZXJWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFBvc2l0aXZlSW50VmFsdWUgIT0gMFVMKSBoYXNoIF49IFBvc2l0aXZlSW50VmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChOZWdhdGl2ZUludFZhbHVlICE9IDBMKSBoYXNoIF49IE5lZ2F0aXZlSW50VmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChEb3VibGVWYWx1ZSAhPSAwRCkgaGFzaCBePSBEb3VibGVWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFN0cmluZ1ZhbHVlLkxlbmd0aCAhPSAwKSBoYXNoIF49IFN0cmluZ1ZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoQWdncmVnYXRlVmFsdWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gQWdncmVnYXRlVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgbmFtZV8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9uYW1lX2NvZGVjKTsKLSAgICAgIGlmIChJZGVudGlmaWVyVmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKElkZW50aWZpZXJWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoUG9zaXRpdmVJbnRWYWx1ZSAhPSAwVUwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDMyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlVUludDY0KFBvc2l0aXZlSW50VmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKE5lZ2F0aXZlSW50VmFsdWUgIT0gMEwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoTmVnYXRpdmVJbnRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoRG91YmxlVmFsdWUgIT0gMEQpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQ5KTsKLSAgICAgICAgb3V0cHV0LldyaXRlRG91YmxlKERvdWJsZVZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChTdHJpbmdWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTgpOwotICAgICAgICBvdXRwdXQuV3JpdGVCeXRlcyhTdHJpbmdWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoQWdncmVnYXRlVmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDY2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKEFnZ3JlZ2F0ZVZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBzaXplICs9IG5hbWVfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX25hbWVfY29kZWMpOwotICAgICAgaWYgKElkZW50aWZpZXJWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoSWRlbnRpZmllclZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChQb3NpdGl2ZUludFZhbHVlICE9IDBVTCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUoUG9zaXRpdmVJbnRWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoTmVnYXRpdmVJbnRWYWx1ZSAhPSAwTCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDY0U2l6ZShOZWdhdGl2ZUludFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChEb3VibGVWYWx1ZSAhPSAwRCkgewotICAgICAgICBzaXplICs9IDEgKyA4OwotICAgICAgfQotICAgICAgaWYgKFN0cmluZ1ZhbHVlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlQnl0ZXNTaXplKFN0cmluZ1ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChBZ2dyZWdhdGVWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoQWdncmVnYXRlVmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFVuaW50ZXJwcmV0ZWRPcHRpb24gb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG5hbWVfLkFkZChvdGhlci5uYW1lXyk7Ci0gICAgICBpZiAob3RoZXIuSWRlbnRpZmllclZhbHVlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIElkZW50aWZpZXJWYWx1ZSA9IG90aGVyLklkZW50aWZpZXJWYWx1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5Qb3NpdGl2ZUludFZhbHVlICE9IDBVTCkgewotICAgICAgICBQb3NpdGl2ZUludFZhbHVlID0gb3RoZXIuUG9zaXRpdmVJbnRWYWx1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OZWdhdGl2ZUludFZhbHVlICE9IDBMKSB7Ci0gICAgICAgIE5lZ2F0aXZlSW50VmFsdWUgPSBvdGhlci5OZWdhdGl2ZUludFZhbHVlOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkRvdWJsZVZhbHVlICE9IDBEKSB7Ci0gICAgICAgIERvdWJsZVZhbHVlID0gb3RoZXIuRG91YmxlVmFsdWU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU3RyaW5nVmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgU3RyaW5nVmFsdWUgPSBvdGhlci5TdHJpbmdWYWx1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5BZ2dyZWdhdGVWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBBZ2dyZWdhdGVWYWx1ZSA9IG90aGVyLkFnZ3JlZ2F0ZVZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIG5hbWVfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfbmFtZV9jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjogewotICAgICAgICAgICAgSWRlbnRpZmllclZhbHVlID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzI6IHsKLSAgICAgICAgICAgIFBvc2l0aXZlSW50VmFsdWUgPSBpbnB1dC5SZWFkVUludDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MDogewotICAgICAgICAgICAgTmVnYXRpdmVJbnRWYWx1ZSA9IGlucHV0LlJlYWRJbnQ2NCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDk6IHsKLSAgICAgICAgICAgIERvdWJsZVZhbHVlID0gaW5wdXQuUmVhZERvdWJsZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTg6IHsKLSAgICAgICAgICAgIFN0cmluZ1ZhbHVlID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA2NjogewotICAgICAgICAgICAgQWdncmVnYXRlVmFsdWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAjcmVnaW9uIE5lc3RlZCB0eXBlcwotICAgIC8vLyA8c3VtbWFyeT5Db250YWluZXIgZm9yIG5lc3RlZCB0eXBlcyBkZWNsYXJlZCBpbiB0aGUgVW5pbnRlcnByZXRlZE9wdGlvbiBtZXNzYWdlIHR5cGUuPC9zdW1tYXJ5PgotICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsKLSAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgIC8vLyAgVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uLiAgRWFjaCBzdHJpbmcgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4KLSAgICAgIC8vLyAgYSBkb3Qtc2VwYXJhdGVkIG5hbWUuICBpc19leHRlbnNpb24gaXMgdHJ1ZSBpZmYgYSBzZWdtZW50IHJlcHJlc2VudHMgYW4KLSAgICAgIC8vLyAgZXh0ZW5zaW9uIChkZW5vdGVkIHdpdGggcGFyZW50aGVzZXMgaW4gb3B0aW9ucyBzcGVjcyBpbiAucHJvdG8gZmlsZXMpLgotICAgICAgLy8vICBFLmcuLHsgWyJmb28iLCBmYWxzZV0sIFsiYmFyLmJheiIsIHRydWVdLCBbInF1eCIsIGZhbHNlXSB9IHJlcHJlc2VudHMKLSAgICAgIC8vLyAgImZvby4oYmFyLmJheikucXV4Ii4KLSAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICAgICAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTmFtZVBhcnQgOiBwYjo6SU1lc3NhZ2U8TmFtZVBhcnQ+IHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8TmFtZVBhcnQ+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8TmFtZVBhcnQ+KCgpID0+IG5ldyBOYW1lUGFydCgpKTsKLSAgICAgICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxOYW1lUGFydD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5VbmludGVycHJldGVkT3B0aW9uLkRlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07IH0KLSAgICAgICAgfQotCi0gICAgICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTmFtZVBhcnQoKSB7Ci0gICAgICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgICAgIHB1YmxpYyBOYW1lUGFydChOYW1lUGFydCBvdGhlcikgOiB0aGlzKCkgewotICAgICAgICAgIG5hbWVQYXJ0XyA9IG90aGVyLm5hbWVQYXJ0XzsKLSAgICAgICAgICBpc0V4dGVuc2lvbl8gPSBvdGhlci5pc0V4dGVuc2lvbl87Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTmFtZVBhcnQgQ2xvbmUoKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBOYW1lUGFydCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZV9wYXJ0IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZVBhcnRfRmllbGROdW1iZXIgPSAxOwotICAgICAgICBwcml2YXRlIHN0cmluZyBuYW1lUGFydF8gPSAiIjsKLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lUGFydF8gewotICAgICAgICAgIGdldCB7IHJldHVybiBuYW1lUGFydF87IH0KLSAgICAgICAgICBzZXQgewotICAgICAgICAgICAgbmFtZVBhcnRfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiaXNfZXh0ZW5zaW9uIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgSXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDI7Ci0gICAgICAgIHByaXZhdGUgYm9vbCBpc0V4dGVuc2lvbl87Ci0gICAgICAgIHB1YmxpYyBib29sIElzRXh0ZW5zaW9uIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gaXNFeHRlbnNpb25fOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIGlzRXh0ZW5zaW9uXyA9IHZhbHVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE5hbWVQYXJ0KTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEVxdWFscyhOYW1lUGFydCBvdGhlcikgewotICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKE5hbWVQYXJ0XyAhPSBvdGhlci5OYW1lUGFydF8pIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBpZiAoSXNFeHRlbnNpb24gIT0gb3RoZXIuSXNFeHRlbnNpb24pIHJldHVybiBmYWxzZTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgICAgIGlmIChOYW1lUGFydF8uTGVuZ3RoICE9IDApIGhhc2ggXj0gTmFtZVBhcnRfLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgICAgaWYgKElzRXh0ZW5zaW9uICE9IGZhbHNlKSBoYXNoIF49IElzRXh0ZW5zaW9uLkdldEhhc2hDb2RlKCk7Ci0gICAgICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgICAgICBpZiAoTmFtZVBhcnRfLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKE5hbWVQYXJ0Xyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChJc0V4dGVuc2lvbiAhPSBmYWxzZSkgewotICAgICAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2KTsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZUJvb2woSXNFeHRlbnNpb24pOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgaWYgKE5hbWVQYXJ0Xy5MZW5ndGggIT0gMCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE5hbWVQYXJ0Xyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChJc0V4dGVuc2lvbiAhPSBmYWxzZSkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTmFtZVBhcnQgb3RoZXIpIHsKLSAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAob3RoZXIuTmFtZVBhcnRfLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICBOYW1lUGFydF8gPSBvdGhlci5OYW1lUGFydF87Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChvdGhlci5Jc0V4dGVuc2lvbiAhPSBmYWxzZSkgewotICAgICAgICAgICAgSXNFeHRlbnNpb24gPSBvdGhlci5Jc0V4dGVuc2lvbjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgICAgICB1aW50IHRhZzsKLSAgICAgICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgICAgIE5hbWVQYXJ0XyA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICAgICAgSXNFeHRlbnNpb24gPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0KLQotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBFbmNhcHN1bGF0ZXMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsIHNvdXJjZSBmaWxlIGZyb20gd2hpY2ggYQotICAvLy8gIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGdlbmVyYXRlZC4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgaW50ZXJuYWwgc2VhbGVkIHBhcnRpYWwgY2xhc3MgU291cmNlQ29kZUluZm8gOiBwYjo6SU1lc3NhZ2U8U291cmNlQ29kZUluZm8+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxTb3VyY2VDb2RlSW5mbz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxTb3VyY2VDb2RlSW5mbz4oKCkgPT4gbmV3IFNvdXJjZUNvZGVJbmZvKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8U291cmNlQ29kZUluZm8+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkRlc2NyaXB0b3JSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzE3XTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlQ29kZUluZm8oKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFNvdXJjZUNvZGVJbmZvKFNvdXJjZUNvZGVJbmZvIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBsb2NhdGlvbl8gPSBvdGhlci5sb2NhdGlvbl8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlQ29kZUluZm8gQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFNvdXJjZUNvZGVJbmZvKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibG9jYXRpb24iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IExvY2F0aW9uRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24+IF9yZXBlYXRlZF9sb2NhdGlvbl9jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTAsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNvdXJjZUNvZGVJbmZvLlR5cGVzLkxvY2F0aW9uPiBsb2NhdGlvbl8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uU291cmNlQ29kZUluZm8uVHlwZXMuTG9jYXRpb24+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgQSBMb2NhdGlvbiBpZGVudGlmaWVzIGEgcGllY2Ugb2Ygc291cmNlIGNvZGUgaW4gYSAucHJvdG8gZmlsZSB3aGljaAotICAgIC8vLyAgY29ycmVzcG9uZHMgdG8gYSBwYXJ0aWN1bGFyIGRlZmluaXRpb24uICBUaGlzIGluZm9ybWF0aW9uIGlzIGludGVuZGVkCi0gICAgLy8vICB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgotICAgIC8vLyAgdG9vbHMuCi0gICAgLy8vCi0gICAgLy8vICBGb3IgZXhhbXBsZSwgc2F5IHdlIGhhdmUgYSBmaWxlIGxpa2U6Ci0gICAgLy8vICAgIG1lc3NhZ2UgRm9vIHsKLSAgICAvLy8gICAgICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMTsKLSAgICAvLy8gICAgfQotICAgIC8vLyAgTGV0J3MgbG9vayBhdCBqdXN0IHRoZSBmaWVsZCBkZWZpbml0aW9uOgotICAgIC8vLyAgICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMTsKLSAgICAvLy8gICAgXiAgICAgICBeXiAgICAgXl4gIF4gIF5eXgotICAgIC8vLyAgICBhICAgICAgIGJjICAgICBkZSAgZiAgZ2hpCi0gICAgLy8vICBXZSBoYXZlIHRoZSBmb2xsb3dpbmcgbG9jYXRpb25zOgotICAgIC8vLyAgICBzcGFuICAgcGF0aCAgICAgICAgICAgICAgIHJlcHJlc2VudHMKLSAgICAvLy8gICAgW2EsaSkgIFsgNCwgMCwgMiwgMCBdICAgICBUaGUgd2hvbGUgZmllbGQgZGVmaW5pdGlvbi4KLSAgICAvLy8gICAgW2EsYikgIFsgNCwgMCwgMiwgMCwgNCBdICBUaGUgbGFiZWwgKG9wdGlvbmFsKS4KLSAgICAvLy8gICAgW2MsZCkgIFsgNCwgMCwgMiwgMCwgNSBdICBUaGUgdHlwZSAoc3RyaW5nKS4KLSAgICAvLy8gICAgW2UsZikgIFsgNCwgMCwgMiwgMCwgMSBdICBUaGUgbmFtZSAoZm9vKS4KLSAgICAvLy8gICAgW2csaCkgIFsgNCwgMCwgMiwgMCwgMyBdICBUaGUgbnVtYmVyICgxKS4KLSAgICAvLy8KLSAgICAvLy8gIE5vdGVzOgotICAgIC8vLyAgLSBBIGxvY2F0aW9uIG1heSByZWZlciB0byBhIHJlcGVhdGVkIGZpZWxkIGl0c2VsZiAoaS5lLiBub3QgdG8gYW55Ci0gICAgLy8vICAgIHBhcnRpY3VsYXIgaW5kZXggd2l0aGluIGl0KS4gIFRoaXMgaXMgdXNlZCB3aGVuZXZlciBhIHNldCBvZiBlbGVtZW50cyBhcmUKLSAgICAvLy8gICAgbG9naWNhbGx5IGVuY2xvc2VkIGluIGEgc2luZ2xlIGNvZGUgc2VnbWVudC4gIEZvciBleGFtcGxlLCBhbiBlbnRpcmUKLSAgICAvLy8gICAgZXh0ZW5kIGJsb2NrIChwb3NzaWJseSBjb250YWluaW5nIG11bHRpcGxlIGV4dGVuc2lvbiBkZWZpbml0aW9ucykgd2lsbAotICAgIC8vLyAgICBoYXZlIGFuIG91dGVyIGxvY2F0aW9uIHdob3NlIHBhdGggcmVmZXJzIHRvIHRoZSAiZXh0ZW5zaW9ucyIgcmVwZWF0ZWQKLSAgICAvLy8gICAgZmllbGQgd2l0aG91dCBhbiBpbmRleC4KLSAgICAvLy8gIC0gTXVsdGlwbGUgbG9jYXRpb25zIG1heSBoYXZlIHRoZSBzYW1lIHBhdGguICBUaGlzIGhhcHBlbnMgd2hlbiBhIHNpbmdsZQotICAgIC8vLyAgICBsb2dpY2FsIGRlY2xhcmF0aW9uIGlzIHNwcmVhZCBvdXQgYWNyb3NzIG11bHRpcGxlIHBsYWNlcy4gIFRoZSBtb3N0Ci0gICAgLy8vICAgIG9idmlvdXMgZXhhbXBsZSBpcyB0aGUgImV4dGVuZCIgYmxvY2sgYWdhaW4gLS0gdGhlcmUgbWF5IGJlIG11bHRpcGxlCi0gICAgLy8vICAgIGV4dGVuZCBibG9ja3MgaW4gdGhlIHNhbWUgc2NvcGUsIGVhY2ggb2Ygd2hpY2ggd2lsbCBoYXZlIHRoZSBzYW1lIHBhdGguCi0gICAgLy8vICAtIEEgbG9jYXRpb24ncyBzcGFuIGlzIG5vdCBhbHdheXMgYSBzdWJzZXQgb2YgaXRzIHBhcmVudCdzIHNwYW4uICBGb3IKLSAgICAvLy8gICAgZXhhbXBsZSwgdGhlICJleHRlbmRlZSIgb2YgYW4gZXh0ZW5zaW9uIGRlY2xhcmF0aW9uIGFwcGVhcnMgYXQgdGhlCi0gICAgLy8vICAgIGJlZ2lubmluZyBvZiB0aGUgImV4dGVuZCIgYmxvY2sgYW5kIGlzIHNoYXJlZCBieSBhbGwgZXh0ZW5zaW9ucyB3aXRoaW4KLSAgICAvLy8gICAgdGhlIGJsb2NrLgotICAgIC8vLyAgLSBKdXN0IGJlY2F1c2UgYSBsb2NhdGlvbidzIHNwYW4gaXMgYSBzdWJzZXQgb2Ygc29tZSBvdGhlciBsb2NhdGlvbidzIHNwYW4KLSAgICAvLy8gICAgZG9lcyBub3QgbWVhbiB0aGF0IGl0IGlzIGEgZGVzY2VuZGVudC4gIEZvciBleGFtcGxlLCBhICJncm91cCIgZGVmaW5lcwotICAgIC8vLyAgICBib3RoIGEgdHlwZSBhbmQgYSBmaWVsZCBpbiBhIHNpbmdsZSBkZWNsYXJhdGlvbi4gIFRodXMsIHRoZSBsb2NhdGlvbnMKLSAgICAvLy8gICAgY29ycmVzcG9uZGluZyB0byB0aGUgdHlwZSBhbmQgZmllbGQgYW5kIHRoZWlyIGNvbXBvbmVudHMgd2lsbCBvdmVybGFwLgotICAgIC8vLyAgLSBDb2RlIHdoaWNoIHRyaWVzIHRvIGludGVycHJldCBsb2NhdGlvbnMgc2hvdWxkIHByb2JhYmx5IGJlIGRlc2lnbmVkIHRvCi0gICAgLy8vICAgIGlnbm9yZSB0aG9zZSB0aGF0IGl0IGRvZXNuJ3QgdW5kZXJzdGFuZCwgYXMgbW9yZSB0eXBlcyBvZiBsb2NhdGlvbnMgY291bGQKLSAgICAvLy8gICAgYmUgcmVjb3JkZWQgaW4gdGhlIGZ1dHVyZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5Tb3VyY2VDb2RlSW5mby5UeXBlcy5Mb2NhdGlvbj4gTG9jYXRpb24gewotICAgICAgZ2V0IHsgcmV0dXJuIGxvY2F0aW9uXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgU291cmNlQ29kZUluZm8pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhTb3VyY2VDb2RlSW5mbyBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZighbG9jYXRpb25fLkVxdWFscyhvdGhlci5sb2NhdGlvbl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaGFzaCBePSBsb2NhdGlvbl8uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgbG9jYXRpb25fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfbG9jYXRpb25fY29kZWMpOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHNpemUgKz0gbG9jYXRpb25fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX2xvY2F0aW9uX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShTb3VyY2VDb2RlSW5mbyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgbG9jYXRpb25fLkFkZChvdGhlci5sb2NhdGlvbl8pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIGxvY2F0aW9uXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX2xvY2F0aW9uX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgICNyZWdpb24gTmVzdGVkIHR5cGVzCi0gICAgLy8vIDxzdW1tYXJ5PkNvbnRhaW5lciBmb3IgbmVzdGVkIHR5cGVzIGRlY2xhcmVkIGluIHRoZSBTb3VyY2VDb2RlSW5mbyBtZXNzYWdlIHR5cGUuPC9zdW1tYXJ5PgotICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFR5cGVzIHsKLSAgICAgIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gICAgICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBMb2NhdGlvbiA6IHBiOjpJTWVzc2FnZTxMb2NhdGlvbj4gewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxMb2NhdGlvbj4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxMb2NhdGlvbj4oKCkgPT4gbmV3IExvY2F0aW9uKCkpOwotICAgICAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPExvY2F0aW9uPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICAgICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLlNvdXJjZUNvZGVJbmZvLkRlc2NyaXB0b3IuTmVzdGVkVHlwZXNbMF07IH0KLSAgICAgICAgfQotCi0gICAgICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgTG9jYXRpb24oKSB7Ci0gICAgICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICAgICAgfQotCi0gICAgICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgICAgIHB1YmxpYyBMb2NhdGlvbihMb2NhdGlvbiBvdGhlcikgOiB0aGlzKCkgewotICAgICAgICAgIHBhdGhfID0gb3RoZXIucGF0aF8uQ2xvbmUoKTsKLSAgICAgICAgICBzcGFuXyA9IG90aGVyLnNwYW5fLkNsb25lKCk7Ci0gICAgICAgICAgbGVhZGluZ0NvbW1lbnRzXyA9IG90aGVyLmxlYWRpbmdDb21tZW50c187Ci0gICAgICAgICAgdHJhaWxpbmdDb21tZW50c18gPSBvdGhlci50cmFpbGluZ0NvbW1lbnRzXzsKLSAgICAgICAgICBsZWFkaW5nRGV0YWNoZWRDb21tZW50c18gPSBvdGhlci5sZWFkaW5nRGV0YWNoZWRDb21tZW50c18uQ2xvbmUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBMb2NhdGlvbiBDbG9uZSgpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IExvY2F0aW9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYXRoIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgUGF0aEZpZWxkTnVtYmVyID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8aW50PiBfcmVwZWF0ZWRfcGF0aF9jb2RlYwotICAgICAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMigxMCk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcGF0aF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIElkZW50aWZpZXMgd2hpY2ggcGFydCBvZiB0aGUgRmlsZURlc2NyaXB0b3JQcm90byB3YXMgZGVmaW5lZCBhdCB0aGlzCi0gICAgICAgIC8vLyAgbG9jYXRpb24uCi0gICAgICAgIC8vLwotICAgICAgICAvLy8gIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQotICAgICAgICAvLy8gIHRoZSByb290IEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSBkZWZpbml0aW9uLiAgRm9yCi0gICAgICAgIC8vLyAgZXhhbXBsZSwgdGhpcyBwYXRoOgotICAgICAgICAvLy8gICAgWyA0LCAzLCAyLCA3LCAxIF0KLSAgICAgICAgLy8vICByZWZlcnMgdG86Ci0gICAgICAgIC8vLyAgICBmaWxlLm1lc3NhZ2VfdHlwZSgzKSAgLy8gNCwgMwotICAgICAgICAvLy8gICAgICAgIC5maWVsZCg3KSAgICAgICAgIC8vIDIsIDcKLSAgICAgICAgLy8vICAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCi0gICAgICAgIC8vLyAgVGhpcyBpcyBiZWNhdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlIGhhcyBmaWVsZCBudW1iZXIgNDoKLSAgICAgICAgLy8vICAgIHJlcGVhdGVkIERlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OwotICAgICAgICAvLy8gIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgotICAgICAgICAvLy8gICAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOwotICAgICAgICAvLy8gIGFuZCBGaWVsZERlc2NyaXB0b3JQcm90by5uYW1lIGhhcyBmaWVsZCBudW1iZXIgMToKLSAgICAgICAgLy8vICAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICAgICAgLy8vCi0gICAgICAgIC8vLyAgVGh1cywgdGhlIGFib3ZlIHBhdGggZ2l2ZXMgdGhlIGxvY2F0aW9uIG9mIGEgZmllbGQgbmFtZS4gIElmIHdlIHJlbW92ZWQKLSAgICAgICAgLy8vICB0aGUgbGFzdCBlbGVtZW50OgotICAgICAgICAvLy8gICAgWyA0LCAzLCAyLCA3IF0KLSAgICAgICAgLy8vICB0aGlzIHBhdGggcmVmZXJzIHRvIHRoZSB3aG9sZSBmaWVsZCBkZWNsYXJhdGlvbiAoZnJvbSB0aGUgYmVnaW5uaW5nCi0gICAgICAgIC8vLyAgb2YgdGhlIGxhYmVsIHRvIHRoZSB0ZXJtaW5hdGluZyBzZW1pY29sb24pLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gUGF0aCB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIHBhdGhfOyB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNwYW4iIGZpZWxkLjwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNvbnN0IGludCBTcGFuRmllbGROdW1iZXIgPSAyOwotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxpbnQ+IF9yZXBlYXRlZF9zcGFuX2NvZGVjCi0gICAgICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvckludDMyKDE4KTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PiBzcGFuXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8aW50PigpOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgQWx3YXlzIGhhcyBleGFjdGx5IHRocmVlIG9yIGZvdXIgZWxlbWVudHM6IHN0YXJ0IGxpbmUsIHN0YXJ0IGNvbHVtbiwKLSAgICAgICAgLy8vICBlbmQgbGluZSAob3B0aW9uYWwsIG90aGVyd2lzZSBhc3N1bWVkIHNhbWUgYXMgc3RhcnQgbGluZSksIGVuZCBjb2x1bW4uCi0gICAgICAgIC8vLyAgVGhlc2UgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIGZpZWxkIGZvciBlZmZpY2llbmN5LiAgTm90ZSB0aGF0IGxpbmUKLSAgICAgICAgLy8vICBhbmQgY29sdW1uIG51bWJlcnMgYXJlIHplcm8tYmFzZWQgLS0gdHlwaWNhbGx5IHlvdSB3aWxsIHdhbnQgdG8gYWRkCi0gICAgICAgIC8vLyAgMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxpbnQ+IFNwYW4gewotICAgICAgICAgIGdldCB7IHJldHVybiBzcGFuXzsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJsZWFkaW5nX2NvbW1lbnRzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTGVhZGluZ0NvbW1lbnRzRmllbGROdW1iZXIgPSAzOwotICAgICAgICBwcml2YXRlIHN0cmluZyBsZWFkaW5nQ29tbWVudHNfID0gIiI7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBJZiB0aGlzIFNvdXJjZUNvZGVJbmZvIHJlcHJlc2VudHMgYSBjb21wbGV0ZSBkZWNsYXJhdGlvbiwgdGhlc2UgYXJlIGFueQotICAgICAgICAvLy8gIGNvbW1lbnRzIGFwcGVhcmluZyBiZWZvcmUgYW5kIGFmdGVyIHRoZSBkZWNsYXJhdGlvbiB3aGljaCBhcHBlYXIgdG8gYmUKLSAgICAgICAgLy8vICBhdHRhY2hlZCB0byB0aGUgZGVjbGFyYXRpb24uCi0gICAgICAgIC8vLwotICAgICAgICAvLy8gIEEgc2VyaWVzIG9mIGxpbmUgY29tbWVudHMgYXBwZWFyaW5nIG9uIGNvbnNlY3V0aXZlIGxpbmVzLCB3aXRoIG5vIG90aGVyCi0gICAgICAgIC8vLyAgdG9rZW5zIGFwcGVhcmluZyBvbiB0aG9zZSBsaW5lcywgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIGNvbW1lbnQuCi0gICAgICAgIC8vLwotICAgICAgICAvLy8gIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgd2lsbCBrZWVwIHBhcmFncmFwaHMgb2YgY29tbWVudHMgdGhhdCBhcHBlYXIKLSAgICAgICAgLy8vICBiZWZvcmUgKGJ1dCBub3QgY29ubmVjdGVkIHRvKSB0aGUgY3VycmVudCBlbGVtZW50LiBFYWNoIHBhcmFncmFwaCwKLSAgICAgICAgLy8vICBzZXBhcmF0ZWQgYnkgZW1wdHkgbGluZXMsIHdpbGwgYmUgb25lIGNvbW1lbnQgZWxlbWVudCBpbiB0aGUgcmVwZWF0ZWQKLSAgICAgICAgLy8vICBmaWVsZC4KLSAgICAgICAgLy8vCi0gICAgICAgIC8vLyAgT25seSB0aGUgY29tbWVudCBjb250ZW50IGlzIHByb3ZpZGVkOyBjb21tZW50IG1hcmtlcnMgKGUuZy4gLy8pIGFyZQotICAgICAgICAvLy8gIHN0cmlwcGVkIG91dC4gIEZvciBibG9jayBjb21tZW50cywgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBhbiBhc3RlcmlzawotICAgICAgICAvLy8gIHdpbGwgYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4KLSAgICAgICAgLy8vICBOZXdsaW5lcyBhcmUgaW5jbHVkZWQgaW4gdGhlIG91dHB1dC4KLSAgICAgICAgLy8vCi0gICAgICAgIC8vLyAgRXhhbXBsZXM6Ci0gICAgICAgIC8vLwotICAgICAgICAvLy8gICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gZm9vLgotICAgICAgICAvLy8gICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCi0gICAgICAgIC8vLyAgICBvcHRpb25hbCBpbnQzMiBiYXIgPSAyOwotICAgICAgICAvLy8KLSAgICAgICAgLy8vICAgIG9wdGlvbmFsIHN0cmluZyBiYXogPSAzOwotICAgICAgICAvLy8gICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXouCi0gICAgICAgIC8vLyAgICAvLyBBbm90aGVyIGxpbmUgYXR0YWNoZWQgdG8gYmF6LgotICAgICAgICAvLy8KLSAgICAgICAgLy8vICAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gcXV4LgotICAgICAgICAvLy8gICAgLy8KLSAgICAgICAgLy8vICAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBxdXguCi0gICAgICAgIC8vLyAgICBvcHRpb25hbCBkb3VibGUgcXV4ID0gNDsKLSAgICAgICAgLy8vCi0gICAgICAgIC8vLyAgICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZS4gVGhpcyBpcyBub3QgbGVhZGluZyBvciB0cmFpbGluZyBjb21tZW50cwotICAgICAgICAvLy8gICAgLy8gdG8gcXV4IG9yIGNvcmdlIGJlY2F1c2UgdGhlcmUgYXJlIGJsYW5rIGxpbmVzIHNlcGFyYXRpbmcgaXQgZnJvbQotICAgICAgICAvLy8gICAgLy8gYm90aC4KLSAgICAgICAgLy8vCi0gICAgICAgIC8vLyAgICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZSBwYXJhZ3JhcGggMi4KLSAgICAgICAgLy8vCi0gICAgICAgIC8vLyAgICBvcHRpb25hbCBzdHJpbmcgY29yZ2UgPSA1OwotICAgICAgICAvLy8gICAgLyogQmxvY2sgY29tbWVudCBhdHRhY2hlZAotICAgICAgICAvLy8gICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcwotICAgICAgICAvLy8gICAgICogd2lsbCBiZSByZW1vdmVkLiAqLwotICAgICAgICAvLy8gICAgLyogQmxvY2sgY29tbWVudCBhdHRhY2hlZCB0bwotICAgICAgICAvLy8gICAgICogZ3JhdWx0LiAqLwotICAgICAgICAvLy8gICAgb3B0aW9uYWwgaW50MzIgZ3JhdWx0ID0gNjsKLSAgICAgICAgLy8vCi0gICAgICAgIC8vLyAgICAvLyBpZ25vcmVkIGRldGFjaGVkIGNvbW1lbnRzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIExlYWRpbmdDb21tZW50cyB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIGxlYWRpbmdDb21tZW50c187IH0KLSAgICAgICAgICBzZXQgewotICAgICAgICAgICAgbGVhZGluZ0NvbW1lbnRzXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInRyYWlsaW5nX2NvbW1lbnRzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgVHJhaWxpbmdDb21tZW50c0ZpZWxkTnVtYmVyID0gNDsKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgdHJhaWxpbmdDb21tZW50c18gPSAiIjsKLSAgICAgICAgcHVibGljIHN0cmluZyBUcmFpbGluZ0NvbW1lbnRzIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gdHJhaWxpbmdDb21tZW50c187IH0KLSAgICAgICAgICBzZXQgewotICAgICAgICAgICAgdHJhaWxpbmdDb21tZW50c18gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTGVhZGluZ0RldGFjaGVkQ29tbWVudHNGaWVsZE51bWJlciA9IDY7Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPHN0cmluZz4gX3JlcGVhdGVkX2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzX2NvZGVjCi0gICAgICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cmluZyg1MCk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4gbGVhZGluZ0RldGFjaGVkQ29tbWVudHNfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+KCk7Ci0gICAgICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBMZWFkaW5nRGV0YWNoZWRDb21tZW50cyB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIGxlYWRpbmdEZXRhY2hlZENvbW1lbnRzXzsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgTG9jYXRpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIGJvb2wgRXF1YWxzKExvY2F0aW9uIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZighcGF0aF8uRXF1YWxzKG90aGVyLnBhdGhfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlmKCFzcGFuXy5FcXVhbHMob3RoZXIuc3Bhbl8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgaWYgKExlYWRpbmdDb21tZW50cyAhPSBvdGhlci5MZWFkaW5nQ29tbWVudHMpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBpZiAoVHJhaWxpbmdDb21tZW50cyAhPSBvdGhlci5UcmFpbGluZ0NvbW1lbnRzKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgaWYoIWxlYWRpbmdEZXRhY2hlZENvbW1lbnRzXy5FcXVhbHMob3RoZXIubGVhZGluZ0RldGFjaGVkQ29tbWVudHNfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICAgICAgaGFzaCBePSBwYXRoXy5HZXRIYXNoQ29kZSgpOwotICAgICAgICAgIGhhc2ggXj0gc3Bhbl8uR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICBpZiAoTGVhZGluZ0NvbW1lbnRzLkxlbmd0aCAhPSAwKSBoYXNoIF49IExlYWRpbmdDb21tZW50cy5HZXRIYXNoQ29kZSgpOwotICAgICAgICAgIGlmIChUcmFpbGluZ0NvbW1lbnRzLkxlbmd0aCAhPSAwKSBoYXNoIF49IFRyYWlsaW5nQ29tbWVudHMuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICBoYXNoIF49IGxlYWRpbmdEZXRhY2hlZENvbW1lbnRzXy5HZXRIYXNoQ29kZSgpOwotICAgICAgICAgIHJldHVybiBoYXNoOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICAgICAgcGF0aF8uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9wYXRoX2NvZGVjKTsKLSAgICAgICAgICBzcGFuXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3NwYW5fY29kZWMpOwotICAgICAgICAgIGlmIChMZWFkaW5nQ29tbWVudHMuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNik7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTGVhZGluZ0NvbW1lbnRzKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFRyYWlsaW5nQ29tbWVudHMuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzNCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoVHJhaWxpbmdDb21tZW50cyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxlYWRpbmdEZXRhY2hlZENvbW1lbnRzXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzX2NvZGVjKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgc2l6ZSArPSBwYXRoXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9wYXRoX2NvZGVjKTsKLSAgICAgICAgICBzaXplICs9IHNwYW5fLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3NwYW5fY29kZWMpOwotICAgICAgICAgIGlmIChMZWFkaW5nQ29tbWVudHMuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShMZWFkaW5nQ29tbWVudHMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoVHJhaWxpbmdDb21tZW50cy5MZW5ndGggIT0gMCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFRyYWlsaW5nQ29tbWVudHMpOwotICAgICAgICAgIH0KLSAgICAgICAgICBzaXplICs9IGxlYWRpbmdEZXRhY2hlZENvbW1lbnRzXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9sZWFkaW5nRGV0YWNoZWRDb21tZW50c19jb2RlYyk7Ci0gICAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTG9jYXRpb24gb3RoZXIpIHsKLSAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBwYXRoXy5BZGQob3RoZXIucGF0aF8pOwotICAgICAgICAgIHNwYW5fLkFkZChvdGhlci5zcGFuXyk7Ci0gICAgICAgICAgaWYgKG90aGVyLkxlYWRpbmdDb21tZW50cy5MZW5ndGggIT0gMCkgewotICAgICAgICAgICAgTGVhZGluZ0NvbW1lbnRzID0gb3RoZXIuTGVhZGluZ0NvbW1lbnRzOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAob3RoZXIuVHJhaWxpbmdDb21tZW50cy5MZW5ndGggIT0gMCkgewotICAgICAgICAgICAgVHJhaWxpbmdDb21tZW50cyA9IG90aGVyLlRyYWlsaW5nQ29tbWVudHM7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxlYWRpbmdEZXRhY2hlZENvbW1lbnRzXy5BZGQob3RoZXIubGVhZGluZ0RldGFjaGVkQ29tbWVudHNfKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICBwYXRoXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhdGhfY29kZWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMTg6Ci0gICAgICAgICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgICAgICAgICBzcGFuXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3NwYW5fY29kZWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgICAgICBMZWFkaW5nQ29tbWVudHMgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgICAgIFRyYWlsaW5nQ29tbWVudHMgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgY2FzZSA1MDogewotICAgICAgICAgICAgICAgIGxlYWRpbmdEZXRhY2hlZENvbW1lbnRzXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX2xlYWRpbmdEZXRhY2hlZENvbW1lbnRzX2NvZGVjKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgRGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBnZW5lcmF0ZWQgY29kZSBhbmQgaXRzIG9yaWdpbmFsIHNvdXJjZQotICAvLy8gIGZpbGUuIEEgR2VuZXJhdGVkQ29kZUluZm8gbWVzc2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggb25seSBvbmUgZ2VuZXJhdGVkCi0gIC8vLyAgc291cmNlIGZpbGUsIGJ1dCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIGRpZmZlcmVudCBzb3VyY2UgLnByb3RvIGZpbGVzLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBpbnRlcm5hbCBzZWFsZWQgcGFydGlhbCBjbGFzcyBHZW5lcmF0ZWRDb2RlSW5mbyA6IHBiOjpJTWVzc2FnZTxHZW5lcmF0ZWRDb2RlSW5mbz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEdlbmVyYXRlZENvZGVJbmZvPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEdlbmVyYXRlZENvZGVJbmZvPigoKSA9PiBuZXcgR2VuZXJhdGVkQ29kZUluZm8oKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxHZW5lcmF0ZWRDb2RlSW5mbz4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uRGVzY3JpcHRvclJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMThdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBHZW5lcmF0ZWRDb2RlSW5mbygpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgR2VuZXJhdGVkQ29kZUluZm8oR2VuZXJhdGVkQ29kZUluZm8gb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGFubm90YXRpb25fID0gb3RoZXIuYW5ub3RhdGlvbl8uQ2xvbmUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgR2VuZXJhdGVkQ29kZUluZm8gQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEdlbmVyYXRlZENvZGVJbmZvKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiYW5ub3RhdGlvbiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgQW5ub3RhdGlvbkZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uLkdlbmVyYXRlZENvZGVJbmZvLlR5cGVzLkFubm90YXRpb24+IF9yZXBlYXRlZF9hbm5vdGF0aW9uX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgxMCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5HZW5lcmF0ZWRDb2RlSW5mby5UeXBlcy5Bbm5vdGF0aW9uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5HZW5lcmF0ZWRDb2RlSW5mby5UeXBlcy5Bbm5vdGF0aW9uPiBhbm5vdGF0aW9uXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbi5HZW5lcmF0ZWRDb2RlSW5mby5UeXBlcy5Bbm5vdGF0aW9uPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEFuIEFubm90YXRpb24gY29ubmVjdHMgc29tZSBzcGFuIG9mIHRleHQgaW4gZ2VuZXJhdGVkIGNvZGUgdG8gYW4gZWxlbWVudAotICAgIC8vLyAgb2YgaXRzIGdlbmVyYXRpbmcgLnByb3RvIGZpbGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uR2VuZXJhdGVkQ29kZUluZm8uVHlwZXMuQW5ub3RhdGlvbj4gQW5ub3RhdGlvbiB7Ci0gICAgICBnZXQgeyByZXR1cm4gYW5ub3RhdGlvbl87IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEdlbmVyYXRlZENvZGVJbmZvKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoR2VuZXJhdGVkQ29kZUluZm8gb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYoIWFubm90YXRpb25fLkVxdWFscyhvdGhlci5hbm5vdGF0aW9uXykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IGFubm90YXRpb25fLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGFubm90YXRpb25fLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfYW5ub3RhdGlvbl9jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSBhbm5vdGF0aW9uXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9hbm5vdGF0aW9uX2NvZGVjKTsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShHZW5lcmF0ZWRDb2RlSW5mbyBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgYW5ub3RhdGlvbl8uQWRkKG90aGVyLmFubm90YXRpb25fKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBhbm5vdGF0aW9uXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX2Fubm90YXRpb25fY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMKLSAgICAvLy8gPHN1bW1hcnk+Q29udGFpbmVyIGZvciBuZXN0ZWQgdHlwZXMgZGVjbGFyZWQgaW4gdGhlIEdlbmVyYXRlZENvZGVJbmZvIG1lc3NhZ2UgdHlwZS48L3N1bW1hcnk+Ci0gICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgewotICAgICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICAgIGludGVybmFsIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEFubm90YXRpb24gOiBwYjo6SU1lc3NhZ2U8QW5ub3RhdGlvbj4gewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxBbm5vdGF0aW9uPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEFubm90YXRpb24+KCgpID0+IG5ldyBBbm5vdGF0aW9uKCkpOwotICAgICAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEFubm90YXRpb24+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgICAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24uR2VuZXJhdGVkQ29kZUluZm8uRGVzY3JpcHRvci5OZXN0ZWRUeXBlc1swXTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBBbm5vdGF0aW9uKCkgewotICAgICAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgICAgICBwdWJsaWMgQW5ub3RhdGlvbihBbm5vdGF0aW9uIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICAgICAgcGF0aF8gPSBvdGhlci5wYXRoXy5DbG9uZSgpOwotICAgICAgICAgIHNvdXJjZUZpbGVfID0gb3RoZXIuc291cmNlRmlsZV87Ci0gICAgICAgICAgYmVnaW5fID0gb3RoZXIuYmVnaW5fOwotICAgICAgICAgIGVuZF8gPSBvdGhlci5lbmRfOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIEFubm90YXRpb24gQ2xvbmUoKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBBbm5vdGF0aW9uKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYXRoIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgUGF0aEZpZWxkTnVtYmVyID0gMTsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8aW50PiBfcmVwZWF0ZWRfcGF0aF9jb2RlYwotICAgICAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JJbnQzMigxMCk7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gcGF0aF8gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4oKTsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIElkZW50aWZpZXMgdGhlIGVsZW1lbnQgaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSAucHJvdG8gZmlsZS4gVGhpcyBmaWVsZAotICAgICAgICAvLy8gIGlzIGZvcm1hdHRlZCB0aGUgc2FtZSBhcyBTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGludD4gUGF0aCB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIHBhdGhfOyB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInNvdXJjZV9maWxlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgU291cmNlRmlsZUZpZWxkTnVtYmVyID0gMjsKLSAgICAgICAgcHJpdmF0ZSBzdHJpbmcgc291cmNlRmlsZV8gPSAiIjsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIElkZW50aWZpZXMgdGhlIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIC5wcm90by4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBTb3VyY2VGaWxlIHsKLSAgICAgICAgICBnZXQgeyByZXR1cm4gc291cmNlRmlsZV87IH0KLSAgICAgICAgICBzZXQgewotICAgICAgICAgICAgc291cmNlRmlsZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJiZWdpbiIgZmllbGQuPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY29uc3QgaW50IEJlZ2luRmllbGROdW1iZXIgPSAzOwotICAgICAgICBwcml2YXRlIGludCBiZWdpbl87Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBJZGVudGlmaWVzIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gYnl0ZXMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCi0gICAgICAgIC8vLyAgdGhhdCByZWxhdGVzIHRvIHRoZSBpZGVudGlmaWVkIG9iamVjdC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBCZWdpbiB7Ci0gICAgICAgICAgZ2V0IHsgcmV0dXJuIGJlZ2luXzsgfQotICAgICAgICAgIHNldCB7Ci0gICAgICAgICAgICBiZWdpbl8gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImVuZCIgZmllbGQuPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY29uc3QgaW50IEVuZEZpZWxkTnVtYmVyID0gNDsKLSAgICAgICAgcHJpdmF0ZSBpbnQgZW5kXzsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIElkZW50aWZpZXMgdGhlIGVuZGluZyBvZmZzZXQgaW4gYnl0ZXMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHRoYXQKLSAgICAgICAgLy8vICByZWxhdGVzIHRvIHRoZSBpZGVudGlmaWVkIG9mZnNldC4gVGhlIGVuZCBvZmZzZXQgc2hvdWxkIGJlIG9uZSBwYXN0Ci0gICAgICAgIC8vLyAgdGhlIGxhc3QgcmVsZXZhbnQgYnl0ZSAoc28gdGhlIGxlbmd0aCBvZiB0aGUgdGV4dCA9IGVuZCAtIGJlZ2luKS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGludCBFbmQgewotICAgICAgICAgIGdldCB7IHJldHVybiBlbmRfOyB9Ci0gICAgICAgICAgc2V0IHsKLSAgICAgICAgICAgIGVuZF8gPSB2YWx1ZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBBbm5vdGF0aW9uKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBib29sIEVxdWFscyhBbm5vdGF0aW9uIG90aGVyKSB7Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZighcGF0aF8uRXF1YWxzKG90aGVyLnBhdGhfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlmIChTb3VyY2VGaWxlICE9IG90aGVyLlNvdXJjZUZpbGUpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBpZiAoQmVnaW4gIT0gb3RoZXIuQmVnaW4pIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBpZiAoRW5kICE9IG90aGVyLkVuZCkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICAgICAgaGFzaCBePSBwYXRoXy5HZXRIYXNoQ29kZSgpOwotICAgICAgICAgIGlmIChTb3VyY2VGaWxlLkxlbmd0aCAhPSAwKSBoYXNoIF49IFNvdXJjZUZpbGUuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICBpZiAoQmVnaW4gIT0gMCkgaGFzaCBePSBCZWdpbi5HZXRIYXNoQ29kZSgpOwotICAgICAgICAgIGlmIChFbmQgIT0gMCkgaGFzaCBePSBFbmQuR2V0SGFzaENvZGUoKTsKLSAgICAgICAgICByZXR1cm4gaGFzaDsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgICAgIHBhdGhfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfcGF0aF9jb2RlYyk7Ci0gICAgICAgICAgaWYgKFNvdXJjZUZpbGUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoU291cmNlRmlsZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChCZWdpbiAhPSAwKSB7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoQmVnaW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoRW5kICE9IDApIHsKLSAgICAgICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzMik7Ci0gICAgICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihFbmQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgICAgc2l6ZSArPSBwYXRoXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9wYXRoX2NvZGVjKTsKLSAgICAgICAgICBpZiAoU291cmNlRmlsZS5MZW5ndGggIT0gMCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFNvdXJjZUZpbGUpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoQmVnaW4gIT0gMCkgewotICAgICAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoQmVnaW4pOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoRW5kICE9IDApIHsKLSAgICAgICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKEVuZCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBzaXplOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEFubm90YXRpb24gb3RoZXIpIHsKLSAgICAgICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0KLSAgICAgICAgICBwYXRoXy5BZGQob3RoZXIucGF0aF8pOwotICAgICAgICAgIGlmIChvdGhlci5Tb3VyY2VGaWxlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICBTb3VyY2VGaWxlID0gb3RoZXIuU291cmNlRmlsZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKG90aGVyLkJlZ2luICE9IDApIHsKLSAgICAgICAgICAgIEJlZ2luID0gb3RoZXIuQmVnaW47Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChvdGhlci5FbmQgIT0gMCkgewotICAgICAgICAgICAgRW5kID0gb3RoZXIuRW5kOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgICAgIHVpbnQgdGFnOwotICAgICAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICBjYXNlIDEwOgotICAgICAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgICAgICBwYXRoXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhdGhfY29kZWMpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgICAgICBTb3VyY2VGaWxlID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMjQ6IHsKLSAgICAgICAgICAgICAgICBCZWdpbiA9IGlucHV0LlJlYWRJbnQzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGNhc2UgMzI6IHsKLSAgICAgICAgICAgICAgICBFbmQgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICB9Ci0KLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLX0KLQotI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yQmFzZS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRGVzY3JpcHRvckJhc2UuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE5NDA0MWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yQmFzZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQmFzZSBjbGFzcyBmb3IgbmVhcmx5IGFsbCBkZXNjcmlwdG9ycywgcHJvdmlkaW5nIGNvbW1vbiBmdW5jdGlvbmFsaXR5LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGFic3RyYWN0IGNsYXNzIERlc2NyaXB0b3JCYXNlIDogSURlc2NyaXB0b3IKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRmlsZURlc2NyaXB0b3IgZmlsZTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgZnVsbE5hbWU7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IGluZGV4OwotCi0gICAgICAgIGludGVybmFsIERlc2NyaXB0b3JCYXNlKEZpbGVEZXNjcmlwdG9yIGZpbGUsIHN0cmluZyBmdWxsTmFtZSwgaW50IGluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGZ1bGxOYW1lOwotICAgICAgICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQgZGVzY3JpcHRvci4gCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIHJldHVybnMgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudCwgZm9yCi0gICAgICAgIC8vLyB0aGlzIGRlc2NyaXB0b3IncyB0eXBlLiAoVGhlcmUgY2FuIGJlIGR1cGxpY2F0ZSB2YWx1ZXMgZm9yIGRpZmZlcmVudAotICAgICAgICAvLy8gdHlwZXMsIGUuZy4gb25lIGVudW0gdHlwZSB3aXRoIGluZGV4IDAgYW5kIG9uZSBtZXNzYWdlIHR5cGUgd2l0aCBpbmRleCAwLikKLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgcHVibGljIGludCBJbmRleAotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gaW5kZXg7IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudGl0eSAoZmllbGQsIG1lc3NhZ2UgZXRjKSBiZWluZyBkZXNjcmliZWQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCBzdHJpbmcgTmFtZSB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgZGVzY3JpcHRvcidzIHRhcmdldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBGdWxsTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gZnVsbE5hbWU7IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBUaGUgZmlsZSB0aGlzIGRlc2NyaXB0b3Igd2FzIGRlY2xhcmVkIGluLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIEZpbGUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZpbGU7IH0KLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0Rlc2NyaXB0b3JQb29sLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yUG9vbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTljYTRiZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0Rlc2NyaXB0b3JQb29sLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzY4ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uVGV4dC5SZWd1bGFyRXhwcmVzc2lvbnM7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQ29udGFpbnMgbG9va3VwIHRhYmxlcyBjb250YWluaW5nIGFsbCB0aGUgZGVzY3JpcHRvcnMgZGVmaW5lZCBpbiBhIHBhcnRpY3VsYXIgZmlsZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIHNlYWxlZCBjbGFzcyBEZXNjcmlwdG9yUG9vbAotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJRGljdGlvbmFyeTxzdHJpbmcsIElEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0J5TmFtZSA9Ci0gICAgICAgICAgICBuZXcgRGljdGlvbmFyeTxzdHJpbmcsIElEZXNjcmlwdG9yPigpOwotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSURpY3Rpb25hcnk8RGVzY3JpcHRvckludFBhaXIsIEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzQnlOdW1iZXIgPQotICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8RGVzY3JpcHRvckludFBhaXIsIEZpZWxkRGVzY3JpcHRvcj4oKTsKLQotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElEaWN0aW9uYXJ5PERlc2NyaXB0b3JJbnRQYWlyLCBFbnVtVmFsdWVEZXNjcmlwdG9yPiBlbnVtVmFsdWVzQnlOdW1iZXIgPQotICAgICAgICAgICAgbmV3IERpY3Rpb25hcnk8RGVzY3JpcHRvckludFBhaXIsIEVudW1WYWx1ZURlc2NyaXB0b3I+KCk7Ci0KLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBIYXNoU2V0PEZpbGVEZXNjcmlwdG9yPiBkZXBlbmRlbmNpZXM7Ci0KLSAgICAgICAgaW50ZXJuYWwgRGVzY3JpcHRvclBvb2woRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmN5RmlsZXMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGRlcGVuZGVuY2llcyA9IG5ldyBIYXNoU2V0PEZpbGVEZXNjcmlwdG9yPigpOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5RmlsZXMuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzLkFkZChkZXBlbmRlbmN5RmlsZXNbaV0pOwotICAgICAgICAgICAgICAgIEltcG9ydFB1YmxpY0RlcGVuZGVuY2llcyhkZXBlbmRlbmN5RmlsZXNbaV0pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3JlYWNoIChGaWxlRGVzY3JpcHRvciBkZXBlbmRlbmN5IGluIGRlcGVuZGVuY3lGaWxlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBBZGRQYWNrYWdlKGRlcGVuZGVuY3kuUGFja2FnZSwgZGVwZW5kZW5jeSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHZvaWQgSW1wb3J0UHVibGljRGVwZW5kZW5jaWVzKEZpbGVEZXNjcmlwdG9yIGZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKEZpbGVEZXNjcmlwdG9yIGRlcGVuZGVuY3kgaW4gZmlsZS5QdWJsaWNEZXBlbmRlbmNpZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5BZGQoZGVwZW5kZW5jeSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBJbXBvcnRQdWJsaWNEZXBlbmRlbmNpZXMoZGVwZW5kZW5jeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmluZHMgYSBzeW1ib2wgb2YgdGhlIGdpdmVuIG5hbWUgd2l0aGluIHRoZSBwb29sLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHR5cGVwYXJhbSBuYW1lPSJUIj5UaGUgdHlwZSBvZiBzeW1ib2wgdG8gbG9vayBmb3I8L3R5cGVwYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmdWxsTmFtZSI+RnVsbHktcXVhbGlmaWVkIG5hbWUgdG8gbG9vayB1cDwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgc3ltYm9sIHdpdGggdGhlIGdpdmVuIG5hbWUgYW5kIHR5cGUsCi0gICAgICAgIC8vLyBvciBudWxsIGlmIHRoZSBzeW1ib2wgZG9lc24ndCBleGlzdCBvciBoYXMgdGhlIHdyb25nIHR5cGU8L3JldHVybnM+Ci0gICAgICAgIGludGVybmFsIFQgRmluZFN5bWJvbDxUPihzdHJpbmcgZnVsbE5hbWUpIHdoZXJlIFQgOiBjbGFzcwotICAgICAgICB7Ci0gICAgICAgICAgICBJRGVzY3JpcHRvciByZXN1bHQ7Ci0gICAgICAgICAgICBkZXNjcmlwdG9yc0J5TmFtZS5UcnlHZXRWYWx1ZShmdWxsTmFtZSwgb3V0IHJlc3VsdCk7Ci0gICAgICAgICAgICBUIGRlc2NyaXB0b3IgPSByZXN1bHQgYXMgVDsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG51bGwpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIGRlcGVuZGVuY2llcyBjb250YWlucyBkaXJlY3QgZGVwZW5kZW5jaWVzIGFuZCBhbnkgKnB1YmxpYyogZGVwZW5kZW5jaWVzCi0gICAgICAgICAgICAvLyBvZiB0aG9zZSBkZXBlbmRlbmNpZXMgKHRyYW5zaXRpdmVseSkuLi4gc28gd2UgZG9uJ3QgbmVlZCB0byByZWN1cnNlIGhlcmUuCi0gICAgICAgICAgICBmb3JlYWNoIChGaWxlRGVzY3JpcHRvciBkZXBlbmRlbmN5IGluIGRlcGVuZGVuY2llcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LkRlc2NyaXB0b3JQb29sLmRlc2NyaXB0b3JzQnlOYW1lLlRyeUdldFZhbHVlKGZ1bGxOYW1lLCBvdXQgcmVzdWx0KTsKLSAgICAgICAgICAgICAgICBkZXNjcmlwdG9yID0gcmVzdWx0IGFzIFQ7Ci0gICAgICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gbnVsbCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgcGFja2FnZSB0byB0aGUgc3ltYm9sIHRhYmxlcy4gSWYgYSBwYWNrYWdlIGJ5IHRoZSBzYW1lIG5hbWUKLSAgICAgICAgLy8vIGFscmVhZHkgZXhpc3RzLCB0aGF0IGlzIGZpbmUsIGJ1dCBpZiBzb21lIG90aGVyIGtpbmQgb2Ygc3ltYm9sCi0gICAgICAgIC8vLyBleGlzdHMgdW5kZXIgdGhlIHNhbWUgbmFtZSwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4gSWYgdGhlIHBhY2thZ2UKLSAgICAgICAgLy8vIGhhcyBtdWx0aXBsZSBjb21wb25lbnRzLCB0aGlzIGFsc28gYWRkcyB0aGUgcGFyZW50IHBhY2thZ2UocykuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHZvaWQgQWRkUGFja2FnZShzdHJpbmcgZnVsbE5hbWUsIEZpbGVEZXNjcmlwdG9yIGZpbGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGludCBkb3Rwb3MgPSBmdWxsTmFtZS5MYXN0SW5kZXhPZignLicpOwotICAgICAgICAgICAgU3RyaW5nIG5hbWU7Ci0gICAgICAgICAgICBpZiAoZG90cG9zICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIEFkZFBhY2thZ2UoZnVsbE5hbWUuU3Vic3RyaW5nKDAsIGRvdHBvcyksIGZpbGUpOwotICAgICAgICAgICAgICAgIG5hbWUgPSBmdWxsTmFtZS5TdWJzdHJpbmcoZG90cG9zICsgMSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IGZ1bGxOYW1lOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBJRGVzY3JpcHRvciBvbGQ7Ci0gICAgICAgICAgICBpZiAoZGVzY3JpcHRvcnNCeU5hbWUuVHJ5R2V0VmFsdWUoZnVsbE5hbWUsIG91dCBvbGQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghKG9sZCBpcyBQYWNrYWdlRGVzY3JpcHRvcikpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSkgaW4gZmlsZSBcIiIgKyBvbGQuRmlsZS5OYW1lICsgIlwiLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lW2Z1bGxOYW1lXSA9IG5ldyBQYWNrYWdlRGVzY3JpcHRvcihuYW1lLCBmdWxsTmFtZSwgZmlsZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIGEgc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIj5UaGUgc3ltYm9sIGFscmVhZHkgZXhpc3RlZAotICAgICAgICAvLy8gaW4gdGhlIHN5bWJvbCB0YWJsZS48L2V4Y2VwdGlvbj4KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGRTeW1ib2woSURlc2NyaXB0b3IgZGVzY3JpcHRvcikKLSAgICAgICAgewotICAgICAgICAgICAgVmFsaWRhdGVTeW1ib2xOYW1lKGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgU3RyaW5nIGZ1bGxOYW1lID0gZGVzY3JpcHRvci5GdWxsTmFtZTsKLQotICAgICAgICAgICAgSURlc2NyaXB0b3Igb2xkOwotICAgICAgICAgICAgaWYgKGRlc2NyaXB0b3JzQnlOYW1lLlRyeUdldFZhbHVlKGZ1bGxOYW1lLCBvdXQgb2xkKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpbnQgZG90UG9zID0gZnVsbE5hbWUuTGFzdEluZGV4T2YoJy4nKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcgbWVzc2FnZTsKLSAgICAgICAgICAgICAgICBpZiAoZGVzY3JpcHRvci5GaWxlID09IG9sZC5GaWxlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKGRvdFBvcyA9PSAtMSkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJcIiIgKyBmdWxsTmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQuIjsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSAiXCIiICsgZnVsbE5hbWUuU3Vic3RyaW5nKGRvdFBvcyArIDEpICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ1bGxOYW1lLlN1YnN0cmluZygwLCBkb3RQb3MpICsgIlwiLiI7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSA9ICJcIiIgKyBmdWxsTmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZmlsZSBcIiIgKyBvbGQuRmlsZS5OYW1lICsgIlwiLiI7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLCBtZXNzYWdlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lW2Z1bGxOYW1lXSA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIH0KLQotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBSZWdleCBWYWxpZGF0aW9uUmVnZXggPSBuZXcgUmVnZXgoIl5bX0EtWmEtel1bX0EtWmEtejAtOV0qJCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGcmFtZXdvcmtQb3J0YWJpbGl0eS5Db21waWxlZFJlZ2V4V2hlcmVBdmFpbGFibGUpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFZlcmlmaWVzIHRoYXQgdGhlIGRlc2NyaXB0b3IncyBuYW1lIGlzIHZhbGlkIChpLmUuIGl0IGNvbnRhaW5zCi0gICAgICAgIC8vLyBvbmx5IGxldHRlcnMsIGRpZ2l0cyBhbmQgdW5kZXJzY29yZXMsIGFuZCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgZGlnaXQpLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRlc2NyaXB0b3IiPjwvcGFyYW0+Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHZvaWQgVmFsaWRhdGVTeW1ib2xOYW1lKElEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkZXNjcmlwdG9yLk5hbWUgPT0gIiIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsICJNaXNzaW5nIG5hbWUuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoIVZhbGlkYXRpb25SZWdleC5Jc01hdGNoKGRlc2NyaXB0b3IuTmFtZSkpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBkZXNjcmlwdG9yLk5hbWUgKyAiXCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllci4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIGZpZWxkIHdpdGggdGhlIGdpdmVuIG51bWJlciBpbiB0aGUgZ2l2ZW4gZGVzY3JpcHRvciwKLSAgICAgICAgLy8vIG9yIG51bGwgaWYgaXQgY2FuJ3QgYmUgZm91bmQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIEZpZWxkRGVzY3JpcHRvciBGaW5kRmllbGRCeU51bWJlcihNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlRGVzY3JpcHRvciwgaW50IG51bWJlcikKLSAgICAgICAgewotICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIHJldDsKLSAgICAgICAgICAgIGZpZWxkc0J5TnVtYmVyLlRyeUdldFZhbHVlKG5ldyBEZXNjcmlwdG9ySW50UGFpcihtZXNzYWdlRGVzY3JpcHRvciwgbnVtYmVyKSwgb3V0IHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgRW51bVZhbHVlRGVzY3JpcHRvciBGaW5kRW51bVZhbHVlQnlOdW1iZXIoRW51bURlc2NyaXB0b3IgZW51bURlc2NyaXB0b3IsIGludCBudW1iZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IgcmV0OwotICAgICAgICAgICAgZW51bVZhbHVlc0J5TnVtYmVyLlRyeUdldFZhbHVlKG5ldyBEZXNjcmlwdG9ySW50UGFpcihlbnVtRGVzY3JpcHRvciwgbnVtYmVyKSwgb3V0IHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIGZpZWxkIHRvIHRoZSBmaWVsZHNCeU51bWJlciB0YWJsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24iPkEgZmllbGQgd2l0aCB0aGUgc2FtZQotICAgICAgICAvLy8gY29udGFpbmluZyB0eXBlIGFuZCBudW1iZXIgYWxyZWFkeSBleGlzdHMuPC9leGNlcHRpb24+Ci0gICAgICAgIGludGVybmFsIHZvaWQgQWRkRmllbGRCeU51bWJlcihGaWVsZERlc2NyaXB0b3IgZmllbGQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlc2NyaXB0b3JJbnRQYWlyIGtleSA9IG5ldyBEZXNjcmlwdG9ySW50UGFpcihmaWVsZC5Db250YWluaW5nVHlwZSwgZmllbGQuRmllbGROdW1iZXIpOwotICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yIG9sZDsKLSAgICAgICAgICAgIGlmIChmaWVsZHNCeU51bWJlci5UcnlHZXRWYWx1ZShrZXksIG91dCBvbGQpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihmaWVsZCwgIkZpZWxkIG51bWJlciAiICsgZmllbGQuRmllbGROdW1iZXIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQuQ29udGFpbmluZ1R5cGUuRnVsbE5hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGJ5IGZpZWxkIFwiIiArIG9sZC5OYW1lICsgIlwiLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmllbGRzQnlOdW1iZXJba2V5XSA9IGZpZWxkOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhbiBlbnVtIHZhbHVlIHRvIHRoZSBlbnVtVmFsdWVzQnlOdW1iZXIgdGFibGUuIElmIGFuIGVudW0gdmFsdWUKLSAgICAgICAgLy8vIHdpdGggdGhlIHNhbWUgdHlwZSBhbmQgbnVtYmVyIGFscmVhZHkgZXhpc3RzLCB0aGlzIG1ldGhvZCBkb2VzIG5vdGhpbmcuCi0gICAgICAgIC8vLyAoVGhpcyBpcyBhbGxvd2VkOyB0aGUgZmlyc3QgdmFsdWUgZGVmaW5lZCB3aXRoIHRoZSBudW1iZXIgdGFrZXMgcHJlY2VkZW5jZS4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHZvaWQgQWRkRW51bVZhbHVlQnlOdW1iZXIoRW51bVZhbHVlRGVzY3JpcHRvciBlbnVtVmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIERlc2NyaXB0b3JJbnRQYWlyIGtleSA9IG5ldyBEZXNjcmlwdG9ySW50UGFpcihlbnVtVmFsdWUuRW51bURlc2NyaXB0b3IsIGVudW1WYWx1ZS5OdW1iZXIpOwotICAgICAgICAgICAgaWYgKCFlbnVtVmFsdWVzQnlOdW1iZXIuQ29udGFpbnNLZXkoa2V5KSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBlbnVtVmFsdWVzQnlOdW1iZXJba2V5XSA9IGVudW1WYWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExvb2tzIHVwIGEgZGVzY3JpcHRvciBieSBuYW1lLCByZWxhdGl2ZSB0byBzb21lIG90aGVyIGRlc2NyaXB0b3IuCi0gICAgICAgIC8vLyBUaGUgbmFtZSBtYXkgYmUgZnVsbHktcXVhbGlmaWVkICh3aXRoIGEgbGVhZGluZyAnLicpLCBwYXJ0aWFsbHktcXVhbGlmaWVkLAotICAgICAgICAvLy8gb3IgdW5xdWFsaWZpZWQuIEMrKy1saWtlIG5hbWUgbG9va3VwIHNlbWFudGljcyBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIHRoZQotICAgICAgICAvLy8gbWF0Y2hpbmcgZGVzY3JpcHRvci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhpcyBpc24ndCBoZWF2aWx5IG9wdGltaXplZCwgYnV0IGl0J3Mgb25seSB1c2VkIGR1cmluZyBjcm9zcyBsaW5raW5nIGFueXdheS4KLSAgICAgICAgLy8vIElmIGl0IHN0YXJ0cyBiZWluZyB1c2VkIG1vcmUgd2lkZWx5LCB3ZSBzaG91bGQgbG9vayBhdCBwZXJmb3JtYW5jZSBtb3JlIGNhcmVmdWxseS4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgaW50ZXJuYWwgSURlc2NyaXB0b3IgTG9va3VwU3ltYm9sKHN0cmluZyBuYW1lLCBJRGVzY3JpcHRvciByZWxhdGl2ZVRvKQotICAgICAgICB7Ci0gICAgICAgICAgICBJRGVzY3JpcHRvciByZXN1bHQ7Ci0gICAgICAgICAgICBpZiAobmFtZS5TdGFydHNXaXRoKCIuIikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUuCi0gICAgICAgICAgICAgICAgcmVzdWx0ID0gRmluZFN5bWJvbDxJRGVzY3JpcHRvcj4obmFtZS5TdWJzdHJpbmcoMSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIElmICJuYW1lIiBpcyBhIGNvbXBvdW5kIGlkZW50aWZpZXIsIHdlIHdhbnQgdG8gc2VhcmNoIGZvciB0aGUKLSAgICAgICAgICAgICAgICAvLyBmaXJzdCBjb21wb25lbnQgb2YgaXQsIHRoZW4gc2VhcmNoIHdpdGhpbiBpdCBmb3IgdGhlIHJlc3QuCi0gICAgICAgICAgICAgICAgaW50IGZpcnN0UGFydExlbmd0aCA9IG5hbWUuSW5kZXhPZignLicpOwotICAgICAgICAgICAgICAgIHN0cmluZyBmaXJzdFBhcnQgPSBmaXJzdFBhcnRMZW5ndGggPT0gLTEgPyBuYW1lIDogbmFtZS5TdWJzdHJpbmcoMCwgZmlyc3RQYXJ0TGVuZ3RoKTsKLQotICAgICAgICAgICAgICAgIC8vIFdlIHdpbGwgc2VhcmNoIGVhY2ggcGFyZW50IHNjb3BlIG9mICJyZWxhdGl2ZVRvIiBsb29raW5nIGZvciB0aGUKLSAgICAgICAgICAgICAgICAvLyBzeW1ib2wuCi0gICAgICAgICAgICAgICAgU3RyaW5nQnVpbGRlciBzY29wZVRvVHJ5ID0gbmV3IFN0cmluZ0J1aWxkZXIocmVsYXRpdmVUby5GdWxsTmFtZSk7Ci0KLSAgICAgICAgICAgICAgICB3aGlsZSAodHJ1ZSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIENob3Agb2ZmIHRoZSBsYXN0IGNvbXBvbmVudCBvZiB0aGUgc2NvcGUuCi0KLSAgICAgICAgICAgICAgICAgICAgaW50IGRvdHBvcyA9IHNjb3BlVG9UcnkuVG9TdHJpbmcoKS5MYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgICAgICAgICAgICBpZiAoZG90cG9zID09IC0xKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGaW5kU3ltYm9sPElEZXNjcmlwdG9yPihuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5MZW5ndGggPSBkb3Rwb3MgKyAxOwotCi0gICAgICAgICAgICAgICAgICAgICAgICAvLyBBcHBlbmQgZmlyc3RQYXJ0IGFuZCB0cnkgdG8gZmluZC4KLSAgICAgICAgICAgICAgICAgICAgICAgIHNjb3BlVG9UcnkuQXBwZW5kKGZpcnN0UGFydCk7Ci0gICAgICAgICAgICAgICAgICAgICAgICByZXN1bHQgPSBGaW5kU3ltYm9sPElEZXNjcmlwdG9yPihzY29wZVRvVHJ5LlRvU3RyaW5nKCkpOwotCi0gICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGZpcnN0UGFydExlbmd0aCAhPSAtMSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgZm91bmQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN5bWJvbC4gIE5vdyBsb29rIGZvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgdGhpbmcuICBJZiB0aGlzIGZhaWxzLCB3ZSAqZG9uJ3QqIHdhbnQgdG8ga2VlcAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZWFyY2hpbmcgcGFyZW50IHNjb3Blcy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5MZW5ndGggPSBkb3Rwb3MgKyAxOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzY29wZVRvVHJ5LkFwcGVuZChuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gRmluZFN5bWJvbDxJRGVzY3JpcHRvcj4oc2NvcGVUb1RyeS5Ub1N0cmluZygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdCBmb3VuZC4gIFJlbW92ZSB0aGUgbmFtZSBzbyB3ZSBjYW4gdHJ5IGFnYWluLgotICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5MZW5ndGggPSBkb3Rwb3M7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24ocmVsYXRpdmVUbywgIlwiIiArIG5hbWUgKyAiXCIgaXMgbm90IGRlZmluZWQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFN0cnVjdCB1c2VkIHRvIGhvbGQgdGhlIGtleXMgZm9yIHRoZSBmaWVsZEJ5TnVtYmVyIHRhYmxlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwcml2YXRlIHN0cnVjdCBEZXNjcmlwdG9ySW50UGFpciA6IElFcXVhdGFibGU8RGVzY3JpcHRvckludFBhaXI+Ci0gICAgICAgIHsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgaW50IG51bWJlcjsKLSAgICAgICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgICAgICAgICAgaW50ZXJuYWwgRGVzY3JpcHRvckludFBhaXIoSURlc2NyaXB0b3IgZGVzY3JpcHRvciwgaW50IG51bWJlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICAgICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRGVzY3JpcHRvckludFBhaXIgb3RoZXIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IgPT0gb3RoZXIuZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICAgICAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG9iaikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBpZiAob2JqIGlzIERlc2NyaXB0b3JJbnRQYWlyKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEVxdWFscygoRGVzY3JpcHRvckludFBhaXIpIG9iaik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuR2V0SGFzaENvZGUoKSooKDEgPDwgMTYpIC0gMSkgKyBudW1iZXI7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yVXRpbC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRGVzY3JpcHRvclV0aWwuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NTcwZmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yVXRpbC5jcworKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEludGVybmFsIGNsYXNzIGNvbnRhaW5pbmcgdXRpbGl0eSBtZXRob2RzIHdoZW4gd29ya2luZyB3aXRoIGRlc2NyaXB0b3JzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgc3RhdGljIGNsYXNzIERlc2NyaXB0b3JVdGlsCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBFcXVpdmFsZW50IHRvIEZ1bmNbVElucHV0LCBpbnQsIFRPdXRwdXRdIGJ1dCB1c2FibGUgaW4gLk5FVCAyLjAuIE9ubHkgdXNlZCB0byBjb252ZXJ0Ci0gICAgICAgIC8vLyBhcnJheXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIGRlbGVnYXRlIFRPdXRwdXQgSW5kZXhlZENvbnZlcnRlcjxUSW5wdXQsIFRPdXRwdXQ+KFRJbnB1dCBlbGVtZW50LCBpbnQgaW5kZXgpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlcnRzIHRoZSBnaXZlbiBhcnJheSBpbnRvIGEgcmVhZC1vbmx5IGxpc3QsIGFwcGx5aW5nIHRoZSBzcGVjaWZpZWQgY29udmVyc2lvbiB0bwotICAgICAgICAvLy8gZWFjaCBpbnB1dCBlbGVtZW50LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgSUxpc3Q8VE91dHB1dD4gQ29udmVydEFuZE1ha2VSZWFkT25seTxUSW5wdXQsIFRPdXRwdXQ+Ci0gICAgICAgICAgICAoSUxpc3Q8VElucHV0PiBpbnB1dCwgSW5kZXhlZENvbnZlcnRlcjxUSW5wdXQsIFRPdXRwdXQ+IGNvbnZlcnRlcikKLSAgICAgICAgewotICAgICAgICAgICAgVE91dHB1dFtdIGFycmF5ID0gbmV3IFRPdXRwdXRbaW5wdXQuQ291bnRdOwotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheS5MZW5ndGg7IGkrKykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBhcnJheVtpXSA9IGNvbnZlcnRlcihpbnB1dFtpXSwgaSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlYWRPbmx5Q29sbGVjdGlvbjxUT3V0cHV0PihhcnJheSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbi5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24uY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE0MzY3MWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9EZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbi5jcworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaHJvd24gd2hlbiBidWlsZGluZyBkZXNjcmlwdG9ycyBmYWlscyBiZWNhdXNlIHRoZSBzb3VyY2UgRGVzY3JpcHRvclByb3RvcwotICAgIC8vLyBhcmUgbm90IHZhbGlkLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiA6IEV4Y2VwdGlvbgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTdHJpbmcgbmFtZTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBzdHJpbmcgZGVzY3JpcHRpb247Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBmdWxsIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3Igd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIFN0cmluZyBQcm9ibGVtU3ltYm9sTmFtZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gbmFtZTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIEEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLiAoVGhlIE1lc3NhZ2UgcHJvcGVydHkKLSAgICAgICAgLy8vIGlzIG1hZGUgdXAgb2YgdGhlIGRlc2NyaXB0b3IncyBuYW1lIGFuZCB0aGlzIGRlc2NyaXB0aW9uLikKLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgRGVzY3JpcHRpb24KLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0aW9uOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihJRGVzY3JpcHRvciBwcm9ibGVtRGVzY3JpcHRvciwgc3RyaW5nIGRlc2NyaXB0aW9uKSA6Ci0gICAgICAgICAgICBiYXNlKHByb2JsZW1EZXNjcmlwdG9yLkZ1bGxOYW1lICsgIjogIiArIGRlc2NyaXB0aW9uKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RlIHRoYXQgcHJvYmxlbURlc2NyaXB0b3IgbWF5IGJlIHBhcnRpYWxseSB1bmluaXRpYWxpemVkLCBzbyB3ZQotICAgICAgICAgICAgLy8gZG9uJ3Qgd2FudCB0byBleHBvc2UgaXQgZGlyZWN0bHkgdG8gdGhlIHVzZXIuICBTbywgd2Ugb25seSBwcm92aWRlCi0gICAgICAgICAgICAvLyB0aGUgbmFtZSBhbmQgdGhlIG9yaWdpbmFsIHByb3RvLgotICAgICAgICAgICAgbmFtZSA9IHByb2JsZW1EZXNjcmlwdG9yLkZ1bGxOYW1lOwotICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oSURlc2NyaXB0b3IgcHJvYmxlbURlc2NyaXB0b3IsIHN0cmluZyBkZXNjcmlwdGlvbiwgRXhjZXB0aW9uIGNhdXNlKSA6Ci0gICAgICAgICAgICBiYXNlKHByb2JsZW1EZXNjcmlwdG9yLkZ1bGxOYW1lICsgIjogIiArIGRlc2NyaXB0aW9uLCBjYXVzZSkKLSAgICAgICAgewotICAgICAgICAgICAgbmFtZSA9IHByb2JsZW1EZXNjcmlwdG9yLkZ1bGxOYW1lOwotICAgICAgICAgICAgdGhpcy5kZXNjcmlwdGlvbiA9IGRlc2NyaXB0aW9uOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRW51bURlc2NyaXB0b3IuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0VudW1EZXNjcmlwdG9yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNzMyYzkzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRW51bURlc2NyaXB0b3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGVzY3JpcHRvciBmb3IgYW4gZW51bSB0eXBlIGluIGEgLnByb3RvIGZpbGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEVudW1EZXNjcmlwdG9yIDogRGVzY3JpcHRvckJhc2UKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRW51bURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBNZXNzYWdlRGVzY3JpcHRvciBjb250YWluaW5nVHlwZTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTGlzdDxFbnVtVmFsdWVEZXNjcmlwdG9yPiB2YWx1ZXM7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgVHlwZSBjbHJUeXBlOwotCi0gICAgICAgIGludGVybmFsIEVudW1EZXNjcmlwdG9yKEVudW1EZXNjcmlwdG9yUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yIGZpbGUsIE1lc3NhZ2VEZXNjcmlwdG9yIHBhcmVudCwgaW50IGluZGV4LCBUeXBlIGNsclR5cGUpCi0gICAgICAgICAgICA6IGJhc2UoZmlsZSwgZmlsZS5Db21wdXRlRnVsbE5hbWUocGFyZW50LCBwcm90by5OYW1lKSwgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgICAgICAgIHRoaXMuY2xyVHlwZSA9IGNsclR5cGU7Ci0gICAgICAgICAgICBjb250YWluaW5nVHlwZSA9IHBhcmVudDsKLQotICAgICAgICAgICAgaWYgKHByb3RvLlZhbHVlLkNvdW50ID09IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgLy8gV2UgY2Fubm90IGFsbG93IGVudW1zIHdpdGggbm8gdmFsdWVzIGJlY2F1c2UgdGhpcyB3b3VsZCBtZWFuIHRoZXJlCi0gICAgICAgICAgICAgICAgLy8gd291bGQgYmUgbm8gdmFsaWQgZGVmYXVsdCB2YWx1ZSBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIkVudW1zIG11c3QgY29udGFpbiBhdCBsZWFzdCBvbmUgdmFsdWUuIik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHZhbHVlcyA9IERlc2NyaXB0b3JVdGlsLkNvbnZlcnRBbmRNYWtlUmVhZE9ubHkocHJvdG8uVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSwgaSkgPT4gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3IodmFsdWUsIGZpbGUsIHRoaXMsIGkpKTsKLQotICAgICAgICAgICAgRmlsZS5EZXNjcmlwdG9yUG9vbC5BZGRTeW1ib2wodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBFbnVtRGVzY3JpcHRvclByb3RvIFByb3RvIHsgZ2V0IHsgcmV0dXJuIHByb3RvOyB9IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgYnJpZWYgbmFtZSBvZiB0aGUgZGVzY3JpcHRvcidzIHRhcmdldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBOYW1lIHsgZ2V0IHsgcmV0dXJuIHByb3RvLk5hbWU7IH0gfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBDTFIgdHlwZSBmb3IgdGhpcyBlbnVtLiBGb3IgZ2VuZXJhdGVkIGNvZGUsIHRoaXMgd2lsbCBiZSBhIENMUiBlbnVtIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBUeXBlIENsclR5cGUgeyBnZXQgeyByZXR1cm4gY2xyVHlwZTsgfSB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIElmIHRoaXMgaXMgYSBuZXN0ZWQgdHlwZSwgZ2V0IHRoZSBvdXRlciBkZXNjcmlwdG9yLCBvdGhlcndpc2UgbnVsbC4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBNZXNzYWdlRGVzY3JpcHRvciBDb250YWluaW5nVHlwZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gY29udGFpbmluZ1R5cGU7IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBBbiB1bm1vZGlmaWFibGUgbGlzdCBvZiBkZWZpbmVkIHZhbHVlIGRlc2NyaXB0b3JzIGZvciB0aGlzIGVudW0uCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgSUxpc3Q8RW51bVZhbHVlRGVzY3JpcHRvcj4gVmFsdWVzCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiB2YWx1ZXM7IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbmRzIGFuIGVudW0gdmFsdWUgYnkgbnVtYmVyLiBJZiBtdWx0aXBsZSBlbnVtIHZhbHVlcyBoYXZlIHRoZQotICAgICAgICAvLy8gc2FtZSBudW1iZXIsIHRoaXMgcmV0dXJucyB0aGUgZmlyc3QgZGVmaW5lZCB2YWx1ZSB3aXRoIHRoYXQgbnVtYmVyLgotICAgICAgICAvLy8gSWYgdGhlcmUgaXMgbm8gdmFsdWUgZm9yIHRoZSBnaXZlbiBudW1iZXIsIHRoaXMgcmV0dXJucyA8Yz5udWxsPC9jPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEVudW1WYWx1ZURlc2NyaXB0b3IgRmluZFZhbHVlQnlOdW1iZXIoaW50IG51bWJlcikKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZpbGUuRGVzY3JpcHRvclBvb2wuRmluZEVudW1WYWx1ZUJ5TnVtYmVyKHRoaXMsIG51bWJlcik7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaW5kcyBhbiBlbnVtIHZhbHVlIGJ5IG5hbWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIHZhbHVlIChlLmcuICJGT08iKS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHZhbHVlJ3MgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvciBGaW5kVmFsdWVCeU5hbWUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGaWxlLkRlc2NyaXB0b3JQb29sLkZpbmRTeW1ib2w8RW51bVZhbHVlRGVzY3JpcHRvcj4oRnVsbE5hbWUgKyAiLiIgKyBuYW1lKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0VudW1WYWx1ZURlc2NyaXB0b3IuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0VudW1WYWx1ZURlc2NyaXB0b3IuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIyMTJjZTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9FbnVtVmFsdWVEZXNjcmlwdG9yLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEZXNjcmlwdG9yIGZvciBhIHNpbmdsZSBlbnVtIHZhbHVlIHdpdGhpbiBhbiBlbnVtIGluIGEgLnByb3RvIGZpbGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3IgOiBEZXNjcmlwdG9yQmFzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEVudW1EZXNjcmlwdG9yIGVudW1EZXNjcmlwdG9yOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBwcm90bzsKLQotICAgICAgICBpbnRlcm5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3IgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvciBwYXJlbnQsIGludCBpbmRleCkKLSAgICAgICAgICAgIDogYmFzZShmaWxlLCBwYXJlbnQuRnVsbE5hbWUgKyAiLiIgKyBwcm90by5OYW1lLCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgICAgICAgICAgZW51bURlc2NyaXB0b3IgPSBwYXJlbnQ7Ci0gICAgICAgICAgICBmaWxlLkRlc2NyaXB0b3JQb29sLkFkZFN5bWJvbCh0aGlzKTsKLSAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkRW51bVZhbHVlQnlOdW1iZXIodGhpcyk7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnRlcm5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gUHJvdG8geyBnZXQgeyByZXR1cm4gcHJvdG87IH0gfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGVudW0gdmFsdWUgZGVzY3JpYmVkIGJ5IHRoaXMgb2JqZWN0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIE5hbWUgeyBnZXQgeyByZXR1cm4gcHJvdG8uTmFtZTsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgbnVtYmVyIGFzc29jaWF0ZWQgd2l0aCB0aGlzIGVudW0gdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBpbnQgTnVtYmVyIHsgZ2V0IHsgcmV0dXJuIFByb3RvLk51bWJlcjsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZW51bSBkZXNjcmlwdG9yIHRoYXQgdGhpcyB2YWx1ZSBpcyBwYXJ0IG9mLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRW51bURlc2NyaXB0b3IgRW51bURlc2NyaXB0b3IgeyBnZXQgeyByZXR1cm4gZW51bURlc2NyaXB0b3I7IH0gfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0ZpZWxkQWNjZXNzb3JCYXNlLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9GaWVsZEFjY2Vzc29yQmFzZS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODJjZTUwNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0ZpZWxkQWNjZXNzb3JCYXNlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLlJlZmxlY3Rpb247Ci11c2luZyBHb29nbGUuUHJvdG9idWYuQ29tcGF0aWJpbGl0eTsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBCYXNlIGNsYXNzIGZvciBmaWVsZCBhY2Nlc3NvcnMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBhYnN0cmFjdCBjbGFzcyBGaWVsZEFjY2Vzc29yQmFzZSA6IElGaWVsZEFjY2Vzc29yCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8SU1lc3NhZ2UsIG9iamVjdD4gZ2V0VmFsdWVEZWxlZ2F0ZTsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgICAgICBpbnRlcm5hbCBGaWVsZEFjY2Vzc29yQmFzZShQcm9wZXJ0eUluZm8gcHJvcGVydHksIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICAgICAgZ2V0VmFsdWVEZWxlZ2F0ZSA9IFJlZmxlY3Rpb25VdGlsLkNyZWF0ZUZ1bmNJTWVzc2FnZU9iamVjdChwcm9wZXJ0eS5HZXRHZXRNZXRob2QoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIERlc2NyaXB0b3IgeyBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfSB9Ci0KLSAgICAgICAgcHVibGljIG9iamVjdCBHZXRWYWx1ZShJTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0VmFsdWVEZWxlZ2F0ZShtZXNzYWdlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBhYnN0cmFjdCB2b2lkIENsZWFyKElNZXNzYWdlIG1lc3NhZ2UpOwotICAgICAgICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBTZXRWYWx1ZShJTWVzc2FnZSBtZXNzYWdlLCBvYmplY3QgdmFsdWUpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRmllbGREZXNjcmlwdG9yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9GaWVsZERlc2NyaXB0b3IuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZjNmY2ZWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9GaWVsZERlc2NyaXB0b3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgR29vZ2xlLlByb3RvYnVmLkNvbXBhdGliaWxpdHk7Ci11c2luZyBTeXN0ZW07Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGVzY3JpcHRvciBmb3IgYSBmaWVsZCBvciBleHRlbnNpb24gd2l0aGluIGEgbWVzc2FnZSBpbiBhIC5wcm90byBmaWxlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBGaWVsZERlc2NyaXB0b3IgOiBEZXNjcmlwdG9yQmFzZSwgSUNvbXBhcmFibGU8RmllbGREZXNjcmlwdG9yPgotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlVHlwZTsKLSAgICAgICAgcHJpdmF0ZSBGaWVsZFR5cGUgZmllbGRUeXBlOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IHN0cmluZyBwcm9wZXJ0eU5hbWU7IC8vIEFubm95aW5nbHksIG5lZWRlZCBpbiBDcm9zc2xpbmsuCi0gICAgICAgIHByaXZhdGUgSUZpZWxkQWNjZXNzb3IgYWNjZXNzb3I7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0IHRoZSBmaWVsZCdzIGNvbnRhaW5pbmcgbWVzc2FnZSB0eXBlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgTWVzc2FnZURlc2NyaXB0b3IgQ29udGFpbmluZ1R5cGUgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBvbmVvZiBjb250YWluaW5nIHRoaXMgZmllbGQsIG9yIDxjPm51bGw8L2M+IGlmIGl0IGlzIG5vdCBwYXJ0IG9mIGEgb25lb2YuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBPbmVvZkRlc2NyaXB0b3IgQ29udGFpbmluZ09uZW9mIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGVmZmVjdGl2ZSBKU09OIG5hbWUgZm9yIHRoaXMgZmllbGQuIFRoaXMgaXMgdXN1YWxseSB0aGUgbG93ZXItY2FtZWwtY2FzZWQgZm9ybSBvZiB0aGUgZmllbGQgbmFtZSwKLSAgICAgICAgLy8vIGJ1dCBjYW4gYmUgb3ZlcnJpZGRlbiB1c2luZyB0aGUgPGM+anNvbl9uYW1lPC9jPiBvcHRpb24gaW4gdGhlIC5wcm90byBmaWxlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RyaW5nIEpzb25OYW1lIHsgZ2V0OyB9Ci0KLSAgICAgICAgaW50ZXJuYWwgRmllbGREZXNjcmlwdG9yUHJvdG8gUHJvdG8geyBnZXQ7IH0KLQotICAgICAgICBpbnRlcm5hbCBGaWVsZERlc2NyaXB0b3IoRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRGVzY3JpcHRvciBwYXJlbnQsIGludCBpbmRleCwgc3RyaW5nIHByb3BlcnR5TmFtZSkKLSAgICAgICAgICAgIDogYmFzZShmaWxlLCBmaWxlLkNvbXB1dGVGdWxsTmFtZShwYXJlbnQsIHByb3RvLk5hbWUpLCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG8gPSBwcm90bzsKLSAgICAgICAgICAgIGlmIChwcm90by5UeXBlICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgZmllbGRUeXBlID0gR2V0RmllbGRUeXBlRnJvbVByb3RvVHlwZShwcm90by5UeXBlKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKEZpZWxkTnVtYmVyIDw9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsICJGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBDb250YWluaW5nVHlwZSA9IHBhcmVudDsKLSAgICAgICAgICAgIC8vIE9uZW9mSW5kZXggImRlZmF1bHRzIiB0byAtMSBkdWUgdG8gYSBoYWNrIGluIEZpZWxkRGVzY3JpcHRvci5PbkNvbnN0cnVjdGlvbi4KLSAgICAgICAgICAgIGlmIChwcm90by5PbmVvZkluZGV4ICE9IC0xKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChwcm90by5PbmVvZkluZGV4IDwgMCB8fCBwcm90by5PbmVvZkluZGV4ID49IHBhcmVudC5Qcm90by5PbmVvZkRlY2wuQ291bnQpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICAgICAgICAgICAgICQiRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXggaXMgb3V0IG9mIHJhbmdlIGZvciB0eXBlIHtwYXJlbnQuTmFtZX0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgQ29udGFpbmluZ09uZW9mID0gcGFyZW50Lk9uZW9mc1twcm90by5PbmVvZkluZGV4XTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZmlsZS5EZXNjcmlwdG9yUG9vbC5BZGRTeW1ib2wodGhpcyk7Ci0gICAgICAgICAgICAvLyBXZSBjYW4ndCBjcmVhdGUgdGhlIGFjY2Vzc29yIHVudGlsIHdlJ3ZlIGNyb3NzLWxpbmtlZCwgdW5mb3J0dW5hdGVseSwgYXMgd2UKLSAgICAgICAgICAgIC8vIG1heSBub3Qga25vdyB3aGV0aGVyIHRoZSB0eXBlIG9mIHRoZSBmaWVsZCBpcyBhIG1hcCBvciBub3QuIFJlbWVtYmVyIHRoZSBwcm9wZXJ0eSBuYW1lCi0gICAgICAgICAgICAvLyBmb3IgbGF0ZXIuCi0gICAgICAgICAgICAvLyBXZSBjb3VsZCB0cnVzdCB0aGUgZ2VuZXJhdGVkIGNvZGUgYW5kIGNoZWNrIHdoZXRoZXIgdGhlIHR5cGUgb2YgdGhlIHByb3BlcnR5IGlzCi0gICAgICAgICAgICAvLyBhIE1hcEZpZWxkLCBidXQgdGhhdCBmZWVscyBhIHRhZCBuYXN0eS4KLSAgICAgICAgICAgIHRoaXMucHJvcGVydHlOYW1lID0gcHJvcGVydHlOYW1lOwotICAgICAgICAgICAgSnNvbk5hbWUgPSAgUHJvdG8uSnNvbk5hbWUgPT0gIiIgPyBKc29uRm9ybWF0dGVyLlRvQ2FtZWxDYXNlKFByb3RvLk5hbWUpIDogUHJvdG8uSnNvbk5hbWU7Ci0gICAgICAgIH0KLSAgICAKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgYnJpZWYgbmFtZSBvZiB0aGUgZGVzY3JpcHRvcidzIHRhcmdldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBOYW1lID0+IFByb3RvLk5hbWU7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgYWNjZXNzb3IgZm9yIHRoaXMgZmllbGQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhPgotICAgICAgICAvLy8gV2hpbGUgYSA8c2VlIGNyZWY9IkZpZWxkRGVzY3JpcHRvciIvPiBkZXNjcmliZXMgdGhlIGZpZWxkLCBpdCBkb2VzIG5vdCBwcm92aWRlCi0gICAgICAgIC8vLyBhbnkgd2F5IG9mIG9idGFpbmluZyBvciBjaGFuZ2luZyB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkIHdpdGhpbiBhIHNwZWNpZmljIG1lc3NhZ2U7Ci0gICAgICAgIC8vLyB0aGF0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgYWNjZXNzb3IuCi0gICAgICAgIC8vLyA8L3BhcmE+Ci0gICAgICAgIC8vLyA8cGFyYT4KLSAgICAgICAgLy8vIFRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIHByb3BlcnR5IHdpbGwgYmUgbm9uLW51bGwgZm9yIGFsbCByZWd1bGFyIGZpZWxkcy4gSG93ZXZlciwKLSAgICAgICAgLy8vIGlmIGEgbWVzc2FnZSBjb250YWluaW5nIGEgbWFwIGZpZWxkIGlzIGludHJvc3BlY3RlZCwgdGhlIGxpc3Qgb2YgbmVzdGVkIG1lc3NhZ2VzIHdpbGwgaW5jbHVkZQotICAgICAgICAvLy8gYW4gYXV0by1nZW5lcmF0ZWQgbmVzdGVkIGtleS92YWx1ZSBwYWlyIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZC4gVGhpcyBpcyBub3QgcmVwcmVzZW50ZWQgaW4gYW55Ci0gICAgICAgIC8vLyBnZW5lcmF0ZWQgdHlwZSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGUgbWFwIGZpZWxkIGl0c2VsZiBpcyByZXByZXNlbnRlZCBieSBhIGRpY3Rpb25hcnkgaW4gdGhlCi0gICAgICAgIC8vLyByZWZsZWN0aW9uIEFQSS4gVGhlcmUgYXJlIG5ldmVyIGluc3RhbmNlcyBvZiB0aG9zZSAiaGlkZGVuIiBtZXNzYWdlcywgc28gbm8gYWNjZXNzb3IgaXMgcHJvdmlkZWQKLSAgICAgICAgLy8vIGFuZCB0aGlzIHByb3BlcnR5IHdpbGwgcmV0dXJuIG51bGwuCi0gICAgICAgIC8vLyA8L3BhcmE+Ci0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIHB1YmxpYyBJRmllbGRBY2Nlc3NvciBBY2Nlc3NvciA9PiBhY2Nlc3NvcjsKLSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1hcHMgYSBmaWVsZCB0eXBlIGFzIGluY2x1ZGVkIGluIHRoZSAucHJvdG8gZmlsZSB0byBhIEZpZWxkVHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgRmllbGRUeXBlIEdldEZpZWxkVHlwZUZyb21Qcm90b1R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZSB0eXBlKQotICAgICAgICB7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLkRvdWJsZToKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5Eb3VibGU7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLkZsb2F0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLkZsb2F0OwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5JbnQ2NDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5JbnQ2NDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuVWludDY0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLlVJbnQ2NDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuSW50MzI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuSW50MzI7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLkZpeGVkNjQ6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuRml4ZWQ2NDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuRml4ZWQzMjoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5GaXhlZDMyOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5Cb29sOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLkJvb2w7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlN0cmluZzoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5TdHJpbmc7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLkdyb3VwOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLkdyb3VwOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5NZXNzYWdlOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLk1lc3NhZ2U7Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLkJ5dGVzOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLkJ5dGVzOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5VaW50MzI6Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBGaWVsZFR5cGUuVUludDMyOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5FbnVtOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLkVudW07Ci0gICAgICAgICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlcy5UeXBlLlNmaXhlZDMyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLlNGaXhlZDMyOwotICAgICAgICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZXMuVHlwZS5TZml4ZWQ2NDoKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZpZWxkVHlwZS5TRml4ZWQ2NDsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuU2ludDMyOgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLlNJbnQzMjsKLSAgICAgICAgICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLlR5cGUuU2ludDY0OgotICAgICAgICAgICAgICAgICAgICByZXR1cm4gRmllbGRUeXBlLlNJbnQ2NDsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkludmFsaWQgdHlwZSBzcGVjaWZpZWQiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgPGM+dHJ1ZTwvYz4gaWYgdGhpcyBmaWVsZCBpcyBhIHJlcGVhdGVkIGZpZWxkOyA8Yz5mYWxzZTwvYz4gb3RoZXJ3aXNlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgYm9vbCBJc1JlcGVhdGVkID0+IFByb3RvLkxhYmVsID09IEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVzLkxhYmVsLlJlcGVhdGVkOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgPGM+dHJ1ZTwvYz4gaWYgdGhpcyBmaWVsZCBpcyBhIG1hcCBmaWVsZDsgPGM+ZmFsc2U8L2M+IG90aGVyd2lzZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGJvb2wgSXNNYXAgPT4gZmllbGRUeXBlID09IEZpZWxkVHlwZS5NZXNzYWdlICYmIG1lc3NhZ2VUeXBlLlByb3RvLk9wdGlvbnMgIT0gbnVsbCAmJiBtZXNzYWdlVHlwZS5Qcm90by5PcHRpb25zLk1hcEVudHJ5OwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgPGM+dHJ1ZTwvYz4gaWYgdGhpcyBmaWVsZCBpcyBhIHBhY2tlZCwgcmVwZWF0ZWQgZmllbGQ7IDxjPmZhbHNlPC9jPiBvdGhlcndpc2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBib29sIElzUGFja2VkID0+IAotICAgICAgICAgICAgLy8gTm90ZSB0aGUgfHwgcmF0aGVyIHRoYW4gJiYgaGVyZSAtIHdlJ3JlIGVmZmVjdGl2ZWx5IGRlZmF1bHRpbmcgdG8gcGFja2VkLCBiZWNhdXNlIHRoYXQgKmlzKgotICAgICAgICAgICAgLy8gdGhlIGRlZmF1bHQgaW4gcHJvdG8zLCB3aGljaCBpcyBhbGwgd2Ugc3VwcG9ydC4gV2UgbWF5IGdpdmUgdGhlIHdyb25nIHJlc3VsdCBmb3IgdGhlIHByb3RvcwotICAgICAgICAgICAgLy8gd2l0aGluIGRlc2NyaXB0b3IucHJvdG8sIGJ1dCB0aGF0J3Mgb2theSwgYXMgdGhleSdyZSBuZXZlciBleHBvc2VkIGFuZCB3ZSBkb24ndCB1c2UgSXNQYWNrZWQKLSAgICAgICAgICAgIC8vIHdpdGhpbiB0aGUgcnVudGltZS4KLSAgICAgICAgICAgIFByb3RvLk9wdGlvbnMgPT0gbnVsbCB8fCBQcm90by5PcHRpb25zLlBhY2tlZDsKLSAgICAgICAgCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgRmllbGRUeXBlIEZpZWxkVHlwZSA9PiBmaWVsZFR5cGU7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZmllbGQgbnVtYmVyIGRlY2xhcmVkIGluIHRoZSBwcm90byBmaWxlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IEZpZWxkTnVtYmVyID0+IFByb3RvLk51bWJlcjsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wYXJlcyB0aGlzIGRlc2NyaXB0b3Igd2l0aCBhbm90aGVyIG9uZSwgb3JkZXJpbmcgaW4gImNhbm9uaWNhbCIgb3JkZXIKLSAgICAgICAgLy8vIHdoaWNoIHNpbXBseSBtZWFucyBhc2NlbmRpbmcgb3JkZXIgYnkgZmllbGQgbnVtYmVyLiA8cGFyYW1yZWYgbmFtZT0ib3RoZXIiLz4KLSAgICAgICAgLy8vIG11c3QgYmUgYSBmaWVsZCBvZiB0aGUgc2FtZSB0eXBlLCBpLmUuIHRoZSA8c2VlIGNyZWY9IkNvbnRhaW5pbmdUeXBlIi8+IG9mCi0gICAgICAgIC8vLyBib3RoIGZpZWxkcyBtdXN0IGJlIHRoZSBzYW1lLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgaW50IENvbXBhcmVUbyhGaWVsZERlc2NyaXB0b3Igb3RoZXIpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChvdGhlci5Db250YWluaW5nVHlwZSAhPSBDb250YWluaW5nVHlwZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkZpZWxkRGVzY3JpcHRvcnMgY2FuIG9ubHkgYmUgY29tcGFyZWQgdG8gb3RoZXIgRmllbGREZXNjcmlwdG9ycyAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvciBmaWVsZHMgb2YgdGhlIHNhbWUgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIEZpZWxkTnVtYmVyIC0gb3RoZXIuRmllbGROdW1iZXI7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGb3IgZW51bSBmaWVsZHMsIHJldHVybnMgdGhlIGZpZWxkJ3MgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEVudW1EZXNjcmlwdG9yIEVudW1UeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaWVsZFR5cGUgIT0gRmllbGRUeXBlLkVudW0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiRW51bVR5cGUgaXMgb25seSB2YWxpZCBmb3IgZW51bSBmaWVsZHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBlbnVtVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZvciBlbWJlZGRlZCBtZXNzYWdlIGFuZCBncm91cCBmaWVsZHMsIHJldHVybnMgdGhlIGZpZWxkJ3MgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIE1lc3NhZ2VEZXNjcmlwdG9yIE1lc3NhZ2VUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaWVsZFR5cGUgIT0gRmllbGRUeXBlLk1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTWVzc2FnZVR5cGUgaXMgb25seSB2YWxpZCBmb3IgbWVzc2FnZSBmaWVsZHMuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlVHlwZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIExvb2sgdXAgYW5kIGNyb3NzLWxpbmsgYWxsIGZpZWxkIHR5cGVzIGV0Yy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgdm9pZCBDcm9zc0xpbmsoKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoUHJvdG8uVHlwZU5hbWUgIT0gIiIpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgSURlc2NyaXB0b3IgdHlwZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgICAgICAgICBGaWxlLkRlc2NyaXB0b3JQb29sLkxvb2t1cFN5bWJvbChQcm90by5UeXBlTmFtZSwgdGhpcyk7Ci0KLSAgICAgICAgICAgICAgICBpZiAoUHJvdG8uVHlwZSAhPSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gQ2hvb3NlIGZpZWxkIHR5cGUgYmFzZWQgb24gc3ltYm9sLgotICAgICAgICAgICAgICAgICAgICBpZiAodHlwZURlc2NyaXB0b3IgaXMgTWVzc2FnZURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkVHlwZSA9IEZpZWxkVHlwZS5NZXNzYWdlOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHR5cGVEZXNjcmlwdG9yIGlzIEVudW1EZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBmaWVsZFR5cGUgPSBGaWVsZFR5cGUuRW51bTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAkIlwie1Byb3RvLlR5cGVOYW1lfVwiIGlzIG5vdCBhIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoZmllbGRUeXBlID09IEZpZWxkVHlwZS5NZXNzYWdlKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCEodHlwZURlc2NyaXB0b3IgaXMgTWVzc2FnZURlc2NyaXB0b3IpKQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgJCJcIntQcm90by5UeXBlTmFtZX1cIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZVR5cGUgPSAoTWVzc2FnZURlc2NyaXB0b3IpIHR5cGVEZXNjcmlwdG9yOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChQcm90by5EZWZhdWx0VmFsdWUgIT0gIiIpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAiTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlIGlmIChmaWVsZFR5cGUgPT0gRmllbGRUeXBlLkVudW0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBpZiAoISh0eXBlRGVzY3JpcHRvciBpcyBFbnVtRGVzY3JpcHRvcikpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAkIlwie1Byb3RvLlR5cGVOYW1lfVwiIGlzIG5vdCBhbiBlbnVtIHR5cGUuIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgZW51bVR5cGUgPSAoRW51bURlc2NyaXB0b3IpIHR5cGVEZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIkZpZWxkIHdpdGggcHJpbWl0aXZlIHR5cGUgaGFzIHR5cGVfbmFtZS4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkVHlwZSA9PSBGaWVsZFR5cGUuTWVzc2FnZSB8fCBmaWVsZFR5cGUgPT0gRmllbGRUeXBlLkVudW0pCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIkZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyB0eXBlX25hbWUuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3RlOiBubyBhdHRlbXB0IHRvIHBlcmZvcm0gYW55IGRlZmF1bHQgdmFsdWUgcGFyc2luZwotCi0gICAgICAgICAgICBGaWxlLkRlc2NyaXB0b3JQb29sLkFkZEZpZWxkQnlOdW1iZXIodGhpcyk7Ci0KLSAgICAgICAgICAgIGlmIChDb250YWluaW5nVHlwZSAhPSBudWxsICYmIENvbnRhaW5pbmdUeXBlLlByb3RvLk9wdGlvbnMgIT0gbnVsbCAmJiBDb250YWluaW5nVHlwZS5Qcm90by5PcHRpb25zLk1lc3NhZ2VTZXRXaXJlRm9ybWF0KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAiTWVzc2FnZVNldCBmb3JtYXQgaXMgbm90IHN1cHBvcnRlZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGFjY2Vzc29yID0gQ3JlYXRlQWNjZXNzb3IoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgSUZpZWxkQWNjZXNzb3IgQ3JlYXRlQWNjZXNzb3IoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBJZiB3ZSdyZSBnaXZlbiBubyBwcm9wZXJ0eSBuYW1lLCB0aGF0J3MgYmVjYXVzZSB3ZSByZWFsbHkgZG9uJ3Qgd2FudCBhbiBhY2Nlc3Nvci4KLSAgICAgICAgICAgIC8vIChBdCB0aGUgbW9tZW50LCB0aGF0IG1lYW5zIGl0J3MgYSBtYXAgZW50cnkgbWVzc2FnZS4uLikKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eU5hbWUgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBwcm9wZXJ0eSA9IENvbnRhaW5pbmdUeXBlLkNsclR5cGUuR2V0UHJvcGVydHkocHJvcGVydHlOYW1lKTsKLSAgICAgICAgICAgIGlmIChwcm9wZXJ0eSA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAkIlByb3BlcnR5IHtwcm9wZXJ0eU5hbWV9IG5vdCBmb3VuZCBpbiB7Q29udGFpbmluZ1R5cGUuQ2xyVHlwZX0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBJc01hcCA/IG5ldyBNYXBGaWVsZEFjY2Vzc29yKHByb3BlcnR5LCB0aGlzKQotICAgICAgICAgICAgICAgIDogSXNSZXBlYXRlZCA/IG5ldyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IocHJvcGVydHksIHRoaXMpCi0gICAgICAgICAgICAgICAgOiAoSUZpZWxkQWNjZXNzb3IpIG5ldyBTaW5nbGVGaWVsZEFjY2Vzc29yKHByb3BlcnR5LCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0ZpZWxkVHlwZS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRmllbGRUeXBlLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjU4ZTM0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRmllbGRUeXBlLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTEzICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRW51bWVyYXRpb24gb2YgYWxsIHRoZSBwb3NzaWJsZSBmaWVsZCB0eXBlcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEZpZWxkVHlwZQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIDxjPmRvdWJsZTwvYz4gZmllbGQgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRG91YmxlLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgPGM+ZmxvYXQ8L2M+IGZpZWxkIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEZsb2F0LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgPGM+aW50NjQ8L2M+IGZpZWxkIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEludDY0LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgPGM+dWludDY0PC9jPiBmaWVsZCB0eXBlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBVSW50NjQsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSA8Yz5pbnQzMjwvYz4gZmllbGQgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgSW50MzIsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSA8Yz5maXhlZDY0PC9jPiBmaWVsZCB0eXBlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBGaXhlZDY0LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgPGM+Zml4ZWQzMjwvYz4gZmllbGQgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRml4ZWQzMiwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIDxjPmJvb2w8L2M+IGZpZWxkIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIEJvb2wsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSA8Yz5zdHJpbmc8L2M+IGZpZWxkIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFN0cmluZywKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGZpZWxkIHR5cGUgdXNlZCBmb3IgZ3JvdXBzIChub3Qgc3VwcG9ydGVkIGluIHRoaXMgaW1wbGVtZW50YXRpb24pLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBHcm91cCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGZpZWxkIHR5cGUgdXNlZCBmb3IgbWVzc2FnZSBmaWVsZHMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIE1lc3NhZ2UsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSA8Yz5ieXRlczwvYz4gZmllbGQgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgQnl0ZXMsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSA8Yz51aW50MzI8L2M+IGZpZWxkIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFVJbnQzMiwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIDxjPnNmaXhlZDMyPC9jPiBmaWVsZCB0eXBlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBTRml4ZWQzMiwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIDxjPnNmaXhlZDY0PC9jPiBmaWVsZCB0eXBlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBTRml4ZWQ2NCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIDxjPnNpbnQzMjwvYz4gZmllbGQgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgU0ludDMyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgPGM+c2ludDY0PC9jPiBmaWVsZCB0eXBlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBTSW50NjQsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBmaWVsZCB0eXBlIHVzZWQgZm9yIGVudW0gZmllbGRzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBFbnVtCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRmlsZURlc2NyaXB0b3IuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0ZpbGVEZXNjcmlwdG9yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYjdjZDkyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vRmlsZURlc2NyaXB0b3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwzNDQgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuT2JqZWN0TW9kZWw7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGVzY3JpYmVzIGEgLnByb3RvIGZpbGUsIGluY2x1ZGluZyBldmVyeXRoaW5nIGRlZmluZWQgd2l0aGluLgotICAgIC8vLyBJRGVzY3JpcHRvciBpcyBpbXBsZW1lbnRlZCBzdWNoIHRoYXQgdGhlIEZpbGUgcHJvcGVydHkgcmV0dXJucyB0aGlzIGRlc2NyaXB0b3IsCi0gICAgLy8vIGFuZCB0aGUgRnVsbE5hbWUgaXMgdGhlIHNhbWUgYXMgdGhlIE5hbWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEZpbGVEZXNjcmlwdG9yIDogSURlc2NyaXB0b3IKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3IoQnl0ZVN0cmluZyBkZXNjcmlwdG9yRGF0YSwgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsIERlc2NyaXB0b3JQb29sIHBvb2wsIGJvb2wgYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzLCBHZW5lcmF0ZWRDbHJUeXBlSW5mbyBnZW5lcmF0ZWRDb2RlSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgU2VyaWFsaXplZERhdGEgPSBkZXNjcmlwdG9yRGF0YTsKLSAgICAgICAgICAgIERlc2NyaXB0b3JQb29sID0gcG9vbDsKLSAgICAgICAgICAgIFByb3RvID0gcHJvdG87Ci0gICAgICAgICAgICBEZXBlbmRlbmNpZXMgPSBuZXcgUmVhZE9ubHlDb2xsZWN0aW9uPEZpbGVEZXNjcmlwdG9yPigoRmlsZURlc2NyaXB0b3JbXSkgZGVwZW5kZW5jaWVzLkNsb25lKCkpOwotCi0gICAgICAgICAgICBQdWJsaWNEZXBlbmRlbmNpZXMgPSBEZXRlcm1pbmVQdWJsaWNEZXBlbmRlbmNpZXModGhpcywgcHJvdG8sIGRlcGVuZGVuY2llcywgYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKTsKLQotICAgICAgICAgICAgcG9vbC5BZGRQYWNrYWdlKFBhY2thZ2UsIHRoaXMpOwotCi0gICAgICAgICAgICBNZXNzYWdlVHlwZXMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLk1lc3NhZ2VUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobWVzc2FnZSwgaW5kZXgpID0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlRGVzY3JpcHRvcihtZXNzYWdlLCB0aGlzLCBudWxsLCBpbmRleCwgZ2VuZXJhdGVkQ29kZUluZm8uTmVzdGVkVHlwZXNbaW5kZXhdKSk7Ci0KLSAgICAgICAgICAgIEVudW1UeXBlcyA9IERlc2NyaXB0b3JVdGlsLkNvbnZlcnRBbmRNYWtlUmVhZE9ubHkocHJvdG8uRW51bVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChlbnVtVHlwZSwgaW5kZXgpID0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5ldyBFbnVtRGVzY3JpcHRvcihlbnVtVHlwZSwgdGhpcywgbnVsbCwgaW5kZXgsIGdlbmVyYXRlZENvZGVJbmZvLk5lc3RlZEVudW1zW2luZGV4XSkpOwotCi0gICAgICAgICAgICBTZXJ2aWNlcyA9IERlc2NyaXB0b3JVdGlsLkNvbnZlcnRBbmRNYWtlUmVhZE9ubHkocHJvdG8uU2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2VydmljZSwgaW5kZXgpID0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IFNlcnZpY2VEZXNjcmlwdG9yKHNlcnZpY2UsIHRoaXMsIGluZGV4KSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb21wdXRlcyB0aGUgZnVsbCBuYW1lIG9mIGEgZGVzY3JpcHRvciB3aXRoaW4gdGhpcyBmaWxlLCB3aXRoIGFuIG9wdGlvbmFsIHBhcmVudCBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdHJpbmcgQ29tcHV0ZUZ1bGxOYW1lKE1lc3NhZ2VEZXNjcmlwdG9yIHBhcmVudCwgc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gcGFyZW50LkZ1bGxOYW1lICsgIi4iICsgbmFtZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChQYWNrYWdlLkxlbmd0aCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIFBhY2thZ2UgKyAiLiIgKyBuYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBFeHRyYWN0cyBwdWJsaWMgZGVwZW5kZW5jaWVzIGZyb20gZGlyZWN0IGRlcGVuZGVuY2llcy4gVGhpcyBpcyBhIHN0YXRpYyBtZXRob2QgZGVzcGl0ZSBpdHMKLSAgICAgICAgLy8vIGZpcnN0IHBhcmFtZXRlciwgYXMgdGhlIHZhbHVlIHdlJ3JlIGluIHRoZSBtaWRkbGUgb2YgY29uc3RydWN0aW5nIGlzIG9ubHkgdXNlZCBmb3IgZXhjZXB0aW9ucy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgSUxpc3Q8RmlsZURlc2NyaXB0b3I+IERldGVybWluZVB1YmxpY0RlcGVuZGVuY2llcyhGaWxlRGVzY3JpcHRvciBAdGhpcywgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsIGJvb2wgYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbmFtZVRvRmlsZU1hcCA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgRmlsZURlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZmlsZSBpbiBkZXBlbmRlbmNpZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZVRvRmlsZU1hcFtmaWxlLk5hbWVdID0gZmlsZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBwdWJsaWNEZXBlbmRlbmNpZXMgPSBuZXcgTGlzdDxGaWxlRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uUHVibGljRGVwZW5kZW5jeS5Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGludCBpbmRleCA9IHByb3RvLlB1YmxpY0RlcGVuZGVuY3lbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwcm90by5EZXBlbmRlbmN5LkNvdW50KQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKEB0aGlzLCAiSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgc3RyaW5nIG5hbWUgPSBwcm90by5EZXBlbmRlbmN5W2luZGV4XTsKLSAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlID0gbmFtZVRvRmlsZU1hcFtuYW1lXTsKLSAgICAgICAgICAgICAgICBpZiAoZmlsZSA9PSBudWxsKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgaWYgKCFhbGxvd1Vua25vd25EZXBlbmRlbmNpZXMpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihAdGhpcywgIkludmFsaWQgcHVibGljIGRlcGVuZGVuY3k6ICIgKyBuYW1lKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAvLyBJZ25vcmUgdW5rbm93biBkZXBlbmRlbmNpZXMuCi0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHB1YmxpY0RlcGVuZGVuY2llcy5BZGQoZmlsZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZWFkT25seUNvbGxlY3Rpb248RmlsZURlc2NyaXB0b3I+KHB1YmxpY0RlcGVuZGVuY2llcyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAvLy8gVGhlIGRlc2NyaXB0b3IgaW4gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBpbnRlcm5hbCBGaWxlRGVzY3JpcHRvclByb3RvIFByb3RvIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBmaWxlIG5hbWUuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUgPT4gUHJvdG8uTmFtZTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgcGFja2FnZSBhcyBkZWNsYXJlZCBpbiB0aGUgLnByb3RvIGZpbGUuIFRoaXMgbWF5IG9yIG1heSBub3QKLSAgICAgICAgLy8vIGJlIGVxdWl2YWxlbnQgdG8gdGhlIC5ORVQgbmFtZXNwYWNlIG9mIHRoZSBnZW5lcmF0ZWQgY2xhc3Nlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBQYWNrYWdlID0+IFByb3RvLlBhY2thZ2U7Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFVubW9kaWZpYWJsZSBsaXN0IG9mIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBJTGlzdDxNZXNzYWdlRGVzY3JpcHRvcj4gTWVzc2FnZVR5cGVzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFVubW9kaWZpYWJsZSBsaXN0IG9mIHRvcC1sZXZlbCBlbnVtIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBJTGlzdDxFbnVtRGVzY3JpcHRvcj4gRW51bVR5cGVzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFVubW9kaWZpYWJsZSBsaXN0IG9mIHRvcC1sZXZlbCBzZXJ2aWNlcyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgSUxpc3Q8U2VydmljZURlc2NyaXB0b3I+IFNlcnZpY2VzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFVubW9kaWZpYWJsZSBsaXN0IG9mIHRoaXMgZmlsZSdzIGRlcGVuZGVuY2llcyAoaW1wb3J0cykuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgSUxpc3Q8RmlsZURlc2NyaXB0b3I+IERlcGVuZGVuY2llcyB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBVbm1vZGlmaWFibGUgbGlzdCBvZiB0aGlzIGZpbGUncyBwdWJsaWMgZGVwZW5kZW5jaWVzIChwdWJsaWMgaW1wb3J0cykuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgSUxpc3Q8RmlsZURlc2NyaXB0b3I+IFB1YmxpY0RlcGVuZGVuY2llcyB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBUaGUgb3JpZ2luYWwgc2VyaWFsaXplZCBiaW5hcnkgZm9ybSBvZiB0aGlzIGRlc2NyaXB0b3IuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgQnl0ZVN0cmluZyBTZXJpYWxpemVkRGF0YSB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBJbXBsZW1lbnRhdGlvbiBvZiBJRGVzY3JpcHRvci5GdWxsTmFtZSAtIGp1c3QgcmV0dXJucyB0aGUgc2FtZSBhcyBOYW1lLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgc3RyaW5nIElEZXNjcmlwdG9yLkZ1bGxOYW1lID0+IE5hbWU7Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIEltcGxlbWVudGF0aW9uIG9mIElEZXNjcmlwdG9yLkZpbGUgLSBqdXN0IHJldHVybnMgdGhpcyBkZXNjcmlwdG9yLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgRmlsZURlc2NyaXB0b3IgSURlc2NyaXB0b3IuRmlsZSA9PiB0aGlzOwotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBQb29sIGNvbnRhaW5pbmcgc3ltYm9sIGRlc2NyaXB0b3JzLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgaW50ZXJuYWwgRGVzY3JpcHRvclBvb2wgRGVzY3JpcHRvclBvb2wgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaW5kcyBhIHR5cGUgKG1lc3NhZ2UsIGVudW0sIHNlcnZpY2Ugb3IgZXh0ZW5zaW9uKSBpbiB0aGUgZmlsZSBieSBuYW1lLiBEb2VzIG5vdCBmaW5kIG5lc3RlZCB0eXBlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW1lIj5UaGUgdW5xdWFsaWZpZWQgdHlwZSBuYW1lIHRvIGxvb2sgZm9yLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8dHlwZXBhcmFtIG5hbWU9IlQiPlRoZSB0eXBlIG9mIGRlc2NyaXB0b3IgdG8gbG9vayBmb3I8L3R5cGVwYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB0eXBlJ3MgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgVCBGaW5kVHlwZUJ5TmFtZTxUPihTdHJpbmcgbmFtZSkKLSAgICAgICAgICAgIHdoZXJlIFQgOiBjbGFzcywgSURlc2NyaXB0b3IKLSAgICAgICAgewotICAgICAgICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9va2luZyB1cCBuZXN0ZWQgdHlwZXMuICBUaGlzIHdpbGwgbWFrZSBvcHRpbWl6YXRpb24KLSAgICAgICAgICAgIC8vIGVhc2llciBsYXRlci4KLSAgICAgICAgICAgIGlmIChuYW1lLkluZGV4T2YoJy4nKSAhPSAtMSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChQYWNrYWdlLkxlbmd0aCA+IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFtZSA9IFBhY2thZ2UgKyAiLiIgKyBuYW1lOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgVCByZXN1bHQgPSBEZXNjcmlwdG9yUG9vbC5GaW5kU3ltYm9sPFQ+KG5hbWUpOwotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdC5GaWxlID09IHRoaXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQnVpbGRzIGEgRmlsZURlc2NyaXB0b3IgZnJvbSBpdHMgcHJvdG9jb2wgYnVmZmVyIHJlcHJlc2VudGF0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRlc2NyaXB0b3JEYXRhIj5UaGUgb3JpZ2luYWwgc2VyaWFsaXplZCBkZXNjcmlwdG9yIGRhdGEuCi0gICAgICAgIC8vLyBXZSBoYXZlIG9ubHkgbGltaXRlZCBwcm90bzIgc3VwcG9ydCwgc28gc2VyaWFsaXppbmcgRmlsZURlc2NyaXB0b3JQcm90bwotICAgICAgICAvLy8gd291bGQgbm90IG5lY2Vzc2FyaWx5IGdpdmUgdXMgdGhpcy48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InByb3RvIj5UaGUgcHJvdG9jb2wgbWVzc2FnZSBmb3JtIG9mIHRoZSBGaWxlRGVzY3JpcHRvci48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRlcGVuZGVuY2llcyI+RmlsZURlc2NyaXB0b3JzIGNvcnJlc3BvbmRpbmcgdG8gYWxsIG9mIHRoZQotICAgICAgICAvLy8gZmlsZSdzIGRlcGVuZGVuY2llcywgaW4gdGhlIGV4YWN0IG9yZGVyIGxpc3RlZCBpbiB0aGUgLnByb3RvIGZpbGUuIE1heSBiZSBudWxsLAotICAgICAgICAvLy8gaW4gd2hpY2ggY2FzZSBpdCBpcyB0cmVhdGVkIGFzIGFuIGVtcHR5IGFycmF5LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzIj5XaGV0aGVyIHVua25vd24gZGVwZW5kZW5jaWVzIGFyZSBpZ25vcmVkICh0cnVlKSBvciBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duIChmYWxzZSkuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJnZW5lcmF0ZWRDb2RlSW5mbyI+RGV0YWlscyBhYm91dCBnZW5lcmF0ZWQgY29kZSwgZm9yIHRoZSBwdXJwb3NlcyBvZiByZWZsZWN0aW9uLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIj5JZiA8cGFyYW1yZWYgbmFtZT0icHJvdG8iLz4gaXMgbm90Ci0gICAgICAgIC8vLyBhIHZhbGlkIGRlc2NyaXB0b3IuIFRoaXMgY2FuIG9jY3VyIGZvciBhIG51bWJlciBvZiByZWFzb25zLCBzdWNoIGFzIGEgZmllbGQKLSAgICAgICAgLy8vIGhhdmluZyBhbiB1bmRlZmluZWQgdHlwZSBvciBiZWNhdXNlIHR3byBtZXNzYWdlcyB3ZXJlIGRlZmluZWQgd2l0aCB0aGUgc2FtZSBuYW1lLjwvZXhjZXB0aW9uPgotICAgICAgICBwcml2YXRlIHN0YXRpYyBGaWxlRGVzY3JpcHRvciBCdWlsZEZyb20oQnl0ZVN0cmluZyBkZXNjcmlwdG9yRGF0YSwgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsIGJvb2wgYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzLCBHZW5lcmF0ZWRDbHJUeXBlSW5mbyBnZW5lcmF0ZWRDb2RlSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gQnVpbGRpbmcgZGVzY3JpcHRvcnMgaW52b2x2ZXMgdHdvIHN0ZXBzOiB0cmFuc2xhdGluZyBhbmQgbGlua2luZy4KLSAgICAgICAgICAgIC8vIEluIHRoZSB0cmFuc2xhdGlvbiBzdGVwIChpbXBsZW1lbnRlZCBieSBGaWxlRGVzY3JpcHRvcidzCi0gICAgICAgICAgICAvLyBjb25zdHJ1Y3RvciksIHdlIGJ1aWxkIGFuIG9iamVjdCB0cmVlIG1pcnJvcmluZyB0aGUKLSAgICAgICAgICAgIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG8ncyB0cmVlIGFuZCBwdXQgYWxsIG9mIHRoZSBkZXNjcmlwdG9ycyBpbnRvIHRoZQotICAgICAgICAgICAgLy8gRGVzY3JpcHRvclBvb2wncyBsb29rdXAgdGFibGVzLiAgSW4gdGhlIGxpbmtpbmcgc3RlcCwgd2UgbG9vayB1cCBhbGwKLSAgICAgICAgICAgIC8vIHR5cGUgcmVmZXJlbmNlcyBpbiB0aGUgRGVzY3JpcHRvclBvb2wsIHNvIHRoYXQsIGZvciBleGFtcGxlLCBhCi0gICAgICAgICAgICAvLyBGaWVsZERlc2NyaXB0b3IgZm9yIGFuIGVtYmVkZGVkIG1lc3NhZ2UgY29udGFpbnMgYSBwb2ludGVyIGRpcmVjdGx5Ci0gICAgICAgICAgICAvLyB0byB0aGUgRGVzY3JpcHRvciBmb3IgdGhhdCBtZXNzYWdlJ3MgdHlwZS4gIFdlIGFsc28gZGV0ZWN0IHVuZGVmaW5lZAotICAgICAgICAgICAgLy8gdHlwZXMgaW4gdGhlIGxpbmtpbmcgc3RlcC4KLSAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXMgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBkZXBlbmRlbmNpZXMgPSBuZXcgRmlsZURlc2NyaXB0b3JbMF07Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIERlc2NyaXB0b3JQb29sIHBvb2wgPSBuZXcgRGVzY3JpcHRvclBvb2woZGVwZW5kZW5jaWVzKTsKLSAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIHJlc3VsdCA9IG5ldyBGaWxlRGVzY3JpcHRvcihkZXNjcmlwdG9yRGF0YSwgcHJvdG8sIGRlcGVuZGVuY2llcywgcG9vbCwgYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzLCBnZW5lcmF0ZWRDb2RlSW5mbyk7Ci0KLSAgICAgICAgICAgIC8vIFZhbGlkYXRlIHRoYXQgdGhlIGRlcGVuZGVuY2llcyB3ZSd2ZSBiZWVuIHBhc3NlZCAoYXMgRmlsZURlc2NyaXB0b3JzKSBhcmUgYWN0dWFsbHkgdGhlIG9uZXMgd2UKLSAgICAgICAgICAgIC8vIG5lZWQuCi0gICAgICAgICAgICBpZiAoZGVwZW5kZW5jaWVzLkxlbmd0aCAhPSBwcm90by5EZXBlbmRlbmN5LkNvdW50KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAiRGVwZW5kZW5jaWVzIHBhc3NlZCB0byBGaWxlRGVzY3JpcHRvci5CdWlsZEZyb20oKSBkb24ndCBtYXRjaCAiICsKLSAgICAgICAgICAgICAgICAgICAgInRob3NlIGxpc3RlZCBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uRGVwZW5kZW5jeS5Db3VudDsgaSsrKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkZXBlbmRlbmNpZXNbaV0uTmFtZSAhPSBwcm90by5EZXBlbmRlbmN5W2ldKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgIkRlcGVuZGVuY2llcyBwYXNzZWQgdG8gRmlsZURlc2NyaXB0b3IuQnVpbGRGcm9tKCkgZG9uJ3QgbWF0Y2ggIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAidGhvc2UgbGlzdGVkIGluIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvLiBFeHBlY3RlZDogIiArCi0gICAgICAgICAgICAgICAgICAgICAgICBwcm90by5EZXBlbmRlbmN5W2ldICsgIiBidXQgd2FzOiAiICsgZGVwZW5kZW5jaWVzW2ldLk5hbWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgcmVzdWx0LkNyb3NzTGluaygpOwotICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgdm9pZCBDcm9zc0xpbmsoKQotICAgICAgICB7Ci0gICAgICAgICAgICBmb3JlYWNoIChNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlIGluIE1lc3NhZ2VUeXBlcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXNzYWdlLkNyb3NzTGluaygpOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBmb3JlYWNoIChTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlIGluIFNlcnZpY2VzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlcnZpY2UuQ3Jvc3NMaW5rKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgZGVzY3JpcHRvciBmb3IgZ2VuZXJhdGVkIGNvZGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFRoaXMgbWV0aG9kIGlzIG9ubHkgZGVzaWduZWQgdG8gYmUgdXNlZCBieSB0aGUgcmVzdWx0cyBvZiBnZW5lcmF0aW5nIGNvZGUgd2l0aCBwcm90b2MsCi0gICAgICAgIC8vLyB3aGljaCBjcmVhdGVzIHRoZSBhcHByb3ByaWF0ZSBkZXBlbmRlbmNpZXMgZXRjLiBJdCBoYXMgdG8gYmUgcHVibGljIGJlY2F1c2UgdGhlIGdlbmVyYXRlZAotICAgICAgICAvLy8gY29kZSBpcyAiZXh0ZXJuYWwiLCBidXQgc2hvdWxkIG5vdCBiZSBjYWxsZWQgZGlyZWN0bHkgYnkgZW5kIHVzZXJzLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yIEZyb21HZW5lcmF0ZWRDb2RlKAotICAgICAgICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhLAotICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsCi0gICAgICAgICAgICBHZW5lcmF0ZWRDbHJUeXBlSW5mbyBnZW5lcmF0ZWRDb2RlSW5mbykKLSAgICAgICAgewotICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5QYXJzZXIuUGFyc2VGcm9tKGRlc2NyaXB0b3JEYXRhKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkZhaWxlZCB0byBwYXJzZSBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvciBmb3IgZ2VuZXJhdGVkIGNvZGUuIiwgZSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHRyeQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFdoZW4gYnVpbGRpbmcgZGVzY3JpcHRvcnMgZm9yIGdlbmVyYXRlZCBjb2RlLCB3ZSBhbGxvdyB1bmtub3duCi0gICAgICAgICAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQuCi0gICAgICAgICAgICAgICAgcmV0dXJuIEJ1aWxkRnJvbShCeXRlU3RyaW5nLkNvcHlGcm9tKGRlc2NyaXB0b3JEYXRhKSwgcHJvdG8sIGRlcGVuZGVuY2llcywgdHJ1ZSwgZ2VuZXJhdGVkQ29kZUluZm8pOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCQiSW52YWxpZCBlbWJlZGRlZCBkZXNjcmlwdG9yIGZvciBcIntwcm90by5OYW1lfVwiLiIsIGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhIDxzZWUgY3JlZj0iU3lzdGVtLlN0cmluZyIgLz4gdGhhdCByZXByZXNlbnRzIHRoaXMgaW5zdGFuY2UuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmV0dXJucz4KLSAgICAgICAgLy8vIEEgPHNlZSBjcmVmPSJTeXN0ZW0uU3RyaW5nIiAvPiB0aGF0IHJlcHJlc2VudHMgdGhpcyBpbnN0YW5jZS4KLSAgICAgICAgLy8vIDwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAkIkZpbGVEZXNjcmlwdG9yIGZvciB7TmFtZX0iOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZmlsZSBkZXNjcmlwdG9yIGZvciBkZXNjcmlwdG9yLnByb3RvLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIGlzIHVzZWQgZm9yIHByb3RvcyB3aGljaCB0YWtlIGEgZGlyZWN0IGRlcGVuZGVuY3kgb24gPGM+ZGVzY3JpcHRvci5wcm90bzwvYz4sIHR5cGljYWxseSBmb3IKLSAgICAgICAgLy8vIGFubm90YXRpb25zLiBXaGlsZSA8Yz5kZXNjcmlwdG9yLnByb3RvPC9jPiBpcyBhIHByb3RvMiBmaWxlLCBpdCBpcyBidWlsdCBpbnRvIHRoZSBHb29nbGUuUHJvdG9idWYKLSAgICAgICAgLy8vIHJ1bnRpbWUgZm9yIHJlZmxlY3Rpb24gcHVycG9zZXMuIFRoZSBtZXNzYWdlcyBhcmUgaW50ZXJuYWwgdG8gdGhlIHJ1bnRpbWUgYXMgdGhleSB3b3VsZCByZXF1aXJlCi0gICAgICAgIC8vLyBwcm90bzIgc2VtYW50aWNzIGZvciBmdWxsIHN1cHBvcnQsIGJ1dCB0aGUgZmlsZSBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZSB2aWEgdGhpcyBwcm9wZXJ0eS4gVGhlCi0gICAgICAgIC8vLyBDIyBjb2RlZ2VuIGluIHByb3RvYyBhdXRvbWF0aWNhbGx5IHVzZXMgdGhpcyBwcm9wZXJ0eSB3aGVuIGl0IGRldGVjdHMgYSBkZXBlbmRlbmN5IG9uIDxjPmRlc2NyaXB0b3IucHJvdG88L2M+LgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAvLy8gVGhlIGZpbGUgZGVzY3JpcHRvciBmb3IgPGM+ZGVzY3JpcHRvci5wcm90bzwvYz4uCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3JQcm90b0ZpbGVEZXNjcmlwdG9yIHsgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3JSZWZsZWN0aW9uLkRlc2NyaXB0b3I7IH0gfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0dlbmVyYXRlZENsclR5cGVJbmZvLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9HZW5lcmF0ZWRDbHJUeXBlSW5mby5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU1ZGI2NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0dlbmVyYXRlZENsclR5cGVJbmZvLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTAzICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi11c2luZyBTeXN0ZW07Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRXh0cmEgaW5mb3JtYXRpb24gcHJvdmlkZWQgYnkgZ2VuZXJhdGVkIGNvZGUgd2hlbiBpbml0aWFsaXppbmcgYSBtZXNzYWdlIG9yIGZpbGUgZGVzY3JpcHRvci4KLSAgICAvLy8gVGhlc2UgYXJlIGNvbnN0cnVjdGVkIGFzIHJlcXVpcmVkLCBhbmQgYXJlIG5vdCBsb25nLWxpdmVkLiBIYW5kLXdyaXR0ZW4gY29kZSBzaG91bGQKLSAgICAvLy8gbmV2ZXIgbmVlZCB0byB1c2UgdGhpcyB0eXBlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBHZW5lcmF0ZWRDbHJUeXBlSW5mbwotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgc3RyaW5nW10gRW1wdHlOYW1lcyA9IG5ldyBzdHJpbmdbMF07Ci0gICAgICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IEdlbmVyYXRlZENsclR5cGVJbmZvW10gRW1wdHlDb2RlSW5mbyA9IG5ldyBHZW5lcmF0ZWRDbHJUeXBlSW5mb1swXTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBJcnJlbGV2YW50IGZvciBmaWxlIGRlc2NyaXB0b3JzOyB0aGUgQ0xSIHR5cGUgZm9yIHRoZSBtZXNzYWdlIGZvciBtZXNzYWdlIGRlc2NyaXB0b3JzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVHlwZSBDbHJUeXBlIHsgZ2V0OyBwcml2YXRlIHNldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElycmVsZXZhbnQgZm9yIGZpbGUgZGVzY3JpcHRvcnM7IHRoZSBwYXJzZXIgZm9yIG1lc3NhZ2UgZGVzY3JpcHRvcnMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBNZXNzYWdlUGFyc2VyIFBhcnNlciB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIElycmVsZXZhbnQgZm9yIGZpbGUgZGVzY3JpcHRvcnM7IHRoZSBDTFIgcHJvcGVydHkgbmFtZXMgKGluIG1lc3NhZ2UgZGVzY3JpcHRvciBmaWVsZCBvcmRlcikKLSAgICAgICAgLy8vIGZvciBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgZm9yIG1lc3NhZ2UgZGVzY3JpcHRvcnMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmdbXSBQcm9wZXJ0eU5hbWVzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSXJyZWxldmFudCBmb3IgZmlsZSBkZXNjcmlwdG9yczsgdGhlIENMUiBwcm9wZXJ0eSAiYmFzZSIgbmFtZXMgKGluIG1lc3NhZ2UgZGVzY3JpcHRvciBvbmVvZiBvcmRlcikKLSAgICAgICAgLy8vIGZvciBvbmVvZnMgaW4gdGhlIG1lc3NhZ2UgZm9yIG1lc3NhZ2UgZGVzY3JpcHRvcnMuIEl0IGlzIGV4cGVjdGVkIHRoYXQgZm9yIGEgb25lb2YgbmFtZSBvZiAiRm9vIiwKLSAgICAgICAgLy8vIHRoZXJlIHdpbGwgYmUgYSAiRm9vQ2FzZSIgcHJvcGVydHkgYW5kIGEgIkNsZWFyRm9vIiBtZXRob2QuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmdbXSBPbmVvZk5hbWVzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZm9yIHR5cGVzIHdpdGhpbiB0aGlzIGZpbGUvbWVzc2FnZSBkZXNjcmlwdG9yLiBFbGVtZW50cyBtYXkgYmUgbnVsbAotICAgICAgICAvLy8gaWYgdGhlcmUgaXMgbm8gY29ycmVzcG9uZGluZyBnZW5lcmF0ZWQgdHlwZSwgZS5nLiBmb3IgbWFwIGVudHJ5IHR5cGVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgR2VuZXJhdGVkQ2xyVHlwZUluZm9bXSBOZXN0ZWRUeXBlcyB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBDTFIgdHlwZXMgZm9yIGVudW1zIHdpdGhpbiB0aGlzIGZpbGUvbWVzc2FnZSBkZXNjcmlwdG9yLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgVHlwZVtdIE5lc3RlZEVudW1zIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIEdlbmVyYXRlZENsclR5cGVJbmZvIGZvciBhIG1lc3NhZ2UgZGVzY3JpcHRvciwgd2l0aCBuZXN0ZWQgdHlwZXMsIG5lc3RlZCBlbnVtcywgdGhlIENMUiB0eXBlLCBwcm9wZXJ0eSBuYW1lcyBhbmQgb25lb2YgbmFtZXMuCi0gICAgICAgIC8vLyBFYWNoIGFycmF5IHBhcmFtZXRlciBtYXkgYmUgbnVsbCwgdG8gaW5kaWNhdGUgYSBsYWNrIG9mIHZhbHVlcy4KLSAgICAgICAgLy8vIFRoZSBwYXJhbWV0ZXIgb3JkZXIgaXMgZGVzaWduZWQgdG8gbWFrZSBpdCBmZWFzaWJsZSB0byBmb3JtYXQgdGhlIGdlbmVyYXRlZCBjb2RlIHJlYWRhYmx5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgR2VuZXJhdGVkQ2xyVHlwZUluZm8oVHlwZSBjbHJUeXBlLCBNZXNzYWdlUGFyc2VyIHBhcnNlciwgc3RyaW5nW10gcHJvcGVydHlOYW1lcywgc3RyaW5nW10gb25lb2ZOYW1lcywgVHlwZVtdIG5lc3RlZEVudW1zLCBHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIG5lc3RlZFR5cGVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBOZXN0ZWRUeXBlcyA9IG5lc3RlZFR5cGVzID8/IEVtcHR5Q29kZUluZm87Ci0gICAgICAgICAgICBOZXN0ZWRFbnVtcyA9IG5lc3RlZEVudW1zID8/IFJlZmxlY3Rpb25VdGlsLkVtcHR5VHlwZXM7Ci0gICAgICAgICAgICBDbHJUeXBlID0gY2xyVHlwZTsKLSAgICAgICAgICAgIFBhcnNlciA9IHBhcnNlcjsKLSAgICAgICAgICAgIFByb3BlcnR5TmFtZXMgPSBwcm9wZXJ0eU5hbWVzID8/IEVtcHR5TmFtZXM7Ci0gICAgICAgICAgICBPbmVvZk5hbWVzID0gb25lb2ZOYW1lcyA/PyBFbXB0eU5hbWVzOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIEdlbmVyYXRlZENsclR5cGVJbmZvIGZvciBhIGZpbGUgZGVzY3JpcHRvciwgd2l0aCBvbmx5IHR5cGVzIGFuZCBlbnVtcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIEdlbmVyYXRlZENsclR5cGVJbmZvKFR5cGVbXSBuZXN0ZWRFbnVtcywgR2VuZXJhdGVkQ2xyVHlwZUluZm9bXSBuZXN0ZWRUeXBlcykKLSAgICAgICAgICAgIDogdGhpcyhudWxsLCBudWxsLCBudWxsLCBudWxsLCBuZXN0ZWRFbnVtcywgbmVzdGVkVHlwZXMpCi0gICAgICAgIHsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0lEZXNjcmlwdG9yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9JRGVzY3JpcHRvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzE4ZDU4Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0lEZXNjcmlwdG9yLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNTUgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBJbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgYWxsIGRlc2NyaXB0b3IgdHlwZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50ZXJmYWNlIElEZXNjcmlwdG9yCi0gICAgewotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBlbnRpdHkgKG1lc3NhZ2UsIGZpZWxkIGV0YykgYmVpbmcgZGVzY3JpYmVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBzdHJpbmcgTmFtZSB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBlbnRpdHkgYmVpbmcgZGVzY3JpYmVkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBzdHJpbmcgRnVsbE5hbWUgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgLnByb3RvIGZpbGUgdGhhdCB0aGlzIGVudGl0eSBpcyBwYXJ0IG9mLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBGaWxlRGVzY3JpcHRvciBGaWxlIHsgZ2V0OyB9Ci0gICAgfSAgICAKLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0lGaWVsZEFjY2Vzc29yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9JRmllbGRBY2Nlc3Nvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2ZlNTZmZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL0lGaWVsZEFjY2Vzc29yLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFsbG93cyBmaWVsZHMgdG8gYmUgcmVmbGVjdGl2ZWx5IGFjY2Vzc2VkLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludGVyZmFjZSBJRmllbGRBY2Nlc3NvcgotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZGVzY3JpcHRvciBhc3NvY2lhdGVkIHdpdGggdGhpcyBmaWVsZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgRmllbGREZXNjcmlwdG9yIERlc2NyaXB0b3IgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDbGVhcnMgdGhlIGZpZWxkIGluIHRoZSBzcGVjaWZpZWQgbWVzc2FnZS4gKEZvciByZXBlYXRlZCBmaWVsZHMsCi0gICAgICAgIC8vLyB0aGlzIGNsZWFycyB0aGUgbGlzdC4pCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHZvaWQgQ2xlYXIoSU1lc3NhZ2UgbWVzc2FnZSk7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmV0Y2hlcyB0aGUgZmllbGQgdmFsdWUuIEZvciByZXBlYXRlZCB2YWx1ZXMsIHRoaXMgd2lsbCBiZSBhbgotICAgICAgICAvLy8gPHNlZSBjcmVmPSJJTGlzdCIvPiBpbXBsZW1lbnRhdGlvbi4gRm9yIG1hcCB2YWx1ZXMsIHRoaXMgd2lsbCBiZSBhbgotICAgICAgICAvLy8gPHNlZSBjcmVmPSJJRGljdGlvbmFyeSIvPiBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgb2JqZWN0IEdldFZhbHVlKElNZXNzYWdlIG1lc3NhZ2UpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE11dGF0b3IgZm9yIHNpbmdsZSAic2ltcGxlIiBmaWVsZHMgb25seS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBtdXRhdGVkIGJ5IGZldGNoaW5nIHRoZSB2YWx1ZSBhbmQgbWFuaXB1bGF0aW5nIGl0IGFzIGEgbGlzdC4KLSAgICAgICAgLy8vIE1hcCBmaWVsZHMgYXJlIG11dGF0ZWQgYnkgZmV0Y2hpbmcgdGhlIHZhbHVlIGFuZCBtYW5pcHVsYXRpbmcgaXQgYXMgYSBkaWN0aW9uYXJ5LgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj5UaGUgZmllbGQgaXMgbm90IGEgInNpbXBsZSIgZmllbGQuPC9leGNlcHRpb24+Ci0gICAgICAgIHZvaWQgU2V0VmFsdWUoSU1lc3NhZ2UgbWVzc2FnZSwgb2JqZWN0IHZhbHVlKTsKLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9NYXBGaWVsZEFjY2Vzc29yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9NYXBGaWVsZEFjY2Vzc29yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZWQ3ZjhjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vTWFwRmllbGRBY2Nlc3Nvci5jcworKysgL2Rldi9udWxsCkBAIC0xLDU5ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9uczsKLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIEFjY2Vzc29yIGZvciBtYXAgZmllbGRzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIE1hcEZpZWxkQWNjZXNzb3IgOiBGaWVsZEFjY2Vzc29yQmFzZQotICAgIHsKLSAgICAgICAgaW50ZXJuYWwgTWFwRmllbGRBY2Nlc3NvcihQcm9wZXJ0eUluZm8gcHJvcGVydHksIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yKSA6IGJhc2UocHJvcGVydHksIGRlc2NyaXB0b3IpCi0gICAgICAgIHsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsZWFyKElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIElEaWN0aW9uYXJ5IGxpc3QgPSAoSURpY3Rpb25hcnkpIEdldFZhbHVlKG1lc3NhZ2UpOwotICAgICAgICAgICAgbGlzdC5DbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHZvaWQgU2V0VmFsdWUoSU1lc3NhZ2UgbWVzc2FnZSwgb2JqZWN0IHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiU2V0VmFsdWUgaXMgbm90IGltcGxlbWVudGVkIGZvciBtYXAgZmllbGRzIik7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL01lc3NhZ2VEZXNjcmlwdG9yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9NZXNzYWdlRGVzY3JpcHRvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjVhODM1ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL01lc3NhZ2VEZXNjcmlwdG9yLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMzE3ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLk9iamVjdE1vZGVsOwotdXNpbmcgU3lzdGVtLkxpbnE7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gRGVzY3JpYmVzIGEgbWVzc2FnZSB0eXBlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBNZXNzYWdlRGVzY3JpcHRvciA6IERlc2NyaXB0b3JCYXNlCi0gICAgewotICAgICAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBIYXNoU2V0PHN0cmluZz4gV2VsbEtub3duVHlwZU5hbWVzID0gbmV3IEhhc2hTZXQ8c3RyaW5nPgotICAgICAgICB7Ci0gICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byIsCi0gICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byIsCi0gICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvIiwKLSAgICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iLAotICAgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byIsCi0gICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byIsCi0gICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8iLAotICAgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90byIsCi0gICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byIsCi0gICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8iLAotICAgICAgICB9OwotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8RmllbGREZXNjcmlwdG9yPiBmaWVsZHNJbkRlY2xhcmF0aW9uT3JkZXI7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgSUxpc3Q8RmllbGREZXNjcmlwdG9yPiBmaWVsZHNJbk51bWJlck9yZGVyOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IElEaWN0aW9uYXJ5PHN0cmluZywgRmllbGREZXNjcmlwdG9yPiBqc29uRmllbGRNYXA7Ci0gICAgICAgIAotICAgICAgICBpbnRlcm5hbCBNZXNzYWdlRGVzY3JpcHRvcihEZXNjcmlwdG9yUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yIGZpbGUsIE1lc3NhZ2VEZXNjcmlwdG9yIHBhcmVudCwgaW50IHR5cGVJbmRleCwgR2VuZXJhdGVkQ2xyVHlwZUluZm8gZ2VuZXJhdGVkQ29kZUluZm8pCi0gICAgICAgICAgICA6IGJhc2UoZmlsZSwgZmlsZS5Db21wdXRlRnVsbE5hbWUocGFyZW50LCBwcm90by5OYW1lKSwgdHlwZUluZGV4KQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90byA9IHByb3RvOwotICAgICAgICAgICAgUGFyc2VyID0gZ2VuZXJhdGVkQ29kZUluZm8/LlBhcnNlcjsKLSAgICAgICAgICAgIENsclR5cGUgPSBnZW5lcmF0ZWRDb2RlSW5mbz8uQ2xyVHlwZTsKLSAgICAgICAgICAgIENvbnRhaW5pbmdUeXBlID0gcGFyZW50OwotCi0gICAgICAgICAgICAvLyBOb3RlIHVzZSBvZiBnZW5lcmF0ZWRDb2RlSW5mby4gcmF0aGVyIHRoYW4gZ2VuZXJhdGVkQ29kZUluZm8/LiBoZXJlLi4uIHdlIGRvbid0IGV4cGVjdAotICAgICAgICAgICAgLy8gdG8gc2VlIGFueSBuZXN0ZWQgb25lb2ZzLCB0eXBlcyBvciBlbnVtcyBpbiAibm90IGFjdHVhbGx5IGdlbmVyYXRlZCIgY29kZS4uLiB3ZSBkbwotICAgICAgICAgICAgLy8gZXhwZWN0IGZpZWxkcyB0aG91Z2ggKGZvciBtYXAgZW50cnkgbWVzc2FnZXMpLgotICAgICAgICAgICAgT25lb2ZzID0gRGVzY3JpcHRvclV0aWwuQ29udmVydEFuZE1ha2VSZWFkT25seSgKLSAgICAgICAgICAgICAgICBwcm90by5PbmVvZkRlY2wsCi0gICAgICAgICAgICAgICAgKG9uZW9mLCBpbmRleCkgPT4KLSAgICAgICAgICAgICAgICBuZXcgT25lb2ZEZXNjcmlwdG9yKG9uZW9mLCBmaWxlLCB0aGlzLCBpbmRleCwgZ2VuZXJhdGVkQ29kZUluZm8uT25lb2ZOYW1lc1tpbmRleF0pKTsKLQotICAgICAgICAgICAgTmVzdGVkVHlwZXMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KAotICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZFR5cGUsCi0gICAgICAgICAgICAgICAgKHR5cGUsIGluZGV4KSA9PgotICAgICAgICAgICAgICAgIG5ldyBNZXNzYWdlRGVzY3JpcHRvcih0eXBlLCBmaWxlLCB0aGlzLCBpbmRleCwgZ2VuZXJhdGVkQ29kZUluZm8uTmVzdGVkVHlwZXNbaW5kZXhdKSk7Ci0KLSAgICAgICAgICAgIEVudW1UeXBlcyA9IERlc2NyaXB0b3JVdGlsLkNvbnZlcnRBbmRNYWtlUmVhZE9ubHkoCi0gICAgICAgICAgICAgICAgcHJvdG8uRW51bVR5cGUsCi0gICAgICAgICAgICAgICAgKHR5cGUsIGluZGV4KSA9PgotICAgICAgICAgICAgICAgIG5ldyBFbnVtRGVzY3JpcHRvcih0eXBlLCBmaWxlLCB0aGlzLCBpbmRleCwgZ2VuZXJhdGVkQ29kZUluZm8uTmVzdGVkRW51bXNbaW5kZXhdKSk7Ci0KLSAgICAgICAgICAgIGZpZWxkc0luRGVjbGFyYXRpb25PcmRlciA9IERlc2NyaXB0b3JVdGlsLkNvbnZlcnRBbmRNYWtlUmVhZE9ubHkoCi0gICAgICAgICAgICAgICAgcHJvdG8uRmllbGQsCi0gICAgICAgICAgICAgICAgKGZpZWxkLCBpbmRleCkgPT4KLSAgICAgICAgICAgICAgICBuZXcgRmllbGREZXNjcmlwdG9yKGZpZWxkLCBmaWxlLCB0aGlzLCBpbmRleCwgZ2VuZXJhdGVkQ29kZUluZm8/LlByb3BlcnR5TmFtZXNbaW5kZXhdKSk7Ci0gICAgICAgICAgICBmaWVsZHNJbk51bWJlck9yZGVyID0gbmV3IFJlYWRPbmx5Q29sbGVjdGlvbjxGaWVsZERlc2NyaXB0b3I+KGZpZWxkc0luRGVjbGFyYXRpb25PcmRlci5PcmRlckJ5KGZpZWxkID0+IGZpZWxkLkZpZWxkTnVtYmVyKS5Ub0FycmF5KCkpOwotICAgICAgICAgICAgLy8gVE9ETzogVXNlIGZpZWxkID0+IGZpZWxkLlByb3RvLkpzb25OYW1lIHdoZW4gd2UncmUgY29uZmlkZW50IGl0J3MgYXBwcm9wcmlhdGUuIChBbmQgdGhlbiB1c2UgaXQgaW4gdGhlIGZvcm1hdHRlciwgdG9vLikKLSAgICAgICAgICAgIGpzb25GaWVsZE1hcCA9IENyZWF0ZUpzb25GaWVsZE1hcChmaWVsZHNJbk51bWJlck9yZGVyKTsKLSAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkU3ltYm9sKHRoaXMpOwotICAgICAgICAgICAgRmllbGRzID0gbmV3IEZpZWxkQ29sbGVjdGlvbih0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIHByaXZhdGUgc3RhdGljIFJlYWRPbmx5RGljdGlvbmFyeTxzdHJpbmcsIEZpZWxkRGVzY3JpcHRvcj4gQ3JlYXRlSnNvbkZpZWxkTWFwKElMaXN0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgbWFwID0gbmV3IERpY3Rpb25hcnk8c3RyaW5nLCBGaWVsZERlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZmllbGQgaW4gZmllbGRzKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIG1hcFtmaWVsZC5OYW1lXSA9IGZpZWxkOwotICAgICAgICAgICAgICAgIG1hcFtmaWVsZC5Kc29uTmFtZV0gPSBmaWVsZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVhZE9ubHlEaWN0aW9uYXJ5PHN0cmluZywgRmllbGREZXNjcmlwdG9yPihtYXApOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIGJyaWVmIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IncyB0YXJnZXQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgTmFtZSA9PiBQcm90by5OYW1lOwotCi0gICAgICAgIGludGVybmFsIERlc2NyaXB0b3JQcm90byBQcm90byB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBDTFIgdHlwZSB1c2VkIHRvIHJlcHJlc2VudCBtZXNzYWdlIGluc3RhbmNlcyBmcm9tIHRoaXMgZGVzY3JpcHRvci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmE+Ci0gICAgICAgIC8vLyBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBwcm9wZXJ0eSB3aWxsIGJlIG5vbi1udWxsIGZvciBhbGwgcmVndWxhciBmaWVsZHMuIEhvd2V2ZXIsCi0gICAgICAgIC8vLyBpZiBhIG1lc3NhZ2UgY29udGFpbmluZyBhIG1hcCBmaWVsZCBpcyBpbnRyb3NwZWN0ZWQsIHRoZSBsaXN0IG9mIG5lc3RlZCBtZXNzYWdlcyB3aWxsIGluY2x1ZGUKLSAgICAgICAgLy8vIGFuIGF1dG8tZ2VuZXJhdGVkIG5lc3RlZCBrZXkvdmFsdWUgcGFpciBtZXNzYWdlIGZvciB0aGUgZmllbGQuIFRoaXMgaXMgbm90IHJlcHJlc2VudGVkIGluIGFueQotICAgICAgICAvLy8gZ2VuZXJhdGVkIHR5cGUsIHNvIHRoaXMgcHJvcGVydHkgd2lsbCByZXR1cm4gbnVsbCBpbiBzdWNoIGNhc2VzLgotICAgICAgICAvLy8gPC9wYXJhPgotICAgICAgICAvLy8gPHBhcmE+Ci0gICAgICAgIC8vLyBGb3Igd3JhcHBlciB0eXBlcyAoPHNlZSBjcmVmPSJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RyaW5nVmFsdWUiLz4gYW5kIHRoZSBsaWtlKSwgdGhlIHR5cGUgcmV0dXJuZWQgaGVyZQotICAgICAgICAvLy8gd2lsbCBiZSB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSwgbm90IHRoZSBuYXRpdmUgdHlwZSB1c2VkIGJ5IHJlZmxlY3Rpb24gZm9yIGZpZWxkcyBvZiB0aG9zZSB0eXBlcy4gQ29kZQotICAgICAgICAvLy8gdXNpbmcgcmVmbGVjdGlvbiBzaG91bGQgY2FsbCA8c2VlIGNyZWY9IklzV3JhcHBlclR5cGUiLz4gdG8gZGV0ZXJtaW5lIHdoZXRoZXIgYSBtZXNzYWdlIGRlc2NyaXB0b3IgcmVwcmVzZW50cwotICAgICAgICAvLy8gYSB3cmFwcGVyIHR5cGUsIGFuZCBoYW5kbGUgdGhlIHJlc3VsdCBhcHByb3ByaWF0ZWx5LgotICAgICAgICAvLy8gPC9wYXJhPgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICBwdWJsaWMgVHlwZSBDbHJUeXBlIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQSBwYXJzZXIgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYT4KLSAgICAgICAgLy8vIEFzIDxzZWUgY3JlZj0iTWVzc2FnZURlc2NyaXB0b3IiLz4gaXMgbm90IGdlbmVyaWMsIHRoaXMgY2Fubm90IGJlIHN0YXRpY2FsbHkKLSAgICAgICAgLy8vIHR5cGVkIHRvIHRoZSByZWxldmFudCB0eXBlLCBidXQgaXQgc2hvdWxkIHByb2R1Y2Ugb2JqZWN0cyBvZiBhIHR5cGUgY29tcGF0aWJsZSB3aXRoIDxzZWUgY3JlZj0iQ2xyVHlwZSIvPi4KLSAgICAgICAgLy8vIDwvcGFyYT4KLSAgICAgICAgLy8vIDxwYXJhPgotICAgICAgICAvLy8gVGhlIHZhbHVlIHJldHVybmVkIGJ5IHRoaXMgcHJvcGVydHkgd2lsbCBiZSBub24tbnVsbCBmb3IgYWxsIHJlZ3VsYXIgZmllbGRzLiBIb3dldmVyLAotICAgICAgICAvLy8gaWYgYSBtZXNzYWdlIGNvbnRhaW5pbmcgYSBtYXAgZmllbGQgaXMgaW50cm9zcGVjdGVkLCB0aGUgbGlzdCBvZiBuZXN0ZWQgbWVzc2FnZXMgd2lsbCBpbmNsdWRlCi0gICAgICAgIC8vLyBhbiBhdXRvLWdlbmVyYXRlZCBuZXN0ZWQga2V5L3ZhbHVlIHBhaXIgbWVzc2FnZSBmb3IgdGhlIGZpZWxkLiBObyBtZXNzYWdlIHBhcnNlciBvYmplY3QgaXMgY3JlYXRlZCBmb3IKLSAgICAgICAgLy8vIHN1Y2ggbWVzc2FnZXMsIHNvIHRoaXMgcHJvcGVydHkgd2lsbCByZXR1cm4gbnVsbCBpbiBzdWNoIGNhc2VzLgotICAgICAgICAvLy8gPC9wYXJhPgotICAgICAgICAvLy8gPHBhcmE+Ci0gICAgICAgIC8vLyBGb3Igd3JhcHBlciB0eXBlcyAoPHNlZSBjcmVmPSJHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RyaW5nVmFsdWUiLz4gYW5kIHRoZSBsaWtlKSwgdGhlIHBhcnNlciByZXR1cm5lZCBoZXJlCi0gICAgICAgIC8vLyB3aWxsIGJlIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlLCBub3QgdGhlIG5hdGl2ZSB0eXBlIHVzZWQgYnkgcmVmbGVjdGlvbiBmb3IgZmllbGRzIG9mIHRob3NlIHR5cGVzLiBDb2RlCi0gICAgICAgIC8vLyB1c2luZyByZWZsZWN0aW9uIHNob3VsZCBjYWxsIDxzZWUgY3JlZj0iSXNXcmFwcGVyVHlwZSIvPiB0byBkZXRlcm1pbmUgd2hldGhlciBhIG1lc3NhZ2UgZGVzY3JpcHRvciByZXByZXNlbnRzCi0gICAgICAgIC8vLyBhIHdyYXBwZXIgdHlwZSwgYW5kIGhhbmRsZSB0aGUgcmVzdWx0IGFwcHJvcHJpYXRlbHkuCi0gICAgICAgIC8vLyA8L3BhcmE+Ci0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIHB1YmxpYyBNZXNzYWdlUGFyc2VyIFBhcnNlciB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIG1lc3NhZ2UgaXMgb25lIG9mIHRoZSAid2VsbCBrbm93biB0eXBlcyIgd2hpY2ggbWF5IGhhdmUgcnVudGltZS9wcm90b2Mgc3VwcG9ydC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBJc1dlbGxLbm93blR5cGUgPT4gRmlsZS5QYWNrYWdlID09ICJnb29nbGUucHJvdG9idWYiICYmIFdlbGxLbm93blR5cGVOYW1lcy5Db250YWlucyhGaWxlLk5hbWUpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgd2hldGhlciB0aGlzIG1lc3NhZ2UgaXMgb25lIG9mIHRoZSAid3JhcHBlciB0eXBlcyIgdXNlZCBmb3IgZmllbGRzIHdoaWNoIHJlcHJlc2VudCBwcmltaXRpdmUgdmFsdWVzCi0gICAgICAgIC8vLyB3aXRoIHRoZSBhZGRpdGlvbiBvZiBwcmVzZW5jZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgYm9vbCBJc1dyYXBwZXJUeXBlID0+IEZpbGUuUGFja2FnZSA9PSAiZ29vZ2xlLnByb3RvYnVmIiAmJiBGaWxlLk5hbWUgPT0gImdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byI7Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIElmIHRoaXMgaXMgYSBuZXN0ZWQgdHlwZSwgZ2V0IHRoZSBvdXRlciBkZXNjcmlwdG9yLCBvdGhlcndpc2UgbnVsbC4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBNZXNzYWdlRGVzY3JpcHRvciBDb250YWluaW5nVHlwZSB7IGdldDsgfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBBIGNvbGxlY3Rpb24gb2YgZmllbGRzLCB3aGljaCBjYW4gYmUgcmV0cmlldmVkIGJ5IG5hbWUgb3IgZmllbGQgbnVtYmVyLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIEZpZWxkQ29sbGVjdGlvbiBGaWVsZHMgeyBnZXQ7IH0KLQotICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAvLy8gQW4gdW5tb2RpZmlhYmxlIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBuZXN0ZWQgdHlwZXMuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgSUxpc3Q8TWVzc2FnZURlc2NyaXB0b3I+IE5lc3RlZFR5cGVzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIHRoaXMgbWVzc2FnZSB0eXBlJ3MgZW51bSB0eXBlcy4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBJTGlzdDxFbnVtRGVzY3JpcHRvcj4gRW51bVR5cGVzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIHRoZSAib25lb2YiIGZpZWxkIGNvbGxlY3Rpb25zIGluIHRoaXMgbWVzc2FnZSB0eXBlLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIElMaXN0PE9uZW9mRGVzY3JpcHRvcj4gT25lb2ZzIHsgZ2V0OyB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmluZHMgYSBmaWVsZCBieSBmaWVsZCBuYW1lLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPlRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWVsZCAoZS5nLiAiZm9vIikuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBmaWVsZCdzIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBGaW5kRmllbGRCeU5hbWUoU3RyaW5nIG5hbWUpID0+IEZpbGUuRGVzY3JpcHRvclBvb2wuRmluZFN5bWJvbDxGaWVsZERlc2NyaXB0b3I+KEZ1bGxOYW1lICsgIi4iICsgbmFtZSk7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRmluZHMgYSBmaWVsZCBieSBmaWVsZCBudW1iZXIuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnVtYmVyIj5UaGUgZmllbGQgbnVtYmVyIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGZpZWxkJ3MgZGVzY3JpcHRvciwgb3IgbnVsbCBpZiBub3QgZm91bmQuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIEZpbmRGaWVsZEJ5TnVtYmVyKGludCBudW1iZXIpID0+IEZpbGUuRGVzY3JpcHRvclBvb2wuRmluZEZpZWxkQnlOdW1iZXIodGhpcywgbnVtYmVyKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBGaW5kcyBhIG5lc3RlZCBkZXNjcmlwdG9yIGJ5IG5hbWUuIFRoZSBpcyB2YWxpZCBmb3IgZmllbGRzLCBuZXN0ZWQKLSAgICAgICAgLy8vIG1lc3NhZ2UgdHlwZXMsIG9uZW9mcyBhbmQgZW51bXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3IsIGUuZy4gIkZvbyI8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGRlc2NyaXB0b3IsIG9yIG51bGwgaWYgbm90IGZvdW5kLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIFQgRmluZERlc2NyaXB0b3I8VD4oc3RyaW5nIG5hbWUpICB3aGVyZSBUIDogY2xhc3MsIElEZXNjcmlwdG9yID0+Ci0gICAgICAgICAgICBGaWxlLkRlc2NyaXB0b3JQb29sLkZpbmRTeW1ib2w8VD4oRnVsbE5hbWUgKyAiLiIgKyBuYW1lKTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBMb29rcyB1cCBhbmQgY3Jvc3MtbGlua3MgYWxsIGZpZWxkcyBhbmQgbmVzdGVkIHR5cGVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCB2b2lkIENyb3NzTGluaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvcmVhY2ggKE1lc3NhZ2VEZXNjcmlwdG9yIG1lc3NhZ2UgaW4gTmVzdGVkVHlwZXMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbWVzc2FnZS5Dcm9zc0xpbmsoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yZWFjaCAoRmllbGREZXNjcmlwdG9yIGZpZWxkIGluIGZpZWxkc0luRGVjbGFyYXRpb25PcmRlcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmaWVsZC5Dcm9zc0xpbmsoKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgZm9yZWFjaCAoT25lb2ZEZXNjcmlwdG9yIG9uZW9mIGluIE9uZW9mcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBvbmVvZi5Dcm9zc0xpbmsoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEEgY29sbGVjdGlvbiB0byBzaW1wbGlmeSByZXRyaWV2aW5nIHRoZSBmaWVsZCBhY2Nlc3NvciBmb3IgYSBwYXJ0aWN1bGFyIGZpZWxkLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIEZpZWxkQ29sbGVjdGlvbgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1lc3NhZ2VEZXNjcmlwdG9yIG1lc3NhZ2VEZXNjcmlwdG9yOwotCi0gICAgICAgICAgICBpbnRlcm5hbCBGaWVsZENvbGxlY3Rpb24oTWVzc2FnZURlc2NyaXB0b3IgbWVzc2FnZURlc2NyaXB0b3IpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhpcy5tZXNzYWdlRGVzY3JpcHRvciA9IG1lc3NhZ2VEZXNjcmlwdG9yOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAgICAgLy8vIFJldHVybnMgdGhlIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhcyBhbiBpbW11dGFibGUgbGlzdCwgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkKLSAgICAgICAgICAgIC8vLyBhcmUgZGVjbGFyZWQgaW4gdGhlIHNvdXJjZSAucHJvdG8gZmlsZS4KLSAgICAgICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICAgICAgcHVibGljIElMaXN0PEZpZWxkRGVzY3JpcHRvcj4gSW5EZWNsYXJhdGlvbk9yZGVyKCkgPT4gbWVzc2FnZURlc2NyaXB0b3IuZmllbGRzSW5EZWNsYXJhdGlvbk9yZGVyOwotCi0gICAgICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAgICAgLy8vIFJldHVybnMgdGhlIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhcyBhbiBpbW11dGFibGUgbGlzdCwgaW4gYXNjZW5kaW5nIGZpZWxkIG51bWJlcgotICAgICAgICAgICAgLy8vIG9yZGVyLiBGaWVsZCBudW1iZXJzIG5lZWQgbm90IGJlIGNvbnRpZ3VvdXMsIHNvIHRoZXJlIGlzIG5vIGRpcmVjdCBtYXBwaW5nIGZyb20gdGhlCi0gICAgICAgICAgICAvLy8gaW5kZXggaW4gdGhlIGxpc3QgdG8gdGhlIGZpZWxkIG51bWJlcjsgdG8gcmV0cmlldmUgYSBmaWVsZCBieSBmaWVsZCBudW1iZXIsIGl0IGlzIGJldHRlcgotICAgICAgICAgICAgLy8vIHRvIHVzZSB0aGUgPHNlZSBjcmVmPSJGaWVsZENvbGxlY3Rpb24iLz4gaW5kZXhlci4KLSAgICAgICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICAgICAgcHVibGljIElMaXN0PEZpZWxkRGVzY3JpcHRvcj4gSW5GaWVsZE51bWJlck9yZGVyKCkgPT4gbWVzc2FnZURlc2NyaXB0b3IuZmllbGRzSW5OdW1iZXJPcmRlcjsKLQotICAgICAgICAgICAgLy8gVE9ETzogY29uc2lkZXIgbWFraW5nIHRoaXMgcHVibGljIGluIHRoZSBmdXR1cmUuIChCZWluZyBjb25zZXJ2YXRpdmUgZm9yIG5vdy4uLikKLQotICAgICAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgICAgIC8vLyBSZXR1cm5zIGEgcmVhZC1vbmx5IGRpY3Rpb25hcnkgbWFwcGluZyB0aGUgZmllbGQgbmFtZXMgaW4gdGhpcyBtZXNzYWdlIGFzIHRoZXkncmUgYXZhaWxhYmxlCi0gICAgICAgICAgICAvLy8gaW4gdGhlIEpTT04gcmVwcmVzZW50YXRpb24gdG8gdGhlIGZpZWxkIGRlc2NyaXB0b3JzLiBGb3IgZXhhbXBsZSwgYSBmaWVsZCA8Yz5mb29fYmFyPC9jPgotICAgICAgICAgICAgLy8vIGluIHRoZSBtZXNzYWdlIHdvdWxkIHJlc3VsdCB0d28gZW50cmllcywgb25lIHdpdGggYSBrZXkgPGM+Zm9vQmFyPC9jPiBhbmQgb25lIHdpdGggYSBrZXkKLSAgICAgICAgICAgIC8vLyA8Yz5mb29fYmFyPC9jPiwgYm90aCByZWZlcnJpbmcgdG8gdGhlIHNhbWUgZmllbGQuCi0gICAgICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgICAgIGludGVybmFsIElEaWN0aW9uYXJ5PHN0cmluZywgRmllbGREZXNjcmlwdG9yPiBCeUpzb25OYW1lKCkgPT4gbWVzc2FnZURlc2NyaXB0b3IuanNvbkZpZWxkTWFwOwotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gUmV0cmlldmVzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbnVtYmVyLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibnVtYmVyIj5OdW1iZXIgb2YgdGhlIGZpZWxkIHRvIHJldHJpZXZlIHRoZSBkZXNjcmlwdG9yIGZvcjwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHJldHVybnM+VGhlIGFjY2Vzc29yIGZvciB0aGUgZ2l2ZW4gZmllbGQ8L3JldHVybnM+Ci0gICAgICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJLZXlOb3RGb3VuZEV4Y2VwdGlvbiI+VGhlIG1lc3NhZ2UgZGVzY3JpcHRvciBkb2VzIG5vdCBjb250YWluIGEgZmllbGQKLSAgICAgICAgICAgIC8vLyB3aXRoIHRoZSBnaXZlbiBudW1iZXI8L2V4Y2VwdGlvbj4KLSAgICAgICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgdGhpc1tpbnQgbnVtYmVyXQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGdldAotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdmFyIGZpZWxkRGVzY3JpcHRvciA9IG1lc3NhZ2VEZXNjcmlwdG9yLkZpbmRGaWVsZEJ5TnVtYmVyKG51bWJlcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZERlc2NyaXB0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEtleU5vdEZvdW5kRXhjZXB0aW9uKCJObyBzdWNoIGZpZWxkIG51bWJlciIpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBmaWVsZERlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gUmV0cmlldmVzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZS4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im5hbWUiPk5hbWUgb2YgdGhlIGZpZWxkIHRvIHJldHJpZXZlIHRoZSBkZXNjcmlwdG9yIGZvcjwvcGFyYW0+Ci0gICAgICAgICAgICAvLy8gPHJldHVybnM+VGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBnaXZlbiBmaWVsZDwvcmV0dXJucz4KLSAgICAgICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IktleU5vdEZvdW5kRXhjZXB0aW9uIj5UaGUgbWVzc2FnZSBkZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gYSBmaWVsZAotICAgICAgICAgICAgLy8vIHdpdGggdGhlIGdpdmVuIG5hbWU8L2V4Y2VwdGlvbj4KLSAgICAgICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgdGhpc1tzdHJpbmcgbmFtZV0KLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBnZXQKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciBmaWVsZERlc2NyaXB0b3IgPSBtZXNzYWdlRGVzY3JpcHRvci5GaW5kRmllbGRCeU5hbWUobmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZERlc2NyaXB0b3IgPT0gbnVsbCkKLSAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEtleU5vdEZvdW5kRXhjZXB0aW9uKCJObyBzdWNoIGZpZWxkIG5hbWUiKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmllbGREZXNjcmlwdG9yOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vTWV0aG9kRGVzY3JpcHRvci5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vTWV0aG9kRGVzY3JpcHRvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjk1MzlmNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL01ldGhvZERlc2NyaXB0b3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotI3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEZXNjcmliZXMgYSBzaW5nbGUgbWV0aG9kIGluIGEgc2VydmljZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgTWV0aG9kRGVzY3JpcHRvciA6IERlc2NyaXB0b3JCYXNlCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlOwotICAgICAgICBwcml2YXRlIE1lc3NhZ2VEZXNjcmlwdG9yIGlucHV0VHlwZTsKLSAgICAgICAgcHJpdmF0ZSBNZXNzYWdlRGVzY3JpcHRvciBvdXRwdXRUeXBlOwotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBUaGUgc2VydmljZSB0aGlzIG1ldGhvZCBiZWxvbmdzIHRvLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yIFNlcnZpY2UgeyBnZXQgeyByZXR1cm4gc2VydmljZTsgfSB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBtZXRob2QncyBpbnB1dCB0eXBlLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIE1lc3NhZ2VEZXNjcmlwdG9yIElucHV0VHlwZSB7IGdldCB7IHJldHVybiBpbnB1dFR5cGU7IH0gfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBUaGUgbWV0aG9kJ3MgaW5wdXQgdHlwZS4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBNZXNzYWdlRGVzY3JpcHRvciBPdXRwdXRUeXBlIHsgZ2V0IHsgcmV0dXJuIG91dHB1dFR5cGU7IH0gfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgaWYgY2xpZW50IHN0cmVhbXMgbXVsdGlwbGUgcmVxdWVzdHMuCi0gICAgICAgIC8vLyA8L3ZhbHVlPgotICAgICAgICBwdWJsaWMgYm9vbCBJc0NsaWVudFN0cmVhbWluZyB7IGdldCB7IHJldHVybiBwcm90by5DbGllbnRTdHJlYW1pbmc7IH0gfQotCi0gICAgICAgIC8vLyA8dmFsdWU+Ci0gICAgICAgIC8vLyBJbmRpY2F0ZXMgaWYgc2VydmVyIHN0cmVhbXMgbXVsdGlwbGUgcmVzcG9uc2VzLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIGJvb2wgSXNTZXJ2ZXJTdHJlYW1pbmcgeyBnZXQgeyByZXR1cm4gcHJvdG8uU2VydmVyU3RyZWFtaW5nOyB9IH0KLQotICAgICAgICBpbnRlcm5hbCBNZXRob2REZXNjcmlwdG9yKE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90bywgRmlsZURlc2NyaXB0b3IgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvciBwYXJlbnQsIGludCBpbmRleCkKLSAgICAgICAgICAgIDogYmFzZShmaWxlLCBwYXJlbnQuRnVsbE5hbWUgKyAiLiIgKyBwcm90by5OYW1lLCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgICAgICAgICAgc2VydmljZSA9IHBhcmVudDsKLSAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkU3ltYm9sKHRoaXMpOwotICAgICAgICB9Ci0KLSAgICAgICAgaW50ZXJuYWwgTWV0aG9kRGVzY3JpcHRvclByb3RvIFByb3RvIHsgZ2V0IHsgcmV0dXJuIHByb3RvOyB9IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgYnJpZWYgbmFtZSBvZiB0aGUgZGVzY3JpcHRvcidzIHRhcmdldC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBOYW1lIHsgZ2V0IHsgcmV0dXJuIHByb3RvLk5hbWU7IH0gfQotCi0gICAgICAgIGludGVybmFsIHZvaWQgQ3Jvc3NMaW5rKCkKLSAgICAgICAgewotICAgICAgICAgICAgSURlc2NyaXB0b3IgbG9va3VwID0gRmlsZS5EZXNjcmlwdG9yUG9vbC5Mb29rdXBTeW1ib2woUHJvdG8uSW5wdXRUeXBlLCB0aGlzKTsKLSAgICAgICAgICAgIGlmICghKGxvb2t1cCBpcyBNZXNzYWdlRGVzY3JpcHRvcikpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsICJcIiIgKyBQcm90by5JbnB1dFR5cGUgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXRUeXBlID0gKE1lc3NhZ2VEZXNjcmlwdG9yKSBsb29rdXA7Ci0KLSAgICAgICAgICAgIGxvb2t1cCA9IEZpbGUuRGVzY3JpcHRvclBvb2wuTG9va3VwU3ltYm9sKFByb3RvLk91dHB1dFR5cGUsIHRoaXMpOwotICAgICAgICAgICAgaWYgKCEobG9va3VwIGlzIE1lc3NhZ2VEZXNjcmlwdG9yKSkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgIlwiIiArIFByb3RvLk91dHB1dFR5cGUgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgb3V0cHV0VHlwZSA9IChNZXNzYWdlRGVzY3JpcHRvcikgbG9va3VwOwotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vT25lb2ZBY2Nlc3Nvci5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vT25lb2ZBY2Nlc3Nvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODcxNGFiMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL09uZW9mQWNjZXNzb3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5Db21wYXRpYmlsaXR5OwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIFJlZmxlY3Rpb24gYWNjZXNzIGZvciBhIG9uZW9mLCBhbGxvd2luZyBjbGVhciBhbmQgImdldCBjYXNlIiBhY3Rpb25zLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHNlYWxlZCBjbGFzcyBPbmVvZkFjY2Vzc29yCi0gICAgewotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZ1bmM8SU1lc3NhZ2UsIGludD4gY2FzZURlbGVnYXRlOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEFjdGlvbjxJTWVzc2FnZT4gY2xlYXJEZWxlZ2F0ZTsKLSAgICAgICAgcHJpdmF0ZSBPbmVvZkRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgICAgICBpbnRlcm5hbCBPbmVvZkFjY2Vzc29yKFByb3BlcnR5SW5mbyBjYXNlUHJvcGVydHksIE1ldGhvZEluZm8gY2xlYXJNZXRob2QsIE9uZW9mRGVzY3JpcHRvciBkZXNjcmlwdG9yKSAKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFjYXNlUHJvcGVydHkuQ2FuUmVhZCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCByZWFkIGZyb20gcHJvcGVydHkiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgICAgICBjYXNlRGVsZWdhdGUgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVGdW5jSU1lc3NhZ2VUPGludD4oY2FzZVByb3BlcnR5LkdldEdldE1ldGhvZCgpKTsKLQotICAgICAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgICAgICAgIGNsZWFyRGVsZWdhdGUgPSBSZWZsZWN0aW9uVXRpbC5DcmVhdGVBY3Rpb25JTWVzc2FnZShjbGVhck1ldGhvZCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHZXRzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIG9uZW9mLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHZhbHVlPgotICAgICAgICAvLy8gVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG9uZW9mLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIE9uZW9mRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0gfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENsZWFycyB0aGUgb25lb2YgaW4gdGhlIHNwZWNpZmllZCBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgdm9pZCBDbGVhcihJTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBjbGVhckRlbGVnYXRlKG1lc3NhZ2UpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gSW5kaWNhdGVzIHdoaWNoIGZpZWxkIGluIHRoZSBvbmVvZiBpcyBzZXQgZm9yIHNwZWNpZmllZCBtZXNzYWdlCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgR2V0Q2FzZUZpZWxkRGVzY3JpcHRvcihJTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZmllbGROdW1iZXIgPSBjYXNlRGVsZWdhdGUobWVzc2FnZSk7Ci0gICAgICAgICAgICBpZiAoZmllbGROdW1iZXIgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yLkNvbnRhaW5pbmdUeXBlLkZpbmRGaWVsZEJ5TnVtYmVyKGZpZWxkTnVtYmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9PbmVvZkRlc2NyaXB0b3IuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL09uZW9mRGVzY3JpcHRvci5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjIwMjBhYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL09uZW9mRGVzY3JpcHRvci5jcworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5PYmplY3RNb2RlbDsKLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5Db21wYXRpYmlsaXR5OwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24KLXsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vIERlc2NyaWJlcyBhICJvbmVvZiIgZmllbGQgY29sbGVjdGlvbiBpbiBhIG1lc3NhZ2UgdHlwZTogYSBzZXQgb2YKLSAgICAvLy8gZmllbGRzIG9mIHdoaWNoIGF0IG1vc3Qgb25lIGNhbiBiZSBzZXQgaW4gYW55IHBhcnRpY3VsYXIgbWVzc2FnZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzZWFsZWQgY2xhc3MgT25lb2ZEZXNjcmlwdG9yIDogRGVzY3JpcHRvckJhc2UKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT25lb2ZEZXNjcmlwdG9yUHJvdG8gcHJvdG87Ci0gICAgICAgIHByaXZhdGUgTWVzc2FnZURlc2NyaXB0b3IgY29udGFpbmluZ1R5cGU7Ci0gICAgICAgIHByaXZhdGUgSUxpc3Q8RmllbGREZXNjcmlwdG9yPiBmaWVsZHM7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgT25lb2ZBY2Nlc3NvciBhY2Nlc3NvcjsKLQotICAgICAgICBpbnRlcm5hbCBPbmVvZkRlc2NyaXB0b3IoT25lb2ZEZXNjcmlwdG9yUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yIGZpbGUsIE1lc3NhZ2VEZXNjcmlwdG9yIHBhcmVudCwgaW50IGluZGV4LCBzdHJpbmcgY2xyTmFtZSkKLSAgICAgICAgICAgIDogYmFzZShmaWxlLCBmaWxlLkNvbXB1dGVGdWxsTmFtZShwYXJlbnQsIHByb3RvLk5hbWUpLCBpbmRleCkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgICAgICAgICAgY29udGFpbmluZ1R5cGUgPSBwYXJlbnQ7Ci0KLSAgICAgICAgICAgIGZpbGUuRGVzY3JpcHRvclBvb2wuQWRkU3ltYm9sKHRoaXMpOwotICAgICAgICAgICAgYWNjZXNzb3IgPSBDcmVhdGVBY2Nlc3NvcihjbHJOYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBicmllZiBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yJ3MgdGFyZ2V0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIE5hbWUgeyBnZXQgeyByZXR1cm4gcHJvdG8uTmFtZTsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgbWVzc2FnZSB0eXBlIGNvbnRhaW5pbmcgdGhpcyBvbmVvZi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBtZXNzYWdlIHR5cGUgY29udGFpbmluZyB0aGlzIG9uZW9mLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIE1lc3NhZ2VEZXNjcmlwdG9yIENvbnRhaW5pbmdUeXBlCi0gICAgICAgIHsKLSAgICAgICAgICAgIGdldCB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyB0aGUgZmllbGRzIHdpdGhpbiB0aGlzIG9uZW9mLCBpbiBkZWNsYXJhdGlvbiBvcmRlci4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBmaWVsZHMgd2l0aGluIHRoaXMgb25lb2YsIGluIGRlY2xhcmF0aW9uIG9yZGVyLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIElMaXN0PEZpZWxkRGVzY3JpcHRvcj4gRmllbGRzIHsgZ2V0IHsgcmV0dXJuIGZpZWxkczsgfSB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2V0cyBhbiBhY2Nlc3NvciBmb3IgcmVmbGVjdGl2ZSBhY2Nlc3MgdG8gdGhlIHZhbHVlcyBhc3NvY2lhdGVkIHdpdGggdGhlIG9uZW9mCi0gICAgICAgIC8vLyBpbiBhIHBhcnRpY3VsYXIgbWVzc2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIFRoZSBhY2Nlc3NvciB1c2VkIGZvciByZWZsZWN0aXZlIGFjY2Vzcy4KLSAgICAgICAgLy8vIDwvdmFsdWU+Ci0gICAgICAgIHB1YmxpYyBPbmVvZkFjY2Vzc29yIEFjY2Vzc29yIHsgZ2V0IHsgcmV0dXJuIGFjY2Vzc29yOyB9IH0KLQotICAgICAgICBpbnRlcm5hbCB2b2lkIENyb3NzTGluaygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIExpc3Q8RmllbGREZXNjcmlwdG9yPiBmaWVsZENvbGxlY3Rpb24gPSBuZXcgTGlzdDxGaWVsZERlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICBmb3JlYWNoICh2YXIgZmllbGQgaW4gQ29udGFpbmluZ1R5cGUuRmllbGRzLkluRGVjbGFyYXRpb25PcmRlcigpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChmaWVsZC5Db250YWluaW5nT25lb2YgPT0gdGhpcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkQ29sbGVjdGlvbi5BZGQoZmllbGQpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZpZWxkcyA9IG5ldyBSZWFkT25seUNvbGxlY3Rpb248RmllbGREZXNjcmlwdG9yPihmaWVsZENvbGxlY3Rpb24pOwotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBPbmVvZkFjY2Vzc29yIENyZWF0ZUFjY2Vzc29yKHN0cmluZyBjbHJOYW1lKQotICAgICAgICB7Ci0gICAgICAgICAgICB2YXIgY2FzZVByb3BlcnR5ID0gY29udGFpbmluZ1R5cGUuQ2xyVHlwZS5HZXRQcm9wZXJ0eShjbHJOYW1lICsgIkNhc2UiKTsKLSAgICAgICAgICAgIGlmIChjYXNlUHJvcGVydHkgPT0gbnVsbCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywgJCJQcm9wZXJ0eSB7Y2xyTmFtZX1DYXNlIG5vdCBmb3VuZCBpbiB7Y29udGFpbmluZ1R5cGUuQ2xyVHlwZX0iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhciBjbGVhck1ldGhvZCA9IGNvbnRhaW5pbmdUeXBlLkNsclR5cGUuR2V0TWV0aG9kKCJDbGVhciIgKyBjbHJOYW1lKTsKLSAgICAgICAgICAgIGlmIChjbGVhck1ldGhvZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAkIk1ldGhvZCBDbGVhcntjbHJOYW1lfSBub3QgZm91bmQgaW4ge2NvbnRhaW5pbmdUeXBlLkNsclR5cGV9Iik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIHJldHVybiBuZXcgT25lb2ZBY2Nlc3NvcihjYXNlUHJvcGVydHksIGNsZWFyTWV0aG9kLCB0aGlzKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vT3JpZ2luYWxOYW1lQXR0cmlidXRlLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9PcmlnaW5hbE5hbWVBdHRyaWJ1dGUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3ZjlhYjkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9PcmlnaW5hbE5hbWVBdHRyaWJ1dGUuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gU3BlY2lmaWVzIHRoZSBvcmlnaW5hbCBuYW1lIChpbiB0aGUgLnByb3RvIGZpbGUpIG9mIGEgbmFtZWQgZWxlbWVudCwKLSAgICAvLy8gc3VjaCBhcyBhbiBlbnVtIHZhbHVlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgW0F0dHJpYnV0ZVVzYWdlKEF0dHJpYnV0ZVRhcmdldHMuRmllbGQpXQotICAgIHB1YmxpYyBjbGFzcyBPcmlnaW5hbE5hbWVBdHRyaWJ1dGUgOiBBdHRyaWJ1dGUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBuYW1lIG9mIHRoZSBlbGVtZW50IGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0cmluZyBOYW1lIHsgZ2V0OyBzZXQ7IH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb25zdHJ1Y3RzIGEgbmV3IGF0dHJpYnV0ZSBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG5hbWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIG5hbWUgb2YgdGhlIGVsZW1lbnQgaW4gdGhlIC5wcm90byBmaWxlLjwvcGFyYW0+Ci0gICAgICAgIHB1YmxpYyBPcmlnaW5hbE5hbWVBdHRyaWJ1dGUoc3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE5hbWUgPSBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG5hbWUsIG5hbWVvZihuYW1lKSk7Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9QYWNrYWdlRGVzY3JpcHRvci5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vUGFja2FnZURlc2NyaXB0b3IuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU1NDdkODMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9QYWNrYWdlRGVzY3JpcHRvci5jcworKysgL2Rldi9udWxsCkBAIC0xLDY4ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gUmVwcmVzZW50cyBhIHBhY2thZ2UgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHVzZSBQYWNrYWdlRGVzY3JpcHRvcnMKLSAgICAvLy8ganVzdCBhcyBwbGFjZWhvbGRlcnMgc28gdGhhdCBzb21lb25lIGNhbm5vdCBkZWZpbmUsIHNheSwgYSBtZXNzYWdlIHR5cGUKLSAgICAvLy8gdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBwYWNrYWdlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIFBhY2thZ2VEZXNjcmlwdG9yIDogSURlc2NyaXB0b3IKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIG5hbWU7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgc3RyaW5nIGZ1bGxOYW1lOwotICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0KLSAgICAgICAgaW50ZXJuYWwgUGFja2FnZURlc2NyaXB0b3Ioc3RyaW5nIG5hbWUsIHN0cmluZyBmdWxsTmFtZSwgRmlsZURlc2NyaXB0b3IgZmlsZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgICAgIHRoaXMuZnVsbE5hbWUgPSBmdWxsTmFtZTsKLSAgICAgICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgc3RyaW5nIE5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG5hbWU7IH0KLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBzdHJpbmcgRnVsbE5hbWUKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIGZ1bGxOYW1lOyB9Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgRmlsZQotICAgICAgICB7Ci0gICAgICAgICAgICBnZXQgeyByZXR1cm4gZmlsZTsgfQotICAgICAgICB9Ci0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vUGFydGlhbENsYXNzZXMuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL1BhcnRpYWxDbGFzc2VzLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YzI4NTQxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vUGFydGlhbENsYXNzZXMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi0vLyBUaGlzIGZpbGUganVzdCBjb250YWlucyBwYXJ0aWFsIGNsYXNzZXMgZm9yIGFueSBhdXRvZ2VuZXJhdGVkIGNsYXNzZXMgdGhhdCBuZWVkIGFkZGl0aW9uYWwgc3VwcG9ydC4KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIGludGVybmFsIHBhcnRpYWwgY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG8KLSAgICB7Ci0gICAgICAgIC8vIFdlIGNhbid0IHRlbGwgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiAiZXhwbGljaXRseSBzZXQgdG8gMCIgYW5kICJub3Qgc2V0IgotICAgICAgICAvLyBpbiBwcm90bzMsIGJ1dCB3ZSBuZWVkIHRvIHRlbGwgdGhlIGRpZmZlcmVuY2UgZm9yIE9uZW9mSW5kZXguIGRlc2NyaXB0b3IucHJvdG8KLSAgICAgICAgLy8gaXMgcmVhbGx5IGEgcHJvdG8yIGZpbGUsIGJ1dCB0aGUgcnVudGltZSBkb2Vzbid0IGtub3cgYWJvdXQgcHJvdG8yIHNlbWFudGljcy4uLgotICAgICAgICAvLyBXZSBmYWtlIGl0IGJ5IGRlZmF1bHRpbmcgdG8gLTEuCi0gICAgICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpCi0gICAgICAgIHsKLSAgICAgICAgICAgIE9uZW9mSW5kZXggPSAtMTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIGludGVybmFsIHBhcnRpYWwgY2xhc3MgRmllbGRPcHRpb25zCi0gICAgewotICAgICAgICAvLyBXZSBjYW4ndCB0ZWxsIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gImV4cGxpY2l0bHkgc2V0IHRvIGZhbHNlIiBhbmQgIm5vdCBzZXQiCi0gICAgICAgIC8vIGluIHByb3RvMywgYnV0IHdlIG5lZWQgdG8gdGVsbCB0aGUgZGlmZmVyZW5jZSBmb3IgRmllbGREZXNjcmlwdG9yLklzUGFja2VkLgotICAgICAgICAvLyBUaGlzIHdvbid0IHdvcmsgaWYgd2UgZXZlciBuZWVkIHRvIHN1cHBvcnQgcHJvdG8yLCBidXQgYXQgdGhhdCBwb2ludCB3ZSdsbCBiZQotICAgICAgICAvLyBhYmxlIHRvIHJlbW92ZSB0aGlzIGhhY2sgYW5kIHVzZSBmaWVsZCBwcmVzZW5jZSBpbnN0ZWFkLiAKLSAgICAgICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCkKLSAgICAgICAgewotICAgICAgICAgICAgUGFja2VkID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLX0KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL1JlZmxlY3Rpb25VdGlsLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9SZWZsZWN0aW9uVXRpbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY4MjBjYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL1JlZmxlY3Rpb25VdGlsLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotdXNpbmcgU3lzdGVtLkxpbnEuRXhwcmVzc2lvbnM7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIGFyZSBzb21ld2hhdCBldmlsLCBhbmQgc2hvdWxkIG5vdCBiZSB0YW1wZXJlZCB3aXRoIGxpZ2h0bHkuCi0gICAgLy8vIEJhc2ljYWxseSB0aGV5IGFsbG93IHRoZSBjcmVhdGlvbiBvZiByZWxhdGl2ZWx5IHdlYWtseSB0eXBlZCBkZWxlZ2F0ZXMgZnJvbSBNZXRob2RJbmZvcwotICAgIC8vLyB3aGljaCBhcmUgbW9yZSBzdHJvbmdseSB0eXBlZC4gVGhleSBkbyB0aGlzIGJ5IGNyZWF0aW5nIGFuIGFwcHJvcHJpYXRlIHN0cm9uZ2x5IHR5cGVkCi0gICAgLy8vIGRlbGVnYXRlIGZyb20gdGhlIE1ldGhvZEluZm8sIGFuZCB0aGVuIGNhbGxpbmcgdGhhdCB3aXRoaW4gYW4gYW5vbnltb3VzIG1ldGhvZC4KLSAgICAvLy8gTWluZC1iZW5kaW5nIHN0dWZmIChhdCBsZWFzdCB0byB5b3VyIGh1bWJsZSBuYXJyYXRvcikgYnV0IHRoZSByZXN1bHRpbmcgZGVsZWdhdGVzIGFyZQotICAgIC8vLyB2ZXJ5IGZhc3QgY29tcGFyZWQgd2l0aCBjYWxsaW5nIEludm9rZSBsYXRlciBvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIGludGVybmFsIHN0YXRpYyBjbGFzcyBSZWZsZWN0aW9uVXRpbAotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gRW1wdHkgVHlwZVtdIHVzZWQgd2hlbiBjYWxsaW5nIEdldFByb3BlcnR5IHRvIGZvcmNlIHByb3BlcnR5IGluc3RlYWQgb2YgaW5kZXhlciBmZXRjaGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHJlYWRvbmx5IFR5cGVbXSBFbXB0eVR5cGVzID0gbmV3IFR5cGVbMF07Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIGRlbGVnYXRlIHdoaWNoIHdpbGwgY2FzdCB0aGUgYXJndW1lbnQgdG8gdGhlIGFwcHJvcHJpYXRlIG1ldGhvZCB0YXJnZXQgdHlwZSwKLSAgICAgICAgLy8vIGNhbGwgdGhlIG1ldGhvZCBvbiBpdCwgdGhlbiBjb252ZXJ0IHRoZSByZXN1bHQgdG8gb2JqZWN0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgRnVuYzxJTWVzc2FnZSwgb2JqZWN0PiBDcmVhdGVGdW5jSU1lc3NhZ2VPYmplY3QoTWV0aG9kSW5mbyBtZXRob2QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckV4cHJlc3Npb24gcGFyYW1ldGVyID0gRXhwcmVzc2lvbi5QYXJhbWV0ZXIodHlwZW9mKElNZXNzYWdlKSwgInAiKTsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gZG93bmNhc3QgPSBFeHByZXNzaW9uLkNvbnZlcnQocGFyYW1ldGVyLCBtZXRob2QuRGVjbGFyaW5nVHlwZSk7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGNhbGwgPSBFeHByZXNzaW9uLkNhbGwoZG93bmNhc3QsIG1ldGhvZCk7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIHVwY2FzdCA9IEV4cHJlc3Npb24uQ29udmVydChjYWxsLCB0eXBlb2Yob2JqZWN0KSk7Ci0gICAgICAgICAgICByZXR1cm4gRXhwcmVzc2lvbi5MYW1iZGE8RnVuYzxJTWVzc2FnZSwgb2JqZWN0Pj4odXBjYXN0LCBwYXJhbWV0ZXIpLkNvbXBpbGUoKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSBkZWxlZ2F0ZSB3aGljaCB3aWxsIGNhc3QgdGhlIGFyZ3VtZW50IHRvIHRoZSBhcHByb3ByaWF0ZSBtZXRob2QgdGFyZ2V0IHR5cGUsCi0gICAgICAgIC8vLyBjYWxsIHRoZSBtZXRob2Qgb24gaXQsIHRoZW4gY29udmVydCB0aGUgcmVzdWx0IHRvIHRoZSBzcGVjaWZpZWQgdHlwZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIEZ1bmM8SU1lc3NhZ2UsIFQ+IENyZWF0ZUZ1bmNJTWVzc2FnZVQ8VD4oTWV0aG9kSW5mbyBtZXRob2QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckV4cHJlc3Npb24gcGFyYW1ldGVyID0gRXhwcmVzc2lvbi5QYXJhbWV0ZXIodHlwZW9mKElNZXNzYWdlKSwgInAiKTsKLSAgICAgICAgICAgIEV4cHJlc3Npb24gZG93bmNhc3QgPSBFeHByZXNzaW9uLkNvbnZlcnQocGFyYW1ldGVyLCBtZXRob2QuRGVjbGFyaW5nVHlwZSk7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGNhbGwgPSBFeHByZXNzaW9uLkNhbGwoZG93bmNhc3QsIG1ldGhvZCk7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIHVwY2FzdCA9IEV4cHJlc3Npb24uQ29udmVydChjYWxsLCB0eXBlb2YoVCkpOwotICAgICAgICAgICAgcmV0dXJuIEV4cHJlc3Npb24uTGFtYmRhPEZ1bmM8SU1lc3NhZ2UsIFQ+Pih1cGNhc3QsIHBhcmFtZXRlcikuQ29tcGlsZSgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIGRlbGVnYXRlIHdoaWNoIHdpbGwgZXhlY3V0ZSB0aGUgZ2l2ZW4gbWV0aG9kIGFmdGVyIGNhc3RpbmcgdGhlIGZpcnN0IGFyZ3VtZW50IHRvCi0gICAgICAgIC8vLyB0aGUgdGFyZ2V0IHR5cGUgb2YgdGhlIG1ldGhvZCwgYW5kIHRoZSBzZWNvbmQgYXJndW1lbnQgdG8gdGhlIGZpcnN0IHBhcmFtZXRlciB0eXBlIG9mIHRoZSBtZXRob2QuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBBY3Rpb248SU1lc3NhZ2UsIG9iamVjdD4gQ3JlYXRlQWN0aW9uSU1lc3NhZ2VPYmplY3QoTWV0aG9kSW5mbyBtZXRob2QpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFBhcmFtZXRlckV4cHJlc3Npb24gdGFyZ2V0UGFyYW1ldGVyID0gRXhwcmVzc2lvbi5QYXJhbWV0ZXIodHlwZW9mKElNZXNzYWdlKSwgInRhcmdldCIpOwotICAgICAgICAgICAgUGFyYW1ldGVyRXhwcmVzc2lvbiBhcmdQYXJhbWV0ZXIgPSBFeHByZXNzaW9uLlBhcmFtZXRlcih0eXBlb2Yob2JqZWN0KSwgImFyZyIpOwotICAgICAgICAgICAgRXhwcmVzc2lvbiBjYXN0VGFyZ2V0ID0gRXhwcmVzc2lvbi5Db252ZXJ0KHRhcmdldFBhcmFtZXRlciwgbWV0aG9kLkRlY2xhcmluZ1R5cGUpOwotICAgICAgICAgICAgRXhwcmVzc2lvbiBjYXN0QXJndW1lbnQgPSBFeHByZXNzaW9uLkNvbnZlcnQoYXJnUGFyYW1ldGVyLCBtZXRob2QuR2V0UGFyYW1ldGVycygpWzBdLlBhcmFtZXRlclR5cGUpOwotICAgICAgICAgICAgRXhwcmVzc2lvbiBjYWxsID0gRXhwcmVzc2lvbi5DYWxsKGNhc3RUYXJnZXQsIG1ldGhvZCwgY2FzdEFyZ3VtZW50KTsKLSAgICAgICAgICAgIHJldHVybiBFeHByZXNzaW9uLkxhbWJkYTxBY3Rpb248SU1lc3NhZ2UsIG9iamVjdD4+KGNhbGwsIHRhcmdldFBhcmFtZXRlciwgYXJnUGFyYW1ldGVyKS5Db21waWxlKCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDcmVhdGVzIGEgZGVsZWdhdGUgd2hpY2ggd2lsbCBleGVjdXRlIHRoZSBnaXZlbiBtZXRob2QgYWZ0ZXIgY2FzdGluZyB0aGUgZmlyc3QgYXJndW1lbnQgdG8KLSAgICAgICAgLy8vIHRoZSB0YXJnZXQgdHlwZSBvZiB0aGUgbWV0aG9kLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgQWN0aW9uPElNZXNzYWdlPiBDcmVhdGVBY3Rpb25JTWVzc2FnZShNZXRob2RJbmZvIG1ldGhvZCkKLSAgICAgICAgewotICAgICAgICAgICAgUGFyYW1ldGVyRXhwcmVzc2lvbiB0YXJnZXRQYXJhbWV0ZXIgPSBFeHByZXNzaW9uLlBhcmFtZXRlcih0eXBlb2YoSU1lc3NhZ2UpLCAidGFyZ2V0Iik7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGNhc3RUYXJnZXQgPSBFeHByZXNzaW9uLkNvbnZlcnQodGFyZ2V0UGFyYW1ldGVyLCBtZXRob2QuRGVjbGFyaW5nVHlwZSk7Ci0gICAgICAgICAgICBFeHByZXNzaW9uIGNhbGwgPSBFeHByZXNzaW9uLkNhbGwoY2FzdFRhcmdldCwgbWV0aG9kKTsKLSAgICAgICAgICAgIHJldHVybiBFeHByZXNzaW9uLkxhbWJkYTxBY3Rpb248SU1lc3NhZ2U+PihjYWxsLCB0YXJnZXRQYXJhbWV0ZXIpLkNvbXBpbGUoKTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vUmVwZWF0ZWRGaWVsZEFjY2Vzc29yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9SZXBlYXRlZEZpZWxkQWNjZXNzb3IuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkNDA4NDcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9SZXBlYXRlZEZpZWxkQWNjZXNzb3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnM7Ci11c2luZyBTeXN0ZW0uUmVmbGVjdGlvbjsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBY2Nlc3NvciBmb3IgcmVwZWF0ZWQgZmllbGRzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgaW50ZXJuYWwgc2VhbGVkIGNsYXNzIFJlcGVhdGVkRmllbGRBY2Nlc3NvciA6IEZpZWxkQWNjZXNzb3JCYXNlCi0gICAgewotICAgICAgICBpbnRlcm5hbCBSZXBlYXRlZEZpZWxkQWNjZXNzb3IoUHJvcGVydHlJbmZvIHByb3BlcnR5LCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcikgOiBiYXNlKHByb3BlcnR5LCBkZXNjcmlwdG9yKQotICAgICAgICB7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBDbGVhcihJTWVzc2FnZSBtZXNzYWdlKQotICAgICAgICB7Ci0gICAgICAgICAgICBJTGlzdCBsaXN0ID0gKElMaXN0KSBHZXRWYWx1ZShtZXNzYWdlKTsKLSAgICAgICAgICAgIGxpc3QuQ2xlYXIoKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIFNldFZhbHVlKElNZXNzYWdlIG1lc3NhZ2UsIG9iamVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIlNldFZhbHVlIGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgcmVwZWF0ZWQgZmllbGRzIik7Ci0gICAgICAgIH0KLQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vU2VydmljZURlc2NyaXB0b3IuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL1NlcnZpY2VEZXNjcmlwdG9yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzBhNTAxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vU2VydmljZURlc2NyaXB0b3IuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw4OSArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBEZXNjcmliZXMgYSBzZXJ2aWNlIHR5cGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yIDogRGVzY3JpcHRvckJhc2UKLSAgICB7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgU2VydmljZURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICAgICAgcHJpdmF0ZSByZWFkb25seSBJTGlzdDxNZXRob2REZXNjcmlwdG9yPiBtZXRob2RzOwotCi0gICAgICAgIGludGVybmFsIFNlcnZpY2VEZXNjcmlwdG9yKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG8sIEZpbGVEZXNjcmlwdG9yIGZpbGUsIGludCBpbmRleCkKLSAgICAgICAgICAgIDogYmFzZShmaWxlLCBmaWxlLkNvbXB1dGVGdWxsTmFtZShudWxsLCBwcm90by5OYW1lKSwgaW5kZXgpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgICAgICAgIG1ldGhvZHMgPSBEZXNjcmlwdG9yVXRpbC5Db252ZXJ0QW5kTWFrZVJlYWRPbmx5KHByb3RvLk1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtZXRob2QsIGkpID0+IG5ldyBNZXRob2REZXNjcmlwdG9yKG1ldGhvZCwgZmlsZSwgdGhpcywgaSkpOwotCi0gICAgICAgICAgICBmaWxlLkRlc2NyaXB0b3JQb29sLkFkZFN5bWJvbCh0aGlzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBicmllZiBuYW1lIG9mIHRoZSBkZXNjcmlwdG9yJ3MgdGFyZ2V0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIE5hbWUgeyBnZXQgeyByZXR1cm4gcHJvdG8uTmFtZTsgfSB9Ci0KLSAgICAgICAgaW50ZXJuYWwgU2VydmljZURlc2NyaXB0b3JQcm90byBQcm90byB7IGdldCB7IHJldHVybiBwcm90bzsgfSB9Ci0KLSAgICAgICAgLy8vIDx2YWx1ZT4KLSAgICAgICAgLy8vIEFuIHVubW9kaWZpYWJsZSBsaXN0IG9mIG1ldGhvZHMgaW4gdGhpcyBzZXJ2aWNlLgotICAgICAgICAvLy8gPC92YWx1ZT4KLSAgICAgICAgcHVibGljIElMaXN0PE1ldGhvZERlc2NyaXB0b3I+IE1ldGhvZHMKLSAgICAgICAgewotICAgICAgICAgICAgZ2V0IHsgcmV0dXJuIG1ldGhvZHM7IH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpbmRzIGEgbWV0aG9kIGJ5IG5hbWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFtZSI+VGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIG1ldGhvZCAoZS5nLiAiRm9vIikuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBtZXRob2QncyBkZWNzcmlwdG9yLCBvciBudWxsIGlmIG5vdCBmb3VuZC48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdG9yIEZpbmRNZXRob2RCeU5hbWUoU3RyaW5nIG5hbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGaWxlLkRlc2NyaXB0b3JQb29sLkZpbmRTeW1ib2w8TWV0aG9kRGVzY3JpcHRvcj4oRnVsbE5hbWUgKyAiLiIgKyBuYW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHZvaWQgQ3Jvc3NMaW5rKCkKLSAgICAgICAgewotICAgICAgICAgICAgZm9yZWFjaCAoTWV0aG9kRGVzY3JpcHRvciBtZXRob2QgaW4gbWV0aG9kcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBtZXRob2QuQ3Jvc3NMaW5rKCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci19ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9TaW5nbGVGaWVsZEFjY2Vzc29yLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9TaW5nbGVGaWVsZEFjY2Vzc29yLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmFjMjE3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1JlZmxlY3Rpb24vU2luZ2xlRmllbGRBY2Nlc3Nvci5jcworKysgL2Rldi9udWxsCkBAIC0xLDgxICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIFN5c3RlbTsKLXVzaW5nIFN5c3RlbS5SZWZsZWN0aW9uOwotdXNpbmcgR29vZ2xlLlByb3RvYnVmLkNvbXBhdGliaWxpdHk7Ci0KLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbgotewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gQWNjZXNzb3IgZm9yIHNpbmdsZSBmaWVsZHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBpbnRlcm5hbCBzZWFsZWQgY2xhc3MgU2luZ2xlRmllbGRBY2Nlc3NvciA6IEZpZWxkQWNjZXNzb3JCYXNlCi0gICAgewotICAgICAgICAvLyBBbGwgdGhlIHdvcmsgaGVyZSBpcyBhY3R1YWxseSBkb25lIGluIHRoZSBjb25zdHJ1Y3RvciAtIGl0IGNyZWF0ZXMgdGhlIGFwcHJvcHJpYXRlIGRlbGVnYXRlcy4KLSAgICAgICAgLy8gVGhlcmUgYXJlIHZhcmlvdXMgY2FzZXMgdG8gY29uc2lkZXIsIGJhc2VkIG9uIHRoZSBwcm9wZXJ0eSB0eXBlIChtZXNzYWdlLCBzdHJpbmcvYnl0ZXMsIG9yICJnZW51aW5lIiBwcmltaXRpdmUpCi0gICAgICAgIC8vIGFuZCBwcm90bzIgdnMgcHJvdG8zIGZvciBub24tbWVzc2FnZSB0eXBlcywgYXMgcHJvdG8zIGRvZXNuJ3Qgc3VwcG9ydCAiZnVsbCIgcHJlc2VuY2UgZGV0ZWN0aW9uIG9yIGRlZmF1bHQKLSAgICAgICAgLy8gdmFsdWVzLgotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQWN0aW9uPElNZXNzYWdlLCBvYmplY3Q+IHNldFZhbHVlRGVsZWdhdGU7Ci0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgQWN0aW9uPElNZXNzYWdlPiBjbGVhckRlbGVnYXRlOwotCi0gICAgICAgIGludGVybmFsIFNpbmdsZUZpZWxkQWNjZXNzb3IoUHJvcGVydHlJbmZvIHByb3BlcnR5LCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcikgOiBiYXNlKHByb3BlcnR5LCBkZXNjcmlwdG9yKQotICAgICAgICB7Ci0gICAgICAgICAgICBpZiAoIXByb3BlcnR5LkNhbldyaXRlKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBBcmd1bWVudEV4Y2VwdGlvbigiTm90IGFsbCByZXF1aXJlZCBwcm9wZXJ0aWVzL21ldGhvZHMgYXZhaWxhYmxlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBzZXRWYWx1ZURlbGVnYXRlID0gUmVmbGVjdGlvblV0aWwuQ3JlYXRlQWN0aW9uSU1lc3NhZ2VPYmplY3QocHJvcGVydHkuR2V0U2V0TWV0aG9kKCkpOwotCi0gICAgICAgICAgICB2YXIgY2xyVHlwZSA9IHByb3BlcnR5LlByb3BlcnR5VHlwZTsKLSAgICAgICAgICAgIAotICAgICAgICAgICAgLy8gVE9ETzogVmFsaWRhdGUgdGhhdCB0aGlzIGlzIGEgcmVhc29uYWJsZSBzaW5nbGUgZmllbGQ/IChTaG91bGQgYmUgYSB2YWx1ZSB0eXBlLCBhIG1lc3NhZ2UgdHlwZSwgb3Igc3RyaW5nL0J5dGVTdHJpbmcuKQotICAgICAgICAgICAgb2JqZWN0IGRlZmF1bHRWYWx1ZSA9Ci0gICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZFR5cGUgPT0gRmllbGRUeXBlLk1lc3NhZ2UgPyBudWxsCi0gICAgICAgICAgICAgICAgOiBjbHJUeXBlID09IHR5cGVvZihzdHJpbmcpID8gIiIKLSAgICAgICAgICAgICAgICA6IGNsclR5cGUgPT0gdHlwZW9mKEJ5dGVTdHJpbmcpID8gQnl0ZVN0cmluZy5FbXB0eQotICAgICAgICAgICAgICAgIDogQWN0aXZhdG9yLkNyZWF0ZUluc3RhbmNlKGNsclR5cGUpOwotICAgICAgICAgICAgY2xlYXJEZWxlZ2F0ZSA9IG1lc3NhZ2UgPT4gU2V0VmFsdWUobWVzc2FnZSwgZGVmYXVsdFZhbHVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHB1YmxpYyBvdmVycmlkZSB2b2lkIENsZWFyKElNZXNzYWdlIG1lc3NhZ2UpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGNsZWFyRGVsZWdhdGUobWVzc2FnZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBwdWJsaWMgb3ZlcnJpZGUgdm9pZCBTZXRWYWx1ZShJTWVzc2FnZSBtZXNzYWdlLCBvYmplY3QgdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHNldFZhbHVlRGVsZWdhdGUobWVzc2FnZSwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvUmVmbGVjdGlvbi9UeXBlUmVnaXN0cnkuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL1R5cGVSZWdpc3RyeS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk0ZTNlNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9SZWZsZWN0aW9uL1R5cGVSZWdpc3RyeS5jcworKysgL2Rldi9udWxsCkBAIC0xLDE4MyArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uTGlucTsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBBbiBpbW11dGFibGUgcmVnaXN0cnkgb2YgdHlwZXMgd2hpY2ggY2FuIGJlIGxvb2tlZCB1cCBieSB0aGVpciBmdWxsIG5hbWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc2VhbGVkIGNsYXNzIFR5cGVSZWdpc3RyeQotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQW4gZW1wdHkgdHlwZSByZWdpc3RyeSwgY29udGFpbmluZyBubyB0eXBlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIHN0YXRpYyBUeXBlUmVnaXN0cnkgRW1wdHkgeyBnZXQ7IH0gPSBuZXcgVHlwZVJlZ2lzdHJ5KG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgTWVzc2FnZURlc2NyaXB0b3I+KCkpOwotCi0gICAgICAgIHByaXZhdGUgcmVhZG9ubHkgRGljdGlvbmFyeTxzdHJpbmcsIE1lc3NhZ2VEZXNjcmlwdG9yPiBmdWxsTmFtZVRvTWVzc2FnZU1hcDsKLQotICAgICAgICBwcml2YXRlIFR5cGVSZWdpc3RyeShEaWN0aW9uYXJ5PHN0cmluZywgTWVzc2FnZURlc2NyaXB0b3I+IGZ1bGxOYW1lVG9NZXNzYWdlTWFwKQotICAgICAgICB7Ci0gICAgICAgICAgICB0aGlzLmZ1bGxOYW1lVG9NZXNzYWdlTWFwID0gZnVsbE5hbWVUb01lc3NhZ2VNYXA7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBdHRlbXB0cyB0byBmaW5kIGEgbWVzc2FnZSBkZXNjcmlwdG9yIGJ5IGl0cyBmdWxsIG5hbWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZnVsbE5hbWUiPlRoZSBmdWxsIG5hbWUgb2YgdGhlIG1lc3NhZ2UsIHdoaWNoIGlzIHRoZSBkb3Qtc2VwYXJhdGVkCi0gICAgICAgIC8vLyBjb21iaW5hdGlvbiBvZiBwYWNrYWdlLCBjb250YWluaW5nIG1lc3NhZ2VzIGFuZCBtZXNzYWdlIG5hbWU8L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIG1lc3NhZ2UgZGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIDxwYXJhbXJlZiBuYW1lPSJmdWxsTmFtZSIvPiBvciBudWxsCi0gICAgICAgIC8vLyBpZiB0aGVyZSBpcyBubyBzdWNoIG1lc3NhZ2UgZGVzY3JpcHRvci48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBNZXNzYWdlRGVzY3JpcHRvciBGaW5kKHN0cmluZyBmdWxsTmFtZSkKLSAgICAgICAgewotICAgICAgICAgICAgTWVzc2FnZURlc2NyaXB0b3IgcmV0OwotICAgICAgICAgICAgLy8gSWdub3JlIHRoZSByZXR1cm4gdmFsdWUgYXMgcmV0IHdpbGwgZW5kIHVwIHdpdGggdGhlIHJpZ2h0IHZhbHVlIGVpdGhlciB3YXkuCi0gICAgICAgICAgICBmdWxsTmFtZVRvTWVzc2FnZU1hcC5UcnlHZXRWYWx1ZShmdWxsTmFtZSwgb3V0IHJldCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIHR5cGUgcmVnaXN0cnkgZnJvbSB0aGUgc3BlY2lmaWVkIHNldCBvZiBmaWxlIGRlc2NyaXB0b3JzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGlzIGlzIGEgY29udmVuaWVuY2Ugb3ZlcmxvYWQgZm9yIDxzZWUgY3JlZj0iRnJvbUZpbGVzKElFbnVtZXJhYmxle0ZpbGVEZXNjcmlwdG9yfSkiLz4KLSAgICAgICAgLy8vIHRvIGFsbG93IGNhbGxzIHN1Y2ggYXMgPGM+VHlwZVJlZ2lzdHJ5LkZyb21GaWxlcyhkZXNjcmlwdG9yMSwgZGVzY3JpcHRvcjIpPC9jPi4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJmaWxlRGVzY3JpcHRvcnMiPlRoZSBzZXQgb2YgZmlsZXMgdG8gaW5jbHVkZSBpbiB0aGUgcmVnaXN0cnkuIE11c3Qgbm90IGNvbnRhaW4gbnVsbCB2YWx1ZXMuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgdHlwZSByZWdpc3RyeSBmb3IgdGhlIGdpdmVuIGZpbGVzLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBUeXBlUmVnaXN0cnkgRnJvbUZpbGVzKHBhcmFtcyBGaWxlRGVzY3JpcHRvcltdIGZpbGVEZXNjcmlwdG9ycykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIEZyb21GaWxlcygoSUVudW1lcmFibGU8RmlsZURlc2NyaXB0b3I+KSBmaWxlRGVzY3JpcHRvcnMpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIHR5cGUgcmVnaXN0cnkgZnJvbSB0aGUgc3BlY2lmaWVkIHNldCBvZiBmaWxlIGRlc2NyaXB0b3JzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBBbGwgbWVzc2FnZSB0eXBlcyB3aXRoaW4gYWxsIHRoZSBzcGVjaWZpZWQgZmlsZXMgYXJlIGFkZGVkIHRvIHRoZSByZWdpc3RyeSwgYW5kCi0gICAgICAgIC8vLyB0aGUgZGVwZW5kZW5jaWVzIG9mIHRoZSBzcGVjaWZpZWQgZmlsZXMgYXJlIGFsc28gYWRkZWQsIHJlY3Vyc2l2ZWx5LgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImZpbGVEZXNjcmlwdG9ycyI+VGhlIHNldCBvZiBmaWxlcyB0byBpbmNsdWRlIGluIHRoZSByZWdpc3RyeS4gTXVzdCBub3QgY29udGFpbiBudWxsIHZhbHVlcy48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+QSB0eXBlIHJlZ2lzdHJ5IGZvciB0aGUgZ2l2ZW4gZmlsZXMuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIFR5cGVSZWdpc3RyeSBGcm9tRmlsZXMoSUVudW1lcmFibGU8RmlsZURlc2NyaXB0b3I+IGZpbGVEZXNjcmlwdG9ycykKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChmaWxlRGVzY3JpcHRvcnMsIG5hbWVvZihmaWxlRGVzY3JpcHRvcnMpKTsKLSAgICAgICAgICAgIHZhciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKLSAgICAgICAgICAgIGZvcmVhY2ggKHZhciBmaWxlIGluIGZpbGVEZXNjcmlwdG9ycykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLkFkZEZpbGUoZmlsZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5CdWlsZCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIHR5cGUgcmVnaXN0cnkgZnJvbSB0aGUgZmlsZSBkZXNjcmlwdG9yIHBhcmVudHMgb2YgdGhlIHNwZWNpZmllZCBzZXQgb2YgbWVzc2FnZSBkZXNjcmlwdG9ycy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhpcyBpcyBhIGNvbnZlbmllbmNlIG92ZXJsb2FkIGZvciA8c2VlIGNyZWY9IkZyb21NZXNzYWdlcyhJRW51bWVyYWJsZXtNZXNzYWdlRGVzY3JpcHRvcn0pIi8+Ci0gICAgICAgIC8vLyB0byBhbGxvdyBjYWxscyBzdWNoIGFzIDxjPlR5cGVSZWdpc3RyeS5Gcm9tRmlsZXMoZGVzY3JpcHRvcjEsIGRlc2NyaXB0b3IyKTwvYz4uCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZURlc2NyaXB0b3JzIj5UaGUgc2V0IG9mIG1lc3NhZ2UgZGVzY3JpcHRvcnMgdG8gdXNlIHRvIGlkZW50aWZ5IGZpbGUgZGVzY3JpcHRvcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVnaXN0cnkuCi0gICAgICAgIC8vLyBNdXN0IG5vdCBjb250YWluIG51bGwgdmFsdWVzLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBmaWxlcy48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZVJlZ2lzdHJ5IEZyb21NZXNzYWdlcyhwYXJhbXMgTWVzc2FnZURlc2NyaXB0b3JbXSBtZXNzYWdlRGVzY3JpcHRvcnMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBGcm9tTWVzc2FnZXMoKElFbnVtZXJhYmxlPE1lc3NhZ2VEZXNjcmlwdG9yPikgbWVzc2FnZURlc2NyaXB0b3JzKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENyZWF0ZXMgYSB0eXBlIHJlZ2lzdHJ5IGZyb20gdGhlIGZpbGUgZGVzY3JpcHRvciBwYXJlbnRzIG9mIHRoZSBzcGVjaWZpZWQgc2V0IG9mIG1lc3NhZ2UgZGVzY3JpcHRvcnMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIFRoZSBzcGVjaWZpZWQgbWVzc2FnZSBkZXNjcmlwdG9ycyBhcmUgb25seSB1c2VkIHRvIGlkZW50aWZ5IHRoZWlyIGZpbGUgZGVzY3JpcHRvcnM7IHRoZSByZXR1cm5lZCByZWdpc3RyeQotICAgICAgICAvLy8gY29udGFpbnMgYWxsIHRoZSB0eXBlcyB3aXRoaW4gdGhlIGZpbGUgZGVzY3JpcHRvcnMgd2hpY2ggY29udGFpbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgZGVzY3JpcHRvcnMgKGFuZAotICAgICAgICAvLy8gdGhlIGRlcGVuZGVuY2llcyBvZiB0aG9zZSBmaWxlcyksIG5vdCBqdXN0IHRoZSBzcGVjaWZpZWQgbWVzc2FnZXMuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibWVzc2FnZURlc2NyaXB0b3JzIj5UaGUgc2V0IG9mIG1lc3NhZ2UgZGVzY3JpcHRvcnMgdG8gdXNlIHRvIGlkZW50aWZ5IGZpbGUgZGVzY3JpcHRvcnMgdG8gaW5jbHVkZSBpbiB0aGUgcmVnaXN0cnkuCi0gICAgICAgIC8vLyBNdXN0IG5vdCBjb250YWluIG51bGwgdmFsdWVzLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIHR5cGUgcmVnaXN0cnkgZm9yIHRoZSBnaXZlbiBmaWxlcy48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZVJlZ2lzdHJ5IEZyb21NZXNzYWdlcyhJRW51bWVyYWJsZTxNZXNzYWdlRGVzY3JpcHRvcj4gbWVzc2FnZURlc2NyaXB0b3JzKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKG1lc3NhZ2VEZXNjcmlwdG9ycywgbmFtZW9mKG1lc3NhZ2VEZXNjcmlwdG9ycykpOwotICAgICAgICAgICAgcmV0dXJuIEZyb21GaWxlcyhtZXNzYWdlRGVzY3JpcHRvcnMuU2VsZWN0KG1kID0+IG1kLkZpbGUpKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEJ1aWxkZXIgY2xhc3Mgd2hpY2ggaXNuJ3QgZXhwb3NlZCwgYnV0IGFjdHMgYXMgYSBjb252ZW5pZW50IGFsdGVybmF0aXZlIHRvIHBhc3Npbmcgcm91bmQgdHdvIGRpY3Rpb25hcmllcyBpbiByZWN1cnNpdmUgY2FsbHMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHByaXZhdGUgY2xhc3MgQnVpbGRlcgotICAgICAgICB7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IERpY3Rpb25hcnk8c3RyaW5nLCBNZXNzYWdlRGVzY3JpcHRvcj4gdHlwZXM7Ci0gICAgICAgICAgICBwcml2YXRlIHJlYWRvbmx5IEhhc2hTZXQ8c3RyaW5nPiBmaWxlRGVzY3JpcHRvck5hbWVzOwotCi0gICAgICAgICAgICBpbnRlcm5hbCBCdWlsZGVyKCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0eXBlcyA9IG5ldyBEaWN0aW9uYXJ5PHN0cmluZywgTWVzc2FnZURlc2NyaXB0b3I+KCk7Ci0gICAgICAgICAgICAgICAgZmlsZURlc2NyaXB0b3JOYW1lcyA9IG5ldyBIYXNoU2V0PHN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaW50ZXJuYWwgdm9pZCBBZGRGaWxlKEZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmICghZmlsZURlc2NyaXB0b3JOYW1lcy5BZGQoZmlsZURlc2NyaXB0b3IuTmFtZSkpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBkZXBlbmRlbmN5IGluIGZpbGVEZXNjcmlwdG9yLkRlcGVuZGVuY2llcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZEZpbGUoZGVwZW5kZW5jeSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGZvcmVhY2ggKHZhciBtZXNzYWdlIGluIGZpbGVEZXNjcmlwdG9yLk1lc3NhZ2VUeXBlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBwcml2YXRlIHZvaWQgQWRkTWVzc2FnZShNZXNzYWdlRGVzY3JpcHRvciBtZXNzYWdlRGVzY3JpcHRvcikKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBmb3JlYWNoICh2YXIgbmVzdGVkVHlwZSBpbiBtZXNzYWdlRGVzY3JpcHRvci5OZXN0ZWRUeXBlcykKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIEFkZE1lc3NhZ2UobmVzdGVkVHlwZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIC8vIFRoaXMgd2lsbCBvdmVyd3JpdGUgYW55IHByZXZpb3VzIGVudHJ5LiBHaXZlbiB0aGF0IGVhY2ggZmlsZSBzaG91bGQKLSAgICAgICAgICAgICAgICAvLyBvbmx5IGJlIGFkZGVkIG9uY2UsIHRoaXMgY291bGQgYmUgYSBwcm9ibGVtIHN1Y2ggYXMgcGFja2FnZSBBLkIgd2l0aCB0eXBlIEMsCi0gICAgICAgICAgICAgICAgLy8gYW5kIHBhY2thZ2UgQSB3aXRoIHR5cGUgQi5DLi4uIGl0J3MgdW5jbGVhciB3aGF0IHdlIHNob3VsZCBkbyBpbiB0aGF0IGNhc2UuCi0gICAgICAgICAgICAgICAgdHlwZXNbbWVzc2FnZURlc2NyaXB0b3IuRnVsbE5hbWVdID0gbWVzc2FnZURlc2NyaXB0b3I7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGludGVybmFsIFR5cGVSZWdpc3RyeSBCdWlsZCgpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBUeXBlUmVnaXN0cnkodHlwZXMpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvQW55LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvQW55LmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NzFhMzgzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0FueS5jcworKysgL2Rldi9udWxsCkBAIC0xLDI2MSArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvYW55LnByb3RvCi0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxCi0jcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCi0KLXVzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWY7Ci11c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5Db2xsZWN0aW9uczsKLXVzaW5nIHBiciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb247Ci11c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcyB7Ci0KLSAgLy8vIDxzdW1tYXJ5PkhvbGRlciBmb3IgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZnJvbSBnb29nbGUvcHJvdG9idWYvYW55LnByb3RvPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgQW55UmVmbGVjdGlvbiB7Ci0KLSAgICAjcmVnaW9uIERlc2NyaXB0b3IKLSAgICAvLy8gPHN1bW1hcnk+RmlsZSBkZXNjcmlwdG9yIGZvciBnb29nbGUvcHJvdG9idWYvYW55LnByb3RvPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgIHN0YXRpYyBBbnlSZWZsZWN0aW9uKCkgewotICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKAotICAgICAgICAgIHN0cmluZy5Db25jYXQoCi0gICAgICAgICAgICAiQ2hsbmIyOW5iR1V2Y0hKdmRHOWlkV1l2WVc1NUxuQnliM1J2RWc5bmIyOW5iR1V1Y0hKdmRHOWlkV1lpIiwKLSAgICAgICAgICAgICJKZ29EUVc1NUVoQUtDSFI1Y0dWZmRYSnNHQUVnQVNnSkVnMEtCWFpoYkhWbEdBSWdBU2dNUW5JS0UyTnYiLAotICAgICAgICAgICAgImJTNW5iMjluYkdVdWNISnZkRzlpZFdaQ0NFRnVlVkJ5YjNSdlVBRmFKV2RwZEdoMVlpNWpiMjB2WjI5cyIsCi0gICAgICAgICAgICAiWVc1bkwzQnliM1J2WW5WbUwzQjBlWEJsY3k5aGJubWdBUUdpQWdOSFVFS3FBaDVIYjI5bmJHVXVVSEp2IiwKLSAgICAgICAgICAgICJkRzlpZFdZdVYyVnNiRXR1YjNkdVZIbHdaWE5pQm5CeWIzUnZNdz09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQW55LlBhcnNlciwgbmV3W117ICJUeXBlVXJsIiwgIlZhbHVlIiB9LCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgIH0pKTsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgYEFueWAgY29udGFpbnMgYW4gYXJiaXRyYXJ5IHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UgYWxvbmcgd2l0aCBhCi0gIC8vLyAgVVJMIHRoYXQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIHRoZSBzZXJpYWxpemVkIG1lc3NhZ2UuCi0gIC8vLwotICAvLy8gIFByb3RvYnVmIGxpYnJhcnkgcHJvdmlkZXMgc3VwcG9ydCB0byBwYWNrL3VucGFjayBBbnkgdmFsdWVzIGluIHRoZSBmb3JtCi0gIC8vLyAgb2YgdXRpbGl0eSBmdW5jdGlvbnMgb3IgYWRkaXRpb25hbCBnZW5lcmF0ZWQgbWV0aG9kcyBvZiB0aGUgQW55IHR5cGUuCi0gIC8vLwotICAvLy8gIEV4YW1wbGUgMTogUGFjayBhbmQgdW5wYWNrIGEgbWVzc2FnZSBpbiBDKysuCi0gIC8vLwotICAvLy8gICAgICBGb28gZm9vID0gLi4uOwotICAvLy8gICAgICBBbnkgYW55OwotICAvLy8gICAgICBhbnkuUGFja0Zyb20oZm9vKTsKLSAgLy8vICAgICAgLi4uCi0gIC8vLyAgICAgIGlmIChhbnkuVW5wYWNrVG8oJmFtcDtmb28pKSB7Ci0gIC8vLyAgICAgICAgLi4uCi0gIC8vLyAgICAgIH0KLSAgLy8vCi0gIC8vLyAgRXhhbXBsZSAyOiBQYWNrIGFuZCB1bnBhY2sgYSBtZXNzYWdlIGluIEphdmEuCi0gIC8vLwotICAvLy8gICAgICBGb28gZm9vID0gLi4uOwotICAvLy8gICAgICBBbnkgYW55ID0gQW55LnBhY2soZm9vKTsKLSAgLy8vICAgICAgLi4uCi0gIC8vLyAgICAgIGlmIChhbnkuaXMoRm9vLmNsYXNzKSkgewotICAvLy8gICAgICAgIGZvbyA9IGFueS51bnBhY2soRm9vLmNsYXNzKTsKLSAgLy8vICAgICAgfQotICAvLy8KLSAgLy8vICBUaGUgcGFjayBtZXRob2RzIHByb3ZpZGVkIGJ5IHByb3RvYnVmIGxpYnJhcnkgd2lsbCBieSBkZWZhdWx0IHVzZQotICAvLy8gICd0eXBlLmdvb2dsZWFwaXMuY29tL2Z1bGwudHlwZS5uYW1lJyBhcyB0aGUgdHlwZSBVUkwgYW5kIHRoZSB1bnBhY2sKLSAgLy8vICBtZXRob2RzIG9ubHkgdXNlIHRoZSBmdWxseSBxdWFsaWZpZWQgdHlwZSBuYW1lIGFmdGVyIHRoZSBsYXN0ICcvJwotICAvLy8gIGluIHRoZSB0eXBlIFVSTCwgZm9yIGV4YW1wbGUgImZvby5iYXIuY29tL3gveS56IiB3aWxsIHlpZWxkIHR5cGUKLSAgLy8vICBuYW1lICJ5LnoiLgotICAvLy8KLSAgLy8vICBKU09OCi0gIC8vLyAgPT09PQotICAvLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIG9mIGFuIGBBbnlgIHZhbHVlIHVzZXMgdGhlIHJlZ3VsYXIKLSAgLy8vICByZXByZXNlbnRhdGlvbiBvZiB0aGUgZGVzZXJpYWxpemVkLCBlbWJlZGRlZCBtZXNzYWdlLCB3aXRoIGFuCi0gIC8vLyAgYWRkaXRpb25hbCBmaWVsZCBgQHR5cGVgIHdoaWNoIGNvbnRhaW5zIHRoZSB0eXBlIFVSTC4gRXhhbXBsZToKLSAgLy8vCi0gIC8vLyAgICAgIHBhY2thZ2UgZ29vZ2xlLnByb2ZpbGU7Ci0gIC8vLyAgICAgIG1lc3NhZ2UgUGVyc29uIHsKLSAgLy8vICAgICAgICBzdHJpbmcgZmlyc3RfbmFtZSA9IDE7Ci0gIC8vLyAgICAgICAgc3RyaW5nIGxhc3RfbmFtZSA9IDI7Ci0gIC8vLyAgICAgIH0KLSAgLy8vCi0gIC8vLyAgICAgIHsKLSAgLy8vICAgICAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvZmlsZS5QZXJzb24iLAotICAvLy8gICAgICAgICJmaXJzdE5hbWUiOiAmbHQ7c3RyaW5nPiwKLSAgLy8vICAgICAgICAibGFzdE5hbWUiOiAmbHQ7c3RyaW5nPgotICAvLy8gICAgICB9Ci0gIC8vLwotICAvLy8gIElmIHRoZSBlbWJlZGRlZCBtZXNzYWdlIHR5cGUgaXMgd2VsbC1rbm93biBhbmQgaGFzIGEgY3VzdG9tIEpTT04KLSAgLy8vICByZXByZXNlbnRhdGlvbiwgdGhhdCByZXByZXNlbnRhdGlvbiB3aWxsIGJlIGVtYmVkZGVkIGFkZGluZyBhIGZpZWxkCi0gIC8vLyAgYHZhbHVlYCB3aGljaCBob2xkcyB0aGUgY3VzdG9tIEpTT04gaW4gYWRkaXRpb24gdG8gdGhlIGBAdHlwZWAKLSAgLy8vICBmaWVsZC4gRXhhbXBsZSAoZm9yIG1lc3NhZ2UgW2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbl1bXSk6Ci0gIC8vLwotICAvLy8gICAgICB7Ci0gIC8vLyAgICAgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIiwKLSAgLy8vICAgICAgICAidmFsdWUiOiAiMS4yMTJzIgotICAvLy8gICAgICB9Ci0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBBbnkgOiBwYjo6SU1lc3NhZ2U8QW55PiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8QW55PiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEFueT4oKCkgPT4gbmV3IEFueSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEFueT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEFueSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgQW55KEFueSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgdHlwZVVybF8gPSBvdGhlci50eXBlVXJsXzsKLSAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQW55IENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBBbnkodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ0eXBlX3VybCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVHlwZVVybEZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyB0eXBlVXJsXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEEgVVJML3Jlc291cmNlIG5hbWUgd2hvc2UgY29udGVudCBkZXNjcmliZXMgdGhlIHR5cGUgb2YgdGhlCi0gICAgLy8vICBzZXJpYWxpemVkIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlLgotICAgIC8vLwotICAgIC8vLyAgRm9yIFVSTHMgd2hpY2ggdXNlIHRoZSBzY2hlbWEgYGh0dHBgLCBgaHR0cHNgLCBvciBubyBzY2hlbWEsIHRoZQotICAgIC8vLyAgZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBhbmQgaW50ZXJwcmV0YXRpb25zIGFwcGx5OgotICAgIC8vLwotICAgIC8vLyAgKiBJZiBubyBzY2hlbWEgaXMgcHJvdmlkZWQsIGBodHRwc2AgaXMgYXNzdW1lZC4KLSAgICAvLy8gICogVGhlIGxhc3Qgc2VnbWVudCBvZiB0aGUgVVJMJ3MgcGF0aCBtdXN0IHJlcHJlc2VudCB0aGUgZnVsbHkKLSAgICAvLy8gICAgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHR5cGUgKGFzIGluIGBwYXRoL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbmApLgotICAgIC8vLyAgICBUaGUgbmFtZSBzaG91bGQgYmUgaW4gYSBjYW5vbmljYWwgZm9ybSAoZS5nLiwgbGVhZGluZyAiLiIgaXMKLSAgICAvLy8gICAgbm90IGFjY2VwdGVkKS4KLSAgICAvLy8gICogQW4gSFRUUCBHRVQgb24gdGhlIFVSTCBtdXN0IHlpZWxkIGEgW2dvb2dsZS5wcm90b2J1Zi5UeXBlXVtdCi0gICAgLy8vICAgIHZhbHVlIGluIGJpbmFyeSBmb3JtYXQsIG9yIHByb2R1Y2UgYW4gZXJyb3IuCi0gICAgLy8vICAqIEFwcGxpY2F0aW9ucyBhcmUgYWxsb3dlZCB0byBjYWNoZSBsb29rdXAgcmVzdWx0cyBiYXNlZCBvbiB0aGUKLSAgICAvLy8gICAgVVJMLCBvciBoYXZlIHRoZW0gcHJlY29tcGlsZWQgaW50byBhIGJpbmFyeSB0byBhdm9pZCBhbnkKLSAgICAvLy8gICAgbG9va3VwLiBUaGVyZWZvcmUsIGJpbmFyeSBjb21wYXRpYmlsaXR5IG5lZWRzIHRvIGJlIHByZXNlcnZlZAotICAgIC8vLyAgICBvbiBjaGFuZ2VzIHRvIHR5cGVzLiAoVXNlIHZlcnNpb25lZCB0eXBlIG5hbWVzIHRvIG1hbmFnZQotICAgIC8vLyAgICBicmVha2luZyBjaGFuZ2VzLikKLSAgICAvLy8KLSAgICAvLy8gIFNjaGVtYXMgb3RoZXIgdGhhbiBgaHR0cGAsIGBodHRwc2AgKG9yIHRoZSBlbXB0eSBzY2hlbWEpIG1pZ2h0IGJlCi0gICAgLy8vICB1c2VkIHdpdGggaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgc2VtYW50aWNzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBUeXBlVXJsIHsKLSAgICAgIGdldCB7IHJldHVybiB0eXBlVXJsXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgdHlwZVVybF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ2YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBwYjo6Qnl0ZVN0cmluZyB2YWx1ZV8gPSBwYjo6Qnl0ZVN0cmluZy5FbXB0eTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBNdXN0IGJlIGEgdmFsaWQgc2VyaWFsaXplZCBwcm90b2NvbCBidWZmZXIgb2YgdGhlIGFib3ZlIHNwZWNpZmllZCB0eXBlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiOjpCeXRlU3RyaW5nIFZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiB2YWx1ZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHZhbHVlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEFueSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEFueSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoVHlwZVVybCAhPSBvdGhlci5UeXBlVXJsKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoVmFsdWUgIT0gb3RoZXIuVmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoVHlwZVVybC5MZW5ndGggIT0gMCkgaGFzaCBePSBUeXBlVXJsLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoVmFsdWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKFR5cGVVcmwuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKFR5cGVVcmwpOwotICAgICAgfQotICAgICAgaWYgKFZhbHVlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKFZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoVHlwZVVybC5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoVHlwZVVybCk7Ci0gICAgICB9Ci0gICAgICBpZiAoVmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoVmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEFueSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlR5cGVVcmwuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgVHlwZVVybCA9IG90aGVyLlR5cGVVcmw7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgVmFsdWUgPSBvdGhlci5WYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBUeXBlVXJsID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIFZhbHVlID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gICNlbmRyZWdpb24KLQotfQotCi0jZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9BbnlQYXJ0aWFsLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvQW55UGFydGlhbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjRmYWM3My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9BbnlQYXJ0aWFsLmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLe+7vyNyZWdpb24gQ29weXJpZ2h0IG5vdGljZSBhbmQgbGljZW5zZQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jZW5kcmVnaW9uCi0KLXVzaW5nIEdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzCi17Ci0gICAgcHVibGljIHBhcnRpYWwgY2xhc3MgQW55Ci0gICAgewotICAgICAgICBwcml2YXRlIGNvbnN0IHN0cmluZyBEZWZhdWx0UHJlZml4ID0gInR5cGUuZ29vZ2xlYXBpcy5jb20iOwotCi0gICAgICAgIC8vIFRoaXMgY291bGQgYmUgbW92ZWQgdG8gTWVzc2FnZURlc2NyaXB0b3IgaWYgd2Ugd2FudGVkIHRvLCBidXQga2VlcGluZyBpdCBoZXJlIG1lYW5zCi0gICAgICAgIC8vIGFsbCB0aGUgQW55LXNwZWNpZmljIGNvZGUgaXMgaW4gdGhlIHNhbWUgcGxhY2UuCi0gICAgICAgIHByaXZhdGUgc3RhdGljIHN0cmluZyBHZXRUeXBlVXJsKE1lc3NhZ2VEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIHN0cmluZyBwcmVmaXgpID0+Ci0gICAgICAgICAgICBwcmVmaXguRW5kc1dpdGgoIi8iKSA/IHByZWZpeCArIGRlc2NyaXB0b3IuRnVsbE5hbWUgOiBwcmVmaXggKyAiLyIgKyBkZXNjcmlwdG9yLkZ1bGxOYW1lOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHJpZXZlcyB0aGUgdHlwZSBuYW1lIGZvciBhIHR5cGUgVVJMLiBUaGlzIGlzIGFsd2F5cyBqdXN0IHRoZSBsYXN0IHBhcnQgb2YgdGhlIFVSTCwKLSAgICAgICAgLy8vIGFmdGVyIHRoZSB0cmFpbGluZyBzbGFzaC4gTm8gdmFsaWRhdGlvbiBvZiBhbnl0aGluZyBiZWZvcmUgdGhlIHRyYWlsaW5nIHNsYXNoIGlzIHBlcmZvcm1lZC4KLSAgICAgICAgLy8vIElmIHRoZSB0eXBlIFVSTCBkb2VzIG5vdCBpbmNsdWRlIGEgc2xhc2gsIGFuIGVtcHR5IHN0cmluZyBpcyByZXR1cm5lZCByYXRoZXIgdGhhbiBhbiBleGNlcHRpb24KLSAgICAgICAgLy8vIGJlaW5nIHRocm93bjsgdGhpcyB3b24ndCBtYXRjaCBhbnkgdHlwZXMsIGFuZCB0aGUgY2FsbGluZyBjb2RlIGlzIHByb2JhYmx5IGluIGEgYmV0dGVyIHBvc2l0aW9uCi0gICAgICAgIC8vLyB0byBnaXZlIGEgbWVhbmluZ2Z1bCBlcnJvci4KLSAgICAgICAgLy8vIFRoZXJlIGlzIG5vIGhhbmRsaW5nIG9mIGZyYWdtZW50cyBvciBxdWVyaWVzICBhdCB0aGUgbW9tZW50LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InR5cGVVcmwiPlRoZSBVUkwgdG8gZXh0cmFjdCB0aGUgdHlwZSBuYW1lIGZyb208L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHR5cGUgbmFtZTwvcmV0dXJucz4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBHZXRUeXBlTmFtZShzdHJpbmcgdHlwZVVybCkKLSAgICAgICAgewotICAgICAgICAgICAgaW50IGxhc3RTbGFzaCA9IHR5cGVVcmwuTGFzdEluZGV4T2YoJy8nKTsKLSAgICAgICAgICAgIHJldHVybiBsYXN0U2xhc2ggPT0gLTEgPyAiIiA6IHR5cGVVcmwuU3Vic3RyaW5nKGxhc3RTbGFzaCArIDEpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVW5wYWNrcyB0aGUgY29udGVudCBvZiB0aGlzIEFueSBtZXNzYWdlIGludG8gdGhlIHRhcmdldCBtZXNzYWdlIHR5cGUsCi0gICAgICAgIC8vLyB3aGljaCBtdXN0IG1hdGNoIHRoZSB0eXBlIFVSTCB3aXRoaW4gdGhpcyBBbnkgbWVzc2FnZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDx0eXBlcGFyYW0gbmFtZT0iVCI+VGhlIHR5cGUgb2YgbWVzc2FnZSB0byB1bnBhY2sgdGhlIGNvbnRlbnQgaW50by48L3R5cGVwYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSB1bnBhY2tlZCBtZXNzYWdlLjwvcmV0dXJucz4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIj5UaGUgdGFyZ2V0IG1lc3NhZ2UgdHlwZSBkb2Vzbid0IG1hdGNoIHRoZSB0eXBlIFVSTCBpbiB0aGlzIG1lc3NhZ2U8L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIFQgVW5wYWNrPFQ+KCkgd2hlcmUgVCA6IElNZXNzYWdlLCBuZXcoKQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBOb3RlOiB0aGlzIGRvZXNuJ3QgcGVyZm9ybSBhcyB3ZWxsIGlzIGl0IG1pZ2h0LiBXZSBjb3VsZCB0YWtlIGEgTWVzc2FnZVBhcnNlcjxUPiBpbiBhbiBhbHRlcm5hdGl2ZSBvdmVybG9hZCwKLSAgICAgICAgICAgIC8vIHdoaWNoIHdvdWxkIGJlIGV4cGVjdGVkIHRvIHBlcmZvcm0gc2xpZ2h0bHkgYmV0dGVyLi4uIGFsdGhvdWdoIHRoZSBkaWZmZXJlbmNlIGlzIGxpa2VseSB0byBiZSBuZWdsaWdpYmxlLgotICAgICAgICAgICAgVCB0YXJnZXQgPSBuZXcgVCgpOwotICAgICAgICAgICAgaWYgKEdldFR5cGVOYW1lKFR5cGVVcmwpICE9IHRhcmdldC5EZXNjcmlwdG9yLkZ1bGxOYW1lKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICQiRnVsbCB0eXBlIG5hbWUgZm9yIHt0YXJnZXQuRGVzY3JpcHRvci5OYW1lfSBpcyB7dGFyZ2V0LkRlc2NyaXB0b3IuRnVsbE5hbWV9OyBBbnkgbWVzc2FnZSdzIHR5cGUgdXJsIGlzIHtUeXBlVXJsfSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGFyZ2V0Lk1lcmdlRnJvbShWYWx1ZSk7Ci0gICAgICAgICAgICByZXR1cm4gdGFyZ2V0OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUGFja3MgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGludG8gYW4gQW55IG1lc3NhZ2UgdXNpbmcgYSB0eXBlIFVSTCBwcmVmaXggb2YgInR5cGUuZ29vZ2xlYXBpcy5jb20iLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIHBhY2suPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkFuIEFueSBtZXNzYWdlIHdpdGggdGhlIGNvbnRlbnQgYW5kIHR5cGUgVVJMIG9mIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+LjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBBbnkgUGFjayhJTWVzc2FnZSBtZXNzYWdlKSA9PiBQYWNrKG1lc3NhZ2UsIERlZmF1bHRQcmVmaXgpOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFBhY2tzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpbnRvIGFuIEFueSBtZXNzYWdlIHVzaW5nIHRoZSBzcGVjaWZpZWQgdHlwZSBVUkwgcHJlZml4LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9Im1lc3NhZ2UiPlRoZSBtZXNzYWdlIHRvIHBhY2suPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0eXBlVXJsUHJlZml4Ij5UaGUgcHJlZml4IGZvciB0aGUgdHlwZSBVUkwuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkFuIEFueSBtZXNzYWdlIHdpdGggdGhlIGNvbnRlbnQgYW5kIHR5cGUgVVJMIG9mIDxwYXJhbXJlZiBuYW1lPSJtZXNzYWdlIi8+LjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBBbnkgUGFjayhJTWVzc2FnZSBtZXNzYWdlLCBzdHJpbmcgdHlwZVVybFByZWZpeCkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChtZXNzYWdlLCBuYW1lb2YobWVzc2FnZSkpOwotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh0eXBlVXJsUHJlZml4LCBuYW1lb2YodHlwZVVybFByZWZpeCkpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBBbnkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBUeXBlVXJsID0gR2V0VHlwZVVybChtZXNzYWdlLkRlc2NyaXB0b3IsIHR5cGVVcmxQcmVmaXgpLAotICAgICAgICAgICAgICAgIFZhbHVlID0gbWVzc2FnZS5Ub0J5dGVTdHJpbmcoKQotICAgICAgICAgICAgfTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0FwaS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0FwaS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTU2OGEyYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9BcGkuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw4NDcgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bwotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQotI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi11c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmOwotdXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMgewotCi0gIC8vLyA8c3VtbWFyeT5Ib2xkZXIgZm9yIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGZyb20gZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIEFwaVJlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bzwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICBzdGF0aWMgQXBpUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNobG5iMjluYkdVdmNISnZkRzlpZFdZdllYQnBMbkJ5YjNSdkVnOW5iMjluYkdVdWNISnZkRzlpZFdZYSIsCi0gICAgICAgICAgICAiSkdkdmIyZHNaUzl3Y205MGIySjFaaTl6YjNWeVkyVmZZMjl1ZEdWNGRDNXdjbTkwYnhvYVoyOXZaMnhsIiwKLSAgICAgICAgICAgICJMM0J5YjNSdlluVm1MM1I1Y0dVdWNISnZkRzhpZ1FJS0EwRndhUklNQ2dSdVlXMWxHQUVnQVNnSkVpZ0siLAotICAgICAgICAgICAgIkIyMWxkR2h2WkhNWUFpQURLQXN5Rnk1bmIyOW5iR1V1Y0hKdmRHOWlkV1l1VFdWMGFHOWtFaWdLQjI5dyIsCi0gICAgICAgICAgICAiZEdsdmJuTVlBeUFES0FzeUZ5NW5iMjluYkdVdWNISnZkRzlpZFdZdVQzQjBhVzl1RWc4S0IzWmxjbk5wIiwKLSAgICAgICAgICAgICJiMjRZQkNBQktBa1NOZ29PYzI5MWNtTmxYMk52Ym5SbGVIUVlCU0FCS0FzeUhpNW5iMjluYkdVdWNISnYiLAotICAgICAgICAgICAgImRHOWlkV1l1VTI5MWNtTmxRMjl1ZEdWNGRCSW1DZ1p0YVhocGJuTVlCaUFES0FzeUZpNW5iMjluYkdVdSIsCi0gICAgICAgICAgICAiY0hKdmRHOWlkV1l1VFdsNGFXNFNKd29HYzNsdWRHRjRHQWNnQVNnT01oY3VaMjl2WjJ4bExuQnliM1J2IiwKLSAgICAgICAgICAgICJZblZtTGxONWJuUmhlQ0xWQVFvR1RXVjBhRzlrRWd3S0JHNWhiV1VZQVNBQktBa1NHQW9RY21WeGRXVnoiLAotICAgICAgICAgICAgImRGOTBlWEJsWDNWeWJCZ0NJQUVvQ1JJWkNoRnlaWEYxWlhOMFgzTjBjbVZoYldsdVp4Z0RJQUVvQ0JJWiIsCi0gICAgICAgICAgICAiQ2hGeVpYTndiMjV6WlY5MGVYQmxYM1Z5YkJnRUlBRW9DUklhQ2hKeVpYTndiMjV6WlY5emRISmxZVzFwIiwKLSAgICAgICAgICAgICJibWNZQlNBQktBZ1NLQW9IYjNCMGFXOXVjeGdHSUFNb0N6SVhMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVAiLAotICAgICAgICAgICAgImNIUnBiMjRTSndvR2MzbHVkR0Y0R0FjZ0FTZ09NaGN1WjI5dloyeGxMbkJ5YjNSdlluVm1MbE41Ym5SaCIsCi0gICAgICAgICAgICAiZUNJakNnVk5hWGhwYmhJTUNnUnVZVzFsR0FFZ0FTZ0pFZ3dLQkhKdmIzUVlBaUFCS0FsQ1N3b1RZMjl0IiwKLSAgICAgICAgICAgICJMbWR2YjJkc1pTNXdjbTkwYjJKMVprSUlRWEJwVUhKdmRHOVFBYUFCQWFJQ0EwZFFRcW9DSGtkdmIyZHMiLAotICAgICAgICAgICAgIlpTNVFjbTkwYjJKMVppNVhaV3hzUzI1dmQyNVVlWEJsYzJJR2NISnZkRzh6IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHRSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGVSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpLlBhcnNlciwgbmV3W117ICJOYW1lIiwgIk1ldGhvZHMiLCAiT3B0aW9ucyIsICJWZXJzaW9uIiwgIlNvdXJjZUNvbnRleHQiLCAiTWl4aW5zIiwgIlN5bnRheCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuTWV0aG9kKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuTWV0aG9kLlBhcnNlciwgbmV3W117ICJOYW1lIiwgIlJlcXVlc3RUeXBlVXJsIiwgIlJlcXVlc3RTdHJlYW1pbmciLCAiUmVzcG9uc2VUeXBlVXJsIiwgIlJlc3BvbnNlU3RyZWFtaW5nIiwgIk9wdGlvbnMiLCAiU3ludGF4IiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5NaXhpbiksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1peGluLlBhcnNlciwgbmV3W117ICJOYW1lIiwgIlJvb3QiIH0sIG51bGwsIG51bGwsIG51bGwpCi0gICAgICAgICAgfSkpOwotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotICAjcmVnaW9uIE1lc3NhZ2VzCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBBcGkgaXMgYSBsaWdodC13ZWlnaHQgZGVzY3JpcHRvciBmb3IgYSBwcm90b2NvbCBidWZmZXIgc2VydmljZS4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEFwaSA6IHBiOjpJTWVzc2FnZTxBcGk+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxBcGk+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8QXBpPigoKSA9PiBuZXcgQXBpKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8QXBpPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQXBpUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBpKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBBcGkoQXBpIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBuYW1lXyA9IG90aGVyLm5hbWVfOwotICAgICAgbWV0aG9kc18gPSBvdGhlci5tZXRob2RzXy5DbG9uZSgpOwotICAgICAgb3B0aW9uc18gPSBvdGhlci5vcHRpb25zXy5DbG9uZSgpOwotICAgICAgdmVyc2lvbl8gPSBvdGhlci52ZXJzaW9uXzsKLSAgICAgIFNvdXJjZUNvbnRleHQgPSBvdGhlci5zb3VyY2VDb250ZXh0XyAhPSBudWxsID8gb3RoZXIuU291cmNlQ29udGV4dC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIG1peGluc18gPSBvdGhlci5taXhpbnNfLkNsb25lKCk7Ci0gICAgICBzeW50YXhfID0gb3RoZXIuc3ludGF4XzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQXBpIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBBcGkodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG9mIHRoaXMgYXBpLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lCi0gICAgLy8vICBmb2xsb3dlZCBieSB0aGUgYXBpJ3Mgc2ltcGxlIG5hbWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIE5hbWUgewotICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBuYW1lXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm1ldGhvZHMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1ldGhvZHNGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuTWV0aG9kPiBfcmVwZWF0ZWRfbWV0aG9kc19jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1ldGhvZC5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1ldGhvZD4gbWV0aG9kc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1ldGhvZD4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgbWV0aG9kcyBvZiB0aGlzIGFwaSwgaW4gdW5zcGVjaWZpZWQgb3JkZXIuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1ldGhvZD4gTWV0aG9kcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gbWV0aG9kc187IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbnMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbnNGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPiBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMjYsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbi5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbj4gb3B0aW9uc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbj4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBBbnkgbWV0YWRhdGEgYXR0YWNoZWQgdG8gdGhlIEFQSS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPiBPcHRpb25zIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25zXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidmVyc2lvbiIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmVyc2lvbkZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0cmluZyB2ZXJzaW9uXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEEgdmVyc2lvbiBzdHJpbmcgZm9yIHRoaXMgYXBpLiBJZiBzcGVjaWZpZWQsIG11c3QgaGF2ZSB0aGUgZm9ybQotICAgIC8vLyAgYG1ham9yLXZlcnNpb24ubWlub3ItdmVyc2lvbmAsIGFzIGluIGAxLjEwYC4gSWYgdGhlIG1pbm9yIHZlcnNpb24KLSAgICAvLy8gIGlzIG9taXR0ZWQsIGl0IGRlZmF1bHRzIHRvIHplcm8uIElmIHRoZSBlbnRpcmUgdmVyc2lvbiBmaWVsZCBpcwotICAgIC8vLyAgZW1wdHksIHRoZSBtYWpvciB2ZXJzaW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGFja2FnZSBuYW1lLCBhcwotICAgIC8vLyAgb3V0bGluZWQgYmVsb3cuIElmIHRoZSBmaWVsZCBpcyBub3QgZW1wdHksIHRoZSB2ZXJzaW9uIGluIHRoZQotICAgIC8vLyAgcGFja2FnZSBuYW1lIHdpbGwgYmUgdmVyaWZpZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIHdoYXQgaXMKLSAgICAvLy8gIHByb3ZpZGVkIGhlcmUuCi0gICAgLy8vCi0gICAgLy8vICBUaGUgdmVyc2lvbmluZyBzY2hlbWEgdXNlcyBbc2VtYW50aWMKLSAgICAvLy8gIHZlcnNpb25pbmddKGh0dHA6Ly9zZW12ZXIub3JnKSB3aGVyZSB0aGUgbWFqb3IgdmVyc2lvbiBudW1iZXIKLSAgICAvLy8gIGluZGljYXRlcyBhIGJyZWFraW5nIGNoYW5nZSBhbmQgdGhlIG1pbm9yIHZlcnNpb24gYW4gYWRkaXRpdmUsCi0gICAgLy8vICBub24tYnJlYWtpbmcgY2hhbmdlLiBCb3RoIHZlcnNpb24gbnVtYmVycyBhcmUgc2lnbmFscyB0byB1c2VycwotICAgIC8vLyAgd2hhdCB0byBleHBlY3QgZnJvbSBkaWZmZXJlbnQgdmVyc2lvbnMsIGFuZCBzaG91bGQgYmUgY2FyZWZ1bGx5Ci0gICAgLy8vICBjaG9zZW4gYmFzZWQgb24gdGhlIHByb2R1Y3QgcGxhbi4KLSAgICAvLy8KLSAgICAvLy8gIFRoZSBtYWpvciB2ZXJzaW9uIGlzIGFsc28gcmVmbGVjdGVkIGluIHRoZSBwYWNrYWdlIG5hbWUgb2YgdGhlCi0gICAgLy8vICBBUEksIHdoaWNoIG11c3QgZW5kIGluIGB2Jmx0O21ham9yLXZlcnNpb24+YCwgYXMgaW4KLSAgICAvLy8gIGBnb29nbGUuZmVhdHVyZS52MWAuIEZvciBtYWpvciB2ZXJzaW9ucyAwIGFuZCAxLCB0aGUgc3VmZml4IGNhbgotICAgIC8vLyAgYmUgb21pdHRlZC4gWmVybyBtYWpvciB2ZXJzaW9ucyBtdXN0IG9ubHkgYmUgdXNlZCBmb3IKLSAgICAvLy8gIGV4cGVyaW1lbnRhbCwgbm9uZS1HQSBhcGlzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBWZXJzaW9uIHsKLSAgICAgIGdldCB7IHJldHVybiB2ZXJzaW9uXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgdmVyc2lvbl8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzb3VyY2VfY29udGV4dCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU291cmNlQ29udGV4dEZpZWxkTnVtYmVyID0gNTsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQgc291cmNlQ29udGV4dF87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgU291cmNlIGNvbnRleHQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgc2VydmljZSByZXByZXNlbnRlZCBieSB0aGlzCi0gICAgLy8vICBtZXNzYWdlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQgU291cmNlQ29udGV4dCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc291cmNlQ29udGV4dF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNvdXJjZUNvbnRleHRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJtaXhpbnMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE1peGluc0ZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5NaXhpbj4gX3JlcGVhdGVkX21peGluc19jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoNTAsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1peGluLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuTWl4aW4+IG1peGluc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1peGluPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEluY2x1ZGVkIEFQSXMuIFNlZSBbTWl4aW5dW10uCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk1peGluPiBNaXhpbnMgewotICAgICAgZ2V0IHsgcmV0dXJuIG1peGluc187IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInN5bnRheCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU3ludGF4RmllbGROdW1iZXIgPSA3OwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3ludGF4IHN5bnRheF8gPSAwOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBzb3VyY2Ugc3ludGF4IG9mIHRoZSBzZXJ2aWNlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN5bnRheCBTeW50YXggewotICAgICAgZ2V0IHsgcmV0dXJuIHN5bnRheF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHN5bnRheF8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEFwaSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEFwaSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZSAhPSBvdGhlci5OYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighbWV0aG9kc18uRXF1YWxzKG90aGVyLm1ldGhvZHNfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIW9wdGlvbnNfLkVxdWFscyhvdGhlci5vcHRpb25zXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChWZXJzaW9uICE9IG90aGVyLlZlcnNpb24pIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhTb3VyY2VDb250ZXh0LCBvdGhlci5Tb3VyY2VDb250ZXh0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIW1peGluc18uRXF1YWxzKG90aGVyLm1peGluc18pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU3ludGF4ICE9IG90aGVyLlN5bnRheCkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IE5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gbWV0aG9kc18uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gb3B0aW9uc18uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChWZXJzaW9uLkxlbmd0aCAhPSAwKSBoYXNoIF49IFZlcnNpb24uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChzb3VyY2VDb250ZXh0XyAhPSBudWxsKSBoYXNoIF49IFNvdXJjZUNvbnRleHQuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gbWl4aW5zXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFN5bnRheCAhPSAwKSBoYXNoIF49IFN5bnRheC5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBtZXRob2RzXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX21ldGhvZHNfY29kZWMpOwotICAgICAgb3B0aW9uc18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9vcHRpb25zX2NvZGVjKTsKLSAgICAgIGlmIChWZXJzaW9uLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygzNCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhWZXJzaW9uKTsKLSAgICAgIH0KLSAgICAgIGlmIChzb3VyY2VDb250ZXh0XyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0Mik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU291cmNlQ29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBtaXhpbnNfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfbWl4aW5zX2NvZGVjKTsKLSAgICAgIGlmIChTeW50YXggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVFbnVtKChpbnQpIFN5bnRheCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE5hbWUpOwotICAgICAgfQotICAgICAgc2l6ZSArPSBtZXRob2RzXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9tZXRob2RzX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gb3B0aW9uc18uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICBpZiAoVmVyc2lvbi5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoVmVyc2lvbik7Ci0gICAgICB9Ci0gICAgICBpZiAoc291cmNlQ29udGV4dF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFNvdXJjZUNvbnRleHQpOwotICAgICAgfQotICAgICAgc2l6ZSArPSBtaXhpbnNfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX21peGluc19jb2RlYyk7Ci0gICAgICBpZiAoU3ludGF4ICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBTeW50YXgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEFwaSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7Ci0gICAgICB9Ci0gICAgICBtZXRob2RzXy5BZGQob3RoZXIubWV0aG9kc18pOwotICAgICAgb3B0aW9uc18uQWRkKG90aGVyLm9wdGlvbnNfKTsKLSAgICAgIGlmIChvdGhlci5WZXJzaW9uLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIFZlcnNpb24gPSBvdGhlci5WZXJzaW9uOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLnNvdXJjZUNvbnRleHRfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHNvdXJjZUNvbnRleHRfID09IG51bGwpIHsKLSAgICAgICAgICBzb3VyY2VDb250ZXh0XyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgU291cmNlQ29udGV4dC5NZXJnZUZyb20ob3RoZXIuU291cmNlQ29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBtaXhpbnNfLkFkZChvdGhlci5taXhpbnNfKTsKLSAgICAgIGlmIChvdGhlci5TeW50YXggIT0gMCkgewotICAgICAgICBTeW50YXggPSBvdGhlci5TeW50YXg7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4OiB7Ci0gICAgICAgICAgICBtZXRob2RzXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX21ldGhvZHNfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIG9wdGlvbnNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgVmVyc2lvbiA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQyOiB7Ci0gICAgICAgICAgICBpZiAoc291cmNlQ29udGV4dF8gPT0gbnVsbCkgewotICAgICAgICAgICAgICBzb3VyY2VDb250ZXh0XyA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0KCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzb3VyY2VDb250ZXh0Xyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1MDogewotICAgICAgICAgICAgbWl4aW5zXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX21peGluc19jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA1NjogewotICAgICAgICAgICAgc3ludGF4XyA9IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TeW50YXgpIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBNZXRob2QgcmVwcmVzZW50cyBhIG1ldGhvZCBvZiBhbiBhcGkuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBNZXRob2QgOiBwYjo6SU1lc3NhZ2U8TWV0aG9kPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8TWV0aG9kPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE1ldGhvZD4oKCkgPT4gbmV3IE1ldGhvZCgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPE1ldGhvZD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFwaVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIE1ldGhvZCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgTWV0aG9kKE1ldGhvZCBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgIHJlcXVlc3RUeXBlVXJsXyA9IG90aGVyLnJlcXVlc3RUeXBlVXJsXzsKLSAgICAgIHJlcXVlc3RTdHJlYW1pbmdfID0gb3RoZXIucmVxdWVzdFN0cmVhbWluZ187Ci0gICAgICByZXNwb25zZVR5cGVVcmxfID0gb3RoZXIucmVzcG9uc2VUeXBlVXJsXzsKLSAgICAgIHJlc3BvbnNlU3RyZWFtaW5nXyA9IG90aGVyLnJlc3BvbnNlU3RyZWFtaW5nXzsKLSAgICAgIG9wdGlvbnNfID0gb3RoZXIub3B0aW9uc18uQ2xvbmUoKTsKLSAgICAgIHN5bnRheF8gPSBvdGhlci5zeW50YXhfOwotICAgIH0KLQotICAgIHB1YmxpYyBNZXRob2QgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IE1ldGhvZCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm5hbWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgc2ltcGxlIG5hbWUgb2YgdGhpcyBtZXRob2QuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIE5hbWUgewotICAgICAgZ2V0IHsgcmV0dXJuIG5hbWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBuYW1lXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcXVlc3RfdHlwZV91cmwiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlcXVlc3RUeXBlVXJsRmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgc3RyaW5nIHJlcXVlc3RUeXBlVXJsXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEEgVVJMIG9mIHRoZSBpbnB1dCBtZXNzYWdlIHR5cGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFJlcXVlc3RUeXBlVXJsIHsKLSAgICAgIGdldCB7IHJldHVybiByZXF1ZXN0VHlwZVVybF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHJlcXVlc3RUeXBlVXJsXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInJlcXVlc3Rfc3RyZWFtaW5nIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXF1ZXN0U3RyZWFtaW5nRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgYm9vbCByZXF1ZXN0U3RyZWFtaW5nXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBJZiB0cnVlLCB0aGUgcmVxdWVzdCBpcyBzdHJlYW1lZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIFJlcXVlc3RTdHJlYW1pbmcgewotICAgICAgZ2V0IHsgcmV0dXJuIHJlcXVlc3RTdHJlYW1pbmdfOyB9Ci0gICAgICBzZXQgewotICAgICAgICByZXF1ZXN0U3RyZWFtaW5nXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVzcG9uc2VfdHlwZV91cmwiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFJlc3BvbnNlVHlwZVVybEZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0cmluZyByZXNwb25zZVR5cGVVcmxfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIFVSTCBvZiB0aGUgb3V0cHV0IG1lc3NhZ2UgdHlwZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgUmVzcG9uc2VUeXBlVXJsIHsKLSAgICAgIGdldCB7IHJldHVybiByZXNwb25zZVR5cGVVcmxfOyB9Ci0gICAgICBzZXQgewotICAgICAgICByZXNwb25zZVR5cGVVcmxfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicmVzcG9uc2Vfc3RyZWFtaW5nIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBSZXNwb25zZVN0cmVhbWluZ0ZpZWxkTnVtYmVyID0gNTsKLSAgICBwcml2YXRlIGJvb2wgcmVzcG9uc2VTdHJlYW1pbmdfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElmIHRydWUsIHRoZSByZXNwb25zZSBpcyBzdHJlYW1lZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIFJlc3BvbnNlU3RyZWFtaW5nIHsKLSAgICAgIGdldCB7IHJldHVybiByZXNwb25zZVN0cmVhbWluZ187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHJlc3BvbnNlU3RyZWFtaW5nXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9ucyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uc0ZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+IF9yZXBlYXRlZF9vcHRpb25zX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSg1MCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPiBvcHRpb25zXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEFueSBtZXRhZGF0YSBhdHRhY2hlZCB0byB0aGUgbWV0aG9kLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+IE9wdGlvbnMgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzeW50YXgiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN5bnRheEZpZWxkTnVtYmVyID0gNzsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN5bnRheCBzeW50YXhfID0gMDsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgc291cmNlIHN5bnRheCBvZiB0aGlzIG1ldGhvZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TeW50YXggU3ludGF4IHsKLSAgICAgIGdldCB7IHJldHVybiBzeW50YXhfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzeW50YXhfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBNZXRob2QpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhNZXRob2Qgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKE5hbWUgIT0gb3RoZXIuTmFtZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFJlcXVlc3RUeXBlVXJsICE9IG90aGVyLlJlcXVlc3RUeXBlVXJsKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoUmVxdWVzdFN0cmVhbWluZyAhPSBvdGhlci5SZXF1ZXN0U3RyZWFtaW5nKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoUmVzcG9uc2VUeXBlVXJsICE9IG90aGVyLlJlc3BvbnNlVHlwZVVybCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFJlc3BvbnNlU3RyZWFtaW5nICE9IG90aGVyLlJlc3BvbnNlU3RyZWFtaW5nKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighb3B0aW9uc18uRXF1YWxzKG90aGVyLm9wdGlvbnNfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFN5bnRheCAhPSBvdGhlci5TeW50YXgpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoUmVxdWVzdFR5cGVVcmwuTGVuZ3RoICE9IDApIGhhc2ggXj0gUmVxdWVzdFR5cGVVcmwuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChSZXF1ZXN0U3RyZWFtaW5nICE9IGZhbHNlKSBoYXNoIF49IFJlcXVlc3RTdHJlYW1pbmcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChSZXNwb25zZVR5cGVVcmwuTGVuZ3RoICE9IDApIGhhc2ggXj0gUmVzcG9uc2VUeXBlVXJsLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoUmVzcG9uc2VTdHJlYW1pbmcgIT0gZmFsc2UpIGhhc2ggXj0gUmVzcG9uc2VTdHJlYW1pbmcuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gb3B0aW9uc18uR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChTeW50YXggIT0gMCkgaGFzaCBePSBTeW50YXguR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEwKTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKE5hbWUpOwotICAgICAgfQotICAgICAgaWYgKFJlcXVlc3RUeXBlVXJsLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhSZXF1ZXN0VHlwZVVybCk7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVxdWVzdFN0cmVhbWluZyAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKFJlcXVlc3RTdHJlYW1pbmcpOwotICAgICAgfQotICAgICAgaWYgKFJlc3BvbnNlVHlwZVVybC5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMzQpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoUmVzcG9uc2VUeXBlVXJsKTsKLSAgICAgIH0KLSAgICAgIGlmIChSZXNwb25zZVN0cmVhbWluZyAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNDApOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKFJlc3BvbnNlU3RyZWFtaW5nKTsKLSAgICAgIH0KLSAgICAgIG9wdGlvbnNfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICBpZiAoU3ludGF4ICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDU2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBTeW50YXgpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChSZXF1ZXN0VHlwZVVybC5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoUmVxdWVzdFR5cGVVcmwpOwotICAgICAgfQotICAgICAgaWYgKFJlcXVlc3RTdHJlYW1pbmcgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIGlmIChSZXNwb25zZVR5cGVVcmwuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKFJlc3BvbnNlVHlwZVVybCk7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVzcG9uc2VTdHJlYW1pbmcgIT0gZmFsc2UpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgMTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gb3B0aW9uc18uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICBpZiAoU3ludGF4ICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBTeW50YXgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKE1ldGhvZCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuUmVxdWVzdFR5cGVVcmwuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgUmVxdWVzdFR5cGVVcmwgPSBvdGhlci5SZXF1ZXN0VHlwZVVybDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5SZXF1ZXN0U3RyZWFtaW5nICE9IGZhbHNlKSB7Ci0gICAgICAgIFJlcXVlc3RTdHJlYW1pbmcgPSBvdGhlci5SZXF1ZXN0U3RyZWFtaW5nOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlJlc3BvbnNlVHlwZVVybC5MZW5ndGggIT0gMCkgewotICAgICAgICBSZXNwb25zZVR5cGVVcmwgPSBvdGhlci5SZXNwb25zZVR5cGVVcmw7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuUmVzcG9uc2VTdHJlYW1pbmcgIT0gZmFsc2UpIHsKLSAgICAgICAgUmVzcG9uc2VTdHJlYW1pbmcgPSBvdGhlci5SZXNwb25zZVN0cmVhbWluZzsKLSAgICAgIH0KLSAgICAgIG9wdGlvbnNfLkFkZChvdGhlci5vcHRpb25zXyk7Ci0gICAgICBpZiAob3RoZXIuU3ludGF4ICE9IDApIHsKLSAgICAgICAgU3ludGF4ID0gb3RoZXIuU3ludGF4OwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxODogewotICAgICAgICAgICAgUmVxdWVzdFR5cGVVcmwgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgICAgUmVxdWVzdFN0cmVhbWluZyA9IGlucHV0LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgUmVzcG9uc2VUeXBlVXJsID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDA6IHsKLSAgICAgICAgICAgIFJlc3BvbnNlU3RyZWFtaW5nID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOiB7Ci0gICAgICAgICAgICBvcHRpb25zXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX29wdGlvbnNfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTY6IHsKLSAgICAgICAgICAgIHN5bnRheF8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3ludGF4KSBpbnB1dC5SZWFkRW51bSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgRGVjbGFyZXMgYW4gQVBJIHRvIGJlIGluY2x1ZGVkIGluIHRoaXMgQVBJLiBUaGUgaW5jbHVkaW5nIEFQSSBtdXN0Ci0gIC8vLyAgcmVkZWNsYXJlIGFsbCB0aGUgbWV0aG9kcyBmcm9tIHRoZSBpbmNsdWRlZCBBUEksIGJ1dCBkb2N1bWVudGF0aW9uCi0gIC8vLyAgYW5kIG9wdGlvbnMgYXJlIGluaGVyaXRlZCBhcyBmb2xsb3dzOgotICAvLy8KLSAgLy8vICAtIElmIGFmdGVyIGNvbW1lbnQgYW5kIHdoaXRlc3BhY2Ugc3RyaXBwaW5nLCB0aGUgZG9jdW1lbnRhdGlvbgotICAvLy8gICAgc3RyaW5nIG9mIHRoZSByZWRlY2xhcmVkIG1ldGhvZCBpcyBlbXB0eSwgaXQgd2lsbCBiZSBpbmhlcml0ZWQKLSAgLy8vICAgIGZyb20gdGhlIG9yaWdpbmFsIG1ldGhvZC4KLSAgLy8vCi0gIC8vLyAgLSBFYWNoIGFubm90YXRpb24gYmVsb25naW5nIHRvIHRoZSBzZXJ2aWNlIGNvbmZpZyAoaHR0cCwKLSAgLy8vICAgIHZpc2liaWxpdHkpIHdoaWNoIGlzIG5vdCBzZXQgaW4gdGhlIHJlZGVjbGFyZWQgbWV0aG9kIHdpbGwgYmUKLSAgLy8vICAgIGluaGVyaXRlZC4KLSAgLy8vCi0gIC8vLyAgLSBJZiBhbiBodHRwIGFubm90YXRpb24gaXMgaW5oZXJpdGVkLCB0aGUgcGF0aCBwYXR0ZXJuIHdpbGwgYmUKLSAgLy8vICAgIG1vZGlmaWVkIGFzIGZvbGxvd3MuIEFueSB2ZXJzaW9uIHByZWZpeCB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZQotICAvLy8gICAgdmVyc2lvbiBvZiB0aGUgaW5jbHVkaW5nIEFQSSBwbHVzIHRoZSBbcm9vdF1bXSBwYXRoIGlmIHNwZWNpZmllZC4KLSAgLy8vCi0gIC8vLyAgRXhhbXBsZSBvZiBhIHNpbXBsZSBtaXhpbjoKLSAgLy8vCi0gIC8vLyAgICAgIHBhY2thZ2UgZ29vZ2xlLmFjbC52MTsKLSAgLy8vICAgICAgc2VydmljZSBBY2Nlc3NDb250cm9sIHsKLSAgLy8vICAgICAgICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgQUNMIG9iamVjdC4KLSAgLy8vICAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCkgewotICAvLy8gICAgICAgICAgb3B0aW9uIChnb29nbGUuYXBpLmh0dHApLmdldCA9ICIvdjEve3Jlc291cmNlPSoqfTpnZXRBY2wiOwotICAvLy8gICAgICAgIH0KLSAgLy8vICAgICAgfQotICAvLy8KLSAgLy8vICAgICAgcGFja2FnZSBnb29nbGUuc3RvcmFnZS52MjsKLSAgLy8vICAgICAgc2VydmljZSBTdG9yYWdlIHsKLSAgLy8vICAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCk7Ci0gIC8vLwotICAvLy8gICAgICAgIC8vIEdldCBhIGRhdGEgcmVjb3JkLgotICAvLy8gICAgICAgIHJwYyBHZXREYXRhKEdldERhdGFSZXF1ZXN0KSByZXR1cm5zIChEYXRhKSB7Ci0gIC8vLyAgICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92Mi97cmVzb3VyY2U9Kip9IjsKLSAgLy8vICAgICAgICB9Ci0gIC8vLyAgICAgIH0KLSAgLy8vCi0gIC8vLyAgRXhhbXBsZSBvZiBhIG1peGluIGNvbmZpZ3VyYXRpb246Ci0gIC8vLwotICAvLy8gICAgICBhcGlzOgotICAvLy8gICAgICAtIG5hbWU6IGdvb2dsZS5zdG9yYWdlLnYyLlN0b3JhZ2UKLSAgLy8vICAgICAgICBtaXhpbnM6Ci0gIC8vLyAgICAgICAgLSBuYW1lOiBnb29nbGUuYWNsLnYxLkFjY2Vzc0NvbnRyb2wKLSAgLy8vCi0gIC8vLyAgVGhlIG1peGluIGNvbnN0cnVjdCBpbXBsaWVzIHRoYXQgYWxsIG1ldGhvZHMgaW4gYEFjY2Vzc0NvbnRyb2xgIGFyZQotICAvLy8gIGFsc28gZGVjbGFyZWQgd2l0aCBzYW1lIG5hbWUgYW5kIHJlcXVlc3QvcmVzcG9uc2UgdHlwZXMgaW4KLSAgLy8vICBgU3RvcmFnZWAuIEEgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3Igb3IgYW5ub3RhdGlvbiBwcm9jZXNzb3Igd2lsbAotICAvLy8gIHNlZSB0aGUgZWZmZWN0aXZlIGBTdG9yYWdlLkdldEFjbGAgbWV0aG9kIGFmdGVyIGluaGVydGluZwotICAvLy8gIGRvY3VtZW50YXRpb24gYW5kIGFubm90YXRpb25zIGFzIGZvbGxvd3M6Ci0gIC8vLwotICAvLy8gICAgICBzZXJ2aWNlIFN0b3JhZ2UgewotICAvLy8gICAgICAgIC8vIEdldCB0aGUgdW5kZXJseWluZyBBQ0wgb2JqZWN0LgotICAvLy8gICAgICAgIHJwYyBHZXRBY2woR2V0QWNsUmVxdWVzdCkgcmV0dXJucyAoQWNsKSB7Ci0gIC8vLyAgICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92Mi97cmVzb3VyY2U9Kip9OmdldEFjbCI7Ci0gIC8vLyAgICAgICAgfQotICAvLy8gICAgICAgIC4uLgotICAvLy8gICAgICB9Ci0gIC8vLwotICAvLy8gIE5vdGUgaG93IHRoZSB2ZXJzaW9uIGluIHRoZSBwYXRoIHBhdHRlcm4gY2hhbmdlZCBmcm9tIGB2MWAgdG8gYHYyYC4KLSAgLy8vCi0gIC8vLyAgSWYgdGhlIGByb290YCBmaWVsZCBpbiB0aGUgbWl4aW4gaXMgc3BlY2lmaWVkLCBpdCBzaG91bGQgYmUgYQotICAvLy8gIHJlbGF0aXZlIHBhdGggdW5kZXIgd2hpY2ggaW5oZXJpdGVkIEhUVFAgcGF0aHMgYXJlIHBsYWNlZC4gRXhhbXBsZToKLSAgLy8vCi0gIC8vLyAgICAgIGFwaXM6Ci0gIC8vLyAgICAgIC0gbmFtZTogZ29vZ2xlLnN0b3JhZ2UudjIuU3RvcmFnZQotICAvLy8gICAgICAgIG1peGluczoKLSAgLy8vICAgICAgICAtIG5hbWU6IGdvb2dsZS5hY2wudjEuQWNjZXNzQ29udHJvbAotICAvLy8gICAgICAgICAgcm9vdDogYWNscwotICAvLy8KLSAgLy8vICBUaGlzIGltcGxpZXMgdGhlIGZvbGxvd2luZyBpbmhlcml0ZWQgSFRUUCBhbm5vdGF0aW9uOgotICAvLy8KLSAgLy8vICAgICAgc2VydmljZSBTdG9yYWdlIHsKLSAgLy8vICAgICAgICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgQUNMIG9iamVjdC4KLSAgLy8vICAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCkgewotICAvLy8gICAgICAgICAgb3B0aW9uIChnb29nbGUuYXBpLmh0dHApLmdldCA9ICIvdjIvYWNscy97cmVzb3VyY2U9Kip9OmdldEFjbCI7Ci0gIC8vLyAgICAgICAgfQotICAvLy8gICAgICAgIC4uLgotICAvLy8gICAgICB9Ci0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBNaXhpbiA6IHBiOjpJTWVzc2FnZTxNaXhpbj4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPE1peGluPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPE1peGluPigoKSA9PiBuZXcgTWl4aW4oKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxNaXhpbj4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFwaVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIE1peGluKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBNaXhpbihNaXhpbiBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgIHJvb3RfID0gb3RoZXIucm9vdF87Ci0gICAgfQotCi0gICAgcHVibGljIE1peGluIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBNaXhpbih0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm5hbWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEFQSSB3aGljaCBpcyBpbmNsdWRlZC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAicm9vdCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgUm9vdEZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIHN0cmluZyByb290XyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIElmIG5vbi1lbXB0eSBzcGVjaWZpZXMgYSBwYXRoIHVuZGVyIHdoaWNoIGluaGVyaXRlZCBIVFRQIHBhdGhzCi0gICAgLy8vICBhcmUgcm9vdGVkLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBSb290IHsKLSAgICAgIGdldCB7IHJldHVybiByb290XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgcm9vdF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBNaXhpbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKE1peGluIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChOYW1lICE9IG90aGVyLk5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChSb290ICE9IG90aGVyLlJvb3QpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoUm9vdC5MZW5ndGggIT0gMCkgaGFzaCBePSBSb290LkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChSb290Lkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhSb290KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoUm9vdC5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoUm9vdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTWl4aW4gb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIE5hbWUgPSBvdGhlci5OYW1lOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlJvb3QuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgUm9vdCA9IG90aGVyLlJvb3Q7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4OiB7Ci0gICAgICAgICAgICBSb290ID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLX0KLQotI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvRHVyYXRpb24uY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9EdXJhdGlvbi5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE3MzU4Zi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9EdXJhdGlvbi5jcworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEKLSNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotdXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1ZjsKLXVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zOwotdXNpbmcgcGJyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIHsKLQotICAvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciByZWZsZWN0aW9uIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBmcm9tIGdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIER1cmF0aW9uUmVmbGVjdGlvbiB7Ci0KLSAgICAjcmVnaW9uIERlc2NyaXB0b3IKLSAgICAvLy8gPHN1bW1hcnk+RmlsZSBkZXNjcmlwdG9yIGZvciBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG88L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgc3RhdGljIER1cmF0aW9uUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNoNW5iMjluYkdVdmNISnZkRzlpZFdZdlpIVnlZWFJwYjI0dWNISnZkRzhTRDJkdmIyZHNaUzV3Y205MCIsCi0gICAgICAgICAgICAiYjJKMVppSXFDZ2hFZFhKaGRHbHZiaElQQ2dkelpXTnZibVJ6R0FFZ0FTZ0RFZzBLQlc1aGJtOXpHQUlnIiwKLSAgICAgICAgICAgICJBU2dGUW53S0UyTnZiUzVuYjI5bmJHVXVjSEp2ZEc5aWRXWkNEVVIxY21GMGFXOXVVSEp2ZEc5UUFWb3EiLAotICAgICAgICAgICAgIloybDBhSFZpTG1OdmJTOW5iMnhoYm1jdmNISnZkRzlpZFdZdmNIUjVjR1Z6TDJSMWNtRjBhVzl1b0FFQiIsCi0gICAgICAgICAgICAib2dJRFIxQkNxZ0llUjI5dloyeGxMbEJ5YjNSdlluVm1MbGRsYkd4TGJtOTNibFI1Y0dWellnWndjbTkwIiwKLSAgICAgICAgICAgICJiek09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRHVyYXRpb24pLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvbi5QYXJzZXIsIG5ld1tdeyAiU2Vjb25kcyIsICJOYW5vcyIgfSwgbnVsbCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICB9KSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0gICNyZWdpb24gTWVzc2FnZXMKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIEEgRHVyYXRpb24gcmVwcmVzZW50cyBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIHNwYW4gb2YgdGltZSByZXByZXNlbnRlZAotICAvLy8gIGFzIGEgY291bnQgb2Ygc2Vjb25kcyBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMgYXQgbmFub3NlY29uZAotICAvLy8gIHJlc29sdXRpb24uIEl0IGlzIGluZGVwZW5kZW50IG9mIGFueSBjYWxlbmRhciBhbmQgY29uY2VwdHMgbGlrZSAiZGF5IgotICAvLy8gIG9yICJtb250aCIuIEl0IGlzIHJlbGF0ZWQgdG8gVGltZXN0YW1wIGluIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotICAvLy8gIHR3byBUaW1lc3RhbXAgdmFsdWVzIGlzIGEgRHVyYXRpb24gYW5kIGl0IGNhbiBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkCi0gIC8vLyAgZnJvbSBhIFRpbWVzdGFtcC4gUmFuZ2UgaXMgYXBwcm94aW1hdGVseSArLTEwLDAwMCB5ZWFycy4KLSAgLy8vCi0gIC8vLyAgRXhhbXBsZSAxOiBDb21wdXRlIER1cmF0aW9uIGZyb20gdHdvIFRpbWVzdGFtcHMgaW4gcHNldWRvIGNvZGUuCi0gIC8vLwotICAvLy8gICAgICBUaW1lc3RhbXAgc3RhcnQgPSAuLi47Ci0gIC8vLyAgICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47Ci0gIC8vLyAgICAgIER1cmF0aW9uIGR1cmF0aW9uID0gLi4uOwotICAvLy8KLSAgLy8vICAgICAgZHVyYXRpb24uc2Vjb25kcyA9IGVuZC5zZWNvbmRzIC0gc3RhcnQuc2Vjb25kczsKLSAgLy8vICAgICAgZHVyYXRpb24ubmFub3MgPSBlbmQubmFub3MgLSBzdGFydC5uYW5vczsKLSAgLy8vCi0gIC8vLyAgICAgIGlmIChkdXJhdGlvbi5zZWNvbmRzICZsdDsgMCAmYW1wOyZhbXA7IGR1cmF0aW9uLm5hbm9zID4gMCkgewotICAvLy8gICAgICAgIGR1cmF0aW9uLnNlY29uZHMgKz0gMTsKLSAgLy8vICAgICAgICBkdXJhdGlvbi5uYW5vcyAtPSAxMDAwMDAwMDAwOwotICAvLy8gICAgICB9IGVsc2UgaWYgKGR1cmF0aW9ucy5zZWNvbmRzID4gMCAmYW1wOyZhbXA7IGR1cmF0aW9uLm5hbm9zICZsdDsgMCkgewotICAvLy8gICAgICAgIGR1cmF0aW9uLnNlY29uZHMgLT0gMTsKLSAgLy8vICAgICAgICBkdXJhdGlvbi5uYW5vcyArPSAxMDAwMDAwMDAwOwotICAvLy8gICAgICB9Ci0gIC8vLwotICAvLy8gIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBUaW1lc3RhbXAgKyBEdXJhdGlvbiBpbiBwc2V1ZG8gY29kZS4KLSAgLy8vCi0gIC8vLyAgICAgIFRpbWVzdGFtcCBzdGFydCA9IC4uLjsKLSAgLy8vICAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47Ci0gIC8vLyAgICAgIFRpbWVzdGFtcCBlbmQgPSAuLi47Ci0gIC8vLwotICAvLy8gICAgICBlbmQuc2Vjb25kcyA9IHN0YXJ0LnNlY29uZHMgKyBkdXJhdGlvbi5zZWNvbmRzOwotICAvLy8gICAgICBlbmQubmFub3MgPSBzdGFydC5uYW5vcyArIGR1cmF0aW9uLm5hbm9zOwotICAvLy8KLSAgLy8vICAgICAgaWYgKGVuZC5uYW5vcyAmbHQ7IDApIHsKLSAgLy8vICAgICAgICBlbmQuc2Vjb25kcyAtPSAxOwotICAvLy8gICAgICAgIGVuZC5uYW5vcyArPSAxMDAwMDAwMDAwOwotICAvLy8gICAgICB9IGVsc2UgaWYgKGVuZC5uYW5vcyA+PSAxMDAwMDAwMDAwKSB7Ci0gIC8vLyAgICAgICAgZW5kLnNlY29uZHMgKz0gMTsKLSAgLy8vICAgICAgICBlbmQubmFub3MgLT0gMTAwMDAwMDAwMDsKLSAgLy8vICAgICAgfQotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRHVyYXRpb24gOiBwYjo6SU1lc3NhZ2U8RHVyYXRpb24+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxEdXJhdGlvbj4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxEdXJhdGlvbj4oKCkgPT4gbmV3IER1cmF0aW9uKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8RHVyYXRpb24+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5EdXJhdGlvblJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIER1cmF0aW9uKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBEdXJhdGlvbihEdXJhdGlvbiBvdGhlcikgOiB0aGlzKCkgewotICAgICAgc2Vjb25kc18gPSBvdGhlci5zZWNvbmRzXzsKLSAgICAgIG5hbm9zXyA9IG90aGVyLm5hbm9zXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRHVyYXRpb24gQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IER1cmF0aW9uKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2Vjb25kcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2Vjb25kc0ZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGxvbmcgc2Vjb25kc187Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgU2lnbmVkIHNlY29uZHMgb2YgdGhlIHNwYW4gb2YgdGltZS4gTXVzdCBiZSBmcm9tIC0zMTUsNTc2LDAwMCwwMDAKLSAgICAvLy8gIHRvICszMTUsNTc2LDAwMCwwMDAgaW5jbHVzaXZlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGxvbmcgU2Vjb25kcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2Vjb25kc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNlY29uZHNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW5vcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFub3NGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBpbnQgbmFub3NfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFNpZ25lZCBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZCByZXNvbHV0aW9uIG9mIHRoZSBzcGFuCi0gICAgLy8vICBvZiB0aW1lLiBEdXJhdGlvbnMgbGVzcyB0aGFuIG9uZSBzZWNvbmQgYXJlIHJlcHJlc2VudGVkIHdpdGggYSAwCi0gICAgLy8vICBgc2Vjb25kc2AgZmllbGQgYW5kIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYG5hbm9zYCBmaWVsZC4gRm9yIGR1cmF0aW9ucwotICAgIC8vLyAgb2Ygb25lIHNlY29uZCBvciBtb3JlLCBhIG5vbi16ZXJvIHZhbHVlIGZvciB0aGUgYG5hbm9zYCBmaWVsZCBtdXN0IGJlCi0gICAgLy8vICBvZiB0aGUgc2FtZSBzaWduIGFzIHRoZSBgc2Vjb25kc2AgZmllbGQuIE11c3QgYmUgZnJvbSAtOTk5LDk5OSw5OTkKLSAgICAvLy8gIHRvICs5OTksOTk5LDk5OSBpbmNsdXNpdmUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50IE5hbm9zIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW5vc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbm9zXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRHVyYXRpb24pOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhEdXJhdGlvbiBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoU2Vjb25kcyAhPSBvdGhlci5TZWNvbmRzKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTmFub3MgIT0gb3RoZXIuTmFub3MpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoU2Vjb25kcyAhPSAwTCkgaGFzaCBePSBTZWNvbmRzLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoTmFub3MgIT0gMCkgaGFzaCBePSBOYW5vcy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoU2Vjb25kcyAhPSAwTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDY0KFNlY29uZHMpOwotICAgICAgfQotICAgICAgaWYgKE5hbm9zICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoTmFub3MpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChTZWNvbmRzICE9IDBMKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKFNlY29uZHMpOwotICAgICAgfQotICAgICAgaWYgKE5hbm9zICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoTmFub3MpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKER1cmF0aW9uIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2Vjb25kcyAhPSAwTCkgewotICAgICAgICBTZWNvbmRzID0gb3RoZXIuU2Vjb25kczsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW5vcyAhPSAwKSB7Ci0gICAgICAgIE5hbm9zID0gb3RoZXIuTmFub3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBTZWNvbmRzID0gaW5wdXQuUmVhZEludDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgTmFub3MgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0R1cmF0aW9uUGFydGlhbC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0R1cmF0aW9uUGFydGlhbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjE2NGJmZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9EdXJhdGlvblBhcnRpYWwuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNzAgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcwotewotICAgIC8vIE1hbnVhbGx5LXdyaXR0ZW4gcGFydGlhbCBjbGFzcyBmb3IgdGhlIER1cmF0aW9uIHdlbGwta25vd24gdHlwZSwKLSAgICAvLyBwcm92aWRpbmcgYSBjb252ZXJzaW9uIHRvIFRpbWVTcGFuIGFuZCBjb252ZW5pZW5jZSBvcGVyYXRvcnMuCi0gICAgcHVibGljIHBhcnRpYWwgY2xhc3MgRHVyYXRpb24gOiBJQ3VzdG9tRGlhZ25vc3RpY01lc3NhZ2UKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgaW4gYSBzZWNvbmQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTmFub3NlY29uZHNQZXJTZWNvbmQgPSAxMDAwMDAwMDAwOwotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBUaGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIGluIGEgQkNMIHRpY2sgKGFzIHVzZWQgYnkgPHNlZSBjcmVmPSJUaW1lU3BhbiIvPiBhbmQgPHNlZSBjcmVmPSJEYXRlVGltZSIvPikuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBjb25zdCBpbnQgTmFub3NlY29uZHNQZXJUaWNrID0gMTAwOwotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFRoZSBtYXhpbXVtIHBlcm1pdHRlZCBudW1iZXIgb2Ygc2Vjb25kcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgcHVibGljIGNvbnN0IGxvbmcgTWF4U2Vjb25kcyA9IDMxNTU3NjAwMDAwMEw7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gVGhlIG1pbmltdW0gcGVybWl0dGVkIG51bWJlciBvZiBzZWNvbmRzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgY29uc3QgbG9uZyBNaW5TZWNvbmRzID0gLTMxNTU3NjAwMDAwMEw7Ci0KLSAgICAgICAgaW50ZXJuYWwgY29uc3QgaW50IE1heE5hbm9zZWNvbmRzID0gTmFub3NlY29uZHNQZXJTZWNvbmQgLSAxOwotICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgTWluTmFub3NlY29uZHMgPSAtTmFub3NlY29uZHNQZXJTZWNvbmQgKyAxOwotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBib29sIElzTm9ybWFsaXplZChsb25nIHNlY29uZHMsIGludCBuYW5vc2Vjb25kcykKLSAgICAgICAgewotICAgICAgICAgICAgLy8gU2ltcGxlIGJvdW5kYXJpZXMKLSAgICAgICAgICAgIGlmIChzZWNvbmRzIDwgTWluU2Vjb25kcyB8fCBzZWNvbmRzID4gTWF4U2Vjb25kcyB8fAotICAgICAgICAgICAgICAgIG5hbm9zZWNvbmRzIDwgTWluTmFub3NlY29uZHMgfHwgbmFub3NlY29uZHMgPiBNYXhOYW5vc2Vjb25kcykKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBXZSBvbmx5IGhhdmUgYSBwcm9ibGVtIGlzIG9uZSBpcyBzdHJpY3RseSBuZWdhdGl2ZSBhbmQgdGhlIG90aGVyIGlzCi0gICAgICAgICAgICAvLyBzdHJpY3RseSBwb3NpdGl2ZS4KLSAgICAgICAgICAgIHJldHVybiBNYXRoLlNpZ24oc2Vjb25kcykgKiBNYXRoLlNpZ24obmFub3NlY29uZHMpICE9IC0xOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVydHMgdGhpcyA8c2VlIGNyZWY9IkR1cmF0aW9uIi8+IHRvIGEgPHNlZSBjcmVmPSJUaW1lU3BhbiIvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPklmIHRoZSBkdXJhdGlvbiBpcyBub3QgYSBwcmVjaXNlIG51bWJlciBvZiB0aWNrcywgaXQgaXMgdHJ1bmNhdGVkIHRvd2FyZHMgMC48L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdmFsdWUgb2YgdGhpcyBkdXJhdGlvbiwgYXMgYSA8Yz5UaW1lU3BhbjwvYz4uPC9yZXR1cm5zPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj5UaGlzIHZhbHVlIGlzbid0IGEgdmFsaWQgbm9ybWFsaXplZCBkdXJhdGlvbiwgYXMKLSAgICAgICAgLy8vIGRlc2NyaWJlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi48L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIFRpbWVTcGFuIFRvVGltZVNwYW4oKQotICAgICAgICB7Ci0gICAgICAgICAgICBjaGVja2VkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgaWYgKCFJc05vcm1hbGl6ZWQoU2Vjb25kcywgTmFub3MpKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRPcGVyYXRpb25FeGNlcHRpb24oIkR1cmF0aW9uIHdhcyBub3QgYSB2YWxpZCBub3JtYWxpemVkIGR1cmF0aW9uIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGxvbmcgdGlja3MgPSBTZWNvbmRzICogVGltZVNwYW4uVGlja3NQZXJTZWNvbmQgKyBOYW5vcyAvIE5hbm9zZWNvbmRzUGVyVGljazsKLSAgICAgICAgICAgICAgICByZXR1cm4gVGltZVNwYW4uRnJvbVRpY2tzKHRpY2tzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlcnRzIHRoZSBnaXZlbiA8c2VlIGNyZWY9IlRpbWVTcGFuIi8+IHRvIGEgPHNlZSBjcmVmPSJEdXJhdGlvbiIvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ0aW1lU3BhbiI+VGhlIDxjPlRpbWVTcGFuPC9jPiB0byBjb252ZXJ0LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgdmFsdWUgb2YgdGhlIGdpdmVuIDxjPlRpbWVTcGFuPC9jPiwgYXMgYSA8Yz5EdXJhdGlvbjwvYz4uPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIEZyb21UaW1lU3BhbihUaW1lU3BhbiB0aW1lU3BhbikKLSAgICAgICAgewotICAgICAgICAgICAgY2hlY2tlZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGxvbmcgdGlja3MgPSB0aW1lU3Bhbi5UaWNrczsKLSAgICAgICAgICAgICAgICBsb25nIHNlY29uZHMgPSB0aWNrcyAvIFRpbWVTcGFuLlRpY2tzUGVyU2Vjb25kOwotICAgICAgICAgICAgICAgIGludCBuYW5vcyA9IChpbnQpICh0aWNrcyAlIFRpbWVTcGFuLlRpY2tzUGVyU2Vjb25kKSAqIE5hbm9zZWNvbmRzUGVyVGljazsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IHNlY29uZHMsIE5hbm9zID0gbmFub3MgfTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgdGhlIHJlc3VsdCBvZiBuZWdhdGluZyB0aGUgZHVyYXRpb24uIEZvciBleGFtcGxlLCB0aGUgbmVnYXRpb24gb2YgNSBtaW51dGVzIGlzIC01IG1pbnV0ZXMuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlRoZSBkdXJhdGlvbiB0byBuZWdhdGUuIE11c3Qgbm90IGJlIG51bGwuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBuZWdhdGVkIHZhbHVlIG9mIHRoaXMgZHVyYXRpb24uPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIG9wZXJhdG9yIC0oRHVyYXRpb24gdmFsdWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgICAgICAgY2hlY2tlZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemUoLXZhbHVlLlNlY29uZHMsIC12YWx1ZS5OYW5vcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBZGRzIHRoZSB0d28gc3BlY2lmaWVkIDxzZWUgY3JlZj0iRHVyYXRpb24iLz4gdmFsdWVzIHRvZ2V0aGVyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxocyI+VGhlIGZpcnN0IHZhbHVlIHRvIGFkZC4gTXVzdCBub3QgYmUgbnVsbC48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJocyI+VGhlIHNlY29uZCB2YWx1ZSB0byBhZGQuIE11c3Qgbm90IGJlIG51bGwuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBvcGVyYXRvciArKER1cmF0aW9uIGxocywgRHVyYXRpb24gcmhzKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGxocywgImxocyIpOwotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChyaHMsICJyaHMiKTsKLSAgICAgICAgICAgIGNoZWNrZWQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9ybWFsaXplKGxocy5TZWNvbmRzICsgcmhzLlNlY29uZHMsIGxocy5OYW5vcyArIHJocy5OYW5vcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBTdWJ0cmFjdHMgb25lIDxzZWUgY3JlZj0iRHVyYXRpb24iLz4gZnJvbSBhbm90aGVyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxocyI+VGhlIGR1cmF0aW9uIHRvIHN1YnRyYWN0IGZyb20uIE11c3Qgbm90IGJlIG51bGwuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJyaHMiPlRoZSBkdXJhdGlvbiB0byBzdWJ0cmFjdC4gTXVzdCBub3QgYmUgbnVsbC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgdHdvIHNwZWNpZmllZCBkdXJhdGlvbnMuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIG9wZXJhdG9yIC0oRHVyYXRpb24gbGhzLCBEdXJhdGlvbiByaHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwobGhzLCAibGhzIik7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHJocywgInJocyIpOwotICAgICAgICAgICAgY2hlY2tlZAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBOb3JtYWxpemUobGhzLlNlY29uZHMgLSByaHMuU2Vjb25kcywgbGhzLk5hbm9zIC0gcmhzLk5hbm9zKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICAKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ3JlYXRlcyBhIGR1cmF0aW9uIHdpdGggdGhlIG5vcm1hbGl6ZWQgdmFsdWVzIGZyb20gdGhlIGdpdmVuIG51bWJlciBvZiBzZWNvbmRzIGFuZAotICAgICAgICAvLy8gbmFub3NlY29uZHMsIGNvbmZvcm1pbmcgd2l0aCB0aGUgZGVzY3JpcHRpb24gaW4gdGhlIHByb3RvIGZpbGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBEdXJhdGlvbiBOb3JtYWxpemUobG9uZyBzZWNvbmRzLCBpbnQgbmFub3NlY29uZHMpCi0gICAgICAgIHsKLSAgICAgICAgICAgIC8vIEVuc3VyZSB0aGF0IG5hbm9zZWNvbmRzIGlzIGluIHRoZSByYW5nZSAoLTEsMDAwLDAwMCwwMDAsICsxLDAwMCwwMDAsMDAwKQotICAgICAgICAgICAgaW50IGV4dHJhU2Vjb25kcyA9IG5hbm9zZWNvbmRzIC8gTmFub3NlY29uZHNQZXJTZWNvbmQ7Ci0gICAgICAgICAgICBzZWNvbmRzICs9IGV4dHJhU2Vjb25kczsKLSAgICAgICAgICAgIG5hbm9zZWNvbmRzIC09IGV4dHJhU2Vjb25kcyAqIE5hbm9zZWNvbmRzUGVyU2Vjb25kOwotCi0gICAgICAgICAgICAvLyBOb3cgbWFrZSBzdXJlIHRoYXQgU2lnbihzZWNvbmRzKSA9PSBTaWduKG5hbm9zZWNvbmRzKSBpZiBTaWduKHNlY29uZHMpICE9IDAuCi0gICAgICAgICAgICBpZiAoc2Vjb25kcyA8IDAgJiYgbmFub3NlY29uZHMgPiAwKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHNlY29uZHMgKz0gMTsKLSAgICAgICAgICAgICAgICBuYW5vc2Vjb25kcyAtPSBOYW5vc2Vjb25kc1BlclNlY29uZDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UgaWYgKHNlY29uZHMgPiAwICYmIG5hbm9zZWNvbmRzIDwgMCkKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICBzZWNvbmRzIC09IDE7Ci0gICAgICAgICAgICAgICAgbmFub3NlY29uZHMgKz0gTmFub3NlY29uZHNQZXJTZWNvbmQ7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbmV3IER1cmF0aW9uIHsgU2Vjb25kcyA9IHNlY29uZHMsIE5hbm9zID0gbmFub3NlY29uZHMgfTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlcnRzIGEgZHVyYXRpb24gc3BlY2lmaWVkIGluIHNlY29uZHMvbmFub3NlY29uZHMgdG8gYSBzdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIElmIHRoZSB2YWx1ZSBpcyBhIG5vcm1hbGl6ZWQgZHVyYXRpb24gaW4gdGhlIHJhbmdlIGRlc2NyaWJlZCBpbiA8Yz5kdXJhdGlvbi5wcm90bzwvYz4sCi0gICAgICAgIC8vLyA8cGFyYW1yZWYgbmFtZT0iZGlhZ25vc3RpY09ubHkiLz4gaXMgaWdub3JlZC4gT3RoZXJ3aXNlLCBpZiB0aGUgcGFyYW1ldGVyIGlzIDxjPnRydWU8L2M+LAotICAgICAgICAvLy8gYSBKU09OIG9iamVjdCB3aXRoIGEgd2FybmluZyBpcyByZXR1cm5lZDsgaWYgaXQgaXMgPGM+ZmFsc2U8L2M+LCBhbiA8c2VlIGNyZWY9IkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iLz4gaXMgdGhyb3duLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InNlY29uZHMiPlNlY29uZHMgcG9ydGlvbiBvZiB0aGUgZHVyYXRpb24uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJuYW5vc2Vjb25kcyI+TmFub3NlY29uZHMgcG9ydGlvbiBvZiB0aGUgZHVyYXRpb24uPC9wYXJhbT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkaWFnbm9zdGljT25seSI+RGV0ZXJtaW5lcyB0aGUgaGFuZGxpbmcgb2Ygbm9uLW5vcm1hbGl6ZWQgdmFsdWVzPC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiI+VGhlIHJlcHJlc2VudGVkIGR1cmF0aW9uIGlzIGludmFsaWQsIGFuZCA8cGFyYW1yZWYgbmFtZT0iZGlhZ25vc3RpY09ubHkiLz4gaXMgPGM+ZmFsc2U8L2M+LjwvZXhjZXB0aW9uPgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgc3RyaW5nIFRvSnNvbihsb25nIHNlY29uZHMsIGludCBuYW5vc2Vjb25kcywgYm9vbCBkaWFnbm9zdGljT25seSkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKElzTm9ybWFsaXplZChzZWNvbmRzLCBuYW5vc2Vjb25kcykpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCciJyk7Ci0gICAgICAgICAgICAgICAgLy8gVGhlIHNlY29uZHMgcGFydCB3aWxsIG5vcm1hbGx5IHByb3ZpZGUgdGhlIG1pbnVzIHNpZ24gaWYgd2UgbmVlZCBpdCwgYnV0IG5vdCBpZiBpdCdzIDAuLi4KLSAgICAgICAgICAgICAgICBpZiAoc2Vjb25kcyA9PSAwICYmIG5hbm9zZWNvbmRzIDwgMCkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCctJyk7Ci0gICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoc2Vjb25kcy5Ub1N0cmluZygiZCIsIEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUpKTsKLSAgICAgICAgICAgICAgICBBcHBlbmROYW5vc2Vjb25kcyhidWlsZGVyLCBNYXRoLkFicyhuYW5vc2Vjb25kcykpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCJzXCIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpYWdub3N0aWNPbmx5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIE5vdGU6IHRoZSBkb3VibGUgYnJhY2VzIGhlcmUgYXJlIGVzY2FwaW5nIGZvciBicmFjZXMgaW4gZm9ybWF0IHN0cmluZ3MuCi0gICAgICAgICAgICAgICAgcmV0dXJuIHN0cmluZy5Gb3JtYXQoQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSwKLSAgICAgICAgICAgICAgICAgICAgInt7IFwiQHdhcm5pbmdcIjogXCJJbnZhbGlkIER1cmF0aW9uXCIsIFwic2Vjb25kc1wiOiBcInswfVwiLCBcIm5hbm9zXCI6IHsxfSB9fSIsCi0gICAgICAgICAgICAgICAgICAgIHNlY29uZHMsCi0gICAgICAgICAgICAgICAgICAgIG5hbm9zZWNvbmRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVsc2UKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigiTm9uLW5vcm1hbGl6ZWQgZHVyYXRpb24gdmFsdWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8c2VlIGNyZWY9IkR1cmF0aW9uIi8+IGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBOb3JtYWxseSB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBhIEpTT04gc3RyaW5nIHZhbHVlIChpbmNsdWRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgcXVvdGVzKSBidXQKLSAgICAgICAgLy8vIHdoZW4gdGhlIHZhbHVlIGlzIG5vbi1ub3JtYWxpemVkIG9yIG91dCBvZiByYW5nZSwgYSBKU09OIG9iamVjdCByZXByZXNlbnRhdGlvbiB3aWxsIGJlIHJldHVybmVkCi0gICAgICAgIC8vLyBpbnN0ZWFkLCBpbmNsdWRpbmcgYSB3YXJuaW5nLiBUaGlzIGlzIHRvIGF2b2lkIGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duIHdoZW4gdHJ5aW5nIHRvCi0gICAgICAgIC8vLyBkaWFnbm9zZSBwcm9ibGVtcyAtIHRoZSByZWd1bGFyIEpTT04gZm9ybWF0dGVyIHdpbGwgc3RpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBub24tbm9ybWFsaXplZAotICAgICAgICAvLy8gdmFsdWVzLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHJldHVybnM+QSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9EaWFnbm9zdGljU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRvSnNvbihTZWNvbmRzLCBOYW5vcywgdHJ1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBBcHBlbmRzIGEgbnVtYmVyIG9mIG5hbm9zZWNvbmRzIHRvIGEgU3RyaW5nQnVpbGRlci4gRWl0aGVyIDAgZGlnaXRzIGFyZSBhZGRlZCAoaW4gd2hpY2gKLSAgICAgICAgLy8vIGNhc2Ugbm8gIi4iIGlzIGFwcGVuZGVkKSwgb3IgMyA2IG9yIDkgZGlnaXRzLiBUaGlzIGlzIGludGVybmFsIGZvciB1c2UgaW4gVGltZXN0YW1wIGFzIHdlbGwKLSAgICAgICAgLy8vIGFzIER1cmF0aW9uLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBzdGF0aWMgdm9pZCBBcHBlbmROYW5vc2Vjb25kcyhTdHJpbmdCdWlsZGVyIGJ1aWxkZXIsIGludCBuYW5vcykKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKG5hbm9zICE9IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoJy4nKTsKLSAgICAgICAgICAgICAgICAvLyBPdXRwdXQgdG8gMywgNiBvciA5IGRpZ2l0cy4KLSAgICAgICAgICAgICAgICBpZiAobmFub3MgJSAxMDAwMDAwID09IDApCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZCgobmFub3MgLyAxMDAwMDAwKS5Ub1N0cmluZygiZDMiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGVsc2UgaWYgKG5hbm9zICUgMTAwMCA9PSAwKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoKG5hbm9zIC8gMTAwMCkuVG9TdHJpbmcoImQ2IiwgQ3VsdHVyZUluZm8uSW52YXJpYW50Q3VsdHVyZSkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBidWlsZGVyLkFwcGVuZChuYW5vcy5Ub1N0cmluZygiZDkiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvRW1wdHkuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9FbXB0eS5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTA4ZWEyNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9FbXB0eS5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8KLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEKLSNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotdXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1ZjsKLXVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zOwotdXNpbmcgcGJyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIHsKLQotICAvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciByZWZsZWN0aW9uIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBmcm9tIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIEVtcHR5UmVmbGVjdGlvbiB7Ci0KLSAgICAjcmVnaW9uIERlc2NyaXB0b3IKLSAgICAvLy8gPHN1bW1hcnk+RmlsZSBkZXNjcmlwdG9yIGZvciBnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG88L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgc3RhdGljIEVtcHR5UmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNodG5iMjluYkdVdmNISnZkRzlpZFdZdlpXMXdkSGt1Y0hKdmRHOFNEMmR2YjJkc1pTNXdjbTkwYjJKMSIsCi0gICAgICAgICAgICAiWmlJSENnVkZiWEIwZVVKNUNoTmpiMjB1WjI5dloyeGxMbkJ5YjNSdlluVm1RZ3BGYlhCMGVWQnliM1J2IiwKLSAgICAgICAgICAgICJVQUZhSjJkcGRHaDFZaTVqYjIwdloyOXNZVzVuTDNCeWIzUnZZblZtTDNCMGVYQmxjeTlsYlhCMGVhQUIiLAotICAgICAgICAgICAgIkFmZ0JBYUlDQTBkUVFxb0NIa2R2YjJkc1pTNVFjbTkwYjJKMVppNVhaV3hzUzI1dmQyNVVlWEJsYzJJRyIsCi0gICAgICAgICAgICAiY0hKdmRHOHoiKSk7Ci0gICAgICBkZXNjcmlwdG9yID0gcGJyOjpGaWxlRGVzY3JpcHRvci5Gcm9tR2VuZXJhdGVkQ29kZShkZXNjcmlwdG9yRGF0YSwKLSAgICAgICAgICBuZXcgcGJyOjpGaWxlRGVzY3JpcHRvcltdIHsgfSwKLSAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyhudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbXB0eSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5LlBhcnNlciwgbnVsbCwgbnVsbCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICB9KSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0gICNyZWdpb24gTWVzc2FnZXMKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIEEgZ2VuZXJpYyBlbXB0eSBtZXNzYWdlIHRoYXQgeW91IGNhbiByZS11c2UgdG8gYXZvaWQgZGVmaW5pbmcgZHVwbGljYXRlZAotICAvLy8gIGVtcHR5IG1lc3NhZ2VzIGluIHlvdXIgQVBJcy4gQSB0eXBpY2FsIGV4YW1wbGUgaXMgdG8gdXNlIGl0IGFzIHRoZSByZXF1ZXN0Ci0gIC8vLyAgb3IgdGhlIHJlc3BvbnNlIHR5cGUgb2YgYW4gQVBJIG1ldGhvZC4gRm9yIGluc3RhbmNlOgotICAvLy8KLSAgLy8vICAgICAgc2VydmljZSBGb28gewotICAvLy8gICAgICAgIHJwYyBCYXIoZ29vZ2xlLnByb3RvYnVmLkVtcHR5KSByZXR1cm5zIChnb29nbGUucHJvdG9idWYuRW1wdHkpOwotICAvLy8gICAgICB9Ci0gIC8vLwotICAvLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgRW1wdHlgIGlzIGVtcHR5IEpTT04gb2JqZWN0IGB7fWAuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBFbXB0eSA6IHBiOjpJTWVzc2FnZTxFbXB0eT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEVtcHR5PiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEVtcHR5PigoKSA9PiBuZXcgRW1wdHkoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxFbXB0eT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkVtcHR5UmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRW1wdHkoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEVtcHR5KEVtcHR5IG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgfQotCi0gICAgcHVibGljIEVtcHR5IENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBFbXB0eSh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEVtcHR5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRW1wdHkgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShFbXB0eSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAjZW5kcmVnaW9uCi0KLX0KLQotI2VuZHJlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvRmllbGRNYXNrLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvRmllbGRNYXNrLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZjBhNjRkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0ZpZWxkTWFzay5jcworKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bwotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQotI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi11c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmOwotdXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMgewotCi0gIC8vLyA8c3VtbWFyeT5Ib2xkZXIgZm9yIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGZyb20gZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBGaWVsZE1hc2tSZWZsZWN0aW9uIHsKLQotICAgICNyZWdpb24gRGVzY3JpcHRvcgotICAgIC8vLyA8c3VtbWFyeT5GaWxlIGRlc2NyaXB0b3IgZm9yIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgIHN0YXRpYyBGaWVsZE1hc2tSZWZsZWN0aW9uKCkgewotICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKAotICAgICAgICAgIHN0cmluZy5Db25jYXQoCi0gICAgICAgICAgICAiQ2lCbmIyOW5iR1V2Y0hKdmRHOWlkV1l2Wm1sbGJHUmZiV0Z6YXk1d2NtOTBieElQWjI5dloyeGxMbkJ5IiwKLSAgICAgICAgICAgICJiM1J2WW5WbUlob0tDVVpwWld4a1RXRnpheElOQ2dWd1lYUm9jeGdCSUFNb0NVSlJDaE5qYjIwdVoyOXYiLAotICAgICAgICAgICAgIloyeGxMbkJ5YjNSdlluVm1RZzVHYVdWc1pFMWhjMnRRY205MGIxQUJvQUVCb2dJRFIxQkNxZ0llUjI5diIsCi0gICAgICAgICAgICAiWjJ4bExsQnliM1J2WW5WbUxsZGxiR3hMYm05M2JsUjVjR1Z6WWdad2NtOTBiek09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGRNYXNrLlBhcnNlciwgbmV3W117ICJQYXRocyIgfSwgbnVsbCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICB9KSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0gICNyZWdpb24gTWVzc2FnZXMKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIGBGaWVsZE1hc2tgIHJlcHJlc2VudHMgYSBzZXQgb2Ygc3ltYm9saWMgZmllbGQgcGF0aHMsIGZvciBleGFtcGxlOgotICAvLy8KLSAgLy8vICAgICAgcGF0aHM6ICJmLmEiCi0gIC8vLyAgICAgIHBhdGhzOiAiZi5iLmQiCi0gIC8vLwotICAvLy8gIEhlcmUgYGZgIHJlcHJlc2VudHMgYSBmaWVsZCBpbiBzb21lIHJvb3QgbWVzc2FnZSwgYGFgIGFuZCBgYmAKLSAgLy8vICBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgZm91bmQgaW4gYGZgLCBhbmQgYGRgIGEgZmllbGQgZm91bmQgaW4gdGhlCi0gIC8vLyAgbWVzc2FnZSBpbiBgZi5iYC4KLSAgLy8vCi0gIC8vLyAgRmllbGQgbWFza3MgYXJlIHVzZWQgdG8gc3BlY2lmeSBhIHN1YnNldCBvZiBmaWVsZHMgdGhhdCBzaG91bGQgYmUKLSAgLy8vICByZXR1cm5lZCBieSBhIGdldCBvcGVyYXRpb24gb3IgbW9kaWZpZWQgYnkgYW4gdXBkYXRlIG9wZXJhdGlvbi4KLSAgLy8vICBGaWVsZCBtYXNrcyBhbHNvIGhhdmUgYSBjdXN0b20gSlNPTiBlbmNvZGluZyAoc2VlIGJlbG93KS4KLSAgLy8vCi0gIC8vLyAgIyBGaWVsZCBNYXNrcyBpbiBQcm9qZWN0aW9ucwotICAvLy8KLSAgLy8vICBXaGVuIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBwcm9qZWN0aW9uLCBhIHJlc3BvbnNlIG1lc3NhZ2Ugb3IKLSAgLy8vICBzdWItbWVzc2FnZSBpcyBmaWx0ZXJlZCBieSB0aGUgQVBJIHRvIG9ubHkgY29udGFpbiB0aG9zZSBmaWVsZHMgYXMKLSAgLy8vICBzcGVjaWZpZWQgaW4gdGhlIG1hc2suIEZvciBleGFtcGxlLCBpZiB0aGUgbWFzayBpbiB0aGUgcHJldmlvdXMKLSAgLy8vICBleGFtcGxlIGlzIGFwcGxpZWQgdG8gYSByZXNwb25zZSBtZXNzYWdlIGFzIGZvbGxvd3M6Ci0gIC8vLwotICAvLy8gICAgICBmIHsKLSAgLy8vICAgICAgICBhIDogMjIKLSAgLy8vICAgICAgICBiIHsKLSAgLy8vICAgICAgICAgIGQgOiAxCi0gIC8vLyAgICAgICAgICB4IDogMgotICAvLy8gICAgICAgIH0KLSAgLy8vICAgICAgICB5IDogMTMKLSAgLy8vICAgICAgfQotICAvLy8gICAgICB6OiA4Ci0gIC8vLwotICAvLy8gIFRoZSByZXN1bHQgd2lsbCBub3QgY29udGFpbiBzcGVjaWZpYyB2YWx1ZXMgZm9yIGZpZWxkcyB4LHkgYW5kIHoKLSAgLy8vICAodGhlaXIgdmFsdWUgd2lsbCBiZSBzZXQgdG8gdGhlIGRlZmF1bHQsIGFuZCBvbWl0dGVkIGluIHByb3RvIHRleHQKLSAgLy8vICBvdXRwdXQpOgotICAvLy8KLSAgLy8vICAgICAgZiB7Ci0gIC8vLyAgICAgICAgYSA6IDIyCi0gIC8vLyAgICAgICAgYiB7Ci0gIC8vLyAgICAgICAgICBkIDogMQotICAvLy8gICAgICAgIH0KLSAgLy8vICAgICAgfQotICAvLy8KLSAgLy8vICBBIHJlcGVhdGVkIGZpZWxkIGlzIG5vdCBhbGxvd2VkIGV4Y2VwdCBhdCB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhCi0gIC8vLyAgZmllbGQgbWFzay4KLSAgLy8vCi0gIC8vLyAgSWYgYSBGaWVsZE1hc2sgb2JqZWN0IGlzIG5vdCBwcmVzZW50IGluIGEgZ2V0IG9wZXJhdGlvbiwgdGhlCi0gIC8vLyAgb3BlcmF0aW9uIGFwcGxpZXMgdG8gYWxsIGZpZWxkcyAoYXMgaWYgYSBGaWVsZE1hc2sgb2YgYWxsIGZpZWxkcwotICAvLy8gIGhhZCBiZWVuIHNwZWNpZmllZCkuCi0gIC8vLwotICAvLy8gIE5vdGUgdGhhdCBhIGZpZWxkIG1hc2sgZG9lcyBub3QgbmVjZXNzYXJpbHkgYXBwbHkgdG8gdGhlCi0gIC8vLyAgdG9wLWxldmVsIHJlc3BvbnNlIG1lc3NhZ2UuIEluIGNhc2Ugb2YgYSBSRVNUIGdldCBvcGVyYXRpb24sIHRoZQotICAvLy8gIGZpZWxkIG1hc2sgYXBwbGllcyBkaXJlY3RseSB0byB0aGUgcmVzcG9uc2UsIGJ1dCBpbiBjYXNlIG9mIGEgUkVTVAotICAvLy8gIGxpc3Qgb3BlcmF0aW9uLCB0aGUgbWFzayBpbnN0ZWFkIGFwcGxpZXMgdG8gZWFjaCBpbmRpdmlkdWFsIG1lc3NhZ2UKLSAgLy8vICBpbiB0aGUgcmV0dXJuZWQgcmVzb3VyY2UgbGlzdC4gSW4gY2FzZSBvZiBhIFJFU1QgY3VzdG9tIG1ldGhvZCwKLSAgLy8vICBvdGhlciBkZWZpbml0aW9ucyBtYXkgYmUgdXNlZC4gV2hlcmUgdGhlIG1hc2sgYXBwbGllcyB3aWxsIGJlCi0gIC8vLyAgY2xlYXJseSBkb2N1bWVudGVkIHRvZ2V0aGVyIHdpdGggaXRzIGRlY2xhcmF0aW9uIGluIHRoZSBBUEkuICBJbgotICAvLy8gIGFueSBjYXNlLCB0aGUgZWZmZWN0IG9uIHRoZSByZXR1cm5lZCByZXNvdXJjZS9yZXNvdXJjZXMgaXMgcmVxdWlyZWQKLSAgLy8vICBiZWhhdmlvciBmb3IgQVBJcy4KLSAgLy8vCi0gIC8vLyAgIyBGaWVsZCBNYXNrcyBpbiBVcGRhdGUgT3BlcmF0aW9ucwotICAvLy8KLSAgLy8vICBBIGZpZWxkIG1hc2sgaW4gdXBkYXRlIG9wZXJhdGlvbnMgc3BlY2lmaWVzIHdoaWNoIGZpZWxkcyBvZiB0aGUKLSAgLy8vICB0YXJnZXRlZCByZXNvdXJjZSBhcmUgZ29pbmcgdG8gYmUgdXBkYXRlZC4gVGhlIEFQSSBpcyByZXF1aXJlZAotICAvLy8gIHRvIG9ubHkgY2hhbmdlIHRoZSB2YWx1ZXMgb2YgdGhlIGZpZWxkcyBhcyBzcGVjaWZpZWQgaW4gdGhlIG1hc2sKLSAgLy8vICBhbmQgbGVhdmUgdGhlIG90aGVycyB1bnRvdWNoZWQuIElmIGEgcmVzb3VyY2UgaXMgcGFzc2VkIGluIHRvCi0gIC8vLyAgZGVzY3JpYmUgdGhlIHVwZGF0ZWQgdmFsdWVzLCB0aGUgQVBJIGlnbm9yZXMgdGhlIHZhbHVlcyBvZiBhbGwKLSAgLy8vICBmaWVsZHMgbm90IGNvdmVyZWQgYnkgdGhlIG1hc2suCi0gIC8vLwotICAvLy8gIEluIG9yZGVyIHRvIHJlc2V0IGEgZmllbGQncyB2YWx1ZSB0byB0aGUgZGVmYXVsdCwgdGhlIGZpZWxkIG11c3QKLSAgLy8vICBiZSBpbiB0aGUgbWFzayBhbmQgc2V0IHRvIHRoZSBkZWZhdWx0IHZhbHVlIGluIHRoZSBwcm92aWRlZCByZXNvdXJjZS4KLSAgLy8vICBIZW5jZSwgaW4gb3JkZXIgdG8gcmVzZXQgYWxsIGZpZWxkcyBvZiBhIHJlc291cmNlLCBwcm92aWRlIGEgZGVmYXVsdAotICAvLy8gIGluc3RhbmNlIG9mIHRoZSByZXNvdXJjZSBhbmQgc2V0IGFsbCBmaWVsZHMgaW4gdGhlIG1hc2ssIG9yIGRvCi0gIC8vLyAgbm90IHByb3ZpZGUgYSBtYXNrIGFzIGRlc2NyaWJlZCBiZWxvdy4KLSAgLy8vCi0gIC8vLyAgSWYgYSBmaWVsZCBtYXNrIGlzIG5vdCBwcmVzZW50IG9uIHVwZGF0ZSwgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi0gIC8vLyAgYWxsIGZpZWxkcyAoYXMgaWYgYSBmaWVsZCBtYXNrIG9mIGFsbCBmaWVsZHMgaGFzIGJlZW4gc3BlY2lmaWVkKS4KLSAgLy8vICBOb3RlIHRoYXQgaW4gdGhlIHByZXNlbmNlIG9mIHNjaGVtYSBldm9sdXRpb24sIHRoaXMgbWF5IG1lYW4gdGhhdAotICAvLy8gIGZpZWxkcyB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgYW5kIGhhcyB0aGVyZWZvcmUgbm90IGZpbGxlZCBpbnRvCi0gIC8vLyAgdGhlIHJlcXVlc3Qgd2lsbCBiZSByZXNldCB0byB0aGVpciBkZWZhdWx0LiBJZiB0aGlzIGlzIHVud2FudGVkCi0gIC8vLyAgYmVoYXZpb3IsIGEgc3BlY2lmaWMgc2VydmljZSBtYXkgcmVxdWlyZSBhIGNsaWVudCB0byBhbHdheXMgc3BlY2lmeQotICAvLy8gIGEgZmllbGQgbWFzaywgcHJvZHVjaW5nIGFuIGVycm9yIGlmIG5vdC4KLSAgLy8vCi0gIC8vLyAgQXMgd2l0aCBnZXQgb3BlcmF0aW9ucywgdGhlIGxvY2F0aW9uIG9mIHRoZSByZXNvdXJjZSB3aGljaAotICAvLy8gIGRlc2NyaWJlcyB0aGUgdXBkYXRlZCB2YWx1ZXMgaW4gdGhlIHJlcXVlc3QgbWVzc2FnZSBkZXBlbmRzIG9uIHRoZQotICAvLy8gIG9wZXJhdGlvbiBraW5kLiBJbiBhbnkgY2FzZSwgdGhlIGVmZmVjdCBvZiB0aGUgZmllbGQgbWFzayBpcwotICAvLy8gIHJlcXVpcmVkIHRvIGJlIGhvbm9yZWQgYnkgdGhlIEFQSS4KLSAgLy8vCi0gIC8vLyAgIyMgQ29uc2lkZXJhdGlvbnMgZm9yIEhUVFAgUkVTVAotICAvLy8KLSAgLy8vICBUaGUgSFRUUCBraW5kIG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG1hc2sgbXVzdAotICAvLy8gIGJlIHNldCB0byBQQVRDSCBpbnN0ZWFkIG9mIFBVVCBpbiBvcmRlciB0byBzYXRpc2Z5IEhUVFAgc2VtYW50aWNzCi0gIC8vLyAgKFBVVCBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgZnVsbCB1cGRhdGVzKS4KLSAgLy8vCi0gIC8vLyAgIyBKU09OIEVuY29kaW5nIG9mIEZpZWxkIE1hc2tzCi0gIC8vLwotICAvLy8gIEluIEpTT04sIGEgZmllbGQgbWFzayBpcyBlbmNvZGVkIGFzIGEgc2luZ2xlIHN0cmluZyB3aGVyZSBwYXRocyBhcmUKLSAgLy8vICBzZXBhcmF0ZWQgYnkgYSBjb21tYS4gRmllbGRzIG5hbWUgaW4gZWFjaCBwYXRoIGFyZSBjb252ZXJ0ZWQKLSAgLy8vICB0by9mcm9tIGxvd2VyLWNhbWVsIG5hbWluZyBjb252ZW50aW9ucy4KLSAgLy8vCi0gIC8vLyAgQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBtZXNzYWdlIGRlY2xhcmF0aW9uczoKLSAgLy8vCi0gIC8vLyAgICAgIG1lc3NhZ2UgUHJvZmlsZSB7Ci0gIC8vLyAgICAgICAgVXNlciB1c2VyID0gMTsKLSAgLy8vICAgICAgICBQaG90byBwaG90byA9IDI7Ci0gIC8vLyAgICAgIH0KLSAgLy8vICAgICAgbWVzc2FnZSBVc2VyIHsKLSAgLy8vICAgICAgICBzdHJpbmcgZGlzcGxheV9uYW1lID0gMTsKLSAgLy8vICAgICAgICBzdHJpbmcgYWRkcmVzcyA9IDI7Ci0gIC8vLyAgICAgIH0KLSAgLy8vCi0gIC8vLyAgSW4gcHJvdG8gYSBmaWVsZCBtYXNrIGZvciBgUHJvZmlsZWAgbWF5IGxvb2sgYXMgc3VjaDoKLSAgLy8vCi0gIC8vLyAgICAgIG1hc2sgewotICAvLy8gICAgICAgIHBhdGhzOiAidXNlci5kaXNwbGF5X25hbWUiCi0gIC8vLyAgICAgICAgcGF0aHM6ICJwaG90byIKLSAgLy8vICAgICAgfQotICAvLy8KLSAgLy8vICBJbiBKU09OLCB0aGUgc2FtZSBtYXNrIGlzIHJlcHJlc2VudGVkIGFzIGJlbG93OgotICAvLy8KLSAgLy8vICAgICAgewotICAvLy8gICAgICAgIG1hc2s6ICJ1c2VyLmRpc3BsYXlOYW1lLHBob3RvIgotICAvLy8gICAgICB9Ci0gIC8vLwotICAvLy8gICMgRmllbGQgTWFza3MgYW5kIE9uZW9mIEZpZWxkcwotICAvLy8KLSAgLy8vICBGaWVsZCBtYXNrcyB0cmVhdCBmaWVsZHMgaW4gb25lb2ZzIGp1c3QgYXMgcmVndWxhciBmaWVsZHMuIENvbnNpZGVyIHRoZQotICAvLy8gIGZvbGxvd2luZyBtZXNzYWdlOgotICAvLy8KLSAgLy8vICAgICAgbWVzc2FnZSBTYW1wbGVNZXNzYWdlIHsKLSAgLy8vICAgICAgICBvbmVvZiB0ZXN0X29uZW9mIHsKLSAgLy8vICAgICAgICAgIHN0cmluZyBuYW1lID0gNDsKLSAgLy8vICAgICAgICAgIFN1Yk1lc3NhZ2Ugc3ViX21lc3NhZ2UgPSA5OwotICAvLy8gICAgICAgIH0KLSAgLy8vICAgICAgfQotICAvLy8KLSAgLy8vICBUaGUgZmllbGQgbWFzayBjYW4gYmU6Ci0gIC8vLwotICAvLy8gICAgICBtYXNrIHsKLSAgLy8vICAgICAgICBwYXRoczogIm5hbWUiCi0gIC8vLyAgICAgIH0KLSAgLy8vCi0gIC8vLyAgT3I6Ci0gIC8vLwotICAvLy8gICAgICBtYXNrIHsKLSAgLy8vICAgICAgICBwYXRoczogInN1Yl9tZXNzYWdlIgotICAvLy8gICAgICB9Ci0gIC8vLwotICAvLy8gIE5vdGUgdGhhdCBvbmVvZiB0eXBlIG5hbWVzICgidGVzdF9vbmVvZiIgaW4gdGhpcyBjYXNlKSBjYW5ub3QgYmUgdXNlZCBpbgotICAvLy8gIHBhdGhzLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRmllbGRNYXNrIDogcGI6OklNZXNzYWdlPEZpZWxkTWFzaz4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEZpZWxkTWFzaz4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxGaWVsZE1hc2s+KCgpID0+IG5ldyBGaWVsZE1hc2soKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxGaWVsZE1hc2s+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZE1hc2tSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGaWVsZE1hc2soKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEZpZWxkTWFzayhGaWVsZE1hc2sgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHBhdGhzXyA9IG90aGVyLnBhdGhzXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWVsZE1hc2sgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEZpZWxkTWFzayh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInBhdGhzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBQYXRoc0ZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxzdHJpbmc+IF9yZXBlYXRlZF9wYXRoc19jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvclN0cmluZygxMCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8c3RyaW5nPiBwYXRoc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgc2V0IG9mIGZpZWxkIG1hc2sgcGF0aHMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4gUGF0aHMgewotICAgICAgZ2V0IHsgcmV0dXJuIHBhdGhzXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRmllbGRNYXNrKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRmllbGRNYXNrIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmKCFwYXRoc18uRXF1YWxzKG90aGVyLnBhdGhzXykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IHBhdGhzXy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBwYXRoc18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9wYXRoc19jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSBwYXRoc18uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfcGF0aHNfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEZpZWxkTWFzayBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgcGF0aHNfLkFkZChvdGhlci5wYXRoc18pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIHBhdGhzXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX3JlcGVhdGVkX3BhdGhzX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0ZpZWxkTWFza1BhcnRpYWwuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9GaWVsZE1hc2tQYXJ0aWFsLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0YmQ2MmNmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL0ZpZWxkTWFza1BhcnRpYWwuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zOwotdXNpbmcgU3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci11c2luZyBTeXN0ZW0uSU87Ci11c2luZyBTeXN0ZW0uTGlucTsKLXVzaW5nIFN5c3RlbS5UZXh0OwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzCi17Ci0gICAgLy8gTWFudWFsbHktd3JpdHRlbiBwYXJ0aWFsIGNsYXNzIGZvciB0aGUgRmllbGRNYXNrIHdlbGwta25vd24gdHlwZS4KLSAgICBwdWJsaWMgcGFydGlhbCBjbGFzcyBGaWVsZE1hc2sgOiBJQ3VzdG9tRGlhZ25vc3RpY01lc3NhZ2UKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlcnRzIGEgdGltZXN0YW1wICBzcGVjaWZpZWQgaW4gc2Vjb25kcy9uYW5vc2Vjb25kcyB0byBhIHN0cmluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gSWYgdGhlIHZhbHVlIGlzIGEgbm9ybWFsaXplZCBkdXJhdGlvbiBpbiB0aGUgcmFuZ2UgZGVzY3JpYmVkIGluIDxjPmZpZWxkX21hc2sucHJvdG88L2M+LAotICAgICAgICAvLy8gPHBhcmFtcmVmIG5hbWU9ImRpYWdub3N0aWNPbmx5Ii8+IGlzIGlnbm9yZWQuIE90aGVyd2lzZSwgaWYgdGhlIHBhcmFtZXRlciBpcyA8Yz50cnVlPC9jPiwKLSAgICAgICAgLy8vIGEgSlNPTiBvYmplY3Qgd2l0aCBhIHdhcm5pbmcgaXMgcmV0dXJuZWQ7IGlmIGl0IGlzIDxjPmZhbHNlPC9jPiwgYW4gPHNlZSBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJwYXRocyI+UGF0aHMgaW4gdGhlIGZpZWxkIG1hc2s8L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImRpYWdub3N0aWNPbmx5Ij5EZXRlcm1pbmVzIHRoZSBoYW5kbGluZyBvZiBub24tbm9ybWFsaXplZCB2YWx1ZXM8L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj5UaGUgcmVwcmVzZW50ZWQgZHVyYXRpb24gaXMgaW52YWxpZCwgYW5kIDxwYXJhbXJlZiBuYW1lPSJkaWFnbm9zdGljT25seSIvPiBpcyA8Yz5mYWxzZTwvYz4uPC9leGNlcHRpb24+Ci0gICAgICAgIGludGVybmFsIHN0YXRpYyBzdHJpbmcgVG9Kc29uKElMaXN0PHN0cmluZz4gcGF0aHMsIGJvb2wgZGlhZ25vc3RpY09ubHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHZhciBmaXJzdEludmFsaWQgPSBwYXRocy5GaXJzdE9yRGVmYXVsdChwID0+ICFWYWxpZGF0ZVBhdGgocCkpOwotICAgICAgICAgICAgaWYgKGZpcnN0SW52YWxpZCA9PSBudWxsKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHZhciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgSnNvbkZvcm1hdHRlci5Xcml0ZVN0cmluZyh3cml0ZXIsIHN0cmluZy5Kb2luKCIsIiwgcGF0aHMuU2VsZWN0KEpzb25Gb3JtYXR0ZXIuVG9DYW1lbENhc2UpKSk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlci5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIGlmIChkaWFnbm9zdGljT25seSkKLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgIHZhciB3cml0ZXIgPSBuZXcgU3RyaW5nV3JpdGVyKCk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgieyBcIkB3YXJuaW5nXCI6IFwiSW52YWxpZCBGaWVsZE1hc2tcIiwgXCJwYXRoc1wiOiAiKTsKLSAgICAgICAgICAgICAgICAgICAgSnNvbkZvcm1hdHRlci5EZWZhdWx0LldyaXRlTGlzdCh3cml0ZXIsIChJTGlzdClwYXRocyk7Ci0gICAgICAgICAgICAgICAgICAgIHdyaXRlci5Xcml0ZSgiIH0iKTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHdyaXRlci5Ub1N0cmluZygpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBlbHNlCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbigkIkludmFsaWQgZmllbGQgbWFzayB0byBiZSBjb252ZXJ0ZWQgdG8gSlNPTjoge2ZpcnN0SW52YWxpZH0iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDYW1lbC1jYXNlIGNvbnZlcnRlciB3aXRoIGFkZGVkIHN0cmljdG5lc3MgZm9yIGZpZWxkIG1hc2sgZm9ybWF0dGluZy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iSW52YWxpZE9wZXJhdGlvbkV4Y2VwdGlvbiI+VGhlIGZpZWxkIG1hc2sgaXMgaW52YWxpZCBmb3IgSlNPTiByZXByZXNlbnRhdGlvbjwvZXhjZXB0aW9uPgotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIFZhbGlkYXRlUGF0aChzdHJpbmcgaW5wdXQpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuTGVuZ3RoOyBpKyspCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgY2hhciBjID0gaW5wdXRbaV07Ci0gICAgICAgICAgICAgICAgaWYgKGMgPj0gJ0EnICYmIGMgPD0gJ1onKQotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoYyA9PSAnXycgJiYgaSA8IGlucHV0Lkxlbmd0aCAtIDEpCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICBjaGFyIG5leHQgPSBpbnB1dFtpICsgMV07Ci0gICAgICAgICAgICAgICAgICAgIGlmIChuZXh0IDwgJ2EnIHx8IG5leHQgPiAneicpCi0gICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyBhIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIDxzZWUgY3JlZj0iRmllbGRNYXNrIi8+IGZvciBkaWFnbm9zdGljIHB1cnBvc2VzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBOb3JtYWxseSB0aGUgcmV0dXJuZWQgdmFsdWUgd2lsbCBiZSBhIEpTT04gc3RyaW5nIHZhbHVlIChpbmNsdWRpbmcgbGVhZGluZyBhbmQgdHJhaWxpbmcgcXVvdGVzKSBidXQKLSAgICAgICAgLy8vIHdoZW4gdGhlIHZhbHVlIGlzIG5vbi1ub3JtYWxpemVkIG9yIG91dCBvZiByYW5nZSwgYSBKU09OIG9iamVjdCByZXByZXNlbnRhdGlvbiB3aWxsIGJlIHJldHVybmVkCi0gICAgICAgIC8vLyBpbnN0ZWFkLCBpbmNsdWRpbmcgYSB3YXJuaW5nLiBUaGlzIGlzIHRvIGF2b2lkIGV4Y2VwdGlvbnMgYmVpbmcgdGhyb3duIHdoZW4gdHJ5aW5nIHRvCi0gICAgICAgIC8vLyBkaWFnbm9zZSBwcm9ibGVtcyAtIHRoZSByZWd1bGFyIEpTT04gZm9ybWF0dGVyIHdpbGwgc3RpbGwgdGhyb3cgYW4gZXhjZXB0aW9uIGZvciBub24tbm9ybWFsaXplZAotICAgICAgICAvLy8gdmFsdWVzLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHJldHVybnM+QSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyB2YWx1ZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdHJpbmcgVG9EaWFnbm9zdGljU3RyaW5nKCkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIFRvSnNvbihQYXRocywgdHJ1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9Tb3VyY2VDb250ZXh0LmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvU291cmNlQ29udGV4dC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIzNWVjZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9Tb3VyY2VDb250ZXh0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bwotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQotI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi11c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmOwotdXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMgewotCi0gIC8vLyA8c3VtbWFyeT5Ib2xkZXIgZm9yIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGZyb20gZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgU291cmNlQ29udGV4dFJlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgIHN0YXRpYyBTb3VyY2VDb250ZXh0UmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNpUm5iMjluYkdVdmNISnZkRzlpZFdZdmMyOTFjbU5sWDJOdmJuUmxlSFF1Y0hKdmRHOFNEMmR2YjJkcyIsCi0gICAgICAgICAgICAiWlM1d2NtOTBiMkoxWmlJaUNnMVRiM1Z5WTJWRGIyNTBaWGgwRWhFS0NXWnBiR1ZmYm1GdFpSZ0JJQUVvIiwKLSAgICAgICAgICAgICJDVUpWQ2hOamIyMHVaMjl2WjJ4bExuQnliM1J2WW5WbVFoSlRiM1Z5WTJWRGIyNTBaWGgwVUhKdmRHOVEiLAotICAgICAgICAgICAgIkFhQUJBYUlDQTBkUVFxb0NIa2R2YjJkc1pTNVFjbTkwYjJKMVppNVhaV3hzUzI1dmQyNVVlWEJsYzJJRyIsCi0gICAgICAgICAgICAiY0hKdmRHOHoiKSk7Ci0gICAgICBkZXNjcmlwdG9yID0gcGJyOjpGaWxlRGVzY3JpcHRvci5Gcm9tR2VuZXJhdGVkQ29kZShkZXNjcmlwdG9yRGF0YSwKLSAgICAgICAgICBuZXcgcGJyOjpGaWxlRGVzY3JpcHRvcltdIHsgfSwKLSAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyhudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dC5QYXJzZXIsIG5ld1tdeyAiRmlsZU5hbWUiIH0sIG51bGwsIG51bGwsIG51bGwpCi0gICAgICAgICAgfSkpOwotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotICAjcmVnaW9uIE1lc3NhZ2VzCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBgU291cmNlQ29udGV4dGAgcmVwcmVzZW50cyBpbmZvcm1hdGlvbiBhYm91dCB0aGUgc291cmNlIG9mIGEKLSAgLy8vICBwcm90b2J1ZiBlbGVtZW50LCBsaWtlIHRoZSBmaWxlIGluIHdoaWNoIGl0IGlzIGRlZmluZWQuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBTb3VyY2VDb250ZXh0IDogcGI6OklNZXNzYWdlPFNvdXJjZUNvbnRleHQ+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxTb3VyY2VDb250ZXh0PiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFNvdXJjZUNvbnRleHQ+KCgpID0+IG5ldyBTb3VyY2VDb250ZXh0KCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8U291cmNlQ29udGV4dD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHRSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBTb3VyY2VDb250ZXh0KCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBTb3VyY2VDb250ZXh0KFNvdXJjZUNvbnRleHQgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGZpbGVOYW1lXyA9IG90aGVyLmZpbGVOYW1lXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU291cmNlQ29udGV4dCBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgU291cmNlQ29udGV4dCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZpbGVfbmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmlsZU5hbWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgZmlsZU5hbWVfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIHBhdGgtcXVhbGlmaWVkIG5hbWUgb2YgdGhlIC5wcm90byBmaWxlIHRoYXQgY29udGFpbmVkIHRoZSBhc3NvY2lhdGVkCi0gICAgLy8vICBwcm90b2J1ZiBlbGVtZW50LiAgRm9yIGV4YW1wbGU6IGAiZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZS5wcm90byJgLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBGaWxlTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmlsZU5hbWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBmaWxlTmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBTb3VyY2VDb250ZXh0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoU291cmNlQ29udGV4dCBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoRmlsZU5hbWUgIT0gb3RoZXIuRmlsZU5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoRmlsZU5hbWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gRmlsZU5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKEZpbGVOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhGaWxlTmFtZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKEZpbGVOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShGaWxlTmFtZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oU291cmNlQ29udGV4dCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLkZpbGVOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIEZpbGVOYW1lID0gb3RoZXIuRmlsZU5hbWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgRmlsZU5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gICNlbmRyZWdpb24KLQotfQotCi0jZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9TdHJ1Y3QuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9TdHJ1Y3QuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkYzg5NDAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvU3RydWN0LmNzCisrKyAvZGV2L251bGwKQEAgLTEsNjAwICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8KLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEKLSNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotdXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1ZjsKLXVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zOwotdXNpbmcgcGJyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIHsKLQotICAvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciByZWZsZWN0aW9uIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBmcm9tIGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBTdHJ1Y3RSZWZsZWN0aW9uIHsKLQotICAgICNyZWdpb24gRGVzY3JpcHRvcgotICAgIC8vLyA8c3VtbWFyeT5GaWxlIGRlc2NyaXB0b3IgZm9yIGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG88L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgc3RhdGljIFN0cnVjdFJlZmxlY3Rpb24oKSB7Ci0gICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoCi0gICAgICAgICAgc3RyaW5nLkNvbmNhdCgKLSAgICAgICAgICAgICJDaHhuYjI5bmJHVXZjSEp2ZEc5aWRXWXZjM1J5ZFdOMExuQnliM1J2RWc5bmIyOW5iR1V1Y0hKdmRHOWkiLAotICAgICAgICAgICAgImRXWWloQUVLQmxOMGNuVmpkQkl6Q2dabWFXVnNaSE1ZQVNBREtBc3lJeTVuYjI5bmJHVXVjSEp2ZEc5aSIsCi0gICAgICAgICAgICAiZFdZdVUzUnlkV04wTGtacFpXeGtjMFZ1ZEhKNUdrVUtDMFpwWld4a2MwVnVkSEo1RWdzS0EydGxlUmdCIiwKLSAgICAgICAgICAgICJJQUVvQ1JJbENnVjJZV3gxWlJnQ0lBRW9DeklXTG1kdmIyZHNaUzV3Y205MGIySjFaaTVXWVd4MVpUb0MiLAotICAgICAgICAgICAgIk9BRWk2Z0VLQlZaaGJIVmxFakFLQ201MWJHeGZkbUZzZFdVWUFTQUJLQTR5R2k1bmIyOW5iR1V1Y0hKdiIsCi0gICAgICAgICAgICAiZEc5aWRXWXVUblZzYkZaaGJIVmxTQUFTRmdvTWJuVnRZbVZ5WDNaaGJIVmxHQUlnQVNnQlNBQVNGZ29NIiwKLSAgICAgICAgICAgICJjM1J5YVc1blgzWmhiSFZsR0FNZ0FTZ0pTQUFTRkFvS1ltOXZiRjkyWVd4MVpSZ0VJQUVvQ0VnQUVpOEsiLAotICAgICAgICAgICAgIkRITjBjblZqZEY5MllXeDFaUmdGSUFFb0N6SVhMbWR2YjJkc1pTNXdjbTkwYjJKMVppNVRkSEoxWTNSSSIsCi0gICAgICAgICAgICAiQUJJd0NncHNhWE4wWDNaaGJIVmxHQVlnQVNnTE1ob3VaMjl2WjJ4bExuQnliM1J2WW5WbUxreHBjM1JXIiwKLSAgICAgICAgICAgICJZV3gxWlVnQVFnWUtCR3RwYm1RaU13b0pUR2x6ZEZaaGJIVmxFaVlLQm5aaGJIVmxjeGdCSUFNb0N6SVciLAotICAgICAgICAgICAgIkxtZHZiMmRzWlM1d2NtOTBiMkoxWmk1V1lXeDFaU29iQ2dsT2RXeHNWbUZzZFdVU0Rnb0tUbFZNVEY5VyIsCi0gICAgICAgICAgICAiUVV4VlJSQUFRb0VCQ2hOamIyMHVaMjl2WjJ4bExuQnliM1J2WW5WbVFndFRkSEoxWTNSUWNtOTBiMUFCIiwKLSAgICAgICAgICAgICJXakZuYVhSb2RXSXVZMjl0TDJkdmJHRnVaeTl3Y205MGIySjFaaTl3ZEhsd1pYTXZjM1J5ZFdOME8zTjAiLAotICAgICAgICAgICAgImNuVmpkSEJpb0FFQm9nSURSMUJDcWdJZVIyOXZaMnhsTGxCeWIzUnZZblZtTGxkbGJHeExibTkzYmxSNSIsCi0gICAgICAgICAgICAiY0dWellnWndjbTkwYnpNPSIpKTsKLSAgICAgIGRlc2NyaXB0b3IgPSBwYnI6OkZpbGVEZXNjcmlwdG9yLkZyb21HZW5lcmF0ZWRDb2RlKGRlc2NyaXB0b3JEYXRhLAotICAgICAgICAgIG5ldyBwYnI6OkZpbGVEZXNjcmlwdG9yW10geyB9LAotICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKG5ld1tdIHt0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuTnVsbFZhbHVlKSwgfSwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0KSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0LlBhcnNlciwgbmV3W117ICJGaWVsZHMiIH0sIG51bGwsIG51bGwsIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvW10geyBudWxsLCB9KSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlLlBhcnNlciwgbmV3W117ICJOdWxsVmFsdWUiLCAiTnVtYmVyVmFsdWUiLCAiU3RyaW5nVmFsdWUiLCAiQm9vbFZhbHVlIiwgIlN0cnVjdFZhbHVlIiwgIkxpc3RWYWx1ZSIgfSwgbmV3W117ICJLaW5kIiB9LCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5MaXN0VmFsdWUpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5MaXN0VmFsdWUuUGFyc2VyLCBuZXdbXXsgIlZhbHVlcyIgfSwgbnVsbCwgbnVsbCwgbnVsbCkKLSAgICAgICAgICB9KSk7Ci0gICAgfQotICAgICNlbmRyZWdpb24KLQotICB9Ci0gICNyZWdpb24gRW51bXMKLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIGBOdWxsVmFsdWVgIGlzIGEgc2luZ2xldG9uIGVudW1lcmF0aW9uIHRvIHJlcHJlc2VudCB0aGUgbnVsbCB2YWx1ZSBmb3IgdGhlCi0gIC8vLyAgYFZhbHVlYCB0eXBlIHVuaW9uLgotICAvLy8KLSAgLy8vICAgVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBOdWxsVmFsdWVgIGlzIEpTT04gYG51bGxgLgotICAvLy8gPC9zdW1tYXJ5PgotICBwdWJsaWMgZW51bSBOdWxsVmFsdWUgewotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIE51bGwgdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIk5VTExfVkFMVUUiKV0gTnVsbFZhbHVlID0gMCwKLSAgfQotCi0gICNlbmRyZWdpb24KLQotICAjcmVnaW9uIE1lc3NhZ2VzCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBgU3RydWN0YCByZXByZXNlbnRzIGEgc3RydWN0dXJlZCBkYXRhIHZhbHVlLCBjb25zaXN0aW5nIG9mIGZpZWxkcwotICAvLy8gIHdoaWNoIG1hcCB0byBkeW5hbWljYWxseSB0eXBlZCB2YWx1ZXMuIEluIHNvbWUgbGFuZ3VhZ2VzLCBgU3RydWN0YAotICAvLy8gIG1pZ2h0IGJlIHN1cHBvcnRlZCBieSBhIG5hdGl2ZSByZXByZXNlbnRhdGlvbi4gRm9yIGV4YW1wbGUsIGluCi0gIC8vLyAgc2NyaXB0aW5nIGxhbmd1YWdlcyBsaWtlIEpTIGEgc3RydWN0IGlzIHJlcHJlc2VudGVkIGFzIGFuCi0gIC8vLyAgb2JqZWN0LiBUaGUgZGV0YWlscyBvZiB0aGF0IHJlcHJlc2VudGF0aW9uIGFyZSBkZXNjcmliZWQgdG9nZXRoZXIKLSAgLy8vICB3aXRoIHRoZSBwcm90byBzdXBwb3J0IGZvciB0aGUgbGFuZ3VhZ2UuCi0gIC8vLwotICAvLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgU3RydWN0YCBpcyBKU09OIG9iamVjdC4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFN0cnVjdCA6IHBiOjpJTWVzc2FnZTxTdHJ1Y3Q+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxTdHJ1Y3Q+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8U3RydWN0PigoKSA9PiBuZXcgU3RydWN0KCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8U3RydWN0PiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0UmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RydWN0KCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBTdHJ1Y3QoU3RydWN0IG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBmaWVsZHNfID0gb3RoZXIuZmllbGRzXy5DbG9uZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBTdHJ1Y3QgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFN0cnVjdCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImZpZWxkcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRmllbGRzRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZT4uQ29kZWMgX21hcF9maWVsZHNfY29kZWMKLSAgICAgICAgPSBuZXcgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlPi5Db2RlYyhwYjo6RmllbGRDb2RlYy5Gb3JTdHJpbmcoMTApLCBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDE4LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZS5QYXJzZXIpLCAxMCk7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6Ok1hcEZpZWxkPHN0cmluZywgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVmFsdWU+IGZpZWxkc18gPSBuZXcgcGJjOjpNYXBGaWVsZDxzdHJpbmcsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFVub3JkZXJlZCBtYXAgb2YgZHluYW1pY2FsbHkgdHlwZWQgdmFsdWVzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6TWFwRmllbGQ8c3RyaW5nLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZT4gRmllbGRzIHsKLSAgICAgIGdldCB7IHJldHVybiBmaWVsZHNfOyB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBTdHJ1Y3QpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhTdHJ1Y3Qgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCFGaWVsZHMuRXF1YWxzKG90aGVyLkZpZWxkcykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IEZpZWxkcy5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBmaWVsZHNfLldyaXRlVG8ob3V0cHV0LCBfbWFwX2ZpZWxkc19jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSBmaWVsZHNfLkNhbGN1bGF0ZVNpemUoX21hcF9maWVsZHNfY29kZWMpOwotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFN0cnVjdCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgZmllbGRzXy5BZGQob3RoZXIuZmllbGRzXyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgZmllbGRzXy5BZGRFbnRyaWVzRnJvbShpbnB1dCwgX21hcF9maWVsZHNfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgYFZhbHVlYCByZXByZXNlbnRzIGEgZHluYW1pY2FsbHkgdHlwZWQgdmFsdWUgd2hpY2ggY2FuIGJlIGVpdGhlcgotICAvLy8gIG51bGwsIGEgbnVtYmVyLCBhIHN0cmluZywgYSBib29sZWFuLCBhIHJlY3Vyc2l2ZSBzdHJ1Y3QgdmFsdWUsIG9yIGEKLSAgLy8vICBsaXN0IG9mIHZhbHVlcy4gQSBwcm9kdWNlciBvZiB2YWx1ZSBpcyBleHBlY3RlZCB0byBzZXQgb25lIG9mIHRoYXQKLSAgLy8vICB2YXJpYW50cywgYWJzZW5jZSBvZiBhbnkgdmFyaWFudCBpbmRpY2F0ZXMgYW4gZXJyb3IuCi0gIC8vLwotICAvLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgVmFsdWVgIGlzIEpTT04gdmFsdWUuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBWYWx1ZSA6IHBiOjpJTWVzc2FnZTxWYWx1ZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFZhbHVlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFZhbHVlPigoKSA9PiBuZXcgVmFsdWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxWYWx1ZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cnVjdFJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFZhbHVlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBWYWx1ZShWYWx1ZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgc3dpdGNoIChvdGhlci5LaW5kQ2FzZSkgewotICAgICAgICBjYXNlIEtpbmRPbmVvZkNhc2UuTnVsbFZhbHVlOgotICAgICAgICAgIE51bGxWYWx1ZSA9IG90aGVyLk51bGxWYWx1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLaW5kT25lb2ZDYXNlLk51bWJlclZhbHVlOgotICAgICAgICAgIE51bWJlclZhbHVlID0gb3RoZXIuTnVtYmVyVmFsdWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2luZE9uZW9mQ2FzZS5TdHJpbmdWYWx1ZToKLSAgICAgICAgICBTdHJpbmdWYWx1ZSA9IG90aGVyLlN0cmluZ1ZhbHVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEtpbmRPbmVvZkNhc2UuQm9vbFZhbHVlOgotICAgICAgICAgIEJvb2xWYWx1ZSA9IG90aGVyLkJvb2xWYWx1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLaW5kT25lb2ZDYXNlLlN0cnVjdFZhbHVlOgotICAgICAgICAgIFN0cnVjdFZhbHVlID0gb3RoZXIuU3RydWN0VmFsdWUuQ2xvbmUoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLaW5kT25lb2ZDYXNlLkxpc3RWYWx1ZToKLSAgICAgICAgICBMaXN0VmFsdWUgPSBvdGhlci5MaXN0VmFsdWUuQ2xvbmUoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyBWYWx1ZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgVmFsdWUodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJudWxsX3ZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOdWxsVmFsdWVGaWVsZE51bWJlciA9IDE7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVwcmVzZW50cyBhIG51bGwgdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuTnVsbFZhbHVlIE51bGxWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4ga2luZENhc2VfID09IEtpbmRPbmVvZkNhc2UuTnVsbFZhbHVlID8gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk51bGxWYWx1ZSkga2luZF8gOiAwOyB9Ci0gICAgICBzZXQgewotICAgICAgICBraW5kXyA9IHZhbHVlOwotICAgICAgICBraW5kQ2FzZV8gPSBLaW5kT25lb2ZDYXNlLk51bGxWYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm51bWJlcl92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTnVtYmVyVmFsdWVGaWVsZE51bWJlciA9IDI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVwcmVzZW50cyBhIGRvdWJsZSB2YWx1ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBkb3VibGUgTnVtYmVyVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLk51bWJlclZhbHVlID8gKGRvdWJsZSkga2luZF8gOiAwRDsgfQotICAgICAgc2V0IHsKLSAgICAgICAga2luZF8gPSB2YWx1ZTsKLSAgICAgICAga2luZENhc2VfID0gS2luZE9uZW9mQ2FzZS5OdW1iZXJWYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInN0cmluZ192YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU3RyaW5nVmFsdWVGaWVsZE51bWJlciA9IDM7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVwcmVzZW50cyBhIHN0cmluZyB2YWx1ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgU3RyaW5nVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLlN0cmluZ1ZhbHVlID8gKHN0cmluZykga2luZF8gOiAiIjsgfQotICAgICAgc2V0IHsKLSAgICAgICAga2luZF8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgIGtpbmRDYXNlXyA9IEtpbmRPbmVvZkNhc2UuU3RyaW5nVmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJib29sX3ZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBCb29sVmFsdWVGaWVsZE51bWJlciA9IDQ7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVwcmVzZW50cyBhIGJvb2xlYW4gdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgYm9vbCBCb29sVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLkJvb2xWYWx1ZSA/IChib29sKSBraW5kXyA6IGZhbHNlOyB9Ci0gICAgICBzZXQgewotICAgICAgICBraW5kXyA9IHZhbHVlOwotICAgICAgICBraW5kQ2FzZV8gPSBLaW5kT25lb2ZDYXNlLkJvb2xWYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInN0cnVjdF92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU3RydWN0VmFsdWVGaWVsZE51bWJlciA9IDU7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVwcmVzZW50cyBhIHN0cnVjdHVyZWQgdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3RydWN0IFN0cnVjdFZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiBraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5TdHJ1Y3RWYWx1ZSA/IChnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3QpIGtpbmRfIDogbnVsbDsgfQotICAgICAgc2V0IHsKLSAgICAgICAga2luZF8gPSB2YWx1ZTsKLSAgICAgICAga2luZENhc2VfID0gdmFsdWUgPT0gbnVsbCA/IEtpbmRPbmVvZkNhc2UuTm9uZSA6IEtpbmRPbmVvZkNhc2UuU3RydWN0VmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJsaXN0X3ZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBMaXN0VmFsdWVGaWVsZE51bWJlciA9IDY7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVwcmVzZW50cyBhIHJlcGVhdGVkIGBWYWx1ZWAuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuTGlzdFZhbHVlIExpc3RWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4ga2luZENhc2VfID09IEtpbmRPbmVvZkNhc2UuTGlzdFZhbHVlID8gKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkxpc3RWYWx1ZSkga2luZF8gOiBudWxsOyB9Ci0gICAgICBzZXQgewotICAgICAgICBraW5kXyA9IHZhbHVlOwotICAgICAgICBraW5kQ2FzZV8gPSB2YWx1ZSA9PSBudWxsID8gS2luZE9uZW9mQ2FzZS5Ob25lIDogS2luZE9uZW9mQ2FzZS5MaXN0VmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBvYmplY3Qga2luZF87Ci0gICAgLy8vIDxzdW1tYXJ5PkVudW0gb2YgcG9zc2libGUgY2FzZXMgZm9yIHRoZSAia2luZCIgb25lb2YuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBlbnVtIEtpbmRPbmVvZkNhc2UgewotICAgICAgTm9uZSA9IDAsCi0gICAgICBOdWxsVmFsdWUgPSAxLAotICAgICAgTnVtYmVyVmFsdWUgPSAyLAotICAgICAgU3RyaW5nVmFsdWUgPSAzLAotICAgICAgQm9vbFZhbHVlID0gNCwKLSAgICAgIFN0cnVjdFZhbHVlID0gNSwKLSAgICAgIExpc3RWYWx1ZSA9IDYsCi0gICAgfQotICAgIHByaXZhdGUgS2luZE9uZW9mQ2FzZSBraW5kQ2FzZV8gPSBLaW5kT25lb2ZDYXNlLk5vbmU7Ci0gICAgcHVibGljIEtpbmRPbmVvZkNhc2UgS2luZENhc2UgewotICAgICAgZ2V0IHsgcmV0dXJuIGtpbmRDYXNlXzsgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIENsZWFyS2luZCgpIHsKLSAgICAgIGtpbmRDYXNlXyA9IEtpbmRPbmVvZkNhc2UuTm9uZTsKLSAgICAgIGtpbmRfID0gbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVmFsdWUgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKE51bGxWYWx1ZSAhPSBvdGhlci5OdWxsVmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChOdW1iZXJWYWx1ZSAhPSBvdGhlci5OdW1iZXJWYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFN0cmluZ1ZhbHVlICE9IG90aGVyLlN0cmluZ1ZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoQm9vbFZhbHVlICE9IG90aGVyLkJvb2xWYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFN0cnVjdFZhbHVlLCBvdGhlci5TdHJ1Y3RWYWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhMaXN0VmFsdWUsIG90aGVyLkxpc3RWYWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChLaW5kQ2FzZSAhPSBvdGhlci5LaW5kQ2FzZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5OdWxsVmFsdWUpIGhhc2ggXj0gTnVsbFZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoa2luZENhc2VfID09IEtpbmRPbmVvZkNhc2UuTnVtYmVyVmFsdWUpIGhhc2ggXj0gTnVtYmVyVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5TdHJpbmdWYWx1ZSkgaGFzaCBePSBTdHJpbmdWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLkJvb2xWYWx1ZSkgaGFzaCBePSBCb29sVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5TdHJ1Y3RWYWx1ZSkgaGFzaCBePSBTdHJ1Y3RWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLkxpc3RWYWx1ZSkgaGFzaCBePSBMaXN0VmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gKGludCkga2luZENhc2VfOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoa2luZENhc2VfID09IEtpbmRPbmVvZkNhc2UuTnVsbFZhbHVlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBOdWxsVmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLk51bWJlclZhbHVlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNyk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZURvdWJsZShOdW1iZXJWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoa2luZENhc2VfID09IEtpbmRPbmVvZkNhc2UuU3RyaW5nVmFsdWUpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDI2KTsKLSAgICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKFN0cmluZ1ZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGlmIChraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5Cb29sVmFsdWUpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDMyKTsKLSAgICAgICAgb3V0cHV0LldyaXRlQm9vbChCb29sVmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLlN0cnVjdFZhbHVlKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0Mik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU3RydWN0VmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLkxpc3RWYWx1ZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTApOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKExpc3RWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLk51bGxWYWx1ZSkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKChpbnQpIE51bGxWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoa2luZENhc2VfID09IEtpbmRPbmVvZkNhc2UuTnVtYmVyVmFsdWUpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgODsKLSAgICAgIH0KLSAgICAgIGlmIChraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5TdHJpbmdWYWx1ZSkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoU3RyaW5nVmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLkJvb2xWYWx1ZSkgewotICAgICAgICBzaXplICs9IDEgKyAxOwotICAgICAgfQotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLlN0cnVjdFZhbHVlKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoU3RydWN0VmFsdWUpOwotICAgICAgfQotICAgICAgaWYgKGtpbmRDYXNlXyA9PSBLaW5kT25lb2ZDYXNlLkxpc3RWYWx1ZSkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKExpc3RWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVmFsdWUgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAob3RoZXIuS2luZENhc2UpIHsKLSAgICAgICAgY2FzZSBLaW5kT25lb2ZDYXNlLk51bGxWYWx1ZToKLSAgICAgICAgICBOdWxsVmFsdWUgPSBvdGhlci5OdWxsVmFsdWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2luZE9uZW9mQ2FzZS5OdW1iZXJWYWx1ZToKLSAgICAgICAgICBOdW1iZXJWYWx1ZSA9IG90aGVyLk51bWJlclZhbHVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEtpbmRPbmVvZkNhc2UuU3RyaW5nVmFsdWU6Ci0gICAgICAgICAgU3RyaW5nVmFsdWUgPSBvdGhlci5TdHJpbmdWYWx1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBLaW5kT25lb2ZDYXNlLkJvb2xWYWx1ZToKLSAgICAgICAgICBCb29sVmFsdWUgPSBvdGhlci5Cb29sVmFsdWU7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgS2luZE9uZW9mQ2FzZS5TdHJ1Y3RWYWx1ZToKLSAgICAgICAgICBTdHJ1Y3RWYWx1ZSA9IG90aGVyLlN0cnVjdFZhbHVlOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEtpbmRPbmVvZkNhc2UuTGlzdFZhbHVlOgotICAgICAgICAgIExpc3RWYWx1ZSA9IG90aGVyLkxpc3RWYWx1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAga2luZF8gPSBpbnB1dC5SZWFkRW51bSgpOwotICAgICAgICAgICAga2luZENhc2VfID0gS2luZE9uZW9mQ2FzZS5OdWxsVmFsdWU7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNzogewotICAgICAgICAgICAgTnVtYmVyVmFsdWUgPSBpbnB1dC5SZWFkRG91YmxlKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjogewotICAgICAgICAgICAgU3RyaW5nVmFsdWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzMjogewotICAgICAgICAgICAgQm9vbFZhbHVlID0gaW5wdXQuUmVhZEJvb2woKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDQyOiB7Ci0gICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3Qgc3ViQnVpbGRlciA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3QoKTsKLSAgICAgICAgICAgIGlmIChraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5TdHJ1Y3RWYWx1ZSkgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyLk1lcmdlRnJvbShTdHJ1Y3RWYWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpbnB1dC5SZWFkTWVzc2FnZShzdWJCdWlsZGVyKTsKLSAgICAgICAgICAgIFN0cnVjdFZhbHVlID0gc3ViQnVpbGRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOiB7Ci0gICAgICAgICAgICBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5MaXN0VmFsdWUgc3ViQnVpbGRlciA9IG5ldyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5MaXN0VmFsdWUoKTsKLSAgICAgICAgICAgIGlmIChraW5kQ2FzZV8gPT0gS2luZE9uZW9mQ2FzZS5MaXN0VmFsdWUpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5NZXJnZUZyb20oTGlzdFZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LlJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIpOwotICAgICAgICAgICAgTGlzdFZhbHVlID0gc3ViQnVpbGRlcjsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIGBMaXN0VmFsdWVgIGlzIGEgd3JhcHBlciBhcm91bmQgYSByZXBlYXRlZCBmaWVsZCBvZiB2YWx1ZXMuCi0gIC8vLwotICAvLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgTGlzdFZhbHVlYCBpcyBKU09OIGFycmF5LgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgTGlzdFZhbHVlIDogcGI6OklNZXNzYWdlPExpc3RWYWx1ZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPExpc3RWYWx1ZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxMaXN0VmFsdWU+KCgpID0+IG5ldyBMaXN0VmFsdWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxMaXN0VmFsdWU+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJ1Y3RSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzJdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBMaXN0VmFsdWUoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIExpc3RWYWx1ZShMaXN0VmFsdWUgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHZhbHVlc18gPSBvdGhlci52YWx1ZXNfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIExpc3RWYWx1ZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgTGlzdFZhbHVlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidmFsdWVzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBWYWx1ZXNGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVmFsdWU+IF9yZXBlYXRlZF92YWx1ZXNfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDEwLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZS5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlPiB2YWx1ZXNfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5WYWx1ZT4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBSZXBlYXRlZCBmaWVsZCBvZiBkeW5hbWljYWxseSB0eXBlZCB2YWx1ZXMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlZhbHVlPiBWYWx1ZXMgewotICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlc187IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIExpc3RWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKExpc3RWYWx1ZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZighdmFsdWVzXy5FcXVhbHMob3RoZXIudmFsdWVzXykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBoYXNoIF49IHZhbHVlc18uR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgdmFsdWVzXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX3ZhbHVlc19jb2RlYyk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgc2l6ZSArPSB2YWx1ZXNfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX3ZhbHVlc19jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oTGlzdFZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB2YWx1ZXNfLkFkZChvdGhlci52YWx1ZXNfKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICB2YWx1ZXNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfdmFsdWVzX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1RpbWVFeHRlbnNpb25zLmNzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvVGltZUV4dGVuc2lvbnMuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRkNDg1ZDMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvVGltZUV4dGVuc2lvbnMuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi11c2luZyBTeXN0ZW07Ci11c2luZyBTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLXVzaW5nIFN5c3RlbS5MaW5xOwotdXNpbmcgU3lzdGVtLlRleHQ7Ci11c2luZyBTeXN0ZW0uVGhyZWFkaW5nLlRhc2tzOwotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBFeHRlbnNpb24gbWV0aG9kcyBvbiBCQ0wgdGltZS1yZWxhdGVkIHR5cGVzLCBjb252ZXJ0aW5nIHRvIHByb3RvYnVmIHR5cGVzLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBjbGFzcyBUaW1lRXh0ZW5zaW9ucwotICAgIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVydHMgdGhlIGdpdmVuIDxzZWUgY3JlZj0iRGF0ZVRpbWUiLz4gdG8gYSA8c2VlIGNyZWY9IlRpbWVzdGFtcCIvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRlVGltZSI+VGhlIGRhdGUgYW5kIHRpbWUgdG8gY29udmVydCB0byBhIHRpbWVzdGFtcC48L3BhcmFtPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJBcmd1bWVudEV4Y2VwdGlvbiI+VGhlIDxwYXJhbXJlZiBuYW1lPSJkYXRlVGltZSIvPiB2YWx1ZSBoYXMgYSA8c2VlIGNyZWY9IkRhdGVUaW1lLktpbmQiLz5vdGhlciB0aGFuIDxjPlV0YzwvYz4uPC9leGNlcHRpb24+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgY29udmVydGVkIHRpbWVzdGFtcC48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZXN0YW1wIFRvVGltZXN0YW1wKHRoaXMgRGF0ZVRpbWUgZGF0ZVRpbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUaW1lc3RhbXAuRnJvbURhdGVUaW1lKGRhdGVUaW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlcnRzIHRoZSBnaXZlbiA8c2VlIGNyZWY9IkRhdGVUaW1lT2Zmc2V0Ii8+IHRvIGEgPHNlZSBjcmVmPSJUaW1lc3RhbXAiLz4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPlRoZSBvZmZzZXQgaXMgdGFrZW4gaW50byBjb25zaWRlcmF0aW9uIHdoZW4gY29udmVydGluZyB0aGUgdmFsdWUgKHNvIHRoZSBzYW1lIGluc3RhbnQgaW4gdGltZQotICAgICAgICAvLy8gaXMgcmVwcmVzZW50ZWQpIGJ1dCBpcyBub3QgYSBzZXBhcmF0ZSBwYXJ0IG9mIHRoZSByZXN1bHRpbmcgdmFsdWUuIEluIG90aGVyIHdvcmRzLCB0aGVyZSBpcyBubwotICAgICAgICAvLy8gcm91bmR0cmlwIG9wZXJhdGlvbiB0byByZXRyaWV2ZSB0aGUgb3JpZ2luYWwgPGM+RGF0ZVRpbWVPZmZzZXQ8L2M+LjwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRlVGltZU9mZnNldCI+VGhlIGRhdGUgYW5kIHRpbWUgKHdpdGggVVRDIG9mZnNldCkgdG8gY29udmVydCB0byBhIHRpbWVzdGFtcC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvbnZlcnRlZCB0aW1lc3RhbXAuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIFRpbWVzdGFtcCBUb1RpbWVzdGFtcCh0aGlzIERhdGVUaW1lT2Zmc2V0IGRhdGVUaW1lT2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gVGltZXN0YW1wLkZyb21EYXRlVGltZU9mZnNldChkYXRlVGltZU9mZnNldCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gPHNlZSBjcmVmPSJUaW1lU3BhbiIvPiB0byBhIDxzZWUgY3JlZj0iRHVyYXRpb24iLz4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idGltZVNwYW4iPlRoZSB0aW1lIHNwYW4gdG8gY29udmVydC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvbnZlcnRlZCBkdXJhdGlvbi48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gVG9EdXJhdGlvbih0aGlzIFRpbWVTcGFuIHRpbWVTcGFuKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gRHVyYXRpb24uRnJvbVRpbWVTcGFuKHRpbWVTcGFuKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1RpbWVzdGFtcC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1RpbWVzdGFtcC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDUzYjg4Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9UaW1lc3RhbXAuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bwotI3ByYWdtYSB3YXJuaW5nIGRpc2FibGUgMTU5MSwgMDYxMiwgMzAyMQotI3JlZ2lvbiBEZXNpZ25lciBnZW5lcmF0ZWQgY29kZQotCi11c2luZyBwYiA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmOwotdXNpbmcgcGJjID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuQ29sbGVjdGlvbnM7Ci11c2luZyBwYnIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uOwotdXNpbmcgc2NnID0gZ2xvYmFsOjpTeXN0ZW0uQ29sbGVjdGlvbnMuR2VuZXJpYzsKLW5hbWVzcGFjZSBHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMgewotCi0gIC8vLyA8c3VtbWFyeT5Ib2xkZXIgZm9yIHJlZmxlY3Rpb24gaW5mb3JtYXRpb24gZ2VuZXJhdGVkIGZyb20gZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bzwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHN0YXRpYyBwYXJ0aWFsIGNsYXNzIFRpbWVzdGFtcFJlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bzwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGVzY3JpcHRvcjsgfQotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICBzdGF0aWMgVGltZXN0YW1wUmVmbGVjdGlvbigpIHsKLSAgICAgIGJ5dGVbXSBkZXNjcmlwdG9yRGF0YSA9IGdsb2JhbDo6U3lzdGVtLkNvbnZlcnQuRnJvbUJhc2U2NFN0cmluZygKLSAgICAgICAgICBzdHJpbmcuQ29uY2F0KAotICAgICAgICAgICAgIkNoOW5iMjluYkdVdmNISnZkRzlpZFdZdmRHbHRaWE4wWVcxd0xuQnliM1J2RWc5bmIyOW5iR1V1Y0hKdiIsCi0gICAgICAgICAgICAiZEc5aWRXWWlLd29KVkdsdFpYTjBZVzF3RWc4S0IzTmxZMjl1WkhNWUFTQUJLQU1TRFFvRmJtRnViM01ZIiwKLSAgICAgICAgICAgICJBaUFCS0FWQ2dRRUtFMk52YlM1bmIyOW5iR1V1Y0hKdmRHOWlkV1pDRGxScGJXVnpkR0Z0Y0ZCeWIzUnYiLAotICAgICAgICAgICAgIlVBRmFLMmRwZEdoMVlpNWpiMjB2WjI5c1lXNW5MM0J5YjNSdlluVm1MM0IwZVhCbGN5OTBhVzFsYzNSaCIsCi0gICAgICAgICAgICAiYlhDZ0FRSDRBUUdpQWdOSFVFS3FBaDVIYjI5bmJHVXVVSEp2ZEc5aWRXWXVWMlZzYkV0dWIzZHVWSGx3IiwKLSAgICAgICAgICAgICJaWE5pQm5CeWIzUnZNdz09IikpOwotICAgICAgZGVzY3JpcHRvciA9IHBicjo6RmlsZURlc2NyaXB0b3IuRnJvbUdlbmVyYXRlZENvZGUoZGVzY3JpcHRvckRhdGEsCi0gICAgICAgICAgbmV3IHBicjo6RmlsZURlc2NyaXB0b3JbXSB7IH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obnVsbCwgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm9bXSB7Ci0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVGltZXN0YW1wLlBhcnNlciwgbmV3W117ICJTZWNvbmRzIiwgIk5hbm9zIiB9LCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgIH0pKTsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgQSBUaW1lc3RhbXAgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW5kZXBlbmRlbnQgb2YgYW55IHRpbWUgem9uZQotICAvLy8gIG9yIGNhbGVuZGFyLCByZXByZXNlbnRlZCBhcyBzZWNvbmRzIGFuZCBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBhdAotICAvLy8gIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBpbiBVVEMgRXBvY2ggdGltZS4gSXQgaXMgZW5jb2RlZCB1c2luZyB0aGUKLSAgLy8vICBQcm9sZXB0aWMgR3JlZ29yaWFuIENhbGVuZGFyIHdoaWNoIGV4dGVuZHMgdGhlIEdyZWdvcmlhbiBjYWxlbmRhcgotICAvLy8gIGJhY2t3YXJkcyB0byB5ZWFyIG9uZS4gSXQgaXMgZW5jb2RlZCBhc3N1bWluZyBhbGwgbWludXRlcyBhcmUgNjAKLSAgLy8vICBzZWNvbmRzIGxvbmcsIGkuZS4gbGVhcCBzZWNvbmRzIGFyZSAic21lYXJlZCIgc28gdGhhdCBubyBsZWFwIHNlY29uZAotICAvLy8gIHRhYmxlIGlzIG5lZWRlZCBmb3IgaW50ZXJwcmV0YXRpb24uIFJhbmdlIGlzIGZyb20KLSAgLy8vICAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVouCi0gIC8vLyAgQnkgcmVzdHJpY3RpbmcgdG8gdGhhdCByYW5nZSwgd2UgZW5zdXJlIHRoYXQgd2UgY2FuIGNvbnZlcnQgdG8KLSAgLy8vICBhbmQgZnJvbSAgUkZDIDMzMzkgZGF0ZSBzdHJpbmdzLgotICAvLy8gIFNlZSBbaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpLgotICAvLy8KLSAgLy8vICBFeGFtcGxlIDE6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gUE9TSVggYHRpbWUoKWAuCi0gIC8vLwotICAvLy8gICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwotICAvLy8gICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModGltZShOVUxMKSk7Ci0gIC8vLyAgICAgIHRpbWVzdGFtcC5zZXRfbmFub3MoMCk7Ci0gIC8vLwotICAvLy8gIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgZ2V0dGltZW9mZGF5KClgLgotICAvLy8KLSAgLy8vICAgICAgc3RydWN0IHRpbWV2YWwgdHY7Ci0gIC8vLyAgICAgIGdldHRpbWVvZmRheSgmYW1wO3R2LCBOVUxMKTsKLSAgLy8vCi0gIC8vLyAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXA7Ci0gIC8vLyAgICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcyh0di50dl9zZWMpOwotICAvLy8gICAgICB0aW1lc3RhbXAuc2V0X25hbm9zKHR2LnR2X3VzZWMgKiAxMDAwKTsKLSAgLy8vCi0gIC8vLyAgRXhhbXBsZSAzOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFdpbjMyIGBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgpYC4KLSAgLy8vCi0gIC8vLyAgICAgIEZJTEVUSU1FIGZ0OwotICAvLy8gICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmYW1wO2Z0KTsKLSAgLy8vICAgICAgVUlOVDY0IHRpY2tzID0gKCgoVUlOVDY0KWZ0LmR3SGlnaERhdGVUaW1lKSAmbHQ7Jmx0OyAzMikgfCBmdC5kd0xvd0RhdGVUaW1lOwotICAvLy8KLSAgLy8vICAgICAgLy8gQSBXaW5kb3dzIHRpY2sgaXMgMTAwIG5hbm9zZWNvbmRzLiBXaW5kb3dzIGVwb2NoIDE2MDEtMDEtMDFUMDA6MDA6MDBaCi0gIC8vLyAgICAgIC8vIGlzIDExNjQ0NDczNjAwIHNlY29uZHMgYmVmb3JlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouCi0gIC8vLyAgICAgIFRpbWVzdGFtcCB0aW1lc3RhbXA7Ci0gIC8vLyAgICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcygoSU5UNjQpICgodGlja3MgLyAxMDAwMDAwMCkgLSAxMTY0NDQ3MzYwMExMKSk7Ci0gIC8vLyAgICAgIHRpbWVzdGFtcC5zZXRfbmFub3MoKElOVDMyKSAoKHRpY2tzICUgMTAwMDAwMDApICogMTAwKSk7Ci0gIC8vLwotICAvLy8gIEV4YW1wbGUgNDogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBKYXZhIGBTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKWAuCi0gIC8vLwotICAvLy8gICAgICBsb25nIG1pbGxpcyA9IFN5c3RlbS5jdXJyZW50VGltZU1pbGxpcygpOwotICAvLy8KLSAgLy8vICAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0U2Vjb25kcyhtaWxsaXMgLyAxMDAwKQotICAvLy8gICAgICAgICAgLnNldE5hbm9zKChpbnQpICgobWlsbGlzICUgMTAwMCkgKiAxMDAwMDAwKSkuYnVpbGQoKTsKLSAgLy8vCi0gIC8vLyAgRXhhbXBsZSA1OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIGN1cnJlbnQgdGltZSBpbiBQeXRob24uCi0gIC8vLwotICAvLy8gICAgICBub3cgPSB0aW1lLnRpbWUoKQotICAvLy8gICAgICBzZWNvbmRzID0gaW50KG5vdykKLSAgLy8vICAgICAgbmFub3MgPSBpbnQoKG5vdyAtIHNlY29uZHMpICogMTAqKjkpCi0gIC8vLyAgICAgIHRpbWVzdGFtcCA9IFRpbWVzdGFtcChzZWNvbmRzPXNlY29uZHMsIG5hbm9zPW5hbm9zKQotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVGltZXN0YW1wIDogcGI6OklNZXNzYWdlPFRpbWVzdGFtcD4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPFRpbWVzdGFtcD4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxUaW1lc3RhbXA+KCgpID0+IG5ldyBUaW1lc3RhbXAoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxUaW1lc3RhbXA+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UaW1lc3RhbXBSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUaW1lc3RhbXAoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIFRpbWVzdGFtcChUaW1lc3RhbXAgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHNlY29uZHNfID0gb3RoZXIuc2Vjb25kc187Ci0gICAgICBuYW5vc18gPSBvdGhlci5uYW5vc187Ci0gICAgfQotCi0gICAgcHVibGljIFRpbWVzdGFtcCBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgVGltZXN0YW1wKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic2Vjb25kcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU2Vjb25kc0ZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGxvbmcgc2Vjb25kc187Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUmVwcmVzZW50cyBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2gKLSAgICAvLy8gIDE5NzAtMDEtMDFUMDA6MDA6MDBaLiBNdXN0IGJlIGZyb20gZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0bwotICAgIC8vLyAgOTk5OS0xMi0zMVQyMzo1OTo1OVogaW5jbHVzaXZlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGxvbmcgU2Vjb25kcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gc2Vjb25kc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNlY29uZHNfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW5vcyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFub3NGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBpbnQgbmFub3NfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIE5vbi1uZWdhdGl2ZSBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZCByZXNvbHV0aW9uLiBOZWdhdGl2ZQotICAgIC8vLyAgc2Vjb25kIHZhbHVlcyB3aXRoIGZyYWN0aW9ucyBtdXN0IHN0aWxsIGhhdmUgbm9uLW5lZ2F0aXZlIG5hbm9zIHZhbHVlcwotICAgIC8vLyAgdGhhdCBjb3VudCBmb3J3YXJkIGluIHRpbWUuIE11c3QgYmUgZnJvbSAwIHRvIDk5OSw5OTksOTk5Ci0gICAgLy8vICBpbmNsdXNpdmUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50IE5hbm9zIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW5vc187IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbm9zXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgVGltZXN0YW1wKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVGltZXN0YW1wIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChTZWNvbmRzICE9IG90aGVyLlNlY29uZHMpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChOYW5vcyAhPSBvdGhlci5OYW5vcykgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChTZWNvbmRzICE9IDBMKSBoYXNoIF49IFNlY29uZHMuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmIChOYW5vcyAhPSAwKSBoYXNoIF49IE5hbm9zLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChTZWNvbmRzICE9IDBMKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50NjQoU2Vjb25kcyk7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFub3MgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihOYW5vcyk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKFNlY29uZHMgIT0gMEwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQ2NFNpemUoU2Vjb25kcyk7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFub3MgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUludDMyU2l6ZShOYW5vcyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVGltZXN0YW1wIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuU2Vjb25kcyAhPSAwTCkgewotICAgICAgICBTZWNvbmRzID0gb3RoZXIuU2Vjb25kczsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OYW5vcyAhPSAwKSB7Ci0gICAgICAgIE5hbm9zID0gb3RoZXIuTmFub3M7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBTZWNvbmRzID0gaW5wdXQuUmVhZEludDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgTmFub3MgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1RpbWVzdGFtcFBhcnRpYWwuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9UaW1lc3RhbXBQYXJ0aWFsLmNzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYTQwMzQ3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1RpbWVzdGFtcFBhcnRpYWwuY3MKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotdXNpbmcgU3lzdGVtOwotdXNpbmcgU3lzdGVtLkdsb2JhbGl6YXRpb247Ci11c2luZyBTeXN0ZW0uVGV4dDsKLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcwotewotICAgIHB1YmxpYyBwYXJ0aWFsIGNsYXNzIFRpbWVzdGFtcCA6IElDdXN0b21EaWFnbm9zdGljTWVzc2FnZQotICAgIHsKLSAgICAgICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgRGF0ZVRpbWUgVW5peEVwb2NoID0gbmV3IERhdGVUaW1lKDE5NzAsIDEsIDEsIDAsIDAsIDAsIERhdGVUaW1lS2luZC5VdGMpOwotICAgICAgICAvLyBDb25zdGFudHMgZGV0ZXJtaW5lZCBwcm9ncmFtbWF0aWNhbGx5LCBidXQgdGhlbiBoYXJkLWNvZGVkIHNvIHRoZXkgY2FuIGJlIGNvbnN0YW50IGV4cHJlc3Npb25zLgotICAgICAgICBwcml2YXRlIGNvbnN0IGxvbmcgQmNsU2Vjb25kc0F0VW5peEVwb2NoID0gNjIxMzU1OTY4MDA7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IGxvbmcgVW5peFNlY29uZHNBdEJjbE1heFZhbHVlID0gMjUzNDAyMzAwNzk5OwotICAgICAgICBpbnRlcm5hbCBjb25zdCBsb25nIFVuaXhTZWNvbmRzQXRCY2xNaW5WYWx1ZSA9IC1CY2xTZWNvbmRzQXRVbml4RXBvY2g7Ci0gICAgICAgIGludGVybmFsIGNvbnN0IGludCBNYXhOYW5vcyA9IER1cmF0aW9uLk5hbm9zZWNvbmRzUGVyU2Vjb25kIC0gMTsKLQotICAgICAgICBwcml2YXRlIHN0YXRpYyBib29sIElzTm9ybWFsaXplZChsb25nIHNlY29uZHMsIGludCBuYW5vc2Vjb25kcykgPT4KLSAgICAgICAgICAgIG5hbm9zZWNvbmRzID49IDAgJiYKLSAgICAgICAgICAgIG5hbm9zZWNvbmRzIDw9IE1heE5hbm9zICYmCi0gICAgICAgICAgICBzZWNvbmRzID49IFVuaXhTZWNvbmRzQXRCY2xNaW5WYWx1ZSAmJgotICAgICAgICAgICAgc2Vjb25kcyA8PSBVbml4U2Vjb25kc0F0QmNsTWF4VmFsdWU7Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gUmV0dXJucyB0aGUgZGlmZmVyZW5jZSBiZXR3ZWVuIG9uZSA8c2VlIGNyZWY9IlRpbWVzdGFtcCIvPiBhbmQgYW5vdGhlciwgYXMgYSA8c2VlIGNyZWY9IkR1cmF0aW9uIi8+LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9ImxocyI+VGhlIHRpbWVzdGFtcCB0byBzdWJ0cmFjdCBmcm9tLiBNdXN0IG5vdCBiZSBudWxsLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmhzIj5UaGUgdGltZXN0YW1wIHRvIHN1YnRyYWN0LiBNdXN0IG5vdCBiZSBudWxsLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGUgZGlmZmVyZW5jZSBiZXR3ZWVuIHRoZSB0d28gc3BlY2lmaWVkIHRpbWVzdGFtcHMuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIG9wZXJhdG9yIC0oVGltZXN0YW1wIGxocywgVGltZXN0YW1wIHJocykKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChsaHMsICJsaHMiKTsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwocmhzLCAicmhzIik7Ci0gICAgICAgICAgICBjaGVja2VkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIER1cmF0aW9uLk5vcm1hbGl6ZShsaHMuU2Vjb25kcyAtIHJocy5TZWNvbmRzLCBsaHMuTmFub3MgLSByaHMuTmFub3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQWRkcyBhIDxzZWUgY3JlZj0iRHVyYXRpb24iLz4gdG8gYSA8c2VlIGNyZWY9IlRpbWVzdGFtcCIvPiwgdG8gb2J0YWluIGFub3RoZXIgPGM+VGltZXN0YW1wPC9jPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJsaHMiPlRoZSB0aW1lc3RhbXAgdG8gYWRkIHRoZSBkdXJhdGlvbiB0by4gTXVzdCBub3QgYmUgbnVsbC48L3BhcmFtPgotICAgICAgICAvLy8gPHBhcmFtIG5hbWU9InJocyI+VGhlIGR1cmF0aW9uIHRvIGFkZC4gTXVzdCBub3QgYmUgbnVsbC48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIHJlc3VsdCBvZiBhZGRpbmcgdGhlIGR1cmF0aW9uIHRvIHRoZSB0aW1lc3RhbXAuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIFRpbWVzdGFtcCBvcGVyYXRvciArKFRpbWVzdGFtcCBsaHMsIER1cmF0aW9uIHJocykKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChsaHMsICJsaHMiKTsKLSAgICAgICAgICAgIFByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwocmhzLCAicmhzIik7Ci0gICAgICAgICAgICBjaGVja2VkCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIE5vcm1hbGl6ZShsaHMuU2Vjb25kcyArIHJocy5TZWNvbmRzLCBsaHMuTmFub3MgKyByaHMuTmFub3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gU3VidHJhY3RzIGEgPHNlZSBjcmVmPSJEdXJhdGlvbiIvPiBmcm9tIGEgPHNlZSBjcmVmPSJUaW1lc3RhbXAiLz4sIHRvIG9idGFpbiBhbm90aGVyIDxjPlRpbWVzdGFtcDwvYz4uCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibGhzIj5UaGUgdGltZXN0YW1wIHRvIHN1YnRyYWN0IHRoZSBkdXJhdGlvbiBmcm9tLiBNdXN0IG5vdCBiZSBudWxsLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0icmhzIj5UaGUgZHVyYXRpb24gdG8gc3VidHJhY3QuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSByZXN1bHQgb2Ygc3VidHJhY3RpbmcgdGhlIGR1cmF0aW9uIGZyb20gdGhlIHRpbWVzdGFtcC48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVGltZXN0YW1wIG9wZXJhdG9yIC0oVGltZXN0YW1wIGxocywgRHVyYXRpb24gcmhzKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKGxocywgImxocyIpOwotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbChyaHMsICJyaHMiKTsKLSAgICAgICAgICAgIGNoZWNrZWQKLSAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gTm9ybWFsaXplKGxocy5TZWNvbmRzIC0gcmhzLlNlY29uZHMsIGxocy5OYW5vcyAtIHJocy5OYW5vcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGlzIHRpbWVzdGFtcCBpbnRvIGEgPHNlZSBjcmVmPSJEYXRlVGltZSIvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gVGhlIHJlc3VsdGluZyA8Yz5EYXRlVGltZTwvYz4gd2lsbCBhbHdheXMgaGF2ZSBhIDxjPktpbmQ8L2M+IG9mIDxjPlV0YzwvYz4uCi0gICAgICAgIC8vLyBJZiB0aGUgdGltZXN0YW1wIGlzIG5vdCBhIHByZWNpc2UgbnVtYmVyIG9mIHRpY2tzLCBpdCB3aWxsIGJlIHRydW5jYXRlZCB0b3dhcmRzIHRoZSBzdGFydAotICAgICAgICAvLy8gb2YgdGltZS4gRm9yIGV4YW1wbGUsIGEgdGltZXN0YW1wIHdpdGggYSA8c2VlIGNyZWY9Ik5hbm9zIi8+IHZhbHVlIG9mIDk5IHdpbGwgcmVzdWx0IGluIGEKLSAgICAgICAgLy8vIDxzZWUgY3JlZj0iRGF0ZVRpbWUiLz4gdmFsdWUgcHJlY2lzZWx5IG9uIGEgc2Vjb25kLgotICAgICAgICAvLy8gPC9yZW1hcmtzPgotICAgICAgICAvLy8gPHJldHVybnM+VGhpcyB0aW1lc3RhbXAgYXMgYSA8Yz5EYXRlVGltZTwvYz4uPC9yZXR1cm5zPgotICAgICAgICAvLy8gPGV4Y2VwdGlvbiBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIj5UaGUgdGltZXN0YW1wIGNvbnRhaW5zIGludmFsaWQgdmFsdWVzOyBlaXRoZXIgaXQgaXMKLSAgICAgICAgLy8vIGluY29ycmVjdGx5IG5vcm1hbGl6ZWQgb3IgaXMgb3V0c2lkZSB0aGUgdmFsaWQgcmFuZ2UuPC9leGNlcHRpb24+Ci0gICAgICAgIHB1YmxpYyBEYXRlVGltZSBUb0RhdGVUaW1lKCkKLSAgICAgICAgewotICAgICAgICAgICAgaWYgKCFJc05vcm1hbGl6ZWQoU2Vjb25kcywgTmFub3MpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKEAiVGltZXN0YW1wIGNvbnRhaW5zIGludmFsaWQgdmFsdWVzOiBTZWNvbmRzPXtTZWNvbmRzfTsgTmFub3M9e05hbm9zfSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIFVuaXhFcG9jaC5BZGRTZWNvbmRzKFNlY29uZHMpLkFkZFRpY2tzKE5hbm9zIC8gRHVyYXRpb24uTmFub3NlY29uZHNQZXJUaWNrKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlcnRzIHRoaXMgdGltZXN0YW1wIGludG8gYSA8c2VlIGNyZWY9IkRhdGVUaW1lT2Zmc2V0Ii8+LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+Ci0gICAgICAgIC8vLyBUaGUgcmVzdWx0aW5nIDxjPkRhdGVUaW1lT2Zmc2V0PC9jPiB3aWxsIGFsd2F5cyBoYXZlIGFuIDxjPk9mZnNldDwvYz4gb2YgemVyby4KLSAgICAgICAgLy8vIElmIHRoZSB0aW1lc3RhbXAgaXMgbm90IGEgcHJlY2lzZSBudW1iZXIgb2YgdGlja3MsIGl0IHdpbGwgYmUgdHJ1bmNhdGVkIHRvd2FyZHMgdGhlIHN0YXJ0Ci0gICAgICAgIC8vLyBvZiB0aW1lLiBGb3IgZXhhbXBsZSwgYSB0aW1lc3RhbXAgd2l0aCBhIDxzZWUgY3JlZj0iTmFub3MiLz4gdmFsdWUgb2YgOTkgd2lsbCByZXN1bHQgaW4gYQotICAgICAgICAvLy8gPHNlZSBjcmVmPSJEYXRlVGltZU9mZnNldCIvPiB2YWx1ZSBwcmVjaXNlbHkgb24gYSBzZWNvbmQuCi0gICAgICAgIC8vLyA8L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5UaGlzIHRpbWVzdGFtcCBhcyBhIDxjPkRhdGVUaW1lT2Zmc2V0PC9jPi48L3JldHVybnM+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iPlRoZSB0aW1lc3RhbXAgY29udGFpbnMgaW52YWxpZCB2YWx1ZXM7IGVpdGhlciBpdCBpcwotICAgICAgICAvLy8gaW5jb3JyZWN0bHkgbm9ybWFsaXplZCBvciBpcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZS48L2V4Y2VwdGlvbj4KLSAgICAgICAgcHVibGljIERhdGVUaW1lT2Zmc2V0IFRvRGF0ZVRpbWVPZmZzZXQoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IERhdGVUaW1lT2Zmc2V0KFRvRGF0ZVRpbWUoKSwgVGltZVNwYW4uWmVybyk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGUgc3BlY2lmaWVkIDxzZWUgY3JlZj0iRGF0ZVRpbWUiLz4gdG8gYSA8c2VlIGNyZWY9IlRpbWVzdGFtcCIvPi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJkYXRlVGltZSI+PC9wYXJhbT4KLSAgICAgICAgLy8vIDxleGNlcHRpb24gY3JlZj0iQXJndW1lbnRFeGNlcHRpb24iPlRoZSA8Yz5LaW5kPC9jPiBvZiA8cGFyYW1yZWYgbmFtZT0iZGF0ZVRpbWUiLz4gaXMgbm90IDxjPkRhdGVUaW1lS2luZC5VdGM8L2M+LjwvZXhjZXB0aW9uPgotICAgICAgICAvLy8gPHJldHVybnM+VGhlIGNvbnZlcnRlZCB0aW1lc3RhbXAuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIFRpbWVzdGFtcCBGcm9tRGF0ZVRpbWUoRGF0ZVRpbWUgZGF0ZVRpbWUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChkYXRlVGltZS5LaW5kICE9IERhdGVUaW1lS2luZC5VdGMpCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEFyZ3VtZW50RXhjZXB0aW9uKCJDb252ZXJzaW9uIGZyb20gRGF0ZVRpbWUgdG8gVGltZXN0YW1wIHJlcXVpcmVzIHRoZSBEYXRlVGltZSBraW5kIHRvIGJlIFV0YyIsICJkYXRlVGltZSIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gRG8gdGhlIGFyaXRobWV0aWMgdXNpbmcgRGF0ZVRpbWUuVGlja3MsIHdoaWNoIGlzIGFsd2F5cyBub24tbmVnYXRpdmUsIG1ha2luZyB0aGluZ3Mgc2ltcGxlci4KLSAgICAgICAgICAgIGxvbmcgc2Vjb25kc1NpbmNlQmNsRXBvY2ggPSBkYXRlVGltZS5UaWNrcyAvIFRpbWVTcGFuLlRpY2tzUGVyU2Vjb25kOwotICAgICAgICAgICAgaW50IG5hbm9zZWNvbmRzID0gKGludCkgIChkYXRlVGltZS5UaWNrcyAlIFRpbWVTcGFuLlRpY2tzUGVyU2Vjb25kKSAqIER1cmF0aW9uLk5hbm9zZWNvbmRzUGVyVGljazsKLSAgICAgICAgICAgIHJldHVybiBuZXcgVGltZXN0YW1wIHsgU2Vjb25kcyA9IHNlY29uZHNTaW5jZUJjbEVwb2NoIC0gQmNsU2Vjb25kc0F0VW5peEVwb2NoLCBOYW5vcyA9IG5hbm9zZWNvbmRzIH07Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gPHNlZSBjcmVmPSJEYXRlVGltZU9mZnNldCIvPiB0byBhIDxzZWUgY3JlZj0iVGltZXN0YW1wIi8+Ci0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz5UaGUgb2Zmc2V0IGlzIHRha2VuIGludG8gY29uc2lkZXJhdGlvbiB3aGVuIGNvbnZlcnRpbmcgdGhlIHZhbHVlIChzbyB0aGUgc2FtZSBpbnN0YW50IGluIHRpbWUKLSAgICAgICAgLy8vIGlzIHJlcHJlc2VudGVkKSBidXQgaXMgbm90IGEgc2VwYXJhdGUgcGFydCBvZiB0aGUgcmVzdWx0aW5nIHZhbHVlLiBJbiBvdGhlciB3b3JkcywgdGhlcmUgaXMgbm8KLSAgICAgICAgLy8vIHJvdW5kdHJpcCBvcGVyYXRpb24gdG8gcmV0cmlldmUgdGhlIG9yaWdpbmFsIDxjPkRhdGVUaW1lT2Zmc2V0PC9jPi48L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGF0ZVRpbWVPZmZzZXQiPlRoZSBkYXRlIGFuZCB0aW1lICh3aXRoIFVUQyBvZmZzZXQpIHRvIGNvbnZlcnQgdG8gYSB0aW1lc3RhbXAuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPlRoZSBjb252ZXJ0ZWQgdGltZXN0YW1wLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBUaW1lc3RhbXAgRnJvbURhdGVUaW1lT2Zmc2V0KERhdGVUaW1lT2Zmc2V0IGRhdGVUaW1lT2Zmc2V0KQotICAgICAgICB7Ci0gICAgICAgICAgICAvLyBXZSBkb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IHRoaXMgaGF2aW5nIG5lZ2F0aXZlIHRpY2tzOiBEYXRlVGltZU9mZnNldCBpcyBjb25zdHJhaW5lZCB0byBoYW5kbGUKLSAgICAgICAgICAgIC8vIHZhbHVlcyB3aG9zZSAqVVRDKiB2YWx1ZSBpcyBpbiB0aGUgcmFuZ2Ugb2YgRGF0ZVRpbWUuCi0gICAgICAgICAgICByZXR1cm4gRnJvbURhdGVUaW1lKGRhdGVUaW1lT2Zmc2V0LlV0Y0RhdGVUaW1lKTsKLSAgICAgICAgfQotCi0gICAgICAgIGludGVybmFsIHN0YXRpYyBUaW1lc3RhbXAgTm9ybWFsaXplKGxvbmcgc2Vjb25kcywgaW50IG5hbm9zZWNvbmRzKQotICAgICAgICB7Ci0gICAgICAgICAgICBpbnQgZXh0cmFTZWNvbmRzID0gbmFub3NlY29uZHMgLyBEdXJhdGlvbi5OYW5vc2Vjb25kc1BlclNlY29uZDsKLSAgICAgICAgICAgIHNlY29uZHMgKz0gZXh0cmFTZWNvbmRzOwotICAgICAgICAgICAgbmFub3NlY29uZHMgLT0gZXh0cmFTZWNvbmRzICogRHVyYXRpb24uTmFub3NlY29uZHNQZXJTZWNvbmQ7Ci0KLSAgICAgICAgICAgIGlmIChuYW5vc2Vjb25kcyA8IDApCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgbmFub3NlY29uZHMgKz0gRHVyYXRpb24uTmFub3NlY29uZHNQZXJTZWNvbmQ7Ci0gICAgICAgICAgICAgICAgc2Vjb25kcy0tOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgcmV0dXJuIG5ldyBUaW1lc3RhbXAgeyBTZWNvbmRzID0gc2Vjb25kcywgTmFub3MgPSBuYW5vc2Vjb25kcyB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVydHMgYSB0aW1lc3RhbXAgc3BlY2lmaWVkIGluIHNlY29uZHMvbmFub3NlY29uZHMgdG8gYSBzdHJpbmcuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cmVtYXJrcz4KLSAgICAgICAgLy8vIElmIHRoZSB2YWx1ZSBpcyBhIG5vcm1hbGl6ZWQgZHVyYXRpb24gaW4gdGhlIHJhbmdlIGRlc2NyaWJlZCBpbiA8Yz50aW1lc3RhbXAucHJvdG88L2M+LAotICAgICAgICAvLy8gPHBhcmFtcmVmIG5hbWU9ImRpYWdub3N0aWNPbmx5Ii8+IGlzIGlnbm9yZWQuIE90aGVyd2lzZSwgaWYgdGhlIHBhcmFtZXRlciBpcyA8Yz50cnVlPC9jPiwKLSAgICAgICAgLy8vIGEgSlNPTiBvYmplY3Qgd2l0aCBhIHdhcm5pbmcgaXMgcmV0dXJuZWQ7IGlmIGl0IGlzIDxjPmZhbHNlPC9jPiwgYW4gPHNlZSBjcmVmPSJJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uIi8+IGlzIHRocm93bi4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJzZWNvbmRzIj5TZWNvbmRzIHBvcnRpb24gb2YgdGhlIGR1cmF0aW9uLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0ibmFub3NlY29uZHMiPk5hbm9zZWNvbmRzIHBvcnRpb24gb2YgdGhlIGR1cmF0aW9uLjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0iZGlhZ25vc3RpY09ubHkiPkRldGVybWluZXMgdGhlIGhhbmRsaW5nIG9mIG5vbi1ub3JtYWxpemVkIHZhbHVlczwvcGFyYW0+Ci0gICAgICAgIC8vLyA8ZXhjZXB0aW9uIGNyZWY9IkludmFsaWRPcGVyYXRpb25FeGNlcHRpb24iPlRoZSByZXByZXNlbnRlZCBkdXJhdGlvbiBpcyBpbnZhbGlkLCBhbmQgPHBhcmFtcmVmIG5hbWU9ImRpYWdub3N0aWNPbmx5Ii8+IGlzIDxjPmZhbHNlPC9jPi48L2V4Y2VwdGlvbj4KLSAgICAgICAgaW50ZXJuYWwgc3RhdGljIHN0cmluZyBUb0pzb24obG9uZyBzZWNvbmRzLCBpbnQgbmFub3NlY29uZHMsIGJvb2wgZGlhZ25vc3RpY09ubHkpCi0gICAgICAgIHsKLSAgICAgICAgICAgIGlmIChJc05vcm1hbGl6ZWQoc2Vjb25kcywgbmFub3NlY29uZHMpKQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIC8vIFVzZSAuTkVUJ3MgZm9ybWF0dGluZyBmb3IgdGhlIHZhbHVlIGRvd24gdG8gdGhlIHNlY29uZCwgaW5jbHVkaW5nIGFuIG9wZW5pbmcgZG91YmxlIHF1b3RlIChhcyBpdCdzIGEgc3RyaW5nIHZhbHVlKQotICAgICAgICAgICAgICAgIERhdGVUaW1lIGRhdGVUaW1lID0gVW5peEVwb2NoLkFkZFNlY29uZHMoc2Vjb25kcyk7Ci0gICAgICAgICAgICAgICAgdmFyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCciJyk7Ci0gICAgICAgICAgICAgICAgYnVpbGRlci5BcHBlbmQoZGF0ZVRpbWUuVG9TdHJpbmcoInl5eXknLSdNTSctJ2RkJ1QnSEg6bW06c3MiLCBDdWx0dXJlSW5mby5JbnZhcmlhbnRDdWx0dXJlKSk7Ci0gICAgICAgICAgICAgICAgRHVyYXRpb24uQXBwZW5kTmFub3NlY29uZHMoYnVpbGRlciwgbmFub3NlY29uZHMpOwotICAgICAgICAgICAgICAgIGJ1aWxkZXIuQXBwZW5kKCJaXCIiKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gYnVpbGRlci5Ub1N0cmluZygpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGRpYWdub3N0aWNPbmx5KQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHJldHVybiBzdHJpbmcuRm9ybWF0KEN1bHR1cmVJbmZvLkludmFyaWFudEN1bHR1cmUsCi0gICAgICAgICAgICAgICAgICAgICJ7eyBcIkB3YXJuaW5nXCI6IFwiSW52YWxpZCBUaW1lc3RhbXBcIiwgXCJzZWNvbmRzXCI6IFwiezB9XCIsIFwibmFub3NcIjogezF9IH19IiwKLSAgICAgICAgICAgICAgICAgICAgc2Vjb25kcywKLSAgICAgICAgICAgICAgICAgICAgbmFub3NlY29uZHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZWxzZQotICAgICAgICAgICAgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkT3BlcmF0aW9uRXhjZXB0aW9uKCJOb24tbm9ybWFsaXplZCB0aW1lc3RhbXAgdmFsdWUiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhpcyA8c2VlIGNyZWY9IlRpbWVzdGFtcCIvPiBmb3IgZGlhZ25vc3RpYyBwdXJwb3Nlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPgotICAgICAgICAvLy8gTm9ybWFsbHkgdGhlIHJldHVybmVkIHZhbHVlIHdpbGwgYmUgYSBKU09OIHN0cmluZyB2YWx1ZSAoaW5jbHVkaW5nIGxlYWRpbmcgYW5kIHRyYWlsaW5nIHF1b3RlcykgYnV0Ci0gICAgICAgIC8vLyB3aGVuIHRoZSB2YWx1ZSBpcyBub24tbm9ybWFsaXplZCBvciBvdXQgb2YgcmFuZ2UsIGEgSlNPTiBvYmplY3QgcmVwcmVzZW50YXRpb24gd2lsbCBiZSByZXR1cm5lZAotICAgICAgICAvLy8gaW5zdGVhZCwgaW5jbHVkaW5nIGEgd2FybmluZy4gVGhpcyBpcyB0byBhdm9pZCBleGNlcHRpb25zIGJlaW5nIHRocm93biB3aGVuIHRyeWluZyB0bwotICAgICAgICAvLy8gZGlhZ25vc2UgcHJvYmxlbXMgLSB0aGUgcmVndWxhciBKU09OIGZvcm1hdHRlciB3aWxsIHN0aWxsIHRocm93IGFuIGV4Y2VwdGlvbiBmb3Igbm9uLW5vcm1hbGl6ZWQKLSAgICAgICAgLy8vIHZhbHVlcy4KLSAgICAgICAgLy8vIDwvcmVtYXJrcz4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoaXMgdmFsdWUuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RyaW5nIFRvRGlhZ25vc3RpY1N0cmluZygpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiBUb0pzb24oU2Vjb25kcywgTmFub3MsIHRydWUpOwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvVHlwZS5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1R5cGUuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1N2MyNDYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvVHlwZS5jcworKysgL2Rldi9udWxsCkBAIC0xLDEzNDcgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8KLSNwcmFnbWEgd2FybmluZyBkaXNhYmxlIDE1OTEsIDA2MTIsIDMwMjEKLSNyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKLQotdXNpbmcgcGIgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1ZjsKLXVzaW5nIHBiYyA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLkNvbGxlY3Rpb25zOwotdXNpbmcgcGJyID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbjsKLXVzaW5nIHNjZyA9IGdsb2JhbDo6U3lzdGVtLkNvbGxlY3Rpb25zLkdlbmVyaWM7Ci1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzIHsKLQotICAvLy8gPHN1bW1hcnk+SG9sZGVyIGZvciByZWZsZWN0aW9uIGluZm9ybWF0aW9uIGdlbmVyYXRlZCBmcm9tIGdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZVJlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG88L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0YXRpYyBwYnI6OkZpbGVEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGRlc2NyaXB0b3I7IH0KLSAgICB9Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgc3RhdGljIFR5cGVSZWZsZWN0aW9uKCkgewotICAgICAgYnl0ZVtdIGRlc2NyaXB0b3JEYXRhID0gZ2xvYmFsOjpTeXN0ZW0uQ29udmVydC5Gcm9tQmFzZTY0U3RyaW5nKAotICAgICAgICAgIHN0cmluZy5Db25jYXQoCi0gICAgICAgICAgICAiQ2hwbmIyOW5iR1V2Y0hKdmRHOWlkV1l2ZEhsd1pTNXdjbTkwYnhJUFoyOXZaMnhsTG5CeWIzUnZZblZtIiwKLSAgICAgICAgICAgICJHaGxuYjI5bmJHVXZjSEp2ZEc5aWRXWXZZVzU1TG5CeWIzUnZHaVJuYjI5bmJHVXZjSEp2ZEc5aWRXWXYiLAotICAgICAgICAgICAgImMyOTFjbU5sWDJOdmJuUmxlSFF1Y0hKdmRHOGkxd0VLQkZSNWNHVVNEQW9FYm1GdFpSZ0JJQUVvQ1JJbSIsCi0gICAgICAgICAgICAiQ2dabWFXVnNaSE1ZQWlBREtBc3lGaTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVSbWxsYkdRU0Rnb0diMjVsIiwKLSAgICAgICAgICAgICJiMlp6R0FNZ0F5Z0pFaWdLQjI5d2RHbHZibk1ZQkNBREtBc3lGeTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXUiLAotICAgICAgICAgICAgIlQzQjBhVzl1RWpZS0RuTnZkWEpqWlY5amIyNTBaWGgwR0FVZ0FTZ0xNaDR1WjI5dloyeGxMbkJ5YjNSdiIsCi0gICAgICAgICAgICAiWW5WbUxsTnZkWEpqWlVOdmJuUmxlSFFTSndvR2MzbHVkR0Y0R0FZZ0FTZ09NaGN1WjI5dloyeGxMbkJ5IiwKLSAgICAgICAgICAgICJiM1J2WW5WbUxsTjViblJoZUNMVkJRb0ZSbWxsYkdRU0tRb0VhMmx1WkJnQklBRW9EakliTG1kdmIyZHMiLAotICAgICAgICAgICAgIlpTNXdjbTkwYjJKMVppNUdhV1ZzWkM1TGFXNWtFamNLQzJOaGNtUnBibUZzYVhSNUdBSWdBU2dPTWlJdSIsCi0gICAgICAgICAgICAiWjI5dloyeGxMbkJ5YjNSdlluVm1Ma1pwWld4a0xrTmhjbVJwYm1Gc2FYUjVFZzRLQm01MWJXSmxjaGdEIiwKLSAgICAgICAgICAgICJJQUVvQlJJTUNnUnVZVzFsR0FRZ0FTZ0pFaEFLQ0hSNWNHVmZkWEpzR0FZZ0FTZ0pFaE1LQzI5dVpXOW0iLAotICAgICAgICAgICAgIlgybHVaR1Y0R0FjZ0FTZ0ZFZzRLQm5CaFkydGxaQmdJSUFFb0NCSW9DZ2R2Y0hScGIyNXpHQWtnQXlnTCIsCi0gICAgICAgICAgICAiTWhjdVoyOXZaMnhsTG5CeWIzUnZZblZtTGs5d2RHbHZiaElSQ2dscWMyOXVYMjVoYldVWUNpQUJLQWtTIiwKLSAgICAgICAgICAgICJGUW9OWkdWbVlYVnNkRjkyWVd4MVpSZ0xJQUVvQ1NMSUFnb0VTMmx1WkJJUUNneFVXVkJGWDFWT1MwNVAiLAotICAgICAgICAgICAgIlYwNFFBQklQQ2d0VVdWQkZYMFJQVlVKTVJSQUJFZzRLQ2xSWlVFVmZSa3hQUVZRUUFoSU9DZ3BVV1ZCRiIsCi0gICAgICAgICAgICAiWDBsT1ZEWTBFQU1TRHdvTFZGbFFSVjlWU1U1VU5qUVFCQklPQ2dwVVdWQkZYMGxPVkRNeUVBVVNFQW9NIiwKLSAgICAgICAgICAgICJWRmxRUlY5R1NWaEZSRFkwRUFZU0VBb01WRmxRUlY5R1NWaEZSRE15RUFjU0RRb0pWRmxRUlY5Q1QwOU0iLAotICAgICAgICAgICAgIkVBZ1NEd29MVkZsUVJWOVRWRkpKVGtjUUNSSU9DZ3BVV1ZCRlgwZFNUMVZRRUFvU0VBb01WRmxRUlY5TiIsCi0gICAgICAgICAgICAiUlZOVFFVZEZFQXNTRGdvS1ZGbFFSVjlDV1ZSRlV4QU1FZzhLQzFSWlVFVmZWVWxPVkRNeUVBMFNEUW9KIiwKLSAgICAgICAgICAgICJWRmxRUlY5RlRsVk5FQTRTRVFvTlZGbFFSVjlUUmtsWVJVUXpNaEFQRWhFS0RWUlpVRVZmVTBaSldFVkUiLAotICAgICAgICAgICAgIk5qUVFFQklQQ2d0VVdWQkZYMU5KVGxRek1oQVJFZzhLQzFSWlVFVmZVMGxPVkRZMEVCSWlkQW9MUTJGeSIsCi0gICAgICAgICAgICAiWkdsdVlXeHBkSGtTRndvVFEwRlNSRWxPUVV4SlZGbGZWVTVMVGs5WFRoQUFFaGdLRkVOQlVrUkpUa0ZNIiwKLSAgICAgICAgICAgICJTVlJaWDA5UVZFbFBUa0ZNRUFFU0dBb1VRMEZTUkVsT1FVeEpWRmxmVWtWUlZVbFNSVVFRQWhJWUNoUkQiLAotICAgICAgICAgICAgIlFWSkVTVTVCVEVsVVdWOVNSVkJGUVZSRlJCQURJczRCQ2dSRmJuVnRFZ3dLQkc1aGJXVVlBU0FCS0FrUyIsCi0gICAgICAgICAgICAiTFFvSlpXNTFiWFpoYkhWbEdBSWdBeWdMTWhvdVoyOXZaMnhsTG5CeWIzUnZZblZtTGtWdWRXMVdZV3gxIiwKLSAgICAgICAgICAgICJaUklvQ2dkdmNIUnBiMjV6R0FNZ0F5Z0xNaGN1WjI5dloyeGxMbkJ5YjNSdlluVm1Mazl3ZEdsdmJoSTIiLAotICAgICAgICAgICAgIkNnNXpiM1Z5WTJWZlkyOXVkR1Y0ZEJnRUlBRW9DekllTG1kdmIyZHNaUzV3Y205MGIySjFaaTVUYjNWeSIsCi0gICAgICAgICAgICAiWTJWRGIyNTBaWGgwRWljS0JuTjViblJoZUJnRklBRW9EaklYTG1kdmIyZHNaUzV3Y205MGIySjFaaTVUIiwKLSAgICAgICAgICAgICJlVzUwWVhnaVV3b0pSVzUxYlZaaGJIVmxFZ3dLQkc1aGJXVVlBU0FCS0FrU0Rnb0diblZ0WW1WeUdBSWciLAotICAgICAgICAgICAgIkFTZ0ZFaWdLQjI5d2RHbHZibk1ZQXlBREtBc3lGeTVuYjI5bmJHVXVjSEp2ZEc5aWRXWXVUM0IwYVc5dSIsCi0gICAgICAgICAgICAiSWpzS0JrOXdkR2x2YmhJTUNnUnVZVzFsR0FFZ0FTZ0pFaU1LQlhaaGJIVmxHQUlnQVNnTE1oUXVaMjl2IiwKLSAgICAgICAgICAgICJaMnhsTG5CeWIzUnZZblZtTGtGdWVTb3VDZ1pUZVc1MFlYZ1NFUW9OVTFsT1ZFRllYMUJTVDFSUE1oQUEiLAotICAgICAgICAgICAgIkVoRUtEVk5aVGxSQldGOVFVazlVVHpNUUFVSk1DaE5qYjIwdVoyOXZaMnhsTG5CeWIzUnZZblZtUWdsVSIsCi0gICAgICAgICAgICAiZVhCbFVISnZkRzlRQWFBQkFhSUNBMGRRUXFvQ0hrZHZiMmRzWlM1UWNtOTBiMkoxWmk1WFpXeHNTMjV2IiwKLSAgICAgICAgICAgICJkMjVVZVhCbGMySUdjSEp2ZEc4eiIpKTsKLSAgICAgIGRlc2NyaXB0b3IgPSBwYnI6OkZpbGVEZXNjcmlwdG9yLkZyb21HZW5lcmF0ZWRDb2RlKGRlc2NyaXB0b3JEYXRhLAotICAgICAgICAgIG5ldyBwYnI6OkZpbGVEZXNjcmlwdG9yW10geyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BbnlSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHRSZWZsZWN0aW9uLkRlc2NyaXB0b3IsIH0sCi0gICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8obmV3W10ge3R5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TeW50YXgpLCB9LCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZS5QYXJzZXIsIG5ld1tdeyAiTmFtZSIsICJGaWVsZHMiLCAiT25lb2ZzIiwgIk9wdGlvbnMiLCAiU291cmNlQ29udGV4dCIsICJTeW50YXgiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGQuUGFyc2VyLCBuZXdbXXsgIktpbmQiLCAiQ2FyZGluYWxpdHkiLCAiTnVtYmVyIiwgIk5hbWUiLCAiVHlwZVVybCIsICJPbmVvZkluZGV4IiwgIlBhY2tlZCIsICJPcHRpb25zIiwgIkpzb25OYW1lIiwgIkRlZmF1bHRWYWx1ZSIgfSwgbnVsbCwgbmV3W117IHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZC5UeXBlcy5LaW5kKSwgdHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkLlR5cGVzLkNhcmRpbmFsaXR5KSB9LCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbnVtKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW51bS5QYXJzZXIsIG5ld1tdeyAiTmFtZSIsICJFbnVtdmFsdWUiLCAiT3B0aW9ucyIsICJTb3VyY2VDb250ZXh0IiwgIlN5bnRheCIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW51bVZhbHVlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW51bVZhbHVlLlBhcnNlciwgbmV3W117ICJOYW1lIiwgIk51bWJlciIsICJPcHRpb25zIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24pLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24uUGFyc2VyLCBuZXdbXXsgIk5hbWUiLCAiVmFsdWUiIH0sIG51bGwsIG51bGwsIG51bGwpCi0gICAgICAgICAgfSkpOwotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotICAjcmVnaW9uIEVudW1zCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBUaGUgc3ludGF4IGluIHdoaWNoIGEgcHJvdG9jb2wgYnVmZmVyIGVsZW1lbnQgaXMgZGVmaW5lZC4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgcHVibGljIGVudW0gU3ludGF4IHsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBTeW50YXggYHByb3RvMmAuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlNZTlRBWF9QUk9UTzIiKV0gUHJvdG8yID0gMCwKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBTeW50YXggYHByb3RvM2AuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlNZTlRBWF9QUk9UTzMiKV0gUHJvdG8zID0gMSwKLSAgfQotCi0gICNlbmRyZWdpb24KLQotICAjcmVnaW9uIE1lc3NhZ2VzCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBBIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIHR5cGUuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBUeXBlIDogcGI6OklNZXNzYWdlPFR5cGU+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxUeXBlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPFR5cGU+KCgpID0+IG5ldyBUeXBlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VHlwZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGVSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzBdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBUeXBlKFR5cGUgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87Ci0gICAgICBmaWVsZHNfID0gb3RoZXIuZmllbGRzXy5DbG9uZSgpOwotICAgICAgb25lb2ZzXyA9IG90aGVyLm9uZW9mc18uQ2xvbmUoKTsKLSAgICAgIG9wdGlvbnNfID0gb3RoZXIub3B0aW9uc18uQ2xvbmUoKTsKLSAgICAgIFNvdXJjZUNvbnRleHQgPSBvdGhlci5zb3VyY2VDb250ZXh0XyAhPSBudWxsID8gb3RoZXIuU291cmNlQ29udGV4dC5DbG9uZSgpIDogbnVsbDsKLSAgICAgIHN5bnRheF8gPSBvdGhlci5zeW50YXhfOwotICAgIH0KLQotICAgIHB1YmxpYyBUeXBlIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBUeXBlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBmdWxseSBxdWFsaWZpZWQgbWVzc2FnZSBuYW1lLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBOYW1lIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJmaWVsZHMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEZpZWxkc0ZpZWxkTnVtYmVyID0gMjsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZD4gX3JlcGVhdGVkX2ZpZWxkc19jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMTgsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGQ+IGZpZWxkc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZpZWxkPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBsaXN0IG9mIGZpZWxkcy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGQ+IEZpZWxkcyB7Ci0gICAgICBnZXQgeyByZXR1cm4gZmllbGRzXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib25lb2ZzIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPbmVvZnNGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8c3RyaW5nPiBfcmVwZWF0ZWRfb25lb2ZzX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yU3RyaW5nKDI2KTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxzdHJpbmc+IG9uZW9mc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgbGlzdCBvZiB0eXBlcyBhcHBlYXJpbmcgaW4gYG9uZW9mYCBkZWZpbml0aW9ucyBpbiB0aGlzIHR5cGUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPHN0cmluZz4gT25lb2ZzIHsKLSAgICAgIGdldCB7IHJldHVybiBvbmVvZnNfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25zIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSA0OwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbj4gX3JlcGVhdGVkX29wdGlvbnNfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDM0LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+IG9wdGlvbnNfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIHByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+IE9wdGlvbnMgewotICAgICAgZ2V0IHsgcmV0dXJuIG9wdGlvbnNfOyB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzb3VyY2VfY29udGV4dCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgU291cmNlQ29udGV4dEZpZWxkTnVtYmVyID0gNTsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQgc291cmNlQ29udGV4dF87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIHNvdXJjZSBjb250ZXh0LgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlNvdXJjZUNvbnRleHQgU291cmNlQ29udGV4dCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc291cmNlQ29udGV4dF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHNvdXJjZUNvbnRleHRfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJzeW50YXgiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFN5bnRheEZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN5bnRheCBzeW50YXhfID0gMDsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgc291cmNlIHN5bnRheC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TeW50YXggU3ludGF4IHsKLSAgICAgIGdldCB7IHJldHVybiBzeW50YXhfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzeW50YXhfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBUeXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoVHlwZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZSAhPSBvdGhlci5OYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighZmllbGRzXy5FcXVhbHMob3RoZXIuZmllbGRzXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFvbmVvZnNfLkVxdWFscyhvdGhlci5vbmVvZnNfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIW9wdGlvbnNfLkVxdWFscyhvdGhlci5vcHRpb25zXykpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghb2JqZWN0LkVxdWFscyhTb3VyY2VDb250ZXh0LCBvdGhlci5Tb3VyY2VDb250ZXh0KSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFN5bnRheCAhPSBvdGhlci5TeW50YXgpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IGZpZWxkc18uR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gb25lb2ZzXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBvcHRpb25zXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHNvdXJjZUNvbnRleHRfICE9IG51bGwpIGhhc2ggXj0gU291cmNlQ29udGV4dC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFN5bnRheCAhPSAwKSBoYXNoIF49IFN5bnRheC5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBmaWVsZHNfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfZmllbGRzX2NvZGVjKTsKLSAgICAgIG9uZW9mc18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9vbmVvZnNfY29kZWMpOwotICAgICAgb3B0aW9uc18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9vcHRpb25zX2NvZGVjKTsKLSAgICAgIGlmIChzb3VyY2VDb250ZXh0XyAhPSBudWxsKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0Mik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZU1lc3NhZ2UoU291cmNlQ29udGV4dCk7Ci0gICAgICB9Ci0gICAgICBpZiAoU3ludGF4ICE9IDApIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDQ4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBTeW50YXgpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlU3RyaW5nU2l6ZShOYW1lKTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gZmllbGRzXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9maWVsZHNfY29kZWMpOwotICAgICAgc2l6ZSArPSBvbmVvZnNfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX29uZW9mc19jb2RlYyk7Ci0gICAgICBzaXplICs9IG9wdGlvbnNfLkNhbGN1bGF0ZVNpemUoX3JlcGVhdGVkX29wdGlvbnNfY29kZWMpOwotICAgICAgaWYgKHNvdXJjZUNvbnRleHRfICE9IG51bGwpIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVNZXNzYWdlU2l6ZShTb3VyY2VDb250ZXh0KTsKLSAgICAgIH0KLSAgICAgIGlmIChTeW50YXggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZUVudW1TaXplKChpbnQpIFN5bnRheCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oVHlwZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7Ci0gICAgICB9Ci0gICAgICBmaWVsZHNfLkFkZChvdGhlci5maWVsZHNfKTsKLSAgICAgIG9uZW9mc18uQWRkKG90aGVyLm9uZW9mc18pOwotICAgICAgb3B0aW9uc18uQWRkKG90aGVyLm9wdGlvbnNfKTsKLSAgICAgIGlmIChvdGhlci5zb3VyY2VDb250ZXh0XyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChzb3VyY2VDb250ZXh0XyA9PSBudWxsKSB7Ci0gICAgICAgICAgc291cmNlQ29udGV4dF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIFNvdXJjZUNvbnRleHQuTWVyZ2VGcm9tKG90aGVyLlNvdXJjZUNvbnRleHQpOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlN5bnRheCAhPSAwKSB7Ci0gICAgICAgIFN5bnRheCA9IG90aGVyLlN5bnRheDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBOYW1lID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIGZpZWxkc18uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9maWVsZHNfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIG9uZW9mc18uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9vbmVvZnNfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMzQ6IHsKLSAgICAgICAgICAgIG9wdGlvbnNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA0MjogewotICAgICAgICAgICAgaWYgKHNvdXJjZUNvbnRleHRfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgc291cmNlQ29udGV4dF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc291cmNlQ29udGV4dF8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDg6IHsKLSAgICAgICAgICAgIHN5bnRheF8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3ludGF4KSBpbnB1dC5SZWFkRW51bSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgQSBzaW5nbGUgZmllbGQgb2YgYSBtZXNzYWdlIHR5cGUuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBGaWVsZCA6IHBiOjpJTWVzc2FnZTxGaWVsZD4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEZpZWxkPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEZpZWxkPigoKSA9PiBuZXcgRmllbGQoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxGaWVsZD4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlR5cGVSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzFdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBGaWVsZCgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgRmllbGQoRmllbGQgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIGtpbmRfID0gb3RoZXIua2luZF87Ci0gICAgICBjYXJkaW5hbGl0eV8gPSBvdGhlci5jYXJkaW5hbGl0eV87Ci0gICAgICBudW1iZXJfID0gb3RoZXIubnVtYmVyXzsKLSAgICAgIG5hbWVfID0gb3RoZXIubmFtZV87Ci0gICAgICB0eXBlVXJsXyA9IG90aGVyLnR5cGVVcmxfOwotICAgICAgb25lb2ZJbmRleF8gPSBvdGhlci5vbmVvZkluZGV4XzsKLSAgICAgIHBhY2tlZF8gPSBvdGhlci5wYWNrZWRfOwotICAgICAgb3B0aW9uc18gPSBvdGhlci5vcHRpb25zXy5DbG9uZSgpOwotICAgICAganNvbk5hbWVfID0gb3RoZXIuanNvbk5hbWVfOwotICAgICAgZGVmYXVsdFZhbHVlXyA9IG90aGVyLmRlZmF1bHRWYWx1ZV87Ci0gICAgfQotCi0gICAgcHVibGljIEZpZWxkIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBGaWVsZCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgImtpbmQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IEtpbmRGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZC5UeXBlcy5LaW5kIGtpbmRfID0gMDsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgZmllbGQgdHlwZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5GaWVsZC5UeXBlcy5LaW5kIEtpbmQgewotICAgICAgZ2V0IHsgcmV0dXJuIGtpbmRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBraW5kXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiY2FyZGluYWxpdHkiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IENhcmRpbmFsaXR5RmllbGROdW1iZXIgPSAyOwotICAgIHByaXZhdGUgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGQuVHlwZXMuQ2FyZGluYWxpdHkgY2FyZGluYWxpdHlfID0gMDsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgZmllbGQgY2FyZGluYWxpdHkuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGQuVHlwZXMuQ2FyZGluYWxpdHkgQ2FyZGluYWxpdHkgewotICAgICAgZ2V0IHsgcmV0dXJuIGNhcmRpbmFsaXR5XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgY2FyZGluYWxpdHlfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJudW1iZXIiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE51bWJlckZpZWxkTnVtYmVyID0gMzsKLSAgICBwcml2YXRlIGludCBudW1iZXJfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBmaWVsZCBudW1iZXIuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgaW50IE51bWJlciB7Ci0gICAgICBnZXQgeyByZXR1cm4gbnVtYmVyXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbnVtYmVyXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gNDsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBmaWVsZCBuYW1lLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBOYW1lIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ0eXBlX3VybCIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVHlwZVVybEZpZWxkTnVtYmVyID0gNjsKLSAgICBwcml2YXRlIHN0cmluZyB0eXBlVXJsXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBmaWVsZCB0eXBlIFVSTCwgd2l0aG91dCB0aGUgc2NoZW1lLCBmb3IgbWVzc2FnZSBvciBlbnVtZXJhdGlvbgotICAgIC8vLyAgdHlwZXMuIEV4YW1wbGU6IGAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wImAuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFR5cGVVcmwgewotICAgICAgZ2V0IHsgcmV0dXJuIHR5cGVVcmxfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB0eXBlVXJsXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9uZW9mX2luZGV4IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPbmVvZkluZGV4RmllbGROdW1iZXIgPSA3OwotICAgIHByaXZhdGUgaW50IG9uZW9mSW5kZXhfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBpbmRleCBvZiB0aGUgZmllbGQgdHlwZSBpbiBgVHlwZS5vbmVvZnNgLCBmb3IgbWVzc2FnZSBvciBlbnVtZXJhdGlvbgotICAgIC8vLyAgdHlwZXMuIFRoZSBmaXJzdCB0eXBlIGhhcyBpbmRleCAxOyB6ZXJvIG1lYW5zIHRoZSB0eXBlIGlzIG5vdCBpbiB0aGUgbGlzdC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnQgT25lb2ZJbmRleCB7Ci0gICAgICBnZXQgeyByZXR1cm4gb25lb2ZJbmRleF87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG9uZW9mSW5kZXhfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJwYWNrZWQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFBhY2tlZEZpZWxkTnVtYmVyID0gODsKLSAgICBwcml2YXRlIGJvb2wgcGFja2VkXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBXaGV0aGVyIHRvIHVzZSBhbHRlcm5hdGl2ZSBwYWNrZWQgd2lyZSByZXByZXNlbnRhdGlvbi4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBib29sIFBhY2tlZCB7Ci0gICAgICBnZXQgeyByZXR1cm4gcGFja2VkXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgcGFja2VkXyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAib3B0aW9ucyIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgT3B0aW9uc0ZpZWxkTnVtYmVyID0gOTsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6RmllbGRDb2RlYzxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+IF9yZXBlYXRlZF9vcHRpb25zX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSg3NCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPiBvcHRpb25zXyA9IG5ldyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPigpOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBwcm90b2NvbCBidWZmZXIgb3B0aW9ucy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPiBPcHRpb25zIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25zXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAianNvbl9uYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBKc29uTmFtZUZpZWxkTnVtYmVyID0gMTA7Ci0gICAgcHJpdmF0ZSBzdHJpbmcganNvbk5hbWVfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIGZpZWxkIEpTT04gbmFtZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgSnNvbk5hbWUgewotICAgICAgZ2V0IHsgcmV0dXJuIGpzb25OYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAganNvbk5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZGVmYXVsdF92YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgRGVmYXVsdFZhbHVlRmllbGROdW1iZXIgPSAxMTsKLSAgICBwcml2YXRlIHN0cmluZyBkZWZhdWx0VmFsdWVfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIHN0cmluZyB2YWx1ZSBvZiB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGZpZWxkLiBQcm90bzIgc3ludGF4IG9ubHkuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIERlZmF1bHRWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gZGVmYXVsdFZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgZGVmYXVsdFZhbHVlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEZpZWxkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoRmllbGQgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKEtpbmQgIT0gb3RoZXIuS2luZCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKENhcmRpbmFsaXR5ICE9IG90aGVyLkNhcmRpbmFsaXR5KSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTnVtYmVyICE9IG90aGVyLk51bWJlcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE5hbWUgIT0gb3RoZXIuTmFtZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFR5cGVVcmwgIT0gb3RoZXIuVHlwZVVybCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKE9uZW9mSW5kZXggIT0gb3RoZXIuT25lb2ZJbmRleCkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKFBhY2tlZCAhPSBvdGhlci5QYWNrZWQpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmKCFvcHRpb25zXy5FcXVhbHMob3RoZXIub3B0aW9uc18pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoSnNvbk5hbWUgIT0gb3RoZXIuSnNvbk5hbWUpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmIChEZWZhdWx0VmFsdWUgIT0gb3RoZXIuRGVmYXVsdFZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKEtpbmQgIT0gMCkgaGFzaCBePSBLaW5kLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoQ2FyZGluYWxpdHkgIT0gMCkgaGFzaCBePSBDYXJkaW5hbGl0eS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE51bWJlciAhPSAwKSBoYXNoIF49IE51bWJlci5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gTmFtZS5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFR5cGVVcmwuTGVuZ3RoICE9IDApIGhhc2ggXj0gVHlwZVVybC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKE9uZW9mSW5kZXggIT0gMCkgaGFzaCBePSBPbmVvZkluZGV4LkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoUGFja2VkICE9IGZhbHNlKSBoYXNoIF49IFBhY2tlZC5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBvcHRpb25zXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKEpzb25OYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IEpzb25OYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoRGVmYXVsdFZhbHVlLkxlbmd0aCAhPSAwKSBoYXNoIF49IERlZmF1bHRWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoS2luZCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlRW51bSgoaW50KSBLaW5kKTsKLSAgICAgIH0KLSAgICAgIGlmIChDYXJkaW5hbGl0eSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxNik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgQ2FyZGluYWxpdHkpOwotICAgICAgfQotICAgICAgaWYgKE51bWJlciAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygyNCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKE51bWJlcik7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMzQpOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoVHlwZVVybC5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoVHlwZVVybCk7Ci0gICAgICB9Ci0gICAgICBpZiAoT25lb2ZJbmRleCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg1Nik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUludDMyKE9uZW9mSW5kZXgpOwotICAgICAgfQotICAgICAgaWYgKFBhY2tlZCAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoNjQpOwotICAgICAgICBvdXRwdXQuV3JpdGVCb29sKFBhY2tlZCk7Ci0gICAgICB9Ci0gICAgICBvcHRpb25zXy5Xcml0ZVRvKG91dHB1dCwgX3JlcGVhdGVkX29wdGlvbnNfY29kZWMpOwotICAgICAgaWYgKEpzb25OYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4Mik7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhKc29uTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoRGVmYXVsdFZhbHVlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg5MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhEZWZhdWx0VmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChLaW5kICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVFbnVtU2l6ZSgoaW50KSBLaW5kKTsKLSAgICAgIH0KLSAgICAgIGlmIChDYXJkaW5hbGl0eSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgQ2FyZGluYWxpdHkpOwotICAgICAgfQotICAgICAgaWYgKE51bWJlciAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKE51bWJlcik7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoVHlwZVVybC5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoVHlwZVVybCk7Ci0gICAgICB9Ci0gICAgICBpZiAoT25lb2ZJbmRleCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKE9uZW9mSW5kZXgpOwotICAgICAgfQotICAgICAgaWYgKFBhY2tlZCAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDEgKyAxOwotICAgICAgfQotICAgICAgc2l6ZSArPSBvcHRpb25zXy5DYWxjdWxhdGVTaXplKF9yZXBlYXRlZF9vcHRpb25zX2NvZGVjKTsKLSAgICAgIGlmIChKc29uTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoSnNvbk5hbWUpOwotICAgICAgfQotICAgICAgaWYgKERlZmF1bHRWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoRGVmYXVsdFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShGaWVsZCBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLktpbmQgIT0gMCkgewotICAgICAgICBLaW5kID0gb3RoZXIuS2luZDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5DYXJkaW5hbGl0eSAhPSAwKSB7Ci0gICAgICAgIENhcmRpbmFsaXR5ID0gb3RoZXIuQ2FyZGluYWxpdHk7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuTnVtYmVyICE9IDApIHsKLSAgICAgICAgTnVtYmVyID0gb3RoZXIuTnVtYmVyOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVHlwZVVybC5MZW5ndGggIT0gMCkgewotICAgICAgICBUeXBlVXJsID0gb3RoZXIuVHlwZVVybDsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5PbmVvZkluZGV4ICE9IDApIHsKLSAgICAgICAgT25lb2ZJbmRleCA9IG90aGVyLk9uZW9mSW5kZXg7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuUGFja2VkICE9IGZhbHNlKSB7Ci0gICAgICAgIFBhY2tlZCA9IG90aGVyLlBhY2tlZDsKLSAgICAgIH0KLSAgICAgIG9wdGlvbnNfLkFkZChvdGhlci5vcHRpb25zXyk7Ci0gICAgICBpZiAob3RoZXIuSnNvbk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgSnNvbk5hbWUgPSBvdGhlci5Kc29uTmFtZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5EZWZhdWx0VmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgRGVmYXVsdFZhbHVlID0gb3RoZXIuRGVmYXVsdFZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAga2luZF8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGQuVHlwZXMuS2luZCkgaW5wdXQuUmVhZEVudW0oKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE2OiB7Ci0gICAgICAgICAgICBjYXJkaW5hbGl0eV8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmllbGQuVHlwZXMuQ2FyZGluYWxpdHkpIGlucHV0LlJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNDogewotICAgICAgICAgICAgTnVtYmVyID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDUwOiB7Ci0gICAgICAgICAgICBUeXBlVXJsID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNTY6IHsKLSAgICAgICAgICAgIE9uZW9mSW5kZXggPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDY0OiB7Ci0gICAgICAgICAgICBQYWNrZWQgPSBpbnB1dC5SZWFkQm9vbCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNzQ6IHsKLSAgICAgICAgICAgIG9wdGlvbnNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA4MjogewotICAgICAgICAgICAgSnNvbk5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSA5MDogewotICAgICAgICAgICAgRGVmYXVsdFZhbHVlID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgI3JlZ2lvbiBOZXN0ZWQgdHlwZXMKLSAgICAvLy8gPHN1bW1hcnk+Q29udGFpbmVyIGZvciBuZXN0ZWQgdHlwZXMgZGVjbGFyZWQgaW4gdGhlIEZpZWxkIG1lc3NhZ2UgdHlwZS48L3N1bW1hcnk+Ci0gICAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgICBwdWJsaWMgc3RhdGljIHBhcnRpYWwgY2xhc3MgVHlwZXMgewotICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgLy8vICBCYXNpYyBmaWVsZCB0eXBlcy4KLSAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICBwdWJsaWMgZW51bSBLaW5kIHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEZpZWxkIHR5cGUgdW5rbm93bi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX1VOS05PV04iKV0gVHlwZVVua25vd24gPSAwLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBkb3VibGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9ET1VCTEUiKV0gVHlwZURvdWJsZSA9IDEsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBGaWVsZCB0eXBlIGZsb2F0LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfRkxPQVQiKV0gVHlwZUZsb2F0ID0gMiwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEZpZWxkIHR5cGUgaW50NjQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9JTlQ2NCIpXSBUeXBlSW50NjQgPSAzLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSB1aW50NjQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9VSU5UNjQiKV0gVHlwZVVpbnQ2NCA9IDQsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBGaWVsZCB0eXBlIGludDMyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfSU5UMzIiKV0gVHlwZUludDMyID0gNSwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEZpZWxkIHR5cGUgZml4ZWQ2NC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX0ZJWEVENjQiKV0gVHlwZUZpeGVkNjQgPSA2LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBmaXhlZDMyLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfRklYRUQzMiIpXSBUeXBlRml4ZWQzMiA9IDcsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBGaWVsZCB0eXBlIGJvb2wuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9CT09MIildIFR5cGVCb29sID0gOCwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEZpZWxkIHR5cGUgc3RyaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfU1RSSU5HIildIFR5cGVTdHJpbmcgPSA5LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBncm91cC4gUHJvdG8yIHN5bnRheCBvbmx5LCBhbmQgZGVwcmVjYXRlZC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX0dST1VQIildIFR5cGVHcm91cCA9IDEwLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBtZXNzYWdlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfTUVTU0FHRSIpXSBUeXBlTWVzc2FnZSA9IDExLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBieXRlcy4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX0JZVEVTIildIFR5cGVCeXRlcyA9IDEyLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSB1aW50MzIuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9VSU5UMzIiKV0gVHlwZVVpbnQzMiA9IDEzLAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBlbnVtLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIlRZUEVfRU5VTSIpXSBUeXBlRW51bSA9IDE0LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBzZml4ZWQzMi4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX1NGSVhFRDMyIildIFR5cGVTZml4ZWQzMiA9IDE1LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBzZml4ZWQ2NC4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJUWVBFX1NGSVhFRDY0IildIFR5cGVTZml4ZWQ2NCA9IDE2LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBzaW50MzIuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9TSU5UMzIiKV0gVHlwZVNpbnQzMiA9IDE3LAotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyAgRmllbGQgdHlwZSBzaW50NjQuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIFtwYnI6Ok9yaWdpbmFsTmFtZSgiVFlQRV9TSU5UNjQiKV0gVHlwZVNpbnQ2NCA9IDE4LAotICAgICAgfQotCi0gICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAvLy8gIFdoZXRoZXIgYSBmaWVsZCBpcyBvcHRpb25hbCwgcmVxdWlyZWQsIG9yIHJlcGVhdGVkLgotICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgIHB1YmxpYyBlbnVtIENhcmRpbmFsaXR5IHsKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEZvciBmaWVsZHMgd2l0aCB1bmtub3duIGNhcmRpbmFsaXR5LgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkNBUkRJTkFMSVRZX1VOS05PV04iKV0gVW5rbm93biA9IDAsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBGb3Igb3B0aW9uYWwgZmllbGRzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkNBUkRJTkFMSVRZX09QVElPTkFMIildIE9wdGlvbmFsID0gMSwKLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gIEZvciByZXF1aXJlZCBmaWVsZHMuIFByb3RvMiBzeW50YXggb25seS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgW3Bicjo6T3JpZ2luYWxOYW1lKCJDQVJESU5BTElUWV9SRVFVSVJFRCIpXSBSZXF1aXJlZCA9IDIsCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vICBGb3IgcmVwZWF0ZWQgZmllbGRzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBbcGJyOjpPcmlnaW5hbE5hbWUoIkNBUkRJTkFMSVRZX1JFUEVBVEVEIildIFJlcGVhdGVkID0gMywKLSAgICAgIH0KLQotICAgIH0KLSAgICAjZW5kcmVnaW9uCi0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBFbnVtIHR5cGUgZGVmaW5pdGlvbi4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEVudW0gOiBwYjo6SU1lc3NhZ2U8RW51bT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEVudW0+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8RW51bT4oKCkgPT4gbmV3IEVudW0oKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEVudW0oKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEVudW0oRW51bSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgIGVudW12YWx1ZV8gPSBvdGhlci5lbnVtdmFsdWVfLkNsb25lKCk7Ci0gICAgICBvcHRpb25zXyA9IG90aGVyLm9wdGlvbnNfLkNsb25lKCk7Ci0gICAgICBTb3VyY2VDb250ZXh0ID0gb3RoZXIuc291cmNlQ29udGV4dF8gIT0gbnVsbCA/IG90aGVyLlNvdXJjZUNvbnRleHQuQ2xvbmUoKSA6IG51bGw7Ci0gICAgICBzeW50YXhfID0gb3RoZXIuc3ludGF4XzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRW51bSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm5hbWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE5hbWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBzdHJpbmcgbmFtZV8gPSAiIjsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBFbnVtIHR5cGUgbmFtZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAiZW51bXZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBFbnVtdmFsdWVGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW51bVZhbHVlPiBfcmVwZWF0ZWRfZW51bXZhbHVlX2NvZGVjCi0gICAgICAgID0gcGI6OkZpZWxkQ29kZWMuRm9yTWVzc2FnZSgxOCwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW51bVZhbHVlLlBhcnNlcik7Ci0gICAgcHJpdmF0ZSByZWFkb25seSBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW51bVZhbHVlPiBlbnVtdmFsdWVfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5FbnVtVmFsdWU+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgRW51bSB2YWx1ZSBkZWZpbml0aW9ucy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRW51bVZhbHVlPiBFbnVtdmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIGVudW12YWx1ZV87IH0KLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgIm9wdGlvbnMiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IE9wdGlvbnNGaWVsZE51bWJlciA9IDM7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6OkZpZWxkQ29kZWM8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPiBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYwotICAgICAgICA9IHBiOjpGaWVsZENvZGVjLkZvck1lc3NhZ2UoMjYsIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbi5QYXJzZXIpOwotICAgIHByaXZhdGUgcmVhZG9ubHkgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbj4gb3B0aW9uc18gPSBuZXcgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbj4oKTsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBQcm90b2NvbCBidWZmZXIgb3B0aW9ucy4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYmM6OlJlcGVhdGVkRmllbGQ8Z2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuT3B0aW9uPiBPcHRpb25zIHsKLSAgICAgIGdldCB7IHJldHVybiBvcHRpb25zXzsgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic291cmNlX2NvbnRleHQiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFNvdXJjZUNvbnRleHRGaWVsZE51bWJlciA9IDQ7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0IHNvdXJjZUNvbnRleHRfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBzb3VyY2UgY29udGV4dC4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Tb3VyY2VDb250ZXh0IFNvdXJjZUNvbnRleHQgewotICAgICAgZ2V0IHsgcmV0dXJuIHNvdXJjZUNvbnRleHRfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBzb3VyY2VDb250ZXh0XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAic3ludGF4IiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBTeW50YXhGaWVsZE51bWJlciA9IDU7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TeW50YXggc3ludGF4XyA9IDA7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIHNvdXJjZSBzeW50YXguCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3ludGF4IFN5bnRheCB7Ci0gICAgICBnZXQgeyByZXR1cm4gc3ludGF4XzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgc3ludGF4XyA9IHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBib29sIEVxdWFscyhvYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBFcXVhbHMob3RoZXIgYXMgRW51bSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEVudW0gb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKE5hbWUgIT0gb3RoZXIuTmFtZSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIWVudW12YWx1ZV8uRXF1YWxzKG90aGVyLmVudW12YWx1ZV8pKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZighb3B0aW9uc18uRXF1YWxzKG90aGVyLm9wdGlvbnNfKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFvYmplY3QuRXF1YWxzKFNvdXJjZUNvbnRleHQsIG90aGVyLlNvdXJjZUNvbnRleHQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoU3ludGF4ICE9IG90aGVyLlN5bnRheCkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IE5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGhhc2ggXj0gZW51bXZhbHVlXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaGFzaCBePSBvcHRpb25zXy5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKHNvdXJjZUNvbnRleHRfICE9IG51bGwpIGhhc2ggXj0gU291cmNlQ29udGV4dC5HZXRIYXNoQ29kZSgpOwotICAgICAgaWYgKFN5bnRheCAhPSAwKSBoYXNoIF49IFN5bnRheC5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBlbnVtdmFsdWVfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfZW51bXZhbHVlX2NvZGVjKTsKLSAgICAgIG9wdGlvbnNfLldyaXRlVG8ob3V0cHV0LCBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICBpZiAoc291cmNlQ29udGV4dF8gIT0gbnVsbCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMzQpOwotICAgICAgICBvdXRwdXQuV3JpdGVNZXNzYWdlKFNvdXJjZUNvbnRleHQpOwotICAgICAgfQotICAgICAgaWYgKFN5bnRheCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg0MCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUVudW0oKGludCkgU3ludGF4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBzaXplICs9IGVudW12YWx1ZV8uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfZW51bXZhbHVlX2NvZGVjKTsKLSAgICAgIHNpemUgKz0gb3B0aW9uc18uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICBpZiAoc291cmNlQ29udGV4dF8gIT0gbnVsbCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZU1lc3NhZ2VTaXplKFNvdXJjZUNvbnRleHQpOwotICAgICAgfQotICAgICAgaWYgKFN5bnRheCAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlRW51bVNpemUoKGludCkgU3ludGF4KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShFbnVtIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsKLSAgICAgIH0KLSAgICAgIGVudW12YWx1ZV8uQWRkKG90aGVyLmVudW12YWx1ZV8pOwotICAgICAgb3B0aW9uc18uQWRkKG90aGVyLm9wdGlvbnNfKTsKLSAgICAgIGlmIChvdGhlci5zb3VyY2VDb250ZXh0XyAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChzb3VyY2VDb250ZXh0XyA9PSBudWxsKSB7Ci0gICAgICAgICAgc291cmNlQ29udGV4dF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIFNvdXJjZUNvbnRleHQuTWVyZ2VGcm9tKG90aGVyLlNvdXJjZUNvbnRleHQpOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlN5bnRheCAhPSAwKSB7Ci0gICAgICAgIFN5bnRheCA9IG90aGVyLlN5bnRheDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBOYW1lID0gaW5wdXQuUmVhZFN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgICAgIGVudW12YWx1ZV8uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9lbnVtdmFsdWVfY29kZWMpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgMjY6IHsKLSAgICAgICAgICAgIG9wdGlvbnNfLkFkZEVudHJpZXNGcm9tKGlucHV0LCBfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAzNDogewotICAgICAgICAgICAgaWYgKHNvdXJjZUNvbnRleHRfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgc291cmNlQ29udGV4dF8gPSBuZXcgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU291cmNlQ29udGV4dCgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2Uoc291cmNlQ29udGV4dF8pOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgNDA6IHsKLSAgICAgICAgICAgIHN5bnRheF8gPSAoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuU3ludGF4KSBpbnB1dC5SZWFkRW51bSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgRW51bSB2YWx1ZSBkZWZpbml0aW9uLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRW51bVZhbHVlIDogcGI6OklNZXNzYWdlPEVudW1WYWx1ZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEVudW1WYWx1ZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtVmFsdWU+KCgpID0+IG5ldyBFbnVtVmFsdWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxFbnVtVmFsdWU+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5UeXBlUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1szXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRW51bVZhbHVlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBFbnVtVmFsdWUoRW51bVZhbHVlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICBuYW1lXyA9IG90aGVyLm5hbWVfOwotICAgICAgbnVtYmVyXyA9IG90aGVyLm51bWJlcl87Ci0gICAgICBvcHRpb25zXyA9IG90aGVyLm9wdGlvbnNfLkNsb25lKCk7Ci0gICAgfQotCi0gICAgcHVibGljIEVudW1WYWx1ZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgRW51bVZhbHVlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibmFtZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHN0cmluZyBuYW1lXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIEVudW0gdmFsdWUgbmFtZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdHJpbmcgTmFtZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gbmFtZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIG5hbWVfID0gcGI6OlByb3RvUHJlY29uZGl0aW9ucy5DaGVja05vdE51bGwodmFsdWUsICJ2YWx1ZSIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAibnVtYmVyIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOdW1iZXJGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBpbnQgbnVtYmVyXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBFbnVtIHZhbHVlIG51bWJlci4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBpbnQgTnVtYmVyIHsKLSAgICAgIGdldCB7IHJldHVybiBudW1iZXJfOyB9Ci0gICAgICBzZXQgewotICAgICAgICBudW1iZXJfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJvcHRpb25zIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBPcHRpb25zRmllbGROdW1iZXIgPSAzOwotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpGaWVsZENvZGVjPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbj4gX3JlcGVhdGVkX29wdGlvbnNfY29kZWMKLSAgICAgICAgPSBwYjo6RmllbGRDb2RlYy5Gb3JNZXNzYWdlKDI2LCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24uUGFyc2VyKTsKLSAgICBwcml2YXRlIHJlYWRvbmx5IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+IG9wdGlvbnNfID0gbmV3IHBiYzo6UmVwZWF0ZWRGaWVsZDxnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5PcHRpb24+KCk7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgUHJvdG9jb2wgYnVmZmVyIG9wdGlvbnMuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgcGJjOjpSZXBlYXRlZEZpZWxkPGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLk9wdGlvbj4gT3B0aW9ucyB7Ci0gICAgICBnZXQgeyByZXR1cm4gb3B0aW9uc187IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEVudW1WYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKEVudW1WYWx1ZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZSAhPSBvdGhlci5OYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoTnVtYmVyICE9IG90aGVyLk51bWJlcikgcmV0dXJuIGZhbHNlOwotICAgICAgaWYoIW9wdGlvbnNfLkVxdWFscyhvdGhlci5vcHRpb25zXykpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgaGFzaCBePSBOYW1lLkdldEhhc2hDb2RlKCk7Ci0gICAgICBpZiAoTnVtYmVyICE9IDApIGhhc2ggXj0gTnVtYmVyLkdldEhhc2hDb2RlKCk7Ci0gICAgICBoYXNoIF49IG9wdGlvbnNfLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVN0cmluZyhOYW1lKTsKLSAgICAgIH0KLSAgICAgIGlmIChOdW1iZXIgIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTYpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQzMihOdW1iZXIpOwotICAgICAgfQotICAgICAgb3B0aW9uc18uV3JpdGVUbyhvdXRwdXQsIF9yZXBlYXRlZF9vcHRpb25zX2NvZGVjKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAoTnVtYmVyICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVJbnQzMlNpemUoTnVtYmVyKTsKLSAgICAgIH0KLSAgICAgIHNpemUgKz0gb3B0aW9uc18uQ2FsY3VsYXRlU2l6ZShfcmVwZWF0ZWRfb3B0aW9uc19jb2RlYyk7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20oRW51bVZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBOYW1lID0gb3RoZXIuTmFtZTsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5OdW1iZXIgIT0gMCkgewotICAgICAgICBOdW1iZXIgPSBvdGhlci5OdW1iZXI7Ci0gICAgICB9Ci0gICAgICBvcHRpb25zXy5BZGQob3RoZXIub3B0aW9uc18pOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIE5hbWUgPSBpbnB1dC5SZWFkU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAxNjogewotICAgICAgICAgICAgTnVtYmVyID0gaW5wdXQuUmVhZEludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSAyNjogewotICAgICAgICAgICAgb3B0aW9uc18uQWRkRW50cmllc0Zyb20oaW5wdXQsIF9yZXBlYXRlZF9vcHRpb25zX2NvZGVjKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIEEgcHJvdG9jb2wgYnVmZmVyIG9wdGlvbiwgd2hpY2ggY2FuIGJlIGF0dGFjaGVkIHRvIGEgbWVzc2FnZSwgZmllbGQsCi0gIC8vLyAgZW51bWVyYXRpb24sIGV0Yy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIE9wdGlvbiA6IHBiOjpJTWVzc2FnZTxPcHRpb24+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxPcHRpb24+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8T3B0aW9uPigoKSA9PiBuZXcgT3B0aW9uKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8T3B0aW9uPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVHlwZVJlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNF07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIE9wdGlvbigpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgT3B0aW9uKE9wdGlvbiBvdGhlcikgOiB0aGlzKCkgewotICAgICAgbmFtZV8gPSBvdGhlci5uYW1lXzsKLSAgICAgIFZhbHVlID0gb3RoZXIudmFsdWVfICE9IG51bGwgPyBvdGhlci5WYWx1ZS5DbG9uZSgpIDogbnVsbDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT3B0aW9uIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBPcHRpb24odGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJuYW1lIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBOYW1lRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIG5hbWVfID0gIiI7Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIG9wdGlvbidzIG5hbWUuIEZvciBleGFtcGxlLCBgImphdmFfcGFja2FnZSJgLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHN0cmluZyBOYW1lIHsKLSAgICAgIGdldCB7IHJldHVybiBuYW1lXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgbmFtZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ2YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZE51bWJlciA9IDI7Ci0gICAgcHJpdmF0ZSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5BbnkgdmFsdWVfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBvcHRpb24ncyB2YWx1ZS4gRm9yIGV4YW1wbGUsIGAiY29tLmdvb2dsZS5wcm90b2J1ZiJgLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueSBWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIE9wdGlvbik7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKE9wdGlvbiBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoTmFtZSAhPSBvdGhlci5OYW1lKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIW9iamVjdC5FcXVhbHMoVmFsdWUsIG90aGVyLlZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChOYW1lLkxlbmd0aCAhPSAwKSBoYXNoIF49IE5hbWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIGlmICh2YWx1ZV8gIT0gbnVsbCkgaGFzaCBePSBWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoTmFtZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoTmFtZSk7Ci0gICAgICB9Ci0gICAgICBpZiAodmFsdWVfICE9IG51bGwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDE4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlTWVzc2FnZShWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKE5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVTdHJpbmdTaXplKE5hbWUpOwotICAgICAgfQotICAgICAgaWYgKHZhbHVlXyAhPSBudWxsKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlTWVzc2FnZVNpemUoVmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKE9wdGlvbiBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLk5hbWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgTmFtZSA9IG90aGVyLk5hbWU7Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIudmFsdWVfICE9IG51bGwpIHsKLSAgICAgICAgaWYgKHZhbHVlXyA9PSBudWxsKSB7Ci0gICAgICAgICAgdmFsdWVfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueSgpOwotICAgICAgICB9Ci0gICAgICAgIFZhbHVlLk1lcmdlRnJvbShvdGhlci5WYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSAxMDogewotICAgICAgICAgICAgTmFtZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBjYXNlIDE4OiB7Ci0gICAgICAgICAgICBpZiAodmFsdWVfID09IG51bGwpIHsKLSAgICAgICAgICAgICAgdmFsdWVfID0gbmV3IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkFueSgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaW5wdXQuUmVhZE1lc3NhZ2UodmFsdWVfKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgI2VuZHJlZ2lvbgotCi19Ci0KLSNlbmRyZWdpb24gRGVzaWduZXIgZ2VuZXJhdGVkIGNvZGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1ZhbHVlUGFydGlhbC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dlbGxLbm93blR5cGVzL1ZhbHVlUGFydGlhbC5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDM0YjU2MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9WYWx1ZVBhcnRpYWwuY3MKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi3vu78jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzCi17Ci0gICAgcHVibGljIHBhcnRpYWwgY2xhc3MgVmFsdWUKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlbmllbmNlIG1ldGhvZCB0byBjcmVhdGUgYSBWYWx1ZSBtZXNzYWdlIHdpdGggYSBzdHJpbmcgdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlZhbHVlIHRvIHNldCBmb3IgdGhlIFN0cmluZ1ZhbHVlIHByb3BlcnR5LjwvcGFyYW0+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIG5ld2x5LWNyZWF0ZWQgVmFsdWUgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiB2YWx1ZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVmFsdWUgRm9yU3RyaW5nKHN0cmluZyB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlIHsgU3RyaW5nVmFsdWUgPSB2YWx1ZSB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBhIFZhbHVlIG1lc3NhZ2Ugd2l0aCBhIG51bWJlciB2YWx1ZS4KLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxwYXJhbSBuYW1lPSJ2YWx1ZSI+VmFsdWUgdG8gc2V0IGZvciB0aGUgTnVtYmVyVmFsdWUgcHJvcGVydHkuPC9wYXJhbT4KLSAgICAgICAgLy8vIDxyZXR1cm5zPkEgbmV3bHktY3JlYXRlZCBWYWx1ZSBtZXNzYWdlIHdpdGggdGhlIGdpdmVuIHZhbHVlLjwvcmV0dXJucz4KLSAgICAgICAgcHVibGljIHN0YXRpYyBWYWx1ZSBGb3JOdW1iZXIoZG91YmxlIHZhbHVlKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlIHsgTnVtYmVyVmFsdWUgPSB2YWx1ZSB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBhIFZhbHVlIG1lc3NhZ2Ugd2l0aCBhIEJvb2xlYW4gdmFsdWUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIC8vLyA8cGFyYW0gbmFtZT0idmFsdWUiPlZhbHVlIHRvIHNldCBmb3IgdGhlIEJvb2xWYWx1ZSBwcm9wZXJ0eS48L3BhcmFtPgotICAgICAgICAvLy8gPHJldHVybnM+QSBuZXdseS1jcmVhdGVkIFZhbHVlIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIFZhbHVlIEZvckJvb2woYm9vbCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZSB7IEJvb2xWYWx1ZSA9IHZhbHVlIH07Ci0gICAgICAgIH0KLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gY3JlYXRlIGEgVmFsdWUgbWVzc2FnZSB3aXRoIGEgbnVsbCBpbml0aWFsIHZhbHVlLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJldHVybnM+QSBuZXdseS1jcmVhdGVkIFZhbHVlIG1lc3NhZ2UgYSBudWxsIGluaXRpYWwgdmFsdWUuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIFZhbHVlIEZvck51bGwoKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlIHsgTnVsbFZhbHVlID0gMCB9OwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gQ29udmVuaWVuY2UgbWV0aG9kIHRvIGNyZWF0ZSBhIFZhbHVlIG1lc3NhZ2Ugd2l0aCBhbiBpbml0aWFsIGxpc3Qgb2YgdmFsdWVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICAvLy8gPHJlbWFya3M+VGhlIHZhbHVlcyBwcm92aWRlZCBhcmUgbm90IGNsb25lZDsgdGhlIHJlZmVyZW5jZXMgYXJlIGNvcGllZCBkaXJlY3RseS48L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIG5ld2x5LWNyZWF0ZWQgVmFsdWUgbWVzc2FnZSBhbiBpbml0aWFsIGxpc3QgdmFsdWUuPC9yZXR1cm5zPgotICAgICAgICBwdWJsaWMgc3RhdGljIFZhbHVlIEZvckxpc3QocGFyYW1zIFZhbHVlW10gdmFsdWVzKQotICAgICAgICB7Ci0gICAgICAgICAgICBQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlcywgInZhbHVlcyIpOwotICAgICAgICAgICAgcmV0dXJuIG5ldyBWYWx1ZSB7IExpc3RWYWx1ZSA9IG5ldyBMaXN0VmFsdWUgeyBWYWx1ZXMgPSB7IHZhbHVlcyB9IH0gfTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIENvbnZlbmllbmNlIG1ldGhvZCB0byBjcmVhdGUgYSBWYWx1ZSBtZXNzYWdlIHdpdGggYW4gaW5pdGlhbCBzdHJ1Y3QgdmFsdWUKLSAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgLy8vIDxyZW1hcmtzPlRoZSB2YWx1ZSBwcm92aWRlZCBpcyBub3QgY2xvbmVkOyB0aGUgcmVmZXJlbmNlIGlzIGNvcGllZCBkaXJlY3RseS48L3JlbWFya3M+Ci0gICAgICAgIC8vLyA8cmV0dXJucz5BIG5ld2x5LWNyZWF0ZWQgVmFsdWUgbWVzc2FnZSBhbiBpbml0aWFsIHN0cnVjdCB2YWx1ZS48L3JldHVybnM+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgVmFsdWUgRm9yU3RydWN0KFN0cnVjdCB2YWx1ZSkKLSAgICAgICAgewotICAgICAgICAgICAgUHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFZhbHVlIHsgU3RydWN0VmFsdWUgPSB2YWx1ZSB9OwotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvV3JhcHBlcnMuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9XcmFwcGVycy5jcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg4NjdkMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9XcmFwcGVycy5jcworKysgL2Rldi9udWxsCkBAIC0xLDEwNTcgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvCi0jcHJhZ21hIHdhcm5pbmcgZGlzYWJsZSAxNTkxLCAwNjEyLCAzMDIxCi0jcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCi0KLXVzaW5nIHBiID0gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWY7Ci11c2luZyBwYmMgPSBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5Db2xsZWN0aW9uczsKLXVzaW5nIHBiciA9IGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb247Ci11c2luZyBzY2cgPSBnbG9iYWw6OlN5c3RlbS5Db2xsZWN0aW9ucy5HZW5lcmljOwotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcyB7Ci0KLSAgLy8vIDxzdW1tYXJ5PkhvbGRlciBmb3IgcmVmbGVjdGlvbiBpbmZvcm1hdGlvbiBnZW5lcmF0ZWQgZnJvbSBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG88L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBXcmFwcGVyc1JlZmxlY3Rpb24gewotCi0gICAgI3JlZ2lvbiBEZXNjcmlwdG9yCi0gICAgLy8vIDxzdW1tYXJ5PkZpbGUgZGVzY3JpcHRvciBmb3IgZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpGaWxlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBkZXNjcmlwdG9yOyB9Ci0gICAgfQotICAgIHByaXZhdGUgc3RhdGljIHBicjo6RmlsZURlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLQotICAgIHN0YXRpYyBXcmFwcGVyc1JlZmxlY3Rpb24oKSB7Ci0gICAgICBieXRlW10gZGVzY3JpcHRvckRhdGEgPSBnbG9iYWw6OlN5c3RlbS5Db252ZXJ0LkZyb21CYXNlNjRTdHJpbmcoCi0gICAgICAgICAgc3RyaW5nLkNvbmNhdCgKLSAgICAgICAgICAgICJDaDVuYjI5bmJHVXZjSEp2ZEc5aWRXWXZkM0poY0hCbGNuTXVjSEp2ZEc4U0QyZHZiMmRzWlM1d2NtOTAiLAotICAgICAgICAgICAgImIySjFaaUljQ2d0RWIzVmliR1ZXWVd4MVpSSU5DZ1YyWVd4MVpSZ0JJQUVvQVNJYkNncEdiRzloZEZaaCIsCi0gICAgICAgICAgICAiYkhWbEVnMEtCWFpoYkhWbEdBRWdBU2dDSWhzS0NrbHVkRFkwVm1Gc2RXVVNEUW9GZG1Gc2RXVVlBU0FCIiwKLSAgICAgICAgICAgICJLQU1pSEFvTFZVbHVkRFkwVm1Gc2RXVVNEUW9GZG1Gc2RXVVlBU0FCS0FRaUd3b0tTVzUwTXpKV1lXeDEiLAotICAgICAgICAgICAgIlpSSU5DZ1YyWVd4MVpSZ0JJQUVvQlNJY0NndFZTVzUwTXpKV1lXeDFaUklOQ2dWMllXeDFaUmdCSUFFbyIsCi0gICAgICAgICAgICAiRFNJYUNnbENiMjlzVm1Gc2RXVVNEUW9GZG1Gc2RXVVlBU0FCS0FnaUhBb0xVM1J5YVc1blZtRnNkV1VTIiwKLSAgICAgICAgICAgICJEUW9GZG1Gc2RXVVlBU0FCS0FraUd3b0tRbmwwWlhOV1lXeDFaUklOQ2dWMllXeDFaUmdCSUFFb0RFSi8iLAotICAgICAgICAgICAgIkNoTmpiMjB1WjI5dloyeGxMbkJ5YjNSdlluVm1RZzFYY21Gd2NHVnljMUJ5YjNSdlVBRmFLbWRwZEdoMSIsCi0gICAgICAgICAgICAiWWk1amIyMHZaMjlzWVc1bkwzQnliM1J2WW5WbUwzQjBlWEJsY3k5M2NtRndjR1Z5YzZBQkFmZ0JBYUlDIiwKLSAgICAgICAgICAgICJBMGRRUXFvQ0hrZHZiMmRzWlM1UWNtOTBiMkoxWmk1WFpXeHNTMjV2ZDI1VWVYQmxjMklHY0hKdmRHOHoiKSk7Ci0gICAgICBkZXNjcmlwdG9yID0gcGJyOjpGaWxlRGVzY3JpcHRvci5Gcm9tR2VuZXJhdGVkQ29kZShkZXNjcmlwdG9yRGF0YSwKLSAgICAgICAgICBuZXcgcGJyOjpGaWxlRGVzY3JpcHRvcltdIHsgfSwKLSAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyhudWxsLCBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mb1tdIHsKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Eb3VibGVWYWx1ZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkRvdWJsZVZhbHVlLlBhcnNlciwgbmV3W117ICJWYWx1ZSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuRmxvYXRWYWx1ZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkZsb2F0VmFsdWUuUGFyc2VyLCBuZXdbXXsgIlZhbHVlIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5JbnQ2NFZhbHVlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuSW50NjRWYWx1ZS5QYXJzZXIsIG5ld1tdeyAiVmFsdWUiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlVJbnQ2NFZhbHVlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVUludDY0VmFsdWUuUGFyc2VyLCBuZXdbXXsgIlZhbHVlIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5JbnQzMlZhbHVlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuSW50MzJWYWx1ZS5QYXJzZXIsIG5ld1tdeyAiVmFsdWUiIH0sIG51bGwsIG51bGwsIG51bGwpLAotICAgICAgICAgICAgbmV3IHBicjo6R2VuZXJhdGVkQ2xyVHlwZUluZm8odHlwZW9mKGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlVJbnQzMlZhbHVlKSwgZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuVUludDMyVmFsdWUuUGFyc2VyLCBuZXdbXXsgIlZhbHVlIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Cb29sVmFsdWUpLCBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5Cb29sVmFsdWUuUGFyc2VyLCBuZXdbXXsgIlZhbHVlIiB9LCBudWxsLCBudWxsLCBudWxsKSwKLSAgICAgICAgICAgIG5ldyBwYnI6OkdlbmVyYXRlZENsclR5cGVJbmZvKHR5cGVvZihnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5TdHJpbmdWYWx1ZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLlN0cmluZ1ZhbHVlLlBhcnNlciwgbmV3W117ICJWYWx1ZSIgfSwgbnVsbCwgbnVsbCwgbnVsbCksCi0gICAgICAgICAgICBuZXcgcGJyOjpHZW5lcmF0ZWRDbHJUeXBlSW5mbyh0eXBlb2YoZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuQnl0ZXNWYWx1ZSksIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLkJ5dGVzVmFsdWUuUGFyc2VyLCBuZXdbXXsgIlZhbHVlIiB9LCBudWxsLCBudWxsLCBudWxsKQotICAgICAgICAgIH0pKTsKLSAgICB9Ci0gICAgI2VuZHJlZ2lvbgotCi0gIH0KLSAgI3JlZ2lvbiBNZXNzYWdlcwotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgV3JhcHBlciBtZXNzYWdlIGZvciBgZG91YmxlYC4KLSAgLy8vCi0gIC8vLyAgVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBEb3VibGVWYWx1ZWAgaXMgSlNPTiBudW1iZXIuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBEb3VibGVWYWx1ZSA6IHBiOjpJTWVzc2FnZTxEb3VibGVWYWx1ZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPERvdWJsZVZhbHVlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPERvdWJsZVZhbHVlPigoKSA9PiBuZXcgRG91YmxlVmFsdWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxEb3VibGVWYWx1ZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLldyYXBwZXJzUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1swXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgRG91YmxlVmFsdWUoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIERvdWJsZVZhbHVlKERvdWJsZVZhbHVlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICB2YWx1ZV8gPSBvdGhlci52YWx1ZV87Ci0gICAgfQotCi0gICAgcHVibGljIERvdWJsZVZhbHVlIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBEb3VibGVWYWx1ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBWYWx1ZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGRvdWJsZSB2YWx1ZV87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIGRvdWJsZSB2YWx1ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBkb3VibGUgVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgdmFsdWVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBEb3VibGVWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKERvdWJsZVZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChWYWx1ZSAhPSBvdGhlci5WYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChWYWx1ZSAhPSAwRCkgaGFzaCBePSBWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoVmFsdWUgIT0gMEQpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDkpOwotICAgICAgICBvdXRwdXQuV3JpdGVEb3VibGUoVmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChWYWx1ZSAhPSAwRCkgewotICAgICAgICBzaXplICs9IDEgKyA4OwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKERvdWJsZVZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVmFsdWUgIT0gMEQpIHsKLSAgICAgICAgVmFsdWUgPSBvdGhlci5WYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDk6IHsKLSAgICAgICAgICAgIFZhbHVlID0gaW5wdXQuUmVhZERvdWJsZSgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gIH0KLQotICAvLy8gPHN1bW1hcnk+Ci0gIC8vLyAgV3JhcHBlciBtZXNzYWdlIGZvciBgZmxvYXRgLgotICAvLy8KLSAgLy8vICBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYEZsb2F0VmFsdWVgIGlzIEpTT04gbnVtYmVyLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgRmxvYXRWYWx1ZSA6IHBiOjpJTWVzc2FnZTxGbG9hdFZhbHVlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8RmxvYXRWYWx1ZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxGbG9hdFZhbHVlPigoKSA9PiBuZXcgRmxvYXRWYWx1ZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPEZsb2F0VmFsdWU+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5XcmFwcGVyc1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbMV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEZsb2F0VmFsdWUoKSB7Ci0gICAgICBPbkNvbnN0cnVjdGlvbigpOwotICAgIH0KLQotICAgIHBhcnRpYWwgdm9pZCBPbkNvbnN0cnVjdGlvbigpOwotCi0gICAgcHVibGljIEZsb2F0VmFsdWUoRmxvYXRWYWx1ZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgdmFsdWVfID0gb3RoZXIudmFsdWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBGbG9hdFZhbHVlIENsb25lKCkgewotICAgICAgcmV0dXJuIG5ldyBGbG9hdFZhbHVlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidmFsdWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgZmxvYXQgdmFsdWVfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBmbG9hdCB2YWx1ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBmbG9hdCBWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEZsb2F0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhGbG9hdFZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChWYWx1ZSAhPSBvdGhlci5WYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChWYWx1ZSAhPSAwRikgaGFzaCBePSBWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoVmFsdWUgIT0gMEYpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDEzKTsKLSAgICAgICAgb3V0cHV0LldyaXRlRmxvYXQoVmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChWYWx1ZSAhPSAwRikgewotICAgICAgICBzaXplICs9IDEgKyA0OwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEZsb2F0VmFsdWUgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5WYWx1ZSAhPSAwRikgewotICAgICAgICBWYWx1ZSA9IG90aGVyLlZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTM6IHsKLSAgICAgICAgICAgIFZhbHVlID0gaW5wdXQuUmVhZEZsb2F0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBpbnQ2NGAuCi0gIC8vLwotICAvLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgSW50NjRWYWx1ZWAgaXMgSlNPTiBzdHJpbmcuCi0gIC8vLyA8L3N1bW1hcnk+Ci0gIFtnbG9iYWw6OlN5c3RlbS5EaWFnbm9zdGljcy5EZWJ1Z2dlck5vblVzZXJDb2RlQXR0cmlidXRlKCldCi0gIHB1YmxpYyBzZWFsZWQgcGFydGlhbCBjbGFzcyBJbnQ2NFZhbHVlIDogcGI6OklNZXNzYWdlPEludDY0VmFsdWU+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxJbnQ2NFZhbHVlPiBfcGFyc2VyID0gbmV3IHBiOjpNZXNzYWdlUGFyc2VyPEludDY0VmFsdWU+KCgpID0+IG5ldyBJbnQ2NFZhbHVlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8SW50NjRWYWx1ZT4gUGFyc2VyIHsgZ2V0IHsgcmV0dXJuIF9wYXJzZXI7IH0gfQotCi0gICAgcHVibGljIHN0YXRpYyBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIERlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIGdsb2JhbDo6R29vZ2xlLlByb3RvYnVmLldlbGxLbm93blR5cGVzLldyYXBwZXJzUmVmbGVjdGlvbi5EZXNjcmlwdG9yLk1lc3NhZ2VUeXBlc1syXTsgfQotICAgIH0KLQotICAgIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgcGI6OklNZXNzYWdlLkRlc2NyaXB0b3IgewotICAgICAgZ2V0IHsgcmV0dXJuIERlc2NyaXB0b3I7IH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50NjRWYWx1ZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgSW50NjRWYWx1ZShJbnQ2NFZhbHVlIG90aGVyKSA6IHRoaXMoKSB7Ci0gICAgICB2YWx1ZV8gPSBvdGhlci52YWx1ZV87Ci0gICAgfQotCi0gICAgcHVibGljIEludDY0VmFsdWUgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEludDY0VmFsdWUodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ2YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSBsb25nIHZhbHVlXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgaW50NjQgdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgbG9uZyBWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEludDY0VmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhJbnQ2NFZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChWYWx1ZSAhPSBvdGhlci5WYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChWYWx1ZSAhPSAwTCkgaGFzaCBePSBWYWx1ZS5HZXRIYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIGhhc2g7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIHN0cmluZyBUb1N0cmluZygpIHsKLSAgICAgIHJldHVybiBwYjo6SnNvbkZvcm1hdHRlci5Ub0RpYWdub3N0aWNTdHJpbmcodGhpcyk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgV3JpdGVUbyhwYjo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB7Ci0gICAgICBpZiAoVmFsdWUgIT0gMEwpIHsKLSAgICAgICAgb3V0cHV0LldyaXRlUmF3VGFnKDgpOwotICAgICAgICBvdXRwdXQuV3JpdGVJbnQ2NChWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKFZhbHVlICE9IDBMKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50NjRTaXplKFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShJbnQ2NFZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVmFsdWUgIT0gMEwpIHsKLSAgICAgICAgVmFsdWUgPSBvdGhlci5WYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgICAgIFZhbHVlID0gaW5wdXQuUmVhZEludDY0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBXcmFwcGVyIG1lc3NhZ2UgZm9yIGB1aW50NjRgLgotICAvLy8KLSAgLy8vICBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFVJbnQ2NFZhbHVlYCBpcyBKU09OIHN0cmluZy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFVJbnQ2NFZhbHVlIDogcGI6OklNZXNzYWdlPFVJbnQ2NFZhbHVlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8VUludDY0VmFsdWU+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8VUludDY0VmFsdWU+KCgpID0+IG5ldyBVSW50NjRWYWx1ZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFVJbnQ2NFZhbHVlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuV3JhcHBlcnNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzNdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBVSW50NjRWYWx1ZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgVUludDY0VmFsdWUoVUludDY0VmFsdWUgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgVUludDY0VmFsdWUgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFVJbnQ2NFZhbHVlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidmFsdWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgdWxvbmcgdmFsdWVfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSB1aW50NjQgdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgdWxvbmcgVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgdmFsdWVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBVSW50NjRWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFVJbnQ2NFZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChWYWx1ZSAhPSBvdGhlci5WYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChWYWx1ZSAhPSAwVUwpIGhhc2ggXj0gVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKFZhbHVlICE9IDBVTCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVVJbnQ2NChWYWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGludCBDYWxjdWxhdGVTaXplKCkgewotICAgICAgaW50IHNpemUgPSAwOwotICAgICAgaWYgKFZhbHVlICE9IDBVTCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQ2NFNpemUoVmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFVJbnQ2NFZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVmFsdWUgIT0gMFVMKSB7Ci0gICAgICAgIFZhbHVlID0gb3RoZXIuVmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGlucHV0LlJlYWRVSW50NjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGludDMyYC4KLSAgLy8vCi0gIC8vLyAgVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBJbnQzMlZhbHVlYCBpcyBKU09OIG51bWJlci4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEludDMyVmFsdWUgOiBwYjo6SU1lc3NhZ2U8SW50MzJWYWx1ZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEludDMyVmFsdWU+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8SW50MzJWYWx1ZT4oKCkgPT4gbmV3IEludDMyVmFsdWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxJbnQzMlZhbHVlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuV3JhcHBlcnNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzRdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBJbnQzMlZhbHVlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBJbnQzMlZhbHVlKEludDMyVmFsdWUgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgSW50MzJWYWx1ZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgSW50MzJWYWx1ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBWYWx1ZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGludCB2YWx1ZV87Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyAgVGhlIGludDMyIHZhbHVlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGludCBWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB2YWx1ZV8gPSB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIEludDMyVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhJbnQzMlZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChWYWx1ZSAhPSBvdGhlci5WYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChWYWx1ZSAhPSAwKSBoYXNoIF49IFZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlSW50MzIoVmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIHNpemUgKz0gMSArIHBiOjpDb2RlZE91dHB1dFN0cmVhbS5Db21wdXRlSW50MzJTaXplKFZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShJbnQzMlZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVmFsdWUgIT0gMCkgewotICAgICAgICBWYWx1ZSA9IG90aGVyLlZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgVmFsdWUgPSBpbnB1dC5SZWFkSW50MzIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIFdyYXBwZXIgbWVzc2FnZSBmb3IgYHVpbnQzMmAuCi0gIC8vLwotICAvLy8gIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgVUludDMyVmFsdWVgIGlzIEpTT04gbnVtYmVyLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgVUludDMyVmFsdWUgOiBwYjo6SU1lc3NhZ2U8VUludDMyVmFsdWU+IHsKLSAgICBwcml2YXRlIHN0YXRpYyByZWFkb25seSBwYjo6TWVzc2FnZVBhcnNlcjxVSW50MzJWYWx1ZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxVSW50MzJWYWx1ZT4oKCkgPT4gbmV3IFVJbnQzMlZhbHVlKCkpOwotICAgIHB1YmxpYyBzdGF0aWMgcGI6Ok1lc3NhZ2VQYXJzZXI8VUludDMyVmFsdWU+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5XcmFwcGVyc1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNV07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIFVJbnQzMlZhbHVlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBVSW50MzJWYWx1ZShVSW50MzJWYWx1ZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgdmFsdWVfID0gb3RoZXIudmFsdWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBVSW50MzJWYWx1ZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgVUludDMyVmFsdWUodGhpcyk7Ci0gICAgfQotCi0gICAgLy8vIDxzdW1tYXJ5PkZpZWxkIG51bWJlciBmb3IgdGhlICJ2YWx1ZSIgZmllbGQuPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBjb25zdCBpbnQgVmFsdWVGaWVsZE51bWJlciA9IDE7Ci0gICAgcHJpdmF0ZSB1aW50IHZhbHVlXzsKLSAgICAvLy8gPHN1bW1hcnk+Ci0gICAgLy8vICBUaGUgdWludDMyIHZhbHVlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIHVpbnQgVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgdmFsdWVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBVSW50MzJWYWx1ZSk7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2wgRXF1YWxzKFVJbnQzMlZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCBudWxsKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoUmVmZXJlbmNlRXF1YWxzKG90aGVyLCB0aGlzKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChWYWx1ZSAhPSBvdGhlci5WYWx1ZSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGludCBHZXRIYXNoQ29kZSgpIHsKLSAgICAgIGludCBoYXNoID0gMTsKLSAgICAgIGlmIChWYWx1ZSAhPSAwKSBoYXNoIF49IFZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChWYWx1ZSAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZyg4KTsKLSAgICAgICAgb3V0cHV0LldyaXRlVUludDMyKFZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoVmFsdWUgIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVVJbnQzMlNpemUoVmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFVJbnQzMlZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVmFsdWUgIT0gMCkgewotICAgICAgICBWYWx1ZSA9IG90aGVyLlZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgODogewotICAgICAgICAgICAgVmFsdWUgPSBpbnB1dC5SZWFkVUludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBib29sYC4KLSAgLy8vCi0gIC8vLyAgVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBCb29sVmFsdWVgIGlzIEpTT04gYHRydWVgIGFuZCBgZmFsc2VgLgotICAvLy8gPC9zdW1tYXJ5PgotICBbZ2xvYmFsOjpTeXN0ZW0uRGlhZ25vc3RpY3MuRGVidWdnZXJOb25Vc2VyQ29kZUF0dHJpYnV0ZSgpXQotICBwdWJsaWMgc2VhbGVkIHBhcnRpYWwgY2xhc3MgQm9vbFZhbHVlIDogcGI6OklNZXNzYWdlPEJvb2xWYWx1ZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEJvb2xWYWx1ZT4gX3BhcnNlciA9IG5ldyBwYjo6TWVzc2FnZVBhcnNlcjxCb29sVmFsdWU+KCgpID0+IG5ldyBCb29sVmFsdWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxCb29sVmFsdWU+IFBhcnNlciB7IGdldCB7IHJldHVybiBfcGFyc2VyOyB9IH0KLQotICAgIHB1YmxpYyBzdGF0aWMgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBEZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBnbG9iYWw6Okdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcy5XcmFwcGVyc1JlZmxlY3Rpb24uRGVzY3JpcHRvci5NZXNzYWdlVHlwZXNbNl07IH0KLSAgICB9Ci0KLSAgICBwYnI6Ok1lc3NhZ2VEZXNjcmlwdG9yIHBiOjpJTWVzc2FnZS5EZXNjcmlwdG9yIHsKLSAgICAgIGdldCB7IHJldHVybiBEZXNjcmlwdG9yOyB9Ci0gICAgfQotCi0gICAgcHVibGljIEJvb2xWYWx1ZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgQm9vbFZhbHVlKEJvb2xWYWx1ZSBvdGhlcikgOiB0aGlzKCkgewotICAgICAgdmFsdWVfID0gb3RoZXIudmFsdWVfOwotICAgIH0KLQotICAgIHB1YmxpYyBCb29sVmFsdWUgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEJvb2xWYWx1ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBWYWx1ZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIGJvb2wgdmFsdWVfOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBib29sIHZhbHVlLgotICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgcHVibGljIGJvb2wgVmFsdWUgewotICAgICAgZ2V0IHsgcmV0dXJuIHZhbHVlXzsgfQotICAgICAgc2V0IHsKLSAgICAgICAgdmFsdWVfID0gdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBCb29sVmFsdWUpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sIEVxdWFscyhCb29sVmFsdWUgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKFZhbHVlICE9IG90aGVyLlZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKFZhbHVlICE9IGZhbHNlKSBoYXNoIF49IFZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChWYWx1ZSAhPSBmYWxzZSkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoOCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJvb2woVmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChWYWx1ZSAhPSBmYWxzZSkgewotICAgICAgICBzaXplICs9IDEgKyAxOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEJvb2xWYWx1ZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKG90aGVyLlZhbHVlICE9IGZhbHNlKSB7Ci0gICAgICAgIFZhbHVlID0gb3RoZXIuVmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKHBiOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgICB1aW50IHRhZzsKLSAgICAgIHdoaWxlICgodGFnID0gaW5wdXQuUmVhZFRhZygpKSAhPSAwKSB7Ci0gICAgICAgIHN3aXRjaCh0YWcpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgaW5wdXQuU2tpcExhc3RGaWVsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSA4OiB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGlucHV0LlJlYWRCb29sKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gIC8vLyA8c3VtbWFyeT4KLSAgLy8vICBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBzdHJpbmdgLgotICAvLy8KLSAgLy8vICBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFN0cmluZ1ZhbHVlYCBpcyBKU09OIHN0cmluZy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIFN0cmluZ1ZhbHVlIDogcGI6OklNZXNzYWdlPFN0cmluZ1ZhbHVlPiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgcmVhZG9ubHkgcGI6Ok1lc3NhZ2VQYXJzZXI8U3RyaW5nVmFsdWU+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8U3RyaW5nVmFsdWU+KCgpID0+IG5ldyBTdHJpbmdWYWx1ZSgpKTsKLSAgICBwdWJsaWMgc3RhdGljIHBiOjpNZXNzYWdlUGFyc2VyPFN0cmluZ1ZhbHVlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuV3JhcHBlcnNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzddOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBTdHJpbmdWYWx1ZSgpIHsKLSAgICAgIE9uQ29uc3RydWN0aW9uKCk7Ci0gICAgfQotCi0gICAgcGFydGlhbCB2b2lkIE9uQ29uc3RydWN0aW9uKCk7Ci0KLSAgICBwdWJsaWMgU3RyaW5nVmFsdWUoU3RyaW5nVmFsdWUgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU3RyaW5nVmFsdWUgQ2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZ1ZhbHVlKHRoaXMpOwotICAgIH0KLQotICAgIC8vLyA8c3VtbWFyeT5GaWVsZCBudW1iZXIgZm9yIHRoZSAidmFsdWUiIGZpZWxkLjwvc3VtbWFyeT4KLSAgICBwdWJsaWMgY29uc3QgaW50IFZhbHVlRmllbGROdW1iZXIgPSAxOwotICAgIHByaXZhdGUgc3RyaW5nIHZhbHVlXyA9ICIiOwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBzdHJpbmcgdmFsdWUuCi0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RyaW5nIFZhbHVlIHsKLSAgICAgIGdldCB7IHJldHVybiB2YWx1ZV87IH0KLSAgICAgIHNldCB7Ci0gICAgICAgIHZhbHVlXyA9IHBiOjpQcm90b1ByZWNvbmRpdGlvbnMuQ2hlY2tOb3ROdWxsKHZhbHVlLCAidmFsdWUiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgYm9vbCBFcXVhbHMob2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gRXF1YWxzKG90aGVyIGFzIFN0cmluZ1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoU3RyaW5nVmFsdWUgb3RoZXIpIHsKLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIG51bGwpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChSZWZlcmVuY2VFcXVhbHMob3RoZXIsIHRoaXMpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKFZhbHVlICE9IG90aGVyLlZhbHVlKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgaW50IEdldEhhc2hDb2RlKCkgewotICAgICAgaW50IGhhc2ggPSAxOwotICAgICAgaWYgKFZhbHVlLkxlbmd0aCAhPSAwKSBoYXNoIF49IFZhbHVlLkdldEhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gaGFzaDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgb3ZlcnJpZGUgc3RyaW5nIFRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIHBiOjpKc29uRm9ybWF0dGVyLlRvRGlhZ25vc3RpY1N0cmluZyh0aGlzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBXcml0ZVRvKHBiOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICAgIGlmIChWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBvdXRwdXQuV3JpdGVSYXdUYWcoMTApOwotICAgICAgICBvdXRwdXQuV3JpdGVTdHJpbmcoVmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgQ2FsY3VsYXRlU2l6ZSgpIHsKLSAgICAgIGludCBzaXplID0gMDsKLSAgICAgIGlmIChWYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBzaXplICs9IDEgKyBwYjo6Q29kZWRPdXRwdXRTdHJlYW0uQ29tcHV0ZVN0cmluZ1NpemUoVmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKFN0cmluZ1ZhbHVlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAob3RoZXIuVmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgVmFsdWUgPSBvdGhlci5WYWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBNZXJnZUZyb20ocGI6OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICAgIHVpbnQgdGFnOwotICAgICAgd2hpbGUgKCh0YWcgPSBpbnB1dC5SZWFkVGFnKCkpICE9IDApIHsKLSAgICAgICAgc3dpdGNoKHRhZykgewotICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBpbnB1dC5Ta2lwTGFzdEZpZWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgICAgICBWYWx1ZSA9IGlucHV0LlJlYWRTdHJpbmcoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICB9Ci0KLSAgLy8vIDxzdW1tYXJ5PgotICAvLy8gIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGJ5dGVzYC4KLSAgLy8vCi0gIC8vLyAgVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBCeXRlc1ZhbHVlYCBpcyBKU09OIHN0cmluZy4KLSAgLy8vIDwvc3VtbWFyeT4KLSAgW2dsb2JhbDo6U3lzdGVtLkRpYWdub3N0aWNzLkRlYnVnZ2VyTm9uVXNlckNvZGVBdHRyaWJ1dGUoKV0KLSAgcHVibGljIHNlYWxlZCBwYXJ0aWFsIGNsYXNzIEJ5dGVzVmFsdWUgOiBwYjo6SU1lc3NhZ2U8Qnl0ZXNWYWx1ZT4gewotICAgIHByaXZhdGUgc3RhdGljIHJlYWRvbmx5IHBiOjpNZXNzYWdlUGFyc2VyPEJ5dGVzVmFsdWU+IF9wYXJzZXIgPSBuZXcgcGI6Ok1lc3NhZ2VQYXJzZXI8Qnl0ZXNWYWx1ZT4oKCkgPT4gbmV3IEJ5dGVzVmFsdWUoKSk7Ci0gICAgcHVibGljIHN0YXRpYyBwYjo6TWVzc2FnZVBhcnNlcjxCeXRlc1ZhbHVlPiBQYXJzZXIgeyBnZXQgeyByZXR1cm4gX3BhcnNlcjsgfSB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHBicjo6TWVzc2FnZURlc2NyaXB0b3IgRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gZ2xvYmFsOjpHb29nbGUuUHJvdG9idWYuV2VsbEtub3duVHlwZXMuV3JhcHBlcnNSZWZsZWN0aW9uLkRlc2NyaXB0b3IuTWVzc2FnZVR5cGVzWzhdOyB9Ci0gICAgfQotCi0gICAgcGJyOjpNZXNzYWdlRGVzY3JpcHRvciBwYjo6SU1lc3NhZ2UuRGVzY3JpcHRvciB7Ci0gICAgICBnZXQgeyByZXR1cm4gRGVzY3JpcHRvcjsgfQotICAgIH0KLQotICAgIHB1YmxpYyBCeXRlc1ZhbHVlKCkgewotICAgICAgT25Db25zdHJ1Y3Rpb24oKTsKLSAgICB9Ci0KLSAgICBwYXJ0aWFsIHZvaWQgT25Db25zdHJ1Y3Rpb24oKTsKLQotICAgIHB1YmxpYyBCeXRlc1ZhbHVlKEJ5dGVzVmFsdWUgb3RoZXIpIDogdGhpcygpIHsKLSAgICAgIHZhbHVlXyA9IG90aGVyLnZhbHVlXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnl0ZXNWYWx1ZSBDbG9uZSgpIHsKLSAgICAgIHJldHVybiBuZXcgQnl0ZXNWYWx1ZSh0aGlzKTsKLSAgICB9Ci0KLSAgICAvLy8gPHN1bW1hcnk+RmllbGQgbnVtYmVyIGZvciB0aGUgInZhbHVlIiBmaWVsZC48L3N1bW1hcnk+Ci0gICAgcHVibGljIGNvbnN0IGludCBWYWx1ZUZpZWxkTnVtYmVyID0gMTsKLSAgICBwcml2YXRlIHBiOjpCeXRlU3RyaW5nIHZhbHVlXyA9IHBiOjpCeXRlU3RyaW5nLkVtcHR5OwotICAgIC8vLyA8c3VtbWFyeT4KLSAgICAvLy8gIFRoZSBieXRlcyB2YWx1ZS4KLSAgICAvLy8gPC9zdW1tYXJ5PgotICAgIHB1YmxpYyBwYjo6Qnl0ZVN0cmluZyBWYWx1ZSB7Ci0gICAgICBnZXQgeyByZXR1cm4gdmFsdWVfOyB9Ci0gICAgICBzZXQgewotICAgICAgICB2YWx1ZV8gPSBwYjo6UHJvdG9QcmVjb25kaXRpb25zLkNoZWNrTm90TnVsbCh2YWx1ZSwgInZhbHVlIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIG92ZXJyaWRlIGJvb2wgRXF1YWxzKG9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIEVxdWFscyhvdGhlciBhcyBCeXRlc1ZhbHVlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbCBFcXVhbHMoQnl0ZXNWYWx1ZSBvdGhlcikgewotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgbnVsbCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKFJlZmVyZW5jZUVxdWFscyhvdGhlciwgdGhpcykpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoVmFsdWUgIT0gb3RoZXIuVmFsdWUpIHJldHVybiBmYWxzZTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBpbnQgR2V0SGFzaENvZGUoKSB7Ci0gICAgICBpbnQgaGFzaCA9IDE7Ci0gICAgICBpZiAoVmFsdWUuTGVuZ3RoICE9IDApIGhhc2ggXj0gVmFsdWUuR2V0SGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBoYXNoOwotICAgIH0KLQotICAgIHB1YmxpYyBvdmVycmlkZSBzdHJpbmcgVG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gcGI6Okpzb25Gb3JtYXR0ZXIuVG9EaWFnbm9zdGljU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIFdyaXRlVG8ocGI6OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgICAgaWYgKFZhbHVlLkxlbmd0aCAhPSAwKSB7Ci0gICAgICAgIG91dHB1dC5Xcml0ZVJhd1RhZygxMCk7Ci0gICAgICAgIG91dHB1dC5Xcml0ZUJ5dGVzKFZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IENhbGN1bGF0ZVNpemUoKSB7Ci0gICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICBpZiAoVmFsdWUuTGVuZ3RoICE9IDApIHsKLSAgICAgICAgc2l6ZSArPSAxICsgcGI6OkNvZGVkT3V0cHV0U3RyZWFtLkNvbXB1dGVCeXRlc1NpemUoVmFsdWUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgTWVyZ2VGcm9tKEJ5dGVzVmFsdWUgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChvdGhlci5WYWx1ZS5MZW5ndGggIT0gMCkgewotICAgICAgICBWYWx1ZSA9IG90aGVyLlZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIE1lcmdlRnJvbShwYjo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgewotICAgICAgdWludCB0YWc7Ci0gICAgICB3aGlsZSAoKHRhZyA9IGlucHV0LlJlYWRUYWcoKSkgIT0gMCkgewotICAgICAgICBzd2l0Y2godGFnKSB7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGlucHV0LlNraXBMYXN0RmllbGQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgICAgIFZhbHVlID0gaW5wdXQuUmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgfQotCi0gICNlbmRyZWdpb24KLQotfQotCi0jZW5kcmVnaW9uIERlc2lnbmVyIGdlbmVyYXRlZCBjb2RlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9XcmFwcGVyc1BhcnRpYWwuY3MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9XZWxsS25vd25UeXBlcy9XcmFwcGVyc1BhcnRpYWwuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlmNjIwZWIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2VsbEtub3duVHlwZXMvV3JhcHBlcnNQYXJ0aWFsLmNzCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAot77u/I3JlZ2lvbiBDb3B5cmlnaHQgbm90aWNlIGFuZCBsaWNlbnNlCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNlbmRyZWdpb24KLQotbmFtZXNwYWNlIEdvb2dsZS5Qcm90b2J1Zi5XZWxsS25vd25UeXBlcwotewotICAgIHB1YmxpYyBzdGF0aWMgcGFydGlhbCBjbGFzcyBXcmFwcGVyc1JlZmxlY3Rpb24KLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIEZpZWxkIG51bWJlciBmb3IgdGhlIHNpbmdsZSAidmFsdWUiIGZpZWxkIGluIGFsbCB3cmFwcGVyIHR5cGVzLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBpbnRlcm5hbCBjb25zdCBpbnQgV3JhcHBlclZhbHVlRmllbGROdW1iZXIgPSBJbnQzMlZhbHVlLlZhbHVlRmllbGROdW1iZXI7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2lyZUZvcm1hdC5jcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL1dpcmVGb3JtYXQuY3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODRkYTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY3NoYXJwL3NyYy9Hb29nbGUuUHJvdG9idWYvV2lyZUZvcm1hdC5jcworKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0jcmVnaW9uIENvcHlyaWdodCBub3RpY2UgYW5kIGxpY2Vuc2UKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotI2VuZHJlZ2lvbgotCi1uYW1lc3BhY2UgR29vZ2xlLlByb3RvYnVmCi17Ci0gICAgLy8vIDxzdW1tYXJ5PgotICAgIC8vLyBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgUHJvdG9jb2wgQnVmZmVyIExpYnJhcnkgYW5kIGdlbmVyYXRlZAotICAgIC8vLyBtZXNzYWdlIGltcGxlbWVudGF0aW9ucy4gSXQgaXMgcHVibGljIG9ubHkgZm9yIHRoZSBzYWtlIG9mIHRob3NlIGdlbmVyYXRlZAotICAgIC8vLyBtZXNzYWdlcy4gT3RoZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuCi0gICAgLy8vIDxwYXJhPgotICAgIC8vLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB1c2VmdWwgZm9yIGRlYWxpbmcgd2l0aAotICAgIC8vLyB0aGUgUHJvdG9jb2wgQnVmZmVyIHdpcmUgZm9ybWF0LgotICAgIC8vLyA8L3BhcmE+Ci0gICAgLy8vIDwvc3VtbWFyeT4KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIFdpcmVGb3JtYXQKLSAgICB7Ci0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIFdpcmUgdHlwZXMgd2l0aGluIHByb3RvYnVmIGVuY29kaW5nLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgZW51bSBXaXJlVHlwZSA6IHVpbnQKLSAgICAgICAgewotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIFZhcmlhYmxlLWxlbmd0aCBpbnRlZ2VyLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIFZhcmludCA9IDAsCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQSBmaXhlZC1sZW5ndGggNjQtYml0IHZhbHVlLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIEZpeGVkNjQgPSAxLAotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIEEgbGVuZ3RoLWRlbGltaXRlZCB2YWx1ZSwgaS5lLiBhIGxlbmd0aCBmb2xsb3dlZCBieSB0aGF0IG1hbnkgYnl0ZXMgb2YgZGF0YS4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBMZW5ndGhEZWxpbWl0ZWQgPSAyLAotICAgICAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAgICAgLy8vIEEgInN0YXJ0IGdyb3VwIiB2YWx1ZSAtIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBTdGFydEdyb3VwID0gMywKLSAgICAgICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgICAgIC8vLyBBbiAiZW5kIGdyb3VwIiB2YWx1ZSAtIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgICAgICBFbmRHcm91cCA9IDQsCi0gICAgICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgICAgICAvLy8gQSBmaXhlZC1sZW5ndGggMzItYml0IHZhbHVlLgotICAgICAgICAgICAgLy8vIDwvc3VtbWFyeT4KLSAgICAgICAgICAgIEZpeGVkMzIgPSA1Ci0gICAgICAgIH0KLSAgICAgICAgCi0gICAgICAgIHByaXZhdGUgY29uc3QgaW50IFRhZ1R5cGVCaXRzID0gMzsKLSAgICAgICAgcHJpdmF0ZSBjb25zdCB1aW50IFRhZ1R5cGVNYXNrID0gKDEgPDwgVGFnVHlwZUJpdHMpIC0gMTsKLQotICAgICAgICAvLy8gPHN1bW1hcnk+Ci0gICAgICAgIC8vLyBHaXZlbiBhIHRhZyB2YWx1ZSwgZGV0ZXJtaW5lcyB0aGUgd2lyZSB0eXBlIChsb3dlciAzIGJpdHMpLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIFdpcmVUeXBlIEdldFRhZ1dpcmVUeXBlKHVpbnQgdGFnKQotICAgICAgICB7Ci0gICAgICAgICAgICByZXR1cm4gKFdpcmVUeXBlKSAodGFnICYgVGFnVHlwZU1hc2spOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8vIDxzdW1tYXJ5PgotICAgICAgICAvLy8gR2l2ZW4gYSB0YWcgdmFsdWUsIGRldGVybWluZXMgdGhlIGZpZWxkIG51bWJlciAodGhlIHVwcGVyIDI5IGJpdHMpLgotICAgICAgICAvLy8gPC9zdW1tYXJ5PgotICAgICAgICBwdWJsaWMgc3RhdGljIGludCBHZXRUYWdGaWVsZE51bWJlcih1aW50IHRhZykKLSAgICAgICAgewotICAgICAgICAgICAgcmV0dXJuIChpbnQpIHRhZyA+PiBUYWdUeXBlQml0czsKLSAgICAgICAgfQotCi0gICAgICAgIC8vLyA8c3VtbWFyeT4KLSAgICAgICAgLy8vIE1ha2VzIGEgdGFnIHZhbHVlIGdpdmVuIGEgZmllbGQgbnVtYmVyIGFuZCB3aXJlIHR5cGUuCi0gICAgICAgIC8vLyA8L3N1bW1hcnk+Ci0gICAgICAgIHB1YmxpYyBzdGF0aWMgdWludCBNYWtlVGFnKGludCBmaWVsZE51bWJlciwgV2lyZVR5cGUgd2lyZVR5cGUpCi0gICAgICAgIHsKLSAgICAgICAgICAgIHJldHVybiAodWludCkgKGZpZWxkTnVtYmVyIDw8IFRhZ1R5cGVCaXRzKSB8ICh1aW50KSB3aXJlVHlwZTsKLSAgICAgICAgfSAgICAgICAgCi0gICAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL3BhY2thZ2VzLmNvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvR29vZ2xlLlByb3RvYnVmL3BhY2thZ2VzLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDBiOGZkOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL0dvb2dsZS5Qcm90b2J1Zi9wYWNrYWdlcy5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cGFja2FnZXM+Ci0gIDxwYWNrYWdlIGlkPSJOdVNwZWMuUmVmZXJlbmNlR2VuZXJhdG9yIiB2ZXJzaW9uPSIxLjQuMSIgdGFyZ2V0RnJhbWV3b3JrPSJwb3J0YWJsZTQ1LW5ldDQ1K3dpbjgrd3A4K3dwYTgxIiBkZXZlbG9wbWVudERlcGVuZGVuY3k9InRydWUiIC8+Ci08L3BhY2thZ2VzPgpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvcGFja2FnZXMvcmVwb3NpdG9yaWVzLmNvbmZpZyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NzaGFycC9zcmMvcGFja2FnZXMvcmVwb3NpdG9yaWVzLmNvbmZpZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzAzNzk0MS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jc2hhcnAvc3JjL3BhY2thZ2VzL3JlcG9zaXRvcmllcy5jb25maWcKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLe+7vzw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9InV0Zi04Ij8+Ci08cmVwb3NpdG9yaWVzPgotICA8cmVwb3NpdG9yeSBwYXRoPSIuLlxHb29nbGUuUHJvdG9idWYuVGVzdFxwYWNrYWdlcy5jb25maWciIC8+Ci08L3JlcG9zaXRvcmllcz4KXCBObyBuZXdsaW5lIGF0IGVuZCBvZiBmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNjBkOWFjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLVByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9wcm90b2J1Zi5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9nb29nbGUvcHJvdG9idWYpCi0KLUNvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0KLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBKYXZhIFByb3RvY29sIEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5LgotCi1JbnN0YWxsYXRpb24gLSBXaXRoIE1hdmVuCi09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRoZSBQcm90b2NvbCBCdWZmZXJzIGJ1aWxkIGlzIG1hbmFnZWQgdXNpbmcgTWF2ZW4uICBJZiB5b3Ugd291bGQKLXJhdGhlciBidWlsZCB3aXRob3V0IE1hdmVuLCBzZWUgYmVsb3cuCi0KLTEpIEluc3RhbGwgQXBhY2hlIE1hdmVuIGlmIHlvdSBkb24ndCBoYXZlIGl0OgotCi0gICAgIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLwotCi0yKSBCdWlsZCB0aGUgQysrIGNvZGUsIG9yIG9idGFpbiBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgcHJvdG9jLiAgSWYKLSAgIHlvdSBpbnN0YWxsIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIHNhbWUKLSAgIHZlcnNpb24gYXMgdGhpcyBwYWNrYWdlLiAgSWYgaW4gZG91YnQsIHJ1bjoKLQotICAgICAkIHByb3RvYyAtLXZlcnNpb24KLQotICAgWW91IHdpbGwgbmVlZCB0byBwbGFjZSB0aGUgcHJvdG9jIGV4ZWN1dGFibGUgaW4gLi4vc3JjLiAgKElmIHlvdQotICAgYnVpbHQgaXQgeW91cnNlbGYsIGl0IHNob3VsZCBhbHJlYWR5IGJlIHRoZXJlLikKLQotMykgUnVuIHRoZSB0ZXN0czoKLQotICAgICAkIG12biB0ZXN0Ci0KLSAgIElmIHNvbWUgdGVzdHMgZmFpbCwgdGhpcyBsaWJyYXJ5IG1heSBub3Qgd29yayBjb3JyZWN0bHkgb24geW91cgotICAgc3lzdGVtLiAgQ29udGludWUgYXQgeW91ciBvd24gcmlzay4KLQotNCkgSW5zdGFsbCB0aGUgbGlicmFyeSBpbnRvIHlvdXIgTWF2ZW4gcmVwb3NpdG9yeToKLQotICAgICAkIG12biBpbnN0YWxsCi0KLTUpIElmIHlvdSBkbyBub3QgdXNlIE1hdmVuIHRvIG1hbmFnZSB5b3VyIG93biBidWlsZCwgeW91IGNhbiBidWlsZCBhCi0gICAuamFyIGZpbGUgdG8gdXNlOgotCi0gICAgICQgbXZuIHBhY2thZ2UKLQotICAgVGhlIC5qYXIgd2lsbCBiZSBwbGFjZWQgaW4gdGhlICJ0YXJnZXQiIGRpcmVjdG9yeS4KLQotSW5zdGFsbGF0aW9uIC0gJ0xpdGUnIFZlcnNpb24gLSBXaXRoIE1hdmVuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQnVpbGRpbmcgdGhlICdsaXRlJyB2ZXJzaW9uIG9mIHRoZSBKYXZhIFByb3RvY29sIEJ1ZmZlcnMgbGlicmFyeSBpcwotdGhlIHNhbWUgYXMgYnVpbGRpbmcgdGhlIGZ1bGwgdmVyc2lvbiwgZXhjZXB0IHRoYXQgYWxsIGNvbW1hbmRzIGFyZQotcnVuIHVzaW5nIHRoZSAnbGl0ZScgcHJvZmlsZS4gIChzZWUKLWh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL2d1aWRlcy9pbnRyb2R1Y3Rpb24vaW50cm9kdWN0aW9uLXRvLXByb2ZpbGVzLmh0bWwpCi0KLUUuZy4gdG8gaW5zdGFsbCB0aGUgbGl0ZSB2ZXJzaW9uIG9mIHRoZSBqYXIsIHlvdSB3b3VsZCBydW46Ci0KLSAgICAkIG12biBpbnN0YWxsIC1QIGxpdGUKLQotVGhlIHJlc3VsdGluZyBhcnRpZmFjdCBoYXMgdGhlICdsaXRlJyBjbGFzc2lmaWVyLiAgVG8gcmVmZXJlbmNlIGl0Ci1mb3IgZGVwZW5kZW5jeSByZXNvbHV0aW9uLCB5b3Ugd291bGQgc3BlY2lmeSBpdCBhczoKLQotYGBgCi0gIDxkZXBlbmRlbmN5PgotICAgIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWY8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+cHJvdG9idWYtamF2YTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxjbGFzc2lmaWVyPmxpdGU8L2NsYXNzaWZpZXI+Ci0gIDwvZGVwZW5kZW5jeT4KLWBgYAotCi1JbnN0YWxsYXRpb24gLSBXaXRob3V0IE1hdmVuCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdSB3b3VsZCByYXRoZXIgbm90IGluc3RhbGwgTWF2ZW4gdG8gYnVpbGQgdGhlIGxpYnJhcnksIHlvdSBtYXkKLWZvbGxvdyB0aGVzZSBpbnN0cnVjdGlvbnMgaW5zdGVhZC4gIE5vdGUgdGhhdCB0aGVzZSBpbnN0cnVjdGlvbnMgc2tpcAotcnVubmluZyB1bml0IHRlc3RzLgotCi0xKSBCdWlsZCB0aGUgQysrIGNvZGUsIG9yIG9idGFpbiBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgcHJvdG9jLiAgSWYKLSAgIHlvdSBpbnN0YWxsIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIHNhbWUKLSAgIHZlcnNpb24gYXMgdGhpcyBwYWNrYWdlLiAgSWYgaW4gZG91YnQsIHJ1bjoKLQotICAgICAkIHByb3RvYyAtLXZlcnNpb24KLQotICAgSWYgeW91IGJ1aWx0IHRoZSBDKysgY29kZSB3aXRob3V0IGluc3RhbGxpbmcsIHRoZSBjb21waWxlciBiaW5hcnkKLSAgIHNob3VsZCBiZSBsb2NhdGVkIGluIC4uL3NyYy4KLQotMikgSW52b2tlIHByb3RvYyB0byBidWlsZCBEZXNjcmlwdG9yUHJvdG9zLmphdmE6Ci0KLSAgICAgJCBwcm90b2MgLS1qYXZhX291dD1zcmMvbWFpbi9qYXZhIC1JLi4vc3JjIFwKLSAgICAgICAgIC4uL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwotCi0zKSBDb21waWxlIHRoZSBjb2RlIGluIHNyYy9tYWluL2phdmEgdXNpbmcgd2hhdGV2ZXIgbWVhbnMgeW91IHByZWZlci4KLQotNCkgSW5zdGFsbCB0aGUgY2xhc3NlcyB3aGVyZXZlciB5b3UgcHJlZmVyLgotCi1Vc2FnZQotPT09PT0KLQotVGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gZm9yIFByb3RvY29sIEJ1ZmZlcnMgaXMgYXZhaWxhYmxlIHZpYSB0aGUKLXdlYiBhdDoKLQotICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL2dlbmVyYXRlLXNvdXJjZXMtYnVpbGQueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL2dlbmVyYXRlLXNvdXJjZXMtYnVpbGQueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwOTk2ZTVmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9nZW5lcmF0ZS1zb3VyY2VzLWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDIwICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImdlbmVyYXRlLXNvdXJjZXMiPgotICAgIDxlY2hvIG1lc3NhZ2U9IlJ1bm5pbmcgcHJvdG9jIC4uLiIvPgotICAgIDxta2RpciBkaXI9IiR7Z2VuZXJhdGVkLnNvdXJjZXMuZGlyfSIvPgotICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7cHJvdG9jfSI+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YV9vdXQ9JHtnZW5lcmF0ZWQuc291cmNlcy5kaXJ9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD0ke3Byb3RvYnVmLnNvdXJjZS5kaXJ9Ii8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdHlwZS5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8iLz4KLSAgICA8L2V4ZWM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL2dlbmVyYXRlLXRlc3Qtc291cmNlcy1idWlsZC54bWwgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvZ2VuZXJhdGUtdGVzdC1zb3VyY2VzLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWI0MTVkYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvZ2VuZXJhdGUtdGVzdC1zb3VyY2VzLWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImdlbmVyYXRlLXRlc3Qtc291cmNlcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQudGVzdHNvdXJjZXMuZGlyfSIvPgotICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7cHJvdG9jfSI+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YV9vdXQ9JHtnZW5lcmF0ZWQudGVzdHNvdXJjZXMuZGlyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9JHtwcm90b2J1Zi5zb3VyY2UuZGlyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9JHt0ZXN0LnByb3RvLmRpcn0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL2xhenlfZmllbGRzX2xpdGUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9saXRlX2VxdWFsc19hbmRfaGFzaC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL211bHRpcGxlX2ZpbGVzX3Rlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfYnVpbGRlcnNfdGVzdC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb24ucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9vdXRlcl9jbGFzc19uYW1lX3Rlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9vdXRlcl9jbGFzc19uYW1lX3Rlc3QyLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvb3V0ZXJfY2xhc3NfbmFtZV90ZXN0My5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9jaGVja191dGY4LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9jaGVja191dGY4X3NpemUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9wcmVzZW5jZV90ZXN0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2Zvcl9wcm90bzJfbGl0ZV90ZXN0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2Zvcl9wcm90bzJfdGVzdC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2luaXRpYWxpemF0aW9uX29yZGVyX3Rlc3QucHJvdG8iLz4KLSAgICA8L2V4ZWM+Ci08L3Byb2plY3Q+ClwgTm8gbmV3bGluZSBhdCBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3BvbS54bWwgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ0YzVjNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLnByb3RvYnVmPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPnByb3RvYnVmLXBhcmVudDwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4zLjAuMC1iZXRhLTM8L3ZlcnNpb24+Ci0gIDwvcGFyZW50PgotCi0gIDxhcnRpZmFjdElkPnByb3RvYnVmLWphdmE8L2FydGlmYWN0SWQ+Ci0gIDxwYWNrYWdpbmc+YnVuZGxlPC9wYWNrYWdpbmc+Ci0KLSAgPG5hbWU+UHJvdG9jb2wgQnVmZmVycyBbQ29yZV08L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBDb3JlIFByb3RvY29sIEJ1ZmZlcnMgbGlicmFyeS4gUHJvdG9jb2wgQnVmZmVycyBhcmUgYSB3YXkgb2YgZW5jb2Rpbmcgc3RydWN0dXJlZCBkYXRhIGluIGFuCi0gICAgZWZmaWNpZW50IHlldCBleHRlbnNpYmxlIGZvcm1hdC4KLSAgPC9kZXNjcmlwdGlvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9ja2NsYXNzZXh0ZW5zaW9uPC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgPC9kZXBlbmRlbmNpZXM+Ci0KLSAgPGJ1aWxkPgotICAgIDwhLS0gSW5jbHVkZSBjb3JlIHByb3RvcyBpbiB0aGUgYnVuZGxlIGFzIHJlc291cmNlcyAtLT4KLSAgICA8cmVzb3VyY2VzPgotICAgICAgPHJlc291cmNlPgotICAgICAgICA8ZGlyZWN0b3J5PiR7cHJvdG9idWYuc291cmNlLmRpcn08L2RpcmVjdG9yeT4KLSAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgIDxpbmNsdWRlPmdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG88L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+Z29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bzwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT5nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bzwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT5nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG88L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+Z29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvPC9pbmNsdWRlPgotICAgICAgICAgIDxpbmNsdWRlPmdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvPC9pbmNsdWRlPgotICAgICAgICAgIDxpbmNsdWRlPmdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bzwvaW5jbHVkZT4KLSAgICAgICAgICA8aW5jbHVkZT5nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvPC9pbmNsdWRlPgotICAgICAgICAgIDxpbmNsdWRlPmdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG88L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+Z29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG88L2luY2x1ZGU+Ci0gICAgICAgICAgPGluY2x1ZGU+Z29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvPC9pbmNsdWRlPgotICAgICAgICAgIDxpbmNsdWRlPmdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG88L2luY2x1ZGU+Ci0gICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICA8L3Jlc291cmNlPgotICAgIDwvcmVzb3VyY2VzPgotCi0gICAgPHBsdWdpbnM+Ci0gICAgICA8IS0tIFVzZSBBbnRydW4gcGx1Z2luIHRvIGdlbmVyYXRlIHNvdXJjZXMgd2l0aCBwcm90b2MgLS0+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1hbnRydW4tcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICA8IS0tIEdlbmVyYXRlIGNvcmUgcHJvdG9zIC0tPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHRhcmdldD4KLSAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9ImdlbmVyYXRlLXNvdXJjZXMtYnVpbGQueG1sIi8+Ci0gICAgICAgICAgICAgIDwvdGFyZ2V0PgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotCi0gICAgICAgICAgPCEtLSBHZW5lcmF0ZSB0aGUgdGVzdCBwcm90b3MgLS0+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHRhcmdldD4KLSAgICAgICAgICAgICAgICA8YW50IGFudGZpbGU9ImdlbmVyYXRlLXRlc3Qtc291cmNlcy1idWlsZC54bWwiLz4KLSAgICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgIDwvcGx1Z2luPgotCi0gICAgICA8IS0tIEFkZCB0aGUgZ2VuZXJhdGVkIHNvdXJjZXMgdG8gdGhlIGJ1aWxkIC0tPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8Z2VuZXJhdGVkU291cmNlc0RpcmVjdG9yeT4ke2dlbmVyYXRlZC5zb3VyY2VzLmRpcn08L2dlbmVyYXRlZFNvdXJjZXNEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGdlbmVyYXRlZFRlc3RTb3VyY2VzRGlyZWN0b3J5PiR7Z2VuZXJhdGVkLnRlc3Rzb3VyY2VzLmRpcn08L2dlbmVyYXRlZFRlc3RTb3VyY2VzRGlyZWN0b3J5PgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLQotICAgICAgPCEtLSBPU0dJIGJ1bmRsZSBjb25maWd1cmF0aW9uIC0tPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgIDxCdW5kbGUtRG9jVVJMPmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvPC9CdW5kbGUtRG9jVVJMPgotICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+Y29tLmdvb2dsZS5wcm90b2J1ZjwvQnVuZGxlLVN5bWJvbGljTmFtZT4KLSAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT5jb20uZ29vZ2xlLnByb3RvYnVmO3ZlcnNpb249JHtwcm9qZWN0LnZlcnNpb259PC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDNjMGQ1Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTUzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNZXNzYWdlfSBpbnRlcmZhY2Ugd2hpY2ggaW1wbGVtZW50cwotICogYXMgbWFueSBtZXRob2RzIG9mIHRoYXQgaW50ZXJmYWNlIGFzIHBvc3NpYmxlIGluIHRlcm1zIG9mIG90aGVyIG1ldGhvZHMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWVzc2FnZQotICAgIC8vIFRPRE8oZHdlaXMpOiBVcGRhdGUgR2VuZXJhdGVkTWVzc2FnZSB0byBwYXJhbWV0ZXJpemUgd2l0aCBNZXNzYWdlVHlwZSBhbmQgQnVpbGRlclR5cGUuCi0gICAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VMaXRlCi0gICAgaW1wbGVtZW50cyBNZXNzYWdlIHsKLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIHJldHVybiBNZXNzYWdlUmVmbGVjdGlvbi5pc0luaXRpYWxpemVkKHRoaXMpOwotICB9Ci0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3Q8U3RyaW5nPiBmaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VSZWZsZWN0aW9uLmZpbmRNaXNzaW5nRmllbGRzKHRoaXMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIHsKLSAgICByZXR1cm4gTWVzc2FnZVJlZmxlY3Rpb24uZGVsaW1pdFdpdGhDb21tYXMoZmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpOwotICB9Ci0KLSAgLyoqIFRPRE8oamllbHVvKTogQ2xlYXIgaXQgd2hlbiBhbGwgc3ViY2xhc3NlcyBoYXZlIGltcGxlbWVudGVkIHRoaXMgbWV0aG9kLiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaGFzT25lb2YoT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCJoYXNPbmVvZigpIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKLSAgfQotCi0gIC8qKiBUT0RPKGppZWx1byk6IENsZWFyIGl0IHdoZW4gYWxsIHN1YmNsYXNzZXMgaGF2ZSBpbXBsZW1lbnRlZCB0aGlzIG1ldGhvZC4gKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAiZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoKSBpcyBub3QgaW1wbGVtZW50ZWQuIik7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gVGV4dEZvcm1hdC5wcmludFRvU3RyaW5nKHRoaXMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIE1lc3NhZ2VSZWZsZWN0aW9uLndyaXRlTWVzc2FnZVRvKHRoaXMsIGdldEFsbEZpZWxkcygpLCBvdXRwdXQsIGZhbHNlKTsKLSAgfQotCi0gIHByb3RlY3RlZCBpbnQgbWVtb2l6ZWRTaXplID0gLTE7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgaW50IHNpemUgPSBtZW1vaXplZFNpemU7Ci0gICAgaWYgKHNpemUgIT0gLTEpIHsKLSAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIG1lbW9pemVkU2l6ZSA9IE1lc3NhZ2VSZWZsZWN0aW9uLmdldFNlcmlhbGl6ZWRTaXplKHRoaXMsIGdldEFsbEZpZWxkcygpKTsKLSAgICByZXR1cm4gbWVtb2l6ZWRTaXplOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb3RoZXIpIHsKLSAgICBpZiAob3RoZXIgPT0gdGhpcykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgTWVzc2FnZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZmluYWwgTWVzc2FnZSBvdGhlck1lc3NhZ2UgPSAoTWVzc2FnZSkgb3RoZXI7Ci0gICAgaWYgKGdldERlc2NyaXB0b3JGb3JUeXBlKCkgIT0gb3RoZXJNZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIGNvbXBhcmVGaWVsZHMoZ2V0QWxsRmllbGRzKCksIG90aGVyTWVzc2FnZS5nZXRBbGxGaWVsZHMoKSkgJiYKLSAgICAgICAgZ2V0VW5rbm93bkZpZWxkcygpLmVxdWFscyhvdGhlck1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIGludCBoYXNoID0gbWVtb2l6ZWRIYXNoQ29kZTsKLSAgICBpZiAoaGFzaCA9PSAwKSB7Ci0gICAgICBoYXNoID0gNDE7Ci0gICAgICBoYXNoID0gKDE5ICogaGFzaCkgKyBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmhhc2hDb2RlKCk7Ci0gICAgICBoYXNoID0gaGFzaEZpZWxkcyhoYXNoLCBnZXRBbGxGaWVsZHMoKSk7Ci0gICAgICBoYXNoID0gKDI5ICogaGFzaCkgKyBnZXRVbmtub3duRmllbGRzKCkuaGFzaENvZGUoKTsKLSAgICAgIG1lbW9pemVkSGFzaENvZGUgPSBoYXNoOwotICAgIH0KLSAgICByZXR1cm4gaGFzaDsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyB0b0J5dGVTdHJpbmcoT2JqZWN0IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbSgoYnl0ZVtdKSB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoQnl0ZVN0cmluZykgdmFsdWU7Ci0gICAgfQotICB9Ci0gCi0gIC8qKgotICAgKiBDb21wYXJlcyB0d28gYnl0ZXMgZmllbGRzLiBUaGUgcGFyYW1ldGVycyBtdXN0IGJlIGVpdGhlciBhIGJ5dGUgYXJyYXkgb3IgYQotICAgKiBCeXRlU3RyaW5nIG9iamVjdC4gVGhleSBjYW4gYmUgb2YgZGlmZmVyZW50IHR5cGUgdGhvdWdoLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlQnl0ZXMoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0gICAgaWYgKGEgaW5zdGFuY2VvZiBieXRlW10gJiYgYiBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGJ5dGVbXSlhLCAoYnl0ZVtdKWIpOwotICAgIH0KLSAgICByZXR1cm4gdG9CeXRlU3RyaW5nKGEpLmVxdWFscyh0b0J5dGVTdHJpbmcoYikpOwotICB9Ci0gIAotICAvKioKLSAgICogQ29udmVydHMgYSBsaXN0IG9mIE1hcEVudHJ5IG1lc3NhZ2VzIGludG8gYSBNYXAgdXNlZCBmb3IgZXF1YWxzKCkgYW5kCi0gICAqIGhhc2hDb2RlKCkuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KQotICBwcml2YXRlIHN0YXRpYyBNYXAgY29udmVydE1hcEVudHJ5TGlzdFRvTWFwKExpc3QgbGlzdCkgewotICAgIGlmIChsaXN0LmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgfQotICAgIE1hcCByZXN1bHQgPSBuZXcgSGFzaE1hcCgpOwotICAgIEl0ZXJhdG9yIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIE1lc3NhZ2UgZW50cnkgPSAoTWVzc2FnZSkgaXRlcmF0b3IubmV4dCgpOwotICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGVudHJ5LmdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0gICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGtleSA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJrZXkiKTsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgdmFsdWUgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgidmFsdWUiKTsKLSAgICBPYmplY3QgZmllbGRWYWx1ZSA9IGVudHJ5LmdldEZpZWxkKHZhbHVlKTsKLSAgICBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIEVudW1WYWx1ZURlc2NyaXB0b3IpIHsKLSAgICAgIGZpZWxkVmFsdWUgPSAoKEVudW1WYWx1ZURlc2NyaXB0b3IpIGZpZWxkVmFsdWUpLmdldE51bWJlcigpOwotICAgIH0KLSAgICByZXN1bHQucHV0KGVudHJ5LmdldEZpZWxkKGtleSksIGZpZWxkVmFsdWUpOwotICAgIHdoaWxlIChpdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgIGVudHJ5ID0gKE1lc3NhZ2UpIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZpZWxkVmFsdWUgPSBlbnRyeS5nZXRGaWVsZCh2YWx1ZSk7Ci0gICAgICBpZiAoZmllbGRWYWx1ZSBpbnN0YW5jZW9mIEVudW1WYWx1ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgZmllbGRWYWx1ZSA9ICgoRW51bVZhbHVlRGVzY3JpcHRvcikgZmllbGRWYWx1ZSkuZ2V0TnVtYmVyKCk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQucHV0KGVudHJ5LmdldEZpZWxkKGtleSksIGZpZWxkVmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIAotICAvKioKLSAgICogQ29tcGFyZXMgdHdvIG1hcCBmaWVsZHMuIFRoZSBwYXJhbWV0ZXJzIG11c3QgYmUgYSBsaXN0IG9mIE1hcEVudHJ5Ci0gICAqIG1lc3NhZ2VzLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoeyJyYXd0eXBlcyIsICJ1bmNoZWNrZWQifSkKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBjb21wYXJlTWFwRmllbGQoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0gICAgTWFwIG1hID0gY29udmVydE1hcEVudHJ5TGlzdFRvTWFwKChMaXN0KSBhKTsKLSAgICBNYXAgbWIgPSBjb252ZXJ0TWFwRW50cnlMaXN0VG9NYXAoKExpc3QpIGIpOwotICAgIHJldHVybiBNYXBGaWVsZExpdGUuZXF1YWxzKG1hLCBtYik7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDb21wYXJlcyB0d28gc2V0IG9mIGZpZWxkcy4KLSAgICogVGhpcyBtZXRob2QgaXMgdXNlZCB0byBpbXBsZW1lbnQge0BsaW5rIEFic3RyYWN0TWVzc2FnZSNlcXVhbHMoT2JqZWN0KX0KLSAgICogYW5kIHtAbGluayBBYnN0cmFjdE11dGFibGVNZXNzYWdlI2VxdWFscyhPYmplY3QpfS4gSXQgdGFrZXMgc3BlY2lhbCBjYXJlCi0gICAqIG9mIGJ5dGVzIGZpZWxkcyBiZWNhdXNlIGltbXV0YWJsZSBtZXNzYWdlcyBhbmQgbXV0YWJsZSBtZXNzYWdlcyB1c2UKLSAgICogZGlmZmVyZW50IEphdmEgdHlwZSB0byByZXByZW5zZW50IGEgYnl0ZXMgZmllbGQgYW5kIHRoaXMgbWV0aG9kIHNob3VsZCBiZQotICAgKiBhYmxlIHRvIGNvbXBhcmUgaW1tdXRhYmxlIG1lc3NhZ2VzLCBtdXRhYmxlIG1lc3NhZ2VzIGFuZCBhbHNvIGFuIGltbXV0YWJsZQotICAgKiBtZXNzYWdlIHRvIGEgbXV0YWJsZSBtZXNzYWdlLgotICAgKi8KLSAgc3RhdGljIGJvb2xlYW4gY29tcGFyZUZpZWxkcyhNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGEsCi0gICAgICBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGIpIHsKLSAgICBpZiAoYS5zaXplKCkgIT0gYi5zaXplKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA6IGEua2V5U2V0KCkpIHsKLSAgICAgIGlmICghYi5jb250YWluc0tleShkZXNjcmlwdG9yKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBPYmplY3QgdmFsdWUxID0gYS5nZXQoZGVzY3JpcHRvcik7Ci0gICAgICBPYmplY3QgdmFsdWUyID0gYi5nZXQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuQllURVMpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgTGlzdCBsaXN0MSA9IChMaXN0KSB2YWx1ZTE7Ci0gICAgICAgICAgTGlzdCBsaXN0MiA9IChMaXN0KSB2YWx1ZTI7Ci0gICAgICAgICAgaWYgKGxpc3QxLnNpemUoKSAhPSBsaXN0Mi5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0MS5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgaWYgKCFjb21wYXJlQnl0ZXMobGlzdDEuZ2V0KGkpLCBsaXN0Mi5nZXQoaSkpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gQ29tcGFyZXMgYSBzaW5ndWxhciBieXRlcyBmaWVsZC4KLSAgICAgICAgICBpZiAoIWNvbXBhcmVCeXRlcyh2YWx1ZTEsIHZhbHVlMikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci5pc01hcEZpZWxkKCkpIHsKLSAgICAgICAgaWYgKCFjb21wYXJlTWFwRmllbGQodmFsdWUxLCB2YWx1ZTIpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBDb21wYXJlIG5vbi1ieXRlcyBmaWVsZHMuCi0gICAgICAgIGlmICghdmFsdWUxLmVxdWFscyh2YWx1ZTIpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICAvKioKLSAgICogQ2FsY3VsYXRlcyB0aGUgaGFzaCBjb2RlIG9mIGEgbWFwIGZpZWxkLiB7QGNvZGUgdmFsdWV9IG11c3QgYmUgYSBsaXN0IG9mCi0gICAqIE1hcEVudHJ5IG1lc3NhZ2VzLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHByaXZhdGUgc3RhdGljIGludCBoYXNoTWFwRmllbGQoT2JqZWN0IHZhbHVlKSB7Ci0gICAgcmV0dXJuIE1hcEZpZWxkTGl0ZS5jYWxjdWxhdGVIYXNoQ29kZUZvck1hcChjb252ZXJ0TWFwRW50cnlMaXN0VG9NYXAoKExpc3QpIHZhbHVlKSk7Ci0gIH0KLQotICAvKiogR2V0IGEgaGFzaCBjb2RlIGZvciBnaXZlbiBmaWVsZHMgYW5kIHZhbHVlcywgdXNpbmcgdGhlIGdpdmVuIHNlZWQuICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcm90ZWN0ZWQgc3RhdGljIGludCBoYXNoRmllbGRzKGludCBoYXNoLCBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IG1hcCkgewotICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICBoYXNoID0gKDM3ICogaGFzaCkgKyBmaWVsZC5nZXROdW1iZXIoKTsKLSAgICAgIGlmIChmaWVsZC5pc01hcEZpZWxkKCkpIHsKLSAgICAgICAgaGFzaCA9ICg1MyAqIGhhc2gpICsgaGFzaE1hcEZpZWxkKHZhbHVlKTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ2V0VHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5UeXBlLkVOVU0pewotICAgICAgICBoYXNoID0gKDUzICogaGFzaCkgKyB2YWx1ZS5oYXNoQ29kZSgpOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgTGlzdDw/IGV4dGVuZHMgRW51bUxpdGU+IGxpc3QgPSAoTGlzdDw/IGV4dGVuZHMgRW51bUxpdGU+KSB2YWx1ZTsKLSAgICAgICAgaGFzaCA9ICg1MyAqIGhhc2gpICsgSW50ZXJuYWwuaGFzaEVudW1MaXN0KGxpc3QpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaGFzaCA9ICg1MyAqIGhhc2gpICsgSW50ZXJuYWwuaGFzaEVudW0oKEVudW1MaXRlKSB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBoYXNoOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhY2thZ2UgcHJpdmF0ZSBoZWxwZXIgbWV0aG9kIGZvciBBYnN0cmFjdFBhcnNlciB0byBjcmVhdGUKLSAgICogVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gd2l0aCBtaXNzaW5nIGZpZWxkIGluZm9ybWF0aW9uLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKCkgewotICAgIHJldHVybiBCdWlsZGVyLm5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKHRoaXMpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogQSBwYXJ0aWFsIGltcGxlbWVudGF0aW9uIG9mIHRoZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBpbnRlcmZhY2Ugd2hpY2gKLSAgICogaW1wbGVtZW50cyBhcyBtYW55IG1ldGhvZHMgb2YgdGhhdCBpbnRlcmZhY2UgYXMgcG9zc2libGUgaW4gdGVybXMgb2YKLSAgICogb3RoZXIgbWV0aG9kcy4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgc3RhdGljIGFic3RyYWN0IGNsYXNzIEJ1aWxkZXI8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPEJ1aWxkZXJUeXBlPj4KLSAgICAgIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZS5CdWlsZGVyCi0gICAgICBpbXBsZW1lbnRzIE1lc3NhZ2UuQnVpbGRlciB7Ci0gICAgLy8gVGhlIGNvbXBpbGVyIHByb2R1Y2VzIGFuIGVycm9yIGlmIHRoaXMgaXMgbm90IGRlY2xhcmVkIGV4cGxpY2l0bHkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIGNsb25lKCk7Ci0KLSAgICAvKiogVE9ETyhqaWVsdW8pOiBDbGVhciBpdCB3aGVuIGFsbCBzdWJjbGFzc2VzIGhhdmUgaW1wbGVtZW50ZWQgdGhpcyBtZXRob2QuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzT25lb2YoT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImhhc09uZW9mKCkgaXMgbm90IGltcGxlbWVudGVkLiIpOwotICAgIH0KLQotICAgIC8qKiBUT0RPKGppZWx1byk6IENsZWFyIGl0IHdoZW4gYWxsIHN1YmNsYXNzZXMgaGF2ZSBpbXBsZW1lbnRlZCB0aGlzIG1ldGhvZC4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldE9uZW9mRmllbGREZXNjcmlwdG9yKE9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJnZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigpIGlzIG5vdCBpbXBsZW1lbnRlZC4iKTsKLSAgICB9Ci0KLSAgICAvKiogVE9ETyhqaWVsdW8pOiBDbGVhciBpdCB3aGVuIGFsbCBzdWJjbGFzc2VzIGhhdmUgaW1wbGVtZW50ZWQgdGhpcyBtZXRob2QuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyT25lb2YoT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oImNsZWFyT25lb2YoKSBpcyBub3QgaW1wbGVtZW50ZWQuIik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyKCkgewotICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICAgZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgewotICAgICAgICBjbGVhckZpZWxkKGVudHJ5LmdldEtleSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExpc3Q8U3RyaW5nPiBmaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSB7Ci0gICAgICByZXR1cm4gTWVzc2FnZVJlZmxlY3Rpb24uZmluZE1pc3NpbmdGaWVsZHModGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgewotICAgICAgcmV0dXJuIE1lc3NhZ2VSZWZsZWN0aW9uLmRlbGltaXRXaXRoQ29tbWFzKGZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEJ1aWxkZXJUeXBlIGludGVybmFsTWVyZ2VGcm9tKEFic3RyYWN0TWVzc2FnZUxpdGUgb3RoZXIpIHsKLSAgICAgIHJldHVybiBtZXJnZUZyb20oKE1lc3NhZ2UpIG90aGVyKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIE1lc3NhZ2Ugb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAibWVyZ2VGcm9tKE1lc3NhZ2UpIGNhbiBvbmx5IG1lcmdlIG1lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vdGU6ICBXZSBkb24ndCBhdHRlbXB0IHRvIHZlcmlmeSB0aGF0IG90aGVyJ3MgZmllbGRzIGhhdmUgdmFsaWQKLSAgICAgIC8vICAgdHlwZXMuICBEb2luZyBzbyB3b3VsZCBiZSBhIGxvc2luZyBiYXR0bGUuICBXZSdkIGhhdmUgdG8gdmVyaWZ5Ci0gICAgICAvLyAgIGFsbCBzdWItbWVzc2FnZXMgYXMgd2VsbCwgYW5kIHdlJ2QgaGF2ZSB0byBtYWtlIGNvcGllcyBvZiBhbGwgb2YKLSAgICAgIC8vICAgdGhlbSB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGNoYW5nZSBhZnRlciB2ZXJpZmljYXRpb24gKHNpbmNlCi0gICAgICAvLyAgIHRoZSBNZXNzYWdlIGludGVyZmFjZSBpdHNlbGYgY2Fubm90IGVuZm9yY2UgaW1tdXRhYmlsaXR5IG9mCi0gICAgICAvLyAgIGltcGxlbWVudGF0aW9ucykuCi0gICAgICAvLyBUT0RPKGtlbnRvbik6ICBQcm92aWRlIGEgZnVuY3Rpb24gc29tZXdoZXJlIGNhbGxlZCBtYWtlRGVlcENvcHkoKQotICAgICAgLy8gICB3aGljaCBhbGxvd3MgcGVvcGxlIHRvIG1ha2Ugc2VjdXJlIGRlZXAgY29waWVzIG9mIG1lc3NhZ2VzLgotCi0gICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgotICAgICAgICAgICBvdGhlci5nZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0KWVudHJ5LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGFkZFJlcGVhdGVkRmllbGQoZmllbGQsIGVsZW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgZmluYWwgTWVzc2FnZSBleGlzdGluZ1ZhbHVlID0gKE1lc3NhZ2UpZ2V0RmllbGQoZmllbGQpOwotICAgICAgICAgIGlmIChleGlzdGluZ1ZhbHVlID09IGV4aXN0aW5nVmFsdWUuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKSB7Ci0gICAgICAgICAgICBzZXRGaWVsZChmaWVsZCwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNldEZpZWxkKGZpZWxkLAotICAgICAgICAgICAgICBleGlzdGluZ1ZhbHVlLm5ld0J1aWxkZXJGb3JUeXBlKCkKLSAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKGV4aXN0aW5nVmFsdWUpCi0gICAgICAgICAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSllbnRyeS5nZXRWYWx1ZSgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2V0RmllbGQoZmllbGQsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIG1lcmdlVW5rbm93bkZpZWxkcyhvdGhlci5nZXRVbmtub3duRmllbGRzKCkpOwotCi0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPQotICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcihnZXRVbmtub3duRmllbGRzKCkpOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgZmluYWwgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBNZXNzYWdlUmVmbGVjdGlvbi5CdWlsZGVyQWRhcHRlciBidWlsZGVyQWRhcHRlciA9Ci0gICAgICAgICAgICBuZXcgTWVzc2FnZVJlZmxlY3Rpb24uQnVpbGRlckFkYXB0ZXIodGhpcyk7Ci0gICAgICAgIGlmICghTWVzc2FnZVJlZmxlY3Rpb24ubWVyZ2VGaWVsZEZyb20oaW5wdXQsIHVua25vd25GaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZGVyQWRhcHRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWcpKSB7Ci0gICAgICAgICAgLy8gZW5kIGdyb3VwIHRhZwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzZXRVbmtub3duRmllbGRzKHVua25vd25GaWVsZHMuYnVpbGQoKSk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZVVua25vd25GaWVsZHMoZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICAgIHNldFVua25vd25GaWVsZHMoCi0gICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKGdldFVua25vd25GaWVsZHMoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKQotICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgZ2V0RmllbGRCdWlsZGVyKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJnZXRGaWVsZEJ1aWxkZXIoKSBjYWxsZWQgb24gYW4gdW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoKSBjYWxsZWQgb24gYW4gdW5zdXBwb3J0ZWQgbWVzc2FnZSB0eXBlLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4gVGV4dEZvcm1hdC5wcmludFRvU3RyaW5nKHRoaXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiByZXBvcnRpbmcgbWlzc2luZyBmaWVsZHMgaW4KLSAgICAgKiB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uCi0gICAgICAgIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgcmV0dXJuIG5ldyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbigKLSAgICAgICAgICBNZXNzYWdlUmVmbGVjdGlvbi5maW5kTWlzc2luZ0ZpZWxkcyhtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBzZWVtIHRvIGJlIHJlcXVpcmVkIGluIG9yZGVyIHRvIG1ha2UgamF2YWMKLSAgICAvLyBub3QgcHJvZHVjZSB3ZWlyZCBlcnJvcnMgbGlrZToKLSAgICAvLwotICAgIC8vIGphdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZS5qYXZhOjIwMzogdHlwZXMKLSAgICAvLyAgIGNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXI8Ci0gICAgLy8gICAgIGNvbS5nb29nbGUucHJvdG9idWYuRHluYW1pY01lc3NhZ2UuQnVpbGRlcj4gYW5kCi0gICAgLy8gICBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPAotICAgIC8vICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkR5bmFtaWNNZXNzYWdlLkJ1aWxkZXI+IGFyZSBpbmNvbXBhdGlibGU7IGJvdGgKLSAgICAvLyAgIGRlZmluZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSwgYnV0IHdpdGggdW5yZWxhdGVkCi0gICAgLy8gICByZXR1cm4gdHlwZXMuCi0gICAgLy8KLSAgICAvLyBTdHJhbmdlbHksIHRoZXNlIGxpbmVzIGFyZSBvbmx5IG5lZWRlZCBpZiBqYXZhYyBpcyBpbnZva2VkIHNlcGFyYXRlbHkKLSAgICAvLyBvbiBBYnN0cmFjdE1lc3NhZ2UuamF2YSBhbmQgQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhLiAgSWYgamF2YWMgaXMKLSAgICAvLyBpbnZva2VkIG9uIGJvdGggc2ltdWx0YW5lb3VzbHksIGl0IHdvcmtzLiAgKE9yIG1heWJlIHRoZSBpbXBvcnRhbnQKLSAgICAvLyBwb2ludCBpcyB3aGV0aGVyIG9yIG5vdCBEeW5hbWljTWVzc2FnZS5qYXZhIGlzIGNvbXBpbGVkIHRvZ2V0aGVyIHdpdGgKLSAgICAvLyBBYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEgLS0gbm90IHN1cmUuKSAgSSBzdXNwZWN0IHRoaXMgaXMgYSBjb21waWxlcgotICAgIC8vIGJ1Zy4KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgQnl0ZVN0cmluZyBkYXRhKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHN1cGVyLm1lcmdlRnJvbShkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAotICAgICAgICBmaW5hbCBCeXRlU3RyaW5nIGRhdGEsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSBzdXBlci5tZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgc3VwZXIubWVyZ2VGcm9tKGRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHN1cGVyLm1lcmdlRnJvbShkYXRhLCBvZmYsIGxlbik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSBzdXBlci5tZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgc3VwZXIubWVyZ2VGcm9tKGRhdGEsIG9mZiwgbGVuLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHN1cGVyLm1lcmdlRnJvbShpbnB1dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHN1cGVyLm1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG1lcmdlRGVsaW1pdGVkRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBzdXBlci5tZXJnZURlbGltaXRlZEZyb20oaW5wdXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIG1lcmdlRGVsaW1pdGVkRnJvbSgKLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBzdXBlci5tZXJnZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzNzM2ZGQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzODYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1lc3NhZ2VMaXRlfSBpbnRlcmZhY2Ugd2hpY2gKLSAqIGltcGxlbWVudHMgYXMgbWFueSBtZXRob2RzIG9mIHRoYXQgaW50ZXJmYWNlIGFzIHBvc3NpYmxlIGluIHRlcm1zIG9mIG90aGVyCi0gKiBtZXRob2RzLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VMaXRlPAotICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZTxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+LAotICAgIEJ1aWxkZXJUeXBlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZS5CdWlsZGVyPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4+IAotICAgICAgICBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlIHsKLSAgcHJvdGVjdGVkIGludCBtZW1vaXplZEhhc2hDb2RlID0gMDsKLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQnl0ZVN0cmluZyB0b0J5dGVTdHJpbmcoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIEJ5dGVTdHJpbmcuQ29kZWRCdWlsZGVyIG91dCA9Ci0gICAgICAgIEJ5dGVTdHJpbmcubmV3Q29kZWRCdWlsZGVyKGdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgICAgd3JpdGVUbyhvdXQuZ2V0Q29kZWRPdXRwdXQoKSk7Ci0gICAgICByZXR1cm4gb3V0LmJ1aWxkKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJTZXJpYWxpemluZyB0byBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKLSAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtnZXRTZXJpYWxpemVkU2l6ZSgpXTsKLSAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJlc3VsdCk7Ci0gICAgICB3cml0ZVRvKG91dHB1dCk7Ci0gICAgICBvdXRwdXQuY2hlY2tOb1NwYWNlTGVmdCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgIlNlcmlhbGl6aW5nIHRvIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAiICsKLSAgICAgICAgIihzaG91bGQgbmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBidWZmZXJTaXplID0KLSAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVByZWZlcnJlZEJ1ZmZlclNpemUoZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPQotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShvdXRwdXQsIGJ1ZmZlclNpemUpOwotICAgIHdyaXRlVG8oY29kZWRPdXRwdXQpOwotICAgIGNvZGVkT3V0cHV0LmZsdXNoKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgd3JpdGVEZWxpbWl0ZWRUbyhmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBzZXJpYWxpemVkID0gZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSA9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVQcmVmZXJyZWRCdWZmZXJTaXplKAotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUmF3VmFyaW50MzJTaXplKHNlcmlhbGl6ZWQpICsgc2VyaWFsaXplZCk7Ci0gICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPQotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShvdXRwdXQsIGJ1ZmZlclNpemUpOwotICAgIGNvZGVkT3V0cHV0LndyaXRlUmF3VmFyaW50MzIoc2VyaWFsaXplZCk7Ci0gICAgd3JpdGVUbyhjb2RlZE91dHB1dCk7Ci0gICAgY29kZWRPdXRwdXQuZmx1c2goKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFBhY2thZ2UgcHJpdmF0ZSBoZWxwZXIgbWV0aG9kIGZvciBBYnN0cmFjdFBhcnNlciB0byBjcmVhdGUKLSAgICogVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uCi0gICAqLwotICBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbigpIHsKLSAgICByZXR1cm4gbmV3IFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKHRoaXMpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIGNoZWNrQnl0ZVN0cmluZ0lzVXRmOChCeXRlU3RyaW5nIGJ5dGVTdHJpbmcpCi0gICAgICB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICBpZiAoIWJ5dGVTdHJpbmcuaXNWYWxpZFV0ZjgoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQnl0ZSBzdHJpbmcgaXMgbm90IFVURi04LiIpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgPFQ+IHZvaWQgYWRkQWxsKGZpbmFsIEl0ZXJhYmxlPFQ+IHZhbHVlcywKLSAgICAgIGZpbmFsIENvbGxlY3Rpb248PyBzdXBlciBUPiBsaXN0KSB7Ci0gICAgQnVpbGRlci5hZGRBbGwodmFsdWVzLCBsaXN0KTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0gaW50ZXJmYWNlIHdoaWNoCi0gICAqIGltcGxlbWVudHMgYXMgbWFueSBtZXRob2RzIG9mIHRoYXQgaW50ZXJmYWNlIGFzIHBvc3NpYmxlIGluIHRlcm1zIG9mCi0gICAqIG90aGVyIG1ldGhvZHMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBCdWlsZGVyPAotICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VMaXRlPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4sCi0gICAgICBCdWlsZGVyVHlwZSBleHRlbmRzIEJ1aWxkZXI8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPj4KLSAgICAgIGltcGxlbWVudHMgTWVzc2FnZUxpdGUuQnVpbGRlciB7Ci0gICAgLy8gVGhlIGNvbXBpbGVyIHByb2R1Y2VzIGFuIGVycm9yIGlmIHRoaXMgaXMgbm90IGRlY2xhcmVkIGV4cGxpY2l0bHkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIGNsb25lKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKLSAgICB9Ci0KLSAgICAvLyBSZS1kZWZpbmVkIGhlcmUgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGFic3RyYWN0IEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIEJ5dGVTdHJpbmcgZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7Ci0gICAgICAgIG1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCi0gICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgQnl0ZVN0cmluZyBkYXRhLCBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGEubmV3Q29kZWRJbnB1dCgpOwotICAgICAgICBtZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKLSAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIGJ5dGVbXSBkYXRhKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBtZXJnZUZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9Ci0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEsIG9mZiwgbGVuKTsKLSAgICAgICAgbWVyZ2VGcm9tKGlucHV0KTsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIGJ5dGUgYXJyYXkgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKLSAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIGJ5dGVbXSBkYXRhLCBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhLCAwLCBkYXRhLmxlbmd0aCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLAotICAgICAgICBmaW5hbCBpbnQgb2ZmLAotICAgICAgICBmaW5hbCBpbnQgbGVuLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9Ci0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEsIG9mZiwgbGVuKTsKLSAgICAgICAgbWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCi0gICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW5wdXQpOwotICAgICAgbWVyZ2VGcm9tKGNvZGVkSW5wdXQpOwotICAgICAgY29kZWRJbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0LCBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGNvZGVkSW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGlucHV0KTsKLSAgICAgIG1lcmdlRnJvbShjb2RlZElucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICBjb2RlZElucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQW4gSW5wdXRTdHJlYW0gaW1wbGVtZW50YXRpb25zIHdoaWNoIHJlYWRzIGZyb20gc29tZSBvdGhlciBJbnB1dFN0cmVhbQotICAgICAqIGJ1dCBpcyBsaW1pdGVkIHRvIGEgcGFydGljdWxhciBudW1iZXIgb2YgYnl0ZXMuICBVc2VkIGJ5Ci0gICAgICogbWVyZ2VEZWxpbWl0ZWRGcm9tKCkuICBUaGlzIGlzIGludGVudGlvbmFsbHkgcGFja2FnZS1wcml2YXRlIHNvIHRoYXQKLSAgICAgKiBVbmtub3duRmllbGRTZXQgY2FuIHNoYXJlIGl0LgotICAgICAqLwotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBMaW1pdGVkSW5wdXRTdHJlYW0gZXh0ZW5kcyBGaWx0ZXJJbnB1dFN0cmVhbSB7Ci0gICAgICBwcml2YXRlIGludCBsaW1pdDsKLQotICAgICAgTGltaXRlZElucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgbGltaXQpIHsKLSAgICAgICAgc3VwZXIoaW4pOwotICAgICAgICB0aGlzLmxpbWl0ID0gbGltaXQ7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCBhdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gTWF0aC5taW4oc3VwZXIuYXZhaWxhYmxlKCksIGxpbWl0KTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAobGltaXQgPD0gMCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gc3VwZXIucmVhZCgpOwotICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKLSAgICAgICAgICAtLWxpbWl0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCByZWFkKGZpbmFsIGJ5dGVbXSBiLCBmaW5hbCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsaW1pdCA8PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGxlbiA9IE1hdGgubWluKGxlbiwgbGltaXQpOwotICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gc3VwZXIucmVhZChiLCBvZmYsIGxlbik7Ci0gICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewotICAgICAgICAgIGxpbWl0IC09IHJlc3VsdDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBsb25nIHNraXAoZmluYWwgbG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHN1cGVyLnNraXAoTWF0aC5taW4obiwgbGltaXQpKTsKLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgbGltaXQgLT0gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKAotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCwgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKLSAgICAgIGlmIChmaXJzdEJ5dGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZmluYWwgaW50IHNpemUgPSBDb2RlZElucHV0U3RyZWFtLnJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKLSAgICAgIGZpbmFsIElucHV0U3RyZWFtIGxpbWl0ZWRJbnB1dCA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOwotICAgICAgbWVyZ2VGcm9tKGxpbWl0ZWRJbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIG1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwKLSAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIGlzSW5zdGFuY2UgdGFrZXMgY2FyZSBvZiB0aGlzCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBNZXNzYWdlTGl0ZSBvdGhlcikgewotICAgICAgaWYgKCFnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkuZ2V0Q2xhc3MoKS5pc0luc3RhbmNlKG90aGVyKSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIm1lcmdlRnJvbShNZXNzYWdlTGl0ZSkgY2FuIG9ubHkgbWVyZ2UgbWVzc2FnZXMgb2YgdGhlIHNhbWUgdHlwZS4iKTsKLSAgICAgIH0KLSAgICAgICAgCi0gICAgICByZXR1cm4gaW50ZXJuYWxNZXJnZUZyb20oKE1lc3NhZ2VUeXBlKSBvdGhlcik7Ci0gICAgfQotICAgIAotICAgIHByb3RlY3RlZCBhYnN0cmFjdCBCdWlsZGVyVHlwZSBpbnRlcm5hbE1lcmdlRnJvbShNZXNzYWdlVHlwZSBtZXNzYWdlKTsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiByZXBvcnRpbmcgbWlzc2luZyBmaWVsZHMgaW4KLSAgICAgKiB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uCi0gICAgICAgIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKE1lc3NhZ2VMaXRlIG1lc3NhZ2UpIHsKLSAgICAgIHJldHVybiBuZXcgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUge0Bjb2RlIHZhbHVlc30gdG8gdGhlIHtAY29kZSBsaXN0fS4gIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kCi0gICAgICogdXNlZCBieSBnZW5lcmF0ZWQgY29kZS4gIFVzZXJzIHNob3VsZCBpZ25vcmUgaXQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHtAY29kZSB2YWx1ZXN9IG9yIGFueSBvZiB0aGUgZWxlbWVudHMgb2YKLSAgICAgKiB7QGNvZGUgdmFsdWVzfSBpcyBudWxsLiBXaGVuIHRoYXQgaGFwcGVucywgc29tZSBlbGVtZW50cyBvZgotICAgICAqIHtAY29kZSB2YWx1ZXN9IG1heSBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byB0aGUgcmVzdWx0IHtAY29kZSBsaXN0fS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIDxUPiB2b2lkIGFkZEFsbChmaW5hbCBJdGVyYWJsZTxUPiB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29sbGVjdGlvbjw/IHN1cGVyIFQ+IGxpc3QpIHsKLSAgICAgIGlmICh2YWx1ZXMgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBMYXp5U3RyaW5nTGlzdCkgewotICAgICAgICAvLyBGb3IgU3RyaW5nT3JCeXRlU3RyaW5nTGlzdHMsIGNoZWNrIHRoZSB1bmRlcmx5aW5nIGVsZW1lbnRzIHRvIGF2b2lkCi0gICAgICAgIC8vIGZvcmNpbmcgY29udmVyc2lvbnMgb2YgQnl0ZVN0cmluZ3MgdG8gU3RyaW5ncy4KLSAgICAgICAgY2hlY2tGb3JOdWxsVmFsdWVzKCgoTGF6eVN0cmluZ0xpc3QpIHZhbHVlcykuZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCkpOwotICAgICAgICBsaXN0LmFkZEFsbCgoQ29sbGVjdGlvbjxUPikgdmFsdWVzKTsKLSAgICAgIH0gZWxzZSBpZiAodmFsdWVzIGluc3RhbmNlb2YgQ29sbGVjdGlvbikgewotICAgICAgICBjaGVja0Zvck51bGxWYWx1ZXModmFsdWVzKTsKLSAgICAgICAgbGlzdC5hZGRBbGwoKENvbGxlY3Rpb248VD4pIHZhbHVlcyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGZpbmFsIFQgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGxpc3QuYWRkKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgY2hlY2tGb3JOdWxsVmFsdWVzKGZpbmFsIEl0ZXJhYmxlPD8+IHZhbHVlcykgewotICAgICAgZm9yIChmaW5hbCBPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdFBhcnNlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdFBhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmIwZWUzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RQYXJzZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuTGltaXRlZElucHV0U3RyZWFtOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotCi0vKioKLSAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIFBhcnNlcn0gaW50ZXJmYWNlIHdoaWNoIGltcGxlbWVudHMKLSAqIGFzIG1hbnkgbWV0aG9kcyBvZiB0aGF0IGludGVyZmFjZSBhcyBwb3NzaWJsZSBpbiB0ZXJtcyBvZiBvdGhlciBtZXRob2RzLgotICoKLSAqIE5vdGU6IFRoaXMgY2xhc3MgaW1wbGVtZW50cyBhbGwgdGhlIGNvbnZlbmllbmNlIG1ldGhvZHMgaW4gdGhlCi0gKiB7QGxpbmsgUGFyc2VyfSBpbnRlcmZhY2UuIFNlZSB7QGxpbmsgUGFyc2VyfSBmb3IgcmVsYXRlZCBqYXZhZG9jcy4KLSAqIFN1YmNsYXNzZXMgbmVlZCB0byBpbXBsZW1lbnQKLSAqIHtAbGluayBQYXJzZXIjcGFyc2VQYXJ0aWFsRnJvbShDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfQotICoKLSAqIEBhdXRob3IgbGl1amlzaUBnb29nbGUuY29tIChQaGVybCBMaXUpCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdFBhcnNlcjxNZXNzYWdlVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlPgotICAgIGltcGxlbWVudHMgUGFyc2VyPE1lc3NhZ2VUeXBlPiB7Ci0gIC8qKgotICAgKiBDcmVhdGVzIGFuIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGZvciBNZXNzYWdlVHlwZS4KLSAgICovCi0gIHByaXZhdGUgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24KLSAgICAgIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKE1lc3NhZ2VUeXBlIG1lc3NhZ2UpIHsKLSAgICBpZiAobWVzc2FnZSBpbnN0YW5jZW9mIEFic3RyYWN0TWVzc2FnZUxpdGUpIHsKLSAgICAgIHJldHVybiAoKEFic3RyYWN0TWVzc2FnZUxpdGUpIG1lc3NhZ2UpLm5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24obWVzc2FnZSk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byBjaGVjayBpZiBtZXNzYWdlIGlzIGluaXRpYWxpemVkLgotICAgKgotICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpZiBpdCBpcyBub3QgaW5pdGlhbGl6ZWQuCi0gICAqIEByZXR1cm4gVGhlIG1lc3NhZ2UgdG8gY2hlY2suCi0gICAqLwotICBwcml2YXRlIE1lc3NhZ2VUeXBlIGNoZWNrTWVzc2FnZUluaXRpYWxpemVkKE1lc3NhZ2VUeXBlIG1lc3NhZ2UpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICBpZiAobWVzc2FnZSAhPSBudWxsICYmICFtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24obWVzc2FnZSkKLSAgICAgICAgICAuYXNJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oKQotICAgICAgICAgIC5zZXRVbmZpbmlzaGVkTWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgRU1QVFlfUkVHSVNUUlkKLSAgICAgID0gRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKTsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBFTVBUWV9SRUdJU1RSWSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gY2hlY2tNZXNzYWdlSW5pdGlhbGl6ZWQoCi0gICAgICAgIHBhcnNlUGFydGlhbEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcGFyc2VGcm9tKGlucHV0LCBFTVBUWV9SRUdJU1RSWSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQnl0ZVN0cmluZyBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlVHlwZSBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7Ci0gICAgICBtZXNzYWdlID0gcGFyc2VQYXJ0aWFsRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgdHJ5IHsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZS5zZXRVbmZpbmlzaGVkTWVzc2FnZShtZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtZXNzYWdlOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBlOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShCeXRlU3RyaW5nIGRhdGEpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGRhdGEsIEVNUFRZX1JFR0lTVFJZKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGNoZWNrTWVzc2FnZUluaXRpYWxpemVkKHBhcnNlUGFydGlhbEZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlRnJvbShkYXRhLCBFTVBUWV9SRUdJU1RSWSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oCi0gICAgICBieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbiwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEsIG9mZiwgbGVuKTsKLSAgICAgIE1lc3NhZ2VUeXBlIG1lc3NhZ2UgPSBwYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICB0cnkgewotICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlUGFydGlhbEZyb20oZGF0YSwgb2ZmLCBsZW4sIEVNUFRZX1JFR0lTVFJZKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShieXRlW10gZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlUGFydGlhbEZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShieXRlW10gZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlUGFydGlhbEZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgsIEVNUFRZX1JFR0lTVFJZKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKAotICAgICAgYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBjaGVja01lc3NhZ2VJbml0aWFsaXplZCgKLSAgICAgICAgcGFyc2VQYXJ0aWFsRnJvbShkYXRhLCBvZmYsIGxlbiwgZXh0ZW5zaW9uUmVnaXN0cnkpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlRnJvbShkYXRhLCBvZmYsIGxlbiwgRU1QVFlfUkVHSVNUUlkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZUZyb20oZGF0YSwgMCwgZGF0YS5sZW5ndGgsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcGFyc2VGcm9tKGRhdGEsIEVNUFRZX1JFR0lTVFJZKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZElucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShpbnB1dCk7Ci0gICAgTWVzc2FnZVR5cGUgbWVzc2FnZSA9IHBhcnNlUGFydGlhbEZyb20oY29kZWRJbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIHRyeSB7Ci0gICAgICBjb2RlZElucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgZS5zZXRVbmZpbmlzaGVkTWVzc2FnZShtZXNzYWdlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBFTVBUWV9SRUdJU1RSWSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGNoZWNrTWVzc2FnZUluaXRpYWxpemVkKAotICAgICAgICBwYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZUZyb20oaW5wdXQsIEVNUFRZX1JFR0lTVFJZKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRGVsaW1pdGVkRnJvbSgKLSAgICAgIElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICBpbnQgc2l6ZTsKLSAgICB0cnkgewotICAgICAgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKLSAgICAgIGlmIChmaXJzdEJ5dGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBzaXplID0gQ29kZWRJbnB1dFN0cmVhbS5yZWFkUmF3VmFyaW50MzIoZmlyc3RCeXRlLCBpbnB1dCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIElucHV0U3RyZWFtIGxpbWl0ZWRJbnB1dCA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOwotICAgIHJldHVybiBwYXJzZVBhcnRpYWxGcm9tKGxpbWl0ZWRJbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlUGFydGlhbERlbGltaXRlZEZyb20oaW5wdXQsIEVNUFRZX1JFR0lTVFJZKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gY2hlY2tNZXNzYWdlSW5pdGlhbGl6ZWQoCi0gICAgICAgIHBhcnNlUGFydGlhbERlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCwgRU1QVFlfUkVHSVNUUlkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0UHJvdG9idWZMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0UHJvdG9idWZMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxN2RiNmUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdFByb3RvYnVmTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLlByb3RvYnVmTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKLQotLyoqCi0gKiBBbiBhYnN0cmFjdCBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgUHJvdG9idWZMaXN0fSB3aGljaCBtYW5hZ2VzIG11dGFiaWxpdHkgc2VtYW50aWNzLiBBbGwgbXV0YXRlCi0gKiBtZXRob2RzIG11c3QgY2hlY2sgaWYgdGhlIGxpc3QgaXMgbXV0YWJsZSBiZWZvcmUgcHJvY2VlZGluZy4gU3ViY2xhc3NlcyBtdXN0IGludm9rZQotICoge0BsaW5rICNlbnN1cmVJc011dGFibGUoKX0gbWFudWFsbHkgd2hlbiBvdmVycmlkaW5nIHRob3NlIG1ldGhvZHMuCi0gKiA8cD4KLSAqIFRoaXMgaW1wbGVtZW50YXRpb24gYXNzdW1lcyBhbGwgc3ViY2xhc3NlcyBhcmUgYXJyYXkgYmFzZWQsIHN1cHBvcnRpbmcgcmFuZG9tIGFjY2Vzcy4KLSAqLwotYWJzdHJhY3QgY2xhc3MgQWJzdHJhY3RQcm90b2J1Zkxpc3Q8RT4gZXh0ZW5kcyBBYnN0cmFjdExpc3Q8RT4gaW1wbGVtZW50cyBQcm90b2J1Zkxpc3Q8RT4gewotCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfQ0FQQUNJVFkgPSAxMDsKLQotICAvKioKLSAgICogV2hldGhlciBvciBub3QgdGhpcyBsaXN0IGlzIG1vZGlmaWFibGUuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gaXNNdXRhYmxlOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbXV0YWJsZSBsaXN0IGJ5IGRlZmF1bHQuCi0gICAqLwotICBBYnN0cmFjdFByb3RvYnVmTGlzdCgpIHsKLSAgICBpc011dGFibGUgPSB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIGlmIChvID09IHRoaXMpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoIShvIGluc3RhbmNlb2YgTGlzdCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgLy8gSGFuZGxlIGxpc3RzIHRoYXQgZG8gbm90IHN1cHBvcnQgUmFuZG9tQWNjZXNzIGFzIGVmZmljaWVudGx5IGFzIHBvc3NpYmxlIGJ5IHVzaW5nIGFuIGl0ZXJhdG9yCi0gICAgLy8gYmFzZWQgYXBwcm9hY2ggaW4gb3VyIHN1cGVyIGNsYXNzLiBPdGhlcndpc2Ugb3VyIGluZGV4IGJhc2VkIGFwcHJvYWNoIHdpbGwgYXZvaWQgdGhvc2UKLSAgICAvLyBhbGxvY2F0aW9ucy4KLSAgICBpZiAoIShvIGluc3RhbmNlb2YgUmFuZG9tQWNjZXNzKSkgewotICAgICAgcmV0dXJuIHN1cGVyLmVxdWFscyhvKTsKLSAgICB9Ci0KLSAgICBMaXN0PD8+IG90aGVyID0gKExpc3Q8Pz4pIG87Ci0gICAgZmluYWwgaW50IHNpemUgPSBzaXplKCk7Ci0gICAgaWYgKHNpemUgIT0gb3RoZXIuc2l6ZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBpZiAoIWdldChpKS5lcXVhbHMob3RoZXIuZ2V0KGkpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgZmluYWwgaW50IHNpemUgPSBzaXplKCk7Ci0gICAgaW50IGhhc2hDb2RlID0gMTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaGFzaENvZGUgPSAoMzEgKiBoYXNoQ29kZSkgKyBnZXQoaSkuaGFzaENvZGUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2hDb2RlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGFkZChFIGUpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICByZXR1cm4gc3VwZXIuYWRkKGUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIHN1cGVyLmFkZChpbmRleCwgZWxlbWVudCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICByZXR1cm4gc3VwZXIuYWRkQWxsKGMpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgRT4gYykgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIHJldHVybiBzdXBlci5hZGRBbGwoaW5kZXgsIGMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIHN1cGVyLmNsZWFyKCk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc01vZGlmaWFibGUoKSB7Ci0gICAgcmV0dXJuIGlzTXV0YWJsZTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCB2b2lkIG1ha2VJbW11dGFibGUoKSB7Ci0gICAgaXNNdXRhYmxlID0gZmFsc2U7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRSByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgcmV0dXJuIHN1cGVyLnJlbW92ZShpbmRleCk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICByZXR1cm4gc3VwZXIucmVtb3ZlKG8pOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIHJldHVybiBzdXBlci5yZW1vdmVBbGwoYyk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgcmV0dXJuIHN1cGVyLnJldGFpbkFsbChjKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBFIHNldChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIHJldHVybiBzdXBlci5zZXQoaW5kZXgsIGVsZW1lbnQpOwotICB9Ci0gIAotICAvKioKLSAgICogVGhyb3dzIGFuIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gaWYgdGhlIGxpc3QgaXMgaW1tdXRhYmxlLiBTdWJjbGFzc2VzIGFyZQotICAgKiByZXNwb25zaWJsZSBmb3IgaW52b2tpbmcgdGhpcyBtZXRob2Qgb24gbXV0YXRlIG9wZXJhdGlvbnMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBlbnN1cmVJc011dGFibGUoKSB7Ci0gICAgaWYgKCFpc011dGFibGUpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1JwY0NoYW5uZWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdScGNDaGFubmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1MzVlZmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1JwY0NoYW5uZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogPHA+QWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGJsb2NraW5nIFJQQyBjaGFubmVsLiAge0Bjb2RlIEJsb2NraW5nUnBjQ2hhbm5lbH0KLSAqIGlzIHRoZSBibG9ja2luZyBlcXVpdmFsZW50IHRvIHtAbGluayBScGNDaGFubmVsfS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICogQGF1dGhvciBjcG92aXJrQGdvb2dsZS5jb20gQ2hyaXMgUG92aXJrCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgQmxvY2tpbmdScGNDaGFubmVsIHsKLSAgLyoqCi0gICAqIENhbGwgdGhlIGdpdmVuIG1ldGhvZCBvZiB0aGUgcmVtb3RlIHNlcnZpY2UgYW5kIGJsb2NrcyB1bnRpbCBpdCByZXR1cm5zLgotICAgKiB7QGNvZGUgY2FsbEJsb2NraW5nTWV0aG9kKCl9IGlzIHRoZSBibG9ja2luZyBlcXVpdmFsZW50IHRvCi0gICAqIHtAbGluayBScGNDaGFubmVsI2NhbGxNZXRob2R9LgotICAgKi8KLSAgTWVzc2FnZSBjYWxsQmxvY2tpbmdNZXRob2QoCi0gICAgICBEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCwKLSAgICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwKLSAgICAgIE1lc3NhZ2UgcmVxdWVzdCwKLSAgICAgIE1lc3NhZ2UgcmVzcG9uc2VQcm90b3R5cGUpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1NlcnZpY2UuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwMWYwYjguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1NlcnZpY2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogQmxvY2tpbmcgZXF1aXZhbGVudCB0byB7QGxpbmsgU2VydmljZX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqIEBhdXRob3IgY3Bvdmlya0Bnb29nbGUuY29tIENocmlzIFBvdmlyawotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NraW5nU2VydmljZSB7Ci0gIC8qKgotICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBTZXJ2aWNlI2dldERlc2NyaXB0b3JGb3JUeXBlfS4KLSAgICovCi0gIERlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjY2FsbE1ldGhvZH0sIGV4Y2VwdCB0aGF0Ci0gICAqIHtAY29kZSBjYWxsQmxvY2tpbmdNZXRob2QoKX0gcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBSUEMgb3IgdGhyb3dzIGEKLSAgICoge0BsaW5rIFNlcnZpY2VFeGNlcHRpb259IGlmIHRoZXJlIGlzIGEgZmFpbHVyZSwgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGUKLSAgICogaW5mb3JtYXRpb24gdG8gYSBjYWxsYmFjay4KLSAgICovCi0gIE1lc3NhZ2UgY2FsbEJsb2NraW5nTWV0aG9kKERlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVxdWVzdCkgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjZ2V0UmVxdWVzdFByb3RvdHlwZX0uCi0gICAqLwotICBNZXNzYWdlIGdldFJlcXVlc3RQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOwotCi0gIC8qKgotICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBTZXJ2aWNlI2dldFJlc3BvbnNlUHJvdG90eXBlfS4KLSAgICovCi0gIE1lc3NhZ2UgZ2V0UmVzcG9uc2VQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Cb29sZWFuQXJyYXlMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jvb2xlYW5BcnJheUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyODIwYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jvb2xlYW5BcnJheUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5Cb29sZWFuTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQm9vbGVhbkxpc3R9IG9uIHRvcCBvZiBhIHByaW1pdGl2ZSBhcnJheS4KLSAqIAotICogQGF1dGhvciBkd2Vpc0Bnb29nbGUuY29tIChEYW5pZWwgV2VpcykKLSAqLwotZmluYWwgY2xhc3MgQm9vbGVhbkFycmF5TGlzdAotICAgIGV4dGVuZHMgQWJzdHJhY3RQcm90b2J1Zkxpc3Q8Qm9vbGVhbj4gaW1wbGVtZW50cyBCb29sZWFuTGlzdCwgUmFuZG9tQWNjZXNzIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5BcnJheUxpc3QgRU1QVFlfTElTVCA9IG5ldyBCb29sZWFuQXJyYXlMaXN0KCk7Ci0gIHN0YXRpYyB7Ci0gICAgRU1QVFlfTElTVC5tYWtlSW1tdXRhYmxlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgQm9vbGVhbkFycmF5TGlzdCBlbXB0eUxpc3QoKSB7Ci0gICAgcmV0dXJuIEVNUFRZX0xJU1Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGUgYmFja2luZyBzdG9yZSBmb3IgdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW5bXSBhcnJheTsKLQotICAvKioKLSAgICogVGhlIHNpemUgb2YgdGhlIGxpc3QgZGlzdGluY3QgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4gVGhhdCBpcywgaXQgaXMgdGhlIG51bWJlciBvZgotICAgKiBlbGVtZW50cyBzZXQgaW4gdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIGludCBzaXplOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG11dGFibGUge0Bjb2RlIEJvb2xlYW5BcnJheUxpc3R9IHdpdGggZGVmYXVsdCBjYXBhY2l0eS4KLSAgICovCi0gIEJvb2xlYW5BcnJheUxpc3QoKSB7Ci0gICAgdGhpcyhuZXcgYm9vbGVhbltERUZBVUxUX0NBUEFDSVRZXSwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBtdXRhYmxlIHtAY29kZSBCb29sZWFuQXJyYXlMaXN0fS4KLSAgICovCi0gIHByaXZhdGUgQm9vbGVhbkFycmF5TGlzdChib29sZWFuW10gYXJyYXksIGludCBzaXplKSB7Ci0gICAgdGhpcy5hcnJheSA9IGFycmF5OwotICAgIHRoaXMuc2l6ZSA9IHNpemU7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICBpZiAodGhpcyA9PSBvKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKCEobyBpbnN0YW5jZW9mIEJvb2xlYW5BcnJheUxpc3QpKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotICAgIH0KLSAgICBCb29sZWFuQXJyYXlMaXN0IG90aGVyID0gKEJvb2xlYW5BcnJheUxpc3QpIG87Ci0gICAgaWYgKHNpemUgIT0gb3RoZXIuc2l6ZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBmaW5hbCBib29sZWFuW10gYXJyID0gb3RoZXIuYXJyYXk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChhcnJheVtpXSAhPSBhcnJbaV0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIGludCByZXN1bHQgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICByZXN1bHQgPSAoMzEgKiByZXN1bHQpICsgSW50ZXJuYWwuaGFzaEJvb2xlYW4oYXJyYXlbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBCb29sZWFuTGlzdCBtdXRhYmxlQ29weVdpdGhDYXBhY2l0eShpbnQgY2FwYWNpdHkpIHsKLSAgICBpZiAoY2FwYWNpdHkgPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgQm9vbGVhbkFycmF5TGlzdChBcnJheXMuY29weU9mKGFycmF5LCBjYXBhY2l0eSksIHNpemUpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBCb29sZWFuIGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gZ2V0Qm9vbGVhbihpbmRleCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZ2V0Qm9vbGVhbihpbnQgaW5kZXgpIHsKLSAgICBlbnN1cmVJbmRleEluUmFuZ2UoaW5kZXgpOwotICAgIHJldHVybiBhcnJheVtpbmRleF07Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBzaXplKCkgewotICAgIHJldHVybiBzaXplOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBCb29sZWFuIHNldChpbnQgaW5kZXgsIEJvb2xlYW4gZWxlbWVudCkgewotICAgIHJldHVybiBzZXRCb29sZWFuKGluZGV4LCBlbGVtZW50KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBzZXRCb29sZWFuKGludCBpbmRleCwgYm9vbGVhbiBlbGVtZW50KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgZW5zdXJlSW5kZXhJblJhbmdlKGluZGV4KTsKLSAgICBib29sZWFuIHByZXZpb3VzVmFsdWUgPSBhcnJheVtpbmRleF07Ci0gICAgYXJyYXlbaW5kZXhdID0gZWxlbWVudDsKLSAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBCb29sZWFuIGVsZW1lbnQpIHsKLSAgICBhZGRCb29sZWFuKGluZGV4LCBlbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjYWRkKEJvb2xlYW4pfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGRCb29sZWFuKGJvb2xlYW4gZWxlbWVudCkgewotICAgIGFkZEJvb2xlYW4oc2l6ZSwgZWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI2FkZChpbnQsIEJvb2xlYW4pfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhZGRCb29sZWFuKGludCBpbmRleCwgYm9vbGVhbiBlbGVtZW50KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKG1ha2VPdXRPZkJvdW5kc0V4Y2VwdGlvbk1lc3NhZ2UoaW5kZXgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHNpemUgPCBhcnJheS5sZW5ndGgpIHsKLSAgICAgIC8vIFNoaWZ0IGV2ZXJ5dGhpbmcgb3ZlciB0byBtYWtlIHJvb20KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCBhcnJheSwgaW5kZXggKyAxLCBzaXplIC0gaW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBSZXNpemUgdG8gMS41eCB0aGUgc2l6ZQotICAgICAgaW50IGxlbmd0aCA9ICgoc2l6ZSAqIDMpIC8gMikgKyAxOwotICAgICAgYm9vbGVhbltdIG5ld0FycmF5ID0gbmV3IGJvb2xlYW5bbGVuZ3RoXTsKLSAgICAgIAotICAgICAgLy8gQ29weSB0aGUgZmlyc3QgcGFydCBkaXJlY3RseQotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgbmV3QXJyYXksIDAsIGluZGV4KTsKLSAgICAgIAotICAgICAgLy8gQ29weSB0aGUgcmVzdCBzaGlmdGVkIG92ZXIgYnkgb25lIHRvIG1ha2Ugcm9vbQotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIG5ld0FycmF5LCBpbmRleCArIDEsIHNpemUgLSBpbmRleCk7Ci0gICAgICBhcnJheSA9IG5ld0FycmF5OwotICAgIH0KLQotICAgIGFycmF5W2luZGV4XSA9IGVsZW1lbnQ7Ci0gICAgc2l6ZSsrOwotICAgIG1vZENvdW50Kys7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEJvb2xlYW4+IGNvbGxlY3Rpb24pIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICAKLSAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gV2Ugc3BlY2lhbGl6ZSB3aGVuIGFkZGluZyBhbm90aGVyIEJvb2xlYW5BcnJheUxpc3QgdG8gYXZvaWQgYm94aW5nIGVsZW1lbnRzLgotICAgIGlmICghKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBCb29sZWFuQXJyYXlMaXN0KSkgewotICAgICAgcmV0dXJuIHN1cGVyLmFkZEFsbChjb2xsZWN0aW9uKTsKLSAgICB9Ci0gICAgCi0gICAgQm9vbGVhbkFycmF5TGlzdCBsaXN0ID0gKEJvb2xlYW5BcnJheUxpc3QpIGNvbGxlY3Rpb247Ci0gICAgaWYgKGxpc3Quc2l6ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGludCBvdmVyZmxvdyA9IEludGVnZXIuTUFYX1ZBTFVFIC0gc2l6ZTsKLSAgICBpZiAob3ZlcmZsb3cgPCBsaXN0LnNpemUpIHsKLSAgICAgIC8vIFdlIGNhbid0IGFjdHVhbGx5IHJlcHJlc2VudCBhIGxpc3QgdGhpcyBsYXJnZS4KLSAgICAgIHRocm93IG5ldyBPdXRPZk1lbW9yeUVycm9yKCk7Ci0gICAgfQotICAgIAotICAgIGludCBuZXdTaXplID0gc2l6ZSArIGxpc3Quc2l6ZTsKLSAgICBpZiAobmV3U2l6ZSA+IGFycmF5Lmxlbmd0aCkgewotICAgICAgYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBuZXdTaXplKTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLmFycmF5Y29weShsaXN0LmFycmF5LCAwLCBhcnJheSwgc2l6ZSwgbGlzdC5zaXplKTsKLSAgICBzaXplID0gbmV3U2l6ZTsKLSAgICBtb2RDb3VudCsrOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChvLmVxdWFscyhhcnJheVtpXSkpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaSArIDEsIGFycmF5LCBpLCBzaXplIC0gaSk7Ci0gICAgICAgIHNpemUtLTsKLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQm9vbGVhbiByZW1vdmUoaW50IGluZGV4KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgZW5zdXJlSW5kZXhJblJhbmdlKGluZGV4KTsKLSAgICBib29sZWFuIHZhbHVlID0gYXJyYXlbaW5kZXhdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgMSwgYXJyYXksIGluZGV4LCBzaXplIC0gaW5kZXgpOwotICAgIHNpemUtLTsKLSAgICBtb2RDb3VudCsrOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoYXQgdGhlIHByb3ZpZGVkIHtAY29kZSBpbmRleH0gaXMgd2l0aGluIHRoZSByYW5nZSBvZiB7QGNvZGUgWzAsIHNpemVdfS4gVGhyb3dzIGFuCi0gICAqIHtAbGluayBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSBpZiBpdCBpcyBub3QuCi0gICAqIAotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHRvIHZlcmlmeSBpcyBpbiByYW5nZQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUluZGV4SW5SYW5nZShpbnQgaW5kZXgpIHsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKG1ha2VPdXRPZkJvdW5kc0V4Y2VwdGlvbk1lc3NhZ2UoaW5kZXgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBtYWtlT3V0T2ZCb3VuZHNFeGNlcHRpb25NZXNzYWdlKGludCBpbmRleCkgewotICAgIHJldHVybiAiSW5kZXg6IiArIGluZGV4ICsgIiwgU2l6ZToiICsgc2l6ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlQnVmZmVyV3JpdGVyLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVCdWZmZXJXcml0ZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGNjMzgxNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVCdWZmZXJXcml0ZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5NYXRoLm1heDsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLk1hdGgubWluOwotCi1pbXBvcnQgamF2YS5pby5GaWxlT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5sYW5nLnJlZi5Tb2Z0UmVmZXJlbmNlOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzcyB0byBwcm92aWRlIGVmZmljaWVudCB3cml0aW5nIG9mIHtAbGluayBCeXRlQnVmZmVyfXMgdG8ge0BsaW5rIE91dHB1dFN0cmVhbX1zLgotICovCi1maW5hbCBjbGFzcyBCeXRlQnVmZmVyV3JpdGVyIHsKLSAgcHJpdmF0ZSBCeXRlQnVmZmVyV3JpdGVyKCkge30KLQotICAvKioKLSAgICogTWluaW11bSBzaXplIGZvciBhIGNhY2hlZCBidWZmZXIuIFRoaXMgcHJldmVudHMgdXMgZnJvbSBhbGxvY2F0aW5nIGJ1ZmZlcnMgdGhhdCBhcmUgdG9vCi0gICAqIHNtYWxsIHRvIGJlIGVhc2lseSByZXVzZWQuCi0gICAqLwotICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiB0dW5lIHRoaXMgcHJvcGVydHkgb3IgYWxsb3cgY29uZmlndXJhdGlvbj8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1JTl9DQUNIRURfQlVGRkVSX1NJWkUgPSAxMDI0OwotCi0gIC8qKgotICAgKiBNYXhpbXVtIHNpemUgZm9yIGEgY2FjaGVkIGJ1ZmZlci4gSWYgYSBsYXJnZXIgYnVmZmVyIGlzIHJlcXVpcmVkLCBpdCB3aWxsIGJlIGFsbG9jYXRlZAotICAgKiBidXQgbm90IGNhY2hlZC4KLSAgICovCi0gIC8vIFRPRE8obmF0aGFubWl0dGxlcik6IHR1bmUgdGhpcyBwcm9wZXJ0eSBvciBhbGxvdyBjb25maWd1cmF0aW9uPwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0NBQ0hFRF9CVUZGRVJfU0laRSA9IDE2ICogMTAyNDsKLQotICAvKioKLSAgICogVGhlIGZyYWN0aW9uIG9mIHRoZSByZXF1ZXN0ZWQgYnVmZmVyIHNpemUgdW5kZXIgd2hpY2ggdGhlIGJ1ZmZlciB3aWxsIGJlIHJlYWxsb2NhdGVkLgotICAgKi8KLSAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogdHVuZSB0aGlzIHByb3BlcnR5IG9yIGFsbG93IGNvbmZpZ3VyYXRpb24/Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGZsb2F0IEJVRkZFUl9SRUFMTE9DQVRJT05fVEhSRVNIT0xEID0gMC41ZjsKLQotICAvKioKLSAgICogS2VlcGluZyBhIHNvZnQgcmVmZXJlbmNlIHRvIGEgdGhyZWFkLWxvY2FsIGJ1ZmZlci4gVGhpcyBidWZmZXIgaXMgdXNlZCBmb3Igd3JpdGluZyBhCi0gICAqIHtAbGluayBCeXRlQnVmZmVyfSB0byBhbiB7QGxpbmsgT3V0cHV0U3RyZWFtfSB3aGVuIG5vIHplcm8tY29weSBhbHRlcm5hdGl2ZSB3YXMgYXZhaWxhYmxlLgotICAgKiBVc2luZyBhICJzb2Z0IiByZWZlcmVuY2Ugc2luY2UgVk1zIG1heSBrZWVwIHRoaXMgcmVmZXJlbmNlIGFyb3VuZCBsb25nZXIgdGhhbiAid2VhayIKLSAgICogKGUuZy4gSG90U3BvdCB3aWxsIG1haW50YWluIHNvZnQgcmVmZXJlbmNlcyB1bnRpbCBtZW1vcnkgcHJlc3N1cmUgd2FycmFudHMgY29sbGVjdGlvbikuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxTb2Z0UmVmZXJlbmNlPGJ5dGVbXT4+IEJVRkZFUiA9Ci0gICAgICBuZXcgVGhyZWFkTG9jYWw8U29mdFJlZmVyZW5jZTxieXRlW10+PigpOwotCi0gIC8qKgotICAgKiBGb3IgdGVzdGluZyBwdXJwb3NlcyBvbmx5LiBDbGVhcnMgdGhlIGNhY2hlZCBidWZmZXIgdG8gZm9yY2UgYSBuZXcgYWxsb2NhdGlvbiBvbiB0aGUgbmV4dAotICAgKiBpbnZvY2F0aW9uLgotICAgKi8KLSAgc3RhdGljIHZvaWQgY2xlYXJDYWNoZWRCdWZmZXIoKSB7Ci0gICAgQlVGRkVSLnNldChudWxsKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIHJlbWFpbmluZyBjb250ZW50IG9mIHRoZSBidWZmZXIgdG8gdGhlIGdpdmVuIHN0cmVhbS4gVGhlIGJ1ZmZlciB7QGNvZGUgcG9zaXRpb259Ci0gICAqIHdpbGwgcmVtYWluIHVuY2hhbmdlZCBieSB0aGlzIG1ldGhvZC4KLSAgICovCi0gIHN0YXRpYyB2b2lkIHdyaXRlKEJ5dGVCdWZmZXIgYnVmZmVyLCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBpbml0aWFsUG9zID0gYnVmZmVyLnBvc2l0aW9uKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChidWZmZXIuaGFzQXJyYXkoKSkgewotICAgICAgICAvLyBPcHRpbWl6ZWQgd3JpdGUgZm9yIGFycmF5LWJhY2tlZCBidWZmZXJzLgotICAgICAgICAvLyBOb3RlIHRoYXQgd2UncmUgdGFraW5nIHRoZSByaXNrIHRoYXQgYSBtYWxpY2lvdXMgT3V0cHV0U3RyZWFtIGNvdWxkIG1vZGlmeSB0aGUgYXJyYXkuCi0gICAgICAgIG91dHB1dC53cml0ZShidWZmZXIuYXJyYXkoKSwgYnVmZmVyLmFycmF5T2Zmc2V0KCkgKyBidWZmZXIucG9zaXRpb24oKSwgYnVmZmVyLnJlbWFpbmluZygpKTsKLSAgICAgIH0gZWxzZSBpZiAob3V0cHV0IGluc3RhbmNlb2YgRmlsZU91dHB1dFN0cmVhbSkgewotICAgICAgICAvLyBVc2UgYSBjaGFubmVsIHRvIHdyaXRlIG91dCB0aGUgQnl0ZUJ1ZmZlci4gVGhpcyB3aWxsIGF1dG9tYXRpY2FsbHkgZW1wdHkgdGhlIGJ1ZmZlci4KLSAgICAgICAgKChGaWxlT3V0cHV0U3RyZWFtKSBvdXRwdXQpLmdldENoYW5uZWwoKS53cml0ZShidWZmZXIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gUmVhZCBhbGwgb2YgdGhlIGRhdGEgZnJvbSB0aGUgYnVmZmVyIHRvIGFuIGFycmF5LgotICAgICAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBDb25zaWRlciBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMgZm9yIG90aGVyICJrbm93biIgc3RyZWFtIHR5cGVzLgotICAgICAgICBmaW5hbCBieXRlW10gYXJyYXkgPSBnZXRPckNyZWF0ZUJ1ZmZlcihidWZmZXIucmVtYWluaW5nKCkpOwotICAgICAgICB3aGlsZSAoYnVmZmVyLmhhc1JlbWFpbmluZygpKSB7Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IG1pbihidWZmZXIucmVtYWluaW5nKCksIGFycmF5Lmxlbmd0aCk7Ci0gICAgICAgICAgYnVmZmVyLmdldChhcnJheSwgMCwgbGVuZ3RoKTsKLSAgICAgICAgICBvdXRwdXQud3JpdGUoYXJyYXksIDAsIGxlbmd0aCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGZpbmFsbHkgewotICAgICAgLy8gUmVzdG9yZSB0aGUgaW5pdGlhbCBwb3NpdGlvbi4KLSAgICAgIGJ1ZmZlci5wb3NpdGlvbihpbml0aWFsUG9zKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBieXRlW10gZ2V0T3JDcmVhdGVCdWZmZXIoaW50IHJlcXVlc3RlZFNpemUpIHsKLSAgICByZXF1ZXN0ZWRTaXplID0gbWF4KHJlcXVlc3RlZFNpemUsIE1JTl9DQUNIRURfQlVGRkVSX1NJWkUpOwotCi0gICAgYnl0ZVtdIGJ1ZmZlciA9IGdldEJ1ZmZlcigpOwotICAgIC8vIE9ubHkgYWxsb2NhdGUgaWYgd2UgbmVlZCB0by4KLSAgICBpZiAoYnVmZmVyID09IG51bGwgfHwgbmVlZFRvUmVhbGxvY2F0ZShyZXF1ZXN0ZWRTaXplLCBidWZmZXIubGVuZ3RoKSkgewotICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbcmVxdWVzdGVkU2l6ZV07Ci0KLSAgICAgIC8vIE9ubHkgY2FjaGUgdGhlIGJ1ZmZlciBpZiBpdCdzIG5vdCB0b28gYmlnLgotICAgICAgaWYgKHJlcXVlc3RlZFNpemUgPD0gTUFYX0NBQ0hFRF9CVUZGRVJfU0laRSkgewotICAgICAgICBzZXRCdWZmZXIoYnVmZmVyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gbmVlZFRvUmVhbGxvY2F0ZShpbnQgcmVxdWVzdGVkU2l6ZSwgaW50IGJ1ZmZlckxlbmd0aCkgewotICAgIC8vIEZpcnN0IGNoZWNrIGFnYWluc3QganVzdCB0aGUgcmVxdWVzdGVkIGxlbmd0aCB0byBhdm9pZCB0aGUgbXVsdGlwbHkuCi0gICAgcmV0dXJuIGJ1ZmZlckxlbmd0aCA8IHJlcXVlc3RlZFNpemUKLSAgICAgICAgJiYgYnVmZmVyTGVuZ3RoIDwgcmVxdWVzdGVkU2l6ZSAqIEJVRkZFUl9SRUFMTE9DQVRJT05fVEhSRVNIT0xEOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYnl0ZVtdIGdldEJ1ZmZlcigpIHsKLSAgICBTb2Z0UmVmZXJlbmNlPGJ5dGVbXT4gc3IgPSBCVUZGRVIuZ2V0KCk7Ci0gICAgcmV0dXJuIHNyID09IG51bGwgPyBudWxsIDogc3IuZ2V0KCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldEJ1ZmZlcihieXRlW10gdmFsdWUpIHsKLSAgICBCVUZGRVIuc2V0KG5ldyBTb2Z0UmVmZXJlbmNlPGJ5dGVbXT4odmFsdWUpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlT3V0cHV0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVPdXRwdXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGI3YjA0Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVPdXRwdXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotCi0vKioKLSAqIEFuIG91dHB1dCB0YXJnZXQgZm9yIHJhdyBieXRlcy4gVGhpcyBpbnRlcmZhY2UgcHJvdmlkZXMgc2VtYW50aWNzIHRoYXQgc3VwcG9ydCB0d28gdHlwZXMgb2YKLSAqIHdyaXRpbmc6Ci0gKgotICogPHAvPjxiPlRyYWRpdGlvbmFsIHdyaXRlIG9wZXJhdGlvbnM6PC9iPgotICogKGFzIGRlZmluZWQgYnkge0BsaW5rIGphdmEuaW8uT3V0cHV0U3RyZWFtfSkgd2hlcmUgdGhlIHRhcmdldCBtZXRob2QgaXMgcmVzcG9uc2libGUgZm9yIGVpdGhlcgotICogY29weWluZyB0aGUgZGF0YSBvciBjb21wbGV0aW5nIHRoZSB3cml0ZSBiZWZvcmUgcmV0dXJuaW5nIGZyb20gdGhlIG1ldGhvZCBjYWxsLgotICoKLSAqIDxwLz48Yj5MYXp5IHdyaXRlIG9wZXJhdGlvbnM6PC9iPiB3aGVyZSB0aGUgY2FsbGVyIGd1YXJhbnRlZXMgdGhhdCBpdCB3aWxsIG5ldmVyIG1vZGlmeSB0aGUKLSAqIHByb3ZpZGVkIGJ1ZmZlciBhbmQgaXQgY2FuIHRoZXJlZm9yZSBiZSBjb25zaWRlcmVkIGltbXV0YWJsZS4gVGhlIHRhcmdldCBtZXRob2QgaXMgZnJlZSB0bwotICogbWFpbnRhaW4gYSByZWZlcmVuY2UgdG8gdGhlIGJ1ZmZlciBiZXlvbmQgdGhlIHNjb3BlIG9mIHRoZSBtZXRob2QgY2FsbCAoZS5nLiB1bnRpbCB0aGUgd3JpdGUKLSAqIG9wZXJhdGlvbiBjb21wbGV0ZXMpLgotICovCi1ARXhwZXJpbWVudGFsQXBpCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgQnl0ZU91dHB1dCB7Ci0gIC8qKgotICAgKiBXcml0ZXMgYSBzaW5nbGUgYnl0ZS4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBieXRlIHRvIGJlIHdyaXR0ZW4KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoYnl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzZXF1ZW5jZSBvZiBieXRlcy4gVGhlIHtAbGluayBCeXRlT3V0cHV0fSBtdXN0IGNvcHkge0Bjb2RlIHZhbHVlfSBpZiBpdCB3aWxsCi0gICAqIG5vdCBiZSBwcm9jZXNzZWQgcHJpb3IgdG8gdGhlIHJldHVybiBvZiB0aGlzIG1ldGhvZCBjYWxsLCBzaW5jZSB7QGNvZGUgdmFsdWV9IG1heSBiZQotICAgKiByZXVzZWQvYWx0ZXJlZCBieSB0aGUgY2FsbGVyLgotICAgKgotICAgKiA8cD5OT1RFOiBUaGlzIG1ldGhvZCA8c3Ryb25nPk1VU1QgTk9UPC9zdHJvbmc+IG1vZGlmeSB0aGUge0Bjb2RlIHZhbHVlfS4gRG9pbmcgc28gaXMgYQotICAgKiBwcm9ncmFtbWluZyBlcnJvciBhbmQgd2lsbCBsZWFkIHRvIGRhdGEgY29ycnVwdGlvbiB3aGljaCB3aWxsIGJlIGRpZmZpY3VsdCB0byBkZWJ1Zy4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBieXRlcyB0byBiZSB3cml0dGVuCi0gICAqIEBwYXJhbSBvZmZzZXQgdGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIHdyaXRhYmxlIHJhbmdlCi0gICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZSBzdGFydGluZyBmcm9tIHtAY29kZSBvZmZzZXR9Ci0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gdGhyb3duIGlmIGFuIGVycm9yIG9jY3VycmVkIHdoaWxlIHdyaXRpbmcKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzZXF1ZW5jZSBvZiBieXRlcy4gVGhlIHtAbGluayBCeXRlT3V0cHV0fSBpcyBmcmVlIHRvIHJldGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUKLSAgICogYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIG1ldGhvZCBjYWxsIChlLmcuIHdyaXRlIGxhdGVyKSBzaW5jZSBpdCBpcyBjb25zaWRlcmVkIGltbXV0YWJsZSBhbmQgaXMKLSAgICogZ3VhcmFudGVlZCBub3QgdG8gY2hhbmdlIGJ5IHRoZSBjYWxsZXIuCi0gICAqCi0gICAqIDxwPk5PVEU6IFRoaXMgbWV0aG9kIDxzdHJvbmc+TVVTVCBOT1Q8L3N0cm9uZz4gbW9kaWZ5IHRoZSB7QGNvZGUgdmFsdWV9LiBEb2luZyBzbyBpcyBhCi0gICAqIHByb2dyYW1taW5nIGVycm9yIGFuZCB3aWxsIGxlYWQgdG8gZGF0YSBjb3JydXB0aW9uIHdoaWNoIHdpbGwgYmUgZGlmZmljdWx0IHRvIGRlYnVnLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KLSAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IG9mIHRoZSBzdGFydCBvZiB0aGUgd3JpdGFibGUgcmFuZ2UKLSAgICogQHBhcmFtIGxlbmd0aCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHdyaXRlIHN0YXJ0aW5nIGZyb20ge0Bjb2RlIG9mZnNldH0KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVMYXp5KGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzZXF1ZW5jZSBvZiBieXRlcy4gVGhlIHtAbGluayBCeXRlT3V0cHV0fSBtdXN0IGNvcHkge0Bjb2RlIHZhbHVlfSBpZiBpdCB3aWxsCi0gICAqIG5vdCBiZSBwcm9jZXNzZWQgcHJpb3IgdG8gdGhlIHJldHVybiBvZiB0aGlzIG1ldGhvZCBjYWxsLCBzaW5jZSB7QGNvZGUgdmFsdWV9IG1heSBiZQotICAgKiByZXVzZWQvYWx0ZXJlZCBieSB0aGUgY2FsbGVyLgotICAgKgotICAgKiA8cD5OT1RFOiBUaGlzIG1ldGhvZCA8c3Ryb25nPk1VU1QgTk9UPC9zdHJvbmc+IG1vZGlmeSB0aGUge0Bjb2RlIHZhbHVlfS4gRG9pbmcgc28gaXMgYQotICAgKiBwcm9ncmFtbWluZyBlcnJvciBhbmQgd2lsbCBsZWFkIHRvIGRhdGEgY29ycnVwdGlvbiB3aGljaCB3aWxsIGJlIGRpZmZpY3VsdCB0byBkZWJ1Zy4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlIHRoZSBieXRlcyB0byBiZSB3cml0dGVuLiBVcG9uIHJldHVybmluZyBmcm9tIHRoaXMgY2FsbCwgdGhlIHtAY29kZSBwb3NpdGlvbn0gb2YKLSAgICogdGhpcyBidWZmZXIgd2lsbCBiZSBzZXQgdG8gdGhlIHtAY29kZSBsaW1pdH0KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiB0aHJvd24gaWYgYW4gZXJyb3Igb2NjdXJyZWQgd2hpbGUgd3JpdGluZwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgYSBzZXF1ZW5jZSBvZiBieXRlcy4gVGhlIHtAbGluayBCeXRlT3V0cHV0fSBpcyBmcmVlIHRvIHJldGFpbiBhIHJlZmVyZW5jZSB0byB0aGUgdmFsdWUKLSAgICogYmV5b25kIHRoZSBzY29wZSBvZiB0aGlzIG1ldGhvZCBjYWxsIChlLmcuIHdyaXRlIGxhdGVyKSBzaW5jZSBpdCBpcyBjb25zaWRlcmVkIGltbXV0YWJsZSBhbmQgaXMKLSAgICogZ3VhcmFudGVlZCBub3QgdG8gY2hhbmdlIGJ5IHRoZSBjYWxsZXIuCi0gICAqCi0gICAqIDxwPk5PVEU6IFRoaXMgbWV0aG9kIDxzdHJvbmc+TVVTVCBOT1Q8L3N0cm9uZz4gbW9kaWZ5IHRoZSB7QGNvZGUgdmFsdWV9LiBEb2luZyBzbyBpcyBhCi0gICAqIHByb2dyYW1taW5nIGVycm9yIGFuZCB3aWxsIGxlYWQgdG8gZGF0YSBjb3JydXB0aW9uIHdoaWNoIHdpbGwgYmUgZGlmZmljdWx0IHRvIGRlYnVnLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIGJ5dGVzIHRvIGJlIHdyaXR0ZW4uIFVwb24gcmV0dXJuaW5nIGZyb20gdGhpcyBjYWxsLCB0aGUge0Bjb2RlIHBvc2l0aW9ufSBvZgotICAgKiB0aGlzIGJ1ZmZlciB3aWxsIGJlIHNldCB0byB0aGUge0Bjb2RlIGxpbWl0fQotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIHRocm93biBpZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZSB3cml0aW5nCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUxhenkoQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmcuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJjOTQ1MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE1NDQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSW52YWxpZE9iamVjdEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LlVuc3VwcG9ydGVkQ2hhcnNldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLQotLyoqCi0gKiBJbW11dGFibGUgc2VxdWVuY2Ugb2YgYnl0ZXMuICBTdWJzdHJpbmcgaXMgc3VwcG9ydGVkIGJ5IHNoYXJpbmcgdGhlIHJlZmVyZW5jZQotICogdG8gdGhlIGltbXV0YWJsZSB1bmRlcmx5aW5nIGJ5dGVzLCBhcyB3aXRoIHtAbGluayBTdHJpbmd9LiAgQ29uY2F0ZW5hdGlvbiBpcwotICogbGlrZXdpc2Ugc3VwcG9ydGVkIHdpdGhvdXQgY29weWluZyAobG9uZyBzdHJpbmdzKSBieSBidWlsZGluZyBhIHRyZWUgb2YKLSAqIHBpZWNlcyBpbiB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9LgotICogPHA+Ci0gKiBMaWtlIHtAbGluayBTdHJpbmd9LCB0aGUgY29udGVudHMgb2YgYSB7QGxpbmsgQnl0ZVN0cmluZ30gY2FuIG5ldmVyIGJlCi0gKiBvYnNlcnZlZCB0byBjaGFuZ2UsIG5vdCBldmVuIGluIHRoZSBwcmVzZW5jZSBvZiBhIGRhdGEgcmFjZSBvciBpbmNvcnJlY3QKLSAqIEFQSSB1c2FnZSBpbiB0aGUgY2xpZW50IGNvZGUuCi0gKgotICogQGF1dGhvciBjcmF6eWJvYkBnb29nbGUuY29tIEJvYiBMZWUKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIENhcmwgSGF2ZXJsCi0gKiBAYXV0aG9yIG1hcnRpbnJiQGdvb2dsZS5jb20gTWFydGluIEJ1Y2hob2x6Ci0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBCeXRlU3RyaW5nIGltcGxlbWVudHMgSXRlcmFibGU8Qnl0ZT4sIFNlcmlhbGl6YWJsZSB7Ci0KLSAgLyoqCi0gICAqIFdoZW4gdHdvIHN0cmluZ3MgdG8gYmUgY29uY2F0ZW5hdGVkIGhhdmUgYSBjb21iaW5lZCBsZW5ndGggc2hvcnRlciB0aGFuCi0gICAqIHRoaXMsIHdlIGp1c3QgY29weSB0aGVpciBieXRlcyBvbiB7QGxpbmsgI2NvbmNhdChCeXRlU3RyaW5nKX0uCi0gICAqIFRoZSB0cmFkZS1vZmYgaXMgY29weSBzaXplIHZlcnN1cyB0aGUgb3ZlcmhlYWQgb2YgY3JlYXRpbmcgdHJlZSBub2RlcwotICAgKiBpbiB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9LgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGludCBDT05DQVRFTkFURV9CWV9DT1BZX1NJWkUgPSAxMjg7Ci0KLSAgLyoqCi0gICAqIFdoZW4gY29weWluZyBhbiBJbnB1dFN0cmVhbSBpbnRvIGEgQnl0ZVN0cmluZyB3aXRoIC5yZWFkRnJvbSgpLAotICAgKiB0aGUgY2h1bmtzIGluIHRoZSB1bmRlcmx5aW5nIHJvcGUgc3RhcnQgYXQgMjU2IGJ5dGVzLCBidXQgZG91YmxlCi0gICAqIGVhY2ggaXRlcmF0aW9uIHVwIHRvIDgxOTIgYnl0ZXMuCi0gICAqLwotICBzdGF0aWMgZmluYWwgaW50IE1JTl9SRUFEX0ZST01fQ0hVTktfU0laRSA9IDB4MTAwOyAgLy8gMjU2YgotICBzdGF0aWMgZmluYWwgaW50IE1BWF9SRUFEX0ZST01fQ0hVTktfU0laRSA9IDB4MjAwMDsgIC8vIDhrCi0KLSAgLyoqCi0gICAqIEVtcHR5IHtAY29kZSBCeXRlU3RyaW5nfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZVN0cmluZyBFTVBUWSA9IG5ldyBMaXRlcmFsQnl0ZVN0cmluZyhJbnRlcm5hbC5FTVBUWV9CWVRFX0FSUkFZKTsKLSAgCi0gIC8qKiAKLSAgICogQW4gaW50ZXJmYWNlIHRvIGVmZmljaWVudGx5IGNvcHkge0Bjb2RlIGJ5dGVbXX0uCi0gICAqIAotICAgKiA8cD5PbmUgb2YgdGhlIG5vdGljYWJsZSBjb3N0cyBvZiBjb3B5aW5nIGEgYnl0ZVtdIGludG8gYSBuZXcgYXJyYXkgdXNpbmcgCi0gICAqIHtAY29kZSBTeXN0ZW0uYXJyYXljb3B5fSBpcyBudWxsaWZpY2F0aW9uIG9mIGEgbmV3IGJ1ZmZlciBiZWZvcmUgdGhlIGNvcHkuIEl0IGhhcyBiZWVuIHNob3duIAotICAgKiB0aGUgSG90c3BvdCBWTSBpcyBjYXBhYmxlIHRvIGludHJpc2ljZnkge0Bjb2RlIEFycmF5cy5jb3B5T2ZSYW5nZX0gb3BlcmF0aW9uIHRvIGF2b2lkIHRoaXMKLSAgICogZXhwZW5zaXZlIG51bGxpZmljYXRpb24gYW5kIHByb3ZpZGUgc3Vic3RhbnRpYWwgcGVyZm9ybWFuY2UgZ2Fpbi4gVW5mb3J0dW5hdGVseSB0aGlzIGRvZXMgbm90Ci0gICAqIGhvbGQgb24gQW5kcm9pZCBydW50aW1lcyBhbmQgY291bGQgbWFrZSB0aGUgY29weSBzbGlnaHRseSBzbG93ZXIgZHVlIHRvIGFkZGl0aW9uYWwgY29kZSBpbgotICAgKiB0aGUge0Bjb2RlIEFycmF5cy5jb3B5T2ZSYW5nZX0uIFRodXMgd2UgcHJvdmlkZSB0d28gZGlmZmVyZW50IGltcGxlbWVudGF0aW9uIGZvciBhcnJheSBjb3BpZXIKLSAgICogZm9yIEhvdHNwb3QgYW5kIEFuZHJvaWQgcnVudGltZXMuIAotICAgKi8KLSAgcHJpdmF0ZSBpbnRlcmZhY2UgQnl0ZUFycmF5Q29waWVyIHsKLSAgICAvKioKLSAgICAgKiBDb3BpZXMgdGhlIHNwZWNpZmllZCByYW5nZSBvZiB0aGUgc3BlY2lmaWVkIGFycmF5IGludG8gYSBuZXcgYXJyYXkKLSAgICAgKi8KLSAgICBieXRlW10gY29weUZyb20oYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSk7Ci0gIH0KLSAgCi0gIC8qKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGNvZGUgQnl0ZUFycmF5Q29waWVyfSB3aGljaCB1c2VzIHtAbGluayBTeXN0ZW0jYXJyYXljb3B5fS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU3lzdGVtQnl0ZUFycmF5Q29waWVyIGltcGxlbWVudHMgQnl0ZUFycmF5Q29waWVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIGNvcHlGcm9tKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IHNpemUpIHsKLSAgICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCBvZmZzZXQsIGNvcHksIDAsIHNpemUpOwotICAgICAgcmV0dXJuIGNvcHk7Ci0gICAgfQotICB9Ci0gIAotICAvKiogSW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIEJ5dGVBcnJheUNvcGllcn0gd2hpY2ggdXNlcyB7QGxpbmsgQXJyYXlzI2NvcHlPZlJhbmdlfS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQXJyYXlzQnl0ZUFycmF5Q29waWVyIGltcGxlbWVudHMgQnl0ZUFycmF5Q29waWVyIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIGNvcHlGcm9tKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IHNpemUpIHsKLSAgICAgIHJldHVybiBBcnJheXMuY29weU9mUmFuZ2UoYnl0ZXMsIG9mZnNldCwgb2Zmc2V0ICsgc2l6ZSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlQXJyYXlDb3BpZXIgYnl0ZUFycmF5Q29waWVyOwotICBzdGF0aWMgewotICAgIGJvb2xlYW4gaXNBbmRyb2lkID0gdHJ1ZTsKLSAgICB0cnkgewotICAgICAgQ2xhc3MuZm9yTmFtZSgiYW5kcm9pZC5jb250ZW50LkNvbnRleHQiKTsKLSAgICB9IGNhdGNoIChDbGFzc05vdEZvdW5kRXhjZXB0aW9uIGUpIHsKLSAgICAgIGlzQW5kcm9pZCA9IGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBieXRlQXJyYXlDb3BpZXIgPSBpc0FuZHJvaWQgPyBuZXcgU3lzdGVtQnl0ZUFycmF5Q29waWVyKCkgOiBuZXcgQXJyYXlzQnl0ZUFycmF5Q29waWVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FjaGVkIGhhc2ggdmFsdWUuIEludGVudGlvbmFsbHkgYWNjZXNzZWQgdmlhIGEgZGF0YSByYWNlLCB3aGljaAotICAgKiBpcyBzYWZlIGJlY2F1c2Ugb2YgdGhlIEphdmEgTWVtb3J5IE1vZGVsJ3MgIm5vIG91dC1vZi10aGluLWFpciB2YWx1ZXMiCi0gICAqIGd1YXJhbnRlZXMgZm9yIGludHMuIEEgdmFsdWUgb2YgMCBpbXBsaWVzIHRoYXQgdGhlIGhhc2ggaGFzIG5vdCBiZWVuIHNldC4KLSAgICovCi0gIHByaXZhdGUgaW50IGhhc2ggPSAwOwotCi0gIC8vIFRoaXMgY29uc3RydWN0b3IgaXMgaGVyZSB0byBwcmV2ZW50IHN1YmNsYXNzaW5nIG91dHNpZGUgb2YgdGhpcyBwYWNrYWdlLAotICBCeXRlU3RyaW5nKCkge30KLQotICAvKioKLSAgICogR2V0cyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguIFRoaXMgbWV0aG9kIHNob3VsZCBiZSB1c2VkIG9ubHkgZm9yCi0gICAqIHJhbmRvbSBhY2Nlc3MgdG8gaW5kaXZpZHVhbCBieXRlcy4gVG8gYWNjZXNzIGJ5dGVzIHNlcXVlbnRpYWxseSwgdXNlIHRoZQotICAgKiB7QGxpbmsgQnl0ZUl0ZXJhdG9yfSByZXR1cm5lZCBieSB7QGxpbmsgI2l0ZXJhdG9yKCl9LCBhbmQgY2FsbCB7QGxpbmsKLSAgICogI3N1YnN0cmluZyhpbnQsIGludCl9IGZpcnN0IGlmIG5lY2Vzc2FyeS4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIGJ5dGUKLSAgICogQHJldHVybiB0aGUgdmFsdWUKLSAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHtAY29kZSBpbmRleCA8IDAgb3IgaW5kZXggPj0gc2l6ZX0KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBieXRlIGJ5dGVBdChpbnQgaW5kZXgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSB7QGxpbmsgQnl0ZVN0cmluZy5CeXRlSXRlcmF0b3J9IG92ZXIgdGhlIGJ5dGVzIGluIHRoZSBCeXRlU3RyaW5nLgotICAgKiBUbyBhdm9pZCBhdXRvLWJveGluZywgeW91IG1heSBnZXQgdGhlIGl0ZXJhdG9yIG1hbnVhbGx5IGFuZCBjYWxsCi0gICAqIHtAbGluayBCeXRlSXRlcmF0b3IjbmV4dEJ5dGUoKX0uCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGl0ZXJhdG9yCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIEJ5dGVJdGVyYXRvciBpdGVyYXRvcigpIHsKLSAgICByZXR1cm4gbmV3IEJ5dGVJdGVyYXRvcigpIHsKLSAgICAgIHByaXZhdGUgaW50IHBvc2l0aW9uID0gMDsKLSAgICAgIHByaXZhdGUgZmluYWwgaW50IGxpbWl0ID0gc2l6ZSgpOwotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIHJldHVybiBwb3NpdGlvbiA8IGxpbWl0OwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBCeXRlIG5leHQoKSB7Ci0gICAgICAgIC8vIEJveGluZyBjYWxscyBCeXRlLnZhbHVlT2YoYnl0ZSksIHdoaWNoIGRvZXMgbm90IGluc3RhbnRpYXRlLgotICAgICAgICByZXR1cm4gbmV4dEJ5dGUoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYnl0ZSBuZXh0Qnl0ZSgpIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICByZXR1cm4gYnl0ZUF0KHBvc2l0aW9uKyspOwotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBpbnRlcmZhY2UgZXh0ZW5kcyB7QGNvZGUgSXRlcmF0b3I8Qnl0ZT59LCBzbyB0aGF0IHdlIGNhbiByZXR1cm4gYW4KLSAgICogdW5ib3hlZCB7QGNvZGUgYnl0ZX0uCi0gICAqLwotICBwdWJsaWMgaW50ZXJmYWNlIEJ5dGVJdGVyYXRvciBleHRlbmRzIEl0ZXJhdG9yPEJ5dGU+IHsKLSAgICAvKioKLSAgICAgKiBBbiBhbHRlcm5hdGl2ZSB0byB7QGxpbmsgSXRlcmF0b3IjbmV4dCgpfSB0aGF0IHJldHVybnMgYW4KLSAgICAgKiB1bmJveGVkIHByaW1pdGl2ZSB7QGNvZGUgYnl0ZX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoZSBuZXh0IHtAY29kZSBieXRlfSBpbiB0aGUgaXRlcmF0aW9uCi0gICAgICogQHRocm93cyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGlmIHRoZSBpdGVyYXRpb24gaGFzIG5vIG1vcmUgZWxlbWVudHMKLSAgICAgKi8KLSAgICBieXRlIG5leHRCeXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbnVtYmVyIG9mIGJ5dGVzLgotICAgKgotICAgKiBAcmV0dXJuIHNpemUgaW4gYnl0ZXMKLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgc2l6ZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgc2l6ZSBpcyB7QGNvZGUgMH0sIHtAY29kZSBmYWxzZX0gb3RoZXJ3aXNlLgotICAgKgotICAgKiBAcmV0dXJuIHRydWUgaWYgdGhpcyBpcyB6ZXJvIGJ5dGVzIGxvbmcKLSAgICovCi0gIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgcmV0dXJuIHNpemUoKSA9PSAwOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gQnl0ZVN0cmluZyAtPiBzdWJzdHJpbmcKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdWJzdHJpbmcgZnJvbSB7QGNvZGUgYmVnaW5JbmRleH0sIGluY2x1c2l2ZSwgdG8gdGhlIGVuZCBvZiB0aGUKLSAgICogc3RyaW5nLgotICAgKgotICAgKiBAcGFyYW0gYmVnaW5JbmRleCBzdGFydCBhdCB0aGlzIGluZGV4Ci0gICAqIEByZXR1cm4gc3Vic3RyaW5nIHNoYXJpbmcgdW5kZXJseWluZyBkYXRhCi0gICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB7QGNvZGUgYmVnaW5JbmRleCA8IDB9IG9yCi0gICAqICAgICB7QGNvZGUgYmVnaW5JbmRleCA+IHNpemUoKX0uCi0gICAqLwotICBwdWJsaWMgZmluYWwgQnl0ZVN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luSW5kZXgpIHsKLSAgICByZXR1cm4gc3Vic3RyaW5nKGJlZ2luSW5kZXgsIHNpemUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBzdWJzdHJpbmcgZnJvbSB7QGNvZGUgYmVnaW5JbmRleH0sIGluY2x1c2l2ZSwgdG8ge0Bjb2RlCi0gICAqIGVuZEluZGV4fSwgZXhjbHVzaXZlLgotICAgKgotICAgKiBAcGFyYW0gYmVnaW5JbmRleCBzdGFydCBhdCB0aGlzIGluZGV4Ci0gICAqIEBwYXJhbSBlbmRJbmRleCAgIHRoZSBsYXN0IGNoYXJhY3RlciBpcyB0aGUgb25lIGJlZm9yZSB0aGlzIGluZGV4Ci0gICAqIEByZXR1cm4gc3Vic3RyaW5nIHNoYXJpbmcgdW5kZXJseWluZyBkYXRhCi0gICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB7QGNvZGUgYmVnaW5JbmRleCA8IDB9LAotICAgKiAgICAge0Bjb2RlIGVuZEluZGV4ID4gc2l6ZSgpfSwgb3Ige0Bjb2RlIGJlZ2luSW5kZXggPiBlbmRJbmRleH0uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgQnl0ZVN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCk7Ci0KLSAgLyoqCi0gICAqIFRlc3RzIGlmIHRoaXMgYnl0ZXN0cmluZyBzdGFydHMgd2l0aCB0aGUgc3BlY2lmaWVkIHByZWZpeC4KLSAgICogU2ltaWxhciB0byB7QGxpbmsgU3RyaW5nI3N0YXJ0c1dpdGgoU3RyaW5nKX0KLSAgICoKLSAgICogQHBhcmFtIHByZWZpeCB0aGUgcHJlZml4LgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZQotICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGEgcHJlZml4IG9mIHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5Ci0gICAqICAgICAgICAgdGhpcyBzdHJpbmc7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBzdGFydHNXaXRoKEJ5dGVTdHJpbmcgcHJlZml4KSB7Ci0gICAgcmV0dXJuIHNpemUoKSA+PSBwcmVmaXguc2l6ZSgpICYmCi0gICAgICAgICAgIHN1YnN0cmluZygwLCBwcmVmaXguc2l6ZSgpKS5lcXVhbHMocHJlZml4KTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyBpZiB0aGlzIGJ5dGVzdHJpbmcgZW5kcyB3aXRoIHRoZSBzcGVjaWZpZWQgc3VmZml4LgotICAgKiBTaW1pbGFyIHRvIHtAbGluayBTdHJpbmcjZW5kc1dpdGgoU3RyaW5nKX0KLSAgICoKLSAgICogQHBhcmFtIHN1ZmZpeCB0aGUgc3VmZml4LgotICAgKiBAcmV0dXJuIDxjb2RlPnRydWU8L2NvZGU+IGlmIHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5IHRoZQotICAgKiAgICAgICAgIGFyZ3VtZW50IGlzIGEgc3VmZml4IG9mIHRoZSBieXRlIHNlcXVlbmNlIHJlcHJlc2VudGVkIGJ5Ci0gICAqICAgICAgICAgdGhpcyBzdHJpbmc7IDxjb2RlPmZhbHNlPC9jb2RlPiBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgZmluYWwgYm9vbGVhbiBlbmRzV2l0aChCeXRlU3RyaW5nIHN1ZmZpeCkgewotICAgIHJldHVybiBzaXplKCkgPj0gc3VmZml4LnNpemUoKSAmJgotICAgICAgICBzdWJzdHJpbmcoc2l6ZSgpIC0gc3VmZml4LnNpemUoKSkuZXF1YWxzKHN1ZmZpeCk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBieXRlW10gLT4gQnl0ZVN0cmluZwotCi0gIC8qKgotICAgKiBDb3BpZXMgdGhlIGdpdmVuIGJ5dGVzIGludG8gYSB7QGNvZGUgQnl0ZVN0cmluZ30uCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyBzb3VyY2UgYXJyYXkKLSAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW4gc291cmNlIGFycmF5Ci0gICAqIEBwYXJhbSBzaXplIG51bWJlciBvZiBieXRlcyB0byBjb3B5Ci0gICAqIEByZXR1cm4gbmV3IHtAY29kZSBCeXRlU3RyaW5nfQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IHNpemUpIHsKLSAgICByZXR1cm4gbmV3IExpdGVyYWxCeXRlU3RyaW5nKGJ5dGVBcnJheUNvcGllci5jb3B5RnJvbShieXRlcywgb2Zmc2V0LCBzaXplKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29waWVzIHRoZSBnaXZlbiBieXRlcyBpbnRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9LgotICAgKgotICAgKiBAcGFyYW0gYnl0ZXMgdG8gY29weQotICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShieXRlW10gYnl0ZXMpIHsKLSAgICByZXR1cm4gY29weUZyb20oYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBXcmFwcyB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBhIHtAY29kZSBCeXRlU3RyaW5nfS4gSW50ZW5kZWQgZm9yIGludGVybmFsIG9ubHkKLSAgICogdXNhZ2UgdG8gZm9yY2UgYSBjbGFzc2xvYWQgb2YgQnl0ZVN0cmluZyBiZWZvcmUgTGl0ZXJhbEJ5dGVTdHJpbmcuCi0gICAqLwotICBzdGF0aWMgQnl0ZVN0cmluZyB3cmFwKGJ5dGVbXSBieXRlcykgewotICAgIC8vIFRPRE8oZHdlaXMpOiBSZXR1cm4gRU1QVFkgd2hlbiBieXRlcyBhcmUgZW1wdHkgdG8gcmVkdWNlIGFsbG9jYXRpb25zPwotICAgIHJldHVybiBuZXcgTGl0ZXJhbEJ5dGVTdHJpbmcoYnl0ZXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyYXBzIHRoZSBnaXZlbiBieXRlcyBpbnRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9LiBJbnRlbmRlZCBmb3IgaW50ZXJuYWwgb25seQotICAgKiB1c2FnZSB0byBmb3JjZSBhIGNsYXNzbG9hZCBvZiBCeXRlU3RyaW5nIGJlZm9yZSBCb3VuZGVkQnl0ZVN0cmluZyBhbmQKLSAgICogTGl0ZXJhbEJ5dGVTdHJpbmcuCi0gICAqLwotICBzdGF0aWMgQnl0ZVN0cmluZyB3cmFwKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgIHJldHVybiBuZXcgQm91bmRlZEJ5dGVTdHJpbmcoYnl0ZXMsIG9mZnNldCwgbGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb3BpZXMgdGhlIG5leHQge0Bjb2RlIHNpemV9IGJ5dGVzIGZyb20gYSB7QGNvZGUgamF2YS5uaW8uQnl0ZUJ1ZmZlcn0gaW50bwotICAgKiBhIHtAY29kZSBCeXRlU3RyaW5nfS4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIHNvdXJjZSBidWZmZXIKLSAgICogQHBhcmFtIHNpemUgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKLSAgICogQHJldHVybiBuZXcge0Bjb2RlIEJ5dGVTdHJpbmd9Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oQnl0ZUJ1ZmZlciBieXRlcywgaW50IHNpemUpIHsKLSAgICBieXRlW10gY29weSA9IG5ldyBieXRlW3NpemVdOwotICAgIGJ5dGVzLmdldChjb3B5KTsKLSAgICByZXR1cm4gbmV3IExpdGVyYWxCeXRlU3RyaW5nKGNvcHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvcGllcyB0aGUgcmVtYWluaW5nIGJ5dGVzIGZyb20gYSB7QGNvZGUgamF2YS5uaW8uQnl0ZUJ1ZmZlcn0gaW50bwotICAgKiBhIHtAY29kZSBCeXRlU3RyaW5nfS4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVzIHNvdXJjZUJ1ZmZlcgotICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShCeXRlQnVmZmVyIGJ5dGVzKSB7Ci0gICAgcmV0dXJuIGNvcHlGcm9tKGJ5dGVzLCBieXRlcy5yZW1haW5pbmcoKSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyB7QGNvZGUgdGV4dH0gaW50byBhIHNlcXVlbmNlIG9mIGJ5dGVzIHVzaW5nIHRoZSBuYW1lZCBjaGFyc2V0Ci0gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSB7QGNvZGUgQnl0ZVN0cmluZ30uCi0gICAqCi0gICAqIEBwYXJhbSB0ZXh0IHNvdXJjZSBzdHJpbmcKLSAgICogQHBhcmFtIGNoYXJzZXROYW1lIGVuY29kaW5nIHRvIHVzZQotICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KLSAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIHRoZSBlbmNvZGluZyBpc24ndCBmb3VuZAotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKFN0cmluZyB0ZXh0LCBTdHJpbmcgY2hhcnNldE5hbWUpCi0gICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBMaXRlcmFsQnl0ZVN0cmluZyh0ZXh0LmdldEJ5dGVzKGNoYXJzZXROYW1lKSk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlcyB7QGNvZGUgdGV4dH0gaW50byBhIHNlcXVlbmNlIG9mIGJ5dGVzIHVzaW5nIHRoZSBuYW1lZCBjaGFyc2V0Ci0gICAqIGFuZCByZXR1cm5zIHRoZSByZXN1bHQgYXMgYSB7QGNvZGUgQnl0ZVN0cmluZ30uCi0gICAqCi0gICAqIEBwYXJhbSB0ZXh0IHNvdXJjZSBzdHJpbmcKLSAgICogQHBhcmFtIGNoYXJzZXQgZW5jb2RlIHVzaW5nIHRoaXMgY2hhcnNldAotICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShTdHJpbmcgdGV4dCwgQ2hhcnNldCBjaGFyc2V0KSB7Ci0gICAgcmV0dXJuIG5ldyBMaXRlcmFsQnl0ZVN0cmluZyh0ZXh0LmdldEJ5dGVzKGNoYXJzZXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIHtAY29kZSB0ZXh0fSBpbnRvIGEgc2VxdWVuY2Ugb2YgVVRGLTggYnl0ZXMgYW5kIHJldHVybnMgdGhlCi0gICAqIHJlc3VsdCBhcyBhIHtAY29kZSBCeXRlU3RyaW5nfS4KLSAgICoKLSAgICogQHBhcmFtIHRleHQgc291cmNlIHN0cmluZwotICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbVV0ZjgoU3RyaW5nIHRleHQpIHsKLSAgICByZXR1cm4gbmV3IExpdGVyYWxCeXRlU3RyaW5nKHRleHQuZ2V0Qnl0ZXMoSW50ZXJuYWwuVVRGXzgpKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIElucHV0U3RyZWFtIC0+IEJ5dGVTdHJpbmcKLQotICAvKioKLSAgICogQ29tcGxldGVseSByZWFkcyB0aGUgZ2l2ZW4gc3RyZWFtJ3MgYnl0ZXMgaW50byBhCi0gICAqIHtAY29kZSBCeXRlU3RyaW5nfSwgYmxvY2tpbmcgaWYgbmVjZXNzYXJ5IHVudGlsIGFsbCBieXRlcyBhcmUKLSAgICogcmVhZCB0aHJvdWdoIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbS4KLSAgICoKLSAgICogPGI+UGVyZm9ybWFuY2Ugbm90ZXM6PC9iPiBUaGUgcmV0dXJuZWQge0Bjb2RlIEJ5dGVTdHJpbmd9IGlzIGFuCi0gICAqIGltbXV0YWJsZSB0cmVlIG9mIGJ5dGUgYXJyYXlzICgiY2h1bmtzIikgb2YgdGhlIHN0cmVhbSBkYXRhLiAgVGhlCi0gICAqIGZpcnN0IGNodW5rIGlzIHNtYWxsLCB3aXRoIHN1YnNlcXVlbnQgY2h1bmtzIGVhY2ggYmVpbmcgZG91YmxlCi0gICAqIHRoZSBzaXplLCB1cCB0byA4Sy4KLSAgICogCi0gICAqIDxwPkVhY2ggYnl0ZSByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNvcGllZCB0d2ljZSB0byBlbnN1cmUKLSAgICogdGhhdCB0aGUgcmVzdWx0aW5nIEJ5dGVTdHJpbmcgaXMgdHJ1bHkgaW1tdXRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gc3RyZWFtVG9EcmFpbiBUaGUgc291cmNlIHN0cmVhbSwgd2hpY2ggaXMgcmVhZCBjb21wbGV0ZWx5Ci0gICAqICAgICBidXQgbm90IGNsb3NlZC4KLSAgICogQHJldHVybiBBIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30gd2hpY2ggaXMgbWFkZSB1cCBvZiBjaHVua3Mgb2YKLSAgICogICAgIHZhcmlvdXMgc2l6ZXMsIGRlcGVuZGluZyBvbiB0aGUgYmVoYXZpb3Igb2YgdGhlIHVuZGVybHlpbmcKLSAgICogICAgIHN0cmVhbS4KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAqICAgICByZWFkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyByZWFkRnJvbShJbnB1dFN0cmVhbSBzdHJlYW1Ub0RyYWluKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZEZyb20oc3RyZWFtVG9EcmFpbiwgTUlOX1JFQURfRlJPTV9DSFVOS19TSVpFLCBNQVhfUkVBRF9GUk9NX0NIVU5LX1NJWkUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXBsZXRlbHkgcmVhZHMgdGhlIGdpdmVuIHN0cmVhbSdzIGJ5dGVzIGludG8gYQotICAgKiB7QGNvZGUgQnl0ZVN0cmluZ30sIGJsb2NraW5nIGlmIG5lY2Vzc2FyeSB1bnRpbCBhbGwgYnl0ZXMgYXJlCi0gICAqIHJlYWQgdGhyb3VnaCB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uCi0gICAqCi0gICAqIDxiPlBlcmZvcm1hbmNlIG5vdGVzOjwvYj4gVGhlIHJldHVybmVkIHtAY29kZSBCeXRlU3RyaW5nfSBpcyBhbgotICAgKiBpbW11dGFibGUgdHJlZSBvZiBieXRlIGFycmF5cyAoImNodW5rcyIpIG9mIHRoZSBzdHJlYW0gZGF0YS4gIFRoZQotICAgKiBjaHVua1NpemUgcGFyYW1ldGVyIHNldHMgdGhlIHNpemUgb2YgdGhlc2UgYnl0ZSBhcnJheXMuCi0gICAqCi0gICAqIDxwPkVhY2ggYnl0ZSByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbSB3aWxsIGJlIGNvcGllZCB0d2ljZSB0byBlbnN1cmUKLSAgICogdGhhdCB0aGUgcmVzdWx0aW5nIEJ5dGVTdHJpbmcgaXMgdHJ1bHkgaW1tdXRhYmxlLgotICAgKgotICAgKiBAcGFyYW0gc3RyZWFtVG9EcmFpbiBUaGUgc291cmNlIHN0cmVhbSwgd2hpY2ggaXMgcmVhZCBjb21wbGV0ZWx5Ci0gICAqICAgICBidXQgbm90IGNsb3NlZC4KLSAgICogQHBhcmFtIGNodW5rU2l6ZSBUaGUgc2l6ZSBvZiB0aGUgY2h1bmtzIGluIHdoaWNoIHRvIHJlYWQgdGhlCi0gICAqICAgICBzdHJlYW0uCi0gICAqIEByZXR1cm4gQSBuZXcge0Bjb2RlIEJ5dGVTdHJpbmd9IHdoaWNoIGlzIG1hZGUgdXAgb2YgY2h1bmtzIG9mCi0gICAqICAgICB0aGUgZ2l2ZW4gc2l6ZS4KLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBJT0V4Y2VwdGlvbiBpcyB0aHJvd24gaWYgdGhlcmUgaXMgYSBwcm9ibGVtCi0gICAqICAgICByZWFkaW5nIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyByZWFkRnJvbShJbnB1dFN0cmVhbSBzdHJlYW1Ub0RyYWluLCBpbnQgY2h1bmtTaXplKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZEZyb20oc3RyZWFtVG9EcmFpbiwgY2h1bmtTaXplLCBjaHVua1NpemUpOwotICB9Ci0KLSAgLy8gSGVscGVyIG1ldGhvZCB0aGF0IHRha2VzIHRoZSBjaHVuayBzaXplIHJhbmdlIGFzIGEgcGFyYW1ldGVyLgotICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgcmVhZEZyb20oSW5wdXRTdHJlYW0gc3RyZWFtVG9EcmFpbiwgaW50IG1pbkNodW5rU2l6ZSwKLSAgICAgIGludCBtYXhDaHVua1NpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgQ29sbGVjdGlvbjxCeXRlU3RyaW5nPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxCeXRlU3RyaW5nPigpOwotCi0gICAgLy8gY29weSB0aGUgaW5ib3VuZCBieXRlcyBpbnRvIGEgbGlzdCBvZiBjaHVua3M7IHRoZSBjaHVuayBzaXplCi0gICAgLy8gZ3Jvd3MgZXhwb25lbnRpYWxseSB0byBzdXBwb3J0IGJvdGggc2hvcnQgYW5kIGxvbmcgc3RyZWFtcy4KLSAgICBpbnQgY2h1bmtTaXplID0gbWluQ2h1bmtTaXplOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBCeXRlU3RyaW5nIGNodW5rID0gcmVhZENodW5rKHN0cmVhbVRvRHJhaW4sIGNodW5rU2l6ZSk7Ci0gICAgICBpZiAoY2h1bmsgPT0gbnVsbCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIHJlc3VsdHMuYWRkKGNodW5rKTsKLSAgICAgIGNodW5rU2l6ZSA9IE1hdGgubWluKGNodW5rU2l6ZSAqIDIsIG1heENodW5rU2l6ZSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20ocmVzdWx0cyk7Ci0gIH0KLQotICAvKioKLSAgICogQmxvY2tzIHVudGlsIGEgY2h1bmsgb2YgdGhlIGdpdmVuIHNpemUgY2FuIGJlIG1hZGUgZnJvbSB0aGUKLSAgICogc3RyZWFtLCBvciBFT0YgaXMgcmVhY2hlZC4gIENhbGxzIHJlYWQoKSByZXBlYXRlZGx5IGluIGNhc2UgdGhlCi0gICAqIGdpdmVuIHN0cmVhbSBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGNvbXBsZXRlbHkgZmlsbCB0aGUgZ2l2ZW4KLSAgICogYnVmZmVyIGluIG9uZSByZWFkKCkgY2FsbC4KLSAgICoKLSAgICogQHJldHVybiBBIGNodW5rIG9mIHRoZSBkZXNpcmVkIHNpemUsIG9yIGVsc2UgYSBjaHVuayBhcyBsYXJnZSBhcwotICAgKiB3YXMgYXZhaWxhYmxlIHdoZW4gZW5kIG9mIHN0cmVhbSB3YXMgcmVhY2hlZC4gUmV0dXJucyBudWxsIGlmIHRoZQotICAgKiBnaXZlbiBzdHJlYW0gaGFkIG5vIG1vcmUgZGF0YSBpbiBpdC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgcmVhZENodW5rKElucHV0U3RyZWFtIGluLCBmaW5hbCBpbnQgY2h1bmtTaXplKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIGJ5dGVbXSBidWYgPSBuZXcgYnl0ZVtjaHVua1NpemVdOwotICAgICAgaW50IGJ5dGVzUmVhZCA9IDA7Ci0gICAgICB3aGlsZSAoYnl0ZXNSZWFkIDwgY2h1bmtTaXplKSB7Ci0gICAgICAgIGZpbmFsIGludCBjb3VudCA9IGluLnJlYWQoYnVmLCBieXRlc1JlYWQsIGNodW5rU2l6ZSAtIGJ5dGVzUmVhZCk7Ci0gICAgICAgIGlmIChjb3VudCA9PSAtMSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJ5dGVzUmVhZCArPSBjb3VudDsKLSAgICAgIH0KLQotICAgICAgaWYgKGJ5dGVzUmVhZCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotCi0gICAgICAvLyBBbHdheXMgbWFrZSBhIGNvcHkgc2luY2UgSW5wdXRTdHJlYW0gY291bGQgc3RlYWwgYSByZWZlcmVuY2UgdG8gYnVmLgotICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oYnVmLCAwLCBieXRlc1JlYWQpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gTXVsdGlwbGUgQnl0ZVN0cmluZ3MgLT4gT25lIEJ5dGVTdHJpbmcKLQotICAvKioKLSAgICogQ29uY2F0ZW5hdGUgdGhlIGdpdmVuIHtAY29kZSBCeXRlU3RyaW5nfSB0byB0aGlzIG9uZS4gU2hvcnQgY29uY2F0ZW5hdGlvbnMsCi0gICAqIG9mIHRvdGFsIHNpemUgc21hbGxlciB0aGFuIHtAbGluayBCeXRlU3RyaW5nI0NPTkNBVEVOQVRFX0JZX0NPUFlfU0laRX0sIGFyZQotICAgKiBwcm9kdWNlZCBieSBjb3B5aW5nIHRoZSB1bmRlcmx5aW5nIGJ5dGVzIChhcyBwZXIgUm9wZS5qYXZhLCA8YQotICAgKiBocmVmPSJodHRwOi8vd3d3LmNzLnViYy5jYS9sb2NhbC9yZWFkaW5nL3Byb2NlZWRpbmdzL3NwZTkxLTk1L3NwZS92b2wyNS9pc3N1ZTEyL3NwZTk4Ni5wZGYiPgotICAgKiBCQVA5NSA8L2E+LiBJbiBnZW5lcmFsLCB0aGUgY29uY2F0ZW5hdGUgaW52b2x2ZXMgbm8gY29weWluZy4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIHN0cmluZyB0byBjb25jYXRlbmF0ZQotICAgKiBAcmV0dXJuIGEgbmV3IHtAY29kZSBCeXRlU3RyaW5nfSBpbnN0YW5jZQotICAgKi8KLSAgcHVibGljIGZpbmFsIEJ5dGVTdHJpbmcgY29uY2F0KEJ5dGVTdHJpbmcgb3RoZXIpIHsKLSAgICBpZiAoSW50ZWdlci5NQVhfVkFMVUUgLSBzaXplKCkgPCBvdGhlci5zaXplKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkJ5dGVTdHJpbmcgd291bGQgYmUgdG9vIGxvbmc6ICIgKwotICAgICAgICAgIHNpemUoKSArICIrIiArIG90aGVyLnNpemUoKSk7Ci0gICAgfQotCi0gICAgcmV0dXJuIFJvcGVCeXRlU3RyaW5nLmNvbmNhdGVuYXRlKHRoaXMsIG90aGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25jYXRlbmF0ZXMgYWxsIGJ5dGUgc3RyaW5ncyBpbiB0aGUgaXRlcmFibGUgYW5kIHJldHVybnMgdGhlIHJlc3VsdC4KLSAgICogVGhpcyBpcyBkZXNpZ25lZCB0byBydW4gaW4gTyhsaXN0IHNpemUpLCBub3QgTyh0b3RhbCBieXRlcykuCi0gICAqCi0gICAqIDxwPlRoZSByZXR1cm5lZCB7QGNvZGUgQnl0ZVN0cmluZ30gaXMgbm90IG5lY2Vzc2FyaWx5IGEgdW5pcXVlIG9iamVjdC4KLSAgICogSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgdGhlIHNpbmdsZXRvbiBlbXB0eQotICAgKiB7QGNvZGUgQnl0ZVN0cmluZ30uICBJZiB0aGUgbGlzdCBoYXMgb25seSBvbmUgZWxlbWVudCwgdGhhdAotICAgKiB7QGNvZGUgQnl0ZVN0cmluZ30gd2lsbCBiZSByZXR1cm5lZCB3aXRob3V0IGNvcHlpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlU3RyaW5ncyBzdHJpbmdzIHRvIGJlIGNvbmNhdGVuYXRlZAotICAgKiBAcmV0dXJuIG5ldyB7QGNvZGUgQnl0ZVN0cmluZ30KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShJdGVyYWJsZTxCeXRlU3RyaW5nPiBieXRlU3RyaW5ncykgewotICAgIC8vIERldGVybWluZSB0aGUgc2l6ZTsKLSAgICBmaW5hbCBpbnQgc2l6ZTsKLSAgICBpZiAoIShieXRlU3RyaW5ncyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pKSB7Ci0gICAgICBpbnQgdGVtcFNpemUgPSAwOwotICAgICAgZm9yIChJdGVyYXRvcjxCeXRlU3RyaW5nPiBpdGVyID0gYnl0ZVN0cmluZ3MuaXRlcmF0b3IoKTsgaXRlci5oYXNOZXh0KCk7Ci0gICAgICAgICAgaXRlci5uZXh0KCksICsrdGVtcFNpemUpIHsKLSAgICAgIH0KLSAgICAgIHNpemUgPSB0ZW1wU2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgc2l6ZSA9ICgoQ29sbGVjdGlvbjxCeXRlU3RyaW5nPikgYnl0ZVN0cmluZ3MpLnNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gRU1QVFk7Ci0gICAgfQotCi0gICAgcmV0dXJuIGJhbGFuY2VkQ29uY2F0KGJ5dGVTdHJpbmdzLml0ZXJhdG9yKCksIHNpemUpOwotICB9Ci0KLSAgLy8gSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSBjb3B5RnJvbShJdGVyYWJsZTxCeXRlU3RyaW5nPikuCi0gIC8vIENyZWF0ZSBhIGJhbGFuY2VkIGNvbmNhdGVuYXRpb24gb2YgdGhlIG5leHQgImxlbmd0aCIgZWxlbWVudHMgZnJvbSB0aGUKLSAgLy8gaXRlcmFibGUuCi0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgYmFsYW5jZWRDb25jYXQoSXRlcmF0b3I8Qnl0ZVN0cmluZz4gaXRlcmF0b3IsIGludCBsZW5ndGgpIHsKLSAgICBhc3NlcnQgbGVuZ3RoID49IDE7Ci0gICAgQnl0ZVN0cmluZyByZXN1bHQ7Ci0gICAgaWYgKGxlbmd0aCA9PSAxKSB7Ci0gICAgICByZXN1bHQgPSBpdGVyYXRvci5uZXh0KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludCBoYWxmTGVuZ3RoID0gbGVuZ3RoID4+PiAxOwotICAgICAgQnl0ZVN0cmluZyBsZWZ0ID0gYmFsYW5jZWRDb25jYXQoaXRlcmF0b3IsIGhhbGZMZW5ndGgpOwotICAgICAgQnl0ZVN0cmluZyByaWdodCA9IGJhbGFuY2VkQ29uY2F0KGl0ZXJhdG9yLCBsZW5ndGggLSBoYWxmTGVuZ3RoKTsKLSAgICAgIHJlc3VsdCA9IGxlZnQuY29uY2F0KHJpZ2h0KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIEJ5dGVTdHJpbmcgLT4gYnl0ZVtdCi0KLSAgLyoqCi0gICAqIENvcGllcyBieXRlcyBpbnRvIGEgYnVmZmVyIGF0IHRoZSBnaXZlbiBvZmZzZXQuCi0gICAqCi0gICAqIEBwYXJhbSB0YXJnZXQgYnVmZmVyIHRvIGNvcHkgaW50bwotICAgKiBAcGFyYW0gb2Zmc2V0IGluIHRoZSB0YXJnZXQgYnVmZmVyCi0gICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgb2Zmc2V0IGlzIG5lZ2F0aXZlIG9yIHRvbyBsYXJnZQotICAgKi8KLSAgcHVibGljIHZvaWQgY29weVRvKGJ5dGVbXSB0YXJnZXQsIGludCBvZmZzZXQpIHsKLSAgICBjb3B5VG8odGFyZ2V0LCAwLCBvZmZzZXQsIHNpemUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29waWVzIGJ5dGVzIGludG8gYSBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSB0YXJnZXQgICAgICAgYnVmZmVyIHRvIGNvcHkgaW50bwotICAgKiBAcGFyYW0gc291cmNlT2Zmc2V0IG9mZnNldCB3aXRoaW4gdGhlc2UgYnl0ZXMKLSAgICogQHBhcmFtIHRhcmdldE9mZnNldCBvZmZzZXQgd2l0aGluIHRoZSB0YXJnZXQgYnVmZmVyCi0gICAqIEBwYXJhbSBudW1iZXJUb0NvcHkgbnVtYmVyIG9mIGJ5dGVzIHRvIGNvcHkKLSAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIGFuIG9mZnNldCBvciBzaXplIGlzIG5lZ2F0aXZlIG9yIHRvbwotICAgKiAgICAgbGFyZ2UKLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGNvcHlUbyhieXRlW10gdGFyZ2V0LCBpbnQgc291cmNlT2Zmc2V0LCBpbnQgdGFyZ2V0T2Zmc2V0LAotICAgICAgaW50IG51bWJlclRvQ29weSkgewotICAgIGNoZWNrUmFuZ2Uoc291cmNlT2Zmc2V0LCBzb3VyY2VPZmZzZXQgKyBudW1iZXJUb0NvcHksIHNpemUoKSk7Ci0gICAgY2hlY2tSYW5nZSh0YXJnZXRPZmZzZXQsIHRhcmdldE9mZnNldCArIG51bWJlclRvQ29weSwgdGFyZ2V0Lmxlbmd0aCk7Ci0gICAgaWYgKG51bWJlclRvQ29weSA+IDApIHsKLSAgICAgIGNvcHlUb0ludGVybmFsKHRhcmdldCwgc291cmNlT2Zmc2V0LCB0YXJnZXRPZmZzZXQsIG51bWJlclRvQ29weSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEludGVybmFsIChwYWNrYWdlIHByaXZhdGUpIGltcGxlbWVudGF0aW9uIG9mCi0gICAqIHtAbGluayAjY29weVRvKGJ5dGVbXSxpbnQsaW50LGludCl9LgotICAgKiBJdCBhc3N1bWVzIHRoYXQgYWxsIGVycm9yIGNoZWNraW5nIGhhcyBhbHJlYWR5IGJlZW4gcGVyZm9ybWVkIGFuZCB0aGF0Ci0gICAqIHtAY29kZSBudW1iZXJUb0NvcHkgPiAwfS4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCB2b2lkIGNvcHlUb0ludGVybmFsKGJ5dGVbXSB0YXJnZXQsIGludCBzb3VyY2VPZmZzZXQsCi0gICAgICBpbnQgdGFyZ2V0T2Zmc2V0LCBpbnQgbnVtYmVyVG9Db3B5KTsKLQotICAvKioKLSAgICogQ29waWVzIGJ5dGVzIGludG8gYSBCeXRlQnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gdGFyZ2V0IEJ5dGVCdWZmZXIgdG8gY29weSBpbnRvLgotICAgKiBAdGhyb3dzIGphdmEubmlvLlJlYWRPbmx5QnVmZmVyRXhjZXB0aW9uIGlmIHRoZSB7QGNvZGUgdGFyZ2V0fSBpcyByZWFkLW9ubHkKLSAgICogQHRocm93cyBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBpZiB0aGUge0Bjb2RlIHRhcmdldH0ncwotICAgKiAgICAgcmVtYWluaW5nKCkgc3BhY2UgaXMgbm90IGxhcmdlIGVub3VnaCB0byBob2xkIHRoZSBkYXRhLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgY29weVRvKEJ5dGVCdWZmZXIgdGFyZ2V0KTsKLQotICAvKioKLSAgICogQ29waWVzIGJ5dGVzIHRvIGEge0Bjb2RlIGJ5dGVbXX0uCi0gICAqCi0gICAqIEByZXR1cm4gY29waWVkIGJ5dGVzCi0gICAqLwotICBwdWJsaWMgZmluYWwgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgewotICAgIGZpbmFsIGludCBzaXplID0gc2l6ZSgpOwotICAgIGlmIChzaXplID09IDApIHsKLSAgICAgIHJldHVybiBJbnRlcm5hbC5FTVBUWV9CWVRFX0FSUkFZOwotICAgIH0KLSAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgY29weVRvSW50ZXJuYWwocmVzdWx0LCAwLCAwLCBzaXplKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyBhIGNvcHkgb2YgdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnl0ZSBzdHJpbmcgdG8gdGhlIHNwZWNpZmllZCBvdXRwdXQgc3RyZWFtIGFyZ3VtZW50LgotICAgKgotICAgKiBAcGFyYW0gIG91dCAgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdG8gd3JpdGUgdGhlIGRhdGEuCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGVzIGEgc3BlY2lmaWVkIHBhcnQgb2YgdGhpcyBieXRlIHN0cmluZyB0byBhbiBvdXRwdXQgc3RyZWFtLgotICAgKgotICAgKiBAcGFyYW0gIG91dCAgdGhlIG91dHB1dCBzdHJlYW0gdG8gd2hpY2ggdG8gd3JpdGUgdGhlIGRhdGEuCi0gICAqIEBwYXJhbSAgc291cmNlT2Zmc2V0IG9mZnNldCB3aXRoaW4gdGhlc2UgYnl0ZXMKLSAgICogQHBhcmFtICBudW1iZXJUb1dyaXRlIG51bWJlciBvZiBieXRlcyB0byB3cml0ZQotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uICBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLgotICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgYW4gb2Zmc2V0IG9yIHNpemUgaXMgbmVnYXRpdmUgb3IgdG9vIGxhcmdlCi0gICAqLwotICBmaW5hbCB2b2lkIHdyaXRlVG8oT3V0cHV0U3RyZWFtIG91dCwgaW50IHNvdXJjZU9mZnNldCwgaW50IG51bWJlclRvV3JpdGUpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGNoZWNrUmFuZ2Uoc291cmNlT2Zmc2V0LCBzb3VyY2VPZmZzZXQgKyBudW1iZXJUb1dyaXRlLCBzaXplKCkpOwotICAgIGlmIChudW1iZXJUb1dyaXRlID4gMCkgewotICAgICAgd3JpdGVUb0ludGVybmFsKG91dCwgc291cmNlT2Zmc2V0LCBudW1iZXJUb1dyaXRlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSW50ZXJuYWwgdmVyc2lvbiBvZiB7QGxpbmsgI3dyaXRlVG8oT3V0cHV0U3RyZWFtLGludCxpbnQpfSB0aGF0IGFzc3VtZXMKLSAgICogYWxsIGVycm9yIGNoZWNraW5nIGhhcyBhbHJlYWR5IGJlZW4gZG9uZS4KLSAgICovCi0gIGFic3RyYWN0IHZvaWQgd3JpdGVUb0ludGVybmFsKE91dHB1dFN0cmVhbSBvdXQsIGludCBzb3VyY2VPZmZzZXQsIGludCBudW1iZXJUb1dyaXRlKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhpcyB7QGxpbmsgQnl0ZVN0cmluZ30gdG8gdGhlIHByb3ZpZGVkIHtAbGluayBCeXRlT3V0cHV0fS4gQ2FsbGluZwotICAgKiB0aGlzIG1ldGhvZCBtYXkgcmVzdWx0IGluIG11bHRpcGxlIG9wZXJhdGlvbnMgb24gdGhlIHRhcmdldCB7QGxpbmsgQnl0ZU91dHB1dH0uCi0gICAqCi0gICAqIDxwPlRoaXMgbWV0aG9kIG1heSBleHBvc2UgaW50ZXJuYWwgYmFja2luZyBidWZmZXJzIG9mIHRoZSB7QGxpbmsgQnl0ZVN0cmluZ30gdG8gdGhlIHtAbGluawotICAgKiBCeXRlT3V0cHV0fSBpbiBvcmRlciB0byBhdm9pZCBhZGRpdGlvbmFsIGNvcHlpbmcgb3ZlcmhlYWQuIEl0IHdvdWxkIGJlIHBvc3NpYmxlIGZvciBhIG1hbGljaW91cwotICAgKiB7QGxpbmsgQnl0ZU91dHB1dH0gdG8gY29ycnVwdCB0aGUge0BsaW5rIEJ5dGVTdHJpbmd9LiBVc2Ugd2l0aCBjYXV0aW9uIQotICAgKgotICAgKiBAcGFyYW0gIGJ5dGVPdXRwdXQgIHRoZSBvdXRwdXQgdGFyZ2V0IHRvIHJlY2VpdmUgdGhlIGJ5dGVzCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMKLSAgICogQHNlZSBVbnNhZmVCeXRlT3BlcmF0aW9ucyN1bnNhZmVXcml0ZVRvKEJ5dGVTdHJpbmcsIEJ5dGVPdXRwdXQpCi0gICAqLwotICBhYnN0cmFjdCB2b2lkIHdyaXRlVG8oQnl0ZU91dHB1dCBieXRlT3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSByZWFkLW9ubHkge0Bjb2RlIGphdmEubmlvLkJ5dGVCdWZmZXJ9IHdob3NlIGNvbnRlbnQKLSAgICogaXMgZXF1YWwgdG8gdGhlIGNvbnRlbnRzIG9mIHRoaXMgYnl0ZSBzdHJpbmcuCi0gICAqIFRoZSByZXN1bHQgdXNlcyB0aGUgc2FtZSBiYWNraW5nIGFycmF5IGFzIHRoZSBieXRlIHN0cmluZywgaWYgcG9zc2libGUuCi0gICAqCi0gICAqIEByZXR1cm4gd3JhcHBlZCBieXRlcwotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IEJ5dGVCdWZmZXIgYXNSZWFkT25seUJ5dGVCdWZmZXIoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIGxpc3Qgb2YgcmVhZC1vbmx5IHtAY29kZSBqYXZhLm5pby5CeXRlQnVmZmVyfSBvYmplY3RzCi0gICAqIHN1Y2ggdGhhdCB0aGUgY29uY2F0ZW5hdGlvbiBvZiB0aGVpciBjb250ZW50cyBpcyBlcXVhbCB0byB0aGUgY29udGVudHMKLSAgICogb2YgdGhpcyBieXRlIHN0cmluZy4gIFRoZSByZXN1bHQgdXNlcyB0aGUgc2FtZSBiYWNraW5nIGFycmF5cyBhcyB0aGUKLSAgICogYnl0ZSBzdHJpbmcuCi0gICAqIDxwPgotICAgKiBCeSByZXR1cm5pbmcgYSBsaXN0LCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2QgbWF5IGJlIGFibGUgdG8gYXZvaWQKLSAgICogY29weWluZyBldmVuIHdoZW4gdGhlcmUgYXJlIG11bHRpcGxlIGJhY2tpbmcgYXJyYXlzLgotICAgKgotICAgKiBAcmV0dXJuIGEgbGlzdCBvZiB3cmFwcGVkIGJ5dGVzCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgTGlzdDxCeXRlQnVmZmVyPiBhc1JlYWRPbmx5Qnl0ZUJ1ZmZlckxpc3QoKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyaW5nfSBieSBkZWNvZGluZyB0aGUgYnl0ZXMgdXNpbmcgdGhlCi0gICAqIHNwZWNpZmllZCBjaGFyc2V0LgotICAgKgotICAgKiBAcGFyYW0gY2hhcnNldE5hbWUgZW5jb2RlIHVzaW5nIHRoaXMgY2hhcnNldAotICAgKiBAcmV0dXJuIG5ldyBzdHJpbmcKLSAgICogQHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGlmIGNoYXJzZXQgaXNuJ3QgcmVjb2duaXplZAotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhTdHJpbmcgY2hhcnNldE5hbWUpCi0gICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiB0b1N0cmluZyhDaGFyc2V0LmZvck5hbWUoY2hhcnNldE5hbWUpKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZENoYXJzZXRFeGNlcHRpb24gZSkgewotICAgICAgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleGNlcHRpb24gPSBuZXcgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbihjaGFyc2V0TmFtZSk7Ci0gICAgICBleGNlcHRpb24uaW5pdENhdXNlKGUpOwotICAgICAgdGhyb3cgZXhjZXB0aW9uOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBTdHJpbmd9IGJ5IGRlY29kaW5nIHRoZSBieXRlcyB1c2luZyB0aGUKLSAgICogc3BlY2lmaWVkIGNoYXJzZXQuIFJldHVybnMgdGhlIHNhbWUgZW1wdHkgU3RyaW5nIGlmIGVtcHR5LgotICAgKgotICAgKiBAcGFyYW0gY2hhcnNldCBlbmNvZGUgdXNpbmcgdGhpcyBjaGFyc2V0Ci0gICAqIEByZXR1cm4gbmV3IHN0cmluZwotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZyhDaGFyc2V0IGNoYXJzZXQpIHsKLSAgICByZXR1cm4gc2l6ZSgpID09IDAgPyAiIiA6IHRvU3RyaW5nSW50ZXJuYWwoY2hhcnNldCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyaW5nfSBieSBkZWNvZGluZyB0aGUgYnl0ZXMgdXNpbmcgdGhlCi0gICAqIHNwZWNpZmllZCBjaGFyc2V0LgotICAgKgotICAgKiBAcGFyYW0gY2hhcnNldCBlbmNvZGUgdXNpbmcgdGhpcyBjaGFyc2V0Ci0gICAqIEByZXR1cm4gbmV3IHN0cmluZwotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IFN0cmluZyB0b1N0cmluZ0ludGVybmFsKENoYXJzZXQgY2hhcnNldCk7Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gVVRGLTggZGVjb2RpbmcKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyaW5nfSBieSBkZWNvZGluZyB0aGUgYnl0ZXMgYXMgVVRGLTguCi0gICAqCi0gICAqIEByZXR1cm4gbmV3IHN0cmluZyB1c2luZyBVVEYtOCBlbmNvZGluZwotICAgKi8KLSAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZ1V0ZjgoKSB7Ci0gICAgcmV0dXJuIHRvU3RyaW5nKEludGVybmFsLlVURl84KTsKLSAgfQotCi0gIC8qKgotICAgKiBUZWxscyB3aGV0aGVyIHRoaXMge0Bjb2RlIEJ5dGVTdHJpbmd9IHJlcHJlc2VudHMgYSB3ZWxsLWZvcm1lZCBVVEYtOAotICAgKiBieXRlIHNlcXVlbmNlLCBzdWNoIHRoYXQgdGhlIG9yaWdpbmFsIGJ5dGVzIGNhbiBiZSBjb252ZXJ0ZWQgdG8gYQotICAgKiBTdHJpbmcgb2JqZWN0IGFuZCB0aGVuIHJvdW5kIHRyaXBwZWQgYmFjayB0byBieXRlcyB3aXRob3V0IGxvc3MuCi0gICAqCi0gICAqIDxwPk1vcmUgcHJlY2lzZWx5LCByZXR1cm5zIHtAY29kZSB0cnVlfSB3aGVuZXZlcjogPHByZT4ge0Bjb2RlCi0gICAqIEFycmF5cy5lcXVhbHMoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLAotICAgKiAgICAgbmV3IFN0cmluZyhieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksICJVVEYtOCIpLmdldEJ5dGVzKCJVVEYtOCIpKQotICAgKiB9PC9wcmU+Ci0gICAqCi0gICAqIDxwPlRoaXMgbWV0aG9kIHJldHVybnMge0Bjb2RlIGZhbHNlfSBmb3IgIm92ZXJsb25nIiBieXRlIHNlcXVlbmNlcywKLSAgICogYXMgd2VsbCBhcyBmb3IgMy1ieXRlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIG1hcCB0byBhIHN1cnJvZ2F0ZQotICAgKiBjaGFyYWN0ZXIsIGluIGFjY29yZGFuY2Ugd2l0aCB0aGUgcmVzdHJpY3RlZCBkZWZpbml0aW9uIG9mIFVURi04Ci0gICAqIGludHJvZHVjZWQgaW4gVW5pY29kZSAzLjEuICBOb3RlIHRoYXQgdGhlIFVURi04IGRlY29kZXIgaW5jbHVkZWQgaW4KLSAgICogT3JhY2xlJ3MgSkRLIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFsc28gcmVqZWN0ICJvdmVybG9uZyIgYnl0ZQotICAgKiBzZXF1ZW5jZXMsIGJ1dCAoYXMgb2YgMjAxMSkgc3RpbGwgYWNjZXB0cyAzLWJ5dGUgc3Vycm9nYXRlCi0gICAqIGNoYXJhY3RlciBieXRlIHNlcXVlbmNlcy4KLSAgICoKLSAgICogPHA+U2VlIHRoZSBVbmljb2RlIFN0YW5kYXJkLDxicj4KLSAgICogVGFibGUgMy02LiA8ZW0+VVRGLTggQml0IERpc3RyaWJ1dGlvbjwvZW0+LDxicj4KLSAgICogVGFibGUgMy03LiA8ZW0+V2VsbCBGb3JtZWQgVVRGLTggQnl0ZSBTZXF1ZW5jZXM8L2VtPi4KLSAgICoKLSAgICogQHJldHVybiB3aGV0aGVyIHRoZSBieXRlcyBpbiB0aGlzIHtAY29kZSBCeXRlU3RyaW5nfSBhcmUgYQotICAgKiB3ZWxsLWZvcm1lZCBVVEYtOCBieXRlIHNlcXVlbmNlCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgYm9vbGVhbiBpc1ZhbGlkVXRmOCgpOwotCi0gIC8qKgotICAgKiBUZWxscyB3aGV0aGVyIHRoZSBnaXZlbiBieXRlIHNlcXVlbmNlIGlzIGEgd2VsbC1mb3JtZWQsIG1hbGZvcm1lZCwgb3IKLSAgICogaW5jb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlLiAgVGhpcyBtZXRob2QgYWNjZXB0cyBhbmQgcmV0dXJucyBhIHBhcnRpYWwKLSAgICogc3RhdGUgcmVzdWx0LCBhbGxvd2luZyB0aGUgYnl0ZXMgZm9yIGEgY29tcGxldGUgVVRGLTggYnl0ZSBzZXF1ZW5jZSB0byBiZQotICAgKiBjb21wb3NlZCBmcm9tIG11bHRpcGxlIHtAY29kZSBCeXRlU3RyaW5nfSBzZWdtZW50cy4KLSAgICoKLSAgICogQHBhcmFtIHN0YXRlIGVpdGhlciB7QGNvZGUgMH0gKGlmIHRoaXMgaXMgdGhlIGluaXRpYWwgZGVjb2Rpbmcgb3BlcmF0aW9uKQotICAgKiAgICAgb3IgdGhlIHZhbHVlIHJldHVybmVkIGZyb20gYSBjYWxsIHRvIGEgcGFydGlhbCBkZWNvZGluZyBtZXRob2QgZm9yIHRoZQotICAgKiAgICAgcHJldmlvdXMgYnl0ZXMKLSAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgb2YgdGhlIGZpcnN0IGJ5dGUgdG8gY2hlY2sKLSAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgYnl0ZXMgdG8gY2hlY2sKLSAgICoKLSAgICogQHJldHVybiB7QGNvZGUgLTF9IGlmIHRoZSBwYXJ0aWFsIGJ5dGUgc2VxdWVuY2UgaXMgZGVmaW5pdGVseSBtYWxmb3JtZWQsCi0gICAqIHtAY29kZSAwfSBpZiBpdCBpcyB3ZWxsLWZvcm1lZCAobm8gYWRkaXRpb25hbCBpbnB1dCBuZWVkZWQpLCBvciwgaWYgdGhlCi0gICAqIGJ5dGUgc2VxdWVuY2UgaXMgImluY29tcGxldGUiLCBpLmUuIGFwcGFyZW50bHkgdGVybWluYXRlZCBpbiB0aGUgbWlkZGxlIG9mCi0gICAqIGEgY2hhcmFjdGVyLCBhbiBvcGFxdWUgaW50ZWdlciAic3RhdGUiIHZhbHVlIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uCi0gICAqIHRvIGRlY29kZSB0aGUgY2hhcmFjdGVyIHdoZW4gcGFzc2VkIHRvIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIGEKLSAgICogcGFydGlhbCBkZWNvZGluZyBtZXRob2QuCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBhcnRpYWxJc1ZhbGlkVXRmOChpbnQgc3RhdGUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpOwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpCi0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGVxdWFscyhPYmplY3Qgbyk7Ci0KLSAgLyoqCi0gICAqIEJhc2UgY2xhc3MgZm9yIGxlYWYge0BsaW5rIEJ5dGVTdHJpbmd9cyAoaS5lLiBub24tcm9wZXMpLgotICAgKi8KLSAgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIExlYWZCeXRlU3RyaW5nIGV4dGVuZHMgQnl0ZVN0cmluZyB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGZpbmFsIGludCBnZXRUcmVlRGVwdGgoKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBpc0JhbGFuY2VkKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2hlY2sgZXF1YWxpdHkgb2YgdGhlIHN1YnN0cmluZyBvZiBnaXZlbiBsZW5ndGggb2YgdGhpcyBvYmplY3Qgc3RhcnRpbmcgYXQKLSAgICAgKiB6ZXJvIHdpdGggYW5vdGhlciB7QGNvZGUgQnl0ZVN0cmluZ30gc3Vic3RyaW5nIHN0YXJ0aW5nIGF0IG9mZnNldC4KLSAgICAgKgotICAgICAqIEBwYXJhbSBvdGhlciAgd2hhdCB0byBjb21wYXJlIGEgc3Vic3RyaW5nIGluCi0gICAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW50byBvdGhlcgotICAgICAqIEBwYXJhbSBsZW5ndGggbnVtYmVyIG9mIGJ5dGVzIHRvIGNvbXBhcmUKLSAgICAgKiBAcmV0dXJuIHRydWUgZm9yIGVxdWFsaXR5IG9mIHN1YnN0cmluZ3MsIGVsc2UgZmFsc2UuCi0gICAgICovCi0gICAgYWJzdHJhY3QgYm9vbGVhbiBlcXVhbHNSYW5nZShCeXRlU3RyaW5nIG90aGVyLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBoYXNoQ29kZSB1c2luZyB0aGUgdHJhZGl0aW9uYWwgYWxnb3JpdGhtIGZyb20ge0BsaW5rCi0gICAqIEJ5dGVTdHJpbmd9LgotICAgKgotICAgKiBAcmV0dXJuIGhhc2hDb2RlIHZhbHVlCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIGludCBoYXNoQ29kZSgpIHsKLSAgICBpbnQgaCA9IGhhc2g7Ci0KLSAgICBpZiAoaCA9PSAwKSB7Ci0gICAgICBpbnQgc2l6ZSA9IHNpemUoKTsKLSAgICAgIGggPSBwYXJ0aWFsSGFzaChzaXplLCAwLCBzaXplKTsKLSAgICAgIGlmIChoID09IDApIHsKLSAgICAgICAgaCA9IDE7Ci0gICAgICB9Ci0gICAgICBoYXNoID0gaDsKLSAgICB9Ci0gICAgcmV0dXJuIGg7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBJbnB1dCBzdHJlYW0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhbiB7QGNvZGUgSW5wdXRTdHJlYW19IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIGJ5dGVzLgotICAgKiA8cD4KLSAgICogVGhlIHtAbGluayBJbnB1dFN0cmVhbX0gcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgZ3VhcmFudGVlZCB0byBiZQotICAgKiBjb21wbGV0ZWx5IG5vbi1ibG9ja2luZy4gIFRoZSBtZXRob2Qge0BsaW5rIElucHV0U3RyZWFtI2F2YWlsYWJsZSgpfQotICAgKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVtYWluaW5nIGluIHRoZSBzdHJlYW0uIFRoZSBtZXRob2RzCi0gICAqIHtAbGluayBJbnB1dFN0cmVhbSNyZWFkKGJ5dGVbXSl9LCB7QGxpbmsgSW5wdXRTdHJlYW0jcmVhZChieXRlW10saW50LGludCl9Ci0gICAqIGFuZCB7QGxpbmsgSW5wdXRTdHJlYW0jc2tpcChsb25nKX0gd2lsbCByZWFkL3NraXAgYXMgbWFueSBieXRlcyBhcyBhcmUKLSAgICogYXZhaWxhYmxlLiAgVGhlIG1ldGhvZCB7QGxpbmsgSW5wdXRTdHJlYW0jbWFya1N1cHBvcnRlZCgpfSByZXR1cm5zCi0gICAqIHtAY29kZSB0cnVlfS4KLSAgICogPHA+Ci0gICAqIFRoZSBtZXRob2RzIGluIHRoZSByZXR1cm5lZCB7QGxpbmsgSW5wdXRTdHJlYW19IG1pZ2h0IDxiPm5vdDwvYj4gYmUKLSAgICogdGhyZWFkIHNhZmUuCi0gICAqCi0gICAqIEByZXR1cm4gYW4gaW5wdXQgc3RyZWFtIHRoYXQgcmV0dXJucyB0aGUgYnl0ZXMgb2YgdGhpcyBieXRlIHN0cmluZy4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBJbnB1dFN0cmVhbSBuZXdJbnB1dCgpOwotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEge0BsaW5rIENvZGVkSW5wdXRTdHJlYW19IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIGJ5dGVzLgotICAgKiBVc2luZyB0aGlzIGlzIG9mdGVuIG1vcmUgZWZmaWNpZW50IHRoYW4gY3JlYXRpbmcgYSB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbX0KLSAgICogdGhhdCB3cmFwcyB0aGUgcmVzdWx0IG9mIHtAbGluayAjbmV3SW5wdXQoKX0uCi0gICAqCi0gICAqIEByZXR1cm4gc3RyZWFtIGJhc2VkIG9uIHdyYXBwZWQgZGF0YQotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IENvZGVkSW5wdXRTdHJlYW0gbmV3Q29kZWRJbnB1dCgpOwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIE91dHB1dCBzdHJlYW0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgT3V0cHV0fSB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LiBDYWxsIHtAbGluawotICAgKiBPdXRwdXQjdG9CeXRlU3RyaW5nKCl9IHRvIGNyZWF0ZSB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLgotICAgKiA8cD4KLSAgICogQSB7QGxpbmsgQnl0ZVN0cmluZy5PdXRwdXR9IG9mZmVycyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGEKLSAgICoge0BsaW5rIEJ5dGVBcnJheU91dHB1dFN0cmVhbX0sIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSB7QGxpbmsgQnl0ZVN0cmluZ30KLSAgICogcmF0aGVyIHRoYW4gYSB7QGNvZGUgYnl0ZX0gYXJyYXkuCi0gICAqCi0gICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgZXN0aW1hdGUgb2YgbnVtYmVyIG9mIGJ5dGVzIHRvIGJlIHdyaXR0ZW4KLSAgICogQHJldHVybiB7QGNvZGUgT3V0cHV0U3RyZWFtfSBmb3IgYnVpbGRpbmcgYSB7QGNvZGUgQnl0ZVN0cmluZ30KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0IG5ld091dHB1dChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgcmV0dXJuIG5ldyBPdXRwdXQoaW5pdGlhbENhcGFjaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBPdXRwdXR9LiBDYWxsIHtAbGluayBPdXRwdXQjdG9CeXRlU3RyaW5nKCl9IHRvIGNyZWF0ZQotICAgKiB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLgotICAgKiA8cD4KLSAgICogQSB7QGxpbmsgQnl0ZVN0cmluZy5PdXRwdXR9IG9mZmVycyB0aGUgc2FtZSBmdW5jdGlvbmFsaXR5IGFzIGEKLSAgICoge0BsaW5rIEJ5dGVBcnJheU91dHB1dFN0cmVhbX0sIGV4Y2VwdCB0aGF0IGl0IHJldHVybnMgYSB7QGxpbmsgQnl0ZVN0cmluZ30KLSAgICogcmF0aGVyIHRoYW4gYSB7QGNvZGUgYnl0ZSBhcnJheX0uCi0gICAqCi0gICAqIEByZXR1cm4ge0Bjb2RlIE91dHB1dFN0cmVhbX0gZm9yIGJ1aWxkaW5nIGEge0Bjb2RlIEJ5dGVTdHJpbmd9Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIE91dHB1dCBuZXdPdXRwdXQoKSB7Ci0gICAgcmV0dXJuIG5ldyBPdXRwdXQoQ09OQ0FURU5BVEVfQllfQ09QWV9TSVpFKTsKLSAgfQotCi0gIC8qKgotICAgKiBPdXRwdXRzIHRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLiBDYWxsIHtAbGluayAjdG9CeXRlU3RyaW5nKCl9IHRvCi0gICAqIGNyZWF0ZSB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBPdXRwdXQgZXh0ZW5kcyBPdXRwdXRTdHJlYW0gewotICAgIC8vIEltcGxlbWVudGF0aW9uIG5vdGUuCi0gICAgLy8gVGhlIHB1YmxpYyBtZXRob2RzIG9mIHRoaXMgY2xhc3MgbXVzdCBiZSBzeW5jaHJvbml6ZWQuICBCeXRlU3RyaW5ncwotICAgIC8vIGFyZSBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4gIFdpdGhvdXQgc29tZSBzb3J0IG9mIGxvY2tpbmcsIGl0IGNvdWxkCi0gICAgLy8gYmUgcG9zc2libGUgZm9yIG9uZSB0aHJlYWQgdG8gY2FsbCB0b0J5dGVTcmluZygpLCB3aGlsZSBhbm90aGVyIHRocmVhZAotICAgIC8vIGlzIHN0aWxsIG1vZGlmeWluZyB0aGUgdW5kZXJseWluZyBieXRlIGFycmF5LgotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEVNUFRZX0JZVEVfQVJSQVkgPSBuZXcgYnl0ZVswXTsKLSAgICAvLyBhcmd1bWVudCBwYXNzZWQgYnkgdXNlciwgaW5kaWNhdGluZyBpbml0aWFsIGNhcGFjaXR5LgotICAgIHByaXZhdGUgZmluYWwgaW50IGluaXRpYWxDYXBhY2l0eTsKLSAgICAvLyBCeXRlU3RyaW5ncyB0byBiZSBjb25jYXRlbmF0ZWQgdG8gY3JlYXRlIHRoZSByZXN1bHQKLSAgICBwcml2YXRlIGZpbmFsIEFycmF5TGlzdDxCeXRlU3RyaW5nPiBmbHVzaGVkQnVmZmVyczsKLSAgICAvLyBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIEJ5dGVTdHJpbmdzIG9mIGZsdXNoZWRCdWZmZXJzCi0gICAgcHJpdmF0ZSBpbnQgZmx1c2hlZEJ1ZmZlcnNUb3RhbEJ5dGVzOwotICAgIC8vIEN1cnJlbnQgYnVmZmVyIHRvIHdoaWNoIHdlIGFyZSB3cml0aW5nCi0gICAgcHJpdmF0ZSBieXRlW10gYnVmZmVyOwotICAgIC8vIExvY2F0aW9uIGluIGJ1ZmZlcltdIHRvIHdoaWNoIHdlIHdyaXRlIHRoZSBuZXh0IGJ5dGUuCi0gICAgcHJpdmF0ZSBpbnQgYnVmZmVyUG9zOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBCeXRlU3RyaW5nIG91dHB1dCBzdHJlYW0gd2l0aCB0aGUgc3BlY2lmaWVkCi0gICAgICogaW5pdGlhbCBjYXBhY2l0eS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbml0aWFsQ2FwYWNpdHkgIHRoZSBpbml0aWFsIGNhcGFjaXR5IG9mIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIE91dHB1dChpbnQgaW5pdGlhbENhcGFjaXR5KSB7Ci0gICAgICBpZiAoaW5pdGlhbENhcGFjaXR5IDwgMCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJCdWZmZXIgc2l6ZSA8IDAiKTsKLSAgICAgIH0KLSAgICAgIHRoaXMuaW5pdGlhbENhcGFjaXR5ID0gaW5pdGlhbENhcGFjaXR5OwotICAgICAgdGhpcy5mbHVzaGVkQnVmZmVycyA9IG5ldyBBcnJheUxpc3Q8Qnl0ZVN0cmluZz4oKTsKLSAgICAgIHRoaXMuYnVmZmVyID0gbmV3IGJ5dGVbaW5pdGlhbENhcGFjaXR5XTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoaW50IGIpIHsKLSAgICAgIGlmIChidWZmZXJQb3MgPT0gYnVmZmVyLmxlbmd0aCkgewotICAgICAgICBmbHVzaEZ1bGxCdWZmZXIoMSk7Ci0gICAgICB9Ci0gICAgICBidWZmZXJbYnVmZmVyUG9zKytdID0gKGJ5dGUpYjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpICB7Ci0gICAgICBpZiAobGVuZ3RoIDw9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJQb3MpIHsKLSAgICAgICAgLy8gVGhlIGJ5dGVzIGNhbiBmaXQgaW50byB0aGUgY3VycmVudCBidWZmZXIuCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2Zmc2V0LCBidWZmZXIsIGJ1ZmZlclBvcywgbGVuZ3RoKTsKLSAgICAgICAgYnVmZmVyUG9zICs9IGxlbmd0aDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFVzZSB1cCB0aGUgY3VycmVudCBidWZmZXIKLSAgICAgICAgaW50IGNvcHlTaXplICA9IGJ1ZmZlci5sZW5ndGggLSBidWZmZXJQb3M7Ci0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkoYiwgb2Zmc2V0LCBidWZmZXIsIGJ1ZmZlclBvcywgY29weVNpemUpOwotICAgICAgICBvZmZzZXQgKz0gY29weVNpemU7Ci0gICAgICAgIGxlbmd0aCAtPSBjb3B5U2l6ZTsKLSAgICAgICAgLy8gRmx1c2ggdGhlIGJ1ZmZlciwgYW5kIGdldCBhIG5ldyBidWZmZXIgYXQgbGVhc3QgYmlnIGVub3VnaCB0byBjb3ZlcgotICAgICAgICAvLyB3aGF0IHdlIHN0aWxsIG5lZWQgdG8gb3V0cHV0Ci0gICAgICAgIGZsdXNoRnVsbEJ1ZmZlcihsZW5ndGgpOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGIsIG9mZnNldCwgYnVmZmVyLCAwIC8qIGNvdW50ICovLCBsZW5ndGgpOwotICAgICAgICBidWZmZXJQb3MgPSBsZW5ndGg7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIGJ5dGUgc3RyaW5nLiBJdHMgc2l6ZSBpcyB0aGUgY3VycmVudCBzaXplIG9mIHRoaXMgb3V0cHV0Ci0gICAgICogc3RyZWFtIGFuZCBpdHMgb3V0cHV0IGhhcyBiZWVuIGNvcGllZCB0byBpdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gIHRoZSBjdXJyZW50IGNvbnRlbnRzIG9mIHRoaXMgb3V0cHV0IHN0cmVhbSwgYXMgYSBieXRlIHN0cmluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgewotICAgICAgZmx1c2hMYXN0QnVmZmVyKCk7Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShmbHVzaGVkQnVmZmVycyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50IGphdmEudXRpbC5BcnJheXMuY29weU9mKCkgZm9yIGpkayAxLjUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBieXRlW10gY29weUFycmF5KGJ5dGVbXSBidWZmZXIsIGludCBsZW5ndGgpIHsKLSAgICAgIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtsZW5ndGhdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIHJlc3VsdCwgMCwgTWF0aC5taW4oYnVmZmVyLmxlbmd0aCwgbGVuZ3RoKSk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdyaXRlcyB0aGUgY29tcGxldGUgY29udGVudHMgb2YgdGhpcyBieXRlIGFycmF5IG91dHB1dCBzdHJlYW0gdG8KLSAgICAgKiB0aGUgc3BlY2lmaWVkIG91dHB1dCBzdHJlYW0gYXJndW1lbnQuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gb3V0IHRoZSBvdXRwdXQgc3RyZWFtIHRvIHdoaWNoIHRvIHdyaXRlIHRoZSBkYXRhLgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgQnl0ZVN0cmluZ1tdIGNhY2hlZEZsdXNoQnVmZmVyczsKLSAgICAgIGJ5dGVbXSBjYWNoZWRCdWZmZXI7Ci0gICAgICBpbnQgY2FjaGVkQnVmZmVyUG9zOwotICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgIC8vIENvcHkgdGhlIGluZm9ybWF0aW9uIHdlIG5lZWQgaW50byBsb2NhbCB2YXJpYWJsZXMgc28gYXMgdG8gaG9sZAotICAgICAgICAvLyB0aGUgbG9jayBmb3IgYXMgc2hvcnQgYSB0aW1lIGFzIHBvc3NpYmxlLgotICAgICAgICBjYWNoZWRGbHVzaEJ1ZmZlcnMgPQotICAgICAgICAgICAgZmx1c2hlZEJ1ZmZlcnMudG9BcnJheShuZXcgQnl0ZVN0cmluZ1tmbHVzaGVkQnVmZmVycy5zaXplKCldKTsKLSAgICAgICAgY2FjaGVkQnVmZmVyID0gYnVmZmVyOwotICAgICAgICBjYWNoZWRCdWZmZXJQb3MgPSBidWZmZXJQb3M7Ci0gICAgICB9Ci0gICAgICBmb3IgKEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA6IGNhY2hlZEZsdXNoQnVmZmVycykgewotICAgICAgICBieXRlU3RyaW5nLndyaXRlVG8ob3V0KTsKLSAgICAgIH0KLQotICAgICAgb3V0LndyaXRlKGNvcHlBcnJheShjYWNoZWRCdWZmZXIsIGNhY2hlZEJ1ZmZlclBvcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIGN1cnJlbnQgc2l6ZSBvZiB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gIHRoZSBjdXJyZW50IHNpemUgb2YgdGhlIG91dHB1dCBzdHJlYW0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIGludCBzaXplKCkgewotICAgICAgcmV0dXJuIGZsdXNoZWRCdWZmZXJzVG90YWxCeXRlcyArIGJ1ZmZlclBvczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXNldHMgdGhpcyBzdHJlYW0sIHNvIHRoYXQgYWxsIGN1cnJlbnRseSBhY2N1bXVsYXRlZCBvdXRwdXQgaW4gdGhlCi0gICAgICogb3V0cHV0IHN0cmVhbSBpcyBkaXNjYXJkZWQuIFRoZSBvdXRwdXQgc3RyZWFtIGNhbiBiZSB1c2VkIGFnYWluLAotICAgICAqIHJldXNpbmcgdGhlIGFscmVhZHkgYWxsb2NhdGVkIGJ1ZmZlciBzcGFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3luY2hyb25pemVkIHZvaWQgcmVzZXQoKSB7Ci0gICAgICBmbHVzaGVkQnVmZmVycy5jbGVhcigpOwotICAgICAgZmx1c2hlZEJ1ZmZlcnNUb3RhbEJ5dGVzID0gMDsKLSAgICAgIGJ1ZmZlclBvcyA9IDA7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCI8Qnl0ZVN0cmluZy5PdXRwdXRAJXMgc2l6ZT0lZD4iLAotICAgICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpLCBzaXplKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEludGVybmFsIGZ1bmN0aW9uIHVzZWQgYnkgd3JpdGVycy4gIFRoZSBjdXJyZW50IGJ1ZmZlciBpcyBmdWxsLCBhbmQgdGhlCi0gICAgICogd3JpdGVyIG5lZWRzIGEgbmV3IGJ1ZmZlciB3aG9zZSBzaXplIGlzIGF0IGxlYXN0IHRoZSBzcGVjaWZpZWQgbWluaW11bQotICAgICAqIHNpemUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZsdXNoRnVsbEJ1ZmZlcihpbnQgbWluU2l6ZSkgIHsKLSAgICAgIGZsdXNoZWRCdWZmZXJzLmFkZChuZXcgTGl0ZXJhbEJ5dGVTdHJpbmcoYnVmZmVyKSk7Ci0gICAgICBmbHVzaGVkQnVmZmVyc1RvdGFsQnl0ZXMgKz0gYnVmZmVyLmxlbmd0aDsKLSAgICAgIC8vIFdlIHdhbnQgdG8gaW5jcmVhc2Ugb3VyIHRvdGFsIGNhcGFjaXR5IGJ5IDUwJSwgYnV0IGFzIGEgbWluaW11bSwKLSAgICAgIC8vIHRoZSBuZXcgYnVmZmVyIHNob3VsZCBhbHNvIGF0IGxlYXN0IGJlID49IG1pblNpemUgYW5kCi0gICAgICAvLyA+PSBpbml0aWFsIENhcGFjaXR5LgotICAgICAgaW50IG5ld1NpemUgPSBNYXRoLm1heChpbml0aWFsQ2FwYWNpdHksCi0gICAgICAgICAgTWF0aC5tYXgobWluU2l6ZSwgZmx1c2hlZEJ1ZmZlcnNUb3RhbEJ5dGVzID4+PiAxKSk7Ci0gICAgICBidWZmZXIgPSBuZXcgYnl0ZVtuZXdTaXplXTsKLSAgICAgIGJ1ZmZlclBvcyA9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW50ZXJuYWwgZnVuY3Rpb24gdXNlZCBieSB7QGxpbmsgI3RvQnl0ZVN0cmluZygpfS4gVGhlIGN1cnJlbnQgYnVmZmVyIG1heQotICAgICAqIG9yIG1heSBub3QgYmUgZnVsbCwgYnV0IGl0IG5lZWRzIHRvIGJlIGZsdXNoZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIGZsdXNoTGFzdEJ1ZmZlcigpICB7Ci0gICAgICBpZiAoYnVmZmVyUG9zIDwgYnVmZmVyLmxlbmd0aCkgewotICAgICAgICBpZiAoYnVmZmVyUG9zID4gMCkgewotICAgICAgICAgIGJ5dGVbXSBidWZmZXJDb3B5ID0gY29weUFycmF5KGJ1ZmZlciwgYnVmZmVyUG9zKTsKLSAgICAgICAgICBmbHVzaGVkQnVmZmVycy5hZGQobmV3IExpdGVyYWxCeXRlU3RyaW5nKGJ1ZmZlckNvcHkpKTsKLSAgICAgICAgfQotICAgICAgICAvLyBXZSByZXVzZSB0aGlzIGJ1ZmZlciBmb3IgZnVydGhlciB3cml0ZXMuCi0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBCdWZmZXIgaXMgY29tcGxldGVseSBmdWxsLiAgSHV6emFoLgotICAgICAgICBmbHVzaGVkQnVmZmVycy5hZGQobmV3IExpdGVyYWxCeXRlU3RyaW5nKGJ1ZmZlcikpOwotICAgICAgICAvLyA5OSUgb2YgdGhlIHRpbWUsIHdlJ3JlIG5vdCBnb2luZyB0byB1c2UgdGhpcyBPdXRwdXRTdHJlYW0gYWdhaW4uCi0gICAgICAgIC8vIFdlIHNldCBidWZmZXIgdG8gYW4gZW1wdHkgYnl0ZSBzdHJlYW0gc28gdGhhdCB3ZSdyZSBoYW5kbGluZyB0aGlzCi0gICAgICAgIC8vIGNhc2Ugd2l0aG91dCB3YXN0aW5nIHNwYWNlLiAgSW4gdGhlIHJhcmUgY2FzZSB0aGF0IG1vcmUgd3JpdGVzCi0gICAgICAgIC8vICpkbyogb2NjdXIsIHRoaXMgZW1wdHkgYnVmZmVyIHdpbGwgYmUgZmx1c2hlZCBhbmQgYW4gYXBwcm9wcmlhdGVseQotICAgICAgICAvLyBzaXplZCBuZXcgYnVmZmVyIHdpbGwgYmUgY3JlYXRlZC4KLSAgICAgICAgYnVmZmVyID0gRU1QVFlfQllURV9BUlJBWTsKLSAgICAgIH0KLSAgICAgIGZsdXNoZWRCdWZmZXJzVG90YWxCeXRlcyArPSBidWZmZXJQb3M7Ci0gICAgICBidWZmZXJQb3MgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IHtAY29kZSBCeXRlU3RyaW5nfSBidWlsZGVyLCB3aGljaCBhbGxvd3MgeW91IHRvCi0gICAqIGVmZmljaWVudGx5IGNvbnN0cnVjdCBhIHtAY29kZSBCeXRlU3RyaW5nfSBieSB3cml0aW5nIHRvIGEge0BsaW5rCi0gICAqIENvZGVkT3V0cHV0U3RyZWFtfS4gVXNpbmcgdGhpcyBpcyBtdWNoIG1vcmUgZWZmaWNpZW50IHRoYW4gY2FsbGluZyB7QGNvZGUKLSAgICogbmV3T3V0cHV0KCl9IGFuZCB3cmFwcGluZyB0aGF0IGluIGEge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfS4KLSAgICoKLSAgICogPHA+VGhpcyBpcyBwYWNrYWdlLXByaXZhdGUgYmVjYXVzZSBpdCdzIGEgc29tZXdoYXQgY29uZnVzaW5nIGludGVyZmFjZS4KLSAgICogVXNlcnMgY2FuIGNhbGwge0BsaW5rIE1lc3NhZ2UjdG9CeXRlU3RyaW5nKCl9IGluc3RlYWQgb2YgY2FsbGluZyB0aGlzCi0gICAqIGRpcmVjdGx5LgotICAgKgotICAgKiBAcGFyYW0gc2l6ZSBUaGUgdGFyZ2V0IGJ5dGUgc2l6ZSBvZiB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9LiAgWW91IG11c3Qgd3JpdGUKLSAgICogICAgIGV4YWN0bHkgdGhpcyBtYW55IGJ5dGVzIGJlZm9yZSBidWlsZGluZyB0aGUgcmVzdWx0LgotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBzdGF0aWMgQ29kZWRCdWlsZGVyIG5ld0NvZGVkQnVpbGRlcihpbnQgc2l6ZSkgewotICAgIHJldHVybiBuZXcgQ29kZWRCdWlsZGVyKHNpemUpOwotICB9Ci0KLSAgLyoqIFNlZSB7QGxpbmsgQnl0ZVN0cmluZyNuZXdDb2RlZEJ1aWxkZXIoaW50KX0uICovCi0gIHN0YXRpYyBmaW5hbCBjbGFzcyBDb2RlZEJ1aWxkZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0OwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGJ1ZmZlcjsKLQotICAgIHByaXZhdGUgQ29kZWRCdWlsZGVyKGludCBzaXplKSB7Ci0gICAgICBidWZmZXIgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICAgIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIEJ5dGVTdHJpbmcgYnVpbGQoKSB7Ci0gICAgICBvdXRwdXQuY2hlY2tOb1NwYWNlTGVmdCgpOwotCi0gICAgICAvLyBXZSBjYW4gYmUgY29uZmlkZW50IHRoYXQgdGhlIENvZGVkT3V0cHV0U3RyZWFtIHdpbGwgbm90IG1vZGlmeSB0aGUKLSAgICAgIC8vIHVuZGVybHlpbmcgYnl0ZXMgYW55bW9yZSBiZWNhdXNlIGl0IGFscmVhZHkgd3JvdGUgYWxsIG9mIHRoZW0uICBTbywKLSAgICAgIC8vIG5vIG5lZWQgdG8gbWFrZSBhIGNvcHkuCi0gICAgICByZXR1cm4gbmV3IExpdGVyYWxCeXRlU3RyaW5nKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENvZGVkT3V0cHV0U3RyZWFtIGdldENvZGVkT3V0cHV0KCkgewotICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBNZXRob2RzIHtAbGluayBSb3BlQnl0ZVN0cmluZ30gbmVlZHMgb24gaW5zdGFuY2VzLCB3aGljaCBhcmVuJ3QgcGFydCBvZiB0aGUKLSAgLy8gcHVibGljIEFQSS4KLQotICAvKioKLSAgICogUmV0dXJuIHRoZSBkZXB0aCBvZiB0aGUgdHJlZSByZXByZXNlbnRpbmcgdGhpcyB7QGNvZGUgQnl0ZVN0cmluZ30sIGlmIGFueSwKLSAgICogd2hvc2Ugcm9vdCBpcyB0aGlzIG5vZGUuIElmIHRoaXMgaXMgYSBsZWFmIG5vZGUsIHJldHVybiAwLgotICAgKgotICAgKiBAcmV0dXJuIHRyZWUgZGVwdGggb3IgemVybwotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IGludCBnZXRUcmVlRGVwdGgoKTsKLQotICAvKioKLSAgICogUmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGlzIEJ5dGVTdHJpbmcgaXMgbGl0ZXJhbCAoYSBsZWFmIG5vZGUpIG9yIGEKLSAgICogZmxhdC1lbm91Z2ggdHJlZSBpbiB0aGUgc2Vuc2Ugb2Yge0BsaW5rIFJvcGVCeXRlU3RyaW5nfS4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmVlIGlzIGZsYXQgZW5vdWdoCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgYm9vbGVhbiBpc0JhbGFuY2VkKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgY2FjaGVkIGhhc2ggY29kZSBpZiBhdmFpbGFibGUuCi0gICAqCi0gICAqIEByZXR1cm4gdmFsdWUgb2YgY2FjaGVkIGhhc2ggY29kZSBvciAwIGlmIG5vdCBjb21wdXRlZCB5ZXQKLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCBpbnQgcGVla0NhY2hlZEhhc2hDb2RlKCkgewotICAgIHJldHVybiBoYXNoOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIGhhc2ggYWNyb3NzIHRoZSB2YWx1ZSBieXRlcyBzdGFydGluZyB3aXRoIHRoZSBnaXZlbiBoYXNoLCBhbmQKLSAgICogcmV0dXJuIHRoZSByZXN1bHQuICBUaGlzIGlzIHVzZWQgdG8gY29tcHV0ZSB0aGUgaGFzaCBhY3Jvc3Mgc3RyaW5ncwotICAgKiByZXByZXNlbnRlZCBhcyBhIHNldCBvZiBwaWVjZXMgYnkgYWxsb3dpbmcgdGhlIGhhc2ggY29tcHV0YXRpb24gdG8gYmUKLSAgICogY29udGludWVkIGZyb20gcGllY2UgdG8gcGllY2UuCi0gICAqCi0gICAqIEBwYXJhbSBoIHN0YXJ0aW5nIGhhc2ggdmFsdWUKLSAgICogQHBhcmFtIG9mZnNldCBvZmZzZXQgaW50byB0aGlzIHZhbHVlIHRvIHN0YXJ0IGxvb2tpbmcgYXQgZGF0YSB2YWx1ZXMKLSAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgZGF0YSB2YWx1ZXMgdG8gaW5jbHVkZSBpbiB0aGUgaGFzaCBjb21wdXRhdGlvbgotICAgKiBAcmV0dXJuIGVuZGluZyBoYXNoIHZhbHVlCi0gICAqLwotICBwcm90ZWN0ZWQgYWJzdHJhY3QgaW50IHBhcnRpYWxIYXNoKGludCBoLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIGluZGV4IGZhbGxzIHdpdGhpbiB0aGUgc3BlY2lmaWVkIGFycmF5IHNpemUuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggcG9zaXRpb24gdG8gYmUgdGVzdGVkCi0gICAqIEBwYXJhbSBzaXplIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5Ci0gICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggZG9lcyBub3QgZmFsbCB3aXRoaW4gdGhlIGFycmF5LgotICAgKi8KLSAgc3RhdGljIHZvaWQgY2hlY2tJbmRleChpbnQgaW5kZXgsIGludCBzaXplKSB7Ci0gICAgaWYgKChpbmRleCB8IChzaXplIC0gKGluZGV4ICsgMSkpKSA8IDApIHsKLSAgICAgIGlmIChpbmRleCA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXggPCAwOiAiICsgaW5kZXgpOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiSW5kZXggPiBsZW5ndGg6ICIgKyBpbmRleCArICIsICIgKyBzaXplKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIGdpdmVuIHJhbmdlIGZhbGxzIHdpdGhpbiB0aGUgYm91bmRzIG9mIGFuIGFycmF5Ci0gICAqCi0gICAqIEBwYXJhbSBzdGFydEluZGV4IHRoZSBzdGFydCBpbmRleCBvZiB0aGUgcmFuZ2UgKGluY2x1c2l2ZSkKLSAgICogQHBhcmFtIGVuZEluZGV4IHRoZSBlbmQgaW5kZXggb2YgdGhlIHJhbmdlIChleGNsdXNpdmUpCi0gICAqIEBwYXJhbSBzaXplIHRoZSBzaXplIG9mIHRoZSBhcnJheS4KLSAgICogQHJldHVybiB0aGUgbGVuZ3RoIG9mIHRoZSByYW5nZS4KLSAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHNvbWUgb3IgYWxsIG9mIHRoZSByYW5nZSBmYWxscyBvdXRzaWRlIG9mIHRoZSBhcnJheS4KLSAgICovCi0gIHN0YXRpYyBpbnQgY2hlY2tSYW5nZShpbnQgc3RhcnRJbmRleCwgaW50IGVuZEluZGV4LCBpbnQgc2l6ZSkgewotICAgIGZpbmFsIGludCBsZW5ndGggPSBlbmRJbmRleCAtIHN0YXJ0SW5kZXg7Ci0gICAgaWYgKChzdGFydEluZGV4IHwgZW5kSW5kZXggfCBsZW5ndGggfCAoc2l6ZSAtIGVuZEluZGV4KSkgPCAwKSB7Ci0gICAgICBpZiAoc3RhcnRJbmRleCA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkJlZ2lubmluZyBpbmRleDogIiArIHN0YXJ0SW5kZXggKyAiIDwgMCIpOwotICAgICAgfQotICAgICAgaWYgKGVuZEluZGV4IDwgc3RhcnRJbmRleCkgewotICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICJCZWdpbm5pbmcgaW5kZXggbGFyZ2VyIHRoYW4gZW5kaW5nIGluZGV4OiAiICsgc3RhcnRJbmRleCArICIsICIgKyBlbmRJbmRleCk7Ci0gICAgICB9Ci0gICAgICAvLyBlbmRJbmRleCA+PSBzaXplCi0gICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiRW5kIGluZGV4OiAiICsgZW5kSW5kZXggKyAiID49ICIgKyBzaXplKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxlbmd0aDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmluYWwgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBTdHJpbmcuZm9ybWF0KCI8Qnl0ZVN0cmluZ0AlcyBzaXplPSVkPiIsCi0gICAgICAgIEludGVnZXIudG9IZXhTdHJpbmcoU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcykpLCBzaXplKCkpOwotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIGEge0BsaW5rIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ30gYmFja2VkIGJ5IGEKLSAgICogc2luZ2xlIGFycmF5IG9mIGJ5dGVzLCBjb250aWd1b3VzIGluIG1lbW9yeS4gSXQgc3VwcG9ydHMgc3Vic3RyaW5nIGJ5Ci0gICAqIHBvaW50aW5nIHRvIG9ubHkgYSBzdWItcmFuZ2Ugb2YgdGhlIHVuZGVybHlpbmcgYnl0ZSBhcnJheSwgbWVhbmluZyB0aGF0IGEKLSAgICogc3Vic3RyaW5nIHdpbGwgcmVmZXJlbmNlIHRoZSBmdWxsIGJ5dGUtYXJyYXkgb2YgdGhlIHN0cmluZyBpdCdzIG1hZGUgZnJvbSwKLSAgICogZXhhY3RseSBhcyB3aXRoIHtAbGluayBTdHJpbmd9LgotICAgKgotICAgKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIChDYXJsIEhhdmVybCkKLSAgICovCi0gIC8vIEtlZXAgdGhpcyBjbGFzcyBwcml2YXRlIHRvIGF2b2lkIGRlYWRsb2NrcyBpbiBjbGFzc2xvYWRpbmcgYWNyb3NzIHRocmVhZHMgYXMgQnl0ZVN0cmluZydzCi0gIC8vIHN0YXRpYyBpbml0aWFsaXplciBsb2FkcyBMaXRlcmFsQnl0ZVN0cmluZyBhbmQgYW5vdGhlciB0aHJlYWQgbG9hZHMgTGl0ZXJhbEJ5dGVTdHJpbmcuCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIExpdGVyYWxCeXRlU3RyaW5nIGV4dGVuZHMgQnl0ZVN0cmluZy5MZWFmQnl0ZVN0cmluZyB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgYnl0ZVtdIGJ5dGVzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAY29kZSBMaXRlcmFsQnl0ZVN0cmluZ30gYmFja2VkIGJ5IHRoZSBnaXZlbiBhcnJheSwgd2l0aG91dAotICAgICAqIGNvcHlpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnl0ZXMgYXJyYXkgdG8gd3JhcAotICAgICAqLwotICAgIExpdGVyYWxCeXRlU3RyaW5nKGJ5dGVbXSBieXRlcykgewotICAgICAgdGhpcy5ieXRlcyA9IGJ5dGVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlIGJ5dGVBdChpbnQgaW5kZXgpIHsKLSAgICAgIC8vIFVubGlrZSBtb3N0IG1ldGhvZHMgaW4gdGhpcyBjbGFzcywgdGhpcyBvbmUgaXMgYSBkaXJlY3QgaW1wbGVtZW50YXRpb24KLSAgICAgIC8vIGlnbm9yaW5nIHRoZSBwb3RlbnRpYWwgb2Zmc2V0IGJlY2F1c2Ugd2UgbmVlZCB0byBkbyByYW5nZS1jaGVja2luZyBpbiB0aGUKLSAgICAgIC8vIHN1YnN0cmluZyBjYXNlIGFueXdheS4KLSAgICAgIHJldHVybiBieXRlc1tpbmRleF07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgcmV0dXJuIGJ5dGVzLmxlbmd0aDsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEJ5dGVTdHJpbmcgLT4gc3Vic3RyaW5nCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgQnl0ZVN0cmluZyBzdWJzdHJpbmcoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkgewotICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGNoZWNrUmFuZ2UoYmVnaW5JbmRleCwgZW5kSW5kZXgsIHNpemUoKSk7Ci0KLSAgICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICByZXR1cm4gQnl0ZVN0cmluZy5FTVBUWTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG5ldyBCb3VuZGVkQnl0ZVN0cmluZyhieXRlcywgZ2V0T2Zmc2V0SW50b0J5dGVzKCkgKyBiZWdpbkluZGV4LCBsZW5ndGgpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gQnl0ZVN0cmluZyAtPiBieXRlW10KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlUb0ludGVybmFsKAotICAgICAgICBieXRlW10gdGFyZ2V0LCBpbnQgc291cmNlT2Zmc2V0LCBpbnQgdGFyZ2V0T2Zmc2V0LCBpbnQgbnVtYmVyVG9Db3B5KSB7Ci0gICAgICAvLyBPcHRpbWl6ZWQgZm9ybSwgbm90IGZvciBzdWJjbGFzc2VzLCBzaW5jZSB3ZSBkb24ndCBjYWxsCi0gICAgICAvLyBnZXRPZmZzZXRJbnRvQnl0ZXMoKSBvciBjaGVjayB0aGUgJ251bWJlclRvQ29weScgcGFyYW1ldGVyLgotICAgICAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogSXMgbm90IGNhbGxpbmcgZ2V0T2Zmc2V0SW50b0J5dGVzIHJlYWxseSBzYXZpbmcgdGhhdCBtdWNoPwotICAgICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgc291cmNlT2Zmc2V0LCB0YXJnZXQsIHRhcmdldE9mZnNldCwgbnVtYmVyVG9Db3B5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCBjb3B5VG8oQnl0ZUJ1ZmZlciB0YXJnZXQpIHsKLSAgICAgIHRhcmdldC5wdXQoYnl0ZXMsIGdldE9mZnNldEludG9CeXRlcygpLCBzaXplKCkpOyAvLyBDb3BpZXMgYnl0ZXMKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgQnl0ZUJ1ZmZlciBhc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIHsKLSAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYnl0ZXMsIGdldE9mZnNldEludG9CeXRlcygpLCBzaXplKCkpLmFzUmVhZE9ubHlCdWZmZXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgTGlzdDxCeXRlQnVmZmVyPiBhc1JlYWRPbmx5Qnl0ZUJ1ZmZlckxpc3QoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdChhc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBvdXRwdXRTdHJlYW0ud3JpdGUodG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgZmluYWwgdm9pZCB3cml0ZVRvSW50ZXJuYWwoT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSwgaW50IHNvdXJjZU9mZnNldCwgaW50IG51bWJlclRvV3JpdGUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBvdXRwdXRTdHJlYW0ud3JpdGUoYnl0ZXMsIGdldE9mZnNldEludG9CeXRlcygpICsgc291cmNlT2Zmc2V0LCBudW1iZXJUb1dyaXRlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCB2b2lkIHdyaXRlVG8oQnl0ZU91dHB1dCBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBvdXRwdXQud3JpdGVMYXp5KGJ5dGVzLCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSwgc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgU3RyaW5nIHRvU3RyaW5nSW50ZXJuYWwoQ2hhcnNldCBjaGFyc2V0KSB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgZ2V0T2Zmc2V0SW50b0J5dGVzKCksIHNpemUoKSwgY2hhcnNldCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBVVEYtOCBkZWNvZGluZwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNWYWxpZFV0ZjgoKSB7Ci0gICAgICBpbnQgb2Zmc2V0ID0gZ2V0T2Zmc2V0SW50b0J5dGVzKCk7Ci0gICAgICByZXR1cm4gVXRmOC5pc1ZhbGlkVXRmOChieXRlcywgb2Zmc2V0LCBvZmZzZXQgKyBzaXplKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgcGFydGlhbElzVmFsaWRVdGY4KGludCBzdGF0ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgaW50IGluZGV4ID0gZ2V0T2Zmc2V0SW50b0J5dGVzKCkgKyBvZmZzZXQ7Ci0gICAgICByZXR1cm4gVXRmOC5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUsIGJ5dGVzLCBpbmRleCwgaW5kZXggKyBsZW5ndGgpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBCeXRlU3RyaW5nKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChzaXplKCkgIT0gKChCeXRlU3RyaW5nKSBvdGhlcikuc2l6ZSgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChzaXplKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgTGl0ZXJhbEJ5dGVTdHJpbmcpIHsKLSAgICAgICAgTGl0ZXJhbEJ5dGVTdHJpbmcgb3RoZXJBc0xpdGVyYWwgPSAoTGl0ZXJhbEJ5dGVTdHJpbmcpIG90aGVyOwotICAgICAgICAvLyBJZiB3ZSBrbm93IHRoZSBoYXNoIGNvZGVzIGFuZCB0aGV5IGFyZSBub3QgZXF1YWwsIHdlIGtub3cgdGhlIGJ5dGUKLSAgICAgICAgLy8gc3RyaW5ncyBhcmUgbm90IGVxdWFsLgotICAgICAgICBpbnQgdGhpc0hhc2ggPSBwZWVrQ2FjaGVkSGFzaENvZGUoKTsKLSAgICAgICAgaW50IHRoYXRIYXNoID0gb3RoZXJBc0xpdGVyYWwucGVla0NhY2hlZEhhc2hDb2RlKCk7Ci0gICAgICAgIGlmICh0aGlzSGFzaCAhPSAwICYmIHRoYXRIYXNoICE9IDAgJiYgdGhpc0hhc2ggIT0gdGhhdEhhc2gpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gZXF1YWxzUmFuZ2UoKExpdGVyYWxCeXRlU3RyaW5nKSBvdGhlciwgMCwgc2l6ZSgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJvcGVCeXRlU3RyaW5nIGFuZCBOaW9CeXRlU3RyaW5nLgotICAgICAgICByZXR1cm4gb3RoZXIuZXF1YWxzKHRoaXMpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrIGVxdWFsaXR5IG9mIHRoZSBzdWJzdHJpbmcgb2YgZ2l2ZW4gbGVuZ3RoIG9mIHRoaXMgb2JqZWN0IHN0YXJ0aW5nIGF0Ci0gICAgICogemVybyB3aXRoIGFub3RoZXIge0Bjb2RlIExpdGVyYWxCeXRlU3RyaW5nfSBzdWJzdHJpbmcgc3RhcnRpbmcgYXQgb2Zmc2V0LgotICAgICAqCi0gICAgICogQHBhcmFtIG90aGVyICB3aGF0IHRvIGNvbXBhcmUgYSBzdWJzdHJpbmcgaW4KLSAgICAgKiBAcGFyYW0gb2Zmc2V0IG9mZnNldCBpbnRvIG90aGVyCi0gICAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgYnl0ZXMgdG8gY29tcGFyZQotICAgICAqIEByZXR1cm4gdHJ1ZSBmb3IgZXF1YWxpdHkgb2Ygc3Vic3RyaW5ncywgZWxzZSBmYWxzZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBmaW5hbCBib29sZWFuIGVxdWFsc1JhbmdlKEJ5dGVTdHJpbmcgb3RoZXIsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgIGlmIChsZW5ndGggPiBvdGhlci5zaXplKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiTGVuZ3RoIHRvbyBsYXJnZTogIiArIGxlbmd0aCArIHNpemUoKSk7Ci0gICAgICB9Ci0gICAgICBpZiAob2Zmc2V0ICsgbGVuZ3RoID4gb3RoZXIuc2l6ZSgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAiUmFuIG9mZiBlbmQgb2Ygb3RoZXI6ICIgKyBvZmZzZXQgKyAiLCAiICsgbGVuZ3RoICsgIiwgIiArIG90aGVyLnNpemUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChvdGhlciBpbnN0YW5jZW9mIExpdGVyYWxCeXRlU3RyaW5nKSB7Ci0gICAgICAgIExpdGVyYWxCeXRlU3RyaW5nIGxic090aGVyID0gKExpdGVyYWxCeXRlU3RyaW5nKSBvdGhlcjsKLSAgICAgICAgYnl0ZVtdIHRoaXNCeXRlcyA9IGJ5dGVzOwotICAgICAgICBieXRlW10gb3RoZXJCeXRlcyA9IGxic090aGVyLmJ5dGVzOwotICAgICAgICBpbnQgdGhpc0xpbWl0ID0gZ2V0T2Zmc2V0SW50b0J5dGVzKCkgKyBsZW5ndGg7Ci0gICAgICAgIGZvciAoCi0gICAgICAgICAgICBpbnQgdGhpc0luZGV4ID0gZ2V0T2Zmc2V0SW50b0J5dGVzKCksCi0gICAgICAgICAgICAgICAgb3RoZXJJbmRleCA9IGxic090aGVyLmdldE9mZnNldEludG9CeXRlcygpICsgb2Zmc2V0OwotICAgICAgICAgICAgKHRoaXNJbmRleCA8IHRoaXNMaW1pdCk7ICsrdGhpc0luZGV4LCArK290aGVySW5kZXgpIHsKLSAgICAgICAgICBpZiAodGhpc0J5dGVzW3RoaXNJbmRleF0gIT0gb3RoZXJCeXRlc1tvdGhlckluZGV4XSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG90aGVyLnN1YnN0cmluZyhvZmZzZXQsIG9mZnNldCArIGxlbmd0aCkuZXF1YWxzKHN1YnN0cmluZygwLCBsZW5ndGgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgaW50IHBhcnRpYWxIYXNoKGludCBoLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICByZXR1cm4gSW50ZXJuYWwucGFydGlhbEhhc2goaCwgYnl0ZXMsIGdldE9mZnNldEludG9CeXRlcygpICsgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gSW5wdXQgc3RyZWFtCi0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgSW5wdXRTdHJlYW0gbmV3SW5wdXQoKSB7Ci0gICAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzLCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSwgc2l6ZSgpKTsgLy8gTm8gY29weQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBDb2RlZElucHV0U3RyZWFtIG5ld0NvZGVkSW5wdXQoKSB7Ci0gICAgICAvLyBXZSB0cnVzdCBDb2RlZElucHV0U3RyZWFtIG5vdCB0byBtb2RpZnkgdGhlIGJ5dGVzLCBvciB0byBnaXZlIGFueW9uZQotICAgICAgLy8gZWxzZSBhY2Nlc3MgdG8gdGhlbS4KLSAgICAgIHJldHVybiBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAotICAgICAgICAgIGJ5dGVzLCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSwgc2l6ZSgpLCB0cnVlIC8qIGJ1ZmZlcklzSW1tdXRhYmxlICovKTsKLSAgICB9Ci0KLSAgICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAgIC8vIEludGVybmFsIG1ldGhvZHMKLQotICAgIC8qKgotICAgICAqIE9mZnNldCBpbnRvIHtAY29kZSBieXRlc1tdfSB0byB1c2UsIG5vbi16ZXJvIGZvciBzdWJzdHJpbmdzLgotICAgICAqCi0gICAgICogQHJldHVybiBhbHdheXMgMCBmb3IgdGhpcyBjbGFzcwotICAgICAqLwotICAgIHByb3RlY3RlZCBpbnQgZ2V0T2Zmc2V0SW50b0J5dGVzKCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogVGhpcyBjbGFzcyBpcyB1c2VkIHRvIHJlcHJlc2VudCB0aGUgc3Vic3RyaW5nIG9mIGEge0BsaW5rIEJ5dGVTdHJpbmd9IG92ZXIgYQotICAgKiBzaW5nbGUgYnl0ZSBhcnJheS4gSW4gdGVybXMgb2YgdGhlIHB1YmxpYyBBUEkgb2Yge0BsaW5rIEJ5dGVTdHJpbmd9LCB5b3UgZW5kCi0gICAqIHVwIGhlcmUgYnkgY2FsbGluZyB7QGxpbmsgQnl0ZVN0cmluZyNjb3B5RnJvbShieXRlW10pfSBmb2xsb3dlZCBieSB7QGxpbmsKLSAgICogQnl0ZVN0cmluZyNzdWJzdHJpbmcoaW50LCBpbnQpfS4KLSAgICoKLSAgICogPHA+VGhpcyBjbGFzcyBjb250YWlucyBtb3N0IG9mIHRoZSBvdmVyaGVhZCBpbnZvbHZlZCBpbiBjcmVhdGluZyBhIHN1YnN0cmluZwotICAgKiBmcm9tIGEge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nfS4gIFRoZSBvdmVyaGVhZCBpbnZvbHZlcyBzb21lIHJhbmdlLWNoZWNraW5nCi0gICAqIGFuZCB0d28gZXh0cmEgZmllbGRzLgotICAgKgotICAgKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIChDYXJsIEhhdmVybCkKLSAgICovCi0gIC8vIEtlZXAgdGhpcyBjbGFzcyBwcml2YXRlIHRvIGF2b2lkIGRlYWRsb2NrcyBpbiBjbGFzc2xvYWRpbmcgYWNyb3NzIHRocmVhZHMgYXMgQnl0ZVN0cmluZydzCi0gIC8vIHN0YXRpYyBpbml0aWFsaXplciBsb2FkcyBMaXRlcmFsQnl0ZVN0cmluZyBhbmQgYW5vdGhlciB0aHJlYWQgbG9hZHMgQm91bmRlZEJ5dGVTdHJpbmcuCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIEJvdW5kZWRCeXRlU3RyaW5nIGV4dGVuZHMgTGl0ZXJhbEJ5dGVTdHJpbmcgewotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgYnl0ZXNPZmZzZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgYnl0ZXNMZW5ndGg7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEge0Bjb2RlIEJvdW5kZWRCeXRlU3RyaW5nfSBiYWNrZWQgYnkgdGhlIHN1Yi1yYW5nZSBvZiBnaXZlbiBhcnJheSwKLSAgICAgKiB3aXRob3V0IGNvcHlpbmcuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnl0ZXMgIGFycmF5IHRvIHdyYXAKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IGluZGV4IHRvIGZpcnN0IGJ5dGUgdG8gdXNlIGluIGJ5dGVzCi0gICAgICogQHBhcmFtIGxlbmd0aCBudW1iZXIgb2YgYnl0ZXMgdG8gdXNlIGZyb20gYnl0ZXMKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB7QGNvZGUgb2Zmc2V0IDwgMH0sIHtAY29kZSBsZW5ndGggPCAwfSwKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBpZiB7QGNvZGUgb2Zmc2V0ICsgbGVuZ3RoID4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBieXRlcy5sZW5ndGh9LgotICAgICAqLwotICAgIEJvdW5kZWRCeXRlU3RyaW5nKGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgc3VwZXIoYnl0ZXMpOwotICAgICAgY2hlY2tSYW5nZShvZmZzZXQsIG9mZnNldCArIGxlbmd0aCwgYnl0ZXMubGVuZ3RoKTsKLQotICAgICAgdGhpcy5ieXRlc09mZnNldCA9IG9mZnNldDsKLSAgICAgIHRoaXMuYnl0ZXNMZW5ndGggPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAgICogVGhyb3dzIHtAbGluayBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb259Ci0gICAgICogZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHJlYXNvbnMgYWx0aG91Z2ggaXQgd291bGQgbW9yZSBwcm9wZXJseSBiZQotICAgICAqIHtAbGluayBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiBieXRlCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUKLSAgICAgKiBAdGhyb3dzIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiB7QGNvZGUgaW5kZXh9IGlzIDwgMCBvciA+PSBzaXplCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJ5dGUgYnl0ZUF0KGludCBpbmRleCkgewotICAgICAgLy8gV2UgbXVzdCBjaGVjayB0aGUgaW5kZXggb3Vyc2VsdmVzIGFzIHdlIGNhbm5vdCByZWx5IG9uIEphdmEgYXJyYXkgaW5kZXgKLSAgICAgIC8vIGNoZWNraW5nIGZvciBzdWJzdHJpbmdzLgotICAgICAgY2hlY2tJbmRleChpbmRleCwgc2l6ZSgpKTsKLSAgICAgIHJldHVybiBieXRlc1tieXRlc09mZnNldCArIGluZGV4XTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gYnl0ZXNMZW5ndGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBnZXRPZmZzZXRJbnRvQnl0ZXMoKSB7Ci0gICAgICByZXR1cm4gYnl0ZXNPZmZzZXQ7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBCeXRlU3RyaW5nIC0+IGJ5dGVbXQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIHZvaWQgY29weVRvSW50ZXJuYWwoYnl0ZVtdIHRhcmdldCwgaW50IHNvdXJjZU9mZnNldCwgaW50IHRhcmdldE9mZnNldCwKLSAgICAgICAgaW50IG51bWJlclRvQ29weSkgewotICAgICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgZ2V0T2Zmc2V0SW50b0J5dGVzKCkgKyBzb3VyY2VPZmZzZXQsIHRhcmdldCwKLSAgICAgICAgICB0YXJnZXRPZmZzZXQsIG51bWJlclRvQ29weSk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgICAvLyBTZXJpYWxpemFibGUKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gICAgT2JqZWN0IHdyaXRlUmVwbGFjZSgpIHsKLSAgICAgIHJldHVybiBCeXRlU3RyaW5nLndyYXAodG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdGhyb3cgbmV3IEludmFsaWRPYmplY3RFeGNlcHRpb24oCi0gICAgICAgICAgIkJvdW5kZWRCeXRlU3RyZWFtIGluc3RhbmNlcyBhcmUgbm90IHRvIGJlIHNlcmlhbGl6ZWQgZGlyZWN0bHkiKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU4ODYwNjUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzAyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVhZHMgYW5kIGRlY29kZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuCi0gKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0d28ga2luZHMgb2YgbWV0aG9kczogIG1ldGhvZHMgdGhhdCByZWFkIHNwZWNpZmljCi0gKiBwcm90b2NvbCBtZXNzYWdlIGNvbnN0cnVjdHMgYW5kIGZpZWxkIHR5cGVzIChlLmcuIHtAbGluayAjcmVhZFRhZygpfSBhbmQKLSAqIHtAbGluayAjcmVhZEludDMyKCl9KSBhbmQgbWV0aG9kcyB0aGF0IHJlYWQgbG93LWxldmVsIHZhbHVlcyAoZS5nLgotICoge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoKX0gYW5kIHtAbGluayAjcmVhZFJhd0J5dGVzfSkuICBJZiB5b3UgYXJlIHJlYWRpbmcKLSAqIGVuY29kZWQgcHJvdG9jb2wgbWVzc2FnZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBmb3JtZXIgbWV0aG9kcywgYnV0IGlmIHlvdSBhcmUKLSAqIHJlYWRpbmcgc29tZSBvdGhlciBmb3JtYXQgb2YgeW91ciBvd24gZGVzaWduLCB1c2UgdGhlIGxhdHRlci4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbSB7Ci0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSB3cmFwcGluZyB0aGUgZ2l2ZW4gSW5wdXRTdHJlYW0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENvZGVkSW5wdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICByZXR1cm4gbmV3IENvZGVkSW5wdXRTdHJlYW0oaW5wdXQsIEJVRkZFUl9TSVpFKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBJbnB1dFN0cmVhbS4KLSAgICovCi0gIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIElucHV0U3RyZWFtIGlucHV0LCBpbnQgYnVmZmVyU2l6ZSkgewotICAgIHJldHVybiBuZXcgQ29kZWRJbnB1dFN0cmVhbShpbnB1dCwgYnVmZmVyU2l6ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IENvZGVkSW5wdXRTdHJlYW0gd3JhcHBpbmcgdGhlIGdpdmVuIGJ5dGUgYXJyYXkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENvZGVkSW5wdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgYnl0ZVtdIGJ1ZikgewotICAgIHJldHVybiBuZXdJbnN0YW5jZShidWYsIDAsIGJ1Zi5sZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBidWYsIGZpbmFsIGludCBvZmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuKSB7Ci0gICAgcmV0dXJuIG5ld0luc3RhbmNlKGJ1Ziwgb2ZmLCBsZW4sIGZhbHNlIC8qIGJ1ZmZlcklzSW1tdXRhYmxlICovKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlLgotICAgKi8KLSAgc3RhdGljIENvZGVkSW5wdXRTdHJlYW0gbmV3SW5zdGFuY2UoCi0gICAgICBmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuLCBmaW5hbCBib29sZWFuIGJ1ZmZlcklzSW1tdXRhYmxlKSB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSByZXN1bHQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShidWYsIG9mZiwgbGVuLCBidWZmZXJJc0ltbXV0YWJsZSk7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFNvbWUgdXNlcyBvZiBDb2RlZElucHV0U3RyZWFtIGNhbiBiZSBtb3JlIGVmZmljaWVudCBpZiB0aGV5IGtub3cKLSAgICAgIC8vIGV4YWN0bHkgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gIEJ5IHB1c2hpbmcgdGhlIGVuZCBwb2ludCBvZiB0aGUKLSAgICAgIC8vIGJ1ZmZlciBhcyBhIGxpbWl0LCB3ZSBhbGxvdyB0aGVtIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIHZpYQotICAgICAgLy8gZ2V0Qnl0ZXNVbnRpbExpbWl0KCkuICBQdXNoaW5nIGEgbGltaXQgdGhhdCB3ZSBrbm93IGlzIGF0IHRoZSBlbmQgb2YKLSAgICAgIC8vIHRoZSBzdHJlYW0gY2FuIG5ldmVyIGh1cnQsIHNpbmNlIHdlIGNhbiBuZXZlciBwYXN0IHRoYXQgcG9pbnQgYW55d2F5LgotICAgICAgcmVzdWx0LnB1c2hMaW1pdChsZW4pOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleCkgewotICAgICAgLy8gVGhlIG9ubHkgcmVhc29uIHB1c2hMaW1pdCgpIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlIGlzIGlmIGxlbgotICAgICAgLy8gaXMgbmVnYXRpdmUuIE5vcm1hbGx5IHB1c2hMaW1pdCgpJ3MgcGFyYW1ldGVyIGNvbWVzIGRpcmVjdGx5IG9mZiB0aGUKLSAgICAgIC8vIHdpcmUsIHNvIGl0J3MgaW1wb3J0YW50IHRvIGNhdGNoIGV4Y2VwdGlvbnMgaW4gY2FzZSBvZiBjb3JydXB0IG9yCi0gICAgICAvLyBtYWxpY2lvdXMgZGF0YS4gSG93ZXZlciwgaW4gdGhpcyBjYXNlLCB3ZSBleHBlY3QgdGhhdCBsZW4gaXMgbm90IGEKLSAgICAgIC8vIHVzZXItc3VwcGxpZWQgdmFsdWUsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBiZWluZyBuZWdhdGl2ZSBpbmRpY2F0ZXMKLSAgICAgIC8vIGEgcHJvZ3JhbW1pbmcgZXJyb3IuIFRoZXJlZm9yZSwgdGhyb3dpbmcgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcwotICAgICAgLy8gYXBwcm9wcmlhdGUuCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSB3cmFwcGluZyB0aGUgZ2l2ZW4gQnl0ZUJ1ZmZlci4gVGhlIGRhdGEKLSAgICogc3RhcnRpbmcgZnJvbSB0aGUgQnl0ZUJ1ZmZlcidzIGN1cnJlbnQgcG9zaXRpb24gdG8gaXRzIGxpbWl0IHdpbGwgYmUgcmVhZC4KLSAgICogVGhlIHJldHVybmVkIENvZGVkSW5wdXRTdHJlYW0gbWF5IG9yIG1heSBub3Qgc2hhcmUgdGhlIHVuZGVybHlpbmcgZGF0YQotICAgKiBpbiB0aGUgQnl0ZUJ1ZmZlciwgdGhlcmVmb3JlIHRoZSBCeXRlQnVmZmVyIGNhbm5vdCBiZSBjaGFuZ2VkIHdoaWxlIHRoZQotICAgKiBDb2RlZElucHV0U3RyZWFtIGlzIGluIHVzZS4KLSAgICogTm90ZSB0aGF0IHRoZSBCeXRlQnVmZmVyJ3MgcG9zaXRpb24gd29uJ3QgYmUgY2hhbmdlZCBieSB0aGlzIGZ1bmN0aW9uLgotICAgKiBDb25jdXJyZW50IGNhbGxzIHdpdGggdGhlIHNhbWUgQnl0ZUJ1ZmZlciBvYmplY3QgYXJlIHNhZmUgaWYgbm8gb3RoZXIKLSAgICogdGhyZWFkIGlzIHRyeWluZyB0byBhbHRlciB0aGUgQnl0ZUJ1ZmZlcidzIHN0YXR1cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ29kZWRJbnB1dFN0cmVhbSBuZXdJbnN0YW5jZShCeXRlQnVmZmVyIGJ1ZikgewotICAgIGlmIChidWYuaGFzQXJyYXkoKSkgewotICAgICAgcmV0dXJuIG5ld0luc3RhbmNlKGJ1Zi5hcnJheSgpLCBidWYuYXJyYXlPZmZzZXQoKSArIGJ1Zi5wb3NpdGlvbigpLAotICAgICAgICAgIGJ1Zi5yZW1haW5pbmcoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEJ5dGVCdWZmZXIgdGVtcCA9IGJ1Zi5kdXBsaWNhdGUoKTsKLSAgICAgIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVt0ZW1wLnJlbWFpbmluZygpXTsKLSAgICAgIHRlbXAuZ2V0KGJ1ZmZlcik7Ci0gICAgICByZXR1cm4gbmV3SW5zdGFuY2UoYnVmZmVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBBdHRlbXB0IHRvIHJlYWQgYSBmaWVsZCB0YWcsIHJldHVybmluZyB6ZXJvIGlmIHdlIGhhdmUgcmVhY2hlZCBFT0YuCi0gICAqIFByb3RvY29sIG1lc3NhZ2UgcGFyc2VycyB1c2UgdGhpcyB0byByZWFkIHRhZ3MsIHNpbmNlIGEgcHJvdG9jb2wgbWVzc2FnZQotICAgKiBtYXkgbGVnYWxseSBlbmQgd2hlcmV2ZXIgYSB0YWcgb2NjdXJzLCBhbmQgemVybyBpcyBub3QgYSB2YWxpZCB0YWcgbnVtYmVyLgotICAgKi8KLSAgcHVibGljIGludCByZWFkVGFnKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoaXNBdEVuZCgpKSB7Ci0gICAgICBsYXN0VGFnID0gMDsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLQotICAgIGxhc3RUYWcgPSByZWFkUmF3VmFyaW50MzIoKTsKLSAgICBpZiAoV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcihsYXN0VGFnKSA9PSAwKSB7Ci0gICAgICAvLyBJZiB3ZSBhY3R1YWxseSByZWFkIHplcm8gKG9yIGFueSB0YWcgbnVtYmVyIGNvcnJlc3BvbmRpbmcgdG8gZmllbGQKLSAgICAgIC8vIG51bWJlciB6ZXJvKSwgdGhhdCdzIG5vdCBhIHZhbGlkIHRhZy4KLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkVGFnKCk7Ci0gICAgfQotICAgIHJldHVybiBsYXN0VGFnOwotICB9Ci0KLSAgLyoqCi0gICAqIFZlcmlmaWVzIHRoYXQgdGhlIGxhc3QgY2FsbCB0byByZWFkVGFnKCkgcmV0dXJuZWQgdGhlIGdpdmVuIHRhZyB2YWx1ZS4KLSAgICogVGhpcyBpcyB1c2VkIHRvIHZlcmlmeSB0aGF0IGEgbmVzdGVkIGdyb3VwIGVuZGVkIHdpdGggdGhlIGNvcnJlY3QKLSAgICogZW5kIHRhZy4KLSAgICoKLSAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge0Bjb2RlIHZhbHVlfSBkb2VzIG5vdCBtYXRjaCB0aGUKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdCB0YWcuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjaGVja0xhc3RUYWdXYXMoZmluYWwgaW50IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgaWYgKGxhc3RUYWcgIT0gdmFsdWUpIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkRW5kVGFnKCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGludCBnZXRMYXN0VGFnKCkgewotICAgIHJldHVybiBsYXN0VGFnOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGFuZCBkaXNjYXJkcyBhIHNpbmdsZSBmaWVsZCwgZ2l2ZW4gaXRzIHRhZyB2YWx1ZS4KLSAgICoKLSAgICogQHJldHVybiB7QGNvZGUgZmFsc2V9IGlmIHRoZSB0YWcgaXMgYW4gZW5kZ3JvdXAgdGFnLCBpbiB3aGljaCBjYXNlCi0gICAqICAgICAgICAgbm90aGluZyBpcyBza2lwcGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zIHtAY29kZSB0cnVlfS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNraXBGaWVsZChmaW5hbCBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHN3aXRjaCAoV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpKSB7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UOgotICAgICAgICBza2lwUmF3VmFyaW50KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQ6Ci0gICAgICAgIHNraXBSYXdCeXRlcyg4KTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgc2tpcFJhd0J5dGVzKHJlYWRSYXdWYXJpbnQzMigpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6Ci0gICAgICAgIHNraXBNZXNzYWdlKCk7Ci0gICAgICAgIGNoZWNrTGFzdFRhZ1dhcygKLSAgICAgICAgICBXaXJlRm9ybWF0Lm1ha2VUYWcoV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgotICAgICAgICBza2lwUmF3Qnl0ZXMoNCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRXaXJlVHlwZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIHNpbmdsZSBmaWVsZCBhbmQgd3JpdGVzIGl0IHRvIG91dHB1dCBpbiB3aXJlIGZvcm1hdCwKLSAgICogZ2l2ZW4gaXRzIHRhZyB2YWx1ZS4KLSAgICoKLSAgICogQHJldHVybiB7QGNvZGUgZmFsc2V9IGlmIHRoZSB0YWcgaXMgYW4gZW5kZ3JvdXAgdGFnLCBpbiB3aGljaCBjYXNlCi0gICAqICAgICAgICAgbm90aGluZyBpcyBza2lwcGVkLiAgT3RoZXJ3aXNlLCByZXR1cm5zIHtAY29kZSB0cnVlfS4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIHNraXBGaWVsZChmaW5hbCBpbnQgdGFnLCBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHN3aXRjaCAoV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpKSB7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UOiB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSByZWFkSW50NjQoKTsKLSAgICAgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIodGFnKTsKLSAgICAgICAgb3V0cHV0LndyaXRlVUludDY0Tm9UYWcodmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0OiB7Ci0gICAgICAgIGxvbmcgdmFsdWUgPSByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgICAgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIodGFnKTsKLSAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDogewotICAgICAgICBCeXRlU3RyaW5nIHZhbHVlID0gcmVhZEJ5dGVzKCk7Ci0gICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKHRhZyk7Ci0gICAgICAgIG91dHB1dC53cml0ZUJ5dGVzTm9UYWcodmFsdWUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUDogewotICAgICAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOwotICAgICAgICBza2lwTWVzc2FnZShvdXRwdXQpOwotICAgICAgICBpbnQgZW5kdGFnID0gV2lyZUZvcm1hdC5tYWtlVGFnKFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCk7Ci0gICAgICAgIGNoZWNrTGFzdFRhZ1dhcyhlbmR0YWcpOwotICAgICAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMihlbmR0YWcpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6IHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzI6IHsKLSAgICAgICAgaW50IHZhbHVlID0gcmVhZFJhd0xpdHRsZUVuZGlhbjMyKCk7Ci0gICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKHRhZyk7Ci0gICAgICAgIG91dHB1dC53cml0ZUZpeGVkMzJOb1RhZyh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRXaXJlVHlwZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhbmQgZGlzY2FyZHMgYW4gZW50aXJlIG1lc3NhZ2UuICBUaGlzIHdpbGwgcmVhZCBlaXRoZXIgdW50aWwgRU9GCi0gICAqIG9yIHVudGlsIGFuIGVuZGdyb3VwIHRhZywgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2tpcE1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBmaW5hbCBpbnQgdGFnID0gcmVhZFRhZygpOwotICAgICAgaWYgKHRhZyA9PSAwIHx8ICFza2lwRmllbGQodGFnKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGFuIGVudGlyZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8gb3V0cHV0IGluIHdpcmUgZm9ybWF0LgotICAgKiBUaGlzIHdpbGwgcmVhZCBlaXRoZXIgdW50aWwgRU9GIG9yIHVudGlsIGFuIGVuZGdyb3VwIHRhZywKLSAgICogd2hpY2hldmVyIGNvbWVzIGZpcnN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2tpcE1lc3NhZ2UoQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBmaW5hbCBpbnQgdGFnID0gcmVhZFRhZygpOwotICAgICAgaWYgKHRhZyA9PSAwIHx8ICFza2lwRmllbGQodGFnLCBvdXRwdXQpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29sbGVjdHMgdGhlIGJ5dGVzIHNraXBwZWQgYW5kIHJldHVybnMgdGhlIGRhdGEgaW4gYSBCeXRlQnVmZmVyLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBTa2lwcGVkRGF0YVNpbmsgaW1wbGVtZW50cyBSZWZpbGxDYWxsYmFjayB7Ci0gICAgcHJpdmF0ZSBpbnQgbGFzdFBvcyA9IGJ1ZmZlclBvczsKLSAgICBwcml2YXRlIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBieXRlQXJyYXlTdHJlYW07Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBvblJlZmlsbCgpIHsKLSAgICAgIGlmIChieXRlQXJyYXlTdHJlYW0gPT0gbnVsbCkgewotICAgICAgICBieXRlQXJyYXlTdHJlYW0gPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICB9Ci0gICAgICBieXRlQXJyYXlTdHJlYW0ud3JpdGUoYnVmZmVyLCBsYXN0UG9zLCBidWZmZXJQb3MgLSBsYXN0UG9zKTsKLSAgICAgIGxhc3RQb3MgPSAwOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgc2tpcHBlZCBkYXRhIGluIGEgQnl0ZUJ1ZmZlci4gVGhpcyBtZXRob2Qgc2hvdWxkIG9ubHkgYmUKLSAgICAgKiBjYWxsZWQgb25jZS4KLSAgICAgKi8KLSAgICBCeXRlQnVmZmVyIGdldFNraXBwZWREYXRhKCkgewotICAgICAgaWYgKGJ5dGVBcnJheVN0cmVhbSA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYnVmZmVyLCBsYXN0UG9zLCBidWZmZXJQb3MgLSBsYXN0UG9zKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJ5dGVBcnJheVN0cmVhbS53cml0ZShidWZmZXIsIGxhc3RQb3MsIGJ1ZmZlclBvcyk7Ci0gICAgICAgIHJldHVybiBCeXRlQnVmZmVyLndyYXAoYnl0ZUFycmF5U3RyZWFtLnRvQnl0ZUFycmF5KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKiogUmVhZCBhIHtAY29kZSBkb3VibGV9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgZmxvYXR9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGZsb2F0IHJlYWRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIEZsb2F0LmludEJpdHNUb0Zsb2F0KHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIHVpbnQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkVUludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDY0KCk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiB7QGNvZGUgaW50NjR9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGxvbmcgcmVhZEludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDY0KCk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiB7QGNvZGUgaW50MzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkSW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3VmFyaW50MzIoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGZpeGVkNjR9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGxvbmcgcmVhZEZpeGVkNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGZpeGVkMzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkRml4ZWQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgYm9vbH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQ2NCgpICE9IDA7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIHtAY29kZSBzdHJpbmd9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KLSAgICogSWYgdGhlIHN0cmVhbSBjb250YWlucyBtYWxmb3JtZWQgVVRGLTgsCi0gICAqIHJlcGxhY2UgdGhlIG9mZmVuZGluZyBieXRlcyB3aXRoIHRoZSBzdGFuZGFyZCBVVEYtOCByZXBsYWNlbWVudCBjaGFyYWN0ZXIuCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBzaXplID0gcmVhZFJhd1ZhcmludDMyKCk7Ci0gICAgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpICYmIHNpemUgPiAwKSB7Ci0gICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCi0gICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0LgotICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoYnVmZmVyLCBidWZmZXJQb3MsIHNpemUsIEludGVybmFsLlVURl84KTsKLSAgICAgIGJ1ZmZlclBvcyArPSBzaXplOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGVsc2UgaWYgKHNpemUgPT0gMCkgewotICAgICAgcmV0dXJuICIiOwotICAgIH0gZWxzZSBpZiAoc2l6ZSA8PSBidWZmZXJTaXplKSB7Ci0gICAgICByZWZpbGxCdWZmZXIoc2l6ZSk7Ci0gICAgICBTdHJpbmcgcmVzdWx0ID0gbmV3IFN0cmluZyhidWZmZXIsIGJ1ZmZlclBvcywgc2l6ZSwgSW50ZXJuYWwuVVRGXzgpOwotICAgICAgYnVmZmVyUG9zICs9IHNpemU7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0LgotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVhZFJhd0J5dGVzU2xvd1BhdGgoc2l6ZSksIEludGVybmFsLlVURl84KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIHtAY29kZSBzdHJpbmd9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4KLSAgICogSWYgdGhlIHN0cmVhbSBjb250YWlucyBtYWxmb3JtZWQgVVRGLTgsCi0gICAqIHRocm93IGV4Y2VwdGlvbiB7QGxpbmsgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9ufS4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgcmVhZFN0cmluZ1JlcXVpcmVVdGY4KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlYWRSYXdWYXJpbnQzMigpOwotICAgIGZpbmFsIGJ5dGVbXSBieXRlczsKLSAgICBmaW5hbCBpbnQgb2xkUG9zID0gYnVmZmVyUG9zOwotICAgIGZpbmFsIGludCBwb3M7Ci0gICAgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBvbGRQb3MpICYmIHNpemUgPiAwKSB7Ci0gICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCi0gICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0LgotICAgICAgYnl0ZXMgPSBidWZmZXI7Ci0gICAgICBidWZmZXJQb3MgPSBvbGRQb3MgKyBzaXplOwotICAgICAgcG9zID0gb2xkUG9zOwotICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gIiI7Ci0gICAgfSBlbHNlIGlmIChzaXplIDw9IGJ1ZmZlclNpemUpIHsKLSAgICAgIHJlZmlsbEJ1ZmZlcihzaXplKTsKLSAgICAgIGJ5dGVzID0gYnVmZmVyOwotICAgICAgcG9zID0gMDsKLSAgICAgIGJ1ZmZlclBvcyA9IHBvcyArIHNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFNsb3cgcGF0aDogIEJ1aWxkIGEgYnl0ZSBhcnJheSBmaXJzdCB0aGVuIGNvcHkgaXQuCi0gICAgICBieXRlcyA9IHJlYWRSYXdCeXRlc1Nsb3dQYXRoKHNpemUpOwotICAgICAgcG9zID0gMDsKLSAgICB9Ci0gICAgLy8gVE9ETyhtYXJ0aW5yYik6IFdlIGNvdWxkIHNhdmUgYSBwYXNzIGJ5IHZhbGlkYXRpbmcgd2hpbGUgZGVjb2RpbmcuCi0gICAgaWYgKCFVdGY4LmlzVmFsaWRVdGY4KGJ5dGVzLCBwb3MsIHBvcyArIHNpemUpKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uaW52YWxpZFV0ZjgoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsIHBvcywgc2l6ZSwgSW50ZXJuYWwuVVRGXzgpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgZ3JvdXB9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgcmVhZEdyb3VwKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ucmVjdXJzaW9uTGltaXRFeGNlZWRlZCgpOwotICAgIH0KLSAgICArK3JlY3Vyc2lvbkRlcHRoOwotICAgIGJ1aWxkZXIubWVyZ2VGcm9tKHRoaXMsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICBjaGVja0xhc3RUYWdXYXMoCi0gICAgICBXaXJlRm9ybWF0Lm1ha2VUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKSk7Ci0gICAgLS1yZWN1cnNpb25EZXB0aDsKLSAgfQotCi0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgZ3JvdXB9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IFQgcmVhZEdyb3VwKAotICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgZmluYWwgUGFyc2VyPFQ+IHBhcnNlciwKLSAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ucmVjdXJzaW9uTGltaXRFeGNlZWRlZCgpOwotICAgIH0KLSAgICArK3JlY3Vyc2lvbkRlcHRoOwotICAgIFQgcmVzdWx0ID0gcGFyc2VyLnBhcnNlUGFydGlhbEZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGNoZWNrTGFzdFRhZ1dhcygKLSAgICAgIFdpcmVGb3JtYXQubWFrZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApKTsKLSAgICAtLXJlY3Vyc2lvbkRlcHRoOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYSB7QGNvZGUgZ3JvdXB9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbSBhbmQgbWVyZ2VzIGl0IGludG8gdGhlCi0gICAqIGdpdmVuIHtAbGluayBVbmtub3duRmllbGRTZXR9LgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVbmtub3duRmllbGRTZXQuQnVpbGRlciBub3cgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZS5CdWlsZGVyLCBzbwotICAgKiAgICAgICAgICAgICB5b3UgY2FuIGp1c3QgY2FsbCB7QGxpbmsgI3JlYWRHcm91cH0uCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgdm9pZCByZWFkVW5rbm93bkdyb3VwKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFdlIGtub3cgdGhhdCBVbmtub3duRmllbGRTZXQgd2lsbCBpZ25vcmUgYW55IEV4dGVuc2lvblJlZ2lzdHJ5IHNvIGl0Ci0gICAgLy8gaXMgc2FmZSB0byBwYXNzIG51bGwgaGVyZS4gIChXZSBjYW4ndCBjYWxsCi0gICAgLy8gRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RW1wdHlSZWdpc3RyeSgpIGJlY2F1c2UgdGhhdCB3b3VsZCBtYWtlIHRoaXMKLSAgICAvLyBjbGFzcyBkZXBlbmQgb24gRXh0ZW5zaW9uUmVnaXN0cnksIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBsaXRlCi0gICAgLy8gbGlicmFyeS4pCi0gICAgcmVhZEdyb3VwKGZpZWxkTnVtYmVyLCBidWlsZGVyLCBudWxsKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZShmaW5hbCBNZXNzYWdlTGl0ZS5CdWlsZGVyIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgaW50IGxlbmd0aCA9IHJlYWRSYXdWYXJpbnQzMigpOwotICAgIGlmIChyZWN1cnNpb25EZXB0aCA+PSByZWN1cnNpb25MaW1pdCkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKTsKLSAgICB9Ci0gICAgZmluYWwgaW50IG9sZExpbWl0ID0gcHVzaExpbWl0KGxlbmd0aCk7Ci0gICAgKytyZWN1cnNpb25EZXB0aDsKLSAgICBidWlsZGVyLm1lcmdlRnJvbSh0aGlzLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgY2hlY2tMYXN0VGFnV2FzKDApOwotICAgIC0tcmVjdXJzaW9uRGVwdGg7Ci0gICAgcG9wTGltaXQob2xkTGltaXQpOwotICB9Ci0KLQotICAvKiogUmVhZCBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IFQgcmVhZE1lc3NhZ2UoCi0gICAgICBmaW5hbCBQYXJzZXI8VD4gcGFyc2VyLAotICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpbnQgbGVuZ3RoID0gcmVhZFJhd1ZhcmludDMyKCk7Ci0gICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ucmVjdXJzaW9uTGltaXRFeGNlZWRlZCgpOwotICAgIH0KLSAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBwdXNoTGltaXQobGVuZ3RoKTsKLSAgICArK3JlY3Vyc2lvbkRlcHRoOwotICAgIFQgcmVzdWx0ID0gcGFyc2VyLnBhcnNlUGFydGlhbEZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAtLXJlY3Vyc2lvbkRlcHRoOwotICAgIHBvcExpbWl0KG9sZExpbWl0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgYnl0ZXN9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIEJ5dGVTdHJpbmcgcmVhZEJ5dGVzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlYWRSYXdWYXJpbnQzMigpOwotICAgIGlmIChzaXplIDw9IChidWZmZXJTaXplIC0gYnVmZmVyUG9zKSAmJiBzaXplID4gMCkgewotICAgICAgLy8gRmFzdCBwYXRoOiAgV2UgYWxyZWFkeSBoYXZlIHRoZSBieXRlcyBpbiBhIGNvbnRpZ3VvdXMgYnVmZmVyLCBzbwotICAgICAgLy8gICBqdXN0IGNvcHkgZGlyZWN0bHkgZnJvbSBpdC4KLSAgICAgIGZpbmFsIEJ5dGVTdHJpbmcgcmVzdWx0ID0gYnVmZmVySXNJbW11dGFibGUgJiYgZW5hYmxlQWxpYXNpbmcKLSAgICAgICAgICA/IEJ5dGVTdHJpbmcud3JhcChidWZmZXIsIGJ1ZmZlclBvcywgc2l6ZSkKLSAgICAgICAgICA6IEJ5dGVTdHJpbmcuY29weUZyb20oYnVmZmVyLCBidWZmZXJQb3MsIHNpemUpOwotICAgICAgYnVmZmVyUG9zICs9IHNpemU7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5FTVBUWTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gU2xvdyBwYXRoOiAgQnVpbGQgYSBieXRlIGFycmF5IGZpcnN0IHRoZW4gY29weSBpdC4KLSAgICAgIHJldHVybiBCeXRlU3RyaW5nLndyYXAocmVhZFJhd0J5dGVzU2xvd1BhdGgoc2l6ZSkpOwotICAgIH0KLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBieXRlW10gcmVhZEJ5dGVBcnJheSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgaW50IHNpemUgPSByZWFkUmF3VmFyaW50MzIoKTsKLSAgICBpZiAoc2l6ZSA8PSAoYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykgJiYgc2l6ZSA+IDApIHsKLSAgICAgIC8vIEZhc3QgcGF0aDogV2UgYWxyZWFkeSBoYXZlIHRoZSBieXRlcyBpbiBhIGNvbnRpZ3VvdXMgYnVmZmVyLCBzbwotICAgICAgLy8ganVzdCBjb3B5IGRpcmVjdGx5IGZyb20gaXQuCi0gICAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0KLSAgICAgICAgICBBcnJheXMuY29weU9mUmFuZ2UoYnVmZmVyLCBidWZmZXJQb3MsIGJ1ZmZlclBvcyArIHNpemUpOwotICAgICAgYnVmZmVyUG9zICs9IHNpemU7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTbG93IHBhdGg6IEJ1aWxkIGEgYnl0ZSBhcnJheSBmaXJzdCB0aGVuIGNvcHkgaXQuCi0gICAgICByZXR1cm4gcmVhZFJhd0J5dGVzU2xvd1BhdGgoc2l6ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgYnl0ZXN9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIEJ5dGVCdWZmZXIgcmVhZEJ5dGVCdWZmZXIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBzaXplID0gcmVhZFJhd1ZhcmludDMyKCk7Ci0gICAgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpICYmIHNpemUgPiAwKSB7Ci0gICAgICAvLyBGYXN0IHBhdGg6IFdlIGFscmVhZHkgaGF2ZSB0aGUgYnl0ZXMgaW4gYSBjb250aWd1b3VzIGJ1ZmZlci4KLSAgICAgIC8vIFdoZW4gYWxpYXNpbmcgaXMgZW5hYmxlZCwgd2UgY2FuIHJldHVybiBhIEJ5dGVCdWZmZXIgcG9pbnRpbmcgZGlyZWN0bHkKLSAgICAgIC8vIGludG8gdGhlIHVuZGVybHlpbmcgYnl0ZSBhcnJheSB3aXRob3V0IGNvcHkgaWYgdGhlIENvZGVkSW5wdXRTdHJlYW0gaXMKLSAgICAgIC8vIGNvbnN0cnVjdGVkIGZyb20gYSBieXRlIGFycmF5LiBJZiBhbGlhc2luZyBpcyBkaXNhYmxlZCBvciB0aGUgaW5wdXQgaXMKLSAgICAgIC8vIGZyb20gYW4gSW5wdXRTdHJlYW0gb3IgQnl0ZVN0cmluZywgd2UgaGF2ZSB0byBtYWtlIGEgY29weSBvZiB0aGUgYnl0ZXMuCi0gICAgICBCeXRlQnVmZmVyIHJlc3VsdCA9IGlucHV0ID09IG51bGwgJiYgIWJ1ZmZlcklzSW1tdXRhYmxlICYmIGVuYWJsZUFsaWFzaW5nCi0gICAgICAgICAgPyBCeXRlQnVmZmVyLndyYXAoYnVmZmVyLCBidWZmZXJQb3MsIHNpemUpLnNsaWNlKCkKLSAgICAgICAgICA6IEJ5dGVCdWZmZXIud3JhcChBcnJheXMuY29weU9mUmFuZ2UoCi0gICAgICAgICAgICAgIGJ1ZmZlciwgYnVmZmVyUG9zLCBidWZmZXJQb3MgKyBzaXplKSk7Ci0gICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfSBlbHNlIGlmIChzaXplID09IDApIHsKLSAgICAgIHJldHVybiBJbnRlcm5hbC5FTVBUWV9CWVRFX0JVRkZFUjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gU2xvdyBwYXRoOiBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0LgotICAgICAgcmV0dXJuIEJ5dGVCdWZmZXIud3JhcChyZWFkUmF3Qnl0ZXNTbG93UGF0aChzaXplKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgdWludDMyfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBpbnQgcmVhZFVJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYW4gZW51bSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICBDYWxsZXIgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIGNvbnZlcnRpbmcgdGhlIG51bWVyaWMgdmFsdWUgdG8gYW4gYWN0dWFsIGVudW0uCi0gICAqLwotICBwdWJsaWMgaW50IHJlYWRFbnVtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkU0ZpeGVkMzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkU0ZpeGVkNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIHtAY29kZSBzaW50MzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkU0ludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gZGVjb2RlWmlnWmFnMzIocmVhZFJhd1ZhcmludDMyKCkpOwotICB9Ci0KLSAgLyoqIFJlYWQgYW4ge0Bjb2RlIHNpbnQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkU0ludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gZGVjb2RlWmlnWmFnNjQocmVhZFJhd1ZhcmludDY0KCkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogUmVhZCBhIHJhdyBWYXJpbnQgZnJvbSB0aGUgc3RyZWFtLiAgSWYgbGFyZ2VyIHRoYW4gMzIgYml0cywgZGlzY2FyZCB0aGUKLSAgICogdXBwZXIgYml0cy4KLSAgICovCi0gIHB1YmxpYyBpbnQgcmVhZFJhd1ZhcmludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBTZWUgaW1wbGVtZW50YXRpb24gbm90ZXMgZm9yIHJlYWRSYXdWYXJpbnQ2NAotIGZhc3RwYXRoOiB7Ci0gICAgICBpbnQgcG9zID0gYnVmZmVyUG9zOwotCi0gICAgICBpZiAoYnVmZmVyU2l6ZSA9PSBwb3MpIHsKLSAgICAgICAgYnJlYWsgZmFzdHBhdGg7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSB0aGlzLmJ1ZmZlcjsKLSAgICAgIGludCB4OwotICAgICAgaWYgKCh4ID0gYnVmZmVyW3BvcysrXSkgPj0gMCkgewotICAgICAgICBidWZmZXJQb3MgPSBwb3M7Ci0gICAgICAgIHJldHVybiB4OwotICAgICAgfSBlbHNlIGlmIChidWZmZXJTaXplIC0gcG9zIDwgOSkgewotICAgICAgICBicmVhayBmYXN0cGF0aDsKLSAgICAgIH0gZWxzZSBpZiAoKHggXj0gKGJ1ZmZlcltwb3MrK10gPDwgNykpIDwgMCkgewotICAgICAgICB4IF49ICh+MCA8PCA3KTsKLSAgICAgIH0gZWxzZSBpZiAoKHggXj0gKGJ1ZmZlcltwb3MrK10gPDwgMTQpKSA+PSAwKSB7Ci0gICAgICAgIHggXj0gKH4wIDw8IDcpIF4gKH4wIDw8IDE0KTsKLSAgICAgIH0gZWxzZSBpZiAoKHggXj0gKGJ1ZmZlcltwb3MrK10gPDwgMjEpKSA8IDApIHsKLSAgICAgICAgeCBePSAofjAgPDwgNykgXiAofjAgPDwgMTQpIF4gKH4wIDw8IDIxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCB5ID0gYnVmZmVyW3BvcysrXTsKLSAgICAgICAgeCBePSB5IDw8IDI4OwotICAgICAgICB4IF49ICh+MCA8PCA3KSBeICh+MCA8PCAxNCkgXiAofjAgPDwgMjEpIF4gKH4wIDw8IDI4KTsKLSAgICAgICAgaWYgKHkgPCAwICYmCi0gICAgICAgICAgICBidWZmZXJbcG9zKytdIDwgMCAmJgotICAgICAgICAgICAgYnVmZmVyW3BvcysrXSA8IDAgJiYKLSAgICAgICAgICAgIGJ1ZmZlcltwb3MrK10gPCAwICYmCi0gICAgICAgICAgICBidWZmZXJbcG9zKytdIDwgMCAmJgotICAgICAgICAgICAgYnVmZmVyW3BvcysrXSA8IDApIHsKLSAgICAgICAgICBicmVhayBmYXN0cGF0aDsgIC8vIFdpbGwgdGhyb3cgbWFsZm9ybWVkVmFyaW50KCkKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnVmZmVyUG9zID0gcG9zOwotICAgICAgcmV0dXJuIHg7Ci0gICAgfQotICAgIHJldHVybiAoaW50KSByZWFkUmF3VmFyaW50NjRTbG93UGF0aCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNraXBSYXdWYXJpbnQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChidWZmZXJTaXplIC0gYnVmZmVyUG9zID49IDEwKSB7Ci0gICAgICBmaW5hbCBieXRlW10gYnVmZmVyID0gdGhpcy5idWZmZXI7Ci0gICAgICBpbnQgcG9zID0gYnVmZmVyUG9zOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICAgIGlmIChidWZmZXJbcG9zKytdID49IDApIHsKLSAgICAgICAgICBidWZmZXJQb3MgPSBwb3M7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHNraXBSYXdWYXJpbnRTbG93UGF0aCgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNraXBSYXdWYXJpbnRTbG93UGF0aCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgICBpZiAocmVhZFJhd0J5dGUoKSA+PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEgdmFyaW50IGZyb20gdGhlIGlucHV0IG9uZSBieXRlIGF0IGEgdGltZSwgc28gdGhhdCBpdCBkb2VzIG5vdAotICAgKiByZWFkIGFueSBieXRlcyBhZnRlciB0aGUgZW5kIG9mIHRoZSB2YXJpbnQuICBJZiB5b3Ugc2ltcGx5IHdyYXBwZWQgdGhlCi0gICAqIHN0cmVhbSBpbiBhIENvZGVkSW5wdXRTdHJlYW0gYW5kIHVzZWQge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoSW5wdXRTdHJlYW0pfQotICAgKiB0aGVuIHlvdSB3b3VsZCBwcm9iYWJseSBlbmQgdXAgcmVhZGluZyBwYXN0IHRoZSBlbmQgb2YgdGhlIHZhcmludCBzaW5jZQotICAgKiBDb2RlZElucHV0U3RyZWFtIGJ1ZmZlcnMgaXRzIGlucHV0LgotICAgKi8KLSAgc3RhdGljIGludCByZWFkUmF3VmFyaW50MzIoZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKLSAgICBpZiAoZmlyc3RCeXRlID09IC0xKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKGZpcnN0Qnl0ZSwgaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoSW5wdXRTdHJlYW0pfSwgYnV0IGV4cGVjdHMgdGhhdCB0aGUgY2FsbGVyCi0gICAqIGhhcyBhbHJlYWR5IHJlYWQgb25lIGJ5dGUuICBUaGlzIGFsbG93cyB0aGUgY2FsbGVyIHRvIGRldGVybWluZSBpZiBFT0YKLSAgICogaGFzIGJlZW4gcmVhY2hlZCBiZWZvcmUgYXR0ZW1wdGluZyB0byByZWFkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgcmVhZFJhd1ZhcmludDMyKAotICAgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSwgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKChmaXJzdEJ5dGUgJiAweDgwKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmlyc3RCeXRlOwotICAgIH0KLQotICAgIGludCByZXN1bHQgPSBmaXJzdEJ5dGUgJiAweDdmOwotICAgIGludCBvZmZzZXQgPSA3OwotICAgIGZvciAoOyBvZmZzZXQgPCAzMjsgb2Zmc2V0ICs9IDcpIHsKLSAgICAgIGZpbmFsIGludCBiID0gaW5wdXQucmVhZCgpOwotICAgICAgaWYgKGIgPT0gLTEpIHsKLSAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICAgIHJlc3VsdCB8PSAoYiAmIDB4N2YpIDw8IG9mZnNldDsKLSAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgLy8gS2VlcCByZWFkaW5nIHVwIHRvIDY0IGJpdHMuCi0gICAgZm9yICg7IG9mZnNldCA8IDY0OyBvZmZzZXQgKz0gNykgewotICAgICAgZmluYWwgaW50IGIgPSBpbnB1dC5yZWFkKCk7Ci0gICAgICBpZiAoYiA9PSAtMSkgewotICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgfQotICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgIH0KLSAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubWFsZm9ybWVkVmFyaW50KCk7Ci0gIH0KLQotICAvKiogUmVhZCBhIHJhdyBWYXJpbnQgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkUmF3VmFyaW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIEltcGxlbWVudGF0aW9uIG5vdGVzOgotICAgIC8vCi0gICAgLy8gT3B0aW1pemVkIGZvciBvbmUtYnl0ZSB2YWx1ZXMsIGV4cGVjdGVkIHRvIGJlIGNvbW1vbi4KLSAgICAvLyBUaGUgcGFydGljdWxhciBjb2RlIGJlbG93IHdhcyBzZWxlY3RlZCBmcm9tIHZhcmlvdXMgY2FuZGlkYXRlcwotICAgIC8vIGVtcGlyaWNhbGx5LCBieSB3aW5uaW5nIFZhcmludEJlbmNobWFyay4KLSAgICAvLwotICAgIC8vIFNpZ24gZXh0ZW5zaW9uIG9mIChzaWduZWQpIEphdmEgYnl0ZXMgaXMgdXN1YWxseSBhIG51aXNhbmNlLCBidXQKLSAgICAvLyB3ZSBleHBsb2l0IGl0IGhlcmUgdG8gbW9yZSBlYXNpbHkgb2J0YWluIHRoZSBzaWduIG9mIGJ5dGVzIHJlYWQuCi0gICAgLy8gSW5zdGVhZCBvZiBjbGVhbmluZyB1cCB0aGUgc2lnbiBleHRlbnNpb24gYml0cyBieSBtYXNraW5nIGVhZ2VybHksCi0gICAgLy8gd2UgZGVsYXkgdW50aWwgd2UgZmluZCB0aGUgZmluYWwgKHBvc2l0aXZlKSBieXRlLCB3aGVuIHdlIGNsZWFyIGFsbAotICAgIC8vIGFjY3VtdWxhdGVkIGJpdHMgd2l0aCBvbmUgeG9yLiAgV2UgZGVwZW5kIG9uIGphdmFjIHRvIGNvbnN0YW50IGZvbGQuCi0gZmFzdHBhdGg6IHsKLSAgICAgIGludCBwb3MgPSBidWZmZXJQb3M7Ci0KLSAgICAgIGlmIChidWZmZXJTaXplID09IHBvcykgewotICAgICAgICBicmVhayBmYXN0cGF0aDsKLSAgICAgIH0KLQotICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwotICAgICAgbG9uZyB4OwotICAgICAgaW50IHk7Ci0gICAgICBpZiAoKHkgPSBidWZmZXJbcG9zKytdKSA+PSAwKSB7Ci0gICAgICAgIGJ1ZmZlclBvcyA9IHBvczsKLSAgICAgICAgcmV0dXJuIHk7Ci0gICAgICB9IGVsc2UgaWYgKGJ1ZmZlclNpemUgLSBwb3MgPCA5KSB7Ci0gICAgICAgIGJyZWFrIGZhc3RwYXRoOwotICAgICAgfSBlbHNlIGlmICgoeSBePSAoYnVmZmVyW3BvcysrXSA8PCA3KSkgPCAwKSB7Ci0gICAgICAgIHggPSB5IF4gKH4wIDw8IDcpOwotICAgICAgfSBlbHNlIGlmICgoeSBePSAoYnVmZmVyW3BvcysrXSA8PCAxNCkpID49IDApIHsKLSAgICAgICAgeCA9IHkgXiAoKH4wIDw8IDcpIF4gKH4wIDw8IDE0KSk7Ci0gICAgICB9IGVsc2UgaWYgKCh5IF49IChidWZmZXJbcG9zKytdIDw8IDIxKSkgPCAwKSB7Ci0gICAgICAgIHggPSB5IF4gKCh+MCA8PCA3KSBeICh+MCA8PCAxNCkgXiAofjAgPDwgMjEpKTsKLSAgICAgIH0gZWxzZSBpZiAoKHggPSAoKGxvbmcpIHkpIF4gKChsb25nKSBidWZmZXJbcG9zKytdIDw8IDI4KSkgPj0gMEwpIHsKLSAgICAgICAgeCBePSAofjBMIDw8IDcpIF4gKH4wTCA8PCAxNCkgXiAofjBMIDw8IDIxKSBeICh+MEwgPDwgMjgpOwotICAgICAgfSBlbHNlIGlmICgoeCBePSAoKGxvbmcpIGJ1ZmZlcltwb3MrK10gPDwgMzUpKSA8IDBMKSB7Ci0gICAgICAgIHggXj0gKH4wTCA8PCA3KSBeICh+MEwgPDwgMTQpIF4gKH4wTCA8PCAyMSkgXiAofjBMIDw8IDI4KSBeICh+MEwgPDwgMzUpOwotICAgICAgfSBlbHNlIGlmICgoeCBePSAoKGxvbmcpIGJ1ZmZlcltwb3MrK10gPDwgNDIpKSA+PSAwTCkgewotICAgICAgICB4IF49ICh+MEwgPDwgNykgXiAofjBMIDw8IDE0KSBeICh+MEwgPDwgMjEpIF4gKH4wTCA8PCAyOCkgXiAofjBMIDw8IDM1KSBeICh+MEwgPDwgNDIpOwotICAgICAgfSBlbHNlIGlmICgoeCBePSAoKGxvbmcpIGJ1ZmZlcltwb3MrK10gPDwgNDkpKSA8IDBMKSB7Ci0gICAgICAgIHggXj0gKH4wTCA8PCA3KSBeICh+MEwgPDwgMTQpIF4gKH4wTCA8PCAyMSkgXiAofjBMIDw8IDI4KSBeICh+MEwgPDwgMzUpIF4gKH4wTCA8PCA0MikKLSAgICAgICAgICAgIF4gKH4wTCA8PCA0OSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB4IF49ICgobG9uZykgYnVmZmVyW3BvcysrXSA8PCA1Nik7Ci0gICAgICAgIHggXj0gKH4wTCA8PCA3KSBeICh+MEwgPDwgMTQpIF4gKH4wTCA8PCAyMSkgXiAofjBMIDw8IDI4KSBeICh+MEwgPDwgMzUpIF4gKH4wTCA8PCA0MikKLSAgICAgICAgICAgIF4gKH4wTCA8PCA0OSkgXiAofjBMIDw8IDU2KTsKLSAgICAgICAgaWYgKHggPCAwTCkgewotICAgICAgICAgIGlmIChidWZmZXJbcG9zKytdIDwgMEwpIHsKLSAgICAgICAgICAgIGJyZWFrIGZhc3RwYXRoOyAgLy8gV2lsbCB0aHJvdyBtYWxmb3JtZWRWYXJpbnQoKQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnVmZmVyUG9zID0gcG9zOwotICAgICAgcmV0dXJuIHg7Ci0gICAgfQotICAgIHJldHVybiByZWFkUmF3VmFyaW50NjRTbG93UGF0aCgpOwotICB9Ci0KLSAgLyoqIFZhcmlhbnQgb2YgcmVhZFJhd1ZhcmludDY0IGZvciB3aGVuIHVuY29tZm9ydGFibHkgY2xvc2UgdG8gdGhlIGxpbWl0LiAqLwotICAvKiBWaXNpYmxlIGZvciB0ZXN0aW5nICovCi0gIGxvbmcgcmVhZFJhd1ZhcmludDY0U2xvd1BhdGgoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGxvbmcgcmVzdWx0ID0gMDsKLSAgICBmb3IgKGludCBzaGlmdCA9IDA7IHNoaWZ0IDwgNjQ7IHNoaWZ0ICs9IDcpIHsKLSAgICAgIGZpbmFsIGJ5dGUgYiA9IHJlYWRSYXdCeXRlKCk7Ci0gICAgICByZXN1bHQgfD0gKGxvbmcpIChiICYgMHg3RikgPDwgc2hpZnQ7Ci0gICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5tYWxmb3JtZWRWYXJpbnQoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBpbnQgcmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpbnQgcG9zID0gYnVmZmVyUG9zOwotCi0gICAgLy8gaGFuZC1pbmxpbmVkIGVuc3VyZUF2YWlsYWJsZSg0KTsKLSAgICBpZiAoYnVmZmVyU2l6ZSAtIHBvcyA8IDQpIHsKLSAgICAgIHJlZmlsbEJ1ZmZlcig0KTsKLSAgICAgIHBvcyA9IGJ1ZmZlclBvczsKLSAgICB9Ci0KLSAgICBmaW5hbCBieXRlW10gYnVmZmVyID0gdGhpcy5idWZmZXI7Ci0gICAgYnVmZmVyUG9zID0gcG9zICsgNDsKLSAgICByZXR1cm4gKCgoYnVmZmVyW3Bvc10gICAgICYgMHhmZikpICAgICAgIHwKLSAgICAgICAgICAgICgoYnVmZmVyW3BvcyArIDFdICYgMHhmZikgPDwgIDgpIHwKLSAgICAgICAgICAgICgoYnVmZmVyW3BvcyArIDJdICYgMHhmZikgPDwgMTYpIHwKLSAgICAgICAgICAgICgoYnVmZmVyW3BvcyArIDNdICYgMHhmZikgPDwgMjQpKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEgNjQtYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlciBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBsb25nIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHBvcyA9IGJ1ZmZlclBvczsKLQotICAgIC8vIGhhbmQtaW5saW5lZCBlbnN1cmVBdmFpbGFibGUoOCk7Ci0gICAgaWYgKGJ1ZmZlclNpemUgLSBwb3MgPCA4KSB7Ci0gICAgICByZWZpbGxCdWZmZXIoOCk7Ci0gICAgICBwb3MgPSBidWZmZXJQb3M7Ci0gICAgfQotCi0gICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciA9IHRoaXMuYnVmZmVyOwotICAgIGJ1ZmZlclBvcyA9IHBvcyArIDg7Ci0gICAgcmV0dXJuICgoKChsb25nKSBidWZmZXJbcG9zXSAgICAgJiAweGZmTCkpICAgICAgIHwKLSAgICAgICAgICAgICgoKGxvbmcpIGJ1ZmZlcltwb3MgKyAxXSAmIDB4ZmZMKSA8PCAgOCkgfAotICAgICAgICAgICAgKCgobG9uZykgYnVmZmVyW3BvcyArIDJdICYgMHhmZkwpIDw8IDE2KSB8Ci0gICAgICAgICAgICAoKChsb25nKSBidWZmZXJbcG9zICsgM10gJiAweGZmTCkgPDwgMjQpIHwKLSAgICAgICAgICAgICgoKGxvbmcpIGJ1ZmZlcltwb3MgKyA0XSAmIDB4ZmZMKSA8PCAzMikgfAotICAgICAgICAgICAgKCgobG9uZykgYnVmZmVyW3BvcyArIDVdICYgMHhmZkwpIDw8IDQwKSB8Ci0gICAgICAgICAgICAoKChsb25nKSBidWZmZXJbcG9zICsgNl0gJiAweGZmTCkgPDwgNDgpIHwKLSAgICAgICAgICAgICgoKGxvbmcpIGJ1ZmZlcltwb3MgKyA3XSAmIDB4ZmZMKSA8PCA1NikpOwotICB9Ci0KLSAgLyoqCi0gICAqIERlY29kZSBhIFppZ1phZy1lbmNvZGVkIDMyLWJpdCB2YWx1ZS4gIFppZ1phZyBlbmNvZGVzIHNpZ25lZCBpbnRlZ2VycwotICAgKiBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwKLSAgICogbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLAotICAgKiB0aHVzIGFsd2F5cyB0YWtpbmcgMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQotICAgKgotICAgKiBAcGFyYW0gbiBBbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciwgc3RvcmVkIGluIGEgc2lnbmVkIGludCBiZWNhdXNlCi0gICAqICAgICAgICAgIEphdmEgaGFzIG5vIGV4cGxpY2l0IHVuc2lnbmVkIHN1cHBvcnQuCi0gICAqIEByZXR1cm4gQSBzaWduZWQgMzItYml0IGludGVnZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBkZWNvZGVaaWdaYWczMihmaW5hbCBpbnQgbikgewotICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWNvZGUgYSBaaWdaYWctZW5jb2RlZCA2NC1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKLSAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCi0gICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLSAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLSAgICoKLSAgICogQHBhcmFtIG4gQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQotICAgKiAgICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgotICAgKiBAcmV0dXJuIEEgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIGRlY29kZVppZ1phZzY0KGZpbmFsIGxvbmcgbikgewotICAgIHJldHVybiAobiA+Pj4gMSkgXiAtKG4gJiAxKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmZmVyOwotICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gYnVmZmVySXNJbW11dGFibGU7Ci0gIHByaXZhdGUgaW50IGJ1ZmZlclNpemU7Ci0gIHByaXZhdGUgaW50IGJ1ZmZlclNpemVBZnRlckxpbWl0OwotICBwcml2YXRlIGludCBidWZmZXJQb3M7Ci0gIHByaXZhdGUgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQ7Ci0gIHByaXZhdGUgaW50IGxhc3RUYWc7Ci0gIHByaXZhdGUgYm9vbGVhbiBlbmFibGVBbGlhc2luZyA9IGZhbHNlOwotCi0gIC8qKgotICAgKiBUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgYmVmb3JlIHRoZSBjdXJyZW50IGJ1ZmZlci4gIFRoZSB0b3RhbAotICAgKiBieXRlcyByZWFkIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uIGNhbiBiZSBjb21wdXRlZCBhcwotICAgKiB7QGNvZGUgdG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3N9LiAgVGhpcyB2YWx1ZSBtYXkgYmUgbmVnYXRpdmUgaWYKLSAgICogcmVhZGluZyBzdGFydGVkIGluIHRoZSBtaWRkbGUgb2YgdGhlIGN1cnJlbnQgYnVmZmVyIChlLmcuIGlmIHRoZQotICAgKiBjb25zdHJ1Y3RvciB0aGF0IHRha2VzIGEgYnl0ZSBhcnJheSBhbmQgYW4gb2Zmc2V0IHdhcyB1c2VkKS4KLSAgICovCi0gIHByaXZhdGUgaW50IHRvdGFsQnl0ZXNSZXRpcmVkOwotCi0gIC8qKiBUaGUgYWJzb2x1dGUgcG9zaXRpb24gb2YgdGhlIGVuZCBvZiB0aGUgY3VycmVudCBtZXNzYWdlLiAqLwotICBwcml2YXRlIGludCBjdXJyZW50TGltaXQgPSBJbnRlZ2VyLk1BWF9WQUxVRTsKLQotICAvKiogU2VlIHNldFJlY3Vyc2lvbkxpbWl0KCkgKi8KLSAgcHJpdmF0ZSBpbnQgcmVjdXJzaW9uRGVwdGg7Ci0gIHByaXZhdGUgaW50IHJlY3Vyc2lvbkxpbWl0ID0gREVGQVVMVF9SRUNVUlNJT05fTElNSVQ7Ci0KLSAgLyoqIFNlZSBzZXRTaXplTGltaXQoKSAqLwotICBwcml2YXRlIGludCBzaXplTGltaXQgPSBERUZBVUxUX1NJWkVfTElNSVQ7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUID0gMTAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TSVpFX0xJTUlUID0gNjQgPDwgMjA7ICAvLyA2NE1CCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7Ci0KLSAgcHJpdmF0ZSBDb2RlZElucHV0U3RyZWFtKAotICAgICAgZmluYWwgYnl0ZVtdIGJ1ZmZlciwgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbiwgYm9vbGVhbiBidWZmZXJJc0ltbXV0YWJsZSkgewotICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgIGJ1ZmZlclNpemUgPSBvZmYgKyBsZW47Ci0gICAgYnVmZmVyUG9zID0gb2ZmOwotICAgIHRvdGFsQnl0ZXNSZXRpcmVkID0gLW9mZjsKLSAgICBpbnB1dCA9IG51bGw7Ci0gICAgdGhpcy5idWZmZXJJc0ltbXV0YWJsZSA9IGJ1ZmZlcklzSW1tdXRhYmxlOwotICB9Ci0KLSAgcHJpdmF0ZSBDb2RlZElucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGlucHV0LCBpbnQgYnVmZmVyU2l6ZSkgewotICAgIGJ1ZmZlciA9IG5ldyBieXRlW2J1ZmZlclNpemVdOwotICAgIGJ1ZmZlclNpemUgPSAwOwotICAgIGJ1ZmZlclBvcyA9IDA7Ci0gICAgdG90YWxCeXRlc1JldGlyZWQgPSAwOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgICBidWZmZXJJc0ltbXV0YWJsZSA9IGZhbHNlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZW5hYmxlQWxpYXNpbmcoYm9vbGVhbiBlbmFibGVkKSB7Ci0gICAgdGhpcy5lbmFibGVBbGlhc2luZyA9IGVuYWJsZWQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtIG1lc3NhZ2UgcmVjdXJzaW9uIGRlcHRoLiAgSW4gb3JkZXIgdG8gcHJldmVudCBtYWxpY2lvdXMKLSAgICogbWVzc2FnZXMgZnJvbSBjYXVzaW5nIHN0YWNrIG92ZXJmbG93cywge0Bjb2RlIENvZGVkSW5wdXRTdHJlYW19IGxpbWl0cwotICAgKiBob3cgZGVlcGx5IG1lc3NhZ2VzIG1heSBiZSBuZXN0ZWQuICBUaGUgZGVmYXVsdCBsaW1pdCBpcyA2NC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgb2xkIGxpbWl0LgotICAgKi8KLSAgcHVibGljIGludCBzZXRSZWN1cnNpb25MaW1pdChmaW5hbCBpbnQgbGltaXQpIHsKLSAgICBpZiAobGltaXQgPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiUmVjdXJzaW9uIGxpbWl0IGNhbm5vdCBiZSBuZWdhdGl2ZTogIiArIGxpbWl0KTsKLSAgICB9Ci0gICAgZmluYWwgaW50IG9sZExpbWl0ID0gcmVjdXJzaW9uTGltaXQ7Ci0gICAgcmVjdXJzaW9uTGltaXQgPSBsaW1pdDsKLSAgICByZXR1cm4gb2xkTGltaXQ7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZS4gIEluIG9yZGVyIHRvIHByZXZlbnQgbWFsaWNpb3VzCi0gICAqIG1lc3NhZ2VzIGZyb20gZXhoYXVzdGluZyBtZW1vcnkgb3IgY2F1c2luZyBpbnRlZ2VyIG92ZXJmbG93cywKLSAgICoge0Bjb2RlIENvZGVkSW5wdXRTdHJlYW19IGxpbWl0cyBob3cgbGFyZ2UgYSBtZXNzYWdlIG1heSBiZS4KLSAgICogVGhlIGRlZmF1bHQgbGltaXQgaXMgNjRNQi4gIFlvdSBzaG91bGQgc2V0IHRoaXMgbGltaXQgYXMgc21hbGwKLSAgICogYXMgeW91IGNhbiB3aXRob3V0IGhhcm1pbmcgeW91ciBhcHAncyBmdW5jdGlvbmFsaXR5LiAgTm90ZSB0aGF0Ci0gICAqIHNpemUgbGltaXRzIG9ubHkgYXBwbHkgd2hlbiByZWFkaW5nIGZyb20gYW4ge0Bjb2RlIElucHV0U3RyZWFtfSwgbm90Ci0gICAqIHdoZW4gY29uc3RydWN0ZWQgYXJvdW5kIGEgcmF3IGJ5dGUgYXJyYXkgKG5vciB3aXRoCi0gICAqIHtAbGluayBCeXRlU3RyaW5nI25ld0NvZGVkSW5wdXR9KS4KLSAgICogPHA+Ci0gICAqIElmIHlvdSB3YW50IHRvIHJlYWQgc2V2ZXJhbCBtZXNzYWdlcyBmcm9tIGEgc2luZ2xlIENvZGVkSW5wdXRTdHJlYW0sIHlvdQotICAgKiBjb3VsZCBjYWxsIHtAbGluayAjcmVzZXRTaXplQ291bnRlcigpfSBhZnRlciBlYWNoIG9uZSB0byBhdm9pZCBoaXR0aW5nIHRoZQotICAgKiBzaXplIGxpbWl0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBvbGQgbGltaXQuCi0gICAqLwotICBwdWJsaWMgaW50IHNldFNpemVMaW1pdChmaW5hbCBpbnQgbGltaXQpIHsKLSAgICBpZiAobGltaXQgPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiU2l6ZSBsaW1pdCBjYW5ub3QgYmUgbmVnYXRpdmU6ICIgKyBsaW1pdCk7Ci0gICAgfQotICAgIGZpbmFsIGludCBvbGRMaW1pdCA9IHNpemVMaW1pdDsKLSAgICBzaXplTGltaXQgPSBsaW1pdDsKLSAgICByZXR1cm4gb2xkTGltaXQ7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBjdXJyZW50IHNpemUgY291bnRlciB0byB6ZXJvIChzZWUge0BsaW5rICNzZXRTaXplTGltaXQoaW50KX0pLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRTaXplQ291bnRlcigpIHsKLSAgICB0b3RhbEJ5dGVzUmV0aXJlZCA9IC1idWZmZXJQb3M7Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB7QGNvZGUgY3VycmVudExpbWl0fSB0byAoY3VycmVudCBwb3NpdGlvbikgKyB7QGNvZGUgYnl0ZUxpbWl0fS4gIFRoaXMKLSAgICogaXMgY2FsbGVkIHdoZW4gZGVzY2VuZGluZyBpbnRvIGEgbGVuZ3RoLWRlbGltaXRlZCBlbWJlZGRlZCBtZXNzYWdlLgotICAgKgotICAgKiA8cD5Ob3RlIHRoYXQge0Bjb2RlIHB1c2hMaW1pdCgpfSBkb2VzIE5PVCBhZmZlY3QgaG93IG1hbnkgYnl0ZXMgdGhlCi0gICAqIHtAY29kZSBDb2RlZElucHV0U3RyZWFtfSByZWFkcyBmcm9tIGFuIHVuZGVybHlpbmcge0Bjb2RlIElucHV0U3RyZWFtfSB3aGVuCi0gICAqIHJlZnJlc2hpbmcgaXRzIGJ1ZmZlci4gIElmIHlvdSBuZWVkIHRvIHByZXZlbnQgcmVhZGluZyBwYXN0IGEgY2VydGFpbgotICAgKiBwb2ludCBpbiB0aGUgdW5kZXJseWluZyB7QGNvZGUgSW5wdXRTdHJlYW19IChlLmcuIGJlY2F1c2UgeW91IGV4cGVjdCBpdCB0bwotICAgKiBjb250YWluIG1vcmUgZGF0YSBhZnRlciB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlIHdoaWNoIHlvdSBuZWVkIHRvIGhhbmRsZQotICAgKiBkaWZmZXJlbnRseSkgdGhlbiB5b3UgbXVzdCBwbGFjZSBhIHdyYXBwZXIgYXJvdW5kIHlvdXIge0Bjb2RlIElucHV0U3RyZWFtfQotICAgKiB3aGljaCBsaW1pdHMgdGhlIGFtb3VudCBvZiBkYXRhIHRoYXQgY2FuIGJlIHJlYWQgZnJvbSBpdC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgb2xkIGxpbWl0LgotICAgKi8KLSAgcHVibGljIGludCBwdXNoTGltaXQoaW50IGJ5dGVMaW1pdCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgaWYgKGJ5dGVMaW1pdCA8IDApIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5uZWdhdGl2ZVNpemUoKTsKLSAgICB9Ci0gICAgYnl0ZUxpbWl0ICs9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zOwotICAgIGZpbmFsIGludCBvbGRMaW1pdCA9IGN1cnJlbnRMaW1pdDsKLSAgICBpZiAoYnl0ZUxpbWl0ID4gb2xkTGltaXQpIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgfQotICAgIGN1cnJlbnRMaW1pdCA9IGJ5dGVMaW1pdDsKLQotICAgIHJlY29tcHV0ZUJ1ZmZlclNpemVBZnRlckxpbWl0KCk7Ci0KLSAgICByZXR1cm4gb2xkTGltaXQ7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKSB7Ci0gICAgYnVmZmVyU2l6ZSArPSBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKLSAgICBmaW5hbCBpbnQgYnVmZmVyRW5kID0gdG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJTaXplOwotICAgIGlmIChidWZmZXJFbmQgPiBjdXJyZW50TGltaXQpIHsKLSAgICAgIC8vIExpbWl0IGlzIGluIGN1cnJlbnQgYnVmZmVyLgotICAgICAgYnVmZmVyU2l6ZUFmdGVyTGltaXQgPSBidWZmZXJFbmQgLSBjdXJyZW50TGltaXQ7Ci0gICAgICBidWZmZXJTaXplIC09IGJ1ZmZlclNpemVBZnRlckxpbWl0OwotICAgIH0gZWxzZSB7Ci0gICAgICBidWZmZXJTaXplQWZ0ZXJMaW1pdCA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERpc2NhcmRzIHRoZSBjdXJyZW50IGxpbWl0LCByZXR1cm5pbmcgdG8gdGhlIHByZXZpb3VzIGxpbWl0LgotICAgKgotICAgKiBAcGFyYW0gb2xkTGltaXQgVGhlIG9sZCBsaW1pdCwgYXMgcmV0dXJuZWQgYnkge0Bjb2RlIHB1c2hMaW1pdH0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBwb3BMaW1pdChmaW5hbCBpbnQgb2xkTGltaXQpIHsKLSAgICBjdXJyZW50TGltaXQgPSBvbGRMaW1pdDsKLSAgICByZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkIGJlZm9yZSB0aGUgY3VycmVudCBsaW1pdC4KLSAgICogSWYgbm8gbGltaXQgaXMgc2V0LCByZXR1cm5zIC0xLgotICAgKi8KLSAgcHVibGljIGludCBnZXRCeXRlc1VudGlsTGltaXQoKSB7Ci0gICAgaWYgKGN1cnJlbnRMaW1pdCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZpbmFsIGludCBjdXJyZW50QWJzb2x1dGVQb3NpdGlvbiA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zOwotICAgIHJldHVybiBjdXJyZW50TGltaXQgLSBjdXJyZW50QWJzb2x1dGVQb3NpdGlvbjsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHN0cmVhbSBoYXMgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4gIFRoaXMgaXMgdGhlCi0gICAqIGNhc2UgaWYgZWl0aGVyIHRoZSBlbmQgb2YgdGhlIHVuZGVybHlpbmcgaW5wdXQgc291cmNlIGhhcyBiZWVuIHJlYWNoZWQgb3IKLSAgICogaWYgdGhlIHN0cmVhbSBoYXMgcmVhY2hlZCBhIGxpbWl0IGNyZWF0ZWQgdXNpbmcge0BsaW5rICNwdXNoTGltaXQoaW50KX0uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0F0RW5kKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gYnVmZmVyUG9zID09IGJ1ZmZlclNpemUgJiYgIXRyeVJlZmlsbEJ1ZmZlcigxKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgdG90YWwgYnl0ZXMgcmVhZCB1cCB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4gQ2FsbGluZwotICAgKiB7QGxpbmsgI3Jlc2V0U2l6ZUNvdW50ZXIoKX0gcmVzZXRzIHRoaXMgdmFsdWUgdG8gemVyby4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0VG90YWxCeXRlc1JlYWQoKSB7Ci0gICAgICByZXR1cm4gdG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3M7Ci0gIH0KLQotICBwcml2YXRlIGludGVyZmFjZSBSZWZpbGxDYWxsYmFjayB7Ci0gICAgdm9pZCBvblJlZmlsbCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBSZWZpbGxDYWxsYmFjayByZWZpbGxDYWxsYmFjayA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFJlYWRzIG1vcmUgYnl0ZXMgZnJvbSB0aGUgaW5wdXQsIG1ha2luZyBhdCBsZWFzdCB7QGNvZGUgbn0gYnl0ZXMgYXZhaWxhYmxlCi0gICAqIGluIHRoZSBidWZmZXIuICBDYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCB0aGUgcmVxdWVzdGVkIHNwYWNlIGlzIG5vdCB5ZXQKLSAgICogYXZhaWxhYmxlLCBhbmQgdGhhdCB0aGUgcmVxdWVzdGVkIHNwYWNlIGlzIGxlc3MgdGhhbiBCVUZGRVJfU0laRS4KLSAgICoKLSAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gVGhlIGVuZCBvZiB0aGUgc3RyZWFtIG9yIHRoZSBjdXJyZW50Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHdhcyByZWFjaGVkLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlZmlsbEJ1ZmZlcihpbnQgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoIXRyeVJlZmlsbEJ1ZmZlcihuKSkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVHJpZXMgdG8gcmVhZCBtb3JlIGJ5dGVzIGZyb20gdGhlIGlucHV0LCBtYWtpbmcgYXQgbGVhc3Qge0Bjb2RlIG59IGJ5dGVzCi0gICAqIGF2YWlsYWJsZSBpbiB0aGUgYnVmZmVyLiAgQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIHJlcXVlc3RlZCBzcGFjZSBpcwotICAgKiBub3QgeWV0IGF2YWlsYWJsZSwgYW5kIHRoYXQgdGhlIHJlcXVlc3RlZCBzcGFjZSBpcyBsZXNzIHRoYW4gQlVGRkVSX1NJWkUuCi0gICAqCi0gICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBieXRlcyBjb3VsZCBiZSBtYWRlIGF2YWlsYWJsZTsge0Bjb2RlIGZhbHNlfQotICAgKiAgICAgICAgIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudCBsaW1pdCB3YXMgcmVhY2hlZC4KLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiB0cnlSZWZpbGxCdWZmZXIoaW50IG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGJ1ZmZlclBvcyArIG4gPD0gYnVmZmVyU2l6ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAicmVmaWxsQnVmZmVyKCkgY2FsbGVkIHdoZW4gIiArIG4gKwotICAgICAgICAgICIgYnl0ZXMgd2VyZSBhbHJlYWR5IGF2YWlsYWJsZSBpbiBidWZmZXIiKTsKLSAgICB9Ci0KLSAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3MgKyBuID4gY3VycmVudExpbWl0KSB7Ci0gICAgICAvLyBPb3BzLCB3ZSBoaXQgYSBsaW1pdC4KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAocmVmaWxsQ2FsbGJhY2sgIT0gbnVsbCkgewotICAgICAgcmVmaWxsQ2FsbGJhY2sub25SZWZpbGwoKTsKLSAgICB9Ci0KLSAgICBpZiAoaW5wdXQgIT0gbnVsbCkgewotICAgICAgaW50IHBvcyA9IGJ1ZmZlclBvczsKLSAgICAgIGlmIChwb3MgPiAwKSB7Ci0gICAgICAgIGlmIChidWZmZXJTaXplID4gcG9zKSB7Ci0gICAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIHBvcywgYnVmZmVyLCAwLCBidWZmZXJTaXplIC0gcG9zKTsKLSAgICAgICAgfQotICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBwb3M7Ci0gICAgICAgIGJ1ZmZlclNpemUgLT0gcG9zOwotICAgICAgICBidWZmZXJQb3MgPSAwOwotICAgICAgfQotCi0gICAgICBpbnQgYnl0ZXNSZWFkID0gaW5wdXQucmVhZChidWZmZXIsIGJ1ZmZlclNpemUsIGJ1ZmZlci5sZW5ndGggLSBidWZmZXJTaXplKTsKLSAgICAgIGlmIChieXRlc1JlYWQgPT0gMCB8fCBieXRlc1JlYWQgPCAtMSB8fCBieXRlc1JlYWQgPiBidWZmZXIubGVuZ3RoKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAiSW5wdXRTdHJlYW0jcmVhZChieXRlW10pIHJldHVybmVkIGludmFsaWQgcmVzdWx0OiAiICsgYnl0ZXNSZWFkICsKLSAgICAgICAgICAgICJcblRoZSBJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbiBpcyBidWdneS4iKTsKLSAgICAgIH0KLSAgICAgIGlmIChieXRlc1JlYWQgPiAwKSB7Ci0gICAgICAgIGJ1ZmZlclNpemUgKz0gYnl0ZXNSZWFkOwotICAgICAgICAvLyBJbnRlZ2VyLW92ZXJmbG93LWNvbnNjaW91cyBjaGVjayBhZ2FpbnN0IHNpemVMaW1pdAotICAgICAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBuIC0gc2l6ZUxpbWl0ID4gMCkgewotICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5zaXplTGltaXRFeGNlZWRlZCgpOwotICAgICAgICB9Ci0gICAgICAgIHJlY29tcHV0ZUJ1ZmZlclNpemVBZnRlckxpbWl0KCk7Ci0gICAgICAgIHJldHVybiAoYnVmZmVyU2l6ZSA+PSBuKSA/IHRydWUgOiB0cnlSZWZpbGxCdWZmZXIobik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgb25lIGJ5dGUgZnJvbSB0aGUgaW5wdXQuCi0gICAqCi0gICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB3YXMgcmVhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBieXRlIHJlYWRSYXdCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoYnVmZmVyUG9zID09IGJ1ZmZlclNpemUpIHsKLSAgICAgIHJlZmlsbEJ1ZmZlcigxKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlcltidWZmZXJQb3MrK107Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhIGZpeGVkIHNpemUgb2YgYnl0ZXMgZnJvbSB0aGUgaW5wdXQuCi0gICAqCi0gICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB3YXMgcmVhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBieXRlW10gcmVhZFJhd0J5dGVzKGZpbmFsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBwb3MgPSBidWZmZXJQb3M7Ci0gICAgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBwb3MpICYmIHNpemUgPiAwKSB7Ci0gICAgICBidWZmZXJQb3MgPSBwb3MgKyBzaXplOwotICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2ZSYW5nZShidWZmZXIsIHBvcywgcG9zICsgc2l6ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiByZWFkUmF3Qnl0ZXNTbG93UGF0aChzaXplKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRXhhY3RseSBsaWtlIHJlYWRSYXdCeXRlcywgYnV0IGNhbGxlciBtdXN0IGhhdmUgYWxyZWFkeSBjaGVja2VkIHRoZSBmYXN0Ci0gICAqIHBhdGg6IChzaXplIDw9IChidWZmZXJTaXplIC0gcG9zKSAmJiBzaXplID4gMCkKLSAgICovCi0gIHByaXZhdGUgYnl0ZVtdIHJlYWRSYXdCeXRlc1Nsb3dQYXRoKGZpbmFsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChzaXplIDw9IDApIHsKLSAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuIEludGVybmFsLkVNUFRZX0JZVEVfQVJSQVk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubmVnYXRpdmVTaXplKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIG1lc3NhZ2Ugc2l6ZSBzbyBmYXIgaGFzIG5vdCBleGNlZWRlZCBzaXplTGltaXQuCi0gICAgaW50IGN1cnJlbnRNZXNzYWdlU2l6ZSA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zICsgc2l6ZTsKLSAgICBpZiAoY3VycmVudE1lc3NhZ2VTaXplID4gc2l6ZUxpbWl0KSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uc2l6ZUxpbWl0RXhjZWVkZWQoKTsKLSAgICB9Ci0KLSAgICAvLyBWZXJpZnkgdGhhdCB0aGUgbWVzc2FnZSBzaXplIHNvIGZhciBoYXMgbm90IGV4Y2VlZGVkIGN1cnJlbnRMaW1pdC4KLSAgICBpZiAoY3VycmVudE1lc3NhZ2VTaXplID4gY3VycmVudExpbWl0KSB7Ci0gICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbnl3YXkuCi0gICAgICBza2lwUmF3Qnl0ZXMoY3VycmVudExpbWl0IC0gdG90YWxCeXRlc1JldGlyZWQgLSBidWZmZXJQb3MpOwotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBuZWVkIHRoZSBpbnB1dCBzdHJlYW0gdG8gcHJvY2VlZC4KLSAgICBpZiAoaW5wdXQgPT0gbnVsbCkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBpbnQgb3JpZ2luYWxCdWZmZXJQb3MgPSBidWZmZXJQb3M7Ci0gICAgZmluYWwgaW50IGJ1ZmZlcmVkQnl0ZXMgPSBidWZmZXJTaXplIC0gYnVmZmVyUG9zOwotCi0gICAgLy8gTWFyayB0aGUgY3VycmVudCBidWZmZXIgY29uc3VtZWQuCi0gICAgdG90YWxCeXRlc1JldGlyZWQgKz0gYnVmZmVyU2l6ZTsKLSAgICBidWZmZXJQb3MgPSAwOwotICAgIGJ1ZmZlclNpemUgPSAwOwotCi0gICAgLy8gRGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYnl0ZXMgd2UgbmVlZCB0byByZWFkIGZyb20gdGhlIGlucHV0IHN0cmVhbS4KLSAgICBpbnQgc2l6ZUxlZnQgPSBzaXplIC0gYnVmZmVyZWRCeXRlczsKLSAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBDb25zaWRlciB1c2luZyBhIHZhbHVlIGxhcmdlciB0aGFuIEJVRkZFUl9TSVpFLgotICAgIGlmIChzaXplTGVmdCA8IEJVRkZFUl9TSVpFIHx8IHNpemVMZWZ0IDw9IGlucHV0LmF2YWlsYWJsZSgpKSB7Ci0gICAgICAvLyBFaXRoZXIgdGhlIGJ5dGVzIHdlIG5lZWQgYXJlIGtub3duIHRvIGJlIGF2YWlsYWJsZSwgb3IgdGhlIHJlcXVpcmVkIGJ1ZmZlciBpcwotICAgICAgLy8gd2l0aGluIGFuIGFsbG93ZWQgdGhyZXNob2xkIC0gZ28gYWhlYWQgYW5kIGFsbG9jYXRlIHRoZSBidWZmZXIgbm93LgotICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLSAgICAgIC8vIENvcHkgYWxsIG9mIHRoZSBidWZmZXJlZCBieXRlcyB0byB0aGUgcmVzdWx0IGJ1ZmZlci4KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYnVmZmVyLCBvcmlnaW5hbEJ1ZmZlclBvcywgYnl0ZXMsIDAsIGJ1ZmZlcmVkQnl0ZXMpOwotCi0gICAgICAvLyBGaWxsIHRoZSByZW1haW5pbmcgYnl0ZXMgZnJvbSB0aGUgaW5wdXQgc3RyZWFtLgotICAgICAgaW50IHBvcyA9IGJ1ZmZlcmVkQnl0ZXM7Ci0gICAgICB3aGlsZSAocG9zIDwgYnl0ZXMubGVuZ3RoKSB7Ci0gICAgICAgIGludCBuID0gaW5wdXQucmVhZChieXRlcywgcG9zLCBzaXplIC0gcG9zKTsKLSAgICAgICAgaWYgKG4gPT0gLTEpIHsKLSAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsQnl0ZXNSZXRpcmVkICs9IG47Ci0gICAgICAgIHBvcyArPSBuOwotICAgICAgfQotCi0gICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotCi0gICAgLy8gVGhlIHNpemUgaXMgdmVyeSBsYXJnZS4gIEZvciBzZWN1cml0eSByZWFzb25zLCB3ZSBjYW4ndCBhbGxvY2F0ZSB0aGUKLSAgICAvLyBlbnRpcmUgYnl0ZSBhcnJheSB5ZXQuICBUaGUgc2l6ZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBpbnB1dCwgc28gYQotICAgIC8vIG1hbGljaW91c2x5LWNyYWZ0ZWQgbWVzc2FnZSBjb3VsZCBwcm92aWRlIGEgYm9ndXMgdmVyeSBsYXJnZSBzaXplIGluCi0gICAgLy8gb3JkZXIgdG8gdHJpY2sgdGhlIGFwcCBpbnRvIGFsbG9jYXRpbmcgYSBsb3Qgb2YgbWVtb3J5LiAgV2UgYXZvaWQgdGhpcwotICAgIC8vIGJ5IGFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgb25seSBhIHNtYWxsIGNodW5rIGF0IGEgdGltZSwgc28gdGhhdCB0aGUKLSAgICAvLyBtYWxpY2lvdXMgbWVzc2FnZSBtdXN0IGFjdHVhbGx5ICpiZSogZXh0cmVtZWx5IGxhcmdlIHRvIGNhdXNlCi0gICAgLy8gcHJvYmxlbXMuICBNZWFud2hpbGUsIHdlIGxpbWl0IHRoZSBhbGxvd2VkIHNpemUgb2YgYSBtZXNzYWdlIGVsc2V3aGVyZS4KLSAgICBmaW5hbCBMaXN0PGJ5dGVbXT4gY2h1bmtzID0gbmV3IEFycmF5TGlzdDxieXRlW10+KCk7Ci0KLSAgICB3aGlsZSAoc2l6ZUxlZnQgPiAwKSB7Ci0gICAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBDb25zaWRlciB1c2luZyBhIHZhbHVlIGxhcmdlciB0aGFuIEJVRkZFUl9TSVpFLgotICAgICAgZmluYWwgYnl0ZVtdIGNodW5rID0gbmV3IGJ5dGVbTWF0aC5taW4oc2l6ZUxlZnQsIEJVRkZFUl9TSVpFKV07Ci0gICAgICBpbnQgcG9zID0gMDsKLSAgICAgIHdoaWxlIChwb3MgPCBjaHVuay5sZW5ndGgpIHsKLSAgICAgICAgZmluYWwgaW50IG4gPSBpbnB1dC5yZWFkKGNodW5rLCBwb3MsIGNodW5rLmxlbmd0aCAtIHBvcyk7Ci0gICAgICAgIGlmIChuID09IC0xKSB7Ci0gICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICAgICAgfQotICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBuOwotICAgICAgICBwb3MgKz0gbjsKLSAgICAgIH0KLSAgICAgIHNpemVMZWZ0IC09IGNodW5rLmxlbmd0aDsKLSAgICAgIGNodW5rcy5hZGQoY2h1bmspOwotICAgIH0KLQotICAgIC8vIE9LLCBnb3QgZXZlcnl0aGluZy4gIE5vdyBjb25jYXRlbmF0ZSBpdCBhbGwgaW50byBvbmUgYnVmZmVyLgotICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW3NpemVdOwotCi0gICAgLy8gU3RhcnQgYnkgY29weWluZyB0aGUgbGVmdG92ZXIgYnl0ZXMgZnJvbSB0aGlzLmJ1ZmZlci4KLSAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgb3JpZ2luYWxCdWZmZXJQb3MsIGJ5dGVzLCAwLCBidWZmZXJlZEJ5dGVzKTsKLQotICAgIC8vIEFuZCBub3cgYWxsIHRoZSBjaHVua3MuCi0gICAgaW50IHBvcyA9IGJ1ZmZlcmVkQnl0ZXM7Ci0gICAgZm9yIChmaW5hbCBieXRlW10gY2h1bmsgOiBjaHVua3MpIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoY2h1bmssIDAsIGJ5dGVzLCBwb3MsIGNodW5rLmxlbmd0aCk7Ci0gICAgICBwb3MgKz0gY2h1bmsubGVuZ3RoOwotICAgIH0KLQotICAgIC8vIERvbmUuCi0gICAgcmV0dXJuIGJ5dGVzOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGFuZCBkaXNjYXJkcyB7QGNvZGUgc2l6ZX0gYnl0ZXMuCi0gICAqCi0gICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIFRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB3YXMgcmVhY2hlZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHNraXBSYXdCeXRlcyhmaW5hbCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoc2l6ZSA8PSAoYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvcykgJiYgc2l6ZSA+PSAwKSB7Ci0gICAgICAvLyBXZSBoYXZlIGFsbCB0aGUgYnl0ZXMgd2UgbmVlZCBhbHJlYWR5LgotICAgICAgYnVmZmVyUG9zICs9IHNpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNraXBSYXdCeXRlc1Nsb3dQYXRoKHNpemUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFeGFjdGx5IGxpa2Ugc2tpcFJhd0J5dGVzLCBidXQgY2FsbGVyIG11c3QgaGF2ZSBhbHJlYWR5IGNoZWNrZWQgdGhlIGZhc3QKLSAgICogcGF0aDogKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBwb3MpICYmIHNpemUgPj0gMCkKLSAgICovCi0gIHByaXZhdGUgdm9pZCBza2lwUmF3Qnl0ZXNTbG93UGF0aChmaW5hbCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5uZWdhdGl2ZVNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3MgKyBzaXplID4gY3VycmVudExpbWl0KSB7Ci0gICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbnl3YXkuCi0gICAgICBza2lwUmF3Qnl0ZXMoY3VycmVudExpbWl0IC0gdG90YWxCeXRlc1JldGlyZWQgLSBidWZmZXJQb3MpOwotICAgICAgLy8gVGhlbiBmYWlsLgotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICAvLyBTa2lwcGluZyBtb3JlIGJ5dGVzIHRoYW4gYXJlIGluIHRoZSBidWZmZXIuICBGaXJzdCBza2lwIHdoYXQgd2UgaGF2ZS4KLSAgICBpbnQgcG9zID0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvczsKLSAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOwotCi0gICAgLy8gS2VlcCByZWZpbGxpbmcgdGhlIGJ1ZmZlciB1bnRpbCB3ZSBnZXQgdG8gdGhlIHBvaW50IHdlIHdhbnRlZCB0byBza2lwIHRvLgotICAgIC8vIFRoaXMgaGFzIHRoZSBzaWRlIGVmZmVjdCBvZiBlbnN1cmluZyB0aGUgbGltaXRzIGFyZSB1cGRhdGVkIGNvcnJlY3RseS4KLSAgICByZWZpbGxCdWZmZXIoMSk7Ci0gICAgd2hpbGUgKHNpemUgLSBwb3MgPiBidWZmZXJTaXplKSB7Ci0gICAgICBwb3MgKz0gYnVmZmVyU2l6ZTsKLSAgICAgIGJ1ZmZlclBvcyA9IGJ1ZmZlclNpemU7Ci0gICAgICByZWZpbGxCdWZmZXIoMSk7Ci0gICAgfQotCi0gICAgYnVmZmVyUG9zID0gc2l6ZSAtIHBvczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDE3NGQwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2NjQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuTWF0aC5tYXg7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlV0ZjguVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb247Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubmlvLkJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZU9yZGVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIEVuY29kZXMgYW5kIHdyaXRlcyBwcm90b2NvbCBtZXNzYWdlIGZpZWxkcy4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGNvbnRhaW5zIHR3byBraW5kcyBvZiBtZXRob2RzOiAgbWV0aG9kcyB0aGF0IHdyaXRlIHNwZWNpZmljCi0gKiBwcm90b2NvbCBtZXNzYWdlIGNvbnN0cnVjdHMgYW5kIGZpZWxkIHR5cGVzIChlLmcuIHtAbGluayAjd3JpdGVUYWd9IGFuZAotICoge0BsaW5rICN3cml0ZUludDMyfSkgYW5kIG1ldGhvZHMgdGhhdCB3cml0ZSBsb3ctbGV2ZWwgdmFsdWVzIChlLmcuCi0gKiB7QGxpbmsgI3dyaXRlUmF3VmFyaW50MzJ9IGFuZCB7QGxpbmsgI3dyaXRlUmF3Qnl0ZXN9KS4gIElmIHlvdSBhcmUKLSAqIHdyaXRpbmcgZW5jb2RlZCBwcm90b2NvbCBtZXNzYWdlcywgeW91IHNob3VsZCB1c2UgdGhlIGZvcm1lciBtZXRob2RzLCBidXQgaWYKLSAqIHlvdSBhcmUgd3JpdGluZyBzb21lIG90aGVyIGZvcm1hdCBvZiB5b3VyIG93biBkZXNpZ24sIHVzZSB0aGUgbGF0dGVyLgotICoKLSAqIDxwPlRoaXMgY2xhc3MgaXMgdG90YWxseSB1bnN5bmNocm9uaXplZC4KLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtIGV4dGVuZHMgQnl0ZU91dHB1dCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKENvZGVkT3V0cHV0U3RyZWFtLmNsYXNzLmdldE5hbWUoKSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIHN1bi5taXNjLlVuc2FmZSBVTlNBRkUgPSBnZXRVbnNhZmUoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBIQVNfVU5TQUZFX0FSUkFZX09QRVJBVElPTlMgPSBzdXBwb3J0c1Vuc2FmZUFycmF5T3BlcmF0aW9ucygpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFSUkFZX0JBU0VfT0ZGU0VUID0gYnl0ZUFycmF5QmFzZU9mZnNldCgpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBGSVhFRF8zMl9TSVpFID0gNDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEZJWEVEXzY0X1NJWkUgPSA4OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1ZBUklOVF9TSVpFID0gMTA7Ci0KLSAgLyoqCi0gICAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2NvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKGludCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRUTEVfRU5ESUFOXzMyX1NJWkUgPSBGSVhFRF8zMl9TSVpFOwotCi0gIC8qKgotICAgKiBUaGUgYnVmZmVyIHNpemUgdXNlZCBpbiB7QGxpbmsgI25ld0luc3RhbmNlKE91dHB1dFN0cmVhbSl9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGJ1ZmZlciBzaXplIHRvIGVmZmljaWVudGx5IHdyaXRlIGRhdGFMZW5ndGggYnl0ZXMgdG8gdGhpcwotICAgKiBDb2RlZE91dHB1dFN0cmVhbS4gVXNlZCBieSBBYnN0cmFjdE1lc3NhZ2VMaXRlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBidWZmZXIgc2l6ZSB0byBlZmZpY2llbnRseSB3cml0ZSBkYXRhTGVuZ3RoIGJ5dGVzIHRvIHRoaXMKLSAgICogICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS4KLSAgICovCi0gIHN0YXRpYyBpbnQgY29tcHV0ZVByZWZlcnJlZEJ1ZmZlclNpemUoaW50IGRhdGFMZW5ndGgpIHsKLSAgICBpZiAoZGF0YUxlbmd0aCA+IERFRkFVTFRfQlVGRkVSX1NJWkUpIHsKLSAgICAgIHJldHVybiBERUZBVUxUX0JVRkZFUl9TSVpFOwotICAgIH0KLSAgICByZXR1cm4gZGF0YUxlbmd0aDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB3cmFwcGluZyB0aGUgZ2l2ZW4ge0Bjb2RlIE91dHB1dFN0cmVhbX0uCi0gICAqCi0gICAqIDxwPiBOT1RFOiBUaGUgcHJvdmlkZWQge0BsaW5rIE91dHB1dFN0cmVhbX0gPHN0cm9uZz5NVVNUIE5PVDwvc3Ryb25nPiByZXRhaW4gYWNjZXNzIG9yCi0gICAqIG1vZGlmeSB0aGUgcHJvdmlkZWQgYnl0ZSBhcnJheXMuIERvaW5nIHNvIG1heSByZXN1bHQgaW4gY29ycnVwdGVkIGRhdGEsIHdoaWNoIHdvdWxkIGJlCi0gICAqIGRpZmZpY3VsdCB0byBkZWJ1Zy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgewotICAgIHJldHVybiBuZXdJbnN0YW5jZShvdXRwdXQsIERFRkFVTFRfQlVGRkVSX1NJWkUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19IHdyYXBwaW5nIHRoZSBnaXZlbiB7QGNvZGUgT3V0cHV0U3RyZWFtfSB3aXRoIGEgZ2l2ZW4KLSAgICogYnVmZmVyIHNpemUuCi0gICAqCi0gICAqIDxwPiBOT1RFOiBUaGUgcHJvdmlkZWQge0BsaW5rIE91dHB1dFN0cmVhbX0gPHN0cm9uZz5NVVNUIE5PVDwvc3Ryb25nPiByZXRhaW4gYWNjZXNzIG9yCi0gICAqIG1vZGlmeSB0aGUgcHJvdmlkZWQgYnl0ZSBhcnJheXMuIERvaW5nIHNvIG1heSByZXN1bHQgaW4gY29ycnVwdGVkIGRhdGEsIHdoaWNoIHdvdWxkIGJlCi0gICAqIGRpZmZpY3VsdCB0byBkZWJ1Zy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCwgZmluYWwgaW50IGJ1ZmZlclNpemUpIHsKLSAgICByZXR1cm4gbmV3IE91dHB1dFN0cmVhbUVuY29kZXIob3V0cHV0LCBidWZmZXJTaXplKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgZ2l2ZW4KLSAgICogYnl0ZSBhcnJheS4gIElmIG1vcmUgYnl0ZXMgYXJlIHdyaXR0ZW4gdGhhbiBmaXQgaW4gdGhlIGFycmF5LAotICAgKiB7QGxpbmsgT3V0T2ZTcGFjZUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uICBXcml0aW5nIGRpcmVjdGx5IHRvIGEgZmxhdAotICAgKiBhcnJheSBpcyBmYXN0ZXIgdGhhbiB3cml0aW5nIHRvIGFuIHtAY29kZSBPdXRwdXRTdHJlYW19LiAgU2VlIGFsc28KLSAgICoge0BsaW5rIEJ5dGVTdHJpbmcjbmV3Q29kZWRCdWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ29kZWRPdXRwdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgYnl0ZVtdIGZsYXRBcnJheSkgewotICAgIHJldHVybiBuZXdJbnN0YW5jZShmbGF0QXJyYXksIDAsIGZsYXRBcnJheS5sZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19IHRoYXQgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBnaXZlbgotICAgKiBieXRlIGFycmF5IHNsaWNlLiAgSWYgbW9yZSBieXRlcyBhcmUgd3JpdHRlbiB0aGFuIGZpdCBpbiB0aGUgc2xpY2UsCi0gICAqIHtAbGluayBPdXRPZlNwYWNlRXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4gIFdyaXRpbmcgZGlyZWN0bHkgdG8gYSBmbGF0Ci0gICAqIGFycmF5IGlzIGZhc3RlciB0aGFuIHdyaXRpbmcgdG8gYW4ge0Bjb2RlIE91dHB1dFN0cmVhbX0uICBTZWUgYWxzbwotICAgKiB7QGxpbmsgQnl0ZVN0cmluZyNuZXdDb2RlZEJ1aWxkZXJ9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dFN0cmVhbSBuZXdJbnN0YW5jZSgKLSAgICAgIGZpbmFsIGJ5dGVbXSBmbGF0QXJyYXksIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW5ndGgpIHsKLSAgICByZXR1cm4gbmV3IEFycmF5RW5jb2RlcihmbGF0QXJyYXksIG9mZnNldCwgbGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4ge0BsaW5rIEJ5dGVCdWZmZXJ9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dFN0cmVhbSBuZXdJbnN0YW5jZShCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHsKLSAgICBpZiAoYnl0ZUJ1ZmZlci5oYXNBcnJheSgpKSB7Ci0gICAgICByZXR1cm4gbmV3IE5pb0hlYXBFbmNvZGVyKGJ5dGVCdWZmZXIpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IE5pb0VuY29kZXIoYnl0ZUJ1ZmZlcik7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0gdGhhdCB3cml0ZXMgdG8gdGhlIGdpdmVuIHtAbGluayBCeXRlQnVmZmVyfS4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgdGhlIHNpemUgcGFyYW1ldGVyIGlzIG5vIGxvbmdlciB1c2VkIHNpbmNlIHVzZSBvZiBhbiBpbnRlcm5hbCBidWZmZXIgaXMgdXNlbGVzcwotICAgKiAoYW5kIHdhc3RlZnVsKSB3aGVuIHdyaXRpbmcgdG8gYSB7QGxpbmsgQnl0ZUJ1ZmZlcn0uIFVzZSB7QGxpbmsgI25ld0luc3RhbmNlKEJ5dGVCdWZmZXIpfQotICAgKiBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dFN0cmVhbSBuZXdJbnN0YW5jZShCeXRlQnVmZmVyIGJ5dGVCdWZmZXIsCi0gICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikgaW50IHVudXNlZCkgewotICAgIHJldHVybiBuZXdJbnN0YW5jZShieXRlQnVmZmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyB0byB0aGUgcHJvdmlkZWQge0BsaW5rIEJ5dGVPdXRwdXR9LgotICAgKgotICAgKiA8cD4gTk9URTogVGhlIHtAbGluayBCeXRlT3V0cHV0fSA8c3Ryb25nPk1VU1QgTk9UPC9zdHJvbmc+IG1vZGlmeSB0aGUgcHJvdmlkZWQgYnVmZmVycy4gRG9pbmcKLSAgICogc28gbWF5IHJlc3VsdCBpbiBjb3JydXB0ZWQgZGF0YSwgd2hpY2ggd291bGQgYmUgZGlmZmljdWx0IHRvIGRlYnVnLgotICAgKgotICAgKiBAcGFyYW0gYnl0ZU91dHB1dCB0aGUgb3V0cHV0IHRhcmdldCBmb3IgZW5jb2RlZCBieXRlcy4KLSAgICogQHBhcmFtIGJ1ZmZlclNpemUgdGhlIHNpemUgb2YgdGhlIGludGVybmFsIHNjcmF0Y2ggYnVmZmVyIHRvIGJlIHVzZWQgZm9yIHN0cmluZyBlbmNvZGluZy4KLSAgICogU2V0dGluZyB0aGlzIHRvIHtAY29kZSAwfSB3aWxsIGRpc2FibGUgYnVmZmVyaW5nLCByZXF1aXJpbmcgYW4gYWxsb2NhdGlvbiBmb3IgZWFjaCBlbmNvZGVkCi0gICAqIHN0cmluZy4KLSAgICovCi0gIHN0YXRpYyBDb2RlZE91dHB1dFN0cmVhbSBuZXdJbnN0YW5jZShCeXRlT3V0cHV0IGJ5dGVPdXRwdXQsIGludCBidWZmZXJTaXplKSB7Ci0gICAgaWYgKGJ1ZmZlclNpemUgPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJidWZmZXJTaXplIG11c3QgYmUgcG9zaXRpdmUiKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gbmV3IEJ5dGVPdXRwdXRFbmNvZGVyKGJ5dGVPdXRwdXQsIGJ1ZmZlclNpemUpOwotICB9Ci0KLSAgLy8gRGlzYWxsb3cgY29uc3RydWN0aW9uIG91dHNpZGUgb2YgdGhpcyBjbGFzcy4KLSAgcHJpdmF0ZSBDb2RlZE91dHB1dFN0cmVhbSgpIHsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqIEVuY29kZSBhbmQgd3JpdGUgYSB0YWcuICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlVGFnKGludCBmaWVsZE51bWJlciwgaW50IHdpcmVUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlSW50MzIoaW50IGZpZWxkTnVtYmVyLCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKiogV3JpdGUgYSB7QGNvZGUgdWludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVVSW50MzIoaW50IGZpZWxkTnVtYmVyLCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKiogV3JpdGUgYSB7QGNvZGUgc2ludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVTSW50MzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVVSW50MzIoZmllbGROdW1iZXIsIGVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlRml4ZWQzMihpbnQgZmllbGROdW1iZXIsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNGaXhlZDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlRml4ZWQzMihmaWVsZE51bWJlciwgdmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlSW50NjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVUludDY0KGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgdWludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVVSW50NjQoaW50IGZpZWxkTnVtYmVyLCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNJbnQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVVSW50NjQoZmllbGROdW1iZXIsIGVuY29kZVppZ1phZzY0KHZhbHVlKSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlRml4ZWQ2NChpbnQgZmllbGROdW1iZXIsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVTRml4ZWQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVGaXhlZDY0KGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZmxvYXR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUZsb2F0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgZmxvYXQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVGaXhlZDMyKGZpZWxkTnVtYmVyLCBGbG9hdC5mbG9hdFRvUmF3SW50Qml0cyh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGRvdWJsZX0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRG91YmxlKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgZG91YmxlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlRml4ZWQ2NChmaWVsZE51bWJlciwgRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHModmFsdWUpKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBib29sfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVCb29sKGludCBmaWVsZE51bWJlciwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZSBhbiBlbnVtIGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiBUaGUgcHJvdmlkZWQgdmFsdWUgaXMgdGhlIG51bWVyaWMKLSAgICogdmFsdWUgdXNlZCB0byByZXByZXNlbnQgdGhlIGVudW0gdmFsdWUgb24gdGhlIHdpcmUgKG5vdCB0aGUgZW51bSBvcmRpbmFsIHZhbHVlKS4KLSAgICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRW51bShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUludDMyKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgc3RyaW5nfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTdHJpbmcoaW50IGZpZWxkTnVtYmVyLCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKiogV3JpdGUgYSB7QGNvZGUgYnl0ZXN9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICAvLyBBYnN0cmFjdCB0byBhdm9pZCBvdmVyaGVhZCBvZiBhZGRpdGlvbmFsIHZpcnR1YWwgbWV0aG9kIGNhbGxzLgotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJ5dGVzKGludCBmaWVsZE51bWJlciwgQnl0ZVN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBieXRlc30gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQnl0ZUFycmF5KGludCBmaWVsZE51bWJlciwgYnl0ZVtdIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVCeXRlQXJyYXkoaW50IGZpZWxkTnVtYmVyLCBieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICogVGhpcyBtZXRob2Qgd2lsbCB3cml0ZSBhbGwgY29udGVudCBvZiB0aGUgQnl0ZUJ1ZmZlciByZWdhcmRsZXNzIG9mIHRoZQotICAgKiBjdXJyZW50IHBvc2l0aW9uIGFuZCBsaW1pdCAoaS5lLiwgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSB3cml0dGVuIGlzCi0gICAqIHZhbHVlLmNhcGFjaXR5KCksIG5vdCB2YWx1ZS5yZW1haW5pbmcoKSkuIEZ1cnRoZXJtb3JlLCB0aGlzIG1ldGhvZCBkb2Vzbid0Ci0gICAqIGFsdGVyIHRoZSBzdGF0ZSBvZiB0aGUgcGFzc2VkLWluIEJ5dGVCdWZmZXIuIEl0cyBwb3NpdGlvbiwgbGltaXQsIG1hcmssCi0gICAqIGV0Yy4gd2lsbCByZW1haW4gdW5jaGFuZ2VkLiBJZiB5b3Ugb25seSB3YW50IHRvIHdyaXRlIHRoZSByZW1haW5pbmcgYnl0ZXMKLSAgICogb2YgYSBCeXRlQnVmZmVyLCB5b3UgY2FuIGNhbGwKLSAgICoge0Bjb2RlIHdyaXRlQnl0ZUJ1ZmZlcihmaWVsZE51bWJlciwgYnl0ZUJ1ZmZlci5zbGljZSgpKX0uCi0gICAqLwotICAvLyBBYnN0cmFjdCB0byBhdm9pZCBvdmVyaGVhZCBvZiBhZGRpdGlvbmFsIHZpcnR1YWwgbWV0aG9kIGNhbGxzLgotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUJ5dGVCdWZmZXIoaW50IGZpZWxkTnVtYmVyLCBCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEgc2luZ2xlIGJ5dGUuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVJhd0J5dGUoZmluYWwgYnl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZSh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSBzaW5nbGUgYnl0ZSwgcmVwcmVzZW50ZWQgYnkgYW4gaW50ZWdlciB2YWx1ZS4gKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVSYXdCeXRlKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZSgoYnl0ZSkgdmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIGFycmF5IG9mIGJ5dGVzLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIGJ5dGVbXSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZSh2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVSYXdCeXRlcyhmaW5hbCBieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGUodmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIGJ5dGUgc3RyaW5nLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIEJ5dGVCdWZmZXIuIFRoaXMgbWV0aG9kIHdpbGwgd3JpdGUgYWxsIGNvbnRlbnQgb2YgdGhlIEJ5dGVCdWZmZXIKLSAgICogcmVnYXJkbGVzcyBvZiB0aGUgY3VycmVudCBwb3NpdGlvbiBhbmQgbGltaXQgKGkuZS4sIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICogdG8gYmUgd3JpdHRlbiBpcyB2YWx1ZS5jYXBhY2l0eSgpLCBub3QgdmFsdWUucmVtYWluaW5nKCkpLiBGdXJ0aGVybW9yZSwKLSAgICogdGhpcyBtZXRob2QgZG9lc24ndCBhbHRlciB0aGUgc3RhdGUgb2YgdGhlIHBhc3NlZC1pbiBCeXRlQnVmZmVyLiBJdHMKLSAgICogcG9zaXRpb24sIGxpbWl0LCBtYXJrLCBldGMuIHdpbGwgcmVtYWluIHVuY2hhbmdlZC4gSWYgeW91IG9ubHkgd2FudCB0bwotICAgKiB3cml0ZSB0aGUgcmVtYWluaW5nIGJ5dGVzIG9mIGEgQnl0ZUJ1ZmZlciwgeW91IGNhbiBjYWxsCi0gICAqIHtAY29kZSB3cml0ZVJhd0J5dGVzKGJ5dGVCdWZmZXIuc2xpY2UoKSl9LgotICAgKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVSYXdCeXRlcyhmaW5hbCBCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTWVzc2FnZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBXcml0ZSBhIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLAotICAgKiB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCi0gICAqLwotICAvLyBBYnN0cmFjdCB0byBhdm9pZCBvdmVyaGVhZCBvZiBhZGRpdGlvbmFsIHZpcnR1YWwgbWV0aG9kIGNhbGxzLgotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKioKLSAgICogV3JpdGUgYW4gdW5wYXJzZWQgTWVzc2FnZVNldCBleHRlbnNpb24gZmllbGQgdG8gdGhlIHN0cmVhbS4gIEZvcgotICAgKiBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KLSAgICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlUmF3TWVzc2FnZVNldEV4dGVuc2lvbihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKiogV3JpdGUgYW4ge0Bjb2RlIGludDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICAvLyBBYnN0cmFjdCB0byBhdm9pZCBvdmVyaGVhZCBvZiBhZGRpdGlvbmFsIHZpcnR1YWwgbWV0aG9kIGNhbGxzLgotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUludDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVVSW50MzJOb1RhZyhpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKiogV3JpdGUgYSB7QGNvZGUgc2ludDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNJbnQzMk5vVGFnKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVVJbnQzMk5vVGFnKGVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVGaXhlZDMyTm9UYWcoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNGaXhlZDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlRml4ZWQzMk5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgaW50NjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlSW50NjROb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVUludDY0Tm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVVSW50NjROb1RhZyhsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIHNpbnQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVTSW50NjROb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVUludDY0Tm9UYWcoZW5jb2RlWmlnWmFnNjQodmFsdWUpKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBmaXhlZDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICAvLyBBYnN0cmFjdCB0byBhdm9pZCBvdmVyaGVhZCBvZiBhZGRpdGlvbmFsIHZpcnR1YWwgbWV0aG9kIGNhbGxzLgotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCB3cml0ZUZpeGVkNjROb1RhZyhsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVNGaXhlZDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUZpeGVkNjROb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZmxvYXR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRmxvYXROb1RhZyhmaW5hbCBmbG9hdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUZpeGVkMzJOb1RhZyhGbG9hdC5mbG9hdFRvUmF3SW50Qml0cyh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGRvdWJsZX0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVEb3VibGVOb1RhZyhmaW5hbCBkb3VibGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVGaXhlZDY0Tm9UYWcoRG91YmxlLmRvdWJsZVRvUmF3TG9uZ0JpdHModmFsdWUpKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBib29sfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJvb2xOb1RhZyhmaW5hbCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlKChieXRlKSAodmFsdWUgPyAxIDogMCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGFuIGVudW0gZmllbGQgdG8gdGhlIHN0cmVhbS4gVGhlIHByb3ZpZGVkIHZhbHVlIGlzIHRoZSBudW1lcmljCi0gICAqIHZhbHVlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBlbnVtIHZhbHVlIG9uIHRoZSB3aXJlIChub3QgdGhlIGVudW0gb3JkaW5hbCB2YWx1ZSkuCi0gICAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUVudW1Ob1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVJbnQzMk5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBzdHJpbmd9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIC8vIFRPRE8oZHdlaXMpOiBEb2N1bWVudCBiZWhhdmlvciBvbiBpbGwtZm9ybWVkIFVURi0xNiBpbnB1dC4KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVTdHJpbmdOb1RhZyhTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKiogV3JpdGUgYSB7QGNvZGUgYnl0ZXN9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIC8vIEFic3RyYWN0IHRvIGF2b2lkIG92ZXJoZWFkIG9mIGFkZGl0aW9uYWwgdmlydHVhbCBtZXRob2QgY2FsbHMuCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlQnl0ZXNOb1RhZyhmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGVBcnJheU5vVGFnKGZpbmFsIGJ5dGVbXSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUJ5dGVBcnJheU5vVGFnKHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgLy8gQWJzdHJhY3QgdG8gYXZvaWQgb3ZlcmhlYWQgb2YgYWRkaXRpb25hbCB2aXJ0dWFsIG1ldGhvZCBjYWxscy4KLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGVNZXNzYWdlTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvLz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgQEV4cGVyaW1lbnRhbEFwaQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoYnl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIEBFeHBlcmltZW50YWxBcGkKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlKGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIEBFeHBlcmltZW50YWxBcGkKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTGF6eShieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGFic3RyYWN0IHZvaWQgd3JpdGUoQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIEBFeHBlcmltZW50YWxBcGkKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBhYnN0cmFjdCB2b2lkIHdyaXRlTGF6eShCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgaW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUludDMyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlSW50MzJTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgdWludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVSW50MzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVVSW50MzJTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIHNpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDMyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZpeGVkMzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkMzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIHtAY29kZSBzZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ZpeGVkMzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTRml4ZWQzMlNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUludDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUludDY0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIHVpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVUludDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ludDY0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRml4ZWQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGbG9hdFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBmbG9hdCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRmxvYXRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZG91YmxlfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVEb3VibGVTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgZG91YmxlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVEb3VibGVTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgYm9vbH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlQm9vbFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBib29sZWFuIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVCb29sU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIGVudW0gZmllbGQsIGluY2x1ZGluZyB0YWcuIFRoZSBwcm92aWRlZCB2YWx1ZSBpcyB0aGUgbnVtZXJpYwotICAgKiB2YWx1ZSB1c2VkIHRvIHJlcHJlc2VudCB0aGUgZW51bSB2YWx1ZSBvbiB0aGUgd2lyZSAobm90IHRoZSBlbnVtIG9yZGluYWwgdmFsdWUpLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUVudW1TaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVFbnVtU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIHN0cmluZ30gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RyaW5nU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCeXRlc1NpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVCeXRlc1NpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBieXRlc30gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlQnl0ZUFycmF5U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGJ5dGVbXSB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlQnl0ZUFycmF5U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCeXRlQnVmZmVyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVCdWZmZXIgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUJ5dGVCdWZmZXJTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICogZW1iZWRkZWQgbWVzc2FnZSBpbiBsYXp5IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUxhenlGaWVsZFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBMYXp5RmllbGRMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVMYXp5RmllbGRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICogZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVNZXNzYWdlU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVNZXNzYWdlU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICogTWVzc2FnZVNldCBleHRlbnNpb24gdG8gdGhlIHN0cmVhbS4gIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsCi0gICAqIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSkgKiAyCi0gICAgICAgICsgY29tcHV0ZVVJbnQzMlNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcikKLSAgICAgICAgKyBjb21wdXRlTWVzc2FnZVNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB1bnBhcnNlZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgc3RyZWFtLiAgRm9yCi0gICAqIGhpc3RvcmljYWwgcmVhc29ucywgdGhlIHdpcmUgZm9ybWF0IGRpZmZlcnMgZnJvbSBub3JtYWwgZmllbGRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAotICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSkgKiAyCi0gICAgICAgICsgY29tcHV0ZVVJbnQzMlNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcikKLSAgICAgICAgKyBjb21wdXRlQnl0ZXNTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICogbGF6aWx5IHBhcnNlZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgc3RyZWFtLiAgRm9yCi0gICAqIGhpc3RvcmljYWwgcmVhc29ucywgdGhlIHdpcmUgZm9ybWF0IGRpZmZlcnMgZnJvbSBub3JtYWwgZmllbGRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUxhenlGaWVsZE1lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAotICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBMYXp5RmllbGRMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSkgKiAyCi0gICAgICAgICsgY29tcHV0ZVVJbnQzMlNpemUoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcikKLSAgICAgICAgKyBjb21wdXRlTGF6eUZpZWxkU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB0YWcuICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVUYWdTaXplKGZpbmFsIGludCBmaWVsZE51bWJlcikgewotICAgIHJldHVybiBjb21wdXRlVUludDMyU2l6ZU5vVGFnKFdpcmVGb3JtYXQubWFrZVRhZyhmaWVsZE51bWJlciwgMCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIGludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgPj0gMCkgewotICAgICAgcmV0dXJuIGNvbXB1dGVVSW50MzJTaXplTm9UYWcodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kLgotICAgICAgcmV0dXJuIE1BWF9WQVJJTlRfU0laRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSB1aW50MzJ9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICBpZiAoKHZhbHVlICYgKH4wIDw8ICA3KSkgPT0gMCkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICAgIGlmICgodmFsdWUgJiAofjAgPDwgMTQpKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gMjsKLSAgICB9Ci0gICAgaWYgKCh2YWx1ZSAmICh+MCA8PCAyMSkpID09IDApIHsKLSAgICAgIHJldHVybiAzOwotICAgIH0KLSAgICBpZiAoKHZhbHVlICYgKH4wIDw8IDI4KSkgPT0gMCkgewotICAgICAgcmV0dXJuIDQ7Ci0gICAgfQotICAgIHJldHVybiA1OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIHNpbnQzMn0gZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVUludDMyU2l6ZU5vVGFnKGVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBmaXhlZDMyfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBpbnQgdW51c2VkKSB7Ci0gICAgcmV0dXJuIEZJWEVEXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBpbnQgdW51c2VkKSB7Ci0gICAgcmV0dXJuIEZJWEVEXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUludDY0U2l6ZU5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSB1aW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhsb25nIHZhbHVlKSB7Ci0gICAgLy8gaGFuZGxlIHR3byBwb3B1bGFyIHNwZWNpYWwgY2FzZXMgdXAgZnJvbnQgLi4uCi0gICAgaWYgKCh2YWx1ZSAmICh+MEwgPDwgNykpID09IDBMKSB7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gICAgaWYgKHZhbHVlIDwgMEwpIHsKLSAgICAgIHJldHVybiAxMDsKLSAgICB9Ci0gICAgLy8gLi4uIGxlYXZpbmcgdXMgd2l0aCA4IHJlbWFpbmluZywgd2hpY2ggd2UgY2FuIGRpdmlkZSBhbmQgY29ucXVlcgotICAgIGludCBuID0gMjsKLSAgICBpZiAoKHZhbHVlICYgKH4wTCA8PCAzNSkpICE9IDBMKSB7Ci0gICAgICBuICs9IDQ7IHZhbHVlID4+Pj0gMjg7Ci0gICAgfQotICAgIGlmICgodmFsdWUgJiAofjBMIDw8IDIxKSkgIT0gMEwpIHsKLSAgICAgIG4gKz0gMjsgdmFsdWUgPj4+PSAxNDsKLSAgICB9Ci0gICAgaWYgKCh2YWx1ZSAmICh+MEwgPDwgMTQpKSAhPSAwTCkgewotICAgICAgbiArPSAxOwotICAgIH0KLSAgICByZXR1cm4gbjsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIHtAY29kZSBzaW50NjR9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVVSW50NjRTaXplTm9UYWcoZW5jb2RlWmlnWmFnNjQodmFsdWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIGZpbmFsIGxvbmcgdW51c2VkKSB7Ci0gICAgcmV0dXJuIEZJWEVEXzY0X1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkNjR9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBsb25nIHVudXNlZCkgewotICAgIHJldHVybiBGSVhFRF82NF9TSVpFOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZmxvYXR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZsb2F0U2l6ZU5vVGFnKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBmbG9hdCB1bnVzZWQpIHsKLSAgICByZXR1cm4gRklYRURfMzJfU0laRTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGRvdWJsZX0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRG91YmxlU2l6ZU5vVGFnKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBkb3VibGUgdW51c2VkKSB7Ci0gICAgcmV0dXJuIEZJWEVEXzY0X1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBib29sfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCb29sU2l6ZU5vVGFnKEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBmaW5hbCBib29sZWFuIHVudXNlZCkgewotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4gZW51bSBmaWVsZC4KLSAgICogVGhlIHByb3ZpZGVkIHZhbHVlIGlzIHRoZSBudW1lcmljIHZhbHVlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBlbnVtIHZhbHVlIG9uIHRoZSB3aXJlCi0gICAqIChub3QgdGhlIGVudW0gb3JkaW5hbCB2YWx1ZSkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRW51bVNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIHN0cmluZ30gZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgIGludCBsZW5ndGg7Ci0gICAgdHJ5IHsKLSAgICAgIGxlbmd0aCA9IFV0ZjguZW5jb2RlZExlbmd0aCh2YWx1ZSk7Ci0gICAgfSBjYXRjaCAoVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24gZSkgewotICAgICAgLy8gVE9ETyhkd2Vpcyk6IENvbnNpZGVyIHVzaW5nIG5pbyBDaGFyc2V0IG1ldGhvZHMgaW5zdGVhZC4KLSAgICAgIGZpbmFsIGJ5dGVbXSBieXRlcyA9IHZhbHVlLmdldEJ5dGVzKEludGVybmFsLlVURl84KTsKLSAgICAgIGxlbmd0aCA9IGJ5dGVzLmxlbmd0aDsKLSAgICB9Ci0KLSAgICByZXR1cm4gY29tcHV0ZUxlbmd0aERlbGltaXRlZEZpZWxkU2l6ZShsZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4gZW1iZWRkZWQKLSAgICogbWVzc2FnZSBzdG9yZWQgaW4gbGF6eSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVMYXp5RmllbGRTaXplTm9UYWcoZmluYWwgTGF6eUZpZWxkTGl0ZSB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlTGVuZ3RoRGVsaW1pdGVkRmllbGRTaXplKHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgYnl0ZXN9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZUxlbmd0aERlbGltaXRlZEZpZWxkU2l6ZSh2YWx1ZS5zaXplKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgYnl0ZXN9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJ5dGVBcnJheVNpemVOb1RhZyhmaW5hbCBieXRlW10gdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZUxlbmd0aERlbGltaXRlZEZpZWxkU2l6ZSh2YWx1ZS5sZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgYnl0ZXN9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJ5dGVCdWZmZXJTaXplTm9UYWcoZmluYWwgQnl0ZUJ1ZmZlciB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlTGVuZ3RoRGVsaW1pdGVkRmllbGRTaXplKHZhbHVlLmNhcGFjaXR5KCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4gZW1iZWRkZWQKLSAgICogbWVzc2FnZSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVNZXNzYWdlU2l6ZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVMZW5ndGhEZWxpbWl0ZWRGaWVsZFNpemUodmFsdWUuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgY29tcHV0ZUxlbmd0aERlbGltaXRlZEZpZWxkU2l6ZShpbnQgZmllbGRMZW5ndGgpIHsKLSAgICByZXR1cm4gY29tcHV0ZVVJbnQzMlNpemVOb1RhZyhmaWVsZExlbmd0aCkgKyBmaWVsZExlbmd0aDsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgYSBaaWdaYWctZW5jb2RlZCAzMi1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKLSAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCi0gICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLSAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLSAgICoKLSAgICogQHBhcmFtIG4gQSBzaWduZWQgMzItYml0IGludGVnZXIuCi0gICAqIEByZXR1cm4gQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQotICAgKiAgICAgICAgIEphdmEgaGFzIG5vIGV4cGxpY2l0IHVuc2lnbmVkIHN1cHBvcnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBlbmNvZGVaaWdaYWczMihmaW5hbCBpbnQgbikgewotICAgIC8vIE5vdGU6ICB0aGUgcmlnaHQtc2hpZnQgbXVzdCBiZSBhcml0aG1ldGljCi0gICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZSBhIFppZ1phZy1lbmNvZGVkIDY0LWJpdCB2YWx1ZS4gIFppZ1phZyBlbmNvZGVzIHNpZ25lZCBpbnRlZ2VycwotICAgKiBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwKLSAgICogbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLAotICAgKiB0aHVzIGFsd2F5cyB0YWtpbmcgMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQotICAgKgotICAgKiBAcGFyYW0gbiBBIHNpZ25lZCA2NC1iaXQgaW50ZWdlci4KLSAgICogQHJldHVybiBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciwgc3RvcmVkIGluIGEgc2lnbmVkIGludCBiZWNhdXNlCi0gICAqICAgICAgICAgSmF2YSBoYXMgbm8gZXhwbGljaXQgdW5zaWduZWQgc3VwcG9ydC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBlbmNvZGVaaWdaYWc2NChmaW5hbCBsb25nIG4pIHsKLSAgICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYwotICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDYzKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqCi0gICAqIEZsdXNoZXMgdGhlIHN0cmVhbSBhbmQgZm9yY2VzIGFueSBidWZmZXJlZCBieXRlcyB0byBiZSB3cml0dGVuLiAgVGhpcwotICAgKiBkb2VzIG5vdCBmbHVzaCB0aGUgdW5kZXJseWluZyBPdXRwdXRTdHJlYW0uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKioKLSAgICogSWYgd3JpdGluZyB0byBhIGZsYXQgYXJyYXksIHJldHVybiB0aGUgc3BhY2UgbGVmdCBpbiB0aGUgYXJyYXkuCi0gICAqIE90aGVyd2lzZSwgdGhyb3dzIHtAY29kZSBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgaW50IHNwYWNlTGVmdCgpOwotCi0gIC8qKgotICAgKiBWZXJpZmllcyB0aGF0IHtAbGluayAjc3BhY2VMZWZ0KCl9IHJldHVybnMgemVyby4gIEl0J3MgY29tbW9uIHRvIGNyZWF0ZQotICAgKiBhIGJ5dGUgYXJyYXkgdGhhdCBpcyBleGFjdGx5IGJpZyBlbm91Z2ggdG8gaG9sZCBhIG1lc3NhZ2UsIHRoZW4gd3JpdGUgdG8KLSAgICogaXQgd2l0aCBhIHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0uICBDYWxsaW5nIHtAY29kZSBjaGVja05vU3BhY2VMZWZ0KCl9Ci0gICAqIGFmdGVyIHdyaXRpbmcgdmVyaWZpZXMgdGhhdCB0aGUgbWVzc2FnZSB3YXMgYWN0dWFsbHkgYXMgYmlnIGFzIGV4cGVjdGVkLAotICAgKiB3aGljaCBjYW4gaGVscCBjYXRjaCBidWdzLgotICAgKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgY2hlY2tOb1NwYWNlTGVmdCgpIHsKLSAgICBpZiAoc3BhY2VMZWZ0KCkgIT0gMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiRGlkIG5vdCB3cml0ZSBhcyBtdWNoIGRhdGEgYXMgZXhwZWN0ZWQuIik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIElmIHlvdSBjcmVhdGUgYSBDb2RlZE91dHB1dFN0cmVhbSBhcm91bmQgYSBzaW1wbGUgZmxhdCBhcnJheSwgeW91IG11c3QKLSAgICogbm90IGF0dGVtcHQgdG8gd3JpdGUgbW9yZSBieXRlcyB0aGFuIHRoZSBhcnJheSBoYXMgc3BhY2UuICBPdGhlcndpc2UsCi0gICAqIHRoaXMgZXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBPdXRPZlNwYWNlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC02OTQ3NDg2ODg2OTk3ODg5NDk5TDsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBNRVNTQUdFID0KLSAgICAgICAgIkNvZGVkT3V0cHV0U3RyZWFtIHdhcyB3cml0aW5nIHRvIGEgZmxhdCBieXRlIGFycmF5IGFuZCByYW4gb3V0IG9mIHNwYWNlLiI7Ci0KLSAgICBPdXRPZlNwYWNlRXhjZXB0aW9uKCkgewotICAgICAgc3VwZXIoTUVTU0FHRSk7Ci0gICAgfQotCi0gICAgT3V0T2ZTcGFjZUV4Y2VwdGlvbihUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgIHN1cGVyKE1FU1NBR0UsIGNhdXNlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgc3VjY2Vzc2Z1bGx5IHdyaXR0ZW4gdG8gdGhpcyBzdHJlYW0uICBUaGUKLSAgICogcmV0dXJuZWQgdmFsdWUgaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgYWNjdXJhdGUgaWYgZXhjZXB0aW9ucyBoYXZlIGJlZW4KLSAgICogZm91bmQgaW4gdGhlIG1pZGRsZSBvZiB3cml0aW5nLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IGludCBnZXRUb3RhbEJ5dGVzV3JpdHRlbigpOwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCB0byB0aGUgc3RyZWFtLiBWaXNpYmxlIGZvciB0ZXN0aW5nLiAqLwotICBhYnN0cmFjdCB2b2lkIHdyaXRlQnl0ZUFycmF5Tm9UYWcoZmluYWwgYnl0ZVtdIHZhbHVlLCBmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIGZpbmFsIHZvaWQgaW5lZmZpY2llbnRXcml0ZVN0cmluZ05vVGFnKFN0cmluZyB2YWx1ZSwgVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24gY2F1c2UpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGxvZ2dlci5sb2coTGV2ZWwuV0FSTklORywKLSAgICAgICAgIkNvbnZlcnRpbmcgaWxsLWZvcm1lZCBVVEYtMTYuIFlvdXIgUHJvdG9jb2wgQnVmZmVyIHdpbGwgbm90IHJvdW5kIHRyaXAgY29ycmVjdGx5ISIsIGNhdXNlKTsKLQotICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gdGVsbCBKYXZhIHRvIGVuY29kZQotICAgIC8vIFVURi04IGRpcmVjdGx5IGludG8gb3VyIGJ1ZmZlciwgc28gd2UgaGF2ZSB0byBsZXQgaXQgY3JlYXRlIGl0cyBvd24gYnl0ZQotICAgIC8vIGFycmF5IGFuZCB0aGVuIGNvcHkuCi0gICAgLy8gVE9ETyhkd2Vpcyk6IENvbnNpZGVyIHVzaW5nIG5pbyBDaGFyc2V0IG1ldGhvZHMgaW5zdGVhZC4KLSAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSB2YWx1ZS5nZXRCeXRlcyhJbnRlcm5hbC5VVEZfOCk7Ci0gICAgdHJ5IHsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcoYnl0ZXMubGVuZ3RoKTsKLSAgICAgIHdyaXRlTGF6eShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKGUpOwotICAgIH0gY2F0Y2ggKE91dE9mU3BhY2VFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgZTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBXcml0ZSBhIHtAY29kZSBncm91cH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uCi0gICAqCi0gICAqIEBkZXByZWNhdGVkIGdyb3VwcyBhcmUgZGVwcmVjYXRlZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlR3JvdXAoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7Ci0gICAgd3JpdGVHcm91cE5vVGFnKHZhbHVlKTsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCB0byB0aGUgc3RyZWFtLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBncm91cHMgYXJlIGRlcHJlY2F0ZWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUdyb3VwTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGdyb3VwfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgZ3JvdXBzIGFyZSBkZXByZWNhdGVkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUdyb3VwU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSAqIDIgKyBjb21wdXRlR3JvdXBTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUdyb3VwU2l6ZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gIH0KLQotICAvKioKLSAgICogRW5jb2RlIGFuZCB3cml0ZSBhIHZhcmludC4gIHtAY29kZSB2YWx1ZX0gaXMgdHJlYXRlZCBhcwotICAgKiB1bnNpZ25lZCwgc28gaXQgd29uJ3QgYmUgc2lnbi1leHRlbmRlZCBpZiBuZWdhdGl2ZS4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgdXNlIHtAbGluayAjd3JpdGVVSW50MzJOb1RhZ30gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlUmF3VmFyaW50MzIoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZSBhbmQgd3JpdGUgYSB2YXJpbnQuCi0gICAqCi0gICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI3dyaXRlVUludDY0Tm9UYWd9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVJhd1ZhcmludDY0KGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVVSW50NjROb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhIHZhcmludC4KLSAgICoge0Bjb2RlIHZhbHVlfSBpcyB0cmVhdGVkIGFzIHVuc2lnbmVkLCBzbyBpdCB3b24ndCBiZSBzaWduLWV4dGVuZGVkIGlmCi0gICAqIG5lZ2F0aXZlLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNjb21wdXRlVUludDMyU2l6ZU5vVGFnKGludCl9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlUmF3VmFyaW50MzJTaXplKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEgdmFyaW50LgotICAgKgotICAgKiBAZGVwcmVjYXRlZCB1c2Uge0BsaW5rICNjb21wdXRlVUludDY0U2l6ZU5vVGFnKGxvbmcpfSBpbnN0ZWFkLgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVJhd1ZhcmludDY0U2l6ZShsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVVSW50NjRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEgbGl0dGxlLWVuZGlhbiAzMi1iaXQgaW50ZWdlci4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVXNlIHtAbGluayAjd3JpdGVGaXhlZDMyTm9UYWd9IGluc3RlYWQuCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUZpeGVkMzJOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBsaXR0bGUtZW5kaWFuIDY0LWJpdCBpbnRlZ2VyLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICN3cml0ZUZpeGVkNjROb1RhZ30gaW5zdGVhZC4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUZpeGVkNjROb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBBIHtAbGluayBDb2RlZE91dHB1dFN0cmVhbX0gdGhhdCB3cml0ZXMgZGlyZWN0bHkgdG8gYSBieXRlIGFycmF5LgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQXJyYXlFbmNvZGVyIGV4dGVuZHMgQ29kZWRPdXRwdXRTdHJlYW0gewotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGJ1ZmZlcjsKLSAgICBwcml2YXRlIGZpbmFsIGludCBvZmZzZXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbGltaXQ7Ci0gICAgcHJpdmF0ZSBpbnQgcG9zaXRpb247Ci0KLSAgICBBcnJheUVuY29kZXIoYnl0ZVtdIGJ1ZmZlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgICAgaWYgKGJ1ZmZlciA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigiYnVmZmVyIik7Ci0gICAgICB9Ci0gICAgICBpZiAoKG9mZnNldCB8IGxlbmd0aCB8IChidWZmZXIubGVuZ3RoIC0gKG9mZnNldCArIGxlbmd0aCkpKSA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgIkFycmF5IHJhbmdlIGlzIGludmFsaWQuIEJ1ZmZlci5sZW5ndGg9JWQsIG9mZnNldD0lZCwgbGVuZ3RoPSVkIiwKLSAgICAgICAgICAgIGJ1ZmZlci5sZW5ndGgsIG9mZnNldCwgbGVuZ3RoKSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgIHRoaXMub2Zmc2V0ID0gb2Zmc2V0OwotICAgICAgcG9zaXRpb24gPSBvZmZzZXQ7Ci0gICAgICBsaW1pdCA9IG9mZnNldCArIGxlbmd0aDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVRhZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB3aXJlVHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcoV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCB3aXJlVHlwZSkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlSW50MzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgICAgd3JpdGVJbnQzMk5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVJbnQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgICB3cml0ZVVJbnQzMk5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUZpeGVkMzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyKTsKLSAgICAgIHdyaXRlRml4ZWQzMk5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZVVJbnQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgICAgd3JpdGVVSW50NjROb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVGaXhlZDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQpOwotICAgICAgd3JpdGVGaXhlZDY0Tm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQm9vbChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGJvb2xlYW4gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgICAgd3JpdGUoKGJ5dGUpICh2YWx1ZSA/IDEgOiAwKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVTdHJpbmcoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICAgIHdyaXRlU3RyaW5nTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZXMoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICB3cml0ZUJ5dGVzTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZUFycmF5KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgYnl0ZVtdIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVCeXRlQXJyYXkoZmllbGROdW1iZXIsIHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZUFycmF5KAotICAgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGJ5dGVbXSB2YWx1ZSwgZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgd3JpdGVCeXRlQXJyYXlOb1RhZyh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlQnl0ZUJ1ZmZlcihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVCdWZmZXIgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUuY2FwYWNpdHkoKSk7Ci0gICAgICB3cml0ZVJhd0J5dGVzKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUJ5dGVzTm9UYWcoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUuc2l6ZSgpKTsKLSAgICAgIHZhbHVlLndyaXRlVG8odGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVCeXRlQXJyYXlOb1RhZyhmaW5hbCBieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVVJbnQzMk5vVGFnKGxlbmd0aCk7Ci0gICAgICB3cml0ZSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlUmF3Qnl0ZXMoZmluYWwgQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmICh2YWx1ZS5oYXNBcnJheSgpKSB7Ci0gICAgICAgIHdyaXRlKHZhbHVlLmFycmF5KCksIHZhbHVlLmFycmF5T2Zmc2V0KCksIHZhbHVlLmNhcGFjaXR5KCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBkdXBsaWNhdGVkID0gdmFsdWUuZHVwbGljYXRlKCk7Ci0gICAgICAgIGR1cGxpY2F0ZWQuY2xlYXIoKTsKLSAgICAgICAgd3JpdGUoZHVwbGljYXRlZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVNZXNzYWdlKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICAgIHdyaXRlTWVzc2FnZU5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7Ci0gICAgICB3cml0ZVVJbnQzMihXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKTsKLSAgICAgIHdyaXRlTWVzc2FnZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKLSAgICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlUmF3TWVzc2FnZVNldEV4dGVuc2lvbihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICAgICAgd3JpdGVVSW50MzIoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcik7Ci0gICAgICB3cml0ZUJ5dGVzKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOwotICAgICAgd3JpdGVUYWcoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVNZXNzYWdlTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVVJbnQzMk5vVGFnKHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShieXRlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gdmFsdWU7Ci0gICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24obmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJQb3M6ICVkLCBsaW1pdDogJWQsIGxlbjogJWQiLCBwb3NpdGlvbiwgbGltaXQsIDEpKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVJbnQzMk5vVGFnKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmICh2YWx1ZSA+PSAwKSB7Ci0gICAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICAgICAgd3JpdGVVSW50NjROb1RhZyh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGVVSW50MzJOb1RhZyhpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoSEFTX1VOU0FGRV9BUlJBWV9PUEVSQVRJT05TICYmIHNwYWNlTGVmdCgpID49IE1BWF9WQVJJTlRfU0laRSkgewotICAgICAgICBsb25nIHBvcyA9IEFSUkFZX0JBU0VfT0ZGU0VUICsgcG9zaXRpb247Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgaWYgKCh2YWx1ZSAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShidWZmZXIsIHBvcysrLCAoYnl0ZSkgdmFsdWUpOwotICAgICAgICAgICAgcG9zaXRpb24rKzsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVU5TQUZFLnB1dEJ5dGUoYnVmZmVyLCBwb3MrKywgKGJ5dGUpICgodmFsdWUgJiAweDdGKSB8IDB4ODApKTsKLSAgICAgICAgICAgIHBvc2l0aW9uKys7Ci0gICAgICAgICAgICB2YWx1ZSA+Pj49IDc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cnkgewotICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAoKHZhbHVlICYgfjB4N0YpID09IDApIHsKLSAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpIHZhbHVlOwotICAgICAgICAgICAgICByZXR1cm47Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICAgICAgICAgIHZhbHVlID4+Pj0gNzsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlBvczogJWQsIGxpbWl0OiAlZCwgbGVuOiAlZCIsIHBvc2l0aW9uLCBsaW1pdCwgMSkpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlRml4ZWQzMk5vVGFnKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSAodmFsdWUgJiAweEZGKTsKLSAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgodmFsdWUgPj4gOCkgJiAweEZGKTsKLSAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0gICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSAoKHZhbHVlID4+IDI0KSAmIDB4RkYpOwotICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKAotICAgICAgICAgICAgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgU3RyaW5nLmZvcm1hdCgiUG9zOiAlZCwgbGltaXQ6ICVkLCBsZW46ICVkIiwgcG9zaXRpb24sIGxpbWl0LCAxKSkpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlVUludDY0Tm9UYWcobG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChIQVNfVU5TQUZFX0FSUkFZX09QRVJBVElPTlMgJiYgc3BhY2VMZWZ0KCkgPj0gTUFYX1ZBUklOVF9TSVpFKSB7Ci0gICAgICAgIGxvbmcgcG9zID0gQVJSQVlfQkFTRV9PRkZTRVQgKyBwb3NpdGlvbjsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBpZiAoKHZhbHVlICYgfjB4N0ZMKSA9PSAwKSB7Ci0gICAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShidWZmZXIsIHBvcysrLCAoYnl0ZSkgdmFsdWUpOwotICAgICAgICAgICAgcG9zaXRpb24rKzsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVU5TQUZFLnB1dEJ5dGUoYnVmZmVyLCBwb3MrKywgKGJ5dGUpICgoKGludCkgdmFsdWUgJiAweDdGKSB8IDB4ODApKTsKLSAgICAgICAgICAgIHBvc2l0aW9uKys7Ci0gICAgICAgICAgICB2YWx1ZSA+Pj49IDc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0cnkgewotICAgICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgICBpZiAoKHZhbHVlICYgfjB4N0ZMKSA9PSAwKSB7Ci0gICAgICAgICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSB2YWx1ZTsKLSAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgoKGludCkgdmFsdWUgJiAweDdGKSB8IDB4ODApOwotICAgICAgICAgICAgICB2YWx1ZSA+Pj49IDc7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJQb3M6ICVkLCBsaW1pdDogJWQsIGxlbjogJWQiLCBwb3NpdGlvbiwgbGltaXQsIDEpKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUZpeGVkNjROb1RhZyhsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgoaW50KSAodmFsdWUpICYgMHhGRik7Ci0gICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSAoKGludCkgKHZhbHVlID4+IDgpICYgMHhGRik7Ci0gICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSAoKGludCkgKHZhbHVlID4+IDE2KSAmIDB4RkYpOwotICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKChpbnQpICh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLSAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgoaW50KSAodmFsdWUgPj4gMzIpICYgMHhGRik7Ci0gICAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSAoKGludCkgKHZhbHVlID4+IDQwKSAmIDB4RkYpOwotICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKChpbnQpICh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKLSAgICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgoaW50KSAodmFsdWUgPj4gNTYpICYgMHhGRik7Ci0gICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oCi0gICAgICAgICAgICBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJQb3M6ICVkLCBsaW1pdDogJWQsIGxlbjogJWQiLCBwb3NpdGlvbiwgbGltaXQsIDEpKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIHZvaWQgd3JpdGUoYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weSh2YWx1ZSwgb2Zmc2V0LCBidWZmZXIsIHBvc2l0aW9uLCBsZW5ndGgpOwotICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7Ci0gICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oCi0gICAgICAgICAgICBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJQb3M6ICVkLCBsaW1pdDogJWQsIGxlbjogJWQiLCBwb3NpdGlvbiwgbGltaXQsIGxlbmd0aCkpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZUxhenkoYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGUodmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgdm9pZCB3cml0ZShCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IGxlbmd0aCA9IHZhbHVlLnJlbWFpbmluZygpOwotICAgICAgdHJ5IHsKLSAgICAgICAgdmFsdWUuZ2V0KGJ1ZmZlciwgcG9zaXRpb24sIGxlbmd0aCk7Ci0gICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsKLSAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbigKLSAgICAgICAgICAgIG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIlBvczogJWQsIGxpbWl0OiAlZCwgbGVuOiAlZCIsIHBvc2l0aW9uLCBsaW1pdCwgbGVuZ3RoKSkpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlTGF6eShCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGUodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCB2b2lkIHdyaXRlU3RyaW5nTm9UYWcoU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IG9sZFBvc2l0aW9uID0gcG9zaXRpb247Ci0gICAgICB0cnkgewotICAgICAgICAvLyBVVEYtOCBieXRlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIGF0IGxlYXN0IGl0cyBVVEYtMTYgY29kZSB1bml0IGxlbmd0aCAodmFsdWUubGVuZ3RoKCkpLAotICAgICAgICAvLyBhbmQgYXQgbW9zdCAzIHRpbWVzIG9mIGl0LiBXZSB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGluIGJvdGggYnJhbmNoZXMgYmVsb3cuCi0gICAgICAgIGZpbmFsIGludCBtYXhMZW5ndGggPSB2YWx1ZS5sZW5ndGgoKSAqIFV0ZjguTUFYX0JZVEVTX1BFUl9DSEFSOwotICAgICAgICBmaW5hbCBpbnQgbWF4TGVuZ3RoVmFySW50U2l6ZSA9IGNvbXB1dGVVSW50MzJTaXplTm9UYWcobWF4TGVuZ3RoKTsKLSAgICAgICAgZmluYWwgaW50IG1pbkxlbmd0aFZhckludFNpemUgPSBjb21wdXRlVUludDMyU2l6ZU5vVGFnKHZhbHVlLmxlbmd0aCgpKTsKLSAgICAgICAgaWYgKG1pbkxlbmd0aFZhckludFNpemUgPT0gbWF4TGVuZ3RoVmFySW50U2l6ZSkgewotICAgICAgICAgIHBvc2l0aW9uID0gb2xkUG9zaXRpb24gKyBtaW5MZW5ndGhWYXJJbnRTaXplOwotICAgICAgICAgIGludCBuZXdQb3NpdGlvbiA9IFV0ZjguZW5jb2RlKHZhbHVlLCBidWZmZXIsIHBvc2l0aW9uLCBzcGFjZUxlZnQoKSk7Ci0gICAgICAgICAgLy8gU2luY2UgdGhpcyBjbGFzcyBpcyBzdGF0ZWZ1bCBhbmQgdHJhY2tzIHRoZSBwb3NpdGlvbiwgd2UgcmV3aW5kIGFuZCBzdG9yZSB0aGUgc3RhdGUsCi0gICAgICAgICAgLy8gcHJlcGVuZCB0aGUgbGVuZ3RoLCB0aGVuIHJlc2V0IGl0IGJhY2sgdG8gdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotICAgICAgICAgIHBvc2l0aW9uID0gb2xkUG9zaXRpb247Ci0gICAgICAgICAgaW50IGxlbmd0aCA9IG5ld1Bvc2l0aW9uIC0gb2xkUG9zaXRpb24gLSBtaW5MZW5ndGhWYXJJbnRTaXplOwotICAgICAgICAgIHdyaXRlVUludDMyTm9UYWcobGVuZ3RoKTsKLSAgICAgICAgICBwb3NpdGlvbiA9IG5ld1Bvc2l0aW9uOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGludCBsZW5ndGggPSBVdGY4LmVuY29kZWRMZW5ndGgodmFsdWUpOwotICAgICAgICAgIHdyaXRlVUludDMyTm9UYWcobGVuZ3RoKTsKLSAgICAgICAgICBwb3NpdGlvbiA9IFV0ZjguZW5jb2RlKHZhbHVlLCBidWZmZXIsIHBvc2l0aW9uLCBzcGFjZUxlZnQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gUm9sbCBiYWNrIHRoZSBjaGFuZ2UgLSB3ZSBmYWxsIGJhY2sgdG8gaW5lZmZpY2llbnQgcGF0aC4KLSAgICAgICAgcG9zaXRpb24gPSBvbGRQb3NpdGlvbjsKLQotICAgICAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBXZSBzaG91bGQgdGhyb3cgYW4gSU9FeGNlcHRpb24gaGVyZSBpbnN0ZWFkLgotICAgICAgICBpbmVmZmljaWVudFdyaXRlU3RyaW5nTm9UYWcodmFsdWUsIGUpOwotICAgICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgewotICAgICAgLy8gRG8gbm90aGluZy4KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgaW50IHNwYWNlTGVmdCgpIHsKLSAgICAgIHJldHVybiBsaW1pdCAtIHBvc2l0aW9uOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VG90YWxCeXRlc1dyaXR0ZW4oKSB7Ci0gICAgICByZXR1cm4gcG9zaXRpb24gLSBvZmZzZXQ7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEge0BsaW5rIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byBhIGhlYXAge0BsaW5rIEJ5dGVCdWZmZXJ9LiBXcml0ZXMgYXJlCi0gICAqIGRvbmUgZGlyZWN0bHkgdG8gdGhlIHVuZGVybHlpbmcgYXJyYXkuIFRoZSBidWZmZXIgcG9zaXRpb24gaXMgb25seSB1cGRhdGVkIGFmdGVyIGEgZmx1c2guCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOaW9IZWFwRW5jb2RlciBleHRlbmRzIEFycmF5RW5jb2RlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXI7Ci0gICAgcHJpdmF0ZSBpbnQgaW5pdGlhbFBvc2l0aW9uOwotCi0gICAgTmlvSGVhcEVuY29kZXIoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyKSB7Ci0gICAgICBzdXBlcihieXRlQnVmZmVyLmFycmF5KCksIGJ5dGVCdWZmZXIuYXJyYXlPZmZzZXQoKSArIGJ5dGVCdWZmZXIucG9zaXRpb24oKSwKLSAgICAgICAgICBieXRlQnVmZmVyLnJlbWFpbmluZygpKTsKLSAgICAgIHRoaXMuYnl0ZUJ1ZmZlciA9IGJ5dGVCdWZmZXI7Ci0gICAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IGJ5dGVCdWZmZXIucG9zaXRpb24oKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHsKLSAgICAgIC8vIFVwZGF0ZSB0aGUgcG9zaXRpb24gb24gdGhlIGJ1ZmZlci4KLSAgICAgIGJ5dGVCdWZmZXIucG9zaXRpb24oaW5pdGlhbFBvc2l0aW9uICsgZ2V0VG90YWxCeXRlc1dyaXR0ZW4oKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEge0BsaW5rIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byBhIHtAbGluayBCeXRlQnVmZmVyfS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE5pb0VuY29kZXIgZXh0ZW5kcyBDb2RlZE91dHB1dFN0cmVhbSB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIG9yaWdpbmFsQnVmZmVyOwotICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbFBvc2l0aW9uOwotCi0gICAgTmlvRW5jb2RlcihCeXRlQnVmZmVyIGJ1ZmZlcikgewotICAgICAgdGhpcy5vcmlnaW5hbEJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyLmR1cGxpY2F0ZSgpLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLSAgICAgIGluaXRpYWxQb3NpdGlvbiA9IGJ1ZmZlci5wb3NpdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVGFnKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHdpcmVUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVVSW50MzJOb1RhZyhXaXJlRm9ybWF0Lm1ha2VUYWcoZmllbGROdW1iZXIsIHdpcmVUeXBlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVJbnQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgICB3cml0ZUludDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIpOwotICAgICAgd3JpdGVGaXhlZDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVUludDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgICB3cml0ZVVJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVkNjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCk7Ci0gICAgICB3cml0ZUZpeGVkNjROb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgICB3cml0ZSgoYnl0ZSkgKHZhbHVlID8gMSA6IDApKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgd3JpdGVTdHJpbmdOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICAgIHdyaXRlQnl0ZXNOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlQXJyYXkoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBieXRlW10gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZUJ5dGVBcnJheShmaWVsZE51bWJlciwgdmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlQXJyYXkoCi0gICAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgYnl0ZVtdIHZhbHVlLCBmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICB3cml0ZUJ5dGVBcnJheU5vVGFnKHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlQnVmZmVyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgQnl0ZUJ1ZmZlciB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgd3JpdGVVSW50MzJOb1RhZyh2YWx1ZS5jYXBhY2l0eSgpKTsKLSAgICAgIHdyaXRlUmF3Qnl0ZXModmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICB3cml0ZU1lc3NhZ2VOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICAgICAgd3JpdGVVSW50MzIoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcik7Ci0gICAgICB3cml0ZU1lc3NhZ2UoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7Ci0gICAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKTsKLSAgICAgIHdyaXRlVUludDMyKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpOwotICAgICAgd3JpdGVCeXRlcyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKLSAgICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVVSW50MzJOb1RhZyh2YWx1ZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICAgIHZhbHVlLndyaXRlVG8odGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1ZmZlci5wdXQodmFsdWUpOwotICAgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzTm9UYWcoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUuc2l6ZSgpKTsKLSAgICAgIHZhbHVlLndyaXRlVG8odGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlQXJyYXlOb1RhZyhmaW5hbCBieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVVJbnQzMk5vVGFnKGxlbmd0aCk7Ci0gICAgICB3cml0ZSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZXMoZmluYWwgQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmICh2YWx1ZS5oYXNBcnJheSgpKSB7Ci0gICAgICAgIHdyaXRlKHZhbHVlLmFycmF5KCksIHZhbHVlLmFycmF5T2Zmc2V0KCksIHZhbHVlLmNhcGFjaXR5KCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQnl0ZUJ1ZmZlciBkdXBsaWNhdGVkID0gdmFsdWUuZHVwbGljYXRlKCk7Ci0gICAgICAgIGR1cGxpY2F0ZWQuY2xlYXIoKTsKLSAgICAgICAgd3JpdGUoZHVwbGljYXRlZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVJbnQzMk5vVGFnKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmICh2YWx1ZSA+PSAwKSB7Ci0gICAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICAgICAgd3JpdGVVSW50NjROb1RhZyh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVVSW50MzJOb1RhZyhpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgIGlmICgodmFsdWUgJiB+MHg3RikgPT0gMCkgewotICAgICAgICAgICAgYnVmZmVyLnB1dCgoYnl0ZSkgdmFsdWUpOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXIucHV0KChieXRlKSAoKHZhbHVlICYgMHg3RikgfCAweDgwKSk7Ci0gICAgICAgICAgICB2YWx1ZSA+Pj49IDc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGNhdGNoIChCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQzMk5vVGFnKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1ZmZlci5wdXRJbnQodmFsdWUpOwotICAgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVVJbnQ2NE5vVGFnKGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgIGlmICgodmFsdWUgJiB+MHg3RkwpID09IDApIHsKLSAgICAgICAgICAgIGJ1ZmZlci5wdXQoKGJ5dGUpIHZhbHVlKTsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVmZmVyLnB1dCgoYnl0ZSkgKCgoaW50KSB2YWx1ZSAmIDB4N0YpIHwgMHg4MCkpOwotICAgICAgICAgICAgdmFsdWUgPj4+PSA3OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVkNjROb1RhZyhsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgYnVmZmVyLnB1dExvbmcodmFsdWUpOwotICAgICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBidWZmZXIucHV0KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oZSk7Ci0gICAgICB9IGNhdGNoIChCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTGF6eShieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKEJ5dGVCdWZmZXIgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBidWZmZXIucHV0KHZhbHVlKTsKLSAgICAgIH0gY2F0Y2ggKEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVMYXp5KEJ5dGVCdWZmZXIgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmdOb1RhZyhTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBpbnQgc3RhcnRQb3MgPSBidWZmZXIucG9zaXRpb24oKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIFVURi04IGJ5dGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgYXQgbGVhc3QgaXRzIFVURi0xNiBjb2RlIHVuaXQgbGVuZ3RoICh2YWx1ZS5sZW5ndGgoKSksCi0gICAgICAgIC8vIGFuZCBhdCBtb3N0IDMgdGltZXMgb2YgaXQuIFdlIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgaW4gYm90aCBicmFuY2hlcyBiZWxvdy4KLSAgICAgICAgZmluYWwgaW50IG1heEVuY29kZWRTaXplID0gdmFsdWUubGVuZ3RoKCkgKiBVdGY4Lk1BWF9CWVRFU19QRVJfQ0hBUjsKLSAgICAgICAgZmluYWwgaW50IG1heExlbmd0aFZhckludFNpemUgPSBjb21wdXRlVUludDMyU2l6ZU5vVGFnKG1heEVuY29kZWRTaXplKTsKLSAgICAgICAgZmluYWwgaW50IG1pbkxlbmd0aFZhckludFNpemUgPSBjb21wdXRlVUludDMyU2l6ZU5vVGFnKHZhbHVlLmxlbmd0aCgpKTsKLSAgICAgICAgaWYgKG1pbkxlbmd0aFZhckludFNpemUgPT0gbWF4TGVuZ3RoVmFySW50U2l6ZSkgewotICAgICAgICAgIC8vIFNhdmUgdGhlIGN1cnJlbnQgcG9zaXRpb24gYW5kIGluY3JlbWVudCBwYXN0IHRoZSBsZW5ndGggZmllbGQuIFdlJ2xsIGNvbWUgYmFjawotICAgICAgICAgIC8vIGFuZCB3cml0ZSB0aGUgbGVuZ3RoIGZpZWxkIGFmdGVyIHRoZSBlbmNvZGluZyBpcyBjb21wbGV0ZS4KLSAgICAgICAgICBmaW5hbCBpbnQgc3RhcnRPZkJ5dGVzID0gYnVmZmVyLnBvc2l0aW9uKCkgKyBtaW5MZW5ndGhWYXJJbnRTaXplOwotICAgICAgICAgIGJ1ZmZlci5wb3NpdGlvbihzdGFydE9mQnl0ZXMpOwotCi0gICAgICAgICAgLy8gRW5jb2RlIHRoZSBzdHJpbmcuCi0gICAgICAgICAgZW5jb2RlKHZhbHVlKTsKLQotICAgICAgICAgIC8vIE5vdyBnbyBiYWNrIHRvIHRoZSBiZWdpbm5pbmcgYW5kIHdyaXRlIHRoZSBsZW5ndGguCi0gICAgICAgICAgaW50IGVuZE9mQnl0ZXMgPSBidWZmZXIucG9zaXRpb24oKTsKLSAgICAgICAgICBidWZmZXIucG9zaXRpb24oc3RhcnRQb3MpOwotICAgICAgICAgIHdyaXRlVUludDMyTm9UYWcoZW5kT2ZCeXRlcyAtIHN0YXJ0T2ZCeXRlcyk7Ci0KLSAgICAgICAgICAvLyBSZXBvc2l0aW9uIHRoZSBidWZmZXIgcGFzdCB0aGUgd3JpdHRlbiBkYXRhLgotICAgICAgICAgIGJ1ZmZlci5wb3NpdGlvbihlbmRPZkJ5dGVzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gVXRmOC5lbmNvZGVkTGVuZ3RoKHZhbHVlKTsKLSAgICAgICAgICB3cml0ZVVJbnQzMk5vVGFnKGxlbmd0aCk7Ci0gICAgICAgICAgZW5jb2RlKHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBSb2xsIGJhY2sgdGhlIGNoYW5nZSBhbmQgY29udmVydCB0byBhbiBJT0V4Y2VwdGlvbi4KLSAgICAgICAgYnVmZmVyLnBvc2l0aW9uKHN0YXJ0UG9zKTsKLQotICAgICAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBXZSBzaG91bGQgdGhyb3cgYW4gSU9FeGNlcHRpb24gaGVyZSBpbnN0ZWFkLgotICAgICAgICBpbmVmZmljaWVudFdyaXRlU3RyaW5nTm9UYWcodmFsdWUsIGUpOwotICAgICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gVGhyb3duIGJ5IGJ1ZmZlci5wb3NpdGlvbigpIGlmIG91dCBvZiByYW5nZS4KLSAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZmx1c2goKSB7Ci0gICAgICAvLyBVcGRhdGUgdGhlIHBvc2l0aW9uIG9mIHRoZSBvcmlnaW5hbCBidWZmZXIuCi0gICAgICBvcmlnaW5hbEJ1ZmZlci5wb3NpdGlvbihidWZmZXIucG9zaXRpb24oKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzcGFjZUxlZnQoKSB7Ci0gICAgICByZXR1cm4gYnVmZmVyLnJlbWFpbmluZygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0VG90YWxCeXRlc1dyaXR0ZW4oKSB7Ci0gICAgICByZXR1cm4gYnVmZmVyLnBvc2l0aW9uKCkgLSBpbml0aWFsUG9zaXRpb247Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuY29kZShTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBVdGY4LmVuY29kZVV0ZjgodmFsdWUsIGJ1ZmZlcik7Ci0gICAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIGJ1ZmZlcmVkIGVuY29kZXJzLgotICAgKi8KLSAgcHJpdmF0ZSBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQWJzdHJhY3RCdWZmZXJlZEVuY29kZXIgZXh0ZW5kcyBDb2RlZE91dHB1dFN0cmVhbSB7Ci0gICAgZmluYWwgYnl0ZVtdIGJ1ZmZlcjsKLSAgICBmaW5hbCBpbnQgbGltaXQ7Ci0gICAgaW50IHBvc2l0aW9uOwotICAgIGludCB0b3RhbEJ5dGVzV3JpdHRlbjsKLQotICAgIEFic3RyYWN0QnVmZmVyZWRFbmNvZGVyKGludCBidWZmZXJTaXplKSB7Ci0gICAgICBpZiAoYnVmZmVyU2l6ZSA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiYnVmZmVyU2l6ZSBtdXN0IGJlID49IDAiKTsKLSAgICAgIH0KLSAgICAgIC8vIEFzIGFuIG9wdGltaXphdGlvbiwgd2UgcmVxdWlyZSB0aGF0IHRoZSBidWZmZXIgYmUgYWJsZSB0byBzdG9yZSBhdCBsZWFzdCAyCi0gICAgICAvLyB2YXJpbnRzIHNvIHRoYXQgd2UgY2FuIGJ1ZmZlciBhbnkgaW50ZWdlciB3cml0ZSAodGFnICsgdmFsdWUpLiBUaGlzIHJlZHVjZXMgdGhlCi0gICAgICAvLyBudW1iZXIgb2YgcmFuZ2UgY2hlY2tzIGZvciBhIHNpbmdsZSB3cml0ZSB0byAxIChpLmUuIGlmIHRoZXJlIGlzIG5vdCBlbm91Z2ggc3BhY2UKLSAgICAgIC8vIHRvIGJ1ZmZlciB0aGUgdGFnK3ZhbHVlLCBmbHVzaCBhbmQgdGhlbiBidWZmZXIgaXQpLgotICAgICAgdGhpcy5idWZmZXIgPSBuZXcgYnl0ZVttYXgoYnVmZmVyU2l6ZSwgTUFYX1ZBUklOVF9TSVpFICogMildOwotICAgICAgdGhpcy5saW1pdCA9IGJ1ZmZlci5sZW5ndGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIGludCBzcGFjZUxlZnQoKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgInNwYWNlTGVmdCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBDb2RlZE91dHB1dFN0cmVhbXMgdGhhdCBhcmUgIgotICAgICAgICAgICAgICArICJ3cml0aW5nIHRvIGEgZmxhdCBhcnJheSBvciBCeXRlQnVmZmVyLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBpbnQgZ2V0VG90YWxCeXRlc1dyaXR0ZW4oKSB7Ci0gICAgICByZXR1cm4gdG90YWxCeXRlc1dyaXR0ZW47Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIGFycmF5LiBDaGVja2luZyBhcnJheSBib3VuZHMgaXMgdGhlCi0gICAgICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlci4KLSAgICAgKi8KLSAgICBmaW5hbCB2b2lkIGJ1ZmZlcihieXRlIHZhbHVlKSB7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSB2YWx1ZTsKLSAgICAgIHRvdGFsQnl0ZXNXcml0dGVuKys7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIGFycmF5LiBDaGVja2luZyBhcnJheSBib3VuZHMgaXMgdGhlCi0gICAgICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlci4KLSAgICAgKi8KLSAgICBmaW5hbCB2b2lkIGJ1ZmZlclRhZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB3aXJlVHlwZSkgewotICAgICAgYnVmZmVyVUludDMyTm9UYWcoV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCB3aXJlVHlwZSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gYm91bmRzIGNoZWNraW5nIG9uIHRoZSBhcnJheS4gQ2hlY2tpbmcgYXJyYXkgYm91bmRzIGlzIHRoZQotICAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIuCi0gICAgICovCi0gICAgZmluYWwgdm9pZCBidWZmZXJJbnQzMk5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgICAgaWYgKHZhbHVlID49IDApIHsKLSAgICAgICAgYnVmZmVyVUludDMyTm9UYWcodmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICAgICAgYnVmZmVyVUludDY0Tm9UYWcodmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gYm91bmRzIGNoZWNraW5nIG9uIHRoZSBhcnJheS4gQ2hlY2tpbmcgYXJyYXkgYm91bmRzIGlzIHRoZQotICAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIuCi0gICAgICovCi0gICAgZmluYWwgdm9pZCBidWZmZXJVSW50MzJOb1RhZyhpbnQgdmFsdWUpIHsKLSAgICAgIGlmIChIQVNfVU5TQUZFX0FSUkFZX09QRVJBVElPTlMpIHsKLSAgICAgICAgZmluYWwgbG9uZyBvcmlnaW5hbFBvcyA9IEFSUkFZX0JBU0VfT0ZGU0VUICsgcG9zaXRpb247Ci0gICAgICAgIGxvbmcgcG9zID0gb3JpZ2luYWxQb3M7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgaWYgKCh2YWx1ZSAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShidWZmZXIsIHBvcysrLCAoYnl0ZSkgdmFsdWUpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKGJ1ZmZlciwgcG9zKyssIChieXRlKSAoKHZhbHVlICYgMHg3RikgfCAweDgwKSk7Ci0gICAgICAgICAgICB2YWx1ZSA+Pj49IDc7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGludCBkZWx0YSA9IChpbnQpIChwb3MgLSBvcmlnaW5hbFBvcyk7Ci0gICAgICAgIHBvc2l0aW9uICs9IGRlbHRhOwotICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSBkZWx0YTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgaWYgKCh2YWx1ZSAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgdmFsdWU7Ci0gICAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbisrOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCh2YWx1ZSAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbisrOwotICAgICAgICAgICAgdmFsdWUgPj4+PSA3OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gYm91bmRzIGNoZWNraW5nIG9uIHRoZSBhcnJheS4gQ2hlY2tpbmcgYXJyYXkgYm91bmRzIGlzIHRoZQotICAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIuCi0gICAgICovCi0gICAgZmluYWwgdm9pZCBidWZmZXJVSW50NjROb1RhZyhsb25nIHZhbHVlKSB7Ci0gICAgICBpZiAoSEFTX1VOU0FGRV9BUlJBWV9PUEVSQVRJT05TKSB7Ci0gICAgICAgIGZpbmFsIGxvbmcgb3JpZ2luYWxQb3MgPSBBUlJBWV9CQVNFX09GRlNFVCArIHBvc2l0aW9uOwotICAgICAgICBsb25nIHBvcyA9IG9yaWdpbmFsUG9zOwotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgIGlmICgodmFsdWUgJiB+MHg3RkwpID09IDApIHsKLSAgICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKGJ1ZmZlciwgcG9zKyssIChieXRlKSB2YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgVU5TQUZFLnB1dEJ5dGUoYnVmZmVyLCBwb3MrKywgKGJ5dGUpICgoKGludCkgdmFsdWUgJiAweDdGKSB8IDB4ODApKTsKLSAgICAgICAgICAgIHZhbHVlID4+Pj0gNzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGRlbHRhID0gKGludCkgKHBvcyAtIG9yaWdpbmFsUG9zKTsKLSAgICAgICAgcG9zaXRpb24gKz0gZGVsdGE7Ci0gICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IGRlbHRhOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICBpZiAoKHZhbHVlICYgfjB4N0ZMKSA9PSAwKSB7Ci0gICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgdmFsdWU7Ci0gICAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbisrOwotICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCgoaW50KSB2YWx1ZSAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbisrOwotICAgICAgICAgICAgdmFsdWUgPj4+PSA3OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGRvZXMgbm90IHBlcmZvcm0gYm91bmRzIGNoZWNraW5nIG9uIHRoZSBhcnJheS4gQ2hlY2tpbmcgYXJyYXkgYm91bmRzIGlzIHRoZQotICAgICAqIHJlc3BvbnNpYmlsaXR5IG9mIHRoZSBjYWxsZXIuCi0gICAgICovCi0gICAgZmluYWwgdm9pZCBidWZmZXJGaXhlZDMyTm9UYWcoaW50IHZhbHVlKSB7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKHZhbHVlICYgMHhGRik7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLSAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IEZJWEVEXzMyX1NJWkU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgZG9lcyBub3QgcGVyZm9ybSBib3VuZHMgY2hlY2tpbmcgb24gdGhlIGFycmF5LiBDaGVja2luZyBhcnJheSBib3VuZHMgaXMgdGhlCi0gICAgICogcmVzcG9uc2liaWxpdHkgb2YgdGhlIGNhbGxlci4KLSAgICAgKi8KLSAgICBmaW5hbCB2b2lkIGJ1ZmZlckZpeGVkNjROb1RhZyhsb25nIHZhbHVlKSB7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKHZhbHVlICYgMHhGRik7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLSAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSAoKGludCkgKHZhbHVlID4+IDMyKSAmIDB4RkYpOwotICAgICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gKGJ5dGUpICgoaW50KSAodmFsdWUgPj4gNDApICYgMHhGRik7Ci0gICAgICBidWZmZXJbcG9zaXRpb24rK10gPSAoYnl0ZSkgKChpbnQpICh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKLSAgICAgIGJ1ZmZlcltwb3NpdGlvbisrXSA9IChieXRlKSAoKGludCkgKHZhbHVlID4+IDU2KSAmIDB4RkYpOwotICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gRklYRURfNjRfU0laRTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSB7QGxpbmsgQ29kZWRPdXRwdXRTdHJlYW19IHRoYXQgZGVjb3JhdGVzIGEge0BsaW5rIEJ5dGVPdXRwdXR9LiBJdCBpbnRlcm5hbCBidWZmZXIgb25seSB0bwotICAgKiBzdXBwb3J0IHN0cmluZyBlbmNvZGluZyBvcGVyYXRpb25zLiBBbGwgb3RoZXIgd3JpdGVzIGFyZSBqdXN0IHBhc3NlZCB0aHJvdWdoIHRvIHRoZQotICAgKiB7QGxpbmsgQnl0ZU91dHB1dH0uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBCeXRlT3V0cHV0RW5jb2RlciBleHRlbmRzIEFic3RyYWN0QnVmZmVyZWRFbmNvZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIEJ5dGVPdXRwdXQgb3V0OwotCi0gICAgQnl0ZU91dHB1dEVuY29kZXIoQnl0ZU91dHB1dCBvdXQsIGludCBidWZmZXJTaXplKSB7Ci0gICAgICBzdXBlcihidWZmZXJTaXplKTsKLSAgICAgIGlmIChvdXQgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oIm91dCIpOwotICAgICAgfQotICAgICAgdGhpcy5vdXQgPSBvdXQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVUYWcoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgd2lyZVR5cGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVVJbnQzMk5vVGFnKFdpcmVGb3JtYXQubWFrZVRhZyhmaWVsZE51bWJlciwgd2lyZVR5cGUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUgKiAyKTsKLSAgICAgIGJ1ZmZlclRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgICAgYnVmZmVySW50MzJOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVVSW50MzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmbHVzaElmTm90QXZhaWxhYmxlKE1BWF9WQVJJTlRfU0laRSAqIDIpOwotICAgICAgYnVmZmVyVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgICBidWZmZXJVSW50MzJOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUgKyBGSVhFRF8zMl9TSVpFKTsKLSAgICAgIGJ1ZmZlclRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyKTsKLSAgICAgIGJ1ZmZlckZpeGVkMzJOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVVSW50NjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUgKiAyKTsKLSAgICAgIGJ1ZmZlclRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgICAgYnVmZmVyVUludDY0Tm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmbHVzaElmTm90QXZhaWxhYmxlKE1BWF9WQVJJTlRfU0laRSArIEZJWEVEXzY0X1NJWkUpOwotICAgICAgYnVmZmVyVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQpOwotICAgICAgYnVmZmVyRml4ZWQ2NE5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUgKyAxKTsKLSAgICAgIGJ1ZmZlclRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgICAgYnVmZmVyKChieXRlKSAodmFsdWUgPyAxIDogMCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICB3cml0ZVN0cmluZ05vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVzKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgd3JpdGVCeXRlc05vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVBcnJheShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGJ5dGVbXSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlQnl0ZUFycmF5KGZpZWxkTnVtYmVyLCB2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVBcnJheSgKLSAgICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBieXRlW10gdmFsdWUsIGZpbmFsIGludCBvZmZzZXQsIGZpbmFsIGludCBsZW5ndGgpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICAgIHdyaXRlQnl0ZUFycmF5Tm9UYWcodmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVCdWZmZXIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlQnVmZmVyIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICB3cml0ZVVJbnQzMk5vVGFnKHZhbHVlLmNhcGFjaXR5KCkpOwotICAgICAgd3JpdGVSYXdCeXRlcyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlc05vVGFnKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVVJbnQzMk5vVGFnKHZhbHVlLnNpemUoKSk7Ci0gICAgICB2YWx1ZS53cml0ZVRvKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZUFycmF5Tm9UYWcoZmluYWwgYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVVSW50MzJOb1RhZyhsZW5ndGgpOwotICAgICAgd3JpdGUodmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIEJ5dGVCdWZmZXIgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAodmFsdWUuaGFzQXJyYXkoKSkgewotICAgICAgICB3cml0ZSh2YWx1ZS5hcnJheSgpLCB2YWx1ZS5hcnJheU9mZnNldCgpLCB2YWx1ZS5jYXBhY2l0eSgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEJ5dGVCdWZmZXIgZHVwbGljYXRlZCA9IHZhbHVlLmR1cGxpY2F0ZSgpOwotICAgICAgICBkdXBsaWNhdGVkLmNsZWFyKCk7Ci0gICAgICAgIHdyaXRlKGR1cGxpY2F0ZWQpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICB3cml0ZU1lc3NhZ2VOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICAgICAgd3JpdGVVSW50MzIoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcik7Ci0gICAgICB3cml0ZU1lc3NhZ2UoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7Ci0gICAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb24oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKTsKLSAgICAgIHdyaXRlVUludDMyKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpOwotICAgICAgd3JpdGVCeXRlcyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKLSAgICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVVSW50MzJOb1RhZyh2YWx1ZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICAgIHZhbHVlLndyaXRlVG8odGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChwb3NpdGlvbiA9PSBsaW1pdCkgewotICAgICAgICBkb0ZsdXNoKCk7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlcih2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVJbnQzMk5vVGFnKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmICh2YWx1ZSA+PSAwKSB7Ci0gICAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICAgICAgd3JpdGVVSW50NjROb1RhZyh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVVSW50MzJOb1RhZyhpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmbHVzaElmTm90QXZhaWxhYmxlKE1BWF9WQVJJTlRfU0laRSk7Ci0gICAgICBidWZmZXJVSW50MzJOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShGSVhFRF8zMl9TSVpFKTsKLSAgICAgIGJ1ZmZlckZpeGVkMzJOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVVSW50NjROb1RhZyhsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUpOwotICAgICAgYnVmZmVyVUludDY0Tm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmbHVzaElmTm90QXZhaWxhYmxlKEZJWEVEXzY0X1NJWkUpOwotICAgICAgYnVmZmVyRml4ZWQ2NE5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZ05vVGFnKFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIFVURi04IGJ5dGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgaXMgYXQgbGVhc3QgaXRzIFVURi0xNiBjb2RlIHVuaXQgbGVuZ3RoICh2YWx1ZS5sZW5ndGgoKSksCi0gICAgICAvLyBhbmQgYXQgbW9zdCAzIHRpbWVzIG9mIGl0LiBXZSB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGluIGJvdGggYnJhbmNoZXMgYmVsb3cuCi0gICAgICBmaW5hbCBpbnQgbWF4TGVuZ3RoID0gdmFsdWUubGVuZ3RoKCkgKiBVdGY4Lk1BWF9CWVRFU19QRVJfQ0hBUjsKLSAgICAgIGZpbmFsIGludCBtYXhMZW5ndGhWYXJJbnRTaXplID0gY29tcHV0ZVVJbnQzMlNpemVOb1RhZyhtYXhMZW5ndGgpOwotCi0gICAgICAvLyBJZiB3ZSBhcmUgc3RyZWFtaW5nIGFuZCB0aGUgcG90ZW50aWFsIGxlbmd0aCBpcyB0b28gYmlnIHRvIGZpdCBpbiBvdXIgYnVmZmVyLCB3ZSB0YWtlIHRoZQotICAgICAgLy8gc2xvd2VyIHBhdGguCi0gICAgICBpZiAobWF4TGVuZ3RoVmFySW50U2l6ZSArIG1heExlbmd0aCA+IGxpbWl0KSB7Ci0gICAgICAgIC8vIEFsbG9jYXRlIGEgYnl0ZVtdIHRoYXQgd2Uga25vdyBjYW4gZml0IHRoZSBzdHJpbmcgYW5kIGVuY29kZSBpbnRvIGl0LiBTdHJpbmcuZ2V0Qnl0ZXMoKQotICAgICAgICAvLyBkb2VzIHRoZSBzYW1lIGludGVybmFsbHkgYW5kIHRoZW4gZG9lcyAqYW5vdGhlciBjb3B5KiB0byByZXR1cm4gYSBieXRlW10gb2YgZXhhY3RseSB0aGUKLSAgICAgICAgLy8gcmlnaHQgc2l6ZS4gV2UgY2FuIHNraXAgdGhhdCBjb3B5IGFuZCBqdXN0IHdyaXRlUmF3Qnl0ZXMgdXAgdG8gdGhlIGFjdHVhbExlbmd0aCBvZiB0aGUKLSAgICAgICAgLy8gVVRGLTggZW5jb2RlZCBieXRlcy4KLSAgICAgICAgZmluYWwgYnl0ZVtdIGVuY29kZWRCeXRlcyA9IG5ldyBieXRlW21heExlbmd0aF07Ci0gICAgICAgIGludCBhY3R1YWxMZW5ndGggPSBVdGY4LmVuY29kZSh2YWx1ZSwgZW5jb2RlZEJ5dGVzLCAwLCBtYXhMZW5ndGgpOwotICAgICAgICB3cml0ZVVJbnQzMk5vVGFnKGFjdHVhbExlbmd0aCk7Ci0gICAgICAgIHdyaXRlTGF6eShlbmNvZGVkQnl0ZXMsIDAsIGFjdHVhbExlbmd0aCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgLy8gRmFzdCBwYXRoOiB3ZSBoYXZlIGVub3VnaCBzcGFjZSBhdmFpbGFibGUgaW4gb3VyIGJ1ZmZlciBmb3IgdGhlIHN0cmluZy4uLgotICAgICAgaWYgKG1heExlbmd0aFZhckludFNpemUgKyBtYXhMZW5ndGggPiBsaW1pdCAtIHBvc2l0aW9uKSB7Ci0gICAgICAgIC8vIEZsdXNoIHRvIGZyZWUgdXAgc3BhY2UuCi0gICAgICAgIGRvRmx1c2goKTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgaW50IG9sZFBvc2l0aW9uID0gcG9zaXRpb247Ci0gICAgICB0cnkgewotICAgICAgICAvLyBPcHRpbWl6ZSBmb3IgdGhlIGNhc2Ugd2hlcmUgd2Uga25vdyB0aGlzIGxlbmd0aCByZXN1bHRzIGluIGEgY29uc3RhbnQgdmFyaW50IGxlbmd0aCBhcwotICAgICAgICAvLyB0aGlzIHNhdmVzIGEgcGFzcyBmb3IgbWVhc3VyaW5nIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZy4KLSAgICAgICAgZmluYWwgaW50IG1pbkxlbmd0aFZhckludFNpemUgPSBjb21wdXRlVUludDMyU2l6ZU5vVGFnKHZhbHVlLmxlbmd0aCgpKTsKLQotICAgICAgICBpZiAobWluTGVuZ3RoVmFySW50U2l6ZSA9PSBtYXhMZW5ndGhWYXJJbnRTaXplKSB7Ci0gICAgICAgICAgcG9zaXRpb24gPSBvbGRQb3NpdGlvbiArIG1pbkxlbmd0aFZhckludFNpemU7Ci0gICAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gVXRmOC5lbmNvZGUodmFsdWUsIGJ1ZmZlciwgcG9zaXRpb24sIGxpbWl0IC0gcG9zaXRpb24pOwotICAgICAgICAgIC8vIFNpbmNlIHRoaXMgY2xhc3MgaXMgc3RhdGVmdWwgYW5kIHRyYWNrcyB0aGUgcG9zaXRpb24sIHdlIHJld2luZCBhbmQgc3RvcmUgdGhlIHN0YXRlLAotICAgICAgICAgIC8vIHByZXBlbmQgdGhlIGxlbmd0aCwgdGhlbiByZXNldCBpdCBiYWNrIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZy4KLSAgICAgICAgICBwb3NpdGlvbiA9IG9sZFBvc2l0aW9uOwotICAgICAgICAgIGludCBsZW5ndGggPSBuZXdQb3NpdGlvbiAtIG9sZFBvc2l0aW9uIC0gbWluTGVuZ3RoVmFySW50U2l6ZTsKLSAgICAgICAgICBidWZmZXJVSW50MzJOb1RhZyhsZW5ndGgpOwotICAgICAgICAgIHBvc2l0aW9uID0gbmV3UG9zaXRpb247Ci0gICAgICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gbGVuZ3RoOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGludCBsZW5ndGggPSBVdGY4LmVuY29kZWRMZW5ndGgodmFsdWUpOwotICAgICAgICAgIGJ1ZmZlclVJbnQzMk5vVGFnKGxlbmd0aCk7Ci0gICAgICAgICAgcG9zaXRpb24gPSBVdGY4LmVuY29kZSh2YWx1ZSwgYnVmZmVyLCBwb3NpdGlvbiwgbGVuZ3RoKTsKLSAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSBsZW5ndGg7Ci0gICAgICAgIH0KLSAgICAgIH0gY2F0Y2ggKFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gUm9sbCBiYWNrIHRoZSBjaGFuZ2UgYW5kIGNvbnZlcnQgdG8gYW4gSU9FeGNlcHRpb24uCi0gICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuIC09IHBvc2l0aW9uIC0gb2xkUG9zaXRpb247Ci0gICAgICAgIHBvc2l0aW9uID0gb2xkUG9zaXRpb247Ci0KLSAgICAgICAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogV2Ugc2hvdWxkIHRocm93IGFuIElPRXhjZXB0aW9uIGhlcmUgaW5zdGVhZC4KLSAgICAgICAgaW5lZmZpY2llbnRXcml0ZVN0cmluZ05vVGFnKHZhbHVlLCBlKTsKLSAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBmbHVzaCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAocG9zaXRpb24gPiAwKSB7Ci0gICAgICAgIC8vIEZsdXNoIHRoZSBidWZmZXIuCi0gICAgICAgIGRvRmx1c2goKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmbHVzaCgpOwotICAgICAgb3V0LndyaXRlKHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVMYXp5KGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoKCk7Ci0gICAgICBvdXQud3JpdGVMYXp5KHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSBsZW5ndGg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGUoQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoKCk7Ci0gICAgICBpbnQgbGVuZ3RoID0gdmFsdWUucmVtYWluaW5nKCk7Ci0gICAgICBvdXQud3JpdGUodmFsdWUpOwotICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gbGVuZ3RoOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTGF6eShCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2goKTsKLSAgICAgIGludCBsZW5ndGggPSB2YWx1ZS5yZW1haW5pbmcoKTsKLSAgICAgIG91dC53cml0ZUxhenkodmFsdWUpOwotICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gbGVuZ3RoOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBmbHVzaElmTm90QXZhaWxhYmxlKGludCByZXF1aXJlZFNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAobGltaXQgLSBwb3NpdGlvbiA8IHJlcXVpcmVkU2l6ZSkgewotICAgICAgICBkb0ZsdXNoKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvRmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgb3V0LndyaXRlKGJ1ZmZlciwgMCwgcG9zaXRpb24pOwotICAgICAgcG9zaXRpb24gPSAwOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiB7QGxpbmsgQ29kZWRPdXRwdXRTdHJlYW19IHRoYXQgZGVjb3JhdGVzIGFuIHtAbGluayBPdXRwdXRTdHJlYW19LiBJdCBwZXJmb3JtcyBpbnRlcm5hbAotICAgKiBidWZmZXJpbmcgdG8gb3B0aW1pemUgd3JpdGVzIHRvIHRoZSB7QGxpbmsgT3V0cHV0U3RyZWFtfS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE91dHB1dFN0cmVhbUVuY29kZXIgZXh0ZW5kcyBBYnN0cmFjdEJ1ZmZlcmVkRW5jb2RlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0OwotCi0gICAgT3V0cHV0U3RyZWFtRW5jb2RlcihPdXRwdXRTdHJlYW0gb3V0LCBpbnQgYnVmZmVyU2l6ZSkgewotICAgICAgc3VwZXIoYnVmZmVyU2l6ZSk7Ci0gICAgICBpZiAob3V0ID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJvdXQiKTsKLSAgICAgIH0KLSAgICAgIHRoaXMub3V0ID0gb3V0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVGFnKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHdpcmVUeXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVVSW50MzJOb1RhZyhXaXJlRm9ybWF0Lm1ha2VUYWcoZmllbGROdW1iZXIsIHdpcmVUeXBlKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVJbnQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoSWZOb3RBdmFpbGFibGUoTUFYX1ZBUklOVF9TSVpFICogMik7Ci0gICAgICBidWZmZXJUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKLSAgICAgIGJ1ZmZlckludDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUgKiAyKTsKLSAgICAgIGJ1ZmZlclRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgICAgYnVmZmVyVUludDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoSWZOb3RBdmFpbGFibGUoTUFYX1ZBUklOVF9TSVpFICsgRklYRURfMzJfU0laRSk7Ci0gICAgICBidWZmZXJUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQzMik7Ci0gICAgICBidWZmZXJGaXhlZDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVUludDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoSWZOb3RBdmFpbGFibGUoTUFYX1ZBUklOVF9TSVpFICogMik7Ci0gICAgICBidWZmZXJUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKLSAgICAgIGJ1ZmZlclVJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVkNjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUgKyBGSVhFRF82NF9TSVpFKTsKLSAgICAgIGJ1ZmZlclRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0KTsKLSAgICAgIGJ1ZmZlckZpeGVkNjROb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCb29sKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoSWZOb3RBdmFpbGFibGUoTUFYX1ZBUklOVF9TSVpFICsgMSk7Ci0gICAgICBidWZmZXJUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKLSAgICAgIGJ1ZmZlcigoYnl0ZSkgKHZhbHVlID8gMSA6IDApKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgd3JpdGVTdHJpbmdOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICAgIHdyaXRlQnl0ZXNOb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlQXJyYXkoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBieXRlW10gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB3cml0ZUJ5dGVBcnJheShmaWVsZE51bWJlciwgdmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlQXJyYXkoCi0gICAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgYnl0ZVtdIHZhbHVlLCBmaW5hbCBpbnQgb2Zmc2V0LCBmaW5hbCBpbnQgbGVuZ3RoKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICB3cml0ZUJ5dGVBcnJheU5vVGFnKHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVCeXRlQnVmZmVyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgQnl0ZUJ1ZmZlciB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgd3JpdGVVSW50MzJOb1RhZyh2YWx1ZS5jYXBhY2l0eSgpKTsKLSAgICAgIHdyaXRlUmF3Qnl0ZXModmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXNOb1RhZyhmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVVSW50MzJOb1RhZyh2YWx1ZS5zaXplKCkpOwotICAgICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUJ5dGVBcnJheU5vVGFnKGZpbmFsIGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcobGVuZ3RoKTsKLSAgICAgIHdyaXRlKHZhbHVlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlcyhmaW5hbCBCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaWYgKHZhbHVlLmhhc0FycmF5KCkpIHsKLSAgICAgICAgd3JpdGUodmFsdWUuYXJyYXkoKSwgdmFsdWUuYXJyYXlPZmZzZXQoKSwgdmFsdWUuY2FwYWNpdHkoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBCeXRlQnVmZmVyIGR1cGxpY2F0ZWQgPSB2YWx1ZS5kdXBsaWNhdGUoKTsKLSAgICAgICAgZHVwbGljYXRlZC5jbGVhcigpOwotICAgICAgICB3cml0ZShkdXBsaWNhdGVkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2UoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgd3JpdGVNZXNzYWdlTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGVUYWcoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKTsKLSAgICAgIHdyaXRlVUludDMyKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpOwotICAgICAgd3JpdGVNZXNzYWdlKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOwotICAgICAgd3JpdGVUYWcoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7Ci0gICAgICB3cml0ZVVJbnQzMihXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKTsKLSAgICAgIHdyaXRlQnl0ZXMoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7Ci0gICAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgICB2YWx1ZS53cml0ZVRvKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAocG9zaXRpb24gPT0gbGltaXQpIHsKLSAgICAgICAgZG9GbHVzaCgpOwotICAgICAgfQotCi0gICAgICBidWZmZXIodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlSW50MzJOb1RhZyhpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAodmFsdWUgPj0gMCkgewotICAgICAgICB3cml0ZVVJbnQzMk5vVGFnKHZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE11c3Qgc2lnbi1leHRlbmQuCi0gICAgICAgIHdyaXRlVUludDY0Tm9UYWcodmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVUludDMyTm9UYWcoaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShNQVhfVkFSSU5UX1NJWkUpOwotICAgICAgYnVmZmVyVUludDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQzMk5vVGFnKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoSWZOb3RBdmFpbGFibGUoRklYRURfMzJfU0laRSk7Ci0gICAgICBidWZmZXJGaXhlZDMyTm9UYWcodmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlVUludDY0Tm9UYWcobG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZsdXNoSWZOb3RBdmFpbGFibGUoTUFYX1ZBUklOVF9TSVpFKTsKLSAgICAgIGJ1ZmZlclVJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVkNjROb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmx1c2hJZk5vdEF2YWlsYWJsZShGSVhFRF82NF9TSVpFKTsKLSAgICAgIGJ1ZmZlckZpeGVkNjROb1RhZyh2YWx1ZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmdOb1RhZyhTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICAvLyBVVEYtOCBieXRlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIGF0IGxlYXN0IGl0cyBVVEYtMTYgY29kZSB1bml0IGxlbmd0aCAodmFsdWUubGVuZ3RoKCkpLAotICAgICAgICAvLyBhbmQgYXQgbW9zdCAzIHRpbWVzIG9mIGl0LiBXZSB0YWtlIGFkdmFudGFnZSBvZiB0aGlzIGluIGJvdGggYnJhbmNoZXMgYmVsb3cuCi0gICAgICAgIGZpbmFsIGludCBtYXhMZW5ndGggPSB2YWx1ZS5sZW5ndGgoKSAqIFV0ZjguTUFYX0JZVEVTX1BFUl9DSEFSOwotICAgICAgICBmaW5hbCBpbnQgbWF4TGVuZ3RoVmFySW50U2l6ZSA9IGNvbXB1dGVVSW50MzJTaXplTm9UYWcobWF4TGVuZ3RoKTsKLQotICAgICAgICAvLyBJZiB3ZSBhcmUgc3RyZWFtaW5nIGFuZCB0aGUgcG90ZW50aWFsIGxlbmd0aCBpcyB0b28gYmlnIHRvIGZpdCBpbiBvdXIgYnVmZmVyLCB3ZSB0YWtlIHRoZQotICAgICAgICAvLyBzbG93ZXIgcGF0aC4KLSAgICAgICAgaWYgKG1heExlbmd0aFZhckludFNpemUgKyBtYXhMZW5ndGggPiBsaW1pdCkgewotICAgICAgICAgIC8vIEFsbG9jYXRlIGEgYnl0ZVtdIHRoYXQgd2Uga25vdyBjYW4gZml0IHRoZSBzdHJpbmcgYW5kIGVuY29kZSBpbnRvIGl0LiBTdHJpbmcuZ2V0Qnl0ZXMoKQotICAgICAgICAgIC8vIGRvZXMgdGhlIHNhbWUgaW50ZXJuYWxseSBhbmQgdGhlbiBkb2VzICphbm90aGVyIGNvcHkqIHRvIHJldHVybiBhIGJ5dGVbXSBvZiBleGFjdGx5IHRoZQotICAgICAgICAgIC8vIHJpZ2h0IHNpemUuIFdlIGNhbiBza2lwIHRoYXQgY29weSBhbmQganVzdCB3cml0ZVJhd0J5dGVzIHVwIHRvIHRoZSBhY3R1YWxMZW5ndGggb2YgdGhlCi0gICAgICAgICAgLy8gVVRGLTggZW5jb2RlZCBieXRlcy4KLSAgICAgICAgICBmaW5hbCBieXRlW10gZW5jb2RlZEJ5dGVzID0gbmV3IGJ5dGVbbWF4TGVuZ3RoXTsKLSAgICAgICAgICBpbnQgYWN0dWFsTGVuZ3RoID0gVXRmOC5lbmNvZGUodmFsdWUsIGVuY29kZWRCeXRlcywgMCwgbWF4TGVuZ3RoKTsKLSAgICAgICAgICB3cml0ZVVJbnQzMk5vVGFnKGFjdHVhbExlbmd0aCk7Ci0gICAgICAgICAgd3JpdGVMYXp5KGVuY29kZWRCeXRlcywgMCwgYWN0dWFsTGVuZ3RoKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBGYXN0IHBhdGg6IHdlIGhhdmUgZW5vdWdoIHNwYWNlIGF2YWlsYWJsZSBpbiBvdXIgYnVmZmVyIGZvciB0aGUgc3RyaW5nLi4uCi0gICAgICAgIGlmIChtYXhMZW5ndGhWYXJJbnRTaXplICsgbWF4TGVuZ3RoID4gbGltaXQgLSBwb3NpdGlvbikgewotICAgICAgICAgIC8vIEZsdXNoIHRvIGZyZWUgdXAgc3BhY2UuCi0gICAgICAgICAgZG9GbHVzaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gT3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZXJlIHdlIGtub3cgdGhpcyBsZW5ndGggcmVzdWx0cyBpbiBhIGNvbnN0YW50IHZhcmludCBsZW5ndGggYXMKLSAgICAgICAgLy8gdGhpcyBzYXZlcyBhIHBhc3MgZm9yIG1lYXN1cmluZyB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCi0gICAgICAgIGZpbmFsIGludCBtaW5MZW5ndGhWYXJJbnRTaXplID0gY29tcHV0ZVVJbnQzMlNpemVOb1RhZyh2YWx1ZS5sZW5ndGgoKSk7Ci0gICAgICAgIGludCBvbGRQb3NpdGlvbiA9IHBvc2l0aW9uOwotICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoOwotICAgICAgICB0cnkgewotICAgICAgICAgIGlmIChtaW5MZW5ndGhWYXJJbnRTaXplID09IG1heExlbmd0aFZhckludFNpemUpIHsKLSAgICAgICAgICAgIHBvc2l0aW9uID0gb2xkUG9zaXRpb24gKyBtaW5MZW5ndGhWYXJJbnRTaXplOwotICAgICAgICAgICAgaW50IG5ld1Bvc2l0aW9uID0gVXRmOC5lbmNvZGUodmFsdWUsIGJ1ZmZlciwgcG9zaXRpb24sIGxpbWl0IC0gcG9zaXRpb24pOwotICAgICAgICAgICAgLy8gU2luY2UgdGhpcyBjbGFzcyBpcyBzdGF0ZWZ1bCBhbmQgdHJhY2tzIHRoZSBwb3NpdGlvbiwgd2UgcmV3aW5kIGFuZCBzdG9yZSB0aGUKLSAgICAgICAgICAgIC8vIHN0YXRlLCBwcmVwZW5kIHRoZSBsZW5ndGgsIHRoZW4gcmVzZXQgaXQgYmFjayB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCi0gICAgICAgICAgICBwb3NpdGlvbiA9IG9sZFBvc2l0aW9uOwotICAgICAgICAgICAgbGVuZ3RoID0gbmV3UG9zaXRpb24gLSBvbGRQb3NpdGlvbiAtIG1pbkxlbmd0aFZhckludFNpemU7Ci0gICAgICAgICAgICBidWZmZXJVSW50MzJOb1RhZyhsZW5ndGgpOwotICAgICAgICAgICAgcG9zaXRpb24gPSBuZXdQb3NpdGlvbjsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbGVuZ3RoID0gVXRmOC5lbmNvZGVkTGVuZ3RoKHZhbHVlKTsKLSAgICAgICAgICAgIGJ1ZmZlclVJbnQzMk5vVGFnKGxlbmd0aCk7Ci0gICAgICAgICAgICBwb3NpdGlvbiA9IFV0ZjguZW5jb2RlKHZhbHVlLCBidWZmZXIsIHBvc2l0aW9uLCBsZW5ndGgpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbiArPSBsZW5ndGg7Ci0gICAgICAgIH0gY2F0Y2ggKFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAvLyBCZSBleHRyYSBjYXJlZnVsIGFuZCByZXN0b3JlIHRoZSBvcmlnaW5hbCBwb3NpdGlvbiBmb3IgcmV0cnlpbmcgdGhlIHdyaXRlIHdpdGggdGhlCi0gICAgICAgICAgLy8gbGVzcyBlZmZpY2llbnQgcGF0aC4KLSAgICAgICAgICB0b3RhbEJ5dGVzV3JpdHRlbiAtPSBwb3NpdGlvbiAtIG9sZFBvc2l0aW9uOwotICAgICAgICAgIHBvc2l0aW9uID0gb2xkUG9zaXRpb247Ci0gICAgICAgICAgdGhyb3cgZTsKLSAgICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24gZSkgewotICAgICAgICBpbmVmZmljaWVudFdyaXRlU3RyaW5nTm9UYWcodmFsdWUsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChwb3NpdGlvbiA+IDApIHsKLSAgICAgICAgLy8gRmx1c2ggdGhlIGJ1ZmZlci4KLSAgICAgICAgZG9GbHVzaCgpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChsaW1pdCAtIHBvc2l0aW9uID49IGxlbmd0aCkgewotICAgICAgICAvLyBXZSBoYXZlIHJvb20gaW4gdGhlIGN1cnJlbnQgYnVmZmVyLgotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgcG9zaXRpb24sIGxlbmd0aCk7Ci0gICAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsKLSAgICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gbGVuZ3RoOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV3JpdGUgZXh0ZW5kcyBwYXN0IGN1cnJlbnQgYnVmZmVyLiAgRmlsbCB0aGUgcmVzdCBvZiB0aGlzIGJ1ZmZlciBhbmQKLSAgICAgICAgLy8gZmx1c2guCi0gICAgICAgIGZpbmFsIGludCBieXRlc1dyaXR0ZW4gPSBsaW1pdCAtIHBvc2l0aW9uOwotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgcG9zaXRpb24sIGJ5dGVzV3JpdHRlbik7Ci0gICAgICAgIG9mZnNldCArPSBieXRlc1dyaXR0ZW47Ci0gICAgICAgIGxlbmd0aCAtPSBieXRlc1dyaXR0ZW47Ci0gICAgICAgIHBvc2l0aW9uID0gbGltaXQ7Ci0gICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgZG9GbHVzaCgpOwotCi0gICAgICAgIC8vIE5vdyBkZWFsIHdpdGggdGhlIHJlc3QuCi0gICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgYW4gb3V0cHV0IHN0cmVhbSwgdGhpcyBpcyBvdXIgYnVmZmVyCi0gICAgICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDAKLSAgICAgICAgaWYgKGxlbmd0aCA8PSBsaW1pdCkgewotICAgICAgICAgIC8vIEZpdHMgaW4gbmV3IGJ1ZmZlci4KLSAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICAgICAgICBwb3NpdGlvbiA9IGxlbmd0aDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBXcml0ZSBpcyB2ZXJ5IGJpZy4gIExldCdzIGRvIGl0IGFsbCBhdCBvbmNlLgotICAgICAgICAgIG91dC53cml0ZSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgICB9Ci0gICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IGxlbmd0aDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxhenkoYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd3JpdGUodmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaW50IGxlbmd0aCA9IHZhbHVlLnJlbWFpbmluZygpOwotICAgICAgaWYgKGxpbWl0IC0gcG9zaXRpb24gPj0gbGVuZ3RoKSB7Ci0gICAgICAgIC8vIFdlIGhhdmUgcm9vbSBpbiB0aGUgY3VycmVudCBidWZmZXIuCi0gICAgICAgIHZhbHVlLmdldChidWZmZXIsIHBvc2l0aW9uLCBsZW5ndGgpOwotICAgICAgICBwb3NpdGlvbiArPSBsZW5ndGg7Ci0gICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IGxlbmd0aDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdyaXRlIGV4dGVuZHMgcGFzdCBjdXJyZW50IGJ1ZmZlci4gIEZpbGwgdGhlIHJlc3Qgb2YgdGhpcyBidWZmZXIgYW5kCi0gICAgICAgIC8vIGZsdXNoLgotICAgICAgICBmaW5hbCBpbnQgYnl0ZXNXcml0dGVuID0gbGltaXQgLSBwb3NpdGlvbjsKLSAgICAgICAgdmFsdWUuZ2V0KGJ1ZmZlciwgcG9zaXRpb24sIGJ5dGVzV3JpdHRlbik7Ci0gICAgICAgIGxlbmd0aCAtPSBieXRlc1dyaXR0ZW47Ci0gICAgICAgIHBvc2l0aW9uID0gbGltaXQ7Ci0gICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IGJ5dGVzV3JpdHRlbjsKLSAgICAgICAgZG9GbHVzaCgpOwotCi0gICAgICAgIC8vIE5vdyBkZWFsIHdpdGggdGhlIHJlc3QuCi0gICAgICAgIC8vIFNpbmNlIHdlIGhhdmUgYW4gb3V0cHV0IHN0cmVhbSwgdGhpcyBpcyBvdXIgYnVmZmVyCi0gICAgICAgIC8vIGFuZCBidWZmZXIgb2Zmc2V0ID09IDAKLSAgICAgICAgd2hpbGUgKGxlbmd0aCA+IGxpbWl0KSB7Ci0gICAgICAgICAgLy8gQ29weSBkYXRhIGludG8gdGhlIGJ1ZmZlciBiZWZvcmUgd3JpdGluZyBpdCB0byBPdXRwdXRTdHJlYW0uCi0gICAgICAgICAgdmFsdWUuZ2V0KGJ1ZmZlciwgMCwgbGltaXQpOwotICAgICAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIGxpbWl0KTsKLSAgICAgICAgICBsZW5ndGggLT0gbGltaXQ7Ci0gICAgICAgICAgdG90YWxCeXRlc1dyaXR0ZW4gKz0gbGltaXQ7Ci0gICAgICAgIH0KLSAgICAgICAgdmFsdWUuZ2V0KGJ1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICAgICAgcG9zaXRpb24gPSBsZW5ndGg7Ci0gICAgICAgIHRvdGFsQnl0ZXNXcml0dGVuICs9IGxlbmd0aDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZUxhenkoQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdyaXRlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgZmx1c2hJZk5vdEF2YWlsYWJsZShpbnQgcmVxdWlyZWRTaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaWYgKGxpbWl0IC0gcG9zaXRpb24gPCByZXF1aXJlZFNpemUpIHsKLSAgICAgICAgZG9GbHVzaCgpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBkb0ZsdXNoKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIG91dC53cml0ZShidWZmZXIsIDAsIHBvc2l0aW9uKTsKLSAgICAgIHBvc2l0aW9uID0gMDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUge0Bjb2RlIHN1bi5taXNjLlVuc2FmZX0gaW5zdGFuY2UsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgYXZhaWxhYmxlIG9uIHRoaXMKLSAgICogcGxhdGZvcm0uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBzdW4ubWlzYy5VbnNhZmUgZ2V0VW5zYWZlKCkgewotICAgIHN1bi5taXNjLlVuc2FmZSB1bnNhZmUgPSBudWxsOwotICAgIHRyeSB7Ci0gICAgICB1bnNhZmUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxzdW4ubWlzYy5VbnNhZmU+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHN1bi5taXNjLlVuc2FmZSBydW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgICAgICBDbGFzczxzdW4ubWlzYy5VbnNhZmU+IGsgPSBzdW4ubWlzYy5VbnNhZmUuY2xhc3M7Ci0KLSAgICAgICAgICBmb3IgKEZpZWxkIGYgOiBrLmdldERlY2xhcmVkRmllbGRzKCkpIHsKLSAgICAgICAgICAgIGYuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgICAgICAgIE9iamVjdCB4ID0gZi5nZXQobnVsbCk7Ci0gICAgICAgICAgICBpZiAoay5pc0luc3RhbmNlKHgpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBrLmNhc3QoeCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIFRoZSBzdW4ubWlzYy5VbnNhZmUgZmllbGQgZG9lcyBub3QgZXhpc3QuCi0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAvLyBDYXRjaGluZyBUaHJvd2FibGUgaGVyZSBkdWUgdG8gdGhlIGZhY3QgdGhhdCBHb29nbGUgQXBwRW5naW5lIHJhaXNlcyBOb0NsYXNzRGVmRm91bmRFcnJvcgotICAgICAgLy8gZm9yIFVuc2FmZS4KLSAgICB9Ci0KLSAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgInN1bi5taXNjLlVuc2FmZToge30iLAotICAgICAgICB1bnNhZmUgIT0gbnVsbCA/ICJhdmFpbGFibGUiIDogInVuYXZhaWxhYmxlIik7Ci0gICAgcmV0dXJuIHVuc2FmZTsKLSAgfQotCi0gIC8qKgotICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdW5zYWZlIGFycmF5IG9wZXJhdGlvbnMgYXJlIHN1cHBvcnRlZCBvbiB0aGlzIHBsYXRmb3JtLgotICAgKi8KLSAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogQWRkIHN1cHBvcnQgZm9yIEFuZHJvaWQncyBNZW1vcnlCbG9jay4KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0c1Vuc2FmZUFycmF5T3BlcmF0aW9ucygpIHsKLSAgICBib29sZWFuIHN1cHBvcnRlZCA9IGZhbHNlOwotICAgIGlmIChVTlNBRkUgIT0gbnVsbCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgVU5TQUZFLmdldENsYXNzKCkuZ2V0TWV0aG9kKCJhcnJheUJhc2VPZmZzZXQiLCBDbGFzcy5jbGFzcyk7Ci0gICAgICAgIFVOU0FGRS5nZXRDbGFzcygpLmdldE1ldGhvZCgicHV0Qnl0ZSIsIE9iamVjdC5jbGFzcywgbG9uZy5jbGFzcywgYnl0ZS5jbGFzcyk7Ci0gICAgICAgIHN1cHBvcnRlZCA9IHRydWU7Ci0gICAgICB9IGNhdGNoIChUaHJvd2FibGUgZSkgewotICAgICAgICAvLyBEbyBub3RoaW5nLgotICAgICAgfQotICAgIH0KLSAgICBsb2dnZXIubG9nKExldmVsLkZJTkVTVCwgIlVuc2FmZSBhcnJheSBvcGVyYXRpb25zOiB7fSIsCi0gICAgICAgIHN1cHBvcnRlZCA/ICJhdmFpbGFibGUiIDogInVuYXZhaWxhYmxlIik7Ci0gICAgcmV0dXJuIHN1cHBvcnRlZDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIGJhc2Ugb2Zmc2V0IGZvciBieXRlIGFycmF5cywgb3Ige0Bjb2RlIC0xfSBpZiB7QGNvZGUgc3VuLm1pc2MuVW5zYWZlfSBpcyBub3QKLSAgICogYXZhaWxhYmxlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgPFQ+IGludCBieXRlQXJyYXlCYXNlT2Zmc2V0KCkgewotICAgIHJldHVybiBIQVNfVU5TQUZFX0FSUkFZX09QRVJBVElPTlMgPyBVTlNBRkUuYXJyYXlCYXNlT2Zmc2V0KGJ5dGVbXS5jbGFzcykgOiAtMTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9ycy5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9ycy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDBlYTM0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy4qOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuU3ludGF4OwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZi5XZWFrUmVmZXJlbmNlOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5XZWFrSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogQ29udGFpbnMgYSBjb2xsZWN0aW9uIG9mIGNsYXNzZXMgd2hpY2ggZGVzY3JpYmUgcHJvdG9jb2wgbWVzc2FnZSB0eXBlcy4KLSAqCi0gKiBFdmVyeSBtZXNzYWdlIHR5cGUgaGFzIGEge0BsaW5rIERlc2NyaXB0b3J9LCB3aGljaCBsaXN0cyBhbGwKLSAqIGl0cyBmaWVsZHMgYW5kIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IGEgdHlwZS4gIFlvdSBjYW4gZ2V0IGEgbWVzc2FnZQotICogdHlwZSdzIGRlc2NyaXB0b3IgYnkgY2FsbGluZyB7QGNvZGUgTWVzc2FnZVR5cGUuZ2V0RGVzY3JpcHRvcigpfSwgb3IKLSAqIChnaXZlbiBhIG1lc3NhZ2Ugb2JqZWN0IG9mIHRoZSB0eXBlKSB7QGNvZGUgbWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KLSAqIEZ1cnRoZXJtb3JlLCBlYWNoIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIGEge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBmb3IKLSAqIGEgcmVsZXZhbnQge0Bjb2RlIC5wcm90b30gZmlsZS4gWW91IGNhbiBvYnRhaW4gaXQgYnkgY2FsbGluZwotICoge0Bjb2RlIERlc2NyaXB0b3IuZ2V0RmlsZSgpfS4gQSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5zIGRlc2NyaXB0b3JzCi0gKiBmb3IgYWxsIHRoZSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoYXQgZmlsZSwgYW5kIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGFsbCB0aGUKLSAqIGltcG9ydGVkIHtAY29kZSAucHJvdG99IGZpbGVzLgotICoKLSAqIERlc2NyaXB0b3JzIGFyZSBidWlsdCBmcm9tIERlc2NyaXB0b3JQcm90b3MsIGFzIGRlZmluZWQgaW4KLSAqIHtAY29kZSBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b30uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIERlc2NyaXB0b3JzIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTG9nZ2VyIGxvZ2dlciA9Ci0gICAgICBMb2dnZXIuZ2V0TG9nZ2VyKERlc2NyaXB0b3JzLmNsYXNzLmdldE5hbWUoKSk7Ci0gIC8qKgotICAgKiBEZXNjcmliZXMgYSB7QGNvZGUgLnByb3RvfSBmaWxlLCBpbmNsdWRpbmcgZXZlcnl0aGluZyBkZWZpbmVkIHdpdGhpbi4KLSAgICogVGhhdCBpbmNsdWRlcywgaW4gcGFydGljdWxhciwgZGVzY3JpcHRvcnMgZm9yIGFsbCB0aGUgbWVzc2FnZXMgYW5kCi0gICAqIGZpbGUgZGVzY3JpcHRvcnMgZm9yIGFsbCBvdGhlciBpbXBvcnRlZCB7QGNvZGUgLnByb3RvfSBmaWxlcwotICAgKiAoZGVwZW5kZW5jaWVzKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmlsZURlc2NyaXB0b3IgZXh0ZW5kcyBHZW5lcmljRGVzY3JpcHRvciB7Ci0gICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsKLSAgICAgIHJldHVybiBwcm90bzsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBmaWxlIG5hbWUuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgewotICAgICAgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKiogUmV0dXJucyB0aGlzIG9iamVjdC4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRoZSBzYW1lIGFzIGdldE5hbWUoKS4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgewotICAgICAgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHByb3RvIHBhY2thZ2UgbmFtZS4gIFRoaXMgaXMgdGhlIHBhY2thZ2UgbmFtZSBnaXZlbiBieSB0aGUKLSAgICAgKiB7QGNvZGUgcGFja2FnZX0gc3RhdGVtZW50IGluIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlLCB3aGljaCBkaWZmZXJzCi0gICAgICogZnJvbSB0aGUgSmF2YSBwYWNrYWdlLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UGFja2FnZSgpIHsgcmV0dXJuIHByb3RvLmdldFBhY2thZ2UoKTsgfQotCi0gICAgLyoqIEdldCB0aGUge0Bjb2RlIEZpbGVPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uICovCi0gICAgcHVibGljIEZpbGVPcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gKi8KLSAgICBwdWJsaWMgTGlzdDxEZXNjcmlwdG9yPiBnZXRNZXNzYWdlVHlwZXMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KG1lc3NhZ2VUeXBlcykpOwotICAgIH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRvcC1sZXZlbCBlbnVtIHR5cGVzIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gKi8KLSAgICBwdWJsaWMgTGlzdDxFbnVtRGVzY3JpcHRvcj4gZ2V0RW51bVR5cGVzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChlbnVtVHlwZXMpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IGEgbGlzdCBvZiB0b3AtbGV2ZWwgc2VydmljZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLiAqLwotICAgIHB1YmxpYyBMaXN0PFNlcnZpY2VEZXNjcmlwdG9yPiBnZXRTZXJ2aWNlcygpIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3Qoc2VydmljZXMpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IGEgbGlzdCBvZiB0b3AtbGV2ZWwgZXh0ZW5zaW9ucyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUuICovCi0gICAgcHVibGljIExpc3Q8RmllbGREZXNjcmlwdG9yPiBnZXRFeHRlbnNpb25zKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChleHRlbnNpb25zKSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgdGhpcyBmaWxlJ3MgZGVwZW5kZW5jaWVzIChpbXBvcnRzKS4gKi8KLSAgICBwdWJsaWMgTGlzdDxGaWxlRGVzY3JpcHRvcj4gZ2V0RGVwZW5kZW5jaWVzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChkZXBlbmRlbmNpZXMpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IGEgbGlzdCBvZiB0aGlzIGZpbGUncyBwdWJsaWMgZGVwZW5kZW5jaWVzIChwdWJsaWMgaW1wb3J0cykuICovCi0gICAgcHVibGljIExpc3Q8RmlsZURlc2NyaXB0b3I+IGdldFB1YmxpY0RlcGVuZGVuY2llcygpIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QocHVibGljRGVwZW5kZW5jaWVzKSk7Ci0gICAgfQotCi0gICAgLyoqIFRoZSBzeW50YXggb2YgdGhlIC5wcm90byBmaWxlLiAqLwotICAgIHB1YmxpYyBlbnVtIFN5bnRheCB7Ci0gICAgICBVTktOT1dOKCJ1bmtub3duIiksCi0gICAgICBQUk9UTzIoInByb3RvMiIpLAotICAgICAgUFJPVE8zKCJwcm90bzMiKTsKLQotICAgICAgU3ludGF4KFN0cmluZyBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICB9Ci0gICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHN5bnRheCBvZiB0aGUgLnByb3RvIGZpbGUuICovCi0gICAgcHVibGljIFN5bnRheCBnZXRTeW50YXgoKSB7Ci0gICAgICBpZiAoU3ludGF4LlBST1RPMy5uYW1lLmVxdWFscyhwcm90by5nZXRTeW50YXgoKSkpIHsKLSAgICAgICAgcmV0dXJuIFN5bnRheC5QUk9UTzM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gU3ludGF4LlBST1RPMjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGEgbWVzc2FnZSB0eXBlIGluIHRoZSBmaWxlIGJ5IG5hbWUuICBEb2VzIG5vdCBmaW5kIG5lc3RlZCB0eXBlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCB0eXBlIG5hbWUgdG8gbG9vayBmb3IuCi0gICAgICogQHJldHVybiBUaGUgbWVzc2FnZSB0eXBlJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBmaW5kTWVzc2FnZVR5cGVCeU5hbWUoU3RyaW5nIG5hbWUpIHsKLSAgICAgIC8vIERvbid0IGFsbG93IGxvb2tpbmcgdXAgbmVzdGVkIHR5cGVzLiAgVGhpcyB3aWxsIG1ha2Ugb3B0aW1pemF0aW9uCi0gICAgICAvLyBlYXNpZXIgbGF0ZXIuCi0gICAgICBpZiAobmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2V0UGFja2FnZSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICBuYW1lID0gZ2V0UGFja2FnZSgpICsgJy4nICsgbmFtZTsKLSAgICAgIH0KLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9IHBvb2wuZmluZFN5bWJvbChuYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yICYmCi0gICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybiAoRGVzY3JpcHRvcilyZXN1bHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFuIGVudW0gdHlwZSBpbiB0aGUgZmlsZSBieSBuYW1lLiAgRG9lcyBub3QgZmluZCBuZXN0ZWQgdHlwZXMuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgdHlwZSBuYW1lIHRvIGxvb2sgZm9yLgotICAgICAqIEByZXR1cm4gVGhlIGVudW0gdHlwZSdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEVudW1EZXNjcmlwdG9yIGZpbmRFbnVtVHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9va2luZyB1cCBuZXN0ZWQgdHlwZXMuICBUaGlzIHdpbGwgbWFrZSBvcHRpbWl6YXRpb24KLSAgICAgIC8vIGVhc2llciBsYXRlci4KLSAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIGlmIChnZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIG5hbWUgPSBnZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOwotICAgICAgfQotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gcG9vbC5maW5kU3ltYm9sKG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIEVudW1EZXNjcmlwdG9yICYmCi0gICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybiAoRW51bURlc2NyaXB0b3IpcmVzdWx0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhIHNlcnZpY2UgdHlwZSBpbiB0aGUgZmlsZSBieSBuYW1lLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIHR5cGUgbmFtZSB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIFRoZSBzZXJ2aWNlIHR5cGUncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRvciBmaW5kU2VydmljZUJ5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9va2luZyB1cCBuZXN0ZWQgdHlwZXMuICBUaGlzIHdpbGwgbWFrZSBvcHRpbWl6YXRpb24KLSAgICAgIC8vIGVhc2llciBsYXRlci4KLSAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIGlmIChnZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIG5hbWUgPSBnZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOwotICAgICAgfQotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gcG9vbC5maW5kU3ltYm9sKG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIFNlcnZpY2VEZXNjcmlwdG9yICYmCi0gICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybiAoU2VydmljZURlc2NyaXB0b3IpcmVzdWx0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhbiBleHRlbnNpb24gaW4gdGhlIGZpbGUgYnkgbmFtZS4gIERvZXMgbm90IGZpbmQgZXh0ZW5zaW9ucyBuZXN0ZWQKLSAgICAgKiBpbnNpZGUgbWVzc2FnZSB0eXBlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBleHRlbnNpb24gbmFtZSB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIFRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZmluZEV4dGVuc2lvbkJ5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgaWYgKG5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgaWYgKGdldFBhY2thZ2UoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgbmFtZSA9IGdldFBhY2thZ2UoKSArICcuJyArIG5hbWU7Ci0gICAgICB9Ci0gICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPSBwb29sLmZpbmRTeW1ib2wobmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRmllbGREZXNjcmlwdG9yICYmCi0gICAgICAgICAgcmVzdWx0LmdldEZpbGUoKSA9PSB0aGlzKSB7Ci0gICAgICAgIHJldHVybiAoRmllbGREZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIHtAY29kZSBGaWxlRGVzY3JpcHRvcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG8gVGhlIHByb3RvY29sIG1lc3NhZ2UgZm9ybSBvZiB0aGUgRmlsZURlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtIGRlcGVuZGVuY2llcyB7QGNvZGUgRmlsZURlc2NyaXB0b3J9cyBjb3JyZXNwb25kaW5nIHRvIGFsbCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUncyBkZXBlbmRlbmNpZXMuCi0gICAgICogQHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7QGNvZGUgcHJvdG99IGlzIG5vdCBhIHZhbGlkCi0gICAgICogICAgICAgICAgIGRlc2NyaXB0b3IuICBUaGlzIGNhbiBvY2N1ciBmb3IgYSBudW1iZXIgb2YgcmVhc29ucywgZS5nLgotICAgICAqICAgICAgICAgICBiZWNhdXNlIGEgZmllbGQgaGFzIGFuIHVuZGVmaW5lZCB0eXBlIG9yIGJlY2F1c2UgdHdvIG1lc3NhZ2VzCi0gICAgICogICAgICAgICAgIHdlcmUgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvciBidWlsZEZyb20oZmluYWwgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvcltdIGRlcGVuZGVuY2llcykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gYnVpbGRGcm9tKHByb3RvLCBkZXBlbmRlbmNpZXMsIGZhbHNlKTsKLSAgICB9Ci0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIHtAY29kZSBGaWxlRGVzY3JpcHRvcn0uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gcHJvdG8gVGhlIHByb3RvY29sIG1lc3NhZ2UgZm9ybSBvZiB0aGUgRmlsZURlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtIGRlcGVuZGVuY2llcyB7QGNvZGUgRmlsZURlc2NyaXB0b3J9cyBjb3JyZXNwb25kaW5nIHRvIGFsbCBvZgotICAgICAqICAgICAgICAgICAgICAgICAgICAgdGhlIGZpbGUncyBkZXBlbmRlbmNpZXMuCi0gICAgICogQHBhcmFtIGFsbG93VW5rbm93bkRlcGVuZGVuY2llcyBJZiB0cnVlLCBub24tZXhpc3QgZGVwZW5kZW5uY2llcyB3aWxsIGJlCi0gICAgICogICAgICAgICAgIGlnbm9yZWQgYW5kIHVuZGVmaW5lZCBtZXNzYWdlIHR5cGVzIHdpbGwgYmUgcmVwbGFjZWQgd2l0aCBhCi0gICAgICogICAgICAgICAgIHBsYWNlaG9sZGVyIHR5cGUuCi0gICAgICogQHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7QGNvZGUgcHJvdG99IGlzIG5vdCBhIHZhbGlkCi0gICAgICogICAgICAgICAgIGRlc2NyaXB0b3IuICBUaGlzIGNhbiBvY2N1ciBmb3IgYSBudW1iZXIgb2YgcmVhc29ucywgZS5nLgotICAgICAqICAgICAgICAgICBiZWNhdXNlIGEgZmllbGQgaGFzIGFuIHVuZGVmaW5lZCB0eXBlIG9yIGJlY2F1c2UgdHdvIG1lc3NhZ2VzCi0gICAgICogICAgICAgICAgIHdlcmUgZGVmaW5lZCB3aXRoIHRoZSBzYW1lIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBGaWxlRGVzY3JpcHRvciBidWlsZEZyb20oCi0gICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG8sIGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzLAotICAgICAgICBmaW5hbCBib29sZWFuIGFsbG93VW5rbm93bkRlcGVuZGVuY2llcykKLSAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIC8vIEJ1aWxkaW5nIGRlc2NyaXB0b3JzIGludm9sdmVzIHR3byBzdGVwczogIHRyYW5zbGF0aW5nIGFuZCBsaW5raW5nLgotICAgICAgLy8gSW4gdGhlIHRyYW5zbGF0aW9uIHN0ZXAgKGltcGxlbWVudGVkIGJ5IEZpbGVEZXNjcmlwdG9yJ3MKLSAgICAgIC8vIGNvbnN0cnVjdG9yKSwgd2UgYnVpbGQgYW4gb2JqZWN0IHRyZWUgbWlycm9yaW5nIHRoZQotICAgICAgLy8gRmlsZURlc2NyaXB0b3JQcm90bydzIHRyZWUgYW5kIHB1dCBhbGwgb2YgdGhlIGRlc2NyaXB0b3JzIGludG8gdGhlCi0gICAgICAvLyBEZXNjcmlwdG9yUG9vbCdzIGxvb2t1cCB0YWJsZXMuICBJbiB0aGUgbGlua2luZyBzdGVwLCB3ZSBsb29rIHVwIGFsbAotICAgICAgLy8gdHlwZSByZWZlcmVuY2VzIGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgc28gdGhhdCwgZm9yIGV4YW1wbGUsIGEKLSAgICAgIC8vIEZpZWxkRGVzY3JpcHRvciBmb3IgYW4gZW1iZWRkZWQgbWVzc2FnZSBjb250YWlucyBhIHBvaW50ZXIgZGlyZWN0bHkKLSAgICAgIC8vIHRvIHRoZSBEZXNjcmlwdG9yIGZvciB0aGF0IG1lc3NhZ2UncyB0eXBlLiAgV2UgYWxzbyBkZXRlY3QgdW5kZWZpbmVkCi0gICAgICAvLyB0eXBlcyBpbiB0aGUgbGlua2luZyBzdGVwLgotICAgICAgZmluYWwgRGVzY3JpcHRvclBvb2wgcG9vbCA9IG5ldyBEZXNjcmlwdG9yUG9vbCgKLSAgICAgICAgICBkZXBlbmRlbmNpZXMsIGFsbG93VW5rbm93bkRlcGVuZGVuY2llcyk7Ci0gICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciByZXN1bHQgPSBuZXcgRmlsZURlc2NyaXB0b3IoCi0gICAgICAgICAgcHJvdG8sIGRlcGVuZGVuY2llcywgcG9vbCwgYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKTsKLSAgICAgIHJlc3VsdC5jcm9zc0xpbmsoKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICBJdCBpcyBlcXVpdmFsZW50Ci0gICAgICogdG8ge0Bjb2RlIGJ1aWxkRnJvbX0gZXhjZXB0IHRoYXQgdGhlIHtAY29kZSBGaWxlRGVzY3JpcHRvclByb3RvfSBpcwotICAgICAqIGVuY29kZWQgaW4gcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGRlc2NyaXB0b3JEYXRhUGFydHMsCi0gICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzLAotICAgICAgICBmaW5hbCBJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBkZXNjcmlwdG9yQXNzaWduZXIpIHsKLSAgICAgIC8vIEhhY2s6ICBXZSBjYW4ndCBlbWJlZCBhIHJhdyBieXRlIGFycmF5IGluc2lkZSBnZW5lcmF0ZWQgSmF2YSBjb2RlCi0gICAgICAvLyAgIChhdCBsZWFzdCwgbm90IGVmZmljaWVudGx5KSwgYnV0IHdlIGNhbiBlbWJlZCBTdHJpbmdzLiAgU28sIHRoZQotICAgICAgLy8gICBwcm90b2NvbCBjb21waWxlciBlbWJlZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gYXMgYSBnaWFudAotICAgICAgLy8gICBzdHJpbmcgbGl0ZXJhbCB3aGljaCBpcyBwYXNzZWQgdG8gdGhpcyBmdW5jdGlvbiB0byBjb25zdHJ1Y3QgdGhlCi0gICAgICAvLyAgIGZpbGUncyBGaWxlRGVzY3JpcHRvci4gIFRoZSBzdHJpbmcgbGl0ZXJhbCBjb250YWlucyBvbmx5IDgtYml0Ci0gICAgICAvLyAgIGNoYXJhY3RlcnMsIGVhY2ggb25lIHJlcHJlc2VudGluZyBhIGJ5dGUgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8ncwotICAgICAgLy8gICBzZXJpYWxpemVkIGZvcm0uICBTbywgaWYgd2UgY29udmVydCBpdCB0byBieXRlcyBpbiBJU08tODg1OS0xLCB3ZQotICAgICAgLy8gICBzaG91bGQgZ2V0IHRoZSBvcmlnaW5hbCBieXRlcyB0aGF0IHdlIHdhbnQuCi0KLSAgICAgIC8vIGRlc2NyaXB0b3JEYXRhIG1heSBjb250YWluIG11bHRpcGxlIHN0cmluZ3MgaW4gb3JkZXIgdG8gZ2V0IGFyb3VuZCB0aGUKLSAgICAgIC8vIEphdmEgNjRrIHN0cmluZyBsaXRlcmFsIGxpbWl0LgotICAgICAgU3RyaW5nQnVpbGRlciBkZXNjcmlwdG9yRGF0YSA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBmb3IgKFN0cmluZyBwYXJ0IDogZGVzY3JpcHRvckRhdGFQYXJ0cykgewotICAgICAgICBkZXNjcmlwdG9yRGF0YS5hcHBlbmQocGFydCk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIGJ5dGVbXSBkZXNjcmlwdG9yQnl0ZXM7Ci0gICAgICBkZXNjcmlwdG9yQnl0ZXMgPSBkZXNjcmlwdG9yRGF0YS50b1N0cmluZygpLmdldEJ5dGVzKEludGVybmFsLklTT184ODU5XzEpOwotCi0gICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOwotICAgICAgdHJ5IHsKLSAgICAgICAgcHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLnBhcnNlRnJvbShkZXNjcmlwdG9yQnl0ZXMpOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHByb3RvY29sIGJ1ZmZlciBkZXNjcmlwdG9yIGZvciBnZW5lcmF0ZWQgY29kZS4iLCBlKTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgcmVzdWx0OwotICAgICAgdHJ5IHsKLSAgICAgICAgLy8gV2hlbiBidWlsZGluZyBkZXNjcmlwdG9ycyBmb3IgZ2VuZXJhdGVkIGNvZGUsIHdlIGFsbG93IHVua25vd24KLSAgICAgICAgLy8gZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQuCi0gICAgICAgIHJlc3VsdCA9IGJ1aWxkRnJvbShwcm90bywgZGVwZW5kZW5jaWVzLCB0cnVlKTsKLSAgICAgIH0gY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiSW52YWxpZCBlbWJlZGRlZCBkZXNjcmlwdG9yIGZvciBcIiIgKyBwcm90by5nZXROYW1lKCkgKyAiXCIuIiwgZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0KLSAgICAgICAgICBkZXNjcmlwdG9yQXNzaWduZXIuYXNzaWduRGVzY3JpcHRvcnMocmVzdWx0KTsKLQotICAgICAgaWYgKHJlZ2lzdHJ5ICE9IG51bGwpIHsKLSAgICAgICAgLy8gV2UgbXVzdCByZS1wYXJzZSB0aGUgcHJvdG8gdXNpbmcgdGhlIHJlZ2lzdHJ5LgotICAgICAgICB0cnkgewotICAgICAgICAgIHByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5wYXJzZUZyb20oZGVzY3JpcHRvckJ5dGVzLCByZWdpc3RyeSk7Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJGYWlsZWQgdG8gcGFyc2UgcHJvdG9jb2wgYnVmZmVyIGRlc2NyaXB0b3IgZm9yIGdlbmVyYXRlZCBjb2RlLiIsCi0gICAgICAgICAgICBlKTsKLSAgICAgICAgfQotCi0gICAgICAgIHJlc3VsdC5zZXRQcm90byhwcm90byk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICBJdCB1c2VzIEphdmEKLSAgICAgKiByZWZsZWN0aW9uIHRvIGxvYWQgdGhlIGRlcGVuZGVuY2llcycgZGVzY3JpcHRvcnMuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyB2b2lkIGludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbSgKLSAgICAgICAgZmluYWwgU3RyaW5nW10gZGVzY3JpcHRvckRhdGFQYXJ0cywKLSAgICAgICAgZmluYWwgQ2xhc3M8Pz4gZGVzY3JpcHRvck91dGVyQ2xhc3MsCi0gICAgICAgIGZpbmFsIFN0cmluZ1tdIGRlcGVuZGVuY2llcywKLSAgICAgICAgZmluYWwgU3RyaW5nW10gZGVwZW5kZW5jeUZpbGVOYW1lcywKLSAgICAgICAgZmluYWwgSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgZGVzY3JpcHRvckFzc2lnbmVyKSB7Ci0gICAgICBMaXN0PEZpbGVEZXNjcmlwdG9yPiBkZXNjcmlwdG9ycyA9IG5ldyBBcnJheUxpc3Q8RmlsZURlc2NyaXB0b3I+KCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykgewotICAgICAgICB0cnkgewotICAgICAgICAgIENsYXNzPD8+IGNsYXp6ID0KLSAgICAgICAgICAgICAgZGVzY3JpcHRvck91dGVyQ2xhc3MuZ2V0Q2xhc3NMb2FkZXIoKS5sb2FkQ2xhc3MoZGVwZW5kZW5jaWVzW2ldKTsKLSAgICAgICAgICBkZXNjcmlwdG9ycy5hZGQoCi0gICAgICAgICAgICAgIChGaWxlRGVzY3JpcHRvcikgY2xhenouZ2V0RmllbGQoImRlc2NyaXB0b3IiKS5nZXQobnVsbCkpOwotICAgICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAgIC8vIFdlIGFsbG93IHVua25vd24gZGVwZW5kZW5jaWVzIGJ5IGRlZmF1bHQuIElmIGEgZGVwZW5kZW5jeSBjYW5ub3QKLSAgICAgICAgICAvLyBiZSBmb3VuZCB3ZSBvbmx5IGdlbmVyYXRlIGEgd2FybmluZy4KLSAgICAgICAgICBsb2dnZXIud2FybmluZygiRGVzY3JpcHRvcnMgZm9yIFwiIiArIGRlcGVuZGVuY3lGaWxlTmFtZXNbaV0gKwotICAgICAgICAgICAgICAiXCIgY2FuIG5vdCBiZSBmb3VuZC4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgRmlsZURlc2NyaXB0b3JbXSBkZXNjcmlwdG9yQXJyYXkgPSBuZXcgRmlsZURlc2NyaXB0b3JbZGVzY3JpcHRvcnMuc2l6ZSgpXTsKLSAgICAgIGRlc2NyaXB0b3JzLnRvQXJyYXkoZGVzY3JpcHRvckFycmF5KTsKLSAgICAgIGludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbSgKLSAgICAgICAgICBkZXNjcmlwdG9yRGF0YVBhcnRzLCBkZXNjcmlwdG9yQXJyYXksIGRlc2NyaXB0b3JBc3NpZ25lcik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhpcyBtZXRob2QgaXMgdG8gYmUgY2FsbGVkIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICBJdCBpcyB1c2VkIHRvCi0gICAgICogdXBkYXRlIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIGFzc29jaWF0ZWQgd2l0aCB0aGUgZGVzY3JpcHRvciBieQotICAgICAqIHBhcnNpbmcgaXQgYWdhaW4gd2l0aCB0aGUgZ2l2ZW4gRXh0ZW5zaW9uUmVnaXN0cnkuIFRoaXMgaXMgbmVlZGVkIHRvCi0gICAgICogcmVjb2duaXplIGN1c3RvbSBvcHRpb25zLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBpbnRlcm5hbFVwZGF0ZUZpbGVEZXNjcmlwdG9yKAotICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgewotICAgICAgQnl0ZVN0cmluZyBieXRlcyA9IGRlc2NyaXB0b3IucHJvdG8udG9CeXRlU3RyaW5nKCk7Ci0gICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOwotICAgICAgdHJ5IHsKLSAgICAgICAgcHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLnBhcnNlRnJvbShieXRlcywgcmVnaXN0cnkpOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHByb3RvY29sIGJ1ZmZlciBkZXNjcmlwdG9yIGZvciBnZW5lcmF0ZWQgY29kZS4iLCBlKTsKLSAgICAgIH0KLSAgICAgIGRlc2NyaXB0b3Iuc2V0UHJvdG8ocHJvdG8pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gIFdoZW4gY2FsbGluZwotICAgICAqIHtAbGluayBGaWxlRGVzY3JpcHRvciNpbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb219LCB0aGUgY2FsbGVyCi0gICAgICogcHJvdmlkZXMgYSBjYWxsYmFjayBpbXBsZW1lbnRpbmcgdGhpcyBpbnRlcmZhY2UuICBUaGUgY2FsbGJhY2sgaXMgY2FsbGVkCi0gICAgICogYWZ0ZXIgdGhlIEZpbGVEZXNjcmlwdG9yIGhhcyBiZWVuIGNvbnN0cnVjdGVkLCBpbiBvcmRlciB0byBhc3NpZ24gYWxsCi0gICAgICogdGhlIGdsb2JhbCB2YXJpYWJsZXMgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggcG9pbnQgYXQgcGFydHMKLSAgICAgKiBvZiB0aGUgRmlsZURlc2NyaXB0b3IuICBUaGUgY2FsbGJhY2sgcmV0dXJucyBhbiBFeHRlbnNpb25SZWdpc3RyeSB3aGljaAotICAgICAqIGNvbnRhaW5zIGFueSBleHRlbnNpb25zIHdoaWNoIG1pZ2h0IGJlIHVzZWQgaW4gdGhlIGRlc2NyaXB0b3IgLS0gdGhhdAotICAgICAqIGlzLCBleHRlbnNpb25zIG9mIHRoZSB2YXJpb3VzICJPcHRpb25zIiBtZXNzYWdlcyBkZWZpbmVkIGluCi0gICAgICogZGVzY3JpcHRvci5wcm90by4gIFRoZSBjYWxsYmFjayBtYXkgYWxzbyByZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgICogbm8gZXh0ZW5zaW9ucyBhcmUgdXNlZCBpbiB0aGUgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIHsKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGFzc2lnbkRlc2NyaXB0b3JzKEZpbGVEZXNjcmlwdG9yIHJvb3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JbXSBtZXNzYWdlVHlwZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFbnVtRGVzY3JpcHRvcltdIGVudW1UeXBlczsKLSAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yW10gc2VydmljZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWVsZERlc2NyaXB0b3JbXSBleHRlbnNpb25zOwotICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvcltdIHB1YmxpY0RlcGVuZGVuY2llczsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JQb29sIHBvb2w7Ci0KLSAgICBwcml2YXRlIEZpbGVEZXNjcmlwdG9yKGZpbmFsIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvcltdIGRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3JQb29sIHBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBib29sZWFuIGFsbG93VW5rbm93bkRlcGVuZGVuY2llcykKLSAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMucG9vbCA9IHBvb2w7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0gICAgICB0aGlzLmRlcGVuZGVuY2llcyA9IGRlcGVuZGVuY2llcy5jbG9uZSgpOwotICAgICAgSGFzaE1hcDxTdHJpbmcsIEZpbGVEZXNjcmlwdG9yPiBuYW1lVG9GaWxlTWFwID0KLSAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEZpbGVEZXNjcmlwdG9yPigpOwotICAgICAgZm9yIChGaWxlRGVzY3JpcHRvciBmaWxlIDogZGVwZW5kZW5jaWVzKSB7Ci0gICAgICAgIG5hbWVUb0ZpbGVNYXAucHV0KGZpbGUuZ2V0TmFtZSgpLCBmaWxlKTsKLSAgICAgIH0KLSAgICAgIExpc3Q8RmlsZURlc2NyaXB0b3I+IHB1YmxpY0RlcGVuZGVuY2llcyA9IG5ldyBBcnJheUxpc3Q8RmlsZURlc2NyaXB0b3I+KCk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldFB1YmxpY0RlcGVuZGVuY3lDb3VudCgpOyBpKyspIHsKLSAgICAgICAgaW50IGluZGV4ID0gcHJvdG8uZ2V0UHVibGljRGVwZW5kZW5jeShpKTsKLSAgICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBwcm90by5nZXREZXBlbmRlbmN5Q291bnQoKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAiSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC4iKTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgbmFtZSA9IHByb3RvLmdldERlcGVuZGVuY3koaW5kZXgpOwotICAgICAgICBGaWxlRGVzY3JpcHRvciBmaWxlID0gbmFtZVRvRmlsZU1hcC5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChmaWxlID09IG51bGwpIHsKLSAgICAgICAgICBpZiAoIWFsbG93VW5rbm93bkRlcGVuZGVuY2llcykgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCi0gICAgICAgICAgICAgICAgIkludmFsaWQgcHVibGljIGRlcGVuZGVuY3k6ICIgKyBuYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gSWdub3JlIHVua25vd24gZGVwZW5kZW5jaWVzLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHB1YmxpY0RlcGVuZGVuY2llcy5hZGQoZmlsZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHRoaXMucHVibGljRGVwZW5kZW5jaWVzID0gbmV3IEZpbGVEZXNjcmlwdG9yW3B1YmxpY0RlcGVuZGVuY2llcy5zaXplKCldOwotICAgICAgcHVibGljRGVwZW5kZW5jaWVzLnRvQXJyYXkodGhpcy5wdWJsaWNEZXBlbmRlbmNpZXMpOwotCi0gICAgICBwb29sLmFkZFBhY2thZ2UoZ2V0UGFja2FnZSgpLCB0aGlzKTsKLQotICAgICAgbWVzc2FnZVR5cGVzID0gbmV3IERlc2NyaXB0b3JbcHJvdG8uZ2V0TWVzc2FnZVR5cGVDb3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0TWVzc2FnZVR5cGVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgbWVzc2FnZVR5cGVzW2ldID0KLSAgICAgICAgICBuZXcgRGVzY3JpcHRvcihwcm90by5nZXRNZXNzYWdlVHlwZShpKSwgdGhpcywgbnVsbCwgaSk7Ci0gICAgICB9Ci0KLSAgICAgIGVudW1UeXBlcyA9IG5ldyBFbnVtRGVzY3JpcHRvcltwcm90by5nZXRFbnVtVHlwZUNvdW50KCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRFbnVtVHlwZUNvdW50KCk7IGkrKykgewotICAgICAgICBlbnVtVHlwZXNbaV0gPSBuZXcgRW51bURlc2NyaXB0b3IocHJvdG8uZ2V0RW51bVR5cGUoaSksIHRoaXMsIG51bGwsIGkpOwotICAgICAgfQotCi0gICAgICBzZXJ2aWNlcyA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRvcltwcm90by5nZXRTZXJ2aWNlQ291bnQoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldFNlcnZpY2VDb3VudCgpOyBpKyspIHsKLSAgICAgICAgc2VydmljZXNbaV0gPSBuZXcgU2VydmljZURlc2NyaXB0b3IocHJvdG8uZ2V0U2VydmljZShpKSwgdGhpcywgaSk7Ci0gICAgICB9Ci0KLSAgICAgIGV4dGVuc2lvbnMgPSBuZXcgRmllbGREZXNjcmlwdG9yW3Byb3RvLmdldEV4dGVuc2lvbkNvdW50KCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRFeHRlbnNpb25Db3VudCgpOyBpKyspIHsKLSAgICAgICAgZXh0ZW5zaW9uc1tpXSA9IG5ldyBGaWVsZERlc2NyaXB0b3IoCi0gICAgICAgICAgcHJvdG8uZ2V0RXh0ZW5zaW9uKGkpLCB0aGlzLCBudWxsLCBpLCB0cnVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBwbGFjZWhvbGRlciBGaWxlRGVzY3JpcHRvciBmb3IgYSBtZXNzYWdlIERlc2NyaXB0b3IuCi0gICAgICovCi0gICAgRmlsZURlc2NyaXB0b3IoU3RyaW5nIHBhY2thZ2VOYW1lLCBEZXNjcmlwdG9yIG1lc3NhZ2UpCi0gICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLnBvb2wgPSBuZXcgRGVzY3JpcHRvclBvb2wobmV3IEZpbGVEZXNjcmlwdG9yWzBdLCB0cnVlKTsKLSAgICAgIHRoaXMucHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgIC5zZXROYW1lKG1lc3NhZ2UuZ2V0RnVsbE5hbWUoKSArICIucGxhY2Vob2xkZXIucHJvdG8iKQotICAgICAgICAgIC5zZXRQYWNrYWdlKHBhY2thZ2VOYW1lKS5hZGRNZXNzYWdlVHlwZShtZXNzYWdlLnRvUHJvdG8oKSkuYnVpbGQoKTsKLSAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IEZpbGVEZXNjcmlwdG9yWzBdOwotICAgICAgdGhpcy5wdWJsaWNEZXBlbmRlbmNpZXMgPSBuZXcgRmlsZURlc2NyaXB0b3JbMF07Ci0KLSAgICAgIG1lc3NhZ2VUeXBlcyA9IG5ldyBEZXNjcmlwdG9yW10ge21lc3NhZ2V9OwotICAgICAgZW51bVR5cGVzID0gbmV3IEVudW1EZXNjcmlwdG9yWzBdOwotICAgICAgc2VydmljZXMgPSBuZXcgU2VydmljZURlc2NyaXB0b3JbMF07Ci0gICAgICBleHRlbnNpb25zID0gbmV3IEZpZWxkRGVzY3JpcHRvclswXTsKLQotICAgICAgcG9vbC5hZGRQYWNrYWdlKHBhY2thZ2VOYW1lLCB0aGlzKTsKLSAgICAgIHBvb2wuYWRkU3ltYm9sKG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKiBMb29rIHVwIGFuZCBjcm9zcy1saW5rIGFsbCBmaWVsZCB0eXBlcywgZXRjLiAqLwotICAgIHByaXZhdGUgdm9pZCBjcm9zc0xpbmsoKSB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlIDogbWVzc2FnZVR5cGVzKSB7Ci0gICAgICAgIG1lc3NhZ2VUeXBlLmNyb3NzTGluaygpOwotICAgICAgfQotCi0gICAgICBmb3IgKGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2UgOiBzZXJ2aWNlcykgewotICAgICAgICBzZXJ2aWNlLmNyb3NzTGluaygpOwotICAgICAgfQotCi0gICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gOiBleHRlbnNpb25zKSB7Ci0gICAgICAgIGV4dGVuc2lvbi5jcm9zc0xpbmsoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIG91ciB7QGxpbmsgRmlsZURlc2NyaXB0b3JQcm90b30gd2l0aCB0aGUgZ2l2ZW4gb25lLCB3aGljaCBpcwotICAgICAqIGlkZW50aWNhbCBleGNlcHQgdGhhdCBpdCBtaWdodCBjb250YWluIGV4dGVuc2lvbnMgdGhhdCB3ZXJlbid0IHByZXNlbnQKLSAgICAgKiBpbiB0aGUgb3JpZ2luYWwuICBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgZm9yIGJvb3RzdHJhcHBpbmcgd2hlbiBhIGZpbGUKLSAgICAgKiBkZWZpbmVzIGN1c3RvbSBvcHRpb25zLiAgVGhlIG9wdGlvbnMgbWF5IGJlIGRlZmluZWQgaW4gdGhlIGZpbGUgaXRzZWxmLAotICAgICAqIHNvIHdlIGNhbid0IGFjdHVhbGx5IHBhcnNlIHRoZW0gdW50aWwgd2UndmUgY29uc3RydWN0ZWQgdGhlIGRlc2NyaXB0b3JzLAotICAgICAqIGJ1dCB0byBjb25zdHJ1Y3QgdGhlIGRlc2NyaXB0b3JzIHdlIGhhdmUgdG8gaGF2ZSBwYXJzZWQgdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBwcm90b3MuICBTbywgd2UgaGF2ZSB0byBwYXJzZSB0aGUgZGVzY3JpcHRvciBwcm90b3MgYSBzZWNvbmQgdGltZSBhZnRlcgotICAgICAqIGNvbnN0cnVjdGluZyB0aGUgZGVzY3JpcHRvcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgbWVzc2FnZVR5cGVzW2ldLnNldFByb3RvKHByb3RvLmdldE1lc3NhZ2VUeXBlKGkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgZW51bVR5cGVzW2ldLnNldFByb3RvKHByb3RvLmdldEVudW1UeXBlKGkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBzZXJ2aWNlc1tpXS5zZXRQcm90byhwcm90by5nZXRTZXJ2aWNlKGkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGV4dGVuc2lvbnNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0RXh0ZW5zaW9uKGkpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBib29sZWFuIHN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZSgpIHsKLSAgICAgIHJldHVybiBnZXRTeW50YXgoKSA9PSBTeW50YXguUFJPVE8zOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIERlc2NyaWJlcyBhIG1lc3NhZ2UgdHlwZS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9yIGV4dGVuZHMgR2VuZXJpY0Rlc2NyaXB0b3IgewotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LiAgSW4gb3RoZXIgd29yZHMsCi0gICAgICogZ2l2ZW4gYSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IHtAY29kZSBmaWxlfSwgdGhlIGZvbGxvd2luZyBpcyB0cnVlOgotICAgICAqIDxwcmU+Ci0gICAgICogICBmb3IgYWxsIGkgaW4gWzAsIGZpbGUuZ2V0TWVzc2FnZVR5cGVDb3VudCgpKToKLSAgICAgKiAgICAgZmlsZS5nZXRNZXNzYWdlVHlwZShpKS5nZXRJbmRleCgpID09IGkKLSAgICAgKiA8L3ByZT4KLSAgICAgKiBTaW1pbGFybHksIGZvciBhIHtAbGluayBEZXNjcmlwdG9yfSB7QGNvZGUgbWVzc2FnZVR5cGV9OgotICAgICAqIDxwcmU+Ci0gICAgICogICBmb3IgYWxsIGkgaW4gWzAsIG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVDb3VudCgpKToKLSAgICAgKiAgICAgbWVzc2FnZVR5cGUuZ2V0TmVzdGVkVHlwZShpKS5nZXRJbmRleCgpID09IGkKLSAgICAgKiA8L3ByZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KLQotICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsKLSAgICAgIHJldHVybiBwcm90bzsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB0eXBlJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHlwZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLCB3aXRoaW4gdGhlIHByb3RvIGxhbmd1YWdlJ3MKLSAgICAgKiBuYW1lc3BhY2UuICBUaGlzIGRpZmZlcnMgZnJvbSB0aGUgSmF2YSBuYW1lLiAgRm9yIGV4YW1wbGUsIGdpdmVuIHRoaXMKLSAgICAgKiB7QGNvZGUgLnByb3RvfToKLSAgICAgKiA8cHJlPgotICAgICAqICAgcGFja2FnZSBmb28uYmFyOwotICAgICAqICAgb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZXhhbXBsZS5wcm90b3MiCi0gICAgICogICBtZXNzYWdlIEJheiB7fQotICAgICAqIDwvcHJlPgotICAgICAqIHtAY29kZSBCYXp9J3MgZnVsbCBuYW1lIGlzICJmb28uYmFyLkJheiIuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgIHJldHVybiBmdWxsTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgewotICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqIElmIHRoaXMgaXMgYSBuZXN0ZWQgdHlwZSwgZ2V0IHRoZSBvdXRlciBkZXNjcmlwdG9yLCBvdGhlcndpc2UgbnVsbC4gKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRDb250YWluaW5nVHlwZSgpIHsgcmV0dXJuIGNvbnRhaW5pbmdUeXBlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGNvZGUgTWVzc2FnZU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KLSAgICBwdWJsaWMgTWVzc2FnZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBmaWVsZHMuICovCi0gICAgcHVibGljIExpc3Q8RmllbGREZXNjcmlwdG9yPiBnZXRGaWVsZHMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGZpZWxkcykpOwotICAgIH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgb25lb2ZzLiAqLwotICAgIHB1YmxpYyBMaXN0PE9uZW9mRGVzY3JpcHRvcj4gZ2V0T25lb2ZzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChvbmVvZnMpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IGEgbGlzdCBvZiB0aGlzIG1lc3NhZ2UgdHlwZSdzIGV4dGVuc2lvbnMuICovCi0gICAgcHVibGljIExpc3Q8RmllbGREZXNjcmlwdG9yPiBnZXRFeHRlbnNpb25zKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChleHRlbnNpb25zKSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgbWVzc2FnZSB0eXBlcyBuZXN0ZWQgd2l0aGluIHRoaXMgb25lLiAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0b3I+IGdldE5lc3RlZFR5cGVzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChuZXN0ZWRUeXBlcykpOwotICAgIH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIGVudW0gdHlwZXMgbmVzdGVkIHdpdGhpbiB0aGlzIG9uZS4gKi8KLSAgICBwdWJsaWMgTGlzdDxFbnVtRGVzY3JpcHRvcj4gZ2V0RW51bVR5cGVzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChlbnVtVHlwZXMpKTsKLSAgICB9Ci0KLSAgICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIGFuIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuc2lvbk51bWJlcihmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICBmb3IgKGZpbmFsIERlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSByYW5nZSA6Ci0gICAgICAgICAgcHJvdG8uZ2V0RXh0ZW5zaW9uUmFuZ2VMaXN0KCkpIHsKLSAgICAgICAgaWYgKHJhbmdlLmdldFN0YXJ0KCkgPD0gbnVtYmVyICYmIG51bWJlciA8IHJhbmdlLmdldEVuZCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIHJlc2VydmVkLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzZXJ2ZWROdW1iZXIoZmluYWwgaW50IG51bWJlcikgewotICAgICAgZm9yIChmaW5hbCBEZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByYW5nZSA6Ci0gICAgICAgICAgcHJvdG8uZ2V0UmVzZXJ2ZWRSYW5nZUxpc3QoKSkgewotICAgICAgICBpZiAocmFuZ2UuZ2V0U3RhcnQoKSA8PSBudW1iZXIgJiYgbnVtYmVyIDwgcmFuZ2UuZ2V0RW5kKCkpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qKiBEZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmaWVsZCBuYW1lIGlzIHJlc2VydmVkLiAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVzZXJ2ZWROYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICBpZiAobmFtZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgZm9yIChmaW5hbCBTdHJpbmcgcmVzZXJ2ZWROYW1lIDogcHJvdG8uZ2V0UmVzZXJ2ZWROYW1lTGlzdCgpKSB7Ci0gICAgICAgIGlmIChyZXNlcnZlZE5hbWUuZXF1YWxzKG5hbWUpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciB0aGUgbWVzc2FnZSBjYW4gYmUgZXh0ZW5kZWQuICBUaGF0IGlzLCB3aGV0aGVyIGl0IGhhcwotICAgICAqIGFueSAiZXh0ZW5zaW9ucyB4IHRvIHkiIHJhbmdlcyBkZWNsYXJlZCBvbiBpdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuZGFibGUoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0RXh0ZW5zaW9uUmFuZ2VMaXN0KCkuc2l6ZSgpICE9IDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYSBmaWVsZCBieSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWVsZCAoZS5nLiAiZm9vIikuCi0gICAgICogQHJldHVybiBUaGUgZmllbGQncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZmluZEZpZWxkQnlOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPQotICAgICAgICAgIGZpbGUucG9vbC5maW5kU3ltYm9sKGZ1bGxOYW1lICsgJy4nICsgbmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRmllbGREZXNjcmlwdG9yKSB7Ci0gICAgICAgIHJldHVybiAoRmllbGREZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGEgZmllbGQgYnkgZmllbGQgbnVtYmVyLgotICAgICAqIEBwYXJhbSBudW1iZXIgVGhlIGZpZWxkIG51bWJlciB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUuCi0gICAgICogQHJldHVybiBUaGUgZmllbGQncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZmluZEZpZWxkQnlOdW1iZXIoZmluYWwgaW50IG51bWJlcikgewotICAgICAgcmV0dXJuIGZpbGUucG9vbC5maWVsZHNCeU51bWJlci5nZXQoCi0gICAgICAgIG5ldyBEZXNjcmlwdG9yUG9vbC5EZXNjcmlwdG9ySW50UGFpcih0aGlzLCBudW1iZXIpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhIG5lc3RlZCBtZXNzYWdlIHR5cGUgYnkgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbmVzdGVkIHR5cGUgKGUuZy4gIkZvbyIpLgotICAgICAqIEByZXR1cm4gVGhlIHR5cGVzJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBmaW5kTmVzdGVkVHlwZUJ5TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0KLSAgICAgICAgICBmaWxlLnBvb2wuZmluZFN5bWJvbChmdWxsTmFtZSArICcuJyArIG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLSAgICAgICAgcmV0dXJuIChEZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGEgbmVzdGVkIGVudW0gdHlwZSBieSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBuZXN0ZWQgdHlwZSAoZS5nLiAiRm9vIikuCi0gICAgICogQHJldHVybiBUaGUgdHlwZXMncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvciBmaW5kRW51bVR5cGVCeU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9Ci0gICAgICAgICAgZmlsZS5wb29sLmZpbmRTeW1ib2woZnVsbE5hbWUgKyAnLicgKyBuYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBFbnVtRGVzY3JpcHRvcikgewotICAgICAgICByZXR1cm4gKEVudW1EZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotICAgIHByaXZhdGUgRGVzY3JpcHRvclByb3RvIHByb3RvOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOwotICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yW10gbmVzdGVkVHlwZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFbnVtRGVzY3JpcHRvcltdIGVudW1UeXBlczsKLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkRGVzY3JpcHRvcltdIGZpZWxkczsKLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkRGVzY3JpcHRvcltdIGV4dGVuc2lvbnM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPbmVvZkRlc2NyaXB0b3JbXSBvbmVvZnM7Ci0KLSAgICAvLyBVc2VkIHRvIGNyZWF0ZSBhIHBsYWNlaG9sZGVyIHdoZW4gdGhlIHR5cGUgY2Fubm90IGJlIGZvdW5kLgotICAgIERlc2NyaXB0b3IoZmluYWwgU3RyaW5nIGZ1bGxuYW1lKSB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgU3RyaW5nIG5hbWUgPSBmdWxsbmFtZTsKLSAgICAgIFN0cmluZyBwYWNrYWdlTmFtZSA9ICIiOwotICAgICAgaW50IHBvcyA9IGZ1bGxuYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICBpZiAocG9zICE9IC0xKSB7Ci0gICAgICAgIG5hbWUgPSBmdWxsbmFtZS5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgICAgIHBhY2thZ2VOYW1lID0gZnVsbG5hbWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgICB9Ci0gICAgICB0aGlzLmluZGV4ID0gMDsKLSAgICAgIHRoaXMucHJvdG8gPSBEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpLnNldE5hbWUobmFtZSkuYWRkRXh0ZW5zaW9uUmFuZ2UoCi0gICAgICAgICAgRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLm5ld0J1aWxkZXIoKS5zZXRTdGFydCgxKQotICAgICAgICAgIC5zZXRFbmQoNTM2ODcwOTEyKS5idWlsZCgpKS5idWlsZCgpOwotICAgICAgdGhpcy5mdWxsTmFtZSA9IGZ1bGxuYW1lOwotICAgICAgdGhpcy5jb250YWluaW5nVHlwZSA9IG51bGw7Ci0KLSAgICAgIHRoaXMubmVzdGVkVHlwZXMgPSBuZXcgRGVzY3JpcHRvclswXTsKLSAgICAgIHRoaXMuZW51bVR5cGVzID0gbmV3IEVudW1EZXNjcmlwdG9yWzBdOwotICAgICAgdGhpcy5maWVsZHMgPSBuZXcgRmllbGREZXNjcmlwdG9yWzBdOwotICAgICAgdGhpcy5leHRlbnNpb25zID0gbmV3IEZpZWxkRGVzY3JpcHRvclswXTsKLSAgICAgIHRoaXMub25lb2ZzID0gbmV3IE9uZW9mRGVzY3JpcHRvclswXTsKLQotICAgICAgLy8gQ3JlYXRlIGEgcGxhY2Vob2xkZXIgRmlsZURlc2NyaXB0b3IgdG8gaG9sZCB0aGlzIG1lc3NhZ2UuCi0gICAgICB0aGlzLmZpbGUgPSBuZXcgRmlsZURlc2NyaXB0b3IocGFja2FnZU5hbWUsIHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGVzY3JpcHRvcihmaW5hbCBEZXNjcmlwdG9yUHJvdG8gcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCi0gICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIHBhcmVudCwgcHJvdG8uZ2V0TmFtZSgpKTsKLSAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICBjb250YWluaW5nVHlwZSA9IHBhcmVudDsKLQotICAgICAgb25lb2ZzID0gbmV3IE9uZW9mRGVzY3JpcHRvcltwcm90by5nZXRPbmVvZkRlY2xDb3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0T25lb2ZEZWNsQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIG9uZW9mc1tpXSA9IG5ldyBPbmVvZkRlc2NyaXB0b3IoCi0gICAgICAgICAgcHJvdG8uZ2V0T25lb2ZEZWNsKGkpLCBmaWxlLCB0aGlzLCBpKTsKLSAgICAgIH0KLQotICAgICAgbmVzdGVkVHlwZXMgPSBuZXcgRGVzY3JpcHRvcltwcm90by5nZXROZXN0ZWRUeXBlQ291bnQoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldE5lc3RlZFR5cGVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgbmVzdGVkVHlwZXNbaV0gPSBuZXcgRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXROZXN0ZWRUeXBlKGkpLCBmaWxlLCB0aGlzLCBpKTsKLSAgICAgIH0KLQotICAgICAgZW51bVR5cGVzID0gbmV3IEVudW1EZXNjcmlwdG9yW3Byb3RvLmdldEVudW1UeXBlQ291bnQoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldEVudW1UeXBlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGVudW1UeXBlc1tpXSA9IG5ldyBFbnVtRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRFbnVtVHlwZShpKSwgZmlsZSwgdGhpcywgaSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZERlc2NyaXB0b3JbcHJvdG8uZ2V0RmllbGRDb3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RmllbGRDb3VudCgpOyBpKyspIHsKLSAgICAgICAgZmllbGRzW2ldID0gbmV3IEZpZWxkRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRGaWVsZChpKSwgZmlsZSwgdGhpcywgaSwgZmFsc2UpOwotICAgICAgfQotCi0gICAgICBleHRlbnNpb25zID0gbmV3IEZpZWxkRGVzY3JpcHRvcltwcm90by5nZXRFeHRlbnNpb25Db3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RXh0ZW5zaW9uQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGV4dGVuc2lvbnNbaV0gPSBuZXcgRmllbGREZXNjcmlwdG9yKAotICAgICAgICAgIHByb3RvLmdldEV4dGVuc2lvbihpKSwgZmlsZSwgdGhpcywgaSwgdHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0T25lb2ZEZWNsQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIG9uZW9mc1tpXS5maWVsZHMgPSBuZXcgRmllbGREZXNjcmlwdG9yW29uZW9mc1tpXS5nZXRGaWVsZENvdW50KCldOwotICAgICAgICBvbmVvZnNbaV0uZmllbGRDb3VudCA9IDA7Ci0gICAgICB9Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldEZpZWxkQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIE9uZW9mRGVzY3JpcHRvciBvbmVvZkRlc2NyaXB0b3IgPSBmaWVsZHNbaV0uZ2V0Q29udGFpbmluZ09uZW9mKCk7Ci0gICAgICAgIGlmIChvbmVvZkRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICAgIG9uZW9mRGVzY3JpcHRvci5maWVsZHNbb25lb2ZEZXNjcmlwdG9yLmZpZWxkQ291bnQrK10gPSBmaWVsZHNbaV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKiogTG9vayB1cCBhbmQgY3Jvc3MtbGluayBhbGwgZmllbGQgdHlwZXMsIGV0Yy4gKi8KLSAgICBwcml2YXRlIHZvaWQgY3Jvc3NMaW5rKCkgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIGZvciAoZmluYWwgRGVzY3JpcHRvciBuZXN0ZWRUeXBlIDogbmVzdGVkVHlwZXMpIHsKLSAgICAgICAgbmVzdGVkVHlwZS5jcm9zc0xpbmsoKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBmaWVsZHMpIHsKLSAgICAgICAgZmllbGQuY3Jvc3NMaW5rKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGV4dGVuc2lvbiA6IGV4dGVuc2lvbnMpIHsKLSAgICAgICAgZXh0ZW5zaW9uLmNyb3NzTGluaygpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRGVzY3JpcHRvclByb3RvIHByb3RvKSB7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgbmVzdGVkVHlwZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0TmVzdGVkVHlwZShpKSk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGVudW1UeXBlc1tpXS5zZXRQcm90byhwcm90by5nZXRFbnVtVHlwZShpKSk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGZpZWxkc1tpXS5zZXRQcm90byhwcm90by5nZXRGaWVsZChpKSk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9ucy5sZW5ndGg7IGkrKykgewotICAgICAgICBleHRlbnNpb25zW2ldLnNldFByb3RvKHByb3RvLmdldEV4dGVuc2lvbihpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKiogRGVzY3JpYmVzIGEgZmllbGQgb2YgYSBtZXNzYWdlIHR5cGUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmllbGREZXNjcmlwdG9yCi0gICAgICAgIGV4dGVuZHMgR2VuZXJpY0Rlc2NyaXB0b3IKLSAgICAgICAgaW1wbGVtZW50cyBDb21wYXJhYmxlPEZpZWxkRGVzY3JpcHRvcj4sCi0gICAgICAgICAgICAgICAgIEZpZWxkU2V0LkZpZWxkRGVzY3JpcHRvckxpdGU8RmllbGREZXNjcmlwdG9yPiB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCi0gICAgICogQHNlZSBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yI2dldEluZGV4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KLQotICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgewotICAgICAgcmV0dXJuIHByb3RvOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIGZpZWxkJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIGZpZWxkJ3MgbnVtYmVyLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkgewotICAgICAgcmV0dXJuIHByb3RvLmdldE51bWJlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmllbGQncyBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLSAgICAgKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0RnVsbE5hbWUoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0gICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgSlNPTiBuYW1lIG9mIHRoaXMgZmllbGQuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRKc29uTmFtZSgpIHsKLSAgICAgIHJldHVybiBqc29uTmFtZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZpZWxkJ3MgamF2YSB0eXBlLiAgVGhpcyBpcyBqdXN0IGZvciBjb252ZW5pZW5jZS4gIEV2ZXJ5Ci0gICAgICoge0Bjb2RlIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGV9IG1hcHMgdG8gZXhhY3RseSBvbmUgSmF2YSB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsgcmV0dXJuIHR5cGUuZ2V0SmF2YVR5cGUoKTsgfQotCi0gICAgLyoqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgV2lyZUZvcm1hdC5KYXZhVHlwZSBnZXRMaXRlSmF2YVR5cGUoKSB7Ci0gICAgICByZXR1cm4gZ2V0TGl0ZVR5cGUoKS5nZXRKYXZhVHlwZSgpOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHtAY29kZSBGaWxlRGVzY3JpcHRvcn0gY29udGFpbmluZyB0aGlzIGRlc2NyaXB0b3IuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7Ci0gICAgICByZXR1cm4gZmlsZTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBmaWVsZCdzIGRlY2xhcmVkIHR5cGUuICovCi0gICAgcHVibGljIFR5cGUgZ2V0VHlwZSgpIHsgcmV0dXJuIHR5cGU7IH0KLQotICAgIC8qKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCkgewotICAgICAgcmV0dXJuIHRhYmxlW3R5cGUub3JkaW5hbCgpXTsKLSAgICB9Ci0KLSAgICAvKiogRm9yIGludGVybmFsIHVzZSBvbmx5LiAqLwotICAgIHB1YmxpYyBib29sZWFuIG5lZWRzVXRmOENoZWNrKCkgewotICAgICAgaWYgKHR5cGUgIT0gVHlwZS5TVFJJTkcpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgaWYgKGdldENvbnRhaW5pbmdUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1hcEVudHJ5KCkpIHsKLSAgICAgICAgLy8gQWx3YXlzIGVuZm9yY2Ugc3RyaWN0IFVURi04IGNoZWNraW5nIGZvciBtYXAgZmllbGRzLgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChnZXRGaWxlKCkuZ2V0U3ludGF4KCkgPT0gU3ludGF4LlBST1RPMykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBnZXRGaWxlKCkuZ2V0T3B0aW9ucygpLmdldEphdmFTdHJpbmdDaGVja1V0ZjgoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc01hcEZpZWxkKCkgewotICAgICAgcmV0dXJuIGdldFR5cGUoKSA9PSBUeXBlLk1FU1NBR0UgJiYgaXNSZXBlYXRlZCgpCi0gICAgICAgICAgJiYgZ2V0TWVzc2FnZVR5cGUoKS5nZXRPcHRpb25zKCkuZ2V0TWFwRW50cnkoKTsKLSAgICB9Ci0KLSAgICAvLyBJJ20gcHJldHR5IHN1cmUgdmFsdWVzKCkgY29uc3RydWN0cyBhIG5ldyBhcnJheSBldmVyeSB0aW1lLCBzaW5jZSB0aGVyZQotICAgIC8vIGlzIG5vdGhpbmcgc3RvcHBpbmcgdGhlIGNhbGxlciBmcm9tIG11dGF0aW5nIHRoZSBhcnJheS4gIFRoZXJlZm9yZSB3ZQotICAgIC8vIG1ha2UgYSBzdGF0aWMgY29weSBoZXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlW10gdGFibGUgPQotICAgICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZS52YWx1ZXMoKTsKLQotICAgIC8qKiBJcyB0aGlzIGZpZWxkIGRlY2xhcmVkIHJlcXVpcmVkPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0TGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICAvKiogSXMgdGhpcyBmaWVsZCBkZWNsYXJlZCBvcHRpb25hbD8gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotICAgICAgcmV0dXJuIHByb3RvLmdldExhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfT1BUSU9OQUw7Ci0gICAgfQotCi0gICAgLyoqIElzIHRoaXMgZmllbGQgZGVjbGFyZWQgcmVwZWF0ZWQ/ICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRlZCgpIHsKLSAgICAgIHJldHVybiBwcm90by5nZXRMYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX1JFUEVBVEVEOwotICAgIH0KLQotICAgIC8qKiBEb2VzIHRoaXMgZmllbGQgaGF2ZSB0aGUge0Bjb2RlIFtwYWNrZWQgPSB0cnVlXX0gb3B0aW9uIG9yIGlzIHRoaXMgZmllbGQKLSAgICAgKiAgcGFja2FibGUgaW4gcHJvdG8zIGFuZCBub3QgZXhwbGljaXRseSBzZXR0ZWQgdG8gdW5wYWNrZWQ/Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYWNrZWQoKSB7Ci0gICAgICBpZiAoIWlzUGFja2FibGUoKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2V0RmlsZSgpLmdldFN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yLlN5bnRheC5QUk9UTzIpIHsKLSAgICAgICAgcmV0dXJuIGdldE9wdGlvbnMoKS5nZXRQYWNrZWQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAhZ2V0T3B0aW9ucygpLmhhc1BhY2tlZCgpIHx8IGdldE9wdGlvbnMoKS5nZXRQYWNrZWQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2FuIHRoaXMgZmllbGQgYmUgcGFja2VkPyBpLmUuIGlzIGl0IGEgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2FibGUoKSB7Ci0gICAgICByZXR1cm4gaXNSZXBlYXRlZCgpICYmIGdldExpdGVUeXBlKCkuaXNQYWNrYWJsZSgpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGhhZCBhbiBleHBsaWNpdGx5LWRlZmluZWQgZGVmYXVsdCB2YWx1ZS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNEZWZhdWx0VmFsdWUoKSB7IHJldHVybiBwcm90by5oYXNEZWZhdWx0VmFsdWUoKTsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmllbGQncyBkZWZhdWx0IHZhbHVlLiAgVmFsaWQgZm9yIGFsbCB0eXBlcyBleGNlcHQgZm9yCi0gICAgICogbWVzc2FnZXMgYW5kIGdyb3Vwcy4gIEZvciBhbGwgb3RoZXIgdHlwZXMsIHRoZSBvYmplY3QgcmV0dXJuZWQgaXMgb2YKLSAgICAgKiB0aGUgc2FtZSBjbGFzcyB0aGF0IHdvdWxkIHJldHVybmVkIGJ5IE1lc3NhZ2UuZ2V0RmllbGQodGhpcykuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKSB7Ci0gICAgICBpZiAoZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiRmllbGREZXNjcmlwdG9yLmdldERlZmF1bHRWYWx1ZSgpIGNhbGxlZCBvbiBhbiBlbWJlZGRlZCBtZXNzYWdlICIgKwotICAgICAgICAgICJmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUge0Bjb2RlIEZpZWxkT3B0aW9uc30sIGRlZmluZWQgaW4ge0Bjb2RlIGRlc2NyaXB0b3IucHJvdG99LiAqLwotICAgIHB1YmxpYyBGaWVsZE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQotCi0gICAgLyoqIElzIHRoaXMgZmllbGQgYW4gZXh0ZW5zaW9uPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uKCkgeyByZXR1cm4gcHJvdG8uaGFzRXh0ZW5kZWUoKTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmaWVsZCdzIGNvbnRhaW5pbmcgdHlwZS4gRm9yIGV4dGVuc2lvbnMsIHRoaXMgaXMgdGhlIHR5cGUgYmVpbmcKLSAgICAgKiBleHRlbmRlZCwgbm90IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZXh0ZW5zaW9uIHdhcyBkZWZpbmVkLiAgU2VlCi0gICAgICoge0BsaW5rICNnZXRFeHRlbnNpb25TY29wZSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRDb250YWluaW5nVHlwZSgpIHsgcmV0dXJuIGNvbnRhaW5pbmdUeXBlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSBmaWVsZCdzIGNvbnRhaW5pbmcgb25lb2YuICovCi0gICAgcHVibGljIE9uZW9mRGVzY3JpcHRvciBnZXRDb250YWluaW5nT25lb2YoKSB7IHJldHVybiBjb250YWluaW5nT25lb2Y7IH0KLQotICAgIC8qKgotICAgICAqIEZvciBleHRlbnNpb25zIGRlZmluZWQgbmVzdGVkIHdpdGhpbiBtZXNzYWdlIHR5cGVzLCBnZXRzIHRoZSBvdXRlcgotICAgICAqIHR5cGUuICBOb3QgdmFsaWQgZm9yIG5vbi1leHRlbnNpb24gZmllbGRzLiAgRm9yIGV4YW1wbGUsIGNvbnNpZGVyCi0gICAgICogdGhpcyB7QGNvZGUgLnByb3RvfSBmaWxlOgotICAgICAqIDxwcmU+Ci0gICAgICogICBtZXNzYWdlIEZvbyB7Ci0gICAgICogICAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci0gICAgICogICB9Ci0gICAgICogICBleHRlbmQgRm9vIHsKLSAgICAgKiAgICAgb3B0aW9uYWwgaW50MzIgYmF6ID0gMTIzNDsKLSAgICAgKiAgIH0KLSAgICAgKiAgIG1lc3NhZ2UgQmFyIHsKLSAgICAgKiAgICAgZXh0ZW5kIEZvbyB7Ci0gICAgICogICAgICAgb3B0aW9uYWwgaW50MzIgcXV4ID0gNDMyMTsKLSAgICAgKiAgICAgfQotICAgICAqICAgfQotICAgICAqIDwvcHJlPgotICAgICAqIEJvdGgge0Bjb2RlIGJhen0ncyBhbmQge0Bjb2RlIHF1eH0ncyBjb250YWluaW5nIHR5cGUgaXMge0Bjb2RlIEZvb30uCi0gICAgICogSG93ZXZlciwge0Bjb2RlIGJhen0ncyBleHRlbnNpb24gc2NvcGUgaXMge0Bjb2RlIG51bGx9IHdoaWxlCi0gICAgICoge0Bjb2RlIHF1eH0ncyBleHRlbnNpb24gc2NvcGUgaXMge0Bjb2RlIEJhcn0uCi0gICAgICovCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0RXh0ZW5zaW9uU2NvcGUoKSB7Ci0gICAgICBpZiAoIWlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJUaGlzIGZpZWxkIGlzIG5vdCBhbiBleHRlbnNpb24uIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uU2NvcGU7Ci0gICAgfQotCi0gICAgLyoqIEZvciBlbWJlZGRlZCBtZXNzYWdlIGFuZCBncm91cCBmaWVsZHMsIGdldHMgdGhlIGZpZWxkJ3MgdHlwZS4gKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRNZXNzYWdlVHlwZSgpIHsKLSAgICAgIGlmIChnZXRKYXZhVHlwZSgpICE9IEphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJUaGlzIGZpZWxkIGlzIG5vdCBvZiBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWVzc2FnZVR5cGU7Ci0gICAgfQotCi0gICAgLyoqIEZvciBlbnVtIGZpZWxkcywgZ2V0cyB0aGUgZmllbGQncyB0eXBlLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFbnVtRGVzY3JpcHRvciBnZXRFbnVtVHlwZSgpIHsKLSAgICAgIGlmIChnZXRKYXZhVHlwZSgpICE9IEphdmFUeXBlLkVOVU0pIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJUaGlzIGZpZWxkIGlzIG5vdCBvZiBlbnVtIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZW51bVR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZSB3aXRoIGFub3RoZXIge0Bjb2RlIEZpZWxkRGVzY3JpcHRvcn0uICBUaGlzIG9yZGVycyBmaWVsZHMgaW4KLSAgICAgKiAiY2Fub25pY2FsIiBvcmRlciwgd2hpY2ggc2ltcGx5IG1lYW5zIGFzY2VuZGluZyBvcmRlciBieSBmaWVsZCBudW1iZXIuCi0gICAgICoge0Bjb2RlIG90aGVyfSBtdXN0IGJlIGEgZmllbGQgb2YgdGhlIHNhbWUgdHlwZSAtLSBpLmUuCi0gICAgICoge0Bjb2RlIGdldENvbnRhaW5pbmdUeXBlKCl9IG11c3QgcmV0dXJuIHRoZSBzYW1lIHtAY29kZSBEZXNjcmlwdG9yfSBmb3IKLSAgICAgKiBib3RoIGZpZWxkcy4KLSAgICAgKgotICAgICAqIEByZXR1cm4gbmVnYXRpdmUsIHplcm8sIG9yIHBvc2l0aXZlIGlmIHtAY29kZSB0aGlzfSBpcyBsZXNzIHRoYW4sCi0gICAgICogICAgICAgICBlcXVhbCB0bywgb3IgZ3JlYXRlciB0aGFuIHtAY29kZSBvdGhlcn0sIHJlc3BlY3RpdmVseS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGNvbXBhcmVUbyhmaW5hbCBGaWVsZERlc2NyaXB0b3Igb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlci5jb250YWluaW5nVHlwZSAhPSBjb250YWluaW5nVHlwZSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JzIGNhbiBvbmx5IGJlIGNvbXBhcmVkIHRvIG90aGVyIEZpZWxkRGVzY3JpcHRvcnMgIiArCi0gICAgICAgICAgImZvciBmaWVsZHMgb2YgdGhlIHNhbWUgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGdldE51bWJlcigpIC0gb3RoZXIuZ2V0TnVtYmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgIHJldHVybiBnZXRGdWxsTmFtZSgpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0gICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBqc29uTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGV4dGVuc2lvblNjb3BlOwotCi0gICAgLy8gUG9zc2libHkgaW5pdGlhbGl6ZWQgZHVyaW5nIGNyb3NzLWxpbmtpbmcuCi0gICAgcHJpdmF0ZSBUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlOwotICAgIHByaXZhdGUgRGVzY3JpcHRvciBtZXNzYWdlVHlwZTsKLSAgICBwcml2YXRlIE9uZW9mRGVzY3JpcHRvciBjb250YWluaW5nT25lb2Y7Ci0gICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZTsKLSAgICBwcml2YXRlIE9iamVjdCBkZWZhdWx0VmFsdWU7Ci0KLSAgICBwdWJsaWMgZW51bSBUeXBlIHsKLSAgICAgIERPVUJMRSAgKEphdmFUeXBlLkRPVUJMRSAgICAgKSwKLSAgICAgIEZMT0FUICAgKEphdmFUeXBlLkZMT0FUICAgICAgKSwKLSAgICAgIElOVDY0ICAgKEphdmFUeXBlLkxPTkcgICAgICAgKSwKLSAgICAgIFVJTlQ2NCAgKEphdmFUeXBlLkxPTkcgICAgICAgKSwKLSAgICAgIElOVDMyICAgKEphdmFUeXBlLklOVCAgICAgICAgKSwKLSAgICAgIEZJWEVENjQgKEphdmFUeXBlLkxPTkcgICAgICAgKSwKLSAgICAgIEZJWEVEMzIgKEphdmFUeXBlLklOVCAgICAgICAgKSwKLSAgICAgIEJPT0wgICAgKEphdmFUeXBlLkJPT0xFQU4gICAgKSwKLSAgICAgIFNUUklORyAgKEphdmFUeXBlLlNUUklORyAgICAgKSwKLSAgICAgIEdST1VQICAgKEphdmFUeXBlLk1FU1NBR0UgICAgKSwKLSAgICAgIE1FU1NBR0UgKEphdmFUeXBlLk1FU1NBR0UgICAgKSwKLSAgICAgIEJZVEVTICAgKEphdmFUeXBlLkJZVEVfU1RSSU5HKSwKLSAgICAgIFVJTlQzMiAgKEphdmFUeXBlLklOVCAgICAgICAgKSwKLSAgICAgIEVOVU0gICAgKEphdmFUeXBlLkVOVU0gICAgICAgKSwKLSAgICAgIFNGSVhFRDMyKEphdmFUeXBlLklOVCAgICAgICAgKSwKLSAgICAgIFNGSVhFRDY0KEphdmFUeXBlLkxPTkcgICAgICAgKSwKLSAgICAgIFNJTlQzMiAgKEphdmFUeXBlLklOVCAgICAgICAgKSwKLSAgICAgIFNJTlQ2NCAgKEphdmFUeXBlLkxPTkcgICAgICAgKTsKLQotICAgICAgVHlwZShmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZSkgewotICAgICAgICB0aGlzLmphdmFUeXBlID0gamF2YVR5cGU7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgSmF2YVR5cGUgamF2YVR5cGU7Ci0KLSAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHRvUHJvdG8oKSB7Ci0gICAgICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLmZvck51bWJlcihvcmRpbmFsKCkgKyAxKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsgcmV0dXJuIGphdmFUeXBlOyB9Ci0KLSAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSB2YWx1ZU9mKGZpbmFsIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gdmFsdWVzKClbdHlwZS5nZXROdW1iZXIoKSAtIDFdOwotICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB7Ci0gICAgICAvLyBSZWZ1c2UgdG8gaW5pdCBpZiBzb21lb25lIGFkZGVkIGEgbmV3IGRlY2xhcmVkIHR5cGUuCi0gICAgICBpZiAoVHlwZS52YWx1ZXMoKS5sZW5ndGggIT0gRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZS52YWx1ZXMoKS5sZW5ndGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIiIKLSAgICAgICAgICAgICsgImRlc2NyaXB0b3IucHJvdG8gaGFzIGEgbmV3IGRlY2xhcmVkIHR5cGUgYnV0IERlc2NyaXB0b3JzLmphdmEgIgotICAgICAgICAgICAgKyAid2Fzbid0IHVwZGF0ZWQuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIGVudW0gSmF2YVR5cGUgewotICAgICAgSU5UKDApLAotICAgICAgTE9ORygwTCksCi0gICAgICBGTE9BVCgwRiksCi0gICAgICBET1VCTEUoMEQpLAotICAgICAgQk9PTEVBTihmYWxzZSksCi0gICAgICBTVFJJTkcoIiIpLAotICAgICAgQllURV9TVFJJTkcoQnl0ZVN0cmluZy5FTVBUWSksCi0gICAgICBFTlVNKG51bGwpLAotICAgICAgTUVTU0FHRShudWxsKTsKLQotICAgICAgSmF2YVR5cGUoZmluYWwgT2JqZWN0IGRlZmF1bHREZWZhdWx0KSB7Ci0gICAgICAgIHRoaXMuZGVmYXVsdERlZmF1bHQgPSBkZWZhdWx0RGVmYXVsdDsKLSAgICAgIH0KLQotICAgICAgLyoqCi0gICAgICAgKiBUaGUgZGVmYXVsdCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLCBpZiBpdCdzIGEgcHJpbWl0aXZlCi0gICAgICAgKiB0eXBlLiAgVGhpcyBpcyBtZWFudCBmb3IgdXNlIGluc2lkZSB0aGlzIGZpbGUgb25seSwgaGVuY2UgaXMgcHJpdmF0ZS4KLSAgICAgICAqLwotICAgICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdERlZmF1bHQ7Ci0gICAgfQotCi0gICAgLy8gVE9ETyh4aWFvZmVuZyk6IEltcGxlbWVudCBpdCBjb25zaXN0ZW50bHkgYWNyb3NzIGRpZmZlcmVudCBsYW5ndWFnZXMuIFNlZSBiLzI0NzUxMzQ4LgotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBmaWVsZE5hbWVUb0xvd2VyQ2FtZWxDYXNlKFN0cmluZyBuYW1lKSB7Ci0gICAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKG5hbWUubGVuZ3RoKCkpOwotICAgICAgYm9vbGVhbiBpc05leHRVcHBlckNhc2UgPSBmYWxzZTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIENoYXJhY3RlciBjaCA9IG5hbWUuY2hhckF0KGkpOwotICAgICAgICBpZiAoQ2hhcmFjdGVyLmlzTG93ZXJDYXNlKGNoKSkgewotICAgICAgICAgIGlmIChpc05leHRVcHBlckNhc2UpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoQ2hhcmFjdGVyLnRvVXBwZXJDYXNlKGNoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY2gpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpc05leHRVcHBlckNhc2UgPSBmYWxzZTsKLSAgICAgICAgfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY2gpKSB7Ci0gICAgICAgICAgaWYgKGkgPT0gMCkgewotICAgICAgICAgICAgLy8gRm9yY2UgZmlyc3QgbGV0dGVyIHRvIGxvd2VyLWNhc2UuCi0gICAgICAgICAgICByZXN1bHQuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaCkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBDYXBpdGFsIGxldHRlcnMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBsZWZ0IGFzLWlzLgotICAgICAgICAgICAgcmVzdWx0LmFwcGVuZChjaCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlzTmV4dFVwcGVyQ2FzZSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgaWYgKENoYXJhY3Rlci5pc0RpZ2l0KGNoKSkgewotICAgICAgICAgIHJlc3VsdC5hcHBlbmQoY2gpOwotICAgICAgICAgIGlzTmV4dFVwcGVyQ2FzZSA9IGZhbHNlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlzTmV4dFVwcGVyQ2FzZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEZpZWxkRGVzY3JpcHRvcihmaW5hbCBGaWVsZERlc2NyaXB0b3JQcm90byBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIGlzRXh0ZW5zaW9uKQotICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIHBhcmVudCwgcHJvdG8uZ2V0TmFtZSgpKTsKLSAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICBpZiAocHJvdG8uaGFzSnNvbk5hbWUoKSkgewotICAgICAgICBqc29uTmFtZSA9IHByb3RvLmdldEpzb25OYW1lKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBqc29uTmFtZSA9IGZpZWxkTmFtZVRvTG93ZXJDYW1lbENhc2UocHJvdG8uZ2V0TmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgaWYgKHByb3RvLmhhc1R5cGUoKSkgewotICAgICAgICB0eXBlID0gVHlwZS52YWx1ZU9mKHByb3RvLmdldFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChnZXROdW1iZXIoKSA8PSAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICJGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc0V4dGVuc2lvbikgewotICAgICAgICBpZiAoIXByb3RvLmhhc0V4dGVuZGVlKCkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBub3Qgc2V0IGZvciBleHRlbnNpb24gZmllbGQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGFpbmluZ1R5cGUgPSBudWxsOyAgLy8gV2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nCi0gICAgICAgIGlmIChwYXJlbnQgIT0gbnVsbCkgewotICAgICAgICAgIGV4dGVuc2lvblNjb3BlID0gcGFyZW50OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGV4dGVuc2lvblNjb3BlID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChwcm90by5oYXNPbmVvZkluZGV4KCkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5vbmVvZl9pbmRleCBzZXQgZm9yIGV4dGVuc2lvbiBmaWVsZC4iKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluaW5nT25lb2YgPSBudWxsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHByb3RvLmhhc0V4dGVuZGVlKCkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBzZXQgZm9yIG5vbi1leHRlbnNpb24gZmllbGQuIik7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGFpbmluZ1R5cGUgPSBwYXJlbnQ7Ci0KLSAgICAgICAgaWYgKHByb3RvLmhhc09uZW9mSW5kZXgoKSkgewotICAgICAgICAgIGlmIChwcm90by5nZXRPbmVvZkluZGV4KCkgPCAwIHx8Ci0gICAgICAgICAgICAgIHByb3RvLmdldE9uZW9mSW5kZXgoKSA+PSBwYXJlbnQudG9Qcm90bygpLmdldE9uZW9mRGVjbENvdW50KCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXggaXMgb3V0IG9mIHJhbmdlIGZvciB0eXBlICIKLSAgICAgICAgICAgICAgKyBwYXJlbnQuZ2V0TmFtZSgpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY29udGFpbmluZ09uZW9mID0gcGFyZW50LmdldE9uZW9mcygpLmdldChwcm90by5nZXRPbmVvZkluZGV4KCkpOwotICAgICAgICAgIGNvbnRhaW5pbmdPbmVvZi5maWVsZENvdW50Kys7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY29udGFpbmluZ09uZW9mID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICBleHRlbnNpb25TY29wZSA9IG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqIExvb2sgdXAgYW5kIGNyb3NzLWxpbmsgYWxsIGZpZWxkIHR5cGVzLCBldGMuICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyb3NzTGluaygpIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICBpZiAocHJvdG8uaGFzRXh0ZW5kZWUoKSkgewotICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBleHRlbmRlZSA9Ci0gICAgICAgICAgZmlsZS5wb29sLmxvb2t1cFN5bWJvbChwcm90by5nZXRFeHRlbmRlZSgpLCB0aGlzLAotICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbC5TZWFyY2hGaWx0ZXIuVFlQRVNfT05MWSk7Ci0gICAgICAgIGlmICghKGV4dGVuZGVlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldEV4dGVuZGVlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRhaW5pbmdUeXBlID0gKERlc2NyaXB0b3IpZXh0ZW5kZWU7Ci0KLSAgICAgICAgaWYgKCFnZXRDb250YWluaW5nVHlwZSgpLmlzRXh0ZW5zaW9uTnVtYmVyKGdldE51bWJlcigpKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAnXCInICsgZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRGdWxsTmFtZSgpICsKLSAgICAgICAgICAgICAgIlwiIGRvZXMgbm90IGRlY2xhcmUgIiArIGdldE51bWJlcigpICsKLSAgICAgICAgICAgICAgIiBhcyBhbiBleHRlbnNpb24gbnVtYmVyLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwcm90by5oYXNUeXBlTmFtZSgpKSB7Ci0gICAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHR5cGVEZXNjcmlwdG9yID0KLSAgICAgICAgICBmaWxlLnBvb2wubG9va3VwU3ltYm9sKHByb3RvLmdldFR5cGVOYW1lKCksIHRoaXMsCi0gICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sLlNlYXJjaEZpbHRlci5UWVBFU19PTkxZKTsKLQotICAgICAgICBpZiAoIXByb3RvLmhhc1R5cGUoKSkgewotICAgICAgICAgIC8vIENob29zZSBmaWVsZCB0eXBlIGJhc2VkIG9uIHN5bWJvbC4KLSAgICAgICAgICBpZiAodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICB0eXBlID0gVHlwZS5NRVNTQUdFOwotICAgICAgICAgIH0gZWxzZSBpZiAodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBFbnVtRGVzY3JpcHRvcikgewotICAgICAgICAgICAgdHlwZSA9IFR5cGUuRU5VTTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCi0gICAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldFR5cGVOYW1lKCkgKyAiXCIgaXMgbm90IGEgdHlwZS4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgaWYgKCEodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCi0gICAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldFR5cGVOYW1lKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtZXNzYWdlVHlwZSA9IChEZXNjcmlwdG9yKXR5cGVEZXNjcmlwdG9yOwotCi0gICAgICAgICAgaWYgKHByb3RvLmhhc0RlZmF1bHRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICAgIk1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuRU5VTSkgewotICAgICAgICAgIGlmICghKHR5cGVEZXNjcmlwdG9yIGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICAgICAnXCInICsgcHJvdG8uZ2V0VHlwZU5hbWUoKSArICJcIiBpcyBub3QgYW4gZW51bSB0eXBlLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBlbnVtVHlwZSA9IChFbnVtRGVzY3JpcHRvcil0eXBlRGVzY3JpcHRvcjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICJGaWVsZCB3aXRoIHByaW1pdGl2ZSB0eXBlIGhhcyB0eXBlX25hbWUuIik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChnZXRKYXZhVHlwZSgpID09IEphdmFUeXBlLk1FU1NBR0UgfHwKLSAgICAgICAgICAgIGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuRU5VTSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgIkZpZWxkIHdpdGggbWVzc2FnZSBvciBlbnVtIHR5cGUgbWlzc2luZyB0eXBlX25hbWUuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gT25seSByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIG1heSBiZSBwYWNrZWQuCi0gICAgICBpZiAocHJvdG8uZ2V0T3B0aW9ucygpLmdldFBhY2tlZCgpICYmICFpc1BhY2thYmxlKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCi0gICAgICAgICAgIltwYWNrZWQgPSB0cnVlXSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSAiICsKLSAgICAgICAgICAiZmllbGRzLiIpOwotICAgICAgfQotCi0gICAgICAvLyBXZSBkb24ndCBhdHRlbXB0IHRvIHBhcnNlIHRoZSBkZWZhdWx0IHZhbHVlIHVudGlsIGhlcmUgYmVjYXVzZSBmb3IKLSAgICAgIC8vIGVudW1zIHdlIG5lZWQgdGhlIGVudW0gdHlwZSdzIGRlc2NyaXB0b3IuCi0gICAgICBpZiAocHJvdG8uaGFzRGVmYXVsdFZhbHVlKCkpIHsKLSAgICAgICAgaWYgKGlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgIlJlcGVhdGVkIGZpZWxkcyBjYW5ub3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgc3dpdGNoIChnZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIFNJTlQzMjoKLSAgICAgICAgICAgIGNhc2UgU0ZJWEVEMzI6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VJbnQzMihwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIEZJWEVEMzI6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VVSW50MzIocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5UNjQ6Ci0gICAgICAgICAgICBjYXNlIFNJTlQ2NDoKLSAgICAgICAgICAgIGNhc2UgU0ZJWEVENjQ6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VJbnQ2NChwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBVSU5UNjQ6Ci0gICAgICAgICAgICBjYXNlIEZJWEVENjQ6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VVSW50NjQocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRkxPQVQ6Ci0gICAgICAgICAgICAgIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoImluZiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCItaW5mIikpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBGbG9hdC5ORUdBVElWRV9JTkZJTklUWTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIm5hbiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRmxvYXQuTmFOOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEZsb2F0LnZhbHVlT2YocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBET1VCTEU6Ci0gICAgICAgICAgICAgIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoImluZiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiLWluZiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygibmFuIikpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBEb3VibGUuTmFOOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvdWJsZS52YWx1ZU9mKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQk9PTDoKLSAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCWVRFUzoKLSAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPQotICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGVudW1UeXBlLmZpbmRWYWx1ZUJ5TmFtZShwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAgICAgIlVua25vd24gZW51bSBkZWZhdWx0IHZhbHVlOiBcIiIgKwotICAgICAgICAgICAgICAgICAgcHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkgKyAnXCInKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgIGNhc2UgR1JPVVA6Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgaGFkIGRlZmF1bHQgdmFsdWUuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAiQ291bGQgbm90IHBhcnNlIGRlZmF1bHQgdmFsdWU6IFwiIiArCi0gICAgICAgICAgICAgIHByb3RvLmdldERlZmF1bHRWYWx1ZSgpICsgJ1wiJywgZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIERldGVybWluZSB0aGUgZGVmYXVsdCBkZWZhdWx0IGZvciB0aGlzIGZpZWxkLgotICAgICAgICBpZiAoaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgZGVmYXVsdFZhbHVlID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3dpdGNoIChnZXRKYXZhVHlwZSgpKSB7Ci0gICAgICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgICAgIC8vIFdlIGd1YXJhbnRlZSBlbHNld2hlcmUgdGhhdCBhbiBlbnVtIHR5cGUgYWx3YXlzIGhhcyBhdCBsZWFzdAotICAgICAgICAgICAgICAvLyBvbmUgcG9zc2libGUgdmFsdWUuCi0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGVudW1UeXBlLmdldFZhbHVlcygpLmdldCgwKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IG51bGw7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZ2V0SmF2YVR5cGUoKS5kZWZhdWx0RGVmYXVsdDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmICghaXNFeHRlbnNpb24oKSkgewotICAgICAgICBmaWxlLnBvb2wuYWRkRmllbGRCeU51bWJlcih0aGlzKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGNvbnRhaW5pbmdUeXBlICE9IG51bGwgJiYKLSAgICAgICAgICBjb250YWluaW5nVHlwZS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSkgewotICAgICAgICBpZiAoaXNFeHRlbnNpb24oKSkgewotICAgICAgICAgIGlmICghaXNPcHRpb25hbCgpIHx8IGdldFR5cGUoKSAhPSBUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAiRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsIG1lc3NhZ2VzLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICJNZXNzYWdlU2V0cyBjYW5ub3QgaGF2ZSBmaWVsZHMsIG9ubHkgZXh0ZW5zaW9ucy4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRmllbGREZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuICBUaGlzIGlzIHRvIHNhdGlzZnkgdGhlIEZpZWxkRGVzY3JpcHRvckxpdGUKLSAgICAgKiBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgaW50ZXJuYWxNZXJnZUZyb20oTWVzc2FnZUxpdGUuQnVpbGRlciB0bywgTWVzc2FnZUxpdGUgZnJvbSkgewotICAgICAgLy8gRmllbGREZXNjcmlwdG9ycyBhcmUgb25seSB1c2VkIHdpdGggbm9uLWxpdGUgbWVzc2FnZXMgc28gd2UgY2FuIGp1c3QKLSAgICAgIC8vIGRvd24tY2FzdCBhbmQgY2FsbCBtZXJnZUZyb20gZGlyZWN0bHkuCi0gICAgICByZXR1cm4gKChNZXNzYWdlLkJ1aWxkZXIpIHRvKS5tZXJnZUZyb20oKE1lc3NhZ2UpIGZyb20pOwotICAgIH0KLQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKiogRGVzY3JpYmVzIGFuIGVudW0gdHlwZS4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnVtRGVzY3JpcHRvciBleHRlbmRzIEdlbmVyaWNEZXNjcmlwdG9yCi0gICAgICBpbXBsZW1lbnRzIEludGVybmFsLkVudW1MaXRlTWFwPEVudW1WYWx1ZURlc2NyaXB0b3I+IHsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudC4KLSAgICAgKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0SW5kZXgoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQotCi0gICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVudW1EZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsKLSAgICAgIHJldHVybiBwcm90bzsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB0eXBlJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHlwZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotICAgICAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgIHJldHVybiBmdWxsTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgewotICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqIElmIHRoaXMgaXMgYSBuZXN0ZWQgdHlwZSwgZ2V0IHRoZSBvdXRlciBkZXNjcmlwdG9yLCBvdGhlcndpc2UgbnVsbC4gKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRDb250YWluaW5nVHlwZSgpIHsgcmV0dXJuIGNvbnRhaW5pbmdUeXBlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGNvZGUgRW51bU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KLSAgICBwdWJsaWMgRW51bU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoaXMgZW51bS4gKi8KLSAgICBwdWJsaWMgTGlzdDxFbnVtVmFsdWVEZXNjcmlwdG9yPiBnZXRWYWx1ZXMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYW4gZW51bSB2YWx1ZSBieSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSB2YWx1ZSAoZS5nLiAiRk9PIikuCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZpbmRWYWx1ZUJ5TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0KLSAgICAgICAgICBmaWxlLnBvb2wuZmluZFN5bWJvbChmdWxsTmFtZSArICcuJyArIG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIEVudW1WYWx1ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgcmV0dXJuIChFbnVtVmFsdWVEZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYW4gZW51bSB2YWx1ZSBieSBudW1iZXIuICBJZiBtdWx0aXBsZSBlbnVtIHZhbHVlcyBoYXZlIHRoZSBzYW1lCi0gICAgICogbnVtYmVyLCB0aGlzIHJldHVybnMgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUgd2l0aCB0aGF0IG51bWJlci4KLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSB2YWx1ZSdzIG51bWJlci4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEVudW1WYWx1ZURlc2NyaXB0b3IgZmluZFZhbHVlQnlOdW1iZXIoZmluYWwgaW50IG51bWJlcikgewotICAgICAgcmV0dXJuIGZpbGUucG9vbC5lbnVtVmFsdWVzQnlOdW1iZXIuZ2V0KAotICAgICAgICBuZXcgRGVzY3JpcHRvclBvb2wuRGVzY3JpcHRvckludFBhaXIodGhpcywgbnVtYmVyKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBlbnVtIHZhbHVlIGZvciBhIG51bWJlci4gSWYgbm8gZW51bSB2YWx1ZSBoYXMgdGhpcyBudW1iZXIsCi0gICAgICogY29uc3RydWN0IGFuIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oZmluYWwgaW50IG51bWJlcikgewotICAgICAgRW51bVZhbHVlRGVzY3JpcHRvciByZXN1bHQgPSBmaW5kVmFsdWVCeU51bWJlcihudW1iZXIpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgICAvLyBUaGUgbnVtYmVyIHJlcHJlc2VudHMgYW4gdW5rbm93biBlbnVtIHZhbHVlLgotICAgICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICAgIC8vIERlc2NyaXB0b3JzIGFyZSBjb21wYXJlZCBieSBvYmplY3QgaWRlbnRpdHkgc28gZm9yIHRoZSBzYW1lIG51bWJlcgotICAgICAgICAvLyB3ZSBuZWVkIHRvIHJldHVybiB0aGUgc2FtZSBFbnVtVmFsdWVEZXNjcmlwdG9yIG9iamVjdC4gVGhpcyBtZWFucwotICAgICAgICAvLyB3ZSBoYXZlIHRvIHN0b3JlIGNyZWF0ZWQgRW51bVZhbHVlRGVzY3JpcHRvcnMuIEhvd2V2ZXIsIGFzIHRoZXJlCi0gICAgICAgIC8vIGFyZSBwb3RlbnRpYWxseSAyRyB1bmtub3duIGVudW0gdmFsdWVzLCBzdG9yaW5nIGFsbCBvZiB0aGVzZQotICAgICAgICAvLyBvYmplY3RzIHBlcnNpc3RlbnRseSB3aWxsIGNvbnN1bWUgbG90cyBvZiBtZW1vcnkgZm9yIGxvbmctcnVubmluZwotICAgICAgICAvLyBzZXJ2aWNlcyBhbmQgaXQncyBhbHNvIHVubmVjZXNzYXJ5IGFzIG5vdCBtYW55IEVudW1WYWx1ZURlc2NyaXB0b3JzCi0gICAgICAgIC8vIHdpbGwgYmUgdXNlZCBhdCB0aGUgc2FtZSB0aW1lLgotICAgICAgICAvLwotICAgICAgICAvLyBUbyBzb2x2ZSB0aGUgcHJvYmxlbSB3ZSB0YWtlIGFkdmFudGFnZSBvZiBKYXZhJ3Mgd2VhayByZWZlcmVuY2VzIGFuZAotICAgICAgICAvLyByZWx5IG9uIGdjIHRvIHJlbGVhc2UgdW51c2VkIGRlc2NyaXB0b3JzLgotICAgICAgICAvLwotICAgICAgICAvLyBIZXJlIGlzIGhvdyBpdCB3b3JrczoKLSAgICAgICAgLy8gICAqIFdlIHN0b3JlIHVua25vd24gRW51bVZhbHVlRGVzY3JpcHRvcnMgaW4gYSBXZWFrSGFzaE1hcCB3aXRoIHRoZQotICAgICAgICAvLyAgICAgdmFsdWUgYmVpbmcgYSB3ZWFrIHJlZmVyZW5jZSB0byB0aGUgZGVzY3JpcHRvci4KLSAgICAgICAgLy8gICAqIFRoZSBkZXNjcmlwdG9yIGhvbGRzIGEgc3Ryb25nIHJlZmVyZW5jZSB0byB0aGUga2V5IHNvIGFzIGxvbmcKLSAgICAgICAgLy8gICAgIGFzIHRoZSBFbnVtVmFsdWVEZXNjcmlwdG9yIGlzIGluIHVzZSwgdGhlIGtleSB3aWxsIGJlIHRoZXJlCi0gICAgICAgIC8vICAgICBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgbWFwIGVudHJ5IHdpbGwgYmUgdGhlcmUuIEZvbGxvd2luZy11cAotICAgICAgICAvLyAgICAgcXVlcmllcyB3aXRoIHRoZSBzYW1lIG51bWJlciB3aWxsIHJldHVybiB0aGUgc2FtZSBkZXNjcmlwdG9yLgotICAgICAgICAvLyAgICogSWYgdGhlIHVzZXIgbm8gbG9uZ2VyIHVzZXMgYW4gdW5rbm93biBFbnVtVmFsdWVEZXNjcmlwdG9yLAotICAgICAgICAvLyAgICAgaXQgd2lsbCBiZSBnYy1lZCBzaW5jZSB3ZSBvbmx5IGhvbGQgYSB3ZWFrIHJlZmVyZW5jZSB0byBpdCBpbgotICAgICAgICAvLyAgICAgdGhlIG1hcC4gVGhlIGtleSBpbiB0aGUgY29ycmVzcG9uZGluZyBtYXAgZW50cnkgd2lsbCBhbHNvIGJlCi0gICAgICAgIC8vICAgICBnYy1lZCBhcyB0aGUgb25seSBzdHJvbmcgcmVmZXJlbmNlIHRvIGl0IGlzIGluIHRoZSBkZXNjcmlwdG9yCi0gICAgICAgIC8vICAgICB3aGljaCBpcyBqdXN0IGdjLWVkLiBXaXRoIHRoZSBrZXkgYmVpbmcgZ29uZSBXZWFrSGFzaE1hcCB3aWxsCi0gICAgICAgIC8vICAgICB0aGVuIHJlbW92ZSB0aGUgd2hvbGUgZW50cnkuIFRoaXMgd2F5IHVua25vd24gZGVzY3JpcHRvcnMgd2lsbAotICAgICAgICAvLyAgICAgYmUgZnJlZWQgYXV0b21hdGljYWxseSBhbmQgd2UgZG9uJ3QgbmVlZCB0byBkbyBhbnl0aGluZyB0bwotICAgICAgICAvLyAgICAgY2xlYW4tdXAgdW51c2VkIG1hcCBlbnRyaWVzLgotCi0gICAgICAgIC8vIE5vdGU6IFdlIG11c3QgdXNlICJuZXcgSW50ZWdlcihudW1iZXIpIiBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudAotICAgICAgICAvLyB0aGVzZSBJbnRlZ2VyIG9iamVjdHMgdG8gYmUgY2FjaGVkLgotICAgICAgICBJbnRlZ2VyIGtleSA9IG5ldyBJbnRlZ2VyKG51bWJlcik7Ci0gICAgICAgIFdlYWtSZWZlcmVuY2U8RW51bVZhbHVlRGVzY3JpcHRvcj4gcmVmZXJlbmNlID0gdW5rbm93blZhbHVlcy5nZXQoa2V5KTsKLSAgICAgICAgaWYgKHJlZmVyZW5jZSAhPSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gcmVmZXJlbmNlLmdldCgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAgIHJlc3VsdCA9IG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yKGZpbGUsIHRoaXMsIGtleSk7Ci0gICAgICAgICAgdW5rbm93blZhbHVlcy5wdXQoa2V5LCBuZXcgV2Vha1JlZmVyZW5jZTxFbnVtVmFsdWVEZXNjcmlwdG9yPihyZXN1bHQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvLyBVc2VkIGluIHRlc3RzIG9ubHkuCi0gICAgaW50IGdldFVua25vd25FbnVtVmFsdWVEZXNjcmlwdG9yQ291bnQoKSB7Ci0gICAgICByZXR1cm4gdW5rbm93blZhbHVlcy5zaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0gICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvclByb3RvIHByb3RvOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOwotICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGU7Ci0gICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yW10gdmFsdWVzOwotICAgIHByaXZhdGUgZmluYWwgV2Vha0hhc2hNYXA8SW50ZWdlciwgV2Vha1JlZmVyZW5jZTxFbnVtVmFsdWVEZXNjcmlwdG9yPj4gdW5rbm93blZhbHVlcyA9Ci0gICAgICAgIG5ldyBXZWFrSGFzaE1hcDxJbnRlZ2VyLCBXZWFrUmVmZXJlbmNlPEVudW1WYWx1ZURlc2NyaXB0b3I+PigpOwotCi0gICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvcihmaW5hbCBFbnVtRGVzY3JpcHRvclByb3RvIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgICAgZnVsbE5hbWUgPSBjb21wdXRlRnVsbE5hbWUoZmlsZSwgcGFyZW50LCBwcm90by5nZXROYW1lKCkpOwotICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgIGNvbnRhaW5pbmdUeXBlID0gcGFyZW50OwotCi0gICAgICBpZiAocHJvdG8uZ2V0VmFsdWVDb3VudCgpID09IDApIHsKLSAgICAgICAgLy8gV2UgY2Fubm90IGFsbG93IGVudW1zIHdpdGggbm8gdmFsdWVzIGJlY2F1c2UgdGhpcyB3b3VsZCBtZWFuIHRoZXJlCi0gICAgICAgIC8vIHdvdWxkIGJlIG5vIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCi0gICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICJFbnVtcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHZhbHVlLiIpOwotICAgICAgfQotCi0gICAgICB2YWx1ZXMgPSBuZXcgRW51bVZhbHVlRGVzY3JpcHRvcltwcm90by5nZXRWYWx1ZUNvdW50KCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRWYWx1ZUNvdW50KCk7IGkrKykgewotICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRWYWx1ZShpKSwgZmlsZSwgdGhpcywgaSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqIFNlZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc2V0UHJvdG99LiAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBFbnVtRGVzY3JpcHRvclByb3RvIHByb3RvKSB7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXS5zZXRQcm90byhwcm90by5nZXRWYWx1ZShpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogRGVzY3JpYmVzIG9uZSB2YWx1ZSB3aXRoaW4gYW4gZW51bSB0eXBlLiAgTm90ZSB0aGF0IG11bHRpcGxlIGRlZmluZWQKLSAgICogdmFsdWVzIG1heSBoYXZlIHRoZSBzYW1lIG51bWJlci4gIEluIGdlbmVyYXRlZCBKYXZhIGNvZGUsIGFsbCB2YWx1ZXMKLSAgICogd2l0aCB0aGUgc2FtZSBudW1iZXIgYWZ0ZXIgdGhlIGZpcnN0IGJlY29tZSBhbGlhc2VzIG9mIHRoZSBmaXJzdC4KLSAgICogSG93ZXZlciwgdGhleSBzdGlsbCBoYXZlIGluZGVwZW5kZW50IEVudW1WYWx1ZURlc2NyaXB0b3JzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yIGV4dGVuZHMgR2VuZXJpY0Rlc2NyaXB0b3IKLSAgICAgIGltcGxlbWVudHMgSW50ZXJuYWwuRW51bUxpdGUgewotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LgotICAgICAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRJbmRleCgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9Ci0KLSAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7Ci0gICAgICByZXR1cm4gcHJvdG87Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgdmFsdWUncyB1bnF1YWxpZmllZCBuYW1lLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgIHJldHVybiBwcm90by5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgdmFsdWUncyBudW1iZXIuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXROdW1iZXIoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0TnVtYmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsgcmV0dXJuIHByb3RvLmdldE5hbWUoKTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB2YWx1ZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotICAgICAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgIHJldHVybiBmdWxsTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgewotICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgdmFsdWUncyBlbnVtIHR5cGUuICovCi0gICAgcHVibGljIEVudW1EZXNjcmlwdG9yIGdldFR5cGUoKSB7IHJldHVybiB0eXBlOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHtAY29kZSBFbnVtVmFsdWVPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uCi0gICAgICovCi0gICAgcHVibGljIEVudW1WYWx1ZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0gICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG87Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOwotICAgIHByaXZhdGUgZmluYWwgRW51bURlc2NyaXB0b3IgdHlwZTsKLQotICAgIHByaXZhdGUgRW51bVZhbHVlRGVzY3JpcHRvcihmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEVudW1EZXNjcmlwdG9yIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0gICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgdHlwZSA9IHBhcmVudDsKLQotICAgICAgZnVsbE5hbWUgPSBwYXJlbnQuZ2V0RnVsbE5hbWUoKSArICcuJyArIHByb3RvLmdldE5hbWUoKTsKLQotICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKLSAgICAgIGZpbGUucG9vbC5hZGRFbnVtVmFsdWVCeU51bWJlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEludGVnZXIgbnVtYmVyOwotICAgIC8vIENyZWF0ZSBhbiB1bmtub3duIGVudW0gdmFsdWUuCi0gICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAotICAgICAgICBmaW5hbCBFbnVtRGVzY3JpcHRvciBwYXJlbnQsCi0gICAgICAgIGZpbmFsIEludGVnZXIgbnVtYmVyKSB7Ci0gICAgICBTdHJpbmcgbmFtZSA9ICJVTktOT1dOX0VOVU1fVkFMVUVfIiArIHBhcmVudC5nZXROYW1lKCkgKyAiXyIgKyBudW1iZXI7Ci0gICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG8gPSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8KLSAgICAgICAgICAubmV3QnVpbGRlcigpLnNldE5hbWUobmFtZSkuc2V0TnVtYmVyKG51bWJlcikuYnVpbGQoKTsKLSAgICAgIHRoaXMuaW5kZXggPSAtMTsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICB0aGlzLnR5cGUgPSBwYXJlbnQ7Ci0gICAgICB0aGlzLmZ1bGxOYW1lID0gcGFyZW50LmdldEZ1bGxOYW1lKCkgKyAnLicgKyBwcm90by5nZXROYW1lKCk7Ci0gICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLQotICAgICAgLy8gRG9uJ3QgYWRkIHRoaXMgZGVzY3JpcHRvciBpbnRvIHBvb2wuCi0gICAgfQotCi0gICAgLyoqIFNlZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc2V0UHJvdG99LiAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKiBEZXNjcmliZXMgYSBzZXJ2aWNlIHR5cGUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgU2VydmljZURlc2NyaXB0b3IgZXh0ZW5kcyBHZW5lcmljRGVzY3JpcHRvciB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCi0gICAgICogKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0SW5kZXgoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQotCi0gICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsKLSAgICAgIHJldHVybiBwcm90bzsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB0eXBlJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHlwZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotICAgICAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsKLSAgICAgIHJldHVybiBmdWxsTmFtZTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgewotICAgICAgcmV0dXJuIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUge0Bjb2RlIFNlcnZpY2VPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uICovCi0gICAgcHVibGljIFNlcnZpY2VPcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIG1ldGhvZHMgZm9yIHRoaXMgc2VydmljZS4gKi8KLSAgICBwdWJsaWMgTGlzdDxNZXRob2REZXNjcmlwdG9yPiBnZXRNZXRob2RzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChtZXRob2RzKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZCBhIG1ldGhvZCBieSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBtZXRob2QgKGUuZy4gIkZvbyIpLgotICAgICAqIEByZXR1cm4gdGhlIG1ldGhvZCdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIE1ldGhvZERlc2NyaXB0b3IgZmluZE1ldGhvZEJ5TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0KLSAgICAgICAgICBmaWxlLnBvb2wuZmluZFN5bWJvbChmdWxsTmFtZSArICcuJyArIG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIE1ldGhvZERlc2NyaXB0b3IpIHsKLSAgICAgICAgcmV0dXJuIChNZXRob2REZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0gICAgcHJpdmF0ZSBNZXRob2REZXNjcmlwdG9yW10gbWV0aG9kczsKLQotICAgIHByaXZhdGUgU2VydmljZURlc2NyaXB0b3IoZmluYWwgU2VydmljZURlc2NyaXB0b3JQcm90byBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0gICAgICBmdWxsTmFtZSA9IGNvbXB1dGVGdWxsTmFtZShmaWxlLCBudWxsLCBwcm90by5nZXROYW1lKCkpOwotICAgICAgdGhpcy5maWxlID0gZmlsZTsKLQotICAgICAgbWV0aG9kcyA9IG5ldyBNZXRob2REZXNjcmlwdG9yW3Byb3RvLmdldE1ldGhvZENvdW50KCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRNZXRob2RDb3VudCgpOyBpKyspIHsKLSAgICAgICAgbWV0aG9kc1tpXSA9IG5ldyBNZXRob2REZXNjcmlwdG9yKAotICAgICAgICAgIHByb3RvLmdldE1ldGhvZChpKSwgZmlsZSwgdGhpcywgaSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGNyb3NzTGluaygpIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICBmb3IgKGZpbmFsIE1ldGhvZERlc2NyaXB0b3IgbWV0aG9kIDogbWV0aG9kcykgewotICAgICAgICBtZXRob2QuY3Jvc3NMaW5rKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFNlZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc2V0UHJvdG99LiAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHByb3RvKSB7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kcy5sZW5ndGg7IGkrKykgewotICAgICAgICBtZXRob2RzW2ldLnNldFByb3RvKHByb3RvLmdldE1ldGhvZChpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogRGVzY3JpYmVzIG9uZSBtZXRob2Qgd2l0aGluIGEgc2VydmljZSB0eXBlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNZXRob2REZXNjcmlwdG9yIGV4dGVuZHMgR2VuZXJpY0Rlc2NyaXB0b3IgewotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LgotICAgICAqICogQHNlZSBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yI2dldEluZGV4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KLQotICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsKLSAgICAgIHJldHVybiBwcm90bzsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBtZXRob2QncyB1bnF1YWxpZmllZCBuYW1lLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgIHJldHVybiBwcm90by5nZXROYW1lKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZXRob2QncyBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLSAgICAgKiBAc2VlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IjZ2V0RnVsbE5hbWUoKQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0gICAgICByZXR1cm4gZnVsbE5hbWU7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBjb250YWluaW5nIHRoaXMgZGVzY3JpcHRvci4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsKLSAgICAgIHJldHVybiBmaWxlOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIG1ldGhvZCdzIHNlcnZpY2UgdHlwZS4gKi8KLSAgICBwdWJsaWMgU2VydmljZURlc2NyaXB0b3IgZ2V0U2VydmljZSgpIHsgcmV0dXJuIHNlcnZpY2U7IH0KLQotICAgIC8qKiBHZXQgdGhlIG1ldGhvZCdzIGlucHV0IHR5cGUuICovCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0SW5wdXRUeXBlKCkgeyByZXR1cm4gaW5wdXRUeXBlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSBtZXRob2QncyBvdXRwdXQgdHlwZS4gKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRPdXRwdXRUeXBlKCkgeyByZXR1cm4gb3V0cHV0VHlwZTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSB7QGNvZGUgTWV0aG9kT3B0aW9uc30sIGRlZmluZWQgaW4ge0Bjb2RlIGRlc2NyaXB0b3IucHJvdG99LgotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2RPcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotICAgIHByaXZhdGUgTWV0aG9kRGVzY3JpcHRvclByb3RvIHByb3RvOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOwotICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2U7Ci0KLSAgICAvLyBJbml0aWFsaXplZCBkdXJpbmcgY3Jvc3MtbGlua2luZy4KLSAgICBwcml2YXRlIERlc2NyaXB0b3IgaW5wdXRUeXBlOwotICAgIHByaXZhdGUgRGVzY3JpcHRvciBvdXRwdXRUeXBlOwotCi0gICAgcHJpdmF0ZSBNZXRob2REZXNjcmlwdG9yKGZpbmFsIE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU2VydmljZURlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICBzZXJ2aWNlID0gcGFyZW50OwotCi0gICAgICBmdWxsTmFtZSA9IHBhcmVudC5nZXRGdWxsTmFtZSgpICsgJy4nICsgcHJvdG8uZ2V0TmFtZSgpOwotCi0gICAgICBmaWxlLnBvb2wuYWRkU3ltYm9sKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcm9zc0xpbmsoKSB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgaW5wdXQgPQotICAgICAgICBmaWxlLnBvb2wubG9va3VwU3ltYm9sKHByb3RvLmdldElucHV0VHlwZSgpLCB0aGlzLAotICAgICAgICAgICAgRGVzY3JpcHRvclBvb2wuU2VhcmNoRmlsdGVyLlRZUEVTX09OTFkpOwotICAgICAgaWYgKCEoaW5wdXQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkgewotICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICdcIicgKyBwcm90by5nZXRJbnB1dFR5cGUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICBpbnB1dFR5cGUgPSAoRGVzY3JpcHRvcilpbnB1dDsKLQotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3Igb3V0cHV0ID0KLSAgICAgICAgZmlsZS5wb29sLmxvb2t1cFN5bWJvbChwcm90by5nZXRPdXRwdXRUeXBlKCksIHRoaXMsCi0gICAgICAgICAgICBEZXNjcmlwdG9yUG9vbC5TZWFyY2hGaWx0ZXIuVFlQRVNfT05MWSk7Ci0gICAgICBpZiAoIShvdXRwdXQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkgewotICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICdcIicgKyBwcm90by5nZXRPdXRwdXRUeXBlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgb3V0cHV0VHlwZSA9IChEZXNjcmlwdG9yKW91dHB1dDsKLSAgICB9Ci0KLSAgICAvKiogU2VlIHtAbGluayBGaWxlRGVzY3JpcHRvciNzZXRQcm90b30uICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90bykgewotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXB1dGVGdWxsTmFtZShmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gcGFyZW50LmdldEZ1bGxOYW1lKCkgKyAnLicgKyBuYW1lOwotICAgIH0gZWxzZSBpZiAoZmlsZS5nZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICByZXR1cm4gZmlsZS5nZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBBbGwgZGVzY3JpcHRvcnMgaW1wbGVtZW50IHRoaXMgdG8gbWFrZSBpdCBlYXNpZXIgdG8gaW1wbGVtZW50IHRvb2xzIGxpa2UKLSAgICoge0Bjb2RlIERlc2NyaXB0b3JQb29sfS48cD4KLSAgICoKLSAgICogVGhpcyBjbGFzcyBpcyBwdWJsaWMgc28gdGhhdCB0aGUgbWV0aG9kcyBpdCBleHBvc2VzIGNhbiBiZSBjYWxsZWQgZnJvbQotICAgKiBvdXRzaWRlIG9mIHRoaXMgcGFja2FnZS4gSG93ZXZlciwgaXQgc2hvdWxkIG9ubHkgYmUgc3ViY2xhc3NlZCBmcm9tCi0gICAqIG5lc3RlZCBjbGFzc2VzIG9mIERlc2NyaXB0b3JzLgotICAgKi8KLSAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBHZW5lcmljRGVzY3JpcHRvciB7Ci0gICAgcHVibGljIGFic3RyYWN0IE1lc3NhZ2UgdG9Qcm90bygpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0TmFtZSgpOwotICAgIHB1YmxpYyBhYnN0cmFjdCBTdHJpbmcgZ2V0RnVsbE5hbWUoKTsKLSAgICBwdWJsaWMgYWJzdHJhY3QgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRocm93biB3aGVuIGJ1aWxkaW5nIGRlc2NyaXB0b3JzIGZhaWxzIGJlY2F1c2UgdGhlIHNvdXJjZSBEZXNjcmlwdG9yUHJvdG9zCi0gICAqIGFyZSBub3QgdmFsaWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGV4dGVuZHMgRXhjZXB0aW9uIHsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSA1NzUwMjA1Nzc1NDkwNDgzMTQ4TDsKLQotICAgIC8qKiBHZXRzIHRoZSBmdWxsIG5hbWUgb2YgdGhlIGRlc2NyaXB0b3Igd2hlcmUgdGhlIGVycm9yIG9jY3VycmVkLiAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0UHJvYmxlbVN5bWJvbE5hbWUoKSB7IHJldHVybiBuYW1lOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZhbGlkIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0UHJvYmxlbVByb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsgcmV0dXJuIGRlc2NyaXB0aW9uOyB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZSBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIHByaXZhdGUgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHByb2JsZW1EZXNjcmlwdG9yLAotICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgIHN1cGVyKHByb2JsZW1EZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCkgKyAiOiAiICsgZGVzY3JpcHRpb24pOwotCi0gICAgICAvLyBOb3RlIHRoYXQgcHJvYmxlbURlc2NyaXB0b3IgbWF5IGJlIHBhcnRpYWxseSB1bmluaXRpYWxpemVkLCBzbyB3ZQotICAgICAgLy8gZG9uJ3Qgd2FudCB0byBleHBvc2UgaXQgZGlyZWN0bHkgdG8gdGhlIHVzZXIuICBTbywgd2Ugb25seSBwcm92aWRlCi0gICAgICAvLyB0aGUgbmFtZSBhbmQgdGhlIG9yaWdpbmFsIHByb3RvLgotICAgICAgbmFtZSA9IHByb2JsZW1EZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCk7Ci0gICAgICBwcm90byA9IHByb2JsZW1EZXNjcmlwdG9yLnRvUHJvdG8oKTsKLSAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBwcm9ibGVtRGVzY3JpcHRvciwKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgIHRoaXMocHJvYmxlbURlc2NyaXB0b3IsIGRlc2NyaXB0aW9uKTsKLSAgICAgIGluaXRDYXVzZShjYXVzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgcHJvYmxlbURlc2NyaXB0b3IsCi0gICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgc3VwZXIocHJvYmxlbURlc2NyaXB0b3IuZ2V0TmFtZSgpICsgIjogIiArIGRlc2NyaXB0aW9uKTsKLQotICAgICAgLy8gTm90ZSB0aGF0IHByb2JsZW1EZXNjcmlwdG9yIG1heSBiZSBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZCwgc28gd2UKLSAgICAgIC8vIGRvbid0IHdhbnQgdG8gZXhwb3NlIGl0IGRpcmVjdGx5IHRvIHRoZSB1c2VyLiAgU28sIHdlIG9ubHkgcHJvdmlkZQotICAgICAgLy8gdGhlIG5hbWUgYW5kIHRoZSBvcmlnaW5hbCBwcm90by4KLSAgICAgIG5hbWUgPSBwcm9ibGVtRGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICBwcm90byA9IHByb2JsZW1EZXNjcmlwdG9yLnRvUHJvdG8oKTsKLSAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBBIHByaXZhdGUgaGVscGVyIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGxvb2t1cCB0YWJsZXMgY29udGFpbmluZyBhbGwgdGhlCi0gICAqIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gYSBwYXJ0aWN1bGFyIGZpbGUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9yUG9vbCB7Ci0KLSAgICAvKiogRGVmaW5lcyB3aGF0IHN1YmNsYXNzIG9mIGRlc2NyaXB0b3JzIHRvIHNlYXJjaCBpbiB0aGUgZGVzY3JpcHRvciBwb29sLgotICAgICAqLwotICAgIGVudW0gU2VhcmNoRmlsdGVyIHsKLSAgICAgIFRZUEVTX09OTFksIEFHR1JFR0FURVNfT05MWSwgQUxMX1NZTUJPTFMKLSAgICB9Ci0KLSAgICBEZXNjcmlwdG9yUG9vbChmaW5hbCBGaWxlRGVzY3JpcHRvcltdIGRlcGVuZGVuY2llcywKLSAgICAgICAgYm9vbGVhbiBhbGxvd1Vua25vd25EZXBlbmRlbmNpZXMpIHsKLSAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IEhhc2hTZXQ8RmlsZURlc2NyaXB0b3I+KCk7Ci0gICAgICB0aGlzLmFsbG93VW5rbm93bkRlcGVuZGVuY2llcyA9IGFsbG93VW5rbm93bkRlcGVuZGVuY2llczsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmNpZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXMuYWRkKGRlcGVuZGVuY2llc1tpXSk7Ci0gICAgICAgIGltcG9ydFB1YmxpY0RlcGVuZGVuY2llcyhkZXBlbmRlbmNpZXNbaV0pOwotICAgICAgfQotCi0gICAgICBmb3IgKGZpbmFsIEZpbGVEZXNjcmlwdG9yIGRlcGVuZGVuY3kgOiB0aGlzLmRlcGVuZGVuY2llcykgewotICAgICAgICB0cnkgewotICAgICAgICAgIGFkZFBhY2thZ2UoZGVwZW5kZW5jeS5nZXRQYWNrYWdlKCksIGRlcGVuZGVuY3kpOwotICAgICAgICB9IGNhdGNoIChEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgLy8gQ2FuJ3QgaGFwcGVuLCBiZWNhdXNlIGFkZFBhY2thZ2UoKSBvbmx5IGZhaWxzIHdoZW4gdGhlIG5hbWUKLSAgICAgICAgICAvLyBjb25mbGljdHMgd2l0aCBhIG5vbi1wYWNrYWdlLCBidXQgd2UgaGF2ZSBub3QgeWV0IGFkZGVkIGFueQotICAgICAgICAgIC8vIG5vbi1wYWNrYWdlcyBhdCB0aGlzIHBvaW50LgotICAgICAgICAgIGFzc2VydCBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBGaW5kIGFuZCBwdXQgcHVibGljIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSBpbnRvIGRlcGVuZGVuY2llcyBzZXQuKi8KLSAgICBwcml2YXRlIHZvaWQgaW1wb3J0UHVibGljRGVwZW5kZW5jaWVzKGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUpIHsKLSAgICAgIGZvciAoRmlsZURlc2NyaXB0b3IgZGVwZW5kZW5jeSA6IGZpbGUuZ2V0UHVibGljRGVwZW5kZW5jaWVzKCkpIHsKLSAgICAgICAgaWYgKGRlcGVuZGVuY2llcy5hZGQoZGVwZW5kZW5jeSkpIHsKLSAgICAgICAgICBpbXBvcnRQdWJsaWNEZXBlbmRlbmNpZXMoZGVwZW5kZW5jeSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFNldDxGaWxlRGVzY3JpcHRvcj4gZGVwZW5kZW5jaWVzOwotICAgIHByaXZhdGUgYm9vbGVhbiBhbGxvd1Vua25vd25EZXBlbmRlbmNpZXM7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEdlbmVyaWNEZXNjcmlwdG9yPiBkZXNjcmlwdG9yc0J5TmFtZSA9Ci0gICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEdlbmVyaWNEZXNjcmlwdG9yPigpOwotICAgIHByaXZhdGUgZmluYWwgTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBGaWVsZERlc2NyaXB0b3I+IGZpZWxkc0J5TnVtYmVyID0KLSAgICAgIG5ldyBIYXNoTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBGaWVsZERlc2NyaXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8RGVzY3JpcHRvckludFBhaXIsIEVudW1WYWx1ZURlc2NyaXB0b3I+IGVudW1WYWx1ZXNCeU51bWJlcgotICAgICAgICA9IG5ldyBIYXNoTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBFbnVtVmFsdWVEZXNjcmlwdG9yPigpOwotCi0gICAgLyoqIEZpbmQgYSBnZW5lcmljIGRlc2NyaXB0b3IgYnkgZnVsbHktcXVhbGlmaWVkIG5hbWUuICovCi0gICAgR2VuZXJpY0Rlc2NyaXB0b3IgZmluZFN5bWJvbChmaW5hbCBTdHJpbmcgZnVsbE5hbWUpIHsKLSAgICAgIHJldHVybiBmaW5kU3ltYm9sKGZ1bGxOYW1lLCBTZWFyY2hGaWx0ZXIuQUxMX1NZTUJPTFMpOwotICAgIH0KLQotICAgIC8qKiBGaW5kIGEgZGVzY3JpcHRvciBieSBmdWxseS1xdWFsaWZpZWQgbmFtZSBhbmQgZ2l2ZW4gb3B0aW9uIHRvIG9ubHkKLSAgICAgKiBzZWFyY2ggdmFsaWQgZmllbGQgdHlwZSBkZXNjcmlwdG9ycy4KLSAgICAgKi8KLSAgICBHZW5lcmljRGVzY3JpcHRvciBmaW5kU3ltYm9sKGZpbmFsIFN0cmluZyBmdWxsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlYXJjaEZpbHRlciBmaWx0ZXIpIHsKLSAgICAgIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9IGRlc2NyaXB0b3JzQnlOYW1lLmdldChmdWxsTmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgaWYgKChmaWx0ZXI9PVNlYXJjaEZpbHRlci5BTExfU1lNQk9MUykgfHwKLSAgICAgICAgICAgICgoZmlsdGVyPT1TZWFyY2hGaWx0ZXIuVFlQRVNfT05MWSkgJiYgaXNUeXBlKHJlc3VsdCkpIHx8Ci0gICAgICAgICAgICAoKGZpbHRlcj09U2VhcmNoRmlsdGVyLkFHR1JFR0FURVNfT05MWSkgJiYgaXNBZ2dyZWdhdGUocmVzdWx0KSkpIHsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoZmluYWwgRmlsZURlc2NyaXB0b3IgZGVwZW5kZW5jeSA6IGRlcGVuZGVuY2llcykgewotICAgICAgICByZXN1bHQgPSBkZXBlbmRlbmN5LnBvb2wuZGVzY3JpcHRvcnNCeU5hbWUuZ2V0KGZ1bGxOYW1lKTsKLSAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgaWYgKChmaWx0ZXI9PVNlYXJjaEZpbHRlci5BTExfU1lNQk9MUykgfHwKLSAgICAgICAgICAgICAgKChmaWx0ZXI9PVNlYXJjaEZpbHRlci5UWVBFU19PTkxZKSAmJiBpc1R5cGUocmVzdWx0KSkgfHwKLSAgICAgICAgICAgICAgKChmaWx0ZXI9PVNlYXJjaEZpbHRlci5BR0dSRUdBVEVTX09OTFkpICYmIGlzQWdncmVnYXRlKHJlc3VsdCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogQ2hlY2tzIGlmIHRoZSBkZXNjcmlwdG9yIGlzIGEgdmFsaWQgdHlwZSBmb3IgYSBtZXNzYWdlIGZpZWxkLiAqLwotICAgIGJvb2xlYW4gaXNUeXBlKEdlbmVyaWNEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgIHJldHVybiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHx8Ci0gICAgICAgIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKiBDaGVja3MgaWYgdGhlIGRlc2NyaXB0b3IgaXMgYSB2YWxpZCBuYW1lc3BhY2UgdHlwZS4gKi8KLSAgICBib29sZWFuIGlzQWdncmVnYXRlKEdlbmVyaWNEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgIHJldHVybiAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHx8Ci0gICAgICAgIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IpIHx8Ci0gICAgICAgIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgUGFja2FnZURlc2NyaXB0b3IpIHx8Ci0gICAgICAgIChkZXNjcmlwdG9yIGluc3RhbmNlb2YgU2VydmljZURlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2sgdXAgYSB0eXBlIGRlc2NyaXB0b3IgYnkgbmFtZSwgcmVsYXRpdmUgdG8gc29tZSBvdGhlciBkZXNjcmlwdG9yLgotICAgICAqIFRoZSBuYW1lIG1heSBiZSBmdWxseS1xdWFsaWZpZWQgKHdpdGggYSBsZWFkaW5nICcuJyksCi0gICAgICogcGFydGlhbGx5LXF1YWxpZmllZCwgb3IgdW5xdWFsaWZpZWQuICBDKystbGlrZSBuYW1lIGxvb2t1cCBzZW1hbnRpY3MKLSAgICAgKiBhcmUgdXNlZCB0byBzZWFyY2ggZm9yIHRoZSBtYXRjaGluZyBkZXNjcmlwdG9yLgotICAgICAqLwotICAgIEdlbmVyaWNEZXNjcmlwdG9yIGxvb2t1cFN5bWJvbChmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVsYXRpdmVUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVzY3JpcHRvclBvb2wuU2VhcmNoRmlsdGVyIGZpbHRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgLy8gVE9ETyhrZW50b24pOiAgVGhpcyBjb3VsZCBiZSBvcHRpbWl6ZWQgaW4gYSBudW1iZXIgb2Ygd2F5cy4KLQotICAgICAgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0OwotICAgICAgU3RyaW5nIGZ1bGxuYW1lOwotICAgICAgaWYgKG5hbWUuc3RhcnRzV2l0aCgiLiIpKSB7Ci0gICAgICAgIC8vIEZ1bGx5LXF1YWxpZmllZCBuYW1lLgotICAgICAgICBmdWxsbmFtZSA9IG5hbWUuc3Vic3RyaW5nKDEpOwotICAgICAgICByZXN1bHQgPSBmaW5kU3ltYm9sKGZ1bGxuYW1lLCBmaWx0ZXIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gSWYgIm5hbWUiIGlzIGEgY29tcG91bmQgaWRlbnRpZmllciwgd2Ugd2FudCB0byBzZWFyY2ggZm9yIHRoZQotICAgICAgICAvLyBmaXJzdCBjb21wb25lbnQgb2YgaXQsIHRoZW4gc2VhcmNoIHdpdGhpbiBpdCBmb3IgdGhlIHJlc3QuCi0gICAgICAgIC8vIElmIG5hbWUgaXMgc29tZXRoaW5nIGxpa2UgIkZvby5CYXIuYmF6IiwgYW5kIHN5bWJvbHMgbmFtZWQgIkZvbyIgYXJlCi0gICAgICAgIC8vIGRlZmluZWQgaW4gbXVsdGlwbGUgcGFyZW50IHNjb3Blcywgd2Ugb25seSB3YW50IHRvIGZpbmQgIkJhci5iYXoiIGluCi0gICAgICAgIC8vIHRoZSBpbm5lcm1vc3Qgb25lLiAgRS5nLiwgdGhlIGZvbGxvd2luZyBzaG91bGQgcHJvZHVjZSBhbiBlcnJvcjoKLSAgICAgICAgLy8gICBtZXNzYWdlIEJhciB7IG1lc3NhZ2UgQmF6IHt9IH0KLSAgICAgICAgLy8gICBtZXNzYWdlIEZvbyB7Ci0gICAgICAgIC8vICAgICBtZXNzYWdlIEJhciB7Ci0gICAgICAgIC8vICAgICB9Ci0gICAgICAgIC8vICAgICBvcHRpb25hbCBCYXIuQmF6IGJheiA9IDE7Ci0gICAgICAgIC8vICAgfQotICAgICAgICAvLyBTbywgd2UgbG9vayBmb3IganVzdCAiRm9vIiBmaXJzdCwgdGhlbiBsb29rIGZvciAiQmFyLmJheiIgd2l0aGluIGl0Ci0gICAgICAgIC8vIGlmIGZvdW5kLgotICAgICAgICBmaW5hbCBpbnQgZmlyc3RQYXJ0TGVuZ3RoID0gbmFtZS5pbmRleE9mKCcuJyk7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBmaXJzdFBhcnQ7Ci0gICAgICAgIGlmIChmaXJzdFBhcnRMZW5ndGggPT0gLTEpIHsKLSAgICAgICAgICBmaXJzdFBhcnQgPSBuYW1lOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGZpcnN0UGFydCA9IG5hbWUuc3Vic3RyaW5nKDAsIGZpcnN0UGFydExlbmd0aCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBXZSB3aWxsIHNlYXJjaCBlYWNoIHBhcmVudCBzY29wZSBvZiAicmVsYXRpdmVUbyIgbG9va2luZyBmb3IgdGhlCi0gICAgICAgIC8vIHN5bWJvbC4KLSAgICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzY29wZVRvVHJ5ID0KLSAgICAgICAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKHJlbGF0aXZlVG8uZ2V0RnVsbE5hbWUoKSk7Ci0KLSAgICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgICAvLyBDaG9wIG9mZiB0aGUgbGFzdCBjb21wb25lbnQgb2YgdGhlIHNjb3BlLgotICAgICAgICAgIGZpbmFsIGludCBkb3Rwb3MgPSBzY29wZVRvVHJ5Lmxhc3RJbmRleE9mKCIuIik7Ci0gICAgICAgICAgaWYgKGRvdHBvcyA9PSAtMSkgewotICAgICAgICAgICAgZnVsbG5hbWUgPSBuYW1lOwotICAgICAgICAgICAgcmVzdWx0ID0gZmluZFN5bWJvbChuYW1lLCBmaWx0ZXIpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHNjb3BlVG9Ucnkuc2V0TGVuZ3RoKGRvdHBvcyArIDEpOwotCi0gICAgICAgICAgICAvLyBBcHBlbmQgZmlyc3RQYXJ0IGFuZCB0cnkgdG8gZmluZAotICAgICAgICAgICAgc2NvcGVUb1RyeS5hcHBlbmQoZmlyc3RQYXJ0KTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRTeW1ib2woc2NvcGVUb1RyeS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sLlNlYXJjaEZpbHRlci5BR0dSRUdBVEVTX09OTFkpOwotCi0gICAgICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgaWYgKGZpcnN0UGFydExlbmd0aCAhPSAtMSkgewotICAgICAgICAgICAgICAgIC8vIFdlIG9ubHkgZm91bmQgdGhlIGZpcnN0IHBhcnQgb2YgdGhlIHN5bWJvbC4gIE5vdyBsb29rIGZvcgotICAgICAgICAgICAgICAgIC8vIHRoZSB3aG9sZSB0aGluZy4gIElmIHRoaXMgZmFpbHMsIHdlICpkb24ndCogd2FudCB0byBrZWVwCi0gICAgICAgICAgICAgICAgLy8gc2VhcmNoaW5nIHBhcmVudCBzY29wZXMuCi0gICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5zZXRMZW5ndGgoZG90cG9zICsgMSk7Ci0gICAgICAgICAgICAgICAgc2NvcGVUb1RyeS5hcHBlbmQobmFtZSk7Ci0gICAgICAgICAgICAgICAgcmVzdWx0ID0gZmluZFN5bWJvbChzY29wZVRvVHJ5LnRvU3RyaW5nKCksIGZpbHRlcik7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgZnVsbG5hbWUgPSBzY29wZVRvVHJ5LnRvU3RyaW5nKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAvLyBOb3QgZm91bmQuICBSZW1vdmUgdGhlIG5hbWUgc28gd2UgY2FuIHRyeSBhZ2Fpbi4KLSAgICAgICAgICAgIHNjb3BlVG9Ucnkuc2V0TGVuZ3RoKGRvdHBvcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICBpZiAoYWxsb3dVbmtub3duRGVwZW5kZW5jaWVzICYmIGZpbHRlciA9PSBTZWFyY2hGaWx0ZXIuVFlQRVNfT05MWSkgewotICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJUaGUgZGVzY3JpcHRvciBmb3IgbWVzc2FnZSB0eXBlIFwiIiArIG5hbWUgKwotICAgICAgICAgICAgICAiXCIgY2FuIG5vdCBiZSBmb3VuZCBhbmQgYSBwbGFjZWhvbGRlciBpcyBjcmVhdGVkIGZvciBpdCIpOwotICAgICAgICAgIC8vIFdlIGNyZWF0ZSBhIGR1bW15IG1lc3NhZ2UgZGVzY3JpcHRvciBoZXJlIHJlZ2FyZGxlc3Mgb2YgdGhlCi0gICAgICAgICAgLy8gZXhwZWN0ZWQgdHlwZS4gSWYgdGhlIHR5cGUgc2hvdWxkIGJlIG1lc3NhZ2UsIHRoaXMgZHVtbXkKLSAgICAgICAgICAvLyBkZXNjcmlwdG9yIHdpbGwgd29yayB3ZWxsIGFuZCBpZiB0aGUgdHlwZSBzaG91bGQgYmUgZW51bSwgYQotICAgICAgICAgIC8vIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHdpbGwgYmUgdGhyb3duIGxhdHRlci4gSW4gZWl0aGVyCi0gICAgICAgICAgLy8gY2FzZSwgdGhlIGNvZGUgd29ya3MgYXMgZXhwZWN0ZWQ6IHdlIGFsbG93IHVua25vd24gbWVzc2FnZSB0eXBlcwotICAgICAgICAgIC8vIGJ1dCBub3QgdW5rbndvbiBlbnVtIHR5cGVzLgotICAgICAgICAgIHJlc3VsdCA9IG5ldyBEZXNjcmlwdG9yKGZ1bGxuYW1lKTsKLSAgICAgICAgICAvLyBBZGQgdGhlIHBsYWNlaG9sZGVyIGZpbGUgYXMgYSBkZXBlbmRlbmN5IHNvIHdlIGNhbiBmaW5kIHRoZQotICAgICAgICAgIC8vIHBsYWNlaG9sZGVyIHN5bWJvbCB3aGVuIHJlc29sdmluZyBvdGhlciByZWZlcmVuY2VzLgotICAgICAgICAgIHRoaXMuZGVwZW5kZW5jaWVzLmFkZChyZXN1bHQuZ2V0RmlsZSgpKTsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihyZWxhdGl2ZVRvLAotICAgICAgICAgICAgICAnXCInICsgbmFtZSArICJcIiBpcyBub3QgZGVmaW5lZC4iKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgc3ltYm9sIHRvIHRoZSBzeW1ib2wgdGFibGUuICBJZiBhIHN5bWJvbCB3aXRoIHRoZSBzYW1lIG5hbWUKLSAgICAgKiBhbHJlYWR5IGV4aXN0cywgdGhyb3dzIGFuIGVycm9yLgotICAgICAqLwotICAgIHZvaWQgYWRkU3ltYm9sKGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIGRlc2NyaXB0b3IpCi0gICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgdmFsaWRhdGVTeW1ib2xOYW1lKGRlc2NyaXB0b3IpOwotCi0gICAgICBmaW5hbCBTdHJpbmcgZnVsbE5hbWUgPSBkZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCk7Ci0gICAgICBmaW5hbCBpbnQgZG90cG9zID0gZnVsbE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLQotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3Igb2xkID0gZGVzY3JpcHRvcnNCeU5hbWUucHV0KGZ1bGxOYW1lLCBkZXNjcmlwdG9yKTsKLSAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICBkZXNjcmlwdG9yc0J5TmFtZS5wdXQoZnVsbE5hbWUsIG9sZCk7Ci0KLSAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0RmlsZSgpID09IG9sZC5nZXRGaWxlKCkpIHsKLSAgICAgICAgICBpZiAoZG90cG9zID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAnXCInICsgZnVsbE5hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAnXCInICsgZnVsbE5hbWUuc3Vic3RyaW5nKGRvdHBvcyArIDEpICsKLSAgICAgICAgICAgICAgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcIiIgKwotICAgICAgICAgICAgICBmdWxsTmFtZS5zdWJzdHJpbmcoMCwgZG90cG9zKSArICJcIi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICdcIicgKyBmdWxsTmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZmlsZSBcIiIgKwotICAgICAgICAgICAgb2xkLmdldEZpbGUoKS5nZXROYW1lKCkgKyAiXCIuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXByZXNlbnRzIGEgcGFja2FnZSBpbiB0aGUgc3ltYm9sIHRhYmxlLiAgV2UgdXNlIFBhY2thZ2VEZXNjcmlwdG9ycwotICAgICAqIGp1c3QgYXMgcGxhY2Vob2xkZXJzIHNvIHRoYXQgc29tZW9uZSBjYW5ub3QgZGVmaW5lLCBzYXksIGEgbWVzc2FnZSB0eXBlCi0gICAgICogdGhhdCBoYXMgdGhlIHNhbWUgbmFtZSBhcyBhbiBleGlzdGluZyBwYWNrYWdlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFBhY2thZ2VEZXNjcmlwdG9yIGV4dGVuZHMgR2VuZXJpY0Rlc2NyaXB0b3IgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTWVzc2FnZSB0b1Byb3RvKCkgewotICAgICAgICByZXR1cm4gZmlsZS50b1Byb3RvKCk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBmdWxsTmFtZTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7Ci0gICAgICAgIHJldHVybiBmaWxlOwotICAgICAgfQotCi0gICAgICBQYWNrYWdlRGVzY3JpcHRvcihmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgU3RyaW5nIGZ1bGxOYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSkgewotICAgICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgICB0aGlzLmZ1bGxOYW1lID0gZnVsbE5hbWU7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG5hbWU7Ci0gICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKLSAgICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgcGFja2FnZSB0byB0aGUgc3ltYm9sIHRhYmxlcy4gIElmIGEgcGFja2FnZSBieSB0aGUgc2FtZSBuYW1lCi0gICAgICogYWxyZWFkeSBleGlzdHMsIHRoYXQgaXMgZmluZSwgYnV0IGlmIHNvbWUgb3RoZXIga2luZCBvZiBzeW1ib2wgZXhpc3RzCi0gICAgICogdW5kZXIgdGhlIHNhbWUgbmFtZSwgYW4gZXhjZXB0aW9uIGlzIHRocm93bi4gIElmIHRoZSBwYWNrYWdlIGhhcwotICAgICAqIG11bHRpcGxlIGNvbXBvbmVudHMsIHRoaXMgYWxzbyBhZGRzIHRoZSBwYXJlbnQgcGFja2FnZShzKS4KLSAgICAgKi8KLSAgICB2b2lkIGFkZFBhY2thZ2UoZmluYWwgU3RyaW5nIGZ1bGxOYW1lLCBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlKQotICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBpbnQgZG90cG9zID0gZnVsbE5hbWUubGFzdEluZGV4T2YoJy4nKTsKLSAgICAgIGZpbmFsIFN0cmluZyBuYW1lOwotICAgICAgaWYgKGRvdHBvcyA9PSAtMSkgewotICAgICAgICBuYW1lID0gZnVsbE5hbWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhZGRQYWNrYWdlKGZ1bGxOYW1lLnN1YnN0cmluZygwLCBkb3Rwb3MpLCBmaWxlKTsKLSAgICAgICAgbmFtZSA9IGZ1bGxOYW1lLnN1YnN0cmluZyhkb3Rwb3MgKyAxKTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3Igb2xkID0KLSAgICAgICAgZGVzY3JpcHRvcnNCeU5hbWUucHV0KGZ1bGxOYW1lLAotICAgICAgICAgIG5ldyBQYWNrYWdlRGVzY3JpcHRvcihuYW1lLCBmdWxsTmFtZSwgZmlsZSkpOwotICAgICAgaWYgKG9sZCAhPSBudWxsKSB7Ci0gICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lLnB1dChmdWxsTmFtZSwgb2xkKTsKLSAgICAgICAgaWYgKCEob2xkIGluc3RhbmNlb2YgUGFja2FnZURlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGZpbGUsCi0gICAgICAgICAgICAgICdcIicgKyBuYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYSAiCi0gICAgICAgICAgICAgICsgInBhY2thZ2UpIGluIGZpbGUgXCIiICsgb2xkLmdldEZpbGUoKS5nZXROYW1lKCkgKyAiXCIuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQSAoR2VuZXJpY0Rlc2NyaXB0b3IsIGludCkgcGFpciwgdXNlZCBhcyBhIG1hcCBrZXkuICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRGVzY3JpcHRvckludFBhaXIgewotICAgICAgcHJpdmF0ZSBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyOwotCi0gICAgICBEZXNjcmlwdG9ySW50UGFpcihmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIHRoaXMubnVtYmVyID0gbnVtYmVyOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yLmhhc2hDb2RlKCkgKiAoKDEgPDwgMTYpIC0gMSkgKyBudW1iZXI7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3JJbnRQYWlyKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBmaW5hbCBEZXNjcmlwdG9ySW50UGFpciBvdGhlciA9IChEZXNjcmlwdG9ySW50UGFpcilvYmo7Ci0gICAgICAgIHJldHVybiBkZXNjcmlwdG9yID09IG90aGVyLmRlc2NyaXB0b3IgJiYgbnVtYmVyID09IG90aGVyLm51bWJlcjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGEgZmllbGQgdG8gdGhlIGZpZWxkc0J5TnVtYmVyIHRhYmxlLiAgVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiBhCi0gICAgICogZmllbGQgd2l0aCB0aGUgc2FtZSBjb250YWluaW5nIHR5cGUgYW5kIG51bWJlciBhbHJlYWR5IGV4aXN0cy4KLSAgICAgKi8KLSAgICB2b2lkIGFkZEZpZWxkQnlOdW1iZXIoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKQotICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBEZXNjcmlwdG9ySW50UGFpciBrZXkgPQotICAgICAgICBuZXcgRGVzY3JpcHRvckludFBhaXIoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSwgZmllbGQuZ2V0TnVtYmVyKCkpOwotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIG9sZCA9IGZpZWxkc0J5TnVtYmVyLnB1dChrZXksIGZpZWxkKTsKLSAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICBmaWVsZHNCeU51bWJlci5wdXQoa2V5LCBvbGQpOwotICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oZmllbGQsCi0gICAgICAgICAgIkZpZWxkIG51bWJlciAiICsgZmllbGQuZ2V0TnVtYmVyKCkgKwotICAgICAgICAgICIgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIFwiIiArCi0gICAgICAgICAgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRGdWxsTmFtZSgpICsKLSAgICAgICAgICAiXCIgYnkgZmllbGQgXCIiICsgb2xkLmdldE5hbWUoKSArICJcIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGVudW0gdmFsdWUgdG8gdGhlIGVudW1WYWx1ZXNCeU51bWJlciB0YWJsZS4gIElmIGFuIGVudW0gdmFsdWUKLSAgICAgKiB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIG51bWJlciBhbHJlYWR5IGV4aXN0cywgZG9lcyBub3RoaW5nLiAgKFRoaXMgaXMKLSAgICAgKiBhbGxvd2VkOyB0aGUgZmlyc3QgdmFsdWUgZGVmaW5lIHdpdGggdGhlIG51bWJlciB0YWtlcyBwcmVjZWRlbmNlLikKLSAgICAgKi8KLSAgICB2b2lkIGFkZEVudW1WYWx1ZUJ5TnVtYmVyKGZpbmFsIEVudW1WYWx1ZURlc2NyaXB0b3IgdmFsdWUpIHsKLSAgICAgIGZpbmFsIERlc2NyaXB0b3JJbnRQYWlyIGtleSA9Ci0gICAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcih2YWx1ZS5nZXRUeXBlKCksIHZhbHVlLmdldE51bWJlcigpKTsKLSAgICAgIGZpbmFsIEVudW1WYWx1ZURlc2NyaXB0b3Igb2xkID0gZW51bVZhbHVlc0J5TnVtYmVyLnB1dChrZXksIHZhbHVlKTsKLSAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICBlbnVtVmFsdWVzQnlOdW1iZXIucHV0KGtleSwgb2xkKTsKLSAgICAgICAgLy8gTm90IGFuIGVycm9yOiAgTXVsdGlwbGUgZW51bSB2YWx1ZXMgbWF5IGhhdmUgdGhlIHNhbWUgbnVtYmVyLCBidXQKLSAgICAgICAgLy8gd2Ugb25seSB3YW50IHRoZSBmaXJzdCBvbmUgaW4gdGhlIG1hcC4KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSBkZXNjcmlwdG9yJ3MgbmFtZSBpcyB2YWxpZCAoaS5lLiBpdCBjb250YWlucyBvbmx5Ci0gICAgICogbGV0dGVycywgZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMsIGFuZCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgZGlnaXQpLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlU3ltYm9sTmFtZShmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsICJNaXNzaW5nIG5hbWUuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBuYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAvLyBOb24tQVNDSUkgY2hhcmFjdGVycyBhcmUgbm90IHZhbGlkIGluIHByb3RvYnVmIGlkZW50aWZpZXJzLCBldmVuCi0gICAgICAgICAgLy8gaWYgdGhleSBhcmUgbGV0dGVycyBvciBkaWdpdHMuCi0gICAgICAgICAgaWYgKGMgPj0gMTI4KSB7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBGaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBsZXR0ZXIgb3IgXy4gIFN1YnNlcXVlbnQgY2hhcmFjdGVycyBtYXkKLSAgICAgICAgICAvLyBiZSBsZXR0ZXJzLCBudW1iZXJzLCBvciBkaWdpdHMuCi0gICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSB8fCBjID09ICdfJyB8fAotICAgICAgICAgICAgICAoQ2hhcmFjdGVyLmlzRGlnaXQoYykgJiYgaSA+IDApKSB7Ci0gICAgICAgICAgICAvLyBWYWxpZAotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXZhbGlkKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICdcIicgKyBuYW1lICsgIlwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiogRGVzY3JpYmVzIGFuIG9uZW9mIG9mIGEgbWVzc2FnZSB0eXBlLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIE9uZW9mRGVzY3JpcHRvciB7Ci0gICAgLyoqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LiAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQotCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9Ci0KLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7IH0KLQotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7IHJldHVybiBmdWxsTmFtZTsgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0Q29udGFpbmluZ1R5cGUoKSB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQotCi0gICAgcHVibGljIGludCBnZXRGaWVsZENvdW50KCkgeyByZXR1cm4gZmllbGRDb3VudDsgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgdGhpcyBtZXNzYWdlIHR5cGUncyBmaWVsZHMuICovCi0gICAgcHVibGljIExpc3Q8RmllbGREZXNjcmlwdG9yPiBnZXRGaWVsZHMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGZpZWxkcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0RmllbGQoaW50IGluZGV4KSB7Ci0gICAgICByZXR1cm4gZmllbGRzW2luZGV4XTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIE9uZW9mRGVzY3JpcHRvcihmaW5hbCBPbmVvZkRlc2NyaXB0b3JQcm90byBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkKLSAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0gICAgICBmdWxsTmFtZSA9IGNvbXB1dGVGdWxsTmFtZShmaWxlLCBwYXJlbnQsIHByb3RvLmdldE5hbWUoKSk7Ci0gICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotCi0gICAgICBjb250YWluaW5nVHlwZSA9IHBhcmVudDsKLSAgICAgIGZpZWxkQ291bnQgPSAwOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotICAgIHByaXZhdGUgT25lb2ZEZXNjcmlwdG9yUHJvdG8gcHJvdG87Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOwotCi0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlOwotICAgIHByaXZhdGUgaW50IGZpZWxkQ291bnQ7Ci0gICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0b3JbXSBmaWVsZHM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRG91YmxlQXJyYXlMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0RvdWJsZUFycmF5TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTU0M2I4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRG91YmxlQXJyYXlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRG91YmxlTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgRG91YmxlTGlzdH0gb24gdG9wIG9mIGEgcHJpbWl0aXZlIGFycmF5LgotICogCi0gKiBAYXV0aG9yIGR3ZWlzQGdvb2dsZS5jb20gKERhbmllbCBXZWlzKQotICovCi1maW5hbCBjbGFzcyBEb3VibGVBcnJheUxpc3QKLSAgICBleHRlbmRzIEFic3RyYWN0UHJvdG9idWZMaXN0PERvdWJsZT4gaW1wbGVtZW50cyBEb3VibGVMaXN0LCBSYW5kb21BY2Nlc3MgewotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRG91YmxlQXJyYXlMaXN0IEVNUFRZX0xJU1QgPSBuZXcgRG91YmxlQXJyYXlMaXN0KCk7Ci0gIHN0YXRpYyB7Ci0gICAgRU1QVFlfTElTVC5tYWtlSW1tdXRhYmxlKCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgRG91YmxlQXJyYXlMaXN0IGVtcHR5TGlzdCgpIHsKLSAgICByZXR1cm4gRU1QVFlfTElTVDsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZSBiYWNraW5nIHN0b3JlIGZvciB0aGUgbGlzdC4KLSAgICovCi0gIHByaXZhdGUgZG91YmxlW10gYXJyYXk7Ci0gIAotICAvKioKLSAgICogVGhlIHNpemUgb2YgdGhlIGxpc3QgZGlzdGluY3QgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4gVGhhdCBpcywgaXQgaXMgdGhlIG51bWJlciBvZgotICAgKiBlbGVtZW50cyBzZXQgaW4gdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIGludCBzaXplOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG11dGFibGUge0Bjb2RlIERvdWJsZUFycmF5TGlzdH0gd2l0aCBkZWZhdWx0IGNhcGFjaXR5LgotICAgKi8KLSAgRG91YmxlQXJyYXlMaXN0KCkgewotICAgIHRoaXMobmV3IGRvdWJsZVtERUZBVUxUX0NBUEFDSVRZXSwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBtdXRhYmxlIHtAY29kZSBEb3VibGVBcnJheUxpc3R9IGNvbnRhaW5pbmcgdGhlIHNhbWUgZWxlbWVudHMgYXMge0Bjb2RlIG90aGVyfS4KLSAgICovCi0gIHByaXZhdGUgRG91YmxlQXJyYXlMaXN0KGRvdWJsZVtdIGFycmF5LCBpbnQgc2l6ZSkgewotICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICB0aGlzLnNpemUgPSBzaXplOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKHRoaXMgPT0gbykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG8gaW5zdGFuY2VvZiBEb3VibGVBcnJheUxpc3QpKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotICAgIH0KLSAgICBEb3VibGVBcnJheUxpc3Qgb3RoZXIgPSAoRG91YmxlQXJyYXlMaXN0KSBvOwotICAgIGlmIChzaXplICE9IG90aGVyLnNpemUpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgZmluYWwgZG91YmxlW10gYXJyID0gb3RoZXIuYXJyYXk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChhcnJheVtpXSAhPSBhcnJbaV0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIGludCByZXN1bHQgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBsb25nIGJpdHMgPSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhhcnJheVtpXSk7Ci0gICAgICByZXN1bHQgPSAoMzEgKiByZXN1bHQpICsgSW50ZXJuYWwuaGFzaExvbmcoYml0cyk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIERvdWJsZUxpc3QgbXV0YWJsZUNvcHlXaXRoQ2FwYWNpdHkoaW50IGNhcGFjaXR5KSB7Ci0gICAgaWYgKGNhcGFjaXR5IDwgc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IERvdWJsZUFycmF5TGlzdChBcnJheXMuY29weU9mKGFycmF5LCBjYXBhY2l0eSksIHNpemUpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIERvdWJsZSBnZXQoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGdldERvdWJsZShpbmRleCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBnZXREb3VibGUoaW50IGluZGV4KSB7Ci0gICAgZW5zdXJlSW5kZXhJblJhbmdlKGluZGV4KTsKLSAgICByZXR1cm4gYXJyYXlbaW5kZXhdOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRG91YmxlIHNldChpbnQgaW5kZXgsIERvdWJsZSBlbGVtZW50KSB7Ci0gICAgcmV0dXJuIHNldERvdWJsZShpbmRleCwgZWxlbWVudCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGRvdWJsZSBzZXREb3VibGUoaW50IGluZGV4LCBkb3VibGUgZWxlbWVudCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGVuc3VyZUluZGV4SW5SYW5nZShpbmRleCk7Ci0gICAgZG91YmxlIHByZXZpb3VzVmFsdWUgPSBhcnJheVtpbmRleF07Ci0gICAgYXJyYXlbaW5kZXhdID0gZWxlbWVudDsKLSAgICByZXR1cm4gcHJldmlvdXNWYWx1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBEb3VibGUgZWxlbWVudCkgewotICAgIGFkZERvdWJsZShpbmRleCwgZWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI2FkZChEb3VibGUpfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGREb3VibGUoZG91YmxlIGVsZW1lbnQpIHsKLSAgICBhZGREb3VibGUoc2l6ZSwgZWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI2FkZChpbnQsIERvdWJsZSl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFkZERvdWJsZShpbnQgaW5kZXgsIGRvdWJsZSBlbGVtZW50KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+IHNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKG1ha2VPdXRPZkJvdW5kc0V4Y2VwdGlvbk1lc3NhZ2UoaW5kZXgpKTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKHNpemUgPCBhcnJheS5sZW5ndGgpIHsKLSAgICAgIC8vIFNoaWZ0IGV2ZXJ5dGhpbmcgb3ZlciB0byBtYWtlIHJvb20KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCBhcnJheSwgaW5kZXggKyAxLCBzaXplIC0gaW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBSZXNpemUgdG8gMS41eCB0aGUgc2l6ZQotICAgICAgaW50IGxlbmd0aCA9ICgoc2l6ZSAqIDMpIC8gMikgKyAxOwotICAgICAgZG91YmxlW10gbmV3QXJyYXkgPSBuZXcgZG91YmxlW2xlbmd0aF07Ci0gICAgICAKLSAgICAgIC8vIENvcHkgdGhlIGZpcnN0IHBhcnQgZGlyZWN0bHkKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIG5ld0FycmF5LCAwLCBpbmRleCk7Ci0gICAgICAKLSAgICAgIC8vIENvcHkgdGhlIHJlc3Qgc2hpZnRlZCBvdmVyIGJ5IG9uZSB0byBtYWtlIHJvb20KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCBuZXdBcnJheSwgaW5kZXggKyAxLCBzaXplIC0gaW5kZXgpOwotICAgICAgYXJyYXkgPSBuZXdBcnJheTsKLSAgICB9Ci0KLSAgICBhcnJheVtpbmRleF0gPSBlbGVtZW50OwotICAgIHNpemUrKzsKLSAgICBtb2RDb3VudCsrOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBEb3VibGU+IGNvbGxlY3Rpb24pIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICAKLSAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gV2Ugc3BlY2lhbGl6ZSB3aGVuIGFkZGluZyBhbm90aGVyIERvdWJsZUFycmF5TGlzdCB0byBhdm9pZCBib3hpbmcgZWxlbWVudHMuCi0gICAgaWYgKCEoY29sbGVjdGlvbiBpbnN0YW5jZW9mIERvdWJsZUFycmF5TGlzdCkpIHsKLSAgICAgIHJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIERvdWJsZUFycmF5TGlzdCBsaXN0ID0gKERvdWJsZUFycmF5TGlzdCkgY29sbGVjdGlvbjsKLSAgICBpZiAobGlzdC5zaXplID09IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaW50IG92ZXJmbG93ID0gSW50ZWdlci5NQVhfVkFMVUUgLSBzaXplOwotICAgIGlmIChvdmVyZmxvdyA8IGxpc3Quc2l6ZSkgewotICAgICAgLy8gV2UgY2FuJ3QgYWN0dWFsbHkgcmVwcmVzZW50IGEgbGlzdCB0aGlzIGxhcmdlLgotICAgICAgdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3IoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IG5ld1NpemUgPSBzaXplICsgbGlzdC5zaXplOwotICAgIGlmIChuZXdTaXplID4gYXJyYXkubGVuZ3RoKSB7Ci0gICAgICBhcnJheSA9IEFycmF5cy5jb3B5T2YoYXJyYXksIG5ld1NpemUpOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGxpc3QuYXJyYXksIDAsIGFycmF5LCBzaXplLCBsaXN0LnNpemUpOwotICAgIHNpemUgPSBuZXdTaXplOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKG8uZXF1YWxzKGFycmF5W2ldKSkgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpICsgMSwgYXJyYXksIGksIHNpemUgLSBpKTsKLSAgICAgICAgc2l6ZS0tOwotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBEb3VibGUgcmVtb3ZlKGludCBpbmRleCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGVuc3VyZUluZGV4SW5SYW5nZShpbmRleCk7Ci0gICAgZG91YmxlIHZhbHVlID0gYXJyYXlbaW5kZXhdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4ICsgMSwgYXJyYXksIGluZGV4LCBzaXplIC0gaW5kZXgpOwotICAgIHNpemUtLTsKLSAgICBtb2RDb3VudCsrOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoYXQgdGhlIHByb3ZpZGVkIHtAY29kZSBpbmRleH0gaXMgd2l0aGluIHRoZSByYW5nZSBvZiB7QGNvZGUgWzAsIHNpemVdfS4gVGhyb3dzIGFuCi0gICAqIHtAbGluayBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9ufSBpZiBpdCBpcyBub3QuCi0gICAqIAotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHRvIHZlcmlmeSBpcyBpbiByYW5nZQotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUluZGV4SW5SYW5nZShpbnQgaW5kZXgpIHsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKG1ha2VPdXRPZkJvdW5kc0V4Y2VwdGlvbk1lc3NhZ2UoaW5kZXgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyBtYWtlT3V0T2ZCb3VuZHNFeGNlcHRpb25NZXNzYWdlKGludCBpbmRleCkgewotICAgIHJldHVybiAiSW5kZXg6IiArIGluZGV4ICsgIiwgU2l6ZToiICsgc2l6ZTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTlhOWU4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRHluYW1pY01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY3NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLk9uZW9mRGVzY3JpcHRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTWVzc2FnZX0gdGhhdCBjYW4gcmVwcmVzZW50IGFyYml0cmFyeSB0eXBlcywKLSAqIGdpdmVuIGEge0BsaW5rIERlc2NyaXB0b3JzLkRlc2NyaXB0b3J9LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBEeW5hbWljTWVzc2FnZSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZSB7Ci0gIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvciB0eXBlOwotICBwcml2YXRlIGZpbmFsIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzOwotICBwcml2YXRlIGZpbmFsIEZpZWxkRGVzY3JpcHRvcltdIG9uZW9mQ2FzZXM7Ci0gIHByaXZhdGUgZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHM7Ci0gIHByaXZhdGUgaW50IG1lbW9pemVkU2l6ZSA9IC0xOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgRHluYW1pY01lc3NhZ2V9IHVzaW5nIHRoZSBnaXZlbiB7QGNvZGUgRmllbGRTZXR9LgotICAgKiBvbmVvZkNhc2VzIHN0b3JlcyB0aGUgRmllbGREZXNjcmlwdG9yIGZvciBlYWNoIG9uZW9mIHRvIGluZGljYXRlCi0gICAqIHdoaWNoIGZpZWxkIGlzIHNldC4gQ2FsbGVyIHNob3VsZCBtYWtlIHN1cmUgdGhlIGFycmF5IGlzIGltbXV0YWJsZS4KLSAgICoKLSAgICogVGhpcyBjb25zdHJ1Y3RvciBpcyBwYWNrYWdlIHByaXZhdGUgYW5kIHdpbGwgYmUgdXNlZCBpbgotICAgKiB7QGNvZGUgRHluYW1pY011dGFibGVNZXNzYWdlfSB0byBjb252ZXJ0IGEgbXV0YWJsZSBtZXNzYWdlIHRvIGFuIGltbXV0YWJsZQotICAgKiBtZXNzYWdlLgotICAgKi8KLSAgRHluYW1pY01lc3NhZ2UoRGVzY3JpcHRvciB0eXBlLCBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkcywKLSAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yW10gb25lb2ZDYXNlcywKLSAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIHRoaXMuZmllbGRzID0gZmllbGRzOwotICAgIHRoaXMub25lb2ZDYXNlcyA9IG9uZW9mQ2FzZXM7Ci0gICAgdGhpcy51bmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkczsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSB7QGNvZGUgRHluYW1pY01lc3NhZ2V9IHJlcHJlc2VudGluZyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUKLSAgICogZ2l2ZW4gdHlwZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgZ2V0RGVmYXVsdEluc3RhbmNlKERlc2NyaXB0b3IgdHlwZSkgewotICAgIGludCBvbmVvZkRlY2xDb3VudCA9IHR5cGUudG9Qcm90bygpLmdldE9uZW9mRGVjbENvdW50KCk7Ci0gICAgRmllbGREZXNjcmlwdG9yW10gb25lb2ZDYXNlcyA9IG5ldyBGaWVsZERlc2NyaXB0b3Jbb25lb2ZEZWNsQ291bnRdOwotICAgIHJldHVybiBuZXcgRHluYW1pY01lc3NhZ2UodHlwZSwgRmllbGRTZXQuPEZpZWxkRGVzY3JpcHRvcj5lbXB0eVNldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lb2ZDYXNlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gIH0KLQotCi0gIC8qKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLiAqLwotICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGlucHV0KS5idWlsZFBhcnNlZCgpOwotICB9Ci0KLSAgLyoqIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0uICovCi0gIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKAotICAgICAgRGVzY3JpcHRvciB0eXBlLAotICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZFBhcnNlZCgpOwotICB9Ci0KLSAgLyoqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHJldHVybiBpdC4gKi8KLSAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBCeXRlU3RyaW5nIGRhdGEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShkYXRhKS5idWlsZFBhcnNlZCgpOwotICB9Ci0KLSAgLyoqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHJldHVybiBpdC4gKi8KLSAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBCeXRlU3RyaW5nIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpLmJ1aWxkUGFyc2VkKCk7Ci0gIH0KLQotICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJuIGl0LiAqLwotICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIGJ5dGVbXSBkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oZGF0YSkuYnVpbGRQYXJzZWQoKTsKLSAgfQotCi0gIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm4gaXQuICovCi0gIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgYnl0ZVtdIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpLmJ1aWxkUGFyc2VkKCk7Ci0gIH0KLQotICAvKiogUGFyc2UgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgcmV0dXJuIGl0LiAqLwotICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShpbnB1dCkuYnVpbGRQYXJzZWQoKTsKLSAgfQotCi0gIC8qKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCByZXR1cm4gaXQuICovCi0gIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpLmJ1aWxkUGFyc2VkKCk7Ci0gIH0KLQotICAvKiogQ29uc3RydWN0IGEge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0gZm9yIHRoZSBnaXZlbiB0eXBlLiAqLwotICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcihEZXNjcmlwdG9yIHR5cGUpIHsKLSAgICByZXR1cm4gbmV3IEJ1aWxkZXIodHlwZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGEge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0gZm9yIGEgbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIGFzCi0gICAqIHtAY29kZSBwcm90b3R5cGV9LCBhbmQgaW5pdGlhbGl6ZSBpdCB3aXRoIHtAY29kZSBwcm90b3R5cGV9J3MgY29udGVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcihNZXNzYWdlIHByb3RvdHlwZSkgewotICAgIHJldHVybiBuZXcgQnVpbGRlcihwcm90b3R5cGUuZ2V0RGVzY3JpcHRvckZvclR5cGUoKSkubWVyZ2VGcm9tKHByb3RvdHlwZSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBJbXBsZW1lbnRhdGlvbiBvZiBNZXNzYWdlIGludGVyZmFjZS4KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIER5bmFtaWNNZXNzYWdlIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIGdldERlZmF1bHRJbnN0YW5jZSh0eXBlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7Ci0gICAgcmV0dXJuIGZpZWxkcy5nZXRBbGxGaWVsZHMoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBoYXNPbmVvZihPbmVvZkRlc2NyaXB0b3Igb25lb2YpIHsKLSAgICB2ZXJpZnlPbmVvZkNvbnRhaW5pbmdUeXBlKG9uZW9mKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBvbmVvZkNhc2VzW29uZW9mLmdldEluZGV4KCldOwotICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgdmVyaWZ5T25lb2ZDb250YWluaW5nVHlwZShvbmVvZik7Ci0gICAgcmV0dXJuIG9uZW9mQ2FzZXNbb25lb2YuZ2V0SW5kZXgoKV07Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgIHJldHVybiBmaWVsZHMuaGFzRmllbGQoZmllbGQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgIE9iamVjdCByZXN1bHQgPSBmaWVsZHMuZ2V0RmllbGQoZmllbGQpOwotICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICByZXN1bHQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICByZXN1bHQgPSBnZXREZWZhdWx0SW5zdGFuY2UoZmllbGQuZ2V0TWVzc2FnZVR5cGUoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgcmV0dXJuIGZpZWxkcy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgewotICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICByZXR1cm4gZmllbGRzLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldFVua25vd25GaWVsZHMoKSB7Ci0gICAgcmV0dXJuIHVua25vd25GaWVsZHM7Ci0gIH0KLQotICBzdGF0aWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKERlc2NyaXB0b3IgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkcykgewotICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KLSAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IHR5cGUuZ2V0RmllbGRzKCkpIHsKLSAgICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkpIHsKLSAgICAgICAgaWYgKCFmaWVsZHMuaGFzRmllbGQoZmllbGQpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCi0gICAgcmV0dXJuIGZpZWxkcy5pc0luaXRpYWxpemVkKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICByZXR1cm4gaXNJbml0aWFsaXplZCh0eXBlLCBmaWVsZHMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmICh0eXBlLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpKSB7Ci0gICAgICBmaWVsZHMud3JpdGVNZXNzYWdlU2V0VG8ob3V0cHV0KTsKLSAgICAgIHVua25vd25GaWVsZHMud3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmaWVsZHMud3JpdGVUbyhvdXRwdXQpOwotICAgICAgdW5rbm93bkZpZWxkcy53cml0ZVRvKG91dHB1dCk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgaW50IHNpemUgPSBtZW1vaXplZFNpemU7Ci0gICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOwotCi0gICAgaWYgKHR5cGUuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkpIHsKLSAgICAgIHNpemUgPSBmaWVsZHMuZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTsKLSAgICB9IGVsc2UgewotICAgICAgc2l6ZSA9IGZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgc2l6ZSArPSB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgfQotCi0gICAgbWVtb2l6ZWRTaXplID0gc2l6ZTsKLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gbmV3IEJ1aWxkZXIodHlwZSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgewotICAgIHJldHVybiBuZXdCdWlsZGVyRm9yVHlwZSgpLm1lcmdlRnJvbSh0aGlzKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgUGFyc2VyPER5bmFtaWNNZXNzYWdlPiBnZXRQYXJzZXJGb3JUeXBlKCkgewotICAgIHJldHVybiBuZXcgQWJzdHJhY3RQYXJzZXI8RHluYW1pY01lc3NhZ2U+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgRHluYW1pY01lc3NhZ2UgcGFyc2VQYXJ0aWFsRnJvbSgKLSAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIodHlwZSk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgYnVpbGRlci5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSkKLSAgICAgICAgICAgICAgLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKiogVmVyaWZpZXMgdGhhdCB0aGUgZmllbGQgaXMgYSBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuICovCi0gIHByaXZhdGUgdm9pZCB2ZXJpZnlDb250YWluaW5nVHlwZShGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICB9Ci0gIH0KLQotICAvKiogVmVyaWZpZXMgdGhhdCB0aGUgb25lb2YgaXMgYW4gb25lb2Ygb2YgdGhpcyBtZXNzYWdlLiAqLwotICBwcml2YXRlIHZvaWQgdmVyaWZ5T25lb2ZDb250YWluaW5nVHlwZShPbmVvZkRlc2NyaXB0b3Igb25lb2YpIHsKLSAgICBpZiAob25lb2YuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiT25lb2ZEZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgRHluYW1pY01lc3NhZ2V9cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXI+IHsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgdHlwZTsKLSAgICBwcml2YXRlIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzOwotICAgIHByaXZhdGUgZmluYWwgRmllbGREZXNjcmlwdG9yW10gb25lb2ZDYXNlczsKLSAgICBwcml2YXRlIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzOwotCi0gICAgLyoqIENvbnN0cnVjdCBhIHtAY29kZSBCdWlsZGVyfSBmb3IgdGhlIGdpdmVuIHR5cGUuICovCi0gICAgcHJpdmF0ZSBCdWlsZGVyKERlc2NyaXB0b3IgdHlwZSkgewotICAgICAgdGhpcy50eXBlID0gdHlwZTsKLSAgICAgIHRoaXMuZmllbGRzID0gRmllbGRTZXQubmV3RmllbGRTZXQoKTsKLSAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IFVua25vd25GaWVsZFNldC5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICAgIHRoaXMub25lb2ZDYXNlcyA9IG5ldyBGaWVsZERlc2NyaXB0b3JbdHlwZS50b1Byb3RvKCkuZ2V0T25lb2ZEZWNsQ291bnQoKV07Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gSW1wbGVtZW50YXRpb24gb2YgTWVzc2FnZS5CdWlsZGVyIGludGVyZmFjZS4KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyKCkgewotICAgICAgaWYgKGZpZWxkcy5pc0ltbXV0YWJsZSgpKSB7Ci0gICAgICAgIGZpZWxkcyA9IEZpZWxkU2V0Lm5ld0ZpZWxkU2V0KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZHMuY2xlYXIoKTsKLSAgICAgIH0KLSAgICAgIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oTWVzc2FnZSBvdGhlcikgewotICAgICAgaWYgKG90aGVyIGluc3RhbmNlb2YgRHluYW1pY01lc3NhZ2UpIHsKLSAgICAgICAgLy8gVGhpcyBzaG91bGQgYmUgc29tZXdoYXQgZmFzdGVyIHRoYW4gY2FsbGluZyBzdXBlci5tZXJnZUZyb20oKS4KLSAgICAgICAgRHluYW1pY01lc3NhZ2Ugb3RoZXJEeW5hbWljTWVzc2FnZSA9IChEeW5hbWljTWVzc2FnZSkgb3RoZXI7Ci0gICAgICAgIGlmIChvdGhlckR5bmFtaWNNZXNzYWdlLnR5cGUgIT0gdHlwZSkgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAibWVyZ2VGcm9tKE1lc3NhZ2UpIGNhbiBvbmx5IG1lcmdlIG1lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgICAgIGZpZWxkcy5tZXJnZUZyb20ob3RoZXJEeW5hbWljTWVzc2FnZS5maWVsZHMpOwotICAgICAgICBtZXJnZVVua25vd25GaWVsZHMob3RoZXJEeW5hbWljTWVzc2FnZS51bmtub3duRmllbGRzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvbmVvZkNhc2VzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgaWYgKG9uZW9mQ2FzZXNbaV0gPT0gbnVsbCkgewotICAgICAgICAgICAgb25lb2ZDYXNlc1tpXSA9IG90aGVyRHluYW1pY01lc3NhZ2Uub25lb2ZDYXNlc1tpXTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKChvdGhlckR5bmFtaWNNZXNzYWdlLm9uZW9mQ2FzZXNbaV0gIT0gbnVsbCkKLSAgICAgICAgICAgICAgICAmJiAob25lb2ZDYXNlc1tpXSAhPSBvdGhlckR5bmFtaWNNZXNzYWdlLm9uZW9mQ2FzZXNbaV0pKSB7Ci0gICAgICAgICAgICAgIGZpZWxkcy5jbGVhckZpZWxkKG9uZW9mQ2FzZXNbaV0pOwotICAgICAgICAgICAgICBvbmVvZkNhc2VzW2ldID0gb3RoZXJEeW5hbWljTWVzc2FnZS5vbmVvZkNhc2VzW2ldOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20ob3RoZXIpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEeW5hbWljTWVzc2FnZSBidWlsZCgpIHsKLSAgICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBmaWVsZHMsCi0gICAgICAgICAgICAgIGphdmEudXRpbC5BcnJheXMuY29weU9mKG9uZW9mQ2FzZXMsIG9uZW9mQ2FzZXMubGVuZ3RoKSwgdW5rbm93bkZpZWxkcykpOwotICAgICAgfQotICAgICAgcmV0dXJuIGJ1aWxkUGFydGlhbCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEhlbHBlciBmb3IgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKCkgbWV0aG9kcyB0byBjYWxsLiAgVGhyb3dzCi0gICAgICoge0BsaW5rIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0gaW5zdGVhZCBvZgotICAgICAqIHtAbGluayBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSBEeW5hbWljTWVzc2FnZSBidWlsZFBhcnNlZCgpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgaWYgKCFpc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oCi0gICAgICAgICAgbmV3IER5bmFtaWNNZXNzYWdlKHR5cGUsIGZpZWxkcywKLSAgICAgICAgICAgICAgamF2YS51dGlsLkFycmF5cy5jb3B5T2Yob25lb2ZDYXNlcywgb25lb2ZDYXNlcy5sZW5ndGgpLCB1bmtub3duRmllbGRzKSkKLSAgICAgICAgICAuYXNJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBidWlsZFBhcnRpYWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRHluYW1pY01lc3NhZ2UgYnVpbGRQYXJ0aWFsKCkgewotICAgICAgZmllbGRzLm1ha2VJbW11dGFibGUoKTsKLSAgICAgIER5bmFtaWNNZXNzYWdlIHJlc3VsdCA9Ci0gICAgICAgIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBmaWVsZHMsCi0gICAgICAgICAgICBqYXZhLnV0aWwuQXJyYXlzLmNvcHlPZihvbmVvZkNhc2VzLCBvbmVvZkNhc2VzLmxlbmd0aCksIHVua25vd25GaWVsZHMpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKLSAgICAgIEJ1aWxkZXIgcmVzdWx0ID0gbmV3IEJ1aWxkZXIodHlwZSk7Ci0gICAgICByZXN1bHQuZmllbGRzLm1lcmdlRnJvbShmaWVsZHMpOwotICAgICAgcmVzdWx0Lm1lcmdlVW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzKTsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkob25lb2ZDYXNlcywgMCwgcmVzdWx0Lm9uZW9mQ2FzZXMsIDAgLCBvbmVvZkNhc2VzLmxlbmd0aCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gRHluYW1pY01lc3NhZ2UuaXNJbml0aWFsaXplZCh0eXBlLCBmaWVsZHMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgewotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIER5bmFtaWNNZXNzYWdlIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7Ci0gICAgICByZXR1cm4gZ2V0RGVmYXVsdEluc3RhbmNlKHR5cGUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKLSAgICAgIHJldHVybiBmaWVsZHMuZ2V0QWxsRmllbGRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotCi0gICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJuZXdCdWlsZGVyRm9yRmllbGQgaXMgb25seSB2YWxpZCBmb3IgZmllbGRzIHdpdGggbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotCi0gICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoZmllbGQuZ2V0TWVzc2FnZVR5cGUoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzT25lb2YoT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgICB2ZXJpZnlPbmVvZkNvbnRhaW5pbmdUeXBlKG9uZW9mKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IG9uZW9mQ2FzZXNbb25lb2YuZ2V0SW5kZXgoKV07Ci0gICAgICBpZiAoZmllbGQgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldE9uZW9mRmllbGREZXNjcmlwdG9yKE9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgdmVyaWZ5T25lb2ZDb250YWluaW5nVHlwZShvbmVvZik7Ci0gICAgICByZXR1cm4gb25lb2ZDYXNlc1tvbmVvZi5nZXRJbmRleCgpXTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBjbGVhck9uZW9mKE9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgdmVyaWZ5T25lb2ZDb250YWluaW5nVHlwZShvbmVvZik7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBvbmVvZkNhc2VzW29uZW9mLmdldEluZGV4KCldOwotICAgICAgaWYgKGZpZWxkICE9IG51bGwpIHsKLSAgICAgICAgY2xlYXJGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgIHJldHVybiBmaWVsZHMuaGFzRmllbGQoZmllbGQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gZmllbGRzLmdldEZpZWxkKGZpZWxkKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICAgIHJlc3VsdCA9IGdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXN1bHQgPSBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBzZXRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgICAvLyBUT0RPKHhpYW9mZW5nKTogVGhpcyBjaGVjayBzaG91bGQgcmVhbGx5IGJlIHB1dCBpbiBGaWVsZFNldC5zZXRGaWVsZCgpCi0gICAgICAvLyB3aGVyZSBhbGwgb3RoZXIgc3VjaCBjaGVja3MgYXJlIGRvbmUuIEhvd2V2ZXIsIGN1cnJlbnRseQotICAgICAgLy8gRmllbGRTZXQuc2V0RmllbGQoKSBwZXJtaXRzIEludGVnZXIgdmFsdWUgZm9yIGVudW0gZmllbGRzIHByb2JhYmx5Ci0gICAgICAvLyBiZWNhdXNlIG9mIHNvbWUgaW50ZXJuYWwgZmVhdHVyZXMgd2Ugc3VwcG9ydC4gU2hvdWxkIGZpZ3VyZSBpdCBvdXQKLSAgICAgIC8vIGFuZCBtb3ZlIHRoaXMgY2hlY2sgdG8gYSBtb3JlIGFwcHJvcHJpYXRlIHBsYWNlLgotICAgICAgaWYgKGZpZWxkLmdldFR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNKSB7Ci0gICAgICAgIGVuc3VyZUVudW1WYWx1ZURlc2NyaXB0b3IoZmllbGQsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIE9uZW9mRGVzY3JpcHRvciBvbmVvZkRlc2NyaXB0b3IgPSBmaWVsZC5nZXRDb250YWluaW5nT25lb2YoKTsKLSAgICAgIGlmIChvbmVvZkRlc2NyaXB0b3IgIT0gbnVsbCkgewotICAgICAgICBpbnQgaW5kZXggPSBvbmVvZkRlc2NyaXB0b3IuZ2V0SW5kZXgoKTsKLSAgICAgICAgRmllbGREZXNjcmlwdG9yIG9sZEZpZWxkID0gb25lb2ZDYXNlc1tpbmRleF07Ci0gICAgICAgIGlmICgob2xkRmllbGQgIT0gbnVsbCkgJiYgKG9sZEZpZWxkICE9IGZpZWxkKSkgewotICAgICAgICAgIGZpZWxkcy5jbGVhckZpZWxkKG9sZEZpZWxkKTsKLSAgICAgICAgfQotICAgICAgICBvbmVvZkNhc2VzW2luZGV4XSA9IGZpZWxkOwotICAgICAgfQotICAgICAgZmllbGRzLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBjbGVhckZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgICBPbmVvZkRlc2NyaXB0b3Igb25lb2ZEZXNjcmlwdG9yID0gZmllbGQuZ2V0Q29udGFpbmluZ09uZW9mKCk7Ci0gICAgICBpZiAob25lb2ZEZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgaW50IGluZGV4ID0gb25lb2ZEZXNjcmlwdG9yLmdldEluZGV4KCk7Ci0gICAgICAgIGlmIChvbmVvZkNhc2VzW2luZGV4XSA9PSBmaWVsZCkgewotICAgICAgICAgIG9uZW9mQ2FzZXNbaW5kZXhdID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgZmllbGRzLmNsZWFyRmllbGQoZmllbGQpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICByZXR1cm4gZmllbGRzLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KSB7Ci0gICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICByZXR1cm4gZmllbGRzLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgICAgZmllbGRzLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4LCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICAgIGZpZWxkcy5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldFVua25vd25GaWVsZHMoKSB7Ci0gICAgICByZXR1cm4gdW5rbm93bkZpZWxkczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBzZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7Ci0gICAgICBpZiAoZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWxlKCkuZ2V0U3ludGF4KCkKLSAgICAgICAgICA9PSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5TeW50YXguUFJPVE8zKSB7Ci0gICAgICAgIC8vIFByb3RvMyBkaXNjYXJkcyB1bmtub3duIGZpZWxkcy4KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICB0aGlzLnVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7Ci0gICAgICBpZiAoZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWxlKCkuZ2V0U3ludGF4KCkKLSAgICAgICAgICA9PSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5TeW50YXguUFJPVE8zKSB7Ci0gICAgICAgIC8vIFByb3RvMyBkaXNjYXJkcyB1bmtub3duIGZpZWxkcy4KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICB0aGlzLnVua25vd25GaWVsZHMgPQotICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcih0aGlzLnVua25vd25GaWVsZHMpCi0gICAgICAgICAgICAgICAgICAgICAgIC5tZXJnZUZyb20odW5rbm93bkZpZWxkcykKLSAgICAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKiogVmVyaWZpZXMgdGhhdCB0aGUgZmllbGQgaXMgYSBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnRhaW5pbmdUeXBlKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gdHlwZSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJGaWVsZERlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBWZXJpZmllcyB0aGF0IHRoZSBvbmVvZiBpcyBhbiBvbmVvZiBvZiB0aGlzIG1lc3NhZ2UuICovCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeU9uZW9mQ29udGFpbmluZ1R5cGUoT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgICBpZiAob25lb2YuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIk9uZW9mRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFZlcmlmaWVzIHRoYXQgdGhlIHZhbHVlIGlzIEVudW1WYWx1ZURlc2NyaXB0b3IgYW5kIG1hdGNoZXMgRW51bSBUeXBlLiAqLwotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVTaW5ndWxhckVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgRW51bVZhbHVlRGVzY3JpcHRvcikpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRHluYW1pY01lc3NhZ2Ugc2hvdWxkIHVzZSBFbnVtVmFsdWVEZXNjcmlwdG9yIHRvIHNldCBFbnVtIFZhbHVlLiIpOwotICAgICAgfQotICAgICAgLy8gVE9ETyh4aWFvZmVuZyk6IFJlLWVuYWJsZSB0aGlzIGNoZWNrIGFmdGVyIE9yZ3N0b3JlIGlzIGZpeGVkIHRvIG5vdAotICAgICAgLy8gc2V0IGluY29ycmVjdCBFbnVtVmFsdWVEZXNjcmlwdG9ycy4KLSAgICAgIC8vIEVudW1EZXNjcmlwdG9yIGZpZWxkVHlwZSA9IGZpZWxkLmdldEVudW1UeXBlKCk7Ci0gICAgICAvLyBFbnVtRGVzY3JpcHRvciBmaWVsZFZhbHVlVHlwZSA9ICgoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpLmdldFR5cGUoKTsKLSAgICAgIC8vIGlmIChmaWVsZFR5cGUgIT0gZmllbGRWYWx1ZVR5cGUpIHsKLSAgICAgIC8vICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFN0cmluZy5mb3JtYXQoCi0gICAgICAvLyAgICAgICJFbnVtRGVzY3JpcHRvciAlcyBvZiBmaWVsZCBkb2Vzbid0IG1hdGNoIEVudW1EZXNjcmlwdG9yICVzIG9mIGZpZWxkIHZhbHVlIiwKLSAgICAgIC8vICAgICAgZmllbGRUeXBlLmdldEZ1bGxOYW1lKCksIGZpZWxkVmFsdWVUeXBlLmdldEZ1bGxOYW1lKCkpKTsKLSAgICAgIC8vIH0KLSAgICB9Ci0KLSAgICAvKiogVmVyaWZpZXMgdGhlIHZhbHVlIGZvciBhbiBlbnVtIGZpZWxkLiAqLwotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVFbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICBmb3IgKE9iamVjdCBpdGVtIDogKExpc3QpIHZhbHVlKSB7Ci0gICAgICAgICAgZW5zdXJlU2luZ3VsYXJFbnVtVmFsdWVEZXNjcmlwdG9yKGZpZWxkLCBpdGVtKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgIGVuc3VyZVNpbmd1bGFyRW51bVZhbHVlRGVzY3JpcHRvcihmaWVsZCwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVJc011dGFibGUoKSB7Ci0gICAgICBpZiAoZmllbGRzLmlzSW1tdXRhYmxlKCkpIHsKLSAgICAgICAgZmllbGRzID0gZmllbGRzLmNsb25lKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZS5CdWlsZGVyIGdldEZpZWxkQnVpbGRlcihGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIC8vIFRPRE8oeGlhbmdsKTogbmVlZCBpbXBsZW1lbnRhdGlvbiBmb3IgZHluYW1pYyBtZXNzYWdlCi0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICJnZXRGaWVsZEJ1aWxkZXIoKSBjYWxsZWQgb24gYSBkeW5hbWljIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlLkJ1aWxkZXIgZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICBpbnQgaW5kZXgpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgImdldFJlcGVhdGVkRmllbGRCdWlsZGVyKCkgY2FsbGVkIG9uIGEgZHluYW1pYyBtZXNzYWdlIHR5cGUuIik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4cGVyaW1lbnRhbEFwaS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHBlcmltZW50YWxBcGkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2NkNGM4OC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4cGVyaW1lbnRhbEFwaS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLkRvY3VtZW50ZWQ7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uRWxlbWVudFR5cGU7Ci1pbXBvcnQgamF2YS5sYW5nLmFubm90YXRpb24uUmV0ZW50aW9uOwotaW1wb3J0IGphdmEubGFuZy5hbm5vdGF0aW9uLlJldGVudGlvblBvbGljeTsKLWltcG9ydCBqYXZhLmxhbmcuYW5ub3RhdGlvbi5UYXJnZXQ7Ci0KLS8qKgotICogSW5kaWNhdGVzIGEgcHVibGljIEFQSSB0aGF0IGNhbiBjaGFuZ2UgYXQgYW55IHRpbWUsIGFuZCBoYXMgbm8gZ3VhcmFudGVlIG9mIEFQSSBzdGFiaWxpdHkgYW5kCi0gKiBiYWNrd2FyZC1jb21wYXRpYmlsaXR5LgotICoKLSAqIDxwPlVzYWdlIGd1aWRlbGluZXM6Ci0gKiA8b2w+Ci0gKiA8bGk+VGhpcyBhbm5vdGF0aW9uIGlzIHVzZWQgb25seSBvbiBwdWJsaWMgQVBJLiBJbnRlcm5hbCBpbnRlcmZhY2VzIHNob3VsZCBub3QgdXNlIGl0LjwvbGk+Ci0gKiA8bGk+VGhpcyBhbm5vdGF0aW9uIHNob3VsZCBvbmx5IGJlIGFkZGVkIHRvIG5ldyBBUElzLiBBZGRpbmcgaXQgdG8gYW4gZXhpc3RpbmcgQVBJIGlzCi0gKiBjb25zaWRlcmVkIEFQSS1icmVha2luZy48L2xpPgotICogPGxpPlJlbW92aW5nIHRoaXMgYW5ub3RhdGlvbiBmcm9tIGFuIEFQSSBnaXZlcyBpdCBzdGFibGUgc3RhdHVzLjwvbGk+Ci0gKiA8L29sPgotICovCi1AUmV0ZW50aW9uKFJldGVudGlvblBvbGljeS5TT1VSQ0UpCi1AVGFyZ2V0KHsKLSAgICBFbGVtZW50VHlwZS5BTk5PVEFUSU9OX1RZUEUsCi0gICAgRWxlbWVudFR5cGUuQ09OU1RSVUNUT1IsCi0gICAgRWxlbWVudFR5cGUuRklFTEQsCi0gICAgRWxlbWVudFR5cGUuTUVUSE9ELAotICAgIEVsZW1lbnRUeXBlLlBBQ0tBR0UsCi0gICAgRWxlbWVudFR5cGUuVFlQRX0pCi1ARG9jdW1lbnRlZAotcHVibGljIEBpbnRlcmZhY2UgRXhwZXJpbWVudGFsQXBpIHsKLSAgLyoqCi0gICAqIENvbnRleHQgaW5mb3JtYXRpb24gc3VjaCBhcyBsaW5rcyB0byBkaXNjdXNzaW9uIHRocmVhZCwgdHJhY2tpbmcgaXNzdWUgZXRjLgotICAgKi8KLSAgU3RyaW5nIHZhbHVlKCkgZGVmYXVsdCAiIjsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4ZWM1YjQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogSW50ZXJmYWNlIHRoYXQgZ2VuZXJhdGVkIGV4dGVuc2lvbnMgaW1wbGVtZW50LgotICoKLSAqIEBhdXRob3IgbGl1amlzaUBnb29nbGUuY29tIChKaXNpIExpdSkKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBUeXBlPgotICAgIGV4dGVuZHMgRXh0ZW5zaW9uTGl0ZTxDb250YWluaW5nVHlwZSwgVHlwZT4gewotCi0gIC8qKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSBleHRlbnNpb24uICovCi0gIHB1YmxpYyBhYnN0cmFjdCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpOwotCi0gIC8qKiBSZXR1cm5zIHdoZXRoZXIgb3Igbm90IHRoaXMgZXh0ZW5zaW9uIGlzIGEgTGl0ZSBFeHRlbnNpb24uICovCi0gIEBPdmVycmlkZQotICBmaW5hbCBib29sZWFuIGlzTGl0ZSgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBBbGwgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGV4dGVuc2lvbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgotCi0gIC8qKgotICAgKiBUaGUgQVBJIHR5cGUgdGhhdCB0aGUgZXh0ZW5zaW9uIGlzIHVzZWQgZm9yLgotICAgKi8KLSAgcHJvdGVjdGVkIGVudW0gRXh0ZW5zaW9uVHlwZSB7Ci0gICAgSU1NVVRBQkxFLAotICAgIE1VVEFCTEUsCi0gICAgUFJPVE8xLAotICB9Ci0KLSAgcHJvdGVjdGVkIEV4dGVuc2lvblR5cGUgZ2V0RXh0ZW5zaW9uVHlwZSgpIHsKLSAgICAvLyBUT0RPKGxpdWppc2kpOiBtYWtlIHRoaXMgYWJzdHJhY3QgYWZ0ZXIgd2UgZml4IHByb3RvMS4KLSAgICByZXR1cm4gRXh0ZW5zaW9uVHlwZS5JTU1VVEFCTEU7Ci0gIH0KLQotICAvKioKLSAgICogVHlwZSBvZiBhIG1lc3NhZ2UgZXh0ZW5zaW9uLgotICAgKi8KLSAgcHVibGljIGVudW0gTWVzc2FnZVR5cGUgewotICAgIFBST1RPMSwKLSAgICBQUk9UTzIsCi0gIH0KLSAgCi0gIC8qKgotICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGEgbWVzc2FnZSBleHRlbnNpb24gKGkuZS4sIGdldExpdGVUeXBlKCkgPT0gTUVTU0FHRSksCi0gICAqIHJldHVybnMgdGhlIHR5cGUgb2YgdGhlIG1lc3NhZ2UsIG90aGVyd2lzZSB1bmRlZmluZWQuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgZ2V0TWVzc2FnZVR5cGUoKSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VUeXBlLlBST1RPMjsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZnJvbVJlZmxlY3Rpb25UeXBlKE9iamVjdCB2YWx1ZSk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3Qgc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoT2JqZWN0IHZhbHVlKTsKLSAgcHJvdGVjdGVkIGFic3RyYWN0IE9iamVjdCB0b1JlZmxlY3Rpb25UeXBlKE9iamVjdCB2YWx1ZSk7Ci0gIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3Qgc2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKE9iamVjdCB2YWx1ZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvbkxpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uTGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOGY1YmQyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uTGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBMaXRlIGludGVyZmFjZSB0aGF0IGdlbmVyYXRlZCBleHRlbnNpb25zIGltcGxlbWVudC4KLSAqIDxwPgotICogTWV0aG9kcyBhcmUgZm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiBZb3UgY2FuIGhvbGQgYSByZWZlcmVuY2UgdG8KLSAqIGV4dGVuc2lvbnMgdXNpbmcgdGhpcyB0eXBlIG5hbWUuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlbnNpb25MaXRlPENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIFR5cGU+IHsKLQotICAvKiogUmV0dXJucyB0aGUgZmllbGQgbnVtYmVyIG9mIHRoZSBleHRlbnNpb24uICovCi0gIHB1YmxpYyBhYnN0cmFjdCBpbnQgZ2V0TnVtYmVyKCk7Ci0KLSAgLyoqIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIGZpZWxkLiAqLwotICBwdWJsaWMgYWJzdHJhY3QgV2lyZUZvcm1hdC5GaWVsZFR5cGUgZ2V0TGl0ZVR5cGUoKTsKLQotICAvKiogUmV0dXJucyB3aGV0aGVyIGl0IGlzIGEgcmVwZWF0ZWQgZmllbGQuICovCi0gIHB1YmxpYyBhYnN0cmFjdCBib29sZWFuIGlzUmVwZWF0ZWQoKTsKLQotICAvKiogUmV0dXJucyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiB0aGUgZXh0ZW5zaW9uIGZpZWxkLiAqLwotICBwdWJsaWMgYWJzdHJhY3QgVHlwZSBnZXREZWZhdWx0VmFsdWUoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uIGZpZWxkLCBpZiBpdCdzIGEgbWVzc2FnZQotICAgKiBleHRlbnNpb24uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3QgTWVzc2FnZUxpdGUgZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpOwotICAKLSAgLyoqIFJldHVybnMgd2hldGhlciBvciBub3QgdGhpcyBleHRlbnNpb24gaXMgYSBMaXRlIEV4dGVuc2lvbi4gKi8KLSAgYm9vbGVhbiBpc0xpdGUoKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnkuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA2NzM5Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvblJlZ2lzdHJ5LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzOTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaFNldDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci0KLS8qKgotICogQSB0YWJsZSBvZiBrbm93biBleHRlbnNpb25zLCBzZWFyY2hhYmxlIGJ5IG5hbWUgb3IgZmllbGQgbnVtYmVyLiAgV2hlbgotICogcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UgdGhhdCBtaWdodCBoYXZlIGV4dGVuc2lvbnMsIHlvdSBtdXN0IHByb3ZpZGUKLSAqIGFuIHtAY29kZSBFeHRlbnNpb25SZWdpc3RyeX0gaW4gd2hpY2ggeW91IGhhdmUgcmVnaXN0ZXJlZCBhbnkgZXh0ZW5zaW9ucwotICogdGhhdCB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHBhcnNlLiAgT3RoZXJ3aXNlLCB0aG9zZSBleHRlbnNpb25zIHdpbGwganVzdAotICogYmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzLgotICoKLSAqIDxwPkZvciBleGFtcGxlLCBpZiB5b3UgaGFkIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgotICoKLSAqIDxwcmU+Ci0gKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKLSAqCi0gKiBtZXNzYWdlIEZvbyB7Ci0gKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci0gKiB9Ci0gKgotICogZXh0ZW5kIEZvbyB7Ci0gKiAgIG9wdGlvbmFsIGludDMyIGJhcjsKLSAqIH0KLSAqIDwvcHJlPgotICoKLSAqIFRoZW4geW91IG1pZ2h0IHdyaXRlIGNvZGUgbGlrZToKLSAqCi0gKiA8cHJlPgotICogRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOwotICogcmVnaXN0cnkuYWRkKE15UHJvdG8uYmFyKTsKLSAqIE15UHJvdG8uRm9vIG1lc3NhZ2UgPSBNeVByb3RvLkZvby5wYXJzZUZyb20oaW5wdXQsIHJlZ2lzdHJ5KTsKLSAqIDwvcHJlPgotICoKLSAqIDxwPkJhY2tncm91bmQ6Ci0gKgotICogPHA+WW91IG1pZ2h0IHdvbmRlciB3aHkgdGhpcyBpcyBuZWNlc3NhcnkuICBUd28gYWx0ZXJuYXRpdmVzIG1pZ2h0IGNvbWUgdG8KLSAqIG1pbmQuICBGaXJzdCwgeW91IG1pZ2h0IGltYWdpbmUgYSBzeXN0ZW0gd2hlcmUgZ2VuZXJhdGVkIGV4dGVuc2lvbnMgYXJlCi0gKiBhdXRvbWF0aWNhbGx5IHJlZ2lzdGVyZWQgd2hlbiB0aGVpciBjb250YWluaW5nIGNsYXNzZXMgYXJlIGxvYWRlZC4gIFRoaXMKLSAqIGlzIGEgcG9wdWxhciB0ZWNobmlxdWUsIGJ1dCBpcyBiYWQgZGVzaWduOyBhbW9uZyBvdGhlciB0aGluZ3MsIGl0IGNyZWF0ZXMgYQotICogc2l0dWF0aW9uIHdoZXJlIGJlaGF2aW9yIGNhbiBjaGFuZ2UgZGVwZW5kaW5nIG9uIHdoYXQgY2xhc3NlcyBoYXBwZW4gdG8gYmUKLSAqIGxvYWRlZC4gIEl0IGFsc28gaW50cm9kdWNlcyBhIHNlY3VyaXR5IHZ1bG5lcmFiaWxpdHksIGJlY2F1c2UgYW4KLSAqIHVucHJpdmlsZWdlZCBjbGFzcyBjb3VsZCBjYXVzZSBpdHMgY29kZSB0byBiZSBjYWxsZWQgdW5leHBlY3RlZGx5IGZyb20gYQotICogcHJpdmlsZWdlZCBjbGFzcyBieSByZWdpc3RlcmluZyBpdHNlbGYgYXMgYW4gZXh0ZW5zaW9uIG9mIHRoZSByaWdodCB0eXBlLgotICoKLSAqIDxwPkFub3RoZXIgb3B0aW9uIHlvdSBtaWdodCBjb25zaWRlciBpcyBsYXp5IHBhcnNpbmc6IGRvIG5vdCBwYXJzZSBhbgotICogZXh0ZW5zaW9uIHVudGlsIGl0IGlzIGZpcnN0IHJlcXVlc3RlZCwgYXQgd2hpY2ggcG9pbnQgdGhlIGNhbGxlciBtdXN0Ci0gKiBwcm92aWRlIGEgdHlwZSB0byB1c2UuICBUaGlzIGludHJvZHVjZXMgYSBkaWZmZXJlbnQgc2V0IG9mIHByb2JsZW1zLiAgRmlyc3QsCi0gKiBpdCB3b3VsZCByZXF1aXJlIGEgbXV0ZXggbG9jayBhbnkgdGltZSBhbiBleHRlbnNpb24gd2FzIGFjY2Vzc2VkLCB3aGljaAotICogd291bGQgYmUgc2xvdy4gIFNlY29uZCwgY29ycnVwdCBkYXRhIHdvdWxkIG5vdCBiZSBkZXRlY3RlZCB1bnRpbCBmaXJzdAotICogYWNjZXNzLCBhdCB3aGljaCBwb2ludCBpdCB3b3VsZCBiZSBtdWNoIGhhcmRlciB0byBkZWFsIHdpdGggaXQuICBUaGlyZCwgaXQKLSAqIGNvdWxkIHZpb2xhdGUgdGhlIGV4cGVjdGF0aW9uIHRoYXQgbWVzc2FnZSBvYmplY3RzIGFyZSBpbW11dGFibGUsIHNpbmNlIHRoZQotICogdHlwZSBwcm92aWRlZCBjb3VsZCBiZSBhbnkgYXJiaXRyYXJ5IG1lc3NhZ2UgY2xhc3MuICBBbiB1bnByaXZpbGVnZWQgdXNlcgotICogY291bGQgdGFrZSBhZHZhbnRhZ2Ugb2YgdGhpcyB0byBpbmplY3QgYSBtdXRhYmxlIG9iamVjdCBpbnRvIGEgbWVzc2FnZQotICogYmVsb25naW5nIHRvIHByaXZpbGVnZWQgY29kZSBhbmQgY3JlYXRlIG1pc2NoaWVmLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb25SZWdpc3RyeSBleHRlbmRzIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSB7Ci0gIC8qKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGluc3RhbmNlLiAqLwotICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IG5ld0luc3RhbmNlKCkgewotICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uUmVnaXN0cnkoKTsKLSAgfQotCi0gIC8qKiBHZXQgdGhlIHVubW9kaWZpYWJsZSBzaW5nbGV0b24gZW1wdHkgaW5zdGFuY2UuICovCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0RW1wdHlSZWdpc3RyeSgpIHsKLSAgICByZXR1cm4gRU1QVFk7Ci0gIH0KLQotCi0gIC8qKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSByZWdpc3RyeS4gKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRVbm1vZGlmaWFibGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBFeHRlbnNpb25SZWdpc3RyeSh0aGlzKTsKLSAgfQotCi0gIC8qKiBBIChEZXNjcmlwdG9yLCBNZXNzYWdlKSBwYWlyLCByZXR1cm5lZCBieSBsb29rdXAgbWV0aG9kcy4gKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFeHRlbnNpb25JbmZvIHsKLSAgICAvKiogVGhlIGV4dGVuc2lvbidzIGRlc2NyaXB0b3IuICovCi0gICAgcHVibGljIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgLyoqCi0gICAgICogQSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBleHRlbnNpb24ncyB0eXBlLCBpZiBpdCBoYXMgYSBtZXNzYWdlIHR5cGUuCi0gICAgICogT3RoZXJ3aXNlLCB7QGNvZGUgbnVsbH0uCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlOwotCi0gICAgcHJpdmF0ZSBFeHRlbnNpb25JbmZvKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgZGVmYXVsdEluc3RhbmNlID0gbnVsbDsKLSAgICB9Ci0gICAgcHJpdmF0ZSBFeHRlbnNpb25JbmZvKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkgewotICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgIHRoaXMuZGVmYXVsdEluc3RhbmNlID0gZGVmYXVsdEluc3RhbmNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBEZXByZWNhdGVkLiBVc2Uge0BsaW5rICNmaW5kSW1tdXRhYmxlRXh0ZW5zaW9uQnlOYW1lKFN0cmluZyl9IGluc3RlYWQuCi0gICAqLwotICBwdWJsaWMgRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOYW1lKGZpbmFsIFN0cmluZyBmdWxsTmFtZSkgewotICAgIHJldHVybiBmaW5kSW1tdXRhYmxlRXh0ZW5zaW9uQnlOYW1lKGZ1bGxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kIGFuIGV4dGVuc2lvbiBmb3IgaW1tdXRhYmxlIEFQSXMgYnkgZnVsbHktcXVhbGlmaWVkIGZpZWxkIG5hbWUsCi0gICAqIGluIHRoZSBwcm90byBuYW1lc3BhY2UuIGkuZS4ge0Bjb2RlIHJlc3VsdC5kZXNjcmlwdG9yLmZ1bGxOYW1lKCl9IHdpbGwKLSAgICogbWF0Y2gge0Bjb2RlIGZ1bGxOYW1lfSBpZiBhIG1hdGNoIGlzIGZvdW5kLgotICAgKgotICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb24gaWYgZm91bmQsIG9yIHtAY29kZSBudWxsfQotICAgKiAgICAgICAgIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpb25JbmZvIGZpbmRJbW11dGFibGVFeHRlbnNpb25CeU5hbWUoZmluYWwgU3RyaW5nIGZ1bGxOYW1lKSB7Ci0gICAgcmV0dXJuIGltbXV0YWJsZUV4dGVuc2lvbnNCeU5hbWUuZ2V0KGZ1bGxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kIGFuIGV4dGVuc2lvbiBmb3IgbXV0YWJsZSBBUElzIGJ5IGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lLAotICAgKiBpbiB0aGUgcHJvdG8gbmFtZXNwYWNlLiBpLmUuIHtAY29kZSByZXN1bHQuZGVzY3JpcHRvci5mdWxsTmFtZSgpfSB3aWxsCi0gICAqIG1hdGNoIHtAY29kZSBmdWxsTmFtZX0gaWYgYSBtYXRjaCBpcyBmb3VuZC4KLSAgICoKLSAgICogQHJldHVybiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0KLSAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgRXh0ZW5zaW9uSW5mbyBmaW5kTXV0YWJsZUV4dGVuc2lvbkJ5TmFtZShmaW5hbCBTdHJpbmcgZnVsbE5hbWUpIHsKLSAgICByZXR1cm4gbXV0YWJsZUV4dGVuc2lvbnNCeU5hbWUuZ2V0KGZ1bGxOYW1lKTsKLSAgfQotCi0gIC8qKgotICAgKiBEZXByZWNhdGVkLiBVc2Uge0BsaW5rICNmaW5kSW1tdXRhYmxlRXh0ZW5zaW9uQnlOdW1iZXIoCi0gICAqIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IsIGludCl9Ci0gICAqLwotICBwdWJsaWMgRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCi0gICAgICBmaW5hbCBEZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlLCBmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKLSAgICByZXR1cm4gZmluZEltbXV0YWJsZUV4dGVuc2lvbkJ5TnVtYmVyKGNvbnRhaW5pbmdUeXBlLCBmaWVsZE51bWJlcik7Ci0gIH0KLQotICAvKioKLSAgICogRmluZCBhbiBleHRlbnNpb24gYnkgY29udGFpbmluZyB0eXBlIGFuZCBmaWVsZCBudW1iZXIgZm9yIGltbXV0YWJsZSBBUElzLgotICAgKgotICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb24gaWYgZm91bmQsIG9yIHtAY29kZSBudWxsfQotICAgKiAgICAgICAgIG90aGVyd2lzZS4KLSAgICovCi0gIHB1YmxpYyBFeHRlbnNpb25JbmZvIGZpbmRJbW11dGFibGVFeHRlbnNpb25CeU51bWJlcigKLSAgICAgIGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGUsIGZpbmFsIGludCBmaWVsZE51bWJlcikgewotICAgIHJldHVybiBpbW11dGFibGVFeHRlbnNpb25zQnlOdW1iZXIuZ2V0KAotICAgICAgbmV3IERlc2NyaXB0b3JJbnRQYWlyKGNvbnRhaW5pbmdUeXBlLCBmaWVsZE51bWJlcikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmQgYW4gZXh0ZW5zaW9uIGJ5IGNvbnRhaW5pbmcgdHlwZSBhbmQgZmllbGQgbnVtYmVyIGZvciBtdXRhYmxlIEFQSXMuCi0gICAqCi0gICAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4dGVuc2lvbiBpZiBmb3VuZCwgb3Ige0Bjb2RlIG51bGx9Ci0gICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIEV4dGVuc2lvbkluZm8gZmluZE11dGFibGVFeHRlbnNpb25CeU51bWJlcigKLSAgICAgIGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGUsIGZpbmFsIGludCBmaWVsZE51bWJlcikgewotICAgIHJldHVybiBtdXRhYmxlRXh0ZW5zaW9uc0J5TnVtYmVyLmdldCgKLSAgICAgICAgbmV3IERlc2NyaXB0b3JJbnRQYWlyKGNvbnRhaW5pbmdUeXBlLCBmaWVsZE51bWJlcikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmQgYWxsIGV4dGVuc2lvbnMgZm9yIG11dGFibGUgQVBJcyBieSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotICAgKiBleHRlbmRlZCBjbGFzcy4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIG1vcmUgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZQotICAgKiB0aGFuIGdldHRpbmcgYSBzaW5nbGUgZXh0ZW5zaW9uIGJ5IG5hbWUgb3IgbnVtYmVyLgotICAgKgotICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb25zIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUKLSAgICogICAgIGFyZSBub25lLgotICAgKi8KLSAgcHVibGljIFNldDxFeHRlbnNpb25JbmZvPiBnZXRBbGxNdXRhYmxlRXh0ZW5zaW9uc0J5RXh0ZW5kZWRUeXBlKGZpbmFsIFN0cmluZyBmdWxsTmFtZSkgewotICAgIEhhc2hTZXQ8RXh0ZW5zaW9uSW5mbz4gZXh0ZW5zaW9ucyA9IG5ldyBIYXNoU2V0PEV4dGVuc2lvbkluZm8+KCk7Ci0gICAgZm9yIChEZXNjcmlwdG9ySW50UGFpciBwYWlyIDogbXV0YWJsZUV4dGVuc2lvbnNCeU51bWJlci5rZXlTZXQoKSkgewotICAgICAgaWYgKHBhaXIuZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpLmVxdWFscyhmdWxsTmFtZSkpIHsKLSAgICAgICAgZXh0ZW5zaW9ucy5hZGQobXV0YWJsZUV4dGVuc2lvbnNCeU51bWJlci5nZXQocGFpcikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgfQotCi0gIC8qKgotICAgKiBGaW5kIGFsbCBleHRlbnNpb25zIGZvciBpbW11dGFibGUgQVBJcyBieSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZgotICAgKiBleHRlbmRlZCBjbGFzcy4gTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGlzIG1vcmUgY29tcHV0YXRpb25hbGx5IGV4cGVuc2l2ZQotICAgKiB0aGFuIGdldHRpbmcgYSBzaW5nbGUgZXh0ZW5zaW9uIGJ5IG5hbWUgb3IgbnVtYmVyLgotICAgKgotICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb25zIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0gaWYgdGhlcmUKLSAgICogICAgIGFyZSBub25lLgotICAgKi8KLSAgcHVibGljIFNldDxFeHRlbnNpb25JbmZvPiBnZXRBbGxJbW11dGFibGVFeHRlbnNpb25zQnlFeHRlbmRlZFR5cGUoZmluYWwgU3RyaW5nIGZ1bGxOYW1lKSB7Ci0gICAgSGFzaFNldDxFeHRlbnNpb25JbmZvPiBleHRlbnNpb25zID0gbmV3IEhhc2hTZXQ8RXh0ZW5zaW9uSW5mbz4oKTsKLSAgICBmb3IgKERlc2NyaXB0b3JJbnRQYWlyIHBhaXIgOiBpbW11dGFibGVFeHRlbnNpb25zQnlOdW1iZXIua2V5U2V0KCkpIHsKLSAgICAgIGlmIChwYWlyLmRlc2NyaXB0b3IuZ2V0RnVsbE5hbWUoKS5lcXVhbHMoZnVsbE5hbWUpKSB7Ci0gICAgICAgIGV4dGVuc2lvbnMuYWRkKGltbXV0YWJsZUV4dGVuc2lvbnNCeU51bWJlci5nZXQocGFpcikpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gZXh0ZW5zaW9uczsKLSAgfQotCi0gIC8qKiBBZGQgYW4gZXh0ZW5zaW9uIGZyb20gYSBnZW5lcmF0ZWQgZmlsZSB0byB0aGUgcmVnaXN0cnkuICovCi0gIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBFeHRlbnNpb248PywgPz4gZXh0ZW5zaW9uKSB7Ci0gICAgaWYgKGV4dGVuc2lvbi5nZXRFeHRlbnNpb25UeXBlKCkgIT0gRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUuSU1NVVRBQkxFICYmCi0gICAgICAgIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25UeXBlKCkgIT0gRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUuTVVUQUJMRSkgewotICAgICAgLy8gZG8gbm90IHN1cHBvcnQgb3RoZXIgZXh0ZW5zaW9uIHR5cGVzLiBpZ25vcmUKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgYWRkKG5ld0V4dGVuc2lvbkluZm8oZXh0ZW5zaW9uKSwgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblR5cGUoKSk7Ci0gIH0KLQotICBzdGF0aWMgRXh0ZW5zaW9uSW5mbyBuZXdFeHRlbnNpb25JbmZvKGZpbmFsIEV4dGVuc2lvbjw/LCA/PiBleHRlbnNpb24pIHsKLSAgICBpZiAoZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRKYXZhVHlwZSgpID09Ci0gICAgICAgIEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAiUmVnaXN0ZXJlZCBtZXNzYWdlLXR5cGUgZXh0ZW5zaW9uIGhhZCBudWxsIGRlZmF1bHQgaW5zdGFuY2U6ICIgKwotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbkluZm8oZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAoTWVzc2FnZSkgZXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uSW5mbyhleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLCBudWxsKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQWRkIGEgbm9uLW1lc3NhZ2UtdHlwZSBleHRlbnNpb24gdG8gdGhlIHJlZ2lzdHJ5IGJ5IGRlc2NyaXB0b3IuICovCi0gIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgdHlwZSkgewotICAgIGlmICh0eXBlLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSBtdXN0IGJlIHByb3ZpZGVkIGEgZGVmYXVsdCBpbnN0YW5jZSB3aGVuICIgKwotICAgICAgICAiYWRkaW5nIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZXh0ZW5zaW9uLiIpOwotICAgIH0KLSAgICBFeHRlbnNpb25JbmZvIGluZm8gPSBuZXcgRXh0ZW5zaW9uSW5mbyh0eXBlLCBudWxsKTsKLSAgICBhZGQoaW5mbywgRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUuSU1NVVRBQkxFKTsKLSAgICBhZGQoaW5mbywgRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUuTVVUQUJMRSk7Ci0gIH0KLQotICAvKiogQWRkIGEgbWVzc2FnZS10eXBlIGV4dGVuc2lvbiB0byB0aGUgcmVnaXN0cnkgYnkgZGVzY3JpcHRvci4gKi8KLSAgcHVibGljIHZvaWQgYWRkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciB0eXBlLCBmaW5hbCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkgewotICAgIGlmICh0eXBlLmdldEphdmFUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSBwcm92aWRlZCBhIGRlZmF1bHQgaW5zdGFuY2UgZm9yIGEgIiArCi0gICAgICAgICJub24tbWVzc2FnZSBleHRlbnNpb24uIik7Ci0gICAgfQotICAgICAgYWRkKG5ldyBFeHRlbnNpb25JbmZvKHR5cGUsIGRlZmF1bHRJbnN0YW5jZSksCi0gICAgICAgICAgRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUuSU1NVVRBQkxFKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFByaXZhdGUgc3R1ZmYuCi0KLSAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeSgpIHsKLSAgICB0aGlzLmltbXV0YWJsZUV4dGVuc2lvbnNCeU5hbWUgPSBuZXcgSGFzaE1hcDxTdHJpbmcsIEV4dGVuc2lvbkluZm8+KCk7Ci0gICAgdGhpcy5tdXRhYmxlRXh0ZW5zaW9uc0J5TmFtZSA9IG5ldyBIYXNoTWFwPFN0cmluZywgRXh0ZW5zaW9uSW5mbz4oKTsKLSAgICB0aGlzLmltbXV0YWJsZUV4dGVuc2lvbnNCeU51bWJlciA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBFeHRlbnNpb25JbmZvPigpOwotICAgIHRoaXMubXV0YWJsZUV4dGVuc2lvbnNCeU51bWJlciA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPERlc2NyaXB0b3JJbnRQYWlyLCBFeHRlbnNpb25JbmZvPigpOwotICB9Ci0KLSAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeShFeHRlbnNpb25SZWdpc3RyeSBvdGhlcikgewotICAgIHN1cGVyKG90aGVyKTsKLSAgICB0aGlzLmltbXV0YWJsZUV4dGVuc2lvbnNCeU5hbWUgPQotICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAob3RoZXIuaW1tdXRhYmxlRXh0ZW5zaW9uc0J5TmFtZSk7Ci0gICAgdGhpcy5tdXRhYmxlRXh0ZW5zaW9uc0J5TmFtZSA9Ci0gICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdGhlci5tdXRhYmxlRXh0ZW5zaW9uc0J5TmFtZSk7Ci0gICAgdGhpcy5pbW11dGFibGVFeHRlbnNpb25zQnlOdW1iZXIgPQotICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAob3RoZXIuaW1tdXRhYmxlRXh0ZW5zaW9uc0J5TnVtYmVyKTsKLSAgICB0aGlzLm11dGFibGVFeHRlbnNpb25zQnlOdW1iZXIgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG90aGVyLm11dGFibGVFeHRlbnNpb25zQnlOdW1iZXIpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFeHRlbnNpb25JbmZvPiBpbW11dGFibGVFeHRlbnNpb25zQnlOYW1lOwotICBwcml2YXRlIGZpbmFsIE1hcDxTdHJpbmcsIEV4dGVuc2lvbkluZm8+IG11dGFibGVFeHRlbnNpb25zQnlOYW1lOwotICBwcml2YXRlIGZpbmFsIE1hcDxEZXNjcmlwdG9ySW50UGFpciwgRXh0ZW5zaW9uSW5mbz4gaW1tdXRhYmxlRXh0ZW5zaW9uc0J5TnVtYmVyOwotICBwcml2YXRlIGZpbmFsIE1hcDxEZXNjcmlwdG9ySW50UGFpciwgRXh0ZW5zaW9uSW5mbz4gbXV0YWJsZUV4dGVuc2lvbnNCeU51bWJlcjsKLQotICBFeHRlbnNpb25SZWdpc3RyeShib29sZWFuIGVtcHR5KSB7Ci0gICAgc3VwZXIoRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKSk7Ci0gICAgdGhpcy5pbW11dGFibGVFeHRlbnNpb25zQnlOYW1lID0KLSAgICAgICAgQ29sbGVjdGlvbnMuPFN0cmluZywgRXh0ZW5zaW9uSW5mbz5lbXB0eU1hcCgpOwotICAgIHRoaXMubXV0YWJsZUV4dGVuc2lvbnNCeU5hbWUgPQotICAgICAgICBDb2xsZWN0aW9ucy48U3RyaW5nLCBFeHRlbnNpb25JbmZvPmVtcHR5TWFwKCk7Ci0gICAgdGhpcy5pbW11dGFibGVFeHRlbnNpb25zQnlOdW1iZXIgPQotICAgICAgICBDb2xsZWN0aW9ucy48RGVzY3JpcHRvckludFBhaXIsIEV4dGVuc2lvbkluZm8+ZW1wdHlNYXAoKTsKLSAgICB0aGlzLm11dGFibGVFeHRlbnNpb25zQnlOdW1iZXIgPQotICAgICAgICAgICAgQ29sbGVjdGlvbnMuPERlc2NyaXB0b3JJbnRQYWlyLCBFeHRlbnNpb25JbmZvPmVtcHR5TWFwKCk7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgRU1QVFkgPSBuZXcgRXh0ZW5zaW9uUmVnaXN0cnkodHJ1ZSk7Ci0KLSAgcHJpdmF0ZSB2b2lkIGFkZCgKLSAgICAgIGZpbmFsIEV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uLAotICAgICAgZmluYWwgRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUgZXh0ZW5zaW9uVHlwZSkgewotICAgIGlmICghZXh0ZW5zaW9uLmRlc2NyaXB0b3IuaXNFeHRlbnNpb24oKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRXh0ZW5zaW9uUmVnaXN0cnkuYWRkKCkgd2FzIGdpdmVuIGEgRmllbGREZXNjcmlwdG9yIGZvciBhIHJlZ3VsYXIgIiArCi0gICAgICAgICAgICAgICIobm9uLWV4dGVuc2lvbikgZmllbGQuIik7Ci0gICAgfQotCi0gICAgTWFwPFN0cmluZywgRXh0ZW5zaW9uSW5mbz4gZXh0ZW5zaW9uc0J5TmFtZTsKLSAgICBNYXA8RGVzY3JpcHRvckludFBhaXIsIEV4dGVuc2lvbkluZm8+IGV4dGVuc2lvbnNCeU51bWJlcjsKLSAgICBzd2l0Y2ggKGV4dGVuc2lvblR5cGUpIHsKLSAgICAgIGNhc2UgSU1NVVRBQkxFOgotICAgICAgICBleHRlbnNpb25zQnlOYW1lID0gaW1tdXRhYmxlRXh0ZW5zaW9uc0J5TmFtZTsKLSAgICAgICAgZXh0ZW5zaW9uc0J5TnVtYmVyID0gaW1tdXRhYmxlRXh0ZW5zaW9uc0J5TnVtYmVyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTVVUQUJMRToKLSAgICAgICAgZXh0ZW5zaW9uc0J5TmFtZSA9IG11dGFibGVFeHRlbnNpb25zQnlOYW1lOwotICAgICAgICBleHRlbnNpb25zQnlOdW1iZXIgPSBtdXRhYmxlRXh0ZW5zaW9uc0J5TnVtYmVyOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIC8vIElnbm9yZSB0aGUgdW5rbm93biBzdXBwb3J0ZWQgdHlwZS4KLSAgICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGV4dGVuc2lvbnNCeU5hbWUucHV0KGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCksIGV4dGVuc2lvbik7Ci0gICAgZXh0ZW5zaW9uc0J5TnVtYmVyLnB1dCgKLSAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcihleHRlbnNpb24uZGVzY3JpcHRvci5nZXRDb250YWluaW5nVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldE51bWJlcigpKSwKLSAgICAgIGV4dGVuc2lvbik7Ci0KLSAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBleHRlbnNpb24uZGVzY3JpcHRvcjsKLSAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSAmJgotICAgICAgICBmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSAmJgotICAgICAgICBmaWVsZC5pc09wdGlvbmFsKCkgJiYKLSAgICAgICAgZmllbGQuZ2V0RXh0ZW5zaW9uU2NvcGUoKSA9PSBmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKSB7Ci0gICAgICAvLyBUaGlzIGlzIGFuIGV4dGVuc2lvbiBvZiBhIE1lc3NhZ2VTZXQgdHlwZSBkZWZpbmVkIHdpdGhpbiB0aGUgZXh0ZW5zaW9uCi0gICAgICAvLyB0eXBlJ3Mgb3duIHNjb3BlLiAgRm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCBhbGxvdyBpdCB0byBiZSBsb29rZWQKLSAgICAgIC8vIHVwIGJ5IHR5cGUgbmFtZS4KLSAgICAgIGV4dGVuc2lvbnNCeU5hbWUucHV0KGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkuZ2V0RnVsbE5hbWUoKSwgZXh0ZW5zaW9uKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQSAoR2VuZXJpY0Rlc2NyaXB0b3IsIGludCkgcGFpciwgdXNlZCBhcyBhIG1hcCBrZXkuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERlc2NyaXB0b3JJbnRQYWlyIHsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIGZpbmFsIGludCBudW1iZXI7Ci0KLSAgICBEZXNjcmlwdG9ySW50UGFpcihmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIGludCBudW1iZXIpIHsKLSAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuaGFzaENvZGUoKSAqICgoMSA8PCAxNikgLSAxKSArIG51bWJlcjsKLSAgICB9Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvYmopIHsKLSAgICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIERlc2NyaXB0b3JJbnRQYWlyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbCBEZXNjcmlwdG9ySW50UGFpciBvdGhlciA9IChEZXNjcmlwdG9ySW50UGFpcilvYmo7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRvciA9PSBvdGhlci5kZXNjcmlwdG9yICYmIG51bWJlciA9PSBvdGhlci5udW1iZXI7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjVjZjczOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBFcXVpdmFsZW50IHRvIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeX0gYnV0IHN1cHBvcnRzIG9ubHkgImxpdGUiIHR5cGVzLgotICogPHA+Ci0gKiBJZiBhbGwgb2YgeW91ciB0eXBlcyBhcmUgbGl0ZSB0eXBlcywgdGhlbiB5b3Ugb25seSBuZWVkIHRvIHVzZQotICoge0Bjb2RlIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZX0uICBTaW1pbGFybHksIGlmIGFsbCB5b3VyIHR5cGVzIGFyZSByZWd1bGFyCi0gKiB0eXBlcywgdGhlbiB5b3Ugb25seSBuZWVkIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeX0uICBUeXBpY2FsbHkgaXQgZG9lcyBub3QKLSAqIG1ha2Ugc2Vuc2UgdG8gbWl4IHRoZSB0d28sIHNpbmNlIGlmIHlvdSBoYXZlIGFueSByZWd1bGFyIHR5cGVzIGluIHlvdXIKLSAqIHByb2dyYW0sIHlvdSB0aGVuIHJlcXVpcmUgdGhlIGZ1bGwgcnVudGltZSBhbmQgbG9zZSBhbGwgdGhlIGJlbmVmaXRzIG9mCi0gKiB0aGUgbGl0ZSBydW50aW1lLCBzbyB5b3UgbWlnaHQgYXMgd2VsbCBtYWtlIGFsbCB5b3VyIHR5cGVzIGJlIHJlZ3VsYXIgdHlwZXMuCi0gKiBIb3dldmVyLCBpbiBzb21lIGNhc2VzIChlLmcuIHdoZW4gZGVwZW5kaW5nIG9uIG11bHRpcGxlIHRoaXJkLXBhcnR5IGxpYnJhcmllcwotICogd2hlcmUgb25lIHVzZXMgbGl0ZSB0eXBlcyBhbmQgb25lIHVzZXMgcmVndWxhciksIHlvdSBtYXkgZmluZCB5b3Vyc2VsZgotICogd2FudGluZyB0byBtaXggdGhlIHR3by4gIEluIHRoaXMgY2FzZSB0aGluZ3MgZ2V0IG1vcmUgY29tcGxpY2F0ZWQuCi0gKiA8cD4KLSAqIFRoZXJlIGFyZSB0aHJlZSBmYWN0b3JzIHRvIGNvbnNpZGVyOiAgV2hldGhlciB0aGUgdHlwZSBiZWluZyBleHRlbmRlZCBpcwotICogbGl0ZSwgd2hldGhlciB0aGUgZW1iZWRkZWQgdHlwZSAoaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLXR5cGVkIGV4dGVuc2lvbikKLSAqIGlzIGxpdGUsIGFuZCB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXRzZWxmIGlzIGxpdGUuICBTaW5jZSBhbGwgdGhyZWUgYXJlCi0gKiBkZWNsYXJlZCBpbiBkaWZmZXJlbnQgZmlsZXMsIHRoZXkgY291bGQgYWxsIGJlIGRpZmZlcmVudC4gIEhlcmUgYXJlIGFsbAotICogdGhlIGNvbWJpbmF0aW9ucyBhbmQgd2hpY2ggdHlwZSBvZiByZWdpc3RyeSB0byB1c2U6Ci0gKiA8cHJlPgotICogICBFeHRlbmRlZCB0eXBlICAgICBJbm5lciB0eXBlICAgIEV4dGVuc2lvbiAgICAgICAgIFVzZSByZWdpc3RyeQotICogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogICBsaXRlICAgICAgICAgICAgICBsaXRlICAgICAgICAgIGxpdGUgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZQotICogICBsaXRlICAgICAgICAgICAgICByZWd1bGFyICAgICAgIGxpdGUgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5Ci0gKiAgIHJlZ3VsYXIgICAgICAgICAgIHJlZ3VsYXIgICAgICAgcmVndWxhciAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkKLSAqICAgYWxsIG90aGVyIGNvbWJpbmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkCi0gKiA8L3ByZT4KLSAqIDxwPgotICogTm90ZSB0aGF0IGp1c3QgYXMgcmVndWxhciB0eXBlcyBhcmUgbm90IGFsbG93ZWQgdG8gY29udGFpbiBsaXRlLXR5cGUgZmllbGRzLAotICogdGhleSBhcmUgYWxzbyBub3QgYWxsb3dlZCB0byBjb250YWluIGxpdGUtdHlwZSBleHRlbnNpb25zLiAgVGhpcyBpcyBiZWNhdXNlCi0gKiByZWd1bGFyIHR5cGVzIG11c3QgYmUgZnVsbHkgYWNjZXNzaWJsZSB2aWEgcmVmbGVjdGlvbiwgd2hpY2ggaW4gdHVybiBtZWFucwotICogdGhhdCBhbGwgdGhlIGlubmVyIG1lc3NhZ2VzIG11c3QgYWxzbyBzdXBwb3J0IHJlZmxlY3Rpb24uICBPbiB0aGUgb3RoZXIgaGFuZCwKLSAqIHNpbmNlIHJlZ3VsYXIgdHlwZXMgaW1wbGVtZW50IHRoZSBlbnRpcmUgbGl0ZSBpbnRlcmZhY2UsIHRoZXJlIGlzIG5vIHByb2JsZW0KLSAqIHdpdGggZW1iZWRkaW5nIHJlZ3VsYXIgdHlwZXMgaW5zaWRlIGxpdGUgdHlwZXMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSB7Ci0KLSAgLy8gU2V0IHRydWUgdG8gZW5hYmxlIGxhenkgcGFyc2luZyBmZWF0dXJlIGZvciBNZXNzYWdlU2V0LgotICAvLwotICAvLyBUT0RPKHhpYW5nbCk6IE5vdyB3ZSB1c2UgYSBnbG9iYWwgZmxhZyB0byBjb250cm9sIHdoZXRoZXIgZW5hYmxlIGxhenkKLSAgLy8gcGFyc2luZyBmZWF0dXJlIGZvciBNZXNzYWdlU2V0LCB3aGljaCBtYXkgYmUgdG9vIGNydWRlIGZvciBzb21lCi0gIC8vIGFwcGxpY2F0aW9ucy4gTmVlZCB0byBzdXBwb3J0IHRoaXMgZmVhdHVyZSBvbiBzbWFsbGVyIGdyYW51bGFyaXR5LgotICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBib29sZWFuIGVhZ2VybHlQYXJzZU1lc3NhZ2VTZXRzID0gZmFsc2U7Ci0KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzRWFnZXJseVBhcnNlTWVzc2FnZVNldHMoKSB7Ci0gICAgcmV0dXJuIGVhZ2VybHlQYXJzZU1lc3NhZ2VTZXRzOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEVhZ2VybHlQYXJzZU1lc3NhZ2VTZXRzKGJvb2xlYW4gaXNFYWdlcmx5UGFyc2UpIHsKLSAgICBlYWdlcmx5UGFyc2VNZXNzYWdlU2V0cyA9IGlzRWFnZXJseVBhcnNlOwotICB9Ci0KLSAgLyoqIENvbnN0cnVjdCBhIG5ldywgZW1wdHkgaW5zdGFuY2UuICovCi0gIHB1YmxpYyBzdGF0aWMgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIG5ld0luc3RhbmNlKCkgewotICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCk7Ci0gIH0KLQotICAvKiogR2V0IHRoZSB1bm1vZGlmaWFibGUgc2luZ2xldG9uIGVtcHR5IGluc3RhbmNlLiAqLwotICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBnZXRFbXB0eVJlZ2lzdHJ5KCkgewotICAgIHJldHVybiBFTVBUWTsKLSAgfQotCi0gIC8qKiBSZXR1cm5zIGFuIHVubW9kaWZpYWJsZSB2aWV3IG9mIHRoZSByZWdpc3RyeS4gKi8KLSAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBnZXRVbm1vZGlmaWFibGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBFeHRlbnNpb25SZWdpc3RyeUxpdGUodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZCBhbiBleHRlbnNpb24gYnkgY29udGFpbmluZyB0eXBlIGFuZCBmaWVsZCBudW1iZXIuCi0gICAqCi0gICAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4dGVuc2lvbiBpZiBmb3VuZCwgb3Ige0Bjb2RlIG51bGx9Ci0gICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyA8Q29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlTGl0ZT4KLSAgICAgIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgPz4KLSAgICAgICAgZmluZExpdGVFeHRlbnNpb25CeU51bWJlcigKLSAgICAgICAgICBmaW5hbCBDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKLSAgICByZXR1cm4gKEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgPz4pCi0gICAgICBleHRlbnNpb25zQnlOdW1iZXIuZ2V0KAotICAgICAgICBuZXcgT2JqZWN0SW50UGFpcihjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwgZmllbGROdW1iZXIpKTsKLSAgfQotCi0gIC8qKiBBZGQgYW4gZXh0ZW5zaW9uIGZyb20gYSBsaXRlIGdlbmVyYXRlZCBmaWxlIHRvIHRoZSByZWdpc3RyeS4gKi8KLSAgcHVibGljIGZpbmFsIHZvaWQgYWRkKAotICAgICAgZmluYWwgR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPD8sID8+IGV4dGVuc2lvbikgewotICAgIGV4dGVuc2lvbnNCeU51bWJlci5wdXQoCi0gICAgICBuZXcgT2JqZWN0SW50UGFpcihleHRlbnNpb24uZ2V0Q29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXROdW1iZXIoKSksCi0gICAgICBleHRlbnNpb24pOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gUHJpdmF0ZSBzdHVmZi4KLQotICAvLyBDb25zdHJ1Y3RvcnMgYXJlIHBhY2thZ2UtcHJpdmF0ZSBzbyB0aGF0IEV4dGVuc2lvblJlZ2lzdHJ5IGNhbiBzdWJjbGFzcwotICAvLyB0aGlzLgotCi0gIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpIHsKLSAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPE9iamVjdEludFBhaXIsCi0gICAgICAgICAgICAgICAgICAgIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjw/LCA/Pj4oKTsKLSAgfQotCi0gIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZShFeHRlbnNpb25SZWdpc3RyeUxpdGUgb3RoZXIpIHsKLSAgICBpZiAob3RoZXIgPT0gRU1QVFkpIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5leHRlbnNpb25zQnlOdW1iZXIgPQotICAgICAgICBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAob3RoZXIuZXh0ZW5zaW9uc0J5TnVtYmVyKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIE1hcDxPYmplY3RJbnRQYWlyLAotICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248PywgPz4+Ci0gICAgICBleHRlbnNpb25zQnlOdW1iZXI7Ci0KLSAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeUxpdGUoYm9vbGVhbiBlbXB0eSkgewotICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0gQ29sbGVjdGlvbnMuZW1wdHlNYXAoKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgRU1QVFkgPQotICAgIG5ldyBFeHRlbnNpb25SZWdpc3RyeUxpdGUodHJ1ZSk7Ci0KLSAgLyoqIEEgKE9iamVjdCwgaW50KSBwYWlyLCB1c2VkIGFzIGEgbWFwIGtleS4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgT2JqZWN0SW50UGFpciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3Qgb2JqZWN0OwotICAgIHByaXZhdGUgZmluYWwgaW50IG51bWJlcjsKLQotICAgIE9iamVjdEludFBhaXIoZmluYWwgT2JqZWN0IG9iamVjdCwgZmluYWwgaW50IG51bWJlcikgewotICAgICAgdGhpcy5vYmplY3QgPSBvYmplY3Q7Ci0gICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKG9iamVjdCkgKiAoKDEgPDwgMTYpIC0gMSkgKyBudW1iZXI7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBPYmplY3RJbnRQYWlyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbCBPYmplY3RJbnRQYWlyIG90aGVyID0gKE9iamVjdEludFBhaXIpb2JqOwotICAgICAgcmV0dXJuIG9iamVjdCA9PSBvdGhlci5vYmplY3QgJiYgbnVtYmVyID09IG90aGVyLm51bWJlcjsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmllbGRTZXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmllbGRTZXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU4OTcwOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuTGF6eUZpZWxkLkxhenlJdGVyYXRvcjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQSBjbGFzcyB3aGljaCByZXByZXNlbnRzIGFuIGFyYml0cmFyeSBzZXQgb2YgZmllbGRzIG9mIHNvbWUgbWVzc2FnZSB0eXBlLgotICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LCBhbmQgYWxzbyB0byByZXByZXNlbnQKLSAqIGV4dGVuc2lvbnMgaW4ge0BsaW5rIEdlbmVyYXRlZE1lc3NhZ2V9LiAgVGhpcyBjbGFzcyBpcyBwYWNrYWdlLXByaXZhdGUsCi0gKiBzaW5jZSBvdXRzaWRlIHVzZXJzIHNob3VsZCBwcm9iYWJseSBiZSB1c2luZyB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLWZpbmFsIGNsYXNzIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGUgZXh0ZW5kcwotICAgICAgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxGaWVsZERlc2NyaXB0b3JUeXBlPj4gewotICAvKioKLSAgICogSW50ZXJmYWNlIGZvciBhIEZpZWxkRGVzY3JpcHRvciBvciBsaXRlIGV4dGVuc2lvbiBkZXNjcmlwdG9yLiAgVGhpcwotICAgKiBwcmV2ZW50cyBGaWVsZFNldCBmcm9tIGRlcGVuZGluZyBvbiB7QGxpbmsgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yfS4KLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgRmllbGREZXNjcmlwdG9yTGl0ZTxUIGV4dGVuZHMgRmllbGREZXNjcmlwdG9yTGl0ZTxUPj4KLSAgICAgIGV4dGVuZHMgQ29tcGFyYWJsZTxUPiB7Ci0gICAgaW50IGdldE51bWJlcigpOwotICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCk7Ci0gICAgV2lyZUZvcm1hdC5KYXZhVHlwZSBnZXRMaXRlSmF2YVR5cGUoKTsKLSAgICBib29sZWFuIGlzUmVwZWF0ZWQoKTsKLSAgICBib29sZWFuIGlzUGFja2VkKCk7Ci0gICAgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZ2V0RW51bVR5cGUoKTsKLQotICAgIC8vIElmIGdldExpdGVKYXZhVHlwZSgpID09IE1FU1NBR0UsIHRoaXMgbWVyZ2VzIGEgbWVzc2FnZSBvYmplY3Qgb2YgdGhlCi0gICAgLy8gdHlwZSBpbnRvIGEgYnVpbGRlciBvZiB0aGUgdHlwZS4gIFJldHVybnMge0Bjb2RlIHRvfS4KLSAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIGludGVybmFsTWVyZ2VGcm9tKAotICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIHRvLCBNZXNzYWdlTGl0ZSBmcm9tKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBmaWVsZHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0ltbXV0YWJsZTsKLSAgcHJpdmF0ZSBib29sZWFuIGhhc0xhenlGaWVsZCA9IGZhbHNlOwotCi0gIC8qKiBDb25zdHJ1Y3QgYSBuZXcgRmllbGRTZXQuICovCi0gIHByaXZhdGUgRmllbGRTZXQoKSB7Ci0gICAgdGhpcy5maWVsZHMgPSBTbWFsbFNvcnRlZE1hcC5uZXdGaWVsZE1hcCgxNik7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0IGFuIGVtcHR5IEZpZWxkU2V0LiAgVGhpcyBpcyBvbmx5IHVzZWQgdG8gaW5pdGlhbGl6ZQotICAgKiBERUZBVUxUX0lOU1RBTkNFLgotICAgKi8KLSAgcHJpdmF0ZSBGaWVsZFNldChmaW5hbCBib29sZWFuIGR1bW15KSB7Ci0gICAgdGhpcy5maWVsZHMgPSBTbWFsbFNvcnRlZE1hcC5uZXdGaWVsZE1hcCgwKTsKLSAgICBtYWtlSW1tdXRhYmxlKCk7Ci0gIH0KLQotICAvKiogQ29uc3RydWN0IGEgbmV3IEZpZWxkU2V0LiAqLwotICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxUPj4KLSAgICAgIEZpZWxkU2V0PFQ+IG5ld0ZpZWxkU2V0KCkgewotICAgIHJldHVybiBuZXcgRmllbGRTZXQ8VD4oKTsKLSAgfQotCi0gIC8qKiBHZXQgYW4gaW1tdXRhYmxlIGVtcHR5IEZpZWxkU2V0LiAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEZpZWxkU2V0LkZpZWxkRGVzY3JpcHRvckxpdGU8VD4+Ci0gICAgICBGaWVsZFNldDxUPiBlbXB0eVNldCgpIHsKLSAgICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRTsKLSAgfQotICBAU3VwcHJlc3NXYXJuaW5ncygicmF3dHlwZXMiKQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZFNldCBERUZBVUxUX0lOU1RBTkNFID0gbmV3IEZpZWxkU2V0KHRydWUpOwotCi0gIC8qKiBNYWtlIHRoaXMgRmllbGRTZXQgaW1tdXRhYmxlIGZyb20gdGhpcyBwb2ludCBmb3J3YXJkLiAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIHZvaWQgbWFrZUltbXV0YWJsZSgpIHsKLSAgICBpZiAoaXNJbW11dGFibGUpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZmllbGRzLm1ha2VJbW11dGFibGUoKTsKLSAgICBpc0ltbXV0YWJsZSA9IHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB3aGV0aGVyIHRoZSBGaWVsZFNldCBpcyBpbW11dGFibGUuIFRoaXMgaXMgdHJ1ZSBpZiBpdCBpcyB0aGUKLSAgICoge0BsaW5rICNlbXB0eVNldH0gb3IgaWYge0BsaW5rICNtYWtlSW1tdXRhYmxlfSB3ZXJlIGNhbGxlZC4KLSAgICoKLSAgICogQHJldHVybiB3aGV0aGVyIHRoZSBGaWVsZFNldCBpcyBpbW11dGFibGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZSgpIHsKLSAgICByZXR1cm4gaXNJbW11dGFibGU7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICBpZiAodGhpcyA9PSBvKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgCi0gICAgaWYgKCEobyBpbnN0YW5jZW9mIEZpZWxkU2V0KSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBGaWVsZFNldDw/PiBvdGhlciA9IChGaWVsZFNldDw/PikgbzsKLSAgICByZXR1cm4gb3RoZXIuZmllbGRzLmVxdWFscyhvdGhlci5maWVsZHMpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gZmllbGRzLmhhc2hDb2RlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2xvbmVzIHRoZSBGaWVsZFNldC4gVGhlIHJldHVybmVkIEZpZWxkU2V0IHdpbGwgYmUgbXV0YWJsZSBldmVuIGlmIHRoZQotICAgKiBvcmlnaW5hbCBGaWVsZFNldCB3YXMgaW1tdXRhYmxlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBuZXdseSBjbG9uZWQgRmllbGRTZXQKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yVHlwZT4gY2xvbmUoKSB7Ci0gICAgLy8gV2UgY2FuJ3QganVzdCBjYWxsIGZpZWxkcy5jbG9uZSBiZWNhdXNlIExpc3Qgb2JqZWN0cyBpbiB0aGUgbWFwCi0gICAgLy8gc2hvdWxkIG5vdCBiZSBzaGFyZWQuCi0gICAgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yVHlwZT4gY2xvbmUgPSBGaWVsZFNldC5uZXdGaWVsZFNldCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKLSAgICAgIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5ID0gZmllbGRzLmdldEFycmF5RW50cnlBdChpKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOwotICAgICAgY2xvbmUuc2V0RmllbGQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgotICAgICAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgewotICAgICAgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBjbG9uZS5zZXRGaWVsZChkZXNjcmlwdG9yLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgY2xvbmUuaGFzTGF6eUZpZWxkID0gaGFzTGF6eUZpZWxkOwotICAgIHJldHVybiBjbG9uZTsKLSAgfQotCi0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKiogU2VlIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjY2xlYXIoKX0uICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIGZpZWxkcy5jbGVhcigpOwotICAgIGhhc0xhenlGaWVsZCA9IGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIHNpbXBsZSBtYXAgY29udGFpbmluZyBhbGwgdGhlIGZpZWxkcy4KLSAgICovCi0gIHB1YmxpYyBNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7Ci0gICAgaWYgKGhhc0xhenlGaWVsZCkgewotICAgICAgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiByZXN1bHQgPQotICAgICAgICAgIFNtYWxsU29ydGVkTWFwLm5ld0ZpZWxkTWFwKDE2KTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKLSAgICAgICAgY2xvbmVGaWVsZEVudHJ5KHJlc3VsdCwgZmllbGRzLmdldEFycmF5RW50cnlBdChpKSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKLSAgICAgICAgY2xvbmVGaWVsZEVudHJ5KHJlc3VsdCwgZW50cnkpOwotICAgICAgfQotICAgICAgaWYgKGZpZWxkcy5pc0ltbXV0YWJsZSgpKSB7Ci0gICAgICAgIHJlc3VsdC5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICByZXR1cm4gZmllbGRzLmlzSW1tdXRhYmxlKCkgPyBmaWVsZHMgOiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoZmllbGRzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjbG9uZUZpZWxkRW50cnkoTWFwPEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gbWFwLAotICAgICAgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkpIHsKLSAgICBGaWVsZERlc2NyaXB0b3JUeXBlIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eUZpZWxkKSB7Ci0gICAgICBtYXAucHV0KGtleSwgKChMYXp5RmllbGQpIHZhbHVlKS5nZXRWYWx1ZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgbWFwLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFuIGl0ZXJhdG9yIHRvIHRoZSBmaWVsZCBtYXAuIFRoaXMgaXRlcmF0b3Igc2hvdWxkIG5vdCBiZSBsZWFrZWQgb3V0Ci0gICAqIG9mIHRoZSBwcm90b2J1ZiBsaWJyYXJ5IGFzIGl0IGlzIG5vdCBwcm90ZWN0ZWQgZnJvbSBtdXRhdGlvbiB3aGVuIGZpZWxkcwotICAgKiBpcyBub3QgaW1tdXRhYmxlLgotICAgKi8KLSAgcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+PiBpdGVyYXRvcigpIHsKLSAgICBpZiAoaGFzTGF6eUZpZWxkKSB7Ci0gICAgICByZXR1cm4gbmV3IExhenlJdGVyYXRvcjxGaWVsZERlc2NyaXB0b3JUeXBlPigKLSAgICAgICAgICBmaWVsZHMuZW50cnlTZXQoKS5pdGVyYXRvcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZpZWxkcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLSAgICoge0BsaW5rIE1lc3NhZ2UjaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IpIHsKLSAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJoYXNGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBub24tcmVwZWF0ZWQgZmllbGRzLiIpOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLSAgICoge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uICBUaGlzIG1ldGhvZAotICAgKiByZXR1cm5zIHtAY29kZSBudWxsfSBpZiB0aGUgZmllbGQgaXMgbm90IHNldDsgaW4gdGhpcyBjYXNlIGl0IGlzIHVwCi0gICAqIHRvIHRoZSBjYWxsZXIgdG8gZmV0Y2ggdGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yKSB7Ci0gICAgT2JqZWN0IG8gPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOwotICAgIGlmIChvIGluc3RhbmNlb2YgTGF6eUZpZWxkKSB7Ci0gICAgICByZXR1cm4gKChMYXp5RmllbGQpIG8pLmdldFZhbHVlKCk7Ci0gICAgfQotICAgIHJldHVybiBvOwotICB9Ci0KLSAgLyoqCi0gICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi0gICAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjc2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLE9iamVjdCl9LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bmNoZWNrZWQiLCAicmF3dHlwZXMifSkKLSAgcHVibGljIHZvaWQgc2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLSAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiV3Jvbmcgb2JqZWN0IHR5cGUgdXNlZCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcmVmbGVjdGlvbi4iKTsKLSAgICAgIH0KLQotICAgICAgLy8gV3JhcCB0aGUgY29udGVudHMgaW4gYSBuZXcgbGlzdCBzbyB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IGNoYW5nZQotICAgICAgLy8gdGhlIGxpc3QncyBjb250ZW50cyBhZnRlciBzZXR0aW5nIGl0LgotICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgbmV3TGlzdC5hZGRBbGwoKExpc3QpIHZhbHVlKTsKLSAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiBuZXdMaXN0KSB7Ci0gICAgICAgIHZlcmlmeVR5cGUoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLCBlbGVtZW50KTsKLSAgICAgIH0KLSAgICAgIHZhbHVlID0gbmV3TGlzdDsKLSAgICB9IGVsc2UgewotICAgICAgdmVyaWZ5VHlwZShkZXNjcmlwdG9yLmdldExpdGVUeXBlKCksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5RmllbGQpIHsKLSAgICAgIGhhc0xhenlGaWVsZCA9IHRydWU7Ci0gICAgfQotICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi0gICAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjY2xlYXJGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yKSB7Ci0gICAgZmllbGRzLnJlbW92ZShkZXNjcmlwdG9yKTsKLSAgICBpZiAoZmllbGRzLmlzRW1wdHkoKSkgewotICAgICAgaGFzTGF6eUZpZWxkID0gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi0gICAqIHtAbGluayBNZXNzYWdlI2dldFJlcGVhdGVkRmllbGRDb3VudChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvcikgewotICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZChkZXNjcmlwdG9yKTsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoKExpc3Q8Pz4pIHZhbHVlKS5zaXplKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi0gICAqIHtAbGluayBNZXNzYWdlI2dldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLGludCl9LgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgewotICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZChkZXNjcmlwdG9yKTsKLQotICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gKChMaXN0PD8+KSB2YWx1ZSkuZ2V0KGluZGV4KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLSAgICoge0BsaW5rIE1lc3NhZ2UuQnVpbGRlciNzZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcixpbnQsT2JqZWN0KX0uCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBPYmplY3QgbGlzdCA9IGdldEZpZWxkKGRlc2NyaXB0b3IpOwotICAgIGlmIChsaXN0ID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgdmVyaWZ5VHlwZShkZXNjcmlwdG9yLmdldExpdGVUeXBlKCksIHZhbHVlKTsKLSAgICAoKExpc3Q8T2JqZWN0PikgbGlzdCkuc2V0KGluZGV4LCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLSAgICoge0BsaW5rIE1lc3NhZ2UuQnVpbGRlciNhZGRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcixPYmplY3QpfS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgdm9pZCBhZGRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICBpZiAoIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiYWRkUmVwZWF0ZWRGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiByZXBlYXRlZCBmaWVsZHMuIik7Ci0gICAgfQotCi0gICAgdmVyaWZ5VHlwZShkZXNjcmlwdG9yLmdldExpdGVUeXBlKCksIHZhbHVlKTsKLQotICAgIGZpbmFsIE9iamVjdCBleGlzdGluZ1ZhbHVlID0gZ2V0RmllbGQoZGVzY3JpcHRvcik7Ci0gICAgTGlzdDxPYmplY3Q+IGxpc3Q7Ci0gICAgaWYgKGV4aXN0aW5nVmFsdWUgPT0gbnVsbCkgewotICAgICAgbGlzdCA9IG5ldyBBcnJheUxpc3Q8T2JqZWN0PigpOwotICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCBsaXN0KTsKLSAgICB9IGVsc2UgewotICAgICAgbGlzdCA9IChMaXN0PE9iamVjdD4pIGV4aXN0aW5nVmFsdWU7Ci0gICAgfQotCi0gICAgbGlzdC5hZGQodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZlcmlmaWVzIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIHRvIGJlIGEgdmFsaWQKLSAgICogdmFsdWUgZm9yIHRoZSBnaXZlbiBmaWVsZC4gIChGb3IgcmVwZWF0ZWQgZmllbGRzLCB0aGlzIGNoZWNrcyBpZiB0aGUKLSAgICogb2JqZWN0IGlzIHRoZSByaWdodCB0eXBlIHRvIGJlIG9uZSBlbGVtZW50IG9mIHRoZSBmaWVsZC4pCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSB2YWx1ZSBpcyBub3Qgb2YgdGhlIHJpZ2h0IHR5cGUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIHZlcmlmeVR5cGUoZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0KLSAgICBib29sZWFuIGlzVmFsaWQgPSBmYWxzZTsKLSAgICBzd2l0Y2ggKHR5cGUuZ2V0SmF2YVR5cGUoKSkgewotICAgICAgY2FzZSBJTlQ6ICAgICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIEludGVnZXIgICA7IGJyZWFrOwotICAgICAgY2FzZSBMT05HOiAgICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIExvbmcgICAgICA7IGJyZWFrOwotICAgICAgY2FzZSBGTE9BVDogICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIEZsb2F0ICAgICA7IGJyZWFrOwotICAgICAgY2FzZSBET1VCTEU6ICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIERvdWJsZSAgICA7IGJyZWFrOwotICAgICAgY2FzZSBCT09MRUFOOiAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIEJvb2xlYW4gICA7IGJyZWFrOwotICAgICAgY2FzZSBTVFJJTkc6ICAgICAgIGlzVmFsaWQgPSB2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZyAgICA7IGJyZWFrOwotICAgICAgY2FzZSBCWVRFX1NUUklORzoKLSAgICAgICAgaXNWYWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgQnl0ZVN0cmluZyB8fCB2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEVOVU06Ci0gICAgICAgIC8vIFRPRE8oa2VudG9uKTogIENhbGxlciBtdXN0IGRvIHR5cGUgY2hlY2tpbmcgaGVyZSwgSSBndWVzcy4KLSAgICAgICAgaXNWYWxpZCA9Ci0gICAgICAgICAgICAodmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyIHx8IHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWwuRW51bUxpdGUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgQ2FsbGVyIG11c3QgZG8gdHlwZSBjaGVja2luZyBoZXJlLCBJIGd1ZXNzLgotICAgICAgICBpc1ZhbGlkID0KLSAgICAgICAgICAgICh2YWx1ZSBpbnN0YW5jZW9mIE1lc3NhZ2VMaXRlKSB8fCAodmFsdWUgaW5zdGFuY2VvZiBMYXp5RmllbGQpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAoIWlzVmFsaWQpIHsKLSAgICAgIC8vIFRPRE8oa2VudG9uKTogIFdoZW4gY2hhaW5pbmcgY2FsbHMgdG8gc2V0RmllbGQoKSwgaXQgY2FuIGJlIGhhcmQgdG8KLSAgICAgIC8vICAgdGVsbCBmcm9tIHRoZSBzdGFjayB0cmFjZSB3aGljaCBleGFjdCBjYWxsIGZhaWxlZCwgc2luY2UgdGhlIHdob2xlCi0gICAgICAvLyAgIGNoYWluIGlzIGNvbnNpZGVyZWQgb25lIGxpbmUgb2YgY29kZS4gIEl0IHdvdWxkIGJlIG5pY2UgdG8gcHJpbnQKLSAgICAgIC8vICAgbW9yZSBpbmZvcm1hdGlvbiBoZXJlLCBlLmcuIG5hbWluZyB0aGUgZmllbGQuICBXZSB1c2VkIHRvIGRvIHRoYXQuCi0gICAgICAvLyAgIEJ1dCB3ZSBjYW4ndCBub3cgdGhhdCBGaWVsZFNldCBkb2Vzbid0IHVzZSBkZXNjcmlwdG9ycy4gIE1heWJlIHRoaXMKLSAgICAgIC8vICAgaXNuJ3QgYSBiaWcgZGVhbCwgdGhvdWdoLCBzaW5jZSBpdCB3b3VsZCBvbmx5IHJlYWxseSBhcHBseSB3aGVuIHVzaW5nCi0gICAgICAvLyAgIHJlZmxlY3Rpb24gYW5kIGdlbmVyYWxseSBwZW9wbGUgZG9uJ3QgY2hhaW4gcmVmbGVjdGlvbiBzZXR0ZXJzLgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgIldyb25nIG9iamVjdCB0eXBlIHVzZWQgd2l0aCBwcm90b2NvbCBtZXNzYWdlIHJlZmxlY3Rpb24uIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gUGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbgotCi0gIC8qKgotICAgKiBTZWUge0BsaW5rIE1lc3NhZ2UjaXNJbml0aWFsaXplZCgpfS4gIE5vdGU6ICBTaW5jZSB7QGNvZGUgRmllbGRTZXR9Ci0gICAqIGl0c2VsZiBkb2VzIG5vdCBoYXZlIGFueSB3YXkgb2Yga25vd2luZyBhYm91dCByZXF1aXJlZCBmaWVsZHMgdGhhdAotICAgKiBhcmVuJ3QgYWN0dWFsbHkgcHJlc2VudCBpbiB0aGUgc2V0LCBpdCBpcyB1cCB0byB0aGUgY2FsbGVyIHRvIGNoZWNrCi0gICAqIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgewotICAgICAgaWYgKCFpc0luaXRpYWxpemVkKGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgICAgICAgZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7Ci0gICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoZW50cnkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSBib29sZWFuIGlzSW5pdGlhbGl6ZWQoCi0gICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSkgewotICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOwotICAgIGlmIChkZXNjcmlwdG9yLmdldExpdGVKYXZhVHlwZSgpID09IFdpcmVGb3JtYXQuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIGZvciAoZmluYWwgTWVzc2FnZUxpdGUgZWxlbWVudDoKLSAgICAgICAgICAgICAgICAgKExpc3Q8TWVzc2FnZUxpdGU+KSBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWVzc2FnZUxpdGUpIHsKLSAgICAgICAgICBpZiAoISgoTWVzc2FnZUxpdGUpIHZhbHVlKS5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBMYXp5RmllbGQpIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiV3Jvbmcgb2JqZWN0IHR5cGUgdXNlZCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcmVmbGVjdGlvbi4iKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGZpZWxkIHR5cGUsIHJldHVybiB0aGUgd2lyZSB0eXBlLgotICAgKgotICAgKiBAcmV0dXJucyBPbmUgb2YgdGhlIHtAY29kZSBXSVJFVFlQRV99IGNvbnN0YW50cyBkZWZpbmVkIGluCi0gICAqICAgICAgICAgIHtAbGluayBXaXJlRm9ybWF0fS4KLSAgICovCi0gIHN0YXRpYyBpbnQgZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZShmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BhY2tlZCkgewotICAgIGlmIChpc1BhY2tlZCkgewotICAgICAgcmV0dXJuIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0V2lyZVR5cGUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI21lcmdlRnJvbShNZXNzYWdlKX0sIGJ1dCBtZXJnZXMgZnJvbSBhbm90aGVyIAotICAgKiB7QGxpbmsgRmllbGRTZXR9LgotICAgKi8KLSAgcHVibGljIHZvaWQgbWVyZ2VGcm9tKGZpbmFsIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGU+IG90aGVyKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlci5maWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgewotICAgICAgbWVyZ2VGcm9tRmllbGQob3RoZXIuZmllbGRzLmdldEFycmF5RW50cnlBdChpKSk7Ci0gICAgfQotICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgotICAgICAgICAgICAgIG90aGVyLmZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgewotICAgICAgbWVyZ2VGcm9tRmllbGQoZW50cnkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgT2JqZWN0IGNsb25lSWZNdXRhYmxlKE9iamVjdCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgYnl0ZVtdIGJ5dGVzID0gKGJ5dGVbXSkgdmFsdWU7Ci0gICAgICBieXRlW10gY29weSA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aF07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCAwLCBjb3B5LCAwLCBieXRlcy5sZW5ndGgpOwotICAgICAgcmV0dXJuIGNvcHk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncyh7InVuY2hlY2tlZCIsICJyYXd0eXBlcyJ9KQotICBwcml2YXRlIHZvaWQgbWVyZ2VGcm9tRmllbGQoCi0gICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSkgewotICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOwotICAgIE9iamVjdCBvdGhlclZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICBpZiAob3RoZXJWYWx1ZSBpbnN0YW5jZW9mIExhenlGaWVsZCkgewotICAgICAgb3RoZXJWYWx1ZSA9ICgoTGF6eUZpZWxkKSBvdGhlclZhbHVlKS5nZXRWYWx1ZSgpOwotICAgIH0KLQotICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgewotICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICB2YWx1ZSA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgIH0KLSAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgb3RoZXJWYWx1ZSkgewotICAgICAgICAoKExpc3QpIHZhbHVlKS5hZGQoY2xvbmVJZk11dGFibGUoZWxlbWVudCkpOwotICAgICAgfQotICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLmdldExpdGVKYXZhVHlwZSgpID09IFdpcmVGb3JtYXQuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICBmaWVsZHMucHV0KGRlc2NyaXB0b3IsIGNsb25lSWZNdXRhYmxlKG90aGVyVmFsdWUpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE1lcmdlIHRoZSBtZXNzYWdlcy4KLSAgICAgICAgICB2YWx1ZSA9IGRlc2NyaXB0b3IuaW50ZXJuYWxNZXJnZUZyb20oCi0gICAgICAgICAgICAgICAgKChNZXNzYWdlTGl0ZSkgdmFsdWUpLnRvQnVpbGRlcigpLCAoTWVzc2FnZUxpdGUpIG90aGVyVmFsdWUpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgY2xvbmVJZk11dGFibGUob3RoZXJWYWx1ZSkpOwotICAgIH0KLSAgfQotCi0gIC8vIFRPRE8oa2VudG9uKTogIE1vdmUgc3RhdGljIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gbWV0aG9kcyBpbnRvIHNvbWUKLSAgLy8gICBvdGhlciBjbGFzcy4gIFByb2JhYmx5IFdpcmVGb3JtYXQuCi0KLSAgLyoqCi0gICAqIFJlYWQgYSBmaWVsZCBvZiBhbnkgcHJpbWl0aXZlIHR5cGUgZm9yIGltbXV0YWJsZSBtZXNzYWdlcyBmcm9tIGEKLSAgICogQ29kZWRJbnB1dFN0cmVhbS4gRW51bXMsIGdyb3VwcywgYW5kIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBub3QgaGFuZGxlZCBieQotICAgKiB0aGlzIG1ldGhvZC4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0IFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0byByZWFkLgotICAgKiBAcGFyYW0gdHlwZSBEZWNsYXJlZCB0eXBlIG9mIHRoZSBmaWVsZC4KLSAgICogQHBhcmFtIGNoZWNrVXRmOCBXaGVuIHRydWUsIGNoZWNrIHRoYXQgdGhlIGlucHV0IGlzIHZhbGlkIHV0ZjguCi0gICAqIEByZXR1cm4gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmllbGQncyB2YWx1ZSwgb2YgdGhlIGV4YWN0Ci0gICAqICAgICAgICAgdHlwZSB3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieQotICAgKiAgICAgICAgIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvcgotICAgKiAgICAgICAgIHRoaXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdCByZWFkUHJpbWl0aXZlRmllbGQoCi0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKLSAgICAgIGJvb2xlYW4gY2hlY2tVdGY4KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChjaGVja1V0ZjgpIHsKLSAgICAgIHJldHVybiBXaXJlRm9ybWF0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwgdHlwZSwKLSAgICAgICAgICBXaXJlRm9ybWF0LlV0ZjhWYWxpZGF0aW9uLlNUUklDVCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBXaXJlRm9ybWF0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwgdHlwZSwKLSAgICAgICAgICBXaXJlRm9ybWF0LlV0ZjhWYWxpZGF0aW9uLkxPT1NFKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKiBTZWUge0BsaW5rIE1lc3NhZ2Ujd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKLSAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5ID0KLSAgICAgICAgICBmaWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpOwotICAgICAgd3JpdGVGaWVsZChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKLSAgICB9Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKLSAgICAgIHdyaXRlRmllbGQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCksIG91dHB1dCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICN3cml0ZVRvfSBidXQgdXNlcyBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0LgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlU2V0VG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKLSAgICAgIHdyaXRlTWVzc2FnZVNldFRvKGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSksIG91dHB1dCk7Ci0gICAgfQotICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgotICAgICAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgewotICAgICAgd3JpdGVNZXNzYWdlU2V0VG8oZW50cnksIG91dHB1dCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlTWVzc2FnZVNldFRvKAotICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnksCi0gICAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFICYmCi0gICAgICAgICFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSAmJiAhZGVzY3JpcHRvci5pc1BhY2tlZCgpKSB7Ci0gICAgICBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eUZpZWxkKSB7Ci0gICAgICAgIHZhbHVlID0gKChMYXp5RmllbGQpIHZhbHVlKS5nZXRWYWx1ZSgpOwotICAgICAgfQotICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihlbnRyeS5nZXRLZXkoKS5nZXROdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VMaXRlKSB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXRlRmllbGQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBzaW5nbGUgdGFnLXZhbHVlIHBhaXIgdG8gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHN0cmVhbS4KLSAgICogQHBhcmFtIHR5cGUgICBUaGUgZmllbGQncyB0eXBlLgotICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBmaWVsZCdzIG51bWJlci4KLSAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKLSAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5Ci0gICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCi0gICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVFbGVtZW50KGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZ3JvdXBzLCB3aGljaCBuZWVkIGEgc3RhcnQgYW5kIGVuZCB0YWc7IG90aGVyIGZpZWxkcwotICAgIC8vIGNhbiBqdXN0IHVzZSB3cml0ZVRhZygpIGFuZCB3cml0ZUZpZWxkTm9UYWcoKS4KLSAgICBpZiAodHlwZSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5HUk9VUCkgewotICAgICAgICBvdXRwdXQud3JpdGVHcm91cChudW1iZXIsIChNZXNzYWdlTGl0ZSkgdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRwdXQud3JpdGVUYWcobnVtYmVyLCBnZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKHR5cGUsIGZhbHNlKSk7Ci0gICAgICB3cml0ZUVsZW1lbnROb1RhZyhvdXRwdXQsIHR5cGUsIHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBmaWVsZCBvZiBhcmJpdHJhcnkgdHlwZSwgd2l0aG91dCBpdHMgdGFnLCB0byB0aGUgc3RyZWFtLgotICAgKgotICAgKiBAcGFyYW0gb3V0cHV0IFRoZSBvdXRwdXQgc3RyZWFtLgotICAgKiBAcGFyYW0gdHlwZSBUaGUgZmllbGQncyB0eXBlLgotICAgKiBAcGFyYW0gdmFsdWUgIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpZWxkJ3MgdmFsdWUuICBNdXN0IGJlIG9mIHRoZSBleGFjdAotICAgKiAgICAgICAgICAgICAgIHR5cGUgd2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkKLSAgICogICAgICAgICAgICAgICB7QGxpbmsgTWVzc2FnZSNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSBmb3IKLSAgICogICAgICAgICAgICAgICB0aGlzIGZpZWxkLgotICAgKi8KLSAgc3RhdGljIHZvaWQgd3JpdGVFbGVtZW50Tm9UYWcoCi0gICAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQsCi0gICAgICBmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLAotICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBET1VCTEUgIDogb3V0cHV0LndyaXRlRG91YmxlTm9UYWcgICgoRG91YmxlICAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUICAgOiBvdXRwdXQud3JpdGVGbG9hdE5vVGFnICAgKChGbG9hdCAgICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgSU5UNjQgICA6IG91dHB1dC53cml0ZUludDY0Tm9UYWcgICAoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBVSU5UNjQgIDogb3V0cHV0LndyaXRlVUludDY0Tm9UYWcgICgoTG9uZyAgICAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIElOVDMyICAgOiBvdXRwdXQud3JpdGVJbnQzMk5vVGFnICAgKChJbnRlZ2VyICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgRklYRUQ2NCA6IG91dHB1dC53cml0ZUZpeGVkNjROb1RhZyAoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBGSVhFRDMyIDogb3V0cHV0LndyaXRlRml4ZWQzMk5vVGFnICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIEJPT0wgICAgOiBvdXRwdXQud3JpdGVCb29sTm9UYWcgICAgKChCb29sZWFuICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgR1JPVVAgICA6IG91dHB1dC53cml0ZUdyb3VwTm9UYWcgICAoKE1lc3NhZ2VMaXRlKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBNRVNTQUdFIDogb3V0cHV0LndyaXRlTWVzc2FnZU5vVGFnICgoTWVzc2FnZUxpdGUpIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZVN0cmluZykgewotICAgICAgICAgIG91dHB1dC53cml0ZUJ5dGVzTm9UYWcoKEJ5dGVTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmdOb1RhZygoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEJZVEVTOgotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlU3RyaW5nKSB7Ci0gICAgICAgICAgb3V0cHV0LndyaXRlQnl0ZXNOb1RhZygoQnl0ZVN0cmluZykgdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIG91dHB1dC53cml0ZUJ5dGVBcnJheU5vVGFnKChieXRlW10pIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVUlOVDMyICA6IG91dHB1dC53cml0ZVVJbnQzMk5vVGFnICAoKEludGVnZXIgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBTRklYRUQzMjogb3V0cHV0LndyaXRlU0ZpeGVkMzJOb1RhZygoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIFNGSVhFRDY0OiBvdXRwdXQud3JpdGVTRml4ZWQ2NE5vVGFnKChMb25nICAgICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgU0lOVDMyICA6IG91dHB1dC53cml0ZVNJbnQzMk5vVGFnICAoKEludGVnZXIgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBTSU5UNjQgIDogb3V0cHV0LndyaXRlU0ludDY0Tm9UYWcgICgoTG9uZyAgICAgICApIHZhbHVlKTsgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgSW50ZXJuYWwuRW51bUxpdGUpIHsKLSAgICAgICAgICBvdXRwdXQud3JpdGVFbnVtTm9UYWcoKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXRwdXQud3JpdGVFbnVtTm9UYWcoKChJbnRlZ2VyKSB2YWx1ZSkuaW50VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFdyaXRlIGEgc2luZ2xlIGZpZWxkLiAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JMaXRlPD8+IGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUgPSBkZXNjcmlwdG9yLmdldExpdGVUeXBlKCk7Ci0gICAgaW50IG51bWJlciA9IGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCk7Ci0gICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICBmaW5hbCBMaXN0PD8+IHZhbHVlTGlzdCA9IChMaXN0PD8+KXZhbHVlOwotICAgICAgaWYgKGRlc2NyaXB0b3IuaXNQYWNrZWQoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVUYWcobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBkYXRhIHNpemUgc28gdGhlIGxlbmd0aCBjYW4gYmUgd3JpdHRlbi4KLSAgICAgICAgaW50IGRhdGFTaXplID0gMDsKLSAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHZhbHVlTGlzdCkgewotICAgICAgICAgIGRhdGFTaXplICs9IGNvbXB1dGVFbGVtZW50U2l6ZU5vVGFnKHR5cGUsIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKGRhdGFTaXplKTsKLSAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgaXRzZWxmLCB3aXRob3V0IGFueSB0YWdzLgotICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogdmFsdWVMaXN0KSB7Ci0gICAgICAgICAgd3JpdGVFbGVtZW50Tm9UYWcob3V0cHV0LCB0eXBlLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHZhbHVlTGlzdCkgewotICAgICAgICAgIHdyaXRlRWxlbWVudChvdXRwdXQsIHR5cGUsIG51bWJlciwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgTGF6eUZpZWxkKSB7Ci0gICAgICAgIHdyaXRlRWxlbWVudChvdXRwdXQsIHR5cGUsIG51bWJlciwgKChMYXp5RmllbGQpIHZhbHVlKS5nZXRWYWx1ZSgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdyaXRlRWxlbWVudChvdXRwdXQsIHR5cGUsIG51bWJlciwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZWUge0BsaW5rIE1lc3NhZ2UjZ2V0U2VyaWFsaXplZFNpemUoKX0uICBJdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gY2FjaGUKLSAgICogdGhlIHJlc3VsdGluZyBzaXplIGlmIGRlc2lyZWQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgIGludCBzaXplID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7Ci0gICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA9Ci0gICAgICAgICAgZmllbGRzLmdldEFycmF5RW50cnlBdChpKTsKLSAgICAgIHNpemUgKz0gY29tcHV0ZUZpZWxkU2l6ZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgotICAgICAgICAgZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7Ci0gICAgICBzaXplICs9IGNvbXB1dGVGaWVsZFNpemUoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjZ2V0U2VyaWFsaXplZFNpemV9IGJ1dCB1c2VzIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldE1lc3NhZ2VTZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgewotICAgICAgc2l6ZSArPSBnZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoZmllbGRzLmdldEFycmF5RW50cnlBdChpKSk7Ci0gICAgfQotICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgOgotICAgICAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgewotICAgICAgc2l6ZSArPSBnZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoZW50cnkpOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIHByaXZhdGUgaW50IGdldE1lc3NhZ2VTZXRTZXJpYWxpemVkU2l6ZSgKLSAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5KSB7Ci0gICAgZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UKLSAgICAgICAgJiYgIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpICYmICFkZXNjcmlwdG9yLmlzUGFja2VkKCkpIHsKLSAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlGaWVsZCkgewotICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUxhenlGaWVsZE1lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAotICAgICAgICAgICAgZW50cnkuZ2V0S2V5KCkuZ2V0TnVtYmVyKCksIChMYXp5RmllbGQpIHZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCi0gICAgICAgICAgICBlbnRyeS5nZXRLZXkoKS5nZXROdW1iZXIoKSwgKE1lc3NhZ2VMaXRlKSB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjb21wdXRlRmllbGRTaXplKGRlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHNpbmdsZSB0YWcvdmFsdWUgcGFpciBvZiBhcmJpdHJhcnkgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIHR5cGUgICBUaGUgZmllbGQncyB0eXBlLgotICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBmaWVsZCdzIG51bWJlci4KLSAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKLSAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5Ci0gICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCi0gICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRWxlbWVudFNpemUoCi0gICAgICBmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLAotICAgICAgZmluYWwgaW50IG51bWJlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgaW50IHRhZ1NpemUgPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVGFnU2l6ZShudW1iZXIpOwotICAgIGlmICh0eXBlID09IFdpcmVGb3JtYXQuRmllbGRUeXBlLkdST1VQKSB7Ci0gICAgICAvLyBPbmx5IGNvdW50IHRoZSBlbmQgZ3JvdXAgdGFnIGZvciBwcm90bzIgbWVzc2FnZXMgYXMgZm9yIHByb3RvMSB0aGUgZW5kCi0gICAgICAvLyBncm91cCB0YWcgd2lsbCBiZSBjb3VudGVkIGFzIGEgcGFydCBvZiBnZXRTZXJpYWxpemVkU2l6ZSgpLgotICAgICAgICB0YWdTaXplICo9IDI7Ci0gICAgfQotICAgIHJldHVybiB0YWdTaXplICsgY29tcHV0ZUVsZW1lbnRTaXplTm9UYWcodHlwZSwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiBwYXJ0aWN1bGFyIHZhbHVlIG9mIGFyYml0cmFyeSB0eXBlLCBleGNsdWRpbmcgdGFnLgotICAgKgotICAgKiBAcGFyYW0gdHlwZSAgIFRoZSBmaWVsZCdzIHR5cGUuCi0gICAqIEBwYXJhbSB2YWx1ZSAgT2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmllbGQncyB2YWx1ZS4gIE11c3QgYmUgb2YgdGhlIGV4YWN0Ci0gICAqICAgICAgICAgICAgICAgdHlwZSB3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieQotICAgKiAgICAgICAgICAgICAgIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvcgotICAgKiAgICAgICAgICAgICAgIHRoaXMgZmllbGQuCi0gICAqLwotICBzdGF0aWMgaW50IGNvbXB1dGVFbGVtZW50U2l6ZU5vVGFnKAotICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAvLyBOb3RlOiAgTWlub3IgdmlvbGF0aW9uIG9mIDgwLWNoYXIgbGltaXQgcnVsZSBoZXJlIGJlY2F1c2UgdGhpcyB3b3VsZAotICAgICAgLy8gICBhY3R1YWxseSBiZSBoYXJkZXIgdG8gcmVhZCBpZiB3ZSB3cmFwcGVkIHRoZSBsaW5lcy4KLSAgICAgIGNhc2UgRE9VQkxFICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRG91YmxlU2l6ZU5vVGFnICAoKERvdWJsZSAgICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgRkxPQVQgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRmxvYXRTaXplTm9UYWcgICAoKEZsb2F0ICAgICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgSU5UNjQgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlSW50NjRTaXplTm9UYWcgICAoKExvbmcgICAgICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgVUlOVDY0ICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVUludDY0U2l6ZU5vVGFnICAoKExvbmcgICAgICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgSU5UMzIgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlSW50MzJTaXplTm9UYWcgICAoKEludGVnZXIgICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgRklYRUQ2NCA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQ2NFNpemVOb1RhZyAoKExvbmcgICAgICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgRklYRUQzMiA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQzMlNpemVOb1RhZyAoKEludGVnZXIgICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgQk9PTCAgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlQm9vbFNpemVOb1RhZyAgICAoKEJvb2xlYW4gICAgKXZhbHVlKTsKLSAgICAgIGNhc2UgR1JPVVAgICA6IHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlR3JvdXBTaXplTm9UYWcgICAoKE1lc3NhZ2VMaXRlKXZhbHVlKTsKLSAgICAgIGNhc2UgQllURVMgICA6Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpIHsKLSAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKChCeXRlU3RyaW5nKSB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVCeXRlQXJyYXlTaXplTm9UYWcoKGJ5dGVbXSkgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICBjYXNlIFNUUklORyAgOgotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBCeXRlU3RyaW5nKSB7Ci0gICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVCeXRlc1NpemVOb1RhZygoQnl0ZVN0cmluZykgdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlU3RyaW5nU2l6ZU5vVGFnKChTdHJpbmcpIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgY2FzZSBVSU5UMzIgIDogcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVVSW50MzJTaXplTm9UYWcgICgoSW50ZWdlciAgICApdmFsdWUpOwotICAgICAgY2FzZSBTRklYRUQzMjogcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVTRml4ZWQzMlNpemVOb1RhZygoSW50ZWdlciAgICApdmFsdWUpOwotICAgICAgY2FzZSBTRklYRUQ2NDogcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVTRml4ZWQ2NFNpemVOb1RhZygoTG9uZyAgICAgICApdmFsdWUpOwotICAgICAgY2FzZSBTSU5UMzIgIDogcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVTSW50MzJTaXplTm9UYWcgICgoSW50ZWdlciAgICApdmFsdWUpOwotICAgICAgY2FzZSBTSU5UNjQgIDogcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVTSW50NjRTaXplTm9UYWcgICgoTG9uZyAgICAgICApdmFsdWUpOwotCi0gICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIExhenlGaWVsZCkgewotICAgICAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlTGF6eUZpZWxkU2l6ZU5vVGFnKChMYXp5RmllbGQpIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcoKE1lc3NhZ2VMaXRlKSB2YWx1ZSk7Ci0gICAgICAgIH0KLQotICAgICAgY2FzZSBFTlVNOgotICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbC5FbnVtTGl0ZSkgewotICAgICAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRW51bVNpemVOb1RhZygKLSAgICAgICAgICAgICAgKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUVudW1TaXplTm9UYWcoKEludGVnZXIpIHZhbHVlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgIlRoZXJlIGlzIG5vIHdheSB0byBnZXQgaGVyZSwgYnV0IHRoZSBjb21waWxlciB0aGlua3Mgb3RoZXJ3aXNlLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIGEgcGFydGljdWxhciBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGaWVsZFNpemUoZmluYWwgRmllbGREZXNjcmlwdG9yTGl0ZTw/PiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUgPSBkZXNjcmlwdG9yLmdldExpdGVUeXBlKCk7Ci0gICAgaW50IG51bWJlciA9IGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCk7Ci0gICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5pc1BhY2tlZCgpKSB7Ci0gICAgICAgIGludCBkYXRhU2l6ZSA9IDA7Ci0gICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdDw/Pil2YWx1ZSkgewotICAgICAgICAgIGRhdGFTaXplICs9IGNvbXB1dGVFbGVtZW50U2l6ZU5vVGFnKHR5cGUsIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkYXRhU2l6ZSArCi0gICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVGFnU2l6ZShudW1iZXIpICsKLSAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVSYXdWYXJpbnQzMlNpemUoZGF0YVNpemUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pdmFsdWUpIHsKLSAgICAgICAgICBzaXplICs9IGNvbXB1dGVFbGVtZW50U2l6ZSh0eXBlLCBudW1iZXIsIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gY29tcHV0ZUVsZW1lbnRTaXplKHR5cGUsIG51bWJlciwgdmFsdWUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GbG9hdEFycmF5TGlzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GbG9hdEFycmF5TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2NiNmQ3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmxvYXRBcnJheUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5GbG9hdExpc3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEZsb2F0TGlzdH0gb24gdG9wIG9mIGEgcHJpbWl0aXZlIGFycmF5LgotICogCi0gKiBAYXV0aG9yIGR3ZWlzQGdvb2dsZS5jb20gKERhbmllbCBXZWlzKQotICovCi1maW5hbCBjbGFzcyBGbG9hdEFycmF5TGlzdCBleHRlbmRzIEFic3RyYWN0UHJvdG9idWZMaXN0PEZsb2F0PiBpbXBsZW1lbnRzIEZsb2F0TGlzdCwgUmFuZG9tQWNjZXNzIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZsb2F0QXJyYXlMaXN0IEVNUFRZX0xJU1QgPSBuZXcgRmxvYXRBcnJheUxpc3QoKTsKLSAgc3RhdGljIHsKLSAgICBFTVBUWV9MSVNULm1ha2VJbW11dGFibGUoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBGbG9hdEFycmF5TGlzdCBlbXB0eUxpc3QoKSB7Ci0gICAgcmV0dXJuIEVNUFRZX0xJU1Q7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBUaGUgYmFja2luZyBzdG9yZSBmb3IgdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIGZsb2F0W10gYXJyYXk7Ci0gIAotICAvKioKLSAgICogVGhlIHNpemUgb2YgdGhlIGxpc3QgZGlzdGluY3QgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4gVGhhdCBpcywgaXQgaXMgdGhlIG51bWJlciBvZgotICAgKiBlbGVtZW50cyBzZXQgaW4gdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIGludCBzaXplOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG11dGFibGUge0Bjb2RlIEZsb2F0QXJyYXlMaXN0fSB3aXRoIGRlZmF1bHQgY2FwYWNpdHkuCi0gICAqLwotICBGbG9hdEFycmF5TGlzdCgpIHsKLSAgICB0aGlzKG5ldyBmbG9hdFtERUZBVUxUX0NBUEFDSVRZXSwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBtdXRhYmxlIHtAY29kZSBGbG9hdEFycmF5TGlzdH0gY29udGFpbmluZyB0aGUgc2FtZSBlbGVtZW50cyBhcyB7QGNvZGUgb3RoZXJ9LgotICAgKi8KLSAgcHJpdmF0ZSBGbG9hdEFycmF5TGlzdChmbG9hdFtdIGFycmF5LCBpbnQgc2l6ZSkgewotICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICB0aGlzLnNpemUgPSBzaXplOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKHRoaXMgPT0gbykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG8gaW5zdGFuY2VvZiBGbG9hdEFycmF5TGlzdCkpIHsKLSAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobyk7Ci0gICAgfQotICAgIEZsb2F0QXJyYXlMaXN0IG90aGVyID0gKEZsb2F0QXJyYXlMaXN0KSBvOwotICAgIGlmIChzaXplICE9IG90aGVyLnNpemUpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgZmluYWwgZmxvYXRbXSBhcnIgPSBvdGhlci5hcnJheTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKGFycmF5W2ldICE9IGFycltpXSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IHJlc3VsdCA9IDE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIHJlc3VsdCA9ICgzMSAqIHJlc3VsdCkgKyBGbG9hdC5mbG9hdFRvSW50Qml0cyhhcnJheVtpXSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEZsb2F0TGlzdCBtdXRhYmxlQ29weVdpdGhDYXBhY2l0eShpbnQgY2FwYWNpdHkpIHsKLSAgICBpZiAoY2FwYWNpdHkgPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgRmxvYXRBcnJheUxpc3QoQXJyYXlzLmNvcHlPZihhcnJheSwgY2FwYWNpdHkpLCBzaXplKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBGbG9hdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGdldEZsb2F0KGluZGV4KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgZmxvYXQgZ2V0RmxvYXQoaW50IGluZGV4KSB7Ci0gICAgZW5zdXJlSW5kZXhJblJhbmdlKGluZGV4KTsKLSAgICByZXR1cm4gYXJyYXlbaW5kZXhdOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRmxvYXQgc2V0KGludCBpbmRleCwgRmxvYXQgZWxlbWVudCkgewotICAgIHJldHVybiBzZXRGbG9hdChpbmRleCwgZWxlbWVudCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZsb2F0IHNldEZsb2F0KGludCBpbmRleCwgZmxvYXQgZWxlbWVudCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGVuc3VyZUluZGV4SW5SYW5nZShpbmRleCk7Ci0gICAgZmxvYXQgcHJldmlvdXNWYWx1ZSA9IGFycmF5W2luZGV4XTsKLSAgICBhcnJheVtpbmRleF0gPSBlbGVtZW50OwotICAgIHJldHVybiBwcmV2aW91c1ZhbHVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEZsb2F0IGVsZW1lbnQpIHsKLSAgICBhZGRGbG9hdChpbmRleCwgZWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI2FkZChGbG9hdCl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSBlbGVtZW50LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZEZsb2F0KGZsb2F0IGVsZW1lbnQpIHsKLSAgICBhZGRGbG9hdChzaXplLCBlbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjYWRkKGludCwgRmxvYXQpfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhZGRGbG9hdChpbnQgaW5kZXgsIGZsb2F0IGVsZW1lbnQpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24obWFrZU91dE9mQm91bmRzRXhjZXB0aW9uTWVzc2FnZShpbmRleCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoc2l6ZSA8IGFycmF5Lmxlbmd0aCkgewotICAgICAgLy8gU2hpZnQgZXZlcnl0aGluZyBvdmVyIHRvIG1ha2Ugcm9vbQotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIGFycmF5LCBpbmRleCArIDEsIHNpemUgLSBpbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJlc2l6ZSB0byAxLjV4IHRoZSBzaXplCi0gICAgICBpbnQgbGVuZ3RoID0gKChzaXplICogMykgLyAyKSArIDE7Ci0gICAgICBmbG9hdFtdIG5ld0FycmF5ID0gbmV3IGZsb2F0W2xlbmd0aF07Ci0gICAgICAKLSAgICAgIC8vIENvcHkgdGhlIGZpcnN0IHBhcnQgZGlyZWN0bHkKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIDAsIG5ld0FycmF5LCAwLCBpbmRleCk7Ci0gICAgICAKLSAgICAgIC8vIENvcHkgdGhlIHJlc3Qgc2hpZnRlZCBvdmVyIGJ5IG9uZSB0byBtYWtlIHJvb20KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoYXJyYXksIGluZGV4LCBuZXdBcnJheSwgaW5kZXggKyAxLCBzaXplIC0gaW5kZXgpOwotICAgICAgYXJyYXkgPSBuZXdBcnJheTsKLSAgICB9Ci0KLSAgICBhcnJheVtpbmRleF0gPSBlbGVtZW50OwotICAgIHNpemUrKzsKLSAgICBtb2RDb3VudCsrOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBGbG9hdD4gY29sbGVjdGlvbikgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIAotICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvLyBXZSBzcGVjaWFsaXplIHdoZW4gYWRkaW5nIGFub3RoZXIgRmxvYXRBcnJheUxpc3QgdG8gYXZvaWQgYm94aW5nIGVsZW1lbnRzLgotICAgIGlmICghKGNvbGxlY3Rpb24gaW5zdGFuY2VvZiBGbG9hdEFycmF5TGlzdCkpIHsKLSAgICAgIHJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIEZsb2F0QXJyYXlMaXN0IGxpc3QgPSAoRmxvYXRBcnJheUxpc3QpIGNvbGxlY3Rpb247Ci0gICAgaWYgKGxpc3Quc2l6ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIGludCBvdmVyZmxvdyA9IEludGVnZXIuTUFYX1ZBTFVFIC0gc2l6ZTsKLSAgICBpZiAob3ZlcmZsb3cgPCBsaXN0LnNpemUpIHsKLSAgICAgIC8vIFdlIGNhbid0IGFjdHVhbGx5IHJlcHJlc2VudCBhIGxpc3QgdGhpcyBsYXJnZS4KLSAgICAgIHRocm93IG5ldyBPdXRPZk1lbW9yeUVycm9yKCk7Ci0gICAgfQotICAgIAotICAgIGludCBuZXdTaXplID0gc2l6ZSArIGxpc3Quc2l6ZTsKLSAgICBpZiAobmV3U2l6ZSA+IGFycmF5Lmxlbmd0aCkgewotICAgICAgYXJyYXkgPSBBcnJheXMuY29weU9mKGFycmF5LCBuZXdTaXplKTsKLSAgICB9Ci0gICAgCi0gICAgU3lzdGVtLmFycmF5Y29weShsaXN0LmFycmF5LCAwLCBhcnJheSwgc2l6ZSwgbGlzdC5zaXplKTsKLSAgICBzaXplID0gbmV3U2l6ZTsKLSAgICBtb2RDb3VudCsrOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChvLmVxdWFscyhhcnJheVtpXSkpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaSArIDEsIGFycmF5LCBpLCBzaXplIC0gaSk7Ci0gICAgICAgIHNpemUtLTsKLSAgICAgICAgbW9kQ291bnQrKzsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRmxvYXQgcmVtb3ZlKGludCBpbmRleCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGVuc3VyZUluZGV4SW5SYW5nZShpbmRleCk7Ci0gICAgZmxvYXQgdmFsdWUgPSBhcnJheVtpbmRleF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyAxLCBhcnJheSwgaW5kZXgsIHNpemUgLSBpbmRleCk7Ci0gICAgc2l6ZS0tOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhhdCB0aGUgcHJvdmlkZWQge0Bjb2RlIGluZGV4fSBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHtAY29kZSBbMCwgc2l6ZV19LiBUaHJvd3MgYW4KLSAgICoge0BsaW5rIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb259IGlmIGl0IGlzIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggdG8gdmVyaWZ5IGlzIGluIHJhbmdlCi0gICAqLwotICBwcml2YXRlIHZvaWQgZW5zdXJlSW5kZXhJblJhbmdlKGludCBpbmRleCkgewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24obWFrZU91dE9mQm91bmRzRXhjZXB0aW9uTWVzc2FnZShpbmRleCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIG1ha2VPdXRPZkJvdW5kc0V4Y2VwdGlvbk1lc3NhZ2UoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuICJJbmRleDoiICsgaW5kZXggKyAiLCBTaXplOiIgKyBzaXplOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2UuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OTBjYjYyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg4MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci0KLS8qKgotICogQWxsIGdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZXh0ZW5kIHRoaXMgY2xhc3MuICBUaGlzIGNsYXNzCi0gKiBpbXBsZW1lbnRzIG1vc3Qgb2YgdGhlIE1lc3NhZ2UgYW5kIEJ1aWxkZXIgaW50ZXJmYWNlcyB1c2luZyBKYXZhIHJlZmxlY3Rpb24uCi0gKiBVc2VycyBjYW4gaWdub3JlIHRoaXMgY2xhc3MgYW5kIHByZXRlbmQgdGhhdCBnZW5lcmF0ZWQgbWVzc2FnZXMgaW1wbGVtZW50Ci0gKiB0aGUgTWVzc2FnZSBpbnRlcmZhY2UgZGlyZWN0bHkuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UKLSAgICBpbXBsZW1lbnRzIFNlcmlhbGl6YWJsZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIC8qKgotICAgKiBGb3IgdGVzdGluZy4gQWxsb3dzIGEgdGVzdCB0byBkaXNhYmxlIHRoZSBvcHRpbWl6YXRpb24gdGhhdCBhdm9pZHMgdXNpbmcKLSAgICogZmllbGQgYnVpbGRlcnMgZm9yIG5lc3RlZCBtZXNzYWdlcyB1bnRpbCB0aGV5IGFyZSByZXF1ZXN0ZWQuIEJ5IGRpc2FibGluZwotICAgKiB0aGlzIG9wdGltaXphdGlvbiwgZXhpc3RpbmcgdGVzdHMgY2FuIGJlIHJldXNlZCB0byB0ZXN0IHRoZSBmaWVsZCBidWlsZGVycy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhbHdheXNVc2VGaWVsZEJ1aWxkZXJzID0gZmFsc2U7Ci0KLSAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gICovCi0gIHByb3RlY3RlZCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkczsKLQotICBwcm90ZWN0ZWQgR2VuZXJhdGVkTWVzc2FnZSgpIHsKLSAgICB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2UoQnVpbGRlcjw/PiBidWlsZGVyKSB7Ci0gICAgdW5rbm93bkZpZWxkcyA9IGJ1aWxkZXIuZ2V0VW5rbm93bkZpZWxkcygpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBQYXJzZXI8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IGdldFBhcnNlckZvclR5cGUoKSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7Ci0gIH0KLQotIC8qKgotICAqIEZvciB0ZXN0aW5nLiBBbGxvd3MgYSB0ZXN0IHRvIGRpc2FibGUgdGhlIG9wdGltaXphdGlvbiB0aGF0IGF2b2lkcyB1c2luZwotICAqIGZpZWxkIGJ1aWxkZXJzIGZvciBuZXN0ZWQgbWVzc2FnZXMgdW50aWwgdGhleSBhcmUgcmVxdWVzdGVkLiBCeSBkaXNhYmxpbmcKLSAgKiB0aGlzIG9wdGltaXphdGlvbiwgZXhpc3RpbmcgdGVzdHMgY2FuIGJlIHJldXNlZCB0byB0ZXN0IHRoZSBmaWVsZCBidWlsZGVycy4KLSAgKiBTZWUge0BsaW5rIFJlcGVhdGVkRmllbGRCdWlsZGVyfSBhbmQge0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0uCi0gICovCi0gIHN0YXRpYyB2b2lkIGVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCkgewotICAgIGFsd2F5c1VzZUZpZWxkQnVpbGRlcnMgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlIGZvciB0aGlzIHR5cGUuICBXZSBjYW4ndCBoYXZlIHRoZSBtZXNzYWdlCi0gICAqIGNsYXNzIHBhc3MgdGhpcyBpbiB0byB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSBvZiBib290c3RyYXBwaW5nIHRyb3VibGUKLSAgICogd2l0aCBEZXNjcmlwdG9yUHJvdG9zLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEZpZWxkQWNjZXNzb3JUYWJsZSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpOwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5kZXNjcmlwdG9yOwotICB9Ci0KLSAgLyoqCi0gICAqIEludGVybmFsIGhlbHBlciB0byByZXR1cm4gYSBtb2RpZmlhYmxlIG1hcCBjb250YWluaW5nIGFsbCB0aGUgZmllbGRzLgotICAgKiBUaGUgcmV0dXJuZWQgTWFwIGlzIG1vZGlmaWFsYmUgc28gdGhhdCB0aGUgY2FsbGVyIGNhbiBhZGQgYWRkaXRpb25hbAotICAgKiBleHRlbnNpb24gZmllbGRzIHRvIGltcGxlbWVudCB7QGxpbmsgI2dldEFsbEZpZWxkcygpfS4KLSAgICoKLSAgICogQHBhcmFtIGdldEJ5dGVzRm9yU3RyaW5nIHdoZXRoZXIgdG8gZ2VuZXJhdGUgQnl0ZVN0cmluZyBmb3Igc3RyaW5nIGZpZWxkcwotICAgKi8KLSAgcHJpdmF0ZSBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkc011dGFibGUoCi0gICAgICBib29sZWFuIGdldEJ5dGVzRm9yU3RyaW5nKSB7Ci0gICAgZmluYWwgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gcmVzdWx0ID0KLSAgICAgIG5ldyBUcmVlTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PigpOwotICAgIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZGVzY3JpcHRvcjsKLSAgICBmaW5hbCBMaXN0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZGVzY3JpcHRvci5nZXRGaWVsZHMoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBmaWVsZHMuZ2V0KGkpOwotICAgICAgZmluYWwgT25lb2ZEZXNjcmlwdG9yIG9uZW9mRGVzY3JpcHRvciA9IGZpZWxkLmdldENvbnRhaW5pbmdPbmVvZigpOwotCi0gICAgICAvKgotICAgICAgICogSWYgdGhlIGZpZWxkIGlzIHBhcnQgb2YgYSBPbmVvZiwgdGhlbiBhdCBtYXhpbXVtIG9uZSBmaWVsZCBpbiB0aGUgT25lb2YgaXMgc2V0Ci0gICAgICAgKiBhbmQgaXQgaXMgbm90IHJlcGVhdGVkLiBUaGVyZSBpcyBubyBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgb3RoZXJzLgotICAgICAgICovCi0gICAgICBpZiAob25lb2ZEZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgLy8gU2tpcCBvdGhlciBmaWVsZHMgaW4gdGhlIE9uZW9mIHdlIGtub3cgYXJlIG5vdCBzZXQKLSAgICAgICAgaSArPSBvbmVvZkRlc2NyaXB0b3IuZ2V0RmllbGRDb3VudCgpIC0gMTsKLSAgICAgICAgaWYgKCFoYXNPbmVvZihvbmVvZkRlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgLy8gSWYgbm8gZmllbGQgaXMgc2V0IGluIHRoZSBPbmVvZiwgc2tpcCBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgT25lb2YKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICAvLyBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG9ubHkgZmllbGQgd2hpY2ggaXMgc2V0IGluIHRoZSBPbmVvZgotICAgICAgICBmaWVsZCA9IGdldE9uZW9mRmllbGREZXNjcmlwdG9yKG9uZW9mRGVzY3JpcHRvcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgT25lb2YsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGZpZWxkIGlzIHNldCBhbmQgaWYgaXQgaXMgcmVwZWF0ZWQKLSAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgIGZpbmFsIExpc3Q8Pz4gdmFsdWUgPSAoTGlzdDw/PikgZ2V0RmllbGQoZmllbGQpOwotICAgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghaGFzRmllbGQoZmllbGQpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIC8vIEFkZCB0aGUgZmllbGQgdG8gdGhlIG1hcAotICAgICAgaWYgKGdldEJ5dGVzRm9yU3RyaW5nICYmIGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLlNUUklORykgewotICAgICAgICByZXN1bHQucHV0KGZpZWxkLCBnZXRGaWVsZFJhdyhmaWVsZCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LnB1dChmaWVsZCwgZ2V0RmllbGQoZmllbGQpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDogZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWVsZHMoKSkgewotICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgotICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSkgewotICAgICAgICBpZiAoIWhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCi0gICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsCi0gICAgICAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlTGlzdCA9IChMaXN0PE1lc3NhZ2U+KSBnZXRGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgZm9yIChmaW5hbCBNZXNzYWdlIGVsZW1lbnQgOiBtZXNzYWdlTGlzdCkgewotICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChoYXNGaWVsZChmaWVsZCkgJiYgISgoTWVzc2FnZSkgZ2V0RmllbGQoZmllbGQpKS5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcCgKLSAgICAgICAgZ2V0QWxsRmllbGRzTXV0YWJsZSgvKiBnZXRCeXRlc0ZvclN0cmluZyA9ICovIGZhbHNlKSk7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIGNvbGxlY3Rpb24gb2YgYWxsIHRoZSBmaWVsZHMgaW4gdGhpcyBtZXNzYWdlIHdoaWNoIGFyZSBzZXQKLSAgICogYW5kIHRoZWlyIGNvcnJlc3BvbmRpbmcgdmFsdWVzLiAgQSBzaW5ndWxhciAoInJlcXVpcmVkIiBvciAib3B0aW9uYWwiKQotICAgKiBmaWVsZCBpcyBzZXQgaWZmIGhhc0ZpZWxkKCkgcmV0dXJucyB0cnVlIGZvciB0aGF0IGZpZWxkLiAgQSAicmVwZWF0ZWQiCi0gICAqIGZpZWxkIGlzIHNldCBpZmYgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KCkgaXMgZ3JlYXRlciB0aGFuIHplcm8uICBUaGUKLSAgICogdmFsdWVzIGFyZSBleGFjdGx5IHdoYXQgd291bGQgYmUgcmV0dXJuZWQgYnkgY2FsbGluZwotICAgKiB7QGxpbmsgI2dldEZpZWxkUmF3KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvciBlYWNoIGZpZWxkLiAgVGhlIG1hcAotICAgKiBpcyBndWFyYW50ZWVkIHRvIGJlIGEgc29ydGVkIG1hcCwgc28gaXRlcmF0aW5nIG92ZXIgaXQgd2lsbCByZXR1cm4gZmllbGRzCi0gICAqIGluIG9yZGVyIGJ5IGZpZWxkIG51bWJlci4KLSAgICovCi0gIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzUmF3KCkgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoCi0gICAgICAgIGdldEFsbEZpZWxkc011dGFibGUoLyogZ2V0Qnl0ZXNGb3JTdHJpbmcgPSAqLyB0cnVlKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaGFzT25lb2YoZmluYWwgT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0T25lb2Yob25lb2YpLmhhcyh0aGlzKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldE9uZW9mRmllbGREZXNjcmlwdG9yKGZpbmFsIE9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldE9uZW9mKG9uZW9mKS5nZXQodGhpcyk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpLmhhcyh0aGlzKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5nZXQodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogT2J0YWlucyB0aGUgdmFsdWUgb2YgdGhlIGdpdmVuIGZpZWxkLCBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBpdCBpcwotICAgKiBub3Qgc2V0LiAgRm9yIHByaW1pdGl2ZSBmaWVsZHMsIHRoZSBib3hlZCBwcmltaXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuCi0gICAqIEZvciBlbnVtIGZpZWxkcywgdGhlIEVudW1WYWx1ZURlc2NyaXB0b3IgZm9yIHRoZSB2YWx1ZSBpcyByZXR1cm5lZC4gRm9yCi0gICAqIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGRzLCB0aGUgc3ViLW1lc3NhZ2UgaXMgcmV0dXJuZWQuICBGb3IgcmVwZWF0ZWQKLSAgICogZmllbGRzLCBhIGphdmEudXRpbC5MaXN0IGlzIHJldHVybmVkLiBGb3IgcHJlc2VudCBzdHJpbmcgZmllbGRzLCBhCi0gICAqIEJ5dGVTdHJpbmcgaXMgcmV0dXJuZWQgcmVwcmVzZW50aW5nIHRoZSBieXRlcyB0aGF0IHRoZSBmaWVsZCBjb250YWlucy4KLSAgICovCi0gIE9iamVjdCBnZXRGaWVsZFJhdyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0UmF3KHRoaXMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQotICAgICAgLmdldFJlcGVhdGVkQ291bnQodGhpcyk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCi0gICAgICAuZ2V0UmVwZWF0ZWQodGhpcywgaW5kZXgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICJUaGlzIGlzIHN1cHBvc2VkIHRvIGJlIG92ZXJyaWRkZW4gYnkgc3ViY2xhc3Nlcy4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkLgotICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgotICAgKi8KLSAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCi0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHVua25vd25GaWVsZHMubWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIDxNIGV4dGVuZHMgTWVzc2FnZT4gTSBwYXJzZVdpdGhJT0V4Y2VwdGlvbihQYXJzZXI8TT4gcGFyc2VyLCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tKGlucHV0KTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgZS51bndyYXBJT0V4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgPE0gZXh0ZW5kcyBNZXNzYWdlPiBNIHBhcnNlV2l0aElPRXhjZXB0aW9uKFBhcnNlcjxNPiBwYXJzZXIsIElucHV0U3RyZWFtIGlucHV0LAotICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tKGlucHV0LCBleHRlbnNpb25zKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgZS51bndyYXBJT0V4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgPE0gZXh0ZW5kcyBNZXNzYWdlPiBNIHBhcnNlV2l0aElPRXhjZXB0aW9uKFBhcnNlcjxNPiBwYXJzZXIsCi0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gcGFyc2VyLnBhcnNlRnJvbShpbnB1dCk7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IGUudW53cmFwSU9FeGNlcHRpb24oKTsKLSAgICB9Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIDxNIGV4dGVuZHMgTWVzc2FnZT4gTSBwYXJzZVdpdGhJT0V4Y2VwdGlvbihQYXJzZXI8TT4gcGFyc2VyLAotICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvbnMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBwYXJzZXIucGFyc2VGcm9tKGlucHV0LCBleHRlbnNpb25zKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgZS51bndyYXBJT0V4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgPE0gZXh0ZW5kcyBNZXNzYWdlPiBNIHBhcnNlRGVsaW1pdGVkV2l0aElPRXhjZXB0aW9uKFBhcnNlcjxNPiBwYXJzZXIsCi0gICAgICBJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBlLnVud3JhcElPRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyA8TSBleHRlbmRzIE1lc3NhZ2U+IE0gcGFyc2VEZWxpbWl0ZWRXaXRoSU9FeGNlcHRpb24oUGFyc2VyPE0+IHBhcnNlciwKLSAgICAgIElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9ucykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHBhcnNlci5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvbnMpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBlLnVud3JhcElPRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIE1lc3NhZ2VSZWZsZWN0aW9uLndyaXRlTWVzc2FnZVRvKHRoaXMsIGdldEFsbEZpZWxkc1JhdygpLCBvdXRwdXQsIGZhbHNlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgIGludCBzaXplID0gbWVtb2l6ZWRTaXplOwotICAgIGlmIChzaXplICE9IC0xKSB7Ci0gICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBtZW1vaXplZFNpemUgPSBNZXNzYWdlUmVmbGVjdGlvbi5nZXRTZXJpYWxpemVkU2l6ZSgKLSAgICAgICAgdGhpcywgZ2V0QWxsRmllbGRzUmF3KCkpOwotICAgIHJldHVybiBtZW1vaXplZFNpemU7Ci0gIH0KLQotCi0KLSAgLyoqCi0gICAqIFVzZWQgYnkgcGFyc2luZyBjb25zdHJ1Y3RvcnMgaW4gZ2VuZXJhdGVkIGNsYXNzZXMuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBtYWtlRXh0ZW5zaW9uc0ltbXV0YWJsZSgpIHsKLSAgICAvLyBOb29wIGZvciBtZXNzYWdlcyB3aXRob3V0IGV4dGVuc2lvbnMuCi0gIH0KLQotICBwcm90ZWN0ZWQgYWJzdHJhY3QgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKEJ1aWxkZXJQYXJlbnQgcGFyZW50KTsKLQotICAvKioKLSAgICogSW50ZXJmYWNlIGZvciB0aGUgcGFyZW50IG9mIGEgQnVpbGRlciB0aGF0IGFsbG93cyB0aGUgYnVpbGRlciB0bwotICAgKiBjb21tdW5pY2F0ZSBpbnZhbGlkYXRpb25zIGJhY2sgdG8gdGhlIHBhcmVudCBmb3IgdXNlIHdoZW4gdXNpbmcgbmVzdGVkCi0gICAqIGJ1aWxkZXJzLgotICAgKi8KLSAgcHJvdGVjdGVkIGludGVyZmFjZSBCdWlsZGVyUGFyZW50IHsKLQotICAgIC8qKgotICAgICAqIEEgYnVpbGRlciBiZWNvbWVzIGRpcnR5IHdoZW5ldmVyIGEgZmllbGQgaXMgbW9kaWZpZWQgLS0gaW5jbHVkaW5nIGZpZWxkcwotICAgICAqIGluIG5lc3RlZCBidWlsZGVycyAtLSBhbmQgYmVjb21lcyBjbGVhbiB3aGVuIGJ1aWxkKCkgaXMgY2FsbGVkLiAgVGh1cywKLSAgICAgKiB3aGVuIGEgYnVpbGRlciBiZWNvbWVzIGRpcnR5LCBhbGwgaXRzIHBhcmVudHMgYmVjb21lIGRpcnR5IGFzIHdlbGwsIGFuZAotICAgICAqIHdoZW4gaXQgYmVjb21lcyBjbGVhbiwgYWxsIGl0cyBjaGlsZHJlbiBiZWNvbWUgY2xlYW4uICBUaGUgZGlydGluZXNzCi0gICAgICogc3RhdGUgaXMgdXNlZCB0byBpbnZhbGlkYXRlIGNlcnRhaW4gY2FjaGVkIHZhbHVlcy4KLSAgICAgKiA8YnI+Ci0gICAgICogVG8gdGhpcyBlbmQsIGEgYnVpbGRlciBjYWxscyBtYXJrQXNEaXJ0eSgpIG9uIGl0cyBwYXJlbnQgd2hlbmV2ZXIgaXQKLSAgICAgKiB0cmFuc2l0aW9ucyBmcm9tIGNsZWFuIHRvIGRpcnR5LiAgVGhlIHBhcmVudCBtdXN0IHByb3BhZ2F0ZSB0aGlzIGNhbGwgdG8KLSAgICAgKiBpdHMgb3duIHBhcmVudCwgdW5sZXNzIGl0IHdhcyBhbHJlYWR5IGRpcnR5LCBpbiB3aGljaCBjYXNlIHRoZQotICAgICAqIGdyYW5kcGFyZW50IG11c3QgbmVjZXNzYXJpbHkgYWxyZWFkeSBiZSBkaXJ0eSBhcyB3ZWxsLiAgVGhlIHBhcmVudCBjYW4KLSAgICAgKiBvbmx5IHRyYW5zaXRpb24gYmFjayB0byAiY2xlYW4iIGFmdGVyIGNhbGxpbmcgYnVpbGQoKSBvbiBhbGwgY2hpbGRyZW4uCi0gICAgICovCi0gICAgdm9pZCBtYXJrRGlydHkoKTsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEJ1aWxkZXIgPEJ1aWxkZXJUeXBlIGV4dGVuZHMgQnVpbGRlcjxCdWlsZGVyVHlwZT4+Ci0gICAgICBleHRlbmRzIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXJUeXBlPiB7Ci0KLSAgICBwcml2YXRlIEJ1aWxkZXJQYXJlbnQgYnVpbGRlclBhcmVudDsKLQotICAgIHByaXZhdGUgQnVpbGRlclBhcmVudEltcGwgbWVBc1BhcmVudDsKLQotICAgIC8vIEluZGljYXRlcyB0aGF0IHdlJ3ZlIGJ1aWx0IGEgbWVzc2FnZSBhbmQgc28gd2UgYXJlIG5vdyBvYmxpZ2F0ZWQKLSAgICAvLyB0byBkaXNwYXRjaCBkaXJ0eSBpbnZhbGlkYXRpb25zLiBTZWUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyTGlzdGVuZXIuCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzQ2xlYW47Ci0KLSAgICBwcml2YXRlIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOwotCi0gICAgcHJvdGVjdGVkIEJ1aWxkZXIoKSB7Ci0gICAgICB0aGlzKG51bGwpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBCdWlsZGVyKEJ1aWxkZXJQYXJlbnQgYnVpbGRlclBhcmVudCkgewotICAgICAgdGhpcy5idWlsZGVyUGFyZW50ID0gYnVpbGRlclBhcmVudDsKLSAgICB9Ci0KLSAgICB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgICBidWlsZGVyUGFyZW50ID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIHN1YmNsYXNzIHdoZW4gYSBtZXNzYWdlIGlzIGJ1aWx0LgotICAgICAqLwotICAgIHByb3RlY3RlZCB2b2lkIG9uQnVpbHQoKSB7Ci0gICAgICBpZiAoYnVpbGRlclBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgIG1hcmtDbGVhbigpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgc3ViY2xhc3Mgb3IgYSBidWlsZGVyIHRvIG5vdGlmeSB1cyB0aGF0IGEgbWVzc2FnZSB3YXMKLSAgICAgKiBidWlsdCBhbmQgbWF5IGJlIGNhY2hlZCBhbmQgdGhlcmVmb3JlIGludmFsaWRhdGlvbnMgYXJlIG5lZWRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBtYXJrQ2xlYW4oKSB7Ci0gICAgICB0aGlzLmlzQ2xlYW4gPSB0cnVlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgd2hldGhlciBpbnZhbGlkYXRpb25zIGFyZSBuZWVkZWQKLSAgICAgKgotICAgICAqIEByZXR1cm4gd2hldGhlciBpbnZhbGlkYXRpb25zIGFyZSBuZWVkZWQKLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0NsZWFuKCkgewotICAgICAgcmV0dXJuIGlzQ2xlYW47Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsb25lKCkgewotICAgICAgQnVpbGRlclR5cGUgYnVpbGRlciA9Ci0gICAgICAgICAgKEJ1aWxkZXJUeXBlKSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKGJ1aWxkUGFydGlhbCgpKTsKLSAgICAgIHJldHVybiBidWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFyIGNvZGUgcGF0aHMgdG8gYWxsb3cgc3ViY2xhc3NlcyB0bwotICAgICAqIHJlc2V0IGFueSBvZiB0aGVpciBidWlsdGluIGZpZWxkcyBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlcy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7Ci0gICAgICB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlIGZvciB0aGlzIHR5cGUuICBXZSBjYW4ndCBoYXZlIHRoZSBtZXNzYWdlCi0gICAgICogY2xhc3MgcGFzcyB0aGlzIGluIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIG9mIGJvb3RzdHJhcHBpbmcgdHJvdWJsZQotICAgICAqIHdpdGggRGVzY3JpcHRvclByb3Rvcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmllbGRBY2Nlc3NvclRhYmxlIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChnZXRBbGxGaWVsZHNNdXRhYmxlKCkpOwotICAgIH0KLQotICAgIC8qKiBJbnRlcm5hbCBoZWxwZXIgd2hpY2ggcmV0dXJucyBhIG11dGFibGUgbWFwLiAqLwotICAgIHByaXZhdGUgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHNNdXRhYmxlKCkgewotICAgICAgZmluYWwgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gcmVzdWx0ID0KLSAgICAgICAgbmV3IFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+KCk7Ci0gICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7Ci0gICAgICBmaW5hbCBMaXN0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzID0gZGVzY3JpcHRvci5nZXRGaWVsZHMoKTsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZmllbGRzLmdldChpKTsKLSAgICAgICAgZmluYWwgT25lb2ZEZXNjcmlwdG9yIG9uZW9mRGVzY3JpcHRvciA9IGZpZWxkLmdldENvbnRhaW5pbmdPbmVvZigpOwotCi0gICAgICAgIC8qCi0gICAgICAgICAqIElmIHRoZSBmaWVsZCBpcyBwYXJ0IG9mIGEgT25lb2YsIHRoZW4gYXQgbWF4aW11bSBvbmUgZmllbGQgaW4gdGhlIE9uZW9mIGlzIHNldAotICAgICAgICAgKiBhbmQgaXQgaXMgbm90IHJlcGVhdGVkLiBUaGVyZSBpcyBubyBuZWVkIHRvIGl0ZXJhdGUgdGhyb3VnaCB0aGUgb3RoZXJzLgotICAgICAgICAgKi8KLSAgICAgICAgaWYgKG9uZW9mRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgLy8gU2tpcCBvdGhlciBmaWVsZHMgaW4gdGhlIE9uZW9mIHdlIGtub3cgYXJlIG5vdCBzZXQKLSAgICAgICAgICBpICs9IG9uZW9mRGVzY3JpcHRvci5nZXRGaWVsZENvdW50KCkgLSAxOwotICAgICAgICAgIGlmICghaGFzT25lb2Yob25lb2ZEZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgLy8gSWYgbm8gZmllbGQgaXMgc2V0IGluIHRoZSBPbmVvZiwgc2tpcCBhbGwgdGhlIGZpZWxkcyBpbiB0aGUgT25lb2YKLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBHZXQgdGhlIHBvaW50ZXIgdG8gdGhlIG9ubHkgZmllbGQgd2hpY2ggaXMgc2V0IGluIHRoZSBPbmVvZgotICAgICAgICAgIGZpZWxkID0gZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3Iob25lb2ZEZXNjcmlwdG9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBJZiB3ZSBhcmUgbm90IGluIGEgT25lb2YsIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGZpZWxkIGlzIHNldCBhbmQgaWYgaXQgaXMgcmVwZWF0ZWQKLSAgICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgICBmaW5hbCBMaXN0PD8+IHZhbHVlID0gKExpc3Q8Pz4pIGdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoIWhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEFkZCB0aGUgZmllbGQgdG8gdGhlIG1hcAotICAgICAgICByZXN1bHQucHV0KGZpZWxkLCBnZXRGaWVsZChmaWVsZCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXJGb3JGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5uZXdCdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBnZXRGaWVsZEJ1aWxkZXIoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0QnVpbGRlcih0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIGdldFJlcGVhdGVkRmllbGRCdWlsZGVyKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KSB7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0UmVwZWF0ZWRCdWlsZGVyKAotICAgICAgICAgIHRoaXMsIGluZGV4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNPbmVvZihmaW5hbCBPbmVvZkRlc2NyaXB0b3Igb25lb2YpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldE9uZW9mKG9uZW9mKS5oYXModGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBnZXRPbmVvZkZpZWxkRGVzY3JpcHRvcihmaW5hbCBPbmVvZkRlc2NyaXB0b3Igb25lb2YpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldE9uZW9mKG9uZW9mKS5nZXQodGhpcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuaGFzKHRoaXMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0KHRoaXMpOwotICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAvLyBUaGUgdW5kZXJseWluZyBsaXN0IG9iamVjdCBpcyBzdGlsbCBtb2RpZmlhYmxlIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gZXhwb3NlIHRoZSBtb2RpZmlhYmxlIGxpc3QgdG8gdGhlIGNhbGxlci4KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIG9iamVjdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBzZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuc2V0KHRoaXMsIHZhbHVlKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5jbGVhcih0aGlzKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyT25lb2YoZmluYWwgT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldE9uZW9mKG9uZW9mKS5jbGVhcih0aGlzKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkKLSAgICAgICAgICAuZ2V0UmVwZWF0ZWRDb3VudCh0aGlzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQotICAgICAgICAgIC5nZXRSZXBlYXRlZCh0aGlzLCBpbmRleCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIHNldFJlcGVhdGVkRmllbGQoCi0gICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCi0gICAgICAgIC5zZXRSZXBlYXRlZCh0aGlzLCBpbmRleCwgdmFsdWUpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgYWRkUmVwZWF0ZWRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuYWRkUmVwZWF0ZWQodGhpcywgdmFsdWUpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgc2V0VW5rbm93bkZpZWxkcyhmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgewotICAgICAgdGhpcy51bmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkczsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VVbmtub3duRmllbGRzKAotICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgewotICAgICAgdGhpcy51bmtub3duRmllbGRzID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIodGhpcy51bmtub3duRmllbGRzKQotICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKHVua25vd25GaWVsZHMpCi0gICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RmllbGRzKCkpIHsKLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgotICAgICAgICBpZiAoZmllbGQuaXNSZXF1aXJlZCgpKSB7Ci0gICAgICAgICAgaWYgKCFoYXNGaWVsZChmaWVsZCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCi0gICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsCi0gICAgICAgICAgICBMaXN0PE1lc3NhZ2U+IG1lc3NhZ2VMaXN0ID0gKExpc3Q8TWVzc2FnZT4pIGdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICAgIGZvciAoZmluYWwgTWVzc2FnZSBlbGVtZW50IDogbWVzc2FnZUxpc3QpIHsKLSAgICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoaGFzRmllbGQoZmllbGQpICYmCi0gICAgICAgICAgICAgICAgISgoTWVzc2FnZSkgZ2V0RmllbGQoZmllbGQpKS5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgewotICAgICAgcmV0dXJuIHVua25vd25GaWVsZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZC4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgotICAgICAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKAotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgQnVpbGRlclBhcmVudH0gZm9yIGdpdmluZyB0byBvdXIgY2hpbGRyZW4uIFRoaXMKLSAgICAgKiBzbWFsbCBpbm5lciBjbGFzcyBtYWtlcyBpdCBzbyB3ZSBkb24ndCBwdWJsaWNseSBleHBvc2UgdGhlIEJ1aWxkZXJQYXJlbnQKLSAgICAgKiBtZXRob2RzLgotICAgICAqLwotICAgIHByaXZhdGUgY2xhc3MgQnVpbGRlclBhcmVudEltcGwgaW1wbGVtZW50cyBCdWlsZGVyUGFyZW50IHsKLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHtAbGluayBCdWlsZGVyUGFyZW50fSBmb3IgZ2l2aW5nIHRvIG91ciBjaGlsZHJlbi4KLSAgICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIHBhcmVudCBmb3Igb3VyIGNoaWxkcmVuLgotICAgICAqLwotICAgIHByb3RlY3RlZCBCdWlsZGVyUGFyZW50IGdldFBhcmVudEZvckNoaWxkcmVuKCkgewotICAgICAgaWYgKG1lQXNQYXJlbnQgPT0gbnVsbCkgewotICAgICAgICBtZUFzUGFyZW50ID0gbmV3IEJ1aWxkZXJQYXJlbnRJbXBsKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWVBc1BhcmVudDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgd2hlbiBhIHRoZSBidWlsZGVyIG9yIG9uZSBvZiBpdHMgbmVzdGVkIGNoaWxkcmVuIGhhcyBjaGFuZ2VkCi0gICAgICogYW5kIGFueSBwYXJlbnQgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGl0cyBpbnZhbGlkYXRpb24uCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgb25DaGFuZ2VkKCkgewotICAgICAgaWYgKGlzQ2xlYW4gJiYgYnVpbGRlclBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgIGJ1aWxkZXJQYXJlbnQubWFya0RpcnR5KCk7Ci0KLSAgICAgICAgLy8gRG9uJ3Qga2VlcCBkaXNwYXRjaGluZyBpbnZhbGlkYXRpb25zIHVudGlsIGJ1aWxkIGlzIGNhbGxlZCBhZ2Fpbi4KLSAgICAgICAgaXNDbGVhbiA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIG1hcCBmaWVsZCB3aXRoIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuIFRoaXMgbWV0aG9kIHNob3VsZCBiZQotICAgICAqIG92ZXJyaWRkZW4gaW4gdGhlIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIG1hcAotICAgICAqIGZpZWxkcy4KLSAgICAgKgotICAgICAqIFVubGlrZSBvdGhlciBmaWVsZCB0eXBlcywgcmVmbGVjdGlvbiBzdXBwb3J0IGZvciBtYXAgZmllbGRzIGNhbid0IGJlCi0gICAgICogaW1wbGVtZW50ZWQgYmFzZWQgb24gZ2VuZXJhdGVkIHB1YmxpYyBBUEkgYmVjYXVzZSB3ZSBuZWVkIHRvIGFjY2VzcyBhCi0gICAgICogbWFwIGZpZWxkIGFzIGEgbGlzdCBpbiByZWZsZWN0aW9uIEFQSSBidXQgdGhlIGdlbmVyYXRlZCBBUEkgb25seSBhbGxvd3MKLSAgICAgKiB1cyB0byBhY2Nlc3MgaXQgYXMgYSBtYXAuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHVuZGVybHlpbmcgbWFwIGZpZWxkCi0gICAgICogZGlyZWN0bHkgYW5kIHRodXMgZW5hYmxlcyB1cyB0byBhY2Nlc3MgdGhlIG1hcCBmaWVsZCBhcyBhIGxpc3QuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoeyJ1bnVzZWQiLCAicmF3dHlwZXMifSkKLSAgICBwcm90ZWN0ZWQgTWFwRmllbGQgaW50ZXJuYWxHZXRNYXBGaWVsZChpbnQgZmllbGROdW1iZXIpIHsKLSAgICAgIC8vIE5vdGUgdGhhdCB3ZSBjYW4ndCB1c2UgZGVzY3JpcHRvciBuYW1lcyBoZXJlIGJlY2F1c2UgdGhpcyBtZXRob2Qgd2lsbAotICAgICAgLy8gYmUgY2FsbGVkIHdoZW4gZGVzY3JpcHRvciBpcyBiZWluZyBpbml0aWFsaXplZC4KLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJObyBtYXAgZmllbGRzIGZvdW5kIGluICIgKyBnZXRDbGFzcygpLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoqIExpa2Uge0BsaW5rICNpbnRlcm5hbEdldE1hcEZpZWxkfSBidXQgcmV0dXJuIGEgbXV0YWJsZSB2ZXJzaW9uLiAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKHsidW51c2VkIiwgInJhd3R5cGVzIn0pCi0gICAgcHJvdGVjdGVkIE1hcEZpZWxkIGludGVybmFsR2V0TXV0YWJsZU1hcEZpZWxkKGludCBmaWVsZE51bWJlcikgewotICAgICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBkZXNjcmlwdG9yIG5hbWVzIGhlcmUgYmVjYXVzZSB0aGlzIG1ldGhvZCB3aWxsCi0gICAgICAvLyBiZSBjYWxsZWQgd2hlbiBkZXNjcmlwdG9yIGlzIGJlaW5nIGluaXRpYWxpemVkLgotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIk5vIG1hcCBmaWVsZHMgZm91bmQgaW4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBFeHRlbnNpb25zLXJlbGF0ZWQgc3R1ZmYKLQotICBwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPAotICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZT4gZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyIHsKLSAgICAvLyBSZS1kZWZpbmUgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuCi0gICAgQE92ZXJyaWRlCi0gICAgTWVzc2FnZSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCk7Ci0KLSAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KLSAgICA8VHlwZT4gYm9vbGVhbiBoYXNFeHRlbnNpb24oCi0gICAgICAgIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7Ci0KLSAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKLSAgICAgICAgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKTsKLQotICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KLSAgICA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCi0gICAgICAgIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7Ci0KLSAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKLSAgICAgICAgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAotICAgICAgICBpbnQgaW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgZm9yIG1lc3NhZ2UgdHlwZXMgdGhhdCBjb250YWluIGV4dGVuc2lvbiByYW5nZXMKLSAgICogc3ViY2xhc3MgdGhpcy4KLSAgICoKLSAgICogPHA+VGhpcyBjbGFzcyBpbXBsZW1lbnRzIHR5cGUtc2FmZSBhY2Nlc3NvcnMgZm9yIGV4dGVuc2lvbnMuICBUaGV5Ci0gICAqIGltcGxlbWVudCBhbGwgdGhlIHNhbWUgb3BlcmF0aW9ucyB0aGF0IHlvdSBjYW4gZG8gd2l0aCBub3JtYWwgZmllbGRzIC0tCi0gICAqIGUuZy4gImhhcyIsICJnZXQiLCBhbmQgImdldENvdW50IiAtLSBidXQgZm9yIGV4dGVuc2lvbnMuICBUaGUgZXh0ZW5zaW9ucwotICAgKiBhcmUgaWRlbnRpZmllZCB1c2luZyBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIHtAbGluayBHZW5lcmF0ZWRFeHRlbnNpb259OwotICAgKiB0aGUgcHJvdG9jb2wgY29tcGlsZXIgZ2VuZXJhdGVzIGEgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZm9yIGV2ZXJ5Ci0gICAqIGV4dGVuc2lvbiBpbiBpdHMgaW5wdXQuICBUaHJvdWdoIHRoZSBtYWdpYyBvZiBnZW5lcmljcywgYWxsIGlzIG1hZGUKLSAgICogdHlwZS1zYWZlLgotICAgKgotICAgKiA8cD5Gb3IgZXhhbXBsZSwgaW1hZ2luZSB5b3UgaGF2ZSB0aGUge0Bjb2RlIC5wcm90b30gZmlsZToKLSAgICoKLSAgICogPHByZT4KLSAgICogb3B0aW9uIGphdmFfY2xhc3MgPSAiTXlQcm90byI7Ci0gICAqCi0gICAqIG1lc3NhZ2UgRm9vIHsKLSAgICogICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotICAgKiB9Ci0gICAqCi0gICAqIGV4dGVuZCBGb28gewotICAgKiAgIG9wdGlvbmFsIGludDMyIGJhcjsKLSAgICogfQotICAgKiA8L3ByZT4KLSAgICoKLSAgICogPHA+VGhlbiB5b3UgbWlnaHQgd3JpdGUgY29kZSBsaWtlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBNeVByb3RvLkZvbyBmb28gPSBnZXRGb28oKTsKLSAgICogaW50IGkgPSBmb28uZ2V0RXh0ZW5zaW9uKE15UHJvdG8uYmFyKTsKLSAgICogPC9wcmU+Ci0gICAqCi0gICAqIDxwPlNlZSBhbHNvIHtAbGluayBFeHRlbmRhYmxlQnVpbGRlcn0uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEV4dGVuZGFibGVNZXNzYWdlPAotICAgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPgotICAgICAgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlCi0gICAgICBpbXBsZW1lbnRzIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPE1lc3NhZ2VUeXBlPiB7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICAgIHByaXZhdGUgZmluYWwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zOwotCi0gICAgcHJvdGVjdGVkIEV4dGVuZGFibGVNZXNzYWdlKCkgewotICAgICAgdGhpcy5leHRlbnNpb25zID0gRmllbGRTZXQubmV3RmllbGRTZXQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZU1lc3NhZ2UoCi0gICAgICAgIEV4dGVuZGFibGVCdWlsZGVyPE1lc3NhZ2VUeXBlLCA/PiBidWlsZGVyKSB7Ci0gICAgICBzdXBlcihidWlsZGVyKTsKLSAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGJ1aWxkZXIuYnVpbGRFeHRlbnNpb25zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAotICAgICAgICBmaW5hbCBFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgewotICAgICAgaWYgKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPQotICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKLSAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJFeHRlbnNpb24gaXMgZm9yIHR5cGUgXCIiICsKLSAgICAgICAgICBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCi0gICAgICAgICAgIlwiIHdoaWNoIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZSBcIiIgKwotICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKGZpbmFsIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbkxpdGUpIHsKLSAgICAgIEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uID0gY2hlY2tOb3RMaXRlKGV4dGVuc2lvbkxpdGUpOwotCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gaW50IGdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb25MaXRlKSB7Ci0gICAgICBFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiA9IGNoZWNrTm90TGl0ZShleHRlbnNpb25MaXRlKTsKLQotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChkZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbihmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb25MaXRlKSB7Ci0gICAgICBFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbiA9IGNoZWNrTm90TGl0ZShleHRlbnNpb25MaXRlKTsKLQotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICByZXR1cm4gKFR5cGUpIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSgKLSAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb25MaXRlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgIEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uID0gY2hlY2tOb3RMaXRlKGV4dGVuc2lvbkxpdGUpOwotCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoCi0gICAgICAgICAgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IsIGluZGV4KSk7Ci0gICAgfQotCi0gICAgLyoqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIGNoZWNrIGlmIGFsbCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZC4gKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5pc0luaXRpYWxpemVkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiBzdXBlci5pc0luaXRpYWxpemVkKCkgJiYgZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCi0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMsCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBNZXNzYWdlUmVmbGVjdGlvbi5tZXJnZUZpZWxkRnJvbSgKLSAgICAgICAgICBpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIGdldERlc2NyaXB0b3JGb3JUeXBlKCksCi0gICAgICAgICAgbmV3IE1lc3NhZ2VSZWZsZWN0aW9uLkV4dGVuc2lvbkFkYXB0ZXIoZXh0ZW5zaW9ucyksIHRhZyk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBVc2VkIGJ5IHBhcnNpbmcgY29uc3RydWN0b3JzIGluIGdlbmVyYXRlZCBjbGFzc2VzLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIG1ha2VFeHRlbnNpb25zSW1tdXRhYmxlKCkgewotICAgICAgZXh0ZW5zaW9ucy5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCBieSBzdWJjbGFzc2VzIHRvIHNlcmlhbGl6ZSBleHRlbnNpb25zLiAgRXh0ZW5zaW9uIHJhbmdlcyBtYXkgYmUKLSAgICAgKiBpbnRlcmxlYXZlZCB3aXRoIGZpZWxkIG51bWJlcnMsIGJ1dCB3ZSBtdXN0IHdyaXRlIHRoZW0gaW4gY2Fub25pY2FsCi0gICAgICogKHNvcnRlZCBieSBmaWVsZCBudW1iZXIpIG9yZGVyLiAgRXh0ZW5zaW9uV3JpdGVyIGhlbHBzIHVzIHdyaXRlCi0gICAgICogaW5kaXZpZHVhbCByYW5nZXMgb2YgZXh0ZW5zaW9ucyBhdCBvbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBFeHRlbnNpb25Xcml0ZXIgewotICAgICAgLy8gSW1hZ2luZSBob3cgbXVjaCBzaW1wbGVyIHRoaXMgY29kZSB3b3VsZCBiZSBpZiBKYXZhIGl0ZXJhdG9ycyBoYWQKLSAgICAgIC8vIGEgd2F5IHRvIGdldCB0aGUgbmV4dCBlbGVtZW50IHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBpdGVyYXRvci4KLQotICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+PiBpdGVyID0KLSAgICAgICAgZXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotICAgICAgcHJpdmF0ZSBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IG5leHQ7Ci0gICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWVzc2FnZVNldFdpcmVGb3JtYXQ7Ci0KLSAgICAgIHByaXZhdGUgRXh0ZW5zaW9uV3JpdGVyKGZpbmFsIGJvb2xlYW4gbWVzc2FnZVNldFdpcmVGb3JtYXQpIHsKLSAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgbmV4dCA9IGl0ZXIubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubWVzc2FnZVNldFdpcmVGb3JtYXQgPSBtZXNzYWdlU2V0V2lyZUZvcm1hdDsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd3JpdGVVbnRpbChmaW5hbCBpbnQgZW5kLCBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXRLZXkoKS5nZXROdW1iZXIoKSA8IGVuZCkgewotICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV4dC5nZXRLZXkoKTsKLSAgICAgICAgICBpZiAobWVzc2FnZVNldFdpcmVGb3JtYXQgJiYgZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFICYmCi0gICAgICAgICAgICAgICFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgaWYgKG5leHQgaW5zdGFuY2VvZiBMYXp5RmllbGQuTGF6eUVudHJ5PD8+KSB7Ci0gICAgICAgICAgICAgIG91dHB1dC53cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb24oZGVzY3JpcHRvci5nZXROdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICgoTGF6eUZpZWxkLkxhenlFbnRyeTw/PikgbmV4dCkuZ2V0RmllbGQoKS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBvdXRwdXQud3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1lc3NhZ2UpIG5leHQuZ2V0VmFsdWUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFRPRE8oeGlhbmdsKTogVGFrZW4gY2FyZSBvZiBmb2xsb3dpbmcgY29kZSwgaXQgbWF5IGNhdXNlCi0gICAgICAgICAgICAvLyBwcm9ibGVtIHdoZW4gd2UgdXNlIExhenlGaWVsZCBmb3Igbm9ybWFsIGZpZWxkcy9leHRlbnNpb25zLgotICAgICAgICAgICAgLy8gRHVlIHRvIHRoZSBvcHRpb25hbCBmaWVsZCBjYW4gYmUgZHVwbGljYXRlZCBhdCB0aGUgZW5kIG9mCi0gICAgICAgICAgICAvLyBzZXJpYWxpemVkIGJ5dGVzLCB3aGljaCB3aWxsIG1ha2UgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBjaGFuZ2UKLSAgICAgICAgICAgIC8vIGFmdGVyIGxhenkgZmllbGQgcGFyc2VkLiBTbyB3aGVuIHdlIHVzZSBMYXp5RmllbGQgZ2xvYmFsbHksCi0gICAgICAgICAgICAvLyB3ZSBuZWVkIHRvIGNoYW5nZSB0aGUgZm9sbG93aW5nIHdyaXRlIG1ldGhvZCB0byB3cml0ZSBjYWNoZWQKLSAgICAgICAgICAgIC8vIGJ5dGVzIGRpcmVjdGx5IHJhdGhlciB0aGFuIHdyaXRlIHRoZSBwYXJzZWQgbWVzc2FnZS4KLSAgICAgICAgICAgIEZpZWxkU2V0LndyaXRlRmllbGQoZGVzY3JpcHRvciwgbmV4dC5nZXRWYWx1ZSgpLCBvdXRwdXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICAgIG5leHQgPSBpdGVyLm5leHQoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbmV4dCA9IG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEV4dGVuc2lvbldyaXRlciBuZXdFeHRlbnNpb25Xcml0ZXIoKSB7Ci0gICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbldyaXRlcihmYWxzZSk7Ci0gICAgfQotICAgIHByb3RlY3RlZCBFeHRlbnNpb25Xcml0ZXIgbmV3TWVzc2FnZVNldEV4dGVuc2lvbldyaXRlcigpIHsKLSAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uV3JpdGVyKHRydWUpOwotICAgIH0KLQotICAgIC8qKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBjb21wdXRlIHRoZSBzaXplIG9mIGV4dGVuc2lvbnMuICovCi0gICAgcHJvdGVjdGVkIGludCBleHRlbnNpb25zU2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgaW50IGV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldCgpIHsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmdldE1lc3NhZ2VTZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIFJlZmxlY3Rpb24KLQotICAgIHByb3RlY3RlZCBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEV4dGVuc2lvbkZpZWxkcygpIHsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmdldEFsbEZpZWxkcygpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKLSAgICAgIGZpbmFsIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gcmVzdWx0ID0KLSAgICAgICAgICBzdXBlci5nZXRBbGxGaWVsZHNNdXRhYmxlKC8qIGdldEJ5dGVzRm9yU3RyaW5nID0gKi8gZmFsc2UpOwotICAgICAgcmVzdWx0LnB1dEFsbChnZXRFeHRlbnNpb25GaWVsZHMoKSk7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc3VsdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzUmF3KCkgewotICAgICAgZmluYWwgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiByZXN1bHQgPQotICAgICAgICAgIHN1cGVyLmdldEFsbEZpZWxkc011dGFibGUoLyogZ2V0Qnl0ZXNGb3JTdHJpbmcgPSAqLyBmYWxzZSk7Ci0gICAgICByZXN1bHQucHV0QWxsKGdldEV4dGVuc2lvbkZpZWxkcygpKTsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc0ZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBleHRlbnNpb25zLmdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgICAvLyBMYWNraW5nIGFuIEV4dGVuc2lvblJlZ2lzdHJ5LCB3ZSBoYXZlIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlCi0gICAgICAgICAgICAvLyBleHRlbnNpb24ncyByZWFsIHR5cGUsIHNvIHdlIHJldHVybiBhIER5bmFtaWNNZXNzYWdlLgotICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIkZpZWxkRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlZCBtZXNzYWdlIGJ1aWxkZXJzIGZvciBtZXNzYWdlIHR5cGVzIHRoYXQgY29udGFpbiBleHRlbnNpb24gcmFuZ2VzCi0gICAqIHN1YmNsYXNzIHRoaXMuCi0gICAqCi0gICAqIDxwPlRoaXMgY2xhc3MgaW1wbGVtZW50cyB0eXBlLXNhZmUgYWNjZXNzb3JzIGZvciBleHRlbnNpb25zLiAgVGhleQotICAgKiBpbXBsZW1lbnQgYWxsIHRoZSBzYW1lIG9wZXJhdGlvbnMgdGhhdCB5b3UgY2FuIGRvIHdpdGggbm9ybWFsIGZpZWxkcyAtLQotICAgKiBlLmcuICJnZXQiLCAic2V0IiwgYW5kICJhZGQiIC0tIGJ1dCBmb3IgZXh0ZW5zaW9ucy4gIFRoZSBleHRlbnNpb25zIGFyZQotICAgKiBpZGVudGlmaWVkIHVzaW5nIGluc3RhbmNlcyBvZiB0aGUgY2xhc3Mge0BsaW5rIEdlbmVyYXRlZEV4dGVuc2lvbn07IHRoZQotICAgKiBwcm90b2NvbCBjb21waWxlciBnZW5lcmF0ZXMgYSBzdGF0aWMgaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZXZlcnkKLSAgICogZXh0ZW5zaW9uIGluIGl0cyBpbnB1dC4gIFRocm91Z2ggdGhlIG1hZ2ljIG9mIGdlbmVyaWNzLCBhbGwgaXMgbWFkZQotICAgKiB0eXBlLXNhZmUuCi0gICAqCi0gICAqIDxwPkZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSBoYXZlIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKLSAgICoKLSAgICogbWVzc2FnZSBGb28gewotICAgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci0gICAqIH0KLSAgICoKLSAgICogZXh0ZW5kIEZvbyB7Ci0gICAqICAgb3B0aW9uYWwgaW50MzIgYmFyOwotICAgKiB9Ci0gICAqIDwvcHJlPgotICAgKgotICAgKiA8cD5UaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6Ci0gICAqCi0gICAqIDxwcmU+Ci0gICAqIE15UHJvdG8uRm9vIGZvbyA9Ci0gICAqICAgTXlQcm90by5Gb28ubmV3QnVpbGRlcigpCi0gICAqICAgICAuc2V0RXh0ZW5zaW9uKE15UHJvdG8uYmFyLCAxMjMpCi0gICAqICAgICAuYnVpbGQoKTsKLSAgICogPC9wcmU+Ci0gICAqCi0gICAqIDxwPlNlZSBhbHNvIHtAbGluayBFeHRlbmRhYmxlTWVzc2FnZX0uCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBFeHRlbmRhYmxlQnVpbGRlcjwKLSAgICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZSwKLSAgICAgICAgQnVpbGRlclR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlQnVpbGRlcjxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+PgotICAgICAgZXh0ZW5kcyBCdWlsZGVyPEJ1aWxkZXJUeXBlPgotICAgICAgaW1wbGVtZW50cyBFeHRlbmRhYmxlTWVzc2FnZU9yQnVpbGRlcjxNZXNzYWdlVHlwZT4gewotCi0gICAgcHJpdmF0ZSBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGV4dGVuc2lvbnMgPSBGaWVsZFNldC5lbXB0eVNldCgpOwotCi0gICAgcHJvdGVjdGVkIEV4dGVuZGFibGVCdWlsZGVyKCkge30KLQotICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlQnVpbGRlcigKLSAgICAgICAgQnVpbGRlclBhcmVudCBwYXJlbnQpIHsKLSAgICAgIHN1cGVyKHBhcmVudCk7Ci0gICAgfQotCi0gICAgLy8gRm9yIGltbXV0YWJsZSBtZXNzYWdlIGNvbnZlcnNpb24uCi0gICAgdm9pZCBpbnRlcm5hbFNldEV4dGVuc2lvblNldChGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGV4dGVuc2lvbnMpIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyKCkgewotICAgICAgZXh0ZW5zaW9ucyA9IEZpZWxkU2V0LmVtcHR5U2V0KCk7Ci0gICAgICByZXR1cm4gc3VwZXIuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIGltcGxlbWVudGVkIGhlcmUgb25seSB0byB3b3JrIGFyb3VuZCBhbiBhcHBhcmVudCBidWcgaW4gdGhlCi0gICAgLy8gSmF2YSBjb21waWxlciBhbmQvb3IgYnVpbGQgc3lzdGVtLiAgU2VlIGJ1ZyAjMTg5ODQ2My4gIFRoZSBtZXJlIHByZXNlbmNlCi0gICAgLy8gb2YgdGhpcyBjbG9uZSgpIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGdvIGF3YXkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsb25lKCkgewotICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKSB7Ci0gICAgICBpZiAoZXh0ZW5zaW9ucy5pc0ltbXV0YWJsZSgpKSB7Ci0gICAgICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zLmNsb25lKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAotICAgICAgICBmaW5hbCBFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgewotICAgICAgaWYgKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPQotICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKLSAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJFeHRlbnNpb24gaXMgZm9yIHR5cGUgXCIiICsKLSAgICAgICAgICBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0RnVsbE5hbWUoKSArCi0gICAgICAgICAgIlwiIHdoaWNoIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZSBcIiIgKwotICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKGZpbmFsIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbkxpdGUpIHsKLSAgICAgIEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uID0gY2hlY2tOb3RMaXRlKGV4dGVuc2lvbkxpdGUpOwotCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gaW50IGdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb25MaXRlKSB7Ci0gICAgICBFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiA9IGNoZWNrTm90TGl0ZShleHRlbnNpb25MaXRlKTsKLQotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChkZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbihmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb25MaXRlKSB7Ci0gICAgICBFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbiA9IGNoZWNrTm90TGl0ZShleHRlbnNpb25MaXRlKTsKLQotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICByZXR1cm4gKFR5cGUpIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSgKLSAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb25MaXRlLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgIEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uID0gY2hlY2tOb3RMaXRlKGV4dGVuc2lvbkxpdGUpOwotCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoCi0gICAgICAgICAgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IsIGluZGV4KSk7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb25MaXRlLAotICAgICAgICBmaW5hbCBUeXBlIHZhbHVlKSB7Ci0gICAgICBFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbiA9IGNoZWNrTm90TGl0ZShleHRlbnNpb25MaXRlKTsKLQotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZGVzY3JpcHRvciwgZXh0ZW5zaW9uLnRvUmVmbGVjdGlvblR5cGUodmFsdWUpKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSB2YWx1ZSBvZiBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIHNldEV4dGVuc2lvbigKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uTGl0ZSwKLSAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBUeXBlIHZhbHVlKSB7Ci0gICAgICBFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiA9IGNoZWNrTm90TGl0ZShleHRlbnNpb25MaXRlKTsKLQotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGV4dGVuc2lvbnMuc2V0UmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgZGVzY3JpcHRvciwgaW5kZXgsCi0gICAgICAgIGV4dGVuc2lvbi5zaW5ndWxhclRvUmVmbGVjdGlvblR5cGUodmFsdWUpKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKiogQXBwZW5kIGEgdmFsdWUgdG8gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBhZGRFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbkxpdGUsCi0gICAgICAgIGZpbmFsIFR5cGUgdmFsdWUpIHsKLSAgICAgIEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uID0gY2hlY2tOb3RMaXRlKGV4dGVuc2lvbkxpdGUpOwotCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgZXh0ZW5zaW9ucy5hZGRSZXBlYXRlZEZpZWxkKAotICAgICAgICAgIGRlc2NyaXB0b3IsIGV4dGVuc2lvbi5zaW5ndWxhclRvUmVmbGVjdGlvblR5cGUodmFsdWUpKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKiogQ2xlYXIgYW4gZXh0ZW5zaW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgY2xlYXJFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbkxpdGUpIHsKLSAgICAgIEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgPz4gZXh0ZW5zaW9uID0gY2hlY2tOb3RMaXRlKGV4dGVuc2lvbkxpdGUpOwotCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgZXh0ZW5zaW9ucy5jbGVhckZpZWxkKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBjaGVjayBpZiBhbGwgZXh0ZW5zaW9ucyBhcmUgaW5pdGlhbGl6ZWQuICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaXNJbml0aWFsaXplZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgYnVpbGQgY29kZSBwYXRoIHRvIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGV4dGVuc2lvbnMgZm9yCi0gICAgICogYnVpbGRpbmcgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGJ1aWxkRXh0ZW5zaW9ucygpIHsKLSAgICAgIGV4dGVuc2lvbnMubWFrZUltbXV0YWJsZSgpOwotICAgICAgcmV0dXJuIGV4dGVuc2lvbnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiBzdXBlci5pc0luaXRpYWxpemVkKCkgJiYgZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZCBvciBhbiBleHRlbnNpb24uCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZVVua25vd25GaWVsZCgKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICBmaW5hbCBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIE1lc3NhZ2VSZWZsZWN0aW9uLm1lcmdlRmllbGRGcm9tKAotICAgICAgICAgIGlucHV0LCB1bmtub3duRmllbGRzLCBleHRlbnNpb25SZWdpc3RyeSwgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSwKLSAgICAgICAgICBuZXcgTWVzc2FnZVJlZmxlY3Rpb24uQnVpbGRlckFkYXB0ZXIodGhpcyksIHRhZyk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmbGVjdGlvbgotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgZmluYWwgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiByZXN1bHQgPSBzdXBlci5nZXRBbGxGaWVsZHNNdXRhYmxlKCk7Ci0gICAgICByZXN1bHQucHV0QWxsKGV4dGVuc2lvbnMuZ2V0QWxsRmllbGRzKCkpOwotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXN1bHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZmllbGQpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgICAvLyBMYWNraW5nIGFuIEV4dGVuc2lvblJlZ2lzdHJ5LCB3ZSBoYXZlIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlCi0gICAgICAgICAgICAvLyBleHRlbnNpb24ncyByZWFsIHR5cGUsIHNvIHdlIHJldHVybiBhIER5bmFtaWNNZXNzYWdlLgotICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc0ZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgc2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgICBleHRlbnNpb25zLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgICAgZXh0ZW5zaW9ucy5jbGVhckZpZWxkKGZpZWxkKTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuY2xlYXJGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIHNldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgICAgZXh0ZW5zaW9ucy5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpOwotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBhZGRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIG1lcmdlRXh0ZW5zaW9uRmllbGRzKGZpbmFsIEV4dGVuZGFibGVNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7Ci0gICAgICBleHRlbnNpb25zLm1lcmdlRnJvbShvdGhlci5leHRlbnNpb25zKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDb250YWluaW5nVHlwZShmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBleHRlbnNpb24uIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIKLSAgICogdGhlIGV4dGVuc2lvbiBpcyBzY29wZWQgaW4gdGhlIHRvcCBsZXZlbCBvZiBhIGZpbGUgb3Igc2NvcGVkIGluIGEgTWVzc2FnZS4KLSAgICovCi0gIHN0YXRpYyBpbnRlcmZhY2UgRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciB7Ci0gICAgRmllbGREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKTsKLSAgfQotCi0gIC8qKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICovCi0gIHB1YmxpYyBzdGF0aWMgPENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZSwgVHlwZT4KLSAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4KLSAgICAgIG5ld01lc3NhZ2VTY29wZWRHZW5lcmF0ZWRFeHRlbnNpb24oZmluYWwgTWVzc2FnZSBzY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGRlc2NyaXB0b3JJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgc2luZ3VsYXJUeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkgewotICAgIC8vIEZvciBleHRlbnNpb25zIHNjb3BlZCB3aXRoaW4gYSBNZXNzYWdlLCB3ZSB1c2UgdGhlIE1lc3NhZ2UgdG8gcmVzb2x2ZQotICAgIC8vIHRoZSBvdXRlciBjbGFzcydzIGRlc2NyaXB0b3IsIGZyb20gd2hpY2ggdGhlIGV4dGVuc2lvbiBkZXNjcmlwdG9yIGlzCi0gICAgLy8gb2J0YWluZWQuCi0gICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+KAotICAgICAgICBuZXcgQ2FjaGVkRGVzY3JpcHRvclJldHJpZXZlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGxvYWREZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIHNjb3BlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RXh0ZW5zaW9ucygpLmdldChkZXNjcmlwdG9ySW5kZXgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSwKLSAgICAgICAgc2luZ3VsYXJUeXBlLAotICAgICAgICBkZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgIEV4dGVuc2lvbi5FeHRlbnNpb25UeXBlLklNTVVUQUJMRSk7Ci0gIH0KLQotICAvKiogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAqLwotICBwdWJsaWMgc3RhdGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2UsIFR5cGU+Ci0gICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4KLSAgICAgbmV3RmlsZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbihmaW5hbCBDbGFzcyBzaW5ndWxhclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpIHsKLSAgICAvLyBGb3IgZXh0ZW5zaW9ucyBzY29wZWQgd2l0aGluIGEgZmlsZSwgd2UgcmVseSBvbiB0aGUgb3V0ZXIgY2xhc3MncwotICAgIC8vIHN0YXRpYyBpbml0aWFsaXplciB0byBjYWxsIGludGVybmFsSW5pdCgpIG9uIHRoZSBleHRlbnNpb24gd2hlbiB0aGUKLSAgICAvLyBkZXNjcmlwdG9yIGlzIGF2YWlsYWJsZS4KLSAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCi0gICAgICAgIG51bGwsICAvLyBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIGlzIGluaXRpYWxpemVkIGluIGludGVybmFsSW5pdCgpOwotICAgICAgICBzaW5ndWxhclR5cGUsCi0gICAgICAgIGRlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUuSU1NVVRBQkxFKTsKLSAgfQotCi0gIHByaXZhdGUgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIENhY2hlZERlc2NyaXB0b3JSZXRyaWV2ZXIKLSAgICAgIGltcGxlbWVudHMgRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciB7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmllbGREZXNjcmlwdG9yIGxvYWREZXNjcmlwdG9yKCk7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvciA9PSBudWxsKSB7Ci0gICAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIGRlc2NyaXB0b3IgPSBsb2FkRGVzY3JpcHRvcigpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFVzZWQgaW4gcHJvdG8xIGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqCi0gICAqIEFmdGVyIGVuYWJsaW5nIGJyaWRnZSwgd2UgY2FuIGRlZmluZSBwcm90bzIgZXh0ZW5zaW9ucyAodGhlIGV4dGVuZGVkIHR5cGUKLSAgICogaXMgYSBwcm90bzIgbXV0YWJsZSBtZXNzYWdlKSBpbiBhIHByb3RvMSAucHJvdG8gZmlsZS4gRm9yIHRoZXNlIGV4dGVuc2lvbnMKLSAgICogd2Ugc2hvdWxkIGdlbmVyYXRlIHByb3RvMiBHZW5lcmF0ZWRFeHRlbnNpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyA8Q29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlLCBUeXBlPgotICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPgotICAgICAgbmV3TWVzc2FnZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICBmaW5hbCBNZXNzYWdlIHNjb3BlLCBmaW5hbCBTdHJpbmcgbmFtZSwKLSAgICAgICAgICBmaW5hbCBDbGFzcyBzaW5ndWxhclR5cGUsIGZpbmFsIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKSB7Ci0gICAgLy8gRm9yIGV4dGVuc2lvbnMgc2NvcGVkIHdpdGhpbiBhIE1lc3NhZ2UsIHdlIHVzZSB0aGUgTWVzc2FnZSB0byByZXNvbHZlCi0gICAgLy8gdGhlIG91dGVyIGNsYXNzJ3MgZGVzY3JpcHRvciwgZnJvbSB3aGljaCB0aGUgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgaXMKLSAgICAvLyBvYnRhaW5lZC4KLSAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCi0gICAgICAgIG5ldyBDYWNoZWREZXNjcmlwdG9yUmV0cmlldmVyKCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCBGaWVsZERlc2NyaXB0b3IgbG9hZERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gc2NvcGUuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUobmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9LAotICAgICAgICBzaW5ndWxhclR5cGUsCi0gICAgICAgIGRlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgRXh0ZW5zaW9uLkV4dGVuc2lvblR5cGUuTVVUQUJMRSk7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZCBpbiBwcm90bzEgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICoKLSAgICogQWZ0ZXIgZW5hYmxpbmcgYnJpZGdlLCB3ZSBjYW4gZGVmaW5lIHByb3RvMiBleHRlbnNpb25zICh0aGUgZXh0ZW5kZWQgdHlwZQotICAgKiBpcyBhIHByb3RvMiBtdXRhYmxlIG1lc3NhZ2UpIGluIGEgcHJvdG8xIC5wcm90byBmaWxlLiBGb3IgdGhlc2UgZXh0ZW5zaW9ucwotICAgKiB3ZSBzaG91bGQgZ2VuZXJhdGUgcHJvdG8yIEdlbmVyYXRlZEV4dGVuc2lvbnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2UsIFR5cGU+Ci0gICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4KLSAgICAgbmV3RmlsZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbigKLSAgICAgICAgIGZpbmFsIENsYXNzIHNpbmd1bGFyVHlwZSwgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRvck91dGVyQ2xhc3MsIGZpbmFsIFN0cmluZyBleHRlbnNpb25OYW1lKSB7Ci0gICAgLy8gRm9yIGV4dGVuc2lvbnMgc2NvcGVkIHdpdGhpbiBhIGZpbGUsIHdlIGxvYWQgdGhlIGRlc2NyaXB0b3Igb3V0ZXIKLSAgICAvLyBjbGFzcyBhbmQgcmVseSBvbiBpdCB0byBnZXQgdGhlIEZpbGVEZXNjcmlwdG9yIHdoaWNoIHRoZW4gY2FuIGJlCi0gICAgLy8gdXNlZCB0byBvYnRhaW4gdGhlIGV4dGVuc2lvbidzIEZpZWxkRGVzY3JpcHRvci4KLSAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCi0gICAgICAgIG5ldyBDYWNoZWREZXNjcmlwdG9yUmV0cmlldmVyKCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHByb3RlY3RlZCBGaWVsZERlc2NyaXB0b3IgbG9hZERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICBDbGFzcyBjbGF6eiA9IHNpbmd1bGFyVHlwZS5nZXRDbGFzc0xvYWRlcigpLmxvYWRDbGFzcyhkZXNjcmlwdG9yT3V0ZXJDbGFzcyk7Ci0gICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yIGZpbGUgPSAoRmlsZURlc2NyaXB0b3IpIGNsYXp6LmdldEZpZWxkKCJkZXNjcmlwdG9yIikuZ2V0KG51bGwpOwotICAgICAgICAgICAgICByZXR1cm4gZmlsZS5maW5kRXh0ZW5zaW9uQnlOYW1lKGV4dGVuc2lvbk5hbWUpOwotICAgICAgICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAiQ2Fubm90IGxvYWQgZGVzY3JpcHRvcnM6ICIKLSAgICAgICAgICAgICAgICAgICAgICArIGRlc2NyaXB0b3JPdXRlckNsYXNzCi0gICAgICAgICAgICAgICAgICAgICAgKyAiIGlzIG5vdCBhIHZhbGlkIGRlc2NyaXB0b3IgY2xhc3MgbmFtZSIsCi0gICAgICAgICAgICAgICAgICBlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0sCi0gICAgICAgIHNpbmd1bGFyVHlwZSwKLSAgICAgICAgZGVmYXVsdEluc3RhbmNlLAotICAgICAgICBFeHRlbnNpb24uRXh0ZW5zaW9uVHlwZS5NVVRBQkxFKTsKLSAgfQotCi0gIC8qKgotICAgKiBUeXBlIHVzZWQgdG8gcmVwcmVzZW50IGdlbmVyYXRlZCBleHRlbnNpb25zLiAgVGhlIHByb3RvY29sIGNvbXBpbGVyCi0gICAqIGdlbmVyYXRlcyBhIHN0YXRpYyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZWFjaCBleHRlbnNpb24uCi0gICAqCi0gICAqIDxwPkZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSBoYXZlIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKLSAgICoKLSAgICogbWVzc2FnZSBGb28gewotICAgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci0gICAqIH0KLSAgICoKLSAgICogZXh0ZW5kIEZvbyB7Ci0gICAqICAgb3B0aW9uYWwgaW50MzIgYmFyOwotICAgKiB9Ci0gICAqIDwvcHJlPgotICAgKgotICAgKiA8cD5UaGVuLCB7QGNvZGUgTXlQcm90by5Gb28uYmFyfSBoYXMgdHlwZQotICAgKiB7QGNvZGUgR2VuZXJhdGVkRXh0ZW5zaW9uPE15UHJvdG8uRm9vLCBJbnRlZ2VyPn0uCi0gICAqCi0gICAqIDxwPkluIGdlbmVyYWwsIHVzZXJzIHNob3VsZCBpZ25vcmUgdGhlIGRldGFpbHMgb2YgdGhpcyB0eXBlLCBhbmQgc2ltcGx5IHVzZQotICAgKiB0aGVzZSBzdGF0aWMgc2luZ2xldG9ucyBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBleHRlbnNpb24gYWNjZXNzb3JzIGRlZmluZWQKLSAgICogaW4ge0BsaW5rIEV4dGVuZGFibGVNZXNzYWdlfSBhbmQge0BsaW5rIEV4dGVuZGFibGVCdWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgR2VuZXJhdGVkRXh0ZW5zaW9uPAotICAgICAgQ29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlLCBUeXBlPiBleHRlbmRzCi0gICAgICBFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+IHsKLSAgICAvLyBUT0RPKGtlbnRvbik6ICBGaW5kIHdheXMgdG8gYXZvaWQgdXNpbmcgSmF2YSByZWZsZWN0aW9uIHdpdGhpbiB0aGlzCi0gICAgLy8gICBjbGFzcy4gIEFsc28gdHJ5IHRvIGF2b2lkIHN1cHByZXNzaW5nIHVuY2hlY2tlZCB3YXJuaW5ncy4KLQotICAgIC8vIFdlIGNhbid0IGFsd2F5cyBpbml0aWFsaXplIHRoZSBkZXNjcmlwdG9yIG9mIGEgR2VuZXJhdGVkRXh0ZW5zaW9uIHdoZW4KLSAgICAvLyB3ZSBmaXJzdCBjb25zdHJ1Y3QgaXQgZHVlIHRvIGluaXRpYWxpemF0aW9uIG9yZGVyIGRpZmZpY3VsdGllcyAobmFtZWx5LAotICAgIC8vIHRoZSBkZXNjcmlwdG9yIG1heSBub3QgaGF2ZSBiZWVuIGNvbnN0cnVjdGVkIHlldCwgc2luY2UgaXQgaXMgb2Z0ZW4KLSAgICAvLyBjb25zdHJ1Y3RlZCBieSB0aGUgaW5pdGlhbGl6ZXIgb2YgYSBzZXBhcmF0ZSBtb2R1bGUpLgotICAgIC8vCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2YgbmVzdGVkIGV4dGVuc2lvbnMsIHdlIGluaXRpYWxpemUgdGhlCi0gICAgLy8gRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciB3aXRoIGFuIGluc3RhbmNlIHRoYXQgdXNlcyB0aGUgc2NvcGluZwotICAgIC8vIE1lc3NhZ2UncyBkZWZhdWx0IGluc3RhbmNlIHRvIHJldHJpZXZlIHRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yLgotICAgIC8vCi0gICAgLy8gSW4gdGhlIGNhc2Ugb2Ygbm9uLW5lc3RlZCBleHRlbnNpb25zLCB3ZSBpbml0aWFsaXplIHRoZQotICAgIC8vIEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIgdG8gbnVsbCBhbmQgcmVseSBvbiB0aGUgb3V0ZXIgY2xhc3MncyBzdGF0aWMKLSAgICAvLyBpbml0aWFsaXplciB0byBjYWxsIGludGVybmFsSW5pdCgpIGFmdGVyIHRoZSBkZXNjcmlwdG9yIGhhcyBiZWVuIHBhcnNlZC4KLSAgICBHZW5lcmF0ZWRFeHRlbnNpb24oRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciBkZXNjcmlwdG9yUmV0cmlldmVyLAotICAgICAgICBDbGFzcyBzaW5ndWxhclR5cGUsCi0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgRXh0ZW5zaW9uVHlwZSBleHRlbnNpb25UeXBlKSB7Ci0gICAgICBpZiAoTWVzc2FnZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNpbmd1bGFyVHlwZSkgJiYKLSAgICAgICAgICAhc2luZ3VsYXJUeXBlLmlzSW5zdGFuY2UobWVzc2FnZURlZmF1bHRJbnN0YW5jZSkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJCYWQgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSBmb3IgIiArIHNpbmd1bGFyVHlwZS5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgdGhpcy5kZXNjcmlwdG9yUmV0cmlldmVyID0gZGVzY3JpcHRvclJldHJpZXZlcjsKLSAgICAgIHRoaXMuc2luZ3VsYXJUeXBlID0gc2luZ3VsYXJUeXBlOwotICAgICAgdGhpcy5tZXNzYWdlRGVmYXVsdEluc3RhbmNlID0gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKLQotICAgICAgaWYgKFByb3RvY29sTWVzc2FnZUVudW0uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShzaW5ndWxhclR5cGUpKSB7Ci0gICAgICAgIHRoaXMuZW51bVZhbHVlT2YgPSBnZXRNZXRob2RPckRpZShzaW5ndWxhclR5cGUsICJ2YWx1ZU9mIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IuY2xhc3MpOwotICAgICAgICB0aGlzLmVudW1HZXRWYWx1ZURlc2NyaXB0b3IgPQotICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoc2luZ3VsYXJUeXBlLCAiZ2V0VmFsdWVEZXNjcmlwdG9yIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aGlzLmVudW1WYWx1ZU9mID0gbnVsbDsKLSAgICAgICAgdGhpcy5lbnVtR2V0VmFsdWVEZXNjcmlwdG9yID0gbnVsbDsKLSAgICAgIH0KLSAgICAgIHRoaXMuZXh0ZW5zaW9uVHlwZSA9IGV4dGVuc2lvblR5cGU7Ci0gICAgfQotCi0gICAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KLSAgICBwdWJsaWMgdm9pZCBpbnRlcm5hbEluaXQoZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgIGlmIChkZXNjcmlwdG9yUmV0cmlldmVyICE9IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiQWxyZWFkeSBpbml0aWFsaXplZC4iKTsKLSAgICAgIH0KLSAgICAgIGRlc2NyaXB0b3JSZXRyaWV2ZXIgPQotICAgICAgICAgIG5ldyBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBkZXNjcmlwdG9yOwotICAgICAgICAgICAgfQotICAgICAgICAgIH07Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIGRlc2NyaXB0b3JSZXRyaWV2ZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDbGFzcyBzaW5ndWxhclR5cGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZW51bVZhbHVlT2Y7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZW51bUdldFZhbHVlRGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIGZpbmFsIEV4dGVuc2lvblR5cGUgZXh0ZW5zaW9uVHlwZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgIGlmIChkZXNjcmlwdG9yUmV0cmlldmVyID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJnZXREZXNjcmlwdG9yKCkgY2FsbGVkIGJlZm9yZSBpbnRlcm5hbEluaXQoKSIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGRlc2NyaXB0b3JSZXRyaWV2ZXIuZ2V0RGVzY3JpcHRvcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBleHRlbnNpb24gaXMgYW4gZW1iZWRkZWQgbWVzc2FnZSBvciBncm91cCwgcmV0dXJucyB0aGUgZGVmYXVsdAotICAgICAqIGluc3RhbmNlIG9mIHRoZSBtZXNzYWdlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXNzYWdlIGdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSB7Ci0gICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uVHlwZSBnZXRFeHRlbnNpb25UeXBlKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvblR5cGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBmcm9tIHRoZSB0eXBlIHVzZWQgYnkgdGhlIHJlZmxlY3Rpb24gYWNjZXNzb3JzIHRvIHRoZSB0eXBlIHVzZWQKLSAgICAgKiBieSBuYXRpdmUgYWNjZXNzb3JzLiAgRS5nLiwgZm9yIGVudW1zLCB0aGUgcmVmbGVjdGlvbiBhY2Nlc3NvcnMgdXNlCi0gICAgICogRW51bVZhbHVlRGVzY3JpcHRvcnMgYnV0IHRoZSBuYXRpdmUgYWNjZXNzb3JzIHVzZSB0aGUgZ2VuZXJhdGVkIGVudW0KLSAgICAgKiB0eXBlLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCBPYmplY3QgZnJvbVJlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSB8fAotICAgICAgICAgICAgZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5FTlVNKSB7Ci0gICAgICAgICAgLy8gTXVzdCBjb252ZXJ0IHRoZSB3aG9sZSBsaXN0LgotICAgICAgICAgIGZpbmFsIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgdmFsdWUpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoZWxlbWVudCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjZnJvbVJlZmxlY3Rpb25UeXBlKE9iamVjdCl9LCBidXQgaWYgdGhlIHR5cGUgaXMgYSByZXBlYXRlZAotICAgICAqIHR5cGUsIHRoaXMgY29udmVydHMgYSBzaW5nbGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICBzd2l0Y2ggKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSkgewotICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgICAgaWYgKHNpbmd1bGFyVHlwZS5pc0luc3RhbmNlKHZhbHVlKSkgewotICAgICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbWVzc2FnZURlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpCi0gICAgICAgICAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgdmFsdWUpLmJ1aWxkKCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGVudW1WYWx1ZU9mLCBudWxsLCAoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGZyb20gdGhlIHR5cGUgdXNlZCBieSB0aGUgbmF0aXZlIGFjY2Vzc29ycyB0byB0aGUgdHlwZSB1c2VkCi0gICAgICogYnkgcmVmbGVjdGlvbiBhY2Nlc3NvcnMuICBFLmcuLCBmb3IgZW51bXMsIHRoZSByZWZsZWN0aW9uIGFjY2Vzc29ycyB1c2UKLSAgICAgKiBFbnVtVmFsdWVEZXNjcmlwdG9ycyBidXQgdGhlIG5hdGl2ZSBhY2Nlc3NvcnMgdXNlIHRoZSBnZW5lcmF0ZWQgZW51bQotICAgICAqIHR5cGUuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIE9iamVjdCB0b1JlZmxlY3Rpb25UeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yKCk7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuRU5VTSkgewotICAgICAgICAgIC8vIE11c3QgY29udmVydCB0aGUgd2hvbGUgbGlzdC4KLSAgICAgICAgICBmaW5hbCBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHZhbHVlKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZShlbGVtZW50KSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc2luZ3VsYXJUb1JlZmxlY3Rpb25UeXBlKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjdG9SZWZsZWN0aW9uVHlwZShPYmplY3QpfSwgYnV0IGlmIHRoZSB0eXBlIGlzIGEgcmVwZWF0ZWQKLSAgICAgKiB0eXBlLCB0aGlzIGNvbnZlcnRzIGEgc2luZ2xlIGVsZW1lbnQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIE9iamVjdCBzaW5ndWxhclRvUmVmbGVjdGlvblR5cGUoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoKTsKLSAgICAgIHN3aXRjaCAoZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZW51bUdldFZhbHVlRGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKLSAgICAgIHJldHVybiBnZXREZXNjcmlwdG9yKCkuZ2V0TnVtYmVyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCkgewotICAgICAgcmV0dXJuIGdldERlc2NyaXB0b3IoKS5nZXRMaXRlVHlwZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0ZWQoKSB7Ci0gICAgICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmlzUmVwZWF0ZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgVHlwZSBnZXREZWZhdWx0VmFsdWUoKSB7Ci0gICAgICBpZiAoaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIHJldHVybiAoVHlwZSkgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2V0RGVzY3JpcHRvcigpLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgcmV0dXJuIChUeXBlKSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlOwotICAgICAgfQotICAgICAgcmV0dXJuIChUeXBlKSBzaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZSgKLSAgICAgICAgICBnZXREZXNjcmlwdG9yKCkuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIENhbGxzIENsYXNzLmdldE1ldGhvZCBhbmQgdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbiBpZiBpdCBmYWlscy4gKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RPckRpZSgKLSAgICAgIGZpbmFsIENsYXNzIGNsYXp6LCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MuLi4gcGFyYW1zKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBjbGF6ei5nZXRNZXRob2QobmFtZSwgcGFyYW1zKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzcyBcIiIgKyBjbGF6ei5nZXROYW1lKCkgKwotICAgICAgICAiXCIgbWlzc2luZyBtZXRob2QgXCIiICsgbmFtZSArICJcIi4iLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQ2FsbHMgaW52b2tlIGFuZCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uIGlmIGl0IGZhaWxzLiAqLwotICBwcml2YXRlIHN0YXRpYyBPYmplY3QgaW52b2tlT3JEaWUoCi0gICAgICBmaW5hbCBNZXRob2QgbWV0aG9kLCBmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBPYmplY3QuLi4gcGFyYW1zKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKG9iamVjdCwgcGFyYW1zKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiQ291bGRuJ3QgdXNlIEphdmEgcmVmbGVjdGlvbiB0byBpbXBsZW1lbnQgcHJvdG9jb2wgbWVzc2FnZSAiICsKLSAgICAgICAgInJlZmxlY3Rpb24uIiwgZSk7Ci0gICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBjYXVzZTsKLSAgICAgIH0gZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikgewotICAgICAgICB0aHJvdyAoRXJyb3IpIGNhdXNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biBieSBnZW5lcmF0ZWQgYWNjZXNzb3IgbWV0aG9kLiIsIGNhdXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgbWFwIGZpZWxkIHdpdGggdGhlIGdpdmVuIGZpZWxkIG51bWJlci4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlCi0gICAqIG92ZXJyaWRkZW4gaW4gdGhlIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIGlmIHRoZSBtZXNzYWdlIGNvbnRhaW5zIG1hcAotICAgKiBmaWVsZHMuCi0gICAqCi0gICAqIFVubGlrZSBvdGhlciBmaWVsZCB0eXBlcywgcmVmbGVjdGlvbiBzdXBwb3J0IGZvciBtYXAgZmllbGRzIGNhbid0IGJlCi0gICAqIGltcGxlbWVudGVkIGJhc2VkIG9uIGdlbmVyYXRlZCBwdWJsaWMgQVBJIGJlY2F1c2Ugd2UgbmVlZCB0byBhY2Nlc3MgYQotICAgKiBtYXAgZmllbGQgYXMgYSBsaXN0IGluIHJlZmxlY3Rpb24gQVBJIGJ1dCB0aGUgZ2VuZXJhdGVkIEFQSSBvbmx5IGFsbG93cwotICAgKiB1cyB0byBhY2Nlc3MgaXQgYXMgYSBtYXAuIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIHVuZGVybHlpbmcgbWFwIGZpZWxkCi0gICAqIGRpcmVjdGx5IGFuZCB0aHVzIGVuYWJsZXMgdXMgdG8gYWNjZXNzIHRoZSBtYXAgZmllbGQgYXMgYSBsaXN0LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoeyJyYXd0eXBlcyIsICJ1bnVzZWQifSkKLSAgcHJvdGVjdGVkIE1hcEZpZWxkIGludGVybmFsR2V0TWFwRmllbGQoaW50IGZpZWxkTnVtYmVyKSB7Ci0gICAgLy8gTm90ZSB0aGF0IHdlIGNhbid0IHVzZSBkZXNjcmlwdG9yIG5hbWVzIGhlcmUgYmVjYXVzZSB0aGlzIG1ldGhvZCB3aWxsCi0gICAgLy8gYmUgY2FsbGVkIHdoZW4gZGVzY3JpcHRvciBpcyBiZWluZyBpbml0aWFsaXplZC4KLSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgIk5vIG1hcCBmaWVsZHMgZm91bmQgaW4gIiArIGdldENsYXNzKCkuZ2V0TmFtZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VycyBzaG91bGQgaWdub3JlIHRoaXMgY2xhc3MuICBUaGlzIGNsYXNzIHByb3ZpZGVzIHRoZSBpbXBsZW1lbnRhdGlvbgotICAgKiB3aXRoIGFjY2VzcyB0byB0aGUgZmllbGRzIG9mIGEgbWVzc2FnZSBvYmplY3QgdXNpbmcgSmF2YSByZWZsZWN0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBGaWVsZEFjY2Vzc29yVGFibGUgewotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgRmllbGRBY2Nlc3NvclRhYmxlIGZvciBhIHBhcnRpY3VsYXIgbWVzc2FnZSBjbGFzcy4gIE9ubHkKLSAgICAgKiBvbmUgRmllbGRBY2Nlc3NvclRhYmxlIHNob3VsZCBldmVyIGJlIGNvbnN0cnVjdGVkIHBlciBjbGFzcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBkZXNjcmlwdG9yICAgICBUaGUgdHlwZSdzIGRlc2NyaXB0b3IuCi0gICAgICogQHBhcmFtIGNhbWVsQ2FzZU5hbWVzIFRoZSBjYW1lbGNhc2UgbmFtZXMgb2YgYWxsIGZpZWxkcyBpbiB0aGUgbWVzc2FnZS4KLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgVGhlc2UgYXJlIHVzZWQgdG8gZGVyaXZlIHRoZSBhY2Nlc3NvciBtZXRob2QgbmFtZXMuCi0gICAgICogQHBhcmFtIG1lc3NhZ2VDbGFzcyAgIFRoZSBtZXNzYWdlIHR5cGUuCi0gICAgICogQHBhcmFtIGJ1aWxkZXJDbGFzcyAgIFRoZSBidWlsZGVyIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkQWNjZXNzb3JUYWJsZSgKLSAgICAgICAgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICBmaW5hbCBTdHJpbmdbXSBjYW1lbENhc2VOYW1lcywKLSAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgewotICAgICAgdGhpcyhkZXNjcmlwdG9yLCBjYW1lbENhc2VOYW1lcyk7Ci0gICAgICBlbnN1cmVGaWVsZEFjY2Vzc29yc0luaXRpYWxpemVkKG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSBGaWVsZEFjY2Vzc29yVGFibGUgZm9yIGEgcGFydGljdWxhciBtZXNzYWdlIGNsYXNzIHdpdGhvdXQKLSAgICAgKiBpbml0aWFsaXppbmcgRmllbGRBY2Nlc3NvcnMuCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkQWNjZXNzb3JUYWJsZSgKLSAgICAgICAgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICBmaW5hbCBTdHJpbmdbXSBjYW1lbENhc2VOYW1lcykgewotICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICAgIHRoaXMuY2FtZWxDYXNlTmFtZXMgPSBjYW1lbENhc2VOYW1lczsKLSAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZEFjY2Vzc29yW2Rlc2NyaXB0b3IuZ2V0RmllbGRzKCkuc2l6ZSgpXTsKLSAgICAgIG9uZW9mcyA9IG5ldyBPbmVvZkFjY2Vzc29yW2Rlc2NyaXB0b3IuZ2V0T25lb2ZzKCkuc2l6ZSgpXTsKLSAgICAgIGluaXRpYWxpemVkID0gZmFsc2U7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGlzTWFwRmllbGRFbmFibGVkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgYm9vbGVhbiByZXN1bHQgPSB0cnVlOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBFbnN1cmVzIHRoZSBmaWVsZCBhY2Nlc3NvcnMgYXJlIGluaXRpYWxpemVkLiBUaGlzIG1ldGhvZCBpcyB0aHJlYWQtc2FmZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ2xhc3MgICBUaGUgbWVzc2FnZSB0eXBlLgotICAgICAqIEBwYXJhbSBidWlsZGVyQ2xhc3MgICBUaGUgYnVpbGRlciB0eXBlLgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZEFjY2Vzc29yVGFibGUgZW5zdXJlRmllbGRBY2Nlc3NvcnNJbml0aWFsaXplZCgKLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgewotICAgICAgaWYgKGluaXRpYWxpemVkKSB7IHJldHVybiB0aGlzOyB9Ci0gICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgaWYgKGluaXRpYWxpemVkKSB7IHJldHVybiB0aGlzOyB9Ci0gICAgICAgIGludCBmaWVsZHNTaXplID0gZmllbGRzLmxlbmd0aDsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHNTaXplOyBpKyspIHsKLSAgICAgICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmdldEZpZWxkcygpLmdldChpKTsKLSAgICAgICAgICBTdHJpbmcgY29udGFpbmluZ09uZW9mQ2FtZWxDYXNlTmFtZSA9IG51bGw7Ci0gICAgICAgICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdPbmVvZigpICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNvbnRhaW5pbmdPbmVvZkNhbWVsQ2FzZU5hbWUgPQotICAgICAgICAgICAgICAgIGNhbWVsQ2FzZU5hbWVzW2ZpZWxkc1NpemUgKyBmaWVsZC5nZXRDb250YWluaW5nT25lb2YoKS5nZXRJbmRleCgpXTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgICAgaWYgKGZpZWxkLmlzTWFwRmllbGQoKSAmJiBpc01hcEZpZWxkRW5hYmxlZChmaWVsZCkpIHsKLSAgICAgICAgICAgICAgICBmaWVsZHNbaV0gPSBuZXcgTWFwRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICAgICAgICAgICAgZmllbGQsIGNhbWVsQ2FzZU5hbWVzW2ldLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFJlcGVhdGVkTWVzc2FnZUZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgICAgICAgICAgIGZpZWxkLCBjYW1lbENhc2VOYW1lc1tpXSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0pIHsKLSAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFJlcGVhdGVkRW51bUZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFNpbmd1bGFyTWVzc2FnZUZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzLAotICAgICAgICAgICAgICAgICAgY29udGFpbmluZ09uZW9mQ2FtZWxDYXNlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0pIHsKLSAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFNpbmd1bGFyRW51bUZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzLAotICAgICAgICAgICAgICAgICAgY29udGFpbmluZ09uZW9mQ2FtZWxDYXNlTmFtZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLlNUUklORykgewotICAgICAgICAgICAgICBmaWVsZHNbaV0gPSBuZXcgU2luZ3VsYXJTdHJpbmdGaWVsZEFjY2Vzc29yKAotICAgICAgICAgICAgICAgICAgZmllbGQsIGNhbWVsQ2FzZU5hbWVzW2ldLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcywKLSAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdPbmVvZkNhbWVsQ2FzZU5hbWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFNpbmd1bGFyRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICAgICAgICAgIGZpZWxkLCBjYW1lbENhc2VOYW1lc1tpXSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MsCi0gICAgICAgICAgICAgICAgICBjb250YWluaW5nT25lb2ZDYW1lbENhc2VOYW1lKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgb25lb2ZzU2l6ZSA9IG9uZW9mcy5sZW5ndGg7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb25lb2ZzU2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgb25lb2ZzW2ldID0gbmV3IE9uZW9mQWNjZXNzb3IoCi0gICAgICAgICAgICAgIGRlc2NyaXB0b3IsIGNhbWVsQ2FzZU5hbWVzW2kgKyBmaWVsZHNTaXplXSwKLSAgICAgICAgICAgICAgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIGluaXRpYWxpemVkID0gdHJ1ZTsKLSAgICAgICAgY2FtZWxDYXNlTmFtZXMgPSBudWxsOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkQWNjZXNzb3JbXSBmaWVsZHM7Ci0gICAgcHJpdmF0ZSBTdHJpbmdbXSBjYW1lbENhc2VOYW1lczsKLSAgICBwcml2YXRlIGZpbmFsIE9uZW9mQWNjZXNzb3JbXSBvbmVvZnM7Ci0gICAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIGluaXRpYWxpemVkOwotCi0gICAgLyoqIEdldCB0aGUgRmllbGRBY2Nlc3NvciBmb3IgYSBwYXJ0aWN1bGFyIGZpZWxkLiAqLwotICAgIHByaXZhdGUgRmllbGRBY2Nlc3NvciBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGRlc2NyaXB0b3IpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICAvLyBJZiB0aGlzIHR5cGUgaGFkIGV4dGVuc2lvbnMsIGl0IHdvdWxkIHN1YmNsYXNzIEV4dGVuZGFibGVNZXNzYWdlLAotICAgICAgICAvLyB3aGljaCBvdmVycmlkZXMgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlIHRvIGhhbmRsZSBleHRlbnNpb25zLgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJUaGlzIHR5cGUgZG9lcyBub3QgaGF2ZSBleHRlbnNpb25zLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGZpZWxkc1tmaWVsZC5nZXRJbmRleCgpXTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBPbmVvZkFjY2Vzc29yIGZvciBhIHBhcnRpY3VsYXIgb25lb2YuICovCi0gICAgcHJpdmF0ZSBPbmVvZkFjY2Vzc29yIGdldE9uZW9mKGZpbmFsIE9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgaWYgKG9uZW9mLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZGVzY3JpcHRvcikgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJPbmVvZkRlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIG9uZW9mc1tvbmVvZi5nZXRJbmRleCgpXTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBYnN0cmFjdCBpbnRlcmZhY2UgdGhhdCBwcm92aWRlcyBhY2Nlc3MgdG8gYSBzaW5nbGUgZmllbGQuICBUaGlzIGlzCi0gICAgICogaW1wbGVtZW50ZWQgZGlmZmVyZW50bHkgZGVwZW5kaW5nIG9uIHRoZSBmaWVsZCB0eXBlIGFuZCBjYXJkaW5hbGl0eS4KLSAgICAgKi8KLSAgICBwcml2YXRlIGludGVyZmFjZSBGaWVsZEFjY2Vzc29yIHsKLSAgICAgIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKTsKLSAgICAgIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpOwotICAgICAgT2JqZWN0IGdldFJhdyhHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpOwotICAgICAgT2JqZWN0IGdldFJhdyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcik7Ci0gICAgICB2b2lkIHNldChCdWlsZGVyIGJ1aWxkZXIsIE9iamVjdCB2YWx1ZSk7Ci0gICAgICBPYmplY3QgZ2V0UmVwZWF0ZWQoR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLCBpbnQgaW5kZXgpOwotICAgICAgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgpOwotICAgICAgT2JqZWN0IGdldFJlcGVhdGVkUmF3KEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwgaW50IGluZGV4KTsKLSAgICAgIE9iamVjdCBnZXRSZXBlYXRlZFJhdyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KTsKLSAgICAgIHZvaWQgc2V0UmVwZWF0ZWQoQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSk7Ci0gICAgICB2b2lkIGFkZFJlcGVhdGVkKEJ1aWxkZXIgYnVpbGRlciwgT2JqZWN0IHZhbHVlKTsKLSAgICAgIGJvb2xlYW4gaGFzKEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSk7Ci0gICAgICBib29sZWFuIGhhcyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcik7Ci0gICAgICBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpOwotICAgICAgaW50IGdldFJlcGVhdGVkQ291bnQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpOwotICAgICAgdm9pZCBjbGVhcihCdWlsZGVyIGJ1aWxkZXIpOwotICAgICAgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKTsKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBnZXRCdWlsZGVyKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKTsKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBnZXRSZXBlYXRlZEJ1aWxkZXIoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7Ci0gICAgfQotCi0gICAgLyoqIE9uZW9mQWNjZXNzb3IgcHJvdmlkZXMgYWNjZXNzIHRvIGEgc2luZ2xlIG9uZW9mLiAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE9uZW9mQWNjZXNzb3IgewotICAgICAgT25lb2ZBY2Nlc3NvcigKLSAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICBjYXNlTWV0aG9kID0KLSAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkNhc2UiKTsKLSAgICAgICAgY2FzZU1ldGhvZEJ1aWxkZXIgPQotICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUgKyAiQ2FzZSIpOwotICAgICAgICBjbGVhck1ldGhvZCA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImNsZWFyIiArIGNhbWVsQ2FzZU5hbWUpOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGNhc2VNZXRob2Q7Ci0gICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBjYXNlTWV0aG9kQnVpbGRlcjsKLSAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGNsZWFyTWV0aG9kOwotCi0gICAgICBwdWJsaWMgYm9vbGVhbiBoYXMoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIGlmICgoKEludGVybmFsLkVudW1MaXRlKSBpbnZva2VPckRpZShjYXNlTWV0aG9kLCBtZXNzYWdlKSkuZ2V0TnVtYmVyKCkgPT0gMCkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIGlmICgoKEludGVybmFsLkVudW1MaXRlKSBpbnZva2VPckRpZShjYXNlTWV0aG9kQnVpbGRlciwgYnVpbGRlcikpLmdldE51bWJlcigpID09IDApIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICBpbnQgZmllbGROdW1iZXIgPSAoKEludGVybmFsLkVudW1MaXRlKSBpbnZva2VPckRpZShjYXNlTWV0aG9kLCBtZXNzYWdlKSkuZ2V0TnVtYmVyKCk7Ci0gICAgICAgIGlmIChmaWVsZE51bWJlciA+IDApIHsKLSAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5maW5kRmllbGRCeU51bWJlcihmaWVsZE51bWJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIGludCBmaWVsZE51bWJlciA9ICgoSW50ZXJuYWwuRW51bUxpdGUpIGludm9rZU9yRGllKGNhc2VNZXRob2RCdWlsZGVyLCBidWlsZGVyKSkuZ2V0TnVtYmVyKCk7Ci0gICAgICAgIGlmIChmaWVsZE51bWJlciA+IDApIHsKLSAgICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5maW5kRmllbGRCeU51bWJlcihmaWVsZE51bWJlcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKGZpbmFsIEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBpbnZva2VPckRpZShjbGVhck1ldGhvZCwgYnVpbGRlcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBzdXBwb3J0RmllbGRQcmVzZW5jZShGaWxlRGVzY3JpcHRvciBmaWxlKSB7Ci0gICAgICByZXR1cm4gZmlsZS5nZXRTeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvci5TeW50YXguUFJPVE8yOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2luZ3VsYXJGaWVsZEFjY2Vzc29yIGltcGxlbWVudHMgRmllbGRBY2Nlc3NvciB7Ci0gICAgICBTaW5ndWxhckZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcywKLSAgICAgICAgICBmaW5hbCBTdHJpbmcgY29udGFpbmluZ09uZW9mQ2FtZWxDYXNlTmFtZSkgewotICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIGlzT25lb2ZGaWVsZCA9IGRlc2NyaXB0b3IuZ2V0Q29udGFpbmluZ09uZW9mKCkgIT0gbnVsbDsKLSAgICAgICAgaGFzSGFzTWV0aG9kID0gc3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvci5nZXRGaWxlKCkpCi0gICAgICAgICAgICB8fCAoIWlzT25lb2ZGaWVsZCAmJiBkZXNjcmlwdG9yLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpOwotICAgICAgICBnZXRNZXRob2QgPSBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSk7Ci0gICAgICAgIGdldE1ldGhvZEJ1aWxkZXIgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSk7Ci0gICAgICAgIHR5cGUgPSBnZXRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBzZXRNZXRob2QgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJzZXQiICsgY2FtZWxDYXNlTmFtZSwgdHlwZSk7Ci0gICAgICAgIGhhc01ldGhvZCA9Ci0gICAgICAgICAgICBoYXNIYXNNZXRob2QgPyBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsICJoYXMiICsgY2FtZWxDYXNlTmFtZSkgOiBudWxsOwotICAgICAgICBoYXNNZXRob2RCdWlsZGVyID0KLSAgICAgICAgICAgIGhhc0hhc01ldGhvZCA/IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImhhcyIgKyBjYW1lbENhc2VOYW1lKSA6IG51bGw7Ci0gICAgICAgIGNsZWFyTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiY2xlYXIiICsgY2FtZWxDYXNlTmFtZSk7Ci0gICAgICAgIGNhc2VNZXRob2QgPSBpc09uZW9mRmllbGQgPyBnZXRNZXRob2RPckRpZSgKLSAgICAgICAgICAgIG1lc3NhZ2VDbGFzcywgImdldCIgKyBjb250YWluaW5nT25lb2ZDYW1lbENhc2VOYW1lICsgIkNhc2UiKSA6IG51bGw7Ci0gICAgICAgIGNhc2VNZXRob2RCdWlsZGVyID0gaXNPbmVvZkZpZWxkID8gZ2V0TWV0aG9kT3JEaWUoCi0gICAgICAgICAgICBidWlsZGVyQ2xhc3MsICJnZXQiICsgY29udGFpbmluZ09uZW9mQ2FtZWxDYXNlTmFtZSArICJDYXNlIikgOiBudWxsOwotICAgICAgfQotCi0gICAgICAvLyBOb3RlOiAgV2UgdXNlIEphdmEgcmVmbGVjdGlvbiB0byBjYWxsIHB1YmxpYyBtZXRob2RzIHJhdGhlciB0aGFuCi0gICAgICAvLyAgIGFjY2VzcyBwcml2YXRlIGZpZWxkcyBkaXJlY3RseSBhcyB0aGlzIGF2b2lkcyBydW50aW1lIHNlY3VyaXR5Ci0gICAgICAvLyAgIGNoZWNrcy4KLSAgICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzczw/PiB0eXBlOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRNZXRob2Q7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldE1ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIHNldE1ldGhvZDsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgaGFzTWV0aG9kOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBoYXNNZXRob2RCdWlsZGVyOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBjbGVhck1ldGhvZDsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgY2FzZU1ldGhvZDsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgY2FzZU1ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaXNPbmVvZkZpZWxkOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIGJvb2xlYW4gaGFzSGFzTWV0aG9kOwotCi0gICAgICBwcml2YXRlIGludCBnZXRPbmVvZkZpZWxkTnVtYmVyKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gKChJbnRlcm5hbC5FbnVtTGl0ZSkgaW52b2tlT3JEaWUoY2FzZU1ldGhvZCwgbWVzc2FnZSkpLmdldE51bWJlcigpOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGludCBnZXRPbmVvZkZpZWxkTnVtYmVyKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIHJldHVybiAoKEludGVybmFsLkVudW1MaXRlKSBpbnZva2VPckRpZShjYXNlTWV0aG9kQnVpbGRlciwgYnVpbGRlcikpLmdldE51bWJlcigpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0TWV0aG9kLCBtZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldE1ldGhvZEJ1aWxkZXIsIGJ1aWxkZXIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJhdyhmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGdldChtZXNzYWdlKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSYXcoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIGdldChidWlsZGVyKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGludm9rZU9yRGllKHNldE1ldGhvZCwgYnVpbGRlciwgdmFsdWUpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkUmF3KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZFJhdygpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRSYXcoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsIGludCBpbmRleCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgImdldFJlcGVhdGVkRmllbGRSYXcoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgInNldFJlcGVhdGVkRmllbGQoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJhZGRSZXBlYXRlZEZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKCFoYXNIYXNNZXRob2QpIHsKLSAgICAgICAgICBpZiAoaXNPbmVvZkZpZWxkKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0T25lb2ZGaWVsZE51bWJlcihtZXNzYWdlKSA9PSBmaWVsZC5nZXROdW1iZXIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuICFnZXQobWVzc2FnZSkuZXF1YWxzKGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKEJvb2xlYW4pIGludm9rZU9yRGllKGhhc01ldGhvZCwgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhcyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBpZiAoIWhhc0hhc01ldGhvZCkgewotICAgICAgICAgIGlmIChpc09uZW9mRmllbGQpIHsKLSAgICAgICAgICAgIHJldHVybiBnZXRPbmVvZkZpZWxkTnVtYmVyKGJ1aWxkZXIpID09IGZpZWxkLmdldE51bWJlcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gIWdldChidWlsZGVyKS5lcXVhbHMoZmllbGQuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiAoQm9vbGVhbikgaW52b2tlT3JEaWUoaGFzTWV0aG9kQnVpbGRlciwgYnVpbGRlcik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkU2l6ZSgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkQ291bnQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJnZXRSZXBlYXRlZEZpZWxkU2l6ZSgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBjbGVhcihmaW5hbCBCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgaW52b2tlT3JEaWUoY2xlYXJNZXRob2QsIGJ1aWxkZXIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAibmV3QnVpbGRlckZvckZpZWxkKCkgY2FsbGVkIG9uIGEgbm9uLU1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBnZXRCdWlsZGVyKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0RmllbGRCdWlsZGVyKCkgY2FsbGVkIG9uIGEgbm9uLU1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBnZXRSZXBlYXRlZEJ1aWxkZXIoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsIGludCBpbmRleCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgImdldFJlcGVhdGVkRmllbGRCdWlsZGVyKCkgY2FsbGVkIG9uIGEgbm9uLU1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgaW1wbGVtZW50cyBGaWVsZEFjY2Vzc29yIHsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzcyB0eXBlOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRNZXRob2Q7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldE1ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldFJlcGVhdGVkTWV0aG9kOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRSZXBlYXRlZE1ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIHNldFJlcGVhdGVkTWV0aG9kOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBhZGRSZXBlYXRlZE1ldGhvZDsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0Q291bnRNZXRob2Q7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldENvdW50TWV0aG9kQnVpbGRlcjsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgY2xlYXJNZXRob2Q7Ci0KLSAgICAgIFJlcGVhdGVkRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzKSB7Ci0gICAgICAgIGdldE1ldGhvZCA9IGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkxpc3QiKTsKLSAgICAgICAgZ2V0TWV0aG9kQnVpbGRlciA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkxpc3QiKTsKLSAgICAgICAgZ2V0UmVwZWF0ZWRNZXRob2QgPQotICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUsIEludGVnZXIuVFlQRSk7Ci0gICAgICAgIGdldFJlcGVhdGVkTWV0aG9kQnVpbGRlciA9Ci0gICAgICAgICAgICBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSwgSW50ZWdlci5UWVBFKTsKLSAgICAgICAgdHlwZSA9IGdldFJlcGVhdGVkTWV0aG9kLmdldFJldHVyblR5cGUoKTsKLSAgICAgICAgc2V0UmVwZWF0ZWRNZXRob2QgPQotICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAic2V0IiArIGNhbWVsQ2FzZU5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyLlRZUEUsIHR5cGUpOwotICAgICAgICBhZGRSZXBlYXRlZE1ldGhvZCA9Ci0gICAgICAgICAgICBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJhZGQiICsgY2FtZWxDYXNlTmFtZSwgdHlwZSk7Ci0gICAgICAgIGdldENvdW50TWV0aG9kID0KLSAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkNvdW50Iik7Ci0gICAgICAgIGdldENvdW50TWV0aG9kQnVpbGRlciA9Ci0gICAgICAgICAgICBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJDb3VudCIpOwotCi0gICAgICAgIGNsZWFyTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiY2xlYXIiICsgY2FtZWxDYXNlTmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRNZXRob2QsIG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0TWV0aG9kQnVpbGRlciwgYnVpbGRlcik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmF3KGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICByZXR1cm4gZ2V0KG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJhdyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICByZXR1cm4gZ2V0KGJ1aWxkZXIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gQWRkIGFsbCB0aGUgZWxlbWVudHMgaW5kaXZpZHVhbGx5LiAgVGhpcyBzZXJ2ZXMgdHdvIHB1cnBvc2VzOgotICAgICAgICAvLyAxKSBWZXJpZmllcyB0aGF0IGVhY2ggZWxlbWVudCBoYXMgdGhlIGNvcnJlY3QgdHlwZS4KLSAgICAgICAgLy8gMikgSW5zdXJlcyB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IG1vZGlmeSB0aGUgbGlzdCBsYXRlciBvbiBhbmQKLSAgICAgICAgLy8gICAgaGF2ZSB0aGUgbW9kaWZpY2F0aW9ucyBiZSByZWZsZWN0ZWQgaW4gdGhlIG1lc3NhZ2UuCi0gICAgICAgIGNsZWFyKGJ1aWxkZXIpOwotICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pIHZhbHVlKSB7Ci0gICAgICAgICAgYWRkUmVwZWF0ZWQoYnVpbGRlciwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UsIGZpbmFsIGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0UmVwZWF0ZWRNZXRob2QsIG1lc3NhZ2UsIGluZGV4KTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRSZXBlYXRlZE1ldGhvZEJ1aWxkZXIsIGJ1aWxkZXIsIGluZGV4KTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZFJhdyhHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UsIGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0UmVwZWF0ZWQobWVzc2FnZSwgaW5kZXgpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkUmF3KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGdldFJlcGVhdGVkKGJ1aWxkZXIsIGluZGV4KTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpbnZva2VPckRpZShzZXRSZXBlYXRlZE1ldGhvZCwgYnVpbGRlciwgaW5kZXgsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW52b2tlT3JEaWUoYWRkUmVwZWF0ZWRNZXRob2QsIGJ1aWxkZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgImhhc0ZpZWxkKCkgY2FsbGVkIG9uIGEgcmVwZWF0ZWQgZmllbGQuIik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhcyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgImhhc0ZpZWxkKCkgY2FsbGVkIG9uIGEgcmVwZWF0ZWQgZmllbGQuIik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSBpbnZva2VPckRpZShnZXRDb3VudE1ldGhvZCwgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICByZXR1cm4gKEludGVnZXIpIGludm9rZU9yRGllKGdldENvdW50TWV0aG9kQnVpbGRlciwgYnVpbGRlcik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGNsZWFyKGZpbmFsIEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBpbnZva2VPckRpZShjbGVhck1ldGhvZCwgYnVpbGRlcik7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJuZXdCdWlsZGVyRm9yRmllbGQoKSBjYWxsZWQgb24gYSBub24tTWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIGdldEJ1aWxkZXIoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJnZXRGaWVsZEJ1aWxkZXIoKSBjYWxsZWQgb24gYSBub24tTWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIGdldFJlcGVhdGVkQnVpbGRlcihHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoKSBjYWxsZWQgb24gYSBub24tTWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIE1hcEZpZWxkQWNjZXNzb3IgaW1wbGVtZW50cyBGaWVsZEFjY2Vzc29yIHsKLSAgICAgIE1hcEZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgewotICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3I7Ci0gICAgICAgIE1ldGhvZCBnZXREZWZhdWx0SW5zdGFuY2VNZXRob2QgPQotICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLCAiZ2V0RGVmYXVsdEluc3RhbmNlIik7Ci0gICAgICAgIE1hcEZpZWxkIGRlZmF1bHRNYXBGaWVsZCA9IGdldE1hcEZpZWxkKAotICAgICAgICAgICAgKEdlbmVyYXRlZE1lc3NhZ2UpIGludm9rZU9yRGllKGdldERlZmF1bHRJbnN0YW5jZU1ldGhvZCwgbnVsbCkpOwotICAgICAgICBtYXBFbnRyeU1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UgPQotICAgICAgICAgICAgZGVmYXVsdE1hcEZpZWxkLmdldE1hcEVudHJ5TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZDsKLSAgICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZSBtYXBFbnRyeU1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7Ci0KLSAgICAgIHByaXZhdGUgTWFwRmllbGQ8PywgPz4gZ2V0TWFwRmllbGQoR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiAoTWFwRmllbGQ8PywgPz4pIG1lc3NhZ2UuaW50ZXJuYWxHZXRNYXBGaWVsZChmaWVsZC5nZXROdW1iZXIoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgTWFwRmllbGQ8PywgPz4gZ2V0TWFwRmllbGQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIChNYXBGaWVsZDw/LCA/PikgYnVpbGRlci5pbnRlcm5hbEdldE1hcEZpZWxkKGZpZWxkLmdldE51bWJlcigpKTsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBNYXBGaWVsZDw/LCA/PiBnZXRNdXRhYmxlTWFwRmllbGQoCi0gICAgICAgICAgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIChNYXBGaWVsZDw/LCA/PikgYnVpbGRlci5pbnRlcm5hbEdldE11dGFibGVNYXBGaWVsZCgKLSAgICAgICAgICAgIGZpZWxkLmdldE51bWJlcigpKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0UmVwZWF0ZWRDb3VudChtZXNzYWdlKTsgaSsrKSB7Ci0gICAgICAgICAgcmVzdWx0LmFkZChnZXRSZXBlYXRlZChtZXNzYWdlLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0KTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZ2V0UmVwZWF0ZWRDb3VudChidWlsZGVyKTsgaSsrKSB7Ci0gICAgICAgICAgcmVzdWx0LmFkZChnZXRSZXBlYXRlZChidWlsZGVyLCBpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0KTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJhdyhHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGdldChtZXNzYWdlKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJhdyhHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICByZXR1cm4gZ2V0KGJ1aWxkZXIpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHNldChCdWlsZGVyIGJ1aWxkZXIsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBjbGVhcihidWlsZGVyKTsKLSAgICAgICAgZm9yIChPYmplY3QgZW50cnkgOiAoTGlzdCkgdmFsdWUpIHsKLSAgICAgICAgICBhZGRSZXBlYXRlZChidWlsZGVyLCBlbnRyeSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRNYXBGaWVsZChtZXNzYWdlKS5nZXRMaXN0KCkuZ2V0KGluZGV4KTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKEJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRNYXBGaWVsZChidWlsZGVyKS5nZXRMaXN0KCkuZ2V0KGluZGV4KTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkUmF3KEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBnZXRSZXBlYXRlZChtZXNzYWdlLCBpbmRleCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZFJhdyhCdWlsZGVyIGJ1aWxkZXIsIGludCBpbmRleCkgewotICAgICAgICByZXR1cm4gZ2V0UmVwZWF0ZWQoYnVpbGRlciwgaW5kZXgpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdGVkKEJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgZ2V0TXV0YWJsZU1hcEZpZWxkKGJ1aWxkZXIpLmdldE11dGFibGVMaXN0KCkuc2V0KGluZGV4LCAoTWVzc2FnZSkgdmFsdWUpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGFkZFJlcGVhdGVkKEJ1aWxkZXIgYnVpbGRlciwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGdldE11dGFibGVNYXBGaWVsZChidWlsZGVyKS5nZXRNdXRhYmxlTGlzdCgpLmFkZCgoTWVzc2FnZSkgdmFsdWUpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhcyhHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgImhhc0ZpZWxkKCkgaXMgbm90IHN1cHBvcnRlZCBmb3IgcmVwZWF0ZWQgZmllbGRzLiIpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhcyhCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICAgImhhc0ZpZWxkKCkgaXMgbm90IHN1cHBvcnRlZCBmb3IgcmVwZWF0ZWQgZmllbGRzLiIpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGdldE1hcEZpZWxkKG1lc3NhZ2UpLmdldExpc3QoKS5zaXplKCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCBnZXRSZXBlYXRlZENvdW50KEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICByZXR1cm4gZ2V0TWFwRmllbGQoYnVpbGRlcikuZ2V0TGlzdCgpLnNpemUoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBjbGVhcihCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgZ2V0TXV0YWJsZU1hcEZpZWxkKGJ1aWxkZXIpLmdldE11dGFibGVMaXN0KCkuY2xlYXIoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIG1hcEVudHJ5TWVzc2FnZURlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2UuQnVpbGRlciBnZXRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgICAiTmVzdGVkIGJ1aWxkZXIgbm90IHN1cHBvcnRlZCBmb3IgbWFwIGZpZWxkcy4iKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlLkJ1aWxkZXIgZ2V0UmVwZWF0ZWRCdWlsZGVyKEJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAgICJOZXN0ZWQgYnVpbGRlciBub3Qgc3VwcG9ydGVkIGZvciBtYXAgZmllbGRzLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ3VsYXJFbnVtRmllbGRBY2Nlc3NvcgotICAgICAgICBleHRlbmRzIFNpbmd1bGFyRmllbGRBY2Nlc3NvciB7Ci0gICAgICBTaW5ndWxhckVudW1GaWVsZEFjY2Vzc29yKAotICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MsCi0gICAgICAgICAgZmluYWwgU3RyaW5nIGNvbnRhaW5pbmdPbmVvZkNhbWVsQ2FzZU5hbWUpIHsKLSAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MsIGNvbnRhaW5pbmdPbmVvZkNhbWVsQ2FzZU5hbWUpOwotCi0gICAgICAgIGVudW1EZXNjcmlwdG9yID0gZGVzY3JpcHRvci5nZXRFbnVtVHlwZSgpOwotCi0gICAgICAgIHZhbHVlT2ZNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAidmFsdWVPZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKLSAgICAgICAgZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kID0KLSAgICAgICAgICBnZXRNZXRob2RPckRpZSh0eXBlLCAiZ2V0VmFsdWVEZXNjcmlwdG9yIik7Ci0KLSAgICAgICAgc3VwcG9ydFVua25vd25FbnVtVmFsdWUgPSBkZXNjcmlwdG9yLmdldEZpbGUoKS5zdXBwb3J0c1Vua25vd25FbnVtVmFsdWUoKTsKLSAgICAgICAgaWYgKHN1cHBvcnRVbmtub3duRW51bVZhbHVlKSB7Ci0gICAgICAgICAgZ2V0VmFsdWVNZXRob2QgPQotICAgICAgICAgICAgICBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJWYWx1ZSIpOwotICAgICAgICAgIGdldFZhbHVlTWV0aG9kQnVpbGRlciA9Ci0gICAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIlZhbHVlIik7Ci0gICAgICAgICAgc2V0VmFsdWVNZXRob2QgPQotICAgICAgICAgICAgICBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJzZXQiICsgY2FtZWxDYXNlTmFtZSArICJWYWx1ZSIsIGludC5jbGFzcyk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvcjsKLQotICAgICAgcHJpdmF0ZSBNZXRob2QgdmFsdWVPZk1ldGhvZDsKLSAgICAgIHByaXZhdGUgTWV0aG9kIGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZDsKLQotICAgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRVbmtub3duRW51bVZhbHVlOwotICAgICAgcHJpdmF0ZSBNZXRob2QgZ2V0VmFsdWVNZXRob2Q7Ci0gICAgICBwcml2YXRlIE1ldGhvZCBnZXRWYWx1ZU1ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcml2YXRlIE1ldGhvZCBzZXRWYWx1ZU1ldGhvZDsKLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKHN1cHBvcnRVbmtub3duRW51bVZhbHVlKSB7Ci0gICAgICAgICAgaW50IHZhbHVlID0gKEludGVnZXIpIGludm9rZU9yRGllKGdldFZhbHVlTWV0aG9kLCBtZXNzYWdlKTsKLSAgICAgICAgICByZXR1cm4gZW51bURlc2NyaXB0b3IuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgc3VwZXIuZ2V0KG1lc3NhZ2UpKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICBpZiAoc3VwcG9ydFVua25vd25FbnVtVmFsdWUpIHsKLSAgICAgICAgICBpbnQgdmFsdWUgPSAoSW50ZWdlcikgaW52b2tlT3JEaWUoZ2V0VmFsdWVNZXRob2RCdWlsZGVyLCBidWlsZGVyKTsKLSAgICAgICAgICByZXR1cm4gZW51bURlc2NyaXB0b3IuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgc3VwZXIuZ2V0KGJ1aWxkZXIpKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHN1cHBvcnRVbmtub3duRW51bVZhbHVlKSB7Ci0gICAgICAgICAgaW52b2tlT3JEaWUoc2V0VmFsdWVNZXRob2QsIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICgoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpLmdldE51bWJlcigpKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0KGJ1aWxkZXIsIGludm9rZU9yRGllKHZhbHVlT2ZNZXRob2QsIG51bGwsIHZhbHVlKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVwZWF0ZWRFbnVtRmllbGRBY2Nlc3NvcgotICAgICAgICBleHRlbmRzIFJlcGVhdGVkRmllbGRBY2Nlc3NvciB7Ci0gICAgICBSZXBlYXRlZEVudW1GaWVsZEFjY2Vzc29yKAotICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKLSAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOwotCi0gICAgICAgIGVudW1EZXNjcmlwdG9yID0gZGVzY3JpcHRvci5nZXRFbnVtVHlwZSgpOwotCi0gICAgICAgIHZhbHVlT2ZNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAidmFsdWVPZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKLSAgICAgICAgZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kID0KLSAgICAgICAgICBnZXRNZXRob2RPckRpZSh0eXBlLCAiZ2V0VmFsdWVEZXNjcmlwdG9yIik7Ci0KLSAgICAgICAgc3VwcG9ydFVua25vd25FbnVtVmFsdWUgPSBkZXNjcmlwdG9yLmdldEZpbGUoKS5zdXBwb3J0c1Vua25vd25FbnVtVmFsdWUoKTsKLSAgICAgICAgaWYgKHN1cHBvcnRVbmtub3duRW51bVZhbHVlKSB7Ci0gICAgICAgICAgZ2V0UmVwZWF0ZWRWYWx1ZU1ldGhvZCA9Ci0gICAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIlZhbHVlIiwgaW50LmNsYXNzKTsKLSAgICAgICAgICBnZXRSZXBlYXRlZFZhbHVlTWV0aG9kQnVpbGRlciA9Ci0gICAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIlZhbHVlIiwgaW50LmNsYXNzKTsKLSAgICAgICAgICBzZXRSZXBlYXRlZFZhbHVlTWV0aG9kID0KLSAgICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAic2V0IiArIGNhbWVsQ2FzZU5hbWUgKyAiVmFsdWUiLCBpbnQuY2xhc3MsIGludC5jbGFzcyk7Ci0gICAgICAgICAgYWRkUmVwZWF0ZWRWYWx1ZU1ldGhvZCA9Ci0gICAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImFkZCIgKyBjYW1lbENhc2VOYW1lICsgIlZhbHVlIiwgaW50LmNsYXNzKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvcjsKLQotICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgdmFsdWVPZk1ldGhvZDsKLSAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZDsKLQotICAgICAgcHJpdmF0ZSBib29sZWFuIHN1cHBvcnRVbmtub3duRW51bVZhbHVlOwotICAgICAgcHJpdmF0ZSBNZXRob2QgZ2V0UmVwZWF0ZWRWYWx1ZU1ldGhvZDsKLSAgICAgIHByaXZhdGUgTWV0aG9kIGdldFJlcGVhdGVkVmFsdWVNZXRob2RCdWlsZGVyOwotICAgICAgcHJpdmF0ZSBNZXRob2Qgc2V0UmVwZWF0ZWRWYWx1ZU1ldGhvZDsKLSAgICAgIHByaXZhdGUgTWV0aG9kIGFkZFJlcGVhdGVkVmFsdWVNZXRob2Q7Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGdldFJlcGVhdGVkQ291bnQobWVzc2FnZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgbmV3TGlzdC5hZGQoZ2V0UmVwZWF0ZWQobWVzc2FnZSwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ld0xpc3QpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmaW5hbCBpbnQgc2l6ZSA9IGdldFJlcGVhdGVkQ291bnQoYnVpbGRlcik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgbmV3TGlzdC5hZGQoZ2V0UmVwZWF0ZWQoYnVpbGRlciwgaSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ld0xpc3QpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHN1cHBvcnRVbmtub3duRW51bVZhbHVlKSB7Ci0gICAgICAgICAgaW50IHZhbHVlID0gKEludGVnZXIpIGludm9rZU9yRGllKGdldFJlcGVhdGVkVmFsdWVNZXRob2QsIG1lc3NhZ2UsIGluZGV4KTsKLSAgICAgICAgICByZXR1cm4gZW51bURlc2NyaXB0b3IuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwKLSAgICAgICAgICBzdXBlci5nZXRSZXBlYXRlZChtZXNzYWdlLCBpbmRleCkpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHN1cHBvcnRVbmtub3duRW51bVZhbHVlKSB7Ci0gICAgICAgICAgaW50IHZhbHVlID0gKEludGVnZXIpIGludm9rZU9yRGllKGdldFJlcGVhdGVkVmFsdWVNZXRob2RCdWlsZGVyLCBidWlsZGVyLCBpbmRleCk7Ci0gICAgICAgICAgcmV0dXJuIGVudW1EZXNjcmlwdG9yLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24odmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2QsCi0gICAgICAgICAgc3VwZXIuZ2V0UmVwZWF0ZWQoYnVpbGRlciwgaW5kZXgpKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHN1cHBvcnRVbmtub3duRW51bVZhbHVlKSB7Ci0gICAgICAgICAgaW52b2tlT3JEaWUoc2V0UmVwZWF0ZWRWYWx1ZU1ldGhvZCwgYnVpbGRlciwgaW5kZXgsCi0gICAgICAgICAgICAgICgoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpLmdldE51bWJlcigpKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuc2V0UmVwZWF0ZWQoYnVpbGRlciwgaW5kZXgsIGludm9rZU9yRGllKHZhbHVlT2ZNZXRob2QsIG51bGwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGFkZFJlcGVhdGVkKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChzdXBwb3J0VW5rbm93bkVudW1WYWx1ZSkgewotICAgICAgICAgIGludm9rZU9yRGllKGFkZFJlcGVhdGVkVmFsdWVNZXRob2QsIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICgoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpLmdldE51bWJlcigpKTsKLSAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIuYWRkUmVwZWF0ZWQoYnVpbGRlciwgaW52b2tlT3JEaWUodmFsdWVPZk1ldGhvZCwgbnVsbCwgdmFsdWUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEZpZWxkIGFjY2Vzc29yIGZvciBzdHJpbmcgZmllbGRzLgotICAgICAqCi0gICAgICogPHA+VGhpcyBjbGFzcyBtYWtlcyBnZXRGb29CeXRlcygpIGFuZCBzZXRGb29CeXRlcygpIGF2YWlsYWJsZSBmb3IKLSAgICAgKiByZWZsZWN0aW9uIEFQSSBzbyB0aGF0IHJlZmxlY3Rpb24gYmFzZWQgc2VyaWFsaXplL3BhcnNlIGZ1bmN0aW9ucyBjYW4KLSAgICAgKiBhY2Nlc3MgdGhlIHJhdyBieXRlcyBvZiB0aGUgZmllbGQgdG8gcHJlc2VydmUgbm9uLVVURjggYnl0ZXMgaW4gdGhlCi0gICAgICogc3RyaW5nLgotICAgICAqCi0gICAgICogPHA+VGhpcyBlbnN1cmVzIHRoZSBzZXJpYWxpemUvcGFyc2Ugcm91bmQtdHJpcCBzYWZldHksIHdoaWNoIGlzIGltcG9ydGFudAotICAgICAqIGZvciBzZXJ2ZXJzIHdoaWNoIGZvcndhcmQgbWVzc2FnZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ3VsYXJTdHJpbmdGaWVsZEFjY2Vzc29yCi0gICAgICAgIGV4dGVuZHMgU2luZ3VsYXJGaWVsZEFjY2Vzc29yIHsKLSAgICAgIFNpbmd1bGFyU3RyaW5nRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzLAotICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250YWluaW5nT25lb2ZDYW1lbENhc2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGNhbWVsQ2FzZU5hbWUsIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzLAotICAgICAgICAgICAgY29udGFpbmluZ09uZW9mQ2FtZWxDYXNlTmFtZSk7Ci0gICAgICAgIGdldEJ5dGVzTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLAotICAgICAgICAgICAgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkJ5dGVzIik7Ci0gICAgICAgIGdldEJ5dGVzTWV0aG9kQnVpbGRlciA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywKLSAgICAgICAgICAgICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJCeXRlcyIpOwotICAgICAgICBzZXRCeXRlc01ldGhvZEJ1aWxkZXIgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsCi0gICAgICAgICAgICAic2V0IiArIGNhbWVsQ2FzZU5hbWUgKyAiQnl0ZXMiLCBCeXRlU3RyaW5nLmNsYXNzKTsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZ2V0Qnl0ZXNNZXRob2Q7Ci0gICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBnZXRCeXRlc01ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBzZXRCeXRlc01ldGhvZEJ1aWxkZXI7Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSYXcoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRCeXRlc01ldGhvZCwgbWVzc2FnZSk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSYXcoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldEJ5dGVzTWV0aG9kQnVpbGRlciwgYnVpbGRlcik7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgQnl0ZVN0cmluZykgewotICAgICAgICAgIGludm9rZU9yRGllKHNldEJ5dGVzTWV0aG9kQnVpbGRlciwgYnVpbGRlciwgdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN1cGVyLnNldChidWlsZGVyLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNpbmd1bGFyTWVzc2FnZUZpZWxkQWNjZXNzb3IKLSAgICAgICAgZXh0ZW5kcyBTaW5ndWxhckZpZWxkQWNjZXNzb3IgewotICAgICAgU2luZ3VsYXJNZXNzYWdlRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzLAotICAgICAgICAgIGZpbmFsIFN0cmluZyBjb250YWluaW5nT25lb2ZDYW1lbENhc2VOYW1lKSB7Ci0gICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGNhbWVsQ2FzZU5hbWUsIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzLAotICAgICAgICAgICAgY29udGFpbmluZ09uZW9mQ2FtZWxDYXNlTmFtZSk7Ci0KLSAgICAgICAgbmV3QnVpbGRlck1ldGhvZCA9IGdldE1ldGhvZE9yRGllKHR5cGUsICJuZXdCdWlsZGVyIik7Ci0gICAgICAgIGdldEJ1aWxkZXJNZXRob2RCdWlsZGVyID0KLSAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkJ1aWxkZXIiKTsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbmV3QnVpbGRlck1ldGhvZDsKLSAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGdldEJ1aWxkZXJNZXRob2RCdWlsZGVyOwotCi0gICAgICBwcml2YXRlIE9iamVjdCBjb2VyY2VUeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAodHlwZS5pc0luc3RhbmNlKHZhbHVlKSkgewotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBUaGUgdmFsdWUgaXMgbm90IHRoZSBleGFjdCByaWdodCBtZXNzYWdlIHR5cGUuICBIb3dldmVyLCBpZiBpdAotICAgICAgICAgIC8vIGlzIGFuIGFsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzYW1lIHR5cGUgLS0gZS5nLiBhCi0gICAgICAgICAgLy8gRHluYW1pY01lc3NhZ2UgLS0gd2Ugc2hvdWxkIGFjY2VwdCBpdC4gIEluIHRoaXMgY2FzZSB3ZSBjYW4gbWFrZQotICAgICAgICAgIC8vIGEgY29weSBvZiB0aGUgbWVzc2FnZS4KLSAgICAgICAgICByZXR1cm4gKChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKG5ld0J1aWxkZXJNZXRob2QsIG51bGwpKQotICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgdmFsdWUpLmJ1aWxkUGFydGlhbCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLnNldChidWlsZGVyLCBjb2VyY2VUeXBlKHZhbHVlKSk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKG5ld0J1aWxkZXJNZXRob2QsIG51bGwpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIGdldEJ1aWxkZXIoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKGdldEJ1aWxkZXJNZXRob2RCdWlsZGVyLCBidWlsZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEFjY2Vzc29yCi0gICAgICAgIGV4dGVuZHMgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIHsKLSAgICAgIFJlcGVhdGVkTWVzc2FnZUZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgewotICAgICAgICBzdXBlcihkZXNjcmlwdG9yLCBjYW1lbENhc2VOYW1lLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7Ci0KLSAgICAgICAgbmV3QnVpbGRlck1ldGhvZCA9IGdldE1ldGhvZE9yRGllKHR5cGUsICJuZXdCdWlsZGVyIik7Ci0gICAgICAgIGdldEJ1aWxkZXJNZXRob2RCdWlsZGVyID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLAotICAgICAgICAgICAgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkJ1aWxkZXIiLCBJbnRlZ2VyLlRZUEUpOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBuZXdCdWlsZGVyTWV0aG9kOwotICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgZ2V0QnVpbGRlck1ldGhvZEJ1aWxkZXI7Ci0KLSAgICAgIHByaXZhdGUgT2JqZWN0IGNvZXJjZVR5cGUoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh0eXBlLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBub3QgdGhlIGV4YWN0IHJpZ2h0IG1lc3NhZ2UgdHlwZS4gIEhvd2V2ZXIsIGlmIGl0Ci0gICAgICAgICAgLy8gaXMgYW4gYWx0ZXJuYXRpdmUgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNhbWUgdHlwZSAtLSBlLmcuIGEKLSAgICAgICAgICAvLyBEeW5hbWljTWVzc2FnZSAtLSB3ZSBzaG91bGQgYWNjZXB0IGl0LiAgSW4gdGhpcyBjYXNlIHdlIGNhbiBtYWtlCi0gICAgICAgICAgLy8gYSBjb3B5IG9mIHRoZSBtZXNzYWdlLgotICAgICAgICAgIHJldHVybiAoKE1lc3NhZ2UuQnVpbGRlcikgaW52b2tlT3JEaWUobmV3QnVpbGRlck1ldGhvZCwgbnVsbCkpCi0gICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKChNZXNzYWdlKSB2YWx1ZSkuYnVpbGQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdGVkKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLnNldFJlcGVhdGVkKGJ1aWxkZXIsIGluZGV4LCBjb2VyY2VUeXBlKHZhbHVlKSk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIGFkZFJlcGVhdGVkKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLmFkZFJlcGVhdGVkKGJ1aWxkZXIsIGNvZXJjZVR5cGUodmFsdWUpKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyKCkgewotICAgICAgICByZXR1cm4gKE1lc3NhZ2UuQnVpbGRlcikgaW52b2tlT3JEaWUobmV3QnVpbGRlck1ldGhvZCwgbnVsbCk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgZ2V0UmVwZWF0ZWRCdWlsZGVyKAotICAgICAgICAgIGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLCBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKAotICAgICAgICAgICAgZ2V0QnVpbGRlck1ldGhvZEJ1aWxkZXIsIGJ1aWxkZXIsIGluZGV4KTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVwbGFjZXMgdGhpcyBvYmplY3QgaW4gdGhlIG91dHB1dCBzdHJlYW0gd2l0aCBhIHNlcmlhbGl6ZWQgZm9ybS4KLSAgICogUGFydCBvZiBKYXZhJ3Mgc2VyaWFsaXphdGlvbiBtYWdpYy4gIEdlbmVyYXRlZCBzdWItY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0gICAqIHRoaXMgbWV0aG9kIGJ5IGNhbGxpbmcge0Bjb2RlIHJldHVybiBzdXBlci53cml0ZVJlcGxhY2UoKTt9Ci0gICAqIEByZXR1cm4gYSBTZXJpYWxpemVkRm9ybSBvZiB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3Qgd3JpdGVSZXBsYWNlKCkgdGhyb3dzIE9iamVjdFN0cmVhbUV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5TZXJpYWxpemVkRm9ybSh0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgdGhhdCB0aGUge0BsaW5rIEV4dGVuc2lvbn0gaXMgbm9uLUxpdGUgYW5kIHJldHVybnMgaXQgYXMgYQotICAgKiB7QGxpbmsgR2VuZXJhdGVkRXh0ZW5zaW9ufS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIDxNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPE1lc3NhZ2VUeXBlPiwgVD4KLSAgICBFeHRlbnNpb248TWVzc2FnZVR5cGUsIFQ+IGNoZWNrTm90TGl0ZSgKLSAgICAgICAgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgVD4gZXh0ZW5zaW9uKSB7Ci0gICAgaWYgKGV4dGVuc2lvbi5pc0xpdGUoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRXhwZWN0ZWQgbm9uLWxpdGUgZXh0ZW5zaW9uLiIpOwotICAgIH0KLQotICAgIHJldHVybiAoRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUPikgZXh0ZW5zaW9uOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIGludCBjb21wdXRlU3RyaW5nU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVTdHJpbmdTaXplKGZpZWxkTnVtYmVyLCAoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlQnl0ZXNTaXplKGZpZWxkTnVtYmVyLCAoQnl0ZVN0cmluZykgdmFsdWUpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgY29tcHV0ZVN0cmluZ1NpemVOb1RhZyhmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlU3RyaW5nU2l6ZU5vVGFnKChTdHJpbmcpIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVCeXRlc1NpemVOb1RhZygoQnl0ZVN0cmluZykgdmFsdWUpOwotICAgIH0KLSAgfQotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyB2b2lkIHdyaXRlU3RyaW5nKAotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0LCBmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIG91dHB1dC53cml0ZVN0cmluZyhmaWVsZE51bWJlciwgKFN0cmluZykgdmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRwdXQud3JpdGVCeXRlcyhmaWVsZE51bWJlciwgKEJ5dGVTdHJpbmcpIHZhbHVlKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgdm9pZCB3cml0ZVN0cmluZ05vVGFnKAotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0LCBmaW5hbCBPYmplY3QgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICBvdXRwdXQud3JpdGVTdHJpbmdOb1RhZygoU3RyaW5nKSB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG91dHB1dC53cml0ZUJ5dGVzTm9UYWcoKEJ5dGVTdHJpbmcpIHZhbHVlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZUxpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZUxpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzVhZGM1YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VMaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjQyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlci5MaW1pdGVkSW5wdXRTdHJlYW07Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5FcXVhbHNWaXNpdG9yLk5vdEVxdWFsc0V4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkJvb2xlYW5MaXN0OwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRG91YmxlTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkZsb2F0TGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkludExpc3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5Mb25nTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLlByb3RvYnVmTGlzdDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLldpcmVGb3JtYXQuRmllbGRUeXBlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIExpdGUgdmVyc2lvbiBvZiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPAotICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGU8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPiwKLSAgICBCdWlsZGVyVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkJ1aWxkZXI8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPj4gCi0gICAgICAgIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZTxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+IHsKLQotICAvKiogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiBMYXppbHkgaW5pdGlhbGl6ZWQgdG8gcmVkdWNlIGFsbG9jYXRpb25zLiAqLwotICBwcm90ZWN0ZWQgVW5rbm93bkZpZWxkU2V0TGl0ZSB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0TGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgCi0gIC8qKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICAqLwotICBwcm90ZWN0ZWQgaW50IG1lbW9pemVkU2VyaWFsaXplZFNpemUgPSAtMTsKLSAgCi0gIEBPdmVycmlkZQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gR3VhcmFudGVlZCBieSBydW50aW1lLgotICBwdWJsaWMgZmluYWwgUGFyc2VyPE1lc3NhZ2VUeXBlPiBnZXRQYXJzZXJGb3JUeXBlKCkgewotICAgIHJldHVybiAoUGFyc2VyPE1lc3NhZ2VUeXBlPikgZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5HRVRfUEFSU0VSKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gR3VhcmFudGVlZCBieSBydW50aW1lLgotICBwdWJsaWMgZmluYWwgTWVzc2FnZVR5cGUgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gKE1lc3NhZ2VUeXBlKSBkeW5hbWljTWV0aG9kKE1ldGhvZFRvSW52b2tlLkdFVF9ERUZBVUxUX0lOU1RBTkNFKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gR3VhcmFudGVlZCBieSBydW50aW1lLgotICBwdWJsaWMgZmluYWwgQnVpbGRlclR5cGUgbmV3QnVpbGRlckZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5ORVdfQlVJTERFUik7Ci0gIH0KLQotICAvKioKLSAgICogQSByZWZsZWN0aXZlIHRvU3RyaW5nIGZ1bmN0aW9uLiBUaGlzIGlzIHByaW1hcmlseSBpbnRlbmRlZCBhcyBhIGRldmVsb3BlciBhaWQsIHdoaWxlIGtlZXBpbmcKLSAgICogYmluYXJ5IHNpemUgZG93bi4gVGhlIGZpcnN0IGxpbmUgb2YgdGhlIHtAY29kZSB0b1N0cmluZygpfSByZXByZXNlbnRhdGlvbiBpbmNsdWRlcyBhIGNvbW1lbnRlZAotICAgKiB2ZXJzaW9uIG9mIHtAY29kZSBzdXBlci50b1N0cmluZygpfSB0byBhY3QgYXMgYW4gaW5kaWNhdG9yIHRoYXQgdGhpcyBzaG91bGQgbm90IGJlIHJlbGllZCBvbgotICAgKiBmb3IgY29tcGFyaXNvbnMuCi0gICAqIDxwPgotICAgKiBOT1RFOiBUaGlzIG1ldGhvZCByZWxpZXMgb24gdGhlIGZpZWxkIGdldHRlciBtZXRob2RzIG5vdCBiZWluZyBzdHJpcHBlZCBvciByZW5hbWVkIGJ5IHByb2d1YXJkLgotICAgKiBJZiB0aGV5IGFyZSwgdGhlIGZpZWxkcyB3aWxsIG5vdCBiZSBpbmNsdWRlZCBpbiB0aGUgcmV0dXJuZWQgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAgKiA8cD4KLSAgICogTk9URTogVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBsaWFibGUgdG8gY2hhbmdlIGluIHRoZSBmdXR1cmUsIGFuZCBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBpbgotICAgKiBjb2RlLgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VMaXRlVG9TdHJpbmcudG9TdHJpbmcodGhpcywgc3VwZXIudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgLy8gR3VhcmFudGVlZCBieSBydW50aW1lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIGlmIChtZW1vaXplZEhhc2hDb2RlID09IDApIHsKLSAgICAgIEhhc2hDb2RlVmlzaXRvciB2aXNpdG9yID0gbmV3IEhhc2hDb2RlVmlzaXRvcigpOwotICAgICAgdmlzaXQodmlzaXRvciwgKE1lc3NhZ2VUeXBlKSB0aGlzKTsKLSAgICAgIG1lbW9pemVkSGFzaENvZGUgPSB2aXNpdG9yLmhhc2hDb2RlOwotICAgIH0KLSAgICByZXR1cm4gbWVtb2l6ZWRIYXNoQ29kZTsKLSAgfQotICAKLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIEd1YXJhbnRlZWQgYnkgcnVudGltZQotICBpbnQgaGFzaENvZGUoSGFzaENvZGVWaXNpdG9yIHZpc2l0b3IpIHsKLSAgICBpZiAobWVtb2l6ZWRIYXNoQ29kZSA9PSAwKSB7Ci0gICAgICBpbnQgaW5Qcm9ncmVzc0hhc2hDb2RlID0gdmlzaXRvci5oYXNoQ29kZTsKLSAgICAgIHZpc2l0b3IuaGFzaENvZGUgPSAwOwotICAgICAgdmlzaXQodmlzaXRvciwgKE1lc3NhZ2VUeXBlKSB0aGlzKTsKLSAgICAgIG1lbW9pemVkSGFzaENvZGUgPSB2aXNpdG9yLmhhc2hDb2RlOwotICAgICAgdmlzaXRvci5oYXNoQ29kZSA9IGluUHJvZ3Jlc3NIYXNoQ29kZTsKLSAgICB9Ci0gICAgcmV0dXJuIG1lbW9pemVkSGFzaENvZGU7Ci0gIH0KLSAgCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBHdWFyYW50ZWVkIGJ5IGlzSW5zdGFuY2UgKyBydW50aW1lCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0gICAgaWYgKHRoaXMgPT0gb3RoZXIpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAoIWdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKS5nZXRDbGFzcygpLmlzSW5zdGFuY2Uob3RoZXIpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICB2aXNpdChFcXVhbHNWaXNpdG9yLklOU1RBTkNFLCAoTWVzc2FnZVR5cGUpIG90aGVyKTsKLSAgICB9IGNhdGNoIChOb3RFcXVhbHNFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNhbWUgYXMge0BsaW5rICNlcXVhbHMoT2JqZWN0KX0gYnV0IHRocm93cyB7QGNvZGUgTm90RXF1YWxzRXhjZXB0aW9ufS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBHdWFyYW50ZWVkIGJ5IGlzSW5zdGFuY2UgKyBydW50aW1lCi0gIGJvb2xlYW4gZXF1YWxzKEVxdWFsc1Zpc2l0b3IgdmlzaXRvciwgTWVzc2FnZUxpdGUgb3RoZXIpIHsKLSAgICBpZiAodGhpcyA9PSBvdGhlcikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIAotICAgIGlmICghZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpLmdldENsYXNzKCkuaXNJbnN0YW5jZShvdGhlcikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2aXNpdCh2aXNpdG9yLCAoTWVzc2FnZVR5cGUpIG90aGVyKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLy8gVGhlIGdlbmVyYWwgc3RyYXRlZ3kgZm9yIHVua25vd24gZmllbGRzIGlzIHRvIHVzZSBhbiBVbmtub3duRmllbGRTZXRMaXRlIHRoYXQgaXMgdHJlYXRlZCBhcwotICAvLyBtdXRhYmxlIGR1cmluZyB0aGUgcGFyc2luZyBjb25zdHJ1Y3RvciBhbmQgaW1tdXRhYmxlIGFmdGVyLiBUaGlzIGFsbG93cyB1cyB0byBhdm9pZAotICAvLyBhbnkgdW5uZWNlc3NhcnkgaW50ZXJtZWRpYXJ5IGFsbG9jYXRpb25zIHdoaWxlIHJlZHVjaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSBzaXplLgotCi0gIC8qKgotICAgKiBMYXppbHkgaW5pdGlhbGl6ZXMgdW5rbm93biBmaWVsZHMuCi0gICAqLwotICBwcml2YXRlIGZpbmFsIHZvaWQgZW5zdXJlVW5rbm93bkZpZWxkc0luaXRpYWxpemVkKCkgewotICAgIGlmICh1bmtub3duRmllbGRzID09IFVua25vd25GaWVsZFNldExpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHsKLSAgICAgIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXRMaXRlLm5ld0luc3RhbmNlKCk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZC4gRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LgotICAgKiAKLSAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICovCi0gIHByb3RlY3RlZCBib29sZWFuIHBhcnNlVW5rbm93bkZpZWxkKGludCB0YWcsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgLy8gVGhpcyB3aWxsIGF2b2lkIHRoZSBhbGxvY2F0aW9uIG9mIHVua25vd24gZmllbGRzIHdoZW4gYSBncm91cCB0YWcgaXMgZW5jb3VudGVyZWQuCi0gICAgaWYgKFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKSA9PSBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBlbnN1cmVVbmtub3duRmllbGRzSW5pdGlhbGl6ZWQoKTsKLSAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkLiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBtZXJnZVZhcmludEZpZWxkKGludCB0YWcsIGludCB2YWx1ZSkgewotICAgIGVuc3VyZVVua25vd25GaWVsZHNJbml0aWFsaXplZCgpOwotICAgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCh0YWcsIHZhbHVlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQuIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICovCi0gIHByb3RlY3RlZCB2b2lkIG1lcmdlTGVuZ3RoRGVsaW1pdGVkRmllbGQoaW50IGZpZWxkTnVtYmVyLCBCeXRlU3RyaW5nIHZhbHVlKSB7Ci0gICAgZW5zdXJlVW5rbm93bkZpZWxkc0luaXRpYWxpemVkKCk7Ci0gICAgdW5rbm93bkZpZWxkcy5tZXJnZUxlbmd0aERlbGltaXRlZEZpZWxkKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBjb21wbGV0ZSBwYXJzaW5nLiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9pZCBtYWtlSW1tdXRhYmxlKCkgewotICAgIGR5bmFtaWNNZXRob2QoTWV0aG9kVG9JbnZva2UuTUFLRV9JTU1VVEFCTEUpOwotCi0gICAgdW5rbm93bkZpZWxkcy5tYWtlSW1tdXRhYmxlKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICByZXR1cm4gZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5JU19JTklUSUFMSVpFRCwgQm9vbGVhbi5UUlVFKSAhPSBudWxsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBCdWlsZGVyVHlwZSB0b0J1aWxkZXIoKSB7Ci0gICAgQnVpbGRlclR5cGUgYnVpbGRlciA9IChCdWlsZGVyVHlwZSkgZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5ORVdfQlVJTERFUik7Ci0gICAgYnVpbGRlci5tZXJnZUZyb20oKE1lc3NhZ2VUeXBlKSB0aGlzKTsKLSAgICByZXR1cm4gYnVpbGRlcjsKLSAgfQotCi0gIC8qKgotICAgKiBEZWZpbmVzIHdoaWNoIG1ldGhvZCBwYXRoIHRvIGludm9rZSBpbiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZUxpdGUKLSAgICogI2R5bmFtaWNNZXRob2QoTWV0aG9kVG9JbnZva2UsIE9iamVjdC4uLil9LgotICAgKiA8cD4KLSAgICogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBlbnVtIE1ldGhvZFRvSW52b2tlIHsKLSAgICAvLyBSZWx5IG9uL21vZGlmeSBpbnN0YW5jZSBzdGF0ZQotICAgIElTX0lOSVRJQUxJWkVELAotICAgIFZJU0lULAotICAgIE1FUkdFX0ZST01fU1RSRUFNLAotICAgIE1BS0VfSU1NVVRBQkxFLAotCi0gICAgLy8gUmVseSBvbiBzdGF0aWMgc3RhdGUKLSAgICBORVdfTVVUQUJMRV9JTlNUQU5DRSwKLSAgICBORVdfQlVJTERFUiwKLSAgICBHRVRfREVGQVVMVF9JTlNUQU5DRSwKLSAgICBHRVRfUEFSU0VSOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgbWV0aG9kIHRoYXQgaW1wbGVtZW50cyBkaWZmZXJlbnQgdHlwZXMgb2Ygb3BlcmF0aW9ucyBkZXNjcmliZWQgaW4ge0BsaW5rIE1ldGhvZFRvSW52b2tlfS4KLSAgICogVGhlc2VzIGRpZmZlcmVudCBraW5kcyBvZiBvcGVyYXRpb25zIGFyZSByZXF1aXJlZCB0byBpbXBsZW1lbnQgbWVzc2FnZS1sZXZlbCBvcGVyYXRpb25zIGZvcgotICAgKiBidWlsZGVycyBpbiB0aGUgcnVudGltZS4gVGhpcyBtZXRob2QgYnVuZGxlcyB0aG9zZSBvcGVyYXRpb25zIHRvIHJlZHVjZSB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMKLSAgICogY291bnQuCi0gICAqIDx1bD4KLSAgICogPGxpPntAY29kZSBNRVJHRV9GUk9NX1NUUkVBTX0gaXMgcGFyYW1ldGVyaXplZCB3aXRoIGFuIHtAbGluayBDb2RlZElucHV0U3RyZWFtfSBhbmQKLSAgICoge0BsaW5rIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZX0uIEl0IGNvbnN1bWVzIHRoZSBpbnB1dCBzdHJlYW0sIHBhcnNpbmcgdGhlIGNvbnRlbnRzIGludG8gdGhlCi0gICAqIHJldHVybmVkIHByb3RvY29sIGJ1ZmZlci4gSWYgcGFyc2luZyB0aHJvd3MgYW4ge0BsaW5rIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0sIHRoZQotICAgKiBpbXBsZW1lbnRhdGlvbiB3cmFwcyBpdCBpbiBhIFJ1bnRpbWVFeGNlcHRpb24uCi0gICAqIDxsaT57QGNvZGUgTkVXX0lOU1RBTkNFfSByZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBwcm90b2NvbCBidWZmZXIgdGhhdCBoYXMgbm90IHlldCBiZWVuCi0gICAqIG1hZGUgaW1tdXRhYmxlLiBTZWUge0Bjb2RlIE1BS0VfSU1NVVRBQkxFfS4KLSAgICogPGxpPntAY29kZSBJU19JTklUSUFMSVpFRH0gaXMgcGFyYW1ldGVyaXplZCB3aXRoIGEge0Bjb2RlIEJvb2xlYW59IGRldGFpbGluZyB3aGV0aGVyIHRvCi0gICAqIG1lbW9pemUuIEl0IHJldHVybnMge0Bjb2RlIG51bGx9IGZvciBmYWxzZSBhbmQgdGhlIGRlZmF1bHQgaW5zdGFuY2UgZm9yIHRydWUuIFdlIG9wdGlvbmFsbHkKLSAgICogbWVtb2l6ZSB0byBzdXBwb3J0IHRoZSBCdWlsZGVyIGNhc2UsIHdoZXJlIG1lbW9pemF0aW9uIGlzIG5vdCBkZXNpcmVkLgotICAgKiA8bGk+e0Bjb2RlIE5FV19CVUlMREVSfSByZXR1cm5zIGEge0Bjb2RlIEJ1aWxkZXJUeXBlfSBpbnN0YW5jZS4KLSAgICogPGxpPntAY29kZSBWSVNJVH0gaXMgcGFyYW1ldGVyaXplZCB3aXRoIGEge0Bjb2RlIFZpc2l0b3J9IGFuZCBhIHtAY29kZSBNZXNzYWdlVHlwZX0gYW5kCi0gICAqIHJlY3Vyc2l2ZWx5IGl0ZXJhdGVzIHRocm91Z2ggdGhlIGZpZWxkcyBzaWRlIGJ5IHNpZGUgYmV0d2VlbiB0aGlzIGFuZCB0aGUgaW5zdGFuY2UuCi0gICAqIDxsaT57QGNvZGUgTUFLRV9JTU1VVEFCTEV9IHNldHMgYWxsIGludGVybmFsIGZpZWxkcyB0byBhbiBpbW11dGFibGUgc3RhdGUuCi0gICAqIDwvdWw+Ci0gICAqIFRoaXMgbWV0aG9kLCBwbHVzIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQnVpbGRlciwgZW5hYmxlcyB0aGUgQnVpbGRlciBjbGFzcyB0byBiZSBwcm9ndWFyZGVkCi0gICAqIGF3YXkgZW50aXJlbHkgb24gQW5kcm9pZC4KLSAgICogPHA+Ci0gICAqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICovCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBPYmplY3QgZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZSBtZXRob2QsIE9iamVjdCBhcmcwLCBPYmplY3QgYXJnMSk7Ci0KLSAgLyoqCi0gICAqIFNhbWUgYXMge0BsaW5rICNkeW5hbWljTWV0aG9kKE1ldGhvZFRvSW52b2tlLCBPYmplY3QsIE9iamVjdCl9IHdpdGgge0Bjb2RlIG51bGx9IHBhZGRpbmcuCi0gICAqLwotICBwcm90ZWN0ZWQgT2JqZWN0IGR5bmFtaWNNZXRob2QoTWV0aG9kVG9JbnZva2UgbWV0aG9kLCBPYmplY3QgYXJnMCkgewotICAgIHJldHVybiBkeW5hbWljTWV0aG9kKG1ldGhvZCwgYXJnMCwgbnVsbCk7Ci0gIH0KLQotICAvKioKLSAgICogU2FtZSBhcyB7QGxpbmsgI2R5bmFtaWNNZXRob2QoTWV0aG9kVG9JbnZva2UsIE9iamVjdCwgT2JqZWN0KX0gd2l0aCB7QGNvZGUgbnVsbH0gcGFkZGluZy4KLSAgICovCi0gIHByb3RlY3RlZCBPYmplY3QgZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZSBtZXRob2QpIHsKLSAgICByZXR1cm4gZHluYW1pY01ldGhvZChtZXRob2QsIG51bGwsIG51bGwpOwotICB9Ci0KLSAgdm9pZCB2aXNpdChWaXNpdG9yIHZpc2l0b3IsIE1lc3NhZ2VUeXBlIG90aGVyKSB7Ci0gICAgZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5WSVNJVCwgdmlzaXRvciwgb3RoZXIpOwotICAgIHVua25vd25GaWVsZHMgPSB2aXNpdG9yLnZpc2l0VW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzLCBvdGhlci51bmtub3duRmllbGRzKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1lcmdlIHNvbWUgdW5rbm93biBmaWVsZHMgaW50byB0aGUge0BsaW5rIFVua25vd25GaWVsZFNldExpdGV9IGZvciB0aGlzCi0gICAqIG1lc3NhZ2UuCi0gICAqCi0gICAqIDxwPkZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICovCi0gIHByb3RlY3RlZCBmaW5hbCB2b2lkIG1lcmdlVW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXRMaXRlIHVua25vd25GaWVsZHMpIHsKLSAgICB0aGlzLnVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXRMaXRlLm11dGFibGVDb3B5T2YodGhpcy51bmtub3duRmllbGRzLCB1bmtub3duRmllbGRzKTsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEJ1aWxkZXI8Ci0gICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4sCi0gICAgICBCdWlsZGVyVHlwZSBleHRlbmRzIEJ1aWxkZXI8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPj4KLSAgICAgICAgICBleHRlbmRzIEFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlcjxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+IHsKLQotICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZVR5cGUgZGVmYXVsdEluc3RhbmNlOwotICAgIHByb3RlY3RlZCBNZXNzYWdlVHlwZSBpbnN0YW5jZTsKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBpc0J1aWx0OwotCi0gICAgcHJvdGVjdGVkIEJ1aWxkZXIoTWVzc2FnZVR5cGUgZGVmYXVsdEluc3RhbmNlKSB7Ci0gICAgICB0aGlzLmRlZmF1bHRJbnN0YW5jZSA9IGRlZmF1bHRJbnN0YW5jZTsKLSAgICAgIHRoaXMuaW5zdGFuY2UgPQotICAgICAgICAgIChNZXNzYWdlVHlwZSkgZGVmYXVsdEluc3RhbmNlLmR5bmFtaWNNZXRob2QoTWV0aG9kVG9JbnZva2UuTkVXX01VVEFCTEVfSU5TVEFOQ0UpOwotICAgICAgaXNCdWlsdCA9IGZhbHNlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBiZWZvcmUgYW55IG1ldGhvZCB0aGF0IHdvdWxkIG11dGF0ZSB0aGUgYnVpbGRlciB0byBlbnN1cmUgdGhhdCBpdCBjb3JyZWN0bHkgY29waWVzCi0gICAgICogYW55IHN0YXRlIGJlZm9yZSB0aGUgd3JpdGUgaGFwcGVucyB0byBwcmVzZXJ2ZSBpbW11dGFiaWxpdHkgZ3VhcmFudGVlcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBjb3B5T25Xcml0ZSgpIHsKLSAgICAgIGlmIChpc0J1aWx0KSB7Ci0gICAgICAgIE1lc3NhZ2VUeXBlIG5ld0luc3RhbmNlID0KLSAgICAgICAgICAgIChNZXNzYWdlVHlwZSkgaW5zdGFuY2UuZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5ORVdfTVVUQUJMRV9JTlNUQU5DRSk7Ci0gICAgICAgIG5ld0luc3RhbmNlLnZpc2l0KE1lcmdlRnJvbVZpc2l0b3IuSU5TVEFOQ0UsIGluc3RhbmNlKTsKLSAgICAgICAgaW5zdGFuY2UgPSBuZXdJbnN0YW5jZTsKLSAgICAgICAgaXNCdWlsdCA9IGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gR2VuZXJhdGVkTWVzc2FnZUxpdGUuaXNJbml0aWFsaXplZChpbnN0YW5jZSwgZmFsc2UgLyogc2hvdWxkTWVtb2l6ZSAqLyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIEJ1aWxkZXJUeXBlIGNsZWFyKCkgewotICAgICAgLy8gTm8gbmVlZCB0byBjb3B5IG9uIHdyaXRlIHNpbmNlIHdlJ3JlIGRyb3BwaW5nIHRoZSBpbnN0YW5jZSBhbnl3YXlzLgotICAgICAgaW5zdGFuY2UgPSAoTWVzc2FnZVR5cGUpIGluc3RhbmNlLmR5bmFtaWNNZXRob2QoTWV0aG9kVG9JbnZva2UuTkVXX01VVEFCTEVfSU5TVEFOQ0UpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xvbmUoKSB7Ci0gICAgICBCdWlsZGVyVHlwZSBidWlsZGVyID0KLSAgICAgICAgICAoQnVpbGRlclR5cGUpIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgICAgYnVpbGRlci5tZXJnZUZyb20oYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lc3NhZ2VUeXBlIGJ1aWxkUGFydGlhbCgpIHsKLSAgICAgIGlmIChpc0J1aWx0KSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgaW5zdGFuY2UubWFrZUltbXV0YWJsZSgpOwotICAgICAgCi0gICAgICBpc0J1aWx0ID0gdHJ1ZTsKLSAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgTWVzc2FnZVR5cGUgYnVpbGQoKSB7Ci0gICAgICBNZXNzYWdlVHlwZSByZXN1bHQgPSBidWlsZFBhcnRpYWwoKTsKLSAgICAgIGlmICghcmVzdWx0LmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICB0aHJvdyBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihyZXN1bHQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIEJ1aWxkZXJUeXBlIGludGVybmFsTWVyZ2VGcm9tKE1lc3NhZ2VUeXBlIG1lc3NhZ2UpIHsKLSAgICAgIHJldHVybiBtZXJnZUZyb20obWVzc2FnZSk7Ci0gICAgfQotICAgIAotICAgIC8qKiBBbGwgc3ViY2xhc3NlcyBpbXBsZW1lbnQgdGhpcy4gKi8KLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKE1lc3NhZ2VUeXBlIG1lc3NhZ2UpIHsKLSAgICAgIGNvcHlPbldyaXRlKCk7Ci0gICAgICBpbnN0YW5jZS52aXNpdChNZXJnZUZyb21WaXNpdG9yLklOU1RBTkNFLCBtZXNzYWdlKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXNzYWdlVHlwZSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGNvcHlPbldyaXRlKCk7Ci0gICAgICB0cnkgewotICAgICAgICBpbnN0YW5jZS5keW5hbWljTWV0aG9kKE1ldGhvZFRvSW52b2tlLk1FUkdFX0ZST01fU1RSRUFNLCBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIGlmIChlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbikgewotICAgICAgICAgIHRocm93IChJT0V4Y2VwdGlvbikgZS5nZXRDYXVzZSgpOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLSAgfQotCi0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gRXh0ZW5zaW9ucy1yZWxhdGVkIHN0dWZmCi0KLSAgLyoqCi0gICAqIExpdGUgZXF1aXZhbGVudCBvZiB7QGxpbmsgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8Ci0gICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4sCi0gICAgICBCdWlsZGVyVHlwZSBleHRlbmRzIEV4dGVuZGFibGVCdWlsZGVyPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4+Ci0gICAgICAgICAgZXh0ZW5kcyBNZXNzYWdlTGl0ZU9yQnVpbGRlciB7Ci0KLSAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KLSAgICA8VHlwZT4gYm9vbGVhbiBoYXNFeHRlbnNpb24oCi0gICAgICAgIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7Ci0KLSAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKLSAgICAgICAgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKTsKLQotICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KLSAgICA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKTsKLQotICAgIC8qKiBHZXQgb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCi0gICAgICAgIGludCBpbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IG9mIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVNZXNzYWdlfS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRXh0ZW5kYWJsZU1lc3NhZ2U8Ci0gICAgICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2U8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPiwKLSAgICAgICAgQnVpbGRlclR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlQnVpbGRlcjxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+PgotICAgICAgICAgICAgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+Ci0gICAgICAgICAgICBpbXBsZW1lbnRzIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4gewotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyB0aGUgc2V0IG9mIGV4dGVuc2lvbnMgb24gdGhpcyBtZXNzYWdlLiBGb3IgdXNlIGJ5IGdlbmVyYXRlZAotICAgICAqIGNvZGUgb25seS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucyA9IEZpZWxkU2V0Lm5ld0ZpZWxkU2V0KCk7Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBtZXJnZUV4dGVuc2lvbkZpZWxkcyhmaW5hbCBNZXNzYWdlVHlwZSBvdGhlcikgewotICAgICAgaWYgKGV4dGVuc2lvbnMuaXNJbW11dGFibGUoKSkgewotICAgICAgICBleHRlbnNpb25zID0gZXh0ZW5zaW9ucy5jbG9uZSgpOwotICAgICAgfQotICAgICAgZXh0ZW5zaW9ucy5tZXJnZUZyb20oKChFeHRlbmRhYmxlTWVzc2FnZSkgb3RoZXIpLmV4dGVuc2lvbnMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGZpbmFsIHZvaWQgdmlzaXQoVmlzaXRvciB2aXNpdG9yLCBNZXNzYWdlVHlwZSBvdGhlcikgewotICAgICAgc3VwZXIudmlzaXQodmlzaXRvciwgb3RoZXIpOwotICAgICAgZXh0ZW5zaW9ucyA9IHZpc2l0b3IudmlzaXRFeHRlbnNpb25zKGV4dGVuc2lvbnMsIG90aGVyLmV4dGVuc2lvbnMpOwotICAgIH0KLSAgICAKLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbiB1bmtub3duIGZpZWxkIG9yIGFuIGV4dGVuc2lvbi4gRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LgotICAgICAqIAotICAgICAqIDxwPkZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICAgKiAKLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSB1bmxlc3MgdGhlIHRhZyBpcyBhbiBlbmQtZ3JvdXAgdGFnLgotICAgICAqLwotICAgIHByb3RlY3RlZCA8TWVzc2FnZVR5cGUgZXh0ZW5kcyBNZXNzYWdlTGl0ZT4gYm9vbGVhbiBwYXJzZVVua25vd25GaWVsZCgKLSAgICAgICAgTWVzc2FnZVR5cGUgZGVmYXVsdEluc3RhbmNlLAotICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpbnQgd2lyZVR5cGUgPSBXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZyk7Ci0gICAgICBpbnQgZmllbGROdW1iZXIgPSBXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7Ci0KLSAgICAgIC8vIFRPRE8oZHdlaXMpOiBIb3cgbXVjaCBieXRlY29kZSB3b3VsZCBiZSBzYXZlZCBieSBub3QgcmVxdWlyaW5nIHRoZSBnZW5lcmF0ZWQgY29kZSB0bwotICAgICAgLy8gICAgIHByb3ZpZGUgdGhlIGRlZmF1bHQgaW5zdGFuY2U/Ci0gICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbiA9IGV4dGVuc2lvblJlZ2lzdHJ5LmZpbmRMaXRlRXh0ZW5zaW9uQnlOdW1iZXIoCi0gICAgICAgICAgZGVmYXVsdEluc3RhbmNlLCBmaWVsZE51bWJlcik7Ci0KLSAgICAgIGJvb2xlYW4gdW5rbm93biA9IGZhbHNlOwotICAgICAgYm9vbGVhbiBwYWNrZWQgPSBmYWxzZTsKLSAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFVua25vd24gZmllbGQuCi0gICAgICB9IGVsc2UgaWYgKHdpcmVUeXBlID09IEZpZWxkU2V0LmdldFdpcmVGb3JtYXRGb3JGaWVsZFR5cGUoCi0gICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICBmYWxzZSAgLyogaXNQYWNrZWQgKi8pKSB7Ci0gICAgICAgIHBhY2tlZCA9IGZhbHNlOyAgLy8gTm9ybWFsLCB1bnBhY2tlZCB2YWx1ZS4KLSAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuaXNSZXBlYXRlZCAmJgotICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci50eXBlLmlzUGFja2FibGUoKSAmJgotICAgICAgICAgICAgICAgICB3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAotICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgdHJ1ZSAgLyogaXNQYWNrZWQgKi8pKSB7Ci0gICAgICAgIHBhY2tlZCA9IHRydWU7ICAvLyBQYWNrZWQgdmFsdWUuCi0gICAgICB9IGVsc2UgewotICAgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFdyb25nIHdpcmUgdHlwZS4KLSAgICAgIH0KLQotICAgICAgaWYgKHVua25vd24pIHsgIC8vIFVua25vd24gZmllbGQgb3Igd3Jvbmcgd2lyZSB0eXBlLiAgU2tpcC4KLSAgICAgICAgcmV0dXJuIHBhcnNlVW5rbm93bkZpZWxkKHRhZywgaW5wdXQpOwotICAgICAgfQotCi0gICAgICBpZiAocGFja2VkKSB7Ci0gICAgICAgIGludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTsKLSAgICAgICAgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7Ci0gICAgICAgIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpID09IFdpcmVGb3JtYXQuRmllbGRUeXBlLkVOVU0pIHsKLSAgICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgICBpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpOwotICAgICAgICAgICAgT2JqZWN0IHZhbHVlID0KLSAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXNuJ3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzCi0gICAgICAgICAgICAgIC8vIGVudW0sIGRyb3AgaXQgKGRvbid0IGV2ZW4gYWRkIGl0IHRvIHVua25vd25GaWVsZHMpLgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uc2luZ3VsYXJUb0ZpZWxkU2V0VHlwZSh2YWx1ZSkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgICBPYmplY3QgdmFsdWUgPQotICAgICAgICAgICAgICAgIEZpZWxkU2V0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypjaGVja1V0Zjg9Ki8gZmFsc2UpOwotICAgICAgICAgICAgZXh0ZW5zaW9ucy5hZGRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlucHV0LnBvcExpbWl0KGxpbWl0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgc3dpdGNoIChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSkgewotICAgICAgICAgIGNhc2UgTUVTU0FHRTogewotICAgICAgICAgICAgTWVzc2FnZUxpdGUuQnVpbGRlciBzdWJCdWlsZGVyID0gbnVsbDsKLSAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLmRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgICAgIE1lc3NhZ2VMaXRlIGV4aXN0aW5nVmFsdWUgPQotICAgICAgICAgICAgICAgICAgKE1lc3NhZ2VMaXRlKSBleHRlbnNpb25zLmdldEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgaWYgKGV4aXN0aW5nVmFsdWUgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBleGlzdGluZ1ZhbHVlLnRvQnVpbGRlcigpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoc3ViQnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBleHRlbnNpb24uZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpCi0gICAgICAgICAgICAgICAgICAubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpID09Ci0gICAgICAgICAgICAgICAgV2lyZUZvcm1hdC5GaWVsZFR5cGUuR1JPVVApIHsKLSAgICAgICAgICAgICAgaW5wdXQucmVhZEdyb3VwKGV4dGVuc2lvbi5nZXROdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICAgIGludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7Ci0gICAgICAgICAgICB2YWx1ZSA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldEVudW1UeXBlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXNuJ3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzIGVudW0sCi0gICAgICAgICAgICAvLyB3cml0ZSBpdCB0byB1bmtub3duIGZpZWxkcyBvYmplY3QuCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICBtZXJnZVZhcmludEZpZWxkKGZpZWxkTnVtYmVyLCByYXdWYWx1ZSk7Ci0gICAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIHZhbHVlID0gRmllbGRTZXQucmVhZFByaW1pdGl2ZUZpZWxkKGlucHV0LAotICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVUeXBlKCksCi0gICAgICAgICAgICAgICAgLypjaGVja1V0Zjg9Ki8gZmFsc2UpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgZXh0ZW5zaW9ucy5hZGRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uc2luZ3VsYXJUb0ZpZWxkU2V0VHlwZSh2YWx1ZSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uc2luZ3VsYXJUb0ZpZWxkU2V0VHlwZSh2YWx1ZSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgPz4gZXh0ZW5zaW9uKSB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uLmdldENvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlKCkgIT0KLSAgICAgICAgICBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpIHsKLSAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYgc29tZW9uZSB1c2VzIHVuY2hlY2tlZCBvcGVyYXRpb25zLgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJUaGlzIGV4dGVuc2lvbiBpcyBmb3IgYSBkaWZmZXJlbnQgbWVzc2FnZSB0eXBlLiAgUGxlYXNlIG1ha2UgIiArCi0gICAgICAgICAgInN1cmUgdGhhdCB5b3UgYXJlIG5vdCBzdXBwcmVzc2luZyBhbnkgZ2VuZXJpY3MgdHlwZSB3YXJuaW5ncy4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogQ2hlY2sgaWYgYSBzaW5ndWxhciBleHRlbnNpb24gaXMgcHJlc2VudC4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKGZpbmFsIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgewotICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb25MaXRlID0KLSAgICAgICAgICBjaGVja0lzTGl0ZShleHRlbnNpb24pOwotICAgICAgCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb25MaXRlKTsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmhhc0ZpZWxkKGV4dGVuc2lvbkxpdGUuZGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gaW50IGdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKLSAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uTGl0ZSA9Ci0gICAgICAgICAgY2hlY2tJc0xpdGUoZXh0ZW5zaW9uKTsKLSAgICAgIAotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uTGl0ZSk7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZXh0ZW5zaW9uTGl0ZS5kZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSB2YWx1ZSBvZiBhbiBleHRlbnNpb24uICovCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbihmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pIHsKLSAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uTGl0ZSA9Ci0gICAgICAgICAgY2hlY2tJc0xpdGUoZXh0ZW5zaW9uKTsKLSAgICAgIAotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uTGl0ZSk7Ci0gICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBleHRlbnNpb25zLmdldEZpZWxkKGV4dGVuc2lvbkxpdGUuZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uTGl0ZS5kZWZhdWx0VmFsdWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKFR5cGUpIGV4dGVuc2lvbkxpdGUuZnJvbUZpZWxkU2V0VHlwZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sIGZpbmFsIGludCBpbmRleCkgewotICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb25MaXRlID0KLSAgICAgICAgICBjaGVja0lzTGl0ZShleHRlbnNpb24pOwotCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb25MaXRlKTsKLSAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uTGl0ZS5zaW5ndWxhckZyb21GaWVsZFNldFR5cGUoCi0gICAgICAgICAgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbkxpdGUuZGVzY3JpcHRvciwgaW5kZXgpKTsKLSAgICB9Ci0KLSAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY2hlY2sgaWYgYWxsIGV4dGVuc2lvbnMgYXJlIGluaXRpYWxpemVkLiAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmlzSW5pdGlhbGl6ZWQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBtYWtlSW1tdXRhYmxlKCkgewotICAgICAgc3VwZXIubWFrZUltbXV0YWJsZSgpOwotICAgICAgCi0gICAgICBleHRlbnNpb25zLm1ha2VJbW11dGFibGUoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGJ5IHN1YmNsYXNzZXMgdG8gc2VyaWFsaXplIGV4dGVuc2lvbnMuICBFeHRlbnNpb24gcmFuZ2VzIG1heSBiZQotICAgICAqIGludGVybGVhdmVkIHdpdGggZmllbGQgbnVtYmVycywgYnV0IHdlIG11c3Qgd3JpdGUgdGhlbSBpbiBjYW5vbmljYWwKLSAgICAgKiAoc29ydGVkIGJ5IGZpZWxkIG51bWJlcikgb3JkZXIuICBFeHRlbnNpb25Xcml0ZXIgaGVscHMgdXMgd3JpdGUKLSAgICAgKiBpbmRpdmlkdWFsIHJhbmdlcyBvZiBleHRlbnNpb25zIGF0IG9uY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIEV4dGVuc2lvbldyaXRlciB7Ci0gICAgICAvLyBJbWFnaW5lIGhvdyBtdWNoIHNpbXBsZXIgdGhpcyBjb2RlIHdvdWxkIGJlIGlmIEphdmEgaXRlcmF0b3JzIGhhZAotICAgICAgLy8gYSB3YXkgdG8gZ2V0IHRoZSBuZXh0IGVsZW1lbnQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIGl0ZXJhdG9yLgotCi0gICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxFeHRlbnNpb25EZXNjcmlwdG9yLCBPYmplY3Q+PiBpdGVyID0KLSAgICAgICAgICAgIGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKLSAgICAgIHByaXZhdGUgTWFwLkVudHJ5PEV4dGVuc2lvbkRlc2NyaXB0b3IsIE9iamVjdD4gbmV4dDsKLSAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdDsKLQotICAgICAgcHJpdmF0ZSBFeHRlbnNpb25Xcml0ZXIoYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdCkgewotICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5tZXNzYWdlU2V0V2lyZUZvcm1hdCA9IG1lc3NhZ2VTZXRXaXJlRm9ybWF0OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZVVudGlsKGZpbmFsIGludCBlbmQsIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldEtleSgpLmdldE51bWJlcigpIDwgZW5kKSB7Ci0gICAgICAgICAgRXh0ZW5zaW9uRGVzY3JpcHRvciBleHRlbnNpb24gPSBuZXh0LmdldEtleSgpOwotICAgICAgICAgIGlmIChtZXNzYWdlU2V0V2lyZUZvcm1hdCAmJiBleHRlbnNpb24uZ2V0TGl0ZUphdmFUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuSmF2YVR5cGUuTUVTU0FHRSAmJgotICAgICAgICAgICAgICAhZXh0ZW5zaW9uLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihleHRlbnNpb24uZ2V0TnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlTGl0ZSkgbmV4dC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRmllbGRTZXQud3JpdGVGaWVsZChleHRlbnNpb24sIG5leHQuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5leHQgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBFeHRlbnNpb25Xcml0ZXIgbmV3RXh0ZW5zaW9uV3JpdGVyKCkgewotICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIoZmFsc2UpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKSB7Ci0gICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbldyaXRlcih0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBleHRlbnNpb25zLiAqLwotICAgIHByb3RlY3RlZCBpbnQgZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGludCBleHRlbnNpb25zU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IG9mIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVCdWlsZGVyfS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEV4dGVuZGFibGVCdWlsZGVyPAotICAgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4sCi0gICAgICAgIEJ1aWxkZXJUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZUJ1aWxkZXI8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPj4KLSAgICAgIGV4dGVuZHMgQnVpbGRlcjxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+Ci0gICAgICBpbXBsZW1lbnRzIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4gewotICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlQnVpbGRlcihNZXNzYWdlVHlwZSBkZWZhdWx0SW5zdGFuY2UpIHsKLSAgICAgIHN1cGVyKGRlZmF1bHRJbnN0YW5jZSk7Ci0gICAgICAKLSAgICAgIC8vIFRPRE8oZHdlaXMpOiBUaGlzIGlzIGtpbmQgb2YgYW4gdW5uZWNlc3NhcnkgY2xvbmUgc2luY2Ugd2UgY29uc3RydWN0IGEKLSAgICAgIC8vICAgICBuZXcgaW5zdGFuY2UgaW4gdGhlIHBhcmVudCBjb25zdHJ1Y3RvciB3aGljaCBtYWtlcyB0aGUgZXh0ZW5zaW9ucwotICAgICAgLy8gICAgIGltbXV0YWJsZS4gVGhpcyBleHRyYSBhbGxvY2F0aW9uIHNob3VsZG4ndCBtYXR0ZXIgaW4gcHJhY3RpY2UKLSAgICAgIC8vICAgICB0aG91Z2guCi0gICAgICBpbnN0YW5jZS5leHRlbnNpb25zID0gaW5zdGFuY2UuZXh0ZW5zaW9ucy5jbG9uZSgpOwotICAgIH0KLQotICAgIC8vIEZvciBpbW11dGFibGUgbWVzc2FnZSBjb252ZXJzaW9uLgotICAgIHZvaWQgaW50ZXJuYWxTZXRFeHRlbnNpb25TZXQoRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucykgewotICAgICAgY29weU9uV3JpdGUoKTsKLSAgICAgIGluc3RhbmNlLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHByb3RlY3RlZCB2b2lkIGNvcHlPbldyaXRlKCkgewotICAgICAgaWYgKCFpc0J1aWx0KSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIAotICAgICAgc3VwZXIuY29weU9uV3JpdGUoKTsKLSAgICAgIGluc3RhbmNlLmV4dGVuc2lvbnMgPSBpbnN0YW5jZS5leHRlbnNpb25zLmNsb25lKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIE1lc3NhZ2VUeXBlIGJ1aWxkUGFydGlhbCgpIHsKLSAgICAgIGlmIChpc0J1aWx0KSB7Ci0gICAgICAgIHJldHVybiBpbnN0YW5jZTsKLSAgICAgIH0KLQotICAgICAgaW5zdGFuY2UuZXh0ZW5zaW9ucy5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgICByZXR1cm4gc3VwZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgewotICAgICAgaWYgKGV4dGVuc2lvbi5nZXRDb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSgpICE9Ci0gICAgICAgICAgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKSB7Ci0gICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNvbWVvbmUgdXNlcyB1bmNoZWNrZWQgb3BlcmF0aW9ucy4KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhpcyBleHRlbnNpb24gaXMgZm9yIGEgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZS4gIFBsZWFzZSBtYWtlICIgKwotICAgICAgICAgICJzdXJlIHRoYXQgeW91IGFyZSBub3Qgc3VwcHJlc3NpbmcgYW55IGdlbmVyaWNzIHR5cGUgd2FybmluZ3MuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIGEgc2luZ3VsYXIgZXh0ZW5zaW9uIGlzIHByZXNlbnQuICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBib29sZWFuIGhhc0V4dGVuc2lvbihmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pIHsKLSAgICAgIHJldHVybiBpbnN0YW5jZS5oYXNFeHRlbnNpb24oZXh0ZW5zaW9uKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBpbnQgZ2V0RXh0ZW5zaW9uQ291bnQoCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbikgewotICAgICAgcmV0dXJuIGluc3RhbmNlLmdldEV4dGVuc2lvbkNvdW50KGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLwotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oZmluYWwgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7Ci0gICAgICByZXR1cm4gaW5zdGFuY2UuZ2V0RXh0ZW5zaW9uKGV4dGVuc2lvbik7Ci0gICAgfQotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sIGZpbmFsIGludCBpbmRleCkgewotICAgICAgcmV0dXJuIGluc3RhbmNlLmdldEV4dGVuc2lvbihleHRlbnNpb24sIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvLyBUaGlzIGlzIGltcGxlbWVudGVkIGhlcmUgb25seSB0byB3b3JrIGFyb3VuZCBhbiBhcHBhcmVudCBidWcgaW4gdGhlCi0gICAgLy8gSmF2YSBjb21waWxlciBhbmQvb3IgYnVpbGQgc3lzdGVtLiAgU2VlIGJ1ZyAjMTg5ODQ2My4gIFRoZSBtZXJlIHByZXNlbmNlCi0gICAgLy8gb2YgdGhpcyBkdW1teSBjbG9uZSgpIGltcGxlbWVudGF0aW9uIG1ha2VzIGl0IGdvIGF3YXkuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsb25lKCkgewotICAgICAgcmV0dXJuIHN1cGVyLmNsb25lKCk7Ci0gICAgfQotICAgIAotICAgIC8qKiBTZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIHNldEV4dGVuc2lvbigKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uLAotICAgICAgICBmaW5hbCBUeXBlIHZhbHVlKSB7Ci0gICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbkxpdGUgPQotICAgICAgICAgIGNoZWNrSXNMaXRlKGV4dGVuc2lvbik7Ci0gICAgICAKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbkxpdGUpOwotICAgICAgY29weU9uV3JpdGUoKTsKLSAgICAgIGluc3RhbmNlLmV4dGVuc2lvbnMuc2V0RmllbGQoZXh0ZW5zaW9uTGl0ZS5kZXNjcmlwdG9yLCBleHRlbnNpb25MaXRlLnRvRmllbGRTZXRUeXBlKHZhbHVlKSk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKiBTZXQgdGhlIHZhbHVlIG9mIG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBFeHRlbnNpb25MaXRlPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCi0gICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgVHlwZSB2YWx1ZSkgewotICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb25MaXRlID0KLSAgICAgICAgICBjaGVja0lzTGl0ZShleHRlbnNpb24pOwotICAgICAgCi0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb25MaXRlKTsKLSAgICAgIGNvcHlPbldyaXRlKCk7Ci0gICAgICBpbnN0YW5jZS5leHRlbnNpb25zLnNldFJlcGVhdGVkRmllbGQoCi0gICAgICAgICAgZXh0ZW5zaW9uTGl0ZS5kZXNjcmlwdG9yLCBpbmRleCwgZXh0ZW5zaW9uTGl0ZS5zaW5ndWxhclRvRmllbGRTZXRUeXBlKHZhbHVlKSk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKiBBcHBlbmQgYSB2YWx1ZSB0byBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIGFkZEV4dGVuc2lvbigKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAotICAgICAgICBmaW5hbCBUeXBlIHZhbHVlKSB7Ci0gICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbkxpdGUgPQotICAgICAgICAgIGNoZWNrSXNMaXRlKGV4dGVuc2lvbik7Ci0gICAgICAKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbkxpdGUpOwotICAgICAgY29weU9uV3JpdGUoKTsKLSAgICAgIGluc3RhbmNlLmV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgICBleHRlbnNpb25MaXRlLmRlc2NyaXB0b3IsIGV4dGVuc2lvbkxpdGUuc2luZ3VsYXJUb0ZpZWxkU2V0VHlwZSh2YWx1ZSkpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKiogQ2xlYXIgYW4gZXh0ZW5zaW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgY2xlYXJFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvbkxpdGU8TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgewotICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb25MaXRlID0gY2hlY2tJc0xpdGUoZXh0ZW5zaW9uKTsKLSAgICAgIAotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uTGl0ZSk7Ci0gICAgICBjb3B5T25Xcml0ZSgpOwotICAgICAgaW5zdGFuY2UuZXh0ZW5zaW9ucy5jbGVhckZpZWxkKGV4dGVuc2lvbkxpdGUuZGVzY3JpcHRvcik7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KLSAgcHVibGljIHN0YXRpYyA8Q29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlTGl0ZSwgVHlwZT4KLSAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4KLSAgICAgICAgICBuZXdTaW5ndWxhckdlbmVyYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgICAgICAgIGZpbmFsIFR5cGUgZGVmYXVsdFZhbHVlLAotICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICAgICAgICBmaW5hbCBJbnRlcm5hbC5FbnVtTGl0ZU1hcDw/PiBlbnVtVHlwZU1hcCwKLSAgICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgZmluYWwgQ2xhc3Mgc2luZ3VsYXJUeXBlKSB7Ci0gICAgcmV0dXJuIG5ldyBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+KAotICAgICAgICBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgZGVmYXVsdFZhbHVlLAotICAgICAgICBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICBuZXcgRXh0ZW5zaW9uRGVzY3JpcHRvcihlbnVtVHlwZU1hcCwgbnVtYmVyLCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1JlcGVhdGVkICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSAvKiBpc1BhY2tlZCAqLyksCi0gICAgICAgIHNpbmd1bGFyVHlwZSk7Ci0gIH0KLQotICAvKiogRm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAqLwotICBwdWJsaWMgc3RhdGljIDxDb250YWluaW5nVHlwZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBUeXBlPgotICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPgotICAgICAgICAgIG5ld1JlcGVhdGVkR2VuZXJhdGVkRXh0ZW5zaW9uKAotICAgICAgICAgICAgICBmaW5hbCBDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCi0gICAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXIsCi0gICAgICAgICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNQYWNrZWQsCi0gICAgICAgICAgICAgIGZpbmFsIENsYXNzIHNpbmd1bGFyVHlwZSkgewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAgLy8gU3ViY2xhc3NlcyBlbnN1cmUgVHlwZSBpcyBhIExpc3QKLSAgICBUeXBlIGVtcHR5TGlzdCA9IChUeXBlKSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCi0gICAgICAgIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICBlbXB0eUxpc3QsCi0gICAgICAgIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgIG5ldyBFeHRlbnNpb25EZXNjcmlwdG9yKAotICAgICAgICAgICAgZW51bVR5cGVNYXAsIG51bWJlciwgdHlwZSwgdHJ1ZSAvKiBpc1JlcGVhdGVkICovLCBpc1BhY2tlZCksCi0gICAgICAgIHNpbmd1bGFyVHlwZSk7Ci0gIH0KLQotICBzdGF0aWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uRGVzY3JpcHRvcgotICAgICAgaW1wbGVtZW50cyBGaWVsZFNldC5GaWVsZERlc2NyaXB0b3JMaXRlPAotICAgICAgICBFeHRlbnNpb25EZXNjcmlwdG9yPiB7Ci0gICAgRXh0ZW5zaW9uRGVzY3JpcHRvcigKLSAgICAgICAgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXAsCi0gICAgICAgIGZpbmFsIGludCBudW1iZXIsCi0gICAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCi0gICAgICAgIGZpbmFsIGJvb2xlYW4gaXNSZXBlYXRlZCwKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhY2tlZCkgewotICAgICAgdGhpcy5lbnVtVHlwZU1hcCA9IGVudW1UeXBlTWFwOwotICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgdGhpcy5pc1JlcGVhdGVkID0gaXNSZXBlYXRlZDsKLSAgICAgIHRoaXMuaXNQYWNrZWQgPSBpc1BhY2tlZDsKLSAgICB9Ci0KLSAgICBmaW5hbCBJbnRlcm5hbC5FbnVtTGl0ZU1hcDw/PiBlbnVtVHlwZU1hcDsKLSAgICBmaW5hbCBpbnQgbnVtYmVyOwotICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGU7Ci0gICAgZmluYWwgYm9vbGVhbiBpc1JlcGVhdGVkOwotICAgIGZpbmFsIGJvb2xlYW4gaXNQYWNrZWQ7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKLSAgICAgIHJldHVybiBudW1iZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCkgewotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpcmVGb3JtYXQuSmF2YVR5cGUgZ2V0TGl0ZUphdmFUeXBlKCkgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0SmF2YVR5cGUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGVkKCkgewotICAgICAgcmV0dXJuIGlzUmVwZWF0ZWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYWNrZWQoKSB7Ci0gICAgICByZXR1cm4gaXNQYWNrZWQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEludGVybmFsLkVudW1MaXRlTWFwPD8+IGdldEVudW1UeXBlKCkgewotICAgICAgcmV0dXJuIGVudW1UeXBlTWFwOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBNZXNzYWdlTGl0ZS5CdWlsZGVyIGludGVybmFsTWVyZ2VGcm9tKE1lc3NhZ2VMaXRlLkJ1aWxkZXIgdG8sIE1lc3NhZ2VMaXRlIGZyb20pIHsKLSAgICAgIHJldHVybiAoKEJ1aWxkZXIpIHRvKS5tZXJnZUZyb20oKEdlbmVyYXRlZE1lc3NhZ2VMaXRlKSBmcm9tKTsKLSAgICB9Ci0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEV4dGVuc2lvbkRlc2NyaXB0b3Igb3RoZXIpIHsKLSAgICAgIHJldHVybiBudW1iZXIgLSBvdGhlci5udW1iZXI7Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKiogQ2FsbHMgQ2xhc3MuZ2V0TWV0aG9kIGFuZCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uIGlmIGl0IGZhaWxzLiAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RPckRpZShDbGFzcyBjbGF6eiwgU3RyaW5nIG5hbWUsIENsYXNzLi4uIHBhcmFtcykgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gY2xhenouZ2V0TWV0aG9kKG5hbWUsIHBhcmFtcyk7Ci0gICAgfSBjYXRjaCAoTm9TdWNoTWV0aG9kRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiR2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3MgXCIiICsgY2xhenouZ2V0TmFtZSgpICsKLSAgICAgICAgIlwiIG1pc3NpbmcgbWV0aG9kIFwiIiArIG5hbWUgKyAiXCIuIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIENhbGxzIGludm9rZSBhbmQgdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbiBpZiBpdCBmYWlscy4gKi8KLSAgc3RhdGljIE9iamVjdCBpbnZva2VPckRpZShNZXRob2QgbWV0aG9kLCBPYmplY3Qgb2JqZWN0LCBPYmplY3QuLi4gcGFyYW1zKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKG9iamVjdCwgcGFyYW1zKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiQ291bGRuJ3QgdXNlIEphdmEgcmVmbGVjdGlvbiB0byBpbXBsZW1lbnQgcHJvdG9jb2wgbWVzc2FnZSAiICsKLSAgICAgICAgInJlZmxlY3Rpb24uIiwgZSk7Ci0gICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBjYXVzZTsKLSAgICAgIH0gZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikgewotICAgICAgICB0aHJvdyAoRXJyb3IpIGNhdXNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biBieSBnZW5lcmF0ZWQgYWNjZXNzb3IgbWV0aG9kLiIsIGNhdXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IHRvIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbn0uCi0gICAqCi0gICAqIFVzZXJzIHNob3VsZCBpZ25vcmUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgY2xhc3MgYW5kIG9ubHkgdXNlIG9iamVjdHMgb2YKLSAgICogdGhpcyB0eXBlIGFzIHBhcmFtZXRlcnMgdG8gZXh0ZW5zaW9uIGFjY2Vzc29ycyBhbmQgRXh0ZW5zaW9uUmVnaXN0cnkuYWRkKCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEdlbmVyYXRlZEV4dGVuc2lvbjwKLSAgICAgIENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIFR5cGU+Ci0gICAgICAgICAgZXh0ZW5kcyBFeHRlbnNpb25MaXRlPENvbnRhaW5pbmdUeXBlLCBUeXBlPiB7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2Ugd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycy4KLSAgICAgKgotICAgICAqIFRoZSBsYXN0IHBhcmFtZXRlciB7QGNvZGUgc2luZ3VsYXJUeXBlfSBpcyBvbmx5IG5lZWRlZCBmb3IgZW51bSB0eXBlcy4KLSAgICAgKiBXZSBzdG9yZSBpbnRlZ2VyIHZhbHVlcyBmb3IgZW51bSB0eXBlcyBpbiBhIHtAbGluayBFeHRlbmRhYmxlTWVzc2FnZX0KLSAgICAgKiBhbmQgdXNlIEphdmEgcmVmbGVjdGlvbiB0byBjb252ZXJ0IGFuIGludGVnZXIgdmFsdWUgYmFjayBpbnRvIGEgY29uY3JldGUKLSAgICAgKiBlbnVtIG9iamVjdC4KLSAgICAgKi8KLSAgICBHZW5lcmF0ZWRFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIENvbnRhaW5pbmdUeXBlIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICBmaW5hbCBUeXBlIGRlZmF1bHRWYWx1ZSwKLSAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgICBmaW5hbCBDbGFzcyBzaW5ndWxhclR5cGUpIHsKLSAgICAgIC8vIERlZmVuc2l2ZSBjaGVja3MgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0IGluaXRpYWxpemF0aW9uIG9yZGVyIG9mCi0gICAgICAvLyBHZW5lcmF0ZWRFeHRlbnNpb25zIGFuZCB0aGVpciByZWxhdGVkIEdlbmVyYXRlZE1lc3NhZ2VzLgotICAgICAgaWYgKGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJOdWxsIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlIik7Ci0gICAgICB9Ci0gICAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpID09IFdpcmVGb3JtYXQuRmllbGRUeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgICBtZXNzYWdlRGVmYXVsdEluc3RhbmNlID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJOdWxsIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UiKTsKLSAgICAgIH0KLSAgICAgIHRoaXMuY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UgPSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZTsKLSAgICAgIHRoaXMuZGVmYXVsdFZhbHVlID0gZGVmYXVsdFZhbHVlOwotICAgICAgdGhpcy5tZXNzYWdlRGVmYXVsdEluc3RhbmNlID0gbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKLSAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgZmluYWwgQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2U7Ci0gICAgZmluYWwgVHlwZSBkZWZhdWx0VmFsdWU7Ci0gICAgZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZURlZmF1bHRJbnN0YW5jZTsKLSAgICBmaW5hbCBFeHRlbnNpb25EZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBEZWZhdWx0IGluc3RhbmNlIG9mIHRoZSB0eXBlIGJlaW5nIGV4dGVuZGVkLCB1c2VkIHRvIGlkZW50aWZ5IHRoYXQgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQ29udGFpbmluZ1R5cGUgZ2V0Q29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UoKSB7Ci0gICAgICByZXR1cm4gY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgZmllbGQgbnVtYmVyLiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkgewotICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCk7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGFuIGVtYmVkZGVkIG1lc3NhZ2Ugb3IgZ3JvdXAsIHJldHVybnMgdGhlIGRlZmF1bHQKLSAgICAgKiBpbnN0YW5jZSBvZiB0aGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVzc2FnZUxpdGUgZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICAgIHJldHVybiBtZXNzYWdlRGVmYXVsdEluc3RhbmNlOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIE9iamVjdCBmcm9tRmllbGRTZXRUeXBlKGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yLmdldExpdGVKYXZhVHlwZSgpID09IFdpcmVGb3JtYXQuSmF2YVR5cGUuRU5VTSkgewotICAgICAgICAgIGZpbmFsIExpc3QgcmVzdWx0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgdmFsdWUpIHsKLSAgICAgICAgICAgIHJlc3VsdC5hZGQoc2luZ3VsYXJGcm9tRmllbGRTZXRUeXBlKGVsZW1lbnQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzaW5ndWxhckZyb21GaWVsZFNldFR5cGUodmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIE9iamVjdCBzaW5ndWxhckZyb21GaWVsZFNldFR5cGUoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLkVOVU0pIHsKLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3IuZW51bVR5cGVNYXAuZmluZFZhbHVlQnlOdW1iZXIoKEludGVnZXIpIHZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBPYmplY3QgdG9GaWVsZFNldFR5cGUoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5FTlVNKSB7Ci0gICAgICAgICAgZmluYWwgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0KSB2YWx1ZSkgewotICAgICAgICAgICAgcmVzdWx0LmFkZChzaW5ndWxhclRvRmllbGRTZXRUeXBlKGVsZW1lbnQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzaW5ndWxhclRvRmllbGRTZXRUeXBlKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBPYmplY3Qgc2luZ3VsYXJUb0ZpZWxkU2V0VHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGlmIChkZXNjcmlwdG9yLmdldExpdGVKYXZhVHlwZSgpID09IFdpcmVGb3JtYXQuSmF2YVR5cGUuRU5VTSkgewotICAgICAgICByZXR1cm4gKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWVsZFR5cGUgZ2V0TGl0ZVR5cGUoKSB7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzUmVwZWF0ZWQoKSB7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRvci5pc1JlcGVhdGVkOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUeXBlIGdldERlZmF1bHRWYWx1ZSgpIHsKLSAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgc2VyaWFsaXplZCAoc2VyaWFsaXphYmxlKSBmb3JtIG9mIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZS4gIFN0b3JlcyB0aGUKLSAgICogbWVzc2FnZSBhcyBhIGNsYXNzIG5hbWUgYW5kIGEgYnl0ZSBhcnJheS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgY2xhc3MgU2VyaWFsaXplZEZvcm0gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotCi0gICAgcHVibGljIHN0YXRpYyBTZXJpYWxpemVkRm9ybSBvZihNZXNzYWdlTGl0ZSBtZXNzYWdlKSB7Ci0gICAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZWRGb3JtKG1lc3NhZ2UpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDsKLQotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIG1lc3NhZ2VDbGFzc05hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYXNCeXRlczsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgdGhlIHNlcmlhbGl6ZWQgZm9ybSBieSBjYWxsaW5nIHtAbGluayBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VMaXRlI3RvQnl0ZUFycmF5fS4KLSAgICAgKiBAcGFyYW0gcmVndWxhckZvcm0gdGhlIG1lc3NhZ2UgdG8gc2VyaWFsaXplCi0gICAgICovCi0gICAgU2VyaWFsaXplZEZvcm0oTWVzc2FnZUxpdGUgcmVndWxhckZvcm0pIHsKLSAgICAgIG1lc3NhZ2VDbGFzc05hbWUgPSByZWd1bGFyRm9ybS5nZXRDbGFzcygpLmdldE5hbWUoKTsKLSAgICAgIGFzQnl0ZXMgPSByZWd1bGFyRm9ybS50b0J5dGVBcnJheSgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZW4gcmVhZCBmcm9tIGFuIE9iamVjdElucHV0U3RyZWFtLCB0aGlzIG1ldGhvZCBjb252ZXJ0cyB0aGlzIG9iamVjdAotICAgICAqIGJhY2sgdG8gdGhlIHJlZ3VsYXIgZm9ybS4gIFBhcnQgb2YgSmF2YSdzIHNlcmlhbGl6YXRpb24gbWFnaWMuCi0gICAgICogQHJldHVybiBhIEdlbmVyYXRlZE1lc3NhZ2Ugb2YgdGhlIHR5cGUgdGhhdCB3YXMgc2VyaWFsaXplZAotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZFJlc29sdmUoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIENsYXNzPD8+IG1lc3NhZ2VDbGFzcyA9IENsYXNzLmZvck5hbWUobWVzc2FnZUNsYXNzTmFtZSk7Ci0gICAgICAgIGphdmEubGFuZy5yZWZsZWN0LkZpZWxkIGRlZmF1bHRJbnN0YW5jZUZpZWxkID0KLSAgICAgICAgICAgIG1lc3NhZ2VDbGFzcy5nZXREZWNsYXJlZEZpZWxkKCJERUZBVUxUX0lOU1RBTkNFIik7Ci0gICAgICAgIGRlZmF1bHRJbnN0YW5jZUZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgIE1lc3NhZ2VMaXRlIGRlZmF1bHRJbnN0YW5jZSA9IChNZXNzYWdlTGl0ZSkgZGVmYXVsdEluc3RhbmNlRmllbGQuZ2V0KG51bGwpOwotICAgICAgICByZXR1cm4gZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCkKLSAgICAgICAgICAgIC5tZXJnZUZyb20oYXNCeXRlcykKLSAgICAgICAgICAgIC5idWlsZFBhcnRpYWwoKTsKLSAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgcHJvdG8gYnVmZmVyIGNsYXNzOiAiICsgbWVzc2FnZUNsYXNzTmFtZSwgZSk7Ci0gICAgICB9IGNhdGNoIChOb1N1Y2hGaWVsZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gZmluZCBERUZBVUxUX0lOU1RBTkNFIGluICIgKyBtZXNzYWdlQ2xhc3NOYW1lLCBlKTsKLSAgICAgIH0gY2F0Y2ggKFNlY3VyaXR5RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVuYWJsZSB0byBjYWxsIERFRkFVTFRfSU5TVEFOQ0UgaW4gIiArIG1lc3NhZ2VDbGFzc05hbWUsIGUpOwotICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gY2FsbCBwYXJzZVBhcnRpYWxGcm9tIiwgZSk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIHVuZGVyc3RhbmQgcHJvdG8gYnVmZmVyIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQ2hlY2tzIHRoYXQgdGhlIHtAbGluayBFeHRlbnNpb259IGlzIExpdGUgYW5kIHJldHVybnMgaXQgYXMgYQotICAgKiB7QGxpbmsgR2VuZXJhdGVkRXh0ZW5zaW9ufS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIDwKLSAgICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2U8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPiwKLSAgICAgIEJ1aWxkZXJUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZUJ1aWxkZXI8TWVzc2FnZVR5cGUsIEJ1aWxkZXJUeXBlPiwKLSAgICAgIFQ+Ci0gICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUPiBjaGVja0lzTGl0ZSgKLSAgICAgICAgRXh0ZW5zaW9uTGl0ZTxNZXNzYWdlVHlwZSwgVD4gZXh0ZW5zaW9uKSB7Ci0gICAgaWYgKCFleHRlbnNpb24uaXNMaXRlKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkV4cGVjdGVkIGEgbGl0ZSBleHRlbnNpb24uIik7Ci0gICAgfQotICAgIAotICAgIHJldHVybiAoR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUPikgZXh0ZW5zaW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIEEgc3RhdGljIGhlbHBlciBtZXRob2QgZm9yIGNoZWNraW5nIGlmIGEgbWVzc2FnZSBpcyBpbml0aWFsaXplZCwgb3B0aW9uYWxseSBtZW1vaXppbmcuCi0gICAqIDxwPgotICAgKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIDxUIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGU8VCwgPz4+IGJvb2xlYW4gaXNJbml0aWFsaXplZCgKLSAgICAgIFQgbWVzc2FnZSwgYm9vbGVhbiBzaG91bGRNZW1vaXplKSB7Ci0gICAgcmV0dXJuIG1lc3NhZ2UuZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5JU19JTklUSUFMSVpFRCwgc2hvdWxkTWVtb2l6ZSkgIT0gbnVsbDsKLSAgfSAKLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgPFQgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxULCA/Pj4gdm9pZCBtYWtlSW1tdXRhYmxlKFQgbWVzc2FnZSkgewotICAgIG1lc3NhZ2UuZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5NQUtFX0lNTVVUQUJMRSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIEludExpc3QgZW1wdHlJbnRMaXN0KCkgewotICAgIHJldHVybiBJbnRBcnJheUxpc3QuZW1wdHlMaXN0KCk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgc3RhdGljIEludExpc3QgbXV0YWJsZUNvcHkoSW50TGlzdCBsaXN0KSB7Ci0gICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICByZXR1cm4gbGlzdC5tdXRhYmxlQ29weVdpdGhDYXBhY2l0eSgKLSAgICAgICAgc2l6ZSA9PSAwID8gQWJzdHJhY3RQcm90b2J1Zkxpc3QuREVGQVVMVF9DQVBBQ0lUWSA6IHNpemUgKiAyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgTG9uZ0xpc3QgZW1wdHlMb25nTGlzdCgpIHsKLSAgICByZXR1cm4gTG9uZ0FycmF5TGlzdC5lbXB0eUxpc3QoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBMb25nTGlzdCBtdXRhYmxlQ29weShMb25nTGlzdCBsaXN0KSB7Ci0gICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICByZXR1cm4gbGlzdC5tdXRhYmxlQ29weVdpdGhDYXBhY2l0eSgKLSAgICAgICAgc2l6ZSA9PSAwID8gQWJzdHJhY3RQcm90b2J1Zkxpc3QuREVGQVVMVF9DQVBBQ0lUWSA6IHNpemUgKiAyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgRmxvYXRMaXN0IGVtcHR5RmxvYXRMaXN0KCkgewotICAgIHJldHVybiBGbG9hdEFycmF5TGlzdC5lbXB0eUxpc3QoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBGbG9hdExpc3QgbXV0YWJsZUNvcHkoRmxvYXRMaXN0IGxpc3QpIHsKLSAgICBpbnQgc2l6ZSA9IGxpc3Quc2l6ZSgpOwotICAgIHJldHVybiBsaXN0Lm11dGFibGVDb3B5V2l0aENhcGFjaXR5KAotICAgICAgICBzaXplID09IDAgPyBBYnN0cmFjdFByb3RvYnVmTGlzdC5ERUZBVUxUX0NBUEFDSVRZIDogc2l6ZSAqIDIpOwotICB9Ci0KLSAgcHJvdGVjdGVkIHN0YXRpYyBEb3VibGVMaXN0IGVtcHR5RG91YmxlTGlzdCgpIHsKLSAgICByZXR1cm4gRG91YmxlQXJyYXlMaXN0LmVtcHR5TGlzdCgpOwotICB9Ci0gIAotICBwcm90ZWN0ZWQgc3RhdGljIERvdWJsZUxpc3QgbXV0YWJsZUNvcHkoRG91YmxlTGlzdCBsaXN0KSB7Ci0gICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICByZXR1cm4gbGlzdC5tdXRhYmxlQ29weVdpdGhDYXBhY2l0eSgKLSAgICAgICAgc2l6ZSA9PSAwID8gQWJzdHJhY3RQcm90b2J1Zkxpc3QuREVGQVVMVF9DQVBBQ0lUWSA6IHNpemUgKiAyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgQm9vbGVhbkxpc3QgZW1wdHlCb29sZWFuTGlzdCgpIHsKLSAgICByZXR1cm4gQm9vbGVhbkFycmF5TGlzdC5lbXB0eUxpc3QoKTsKLSAgfQotICAKLSAgcHJvdGVjdGVkIHN0YXRpYyBCb29sZWFuTGlzdCBtdXRhYmxlQ29weShCb29sZWFuTGlzdCBsaXN0KSB7Ci0gICAgaW50IHNpemUgPSBsaXN0LnNpemUoKTsKLSAgICByZXR1cm4gbGlzdC5tdXRhYmxlQ29weVdpdGhDYXBhY2l0eSgKLSAgICAgICAgc2l6ZSA9PSAwID8gQWJzdHJhY3RQcm90b2J1Zkxpc3QuREVGQVVMVF9DQVBBQ0lUWSA6IHNpemUgKiAyKTsKLSAgfQotCi0gIHByb3RlY3RlZCBzdGF0aWMgPEU+IFByb3RvYnVmTGlzdDxFPiBlbXB0eVByb3RvYnVmTGlzdCgpIHsKLSAgICByZXR1cm4gUHJvdG9idWZBcnJheUxpc3QuZW1wdHlMaXN0KCk7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgPEU+IFByb3RvYnVmTGlzdDxFPiBtdXRhYmxlQ29weShQcm90b2J1Zkxpc3Q8RT4gbGlzdCkgewotICAgIGludCBzaXplID0gbGlzdC5zaXplKCk7Ci0gICAgcmV0dXJuIGxpc3QubXV0YWJsZUNvcHlXaXRoQ2FwYWNpdHkoCi0gICAgICAgIHNpemUgPT0gMCA/IEFic3RyYWN0UHJvdG9idWZMaXN0LkRFRkFVTFRfQ0FQQUNJVFkgOiBzaXplICogMik7Ci0gIH0KLQotICAvKioKLSAgICogQSB7QGxpbmsgUGFyc2VyfSBpbXBsZW1lbnRhdGlvbiB0aGF0IGRlbGVnYXRlcyB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KLSAgICogPHA+Ci0gICAqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgY2xhc3MgRGVmYXVsdEluc3RhbmNlQmFzZWRQYXJzZXI8VCBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFQsID8+PgotICAgICAgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcjxUPiB7Ci0gICAgCi0gICAgcHJpdmF0ZSBUIGRlZmF1bHRJbnN0YW5jZTsKLSAgICAKLSAgICBwdWJsaWMgRGVmYXVsdEluc3RhbmNlQmFzZWRQYXJzZXIoVCBkZWZhdWx0SW5zdGFuY2UpIHsKLSAgICAgIHRoaXMuZGVmYXVsdEluc3RhbmNlID0gZGVmYXVsdEluc3RhbmNlOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVCBwYXJzZVBhcnRpYWxGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gR2VuZXJhdGVkTWVzc2FnZUxpdGUucGFyc2VQYXJ0aWFsRnJvbShkZWZhdWx0SW5zdGFuY2UsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogQSBzdGF0aWMgaGVscGVyIG1ldGhvZCBmb3IgcGFyc2luZyBhIHBhcnRpYWwgZnJvbSBpbnB1dCB1c2luZyB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGFuZCB0aGUKLSAgICogaW5zdGFuY2UuCi0gICAqLwotICAvLyBUT0RPKGR3ZWlzKTogU2hvdWxkIHRoaXMgdmVyaWZ5IHRoYXQgdGhlIGxhc3QgdGFnIHdhcyAwPwotICBzdGF0aWMgPFQgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxULCA/Pj4gVCBwYXJzZVBhcnRpYWxGcm9tKAotICAgICAgVCBpbnN0YW5jZSwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBHdWFyYW50ZWVkIGJ5IHByb3RvYwotICAgIFQgcmVzdWx0ID0gKFQpIGluc3RhbmNlLmR5bmFtaWNNZXRob2QoTWV0aG9kVG9JbnZva2UuTkVXX01VVEFCTEVfSU5TVEFOQ0UpOwotICAgIHRyeSB7Ci0gICAgICByZXN1bHQuZHluYW1pY01ldGhvZChNZXRob2RUb0ludm9rZS5NRVJHRV9GUk9NX1NUUkVBTSwgaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgIHJlc3VsdC5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgfSBjYXRjaCAoUnVudGltZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBpZiAoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKSB7Ci0gICAgICAgIHRocm93IChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24pIGUuZ2V0Q2F1c2UoKTsKLSAgICAgIH0KLSAgICAgIHRocm93IGU7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgCi0gIHByb3RlY3RlZCBzdGF0aWMgPFQgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxULCA/Pj4gVCBwYXJzZVBhcnRpYWxGcm9tKAotICAgICAgVCBkZWZhdWx0SW5zdGFuY2UsCi0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHBhcnNlUGFydGlhbEZyb20oZGVmYXVsdEluc3RhbmNlLCBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNoZWNrIGlmIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCi0gICAqCi0gICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGlmIGl0IGlzIG5vdCBpbml0aWFsaXplZC4KLSAgICogQHJldHVybiBUaGUgbWVzc2FnZSB0byBjaGVjay4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIDxUIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGU8VCwgPz4+IFQgY2hlY2tNZXNzYWdlSW5pdGlhbGl6ZWQoVCBtZXNzYWdlKQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgaWYgKG1lc3NhZ2UgIT0gbnVsbCAmJiAhbWVzc2FnZS5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgIHRocm93IG1lc3NhZ2UubmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oKQotICAgICAgICAgIC5hc0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigpCi0gICAgICAgICAgLnNldFVuZmluaXNoZWRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8vIFZhbGlkYXRlcyBsYXN0IHRhZy4KLSAgcHJvdGVjdGVkIHN0YXRpYyA8VCBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFQsID8+PiBUIHBhcnNlRnJvbSgKLSAgICAgIFQgZGVmYXVsdEluc3RhbmNlLCBCeXRlU3RyaW5nIGRhdGEpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gY2hlY2tNZXNzYWdlSW5pdGlhbGl6ZWQoCi0gICAgICAgIHBhcnNlRnJvbShkZWZhdWx0SW5zdGFuY2UsIGRhdGEsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5nZXRFbXB0eVJlZ2lzdHJ5KCkpKTsKLSAgfQotCi0gIC8vIFZhbGlkYXRlcyBsYXN0IHRhZy4KLSAgcHJvdGVjdGVkIHN0YXRpYyA8VCBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFQsID8+PiBUIHBhcnNlRnJvbSgKLSAgICAgIFQgZGVmYXVsdEluc3RhbmNlLCBCeXRlU3RyaW5nIGRhdGEsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBjaGVja01lc3NhZ2VJbml0aWFsaXplZChwYXJzZVBhcnRpYWxGcm9tKGRlZmF1bHRJbnN0YW5jZSwgZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpKTsKLSAgfQotICAKLSAgLy8gVGhpcyBpcyBhIHNwZWNpYWwgY2FzZSBzaW5jZSB3ZSB3YW50IHRvIHZlcmlmeSB0aGF0IHRoZSBsYXN0IHRhZyBpcyAwLiBXZSBhc3N1bWUgd2UgZXhoYXVzdCB0aGUKLSAgLy8gQnl0ZVN0cmluZy4KLSAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxULCA/Pj4gVCBwYXJzZVBhcnRpYWxGcm9tKAotICAgICAgVCBkZWZhdWx0SW5zdGFuY2UsIEJ5dGVTdHJpbmcgZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgVCBtZXNzYWdlOwotICAgIHRyeSB7Ci0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7Ci0gICAgICBtZXNzYWdlID0gcGFyc2VQYXJ0aWFsRnJvbShkZWZhdWx0SW5zdGFuY2UsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICB0cnkgewotICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotICB9Ci0gIAotICAvLyBUaGlzIGlzIGEgc3BlY2lhbCBjYXNlIHNpbmNlIHdlIHdhbnQgdG8gdmVyaWZ5IHRoYXQgdGhlIGxhc3QgdGFnIGlzIDAuIFdlIGFzc3VtZSB3ZSBleGhhdXN0IHRoZQotICAvLyBCeXRlU3RyaW5nLgotICBwcml2YXRlIHN0YXRpYyA8VCBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFQsID8+PiBUIHBhcnNlUGFydGlhbEZyb20oCi0gICAgICBUIGRlZmF1bHRJbnN0YW5jZSwgYnl0ZVtdIGRhdGEsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIFQgbWVzc2FnZTsKLSAgICB0cnkgewotICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7Ci0gICAgICBtZXNzYWdlID0gcGFyc2VQYXJ0aWFsRnJvbShkZWZhdWx0SW5zdGFuY2UsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICB0cnkgewotICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IGU7Ci0gICAgfQotICB9Ci0KLSAgLy8gVmFsaWRhdGVzIGxhc3QgdGFnLgotICBwcm90ZWN0ZWQgc3RhdGljIDxUIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGU8VCwgPz4+IFQgcGFyc2VGcm9tKAotICAgICAgVCBkZWZhdWx0SW5zdGFuY2UsIGJ5dGVbXSBkYXRhKQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGNoZWNrTWVzc2FnZUluaXRpYWxpemVkKAotICAgICAgICBwYXJzZVBhcnRpYWxGcm9tKGRlZmF1bHRJbnN0YW5jZSwgZGF0YSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKSkpOwotICB9Ci0KLSAgLy8gVmFsaWRhdGVzIGxhc3QgdGFnLgotICBwcm90ZWN0ZWQgc3RhdGljIDxUIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGU8VCwgPz4+IFQgcGFyc2VGcm9tKAotICAgICAgVCBkZWZhdWx0SW5zdGFuY2UsIGJ5dGVbXSBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gY2hlY2tNZXNzYWdlSW5pdGlhbGl6ZWQocGFyc2VQYXJ0aWFsRnJvbShkZWZhdWx0SW5zdGFuY2UsIGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KSk7Ci0gIH0KLQotICAvLyBEb2VzIG5vdCB2YWxpZGF0ZSBsYXN0IHRhZy4KLSAgcHJvdGVjdGVkIHN0YXRpYyA8VCBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFQsID8+PiBUIHBhcnNlRnJvbSgKLSAgICAgIFQgZGVmYXVsdEluc3RhbmNlLCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBjaGVja01lc3NhZ2VJbml0aWFsaXplZCgKLSAgICAgICAgcGFyc2VQYXJ0aWFsRnJvbShkZWZhdWx0SW5zdGFuY2UsIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW5wdXQpLAotICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKSkpOwotICB9Ci0KLSAgLy8gRG9lcyBub3QgdmFsaWRhdGUgbGFzdCB0YWcuCi0gIHByb3RlY3RlZCBzdGF0aWMgPFQgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxULCA/Pj4gVCBwYXJzZUZyb20oCi0gICAgICBUIGRlZmF1bHRJbnN0YW5jZSwgSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBjaGVja01lc3NhZ2VJbml0aWFsaXplZCgKLSAgICAgICAgcGFyc2VQYXJ0aWFsRnJvbShkZWZhdWx0SW5zdGFuY2UsIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW5wdXQpLCBleHRlbnNpb25SZWdpc3RyeSkpOwotICB9Ci0KLSAgLy8gRG9lcyBub3QgdmFsaWRhdGUgbGFzdCB0YWcuCi0gIHByb3RlY3RlZCBzdGF0aWMgPFQgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxULCA/Pj4gVCBwYXJzZUZyb20oCi0gICAgICBUIGRlZmF1bHRJbnN0YW5jZSwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZUZyb20oZGVmYXVsdEluc3RhbmNlLCBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKSk7Ci0gIH0KLQotICAvLyBEb2VzIG5vdCB2YWxpZGF0ZSBsYXN0IHRhZy4KLSAgcHJvdGVjdGVkIHN0YXRpYyA8VCBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFQsID8+PiBUIHBhcnNlRnJvbSgKLSAgICAgIFQgZGVmYXVsdEluc3RhbmNlLCBDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gY2hlY2tNZXNzYWdlSW5pdGlhbGl6ZWQoCi0gICAgICAgIHBhcnNlUGFydGlhbEZyb20oZGVmYXVsdEluc3RhbmNlLCBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKTsKLSAgfQotCi0gIC8vIFZhbGlkYXRlcyBsYXN0IHRhZy4KLSAgcHJvdGVjdGVkIHN0YXRpYyA8VCBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlPFQsID8+PiBUIHBhcnNlRGVsaW1pdGVkRnJvbSgKLSAgICAgIFQgZGVmYXVsdEluc3RhbmNlLCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBjaGVja01lc3NhZ2VJbml0aWFsaXplZCgKLSAgICAgICAgcGFyc2VQYXJ0aWFsRGVsaW1pdGVkRnJvbShkZWZhdWx0SW5zdGFuY2UsIGlucHV0LAotICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKSkpOwotICB9Ci0KLSAgLy8gVmFsaWRhdGVzIGxhc3QgdGFnLgotICBwcm90ZWN0ZWQgc3RhdGljIDxUIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZUxpdGU8VCwgPz4+IFQgcGFyc2VEZWxpbWl0ZWRGcm9tKAotICAgICAgVCBkZWZhdWx0SW5zdGFuY2UsIElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gY2hlY2tNZXNzYWdlSW5pdGlhbGl6ZWQoCi0gICAgICAgIHBhcnNlUGFydGlhbERlbGltaXRlZEZyb20oZGVmYXVsdEluc3RhbmNlLCBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgPFQgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZTxULCA/Pj4gVCBwYXJzZVBhcnRpYWxEZWxpbWl0ZWRGcm9tKAotICAgICAgVCBkZWZhdWx0SW5zdGFuY2UsCi0gICAgICBJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIGludCBzaXplOwotICAgIHRyeSB7Ci0gICAgICBpbnQgZmlyc3RCeXRlID0gaW5wdXQucmVhZCgpOwotICAgICAgaWYgKGZpcnN0Qnl0ZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHNpemUgPSBDb2RlZElucHV0U3RyZWFtLnJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgSW5wdXRTdHJlYW0gbGltaXRlZElucHV0ID0gbmV3IExpbWl0ZWRJbnB1dFN0cmVhbShpbnB1dCwgc2l6ZSk7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZElucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShsaW1pdGVkSW5wdXQpOwotICAgIFQgbWVzc2FnZSA9IHBhcnNlUGFydGlhbEZyb20oZGVmYXVsdEluc3RhbmNlLCBjb2RlZElucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgdHJ5IHsKLSAgICAgIGNvZGVkSW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKG1lc3NhZ2UpOwotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBBbiBhYnN0cmFjdCB2aXNpdG9yIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGNhbGxzIGludG8gdGhhdCB3ZSB1c2UgdG8gaW1wbGVtZW50IHZhcmlvdXMKLSAgICogZmVhdHVyZXMuIEZpZWxkcyB0aGF0IGFyZSBub3QgbWVtYmVycyBvZiBvbmVvZnMgYXJlIGFsd2F5cyB2aXNpdGVkLiBNZW1iZXJzIG9mIGEgb25lb2YgYXJlIG9ubHkKLSAgICogdmlzaXRlZCB3aGVuIHRoZXkgYXJlIHRoZSBzZXQgb25lb2YgY2FzZSB2YWx1ZSBvbiB0aGUgIm90aGVyIiBwcm90by4gVGhlIHZpc2l0T25lb2ZOb3RTZXQKLSAgICogbWV0aG9kIGlzIGludm9rZWQgaWYgb3RoZXIncyBvbmVvZiBjYXNlIGlzIG5vdCBzZXQuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50ZXJmYWNlIFZpc2l0b3IgewotICAgIGJvb2xlYW4gdmlzaXRCb29sZWFuKGJvb2xlYW4gbWluZVByZXNlbnQsIGJvb2xlYW4gbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIGJvb2xlYW4gb3RoZXIpOwotICAgIGludCB2aXNpdEludChib29sZWFuIG1pbmVQcmVzZW50LCBpbnQgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIGludCBvdGhlcik7Ci0gICAgZG91YmxlIHZpc2l0RG91YmxlKGJvb2xlYW4gbWluZVByZXNlbnQsIGRvdWJsZSBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgZG91YmxlIG90aGVyKTsKLSAgICBmbG9hdCB2aXNpdEZsb2F0KGJvb2xlYW4gbWluZVByZXNlbnQsIGZsb2F0IG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBmbG9hdCBvdGhlcik7Ci0gICAgbG9uZyB2aXNpdExvbmcoYm9vbGVhbiBtaW5lUHJlc2VudCwgbG9uZyBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgbG9uZyBvdGhlcik7Ci0gICAgU3RyaW5nIHZpc2l0U3RyaW5nKGJvb2xlYW4gbWluZVByZXNlbnQsIFN0cmluZyBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgU3RyaW5nIG90aGVyKTsKLSAgICBCeXRlU3RyaW5nIHZpc2l0Qnl0ZVN0cmluZygKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgQnl0ZVN0cmluZyBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgQnl0ZVN0cmluZyBvdGhlcik7Ci0KLSAgICBPYmplY3QgdmlzaXRPbmVvZkJvb2xlYW4oYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcik7Ci0gICAgT2JqZWN0IHZpc2l0T25lb2ZJbnQoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcik7Ci0gICAgT2JqZWN0IHZpc2l0T25lb2ZEb3VibGUoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcik7Ci0gICAgT2JqZWN0IHZpc2l0T25lb2ZGbG9hdChib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKTsKLSAgICBPYmplY3QgdmlzaXRPbmVvZkxvbmcoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcik7Ci0gICAgT2JqZWN0IHZpc2l0T25lb2ZTdHJpbmcoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcik7Ci0gICAgT2JqZWN0IHZpc2l0T25lb2ZCeXRlU3RyaW5nKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpOwotICAgIE9iamVjdCB2aXNpdE9uZW9mTGF6eU1lc3NhZ2UoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcik7Ci0gICAgT2JqZWN0IHZpc2l0T25lb2ZNZXNzYWdlKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpOwotICAgIHZvaWQgdmlzaXRPbmVvZk5vdFNldChib29sZWFuIG1pbmVQcmVzZW50KTsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXNzYWdlIGZpZWxkcyB1c2UgbnVsbCBzZW50aW5hbHMuCi0gICAgICovCi0gICAgPFQgZXh0ZW5kcyBNZXNzYWdlTGl0ZT4gVCB2aXNpdE1lc3NhZ2UoVCBtaW5lLCBUIG90aGVyKTsKLSAgICBMYXp5RmllbGRMaXRlIHZpc2l0TGF6eU1lc3NhZ2UoCi0gICAgICAgIGJvb2xlYW4gbWluZVByZXNlbnQsIExhenlGaWVsZExpdGUgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIExhenlGaWVsZExpdGUgb3RoZXIpOwotCi0gICAgPFQ+IFByb3RvYnVmTGlzdDxUPiB2aXNpdExpc3QoUHJvdG9idWZMaXN0PFQ+IG1pbmUsIFByb3RvYnVmTGlzdDxUPiBvdGhlcik7Ci0gICAgQm9vbGVhbkxpc3QgdmlzaXRCb29sZWFuTGlzdChCb29sZWFuTGlzdCBtaW5lLCBCb29sZWFuTGlzdCBvdGhlcik7Ci0gICAgSW50TGlzdCB2aXNpdEludExpc3QoSW50TGlzdCBtaW5lLCBJbnRMaXN0IG90aGVyKTsKLSAgICBEb3VibGVMaXN0IHZpc2l0RG91YmxlTGlzdChEb3VibGVMaXN0IG1pbmUsIERvdWJsZUxpc3Qgb3RoZXIpOwotICAgIEZsb2F0TGlzdCB2aXNpdEZsb2F0TGlzdChGbG9hdExpc3QgbWluZSwgRmxvYXRMaXN0IG90aGVyKTsKLSAgICBMb25nTGlzdCB2aXNpdExvbmdMaXN0KExvbmdMaXN0IG1pbmUsIExvbmdMaXN0IG90aGVyKTsKLSAgICBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiB2aXNpdEV4dGVuc2lvbnMoCi0gICAgICAgIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IG1pbmUsIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IG90aGVyKTsKLSAgICBVbmtub3duRmllbGRTZXRMaXRlIHZpc2l0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXRMaXRlIG1pbmUsIFVua25vd25GaWVsZFNldExpdGUgb3RoZXIpOwotICAgIDxLLCBWPiBNYXBGaWVsZExpdGU8SywgVj4gdmlzaXRNYXAoTWFwRmllbGRMaXRlPEssIFY+IG1pbmUsIE1hcEZpZWxkTGl0ZTxLLCBWPiBvdGhlcik7Ci0gIH0KLQotICAvKioKLSAgICogSW1wbGVtZW50cyBlcXVhbHMuIFRocm93cyBhIHtAbGluayBOb3RFcXVhbHNFeGNlcHRpb259IHdoZW4gbm90IGVxdWFsLgotICAgKi8KLSAgc3RhdGljIGNsYXNzIEVxdWFsc1Zpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIHsKLQotICAgIHN0YXRpYyBmaW5hbCBjbGFzcyBOb3RFcXVhbHNFeGNlcHRpb24gZXh0ZW5kcyBSdW50aW1lRXhjZXB0aW9uIHt9Ci0KLSAgICBzdGF0aWMgZmluYWwgRXF1YWxzVmlzaXRvciBJTlNUQU5DRSA9IG5ldyBFcXVhbHNWaXNpdG9yKCk7Ci0KLSAgICBzdGF0aWMgZmluYWwgTm90RXF1YWxzRXhjZXB0aW9uIE5PVF9FUVVBTFMgPSBuZXcgTm90RXF1YWxzRXhjZXB0aW9uKCk7Ci0KLSAgICBwcml2YXRlIEVxdWFsc1Zpc2l0b3IoKSB7fQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXRCb29sZWFuKAotICAgICAgICBib29sZWFuIG1pbmVQcmVzZW50LCBib29sZWFuIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBib29sZWFuIG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgIT0gb3RoZXJQcmVzZW50IHx8IG1pbmUgIT0gb3RoZXIpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgdmlzaXRJbnQoYm9vbGVhbiBtaW5lUHJlc2VudCwgaW50IG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBpbnQgb3RoZXIpIHsKLSAgICAgIGlmIChtaW5lUHJlc2VudCAhPSBvdGhlclByZXNlbnQgfHwgbWluZSAhPSBvdGhlcikgewotICAgICAgICB0aHJvdyBOT1RfRVFVQUxTOwotICAgICAgfQotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGRvdWJsZSB2aXNpdERvdWJsZSgKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgZG91YmxlIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBkb3VibGUgb3RoZXIpIHsKLSAgICAgIGlmIChtaW5lUHJlc2VudCAhPSBvdGhlclByZXNlbnQgfHwgbWluZSAhPSBvdGhlcikgewotICAgICAgICB0aHJvdyBOT1RfRVFVQUxTOwotICAgICAgfQotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IHZpc2l0RmxvYXQoYm9vbGVhbiBtaW5lUHJlc2VudCwgZmxvYXQgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIGZsb2F0IG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgIT0gb3RoZXJQcmVzZW50IHx8IG1pbmUgIT0gb3RoZXIpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIHZpc2l0TG9uZyhib29sZWFuIG1pbmVQcmVzZW50LCBsb25nIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBsb25nIG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgIT0gb3RoZXJQcmVzZW50IHx8IG1pbmUgIT0gb3RoZXIpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdmlzaXRTdHJpbmcoCi0gICAgICAgIGJvb2xlYW4gbWluZVByZXNlbnQsIFN0cmluZyBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgU3RyaW5nIG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgIT0gb3RoZXJQcmVzZW50IHx8ICFtaW5lLmVxdWFscyhvdGhlcikpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCeXRlU3RyaW5nIHZpc2l0Qnl0ZVN0cmluZygKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgQnl0ZVN0cmluZyBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgQnl0ZVN0cmluZyBvdGhlcikgewotICAgICAgaWYgKG1pbmVQcmVzZW50ICE9IG90aGVyUHJlc2VudCB8fCAhbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHRocm93IE5PVF9FUVVBTFM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZCb29sZWFuKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGlmIChtaW5lUHJlc2VudCAmJiBtaW5lLmVxdWFscyhvdGhlcikpIHsKLSAgICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgICB9Ci0gICAgICB0aHJvdyBOT1RfRVFVQUxTOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXRPbmVvZkludChib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgJiYgbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHJldHVybiBtaW5lOwotICAgICAgfQotICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZEb3VibGUoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgaWYgKG1pbmVQcmVzZW50ICYmIG1pbmUuZXF1YWxzKG90aGVyKSkgewotICAgICAgICByZXR1cm4gbWluZTsKLSAgICAgIH0KLSAgICAgIHRocm93IE5PVF9FUVVBTFM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mRmxvYXQoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgaWYgKG1pbmVQcmVzZW50ICYmIG1pbmUuZXF1YWxzKG90aGVyKSkgewotICAgICAgICByZXR1cm4gbWluZTsKLSAgICAgIH0KLSAgICAgIHRocm93IE5PVF9FUVVBTFM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mTG9uZyhib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgJiYgbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHJldHVybiBtaW5lOwotICAgICAgfQotICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZTdHJpbmcoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgaWYgKG1pbmVQcmVzZW50ICYmIG1pbmUuZXF1YWxzKG90aGVyKSkgewotICAgICAgICByZXR1cm4gbWluZTsKLSAgICAgIH0KLSAgICAgIHRocm93IE5PVF9FUVVBTFM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mQnl0ZVN0cmluZyhib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgJiYgbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHJldHVybiBtaW5lOwotICAgICAgfQotICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZMYXp5TWVzc2FnZShib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgJiYgbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHJldHVybiBtaW5lOwotICAgICAgfQotICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mTWVzc2FnZShib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQgJiYgKChHZW5lcmF0ZWRNZXNzYWdlTGl0ZTw/LCA/PikgbWluZSkuZXF1YWxzKHRoaXMsIChNZXNzYWdlTGl0ZSkgb3RoZXIpKSB7Ci0gICAgICAgIHJldHVybiBtaW5lOwotICAgICAgfQotICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgdmlzaXRPbmVvZk5vdFNldChib29sZWFuIG1pbmVQcmVzZW50KSB7Ci0gICAgICBpZiAobWluZVByZXNlbnQpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQgZXh0ZW5kcyBNZXNzYWdlTGl0ZT4gVCB2aXNpdE1lc3NhZ2UoVCBtaW5lLCBUIG90aGVyKSB7Ci0gICAgICBpZiAobWluZSA9PSBudWxsICYmIG90aGVyID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtaW5lID09IG51bGwgfHwgb3RoZXIgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBOT1RfRVFVQUxTOwotICAgICAgfQotCi0gICAgICAoKEdlbmVyYXRlZE1lc3NhZ2VMaXRlPD8sID8+KSBtaW5lKS5lcXVhbHModGhpcywgb3RoZXIpOwotCi0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExhenlGaWVsZExpdGUgdmlzaXRMYXp5TWVzc2FnZSgKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgTGF6eUZpZWxkTGl0ZSBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgTGF6eUZpZWxkTGl0ZSBvdGhlcikgewotICAgICAgaWYgKCFtaW5lUHJlc2VudCAmJiAhb3RoZXJQcmVzZW50KSB7Ci0gICAgICAgIHJldHVybiBtaW5lOwotICAgICAgfSBlbHNlIGlmIChtaW5lUHJlc2VudCAmJiBvdGhlclByZXNlbnQgJiYgbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHJldHVybiBtaW5lOwotICAgICAgfQotICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQ+IFByb3RvYnVmTGlzdDxUPiB2aXNpdExpc3QoUHJvdG9idWZMaXN0PFQ+IG1pbmUsIFByb3RvYnVmTGlzdDxUPiBvdGhlcikgewotICAgICAgaWYgKCFtaW5lLmVxdWFscyhvdGhlcikpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuTGlzdCB2aXNpdEJvb2xlYW5MaXN0KEJvb2xlYW5MaXN0IG1pbmUsIEJvb2xlYW5MaXN0IG90aGVyKSB7Ci0gICAgICBpZiAoIW1pbmUuZXF1YWxzKG90aGVyKSkgewotICAgICAgICB0aHJvdyBOT1RfRVFVQUxTOwotICAgICAgfQotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEludExpc3QgdmlzaXRJbnRMaXN0KEludExpc3QgbWluZSwgSW50TGlzdCBvdGhlcikgewotICAgICAgaWYgKCFtaW5lLmVxdWFscyhvdGhlcikpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEb3VibGVMaXN0IHZpc2l0RG91YmxlTGlzdChEb3VibGVMaXN0IG1pbmUsIERvdWJsZUxpc3Qgb3RoZXIpIHsKLSAgICAgIGlmICghbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHRocm93IE5PVF9FUVVBTFM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmxvYXRMaXN0IHZpc2l0RmxvYXRMaXN0KEZsb2F0TGlzdCBtaW5lLCBGbG9hdExpc3Qgb3RoZXIpIHsKLSAgICAgIGlmICghbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHRocm93IE5PVF9FUVVBTFM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTG9uZ0xpc3QgdmlzaXRMb25nTGlzdChMb25nTGlzdCBtaW5lLCBMb25nTGlzdCBvdGhlcikgewotICAgICAgaWYgKCFtaW5lLmVxdWFscyhvdGhlcikpIHsKLSAgICAgICAgdGhyb3cgTk9UX0VRVUFMUzsKLSAgICAgIH0KLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiB2aXNpdEV4dGVuc2lvbnMoCi0gICAgICAgIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IG1pbmUsCi0gICAgICAgIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IG90aGVyKSB7Ci0gICAgICBpZiAoIW1pbmUuZXF1YWxzKG90aGVyKSkgewotICAgICAgICB0aHJvdyBOT1RfRVFVQUxTOwotICAgICAgfQotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVua25vd25GaWVsZFNldExpdGUgdmlzaXRVbmtub3duRmllbGRzKAotICAgICAgICBVbmtub3duRmllbGRTZXRMaXRlIG1pbmUsCi0gICAgICAgIFVua25vd25GaWVsZFNldExpdGUgb3RoZXIpIHsKLSAgICAgIGlmICghbWluZS5lcXVhbHMob3RoZXIpKSB7Ci0gICAgICAgIHRocm93IE5PVF9FUVVBTFM7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEssIFY+IE1hcEZpZWxkTGl0ZTxLLCBWPiB2aXNpdE1hcChNYXBGaWVsZExpdGU8SywgVj4gbWluZSwgTWFwRmllbGRMaXRlPEssIFY+IG90aGVyKSB7Ci0gICAgICBpZiAoIW1pbmUuZXF1YWxzKG90aGVyKSkgewotICAgICAgICB0aHJvdyBOT1RfRVFVQUxTOwotICAgICAgfQotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgaGFzaENvZGUgYnkgYWNjdW11bGF0aW5nIHN0YXRlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgSGFzaENvZGVWaXNpdG9yIGltcGxlbWVudHMgVmlzaXRvciB7Ci0KLSAgICAvLyBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGhlIHZpc2l0b3IgaXMgaW52b2tlZCBwYXJhbWV0ZXJpemVkIHdpdGggdGhpcyBhbmQgdGhpcyBzdWNoIHRoYXQKLSAgICAvLyBvdGhlciBpcyB0aGlzLiBUaGlzIGlzIHJlcXVpcmVkIGR1ZSB0byBob3cgb25lb2YgY2FzZXMgYXJlIGhhbmRsZWQuIFNlZSB0aGUgY2xhc3MgY29tbWVudAotICAgIC8vIG9uIFZpc2l0b3IgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0gICAgCi0gICAgcHJpdmF0ZSBpbnQgaGFzaENvZGUgPSAwOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXRCb29sZWFuKAotICAgICAgICBib29sZWFuIG1pbmVQcmVzZW50LCBib29sZWFuIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBib29sZWFuIG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIEludGVybmFsLmhhc2hCb29sZWFuKG1pbmUpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCB2aXNpdEludChib29sZWFuIG1pbmVQcmVzZW50LCBpbnQgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIGludCBvdGhlcikgewotICAgICAgaGFzaENvZGUgPSAoNTMgKiBoYXNoQ29kZSkgKyBtaW5lOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGRvdWJsZSB2aXNpdERvdWJsZSgKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgZG91YmxlIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBkb3VibGUgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgSW50ZXJuYWwuaGFzaExvbmcoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMobWluZSkpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IHZpc2l0RmxvYXQoYm9vbGVhbiBtaW5lUHJlc2VudCwgZmxvYXQgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIGZsb2F0IG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKG1pbmUpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGxvbmcgdmlzaXRMb25nKGJvb2xlYW4gbWluZVByZXNlbnQsIGxvbmcgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIGxvbmcgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgSW50ZXJuYWwuaGFzaExvbmcobWluZSk7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHZpc2l0U3RyaW5nKAotICAgICAgICBib29sZWFuIG1pbmVQcmVzZW50LCBTdHJpbmcgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIFN0cmluZyBvdGhlcikgewotICAgICAgaGFzaENvZGUgPSAoNTMgKiBoYXNoQ29kZSkgKyBtaW5lLmhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnl0ZVN0cmluZyB2aXNpdEJ5dGVTdHJpbmcoCi0gICAgICAgIGJvb2xlYW4gbWluZVByZXNlbnQsIEJ5dGVTdHJpbmcgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIEJ5dGVTdHJpbmcgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mQm9vbGVhbihib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIEludGVybmFsLmhhc2hCb29sZWFuKCgoQm9vbGVhbikgbWluZSkpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mSW50KGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgKEludGVnZXIpIG1pbmU7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZEb3VibGUoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgaGFzaENvZGUgPSAoNTMgKiBoYXNoQ29kZSkgKyBJbnRlcm5hbC5oYXNoTG9uZyhEb3VibGUuZG91YmxlVG9Mb25nQml0cygoRG91YmxlKSBtaW5lKSk7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZGbG9hdChib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKChGbG9hdCkgbWluZSk7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZMb25nKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgSW50ZXJuYWwuaGFzaExvbmcoKExvbmcpIG1pbmUpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mU3RyaW5nKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mQnl0ZVN0cmluZyhib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIG1pbmUuaGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXRPbmVvZkxhenlNZXNzYWdlKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXRPbmVvZk1lc3NhZ2UoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIHZpc2l0TWVzc2FnZSgoTWVzc2FnZUxpdGUpIG1pbmUsIChNZXNzYWdlTGl0ZSkgb3RoZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHZpc2l0T25lb2ZOb3RTZXQoYm9vbGVhbiBtaW5lUHJlc2VudCkgewotICAgICAgaWYgKG1pbmVQcmVzZW50KSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsgLy8gQ2FuJ3QgaGFwcGVuIGlmIG90aGVyID09IHRoaXMuIAotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VCBleHRlbmRzIE1lc3NhZ2VMaXRlPiBUIHZpc2l0TWVzc2FnZShUIG1pbmUsIFQgb3RoZXIpIHsKLSAgICAgIGZpbmFsIGludCBwcm90b0hhc2g7Ci0gICAgICBpZiAobWluZSAhPSBudWxsKSB7Ci0gICAgICAgIGlmIChtaW5lIGluc3RhbmNlb2YgR2VuZXJhdGVkTWVzc2FnZUxpdGUpIHsKLSAgICAgICAgICBwcm90b0hhc2ggPSAoKEdlbmVyYXRlZE1lc3NhZ2VMaXRlKSBtaW5lKS5oYXNoQ29kZSh0aGlzKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBwcm90b0hhc2ggPSBtaW5lLmhhc2hDb2RlKCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByb3RvSGFzaCA9IDM3OwotICAgICAgfQotICAgICAgaGFzaENvZGUgPSAoNTMgKiBoYXNoQ29kZSkgKyBwcm90b0hhc2g7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTGF6eUZpZWxkTGl0ZSB2aXNpdExhenlNZXNzYWdlKAotICAgICAgICBib29sZWFuIG1pbmVQcmVzZW50LCBMYXp5RmllbGRMaXRlIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBMYXp5RmllbGRMaXRlIG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIG1pbmUuaGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8VD4gUHJvdG9idWZMaXN0PFQ+IHZpc2l0TGlzdChQcm90b2J1Zkxpc3Q8VD4gbWluZSwgUHJvdG9idWZMaXN0PFQ+IG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIG1pbmUuaGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCb29sZWFuTGlzdCB2aXNpdEJvb2xlYW5MaXN0KEJvb2xlYW5MaXN0IG1pbmUsIEJvb2xlYW5MaXN0IG90aGVyKSB7Ci0gICAgICBoYXNoQ29kZSA9ICg1MyAqIGhhc2hDb2RlKSArIG1pbmUuaGFzaENvZGUoKTsKLSAgICAgIHJldHVybiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJbnRMaXN0IHZpc2l0SW50TGlzdChJbnRMaXN0IG1pbmUsIEludExpc3Qgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERvdWJsZUxpc3QgdmlzaXREb3VibGVMaXN0KERvdWJsZUxpc3QgbWluZSwgRG91YmxlTGlzdCBvdGhlcikgewotICAgICAgaGFzaENvZGUgPSAoNTMgKiBoYXNoQ29kZSkgKyBtaW5lLmhhc2hDb2RlKCk7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRmxvYXRMaXN0IHZpc2l0RmxvYXRMaXN0KEZsb2F0TGlzdCBtaW5lLCBGbG9hdExpc3Qgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExvbmdMaXN0IHZpc2l0TG9uZ0xpc3QoTG9uZ0xpc3QgbWluZSwgTG9uZ0xpc3Qgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IHZpc2l0RXh0ZW5zaW9ucygKLSAgICAgICAgRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gbWluZSwKLSAgICAgICAgRmllbGRTZXQ8RXh0ZW5zaW9uRGVzY3JpcHRvcj4gb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFVua25vd25GaWVsZFNldExpdGUgdmlzaXRVbmtub3duRmllbGRzKAotICAgICAgICBVbmtub3duRmllbGRTZXRMaXRlIG1pbmUsCi0gICAgICAgIFVua25vd25GaWVsZFNldExpdGUgb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyA8SywgVj4gTWFwRmllbGRMaXRlPEssIFY+IHZpc2l0TWFwKE1hcEZpZWxkTGl0ZTxLLCBWPiBtaW5lLCBNYXBGaWVsZExpdGU8SywgVj4gb3RoZXIpIHsKLSAgICAgIGhhc2hDb2RlID0gKDUzICogaGFzaENvZGUpICsgbWluZS5oYXNoQ29kZSgpOwotICAgICAgcmV0dXJuIG1pbmU7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEltcGxlbWVudHMgZmllbGQgbWVyZ2luZyBzZW1hbnRpY3Mgb3ZlciB0aGUgdmlzaXRvciBpbnRlcmZhY2UuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGNsYXNzIE1lcmdlRnJvbVZpc2l0b3IgaW1wbGVtZW50cyBWaXNpdG9yIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgTWVyZ2VGcm9tVmlzaXRvciBJTlNUQU5DRSA9IG5ldyBNZXJnZUZyb21WaXNpdG9yKCk7Ci0KLSAgICBwcml2YXRlIE1lcmdlRnJvbVZpc2l0b3IoKSB7fQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gdmlzaXRCb29sZWFuKAotICAgICAgICBib29sZWFuIG1pbmVQcmVzZW50LCBib29sZWFuIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBib29sZWFuIG90aGVyKSB7Ci0gICAgICByZXR1cm4gb3RoZXJQcmVzZW50ID8gb3RoZXIgOiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgdmlzaXRJbnQoYm9vbGVhbiBtaW5lUHJlc2VudCwgaW50IG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBpbnQgb3RoZXIpIHsKLSAgICAgIHJldHVybiBvdGhlclByZXNlbnQgPyBvdGhlciA6IG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGRvdWJsZSB2aXNpdERvdWJsZSgKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgZG91YmxlIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBkb3VibGUgb3RoZXIpIHsKLSAgICAgIHJldHVybiBvdGhlclByZXNlbnQgPyBvdGhlciA6IG1pbmU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZsb2F0IHZpc2l0RmxvYXQoYm9vbGVhbiBtaW5lUHJlc2VudCwgZmxvYXQgbWluZSwgYm9vbGVhbiBvdGhlclByZXNlbnQsIGZsb2F0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gb3RoZXJQcmVzZW50ID8gb3RoZXIgOiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIHZpc2l0TG9uZyhib29sZWFuIG1pbmVQcmVzZW50LCBsb25nIG1pbmUsIGJvb2xlYW4gb3RoZXJQcmVzZW50LCBsb25nIG90aGVyKSB7Ci0gICAgICByZXR1cm4gb3RoZXJQcmVzZW50ID8gb3RoZXIgOiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdmlzaXRTdHJpbmcoCi0gICAgICAgIGJvb2xlYW4gbWluZVByZXNlbnQsIFN0cmluZyBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgU3RyaW5nIG90aGVyKSB7Ci0gICAgICByZXR1cm4gb3RoZXJQcmVzZW50ID8gb3RoZXIgOiBtaW5lOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCeXRlU3RyaW5nIHZpc2l0Qnl0ZVN0cmluZygKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgQnl0ZVN0cmluZyBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgQnl0ZVN0cmluZyBvdGhlcikgewotICAgICAgcmV0dXJuIG90aGVyUHJlc2VudCA/IG90aGVyIDogbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZCb29sZWFuKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIHJldHVybiBvdGhlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZJbnQoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIG90aGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXRPbmVvZkRvdWJsZShib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gb3RoZXI7ICAgICAgCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mRmxvYXQoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIG90aGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXRPbmVvZkxvbmcoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgcmV0dXJuIG90aGVyOyAgICAgIAotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgdmlzaXRPbmVvZlN0cmluZyhib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gb3RoZXI7ICAgICAgCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mQnl0ZVN0cmluZyhib29sZWFuIG1pbmVQcmVzZW50LCBPYmplY3QgbWluZSwgT2JqZWN0IG90aGVyKSB7Ci0gICAgICByZXR1cm4gb3RoZXI7ICAgICAgCi0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCB2aXNpdE9uZW9mTGF6eU1lc3NhZ2UoYm9vbGVhbiBtaW5lUHJlc2VudCwgT2JqZWN0IG1pbmUsIE9iamVjdCBvdGhlcikgewotICAgICAgaWYgKG1pbmVQcmVzZW50KSB7Ci0gICAgICAgIExhenlGaWVsZExpdGUgbGF6eSA9IChMYXp5RmllbGRMaXRlKSBtaW5lOwotICAgICAgICBsYXp5Lm1lcmdlKChMYXp5RmllbGRMaXRlKSBvdGhlcik7Ci0gICAgICAgIHJldHVybiBsYXp5OwotICAgICAgfQotICAgICAgcmV0dXJuIG90aGVyOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHZpc2l0T25lb2ZNZXNzYWdlKGJvb2xlYW4gbWluZVByZXNlbnQsIE9iamVjdCBtaW5lLCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGlmIChtaW5lUHJlc2VudCkgewotICAgICAgICByZXR1cm4gdmlzaXRNZXNzYWdlKChNZXNzYWdlTGl0ZSkgbWluZSwgKE1lc3NhZ2VMaXRlKSBvdGhlcik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gb3RoZXI7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHZpc2l0T25lb2ZOb3RTZXQoYm9vbGVhbiBtaW5lUHJlc2VudCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBHdWFyYW50ZWVkIGJ5IHJ1bnRpbWUuCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IFQgdmlzaXRNZXNzYWdlKFQgbWluZSwgVCBvdGhlcikgewotICAgICAgaWYgKG1pbmUgIT0gbnVsbCAmJiBvdGhlciAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiAoVCkgbWluZS50b0J1aWxkZXIoKS5tZXJnZUZyb20ob3RoZXIpLmJ1aWxkKCk7Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBtaW5lICE9IG51bGwgPyBtaW5lIDogb3RoZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIExhenlGaWVsZExpdGUgdmlzaXRMYXp5TWVzc2FnZSgKLSAgICAgICAgYm9vbGVhbiBtaW5lUHJlc2VudCwgTGF6eUZpZWxkTGl0ZSBtaW5lLCBib29sZWFuIG90aGVyUHJlc2VudCwgTGF6eUZpZWxkTGl0ZSBvdGhlcikgewotICAgICAgLy8gTGF6eUZpZWxkTGl0ZSdzIGFyZSBuZXZlciBudWxsIHNvIHdlIGNhbiBqdXN0IGNvcHkgYWNyb3NzLiBOZWNlc3NhcnkgdG8gYXZvaWQgbGVha2FnZQotICAgICAgLy8gZnJvbSBidWlsZGVyIGludG8gaW1tdXRhYmxlIG1lc3NhZ2UuCi0gICAgICAvLyBUT0RPKGR3ZWlzKTogQ2hhbmdlIHRvIG51bGwgc2VudGluZWxzPwotICAgICAgbWluZS5tZXJnZShvdGhlcik7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQ+IFByb3RvYnVmTGlzdDxUPiB2aXNpdExpc3QoUHJvdG9idWZMaXN0PFQ+IG1pbmUsIFByb3RvYnVmTGlzdDxUPiBvdGhlcikgewotICAgICAgaW50IHNpemUgPSBtaW5lLnNpemUoKTsKLSAgICAgIGludCBvdGhlclNpemUgPSBvdGhlci5zaXplKCk7Ci0gICAgICBpZiAoc2l6ZSA+IDAgJiYgb3RoZXJTaXplID4gMCkgewotICAgICAgICBpZiAoIW1pbmUuaXNNb2RpZmlhYmxlKCkpIHsKLSAgICAgICAgICBtaW5lID0gbWluZS5tdXRhYmxlQ29weVdpdGhDYXBhY2l0eShzaXplICsgb3RoZXJTaXplKTsKLSAgICAgICAgfQotICAgICAgICBtaW5lLmFkZEFsbChvdGhlcik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiBzaXplID4gMCA/IG1pbmUgOiBvdGhlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQm9vbGVhbkxpc3QgdmlzaXRCb29sZWFuTGlzdChCb29sZWFuTGlzdCBtaW5lLCBCb29sZWFuTGlzdCBvdGhlcikgewotICAgICAgaW50IHNpemUgPSBtaW5lLnNpemUoKTsKLSAgICAgIGludCBvdGhlclNpemUgPSBvdGhlci5zaXplKCk7Ci0gICAgICBpZiAoc2l6ZSA+IDAgJiYgb3RoZXJTaXplID4gMCkgewotICAgICAgICBpZiAoIW1pbmUuaXNNb2RpZmlhYmxlKCkpIHsKLSAgICAgICAgICBtaW5lID0gbWluZS5tdXRhYmxlQ29weVdpdGhDYXBhY2l0eShzaXplICsgb3RoZXJTaXplKTsKLSAgICAgICAgfQotICAgICAgICBtaW5lLmFkZEFsbChvdGhlcik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIHJldHVybiBzaXplID4gMCA/IG1pbmUgOiBvdGhlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSW50TGlzdCB2aXNpdEludExpc3QoSW50TGlzdCBtaW5lLCBJbnRMaXN0IG90aGVyKSB7Ci0gICAgICBpbnQgc2l6ZSA9IG1pbmUuc2l6ZSgpOwotICAgICAgaW50IG90aGVyU2l6ZSA9IG90aGVyLnNpemUoKTsKLSAgICAgIGlmIChzaXplID4gMCAmJiBvdGhlclNpemUgPiAwKSB7Ci0gICAgICAgIGlmICghbWluZS5pc01vZGlmaWFibGUoKSkgewotICAgICAgICAgIG1pbmUgPSBtaW5lLm11dGFibGVDb3B5V2l0aENhcGFjaXR5KHNpemUgKyBvdGhlclNpemUpOwotICAgICAgICB9Ci0gICAgICAgIG1pbmUuYWRkQWxsKG90aGVyKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHNpemUgPiAwID8gbWluZSA6IG90aGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEb3VibGVMaXN0IHZpc2l0RG91YmxlTGlzdChEb3VibGVMaXN0IG1pbmUsIERvdWJsZUxpc3Qgb3RoZXIpIHsKLSAgICAgIGludCBzaXplID0gbWluZS5zaXplKCk7Ci0gICAgICBpbnQgb3RoZXJTaXplID0gb3RoZXIuc2l6ZSgpOwotICAgICAgaWYgKHNpemUgPiAwICYmIG90aGVyU2l6ZSA+IDApIHsKLSAgICAgICAgaWYgKCFtaW5lLmlzTW9kaWZpYWJsZSgpKSB7Ci0gICAgICAgICAgbWluZSA9IG1pbmUubXV0YWJsZUNvcHlXaXRoQ2FwYWNpdHkoc2l6ZSArIG90aGVyU2l6ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgbWluZS5hZGRBbGwob3RoZXIpOwotICAgICAgfQotICAgICAgCi0gICAgICByZXR1cm4gc2l6ZSA+IDAgPyBtaW5lIDogb3RoZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEZsb2F0TGlzdCB2aXNpdEZsb2F0TGlzdChGbG9hdExpc3QgbWluZSwgRmxvYXRMaXN0IG90aGVyKSB7Ci0gICAgICBpbnQgc2l6ZSA9IG1pbmUuc2l6ZSgpOwotICAgICAgaW50IG90aGVyU2l6ZSA9IG90aGVyLnNpemUoKTsKLSAgICAgIGlmIChzaXplID4gMCAmJiBvdGhlclNpemUgPiAwKSB7Ci0gICAgICAgIGlmICghbWluZS5pc01vZGlmaWFibGUoKSkgewotICAgICAgICAgIG1pbmUgPSBtaW5lLm11dGFibGVDb3B5V2l0aENhcGFjaXR5KHNpemUgKyBvdGhlclNpemUpOwotICAgICAgICB9Ci0gICAgICAgIG1pbmUuYWRkQWxsKG90aGVyKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHNpemUgPiAwID8gbWluZSA6IG90aGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMb25nTGlzdCB2aXNpdExvbmdMaXN0KExvbmdMaXN0IG1pbmUsIExvbmdMaXN0IG90aGVyKSB7Ci0gICAgICBpbnQgc2l6ZSA9IG1pbmUuc2l6ZSgpOwotICAgICAgaW50IG90aGVyU2l6ZSA9IG90aGVyLnNpemUoKTsKLSAgICAgIGlmIChzaXplID4gMCAmJiBvdGhlclNpemUgPiAwKSB7Ci0gICAgICAgIGlmICghbWluZS5pc01vZGlmaWFibGUoKSkgewotICAgICAgICAgIG1pbmUgPSBtaW5lLm11dGFibGVDb3B5V2l0aENhcGFjaXR5KHNpemUgKyBvdGhlclNpemUpOwotICAgICAgICB9Ci0gICAgICAgIG1pbmUuYWRkQWxsKG90aGVyKTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgcmV0dXJuIHNpemUgPiAwID8gbWluZSA6IG90aGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiB2aXNpdEV4dGVuc2lvbnMoCi0gICAgICAgIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IG1pbmUsCi0gICAgICAgIEZpZWxkU2V0PEV4dGVuc2lvbkRlc2NyaXB0b3I+IG90aGVyKSB7Ci0gICAgICBpZiAobWluZS5pc0ltbXV0YWJsZSgpKSB7Ci0gICAgICAgIG1pbmUgPSBtaW5lLmNsb25lKCk7Ci0gICAgICB9Ci0gICAgICBtaW5lLm1lcmdlRnJvbShvdGhlcik7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0TGl0ZSB2aXNpdFVua25vd25GaWVsZHMoCi0gICAgICAgIFVua25vd25GaWVsZFNldExpdGUgbWluZSwKLSAgICAgICAgVW5rbm93bkZpZWxkU2V0TGl0ZSBvdGhlcikgewotICAgICAgcmV0dXJuIG90aGVyID09IFVua25vd25GaWVsZFNldExpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkKLSAgICAgICAgICA/IG1pbmUgOiBVbmtub3duRmllbGRTZXRMaXRlLm11dGFibGVDb3B5T2YobWluZSwgb3RoZXIpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPEssIFY+IE1hcEZpZWxkTGl0ZTxLLCBWPiB2aXNpdE1hcChNYXBGaWVsZExpdGU8SywgVj4gbWluZSwgTWFwRmllbGRMaXRlPEssIFY+IG90aGVyKSB7Ci0gICAgICBtaW5lLm1lcmdlRnJvbShvdGhlcik7Ci0gICAgICByZXR1cm4gbWluZTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50QXJyYXlMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludEFycmF5TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZDZlY2U1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50QXJyYXlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuSW50TGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgSW50TGlzdH0gb24gdG9wIG9mIGEgcHJpbWl0aXZlIGFycmF5LgotICogCi0gKiBAYXV0aG9yIGR3ZWlzQGdvb2dsZS5jb20gKERhbmllbCBXZWlzKQotICovCi1maW5hbCBjbGFzcyBJbnRBcnJheUxpc3QgZXh0ZW5kcyBBYnN0cmFjdFByb3RvYnVmTGlzdDxJbnRlZ2VyPiBpbXBsZW1lbnRzIEludExpc3QsIFJhbmRvbUFjY2VzcyB7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRBcnJheUxpc3QgRU1QVFlfTElTVCA9IG5ldyBJbnRBcnJheUxpc3QoKTsKLSAgc3RhdGljIHsKLSAgICBFTVBUWV9MSVNULm1ha2VJbW11dGFibGUoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBJbnRBcnJheUxpc3QgZW1wdHlMaXN0KCkgewotICAgIHJldHVybiBFTVBUWV9MSVNUOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBsaXN0LgotICAgKi8KLSAgcHJpdmF0ZSBpbnRbXSBhcnJheTsKLSAgCi0gIC8qKgotICAgKiBUaGUgc2l6ZSBvZiB0aGUgbGlzdCBkaXN0aW5jdCBmcm9tIHRoZSBsZW5ndGggb2YgdGhlIGFycmF5LiBUaGF0IGlzLCBpdCBpcyB0aGUgbnVtYmVyIG9mCi0gICAqIGVsZW1lbnRzIHNldCBpbiB0aGUgbGlzdC4KLSAgICovCi0gIHByaXZhdGUgaW50IHNpemU7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgbXV0YWJsZSB7QGNvZGUgSW50QXJyYXlMaXN0fSB3aXRoIGRlZmF1bHQgY2FwYWNpdHkuCi0gICAqLwotICBJbnRBcnJheUxpc3QoKSB7Ci0gICAgdGhpcyhuZXcgaW50W0RFRkFVTFRfQ0FQQUNJVFldLCAwKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG11dGFibGUge0Bjb2RlIEludEFycmF5TGlzdH0gY29udGFpbmluZyB0aGUgc2FtZSBlbGVtZW50cyBhcyB7QGNvZGUgb3RoZXJ9LgotICAgKi8KLSAgcHJpdmF0ZSBJbnRBcnJheUxpc3QoaW50W10gYXJyYXksIGludCBzaXplKSB7Ci0gICAgdGhpcy5hcnJheSA9IGFycmF5OwotICAgIHRoaXMuc2l6ZSA9IHNpemU7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICBpZiAodGhpcyA9PSBvKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKCEobyBpbnN0YW5jZW9mIEludEFycmF5TGlzdCkpIHsKLSAgICAgIHJldHVybiBzdXBlci5lcXVhbHMobyk7Ci0gICAgfQotICAgIEludEFycmF5TGlzdCBvdGhlciA9IChJbnRBcnJheUxpc3QpIG87Ci0gICAgaWYgKHNpemUgIT0gb3RoZXIuc2l6ZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBmaW5hbCBpbnRbXSBhcnIgPSBvdGhlci5hcnJheTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKGFycmF5W2ldICE9IGFycltpXSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IHJlc3VsdCA9IDE7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIHJlc3VsdCA9ICgzMSAqIHJlc3VsdCkgKyBhcnJheVtpXTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSW50TGlzdCBtdXRhYmxlQ29weVdpdGhDYXBhY2l0eShpbnQgY2FwYWNpdHkpIHsKLSAgICBpZiAoY2FwYWNpdHkgPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgSW50QXJyYXlMaXN0KEFycmF5cy5jb3B5T2YoYXJyYXksIGNhcGFjaXR5KSwgc2l6ZSk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSW50ZWdlciBnZXQoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGdldEludChpbmRleCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRJbnQoaW50IGluZGV4KSB7Ci0gICAgZW5zdXJlSW5kZXhJblJhbmdlKGluZGV4KTsKLSAgICByZXR1cm4gYXJyYXlbaW5kZXhdOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgSW50ZWdlciBzZXQoaW50IGluZGV4LCBJbnRlZ2VyIGVsZW1lbnQpIHsKLSAgICByZXR1cm4gc2V0SW50KGluZGV4LCBlbGVtZW50KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IHNldEludChpbnQgaW5kZXgsIGludCBlbGVtZW50KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgZW5zdXJlSW5kZXhJblJhbmdlKGluZGV4KTsKLSAgICBpbnQgcHJldmlvdXNWYWx1ZSA9IGFycmF5W2luZGV4XTsKLSAgICBhcnJheVtpbmRleF0gPSBlbGVtZW50OwotICAgIHJldHVybiBwcmV2aW91c1ZhbHVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEludGVnZXIgZWxlbWVudCkgewotICAgIGFkZEludChpbmRleCwgZWxlbWVudCk7Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI2FkZChJbnRlZ2VyKX0gYnV0IG1vcmUgZWZmaWNpZW50IGluIHRoYXQgaXQgZG9lc24ndCBib3ggdGhlIGVsZW1lbnQuCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgYWRkSW50KGludCBlbGVtZW50KSB7Ci0gICAgYWRkSW50KHNpemUsIGVsZW1lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNhZGQoaW50LCBJbnRlZ2VyKX0gYnV0IG1vcmUgZWZmaWNpZW50IGluIHRoYXQgaXQgZG9lc24ndCBib3ggdGhlIGVsZW1lbnQuCi0gICAqLwotICBwcml2YXRlIHZvaWQgYWRkSW50KGludCBpbmRleCwgaW50IGVsZW1lbnQpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24obWFrZU91dE9mQm91bmRzRXhjZXB0aW9uTWVzc2FnZShpbmRleCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoc2l6ZSA8IGFycmF5Lmxlbmd0aCkgewotICAgICAgLy8gU2hpZnQgZXZlcnl0aGluZyBvdmVyIHRvIG1ha2Ugcm9vbQotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIGFycmF5LCBpbmRleCArIDEsIHNpemUgLSBpbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJlc2l6ZSB0byAxLjV4IHRoZSBzaXplCi0gICAgICBpbnQgbGVuZ3RoID0gKChzaXplICogMykgLyAyKSArIDE7Ci0gICAgICBpbnRbXSBuZXdBcnJheSA9IG5ldyBpbnRbbGVuZ3RoXTsKLSAgICAgIAotICAgICAgLy8gQ29weSB0aGUgZmlyc3QgcGFydCBkaXJlY3RseQotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgMCwgbmV3QXJyYXksIDAsIGluZGV4KTsKLSAgICAgIAotICAgICAgLy8gQ29weSB0aGUgcmVzdCBzaGlmdGVkIG92ZXIgYnkgb25lIHRvIG1ha2Ugcm9vbQotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIG5ld0FycmF5LCBpbmRleCArIDEsIHNpemUgLSBpbmRleCk7Ci0gICAgICBhcnJheSA9IG5ld0FycmF5OwotICAgIH0KLQotICAgIGFycmF5W2luZGV4XSA9IGVsZW1lbnQ7Ci0gICAgc2l6ZSsrOwotICAgIG1vZENvdW50Kys7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEludGVnZXI+IGNvbGxlY3Rpb24pIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICAKLSAgICBpZiAoY29sbGVjdGlvbiA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgCi0gICAgLy8gV2Ugc3BlY2lhbGl6ZSB3aGVuIGFkZGluZyBhbm90aGVyIEludEFycmF5TGlzdCB0byBhdm9pZCBib3hpbmcgZWxlbWVudHMuCi0gICAgaWYgKCEoY29sbGVjdGlvbiBpbnN0YW5jZW9mIEludEFycmF5TGlzdCkpIHsKLSAgICAgIHJldHVybiBzdXBlci5hZGRBbGwoY29sbGVjdGlvbik7Ci0gICAgfQotICAgIAotICAgIEludEFycmF5TGlzdCBsaXN0ID0gKEludEFycmF5TGlzdCkgY29sbGVjdGlvbjsKLSAgICBpZiAobGlzdC5zaXplID09IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaW50IG92ZXJmbG93ID0gSW50ZWdlci5NQVhfVkFMVUUgLSBzaXplOwotICAgIGlmIChvdmVyZmxvdyA8IGxpc3Quc2l6ZSkgewotICAgICAgLy8gV2UgY2FuJ3QgYWN0dWFsbHkgcmVwcmVzZW50IGEgbGlzdCB0aGlzIGxhcmdlLgotICAgICAgdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3IoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IG5ld1NpemUgPSBzaXplICsgbGlzdC5zaXplOwotICAgIGlmIChuZXdTaXplID4gYXJyYXkubGVuZ3RoKSB7Ci0gICAgICBhcnJheSA9IEFycmF5cy5jb3B5T2YoYXJyYXksIG5ld1NpemUpOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGxpc3QuYXJyYXksIDAsIGFycmF5LCBzaXplLCBsaXN0LnNpemUpOwotICAgIHNpemUgPSBuZXdTaXplOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKG8uZXF1YWxzKGFycmF5W2ldKSkgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpICsgMSwgYXJyYXksIGksIHNpemUgLSBpKTsKLSAgICAgICAgc2l6ZS0tOwotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBJbnRlZ2VyIHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBlbnN1cmVJbmRleEluUmFuZ2UoaW5kZXgpOwotICAgIGludCB2YWx1ZSA9IGFycmF5W2luZGV4XTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCArIDEsIGFycmF5LCBpbmRleCwgc2l6ZSAtIGluZGV4KTsKLSAgICBzaXplLS07Ci0gICAgbW9kQ291bnQrKzsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlcyB0aGF0IHRoZSBwcm92aWRlZCB7QGNvZGUgaW5kZXh9IGlzIHdpdGhpbiB0aGUgcmFuZ2Ugb2Yge0Bjb2RlIFswLCBzaXplXX0uIFRocm93cyBhbgotICAgKiB7QGxpbmsgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0gaWYgaXQgaXMgbm90LgotICAgKiAKLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCB0byB2ZXJpZnkgaXMgaW4gcmFuZ2UKLSAgICovCi0gIHByaXZhdGUgdm9pZCBlbnN1cmVJbmRleEluUmFuZ2UoaW50IGluZGV4KSB7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihtYWtlT3V0T2ZCb3VuZHNFeGNlcHRpb25NZXNzYWdlKGluZGV4KSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgbWFrZU91dE9mQm91bmRzRXhjZXB0aW9uTWVzc2FnZShpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gIkluZGV4OiIgKyBpbmRleCArICIsIFNpemU6IiArIHNpemU7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50ZXJuYWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50ZXJuYWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDFkZTM3NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludGVybmFsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NDEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUaGUgY2xhc3NlcyBjb250YWluZWQgd2l0aGluIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIFByb3RvY29sIEJ1ZmZlcgotICogbGlicmFyeSBhbmQgZ2VuZXJhdGVkIG1lc3NhZ2UgaW1wbGVtZW50YXRpb25zLiBUaGV5IGFyZSBwdWJsaWMgb25seSBiZWNhdXNlCi0gKiB0aG9zZSBnZW5lcmF0ZWQgbWVzc2FnZXMgZG8gbm90IHJlc2lkZSBpbiB0aGUge0Bjb2RlIHByb3RvYnVmfSBwYWNrYWdlLgotICogT3RoZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgSW50ZXJuYWwgewotCi0gIHByaXZhdGUgSW50ZXJuYWwoKSB7fQotCi0gIHN0YXRpYyBmaW5hbCBDaGFyc2V0IFVURl84ID0gQ2hhcnNldC5mb3JOYW1lKCJVVEYtOCIpOwotICBzdGF0aWMgZmluYWwgQ2hhcnNldCBJU09fODg1OV8xID0gQ2hhcnNldC5mb3JOYW1lKCJJU08tODg1OS0xIik7Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gY29uc3RydWN0IGRlZmF1bHQgdmFsdWVzIGZvciBzdHJpbmcKLSAgICogZmllbGRzLgotICAgKiA8cD4KLSAgICogVGhlIHByb3RvY29sIGNvbXBpbGVyIGRvZXMgbm90IGFjdHVhbGx5IGNvbnRhaW4gYSBVVEYtOCBkZWNvZGVyIC0tIGl0Ci0gICAqIGp1c3QgcHVzaGVzIFVURi04LWVuY29kZWQgdGV4dCBhcm91bmQgd2l0aG91dCB0b3VjaGluZyBpdC4gIFRoZSBvbmUgcGxhY2UKLSAgICogd2hlcmUgdGhpcyBwcmVzZW50cyBhIHByb2JsZW0gaXMgd2hlbiBnZW5lcmF0aW5nIEphdmEgc3RyaW5nIGxpdGVyYWxzLgotICAgKiBVbmljb2RlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZyBsaXRlcmFsIHdvdWxkIG5vcm1hbGx5IG5lZWQgdG8gYmUgZW5jb2RlZAotICAgKiB1c2luZyBhIFVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLCB3aGljaCB3b3VsZCByZXF1aXJlIGRlY29kaW5nIHRoZW0uCi0gICAqIFRvIGdldCBhcm91bmQgdGhpcywgcHJvdG9jIGluc3RlYWQgZW1iZWRzIHRoZSBVVEYtOCBieXRlcyBpbnRvIHRoZQotICAgKiBnZW5lcmF0ZWQgY29kZSBhbmQgbGVhdmVzIGl0IHRvIHRoZSBydW50aW1lIGxpYnJhcnkgdG8gZGVjb2RlIHRoZW0uCi0gICAqIDxwPgotICAgKiBJdCBnZXRzIHdvcnNlLCB0aG91Z2guICBJZiBwcm90b2MganVzdCBnZW5lcmF0ZWQgYSBieXRlIGFycmF5LCBsaWtlOgotICAgKiAgIG5ldyBieXRlW10gezB4MTIsIDB4MzQsIDB4NTYsIDB4Nzh9Ci0gICAqIEphdmEgYWN0dWFsbHkgZ2VuZXJhdGVzICpjb2RlKiB3aGljaCBhbGxvY2F0ZXMgYW4gYXJyYXkgYW5kIHRoZW4gZmlsbHMKLSAgICogaW4gZWFjaCB2YWx1ZS4gIFRoaXMgaXMgbXVjaCBsZXNzIGVmZmljaWVudCB0aGFuIGp1c3QgZW1iZWRkaW5nIHRoZSBieXRlcwotICAgKiBkaXJlY3RseSBpbnRvIHRoZSBieXRlY29kZS4gIFRvIGdldCBhcm91bmQgdGhpcywgd2UgbmVlZCBhbm90aGVyCi0gICAqIHdvcmstYXJvdW5kLiAgU3RyaW5nIGxpdGVyYWxzIGFyZSBlbWJlZGRlZCBkaXJlY3RseSwgc28gcHJvdG9jIGFjdHVhbGx5Ci0gICAqIGdlbmVyYXRlcyBhIHN0cmluZyBsaXRlcmFsIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGJ5dGVzLiAgVGhlIGVhc2llc3Qgd2F5Ci0gICAqIHRvIGRvIHRoaXMgaXMgdG8gdXNlIHRoZSBJU08tODg1OS0xIGNoYXJhY3RlciBzZXQsIHdoaWNoIGNvcnJlc3BvbmRzIHRvCi0gICAqIHRoZSBmaXJzdCAyNTYgY2hhcmFjdGVycyBvZiB0aGUgVW5pY29kZSByYW5nZS4gIFByb3RvYyBjYW4gdGhlbiB1c2UKLSAgICogZ29vZCBvbGQgQ0VzY2FwZSB0byBnZW5lcmF0ZSB0aGUgc3RyaW5nLgotICAgKiA8cD4KLSAgICogU28gd2UgaGF2ZSBhIHN0cmluZyBsaXRlcmFsIHdoaWNoIHJlcHJlc2VudHMgYSBzZXQgb2YgYnl0ZXMgd2hpY2gKLSAgICogcmVwcmVzZW50cyBhbm90aGVyIHN0cmluZy4gIFRoaXMgZnVuY3Rpb24gLS0gc3RyaW5nRGVmYXVsdFZhbHVlIC0tCi0gICAqIGNvbnZlcnRzIGZyb20gdGhlIGdlbmVyYXRlZCBzdHJpbmcgdG8gdGhlIHN0cmluZyB3ZSBhY3R1YWxseSB3YW50LiAgVGhlCi0gICAqIGdlbmVyYXRlZCBjb2RlIGNhbGxzIHRoaXMgYXV0b21hdGljYWxseS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHN0cmluZ0RlZmF1bHRWYWx1ZShTdHJpbmcgYnl0ZXMpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcy5nZXRCeXRlcyhJU09fODg1OV8xKSwgVVRGXzgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gY29uc3RydWN0IGRlZmF1bHQgdmFsdWVzIGZvciBieXRlcwotICAgKiBmaWVsZHMuCi0gICAqIDxwPgotICAgKiBUaGlzIGlzIGEgbG90IGxpa2Uge0BsaW5rICNzdHJpbmdEZWZhdWx0VmFsdWV9LCBidXQgZm9yIGJ5dGVzIGZpZWxkcy4KLSAgICogSW4gdGhpcyBjYXNlIHdlIG9ubHkgbmVlZCB0aGUgc2Vjb25kIG9mIHRoZSB0d28gaGFja3MgLS0gYWxsb3dpbmcgdXMgdG8KLSAgICogZW1iZWQgcmF3IGJ5dGVzIGFzIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCBJU08tODg1OS0xIGVuY29kaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGJ5dGVzRGVmYXVsdFZhbHVlKFN0cmluZyBieXRlcykgewotICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzLmdldEJ5dGVzKElTT184ODU5XzEpKTsKLSAgfQotICAvKioKLSAgICogSGVscGVyIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSB0byBjb25zdHJ1Y3QgZGVmYXVsdCB2YWx1ZXMgZm9yIGJ5dGVzCi0gICAqIGZpZWxkcy4KLSAgICogPHA+Ci0gICAqIFRoaXMgaXMgbGlrZSB7QGxpbmsgI2J5dGVzRGVmYXVsdFZhbHVlfSwgYnV0IHJldHVybnMgYSBieXRlIGFycmF5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBieXRlW10gYnl0ZUFycmF5RGVmYXVsdFZhbHVlKFN0cmluZyBieXRlcykgewotICAgIHJldHVybiBieXRlcy5nZXRCeXRlcyhJU09fODg1OV8xKTsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgY2FsbGVkIGJ5IGdlbmVyYXRlZCBjb2RlIHRvIGNvbnN0cnVjdCBkZWZhdWx0IHZhbHVlcyBmb3IgYnl0ZXMKLSAgICogZmllbGRzLgotICAgKiA8cD4KLSAgICogVGhpcyBpcyBsaWtlIHtAbGluayAjYnl0ZXNEZWZhdWx0VmFsdWV9LCBidXQgcmV0dXJucyBhIEJ5dGVCdWZmZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlckRlZmF1bHRWYWx1ZShTdHJpbmcgYnl0ZXMpIHsKLSAgICByZXR1cm4gQnl0ZUJ1ZmZlci53cmFwKGJ5dGVBcnJheURlZmF1bHRWYWx1ZShieXRlcykpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBCeXRlQnVmZmVyIGFuZCBjb3B5IGFsbCB0aGUgY29udGVudCBvZiB7QGNvZGUgc291cmNlfQotICAgKiBCeXRlQnVmZmVyIHRvIHRoZSBuZXcgQnl0ZUJ1ZmZlci4gVGhlIG5ldyBCeXRlQnVmZmVyJ3MgbGltaXQgYW5kCi0gICAqIGNhcGFjaXR5IHdpbGwgYmUgc291cmNlLmNhcGFjaXR5KCksIGFuZCBpdHMgcG9zaXRpb24gd2lsbCBiZSAwLgotICAgKiBOb3RlIHRoYXQgdGhlIHN0YXRlIG9mIHtAY29kZSBzb3VyY2V9IEJ5dGVCdWZmZXIgd29uJ3QgYmUgY2hhbmdlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZUJ1ZmZlciBjb3B5Qnl0ZUJ1ZmZlcihCeXRlQnVmZmVyIHNvdXJjZSkgewotICAgIC8vIE1ha2UgYSBkdXBsaWNhdGUgb2YgdGhlIHNvdXJjZSBCeXRlQnVmZmVyIGFuZCByZWFkIGRhdGEgZnJvbSB0aGUKLSAgICAvLyBkdXBsaWNhdGUuIFRoaXMgaXMgdG8gYXZvaWQgYWZmZWN0aW5nIHRoZSBzb3VyY2UgQnl0ZUJ1ZmZlcidzIHN0YXRlLgotICAgIEJ5dGVCdWZmZXIgdGVtcCA9IHNvdXJjZS5kdXBsaWNhdGUoKTsKLSAgICAvLyBXZSB3YW50IHRvIGNvcHkgYWxsIHRoZSBkYXRhIGluIHRoZSBzb3VyY2UgQnl0ZUJ1ZmZlciwgbm90IGp1c3QgdGhlCi0gICAgLy8gcmVtYWluaW5nIGJ5dGVzLgotICAgIHRlbXAuY2xlYXIoKTsKLSAgICBCeXRlQnVmZmVyIHJlc3VsdCA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUodGVtcC5jYXBhY2l0eSgpKTsKLSAgICByZXN1bHQucHV0KHRlbXApOwotICAgIHJlc3VsdC5jbGVhcigpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSB0byBkZXRlcm1pbmUgaWYgYSBieXRlIGFycmF5IGlzIGEgdmFsaWQKLSAgICogVVRGLTggZW5jb2RlZCBzdHJpbmcgc3VjaCB0aGF0IHRoZSBvcmlnaW5hbCBieXRlcyBjYW4gYmUgY29udmVydGVkIHRvCi0gICAqIGEgU3RyaW5nIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIGEgYnl0ZSBhcnJheSByb3VuZCB0cmlwcGluZyB0aGUgYnl0ZXMKLSAgICogd2l0aG91dCBsb3NzLiAgTW9yZSBwcmVjaXNlbHksIHJldHVybnMge0Bjb2RlIHRydWV9IHdoZW5ldmVyOgotICAgKiA8cHJlPiAgIHtAY29kZQotICAgKiBBcnJheXMuZXF1YWxzKGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwKLSAgICogICAgIG5ldyBTdHJpbmcoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCAiVVRGLTgiKS5nZXRCeXRlcygiVVRGLTgiKSkKLSAgICogfTwvcHJlPgotICAgKgotICAgKiA8cD5UaGlzIG1ldGhvZCByZWplY3RzICJvdmVybG9uZyIgYnl0ZSBzZXF1ZW5jZXMsIGFzIHdlbGwgYXMKLSAgICogMy1ieXRlIHNlcXVlbmNlcyB0aGF0IHdvdWxkIG1hcCB0byBhIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIsIGluCi0gICAqIGFjY29yZGFuY2Ugd2l0aCB0aGUgcmVzdHJpY3RlZCBkZWZpbml0aW9uIG9mIFVURi04IGludHJvZHVjZWQgaW4KLSAgICogVW5pY29kZSAzLjEuICBOb3RlIHRoYXQgdGhlIFVURi04IGRlY29kZXIgaW5jbHVkZWQgaW4gT3JhY2xlJ3MKLSAgICogSkRLIGhhcyBiZWVuIG1vZGlmaWVkIHRvIGFsc28gcmVqZWN0ICJvdmVybG9uZyIgYnl0ZSBzZXF1ZW5jZXMsCi0gICAqIGJ1dCBjdXJyZW50bHkgKDIwMTEpIHN0aWxsIGFjY2VwdHMgMy1ieXRlIHN1cnJvZ2F0ZSBjaGFyYWN0ZXIKLSAgICogYnl0ZSBzZXF1ZW5jZXMuCi0gICAqCi0gICAqIDxwPlNlZSB0aGUgVW5pY29kZSBTdGFuZGFyZCw8YnI+Ci0gICAqIFRhYmxlIDMtNi4gPGVtPlVURi04IEJpdCBEaXN0cmlidXRpb248L2VtPiw8YnI+Ci0gICAqIFRhYmxlIDMtNy4gPGVtPldlbGwgRm9ybWVkIFVURi04IEJ5dGUgU2VxdWVuY2VzPC9lbT4uCi0gICAqCi0gICAqIDxwPkFzIG9mIDIwMTEtMDIsIHRoaXMgbWV0aG9kIHNpbXBseSByZXR1cm5zIHRoZSByZXN1bHQgb2Yge0BsaW5rCi0gICAqIEJ5dGVTdHJpbmcjaXNWYWxpZFV0ZjgoKX0uICBDYWxsaW5nIHRoYXQgbWV0aG9kIGRpcmVjdGx5IGlzIHByZWZlcnJlZC4KLSAgICoKLSAgICogQHBhcmFtIGJ5dGVTdHJpbmcgdGhlIHN0cmluZyB0byBjaGVjawotICAgKiBAcmV0dXJuIHdoZXRoZXIgdGhlIGJ5dGUgYXJyYXkgaXMgcm91bmQgdHJpcHBhYmxlCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFV0ZjgoQnl0ZVN0cmluZyBieXRlU3RyaW5nKSB7Ci0gICAgcmV0dXJuIGJ5dGVTdHJpbmcuaXNWYWxpZFV0ZjgoKTsKLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjaXNWYWxpZFV0ZjgoQnl0ZVN0cmluZyl9IGJ1dCBmb3IgYnl0ZSBhcnJheXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFV0ZjgoYnl0ZVtdIGJ5dGVBcnJheSkgewotICAgIHJldHVybiBVdGY4LmlzVmFsaWRVdGY4KGJ5dGVBcnJheSk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIFVURi04IGJ5dGVzIG9mIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBieXRlW10gdG9CeXRlQXJyYXkoU3RyaW5nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHZhbHVlLmdldEJ5dGVzKFVURl84KTsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIHRvIGNvbnZlcnQgYSBieXRlIGFycmF5IHRvIGEgc3RyaW5nIHVzaW5nIFVURi04IGVuY29kaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmdVdGY4KGJ5dGVbXSBieXRlcykgewotICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBVVEZfOCk7Ci0gIH0KLQotICAvKioKLSAgICogSW50ZXJmYWNlIGZvciBhbiBlbnVtIHZhbHVlIG9yIHZhbHVlIGRlc2NyaXB0b3IsIHRvIGJlIHVzZWQgaW4gRmllbGRTZXQuCi0gICAqIFRoZSBsaXRlIGxpYnJhcnkgc3RvcmVzIGVudW0gdmFsdWVzIGRpcmVjdGx5IGluIEZpZWxkU2V0cyBidXQgdGhlIGZ1bGwKLSAgICogbGlicmFyeSBzdG9yZXMgRW51bVZhbHVlRGVzY3JpcHRvcnMgaW4gb3JkZXIgdG8gYmV0dGVyIHN1cHBvcnQgcmVmbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgRW51bUxpdGUgewotICAgIGludCBnZXROdW1iZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB3aGljaCBtYXBzIGludGVnZXJzIHRvIHtAbGluayBFbnVtTGl0ZX1zLgotICAgKiB7QGxpbmsgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3J9IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgYnkgbWFwcGluZwotICAgKiBudW1iZXJzIHRvIHtAbGluayBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yfXMuICBBZGRpdGlvbmFsbHksCi0gICAqIGV2ZXJ5IGdlbmVyYXRlZCBlbnVtIHR5cGUgaGFzIGEgc3RhdGljIG1ldGhvZCBpbnRlcm5hbEdldFZhbHVlTWFwKCkgd2hpY2gKLSAgICogcmV0dXJucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHR5cGUgdGhhdCBtYXBzIG51bWJlcnMgdG8gZW51bSB2YWx1ZXMuCi0gICAqLwotICBwdWJsaWMgaW50ZXJmYWNlIEVudW1MaXRlTWFwPFQgZXh0ZW5kcyBFbnVtTGl0ZT4gewotICAgIFQgZmluZFZhbHVlQnlOdW1iZXIoaW50IG51bWJlcik7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBNZXNzYWdlI2hhc2hDb2RlKCl9IGZvciBsb25ncy4KLSAgICogQHNlZSBMb25nI2hhc2hDb2RlKCkKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hMb25nKGxvbmcgbikgewotICAgIHJldHVybiAoaW50KSAobiBeIChuID4+PiAzMikpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgTWVzc2FnZSNoYXNoQ29kZSgpfSBmb3IKLSAgICogYm9vbGVhbnMuCi0gICAqIEBzZWUgQm9vbGVhbiNoYXNoQ29kZSgpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBoYXNoQm9vbGVhbihib29sZWFuIGIpIHsKLSAgICByZXR1cm4gYiA/IDEyMzEgOiAxMjM3OwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgTWVzc2FnZSNoYXNoQ29kZSgpfSBmb3IgZW51bXMuCi0gICAqIDxwPgotICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHtAbGluayBqYXZhLmxhbmcuRW51bSNoYXNoQ29kZSgpfSBpcyBmaW5hbCwgYnV0IHdlCi0gICAqIG5lZWQgdG8gdXNlIHRoZSBmaWVsZCBudW1iZXIgYXMgdGhlIGhhc2ggY29kZSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eQotICAgKiBiZXR3ZWVuIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBlbnVtIG9iamVjdHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBoYXNoRW51bShFbnVtTGl0ZSBlKSB7Ci0gICAgcmV0dXJuIGUuZ2V0TnVtYmVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBNZXNzYWdlI2hhc2hDb2RlKCl9IGZvcgotICAgKiBlbnVtIGxpc3RzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgaGFzaEVudW1MaXN0KExpc3Q8PyBleHRlbmRzIEVudW1MaXRlPiBsaXN0KSB7Ci0gICAgaW50IGhhc2ggPSAxOwotICAgIGZvciAoRW51bUxpdGUgZSA6IGxpc3QpIHsKLSAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyBoYXNoRW51bShlKTsKLSAgICB9Ci0gICAgcmV0dXJuIGhhc2g7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBNZXNzYWdlI2VxdWFscyhPYmplY3QpfSBmb3IgYnl0ZXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKExpc3Q8Ynl0ZVtdPiBhLCBMaXN0PGJ5dGVbXT4gYikgewotICAgIGlmIChhLnNpemUoKSAhPSBiLnNpemUoKSkgcmV0dXJuIGZhbHNlOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYS5zaXplKCk7ICsraSkgewotICAgICAgaWYgKCFBcnJheXMuZXF1YWxzKGEuZ2V0KGkpLCBiLmdldChpKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0gZm9yIGJ5dGVzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoTGlzdDxieXRlW10+IGxpc3QpIHsKLSAgICBpbnQgaGFzaCA9IDE7Ci0gICAgZm9yIChieXRlW10gYnl0ZXMgOiBsaXN0KSB7Ci0gICAgICBoYXNoID0gMzEgKiBoYXNoICsgaGFzaENvZGUoYnl0ZXMpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0gZm9yIGJ5dGVzIGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgLy8gVGhlIGhhc2ggY29kZSBmb3IgYSBieXRlIGFycmF5IHNob3VsZCBiZSB0aGUgc2FtZSBhcyB0aGUgaGFzaCBjb2RlIGZvciBhCi0gICAgLy8gQnl0ZVN0cmluZyB3aXRoIHRoZSBzYW1lIGNvbnRlbnQuIFRoaXMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIGdlbmVyYXRlZAotICAgIC8vIGhhc2hDb2RlKCkgbWV0aG9kIHdpbGwgcmV0dXJuIHRoZSBzYW1lIHZhbHVlIGFzIHRoZSBwdXJlIHJlZmxlY3Rpb24KLSAgICAvLyBiYXNlZCBoYXNoQ29kZSgpIG1ldGhvZC4KLSAgICByZXR1cm4gSW50ZXJuYWwuaGFzaENvZGUoYnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nI2hhc2hDb2RlKCl9LgotICAgKi8KLSAgc3RhdGljIGludCBoYXNoQ29kZShieXRlW10gYnl0ZXMsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAvLyBUaGUgaGFzaCBjb2RlIGZvciBhIGJ5dGUgYXJyYXkgc2hvdWxkIGJlIHRoZSBzYW1lIGFzIHRoZSBoYXNoIGNvZGUgZm9yIGEKLSAgICAvLyBCeXRlU3RyaW5nIHdpdGggdGhlIHNhbWUgY29udGVudC4gVGhpcyBpcyB0byBlbnN1cmUgdGhhdCB0aGUgZ2VuZXJhdGVkCi0gICAgLy8gaGFzaENvZGUoKSBtZXRob2Qgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgYXMgdGhlIHB1cmUgcmVmbGVjdGlvbgotICAgIC8vIGJhc2VkIGhhc2hDb2RlKCkgbWV0aG9kLgotICAgIGludCBoID0gSW50ZXJuYWwucGFydGlhbEhhc2gobGVuZ3RoLCBieXRlcywgb2Zmc2V0LCBsZW5ndGgpOwotICAgIHJldHVybiBoID09IDAgPyAxIDogaDsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBjb250aW51b3VzbHkgaGFzaGluZyBieXRlcy4KLSAgICovCi0gIHN0YXRpYyBpbnQgcGFydGlhbEhhc2goaW50IGgsIGJ5dGVbXSBieXRlcywgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBsZW5ndGg7IGkrKykgewotICAgICAgaCA9IGggKiAzMSArIGJ5dGVzW2ldOwotICAgIH0KLSAgICByZXR1cm4gaDsKLSAgfQotICAKLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgTWVzc2FnZSNlcXVhbHMoT2JqZWN0KX0gZm9yIGJ5dGVzCi0gICAqIGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFsc0J5dGVCdWZmZXIoQnl0ZUJ1ZmZlciBhLCBCeXRlQnVmZmVyIGIpIHsKLSAgICBpZiAoYS5jYXBhY2l0eSgpICE9IGIuY2FwYWNpdHkoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBCeXRlQnVmZmVyLmVxdWFscygpIHdpbGwgb25seSBjb21wYXJlIHRoZSByZW1haW5pbmcgYnl0ZXMsIGJ1dCB3ZSB3YW50IHRvCi0gICAgLy8gY29tcGFyZSBhbGwgdGhlIGNvbnRlbnQuCi0gICAgcmV0dXJuIGEuZHVwbGljYXRlKCkuY2xlYXIoKS5lcXVhbHMoYi5kdXBsaWNhdGUoKS5jbGVhcigpKTsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjZXF1YWxzKE9iamVjdCl9IGZvciBieXRlcwotICAgKiBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHNCeXRlQnVmZmVyKAotICAgICAgTGlzdDxCeXRlQnVmZmVyPiBhLCBMaXN0PEJ5dGVCdWZmZXI+IGIpIHsKLSAgICBpZiAoYS5zaXplKCkgIT0gYi5zaXplKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhLnNpemUoKTsgKytpKSB7Ci0gICAgICBpZiAoIWVxdWFsc0J5dGVCdWZmZXIoYS5nZXQoaSksIGIuZ2V0KGkpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBtZXRob2QgZm9yIGltcGxlbWVudGluZyB7QGxpbmsgTWVzc2FnZSNoYXNoQ29kZSgpfSBmb3IgYnl0ZXMKLSAgICogZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZUJ5dGVCdWZmZXIoTGlzdDxCeXRlQnVmZmVyPiBsaXN0KSB7Ci0gICAgaW50IGhhc2ggPSAxOwotICAgIGZvciAoQnl0ZUJ1ZmZlciBieXRlcyA6IGxpc3QpIHsKLSAgICAgIGhhc2ggPSAzMSAqIGhhc2ggKyBoYXNoQ29kZUJ5dGVCdWZmZXIoYnl0ZXMpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0JVRkZFUl9TSVpFID0gNDA5NjsKLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBNZXNzYWdlI2hhc2hDb2RlKCl9IGZvciBieXRlcwotICAgKiBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlQnl0ZUJ1ZmZlcihCeXRlQnVmZmVyIGJ5dGVzKSB7Ci0gICAgaWYgKGJ5dGVzLmhhc0FycmF5KCkpIHsKLSAgICAgIC8vIEZhc3QgcGF0aC4KLSAgICAgIGludCBoID0gcGFydGlhbEhhc2goYnl0ZXMuY2FwYWNpdHkoKSwgYnl0ZXMuYXJyYXkoKSwgYnl0ZXMuYXJyYXlPZmZzZXQoKSwgYnl0ZXMuY2FwYWNpdHkoKSk7Ci0gICAgICByZXR1cm4gaCA9PSAwID8gMSA6IGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJlYWQgdGhlIGRhdGEgaW50byBhIHRlbXBvcmFyeSBieXRlIGFycmF5IGJlZm9yZSBjYWxjdWxhdGluZyB0aGUKLSAgICAgIC8vIGhhc2ggdmFsdWUuCi0gICAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSA9IGJ5dGVzLmNhcGFjaXR5KCkgPiBERUZBVUxUX0JVRkZFUl9TSVpFCi0gICAgICAgICAgPyBERUZBVUxUX0JVRkZFUl9TSVpFIDogYnl0ZXMuY2FwYWNpdHkoKTsKLSAgICAgIGZpbmFsIGJ5dGVbXSBidWZmZXIgPSBuZXcgYnl0ZVtidWZmZXJTaXplXTsKLSAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgZHVwbGljYXRlZCA9IGJ5dGVzLmR1cGxpY2F0ZSgpOwotICAgICAgZHVwbGljYXRlZC5jbGVhcigpOwotICAgICAgaW50IGggPSBieXRlcy5jYXBhY2l0eSgpOwotICAgICAgd2hpbGUgKGR1cGxpY2F0ZWQucmVtYWluaW5nKCkgPiAwKSB7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBkdXBsaWNhdGVkLnJlbWFpbmluZygpIDw9IGJ1ZmZlclNpemUgPwotICAgICAgICAgICAgZHVwbGljYXRlZC5yZW1haW5pbmcoKSA6IGJ1ZmZlclNpemU7Ci0gICAgICAgIGR1cGxpY2F0ZWQuZ2V0KGJ1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICAgICAgaCA9IHBhcnRpYWxIYXNoKGgsIGJ1ZmZlciwgMCwgbGVuZ3RoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBoID09IDAgPyAxIDogaDsKLSAgICB9Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIE1lc3NhZ2VMaXRlPiBUIGdldERlZmF1bHRJbnN0YW5jZShDbGFzczxUPiBjbGF6eikgewotICAgIHRyeSB7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gY2xhenouZ2V0TWV0aG9kKCJnZXREZWZhdWx0SW5zdGFuY2UiKTsKLSAgICAgIHJldHVybiAoVCkgbWV0aG9kLmludm9rZShtZXRob2QpOwotICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiRmFpbGVkIHRvIGdldCBkZWZhdWx0IGluc3RhbmNlIGZvciAiICsgY2xhenosIGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiBlbXB0eSBieXRlIGFycmF5IGNvbnN0YW50IHVzZWQgaW4gZ2VuZXJhdGVkIGNvZGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9CWVRFX0FSUkFZID0gbmV3IGJ5dGVbMF07Ci0KLSAgLyoqCi0gICAqIEFuIGVtcHR5IGJ5dGUgYXJyYXkgY29uc3RhbnQgdXNlZCBpbiBnZW5lcmF0ZWQgY29kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgQnl0ZUJ1ZmZlciBFTVBUWV9CWVRFX0JVRkZFUiA9Ci0gICAgICBCeXRlQnVmZmVyLndyYXAoRU1QVFlfQllURV9BUlJBWSk7Ci0KLSAgLyoqIEFuIGVtcHR5IGNvZGVkIGlucHV0IHN0cmVhbSBjb25zdGFudCB1c2VkIGluIGdlbmVyYXRlZCBjb2RlLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gRU1QVFlfQ09ERURfSU5QVVRfU1RSRUFNID0KLSAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoRU1QVFlfQllURV9BUlJBWSk7Ci0KLQotICAvKioKLSAgICogUHJvdmlkZXMgYW4gaW1tdXRhYmxlIHZpZXcgb2Yge0Bjb2RlIExpc3Q8VD59IGFyb3VuZCBhIHtAY29kZSBMaXN0PEY+fS4KLSAgICoKLSAgICogUHJvdG9idWYgaW50ZXJuYWwuIFVzZWQgaW4gcHJvdG9idWYgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTGlzdEFkYXB0ZXI8RiwgVD4gZXh0ZW5kcyBBYnN0cmFjdExpc3Q8VD4gewotICAgIC8qKgotICAgICAqIENvbnZlcnQgaW5kaXZpZHVhbCBlbGVtZW50cyBvZiB0aGUgTGlzdCBmcm9tIEYgdG8gVC4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIENvbnZlcnRlcjxGLCBUPiB7Ci0gICAgICBUIGNvbnZlcnQoRiBmcm9tKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIExpc3Q8Rj4gZnJvbUxpc3Q7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb252ZXJ0ZXI8RiwgVD4gY29udmVydGVyOwotCi0gICAgcHVibGljIExpc3RBZGFwdGVyKExpc3Q8Rj4gZnJvbUxpc3QsIENvbnZlcnRlcjxGLCBUPiBjb252ZXJ0ZXIpIHsKLSAgICAgIHRoaXMuZnJvbUxpc3QgPSBmcm9tTGlzdDsKLSAgICAgIHRoaXMuY29udmVydGVyID0gY29udmVydGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBUIGdldChpbnQgaW5kZXgpIHsKLSAgICAgIHJldHVybiBjb252ZXJ0ZXIuY29udmVydChmcm9tTGlzdC5nZXQoaW5kZXgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gZnJvbUxpc3Quc2l6ZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBXcmFwIGFyb3VuZCBhIHtAY29kZSBNYXA8SywgUmVhbFZhbHVlPn0gYW5kIHByb3ZpZGUgYSB7QGNvZGUgTWFwPEssIFY+fQotICAgKiBpbnRlcmZhY2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1hcEFkYXB0ZXI8SywgViwgUmVhbFZhbHVlPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IHsKLSAgICAvKioKLSAgICAgKiBBbiBpbnRlcmZhY2UgdXNlZCB0byBjb252ZXJ0IGJldHdlZW4gdHdvIHR5cGVzLgotICAgICAqLwotICAgIHB1YmxpYyBpbnRlcmZhY2UgQ29udmVydGVyPEEsIEI+IHsKLSAgICAgIEIgZG9Gb3J3YXJkKEEgb2JqZWN0KTsKLSAgICAgIEEgZG9CYWNrd2FyZChCIG9iamVjdCk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEVudW1MaXRlPiBDb252ZXJ0ZXI8SW50ZWdlciwgVD4gbmV3RW51bUNvbnZlcnRlcigKLSAgICAgICAgZmluYWwgRW51bUxpdGVNYXA8VD4gZW51bU1hcCwgZmluYWwgVCB1bnJlY29nbml6ZWRWYWx1ZSkgewotICAgICAgcmV0dXJuIG5ldyBDb252ZXJ0ZXI8SW50ZWdlciwgVD4oKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgVCBkb0ZvcndhcmQoSW50ZWdlciB2YWx1ZSkgewotICAgICAgICAgIFQgcmVzdWx0ID0gZW51bU1hcC5maW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gdW5yZWNvZ25pemVkVmFsdWUgOiByZXN1bHQ7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIEludGVnZXIgZG9CYWNrd2FyZChUIHZhbHVlKSB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlLmdldE51bWJlcigpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgTWFwPEssIFJlYWxWYWx1ZT4gcmVhbE1hcDsKLSAgICBwcml2YXRlIGZpbmFsIENvbnZlcnRlcjxSZWFsVmFsdWUsIFY+IHZhbHVlQ29udmVydGVyOwotCi0gICAgcHVibGljIE1hcEFkYXB0ZXIoTWFwPEssIFJlYWxWYWx1ZT4gcmVhbE1hcCwKLSAgICAgICAgQ29udmVydGVyPFJlYWxWYWx1ZSwgVj4gdmFsdWVDb252ZXJ0ZXIpIHsKLSAgICAgIHRoaXMucmVhbE1hcCA9IHJlYWxNYXA7Ci0gICAgICB0aGlzLnZhbHVlQ29udmVydGVyID0gdmFsdWVDb252ZXJ0ZXI7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFYgZ2V0KE9iamVjdCBrZXkpIHsKLSAgICAgIFJlYWxWYWx1ZSByZXN1bHQgPSByZWFsTWFwLmdldChrZXkpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgcmV0dXJuIHZhbHVlQ29udmVydGVyLmRvRm9yd2FyZChyZXN1bHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWIHB1dChLIGtleSwgViB2YWx1ZSkgewotICAgICAgUmVhbFZhbHVlIG9sZFZhbHVlID0gcmVhbE1hcC5wdXQoa2V5LCB2YWx1ZUNvbnZlcnRlci5kb0JhY2t3YXJkKHZhbHVlKSk7Ci0gICAgICBpZiAob2xkVmFsdWUgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHJldHVybiB2YWx1ZUNvbnZlcnRlci5kb0ZvcndhcmQob2xkVmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTZXQ8amF2YS51dGlsLk1hcC5FbnRyeTxLLCBWPj4gZW50cnlTZXQoKSB7Ci0gICAgICByZXR1cm4gbmV3IFNldEFkYXB0ZXIocmVhbE1hcC5lbnRyeVNldCgpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIFNldEFkYXB0ZXIgZXh0ZW5kcyBBYnN0cmFjdFNldDxNYXAuRW50cnk8SywgVj4+IHsKLSAgICAgIHByaXZhdGUgZmluYWwgU2V0PE1hcC5FbnRyeTxLLCBSZWFsVmFsdWU+PiByZWFsU2V0OwotICAgICAgcHVibGljIFNldEFkYXB0ZXIoU2V0PE1hcC5FbnRyeTxLLCBSZWFsVmFsdWU+PiByZWFsU2V0KSB7Ci0gICAgICAgIHRoaXMucmVhbFNldCA9IHJlYWxTZXQ7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIEl0ZXJhdG9yPGphdmEudXRpbC5NYXAuRW50cnk8SywgVj4+IGl0ZXJhdG9yKCkgewotICAgICAgICByZXR1cm4gbmV3IEl0ZXJhdG9yQWRhcHRlcihyZWFsU2V0Lml0ZXJhdG9yKCkpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHJlYWxTZXQuc2l6ZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgY2xhc3MgSXRlcmF0b3JBZGFwdGVyIGltcGxlbWVudHMgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiB7Ci0gICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBSZWFsVmFsdWU+PiByZWFsSXRlcmF0b3I7Ci0KLSAgICAgIHB1YmxpYyBJdGVyYXRvckFkYXB0ZXIoCi0gICAgICAgICAgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFJlYWxWYWx1ZT4+IHJlYWxJdGVyYXRvcikgewotICAgICAgICB0aGlzLnJlYWxJdGVyYXRvciA9IHJlYWxJdGVyYXRvcjsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gcmVhbEl0ZXJhdG9yLmhhc05leHQoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgamF2YS51dGlsLk1hcC5FbnRyeTxLLCBWPiBuZXh0KCkgewotICAgICAgICByZXR1cm4gbmV3IEVudHJ5QWRhcHRlcihyZWFsSXRlcmF0b3IubmV4dCgpKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHJlYWxJdGVyYXRvci5yZW1vdmUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGNsYXNzIEVudHJ5QWRhcHRlciBpbXBsZW1lbnRzIE1hcC5FbnRyeTxLLCBWPiB7Ci0gICAgICBwcml2YXRlIGZpbmFsIE1hcC5FbnRyeTxLLCBSZWFsVmFsdWU+IHJlYWxFbnRyeTsKLQotICAgICAgcHVibGljIEVudHJ5QWRhcHRlcihNYXAuRW50cnk8SywgUmVhbFZhbHVlPiByZWFsRW50cnkpIHsKLSAgICAgICAgdGhpcy5yZWFsRW50cnkgPSByZWFsRW50cnk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIEsgZ2V0S2V5KCkgewotICAgICAgICByZXR1cm4gcmVhbEVudHJ5LmdldEtleSgpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBWIGdldFZhbHVlKCkgewotICAgICAgICByZXR1cm4gdmFsdWVDb252ZXJ0ZXIuZG9Gb3J3YXJkKHJlYWxFbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0gICAgICAgIFJlYWxWYWx1ZSBvbGRWYWx1ZSA9IHJlYWxFbnRyeS5zZXRWYWx1ZSgKLSAgICAgICAgICAgIHZhbHVlQ29udmVydGVyLmRvQmFja3dhcmQodmFsdWUpKTsKLSAgICAgICAgaWYgKG9sZFZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWVDb252ZXJ0ZXIuZG9Gb3J3YXJkKG9sZFZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRXh0ZW5kcyB7QGxpbmsgTGlzdH0gdG8gYWRkIHRoZSBjYXBhYmlsaXR5IHRvIG1ha2UgdGhlIGxpc3QgaW1tdXRhYmxlIGFuZCBpbnNwZWN0IGlmIGl0IGlzCi0gICAqIG1vZGlmaWFibGUuCi0gICAqIDxwPgotICAgKiBBbGwgaW1wbGVtZW50YXRpb25zIG11c3Qgc3VwcG9ydCBlZmZpY2llbnQgcmFuZG9tIGFjY2Vzcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIFByb3RvYnVmTGlzdDxFPiBleHRlbmRzIExpc3Q8RT4sIFJhbmRvbUFjY2VzcyB7Ci0KLSAgICAvKioKLSAgICAgKiBNYWtlcyB0aGlzIGxpc3QgaW1tdXRhYmxlLiBBbGwgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zIHdpbGwgdGhyb3cgYW4KLSAgICAgKiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgotICAgICAqLwotICAgIHZvaWQgbWFrZUltbXV0YWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB3aGV0aGVyIHRoaXMgbGlzdCBjYW4gYmUgbW9kaWZpZWQgdmlhIHRoZSBwdWJsaWNseSBhY2Nlc3NpYmxlIHtAbGluayBMaXN0fSBtZXRob2RzLgotICAgICAqLwotICAgIGJvb2xlYW4gaXNNb2RpZmlhYmxlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbXV0YWJsZSBjbG9uZSBvZiB0aGlzIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgotICAgICAqLwotICAgIFByb3RvYnVmTGlzdDxFPiBtdXRhYmxlQ29weVdpdGhDYXBhY2l0eShpbnQgY2FwYWNpdHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEge0BsaW5rIGphdmEudXRpbC5MaXN0fSBpbXBsZW1lbnRhdGlvbiB0aGF0IGF2b2lkcyBib3hpbmcgdGhlIGVsZW1lbnRzIGludG8gSW50ZWdlcnMgaWYKLSAgICogcG9zc2libGUuIERvZXMgbm90IHN1cHBvcnQgbnVsbCBlbGVtZW50cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIEludExpc3QgZXh0ZW5kcyBQcm90b2J1Zkxpc3Q8SW50ZWdlcj4gewotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI2dldChpbnQpfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgcmV0dXJuZWQgdmFsdWUuCi0gICAgICovCi0gICAgaW50IGdldEludChpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI2FkZChJbnRlZ2VyKX0gYnV0IG1vcmUgZWZmaWNpZW50IGluIHRoYXQgaXQgZG9lc24ndCBib3ggdGhlIGVsZW1lbnQuCi0gICAgICovCi0gICAgdm9pZCBhZGRJbnQoaW50IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI3NldChpbnQsIEludGVnZXIpfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBpbnQgc2V0SW50KGludCBpbmRleCwgaW50IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG11dGFibGUgY2xvbmUgb2YgdGhpcyBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBJbnRMaXN0IG11dGFibGVDb3B5V2l0aENhcGFjaXR5KGludCBjYXBhY2l0eSk7Ci0gIH0KLQotICAvKioKLSAgICogQSB7QGxpbmsgamF2YS51dGlsLkxpc3R9IGltcGxlbWVudGF0aW9uIHRoYXQgYXZvaWRzIGJveGluZyB0aGUgZWxlbWVudHMgaW50byBCb29sZWFucyBpZgotICAgKiBwb3NzaWJsZS4gRG9lcyBub3Qgc3VwcG9ydCBudWxsIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgQm9vbGVhbkxpc3QgZXh0ZW5kcyBQcm90b2J1Zkxpc3Q8Qm9vbGVhbj4gewotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI2dldChpbnQpfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgcmV0dXJuZWQgdmFsdWUuCi0gICAgICovCi0gICAgYm9vbGVhbiBnZXRCb29sZWFuKGludCBpbmRleCk7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjYWRkKEJvb2xlYW4pfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICB2b2lkIGFkZEJvb2xlYW4oYm9vbGVhbiBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rICNzZXQoaW50LCBCb29sZWFuKX0gYnV0IG1vcmUgZWZmaWNpZW50IGluIHRoYXQgaXQgZG9lc24ndCBib3ggdGhlIGVsZW1lbnQuCi0gICAgICovCi0gICAgYm9vbGVhbiBzZXRCb29sZWFuKGludCBpbmRleCwgYm9vbGVhbiBlbGVtZW50KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBtdXRhYmxlIGNsb25lIG9mIHRoaXMgbGlzdCB3aXRoIHRoZSBzcGVjaWZpZWQgY2FwYWNpdHkuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgQm9vbGVhbkxpc3QgbXV0YWJsZUNvcHlXaXRoQ2FwYWNpdHkoaW50IGNhcGFjaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBBIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gaW1wbGVtZW50YXRpb24gdGhhdCBhdm9pZHMgYm94aW5nIHRoZSBlbGVtZW50cyBpbnRvIExvbmdzIGlmCi0gICAqIHBvc3NpYmxlLiBEb2VzIG5vdCBzdXBwb3J0IG51bGwgZWxlbWVudHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludGVyZmFjZSBMb25nTGlzdCBleHRlbmRzIFByb3RvYnVmTGlzdDxMb25nPiB7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjZ2V0KGludCl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSByZXR1cm5lZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBsb25nIGdldExvbmcoaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rICNhZGQoTG9uZyl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIHZvaWQgYWRkTG9uZyhsb25nIGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI3NldChpbnQsIExvbmcpfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBsb25nIHNldExvbmcoaW50IGluZGV4LCBsb25nIGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG11dGFibGUgY2xvbmUgb2YgdGhpcyBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBMb25nTGlzdCBtdXRhYmxlQ29weVdpdGhDYXBhY2l0eShpbnQgY2FwYWNpdHkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEEge0BsaW5rIGphdmEudXRpbC5MaXN0fSBpbXBsZW1lbnRhdGlvbiB0aGF0IGF2b2lkcyBib3hpbmcgdGhlIGVsZW1lbnRzIGludG8gRG91YmxlcyBpZgotICAgKiBwb3NzaWJsZS4gRG9lcyBub3Qgc3VwcG9ydCBudWxsIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRG91YmxlTGlzdCBleHRlbmRzIFByb3RvYnVmTGlzdDxEb3VibGU+IHsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rICNnZXQoaW50KX0gYnV0IG1vcmUgZWZmaWNpZW50IGluIHRoYXQgaXQgZG9lc24ndCBib3ggdGhlIHJldHVybmVkIHZhbHVlLgotICAgICAqLwotICAgIGRvdWJsZSBnZXREb3VibGUoaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rICNhZGQoRG91YmxlKX0gYnV0IG1vcmUgZWZmaWNpZW50IGluIHRoYXQgaXQgZG9lc24ndCBib3ggdGhlIGVsZW1lbnQuCi0gICAgICovCi0gICAgdm9pZCBhZGREb3VibGUoZG91YmxlIGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI3NldChpbnQsIERvdWJsZSl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIGRvdWJsZSBzZXREb3VibGUoaW50IGluZGV4LCBkb3VibGUgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbXV0YWJsZSBjbG9uZSBvZiB0aGlzIGxpc3Qgd2l0aCB0aGUgc3BlY2lmaWVkIGNhcGFjaXR5LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIERvdWJsZUxpc3QgbXV0YWJsZUNvcHlXaXRoQ2FwYWNpdHkoaW50IGNhcGFjaXR5KTsKLSAgfQotCi0gIC8qKgotICAgKiBBIHtAbGluayBqYXZhLnV0aWwuTGlzdH0gaW1wbGVtZW50YXRpb24gdGhhdCBhdm9pZHMgYm94aW5nIHRoZSBlbGVtZW50cyBpbnRvIEZsb2F0cyBpZgotICAgKiBwb3NzaWJsZS4gRG9lcyBub3Qgc3VwcG9ydCBudWxsIGVsZW1lbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnRlcmZhY2UgRmxvYXRMaXN0IGV4dGVuZHMgUHJvdG9idWZMaXN0PEZsb2F0PiB7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjZ2V0KGludCl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSByZXR1cm5lZCB2YWx1ZS4KLSAgICAgKi8KLSAgICBmbG9hdCBnZXRGbG9hdChpbnQgaW5kZXgpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI2FkZChGbG9hdCl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSBlbGVtZW50LgotICAgICAqLwotICAgIHZvaWQgYWRkRmxvYXQoZmxvYXQgZWxlbWVudCk7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjc2V0KGludCwgRmxvYXQpfSBidXQgbW9yZSBlZmZpY2llbnQgaW4gdGhhdCBpdCBkb2Vzbid0IGJveCB0aGUgZWxlbWVudC4KLSAgICAgKi8KLSAgICBmbG9hdCBzZXRGbG9hdChpbnQgaW5kZXgsIGZsb2F0IGVsZW1lbnQpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIG11dGFibGUgY2xvbmUgb2YgdGhpcyBsaXN0IHdpdGggdGhlIHNwZWNpZmllZCBjYXBhY2l0eS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBGbG9hdExpc3QgbXV0YWJsZUNvcHlXaXRoQ2FwYWNpdHkoaW50IGNhcGFjaXR5KTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1Y2U3YjIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiBhIHByb3RvY29sIG1lc3NhZ2UgYmVpbmcgcGFyc2VkIGlzIGludmFsaWQgaW4gc29tZSB3YXksCi0gKiBlLmcuIGl0IGNvbnRhaW5zIGEgbWFsZm9ybWVkIHZhcmludCBvciBhIG5lZ2F0aXZlIGJ5dGUgbGVuZ3RoLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBjbGFzcyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNjE2MTUxNzYzMDcyNDUwNDc2TDsKLSAgcHJpdmF0ZSBNZXNzYWdlTGl0ZSB1bmZpbmlzaGVkTWVzc2FnZSA9IG51bGw7Ci0KLSAgcHVibGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICBzdXBlcihkZXNjcmlwdGlvbik7Ci0gIH0KLQotICBwdWJsaWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKElPRXhjZXB0aW9uIGUpIHsKLSAgICBzdXBlcihlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXR0YWNoZXMgYW4gdW5maW5pc2hlZCBtZXNzYWdlIHRvIHRoZSBleGNlcHRpb24gdG8gc3VwcG9ydCBiZXN0LWVmZm9ydAotICAgKiBwYXJzaW5nIGluIHtAY29kZSBQYXJzZXJ9IGludGVyZmFjZS4KLSAgICoKLSAgICogQHJldHVybiB0aGlzCi0gICAqLwotICBwdWJsaWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHNldFVuZmluaXNoZWRNZXNzYWdlKAotICAgICAgTWVzc2FnZUxpdGUgdW5maW5pc2hlZE1lc3NhZ2UpIHsKLSAgICB0aGlzLnVuZmluaXNoZWRNZXNzYWdlID0gdW5maW5pc2hlZE1lc3NhZ2U7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgdW5maW5pc2hlZCBtZXNzYWdlIGF0dGFjaGVkIHRvIHRoZSBleGNlcHRpb24sIG9yIG51bGwgaWYKLSAgICogbm8gbWVzc2FnZSBpcyBhdHRhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlTGl0ZSBnZXRVbmZpbmlzaGVkTWVzc2FnZSgpIHsKLSAgICByZXR1cm4gdW5maW5pc2hlZE1lc3NhZ2U7Ci0gIH0KLQotICAvKioKLSAgICogVW53cmFwcyB0aGUgdW5kZXJseWluZyB7QGxpbmsgSU9FeGNlcHRpb259IGlmIHRoaXMgZXhjZXB0aW9uIHdhcyBjYXVzZWQgYnkgYW4gSS9PCi0gICAqIHByb2JsZW0uIE90aGVyd2lzZSwgcmV0dXJucyB7QGNvZGUgdGhpc30uCi0gICAqLwotICBwdWJsaWMgSU9FeGNlcHRpb24gdW53cmFwSU9FeGNlcHRpb24oKSB7Ci0gICAgcmV0dXJuIGdldENhdXNlKCkgaW5zdGFuY2VvZiBJT0V4Y2VwdGlvbiA/IChJT0V4Y2VwdGlvbikgZ2V0Q2F1c2UoKSA6IHRoaXM7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHRydW5jYXRlZE1lc3NhZ2UoKSB7Ci0gICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAiV2hpbGUgcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UsIHRoZSBpbnB1dCBlbmRlZCB1bmV4cGVjdGVkbHkgIiArCi0gICAgICAiaW4gdGhlIG1pZGRsZSBvZiBhIGZpZWxkLiAgVGhpcyBjb3VsZCBtZWFuIGVpdGhlciB0aGF0IHRoZSAiICsKLSAgICAgICJpbnB1dCBoYXMgYmVlbiB0cnVuY2F0ZWQgb3IgdGhhdCBhbiBlbWJlZGRlZCBtZXNzYWdlICIgKwotICAgICAgIm1pc3JlcG9ydGVkIGl0cyBvd24gbGVuZ3RoLiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBuZWdhdGl2ZVNpemUoKSB7Ci0gICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAiQ29kZWRJbnB1dFN0cmVhbSBlbmNvdW50ZXJlZCBhbiBlbWJlZGRlZCBzdHJpbmcgb3IgbWVzc2FnZSAiICsKLSAgICAgICJ3aGljaCBjbGFpbWVkIHRvIGhhdmUgbmVnYXRpdmUgc2l6ZS4iKTsKLSAgfQotCi0gIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gbWFsZm9ybWVkVmFyaW50KCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgIkNvZGVkSW5wdXRTdHJlYW0gZW5jb3VudGVyZWQgYSBtYWxmb3JtZWQgdmFyaW50LiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpbnZhbGlkVGFnKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgIlByb3RvY29sIG1lc3NhZ2UgY29udGFpbmVkIGFuIGludmFsaWQgdGFnICh6ZXJvKS4iKTsKLSAgfQotCi0gIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gaW52YWxpZEVuZFRhZygpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICJQcm90b2NvbCBtZXNzYWdlIGVuZC1ncm91cCB0YWcgZGlkIG5vdCBtYXRjaCBleHBlY3RlZCB0YWcuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGludmFsaWRXaXJlVHlwZSgpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICJQcm90b2NvbCBtZXNzYWdlIHRhZyBoYWQgaW52YWxpZCB3aXJlIHR5cGUuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKSB7Ci0gICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAiUHJvdG9jb2wgbWVzc2FnZSBoYWQgdG9vIG1hbnkgbGV2ZWxzIG9mIG5lc3RpbmcuICBNYXkgYmUgbWFsaWNpb3VzLiAgIiArCi0gICAgICAiVXNlIENvZGVkSW5wdXRTdHJlYW0uc2V0UmVjdXJzaW9uTGltaXQoKSB0byBpbmNyZWFzZSB0aGUgZGVwdGggbGltaXQuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHNpemVMaW1pdEV4Y2VlZGVkKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgIlByb3RvY29sIG1lc3NhZ2Ugd2FzIHRvbyBsYXJnZS4gIE1heSBiZSBtYWxpY2lvdXMuICAiICsKLSAgICAgICJVc2UgQ29kZWRJbnB1dFN0cmVhbS5zZXRTaXplTGltaXQoKSB0byBpbmNyZWFzZSB0aGUgc2l6ZSBsaW1pdC4iKTsKLSAgfQotCi0gIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gcGFyc2VGYWlsdXJlKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJGYWlsZWQgdG8gcGFyc2UgdGhlIG1lc3NhZ2UuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGludmFsaWRVdGY4KCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJQcm90b2NvbCBtZXNzYWdlIGhhZCBpbnZhbGlkIFVURi04LiIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5RmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOThlMTNjYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLk1hcC5FbnRyeTsKLQotLyoqCi0gKiBMYXp5RmllbGQgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBvZiBsYXppbHkgcGFyc2luZyBtZXNzYWdlIGZpZWxkcy4gSXQgc3RvcmVzCi0gKiB0aGUgbWVzc2FnZSBpbiBhIEJ5dGVTdHJpbmcgaW5pdGlhbGx5IGFuZCB0aGVuIHBhcnNlIGl0IG9uLWRlbWFuZC4KLSAqCi0gKiBNb3N0IG9mIGtleSBtZXRob2RzIGFyZSBpbXBsZW1lbnRlZCBpbiB7QGxpbmsgTGF6eUZpZWxkTGl0ZX0gYnV0IHRoaXMgY2xhc3MKLSAqIGNhbiBjb250YWluIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIG1lc3NhZ2UgdG8gcHJvdmlkZSB7QGNvZGUgaGFzaENvZGUoKX0sCi0gKiB7QGNvZGUgZXVxYWxzKCl9IGFuZCB7QGNvZGUgdG9TdHJpbmcoKX0uCi0gKgotICogQGF1dGhvciB4aWFuZ2xAZ29vZ2xlLmNvbSAoWGlhbmcgTGkpCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5RmllbGQgZXh0ZW5kcyBMYXp5RmllbGRMaXRlIHsKLQotICAvKioKLSAgICogQ2FycnkgYSBtZXNzYWdlJ3MgZGVmYXVsdCBpbnN0YW5jZSB3aGljaCBpcyB1c2VkIGJ5IHtAY29kZSBoYXNoQ29kZSgpfSwge0Bjb2RlIGV1cWFscygpfSBhbmQKLSAgICoge0Bjb2RlIHRvU3RyaW5nKCl9LgotICAgKi8KLSAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlTGl0ZSBkZWZhdWx0SW5zdGFuY2U7Ci0KLSAgcHVibGljIExhenlGaWVsZChNZXNzYWdlTGl0ZSBkZWZhdWx0SW5zdGFuY2UsCi0gICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksIEJ5dGVTdHJpbmcgYnl0ZXMpIHsKLSAgICBzdXBlcihleHRlbnNpb25SZWdpc3RyeSwgYnl0ZXMpOwotCi0gICAgdGhpcy5kZWZhdWx0SW5zdGFuY2UgPSBkZWZhdWx0SW5zdGFuY2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gY29udGFpbnNEZWZhdWx0SW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIHN1cGVyLmNvbnRhaW5zRGVmYXVsdEluc3RhbmNlKCkgfHwgdmFsdWUgPT0gZGVmYXVsdEluc3RhbmNlOwotICB9Ci0KLSAgcHVibGljIE1lc3NhZ2VMaXRlIGdldFZhbHVlKCkgewotICAgIHJldHVybiBnZXRWYWx1ZShkZWZhdWx0SW5zdGFuY2UpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgcmV0dXJuIGdldFZhbHVlKCkuaGFzaENvZGUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgIHJldHVybiBnZXRWYWx1ZSgpLmVxdWFscyhvYmopOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIGdldFZhbHVlKCkudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogTGF6eUVudHJ5IGFuZCBMYXp5SXRlcmF0b3IgYXJlIHVzZWQgdG8gZW5jYXBzdWxhdGUgdGhlIExhenlGaWVsZCwgd2hlbgotICAgKiB1c2VycyBpdGVyYXRlIGFsbCBmaWVsZHMgZnJvbSBGaWVsZFNldC4KLSAgICovCi0gIHN0YXRpYyBjbGFzcyBMYXp5RW50cnk8Sz4gaW1wbGVtZW50cyBFbnRyeTxLLCBPYmplY3Q+IHsKLSAgICBwcml2YXRlIEVudHJ5PEssIExhenlGaWVsZD4gZW50cnk7Ci0KLSAgICBwcml2YXRlIExhenlFbnRyeShFbnRyeTxLLCBMYXp5RmllbGQ+IGVudHJ5KSB7Ci0gICAgICB0aGlzLmVudHJ5ID0gZW50cnk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEsgZ2V0S2V5KCkgewotICAgICAgcmV0dXJuIGVudHJ5LmdldEtleSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0VmFsdWUoKSB7Ci0gICAgICBMYXp5RmllbGQgZmllbGQgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmllbGQuZ2V0VmFsdWUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTGF6eUZpZWxkIGdldEZpZWxkKCkgewotICAgICAgcmV0dXJuIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBzZXRWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgTWVzc2FnZUxpdGUpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAiTGF6eUZpZWxkIG5vdyBvbmx5IHVzZWQgZm9yIE1lc3NhZ2VTZXQsICIKLSAgICAgICAgICAgICsgImFuZCB0aGUgdmFsdWUgb2YgTWVzc2FnZVNldCBtdXN0IGJlIGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VMaXRlIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZW50cnkuZ2V0VmFsdWUoKS5zZXRWYWx1ZSgoTWVzc2FnZUxpdGUpIHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgY2xhc3MgTGF6eUl0ZXJhdG9yPEs+IGltcGxlbWVudHMgSXRlcmF0b3I8RW50cnk8SywgT2JqZWN0Pj4gewotICAgIHByaXZhdGUgSXRlcmF0b3I8RW50cnk8SywgT2JqZWN0Pj4gaXRlcmF0b3I7Ci0KLSAgICBwdWJsaWMgTGF6eUl0ZXJhdG9yKEl0ZXJhdG9yPEVudHJ5PEssIE9iamVjdD4+IGl0ZXJhdG9yKSB7Ci0gICAgICB0aGlzLml0ZXJhdG9yID0gaXRlcmF0b3I7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgIHJldHVybiBpdGVyYXRvci5oYXNOZXh0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIEVudHJ5PEssIE9iamVjdD4gbmV4dCgpIHsKLSAgICAgIEVudHJ5PEssID8+IGVudHJ5ID0gaXRlcmF0b3IubmV4dCgpOwotICAgICAgaWYgKGVudHJ5LmdldFZhbHVlKCkgaW5zdGFuY2VvZiBMYXp5RmllbGQpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBMYXp5RW50cnk8Sz4oKEVudHJ5PEssIExhenlGaWVsZD4pIGVudHJ5KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoRW50cnk8SywgT2JqZWN0PikgZW50cnk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZExpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eUZpZWxkTGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZmViYWFjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eUZpZWxkTGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIExhenlGaWVsZExpdGUgZW5jYXBzdWxhdGVzIHRoZSBsb2dpYyBvZiBsYXppbHkgcGFyc2luZyBtZXNzYWdlIGZpZWxkcy4gSXQgc3RvcmVzCi0gKiB0aGUgbWVzc2FnZSBpbiBhIEJ5dGVTdHJpbmcgaW5pdGlhbGx5IGFuZCB0aGVuIHBhcnNlcyBpdCBvbi1kZW1hbmQuCi0gKgotICogTGF6eUZpZWxkTGl0ZSBpcyB0aHJlYWQtY29tcGF0aWJsZTogY29uY3VycmVudCByZWFkcyBhcmUgc2FmZSBvbmNlIHRoZSBwcm90byB0aGF0IHRoaXMKLSAqIExhenlGaWVsZExpdGUgaXMgYSBwYXJ0IG9mIGlzIG5vIGxvbmdlciBiZWluZyBtdXRhdGVkIGJ5IGl0cyBCdWlsZGVyLiBIb3dldmVyLCBleHBsaWNpdAotICogc3luY2hyb25pemF0aW9uIGlzIG5lZWRlZCB1bmRlciByZWFkL3dyaXRlIHNpdHVhdGlvbnMuCi0gKgotICogV2hlbiBhIExhenlGaWVsZExpdGUgaXMgdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIE1lc3NhZ2VMaXRlIG9iamVjdCwgaXRzIGJlaGF2aW9yIGlzIGNvbnNpZGVyZWQKLSAqIHRvIGJlIGltbXV0YWJsZSBhbmQgbm9uZSBvZiB0aGUgc2V0dGVyIG1ldGhvZHMgaW4gaXRzIEFQSSBhcmUgZXhwZWN0ZWQgdG8gYmUgaW52b2tlZC4gQWxsIG9mIHRoZQotICogZ2V0dGVycyBhcmUgZXhwZWN0ZWQgdG8gYmUgdGhyZWFkLXNhZmUuIFdoZW4gdXNlZCBpbiB0aGUgY29udGV4dCBvZiBhIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsCi0gKiBzZXR0ZXJzIGNhbiBiZSBpbnZva2VkLCBidXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlIG9mIHRocmVhZCBzYWZldHkuCi0gKiAKLSAqIFRPRE8oeWF0aW4sZHdlaXMpOiBDb25zaWRlciBzcGxpdHRpbmcgdGhpcyBjbGFzcydzIGZ1bmN0aW9uYWxpdHkgYW5kIHB1dCB0aGUgbXV0YWJsZSBtZXRob2RzCi0gKiBpbnRvIGEgc2VwYXJhdGUgYnVpbGRlciBjbGFzcyB0byBhbGxvdyB1cyB0byBnaXZlIHN0cm9uZ2VyIGNvbXBpbGUtdGltZSBndWFyYW50ZWVzLgotICoKLSAqIFRoaXMgY2xhc3MgaXMgaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZSBwcm90b2J1ZiBsaWJyYXJ5LCBzbyB5b3UgZG9uJ3QgbmVlZCB0byB1c2UgaXQKLSAqIGRpcmVjdGx5LgotICoKLSAqIEBhdXRob3IgeGlhbmdsQGdvb2dsZS5jb20gKFhpYW5nIExpKQotICovCi1wdWJsaWMgY2xhc3MgTGF6eUZpZWxkTGl0ZSB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBFTVBUWV9SRUdJU1RSWSA9Ci0gICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuZ2V0RW1wdHlSZWdpc3RyeSgpOwotCi0gIC8qKgotICAgKiBUaGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoZSBMYXp5RmllbGRMaXRlIG9iamVjdCBpcyBzdG9yZWQgaW4gb25lIG9yIG1vcmUgb2YgdGhlIGZvbGxvd2luZwotICAgKiB0aHJlZSBmaWVsZHMgKGRlbGF5ZWRCeXRlcywgdmFsdWUsIG1lbW9pemVkQnl0ZXMpLiBUaGV5IHNob3VsZCB0b2dldGhlciBiZSBpbnRlcnByZXRlZCBhcwotICAgKiBmb2xsb3dzLgotICAgKiAxKSBkZWxheWVkQnl0ZXMgY2FuIGJlIG5vbi1udWxsLCB3aGlsZSB2YWx1ZSBhbmQgbWVtb2l6ZWRCeXRlcyBpcyBudWxsLiBUaGUgb2JqZWN0IHdpbGwgYmUgaW4KLSAgICogICAgdGhpcyBzdGF0ZSB3aGlsZSB0aGUgdmFsdWUgZm9yIHRoZSBvYmplY3QgaGFzIG5vdCB5ZXQgYmVlbiBwYXJzZWQuCi0gICAqIDIpIEJvdGggZGVsYXllZEJ5dGVzIGFuZCB2YWx1ZSBhcmUgbm9uLW51bGwuIFRoZSBvYmplY3QgdHJhbnNpdGlvbnMgdG8gdGhpcyBzdGF0ZSBhcyBzb29uIGFzCi0gICAqICAgIHNvbWUgY2FsbGVyIG5lZWRzIHRvIGFjY2VzcyB0aGUgdmFsdWUgKGJ5IGludm9raW5nIGdldFZhbHVlKCkpLgotICAgKiAzKSBtZW1vaXplZEJ5dGVzIGlzIG1lcmVseSBhbiBvcHRpbWl6YXRpb24gZm9yIGNhbGxzIHRvIExhenlGaWVsZExpdGUudG9CeXRlU3RyaW5nKCkgdG8gYXZvaWQKLSAgICogICAgcmVjb21wdXRpbmcgdGhlIEJ5dGVTdHJpbmcgcmVwcmVzZW50YXRpb24gb24gZWFjaCBjYWxsLiBJbnN0ZWFkLCB3aGVuIHRoZSB2YWx1ZSBpcyBwYXJzZWQKLSAgICogICAgZnJvbSBkZWxheWVkQnl0ZXMsIHdlIHdpbGwgYWxzbyBhc3NpZ24gdGhlIGNvbnRlbnRzIG9mIGRlbGF5ZWRCeXRlcyB0byBtZW1vaXplZEJ5dGVzIChzaW5jZQotICAgKiAgICB0aGF0IGlzIHRoZSBCeXRlU3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHZhbHVlKS4KLSAgICogNCkgRmluYWxseSwgaWYgdGhlIExhenlGaWVsZExpdGUgd2FzIGNyZWF0ZWQgZGlyZWN0bHkgd2l0aCBhIHBhcnNlZCBNZXNzYWdlTGl0ZSB2YWx1ZSwgdGhlbgotICAgKiAgICBkZWxheWVkQnl0ZXMgd2lsbCBiZSBudWxsLCBhbmQgbWVtb2l6ZWRCeXRlcyB3aWxsIGJlIGluaXRpYWxpemVkIG9ubHkgdXBvbiB0aGUgZmlyc3QgY2FsbCB0bwotICAgKiAgICBMYXp5RmllbGRMaXRlLnRvQnl0ZVN0cmluZygpLgotICAgKgotICAgKiBHaXZlbiB0aGUgYWJvdmUgY29uZGl0aW9ucywgYW55IGNhbGxlciB0aGF0IG5lZWRzIGEgc2VyaWFsaXplZCByZXByZXNlbnRhdGlvbiBvZiB0aGlzIG9iamVjdAotICAgKiBtdXN0IGZpcnN0IGNoZWNrIGlmIHRoZSBtZW1vaXplZEJ5dGVzIG9yIGRlbGF5ZWRCeXRlcyBCeXRlU3RyaW5nIGlzIG5vbi1udWxsIGFuZCB1c2UgaXQKLSAgICogZGlyZWN0bHk7IGlmIGJvdGggb2YgdGhvc2UgYXJlIG51bGwsIGl0IGNhbiBsb29rIGF0IHRoZSBwYXJzZWQgdmFsdWUgZmllbGQuIFNpbWlsYXJseSwgYW55Ci0gICAqIGNhbGxlciB0aGF0IG5lZWRzIGEgcGFyc2VkIHZhbHVlIG11c3QgZmlyc3QgY2hlY2sgaWYgdGhlIHZhbHVlIGZpZWxkIGlzIGFscmVhZHkgbm9uLW51bGwsIGlmCi0gICAqIG5vdCBpdCBtdXN0IHBhcnNlIHRoZSB2YWx1ZSBmcm9tIGRlbGF5ZWRCeXRlcy4KLSAgICovCi0KLSAgLyoqCi0gICAqIEEgZGVsYXllZC1wYXJzZWQgdmVyc2lvbiBvZiB0aGUgY29udGVudHMgb2YgdGhpcyBmaWVsZC4gV2hlbiB0aGlzIGZpZWxkIGlzIG5vbi1udWxsLCB0aGVuIHRoZQotICAgKiAidmFsdWUiIGZpZWxkIGlzIGFsbG93ZWQgdG8gYmUgbnVsbCB1bnRpbCB0aGUgdGltZSB0aGF0IHRoZSB2YWx1ZSBuZWVkcyB0byBiZSByZWFkLgotICAgKgotICAgKiBXaGVuIGRlbGF5ZWRCeXRlcyBpcyBub24tbnVsbCB0aGVuIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0gaXMgcmVxdWlyZWQgdG8gYWxzbyBiZSBub24tbnVsbC4KLSAgICoge0Bjb2RlIHZhbHVlfSBhbmQge0Bjb2RlIG1lbW9pemVkQnl0ZXN9IHdpbGwgYmUgaW5pdGlhbGl6ZWQgbGF6aWx5LgotICAgKi8KLSAgcHJpdmF0ZSBCeXRlU3RyaW5nIGRlbGF5ZWRCeXRlczsKLQotICAvKioKLSAgICogQW4ge0Bjb2RlIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZX0gZm9yIHBhcnNpbmcgYnl0ZXMuIEl0IGlzIG5vbi1udWxsIG9uIGEgYmVzdC1lZmZvcnQgYmFzaXMuIEl0Ci0gICAqIGlzIG9ubHkgZ3VhcmFudGVlZCB0byBiZSBub24tbnVsbCBpZiB0aGlzIG1lc3NhZ2Ugd2FzIGluaXRpYWxpemVkIHVzaW5nIGJ5dGVzIGFuZCBhbgotICAgKiB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnl9LiBJZiBpdCBkaXJlY3RseSBoYWQgYSB2YWx1ZSBzZXQgdGhlbiBpdCB3aWxsIGJlIG51bGwsIHVubGVzcyBpdCBoYXMKLSAgICogYmVlbiBtZXJnZWQgd2l0aCBhbm90aGVyIHtAY29kZSBMYXp5RmllbGRMaXRlfSB0aGF0IGhhZCBhbiB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnl9LgotICAgKi8KLSAgcHJpdmF0ZSBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLSAgLyoqCi0gICAqIFRoZSBwYXJzZWQgdmFsdWUuIFdoZW4gdGhpcyBpcyBudWxsIGFuZCBhIGNhbGxlciBuZWVkcyBhY2Nlc3MgdG8gdGhlIE1lc3NhZ2VMaXRlIHZhbHVlLCB0aGVuCi0gICAqIHtAY29kZSBkZWxheWVkQnl0ZXN9IHdpbGwgYmUgcGFyc2VkIGxhemlseSBhdCB0aGF0IHRpbWUuCi0gICAqLwotICBwcm90ZWN0ZWQgdm9sYXRpbGUgTWVzc2FnZUxpdGUgdmFsdWU7Ci0KLSAgLyoqCi0gICAqIFRoZSBtZW1vaXplZCBieXRlcyBmb3Ige0Bjb2RlIHZhbHVlfS4gVGhpcyBpcyBhbiBvcHRpbWl6YXRpb24gZm9yIHRoZSB0b0J5dGVTdHJpbmcoKSBtZXRob2QgdG8KLSAgICogbm90IGhhdmUgdG8gcmVjb21wdXRlIGl0cyByZXR1cm4tdmFsdWUgb24gZWFjaCBpbnZvY2F0aW9uLgotICAgKiBUT0RPKHlhdGluKTogRmlndXJlIG91dCB3aGV0aGVyIHRoaXMgb3B0aW1pemF0aW9uIGlzIGFjdHVhbGx5IG5lY2Vzc2FyeS4KLSAgICovCi0gIHByaXZhdGUgdm9sYXRpbGUgQnl0ZVN0cmluZyBtZW1vaXplZEJ5dGVzOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgTGF6eUZpZWxkTGl0ZSB3aXRoIGJ5dGVzIHRoYXQgd2lsbCBiZSBwYXJzZWQgbGF6aWx5LgotICAgKi8KLSAgcHVibGljIExhenlGaWVsZExpdGUoRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LCBCeXRlU3RyaW5nIGJ5dGVzKSB7Ci0gICAgY2hlY2tBcmd1bWVudHMoZXh0ZW5zaW9uUmVnaXN0cnksIGJ5dGVzKTsKLSAgICB0aGlzLmV4dGVuc2lvblJlZ2lzdHJ5ID0gZXh0ZW5zaW9uUmVnaXN0cnk7Ci0gICAgdGhpcy5kZWxheWVkQnl0ZXMgPSBieXRlczsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgTGF6eUZpZWxkTGl0ZSB3aXRoIG5vIGNvbnRlbnRzLCBhbmQgbm8gYWJpbGl0eSB0byBwYXJzZSBleHRlbnNpb25zLgotICAgKi8KLSAgcHVibGljIExhenlGaWVsZExpdGUoKSB7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIExhenlGaWVsZExpdGUgaW5zdGFuY2Ugd2l0aCBhIHZhbHVlLiBUaGUgTGF6eUZpZWxkTGl0ZSBtYXkgbm90IGJlIGFibGUgdG8gcGFyc2UKLSAgICogdGhlIGV4dGVuc2lvbnMgaW4gdGhlIHZhbHVlIGFzIGl0IGhhcyBubyBFeHRlbnNpb25SZWdpc3RyeS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgTGF6eUZpZWxkTGl0ZSBmcm9tVmFsdWUoTWVzc2FnZUxpdGUgdmFsdWUpIHsKLSAgICBMYXp5RmllbGRMaXRlIGxmID0gbmV3IExhenlGaWVsZExpdGUoKTsKLSAgICBsZi5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgcmV0dXJuIGxmOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIGlmICh0aGlzID09IG8pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAoIShvIGluc3RhbmNlb2YgTGF6eUZpZWxkTGl0ZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBMYXp5RmllbGRMaXRlIG90aGVyID0gKExhenlGaWVsZExpdGUpIG87Ci0gICAgCi0gICAgLy8gTGF6eSBmaWVsZHMgZG8gbm90IHdvcmsgd2VsbCB3aXRoIGVxdWFscy4uLiBJZiBib3RoIGFyZSBkZWxheWVkQnl0ZXMsIHdlIGRvIG5vdCBoYXZlIGEKLSAgICAvLyBtZWNoYW5pc20gdG8gZGVzZXJpYWxpemUgdGhlbSBzbyB3ZSByZWx5IG9uIGJ5dGVzIGVxdWFsaXR5LiBPdGhlcndpc2Ugd2UgY29lcmNlIGludG8gYW4KLSAgICAvLyBhY3R1YWwgbWVzc2FnZSAoaWYgbmVjZXNzYXJ5KSBhbmQgY2FsbCBlcXVhbHMgb24gdGhlIG1lc3NhZ2UgaXRzZWxmLiBUaGlzIGltcGxpZXMgdGhhdCB0d28KLSAgICAvLyBtZXNzYWdlcyBjYW4gYnkgdW5lcXVhbCBidXQgdGhlbiBiZSB0dXJuZWQgZXF1YWwgc2ltcGx5IGJlIGludm9raW5nIGEgZ2V0dGVyIG9uIGEgbGF6eSBmaWVsZC4KLSAgICBNZXNzYWdlTGl0ZSB2YWx1ZTEgPSB2YWx1ZTsKLSAgICBNZXNzYWdlTGl0ZSB2YWx1ZTIgPSBvdGhlci52YWx1ZTsKLSAgICBpZiAodmFsdWUxID09IG51bGwgJiYgdmFsdWUyID09IG51bGwpIHsKLSAgICAgIHJldHVybiB0b0J5dGVTdHJpbmcoKS5lcXVhbHMob3RoZXIudG9CeXRlU3RyaW5nKCkpOwotICAgIH0gZWxzZSBpZiAodmFsdWUxICE9IG51bGwgJiYgdmFsdWUyICE9IG51bGwpIHsKLSAgICAgIHJldHVybiB2YWx1ZTEuZXF1YWxzKHZhbHVlMik7Ci0gICAgfSBlbHNlIGlmICh2YWx1ZTEgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIHZhbHVlMS5lcXVhbHMob3RoZXIuZ2V0VmFsdWUodmFsdWUxLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZ2V0VmFsdWUodmFsdWUyLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSkuZXF1YWxzKHZhbHVlMik7Ci0gICAgfQotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAvLyBXZSBjYW4ndCBwcm92aWRlIGEgbWVtb2l6YWJsZSBoYXNoIGNvZGUgZm9yIGxhenkgZmllbGRzLiBUaGUgYnl0ZSBzdHJpbmdzIG1heSBoYXZlIGRpZmZlcmVudAotICAgIC8vIGhhc2ggY29kZXMgYnV0IGV2YWx1YXRlIHRvIGVxdWl2YWxlbnQgbWVzc2FnZXMuIEFuZCB3ZSBoYXZlIG5vIGZhY2lsaXR5IGZvciBjb25zdHJ1Y3RpbmcKLSAgICAvLyBhIG1lc3NhZ2UgaGVyZSBpZiB3ZSB3ZXJlIG5vdCBhbHJlYWR5IGhvbGRpbmcgYSB2YWx1ZS4KLSAgICByZXR1cm4gMTsKLSAgfQotICAKLSAgLyoqCi0gICAqIERldGVybWluZXMgd2hldGhlciB0aGlzIExhenlGaWVsZExpdGUgaW5zdGFuY2UgcmVwcmVzZW50cyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGlzIHR5cGUuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBjb250YWluc0RlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gbWVtb2l6ZWRCeXRlcyA9PSBCeXRlU3RyaW5nLkVNUFRZCi0gICAgICAgIHx8IHZhbHVlID09IG51bGwgJiYgKGRlbGF5ZWRCeXRlcyA9PSBudWxsIHx8IGRlbGF5ZWRCeXRlcyA9PSBCeXRlU3RyaW5nLkVNUFRZKTsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhcnMgdGhlIHZhbHVlIHN0YXRlIG9mIHRoaXMgaW5zdGFuY2UuCi0gICAqCi0gICAqIDxwPkxhenlGaWVsZCBpcyBub3QgdGhyZWFkLXNhZmUgZm9yIHdyaXRlIGFjY2Vzcy4gU3luY2hyb25pemF0aW9ucyBhcmUgbmVlZGVkCi0gICAqIHVuZGVyIHJlYWQvd3JpdGUgc2l0dWF0aW9ucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIC8vIERvbid0IGNsZWFyIHRoZSBFeHRlbnNpb25SZWdpc3RyeS4gSXQgbWlnaHQgcHJvdmUgdXNlZnVsIGxhdGVyIG9uIHdoZW4gbWVyZ2luZyBpbiBhbm90aGVyCi0gICAgLy8gdmFsdWUsIGJ1dCB0aGVyZSBpcyBubyBndWFyYW50ZWUgdGhhdCBpdCB3aWxsIGNvbnRhaW4gYWxsIGV4dGVuc2lvbnMgdGhhdCB3ZXJlIGRpcmVjdGx5IHNldAotICAgIC8vIG9uIHRoZSB2YWx1ZXMgdGhhdCBuZWVkIHRvIGJlIG1lcmdlZC4KLSAgICBkZWxheWVkQnl0ZXMgPSBudWxsOwotICAgIHZhbHVlID0gbnVsbDsKLSAgICBtZW1vaXplZEJ5dGVzID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBPdmVycmlkZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgTGF6eUZpZWxkLgotICAgKgotICAgKiA8cD5MYXp5RmllbGQgaXMgbm90IHRocmVhZC1zYWZlIGZvciB3cml0ZSBhY2Nlc3MuIFN5bmNocm9uaXphdGlvbnMgYXJlIG5lZWRlZAotICAgKiB1bmRlciByZWFkL3dyaXRlIHNpdHVhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXQoTGF6eUZpZWxkTGl0ZSBvdGhlcikgewotICAgIHRoaXMuZGVsYXllZEJ5dGVzID0gb3RoZXIuZGVsYXllZEJ5dGVzOwotICAgIHRoaXMudmFsdWUgPSBvdGhlci52YWx1ZTsKLSAgICB0aGlzLm1lbW9pemVkQnl0ZXMgPSBvdGhlci5tZW1vaXplZEJ5dGVzOwotICAgIC8vIElmIHRoZSBvdGhlciBMYXp5RmllbGRMaXRlIHdhcyBjcmVhdGVkIGJ5IGRpcmVjdGx5IHNldHRpbmcgdGhlIHZhbHVlIHJhdGhlciB0aGFuIGZpcnN0IGJ5Ci0gICAgLy8gcGFyc2luZywgdGhlbiBpdCB3aWxsIG5vdCBoYXZlIGFuIGV4dGVuc2lvblJlZ2lzdHJ5LiBJbiB0aGlzIGNhc2Ugd2UgaG9sZCBvbiB0byB0aGUgZXhpc3RpbmcKLSAgICAvLyBleHRlbnNpb25SZWdpc3RyeSwgd2hpY2ggaGFzIG5vIGd1YXJhbnRlZXMgdGhhdCBpdCBoYXMgYWxsIHRoZSBleHRlbnNpb25zIHRoYXQgd2lsbCBiZQotICAgIC8vIGRpcmVjdGx5IHNldCBvbiB0aGUgdmFsdWUuCi0gICAgaWYgKG90aGVyLmV4dGVuc2lvblJlZ2lzdHJ5ICE9IG51bGwpIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9uUmVnaXN0cnkgPSBvdGhlci5leHRlbnNpb25SZWdpc3RyeTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBtZXNzYWdlIGluc3RhbmNlLiBJdCBtYXkgZG8gc29tZSB0aHJlYWQtc2FmZSBkZWxheWVkIHBhcnNpbmcgb2YgYnl0ZXMuCi0gICAqCi0gICAqIEBwYXJhbSBkZWZhdWx0SW5zdGFuY2UgaXRzIG1lc3NhZ2UncyBkZWZhdWx0IGluc3RhbmNlLiBJdCdzIGFsc28gdXNlZCB0byBnZXQgcGFyc2VyIGZvciB0aGUKLSAgICogbWVzc2FnZSB0eXBlLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VMaXRlIGdldFZhbHVlKE1lc3NhZ2VMaXRlIGRlZmF1bHRJbnN0YW5jZSkgewotICAgIGVuc3VyZUluaXRpYWxpemVkKGRlZmF1bHRJbnN0YW5jZSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBpbnN0YW5jZSBhbmQgcmV0dXJucyB0aGUgb2xkIHZhbHVlIHdpdGhvdXQgZGVsYXkgcGFyc2luZyBhbnl0aGluZy4KLSAgICoKLSAgICogPHA+TGF6eUZpZWxkIGlzIG5vdCB0aHJlYWQtc2FmZSBmb3Igd3JpdGUgYWNjZXNzLiBTeW5jaHJvbml6YXRpb25zIGFyZSBuZWVkZWQKLSAgICogdW5kZXIgcmVhZC93cml0ZSBzaXR1YXRpb25zLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VMaXRlIHNldFZhbHVlKE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgTWVzc2FnZUxpdGUgb3JpZ2luYWxWYWx1ZSA9IHRoaXMudmFsdWU7Ci0gICAgdGhpcy5kZWxheWVkQnl0ZXMgPSBudWxsOwotICAgIHRoaXMubWVtb2l6ZWRCeXRlcyA9IG51bGw7Ci0gICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIHJldHVybiBvcmlnaW5hbFZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIE1lcmdlcyBhbm90aGVyIGluc3RhbmNlJ3MgY29udGVudHMuIEluIHNvbWUgY2FzZXMgbWF5IGRyb3Agc29tZSBleHRlbnNpb25zIGlmIGJvdGggZmllbGRzCi0gICAqIGNvbnRhaW4gZGF0YS4gSWYgdGhlIG90aGVyIGZpZWxkIGhhcyBhbiB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnl9IGJ1dCB0aGlzIGRvZXMgbm90LCB0aGVuIHRoaXMKLSAgICogZmllbGQgd2lsbCBjb3B5IG92ZXIgdGhhdCB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnl9LgotICAgKgotICAgKiA8cD5MYXp5RmllbGQgaXMgbm90IHRocmVhZC1zYWZlIGZvciB3cml0ZSBhY2Nlc3MuIFN5bmNocm9uaXphdGlvbnMgYXJlIG5lZWRlZAotICAgKiB1bmRlciByZWFkL3dyaXRlIHNpdHVhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBtZXJnZShMYXp5RmllbGRMaXRlIG90aGVyKSB7Ci0gICAgaWYgKG90aGVyLmNvbnRhaW5zRGVmYXVsdEluc3RhbmNlKCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAodGhpcy5jb250YWluc0RlZmF1bHRJbnN0YW5jZSgpKSB7Ci0gICAgICBzZXQob3RoZXIpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIElmIHRoZSBvdGhlciBmaWVsZCBoYXMgYW4gZXh0ZW5zaW9uIHJlZ2lzdHJ5IGJ1dCB0aGlzIGRvZXMgbm90LCBjb3B5IG92ZXIgdGhlIG90aGVyIGV4dGVuc2lvbgotICAgIC8vIHJlZ2lzdHJ5LgotICAgIGlmICh0aGlzLmV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9uUmVnaXN0cnkgPSBvdGhlci5leHRlbnNpb25SZWdpc3RyeTsKLSAgICB9Ci0KLSAgICAvLyBJbiB0aGUgY2FzZSB0aGF0IGJvdGggb2YgdGhlbSBhcmUgbm90IHBhcnNlZCB3ZSBzaW1wbHkgY29uY2F0ZW5hdGUgdGhlIGJ5dGVzIHRvIHNhdmUgdGltZS4gSW4KLSAgICAvLyB0aGUgKHByb2JhYmx5IHJhcmUpIGNhc2UgdGhhdCB0aGV5IGhhdmUgZGlmZmVyZW50IGV4dGVuc2lvbiByZWdpc3RyaWVzIHRoZXJlIGlzIGEgY2hhbmNlIHRoYXQKLSAgICAvLyBzb21lIG9mIHRoZSBleHRlbnNpb25zIG1heSBiZSBkcm9wcGVkLCBidXQgdGhlIHRyYWRlb2ZmIG9mIG1ha2luZyB0aGlzIG9wZXJhdGlvbiBmYXN0IHNlZW1zCi0gICAgLy8gdG8gb3V0d2F5IHRoZSBiZW5lZml0cyBvZiBjb21iaW5pbmcgdGhlIGV4dGVuc2lvbiByZWdpc3RyaWVzLCB3aGljaCBpcyBub3Qgbm9ybWFsbHkgZG9uZSBmb3IKLSAgICAvLyBsaXRlIHByb3RvcyBhbnl3YXlzLgotICAgIGlmICh0aGlzLmRlbGF5ZWRCeXRlcyAhPSBudWxsICYmIG90aGVyLmRlbGF5ZWRCeXRlcyAhPSBudWxsKSB7Ci0gICAgICB0aGlzLmRlbGF5ZWRCeXRlcyA9IHRoaXMuZGVsYXllZEJ5dGVzLmNvbmNhdChvdGhlci5kZWxheWVkQnl0ZXMpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIEF0IGxlYXN0IG9uZSBpcyBwYXJzZWQgYW5kIGJvdGggY29udGFpbiBkYXRhLiBXZSB3b24ndCBkcm9wIGFueSBleHRlbnNpb25zIGhlcmUgZGlyZWN0bHksIGJ1dAotICAgIC8vIGluIHRoZSBjYXNlIHRoYXQgdGhlIGV4dGVuc2lvbiByZWdpc3RyaWVzIGFyZSBub3QgdGhlIHNhbWUgdGhlbiB3ZSBtaWdodCBpbiB0aGUgZnV0dXJlIGlmIHdlCi0gICAgLy8gbmVlZCB0byBzZXJpYWx6ZSBhbmQgcGFyc2UgYSBtZXNzYWdlIGFnYWluLgotICAgIGlmICh0aGlzLnZhbHVlID09IG51bGwgJiYgb3RoZXIudmFsdWUgIT0gbnVsbCkgewotICAgICAgc2V0VmFsdWUobWVyZ2VWYWx1ZUFuZEJ5dGVzKG90aGVyLnZhbHVlLCB0aGlzLmRlbGF5ZWRCeXRlcywgdGhpcy5leHRlbnNpb25SZWdpc3RyeSkpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSBpZiAodGhpcy52YWx1ZSAhPSBudWxsICYmIG90aGVyLnZhbHVlID09IG51bGwpIHsKLSAgICAgIHNldFZhbHVlKG1lcmdlVmFsdWVBbmRCeXRlcyh0aGlzLnZhbHVlLCBvdGhlci5kZWxheWVkQnl0ZXMsIG90aGVyLmV4dGVuc2lvblJlZ2lzdHJ5KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gQXQgdGhpcyBwb2ludCB3ZSBoYXZlIHR3byBmdWxseSBwYXJzZWQgbWVzc2FnZXMuIFdlIGNhbid0IG1lcmdlIGRpcmVjdGx5IGZyb20gb25lIHRvIHRoZQotICAgIC8vIG90aGVyIGJlY2F1c2Ugb25seSBnZW5lcmF0ZWQgYnVpbGRlciBjb2RlIGNvbnRhaW5zIG1ldGhvZHMgdG8gbWVyZ2VGcm9tIGFub3RoZXIgcGFyc2VkCi0gICAgLy8gbWVzc2FnZS4gV2UgaGF2ZSB0byBzZXJpYWxpemUgb25lIGluc3RhbmNlIGFuZCB0aGVuIG1lcmdlIHRoZSBieXRlcyBpbnRvIHRoZSBvdGhlci4gVGhpcyBtYXkKLSAgICAvLyBkcm9wIGV4dGVuc2lvbnMgZnJvbSBvbmUgb2YgdGhlIG1lc3NhZ2VzIGlmIG9uZSBvZiB0aGUgdmFsdWVzIGhhZCBhbiBleHRlbnNpb24gc2V0IG9uIGl0Ci0gICAgLy8gZGlyZWN0bHkuCi0gICAgLy8KLSAgICAvLyBUbyBtaXRpZ2F0ZSB0aGlzIHdlIHByZWZlciBzZXJpYWxpemluZyBhIG1lc3NhZ2UgdGhhdCBoYXMgYW4gZXh0ZW5zaW9uIHJlZ2lzdHJ5LCBhbmQKLSAgICAvLyB0aGVyZWZvcmUgYSBjaGFuY2UgdGhhdCBhbGwgZXh0ZW5zaW9ucyBzZXQgb24gaXQgYXJlIGluIHRoYXQgcmVnaXN0cnkuCi0gICAgLy8KLSAgICAvLyBOT1RFOiBUaGUgY2hlY2sgZm9yIG90aGVyLmV4dGVuc2lvblJlZ2lzdHJ5IG5vdCBiZWluZyBudWxsIG11c3QgY29tZSBmaXJzdCBiZWNhdXNlIGF0IHRoaXMKLSAgICAvLyBwb2ludCBpbiB0aW1lIGlmIG90aGVyLmV4dGVuc2lvblJlZ2lzdHJ5IGlzIG5vdCBudWxsIHRoZW4gdGhpcy5leHRlbnNpb25SZWdpc3RyeSB3aWxsIG5vdCBiZQotICAgIC8vIG51bGwgZWl0aGVyLgotICAgIGlmIChvdGhlci5leHRlbnNpb25SZWdpc3RyeSAhPSBudWxsKSB7Ci0gICAgICBzZXRWYWx1ZShtZXJnZVZhbHVlQW5kQnl0ZXModGhpcy52YWx1ZSwgb3RoZXIudG9CeXRlU3RyaW5nKCksIG90aGVyLmV4dGVuc2lvblJlZ2lzdHJ5KSk7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmICh0aGlzLmV4dGVuc2lvblJlZ2lzdHJ5ICE9IG51bGwpIHsKLSAgICAgIHNldFZhbHVlKG1lcmdlVmFsdWVBbmRCeXRlcyhvdGhlci52YWx1ZSwgdGhpcy50b0J5dGVTdHJpbmcoKSwgdGhpcy5leHRlbnNpb25SZWdpc3RyeSkpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBBbGwgZXh0ZW5zaW9ucyBmcm9tIHRoZSBvdGhlciBtZXNzYWdlIHdpbGwgYmUgZHJvcHBlZCBiZWNhdXNlIHdlIGhhdmUgbm8gcmVnaXN0cnkuCi0gICAgICBzZXRWYWx1ZShtZXJnZVZhbHVlQW5kQnl0ZXModGhpcy52YWx1ZSwgb3RoZXIudG9CeXRlU3RyaW5nKCksIEVNUFRZX1JFR0lTVFJZKSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogTWVyZ2VzIGFub3RoZXIgaW5zdGFuY2UncyBjb250ZW50cyBmcm9tIGEgc3RyZWFtLgotICAgKgotICAgKiA8cD5MYXp5RmllbGQgaXMgbm90IHRocmVhZC1zYWZlIGZvciB3cml0ZSBhY2Nlc3MuIFN5bmNocm9uaXphdGlvbnMgYXJlIG5lZWRlZAotICAgKiB1bmRlciByZWFkL3dyaXRlIHNpdHVhdGlvbnMuCi0gICAqLwotICBwdWJsaWMgdm9pZCBtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAodGhpcy5jb250YWluc0RlZmF1bHRJbnN0YW5jZSgpKSB7Ci0gICAgICBzZXRCeXRlU3RyaW5nKGlucHV0LnJlYWRCeXRlcygpLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gSWYgdGhlIG90aGVyIGZpZWxkIGhhcyBhbiBleHRlbnNpb24gcmVnaXN0cnkgYnV0IHRoaXMgZG9lcyBub3QsIGNvcHkgb3ZlciB0aGUgb3RoZXIgZXh0ZW5zaW9uCi0gICAgLy8gcmVnaXN0cnkuCi0gICAgaWYgKHRoaXMuZXh0ZW5zaW9uUmVnaXN0cnkgPT0gbnVsbCkgewotICAgICAgdGhpcy5leHRlbnNpb25SZWdpc3RyeSA9IGV4dGVuc2lvblJlZ2lzdHJ5OwotICAgIH0KLQotICAgIC8vIEluIHRoZSBjYXNlIHRoYXQgYm90aCBvZiB0aGVtIGFyZSBub3QgcGFyc2VkIHdlIHNpbXBseSBjb25jYXRlbmF0ZSB0aGUgYnl0ZXMgdG8gc2F2ZSB0aW1lLiBJbgotICAgIC8vIHRoZSAocHJvYmFibHkgcmFyZSkgY2FzZSB0aGF0IHRoZXkgaGF2ZSBkaWZmZXJlbnQgZXh0ZW5zaW9uIHJlZ2lzdHJpZXMgdGhlcmUgaXMgYSBjaGFuY2UgdGhhdAotICAgIC8vIHNvbWUgb2YgdGhlIGV4dGVuc2lvbnMgbWF5IGJlIGRyb3BwZWQsIGJ1dCB0aGUgdHJhZGVvZmYgb2YgbWFraW5nIHRoaXMgb3BlcmF0aW9uIGZhc3Qgc2VlbXMKLSAgICAvLyB0byBvdXR3YXkgdGhlIGJlbmVmaXRzIG9mIGNvbWJpbmluZyB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJpZXMsIHdoaWNoIGlzIG5vdCBub3JtYWxseSBkb25lIGZvcgotICAgIC8vIGxpdGUgcHJvdG9zIGFueXdheXMuCi0gICAgaWYgKHRoaXMuZGVsYXllZEJ5dGVzICE9IG51bGwpIHsKLSAgICAgIHNldEJ5dGVTdHJpbmcodGhpcy5kZWxheWVkQnl0ZXMuY29uY2F0KGlucHV0LnJlYWRCeXRlcygpKSwgdGhpcy5leHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gV2UgYXJlIHBhcnNlZCBhbmQgYm90aCBjb250YWluIGRhdGEuIFdlIHdvbid0IGRyb3AgYW55IGV4dGVuc2lvbnMgaGVyZSBkaXJlY3RseSwgYnV0IGluIHRoZQotICAgIC8vIGNhc2UgdGhhdCB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJpZXMgYXJlIG5vdCB0aGUgc2FtZSB0aGVuIHdlIG1pZ2h0IGluIHRoZSBmdXR1cmUgaWYgd2UKLSAgICAvLyBuZWVkIHRvIHNlcmlhbGl6ZSBhbmQgcGFyc2UgYSBtZXNzYWdlIGFnYWluLgotICAgIHRyeSB7Ci0gICAgICBzZXRWYWx1ZSh2YWx1ZS50b0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZCgpKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gTm90aGluZyBpcyBsb2dnZWQgYW5kIG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93bi4gQ2xpZW50cyB3aWxsIGJlIHVuYXdhcmUgdGhhdCBhIHByb3RvCi0gICAgICAvLyB3YXMgaW52YWxpZC4KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlTGl0ZSBtZXJnZVZhbHVlQW5kQnl0ZXMoCi0gICAgICBNZXNzYWdlTGl0ZSB2YWx1ZSwgQnl0ZVN0cmluZyBvdGhlckJ5dGVzLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIHZhbHVlLnRvQnVpbGRlcigpLm1lcmdlRnJvbShvdGhlckJ5dGVzLCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGQoKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gTm90aGluZyBpcyBsb2dnZWQgYW5kIG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93bi4gQ2xpZW50cyB3aWxsIGJlIHVuYXdhcmUgdGhhdCBhIHByb3RvCi0gICAgICAvLyB3YXMgaW52YWxpZC4KLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyB0aGlzIGZpZWxkIHdpdGggYnl0ZXMgdG8gZGVsYXktcGFyc2UuCi0gICAqLwotICBwdWJsaWMgdm9pZCBzZXRCeXRlU3RyaW5nKEJ5dGVTdHJpbmcgYnl0ZXMsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkgewotICAgIGNoZWNrQXJndW1lbnRzKGV4dGVuc2lvblJlZ2lzdHJ5LCBieXRlcyk7Ci0gICAgdGhpcy5kZWxheWVkQnl0ZXMgPSBieXRlczsKLSAgICB0aGlzLmV4dGVuc2lvblJlZ2lzdHJ5ID0gZXh0ZW5zaW9uUmVnaXN0cnk7Ci0gICAgdGhpcy52YWx1ZSA9IG51bGw7Ci0gICAgdGhpcy5tZW1vaXplZEJ5dGVzID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBEdWUgdG8gdGhlIG9wdGlvbmFsIGZpZWxkIGNhbiBiZSBkdXBsaWNhdGVkIGF0IHRoZSBlbmQgb2Ygc2VyaWFsaXplZAotICAgKiBieXRlcywgd2hpY2ggd2lsbCBtYWtlIHRoZSBzZXJpYWxpemVkIHNpemUgY2hhbmdlZCBhZnRlciBMYXp5RmllbGQKLSAgICogcGFyc2VkLiBCZSBjYXJlZnVsIHdoZW4gdXNpbmcgdGhpcyBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgIC8vIFdlICptdXN0KiByZXR1cm4gZGVsYXllZCBieXRlcyBzaXplIGlmIGl0IHdhcyBldmVyIHNldCBiZWNhdXNlIHRoZSBkZXBlbmRlbnQgbWVzc2FnZXMgbWF5Ci0gICAgLy8gaGF2ZSBtZW1vaXplZCBzZXJpYWxpemVkIHNpemUgYmFzZWQgb2ZmIG9mIGl0LgotICAgIGlmIChtZW1vaXplZEJ5dGVzICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBtZW1vaXplZEJ5dGVzLnNpemUoKTsKLSAgICB9IGVsc2UgaWYgKGRlbGF5ZWRCeXRlcyAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gZGVsYXllZEJ5dGVzLnNpemUoKTsKLSAgICB9IGVsc2UgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgIHJldHVybiB2YWx1ZS5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyBhIEJ5dGVzU3RyaW5nIGZvciB0aGlzIGZpZWxkIGluIGEgdGhyZWFkLXNhZmUgd2F5LgotICAgKi8KLSAgcHVibGljIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgewotICAgIGlmIChtZW1vaXplZEJ5dGVzICE9IG51bGwpIHsKLSAgICAgIHJldHVybiBtZW1vaXplZEJ5dGVzOwotICAgIH0KLSAgICAvLyBXZSAqbXVzdCogcmV0dXJuIGRlbGF5ZWQgYnl0ZXMgaWYgaXQgd2FzIHNldCBiZWNhdXNlIHRoZSBkZXBlbmRlbnQgbWVzc2FnZXMgbWF5IGhhdmUKLSAgICAvLyBtZW1vaXplZCBzZXJpYWxpemVkIHNpemUgYmFzZWQgb2ZmIG9mIGl0LgotICAgIGlmIChkZWxheWVkQnl0ZXMgIT0gbnVsbCkgewotICAgICAgcmV0dXJuIGRlbGF5ZWRCeXRlczsKLSAgICB9Ci0gICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICBpZiAobWVtb2l6ZWRCeXRlcyAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBtZW1vaXplZEJ5dGVzOwotICAgICAgfQotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgbWVtb2l6ZWRCeXRlcyA9IEJ5dGVTdHJpbmcuRU1QVFk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtZW1vaXplZEJ5dGVzID0gdmFsdWUudG9CeXRlU3RyaW5nKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbWVtb2l6ZWRCeXRlczsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTWlnaHQgbGF6aWx5IHBhcnNlIHRoZSBieXRlcyB0aGF0IHdlcmUgcHJldmlvdXNseSBwYXNzZWQgaW4uIElzIHRocmVhZC1zYWZlLgotICAgKi8KLSAgcHJvdGVjdGVkIHZvaWQgZW5zdXJlSW5pdGlhbGl6ZWQoTWVzc2FnZUxpdGUgZGVmYXVsdEluc3RhbmNlKSB7Ci0gICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc3luY2hyb25pemVkICh0aGlzKSB7Ci0gICAgICBpZiAodmFsdWUgIT0gbnVsbCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBpZiAoZGVsYXllZEJ5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAvLyBUaGUgZXh0ZW5zaW9uUmVnaXN0cnkgc2hvdWxkbid0IGJlIG51bGwgaGVyZSBzaW5jZSB3ZSBoYXZlIGRlbGF5ZWRCeXRlcy4KLSAgICAgICAgICBNZXNzYWdlTGl0ZSBwYXJzZWRWYWx1ZSA9IGRlZmF1bHRJbnN0YW5jZS5nZXRQYXJzZXJGb3JUeXBlKCkKLSAgICAgICAgICAgICAgLnBhcnNlRnJvbShkZWxheWVkQnl0ZXMsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICB0aGlzLnZhbHVlID0gcGFyc2VkVmFsdWU7Ci0gICAgICAgICAgdGhpcy5tZW1vaXplZEJ5dGVzID0gZGVsYXllZEJ5dGVzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRoaXMudmFsdWUgPSBkZWZhdWx0SW5zdGFuY2U7Ci0gICAgICAgICAgdGhpcy5tZW1vaXplZEJ5dGVzID0gQnl0ZVN0cmluZy5FTVBUWTsKLSAgICAgICAgfQotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gTm90aGluZyBpcyBsb2dnZWQgYW5kIG5vIGV4Y2VwdGlvbnMgYXJlIHRocm93bi4gQ2xpZW50cyB3aWxsIGJlIHVuYXdhcmUgdGhhdCB0aGlzIHByb3RvCi0gICAgICAgIC8vIHdhcyBpbnZhbGlkLgotICAgICAgICB0aGlzLnZhbHVlID0gZGVmYXVsdEluc3RhbmNlOwotICAgICAgICB0aGlzLm1lbW9pemVkQnl0ZXMgPSBCeXRlU3RyaW5nLkVNUFRZOwotICAgICAgfQotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBjaGVja0FyZ3VtZW50cyhFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksIEJ5dGVTdHJpbmcgYnl0ZXMpIHsKLSAgICBpZiAoZXh0ZW5zaW9uUmVnaXN0cnkgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJmb3VuZCBudWxsIEV4dGVuc2lvblJlZ2lzdHJ5Iik7Ci0gICAgfQotICAgIGlmIChieXRlcyA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oImZvdW5kIG51bGwgQnl0ZVN0cmluZyIpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ3NGM1MS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyMyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExhenlTdHJpbmdMaXN0fSB0aGF0IHdyYXBzIGFuIEFycmF5TGlzdC4gRWFjaAotICogZWxlbWVudCBpcyBvbmUgb2YgU3RyaW5nLCBCeXRlU3RyaW5nLCBvciBieXRlW10uIEl0IGNhY2hlcyB0aGUgbGFzdCBvbmUKLSAqIHJlcXVlc3RlZCB3aGljaCBpcyBtb3N0IGxpa2VseSB0aGUgb25lIG5lZWRlZCBuZXh0LiBUaGlzIG1pbmltaXplcyBtZW1vcnkKLSAqIHVzYWdlIHdoaWxlIHNhdGlzZnlpbmcgdGhlIG1vc3QgY29tbW9uIHVzZSBjYXNlcy4KLSAqIDxwPgotICogPHN0cm9uZz5Ob3RlIHRoYXQgdGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBub3Qgc3luY2hyb25pemVkLjwvc3Ryb25nPgotICogSWYgbXVsdGlwbGUgdGhyZWFkcyBhY2Nlc3MgYW4gPHR0PkFycmF5TGlzdDwvdHQ+IGluc3RhbmNlIGNvbmN1cnJlbnRseSwKLSAqIGFuZCBhdCBsZWFzdCBvbmUgb2YgdGhlIHRocmVhZHMgbW9kaWZpZXMgdGhlIGxpc3Qgc3RydWN0dXJhbGx5LCBpdAotICogPGk+bXVzdDwvaT4gYmUgc3luY2hyb25pemVkIGV4dGVybmFsbHkuICAoQSBzdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbiBpcwotICogYW55IG9wZXJhdGlvbiB0aGF0IGFkZHMgb3IgZGVsZXRlcyBvbmUgb3IgbW9yZSBlbGVtZW50cywgb3IgZXhwbGljaXRseQotICogcmVzaXplcyB0aGUgYmFja2luZyBhcnJheTsgbWVyZWx5IHNldHRpbmcgdGhlIHZhbHVlIG9mIGFuIGVsZW1lbnQgaXMgbm90Ci0gKiBhIHN0cnVjdHVyYWwgbW9kaWZpY2F0aW9uLikgIFRoaXMgaXMgdHlwaWNhbGx5IGFjY29tcGxpc2hlZCBieQotICogc3luY2hyb25pemluZyBvbiBzb21lIG9iamVjdCB0aGF0IG5hdHVyYWxseSBlbmNhcHN1bGF0ZXMgdGhlIGxpc3QuCi0gKiA8cD4KLSAqIElmIHRoZSBpbXBsZW1lbnRhdGlvbiBpcyBhY2Nlc3NlZCB2aWEgY29uY3VycmVudCByZWFkcywgdGhpcyBpcyB0aHJlYWQgc2FmZS4KLSAqIENvbnZlcnNpb25zIGFyZSBkb25lIGluIGEgdGhyZWFkIHNhZmUgbWFubmVyLiBJdCdzIHBvc3NpYmxlIHRoYXQgdGhlCi0gKiBjb252ZXJzaW9uIG1heSBoYXBwZW4gbW9yZSB0aGFuIG9uY2UgaWYgdHdvIHRocmVhZHMgYXR0ZW1wdCB0byBhY2Nlc3MgdGhlCi0gKiBzYW1lIGVsZW1lbnQgYW5kIHRoZSBtb2RpZmljYXRpb25zIHdlcmUgbm90IHZpc2libGUgdG8gZWFjaCBvdGhlciwgYnV0IHRoaXMKLSAqIHdpbGwgbm90IHJlc3VsdCBpbiBhbnkgY29ycnVwdGlvbiBvZiB0aGUgbGlzdCBvciBjaGFuZ2UgaW4gYmVoYXZpb3Igb3RoZXIKLSAqIHRoYW4gcGVyZm9ybWFuY2UuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5U3RyaW5nQXJyYXlMaXN0IGV4dGVuZHMgQWJzdHJhY3RQcm90b2J1Zkxpc3Q8U3RyaW5nPgotICAgIGltcGxlbWVudHMgTGF6eVN0cmluZ0xpc3QsIFJhbmRvbUFjY2VzcyB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgTGF6eVN0cmluZ0FycmF5TGlzdCBFTVBUWV9MSVNUID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKLSAgc3RhdGljIHsKLSAgICBFTVBUWV9MSVNULm1ha2VJbW11dGFibGUoKTsKLSAgfQotICAKLSAgc3RhdGljIExhenlTdHJpbmdBcnJheUxpc3QgZW1wdHlMaXN0KCkgewotICAgIHJldHVybiBFTVBUWV9MSVNUOwotICB9Ci0KLSAgLy8gRm9yIGNvbXBhdGliaWxpdHkgd2l0aCBvbGRlciBydW50aW1lcy4KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBMYXp5U3RyaW5nTGlzdCBFTVBUWSA9IEVNUFRZX0xJU1Q7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdDsKLQotICBwdWJsaWMgTGF6eVN0cmluZ0FycmF5TGlzdCgpIHsKLSAgICB0aGlzKERFRkFVTFRfQ0FQQUNJVFkpOwotICB9Ci0KLSAgcHVibGljIExhenlTdHJpbmdBcnJheUxpc3QoaW50IGludGlhbENhcGFjaXR5KSB7Ci0gICAgdGhpcyhuZXcgQXJyYXlMaXN0PE9iamVjdD4oaW50aWFsQ2FwYWNpdHkpKTsKLSAgfQotCi0gIHB1YmxpYyBMYXp5U3RyaW5nQXJyYXlMaXN0KExhenlTdHJpbmdMaXN0IGZyb20pIHsKLSAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGZyb20uc2l6ZSgpKTsKLSAgICBhZGRBbGwoZnJvbSk7Ci0gIH0KLQotICBwdWJsaWMgTGF6eVN0cmluZ0FycmF5TGlzdChMaXN0PFN0cmluZz4gZnJvbSkgewotICAgIHRoaXMobmV3IEFycmF5TGlzdDxPYmplY3Q+KGZyb20pKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBMYXp5U3RyaW5nQXJyYXlMaXN0KEFycmF5TGlzdDxPYmplY3Q+IGxpc3QpIHsKLSAgICB0aGlzLmxpc3QgPSBsaXN0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMYXp5U3RyaW5nQXJyYXlMaXN0IG11dGFibGVDb3B5V2l0aENhcGFjaXR5KGludCBjYXBhY2l0eSkgewotICAgIGlmIChjYXBhY2l0eSA8IHNpemUoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBBcnJheUxpc3Q8T2JqZWN0PiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KGNhcGFjaXR5KTsKLSAgICBuZXdMaXN0LmFkZEFsbChsaXN0KTsKLSAgICByZXR1cm4gbmV3IExhenlTdHJpbmdBcnJheUxpc3QobmV3TGlzdCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7Ci0gICAgT2JqZWN0IG8gPSBsaXN0LmdldChpbmRleCk7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKSBvOwotICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpIHsKLSAgICAgIEJ5dGVTdHJpbmcgYnMgPSAoQnl0ZVN0cmluZykgbzsKLSAgICAgIFN0cmluZyBzID0gYnMudG9TdHJpbmdVdGY4KCk7Ci0gICAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSkgewotICAgICAgICBsaXN0LnNldChpbmRleCwgcyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gczsKLSAgICB9IGVsc2UgewotICAgICAgYnl0ZVtdIGJhID0gKGJ5dGVbXSkgbzsKLSAgICAgIFN0cmluZyBzID0gSW50ZXJuYWwudG9TdHJpbmdVdGY4KGJhKTsKLSAgICAgIGlmIChJbnRlcm5hbC5pc1ZhbGlkVXRmOChiYSkpIHsKLSAgICAgICAgbGlzdC5zZXQoaW5kZXgsIHMpOwotICAgICAgfQotICAgICAgcmV0dXJuIHM7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBzZXQoaW50IGluZGV4LCBTdHJpbmcgcykgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIE9iamVjdCBvID0gbGlzdC5zZXQoaW5kZXgsIHMpOwotICAgIHJldHVybiBhc1N0cmluZyhvKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBTdHJpbmcgZWxlbWVudCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKLSAgICBtb2RDb3VudCsrOwotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYWRkKGludCBpbmRleCwgQnl0ZVN0cmluZyBlbGVtZW50KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgbGlzdC5hZGQoaW5kZXgsIGVsZW1lbnQpOwotICAgIG1vZENvdW50Kys7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBhZGQoaW50IGluZGV4LCBieXRlW10gZWxlbWVudCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKLSAgICBtb2RDb3VudCsrOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBTdHJpbmc+IGMpIHsKLSAgICAvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBBYnN0cmFjdENvbGxlY3Rpb24uYWRkQWxsKENvbGxlY3Rpb24pCi0gICAgLy8gZGVsZWdhdGVzIHRvIGFkZChPYmplY3QpLiBUaGlzIGltcGxlbWVudGF0aW9uIGluc3RlYWQgZGVsZWdhdGVzIHRvCi0gICAgLy8gYWRkQWxsKGludCwgQ29sbGVjdGlvbiksIHdoaWNoIG1ha2VzIGEgc3BlY2lhbCBjYXNlIGZvciBDb2xsZWN0aW9ucwotICAgIC8vIHdoaWNoIGFyZSBpbnN0YW5jZXMgb2YgTGF6eVN0cmluZ0xpc3QuCi0gICAgcmV0dXJuIGFkZEFsbChzaXplKCksIGMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGFkZEFsbChpbnQgaW5kZXgsIENvbGxlY3Rpb248PyBleHRlbmRzIFN0cmluZz4gYykgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIC8vIFdoZW4gY29weWluZyBmcm9tIGFub3RoZXIgTGF6eVN0cmluZ0xpc3QsIGRpcmVjdGx5IGNvcHkgdGhlIHVuZGVybHlpbmcKLSAgICAvLyBlbGVtZW50cyByYXRoZXIgdGhhbiBmb3JjaW5nIGVhY2ggZWxlbWVudCB0byBiZSBkZWNvZGVkIHRvIGEgU3RyaW5nLgotICAgIENvbGxlY3Rpb248Pz4gY29sbGVjdGlvbiA9IGMgaW5zdGFuY2VvZiBMYXp5U3RyaW5nTGlzdAotICAgICAgICA/ICgoTGF6eVN0cmluZ0xpc3QpIGMpLmdldFVuZGVybHlpbmdFbGVtZW50cygpIDogYzsKLSAgICBib29sZWFuIHJldCA9IGxpc3QuYWRkQWxsKGluZGV4LCBjb2xsZWN0aW9uKTsKLSAgICBtb2RDb3VudCsrOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsQnl0ZVN0cmluZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBCeXRlU3RyaW5nPiB2YWx1ZXMpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBib29sZWFuIHJldCA9IGxpc3QuYWRkQWxsKHZhbHVlcyk7Ci0gICAgbW9kQ291bnQrKzsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGFkZEFsbEJ5dGVBcnJheShDb2xsZWN0aW9uPGJ5dGVbXT4gYykgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGJvb2xlYW4gcmV0ID0gbGlzdC5hZGRBbGwoYyk7Ci0gICAgbW9kQ291bnQrKzsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgcmVtb3ZlKGludCBpbmRleCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIE9iamVjdCBvID0gbGlzdC5yZW1vdmUoaW5kZXgpOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIGFzU3RyaW5nKG8pOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGxpc3QuY2xlYXIoKTsKLSAgICBtb2RDb3VudCsrOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZChCeXRlU3RyaW5nIGVsZW1lbnQpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBsaXN0LmFkZChlbGVtZW50KTsKLSAgICBtb2RDb3VudCsrOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgYWRkKGJ5dGVbXSBlbGVtZW50KSB7Ci0gICAgZW5zdXJlSXNNdXRhYmxlKCk7Ci0gICAgbGlzdC5hZGQoZWxlbWVudCk7Ci0gICAgbW9kQ291bnQrKzsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgT2JqZWN0IGdldFJhdyhpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbGlzdC5nZXQoaW5kZXgpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIEJ5dGVTdHJpbmcgZ2V0Qnl0ZVN0cmluZyhpbnQgaW5kZXgpIHsKLSAgICBPYmplY3QgbyA9IGxpc3QuZ2V0KGluZGV4KTsKLSAgICBCeXRlU3RyaW5nIGIgPSBhc0J5dGVTdHJpbmcobyk7Ci0gICAgaWYgKGIgIT0gbykgewotICAgICAgbGlzdC5zZXQoaW5kZXgsIGIpOwotICAgIH0KLSAgICByZXR1cm4gYjsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBieXRlW10gZ2V0Qnl0ZUFycmF5KGludCBpbmRleCkgewotICAgIE9iamVjdCBvID0gbGlzdC5nZXQoaW5kZXgpOwotICAgIGJ5dGVbXSBiID0gYXNCeXRlQXJyYXkobyk7Ci0gICAgaWYgKGIgIT0gbykgewotICAgICAgbGlzdC5zZXQoaW5kZXgsIGIpOwotICAgIH0KLSAgICByZXR1cm4gYjsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXQoaW50IGluZGV4LCBCeXRlU3RyaW5nIHMpIHsKLSAgICBzZXRBbmRSZXR1cm4oaW5kZXgsIHMpOwotICB9Ci0gIAotICBwcml2YXRlIE9iamVjdCBzZXRBbmRSZXR1cm4oaW50IGluZGV4LCBCeXRlU3RyaW5nIHMpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICByZXR1cm4gbGlzdC5zZXQoaW5kZXgsIHMpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIGJ5dGVbXSBzKSB7Ci0gICAgc2V0QW5kUmV0dXJuKGluZGV4LCBzKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBPYmplY3Qgc2V0QW5kUmV0dXJuKGludCBpbmRleCwgYnl0ZVtdIHMpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICByZXR1cm4gbGlzdC5zZXQoaW5kZXgsIHMpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGFzU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKSBvOwotICAgIH0gZWxzZSBpZiAobyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpIHsKLSAgICAgIHJldHVybiAoKEJ5dGVTdHJpbmcpIG8pLnRvU3RyaW5nVXRmOCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gSW50ZXJuYWwudG9TdHJpbmdVdGY4KChieXRlW10pIG8pOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBhc0J5dGVTdHJpbmcoT2JqZWN0IG8pIHsKLSAgICBpZiAobyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpIHsKLSAgICAgIHJldHVybiAoQnl0ZVN0cmluZykgbzsKLSAgICB9IGVsc2UgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgoU3RyaW5nKSBvKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oKGJ5dGVbXSkgbyk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBieXRlW10gYXNCeXRlQXJyYXkoT2JqZWN0IG8pIHsKLSAgICBpZiAobyBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgcmV0dXJuIChieXRlW10pIG87Ci0gICAgfSBlbHNlIGlmIChvIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICByZXR1cm4gSW50ZXJuYWwudG9CeXRlQXJyYXkoKFN0cmluZykgbyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoKEJ5dGVTdHJpbmcpIG8pLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMaXN0PD8+IGdldFVuZGVybHlpbmdFbGVtZW50cygpIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChsaXN0KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBtZXJnZUZyb20oTGF6eVN0cmluZ0xpc3Qgb3RoZXIpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBmb3IgKE9iamVjdCBvIDogb3RoZXIuZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCkpIHsKLSAgICAgIGlmIChvIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgIGJ5dGVbXSBiID0gKGJ5dGVbXSkgbzsKLSAgICAgICAgLy8gQnl0ZSBhcnJheSdzIGNvbnRlbnQgaXMgbXV0YWJsZSBzbyB0aGV5IHNob3VsZCBiZSBjb3BpZWQgcmF0aGVyIHRoYW4KLSAgICAgICAgLy8gc2hhcmVkIHdoZW4gbWVyZ2luZyBmcm9tIG9uZSBtZXNzYWdlIHRvIGFub3RoZXIuCi0gICAgICAgIGxpc3QuYWRkKEFycmF5cy5jb3B5T2YoYiwgYi5sZW5ndGgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxpc3QuYWRkKG8pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ5dGVBcnJheUxpc3RWaWV3IGV4dGVuZHMgQWJzdHJhY3RMaXN0PGJ5dGVbXT4KLSAgICAgIGltcGxlbWVudHMgUmFuZG9tQWNjZXNzIHsKLSAgICBwcml2YXRlIGZpbmFsIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdDsKLSAgICAKLSAgICBCeXRlQXJyYXlMaXN0VmlldyhMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gZ2V0KGludCBpbmRleCkgewotICAgICAgcmV0dXJuIGxpc3QuZ2V0Qnl0ZUFycmF5KGluZGV4KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJ5dGVbXSBzZXQoaW50IGluZGV4LCBieXRlW10gcykgewotICAgICAgT2JqZWN0IG8gPSBsaXN0LnNldEFuZFJldHVybihpbmRleCwgcyk7Ci0gICAgICBtb2RDb3VudCsrOwotICAgICAgcmV0dXJuIGFzQnl0ZUFycmF5KG8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIGJ5dGVbXSBzKSB7Ci0gICAgICBsaXN0LmFkZChpbmRleCwgcyk7Ci0gICAgICBtb2RDb3VudCsrOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgT2JqZWN0IG8gPSBsaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgICBtb2RDb3VudCsrOwotICAgICAgcmV0dXJuIGFzQnl0ZUFycmF5KG8pOwotICAgIH0KLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMaXN0PGJ5dGVbXT4gYXNCeXRlQXJyYXlMaXN0KCkgewotICAgIHJldHVybiBuZXcgQnl0ZUFycmF5TGlzdFZpZXcodGhpcyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBCeXRlU3RyaW5nTGlzdFZpZXcgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8Qnl0ZVN0cmluZz4KLSAgICAgIGltcGxlbWVudHMgUmFuZG9tQWNjZXNzIHsKLSAgICBwcml2YXRlIGZpbmFsIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdDsKLQotICAgIEJ5dGVTdHJpbmdMaXN0VmlldyhMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QpIHsKLSAgICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ5dGVTdHJpbmcgZ2V0KGludCBpbmRleCkgewotICAgICAgcmV0dXJuIGxpc3QuZ2V0Qnl0ZVN0cmluZyhpbmRleCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgcmV0dXJuIGxpc3Quc2l6ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCeXRlU3RyaW5nIHNldChpbnQgaW5kZXgsIEJ5dGVTdHJpbmcgcykgewotICAgICAgT2JqZWN0IG8gPSBsaXN0LnNldEFuZFJldHVybihpbmRleCwgcyk7Ci0gICAgICBtb2RDb3VudCsrOwotICAgICAgcmV0dXJuIGFzQnl0ZVN0cmluZyhvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBhZGQoaW50IGluZGV4LCBCeXRlU3RyaW5nIHMpIHsKLSAgICAgIGxpc3QuYWRkKGluZGV4LCBzKTsKLSAgICAgIG1vZENvdW50Kys7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ5dGVTdHJpbmcgcmVtb3ZlKGludCBpbmRleCkgewotICAgICAgT2JqZWN0IG8gPSBsaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgICBtb2RDb3VudCsrOwotICAgICAgcmV0dXJuIGFzQnl0ZVN0cmluZyhvKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3Q8Qnl0ZVN0cmluZz4gYXNCeXRlU3RyaW5nTGlzdCgpIHsKLSAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmdMaXN0Vmlldyh0aGlzKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGF6eVN0cmluZ0xpc3QgZ2V0VW5tb2RpZmlhYmxlVmlldygpIHsKLSAgICBpZiAoaXNNb2RpZmlhYmxlKCkpIHsKLSAgICAgIHJldHVybiBuZXcgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QodGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0xpc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VlZWRjYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEFuIGludGVyZmFjZSBleHRlbmRpbmcge0Bjb2RlIExpc3Q8U3RyaW5nPn0gdGhhdCBhbHNvIHByb3ZpZGVzIGFjY2VzcyB0byB0aGUKLSAqIGl0ZW1zIG9mIHRoZSBsaXN0IGFzIFVURjgtZW5jb2RlZCBCeXRlU3RyaW5nIG9yIGJ5dGVbXSBvYmplY3RzLiBUaGlzIGlzCi0gKiB1c2VkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgaW1wbGVtZW50YXRpb24gdG8gc3VwcG9ydCBsYXppbHkgY29udmVydGluZyBieXRlcwotICogcGFyc2VkIG92ZXIgdGhlIHdpcmUgdG8gU3RyaW5nIG9iamVjdHMgdW50aWwgbmVlZGVkIGFuZCBhbHNvIGluY3JlYXNlcyB0aGUKLSAqIGVmZmljaWVuY3kgb2Ygc2VyaWFsaXphdGlvbiBpZiB0aGUgU3RyaW5nIHdhcyBuZXZlciByZXF1ZXN0ZWQgYXMgdGhlCi0gKiBCeXRlU3RyaW5nIG9yIGJ5dGVbXSBpcyBhbHJlYWR5IGNhY2hlZC4gVGhlIEJ5dGVTdHJpbmcgbWV0aG9kcyBhcmUgdXNlZCBpbgotICogaW1tdXRhYmxlIEFQSSBvbmx5IGFuZCBieXRlW10gbWV0aG9kcyB1c2VkIGluIG11dGFibGUgQVBJIG9ubHkgZm9yIHRoZXkgdXNlCi0gKiBkaWZmZXJlbnQgcmVwcmVzZW50YXRpb25zIGZvciBzdHJpbmcvYnl0ZXMgZmllbGRzLgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgaW50ZXJmYWNlIExhenlTdHJpbmdMaXN0IGV4dGVuZHMgUHJvdG9jb2xTdHJpbmdMaXN0IHsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdCBhcyBhIEJ5dGVTdHJpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4KLSAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdAotICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotICAgKiAgICAgICAgICh7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKX0pCi0gICAqLwotICBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KTsKLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdCBhcyBhbiBPYmplY3QKLSAgICogdGhhdCB3aWxsIGVpdGhlciBiZSBhIFN0cmluZyBvciBhIEJ5dGVTdHJpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiB0aGUgZWxlbWVudCB0byByZXR1cm4KLSAgICogQHJldHVybiB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdAotICAgKiBAdGhyb3dzIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYgdGhlIGluZGV4IGlzIG91dCBvZiByYW5nZQotICAgKiAgICAgICAgICh7QGNvZGUgaW5kZXggPCAwIHx8IGluZGV4ID49IHNpemUoKX0pCi0gICAqLwotICBPYmplY3QgZ2V0UmF3KGludCBpbmRleCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QgYXMgYnl0ZVtdLgotICAgKgotICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmV0dXJuCi0gICAqIEByZXR1cm4gdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QKLSAgICogQHRocm93cyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICogICAgICAgICAoe0Bjb2RlIGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCl9KQotICAgKi8KLSAgYnl0ZVtdIGdldEJ5dGVBcnJheShpbnQgaW5kZXgpOwotCi0gIC8qKgotICAgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdCAob3B0aW9uYWwKLSAgICogb3BlcmF0aW9uKS4KLSAgICoKLSAgICogQHBhcmFtIGVsZW1lbnQgZWxlbWVudCB0byBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QKLSAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgPHR0PmFkZDwvdHQ+IG9wZXJhdGlvbgotICAgKiAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBsaXN0Ci0gICAqLwotICB2b2lkIGFkZChCeXRlU3RyaW5nIGVsZW1lbnQpOwotCi0gIC8qKgotICAgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdCAob3B0aW9uYWwKLSAgICogb3BlcmF0aW9uKS4KLSAgICoKLSAgICogQHBhcmFtIGVsZW1lbnQgZWxlbWVudCB0byBiZSBhcHBlbmRlZCB0byB0aGlzIGxpc3QKLSAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB0aGUgPHR0PmFkZDwvdHQ+IG9wZXJhdGlvbgotICAgKiAgICAgICAgIGlzIG5vdCBzdXBwb3J0ZWQgYnkgdGhpcyBsaXN0Ci0gICAqLwotICB2b2lkIGFkZChieXRlW10gZWxlbWVudCk7Ci0KLSAgLyoqCi0gICAqIFJlcGxhY2VzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0IHdpdGggdGhlCi0gICAqIHNwZWNpZmllZCBlbGVtZW50IChvcHRpb25hbCBvcGVyYXRpb24pLgotICAgKgotICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVwbGFjZQotICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBzdG9yZWQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgotICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSA8dHQ+c2V0PC90dD4gb3BlcmF0aW9uCi0gICAqICAgICAgICAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxpc3QKLSAgICogICAgICAgICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICogICAgICAgICAoe0Bjb2RlIGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCl9KQotICAgKi8KLSAgdm9pZCBzZXQoaW50IGluZGV4LCBCeXRlU3RyaW5nIGVsZW1lbnQpOwotICAKLSAgLyoqCi0gICAqIFJlcGxhY2VzIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0IHdpdGggdGhlCi0gICAqIHNwZWNpZmllZCBlbGVtZW50IChvcHRpb25hbCBvcGVyYXRpb24pLgotICAgKgotICAgKiBAcGFyYW0gaW5kZXggaW5kZXggb2YgdGhlIGVsZW1lbnQgdG8gcmVwbGFjZQotICAgKiBAcGFyYW0gZWxlbWVudCB0aGUgZWxlbWVudCB0byBiZSBzdG9yZWQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbgotICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSA8dHQ+c2V0PC90dD4gb3BlcmF0aW9uCi0gICAqICAgICAgICAgaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxpc3QKLSAgICogICAgICAgICBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICogICAgICAgICAoe0Bjb2RlIGluZGV4IDwgMCB8fCBpbmRleCA+PSBzaXplKCl9KQotICAgKi8KLSAgdm9pZCBzZXQoaW50IGluZGV4LCBieXRlW10gZWxlbWVudCk7Ci0KLSAgLyoqCi0gICAqIEFwcGVuZHMgYWxsIGVsZW1lbnRzIGluIHRoZSBzcGVjaWZpZWQgQnl0ZVN0cmluZyBjb2xsZWN0aW9uIHRvIHRoZSBlbmQgb2YKLSAgICogdGhpcyBsaXN0LgotICAgKgotICAgKiBAcGFyYW0gYyBjb2xsZWN0aW9uIHdob3NlIGVsZW1lbnRzIGFyZSB0byBiZSBhZGRlZCB0byB0aGlzIGxpc3QKLSAgICogQHJldHVybiB0cnVlIGlmIHRoaXMgbGlzdCBjaGFuZ2VkIGFzIGEgcmVzdWx0IG9mIHRoZSBjYWxsCi0gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIDx0dD5hZGRBbGxCeXRlU3RyaW5nPC90dD4KLSAgICogICAgICAgICBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxpc3QKLSAgICovCi0gIGJvb2xlYW4gYWRkQWxsQnl0ZVN0cmluZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBCeXRlU3RyaW5nPiBjKTsKLQotICAvKioKLSAgICogQXBwZW5kcyBhbGwgZWxlbWVudHMgaW4gdGhlIHNwZWNpZmllZCBieXRlW10gY29sbGVjdGlvbiB0byB0aGUgZW5kIG9mCi0gICAqIHRoaXMgbGlzdC4KLSAgICoKLSAgICogQHBhcmFtIGMgY29sbGVjdGlvbiB3aG9zZSBlbGVtZW50cyBhcmUgdG8gYmUgYWRkZWQgdG8gdGhpcyBsaXN0Ci0gICAqIEByZXR1cm4gdHJ1ZSBpZiB0aGlzIGxpc3QgY2hhbmdlZCBhcyBhIHJlc3VsdCBvZiB0aGUgY2FsbAotICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHRoZSA8dHQ+YWRkQWxsQnl0ZUFycmF5PC90dD4KLSAgICogICAgICAgICBvcGVyYXRpb24gaXMgbm90IHN1cHBvcnRlZCBieSB0aGlzIGxpc3QKLSAgICovCi0gIGJvb2xlYW4gYWRkQWxsQnl0ZUFycmF5KENvbGxlY3Rpb248Ynl0ZVtdPiBjKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgTGlzdCBvZiB0aGUgdW5kZXJseWluZyBlbGVtZW50cywgZWFjaCBvZiB3aGljaCBpcwotICAgKiBlaXRoZXIgYSB7QGNvZGUgU3RyaW5nfSBvciBpdHMgZXF1aXZhbGVudCBVVEYtOCBlbmNvZGVkIHtAY29kZSBCeXRlU3RyaW5nfQotICAgKiBvciBieXRlW10uIEl0IGlzIGFuIGVycm9yIGZvciB0aGUgY2FsbGVyIHRvIG1vZGlmeSB0aGUgcmV0dXJuZWQKLSAgICogTGlzdCwgYW5kIGF0dGVtcHRpbmcgdG8gZG8gc28gd2lsbCByZXN1bHQgaW4gYW4KLSAgICoge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICovCi0gIExpc3Q8Pz4gZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCk7Ci0KLSAgLyoqCi0gICAqIE1lcmdlcyBhbGwgZWxlbWVudHMgZnJvbSBhbm90aGVyIExhenlTdHJpbmdMaXN0IGludG8gdGhpcyBvbmUuIFRoaXMgbWV0aG9kCi0gICAqIGRpZmZlcnMgZnJvbSB7QGxpbmsgI2FkZEFsbChDb2xsZWN0aW9uKX0gb24gdGhhdCB1bmRlcmx5aW5nIGJ5dGUgYXJyYXlzIGFyZQotICAgKiBjb3BpZWQgaW5zdGVhZCBvZiByZWZlcmVuY2Ugc2hhcmVkLiBJbW11dGFibGUgQVBJIGRvZXNuJ3QgbmVlZCB0byB1c2UgdGhpcwotICAgKiBtZXRob2QgYXMgYnl0ZVtdIGlzIG5vdCB1c2VkIHRoZXJlIGF0IGFsbC4KLSAgICovCi0gIHZvaWQgbWVyZ2VGcm9tKExhenlTdHJpbmdMaXN0IG90aGVyKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIG11dGFibGUgdmlldyBvZiB0aGlzIGxpc3QuIENoYW5nZXMgdG8gdGhlIHZpZXcgd2lsbCBiZSBtYWRlIGludG8KLSAgICogdGhlIG9yaWdpbmFsIGxpc3QuIFRoaXMgbWV0aG9kIGlzIHVzZWQgaW4gbXV0YWJsZSBBUEkgb25seS4KLSAgICovCi0gIExpc3Q8Ynl0ZVtdPiBhc0J5dGVBcnJheUxpc3QoKTsKLQotICAvKiogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgbGlzdC4gKi8KLSAgTGF6eVN0cmluZ0xpc3QgZ2V0VW5tb2RpZmlhYmxlVmlldygpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Mb25nQXJyYXlMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xvbmdBcnJheUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmM0NDc1ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xvbmdBcnJheUxpc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI2OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5Mb25nTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTG9uZ0xpc3R9IG9uIHRvcCBvZiBhIHByaW1pdGl2ZSBhcnJheS4KLSAqIAotICogQGF1dGhvciBkd2Vpc0Bnb29nbGUuY29tIChEYW5pZWwgV2VpcykKLSAqLwotZmluYWwgY2xhc3MgTG9uZ0FycmF5TGlzdCBleHRlbmRzIEFic3RyYWN0UHJvdG9idWZMaXN0PExvbmc+IGltcGxlbWVudHMgTG9uZ0xpc3QsIFJhbmRvbUFjY2VzcyB7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb25nQXJyYXlMaXN0IEVNUFRZX0xJU1QgPSBuZXcgTG9uZ0FycmF5TGlzdCgpOwotICBzdGF0aWMgewotICAgIEVNUFRZX0xJU1QubWFrZUltbXV0YWJsZSgpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIExvbmdBcnJheUxpc3QgZW1wdHlMaXN0KCkgewotICAgIHJldHVybiBFTVBUWV9MSVNUOwotICB9Ci0gIAotICAvKioKLSAgICogVGhlIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBsaXN0LgotICAgKi8KLSAgcHJpdmF0ZSBsb25nW10gYXJyYXk7Ci0gIAotICAvKioKLSAgICogVGhlIHNpemUgb2YgdGhlIGxpc3QgZGlzdGluY3QgZnJvbSB0aGUgbGVuZ3RoIG9mIHRoZSBhcnJheS4gVGhhdCBpcywgaXQgaXMgdGhlIG51bWJlciBvZgotICAgKiBlbGVtZW50cyBzZXQgaW4gdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIGludCBzaXplOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG11dGFibGUge0Bjb2RlIExvbmdBcnJheUxpc3R9IHdpdGggZGVmYXVsdCBjYXBhY2l0eS4KLSAgICovCi0gIExvbmdBcnJheUxpc3QoKSB7Ci0gICAgdGhpcyhuZXcgbG9uZ1tERUZBVUxUX0NBUEFDSVRZXSwgMCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBtdXRhYmxlIHtAY29kZSBMb25nQXJyYXlMaXN0fSBjb250YWluaW5nIHRoZSBzYW1lIGVsZW1lbnRzIGFzIHtAY29kZSBvdGhlcn0uCi0gICAqLwotICBwcml2YXRlIExvbmdBcnJheUxpc3QobG9uZ1tdIGFycmF5LCBpbnQgc2l6ZSkgewotICAgIHRoaXMuYXJyYXkgPSBhcnJheTsKLSAgICB0aGlzLnNpemUgPSBzaXplOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKHRoaXMgPT0gbykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG8gaW5zdGFuY2VvZiBJbnRBcnJheUxpc3QpKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotICAgIH0KLSAgICBMb25nQXJyYXlMaXN0IG90aGVyID0gKExvbmdBcnJheUxpc3QpIG87Ci0gICAgaWYgKHNpemUgIT0gb3RoZXIuc2l6ZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAKLSAgICBmaW5hbCBsb25nW10gYXJyID0gb3RoZXIuYXJyYXk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIGlmIChhcnJheVtpXSAhPSBhcnJbaV0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIGludCByZXN1bHQgPSAxOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICByZXN1bHQgPSAoMzEgKiByZXN1bHQpICsgSW50ZXJuYWwuaGFzaExvbmcoYXJyYXlbaV0pOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMb25nTGlzdCBtdXRhYmxlQ29weVdpdGhDYXBhY2l0eShpbnQgY2FwYWNpdHkpIHsKLSAgICBpZiAoY2FwYWNpdHkgPCBzaXplKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgTG9uZ0FycmF5TGlzdChBcnJheXMuY29weU9mKGFycmF5LCBjYXBhY2l0eSksIHNpemUpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIExvbmcgZ2V0KGludCBpbmRleCkgewotICAgIHJldHVybiBnZXRMb25nKGluZGV4KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgbG9uZyBnZXRMb25nKGludCBpbmRleCkgewotICAgIGVuc3VyZUluZGV4SW5SYW5nZShpbmRleCk7Ci0gICAgcmV0dXJuIGFycmF5W2luZGV4XTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExvbmcgc2V0KGludCBpbmRleCwgTG9uZyBlbGVtZW50KSB7Ci0gICAgcmV0dXJuIHNldExvbmcoaW5kZXgsIGVsZW1lbnQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBsb25nIHNldExvbmcoaW50IGluZGV4LCBsb25nIGVsZW1lbnQpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBlbnN1cmVJbmRleEluUmFuZ2UoaW5kZXgpOwotICAgIGxvbmcgcHJldmlvdXNWYWx1ZSA9IGFycmF5W2luZGV4XTsKLSAgICBhcnJheVtpbmRleF0gPSBlbGVtZW50OwotICAgIHJldHVybiBwcmV2aW91c1ZhbHVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIExvbmcgZWxlbWVudCkgewotICAgIGFkZExvbmcoaW5kZXgsIGVsZW1lbnQpOwotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNhZGQoTG9uZyl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSBlbGVtZW50LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZExvbmcobG9uZyBlbGVtZW50KSB7Ci0gICAgYWRkTG9uZyhzaXplLCBlbGVtZW50KTsKLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjYWRkKGludCwgTG9uZyl9IGJ1dCBtb3JlIGVmZmljaWVudCBpbiB0aGF0IGl0IGRvZXNuJ3QgYm94IHRoZSBlbGVtZW50LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFkZExvbmcoaW50IGluZGV4LCBsb25nIGVsZW1lbnQpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID4gc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24obWFrZU91dE9mQm91bmRzRXhjZXB0aW9uTWVzc2FnZShpbmRleCkpOwotICAgIH0KLSAgICAKLSAgICBpZiAoc2l6ZSA8IGFycmF5Lmxlbmd0aCkgewotICAgICAgLy8gU2hpZnQgZXZlcnl0aGluZyBvdmVyIHRvIG1ha2Ugcm9vbQotICAgICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXgsIGFycmF5LCBpbmRleCArIDEsIHNpemUgLSBpbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJlc2l6ZSB0byAxLjV4IHRoZSBzaXplCi0gICAgICBpbnQgbGVuZ3RoID0gKChzaXplICogMykgLyAyKSArIDE7Ci0gICAgICBsb25nW10gbmV3QXJyYXkgPSBuZXcgbG9uZ1tsZW5ndGhdOwotICAgICAgCi0gICAgICAvLyBDb3B5IHRoZSBmaXJzdCBwYXJ0IGRpcmVjdGx5Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCAwLCBuZXdBcnJheSwgMCwgaW5kZXgpOwotICAgICAgCi0gICAgICAvLyBDb3B5IHRoZSByZXN0IHNoaWZ0ZWQgb3ZlciBieSBvbmUgdG8gbWFrZSByb29tCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpbmRleCwgbmV3QXJyYXksIGluZGV4ICsgMSwgc2l6ZSAtIGluZGV4KTsKLSAgICAgIGFycmF5ID0gbmV3QXJyYXk7Ci0gICAgfQotCi0gICAgYXJyYXlbaW5kZXhdID0gZWxlbWVudDsKLSAgICBzaXplKys7Ci0gICAgbW9kQ291bnQrKzsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBhZGRBbGwoQ29sbGVjdGlvbjw/IGV4dGVuZHMgTG9uZz4gY29sbGVjdGlvbikgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIAotICAgIGlmIChjb2xsZWN0aW9uID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLSAgICAKLSAgICAvLyBXZSBzcGVjaWFsaXplIHdoZW4gYWRkaW5nIGFub3RoZXIgTG9uZ0FycmF5TGlzdCB0byBhdm9pZCBib3hpbmcgZWxlbWVudHMuCi0gICAgaWYgKCEoY29sbGVjdGlvbiBpbnN0YW5jZW9mIExvbmdBcnJheUxpc3QpKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuYWRkQWxsKGNvbGxlY3Rpb24pOwotICAgIH0KLSAgICAKLSAgICBMb25nQXJyYXlMaXN0IGxpc3QgPSAoTG9uZ0FycmF5TGlzdCkgY29sbGVjdGlvbjsKLSAgICBpZiAobGlzdC5zaXplID09IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgaW50IG92ZXJmbG93ID0gSW50ZWdlci5NQVhfVkFMVUUgLSBzaXplOwotICAgIGlmIChvdmVyZmxvdyA8IGxpc3Quc2l6ZSkgewotICAgICAgLy8gV2UgY2FuJ3QgYWN0dWFsbHkgcmVwcmVzZW50IGEgbGlzdCB0aGlzIGxhcmdlLgotICAgICAgdGhyb3cgbmV3IE91dE9mTWVtb3J5RXJyb3IoKTsKLSAgICB9Ci0gICAgCi0gICAgaW50IG5ld1NpemUgPSBzaXplICsgbGlzdC5zaXplOwotICAgIGlmIChuZXdTaXplID4gYXJyYXkubGVuZ3RoKSB7Ci0gICAgICBhcnJheSA9IEFycmF5cy5jb3B5T2YoYXJyYXksIG5ld1NpemUpOwotICAgIH0KLSAgICAKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGxpc3QuYXJyYXksIDAsIGFycmF5LCBzaXplLCBsaXN0LnNpemUpOwotICAgIHNpemUgPSBuZXdTaXplOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKG8uZXF1YWxzKGFycmF5W2ldKSkgewotICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KGFycmF5LCBpICsgMSwgYXJyYXksIGksIHNpemUgLSBpKTsKLSAgICAgICAgc2l6ZS0tOwotICAgICAgICBtb2RDb3VudCsrOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMb25nIHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBlbnN1cmVJbmRleEluUmFuZ2UoaW5kZXgpOwotICAgIGxvbmcgdmFsdWUgPSBhcnJheVtpbmRleF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShhcnJheSwgaW5kZXggKyAxLCBhcnJheSwgaW5kZXgsIHNpemUgLSBpbmRleCk7Ci0gICAgc2l6ZS0tOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuc3VyZXMgdGhhdCB0aGUgcHJvdmlkZWQge0Bjb2RlIGluZGV4fSBpcyB3aXRoaW4gdGhlIHJhbmdlIG9mIHtAY29kZSBbMCwgc2l6ZV19LiBUaHJvd3MgYW4KLSAgICoge0BsaW5rIEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb259IGlmIGl0IGlzIG5vdC4KLSAgICogCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggdG8gdmVyaWZ5IGlzIGluIHJhbmdlCi0gICAqLwotICBwcml2YXRlIHZvaWQgZW5zdXJlSW5kZXhJblJhbmdlKGludCBpbmRleCkgewotICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gc2l6ZSkgewotICAgICAgdGhyb3cgbmV3IEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24obWFrZU91dE9mQm91bmRzRXhjZXB0aW9uTWVzc2FnZShpbmRleCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIG1ha2VPdXRPZkJvdW5kc0V4Y2VwdGlvbk1lc3NhZ2UoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuICJJbmRleDoiICsgaW5kZXggKyAiLCBTaXplOiIgKyBzaXplOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcEVudHJ5LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcEVudHJ5LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxNDE0YmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NYXBFbnRyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDMzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIE1hcEVudHJ5IG1lc3NhZ2VzLgotICogCi0gKiBJbiByZWZsZWN0aW9uIEFQSSwgbWFwIGZpZWxkcyB3aWxsIGJlIHRyZWF0ZWQgYXMgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZHMgYW5kCi0gKiBlYWNoIG1hcCBlbnRyeSBpcyBhY2Nlc3NlZCBhcyBhIG1lc3NhZ2UuIFRoaXMgTWFwRW50cnkgY2xhc3MgaXMgdXNlZCB0bwotICogcmVwcmVzZW50IHRoZXNlIG1hcCBlbnRyeSBtZXNzYWdlcyBpbiByZWZsZWN0aW9uIEFQSS4KLSAqIAotICogUHJvdG9idWYgaW50ZXJuYWwuIFVzZXJzIHNob3VsZG4ndCB1c2UgdGhpcyBjbGFzcy4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hcEVudHJ5PEssIFY+IGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWV0YWRhdGE8SywgVj4gewotICAgIHB1YmxpYyBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7ICAKLSAgICBwdWJsaWMgZmluYWwgTWFwRW50cnk8SywgVj4gZGVmYXVsdEluc3RhbmNlOwotICAgIHB1YmxpYyBmaW5hbCBBYnN0cmFjdFBhcnNlcjxNYXBFbnRyeTxLLCBWPj4gcGFyc2VyOwotICAgIAotICAgIHB1YmxpYyBNZXRhZGF0YSgKLSAgICAgICAgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBNYXBFbnRyeTxLLCBWPiBkZWZhdWx0SW5zdGFuY2UpIHsKLSAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICB0aGlzLmRlZmF1bHRJbnN0YW5jZSA9IGRlZmF1bHRJbnN0YW5jZTsKLSAgICAgIGZpbmFsIE1ldGFkYXRhPEssIFY+IHRoaXNNZXRhZGF0YSA9IHRoaXM7Ci0gICAgICB0aGlzLnBhcnNlciA9IG5ldyBBYnN0cmFjdFBhcnNlcjxNYXBFbnRyeTxLLCBWPj4oKSB7Ci0gICAgICAgIHByaXZhdGUgZmluYWwgUGFyc2VyPE1hcEVudHJ5TGl0ZTxLLCBWPj4gZGF0YVBhcnNlciA9Ci0gICAgICAgICAgICBkZWZhdWx0SW5zdGFuY2UuZGF0YS5nZXRQYXJzZXJGb3JUeXBlKCk7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgTWFwRW50cnk8SywgVj4gcGFyc2VQYXJ0aWFsRnJvbSgKLSAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgICAgIE1hcEVudHJ5TGl0ZTxLLCBWPiBkYXRhID0KLSAgICAgICAgICAgICAgZGF0YVBhcnNlci5wYXJzZVBhcnRpYWxGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBNYXBFbnRyeTxLLCBWPih0aGlzTWV0YWRhdGEsIGRhdGEpOwotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgfTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgZmluYWwgTWV0YWRhdGE8SywgVj4gbWV0YWRhdGE7Ci0gIHByaXZhdGUgZmluYWwgTWFwRW50cnlMaXRlPEssIFY+IGRhdGE7Ci0gIAotICAvKiogQ3JlYXRlIGEgZGVmYXVsdCBNYXBFbnRyeSBpbnN0YW5jZS4gKi8KLSAgcHJpdmF0ZSBNYXBFbnRyeShEZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSBrZXlUeXBlLCBLIGRlZmF1bHRLZXksCi0gICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB2YWx1ZVR5cGUsIFYgZGVmYXVsdFZhbHVlKSB7Ci0gICAgdGhpcy5kYXRhID0gTWFwRW50cnlMaXRlLm5ld0RlZmF1bHRJbnN0YW5jZSgKLSAgICAgICAga2V5VHlwZSwgZGVmYXVsdEtleSwgdmFsdWVUeXBlLCBkZWZhdWx0VmFsdWUpOwotICAgIHRoaXMubWV0YWRhdGEgPSBuZXcgTWV0YWRhdGE8SywgVj4oZGVzY3JpcHRvciwgdGhpcyk7IAotICB9Ci0gIAotICAvKiogQ3JlYXRlIGEgbmV3IE1hcEVudHJ5IG1lc3NhZ2UuICovCi0gIHByaXZhdGUgTWFwRW50cnkoTWV0YWRhdGE8SywgVj4gbWV0YWRhdGEsIE1hcEVudHJ5TGl0ZTxLLCBWPiBkYXRhKSB7Ci0gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgIHRoaXMuZGF0YSA9IGRhdGE7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDcmVhdGUgYSBkZWZhdWx0IE1hcEVudHJ5IGluc3RhbmNlLiBBIGRlZmF1bHQgTWFwRW50cnkgaW5zdGFuY2Ugc2hvdWxkIGJlCi0gICAqIGNyZWF0ZWQgb25seSBvbmNlIGZvciBlYWNoIG1hcCBlbnRyeSBtZXNzYWdlIHR5cGUuIEdlbmVyYXRlZCBjb2RlIHNob3VsZAotICAgKiBzdG9yZSB0aGUgY3JlYXRlZCBkZWZhdWx0IGluc3RhbmNlIGFuZCB1c2UgaXQgbGF0ZXIgdG8gY3JlYXRlIG5ldyBNYXBFbnRyeQotICAgKiBtZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcEVudHJ5PEssIFY+IG5ld0RlZmF1bHRJbnN0YW5jZSgKLSAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIGtleVR5cGUsIEsgZGVmYXVsdEtleSwKLSAgICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIHZhbHVlVHlwZSwgViBkZWZhdWx0VmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IE1hcEVudHJ5PEssIFY+KAotICAgICAgICBkZXNjcmlwdG9yLCBrZXlUeXBlLCBkZWZhdWx0S2V5LCB2YWx1ZVR5cGUsIGRlZmF1bHRWYWx1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBLIGdldEtleSgpIHsKLSAgICByZXR1cm4gZGF0YS5nZXRLZXkoKTsKLSAgfQotICAKLSAgcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0gICAgcmV0dXJuIGRhdGEuZ2V0VmFsdWUoKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgcmV0dXJuIGRhdGEuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGRhdGEud3JpdGVUbyhvdXRwdXQpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICByZXR1cm4gZGF0YS5pc0luaXRpYWxpemVkKCk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgUGFyc2VyPE1hcEVudHJ5PEssIFY+PiBnZXRQYXJzZXJGb3JUeXBlKCkgewotICAgIHJldHVybiBtZXRhZGF0YS5wYXJzZXI7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEJ1aWxkZXI8SywgVj4gbmV3QnVpbGRlckZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBCdWlsZGVyPEssIFY+KG1ldGFkYXRhKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBCdWlsZGVyPEssIFY+IHRvQnVpbGRlcigpIHsKLSAgICByZXR1cm4gbmV3IEJ1aWxkZXI8SywgVj4obWV0YWRhdGEsIGRhdGEpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBNYXBFbnRyeTxLLCBWPiBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkgewotICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0SW5zdGFuY2U7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIG1ldGFkYXRhLmRlc2NyaXB0b3I7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgIGZpbmFsIFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9Ci0gICAgICAgIG5ldyBUcmVlTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PigpOwotICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDogbWV0YWRhdGEuZGVzY3JpcHRvci5nZXRGaWVsZHMoKSkgewotICAgICAgaWYgKGhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICByZXN1bHQucHV0KGZpZWxkLCBnZXRGaWVsZChmaWVsZCkpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKHJlc3VsdCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgdm9pZCBjaGVja0ZpZWxkRGVzY3JpcHRvcihGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBtZXRhZGF0YS5kZXNjcmlwdG9yKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiV3JvbmcgRmllbGREZXNjcmlwdG9yIFwiIiArIGZpZWxkLmdldEZ1bGxOYW1lKCkKLSAgICAgICAgICArICJcIiB1c2VkIGluIG1lc3NhZ2UgXCIiICsgbWV0YWRhdGEuZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpKTsgCi0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIGNoZWNrRmllbGREZXNjcmlwdG9yKGZpZWxkKTs7Ci0gICAgLy8gQSBNYXBFbnRyeSBhbHdheXMgY29udGFpbnMgdHdvIGZpZWxkcy4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIGNoZWNrRmllbGREZXNjcmlwdG9yKGZpZWxkKTsKLSAgICBPYmplY3QgcmVzdWx0ID0gZmllbGQuZ2V0TnVtYmVyKCkgPT0gMSA/IGdldEtleSgpIDogZ2V0VmFsdWUoKTsKLSAgICAvLyBDb252ZXJ0IGVudW1zIHRvIEVudW1WYWx1ZURlc2NyaXB0b3IuCi0gICAgaWYgKGZpZWxkLmdldFR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNKSB7Ci0gICAgICByZXN1bHQgPSBmaWVsZC5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oCi0gICAgICAgICAgKGphdmEubGFuZy5JbnRlZ2VyKSByZXN1bHQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiVGhlcmUgaXMgbm8gcmVwZWF0ZWQgZmllbGQgaW4gYSBtYXAgZW50cnkgbWVzc2FnZS4iKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgpIHsKLSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgIlRoZXJlIGlzIG5vIHJlcGVhdGVkIGZpZWxkIGluIGEgbWFwIGVudHJ5IG1lc3NhZ2UuIik7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFVua25vd25GaWVsZFNldCBnZXRVbmtub3duRmllbGRzKCkgewotICAgIHJldHVybiBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQnVpbGRlciB0byBjcmVhdGUge0BsaW5rIE1hcEVudHJ5fSBtZXNzYWdlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlcjxLLCBWPgotICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjxCdWlsZGVyPEssIFY+PiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXRhZGF0YTxLLCBWPiBtZXRhZGF0YTsKLSAgICBwcml2YXRlIE1hcEVudHJ5TGl0ZTxLLCBWPiBkYXRhOwotICAgIHByaXZhdGUgTWFwRW50cnlMaXRlLkJ1aWxkZXI8SywgVj4gZGF0YUJ1aWxkZXI7Ci0gICAgCi0gICAgcHJpdmF0ZSBCdWlsZGVyKE1ldGFkYXRhPEssIFY+IG1ldGFkYXRhKSB7Ci0gICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICB0aGlzLmRhdGEgPSBtZXRhZGF0YS5kZWZhdWx0SW5zdGFuY2UuZGF0YTsKLSAgICAgIHRoaXMuZGF0YUJ1aWxkZXIgPSBudWxsOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEJ1aWxkZXIoTWV0YWRhdGE8SywgVj4gbWV0YWRhdGEsIE1hcEVudHJ5TGl0ZTxLLCBWPiBkYXRhKSB7Ci0gICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgICAgdGhpcy5kYXRhQnVpbGRlciA9IG51bGw7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBLIGdldEtleSgpIHsKLSAgICAgIHJldHVybiBkYXRhQnVpbGRlciA9PSBudWxsID8gZGF0YS5nZXRLZXkoKSA6IGRhdGFCdWlsZGVyLmdldEtleSgpOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLSAgICAgIHJldHVybiBkYXRhQnVpbGRlciA9PSBudWxsID8gZGF0YS5nZXRWYWx1ZSgpIDogZGF0YUJ1aWxkZXIuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGVuc3VyZU11dGFibGUoKSB7Ci0gICAgICBpZiAoZGF0YUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICBkYXRhQnVpbGRlciA9IGRhdGEudG9CdWlsZGVyKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IHNldEtleShLIGtleSkgewotICAgICAgZW5zdXJlTXV0YWJsZSgpOwotICAgICAgZGF0YUJ1aWxkZXIuc2V0S2V5KGtleSk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEJ1aWxkZXI8SywgVj4gY2xlYXJLZXkoKSB7Ci0gICAgICBlbnN1cmVNdXRhYmxlKCk7Ci0gICAgICBkYXRhQnVpbGRlci5jbGVhcktleSgpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IHNldFZhbHVlKFYgdmFsdWUpIHsKLSAgICAgIGVuc3VyZU11dGFibGUoKTsKLSAgICAgIGRhdGFCdWlsZGVyLnNldFZhbHVlKHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLSAgICAKLSAgICBwdWJsaWMgQnVpbGRlcjxLLCBWPiBjbGVhclZhbHVlKCkgewotICAgICAgZW5zdXJlTXV0YWJsZSgpOwotICAgICAgZGF0YUJ1aWxkZXIuY2xlYXJWYWx1ZSgpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcEVudHJ5PEssIFY+IGJ1aWxkKCkgewotICAgICAgTWFwRW50cnk8SywgVj4gcmVzdWx0ID0gYnVpbGRQYXJ0aWFsKCk7Ci0gICAgICBpZiAoIXJlc3VsdC5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24ocmVzdWx0KTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcEVudHJ5PEssIFY+IGJ1aWxkUGFydGlhbCgpIHsKLSAgICAgIGlmIChkYXRhQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgIGRhdGEgPSBkYXRhQnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICAgICAgZGF0YUJ1aWxkZXIgPSBudWxsOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBNYXBFbnRyeTxLLCBWPihtZXRhZGF0YSwgZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgICByZXR1cm4gbWV0YWRhdGEuZGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIGNoZWNrRmllbGREZXNjcmlwdG9yKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gbWV0YWRhdGEuZGVzY3JpcHRvcikgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJXcm9uZyBGaWVsZERlc2NyaXB0b3IgXCIiICsgZmllbGQuZ2V0RnVsbE5hbWUoKQotICAgICAgICAgICAgKyAiXCIgdXNlZCBpbiBtZXNzYWdlIFwiIiArIG1ldGFkYXRhLmRlc2NyaXB0b3IuZ2V0RnVsbE5hbWUoKSk7IAotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyRm9yRmllbGQoCi0gICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgY2hlY2tGaWVsZERlc2NyaXB0b3IoZmllbGQpOzsKLSAgICAgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgZm9yIG1lc3NhZ2UgZmllbGRzIGFuZCBpbiBhIE1hcEVudHJ5Ci0gICAgICAvLyBtZXNzYWdlIG9ubHkgdGhlIHZhbHVlIGZpZWxkIGNhbiBwb3NzaWJseSBiZSBhIG1lc3NhZ2UgZmllbGQuCi0gICAgICBpZiAoZmllbGQuZ2V0TnVtYmVyKCkgIT0gMgotICAgICAgICAgIHx8IGZpZWxkLmdldEphdmFUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgICAiXCIiICsgZmllbGQuZ2V0RnVsbE5hbWUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHZhbHVlIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuICgoTWVzc2FnZSkgZGF0YS5nZXRWYWx1ZSgpKS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IHNldEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBjaGVja0ZpZWxkRGVzY3JpcHRvcihmaWVsZCk7Ci0gICAgICBpZiAoZmllbGQuZ2V0TnVtYmVyKCkgPT0gMSkgewotICAgICAgICBzZXRLZXkoKEspIHZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuRU5VTSkgewotICAgICAgICAgIHZhbHVlID0gKChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSkuZ2V0TnVtYmVyKCk7Ci0gICAgICAgIH0KLSAgICAgICAgc2V0VmFsdWUoKFYpIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IGNsZWFyRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBjaGVja0ZpZWxkRGVzY3JpcHRvcihmaWVsZCk7Ci0gICAgICBpZiAoZmllbGQuZ2V0TnVtYmVyKCkgPT0gMSkgewotICAgICAgICBjbGVhcktleSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2xlYXJWYWx1ZSgpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXI8SywgVj4gc2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCwKLSAgICAgICAgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhlcmUgaXMgbm8gcmVwZWF0ZWQgZmllbGQgaW4gYSBtYXAgZW50cnkgbWVzc2FnZS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlcjxLLCBWPiBhZGRSZXBlYXRlZEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhlcmUgaXMgbm8gcmVwZWF0ZWQgZmllbGQgaW4gYSBtYXAgZW50cnkgbWVzc2FnZS4iKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlcjxLLCBWPiBzZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7Ci0gICAgICAvLyBVbmtub3duIGZpZWxkcyBhcmUgZGlzY2FyZGVkIGZvciBNYXBFbnRyeSBtZXNzYWdlLgotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcEVudHJ5PEssIFY+IGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7Ci0gICAgICByZXR1cm4gbWV0YWRhdGEuZGVmYXVsdEluc3RhbmNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICBpZiAoZGF0YUJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gZGF0YUJ1aWxkZXIuaXNJbml0aWFsaXplZCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGRhdGEuaXNJbml0aWFsaXplZCgpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKLSAgICAgIGZpbmFsIFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9Ci0gICAgICAgICAgbmV3IFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+KCk7Ci0gICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IG1ldGFkYXRhLmRlc2NyaXB0b3IuZ2V0RmllbGRzKCkpIHsKLSAgICAgICAgaWYgKGhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIGdldEZpZWxkKGZpZWxkKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGNoZWNrRmllbGREZXNjcmlwdG9yKGZpZWxkKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBjaGVja0ZpZWxkRGVzY3JpcHRvcihmaWVsZCk7Ci0gICAgICBPYmplY3QgcmVzdWx0ID0gZmllbGQuZ2V0TnVtYmVyKCkgPT0gMSA/IGdldEtleSgpIDogZ2V0VmFsdWUoKTsKLSAgICAgIC8vIENvbnZlcnQgZW51bXMgdG8gRW51bVZhbHVlRGVzY3JpcHRvci4KLSAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuRU5VTSkgewotICAgICAgICByZXN1bHQgPSBmaWVsZC5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oCi0gICAgICAgICAgICAoamF2YS5sYW5nLkludGVnZXIpIHJlc3VsdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlRoZXJlIGlzIG5vIHJlcGVhdGVkIGZpZWxkIGluIGEgbWFwIGVudHJ5IG1lc3NhZ2UuIik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlRoZXJlIGlzIG5vIHJlcGVhdGVkIGZpZWxkIGluIGEgbWFwIGVudHJ5IG1lc3NhZ2UuIik7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKLSAgICAgIHJldHVybiBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXI8SywgVj4gY2xvbmUoKSB7Ci0gICAgICBpZiAoZGF0YUJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXI8SywgVj4obWV0YWRhdGEsIGRhdGEpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyPEssIFY+KG1ldGFkYXRhLCBkYXRhQnVpbGRlci5idWlsZCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWFwRW50cnlMaXRlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcEVudHJ5TGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMmM2NGFiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWFwRW50cnlMaXRlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMzcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogSW1wbGVtZW50cyB0aGUgbGl0ZSB2ZXJzaW9uIG9mIG1hcCBlbnRyeSBtZXNzYWdlcy4KLSAqIAotICogVGhpcyBjbGFzcyBzZXJ2ZXMgYXMgYW4gdXRpbGl0eSBjbGFzcyB0byBoZWxwIGRvIHNlcmlhbGl6YXRpb24vcGFyc2luZyBvZgotICogbWFwIGVudHJpZXMuIEl0J3MgdXNlZCBpbiBnZW5lcmF0ZWQgY29kZSBhbmQgYWxzbyBpbiB0aGUgZnVsbCB2ZXJzaW9uCi0gKiBNYXBFbnRyeSBtZXNzYWdlLgotICogCi0gKiBQcm90b2J1ZiBpbnRlcm5hbC4gVXNlcnMgc2hvdWxkbid0IHVzZS4KLSAqLwotcHVibGljIGNsYXNzIE1hcEVudHJ5TGl0ZTxLLCBWPgotICAgIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZTxNYXBFbnRyeUxpdGU8SywgVj4sIE1hcEVudHJ5TGl0ZS5CdWlsZGVyPEssIFY+PiB7Ci0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE1ldGFkYXRhPEssIFY+IHsKLSAgICBwdWJsaWMgZmluYWwgTWFwRW50cnlMaXRlPEssIFY+IGRlZmF1bHRJbnN0YW5jZTsKLSAgICBwdWJsaWMgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUga2V5VHlwZTsKLSAgICBwdWJsaWMgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdmFsdWVUeXBlOwotICAgIHB1YmxpYyBmaW5hbCBQYXJzZXI8TWFwRW50cnlMaXRlPEssIFY+PiBwYXJzZXI7Ci0gICAgcHVibGljIE1ldGFkYXRhKAotICAgICAgICBNYXBFbnRyeUxpdGU8SywgVj4gZGVmYXVsdEluc3RhbmNlLAotICAgICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSBrZXlUeXBlLAotICAgICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB2YWx1ZVR5cGUpIHsKLSAgICAgIHRoaXMuZGVmYXVsdEluc3RhbmNlID0gZGVmYXVsdEluc3RhbmNlOyAKLSAgICAgIHRoaXMua2V5VHlwZSA9IGtleVR5cGU7Ci0gICAgICB0aGlzLnZhbHVlVHlwZSA9IHZhbHVlVHlwZTsKLSAgICAgIGZpbmFsIE1ldGFkYXRhPEssIFY+IGZpbmFsVGhpcyA9IHRoaXM7Ci0gICAgICB0aGlzLnBhcnNlciA9IG5ldyBBYnN0cmFjdFBhcnNlcjxNYXBFbnRyeUxpdGU8SywgVj4+KCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIE1hcEVudHJ5TGl0ZTxLLCBWPiBwYXJzZVBhcnRpYWxGcm9tKAotICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBNYXBFbnRyeUxpdGU8SywgVj4oZmluYWxUaGlzLCBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgICB9Ci0gICAgICB9OwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEtFWV9GSUVMRF9OVU1CRVIgPSAxOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVkFMVUVfRklFTERfTlVNQkVSID0gMjsKLSAgCi0gIHByaXZhdGUgZmluYWwgTWV0YWRhdGE8SywgVj4gbWV0YWRhdGE7Ci0gIHByaXZhdGUgZmluYWwgSyBrZXk7Ci0gIHByaXZhdGUgZmluYWwgViB2YWx1ZTsKLSAgCi0gIC8qKiBDcmVhdGVzIGEgZGVmYXVsdCBNYXBFbnRyeUxpdGUgbWVzc2FnZSBpbnN0YW5jZS4gKi8KLSAgcHJpdmF0ZSBNYXBFbnRyeUxpdGUoCi0gICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSBrZXlUeXBlLCBLIGRlZmF1bHRLZXksCi0gICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB2YWx1ZVR5cGUsIFYgZGVmYXVsdFZhbHVlKSB7Ci0gICAgdGhpcy5tZXRhZGF0YSA9IG5ldyBNZXRhZGF0YTxLLCBWPih0aGlzLCBrZXlUeXBlLCB2YWx1ZVR5cGUpOwotICAgIHRoaXMua2V5ID0gZGVmYXVsdEtleTsKLSAgICB0aGlzLnZhbHVlID0gZGVmYXVsdFZhbHVlOwotICB9Ci0gIAotICAvKiogQ3JlYXRlcyBhIG5ldyBNYXBFbnRyeUxpdGUgbWVzc2FnZS4gKi8KLSAgcHJpdmF0ZSBNYXBFbnRyeUxpdGUoTWV0YWRhdGE8SywgVj4gbWV0YWRhdGEsIEsga2V5LCBWIHZhbHVlKSB7Ci0gICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgIHRoaXMua2V5ID0ga2V5OwotICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgfQotICAKLSAgcHVibGljIEsgZ2V0S2V5KCkgewotICAgIHJldHVybiBrZXk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBWIGdldFZhbHVlKCkgewotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgZGVmYXVsdCBNYXBFbnRyeUxpdGUgbWVzc2FnZSBpbnN0YW5jZS4KLSAgICogCi0gICAqIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gY3JlYXRlIHRoZSBkZWZhdWx0IGluc3RhbmNlIGZvcgotICAgKiBhIG1hcCBlbnRyeSBtZXNzYWdlLiBUaGUgY3JlYXRlZCBkZWZhdWx0IGluc3RhbmNlIHNob3VsZCBiZSB1c2VkIHRvIGNyZWF0ZQotICAgKiBuZXcgbWFwIGVudHJ5IG1lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUuIEZvciBlYWNoIG1hcCBlbnRyeSBtZXNzYWdlLCBvbmx5Ci0gICAqIG9uZSBkZWZhdWx0IGluc3RhbmNlIHNob3VsZCBiZSBjcmVhdGVkLiAKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcEVudHJ5TGl0ZTxLLCBWPiBuZXdEZWZhdWx0SW5zdGFuY2UoCi0gICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSBrZXlUeXBlLCBLIGRlZmF1bHRLZXksCi0gICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB2YWx1ZVR5cGUsIFYgZGVmYXVsdFZhbHVlKSB7Ci0gICAgcmV0dXJuIG5ldyBNYXBFbnRyeUxpdGU8SywgVj4oCi0gICAgICAgIGtleVR5cGUsIGRlZmF1bHRLZXksIHZhbHVlVHlwZSwgZGVmYXVsdFZhbHVlKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlRmllbGQoS0VZX0ZJRUxEX05VTUJFUiwgbWV0YWRhdGEua2V5VHlwZSwga2V5LCBvdXRwdXQpOwotICAgIHdyaXRlRmllbGQoVkFMVUVfRklFTERfTlVNQkVSLCBtZXRhZGF0YS52YWx1ZVR5cGUsIHZhbHVlLCBvdXRwdXQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHdyaXRlRmllbGQoCi0gICAgICBpbnQgbnVtYmVyLCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLCBPYmplY3QgdmFsdWUsCi0gICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgb3V0cHV0LndyaXRlVGFnKG51bWJlciwgdHlwZS5nZXRXaXJlVHlwZSgpKTsKLSAgICBGaWVsZFNldC53cml0ZUVsZW1lbnROb1RhZyhvdXRwdXQsIHR5cGUsIHZhbHVlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9sYXRpbGUgaW50IGNhY2hlZFNlcmlhbGl6ZWRTaXplID0gLTE7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgIGlmIChjYWNoZWRTZXJpYWxpemVkU2l6ZSAhPSAtMSkgewotICAgICAgcmV0dXJuIGNhY2hlZFNlcmlhbGl6ZWRTaXplOwotICAgIH0KLSAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgc2l6ZSArPSBnZXRGaWVsZFNpemUoS0VZX0ZJRUxEX05VTUJFUiwgbWV0YWRhdGEua2V5VHlwZSwga2V5KTsKLSAgICBzaXplICs9IGdldEZpZWxkU2l6ZShWQUxVRV9GSUVMRF9OVU1CRVIsIG1ldGFkYXRhLnZhbHVlVHlwZSwgdmFsdWUpOwotICAgIGNhY2hlZFNlcmlhbGl6ZWRTaXplID0gc2l6ZTsKLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIHByaXZhdGUgaW50IGdldEZpZWxkU2l6ZSgKLSAgICAgIGludCBudW1iZXIsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsIE9iamVjdCB2YWx1ZSkgewotICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVGFnU2l6ZShudW1iZXIpCi0gICAgICAgICsgRmllbGRTZXQuY29tcHV0ZUVsZW1lbnRTaXplTm9UYWcodHlwZSwgdmFsdWUpOwotICB9Ci0gIAotICAvKiogUGFyc2luZyBjb25zdHJ1Y3Rvci4gKi8KLSAgcHJpdmF0ZSBNYXBFbnRyeUxpdGUoCi0gICAgICBNZXRhZGF0YTxLLCBWPiBtZXRhZGF0YSwKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgSyBrZXkgPSBtZXRhZGF0YS5kZWZhdWx0SW5zdGFuY2Uua2V5OwotICAgICAgViB2YWx1ZSA9IG1ldGFkYXRhLmRlZmF1bHRJbnN0YW5jZS52YWx1ZTsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICAgIGlmICh0YWcgPT0gMCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGlmICh0YWcgPT0gV2lyZUZvcm1hdC5tYWtlVGFnKAotICAgICAgICAgICAgICAgIEtFWV9GSUVMRF9OVU1CRVIsIG1ldGFkYXRhLmtleVR5cGUuZ2V0V2lyZVR5cGUoKSkpIHsKLSAgICAgICAgICBrZXkgPSBtZXJnZUZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIG1ldGFkYXRhLmtleVR5cGUsIGtleSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodGFnID09IFdpcmVGb3JtYXQubWFrZVRhZygKLSAgICAgICAgICAgICAgICAgICAgICAgVkFMVUVfRklFTERfTlVNQkVSLCBtZXRhZGF0YS52YWx1ZVR5cGUuZ2V0V2lyZVR5cGUoKSkpIHsKLSAgICAgICAgICB2YWx1ZSA9IG1lcmdlRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSwgbWV0YWRhdGEudmFsdWVUeXBlLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKCFpbnB1dC5za2lwRmllbGQodGFnKSkgewotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgZS5zZXRVbmZpbmlzaGVkTWVzc2FnZSh0aGlzKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKQotICAgICAgICAgIC5zZXRVbmZpbmlzaGVkTWVzc2FnZSh0aGlzKTsKLSAgICB9Ci0gIH0KLSAgCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIDxUPiBUIG1lcmdlRmllbGQoCi0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLCBUIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSAoKE1lc3NhZ2VMaXRlKSB2YWx1ZSkudG9CdWlsZGVyKCk7Ci0gICAgICAgIGlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgcmV0dXJuIChUKSBzdWJCdWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgICAgY2FzZSBFTlVNOgotICAgICAgICByZXR1cm4gKFQpIChqYXZhLmxhbmcuSW50ZWdlcikgaW5wdXQucmVhZEVudW0oKTsKLSAgICAgIGNhc2UgR1JPVVA6Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJHcm91cHMgYXJlIG5vdCBhbGxvd2VkIGluIG1hcHMuIik7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gKFQpIEZpZWxkU2V0LnJlYWRQcmltaXRpdmVGaWVsZChpbnB1dCwgdHlwZSwgdHJ1ZSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBQYXJzZXI8TWFwRW50cnlMaXRlPEssIFY+PiBnZXRQYXJzZXJGb3JUeXBlKCkgewotICAgIHJldHVybiBtZXRhZGF0YS5wYXJzZXI7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEJ1aWxkZXI8SywgVj4gbmV3QnVpbGRlckZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBCdWlsZGVyPEssIFY+KG1ldGFkYXRhKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQnVpbGRlcjxLLCBWPiB0b0J1aWxkZXIoKSB7Ci0gICAgcmV0dXJuIG5ldyBCdWlsZGVyPEssIFY+KG1ldGFkYXRhLCBrZXksIHZhbHVlKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTWFwRW50cnlMaXRlPEssIFY+IGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIG1ldGFkYXRhLmRlZmF1bHRJbnN0YW5jZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIGlmIChtZXRhZGF0YS52YWx1ZVR5cGUuZ2V0SmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgIHJldHVybiAoKE1lc3NhZ2VMaXRlKSB2YWx1ZSkuaXNJbml0aWFsaXplZCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZGVyIHVzZWQgdG8gY3JlYXRlIHtAbGluayBNYXBFbnRyeUxpdGV9IG1lc3NhZ2VzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBCdWlsZGVyPEssIFY+Ci0gICAgICBleHRlbmRzIEFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlcjxNYXBFbnRyeUxpdGU8SywgVj4sIEJ1aWxkZXI8SywgVj4+IHsKLSAgICBwcml2YXRlIGZpbmFsIE1ldGFkYXRhPEssIFY+IG1ldGFkYXRhOwotICAgIHByaXZhdGUgSyBrZXk7Ci0gICAgcHJpdmF0ZSBWIHZhbHVlOwotICAgIAotICAgIHByaXZhdGUgQnVpbGRlcihNZXRhZGF0YTxLLCBWPiBtZXRhZGF0YSkgewotICAgICAgdGhpcy5tZXRhZGF0YSA9IG1ldGFkYXRhOwotICAgICAgdGhpcy5rZXkgPSBtZXRhZGF0YS5kZWZhdWx0SW5zdGFuY2Uua2V5OwotICAgICAgdGhpcy52YWx1ZSA9IG1ldGFkYXRhLmRlZmF1bHRJbnN0YW5jZS52YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEsgZ2V0S2V5KCkgewotICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IHNldEtleShLIGtleSkgewotICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgcHVibGljIEJ1aWxkZXI8SywgVj4gc2V0VmFsdWUoViB2YWx1ZSkgewotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IGNsZWFyS2V5KCkgewotICAgICAgdGhpcy5rZXkgPSBtZXRhZGF0YS5kZWZhdWx0SW5zdGFuY2Uua2V5OwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIAotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IGNsZWFyVmFsdWUoKSB7Ci0gICAgICB0aGlzLnZhbHVlID0gbWV0YWRhdGEuZGVmYXVsdEluc3RhbmNlLnZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXI8SywgVj4gY2xlYXIoKSB7Ci0gICAgICB0aGlzLmtleSA9IG1ldGFkYXRhLmRlZmF1bHRJbnN0YW5jZS5rZXk7Ci0gICAgICB0aGlzLnZhbHVlID0gbWV0YWRhdGEuZGVmYXVsdEluc3RhbmNlLnZhbHVlOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcEVudHJ5TGl0ZTxLLCBWPiBidWlsZCgpIHsKLSAgICAgIE1hcEVudHJ5TGl0ZTxLLCBWPiByZXN1bHQgPSBidWlsZFBhcnRpYWwoKTsKLSAgICAgIGlmICghcmVzdWx0LmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICB0aHJvdyBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihyZXN1bHQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWFwRW50cnlMaXRlPEssIFY+IGJ1aWxkUGFydGlhbCgpIHsKLSAgICAgIHJldHVybiBuZXcgTWFwRW50cnlMaXRlPEssIFY+KG1ldGFkYXRhLCBrZXksIHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVzc2FnZUxpdGUgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBtZXRhZGF0YS5kZWZhdWx0SW5zdGFuY2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIGlmIChtZXRhZGF0YS52YWx1ZVR5cGUuZ2V0SmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgcmV0dXJuICgoTWVzc2FnZUxpdGUpIHZhbHVlKS5pc0luaXRpYWxpemVkKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIEJ1aWxkZXIoTWV0YWRhdGE8SywgVj4gbWV0YWRhdGEsIEsga2V5LCBWIHZhbHVlKSB7Ci0gICAgICB0aGlzLm1ldGFkYXRhID0gbWV0YWRhdGE7Ci0gICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXI8SywgVj4gY2xvbmUoKSB7Ci0gICAgICByZXR1cm4gbmV3IEJ1aWxkZXI8SywgVj4obWV0YWRhdGEsIGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyPEssIFY+IG1lcmdlRnJvbSgKLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgTWFwRW50cnlMaXRlPEssIFY+IGVudHJ5ID0KLSAgICAgICAgICBuZXcgTWFwRW50cnlMaXRlPEssIFY+KG1ldGFkYXRhLCBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgdGhpcy5rZXkgPSBlbnRyeS5rZXk7Ci0gICAgICB0aGlzLnZhbHVlID0gZW50cnkudmFsdWU7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgQnVpbGRlcjxLLCBWPiBpbnRlcm5hbE1lcmdlRnJvbShNYXBFbnRyeUxpdGU8SywgVj4gbWVzc2FnZSkgewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcEZpZWxkLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcEZpZWxkLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkwN2YwZjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NYXBGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkTGl0ZS5NdXRhdGFiaWxpdHlBd2FyZU1hcDsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogSW50ZXJuYWwgcmVwcmVzZW50YXRpb24gb2YgbWFwIGZpZWxkcyBpbiBnZW5lcmF0ZWQgbWVzc2FnZXMuCi0gKiAKLSAqIFRoaXMgY2xhc3Mgc3VwcG9ydHMgYWNjZXNzaW5nIHRoZSBtYXAgZmllbGQgYXMgYSB7QGxpbmsgTWFwfSB0byBiZSB1c2VkIGluCi0gKiBnZW5lcmF0ZWQgQVBJIGFuZCBhbHNvIHN1cHBvcnRzIGFjY2Vzc2luZyB0aGUgZmllbGQgYXMgYSB7QGxpbmsgTGlzdH0gdG8gYmUKLSAqIHVzZWQgaW4gcmVmbGVjdGlvbiBBUEkuIEl0IGtlZXBzIHRyYWNrIG9mIHdoZXJlIHRoZSBkYXRhIGlzIGN1cnJlbnRseSBzdG9yZWQKLSAqIGFuZCBkbyBuZWNlc3NhcnkgY29udmVyc2lvbnMgYmV0d2VlbiBtYXAgYW5kIGxpc3QuICAKLSAqIAotICogVGhpcyBjbGFzcyBpcyBhIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIGRldGFpbC4gVXNlcnMgc2hvdWxkbid0IHVzZSB0aGlzCi0gKiBjbGFzcyBkaXJlY3RseS4KLSAqIAotICogVEhSRUFELVNBRkVUWSBOT1RFOiBSZWFkLW9ubHkgYWNjZXNzIGlzIHRocmVhZC1zYWZlLiBVc2VycyBjYW4gY2FsbCBnZXRNYXAoKQotICogYW5kIGdldExpc3QoKSBjb25jdXJyZW50bHkgaW4gbXVsdGlwbGUgdGhyZWFkcy4gSWYgd3JpdGUtYWNjZXNzIGlzIG5lZWRlZCwKLSAqIGFsbCBhY2Nlc3MgbXVzdCBiZSBzeW5jaHJvbml6ZWQuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBGaWVsZDxLLCBWPiBpbXBsZW1lbnRzIE11dGFiaWxpdHlPcmFjbGUgewotICAvKioKLSAgICogSW5kaWNhdGVzIHdoZXJlIHRoZSBkYXRhIG9mIHRoaXMgbWFwIGZpZWxkIGlzIGN1cnJlbnRseSBzdG9yZWQuCi0gICAqIAotICAgKiBNQVA6IERhdGEgaXMgc3RvcmVkIGluIG1hcERhdGEuCi0gICAqIExJU1Q6IERhdGEgaXMgc3RvcmVkIGluIGxpc3REYXRhLgotICAgKiBCT1RIOiBtYXBEYXRhIGFuZCBsaXN0RGF0YSBoYXZlIHRoZSBzYW1lIGRhdGEuCi0gICAqCi0gICAqIFdoZW4gdGhlIG1hcCBmaWVsZCBpcyBhY2Nlc3NlZCAodGhyb3VnaCBnZW5lcmF0ZWQgQVBJIG9yIHJlZmxlY3Rpb24gQVBJKSwKLSAgICogaXQgd2lsbCBzaGlmdCBiZXR3ZWVuIHRoZXNlIDMgbW9kZXM6Ci0gICAqIAotICAgKiAgICAgICAgICBnZXRNYXAoKSAgIGdldExpc3QoKSAgIGdldE11dGFibGVNYXAoKSAgIGdldE11dGFibGVMaXN0KCkKLSAgICogICBNQVAgICAgICBNQVAgICAgICAgIEJPVEggICAgICAgICAgTUFQICAgICAgICAgICAgICAgTElTVAotICAgKiAgIExJU1QgICAgIEJPVEggICAgICAgTElTVCAgICAgICAgICBNQVAgICAgICAgICAgICAgICBMSVNUCi0gICAqICAgQk9USCAgICAgQk9USCAgICAgICBCT1RIICAgICAgICAgIE1BUCAgICAgICAgICAgICAgIExJU1QKLSAgICogICAKLSAgICogQXMgdGhlIG1hcCBmaWVsZCBjaGFuZ2VzIGl0cyBtb2RlLCB0aGUgbGlzdC9tYXAgcmVmZXJlbmNlIHJldHVybmVkIGluIGEKLSAgICogcHJldmlvdXMgbWV0aG9kIGNhbGwgbWF5IGJlIGludmFsaWRhdGVkLiAKLSAgICovCi0gIHByaXZhdGUgZW51bSBTdG9yYWdlTW9kZSB7TUFQLCBMSVNULCBCT1RIfQotCi0gIHByaXZhdGUgdm9sYXRpbGUgYm9vbGVhbiBpc011dGFibGU7Ci0gIHByaXZhdGUgdm9sYXRpbGUgU3RvcmFnZU1vZGUgbW9kZTsKLSAgcHJpdmF0ZSBNdXRhdGFiaWxpdHlBd2FyZU1hcDxLLCBWPiBtYXBEYXRhOwotICBwcml2YXRlIExpc3Q8TWVzc2FnZT4gbGlzdERhdGE7Ci0gIAotICAvLyBDb252ZXJ0IGJldHdlZW4gYSBtYXAgZW50cnkgTWVzc2FnZSBhbmQgYSBrZXktdmFsdWUgcGFpci4KLSAgcHJpdmF0ZSBzdGF0aWMgaW50ZXJmYWNlIENvbnZlcnRlcjxLLCBWPiB7Ci0gICAgTWVzc2FnZSBjb252ZXJ0S2V5QW5kVmFsdWVUb01lc3NhZ2UoSyBrZXksIFYgdmFsdWUpOwotICAgIHZvaWQgY29udmVydE1lc3NhZ2VUb0tleUFuZFZhbHVlKE1lc3NhZ2UgbWVzc2FnZSwgTWFwPEssIFY+IG1hcCk7Ci0gICAgCi0gICAgTWVzc2FnZSBnZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEltbXV0YWJsZU1lc3NhZ2VDb252ZXJ0ZXI8SywgVj4gaW1wbGVtZW50cyBDb252ZXJ0ZXI8SywgVj4gewotICAgIHByaXZhdGUgZmluYWwgTWFwRW50cnk8SywgVj4gZGVmYXVsdEVudHJ5OwotICAgIHB1YmxpYyBJbW11dGFibGVNZXNzYWdlQ29udmVydGVyKE1hcEVudHJ5PEssIFY+IGRlZmF1bHRFbnRyeSkgewotICAgICAgdGhpcy5kZWZhdWx0RW50cnkgPSBkZWZhdWx0RW50cnk7Ci0gICAgfQotICAgIAotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXNzYWdlIGNvbnZlcnRLZXlBbmRWYWx1ZVRvTWVzc2FnZShLIGtleSwgViB2YWx1ZSkgewotICAgICAgcmV0dXJuIGRlZmF1bHRFbnRyeS5uZXdCdWlsZGVyRm9yVHlwZSgpLnNldEtleShrZXkpLnNldFZhbHVlKHZhbHVlKS5idWlsZFBhcnRpYWwoKTsKLSAgICB9Ci0gICAgCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY29udmVydE1lc3NhZ2VUb0tleUFuZFZhbHVlKE1lc3NhZ2UgbWVzc2FnZSwgTWFwPEssIFY+IG1hcCkgewotICAgICAgTWFwRW50cnk8SywgVj4gZW50cnkgPSAoTWFwRW50cnk8SywgVj4pIG1lc3NhZ2U7Ci0gICAgICBtYXAucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRFbnRyeTsKLSAgICB9Ci0gIH0KLSAgCi0KLSAgcHJpdmF0ZSBmaW5hbCBDb252ZXJ0ZXI8SywgVj4gY29udmVydGVyOwotICAKLSAgcHJpdmF0ZSBNYXBGaWVsZCgKLSAgICAgIENvbnZlcnRlcjxLLCBWPiBjb252ZXJ0ZXIsCi0gICAgICBTdG9yYWdlTW9kZSBtb2RlLAotICAgICAgTWFwPEssIFY+IG1hcERhdGEpIHsKLSAgICB0aGlzLmNvbnZlcnRlciA9IGNvbnZlcnRlcjsKLSAgICB0aGlzLmlzTXV0YWJsZSA9IHRydWU7Ci0gICAgdGhpcy5tb2RlID0gbW9kZTsKLSAgICB0aGlzLm1hcERhdGEgPSBuZXcgTXV0YXRhYmlsaXR5QXdhcmVNYXA8SywgVj4odGhpcywgbWFwRGF0YSk7Ci0gICAgdGhpcy5saXN0RGF0YSA9IG51bGw7Ci0gIH0KLSAgICAKLSAgcHJpdmF0ZSBNYXBGaWVsZCgKLSAgICAgIE1hcEVudHJ5PEssIFY+IGRlZmF1bHRFbnRyeSwKLSAgICAgIFN0b3JhZ2VNb2RlIG1vZGUsCi0gICAgICBNYXA8SywgVj4gbWFwRGF0YSkgewotICAgIHRoaXMobmV3IEltbXV0YWJsZU1lc3NhZ2VDb252ZXJ0ZXI8SywgVj4oZGVmYXVsdEVudHJ5KSwgbW9kZSwgbWFwRGF0YSk7Ci0gIH0KLSAgCi0gIAotICAvKiogUmV0dXJucyBhbiBpbW11dGFibGUgZW1wdHkgTWFwRmllbGQuICovCi0gIHB1YmxpYyBzdGF0aWMgPEssIFY+IE1hcEZpZWxkPEssIFY+IGVtcHR5TWFwRmllbGQoCi0gICAgICBNYXBFbnRyeTxLLCBWPiBkZWZhdWx0RW50cnkpIHsKLSAgICByZXR1cm4gbmV3IE1hcEZpZWxkPEssIFY+KAotICAgICAgICBkZWZhdWx0RW50cnksIFN0b3JhZ2VNb2RlLk1BUCwgQ29sbGVjdGlvbnMuPEssIFY+ZW1wdHlNYXAoKSk7Ci0gIH0KLSAgCi0gIAotICAvKiogQ3JlYXRlcyBhIG5ldyBtdXRhYmxlIGVtcHR5IE1hcEZpZWxkLiAqLwotICBwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXBGaWVsZDxLLCBWPiBuZXdNYXBGaWVsZChNYXBFbnRyeTxLLCBWPiBkZWZhdWx0RW50cnkpIHsKLSAgICByZXR1cm4gbmV3IE1hcEZpZWxkPEssIFY+KAotICAgICAgICBkZWZhdWx0RW50cnksIFN0b3JhZ2VNb2RlLk1BUCwgbmV3IExpbmtlZEhhc2hNYXA8SywgVj4oKSk7Ci0gIH0KLSAgCi0gIAotICBwcml2YXRlIE1lc3NhZ2UgY29udmVydEtleUFuZFZhbHVlVG9NZXNzYWdlKEsga2V5LCBWIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbnZlcnRlci5jb252ZXJ0S2V5QW5kVmFsdWVUb01lc3NhZ2Uoa2V5LCB2YWx1ZSk7Ci0gIH0KLSAgCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIHZvaWQgY29udmVydE1lc3NhZ2VUb0tleUFuZFZhbHVlKE1lc3NhZ2UgbWVzc2FnZSwgTWFwPEssIFY+IG1hcCkgewotICAgIGNvbnZlcnRlci5jb252ZXJ0TWVzc2FnZVRvS2V5QW5kVmFsdWUobWVzc2FnZSwgbWFwKTsKLSAgfQotCi0gIHByaXZhdGUgTGlzdDxNZXNzYWdlPiBjb252ZXJ0TWFwVG9MaXN0KE11dGF0YWJpbGl0eUF3YXJlTWFwPEssIFY+IG1hcERhdGEpIHsKLSAgICBMaXN0PE1lc3NhZ2U+IGxpc3REYXRhID0gbmV3IEFycmF5TGlzdDxNZXNzYWdlPigpOwotICAgIGZvciAoTWFwLkVudHJ5PEssIFY+IGVudHJ5IDogbWFwRGF0YS5lbnRyeVNldCgpKSB7Ci0gICAgICBsaXN0RGF0YS5hZGQoCi0gICAgICAgICAgY29udmVydEtleUFuZFZhbHVlVG9NZXNzYWdlKAotICAgICAgICAgICAgICBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotICAgIH0KLSAgICByZXR1cm4gbGlzdERhdGE7Ci0gIH0KLQotICBwcml2YXRlIE11dGF0YWJpbGl0eUF3YXJlTWFwPEssIFY+IGNvbnZlcnRMaXN0VG9NYXAoTGlzdDxNZXNzYWdlPiBsaXN0RGF0YSkgewotICAgIE1hcDxLLCBWPiBtYXBEYXRhID0gbmV3IExpbmtlZEhhc2hNYXA8SywgVj4oKTsKLSAgICBmb3IgKE1lc3NhZ2UgaXRlbSA6IGxpc3REYXRhKSB7Ci0gICAgICBjb252ZXJ0TWVzc2FnZVRvS2V5QW5kVmFsdWUoaXRlbSwgbWFwRGF0YSk7Ci0gICAgfQotICAgIHJldHVybiBuZXcgTXV0YXRhYmlsaXR5QXdhcmVNYXA8SywgVj4odGhpcywgbWFwRGF0YSk7Ci0gIH0KLSAgCi0gIC8qKiBSZXR1cm5zIHRoZSBjb250ZW50IG9mIHRoaXMgTWFwRmllbGQgYXMgYSByZWFkLW9ubHkgTWFwLiAqLwotICBwdWJsaWMgTWFwPEssIFY+IGdldE1hcCgpIHsKLSAgICBpZiAobW9kZSA9PSBTdG9yYWdlTW9kZS5MSVNUKSB7Ci0gICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGUuTElTVCkgewotICAgICAgICAgIG1hcERhdGEgPSBjb252ZXJ0TGlzdFRvTWFwKGxpc3REYXRhKTsKLSAgICAgICAgICBtb2RlID0gU3RvcmFnZU1vZGUuQk9USDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG1hcERhdGEpOwotICB9Ci0gIAotICAvKiogR2V0cyBhIG11dGFibGUgTWFwIHZpZXcgb2YgdGhpcyBNYXBGaWVsZC4gKi8KLSAgcHVibGljIE1hcDxLLCBWPiBnZXRNdXRhYmxlTWFwKCkgewotICAgIGlmIChtb2RlICE9IFN0b3JhZ2VNb2RlLk1BUCkgewotICAgICAgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGUuTElTVCkgewotICAgICAgICBtYXBEYXRhID0gY29udmVydExpc3RUb01hcChsaXN0RGF0YSk7Ci0gICAgICB9Ci0gICAgICBsaXN0RGF0YSA9IG51bGw7Ci0gICAgICBtb2RlID0gU3RvcmFnZU1vZGUuTUFQOyAKLSAgICB9Ci0gICAgcmV0dXJuIG1hcERhdGE7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIG1lcmdlRnJvbShNYXBGaWVsZDxLLCBWPiBvdGhlcikgewotICAgIGdldE11dGFibGVNYXAoKS5wdXRBbGwoTWFwRmllbGRMaXRlLmNvcHkob3RoZXIuZ2V0TWFwKCkpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgbWFwRGF0YSA9IG5ldyBNdXRhdGFiaWxpdHlBd2FyZU1hcDxLLCBWPih0aGlzLCBuZXcgTGlua2VkSGFzaE1hcDxLLCBWPigpKTsKLSAgICBtb2RlID0gU3RvcmFnZU1vZGUuTUFQOwotICB9Ci0gIAotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgTWFwRmllbGQpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIE1hcEZpZWxkPEssIFY+IG90aGVyID0gKE1hcEZpZWxkPEssIFY+KSBvYmplY3Q7Ci0gICAgcmV0dXJuIE1hcEZpZWxkTGl0ZS48SywgVj5lcXVhbHMoZ2V0TWFwKCksIG90aGVyLmdldE1hcCgpKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgcmV0dXJuIE1hcEZpZWxkTGl0ZS48SywgVj5jYWxjdWxhdGVIYXNoQ29kZUZvck1hcChnZXRNYXAoKSk7Ci0gIH0KLSAgCi0gIC8qKiBSZXR1cm5zIGEgZGVlcCBjb3B5IG9mIHRoaXMgTWFwRmllbGQuICovCi0gIHB1YmxpYyBNYXBGaWVsZDxLLCBWPiBjb3B5KCkgewotICAgIHJldHVybiBuZXcgTWFwRmllbGQ8SywgVj4oCi0gICAgICAgIGNvbnZlcnRlciwgU3RvcmFnZU1vZGUuTUFQLCBNYXBGaWVsZExpdGUuY29weShnZXRNYXAoKSkpOwotICB9Ci0gIAotICAvKiogR2V0cyB0aGUgY29udGVudCBvZiB0aGlzIE1hcEZpZWxkIGFzIGEgcmVhZC1vbmx5IExpc3QuICovCi0gIExpc3Q8TWVzc2FnZT4gZ2V0TGlzdCgpIHsKLSAgICBpZiAobW9kZSA9PSBTdG9yYWdlTW9kZS5NQVApIHsKLSAgICAgIHN5bmNocm9uaXplZCAodGhpcykgewotICAgICAgICBpZiAobW9kZSA9PSBTdG9yYWdlTW9kZS5NQVApIHsKLSAgICAgICAgICBsaXN0RGF0YSA9IGNvbnZlcnRNYXBUb0xpc3QobWFwRGF0YSk7Ci0gICAgICAgICAgbW9kZSA9IFN0b3JhZ2VNb2RlLkJPVEg7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QobGlzdERhdGEpOwotICB9Ci0gIAotICAvKiogR2V0cyBhIG11dGFibGUgTGlzdCB2aWV3IG9mIHRoaXMgTWFwRmllbGQuICovCi0gIExpc3Q8TWVzc2FnZT4gZ2V0TXV0YWJsZUxpc3QoKSB7Ci0gICAgaWYgKG1vZGUgIT0gU3RvcmFnZU1vZGUuTElTVCkgewotICAgICAgaWYgKG1vZGUgPT0gU3RvcmFnZU1vZGUuTUFQKSB7Ci0gICAgICAgIGxpc3REYXRhID0gY29udmVydE1hcFRvTGlzdChtYXBEYXRhKTsKLSAgICAgIH0KLSAgICAgIG1hcERhdGEgPSBudWxsOwotICAgICAgbW9kZSA9IFN0b3JhZ2VNb2RlLkxJU1Q7Ci0gICAgfQotICAgIHJldHVybiBsaXN0RGF0YTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEdldHMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIG1lc3NhZ2Ugc3RvcmVkIGluIHRoZSBsaXN0IHZpZXcgb2YgdGhpcwotICAgKiBtYXAgZmllbGQuCi0gICAqLwotICBNZXNzYWdlIGdldE1hcEVudHJ5TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gY29udmVydGVyLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1ha2VzIHRoaXMgbGlzdCBpbW11dGFibGUuIEFsbCBzdWJzZXF1ZW50IG1vZGlmaWNhdGlvbnMgd2lsbCB0aHJvdyBhbgotICAgKiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgotICAgKi8KLSAgcHVibGljIHZvaWQgbWFrZUltbXV0YWJsZSgpIHsKLSAgICBpc011dGFibGUgPSBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgd2hldGhlciB0aGlzIGZpZWxkIGNhbiBiZSBtb2RpZmllZC4KLSAgICovCi0gIHB1YmxpYyBib29sZWFuIGlzTXV0YWJsZSgpIHsKLSAgICByZXR1cm4gaXNNdXRhYmxlOwotICB9Ci0gIAotICAvKiAobm9uLUphdmFkb2MpCi0gICAqIEBzZWUgY29tLmdvb2dsZS5wcm90b2J1Zi5NdXRhYmlsaXR5T3JhY2xlI2Vuc3VyZU11dGFibGUoKQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGVuc3VyZU11dGFibGUoKSB7Ci0gICAgaWYgKCFpc011dGFibGUoKSkgewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcEZpZWxkTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NYXBGaWVsZExpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYwYjYzMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcEZpZWxkTGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaW5rZWRIYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBJbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiBtYXAgZmllbGRzIGluIGdlbmVyYXRlZCBsaXRlLXJ1bnRpbWUgbWVzc2FnZXMuCi0gKiAKLSAqIFRoaXMgY2xhc3MgaXMgYSBwcm90b2J1ZiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuIFVzZXJzIHNob3VsZG4ndCB1c2UgdGhpcwotICogY2xhc3MgZGlyZWN0bHkuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBNYXBGaWVsZExpdGU8SywgVj4gaW1wbGVtZW50cyBNdXRhYmlsaXR5T3JhY2xlIHsKLSAgcHJpdmF0ZSBNdXRhdGFiaWxpdHlBd2FyZU1hcDxLLCBWPiBtYXBEYXRhOwotICBwcml2YXRlIGJvb2xlYW4gaXNNdXRhYmxlOwotICAKLSAgcHJpdmF0ZSBNYXBGaWVsZExpdGUoTWFwPEssIFY+IG1hcERhdGEpIHsKLSAgICB0aGlzLm1hcERhdGEgPSBuZXcgTXV0YXRhYmlsaXR5QXdhcmVNYXA8SywgVj4odGhpcywgbWFwRGF0YSk7Ci0gICAgdGhpcy5pc011dGFibGUgPSB0cnVlOwotICB9Ci0gIAotICBAU3VwcHJlc3NXYXJuaW5ncyh7InJhd3R5cGVzIiwgInVuY2hlY2tlZCJ9KQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXBGaWVsZExpdGUgRU1QVFlfTUFQX0ZJRUxEID0KLSAgICAgIG5ldyBNYXBGaWVsZExpdGUoQ29sbGVjdGlvbnMuZW1wdHlNYXAoKSk7Ci0gIHN0YXRpYyB7Ci0gICAgRU1QVFlfTUFQX0ZJRUxELm1ha2VJbW11dGFibGUoKTsKLSAgfQotICAKLSAgLyoqIFJldHVybnMgYW4gc2luZ2xldG9uIGltbXV0YWJsZSBlbXB0eSBNYXBGaWVsZExpdGUgaW5zdGFuY2UuICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKHsidW5jaGVja2VkIiwgImNhc3QifSkKLSAgcHVibGljIHN0YXRpYyA8SywgVj4gTWFwRmllbGRMaXRlPEssIFY+IGVtcHR5TWFwRmllbGQoKSB7Ci0gICAgcmV0dXJuIChNYXBGaWVsZExpdGU8SywgVj4pIEVNUFRZX01BUF9GSUVMRDsKLSAgfQotICAKLSAgLyoqIENyZWF0ZXMgYSBuZXcgTWFwRmllbGRMaXRlIGluc3RhbmNlLiAqLwotICBwdWJsaWMgc3RhdGljIDxLLCBWPiBNYXBGaWVsZExpdGU8SywgVj4gbmV3TWFwRmllbGQoKSB7Ci0gICAgcmV0dXJuIG5ldyBNYXBGaWVsZExpdGU8SywgVj4obmV3IExpbmtlZEhhc2hNYXA8SywgVj4oKSk7Ci0gIH0KLSAgCi0gIC8qKiBHZXRzIHRoZSBjb250ZW50IG9mIHRoaXMgTWFwRmllbGQgYXMgYSByZWFkLW9ubHkgTWFwLiAqLwotICBwdWJsaWMgTWFwPEssIFY+IGdldE1hcCgpIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG1hcERhdGEpOwotICB9Ci0gIAotICAvKiogR2V0cyBhIG11dGFibGUgTWFwIHZpZXcgb2YgdGhpcyBNYXBGaWVsZC4gKi8KLSAgcHVibGljIE1hcDxLLCBWPiBnZXRNdXRhYmxlTWFwKCkgewotICAgIHJldHVybiBtYXBEYXRhOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCBtZXJnZUZyb20oTWFwRmllbGRMaXRlPEssIFY+IG90aGVyKSB7Ci0gICAgbWFwRGF0YS5wdXRBbGwoY29weShvdGhlci5tYXBEYXRhKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIG1hcERhdGEuY2xlYXIoKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IGEsIE9iamVjdCBiKSB7Ci0gICAgaWYgKGEgaW5zdGFuY2VvZiBieXRlW10gJiYgYiBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGJ5dGVbXSkgYSwgKGJ5dGVbXSkgYik7Ci0gICAgfQotICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHR3byB7QGxpbmsgTWFwfXMgYXJlIGVxdWFsLiBXZSBkb24ndCB1c2UgdGhlIGRlZmF1bHQgZXF1YWxzCi0gICAqIG1ldGhvZCBvZiB7QGxpbmsgTWFwfSBiZWNhdXNlIGl0IGNvbXBhcmVzIGJ5IGlkZW50aXR5IG5vdCBieSBjb250ZW50IGZvcgotICAgKiBieXRlIGFycmF5cy4KLSAgICovCi0gIHN0YXRpYyA8SywgVj4gYm9vbGVhbiBlcXVhbHMoTWFwPEssIFY+IGEsIE1hcDxLLCBWPiBiKSB7Ci0gICAgaWYgKGEgPT0gYikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmIChhLnNpemUoKSAhPSBiLnNpemUoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA6IGEuZW50cnlTZXQoKSkgewotICAgICAgaWYgKCFiLmNvbnRhaW5zS2V5KGVudHJ5LmdldEtleSgpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoIWVxdWFscyhlbnRyeS5nZXRWYWx1ZSgpLCBiLmdldChlbnRyeS5nZXRLZXkoKSkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0d28gbWFwIGZpZWxkcyBhcmUgZXF1YWwuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb2JqZWN0KSB7Ci0gICAgaWYgKCEob2JqZWN0IGluc3RhbmNlb2YgTWFwRmllbGRMaXRlKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBNYXBGaWVsZExpdGU8SywgVj4gb3RoZXIgPSAoTWFwRmllbGRMaXRlPEssIFY+KSBvYmplY3Q7Ci0gICAgcmV0dXJuIGVxdWFscyhtYXBEYXRhLCBvdGhlci5tYXBEYXRhKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGNhbGN1bGF0ZUhhc2hDb2RlRm9yT2JqZWN0KE9iamVjdCBhKSB7Ci0gICAgaWYgKGEgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgIHJldHVybiBJbnRlcm5hbC5oYXNoQ29kZSgoYnl0ZVtdKSBhKTsKLSAgICB9Ci0gICAgLy8gRW51bXMgc2hvdWxkIGJlIHN0b3JlZCBhcyBpbnRlZ2VycyBpbnRlcm5hbGx5LgotICAgIGlmIChhIGluc3RhbmNlb2YgRW51bUxpdGUpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgICByZXR1cm4gYS5oYXNoQ29kZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGN1bGF0ZXMgdGhlIGhhc2ggY29kZSBmb3IgYSB7QGxpbmsgTWFwfS4gV2UgZG9uJ3QgdXNlIHRoZSBkZWZhdWx0IGhhc2gKLSAgICogY29kZSBtZXRob2Qgb2Yge0BsaW5rIE1hcH0gYmVjYXVzZSBmb3IgYnl0ZSBhcnJheXMgYW5kIHByb3RvYnVmIGVudW1zIGl0Ci0gICAqIHVzZSB7QGxpbmsgT2JqZWN0I2hhc2hDb2RlKCl9LgotICAgKi8KLSAgc3RhdGljIDxLLCBWPiBpbnQgY2FsY3VsYXRlSGFzaENvZGVGb3JNYXAoTWFwPEssIFY+IGEpIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKE1hcC5FbnRyeTxLLCBWPiBlbnRyeSA6IGEuZW50cnlTZXQoKSkgewotICAgICAgcmVzdWx0ICs9IGNhbGN1bGF0ZUhhc2hDb2RlRm9yT2JqZWN0KGVudHJ5LmdldEtleSgpKQotICAgICAgICAgIF4gY2FsY3VsYXRlSGFzaENvZGVGb3JPYmplY3QoZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7ICAgIAotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gY2FsY3VsYXRlSGFzaENvZGVGb3JNYXAobWFwRGF0YSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIE9iamVjdCBjb3B5KE9iamVjdCBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICBieXRlW10gZGF0YSA9IChieXRlW10pIG9iamVjdDsKLSAgICAgIHJldHVybiBBcnJheXMuY29weU9mKGRhdGEsIGRhdGEubGVuZ3RoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG9iamVjdDsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1ha2VzIGEgZGVlcCBjb3B5IG9mIGEge0BsaW5rIE1hcH0uIEltbXV0YWJsZSBvYmplY3RzIGluIHRoZSBtYXAgd2lsbCBiZQotICAgKiBzaGFyZWQgKGUuZy4sIGludGVnZXJzLCBzdHJpbmdzLCBpbW11dGFibGUgbWVzc2FnZXMpIGFuZCBtdXRhYmxlIG9uZXMgd2lsbAotICAgKiBoYXZlIGEgY29weSAoZS5nLiwgYnl0ZSBhcnJheXMsIG11dGFibGUgbWVzc2FnZXMpLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHN0YXRpYyA8SywgVj4gTWFwPEssIFY+IGNvcHkoTWFwPEssIFY+IG1hcCkgewotICAgIE1hcDxLLCBWPiByZXN1bHQgPSBuZXcgTGlua2VkSGFzaE1hcDxLLCBWPigpOwotICAgIGZvciAoTWFwLkVudHJ5PEssIFY+IGVudHJ5IDogbWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgIHJlc3VsdC5wdXQoZW50cnkuZ2V0S2V5KCksIChWKSBjb3B5KGVudHJ5LmdldFZhbHVlKCkpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICAKLSAgLyoqIFJldHVybnMgYSBkZWVwIGNvcHkgb2YgdGhpcyBtYXAgZmllbGQuICovCi0gIHB1YmxpYyBNYXBGaWVsZExpdGU8SywgVj4gY29weSgpIHsKLSAgICByZXR1cm4gbmV3IE1hcEZpZWxkTGl0ZTxLLCBWPihjb3B5KG1hcERhdGEpKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1ha2VzIHRoaXMgZmllbGQgaW1tdXRhYmxlLiBBbGwgc3Vic2VxdWVudCBtb2RpZmljYXRpb25zIHdpbGwgdGhyb3cgYW4KLSAgICoge0BsaW5rIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIG1ha2VJbW11dGFibGUoKSB7Ci0gICAgaXNNdXRhYmxlID0gZmFsc2U7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBSZXR1cm5zIHdoZXRoZXIgdGhpcyBmaWVsZCBjYW4gYmUgbW9kaWZpZWQuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc011dGFibGUoKSB7Ci0gICAgcmV0dXJuIGlzTXV0YWJsZTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGVuc3VyZU11dGFibGUoKSB7Ci0gICAgaWYgKCFpc011dGFibGUoKSkgewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFuIGludGVybmFsIG1hcCB0aGF0IGNoZWNrcyBmb3IgbXV0YWJpbGl0eSBiZWZvcmUgZGVsZWdhdGluZy4KLSAgICovCi0gIHN0YXRpYyBjbGFzcyBNdXRhdGFiaWxpdHlBd2FyZU1hcDxLLCBWPiBpbXBsZW1lbnRzIE1hcDxLLCBWPiB7ICAgIAotICAgIHByaXZhdGUgZmluYWwgTXV0YWJpbGl0eU9yYWNsZSBtdXRhYmlsaXR5T3JhY2xlOwotICAgIHByaXZhdGUgZmluYWwgTWFwPEssIFY+IGRlbGVnYXRlOwotICAgIAotICAgIE11dGF0YWJpbGl0eUF3YXJlTWFwKE11dGFiaWxpdHlPcmFjbGUgbXV0YWJpbGl0eU9yYWNsZSwgTWFwPEssIFY+IGRlbGVnYXRlKSB7Ci0gICAgICB0aGlzLm11dGFiaWxpdHlPcmFjbGUgPSBtdXRhYmlsaXR5T3JhY2xlOwotICAgICAgdGhpcy5kZWxlZ2F0ZSA9IGRlbGVnYXRlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5zaXplKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5pc0VtcHR5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IGtleSkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmNvbnRhaW5zS2V5KGtleSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNWYWx1ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5jb250YWluc1ZhbHVlKHZhbHVlKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgViBnZXQoT2JqZWN0IGtleSkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmdldChrZXkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWIHB1dChLIGtleSwgViB2YWx1ZSkgewotICAgICAgbXV0YWJpbGl0eU9yYWNsZS5lbnN1cmVNdXRhYmxlKCk7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWIHJlbW92ZShPYmplY3Qga2V5KSB7Ci0gICAgICBtdXRhYmlsaXR5T3JhY2xlLmVuc3VyZU11dGFibGUoKTsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5yZW1vdmUoa2V5KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBwdXRBbGwoTWFwPD8gZXh0ZW5kcyBLLCA/IGV4dGVuZHMgVj4gbSkgewotICAgICAgbXV0YWJpbGl0eU9yYWNsZS5lbnN1cmVNdXRhYmxlKCk7Ci0gICAgICBkZWxlZ2F0ZS5wdXRBbGwobSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgICBtdXRhYmlsaXR5T3JhY2xlLmVuc3VyZU11dGFibGUoKTsKLSAgICAgIGRlbGVnYXRlLmNsZWFyKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxLPiBrZXlTZXQoKSB7Ci0gICAgICByZXR1cm4gbmV3IE11dGF0YWJpbGl0eUF3YXJlU2V0PEs+KG11dGFiaWxpdHlPcmFjbGUsIGRlbGVnYXRlLmtleVNldCgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29sbGVjdGlvbjxWPiB2YWx1ZXMoKSB7Ci0gICAgICByZXR1cm4gbmV3IE11dGF0YWJpbGl0eUF3YXJlQ29sbGVjdGlvbjxWPihtdXRhYmlsaXR5T3JhY2xlLCBkZWxlZ2F0ZS52YWx1ZXMoKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFNldDxqYXZhLnV0aWwuTWFwLkVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsKLSAgICAgIHJldHVybiBuZXcgTXV0YXRhYmlsaXR5QXdhcmVTZXQ8RW50cnk8SywgVj4+KG11dGFiaWxpdHlPcmFjbGUsIGRlbGVnYXRlLmVudHJ5U2V0KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmVxdWFscyhvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS50b1N0cmluZygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiBpbnRlcm5hbCBjb2xsZWN0aW9uIHRoYXQgY2hlY2tzIGZvciBtdXRhYmlsaXR5IGJlZm9yZSBkZWxlZ2F0aW5nLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXV0YXRhYmlsaXR5QXdhcmVDb2xsZWN0aW9uPEU+IGltcGxlbWVudHMgQ29sbGVjdGlvbjxFPiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNdXRhYmlsaXR5T3JhY2xlIG11dGFiaWxpdHlPcmFjbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2xsZWN0aW9uPEU+IGRlbGVnYXRlOwotICAgIAotICAgIE11dGF0YWJpbGl0eUF3YXJlQ29sbGVjdGlvbihNdXRhYmlsaXR5T3JhY2xlIG11dGFiaWxpdHlPcmFjbGUsIENvbGxlY3Rpb248RT4gZGVsZWdhdGUpIHsKLSAgICAgIHRoaXMubXV0YWJpbGl0eU9yYWNsZSA9IG11dGFiaWxpdHlPcmFjbGU7Ci0gICAgICB0aGlzLmRlbGVnYXRlID0gZGVsZWdhdGU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLnNpemUoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmlzRW1wdHkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBjb250YWlucyhPYmplY3QgbykgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmNvbnRhaW5zKG8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBJdGVyYXRvcjxFPiBpdGVyYXRvcigpIHsKLSAgICAgIHJldHVybiBuZXcgTXV0YXRhYmlsaXR5QXdhcmVJdGVyYXRvcjxFPihtdXRhYmlsaXR5T3JhY2xlLCBkZWxlZ2F0ZS5pdGVyYXRvcigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0W10gdG9BcnJheSgpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS50b0FycmF5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIDxUPiBUW10gdG9BcnJheShUW10gYSkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLnRvQXJyYXkoYSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYWRkKEUgZSkgewotICAgICAgLy8gVW5zdXBwb3J0ZWQgb3BlcmF0aW9uIGluIHRoZSBkZWxlZ2F0ZS4KLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHJlbW92ZShPYmplY3QgbykgewotICAgICAgbXV0YWJpbGl0eU9yYWNsZS5lbnN1cmVNdXRhYmxlKCk7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUucmVtb3ZlKG8pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zQWxsKENvbGxlY3Rpb248Pz4gYykgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmNvbnRhaW5zQWxsKGMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGFkZEFsbChDb2xsZWN0aW9uPD8gZXh0ZW5kcyBFPiBjKSB7Ci0gICAgICAvLyBVbnN1cHBvcnRlZCBvcGVyYXRpb24gaW4gdGhlIGRlbGVnYXRlLgotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotICAgICAgbXV0YWJpbGl0eU9yYWNsZS5lbnN1cmVNdXRhYmxlKCk7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUucmVtb3ZlQWxsKGMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIHJldGFpbkFsbChDb2xsZWN0aW9uPD8+IGMpIHsKLSAgICAgIG11dGFiaWxpdHlPcmFjbGUuZW5zdXJlTXV0YWJsZSgpOwotICAgICAgcmV0dXJuIGRlbGVnYXRlLnJldGFpbkFsbChjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgIG11dGFiaWxpdHlPcmFjbGUuZW5zdXJlTXV0YWJsZSgpOwotICAgICAgZGVsZWdhdGUuY2xlYXIoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5lcXVhbHMobyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5oYXNoQ29kZSgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLnRvU3RyaW5nKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEFuIGludGVybmFsIHNldCB0aGF0IGNoZWNrcyBmb3IgbXV0YWJpbGl0eSBiZWZvcmUgZGVsZWdhdGluZy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE11dGF0YWJpbGl0eUF3YXJlU2V0PEU+IGltcGxlbWVudHMgU2V0PEU+IHsKLSAgICBwcml2YXRlIGZpbmFsIE11dGFiaWxpdHlPcmFjbGUgbXV0YWJpbGl0eU9yYWNsZTsKLSAgICBwcml2YXRlIGZpbmFsIFNldDxFPiBkZWxlZ2F0ZTsKLSAgICAKLSAgICBNdXRhdGFiaWxpdHlBd2FyZVNldChNdXRhYmlsaXR5T3JhY2xlIG11dGFiaWxpdHlPcmFjbGUsIFNldDxFPiBkZWxlZ2F0ZSkgewotICAgICAgdGhpcy5tdXRhYmlsaXR5T3JhY2xlID0gbXV0YWJpbGl0eU9yYWNsZTsKLSAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuc2l6ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuaXNFbXB0eSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zKE9iamVjdCBvKSB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuY29udGFpbnMobyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEl0ZXJhdG9yPEU+IGl0ZXJhdG9yKCkgewotICAgICAgcmV0dXJuIG5ldyBNdXRhdGFiaWxpdHlBd2FyZUl0ZXJhdG9yPEU+KG11dGFiaWxpdHlPcmFjbGUsIGRlbGVnYXRlLml0ZXJhdG9yKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3RbXSB0b0FycmF5KCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLnRvQXJyYXkoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgPFQ+IFRbXSB0b0FycmF5KFRbXSBhKSB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUudG9BcnJheShhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoRSBlKSB7Ci0gICAgICBtdXRhYmlsaXR5T3JhY2xlLmVuc3VyZU11dGFibGUoKTsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5hZGQoZSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlKE9iamVjdCBvKSB7Ci0gICAgICBtdXRhYmlsaXR5T3JhY2xlLmVuc3VyZU11dGFibGUoKTsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5yZW1vdmUobyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnNBbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUuY29udGFpbnNBbGwoYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gYWRkQWxsKENvbGxlY3Rpb248PyBleHRlbmRzIEU+IGMpIHsKLSAgICAgIG11dGFiaWxpdHlPcmFjbGUuZW5zdXJlTXV0YWJsZSgpOwotICAgICAgcmV0dXJuIGRlbGVnYXRlLmFkZEFsbChjKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZXRhaW5BbGwoQ29sbGVjdGlvbjw/PiBjKSB7Ci0gICAgICBtdXRhYmlsaXR5T3JhY2xlLmVuc3VyZU11dGFibGUoKTsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS5yZXRhaW5BbGwoYyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gcmVtb3ZlQWxsKENvbGxlY3Rpb248Pz4gYykgewotICAgICAgbXV0YWJpbGl0eU9yYWNsZS5lbnN1cmVNdXRhYmxlKCk7Ci0gICAgICByZXR1cm4gZGVsZWdhdGUucmVtb3ZlQWxsKGMpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgICAgbXV0YWJpbGl0eU9yYWNsZS5lbnN1cmVNdXRhYmxlKCk7Ci0gICAgICBkZWxlZ2F0ZS5jbGVhcigpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmVxdWFscyhvKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS50b1N0cmluZygpOwotICAgIH0KLSAgfQotICAKLSAgLyoqCi0gICAqIEFuIGludGVybmFsIGl0ZXJhdG9yIHRoYXQgY2hlY2tzIGZvciBtdXRhYmlsaXR5IGJlZm9yZSBkZWxlZ2F0aW5nLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTXV0YXRhYmlsaXR5QXdhcmVJdGVyYXRvcjxFPiBpbXBsZW1lbnRzIEl0ZXJhdG9yPEU+IHsKLSAgICBwcml2YXRlIGZpbmFsIE11dGFiaWxpdHlPcmFjbGUgbXV0YWJpbGl0eU9yYWNsZTsKLSAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPEU+IGRlbGVnYXRlOwotICAgIAotICAgIE11dGF0YWJpbGl0eUF3YXJlSXRlcmF0b3IoTXV0YWJpbGl0eU9yYWNsZSBtdXRhYmlsaXR5T3JhY2xlLCBJdGVyYXRvcjxFPiBkZWxlZ2F0ZSkgewotICAgICAgdGhpcy5tdXRhYmlsaXR5T3JhY2xlID0gbXV0YWJpbGl0eU9yYWNsZTsKLSAgICAgIHRoaXMuZGVsZWdhdGUgPSBkZWxlZ2F0ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmhhc05leHQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRSBuZXh0KCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLm5leHQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICBtdXRhYmlsaXR5T3JhY2xlLmVuc3VyZU11dGFibGUoKTsKLSAgICAgIGRlbGVnYXRlLnJlbW92ZSgpOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG9iaikgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmVxdWFscyhvYmopOwotICAgIH0KLSAgICAKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIGRlbGVnYXRlLmhhc2hDb2RlKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgIHJldHVybiBkZWxlZ2F0ZS50b1N0cmluZygpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ1OTBmYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2UuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVE9ETyhrZW50b24pOiAgVXNlIGdlbmVyaWNzPyAgRS5nLiBCdWlsZGVyPEJ1aWxkZXJUeXBlIGV4dGVuZHMgQnVpbGRlcj4sIHRoZW4KLS8vICAgbWVyZ2VGcm9tKigpIGNvdWxkIHJldHVybiBCdWlsZGVyVHlwZSBmb3IgYmV0dGVyIHR5cGUtc2FmZXR5LgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgUHJvdG9jb2wgTWVzc2FnZSBvYmplY3RzLgotICogPHA+Ci0gKiBTZWUgYWxzbyB7QGxpbmsgTWVzc2FnZUxpdGV9LCB3aGljaCBkZWZpbmVzIG1vc3Qgb2YgdGhlIG1ldGhvZHMgdGhhdCB0eXBpY2FsCi0gKiB1c2VycyBjYXJlIGFib3V0LiAge0BsaW5rIE1lc3NhZ2V9IGFkZHMgdG8gaXQgbWV0aG9kcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlCi0gKiBpbiB0aGUgImxpdGUiIHJ1bnRpbWUuICBUaGUgYmlnZ2VzdCBhZGRlZCBmZWF0dXJlcyBhcmUgaW50cm9zcGVjdGlvbiBhbmQKLSAqIHJlZmxlY3Rpb24gLS0gaS5lLiwgZ2V0dGluZyBkZXNjcmlwdG9ycyBmb3IgdGhlIG1lc3NhZ2UgdHlwZSBhbmQgYWNjZXNzaW5nCi0gKiB0aGUgZmllbGQgdmFsdWVzIGR5bmFtaWNhbGx5LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBNZXNzYWdlT3JCdWlsZGVyIHsKLQotICAvLyAoRnJvbSBNZXNzYWdlTGl0ZSwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZSBjb3ZhcmlhbmNlLikKLSAgQE92ZXJyaWRlCi0gIFBhcnNlcjw/IGV4dGVuZHMgTWVzc2FnZT4gZ2V0UGFyc2VyRm9yVHlwZSgpOwotCi0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQ29tcGFyaXNvbiBhbmQgaGFzaGluZwotCi0gIC8qKgotICAgKiBDb21wYXJlcyB0aGUgc3BlY2lmaWVkIG9iamVjdCB3aXRoIHRoaXMgbWVzc2FnZSBmb3IgZXF1YWxpdHkuICBSZXR1cm5zCi0gICAqIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIChhcwotICAgKiBkZWZpbmVkIGJ5IHtAY29kZSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfSkgYW5kIGhhcyBpZGVudGljYWwgdmFsdWVzIGZvcgotICAgKiBhbGwgb2YgaXRzIGZpZWxkcy4gIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpczsgaW5oZXJpdGluZwotICAgKiB7QGNvZGUgT2JqZWN0LmVxdWFscygpfSBpcyBpbmNvcnJlY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyBtZXNzYWdlCi0gICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IGlmIHRoZSBzcGVjaWZpZWQgb2JqZWN0IGlzIGVxdWFsIHRvIHRoaXMgbWVzc2FnZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvdGhlcik7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtZXNzYWdlLiAgVGhlIGhhc2ggY29kZSBvZiBhIG1lc3NhZ2UKLSAgICogc2hvdWxkIG1peCB0aGUgbWVzc2FnZSdzIHR5cGUgKG9iamVjdCBpZGVudGl0eSBvZiB0aGUgZGVzY3JpcHRvcikgd2l0aCBpdHMKLSAgICogY29udGVudHMgKGtub3duIGFuZCB1bmtub3duIGZpZWxkIHZhbHVlcykuICBTdWJjbGFzc2VzIG11c3QgaW1wbGVtZW50IHRoaXM7Ci0gICAqIGluaGVyaXRpbmcge0Bjb2RlIE9iamVjdC5oYXNoQ29kZSgpfSBpcyBpbmNvcnJlY3QuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGhhc2ggY29kZSB2YWx1ZSBmb3IgdGhpcyBtZXNzYWdlCi0gICAqIEBzZWUgTWFwI2hhc2hDb2RlKCkKLSAgICovCi0gIEBPdmVycmlkZQotICBpbnQgaGFzaENvZGUoKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBDb252ZW5pZW5jZSBtZXRob2RzLgotCi0gIC8qKgotICAgKiBDb252ZXJ0cyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZyBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQuIFRoaXMgaXMKLSAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQge0BsaW5rCi0gICAqIFRleHRGb3JtYXQjcHJpbnRUb1N0cmluZyhNZXNzYWdlT3JCdWlsZGVyKX0uCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgU3RyaW5nIHRvU3RyaW5nKCk7Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gQnVpbGRlcnMKLQotICAvLyAoRnJvbSBNZXNzYWdlTGl0ZSwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZSBjb3ZhcmlhbmNlLikKLSAgQE92ZXJyaWRlCi0gIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoKTsKLQotICBAT3ZlcnJpZGUKLSAgQnVpbGRlciB0b0J1aWxkZXIoKTsKLQotICAvKioKLSAgICogQWJzdHJhY3QgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IFByb3RvY29sIE1lc3NhZ2UgYnVpbGRlcnMuCi0gICAqLwotICBpbnRlcmZhY2UgQnVpbGRlciBleHRlbmRzIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsIE1lc3NhZ2VPckJ1aWxkZXIgewotICAgIC8vIChGcm9tIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsIHJlLWRlY2xhcmVkIGhlcmUgb25seSBmb3IgcmV0dXJuIHR5cGUKLSAgICAvLyBjb3ZhcmlhbmNlLikKLSAgICBAT3ZlcnJpZGUKLSAgICBCdWlsZGVyIGNsZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB7QGNvZGUgb3RoZXJ9IGludG8gdGhlIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICB7QGNvZGUgb3RoZXJ9IG11c3QKLSAgICAgKiBoYXZlIHRoZSBleGFjdCBzYW1lIHR5cGUgYXMge0Bjb2RlIHRoaXN9IChpLmUuCi0gICAgICoge0Bjb2RlIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgPT0gb3RoZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0pLgotICAgICAqCi0gICAgICogTWVyZ2luZyBvY2N1cnMgYXMgZm9sbG93cy4gIEZvciBlYWNoIGZpZWxkOjxicj4KLSAgICAgKiAqIEZvciBzaW5ndWxhciBwcmltaXRpdmUgZmllbGRzLCBpZiB0aGUgZmllbGQgaXMgc2V0IGluIHtAY29kZSBvdGhlcn0sCi0gICAgICogICB0aGVuIHtAY29kZSBvdGhlcn0ncyB2YWx1ZSBvdmVyd3JpdGVzIHRoZSB2YWx1ZSBpbiB0aGlzIG1lc3NhZ2UuPGJyPgotICAgICAqICogRm9yIHNpbmd1bGFyIG1lc3NhZ2UgZmllbGRzLCBpZiB0aGUgZmllbGQgaXMgc2V0IGluIHtAY29kZSBvdGhlcn0sCi0gICAgICogICBpdCBpcyBtZXJnZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBzdWItbWVzc2FnZSBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKiAgIHVzaW5nIHRoZSBzYW1lIG1lcmdpbmcgcnVsZXMuPGJyPgotICAgICAqICogRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIGVsZW1lbnRzIGluIHtAY29kZSBvdGhlcn0gYXJlIGNvbmNhdGVuYXRlZAotICAgICAqICAgd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhpcyBtZXNzYWdlLgotICAgICAqICogRm9yIG9uZW9mIGdyb3VwcywgaWYgdGhlIG90aGVyIG1lc3NhZ2UgaGFzIG9uZSBvZiB0aGUgZmllbGRzIHNldCwKLSAgICAgKiAgIHRoZSBncm91cCBvZiB0aGlzIG1lc3NhZ2UgaXMgY2xlYXJlZCBhbmQgcmVwbGFjZWQgYnkgdGhlIGZpZWxkCi0gICAgICogICBvZiB0aGUgb3RoZXIgbWVzc2FnZSwgc28gdGhhdCB0aGUgb25lb2YgY29uc3RyYWludCBpcyBwcmVzZXJ2ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHtAY29kZSBNZXNzYWdlOjpNZXJnZUZyb219IG1ldGhvZCBpbiBDKysuCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oTWVzc2FnZSBvdGhlcik7Ci0KLSAgICAvLyAoRnJvbSBNZXNzYWdlTGl0ZS5CdWlsZGVyLCByZS1kZWNsYXJlZCBoZXJlIG9ubHkgZm9yIHJldHVybiB0eXBlCi0gICAgLy8gY292YXJpYW5jZS4pCi0gICAgQE92ZXJyaWRlCi0gICAgTWVzc2FnZSBidWlsZCgpOwotCi0gICAgQE92ZXJyaWRlCi0gICAgTWVzc2FnZSBidWlsZFBhcnRpYWwoKTsKLQotICAgIEBPdmVycmlkZQotICAgIEJ1aWxkZXIgY2xvbmUoKTsKLQotICAgIEBPdmVycmlkZQotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIEBPdmVycmlkZQotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZXNzYWdlJ3MgdHlwZSdzIGRlc2NyaXB0b3IuCi0gICAgICogU2VlIHtAbGluayBNZXNzYWdlI2dldERlc2NyaXB0b3JGb3JUeXBlKCl9LgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJ1aWxkZXIgZm9yIG1lc3NhZ2VzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgZ2l2ZW4KLSAgICAgKiBmaWVsZC4gIE1lc3NhZ2VzIGJ1aWx0IHdpdGggdGhpcyBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gc2V0RmllbGQoKSwKLSAgICAgKiBzZXRSZXBlYXRlZEZpZWxkKCksIG9yIGFkZFJlcGVhdGVkRmllbGQoKS4KLSAgICAgKi8KLSAgICBCdWlsZGVyIG5ld0J1aWxkZXJGb3JGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpOwotCi0gICAgLyoqCi0gICAgICogR2V0IGEgbmVzdGVkIGJ1aWxkZXIgaW5zdGFuY2UgZm9yIHRoZSBnaXZlbiBmaWVsZC4KLSAgICAgKiA8cD4KLSAgICAgKiBOb3JtYWxseSwgd2UgaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgaW1tdXRhYmxlIG1lc3NhZ2Ugb2JqZWN0IGZvciB0aGUKLSAgICAgKiBtZXNzYWdlIHR5cGUgZmllbGQuIFNvbWUgaW1wbGVtZW50YXRpb25zKHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSBidWlsZGVycyksCi0gICAgICogaG93ZXZlciwgY2FuIGFsc28gaG9sZCBhIHJlZmVyZW5jZSB0byB0aGUgYnVpbGRlciBvYmplY3QgKGEgbmVzdGVkCi0gICAgICogYnVpbGRlcikgZm9yIHRoZSBmaWVsZC4KLSAgICAgKiA8cD4KLSAgICAgKiBJZiB0aGUgZmllbGQgaXMgYWxyZWFkeSBiYWNrZWQgdXAgYnkgYSBuZXN0ZWQgYnVpbGRlciwgdGhlIG5lc3RlZCBidWlsZGVyCi0gICAgICogd2lsbCBiZSByZXR1cm5lZC4gT3RoZXJ3aXNlLCBhIG5ldyBmaWVsZCBidWlsZGVyIHdpbGwgYmUgY3JlYXRlZCBhbmQKLSAgICAgKiByZXR1cm5lZC4gVGhlIG9yaWdpbmFsIG1lc3NhZ2UgZmllbGQgKGlmIGV4aXN0KSB3aWxsIGJlIG1lcmdlZCBpbnRvIHRoZQotICAgICAqIGZpZWxkIGJ1aWxkZXIsIHdoaWNoIHdpbGwgdGhlbiBiZSBuZXN0ZWQgaW50byBpdHMgcGFyZW50IGJ1aWxkZXIuCi0gICAgICogPHA+Ci0gICAgICogTk9URTogaW1wbGVtZW50YXRpb25zIHRoYXQgZG8gbm90IHN1cHBvcnQgbmVzdGVkIGJ1aWxkZXJzIHdpbGwgdGhyb3cKLSAgICAgKiA8Y29kZT5VbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbjwvY29kZT4uCi0gICAgICovCi0gICAgQnVpbGRlciBnZXRGaWVsZEJ1aWxkZXIoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKLQotICAgIC8qKgotICAgICAqIEdldCBhIG5lc3RlZCBidWlsZGVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gcmVwZWF0ZWQgZmllbGQgaW5zdGFuY2UuCi0gICAgICogPHA+Ci0gICAgICogTm9ybWFsbHksIHdlIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIGltbXV0YWJsZSBtZXNzYWdlIG9iamVjdCBmb3IgdGhlCi0gICAgICogbWVzc2FnZSB0eXBlIGZpZWxkLiBTb21lIGltcGxlbWVudGF0aW9ucyh0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgYnVpbGRlcnMpLAotICAgICAqIGhvd2V2ZXIsIGNhbiBhbHNvIGhvbGQgYSByZWZlcmVuY2UgdG8gdGhlIGJ1aWxkZXIgb2JqZWN0IChhIG5lc3RlZAotICAgICAqIGJ1aWxkZXIpIGZvciB0aGUgZmllbGQuCi0gICAgICogPHA+Ci0gICAgICogSWYgdGhlIGZpZWxkIGlzIGFscmVhZHkgYmFja2VkIHVwIGJ5IGEgbmVzdGVkIGJ1aWxkZXIsIHRoZSBuZXN0ZWQgYnVpbGRlcgotICAgICAqIHdpbGwgYmUgcmV0dXJuZWQuIE90aGVyd2lzZSwgYSBuZXcgZmllbGQgYnVpbGRlciB3aWxsIGJlIGNyZWF0ZWQgYW5kCi0gICAgICogcmV0dXJuZWQuIFRoZSBvcmlnaW5hbCBtZXNzYWdlIGZpZWxkIChpZiBleGlzdCkgd2lsbCBiZSBtZXJnZWQgaW50byB0aGUKLSAgICAgKiBmaWVsZCBidWlsZGVyLCB3aGljaCB3aWxsIHRoZW4gYmUgbmVzdGVkIGludG8gaXRzIHBhcmVudCBidWlsZGVyLgotICAgICAqIDxwPgotICAgICAqIE5PVEU6IGltcGxlbWVudGF0aW9ucyB0aGF0IGRvIG5vdCBzdXBwb3J0IG5lc3RlZCBidWlsZGVycyB3aWxsIHRocm93Ci0gICAgICogPGNvZGU+VW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb248L2NvZGU+LgotICAgICAqLwotICAgIEJ1aWxkZXIgZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KTsKLQotICAgIC8qKgotICAgICAqIFNldHMgYSBmaWVsZCB0byB0aGUgZ2l2ZW4gdmFsdWUuICBUaGUgdmFsdWUgbXVzdCBiZSBvZiB0aGUgY29ycmVjdCB0eXBlCi0gICAgICogZm9yIHRoaXMgZmllbGQsIGkuZS4gdGhlIHNhbWUgdHlwZSB0aGF0Ci0gICAgICoge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gd291bGQgcmV0dXJuLgotICAgICAqLwotICAgIEJ1aWxkZXIgc2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLCBPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBmaWVsZC4gIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGdlbmVyYXRlZAotICAgICAqICJjbGVhciIgYWNjZXNzb3IgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkLgotICAgICAqLwotICAgIEJ1aWxkZXIgY2xlYXJGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpOwotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBvbmVvZi4gIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGdlbmVyYXRlZAotICAgICAqICJjbGVhciIgYWNjZXNzb3IgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIG9uZW9mLgotICAgICAqLwotICAgIEJ1aWxkZXIgY2xlYXJPbmVvZihEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2YpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBhbiBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZmllbGQgdG8gdGhlIGdpdmVuIHZhbHVlLiAgVGhlIHZhbHVlIG11c3QKLSAgICAgKiBiZSBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGlzIGZpZWxkLCBpLmUuIHRoZSBzYW1lIHR5cGUgdGhhdAotICAgICAqIHtAbGluayBNZXNzYWdlI2dldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLGludCl9IHdvdWxkCi0gICAgICogcmV0dXJuLgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSBmaWVsZCBpcyBub3QgYSByZXBlYXRlZCBmaWVsZCwgb3IKLSAgICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCi0gICAgICovCi0gICAgQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGNvZGUgc2V0UmVwZWF0ZWRGaWVsZH0sIGJ1dCBhcHBlbmRzIHRoZSB2YWx1ZSBhcyBhIG5ldyBlbGVtZW50LgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSBmaWVsZCBpcyBub3QgYSByZXBlYXRlZCBmaWVsZCwgb3IKLSAgICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCi0gICAgICovCi0gICAgQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKTsKLQotICAgIC8qKiBTZXQgdGhlIHtAbGluayBVbmtub3duRmllbGRTZXR9IGZvciB0aGlzIG1lc3NhZ2UuICovCi0gICAgQnVpbGRlciBzZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKTsKLQotICAgIC8qKgotICAgICAqIE1lcmdlIHNvbWUgdW5rbm93biBmaWVsZHMgaW50byB0aGUge0BsaW5rIFVua25vd25GaWVsZFNldH0gZm9yIHRoaXMKLSAgICAgKiBtZXNzYWdlLgotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHMuCi0KLSAgICAvLyAoRnJvbSBNZXNzYWdlTGl0ZS5CdWlsZGVyLCByZS1kZWNsYXJlZCBoZXJlIG9ubHkgZm9yIHJldHVybiB0eXBlCi0gICAgLy8gY292YXJpYW5jZS4pCi0gICAgQE92ZXJyaWRlCi0gICAgQnVpbGRlciBtZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gICAgQE92ZXJyaWRlCi0gICAgQnVpbGRlciBtZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAgIEBPdmVycmlkZQotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gICAgQE92ZXJyaWRlCi0gICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAgIEBPdmVycmlkZQotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBCdWlsZGVyIG1lcmdlRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgQE92ZXJyaWRlCi0gICAgQnVpbGRlciBtZXJnZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgQE92ZXJyaWRlCi0gICAgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIEBPdmVycmlkZQotICAgIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OGY1MzFkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDM0MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVE9ETyhrZW50b24pOiAgVXNlIGdlbmVyaWNzPyAgRS5nLiBCdWlsZGVyPEJ1aWxkZXJUeXBlIGV4dGVuZHMgQnVpbGRlcj4sIHRoZW4KLS8vICAgbWVyZ2VGcm9tKigpIGNvdWxkIHJldHVybiBCdWlsZGVyVHlwZSBmb3IgYmV0dGVyIHR5cGUtc2FmZXR5LgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci0KLS8qKgotICogQWJzdHJhY3QgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IFByb3RvY29sIE1lc3NhZ2Ugb2JqZWN0cy4KLSAqCi0gKiA8cD5UaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBhbGwgcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzLiAgTm9uLWxpdGUKLSAqIG1lc3NhZ2VzIGFkZGl0aW9uYWxseSBpbXBsZW1lbnQgdGhlIE1lc3NhZ2UgaW50ZXJmYWNlLCB3aGljaCBpcyBhIHN1YmNsYXNzCi0gKiBvZiBNZXNzYWdlTGl0ZS4gIFVzZSBNZXNzYWdlTGl0ZSBpbnN0ZWFkIHdoZW4geW91IG9ubHkgbmVlZCB0aGUgc3Vic2V0IG9mCi0gKiBmZWF0dXJlcyB3aGljaCBpdCBzdXBwb3J0cyAtLSBuYW1lbHksIG5vdGhpbmcgdGhhdCB1c2VzIGRlc2NyaXB0b3JzIG9yCi0gKiByZWZsZWN0aW9uLiAgWW91IGNhbiBpbnN0cnVjdCB0aGUgcHJvdG9jb2wgY29tcGlsZXIgdG8gZ2VuZXJhdGUgY2xhc3NlcwotICogd2hpY2ggaW1wbGVtZW50IG9ubHkgTWVzc2FnZUxpdGUsIG5vdCB0aGUgZnVsbCBNZXNzYWdlIGludGVyZmFjZSwgYnkgYWRkaW5nCi0gKiB0aGUgZm9sbG93IGxpbmUgdG8gdGhlIC5wcm90byBmaWxlOgotICogPHByZT4KLSAqICAgb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLSAqIDwvcHJlPgotICoKLSAqIDxwPlRoaXMgaXMgcGFydGljdWxhcmx5IHVzZWZ1bCBvbiByZXNvdXJjZS1jb25zdHJhaW5lZCBzeXN0ZW1zIHdoZXJlIHRoZQotICogZnVsbCBwcm90b2NvbCBidWZmZXJzIHJ1bnRpbWUgbGlicmFyeSBpcyB0b28gYmlnLgotICoKLSAqIDxwPk5vdGUgdGhhdCBvbiBub24tY29uc3RyYWluZWQgc3lzdGVtcyAoZS5nLiBzZXJ2ZXJzKSB3aGVuIHlvdSBuZWVkIHRvIGxpbmsKLSAqIGluIGxvdHMgb2YgcHJvdG9jb2wgZGVmaW5pdGlvbnMsIGEgYmV0dGVyIHdheSB0byByZWR1Y2UgdG90YWwgY29kZSBmb290cHJpbnQKLSAqIGlzIHRvIHVzZSB7QGNvZGUgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFfS4gIFRoaXMgd2lsbCBtYWtlIHRoZSBnZW5lcmF0ZWQKLSAqIGNvZGUgc21hbGxlciB3aGlsZSBzdGlsbCBzdXBwb3J0aW5nIGFsbCB0aGUgc2FtZSBmZWF0dXJlcyAoYXQgdGhlIGV4cGVuc2Ugb2YKLSAqIHNwZWVkKS4gIHtAY29kZSBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUV9IGlzIGJlc3Qgd2hlbiB5b3Ugb25seSBoYXZlIGEKLSAqIHNtYWxsIG51bWJlciBvZiBtZXNzYWdlIHR5cGVzIGxpbmtlZCBpbnRvIHlvdXIgYmluYXJ5LCBpbiB3aGljaCBjYXNlIHRoZQotICogc2l6ZSBvZiB0aGUgcHJvdG9jb2wgYnVmZmVycyBydW50aW1lIGl0c2VsZiBpcyB0aGUgYmlnZ2VzdCBwcm9ibGVtLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpdGUgZXh0ZW5kcyBNZXNzYWdlTGl0ZU9yQnVpbGRlciB7Ci0KLQotICAvKioKLSAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAgVGhpcyBkb2VzIG5vdAotICAgKiBmbHVzaCBvciBjbG9zZSB0aGUgc3RyZWFtLgotICAgKi8KLSAgdm9pZCB3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBtZXNzYWdlLiAgVGhlIHJlc3VsdAotICAgKiBpcyBvbmx5IGNvbXB1dGVkIG9uIHRoZSBmaXJzdCBjYWxsIGFuZCBtZW1vaXplZCBhZnRlciB0aGF0LgotICAgKi8KLSAgaW50IGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0KLQotICAvKioKLSAgICogR2V0cyB0aGUgcGFyc2VyIGZvciBhIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG1lc3NhZ2UuCi0gICAqLwotICBQYXJzZXI8PyBleHRlbmRzIE1lc3NhZ2VMaXRlPiBnZXRQYXJzZXJGb3JUeXBlKCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcy4KLQotICAvKioKLSAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHtAY29kZSBCeXRlU3RyaW5nfSBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcwotICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZAotICAgKiB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KLSAgICovCi0gIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCk7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSB7QGNvZGUgYnl0ZX0gYXJyYXkgYW5kIHJldHVybnMgaXQuICBUaGlzIGlzCi0gICAqIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kCi0gICAqIHtAbGluayAjd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LgotICAgKi8KLSAgYnl0ZVtdIHRvQnl0ZUFycmF5KCk7Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgYW5kIHdyaXRlcyBpdCB0byB7QGNvZGUgb3V0cHV0fS4gIFRoaXMgaXMganVzdCBhCi0gICAqIHRyaXZpYWwgd3JhcHBlciBhcm91bmQge0BsaW5rICN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uICBUaGlzIGRvZXMKLSAgICogbm90IGZsdXNoIG9yIGNsb3NlIHRoZSBzdHJlYW0uCi0gICAqIDxwPgotICAgKiBOT1RFOiAgUHJvdG9jb2wgQnVmZmVycyBhcmUgbm90IHNlbGYtZGVsaW1pdGluZy4gIFRoZXJlZm9yZSwgaWYgeW91IHdyaXRlCi0gICAqIGFueSBtb3JlIGRhdGEgdG8gdGhlIHN0cmVhbSBhZnRlciB0aGUgbWVzc2FnZSwgeW91IG11c3Qgc29tZWhvdyBlbnN1cmUKLSAgICogdGhhdCB0aGUgcGFyc2VyIG9uIHRoZSByZWNlaXZpbmcgZW5kIGRvZXMgbm90IGludGVycHJldCB0aGlzIGFzIGJlaW5nCi0gICAqIHBhcnQgb2YgdGhlIHByb3RvY29sIG1lc3NhZ2UuICBUaGlzIGNhbiBiZSBkb25lIGUuZy4gYnkgd3JpdGluZyB0aGUgc2l6ZQotICAgKiBvZiB0aGUgbWVzc2FnZSBiZWZvcmUgdGhlIGRhdGEsIHRoZW4gbWFraW5nIHN1cmUgdG8gbGltaXQgdGhlIGlucHV0IHRvCi0gICAqIHRoYXQgc2l6ZSBvbiB0aGUgcmVjZWl2aW5nIGVuZCAoZS5nLiBieSB3cmFwcGluZyB0aGUgSW5wdXRTdHJlYW0gaW4gb25lCi0gICAqIHdoaWNoIGxpbWl0cyB0aGUgaW5wdXQpLiAgQWx0ZXJuYXRpdmVseSwganVzdCB1c2UKLSAgICoge0BsaW5rICN3cml0ZURlbGltaXRlZFRvKE91dHB1dFN0cmVhbSl9LgotICAgKi8KLSAgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI3dyaXRlVG8oT3V0cHV0U3RyZWFtKX0sIGJ1dCB3cml0ZXMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UKLSAgICogYXMgYSB2YXJpbnQgYmVmb3JlIHdyaXRpbmcgdGhlIGRhdGEuICBUaGlzIGFsbG93cyBtb3JlIGRhdGEgdG8gYmUgd3JpdHRlbgotICAgKiB0byB0aGUgc3RyZWFtIGFmdGVyIHRoZSBtZXNzYWdlIHdpdGhvdXQgdGhlIG5lZWQgdG8gZGVsaW1pdCB0aGUgbWVzc2FnZQotICAgKiBkYXRhIHlvdXJzZWxmLiAgVXNlIHtAbGluayBCdWlsZGVyI21lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSl9IChvcgotICAgKiB0aGUgc3RhdGljIG1ldGhvZCB7QGNvZGUgWW91ck1lc3NhZ2VUeXBlLnBhcnNlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSl9KQotICAgKiB0byBwYXJzZSBtZXNzYWdlcyB3cml0dGVuIGJ5IHRoaXMgbWV0aG9kLgotICAgKi8KLSAgdm9pZCB3cml0ZURlbGltaXRlZFRvKE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIEJ1aWxkZXJzCi0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgYnVpbGRlciBmb3IgYSBtZXNzYWdlIG9mIHRoZSBzYW1lIHR5cGUgYXMgdGhpcyBtZXNzYWdlLgotICAgKi8KLSAgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgYnVpbGRlciBpbml0aWFsaXplZCB3aXRoIHRoZSBjdXJyZW50IG1lc3NhZ2UuICBVc2UgdGhpcyB0bwotICAgKiBkZXJpdmUgYSBuZXcgbWVzc2FnZSBmcm9tIHRoZSBjdXJyZW50IG9uZS4KLSAgICovCi0gIEJ1aWxkZXIgdG9CdWlsZGVyKCk7Ci0KLSAgLyoqCi0gICAqIEFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIGJ1aWxkZXJzLgotICAgKi8KLSAgaW50ZXJmYWNlIEJ1aWxkZXIgZXh0ZW5kcyBNZXNzYWdlTGl0ZU9yQnVpbGRlciwgQ2xvbmVhYmxlIHsKLSAgICAvKiogUmVzZXRzIGFsbCBmaWVsZHMgdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuICovCi0gICAgQnVpbGRlciBjbGVhcigpOwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyB0aGUgbWVzc2FnZSBiYXNlZCBvbiB0aGUgc3RhdGUgb2YgdGhlIEJ1aWxkZXIuIFN1YnNlcXVlbnQKLSAgICAgKiBjaGFuZ2VzIHRvIHRoZSBCdWlsZGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgcmV0dXJuZWQgbWVzc2FnZS4KLSAgICAgKiBAdGhyb3dzIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIFRoZSBtZXNzYWdlIGlzIG1pc3Npbmcgb25lIG9yIG1vcmUKLSAgICAgKiAgICAgICAgIHJlcXVpcmVkIGZpZWxkcyAoaS5lLiB7QGxpbmsgI2lzSW5pdGlhbGl6ZWQoKX0gcmV0dXJucyBmYWxzZSkuCi0gICAgICogICAgICAgICBVc2Uge0BsaW5rICNidWlsZFBhcnRpYWwoKX0gdG8gYnlwYXNzIHRoaXMgY2hlY2suCi0gICAgICovCi0gICAgTWVzc2FnZUxpdGUgYnVpbGQoKTsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rICNidWlsZCgpfSwgYnV0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZQotICAgICAqIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiAgSW5zdGVhZCwgYSBwYXJ0aWFsIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCi0gICAgICogU3Vic2VxdWVudCBjaGFuZ2VzIHRvIHRoZSBCdWlsZGVyIHdpbGwgbm90IGFmZmVjdCB0aGUgcmV0dXJuZWQgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBNZXNzYWdlTGl0ZSBidWlsZFBhcnRpYWwoKTsKLQotICAgIC8qKgotICAgICAqIENsb25lcyB0aGUgQnVpbGRlci4KLSAgICAgKiBAc2VlIE9iamVjdCNjbG9uZSgpCi0gICAgICovCi0gICAgQnVpbGRlciBjbG9uZSgpOwotCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGEgbWVzc2FnZSBvZiB0aGlzIHR5cGUgZnJvbSB0aGUgaW5wdXQgYW5kIG1lcmdlcyBpdCB3aXRoIHRoaXMKLSAgICAgKiBtZXNzYWdlLgotICAgICAqCi0gICAgICogPHA+V2FybmluZzogIFRoaXMgZG9lcyBub3QgdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCBpbgotICAgICAqIHRoZSBpbnB1dCBtZXNzYWdlLiAgSWYgeW91IGNhbGwge0BsaW5rICNidWlsZCgpfSB3aXRob3V0IHNldHRpbmcgYWxsCi0gICAgICogcmVxdWlyZWQgZmllbGRzLCBpdCB3aWxsIHRocm93IGFuIHtAbGluayBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbn0sCi0gICAgICogd2hpY2ggaXMgYSB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gYW5kIHRodXMgbWlnaHQgbm90IGJlIGNhdWdodC4gIFRoZXJlCi0gICAgICogYXJlIGEgZmV3IGdvb2Qgd2F5cyB0byBkZWFsIHdpdGggdGhpczoKLSAgICAgKiA8dWw+Ci0gICAgICogICA8bGk+Q2FsbCB7QGxpbmsgI2lzSW5pdGlhbGl6ZWQoKX0gdG8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcwotICAgICAqICAgICAgIGFyZSBzZXQgYmVmb3JlIGJ1aWxkaW5nLgotICAgICAqICAgPGxpPlVzZSB7QGNvZGUgYnVpbGRQYXJ0aWFsKCl9IHRvIGJ1aWxkLCB3aGljaCBpZ25vcmVzIG1pc3NpbmcKLSAgICAgKiAgICAgICByZXF1aXJlZCBmaWVsZHMuCi0gICAgICogPC91bD4KLSAgICAgKgotICAgICAqIDxwPk5vdGU6ICBUaGUgY2FsbGVyIHNob3VsZCBjYWxsCi0gICAgICoge0BsaW5rIENvZGVkSW5wdXRTdHJlYW0jY2hlY2tMYXN0VGFnV2FzKGludCl9IGFmdGVyIGNhbGxpbmcgdGhpcyB0bwotICAgICAqIHZlcmlmeSB0aGF0IHRoZSBsYXN0IHRhZyBzZWVuIHdhcyB0aGUgYXBwcm9wcmlhdGUgZW5kLWdyb3VwIHRhZywKLSAgICAgKiBvciB6ZXJvIGZvciBFT0YuCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgQnVpbGRlciNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LCBidXQgYWxzbwotICAgICAqIHBhcnNlcyBleHRlbnNpb25zLiAgVGhlIGV4dGVuc2lvbnMgdGhhdCB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIHBhcnNlCi0gICAgICogbXVzdCBiZSByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uICBFeHRlbnNpb25zIG5vdCBpbgotICAgICAqIHRoZSByZWdpc3RyeSB3aWxsIGJlIHRyZWF0ZWQgYXMgdW5rbm93biBmaWVsZHMuCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcy4KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKEJ5dGVTdHJpbmcgZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0sRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBCdWlsZGVyIG1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uICBOb3RlIHRoYXQgdGhpcyBtZXRob2QgYWx3YXlzCi0gICAgICogcmVhZHMgdGhlIDxpPmVudGlyZTwvaT4gaW5wdXQgKHVubGVzcyBpdCB0aHJvd3MgYW4gZXhjZXB0aW9uKS4gIElmIHlvdQotICAgICAqIHdhbnQgaXQgdG8gc3RvcCBlYXJsaWVyLCB5b3Ugd2lsbCBuZWVkIHRvIHdyYXAgeW91ciBpbnB1dCBpbiBzb21lCi0gICAgICogd3JhcHBlciBzdHJlYW0gdGhhdCBsaW1pdHMgcmVhZGluZy4gIE9yLCB1c2UKLSAgICAgKiB7QGxpbmsgTWVzc2FnZUxpdGUjd3JpdGVEZWxpbWl0ZWRUbyhPdXRwdXRTdHJlYW0pfSB0byB3cml0ZSB5b3VyIG1lc3NhZ2UKLSAgICAgKiBhbmQge0BsaW5rICNtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0pfSB0byByZWFkIGl0LgotICAgICAqIDxwPgotICAgICAqIERlc3BpdGUgdXN1YWxseSByZWFkaW5nIHRoZSBlbnRpcmUgaW5wdXQsIHRoaXMgZG9lcyBub3QgY2xvc2UgdGhlIHN0cmVhbS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICAKLSAgICAvKioKLSAgICAgKiBNZXJnZSB7QGNvZGUgb3RoZXJ9IGludG8gdGhlIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICB7QGNvZGUgb3RoZXJ9IG11c3QKLSAgICAgKiBoYXZlIHRoZSBleGFjdCBzYW1lIHR5cGUgYXMge0Bjb2RlIHRoaXN9IChpLmUuCi0gICAgICoge0Bjb2RlIGdldENsYXNzKCkuZXF1YWxzKGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKS5nZXRDbGFzcygpKX0pLgotICAgICAqCi0gICAgICogTWVyZ2luZyBvY2N1cnMgYXMgZm9sbG93cy4gIEZvciBlYWNoIGZpZWxkOjxicj4KLSAgICAgKiAqIEZvciBzaW5ndWxhciBwcmltaXRpdmUgZmllbGRzLCBpZiB0aGUgZmllbGQgaXMgc2V0IGluIHtAY29kZSBvdGhlcn0sCi0gICAgICogICB0aGVuIHtAY29kZSBvdGhlcn0ncyB2YWx1ZSBvdmVyd3JpdGVzIHRoZSB2YWx1ZSBpbiB0aGlzIG1lc3NhZ2UuPGJyPgotICAgICAqICogRm9yIHNpbmd1bGFyIG1lc3NhZ2UgZmllbGRzLCBpZiB0aGUgZmllbGQgaXMgc2V0IGluIHtAY29kZSBvdGhlcn0sCi0gICAgICogICBpdCBpcyBtZXJnZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBzdWItbWVzc2FnZSBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKiAgIHVzaW5nIHRoZSBzYW1lIG1lcmdpbmcgcnVsZXMuPGJyPgotICAgICAqICogRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIGVsZW1lbnRzIGluIHtAY29kZSBvdGhlcn0gYXJlIGNvbmNhdGVuYXRlZAotICAgICAqICAgd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhpcyBtZXNzYWdlLgotICAgICAqICogRm9yIG9uZW9mIGdyb3VwcywgaWYgdGhlIG90aGVyIG1lc3NhZ2UgaGFzIG9uZSBvZiB0aGUgZmllbGRzIHNldCwKLSAgICAgKiAgIHRoZSBncm91cCBvZiB0aGlzIG1lc3NhZ2UgaXMgY2xlYXJlZCBhbmQgcmVwbGFjZWQgYnkgdGhlIGZpZWxkCi0gICAgICogICBvZiB0aGUgb3RoZXIgbWVzc2FnZSwgc28gdGhhdCB0aGUgb25lb2YgY29uc3RyYWludCBpcyBwcmVzZXJ2ZWQuCi0gICAgICoKLSAgICAgKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIHtAY29kZSBNZXNzYWdlOjpNZXJnZUZyb219IG1ldGhvZCBpbiBDKysuCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oTWVzc2FnZUxpdGUgb3RoZXIpOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI21lcmdlRnJvbShJbnB1dFN0cmVhbSl9LCBidXQgZG9lcyBub3QgcmVhZCB1bnRpbCBFT0YuCi0gICAgICogSW5zdGVhZCwgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgKGVuY29kZWQgYXMgYSB2YXJpbnQpIGlzIHJlYWQgZmlyc3QsCi0gICAgICogdGhlbiB0aGUgbWVzc2FnZSBkYXRhLiAgVXNlCi0gICAgICoge0BsaW5rIE1lc3NhZ2VMaXRlI3dyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtKX0gdG8gd3JpdGUgbWVzc2FnZXMgaW4KLSAgICAgKiB0aGlzIGZvcm1hdC4KLSAgICAgKgotICAgICAqIEByZXR1cm4gVHJ1ZSBpZiBzdWNjZXNzZnVsLCBvciBmYWxzZSBpZiB0aGUgc3RyZWFtIGlzIGF0IEVPRiB3aGVuIHRoZQotICAgICAqICAgICAgICAgbWV0aG9kIHN0YXJ0cy4gIEFueSBvdGhlciBlcnJvciAoaW5jbHVkaW5nIHJlYWNoaW5nIEVPRiBkdXJpbmcKLSAgICAgKiAgICAgICAgIHBhcnNpbmcpIHdpbGwgY2F1c2UgYW4gZXhjZXB0aW9uIHRvIGJlIHRocm93bi4KLSAgICAgKi8KLSAgICBib29sZWFuIG1lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0gYnV0IHN1cHBvcnRpbmcgZXh0ZW5zaW9ucy4KLSAgICAgKi8KLSAgICBib29sZWFuIG1lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlT3JCdWlsZGVyLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlT3JCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxODM4NmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZU9yQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgbWV0aG9kcyBjb21tb24gdG8ge0BsaW5rIE1lc3NhZ2VMaXRlfQotICogYW5kIHtAbGluayBNZXNzYWdlTGl0ZS5CdWlsZGVyfSB0byBwcm92aWRlIHR5cGUgZXF1aXZhbGVuY3kuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpdGVPckJ1aWxkZXIgewotICAvKioKLSAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIHdpdGggbm8gZmllbGRzIHNldC4gQmVjYXVzZSBubyBmaWVsZHMgYXJlIHNldCwKLSAgICogYWxsIGdldHRlcnMgZm9yIHNpbmd1bGFyIGZpZWxkcyB3aWxsIHJldHVybiBkZWZhdWx0IHZhbHVlcyBhbmQgcmVwZWF0ZWQKLSAgICogZmllbGRzIHdpbGwgYXBwZWFyIGVtcHR5LgotICAgKiBUaGlzIG1heSBvciBtYXkgbm90IGJlIGEgc2luZ2xldG9uLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlCi0gICAqIHtAY29kZSBnZXREZWZhdWx0SW5zdGFuY2UoKX0gbWV0aG9kIG9mIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgaW4gdGhhdAotICAgKiB0aGlzIG1ldGhvZCBpcyBhbiBhYnN0cmFjdCBtZXRob2Qgb2YgdGhlIHtAY29kZSBNZXNzYWdlTGl0ZX0gaW50ZXJmYWNlCi0gICAqIHdoZXJlYXMge0Bjb2RlIGdldERlZmF1bHRJbnN0YW5jZSgpfSBpcyBhIHN0YXRpYyBtZXRob2Qgb2YgYSBzcGVjaWZpYwotICAgKiBjbGFzcy4gIFRoZXkgcmV0dXJuIHRoZSBzYW1lIHRoaW5nLgotICAgKi8KLSAgTWVzc2FnZUxpdGUgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhbmQgYWxsIGVtYmVkZGVkCi0gICAqIG1lc3NhZ2VzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICoKLSAgICogPHA+U2VlIGFsc286IHtAbGluayBNZXNzYWdlT3JCdWlsZGVyI2dldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKX0KLSAgICovCi0gIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpOwotCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlVG9TdHJpbmcuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGVUb1N0cmluZy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0Mzg0NzY1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGVUb1N0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjM5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoqCi0gKiBIZWxwcyBnZW5lcmF0ZSB7QGxpbmsgU3RyaW5nfSByZXByZXNlbnRhdGlvbnMgb2Yge0BsaW5rIE1lc3NhZ2VMaXRlfSBwcm90b3MuCi0gKi8KLS8vIFRPRE8oZHdlaXMpOiBGaXggbWFwIGZpZWxkcy4KLWZpbmFsIGNsYXNzIE1lc3NhZ2VMaXRlVG9TdHJpbmcgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBMSVNUX1NVRkZJWCA9ICJMaXN0IjsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEJVSUxERVJfTElTVF9TVUZGSVggPSAiT3JCdWlsZGVyTGlzdCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBCWVRFU19TVUZGSVggPSAiQnl0ZXMiOwotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSB7QGxpbmsgU3RyaW5nfSByZXByZXNlbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1lc3NhZ2VMaXRlfSBvYmplY3QuICBUaGUgZmlyc3QgbGluZSBvZgotICAgKiB0aGUge0Bjb2RlIFN0cmluZ30gcmVwcmVzZW50YXRpb24gcmVwcmVzZW50YXRpb24gaW5jbHVkZXMgYSBjb21tZW50IHN0cmluZyB0byB1bmlxdWVseSBpZGVudGlmeQotICAgKiB0aGUgb2JqY2V0IGluc3RhbmNlLiBUaGlzIGFjdHMgYXMgYW4gaW5kaWNhdG9yIHRoYXQgdGhpcyBzaG91bGQgbm90IGJlIHJlbGllZCBvbiBmb3IKLSAgICogY29tcGFyaXNvbnMuCi0gICAqCi0gICAqIDxwPkZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoTWVzc2FnZUxpdGUgbWVzc2FnZUxpdGUsIFN0cmluZyBjb21tZW50U3RyaW5nKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBidWZmZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIGJ1ZmZlci5hcHBlbmQoIiMgIikuYXBwZW5kKGNvbW1lbnRTdHJpbmcpOwotICAgIHJlZmxlY3RpdmVQcmludFdpdGhJbmRlbnQobWVzc2FnZUxpdGUsIGJ1ZmZlciwgMCk7Ci0gICAgcmV0dXJuIGJ1ZmZlci50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZmxlY3RpdmVseSBwcmludHMgdGhlIHtAbGluayBNZXNzYWdlTGl0ZX0gdG8gdGhlIGJ1ZmZlciBhdCBnaXZlbiB7QGNvZGUgaW5kZW50fSBsZXZlbC4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvCi0gICAqIEBwYXJhbSBpbmRlbnQgdGhlIG51bWJlciBvZiBzcGFjZXMgdG8gaW5kZW50IHRoZSBwcm90byBieQotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCByZWZsZWN0aXZlUHJpbnRXaXRoSW5kZW50KAotICAgICAgTWVzc2FnZUxpdGUgbWVzc2FnZUxpdGUsIFN0cmluZ0J1aWxkZXIgYnVmZmVyLCBpbnQgaW5kZW50KSB7Ci0gICAgLy8gQnVpbGQgYSBtYXAgb2YgbWV0aG9kIG5hbWUgdG8gbWV0aG9kLiBXZSdyZSBsb29raW5nIGZvciBtZXRob2RzIGxpa2UgZ2V0Rm9vKCksIGhhc0ZvbygpLCBhbmQKLSAgICAvLyBnZXRGb29MaXN0KCkgd2hpY2ggbWlnaHQgYmUgdXNlZnVsIGZvciBidWlsZGluZyBhbiBvYmplY3QncyBzdHJpbmcgcmVwcmVzZW50YXRpb24uCi0gICAgTWFwPFN0cmluZywgTWV0aG9kPiBuYW1lVG9Ob0FyZ01ldGhvZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgTWV0aG9kPigpOwotICAgIE1hcDxTdHJpbmcsIE1ldGhvZD4gbmFtZVRvTWV0aG9kID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBNZXRob2Q+KCk7Ci0gICAgU2V0PFN0cmluZz4gZ2V0dGVycyA9IG5ldyBUcmVlU2V0PFN0cmluZz4oKTsKLSAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBtZXNzYWdlTGl0ZS5nZXRDbGFzcygpLmdldERlY2xhcmVkTWV0aG9kcygpKSB7Ci0gICAgICBuYW1lVG9NZXRob2QucHV0KG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZCk7Ci0gICAgICBpZiAobWV0aG9kLmdldFBhcmFtZXRlclR5cGVzKCkubGVuZ3RoID09IDApIHsKLSAgICAgICAgbmFtZVRvTm9BcmdNZXRob2QucHV0KG1ldGhvZC5nZXROYW1lKCksIG1ldGhvZCk7Ci0KLSAgICAgICAgaWYgKG1ldGhvZC5nZXROYW1lKCkuc3RhcnRzV2l0aCgiZ2V0IikpIHsKLSAgICAgICAgICBnZXR0ZXJzLmFkZChtZXRob2QuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGZvciAoU3RyaW5nIGdldHRlciA6IGdldHRlcnMpIHsKLSAgICAgIFN0cmluZyBzdWZmaXggPSBnZXR0ZXIucmVwbGFjZUZpcnN0KCJnZXQiLCAiIik7Ci0gICAgICBpZiAoc3VmZml4LmVuZHNXaXRoKExJU1RfU1VGRklYKSAmJiAhc3VmZml4LmVuZHNXaXRoKEJVSUxERVJfTElTVF9TVUZGSVgpKSB7Ci0gICAgICAgIFN0cmluZyBjYW1lbENhc2UgPSBzdWZmaXguc3Vic3RyaW5nKDAsIDEpLnRvTG93ZXJDYXNlKCkKLSAgICAgICAgICAgICsgc3VmZml4LnN1YnN0cmluZygxLCBzdWZmaXgubGVuZ3RoKCkgLSBMSVNUX1NVRkZJWC5sZW5ndGgoKSk7Ci0gICAgICAgIC8vIFRyeSB0byByZWZsZWN0aXZlbHkgZ2V0IHRoZSB2YWx1ZSBhbmQgdG9TdHJpbmcoKSB0aGUgZmllbGQgYXMgaWYgaXQgd2VyZSByZXBlYXRlZC4gVGhpcwotICAgICAgICAvLyBvbmx5IHdvcmtzIGlmIHRoZSBtZXRob2QgbmFtZXMgaGF2ZSBub3QgYmUgcHJvZ3VhcmRlZCBvdXQgb3IgcmVuYW1lZC4KLSAgICAgICAgTWV0aG9kIGxpc3RNZXRob2QgPSBuYW1lVG9Ob0FyZ01ldGhvZC5nZXQoImdldCIgKyBzdWZmaXgpOwotICAgICAgICBpZiAobGlzdE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgICAgcHJpbnRGaWVsZCgKLSAgICAgICAgICAgICAgYnVmZmVyLAotICAgICAgICAgICAgICBpbmRlbnQsCi0gICAgICAgICAgICAgIGNhbWVsQ2FzZVRvU25ha2VDYXNlKGNhbWVsQ2FzZSksCi0gICAgICAgICAgICAgIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLmludm9rZU9yRGllKGxpc3RNZXRob2QsIG1lc3NhZ2VMaXRlKSk7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgTWV0aG9kIHNldHRlciA9IG5hbWVUb01ldGhvZC5nZXQoInNldCIgKyBzdWZmaXgpOwotICAgICAgaWYgKHNldHRlciA9PSBudWxsKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKHN1ZmZpeC5lbmRzV2l0aChCWVRFU19TVUZGSVgpCi0gICAgICAgICAgJiYgbmFtZVRvTm9BcmdNZXRob2QuY29udGFpbnNLZXkoCi0gICAgICAgICAgICAgICJnZXQiICsgc3VmZml4LnN1YnN0cmluZygwLCBzdWZmaXgubGVuZ3RoKCkgLSAiQnl0ZXMiLmxlbmd0aCgpKSkpIHsKLSAgICAgICAgLy8gSGV1cmlzdGljIHRvIHNraXAgYnl0ZXMgYmFzZWQgYWNjZXNzb3JzIGZvciBzdHJpbmcgZmllbGRzLgotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIAotICAgICAgU3RyaW5nIGNhbWVsQ2FzZSA9IHN1ZmZpeC5zdWJzdHJpbmcoMCwgMSkudG9Mb3dlckNhc2UoKSArIHN1ZmZpeC5zdWJzdHJpbmcoMSk7Ci0KLSAgICAgIC8vIFRyeSB0byByZWZsZWN0aXZlbHkgZ2V0IHRoZSB2YWx1ZSBhbmQgdG9TdHJpbmcoKSB0aGUgZmllbGQgYXMgaWYgaXQgd2VyZSBvcHRpb25hbC4gVGhpcwotICAgICAgLy8gb25seSB3b3JrcyBpZiB0aGUgbWV0aG9kIG5hbWVzIGhhdmUgbm90IGJlIHByb2d1YXJkZWQgb3V0IG9yIHJlbmFtZWQuCi0gICAgICBNZXRob2QgZ2V0TWV0aG9kID0gbmFtZVRvTm9BcmdNZXRob2QuZ2V0KCJnZXQiICsgc3VmZml4KTsKLSAgICAgIE1ldGhvZCBoYXNNZXRob2QgPSBuYW1lVG9Ob0FyZ01ldGhvZC5nZXQoImhhcyIgKyBzdWZmaXgpOwotICAgICAgLy8gVE9ETyhkd2Vpcyk6IEZpeCBwcm90bzMgc2VtYW50aWNzLgotICAgICAgaWYgKGdldE1ldGhvZCAhPSBudWxsKSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IEdlbmVyYXRlZE1lc3NhZ2VMaXRlLmludm9rZU9yRGllKGdldE1ldGhvZCwgbWVzc2FnZUxpdGUpOwotICAgICAgICBmaW5hbCBib29sZWFuIGhhc1ZhbHVlID0gaGFzTWV0aG9kID09IG51bGwKLSAgICAgICAgICAgID8gIWlzRGVmYXVsdFZhbHVlKHZhbHVlKQotICAgICAgICAgICAgOiAoQm9vbGVhbikgR2VuZXJhdGVkTWVzc2FnZUxpdGUuaW52b2tlT3JEaWUoaGFzTWV0aG9kLCBtZXNzYWdlTGl0ZSk7Ci0gICAgICAgICAvLyBUT0RPKGR3ZWlzKTogVGhpcyBkb2Vzbid0IHN0b3AgcHJpbnRpbmcgb25lb2YgY2FzZSB0d2ljZTogdmFsdWUgYW5kIGVudW0gc3R5bGUuCi0gICAgICAgIGlmIChoYXNWYWx1ZSkgewotICAgICAgICAgIHByaW50RmllbGQoCi0gICAgICAgICAgICAgIGJ1ZmZlciwKLSAgICAgICAgICAgICAgaW5kZW50LAotICAgICAgICAgICAgICBjYW1lbENhc2VUb1NuYWtlQ2FzZShjYW1lbENhc2UpLAotICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKG1lc3NhZ2VMaXRlIGluc3RhbmNlb2YgR2VuZXJhdGVkTWVzc2FnZUxpdGUuRXh0ZW5kYWJsZU1lc3NhZ2UpIHsKLSAgICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5FeHRlbnNpb25EZXNjcmlwdG9yLCBPYmplY3Q+PiBpdGVyID0KLSAgICAgICAgICAoKEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkV4dGVuZGFibGVNZXNzYWdlPD8sID8+KSBtZXNzYWdlTGl0ZSkuZXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotICAgICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgIE1hcC5FbnRyeTxHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5FeHRlbnNpb25EZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIHByaW50RmllbGQoYnVmZmVyLCBpbmRlbnQsICJbIiArIGVudHJ5LmdldEtleSgpLmdldE51bWJlcigpICsgIl0iLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoKChHZW5lcmF0ZWRNZXNzYWdlTGl0ZTw/LCA/PikgbWVzc2FnZUxpdGUpLnVua25vd25GaWVsZHMgIT0gbnVsbCkgewotICAgICAgKChHZW5lcmF0ZWRNZXNzYWdlTGl0ZTw/LCA/PikgbWVzc2FnZUxpdGUpLnVua25vd25GaWVsZHMucHJpbnRXaXRoSW5kZW50KGJ1ZmZlciwgaW5kZW50KTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNEZWZhdWx0VmFsdWUoT2JqZWN0IG8pIHsKLSAgICBpZiAobyBpbnN0YW5jZW9mIEJvb2xlYW4pIHsKLSAgICAgIHJldHVybiAhKChCb29sZWFuKSBvKTsKLSAgICB9Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBJbnRlZ2VyKSB7Ci0gICAgICByZXR1cm4gKChJbnRlZ2VyKSBvKSA9PSAwOwotICAgIH0KLSAgICBpZiAobyBpbnN0YW5jZW9mIEZsb2F0KSB7Ci0gICAgICByZXR1cm4gKChGbG9hdCkgbykgPT0gMGY7Ci0gICAgfQotICAgIGlmIChvIGluc3RhbmNlb2YgRG91YmxlKSB7Ci0gICAgICByZXR1cm4gKChEb3VibGUpIG8pID09IDBkOwotICAgIH0KLSAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgcmV0dXJuIG8uZXF1YWxzKCIiKTsKLSAgICB9Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBCeXRlU3RyaW5nKSB7Ci0gICAgICByZXR1cm4gby5lcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSk7Ci0gICAgfQotICAgIGlmIChvIGluc3RhbmNlb2YgTWVzc2FnZUxpdGUpIHsgLy8gQ2FuIGhhcHBlbiBpbiBvbmVvZnMuCi0gICAgICByZXR1cm4gbyA9PSAoKE1lc3NhZ2VMaXRlKSBvKS5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCk7Ci0gICAgfQotICAgIGlmIChvIGluc3RhbmNlb2YgamF2YS5sYW5nLkVudW08Pz4pIHsgLy8gQ2F0Y2hlcyBvbmVvZiBlbnVtcy4KLSAgICAgIHJldHVybiAoKGphdmEubGFuZy5FbnVtPD8+KSBvKS5vcmRpbmFsKCkgPT0gMDsKLSAgICB9Ci0gICAgCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyoqCi0gICAqIEZvcm1hdHMgYSB0ZXh0IHByb3RvIGZpZWxkLgotICAgKgotICAgKiA8cD5Gb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byB3cml0ZSB0bwotICAgKiBAcGFyYW0gaW5kZW50IHRoZSBudW1iZXIgb2Ygc3BhY2VzIHRoZSBwcm90byBzaG91bGQgYmUgaW5kZW50ZWQgYnkKLSAgICogQHBhcmFtIG5hbWUgdGhlIGZpZWxkIG5hbWUgKGluIGxvd2VyIHVuZGVyc2NvcmUgY2FzZSkKLSAgICogQHBhcmFtIG9iamVjdCB0aGUgb2JqZWN0IHZhbHVlIG9mIHRoZSBmaWVsZAotICAgKi8KLSAgc3RhdGljIGZpbmFsIHZvaWQgcHJpbnRGaWVsZChTdHJpbmdCdWlsZGVyIGJ1ZmZlciwgaW50IGluZGVudCwgU3RyaW5nIG5hbWUsIE9iamVjdCBvYmplY3QpIHsKLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgTGlzdDw/PikgewotICAgICAgTGlzdDw/PiBsaXN0ID0gKExpc3Q8Pz4pIG9iamVjdDsKLSAgICAgIGZvciAoT2JqZWN0IGVudHJ5IDogbGlzdCkgewotICAgICAgICBwcmludEZpZWxkKGJ1ZmZlciwgaW5kZW50LCBuYW1lLCBlbnRyeSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgYnVmZmVyLmFwcGVuZCgnXG4nKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7Ci0gICAgICBidWZmZXIuYXBwZW5kKCcgJyk7Ci0gICAgfQotICAgIGJ1ZmZlci5hcHBlbmQobmFtZSk7Ci0KLSAgICBpZiAob2JqZWN0IGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICBidWZmZXIuYXBwZW5kKCI6IFwiIikuYXBwZW5kKFRleHRGb3JtYXRFc2NhcGVyLmVzY2FwZVRleHQoKFN0cmluZykgb2JqZWN0KSkuYXBwZW5kKCciJyk7Ci0gICAgfSBlbHNlIGlmIChvYmplY3QgaW5zdGFuY2VvZiBCeXRlU3RyaW5nKSB7Ci0gICAgICBidWZmZXIuYXBwZW5kKCI6IFwiIikuYXBwZW5kKFRleHRGb3JtYXRFc2NhcGVyLmVzY2FwZUJ5dGVzKChCeXRlU3RyaW5nKSBvYmplY3QpKS5hcHBlbmQoJyInKTsKLSAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIEdlbmVyYXRlZE1lc3NhZ2VMaXRlKSB7Ci0gICAgICBidWZmZXIuYXBwZW5kKCIgeyIpOwotICAgICAgcmVmbGVjdGl2ZVByaW50V2l0aEluZGVudCgoR2VuZXJhdGVkTWVzc2FnZUxpdGU8PywgPz4pIG9iamVjdCwgYnVmZmVyLCBpbmRlbnQgKyAyKTsKLSAgICAgIGJ1ZmZlci5hcHBlbmQoIlxuIik7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGluZGVudDsgaSsrKSB7Ci0gICAgICAgIGJ1ZmZlci5hcHBlbmQoJyAnKTsKLSAgICAgIH0KLSAgICAgIGJ1ZmZlci5hcHBlbmQoIn0iKTsKLSAgICB9IGVsc2UgewotICAgICAgYnVmZmVyLmFwcGVuZCgiOiAiKS5hcHBlbmQob2JqZWN0LnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZVRvU25ha2VDYXNlKFN0cmluZyBjYW1lbENhc2UpIHsKLSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY2FtZWxDYXNlLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgIGNoYXIgY2ggPSBjYW1lbENhc2UuY2hhckF0KGkpOwotICAgICAgaWYgKENoYXJhY3Rlci5pc1VwcGVyQ2FzZShjaCkpIHsKLSAgICAgICAgYnVpbGRlci5hcHBlbmQoIl8iKTsKLSAgICAgIH0KLSAgICAgIGJ1aWxkZXIuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjaCkpOwotICAgIH0KLSAgICByZXR1cm4gYnVpbGRlci50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VPckJ1aWxkZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZU9yQnVpbGRlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZTdkNzgyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZU9yQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEJhc2UgaW50ZXJmYWNlIGZvciBtZXRob2RzIGNvbW1vbiB0byB7QGxpbmsgTWVzc2FnZX0gYW5kCi0gKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSB0byBwcm92aWRlIHR5cGUgZXF1aXZhbGVuY3kuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZU9yQnVpbGRlciBleHRlbmRzIE1lc3NhZ2VMaXRlT3JCdWlsZGVyIHsKLQotICAvLyAoRnJvbSBNZXNzYWdlTGl0ZSwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZSBjb3ZhcmlhbmNlLikKLSAgQE92ZXJyaWRlCi0gIE1lc3NhZ2UgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgbGlzdCBvZiBmaWVsZCBwYXRocyAoZS5nLiAiZm9vLmJhci5iYXoiKSBvZiByZXF1aXJlZCBmaWVsZHMKLSAgICogd2hpY2ggYXJlIG5vdCBzZXQgaW4gdGhpcyBtZXNzYWdlLiAgWW91IHNob3VsZCBjYWxsCi0gICAqIHtAbGluayBNZXNzYWdlTGl0ZU9yQnVpbGRlciNpc0luaXRpYWxpemVkKCl9IGZpcnN0IHRvIGNoZWNrIGlmIHRoZXJlCi0gICAqIGFyZSBhbnkgbWlzc2luZyBmaWVsZHMsIGFzIHRoYXQgbWV0aG9kIGlzIGxpa2VseSB0byBiZSBtdWNoIGZhc3RlcgotICAgKiB0aGFuIHRoaXMgb25lIGV2ZW4gd2hlbiB0aGUgbWVzc2FnZSBpcyBmdWxseS1pbml0aWFsaXplZC4KLSAgICovCi0gIExpc3Q8U3RyaW5nPiBmaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyBhIGNvbW1hLWRlbGltaXRlZCBsaXN0IG9mIHJlcXVpcmVkIGZpZWxkcyB3aGljaCBhcmUgbm90IHNldAotICAgKiBpbiB0aGlzIG1lc3NhZ2Ugb2JqZWN0LiAgWW91IHNob3VsZCBjYWxsCi0gICAqIHtAbGluayBNZXNzYWdlTGl0ZU9yQnVpbGRlciNpc0luaXRpYWxpemVkKCl9IGZpcnN0IHRvIGNoZWNrIGlmIHRoZXJlCi0gICAqIGFyZSBhbnkgbWlzc2luZyBmaWVsZHMsIGFzIHRoYXQgbWV0aG9kIGlzIGxpa2VseSB0byBiZSBtdWNoIGZhc3RlcgotICAgKiB0aGFuIHRoaXMgb25lIGV2ZW4gd2hlbiB0aGUgbWVzc2FnZSBpcyBmdWxseS1pbml0aWFsaXplZC4KLSAgICovCi0gIFN0cmluZyBnZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWVzc2FnZSdzIHR5cGUncyBkZXNjcmlwdG9yLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlCi0gICAqIHtAY29kZSBnZXREZXNjcmlwdG9yKCl9IG1ldGhvZCBvZiBnZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGluIHRoYXQKLSAgICogdGhpcyBtZXRob2QgaXMgYW4gYWJzdHJhY3QgbWV0aG9kIG9mIHRoZSB7QGNvZGUgTWVzc2FnZX0gaW50ZXJmYWNlCi0gICAqIHdoZXJlYXMge0Bjb2RlIGdldERlc2NyaXB0b3IoKX0gaXMgYSBzdGF0aWMgbWV0aG9kIG9mIGEgc3BlY2lmaWMgY2xhc3MuCi0gICAqIFRoZXkgcmV0dXJuIHRoZSBzYW1lIHRoaW5nLgotICAgKi8KLSAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwgdGhlIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2Ugd2hpY2ggYXJlIHNldAotICAgKiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuICBBIHNpbmd1bGFyICgicmVxdWlyZWQiIG9yICJvcHRpb25hbCIpCi0gICAqIGZpZWxkIGlzIHNldCBpZmYgaGFzRmllbGQoKSByZXR1cm5zIHRydWUgZm9yIHRoYXQgZmllbGQuICBBICJyZXBlYXRlZCIKLSAgICogZmllbGQgaXMgc2V0IGlmZiBnZXRSZXBlYXRlZEZpZWxkQ291bnQoKSBpcyBncmVhdGVyIHRoYW4gemVyby4gIFRoZQotICAgKiB2YWx1ZXMgYXJlIGV4YWN0bHkgd2hhdCB3b3VsZCBiZSByZXR1cm5lZCBieSBjYWxsaW5nCi0gICAqIHtAbGluayAjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yIGVhY2ggZmllbGQuICBUaGUgbWFwCi0gICAqIGlzIGd1YXJhbnRlZWQgdG8gYmUgYSBzb3J0ZWQgbWFwLCBzbyBpdGVyYXRpbmcgb3ZlciBpdCB3aWxsIHJldHVybiBmaWVsZHMKLSAgICogaW4gb3JkZXIgYnkgZmllbGQgbnVtYmVyLgotICAgKiA8YnI+Ci0gICAqIElmIHRoaXMgaXMgZm9yIGEgYnVpbGRlciwgdGhlIHJldHVybmVkIG1hcCBtYXkgb3IgbWF5IG5vdCByZWZsZWN0IGZ1dHVyZQotICAgKiBjaGFuZ2VzIHRvIHRoZSBidWlsZGVyLiAgRWl0aGVyIHdheSwgdGhlIHJldHVybmVkIG1hcCBpcyBpdHNlbGYKLSAgICogdW5tb2RpZmlhYmxlLgotICAgKi8KLSAgTWFwPERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKTsKLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvbmVvZiBpcyBzZXQuCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmCi0gICAqICAgICAgICAgICB7QGNvZGUgb25lb2YuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KLSAgICovCi0gIGJvb2xlYW4gaGFzT25lb2YoRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIG9uZW9mKTsKLQotICAvKioKLSAgICogT2J0YWlucyB0aGUgRmllbGREZXNjcmlwdG9yIGlmIHRoZSBnaXZlbiBvbmVvZiBpcyBzZXQuIFJldHVybnMgbnVsbAotICAgKiBpZiBubyBmaWVsZCBpcyBzZXQuCi0gICAqLwotICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoCi0gICAgICBEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2YpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGZpZWxkIGlzIHNldC4gIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvCi0gICAqIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCAiaGFzIiBhY2Nlc3NvciBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQuCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIGZpZWxkLCBvcgotICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCi0gICAqLwotICBib29sZWFuIGhhc0ZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7Ci0KLSAgLyoqCi0gICAqIE9idGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCwgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMKLSAgICogbm90IHNldC4gIEZvciBwcmltaXRpdmUgZmllbGRzLCB0aGUgYm94ZWQgcHJpbWl0aXZlIHZhbHVlIGlzIHJldHVybmVkLgotICAgKiBGb3IgZW51bSBmaWVsZHMsIHRoZSBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuIEZvcgotICAgKiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlIGlzIHJldHVybmVkLiAgRm9yIHJlcGVhdGVkCi0gICAqIGZpZWxkcywgYSBqYXZhLnV0aWwuTGlzdCBpcyByZXR1cm5lZC4KLSAgICovCi0gIE9iamVjdCBnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4gIFRoaXMgaXMgZXhhY3RseQotICAgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCAiQ291bnQiIGFjY2Vzc29yIG1ldGhvZCBjb3JyZXNwb25kaW5nCi0gICAqIHRvIHRoZSBmaWVsZC4KLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIG5vdCBhIHJlcGVhdGVkIGZpZWxkLCBvcgotICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCi0gICAqLwotICBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLiAgRm9yIHByaW1pdGl2ZSBmaWVsZHMsIHRoZSBib3hlZAotICAgKiBwcmltaXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuICBGb3IgZW51bSBmaWVsZHMsIHRoZSBFbnVtVmFsdWVEZXNjcmlwdG9yCi0gICAqIGZvciB0aGUgdmFsdWUgaXMgcmV0dXJuZWQuIEZvciBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlCi0gICAqIGlzIHJldHVybmVkLgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCi0gICAqICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KLSAgICovCi0gIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KTsKLQotICAvKiogR2V0IHRoZSB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fSBmb3IgdGhpcyBtZXNzYWdlLiAqLwotICBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlUmVmbGVjdGlvbi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlUmVmbGVjdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Yjc5MWQ5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVJlZmxlY3Rpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBSZWZsZWN0aW9uIHV0aWxpdHkgbWV0aG9kcyBzaGFyZWQgYnkgYm90aCBtdXRhYmxlIGFuZCBpbW11dGFibGUgbWVzc2FnZXMuCi0gKgotICogQGF1dGhvciBsaXVqaXNpQGdvb2dsZS5jb20gKFBoZXJsIExpdSkKLSAqLwotY2xhc3MgTWVzc2FnZVJlZmxlY3Rpb24gewotCi0gIHN0YXRpYyB2b2lkIHdyaXRlTWVzc2FnZVRvKAotICAgICAgTWVzc2FnZSBtZXNzYWdlLAotICAgICAgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBmaWVsZHMsCi0gICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQsCi0gICAgICBib29sZWFuIGFsd2F5c1dyaXRlUmVxdWlyZWRGaWVsZHMpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGJvb2xlYW4gaXNNZXNzYWdlU2V0ID0KLSAgICAgICAgbWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpOwotICAgIGlmIChhbHdheXNXcml0ZVJlcXVpcmVkRmllbGRzKSB7Ci0gICAgICBmaWVsZHMgPSBuZXcgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4oZmllbGRzKTsKLSAgICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDoKLSAgICAgICAgICBtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RmllbGRzKCkpIHsKLSAgICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSAmJiAhZmllbGRzLmNvbnRhaW5zS2V5KGZpZWxkKSkgewotICAgICAgICAgIGZpZWxkcy5wdXQoZmllbGQsIG1lc3NhZ2UuZ2V0RmllbGQoZmllbGQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgotICAgICAgICBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKGlzTWVzc2FnZVNldCAmJiBmaWVsZC5pc0V4dGVuc2lvbigpICYmCi0gICAgICAgICAgZmllbGQuZ2V0VHlwZSgpID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgICAhZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGQuZ2V0TnVtYmVyKCksIChNZXNzYWdlKSB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBGaWVsZFNldC53cml0ZUZpZWxkKGZpZWxkLCB2YWx1ZSwgb3V0cHV0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9IG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpOwotICAgIGlmIChpc01lc3NhZ2VTZXQpIHsKLSAgICAgIHVua25vd25GaWVsZHMud3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1bmtub3duRmllbGRzLndyaXRlVG8ob3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICBzdGF0aWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKAotICAgICAgTWVzc2FnZSBtZXNzYWdlLAotICAgICAgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBmaWVsZHMpIHsKLSAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgZmluYWwgYm9vbGVhbiBpc01lc3NhZ2VTZXQgPQotICAgICAgICBtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCk7Ci0KLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgotICAgICAgICBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKGlzTWVzc2FnZVNldCAmJiBmaWVsZC5pc0V4dGVuc2lvbigpICYmCi0gICAgICAgICAgZmllbGQuZ2V0VHlwZSgpID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgICAhZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIHNpemUgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZU1lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAotICAgICAgICAgICAgZmllbGQuZ2V0TnVtYmVyKCksIChNZXNzYWdlKSB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzaXplICs9IEZpZWxkU2V0LmNvbXB1dGVGaWVsZFNpemUoZmllbGQsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9IG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpOwotICAgIGlmIChpc01lc3NhZ2VTZXQpIHsKLSAgICAgIHNpemUgKz0gdW5rbm93bkZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICBzdGF0aWMgU3RyaW5nIGRlbGltaXRXaXRoQ29tbWFzKExpc3Q8U3RyaW5nPiBwYXJ0cykgewotICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBmb3IgKFN0cmluZyBwYXJ0IDogcGFydHMpIHsKLSAgICAgIGlmIChyZXN1bHQubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoIiwgIik7Ci0gICAgICB9Ci0gICAgICByZXN1bHQuYXBwZW5kKHBhcnQpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZChNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAvLyBDaGVjayB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCi0gICAgZm9yIChmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQgOiBtZXNzYWdlCi0gICAgICAgIC5nZXREZXNjcmlwdG9yRm9yVHlwZSgpCi0gICAgICAgIC5nZXRGaWVsZHMoKSkgewotICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSkgewotICAgICAgICBpZiAoIW1lc3NhZ2UuaGFzRmllbGQoZmllbGQpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCi0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgbWVzc2FnZS5nZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICBmb3IgKGZpbmFsIE1lc3NhZ2UgZWxlbWVudAotICAgICAgICAgICAgICA6IChMaXN0PE1lc3NhZ2U+KSBlbnRyeS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKCEoKE1lc3NhZ2UpIGVudHJ5LmdldFZhbHVlKCkpLmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHN1Yk1lc3NhZ2VQcmVmaXgoZmluYWwgU3RyaW5nIHByZWZpeCwKLSAgICAgIGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgIGZpbmFsIGludCBpbmRleCkgewotICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIocHJlZml4KTsKLSAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgcmVzdWx0LmFwcGVuZCgnKCcpCi0gICAgICAgICAgLmFwcGVuZChmaWVsZC5nZXRGdWxsTmFtZSgpKQotICAgICAgICAgIC5hcHBlbmQoJyknKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0LmFwcGVuZChmaWVsZC5nZXROYW1lKCkpOwotICAgIH0KLSAgICBpZiAoaW5kZXggIT0gLTEpIHsKLSAgICAgIHJlc3VsdC5hcHBlbmQoJ1snKQotICAgICAgICAgIC5hcHBlbmQoaW5kZXgpCi0gICAgICAgICAgLmFwcGVuZCgnXScpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCcuJyk7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBmaW5kTWlzc2luZ0ZpZWxkcyhmaW5hbCBNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UsCi0gICAgICBmaW5hbCBTdHJpbmcgcHJlZml4LAotICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlc3VsdHMpIHsKLSAgICBmb3IgKGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCA6Ci0gICAgICAgIG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWVsZHMoKSkgewotICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSAmJiAhbWVzc2FnZS5oYXNGaWVsZChmaWVsZCkpIHsKLSAgICAgICAgcmVzdWx0cy5hZGQocHJlZml4ICsgZmllbGQuZ2V0TmFtZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZW50cnkgOgotICAgICAgICBtZXNzYWdlLmdldEFsbEZpZWxkcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgIGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LmdldEtleSgpOwotICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLQotICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgIGludCBpID0gMDsKLSAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHZhbHVlKSB7Ci0gICAgICAgICAgICBmaW5kTWlzc2luZ0ZpZWxkcygoTWVzc2FnZU9yQnVpbGRlcikgZWxlbWVudCwKLSAgICAgICAgICAgICAgICBzdWJNZXNzYWdlUHJlZml4KHByZWZpeCwgZmllbGQsIGkrKyksCi0gICAgICAgICAgICAgICAgcmVzdWx0cyk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChtZXNzYWdlLmhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgICAgZmluZE1pc3NpbmdGaWVsZHMoKE1lc3NhZ2VPckJ1aWxkZXIpIHZhbHVlLAotICAgICAgICAgICAgICAgIHN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgLTEpLAotICAgICAgICAgICAgICAgIHJlc3VsdHMpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQb3B1bGF0ZXMge0Bjb2RlIHRoaXMubWlzc2luZ0ZpZWxkc30gd2l0aCB0aGUgZnVsbCAicGF0aCIgb2YgZWFjaCBtaXNzaW5nCi0gICAqIHJlcXVpcmVkIGZpZWxkIGluIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgKi8KLSAgc3RhdGljIExpc3Q8U3RyaW5nPiBmaW5kTWlzc2luZ0ZpZWxkcygKLSAgICAgIGZpbmFsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIGZpbmFsIExpc3Q8U3RyaW5nPiByZXN1bHRzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgZmluZE1pc3NpbmdGaWVsZHMobWVzc2FnZSwgIiIsIHJlc3VsdHMpOwotICAgIHJldHVybiByZXN1bHRzOwotICB9Ci0KLSAgc3RhdGljIGludGVyZmFjZSBNZXJnZVRhcmdldCB7Ci0gICAgZW51bSBDb250YWluZXJUeXBlIHsKLSAgICAgIE1FU1NBR0UsIEVYVEVOU0lPTl9TRVQKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgdGFyZ2V0LgotICAgICAqLwotICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0KLSAgICBwdWJsaWMgQ29udGFpbmVyVHlwZSBnZXRDb250YWluZXJUeXBlKCk7Ci0KLSAgICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOYW1lKAotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIG5hbWUpOwotCi0gICAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZmluZEV4dGVuc2lvbkJ5TnVtYmVyKAotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBjb250YWluaW5nVHlwZSwKLSAgICAgICAgaW50IGZpZWxkTnVtYmVyKTsKLQotICAgIC8qKgotICAgICAqIE9idGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCwgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMgbm90Ci0gICAgICogc2V0LiAgRm9yIHByaW1pdGl2ZSBmaWVsZHMsIHRoZSBib3hlZCBwcmltaXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuIEZvcgotICAgICAqIGVudW0gZmllbGRzLCB0aGUgRW51bVZhbHVlRGVzY3JpcHRvciBmb3IgdGhlIHZhbHVlIGlzIHJldHVybmVkLiBGb3IKLSAgICAgKiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlIGlzIHJldHVybmVkLiAgRm9yIHJlcGVhdGVkCi0gICAgICogZmllbGRzLCBhIGphdmEudXRpbC5MaXN0IGlzIHJldHVybmVkLgotICAgICAqLwotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgc2V0LiAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8KLSAgICAgKiBjYWxsaW5nIHRoZSBnZW5lcmF0ZWQgImhhcyIgYWNjZXNzb3IgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIGEgcmVwZWF0ZWQgZmllbGQsIG9yIHtAY29kZQotICAgICAqICAgICBmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgotICAgICAqLwotICAgIGJvb2xlYW4gaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgYSBmaWVsZCB0byB0aGUgZ2l2ZW4gdmFsdWUuICBUaGUgdmFsdWUgbXVzdCBiZSBvZiB0aGUgY29ycmVjdCB0eXBlCi0gICAgICogZm9yIHRoaXMgZmllbGQsIGkuZS4gdGhlIHNhbWUgdHlwZSB0aGF0Ci0gICAgICoge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0KLSAgICAgKiB3b3VsZCByZXR1cm4uCi0gICAgICovCi0gICAgTWVyZ2VUYXJnZXQgc2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLCBPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogQ2xlYXJzIHRoZSBmaWVsZC4gIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGdlbmVyYXRlZAotICAgICAqICJjbGVhciIgYWNjZXNzb3IgbWV0aG9kIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGZpZWxkLgotICAgICAqLwotICAgIE1lcmdlVGFyZ2V0IGNsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKTsKLQotICAgIC8qKgotICAgICAqIFNldHMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0Ci0gICAgICogYmUgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhpcyBmaWVsZCwgaS5lLiB0aGUgc2FtZSB0eXBlIHRoYXQge0BsaW5rCi0gICAgICogTWVzc2FnZSNnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciwgaW50KX0gd291bGQgcmV0dXJuLgotICAgICAqCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIG5vdCBhIHJlcGVhdGVkIGZpZWxkLCBvcgotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHtAY29kZSBmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9Ci0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCi0gICAgICovCi0gICAgTWVyZ2VUYXJnZXQgc2V0UmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgIGludCBpbmRleCwgT2JqZWN0IHZhbHVlKTsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0Bjb2RlIHNldFJlcGVhdGVkRmllbGR9LCBidXQgYXBwZW5kcyB0aGUgdmFsdWUgYXMgYSBuZXcgZWxlbWVudC4KLSAgICAgKgotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSBmaWVsZCBpcyBub3QgYSByZXBlYXRlZCBmaWVsZCwgb3IKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPQotICAgICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgotICAgICAqLwotICAgIE1lcmdlVGFyZ2V0IGFkZFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICBPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvbmVvZiBpcyBzZXQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZgotICAgICAqICAgICAgICAgICB7QGNvZGUgb25lb2YuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KLSAgICAgKi8KLSAgICBib29sZWFuIGhhc09uZW9mKERlc2NyaXB0b3JzLk9uZW9mRGVzY3JpcHRvciBvbmVvZik7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIG9uZW9mLiAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgZ2VuZXJhdGVkCi0gICAgICogImNsZWFyIiBhY2Nlc3NvciBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgb25lb2YuCi0gICAgICovCi0gICAgTWVyZ2VUYXJnZXQgY2xlYXJPbmVvZihEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2YpOwotCi0gICAgLyoqCi0gICAgICogT2J0YWlucyB0aGUgRmllbGREZXNjcmlwdG9yIGlmIHRoZSBnaXZlbiBvbmVvZiBpcyBzZXQuIFJldHVybnMgbnVsbAotICAgICAqIGlmIG5vIGZpZWxkIGlzIHNldC4KLSAgICAgKi8KLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIG9uZW9mKTsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIHRoZSBpbnB1dCBzdHJlYW0gaW50byBhIHN1YiBmaWVsZCBncm91cCBkZWZpbmVkIGJhc2VkIG9uIGVpdGhlcgotICAgICAqIEZpZWxkRGVzY3JpcHRvciBvciB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBPYmplY3QgcGFyc2VHcm91cChDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnksCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgdGhlIGlucHV0IHN0cmVhbSBpbnRvIGEgc3ViIGZpZWxkIG1lc3NhZ2UgZGVmaW5lZCBiYXNlZCBvbiBlaXRoZXIKLSAgICAgKiBGaWVsZERlc2NyaXB0b3Igb3IgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCi0gICAgICovCi0gICAgT2JqZWN0IHBhcnNlTWVzc2FnZShDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnksCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgZnJvbSBhIEJ5dGVTdHJpbmcgaW50byBhIHN1YiBmaWVsZCBtZXNzYWdlIGRlZmluZWQgYmFzZWQgb24gZWl0aGVyCi0gICAgICogRmllbGREZXNjcmlwdG9yIG9yIHRoZSBkZWZhdWx0IGluc3RhbmNlLiAgVGhlcmUgaXNuJ3QgYSB2YXJpbnQgaW5kaWNhdGluZwotICAgICAqIHRoZSBsZW5ndGggb2YgdGhlIG1lc3NhZ2UgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQgQnl0ZVN0cmluZy4KLSAgICAgKi8KLSAgICBPYmplY3QgcGFyc2VNZXNzYWdlRnJvbUJ5dGVzKAotICAgICAgICBCeXRlU3RyaW5nIGJ5dGVzLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnksCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgVVRGOCB2YWxpZGF0aW9uIGxldmVsIGZvciB0aGUgZmllbGQuCi0gICAgICovCi0gICAgV2lyZUZvcm1hdC5VdGY4VmFsaWRhdGlvbiBnZXRVdGY4VmFsaWRhdGlvbihEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IKLSAgICAgICAgZGVzY3JpcHRvcik7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IG1lcmdlIHRhcmdldCBmb3IgYSBzdWItZmllbGQuIFdoZW4gZGVmYXVsdEluc3RhbmNlIGlzCi0gICAgICogcHJvdmlkZWQsIGl0IGluZGljYXRlcyB0aGUgZGVzY3JpcHRvciBpcyBmb3IgYW4gZXh0ZW5zaW9uIHR5cGUsIGFuZAotICAgICAqIGltcGxlbWVudGF0aW9ucyBzaG91bGQgY3JlYXRlIGEgbmV3IGluc3RhbmNlIGZyb20gdGhlIGRlZmF1bHRJbnN0YW5jZQotICAgICAqIHByb3RvdHlwZSBkaXJlY3RseS4KLSAgICAgKi8KLSAgICBNZXJnZVRhcmdldCBuZXdNZXJnZVRhcmdldEZvckZpZWxkKAotICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpOwotCi0gICAgLyoqCi0gICAgICogRmluaXNoZXMgdGhlIG1lcmdlIGFuZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nIG9iamVjdC4KLSAgICAgKi8KLSAgICBPYmplY3QgZmluaXNoKCk7Ci0gICAgCi0gIH0KLQotICBzdGF0aWMgY2xhc3MgQnVpbGRlckFkYXB0ZXIgaW1wbGVtZW50cyBNZXJnZVRhcmdldCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgICByZXR1cm4gYnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyQWRhcHRlcihNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0RmllbGQoZmllbGQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgcmV0dXJuIGJ1aWxkZXIuaGFzRmllbGQoZmllbGQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZVRhcmdldCBzZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgYnVpbGRlci5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lcmdlVGFyZ2V0IGNsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBidWlsZGVyLmNsZWFyRmllbGQoZmllbGQpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lcmdlVGFyZ2V0IHNldFJlcGVhdGVkRmllbGQoCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgsIHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZVRhcmdldCBhZGRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc09uZW9mKERlc2NyaXB0b3JzLk9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgcmV0dXJuIGJ1aWxkZXIuaGFzT25lb2Yob25lb2YpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZVRhcmdldCBjbGVhck9uZW9mKERlc2NyaXB0b3JzLk9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgYnVpbGRlci5jbGVhck9uZW9mKG9uZW9mKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgICByZXR1cm4gYnVpbGRlci5nZXRPbmVvZkZpZWxkRGVzY3JpcHRvcihvbmVvZik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvbnRhaW5lclR5cGUgZ2V0Q29udGFpbmVyVHlwZSgpIHsKLSAgICAgIHJldHVybiBDb250YWluZXJUeXBlLk1FU1NBR0U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZmluZEV4dGVuc2lvbkJ5TmFtZSgKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnksIFN0cmluZyBuYW1lKSB7Ci0gICAgICByZXR1cm4gcmVnaXN0cnkuZmluZEltbXV0YWJsZUV4dGVuc2lvbkJ5TmFtZShuYW1lKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5LCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlLCBpbnQgZmllbGROdW1iZXIpIHsKLSAgICAgIHJldHVybiByZWdpc3RyeS5maW5kSW1tdXRhYmxlRXh0ZW5zaW9uQnlOdW1iZXIoY29udGFpbmluZ1R5cGUsCi0gICAgICAgICAgZmllbGROdW1iZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgcGFyc2VHcm91cCgKLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXI7Ci0gICAgICAvLyBXaGVuIGRlZmF1bHQgaW5zdGFuY2UgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBpcyBhbiBleHRlbnNpb24gZmllbGQuCi0gICAgICBpZiAoZGVmYXVsdEluc3RhbmNlICE9IG51bGwpIHsKLSAgICAgICAgc3ViQnVpbGRlciA9IGRlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ViQnVpbGRlciA9IGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmICghZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWxNZXNzYWdlID0gKE1lc3NhZ2UpIGdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgaWYgKG9yaWdpbmFsTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgc3ViQnVpbGRlci5tZXJnZUZyb20ob3JpZ2luYWxNZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5wdXQucmVhZEdyb3VwKGZpZWxkLmdldE51bWJlcigpLCBzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICByZXR1cm4gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IHBhcnNlTWVzc2FnZSgKLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXI7Ci0gICAgICAvLyBXaGVuIGRlZmF1bHQgaW5zdGFuY2UgaXMgbm90IG51bGwuIFRoZSBmaWVsZCBpcyBhbiBleHRlbnNpb24gZmllbGQuCi0gICAgICBpZiAoZGVmYXVsdEluc3RhbmNlICE9IG51bGwpIHsKLSAgICAgICAgc3ViQnVpbGRlciA9IGRlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3ViQnVpbGRlciA9IGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICAgIGlmICghZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWxNZXNzYWdlID0gKE1lc3NhZ2UpIGdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgaWYgKG9yaWdpbmFsTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgc3ViQnVpbGRlci5tZXJnZUZyb20ob3JpZ2luYWxNZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5wdXQucmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHN1YkJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBwYXJzZU1lc3NhZ2VGcm9tQnl0ZXMoCi0gICAgICAgIEJ5dGVTdHJpbmcgYnl0ZXMsCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyOwotICAgICAgLy8gV2hlbiBkZWZhdWx0IGluc3RhbmNlIGlzIG5vdCBudWxsLiBUaGUgZmllbGQgaXMgYW4gZXh0ZW5zaW9uIGZpZWxkLgotICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBkZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBidWlsZGVyLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgICBpZiAoIWZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICBNZXNzYWdlIG9yaWdpbmFsTWVzc2FnZSA9IChNZXNzYWdlKSBnZXRGaWVsZChmaWVsZCk7Ci0gICAgICAgIGlmIChvcmlnaW5hbE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgIHN1YkJ1aWxkZXIubWVyZ2VGcm9tKG9yaWdpbmFsTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHN1YkJ1aWxkZXIubWVyZ2VGcm9tKGJ5dGVzLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICByZXR1cm4gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVyZ2VUYXJnZXQgbmV3TWVyZ2VUYXJnZXRGb3JGaWVsZCgKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkgewotICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZSAhPSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRlckFkYXB0ZXIoCi0gICAgICAgICAgICBkZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbmV3IEJ1aWxkZXJBZGFwdGVyKGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFdpcmVGb3JtYXQuVXRmOFZhbGlkYXRpb24gZ2V0VXRmOFZhbGlkYXRpb24oRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgIGlmIChkZXNjcmlwdG9yLm5lZWRzVXRmOENoZWNrKCkpIHsKLSAgICAgICAgcmV0dXJuIFdpcmVGb3JtYXQuVXRmOFZhbGlkYXRpb24uU1RSSUNUOwotICAgICAgfQotICAgICAgLy8gVE9ETyhsaXVqaXNpKTogc3VwcG9ydCBsYXp5IHN0cmluZ3MgZm9yIHJlcGVhdGVkIGZpZWxkcy4KLSAgICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkKLSAgICAgICAgICAmJiBidWlsZGVyIGluc3RhbmNlb2YgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyKSB7Ci0gICAgICAgIHJldHVybiBXaXJlRm9ybWF0LlV0ZjhWYWxpZGF0aW9uLkxBWlk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gV2lyZUZvcm1hdC5VdGY4VmFsaWRhdGlvbi5MT09TRTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGZpbmlzaCgpIHsKLSAgICAgIHJldHVybiBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIH0KLSAgICAKLSAgfQotCi0KLSAgc3RhdGljIGNsYXNzIEV4dGVuc2lvbkFkYXB0ZXIgaW1wbGVtZW50cyBNZXJnZVRhcmdldCB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkU2V0PERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9uczsKLQotICAgIEV4dGVuc2lvbkFkYXB0ZXIoRmllbGRTZXQ8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yPiBleHRlbnNpb25zKSB7Ci0gICAgICB0aGlzLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJnZXREZXNjcmlwdG9yRm9yVHlwZSgpIGNhbGxlZCBvbiBGaWVsZFNldCBvYmplY3QiKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0RmllbGQoZmllbGQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZmllbGQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZVRhcmdldCBzZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgZXh0ZW5zaW9ucy5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lcmdlVGFyZ2V0IGNsZWFyRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBleHRlbnNpb25zLmNsZWFyRmllbGQoZmllbGQpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lcmdlVGFyZ2V0IHNldFJlcGVhdGVkRmllbGQoCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGV4dGVuc2lvbnMuc2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgsIHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZVRhcmdldCBhZGRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc09uZW9mKERlc2NyaXB0b3JzLk9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNZXJnZVRhcmdldCBjbGVhck9uZW9mKERlc2NyaXB0b3JzLk9uZW9mRGVzY3JpcHRvciBvbmVvZikgewotICAgICAgLy8gTm90aGluZyB0byBjbGVhci4KLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIG9uZW9mKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29udGFpbmVyVHlwZSBnZXRDb250YWluZXJUeXBlKCkgewotICAgICAgcmV0dXJuIENvbnRhaW5lclR5cGUuRVhURU5TSU9OX1NFVDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOYW1lKAotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSwgU3RyaW5nIG5hbWUpIHsKLSAgICAgIHJldHVybiByZWdpc3RyeS5maW5kSW1tdXRhYmxlRXh0ZW5zaW9uQnlOYW1lKG5hbWUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGZpbmRFeHRlbnNpb25CeU51bWJlcigKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnksIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgY29udGFpbmluZ1R5cGUsIGludCBmaWVsZE51bWJlcikgewotICAgICAgcmV0dXJuIHJlZ2lzdHJ5LmZpbmRJbW11dGFibGVFeHRlbnNpb25CeU51bWJlcihjb250YWluaW5nVHlwZSwKLSAgICAgICAgICBmaWVsZE51bWJlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBwYXJzZUdyb3VwKAotICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnksCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlciA9Ci0gICAgICAgICAgZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7Ci0gICAgICBpZiAoIWZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICBNZXNzYWdlIG9yaWdpbmFsTWVzc2FnZSA9IChNZXNzYWdlKSBnZXRGaWVsZChmaWVsZCk7Ci0gICAgICAgIGlmIChvcmlnaW5hbE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgIHN1YkJ1aWxkZXIubWVyZ2VGcm9tKG9yaWdpbmFsTWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlucHV0LnJlYWRHcm91cChmaWVsZC5nZXROdW1iZXIoKSwgc3ViQnVpbGRlciwgcmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHN1YkJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBwYXJzZU1lc3NhZ2UoCi0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSwKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0KLSAgICAgICAgICBkZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICAgIGlmICghZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIE1lc3NhZ2Ugb3JpZ2luYWxNZXNzYWdlID0gKE1lc3NhZ2UpIGdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgaWYgKG9yaWdpbmFsTWVzc2FnZSAhPSBudWxsKSB7Ci0gICAgICAgICAgc3ViQnVpbGRlci5tZXJnZUZyb20ob3JpZ2luYWxNZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaW5wdXQucmVhZE1lc3NhZ2Uoc3ViQnVpbGRlciwgcmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHN1YkJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBwYXJzZU1lc3NhZ2VGcm9tQnl0ZXMoCi0gICAgICAgIEJ5dGVTdHJpbmcgYnl0ZXMsCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSwKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0gIGRlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgICAgaWYgKCFmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgTWVzc2FnZSBvcmlnaW5hbE1lc3NhZ2UgPSAoTWVzc2FnZSkgZ2V0RmllbGQoZmllbGQpOwotICAgICAgICBpZiAob3JpZ2luYWxNZXNzYWdlICE9IG51bGwpIHsKLSAgICAgICAgICBzdWJCdWlsZGVyLm1lcmdlRnJvbShvcmlnaW5hbE1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBzdWJCdWlsZGVyLm1lcmdlRnJvbShieXRlcywgcmVnaXN0cnkpOwotICAgICAgcmV0dXJuIHN1YkJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1lcmdlVGFyZ2V0IG5ld01lcmdlVGFyZ2V0Rm9yRmllbGQoCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkgewotICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJuZXdNZXJnZVRhcmdldEZvckZpZWxkKCkgY2FsbGVkIG9uIEZpZWxkU2V0IG9iamVjdCIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBXaXJlRm9ybWF0LlV0ZjhWYWxpZGF0aW9uIGdldFV0ZjhWYWxpZGF0aW9uKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5uZWVkc1V0ZjhDaGVjaygpKSB7Ci0gICAgICAgIHJldHVybiBXaXJlRm9ybWF0LlV0ZjhWYWxpZGF0aW9uLlNUUklDVDsKLSAgICAgIH0KLSAgICAgIC8vIFRPRE8obGl1amlzaSk6IHN1cHBvcnQgbGF6eSBzdHJpbmdzIGZvciBFeHRlc25zaW9uU2V0LgotICAgICAgcmV0dXJuIFdpcmVGb3JtYXQuVXRmOFZhbGlkYXRpb24uTE9PU0U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBmaW5pc2goKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgImZpbmlzaCgpIGNhbGxlZCBvbiBGaWVsZFNldCBvYmplY3QiKTsKLSAgICB9Ci0gICAgCi0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIGEgc2luZ2xlIGZpZWxkIGludG8gTWVyZ2VUYXJnZXQuIFRoZSB0YXJnZXQgY2FuIGJlIE1lc3NhZ2UuQnVpbGRlciwKLSAgICogRmllbGRTZXQgb3IgTXV0YWJsZU1lc3NhZ2UuCi0gICAqCi0gICAqIFBhY2thZ2UtcHJpdmF0ZSBiZWNhdXNlIGl0IGlzIHVzZWQgYnkgR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlTWVzc2FnZS4KLSAgICoKLSAgICogQHBhcmFtIHRhZyBUaGUgdGFnLCB3aGljaCBzaG91bGQgaGF2ZSBhbHJlYWR5IGJlZW4gcmVhZC4KLSAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICovCi0gIHN0YXRpYyBib29sZWFuIG1lcmdlRmllbGRGcm9tKAotICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMsCi0gICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIHR5cGUsCi0gICAgICBNZXJnZVRhcmdldCB0YXJnZXQsCi0gICAgICBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmICh0eXBlLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpICYmCi0gICAgICAgIHRhZyA9PSBXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU1fVEFHKSB7Ci0gICAgICBtZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25Gcm9tQ29kZWRTdHJlYW0oCi0gICAgICAgICAgaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0eXBlLCB0YXJnZXQpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgZmluYWwgaW50IHdpcmVUeXBlID0gV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpOwotICAgIGZpbmFsIGludCBmaWVsZE51bWJlciA9IFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKTsKLQotICAgIGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZDsKLSAgICBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSA9IG51bGw7Ci0KLSAgICBpZiAodHlwZS5pc0V4dGVuc2lvbk51bWJlcihmaWVsZE51bWJlcikpIHsKLSAgICAgIC8vIGV4dGVuc2lvblJlZ2lzdHJ5IG1heSBiZSBlaXRoZXIgRXh0ZW5zaW9uUmVnaXN0cnkgb3IKLSAgICAgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS4gIFNpbmNlIHRoZSB0eXBlIHdlIGFyZSBwYXJzaW5nIGlzIGEgZnVsbAotICAgICAgLy8gbWVzc2FnZSwgb25seSBhIGZ1bGwgRXh0ZW5zaW9uUmVnaXN0cnkgY291bGQgcG9zc2libHkgY29udGFpbgotICAgICAgLy8gZXh0ZW5zaW9ucyBvZiBpdC4gIE90aGVyd2lzZSB3ZSB3aWxsIHRyZWF0IHRoZSByZWdpc3RyeSBhcyBpZiBpdAotICAgICAgLy8gd2VyZSBlbXB0eS4KLSAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSBpbnN0YW5jZW9mIEV4dGVuc2lvblJlZ2lzdHJ5KSB7Ci0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uID0KLSAgICAgICAgICAgIHRhcmdldC5maW5kRXh0ZW5zaW9uQnlOdW1iZXIoKEV4dGVuc2lvblJlZ2lzdHJ5KSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICB0eXBlLCBmaWVsZE51bWJlcik7Ci0gICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICAgIGZpZWxkID0gbnVsbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaWVsZCA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yOwotICAgICAgICAgIGRlZmF1bHRJbnN0YW5jZSA9IGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2U7Ci0gICAgICAgICAgaWYgKGRlZmF1bHRJbnN0YW5jZSA9PSBudWxsICYmCi0gICAgICAgICAgICAgIGZpZWxkLmdldEphdmFUeXBlKCkKLSAgICAgICAgICAgICAgICAgID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICJNZXNzYWdlLXR5cGVkIGV4dGVuc2lvbiBsYWNrZWQgZGVmYXVsdCBpbnN0YW5jZTogIiArCi0gICAgICAgICAgICAgICAgICAgIGZpZWxkLmdldEZ1bGxOYW1lKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGQgPSBudWxsOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodGFyZ2V0LmdldENvbnRhaW5lclR5cGUoKSA9PSBNZXJnZVRhcmdldC5Db250YWluZXJUeXBlLk1FU1NBR0UpIHsKLSAgICAgIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU51bWJlcihmaWVsZE51bWJlcik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpZWxkID0gbnVsbDsKLSAgICB9Ci0KLSAgICBib29sZWFuIHVua25vd24gPSBmYWxzZTsKLSAgICBib29sZWFuIHBhY2tlZCA9IGZhbHNlOwotICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFVua25vd24gZmllbGQuCi0gICAgfSBlbHNlIGlmICh3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAotICAgICAgICBmaWVsZC5nZXRMaXRlVHlwZSgpLAotICAgICAgICBmYWxzZSAgLyogaXNQYWNrZWQgKi8pKSB7Ci0gICAgICBwYWNrZWQgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLmlzUGFja2FibGUoKSAmJgotICAgICAgICB3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAotICAgICAgICAgICAgZmllbGQuZ2V0TGl0ZVR5cGUoKSwKLSAgICAgICAgICAgIHRydWUgIC8qIGlzUGFja2VkICovKSkgewotICAgICAgcGFja2VkID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgdW5rbm93biA9IHRydWU7ICAvLyBVbmtub3duIHdpcmUgdHlwZS4KLSAgICB9Ci0KLSAgICBpZiAodW5rbm93bikgeyAgLy8gVW5rbm93biBmaWVsZCBvciB3cm9uZyB3aXJlIHR5cGUuICBTa2lwLgotICAgICAgcmV0dXJuIHVua25vd25GaWVsZHMubWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCk7Ci0gICAgfQotCi0gICAgaWYgKHBhY2tlZCkgewotICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpOwotICAgICAgZmluYWwgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7Ci0gICAgICBpZiAoZmllbGQuZ2V0TGl0ZVR5cGUoKSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5FTlVNKSB7Ci0gICAgICAgIHdoaWxlIChpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHsKLSAgICAgICAgICBmaW5hbCBpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpOwotICAgICAgICAgIGlmIChmaWVsZC5nZXRGaWxlKCkuc3VwcG9ydHNVbmtub3duRW51bVZhbHVlKCkpIHsKLSAgICAgICAgICAgIHRhcmdldC5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLAotICAgICAgICAgICAgICAgIGZpZWxkLmdldEVudW1UeXBlKCkuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bihyYXdWYWx1ZSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBmaWVsZC5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXNuJ3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzCi0gICAgICAgICAgICAgIC8vIGVudW0sIGRyb3AgaXQgKGRvbid0IGV2ZW4gYWRkIGl0IHRvIHVua25vd25GaWVsZHMpLgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhcmdldC5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gV2lyZUZvcm1hdC5yZWFkUHJpbWl0aXZlRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCBmaWVsZC5nZXRMaXRlVHlwZSgpLCB0YXJnZXQuZ2V0VXRmOFZhbGlkYXRpb24oZmllbGQpKTsKLSAgICAgICAgICB0YXJnZXQuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpbnB1dC5wb3BMaW1pdChsaW1pdCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZTsKLSAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgR1JPVVA6IHsKLSAgICAgICAgICB2YWx1ZSA9IHRhcmdldAotICAgICAgICAgICAgICAucGFyc2VHcm91cChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIGZpZWxkLCBkZWZhdWx0SW5zdGFuY2UpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgTUVTU0FHRTogewotICAgICAgICAgIHZhbHVlID0gdGFyZ2V0Ci0gICAgICAgICAgICAgIC5wYXJzZU1lc3NhZ2UoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBmaWVsZCwgZGVmYXVsdEluc3RhbmNlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgZmluYWwgaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTsKLSAgICAgICAgICBpZiAoZmllbGQuZ2V0RmlsZSgpLnN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZSgpKSB7Ci0gICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLmdldEVudW1UeXBlKCkuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bihyYXdWYWx1ZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHZhbHVlID0gZmllbGQuZ2V0RW51bVR5cGUoKS5maW5kVmFsdWVCeU51bWJlcihyYXdWYWx1ZSk7Ci0gICAgICAgICAgICAvLyBJZiB0aGUgbnVtYmVyIGlzbid0IHJlY29nbml6ZWQgYXMgYSB2YWxpZCB2YWx1ZSBmb3IgdGhpcyBlbnVtLAotICAgICAgICAgICAgLy8gZHJvcCBpdC4KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZChmaWVsZE51bWJlciwgcmF3VmFsdWUpOwotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgdmFsdWUgPSBXaXJlRm9ybWF0LnJlYWRQcmltaXRpdmVGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIGZpZWxkLmdldExpdGVUeXBlKCksIHRhcmdldC5nZXRVdGY4VmFsaWRhdGlvbihmaWVsZCkpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIHRhcmdldC5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0YXJnZXQuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgYnkge0Bjb2RlICNtZXJnZUZpZWxkRnJvbSgpfSB0byBwYXJzZSBhIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGludG8KLSAgICogTWVyZ2VUYXJnZXQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIG1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbkZyb21Db2RlZFN0cmVhbSgKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAotICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciB0eXBlLAotICAgICAgTWVyZ2VUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotCi0gICAgLy8gVGhlIHdpcmUgZm9ybWF0IGZvciBNZXNzYWdlU2V0IGlzOgotICAgIC8vICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKLSAgICAvLyAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgewotICAgIC8vICAgICAgIHJlcXVpcmVkIGludDMyIHR5cGVJZCA9IDI7Ci0gICAgLy8gICAgICAgcmVxdWlyZWQgYnl0ZXMgbWVzc2FnZSA9IDM7Ci0gICAgLy8gICAgIH0KLSAgICAvLyAgIH0KLSAgICAvLyAidHlwZUlkIiBpcyB0aGUgZXh0ZW5zaW9uJ3MgZmllbGQgbnVtYmVyLiAgVGhlIGV4dGVuc2lvbiBjYW4gb25seSBiZQotICAgIC8vIGEgbWVzc2FnZSB0eXBlLCB3aGVyZSAibWVzc2FnZSIgY29udGFpbnMgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhhdAotICAgIC8vIG1lc3NhZ2UuCi0gICAgLy8KLSAgICAvLyBJbiBwcmFjdGljZSwgd2Ugd2lsbCBwcm9iYWJseSBuZXZlciBzZWUgYSBNZXNzYWdlU2V0IGl0ZW0gaW4gd2hpY2gKLSAgICAvLyB0aGUgbWVzc2FnZSBhcHBlYXJzIGJlZm9yZSB0aGUgdHlwZSBJRCwgb3Igd2hlcmUgZWl0aGVyIGZpZWxkIGRvZXMgbm90Ci0gICAgLy8gYXBwZWFyIGV4YWN0bHkgb25jZS4gIEhvd2V2ZXIsIGluIHRoZW9yeSBzdWNoIGNhc2VzIGFyZSB2YWxpZCwgc28gd2UKLSAgICAvLyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYWNjZXB0IHRoZW0uCi0KLSAgICBpbnQgdHlwZUlkID0gMDsKLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbnVsbDsgLy8gSWYgd2UgZW5jb3VudGVyICJtZXNzYWdlIiBiZWZvcmUgInR5cGVJZCIKLSAgICBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbiA9IG51bGw7Ci0KLSAgICAvLyBSZWFkIGJ5dGVzIGZyb20gaW5wdXQsIGlmIHdlIGdldCBpdCdzIHR5cGUgZmlyc3QgdGhlbiBwYXJzZSBpdCBlYWdlcmx5LAotICAgIC8vIG90aGVyd2lzZSB3ZSBzdG9yZSB0aGUgcmF3IGJ5dGVzIGluIGEgbG9jYWwgdmFyaWFibGUuCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGZpbmFsIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICBpZiAodGFnID09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh0YWcgPT0gV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lEX1RBRykgewotICAgICAgICB0eXBlSWQgPSBpbnB1dC5yZWFkVUludDMyKCk7Ci0gICAgICAgIGlmICh0eXBlSWQgIT0gMCkgewotICAgICAgICAgIC8vIGV4dGVuc2lvblJlZ2lzdHJ5IG1heSBiZSBlaXRoZXIgRXh0ZW5zaW9uUmVnaXN0cnkgb3IKLSAgICAgICAgICAvLyBFeHRlbnNpb25SZWdpc3RyeUxpdGUuIFNpbmNlIHRoZSB0eXBlIHdlIGFyZSBwYXJzaW5nIGlzIGEgZnVsbAotICAgICAgICAgIC8vIG1lc3NhZ2UsIG9ubHkgYSBmdWxsIEV4dGVuc2lvblJlZ2lzdHJ5IGNvdWxkIHBvc3NpYmx5IGNvbnRhaW4KLSAgICAgICAgICAvLyBleHRlbnNpb25zIG9mIGl0LiBPdGhlcndpc2Ugd2Ugd2lsbCB0cmVhdCB0aGUgcmVnaXN0cnkgYXMgaWYgaXQKLSAgICAgICAgICAvLyB3ZXJlIGVtcHR5LgotICAgICAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSBpbnN0YW5jZW9mIEV4dGVuc2lvblJlZ2lzdHJ5KSB7Ci0gICAgICAgICAgICBleHRlbnNpb24gPSB0YXJnZXQuZmluZEV4dGVuc2lvbkJ5TnVtYmVyKAotICAgICAgICAgICAgICAgIChFeHRlbnNpb25SZWdpc3RyeSkgZXh0ZW5zaW9uUmVnaXN0cnksIHR5cGUsIHR5cGVJZCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgIH0gZWxzZSBpZiAodGFnID09IFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRV9UQUcpIHsKLSAgICAgICAgaWYgKHR5cGVJZCAhPSAwKSB7Ci0gICAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsICYmCi0gICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5pc0VhZ2VybHlQYXJzZU1lc3NhZ2VTZXRzKCkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgdHlwZSwgc28gd2UgY2FuIHBhcnNlIGRpcmVjdGx5IGZyb20gdGhlCi0gICAgICAgICAgICAvLyBpbnB1dCB3aXRoIG5vIGNvcHlpbmcuICBIb29yYXkhCi0gICAgICAgICAgICBlYWdlcmx5TWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICAgIGlucHV0LCBleHRlbnNpb24sIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YXJnZXQpOwotICAgICAgICAgICAgcmF3Qnl0ZXMgPSBudWxsOwotICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiBhIHR5cGUgSUQgeWV0IG9yIHdlIHdhbnQgcGFyc2UgbWVzc2FnZSBsYXppbHkuCi0gICAgICAgIHJhd0J5dGVzID0gaW5wdXQucmVhZEJ5dGVzKCk7Ci0KLSAgICAgIH0gZWxzZSB7IC8vIFVua25vd24gdGFnLiBTa2lwIGl0LgotICAgICAgICBpZiAoIWlucHV0LnNraXBGaWVsZCh0YWcpKSB7Ci0gICAgICAgICAgYnJlYWs7IC8vIEVuZCBvZiBncm91cAotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU1fRU5EX1RBRyk7Ci0KLSAgICAvLyBQcm9jZXNzIHRoZSByYXcgYnl0ZXMuCi0gICAgaWYgKHJhd0J5dGVzICE9IG51bGwgJiYgdHlwZUlkICE9IDApIHsgLy8gWmVybyBpcyBub3QgYSB2YWxpZCB0eXBlIElELgotICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7IC8vIFdlIGtub3duIHRoZSB0eXBlCi0gICAgICAgIG1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbkZyb21CeXRlcygKLSAgICAgICAgICAgIHJhd0J5dGVzLCBleHRlbnNpb24sIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YXJnZXQpOwotICAgICAgfSBlbHNlIHsgLy8gV2UgZG9uJ3Qga25vdyBob3cgdG8gcGFyc2UgdGhpcy4gSWdub3JlIGl0LgotICAgICAgICBpZiAocmF3Qnl0ZXMgIT0gbnVsbCkgewotICAgICAgICAgIHVua25vd25GaWVsZHMubWVyZ2VGaWVsZCh0eXBlSWQsIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChyYXdCeXRlcykuYnVpbGQoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIG1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbkZyb21CeXRlcygKLSAgICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMsCi0gICAgICBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbiwKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgIE1lcmdlVGFyZ2V0IHRhcmdldCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLQotICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yOwotICAgIGJvb2xlYW4gaGFzT3JpZ2luYWxWYWx1ZSA9IHRhcmdldC5oYXNGaWVsZChmaWVsZCk7Ci0KLSAgICBpZiAoaGFzT3JpZ2luYWxWYWx1ZSB8fCBFeHRlbnNpb25SZWdpc3RyeUxpdGUuaXNFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cygpKSB7Ci0gICAgICAvLyBJZiB0aGUgZmllbGQgYWxyZWFkeSBleGlzdHMsIHdlIGp1c3QgcGFyc2UgdGhlIGZpZWxkLgotICAgICAgT2JqZWN0IHZhbHVlID0gdGFyZ2V0LnBhcnNlTWVzc2FnZUZyb21CeXRlcygKLSAgICAgICAgICByYXdCeXRlcywgZXh0ZW5zaW9uUmVnaXN0cnksZmllbGQsIGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UpOwotICAgICAgdGFyZ2V0LnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFVzZSBMYXp5RmllbGQgdG8gbG9hZCBNZXNzYWdlU2V0IGxhemlseS4KLSAgICAgIExhenlGaWVsZCBsYXp5RmllbGQgPSBuZXcgTGF6eUZpZWxkKAotICAgICAgICAgIGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UsIGV4dGVuc2lvblJlZ2lzdHJ5LCByYXdCeXRlcyk7Ci0gICAgICB0YXJnZXQuc2V0RmllbGQoZmllbGQsIGxhenlGaWVsZCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlYWdlcmx5TWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uKAotICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uLAotICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgTWVyZ2VUYXJnZXQgdGFyZ2V0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yOwotICAgIE9iamVjdCB2YWx1ZSA9IHRhcmdldC5wYXJzZU1lc3NhZ2UoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UpOwotICAgIHRhcmdldC5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL011dGFiaWxpdHlPcmFjbGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTXV0YWJpbGl0eU9yYWNsZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmI3MjNjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTXV0YWJpbGl0eU9yYWNsZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBWZXJpZmllcyB0aGF0IGFuIG9iamVjdCBpcyBtdXRhYmxlLCB0aHJvd2luZyBpZiBub3QuCi0gKi8KLWludGVyZmFjZSBNdXRhYmlsaXR5T3JhY2xlIHsKLSAgc3RhdGljIGZpbmFsIE11dGFiaWxpdHlPcmFjbGUgSU1NVVRBQkxFID0gbmV3IE11dGFiaWxpdHlPcmFjbGUoKSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgZW5zdXJlTXV0YWJsZSgpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgfTsKLQotICAvKioKLSAgICogVGhyb3dzIGFuIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0gaWYgbm90IG11dGFibGUuCi0gICAqLwotICB2b2lkIGVuc3VyZU11dGFibGUoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmlvQnl0ZVN0cmluZy5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OaW9CeXRlU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYxNjNjN2IuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OaW9CeXRlU3RyaW5nLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyOTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkludmFsaWRPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5JbnZhbGlkTWFya0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIEEge0BsaW5rIEJ5dGVTdHJpbmd9IHRoYXQgd3JhcHMgYXJvdW5kIGEge0BsaW5rIEJ5dGVCdWZmZXJ9LgotICovCi1maW5hbCBjbGFzcyBOaW9CeXRlU3RyaW5nIGV4dGVuZHMgQnl0ZVN0cmluZy5MZWFmQnl0ZVN0cmluZyB7Ci0gIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7Ci0KLSAgTmlvQnl0ZVN0cmluZyhCeXRlQnVmZmVyIGJ1ZmZlcikgewotICAgIGlmIChidWZmZXIgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCJidWZmZXIiKTsKLSAgICB9Ci0KLSAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlci5zbGljZSgpLm9yZGVyKEJ5dGVPcmRlci5uYXRpdmVPcmRlcigpKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFNlcmlhbGl6YWJsZQotCi0gIC8qKgotICAgKiBNYWdpYyBtZXRob2QgdGhhdCBsZXRzIHVzIG92ZXJyaWRlIHNlcmlhbGl6YXRpb24gYmVoYXZpb3IuCi0gICAqLwotICBwcml2YXRlIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB7Ci0gICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oYnVmZmVyLnNsaWNlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIE1hZ2ljIG1ldGhvZCB0aGF0IGxldHMgdXMgb3ZlcnJpZGUgZGVzZXJpYWxpemF0aW9uIGJlaGF2aW9yLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIHJlYWRPYmplY3QoQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpIE9iamVjdElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHRocm93IG5ldyBJbnZhbGlkT2JqZWN0RXhjZXB0aW9uKCJOaW9CeXRlU3RyaW5nIGluc3RhbmNlcyBhcmUgbm90IHRvIGJlIHNlcmlhbGl6ZWQgZGlyZWN0bHkiKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBieXRlIGJ5dGVBdChpbnQgaW5kZXgpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIGJ1ZmZlci5nZXQoaW5kZXgpOwotICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBlOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gYnVmZmVyLnJlbWFpbmluZygpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBCeXRlU3RyaW5nIHN1YnN0cmluZyhpbnQgYmVnaW5JbmRleCwgaW50IGVuZEluZGV4KSB7Ci0gICAgdHJ5IHsKLSAgICAgIEJ5dGVCdWZmZXIgc2xpY2UgPSBzbGljZShiZWdpbkluZGV4LCBlbmRJbmRleCk7Ci0gICAgICByZXR1cm4gbmV3IE5pb0J5dGVTdHJpbmcoc2xpY2UpOwotICAgIH0gY2F0Y2ggKEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBlOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIGNvcHlUb0ludGVybmFsKAotICAgICAgYnl0ZVtdIHRhcmdldCwgaW50IHNvdXJjZU9mZnNldCwgaW50IHRhcmdldE9mZnNldCwgaW50IG51bWJlclRvQ29weSkgewotICAgIEJ5dGVCdWZmZXIgc2xpY2UgPSBidWZmZXIuc2xpY2UoKTsKLSAgICBzbGljZS5wb3NpdGlvbihzb3VyY2VPZmZzZXQpOwotICAgIHNsaWNlLmdldCh0YXJnZXQsIHRhcmdldE9mZnNldCwgbnVtYmVyVG9Db3B5KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBjb3B5VG8oQnl0ZUJ1ZmZlciB0YXJnZXQpIHsKLSAgICB0YXJnZXQucHV0KGJ1ZmZlci5zbGljZSgpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgb3V0LndyaXRlKHRvQnl0ZUFycmF5KCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIGJvb2xlYW4gZXF1YWxzUmFuZ2UoQnl0ZVN0cmluZyBvdGhlciwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgIHJldHVybiBzdWJzdHJpbmcoMCwgbGVuZ3RoKS5lcXVhbHMob3RoZXIuc3Vic3RyaW5nKG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgdm9pZCB3cml0ZVRvSW50ZXJuYWwoT3V0cHV0U3RyZWFtIG91dCwgaW50IHNvdXJjZU9mZnNldCwgaW50IG51bWJlclRvV3JpdGUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGJ1ZmZlci5oYXNBcnJheSgpKSB7Ci0gICAgICAvLyBPcHRpbWl6ZWQgd3JpdGUgZm9yIGFycmF5LWJhY2tlZCBidWZmZXJzLgotICAgICAgLy8gTm90ZSB0aGF0IHdlJ3JlIHRha2luZyB0aGUgcmlzayB0aGF0IGEgbWFsaWNpb3VzIE91dHB1dFN0cmVhbSBjb3VsZCBtb2RpZnkgdGhlIGFycmF5LgotICAgICAgaW50IGJ1ZmZlck9mZnNldCA9IGJ1ZmZlci5hcnJheU9mZnNldCgpICsgYnVmZmVyLnBvc2l0aW9uKCkgKyBzb3VyY2VPZmZzZXQ7Ci0gICAgICBvdXQud3JpdGUoYnVmZmVyLmFycmF5KCksIGJ1ZmZlck9mZnNldCwgbnVtYmVyVG9Xcml0ZSk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgQnl0ZUJ1ZmZlcldyaXRlci53cml0ZShzbGljZShzb3VyY2VPZmZzZXQsIHNvdXJjZU9mZnNldCArIG51bWJlclRvV3JpdGUpLCBvdXQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHZvaWQgd3JpdGVUbyhCeXRlT3V0cHV0IG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBvdXRwdXQud3JpdGVMYXp5KGJ1ZmZlci5zbGljZSgpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQnl0ZUJ1ZmZlciBhc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIHsKLSAgICByZXR1cm4gYnVmZmVyLmFzUmVhZE9ubHlCdWZmZXIoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdDxCeXRlQnVmZmVyPiBhc1JlYWRPbmx5Qnl0ZUJ1ZmZlckxpc3QoKSB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoYXNSZWFkT25seUJ5dGVCdWZmZXIoKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIFN0cmluZyB0b1N0cmluZ0ludGVybmFsKENoYXJzZXQgY2hhcnNldCkgewotICAgIGZpbmFsIGJ5dGVbXSBieXRlczsKLSAgICBmaW5hbCBpbnQgb2Zmc2V0OwotICAgIGZpbmFsIGludCBsZW5ndGg7Ci0gICAgaWYgKGJ1ZmZlci5oYXNBcnJheSgpKSB7Ci0gICAgICBieXRlcyA9IGJ1ZmZlci5hcnJheSgpOwotICAgICAgb2Zmc2V0ID0gYnVmZmVyLmFycmF5T2Zmc2V0KCkgKyBidWZmZXIucG9zaXRpb24oKTsKLSAgICAgIGxlbmd0aCA9IGJ1ZmZlci5yZW1haW5pbmcoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogQ2FuIHdlIG9wdGltaXplIHRoaXM/Ci0gICAgICBieXRlcyA9IHRvQnl0ZUFycmF5KCk7Ci0gICAgICBvZmZzZXQgPSAwOwotICAgICAgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcywgb2Zmc2V0LCBsZW5ndGgsIGNoYXJzZXQpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGlzVmFsaWRVdGY4KCkgewotICAgIHJldHVybiBVdGY4LmlzVmFsaWRVdGY4KGJ1ZmZlcik7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoaW50IHN0YXRlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIFV0ZjgucGFydGlhbElzVmFsaWRVdGY4KHN0YXRlLCBidWZmZXIsIG9mZnNldCwgb2Zmc2V0ICsgbGVuZ3RoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG90aGVyKSB7Ci0gICAgaWYgKG90aGVyID09IHRoaXMpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIEJ5dGVTdHJpbmcgb3RoZXJTdHJpbmcgPSAoKEJ5dGVTdHJpbmcpIG90aGVyKTsKLSAgICBpZiAoc2l6ZSgpICE9IG90aGVyU3RyaW5nLnNpemUoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoc2l6ZSgpID09IDApIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBOaW9CeXRlU3RyaW5nKSB7Ci0gICAgICByZXR1cm4gYnVmZmVyLmVxdWFscygoKE5pb0J5dGVTdHJpbmcpIG90aGVyKS5idWZmZXIpOwotICAgIH0KLSAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBSb3BlQnl0ZVN0cmluZykgewotICAgICAgcmV0dXJuIG90aGVyLmVxdWFscyh0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1ZmZlci5lcXVhbHMob3RoZXJTdHJpbmcuYXNSZWFkT25seUJ5dGVCdWZmZXIoKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGludCBwYXJ0aWFsSGFzaChpbnQgaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgIGZvciAoaW50IGkgPSBvZmZzZXQ7IGkgPCBvZmZzZXQgKyBsZW5ndGg7IGkrKykgewotICAgICAgaCA9IGggKiAzMSArIGJ1ZmZlci5nZXQoaSk7Ci0gICAgfQotICAgIHJldHVybiBoOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dCgpIHsKLSAgICByZXR1cm4gbmV3IElucHV0U3RyZWFtKCkgewotICAgICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGJ1ZiA9IGJ1ZmZlci5zbGljZSgpOwotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIG1hcmsoaW50IHJlYWRsaW1pdCkgewotICAgICAgICBidWYubWFyaygpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIG1hcmtTdXBwb3J0ZWQoKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBidWYucmVzZXQoKTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZE1hcmtFeGNlcHRpb24gZSkgewotICAgICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbihlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGJ1Zi5yZW1haW5pbmcoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWJ1Zi5oYXNSZW1haW5pbmcoKSkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVmLmdldCgpICYgMHhGRjsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGJ5dGVzLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAoIWJ1Zi5oYXNSZW1haW5pbmcoKSkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotCi0gICAgICAgIGxlbiA9IE1hdGgubWluKGxlbiwgYnVmLnJlbWFpbmluZygpKTsKLSAgICAgICAgYnVmLmdldChieXRlcywgb2ZmLCBsZW4pOwotICAgICAgICByZXR1cm4gbGVuOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIENvZGVkSW5wdXRTdHJlYW0gbmV3Q29kZWRJbnB1dCgpIHsKLSAgICByZXR1cm4gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShidWZmZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBzbGljZSBvZiBhIHJhbmdlIG9mIHRoaXMgYnVmZmVyLgotICAgKgotICAgKiBAcGFyYW0gYmVnaW5JbmRleCB0aGUgYmVnaW5uaW5nIGluZGV4IG9mIHRoZSBzbGljZSAoaW5jbHVzaXZlKS4KLSAgICogQHBhcmFtIGVuZEluZGV4IHRoZSBlbmQgaW5kZXggb2YgdGhlIHNsaWNlIChleGNsdXNpdmUpLgotICAgKiBAcmV0dXJuIHRoZSByZXF1ZXN0ZWQgc2xpY2UuCi0gICAqLwotICBwcml2YXRlIEJ5dGVCdWZmZXIgc2xpY2UoaW50IGJlZ2luSW5kZXgsIGludCBlbmRJbmRleCkgewotICAgIGlmIChiZWdpbkluZGV4IDwgYnVmZmVyLnBvc2l0aW9uKCkgfHwgZW5kSW5kZXggPiBidWZmZXIubGltaXQoKSB8fCBiZWdpbkluZGV4ID4gZW5kSW5kZXgpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgU3RyaW5nLmZvcm1hdCgiSW52YWxpZCBpbmRpY2VzIFslZCwgJWRdIiwgYmVnaW5JbmRleCwgZW5kSW5kZXgpKTsKLSAgICB9Ci0KLSAgICBCeXRlQnVmZmVyIHNsaWNlID0gYnVmZmVyLnNsaWNlKCk7Ci0gICAgc2xpY2UucG9zaXRpb24oYmVnaW5JbmRleCAtIGJ1ZmZlci5wb3NpdGlvbigpKTsKLSAgICBzbGljZS5saW1pdChlbmRJbmRleCAtIGJ1ZmZlci5wb3NpdGlvbigpKTsKLSAgICByZXR1cm4gc2xpY2U7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1BhcnNlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGI2OTI0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBwYXJzaW5nIFByb3RvY29sIE1lc3NhZ2VzLgotICoKLSAqIFRoZSBpbXBsZW1lbnRhdGlvbiBzaG91bGQgYmUgc3RhdGVsZXNzIGFuZCB0aHJlYWQtc2FmZS4KLSAqCi0gKiA8cD5BbGwgbWV0aG9kcyBtYXkgdGhyb3cge0BsaW5rIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0uIEluIHRoZSBldmVudCBvZiBpbnZhbGlkIGRhdGEsCi0gKiBsaWtlIGFuIGVuY29kaW5nIGVycm9yLCB0aGUgY2F1c2Ugb2YgdGhlIHRocm93biBleGNlcHRpb24gd2lsbCBiZSB7QGNvZGUgbnVsbH0uIEhvd2V2ZXIsIGlmIGFuCi0gKiBJL08gcHJvYmxlbSBvY2N1cnMsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24gd2l0aCBhbiB7QGxpbmsgSU9FeGNlcHRpb259IGNhdXNlLgotICoKLSAqIEBhdXRob3IgbGl1amlzaUBnb29nbGUuY29tIChQaGVybCBMaXUpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUGFyc2VyPE1lc3NhZ2VUeXBlPiB7Ci0KLSAgLy8gTkIoamgpOiBPdGhlciBwYXJ0cyBvZiB0aGUgcHJvdG9idWYgQVBJIHRoYXQgcGFyc2UgbWVzc2FnZXMgZGlzdGluZ3Vpc2ggYmV0d2VlbiBhbiBJL08gcHJvYmxlbQotICAvLyAobGlrZSBmYWlsdXJlIHJlYWRpbmcgYnl0ZXMgZnJvbSBhIHNvY2tldCkgYW5kIGludmFsaWQgZGF0YSAoZW5jb2RpbmcgZXJyb3IpIHZpYSB0aGUgdHlwZSBvZgotICAvLyB0aHJvd24gZXhjZXB0aW9uLiBCdXQgaXQgd291bGQgYmUgc291cmNlLWluY29tcGF0aWJsZSB0byBtYWtlIHRoZSBtZXRob2RzIGluIHRoaXMgaW50ZXJmYWNlIGRvCi0gIC8vIHNvIHNpbmNlIHRoZXkgd2VyZSBvcmlnaW5hbGx5IHNwZWMnZWQgdG8gb25seSB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uIFNvIGNhbGxlcnMKLSAgLy8gbXVzdCBpbnNwZWN0IHRoZSBjYXVzZSBvZiB0aGUgZXhjZXB0aW9uIHRvIGRpc3Rpbmd1aXNoIHRoZXNlIHR3byBjYXNlcy4KLQotICAvKioKLSAgICogUGFyc2VzIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9IGZyb20gdGhlIGlucHV0LgotICAgKgotICAgKiA8cD5Ob3RlOiAgVGhlIGNhbGxlciBzaG91bGQgY2FsbAotICAgKiB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbSNjaGVja0xhc3RUYWdXYXMoaW50KX0gYWZ0ZXIgY2FsbGluZyB0aGlzIHRvCi0gICAqIHZlcmlmeSB0aGF0IHRoZSBsYXN0IHRhZyBzZWVuIHdhcyB0aGUgYXBwcm9wcmlhdGUgZW5kLWdyb3VwIHRhZywKLSAgICogb3IgemVybyBmb3IgRU9GLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtKX0sIGJ1dCBhbHNvIHBhcnNlcyBleHRlbnNpb25zLgotICAgKiBUaGUgZXh0ZW5zaW9ucyB0aGF0IHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcGFyc2UgbXVzdCBiZSByZWdpc3RlcmVkIGluCi0gICAqIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uIEV4dGVuc2lvbnMgbm90IGluIHRoZSByZWdpc3RyeSB3aWxsIGJlIHRyZWF0ZWQKLSAgICogYXMgdW5rbm93biBmaWVsZHMuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtKX0sIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbgotICAgKiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuIEluc3RlYWQsIGEgcGFydGlhbAotICAgKiBtZXNzYWdlIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0sCi0gICAqIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCi0gICAqIEluc3RlYWQsIGEgcGFydGlhbCBtZXNzYWdlIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcy4KLQotICAvKioKLSAgICogUGFyc2VzIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2Yge0Bjb2RlIE1lc3NhZ2VUeXBlfS4KLSAgICogVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQge0BsaW5rICNwYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRnJvbShCeXRlU3RyaW5nIGRhdGEpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBQYXJzZXMge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9LgotICAgKiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgKiB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oQnl0ZVN0cmluZyBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oQnl0ZVN0cmluZyl9LCBidXQgZG9lcyBub3QgdGhyb3cgYW4KLSAgICogZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiBJbnN0ZWFkLCBhIHBhcnRpYWwKLSAgICogbWVzc2FnZSBpcyByZXR1cm5lZC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKEJ5dGVTdHJpbmcgZGF0YSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oQnl0ZVN0cmluZywgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0sCi0gICAqIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCi0gICAqIEluc3RlYWQsIGEgcGFydGlhbCBtZXNzYWdlIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oQnl0ZVN0cmluZyBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBQYXJzZXMge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9LgotICAgKiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUGFyc2VzIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2Yge0Bjb2RlIE1lc3NhZ2VUeXBlfS4KLSAgICogVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICoge0BsaW5rICNwYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0uCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHtAY29kZSBNZXNzYWdlVHlwZX0uCi0gICAqIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kIHtAbGluayAjcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBQYXJzZXMge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9LgotICAgKiBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgKiB7QGxpbmsgI3BhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfS4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZUZyb20oYnl0ZVtdIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShieXRlW10sIGludCwgaW50KX0sIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbgotICAgKiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuIEluc3RlYWQsIGEgcGFydGlhbAotICAgKiBtZXNzYWdlIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbEZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjcGFyc2VGcm9tKEJ5dGVTdHJpbmcsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LAotICAgKiBidXQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgotICAgKiBJbnN0ZWFkLCBhIHBhcnRpYWwgbWVzc2FnZSBpcyByZXR1cm5lZC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjcGFyc2VGcm9tKGJ5dGVbXSl9LCBidXQgZG9lcyBub3QgdGhyb3cgYW4KLSAgICogZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLiBJbnN0ZWFkLCBhIHBhcnRpYWwKLSAgICogbWVzc2FnZSBpcyByZXR1cm5lZC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI3BhcnNlRnJvbShieXRlW10sIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LAotICAgKiBidXQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgotICAgKiBJbnN0ZWFkLCBhIHBhcnRpYWwgbWVzc2FnZSBpcyByZXR1cm5lZC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKGJ5dGVbXSBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBQYXJzZSBhIG1lc3NhZ2Ugb2Yge0Bjb2RlIE1lc3NhZ2VUeXBlfSBmcm9tIHtAY29kZSBpbnB1dH0uCi0gICAqIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kIHtAbGluayAjcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICogTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGFsd2F5cyByZWFkcyB0aGUgPGk+ZW50aXJlPC9pPiBpbnB1dCAodW5sZXNzIGl0Ci0gICAqIHRocm93cyBhbiBleGNlcHRpb24pLiAgSWYgeW91IHdhbnQgaXQgdG8gc3RvcCBlYXJsaWVyLCB5b3Ugd2lsbCBuZWVkIHRvCi0gICAqIHdyYXAgeW91ciBpbnB1dCBpbiBzb21lIHdyYXBwZXIgc3RyZWFtIHRoYXQgbGltaXRzIHJlYWRpbmcuICBPciwgdXNlCi0gICAqIHtAbGluayBNZXNzYWdlTGl0ZSN3cml0ZURlbGltaXRlZFRvKGphdmEuaW8uT3V0cHV0U3RyZWFtKX0gdG8gd3JpdGUgeW91cgotICAgKiBtZXNzYWdlIGFuZCB7QGxpbmsgI3BhcnNlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSl9IHRvIHJlYWQgaXQuCi0gICAqIDxwPgotICAgKiBEZXNwaXRlIHVzdWFsbHkgcmVhZGluZyB0aGUgZW50aXJlIGlucHV0LCB0aGlzIGRvZXMgbm90IGNsb3NlIHRoZSBzdHJlYW0uCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKElucHV0U3RyZWFtIGlucHV0KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAvKioKLSAgICogUGFyc2VzIGEgbWVzc2FnZSBvZiB7QGNvZGUgTWVzc2FnZVR5cGV9IGZyb20ge0Bjb2RlIGlucHV0fS4KLSAgICogVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICoge0BsaW5rICNwYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbSwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKX0uCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VGcm9tKElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oSW5wdXRTdHJlYW0pfSwgYnV0IGRvZXMgbm90IHRocm93IGFuCi0gICAqIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gSW5zdGVhZCwgYSBwYXJ0aWFsCi0gICAqIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNwYXJzZUZyb20oSW5wdXRTdHJlYW0sIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSl9LAotICAgKiBidXQgZG9lcyBub3QgdGhyb3cgYW4gZXhjZXB0aW9uIGlmIHRoZSBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgotICAgKiBJbnN0ZWFkLCBhIHBhcnRpYWwgbWVzc2FnZSBpcyByZXR1cm5lZC4KLSAgICovCi0gIHB1YmxpYyBNZXNzYWdlVHlwZSBwYXJzZVBhcnRpYWxGcm9tKElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjcGFyc2VGcm9tKElucHV0U3RyZWFtKX0sIGJ1dCBkb2VzIG5vdCByZWFkIHV0aWwgRU9GLgotICAgKiBJbnN0ZWFkLCB0aGUgc2l6ZSBvZiBtZXNzYWdlIChlbmNvZGVkIGFzIGEgdmFyaW50KSBpcyByZWFkIGZpcnN0LAotICAgKiB0aGVuIHRoZSBtZXNzYWdlIGRhdGEuIFVzZQotICAgKiB7QGxpbmsgTWVzc2FnZUxpdGUjd3JpdGVEZWxpbWl0ZWRUbyhqYXZhLmlvLk91dHB1dFN0cmVhbSl9IHRvIHdyaXRlCi0gICAqIG1lc3NhZ2VzIGluIHRoaXMgZm9ybWF0LgotICAgKgotICAgKiBAcmV0dXJuIFBhcnNlZCBtZXNzYWdlIGlmIHN1Y2Nlc3NmdWwsIG9yIG51bGwgaWYgdGhlIHN0cmVhbSBpcyBhdCBFT0Ygd2hlbgotICAgKiAgICAgICAgIHRoZSBtZXRob2Qgc3RhcnRzLiBBbnkgb3RoZXIgZXJyb3IgKGluY2x1ZGluZyByZWFjaGluZyBFT0YgZHVyaW5nCi0gICAqICAgICAgICAgcGFyc2luZykgd2lsbCBjYXVzZSBhbiBleGNlcHRpb24gdG8gYmUgdGhyb3duLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNwYXJzZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0pfSBidXQgc3VwcG9ydGluZyBleHRlbnNpb25zLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjcGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0sIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbgotICAgKiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuIEluc3RlYWQsIGEgcGFydGlhbAotICAgKiBtZXNzYWdlIGlzIHJldHVybmVkLgotICAgKi8KLSAgcHVibGljIE1lc3NhZ2VUeXBlIHBhcnNlUGFydGlhbERlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjcGFyc2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUpfSwKLSAgICogYnV0IGRvZXMgbm90IHRocm93IGFuIGV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KLSAgICogSW5zdGVhZCwgYSBwYXJ0aWFsIG1lc3NhZ2UgaXMgcmV0dXJuZWQuCi0gICAqLwotICBwdWJsaWMgTWVzc2FnZVR5cGUgcGFyc2VQYXJ0aWFsRGVsaW1pdGVkRnJvbSgKLSAgICAgIElucHV0U3RyZWFtIGlucHV0LAotICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUHJvdG9idWZBcnJheUxpc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUHJvdG9idWZBcnJheUxpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODEyNTVlYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvYnVmQXJyYXlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuUHJvdG9idWZMaXN0OwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBJbXBsZW1lbnRzIHtAbGluayBQcm90b2J1Zkxpc3R9IGZvciBub24tcHJpbWl0aXZlIGFuZCB7QGxpbmsgU3RyaW5nfSB0eXBlcy4KLSAqLwotZmluYWwgY2xhc3MgUHJvdG9idWZBcnJheUxpc3Q8RT4gZXh0ZW5kcyBBYnN0cmFjdFByb3RvYnVmTGlzdDxFPiB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvdG9idWZBcnJheUxpc3Q8T2JqZWN0PiBFTVBUWV9MSVNUID0gbmV3IFByb3RvYnVmQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgc3RhdGljIHsKLSAgICBFTVBUWV9MSVNULm1ha2VJbW11dGFibGUoKTsKLSAgfQotICAKLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIC8vIEd1YXJhbnRlZWQgc2FmZSBieSBydW50aW1lLgotICBwdWJsaWMgc3RhdGljIDxFPiBQcm90b2J1ZkFycmF5TGlzdDxFPiBlbXB0eUxpc3QoKSB7Ci0gICAgcmV0dXJuIChQcm90b2J1ZkFycmF5TGlzdDxFPikgRU1QVFlfTElTVDsKLSAgfQotICAKLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PEU+IGxpc3Q7Ci0KLSAgUHJvdG9idWZBcnJheUxpc3QoKSB7Ci0gICAgdGhpcyhuZXcgQXJyYXlMaXN0PEU+KERFRkFVTFRfQ0FQQUNJVFkpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBQcm90b2J1ZkFycmF5TGlzdChMaXN0PEU+IGxpc3QpIHsKLSAgICB0aGlzLmxpc3QgPSBsaXN0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBQcm90b2J1ZkFycmF5TGlzdDxFPiBtdXRhYmxlQ29weVdpdGhDYXBhY2l0eShpbnQgY2FwYWNpdHkpIHsKLSAgICBpZiAoY2FwYWNpdHkgPCBzaXplKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgTGlzdDxFPiBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdDxFPihjYXBhY2l0eSk7Ci0gICAgbmV3TGlzdC5hZGRBbGwobGlzdCk7Ci0gICAgcmV0dXJuIG5ldyBQcm90b2J1ZkFycmF5TGlzdDxFPihuZXdMaXN0KTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIEUgZWxlbWVudCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIGxpc3QuYWRkKGluZGV4LCBlbGVtZW50KTsKLSAgICBtb2RDb3VudCsrOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBFIGdldChpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbGlzdC5nZXQoaW5kZXgpOwotICB9Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHVibGljIEUgcmVtb3ZlKGludCBpbmRleCkgewotICAgIGVuc3VyZUlzTXV0YWJsZSgpOwotICAgIEUgdG9SZXR1cm4gPSBsaXN0LnJlbW92ZShpbmRleCk7Ci0gICAgbW9kQ291bnQrKzsKLSAgICByZXR1cm4gdG9SZXR1cm47Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgRSBzZXQoaW50IGluZGV4LCBFIGVsZW1lbnQpIHsKLSAgICBlbnN1cmVJc011dGFibGUoKTsKLSAgICBFIHRvUmV0dXJuID0gbGlzdC5zZXQoaW5kZXgsIGVsZW1lbnQpOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIHRvUmV0dXJuOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUHJvdG9jb2xNZXNzYWdlRW51bS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b2NvbE1lc3NhZ2VFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1OTZkMzAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b2NvbE1lc3NhZ2VFbnVtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3I7Ci0KLS8qKgotICogSW50ZXJmYWNlIG9mIHVzZWZ1bCBtZXRob2RzIGFkZGVkIHRvIGFsbCBlbnVtcyBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sCi0gKiBjb21waWxlci4KLSAqLwotcHVibGljIGludGVyZmFjZSBQcm90b2NvbE1lc3NhZ2VFbnVtIGV4dGVuZHMgSW50ZXJuYWwuRW51bUxpdGUgewotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIHZhbHVlJ3MgbnVtZXJpYyB2YWx1ZSBhcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICovCi0gIEBPdmVycmlkZQotICBpbnQgZ2V0TnVtYmVyKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdmFsdWUncyBkZXNjcmlwdG9yLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBzdWNoIGFzCi0gICAqIHZhbHVlIG5hbWUsIG51bWJlciwgYW5kIHR5cGUuCi0gICAqLwotICBFbnVtVmFsdWVEZXNjcmlwdG9yIGdldFZhbHVlRGVzY3JpcHRvcigpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVudW0gdHlwZSdzIGRlc2NyaXB0b3IsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0gICAqIGFib3V0IGVhY2ggZGVmaW5lZCB2YWx1ZSwgZXRjLgotICAgKi8KLSAgRW51bURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUHJvdG9jb2xTdHJpbmdMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvY29sU3RyaW5nTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTUzYjQxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUHJvdG9jb2xTdHJpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogQW4gaW50ZXJmYWNlIGV4dGVuZGluZyB7QGNvZGUgTGlzdDxTdHJpbmc+fSB1c2VkIGZvciByZXBlYXRlZCBzdHJpbmcgZmllbGRzCi0gKiB0byBwcm92aWRlIG9wdGlvbmFsIGFjY2VzcyB0byB0aGUgZGF0YSBhcyBhIGxpc3Qgb2YgQnl0ZVN0cmluZ3MuIFRoZQotICogdW5kZXJseWluZyBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgdmFsdWVzIGFzIGVpdGhlciBCeXRlU3RyaW5ncyBvciBTdHJpbmdzCi0gKiAoc2VlIHtAbGluayBMYXp5U3RyaW5nQXJyYXlMaXN0fSkgZGVwZW5kaW5nIG9uIGhvdyB0aGUgdmFsdWUgd2FzIGluaXRpYWxpemVkCi0gKiBvciBsYXN0IHJlYWQsIGFuZCBpdCBpcyBvZnRlbiBtb3JlIGVmZmljaWVudCB0byBkZWFsIHdpdGggbGlzdHMgb2YKLSAqIEJ5dGVTdHJpbmdzIHdoZW4gaGFuZGxpbmcgcHJvdG9zIHRoYXQgaGF2ZSBiZWVuIGRlc2VyaWFsaXplZCBmcm9tIGJ5dGVzLgotICovCi1wdWJsaWMgaW50ZXJmYWNlIFByb3RvY29sU3RyaW5nTGlzdCBleHRlbmRzIExpc3Q8U3RyaW5nPiB7Ci0KLSAgLyoqIFJldHVybnMgYSB2aWV3IG9mIHRoZSBkYXRhIGFzIGEgbGlzdCBvZiBCeXRlU3RyaW5ncy4gKi8KLSAgTGlzdDxCeXRlU3RyaW5nPiBhc0J5dGVTdHJpbmdMaXN0KCk7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjlmNTY3ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICoge0Bjb2RlIFJlcGVhdGVkRmllbGRCdWlsZGVyfSBpbXBsZW1lbnRzIGEgc3RydWN0dXJlIHRoYXQgYSBwcm90b2NvbAotICogbWVzc2FnZSB1c2VzIHRvIGhvbGQgYSByZXBlYXRlZCBmaWVsZCBvZiBvdGhlciBwcm90b2NvbCBtZXNzYWdlcy4gSXQgc3VwcG9ydHMKLSAqIHRoZSBjbGFzc2ljYWwgdXNlIGNhc2Ugb2YgYWRkaW5nIGltbXV0YWJsZSB7QGxpbmsgTWVzc2FnZX0ncyB0byB0aGUKLSAqIHJlcGVhdGVkIGZpZWxkIGFuZCBpcyBoaWdobHkgb3B0aW1pemVkIGFyb3VuZCB0aGlzIChubyBleHRyYSBtZW1vcnkKLSAqIGFsbG9jYXRpb25zIGFuZCBzaGFyaW5nIG9mIGltbXV0YWJsZSBhcnJheXMpLgotICogPGJyPgotICogSXQgYWxzbyBzdXBwb3J0cyB0aGUgYWRkaXRpb25hbCB1c2UgY2FzZSBvZiBhZGRpbmcgYSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfQotICogdG8gdGhlIHJlcGVhdGVkIGZpZWxkIGFuZCBkZWZlcnJpbmcgY29udmVyc2lvbiBvZiB0aGF0IHtAY29kZSBCdWlsZGVyfQotICogdG8gYW4gaW1tdXRhYmxlIHtAY29kZSBNZXNzYWdlfS4gSW4gdGhpcyB3YXksIGl0J3MgcG9zc2libGUgdG8gbWFpbnRhaW4KLSAqIGEgdHJlZSBvZiB7QGNvZGUgQnVpbGRlcn0ncyB0aGF0IGFjdHMgYXMgYSBmdWxseSByZWFkL3dyaXRlIGRhdGEKLSAqIHN0cnVjdHVyZS4KLSAqIDxicj4KLSAqIExvZ2ljYWxseSwgb25lIGNhbiB0aGluayBvZiBhIHRyZWUgb2YgYnVpbGRlcnMgYXMgY29udmVydGluZyB0aGUgZW50aXJlIHRyZWUKLSAqIHRvIG1lc3NhZ2VzIHdoZW4gYnVpbGQgaXMgY2FsbGVkIG9uIHRoZSByb290IG9yIHdoZW4gYW55IG1ldGhvZCBpcyBjYWxsZWQKLSAqIHRoYXQgZGVzaXJlcyBhIE1lc3NhZ2UgaW5zdGVhZCBvZiBhIEJ1aWxkZXIuIEluIHRlcm1zIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiwKLSAqIHRoZSB7QGNvZGUgU2luZ2xlRmllbGRCdWlsZGVyfSBhbmQge0Bjb2RlIFJlcGVhdGVkRmllbGRCdWlsZGVyfQotICogY2xhc3NlcyBjYWNoZSBtZXNzYWdlcyB0aGF0IHdlcmUgY3JlYXRlZCBzbyB0aGF0IG1lc3NhZ2VzIG9ubHkgbmVlZCB0byBiZQotICogY3JlYXRlZCB3aGVuIHNvbWUgY2hhbmdlIG9jY3VycmVkIGluIGl0cyBidWlsZGVyIG9yIGEgYnVpbGRlciBmb3Igb25lIG9mIGl0cwotICogZGVzY2VuZGFudHMuCi0gKgotICogQHBhcmFtIDxNVHlwZT4gdGhlIHR5cGUgb2YgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCi0gKiBAcGFyYW0gPEJUeXBlPiB0aGUgdHlwZSBvZiBidWlsZGVyIGZvciB0aGUgZmllbGQKLSAqIEBwYXJhbSA8SVR5cGU+IHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciB0aGUgbWVzc2FnZSBhbmQgdGhlIGJ1aWxkZXIKLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqLwotcHVibGljIGNsYXNzIFJlcGVhdGVkRmllbGRCdWlsZGVyCi0gICAgPE1UeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZSwKLSAgICAgQlR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIsCi0gICAgIElUeXBlIGV4dGVuZHMgTWVzc2FnZU9yQnVpbGRlcj4KLSAgICBpbXBsZW1lbnRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCB7Ci0KLSAgLy8gUGFyZW50IHRvIHNlbmQgY2hhbmdlcyB0by4KLSAgcHJpdmF0ZSBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50OwotCi0gIC8vIExpc3Qgb2YgbWVzc2FnZXMuIE5ldmVyIG51bGwuIEl0IG1heSBiZSBpbW11dGFibGUsIGluIHdoaWNoIGNhc2UKLSAgLy8gaXNNZXNzYWdlc0xpc3RNdXRhYmxlIHdpbGwgYmUgZmFsc2UuIFNlZSBub3RlIGJlbG93LgotICBwcml2YXRlIExpc3Q8TVR5cGU+IG1lc3NhZ2VzOwotCi0gIC8vIFdoZXRoZXIgbWVzc2FnZXMgaXMgYW4gbXV0YWJsZSBhcnJheSB0aGF0IGNhbiBiZSBtb2RpZmllZC4KLSAgcHJpdmF0ZSBib29sZWFuIGlzTWVzc2FnZXNMaXN0TXV0YWJsZTsKLQotICAvLyBMaXN0IG9mIGJ1aWxkZXJzLiBNYXkgYmUgbnVsbCwgaW4gd2hpY2ggY2FzZSwgbm8gbmVzdGVkIGJ1aWxkZXJzIHdlcmUKLSAgLy8gY3JlYXRlZC4gSWYgbm90IG51bGwsIGVudHJpZXMgcmVwcmVzZW50IHRoZSBidWlsZGVyIGZvciB0aGF0IGluZGV4LgotICBwcml2YXRlIExpc3Q8U2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+PiBidWlsZGVyczsKLQotICAvLyBIZXJlIGFyZSB0aGUgaW52YXJpYW50cyBmb3IgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzOgotICAvLyAxLiBtZXNzYWdlcyBpcyBuZXZlciBudWxsIGFuZCBpdHMgY291bnQgY29ycmVzcG9uZHMgdG8gdGhlIG51bWJlciBvZiBpdGVtcwotICAvLyAgICBpbiB0aGUgcmVwZWF0ZWQgZmllbGQuCi0gIC8vIDIuIElmIGJ1aWxkZXJzIGlzIG5vbi1udWxsLCBtZXNzYWdlcyBhbmQgYnVpbGRlcnMgTVVTVCBhbHdheXMKLSAgLy8gICAgY29udGFpbiB0aGUgc2FtZSBudW1iZXIgb2YgaXRlbXMuCi0gIC8vIDMuIEVudHJpZXMgaW4gZWl0aGVyIGFycmF5IGNhbiBiZSBudWxsLCBidXQgZm9yIGFueSBpbmRleCwgdGhlcmUgTVVTVCBiZQotICAvLyAgICBlaXRoZXIgYSBNZXNzYWdlIGluIG1lc3NhZ2VzIG9yIGEgYnVpbGRlciBpbiBidWlsZGVycy4KLSAgLy8gNC4gSWYgdGhlIGJ1aWxkZXIgYXQgYW4gaW5kZXggaXMgbm9uLW51bGwsIHRoZSBidWlsZGVyIGlzCi0gIC8vICAgIGF1dGhvcml0YXRpdmUuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgYSBCdWlsZGVyIHdhcyBzZXQgb24gdGhlIGluZGV4LgotICAvLyAgICBBbnkgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZXMgYXJyYXkgTVVTVCBiZSBpZ25vcmVkLgotICAvLyB0LiBJZiB0aGUgYnVpbGRlciBhdCBhbiBpbmRleCBpcyBudWxsLCB0aGUgbWVzc2FnZSBpbiB0aGUgbWVzc2FnZXMKLSAgLy8gICAgbGlzdCBpcyBhdXRob3JpdGF0aXZlLiBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIGEgTWVzc2FnZSAobm90IGEgQnVpbGRlcikKLSAgLy8gICAgd2FzIHNldCBkaXJlY3RseSBmb3IgYW4gaW5kZXguCi0KLSAgLy8gSW5kaWNhdGVzIHRoYXQgd2UndmUgYnVpbHQgYSBtZXNzYWdlIGFuZCBzbyB3ZSBhcmUgbm93IG9ibGlnYXRlZAotICAvLyB0byBkaXNwYXRjaCBkaXJ0eSBpbnZhbGlkYXRpb25zLiBTZWUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyTGlzdGVuZXIuCi0gIHByaXZhdGUgYm9vbGVhbiBpc0NsZWFuOwotCi0gIC8vIEEgdmlldyBvZiB0aGlzIGJ1aWxkZXIgdGhhdCBleHBvc2VzIGEgTGlzdCBpbnRlcmZhY2Ugb2YgbWVzc2FnZXMuIFRoaXMgaXMKLSAgLy8gaW5pdGlhbGl6ZWQgb24gZGVtYW5kLiBUaGlzIGlzIGZ1bGx5IGJhY2tlZCBieSB0aGlzIG9iamVjdCBhbmQgYWxsIGNoYW5nZXMKLSAgLy8gYXJlIHJlZmxlY3RlZCBpbiBpdC4gQWNjZXNzIHRvIGFueSBpdGVtIGNvbnZlcnRzIGl0IHRvIGEgbWVzc2FnZSBpZiBpdAotICAvLyB3YXMgYSBidWlsZGVyLgotICBwcml2YXRlIE1lc3NhZ2VFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZXh0ZXJuYWxNZXNzYWdlTGlzdDsKLQotICAvLyBBIHZpZXcgb2YgdGhpcyBidWlsZGVyIHRoYXQgZXhwb3NlcyBhIExpc3QgaW50ZXJmYWNlIG9mIGJ1aWxkZXJzLiBUaGlzIGlzCi0gIC8vIGluaXRpYWxpemVkIG9uIGRlbWFuZC4gVGhpcyBpcyBmdWxseSBiYWNrZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFsbCBjaGFuZ2VzCi0gIC8vIGFyZSByZWZsZWN0ZWQgaW4gaXQuIEFjY2VzcyB0byBhbnkgaXRlbSBjb252ZXJ0cyBpdCB0byBhIGJ1aWxkZXIgaWYgaXQKLSAgLy8gd2FzIGEgbWVzc2FnZS4KLSAgcHJpdmF0ZSBCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+IGV4dGVybmFsQnVpbGRlckxpc3Q7Ci0KLSAgLy8gQSB2aWV3IG9mIHRoaXMgYnVpbGRlciB0aGF0IGV4cG9zZXMgYSBMaXN0IGludGVyZmFjZSBvZiB0aGUgaW50ZXJmYWNlCi0gIC8vIGltcGxlbWVudGVkIGJ5IG1lc3NhZ2VzIGFuZCBidWlsZGVycy4gVGhpcyBpcyBpbml0aWFsaXplZCBvbiBkZW1hbmQuIFRoaXMKLSAgLy8gaXMgZnVsbHkgYmFja2VkIGJ5IHRoaXMgb2JqZWN0IGFuZCBhbGwgY2hhbmdlcyBhcmUgcmVmbGVjdGVkIGluIGl0LgotICAvLyBBY2Nlc3MgdG8gYW55IGl0ZW0gcmV0dXJucyBlaXRoZXIgYSBidWlsZGVyIG9yIG1lc3NhZ2UgZGVwZW5kaW5nIG9uCi0gIC8vIHdoYXQgaXMgbW9zdCBlZmZpY2llbnQuCi0gIHByaXZhdGUgTWVzc2FnZU9yQnVpbGRlckV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPgotICAgICAgZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdDsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBidWlsZGVyIHdpdGggYW4gZW1wdHkgbGlzdCBvZiBtZXNzYWdlcy4KLSAgICoKLSAgICogQHBhcmFtIG1lc3NhZ2VzIHRoZSBjdXJyZW50IGxpc3Qgb2YgbWVzc2FnZXMKLSAgICogQHBhcmFtIGlzTWVzc2FnZXNMaXN0TXV0YWJsZSBXaGV0aGVyIHRoZSBtZXNzYWdlcyBsaXN0IGlzIG11dGFibGUKLSAgICogQHBhcmFtIHBhcmVudCBhIGxpc3RlbmVyIHRvIG5vdGlmeSBvZiBjaGFuZ2VzCi0gICAqIEBwYXJhbSBpc0NsZWFuIHdoZXRoZXIgdGhlIGJ1aWxkZXIgaXMgaW5pdGlhbGx5IG1hcmtlZCBjbGVhbgotICAgKi8KLSAgcHVibGljIFJlcGVhdGVkRmllbGRCdWlsZGVyKAotICAgICAgTGlzdDxNVHlwZT4gbWVzc2FnZXMsCi0gICAgICBib29sZWFuIGlzTWVzc2FnZXNMaXN0TXV0YWJsZSwKLSAgICAgIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQsCi0gICAgICBib29sZWFuIGlzQ2xlYW4pIHsKLSAgICB0aGlzLm1lc3NhZ2VzID0gbWVzc2FnZXM7Ci0gICAgdGhpcy5pc01lc3NhZ2VzTGlzdE11dGFibGUgPSBpc01lc3NhZ2VzTGlzdE11dGFibGU7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5pc0NsZWFuID0gaXNDbGVhbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgLy8gTnVsbCBvdXQgcGFyZW50IHNvIHdlIHN0b3Agc2VuZGluZyBpdCBpbnZhbGlkYXRpb25zLgotICAgIHBhcmVudCA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlcyB0aGF0IHRoZSBsaXN0IG9mIG1lc3NhZ2VzIGlzIG11dGFibGUgc28gaXQgY2FuIGJlIHVwZGF0ZWQuIElmIGl0J3MKLSAgICogaW1tdXRhYmxlLCBhIGNvcHkgaXMgbWFkZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKSB7Ci0gICAgaWYgKCFpc01lc3NhZ2VzTGlzdE11dGFibGUpIHsKLSAgICAgIG1lc3NhZ2VzID0gbmV3IEFycmF5TGlzdDxNVHlwZT4obWVzc2FnZXMpOwotICAgICAgaXNNZXNzYWdlc0xpc3RNdXRhYmxlID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRW5zdXJlcyB0aGF0IHRoZSBsaXN0IG9mIGJ1aWxkZXJzIGlzIG5vdCBudWxsLiBJZiBpdCdzIG51bGwsIHRoZSBsaXN0IGlzCi0gICAqIGNyZWF0ZWQgYW5kIGluaXRpYWxpemVkIHRvIGJlIHRoZSBzYW1lIHNpemUgYXMgdGhlIG1lc3NhZ2VzIGxpc3Qgd2l0aAotICAgKiBudWxsIGVudHJpZXMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZW5zdXJlQnVpbGRlcnMoKSB7Ci0gICAgaWYgKHRoaXMuYnVpbGRlcnMgPT0gbnVsbCkgewotICAgICAgdGhpcy5idWlsZGVycyA9Ci0gICAgICAgICAgbmV3IEFycmF5TGlzdDxTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4+KAotICAgICAgICAgICAgICBtZXNzYWdlcy5zaXplKCkpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgICBidWlsZGVycy5hZGQobnVsbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGNvdW50IG9mIGl0ZW1zIGluIHRoZSBsaXN0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBjb3VudCBvZiBpdGVtcyBpbiB0aGUgbGlzdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Q291bnQoKSB7Ci0gICAgcmV0dXJuIG1lc3NhZ2VzLnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIHdoZXRoZXIgdGhlIGxpc3QgaXMgZW1wdHkuCi0gICAqCi0gICAqIEByZXR1cm4gd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eQotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNFbXB0eSgpIHsKLSAgICByZXR1cm4gbWVzc2FnZXMuaXNFbXB0eSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWVzc2FnZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiB0aGUgbWVzc2FnZSBpcyBjdXJyZW50bHkgc3RvcmVkCi0gICAqIGFzIGEge0Bjb2RlIEJ1aWxkZXJ9LCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSB7QGNvZGUgTWVzc2FnZX0gYnkKLSAgICogY2FsbGluZyB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2J1aWxkUGFydGlhbH0gb24gaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0Ci0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICovCi0gIHB1YmxpYyBNVHlwZSBnZXRNZXNzYWdlKGludCBpbmRleCkgewotICAgIHJldHVybiBnZXRNZXNzYWdlKGluZGV4LCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIElmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBzdG9yZWQKLSAgICogYXMgYSB7QGNvZGUgQnVpbGRlcn0sIGl0IGlzIGNvbnZlcnRlZCB0byBhIHtAY29kZSBNZXNzYWdlfSBieQotICAgKiBjYWxsaW5nIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjYnVpbGRQYXJ0aWFsfSBvbiBpdC4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgbWVzc2FnZSB0byBnZXQKLSAgICogQHBhcmFtIGZvckJ1aWxkIHRoaXMgaXMgYmVpbmcgY2FsbGVkIGZvciBidWlsZCBzbyB3ZSB3YW50IHRvIG1ha2Ugc3VyZQotICAgKiAgICAgd2UgU2luZ2xlRmllbGRCdWlsZGVyLmJ1aWxkIHRvIHNlbmQgZGlydHkgaW52YWxpZGF0aW9ucwotICAgKiBAcmV0dXJuIHRoZSBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4Ci0gICAqLwotICBwcml2YXRlIE1UeXBlIGdldE1lc3NhZ2UoaW50IGluZGV4LCBib29sZWFuIGZvckJ1aWxkKSB7Ci0gICAgaWYgKHRoaXMuYnVpbGRlcnMgPT0gbnVsbCkgewotICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgYnVpbGRlcnMgLS0gcmV0dXJuIHRoZSBjdXJyZW50IE1lc3NhZ2UuCi0gICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIG5vIGJ1aWxkZXIgd2FzIGNyZWF0ZWQsIHNvIHdlIE1VU1QgaGF2ZSBhCi0gICAgICAvLyBNZXNzYWdlLgotICAgICAgcmV0dXJuIG1lc3NhZ2VzLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaW5kZXgpOwotICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBidWlsZGVyIC0tIHJldHVybiB0aGUgY3VycmVudCBtZXNzYWdlLgotICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkIGZvciB0aGUgZW50cnkgYXQgaW5kZXgsCi0gICAgICAvLyBzbyB3ZSBNVVNUIGhhdmUgYSBtZXNzYWdlLgotICAgICAgcmV0dXJuIG1lc3NhZ2VzLmdldChpbmRleCk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZvckJ1aWxkID8gYnVpbGRlci5idWlsZCgpIDogYnVpbGRlci5nZXRNZXNzYWdlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSBidWlsZGVyIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4LiBJZiBubyBidWlsZGVyIGhhcyBiZWVuIGNyZWF0ZWQgZm9yCi0gICAqIHRoYXQgaW5kZXgsIGEgYnVpbGRlciBpcyBjcmVhdGVkIG9uIGRlbWFuZCBieSBjYWxsaW5nCi0gICAqIHtAbGluayBNZXNzYWdlI3RvQnVpbGRlcn0uCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0Ci0gICAqIEByZXR1cm4gVGhlIGJ1aWxkZXIgZm9yIHRoYXQgaW5kZXgKLSAgICovCi0gIHB1YmxpYyBCVHlwZSBnZXRCdWlsZGVyKGludCBpbmRleCkgewotICAgIGVuc3VyZUJ1aWxkZXJzKCk7Ci0gICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaW5kZXgpOwotICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgIE1UeXBlIG1lc3NhZ2UgPSBtZXNzYWdlcy5nZXQoaW5kZXgpOwotICAgICAgYnVpbGRlciA9IG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4oCi0gICAgICAgICAgbWVzc2FnZSwgdGhpcywgaXNDbGVhbik7Ci0gICAgICBidWlsZGVycy5zZXQoaW5kZXgsIGJ1aWxkZXIpOwotICAgIH0KLSAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgYmFzZSBjbGFzcyBpbnRlcmZhY2UgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXguIFRoaXMgbWF5IGVpdGhlciBiZQotICAgKiBhIGJ1aWxkZXIgb3IgYSBtZXNzYWdlLiBJdCB3aWxsIHJldHVybiB3aGF0ZXZlciBpcyBtb3JlIGVmZmljaWVudC4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiB0aGUgbWVzc2FnZSB0byBnZXQKLSAgICogQHJldHVybiB0aGUgbWVzc2FnZSBvciBidWlsZGVyIGZvciB0aGUgaW5kZXggYXMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIElUeXBlIGdldE1lc3NhZ2VPckJ1aWxkZXIoaW50IGluZGV4KSB7Ci0gICAgaWYgKHRoaXMuYnVpbGRlcnMgPT0gbnVsbCkgewotICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhbnkgYnVpbGRlcnMgLS0gcmV0dXJuIHRoZSBjdXJyZW50IE1lc3NhZ2UuCi0gICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIG5vIGJ1aWxkZXIgd2FzIGNyZWF0ZWQsIHNvIHdlIE1VU1QgaGF2ZSBhCi0gICAgICAvLyBNZXNzYWdlLgotICAgICAgcmV0dXJuIChJVHlwZSkgbWVzc2FnZXMuZ2V0KGluZGV4KTsKLSAgICB9Ci0KLSAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9IGJ1aWxkZXJzLmdldChpbmRleCk7Ci0gICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgLy8gV2UgZG9uJ3QgaGF2ZSBhIGJ1aWxkZXIgLS0gcmV0dXJuIHRoZSBjdXJyZW50IG1lc3NhZ2UuCi0gICAgICAvLyBUaGlzIGlzIHRoZSBjYXNlIHdoZXJlIG5vIGJ1aWxkZXIgd2FzIGNyZWF0ZWQgZm9yIHRoZSBlbnRyeSBhdCBpbmRleCwKLSAgICAgIC8vIHNvIHdlIE1VU1QgaGF2ZSBhIG1lc3NhZ2UuCi0gICAgICByZXR1cm4gKElUeXBlKSBtZXNzYWdlcy5nZXQoaW5kZXgpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBidWlsZGVyLmdldE1lc3NhZ2VPckJ1aWxkZXIoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2V0cyBhICBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXggcmVwbGFjaW5nIHRoZSBleGlzdGluZyBpdGVtIGF0Ci0gICAqIHRoYXQgaW5kZXguCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggdG8gc2V0LgotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBzZXQKLSAgICogQHJldHVybiB0aGUgYnVpbGRlcgotICAgKi8KLSAgcHVibGljIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IHNldE1lc3NhZ2UoCi0gICAgICBpbnQgaW5kZXgsIE1UeXBlIG1lc3NhZ2UpIHsKLSAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7Ci0gICAgbWVzc2FnZXMuc2V0KGluZGV4LCBtZXNzYWdlKTsKLSAgICBpZiAoYnVpbGRlcnMgIT0gbnVsbCkgewotICAgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGVudHJ5ID0KLSAgICAgICAgICBidWlsZGVycy5zZXQoaW5kZXgsIG51bGwpOwotICAgICAgaWYgKGVudHJ5ICE9IG51bGwpIHsKLSAgICAgICAgZW50cnkuZGlzcG9zZSgpOwotICAgICAgfQotICAgIH0KLSAgICBvbkNoYW5nZWQoKTsKLSAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBBcHBlbmRzIHRoZSBzcGVjaWZpZWQgZWxlbWVudCB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdC4KLSAgICoKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkCi0gICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKLSAgICovCi0gIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBhZGRNZXNzYWdlKAotICAgICAgTVR5cGUgbWVzc2FnZSkgewotICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKLSAgICBtZXNzYWdlcy5hZGQobWVzc2FnZSk7Ci0gICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKLSAgICAgIGJ1aWxkZXJzLmFkZChudWxsKTsKLSAgICB9Ci0gICAgb25DaGFuZ2VkKCk7Ci0gICAgaW5jcmVtZW50TW9kQ291bnRzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogSW5zZXJ0cyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuCi0gICAqIFNoaWZ0cyB0aGUgZWxlbWVudCBjdXJyZW50bHkgYXQgdGhhdCBwb3NpdGlvbiAoaWYgYW55KSBhbmQgYW55IHN1YnNlcXVlbnQKLSAgICogZWxlbWVudHMgdG8gdGhlIHJpZ2h0IChhZGRzIG9uZSB0byB0aGVpciBpbmRpY2VzKS4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIG1lc3NhZ2UKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkCi0gICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKLSAgICovCi0gIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBhZGRNZXNzYWdlKAotICAgICAgaW50IGluZGV4LCBNVHlwZSBtZXNzYWdlKSB7Ci0gICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOwotICAgIG1lc3NhZ2VzLmFkZChpbmRleCwgbWVzc2FnZSk7Ci0gICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKLSAgICAgIGJ1aWxkZXJzLmFkZChpbmRleCwgbnVsbCk7Ci0gICAgfQotICAgIG9uQ2hhbmdlZCgpOwotICAgIGluY3JlbWVudE1vZENvdW50cygpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFwcGVuZHMgYWxsIG9mIHRoZSBtZXNzYWdlcyBpbiB0aGUgc3BlY2lmaWVkIGNvbGxlY3Rpb24gdG8gdGhlIGVuZCBvZgotICAgKiB0aGlzIGxpc3QsIGluIHRoZSBvcmRlciB0aGF0IHRoZXkgYXJlIHJldHVybmVkIGJ5IHRoZSBzcGVjaWZpZWQKLSAgICogY29sbGVjdGlvbidzIGl0ZXJhdG9yLgotICAgKgotICAgKiBAcGFyYW0gdmFsdWVzIHRoZSBtZXNzYWdlcyB0byBhZGQKLSAgICogQHJldHVybiB0aGUgYnVpbGRlcgotICAgKi8KLSAgcHVibGljIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGFkZEFsbE1lc3NhZ2VzKAotICAgICAgSXRlcmFibGU8PyBleHRlbmRzIE1UeXBlPiB2YWx1ZXMpIHsKLSAgICBmb3IgKGZpbmFsIE1UeXBlIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBjYW4gaW5zcGVjdCB0aGUgc2l6ZSwgd2UgY2FuIG1vcmUgZWZmaWNpZW50bHkgYWRkIG1lc3NhZ2VzLgotICAgIGludCBzaXplID0gLTE7Ci0gICAgaWYgKHZhbHVlcyBpbnN0YW5jZW9mIENvbGxlY3Rpb24pIHsKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBmaW5hbAotICAgICAgQ29sbGVjdGlvbjxNVHlwZT4gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uPE1UeXBlPikgdmFsdWVzOwotICAgICAgaWYgKGNvbGxlY3Rpb24uc2l6ZSgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICBzaXplID0gY29sbGVjdGlvbi5zaXplKCk7Ci0gICAgfQotICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOwotCi0gICAgaWYgKHNpemUgPj0gMCAmJiBtZXNzYWdlcyBpbnN0YW5jZW9mIEFycmF5TGlzdCkgewotICAgICAgKChBcnJheUxpc3Q8TVR5cGU+KSBtZXNzYWdlcykKLSAgICAgICAgICAuZW5zdXJlQ2FwYWNpdHkobWVzc2FnZXMuc2l6ZSgpICsgc2l6ZSk7Ci0gICAgfQotCi0gICAgZm9yIChNVHlwZSB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgYWRkTWVzc2FnZSh2YWx1ZSk7Ci0gICAgfQotCi0gICAgb25DaGFuZ2VkKCk7Ci0gICAgaW5jcmVtZW50TW9kQ291bnRzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogQXBwZW5kcyBhIG5ldyBidWlsZGVyIHRvIHRoZSBlbmQgb2YgdGhpcyBsaXN0IGFuZCByZXR1cm5zIHRoZSBidWlsZGVyLgotICAgKgotICAgKiBAcGFyYW0gbWVzc2FnZSB0aGUgbWVzc2FnZSB0byBhZGQgd2hpY2ggaXMgdGhlIGJhc2lzIG9mIHRoZSBidWlsZGVyCi0gICAqIEByZXR1cm4gdGhlIG5ldyBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgQlR5cGUgYWRkQnVpbGRlcihNVHlwZSBtZXNzYWdlKSB7Ci0gICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7Ci0gICAgZW5zdXJlQnVpbGRlcnMoKTsKLSAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9Ci0gICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4oCi0gICAgICAgICAgICBtZXNzYWdlLCB0aGlzLCBpc0NsZWFuKTsKLSAgICBtZXNzYWdlcy5hZGQobnVsbCk7Ci0gICAgYnVpbGRlcnMuYWRkKGJ1aWxkZXIpOwotICAgIG9uQ2hhbmdlZCgpOwotICAgIGluY3JlbWVudE1vZENvdW50cygpOwotICAgIHJldHVybiBidWlsZGVyLmdldEJ1aWxkZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnNlcnRzIGEgbmV3IGJ1aWxkZXIgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuCi0gICAqIFNoaWZ0cyB0aGUgZWxlbWVudCBjdXJyZW50bHkgYXQgdGhhdCBwb3NpdGlvbiAoaWYgYW55KSBhbmQgYW55IHN1YnNlcXVlbnQKLSAgICogZWxlbWVudHMgdG8gdGhlIHJpZ2h0IChhZGRzIG9uZSB0byB0aGVpciBpbmRpY2VzKS4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byBpbnNlcnQgdGhlIGJ1aWxkZXIKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkIHdoaWNoIGlzIHRoZSBiYXNpcyBvZiB0aGUgYnVpbGRlcgotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgQlR5cGUgYWRkQnVpbGRlcihpbnQgaW5kZXgsIE1UeXBlIG1lc3NhZ2UpIHsKLSAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKLSAgICBlbnN1cmVCdWlsZGVycygpOwotICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyID0KLSAgICAgICAgbmV3IFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPigKLSAgICAgICAgICAgIG1lc3NhZ2UsIHRoaXMsIGlzQ2xlYW4pOwotICAgIG1lc3NhZ2VzLmFkZChpbmRleCwgbnVsbCk7Ci0gICAgYnVpbGRlcnMuYWRkKGluZGV4LCBidWlsZGVyKTsKLSAgICBvbkNoYW5nZWQoKTsKLSAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKLSAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyB0aGUgZWxlbWVudCBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uIGluIHRoaXMgbGlzdC4gU2hpZnRzIGFueQotICAgKiBzdWJzZXF1ZW50IGVsZW1lbnRzIHRvIHRoZSBsZWZ0IChzdWJ0cmFjdHMgb25lIGZyb20gdGhlaXIgaW5kaWNlcykuCi0gICAqIFJldHVybnMgdGhlIGVsZW1lbnQgdGhhdCB3YXMgcmVtb3ZlZCBmcm9tIHRoZSBsaXN0LgotICAgKgotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IGF0IHdoaWNoIHRvIHJlbW92ZSB0aGUgbWVzc2FnZQotICAgKi8KLSAgcHVibGljIHZvaWQgcmVtb3ZlKGludCBpbmRleCkgewotICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOwotICAgIG1lc3NhZ2VzLnJlbW92ZShpbmRleCk7Ci0gICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKLSAgICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBlbnRyeSA9Ci0gICAgICAgICAgYnVpbGRlcnMucmVtb3ZlKGluZGV4KTsKLSAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgIGVudHJ5LmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb25DaGFuZ2VkKCk7Ci0gICAgaW5jcmVtZW50TW9kQ291bnRzKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVtb3ZlcyBhbGwgb2YgdGhlIGVsZW1lbnRzIGZyb20gdGhpcyBsaXN0LgotICAgKiBUaGUgbGlzdCB3aWxsIGJlIGVtcHR5IGFmdGVyIHRoaXMgY2FsbCByZXR1cm5zLgotICAgKi8KLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgbWVzc2FnZXMgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICBpc01lc3NhZ2VzTGlzdE11dGFibGUgPSBmYWxzZTsKLSAgICBpZiAoYnVpbGRlcnMgIT0gbnVsbCkgewotICAgICAgZm9yIChTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZW50cnkgOgotICAgICAgICAgIGJ1aWxkZXJzKSB7Ci0gICAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgZW50cnkuZGlzcG9zZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBidWlsZGVycyA9IG51bGw7Ci0gICAgfQotICAgIG9uQ2hhbmdlZCgpOwotICAgIGluY3JlbWVudE1vZENvdW50cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIEJ1aWxkcyB0aGUgbGlzdCBvZiBtZXNzYWdlcyBmcm9tIHRoZSBidWlsZGVyIGFuZCByZXR1cm5zIHRoZW0uCi0gICAqCi0gICAqIEByZXR1cm4gYW4gaW1tdXRhYmxlIGxpc3Qgb2YgbWVzc2FnZXMKLSAgICovCi0gIHB1YmxpYyBMaXN0PE1UeXBlPiBidWlsZCgpIHsKLSAgICAvLyBOb3cgdGhhdCBidWlsZCBoYXMgYmVlbiBjYWxsZWQsIHdlIGFyZSByZXF1aXJlZCB0byBkaXNwYXRjaAotICAgIC8vIGludmFsaWRhdGlvbnMuCi0gICAgaXNDbGVhbiA9IHRydWU7Ci0KLSAgICBpZiAoIWlzTWVzc2FnZXNMaXN0TXV0YWJsZSAmJiBidWlsZGVycyA9PSBudWxsKSB7Ci0gICAgICAvLyBXZSBzdGlsbCBoYXZlIGFuIGltbXV0YWJsZSBsaXN0IGFuZCB3ZSBuZXZlciBjcmVhdGVkIGEgYnVpbGRlci4KLSAgICAgIHJldHVybiBtZXNzYWdlczsKLSAgICB9Ci0KLSAgICBib29sZWFuIGFsbE1lc3NhZ2VzSW5TeW5jID0gdHJ1ZTsKLSAgICBpZiAoIWlzTWVzc2FnZXNMaXN0TXV0YWJsZSkgewotICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSBhbiBpbW11dGFibGUgbGlzdC4gTGV0J3Mgc2VlIGlmIGFueSBvZiB0aGVtIGFyZSBvdXQKLSAgICAgIC8vIG9mIHN5bmMgd2l0aCB0aGVpciBidWlsZGVycy4KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgTWVzc2FnZSBtZXNzYWdlID0gbWVzc2FnZXMuZ2V0KGkpOwotICAgICAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9IGJ1aWxkZXJzLmdldChpKTsKLSAgICAgICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgICAgIGlmIChidWlsZGVyLmJ1aWxkKCkgIT0gbWVzc2FnZSkgewotICAgICAgICAgICAgYWxsTWVzc2FnZXNJblN5bmMgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGFsbE1lc3NhZ2VzSW5TeW5jKSB7Ci0gICAgICAgIC8vIEltbXV0YWJsZSBsaXN0IGlzIHN0aWxsIGluIHN5bmMuCi0gICAgICAgIHJldHVybiBtZXNzYWdlczsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOZWVkIHRvIG1ha2Ugc3VyZSBtZXNzYWdlcyBpcyB1cCB0byBkYXRlCi0gICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlcy5zaXplKCk7IGkrKykgewotICAgICAgbWVzc2FnZXMuc2V0KGksIGdldE1lc3NhZ2UoaSwgdHJ1ZSkpOwotICAgIH0KLQotICAgIC8vIFdlJ3JlIGdvaW5nIHRvIHJldHVybiBvdXIgbGlzdCBhcyBpbW11dGFibGUgc28gd2UgbWFyayB0aGF0IHdlIGNhbgotICAgIC8vIG5vIGxvbmdlciB1cGRhdGUgaXQuCi0gICAgbWVzc2FnZXMgPSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1lc3NhZ2VzKTsKLSAgICBpc01lc3NhZ2VzTGlzdE11dGFibGUgPSBmYWxzZTsKLSAgICByZXR1cm4gbWVzc2FnZXM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBhIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIG1lc3NhZ2VzLiBUaGUgcmV0dXJuZWQgbGlzdCBpcyBsaXZlCi0gICAqIGFuZCB3aWxsIHJlZmxlY3QgYW55IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgYnVpbGRlci4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbWVzc2FnZXMgaW4gdGhlIGxpc3QKLSAgICovCi0gIHB1YmxpYyBMaXN0PE1UeXBlPiBnZXRNZXNzYWdlTGlzdCgpIHsKLSAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlTGlzdCA9PSBudWxsKSB7Ci0gICAgICBleHRlcm5hbE1lc3NhZ2VMaXN0ID0KLSAgICAgICAgICBuZXcgTWVzc2FnZUV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVybmFsTWVzc2FnZUxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyBhIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIGJ1aWxkZXJzLiBUaGlzIHJldHVybmVkIGxpc3QgaXMKLSAgICogbGl2ZSBhbmQgd2lsbCByZWZsZWN0IGFueSBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1aWxkZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGJ1aWxkZXJzIGluIHRoZSBsaXN0Ci0gICAqLwotICBwdWJsaWMgTGlzdDxCVHlwZT4gZ2V0QnVpbGRlckxpc3QoKSB7Ci0gICAgaWYgKGV4dGVybmFsQnVpbGRlckxpc3QgPT0gbnVsbCkgewotICAgICAgZXh0ZXJuYWxCdWlsZGVyTGlzdCA9Ci0gICAgICAgICAgbmV3IEJ1aWxkZXJFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4odGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBleHRlcm5hbEJ1aWxkZXJMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBNZXNzYWdlT3JCdWlsZGVycy4gVGhpcyByZXR1cm5lZAotICAgKiBsaXN0IGlzIGxpdmUgYW5kIHdpbGwgcmVmbGVjdCBhbnkgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBidWlsZGVyLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVycyBpbiB0aGUgbGlzdAotICAgKi8KLSAgcHVibGljIExpc3Q8SVR5cGU+IGdldE1lc3NhZ2VPckJ1aWxkZXJMaXN0KCkgewotICAgIGlmIChleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0ID09IG51bGwpIHsKLSAgICAgIGV4dGVybmFsTWVzc2FnZU9yQnVpbGRlckxpc3QgPQotICAgICAgICAgIG5ldyBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+KHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2hlbiBhIHRoZSBidWlsZGVyIG9yIG9uZSBvZiBpdHMgbmVzdGVkIGNoaWxkcmVuIGhhcyBjaGFuZ2VkCi0gICAqIGFuZCBhbnkgcGFyZW50IHNob3VsZCBiZSBub3RpZmllZCBvZiBpdHMgaW52YWxpZGF0aW9uLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIG9uQ2hhbmdlZCgpIHsKLSAgICBpZiAoaXNDbGVhbiAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgcGFyZW50Lm1hcmtEaXJ0eSgpOwotCi0gICAgICAvLyBEb24ndCBrZWVwIGRpc3BhdGNoaW5nIGludmFsaWRhdGlvbnMgdW50aWwgYnVpbGQgaXMgY2FsbGVkIGFnYWluLgotICAgICAgaXNDbGVhbiA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgb25DaGFuZ2VkKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5jcmVtZW50cyB0aGUgbW9kIGNvdW50cyBzbyB0aGF0IGFuIENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gY2FuCi0gICAqIGJlIHRocm93biBpZiBjYWxsaW5nIGNvZGUgdHJpZXMgdG8gbW9kaWZ5IHRoZSBidWlsZGVyIHdoaWxlIGl0cyBpdGVyYXRpbmcKLSAgICogdGhlIGxpc3QuCi0gICAqLwotICBwcml2YXRlIHZvaWQgaW5jcmVtZW50TW9kQ291bnRzKCkgewotICAgIGlmIChleHRlcm5hbE1lc3NhZ2VMaXN0ICE9IG51bGwpIHsKLSAgICAgIGV4dGVybmFsTWVzc2FnZUxpc3QuaW5jcmVtZW50TW9kQ291bnQoKTsKLSAgICB9Ci0gICAgaWYgKGV4dGVybmFsQnVpbGRlckxpc3QgIT0gbnVsbCkgewotICAgICAgZXh0ZXJuYWxCdWlsZGVyTGlzdC5pbmNyZW1lbnRNb2RDb3VudCgpOwotICAgIH0KLSAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdCAhPSBudWxsKSB7Ci0gICAgICBleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0LmluY3JlbWVudE1vZENvdW50KCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGEgbGl2ZSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBtZXNzYWdlcy4KLSAgICoKLSAgICogQHBhcmFtIDxNVHlwZT4gdGhlIHR5cGUgb2YgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSA8QlR5cGU+IHRoZSB0eXBlIG9mIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZAotICAgKiBAcGFyYW0gPElUeXBlPiB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgYW5kIHRoZSBidWlsZGVyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXNzYWdlRXh0ZXJuYWxMaXN0PAotICAgICAgTVR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLAotICAgICAgQlR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIsCi0gICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+Ci0gICAgICBleHRlbmRzIEFic3RyYWN0TGlzdDxNVHlwZT4gaW1wbGVtZW50cyBMaXN0PE1UeXBlPiB7Ci0KLSAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyOwotCi0gICAgTWVzc2FnZUV4dGVybmFsTGlzdCgKLSAgICAgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcikgewotICAgICAgdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gdGhpcy5idWlsZGVyLmdldENvdW50KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1UeXBlIGdldChpbnQgaW5kZXgpIHsKLSAgICAgIHJldHVybiBidWlsZGVyLmdldE1lc3NhZ2UoaW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50TW9kQ291bnQoKSB7Ci0gICAgICBtb2RDb3VudCsrOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBhIGxpdmUgdmlldyBvZiB0aGUgYnVpbGRlciBhcyBhIGxpc3Qgb2YgYnVpbGRlcnMuCi0gICAqCi0gICAqIEBwYXJhbSA8TVR5cGU+IHRoZSB0eXBlIG9mIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAotICAgKiBAcGFyYW0gPEJUeXBlPiB0aGUgdHlwZSBvZiBidWlsZGVyIGZvciB0aGUgZmllbGQKLSAgICogQHBhcmFtIDxJVHlwZT4gdGhlIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBtZXNzYWdlIGFuZCB0aGUgYnVpbGRlcgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgQnVpbGRlckV4dGVybmFsTGlzdDwKLSAgICAgIE1UeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZSwKLSAgICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAotICAgICAgSVR5cGUgZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyPgotICAgICAgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8QlR5cGU+IGltcGxlbWVudHMgTGlzdDxCVHlwZT4gewotCi0gICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcjsKLQotICAgIEJ1aWxkZXJFeHRlcm5hbExpc3QoCi0gICAgICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIpIHsKLSAgICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgcmV0dXJuIHRoaXMuYnVpbGRlci5nZXRDb3VudCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCVHlwZSBnZXQoaW50IGluZGV4KSB7Ci0gICAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKGluZGV4KTsKLSAgICB9Ci0KLSAgICB2b2lkIGluY3JlbWVudE1vZENvdW50KCkgewotICAgICAgbW9kQ291bnQrKzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgYSBsaXZlIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIGJ1aWxkZXJzLgotICAgKgotICAgKiBAcGFyYW0gPE1UeXBlPiB0aGUgdHlwZSBvZiBtZXNzYWdlIGZvciB0aGUgZmllbGQKLSAgICogQHBhcmFtIDxCVHlwZT4gdGhlIHR5cGUgb2YgYnVpbGRlciBmb3IgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSA8SVR5cGU+IHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciB0aGUgbWVzc2FnZSBhbmQgdGhlIGJ1aWxkZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIE1lc3NhZ2VPckJ1aWxkZXJFeHRlcm5hbExpc3Q8Ci0gICAgICBNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCi0gICAgICBCVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciwKLSAgICAgIElUeXBlIGV4dGVuZHMgTWVzc2FnZU9yQnVpbGRlcj4KLSAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaXN0PElUeXBlPiBpbXBsZW1lbnRzIExpc3Q8SVR5cGU+IHsKLQotICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXI7Ci0KLSAgICBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0KAotICAgICAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyKSB7Ci0gICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuZ2V0Q291bnQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSVR5cGUgZ2V0KGludCBpbmRleCkgewotICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0TWVzc2FnZU9yQnVpbGRlcihpbmRleCk7Ci0gICAgfQotCi0gICAgdm9pZCBpbmNyZW1lbnRNb2RDb3VudCgpIHsKLSAgICAgIG1vZENvdW50Kys7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmM2U5YmQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Sb3BlQnl0ZVN0cmluZy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODk2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkludmFsaWRPYmplY3RFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5Ob1N1Y2hFbGVtZW50RXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5TdGFjazsKLQotLyoqCi0gKiBDbGFzcyB0byByZXByZXNlbnQge0Bjb2RlIEJ5dGVTdHJpbmdzfSBmb3JtZWQgYnkgY29uY2F0ZW5hdGlvbiBvZiBvdGhlcgotICogQnl0ZVN0cmluZ3MsIHdpdGhvdXQgY29weWluZyB0aGUgZGF0YSBpbiB0aGUgcGllY2VzLiBUaGUgY29uY2F0ZW5hdGlvbiBpcwotICogcmVwcmVzZW50ZWQgYXMgYSB0cmVlIHdob3NlIGxlYWYgbm9kZXMgYXJlIGVhY2ggYQotICoge0BsaW5rIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5MZWFmQnl0ZVN0cmluZ30uCi0gKgotICogPHA+TW9zdCBvZiB0aGUgb3BlcmF0aW9uIGhlcmUgaXMgaW5zcGlyZWQgYnkgdGhlIG5vdy1mYW1vdXMgcGFwZXIgPGEKLSAqIGhyZWY9Imh0dHBzOi8vd2ViLmFyY2hpdmUub3JnL3dlYi8yMDA2MDIwMjAxNTQ1Ni9odHRwOi8vd3d3LmNzLnViYy5jYS9sb2NhbC9yZWFkaW5nL3Byb2NlZWRpbmdzL3NwZTkxLTk1L3NwZS92b2wyNS9pc3N1ZTEyL3NwZTk4Ni5wZGYiPgotICogQkFQOTUgPC9hPiBSb3BlczogYW4gQWx0ZXJuYXRpdmUgdG8gU3RyaW5ncyBoYW5zLWouIGJvZWhtLCBydXNzIGF0a2luc29uIGFuZAotICogbWljaGFlbCBwbGFzcwotICoKLSAqIDxwPlRoZSBhbGdvcml0aG1zIGRlc2NyaWJlZCBpbiB0aGUgcGFwZXIgaGF2ZSBiZWVuIGltcGxlbWVudGVkIGZvciBjaGFyYWN0ZXIKLSAqIHN0cmluZ3MgaW4ge0Bjb2RlIGNvbS5nb29nbGUuY29tbW9uLnN0cmluZy5Sb3BlfSBhbmQgaW4gdGhlIGMrKyBjbGFzcyB7QGNvZGUKLSAqIGNvcmQuY2N9LgotICoKLSAqIDxwPkZ1bmRhbWVudGFsbHkgdGhlIFJvcGUgYWxnb3JpdGhtIHJlcHJlc2VudHMgdGhlIGNvbGxlY3Rpb24gb2YgcGllY2VzIGFzIGEKLSAqIGJpbmFyeSB0cmVlLiBCQVA5NSB1c2VzIGEgRmlib25hY2NpIGJvdW5kIHJlbGF0aW5nIGRlcHRoIHRvIGEgbWluaW11bQotICogc2VxdWVuY2UgbGVuZ3RoLCBzZXF1ZW5jZXMgdGhhdCBhcmUgdG9vIHNob3J0IHJlbGF0aXZlIHRvIHRoZWlyIGRlcHRoIGNhdXNlIGEKLSAqIHRyZWUgcmViYWxhbmNlLiAgTW9yZSBwcmVjaXNlbHksIGEgdHJlZSBvZiBkZXB0aCBkIGlzICJiYWxhbmNlZCIgaW4gdGhlCi0gKiB0ZXJtaW5vbG9neSBvZiBCQVA5NSBpZiBpdHMgbGVuZ3RoIGlzIGF0IGxlYXN0IEYoZCsyKSwgd2hlcmUgRihuKSBpcyB0aGUKLSAqIG4tdGhlIEZpYm9uYWNjaSBudW1iZXIuIFRodXMgZm9yIGRlcHRocyAwLCAxLCAyLCAzLCA0LCA1LC4uLiB3ZSBoYXZlIG1pbmltdW0KLSAqIGxlbmd0aHMgMSwgMiwgMywgNSwgOCwgMTMsLi4uCi0gKgotICogQGF1dGhvciBjYXJsYW50b25AZ29vZ2xlLmNvbSAoQ2FybCBIYXZlcmwpCi0gKi8KLWZpbmFsIGNsYXNzIFJvcGVCeXRlU3RyaW5nIGV4dGVuZHMgQnl0ZVN0cmluZyB7Ci0KLSAgLyoqCi0gICAqIEJBUDk1LiBMZXQgRm4gYmUgdGhlIG50aCBGaWJvbmFjY2kgbnVtYmVyLiBBIHtAbGluayBSb3BlQnl0ZVN0cmluZ30gb2YKLSAgICogZGVwdGggbiBpcyAiYmFsYW5jZWQiLCBpLmUgZmxhdCBlbm91Z2gsIGlmIGl0cyBsZW5ndGggaXMgYXQgbGVhc3QgRm4rMiwKLSAgICogZS5nLiBhICJiYWxhbmNlZCIge0BsaW5rIFJvcGVCeXRlU3RyaW5nfSBvZiBkZXB0aCAxIG11c3QgaGF2ZSBsZW5ndGggYXQKLSAgICogbGVhc3QgMiwgb2YgZGVwdGggNCBtdXN0IGhhdmUgbGVuZ3RoID49IDgsIGV0Yy4KLSAgICoKLSAgICogPHA+VGhlcmUncyBub3RoaW5nIHNwZWNpYWwgYWJvdXQgdXNpbmcgdGhlIEZpYm9uYWNjaSBudW1iZXJzIGZvciB0aGlzLCBidXQKLSAgICogdGhleSBhcmUgYSByZWFzb25hYmxlIHNlcXVlbmNlIGZvciBlbmNhcHN1bGF0aW5nIHRoZSBpZGVhIHRoYXQgd2UgYXJlIE9LCi0gICAqIHdpdGggbG9uZ2VyIHN0cmluZ3MgYmVpbmcgZW5jb2RlZCBpbiBkZWVwZXIgYmluYXJ5IHRyZWVzLgotICAgKgotICAgKiA8cD5Gb3IgMzItYml0IGludGVnZXJzLCB0aGlzIGFycmF5IGhhcyBsZW5ndGggNDYuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnRbXSBtaW5MZW5ndGhCeURlcHRoOwotCi0gIHN0YXRpYyB7Ci0gICAgLy8gRHluYW1pY2FsbHkgZ2VuZXJhdGUgdGhlIGxpc3Qgb2YgRmlib25hY2NpIG51bWJlcnMgdGhlIGZpcnN0IHRpbWUgdGhpcwotICAgIC8vIGNsYXNzIGlzIGFjY2Vzc2VkLgotICAgIExpc3Q8SW50ZWdlcj4gbnVtYmVycyA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLQotICAgIC8vIHdlIHNraXAgdGhlIGZpcnN0IEZpYm9uYWNjaSBudW1iZXIgKDEpLiAgU28gaW5zdGVhZCBvZjogMSAxIDIgMyA1IDggLi4uCi0gICAgLy8gd2UgaGF2ZTogMSAyIDMgNSA4IC4uLgotICAgIGludCBmMSA9IDE7Ci0gICAgaW50IGYyID0gMTsKLQotICAgIC8vIGdldCBhbGwgdGhlIHZhbHVlcyB1bnRpbCB3ZSByb2xsIG92ZXIuCi0gICAgd2hpbGUgKGYyID4gMCkgewotICAgICAgbnVtYmVycy5hZGQoZjIpOwotICAgICAgaW50IHRlbXAgPSBmMSArIGYyOwotICAgICAgZjEgPSBmMjsKLSAgICAgIGYyID0gdGVtcDsKLSAgICB9Ci0KLSAgICAvLyB3ZSBpbmNsdWRlIHRoaXMgaGVyZSBzbyB0aGF0IHdlIGNhbiBpbmRleCB0aGlzIGFycmF5IHRvIFt4ICsgMV0gaW4gdGhlCi0gICAgLy8gbG9vcHMgYmVsb3cuCi0gICAgbnVtYmVycy5hZGQoSW50ZWdlci5NQVhfVkFMVUUpOwotICAgIG1pbkxlbmd0aEJ5RGVwdGggPSBuZXcgaW50W251bWJlcnMuc2l6ZSgpXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pbkxlbmd0aEJ5RGVwdGgubGVuZ3RoOyBpKyspIHsKLSAgICAgIC8vIHVuYm94IGFsbCB0aGUgdmFsdWVzCi0gICAgICBtaW5MZW5ndGhCeURlcHRoW2ldID0gbnVtYmVycy5nZXQoaSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBpbnQgdG90YWxMZW5ndGg7Ci0gIHByaXZhdGUgZmluYWwgQnl0ZVN0cmluZyBsZWZ0OwotICBwcml2YXRlIGZpbmFsIEJ5dGVTdHJpbmcgcmlnaHQ7Ci0gIHByaXZhdGUgZmluYWwgaW50IGxlZnRMZW5ndGg7Ci0gIHByaXZhdGUgZmluYWwgaW50IHRyZWVEZXB0aDsKLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IFJvcGVCeXRlU3RyaW5nLCB3aGljaCBjYW4gYmUgdGhvdWdodCBvZiBhcyBhIG5ldyB0cmVlIG5vZGUsIGJ5Ci0gICAqIHJlY29yZGluZyByZWZlcmVuY2VzIHRvIHRoZSB0d28gZ2l2ZW4gc3RyaW5ncy4KLSAgICoKLSAgICogQHBhcmFtIGxlZnQgIHN0cmluZyBvbiB0aGUgbGVmdCBvZiB0aGlzIG5vZGUsIHNob3VsZCBoYXZlIHtAY29kZSBzaXplKCkgPgotICAgKiAgICAgICAgICAgICAgMH0KLSAgICogQHBhcmFtIHJpZ2h0IHN0cmluZyBvbiB0aGUgcmlnaHQgb2YgdGhpcyBub2RlLCBzaG91bGQgaGF2ZSB7QGNvZGUgc2l6ZSgpID4KLSAgICogICAgICAgICAgICAgIDB9Ci0gICAqLwotICBwcml2YXRlIFJvcGVCeXRlU3RyaW5nKEJ5dGVTdHJpbmcgbGVmdCwgQnl0ZVN0cmluZyByaWdodCkgewotICAgIHRoaXMubGVmdCA9IGxlZnQ7Ci0gICAgdGhpcy5yaWdodCA9IHJpZ2h0OwotICAgIGxlZnRMZW5ndGggPSBsZWZ0LnNpemUoKTsKLSAgICB0b3RhbExlbmd0aCA9IGxlZnRMZW5ndGggKyByaWdodC5zaXplKCk7Ci0gICAgdHJlZURlcHRoID0gTWF0aC5tYXgobGVmdC5nZXRUcmVlRGVwdGgoKSwgcmlnaHQuZ2V0VHJlZURlcHRoKCkpICsgMTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25jYXRlbmF0ZSB0aGUgZ2l2ZW4gc3RyaW5ncyB3aGlsZSBwZXJmb3JtaW5nIHZhcmlvdXMgb3B0aW1pemF0aW9ucyB0bwotICAgKiBzbG93IHRoZSBncm93dGggcmF0ZSBvZiB0cmVlIGRlcHRoIGFuZCB0cmVlIG5vZGUgY291bnQuIFRoZSByZXN1bHQgaXMKLSAgICogZWl0aGVyIGEge0BsaW5rIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5MZWFmQnl0ZVN0cmluZ30gb3IgYQotICAgKiB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9IGRlcGVuZGluZyBvbiB3aGljaCBvcHRpbWl6YXRpb25zLCBpZiBhbnksIHdlcmUKLSAgICogYXBwbGllZC4KLSAgICoKLSAgICogPHA+U21hbGwgcGllY2VzIG9mIGxlbmd0aCBsZXNzIHRoYW4ge0BsaW5rCi0gICAqIEJ5dGVTdHJpbmcjQ09OQ0FURU5BVEVfQllfQ09QWV9TSVpFfSBtYXkgYmUgY29waWVkIGJ5IHZhbHVlIGhlcmUsIGFzIGluCi0gICAqIEJBUDk1LiAgTGFyZ2UgcGllY2VzIGFyZSByZWZlcmVuY2VkIHdpdGhvdXQgY29weS4KLSAgICoKLSAgICogQHBhcmFtIGxlZnQgIHN0cmluZyBvbiB0aGUgbGVmdAotICAgKiBAcGFyYW0gcmlnaHQgc3RyaW5nIG9uIHRoZSByaWdodAotICAgKiBAcmV0dXJuIGNvbmNhdGVuYXRpb24gcmVwcmVzZW50aW5nIHRoZSBzYW1lIHNlcXVlbmNlIGFzIHRoZSBnaXZlbiBzdHJpbmdzCi0gICAqLwotICBzdGF0aWMgQnl0ZVN0cmluZyBjb25jYXRlbmF0ZShCeXRlU3RyaW5nIGxlZnQsIEJ5dGVTdHJpbmcgcmlnaHQpIHsKLSAgICBpZiAocmlnaHQuc2l6ZSgpID09IDApIHsKLSAgICAgIHJldHVybiBsZWZ0OwotICAgIH0KLQotICAgIGlmIChsZWZ0LnNpemUoKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gcmlnaHQ7Ci0gICAgfQotCi0gICAgZmluYWwgaW50IG5ld0xlbmd0aCA9IGxlZnQuc2l6ZSgpICsgcmlnaHQuc2l6ZSgpOwotICAgIGlmIChuZXdMZW5ndGggPCBCeXRlU3RyaW5nLkNPTkNBVEVOQVRFX0JZX0NPUFlfU0laRSkgewotICAgICAgLy8gT3B0aW1pemF0aW9uIGZyb20gQkFQOTU6IEZvciBzaG9ydCAobGVhdmVzIGluIHBhcGVyLCBidXQganVzdCBzaG9ydAotICAgICAgLy8gaGVyZSkgdG90YWwgbGVuZ3RoLCBkbyBhIGNvcHkgb2YgZGF0YSB0byBhIG5ldyBsZWFmLgotICAgICAgcmV0dXJuIGNvbmNhdGVuYXRlQnl0ZXMobGVmdCwgcmlnaHQpOwotICAgIH0KLQotICAgIGlmIChsZWZ0IGluc3RhbmNlb2YgUm9wZUJ5dGVTdHJpbmcpIHsKLSAgICAgIGZpbmFsIFJvcGVCeXRlU3RyaW5nIGxlZnRSb3BlID0gKFJvcGVCeXRlU3RyaW5nKSBsZWZ0OwotICAgICAgaWYgKGxlZnRSb3BlLnJpZ2h0LnNpemUoKSArIHJpZ2h0LnNpemUoKSA8IENPTkNBVEVOQVRFX0JZX0NPUFlfU0laRSkgewotICAgICAgICAvLyBPcHRpbWl6YXRpb24gZnJvbSBCQVA5NTogQXMgYW4gb3B0aW1pemF0aW9uIG9mIHRoZSBjYXNlIHdoZXJlIHRoZQotICAgICAgICAvLyBCeXRlU3RyaW5nIGlzIGNvbnN0cnVjdGVkIGJ5IHJlcGVhdGVkIGNvbmNhdGVuYXRlLCByZWNvZ25pemUgdGhlIGNhc2UKLSAgICAgICAgLy8gd2hlcmUgYSBzaG9ydCBzdHJpbmcgaXMgY29uY2F0ZW5hdGVkIHRvIGEgbGVmdC1oYW5kIG5vZGUgd2hvc2UKLSAgICAgICAgLy8gcmlnaHQtaGFuZCBicmFuY2ggaXMgc2hvcnQuICBJbiB0aGUgcGFwZXIgdGhpcyBhcHBsaWVzIHRvIGxlYXZlcywgYnV0Ci0gICAgICAgIC8vIHdlIGp1c3QgbG9vayBhdCB0aGUgbGVuZ3RoIGhlcmUuIFRoaXMgaGFzIHRoZSBhZHZhbnRhZ2Ugb2Ygc2hlZGRpbmcKLSAgICAgICAgLy8gcmVmZXJlbmNlcyB0byB1bm5lZWRlZCBkYXRhIHdoZW4gc3Vic3RyaW5ncyBoYXZlIGJlZW4gdGFrZW4uCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdoZW4gd2UgcmVjb2duaXplIHRoaXMgY2FzZSwgd2UgZG8gYSBjb3B5IG9mIHRoZSBkYXRhIGFuZCBjcmVhdGUgYQotICAgICAgICAvLyBuZXcgcGFyZW50IG5vZGUgc28gdGhhdCB0aGUgZGVwdGggb2YgdGhlIHJlc3VsdCBpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICAgICAgLy8gZ2l2ZW4gbGVmdCB0cmVlLgotICAgICAgICBCeXRlU3RyaW5nIG5ld1JpZ2h0ID0gY29uY2F0ZW5hdGVCeXRlcyhsZWZ0Um9wZS5yaWdodCwgcmlnaHQpOwotICAgICAgICByZXR1cm4gbmV3IFJvcGVCeXRlU3RyaW5nKGxlZnRSb3BlLmxlZnQsIG5ld1JpZ2h0KTsKLSAgICAgIH0KLQotICAgICAgaWYgKGxlZnRSb3BlLmxlZnQuZ2V0VHJlZURlcHRoKCkgPiBsZWZ0Um9wZS5yaWdodC5nZXRUcmVlRGVwdGgoKQotICAgICAgICAgICYmIGxlZnRSb3BlLmdldFRyZWVEZXB0aCgpID4gcmlnaHQuZ2V0VHJlZURlcHRoKCkpIHsKLSAgICAgICAgLy8gVHlwaWNhbGx5IGZvciBjb25jYXRlbmF0ZS1idWlsdCBzdHJpbmdzIHRoZSBsZWZ0LXNpZGUgaXMgZGVlcGVyIHRoYW4KLSAgICAgICAgLy8gdGhlIHJpZ2h0LiAgVGhpcyBpcyBvdXIgZmluYWwgYXR0ZW1wdCB0byBjb25jYXRlbmF0ZSB3aXRob3V0Ci0gICAgICAgIC8vIGluY3JlYXNpbmcgdGhlIHRyZWUgZGVwdGguICBXZSdsbCByZWRvIHRoZSBub2RlIG9uIHRoZSBSSFMuICBUaGlzCi0gICAgICAgIC8vIGlzIHlldCBhbm90aGVyIG9wdGltaXphdGlvbiBmb3IgYnVpbGRpbmcgdGhlIHN0cmluZyBieSByZXBlYXRlZGx5Ci0gICAgICAgIC8vIGNvbmNhdGVuYXRpbmcgb24gdGhlIHJpZ2h0LgotICAgICAgICBCeXRlU3RyaW5nIG5ld1JpZ2h0ID0gbmV3IFJvcGVCeXRlU3RyaW5nKGxlZnRSb3BlLnJpZ2h0LCByaWdodCk7Ci0gICAgICAgIHJldHVybiBuZXcgUm9wZUJ5dGVTdHJpbmcobGVmdFJvcGUubGVmdCwgbmV3UmlnaHQpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEZpbmUsIHdlJ2xsIGFkZCBhIG5vZGUgYW5kIGluY3JlYXNlIHRoZSB0cmVlIGRlcHRoLS11bmxlc3Mgd2UgcmViYWxhbmNlIDteKQotICAgIGludCBuZXdEZXB0aCA9IE1hdGgubWF4KGxlZnQuZ2V0VHJlZURlcHRoKCksIHJpZ2h0LmdldFRyZWVEZXB0aCgpKSArIDE7Ci0gICAgaWYgKG5ld0xlbmd0aCA+PSBtaW5MZW5ndGhCeURlcHRoW25ld0RlcHRoXSkgewotICAgICAgLy8gVGhlIHRyZWUgaXMgc2hhbGxvdyBlbm91Z2gsIHNvIGRvbid0IHJlYmFsYW5jZQotICAgICAgcmV0dXJuIG5ldyBSb3BlQnl0ZVN0cmluZyhsZWZ0LCByaWdodCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIG5ldyBCYWxhbmNlcigpLmJhbGFuY2UobGVmdCwgcmlnaHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbmNhdGVuYXRlcyB0d28gc3RyaW5ncyBieSBjb3B5aW5nIGRhdGEgdmFsdWVzLiBUaGlzIGlzIGNhbGxlZCBpbiBhIGZldwotICAgKiBjYXNlcyBpbiBvcmRlciB0byByZWR1Y2UgdGhlIGdyb3d0aCBvZiB0aGUgbnVtYmVyIG9mIHRyZWUgbm9kZXMuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0ICBzdHJpbmcgb24gdGhlIGxlZnQKLSAgICogQHBhcmFtIHJpZ2h0IHN0cmluZyBvbiB0aGUgcmlnaHQKLSAgICogQHJldHVybiBzdHJpbmcgZm9ybWVkIGJ5IGNvcHlpbmcgZGF0YSBieXRlcwotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBjb25jYXRlbmF0ZUJ5dGVzKEJ5dGVTdHJpbmcgbGVmdCwKLSAgICAgIEJ5dGVTdHJpbmcgcmlnaHQpIHsKLSAgICBpbnQgbGVmdFNpemUgPSBsZWZ0LnNpemUoKTsKLSAgICBpbnQgcmlnaHRTaXplID0gcmlnaHQuc2l6ZSgpOwotICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2xlZnRTaXplICsgcmlnaHRTaXplXTsKLSAgICBsZWZ0LmNvcHlUbyhieXRlcywgMCwgMCwgbGVmdFNpemUpOwotICAgIHJpZ2h0LmNvcHlUbyhieXRlcywgMCwgbGVmdFNpemUsIHJpZ2h0U2l6ZSk7Ci0gICAgcmV0dXJuIEJ5dGVTdHJpbmcud3JhcChieXRlcyk7ICAvLyBDb25zdHJ1Y3RvciB3cmFwcyBieXRlcwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBSb3BlQnl0ZVN0cmluZyBmb3IgdGVzdGluZyBvbmx5IHdoaWxlIGJ5cGFzc2luZyBhbGwgdGhlCi0gICAqIGRlZmVuc2VzIG9mIHtAbGluayAjY29uY2F0ZW5hdGUoQnl0ZVN0cmluZywgQnl0ZVN0cmluZyl9LiBUaGlzIGFsbG93cwotICAgKiB0ZXN0aW5nIHRyZWVzIG9mIHNwZWNpZmljIHN0cnVjdHVyZS4gV2UgYXJlIGFsc28gYWJsZSB0byBpbnNlcnQgZW1wdHkKLSAgICogbGVhdmVzLCB0aG91Z2ggdGhlc2UgYXJlIGRpcy1hbGxvd2VkLCBzbyB0aGF0IHdlIGNhbiBtYWtlIHN1cmUgdGhlCi0gICAqIGltcGxlbWVudGF0aW9uIGNhbiB3aXRoc3RhbmQgdGhlaXIgcHJlc2VuY2UuCi0gICAqCi0gICAqIEBwYXJhbSBsZWZ0ICBzdHJpbmcgb24gdGhlIGxlZnQgb2YgdGhpcyBub2RlCi0gICAqIEBwYXJhbSByaWdodCBzdHJpbmcgb24gdGhlIHJpZ2h0IG9mIHRoaXMgbm9kZQotICAgKiBAcmV0dXJuIGFuIHVuc2FmZSBpbnN0YW5jZSBmb3IgdGVzdGluZyBvbmx5Ci0gICAqLwotICBzdGF0aWMgUm9wZUJ5dGVTdHJpbmcgbmV3SW5zdGFuY2VGb3JUZXN0KEJ5dGVTdHJpbmcgbGVmdCwgQnl0ZVN0cmluZyByaWdodCkgewotICAgIHJldHVybiBuZXcgUm9wZUJ5dGVTdHJpbmcobGVmdCwgcmlnaHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGJ5dGUgYXQgdGhlIGdpdmVuIGluZGV4LgotICAgKiBUaHJvd3Mge0BsaW5rIEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0gZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5Ci0gICAqIHJlYXNvbnMgYWx0aG91Z2ggaXQgd291bGQgbW9yZSBwcm9wZXJseSBiZSB7QGxpbmsKLSAgICogSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbn0uCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCBpbmRleCBvZiBieXRlCi0gICAqIEByZXR1cm4gdGhlIHZhbHVlCi0gICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHtAY29kZSBpbmRleH0gaXMgPCAwIG9yID49IHNpemUKLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYnl0ZSBieXRlQXQoaW50IGluZGV4KSB7Ci0gICAgY2hlY2tJbmRleChpbmRleCwgdG90YWxMZW5ndGgpOwotCi0gICAgLy8gRmluZCB0aGUgcmVsZXZhbnQgcGllY2UgYnkgcmVjdXJzaXZlIGRlc2NlbnQKLSAgICBpZiAoaW5kZXggPCBsZWZ0TGVuZ3RoKSB7Ci0gICAgICByZXR1cm4gbGVmdC5ieXRlQXQoaW5kZXgpOwotICAgIH0KLQotICAgIHJldHVybiByaWdodC5ieXRlQXQoaW5kZXggLSBsZWZ0TGVuZ3RoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgcmV0dXJuIHRvdGFsTGVuZ3RoOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gUGllY2VzCi0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCBpbnQgZ2V0VHJlZURlcHRoKCkgewotICAgIHJldHVybiB0cmVlRGVwdGg7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGUgdHJlZSBpcyBiYWxhbmNlZCBhY2NvcmRpbmcgdG8gQkFQOTUsIHdoaWNoIG1lYW5zIHRoZSB0cmVlCi0gICAqIGlzIGZsYXQtZW5vdWdoIHdpdGggcmVzcGVjdCB0byB0aGUgYm91bmRzLiBOb3RlIHRoYXQgdGhpcyBkZWZpbml0aW9uIG9mCi0gICAqIGJhbGFuY2VkIGlzIG9uZSB3aGVyZSBzdWItdHJlZXMgb2YgYmFsYW5jZWQgdHJlZXMgYXJlIG5vdCBuZWNlc3NhcmlseQotICAgKiBiYWxhbmNlZC4KLSAgICoKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB0cmVlIGlzIGJhbGFuY2VkCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGJvb2xlYW4gaXNCYWxhbmNlZCgpIHsKLSAgICByZXR1cm4gdG90YWxMZW5ndGggPj0gbWluTGVuZ3RoQnlEZXB0aFt0cmVlRGVwdGhdOwotICB9Ci0KLSAgLyoqCi0gICAqIFRha2VzIGEgc3Vic3RyaW5nIG9mIHRoaXMgb25lLiBUaGlzIGludm9sdmVzIHJlY3Vyc2l2ZSBkZXNjZW50IGFsb25nIHRoZQotICAgKiBsZWZ0IGFuZCByaWdodCBlZGdlcyBvZiB0aGUgc3Vic3RyaW5nLCBhbmQgcmVmZXJlbmNpbmcgYW55IHdob2xseSBjb250YWluZWQKLSAgICogc2VnbWVudHMgaW4gYmV0d2Vlbi4gQW55IGxlYWYgbm9kZXMgZW50aXJlbHkgdW5pbnZvbHZlZCBpbiB0aGUgc3Vic3RyaW5nCi0gICAqIHdpbGwgbm90IGJlIHJlZmVyZW5jZWQgYnkgdGhlIHN1YnN0cmluZy4KLSAgICoKLSAgICogPHA+U3Vic3RyaW5ncyBvZiB7QGNvZGUgbGVuZ3RoIDwgMn0gc2hvdWxkIHJlc3VsdCBpbiBhdCBtb3N0IGEgc2luZ2xlCi0gICAqIHJlY3Vyc2l2ZSBjYWxsIGNoYWluLCB0ZXJtaW5hdGluZyBhdCBhIGxlYWYgbm9kZS4gVGh1cyB0aGUgcmVzdWx0IHdpbGwgYmUgYQotICAgKiB7QGxpbmsgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLkxlYWZCeXRlU3RyaW5nfS4KLSAgICoKLSAgICogQHBhcmFtIGJlZ2luSW5kZXggc3RhcnQgYXQgdGhpcyBpbmRleAotICAgKiBAcGFyYW0gZW5kSW5kZXggICB0aGUgbGFzdCBjaGFyYWN0ZXIgaXMgdGhlIG9uZSBiZWZvcmUgdGhpcyBpbmRleAotICAgKiBAcmV0dXJuIHN1YnN0cmluZyBsZWFmIG5vZGUgb3IgdHJlZQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBCeXRlU3RyaW5nIHN1YnN0cmluZyhpbnQgYmVnaW5JbmRleCwgaW50IGVuZEluZGV4KSB7Ci0gICAgZmluYWwgaW50IGxlbmd0aCA9IGNoZWNrUmFuZ2UoYmVnaW5JbmRleCwgZW5kSW5kZXgsIHRvdGFsTGVuZ3RoKTsKLQotICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgLy8gRW1wdHkgc3Vic3RyaW5nCi0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5FTVBUWTsKLSAgICB9Ci0KLSAgICBpZiAobGVuZ3RoID09IHRvdGFsTGVuZ3RoKSB7Ci0gICAgICAvLyBUaGUgd2hvbGUgc3RyaW5nCi0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvLyBQcm9wZXIgc3Vic3RyaW5nCi0gICAgaWYgKGVuZEluZGV4IDw9IGxlZnRMZW5ndGgpIHsKLSAgICAgIC8vIFN1YnN0cmluZyBvbiB0aGUgbGVmdAotICAgICAgcmV0dXJuIGxlZnQuc3Vic3RyaW5nKGJlZ2luSW5kZXgsIGVuZEluZGV4KTsKLSAgICB9Ci0KLSAgICBpZiAoYmVnaW5JbmRleCA+PSBsZWZ0TGVuZ3RoKSB7Ci0gICAgICAvLyBTdWJzdHJpbmcgb24gdGhlIHJpZ2h0Ci0gICAgICByZXR1cm4gcmlnaHQuc3Vic3RyaW5nKGJlZ2luSW5kZXggLSBsZWZ0TGVuZ3RoLCBlbmRJbmRleCAtIGxlZnRMZW5ndGgpOwotICAgIH0KLQotICAgIC8vIFNwbGl0IHN1YnN0cmluZwotICAgIEJ5dGVTdHJpbmcgbGVmdFN1YiA9IGxlZnQuc3Vic3RyaW5nKGJlZ2luSW5kZXgpOwotICAgIEJ5dGVTdHJpbmcgcmlnaHRTdWIgPSByaWdodC5zdWJzdHJpbmcoMCwgZW5kSW5kZXggLSBsZWZ0TGVuZ3RoKTsKLSAgICAvLyBJbnRlbnRpb25hbGx5IG5vdCByZWJhbGFuY2luZywgc2luY2UgaW4gbWFueSBjYXNlcyB0aGVzZSB0d28KLSAgICAvLyBzdWJzdHJpbmdzIHdpbGwgYWxyZWFkeSBiZSBsZXNzIGRlZXAgdGhhbiB0aGUgdG9wLWxldmVsCi0gICAgLy8gUm9wZUJ5dGVTdHJpbmcgd2UncmUgdGFraW5nIGEgc3Vic3RyaW5nIG9mLgotICAgIHJldHVybiBuZXcgUm9wZUJ5dGVTdHJpbmcobGVmdFN1YiwgcmlnaHRTdWIpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gQnl0ZVN0cmluZyAtPiBieXRlW10KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgY29weVRvSW50ZXJuYWwoYnl0ZVtdIHRhcmdldCwgaW50IHNvdXJjZU9mZnNldCwKLSAgICAgIGludCB0YXJnZXRPZmZzZXQsIGludCBudW1iZXJUb0NvcHkpIHsKLSAgIGlmIChzb3VyY2VPZmZzZXQgKyBudW1iZXJUb0NvcHkgPD0gbGVmdExlbmd0aCkgewotICAgICAgbGVmdC5jb3B5VG9JbnRlcm5hbCh0YXJnZXQsIHNvdXJjZU9mZnNldCwgdGFyZ2V0T2Zmc2V0LCBudW1iZXJUb0NvcHkpOwotICAgIH0gZWxzZSBpZiAoc291cmNlT2Zmc2V0ID49IGxlZnRMZW5ndGgpIHsKLSAgICAgIHJpZ2h0LmNvcHlUb0ludGVybmFsKHRhcmdldCwgc291cmNlT2Zmc2V0IC0gbGVmdExlbmd0aCwgdGFyZ2V0T2Zmc2V0LAotICAgICAgICAgIG51bWJlclRvQ29weSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludCBsZWZ0TGVuZ3RoID0gdGhpcy5sZWZ0TGVuZ3RoIC0gc291cmNlT2Zmc2V0OwotICAgICAgbGVmdC5jb3B5VG9JbnRlcm5hbCh0YXJnZXQsIHNvdXJjZU9mZnNldCwgdGFyZ2V0T2Zmc2V0LCBsZWZ0TGVuZ3RoKTsKLSAgICAgIHJpZ2h0LmNvcHlUb0ludGVybmFsKHRhcmdldCwgMCwgdGFyZ2V0T2Zmc2V0ICsgbGVmdExlbmd0aCwKLSAgICAgICAgICBudW1iZXJUb0NvcHkgLSBsZWZ0TGVuZ3RoKTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgY29weVRvKEJ5dGVCdWZmZXIgdGFyZ2V0KSB7Ci0gICAgbGVmdC5jb3B5VG8odGFyZ2V0KTsKLSAgICByaWdodC5jb3B5VG8odGFyZ2V0KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQnl0ZUJ1ZmZlciBhc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIHsKLSAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAodG9CeXRlQXJyYXkoKSk7Ci0gICAgcmV0dXJuIGJ5dGVCdWZmZXIuYXNSZWFkT25seUJ1ZmZlcigpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBMaXN0PEJ5dGVCdWZmZXI+IGFzUmVhZE9ubHlCeXRlQnVmZmVyTGlzdCgpIHsKLSAgICAvLyBXYWxrIHRocm91Z2ggdGhlIGxpc3Qgb2YgTGVhZkJ5dGVTdHJpbmcncyB0aGF0IG1ha2UgdXAgdGhpcwotICAgIC8vIHJvcGUsIGFuZCBhZGQgZWFjaCBvbmUgYXMgYSByZWFkLW9ubHkgQnl0ZUJ1ZmZlci4KLSAgICBMaXN0PEJ5dGVCdWZmZXI+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZUJ1ZmZlcj4oKTsKLSAgICBQaWVjZUl0ZXJhdG9yIHBpZWNlcyA9IG5ldyBQaWVjZUl0ZXJhdG9yKHRoaXMpOwotICAgIHdoaWxlIChwaWVjZXMuaGFzTmV4dCgpKSB7Ci0gICAgICBMZWFmQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gcGllY2VzLm5leHQoKTsKLSAgICAgIHJlc3VsdC5hZGQoYnl0ZVN0cmluZy5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZVRvKE91dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW0pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgbGVmdC53cml0ZVRvKG91dHB1dFN0cmVhbSk7Ci0gICAgcmlnaHQud3JpdGVUbyhvdXRwdXRTdHJlYW0pOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHZvaWQgd3JpdGVUb0ludGVybmFsKE91dHB1dFN0cmVhbSBvdXQsIGludCBzb3VyY2VPZmZzZXQsCi0gICAgICBpbnQgbnVtYmVyVG9Xcml0ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoc291cmNlT2Zmc2V0ICsgbnVtYmVyVG9Xcml0ZSA8PSBsZWZ0TGVuZ3RoKSB7Ci0gICAgICBsZWZ0LndyaXRlVG9JbnRlcm5hbChvdXQsIHNvdXJjZU9mZnNldCwgbnVtYmVyVG9Xcml0ZSk7Ci0gICAgfSBlbHNlIGlmIChzb3VyY2VPZmZzZXQgPj0gbGVmdExlbmd0aCkgewotICAgICAgcmlnaHQud3JpdGVUb0ludGVybmFsKG91dCwgc291cmNlT2Zmc2V0IC0gbGVmdExlbmd0aCwgbnVtYmVyVG9Xcml0ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGludCBudW1iZXJUb1dyaXRlSW5MZWZ0ID0gbGVmdExlbmd0aCAtIHNvdXJjZU9mZnNldDsKLSAgICAgIGxlZnQud3JpdGVUb0ludGVybmFsKG91dCwgc291cmNlT2Zmc2V0LCBudW1iZXJUb1dyaXRlSW5MZWZ0KTsKLSAgICAgIHJpZ2h0LndyaXRlVG9JbnRlcm5hbChvdXQsIDAsIG51bWJlclRvV3JpdGUgLSBudW1iZXJUb1dyaXRlSW5MZWZ0KTsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgdm9pZCB3cml0ZVRvKEJ5dGVPdXRwdXQgb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGxlZnQud3JpdGVUbyhvdXRwdXQpOwotICAgIHJpZ2h0LndyaXRlVG8ob3V0cHV0KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgU3RyaW5nIHRvU3RyaW5nSW50ZXJuYWwoQ2hhcnNldCBjaGFyc2V0KSB7Ci0gICAgcmV0dXJuIG5ldyBTdHJpbmcodG9CeXRlQXJyYXkoKSwgY2hhcnNldCk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBVVEYtOCBkZWNvZGluZwotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc1ZhbGlkVXRmOCgpIHsKLSAgICBpbnQgbGVmdFBhcnRpYWwgPSBsZWZ0LnBhcnRpYWxJc1ZhbGlkVXRmOChVdGY4LkNPTVBMRVRFLCAwLCBsZWZ0TGVuZ3RoKTsKLSAgICBpbnQgc3RhdGUgPSByaWdodC5wYXJ0aWFsSXNWYWxpZFV0ZjgobGVmdFBhcnRpYWwsIDAsIHJpZ2h0LnNpemUoKSk7Ci0gICAgcmV0dXJuIHN0YXRlID09IFV0ZjguQ09NUExFVEU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoaW50IHN0YXRlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgaW50IHRvSW5kZXggPSBvZmZzZXQgKyBsZW5ndGg7Ci0gICAgaWYgKHRvSW5kZXggPD0gbGVmdExlbmd0aCkgewotICAgICAgcmV0dXJuIGxlZnQucGFydGlhbElzVmFsaWRVdGY4KHN0YXRlLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgfSBlbHNlIGlmIChvZmZzZXQgPj0gbGVmdExlbmd0aCkgewotICAgICAgcmV0dXJuIHJpZ2h0LnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZSwgb2Zmc2V0IC0gbGVmdExlbmd0aCwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgaW50IGxlZnRMZW5ndGggPSB0aGlzLmxlZnRMZW5ndGggLSBvZmZzZXQ7Ci0gICAgICBpbnQgbGVmdFBhcnRpYWwgPSBsZWZ0LnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZSwgb2Zmc2V0LCBsZWZ0TGVuZ3RoKTsKLSAgICAgIHJldHVybiByaWdodC5wYXJ0aWFsSXNWYWxpZFV0ZjgobGVmdFBhcnRpYWwsIDAsIGxlbmd0aCAtIGxlZnRMZW5ndGgpOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpCi0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpIHsKLSAgICBpZiAob3RoZXIgPT0gdGhpcykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgQnl0ZVN0cmluZykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBCeXRlU3RyaW5nIG90aGVyQnl0ZVN0cmluZyA9IChCeXRlU3RyaW5nKSBvdGhlcjsKLSAgICBpZiAodG90YWxMZW5ndGggIT0gb3RoZXJCeXRlU3RyaW5nLnNpemUoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAodG90YWxMZW5ndGggPT0gMCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgLy8gWW91IGRvbid0IHJlYWxseSB3YW50IHRvIGJlIGNhbGxpbmcgZXF1YWxzIG9uIGxvbmcgc3RyaW5ncywgYnV0IHNpbmNlCi0gICAgLy8gd2UgY2FjaGUgdGhlIGhhc2hDb2RlLCB3ZSBlZmZlY3RpdmVseSBjYWNoZSBpbmVxdWFsaXR5LiBXZSB1c2UgdGhlIGNhY2hlZAotICAgIC8vIGhhc2hDb2RlIGlmIGl0J3MgYWxyZWFkeSBjb21wdXRlZC4gIEl0J3MgYXJndWFibGUgd2Ugc2hvdWxkIGNvbXB1dGUgdGhlCi0gICAgLy8gaGFzaENvZGUgaGVyZSwgYW5kIGlmIHdlJ3JlIGdvaW5nIHRvIGJlIHRlc3RpbmcgYSBidW5jaCBvZiBieXRlU3RyaW5ncywKLSAgICAvLyBpdCBtaWdodCBldmVuIG1ha2Ugc2Vuc2UuCi0gICAgaW50IHRoaXNIYXNoID0gcGVla0NhY2hlZEhhc2hDb2RlKCk7Ci0gICAgaW50IHRoYXRIYXNoID0gb3RoZXJCeXRlU3RyaW5nLnBlZWtDYWNoZWRIYXNoQ29kZSgpOwotICAgIGlmICh0aGlzSGFzaCAhPSAwICYmIHRoYXRIYXNoICE9IDAgJiYgdGhpc0hhc2ggIT0gdGhhdEhhc2gpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZXF1YWxzRnJhZ21lbnRzKG90aGVyQnl0ZVN0cmluZyk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGlzIHN0cmluZyBpcyBlcXVhbCB0byBhbm90aGVyIG9mIHRoZSBzYW1lIGxlbmd0aCBieQotICAgKiBpdGVyYXRpbmcgb3ZlciB0aGUgbGVhZiBub2Rlcy4gT24gZWFjaCBzdGVwIG9mIHRoZSBpdGVyYXRpb24sIHRoZQotICAgKiBvdmVybGFwcGluZyBzZWdtZW50cyBvZiB0aGUgbGVhdmVzIGFyZSBjb21wYXJlZC4KLSAgICoKLSAgICogQHBhcmFtIG90aGVyIHN0cmluZyBvZiB0aGUgc2FtZSBsZW5ndGggYXMgdGhpcyBvbmUKLSAgICogQHJldHVybiB0cnVlIGlmIHRoZSB2YWx1ZXMgb2YgdGhpcyBzdHJpbmcgZXF1YWxzIHRoZSB2YWx1ZSBvZiB0aGUgZ2l2ZW4KLSAgICogICAgICAgICBvbmUKLSAgICovCi0gIHByaXZhdGUgYm9vbGVhbiBlcXVhbHNGcmFnbWVudHMoQnl0ZVN0cmluZyBvdGhlcikgewotICAgIGludCB0aGlzT2Zmc2V0ID0gMDsKLSAgICBJdGVyYXRvcjxMZWFmQnl0ZVN0cmluZz4gdGhpc0l0ZXIgPSBuZXcgUGllY2VJdGVyYXRvcih0aGlzKTsKLSAgICBMZWFmQnl0ZVN0cmluZyB0aGlzU3RyaW5nID0gdGhpc0l0ZXIubmV4dCgpOwotCi0gICAgaW50IHRoYXRPZmZzZXQgPSAwOwotICAgIEl0ZXJhdG9yPExlYWZCeXRlU3RyaW5nPiB0aGF0SXRlciA9IG5ldyBQaWVjZUl0ZXJhdG9yKG90aGVyKTsKLSAgICBMZWFmQnl0ZVN0cmluZyB0aGF0U3RyaW5nID0gdGhhdEl0ZXIubmV4dCgpOwotCi0gICAgaW50IHBvcyA9IDA7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCB0aGlzUmVtYWluaW5nID0gdGhpc1N0cmluZy5zaXplKCkgLSB0aGlzT2Zmc2V0OwotICAgICAgaW50IHRoYXRSZW1haW5pbmcgPSB0aGF0U3RyaW5nLnNpemUoKSAtIHRoYXRPZmZzZXQ7Ci0gICAgICBpbnQgYnl0ZXNUb0NvbXBhcmUgPSBNYXRoLm1pbih0aGlzUmVtYWluaW5nLCB0aGF0UmVtYWluaW5nKTsKLQotICAgICAgLy8gQXQgbGVhc3Qgb25lIG9mIHRoZSBvZmZzZXRzIHdpbGwgYmUgemVybwotICAgICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gKHRoaXNPZmZzZXQgPT0gMCkKLSAgICAgICAgICA/IHRoaXNTdHJpbmcuZXF1YWxzUmFuZ2UodGhhdFN0cmluZywgdGhhdE9mZnNldCwgYnl0ZXNUb0NvbXBhcmUpCi0gICAgICAgICAgOiB0aGF0U3RyaW5nLmVxdWFsc1JhbmdlKHRoaXNTdHJpbmcsIHRoaXNPZmZzZXQsIGJ5dGVzVG9Db21wYXJlKTsKLSAgICAgIGlmICghc3RpbGxFcXVhbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIHBvcyArPSBieXRlc1RvQ29tcGFyZTsKLSAgICAgIGlmIChwb3MgPj0gdG90YWxMZW5ndGgpIHsKLSAgICAgICAgaWYgKHBvcyA9PSB0b3RhbExlbmd0aCkgewotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICAgIC8vIFdlIGFsd2F5cyBnZXQgdG8gdGhlIGVuZCBvZiBhdCBsZWFzdCBvbmUgb2YgdGhlIHBpZWNlcwotICAgICAgaWYgKGJ5dGVzVG9Db21wYXJlID09IHRoaXNSZW1haW5pbmcpIHsgLy8gSWYgcmVhY2hlZCBlbmQgb2YgdGhpcwotICAgICAgICB0aGlzT2Zmc2V0ID0gMDsKLSAgICAgICAgdGhpc1N0cmluZyA9IHRoaXNJdGVyLm5leHQoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXNPZmZzZXQgKz0gYnl0ZXNUb0NvbXBhcmU7Ci0gICAgICB9Ci0gICAgICBpZiAoYnl0ZXNUb0NvbXBhcmUgPT0gdGhhdFJlbWFpbmluZykgeyAvLyBJZiByZWFjaGVkIGVuZCBvZiB0aGF0Ci0gICAgICAgIHRoYXRPZmZzZXQgPSAwOwotICAgICAgICB0aGF0U3RyaW5nID0gdGhhdEl0ZXIubmV4dCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhhdE9mZnNldCArPSBieXRlc1RvQ29tcGFyZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIGludCBwYXJ0aWFsSGFzaChpbnQgaCwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgewotICAgIGludCB0b0luZGV4ID0gb2Zmc2V0ICsgbGVuZ3RoOwotICAgIGlmICh0b0luZGV4IDw9IGxlZnRMZW5ndGgpIHsKLSAgICAgIHJldHVybiBsZWZ0LnBhcnRpYWxIYXNoKGgsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgaWYgKG9mZnNldCA+PSBsZWZ0TGVuZ3RoKSB7Ci0gICAgICByZXR1cm4gcmlnaHQucGFydGlhbEhhc2goaCwgb2Zmc2V0IC0gbGVmdExlbmd0aCwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgaW50IGxlZnRMZW5ndGggPSB0aGlzLmxlZnRMZW5ndGggLSBvZmZzZXQ7Ci0gICAgICBpbnQgbGVmdFBhcnRpYWwgPSBsZWZ0LnBhcnRpYWxIYXNoKGgsIG9mZnNldCwgbGVmdExlbmd0aCk7Ci0gICAgICByZXR1cm4gcmlnaHQucGFydGlhbEhhc2gobGVmdFBhcnRpYWwsIDAsIGxlbmd0aCAtIGxlZnRMZW5ndGgpOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIElucHV0IHN0cmVhbQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQ29kZWRJbnB1dFN0cmVhbSBuZXdDb2RlZElucHV0KCkgewotICAgIHJldHVybiBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKG5ldyBSb3BlSW5wdXRTdHJlYW0oKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIElucHV0U3RyZWFtIG5ld0lucHV0KCkgewotICAgIHJldHVybiBuZXcgUm9wZUlucHV0U3RyZWFtKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHRoZSBiYWxhbmNpbmcgYWxnb3JpdGhtIG9mIEJBUDk1LiBJbiB0aGUgcGFwZXIgdGhlCi0gICAqIGF1dGhvcnMgdXNlIGFuIGFycmF5IHRvIGtlZXAgdHJhY2sgb2YgcGllY2VzLCB3aGlsZSBoZXJlIHdlIHVzZSBhIHN0YWNrLgotICAgKiBUaGUgdHJlZSBpcyBiYWxhbmNlZCBieSB0cmF2ZXJzaW5nIHN1YnRyZWVzIGluIGxlZnQgdG8gcmlnaHQgb3JkZXIsIGFuZCB0aGUKLSAgICogc3RhY2sgYWx3YXlzIGNvbnRhaW5zIHRoZSBwYXJ0IG9mIHRoZSBzdHJpbmcgd2UndmUgdHJhdmVyc2VkIHNvIGZhci4KLSAgICoKLSAgICogPHA+T25lIHN1cnByaXNpbmcgYXNwZWN0IG9mIHRoZSBhbGdvcml0aG0gaXMgdGhlIHJlc3VsdCBvZiBiYWxhbmNpbmcgaXMgbm90Ci0gICAqIG5lY2Vzc2FyaWx5IGJhbGFuY2VkLCB0aG91Z2ggaXQgaXMgbmVhcmx5IGJhbGFuY2VkLiAgRm9yIGRldGFpbHMsIHNlZQotICAgKiBCQVA5NS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEJhbGFuY2VyIHsKLSAgICAvLyBTdGFjayBjb250YWluaW5nIHRoZSBwYXJ0IG9mIHRoZSBzdHJpbmcsIHN0YXJ0aW5nIGZyb20gdGhlIGxlZnQsIHRoYXQKLSAgICAvLyB3ZSd2ZSBhbHJlYWR5IHRyYXZlcnNlZC4gIFRoZSBmaW5hbCBzdHJpbmcgc2hvdWxkIGJlIHRoZSBlcXVpdmFsZW50IG9mCi0gICAgLy8gY29uY2F0ZW5hdGluZyB0aGUgc3RyaW5ncyBvbiB0aGUgc3RhY2sgZnJvbSBib3R0b20gdG8gdG9wLgotICAgIHByaXZhdGUgZmluYWwgU3RhY2s8Qnl0ZVN0cmluZz4gcHJlZml4ZXNTdGFjayA9IG5ldyBTdGFjazxCeXRlU3RyaW5nPigpOwotCi0gICAgcHJpdmF0ZSBCeXRlU3RyaW5nIGJhbGFuY2UoQnl0ZVN0cmluZyBsZWZ0LCBCeXRlU3RyaW5nIHJpZ2h0KSB7Ci0gICAgICBkb0JhbGFuY2UobGVmdCk7Ci0gICAgICBkb0JhbGFuY2UocmlnaHQpOwotCi0gICAgICAvLyBTd2VlcCBzdGFjayB0byBnYXRoZXIgdGhlIHJlc3VsdAotICAgICAgQnl0ZVN0cmluZyBwYXJ0aWFsU3RyaW5nID0gcHJlZml4ZXNTdGFjay5wb3AoKTsKLSAgICAgIHdoaWxlICghcHJlZml4ZXNTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgQnl0ZVN0cmluZyBuZXdMZWZ0ID0gcHJlZml4ZXNTdGFjay5wb3AoKTsKLSAgICAgICAgcGFydGlhbFN0cmluZyA9IG5ldyBSb3BlQnl0ZVN0cmluZyhuZXdMZWZ0LCBwYXJ0aWFsU3RyaW5nKTsKLSAgICAgIH0KLSAgICAgIC8vIFdlIHNob3VsZCBlbmQgdXAgd2l0aCBhIFJvcGVCeXRlU3RyaW5nIHNpbmNlIGF0IGEgbWluaW11bSB3ZSB3aWxsCi0gICAgICAvLyBjcmVhdGUgb25lIGZyb20gY29uY2F0ZW5hdGluZyBsZWZ0IGFuZCByaWdodAotICAgICAgcmV0dXJuIHBhcnRpYWxTdHJpbmc7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGRvQmFsYW5jZShCeXRlU3RyaW5nIHJvb3QpIHsKLSAgICAgIC8vIEJBUDk1OiBJbnNlcnQgYmFsYW5jZWQgc3VidHJlZXMgd2hvbGUuIFRoaXMgbWVhbnMgdGhlIHJlc3VsdCBtaWdodCBub3QKLSAgICAgIC8vIGJlIGJhbGFuY2VkLCBsZWFkaW5nIHRvIHJlcGVhdGVkIHJlYmFsYW5jaW5ncyBvbiBjb25jYXRlbmF0ZS4gSG93ZXZlciwKLSAgICAgIC8vIHRoZXNlIHJlYmFsYW5jaW5ncyBhcmUgc2hhbGxvdyBkdWUgdG8gaWdub3JpbmcgYmFsYW5jZWQgc3VidHJlZXMsIGFuZAotICAgICAgLy8gcmVsYXRpdmVseSBmZXcgY2FsbHMgdG8gaW5zZXJ0KCkgcmVzdWx0LgotICAgICAgaWYgKHJvb3QuaXNCYWxhbmNlZCgpKSB7Ci0gICAgICAgIGluc2VydChyb290KTsKLSAgICAgIH0gZWxzZSBpZiAocm9vdCBpbnN0YW5jZW9mIFJvcGVCeXRlU3RyaW5nKSB7Ci0gICAgICAgIFJvcGVCeXRlU3RyaW5nIHJicyA9IChSb3BlQnl0ZVN0cmluZykgcm9vdDsKLSAgICAgICAgZG9CYWxhbmNlKHJicy5sZWZ0KTsKLSAgICAgICAgZG9CYWxhbmNlKHJicy5yaWdodCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIkhhcyBhIG5ldyB0eXBlIG9mIEJ5dGVTdHJpbmcgYmVlbiBjcmVhdGVkPyBGb3VuZCAiICsKLSAgICAgICAgICAgICAgICByb290LmdldENsYXNzKCkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFB1c2ggYSBzdHJpbmcgb24gdGhlIGJhbGFuY2Ugc3RhY2sgKEJBUDk1KS4gIEJBUDk1IHVzZXMgYW4gYXJyYXkgYW5kCi0gICAgICogY2FsbHMgdGhlIGVsZW1lbnRzIGluIHRoZSBhcnJheSAnYmlucycuICBXZSBpbnN0ZWFkIHVzZSBhIHN0YWNrLCBzbyB0aGUKLSAgICAgKiAnYmlucycgb2YgbGVuZ3RocyBhcmUgcmVwcmVzZW50ZWQgYnkgZGlmZmVyZW5jZXMgYmV0d2VlbiB0aGUgZWxlbWVudHMgb2YKLSAgICAgKiBtaW5MZW5ndGhCeURlcHRoLgotICAgICAqCi0gICAgICogPHA+SWYgdGhlIGxlbmd0aCBiaW4gZm9yIG91ciBzdHJpbmcsIGFuZCBhbGwgc2hvcnRlciBsZW5ndGggYmlucywgYXJlCi0gICAgICogZW1wdHksIHdlIGp1c3QgcHVzaCBpdCBvbiB0aGUgc3RhY2suICBPdGhlcndpc2UsIHdlIG5lZWQgdG8gc3RhcnQKLSAgICAgKiBjb25jYXRlbmF0aW5nLCBwdXR0aW5nIHRoZSBnaXZlbiBzdHJpbmcgaW4gdGhlICJtaWRkbGUiIGFuZCBjb250aW51aW5nCi0gICAgICogdW50aWwgd2UgbGFuZCBpbiBhbiBlbXB0eSBsZW5ndGggYmluIHRoYXQgbWF0Y2hlcyB0aGUgbGVuZ3RoIG9mIG91cgotICAgICAqIGNvbmNhdGVuYXRpb24uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gYnl0ZVN0cmluZyBzdHJpbmcgdG8gcGxhY2Ugb24gdGhlIGJhbGFuY2Ugc3RhY2sKLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgaW5zZXJ0KEJ5dGVTdHJpbmcgYnl0ZVN0cmluZykgewotICAgICAgaW50IGRlcHRoQmluID0gZ2V0RGVwdGhCaW5Gb3JMZW5ndGgoYnl0ZVN0cmluZy5zaXplKCkpOwotICAgICAgaW50IGJpbkVuZCA9IG1pbkxlbmd0aEJ5RGVwdGhbZGVwdGhCaW4gKyAxXTsKLQotICAgICAgLy8gQkFQOTU6IENvbmNhdGVuYXRlIGFsbCB0cmVlcyBvY2N1cHlpbmcgYmlucyByZXByZXNlbnRpbmcgdGhlIGxlbmd0aCBvZgotICAgICAgLy8gb3VyIG5ldyBwaWVjZSBvciBvZiBzaG9ydGVyIHBpZWNlcywgdG8gdGhlIGV4dGVudCB0aGF0IGlzIHBvc3NpYmxlLgotICAgICAgLy8gVGhlIGdvYWwgaXMgdG8gY2xlYXIgdGhlIGJpbiB3aGljaCBvdXIgcGllY2UgYmVsb25ncyBpbiwgYnV0IHRoYXQgbWF5Ci0gICAgICAvLyBub3QgYmUgZW50aXJlbHkgcG9zc2libGUgaWYgdGhlcmUgYXJlbid0IGVub3VnaCBsb25nZXIgYmlucyBvY2N1cGllZC4KLSAgICAgIGlmIChwcmVmaXhlc1N0YWNrLmlzRW1wdHkoKSB8fCBwcmVmaXhlc1N0YWNrLnBlZWsoKS5zaXplKCkgPj0gYmluRW5kKSB7Ci0gICAgICAgIHByZWZpeGVzU3RhY2sucHVzaChieXRlU3RyaW5nKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBiaW5TdGFydCA9IG1pbkxlbmd0aEJ5RGVwdGhbZGVwdGhCaW5dOwotCi0gICAgICAgIC8vIENvbmNhdGVuYXRlIHRoZSBzdWJ0cmVlcyBvZiBzaG9ydGVyIGxlbmd0aAotICAgICAgICBCeXRlU3RyaW5nIG5ld1RyZWUgPSBwcmVmaXhlc1N0YWNrLnBvcCgpOwotICAgICAgICB3aGlsZSAoIXByZWZpeGVzU3RhY2suaXNFbXB0eSgpCi0gICAgICAgICAgICAmJiBwcmVmaXhlc1N0YWNrLnBlZWsoKS5zaXplKCkgPCBiaW5TdGFydCkgewotICAgICAgICAgIEJ5dGVTdHJpbmcgbGVmdCA9IHByZWZpeGVzU3RhY2sucG9wKCk7Ci0gICAgICAgICAgbmV3VHJlZSA9IG5ldyBSb3BlQnl0ZVN0cmluZyhsZWZ0LCBuZXdUcmVlKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8vIENvbmNhdGVuYXRlIHRoZSBnaXZlbiBzdHJpbmcKLSAgICAgICAgbmV3VHJlZSA9IG5ldyBSb3BlQnl0ZVN0cmluZyhuZXdUcmVlLCBieXRlU3RyaW5nKTsKLQotICAgICAgICAvLyBDb250aW51ZSBjb25jYXRlbmF0aW5nIHVudGlsIHdlIGxhbmQgaW4gYW4gZW1wdHkgYmluCi0gICAgICAgIHdoaWxlICghcHJlZml4ZXNTdGFjay5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBkZXB0aEJpbiA9IGdldERlcHRoQmluRm9yTGVuZ3RoKG5ld1RyZWUuc2l6ZSgpKTsKLSAgICAgICAgICBiaW5FbmQgPSBtaW5MZW5ndGhCeURlcHRoW2RlcHRoQmluICsgMV07Ci0gICAgICAgICAgaWYgKHByZWZpeGVzU3RhY2sucGVlaygpLnNpemUoKSA8IGJpbkVuZCkgewotICAgICAgICAgICAgQnl0ZVN0cmluZyBsZWZ0ID0gcHJlZml4ZXNTdGFjay5wb3AoKTsKLSAgICAgICAgICAgIG5ld1RyZWUgPSBuZXcgUm9wZUJ5dGVTdHJpbmcobGVmdCwgbmV3VHJlZSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBwcmVmaXhlc1N0YWNrLnB1c2gobmV3VHJlZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgZ2V0RGVwdGhCaW5Gb3JMZW5ndGgoaW50IGxlbmd0aCkgewotICAgICAgaW50IGRlcHRoID0gQXJyYXlzLmJpbmFyeVNlYXJjaChtaW5MZW5ndGhCeURlcHRoLCBsZW5ndGgpOwotICAgICAgaWYgKGRlcHRoIDwgMCkgewotICAgICAgICAvLyBJdCB3YXNuJ3QgYW4gZXhhY3QgbWF0Y2gsIHNvIGNvbnZlcnQgdG8gdGhlIGluZGV4IG9mIHRoZSBjb250YWluaW5nCi0gICAgICAgIC8vIGZyYWdtZW50LCB3aGljaCBpcyBvbmUgbGVzcyBldmVuIHRoYW4gdGhlIGluc2VydGlvbiBwb2ludC4KLSAgICAgICAgaW50IGluc2VydGlvblBvaW50ID0gLShkZXB0aCArIDEpOwotICAgICAgICBkZXB0aCA9IGluc2VydGlvblBvaW50IC0gMTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGRlcHRoOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIGEgY29udGludWFibGUgdHJlZSB0cmF2ZXJzYWwsIHdoaWNoIGtlZXBzIHRoZSBzdGF0ZQotICAgKiBpbmZvcm1hdGlvbiB3aGljaCB3b3VsZCBleGlzdCBvbiB0aGUgc3RhY2sgaW4gYSByZWN1cnNpdmUgdHJhdmVyc2FsIGluc3RlYWQKLSAgICogb24gYSBzdGFjayBvZiAiQnJlYWQgQ3J1bWJzIi4gVGhlIG1heGltdW0gZGVwdGggb2YgdGhlIHN0YWNrIGluIHRoaXMKLSAgICogaXRlcmF0b3IgaXMgdGhlIHNhbWUgYXMgdGhlIGRlcHRoIG9mIHRoZSB0cmVlIGJlaW5nIHRyYXZlcnNlZC4KLSAgICoKLSAgICogPHA+VGhpcyBpdGVyYXRvciBpcyB1c2VkIHRvIGltcGxlbWVudAotICAgKiB7QGxpbmsgUm9wZUJ5dGVTdHJpbmcjZXF1YWxzRnJhZ21lbnRzKEJ5dGVTdHJpbmcpfS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFBpZWNlSXRlcmF0b3IgaW1wbGVtZW50cyBJdGVyYXRvcjxMZWFmQnl0ZVN0cmluZz4gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBTdGFjazxSb3BlQnl0ZVN0cmluZz4gYnJlYWRDcnVtYnMgPQotICAgICAgICBuZXcgU3RhY2s8Um9wZUJ5dGVTdHJpbmc+KCk7Ci0gICAgcHJpdmF0ZSBMZWFmQnl0ZVN0cmluZyBuZXh0OwotCi0gICAgcHJpdmF0ZSBQaWVjZUl0ZXJhdG9yKEJ5dGVTdHJpbmcgcm9vdCkgewotICAgICAgbmV4dCA9IGdldExlYWZCeUxlZnQocm9vdCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMZWFmQnl0ZVN0cmluZyBnZXRMZWFmQnlMZWZ0KEJ5dGVTdHJpbmcgcm9vdCkgewotICAgICAgQnl0ZVN0cmluZyBwb3MgPSByb290OwotICAgICAgd2hpbGUgKHBvcyBpbnN0YW5jZW9mIFJvcGVCeXRlU3RyaW5nKSB7Ci0gICAgICAgIFJvcGVCeXRlU3RyaW5nIHJicyA9IChSb3BlQnl0ZVN0cmluZykgcG9zOwotICAgICAgICBicmVhZENydW1icy5wdXNoKHJicyk7Ci0gICAgICAgIHBvcyA9IHJicy5sZWZ0OwotICAgICAgfQotICAgICAgcmV0dXJuIChMZWFmQnl0ZVN0cmluZykgcG9zOwotICAgIH0KLQotICAgIHByaXZhdGUgTGVhZkJ5dGVTdHJpbmcgZ2V0TmV4dE5vbkVtcHR5TGVhZigpIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIC8vIEFsbW9zdCBhbHdheXMsIHdlIGdvIHRocm91Z2ggdGhpcyBsb29wIGV4YWN0bHkgb25jZS4gIEhvd2V2ZXIsIGlmCi0gICAgICAgIC8vIHdlIGRpc2NvdmVyIGFuIGVtcHR5IHN0cmluZyBpbiB0aGUgcm9wZSwgd2UgdG9zcyBpdCBhbmQgdHJ5IGFnYWluLgotICAgICAgICBpZiAoYnJlYWRDcnVtYnMuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTGVhZkJ5dGVTdHJpbmcgcmVzdWx0ID0gZ2V0TGVhZkJ5TGVmdChicmVhZENydW1icy5wb3AoKS5yaWdodCk7Ci0gICAgICAgICAgaWYgKCFyZXN1bHQuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICByZXR1cm4gbmV4dCAhPSBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG5leHQgaXRlbSBhbmQgYWR2YW5jZXMgb25lCi0gICAgICoge0BsaW5rIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5MZWFmQnl0ZVN0cmluZ30uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5leHQgbm9uLWVtcHR5IExlYWZCeXRlU3RyaW5nIG9yIHtAY29kZSBudWxsfQotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBMZWFmQnl0ZVN0cmluZyBuZXh0KCkgewotICAgICAgaWYgKG5leHQgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgTGVhZkJ5dGVTdHJpbmcgcmVzdWx0ID0gbmV4dDsKLSAgICAgIG5leHQgPSBnZXROZXh0Tm9uRW1wdHlMZWFmKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFNlcmlhbGl6YWJsZQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDFMOwotCi0gIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB7Ci0gICAgcmV0dXJuIEJ5dGVTdHJpbmcud3JhcCh0b0J5dGVBcnJheSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZWFkT2JqZWN0KEBTdXBwcmVzc1dhcm5pbmdzKCJ1bnVzZWQiKSBPYmplY3RJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB0aHJvdyBuZXcgSW52YWxpZE9iamVjdEV4Y2VwdGlvbigKLSAgICAgICAgIlJvcGVCeXRlU3RyZWFtIGluc3RhbmNlcyBhcmUgbm90IHRvIGJlIHNlcmlhbGl6ZWQgZGlyZWN0bHkiKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGlzIGNsYXNzIGlzIHRoZSB7QGxpbmsgUm9wZUJ5dGVTdHJpbmd9IGVxdWl2YWxlbnQgZm9yCi0gICAqIHtAbGluayBCeXRlQXJyYXlJbnB1dFN0cmVhbX0uCi0gICAqLwotICBwcml2YXRlIGNsYXNzIFJvcGVJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLSAgICAvLyBJdGVyYXRlcyB0aHJvdWdoIHRoZSBwaWVjZXMgb2YgdGhlIHJvcGUKLSAgICBwcml2YXRlIFBpZWNlSXRlcmF0b3IgcGllY2VJdGVyYXRvcjsKLSAgICAvLyBUaGUgY3VycmVudCBwaWVjZQotICAgIHByaXZhdGUgTGVhZkJ5dGVTdHJpbmcgY3VycmVudFBpZWNlOwotICAgIC8vIFRoZSBzaXplIG9mIHRoZSBjdXJyZW50IHBpZWNlCi0gICAgcHJpdmF0ZSBpbnQgY3VycmVudFBpZWNlU2l6ZTsKLSAgICAvLyBUaGUgaW5kZXggb2YgdGhlIG5leHQgYnl0ZSB0byByZWFkIGluIHRoZSBjdXJyZW50IHBpZWNlCi0gICAgcHJpdmF0ZSBpbnQgY3VycmVudFBpZWNlSW5kZXg7Ci0gICAgLy8gVGhlIG9mZnNldCBvZiB0aGUgc3RhcnQgb2YgdGhlIGN1cnJlbnQgcGllY2UgaW4gdGhlIHJvcGUgYnl0ZSBzdHJpbmcKLSAgICBwcml2YXRlIGludCBjdXJyZW50UGllY2VPZmZzZXRJblJvcGU7Ci0gICAgLy8gT2Zmc2V0IGluIHRoZSBidWZmZXIgYXQgd2hpY2ggdXNlciBjYWxsZWQgbWFyaygpOwotICAgIHByaXZhdGUgaW50IG1hcms7Ci0KLSAgICBwdWJsaWMgUm9wZUlucHV0U3RyZWFtKCkgewotICAgICAgaW5pdGlhbGl6ZSgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgIHsKLSAgICAgIGlmIChiID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICB9IGVsc2UgaWYgKG9mZnNldCA8IDAgfHwgbGVuZ3RoIDwgMCB8fCBsZW5ndGggPiBiLmxlbmd0aCAtIG9mZnNldCkgewotICAgICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlYWRTa2lwSW50ZXJuYWwoYiwgb2Zmc2V0LCBsZW5ndGgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBsb25nIHNraXAobG9uZyBsZW5ndGgpIHsKLSAgICAgIGlmIChsZW5ndGggPCAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgICB9IGVsc2UgaWYgKGxlbmd0aCA+IEludGVnZXIuTUFYX1ZBTFVFKSB7Ci0gICAgICAgIGxlbmd0aCA9IEludGVnZXIuTUFYX1ZBTFVFOwotICAgICAgfQotICAgICAgcmV0dXJuIHJlYWRTa2lwSW50ZXJuYWwobnVsbCwgMCwgKGludCkgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBvZiByZWFkIGFuZCBza2lwLiAgSWYgYiAhPSBudWxsLCB0aGVuIHJlYWQgdGhlCi0gICAgICogbmV4dCB7QGNvZGUgbGVuZ3RofSBieXRlcyBpbnRvIHRoZSBidWZmZXIge0Bjb2RlIGJ9IGF0Ci0gICAgICogb2Zmc2V0IHtAY29kZSBvZmZzZXR9LiAgSWYgYiA9PSBudWxsLCB0aGVuIHNraXAgdGhlIG5leHQge0Bjb2RlIGxlbmd0aH0KLSAgICAgKiBieXRlcy4KLSAgICAgKiA8cD4KLSAgICAgKiBUaGlzIG1ldGhvZCBhc3N1bWVzIHRoYXQgYWxsIGVycm9yIGNoZWNraW5nIGhhcyBhbHJlYWR5IGhhcHBlbmVkLgotICAgICAqIDxwPgotICAgICAqIFJldHVybnMgdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBvciBza2lwcGVkLgotICAgICAqLwotICAgIHByaXZhdGUgaW50IHJlYWRTa2lwSW50ZXJuYWwoYnl0ZSBiW10sIGludCBvZmZzZXQsIGludCBsZW5ndGgpICB7Ci0gICAgICBpbnQgYnl0ZXNSZW1haW5pbmcgPSBsZW5ndGg7Ci0gICAgICB3aGlsZSAoYnl0ZXNSZW1haW5pbmcgPiAwKSB7Ci0gICAgICAgIGFkdmFuY2VJZkN1cnJlbnRQaWVjZUZ1bGx5UmVhZCgpOwotICAgICAgICBpZiAoY3VycmVudFBpZWNlID09IG51bGwpIHsKLSAgICAgICAgICBpZiAoYnl0ZXNSZW1haW5pbmcgPT0gbGVuZ3RoKSB7Ci0gICAgICAgICAgICAgLy8gV2UgZGlkbid0IG1hbmFnZSB0byByZWFkIGFueXRoaW5nCi0gICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gQ29weSB0aGUgYnl0ZXMgZnJvbSB0aGlzIHBpZWNlLgotICAgICAgICAgIGludCBjdXJyZW50UGllY2VSZW1haW5pbmcgPSBjdXJyZW50UGllY2VTaXplIC0gY3VycmVudFBpZWNlSW5kZXg7Ci0gICAgICAgICAgaW50IGNvdW50ID0gTWF0aC5taW4oY3VycmVudFBpZWNlUmVtYWluaW5nLCBieXRlc1JlbWFpbmluZyk7Ci0gICAgICAgICAgaWYgKGIgIT0gbnVsbCkgewotICAgICAgICAgICAgY3VycmVudFBpZWNlLmNvcHlUbyhiLCBjdXJyZW50UGllY2VJbmRleCwgb2Zmc2V0LCBjb3VudCk7Ci0gICAgICAgICAgICBvZmZzZXQgKz0gY291bnQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGN1cnJlbnRQaWVjZUluZGV4ICs9IGNvdW50OwotICAgICAgICAgIGJ5dGVzUmVtYWluaW5nIC09IGNvdW50OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVhZC4KLSAgICAgIHJldHVybiBsZW5ndGggLSBieXRlc1JlbWFpbmluZzsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgYWR2YW5jZUlmQ3VycmVudFBpZWNlRnVsbHlSZWFkKCk7Ci0gICAgICBpZiAoY3VycmVudFBpZWNlID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGN1cnJlbnRQaWVjZS5ieXRlQXQoY3VycmVudFBpZWNlSW5kZXgrKykgJiAweEZGOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgYXZhaWxhYmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGludCBieXRlc1JlYWQgPSBjdXJyZW50UGllY2VPZmZzZXRJblJvcGUgKyBjdXJyZW50UGllY2VJbmRleDsKLSAgICAgIHJldHVybiBSb3BlQnl0ZVN0cmluZy50aGlzLnNpemUoKSAtIGJ5dGVzUmVhZDsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBtYXJrU3VwcG9ydGVkKCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgbWFyayhpbnQgcmVhZEFoZWFkTGltaXQpIHsKLSAgICAgIC8vIFNldCB0aGUgbWFyayB0byBvdXIgcG9zaXRpb24gaW4gdGhlIGJ5dGUgc3RyaW5nCi0gICAgICBtYXJrID0gY3VycmVudFBpZWNlT2Zmc2V0SW5Sb3BlICsgY3VycmVudFBpZWNlSW5kZXg7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHN5bmNocm9uaXplZCB2b2lkIHJlc2V0KCkgewotICAgICAgLy8gSnVzdCByZWluaXRpYWxpemUgYW5kIHNraXAgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgYnl0ZXMuCi0gICAgICBpbml0aWFsaXplKCk7Ci0gICAgICByZWFkU2tpcEludGVybmFsKG51bGwsIDAsIG1hcmspOwotICAgIH0KLQotICAgIC8qKiBDb21tb24gaW5pdGlhbGl6YXRpb24gY29kZSB1c2VkIGJ5IGJvdGggdGhlIGNvbnN0cnVjdG9yIGFuZCByZXNldCgpICovCi0gICAgcHJpdmF0ZSB2b2lkIGluaXRpYWxpemUoKSB7Ci0gICAgICBwaWVjZUl0ZXJhdG9yID0gbmV3IFBpZWNlSXRlcmF0b3IoUm9wZUJ5dGVTdHJpbmcudGhpcyk7Ci0gICAgICBjdXJyZW50UGllY2UgPSBwaWVjZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGN1cnJlbnRQaWVjZVNpemUgPSBjdXJyZW50UGllY2Uuc2l6ZSgpOwotICAgICAgY3VycmVudFBpZWNlSW5kZXggPSAwOwotICAgICAgY3VycmVudFBpZWNlT2Zmc2V0SW5Sb3BlID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTa2lwcyB0byB0aGUgbmV4dCBwaWVjZSBpZiB3ZSBoYXZlIHJlYWQgYWxsIHRoZSBkYXRhIGluIHRoZSBjdXJyZW50Ci0gICAgICogcGllY2UuICBTZXRzIGN1cnJlbnRQaWVjZSB0byBudWxsIGlmIHdlIGhhdmUgcmVhY2hlZCB0aGUgZW5kIG9mIHRoZQotICAgICAqIGlucHV0LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBhZHZhbmNlSWZDdXJyZW50UGllY2VGdWxseVJlYWQoKSB7Ci0gICAgICBpZiAoY3VycmVudFBpZWNlICE9IG51bGwgJiYgY3VycmVudFBpZWNlSW5kZXggPT0gY3VycmVudFBpZWNlU2l6ZSkgewotICAgICAgICAvLyBHZW5lcmFsbHksIHdlIGNhbiBvbmx5IGdvIHRocm91Z2ggdGhpcyBsb29wIGF0IG1vc3Qgb25jZSwgc2luY2UKLSAgICAgICAgLy8gZW1wdHkgc3RyaW5ncyBjYW4ndCBlbmQgdXAgaW4gYSByb3BlLiAgQnV0IGJldHRlciB0byB0ZXN0LgotICAgICAgICBjdXJyZW50UGllY2VPZmZzZXRJblJvcGUgKz0gY3VycmVudFBpZWNlU2l6ZTsKLSAgICAgICAgY3VycmVudFBpZWNlSW5kZXggPSAwOwotICAgICAgICBpZiAocGllY2VJdGVyYXRvci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBjdXJyZW50UGllY2UgPSBwaWVjZUl0ZXJhdG9yLm5leHQoKTsKLSAgICAgICAgICBjdXJyZW50UGllY2VTaXplID0gY3VycmVudFBpZWNlLnNpemUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjdXJyZW50UGllY2UgPSBudWxsOwotICAgICAgICAgIGN1cnJlbnRQaWVjZVNpemUgPSAwOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NhbGxiYWNrLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NhbGxiYWNrLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEwNzUyOTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDYWxsYmFjay5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGFuIFJQQyBjYWxsYmFjaywgbm9ybWFsbHkgY2FsbGVkIHdoZW4gYW4gUlBDIGNvbXBsZXRlcy4KLSAqIHtAY29kZSBQYXJhbWV0ZXJUeXBlfSBpcyBub3JtYWxseSB0aGUgbWV0aG9kJ3MgcmVzcG9uc2UgbWVzc2FnZSB0eXBlLgotICoKLSAqIDxwPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHRyeSB0byBidWlsZAotICogb24gdGhpcywgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucyB3aGljaCBnZW5lcmF0ZQotICogY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheSB0aGUgZ2VuZXJhdGVkCi0gKiBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlIGFuZCBjYW4gYXZvaWQKLSAqIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJwY0NhbGxiYWNrPFBhcmFtZXRlclR5cGU+IHsKLSAgdm9pZCBydW4oUGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDaGFubmVsLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjI3MmY0YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogPHA+QWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBSUEMgY2hhbm5lbC4gIEFuIHtAY29kZSBScGNDaGFubmVsfSByZXByZXNlbnRzIGEKLSAqIGNvbW11bmljYXRpb24gbGluZSB0byBhIHtAbGluayBTZXJ2aWNlfSB3aGljaCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoYXQKLSAqIHtAbGluayBTZXJ2aWNlfSdzIG1ldGhvZHMuICBUaGUge0BsaW5rIFNlcnZpY2V9IG1heSBiZSBydW5uaW5nIG9uIGFub3RoZXIKLSAqIG1hY2hpbmUuICBOb3JtYWxseSwgeW91IHNob3VsZCBub3QgY2FsbCBhbiB7QGNvZGUgUnBjQ2hhbm5lbH0gZGlyZWN0bHksIGJ1dAotICogaW5zdGVhZCBjb25zdHJ1Y3QgYSBzdHViIHtAbGluayBTZXJ2aWNlfSB3cmFwcGluZyBpdC4gIEV4YW1wbGU6Ci0gKgotICogPHByZT4KLSAqICAgUnBjQ2hhbm5lbCBjaGFubmVsID0gcnBjSW1wbC5uZXdDaGFubmVsKCJyZW1vdGVob3N0LmV4YW1wbGUuY29tOjEyMzQiKTsKLSAqICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gcnBjSW1wbC5uZXdDb250cm9sbGVyKCk7Ci0gKiAgIE15U2VydmljZSBzZXJ2aWNlID0gTXlTZXJ2aWNlLm5ld1N0dWIoY2hhbm5lbCk7Ci0gKiAgIHNlcnZpY2UubXlNZXRob2QoY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOwotICogPC9wcmU+Ci0gKgotICogPHA+U3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgdHJ5IHRvIGJ1aWxkCi0gKiBvbiB0aGlzLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdoaWNoIGdlbmVyYXRlCi0gKiBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5IHRoZSBnZW5lcmF0ZWQKLSAqIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UgYW5kIGNhbiBhdm9pZAotICogdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUnBjQ2hhbm5lbCB7Ci0gIC8qKgotICAgKiBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlLiAgVGhpcyBtZXRob2QgaXMgc2ltaWxhciB0bwotICAgKiB7QGNvZGUgU2VydmljZS5jYWxsTWV0aG9kKCl9IHdpdGggb25lIGltcG9ydGFudCBkaWZmZXJlbmNlOiAgdGhlIGNhbGxlcgotICAgKiBkZWNpZGVzIHRoZSB0eXBlcyBvZiB0aGUge0Bjb2RlIE1lc3NhZ2V9IG9iamVjdHMsIG5vdCB0aGUgY2FsbGVlLiAgVGhlCi0gICAqIHJlcXVlc3QgbWF5IGJlIG9mIGFueSB0eXBlIGFzIGxvbmcgYXMKLSAgICoge0Bjb2RlIHJlcXVlc3QuZ2V0RGVzY3JpcHRvcigpID09IG1ldGhvZC5nZXRJbnB1dFR5cGUoKX0uCi0gICAqIFRoZSByZXNwb25zZSBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHdpbGwgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcwotICAgKiB7QGNvZGUgcmVzcG9uc2VQcm90b3R5cGV9ICh3aGljaCBtdXN0IGhhdmUKLSAgICoge0Bjb2RlIGdldERlc2NyaXB0b3IoKSA9PSBtZXRob2QuZ2V0T3V0cHV0VHlwZSgpfSkuCi0gICAqLwotICB2b2lkIGNhbGxNZXRob2QoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCi0gICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlc3BvbnNlUHJvdG90eXBlLAotICAgICAgICAgICAgICAgICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gZG9uZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NvbnRyb2xsZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOTJkZDdiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ29udHJvbGxlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogPHA+QW4ge0Bjb2RlIFJwY0NvbnRyb2xsZXJ9IG1lZGlhdGVzIGEgc2luZ2xlIG1ldGhvZCBjYWxsLiAgVGhlIHByaW1hcnkKLSAqIHB1cnBvc2Ugb2YgdGhlIGNvbnRyb2xsZXIgaXMgdG8gcHJvdmlkZSBhIHdheSB0byBtYW5pcHVsYXRlIHNldHRpbmdzCi0gKiBzcGVjaWZpYyB0byB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGFuZCB0byBmaW5kIG91dCBhYm91dCBSUEMtbGV2ZWwgZXJyb3JzLgotICoKLSAqIDxwPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHRyeSB0byBidWlsZAotICogb24gdGhpcywgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucyB3aGljaCBnZW5lcmF0ZQotICogY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheSB0aGUgZ2VuZXJhdGVkCi0gKiBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlIGFuZCBjYW4gYXZvaWQKLSAqIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KLSAqCi0gKiA8cD5UaGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUge0Bjb2RlIFJwY0NvbnRyb2xsZXJ9IGludGVyZmFjZSBhcmUgaW50ZW5kZWQKLSAqIHRvIGJlIGEgImxlYXN0IGNvbW1vbiBkZW5vbWluYXRvciIgc2V0IG9mIGZlYXR1cmVzIHdoaWNoIHdlIGV4cGVjdCBhbGwKLSAqIGltcGxlbWVudGF0aW9ucyB0byBzdXBwb3J0LiAgU3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIG1vcmUKLSAqIGFkdmFuY2VkIGZlYXR1cmVzIChlLmcuIGRlYWRsaW5lIHByb3BhZ2F0aW9uKS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJwY0NvbnRyb2xsZXIgewotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUaGVzZSBjYWxscyBtYXkgYmUgbWFkZSBmcm9tIHRoZSBjbGllbnQgc2lkZSBvbmx5LiAgVGhlaXIgcmVzdWx0cwotICAvLyBhcmUgdW5kZWZpbmVkIG9uIHRoZSBzZXJ2ZXIgc2lkZSAobWF5IHRocm93IFJ1bnRpbWVFeGNlcHRpb25zKS4KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBScGNDb250cm9sbGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlIHNvIHRoYXQgaXQgbWF5IGJlIHJldXNlZCBpbgotICAgKiBhIG5ldyBjYWxsLiAgVGhpcyBjYW4gYmUgY2FsbGVkIGZyb20gdGhlIGNsaWVudCBzaWRlIG9ubHkuICBJdCBtdXN0IG5vdAotICAgKiBiZSBjYWxsZWQgd2hpbGUgYW4gUlBDIGlzIGluIHByb2dyZXNzLgotICAgKi8KLSAgdm9pZCByZXNldCgpOwotCi0gIC8qKgotICAgKiBBZnRlciBhIGNhbGwgaGFzIGZpbmlzaGVkLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZmFpbGVkLiAgVGhlIHBvc3NpYmxlCi0gICAqIHJlYXNvbnMgZm9yIGZhaWx1cmUgZGVwZW5kIG9uIHRoZSBSUEMgaW1wbGVtZW50YXRpb24uICB7QGNvZGUgZmFpbGVkKCl9Ci0gICAqIG1vc3Qgb25seSBiZSBjYWxsZWQgb24gdGhlIGNsaWVudCBzaWRlLCBhbmQgbXVzdCBub3QgYmUgY2FsbGVkIGJlZm9yZSBhCi0gICAqIGNhbGwgaGFzIGZpbmlzaGVkLgotICAgKi8KLSAgYm9vbGVhbiBmYWlsZWQoKTsKLQotICAvKioKLSAgICogSWYge0Bjb2RlIGZhaWxlZCgpfSBpcyB7QGNvZGUgdHJ1ZX0sIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbgotICAgKiBvZiB0aGUgZXJyb3IuCi0gICAqLwotICBTdHJpbmcgZXJyb3JUZXh0KCk7Ci0KLSAgLyoqCi0gICAqIEFkdmlzZXMgdGhlIFJQQyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGRlc2lyZXMgdGhhdCB0aGUgUlBDIGNhbGwgYmUKLSAgICogY2FuY2VsZWQuICBUaGUgUlBDIHN5c3RlbSBtYXkgY2FuY2VsIGl0IGltbWVkaWF0ZWx5LCBtYXkgd2FpdCBhd2hpbGUgYW5kCi0gICAqIHRoZW4gY2FuY2VsIGl0LCBvciBtYXkgbm90IGV2ZW4gY2FuY2VsIHRoZSBjYWxsIGF0IGFsbC4gIElmIHRoZSBjYWxsIGlzCi0gICAqIGNhbmNlbGVkLCB0aGUgImRvbmUiIGNhbGxiYWNrIHdpbGwgc3RpbGwgYmUgY2FsbGVkIGFuZCB0aGUgUnBjQ29udHJvbGxlcgotICAgKiB3aWxsIGluZGljYXRlIHRoYXQgdGhlIGNhbGwgZmFpbGVkIGF0IHRoYXQgdGltZS4KLSAgICovCi0gIHZvaWQgc3RhcnRDYW5jZWwoKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUaGVzZSBjYWxscyBtYXkgYmUgbWFkZSBmcm9tIHRoZSBzZXJ2ZXIgc2lkZSBvbmx5LiAgVGhlaXIgcmVzdWx0cwotICAvLyBhcmUgdW5kZWZpbmVkIG9uIHRoZSBjbGllbnQgc2lkZSAobWF5IHRocm93IFJ1bnRpbWVFeGNlcHRpb25zKS4KLQotICAvKioKLSAgICogQ2F1c2VzIHtAY29kZSBmYWlsZWQoKX0gdG8gcmV0dXJuIHRydWUgb24gdGhlIGNsaWVudCBzaWRlLiAge0Bjb2RlIHJlYXNvbn0KLSAgICogd2lsbCBiZSBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbWVzc2FnZSByZXR1cm5lZCBieSB7QGNvZGUgZXJyb3JUZXh0KCl9LgotICAgKiBJZiB5b3UgZmluZCB5b3UgbmVlZCB0byByZXR1cm4gbWFjaGluZS1yZWFkYWJsZSBpbmZvcm1hdGlvbiBhYm91dAotICAgKiBmYWlsdXJlcywgeW91IHNob3VsZCBpbmNvcnBvcmF0ZSBpdCBpbnRvIHlvdXIgcmVzcG9uc2UgcHJvdG9jb2wgYnVmZmVyCi0gICAqIGFuZCBzaG91bGQgTk9UIGNhbGwge0Bjb2RlIHNldEZhaWxlZCgpfS4KLSAgICovCi0gIHZvaWQgc2V0RmFpbGVkKFN0cmluZyByZWFzb24pOwotCi0gIC8qKgotICAgKiBJZiB7QGNvZGUgdHJ1ZX0sIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgY2FuY2VsZWQgdGhlIFJQQywgc28gdGhlIHNlcnZlcgotICAgKiBtYXkgYXMgd2VsbCBnaXZlIHVwIG9uIHJlcGx5aW5nIHRvIGl0LiAgVGhpcyBtZXRob2QgbXVzdCBiZSBjYWxsZWQgb24gdGhlCi0gICAqIHNlcnZlciBzaWRlIG9ubHkuICBUaGUgc2VydmVyIHNob3VsZCBzdGlsbCBjYWxsIHRoZSBmaW5hbCAiZG9uZSIgY2FsbGJhY2suCi0gICAqLwotICBib29sZWFuIGlzQ2FuY2VsZWQoKTsKLQotICAvKioKLSAgICogQXNrcyB0aGF0IHRoZSBnaXZlbiBjYWxsYmFjayBiZSBjYWxsZWQgd2hlbiB0aGUgUlBDIGlzIGNhbmNlbGVkLiAgVGhlCi0gICAqIHBhcmFtZXRlciBwYXNzZWQgdG8gdGhlIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIHtAY29kZSBudWxsfS4gIFRoZQotICAgKiBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLiAgSWYgdGhlIFJQQyBjb21wbGV0ZXMgd2l0aG91dAotICAgKiBiZWluZyBjYW5jZWxlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGNvbXBsZXRpb24uICBJZiB0aGUgUlBDCi0gICAqIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgd2hlbiBOb3RpZnlPbkNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlIGNhbGxiYWNrCi0gICAqIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5LgotICAgKgotICAgKiA8cD57QGNvZGUgbm90aWZ5T25DYW5jZWwoKX0gbXVzdCBiZSBjYWxsZWQgbm8gbW9yZSB0aGFuIG9uY2UgcGVyIHJlcXVlc3QuCi0gICAqIEl0IG11c3QgYmUgY2FsbGVkIG9uIHRoZSBzZXJ2ZXIgc2lkZSBvbmx5LgotICAgKi8KLSAgdm9pZCBub3RpZnlPbkNhbmNlbChScGNDYWxsYmFjazxPYmplY3Q+IGNhbGxiYWNrKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjVXRpbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY3ZDU1NWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMzYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBHcmFiLWJhZyBvZiB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggUlBDcy4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUnBjVXRpbCB7Ci0gIHByaXZhdGUgUnBjVXRpbCgpIHt9Ci0KLSAgLyoqCi0gICAqIFRha2UgYW4ge0Bjb2RlIFJwY0NhbGxiYWNrPE1lc3NhZ2U+fSBhbmQgY29udmVydCBpdCB0byBhbgotICAgKiB7QGNvZGUgUnBjQ2FsbGJhY2t9IGFjY2VwdGluZyBhIHNwZWNpZmljIG1lc3NhZ2UgdHlwZS4gIFRoaXMgaXMgYWx3YXlzCi0gICAqIHR5cGUtc2FmZSAocGFyYW1ldGVyIHR5cGUgY29udHJhdmFyaWFuY2UpLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBzdGF0aWMgPFR5cGUgZXh0ZW5kcyBNZXNzYWdlPiBScGNDYWxsYmFjazxUeXBlPgotICBzcGVjaWFsaXplQ2FsbGJhY2soZmluYWwgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gb3JpZ2luYWxDYWxsYmFjaykgewotICAgIHJldHVybiAoUnBjQ2FsbGJhY2s8VHlwZT4pb3JpZ2luYWxDYWxsYmFjazsKLSAgICAvLyBUaGUgYWJvdmUgY2FzdCB3b3JrcywgYnV0IG9ubHkgZHVlIHRvIHRlY2huaWNhbCBkZXRhaWxzIG9mIHRoZSBKYXZhCi0gICAgLy8gaW1wbGVtZW50YXRpb24uICBBIG1vcmUgdGhlb3JldGljYWxseSBjb3JyZWN0IC0tIGJ1dCBsZXNzIGVmZmljaWVudCAtLQotICAgIC8vIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIGFzIGZvbGxvd3M6Ci0gICAgLy8gICByZXR1cm4gbmV3IFJwY0NhbGxiYWNrPFR5cGU+KCkgewotICAgIC8vICAgICBwdWJsaWMgdm9pZCBydW4oVHlwZSBwYXJhbWV0ZXIpIHsKLSAgICAvLyAgICAgICBvcmlnaW5hbENhbGxiYWNrLnJ1bihwYXJhbWV0ZXIpOwotICAgIC8vICAgICB9Ci0gICAgLy8gICB9OwotICB9Ci0KLSAgLyoqCi0gICAqIFRha2UgYW4ge0Bjb2RlIFJwY0NhbGxiYWNrfSBhY2NlcHRpbmcgYSBzcGVjaWZpYyBtZXNzYWdlIHR5cGUgYW5kIGNvbnZlcnQKLSAgICogaXQgdG8gYW4ge0Bjb2RlIFJwY0NhbGxiYWNrPE1lc3NhZ2U+fS4gIFRoZSBnZW5lcmFsaXplZCBjYWxsYmFjayB3aWxsCi0gICAqIGFjY2VwdCBhbnkgbWVzc2FnZSBvYmplY3Qgd2hpY2ggaGFzIHRoZSBzYW1lIGRlc2NyaXB0b3IsIGFuZCB3aWxsIGNvbnZlcnQKLSAgICogaXQgdG8gdGhlIGNvcnJlY3QgY2xhc3MgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIGNhbGxiYWNrLiAgSG93ZXZlciwKLSAgICogaWYgdGhlIGdlbmVyYWxpemVkIGNhbGxiYWNrIGlzIGdpdmVuIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IGRlc2NyaXB0b3IsCi0gICAqIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgPFR5cGUgZXh0ZW5kcyBNZXNzYWdlPgotICBScGNDYWxsYmFjazxNZXNzYWdlPiBnZW5lcmFsaXplQ2FsbGJhY2soCi0gICAgICBmaW5hbCBScGNDYWxsYmFjazxUeXBlPiBvcmlnaW5hbENhbGxiYWNrLAotICAgICAgZmluYWwgQ2xhc3M8VHlwZT4gb3JpZ2luYWxDbGFzcywKLSAgICAgIGZpbmFsIFR5cGUgZGVmYXVsdEluc3RhbmNlKSB7Ci0gICAgcmV0dXJuIG5ldyBScGNDYWxsYmFjazxNZXNzYWdlPigpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgcnVuKGZpbmFsIE1lc3NhZ2UgcGFyYW1ldGVyKSB7Ci0gICAgICAgIFR5cGUgdHlwZWRQYXJhbWV0ZXI7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgdHlwZWRQYXJhbWV0ZXIgPSBvcmlnaW5hbENsYXNzLmNhc3QocGFyYW1ldGVyKTsKLSAgICAgICAgfSBjYXRjaCAoQ2xhc3NDYXN0RXhjZXB0aW9uIGlnbm9yZWQpIHsKLSAgICAgICAgICB0eXBlZFBhcmFtZXRlciA9IGNvcHlBc1R5cGUoZGVmYXVsdEluc3RhbmNlLCBwYXJhbWV0ZXIpOwotICAgICAgICB9Ci0gICAgICAgIG9yaWdpbmFsQ2FsbGJhY2sucnVuKHR5cGVkUGFyYW1ldGVyKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgbWVzc2FnZSBvZiB0eXBlICJUeXBlIiB3aGljaCBpcyBhIGNvcHkgb2YgInNvdXJjZSIuICAic291cmNlIgotICAgKiBtdXN0IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciBidXQgbWF5IGJlIGEgZGlmZmVyZW50IGNsYXNzIChlLmcuCi0gICAqIER5bmFtaWNNZXNzYWdlKS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIHN0YXRpYyA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+IFR5cGUgY29weUFzVHlwZSgKLSAgICAgIGZpbmFsIFR5cGUgdHlwZURlZmF1bHRJbnN0YW5jZSwgZmluYWwgTWVzc2FnZSBzb3VyY2UpIHsKLSAgICByZXR1cm4gKFR5cGUpIHR5cGVEZWZhdWx0SW5zdGFuY2UKLSAgICAgICAgLm5ld0J1aWxkZXJGb3JUeXBlKCkubWVyZ2VGcm9tKHNvdXJjZSkuYnVpbGQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgY2FsbGJhY2sgd2hpY2ggY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuICBUaGlzIG1heSBiZSB1c2VmdWwgZm9yCi0gICAqIHNlY3VyaXR5LCB3aGVuIHBhc3NpbmcgYSBjYWxsYmFjayB0byB1bnRydXN0ZWQgY29kZTogIG1vc3QgY2FsbGJhY2tzIGRvCi0gICAqIG5vdCBleHBlY3QgdG8gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBzbyBkb2luZyBzbyBtYXkgZXhwb3NlIGJ1Z3MgaWYgaXQKLSAgICogaXMgbm90IHByZXZlbnRlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgPFBhcmFtZXRlclR5cGU+Ci0gICAgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4gbmV3T25lVGltZUNhbGxiYWNrKAotICAgICAgZmluYWwgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4gb3JpZ2luYWxDYWxsYmFjaykgewotICAgIHJldHVybiBuZXcgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4oKSB7Ci0gICAgICBwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUNhbGxlZCA9IGZhbHNlOwotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBQYXJhbWV0ZXJUeXBlIHBhcmFtZXRlcikgewotICAgICAgICBzeW5jaHJvbml6ZWQgKHRoaXMpIHsKLSAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFscmVhZHlDYWxsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBvcmlnaW5hbENhbGxiYWNrLnJ1bihwYXJhbWV0ZXIpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgb25lLXRpbWUgY2FsbGJhY2sgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBbHJlYWR5Q2FsbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTQ2OTc0MTI3OTUwNzg0ODI2Nkw7Ci0KLSAgICBwdWJsaWMgQWxyZWFkeUNhbGxlZEV4Y2VwdGlvbigpIHsKLSAgICAgIHN1cGVyKCJUaGlzIFJwY0NhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZCBhbmQgY2Fubm90IGJlIGNhbGxlZCAiICsKLSAgICAgICAgICAgICJtdWx0aXBsZSB0aW1lcy4iKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhN2IwMzMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBBYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IgcHJvdG9jb2wtYnVmZmVyLWJhc2VkIFJQQyBzZXJ2aWNlcy4gIFNlcnZpY2VzCi0gKiB0aGVtc2VsdmVzIGFyZSBhYnN0cmFjdCBjbGFzc2VzIChpbXBsZW1lbnRlZCBlaXRoZXIgYnkgc2VydmVycyBvciBhcwotICogc3R1YnMpLCBidXQgdGhleSBzdWJjbGFzcyB0aGlzIGJhc2UgaW50ZXJmYWNlLiAgVGhlIG1ldGhvZHMgb2YgdGhpcwotICogaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugd2l0aG91dCBrbm93aW5nCi0gKiBpdHMgZXhhY3QgdHlwZSBhdCBjb21waWxlIHRpbWUgKGFuYWxvZ291cyB0byB0aGUgTWVzc2FnZSBpbnRlcmZhY2UpLgotICoKLSAqIDxwPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHRyeSB0byBidWlsZAotICogb24gdGhpcywgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucyB3aGljaCBnZW5lcmF0ZQotICogY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheSB0aGUgZ2VuZXJhdGVkCi0gKiBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlIGFuZCBjYW4gYXZvaWQKLSAqIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFNlcnZpY2UgewotICAvKioKLSAgICogR2V0IHRoZSB7QGNvZGUgU2VydmljZURlc2NyaXB0b3J9IGRlc2NyaWJpbmcgdGhpcyBzZXJ2aWNlIGFuZCBpdHMgbWV0aG9kcy4KLSAgICovCi0gIERlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIDxwPkNhbGwgYSBtZXRob2Qgb2YgdGhlIHNlcnZpY2Ugc3BlY2lmaWVkIGJ5IE1ldGhvZERlc2NyaXB0b3IuICBUaGlzIGlzCi0gICAqIG5vcm1hbGx5IGltcGxlbWVudGVkIGFzIGEgc2ltcGxlIHtAY29kZSBzd2l0Y2goKX0gdGhhdCBjYWxscyB0aGUgc3RhbmRhcmQKLSAgICogZGVmaW5pdGlvbnMgb2YgdGhlIHNlcnZpY2UncyBtZXRob2RzLgotICAgKgotICAgKiA8cD5QcmVjb25kaXRpb25zOgotICAgKiA8dWw+Ci0gICAqICAgPGxpPntAY29kZSBtZXRob2QuZ2V0U2VydmljZSgpID09IGdldERlc2NyaXB0b3JGb3JUeXBlKCl9Ci0gICAqICAgPGxpPntAY29kZSByZXF1ZXN0fSBpcyBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzcyBhcyB0aGUgb2JqZWN0IHJldHVybmVkIGJ5Ci0gICAqICAgICAgIHtAY29kZSBnZXRSZXF1ZXN0UHJvdG90eXBlKG1ldGhvZCl9LgotICAgKiAgIDxsaT57QGNvZGUgY29udHJvbGxlcn0gaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIFJQQyBpbXBsZW1lbnRhdGlvbgotICAgKiAgICAgICBiZWluZyB1c2VkIGJ5IHRoaXMgU2VydmljZS4gIEZvciBzdHVicywgdGhlICJjb3JyZWN0IHR5cGUiIGRlcGVuZHMKLSAgICogICAgICAgb24gdGhlIFJwY0NoYW5uZWwgd2hpY2ggdGhlIHN0dWIgaXMgdXNpbmcuICBTZXJ2ZXItc2lkZSBTZXJ2aWNlCi0gICAqICAgICAgIGltcGxlbWVudGF0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYWNjZXB0IHdoYXRldmVyIHR5cGUgb2YKLSAgICogICAgICAge0Bjb2RlIFJwY0NvbnRyb2xsZXJ9IHRoZSBzZXJ2ZXItc2lkZSBSUEMgaW1wbGVtZW50YXRpb24gdXNlcy4KLSAgICogPC91bD4KLSAgICoKLSAgICogPHA+UG9zdGNvbmRpdGlvbnM6Ci0gICAqIDx1bD4KLSAgICogICA8bGk+e0Bjb2RlIGRvbmV9IHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1ldGhvZCBpcyBjb21wbGV0ZS4gIFRoaXMgbWF5IGJlCi0gICAqICAgICAgIGJlZm9yZSB7QGNvZGUgY2FsbE1ldGhvZCgpfSByZXR1cm5zIG9yIGl0IG1heSBiZSBhdCBzb21lIHBvaW50IGluCi0gICAqICAgICAgIHRoZSBmdXR1cmUuCi0gICAqICAgPGxpPlRoZSBwYXJhbWV0ZXIgdG8ge0Bjb2RlIGRvbmV9IGlzIHRoZSByZXNwb25zZS4gIEl0IG11c3QgYmUgb2YgdGhlCi0gICAqICAgICAgIGV4YWN0IHNhbWUgdHlwZSBhcyB3b3VsZCBiZSByZXR1cm5lZCBieQotICAgKiAgICAgICB7QGNvZGUgZ2V0UmVzcG9uc2VQcm90b3R5cGUobWV0aG9kKX0uCi0gICAqICAgPGxpPklmIHRoZSBSUEMgZmFpbGVkLCB0aGUgcGFyYW1ldGVyIHRvIHtAY29kZSBkb25lfSB3aWxsIGJlCi0gICAqICAgICAgIHtAY29kZSBudWxsfS4gIEZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZSBjYW4gYmUgZm91bmQgYnkKLSAgICogICAgICAgcXVlcnlpbmcge0Bjb2RlIGNvbnRyb2xsZXJ9LgotICAgKiA8L3VsPgotICAgKi8KLSAgdm9pZCBjYWxsTWV0aG9kKERlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgTWVzc2FnZSByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gZG9uZSk7Ci0KLSAgLyoqCi0gICAqIDxwPntAY29kZSBjYWxsTWV0aG9kKCl9IHJlcXVpcmVzIHRoYXQgdGhlIHJlcXVlc3QgcGFzc2VkIGluIGlzIG9mIGEKLSAgICogcGFydGljdWxhciBzdWJjbGFzcyBvZiB7QGNvZGUgTWVzc2FnZX0uICB7QGNvZGUgZ2V0UmVxdWVzdFByb3RvdHlwZSgpfQotICAgKiBnZXRzIHRoZSBkZWZhdWx0IGluc3RhbmNlcyBvZiB0aGlzIHR5cGUgZm9yIGEgZ2l2ZW4gbWV0aG9kLiAgWW91IGNhbiB0aGVuCi0gICAqIGNhbGwge0Bjb2RlIE1lc3NhZ2UubmV3QnVpbGRlckZvclR5cGUoKX0gb24gdGhpcyBpbnN0YW5jZSB0bwotICAgKiBjb25zdHJ1Y3QgYSBidWlsZGVyIHRvIGJ1aWxkIGFuIG9iamVjdCB3aGljaCB5b3UgY2FuIHRoZW4gcGFzcyB0bwotICAgKiB7QGNvZGUgY2FsbE1ldGhvZCgpfS4KLSAgICoKLSAgICogPHA+RXhhbXBsZToKLSAgICogPHByZT4KLSAgICogICBNZXRob2REZXNjcmlwdG9yIG1ldGhvZCA9Ci0gICAqICAgICBzZXJ2aWNlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7Ci0gICAqICAgTWVzc2FnZSByZXF1ZXN0ID0KLSAgICogICAgIHN0dWIuZ2V0UmVxdWVzdFByb3RvdHlwZShtZXRob2QpLm5ld0J1aWxkZXJGb3JUeXBlKCkKLSAgICogICAgICAgICAubWVyZ2VGcm9tKGlucHV0KS5idWlsZCgpOwotICAgKiAgIHNlcnZpY2UuY2FsbE1ldGhvZChtZXRob2QsIHJlcXVlc3QsIGNhbGxiYWNrKTsKLSAgICogPC9wcmU+Ci0gICAqLwotICBNZXNzYWdlIGdldFJlcXVlc3RQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOwotCi0gIC8qKgotICAgKiBMaWtlIHtAY29kZSBnZXRSZXF1ZXN0UHJvdG90eXBlKCl9LCBidXQgZ2V0cyBhIHByb3RvdHlwZSBvZiB0aGUgcmVzcG9uc2UKLSAgICogbWVzc2FnZS4gIHtAY29kZSBnZXRSZXNwb25zZVByb3RvdHlwZSgpfSBpcyBnZW5lcmFsbHkgbm90IG5lZWRlZCBiZWNhdXNlCi0gICAqIHRoZSB7QGNvZGUgU2VydmljZX0gaW1wbGVtZW50YXRpb24gY29uc3RydWN0cyB0aGUgcmVzcG9uc2UgbWVzc2FnZSBpdHNlbGYsCi0gICAqIGJ1dCBpdCBtYXkgYmUgdXNlZnVsIGluIHNvbWUgY2FzZXMgdG8ga25vdyBhaGVhZCBvZiB0aW1lIHdoYXQgdHlwZSBvZgotICAgKiBvYmplY3Qgd2lsbCBiZSByZXR1cm5lZC4KLSAgICovCi0gIE1lc3NhZ2UgZ2V0UmVzcG9uc2VQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlRXhjZXB0aW9uLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDBkNTcwNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogVGhyb3duIGJ5IGJsb2NraW5nIFJQQyBtZXRob2RzIHdoZW4gYSBmYWlsdXJlIG9jY3Vycy4KLSAqCi0gKiBAYXV0aG9yIGNwb3ZpcmtAZ29vZ2xlLmNvbSAoQ2hyaXMgUG92aXJrKQotICovCi1wdWJsaWMgY2xhc3MgU2VydmljZUV4Y2VwdGlvbiBleHRlbmRzIEV4Y2VwdGlvbiB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xMjE5MjYyMzM1NzI5ODkxOTIwTDsKLQotICBwdWJsaWMgU2VydmljZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgIHN1cGVyKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VFeGNlcHRpb24oZmluYWwgVGhyb3dhYmxlIGNhdXNlKSB7Ci0gICAgc3VwZXIoY2F1c2UpOwotICB9Ci0KLSAgcHVibGljIFNlcnZpY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UsIGZpbmFsIFRocm93YWJsZSBjYXVzZSkgewotICAgIHN1cGVyKG1lc3NhZ2UsIGNhdXNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk0MWI1ZGUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI0MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIHtAY29kZSBTaW5nbGVGaWVsZEJ1aWxkZXJ9IGltcGxlbWVudHMgYSBzdHJ1Y3R1cmUgdGhhdCBhIHByb3RvY29sCi0gKiBtZXNzYWdlIHVzZXMgdG8gaG9sZCBhIHNpbmdsZSBmaWVsZCBvZiBhbm90aGVyIHByb3RvY29sIG1lc3NhZ2UuIEl0IHN1cHBvcnRzCi0gKiB0aGUgY2xhc3NpY2FsIHVzZSBjYXNlIG9mIHNldHRpbmcgYW4gaW1tdXRhYmxlIHtAbGluayBNZXNzYWdlfSBhcyB0aGUgdmFsdWUKLSAqIG9mIHRoZSBmaWVsZCBhbmQgaXMgaGlnaGx5IG9wdGltaXplZCBhcm91bmQgdGhpcy4KLSAqIDxicj4KLSAqIEl0IGFsc28gc3VwcG9ydHMgdGhlIGFkZGl0aW9uYWwgdXNlIGNhc2Ugb2Ygc2V0dGluZyBhIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9Ci0gKiBhcyB0aGUgZmllbGQgYW5kIGRlZmVycmluZyBjb252ZXJzaW9uIG9mIHRoYXQge0Bjb2RlIEJ1aWxkZXJ9Ci0gKiB0byBhbiBpbW11dGFibGUge0Bjb2RlIE1lc3NhZ2V9LiBJbiB0aGlzIHdheSwgaXQncyBwb3NzaWJsZSB0byBtYWludGFpbgotICogYSB0cmVlIG9mIHtAY29kZSBCdWlsZGVyfSdzIHRoYXQgYWN0cyBhcyBhIGZ1bGx5IHJlYWQvd3JpdGUgZGF0YQotICogc3RydWN0dXJlLgotICogPGJyPgotICogTG9naWNhbGx5LCBvbmUgY2FuIHRoaW5rIG9mIGEgdHJlZSBvZiBidWlsZGVycyBhcyBjb252ZXJ0aW5nIHRoZSBlbnRpcmUgdHJlZQotICogdG8gbWVzc2FnZXMgd2hlbiBidWlsZCBpcyBjYWxsZWQgb24gdGhlIHJvb3Qgb3Igd2hlbiBhbnkgbWV0aG9kIGlzIGNhbGxlZAotICogdGhhdCBkZXNpcmVzIGEgTWVzc2FnZSBpbnN0ZWFkIG9mIGEgQnVpbGRlci4gSW4gdGVybXMgb2YgdGhlIGltcGxlbWVudGF0aW9uLAotICogdGhlIHtAY29kZSBTaW5nbGVGaWVsZEJ1aWxkZXJ9IGFuZCB7QGNvZGUgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9Ci0gKiBjbGFzc2VzIGNhY2hlIG1lc3NhZ2VzIHRoYXQgd2VyZSBjcmVhdGVkIHNvIHRoYXQgbWVzc2FnZXMgb25seSBuZWVkIHRvIGJlCi0gKiBjcmVhdGVkIHdoZW4gc29tZSBjaGFuZ2Ugb2NjdXJyZWQgaW4gaXRzIGJ1aWxkZXIgb3IgYSBidWlsZGVyIGZvciBvbmUgb2YgaXRzCi0gKiBkZXNjZW5kYW50cy4KLSAqCi0gKiBAcGFyYW0gPE1UeXBlPiB0aGUgdHlwZSBvZiBtZXNzYWdlIGZvciB0aGUgZmllbGQKLSAqIEBwYXJhbSA8QlR5cGU+IHRoZSB0eXBlIG9mIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZAotICogQHBhcmFtIDxJVHlwZT4gdGhlIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBtZXNzYWdlIGFuZCB0aGUgYnVpbGRlcgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRmllbGRCdWlsZGVyCi0gICAgPE1UeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZSwKLSAgICAgQlR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIsCi0gICAgIElUeXBlIGV4dGVuZHMgTWVzc2FnZU9yQnVpbGRlcj4KLSAgICBpbXBsZW1lbnRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCB7Ci0KLSAgLy8gUGFyZW50IHRvIHNlbmQgY2hhbmdlcyB0by4KLSAgcHJpdmF0ZSBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50OwotCi0gIC8vIEludmFyaWFudDogb25lIG9mIGJ1aWxkZXIgb3IgbWVzc2FnZSBmaWVsZHMgbXVzdCBiZSBub24tbnVsbC4KLQotICAvLyBJZiBzZXQsIHRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgd2UgYXJlIGJhY2tlZCBieSBhIGJ1aWxkZXIuIEluIHRoaXMgY2FzZSwKLSAgLy8gbWVzc2FnZSBmaWVsZCByZXByZXNlbnRzIGEgY2FjaGVkIG1lc3NhZ2UgZm9yIHRoZSBidWlsZGVyIChvciBudWxsIGlmCi0gIC8vIHRoZXJlIGlzIG5vIGNhY2hlZCBtZXNzYWdlKS4KLSAgcHJpdmF0ZSBCVHlwZSBidWlsZGVyOwotCi0gIC8vIElmIGJ1aWxkZXIgaXMgbm9uLW51bGwsIHRoaXMgcmVwcmVzZW50cyBhIGNhY2hlZCBtZXNzYWdlIGZyb20gdGhlIGJ1aWxkZXIuCi0gIC8vIElmIGJ1aWxkZXIgaXMgbnVsbCwgdGhpcyBpcyB0aGUgYXV0aG9yaXRhdGl2ZSBtZXNzYWdlIGZvciB0aGUgZmllbGQuCi0gIHByaXZhdGUgTVR5cGUgbWVzc2FnZTsKLQotICAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSd2ZSBidWlsdCBhIG1lc3NhZ2UgYW5kIHNvIHdlIGFyZSBub3cgb2JsaWdhdGVkCi0gIC8vIHRvIGRpc3BhdGNoIGRpcnR5IGludmFsaWRhdGlvbnMuIFNlZSBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJMaXN0ZW5lci4KLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xlYW47Ci0KLSAgcHVibGljIFNpbmdsZUZpZWxkQnVpbGRlcigKLSAgICAgIE1UeXBlIG1lc3NhZ2UsCi0gICAgICBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50LAotICAgICAgYm9vbGVhbiBpc0NsZWFuKSB7Ci0gICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgdGhpcy5wYXJlbnQgPSBwYXJlbnQ7Ci0gICAgdGhpcy5pc0NsZWFuID0gaXNDbGVhbjsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIGRpc3Bvc2UoKSB7Ci0gICAgLy8gTnVsbCBvdXQgcGFyZW50IHNvIHdlIHN0b3Agc2VuZGluZyBpdCBpbnZhbGlkYXRpb25zLgotICAgIHBhcmVudCA9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGZvciB0aGUgZmllbGQuIElmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBzdG9yZWQKLSAgICogYXMgYSB7QGNvZGUgQnVpbGRlcn0sIGl0IGlzIGNvbnZlcnRlZCB0byBhIHtAY29kZSBNZXNzYWdlfSBieQotICAgKiBjYWxsaW5nIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjYnVpbGRQYXJ0aWFsfSBvbiBpdC4gSWYgbm8gbWVzc2FnZSBoYXMKLSAgICogYmVlbiBzZXQsIHJldHVybnMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIG1lc3NhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBNVHlwZSBnZXRNZXNzYWdlKCkgewotICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgIC8vIElmIG1lc3NhZ2UgaXMgbnVsbCwgdGhlIGludmFyaWFudCBpcyB0aGF0IHdlIG11c3QgYmUgaGF2ZSBhIGJ1aWxkZXIuCi0gICAgICBtZXNzYWdlID0gKE1UeXBlKSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBNVHlwZSBidWlsZCgpIHsKLSAgICAvLyBOb3cgdGhhdCBidWlsZCBoYXMgYmVlbiBjYWxsZWQsIHdlIGFyZSByZXF1aXJlZCB0byBkaXNwYXRjaAotICAgIC8vIGludmFsaWRhdGlvbnMuCi0gICAgaXNDbGVhbiA9IHRydWU7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGEgYnVpbGRlciBmb3IgdGhlIGZpZWxkLiBJZiBubyBidWlsZGVyIGhhcyBiZWVuIGNyZWF0ZWQgeWV0LCBhCi0gICAqIGJ1aWxkZXIgaXMgY3JlYXRlZCBvbiBkZW1hbmQgYnkgY2FsbGluZyB7QGxpbmsgTWVzc2FnZSN0b0J1aWxkZXJ9LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGZvciB0aGUgZmllbGQKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgQlR5cGUgZ2V0QnVpbGRlcigpIHsKLSAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAvLyBidWlsZGVyLm1lcmdlRnJvbSgpIG9uIGEgZnJlc2ggYnVpbGRlcgotICAgICAgLy8gZG9lcyBub3QgY3JlYXRlIGFueSBzdWItb2JqZWN0cyB3aXRoIGluZGVwZW5kZW50IGNsZWFuL2RpcnR5IHN0YXRlcywKLSAgICAgIC8vIHRoZXJlZm9yZSBzZXR0aW5nIHRoZSBidWlsZGVyIGl0c2VsZiB0byBjbGVhbiB3aXRob3V0IGFjdHVhbGx5IGNhbGxpbmcKLSAgICAgIC8vIGJ1aWxkKCkgY2Fubm90IGJyZWFrIGFueSBpbnZhcmlhbnRzLgotICAgICAgYnVpbGRlciA9IChCVHlwZSkgbWVzc2FnZS5uZXdCdWlsZGVyRm9yVHlwZSh0aGlzKTsKLSAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKG1lc3NhZ2UpOyAvLyBuby1vcCBpZiBtZXNzYWdlIGlzIHRoZSBkZWZhdWx0IG1lc3NhZ2UKLSAgICAgIGJ1aWxkZXIubWFya0NsZWFuKCk7Ci0gICAgfQotICAgIHJldHVybiBidWlsZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlIGZvciB0aGUgZmllbGQuIFRoaXMgbWF5IGVpdGhlciBiZSBhIGJ1aWxkZXIKLSAgICogb3IgYSBtZXNzYWdlLiBJdCB3aWxsIHJldHVybiB3aGF0ZXZlciBpcyBtb3JlIGVmZmljaWVudC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbWVzc2FnZSBvciBidWlsZGVyIGZvciB0aGUgZmllbGQgYXMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIElUeXBlIGdldE1lc3NhZ2VPckJ1aWxkZXIoKSB7Ci0gICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgcmV0dXJuICAoSVR5cGUpIGJ1aWxkZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoSVR5cGUpIG1lc3NhZ2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgYSAgbWVzc2FnZSBmb3IgdGhlIGZpZWxkIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNldAotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IHNldE1lc3NhZ2UoCi0gICAgICBNVHlwZSBtZXNzYWdlKSB7Ci0gICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgYnVpbGRlci5kaXNwb3NlKCk7Ci0gICAgICBidWlsZGVyID0gbnVsbDsKLSAgICB9Ci0gICAgb25DaGFuZ2VkKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogTWVyZ2VzIHRoZSBmaWVsZCBmcm9tIGFub3RoZXIgZmllbGQuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gbWVyZ2UgZnJvbQotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IG1lcmdlRnJvbSgKLSAgICAgIE1UeXBlIHZhbHVlKSB7Ci0gICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCAmJiBtZXNzYWdlID09IG1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKSB7Ci0gICAgICBtZXNzYWdlID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdldEJ1aWxkZXIoKS5tZXJnZUZyb20odmFsdWUpOwotICAgIH0KLSAgICBvbkNoYW5nZWQoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhcnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgYnVpbGRlcgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gY2xlYXIoKSB7Ci0gICAgbWVzc2FnZSA9IChNVHlwZSkgKG1lc3NhZ2UgIT0gbnVsbCA/Ci0gICAgICAgIG1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIDoKLSAgICAgICAgYnVpbGRlci5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpOwotICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgIGJ1aWxkZXIuZGlzcG9zZSgpOwotICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgfQotICAgIG9uQ2hhbmdlZCgpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGEgdGhlIGJ1aWxkZXIgb3Igb25lIG9mIGl0cyBuZXN0ZWQgY2hpbGRyZW4gaGFzIGNoYW5nZWQKLSAgICogYW5kIGFueSBwYXJlbnQgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGl0cyBpbnZhbGlkYXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgb25DaGFuZ2VkKCkgewotICAgIC8vIElmIGJ1aWxkZXIgaXMgbnVsbCwgdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBvbkNoYW5nZWQgaXMgYmVpbmcgY2FsbGVkCi0gICAgLy8gZnJvbSBzZXRNZXNzYWdlIG9yIGNsZWFyLgotICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgIG1lc3NhZ2UgPSBudWxsOwotICAgIH0KLSAgICBpZiAoaXNDbGVhbiAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgcGFyZW50Lm1hcmtEaXJ0eSgpOwotCi0gICAgICAvLyBEb24ndCBrZWVwIGRpc3BhdGNoaW5nIGludmFsaWRhdGlvbnMgdW50aWwgYnVpbGQgaXMgY2FsbGVkIGFnYWluLgotICAgICAgaXNDbGVhbiA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgb25DaGFuZ2VkKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXAuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDA5ZmVjMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NzAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuQWJzdHJhY3RTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuU29ydGVkTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKioKLSAqIEEgY3VzdG9tIG1hcCBpbXBsZW1lbnRhdGlvbiBmcm9tIEZpZWxkRGVzY3JpcHRvciB0byBPYmplY3Qgb3B0aW1pemVkIHRvCi0gKiBtaW5pbWl6ZSB0aGUgbnVtYmVyIG9mIG1lbW9yeSBhbGxvY2F0aW9ucyBmb3IgaW5zdGFuY2VzIHdpdGggYSBzbWFsbCBudW1iZXIKLSAqIG9mIG1hcHBpbmdzLiBUaGUgaW1wbGVtZW50YXRpb24gc3RvcmVzIHRoZSBmaXJzdCB7QGNvZGUga30gbWFwcGluZ3MgaW4gYW4KLSAqIGFycmF5IGZvciBhIGNvbmZpZ3VyYWJsZSB2YWx1ZSBvZiB7QGNvZGUga30sIGFsbG93aW5nIGRpcmVjdCBhY2Nlc3MgdG8gdGhlCi0gKiBjb3JyZXNwb25kaW5nIHtAY29kZSBFbnRyeX1zIHdpdGhvdXQgdGhlIG5lZWQgdG8gY3JlYXRlIGFuIEl0ZXJhdG9yLiBUaGUKLSAqIHJlbWFpbmluZyBlbnRyaWVzIGFyZSBzdG9yZWQgaW4gYW4gb3ZlcmZsb3cgbWFwLiBJdGVyYXRpb24gb3ZlciB0aGUgZW50cmllcwotICogaW4gdGhlIG1hcCBzaG91bGQgYmUgZG9uZSBhcyBmb2xsb3dzOgotICoKLSAqIDxwcmU+ICAge0Bjb2RlCi0gKiBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkTWFwLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKLSAqICAgcHJvY2VzcyhmaWVsZE1hcC5nZXRBcnJheUVudHJ5QXQoaSkpOwotICogfQotICogZm9yIChNYXAuRW50cnk8SywgVj4gZW50cnkgOiBmaWVsZE1hcC5nZXRPdmVyZmxvd0VudHJpZXMoKSkgewotICogICBwcm9jZXNzKGVudHJ5KTsKLSAqIH0KLSAqIH08L3ByZT4KLSAqCi0gKiBUaGUgcmVzdWx0aW5nIGl0ZXJhdGlvbiBpcyBpbiBvcmRlciBvZiBhc2NlbmRpbmcgZmllbGQgdGFnIG51bWJlci4gVGhlCi0gKiBvYmplY3QgcmV0dXJuZWQgYnkge0BsaW5rICNlbnRyeVNldCgpfSBhZGhlcmVzIHRvIHRoZSBzYW1lIGNvbnRyYWN0IGJ1dCBpcwotICogbGVzcyBlZmZpY2llbnQgYXMgaXQgbmVjZXNzYXJpbHkgaW52b2x2ZXMgY3JlYXRpbmcgYW4gb2JqZWN0IGZvciBpdGVyYXRpb24uCi0gKiA8cD4KLSAqIFRoZSB0cmFkZW9mZiBmb3IgdGhpcyBtZW1vcnkgZWZmaWNpZW5jeSBpcyB0aGF0IHRoZSB3b3JzdCBjYXNlIHJ1bm5pbmcgdGltZQotICogb2YgdGhlIHtAY29kZSBwdXQoKX0gb3BlcmF0aW9uIGlzIHtAY29kZSBPKGsgKyBsZyBuKX0sIHdoaWNoIGhhcHBlbnMgd2hlbgotICogZW50cmllcyBhcmUgYWRkZWQgaW4gZGVzY2VuZGluZyBvcmRlci4ge0Bjb2RlIGt9IHNob3VsZCBiZSBjaG9zZW4gc3VjaCB0aGF0Ci0gKiBpdCBjb3ZlcnMgZW5vdWdoIGNvbW1vbiBjYXNlcyB3aXRob3V0IGFkdmVyc2VseSBhZmZlY3RpbmcgbGFyZ2VyIG1hcHMuIEluCi0gKiBwcmFjdGljZSwgdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8gZG9lcyBub3QgaGFwcGVuIGZvciBleHRlbnNpb25zIGJlY2F1c2UKLSAqIGV4dGVuc2lvbiBmaWVsZHMgYXJlIHNlcmlhbGl6ZWQgYW5kIGRlc2VyaWFsaXplZCBpbiBvcmRlciBvZiBhc2NlbmRpbmcgdGFnCi0gKiBudW1iZXIsIGJ1dCB0aGUgd29yc3QgY2FzZSBzY2VuYXJpbyBjYW4gaGFwcGVuIGZvciBEeW5hbWljTWVzc2FnZXMuCi0gKiA8cD4KLSAqIFRoZSBydW5uaW5nIHRpbWUgZm9yIGFsbCBvdGhlciBvcGVyYXRpb25zIGlzIHNpbWlsYXIgdG8gdGhhdCBvZgotICoge0Bjb2RlIFRyZWVNYXB9LgotICogPHA+Ci0gKiBJbnN0YW5jZXMgYXJlIG5vdCB0aHJlYWQtc2FmZSB1bnRpbCB7QGxpbmsgI21ha2VJbW11dGFibGUoKX0gaXMgY2FsbGVkLAotICogYWZ0ZXIgd2hpY2ggYW55IG1vZGlmeWluZyBvcGVyYXRpb24gd2lsbCByZXN1bHQgaW4gYW4KLSAqIHtAbGluayBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbn0uCi0gKgotICogQGF1dGhvciBkYXJpY2tAZ29vZ2xlLmNvbSBEYXJpY2sgVG9uZwotICovCi0vLyBUaGlzIGNsYXNzIGlzIGZpbmFsIGZvciBhbGwgaW50ZW50cyBhbmQgcHVycG9zZXMgYmVjYXVzZSB0aGUgY29uc3RydWN0b3IgaXMKLS8vIHByaXZhdGUuIEhvd2V2ZXIsIHRoZSBGaWVsZERlc2NyaXB0b3Itc3BlY2lmaWMgbG9naWMgaXMgZW5jYXBzdWxhdGVkIGluCi0vLyBhIHN1YmNsYXNzIHRvIGFpZCB0ZXN0YWJpbGl0eSBvZiB0aGUgY29yZSBsb2dpYy4KLWNsYXNzIFNtYWxsU29ydGVkTWFwPEsgZXh0ZW5kcyBDb21wYXJhYmxlPEs+LCBWPiBleHRlbmRzIEFic3RyYWN0TWFwPEssIFY+IHsKLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmb3IgbWFwcGluZyBGaWVsZERlc2NyaXB0b3JzIHRvIHRoZWlyIHZhbHVlcy4KLSAgICogVGhlIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBpbXBsZW1lbnRhdGlvbiB3aWxsIGNvbnZlcnQgdGhlIExpc3QgdmFsdWVzCi0gICAqIG9mIGFueSByZXBlYXRlZCBmaWVsZHMgdG8gdW5tb2RpZmlhYmxlIGxpc3RzLgotICAgKgotICAgKiBAcGFyYW0gYXJyYXlTaXplIFRoZSBzaXplIG9mIHRoZSBlbnRyeSBhcnJheSBjb250YWluaW5nIHRoZQotICAgKiAgICAgICAgbGV4aWNvZ3JhcGhpY2FsbHkgc21hbGxlc3QgbWFwcGluZ3MuCi0gICAqLwotICBzdGF0aWMgPEZpZWxkRGVzY3JpcHRvclR5cGUgZXh0ZW5kcwotICAgICAgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxGaWVsZERlc2NyaXB0b3JUeXBlPj4KLSAgICAgIFNtYWxsU29ydGVkTWFwPEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gbmV3RmllbGRNYXAoaW50IGFycmF5U2l6ZSkgewotICAgIHJldHVybiBuZXcgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PihhcnJheVNpemUpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICBwdWJsaWMgdm9pZCBtYWtlSW1tdXRhYmxlKCkgewotICAgICAgICBpZiAoIWlzSW1tdXRhYmxlKCkpIHsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKLSAgICAgICAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5ID0KLSAgICAgICAgICAgICAgICBnZXRBcnJheUVudHJ5QXQoaSk7Ci0gICAgICAgICAgICBpZiAoZW50cnkuZ2V0S2V5KCkuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIExpc3QgdmFsdWUgPSAoTGlzdCkgZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgICAgICAgZW50cnkuc2V0VmFsdWUoQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCh2YWx1ZSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICAgICAgICAgICBnZXRPdmVyZmxvd0VudHJpZXMoKSkgewotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgICBmaW5hbCBMaXN0IHZhbHVlID0gKExpc3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgc3VwZXIubWFrZUltbXV0YWJsZSgpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBmb3IgdGVzdGluZy4KLSAgICoKLSAgICogQHBhcmFtIGFycmF5U2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZW50cnkgYXJyYXkgY29udGFpbmluZyB0aGUKLSAgICogICAgICAgIGxleGljb2dyYXBoaWNhbGx5IHNtYWxsZXN0IG1hcHBpbmdzLgotICAgKi8KLSAgc3RhdGljIDxLIGV4dGVuZHMgQ29tcGFyYWJsZTxLPiwgVj4gU21hbGxTb3J0ZWRNYXA8SywgVj4gbmV3SW5zdGFuY2VGb3JUZXN0KAotICAgICAgaW50IGFycmF5U2l6ZSkgewotICAgIHJldHVybiBuZXcgU21hbGxTb3J0ZWRNYXA8SywgVj4oYXJyYXlTaXplKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgaW50IG1heEFycmF5U2l6ZTsKLSAgLy8gVGhlICJlbnRyeSBhcnJheSIgaXMgYWN0dWFsbHkgYSBMaXN0IGJlY2F1c2UgZ2VuZXJpYyBhcnJheXMgYXJlIG5vdAotICAvLyBhbGxvd2VkLiBBcnJheUxpc3QgYWxzbyBuaWNlbHkgaGFuZGxlcyB0aGUgZW50cnkgc2hpZnRpbmcgb24gaW5zZXJ0cyBhbmQKLSAgLy8gcmVtb3Zlcy4KLSAgcHJpdmF0ZSBMaXN0PEVudHJ5PiBlbnRyeUxpc3Q7Ci0gIHByaXZhdGUgTWFwPEssIFY+IG92ZXJmbG93RW50cmllczsKLSAgcHJpdmF0ZSBib29sZWFuIGlzSW1tdXRhYmxlOwotICAvLyBUaGUgRW50cnlTZXQgaXMgYSBzdGF0ZWxlc3MgdmlldyBvZiB0aGUgTWFwLiBJdCdzIGluaXRpYWxpemVkIHRoZSBmaXJzdAotICAvLyB0aW1lIGl0IGlzIHJlcXVlc3RlZCBhbmQgcmV1c2VkIGhlbmNlZm9ydGguCi0gIHByaXZhdGUgdm9sYXRpbGUgRW50cnlTZXQgbGF6eUVudHJ5U2V0OwotCi0gIC8qKgotICAgKiBAY29kZSBhcnJheVNpemUgU2l6ZSBvZiB0aGUgYXJyYXkgaW4gd2hpY2ggdGhlIGxleGljb2dyYXBoaWNhbGx5IHNtYWxsZXN0Ci0gICAqICAgICAgIG1hcHBpbmdzIGFyZSBzdG9yZWQuIChpLmUuIHRoZSB7QGNvZGUga30gcmVmZXJyZWQgdG8gaW4gdGhlIGNsYXNzCi0gICAqICAgICAgIGRvY3VtZW50YXRpb24pLgotICAgKi8KLSAgcHJpdmF0ZSBTbWFsbFNvcnRlZE1hcChpbnQgYXJyYXlTaXplKSB7Ci0gICAgdGhpcy5tYXhBcnJheVNpemUgPSBhcnJheVNpemU7Ci0gICAgdGhpcy5lbnRyeUxpc3QgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICB0aGlzLm92ZXJmbG93RW50cmllcyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gIH0KLQotICAvKiogTWFrZSB0aGlzIG1hcCBpbW11dGFibGUgZnJvbSB0aGlzIHBvaW50IGZvcndhcmQuICovCi0gIHB1YmxpYyB2b2lkIG1ha2VJbW11dGFibGUoKSB7Ci0gICAgaWYgKCFpc0ltbXV0YWJsZSkgewotICAgICAgLy8gTm90ZTogVGhlcmUncyBubyBuZWVkIHRvIHdyYXAgdGhlIGVudHJ5TGlzdCBpbiBhbiB1bm1vZGlmaWFibGVMaXN0Ci0gICAgICAvLyBiZWNhdXNlIG5vbmUgb2YgdGhlIGxpc3QncyBhY2Nlc3NvcnMgYXJlIGV4cG9zZWQuIFRoZSBpdGVyYXRvcigpIG9mCi0gICAgICAvLyBvdmVyZmxvd0VudHJpZXMsIG9uIHRoZSBvdGhlciBoYW5kLCBpcyBleHBvc2VkIHNvIGl0IG11c3QgYmUgbWFkZQotICAgICAgLy8gdW5tb2RpZmlhYmxlLgotICAgICAgb3ZlcmZsb3dFbnRyaWVzID0gb3ZlcmZsb3dFbnRyaWVzLmlzRW1wdHkoKSA/Ci0gICAgICAgICAgQ29sbGVjdGlvbnMuPEssIFY+ZW1wdHlNYXAoKSA6Ci0gICAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG92ZXJmbG93RW50cmllcyk7Ci0gICAgICBpc0ltbXV0YWJsZSA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLyoqIEByZXR1cm4gV2hldGhlciB7QGxpbmsgI21ha2VJbW11dGFibGUoKX0gaGFzIGJlZW4gY2FsbGVkLiAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0ltbXV0YWJsZSgpIHsKLSAgICByZXR1cm4gaXNJbW11dGFibGU7Ci0gIH0KLQotICAvKiogQHJldHVybiBUaGUgbnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGVudHJ5IGFycmF5LiAqLwotICBwdWJsaWMgaW50IGdldE51bUFycmF5RW50cmllcygpIHsKLSAgICByZXR1cm4gZW50cnlMaXN0LnNpemUoKTsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIFRoZSBhcnJheSBlbnRyeSBhdCB0aGUgZ2l2ZW4ge0Bjb2RlIGluZGV4fS4gKi8KLSAgcHVibGljIE1hcC5FbnRyeTxLLCBWPiBnZXRBcnJheUVudHJ5QXQoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGVudHJ5TGlzdC5nZXQoaW5kZXgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlcmUgbnVtYmVyIG9mIG92ZXJmbG93IGVudHJpZXMuICovCi0gIHB1YmxpYyBpbnQgZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkgewotICAgIHJldHVybiBvdmVyZmxvd0VudHJpZXMuc2l6ZSgpOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gQW4gaXRlcmFibGUgb3ZlciB0aGUgb3ZlcmZsb3cgZW50cmllcy4gKi8KLSAgcHVibGljIEl0ZXJhYmxlPE1hcC5FbnRyeTxLLCBWPj4gZ2V0T3ZlcmZsb3dFbnRyaWVzKCkgewotICAgIHJldHVybiBvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpID8KLSAgICAgICAgRW1wdHlTZXQuPE1hcC5FbnRyeTxLLCBWPj5pdGVyYWJsZSgpIDoKLSAgICAgICAgb3ZlcmZsb3dFbnRyaWVzLmVudHJ5U2V0KCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBzaXplKCkgewotICAgIHJldHVybiBlbnRyeUxpc3Quc2l6ZSgpICsgb3ZlcmZsb3dFbnRyaWVzLnNpemUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgaW1wbGVtZW50YXRpb24gdGhyb3dzIGEge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgbyBpcyBub3QgYW4KLSAgICogb2JqZWN0IG9mIHR5cGUge0Bjb2RlIEt9LgotICAgKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gY29udGFpbnNLZXkoT2JqZWN0IG8pIHsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBmaW5hbCBLIGtleSA9IChLKSBvOwotICAgIHJldHVybiBiaW5hcnlTZWFyY2hJbkFycmF5KGtleSkgPj0gMCB8fCBvdmVyZmxvd0VudHJpZXMuY29udGFpbnNLZXkoa2V5KTsKLSAgfQotCi0gIC8qKgotICAgKiBUaGUgaW1wbGVtZW50YXRpb24gdGhyb3dzIGEge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgbyBpcyBub3QgYW4KLSAgICogb2JqZWN0IG9mIHR5cGUge0Bjb2RlIEt9LgotICAgKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIFYgZ2V0KE9iamVjdCBvKSB7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgZmluYWwgSyBrZXkgPSAoSykgbzsKLSAgICBmaW5hbCBpbnQgaW5kZXggPSBiaW5hcnlTZWFyY2hJbkFycmF5KGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgIHJldHVybiBlbnRyeUxpc3QuZ2V0KGluZGV4KS5nZXRWYWx1ZSgpOwotICAgIH0KLSAgICByZXR1cm4gb3ZlcmZsb3dFbnRyaWVzLmdldChrZXkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBWIHB1dChLIGtleSwgViB2YWx1ZSkgewotICAgIGNoZWNrTXV0YWJsZSgpOwotICAgIGZpbmFsIGludCBpbmRleCA9IGJpbmFyeVNlYXJjaEluQXJyYXkoa2V5KTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgLy8gUmVwbGFjZSBleGlzdGluZyBhcnJheSBlbnRyeS4KLSAgICAgIHJldHVybiBlbnRyeUxpc3QuZ2V0KGluZGV4KS5zZXRWYWx1ZSh2YWx1ZSk7Ci0gICAgfQotICAgIGVuc3VyZUVudHJ5QXJyYXlNdXRhYmxlKCk7Ci0gICAgZmluYWwgaW50IGluc2VydGlvblBvaW50ID0gLShpbmRleCArIDEpOwotICAgIGlmIChpbnNlcnRpb25Qb2ludCA+PSBtYXhBcnJheVNpemUpIHsKLSAgICAgIC8vIFB1dCBkaXJlY3RseSBpbiBvdmVyZmxvdy4KLSAgICAgIHJldHVybiBnZXRPdmVyZmxvd0VudHJpZXNNdXRhYmxlKCkucHV0KGtleSwgdmFsdWUpOwotICAgIH0KLSAgICAvLyBJbnNlcnQgbmV3IEVudHJ5IGluIGFycmF5LgotICAgIGlmIChlbnRyeUxpc3Quc2l6ZSgpID09IG1heEFycmF5U2l6ZSkgewotICAgICAgLy8gU2hpZnQgdGhlIGxhc3QgYXJyYXkgZW50cnkgaW50byBvdmVyZmxvdy4KLSAgICAgIGZpbmFsIEVudHJ5IGxhc3RFbnRyeUluQXJyYXkgPSBlbnRyeUxpc3QucmVtb3ZlKG1heEFycmF5U2l6ZSAtIDEpOwotICAgICAgZ2V0T3ZlcmZsb3dFbnRyaWVzTXV0YWJsZSgpLnB1dChsYXN0RW50cnlJbkFycmF5LmdldEtleSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0RW50cnlJbkFycmF5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICBlbnRyeUxpc3QuYWRkKGluc2VydGlvblBvaW50LCBuZXcgRW50cnkoa2V5LCB2YWx1ZSkpOwotICAgIHJldHVybiBudWxsOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIGNoZWNrTXV0YWJsZSgpOwotICAgIGlmICghZW50cnlMaXN0LmlzRW1wdHkoKSkgewotICAgICAgZW50cnlMaXN0LmNsZWFyKCk7Ci0gICAgfQotICAgIGlmICghb3ZlcmZsb3dFbnRyaWVzLmlzRW1wdHkoKSkgewotICAgICAgb3ZlcmZsb3dFbnRyaWVzLmNsZWFyKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSBpbXBsZW1lbnRhdGlvbiB0aHJvd3MgYSB7QGNvZGUgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBhbgotICAgKiBvYmplY3Qgb2YgdHlwZSB7QGNvZGUgS30uCi0gICAqCi0gICAqIHtAaW5oZXJpdERvY30KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgViByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICBjaGVja011dGFibGUoKTsKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBmaW5hbCBLIGtleSA9IChLKSBvOwotICAgIGZpbmFsIGludCBpbmRleCA9IGJpbmFyeVNlYXJjaEluQXJyYXkoa2V5KTsKLSAgICBpZiAoaW5kZXggPj0gMCkgewotICAgICAgcmV0dXJuIHJlbW92ZUFycmF5RW50cnlBdChpbmRleCk7Ci0gICAgfQotICAgIC8vIG92ZXJmbG93RW50cmllcyBtaWdodCBiZSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoKSwgc28gb25seQotICAgIC8vIGNhbGwgcmVtb3ZlKCkgaWYgaXQgaXMgbm9uLWVtcHR5LgotICAgIGlmIChvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm4gbnVsbDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG92ZXJmbG93RW50cmllcy5yZW1vdmUoa2V5KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFYgcmVtb3ZlQXJyYXlFbnRyeUF0KGludCBpbmRleCkgewotICAgIGNoZWNrTXV0YWJsZSgpOwotICAgIGZpbmFsIFYgcmVtb3ZlZCA9IGVudHJ5TGlzdC5yZW1vdmUoaW5kZXgpLmdldFZhbHVlKCk7Ci0gICAgaWYgKCFvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpKSB7Ci0gICAgICAvLyBTaGlmdCB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIG92ZXJmbG93IHRvIGJlIHRoZSBsYXN0IGVudHJ5IGluIHRoZQotICAgICAgLy8gYXJyYXkuCi0gICAgICBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGl0ZXJhdG9yID0KLSAgICAgICAgICBnZXRPdmVyZmxvd0VudHJpZXNNdXRhYmxlKCkuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgICAgZW50cnlMaXN0LmFkZChuZXcgRW50cnkoaXRlcmF0b3IubmV4dCgpKSk7Ci0gICAgICBpdGVyYXRvci5yZW1vdmUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlbW92ZWQ7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGtleSBUaGUga2V5IHRvIGZpbmQgaW4gdGhlIGVudHJ5IGFycmF5LgotICAgKiBAcmV0dXJuIFRoZSByZXR1cm5lZCBpbnRlZ2VyIHBvc2l0aW9uIGZvbGxvd3MgdGhlIHNhbWUgc2VtYW50aWNzIGFzIHRoZQotICAgKiAgICAgdmFsdWUgcmV0dXJuZWQgYnkge0BsaW5rIGphdmEudXRpbC5BcnJheXMjYmluYXJ5U2VhcmNoKCl9LgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgYmluYXJ5U2VhcmNoSW5BcnJheShLIGtleSkgewotICAgIGludCBsZWZ0ID0gMDsKLSAgICBpbnQgcmlnaHQgPSBlbnRyeUxpc3Quc2l6ZSgpIC0gMTsKLQotICAgIC8vIE9wdGltaXphdGlvbjogRm9yIHRoZSBjb21tb24gY2FzZSBpbiB3aGljaCBlbnRyaWVzIGFyZSBhZGRlZCBpbgotICAgIC8vIGFzY2VuZGluZyB0YWcgb3JkZXIsIGNoZWNrIHRoZSBsYXJnZXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5IGJlZm9yZQotICAgIC8vIGRvaW5nIGEgZnVsbCBiaW5hcnkgc2VhcmNoLgotICAgIGlmIChyaWdodCA+PSAwKSB7Ci0gICAgICBpbnQgY21wID0ga2V5LmNvbXBhcmVUbyhlbnRyeUxpc3QuZ2V0KHJpZ2h0KS5nZXRLZXkoKSk7Ci0gICAgICBpZiAoY21wID4gMCkgewotICAgICAgICByZXR1cm4gLShyaWdodCArIDIpOyAgLy8gSW5zZXJ0IHBvaW50IGlzIGFmdGVyICJyaWdodCIuCi0gICAgICB9IGVsc2UgaWYgKGNtcCA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByaWdodDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICB3aGlsZSAobGVmdCA8PSByaWdodCkgewotICAgICAgaW50IG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKLSAgICAgIGludCBjbXAgPSBrZXkuY29tcGFyZVRvKGVudHJ5TGlzdC5nZXQobWlkKS5nZXRLZXkoKSk7Ci0gICAgICBpZiAoY21wIDwgMCkgewotICAgICAgICByaWdodCA9IG1pZCAtIDE7Ci0gICAgICB9IGVsc2UgaWYgKGNtcCA+IDApIHsKLSAgICAgICAgbGVmdCA9IG1pZCArIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbWlkOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gLShsZWZ0ICsgMSk7Ci0gIH0KLQotICAvKioKLSAgICogU2ltaWxhciB0byB0aGUgQWJzdHJhY3RNYXAgaW1wbGVtZW50YXRpb24gb2Yge0Bjb2RlIGtleVNldCgpfSBhbmQKLSAgICoge0Bjb2RlIHZhbHVlcygpfSwgdGhlIGVudHJ5IHNldCBpcyBjcmVhdGVkIHRoZSBmaXJzdCB0aW1lIHRoaXMgbWV0aG9kIGlzCi0gICAqIGNhbGxlZCwgYW5kIHJldHVybmVkIGluIHJlc3BvbnNlIHRvIGFsbCBzdWJzZXF1ZW50IGNhbGxzLgotICAgKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIFNldDxNYXAuRW50cnk8SywgVj4+IGVudHJ5U2V0KCkgewotICAgIGlmIChsYXp5RW50cnlTZXQgPT0gbnVsbCkgewotICAgICAgbGF6eUVudHJ5U2V0ID0gbmV3IEVudHJ5U2V0KCk7Ci0gICAgfQotICAgIHJldHVybiBsYXp5RW50cnlTZXQ7Ci0gIH0KLQotICAvKioKLSAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB7QGxpbmsgI21ha2VJbW11dGFibGUoKX0gaGFzCi0gICAqICAgICAgICAgaGFzIGJlZW4gY2FsbGVkLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrTXV0YWJsZSgpIHsKLSAgICBpZiAoaXNJbW11dGFibGUpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBAcmV0dXJuIGEge0BsaW5rIFNvcnRlZE1hcH0gdG8gd2hpY2ggb3ZlcmZsb3cgZW50cmllcyBtYXBwaW5ncyBjYW4gYmUKLSAgICogICAgICAgICBhZGRlZCBvciByZW1vdmVkLgotICAgKiBAdGhyb3dzIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGlmIHtAbGluayAjbWFrZUltbXV0YWJsZSgpfSBoYXMgYmVlbgotICAgKiAgICAgICAgIGNhbGxlZC4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIFNvcnRlZE1hcDxLLCBWPiBnZXRPdmVyZmxvd0VudHJpZXNNdXRhYmxlKCkgewotICAgIGNoZWNrTXV0YWJsZSgpOwotICAgIGlmIChvdmVyZmxvd0VudHJpZXMuaXNFbXB0eSgpICYmICEob3ZlcmZsb3dFbnRyaWVzIGluc3RhbmNlb2YgVHJlZU1hcCkpIHsKLSAgICAgIG92ZXJmbG93RW50cmllcyA9IG5ldyBUcmVlTWFwPEssIFY+KCk7Ci0gICAgfQotICAgIHJldHVybiAoU29ydGVkTWFwPEssIFY+KSBvdmVyZmxvd0VudHJpZXM7Ci0gIH0KLQotICAvKioKLSAgICogTGF6aWx5IGNyZWF0ZXMgdGhlIGVudHJ5IGxpc3QuIEFueSBjb2RlIHRoYXQgYWRkcyB0byB0aGUgbGlzdCBtdXN0IGZpcnN0Ci0gICAqIGNhbGwgdGhpcyBtZXRob2QuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZW5zdXJlRW50cnlBcnJheU11dGFibGUoKSB7Ci0gICAgY2hlY2tNdXRhYmxlKCk7Ci0gICAgaWYgKGVudHJ5TGlzdC5pc0VtcHR5KCkgJiYgIShlbnRyeUxpc3QgaW5zdGFuY2VvZiBBcnJheUxpc3QpKSB7Ci0gICAgICBlbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PEVudHJ5PihtYXhBcnJheVNpemUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnRyeSBpbXBsZW1lbnRhdGlvbiB0aGF0IGltcGxlbWVudHMgQ29tcGFyYWJsZSBpbiBvcmRlciB0byBzdXBwb3J0Ci0gICAqIGJpbmFyeSBzZWFyY2ggd2l0aGluIHRoZSBlbnRyeSBhcnJheS4gQWxzbyBjaGVja3MgbXV0YWJpbGl0eSBpbgotICAgKiB7QGxpbmsgI3NldFZhbHVlKCl9LgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeSBpbXBsZW1lbnRzIE1hcC5FbnRyeTxLLCBWPiwgQ29tcGFyYWJsZTxFbnRyeT4gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBLIGtleTsKLSAgICBwcml2YXRlIFYgdmFsdWU7Ci0KLSAgICBFbnRyeShNYXAuRW50cnk8SywgVj4gY29weSkgewotICAgICAgdGhpcyhjb3B5LmdldEtleSgpLCBjb3B5LmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIEVudHJ5KEsga2V5LCBWIHZhbHVlKSB7Ci0gICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgSyBnZXRLZXkoKSB7Ci0gICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBWIGdldFZhbHVlKCkgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEVudHJ5IG90aGVyKSB7Ci0gICAgICByZXR1cm4gZ2V0S2V5KCkuY29tcGFyZVRvKG90aGVyLmdldEtleSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgViBzZXRWYWx1ZShWIG5ld1ZhbHVlKSB7Ci0gICAgICBjaGVja011dGFibGUoKTsKLSAgICAgIGZpbmFsIFYgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgaWYgKG8gPT0gdGhpcykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgTWFwLkVudHJ5PD8sID8+IG90aGVyID0gKE1hcC5FbnRyeTw/LCA/PikgbzsKLSAgICAgIHJldHVybiBlcXVhbHMoa2V5LCBvdGhlci5nZXRLZXkoKSkgJiYgZXF1YWxzKHZhbHVlLCBvdGhlci5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIChrZXkgPT0gbnVsbCA/IDAgOiBrZXkuaGFzaENvZGUoKSkgXgotICAgICAgICAgICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4ga2V5ICsgIj0iICsgdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIGVxdWFscygpIHRoYXQgaGFuZGxlcyBudWxsIHZhbHVlcy4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICByZXR1cm4gbzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdGF0ZWxlc3MgdmlldyBvZiB0aGUgZW50cmllcyBpbiB0aGUgZmllbGQgbWFwLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldCBleHRlbmRzIEFic3RyYWN0U2V0PE1hcC5FbnRyeTxLLCBWPj4gewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gaXRlcmF0b3IoKSB7Ci0gICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gU21hbGxTb3J0ZWRNYXAudGhpcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGEge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgbyBpcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUuCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgZmluYWwgTWFwLkVudHJ5PEssIFY+IGVudHJ5ID0gKE1hcC5FbnRyeTxLLCBWPikgbzsKLSAgICAgIGZpbmFsIFYgZXhpc3RpbmcgPSBnZXQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgZmluYWwgViB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICByZXR1cm4gZXhpc3RpbmcgPT0gdmFsdWUgfHwKLSAgICAgICAgICAoZXhpc3RpbmcgIT0gbnVsbCAmJiBleGlzdGluZy5lcXVhbHModmFsdWUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoTWFwLkVudHJ5PEssIFY+IGVudHJ5KSB7Ci0gICAgICBpZiAoIWNvbnRhaW5zKGVudHJ5KSkgewotICAgICAgICBwdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3MgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBvZiB0aGUgZXhwZWN0ZWQgdHlwZS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgZmluYWwgTWFwLkVudHJ5PEssIFY+IGVudHJ5ID0gKE1hcC5FbnRyeTxLLCBWPikgbzsKLSAgICAgIGlmIChjb250YWlucyhlbnRyeSkpIHsKLSAgICAgICAgU21hbGxTb3J0ZWRNYXAudGhpcy5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgIFNtYWxsU29ydGVkTWFwLnRoaXMuY2xlYXIoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gdGhhdCBzd2l0Y2hlcyBmcm9tIHRoZSBlbnRyeSBhcnJheSB0byB0aGUgb3ZlcmZsb3cKLSAgICogZW50cmllcyBhcHByb3ByaWF0ZWx5LgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiB7Ci0KLSAgICBwcml2YXRlIGludCBwb3MgPSAtMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbmV4dENhbGxlZEJlZm9yZVJlbW92ZTsKLSAgICBwcml2YXRlIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gbGF6eU92ZXJmbG93SXRlcmF0b3I7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgcmV0dXJuIChwb3MgKyAxKSA8IGVudHJ5TGlzdC5zaXplKCkgfHwKLSAgICAgICAgICBnZXRPdmVyZmxvd0l0ZXJhdG9yKCkuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNYXAuRW50cnk8SywgVj4gbmV4dCgpIHsKLSAgICAgIG5leHRDYWxsZWRCZWZvcmVSZW1vdmUgPSB0cnVlOwotICAgICAgLy8gQWx3YXlzIGluY3JlbWVudCBwb3Mgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgdGhlIGxhc3QgcmV0dXJuZWQgdmFsdWUKLSAgICAgIC8vIHdhcyBmcm9tIHRoZSBhcnJheSBvciBmcm9tIG92ZXJmbG93LgotICAgICAgaWYgKCsrcG9zIDwgZW50cnlMaXN0LnNpemUoKSkgewotICAgICAgICByZXR1cm4gZW50cnlMaXN0LmdldChwb3MpOwotICAgICAgfQotICAgICAgcmV0dXJuIGdldE92ZXJmbG93SXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgaWYgKCFuZXh0Q2FsbGVkQmVmb3JlUmVtb3ZlKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJlbW92ZSgpIHdhcyBjYWxsZWQgYmVmb3JlIG5leHQoKSIpOwotICAgICAgfQotICAgICAgbmV4dENhbGxlZEJlZm9yZVJlbW92ZSA9IGZhbHNlOwotICAgICAgY2hlY2tNdXRhYmxlKCk7Ci0KLSAgICAgIGlmIChwb3MgPCBlbnRyeUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgIHJlbW92ZUFycmF5RW50cnlBdChwb3MtLSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZXRPdmVyZmxvd0l0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXQgaXMgaW1wb3J0YW50IHRvIGNyZWF0ZSB0aGUgb3ZlcmZsb3cgaXRlcmF0b3Igb25seSBhZnRlciB0aGUgYXJyYXkKLSAgICAgKiBlbnRyaWVzIGhhdmUgYmVlbiBpdGVyYXRlZCBvdmVyIGJlY2F1c2UgdGhlIG92ZXJmbG93IGVudHJ5IHNldCBjaGFuZ2VzCi0gICAgICogd2hlbiB0aGUgY2xpZW50IGNhbGxzIHJlbW92ZSgpIG9uIHRoZSBhcnJheSBlbnRyaWVzLCB3aGljaCBpbnZhbGlkYXRlcwotICAgICAqIGFueSBleGlzdGluZyBpdGVyYXRvcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGdldE92ZXJmbG93SXRlcmF0b3IoKSB7Ci0gICAgICBpZiAobGF6eU92ZXJmbG93SXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICBsYXp5T3ZlcmZsb3dJdGVyYXRvciA9IG92ZXJmbG93RW50cmllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGF6eU92ZXJmbG93SXRlcmF0b3I7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBjbGFzcyB0aGF0IGhvbGRzIGltbXV0YWJsZSBpbnN0YW5jZXMgb2YgYW4gSXRlcmFibGUvSXRlcmF0b3IgdGhhdAotICAgKiB3ZSByZXR1cm4gd2hlbiB0aGUgb3ZlcmZsb3cgZW50cmllcyBpcyBlbXB0eS4gVGhpcyBlbGltaW5hdGVzIHRoZSBjcmVhdGlvbgotICAgKiBvZiBhbiBJdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGl0ZXJhdGUgb3Zlci4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5U2V0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yPE9iamVjdD4gSVRFUkFUT1IgPQotICAgICAgICBuZXcgSXRlcmF0b3I8T2JqZWN0PigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTm9TdWNoRWxlbWVudEV4Y2VwdGlvbigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJdGVyYWJsZTxPYmplY3Q+IElURVJBQkxFID0KLSAgICAgICAgbmV3IEl0ZXJhYmxlPE9iamVjdD4oKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIEl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IoKSB7Ci0gICAgICAgICAgICByZXR1cm4gSVRFUkFUT1I7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBpdGVyYWJsZSgpIHsKLSAgICAgIHJldHVybiAoSXRlcmFibGU8VD4pIElURVJBQkxFOwotICAgIH0KLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgIGlmICh0aGlzID09IG8pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAKLSAgICBpZiAoIShvIGluc3RhbmNlb2YgU21hbGxTb3J0ZWRNYXApKSB7Ci0gICAgICByZXR1cm4gc3VwZXIuZXF1YWxzKG8pOwotICAgIH0KLSAgICAKLSAgICBTbWFsbFNvcnRlZE1hcDw/LCA/PiBvdGhlciA9IChTbWFsbFNvcnRlZE1hcDw/LCA/PikgbzsKLSAgICBmaW5hbCBpbnQgc2l6ZSA9IHNpemUoKTsKLSAgICBpZiAoc2l6ZSAhPSBvdGhlci5zaXplKCkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgCi0gICAgLy8gQmVzdCBlZmZvcnQgdHJ5IHRvIGF2b2lkIGFsbG9jYXRpbmcgYW4gZW50cnkgc2V0LgotICAgIGZpbmFsIGludCBudW1BcnJheUVudHJpZXMgPSBnZXROdW1BcnJheUVudHJpZXMoKTsKLSAgICBpZiAobnVtQXJyYXlFbnRyaWVzICE9IG90aGVyLmdldE51bUFycmF5RW50cmllcygpKSB7Ci0gICAgICByZXR1cm4gZW50cnlTZXQoKS5lcXVhbHMob3RoZXIuZW50cnlTZXQoKSk7Ci0gICAgfQotICAgIAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtQXJyYXlFbnRyaWVzOyBpKyspIHsKLSAgICAgIGlmICghZ2V0QXJyYXlFbnRyeUF0KGkpLmVxdWFscyhvdGhlci5nZXRBcnJheUVudHJ5QXQoaSkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgaWYgKG51bUFycmF5RW50cmllcyAhPSBzaXplKSB7Ci0gICAgICByZXR1cm4gb3ZlcmZsb3dFbnRyaWVzLmVxdWFscyhvdGhlci5vdmVyZmxvd0VudHJpZXMpOwotICAgIH0KLSAgICAKLSAgICAKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IGggPSAwOwotICAgIGZpbmFsIGludCBsaXN0U2l6ZSA9IGdldE51bUFycmF5RW50cmllcygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGlzdFNpemU7IGkrKykgewotICAgICAgaCArPSBlbnRyeUxpc3QuZ2V0KGkpLmhhc2hDb2RlKCk7Ci0gICAgfQotICAgIC8vIEF2b2lkIHRoZSBpdGVyYXRvciBhbGxvY2F0aW9uIGlmIHBvc3NpYmxlLgotICAgIGlmIChnZXROdW1PdmVyZmxvd0VudHJpZXMoKSA+IDApIHsKLSAgICAgIGggKz0gb3ZlcmZsb3dFbnRyaWVzLmhhc2hDb2RlKCk7Ci0gICAgfQotICAgIHJldHVybiBoOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMWMzMjhmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA3MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguTWF0Y2hlcjsKLWltcG9ydCBqYXZhLnV0aWwucmVnZXguUGF0dGVybjsKLQotLyoqCi0gKiBQcm92aWRlIHRleHQgcGFyc2luZyBhbmQgZm9ybWF0dGluZyBzdXBwb3J0IGZvciBwcm90bzIgaW5zdGFuY2VzLgotICogVGhlIGltcGxlbWVudGF0aW9uIGxhcmdlbHkgZm9sbG93cyBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MuCi0gKgotICogQGF1dGhvciB3ZW5ib3pAZ29vZ2xlLmNvbSBXZW5ibyBaaHUKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXh0Rm9ybWF0IHsKLSAgcHJpdmF0ZSBUZXh0Rm9ybWF0KCkge30KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0KLSAgICAgIExvZ2dlci5nZXRMb2dnZXIoVGV4dEZvcm1hdC5jbGFzcy5nZXROYW1lKCkpOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFByaW50ZXIgREVGQVVMVF9QUklOVEVSID0gbmV3IFByaW50ZXIoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJpbnRlciBTSU5HTEVfTElORV9QUklOVEVSID0KLSAgICAgIChuZXcgUHJpbnRlcigpKS5zZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJpbnRlciBVTklDT0RFX1BSSU5URVIgPQotICAgICAgKG5ldyBQcmludGVyKCkpLnNldEVzY2FwZU5vbkFzY2lpKGZhbHNlKTsKLQotICAvKioKLSAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFByb3RvY29sIE1lc3NhZ2Ugc3VwcGxpZWQgaW50bwotICAgKiB0aGUgcGFyYW1ldGVyIG91dHB1dC4gKFRoaXMgcmVwcmVzZW50YXRpb24gaXMgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZQotICAgKiBjbGFzc2ljICJQcm90b2NvbFByaW50ZXIiIG91dHB1dCBmcm9tIHRoZSBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXIgc3lzdGVtKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KAotICAgICAgZmluYWwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlLCBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgREVGQVVMVF9QUklOVEVSLnByaW50KG1lc3NhZ2UsIG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCkpOwotICB9Ci0KLSAgLyoqIE91dHB1dHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHtAY29kZSBmaWVsZHN9IHRvIHtAY29kZSBvdXRwdXR9LiAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnQoZmluYWwgVW5rbm93bkZpZWxkU2V0IGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEFwcGVuZGFibGUgb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBERUZBVUxUX1BSSU5URVIucHJpbnRVbmtub3duRmllbGRzKGZpZWxkcywgbmV3IFRleHRHZW5lcmF0b3Iob3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogU2FtZSBhcyB7QGNvZGUgcHJpbnQoKX0sIGV4Y2VwdCB0aGF0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFyZSBub3QKLSAgICogZXNjYXBlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVuaWNvZGUoCi0gICAgICBmaW5hbCBNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UsIGZpbmFsIEFwcGVuZGFibGUgb3V0cHV0KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBVTklDT0RFX1BSSU5URVIucHJpbnQobWVzc2FnZSwgbmV3IFRleHRHZW5lcmF0b3Iob3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogU2FtZSBhcyB7QGNvZGUgcHJpbnQoKX0sIGV4Y2VwdCB0aGF0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzIGFyZSBub3QKLSAgICogZXNjYXBlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBwcmludFVuaWNvZGUoZmluYWwgVW5rbm93bkZpZWxkU2V0IGZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFVOSUNPREVfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoZmllbGRzLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZXMgYSBodW1hbiByZWFkYWJsZSBmb3JtIG9mIHRoaXMgbWVzc2FnZSwgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgYW5kCi0gICAqIG90aGVyIHB1cnBvc2VzLCB3aXRoIG5vIG5ld2xpbmUgY2hhcmFjdGVycy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHNob3J0RGVidWdTdHJpbmcoZmluYWwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgU0lOR0xFX0xJTkVfUFJJTlRFUi5wcmludChtZXNzYWdlLCBuZXcgVGV4dEdlbmVyYXRvcihzYikpOwotICAgICAgLy8gU2luZ2xlIGxpbmUgbW9kZSBjdXJyZW50bHkgbWlnaHQgaGF2ZSBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kLgotICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkudHJpbSgpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIGZpZWxkLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotICAgKiBhbmQgb3RoZXIgcHVycG9zZXMsIHdpdGggbm8gbmV3bGluZSBjaGFyYWN0ZXJzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnREZWJ1Z1N0cmluZyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgU0lOR0xFX0xJTkVfUFJJTlRFUi5wcmludEZpZWxkKGZpZWxkLCB2YWx1ZSwgbmV3IFRleHRHZW5lcmF0b3Ioc2IpKTsKLSAgICAgIHJldHVybiBzYi50b1N0cmluZygpLnRyaW0oKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhlIHVua25vd24gZmllbGRzLCB1c2VmdWwgZm9yIGRlYnVnZ2luZwotICAgKiBhbmQgb3RoZXIgcHVycG9zZXMsIHdpdGggbm8gbmV3bGluZSBjaGFyYWN0ZXJzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnREZWJ1Z1N0cmluZyhmaW5hbCBVbmtub3duRmllbGRTZXQgZmllbGRzKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2IgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgU0lOR0xFX0xJTkVfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoZmllbGRzLCBuZXcgVGV4dEdlbmVyYXRvcihzYikpOwotICAgICAgLy8gU2luZ2xlIGxpbmUgbW9kZSBjdXJyZW50bHkgbWlnaHQgaGF2ZSBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kLgotICAgICAgcmV0dXJuIHNiLnRvU3RyaW5nKCkudHJpbSgpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0Bjb2RlIHByaW50KCl9LCBidXQgd3JpdGVzIGRpcmVjdGx5IHRvIGEge0Bjb2RlIFN0cmluZ30gYW5kCi0gICAqIHJldHVybnMgaXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludFRvU3RyaW5nKGZpbmFsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgcHJpbnQobWVzc2FnZSwgdGV4dCk7Ci0gICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0Bjb2RlIHByaW50KCl9LCBidXQgd3JpdGVzIGRpcmVjdGx5IHRvIGEge0Bjb2RlIFN0cmluZ30gYW5kCi0gICAqIHJldHVybnMgaXQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBwcmludFRvU3RyaW5nKGZpbmFsIFVua25vd25GaWVsZFNldCBmaWVsZHMpIHsKLSAgICB0cnkgewotICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIHByaW50KGZpZWxkcywgdGV4dCk7Ci0gICAgICByZXR1cm4gdGV4dC50b1N0cmluZygpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNhbWUgYXMge0Bjb2RlIHByaW50VG9TdHJpbmcoKX0sIGV4Y2VwdCB0aGF0IG5vbi1BU0NJSSBjaGFyYWN0ZXJzCi0gICAqIGluIHN0cmluZyB0eXBlIGZpZWxkcyBhcmUgbm90IGVzY2FwZWQgaW4gYmFja3NsYXNoK29jdGFscy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50VG9Vbmljb2RlU3RyaW5nKGZpbmFsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgVU5JQ09ERV9QUklOVEVSLnByaW50KG1lc3NhZ2UsIG5ldyBUZXh0R2VuZXJhdG9yKHRleHQpKTsKLSAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2FtZSBhcyB7QGNvZGUgcHJpbnRUb1N0cmluZygpfSwgZXhjZXB0IHRoYXQgbm9uLUFTQ0lJIGNoYXJhY3RlcnMKLSAgICogaW4gc3RyaW5nIHR5cGUgZmllbGRzIGFyZSBub3QgZXNjYXBlZCBpbiBiYWNrc2xhc2grb2N0YWxzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcHJpbnRUb1VuaWNvZGVTdHJpbmcoZmluYWwgVW5rbm93bkZpZWxkU2V0IGZpZWxkcykgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgVU5JQ09ERV9QUklOVEVSLnByaW50VW5rbm93bkZpZWxkcyhmaWVsZHMsIG5ldyBUZXh0R2VuZXJhdG9yKHRleHQpKTsKLSAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgREVGQVVMVF9QUklOVEVSLnByaW50RmllbGQoZmllbGQsIHZhbHVlLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50RmllbGRUb1N0cmluZyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICB0cnkgewotICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIHByaW50RmllbGQoZmllbGQsIHZhbHVlLCB0ZXh0KTsKLSAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGdpdmVuIGZpZWxkIHZhbHVlLgotICAgKgotICAgKiBAcGFyYW0gZmllbGQgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCB0byB3aGljaCB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCB2YWx1ZQotICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUKLSAgICogICAgIGdpdmVuIGZpZWxkIGRlc2NyaXB0b3IKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gd3JpdGluZyB0byB0aGUgb3V0cHV0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZFZhbHVlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBERUZBVUxUX1BSSU5URVIucHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgbmV3IFRleHRHZW5lcmF0b3Iob3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGFuIHVua25vd24gZmllbGQuCi0gICAqCi0gICAqIEBwYXJhbSB0YWcgdGhlIGZpZWxkJ3MgdGFnIG51bWJlcgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAotICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgdmFsdWUKLSAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAqICAgICBnaXZlbiBmaWVsZCBkZXNjcmlwdG9yCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdyaXRpbmcgdG8gdGhlIG91dHB1dAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VW5rbm93bkZpZWxkVmFsdWUoZmluYWwgaW50IHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBwcmludFVua25vd25GaWVsZFZhbHVlKHRhZywgdmFsdWUsIG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVua25vd25GaWVsZFZhbHVlKGZpbmFsIGludCB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6Ci0gICAgICAgIGdlbmVyYXRvci5wcmludCh1bnNpZ25lZFRvU3RyaW5nKChMb25nKSB2YWx1ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgotICAgICAgICBnZW5lcmF0b3IucHJpbnQoCi0gICAgICAgICAgICBTdHJpbmcuZm9ybWF0KChMb2NhbGUpIG51bGwsICIweCUwOHgiLCAoSW50ZWdlcikgdmFsdWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NDoKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KFN0cmluZy5mb3JtYXQoKExvY2FsZSkgbnVsbCwgIjB4JTAxNngiLCAoTG9uZykgdmFsdWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlQnl0ZXMoKEJ5dGVTdHJpbmcpIHZhbHVlKSk7Ci0gICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6Ci0gICAgICAgIERFRkFVTFRfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoKFVua25vd25GaWVsZFNldCkgdmFsdWUsIGdlbmVyYXRvcik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHRhZzogIiArIHRhZyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIEhlbHBlciBjbGFzcyBmb3IgY29udmVydGluZyBwcm90b2J1ZnMgdG8gdGV4dC4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJpbnRlciB7Ci0gICAgLyoqIFdoZXRoZXIgdG8gb21pdCBuZXdsaW5lcyBmcm9tIHRoZSBvdXRwdXQuICovCi0gICAgYm9vbGVhbiBzaW5nbGVMaW5lTW9kZSA9IGZhbHNlOwotCi0gICAgLyoqIFdoZXRoZXIgdG8gZXNjYXBlIG5vbiBBU0NJSSBjaGFyYWN0ZXJzIHdpdGggYmFja3NsYXNoIGFuZCBvY3RhbC4gKi8KLSAgICBib29sZWFuIGVzY2FwZU5vbkFzY2lpID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgUHJpbnRlcigpIHt9Ci0KLSAgICAvKiogU2V0dGVyIG9mIHNpbmdsZUxpbmVNb2RlICovCi0gICAgcHJpdmF0ZSBQcmludGVyIHNldFNpbmdsZUxpbmVNb2RlKGJvb2xlYW4gc2luZ2xlTGluZU1vZGUpIHsKLSAgICAgIHRoaXMuc2luZ2xlTGluZU1vZGUgPSBzaW5nbGVMaW5lTW9kZTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKiBTZXR0ZXIgb2YgZXNjYXBlTm9uQXNjaWkgKi8KLSAgICBwcml2YXRlIFByaW50ZXIgc2V0RXNjYXBlTm9uQXNjaWkoYm9vbGVhbiBlc2NhcGVOb25Bc2NpaSkgewotICAgICAgdGhpcy5lc2NhcGVOb25Bc2NpaSA9IGVzY2FwZU5vbkFzY2lpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50KAotICAgICAgICBmaW5hbCBNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UsIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZm9yIChNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGZpZWxkCi0gICAgICAgICAgOiBtZXNzYWdlLmdldEFsbEZpZWxkcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgcHJpbnRGaWVsZChmaWVsZC5nZXRLZXkoKSwgZmllbGQuZ2V0VmFsdWUoKSwgZ2VuZXJhdG9yKTsKLSAgICAgIH0KLSAgICAgIHByaW50VW5rbm93bkZpZWxkcyhtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKSwgZ2VuZXJhdG9yKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgZmluYWwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIC8vIFJlcGVhdGVkIGZpZWxkLiAgUHJpbnQgZWFjaCBlbGVtZW50LgotICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pIHZhbHVlKSB7Ci0gICAgICAgICAgcHJpbnRTaW5nbGVGaWVsZChmaWVsZCwgZWxlbWVudCwgZ2VuZXJhdG9yKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRTaW5nbGVGaWVsZChmaWVsZCwgdmFsdWUsIGdlbmVyYXRvcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50U2luZ2xlRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJbIik7Ci0gICAgICAgIC8vIFdlIHNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0IGVsZW1lbnRzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLgotICAgICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKQotICAgICAgICAgICAgJiYgKGZpZWxkLmdldFR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuVHlwZS5NRVNTQUdFKQotICAgICAgICAgICAgJiYgKGZpZWxkLmlzT3B0aW9uYWwoKSkKLSAgICAgICAgICAgIC8vIG9iamVjdCBlcXVhbGl0eQotICAgICAgICAgICAgJiYgKGZpZWxkLmdldEV4dGVuc2lvblNjb3BlKCkgPT0gZmllbGQuZ2V0TWVzc2FnZVR5cGUoKSkpIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZmllbGQuZ2V0TWVzc2FnZVR5cGUoKS5nZXRGdWxsTmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZmllbGQuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJdIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLkdST1VQKSB7Ci0gICAgICAgICAgLy8gR3JvdXBzIG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIHRoZWlyIG9yaWdpbmFsIGNhcGl0YWxpemF0aW9uLgotICAgICAgICAgIGdlbmVyYXRvci5wcmludChmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldE5hbWUoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgaWYgKHNpbmdsZUxpbmVNb2RlKSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCIgeyAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIiB7XG4iKTsKLSAgICAgICAgICBnZW5lcmF0b3IuaW5kZW50KCk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdlbmVyYXRvci5wcmludCgiOiAiKTsKLSAgICAgIH0KLQotICAgICAgcHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgZ2VuZXJhdG9yKTsKLQotICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgaWYgKHNpbmdsZUxpbmVNb2RlKSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJ9ICIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdlbmVyYXRvci5vdXRkZW50KCk7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJ9XG4iKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKHNpbmdsZUxpbmVNb2RlKSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCIgIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcbiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50RmllbGRWYWx1ZShmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIElOVDMyOgotICAgICAgICBjYXNlIFNJTlQzMjoKLSAgICAgICAgY2FzZSBTRklYRUQzMjoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChJbnRlZ2VyKSB2YWx1ZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJTlQ2NDoKLSAgICAgICAgY2FzZSBTSU5UNjQ6Ci0gICAgICAgIGNhc2UgU0ZJWEVENjQ6Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCgoTG9uZykgdmFsdWUpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQk9PTDoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChCb29sZWFuKSB2YWx1ZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGTE9BVDoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChGbG9hdCkgdmFsdWUpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRE9VQkxFOgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKERvdWJsZSkgdmFsdWUpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgVUlOVDMyOgotICAgICAgICBjYXNlIEZJWEVEMzI6Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KHVuc2lnbmVkVG9TdHJpbmcoKEludGVnZXIpIHZhbHVlKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBVSU5UNjQ6Ci0gICAgICAgIGNhc2UgRklYRUQ2NDoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQodW5zaWduZWRUb1N0cmluZygoTG9uZykgdmFsdWUpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGVzY2FwZU5vbkFzY2lpCi0gICAgICAgICAgICAgID8gVGV4dEZvcm1hdEVzY2FwZXIuZXNjYXBlVGV4dCgoU3RyaW5nKSB2YWx1ZSkKLSAgICAgICAgICAgICAgOiBlc2NhcGVEb3VibGVRdW90ZXNBbmRCYWNrc2xhc2hlcygoU3RyaW5nKSB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgIC5yZXBsYWNlKCJcbiIsICJcXG4iKSk7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgQllURVM6Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludChlc2NhcGVCeXRlcygoQnl0ZVN0cmluZykgdmFsdWUpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGVzY2FwZUJ5dGVzKChieXRlW10pIHZhbHVlKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCgoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpLmdldE5hbWUoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICBjYXNlIEdST1VQOgotICAgICAgICAgIHByaW50KChNZXNzYWdlKSB2YWx1ZSwgZ2VuZXJhdG9yKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRVbmtub3duRmllbGRzKGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgVW5rbm93bkZpZWxkU2V0LkZpZWxkPiBlbnRyeSA6Ci0gICAgICAgICAgICAgICB1bmtub3duRmllbGRzLmFzTWFwKCkuZW50cnlTZXQoKSkgewotICAgICAgICBmaW5hbCBpbnQgbnVtYmVyID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICAgIGZpbmFsIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgIHByaW50VW5rbm93bkZpZWxkKG51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCi0gICAgICAgICAgICBmaWVsZC5nZXRWYXJpbnRMaXN0KCksIGdlbmVyYXRvcik7Ci0gICAgICAgIHByaW50VW5rbm93bkZpZWxkKG51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLAotICAgICAgICAgICAgZmllbGQuZ2V0Rml4ZWQzMkxpc3QoKSwgZ2VuZXJhdG9yKTsKLSAgICAgICAgcHJpbnRVbmtub3duRmllbGQobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCi0gICAgICAgICAgICBmaWVsZC5nZXRGaXhlZDY0TGlzdCgpLCBnZW5lcmF0b3IpOwotICAgICAgICBwcmludFVua25vd25GaWVsZChudW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKLSAgICAgICAgICAgIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKSwgZ2VuZXJhdG9yKTsKLSAgICAgICAgZm9yIChmaW5hbCBVbmtub3duRmllbGRTZXQgdmFsdWUgOiBmaWVsZC5nZXRHcm91cExpc3QoKSkgewotICAgICAgICAgIGdlbmVyYXRvci5wcmludChlbnRyeS5nZXRLZXkoKS50b1N0cmluZygpKTsKLSAgICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiIHsgIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiIHtcbiIpOwotICAgICAgICAgICAgZ2VuZXJhdG9yLmluZGVudCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmludFVua25vd25GaWVsZHModmFsdWUsIGdlbmVyYXRvcik7Ci0gICAgICAgICAgaWYgKHNpbmdsZUxpbmVNb2RlKSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn0gIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5vdXRkZW50KCk7Ci0gICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn1cbiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludFVua25vd25GaWVsZChmaW5hbCBpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgd2lyZVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIExpc3Q8Pz4gdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZvciAoZmluYWwgT2JqZWN0IHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgIGdlbmVyYXRvci5wcmludChTdHJpbmcudmFsdWVPZihudW1iZXIpKTsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCI6ICIpOwotICAgICAgICBwcmludFVua25vd25GaWVsZFZhbHVlKHdpcmVUeXBlLCB2YWx1ZSwgZ2VuZXJhdG9yKTsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KHNpbmdsZUxpbmVNb2RlID8gIiAiIDogIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqIENvbnZlcnQgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgdG8gYSBzdHJpbmcuICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHVuc2lnbmVkVG9TdHJpbmcoZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlID49IDApIHsKLSAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodmFsdWUgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQ29udmVydCBhbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB0byBhIHN0cmluZy4gKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdW5zaWduZWRUb1N0cmluZyhmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlID49IDApIHsKLSAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gUHVsbCBvZmYgdGhlIG1vc3Qtc2lnbmlmaWNhbnQgYml0IHNvIHRoYXQgQmlnSW50ZWdlciBkb2Vzbid0IHRoaW5rCi0gICAgICAvLyB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLCB0aGVuIHNldCBpdCBhZ2FpbiB1c2luZyBzZXRCaXQoKS4KLSAgICAgIHJldHVybiBCaWdJbnRlZ2VyLnZhbHVlT2YodmFsdWUgJiAweDdGRkZGRkZGRkZGRkZGRkZMKQotICAgICAgICAgICAgICAgICAgICAgICAuc2V0Qml0KDYzKS50b1N0cmluZygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBbiBpbm5lciBjbGFzcyBmb3Igd3JpdGluZyB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVGV4dEdlbmVyYXRvciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dDsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ0J1aWxkZXIgaW5kZW50ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gYXRTdGFydE9mTGluZSA9IHRydWU7Ci0KLSAgICBwcml2YXRlIFRleHRHZW5lcmF0b3IoZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpIHsKLSAgICAgIHRoaXMub3V0cHV0ID0gb3V0cHV0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEluZGVudCB0ZXh0IGJ5IHR3byBzcGFjZXMuICBBZnRlciBjYWxsaW5nIEluZGVudCgpLCB0d28gc3BhY2VzIHdpbGwgYmUKLSAgICAgKiBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvZiB0ZXh0LiAgSW5kZW50KCkgbWF5IGJlIGNhbGxlZAotICAgICAqIG11bHRpcGxlIHRpbWVzIHRvIHByb2R1Y2UgZGVlcGVyIGluZGVudHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgaW5kZW50KCkgewotICAgICAgaW5kZW50LmFwcGVuZCgiICAiKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWR1Y2VzIHRoZSBjdXJyZW50IGluZGVudCBsZXZlbCBieSB0d28gc3BhY2VzLCBvciBjcmFzaGVzIGlmIHRoZSBpbmRlbnQKLSAgICAgKiBsZXZlbCBpcyB6ZXJvLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG91dGRlbnQoKSB7Ci0gICAgICBmaW5hbCBpbnQgbGVuZ3RoID0gaW5kZW50Lmxlbmd0aCgpOwotICAgICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAiIE91dGRlbnQoKSB3aXRob3V0IG1hdGNoaW5nIEluZGVudCgpLiIpOwotICAgICAgfQotICAgICAgaW5kZW50LmRlbGV0ZShsZW5ndGggLSAyLCBsZW5ndGgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50IHRleHQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgcHJpbnQoZmluYWwgQ2hhclNlcXVlbmNlIHRleHQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBpbnQgc2l6ZSA9IHRleHQubGVuZ3RoKCk7Ci0gICAgICBpbnQgcG9zID0gMDsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgaWYgKHRleHQuY2hhckF0KGkpID09ICdcbicpIHsKLSAgICAgICAgICB3cml0ZSh0ZXh0LnN1YlNlcXVlbmNlKHBvcywgaSArIDEpKTsKLSAgICAgICAgICBwb3MgPSBpICsgMTsKLSAgICAgICAgICBhdFN0YXJ0T2ZMaW5lID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgd3JpdGUodGV4dC5zdWJTZXF1ZW5jZShwb3MsIHNpemUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgd3JpdGUoZmluYWwgQ2hhclNlcXVlbmNlIGRhdGEpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoZGF0YS5sZW5ndGgoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGlmIChhdFN0YXJ0T2ZMaW5lKSB7Ci0gICAgICAgIGF0U3RhcnRPZkxpbmUgPSBmYWxzZTsKLSAgICAgICAgb3V0cHV0LmFwcGVuZChpbmRlbnQpOwotICAgICAgfQotICAgICAgb3V0cHV0LmFwcGVuZChkYXRhKTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBQYXJzaW5nCi0KLSAgLyoqCi0gICAqIFJlcHJlc2VudHMgYSBzdHJlYW0gb2YgdG9rZW5zIHBhcnNlZCBmcm9tIGEge0Bjb2RlIFN0cmluZ30uCi0gICAqCi0gICAqIDxwPlRoZSBKYXZhIHN0YW5kYXJkIGxpYnJhcnkgcHJvdmlkZXMgbWFueSBjbGFzc2VzIHRoYXQgeW91IG1pZ2h0IHRoaW5rCi0gICAqIHdvdWxkIGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIHRoaXMsIGJ1dCBhcmVuJ3QuICBGb3IgZXhhbXBsZToKLSAgICoKLSAgICogPHVsPgotICAgKiA8bGk+e0Bjb2RlIGphdmEuaW8uU3RyZWFtVG9rZW5pemVyfTogIFRoaXMgYWxtb3N0IGRvZXMgd2hhdCB3ZSB3YW50IC0tIG9yLAotICAgKiAgIGF0IGxlYXN0LCBzb21ldGhpbmcgdGhhdCB3b3VsZCBnZXQgdXMgY2xvc2UgdG8gd2hhdCB3ZSB3YW50IC0tIGV4Y2VwdAotICAgKiAgIGZvciBvbmUgZmF0YWwgZmxhdzogIEl0IGF1dG9tYXRpY2FsbHkgdW4tZXNjYXBlcyBzdHJpbmdzIHVzaW5nIEphdmEKLSAgICogICBlc2NhcGUgc2VxdWVuY2VzLCB3aGljaCBkbyBub3QgaW5jbHVkZSBhbGwgdGhlIGVzY2FwZSBzZXF1ZW5jZXMgd2UKLSAgICogICBuZWVkIHRvIHN1cHBvcnQgKGUuZy4gJ1x4JykuCi0gICAqIDxsaT57QGNvZGUgamF2YS51dGlsLlNjYW5uZXJ9OiAgVGhpcyBzZWVtcyBsaWtlIGEgZ3JlYXQgd2F5IGF0IGxlYXN0IHRvCi0gICAqICAgcGFyc2UgcmVndWxhciBleHByZXNzaW9ucyBvdXQgb2YgYSBzdHJlYW0gKHNvIHdlIHdvdWxkbid0IGhhdmUgdG8gbG9hZAotICAgKiAgIHRoZSBlbnRpcmUgaW5wdXQgaW50byBhIHNpbmdsZSBzdHJpbmcgYmVmb3JlIHBhcnNpbmcpLiAgU2FkbHksCi0gICAqICAge0Bjb2RlIFNjYW5uZXJ9IHJlcXVpcmVzIHRoYXQgdG9rZW5zIGJlIGRlbGltaXRlZCB3aXRoIHNvbWUgZGVsaW1pdGVyLgotICAgKiAgIFRodXMsIGFsdGhvdWdoIHRoZSB0ZXh0ICJmb286IiBzaG91bGQgcGFyc2UgdG8gdHdvIHRva2VucyAoImZvbyIgYW5kCi0gICAqICAgIjoiKSwge0Bjb2RlIFNjYW5uZXJ9IHdvdWxkIHJlY29nbml6ZSBpdCBvbmx5IGFzIGEgc2luZ2xlIHRva2VuLgotICAgKiAgIEZ1cnRoZXJtb3JlLCB7QGNvZGUgU2Nhbm5lcn0gcHJvdmlkZXMgbm8gd2F5IHRvIGluc3BlY3QgdGhlIGNvbnRlbnRzCi0gICAqICAgb2YgZGVsaW1pdGVycywgbWFraW5nIGl0IGltcG9zc2libGUgdG8ga2VlcCB0cmFjayBvZiBsaW5lIGFuZCBjb2x1bW4KLSAgICogICBudW1iZXJzLgotICAgKiA8L3VsPgotICAgKgotICAgKiA8cD5MdWNraWx5LCBKYXZhJ3MgcmVndWxhciBleHByZXNzaW9uIHN1cHBvcnQgZG9lcyBtYW5hZ2UgdG8gYmUgdXNlZnVsIHRvCi0gICAqIHVzLiAgKEJhcmVseTogIFdlIG5lZWQge0Bjb2RlIE1hdGNoZXIudXNlUGF0dGVybigpfSwgd2hpY2ggaXMgbmV3IGluCi0gICAqIEphdmEgMS41LikgIFNvLCB3ZSBjYW4gdXNlIHRoYXQsIGF0IGxlYXN0LiAgVW5mb3J0dW5hdGVseSwgdGhpcyBpbXBsaWVzCi0gICAqIHRoYXQgd2UgbmVlZCB0byBoYXZlIHRoZSBlbnRpcmUgaW5wdXQgaW4gb25lIGNvbnRpZ3VvdXMgc3RyaW5nLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgVG9rZW5pemVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0OwotICAgIHByaXZhdGUgZmluYWwgTWF0Y2hlciBtYXRjaGVyOwotICAgIHByaXZhdGUgU3RyaW5nIGN1cnJlbnRUb2tlbjsKLQotICAgIC8vIFRoZSBjaGFyYWN0ZXIgaW5kZXggd2l0aGluIHRoaXMudGV4dCBhdCB3aGljaCB0aGUgY3VycmVudCB0b2tlbiBiZWdpbnMuCi0gICAgcHJpdmF0ZSBpbnQgcG9zID0gMDsKLQotICAgIC8vIFRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBvZiB0aGUgY3VycmVudCB0b2tlbi4KLSAgICBwcml2YXRlIGludCBsaW5lID0gMDsKLSAgICBwcml2YXRlIGludCBjb2x1bW4gPSAwOwotCi0gICAgLy8gVGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIG9mIHRoZSBwcmV2aW91cyB0b2tlbiAoYWxsb3dzIHRocm93aW5nCi0gICAgLy8gZXJyb3JzICphZnRlciogY29uc3VtaW5nKS4KLSAgICBwcml2YXRlIGludCBwcmV2aW91c0xpbmUgPSAwOwotICAgIHByaXZhdGUgaW50IHByZXZpb3VzQ29sdW1uID0gMDsKLQotICAgIC8vIFdlIHVzZSBwb3NzZXNzaXZlIHF1YW50aWZpZXJzICgqKyBhbmQgKyspIGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBKYXZhCi0gICAgLy8gcmVnZXggbWF0Y2hlciBoYXMgc3RhY2sgb3ZlcmZsb3dzIG9uIGxhcmdlIGlucHV0cy4KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFdISVRFU1BBQ0UgPQotICAgICAgUGF0dGVybi5jb21waWxlKCIoXFxzfCgjLiokKSkrKyIsIFBhdHRlcm4uTVVMVElMSU5FKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIFRPS0VOID0gUGF0dGVybi5jb21waWxlKAotICAgICAgIlthLXpBLVpfXVswLTlhLXpBLVpfKy1dKit8IiArICAgICAgICAgICAgICAgIC8vIGFuIGlkZW50aWZpZXIKLSAgICAgICJbLl0/WzAtOSstXVswLTlhLXpBLVpfListXSorfCIgKyAgICAgICAgICAgICAvLyBhIG51bWJlcgotICAgICAgIlwiKFteXCJcblxcXFxdfFxcXFwuKSorKFwifFxcXFw/JCl8IiArICAgICAgIC8vIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcKLSAgICAgICJcJyhbXlwnXG5cXFxcXXxcXFxcLikqKyhcJ3xcXFxcPyQpIiwgICAgICAgICAvLyBhIHNpbmdsZS1xdW90ZWQgc3RyaW5nCi0gICAgICBQYXR0ZXJuLk1VTFRJTElORSk7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIERPVUJMRV9JTkZJTklUWSA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICItP2luZihpbml0eSk/IiwKLSAgICAgIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGTE9BVF9JTkZJTklUWSA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICItP2luZihpbml0eSk/Zj8iLAotICAgICAgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXR0ZXJuIEZMT0FUX05BTiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICJuYW5mPyIsCi0gICAgICBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotCi0gICAgLyoqIENvbnN0cnVjdCBhIHRva2VuaXplciB0aGF0IHBhcnNlcyB0b2tlbnMgZnJvbSB0aGUgZ2l2ZW4gdGV4dC4gKi8KLSAgICBwcml2YXRlIFRva2VuaXplcihmaW5hbCBDaGFyU2VxdWVuY2UgdGV4dCkgewotICAgICAgdGhpcy50ZXh0ID0gdGV4dDsKLSAgICAgIHRoaXMubWF0Y2hlciA9IFdISVRFU1BBQ0UubWF0Y2hlcih0ZXh0KTsKLSAgICAgIHNraXBXaGl0ZXNwYWNlKCk7Ci0gICAgICBuZXh0VG9rZW4oKTsKLSAgICB9Ci0KLSAgICBpbnQgZ2V0TGluZSgpIHsKLSAgICAgIHJldHVybiBsaW5lOwotICAgIH0KLQotICAgIGludCBnZXRDb2x1bW4oKSB7Ci0gICAgICByZXR1cm4gY29sdW1uOwotICAgIH0KLQotICAgIC8qKiBBcmUgd2UgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQ/ICovCi0gICAgcHVibGljIGJvb2xlYW4gYXRFbmQoKSB7Ci0gICAgICByZXR1cm4gY3VycmVudFRva2VuLmxlbmd0aCgpID09IDA7Ci0gICAgfQotCi0gICAgLyoqIEFkdmFuY2UgdG8gdGhlIG5leHQgdG9rZW4uICovCi0gICAgcHVibGljIHZvaWQgbmV4dFRva2VuKCkgewotICAgICAgcHJldmlvdXNMaW5lID0gbGluZTsKLSAgICAgIHByZXZpb3VzQ29sdW1uID0gY29sdW1uOwotCi0gICAgICAvLyBBZHZhbmNlIHRoZSBsaW5lIGNvdW50ZXIgdG8gdGhlIGN1cnJlbnQgcG9zaXRpb24uCi0gICAgICB3aGlsZSAocG9zIDwgbWF0Y2hlci5yZWdpb25TdGFydCgpKSB7Ci0gICAgICAgIGlmICh0ZXh0LmNoYXJBdChwb3MpID09ICdcbicpIHsKLSAgICAgICAgICArK2xpbmU7Ci0gICAgICAgICAgY29sdW1uID0gMDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICArK2NvbHVtbjsKLSAgICAgICAgfQotICAgICAgICArK3BvczsKLSAgICAgIH0KLQotICAgICAgLy8gTWF0Y2ggdGhlIG5leHQgdG9rZW4uCi0gICAgICBpZiAobWF0Y2hlci5yZWdpb25TdGFydCgpID09IG1hdGNoZXIucmVnaW9uRW5kKCkpIHsKLSAgICAgICAgLy8gRU9GCi0gICAgICAgIGN1cnJlbnRUb2tlbiA9ICIiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbWF0Y2hlci51c2VQYXR0ZXJuKFRPS0VOKTsKLSAgICAgICAgaWYgKG1hdGNoZXIubG9va2luZ0F0KCkpIHsKLSAgICAgICAgICBjdXJyZW50VG9rZW4gPSBtYXRjaGVyLmdyb3VwKCk7Ci0gICAgICAgICAgbWF0Y2hlci5yZWdpb24obWF0Y2hlci5lbmQoKSwgbWF0Y2hlci5yZWdpb25FbmQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGFrZSBvbmUgY2hhcmFjdGVyLgotICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IFN0cmluZy52YWx1ZU9mKHRleHQuY2hhckF0KHBvcykpOwotICAgICAgICAgIG1hdGNoZXIucmVnaW9uKHBvcyArIDEsIG1hdGNoZXIucmVnaW9uRW5kKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgc2tpcFdoaXRlc3BhY2UoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTa2lwIG92ZXIgYW55IHdoaXRlc3BhY2Ugc28gdGhhdCB0aGUgbWF0Y2hlciByZWdpb24gc3RhcnRzIGF0IHRoZSBuZXh0Ci0gICAgICogdG9rZW4uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNraXBXaGl0ZXNwYWNlKCkgewotICAgICAgbWF0Y2hlci51c2VQYXR0ZXJuKFdISVRFU1BBQ0UpOwotICAgICAgaWYgKG1hdGNoZXIubG9va2luZ0F0KCkpIHsKLSAgICAgICAgbWF0Y2hlci5yZWdpb24obWF0Y2hlci5lbmQoKSwgbWF0Y2hlci5yZWdpb25FbmQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gZXhhY3RseSBtYXRjaGVzIHtAY29kZSB0b2tlbn0sIGNvbnN1bWUgaXQgYW5kIHJldHVybgotICAgICAqIHtAY29kZSB0cnVlfS4gIE90aGVyd2lzZSwgcmV0dXJuIHtAY29kZSBmYWxzZX0gd2l0aG91dCBkb2luZyBhbnl0aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0cnlDb25zdW1lKGZpbmFsIFN0cmluZyB0b2tlbikgewotICAgICAgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHModG9rZW4pKSB7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBleGFjdGx5IG1hdGNoZXMge0Bjb2RlIHRva2VufSwgY29uc3VtZSBpdC4gIE90aGVyd2lzZSwKLSAgICAgKiB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgY29uc3VtZShmaW5hbCBTdHJpbmcgdG9rZW4pIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBpZiAoIXRyeUNvbnN1bWUodG9rZW4pKSB7Ci0gICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKCJFeHBlY3RlZCBcIiIgKyB0b2tlbiArICJcIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgbmV4dCB0b2tlbiBpcyBhbiBpbnRlZ2VyLCBidXQgZG9lcwotICAgICAqIG5vdCBjb25zdW1lIGl0LgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGxvb2tpbmdBdEludGVnZXIoKSB7Ci0gICAgICBpZiAoY3VycmVudFRva2VuLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBmaW5hbCBjaGFyIGMgPSBjdXJyZW50VG9rZW4uY2hhckF0KDApOwotICAgICAgcmV0dXJuICgnMCcgPD0gYyAmJiBjIDw9ICc5JykKLSAgICAgICAgICB8fCBjID09ICctJyB8fCBjID09ICcrJzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgY3VycmVudCB0b2tlbidzIHRleHQgaXMgZXF1YWwgdG8gdGhhdAotICAgICAqIHNwZWNpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBsb29raW5nQXQoU3RyaW5nIHRleHQpIHsKLSAgICAgIHJldHVybiBjdXJyZW50VG9rZW4uZXF1YWxzKHRleHQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCi0gICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb25zdW1lSWRlbnRpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRUb2tlbi5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIGZpbmFsIGNoYXIgYyA9IGN1cnJlbnRUb2tlbi5jaGFyQXQoaSk7Ci0gICAgICAgIGlmICgoJ2EnIDw9IGMgJiYgYyA8PSAneicpCi0gICAgICAgICAgICB8fCAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpCi0gICAgICAgICAgICB8fCAoJzAnIDw9IGMgJiYgYyA8PSAnOScpCi0gICAgICAgICAgICB8fCAoYyA9PSAnXycpIHx8IChjID09ICcuJykpIHsKLSAgICAgICAgICAvLyBPSwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiRXhwZWN0ZWQgaWRlbnRpZmllci4gRm91bmQgJyIgKyBjdXJyZW50VG9rZW4gKyAiJyIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBjdXJyZW50VG9rZW47Ci0gICAgICBuZXh0VG9rZW4oKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYW4gaWRlbnRpZmllciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIHtAY29kZSB0cnVlfS4KLSAgICAgKiBPdGhlcndpc2UsIHJldHVybiB7QGNvZGUgZmFsc2V9IHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdHJ5Q29uc3VtZUlkZW50aWZpZXIoKSB7Ci0gICAgICB0cnkgewotICAgICAgICBjb25zdW1lSWRlbnRpZmllcigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzCi0gICAgICogdmFsdWUuICBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbnN1bWVJbnQzMigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gcGFyc2VJbnQzMihjdXJyZW50VG9rZW4pOwotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGludGVnZXJQYXJzZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIDMyLWJpdCB1bnNpZ25lZCBpbnRlZ2VyLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzCi0gICAgICogdmFsdWUuICBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGNvbnN1bWVVSW50MzIoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgaW50IHJlc3VsdCA9IHBhcnNlVUludDMyKGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgaW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzCi0gICAgICogdmFsdWUuICBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBjb25zdW1lSW50NjQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgbG9uZyByZXN1bHQgPSBwYXJzZUludDY0KGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgaW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyLCBjb25zdW1lIGl0IGFuZCByZXR1cm4KLSAgICAgKiB7QGNvZGUgdHJ1ZX0uICBPdGhlcndpc2UsIHJldHVybiB7QGNvZGUgZmFsc2V9IHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdHJ5Q29uc3VtZUludDY0KCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgY29uc3VtZUludDY0KCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cwotICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgY29uc3VtZVVJbnQ2NCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHBhcnNlVUludDY0KGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgaW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybgotICAgICAqIHtAY29kZSB0cnVlfS4gIE90aGVyd2lzZSwgcmV0dXJuIHtAY29kZSBmYWxzZX0gd2l0aG91dCBkb2luZyBhbnl0aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0cnlDb25zdW1lVUludDY0KCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgY29uc3VtZVVJbnQ2NCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZG91YmxlLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgotICAgICAqIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgY29uc3VtZURvdWJsZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAvLyBXZSBuZWVkIHRvIHBhcnNlIGluZmluaXR5IGFuZCBuYW4gc2VwYXJhdGVseSBiZWNhdXNlCi0gICAgICAvLyBEb3VibGUucGFyc2VEb3VibGUoKSBkb2VzIG5vdCBhY2NlcHQgImluZiIsICJpbmZpbml0eSIsIG9yICJuYW4iLgotICAgICAgaWYgKERPVUJMRV9JTkZJTklUWS5tYXRjaGVyKGN1cnJlbnRUb2tlbikubWF0Y2hlcygpKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVnYXRpdmUgPSBjdXJyZW50VG9rZW4uc3RhcnRzV2l0aCgiLSIpOwotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIG5lZ2F0aXZlID8gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZIDogRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHNJZ25vcmVDYXNlKCJuYW4iKSkgewotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBkb3VibGUgcmVzdWx0ID0gRG91YmxlLnBhcnNlRG91YmxlKGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZmxvYXRQYXJzZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGRvdWJsZSwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIHtAY29kZSB0cnVlfS4KLSAgICAgKiBPdGhlcndpc2UsIHJldHVybiB7QGNvZGUgZmFsc2V9IHdpdGhvdXQgZG9pbmcgYW55dGhpbmcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gdHJ5Q29uc3VtZURvdWJsZSgpIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGNvbnN1bWVEb3VibGUoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGZsb2F0LCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgotICAgICAqIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBjb25zdW1lRmxvYXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgLy8gV2UgbmVlZCB0byBwYXJzZSBpbmZpbml0eSBhbmQgbmFuIHNlcGFyYXRlbHkgYmVjYXVzZQotICAgICAgLy8gRmxvYXQucGFyc2VGbG9hdCgpIGRvZXMgbm90IGFjY2VwdCAiaW5mIiwgImluZmluaXR5Iiwgb3IgIm5hbiIuCi0gICAgICBpZiAoRkxPQVRfSU5GSU5JVFkubWF0Y2hlcihjdXJyZW50VG9rZW4pLm1hdGNoZXMoKSkgewotICAgICAgICBmaW5hbCBib29sZWFuIG5lZ2F0aXZlID0gY3VycmVudFRva2VuLnN0YXJ0c1dpdGgoIi0iKTsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIHJldHVybiBuZWdhdGl2ZSA/IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZIDogRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7Ci0gICAgICB9Ci0gICAgICBpZiAoRkxPQVRfTkFOLm1hdGNoZXIoY3VycmVudFRva2VuKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIHJldHVybiBGbG9hdC5OYU47Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBmbG9hdCByZXN1bHQgPSBGbG9hdC5wYXJzZUZsb2F0KGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZmxvYXRQYXJzZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGZsb2F0LCBjb25zdW1lIGl0IGFuZCByZXR1cm4ge0Bjb2RlIHRydWV9LgotICAgICAqIE90aGVyd2lzZSwgcmV0dXJuIHtAY29kZSBmYWxzZX0gd2l0aG91dCBkb2luZyBhbnl0aGluZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0cnlDb25zdW1lRmxvYXQoKSB7Ci0gICAgICB0cnkgewotICAgICAgICBjb25zdW1lRmxvYXQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGJvb2xlYW4sIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCi0gICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29uc3VtZUJvb2xlYW4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHMoInRydWUiKQotICAgICAgICAgIHx8IGN1cnJlbnRUb2tlbi5lcXVhbHMoIlRydWUiKQotICAgICAgICAgIHx8IGN1cnJlbnRUb2tlbi5lcXVhbHMoInQiKQotICAgICAgICAgIHx8IGN1cnJlbnRUb2tlbi5lcXVhbHMoIjEiKSkgewotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHMoImZhbHNlIikKLSAgICAgICAgICB8fCBjdXJyZW50VG9rZW4uZXF1YWxzKCJGYWxzZSIpCi0gICAgICAgICAgfHwgY3VycmVudFRva2VuLmVxdWFscygiZiIpCi0gICAgICAgICAgfHwgY3VycmVudFRva2VuLmVxdWFscygiMCIpKSB7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbigiRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzICh1bmVzY2FwZWQpCi0gICAgICogdmFsdWUuICBPdGhlcndpc2UsIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGNvbnN1bWVTdHJpbmcoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgcmV0dXJuIGNvbnN1bWVCeXRlU3RyaW5nKCkudG9TdHJpbmdVdGY4KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSBzdHJpbmcsIGNvbnN1bWUgaXQgYW5kIHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlLAotICAgICAqIHJldHVybiBmYWxzZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgYm9vbGVhbiB0cnlDb25zdW1lU3RyaW5nKCkgewotICAgICAgdHJ5IHsKLSAgICAgICAgY29uc3VtZVN0cmluZygpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCBjb25zdW1lIGl0LCB1bmVzY2FwZSBpdCBhcyBhCi0gICAgICoge0BsaW5rIEJ5dGVTdHJpbmd9LCBhbmQgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCB0aHJvdyBhCi0gICAgICoge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnl0ZVN0cmluZyBjb25zdW1lQnl0ZVN0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBMaXN0PEJ5dGVTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7Ci0gICAgICBjb25zdW1lQnl0ZVN0cmluZyhsaXN0KTsKLSAgICAgIHdoaWxlIChjdXJyZW50VG9rZW4uc3RhcnRzV2l0aCgiJyIpIHx8IGN1cnJlbnRUb2tlbi5zdGFydHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgIGNvbnN1bWVCeXRlU3RyaW5nKGxpc3QpOwotICAgICAgfQotICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20obGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI2NvbnN1bWVCeXRlU3RyaW5nKCl9IGJ1dCBhZGRzIGVhY2ggdG9rZW4gb2YgdGhlIHN0cmluZyB0bwotICAgICAqIHRoZSBnaXZlbiBsaXN0LiAgU3RyaW5nIGxpdGVyYWxzICh3aGV0aGVyIGJ5dGVzIG9yIHRleHQpIG1heSBjb21lIGluCi0gICAgICogbXVsdGlwbGUgYWRqYWNlbnQgdG9rZW5zIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYXRlZCwgbGlrZSBpbgotICAgICAqIEMgb3IgUHl0aG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdW1lQnl0ZVN0cmluZyhMaXN0PEJ5dGVTdHJpbmc+IGxpc3QpCi0gICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBjaGFyIHF1b3RlID0gY3VycmVudFRva2VuLmxlbmd0aCgpID4gMAotICAgICAgICAgID8gY3VycmVudFRva2VuLmNoYXJBdCgwKQotICAgICAgICAgIDogJ1wwJzsKLSAgICAgIGlmIChxdW90ZSAhPSAnXCInICYmIHF1b3RlICE9ICdcJycpIHsKLSAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIHN0cmluZy4iKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGN1cnJlbnRUb2tlbi5sZW5ndGgoKSA8IDIKLSAgICAgICAgICB8fCBjdXJyZW50VG9rZW4uY2hhckF0KGN1cnJlbnRUb2tlbi5sZW5ndGgoKSAtIDEpICE9IHF1b3RlKSB7Ci0gICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKCJTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIik7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkID0KLSAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zdWJzdHJpbmcoMSwgY3VycmVudFRva2VuLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIGZpbmFsIEJ5dGVTdHJpbmcgcmVzdWx0ID0gdW5lc2NhcGVCeXRlcyhlc2NhcGVkKTsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIGxpc3QuYWRkKHJlc3VsdCk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBsaW5lIGFuZCBjb2x1bW4KLSAgICAgKiBudW1iZXJzIGluIHRoZSBkZXNjcmlwdGlvbiwgc3VpdGFibGUgZm9yIHRocm93aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgIC8vIE5vdGU6ICBQZW9wbGUgZ2VuZXJhbGx5IHByZWZlciBvbmUtYmFzZWQgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICBsaW5lICsgMSwgY29sdW1uICsgMSwgZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259IHdpdGggdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIG9mCi0gICAgICogdGhlIHByZXZpb3VzIHRva2VuIGluIHRoZSBkZXNjcmlwdGlvbiwgc3VpdGFibGUgZm9yIHRocm93aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCi0gICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgLy8gTm90ZTogIFBlb3BsZSBnZW5lcmFsbHkgcHJlZmVyIG9uZS1iYXNlZCBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4KLSAgICAgIHJldHVybiBuZXcgUGFyc2VFeGNlcHRpb24oCi0gICAgICAgIHByZXZpb3VzTGluZSArIDEsIHByZXZpb3VzQ29sdW1uICsgMSwgZGVzY3JpcHRpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gYXBwcm9wcmlhdGUge0BsaW5rIFBhcnNlRXhjZXB0aW9ufSBmb3IgdGhlIGdpdmVuCi0gICAgICoge0Bjb2RlIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0gd2hlbiB0cnlpbmcgdG8gcGFyc2UgYW4gaW50ZWdlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIFBhcnNlRXhjZXB0aW9uIGludGVnZXJQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgZmluYWwgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIHJldHVybiBwYXJzZUV4Y2VwdGlvbigiQ291bGRuJ3QgcGFyc2UgaW50ZWdlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGFuIGFwcHJvcHJpYXRlIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0gZm9yIHRoZSBnaXZlbgotICAgICAqIHtAY29kZSBOdW1iZXJGb3JtYXRFeGNlcHRpb259IHdoZW4gdHJ5aW5nIHRvIHBhcnNlIGEgZmxvYXQgb3IgZG91YmxlLgotICAgICAqLwotICAgIHByaXZhdGUgUGFyc2VFeGNlcHRpb24gZmxvYXRQYXJzZUV4Y2VwdGlvbihmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIHBhcnNlRXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBudW1iZXI6ICIgKyBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBVbmtub3duRmllbGRQYXJzZUV4Y2VwdGlvbn0gd2l0aCB0aGUgbGluZSBhbmQgY29sdW1uCi0gICAgICogbnVtYmVycyBvZiB0aGUgcHJldmlvdXMgdG9rZW4gaW4gdGhlIGRlc2NyaXB0aW9uLCBhbmQgdGhlIHVua25vd24gZmllbGQKLSAgICAgKiBuYW1lLCBzdWl0YWJsZSBmb3IgdGhyb3dpbmcuCi0gICAgICovCi0gICAgcHVibGljIFVua25vd25GaWVsZFBhcnNlRXhjZXB0aW9uIHVua25vd25GaWVsZFBhcnNlRXhjZXB0aW9uUHJldmlvdXNUb2tlbigKLSAgICAgICAgZmluYWwgU3RyaW5nIHVua25vd25GaWVsZCwgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgICAvLyBOb3RlOiAgUGVvcGxlIGdlbmVyYWxseSBwcmVmZXIgb25lLWJhc2VkIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLgotICAgICAgcmV0dXJuIG5ldyBVbmtub3duRmllbGRQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgcHJldmlvdXNMaW5lICsgMSwgcHJldmlvdXNDb2x1bW4gKyAxLCB1bmtub3duRmllbGQsIGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0gIH0KLQotICAvKiogVGhyb3duIHdoZW4gcGFyc2luZyBhbiBpbnZhbGlkIHRleHQgZm9ybWF0IG1lc3NhZ2UuICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzE5NjE4ODA2MDIyNTEwNzcwMkw7Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBsaW5lOwotICAgIHByaXZhdGUgZmluYWwgaW50IGNvbHVtbjsKLQotICAgIC8qKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UsIHdpdGggLTEgYXMgdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLiAqLwotICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgdGhpcygtMSwgLTEsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZCwKLSAgICAgKiB1c2luZyAxLW9mZnNldC4KLSAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoZSBwYXJzZXIgZXJyb3Igb2NjdXJyZWQsCi0gICAgICogdXNpbmcgMS1vZmZzZXQuCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlRXhjZXB0aW9uKGZpbmFsIGludCBsaW5lLCBmaW5hbCBpbnQgY29sdW1uLAotICAgICAgICBmaW5hbCBTdHJpbmcgbWVzc2FnZSkgewotICAgICAgc3VwZXIoSW50ZWdlci50b1N0cmluZyhsaW5lKSArICI6IiArIGNvbHVtbiArICI6ICIgKyBtZXNzYWdlKTsKLSAgICAgIHRoaXMubGluZSA9IGxpbmU7Ci0gICAgICB0aGlzLmNvbHVtbiA9IGNvbHVtbjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIGxpbmUgd2hlcmUgdGhlIHBhcnNlIGV4Y2VwdGlvbiBvY2N1cnJlZCwgb3IgLTEgd2hlbgotICAgICAqIG5vbmUgaXMgcHJvdmlkZWQuIFRoZSB2YWx1ZSBpcyBzcGVjaWZpZWQgYXMgMS1vZmZzZXQsIHNvIHRoZSBmaXJzdAotICAgICAqIGxpbmUgaXMgbGluZSAxLgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0TGluZSgpIHsKLSAgICAgIHJldHVybiBsaW5lOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybiB0aGUgY29sdW1uIHdoZXJlIHRoZSBwYXJzZSBleGNlcHRpb24gb2NjdXJyZWQsIG9yIC0xIHdoZW4KLSAgICAgKiBub25lIGlzIHByb3ZpZGVkLiBUaGUgdmFsdWUgaXMgc3BlY2lmaWVkIGFzIDEtb2Zmc2V0LCBzbyB0aGUgZmlyc3QKLSAgICAgKiBsaW5lIGlzIGxpbmUgMS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLSAgICAgIHJldHVybiBjb2x1bW47Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRocm93biB3aGVuIGVuY291bnRlcmluZyBhbiB1bmtub3duIGZpZWxkIHdoaWxlIHBhcnNpbmcKLSAgICogYSB0ZXh0IGZvcm1hdCBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBVbmtub3duRmllbGRQYXJzZUV4Y2VwdGlvbiBleHRlbmRzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyB1bmtub3duRmllbGQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGUgYSBuZXcgaW5zdGFuY2UsIHdpdGggLTEgYXMgdGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzLCBhbmQgYW4KLSAgICAgKiBlbXB0eSB1bmtub3duIGZpZWxkIG5hbWUuCi0gICAgICovCi0gICAgcHVibGljIFVua25vd25GaWVsZFBhcnNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlKSB7Ci0gICAgICB0aGlzKC0xLCAtMSwgIiIsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIG5ldyBpbnN0YW5jZQotICAgICAqCi0gICAgICogQHBhcmFtIGxpbmUgdGhlIGxpbmUgbnVtYmVyIHdoZXJlIHRoZSBwYXJzZSBlcnJvciBvY2N1cnJlZCwKLSAgICAgKiB1c2luZyAxLW9mZnNldC4KLSAgICAgKiBAcGFyYW0gY29sdW1uIHRoZSBjb2x1bW4gbnVtYmVyIHdoZXJlIHRoZSBwYXJzZXIgZXJyb3Igb2NjdXJyZWQsCi0gICAgICogdXNpbmcgMS1vZmZzZXQuCi0gICAgICogQHBhcmFtIHVua25vd25GaWVsZCB0aGUgbmFtZSBvZiB0aGUgdW5rbm93biBmaWVsZCBmb3VuZCB3aGlsZSBwYXJzaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBVbmtub3duRmllbGRQYXJzZUV4Y2VwdGlvbihmaW5hbCBpbnQgbGluZSwgZmluYWwgaW50IGNvbHVtbiwKLSAgICAgICAgZmluYWwgU3RyaW5nIHVua25vd25GaWVsZCwgZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgIHN1cGVyKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0gICAgICB0aGlzLnVua25vd25GaWVsZCA9IHVua25vd25GaWVsZDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIHVua25vd24gZmllbGQgZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZyB0aGUKLSAgICAgKiBwcm90b2NvbCBidWZmZXIgc3RyaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0VW5rbm93bkZpZWxkKCkgewotICAgICAgcmV0dXJuIHVua25vd25GaWVsZDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQYXJzZXIgUEFSU0VSID0gUGFyc2VyLm5ld0J1aWxkZXIoKS5idWlsZCgpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gYSB7QGxpbmsgUGFyc2VyfSBpbnN0YW5jZSB3aGljaCBjYW4gcGFyc2UgdGV4dC1mb3JtYXQKLSAgICogbWVzc2FnZXMuIFRoZSByZXR1cm5lZCBpbnN0YW5jZSBpcyB0aHJlYWQtc2FmZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgUGFyc2VyIGdldFBhcnNlcigpIHsKLSAgICByZXR1cm4gUEFSU0VSOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cwotICAgKiBpbnRvIHtAY29kZSBidWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShmaW5hbCBSZWFkYWJsZSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBQQVJTRVIubWVyZ2UoaW5wdXQsIGJ1aWxkZXIpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cwotICAgKiBpbnRvIHtAY29kZSBidWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShmaW5hbCBDaGFyU2VxdWVuY2UgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgUEFSU0VSLm1lcmdlKGlucHV0LCBidWlsZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKLSAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uICBFeHRlbnNpb25zIHdpbGwgYmUgcmVjb2duaXplZCBpZiB0aGV5IGFyZQotICAgKiByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgUmVhZGFibGUgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBQQVJTRVIubWVyZ2UoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cwotICAgKiBpbnRvIHtAY29kZSBidWlsZGVyfS4gIEV4dGVuc2lvbnMgd2lsbCBiZSByZWNvZ25pemVkIGlmIHRoZXkgYXJlCi0gICAqIHJlZ2lzdGVyZWQgaW4ge0Bjb2RlIGV4dGVuc2lvblJlZ2lzdHJ5fS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtZXJnZShmaW5hbCBDaGFyU2VxdWVuY2UgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBQQVJTRVIubWVyZ2UoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIFBhcnNlciBmb3IgdGV4dC1mb3JtYXQgcHJvdG8yIGluc3RhbmNlcy4gVGhpcyBjbGFzcyBpcyB0aHJlYWQtc2FmZS4KLSAgICogVGhlIGltcGxlbWVudGF0aW9uIGxhcmdlbHkgZm9sbG93cyBnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MuCi0gICAqCi0gICAqIDxwPlVzZSB7QGxpbmsgVGV4dEZvcm1hdCNnZXRQYXJzZXIoKX0gdG8gb2J0YWluIHRoZSBkZWZhdWx0IHBhcnNlciwgb3IKLSAgICoge0BsaW5rIEJ1aWxkZXJ9IHRvIGNvbnRyb2wgdGhlIHBhcnNlciBiZWhhdmlvci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VyIHsKLSAgICAvKioKLSAgICAgKiBEZXRlcm1pbmVzIGlmIHJlcGVhdGVkIHZhbHVlcyBmb3Igbm9uLXJlcGVhdGVkIGZpZWxkcyBhbmQKLSAgICAgKiBvbmVvZnMgYXJlIHBlcm1pdHRlZC4gRm9yIGV4YW1wbGUsIGdpdmVuIHJlcXVpcmVkL29wdGlvbmFsIGZpZWxkICJmb28iCi0gICAgICogYW5kIGEgb25lb2YgY29udGFpbmluZyAiYmF6IiBhbmQgInF1eCI6Ci0gICAgICogPHVsPgotICAgICAqIDxsaT4iZm9vOiAxIGZvbzogMiIKLSAgICAgKiA8bGk+ImJhejogMSBxdXg6IDIiCi0gICAgICogPGxpPm1lcmdpbmcgImZvbzogMiIgaW50byBhIHByb3RvIGluIHdoaWNoIGZvbyBpcyBhbHJlYWR5IHNldCwgb3IKLSAgICAgKiA8bGk+bWVyZ2luZyAicXV4OiAyIiBpbnRvIGEgcHJvdG8gaW4gd2hpY2ggYmF6IGlzIGFscmVhZHkgc2V0LgotICAgICAqIDwvdWw+Ci0gICAgICovCi0gICAgcHVibGljIGVudW0gU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgewotICAgICAgLyoqIFRoZSBsYXN0IHZhbHVlIGlzIHJldGFpbmVkLiAqLwotICAgICAgQUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUywKLSAgICAgIC8qKiBBbiBlcnJvciBpcyBpc3N1ZWQuICovCi0gICAgICBGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBhbGxvd1Vua25vd25GaWVsZHM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSBzaW5ndWxhck92ZXJ3cml0ZVBvbGljeTsKLSAgICBwcml2YXRlIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlLkJ1aWxkZXIgcGFyc2VJbmZvVHJlZUJ1aWxkZXI7Ci0KLSAgICBwcml2YXRlIFBhcnNlcigKLSAgICAgICAgYm9vbGVhbiBhbGxvd1Vua25vd25GaWVsZHMsIFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IHNpbmd1bGFyT3ZlcndyaXRlUG9saWN5LAotICAgICAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZS5CdWlsZGVyIHBhcnNlSW5mb1RyZWVCdWlsZGVyKSB7Ci0gICAgICB0aGlzLmFsbG93VW5rbm93bkZpZWxkcyA9IGFsbG93VW5rbm93bkZpZWxkczsKLSAgICAgIHRoaXMuc2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgPSBzaW5ndWxhck92ZXJ3cml0ZVBvbGljeTsKLSAgICAgIHRoaXMucGFyc2VJbmZvVHJlZUJ1aWxkZXIgPSBwYXJzZUluZm9UcmVlQnVpbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIHtAbGluayBCdWlsZGVyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKLSAgICAgIHJldHVybiBuZXcgQnVpbGRlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkZXIgdGhhdCBjYW4gYmUgdXNlZCB0byBvYnRhaW4gbmV3IGluc3RhbmNlcyBvZiB7QGxpbmsgUGFyc2VyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotICAgICAgcHJpdmF0ZSBib29sZWFuIGFsbG93VW5rbm93bkZpZWxkcyA9IGZhbHNlOwotICAgICAgcHJpdmF0ZSBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSBzaW5ndWxhck92ZXJ3cml0ZVBvbGljeSA9Ci0gICAgICAgICAgU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kuQUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUzsKLSAgICAgIHByaXZhdGUgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuQnVpbGRlciBwYXJzZUluZm9UcmVlQnVpbGRlciA9IG51bGw7Ci0KLQotICAgICAgLyoqCi0gICAgICAgKiBTZXRzIHBhcnNlciBiZWhhdmlvciB3aGVuIGEgbm9uLXJlcGVhdGVkIGZpZWxkIGFwcGVhcnMgbW9yZSB0aGFuIG9uY2UuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5KFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IHApIHsKLSAgICAgICAgdGhpcy5zaW5ndWxhck92ZXJ3cml0ZVBvbGljeSA9IHA7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgQnVpbGRlciBzZXRQYXJzZUluZm9UcmVlQnVpbGRlcigKLSAgICAgICAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZS5CdWlsZGVyIHBhcnNlSW5mb1RyZWVCdWlsZGVyKSB7Ci0gICAgICAgIHRoaXMucGFyc2VJbmZvVHJlZUJ1aWxkZXIgPSBwYXJzZUluZm9UcmVlQnVpbGRlcjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBQYXJzZXIgYnVpbGQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgUGFyc2VyKAotICAgICAgICAgICAgYWxsb3dVbmtub3duRmllbGRzLCBzaW5ndWxhck92ZXJ3cml0ZVBvbGljeSwgcGFyc2VJbmZvVHJlZUJ1aWxkZXIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cwotICAgICAqIGludG8ge0Bjb2RlIGJ1aWxkZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIG1lcmdlKGZpbmFsIFJlYWRhYmxlIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBtZXJnZShpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RW1wdHlSZWdpc3RyeSgpLCBidWlsZGVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKLSAgICAgKiBpbnRvIHtAY29kZSBidWlsZGVyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXJnZShmaW5hbCBDaGFyU2VxdWVuY2UgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgIG1lcmdlKGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeS5nZXRFbXB0eVJlZ2lzdHJ5KCksIGJ1aWxkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cwotICAgICAqIGludG8ge0Bjb2RlIGJ1aWxkZXJ9LiAgRXh0ZW5zaW9ucyB3aWxsIGJlIHJlY29nbml6ZWQgaWYgdGhleSBhcmUKLSAgICAgKiByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoZmluYWwgUmVhZGFibGUgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIFJlYWQgdGhlIGVudGlyZSBpbnB1dCB0byBhIFN0cmluZyB0aGVuIHBhcnNlIHRoYXQuCi0KLSAgICAgIC8vIElmIFN0cmVhbVRva2VuaXplciB3ZXJlIG5vdCBxdWl0ZSBzbyBjcmlwcGxlZCwgb3IgaWYgdGhlcmUgd2VyZSBhIGtpbmQKLSAgICAgIC8vIG9mIFJlYWRlciB0aGF0IGNvdWxkIHJlYWQgaW4gY2h1bmtzIHRoYXQgbWF0Y2ggc29tZSBwYXJ0aWN1bGFyIHJlZ2V4LAotICAgICAgLy8gb3IgaWYgd2Ugd2FudGVkIHRvIHdyaXRlIGEgY3VzdG9tIFJlYWRlciB0byB0b2tlbml6ZSBvdXIgc3RyZWFtLCB0aGVuCi0gICAgICAvLyB3ZSB3b3VsZCBub3QgaGF2ZSB0byByZWFkIHRvIG9uZSBiaWcgU3RyaW5nLiAgQWxhcywgbm9uZSBvZiB0aGVzZSBpcwotICAgICAgLy8gdGhlIGNhc2UuICBPaCB3ZWxsLgotCi0gICAgICBtZXJnZSh0b1N0cmluZ0J1aWxkZXIoaW5wdXQpLCBleHRlbnNpb25SZWdpc3RyeSwgYnVpbGRlcik7Ci0gICAgfQotCi0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQlVGRkVSX1NJWkUgPSA0MDk2OwotCi0gICAgLy8gVE9ETyhjaHJpc24pOiBTZWUgaWYgd29ya2luZyBhcm91bmQgamF2YS5pby5SZWFkZXIjcmVhZChDaGFyQnVmZmVyKQotICAgIC8vIG92ZXJoZWFkIGlzIHdvcnRod2hpbGUKLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmdCdWlsZGVyIHRvU3RyaW5nQnVpbGRlcihmaW5hbCBSZWFkYWJsZSBpbnB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBmaW5hbCBDaGFyQnVmZmVyIGJ1ZmZlciA9IENoYXJCdWZmZXIuYWxsb2NhdGUoQlVGRkVSX1NJWkUpOwotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgZmluYWwgaW50IG4gPSBpbnB1dC5yZWFkKGJ1ZmZlcik7Ci0gICAgICAgIGlmIChuID09IC0xKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgYnVmZmVyLmZsaXAoKTsKLSAgICAgICAgdGV4dC5hcHBlbmQoYnVmZmVyLCAwLCBuKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0ZXh0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGEgdGV4dC1mb3JtYXQgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIHRoZSBjb250ZW50cwotICAgICAqIGludG8ge0Bjb2RlIGJ1aWxkZXJ9LiAgRXh0ZW5zaW9ucyB3aWxsIGJlIHJlY29nbml6ZWQgaWYgdGhleSBhcmUKLSAgICAgKiByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoZmluYWwgQ2hhclNlcXVlbmNlIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBUb2tlbml6ZXIgdG9rZW5pemVyID0gbmV3IFRva2VuaXplcihpbnB1dCk7Ci0gICAgICBNZXNzYWdlUmVmbGVjdGlvbi5CdWlsZGVyQWRhcHRlciB0YXJnZXQgPQotICAgICAgICAgIG5ldyBNZXNzYWdlUmVmbGVjdGlvbi5CdWlsZGVyQWRhcHRlcihidWlsZGVyKTsKLQotICAgICAgd2hpbGUgKCF0b2tlbml6ZXIuYXRFbmQoKSkgewotICAgICAgICBtZXJnZUZpZWxkKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhcmdldCk7Ci0gICAgICB9Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIHNpbmdsZSBmaWVsZCBmcm9tIHtAY29kZSB0b2tlbml6ZXJ9IGFuZCBtZXJnZSBpdCBpbnRvCi0gICAgICoge0Bjb2RlIGJ1aWxkZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBtZXJnZUZpZWxkKGZpbmFsIFRva2VuaXplciB0b2tlbml6ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZVJlZmxlY3Rpb24uTWVyZ2VUYXJnZXQgdGFyZ2V0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBtZXJnZUZpZWxkKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhcmdldCwgcGFyc2VJbmZvVHJlZUJ1aWxkZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGEgc2luZ2xlIGZpZWxkIGZyb20ge0Bjb2RlIHRva2VuaXplcn0gYW5kIG1lcmdlIGl0IGludG8KLSAgICAgKiB7QGNvZGUgYnVpbGRlcn0uCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlRmllbGQoZmluYWwgVG9rZW5pemVyIHRva2VuaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlUmVmbGVjdGlvbi5NZXJnZVRhcmdldCB0YXJnZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuQnVpbGRlciBwYXJzZVRyZWVCdWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBudWxsOwotICAgICAgaW50IHN0YXJ0TGluZSA9IHRva2VuaXplci5nZXRMaW5lKCk7Ci0gICAgICBpbnQgc3RhcnRDb2x1bW4gPSB0b2tlbml6ZXIuZ2V0Q29sdW1uKCk7Ci0gICAgICBmaW5hbCBEZXNjcmlwdG9yIHR5cGUgPSB0YXJnZXQuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uID0gbnVsbDsKLQotICAgICAgaWYgKHRva2VuaXplci50cnlDb25zdW1lKCJbIikpIHsKLSAgICAgICAgLy8gQW4gZXh0ZW5zaW9uLgotICAgICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIG5hbWUgPQotICAgICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIodG9rZW5pemVyLmNvbnN1bWVJZGVudGlmaWVyKCkpOwotICAgICAgICB3aGlsZSAodG9rZW5pemVyLnRyeUNvbnN1bWUoIi4iKSkgewotICAgICAgICAgIG5hbWUuYXBwZW5kKCcuJyk7Ci0gICAgICAgICAgbmFtZS5hcHBlbmQodG9rZW5pemVyLmNvbnN1bWVJZGVudGlmaWVyKCkpOwotICAgICAgICB9Ci0KLSAgICAgICAgZXh0ZW5zaW9uID0gdGFyZ2V0LmZpbmRFeHRlbnNpb25CeU5hbWUoCi0gICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeSwgbmFtZS50b1N0cmluZygpKTsKLQotICAgICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKLSAgICAgICAgICBpZiAoIWFsbG93VW5rbm93bkZpZWxkcykgewotICAgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLnBhcnNlRXhjZXB0aW9uUHJldmlvdXNUb2tlbigKLSAgICAgICAgICAgICAgIkV4dGVuc2lvbiBcIiIgKyBuYW1lICsgIlwiIG5vdCBmb3VuZCBpbiB0aGUgRXh0ZW5zaW9uUmVnaXN0cnkuIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGxvZ2dlci53YXJuaW5nKAotICAgICAgICAgICAgICAiRXh0ZW5zaW9uIFwiIiArIG5hbWUgKyAiXCIgbm90IGZvdW5kIGluIHRoZSBFeHRlbnNpb25SZWdpc3RyeS4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gdHlwZSkgewotICAgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLnBhcnNlRXhjZXB0aW9uUHJldmlvdXNUb2tlbigKLSAgICAgICAgICAgICAgIkV4dGVuc2lvbiBcIiIgKyBuYW1lICsgIlwiIGRvZXMgbm90IGV4dGVuZCBtZXNzYWdlIHR5cGUgXCIiCi0gICAgICAgICAgICAgICsgdHlwZS5nZXRGdWxsTmFtZSgpICsgIlwiLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBmaWVsZCA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yOwotICAgICAgICB9Ci0KLSAgICAgICAgdG9rZW5pemVyLmNvbnN1bWUoIl0iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBuYW1lID0gdG9rZW5pemVyLmNvbnN1bWVJZGVudGlmaWVyKCk7Ci0gICAgICAgIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU5hbWUobmFtZSk7Ci0KLSAgICAgICAgLy8gR3JvdXAgbmFtZXMgYXJlIGV4cGVjdGVkIHRvIGJlIGNhcGl0YWxpemVkIGFzIHRoZXkgYXBwZWFyIGluIHRoZQotICAgICAgICAvLyAucHJvdG8gZmlsZSwgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGVpciB0eXBlIG5hbWVzLCBub3QgdGhlaXIgZmllbGQKLSAgICAgICAgLy8gbmFtZXMuCi0gICAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgLy8gRXhwbGljaXRseSBzcGVjaWZ5IFVTIGxvY2FsZSBzbyB0aGF0IHRoaXMgY29kZSBkb2VzIG5vdCBicmVhayB3aGVuCi0gICAgICAgICAgLy8gZXhlY3V0aW5nIGluIFR1cmtleS4KLSAgICAgICAgICBmaW5hbCBTdHJpbmcgbG93ZXJOYW1lID0gbmFtZS50b0xvd2VyQ2FzZShMb2NhbGUuVVMpOwotICAgICAgICAgIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU5hbWUobG93ZXJOYW1lKTsKLSAgICAgICAgICAvLyBJZiB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCB3b3JrZWQgYnV0IHRoZSBmaWVsZCBpcyBOT1QgYSBncm91cCwKLSAgICAgICAgICBpZiAoZmllbGQgIT0gbnVsbCAmJiBmaWVsZC5nZXRUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLlR5cGUuR1JPVVApIHsKLSAgICAgICAgICAgIGZpZWxkID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gQWdhaW4sIHNwZWNpYWwtY2FzZSBncm91cCBuYW1lcyBhcyBkZXNjcmliZWQgYWJvdmUuCi0gICAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmdldFR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuVHlwZS5HUk9VUAotICAgICAgICAgICAgJiYgIWZpZWxkLmdldE1lc3NhZ2VUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscyhuYW1lKSkgewotICAgICAgICAgIGZpZWxkID0gbnVsbDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgaWYgKCFhbGxvd1Vua25vd25GaWVsZHMpIHsKLSAgICAgICAgICAgIHRocm93IHRva2VuaXplci51bmtub3duRmllbGRQYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCi0gICAgICAgICAgICAgIG5hbWUsCi0gICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgXCIiICsgdHlwZS5nZXRGdWxsTmFtZSgpCi0gICAgICAgICAgICAgICsgIlwiIGhhcyBubyBmaWVsZCBuYW1lZCBcIiIgKyBuYW1lICsgIlwiLiIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBsb2dnZXIud2FybmluZygKLSAgICAgICAgICAgICAgIk1lc3NhZ2UgdHlwZSBcIiIgKyB0eXBlLmdldEZ1bGxOYW1lKCkKLSAgICAgICAgICAgICAgKyAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIG5hbWUgKyAiXCIuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIC8vIFNraXBzIHVua25vd24gZmllbGRzLgotICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgLy8gVHJ5IHRvIGd1ZXNzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCi0gICAgICAgIC8vIElmIHRoaXMgZmllbGQgaXMgbm90IGEgbWVzc2FnZSwgdGhlcmUgc2hvdWxkIGJlIGEgIjoiIGJldHdlZW4gdGhlCi0gICAgICAgIC8vIGZpZWxkIG5hbWUgYW5kIHRoZSBmaWVsZCB2YWx1ZSBhbmQgYWxzbyB0aGUgZmllbGQgdmFsdWUgc2hvdWxkIG5vdAotICAgICAgICAvLyBzdGFydCB3aXRoICJ7IiBvciAiPCIgd2hpY2ggaW5kaWNhdGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlIGJvZHkuCi0gICAgICAgIC8vIElmIHRoZXJlIGlzIG5vICI6IiBvciB0aGVyZSBpcyBhICJ7IiBvciAiPCIgYWZ0ZXIgIjoiLCB0aGlzIGZpZWxkIGhhcwotICAgICAgICAvLyB0byBiZSBhIG1lc3NhZ2Ugb3IgdGhlIGlucHV0IGlzIGlsbC1mb3JtZWQuCi0gICAgICAgIGlmICh0b2tlbml6ZXIudHJ5Q29uc3VtZSgiOiIpCi0gICAgICAgICAgICAmJiAhdG9rZW5pemVyLmxvb2tpbmdBdCgieyIpCi0gICAgICAgICAgICAmJiAhdG9rZW5pemVyLmxvb2tpbmdBdCgiPCIpKSB7Ci0gICAgICAgICAgc2tpcEZpZWxkVmFsdWUodG9rZW5pemVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBza2lwRmllbGRNZXNzYWdlKHRva2VuaXplcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotCi0gICAgICAvLyBIYW5kbGUgcG90ZW50aWFsICc6Jy4KLSAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgIHRva2VuaXplci50cnlDb25zdW1lKCI6Iik7ICAvLyBvcHRpb25hbAotICAgICAgICBpZiAocGFyc2VUcmVlQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgICAgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuQnVpbGRlciBjaGlsZFBhcnNlVHJlZUJ1aWxkZXIgPQotICAgICAgICAgICAgICBwYXJzZVRyZWVCdWlsZGVyLmdldEJ1aWxkZXJGb3JTdWJNZXNzYWdlRmllbGQoZmllbGQpOwotICAgICAgICAgIGNvbnN1bWVGaWVsZFZhbHVlcyh0b2tlbml6ZXIsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YXJnZXQsIGZpZWxkLCBleHRlbnNpb24sCi0gICAgICAgICAgICAgIGNoaWxkUGFyc2VUcmVlQnVpbGRlcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY29uc3VtZUZpZWxkVmFsdWVzKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhcmdldCwgZmllbGQsIGV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgcGFyc2VUcmVlQnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRva2VuaXplci5jb25zdW1lKCI6Iik7ICAvLyByZXF1aXJlZAotICAgICAgICBjb25zdW1lRmllbGRWYWx1ZXMoCi0gICAgICAgICAgICB0b2tlbml6ZXIsIGV4dGVuc2lvblJlZ2lzdHJ5LCB0YXJnZXQsIGZpZWxkLCBleHRlbnNpb24sIHBhcnNlVHJlZUJ1aWxkZXIpOwotICAgICAgfQotCi0gICAgICBpZiAocGFyc2VUcmVlQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgIHBhcnNlVHJlZUJ1aWxkZXIuc2V0TG9jYXRpb24oCi0gICAgICAgICAgICBmaWVsZCwgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24uY3JlYXRlKHN0YXJ0TGluZSwgc3RhcnRDb2x1bW4pKTsKLSAgICAgIH0KLQotICAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZmllbGRzIG1heSBvcHRpb25hbGx5IGJlIHNlcGFyYXRlZCBieSBjb21tYXMgb3IKLSAgICAgIC8vIHNlbWljb2xvbnMuCi0gICAgICBpZiAoIXRva2VuaXplci50cnlDb25zdW1lKCI7IikpIHsKLSAgICAgICAgdG9rZW5pemVyLnRyeUNvbnN1bWUoIiwiKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIG9uZSBvciBtb3JlIGZpZWxkIHZhbHVlcyBmcm9tIHtAY29kZSB0b2tlbml6ZXJ9IGFuZCBtZXJnZSBpdCBpbnRvCi0gICAgICoge0Bjb2RlIGJ1aWxkZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdW1lRmllbGRWYWx1ZXMoCi0gICAgICAgIGZpbmFsIFRva2VuaXplciB0b2tlbml6ZXIsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICBmaW5hbCBNZXNzYWdlUmVmbGVjdGlvbi5NZXJnZVRhcmdldCB0YXJnZXQsCi0gICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24sCi0gICAgICAgIGZpbmFsIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlLkJ1aWxkZXIgcGFyc2VUcmVlQnVpbGRlcikKLSAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgIC8vIFN1cHBvcnQgc3BlY2lmeWluZyByZXBlYXRlZCBmaWVsZCB2YWx1ZXMgYXMgYSBjb21tYS1zZXBhcmF0ZWQgbGlzdC4KLSAgICAgIC8vIEV4LiJmb286IFsxLCAyLCAzXSIKLSAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkgJiYgdG9rZW5pemVyLnRyeUNvbnN1bWUoIlsiKSkgewotICAgICAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgICAgIGNvbnN1bWVGaWVsZFZhbHVlKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhcmdldCwgZmllbGQsIGV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgcGFyc2VUcmVlQnVpbGRlcik7Ci0gICAgICAgICAgaWYgKHRva2VuaXplci50cnlDb25zdW1lKCJdIikpIHsKLSAgICAgICAgICAgIC8vIEVuZCBvZiBsaXN0LgotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHRva2VuaXplci5jb25zdW1lKCIsIik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN1bWVGaWVsZFZhbHVlKAotICAgICAgICAgICAgdG9rZW5pemVyLCBleHRlbnNpb25SZWdpc3RyeSwgdGFyZ2V0LCBmaWVsZCwgZXh0ZW5zaW9uLCBwYXJzZVRyZWVCdWlsZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIHNpbmdsZSBmaWVsZCB2YWx1ZSBmcm9tIHtAY29kZSB0b2tlbml6ZXJ9IGFuZCBtZXJnZSBpdCBpbnRvCi0gICAgICoge0Bjb2RlIGJ1aWxkZXJ9LgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdW1lRmllbGRWYWx1ZSgKLSAgICAgICAgZmluYWwgVG9rZW5pemVyIHRva2VuaXplciwKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgIGZpbmFsIE1lc3NhZ2VSZWZsZWN0aW9uLk1lcmdlVGFyZ2V0IHRhcmdldCwKLSAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeS5FeHRlbnNpb25JbmZvIGV4dGVuc2lvbiwKLSAgICAgICAgZmluYWwgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuQnVpbGRlciBwYXJzZVRyZWVCdWlsZGVyKQotICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLQotICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgZmluYWwgU3RyaW5nIGVuZFRva2VuOwotICAgICAgICBpZiAodG9rZW5pemVyLnRyeUNvbnN1bWUoIjwiKSkgewotICAgICAgICAgIGVuZFRva2VuID0gIj4iOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRva2VuaXplci5jb25zdW1lKCJ7Iik7Ci0gICAgICAgICAgZW5kVG9rZW4gPSAifSI7Ci0gICAgICAgIH0KLQotICAgICAgICBmaW5hbCBNZXNzYWdlUmVmbGVjdGlvbi5NZXJnZVRhcmdldCBzdWJGaWVsZDsKLSAgICAgICAgc3ViRmllbGQgPSB0YXJnZXQubmV3TWVyZ2VUYXJnZXRGb3JGaWVsZChmaWVsZCwKLSAgICAgICAgICAgIChleHRlbnNpb24gPT0gbnVsbCkgPyBudWxsIDogZXh0ZW5zaW9uLmRlZmF1bHRJbnN0YW5jZSk7Ci0KLSAgICAgICAgd2hpbGUgKCF0b2tlbml6ZXIudHJ5Q29uc3VtZShlbmRUb2tlbikpIHsKLSAgICAgICAgICBpZiAodG9rZW5pemVyLmF0RW5kKCkpIHsKLSAgICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIkV4cGVjdGVkIFwiIiArIGVuZFRva2VuICsgIlwiLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtZXJnZUZpZWxkKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHN1YkZpZWxkLCBwYXJzZVRyZWVCdWlsZGVyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHZhbHVlID0gc3ViRmllbGQuZmluaXNoKCk7Ci0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgY2FzZSBJTlQzMjoKLSAgICAgICAgICBjYXNlIFNJTlQzMjoKLSAgICAgICAgICBjYXNlIFNGSVhFRDMyOgotICAgICAgICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuY29uc3VtZUludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgSU5UNjQ6Ci0gICAgICAgICAgY2FzZSBTSU5UNjQ6Ci0gICAgICAgICAgY2FzZSBTRklYRUQ2NDoKLSAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVJbnQ2NCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIFVJTlQzMjoKLSAgICAgICAgICBjYXNlIEZJWEVEMzI6Ci0gICAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lVUludDMyKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgVUlOVDY0OgotICAgICAgICAgIGNhc2UgRklYRUQ2NDoKLSAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVVSW50NjQoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBGTE9BVDoKLSAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVGbG9hdCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIERPVUJMRToKLSAgICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVEb3VibGUoKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBCT09MOgotICAgICAgICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuY29uc3VtZUJvb2xlYW4oKTsKLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lU3RyaW5nKCk7Ci0gICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgIGNhc2UgQllURVM6Ci0gICAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lQnl0ZVN0cmluZygpOwotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgICBmaW5hbCBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IGZpZWxkLmdldEVudW1UeXBlKCk7Ci0KLSAgICAgICAgICAgIGlmICh0b2tlbml6ZXIubG9va2luZ0F0SW50ZWdlcigpKSB7Ci0gICAgICAgICAgICAgIGZpbmFsIGludCBudW1iZXIgPSB0b2tlbml6ZXIuY29uc3VtZUludDMyKCk7Ci0gICAgICAgICAgICAgIHZhbHVlID0gZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyB0b2tlbml6ZXIucGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAotICAgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpCi0gICAgICAgICAgICAgICAgICArICJcIiBoYXMgbm8gdmFsdWUgd2l0aCBudW1iZXIgIiArIG51bWJlciArICcuJyk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBpZCA9IHRva2VuaXplci5jb25zdW1lSWRlbnRpZmllcigpOwotICAgICAgICAgICAgICB2YWx1ZSA9IGVudW1UeXBlLmZpbmRWYWx1ZUJ5TmFtZShpZCk7Ci0gICAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgdG9rZW5pemVyLnBhcnNlRXhjZXB0aW9uUHJldmlvdXNUb2tlbigKLSAgICAgICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZW51bVR5cGUuZ2V0RnVsbE5hbWUoKQotICAgICAgICAgICAgICAgICAgKyAiXCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiIiArIGlkICsgIlwiLiIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICAgIGNhc2UgR1JPVVA6Ci0gICAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZ2V0IGhlcmUuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICB0YXJnZXQuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgfSBlbHNlIGlmICgoc2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kKLSAgICAgICAgICAgICAgPT0gU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kuRk9SQklEX1NJTkdVTEFSX09WRVJXUklURVMpCi0gICAgICAgICAgJiYgdGFyZ2V0Lmhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICB0aHJvdyB0b2tlbml6ZXIucGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKCJOb24tcmVwZWF0ZWQgZmllbGQgXCIiCi0gICAgICAgICAgICArIGZpZWxkLmdldEZ1bGxOYW1lKCkgKyAiXCIgY2Fubm90IGJlIG92ZXJ3cml0dGVuLiIpOwotICAgICAgfSBlbHNlIGlmICgoc2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kKLSAgICAgICAgICAgICAgPT0gU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kuRk9SQklEX1NJTkdVTEFSX09WRVJXUklURVMpCi0gICAgICAgICAgJiYgZmllbGQuZ2V0Q29udGFpbmluZ09uZW9mKCkgIT0gbnVsbAotICAgICAgICAgICYmIHRhcmdldC5oYXNPbmVvZihmaWVsZC5nZXRDb250YWluaW5nT25lb2YoKSkpIHsKLSAgICAgICAgRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIG9uZW9mID0gZmllbGQuZ2V0Q29udGFpbmluZ09uZW9mKCk7Ci0gICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oIkZpZWxkIFwiIgotICAgICAgICAgICAgKyBmaWVsZC5nZXRGdWxsTmFtZSgpICsgIlwiIGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGZpZWxkIFwiIgotICAgICAgICAgICAgKyB0YXJnZXQuZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3Iob25lb2YpLmdldEZ1bGxOYW1lKCkKLSAgICAgICAgICAgICsgIlwiLCBhbm90aGVyIG1lbWJlciBvZiBvbmVvZiBcIiIgKyBvbmVvZi5nZXROYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0YXJnZXQuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTa2lwcyB0aGUgbmV4dCBmaWVsZCBpbmNsdWRpbmcgdGhlIGZpZWxkJ3MgbmFtZSBhbmQgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNraXBGaWVsZChUb2tlbml6ZXIgdG9rZW5pemVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgaWYgKHRva2VuaXplci50cnlDb25zdW1lKCJbIikpIHsKLSAgICAgICAgLy8gRXh0ZW5zaW9uIG5hbWUuCi0gICAgICAgIGRvIHsKLSAgICAgICAgICB0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKTsKLSAgICAgICAgfSB3aGlsZSAodG9rZW5pemVyLnRyeUNvbnN1bWUoIi4iKSk7Ci0gICAgICAgIHRva2VuaXplci5jb25zdW1lKCJdIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKTsKLSAgICAgIH0KLQotICAgICAgLy8gVHJ5IHRvIGd1ZXNzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCi0gICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIG5vdCBhIG1lc3NhZ2UsIHRoZXJlIHNob3VsZCBiZSBhICI6IiBiZXR3ZWVuIHRoZQotICAgICAgLy8gZmllbGQgbmFtZSBhbmQgdGhlIGZpZWxkIHZhbHVlIGFuZCBhbHNvIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgbm90Ci0gICAgICAvLyBzdGFydCB3aXRoICJ7IiBvciAiPCIgd2hpY2ggaW5kaWNhdGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlIGJvZHkuCi0gICAgICAvLyBJZiB0aGVyZSBpcyBubyAiOiIgb3IgdGhlcmUgaXMgYSAieyIgb3IgIjwiIGFmdGVyICI6IiwgdGhpcyBmaWVsZCBoYXMKLSAgICAgIC8vIHRvIGJlIGEgbWVzc2FnZSBvciB0aGUgaW5wdXQgaXMgaWxsLWZvcm1lZC4KLSAgICAgIGlmICh0b2tlbml6ZXIudHJ5Q29uc3VtZSgiOiIpCi0gICAgICAgICAgJiYgIXRva2VuaXplci5sb29raW5nQXQoIjwiKQotICAgICAgICAgICYmICF0b2tlbml6ZXIubG9va2luZ0F0KCJ7IikpIHsKLSAgICAgICAgc2tpcEZpZWxkVmFsdWUodG9rZW5pemVyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHNraXBGaWVsZE1lc3NhZ2UodG9rZW5pemVyKTsKLSAgICAgIH0KLSAgICAgIC8vIEZvciBoaXN0b3JpY2FsIHJlYXNvbnMsIGZpZWxkcyBtYXkgb3B0aW9uYWxseSBiZSBzZXBhcmF0ZWQgYnkgY29tbWFzIG9yCi0gICAgICAvLyBzZW1pY29sb25zLgotICAgICAgaWYgKCF0b2tlbml6ZXIudHJ5Q29uc3VtZSgiOyIpKSB7Ci0gICAgICAgIHRva2VuaXplci50cnlDb25zdW1lKCIsIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2tpcHMgdGhlIHdob2xlIGJvZHkgb2YgYSBtZXNzYWdlIGluY2x1ZGluZyB0aGUgYmVnaW5uaW5nIGRlbGltaXRlciBhbmQKLSAgICAgKiB0aGUgZW5kaW5nIGRlbGltaXRlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2tpcEZpZWxkTWVzc2FnZShUb2tlbml6ZXIgdG9rZW5pemVyKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgZmluYWwgU3RyaW5nIGRlbGltaXRlcjsKLSAgICAgIGlmICh0b2tlbml6ZXIudHJ5Q29uc3VtZSgiPCIpKSB7Ci0gICAgICAgIGRlbGltaXRlciA9ICI+IjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRva2VuaXplci5jb25zdW1lKCJ7Iik7Ci0gICAgICAgIGRlbGltaXRlciA9ICJ9IjsKLSAgICAgIH0KLSAgICAgIHdoaWxlICghdG9rZW5pemVyLmxvb2tpbmdBdCgiPiIpICYmICF0b2tlbml6ZXIubG9va2luZ0F0KCJ9IikpIHsKLSAgICAgICAgc2tpcEZpZWxkKHRva2VuaXplcik7Ci0gICAgICB9Ci0gICAgICB0b2tlbml6ZXIuY29uc3VtZShkZWxpbWl0ZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNraXBzIGEgZmllbGQgdmFsdWUuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNraXBGaWVsZFZhbHVlKFRva2VuaXplciB0b2tlbml6ZXIpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBpZiAodG9rZW5pemVyLnRyeUNvbnN1bWVTdHJpbmcoKSkgewotICAgICAgICB3aGlsZSAodG9rZW5pemVyLnRyeUNvbnN1bWVTdHJpbmcoKSkge30KLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKCF0b2tlbml6ZXIudHJ5Q29uc3VtZUlkZW50aWZpZXIoKSAgIC8vIGluY2x1ZGVzIGVudW0gJiBib29sZWFuCi0gICAgICAgICAgJiYgIXRva2VuaXplci50cnlDb25zdW1lSW50NjQoKSAgICAgLy8gaW5jbHVkZXMgaW50MzIKLSAgICAgICAgICAmJiAhdG9rZW5pemVyLnRyeUNvbnN1bWVVSW50NjQoKSAgICAvLyBpbmNsdWRlcyB1aW50MzIKLSAgICAgICAgICAmJiAhdG9rZW5pemVyLnRyeUNvbnN1bWVEb3VibGUoKQotICAgICAgICAgICYmICF0b2tlbml6ZXIudHJ5Q29uc3VtZUZsb2F0KCkpIHsKLSAgICAgICAgdGhyb3cgdG9rZW5pemVyLnBhcnNlRXhjZXB0aW9uKAotICAgICAgICAgICAgIkludmFsaWQgZmllbGQgdmFsdWU6ICIgKyB0b2tlbml6ZXIuY3VycmVudFRva2VuKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBVdGlsaXR5IGZ1bmN0aW9ucwotICAvLwotICAvLyBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIHBhY2thZ2UtcHJpdmF0ZSBiZWNhdXNlIERlc2NyaXB0b3JzLmphdmEgdXNlcwotICAvLyB0aGVtLgotCi0gIC8qKgotICAgKiBFc2NhcGVzIGJ5dGVzIGluIHRoZSBmb3JtYXQgdXNlZCBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQsIHdoaWNoCi0gICAqIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtYXQgdXNlZCBmb3IgQyBzdHJpbmcgbGl0ZXJhbHMuICBBbGwgYnl0ZXMKLSAgICogdGhhdCBhcmUgbm90IHByaW50YWJsZSA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLCBhcyB3ZWxsIGFzCi0gICAqIGJhY2tzbGFzaCwgc2luZ2xlLXF1b3RlLCBhbmQgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuICBDaGFyYWN0ZXJzIGZvcgotICAgKiB3aGljaCBubyBkZWZpbmVkIHNob3J0LWhhbmQgZXNjYXBlIHNlcXVlbmNlIGlzIGRlZmluZWQgd2lsbCBiZSBlc2NhcGVkCi0gICAqIHVzaW5nIDMtZGlnaXQgb2N0YWwgc2VxdWVuY2VzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgZXNjYXBlQnl0ZXMoQnl0ZVN0cmluZyBpbnB1dCkgewotICAgIHJldHVybiBUZXh0Rm9ybWF0RXNjYXBlci5lc2NhcGVCeXRlcyhpbnB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI2VzY2FwZUJ5dGVzKEJ5dGVTdHJpbmcpfSwgYnV0IHVzZWQgZm9yIGJ5dGUgYXJyYXkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBlc2NhcGVCeXRlcyhieXRlW10gaW5wdXQpIHsKLSAgICByZXR1cm4gVGV4dEZvcm1hdEVzY2FwZXIuZXNjYXBlQnl0ZXMoaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFVuLWVzY2FwZSBhIGJ5dGUgc2VxdWVuY2UgYXMgZXNjYXBlZCB1c2luZwotICAgKiB7QGxpbmsgI2VzY2FwZUJ5dGVzKEJ5dGVTdHJpbmcpfS4gIFR3by1kaWdpdCBoZXggZXNjYXBlcyAoc3RhcnRpbmcgd2l0aAotICAgKiAiXHgiKSBhcmUgYWxzbyByZWNvZ25pemVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIHVuZXNjYXBlQnl0ZXMoZmluYWwgQ2hhclNlcXVlbmNlIGNoYXJTdHJpbmcpCi0gICAgICB0aHJvd3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIHsKLSAgICAvLyBGaXJzdCBjb252ZXJ0IHRoZSBKYXZhIGNoYXJhY3RlciBzZXF1ZW5jZSB0byBVVEYtOCBieXRlcy4KLSAgICBCeXRlU3RyaW5nIGlucHV0ID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoY2hhclN0cmluZy50b1N0cmluZygpKTsKLSAgICAvLyBUaGVuIHVuZXNjYXBlIGNlcnRhaW4gYnl0ZSBzZXF1ZW5jZXMgaW50cm9kdWNlZCBieSBBU0NJSSAnXFwnLiAgVGhlIHZhbGlkCi0gICAgLy8gZXNjYXBlcyBjYW4gYWxsIGJlIGV4cHJlc3NlZCB3aXRoIEFTQ0lJIGNoYXJhY3RlcnMsIHNvIGl0IGlzIHNhZmUgdG8KLSAgICAvLyBvcGVyYXRlIG9uIGJ5dGVzIGhlcmUuCi0gICAgLy8KLSAgICAvLyBVbmVzY2FwaW5nIHRoZSBpbnB1dCBieXRlIGFycmF5IHdpbGwgcmVzdWx0IGluIGEgYnl0ZSBzZXF1ZW5jZSB0aGF0J3Mgbm8KLSAgICAvLyBsb25nZXIgdGhhbiB0aGUgaW5wdXQuICBUaGF0J3MgYmVjYXVzZSBlYWNoIGVzY2FwZSBzZXF1ZW5jZSBpcyBiZXR3ZWVuCi0gICAgLy8gdHdvIGFuZCBmb3VyIGJ5dGVzIGxvbmcgYW5kIHN0YW5kcyBmb3IgYSBzaW5nbGUgYnl0ZS4KLSAgICBmaW5hbCBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbaW5wdXQuc2l6ZSgpXTsKLSAgICBpbnQgcG9zID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7Ci0gICAgICBieXRlIGMgPSBpbnB1dC5ieXRlQXQoaSk7Ci0gICAgICBpZiAoYyA9PSAnXFwnKSB7Ci0gICAgICAgIGlmIChpICsgMSA8IGlucHV0LnNpemUoKSkgewotICAgICAgICAgICsraTsKLSAgICAgICAgICBjID0gaW5wdXQuYnl0ZUF0KGkpOwotICAgICAgICAgIGlmIChpc09jdGFsKGMpKSB7Ci0gICAgICAgICAgICAvLyBPY3RhbCBlc2NhcGUuCi0gICAgICAgICAgICBpbnQgY29kZSA9IGRpZ2l0VmFsdWUoYyk7Ci0gICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNPY3RhbChpbnB1dC5ieXRlQXQoaSArIDEpKSkgewotICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIGRpZ2l0VmFsdWUoaW5wdXQuYnl0ZUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChpICsgMSA8IGlucHV0LnNpemUoKSAmJiBpc09jdGFsKGlucHV0LmJ5dGVBdChpICsgMSkpKSB7Ci0gICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgY29kZSA9IGNvZGUgKiA4ICsgZGlnaXRWYWx1ZShpbnB1dC5ieXRlQXQoaSkpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETzogQ2hlY2sgdGhhdCAwIDw9IGNvZGUgJiYgY29kZSA8PSAweEZGLgotICAgICAgICAgICAgcmVzdWx0W3BvcysrXSA9IChieXRlKSBjb2RlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgY2FzZSAnYScgOiByZXN1bHRbcG9zKytdID0gMHgwNzsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2InIDogcmVzdWx0W3BvcysrXSA9ICdcYic7IGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdmJyA6IHJlc3VsdFtwb3MrK10gPSAnXGYnOyBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnbicgOiByZXN1bHRbcG9zKytdID0gJ1xuJzsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3InIDogcmVzdWx0W3BvcysrXSA9ICdccic7IGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICd0JyA6IHJlc3VsdFtwb3MrK10gPSAnXHQnOyBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAndicgOiByZXN1bHRbcG9zKytdID0gMHgwYjsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ1xcJzogcmVzdWx0W3BvcysrXSA9ICdcXCc7IGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdcJyc6IHJlc3VsdFtwb3MrK10gPSAnXCcnOyBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnIicgOiByZXN1bHRbcG9zKytdID0gJ1wiJzsgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgLy8gaGV4IGVzY2FwZQotICAgICAgICAgICAgICAgIGludCBjb2RlID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNIZXgoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICAgIGNvZGUgPSBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFx4JyB3aXRoIG5vIGRpZ2l0cyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNIZXgoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTYgKyBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSkgY29kZTsKLSAgICAgICAgICAgICAgICBicmVhazsKLQotICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZTogJ1xcIiArIChjaGFyKSBjICsgJ1wnJyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJJbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZTogJ1xcJyBhdCBlbmQgb2Ygc3RyaW5nLiIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHRbcG9zKytdID0gYzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0Lmxlbmd0aCA9PSBwb3MKLSAgICAgICAgPyBCeXRlU3RyaW5nLndyYXAocmVzdWx0KSAgLy8gVGhpcyByZWZlcmVuY2UgaGFzIG5vdCBiZWVuIG91dCBvZiBvdXIgY29udHJvbC4KLSAgICAgICAgOiBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlc3VsdCwgMCwgcG9zKTsKLSAgfQotCi0gIC8qKgotICAgKiBUaHJvd24gYnkge0BsaW5rIFRleHRGb3JtYXQjdW5lc2NhcGVCeXRlc30gYW5kCi0gICAqIHtAbGluayBUZXh0Rm9ybWF0I3VuZXNjYXBlVGV4dH0gd2hlbiBhbiBpbnZhbGlkIGVzY2FwZSBzZXF1ZW5jZSBpcyBzZWVuLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTgxNjQwMzM2NTAxNDI1OTMzMDRMOwotCi0gICAgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgc3VwZXIoZGVzY3JpcHRpb24pOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjZXNjYXBlQnl0ZXMoQnl0ZVN0cmluZyl9LCBidXQgZXNjYXBlcyBhIHRleHQgc3RyaW5nLgotICAgKiBOb24tQVNDSUkgY2hhcmFjdGVycyBhcmUgZmlyc3QgZW5jb2RlZCBhcyBVVEYtOCwgdGhlbiBlYWNoIGJ5dGUgaXMgZXNjYXBlZAotICAgKiBpbmRpdmlkdWFsbHkgYXMgYSAzLWRpZ2l0IG9jdGFsIGVzY2FwZS4gIFllcywgaXQncyB3ZWlyZC4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgaW5wdXQpIHsKLSAgICByZXR1cm4gZXNjYXBlQnl0ZXMoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoaW5wdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBFc2NhcGUgZG91YmxlIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMgaW4gYSBTdHJpbmcgZm9yIHVuaWNvZGUgb3V0cHV0IG9mIGEgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZURvdWJsZVF1b3Rlc0FuZEJhY2tzbGFzaGVzKGZpbmFsIFN0cmluZyBpbnB1dCkgewotICAgIHJldHVybiBUZXh0Rm9ybWF0RXNjYXBlci5lc2NhcGVEb3VibGVRdW90ZXNBbmRCYWNrc2xhc2hlcyhpbnB1dCk7Ci0gIH0KLQotICAvKioKLSAgICogVW4tZXNjYXBlIGEgdGV4dCBzdHJpbmcgYXMgZXNjYXBlZCB1c2luZyB7QGxpbmsgI2VzY2FwZVRleHQoU3RyaW5nKX0uCi0gICAqIFR3by1kaWdpdCBoZXggZXNjYXBlcyAoc3RhcnRpbmcgd2l0aCAiXHgiKSBhcmUgYWxzbyByZWNvZ25pemVkLgotICAgKi8KLSAgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gdW5lc2NhcGVCeXRlcyhpbnB1dCkudG9TdHJpbmdVdGY4KCk7Ci0gIH0KLQotICAvKiogSXMgdGhpcyBhbiBvY3RhbCBkaWdpdD8gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09jdGFsKGZpbmFsIGJ5dGUgYykgewotICAgIHJldHVybiAnMCcgPD0gYyAmJiBjIDw9ICc3JzsKLSAgfQotCi0gIC8qKiBJcyB0aGlzIGEgaGV4IGRpZ2l0PyAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSGV4KGZpbmFsIGJ5dGUgYykgewotICAgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpCi0gICAgICAgIHx8ICgnYScgPD0gYyAmJiBjIDw9ICdmJykKLSAgICAgICAgfHwgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcnByZXQgYSBjaGFyYWN0ZXIgYXMgYSBkaWdpdCAoaW4gYW55IGJhc2UgdXAgdG8gMzYpIGFuZCByZXR1cm4gdGhlCi0gICAqIG51bWVyaWMgdmFsdWUuICBUaGlzIGlzIGxpa2Uge0Bjb2RlIENoYXJhY3Rlci5kaWdpdCgpfSBidXQgd2UgZG9uJ3QgYWNjZXB0Ci0gICAqIG5vbi1BU0NJSSBkaWdpdHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgZGlnaXRWYWx1ZShmaW5hbCBieXRlIGMpIHsKLSAgICBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKLSAgICAgIHJldHVybiBjIC0gJzAnOwotICAgIH0gZWxzZSBpZiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHsKLSAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjIC0gJ0EnICsgMTA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGZyb20gdGhlIHRleHQuICBVbmxpa2UgdGhlIEphdmEgc3RhbmRhcmQKLSAgICoge0Bjb2RlIEludGVnZXIucGFyc2VJbnQoKX0sIHRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgcHJlZml4ZXMgIjB4IgotICAgKiBhbmQgIjAiIHRvIHNpZ25pZnkgaGV4YWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMsIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHN0YXRpYyBpbnQgcGFyc2VJbnQzMihmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIChpbnQpIHBhcnNlSW50ZWdlcih0ZXh0LCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIHRoZSB0ZXh0LiAgVW5saWtlIHRoZSBKYXZhIHN0YW5kYXJkCi0gICAqIHtAY29kZSBJbnRlZ2VyLnBhcnNlSW50KCl9LCB0aGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHByZWZpeGVzICIweCIKLSAgICogYW5kICIwIiB0byBzaWduaWZ5IGhleGFkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzLCByZXNwZWN0aXZlbHkuICBUaGUKLSAgICogcmVzdWx0IGlzIGNvZXJjZWQgdG8gYSAoc2lnbmVkKSB7QGNvZGUgaW50fSB3aGVuIHJldHVybmVkIHNpbmNlIEphdmEgaGFzCi0gICAqIG5vIHVuc2lnbmVkIGludGVnZXIgdHlwZS4KLSAgICovCi0gIHN0YXRpYyBpbnQgcGFyc2VVSW50MzIoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgIHJldHVybiAoaW50KSBwYXJzZUludGVnZXIodGV4dCwgZmFsc2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBmcm9tIHRoZSB0ZXh0LiAgVW5saWtlIHRoZSBKYXZhIHN0YW5kYXJkCi0gICAqIHtAY29kZSBJbnRlZ2VyLnBhcnNlSW50KCl9LCB0aGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHByZWZpeGVzICIweCIKLSAgICogYW5kICIwIiB0byBzaWduaWZ5IGhleGFkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzLCByZXNwZWN0aXZlbHkuCi0gICAqLwotICBzdGF0aWMgbG9uZyBwYXJzZUludDY0KGZpbmFsIFN0cmluZyB0ZXh0KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcGFyc2VJbnRlZ2VyKHRleHQsIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSB0aGUgdGV4dC4gIFVubGlrZSB0aGUgSmF2YSBzdGFuZGFyZAotICAgKiB7QGNvZGUgSW50ZWdlci5wYXJzZUludCgpfSwgdGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBwcmVmaXhlcyAiMHgiCi0gICAqIGFuZCAiMCIgdG8gc2lnbmlmeSBoZXhhZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycywgcmVzcGVjdGl2ZWx5LiAgVGhlCi0gICAqIHJlc3VsdCBpcyBjb2VyY2VkIHRvIGEgKHNpZ25lZCkge0Bjb2RlIGxvbmd9IHdoZW4gcmV0dXJuZWQgc2luY2UgSmF2YSBoYXMKLSAgICogbm8gdW5zaWduZWQgbG9uZyB0eXBlLgotICAgKi8KLSAgc3RhdGljIGxvbmcgcGFyc2VVSW50NjQoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZUludGVnZXIodGV4dCwgZmFsc2UsIHRydWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBwYXJzZUludGVnZXIoZmluYWwgU3RyaW5nIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTaWduZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNMb25nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICBpbnQgcG9zID0gMDsKLQotICAgIGJvb2xlYW4gbmVnYXRpdmUgPSBmYWxzZTsKLSAgICBpZiAodGV4dC5zdGFydHNXaXRoKCItIiwgcG9zKSkgewotICAgICAgaWYgKCFpc1NpZ25lZCkgewotICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJOdW1iZXIgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHRleHQpOwotICAgICAgfQotICAgICAgKytwb3M7Ci0gICAgICBuZWdhdGl2ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaW50IHJhZGl4ID0gMTA7Ci0gICAgaWYgKHRleHQuc3RhcnRzV2l0aCgiMHgiLCBwb3MpKSB7Ci0gICAgICBwb3MgKz0gMjsKLSAgICAgIHJhZGl4ID0gMTY7Ci0gICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoIjAiLCBwb3MpKSB7Ci0gICAgICByYWRpeCA9IDg7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIG51bWJlclRleHQgPSB0ZXh0LnN1YnN0cmluZyhwb3MpOwotCi0gICAgbG9uZyByZXN1bHQgPSAwOwotICAgIGlmIChudW1iZXJUZXh0Lmxlbmd0aCgpIDwgMTYpIHsKLSAgICAgIC8vIENhbiBzYWZlbHkgYXNzdW1lIG5vIG92ZXJmbG93LgotICAgICAgcmVzdWx0ID0gTG9uZy5wYXJzZUxvbmcobnVtYmVyVGV4dCwgcmFkaXgpOwotICAgICAgaWYgKG5lZ2F0aXZlKSB7Ci0gICAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGJvdW5kcy4KLSAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgZm9yIDY0LWJpdCBudW1iZXJzIHNpbmNlIHRoZXknZCBoYXZlIHRvIGJlIDE2IGNoYXJzCi0gICAgICAvLyBvciBsb25nZXIgdG8gb3ZlcmZsb3cuCi0gICAgICBpZiAoIWlzTG9uZykgewotICAgICAgICBpZiAoaXNTaWduZWQpIHsKLSAgICAgICAgICBpZiAocmVzdWx0ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgcmVzdWx0IDwgSW50ZWdlci5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA+PSAoMUwgPDwgMzIpIHx8IHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcjogIiArIHRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBCaWdJbnRlZ2VyIGJpZ1ZhbHVlID0gbmV3IEJpZ0ludGVnZXIobnVtYmVyVGV4dCwgcmFkaXgpOwotICAgICAgaWYgKG5lZ2F0aXZlKSB7Ci0gICAgICAgIGJpZ1ZhbHVlID0gYmlnVmFsdWUubmVnYXRlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGJvdW5kcy4KLSAgICAgIGlmICghaXNMb25nKSB7Ci0gICAgICAgIGlmIChpc1NpZ25lZCkgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDMxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgMzItYml0IHNpZ25lZCBpbnRlZ2VyOiAiICsgdGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDMyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgMzItYml0IHVuc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChpc1NpZ25lZCkgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDYzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgNjQtYml0IHNpZ25lZCBpbnRlZ2VyOiAiICsgdGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDY0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgNjQtYml0IHVuc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gYmlnVmFsdWUubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0RXNjYXBlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0RXNjYXBlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYTljZWFkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdEVzY2FwZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIFByb3ZpZGUgdGV4dCBmb3JtYXQgZXNjYXBpbmcgc3VwcG9ydCBmb3IgcHJvdG8yIGluc3RhbmNlcy4KLSAqLwotZmluYWwgY2xhc3MgVGV4dEZvcm1hdEVzY2FwZXIgewotICBwcml2YXRlIFRleHRGb3JtYXRFc2NhcGVyKCkge30KLQotICBwcml2YXRlIGludGVyZmFjZSBCeXRlU2VxdWVuY2UgewotICAgIGludCBzaXplKCk7Ci0gICAgYnl0ZSBieXRlQXQoaW50IG9mZnNldCk7Ci0gIH0KLQotICAvKioKLSAgICogRXNjYXBlcyBieXRlcyBpbiB0aGUgZm9ybWF0IHVzZWQgaW4gcHJvdG9jb2wgYnVmZmVyIHRleHQgZm9ybWF0LCB3aGljaAotICAgKiBpcyB0aGUgc2FtZSBhcyB0aGUgZm9ybWF0IHVzZWQgZm9yIEMgc3RyaW5nIGxpdGVyYWxzLiAgQWxsIGJ5dGVzCi0gICAqIHRoYXQgYXJlIG5vdCBwcmludGFibGUgNy1iaXQgQVNDSUkgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCwgYXMgd2VsbCBhcwotICAgKiBiYWNrc2xhc2gsIHNpbmdsZS1xdW90ZSwgYW5kIGRvdWJsZS1xdW90ZSBjaGFyYWN0ZXJzLiAgQ2hhcmFjdGVycyBmb3IKLSAgICogd2hpY2ggbm8gZGVmaW5lZCBzaG9ydC1oYW5kIGVzY2FwZSBzZXF1ZW5jZSBpcyBkZWZpbmVkIHdpbGwgYmUgZXNjYXBlZAotICAgKiB1c2luZyAzLWRpZ2l0IG9jdGFsIHNlcXVlbmNlcy4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgZXNjYXBlQnl0ZXMoZmluYWwgQnl0ZVNlcXVlbmNlIGlucHV0KSB7Ci0gICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoaW5wdXQuc2l6ZSgpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7Ci0gICAgICBmaW5hbCBieXRlIGIgPSBpbnB1dC5ieXRlQXQoaSk7Ci0gICAgICBzd2l0Y2ggKGIpIHsKLSAgICAgICAgLy8gSmF2YSBkb2VzIG5vdCByZWNvZ25pemUgXGEgb3IgXHYsIGFwcGFyZW50bHkuCi0gICAgICAgIGNhc2UgMHgwNzogYnVpbGRlci5hcHBlbmQoIlxcYSIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXGInOiBidWlsZGVyLmFwcGVuZCgiXFxiIik7IGJyZWFrOwotICAgICAgICBjYXNlICdcZic6IGJ1aWxkZXIuYXBwZW5kKCJcXGYiKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzogYnVpbGRlci5hcHBlbmQoIlxcbiIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXHInOiBidWlsZGVyLmFwcGVuZCgiXFxyIik7IGJyZWFrOwotICAgICAgICBjYXNlICdcdCc6IGJ1aWxkZXIuYXBwZW5kKCJcXHQiKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgwYjogYnVpbGRlci5hcHBlbmQoIlxcdiIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXFwnOiBidWlsZGVyLmFwcGVuZCgiXFxcXCIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnXCcnOiBidWlsZGVyLmFwcGVuZCgiXFxcJyIpOyBicmVhazsKLSAgICAgICAgY2FzZSAnIicgOiBidWlsZGVyLmFwcGVuZCgiXFxcIiIpOyBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAvLyBPbmx5IEFTQ0lJIGNoYXJhY3RlcnMgYmV0d2VlbiAweDIwIChzcGFjZSkgYW5kIDB4N2UgKHRpbGRlKSBhcmUKLSAgICAgICAgICAvLyBwcmludGFibGUuICBPdGhlciBieXRlIHZhbHVlcyBtdXN0IGJlIGVzY2FwZWQuCi0gICAgICAgICAgaWYgKGIgPj0gMHgyMCAmJiBiIDw9IDB4N2UpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSBiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcikgKCcwJyArICgoYiA+Pj4gNikgJiAzKSkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpICgnMCcgKyAoKGIgPj4+IDMpICYgNykpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSAoJzAnICsgKGIgJiA3KSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBFc2NhcGVzIGJ5dGVzIGluIHRoZSBmb3JtYXQgdXNlZCBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQsIHdoaWNoCi0gICAqIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtYXQgdXNlZCBmb3IgQyBzdHJpbmcgbGl0ZXJhbHMuICBBbGwgYnl0ZXMKLSAgICogdGhhdCBhcmUgbm90IHByaW50YWJsZSA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLCBhcyB3ZWxsIGFzCi0gICAqIGJhY2tzbGFzaCwgc2luZ2xlLXF1b3RlLCBhbmQgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuICBDaGFyYWN0ZXJzIGZvcgotICAgKiB3aGljaCBubyBkZWZpbmVkIHNob3J0LWhhbmQgZXNjYXBlIHNlcXVlbmNlIGlzIGRlZmluZWQgd2lsbCBiZSBlc2NhcGVkCi0gICAqIHVzaW5nIDMtZGlnaXQgb2N0YWwgc2VxdWVuY2VzLgotICAgKi8KLSAgc3RhdGljIFN0cmluZyBlc2NhcGVCeXRlcyhmaW5hbCBCeXRlU3RyaW5nIGlucHV0KSB7Ci0gICAgcmV0dXJuIGVzY2FwZUJ5dGVzKG5ldyBCeXRlU2VxdWVuY2UoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0LnNpemUoKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJ5dGUgYnl0ZUF0KGludCBvZmZzZXQpIHsKLSAgICAgICAgcmV0dXJuIGlucHV0LmJ5dGVBdChvZmZzZXQpOwotICAgICAgfQotICAgIH0pOwotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNlc2NhcGVCeXRlcyhCeXRlU3RyaW5nKX0sIGJ1dCB1c2VkIGZvciBieXRlIGFycmF5LgotICAgKi8KLSAgc3RhdGljIFN0cmluZyBlc2NhcGVCeXRlcyhmaW5hbCBieXRlW10gaW5wdXQpIHsKLSAgICByZXR1cm4gZXNjYXBlQnl0ZXMobmV3IEJ5dGVTZXF1ZW5jZSgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgICByZXR1cm4gaW5wdXQubGVuZ3RoOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYnl0ZSBieXRlQXQoaW50IG9mZnNldCkgewotICAgICAgICByZXR1cm4gaW5wdXRbb2Zmc2V0XTsKLSAgICAgIH0KLSAgICB9KTsKLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjZXNjYXBlQnl0ZXMoQnl0ZVN0cmluZyl9LCBidXQgZXNjYXBlcyBhIHRleHQgc3RyaW5nLgotICAgKiBOb24tQVNDSUkgY2hhcmFjdGVycyBhcmUgZmlyc3QgZW5jb2RlZCBhcyBVVEYtOCwgdGhlbiBlYWNoIGJ5dGUgaXMgZXNjYXBlZAotICAgKiBpbmRpdmlkdWFsbHkgYXMgYSAzLWRpZ2l0IG9jdGFsIGVzY2FwZS4gIFllcywgaXQncyB3ZWlyZC4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgZXNjYXBlVGV4dChmaW5hbCBTdHJpbmcgaW5wdXQpIHsKLSAgICByZXR1cm4gZXNjYXBlQnl0ZXMoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoaW5wdXQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBFc2NhcGUgZG91YmxlIHF1b3RlcyBhbmQgYmFja3NsYXNoZXMgaW4gYSBTdHJpbmcgZm9yIHVuaWNvZGUgb3V0cHV0IG9mIGEgbWVzc2FnZS4KLSAgICovCi0gIHN0YXRpYyBTdHJpbmcgZXNjYXBlRG91YmxlUXVvdGVzQW5kQmFja3NsYXNoZXMoZmluYWwgU3RyaW5nIGlucHV0KSB7Ci0gICAgcmV0dXJuIGlucHV0LnJlcGxhY2UoIlxcIiwgIlxcXFwiKS5yZXBsYWNlKCJcIiIsICJcXFwiIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVjZjkxMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXRQYXJzZUluZm9UcmVlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotCi0KLS8qKgotICogRGF0YSBzdHJ1Y3R1cmUgd2hpY2ggaXMgcG9wdWxhdGVkIHdpdGggdGhlIGxvY2F0aW9ucyBvZiBlYWNoIGZpZWxkIHZhbHVlIHBhcnNlZCBmcm9tIHRoZSB0ZXh0LgotICoKLSAqIDxwPlRoZSBsb2NhdGlvbnMgb2YgcHJpbWFyeSBmaWVsZHMgdmFsdWVzIGFyZSByZXRyaWV2ZWQgYnkge0Bjb2RlIGdldExvY2F0aW9ufSBvcgotICoge0Bjb2RlIGdldExvY2F0aW9uc30uICBUaGUgbG9jYXRpb25zIG9mIHN1YiBtZXNzYWdlIHZhbHVlcyBhcmUgd2l0aGluIG5lc3RlZAotICoge0Bjb2RlIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlfXMgYW5kIGFyZSByZXRyaWV2ZSBieSB7QGdldE5lc3RlZFRyZWV9IG9yIHtjb2RlIEBnZXROZXN0ZWRUcmVlc30uCi0gKgotICogPHA+VGhlIHtAY29kZSBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZX0gaXMgY3JlYXRlZCBieSBhIEJ1aWxkZXIuCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSB7Ci0KLSAgLy8gRGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBlYWNoIGZpZWxkJ3MgZGVzY3JpcHRvciB0byB0aGUgbGlzdCBvZiBsb2NhdGlvbnMgd2hlcmUKLSAgLy8gaXRzIHZhbHVlKHMpIHdlcmUgd2FzIGVuY291bnRlcmVkLgotICBwcml2YXRlIE1hcDxGaWVsZERlc2NyaXB0b3IsIExpc3Q8VGV4dEZvcm1hdFBhcnNlTG9jYXRpb24+PiBsb2NhdGlvbnNGcm9tRmllbGQ7Ci0KLSAgLy8gRGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIGZpZWxkJ3MgZGVzY3JpcHRvciB0byBhIGxpc3Qgb2YgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWVzIGZvcgotICAvLyBzdWIgbWVzc2FnZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KLSAgTWFwPEZpZWxkRGVzY3JpcHRvciwgTGlzdDxUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZT4+IHN1YnRyZWVzRnJvbUZpZWxkOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWV9LgotICAgKgotICAgKiBAcGFyYW0gbG9jYXRpb25zRnJvbUZpZWxkIGEgbWFwIG9mIGZpZWxkcyB0byBsb2NhdGlvbiBpbiB0aGUgc291cmNlIGNvZGUKLSAgICogQHBhcmFtIHN1YnRyZWVCdWlsZGVyc0Zyb21GaWVsZCBhIG1hcCBvZiBmaWVsZHMgdG8gcGFyc2UgdHJlZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBidWlsZGVycwotICAgKi8KLSAgcHJpdmF0ZSBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSgKLSAgICAgIE1hcDxGaWVsZERlc2NyaXB0b3IsIExpc3Q8VGV4dEZvcm1hdFBhcnNlTG9jYXRpb24+PiBsb2NhdGlvbnNGcm9tRmllbGQsCi0gICAgICBNYXA8RmllbGREZXNjcmlwdG9yLCBMaXN0PFRleHRGb3JtYXRQYXJzZUluZm9UcmVlLkJ1aWxkZXI+PiBzdWJ0cmVlQnVpbGRlcnNGcm9tRmllbGQpIHsKLQotICAgIC8vIFRoZSBtYXBzIGFyZSB1bm1vZGlmaWFibGUuICBUaGUgdmFsdWVzIGluIHRoZSBtYXBzIGFyZSB1bm1vZGlmaWFibGUuCi0gICAgTWFwPEZpZWxkRGVzY3JpcHRvciwgTGlzdDxUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbj4+IGxvY3MgPQotICAgICAgICBuZXcgSGFzaE1hcDxGaWVsZERlc2NyaXB0b3IsIExpc3Q8VGV4dEZvcm1hdFBhcnNlTG9jYXRpb24+PigpOwotICAgIGZvciAoRW50cnk8RmllbGREZXNjcmlwdG9yLCBMaXN0PFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uPj4ga3YgOiBsb2NhdGlvbnNGcm9tRmllbGQuZW50cnlTZXQoKSkgewotICAgICAgbG9jcy5wdXQoa3YuZ2V0S2V5KCksIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3Qoa3YuZ2V0VmFsdWUoKSkpOwotICAgIH0KLSAgICB0aGlzLmxvY2F0aW9uc0Zyb21GaWVsZCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChsb2NzKTsKLQotICAgIE1hcDxGaWVsZERlc2NyaXB0b3IsIExpc3Q8VGV4dEZvcm1hdFBhcnNlSW5mb1RyZWU+PiBzdWJzID0KLSAgICAgICAgbmV3IEhhc2hNYXA8RmllbGREZXNjcmlwdG9yLCBMaXN0PFRleHRGb3JtYXRQYXJzZUluZm9UcmVlPj4oKTsKLSAgICBmb3IgKEVudHJ5PEZpZWxkRGVzY3JpcHRvciwgTGlzdDxCdWlsZGVyPj4ga3YgOiBzdWJ0cmVlQnVpbGRlcnNGcm9tRmllbGQuZW50cnlTZXQoKSkgewotICAgICAgTGlzdDxUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZT4gc3VibWVzc2FnZXNPZkZpZWxkID0gbmV3IEFycmF5TGlzdDxUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZT4oKTsKLSAgICAgIGZvciAoQnVpbGRlciBzdWJCdWlsZGVyIDoga3YuZ2V0VmFsdWUoKSkgewotICAgICAgICBzdWJtZXNzYWdlc09mRmllbGQuYWRkKHN1YkJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICB9Ci0gICAgICBzdWJzLnB1dChrdi5nZXRLZXkoKSwgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChzdWJtZXNzYWdlc09mRmllbGQpKTsKLSAgICB9Ci0gICAgdGhpcy5zdWJ0cmVlc0Zyb21GaWVsZCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChzdWJzKTsKLSAgfQotCi0gLyoqCi0gICogUmV0cmlldmUgYWxsIHRoZSBsb2NhdGlvbnMgb2YgYSBmaWVsZC4KLSAgKgotICAqIEBwYXJhbSBmaWVsZERlc2NyaXB0b3IgdGhlIHRoZSBAe2xpbmsgRmllbGREZXNjcmlwdG9yfSBvZiB0aGUgZGVzaXJlZCBmaWVsZAotICAqIEByZXR1cm4gYSBsaXN0IG9mIHRoZSBsb2NhdGlvbnMgb2YgdmFsdWVzIG9mIHRoZSBmaWVsZC4gIElmIHRoZXJlIGFyZSBub3QgdmFsdWVzCi0gICogICAgICAgICBvciB0aGUgZmllbGQgZG9lc24ndCBleGlzdCwgYW4gZW1wdHkgbGlzdCBpcyByZXR1cm5lZC4KLSAgKi8KLSAgcHVibGljIExpc3Q8VGV4dEZvcm1hdFBhcnNlTG9jYXRpb24+IGdldExvY2F0aW9ucyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yKSB7Ci0gICAgTGlzdDxUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbj4gcmVzdWx0ID0gbG9jYXRpb25zRnJvbUZpZWxkLmdldChmaWVsZERlc2NyaXB0b3IpOwotICAgIHJldHVybiAocmVzdWx0ID09IG51bGwpID8gQ29sbGVjdGlvbnMuPFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uPmVtcHR5TGlzdCgpIDogcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbG9jYXRpb24gaW4gdGhlIHNvdXJjZSBvZiBhIGZpZWxkJ3MgdmFsdWUuCi0gICAqCi0gICAqIDxwPlJldHVybnMgdGhlIHtAbGluayBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbn0gZm9yIGluZGV4LXRoIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgcGFyc2VkCi0gICAqIHRleHQuCi0gICAqCi0gICAqIEBwYXJhbSBmaWVsZERlc2NyaXB0b3IgdGhlIEB7bGluayBGaWVsZERlc2NyaXB0b3J9IG9mIHRoZSBkZXNpcmVkIGZpZWxkCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSB7QGxpbmsgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb259IG9mIHRoZSB2YWx1ZQotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpbmRleCBpcyBvdXQgb2YgcmFuZ2UKLSAgICovCi0gIHB1YmxpYyBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbiBnZXRMb2NhdGlvbihmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yLCBpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gZ2V0RnJvbUxpc3QoZ2V0TG9jYXRpb25zKGZpZWxkRGVzY3JpcHRvciksIGluZGV4LCBmaWVsZERlc2NyaXB0b3IpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHJpZXZlIGEgbGlzdCBvZiBhbGwgdGhlIGxvY2F0aW9uIGluZm9ybWF0aW9uIHRyZWVzIGZvciBhIHN1YiBtZXNzYWdlIGZpZWxkLgotICAgKgotICAgKiBAcGFyYW0gZmllbGREZXNjcmlwdG9yIHRoZSBAe2xpbmsgRmllbGREZXNjcmlwdG9yfSBvZiB0aGUgZGVzaXJlZCBmaWVsZAotICAgKiBAcmV0dXJuIEEgbGlzdCBvZiB7QGxpbmsgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWV9Ci0gICAqLwotICBwdWJsaWMgTGlzdDxUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZT4gZ2V0TmVzdGVkVHJlZXMoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvcikgewotICAgIExpc3Q8VGV4dEZvcm1hdFBhcnNlSW5mb1RyZWU+IHJlc3VsdCA9IHN1YnRyZWVzRnJvbUZpZWxkLmdldChmaWVsZERlc2NyaXB0b3IpOwotICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/IENvbGxlY3Rpb25zLjxUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZT5lbXB0eUxpc3QoKSA6IHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBwYXJzZSBpbmZvIHRyZWUgZm9yIHRoZSBnaXZlbiBmaWVsZCwgd2hpY2ggbXVzdCBiZSBhIG1lc3NhZ2UgdHlwZS4KLSAgICoKLSAgICogQHBhcmFtIGZpZWxkRGVzY3JpcHRvciB0aGUgQHtsaW5rIEZpZWxkRGVzY3JpcHRvcn0gb2YgdGhlIGRlc2lyZWQgc3ViIG1lc3NhZ2UKLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBvZiBtZXNzYWdlIHZhbHVlLgotICAgKiBAcmV0dXJuIHRoZSB7QGNvZGUgUGFyc2VJbmZvVHJlZX0gb2YgdGhlIG1lc3NhZ2UgdmFsdWUuIHtAY29kZSBudWxsfSBpcyByZXR1cm5lZCBpZiB0aGUgZmllbGQKLSAgICogICAgICAgICBkb2Vzbid0IGV4aXN0IG9yIHRoZSBpbmRleCBpcyBvdXQgb2YgcmFuZ2UuCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGluZGV4IGlzIG91dCBvZiByYW5nZQotICAgKi8KLSAgcHVibGljIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlIGdldE5lc3RlZFRyZWUoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciwgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGdldEZyb21MaXN0KGdldE5lc3RlZFRyZWVzKGZpZWxkRGVzY3JpcHRvciksIGluZGV4LCBmaWVsZERlc2NyaXB0b3IpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIGJ1aWxkZXIgZm9yIGEge0Bjb2RlIFBhcnNlSW5mb1RyZWV9LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgYnVpbGRlcigpIHsKLSAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIDxUPiBUIGdldEZyb21MaXN0KExpc3Q8VD4gbGlzdCwgaW50IGluZGV4LCBGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yKSB7Ci0gICAgaWYgKGluZGV4ID49IGxpc3Quc2l6ZSgpIHx8IGluZGV4IDwgMCkgIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oU3RyaW5nLmZvcm1hdCgiSWxsZWdhbCBpbmRleCBmaWVsZDogJXMsIGluZGV4ICVkIiwKLSAgICAgICAgICBmaWVsZERlc2NyaXB0b3IgPT0gbnVsbCA/ICI8bnVsbD4iIDogZmllbGREZXNjcmlwdG9yLmdldE5hbWUoKSwgaW5kZXgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxpc3QuZ2V0KGluZGV4KTsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZGVyIGZvciBhIHtAbGluayBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIEJ1aWxkZXIgewotCi0gICAgcHJpdmF0ZSBNYXA8RmllbGREZXNjcmlwdG9yLCBMaXN0PFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uPj4gbG9jYXRpb25zRnJvbUZpZWxkOwotCi0gICAgLy8gRGVmaW5lcyBhIG1hcHBpbmcgYmV0d2VlbiBhIGZpZWxkJ3MgZGVzY3JpcHRvciB0byBhIGxpc3Qgb2YgUGFyc2VJbmZvVHJlZXMgYnVpbGRlcnMgZm9yCi0gICAgLy8gc3ViIG1lc3NhZ2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gICAgcHJpdmF0ZSBNYXA8RmllbGREZXNjcmlwdG9yLCBMaXN0PEJ1aWxkZXI+PiBzdWJ0cmVlQnVpbGRlcnNGcm9tRmllbGQ7Ci0KLSAgICAgLyoqCi0gICAgICogQ3JlYXRlIGEgcm9vdCBsZXZlbCB7QFBhcnNlSW5mb1RyZWV9IGJ1aWxkZXIuCi0gICAgICovCi0gICAgcHJpdmF0ZSBCdWlsZGVyKCkgewotICAgICAgbG9jYXRpb25zRnJvbUZpZWxkID0gbmV3IEhhc2hNYXA8RmllbGREZXNjcmlwdG9yLCBMaXN0PFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uPj4oKTsKLSAgICAgIHN1YnRyZWVCdWlsZGVyc0Zyb21GaWVsZCA9IG5ldyBIYXNoTWFwPEZpZWxkRGVzY3JpcHRvciwgTGlzdDxCdWlsZGVyPj4oKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZWNvcmQgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGZvciBhIGZpZWxkLgotICAgICAqCi0gICAgICogQHBhcmFtIGZpZWxkRGVzY3JpcHRvciB0aGUgZmllbGQKLSAgICAgKiBAcGFyYW0gbG9jYXRpb24gc291cmNlIGNvZGUgbG9jYXRpb24gaW5mb3JtYXRpb24KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlciBzZXRMb2NhdGlvbigKLSAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciwgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgICAgIExpc3Q8VGV4dEZvcm1hdFBhcnNlTG9jYXRpb24+IGZpZWxkTG9jYXRpb25zID0gbG9jYXRpb25zRnJvbUZpZWxkLmdldChmaWVsZERlc2NyaXB0b3IpOwotICAgICAgaWYgKGZpZWxkTG9jYXRpb25zID09IG51bGwpIHsKLSAgICAgICAgZmllbGRMb2NhdGlvbnMgPSBuZXcgQXJyYXlMaXN0PFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uPigpOwotICAgICAgICBsb2NhdGlvbnNGcm9tRmllbGQucHV0KGZpZWxkRGVzY3JpcHRvciwgZmllbGRMb2NhdGlvbnMpOwotICAgICAgfQotICAgICAgZmllbGRMb2NhdGlvbnMuYWRkKGxvY2F0aW9uKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldCBmb3IgYSBzdWIgbWVzc2FnZS4KLSAgICAgKgotICAgICAqIDxwPkEgbmV3IGJ1aWxkZXIgaXMgY3JlYXRlZCBmb3IgYSBzdWIgbWVzc2FnZS4gVGhlIGJ1aWxkZXIgdGhhdCBpcyByZXR1cm5lZCBpcyBhIG5ldyBidWlsZGVyLgotICAgICAqIFRoZSByZXR1cm4gaXMgPGVtcGg+bm90PC9lbXBoPiB0aGUgaW52b2tlZCB7QGNvZGUgYnVpbGRlci5nZXRCdWlsZGVyRm9yU3ViTWVzc2FnZUZpZWxkfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBmaWVsZERlc2NyaXB0b3IgdGhlIGZpZWxkIHdob3NlIHZhbHVlIGlzIHRoZSBzdWJtZXNzYWdlCi0gICAgICogQHJldHVybiBhIG5ldyBCdWlsZGVyIGZvciB0aGUgc3ViIG1lc3NhZ2UKLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlciBnZXRCdWlsZGVyRm9yU3ViTWVzc2FnZUZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IpIHsKLSAgICAgIExpc3Q8QnVpbGRlcj4gc3VibWVzc2FnZUJ1aWxkZXJzID0gc3VidHJlZUJ1aWxkZXJzRnJvbUZpZWxkLmdldChmaWVsZERlc2NyaXB0b3IpOwotICAgICAgaWYgKHN1Ym1lc3NhZ2VCdWlsZGVycyA9PSBudWxsKSB7Ci0gICAgICAgIHN1Ym1lc3NhZ2VCdWlsZGVycyA9IG5ldyBBcnJheUxpc3Q8QnVpbGRlcj4oKTsKLSAgICAgICAgc3VidHJlZUJ1aWxkZXJzRnJvbUZpZWxkLnB1dChmaWVsZERlc2NyaXB0b3IsIHN1Ym1lc3NhZ2VCdWlsZGVycyk7Ci0gICAgICB9Ci0gICAgICBCdWlsZGVyIHN1YnRyZWVCdWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKLSAgICAgIHN1Ym1lc3NhZ2VCdWlsZGVycy5hZGQoc3VidHJlZUJ1aWxkZXIpOwotICAgICAgcmV0dXJuIHN1YnRyZWVCdWlsZGVyOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEJ1aWxkIHRoZSB7QGNvZGUgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWV9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGUge0Bjb2RlIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlfQotICAgICAqLwotICAgIHB1YmxpYyBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSBidWlsZCgpIHsKLSAgICAgIHJldHVybiBuZXcgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUobG9jYXRpb25zRnJvbUZpZWxkLCBzdWJ0cmVlQnVpbGRlcnNGcm9tRmllbGQpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjY2UyODZlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwNCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBBIGxvY2F0aW9uIGluIHRoZSBzb3VyY2UgY29kZS4KLSAqCi0gKiA8cD5BIGxvY2F0aW9uIGlzIHRoZSBzdGFydGluZyBsaW5lIG51bWJlciBhbmQgc3RhcnRpbmcgY29sdW1uIG51bWJlci4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uIHsKLQotICAvKioKLSAgICogVGhlIGVtcHR5IGxvY2F0aW9uLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbiBFTVBUWSA9IG5ldyBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbigtMSwgLTEpOwotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBsb2NhdGlvbi4KLSAgICoKLSAgICogQHBhcmFtIGxpbmUgdGhlIHN0YXJ0aW5nIGxpbmUgbnVtYmVyCi0gICAqIEBwYXJhbSBjb2x1bW4gdGhlIHN0YXJ0aW5nIGNvbHVtbiBudW1iZXIKLSAgICogQHJldHVybiBhIHtAY29kZSBQYXJzZUxvY2F0aW9ufQotICAgKi8KLSAgc3RhdGljIFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uIGNyZWF0ZShpbnQgbGluZSwgaW50IGNvbHVtbikgewotICAgIGlmIChsaW5lID09IC0xICYmIGNvbHVtbiA9PSAtMSkgewotICAgICAgcmV0dXJuIEVNUFRZOwotICAgIH0KLSAgICBpZiAobGluZSA8IDAgfHwgY29sdW1uIDwgMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJsaW5lIGFuZCBjb2x1bW4gdmFsdWVzIG11c3QgYmUgPj0gMDogbGluZSAlZCwgY29sdW1uOiAlZCIsIGxpbmUsIGNvbHVtbikpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uKGxpbmUsIGNvbHVtbik7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIGludCBsaW5lOwotICBwcml2YXRlIGZpbmFsIGludCBjb2x1bW47Ci0KLSAgcHJpdmF0ZSBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbihpbnQgbGluZSwgaW50IGNvbHVtbikgewotICAgIHRoaXMubGluZSA9IGxpbmU7Ci0gICAgdGhpcy5jb2x1bW4gPSBjb2x1bW47Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldExpbmUoKSB7Ci0gICAgcmV0dXJuIGxpbmU7Ci0gIH0KLQotICBwdWJsaWMgaW50IGdldENvbHVtbigpIHsKLSAgICByZXR1cm4gY29sdW1uOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIlBhcnNlTG9jYXRpb257bGluZT0lZCwgY29sdW1uPSVkfSIsIGxpbmUsIGNvbHVtbik7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gPT0gdGhpcykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGlmICghKG8gaW5zdGFuY2VvZiBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbikpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gdGhhdCA9IChUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbikgbzsKLSAgICByZXR1cm4gKHRoaXMubGluZSA9PSB0aGF0LmdldExpbmUoKSkKLSAgICAgICAgICYmICh0aGlzLmNvbHVtbiA9PSB0aGF0LmdldENvbHVtbigpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgIGludFtdIHZhbHVlcyA9IHtsaW5lLCBjb2x1bW59OwotICAgIHJldHVybiBBcnJheXMuaGFzaENvZGUodmFsdWVzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NzE0YzA2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGhyb3duIHdoZW4gYXR0ZW1wdGluZyB0byBidWlsZCBhIHByb3RvY29sIG1lc3NhZ2UgdGhhdCBpcyBtaXNzaW5nIHJlcXVpcmVkCi0gKiBmaWVsZHMuICBUaGlzIGlzIGEge0Bjb2RlIFJ1bnRpbWVFeGNlcHRpb259IGJlY2F1c2UgaXQgbm9ybWFsbHkgcmVwcmVzZW50cwotICogYSBwcm9ncmFtbWluZyBlcnJvcjogIGl0IGhhcHBlbnMgd2hlbiBzb21lIGNvZGUgd2hpY2ggY29uc3RydWN0cyBhIG1lc3NhZ2UKLSAqIGZhaWxzIHRvIHNldCBhbGwgdGhlIGZpZWxkcy4gIHtAY29kZSBwYXJzZUZyb20oKX0gbWV0aG9kcyA8Yj5kbyBub3Q8L2I+Ci0gKiB0aHJvdyB0aGlzOyB0aGV5IHRocm93IGFuIHtAbGluayBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259IGlmCi0gKiByZXF1aXJlZCBmaWVsZHMgYXJlIG1pc3NpbmcsIGJlY2F1c2UgaXQgaXMgbm90IGEgcHJvZ3JhbW1pbmcgZXJyb3IgdG8KLSAqIHJlY2VpdmUgYW4gaW5jb21wbGV0ZSBtZXNzYWdlLiAgSW4gb3RoZXIgd29yZHMsCi0gKiB7QGNvZGUgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb259IHNob3VsZCBuZXZlciBiZSB0aHJvd24gYnkgY29ycmVjdAotICogY29kZSwgYnV0IHtAY29kZSBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259IG1pZ2h0IGJlLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBleHRlbmRzIFJ1bnRpbWVFeGNlcHRpb24gewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtNzQ2NjkyOTk1MzM3NDg4MzUwN0w7Ci0KLSAgcHVibGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKGZpbmFsIE1lc3NhZ2VMaXRlIG1lc3NhZ2UpIHsKLSAgICBzdXBlcigiTWVzc2FnZSB3YXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuICAoTGl0ZSBydW50aW1lIGNvdWxkIG5vdCAiICsKLSAgICAgICAgICAiZGV0ZXJtaW5lIHdoaWNoIGZpZWxkcyB3ZXJlIG1pc3NpbmcpLiIpOwotICAgIG1pc3NpbmdGaWVsZHMgPSBudWxsOwotICB9Ci0KLSAgcHVibGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKGZpbmFsIExpc3Q8U3RyaW5nPiBtaXNzaW5nRmllbGRzKSB7Ci0gICAgc3VwZXIoYnVpbGREZXNjcmlwdGlvbihtaXNzaW5nRmllbGRzKSk7Ci0gICAgdGhpcy5taXNzaW5nRmllbGRzID0gbWlzc2luZ0ZpZWxkczsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgTGlzdDxTdHJpbmc+IG1pc3NpbmdGaWVsZHM7Ci0KLSAgLyoqCi0gICAqIEdldCBhIGxpc3Qgb2YgaHVtYW4tcmVhZGFibGUgbmFtZXMgb2YgcmVxdWlyZWQgZmllbGRzIG1pc3NpbmcgZnJvbSB0aGlzCi0gICAqIG1lc3NhZ2UuICBFYWNoIG5hbWUgaXMgYSBmdWxsIHBhdGggdG8gYSBmaWVsZCwgZS5nLiAiZm9vLmJhcls1XS5iYXoiLgotICAgKiBSZXR1cm5zIG51bGwgaWYgdGhlIGxpdGUgcnVudGltZSB3YXMgdXNlZCwgc2luY2UgaXQgbGFja3MgdGhlIGFiaWxpdHkgdG8KLSAgICogZmluZCBtaXNzaW5nIGZpZWxkcy4KLSAgICovCi0gIHB1YmxpYyBMaXN0PFN0cmluZz4gZ2V0TWlzc2luZ0ZpZWxkcygpIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtaXNzaW5nRmllbGRzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyB0aGlzIGV4Y2VwdGlvbiB0byBhbiB7QGxpbmsgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9ufS4KLSAgICogV2hlbiBhIHBhcnNlZCBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLCB0aGlzIHNob3VsZCBiZSB0aHJvd24KLSAgICogaW5zdGVhZCBvZiB7QGNvZGUgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb259LgotICAgKi8KLSAgcHVibGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBhc0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihnZXRNZXNzYWdlKCkpOwotICB9Ci0KLSAgLyoqIENvbnN0cnVjdCB0aGUgZGVzY3JpcHRpb24gc3RyaW5nIGZvciB0aGlzIGV4Y2VwdGlvbi4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGJ1aWxkRGVzY3JpcHRpb24oZmluYWwgTGlzdDxTdHJpbmc+IG1pc3NpbmdGaWVsZHMpIHsKLSAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIGRlc2NyaXB0aW9uID0KLSAgICAgIG5ldyBTdHJpbmdCdWlsZGVyKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiKTsKLSAgICBib29sZWFuIGZpcnN0ID0gdHJ1ZTsKLSAgICBmb3IgKGZpbmFsIFN0cmluZyBmaWVsZCA6IG1pc3NpbmdGaWVsZHMpIHsKLSAgICAgIGlmIChmaXJzdCkgewotICAgICAgICBmaXJzdCA9IGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGVzY3JpcHRpb24uYXBwZW5kKCIsICIpOwotICAgICAgfQotICAgICAgZGVzY3JpcHRpb24uYXBwZW5kKGZpZWxkKTsKLSAgICB9Ci0gICAgcmV0dXJuIGRlc2NyaXB0aW9uLnRvU3RyaW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOTA2NDIwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDM1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlci5MaW1pdGVkSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKioKLSAqIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBmaWVsZHMgd2hpY2ggd2VyZSBzZWVuIHdoZW4KLSAqIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIGJ1dCB3aG9zZSBmaWVsZCBudW1iZXJzIG9yIHR5cGVzIGFyZSB1bnJlY29nbml6ZWQuCi0gKiBUaGlzIG1vc3QgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiBuZXcgZmllbGRzIGFyZSBhZGRlZCB0byBhIG1lc3NhZ2UgdHlwZQotICogYW5kIHRoZW4gbWVzc2FnZXMgY29udGFpbmluZyB0aG9zZSBmaWVsZHMgYXJlIHJlYWQgYnkgb2xkIHNvZnR3YXJlIHRoYXQgd2FzCi0gKiBjb21waWxlZCBiZWZvcmUgdGhlIG5ldyB0eXBlcyB3ZXJlIGFkZGVkLgotICoKLSAqIDxwPkV2ZXJ5IHtAbGluayBNZXNzYWdlfSBjb250YWlucyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSAoYW5kIGV2ZXJ5Ci0gKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBjb250YWlucyBhbiB7QGxpbmsgQnVpbGRlcn0pLgotICoKLSAqIDxwPk1vc3QgdXNlcnMgd2lsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbmtub3duRmllbGRTZXQgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSB7Ci0gIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0KCkge30KLQotICAvKiogQ3JlYXRlIGEgbmV3IHtAbGluayBCdWlsZGVyfS4gKi8KLSAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7Ci0gICAgcmV0dXJuIEJ1aWxkZXIuY3JlYXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBCdWlsZGVyfSBhbmQgaW5pdGlhbGl6ZSBpdCB0byBiZSBhIGNvcHkKLSAgICogb2Yge0Bjb2RlIGNvcHlGcm9tfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKGZpbmFsIFVua25vd25GaWVsZFNldCBjb3B5RnJvbSkgewotICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGNvcHlGcm9tKTsKLSAgfQotCi0gIC8qKiBHZXQgYW4gZW1wdHkge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICovCi0gIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IGdldERlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gZGVmYXVsdEluc3RhbmNlOwotICB9Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIGRlZmF1bHRJbnN0YW5jZTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbmtub3duRmllbGRTZXQgZGVmYXVsdEluc3RhbmNlID0KLSAgICBuZXcgVW5rbm93bkZpZWxkU2V0KENvbGxlY3Rpb25zLjxJbnRlZ2VyLCBGaWVsZD5lbXB0eU1hcCgpKTsKLQotICAvKioKLSAgICogQ29uc3RydWN0IGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFyb3VuZCB0aGUgZ2l2ZW4gbWFwLiAgVGhlIG1hcCBpcwotICAgKiBleHBlY3RlZCB0byBiZSBpbW11dGFibGUuCi0gICAqLwotICBwcml2YXRlIFVua25vd25GaWVsZFNldChmaW5hbCBNYXA8SW50ZWdlciwgRmllbGQ+IGZpZWxkcykgewotICAgIHRoaXMuZmllbGRzID0gZmllbGRzOwotICB9Ci0gIHByaXZhdGUgTWFwPEludGVnZXIsIEZpZWxkPiBmaWVsZHM7Ci0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvdGhlcikgewotICAgIGlmICh0aGlzID09IG90aGVyKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIChvdGhlciBpbnN0YW5jZW9mIFVua25vd25GaWVsZFNldCkgJiYKLSAgICAgICAgICAgZmllbGRzLmVxdWFscygoKFVua25vd25GaWVsZFNldCkgb3RoZXIpLmZpZWxkcyk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gZmllbGRzLmhhc2hDb2RlKCk7Ci0gIH0KLQotICAvKiogR2V0IGEgbWFwIG9mIGZpZWxkcyBpbiB0aGUgc2V0IGJ5IG51bWJlci4gKi8KLSAgcHVibGljIE1hcDxJbnRlZ2VyLCBGaWVsZD4gYXNNYXAoKSB7Ci0gICAgcmV0dXJuIGZpZWxkczsKLSAgfQotCi0gIC8qKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIHByZXNlbnQgaW4gdGhlIHNldC4gKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgaW50IG51bWJlcikgewotICAgIHJldHVybiBmaWVsZHMuY29udGFpbnNLZXkobnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBmaWVsZCBieSBudW1iZXIuICBSZXR1cm5zIGFuIGVtcHR5IGZpZWxkIGlmIG5vdCBwcmVzZW50LiAgTmV2ZXIKLSAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0uCi0gICAqLwotICBwdWJsaWMgRmllbGQgZ2V0RmllbGQoZmluYWwgaW50IG51bWJlcikgewotICAgIGZpbmFsIEZpZWxkIHJlc3VsdCA9IGZpZWxkcy5nZXQobnVtYmVyKTsKLSAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IEZpZWxkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogcmVzdWx0OwotICB9Ci0KLSAgLyoqIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKLSAgICAgIGVudHJ5LmdldFZhbHVlKCkud3JpdGVUbyhlbnRyeS5nZXRLZXkoKSwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydHMgdGhlIHNldCB0byBhIHN0cmluZyBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQuIFRoaXMgaXMKLSAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQKLSAgICoge0BsaW5rIFRleHRGb3JtYXQjcHJpbnRUb1N0cmluZyhVbmtub3duRmllbGRTZXQpfS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nKCkgewotICAgIHJldHVybiBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcodGhpcyk7Ci0gIH0KLQotICAvKioKLSAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHtAY29kZSBCeXRlU3RyaW5nfSBhbmQgcmV0dXJucyBpdC4gVGhpcyBpcwotICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgQnl0ZVN0cmluZyB0b0J5dGVTdHJpbmcoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIEJ5dGVTdHJpbmcuQ29kZWRCdWlsZGVyIG91dCA9Ci0gICAgICAgIEJ5dGVTdHJpbmcubmV3Q29kZWRCdWlsZGVyKGdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgICAgd3JpdGVUbyhvdXQuZ2V0Q29kZWRPdXRwdXQoKSk7Ci0gICAgICByZXR1cm4gb3V0LmJ1aWxkKCk7Ci0gICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJTZXJpYWxpemluZyB0byBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKLSAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSB7QGNvZGUgYnl0ZX0gYXJyYXkgYW5kIHJldHVybnMgaXQuICBUaGlzIGlzCi0gICAqIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIHtAbGluayAjd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtnZXRTZXJpYWxpemVkU2l6ZSgpXTsKLSAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJlc3VsdCk7Ci0gICAgICB3cml0ZVRvKG91dHB1dCk7Ci0gICAgICBvdXRwdXQuY2hlY2tOb1NwYWNlTGVmdCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgIlNlcmlhbGl6aW5nIHRvIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAiICsKLSAgICAgICAgIihzaG91bGQgbmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAgVGhpcyBpcyBqdXN0IGEKLSAgICogdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KLSAgICovCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShvdXRwdXQpOwotICAgIHdyaXRlVG8oY29kZWRPdXRwdXQpOwotICAgIGNvZGVkT3V0cHV0LmZsdXNoKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgd3JpdGVEZWxpbWl0ZWRUbyhPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2Uob3V0cHV0KTsKLSAgICBjb2RlZE91dHB1dC53cml0ZVJhd1ZhcmludDMyKGdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIHdyaXRlVG8oY29kZWRPdXRwdXQpOwotICAgIGNvZGVkT3V0cHV0LmZsdXNoKCk7Ci0gIH0KLQotICAvKiogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgc2V0LiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgcmVzdWx0ICs9IGVudHJ5LmdldFZhbHVlKCkuZ2V0U2VyaWFsaXplZFNpemUoZW50cnkuZ2V0S2V5KCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9IHVzaW5nCi0gICAqIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlQXNNZXNzYWdlU2V0VG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgZW50cnkuZ2V0VmFsdWUoKS53cml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvKAotICAgICAgICBlbnRyeS5nZXRLZXkoKSwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgc2V0IHVzaW5nCi0gICAqIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKLSAgICAgIHJlc3VsdCArPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0RXh0ZW5zaW9uKAotICAgICAgICBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAvLyBVbmtub3duRmllbGRTZXRzIGRvIG5vdCBoYXZlIHJlcXVpcmVkIGZpZWxkcywgc28gdGhleSBhcmUgYWx3YXlzCi0gICAgLy8gaW5pdGlhbGl6ZWQuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiogUGFyc2UgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLiAqLwotICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBwYXJzZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkKCk7Ci0gIH0KLQotICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFuZCByZXR1cm4gaXQuICovCi0gIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBCeXRlU3RyaW5nIGRhdGEpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhKS5idWlsZCgpOwotICB9Ci0KLSAgLyoqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBhbmQgcmV0dXJuIGl0LiAqLwotICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBwYXJzZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEpCi0gICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhKS5idWlsZCgpOwotICB9Ci0KLSAgLyoqIFBhcnNlIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgcmV0dXJuIGl0LiAqLwotICBwdWJsaWMgc3RhdGljIFVua25vd25GaWVsZFNldCBwYXJzZUZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGlucHV0KS5idWlsZCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCkgewotICAgIHJldHVybiBuZXdCdWlsZGVyKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgewotICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEJ1aWxkZXIgZm9yIHtAbGluayBVbmtub3duRmllbGRTZXR9cy4KLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IHRoaXMgY2xhc3MgbWFpbnRhaW5zIHtAbGluayBGaWVsZC5CdWlsZGVyfXMgZm9yIGFsbCBmaWVsZHMKLSAgICogaW4gdGhlIHNldC4gIFRodXMsIGFkZGluZyBvbmUgZWxlbWVudCB0byBhbiBleGlzdGluZyB7QGxpbmsgRmllbGR9IGRvZXMgbm90Ci0gICAqIHJlcXVpcmUgbWFraW5nIGEgY29weS4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciBlZmZpY2llbnQgcGFyc2luZyBvZgotICAgKiB1bmtub3duIHJlcGVhdGVkIGZpZWxkcy4gIEhvd2V2ZXIsIGl0IGltcGxpZXMgdGhhdCB7QGxpbmsgRmllbGR9cyBjYW5ub3QKLSAgICogYmUgY29uc3RydWN0ZWQgaW5kZXBlbmRlbnRseSwgbm9yIGNhbiB0d28ge0BsaW5rIFVua25vd25GaWVsZFNldH1zIHNoYXJlCi0gICAqIHRoZSBzYW1lIHtAY29kZSBGaWVsZH0gb2JqZWN0LgotICAgKgotICAgKiA8cD5Vc2Uge0BsaW5rIFVua25vd25GaWVsZFNldCNuZXdCdWlsZGVyKCl9IHRvIGNvbnN0cnVjdCBhIHtAY29kZSBCdWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgewotICAgIC8vIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseSAoZXhjZXB0IGZyb20gJ2NyZWF0ZScpLgotICAgIHByaXZhdGUgQnVpbGRlcigpIHt9Ci0KLSAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBGaWVsZD4gZmllbGRzOwotCi0gICAgLy8gT3B0aW1pemF0aW9uOiAgV2Uga2VlcCBhcm91bmQgYSBidWlsZGVyIGZvciB0aGUgbGFzdCBmaWVsZCB0aGF0IHdhcwotICAgIC8vICAgbW9kaWZpZWQgc28gdGhhdCB3ZSBjYW4gZWZmaWNpZW50bHkgYWRkIHRvIGl0IG11bHRpcGxlIHRpbWVzIGluIGEKLSAgICAvLyAgIHJvdyAoaW1wb3J0YW50IHdoZW4gcGFyc2luZyBhbiB1bmtub3duIHJlcGVhdGVkIGZpZWxkKS4KLSAgICBwcml2YXRlIGludCBsYXN0RmllbGROdW1iZXI7Ci0gICAgcHJpdmF0ZSBGaWVsZC5CdWlsZGVyIGxhc3RGaWVsZDsKLQotICAgIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgY3JlYXRlKCkgewotICAgICAgQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKLSAgICAgIGJ1aWxkZXIucmVpbml0aWFsaXplKCk7Ci0gICAgICByZXR1cm4gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBmaWVsZCBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIHdoaWNoIGluY2x1ZGVzIGFueQotICAgICAqIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWVsZC5CdWlsZGVyIGdldEZpZWxkQnVpbGRlcihmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICBpZiAobGFzdEZpZWxkICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG51bWJlciA9PSBsYXN0RmllbGROdW1iZXIpIHsKLSAgICAgICAgICByZXR1cm4gbGFzdEZpZWxkOwotICAgICAgICB9Ci0gICAgICAgIC8vIE5vdGU6ICBhZGRGaWVsZCgpIHdpbGwgcmVzZXQgbGFzdEZpZWxkIGFuZCBsYXN0RmllbGROdW1iZXIuCi0gICAgICAgIGFkZEZpZWxkKGxhc3RGaWVsZE51bWJlciwgbGFzdEZpZWxkLmJ1aWxkKCkpOwotICAgICAgfQotICAgICAgaWYgKG51bWJlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmluYWwgRmllbGQgZXhpc3RpbmcgPSBmaWVsZHMuZ2V0KG51bWJlcik7Ci0gICAgICAgIGxhc3RGaWVsZE51bWJlciA9IG51bWJlcjsKLSAgICAgICAgbGFzdEZpZWxkID0gRmllbGQubmV3QnVpbGRlcigpOwotICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewotICAgICAgICAgIGxhc3RGaWVsZC5tZXJnZUZyb20oZXhpc3RpbmcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYXN0RmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgdGhlIHtAbGluayBVbmtub3duRmllbGRTZXR9IGFuZCByZXR1cm4gaXQuCi0gICAgICoKLSAgICAgKiA8cD5PbmNlIHtAY29kZSBidWlsZCgpfSBoYXMgYmVlbiBjYWxsZWQsIHRoZSB7QGNvZGUgQnVpbGRlcn0gd2lsbCBubwotICAgICAqIGxvbmdlciBiZSB1c2FibGUuICBDYWxsaW5nIGFueSBtZXRob2QgYWZ0ZXIge0Bjb2RlIGJ1aWxkKCl9IHdpbGwgcmVzdWx0Ci0gICAgICogaW4gdW5kZWZpbmVkIGJlaGF2aW9yIGFuZCBjYW4gY2F1c2UgYSB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259IHRvIGJlCi0gICAgICogdGhyb3duLgotICAgICAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgYnVpbGQoKSB7Ci0gICAgICBnZXRGaWVsZEJ1aWxkZXIoMCk7ICAvLyBGb3JjZSBsYXN0RmllbGQgdG8gYmUgYnVpbHQuCi0gICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgcmVzdWx0OwotICAgICAgaWYgKGZpZWxkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBuZXcgVW5rbm93bkZpZWxkU2V0KENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmaWVsZHMpKTsKLSAgICAgIH0KLSAgICAgIGZpZWxkcyA9IG51bGw7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgYnVpbGRQYXJ0aWFsKCkgewotICAgICAgLy8gTm8gcmVxdWlyZWQgZmllbGRzLCBzbyB0aGlzIGlzIHRoZSBzYW1lIGFzIGJ1aWxkKCkuCi0gICAgICByZXR1cm4gYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKLSAgICAgIGdldEZpZWxkQnVpbGRlcigwKTsgIC8vIEZvcmNlIGxhc3RGaWVsZCB0byBiZSBidWlsdC4KLSAgICAgIHJldHVybiBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpLm1lcmdlRnJvbSgKLSAgICAgICAgICBuZXcgVW5rbm93bkZpZWxkU2V0KGZpZWxkcykpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlaW5pdGlhbGl6ZSgpIHsKLSAgICAgIGZpZWxkcyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgICBsYXN0RmllbGROdW1iZXIgPSAwOwotICAgICAgbGFzdEZpZWxkID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogUmVzZXQgdGhlIGJ1aWxkZXIgdG8gYW4gZW1wdHkgc2V0LiAqLwotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyKCkgewotICAgICAgcmVpbml0aWFsaXplKCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0gICAgCi0gICAgLyoqIENsZWFyIGZpZWxkcyBmcm9tIHRoZSBzZXQgd2l0aCBhIGdpdmVuIGZpZWxkIG51bWJlci4gKi8KLSAgICBwdWJsaWMgQnVpbGRlciBjbGVhckZpZWxkKGZpbmFsIGludCBudW1iZXIpIHsKLSAgICAgIGlmIChudW1iZXIgPT0gMCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJaZXJvIGlzIG5vdCBhIHZhbGlkIGZpZWxkIG51bWJlci4iKTsKLSAgICAgIH0KLSAgICAgIGlmIChsYXN0RmllbGQgIT0gbnVsbCAmJiBsYXN0RmllbGROdW1iZXIgPT0gbnVtYmVyKSB7Ci0gICAgICAgIC8vIERpc2NhcmQgdGhpcy4KLSAgICAgICAgbGFzdEZpZWxkID0gbnVsbDsKLSAgICAgICAgbGFzdEZpZWxkTnVtYmVyID0gMDsKLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZHMuY29udGFpbnNLZXkobnVtYmVyKSkgewotICAgICAgICBmaWVsZHMucmVtb3ZlKG51bWJlcik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB0aGUgZmllbGRzIGZyb20ge0Bjb2RlIG90aGVyfSBpbnRvIHRoaXMgc2V0LiAgSWYgYSBmaWVsZCBudW1iZXIKLSAgICAgKiBleGlzdHMgaW4gYm90aCBzZXRzLCB7QGNvZGUgb3RoZXJ9J3MgdmFsdWVzIGZvciB0aGF0IGZpZWxkIHdpbGwgYmUKLSAgICAgKiBhcHBlbmRlZCB0byB0aGUgdmFsdWVzIGluIHRoaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBVbmtub3duRmllbGRTZXQgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciAhPSBnZXREZWZhdWx0SW5zdGFuY2UoKSkgewotICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBvdGhlci5maWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgICAgIG1lcmdlRmllbGQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGUge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICBJZiBhIGZpZWxkIHdpdGggdGhlIHNhbWUKLSAgICAgKiBudW1iZXIgYWxyZWFkeSBleGlzdHMsIHRoZSB0d28gYXJlIG1lcmdlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZpZWxkKGZpbmFsIGludCBudW1iZXIsIGZpbmFsIEZpZWxkIGZpZWxkKSB7Ci0gICAgICBpZiAobnVtYmVyID09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzRmllbGQobnVtYmVyKSkgewotICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5tZXJnZUZyb20oZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UgY291bGQgY2FsbCBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5tZXJnZUZyb20oZmllbGQpCi0gICAgICAgIC8vIGluIHRoaXMgY2FzZSwgYnV0IHRoYXQgd291bGQgY3JlYXRlIGEgY29weSBvZiB0aGUgRmllbGQgb2JqZWN0LgotICAgICAgICAvLyBXZSdkIHJhdGhlciByZXVzZSB0aGUgb25lIHBhc3NlZCB0byB1cywgc28gY2FsbCBhZGRGaWVsZCgpIGluc3RlYWQuCi0gICAgICAgIGFkZEZpZWxkKG51bWJlciwgZmllbGQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBtZXJnaW5nIGEgbmV3IGZpZWxkIGNvbnRhaW5pbmcgYSBzaW5nbGUgdmFyaW50Ci0gICAgICogdmFsdWUuICBUaGlzIGlzIHVzZWQgaW4gcGFydGljdWxhciB3aGVuIGFuIHVua25vd24gZW51bSB2YWx1ZSBpcwotICAgICAqIGVuY291bnRlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlVmFyaW50RmllbGQoZmluYWwgaW50IG51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgICBpZiAobnVtYmVyID09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7Ci0gICAgICB9Ci0gICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRWYXJpbnQodmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0KLSAgICAvKioKLSAgICAgKiBDb252ZW5pZW5jZSBtZXRob2QgZm9yIG1lcmdpbmcgYSBsZW5ndGgtZGVsaW1pdGVkIGZpZWxkLgotICAgICAqCi0gICAgICogPHA+Rm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlTGVuZ3RoRGVsaW1pdGVkRmllbGQoCi0gICAgICAgIGZpbmFsIGludCBudW1iZXIsIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHsgIAotICAgICAgaWYgKG51bWJlciA9PSAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOwotICAgICAgfQotICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkTGVuZ3RoRGVsaW1pdGVkKHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIHByZXNlbnQgaW4gdGhlIHNldC4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICBpZiAobnVtYmVyID09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbnVtYmVyID09IGxhc3RGaWVsZE51bWJlciB8fCBmaWVsZHMuY29udGFpbnNLZXkobnVtYmVyKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGUge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICBJZiBhIGZpZWxkIHdpdGggdGhlIHNhbWUKLSAgICAgKiBudW1iZXIgYWxyZWFkeSBleGlzdHMsIGl0IGlzIHJlbW92ZWQuCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkZXIgYWRkRmllbGQoZmluYWwgaW50IG51bWJlciwgZmluYWwgRmllbGQgZmllbGQpIHsKLSAgICAgIGlmIChudW1iZXIgPT0gMCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJaZXJvIGlzIG5vdCBhIHZhbGlkIGZpZWxkIG51bWJlci4iKTsKLSAgICAgIH0KLSAgICAgIGlmIChsYXN0RmllbGQgIT0gbnVsbCAmJiBsYXN0RmllbGROdW1iZXIgPT0gbnVtYmVyKSB7Ci0gICAgICAgIC8vIERpc2NhcmQgdGhpcy4KLSAgICAgICAgbGFzdEZpZWxkID0gbnVsbDsKLSAgICAgICAgbGFzdEZpZWxkTnVtYmVyID0gMDsKLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZHMuaXNFbXB0eSgpKSB7Ci0gICAgICAgIGZpZWxkcyA9IG5ldyBUcmVlTWFwPEludGVnZXIsRmllbGQ+KCk7Ci0gICAgICB9Ci0gICAgICBmaWVsZHMucHV0KG51bWJlciwgZmllbGQpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IGFsbCBwcmVzZW50IHtAY29kZSBGaWVsZH1zIGFzIGFuIGltbXV0YWJsZSB7QGNvZGUgTWFwfS4gIElmIG1vcmUKLSAgICAgKiBmaWVsZHMgYXJlIGFkZGVkLCB0aGUgY2hhbmdlcyBtYXkgb3IgbWF5IG5vdCBiZSByZWZsZWN0ZWQgaW4gdGhpcyBtYXAuCi0gICAgICovCi0gICAgcHVibGljIE1hcDxJbnRlZ2VyLCBGaWVsZD4gYXNNYXAoKSB7Ci0gICAgICBnZXRGaWVsZEJ1aWxkZXIoMCk7ICAvLyBGb3JjZSBsYXN0RmllbGQgdG8gYmUgYnVpbHQuCi0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKGZpZWxkcyk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYW4gZW50aXJlIG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdHMgZmllbGRzIGludG8KLSAgICAgKiB0aGlzIHNldC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGZpbmFsIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fCAhbWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCkpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYSBzaW5nbGUgZmllbGQgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdCBpbnRvIHRoaXMgc2V0LgotICAgICAqIEBwYXJhbSB0YWcgVGhlIGZpZWxkJ3MgdGFnIG51bWJlciwgd2hpY2ggd2FzIGFscmVhZHkgcGFyc2VkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIGZhbHNlfSBpZiB0aGUgdGFnIGlzIGFuIGVuZCBncm91cCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VGaWVsZEZyb20oZmluYWwgaW50IHRhZywgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IG51bWJlciA9IFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKTsKLSAgICAgIHN3aXRjaCAoV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpKSB7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6Ci0gICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkVmFyaW50KGlucHV0LnJlYWRJbnQ2NCgpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQ6Ci0gICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkRml4ZWQ2NChpbnB1dC5yZWFkRml4ZWQ2NCgpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkTGVuZ3RoRGVsaW1pdGVkKGlucHV0LnJlYWRCeXRlcygpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQOgotICAgICAgICAgIGZpbmFsIEJ1aWxkZXIgc3ViQnVpbGRlciA9IG5ld0J1aWxkZXIoKTsKLSAgICAgICAgICBpbnB1dC5yZWFkR3JvdXAobnVtYmVyLCBzdWJCdWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOwotICAgICAgICAgIGdldEZpZWxkQnVpbGRlcihudW1iZXIpLmFkZEdyb3VwKHN1YkJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQzMjoKLSAgICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRGaXhlZDMyKGlucHV0LnJlYWRGaXhlZDMyKCkpOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkV2lyZVR5cGUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gYW5kIG1lcmdlIGl0IHdpdGggdGhlCi0gICAgICogc2V0IGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGZpbmFsIEJ5dGVTdHJpbmcgZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7Ci0gICAgICAgIG1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9IGNhdGNoIChmaW5hbCBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgQnl0ZVN0cmluZyB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKwotICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBzZXQgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7Ci0gICAgICAgIG1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9IGNhdGNoIChmaW5hbCBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKwotICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBzZXQgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGNvZGVkSW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGlucHV0KTsKLSAgICAgIG1lcmdlRnJvbShjb2RlZElucHV0KTsKLSAgICAgIGNvZGVkSW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKLSAgICAgIGlmIChmaXJzdEJ5dGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZmluYWwgaW50IHNpemUgPSBDb2RlZElucHV0U3RyZWFtLnJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKLSAgICAgIGZpbmFsIElucHV0U3RyZWFtIGxpbWl0ZWRJbnB1dCA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOwotICAgICAgbWVyZ2VGcm9tKGxpbWl0ZWRJbnB1dCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KLSAgICAgIHJldHVybiBtZXJnZURlbGltaXRlZEZyb20oaW5wdXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0LCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCi0gICAgICByZXR1cm4gbWVyZ2VGcm9tKGlucHV0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgotICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9Ci0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEsIG9mZiwgbGVuKTsKLSAgICAgICAgbWVyZ2VGcm9tKGlucHV0KTsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCi0gICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgotICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCi0gICAgICByZXR1cm4gbWVyZ2VGcm9tKGRhdGEsIG9mZiwgbGVuKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KLSAgICAgIHJldHVybiBtZXJnZUZyb20oaW5wdXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShNZXNzYWdlTGl0ZSBtKSB7Ci0gICAgICBpZiAobSBpbnN0YW5jZW9mIFVua25vd25GaWVsZFNldCkgewotICAgICAgICByZXR1cm4gbWVyZ2VGcm9tKChVbmtub3duRmllbGRTZXQpIG0pOwotICAgICAgfQotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAibWVyZ2VGcm9tKE1lc3NhZ2VMaXRlKSBjYW4gb25seSBtZXJnZSBtZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlLiIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICAvLyBVbmtub3duRmllbGRTZXRzIGRvIG5vdCBoYXZlIHJlcXVpcmVkIGZpZWxkcywgc28gdGhleSBhcmUgYWx3YXlzCi0gICAgICAvLyBpbml0aWFsaXplZC4KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXByZXNlbnRzIGEgc2luZ2xlIGZpZWxkIGluIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9LgotICAgKgotICAgKiA8cD5BIHtAY29kZSBGaWVsZH0gY29uc2lzdHMgb2YgZml2ZSBsaXN0cyBvZiB2YWx1ZXMuICBUaGUgbGlzdHMgY29ycmVzcG9uZAotICAgKiB0byB0aGUgZml2ZSAid2lyZSB0eXBlcyIgdXNlZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyIGJpbmFyeSBmb3JtYXQuCi0gICAqIFRoZSB3aXJlIHR5cGUgb2YgZWFjaCBmaWVsZCBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlbmNvZGVkIGZvcm0gYWxvbmUsCi0gICAqIHdpdGhvdXQga25vd2luZyB0aGUgZmllbGQncyBkZWNsYXJlZCB0eXBlLiAgU28sIHdlIGFyZSBhYmxlIHRvIHBhcnNlCi0gICAqIHVua25vd24gdmFsdWVzIGF0IGxlYXN0IHRoaXMgZmFyIGFuZCBzZXBhcmF0ZSB0aGVtLiAgTm9ybWFsbHksIG9ubHkgb25lCi0gICAqIG9mIHRoZSBmaXZlIGxpc3RzIHdpbGwgY29udGFpbiBhbnkgdmFsdWVzLCBzaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvCi0gICAqIGRlZmluZSBhIHZhbGlkIG1lc3NhZ2UgdHlwZSB0aGF0IGRlY2xhcmVzIHR3byBkaWZmZXJlbnQgdHlwZXMgZm9yIHRoZQotICAgKiBzYW1lIGZpZWxkIG51bWJlci4gIEhvd2V2ZXIsIHRoZSBjb2RlIGlzIGRlc2lnbmVkIHRvIGFsbG93IGZvciB0aGUgY2FzZQotICAgKiB3aGVyZSB0aGUgc2FtZSB1bmtub3duIGZpZWxkIG51bWJlciBpcyBlbmNvdW50ZXJlZCB1c2luZyBtdWx0aXBsZSBkaWZmZXJlbnQKLSAgICogd2lyZSB0eXBlcy4KLSAgICoKLSAgICogPHA+e0Bjb2RlIEZpZWxkfSBpcyBhbiBpbW11dGFibGUgY2xhc3MuICBUbyBjb25zdHJ1Y3Qgb25lLCB5b3UgbXVzdCB1c2UgYQotICAgKiB7QGxpbmsgQnVpbGRlcn0uCi0gICAqCi0gICAqIEBzZWUgVW5rbm93bkZpZWxkU2V0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpZWxkIHsKLSAgICBwcml2YXRlIEZpZWxkKCkge30KLQotICAgIC8qKiBDb25zdHJ1Y3QgYSBuZXcge0BsaW5rIEJ1aWxkZXJ9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKCkgewotICAgICAgcmV0dXJuIEJ1aWxkZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IHtAbGluayBCdWlsZGVyfSBhbmQgaW5pdGlhbGl6ZSBpdCB0byBhIGNvcHkgb2YKLSAgICAgKiB7QGNvZGUgY29weUZyb219LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKGZpbmFsIEZpZWxkIGNvcHlGcm9tKSB7Ci0gICAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShjb3B5RnJvbSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCBhbiBlbXB0eSB7QGNvZGUgRmllbGR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmllbGQgZ2V0RGVmYXVsdEluc3RhbmNlKCkgewotICAgICAgcmV0dXJuIGZpZWxkRGVmYXVsdEluc3RhbmNlOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZCBmaWVsZERlZmF1bHRJbnN0YW5jZSA9IG5ld0J1aWxkZXIoKS5idWlsZCgpOwotCi0gICAgLyoqIEdldCB0aGUgbGlzdCBvZiB2YXJpbnQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLwotICAgIHB1YmxpYyBMaXN0PExvbmc+IGdldFZhcmludExpc3QoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHZhcmludDsgICAgICAgICAgfQotCi0gICAgLyoqIEdldCB0aGUgbGlzdCBvZiBmaXhlZDMyIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KLSAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRGaXhlZDMyTGlzdCgpICAgICAgICAgICB7IHJldHVybiBmaXhlZDMyOyAgICAgICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2YgZml4ZWQ2NCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCi0gICAgcHVibGljIExpc3Q8TG9uZz4gZ2V0Rml4ZWQ2NExpc3QoKSAgICAgICAgICAgICAgeyByZXR1cm4gZml4ZWQ2NDsgICAgICAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBsaXN0IG9mIGxlbmd0aC1kZWxpbWl0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLwotICAgIHB1YmxpYyBMaXN0PEJ5dGVTdHJpbmc+IGdldExlbmd0aERlbGltaXRlZExpc3QoKSB7IHJldHVybiBsZW5ndGhEZWxpbWl0ZWQ7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBlbWJlZGRlZCBncm91cCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICBUaGVzZSBhcmUKLSAgICAgKiByZXByZXNlbnRlZCB1c2luZyB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fXMgcmF0aGVyIHRoYW4ge0BsaW5rIE1lc3NhZ2V9cwotICAgICAqIHNpbmNlIHRoZSBncm91cCdzIHR5cGUgaXMgcHJlc3VtYWJseSB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFVua25vd25GaWVsZFNldD4gZ2V0R3JvdXBMaXN0KCkgICAgICB7IHJldHVybiBncm91cDsgICAgICAgICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGlmICh0aGlzID09IG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBGaWVsZCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoZ2V0SWRlbnRpdHlBcnJheSgpLAotICAgICAgICAgICgoRmllbGQpIG90aGVyKS5nZXRJZGVudGl0eUFycmF5KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKGdldElkZW50aXR5QXJyYXkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLSAgICAgKiB7QGxpbmsgRmllbGR9IGluc3RhbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gZ2V0SWRlbnRpdHlBcnJheSgpIHsKLSAgICAgIHJldHVybiBuZXcgT2JqZWN0W10gewotICAgICAgICAgIHZhcmludCwKLSAgICAgICAgICBmaXhlZDMyLAotICAgICAgICAgIGZpeGVkNjQsCi0gICAgICAgICAgbGVuZ3RoRGVsaW1pdGVkLAotICAgICAgICAgIGdyb3VwfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXJpYWxpemVzIHRoZSBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkIG51bWJlciwgYW5kIHdyaXRlcyBpdCB0bwotICAgICAqIHtAY29kZSBvdXRwdXR9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBsb25nIHZhbHVlIDogdmFyaW50KSB7Ci0gICAgICAgIG91dHB1dC53cml0ZVVJbnQ2NChmaWVsZE51bWJlciwgdmFsdWUpOwotICAgICAgfQotICAgICAgZm9yIChmaW5hbCBpbnQgdmFsdWUgOiBmaXhlZDMyKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUZpeGVkMzIoZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGZvciAoZmluYWwgbG9uZyB2YWx1ZSA6IGZpeGVkNjQpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQ2NChmaWVsZE51bWJlciwgdmFsdWUpOwotICAgICAgfQotICAgICAgZm9yIChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlIDogbGVuZ3RoRGVsaW1pdGVkKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUJ5dGVzKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGZpbmFsIFVua25vd25GaWVsZFNldCB2YWx1ZSA6IGdyb3VwKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUdyb3VwKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgZmllbGQsIGluY2x1ZGluZyBmaWVsZAotICAgICAqIG51bWJlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlcikgewotICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICBmb3IgKGZpbmFsIGxvbmcgdmFsdWUgOiB2YXJpbnQpIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVVSW50NjRTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGZpbmFsIGludCB2YWx1ZSA6IGZpeGVkMzIpIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVGaXhlZDMyU2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOwotICAgICAgfQotICAgICAgZm9yIChmaW5hbCBsb25nIHZhbHVlIDogZml4ZWQ2NCkgewotICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZpeGVkNjRTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUgOiBsZW5ndGhEZWxpbWl0ZWQpIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVCeXRlc1NpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGZvciAoZmluYWwgVW5rbm93bkZpZWxkU2V0IHZhbHVlIDogZ3JvdXApIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVHcm91cFNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyB0aGUgZmllbGQsIGluY2x1ZGluZyBmaWVsZCBudW1iZXIsIGFuZCB3cml0ZXMgaXQgdG8KLSAgICAgKiB7QGNvZGUgb3V0cHV0fSwgdXNpbmcge0Bjb2RlIE1lc3NhZ2VTZXR9IHdpcmUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXNNZXNzYWdlU2V0RXh0ZW5zaW9uVG8oCi0gICAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlIDogbGVuZ3RoRGVsaW1pdGVkKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkCi0gICAgICogbnVtYmVyLCB1c2luZyB7QGNvZGUgTWVzc2FnZVNldH0gd2lyZSBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldEV4dGVuc2lvbihmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKLSAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgZm9yIChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlIDogbGVuZ3RoRGVsaW1pdGVkKSB7Ci0gICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUmF3TWVzc2FnZVNldEV4dGVuc2lvblNpemUoCi0gICAgICAgICAgZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PExvbmc+IHZhcmludDsKLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gZml4ZWQzMjsKLSAgICBwcml2YXRlIExpc3Q8TG9uZz4gZml4ZWQ2NDsKLSAgICBwcml2YXRlIExpc3Q8Qnl0ZVN0cmluZz4gbGVuZ3RoRGVsaW1pdGVkOwotICAgIHByaXZhdGUgTGlzdDxVbmtub3duRmllbGRTZXQ+IGdyb3VwOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBidWlsZCBhIHtAbGluayBGaWVsZH0gd2l0aGluIGFuIHtAbGluayBVbmtub3duRmllbGRTZXR9LgotICAgICAqCi0gICAgICogPHA+VXNlIHtAbGluayBGaWVsZCNuZXdCdWlsZGVyKCl9IHRvIGNvbnN0cnVjdCBhIHtAY29kZSBCdWlsZGVyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5IChleGNlcHQgZnJvbSAnY3JlYXRlJykuCi0gICAgICBwcml2YXRlIEJ1aWxkZXIoKSB7fQotCi0gICAgICBwcml2YXRlIHN0YXRpYyBCdWlsZGVyIGNyZWF0ZSgpIHsKLSAgICAgICAgQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5yZXN1bHQgPSBuZXcgRmllbGQoKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgRmllbGQgcmVzdWx0OwotCi0gICAgICAvKioKLSAgICAgICAqIEJ1aWxkIHRoZSBmaWVsZC4gIEFmdGVyIHtAY29kZSBidWlsZCgpfSBoYXMgYmVlbiBjYWxsZWQsIHRoZQotICAgICAgICoge0Bjb2RlIEJ1aWxkZXJ9IGlzIG5vIGxvbmdlciB1c2FibGUuICBDYWxsaW5nIGFueSBvdGhlciBtZXRob2Qgd2lsbAotICAgICAgICogcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvciBhbmQgY2FuIGNhdXNlIGEKLSAgICAgICAqIHtAY29kZSBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gdG8gYmUgdGhyb3duLgotICAgICAgICovCi0gICAgICBwdWJsaWMgRmllbGQgYnVpbGQoKSB7Ci0gICAgICAgIGlmIChyZXN1bHQudmFyaW50ID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQudmFyaW50ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LnZhcmludCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0LnZhcmludCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5maXhlZDMyID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQuZml4ZWQzMiA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdC5maXhlZDMyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQuZml4ZWQzMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5maXhlZDY0ID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQuZml4ZWQ2NCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdC5maXhlZDY0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQuZml4ZWQ2NCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPT0gbnVsbCkgewotICAgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0Lmxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5ncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0Lmdyb3VwID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0Lmdyb3VwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQuZ3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRmllbGQgcmV0dXJuTWUgPSByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIHJldHVybiByZXR1cm5NZTsKLSAgICAgIH0KLQotICAgICAgLyoqIERpc2NhcmQgdGhlIGZpZWxkJ3MgY29udGVudHMuICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBjbGVhcigpIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IEZpZWxkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIE1lcmdlIHRoZSB2YWx1ZXMgaW4ge0Bjb2RlIG90aGVyfSBpbnRvIHRoaXMgZmllbGQuICBGb3IgZWFjaCBsaXN0Ci0gICAgICAgKiBvZiB2YWx1ZXMsIHtAY29kZSBvdGhlcn0ncyB2YWx1ZXMgYXJlIGFwcGVuZCB0byB0aGUgb25lcyBpbiB0aGlzCi0gICAgICAgKiBmaWVsZC4KLSAgICAgICAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGZpbmFsIEZpZWxkIG90aGVyKSB7Ci0gICAgICAgIGlmICghb3RoZXIudmFyaW50LmlzRW1wdHkoKSkgewotICAgICAgICAgIGlmIChyZXN1bHQudmFyaW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC52YXJpbnQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdC52YXJpbnQuYWRkQWxsKG90aGVyLnZhcmludCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFvdGhlci5maXhlZDMyLmlzRW1wdHkoKSkgewotICAgICAgICAgIGlmIChyZXN1bHQuZml4ZWQzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuZml4ZWQzMiA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0LmZpeGVkMzIuYWRkQWxsKG90aGVyLmZpeGVkMzIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghb3RoZXIuZml4ZWQ2NC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBpZiAocmVzdWx0LmZpeGVkNjQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LmZpeGVkNjQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdC5maXhlZDY0LmFkZEFsbChvdGhlci5maXhlZDY0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW90aGVyLmxlbmd0aERlbGltaXRlZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkID0gbmV3IEFycmF5TGlzdDxCeXRlU3RyaW5nPigpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkLmFkZEFsbChvdGhlci5sZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghb3RoZXIuZ3JvdXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgaWYgKHJlc3VsdC5ncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuZ3JvdXAgPSBuZXcgQXJyYXlMaXN0PFVua25vd25GaWVsZFNldD4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0Lmdyb3VwLmFkZEFsbChvdGhlci5ncm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKiBBZGQgYSB2YXJpbnQgdmFsdWUuICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBhZGRWYXJpbnQoZmluYWwgbG9uZyB2YWx1ZSkgewotICAgICAgICBpZiAocmVzdWx0LnZhcmludCA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0LnZhcmludCA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQudmFyaW50LmFkZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICAvKiogQWRkIGEgZml4ZWQzMiB2YWx1ZS4gKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEZpeGVkMzIoZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgICAgIGlmIChyZXN1bHQuZml4ZWQzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0LmZpeGVkMzIgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmZpeGVkMzIuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKiBBZGQgYSBmaXhlZDY0IHZhbHVlLiAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRml4ZWQ2NChmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChyZXN1bHQuZml4ZWQ2NCA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0LmZpeGVkNjQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmZpeGVkNjQuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKiBBZGQgYSBsZW5ndGgtZGVsaW1pdGVkIHZhbHVlLiAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgYWRkTGVuZ3RoRGVsaW1pdGVkKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPT0gbnVsbCkgewotICAgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0Lmxlbmd0aERlbGltaXRlZC5hZGQodmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLQotICAgICAgLyoqIEFkZCBhbiBlbWJlZGRlZCBncm91cC4gKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwKGZpbmFsIFVua25vd25GaWVsZFNldCB2YWx1ZSkgewotICAgICAgICBpZiAocmVzdWx0Lmdyb3VwID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQuZ3JvdXAgPSBuZXcgQXJyYXlMaXN0PFVua25vd25GaWVsZFNldD4oKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuZ3JvdXAuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlciB0byBpbXBsZW1lbnQgTWVzc2FnZUxpdGUgaW50ZXJmYWNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBQYXJzZXIgZXh0ZW5kcyBBYnN0cmFjdFBhcnNlcjxVbmtub3duRmllbGRTZXQ+IHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlUGFydGlhbEZyb20oCi0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICBCdWlsZGVyIGJ1aWxkZXIgPSBuZXdCdWlsZGVyKCk7Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLm1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKGUuZ2V0TWVzc2FnZSgpKQotICAgICAgICAgICAgLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgfQotICAgICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGFyc2VyIFBBUlNFUiA9IG5ldyBQYXJzZXIoKTsKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBmaW5hbCBQYXJzZXIgZ2V0UGFyc2VyRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gUEFSU0VSOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldExpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0TGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTAwZjkwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkZpZWxkU2V0TGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci0KLS8qKgotICoge0Bjb2RlIFVua25vd25GaWVsZFNldExpdGV9IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBmaWVsZHMgd2hpY2ggd2VyZSBzZWVuCi0gKiB3aGVuIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIGJ1dCB3aG9zZSBmaWVsZCBudW1iZXJzIG9yIHR5cGVzIGFyZQotICogdW5yZWNvZ25pemVkLiBUaGlzIG1vc3QgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiBuZXcgZmllbGRzIGFyZSBhZGRlZCB0byBhCi0gKiBtZXNzYWdlIHR5cGUgYW5kIHRoZW4gbWVzc2FnZXMgY29udGFpbmluZyB0aG9zZSBmaWVsZHMgYXJlIHJlYWQgYnkgb2xkCi0gKiBzb2Z0d2FyZSB0aGF0IHdhcyBjb21waWxlZCBiZWZvcmUgdGhlIG5ldyB0eXBlcyB3ZXJlIGFkZGVkLgotICoKLSAqIDxwPkZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAqCi0gKiBAYXV0aG9yIGR3ZWlzQGdvb2dsZS5jb20gKERhbmllbCBXZWlzKQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVW5rbm93bkZpZWxkU2V0TGl0ZSB7Ci0gIAotICAvLyBBcmJpdHJhcmlseSBjaG9zZW4uCi0gIC8vIFRPRE8oZHdlaXMpOiBUdW5lIHRoaXMgbnVtYmVyPwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUlOX0NBUEFDSVRZID0gODsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBVbmtub3duRmllbGRTZXRMaXRlIERFRkFVTFRfSU5TVEFOQ0UgPQotICAgICAgbmV3IFVua25vd25GaWVsZFNldExpdGUoMCwgbmV3IGludFswXSwgbmV3IE9iamVjdFswXSwgZmFsc2UgLyogaXNNdXRhYmxlICovKTsKLQotICAvKioKLSAgICogR2V0IGFuIGVtcHR5IHtAY29kZSBVbmtub3duRmllbGRTZXRMaXRlfS4KLSAgICoKLSAgICogPHA+Rm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBVbmtub3duRmllbGRTZXRMaXRlIGdldERlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFJldHVybnMgYSBuZXcgbXV0YWJsZSBpbnN0YW5jZS4KLSAgICovCi0gIHN0YXRpYyBVbmtub3duRmllbGRTZXRMaXRlIG5ld0luc3RhbmNlKCkgewotICAgIHJldHVybiBuZXcgVW5rbm93bkZpZWxkU2V0TGl0ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgYSBtdXRhYmxlIHtAY29kZSBVbmtub3duRmllbGRTZXRMaXRlfSB0aGF0IGlzIHRoZSBjb21wb3NpdGUgb2Yge0Bjb2RlIGZpcnN0fSBhbmQKLSAgICoge0Bjb2RlIHNlY29uZH0uCi0gICAqLwotICBzdGF0aWMgVW5rbm93bkZpZWxkU2V0TGl0ZSBtdXRhYmxlQ29weU9mKFVua25vd25GaWVsZFNldExpdGUgZmlyc3QsIFVua25vd25GaWVsZFNldExpdGUgc2Vjb25kKSB7Ci0gICAgaW50IGNvdW50ID0gZmlyc3QuY291bnQgKyBzZWNvbmQuY291bnQ7Ci0gICAgaW50W10gdGFncyA9IEFycmF5cy5jb3B5T2YoZmlyc3QudGFncywgY291bnQpOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc2Vjb25kLnRhZ3MsIDAsIHRhZ3MsIGZpcnN0LmNvdW50LCBzZWNvbmQuY291bnQpOwotICAgIE9iamVjdFtdIG9iamVjdHMgPSBBcnJheXMuY29weU9mKGZpcnN0Lm9iamVjdHMsIGNvdW50KTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHNlY29uZC5vYmplY3RzLCAwLCBvYmplY3RzLCBmaXJzdC5jb3VudCwgc2Vjb25kLmNvdW50KTsKLSAgICByZXR1cm4gbmV3IFVua25vd25GaWVsZFNldExpdGUoY291bnQsIHRhZ3MsIG9iamVjdHMsIHRydWUgLyogaXNNdXRhYmxlICovKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHNldC4KLSAgICovCi0gIHByaXZhdGUgaW50IGNvdW50OwotICAKLSAgLyoqCi0gICAqIFRoZSB0YWcgbnVtYmVycyBmb3IgdGhlIGVsZW1lbnRzIGluIHRoZSBzZXQuCi0gICAqLwotICBwcml2YXRlIGludFtdIHRhZ3M7Ci0gIAotICAvKioKLSAgICogVGhlIGJveGVkIHZhbHVlcyBvZiB0aGUgZWxlbWVudHMgaW4gdGhlIHNldC4KLSAgICovCi0gIHByaXZhdGUgT2JqZWN0W10gb2JqZWN0czsKLSAgCi0gIC8qKgotICAgKiBUaGUgbGF6aWx5IGNvbXB1dGVkIHNlcmlhbGl6ZWQgc2l6ZSBvZiB0aGUgc2V0LgotICAgKi8KLSAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xOwotICAKLSAgLyoqCi0gICAqIEluZGljYXRlcyB0aGF0IHRoaXMgb2JqZWN0IGlzIG11dGFibGUuIAotICAgKi8KLSAgcHJpdmF0ZSBib29sZWFuIGlzTXV0YWJsZTsKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG11dGFibGUge0Bjb2RlIFVua25vd25GaWVsZFNldExpdGV9LgotICAgKi8KLSAgcHJpdmF0ZSBVbmtub3duRmllbGRTZXRMaXRlKCkgewotICAgIHRoaXMoMCwgbmV3IGludFtNSU5fQ0FQQUNJVFldLCBuZXcgT2JqZWN0W01JTl9DQVBBQ0lUWV0sIHRydWUgLyogaXNNdXRhYmxlICovKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgdGhlIHtAY29kZSBVbmtub3duRmllbGRTZXRMaXRlfS4KLSAgICovCi0gIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0TGl0ZShpbnQgY291bnQsIGludFtdIHRhZ3MsIE9iamVjdFtdIG9iamVjdHMsIGJvb2xlYW4gaXNNdXRhYmxlKSB7Ci0gICAgdGhpcy5jb3VudCA9IGNvdW50OwotICAgIHRoaXMudGFncyA9IHRhZ3M7Ci0gICAgdGhpcy5vYmplY3RzID0gb2JqZWN0czsKLSAgICB0aGlzLmlzTXV0YWJsZSA9IGlzTXV0YWJsZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIE1hcmtzIHRoaXMgb2JqZWN0IGFzIGltbXV0YWJsZS4KLSAgICogCi0gICAqIDxwPkZ1dHVyZSBjYWxscyB0byBtZXRob2RzIHRoYXQgYXR0ZW1wdCB0byBtb2RpZnkgdGhpcyBvYmplY3Qgd2lsbCB0aHJvdy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIG1ha2VJbW11dGFibGUoKSB7Ci0gICAgdGhpcy5pc011dGFibGUgPSBmYWxzZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRocm93cyBhbiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259IGlmIGltbXV0YWJsZS4KLSAgICovCi0gIHZvaWQgY2hlY2tNdXRhYmxlKCkgewotICAgIGlmICghaXNNdXRhYmxlKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsgCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LgotICAgKgotICAgKiA8cD5Gb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgIGludCB0YWcgPSB0YWdzW2ldOwotICAgICAgaW50IGZpZWxkTnVtYmVyID0gV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpOwotICAgICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVDoKLSAgICAgICAgICBvdXRwdXQud3JpdGVVSW50NjQoZmllbGROdW1iZXIsIChMb25nKSBvYmplY3RzW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzI6Ci0gICAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQzMihmaWVsZE51bWJlciwgKEludGVnZXIpIG9iamVjdHNbaV0pOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NDoKLSAgICAgICAgICBvdXRwdXQud3JpdGVGaXhlZDY0KGZpZWxkTnVtYmVyLCAoTG9uZykgb2JqZWN0c1tpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEOgotICAgICAgICAgIG91dHB1dC53cml0ZUJ5dGVzKGZpZWxkTnVtYmVyLCAoQnl0ZVN0cmluZykgb2JqZWN0c1tpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUDoKLSAgICAgICAgICBvdXRwdXQud3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICAgICAgICAgICgoVW5rbm93bkZpZWxkU2V0TGl0ZSkgb2JqZWN0c1tpXSkud3JpdGVUbyhvdXRwdXQpOwotICAgICAgICAgIG91dHB1dC53cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkV2lyZVR5cGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgc2V0LgotICAgKgotICAgKiA8cD5Gb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTsKLSAgICBpZiAoc2l6ZSAhPSAtMSkgewotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotICAgIAotICAgIHNpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgaW50IHRhZyA9IHRhZ3NbaV07Ci0gICAgICBpbnQgZmllbGROdW1iZXIgPSBXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7Ci0gICAgICBzd2l0Y2ggKFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKSkgewotICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UOgotICAgICAgICAgIHNpemUgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQ2NFNpemUoZmllbGROdW1iZXIsIChMb25nKSBvYmplY3RzW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzI6Ci0gICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQzMlNpemUoZmllbGROdW1iZXIsIChJbnRlZ2VyKSBvYmplY3RzW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQ6Ci0gICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlRml4ZWQ2NFNpemUoZmllbGROdW1iZXIsIChMb25nKSBvYmplY3RzW2ldKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICAgICAgc2l6ZSArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlQnl0ZXNTaXplKGZpZWxkTnVtYmVyLCAoQnl0ZVN0cmluZykgb2JqZWN0c1tpXSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUDoKLSAgICAgICAgICBzaXplICs9ICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKiAyCi0gICAgICAgICAgICAgICsgKChVbmtub3duRmllbGRTZXRMaXRlKSBvYmplY3RzW2ldKS5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRXaXJlVHlwZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7Ci0gICAgCi0gICAgcmV0dXJuIHNpemU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvYmopIHsKLSAgICBpZiAodGhpcyA9PSBvYmopIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChvYmogPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghKG9iaiBpbnN0YW5jZW9mIFVua25vd25GaWVsZFNldExpdGUpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIAotICAgIFVua25vd25GaWVsZFNldExpdGUgb3RoZXIgPSAoVW5rbm93bkZpZWxkU2V0TGl0ZSkgb2JqOyAgICAKLSAgICBpZiAoY291bnQgIT0gb3RoZXIuY291bnQKLSAgICAgICAgLy8gVE9ETyhkd2Vpcyk6IE9ubHkgaGF2ZSB0byBjb21wYXJlIHVwIHRvIGNvdW50IGJ1dCBhdCB3b3JzdCAyeCB3b3JzZSB0aGFuIHdlIG5lZWQgdG8gZG8uCi0gICAgICAgIHx8ICFBcnJheXMuZXF1YWxzKHRhZ3MsIG90aGVyLnRhZ3MpCi0gICAgICAgIHx8ICFBcnJheXMuZGVlcEVxdWFscyhvYmplY3RzLCBvdGhlci5vYmplY3RzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IGhhc2hDb2RlID0gMTc7Ci0gICAgCi0gICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgY291bnQ7Ci0gICAgaGFzaENvZGUgPSAzMSAqIGhhc2hDb2RlICsgQXJyYXlzLmhhc2hDb2RlKHRhZ3MpOwotICAgIGhhc2hDb2RlID0gMzEgKiBoYXNoQ29kZSArIEFycmF5cy5kZWVwSGFzaENvZGUob2JqZWN0cyk7Ci0gICAgCi0gICAgcmV0dXJuIGhhc2hDb2RlOwotICB9Ci0KLSAgLyoqCi0gICAqIFByaW50cyBhIFN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGUgdW5rbm93biBmaWVsZCBzZXQuCi0gICAqCi0gICAqIDxwPkZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIHdyaXRlIHRvCi0gICAqIEBwYXJhbSBpbmRlbnQgdGhlIG51bWJlciBvZiBzcGFjZXMgdGhlIGZpZWxkcyBzaG91bGQgYmUgaW5kZW50ZWQgYnkKLSAgICovCi0gIGZpbmFsIHZvaWQgcHJpbnRXaXRoSW5kZW50KFN0cmluZ0J1aWxkZXIgYnVmZmVyLCBpbnQgaW5kZW50KSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICBpbnQgZmllbGROdW1iZXIgPSBXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKHRhZ3NbaV0pOwotICAgICAgTWVzc2FnZUxpdGVUb1N0cmluZy5wcmludEZpZWxkKGJ1ZmZlciwgaW5kZW50LCBTdHJpbmcudmFsdWVPZihmaWVsZE51bWJlciksIG9iamVjdHNbaV0pOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBzdG9yZUZpZWxkKGludCB0YWcsIE9iamVjdCB2YWx1ZSkgewotICAgIGVuc3VyZUNhcGFjaXR5KCk7Ci0gICAgCi0gICAgdGFnc1tjb3VudF0gPSB0YWc7Ci0gICAgb2JqZWN0c1tjb3VudF0gPSB2YWx1ZTsKLSAgICBjb3VudCsrOwotICB9Ci0gIAotICAvKioKLSAgICogRW5zdXJlcyB0aGF0IG91ciBhcnJheXMgYXJlIGxvbmcgZW5vdWdoIHRvIHN0b3JlIG1vcmUgbWV0YWRhdGEuCi0gICAqLwotICBwcml2YXRlIHZvaWQgZW5zdXJlQ2FwYWNpdHkoKSB7Ci0gICAgaWYgKGNvdW50ID09IHRhZ3MubGVuZ3RoKSB7ICAgICAgICAKLSAgICAgIGludCBpbmNyZW1lbnQgPSBjb3VudCA8IChNSU5fQ0FQQUNJVFkgLyAyKSA/IE1JTl9DQVBBQ0lUWSA6IGNvdW50ID4+IDE7Ci0gICAgICBpbnQgbmV3TGVuZ3RoID0gY291bnQgKyBpbmNyZW1lbnQ7Ci0gICAgICAgIAotICAgICAgdGFncyA9IEFycmF5cy5jb3B5T2YodGFncywgbmV3TGVuZ3RoKTsKLSAgICAgIG9iamVjdHMgPSBBcnJheXMuY29weU9mKG9iamVjdHMsIG5ld0xlbmd0aCk7Ci0gICAgfQotICB9Ci0gIAotICAvKioKLSAgICogUGFyc2UgYSBzaW5nbGUgZmllbGQgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSBpdCBpbnRvIHRoaXMgc2V0LgotICAgKgotICAgKiA8cD5Gb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAqCi0gICAqIEBwYXJhbSB0YWcgVGhlIGZpZWxkJ3MgdGFnIG51bWJlciwgd2hpY2ggd2FzIGFscmVhZHkgcGFyc2VkLgotICAgKiBAcmV0dXJuIHtAY29kZSBmYWxzZX0gaWYgdGhlIHRhZyBpcyBhbiBlbmQgZ3JvdXAgdGFnLgotICAgKi8KLSAgYm9vbGVhbiBtZXJnZUZpZWxkRnJvbShmaW5hbCBpbnQgdGFnLCBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGNoZWNrTXV0YWJsZSgpOwotICAgIGZpbmFsIGludCBmaWVsZE51bWJlciA9IFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKTsKLSAgICBzd2l0Y2ggKFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKSkgewotICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVDoKLSAgICAgICAgc3RvcmVGaWVsZCh0YWcsIGlucHV0LnJlYWRJbnQ2NCgpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQzMjoKLSAgICAgICAgc3RvcmVGaWVsZCh0YWcsIGlucHV0LnJlYWRGaXhlZDMyKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0OgotICAgICAgICBzdG9yZUZpZWxkKHRhZywgaW5wdXQucmVhZEZpeGVkNjQoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICAgIHN0b3JlRmllbGQodGFnLCBpbnB1dC5yZWFkQnl0ZXMoKSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQOgotICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXRMaXRlIHN1YkZpZWxkU2V0ID0gbmV3IFVua25vd25GaWVsZFNldExpdGUoKTsKLSAgICAgICAgc3ViRmllbGRTZXQubWVyZ2VGcm9tKGlucHV0KTsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKAotICAgICAgICAgICAgV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkpOwotICAgICAgICBzdG9yZUZpZWxkKHRhZywgc3ViRmllbGRTZXQpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkV2lyZVR5cGUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBtZXJnaW5nIGEgbmV3IGZpZWxkIGNvbnRhaW5pbmcgYSBzaW5nbGUgdmFyaW50Ci0gICAqIHZhbHVlLiBUaGlzIGlzIHVzZWQgaW4gcGFydGljdWxhciB3aGVuIGFuIHVua25vd24gZW51bSB2YWx1ZSBpcwotICAgKiBlbmNvdW50ZXJlZC4KLSAgICoKLSAgICogPHA+Rm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LgotICAgKi8KLSAgVW5rbm93bkZpZWxkU2V0TGl0ZSBtZXJnZVZhcmludEZpZWxkKGludCBmaWVsZE51bWJlciwgaW50IHZhbHVlKSB7Ci0gICAgY2hlY2tNdXRhYmxlKCk7Ci0gICAgaWYgKGZpZWxkTnVtYmVyID09IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOwotICAgIH0KLQotICAgIHN0b3JlRmllbGQoV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCksIChsb25nKSB2YWx1ZSk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBtZXJnaW5nIGEgbGVuZ3RoLWRlbGltaXRlZCBmaWVsZC4KLSAgICoKLSAgICogPHA+Rm9yIHVzZSBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LgotICAgKi8KLSAgVW5rbm93bkZpZWxkU2V0TGl0ZSBtZXJnZUxlbmd0aERlbGltaXRlZEZpZWxkKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgeyAgCi0gICAgY2hlY2tNdXRhYmxlKCk7Ci0gICAgaWYgKGZpZWxkTnVtYmVyID09IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOwotICAgIH0KLQotICAgIHN0b3JlRmllbGQoV2lyZUZvcm1hdC5tYWtlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpLCB2YWx1ZSk7Ci0gICAgCi0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBQYXJzZSBhbiBlbnRpcmUgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0cyBmaWVsZHMgaW50bwotICAgKiB0aGlzIHNldC4KLSAgICovCi0gIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0TGl0ZSBtZXJnZUZyb20oZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBFbnN1cmVzIGluaXRpYWxpemF0aW9uIGluIG1lcmdlRmllbGRGcm9tLgotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBmaW5hbCBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgaWYgKHRhZyA9PSAwIHx8ICFtZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzBlODc5MS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExhenlTdHJpbmdMaXN0fSB0aGF0IHdyYXBzIGFub3RoZXIKLSAqIHtAbGluayBMYXp5U3RyaW5nTGlzdH0gc3VjaCB0aGF0IGl0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHdyYXBwZXIuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdDxTdHJpbmc+Ci0gICAgaW1wbGVtZW50cyBMYXp5U3RyaW5nTGlzdCwgUmFuZG9tQWNjZXNzIHsKLQotICBwcml2YXRlIGZpbmFsIExhenlTdHJpbmdMaXN0IGxpc3Q7Ci0KLSAgcHVibGljIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KExhenlTdHJpbmdMaXN0IGxpc3QpIHsKLSAgICB0aGlzLmxpc3QgPSBsaXN0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgZ2V0KGludCBpbmRleCkgewotICAgIHJldHVybiBsaXN0LmdldChpbmRleCk7Ci0gIH0KLSAgCi0gIEBPdmVycmlkZQotICBwdWJsaWMgT2JqZWN0IGdldFJhdyhpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbGlzdC5nZXRSYXcoaW5kZXgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gbGlzdC5zaXplKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEJ5dGVTdHJpbmcgZ2V0Qnl0ZVN0cmluZyhpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbGlzdC5nZXRCeXRlU3RyaW5nKGluZGV4KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGQoQnl0ZVN0cmluZyBlbGVtZW50KSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0KGludCBpbmRleCwgQnl0ZVN0cmluZyBlbGVtZW50KSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsQnl0ZVN0cmluZyhDb2xsZWN0aW9uPD8gZXh0ZW5kcyBCeXRlU3RyaW5nPiBlbGVtZW50KSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJ5dGVbXSBnZXRCeXRlQXJyYXkoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGxpc3QuZ2V0Qnl0ZUFycmF5KGluZGV4KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBhZGQoYnl0ZVtdIGVsZW1lbnQpIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgfQotICAKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldChpbnQgaW5kZXgsIGJ5dGVbXSBlbGVtZW50KSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsQnl0ZUFycmF5KENvbGxlY3Rpb248Ynl0ZVtdPiBlbGVtZW50KSB7Ci0gICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3RJdGVyYXRvcjxTdHJpbmc+IGxpc3RJdGVyYXRvcihmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gbmV3IExpc3RJdGVyYXRvcjxTdHJpbmc+KCkgewotICAgICAgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QubGlzdEl0ZXJhdG9yKGluZGV4KTsKLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlci5oYXNOZXh0KCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzUHJldmlvdXMoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyLmhhc1ByZXZpb3VzKCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIFN0cmluZyBwcmV2aW91cygpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXIucHJldmlvdXMoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IG5leHRJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXIubmV4dEluZGV4KCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGludCBwcmV2aW91c0luZGV4KCkgewotICAgICAgICByZXR1cm4gaXRlci5wcmV2aW91c0luZGV4KCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBzZXQoU3RyaW5nIG8pIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgYWRkKFN0cmluZyBvKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IoKSB7Ci0gICAgcmV0dXJuIG5ldyBJdGVyYXRvcjxTdHJpbmc+KCkgewotICAgICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhc05leHQoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyLmhhc05leHQoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgU3RyaW5nIG5leHQoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyLm5leHQoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCByZW1vdmUoKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIExpc3Q8Pz4gZ2V0VW5kZXJseWluZ0VsZW1lbnRzKCkgewotICAgIC8vIFRoZSByZXR1cm5lZCB2YWx1ZSBpcyBhbHJlYWR5IHVubW9kaWZpYWJsZS4KLSAgICByZXR1cm4gbGlzdC5nZXRVbmRlcmx5aW5nRWxlbWVudHMoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBtZXJnZUZyb20oTGF6eVN0cmluZ0xpc3Qgb3RoZXIpIHsKLSAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdDxieXRlW10+IGFzQnl0ZUFycmF5TGlzdCgpIHsKLSAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChsaXN0LmFzQnl0ZUFycmF5TGlzdCgpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGlzdDxCeXRlU3RyaW5nPiBhc0J5dGVTdHJpbmdMaXN0KCkgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KGxpc3QuYXNCeXRlU3RyaW5nTGlzdCgpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgTGF6eVN0cmluZ0xpc3QgZ2V0VW5tb2RpZmlhYmxlVmlldygpIHsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VbnNhZmVCeXRlT3BlcmF0aW9ucy5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9VbnNhZmVCeXRlT3BlcmF0aW9ucy5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmJmNGQ0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5zYWZlQnl0ZU9wZXJhdGlvbnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLS8qKgotICogUHJvdmlkZXMgYSBudW1iZXIgb2YgdW5zYWZlIGJ5dGUgb3BlcmF0aW9ucyB0byBiZSB1c2VkIGJ5IGFkdmFuY2VkIGFwcGxpY2F0aW9ucyB3aXRoIGhpZ2gKLSAqIHBlcmZvcm1hbmNlIHJlcXVpcmVtZW50cy4gVGhlc2UgbWV0aG9kcyBhcmUgcmVmZXJyZWQgdG8gYXMgInVuc2FmZSIgZHVlIHRvIHRoZSBmYWN0IHRoYXQgdGhleQotICogcG90ZW50aWFsbHkgZXhwb3NlIHRoZSBiYWNraW5nIGJ1ZmZlciBvZiBhIHtAbGluayBCeXRlU3RyaW5nfSB0byB0aGUgYXBwbGljYXRpb24uCi0gKgotICogPHA+PHN0cm9uZz5ESVNDTEFJTUVSOjwvc3Ryb25nPiBUaGUgbWV0aG9kcyBpbiB0aGlzIGNsYXNzIHNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZiBpdCBpcwotICogZ3VhcmFudGVlZCB0aGF0IHRoZSBidWZmZXIgYmFja2luZyB0aGUge0BsaW5rIEJ5dGVTdHJpbmd9IHdpbGwgbmV2ZXIgY2hhbmdlISBNdXRhdGlvbiBvZiBhCi0gKiB7QGxpbmsgQnl0ZVN0cmluZ30gY2FuIGxlYWQgdG8gdW5leHBlY3RlZCBhbmQgdW5kZXNpcmFibGUgY29uc2VxdWVuY2VzIGluIHlvdXIgYXBwbGljYXRpb24sCi0gKiBhbmQgd2lsbCBsaWtlbHkgYmUgZGlmZmljdWx0IHRvIGRlYnVnLiBQcm9jZWVkIHdpdGggY2F1dGlvbiEKLSAqLwotQEV4cGVyaW1lbnRhbEFwaQotcHVibGljIGZpbmFsIGNsYXNzIFVuc2FmZUJ5dGVPcGVyYXRpb25zIHsKLSAgcHJpdmF0ZSBVbnNhZmVCeXRlT3BlcmF0aW9ucygpIHt9Ci0KLSAgLyoqCi0gICAqIEFuIHVuc2FmZSBvcGVyYXRpb24gdGhhdCByZXR1cm5zIGEge0BsaW5rIEJ5dGVTdHJpbmd9IHRoYXQgaXMgYmFja2VkIGJ5IHRoZSBwcm92aWRlZCBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSBidWZmZXIgdGhlIEphdmEgTklPIGJ1ZmZlciB0byBiZSB3cmFwcGVkCi0gICAqIEByZXR1cm4gYSB7QGxpbmsgQnl0ZVN0cmluZ30gYmFja2VkIGJ5IHRoZSBwcm92aWRlZCBidWZmZXIKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyB1bnNhZmVXcmFwKEJ5dGVCdWZmZXIgYnVmZmVyKSB7Ci0gICAgaWYgKGJ1ZmZlci5oYXNBcnJheSgpKSB7Ci0gICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gYnVmZmVyLmFycmF5T2Zmc2V0KCk7Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy53cmFwKGJ1ZmZlci5hcnJheSgpLCBvZmZzZXQgKyBidWZmZXIucG9zaXRpb24oKSwgYnVmZmVyLnJlbWFpbmluZygpKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIG5ldyBOaW9CeXRlU3RyaW5nKGJ1ZmZlcik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlcyB0aGUgZ2l2ZW4ge0BsaW5rIEJ5dGVTdHJpbmd9IHRvIHRoZSBwcm92aWRlZCB7QGxpbmsgQnl0ZU91dHB1dH0uIENhbGxpbmcgdGhpcyBtZXRob2QgbWF5Ci0gICAqIHJlc3VsdCBpbiBtdWx0aXBsZSBvcGVyYXRpb25zIG9uIHRoZSB0YXJnZXQge0BsaW5rIEJ5dGVPdXRwdXR9Ci0gICAqIChpLmUuIGZvciByb3BlZCB7QGxpbmsgQnl0ZVN0cmluZ31zKS4KLSAgICoKLSAgICogPHA+VGhpcyBtZXRob2QgZXhwb3NlcyB0aGUgaW50ZXJuYWwgYmFja2luZyBidWZmZXIocykgb2YgdGhlIHtAbGluayBCeXRlU3RyaW5nfSB0byB0aGUge0BsaW5rCi0gICAqIEJ5dGVPdXRwdXR9IGluIG9yZGVyIHRvIGF2b2lkIGFkZGl0aW9uYWwgY29weWluZyBvdmVyaGVhZC4gSXQgd291bGQgYmUgcG9zc2libGUgZm9yIGEgbWFsaWNpb3VzCi0gICAqIHtAbGluayBCeXRlT3V0cHV0fSB0byBjb3JydXB0IHRoZSB7QGxpbmsgQnl0ZVN0cmluZ30uIFVzZSB3aXRoIGNhdXRpb24hCi0gICAqCi0gICAqIDxwPiBOT1RFOiBUaGUge0BsaW5rIEJ5dGVPdXRwdXR9IDxzdHJvbmc+TVVTVCBOT1Q8L3N0cm9uZz4gbW9kaWZ5IHRoZSBwcm92aWRlZCBidWZmZXJzLiBEb2luZwotICAgKiBzbyBtYXkgcmVzdWx0IGluIGNvcnJ1cHRlZCBkYXRhLCB3aGljaCB3b3VsZCBiZSBkaWZmaWN1bHQgdG8gZGVidWcuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlcyB0aGUge0BsaW5rIEJ5dGVTdHJpbmd9IHRvIGJlIHdyaXR0ZW4KLSAgICogQHBhcmFtICBvdXRwdXQgIHRoZSBvdXRwdXQgdG8gcmVjZWl2ZSB0aGUgYnl0ZXMKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiAgaWYgYW4gSS9PIGVycm9yIG9jY3VycwotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHVuc2FmZVdyaXRlVG8oQnl0ZVN0cmluZyBieXRlcywgQnl0ZU91dHB1dCBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgYnl0ZXMud3JpdGVUbyhvdXRwdXQpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1V0ZjguamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVXRmOC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDhjNjllLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVXRmOC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY4MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgc3RhdGljIGphdmEubGFuZy5DaGFyYWN0ZXIuTUFYX1NVUlJPR0FURTsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkNoYXJhY3Rlci5NSU5fU1VSUk9HQVRFOwotaW1wb3J0IHN0YXRpYyBqYXZhLmxhbmcuQ2hhcmFjdGVyLmlzU3Vycm9nYXRlUGFpcjsKLWltcG9ydCBzdGF0aWMgamF2YS5sYW5nLkNoYXJhY3Rlci50b0NvZGVQb2ludDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubmlvLkJ1ZmZlcjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEuc2VjdXJpdHkuQWNjZXNzQ29udHJvbGxlcjsKLWltcG9ydCBqYXZhLnNlY3VyaXR5LlByaXZpbGVnZWRFeGNlcHRpb25BY3Rpb247Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTGV2ZWw7Ci1pbXBvcnQgamF2YS51dGlsLmxvZ2dpbmcuTG9nZ2VyOwotCi0vKioKLSAqIEEgc2V0IG9mIGxvdy1sZXZlbCwgaGlnaC1wZXJmb3JtYW5jZSBzdGF0aWMgdXRpbGl0eSBtZXRob2RzIHJlbGF0ZWQKLSAqIHRvIHRoZSBVVEYtOCBjaGFyYWN0ZXIgZW5jb2RpbmcuICBUaGlzIGNsYXNzIGhhcyBubyBkZXBlbmRlbmNpZXMKLSAqIG91dHNpZGUgb2YgdGhlIGNvcmUgSkRLIGxpYnJhcmllcy4KLSAqCi0gKiA8cD5UaGVyZSBhcmUgc2V2ZXJhbCB2YXJpYW50cyBvZiBVVEYtOC4gIFRoZSBvbmUgaW1wbGVtZW50ZWQgYnkKLSAqIHRoaXMgY2xhc3MgaXMgdGhlIHJlc3RyaWN0ZWQgZGVmaW5pdGlvbiBvZiBVVEYtOCBpbnRyb2R1Y2VkIGluCi0gKiBVbmljb2RlIDMuMSwgd2hpY2ggbWFuZGF0ZXMgdGhlIHJlamVjdGlvbiBvZiAib3ZlcmxvbmciIGJ5dGUKLSAqIHNlcXVlbmNlcyBhcyB3ZWxsIGFzIHJlamVjdGlvbiBvZiAzLWJ5dGUgc3Vycm9nYXRlIGNvZGVwb2ludCBieXRlCi0gKiBzZXF1ZW5jZXMuICBOb3RlIHRoYXQgdGhlIFVURi04IGRlY29kZXIgaW5jbHVkZWQgaW4gT3JhY2xlJ3MgSkRLCi0gKiBoYXMgYmVlbiBtb2RpZmllZCB0byBhbHNvIHJlamVjdCAib3ZlcmxvbmciIGJ5dGUgc2VxdWVuY2VzLCBidXQgKGFzCi0gKiBvZiAyMDExKSBzdGlsbCBhY2NlcHRzIDMtYnl0ZSBzdXJyb2dhdGUgY29kZXBvaW50IGJ5dGUgc2VxdWVuY2VzLgotICoKLSAqIDxwPlRoZSBieXRlIHNlcXVlbmNlcyBjb25zaWRlcmVkIHZhbGlkIGJ5IHRoaXMgY2xhc3MgYXJlIGV4YWN0bHkKLSAqIHRob3NlIHRoYXQgY2FuIGJlIHJvdW5kdHJpcCBjb252ZXJ0ZWQgdG8gU3RyaW5ncyBhbmQgYmFjayB0byBieXRlcwotICogdXNpbmcgdGhlIFVURi04IGNoYXJzZXQsIHdpdGhvdXQgbG9zczogPHByZT4ge0Bjb2RlCi0gKiBBcnJheXMuZXF1YWxzKGJ5dGVzLCBuZXcgU3RyaW5nKGJ5dGVzLCBJbnRlcm5hbC5VVEZfOCkuZ2V0Qnl0ZXMoSW50ZXJuYWwuVVRGXzgpKQotICogfTwvcHJlPgotICoKLSAqIDxwPlNlZSB0aGUgVW5pY29kZSBTdGFuZGFyZCw8L2JyPgotICogVGFibGUgMy02LiA8ZW0+VVRGLTggQml0IERpc3RyaWJ1dGlvbjwvZW0+LDwvYnI+Ci0gKiBUYWJsZSAzLTcuIDxlbT5XZWxsIEZvcm1lZCBVVEYtOCBCeXRlIFNlcXVlbmNlczwvZW0+LgotICoKLSAqIDxwPlRoaXMgY2xhc3Mgc3VwcG9ydHMgZGVjb2Rpbmcgb2YgcGFydGlhbCBieXRlIHNlcXVlbmNlcywgc28gdGhhdCB0aGUKLSAqIGJ5dGVzIGluIGEgY29tcGxldGUgVVRGLTggYnl0ZSBzZXF1ZW5jZXMgY2FuIGJlIHN0b3JlZCBpbiBtdWx0aXBsZQotICogc2VnbWVudHMuICBNZXRob2RzIHR5cGljYWxseSByZXR1cm4ge0BsaW5rICNNQUxGT1JNRUR9IGlmIHRoZSBwYXJ0aWFsCi0gKiBieXRlIHNlcXVlbmNlIGlzIGRlZmluaXRlbHkgbm90IHdlbGwtZm9ybWVkLCB7QGxpbmsgI0NPTVBMRVRFfSBpZiBpdCBpcwotICogd2VsbC1mb3JtZWQgaW4gdGhlIGFic2VuY2Ugb2YgYWRkaXRpb25hbCBpbnB1dCwgb3IgaWYgdGhlIGJ5dGUgc2VxdWVuY2UKLSAqIGFwcGFyZW50bHkgdGVybWluYXRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhcmFjdGVyLCBhbiBvcGFxdWUgaW50ZWdlcgotICogInN0YXRlIiB2YWx1ZSBjb250YWluaW5nIGVub3VnaCBpbmZvcm1hdGlvbiB0byBkZWNvZGUgdGhlIGNoYXJhY3RlciB3aGVuCi0gKiBwYXNzZWQgdG8gYSBzdWJzZXF1ZW50IGludm9jYXRpb24gb2YgYSBwYXJ0aWFsIGRlY29kaW5nIG1ldGhvZC4KLSAqCi0gKiBAYXV0aG9yIG1hcnRpbnJiQGdvb2dsZS5jb20gKE1hcnRpbiBCdWNoaG9seikKLSAqLwotLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogQ29weSBjaGFuZ2VzIGluIHRoaXMgY2xhc3MgYmFjayB0byBHdWF2YQotZmluYWwgY2xhc3MgVXRmOCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPSBMb2dnZXIuZ2V0TG9nZ2VyKFV0ZjguY2xhc3MuZ2V0TmFtZSgpKTsKLQotICAvKioKLSAgICogVVRGLTggaXMgYSBydW50aW1lIGhvdCBzcG90IHNvIHdlIGF0dGVtcHQgdG8gcHJvdmlkZSBoZWF2aWx5IG9wdGltaXplZCBpbXBsZW1lbnRhdGlvbnMKLSAgICogZGVwZW5kaW5nIG9uIHdoYXQgaXMgYXZhaWxhYmxlIG9uIHRoZSBwbGF0Zm9ybS4gVGhlIHByb2Nlc3NvciBpcyB0aGUgcGxhdGZvcm0tb3B0aW1pemVkCi0gICAqIGRlbGVnYXRlIGZvciB3aGljaCBhbGwgbWV0aG9kcyBhcmUgZGVsZWdhdGVkIGRpcmVjdGx5IHRvLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvY2Vzc29yIHByb2Nlc3NvciA9Ci0gICAgICBVbnNhZmVQcm9jZXNzb3IuaXNBdmFpbGFibGUoKSA/IG5ldyBVbnNhZmVQcm9jZXNzb3IoKSA6IG5ldyBTYWZlUHJvY2Vzc29yKCk7Ci0KLSAgLyoqCi0gICAqIEEgbWFzayB1c2VkIHdoZW4gcGVyZm9ybWluZyB1bnNhZmUgcmVhZHMgdG8gZGV0ZXJtaW5lIGlmIGEgbG9uZyB2YWx1ZSBjb250YWlucyBhbnkgbm9uLUFTQ0lJCi0gICAqIGNoYXJhY3RlcnMgKGkuZS4gYW55IGJ5dGUgPj0gMHg4MCkuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIEFTQ0lJX01BU0tfTE9ORyA9IDB4ODA4MDgwODA4MDgwODA4MEw7Ci0KLSAgLyoqCi0gICAqIE1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHBlciBKYXZhIFVURi0xNiBjaGFyIGluIFVURi04LgotICAgKiBAc2VlIGphdmEubmlvLmNoYXJzZXQuQ2hhcnNldEVuY29kZXIjbWF4Qnl0ZXNQZXJDaGFyKCkKLSAgICovCi0gIHN0YXRpYyBmaW5hbCBpbnQgTUFYX0JZVEVTX1BFUl9DSEFSID0gMzsKLQotICAvKioKLSAgICogU3RhdGUgdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBieXRlIHNlcXVlbmNlIGlzIHdlbGwtZm9ybWVkIGFuZAotICAgKiBjb21wbGV0ZSAobm8gZnVydGhlciBieXRlcyBhcmUgbmVlZGVkIHRvIGNvbXBsZXRlIGEgY2hhcmFjdGVyKS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IENPTVBMRVRFID0gMDsKLQotICAvKioKLSAgICogU3RhdGUgdmFsdWUgaW5kaWNhdGluZyB0aGF0IHRoZSBieXRlIHNlcXVlbmNlIGlzIGRlZmluaXRlbHkgbm90Ci0gICAqIHdlbGwtZm9ybWVkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTUFMRk9STUVEID0gLTE7Ci0KLSAgLyoqCi0gICAqIFVzZWQgYnkge0Bjb2RlIFVuc2FmZX0gVVRGLTggc3RyaW5nIHZhbGlkYXRpb24gbG9naWMgdG8gZGV0ZXJtaW5lIHRoZSBtaW5pbXVtIHN0cmluZyBsZW5ndGgKLSAgICogYWJvdmUgd2hpY2ggdG8gZW1wbG95IGFuIG9wdGltaXplZCBhbGdvcml0aG0gZm9yIGNvdW50aW5nIEFTQ0lJIGNoYXJhY3RlcnMuIFRoZSByZWFzb24gZm9yIHRoaXMKLSAgICogdGhyZXNob2xkIGlzIHRoYXQgZm9yIHNtYWxsIHN0cmluZ3MsIHRoZSBvcHRpbWl6YXRpb24gbWF5IG5vdCBiZSBiZW5lZmljaWFsIG9yIG1heSBldmVuCi0gICAqIG5lZ2F0aXZlbHkgaW1wYWN0IHBlcmZvcm1hbmNlIHNpbmNlIGl0IHJlcXVpcmVzIGFkZGl0aW9uYWwgbG9naWMgdG8gYXZvaWQgdW5hbGlnbmVkIHJlYWRzCi0gICAqICh3aGVuIGNhbGxpbmcge0Bjb2RlIFVuc2FmZS5nZXRMb25nfSkuIFRoaXMgdGhyZXNob2xkIGd1YXJhbnRlZXMgdGhhdCBldmVuIGlmIHRoZSBpbml0aWFsCi0gICAqIG9mZnNldCBpcyB1bmFsaWduZWQsIHdlJ3JlIGd1YXJhbnRlZWQgdG8gbWFrZSBhdCBsZWFzdCBvbmUgY2FsbCB0byB7QGNvZGUgVW5zYWZlLmdldExvbmcoKX0KLSAgICogd2hpY2ggcHJvdmlkZXMgYSBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCB0aGF0IGVudGlyZWx5IHN1YnN1bWVzIHRoZSBjb3N0IG9mIHRoZSBhZGRpdGlvbmFsCi0gICAqIGxvZ2ljLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFVOU0FGRV9DT1VOVF9BU0NJSV9USFJFU0hPTEQgPSAxNjsKLQotICAvLyBPdGhlciBzdGF0ZSB2YWx1ZXMgaW5jbHVkZSB0aGUgcGFydGlhbCBieXRlcyBvZiB0aGUgaW5jb21wbGV0ZQotICAvLyBjaGFyYWN0ZXIgdG8gYmUgZGVjb2RlZCBpbiB0aGUgc2ltcGxlc3Qgd2F5OiB3ZSBwYWNrIHRoZSBieXRlcwotICAvLyBpbnRvIHRoZSBzdGF0ZSBpbnQgaW4gbGl0dGxlLWVuZGlhbiBvcmRlci4gIEZvciBleGFtcGxlOgotICAvLwotICAvLyBpbnQgc3RhdGUgPSBieXRlMSBeIChieXRlMiA8PCA4KSBeIChieXRlMyA8PCAxNik7Ci0gIC8vCi0gIC8vIFN1Y2ggYSBzdGF0ZSBpcyB1bnBhY2tlZCB0aHVzIChub3RlIHRoZSB+IG9wZXJhdGlvbiBmb3IgYnl0ZTIgdG8KLSAgLy8gdW5kbyBieXRlMSdzIHNpZ24tZXh0ZW5zaW9uIGJpdHMpOgotICAvLwotICAvLyBpbnQgYnl0ZTEgPSAoYnl0ZSkgc3RhdGU7Ci0gIC8vIGludCBieXRlMiA9IChieXRlKSB+KHN0YXRlID4+IDgpOwotICAvLyBpbnQgYnl0ZTMgPSAoYnl0ZSkgKHN0YXRlID4+IDE2KTsKLSAgLy8KLSAgLy8gV2UgY2Fubm90IHN0b3JlIGEgemVybyBieXRlIGluIHRoZSBzdGF0ZSBiZWNhdXNlIGl0IHdvdWxkIGJlCi0gIC8vIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGFic2VuY2Ugb2YgYSBieXRlLiAgQnV0IHdlIGRvbid0IG5lZWQKLSAgLy8gdG8sIGJlY2F1c2UgcGFydGlhbCBieXRlcyBtdXN0IGFsd2F5cyBiZSBuZWdhdGl2ZS4gIFdoZW4gYnVpbGRpbmcKLSAgLy8gYSBzdGF0ZSwgd2UgZW5zdXJlIHRoYXQgYnl0ZTEgaXMgbmVnYXRpdmUgYW5kIHN1YnNlcXVlbnQgYnl0ZXMKLSAgLy8gYXJlIHZhbGlkIHRyYWlsaW5nIGJ5dGVzLgotCi0gIC8qKgotICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBpcyBhIHdlbGwtZm9ybWVkCi0gICAqIFVURi04IGJ5dGUgc2VxdWVuY2UuCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGVxdWl2YWxlbnQgdG8gYSBjYWxsIHRvIHtAY29kZQotICAgKiBpc1ZhbGlkVXRmOChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFV0ZjgoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3Nvci5pc1ZhbGlkVXRmOChieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBzbGljZSBpcyBhCi0gICAqIHdlbGwtZm9ybWVkIFVURi04IGJ5dGUgc2VxdWVuY2UuICBUaGUgcmFuZ2Ugb2YgYnl0ZXMgdG8gYmUKLSAgICogY2hlY2tlZCBleHRlbmRzIGZyb20gaW5kZXgge0Bjb2RlIGluZGV4fSwgaW5jbHVzaXZlLCB0byB7QGNvZGUKLSAgICogbGltaXR9LCBleGNsdXNpdmUuCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGVxdWl2YWxlbnQgdG8ge0Bjb2RlCi0gICAqIHBhcnRpYWxJc1ZhbGlkVXRmOChieXRlcywgaW5kZXgsIGxpbWl0KSA9PSBVdGY4LkNPTVBMRVRFfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkVXRmOChieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KSB7Ci0gICAgcmV0dXJuIHByb2Nlc3Nvci5pc1ZhbGlkVXRmOChieXRlcywgaW5kZXgsIGxpbWl0KTsKLSAgfQotCi0gIC8qKgotICAgKiBUZWxscyB3aGV0aGVyIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlIGlzIGEgd2VsbC1mb3JtZWQsCi0gICAqIG1hbGZvcm1lZCwgb3IgaW5jb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlLiAgVGhlIHJhbmdlIG9mIGJ5dGVzCi0gICAqIHRvIGJlIGNoZWNrZWQgZXh0ZW5kcyBmcm9tIGluZGV4IHtAY29kZSBpbmRleH0sIGluY2x1c2l2ZSwgdG8KLSAgICoge0Bjb2RlIGxpbWl0fSwgZXhjbHVzaXZlLgotICAgKgotICAgKiBAcGFyYW0gc3RhdGUgZWl0aGVyIHtAbGluayBVdGY4I0NPTVBMRVRFfSAoaWYgdGhpcyBpcyB0aGUgaW5pdGlhbCBkZWNvZGluZwotICAgKiBvcGVyYXRpb24pIG9yIHRoZSB2YWx1ZSByZXR1cm5lZCBmcm9tIGEgY2FsbCB0byBhIHBhcnRpYWwgZGVjb2RpbmcgbWV0aG9kCi0gICAqIGZvciB0aGUgcHJldmlvdXMgYnl0ZXMKLSAgICoKLSAgICogQHJldHVybiB7QGxpbmsgI01BTEZPUk1FRH0gaWYgdGhlIHBhcnRpYWwgYnl0ZSBzZXF1ZW5jZSBpcwotICAgKiBkZWZpbml0ZWx5IG5vdCB3ZWxsLWZvcm1lZCwge0BsaW5rICNDT01QTEVURX0gaWYgaXQgaXMgd2VsbC1mb3JtZWQKLSAgICogKG5vIGFkZGl0aW9uYWwgaW5wdXQgbmVlZGVkKSwgb3IgaWYgdGhlIGJ5dGUgc2VxdWVuY2UgaXMKLSAgICogImluY29tcGxldGUiLCBpLmUuIGFwcGFyZW50bHkgdGVybWluYXRlZCBpbiB0aGUgbWlkZGxlIG9mIGEgY2hhcmFjdGVyLAotICAgKiBhbiBvcGFxdWUgaW50ZWdlciAic3RhdGUiIHZhbHVlIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uIHRvCi0gICAqIGRlY29kZSB0aGUgY2hhcmFjdGVyIHdoZW4gcGFzc2VkIHRvIGEgc3Vic2VxdWVudCBpbnZvY2F0aW9uIG9mIGEKLSAgICogcGFydGlhbCBkZWNvZGluZyBtZXRob2QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoaW50IHN0YXRlLCBieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KSB7Ci0gICAgcmV0dXJuIHByb2Nlc3Nvci5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUsIGJ5dGVzLCBpbmRleCwgbGltaXQpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGluY29tcGxldGVTdGF0ZUZvcihpbnQgYnl0ZTEpIHsKLSAgICByZXR1cm4gKGJ5dGUxID4gKGJ5dGUpIDB4RjQpID8KLSAgICAgICAgTUFMRk9STUVEIDogYnl0ZTE7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgaW5jb21wbGV0ZVN0YXRlRm9yKGludCBieXRlMSwgaW50IGJ5dGUyKSB7Ci0gICAgcmV0dXJuIChieXRlMSA+IChieXRlKSAweEY0IHx8Ci0gICAgICAgICAgICBieXRlMiA+IChieXRlKSAweEJGKSA/Ci0gICAgICAgIE1BTEZPUk1FRCA6IGJ5dGUxIF4gKGJ5dGUyIDw8IDgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGluY29tcGxldGVTdGF0ZUZvcihpbnQgYnl0ZTEsIGludCBieXRlMiwgaW50IGJ5dGUzKSB7Ci0gICAgcmV0dXJuIChieXRlMSA+IChieXRlKSAweEY0IHx8Ci0gICAgICAgICAgICBieXRlMiA+IChieXRlKSAweEJGIHx8Ci0gICAgICAgICAgICBieXRlMyA+IChieXRlKSAweEJGKSA/Ci0gICAgICAgIE1BTEZPUk1FRCA6IGJ5dGUxIF4gKGJ5dGUyIDw8IDgpIF4gKGJ5dGUzIDw8IDE2KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZVtdIGJ5dGVzLCBpbnQgaW5kZXgsIGludCBsaW1pdCkgewotICAgIGludCBieXRlMSA9IGJ5dGVzW2luZGV4IC0gMV07Ci0gICAgc3dpdGNoIChsaW1pdCAtIGluZGV4KSB7Ci0gICAgICBjYXNlIDA6IHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEpOwotICAgICAgY2FzZSAxOiByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlc1tpbmRleF0pOwotICAgICAgY2FzZSAyOiByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlc1tpbmRleF0sIGJ5dGVzW2luZGV4ICsgMV0pOwotICAgICAgZGVmYXVsdDogdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGluY29tcGxldGVTdGF0ZUZvcigKLSAgICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnVmZmVyLCBmaW5hbCBpbnQgYnl0ZTEsIGZpbmFsIGludCBpbmRleCwgZmluYWwgaW50IHJlbWFpbmluZykgewotICAgIHN3aXRjaCAocmVtYWluaW5nKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEpOwotICAgICAgY2FzZSAxOgotICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBidWZmZXIuZ2V0KGluZGV4KSk7Ci0gICAgICBjYXNlIDI6Ci0gICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEsIGJ1ZmZlci5nZXQoaW5kZXgpLCBidWZmZXIuZ2V0KGluZGV4ICsgMSkpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IEFzc2VydGlvbkVycm9yKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlc2UgVVRGLTggaGFuZGxpbmcgbWV0aG9kcyBhcmUgY29waWVkIGZyb20gR3VhdmEncyBVdGY4IGNsYXNzIHdpdGggYSBtb2RpZmljYXRpb24gdG8gdGhyb3cKLSAgLy8gYSBwcm90b2NvbCBidWZmZXIgbG9jYWwgZXhjZXB0aW9uLiBUaGlzIGV4Y2VwdGlvbiBpcyB0aGVuIGNhdWdodCBpbiBDb2RlZE91dHB1dFN0cmVhbSBzbyBpdCBjYW4KLSAgLy8gZmFsbGJhY2sgdG8gbW9yZSBsZW5pZW50IGJlaGF2aW9yLgotICAKLSAgc3RhdGljIGNsYXNzIFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uIGV4dGVuZHMgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIHsKLSAgICBwcml2YXRlIFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uKGludCBpbmRleCwgaW50IGxlbmd0aCkgewotICAgICAgc3VwZXIoIlVucGFpcmVkIHN1cnJvZ2F0ZSBhdCBpbmRleCAiICsgaW5kZXggKyAiIG9mICIgKyBsZW5ndGgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIFVURi04LWVuY29kZWQgZm9ybSBvZiB7QGNvZGUgc2VxdWVuY2V9LiBGb3IgYSBzdHJpbmcsCi0gICAqIHRoaXMgbWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIHN0cmluZy5nZXRCeXRlcyhVVEZfOCkubGVuZ3RofSwgYnV0IGlzIG1vcmUgZWZmaWNpZW50IGluCi0gICAqIGJvdGggdGltZSBhbmQgc3BhY2UuCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBzZXF1ZW5jZX0gY29udGFpbnMgaWxsLWZvcm1lZCBVVEYtMTYgKHVucGFpcmVkCi0gICAqICAgICBzdXJyb2dhdGVzKQotICAgKi8KLSAgc3RhdGljIGludCBlbmNvZGVkTGVuZ3RoKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSkgewotICAgIC8vIFdhcm5pbmcgdG8gbWFpbnRhaW5lcnM6IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGlnaGx5IG9wdGltaXplZC4KLSAgICBpbnQgdXRmMTZMZW5ndGggPSBzZXF1ZW5jZS5sZW5ndGgoKTsKLSAgICBpbnQgdXRmOExlbmd0aCA9IHV0ZjE2TGVuZ3RoOwotICAgIGludCBpID0gMDsKLQotICAgIC8vIFRoaXMgbG9vcCBvcHRpbWl6ZXMgZm9yIHB1cmUgQVNDSUkuCi0gICAgd2hpbGUgKGkgPCB1dGYxNkxlbmd0aCAmJiBzZXF1ZW5jZS5jaGFyQXQoaSkgPCAweDgwKSB7Ci0gICAgICBpKys7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBsb29wIG9wdGltaXplcyBmb3IgY2hhcnMgbGVzcyB0aGFuIDB4ODAwLgotICAgIGZvciAoOyBpIDwgdXRmMTZMZW5ndGg7IGkrKykgewotICAgICAgY2hhciBjID0gc2VxdWVuY2UuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPCAweDgwMCkgewotICAgICAgICB1dGY4TGVuZ3RoICs9ICgoMHg3ZiAtIGMpID4+PiAzMSk7ICAvLyBicmFuY2ggZnJlZSEKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHV0ZjhMZW5ndGggKz0gZW5jb2RlZExlbmd0aEdlbmVyYWwoc2VxdWVuY2UsIGkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAodXRmOExlbmd0aCA8IHV0ZjE2TGVuZ3RoKSB7Ci0gICAgICAvLyBOZWNlc3NhcnkgYW5kIHN1ZmZpY2llbnQgY29uZGl0aW9uIGZvciBvdmVyZmxvdyBiZWNhdXNlIG9mIG1heGltdW0gM3ggZXhwYW5zaW9uCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVVEYtOCBsZW5ndGggZG9lcyBub3QgZml0IGluIGludDogIgotICAgICAgICAgICAgICArICh1dGY4TGVuZ3RoICsgKDFMIDw8IDMyKSkpOwotICAgIH0KLSAgICByZXR1cm4gdXRmOExlbmd0aDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCBlbmNvZGVkTGVuZ3RoR2VuZXJhbChDaGFyU2VxdWVuY2Ugc2VxdWVuY2UsIGludCBzdGFydCkgewotICAgIGludCB1dGYxNkxlbmd0aCA9IHNlcXVlbmNlLmxlbmd0aCgpOwotICAgIGludCB1dGY4TGVuZ3RoID0gMDsKLSAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCB1dGYxNkxlbmd0aDsgaSsrKSB7Ci0gICAgICBjaGFyIGMgPSBzZXF1ZW5jZS5jaGFyQXQoaSk7Ci0gICAgICBpZiAoYyA8IDB4ODAwKSB7Ci0gICAgICAgIHV0ZjhMZW5ndGggKz0gKDB4N2YgLSBjKSA+Pj4gMzE7IC8vIGJyYW5jaCBmcmVlIQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXRmOExlbmd0aCArPSAyOwotICAgICAgICAvLyBqZGs3KzogaWYgKENoYXJhY3Rlci5pc1N1cnJvZ2F0ZShjKSkgewotICAgICAgICBpZiAoQ2hhcmFjdGVyLk1JTl9TVVJST0dBVEUgPD0gYyAmJiBjIDw9IENoYXJhY3Rlci5NQVhfU1VSUk9HQVRFKSB7Ci0gICAgICAgICAgLy8gQ2hlY2sgdGhhdCB3ZSBoYXZlIGEgd2VsbC1mb3JtZWQgc3Vycm9nYXRlIHBhaXIuCi0gICAgICAgICAgaW50IGNwID0gQ2hhcmFjdGVyLmNvZGVQb2ludEF0KHNlcXVlbmNlLCBpKTsKLSAgICAgICAgICBpZiAoY3AgPCBDaGFyYWN0ZXIuTUlOX1NVUFBMRU1FTlRBUllfQ09ERV9QT0lOVCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uKGksIHV0ZjE2TGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaSsrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB1dGY4TGVuZ3RoOwotICB9Ci0KLSAgc3RhdGljIGludCBlbmNvZGUoQ2hhclNlcXVlbmNlIGluLCBieXRlW10gb3V0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIHByb2Nlc3Nvci5lbmNvZGVVdGY4KGluLCBvdXQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgfQotICAvLyBFbmQgR3VhdmEgVVRGLTggbWV0aG9kcy4KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4ge0BsaW5rIEJ5dGVCdWZmZXJ9IGlzIGEgdmFsaWQgVVRGLTggc3RyaW5nLgotICAgKgotICAgKiA8cD5TZWxlY3RzIGFuIG9wdGltYWwgYWxnb3JpdGhtIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHtAbGluayBCeXRlQnVmZmVyfSAoaS5lLiBoZWFwIG9yIGRpcmVjdCkKLSAgICogYW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXRmb3JtLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gY2hlY2suCi0gICAqIEBzZWUgVXRmOCNpc1ZhbGlkVXRmOChieXRlW10sIGludCwgaW50KQotICAgKi8KLSAgc3RhdGljIGJvb2xlYW4gaXNWYWxpZFV0ZjgoQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLSAgICByZXR1cm4gcHJvY2Vzc29yLmlzVmFsaWRVdGY4KGJ1ZmZlciwgYnVmZmVyLnBvc2l0aW9uKCksIGJ1ZmZlci5yZW1haW5pbmcoKSk7Ci0gIH0KLQotICAvKioKLSAgICogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4ge0BsaW5rIEJ5dGVCdWZmZXJ9IGlzIGEgcGFydGlhbGx5IHZhbGlkIFVURi04IHN0cmluZy4KLSAgICoKLSAgICogPHA+U2VsZWN0cyBhbiBvcHRpbWFsIGFsZ29yaXRobSBiYXNlZCBvbiB0aGUgdHlwZSBvZiB7QGxpbmsgQnl0ZUJ1ZmZlcn0gKGkuZS4gaGVhcCBvciBkaXJlY3QpCi0gICAqIGFuZCB0aGUgY2FwYWJpbGl0aWVzIG9mIHRoZSBwbGF0Zm9ybS4KLSAgICoKLSAgICogQHBhcmFtIGJ1ZmZlciB0aGUgYnVmZmVyIHRvIGNoZWNrLgotICAgKiBAc2VlIFV0ZjgjcGFydGlhbElzVmFsaWRVdGY4KGludCwgYnl0ZVtdLCBpbnQsIGludCkKLSAgICovCi0gIHN0YXRpYyBpbnQgcGFydGlhbElzVmFsaWRVdGY4KGludCBzdGF0ZSwgQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBpbmRleCwgaW50IGxpbWl0KSB7Ci0gICAgcmV0dXJuIHByb2Nlc3Nvci5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUsIGJ1ZmZlciwgaW5kZXgsIGxpbWl0KTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIHRoZSBnaXZlbiBjaGFyYWN0ZXJzIHRvIHRoZSB0YXJnZXQge0BsaW5rIEJ5dGVCdWZmZXJ9IHVzaW5nIFVURi04IGVuY29kaW5nLgotICAgKgotICAgKiA8cD5TZWxlY3RzIGFuIG9wdGltYWwgYWxnb3JpdGhtIGJhc2VkIG9uIHRoZSB0eXBlIG9mIHtAbGluayBCeXRlQnVmZmVyfSAoaS5lLiBoZWFwIG9yIGRpcmVjdCkKLSAgICogYW5kIHRoZSBjYXBhYmlsaXRpZXMgb2YgdGhlIHBsYXRmb3JtLgotICAgKgotICAgKiBAcGFyYW0gaW4gdGhlIHNvdXJjZSBzdHJpbmcgdG8gYmUgZW5jb2RlZAotICAgKiBAcGFyYW0gb3V0IHRoZSB0YXJnZXQgYnVmZmVyIHRvIHJlY2VpdmUgdGhlIGVuY29kZWQgc3RyaW5nLgotICAgKiBAc2VlIFV0ZjgjZW5jb2RlKENoYXJTZXF1ZW5jZSwgYnl0ZVtdLCBpbnQsIGludCkKLSAgICovCi0gIHN0YXRpYyB2b2lkIGVuY29kZVV0ZjgoQ2hhclNlcXVlbmNlIGluLCBCeXRlQnVmZmVyIG91dCkgewotICAgIHByb2Nlc3Nvci5lbmNvZGVVdGY4KGluLCBvdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvdW50cyAoYXBwcm94aW1hdGVseSkgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBBU0NJSSBjaGFyYWN0ZXJzIGluIHRoZSBnaXZlbiBidWZmZXIuCi0gICAqIFRoZSBieXRlIG9yZGVyIG9mIHRoZSB7QGxpbmsgQnl0ZUJ1ZmZlcn0gZG9lcyBub3QgbWF0dGVyLCBzbyBwZXJmb3JtYW5jZSBjYW4gYmUgaW1wcm92ZWQgaWYKLSAgICogbmF0aXZlIGJ5dGUgb3JkZXIgaXMgdXNlZCAoaS5lLiBubyBieXRlLXN3YXBwaW5nIGluIHtAbGluayBCeXRlQnVmZmVyI2dldExvbmcoaW50KX0pLgotICAgKgotICAgKiBAcGFyYW0gYnVmZmVyIHRoZSBidWZmZXIgdG8gYmUgc2Nhbm5lZCBmb3IgQVNDSUkgY2hhcnMKLSAgICogQHBhcmFtIGluZGV4IHRoZSBzdGFydGluZyBpbmRleCBvZiB0aGUgc2NhbgotICAgKiBAcGFyYW0gbGltaXQgdGhlIGxpbWl0IHdpdGhpbiBidWZmZXIgZm9yIHRoZSBzY2FuCi0gICAqIEByZXR1cm4gdGhlIG51bWJlciBvZiBBU0NJSSBjaGFyYWN0ZXJzIGZvdW5kLiBUaGUgc3RvcHBpbmcgcG9zaXRpb24gd2lsbCBiZSBhdCBvcgotICAgKiBiZWZvcmUgdGhlIGZpcnN0IG5vbi1BU0NJSSBieXRlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGVzdGltYXRlQ29uc2VjdXRpdmVBc2NpaShCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IGluZGV4LCBpbnQgbGltaXQpIHsKLSAgICBpbnQgaSA9IGluZGV4OwotICAgIGZpbmFsIGludCBsaW0gPSBsaW1pdCAtIDc7Ci0gICAgLy8gVGhpcyBzaW1wbGUgbG9vcCBzdG9wcyB3aGVuIHdlIGVuY291bnRlciBhIGJ5dGUgPj0gMHg4MCAoaS5lLiBub24tQVNDSUkpLgotICAgIC8vIFRvIHNwZWVkIHRoaW5ncyB1cCBmdXJ0aGVyLCB3ZSdyZSByZWFkaW5nIGxvbmdzIGluc3RlYWQgb2YgYnl0ZXMgc28gd2UgdXNlIGEgbWFzayB0bwotICAgIC8vIGRldGVybWluZSBpZiBhbnkgYnl0ZSBpbiB0aGUgY3VycmVudCBsb25nIGlzIG5vbi1BU0NJSS4KLSAgICBmb3IgKDsgaSA8IGxpbSAmJiAoYnVmZmVyLmdldExvbmcoaSkgJiBBU0NJSV9NQVNLX0xPTkcpID09IDA7IGkgKz0gOCkge30KLSAgICByZXR1cm4gaSAtIGluZGV4OwotICB9Ci0KLSAgLyoqCi0gICAqIEEgcHJvY2Vzc29yIG9mIFVURi04IHN0cmluZ3MsIHByb3ZpZGluZyBtZXRob2RzIGZvciBjaGVja2luZyB2YWxpZGl0eSBhbmQgZW5jb2RpbmcuCi0gICAqLwotICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBBZGQgc3VwcG9ydCBmb3IgTWVtb3J5L01lbW9yeUJsb2NrIG9uIEFuZHJvaWQuCi0gIGFic3RyYWN0IHN0YXRpYyBjbGFzcyBQcm9jZXNzb3IgewotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlIGlzIGEKLSAgICAgKiB3ZWxsLWZvcm1lZCBVVEYtOCBieXRlIHNlcXVlbmNlLiAgVGhlIHJhbmdlIG9mIGJ5dGVzIHRvIGJlCi0gICAgICogY2hlY2tlZCBleHRlbmRzIGZyb20gaW5kZXgge0Bjb2RlIGluZGV4fSwgaW5jbHVzaXZlLCB0byB7QGNvZGUKLSAgICAgKiBsaW1pdH0sIGV4Y2x1c2l2ZS4KLSAgICAgKgotICAgICAqIDxwPlRoaXMgaXMgYSBjb252ZW5pZW5jZSBtZXRob2QsIGVxdWl2YWxlbnQgdG8ge0Bjb2RlCi0gICAgICogcGFydGlhbElzVmFsaWRVdGY4KGJ5dGVzLCBpbmRleCwgbGltaXQpID09IFV0ZjguQ09NUExFVEV9LgotICAgICAqLwotICAgIGZpbmFsIGJvb2xlYW4gaXNWYWxpZFV0ZjgoYnl0ZVtdIGJ5dGVzLCBpbnQgaW5kZXgsIGludCBsaW1pdCkgewotICAgICAgcmV0dXJuIHBhcnRpYWxJc1ZhbGlkVXRmOChDT01QTEVURSwgYnl0ZXMsIGluZGV4LCBsaW1pdCkgPT0gQ09NUExFVEU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGVsbHMgd2hldGhlciB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBzbGljZSBpcyBhIHdlbGwtZm9ybWVkLAotICAgICAqIG1hbGZvcm1lZCwgb3IgaW5jb21wbGV0ZSBVVEYtOCBieXRlIHNlcXVlbmNlLiAgVGhlIHJhbmdlIG9mIGJ5dGVzCi0gICAgICogdG8gYmUgY2hlY2tlZCBleHRlbmRzIGZyb20gaW5kZXgge0Bjb2RlIGluZGV4fSwgaW5jbHVzaXZlLCB0bwotICAgICAqIHtAY29kZSBsaW1pdH0sIGV4Y2x1c2l2ZS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBzdGF0ZSBlaXRoZXIge0BsaW5rIFV0ZjgjQ09NUExFVEV9IChpZiB0aGlzIGlzIHRoZSBpbml0aWFsIGRlY29kaW5nCi0gICAgICogb3BlcmF0aW9uKSBvciB0aGUgdmFsdWUgcmV0dXJuZWQgZnJvbSBhIGNhbGwgdG8gYSBwYXJ0aWFsIGRlY29kaW5nIG1ldGhvZAotICAgICAqIGZvciB0aGUgcHJldmlvdXMgYnl0ZXMKLSAgICAgKgotICAgICAqIEByZXR1cm4ge0BsaW5rICNNQUxGT1JNRUR9IGlmIHRoZSBwYXJ0aWFsIGJ5dGUgc2VxdWVuY2UgaXMKLSAgICAgKiBkZWZpbml0ZWx5IG5vdCB3ZWxsLWZvcm1lZCwge0BsaW5rICNDT01QTEVURX0gaWYgaXQgaXMgd2VsbC1mb3JtZWQKLSAgICAgKiAobm8gYWRkaXRpb25hbCBpbnB1dCBuZWVkZWQpLCBvciBpZiB0aGUgYnl0ZSBzZXF1ZW5jZSBpcwotICAgICAqICJpbmNvbXBsZXRlIiwgaS5lLiBhcHBhcmVudGx5IHRlcm1pbmF0ZWQgaW4gdGhlIG1pZGRsZSBvZiBhIGNoYXJhY3RlciwKLSAgICAgKiBhbiBvcGFxdWUgaW50ZWdlciAic3RhdGUiIHZhbHVlIGNvbnRhaW5pbmcgZW5vdWdoIGluZm9ybWF0aW9uIHRvCi0gICAgICogZGVjb2RlIHRoZSBjaGFyYWN0ZXIgd2hlbiBwYXNzZWQgdG8gYSBzdWJzZXF1ZW50IGludm9jYXRpb24gb2YgYQotICAgICAqIHBhcnRpYWwgZGVjb2RpbmcgbWV0aG9kLgotICAgICAqLwotICAgIGFic3RyYWN0IGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoaW50IHN0YXRlLCBieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KTsKLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBnaXZlbiBwb3J0aW9uIG9mIHRoZSB7QGxpbmsgQnl0ZUJ1ZmZlcn0gaXMgYQotICAgICAqIHdlbGwtZm9ybWVkIFVURi04IGJ5dGUgc2VxdWVuY2UuICBUaGUgcmFuZ2Ugb2YgYnl0ZXMgdG8gYmUKLSAgICAgKiBjaGVja2VkIGV4dGVuZHMgZnJvbSBpbmRleCB7QGNvZGUgaW5kZXh9LCBpbmNsdXNpdmUsIHRvIHtAY29kZQotICAgICAqIGxpbWl0fSwgZXhjbHVzaXZlLgotICAgICAqCi0gICAgICogPHA+VGhpcyBpcyBhIGNvbnZlbmllbmNlIG1ldGhvZCwgZXF1aXZhbGVudCB0byB7QGNvZGUKLSAgICAgKiBwYXJ0aWFsSXNWYWxpZFV0ZjgoYnl0ZXMsIGluZGV4LCBsaW1pdCkgPT0gVXRmOC5DT01QTEVURX0uCi0gICAgICovCi0gICAgZmluYWwgYm9vbGVhbiBpc1ZhbGlkVXRmOChCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IGluZGV4LCBpbnQgbGltaXQpIHsKLSAgICAgIHJldHVybiBwYXJ0aWFsSXNWYWxpZFV0ZjgoQ09NUExFVEUsIGJ1ZmZlciwgaW5kZXgsIGxpbWl0KSA9PSBDT01QTEVURTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlIGdpdmVuIGJ1ZmZlciBjb250YWlucyBhIHZhbGlkIFVURi04IHN0cmluZy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBidWZmZXIgdGhlIGJ1ZmZlciB0byBjaGVjay4KLSAgICAgKiBAcmV0dXJuIHtAY29kZSB0cnVlfSBpZiB0aGUgZ2l2ZW4gYnVmZmVyIGNvbnRhaW5zIGEgdmFsaWQgVVRGLTggc3RyaW5nLgotICAgICAqLwotICAgIGZpbmFsIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoCi0gICAgICAgIGZpbmFsIGludCBzdGF0ZSwgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBpbmRleCwgZmluYWwgaW50IGxpbWl0KSB7Ci0gICAgICBpZiAoYnVmZmVyLmhhc0FycmF5KCkpIHsKLSAgICAgICAgZmluYWwgaW50IG9mZnNldCA9IGJ1ZmZlci5hcnJheU9mZnNldCgpOwotICAgICAgICByZXR1cm4gcGFydGlhbElzVmFsaWRVdGY4KHN0YXRlLCBidWZmZXIuYXJyYXkoKSwgb2Zmc2V0ICsgaW5kZXgsIG9mZnNldCArIGxpbWl0KTsKLSAgICAgIH0gZWxzZSBpZiAoYnVmZmVyLmlzRGlyZWN0KCkpewotICAgICAgICByZXR1cm4gcGFydGlhbElzVmFsaWRVdGY4RGlyZWN0KHN0YXRlLCBidWZmZXIsIGluZGV4LCBsaW1pdCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcGFydGlhbElzVmFsaWRVdGY4RGVmYXVsdChzdGF0ZSwgYnVmZmVyLCBpbmRleCwgbGltaXQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHZhbGlkYXRpb24gZm9yIGRpcmVjdCB7QGxpbmsgQnl0ZUJ1ZmZlcn0gaW5zdGFuY2VzLgotICAgICAqLwotICAgIGFic3RyYWN0IGludCBwYXJ0aWFsSXNWYWxpZFV0ZjhEaXJlY3QoCi0gICAgICAgIGZpbmFsIGludCBzdGF0ZSwgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBpbmRleCwgZmluYWwgaW50IGxpbWl0KTsKLQotICAgIC8qKgotICAgICAqIFBlcmZvcm1zIHZhbGlkYXRpb24gZm9yIHtAbGluayBCeXRlQnVmZmVyfSBpbnN0YW5jZXMgdXNpbmcgdGhlIHtAbGluayBCeXRlQnVmZmVyfSBBUEkgcmF0aGVyCi0gICAgICogdGhhbiBwb3RlbnRpYWxseSBmYXN0ZXIgYXBwcm9hY2hlcy4gVGhpcyBmaXJzdCBjb21wbGV0ZXMgdmFsaWRhdGlvbiBmb3IgdGhlIGN1cnJlbnQKLSAgICAgKiBjaGFyYWN0ZXIgKHByb3ZpZGVkIGJ5IHtAY29kZSBzdGF0ZX0pIGFuZCB0aGVuIGZpbmlzaGVzIHZhbGlkYXRpb24gZm9yIHRoZSBzZXF1ZW5jZS4KLSAgICAgKi8KLSAgICBmaW5hbCBpbnQgcGFydGlhbElzVmFsaWRVdGY4RGVmYXVsdCgKLSAgICAgICAgZmluYWwgaW50IHN0YXRlLCBmaW5hbCBCeXRlQnVmZmVyIGJ1ZmZlciwgaW50IGluZGV4LCBmaW5hbCBpbnQgbGltaXQpIHsKLSAgICAgIGlmIChzdGF0ZSAhPSBDT01QTEVURSkgewotICAgICAgICAvLyBUaGUgcHJldmlvdXMgZGVjb2Rpbmcgb3BlcmF0aW9uIHdhcyBpbmNvbXBsZXRlIChvciBtYWxmb3JtZWQpLgotICAgICAgICAvLyBXZSBsb29rIGZvciBhIHdlbGwtZm9ybWVkIHNlcXVlbmNlIGNvbnNpc3Rpbmcgb2YgYnl0ZXMgZnJvbQotICAgICAgICAvLyB0aGUgcHJldmlvdXMgZGVjb2Rpbmcgb3BlcmF0aW9uIChzdG9yZWQgaW4gc3RhdGUpIHRvZ2V0aGVyCi0gICAgICAgIC8vIHdpdGggYnl0ZXMgZnJvbSB0aGUgYXJyYXkgc2xpY2UuCi0gICAgICAgIC8vCi0gICAgICAgIC8vIFdlIGV4cGVjdCBzdWNoICJzdHJhZGRsZXIgY2hhcmFjdGVycyIgdG8gYmUgcmFyZS4KLQotICAgICAgICBpZiAoaW5kZXggPj0gbGltaXQpIHsgLy8gTm8gYnl0ZXM/IE5vIHByb2dyZXNzLgotICAgICAgICAgIHJldHVybiBzdGF0ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGJ5dGUgYnl0ZTEgPSAoYnl0ZSkgc3RhdGU7Ci0gICAgICAgIC8vIGJ5dGUxIGlzIG5ldmVyIEFTQ0lJLgotICAgICAgICBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhFMCkgewotICAgICAgICAgIC8vIHR3by1ieXRlIGZvcm0KLQotICAgICAgICAgIC8vIFNpbXVsdGFuZW91c2x5IGNoZWNrcyBmb3IgaWxsZWdhbCB0cmFpbGluZy1ieXRlIGluCi0gICAgICAgICAgLy8gbGVhZGluZyBwb3NpdGlvbiBhbmQgb3ZlcmxvbmcgMi1ieXRlIGZvcm0uCi0gICAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4QzIKLSAgICAgICAgICAgICAgLy8gYnl0ZTIgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IGJ1ZmZlci5nZXQoaW5kZXgrKykgPiAoYnl0ZSkgMHhCRikgewotICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhGMCkgewotICAgICAgICAgIC8vIHRocmVlLWJ5dGUgZm9ybQotCi0gICAgICAgICAgLy8gR2V0IGJ5dGUyIGZyb20gc2F2ZWQgc3RhdGUgb3IgYXJyYXkKLSAgICAgICAgICBieXRlIGJ5dGUyID0gKGJ5dGUpIH4oc3RhdGUgPj4gOCk7Ci0gICAgICAgICAgaWYgKGJ5dGUyID09IDApIHsKLSAgICAgICAgICAgIGJ5dGUyID0gYnVmZmVyLmdldChpbmRleCsrKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgewotICAgICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChieXRlMiA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIG92ZXJsb25nPyA1IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBtdXN0IG5vdCBhbGwgYmUgemVybwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RTAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHhBMCkKLSAgICAgICAgICAgICAgLy8gaWxsZWdhbCBzdXJyb2dhdGUgY29kZXBvaW50PwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RUQgJiYgYnl0ZTIgPj0gKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBidWZmZXIuZ2V0KGluZGV4KyspID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIGZvdXItYnl0ZSBmb3JtCi0KLSAgICAgICAgICAvLyBHZXQgYnl0ZTIgYW5kIGJ5dGUzIGZyb20gc2F2ZWQgc3RhdGUgb3IgYXJyYXkKLSAgICAgICAgICBieXRlIGJ5dGUyID0gKGJ5dGUpIH4oc3RhdGUgPj4gOCk7Ci0gICAgICAgICAgYnl0ZSBieXRlMyA9IDA7Ci0gICAgICAgICAgaWYgKGJ5dGUyID09IDApIHsKLSAgICAgICAgICAgIGJ5dGUyID0gYnVmZmVyLmdldChpbmRleCsrKTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgewotICAgICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ5dGUzID0gKGJ5dGUpIChzdGF0ZSA+PiAxNik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChieXRlMyA9PSAwKSB7Ci0gICAgICAgICAgICBieXRlMyA9IGJ1ZmZlci5nZXQoaW5kZXgrKyk7Ci0gICAgICAgICAgICBpZiAoaW5kZXggPj0gbGltaXQpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSwgYnl0ZTIsIGJ5dGUzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBJZiB3ZSB3ZXJlIGNhbGxlZCB3aXRoIHN0YXRlID09IE1BTEZPUk1FRCwgdGhlbiBieXRlMSBpcyAweEZGLAotICAgICAgICAgIC8vIHdoaWNoIG5ldmVyIG9jY3VycyBpbiB3ZWxsLWZvcm1lZCBVVEYtOCwgYW5kIHNvIHdlIHdpbGwgcmV0dXJuCi0gICAgICAgICAgLy8gTUFMRk9STUVEIGFnYWluIGJlbG93LgotCi0gICAgICAgICAgaWYgKGJ5dGUyID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCAxIDw9IHBsYW5lIDw9IDE2LiAgVHJpY2t5IG9wdGltaXplZCBmb3JtIG9mOgotICAgICAgICAgICAgICAvLyBpZiAoYnl0ZTEgPiAoYnl0ZSkgMHhGNCB8fAotICAgICAgICAgICAgICAvLyAgICAgYnl0ZTEgPT0gKGJ5dGUpIDB4RjAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHg5MCB8fAotICAgICAgICAgICAgICAvLyAgICAgYnl0ZTEgPT0gKGJ5dGUpIDB4RjQgJiYgYnl0ZTIgPiAoYnl0ZSkgMHg4RikKLSAgICAgICAgICAgICAgfHwgKCgoYnl0ZTEgPDwgMjgpICsgKGJ5dGUyIC0gKGJ5dGUpIDB4OTApKSA+PiAzMCkgIT0gMAotICAgICAgICAgICAgICAvLyBieXRlMyB0cmFpbGluZy1ieXRlIHRlc3QKLSAgICAgICAgICAgICAgfHwgYnl0ZTMgPiAoYnl0ZSkgMHhCRgotICAgICAgICAgICAgICAvLyBieXRlNCB0cmFpbGluZy1ieXRlIHRlc3QKLSAgICAgICAgICAgICAgfHwgYnVmZmVyLmdldChpbmRleCsrKSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBGaW5pc2ggdmFsaWRhdGlvbiBmb3IgdGhlIHNlcXVlbmNlLgotICAgICAgcmV0dXJuIHBhcnRpYWxJc1ZhbGlkVXRmOChidWZmZXIsIGluZGV4LCBsaW1pdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGVyZm9ybXMgdmFsaWRhdGlvbiBmb3Ige0BsaW5rIEJ5dGVCdWZmZXJ9IGluc3RhbmNlcyB1c2luZyB0aGUge0BsaW5rIEJ5dGVCdWZmZXJ9IEFQSSByYXRoZXIKLSAgICAgKiB0aGFuIHBvdGVudGlhbGx5IGZhc3RlciBhcHByb2FjaGVzLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXIsIGludCBpbmRleCwgZmluYWwgaW50IGxpbWl0KSB7Ci0gICAgICBpbmRleCArPSBlc3RpbWF0ZUNvbnNlY3V0aXZlQXNjaWkoYnVmZmVyLCBpbmRleCwgbGltaXQpOwotCi0gICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIC8vIE9wdGltaXplIGZvciBpbnRlcmlvciBydW5zIG9mIEFTQ0lJIGJ5dGVzLgotICAgICAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBDb25zaWRlciBjaGVja2luZyA4IGJ5dGVzIGF0IGEgdGltZSBhZnRlciBzb21lIHRocmVzaG9sZD8KLSAgICAgICAgLy8gTWF5YmUgYWZ0ZXIgc2VlaW5nIGEgZmV3IGluIGEgcm93IHRoYXQgYXJlIEFTQ0lJLCBnbyBiYWNrIHRvIGZhc3QgbW9kZT8KLSAgICAgICAgaW50IGJ5dGUxOwotICAgICAgICBkbyB7Ci0gICAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0KSB7Ci0gICAgICAgICAgICByZXR1cm4gQ09NUExFVEU7Ci0gICAgICAgICAgfQotICAgICAgICB9IHdoaWxlICgoYnl0ZTEgPSBidWZmZXIuZ2V0KGluZGV4KyspKSA+PSAwKTsKLQotICAgICAgICAvLyBJZiB3ZSdyZSBoZXJlIGJ5dGUxIGlzIG5vdCBBU0NJSS4gT25seSBuZWVkIHRvIGhhbmRsZSAyLTQgYnl0ZSBmb3Jtcy4KLSAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4RTApIHsKLSAgICAgICAgICAvLyBUd28tYnl0ZSBmb3JtICgxMTB4eHh4eCAxMHh4eHh4eCkKLSAgICAgICAgICBpZiAoaW5kZXggPj0gbGltaXQpIHsKLSAgICAgICAgICAgIC8vIEluY29tcGxldGUgc2VxdWVuY2UKLSAgICAgICAgICAgIHJldHVybiBieXRlMTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBTaW11bHRhbmVvdXNseSBjaGVja3MgZm9yIGlsbGVnYWwgdHJhaWxpbmctYnl0ZSBpbgotICAgICAgICAgIC8vIGxlYWRpbmcgcG9zaXRpb24gYW5kIG92ZXJsb25nIDItYnl0ZSBmb3JtLgotICAgICAgICAgIGlmIChieXRlMSA8IChieXRlKSAweEMyIHx8IGJ1ZmZlci5nZXQoaW5kZXgpID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICAgIGluZGV4Kys7Ci0gICAgICAgIH0gZWxzZSBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhGMCkgewotICAgICAgICAgIC8vIFRocmVlLWJ5dGUgZm9ybSAoMTExMHh4eHggMTB4eHh4eHggMTB4eHh4eHgpCi0gICAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0IC0gMSkgewotICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihidWZmZXIsIGJ5dGUxLCBpbmRleCwgbGltaXQgLSBpbmRleCk7Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgZmluYWwgYnl0ZSBieXRlMiA9IGJ1ZmZlci5nZXQoaW5kZXgrKyk7Ci0gICAgICAgICAgaWYgKGJ5dGUyID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gb3Zlcmxvbmc/IDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG11c3Qgbm90IGFsbCBiZSB6ZXJvCi0gICAgICAgICAgICAgIHx8IChieXRlMSA9PSAoYnl0ZSkgMHhFMCAmJiBieXRlMiA8IChieXRlKSAweEEwKQotICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBzdXJyb2dhdGUgY29kZXBvaW50cwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RUQgJiYgYnl0ZTIgPj0gKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBidWZmZXIuZ2V0KGluZGV4KSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbmRleCsrOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIEZvdXItYnl0ZSBmb3JtICgxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eCkKLSAgICAgICAgICBpZiAoaW5kZXggPj0gbGltaXQgLSAyKSB7Ci0gICAgICAgICAgICAvLyBJbmNvbXBsZXRlIHNlcXVlbmNlCi0gICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ1ZmZlciwgYnl0ZTEsIGluZGV4LCBsaW1pdCAtIGluZGV4KTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBDb25zaWRlciB1c2luZyBnZXRJbnQoKSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgotICAgICAgICAgIGZpbmFsIGludCBieXRlMiA9IGJ1ZmZlci5nZXQoaW5kZXgrKyk7Ci0gICAgICAgICAgaWYgKGJ5dGUyID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCAxIDw9IHBsYW5lIDw9IDE2LiAgVHJpY2t5IG9wdGltaXplZCBmb3JtIG9mOgotICAgICAgICAgICAgICAvLyBpZiAoYnl0ZTEgPiAoYnl0ZSkgMHhGNCB8fAotICAgICAgICAgICAgICAvLyAgICAgYnl0ZTEgPT0gKGJ5dGUpIDB4RjAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHg5MCB8fAotICAgICAgICAgICAgICAvLyAgICAgYnl0ZTEgPT0gKGJ5dGUpIDB4RjQgJiYgYnl0ZTIgPiAoYnl0ZSkgMHg4RikKLSAgICAgICAgICAgICAgfHwgKCgoYnl0ZTEgPDwgMjgpICsgKGJ5dGUyIC0gKGJ5dGUpIDB4OTApKSA+PiAzMCkgIT0gMAotICAgICAgICAgICAgICAvLyBieXRlMyB0cmFpbGluZy1ieXRlIHRlc3QKLSAgICAgICAgICAgICAgfHwgYnVmZmVyLmdldChpbmRleCsrKSA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIGJ5dGU0IHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBidWZmZXIuZ2V0KGluZGV4KyspID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyBhbiBpbnB1dCBjaGFyYWN0ZXIgc2VxdWVuY2UgKHtAY29kZSBpbn0pIHRvIFVURi04IGluIHRoZSB0YXJnZXQgYXJyYXkgKHtAY29kZSBvdXR9KS4KLSAgICAgKiBGb3IgYSBzdHJpbmcsIHRoaXMgbWV0aG9kIGlzIHNpbWlsYXIgdG8KLSAgICAgKiA8cHJlPntAY29kZQotICAgICAqIGJ5dGVbXSBhID0gc3RyaW5nLmdldEJ5dGVzKFVURl84KTsKLSAgICAgKiBTeXN0ZW0uYXJyYXljb3B5KGEsIDAsIGJ5dGVzLCBvZmZzZXQsIGEubGVuZ3RoKTsKLSAgICAgKiByZXR1cm4gb2Zmc2V0ICsgYS5sZW5ndGg7Ci0gICAgICogfTwvcHJlPgotICAgICAqCi0gICAgICogYnV0IGlzIG1vcmUgZWZmaWNpZW50IGluIGJvdGggdGltZSBhbmQgc3BhY2UuIE9uZSBrZXkgZGlmZmVyZW5jZSBpcyB0aGF0IHRoaXMgbWV0aG9kCi0gICAgICogcmVxdWlyZXMgcGFpcmVkIHN1cnJvZ2F0ZXMsIGFuZCB0aGVyZWZvcmUgZG9lcyBub3Qgc3VwcG9ydCBjaHVua2luZy4KLSAgICAgKiBXaGlsZSB7QGNvZGUgU3RyaW5nLmdldEJ5dGVzKFVURl84KX0gcmVwbGFjZXMgdW5wYWlyZWQgc3Vycm9nYXRlcyB3aXRoIHRoZSBkZWZhdWx0Ci0gICAgICogcmVwbGFjZW1lbnQgY2hhcmFjdGVyLCB0aGlzIG1ldGhvZCB0aHJvd3Mge0BsaW5rIFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9ufS4KLSAgICAgKgotICAgICAqIDxwPlRvIGVuc3VyZSBzdWZmaWNpZW50IHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBlaXRoZXIgY2FsbCB7QGxpbmsgI2VuY29kZWRMZW5ndGh9IHRvCi0gICAgICogY29tcHV0ZSB0aGUgZXhhY3QgYW1vdW50IG5lZWRlZCwgb3IgbGVhdmUgcm9vbSBmb3IgCi0gICAgICoge0Bjb2RlIFV0ZjguTUFYX0JZVEVTX1BFUl9DSEFSICogc2VxdWVuY2UubGVuZ3RoKCl9LCB3aGljaCBpcyB0aGUgbGFyZ2VzdCBwb3NzaWJsZSBudW1iZXIKLSAgICAgKiBvZiBieXRlcyB0aGF0IGFueSBpbnB1dCBjYW4gYmUgZW5jb2RlZCB0by4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIGJlIGVuY29kZWQKLSAgICAgKiBAcGFyYW0gb3V0IHRoZSB0YXJnZXQgYXJyYXkKLSAgICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBzdGFydGluZyBvZmZzZXQgaW4ge0Bjb2RlIGJ5dGVzfSB0byBzdGFydCB3cml0aW5nIGF0Ci0gICAgICogQHBhcmFtIGxlbmd0aCB0aGUgbGVuZ3RoIG9mIHRoZSB7QGNvZGUgYnl0ZXN9LCBzdGFydGluZyBmcm9tIHtAY29kZSBvZmZzZXR9Ci0gICAgICogQHRocm93cyBVbnBhaXJlZFN1cnJvZ2F0ZUV4Y2VwdGlvbiBpZiB7QGNvZGUgc2VxdWVuY2V9IGNvbnRhaW5zIGlsbC1mb3JtZWQgVVRGLTE2ICh1bnBhaXJlZAotICAgICAqICAgICBzdXJyb2dhdGVzKQotICAgICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGlmIHtAY29kZSBzZXF1ZW5jZX0gZW5jb2RlZCBpbiBVVEYtOCBpcyBsb25nZXIgdGhhbgotICAgICAqICAgICB7QGNvZGUgYnl0ZXMubGVuZ3RoIC0gb2Zmc2V0fQotICAgICAqIEByZXR1cm4gdGhlIG5ldyBvZmZzZXQsIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIG9mZnNldCArIFV0ZjguZW5jb2RlZExlbmd0aChzZXF1ZW5jZSl9Ci0gICAgICovCi0gICAgYWJzdHJhY3QgaW50IGVuY29kZVV0ZjgoQ2hhclNlcXVlbmNlIGluLCBieXRlW10gb3V0LCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKTsKLQotICAgIC8qKgotICAgICAqIEVuY29kZXMgYW4gaW5wdXQgY2hhcmFjdGVyIHNlcXVlbmNlICh7QGNvZGUgaW59KSB0byBVVEYtOCBpbiB0aGUgdGFyZ2V0IGJ1ZmZlciAoe0Bjb2RlIG91dH0pLgotICAgICAqIFVwb24gcmV0dXJuaW5nIGZyb20gdGhpcyBtZXRob2QsIHRoZSB7QGNvZGUgb3V0fSBwb3NpdGlvbiB3aWxsIHBvaW50IHRvIHRoZSBwb3NpdGlvbiBhZnRlcgotICAgICAqIHRoZSBsYXN0IGVuY29kZWQgYnl0ZS4gVGhpcyBtZXRob2QgcmVxdWlyZXMgcGFpcmVkIHN1cnJvZ2F0ZXMsIGFuZCB0aGVyZWZvcmUgZG9lcyBub3QKLSAgICAgKiBzdXBwb3J0IGNodW5raW5nLgotICAgICAqCi0gICAgICogPHA+VG8gZW5zdXJlIHN1ZmZpY2llbnQgc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIsIGVpdGhlciBjYWxsIHtAbGluayAjZW5jb2RlZExlbmd0aH0gdG8KLSAgICAgKiBjb21wdXRlIHRoZSBleGFjdCBhbW91bnQgbmVlZGVkLCBvciBsZWF2ZSByb29tIGZvcgotICAgICAqIHtAY29kZSBVdGY4Lk1BWF9CWVRFU19QRVJfQ0hBUiAqIGluLmxlbmd0aCgpfSwgd2hpY2ggaXMgdGhlIGxhcmdlc3QgcG9zc2libGUgbnVtYmVyCi0gICAgICogb2YgYnl0ZXMgdGhhdCBhbnkgaW5wdXQgY2FuIGJlIGVuY29kZWQgdG8uCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW4gdGhlIHNvdXJjZSBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gYmUgZW5jb2RlZAotICAgICAqIEBwYXJhbSBvdXQgdGhlIHRhcmdldCBidWZmZXIKLSAgICAgKiBAdGhyb3dzIFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uIGlmIHtAY29kZSBpbn0gY29udGFpbnMgaWxsLWZvcm1lZCBVVEYtMTYgKHVucGFpcmVkCi0gICAgICogICAgIHN1cnJvZ2F0ZXMpCi0gICAgICogQHRocm93cyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gaWYge0Bjb2RlIGlufSBlbmNvZGVkIGluIFVURi04IGlzIGxvbmdlciB0aGFuCi0gICAgICogICAgIHtAY29kZSBvdXQucmVtYWluaW5nKCl9Ci0gICAgICovCi0gICAgZmluYWwgdm9pZCBlbmNvZGVVdGY4KENoYXJTZXF1ZW5jZSBpbiwgQnl0ZUJ1ZmZlciBvdXQpIHsKLSAgICAgIGlmIChvdXQuaGFzQXJyYXkoKSkgewotICAgICAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gb3V0LmFycmF5T2Zmc2V0KCk7Ci0gICAgICAgIGludCBlbmRJbmRleCA9Ci0gICAgICAgICAgICBVdGY4LmVuY29kZShpbiwgb3V0LmFycmF5KCksIG9mZnNldCArIG91dC5wb3NpdGlvbigpLCBvdXQucmVtYWluaW5nKCkpOwotICAgICAgICBvdXQucG9zaXRpb24oZW5kSW5kZXggLSBvZmZzZXQpOwotICAgICAgfSBlbHNlIGlmIChvdXQuaXNEaXJlY3QoKSkgewotICAgICAgICBlbmNvZGVVdGY4RGlyZWN0KGluLCBvdXQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZW5jb2RlVXRmOERlZmF1bHQoaW4sIG91dCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRW5jb2RlcyB0aGUgaW5wdXQgY2hhcmFjdGVyIHNlcXVlbmNlIHRvIGEgZGlyZWN0IHtAbGluayBCeXRlQnVmZmVyfSBpbnN0YW5jZS4KLSAgICAgKi8KLSAgICBhYnN0cmFjdCB2b2lkIGVuY29kZVV0ZjhEaXJlY3QoQ2hhclNlcXVlbmNlIGluLCBCeXRlQnVmZmVyIG91dCk7Ci0KLSAgICAvKioKLSAgICAgKiBFbmNvZGVzIHRoZSBpbnB1dCBjaGFyYWN0ZXIgc2VxdWVuY2UgdG8gYSB7QGxpbmsgQnl0ZUJ1ZmZlcn0gaW5zdGFuY2UgdXNpbmcgdGhlIHtAbGluawotICAgICAqIEJ5dGVCdWZmZXJ9IEFQSSwgcmF0aGVyIHRoYW4gcG90ZW50aWFsbHkgZmFzdGVyIGFwcHJvYWNoZXMuCi0gICAgICovCi0gICAgZmluYWwgdm9pZCBlbmNvZGVVdGY4RGVmYXVsdChDaGFyU2VxdWVuY2UgaW4sIEJ5dGVCdWZmZXIgb3V0KSB7Ci0gICAgICBmaW5hbCBpbnQgaW5MZW5ndGggPSBpbi5sZW5ndGgoKTsKLSAgICAgIGludCBvdXRJeCA9IG91dC5wb3NpdGlvbigpOwotICAgICAgaW50IGluSXggPSAwOwotCi0gICAgICAvLyBTaW5jZSBCeXRlQnVmZmVyLnB1dFhYWCgpIGFscmVhZHkgY2hlY2tzIGJvdW5kYXJpZXMgZm9yIHVzLCBubyBuZWVkIHRvIGV4cGxpY2l0bHkgY2hlY2sKLSAgICAgIC8vIGFjY2Vzcy4gQXNzdW1lIHRoZSBidWZmZXIgaXMgYmlnIGVub3VnaCBhbmQgbGV0IGl0IGhhbmRsZSB0aGUgb3V0IG9mIGJvdW5kcyBleGNlcHRpb24KLSAgICAgIC8vIGlmIGl0IG9jY3Vycy4KLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIERlc2lnbmVkIHRvIHRha2UgYWR2YW50YWdlIG9mCi0gICAgICAgIC8vIGh0dHBzOi8vd2lraXMub3JhY2xlLmNvbS9kaXNwbGF5L0hvdFNwb3RJbnRlcm5hbHMvUmFuZ2VDaGVja0VsaW1pbmF0aW9uCi0gICAgICAgIGZvciAoY2hhciBjOyBpbkl4IDwgaW5MZW5ndGggJiYgKGMgPSBpbi5jaGFyQXQoaW5JeCkpIDwgMHg4MDsgKytpbkl4KSB7Ci0gICAgICAgICAgb3V0LnB1dChvdXRJeCArIGluSXgsIChieXRlKSBjKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5JeCA9PSBpbkxlbmd0aCkgewotICAgICAgICAgIC8vIFN1Y2Nlc3NmdWxseSBlbmNvZGVkIHRoZSBlbnRpcmUgc3RyaW5nLgotICAgICAgICAgIG91dC5wb3NpdGlvbihvdXRJeCArIGluSXgpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIG91dEl4ICs9IGluSXg7Ci0gICAgICAgIGZvciAoY2hhciBjOyBpbkl4IDwgaW5MZW5ndGg7ICsraW5JeCwgKytvdXRJeCkgewotICAgICAgICAgIGMgPSBpbi5jaGFyQXQoaW5JeCk7Ci0gICAgICAgICAgaWYgKGMgPCAweDgwKSB7Ci0gICAgICAgICAgICAvLyBPbmUgYnl0ZSAoMHh4eCB4eHh4KQotICAgICAgICAgICAgb3V0LnB1dChvdXRJeCwgKGJ5dGUpIGMpOwotICAgICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7Ci0gICAgICAgICAgICAvLyBUd28gYnl0ZXMgKDExMHggeHh4eCAxMHh4IHh4eHgpCi0KLSAgICAgICAgICAgIC8vIEJlbmNobWFya3Mgc2hvdyBwdXQgcGVyZm9ybXMgYmV0dGVyIHRoYW4gcHV0U2hvcnQgaGVyZSAoZm9yIEhvdFNwb3QpLgotICAgICAgICAgICAgb3V0LnB1dChvdXRJeCsrLCAoYnl0ZSkgKDB4QzAgfCAoYyA+Pj4gNikpKTsKLSAgICAgICAgICAgIG91dC5wdXQob3V0SXgsIChieXRlKSAoMHg4MCB8ICgweDNGICYgYykpKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGMgPCBNSU5fU1VSUk9HQVRFIHx8IE1BWF9TVVJST0dBVEUgPCBjKSB7Ci0gICAgICAgICAgICAvLyBUaHJlZSBieXRlcyAoMTExMCB4eHh4IDEweHggeHh4eCAxMHh4IHh4eHgpCi0gICAgICAgICAgICAvLyBNYXhpbXVtIHNpbmdsZS1jaGFyIGNvZGUgcG9pbnQgaXMgMHhGRkZGLCAxNiBiaXRzLgotCi0gICAgICAgICAgICAvLyBCZW5jaG1hcmtzIHNob3cgcHV0IHBlcmZvcm1zIGJldHRlciB0aGFuIHB1dFNob3J0IGhlcmUgKGZvciBIb3RTcG90KS4KLSAgICAgICAgICAgIG91dC5wdXQob3V0SXgrKywgKGJ5dGUpICgweEUwIHwgKGMgPj4+IDEyKSkpOwotICAgICAgICAgICAgb3V0LnB1dChvdXRJeCsrLCAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIChjID4+PiA2KSkpKTsKLSAgICAgICAgICAgIG91dC5wdXQob3V0SXgsIChieXRlKSAoMHg4MCB8ICgweDNGICYgYykpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gRm91ciBieXRlcyAoMTExMSB4eHh4IDEweHggeHh4eCAxMHh4IHh4eHggMTB4eCB4eHh4KQotCi0gICAgICAgICAgICAvLyBNaW5pbXVtIGNvZGUgcG9pbnQgcmVwcmVzZW50ZWQgYnkgYSBzdXJyb2dhdGUgcGFpciBpcyAweDEwMDAwLCAxNyBiaXRzLCBmb3VyIFVURi04Ci0gICAgICAgICAgICAvLyBieXRlcwotICAgICAgICAgICAgZmluYWwgY2hhciBsb3c7Ci0gICAgICAgICAgICBpZiAoaW5JeCArIDEgPT0gaW5MZW5ndGggfHwgIWlzU3Vycm9nYXRlUGFpcihjLCAobG93ID0gaW4uY2hhckF0KCsraW5JeCkpKSkgewotICAgICAgICAgICAgICB0aHJvdyBuZXcgVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24oaW5JeCwgaW5MZW5ndGgpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogQ29uc2lkZXIgdXNpbmcgcHV0SW50KCkgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZS4KLSAgICAgICAgICAgIGludCBjb2RlUG9pbnQgPSB0b0NvZGVQb2ludChjLCBsb3cpOwotICAgICAgICAgICAgb3V0LnB1dChvdXRJeCsrLCAoYnl0ZSkgKCgweEYgPDwgNCkgfCAoY29kZVBvaW50ID4+PiAxOCkpKTsKLSAgICAgICAgICAgIG91dC5wdXQob3V0SXgrKywgKGJ5dGUpICgweDgwIHwgKDB4M0YgJiAoY29kZVBvaW50ID4+PiAxMikpKSk7Ci0gICAgICAgICAgICBvdXQucHV0KG91dEl4KyssIChieXRlKSAoMHg4MCB8ICgweDNGICYgKGNvZGVQb2ludCA+Pj4gNikpKSk7Ci0gICAgICAgICAgICBvdXQucHV0KG91dEl4LCAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGNvZGVQb2ludCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBTdWNjZXNzZnVsbHkgZW5jb2RlZCB0aGUgZW50aXJlIHN0cmluZy4KLSAgICAgICAgb3V0LnBvc2l0aW9uKG91dEl4KTsKLSAgICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBUT0RPKG5hdGhhbm1pdHRsZXIpOiBDb25zaWRlciBtYWtpbmcgdGhlIEFQSSB0aHJvdyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGluc3RlYWQuCi0KLSAgICAgICAgLy8gSWYgd2UgZmFpbGVkIGluIHRoZSBvdXRlciBBU0NJSSBsb29wLCBvdXRJeCB3aWxsIG5vdCBoYXZlIGJlZW4gdXBkYXRlZC4gSW4gdGhpcyBjYXNlLAotICAgICAgICAvLyB1c2UgaW5JeCB0byBkZXRlcm1pbmUgdGhlIGJhZCB3cml0ZSBpbmRleC4KLSAgICAgICAgaW50IGJhZFdyaXRlSW5kZXggPSBvdXQucG9zaXRpb24oKSArIE1hdGgubWF4KGluSXgsIG91dEl4IC0gb3V0LnBvc2l0aW9uKCkgKyAxKTsKLSAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICJGYWlsZWQgd3JpdGluZyAiICsgaW4uY2hhckF0KGluSXgpICsgIiBhdCBpbmRleCAiICsgYmFkV3JpdGVJbmRleCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHtAbGluayBQcm9jZXNzb3J9IGltcGxlbWVudGF0aW9uIHRoYXQgZG9lcyBub3QgdXNlIGFueSB7QGNvZGUgc3VuLm1pc2MuVW5zYWZlfSBtZXRob2RzLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGNsYXNzIFNhZmVQcm9jZXNzb3IgZXh0ZW5kcyBQcm9jZXNzb3IgewotICAgIEBPdmVycmlkZQotICAgIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoaW50IHN0YXRlLCBieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KSB7Ci0gICAgICBpZiAoc3RhdGUgIT0gQ09NUExFVEUpIHsKLSAgICAgICAgLy8gVGhlIHByZXZpb3VzIGRlY29kaW5nIG9wZXJhdGlvbiB3YXMgaW5jb21wbGV0ZSAob3IgbWFsZm9ybWVkKS4KLSAgICAgICAgLy8gV2UgbG9vayBmb3IgYSB3ZWxsLWZvcm1lZCBzZXF1ZW5jZSBjb25zaXN0aW5nIG9mIGJ5dGVzIGZyb20KLSAgICAgICAgLy8gdGhlIHByZXZpb3VzIGRlY29kaW5nIG9wZXJhdGlvbiAoc3RvcmVkIGluIHN0YXRlKSB0b2dldGhlcgotICAgICAgICAvLyB3aXRoIGJ5dGVzIGZyb20gdGhlIGFycmF5IHNsaWNlLgotICAgICAgICAvLwotICAgICAgICAvLyBXZSBleHBlY3Qgc3VjaCAic3RyYWRkbGVyIGNoYXJhY3RlcnMiIHRvIGJlIHJhcmUuCi0KLSAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0KSB7ICAvLyBObyBieXRlcz8gTm8gcHJvZ3Jlc3MuCi0gICAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgICAgICB9Ci0gICAgICAgIGludCBieXRlMSA9IChieXRlKSBzdGF0ZTsKLSAgICAgICAgLy8gYnl0ZTEgaXMgbmV2ZXIgQVNDSUkuCi0gICAgICAgIGlmIChieXRlMSA8IChieXRlKSAweEUwKSB7Ci0gICAgICAgICAgLy8gdHdvLWJ5dGUgZm9ybQotCi0gICAgICAgICAgLy8gU2ltdWx0YW5lb3VzbHkgY2hlY2tzIGZvciBpbGxlZ2FsIHRyYWlsaW5nLWJ5dGUgaW4KLSAgICAgICAgICAvLyBsZWFkaW5nIHBvc2l0aW9uIGFuZCBvdmVybG9uZyAyLWJ5dGUgZm9ybS4KLSAgICAgICAgICBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhDMgotICAgICAgICAgICAgICAvLyBieXRlMiB0cmFpbGluZy1ieXRlIHRlc3QKLSAgICAgICAgICAgICAgfHwgYnl0ZXNbaW5kZXgrK10gPiAoYnl0ZSkgMHhCRikgewotICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhGMCkgewotICAgICAgICAgIC8vIHRocmVlLWJ5dGUgZm9ybQotCi0gICAgICAgICAgLy8gR2V0IGJ5dGUyIGZyb20gc2F2ZWQgc3RhdGUgb3IgYXJyYXkKLSAgICAgICAgICBpbnQgYnl0ZTIgPSAoYnl0ZSkgfihzdGF0ZSA+PiA4KTsKLSAgICAgICAgICBpZiAoYnl0ZTIgPT0gMCkgewotICAgICAgICAgICAgYnl0ZTIgPSBieXRlc1tpbmRleCsrXTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgewotICAgICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChieXRlMiA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIG92ZXJsb25nPyA1IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBtdXN0IG5vdCBhbGwgYmUgemVybwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RTAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHhBMCkKLSAgICAgICAgICAgICAgLy8gaWxsZWdhbCBzdXJyb2dhdGUgY29kZXBvaW50PwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RUQgJiYgYnl0ZTIgPj0gKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBieXRlc1tpbmRleCsrXSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBmb3VyLWJ5dGUgZm9ybQotCi0gICAgICAgICAgLy8gR2V0IGJ5dGUyIGFuZCBieXRlMyBmcm9tIHNhdmVkIHN0YXRlIG9yIGFycmF5Ci0gICAgICAgICAgaW50IGJ5dGUyID0gKGJ5dGUpIH4oc3RhdGUgPj4gOCk7Ci0gICAgICAgICAgaW50IGJ5dGUzID0gMDsKLSAgICAgICAgICBpZiAoYnl0ZTIgPT0gMCkgewotICAgICAgICAgICAgYnl0ZTIgPSBieXRlc1tpbmRleCsrXTsKLSAgICAgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgewotICAgICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ5dGUzID0gKGJ5dGUpIChzdGF0ZSA+PiAxNik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChieXRlMyA9PSAwKSB7Ci0gICAgICAgICAgICBieXRlMyA9IGJ5dGVzW2luZGV4KytdOwotICAgICAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0KSB7Ci0gICAgICAgICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEsIGJ5dGUyLCBieXRlMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gSWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBzdGF0ZSA9PSBNQUxGT1JNRUQsIHRoZW4gYnl0ZTEgaXMgMHhGRiwKLSAgICAgICAgICAvLyB3aGljaCBuZXZlciBvY2N1cnMgaW4gd2VsbC1mb3JtZWQgVVRGLTgsIGFuZCBzbyB3ZSB3aWxsIHJldHVybgotICAgICAgICAgIC8vIE1BTEZPUk1FRCBhZ2FpbiBiZWxvdy4KLQotICAgICAgICAgIGlmIChieXRlMiA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgMSA8PSBwbGFuZSA8PSAxNi4gIFRyaWNreSBvcHRpbWl6ZWQgZm9ybSBvZjoKLSAgICAgICAgICAgICAgLy8gaWYgKGJ5dGUxID4gKGJ5dGUpIDB4RjQgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEYwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4OTAgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEY0ICYmIGJ5dGUyID4gKGJ5dGUpIDB4OEYpCi0gICAgICAgICAgICAgIHx8ICgoKGJ5dGUxIDw8IDI4KSArIChieXRlMiAtIChieXRlKSAweDkwKSkgPj4gMzApICE9IDAKLSAgICAgICAgICAgICAgLy8gYnl0ZTMgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IGJ5dGUzID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gYnl0ZTQgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IGJ5dGVzW2luZGV4KytdID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBwYXJ0aWFsSXNWYWxpZFV0ZjgoYnl0ZXMsIGluZGV4LCBsaW1pdCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgaW50IHBhcnRpYWxJc1ZhbGlkVXRmOERpcmVjdChpbnQgc3RhdGUsIEJ5dGVCdWZmZXIgYnVmZmVyLCBpbnQgaW5kZXgsIGludCBsaW1pdCkgewotICAgICAgLy8gRm9yIHNhZmUgcHJvY2Vzc2luZywgd2UgaGF2ZSB0byB1c2UgdGhlIEJ5dGVCdWZmZXIgQVBJLgotICAgICAgcmV0dXJuIHBhcnRpYWxJc1ZhbGlkVXRmOERlZmF1bHQoc3RhdGUsIGJ1ZmZlciwgaW5kZXgsIGxpbWl0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgZW5jb2RlVXRmOChDaGFyU2VxdWVuY2UgaW4sIGJ5dGVbXSBvdXQsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICAgIGludCB1dGYxNkxlbmd0aCA9IGluLmxlbmd0aCgpOwotICAgICAgaW50IGogPSBvZmZzZXQ7Ci0gICAgICBpbnQgaSA9IDA7Ci0gICAgICBpbnQgbGltaXQgPSBvZmZzZXQgKyBsZW5ndGg7Ci0gICAgICAvLyBEZXNpZ25lZCB0byB0YWtlIGFkdmFudGFnZSBvZgotICAgICAgLy8gaHR0cHM6Ly93aWtpcy5vcmFjbGUuY29tL2Rpc3BsYXkvSG90U3BvdEludGVybmFscy9SYW5nZUNoZWNrRWxpbWluYXRpb24KLSAgICAgIGZvciAoY2hhciBjOyBpIDwgdXRmMTZMZW5ndGggJiYgaSArIGogPCBsaW1pdCAmJiAoYyA9IGluLmNoYXJBdChpKSkgPCAweDgwOyBpKyspIHsKLSAgICAgICAgb3V0W2ogKyBpXSA9IChieXRlKSBjOwotICAgICAgfQotICAgICAgaWYgKGkgPT0gdXRmMTZMZW5ndGgpIHsKLSAgICAgICAgcmV0dXJuIGogKyB1dGYxNkxlbmd0aDsKLSAgICAgIH0KLSAgICAgIGogKz0gaTsKLSAgICAgIGZvciAoY2hhciBjOyBpIDwgdXRmMTZMZW5ndGg7IGkrKykgewotICAgICAgICBjID0gaW4uY2hhckF0KGkpOwotICAgICAgICBpZiAoYyA8IDB4ODAgJiYgaiA8IGxpbWl0KSB7Ci0gICAgICAgICAgb3V0W2orK10gPSAoYnl0ZSkgYzsKLSAgICAgICAgfSBlbHNlIGlmIChjIDwgMHg4MDAgJiYgaiA8PSBsaW1pdCAtIDIpIHsgLy8gMTEgYml0cywgdHdvIFVURi04IGJ5dGVzCi0gICAgICAgICAgb3V0W2orK10gPSAoYnl0ZSkgKCgweEYgPDwgNikgfCAoYyA+Pj4gNikpOwotICAgICAgICAgIG91dFtqKytdID0gKGJ5dGUpICgweDgwIHwgKDB4M0YgJiBjKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGMgPCBDaGFyYWN0ZXIuTUlOX1NVUlJPR0FURSB8fCBDaGFyYWN0ZXIuTUFYX1NVUlJPR0FURSA8IGMpICYmIGogPD0gbGltaXQgLSAzKSB7Ci0gICAgICAgICAgLy8gTWF4aW11bSBzaW5nbGUtY2hhciBjb2RlIHBvaW50IGlzIDB4RkZGRiwgMTYgYml0cywgdGhyZWUgVVRGLTggYnl0ZXMKLSAgICAgICAgICBvdXRbaisrXSA9IChieXRlKSAoKDB4RiA8PCA1KSB8IChjID4+PiAxMikpOwotICAgICAgICAgIG91dFtqKytdID0gKGJ5dGUpICgweDgwIHwgKDB4M0YgJiAoYyA+Pj4gNikpKTsKLSAgICAgICAgICBvdXRbaisrXSA9IChieXRlKSAoMHg4MCB8ICgweDNGICYgYykpOwotICAgICAgICB9IGVsc2UgaWYgKGogPD0gbGltaXQgLSA0KSB7Ci0gICAgICAgICAgLy8gTWluaW11bSBjb2RlIHBvaW50IHJlcHJlc2VudGVkIGJ5IGEgc3Vycm9nYXRlIHBhaXIgaXMgMHgxMDAwMCwgMTcgYml0cywKLSAgICAgICAgICAvLyBmb3VyIFVURi04IGJ5dGVzCi0gICAgICAgICAgZmluYWwgY2hhciBsb3c7Ci0gICAgICAgICAgaWYgKGkgKyAxID09IGluLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgICB8fCAhQ2hhcmFjdGVyLmlzU3Vycm9nYXRlUGFpcihjLCAobG93ID0gaW4uY2hhckF0KCsraSkpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uKChpIC0gMSksIHV0ZjE2TGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaW50IGNvZGVQb2ludCA9IENoYXJhY3Rlci50b0NvZGVQb2ludChjLCBsb3cpOwotICAgICAgICAgIG91dFtqKytdID0gKGJ5dGUpICgoMHhGIDw8IDQpIHwgKGNvZGVQb2ludCA+Pj4gMTgpKTsKLSAgICAgICAgICBvdXRbaisrXSA9IChieXRlKSAoMHg4MCB8ICgweDNGICYgKGNvZGVQb2ludCA+Pj4gMTIpKSk7Ci0gICAgICAgICAgb3V0W2orK10gPSAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIChjb2RlUG9pbnQgPj4+IDYpKSk7Ci0gICAgICAgICAgb3V0W2orK10gPSAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGNvZGVQb2ludCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIElmIHdlIGFyZSBzdXJyb2dhdGVzIGFuZCB3ZSdyZSBub3QgYSBzdXJyb2dhdGUgcGFpciwgYWx3YXlzIHRocm93IGFuCi0gICAgICAgICAgLy8gVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24gaW5zdGVhZCBvZiBhbiBBcnJheU91dE9mQm91bmRzRXhjZXB0aW9uLgotICAgICAgICAgIGlmICgoQ2hhcmFjdGVyLk1JTl9TVVJST0dBVEUgPD0gYyAmJiBjIDw9IENoYXJhY3Rlci5NQVhfU1VSUk9HQVRFKQotICAgICAgICAgICAgICAmJiAoaSArIDEgPT0gaW4ubGVuZ3RoKCkKLSAgICAgICAgICAgICAgICAgIHx8ICFDaGFyYWN0ZXIuaXNTdXJyb2dhdGVQYWlyKGMsIGluLmNoYXJBdChpICsgMSkpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uKGksIHV0ZjE2TGVuZ3RoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiRmFpbGVkIHdyaXRpbmcgIiArIGMgKyAiIGF0IGluZGV4ICIgKyBqKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIGo7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgdm9pZCBlbmNvZGVVdGY4RGlyZWN0KENoYXJTZXF1ZW5jZSBpbiwgQnl0ZUJ1ZmZlciBvdXQpIHsKLSAgICAgIC8vIEZvciBzYWZlIHByb2Nlc3NpbmcsIHdlIGhhdmUgdG8gdXNlIHRoZSBCeXRlQnVmZmVyIEFQSS4KLSAgICAgIGVuY29kZVV0ZjhEZWZhdWx0KGluLCBvdXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoYnl0ZVtdIGJ5dGVzLCBpbnQgaW5kZXgsIGludCBsaW1pdCkgewotICAgICAgLy8gT3B0aW1pemUgZm9yIDEwMCUgQVNDSUkgKEhvdHNwb3QgbG92ZXMgc21hbGwgc2ltcGxlIHRvcC1sZXZlbCBsb29wcyBsaWtlIHRoaXMpLgotICAgICAgLy8gVGhpcyBzaW1wbGUgbG9vcCBzdG9wcyB3aGVuIHdlIGVuY291bnRlciBhIGJ5dGUgPj0gMHg4MCAoaS5lLiBub24tQVNDSUkpLgotICAgICAgd2hpbGUgKGluZGV4IDwgbGltaXQgJiYgYnl0ZXNbaW5kZXhdID49IDApIHsKLSAgICAgICAgaW5kZXgrKzsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIChpbmRleCA+PSBsaW1pdCkgPyBDT01QTEVURSA6IHBhcnRpYWxJc1ZhbGlkVXRmOE5vbkFzY2lpKGJ5dGVzLCBpbmRleCwgbGltaXQpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjhOb25Bc2NpaShieXRlW10gYnl0ZXMsIGludCBpbmRleCwgaW50IGxpbWl0KSB7Ci0gICAgICBmb3IgKDs7KSB7Ci0gICAgICAgIGludCBieXRlMSwgYnl0ZTI7Ci0KLSAgICAgICAgLy8gT3B0aW1pemUgZm9yIGludGVyaW9yIHJ1bnMgb2YgQVNDSUkgYnl0ZXMuCi0gICAgICAgIGRvIHsKLSAgICAgICAgICBpZiAoaW5kZXggPj0gbGltaXQpIHsKLSAgICAgICAgICAgIHJldHVybiBDT01QTEVURTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gd2hpbGUgKChieXRlMSA9IGJ5dGVzW2luZGV4KytdKSA+PSAwKTsKLQotICAgICAgICBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhFMCkgewotICAgICAgICAgIC8vIHR3by1ieXRlIGZvcm0KLQotICAgICAgICAgIGlmIChpbmRleCA+PSBsaW1pdCkgewotICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIGJ5dGUxOwotICAgICAgICAgIH0KLQotICAgICAgICAgIC8vIFNpbXVsdGFuZW91c2x5IGNoZWNrcyBmb3IgaWxsZWdhbCB0cmFpbGluZy1ieXRlIGluCi0gICAgICAgICAgLy8gbGVhZGluZyBwb3NpdGlvbiBhbmQgb3ZlcmxvbmcgMi1ieXRlIGZvcm0uCi0gICAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4QzIKLSAgICAgICAgICAgICAgfHwgYnl0ZXNbaW5kZXgrK10gPiAoYnl0ZSkgMHhCRikgewotICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhGMCkgewotICAgICAgICAgIC8vIHRocmVlLWJ5dGUgZm9ybQotCi0gICAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0IC0gMSkgeyAvLyBpbmNvbXBsZXRlIHNlcXVlbmNlCi0gICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGVzLCBpbmRleCwgbGltaXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKGJ5dGUyID0gYnl0ZXNbaW5kZXgrK10pID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gb3Zlcmxvbmc/IDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG11c3Qgbm90IGFsbCBiZSB6ZXJvCi0gICAgICAgICAgICAgIHx8IChieXRlMSA9PSAoYnl0ZSkgMHhFMCAmJiBieXRlMiA8IChieXRlKSAweEEwKQotICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBzdXJyb2dhdGUgY29kZXBvaW50cwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RUQgJiYgYnl0ZTIgPj0gKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBieXRlc1tpbmRleCsrXSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBmb3VyLWJ5dGUgZm9ybQotCi0gICAgICAgICAgaWYgKGluZGV4ID49IGxpbWl0IC0gMikgeyAgLy8gaW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlcywgaW5kZXgsIGxpbWl0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKChieXRlMiA9IGJ5dGVzW2luZGV4KytdKSA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgMSA8PSBwbGFuZSA8PSAxNi4gIFRyaWNreSBvcHRpbWl6ZWQgZm9ybSBvZjoKLSAgICAgICAgICAgICAgLy8gaWYgKGJ5dGUxID4gKGJ5dGUpIDB4RjQgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEYwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4OTAgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEY0ICYmIGJ5dGUyID4gKGJ5dGUpIDB4OEYpCi0gICAgICAgICAgICAgIHx8ICgoKGJ5dGUxIDw8IDI4KSArIChieXRlMiAtIChieXRlKSAweDkwKSkgPj4gMzApICE9IDAKLSAgICAgICAgICAgICAgLy8gYnl0ZTMgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IGJ5dGVzW2luZGV4KytdID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gYnl0ZTQgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IGJ5dGVzW2luZGV4KytdID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIHtAbGluayBQcm9jZXNzb3J9IHRoYXQgdXNlcyB7QGNvZGUgc3VuLm1pc2MuVW5zYWZlfSB3aGVyZSBwb3NzaWJsZSB0byBpbXByb3ZlIHBlcmZvcm1hbmNlLgotICAgKi8KLSAgc3RhdGljIGZpbmFsIGNsYXNzIFVuc2FmZVByb2Nlc3NvciBleHRlbmRzIFByb2Nlc3NvciB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgc3VuLm1pc2MuVW5zYWZlIFVOU0FGRSA9IGdldFVuc2FmZSgpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgQlVGRkVSX0FERFJFU1NfT0ZGU0VUID0KLSAgICAgICAgZmllbGRPZmZzZXQoZmllbGQoQnVmZmVyLmNsYXNzLCAiYWRkcmVzcyIpKTsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgQVJSQVlfQkFTRV9PRkZTRVQgPSBieXRlQXJyYXlCYXNlT2Zmc2V0KCk7Ci0KLSAgICAvKioKLSAgICAgKiBXZSBvbmx5IHVzZSBVbnNhZmUgb3BlcmF0aW9ucyBpZiB3ZSBoYXZlIGFjY2VzcyB0byBkaXJlY3Qge0BsaW5rIEJ5dGVCdWZmZXJ9J3MgYWRkcmVzcwotICAgICAqIGFuZCB0aGUgYXJyYXkgYmFzZSBvZmZzZXQgaXMgYSBtdWx0aXBsZSBvZiA4IChuZWVkZWQgYnkgVW5zYWZlLmdldExvbmcoKSkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYm9vbGVhbiBBVkFJTEFCTEUgPQotICAgICAgICBCVUZGRVJfQUREUkVTU19PRkZTRVQgIT0gLTEgJiYgQVJSQVlfQkFTRV9PRkZTRVQgJSA4ID09IDA7Ci0KLSAgICAvKioKLSAgICAgKiBJbmRpY2F0ZXMgd2hldGhlciBvciBub3QgYWxsIHJlcXVpcmVkIHVuc2FmZSBvcGVyYXRpb25zIGFyZSBzdXBwb3J0ZWQgb24gdGhpcyBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBpc0F2YWlsYWJsZSgpIHsKLSAgICAgIHJldHVybiBBVkFJTEFCTEU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgaW50IHBhcnRpYWxJc1ZhbGlkVXRmOChpbnQgc3RhdGUsIGJ5dGVbXSBieXRlcywgZmluYWwgaW50IGluZGV4LCBmaW5hbCBpbnQgbGltaXQpIHsKLSAgICAgIGlmICgoaW5kZXggfCBsaW1pdCB8IGJ5dGVzLmxlbmd0aCAtIGxpbWl0KSA8IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgIFN0cmluZy5mb3JtYXQoIkFycmF5IGxlbmd0aD0lZCwgaW5kZXg9JWQsIGxpbWl0PSVkIiwgYnl0ZXMubGVuZ3RoLCBpbmRleCwgbGltaXQpKTsKLSAgICAgIH0KLSAgICAgIGxvbmcgb2Zmc2V0ID0gQVJSQVlfQkFTRV9PRkZTRVQgKyBpbmRleDsKLSAgICAgIGZpbmFsIGxvbmcgb2Zmc2V0TGltaXQgPSBBUlJBWV9CQVNFX09GRlNFVCArIGxpbWl0OwotICAgICAgaWYgKHN0YXRlICE9IENPTVBMRVRFKSB7Ci0gICAgICAgIC8vIFRoZSBwcmV2aW91cyBkZWNvZGluZyBvcGVyYXRpb24gd2FzIGluY29tcGxldGUgKG9yIG1hbGZvcm1lZCkuCi0gICAgICAgIC8vIFdlIGxvb2sgZm9yIGEgd2VsbC1mb3JtZWQgc2VxdWVuY2UgY29uc2lzdGluZyBvZiBieXRlcyBmcm9tCi0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBkZWNvZGluZyBvcGVyYXRpb24gKHN0b3JlZCBpbiBzdGF0ZSkgdG9nZXRoZXIKLSAgICAgICAgLy8gd2l0aCBieXRlcyBmcm9tIHRoZSBhcnJheSBzbGljZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gV2UgZXhwZWN0IHN1Y2ggInN0cmFkZGxlciBjaGFyYWN0ZXJzIiB0byBiZSByYXJlLgotCi0gICAgICAgIGlmIChvZmZzZXQgPj0gb2Zmc2V0TGltaXQpIHsgIC8vIE5vIGJ5dGVzPyBObyBwcm9ncmVzcy4KLSAgICAgICAgICByZXR1cm4gc3RhdGU7Ci0gICAgICAgIH0KLSAgICAgICAgaW50IGJ5dGUxID0gKGJ5dGUpIHN0YXRlOwotICAgICAgICAvLyBieXRlMSBpcyBuZXZlciBBU0NJSS4KLSAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4RTApIHsKLSAgICAgICAgICAvLyB0d28tYnl0ZSBmb3JtCi0KLSAgICAgICAgICAvLyBTaW11bHRhbmVvdXNseSBjaGVja3MgZm9yIGlsbGVnYWwgdHJhaWxpbmctYnl0ZSBpbgotICAgICAgICAgIC8vIGxlYWRpbmcgcG9zaXRpb24gYW5kIG92ZXJsb25nIDItYnl0ZSBmb3JtLgotICAgICAgICAgIGlmIChieXRlMSA8IChieXRlKSAweEMyCi0gICAgICAgICAgICAgIC8vIGJ5dGUyIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBVTlNBRkUuZ2V0Qnl0ZShieXRlcywgb2Zmc2V0KyspID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4RjApIHsKLSAgICAgICAgICAvLyB0aHJlZS1ieXRlIGZvcm0KLQotICAgICAgICAgIC8vIEdldCBieXRlMiBmcm9tIHNhdmVkIHN0YXRlIG9yIGFycmF5Ci0gICAgICAgICAgaW50IGJ5dGUyID0gKGJ5dGUpIH4oc3RhdGUgPj4gOCk7Ci0gICAgICAgICAgaWYgKGJ5dGUyID09IDApIHsKLSAgICAgICAgICAgIGJ5dGUyID0gVU5TQUZFLmdldEJ5dGUoYnl0ZXMsIG9mZnNldCsrKTsKLSAgICAgICAgICAgIGlmIChvZmZzZXQgPj0gb2Zmc2V0TGltaXQpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSwgYnl0ZTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoYnl0ZTIgPiAoYnl0ZSkgMHhCRgotICAgICAgICAgICAgICAvLyBvdmVybG9uZz8gNSBtb3N0IHNpZ25pZmljYW50IGJpdHMgbXVzdCBub3QgYWxsIGJlIHplcm8KLSAgICAgICAgICAgICAgfHwgKGJ5dGUxID09IChieXRlKSAweEUwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGlsbGVnYWwgc3Vycm9nYXRlIGNvZGVwb2ludD8KLSAgICAgICAgICAgICAgfHwgKGJ5dGUxID09IChieXRlKSAweEVEICYmIGJ5dGUyID49IChieXRlKSAweEEwKQotICAgICAgICAgICAgICAvLyBieXRlMyB0cmFpbGluZy1ieXRlIHRlc3QKLSAgICAgICAgICAgICAgfHwgVU5TQUZFLmdldEJ5dGUoYnl0ZXMsIG9mZnNldCsrKSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBmb3VyLWJ5dGUgZm9ybQotCi0gICAgICAgICAgLy8gR2V0IGJ5dGUyIGFuZCBieXRlMyBmcm9tIHNhdmVkIHN0YXRlIG9yIGFycmF5Ci0gICAgICAgICAgaW50IGJ5dGUyID0gKGJ5dGUpIH4oc3RhdGUgPj4gOCk7Ci0gICAgICAgICAgaW50IGJ5dGUzID0gMDsKLSAgICAgICAgICBpZiAoYnl0ZTIgPT0gMCkgewotICAgICAgICAgICAgYnl0ZTIgPSBVTlNBRkUuZ2V0Qnl0ZShieXRlcywgb2Zmc2V0KyspOwotICAgICAgICAgICAgaWYgKG9mZnNldCA+PSBvZmZzZXRMaW1pdCkgewotICAgICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGJ5dGUzID0gKGJ5dGUpIChzdGF0ZSA+PiAxNik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChieXRlMyA9PSAwKSB7Ci0gICAgICAgICAgICBieXRlMyA9IFVOU0FGRS5nZXRCeXRlKGJ5dGVzLCBvZmZzZXQrKyk7Ci0gICAgICAgICAgICBpZiAob2Zmc2V0ID49IG9mZnNldExpbWl0KSB7Ci0gICAgICAgICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEsIGJ5dGUyLCBieXRlMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gSWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBzdGF0ZSA9PSBNQUxGT1JNRUQsIHRoZW4gYnl0ZTEgaXMgMHhGRiwKLSAgICAgICAgICAvLyB3aGljaCBuZXZlciBvY2N1cnMgaW4gd2VsbC1mb3JtZWQgVVRGLTgsIGFuZCBzbyB3ZSB3aWxsIHJldHVybgotICAgICAgICAgIC8vIE1BTEZPUk1FRCBhZ2FpbiBiZWxvdy4KLQotICAgICAgICAgIGlmIChieXRlMiA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgMSA8PSBwbGFuZSA8PSAxNi4gIFRyaWNreSBvcHRpbWl6ZWQgZm9ybSBvZjoKLSAgICAgICAgICAgICAgLy8gaWYgKGJ5dGUxID4gKGJ5dGUpIDB4RjQgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEYwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4OTAgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEY0ICYmIGJ5dGUyID4gKGJ5dGUpIDB4OEYpCi0gICAgICAgICAgICAgIHx8ICgoKGJ5dGUxIDw8IDI4KSArIChieXRlMiAtIChieXRlKSAweDkwKSkgPj4gMzApICE9IDAKLSAgICAgICAgICAgICAgLy8gYnl0ZTMgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IGJ5dGUzID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gYnl0ZTQgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IFVOU0FGRS5nZXRCeXRlKGJ5dGVzLCBvZmZzZXQrKykgPiAoYnl0ZSkgMHhCRikgewotICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHBhcnRpYWxJc1ZhbGlkVXRmOChieXRlcywgb2Zmc2V0LCAoaW50KSAob2Zmc2V0TGltaXQgLSBvZmZzZXQpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBpbnQgcGFydGlhbElzVmFsaWRVdGY4RGlyZWN0KAotICAgICAgICBmaW5hbCBpbnQgc3RhdGUsIEJ5dGVCdWZmZXIgYnVmZmVyLCBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIGludCBsaW1pdCkgewotICAgICAgaWYgKChpbmRleCB8IGxpbWl0IHwgYnVmZmVyLmxpbWl0KCkgLSBsaW1pdCkgPCAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oCi0gICAgICAgICAgICBTdHJpbmcuZm9ybWF0KCJidWZmZXIgbGltaXQ9JWQsIGluZGV4PSVkLCBsaW1pdD0lZCIsIGJ1ZmZlci5saW1pdCgpLCBpbmRleCwgbGltaXQpKTsKLSAgICAgIH0KLSAgICAgIGxvbmcgYWRkcmVzcyA9IGFkZHJlc3NPZmZzZXQoYnVmZmVyKSArIGluZGV4OwotICAgICAgZmluYWwgbG9uZyBhZGRyZXNzTGltaXQgPSBhZGRyZXNzICsgKGxpbWl0IC0gaW5kZXgpOwotICAgICAgaWYgKHN0YXRlICE9IENPTVBMRVRFKSB7Ci0gICAgICAgIC8vIFRoZSBwcmV2aW91cyBkZWNvZGluZyBvcGVyYXRpb24gd2FzIGluY29tcGxldGUgKG9yIG1hbGZvcm1lZCkuCi0gICAgICAgIC8vIFdlIGxvb2sgZm9yIGEgd2VsbC1mb3JtZWQgc2VxdWVuY2UgY29uc2lzdGluZyBvZiBieXRlcyBmcm9tCi0gICAgICAgIC8vIHRoZSBwcmV2aW91cyBkZWNvZGluZyBvcGVyYXRpb24gKHN0b3JlZCBpbiBzdGF0ZSkgdG9nZXRoZXIKLSAgICAgICAgLy8gd2l0aCBieXRlcyBmcm9tIHRoZSBhcnJheSBzbGljZS4KLSAgICAgICAgLy8KLSAgICAgICAgLy8gV2UgZXhwZWN0IHN1Y2ggInN0cmFkZGxlciBjaGFyYWN0ZXJzIiB0byBiZSByYXJlLgotCi0gICAgICAgIGlmIChhZGRyZXNzID49IGFkZHJlc3NMaW1pdCkgeyAvLyBObyBieXRlcz8gTm8gcHJvZ3Jlc3MuCi0gICAgICAgICAgcmV0dXJuIHN0YXRlOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgaW50IGJ5dGUxID0gKGJ5dGUpIHN0YXRlOwotICAgICAgICAvLyBieXRlMSBpcyBuZXZlciBBU0NJSS4KLSAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4RTApIHsKLSAgICAgICAgICAvLyB0d28tYnl0ZSBmb3JtCi0KLSAgICAgICAgICAvLyBTaW11bHRhbmVvdXNseSBjaGVja3MgZm9yIGlsbGVnYWwgdHJhaWxpbmctYnl0ZSBpbgotICAgICAgICAgIC8vIGxlYWRpbmcgcG9zaXRpb24gYW5kIG92ZXJsb25nIDItYnl0ZSBmb3JtLgotICAgICAgICAgIGlmIChieXRlMSA8IChieXRlKSAweEMyCi0gICAgICAgICAgICAgIC8vIGJ5dGUyIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBVTlNBRkUuZ2V0Qnl0ZShhZGRyZXNzKyspID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4RjApIHsKLSAgICAgICAgICAvLyB0aHJlZS1ieXRlIGZvcm0KLQotICAgICAgICAgIC8vIEdldCBieXRlMiBmcm9tIHNhdmVkIHN0YXRlIG9yIGFycmF5Ci0gICAgICAgICAgaW50IGJ5dGUyID0gKGJ5dGUpIH4oc3RhdGUgPj4gOCk7Ci0gICAgICAgICAgaWYgKGJ5dGUyID09IDApIHsKLSAgICAgICAgICAgIGJ5dGUyID0gVU5TQUZFLmdldEJ5dGUoYWRkcmVzcysrKTsKLSAgICAgICAgICAgIGlmIChhZGRyZXNzID49IGFkZHJlc3NMaW1pdCkgewotICAgICAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBieXRlMik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChieXRlMiA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIG92ZXJsb25nPyA1IG1vc3Qgc2lnbmlmaWNhbnQgYml0cyBtdXN0IG5vdCBhbGwgYmUgemVybwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RTAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHhBMCkKLSAgICAgICAgICAgICAgLy8gaWxsZWdhbCBzdXJyb2dhdGUgY29kZXBvaW50PwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RUQgJiYgYnl0ZTIgPj0gKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBVTlNBRkUuZ2V0Qnl0ZShhZGRyZXNzKyspID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIGZvdXItYnl0ZSBmb3JtCi0KLSAgICAgICAgICAvLyBHZXQgYnl0ZTIgYW5kIGJ5dGUzIGZyb20gc2F2ZWQgc3RhdGUgb3IgYXJyYXkKLSAgICAgICAgICBpbnQgYnl0ZTIgPSAoYnl0ZSkgfihzdGF0ZSA+PiA4KTsKLSAgICAgICAgICBpbnQgYnl0ZTMgPSAwOwotICAgICAgICAgIGlmIChieXRlMiA9PSAwKSB7Ci0gICAgICAgICAgICBieXRlMiA9IFVOU0FGRS5nZXRCeXRlKGFkZHJlc3MrKyk7Ci0gICAgICAgICAgICBpZiAoYWRkcmVzcyA+PSBhZGRyZXNzTGltaXQpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSwgYnl0ZTIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBieXRlMyA9IChieXRlKSAoc3RhdGUgPj4gMTYpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoYnl0ZTMgPT0gMCkgewotICAgICAgICAgICAgYnl0ZTMgPSBVTlNBRkUuZ2V0Qnl0ZShhZGRyZXNzKyspOwotICAgICAgICAgICAgaWYgKGFkZHJlc3MgPj0gYWRkcmVzc0xpbWl0KSB7Ci0gICAgICAgICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEsIGJ5dGUyLCBieXRlMyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotCi0gICAgICAgICAgLy8gSWYgd2Ugd2VyZSBjYWxsZWQgd2l0aCBzdGF0ZSA9PSBNQUxGT1JNRUQsIHRoZW4gYnl0ZTEgaXMgMHhGRiwKLSAgICAgICAgICAvLyB3aGljaCBuZXZlciBvY2N1cnMgaW4gd2VsbC1mb3JtZWQgVVRGLTgsIGFuZCBzbyB3ZSB3aWxsIHJldHVybgotICAgICAgICAgIC8vIE1BTEZPUk1FRCBhZ2FpbiBiZWxvdy4KLQotICAgICAgICAgIGlmIChieXRlMiA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgMSA8PSBwbGFuZSA8PSAxNi4gIFRyaWNreSBvcHRpbWl6ZWQgZm9ybSBvZjoKLSAgICAgICAgICAgICAgLy8gaWYgKGJ5dGUxID4gKGJ5dGUpIDB4RjQgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEYwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4OTAgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEY0ICYmIGJ5dGUyID4gKGJ5dGUpIDB4OEYpCi0gICAgICAgICAgICAgIHx8ICgoKGJ5dGUxIDw8IDI4KSArIChieXRlMiAtIChieXRlKSAweDkwKSkgPj4gMzApICE9IDAKLSAgICAgICAgICAgICAgLy8gYnl0ZTMgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IGJ5dGUzID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gYnl0ZTQgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IFVOU0FGRS5nZXRCeXRlKGFkZHJlc3MrKykgPiAoYnl0ZSkgMHhCRikgewotICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIHBhcnRpYWxJc1ZhbGlkVXRmOChhZGRyZXNzLCAoaW50KSAoYWRkcmVzc0xpbWl0IC0gYWRkcmVzcykpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIGludCBlbmNvZGVVdGY4KGZpbmFsIENoYXJTZXF1ZW5jZSBpbiwgZmluYWwgYnl0ZVtdIG91dCwgZmluYWwgaW50IG9mZnNldCwgZmluYWwgaW50IGxlbmd0aCkgewotICAgICAgbG9uZyBvdXRJeCA9IEFSUkFZX0JBU0VfT0ZGU0VUICsgb2Zmc2V0OwotICAgICAgZmluYWwgbG9uZyBvdXRMaW1pdCA9IG91dEl4ICsgbGVuZ3RoOwotICAgICAgZmluYWwgaW50IGluTGltaXQgPSBpbi5sZW5ndGgoKTsKLSAgICAgIGlmIChpbkxpbWl0ID4gbGVuZ3RoIHx8IG91dC5sZW5ndGggLSBsZW5ndGggPCBvZmZzZXQpIHsKLSAgICAgICAgLy8gTm90IGV2ZW4gZW5vdWdoIHJvb20gZm9yIGFuIEFTQ0lJLWVuY29kZWQgc3RyaW5nLgotICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKAotICAgICAgICAgICAgIkZhaWxlZCB3cml0aW5nICIgKyBpbi5jaGFyQXQoaW5MaW1pdCAtIDEpICsgIiBhdCBpbmRleCAiICsgKG9mZnNldCArIGxlbmd0aCkpOwotICAgICAgfQotCi0gICAgICAvLyBEZXNpZ25lZCB0byB0YWtlIGFkdmFudGFnZSBvZgotICAgICAgLy8gaHR0cHM6Ly93aWtpcy5vcmFjbGUuY29tL2Rpc3BsYXkvSG90U3BvdEludGVybmFscy9SYW5nZUNoZWNrRWxpbWluYXRpb24KLSAgICAgIGludCBpbkl4ID0gMDsKLSAgICAgIGZvciAoY2hhciBjOyBpbkl4IDwgaW5MaW1pdCAmJiAoYyA9IGluLmNoYXJBdChpbkl4KSkgPCAweDgwOyArK2luSXgpIHsKLSAgICAgICAgVU5TQUZFLnB1dEJ5dGUob3V0LCBvdXRJeCsrLCAoYnl0ZSkgYyk7Ci0gICAgICB9Ci0gICAgICBpZiAoaW5JeCA9PSBpbkxpbWl0KSB7Ci0gICAgICAgIC8vIFdlJ3JlIGRvbmUsIGl0IHdhcyBBU0NJSSBlbmNvZGVkLgotICAgICAgICByZXR1cm4gKGludCkgKG91dEl4IC0gQVJSQVlfQkFTRV9PRkZTRVQpOwotICAgICAgfQotCi0gICAgICBmb3IgKGNoYXIgYzsgaW5JeCA8IGluTGltaXQ7ICsraW5JeCkgewotICAgICAgICBjID0gaW4uY2hhckF0KGluSXgpOwotICAgICAgICBpZiAoYyA8IDB4ODAgJiYgb3V0SXggPCBvdXRMaW1pdCkgewotICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dCwgb3V0SXgrKywgKGJ5dGUpIGMpOwotICAgICAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCAmJiBvdXRJeCA8PSBvdXRMaW1pdCAtIDJMKSB7IC8vIDExIGJpdHMsIHR3byBVVEYtOCBieXRlcwotICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dCwgb3V0SXgrKywgKGJ5dGUpICgoMHhGIDw8IDYpIHwgKGMgPj4+IDYpKSk7Ci0gICAgICAgICAgVU5TQUZFLnB1dEJ5dGUob3V0LCBvdXRJeCsrLCAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGMpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoKGMgPCBNSU5fU1VSUk9HQVRFIHx8IE1BWF9TVVJST0dBVEUgPCBjKSAmJiBvdXRJeCA8PSBvdXRMaW1pdCAtIDNMKSB7Ci0gICAgICAgICAgLy8gTWF4aW11bSBzaW5nbGUtY2hhciBjb2RlIHBvaW50IGlzIDB4RkZGRiwgMTYgYml0cywgdGhyZWUgVVRGLTggYnl0ZXMKLSAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShvdXQsIG91dEl4KyssIChieXRlKSAoKDB4RiA8PCA1KSB8IChjID4+PiAxMikpKTsKLSAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShvdXQsIG91dEl4KyssIChieXRlKSAoMHg4MCB8ICgweDNGICYgKGMgPj4+IDYpKSkpOwotICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dCwgb3V0SXgrKywgKGJ5dGUpICgweDgwIHwgKDB4M0YgJiBjKSkpOwotICAgICAgICB9IGVsc2UgaWYgKG91dEl4IDw9IG91dExpbWl0IC0gNEwpIHsKLSAgICAgICAgICAvLyBNaW5pbXVtIGNvZGUgcG9pbnQgcmVwcmVzZW50ZWQgYnkgYSBzdXJyb2dhdGUgcGFpciBpcyAweDEwMDAwLCAxNyBiaXRzLCBmb3VyIFVURi04Ci0gICAgICAgICAgLy8gYnl0ZXMKLSAgICAgICAgICBmaW5hbCBjaGFyIGxvdzsKLSAgICAgICAgICBpZiAoaW5JeCArIDEgPT0gaW5MaW1pdCB8fCAhaXNTdXJyb2dhdGVQYWlyKGMsIChsb3cgPSBpbi5jaGFyQXQoKytpbkl4KSkpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24oKGluSXggLSAxKSwgaW5MaW1pdCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGludCBjb2RlUG9pbnQgPSB0b0NvZGVQb2ludChjLCBsb3cpOwotICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dCwgb3V0SXgrKywgKGJ5dGUpICgoMHhGIDw8IDQpIHwgKGNvZGVQb2ludCA+Pj4gMTgpKSk7Ci0gICAgICAgICAgVU5TQUZFLnB1dEJ5dGUob3V0LCBvdXRJeCsrLCAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIChjb2RlUG9pbnQgPj4+IDEyKSkpKTsKLSAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShvdXQsIG91dEl4KyssIChieXRlKSAoMHg4MCB8ICgweDNGICYgKGNvZGVQb2ludCA+Pj4gNikpKSk7Ci0gICAgICAgICAgVU5TQUZFLnB1dEJ5dGUob3V0LCBvdXRJeCsrLCAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGNvZGVQb2ludCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoKE1JTl9TVVJST0dBVEUgPD0gYyAmJiBjIDw9IE1BWF9TVVJST0dBVEUpCi0gICAgICAgICAgICAgICYmIChpbkl4ICsgMSA9PSBpbkxpbWl0IHx8ICFpc1N1cnJvZ2F0ZVBhaXIoYywgaW4uY2hhckF0KGluSXggKyAxKSkpKSB7Ci0gICAgICAgICAgICAvLyBXZSBhcmUgc3Vycm9nYXRlcyBhbmQgd2UncmUgbm90IGEgc3Vycm9nYXRlIHBhaXIuCi0gICAgICAgICAgICB0aHJvdyBuZXcgVW5wYWlyZWRTdXJyb2dhdGVFeGNlcHRpb24oaW5JeCwgaW5MaW1pdCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIC8vIE5vdCBlbm91Z2ggc3BhY2UgaW4gdGhlIG91dHB1dCBidWZmZXIuCi0gICAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigiRmFpbGVkIHdyaXRpbmcgIiArIGMgKyAiIGF0IGluZGV4ICIgKyBvdXRJeCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQWxsIGJ5dGVzIGhhdmUgYmVlbiBlbmNvZGVkLgotICAgICAgcmV0dXJuIChpbnQpIChvdXRJeCAtIEFSUkFZX0JBU0VfT0ZGU0VUKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICB2b2lkIGVuY29kZVV0ZjhEaXJlY3QoQ2hhclNlcXVlbmNlIGluLCBCeXRlQnVmZmVyIG91dCkgewotICAgICAgZmluYWwgbG9uZyBhZGRyZXNzID0gYWRkcmVzc09mZnNldChvdXQpOwotICAgICAgbG9uZyBvdXRJeCA9IGFkZHJlc3MgKyBvdXQucG9zaXRpb24oKTsKLSAgICAgIGZpbmFsIGxvbmcgb3V0TGltaXQgPSBhZGRyZXNzICsgb3V0LmxpbWl0KCk7Ci0gICAgICBmaW5hbCBpbnQgaW5MaW1pdCA9IGluLmxlbmd0aCgpOwotICAgICAgaWYgKGluTGltaXQgPiBvdXRMaW1pdCAtIG91dEl4KSB7Ci0gICAgICAgIC8vIE5vdCBldmVuIGVub3VnaCByb29tIGZvciBhbiBBU0NJSS1lbmNvZGVkIHN0cmluZy4KLSAgICAgICAgdGhyb3cgbmV3IEFycmF5SW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigKLSAgICAgICAgICAgICJGYWlsZWQgd3JpdGluZyAiICsgaW4uY2hhckF0KGluTGltaXQgLSAxKSArICIgYXQgaW5kZXggIiArIG91dC5saW1pdCgpKTsKLSAgICAgIH0KLQotICAgICAgLy8gRGVzaWduZWQgdG8gdGFrZSBhZHZhbnRhZ2Ugb2YKLSAgICAgIC8vIGh0dHBzOi8vd2lraXMub3JhY2xlLmNvbS9kaXNwbGF5L0hvdFNwb3RJbnRlcm5hbHMvUmFuZ2VDaGVja0VsaW1pbmF0aW9uCi0gICAgICBpbnQgaW5JeCA9IDA7Ci0gICAgICBmb3IgKGNoYXIgYzsgaW5JeCA8IGluTGltaXQgJiYgKGMgPSBpbi5jaGFyQXQoaW5JeCkpIDwgMHg4MDsgKytpbkl4KSB7Ci0gICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dEl4KyssIChieXRlKSBjKTsKLSAgICAgIH0KLSAgICAgIGlmIChpbkl4ID09IGluTGltaXQpIHsKLSAgICAgICAgLy8gV2UncmUgZG9uZSwgaXQgd2FzIEFTQ0lJIGVuY29kZWQuCi0gICAgICAgIG91dC5wb3NpdGlvbigoaW50KSAob3V0SXggLSBhZGRyZXNzKSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLQotICAgICAgZm9yIChjaGFyIGM7IGluSXggPCBpbkxpbWl0OyArK2luSXgpIHsKLSAgICAgICAgYyA9IGluLmNoYXJBdChpbkl4KTsKLSAgICAgICAgaWYgKGMgPCAweDgwICYmIG91dEl4IDwgb3V0TGltaXQpIHsKLSAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShvdXRJeCsrLCAoYnl0ZSkgYyk7Ci0gICAgICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwICYmIG91dEl4IDw9IG91dExpbWl0IC0gMkwpIHsgLy8gMTEgYml0cywgdHdvIFVURi04IGJ5dGVzCi0gICAgICAgICAgVU5TQUZFLnB1dEJ5dGUob3V0SXgrKywgKGJ5dGUpICgoMHhGIDw8IDYpIHwgKGMgPj4+IDYpKSk7Ci0gICAgICAgICAgVU5TQUZFLnB1dEJ5dGUob3V0SXgrKywgKGJ5dGUpICgweDgwIHwgKDB4M0YgJiBjKSkpOwotICAgICAgICB9IGVsc2UgaWYgKChjIDwgTUlOX1NVUlJPR0FURSB8fCBNQVhfU1VSUk9HQVRFIDwgYykgJiYgb3V0SXggPD0gb3V0TGltaXQgLSAzTCkgewotICAgICAgICAgIC8vIE1heGltdW0gc2luZ2xlLWNoYXIgY29kZSBwb2ludCBpcyAweEZGRkYsIDE2IGJpdHMsIHRocmVlIFVURi04IGJ5dGVzCi0gICAgICAgICAgVU5TQUZFLnB1dEJ5dGUob3V0SXgrKywgKGJ5dGUpICgoMHhGIDw8IDUpIHwgKGMgPj4+IDEyKSkpOwotICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dEl4KyssIChieXRlKSAoMHg4MCB8ICgweDNGICYgKGMgPj4+IDYpKSkpOwotICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dEl4KyssIChieXRlKSAoMHg4MCB8ICgweDNGICYgYykpKTsKLSAgICAgICAgfSBlbHNlIGlmIChvdXRJeCA8PSBvdXRMaW1pdCAtIDRMKSB7Ci0gICAgICAgICAgLy8gTWluaW11bSBjb2RlIHBvaW50IHJlcHJlc2VudGVkIGJ5IGEgc3Vycm9nYXRlIHBhaXIgaXMgMHgxMDAwMCwgMTcgYml0cywgZm91ciBVVEYtOAotICAgICAgICAgIC8vIGJ5dGVzCi0gICAgICAgICAgZmluYWwgY2hhciBsb3c7Ci0gICAgICAgICAgaWYgKGluSXggKyAxID09IGluTGltaXQgfHwgIWlzU3Vycm9nYXRlUGFpcihjLCAobG93ID0gaW4uY2hhckF0KCsraW5JeCkpKSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFVucGFpcmVkU3Vycm9nYXRlRXhjZXB0aW9uKChpbkl4IC0gMSksIGluTGltaXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpbnQgY29kZVBvaW50ID0gdG9Db2RlUG9pbnQoYywgbG93KTsKLSAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShvdXRJeCsrLCAoYnl0ZSkgKCgweEYgPDwgNCkgfCAoY29kZVBvaW50ID4+PiAxOCkpKTsKLSAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShvdXRJeCsrLCAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIChjb2RlUG9pbnQgPj4+IDEyKSkpKTsKLSAgICAgICAgICBVTlNBRkUucHV0Qnl0ZShvdXRJeCsrLCAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIChjb2RlUG9pbnQgPj4+IDYpKSkpOwotICAgICAgICAgIFVOU0FGRS5wdXRCeXRlKG91dEl4KyssIChieXRlKSAoMHg4MCB8ICgweDNGICYgY29kZVBvaW50KSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmICgoTUlOX1NVUlJPR0FURSA8PSBjICYmIGMgPD0gTUFYX1NVUlJPR0FURSkKLSAgICAgICAgICAgICAgJiYgKGluSXggKyAxID09IGluTGltaXQgfHwgIWlzU3Vycm9nYXRlUGFpcihjLCBpbi5jaGFyQXQoaW5JeCArIDEpKSkpIHsKLSAgICAgICAgICAgIC8vIFdlIGFyZSBzdXJyb2dhdGVzIGFuZCB3ZSdyZSBub3QgYSBzdXJyb2dhdGUgcGFpci4KLSAgICAgICAgICAgIHRocm93IG5ldyBVbnBhaXJlZFN1cnJvZ2F0ZUV4Y2VwdGlvbihpbkl4LCBpbkxpbWl0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gTm90IGVub3VnaCBzcGFjZSBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICAgICAgICB0aHJvdyBuZXcgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCJGYWlsZWQgd3JpdGluZyAiICsgYyArICIgYXQgaW5kZXggIiArIG91dEl4KTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBBbGwgYnl0ZXMgaGF2ZSBiZWVuIGVuY29kZWQuCi0gICAgICBvdXQucG9zaXRpb24oKGludCkgKG91dEl4IC0gYWRkcmVzcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvdW50cyAoYXBwcm94aW1hdGVseSkgdGhlIG51bWJlciBvZiBjb25zZWN1dGl2ZSBBU0NJSSBjaGFyYWN0ZXJzIHN0YXJ0aW5nIGZyb20gdGhlIGdpdmVuCi0gICAgICogcG9zaXRpb24sIHVzaW5nIHRoZSBtb3N0IGVmZmljaWVudCBtZXRob2QgYXZhaWxhYmxlIHRvIHRoZSBwbGF0Zm9ybS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBieXRlcyB0aGUgYXJyYXkgY29udGFpbmluZyB0aGUgY2hhcmFjdGVyIHNlcXVlbmNlCi0gICAgICogQHBhcmFtIG9mZnNldCB0aGUgb2Zmc2V0IHBvc2l0aW9uIG9mIHRoZSBpbmRleCAoc2FtZSBhcyBpbmRleCArIGFycmF5QmFzZU9mZnNldCkKLSAgICAgKiBAcGFyYW0gbWF4Q2hhcnMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGNoYXJhY3RlcnMgdG8gY291bnQKLSAgICAgKiBAcmV0dXJuIHRoZSBudW1iZXIgb2YgQVNDSUkgY2hhcmFjdGVycyBmb3VuZC4gVGhlIHN0b3BwaW5nIHBvc2l0aW9uIHdpbGwgYmUgYXQgb3IKLSAgICAgKiBiZWZvcmUgdGhlIGZpcnN0IG5vbi1BU0NJSSBieXRlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCB1bnNhZmVFc3RpbWF0ZUNvbnNlY3V0aXZlQXNjaWkoCi0gICAgICAgIGJ5dGVbXSBieXRlcywgbG9uZyBvZmZzZXQsIGZpbmFsIGludCBtYXhDaGFycykgewotICAgICAgaW50IHJlbWFpbmluZyA9IG1heENoYXJzOwotICAgICAgaWYgKHJlbWFpbmluZyA8IFVOU0FGRV9DT1VOVF9BU0NJSV9USFJFU0hPTEQpIHsKLSAgICAgICAgLy8gRG9uJ3QgYm90aGVyIHdpdGggc21hbGwgc3RyaW5ncy4KLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJlYWQgYnl0ZXMgdW50aWwgOC1ieXRlIGFsaWduZWQgc28gdGhhdCB3ZSBjYW4gcmVhZCBsb25ncyBpbiB0aGUgbG9vcCBiZWxvdy4KLSAgICAgIC8vIEJ5dGUgYXJyYXlzIGFyZSBhbHJlYWR5IGVpdGhlciA4IG9yIDE2LWJ5dGUgYWxpZ25lZCwgc28gd2UganVzdCBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0Ci0gICAgICAvLyB0aGUgaW5kZXggKHJlbGF0aXZlIHRvIHRoZSBzdGFydCBvZiB0aGUgYXJyYXkpIGlzIGFsc28gOC1ieXRlIGFsaWduZWQuIFdlIGRvIHRoaXMgYnkKLSAgICAgIC8vIEFORGluZyB0aGUgaW5kZXggd2l0aCA3IHRvIGRldGVybWluZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgbmVlZCB0byBiZSByZWFkIGJlZm9yZQotICAgICAgLy8gd2UncmUgOC1ieXRlIGFsaWduZWQuCi0gICAgICBmaW5hbCBpbnQgdW5hbGlnbmVkID0gKGludCkgb2Zmc2V0ICYgNzsKLSAgICAgIGZvciAoaW50IGogPSB1bmFsaWduZWQ7IGogPiAwOyBqLS0pIHsKLSAgICAgICAgaWYgKFVOU0FGRS5nZXRCeXRlKGJ5dGVzLCBvZmZzZXQrKykgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIHVuYWxpZ25lZCAtIGo7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGhpcyBzaW1wbGUgbG9vcCBzdG9wcyB3aGVuIHdlIGVuY291bnRlciBhIGJ5dGUgPj0gMHg4MCAoaS5lLiBub24tQVNDSUkpLgotICAgICAgLy8gVG8gc3BlZWQgdGhpbmdzIHVwIGZ1cnRoZXIsIHdlJ3JlIHJlYWRpbmcgbG9uZ3MgaW5zdGVhZCBvZiBieXRlcyBzbyB3ZSB1c2UgYSBtYXNrIHRvCi0gICAgICAvLyBkZXRlcm1pbmUgaWYgYW55IGJ5dGUgaW4gdGhlIGN1cnJlbnQgbG9uZyBpcyBub24tQVNDSUkuCi0gICAgICByZW1haW5pbmcgLT0gdW5hbGlnbmVkOwotICAgICAgZm9yICg7IHJlbWFpbmluZyA+PSA4ICYmIChVTlNBRkUuZ2V0TG9uZyhieXRlcywgb2Zmc2V0KSAmIEFTQ0lJX01BU0tfTE9ORykgPT0gMDsKLSAgICAgICAgICBvZmZzZXQgKz0gOCwgcmVtYWluaW5nIC09IDgpIHt9Ci0gICAgICByZXR1cm4gbWF4Q2hhcnMgLSByZW1haW5pbmc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2FtZSBhcyB7QGxpbmsgVXRmOCNlc3RpbWF0ZUNvbnNlY3V0aXZlQXNjaWkoQnl0ZUJ1ZmZlciwgaW50LCBpbnQpfSBleGNlcHQgdGhhdCBpdCB1c2VzIHRoZQotICAgICAqIG1vc3QgZWZmaWNpZW50IG1ldGhvZCBhdmFpbGFibGUgdG8gdGhlIHBsYXRmb3JtLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGludCB1bnNhZmVFc3RpbWF0ZUNvbnNlY3V0aXZlQXNjaWkobG9uZyBhZGRyZXNzLCBmaW5hbCBpbnQgbWF4Q2hhcnMpIHsKLSAgICAgIGludCByZW1haW5pbmcgPSBtYXhDaGFyczsKLSAgICAgIGlmIChyZW1haW5pbmcgPCBVTlNBRkVfQ09VTlRfQVNDSUlfVEhSRVNIT0xEKSB7Ci0gICAgICAgIC8vIERvbid0IGJvdGhlciB3aXRoIHNtYWxsIHN0cmluZ3MuCi0gICAgICAgIHJldHVybiAwOwotICAgICAgfQotCi0gICAgICAvLyBSZWFkIGJ5dGVzIHVudGlsIDgtYnl0ZSBhbGlnbmVkIHNvIHRoYXQgd2UgY2FuIHJlYWQgbG9uZ3MgaW4gdGhlIGxvb3AgYmVsb3cuCi0gICAgICAvLyBXZSBkbyB0aGlzIGJ5IEFORGluZyB0aGUgYWRkcmVzcyB3aXRoIDcgdG8gZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBuZWVkIHRvCi0gICAgICAvLyBiZSByZWFkIGJlZm9yZSB3ZSdyZSA4LWJ5dGUgYWxpZ25lZC4KLSAgICAgIGZpbmFsIGludCB1bmFsaWduZWQgPSAoaW50KSBhZGRyZXNzICYgNzsKLSAgICAgIGZvciAoaW50IGogPSB1bmFsaWduZWQ7IGogPiAwOyBqLS0pIHsKLSAgICAgICAgaWYgKFVOU0FGRS5nZXRCeXRlKGFkZHJlc3MrKykgPCAwKSB7Ci0gICAgICAgICAgcmV0dXJuIHVuYWxpZ25lZCAtIGo7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gVGhpcyBzaW1wbGUgbG9vcCBzdG9wcyB3aGVuIHdlIGVuY291bnRlciBhIGJ5dGUgPj0gMHg4MCAoaS5lLiBub24tQVNDSUkpLgotICAgICAgLy8gVG8gc3BlZWQgdGhpbmdzIHVwIGZ1cnRoZXIsIHdlJ3JlIHJlYWRpbmcgbG9uZ3MgaW5zdGVhZCBvZiBieXRlcyBzbyB3ZSB1c2UgYSBtYXNrIHRvCi0gICAgICAvLyBkZXRlcm1pbmUgaWYgYW55IGJ5dGUgaW4gdGhlIGN1cnJlbnQgbG9uZyBpcyBub24tQVNDSUkuCi0gICAgICByZW1haW5pbmcgLT0gdW5hbGlnbmVkOwotICAgICAgZm9yICg7IHJlbWFpbmluZyA+PSA4ICYmIChVTlNBRkUuZ2V0TG9uZyhhZGRyZXNzKSAmIEFTQ0lJX01BU0tfTE9ORykgPT0gMDsKLSAgICAgICAgICBhZGRyZXNzICs9IDgsIHJlbWFpbmluZyAtPSA4KSB7fQotICAgICAgcmV0dXJuIG1heENoYXJzIC0gcmVtYWluaW5nOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCBwYXJ0aWFsSXNWYWxpZFV0ZjgoZmluYWwgYnl0ZVtdIGJ5dGVzLCBsb25nIG9mZnNldCwgaW50IHJlbWFpbmluZykgewotICAgICAgLy8gU2tpcCBwYXN0IEFTQ0lJIGNoYXJhY3RlcnMgYXMgcXVpY2tseSBhcyBwb3NzaWJsZS4gCi0gICAgICBmaW5hbCBpbnQgc2tpcHBlZCA9IHVuc2FmZUVzdGltYXRlQ29uc2VjdXRpdmVBc2NpaShieXRlcywgb2Zmc2V0LCByZW1haW5pbmcpOwotICAgICAgcmVtYWluaW5nIC09IHNraXBwZWQ7Ci0gICAgICBvZmZzZXQgKz0gc2tpcHBlZDsKLQotICAgICAgZm9yICg7OykgewotICAgICAgICAvLyBPcHRpbWl6ZSBmb3IgaW50ZXJpb3IgcnVucyBvZiBBU0NJSSBieXRlcy4KLSAgICAgICAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogQ29uc2lkZXIgY2hlY2tpbmcgOCBieXRlcyBhdCBhIHRpbWUgYWZ0ZXIgc29tZSB0aHJlc2hvbGQ/Ci0gICAgICAgIC8vIE1heWJlIGFmdGVyIHNlZWluZyBhIGZldyBpbiBhIHJvdyB0aGF0IGFyZSBBU0NJSSwgZ28gYmFjayB0byBmYXN0IG1vZGU/Ci0gICAgICAgIGludCBieXRlMSA9IDA7Ci0gICAgICAgIGZvciAoOyByZW1haW5pbmcgPiAwICYmIChieXRlMSA9IFVOU0FGRS5nZXRCeXRlKGJ5dGVzLCBvZmZzZXQrKykpID49IDA7IC0tcmVtYWluaW5nKSB7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlbWFpbmluZyA9PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIENPTVBMRVRFOwotICAgICAgICB9Ci0gICAgICAgIHJlbWFpbmluZy0tOwotCi0gICAgICAgIC8vIElmIHdlJ3JlIGhlcmUgYnl0ZTEgaXMgbm90IEFTQ0lJLiBPbmx5IG5lZWQgdG8gaGFuZGxlIDItNCBieXRlIGZvcm1zLgotICAgICAgICBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhFMCkgewotICAgICAgICAgIC8vIFR3by1ieXRlIGZvcm0gKDExMHh4eHh4IDEweHh4eHh4KQotICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgewotICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIGJ5dGUxOwotICAgICAgICAgIH0KLSAgICAgICAgICByZW1haW5pbmctLTsKLQotICAgICAgICAgIC8vIFNpbXVsdGFuZW91c2x5IGNoZWNrcyBmb3IgaWxsZWdhbCB0cmFpbGluZy1ieXRlIGluCi0gICAgICAgICAgLy8gbGVhZGluZyBwb3NpdGlvbiBhbmQgb3ZlcmxvbmcgMi1ieXRlIGZvcm0uCi0gICAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4QzIKLSAgICAgICAgICAgICAgfHwgVU5TQUZFLmdldEJ5dGUoYnl0ZXMsIG9mZnNldCsrKSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChieXRlMSA8IChieXRlKSAweEYwKSB7Ci0gICAgICAgICAgLy8gVGhyZWUtYnl0ZSBmb3JtICgxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eCkKLSAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMikgewotICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIHVuc2FmZUluY29tcGxldGVTdGF0ZUZvcihieXRlcywgYnl0ZTEsIG9mZnNldCwgcmVtYWluaW5nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVtYWluaW5nIC09IDI7Ci0KLSAgICAgICAgICBmaW5hbCBpbnQgYnl0ZTI7Ci0gICAgICAgICAgaWYgKChieXRlMiA9IFVOU0FGRS5nZXRCeXRlKGJ5dGVzLCBvZmZzZXQrKykpID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gb3Zlcmxvbmc/IDUgbW9zdCBzaWduaWZpY2FudCBiaXRzIG11c3Qgbm90IGFsbCBiZSB6ZXJvCi0gICAgICAgICAgICAgIHx8IChieXRlMSA9PSAoYnl0ZSkgMHhFMCAmJiBieXRlMiA8IChieXRlKSAweEEwKQotICAgICAgICAgICAgICAvLyBjaGVjayBmb3IgaWxsZWdhbCBzdXJyb2dhdGUgY29kZXBvaW50cwotICAgICAgICAgICAgICB8fCAoYnl0ZTEgPT0gKGJ5dGUpIDB4RUQgJiYgYnl0ZTIgPj0gKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGJ5dGUzIHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBVTlNBRkUuZ2V0Qnl0ZShieXRlcywgb2Zmc2V0KyspID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIEZvdXItYnl0ZSBmb3JtICgxMTEweHh4eCAxMHh4eHh4eCAxMHh4eHh4eCAxMHh4eHh4eCkKLSAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMykgewotICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIHVuc2FmZUluY29tcGxldGVTdGF0ZUZvcihieXRlcywgYnl0ZTEsIG9mZnNldCwgcmVtYWluaW5nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVtYWluaW5nIC09IDM7Ci0KLSAgICAgICAgICBmaW5hbCBpbnQgYnl0ZTI7Ci0gICAgICAgICAgaWYgKChieXRlMiA9IFVOU0FGRS5nZXRCeXRlKGJ5dGVzLCBvZmZzZXQrKykpID4gKGJ5dGUpIDB4QkYKLSAgICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCAxIDw9IHBsYW5lIDw9IDE2LiAgVHJpY2t5IG9wdGltaXplZCBmb3JtIG9mOgotICAgICAgICAgICAgICAvLyBpZiAoYnl0ZTEgPiAoYnl0ZSkgMHhGNCB8fAotICAgICAgICAgICAgICAvLyAgICAgYnl0ZTEgPT0gKGJ5dGUpIDB4RjAgJiYgYnl0ZTIgPCAoYnl0ZSkgMHg5MCB8fAotICAgICAgICAgICAgICAvLyAgICAgYnl0ZTEgPT0gKGJ5dGUpIDB4RjQgJiYgYnl0ZTIgPiAoYnl0ZSkgMHg4RikKLSAgICAgICAgICAgICAgfHwgKCgoYnl0ZTEgPDwgMjgpICsgKGJ5dGUyIC0gKGJ5dGUpIDB4OTApKSA+PiAzMCkgIT0gMAotICAgICAgICAgICAgICAvLyBieXRlMyB0cmFpbGluZy1ieXRlIHRlc3QKLSAgICAgICAgICAgICAgfHwgVU5TQUZFLmdldEJ5dGUoYnl0ZXMsIG9mZnNldCsrKSA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIGJ5dGU0IHRyYWlsaW5nLWJ5dGUgdGVzdAotICAgICAgICAgICAgICB8fCBVTlNBRkUuZ2V0Qnl0ZShieXRlcywgb2Zmc2V0KyspID4gKGJ5dGUpIDB4QkYpIHsKLSAgICAgICAgICAgIHJldHVybiBNQUxGT1JNRUQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHBhcnRpYWxJc1ZhbGlkVXRmOChsb25nIGFkZHJlc3MsIGludCByZW1haW5pbmcpIHsKLSAgICAgIC8vIFNraXAgcGFzdCBBU0NJSSBjaGFyYWN0ZXJzIGFzIHF1aWNrbHkgYXMgcG9zc2libGUuCi0gICAgICBmaW5hbCBpbnQgc2tpcHBlZCA9IHVuc2FmZUVzdGltYXRlQ29uc2VjdXRpdmVBc2NpaShhZGRyZXNzLCByZW1haW5pbmcpOwotICAgICAgYWRkcmVzcyArPSBza2lwcGVkOwotICAgICAgcmVtYWluaW5nIC09IHNraXBwZWQ7Ci0KLSAgICAgIGZvciAoOzspIHsKLSAgICAgICAgLy8gT3B0aW1pemUgZm9yIGludGVyaW9yIHJ1bnMgb2YgQVNDSUkgYnl0ZXMuCi0gICAgICAgIC8vIFRPRE8obmF0aGFubWl0dGxlcik6IENvbnNpZGVyIGNoZWNraW5nIDggYnl0ZXMgYXQgYSB0aW1lIGFmdGVyIHNvbWUgdGhyZXNob2xkPwotICAgICAgICAvLyBNYXliZSBhZnRlciBzZWVpbmcgYSBmZXcgaW4gYSByb3cgdGhhdCBhcmUgQVNDSUksIGdvIGJhY2sgdG8gZmFzdCBtb2RlPwotICAgICAgICBpbnQgYnl0ZTEgPSAwOwotICAgICAgICBmb3IgKDsgcmVtYWluaW5nID4gMCAmJiAoYnl0ZTEgPSBVTlNBRkUuZ2V0Qnl0ZShhZGRyZXNzKyspKSA+PSAwOyAtLXJlbWFpbmluZykgewotICAgICAgICB9Ci0gICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgewotICAgICAgICAgIHJldHVybiBDT01QTEVURTsKLSAgICAgICAgfQotICAgICAgICByZW1haW5pbmctLTsKLQotICAgICAgICBpZiAoYnl0ZTEgPCAoYnl0ZSkgMHhFMCkgewotICAgICAgICAgIC8vIFR3by1ieXRlIGZvcm0KLQotICAgICAgICAgIGlmIChyZW1haW5pbmcgPT0gMCkgewotICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIGJ5dGUxOwotICAgICAgICAgIH0KLSAgICAgICAgICByZW1haW5pbmctLTsKLQotICAgICAgICAgIC8vIFNpbXVsdGFuZW91c2x5IGNoZWNrcyBmb3IgaWxsZWdhbCB0cmFpbGluZy1ieXRlIGluCi0gICAgICAgICAgLy8gbGVhZGluZyBwb3NpdGlvbiBhbmQgb3ZlcmxvbmcgMi1ieXRlIGZvcm0uCi0gICAgICAgICAgaWYgKGJ5dGUxIDwgKGJ5dGUpIDB4QzIgfHwgVU5TQUZFLmdldEJ5dGUoYWRkcmVzcysrKSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChieXRlMSA8IChieXRlKSAweEYwKSB7Ci0gICAgICAgICAgLy8gVGhyZWUtYnl0ZSBmb3JtCi0KLSAgICAgICAgICBpZiAocmVtYWluaW5nIDwgMikgewotICAgICAgICAgICAgLy8gSW5jb21wbGV0ZSBzZXF1ZW5jZQotICAgICAgICAgICAgcmV0dXJuIHVuc2FmZUluY29tcGxldGVTdGF0ZUZvcihhZGRyZXNzLCBieXRlMSwgcmVtYWluaW5nKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVtYWluaW5nIC09IDI7Ci0KLSAgICAgICAgICBmaW5hbCBieXRlIGJ5dGUyID0gVU5TQUZFLmdldEJ5dGUoYWRkcmVzcysrKTsKLSAgICAgICAgICBpZiAoYnl0ZTIgPiAoYnl0ZSkgMHhCRgotICAgICAgICAgICAgICAvLyBvdmVybG9uZz8gNSBtb3N0IHNpZ25pZmljYW50IGJpdHMgbXVzdCBub3QgYWxsIGJlIHplcm8KLSAgICAgICAgICAgICAgfHwgKGJ5dGUxID09IChieXRlKSAweEUwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4QTApCi0gICAgICAgICAgICAgIC8vIGNoZWNrIGZvciBpbGxlZ2FsIHN1cnJvZ2F0ZSBjb2RlcG9pbnRzCi0gICAgICAgICAgICAgIHx8IChieXRlMSA9PSAoYnl0ZSkgMHhFRCAmJiBieXRlMiA+PSAoYnl0ZSkgMHhBMCkKLSAgICAgICAgICAgICAgLy8gYnl0ZTMgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IFVOU0FGRS5nZXRCeXRlKGFkZHJlc3MrKykgPiAoYnl0ZSkgMHhCRikgewotICAgICAgICAgICAgcmV0dXJuIE1BTEZPUk1FRDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gRm91ci1ieXRlIGZvcm0KLQotICAgICAgICAgIGlmIChyZW1haW5pbmcgPCAzKSB7Ci0gICAgICAgICAgICAvLyBJbmNvbXBsZXRlIHNlcXVlbmNlCi0gICAgICAgICAgICByZXR1cm4gdW5zYWZlSW5jb21wbGV0ZVN0YXRlRm9yKGFkZHJlc3MsIGJ5dGUxLCByZW1haW5pbmcpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZW1haW5pbmcgLT0gMzsKLQotICAgICAgICAgIGZpbmFsIGJ5dGUgYnl0ZTIgPSBVTlNBRkUuZ2V0Qnl0ZShhZGRyZXNzKyspOwotICAgICAgICAgIGlmIChieXRlMiA+IChieXRlKSAweEJGCi0gICAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgMSA8PSBwbGFuZSA8PSAxNi4gIFRyaWNreSBvcHRpbWl6ZWQgZm9ybSBvZjoKLSAgICAgICAgICAgICAgLy8gaWYgKGJ5dGUxID4gKGJ5dGUpIDB4RjQgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEYwICYmIGJ5dGUyIDwgKGJ5dGUpIDB4OTAgfHwKLSAgICAgICAgICAgICAgLy8gICAgIGJ5dGUxID09IChieXRlKSAweEY0ICYmIGJ5dGUyID4gKGJ5dGUpIDB4OEYpCi0gICAgICAgICAgICAgIHx8ICgoKGJ5dGUxIDw8IDI4KSArIChieXRlMiAtIChieXRlKSAweDkwKSkgPj4gMzApICE9IDAKLSAgICAgICAgICAgICAgLy8gYnl0ZTMgdHJhaWxpbmctYnl0ZSB0ZXN0Ci0gICAgICAgICAgICAgIHx8IFVOU0FGRS5nZXRCeXRlKGFkZHJlc3MrKykgPiAoYnl0ZSkgMHhCRgotICAgICAgICAgICAgICAvLyBieXRlNCB0cmFpbGluZy1ieXRlIHRlc3QKLSAgICAgICAgICAgICAgfHwgVU5TQUZFLmdldEJ5dGUoYWRkcmVzcysrKSA+IChieXRlKSAweEJGKSB7Ci0gICAgICAgICAgICByZXR1cm4gTUFMRk9STUVEOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGludCB1bnNhZmVJbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZVtdIGJ5dGVzLCBpbnQgYnl0ZTEsIGxvbmcgb2Zmc2V0LAotICAgICAgICBpbnQgcmVtYWluaW5nKSB7Ci0gICAgICBzd2l0Y2ggKHJlbWFpbmluZykgewotICAgICAgICBjYXNlIDA6IHsKLSAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxKTsKLSAgICAgICAgfQotICAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgICByZXR1cm4gaW5jb21wbGV0ZVN0YXRlRm9yKGJ5dGUxLCBVTlNBRkUuZ2V0Qnl0ZShieXRlcywgb2Zmc2V0KSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAyOiB7Ci0gICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSwgVU5TQUZFLmdldEJ5dGUoYnl0ZXMsIG9mZnNldCksCi0gICAgICAgICAgICAgIFVOU0FGRS5nZXRCeXRlKGJ5dGVzLCBvZmZzZXQgKyAxKSk7Ci0gICAgICAgIH0KLSAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcigpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgaW50IHVuc2FmZUluY29tcGxldGVTdGF0ZUZvcihsb25nIGFkZHJlc3MsIGZpbmFsIGludCBieXRlMSwgaW50IHJlbWFpbmluZykgewotICAgICAgc3dpdGNoIChyZW1haW5pbmcpIHsKLSAgICAgICAgY2FzZSAwOiB7Ci0gICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSk7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSAxOiB7Ci0gICAgICAgICAgcmV0dXJuIGluY29tcGxldGVTdGF0ZUZvcihieXRlMSwgVU5TQUZFLmdldEJ5dGUoYWRkcmVzcykpOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgMjogewotICAgICAgICAgIHJldHVybiBpbmNvbXBsZXRlU3RhdGVGb3IoYnl0ZTEsIFVOU0FGRS5nZXRCeXRlKGFkZHJlc3MpLCBVTlNBRkUuZ2V0Qnl0ZShhZGRyZXNzICsgMSkpOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgICAgICB0aHJvdyBuZXcgQXNzZXJ0aW9uRXJyb3IoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIGZpZWxkIHdpdGggdGhlIGdpdmVuIG5hbWUgd2l0aGluIHRoZSBjbGFzcywgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4gSWYKLSAgICAgKiBmb3VuZCwgdGhlIGZpZWxkIGlzIG1hZGUgYWNjZXNzaWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBGaWVsZCBmaWVsZChDbGFzczw/PiBjbGF6eiwgU3RyaW5nIGZpZWxkTmFtZSkgewotICAgICAgRmllbGQgZmllbGQ7Ci0gICAgICB0cnkgewotICAgICAgICBmaWVsZCA9IGNsYXp6LmdldERlY2xhcmVkRmllbGQoZmllbGROYW1lKTsKLSAgICAgICAgZmllbGQuc2V0QWNjZXNzaWJsZSh0cnVlKTsKLSAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSB0KSB7Ci0gICAgICAgIC8vIEZhaWxlZCB0byBhY2Nlc3MgdGhlIGZpZWxkcy4KLSAgICAgICAgZmllbGQgPSBudWxsOwotICAgICAgfQotICAgICAgbG9nZ2VyLmxvZyhMZXZlbC5GSU5FU1QsICJ7MH0uezF9OiB7Mn0iLAotICAgICAgICAgIG5ldyBPYmplY3RbXSB7Y2xhenouZ2V0TmFtZSgpLCBmaWVsZE5hbWUsIChmaWVsZCAhPSBudWxsID8gImF2YWlsYWJsZSIgOiAidW5hdmFpbGFibGUiKX0pOwotICAgICAgcmV0dXJuIGZpZWxkOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgdGhlIG9mZnNldCBvZiB0aGUgcHJvdmlkZWQgZmllbGQsIG9yIHtAY29kZSAtMX0gaWYge0Bjb2RlIHN1bi5taXNjLlVuc2FmZX0gaXMgbm90Ci0gICAgICogYXZhaWxhYmxlLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgZmllbGRPZmZzZXQoRmllbGQgZmllbGQpIHsKLSAgICAgIHJldHVybiBmaWVsZCA9PSBudWxsIHx8IFVOU0FGRSA9PSBudWxsID8gLTEgOiBVTlNBRkUub2JqZWN0RmllbGRPZmZzZXQoZmllbGQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgYmFzZSBvZmZzZXQgZm9yIGJ5dGUgYXJyYXlzLCBvciB7QGNvZGUgLTF9IGlmIHtAY29kZSBzdW4ubWlzYy5VbnNhZmV9IGlzIG5vdAotICAgICAqIGF2YWlsYWJsZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyA8VD4gaW50IGJ5dGVBcnJheUJhc2VPZmZzZXQoKSB7Ci0gICAgICByZXR1cm4gVU5TQUZFID09IG51bGwgPyAtMSA6IFVOU0FGRS5hcnJheUJhc2VPZmZzZXQoYnl0ZVtdLmNsYXNzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBvZmZzZXQgb2YgdGhlIHtAY29kZSBhZGRyZXNzfSBmaWVsZCBvZiB0aGUgZ2l2ZW4gZGlyZWN0IHtAbGluayBCeXRlQnVmZmVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBsb25nIGFkZHJlc3NPZmZzZXQoQnl0ZUJ1ZmZlciBidWZmZXIpIHsKLSAgICAgIHJldHVybiBVTlNBRkUuZ2V0TG9uZyhidWZmZXIsIEJVRkZFUl9BRERSRVNTX09GRlNFVCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUge0Bjb2RlIHN1bi5taXNjLlVuc2FmZX0gaW5zdGFuY2UsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgYXZhaWxhYmxlIG9uIHRoaXMKLSAgICAgKiBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBzdW4ubWlzYy5VbnNhZmUgZ2V0VW5zYWZlKCkgewotICAgICAgc3VuLm1pc2MuVW5zYWZlIHVuc2FmZSA9IG51bGw7Ci0gICAgICB0cnkgewotICAgICAgICB1bnNhZmUgPSBBY2Nlc3NDb250cm9sbGVyLmRvUHJpdmlsZWdlZChuZXcgUHJpdmlsZWdlZEV4Y2VwdGlvbkFjdGlvbjxzdW4ubWlzYy5VbnNhZmU+KCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBzdW4ubWlzYy5VbnNhZmUgcnVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICAgICAgICBDbGFzczxzdW4ubWlzYy5VbnNhZmU+IGsgPSBzdW4ubWlzYy5VbnNhZmUuY2xhc3M7Ci0KLSAgICAgICAgICAgIC8vIENoZWNrIHRoYXQgdGhpcyBwbGF0Zm9ybSBzdXBwb3J0cyBhbGwgb2YgdGhlIHJlcXVpcmVkIHVuc2FmZSBtZXRob2RzLgotICAgICAgICAgICAgY2hlY2tSZXF1aXJlZE1ldGhvZHMoayk7Ci0KLSAgICAgICAgICAgIGZvciAoRmllbGQgZiA6IGsuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgewotICAgICAgICAgICAgICBmLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgICAgICAgICAgIE9iamVjdCB4ID0gZi5nZXQobnVsbCk7Ci0gICAgICAgICAgICAgIGlmIChrLmlzSW5zdGFuY2UoeCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gay5jYXN0KHgpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICAvLyBUaGUgc3VuLm1pc2MuVW5zYWZlIGZpZWxkIGRvZXMgbm90IGV4aXN0LgotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgIH0gY2F0Y2ggKFRocm93YWJsZSBlKSB7Ci0gICAgICAgIC8vIENhdGNoaW5nIFRocm93YWJsZSBoZXJlIGR1ZSB0byB0aGUgZmFjdCB0aGF0IEdvb2dsZSBBcHBFbmdpbmUgcmFpc2VzIE5vQ2xhc3NEZWZGb3VuZEVycm9yCi0gICAgICAgIC8vIGZvciBVbnNhZmUuCi0gICAgICB9Ci0KLSAgICAgIGxvZ2dlci5sb2coTGV2ZWwuRklORVNULCAic3VuLm1pc2MuVW5zYWZlOiB7fSIsCi0gICAgICAgICAgdW5zYWZlICE9IG51bGwgPyAiYXZhaWxhYmxlIiA6ICJ1bmF2YWlsYWJsZSIpOwotICAgICAgcmV0dXJuIHVuc2FmZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IGFsbCByZXF1aXJlZCBtZXRob2RzIG9mIHtAY29kZSBzdW4ubWlzYy5VbnNhZmV9IGFyZSBhdmFpbGFibGUgb24gdGhpcyBwbGF0Zm9ybS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGNoZWNrUmVxdWlyZWRNZXRob2RzKENsYXNzPHN1bi5taXNjLlVuc2FmZT4gY2xhenopCi0gICAgICAgIHRocm93cyBOb1N1Y2hNZXRob2RFeGNlcHRpb24sIFNlY3VyaXR5RXhjZXB0aW9uIHsKLSAgICAgIC8vIE5lZWRlZCBmb3IgVW5zYWZlIGJ5dGVbXSBhY2Nlc3MKLSAgICAgIGNsYXp6LmdldE1ldGhvZCgiYXJyYXlCYXNlT2Zmc2V0IiwgQ2xhc3MuY2xhc3MpOwotICAgICAgY2xhenouZ2V0TWV0aG9kKCJnZXRCeXRlIiwgT2JqZWN0LmNsYXNzLCBsb25nLmNsYXNzKTsKLSAgICAgIGNsYXp6LmdldE1ldGhvZCgicHV0Qnl0ZSIsIE9iamVjdC5jbGFzcywgbG9uZy5jbGFzcywgYnl0ZS5jbGFzcyk7Ci0gICAgICBjbGF6ei5nZXRNZXRob2QoImdldExvbmciLCBPYmplY3QuY2xhc3MsIGxvbmcuY2xhc3MpOwotCi0gICAgICAvLyBOZWVkZWQgZm9yIFVuc2FmZSBEaXJlY3QgQnl0ZUJ1ZmZlciBhY2Nlc3MKLSAgICAgIGNsYXp6LmdldE1ldGhvZCgib2JqZWN0RmllbGRPZmZzZXQiLCBGaWVsZC5jbGFzcyk7Ci0gICAgICBjbGF6ei5nZXRNZXRob2QoImdldEJ5dGUiLCBsb25nLmNsYXNzKTsKLSAgICAgIGNsYXp6LmdldE1ldGhvZCgiZ2V0TG9uZyIsIE9iamVjdC5jbGFzcywgbG9uZy5jbGFzcyk7Ci0gICAgICBjbGF6ei5nZXRNZXRob2QoInB1dEJ5dGUiLCBsb25nLmNsYXNzLCBieXRlLmNsYXNzKTsKLSAgICAgIGNsYXp6LmdldE1ldGhvZCgiZ2V0TG9uZyIsIGxvbmcuY2xhc3MpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgVXRmOCgpIHt9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTU4YjA4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjU2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFRoaXMgY2xhc3MgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBhbmQgZ2VuZXJhdGVkCi0gKiBtZXNzYWdlIGltcGxlbWVudGF0aW9ucy4gIEl0IGlzIHB1YmxpYyBvbmx5IGJlY2F1c2UgdGhvc2UgZ2VuZXJhdGVkIG1lc3NhZ2VzCi0gKiBkbyBub3QgcmVzaWRlIGluIHRoZSB7QGNvZGUgcHJvdG9idWZ9IHBhY2thZ2UuICBPdGhlcnMgc2hvdWxkIG5vdCB1c2UgdGhpcwotICogY2xhc3MgZGlyZWN0bHkuCi0gKgotICogVGhpcyBjbGFzcyBjb250YWlucyBjb25zdGFudHMgYW5kIGhlbHBlciBmdW5jdGlvbnMgdXNlZnVsIGZvciBkZWFsaW5nIHdpdGgKLSAqIHRoZSBQcm90b2NvbCBCdWZmZXIgd2lyZSBmb3JtYXQuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFdpcmVGb3JtYXQgewotICAvLyBEbyBub3QgYWxsb3cgaW5zdGFudGlhdGlvbi4KLSAgcHJpdmF0ZSBXaXJlRm9ybWF0KCkge30KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgID0gMDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9TVEFSVF9HUk9VUCAgICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfRU5EX0dST1VQICAgICAgICA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICAgPSA1OwotCi0gIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfQklUUyA9IDM7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfTUFTSyA9ICgxIDw8IFRBR19UWVBFX0JJVFMpIC0gMTsKLQotICAvKiogR2l2ZW4gYSB0YWcgdmFsdWUsIGRldGVybWluZXMgdGhlIHdpcmUgdHlwZSAodGhlIGxvd2VyIDMgYml0cykuICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldFRhZ1dpcmVUeXBlKGZpbmFsIGludCB0YWcpIHsKLSAgICByZXR1cm4gdGFnICYgVEFHX1RZUEVfTUFTSzsKLSAgfQotCi0gIC8qKiBHaXZlbiBhIHRhZyB2YWx1ZSwgZGV0ZXJtaW5lcyB0aGUgZmllbGQgbnVtYmVyICh0aGUgdXBwZXIgMjkgYml0cykuICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldFRhZ0ZpZWxkTnVtYmVyKGZpbmFsIGludCB0YWcpIHsKLSAgICByZXR1cm4gdGFnID4+PiBUQUdfVFlQRV9CSVRTOwotICB9Ci0KLSAgLyoqIE1ha2VzIGEgdGFnIHZhbHVlIGdpdmVuIGEgZmllbGQgbnVtYmVyIGFuZCB3aXJlIHR5cGUuICovCi0gIHN0YXRpYyBpbnQgbWFrZVRhZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB3aXJlVHlwZSkgewotICAgIHJldHVybiAoZmllbGROdW1iZXIgPDwgVEFHX1RZUEVfQklUUykgfCB3aXJlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBMaXRlIGVxdWl2YWxlbnQgdG8ge0BsaW5rIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZX0uICBUaGlzIGlzCi0gICAqIG9ubHkgaGVyZSB0byBzdXBwb3J0IHRoZSBsaXRlIHJ1bnRpbWUgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSB1c2Vycy4KLSAgICovCi0gIHB1YmxpYyBlbnVtIEphdmFUeXBlIHsKLSAgICBJTlQoMCksCi0gICAgTE9ORygwTCksCi0gICAgRkxPQVQoMEYpLAotICAgIERPVUJMRSgwRCksCi0gICAgQk9PTEVBTihmYWxzZSksCi0gICAgU1RSSU5HKCIiKSwKLSAgICBCWVRFX1NUUklORyhCeXRlU3RyaW5nLkVNUFRZKSwKLSAgICBFTlVNKG51bGwpLAotICAgIE1FU1NBR0UobnVsbCk7Ci0KLSAgICBKYXZhVHlwZShmaW5hbCBPYmplY3QgZGVmYXVsdERlZmF1bHQpIHsKLSAgICAgIHRoaXMuZGVmYXVsdERlZmF1bHQgPSBkZWZhdWx0RGVmYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLCBpZiBpdCdzIGEgcHJpbWl0aXZlCi0gICAgICogdHlwZS4KLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0RGVmYXVsdERlZmF1bHQoKSB7Ci0gICAgICByZXR1cm4gZGVmYXVsdERlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdERlZmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IHRvIHtAbGluayBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZX0uICBUaGlzIGlzCi0gICAqIG9ubHkgaGVyZSB0byBzdXBwb3J0IHRoZSBsaXRlIHJ1bnRpbWUgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSB1c2Vycy4KLSAgICovCi0gIHB1YmxpYyBlbnVtIEZpZWxkVHlwZSB7Ci0gICAgRE9VQkxFICAoSmF2YVR5cGUuRE9VQkxFICAgICAsIFdJUkVUWVBFX0ZJWEVENjQgICAgICAgICApLAotICAgIEZMT0FUICAgKEphdmFUeXBlLkZMT0FUICAgICAgLCBXSVJFVFlQRV9GSVhFRDMyICAgICAgICAgKSwKLSAgICBJTlQ2NCAgIChKYXZhVHlwZS5MT05HICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCi0gICAgVUlOVDY0ICAoSmF2YVR5cGUuTE9ORyAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAotICAgIElOVDMyICAgKEphdmFUeXBlLklOVCAgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKLSAgICBGSVhFRDY0IChKYXZhVHlwZS5MT05HICAgICAgICwgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICksCi0gICAgRklYRUQzMiAoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICApLAotICAgIEJPT0wgICAgKEphdmFUeXBlLkJPT0xFQU4gICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKLSAgICBTVFJJTkcgIChKYXZhVHlwZS5TVFJJTkcgICAgICwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IH0KLSAgICB9LAotICAgIEdST1VQICAgKEphdmFUeXBlLk1FU1NBR0UgICAgLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCAgICAgKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2FibGUoKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsgfQotICAgIH0sCi0gICAgTUVTU0FHRSAoSmF2YVR5cGUuTUVTU0FHRSAgICAsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOyB9Ci0gICAgfSwKLSAgICBCWVRFUyAgIChKYXZhVHlwZS5CWVRFX1NUUklORywgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgewotICAgICAgICByZXR1cm4gZmFsc2U7IH0KLSAgICB9LAotICAgIFVJTlQzMiAgKEphdmFUeXBlLklOVCAgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKLSAgICBFTlVNICAgIChKYXZhVHlwZS5FTlVNICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCi0gICAgU0ZJWEVEMzIoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICApLAotICAgIFNGSVhFRDY0KEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9GSVhFRDY0ICAgICAgICAgKSwKLSAgICBTSU5UMzIgIChKYXZhVHlwZS5JTlQgICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCi0gICAgU0lOVDY0ICAoSmF2YVR5cGUuTE9ORyAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApOwotCi0gICAgRmllbGRUeXBlKGZpbmFsIEphdmFUeXBlIGphdmFUeXBlLCBmaW5hbCBpbnQgd2lyZVR5cGUpIHsKLSAgICAgIHRoaXMuamF2YVR5cGUgPSBqYXZhVHlwZTsKLSAgICAgIHRoaXMud2lyZVR5cGUgPSB3aXJlVHlwZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIEphdmFUeXBlIGphdmFUeXBlOwotICAgIHByaXZhdGUgZmluYWwgaW50IHdpcmVUeXBlOwotCi0gICAgcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgeyByZXR1cm4gamF2YVR5cGU7IH0KLSAgICBwdWJsaWMgaW50IGdldFdpcmVUeXBlKCkgeyByZXR1cm4gd2lyZVR5cGU7IH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2FibGUoKSB7IHJldHVybiB0cnVlOyB9Ci0gIH0KLQotICAvLyBGaWVsZCBudW1iZXJzIGZvciBmaWVsZHMgaW4gTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4KLSAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9JVEVNICAgID0gMTsKLSAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9UWVBFX0lEID0gMjsKLSAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9NRVNTQUdFID0gMzsKLQotICAvLyBUYWcgbnVtYmVycy4KLSAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9JVEVNX1RBRyA9Ci0gICAgbWFrZVRhZyhNRVNTQUdFX1NFVF9JVEVNLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCk7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfSVRFTV9FTkRfVEFHID0KLSAgICBtYWtlVGFnKE1FU1NBR0VfU0VUX0lURU0sIFdJUkVUWVBFX0VORF9HUk9VUCk7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfVFlQRV9JRF9UQUcgPQotICAgIG1ha2VUYWcoTUVTU0FHRV9TRVRfVFlQRV9JRCwgV0lSRVRZUEVfVkFSSU5UKTsKLSAgc3RhdGljIGZpbmFsIGludCBNRVNTQUdFX1NFVF9NRVNTQUdFX1RBRyA9Ci0gICAgbWFrZVRhZyhNRVNTQUdFX1NFVF9NRVNTQUdFLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLQotICAvKioKLSAgICogVmFsaWRhdGlvbiBsZXZlbCBmb3IgaGFuZGxpbmcgaW5jb21pbmcgc3RyaW5nIGZpZWxkIGRhdGEgd2hpY2ggcG90ZW50aWFsbHkKLSAgICogY29udGFpbiBub24tVVRGOCBieXRlcy4KLSAgICovCi0gIGVudW0gVXRmOFZhbGlkYXRpb24gewotICAgIC8qKiBFYWdlcmx5IHBhcnNlcyB0byBTdHJpbmc7IHNpbGVudGx5IGFjY2VwdHMgaW52YWxpZCBVVEY4IGJ5dGVzLiAqLwotICAgIExPT1NFIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgT2JqZWN0IHJlYWRTdHJpbmcoQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIGlucHV0LnJlYWRTdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9LAotICAgIC8qKiBFYWdlcmx5IHBhcnNlcyB0byBTdHJpbmc7IHRocm93cyBhbiBJT0V4Y2VwdGlvbiBvbiBpbnZhbGlkIGJ5dGVzLiAqLwotICAgIFNUUklDVCB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIE9iamVjdCByZWFkU3RyaW5nKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBpbnB1dC5yZWFkU3RyaW5nUmVxdWlyZVV0ZjgoKTsKLSAgICAgIH0KLSAgICB9LAotICAgIC8qKiBLZWVwIGRhdGEgYXMgQnl0ZVN0cmluZzsgdmFsaWRhdGlvbi9jb252ZXJzaW9uIHRvIFN0cmluZyBpcyBsYXp5LiAqLwotICAgIExBWlkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBPYmplY3QgcmVhZFN0cmluZyhDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICByZXR1cm4gaW5wdXQucmVhZEJ5dGVzKCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIC8qKiBSZWFkIGEgc3RyaW5nIGZpZWxkIGZyb20gdGhlIGlucHV0IHdpdGggdGhlIHByb3BlciBVVEY4IHZhbGlkYXRpb24uICovCi0gICAgYWJzdHJhY3QgT2JqZWN0IHJlYWRTdHJpbmcoQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYSBmaWVsZCBvZiBhbnkgcHJpbWl0aXZlIHR5cGUgZm9yIGltbXV0YWJsZSBtZXNzYWdlcyBmcm9tIGEKLSAgICogQ29kZWRJbnB1dFN0cmVhbS4gRW51bXMsIGdyb3VwcywgYW5kIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBub3QgaGFuZGxlZCBieQotICAgKiB0aGlzIG1ldGhvZC4KLSAgICoKLSAgICogQHBhcmFtIGlucHV0IFRoZSBzdHJlYW0gZnJvbSB3aGljaCB0byByZWFkLgotICAgKiBAcGFyYW0gdHlwZSBEZWNsYXJlZCB0eXBlIG9mIHRoZSBmaWVsZC4KLSAgICogQHBhcmFtIHV0ZjhWYWxpZGF0aW9uIERpZmZlcmVudCBzdHJpbmcgVVRGOCB2YWxpZGF0aW9uIGxldmVsIGZvciBoYW5kbGluZwotICAgKiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nIGZpZWxkcy4KLSAgICogQHJldHVybiBBbiBvYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLCBvZiB0aGUgZXhhY3QKLSAgICogICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5Ci0gICAqICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCi0gICAqICAgICAgICAgdGhpcyBmaWVsZC4KLSAgICovCi0gIHN0YXRpYyBPYmplY3QgcmVhZFByaW1pdGl2ZUZpZWxkKAotICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgIEZpZWxkVHlwZSB0eXBlLAotICAgICAgVXRmOFZhbGlkYXRpb24gdXRmOFZhbGlkYXRpb24pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICBjYXNlIERPVUJMRSAgOiByZXR1cm4gaW5wdXQucmVhZERvdWJsZSAgKCk7Ci0gICAgICBjYXNlIEZMT0FUICAgOiByZXR1cm4gaW5wdXQucmVhZEZsb2F0ICAgKCk7Ci0gICAgICBjYXNlIElOVDY0ICAgOiByZXR1cm4gaW5wdXQucmVhZEludDY0ICAgKCk7Ci0gICAgICBjYXNlIFVJTlQ2NCAgOiByZXR1cm4gaW5wdXQucmVhZFVJbnQ2NCAgKCk7Ci0gICAgICBjYXNlIElOVDMyICAgOiByZXR1cm4gaW5wdXQucmVhZEludDMyICAgKCk7Ci0gICAgICBjYXNlIEZJWEVENjQgOiByZXR1cm4gaW5wdXQucmVhZEZpeGVkNjQgKCk7Ci0gICAgICBjYXNlIEZJWEVEMzIgOiByZXR1cm4gaW5wdXQucmVhZEZpeGVkMzIgKCk7Ci0gICAgICBjYXNlIEJPT0wgICAgOiByZXR1cm4gaW5wdXQucmVhZEJvb2wgICAgKCk7Ci0gICAgICBjYXNlIEJZVEVTICAgOiByZXR1cm4gaW5wdXQucmVhZEJ5dGVzICAgKCk7Ci0gICAgICBjYXNlIFVJTlQzMiAgOiByZXR1cm4gaW5wdXQucmVhZFVJbnQzMiAgKCk7Ci0gICAgICBjYXNlIFNGSVhFRDMyOiByZXR1cm4gaW5wdXQucmVhZFNGaXhlZDMyKCk7Ci0gICAgICBjYXNlIFNGSVhFRDY0OiByZXR1cm4gaW5wdXQucmVhZFNGaXhlZDY0KCk7Ci0gICAgICBjYXNlIFNJTlQzMiAgOiByZXR1cm4gaW5wdXQucmVhZFNJbnQzMiAgKCk7Ci0gICAgICBjYXNlIFNJTlQ2NCAgOiByZXR1cm4gaW5wdXQucmVhZFNJbnQ2NCAgKCk7Ci0KLSAgICAgIGNhc2UgU1RSSU5HICA6IHJldHVybiB1dGY4VmFsaWRhdGlvbi5yZWFkU3RyaW5nKGlucHV0KTsKLSAgICAgIGNhc2UgR1JPVVA6Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgInJlYWRQcmltaXRpdmVGaWVsZCgpIGNhbm5vdCBoYW5kbGUgbmVzdGVkIGdyb3Vwcy4iKTsKLSAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAicmVhZFByaW1pdGl2ZUZpZWxkKCkgY2Fubm90IGhhbmRsZSBlbWJlZGRlZCBtZXNzYWdlcy4iKTsKLSAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgLy8gV2UgZG9uJ3QgaGFuZGxlIGVudW1zIGJlY2F1c2Ugd2UgZG9uJ3Qga25vdyB3aGF0IHRvIGRvIGlmIHRoZQotICAgICAgICAvLyB2YWx1ZSBpcyBub3QgcmVjb2duaXplZC4KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAicmVhZFByaW1pdGl2ZUZpZWxkKCkgY2Fubm90IGhhbmRsZSBlbnVtcy4iKTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICJUaGVyZSBpcyBubyB3YXkgdG8gZ2V0IGhlcmUsIGJ1dCB0aGUgY29tcGlsZXIgdGhpbmtzIG90aGVyd2lzZS4iKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9BYnN0cmFjdE1lc3NhZ2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RjOWZjMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RPcHRpbWl6ZUZvci5UZXN0T3B0aW1pemVkRm9yU2l6ZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZEZvcmVpZ247Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0VW5wYWNrZWRUeXBlczsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIEFic3RyYWN0TWVzc2FnZX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0TWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIC8qKgotICAgKiBFeHRlbmRzIEFic3RyYWN0TWVzc2FnZSBhbmQgd3JhcHMgc29tZSBvdGhlciBtZXNzYWdlIG9iamVjdC4gIFRoZSBtZXRob2RzCi0gICAqIG9mIHRoZSBNZXNzYWdlIGludGVyZmFjZSB3aGljaCBhcmVuJ3QgZXhwbGljaXRseSBpbXBsZW1lbnRlZCBieQotICAgKiBBYnN0cmFjdE1lc3NhZ2UgYXJlIGZvcndhcmRlZCB0byB0aGUgd3JhcHBlZCBvYmplY3QuICBUaGlzIGFsbG93cyB1cyB0bwotICAgKiB0ZXN0IHRoYXQgQWJzdHJhY3RNZXNzYWdlJ3MgaW1wbGVtZW50YXRpb25zIHdvcmsgZXZlbiBpZiB0aGUgd3JhcHBlZAotICAgKiBvYmplY3QgZG9lcyBub3QgdXNlIHRoZW0uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlIHsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2Ugd3JhcHBlZE1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihNZXNzYWdlIHdyYXBwZWRNZXNzYWdlKSB7Ci0gICAgICB0aGlzLndyYXBwZWRNZXNzYWdlID0gd3JhcHBlZE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICB9Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcigKLSAgICAgICAgd3JhcHBlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKTsKLSAgICB9Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldEFsbEZpZWxkcygpOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5oYXNGaWVsZChmaWVsZCk7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0RmllbGQoZmllbGQpOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgpIHsKLSAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCk7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKLSAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCk7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCkgewotICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHdyYXBwZWRNZXNzYWdlLm5ld0J1aWxkZXJGb3JUeXBlKCkpOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciB0b0J1aWxkZXIoKSB7Ci0gICAgICByZXR1cm4gbmV3IEJ1aWxkZXIod3JhcHBlZE1lc3NhZ2UudG9CdWlsZGVyKCkpOwotICAgIH0KLQotICAgIHN0YXRpYyBjbGFzcyBCdWlsZGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXI8QnVpbGRlcj4gewotICAgICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgd3JhcHBlZEJ1aWxkZXI7Ci0KLSAgICAgIHB1YmxpYyBCdWlsZGVyKE1lc3NhZ2UuQnVpbGRlciB3cmFwcGVkQnVpbGRlcikgewotICAgICAgICB0aGlzLndyYXBwZWRCdWlsZGVyID0gd3JhcHBlZEJ1aWxkZXI7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgYnVpbGQoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcih3cmFwcGVkQnVpbGRlci5idWlsZCgpKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgYnVpbGRQYXJ0aWFsKCkgewotICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIod3JhcHBlZEJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHdyYXBwZWRCdWlsZGVyLmNsb25lKCkpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgICByZXR1cm4gY2xvbmUoKS5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgewotICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKAotICAgICAgICAgIHdyYXBwZWRCdWlsZGVyLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBNYXA8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmdldEFsbEZpZWxkcygpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcih3cmFwcGVkQnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5oYXNGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHdyYXBwZWRCdWlsZGVyLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgQnVpbGRlciBjbGVhckZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgICB3cmFwcGVkQnVpbGRlci5jbGVhckZpZWxkKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB3cmFwcGVkQnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB3cmFwcGVkQnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldFVua25vd25GaWVsZHMoKSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRVbmtub3duRmllbGRzKCk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldFVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICAgICAgd3JhcHBlZEJ1aWxkZXIuc2V0VW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgZ2V0RmllbGRCdWlsZGVyKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0RmllbGRCdWlsZGVyKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFBhcnNlcjw/IGV4dGVuZHMgTWVzc2FnZT4gZ2V0UGFyc2VyRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5nZXRQYXJzZXJGb3JUeXBlKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25UZXN0ZXIgPQotICAgIG5ldyBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIG51bGwpOwotCi0gIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIgPQotICAgIG5ldyBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcigKLSAgICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcihUZXN0VXRpbC5nZXRBbGxTZXQoKSkpCi0gICAgICAgIC5jbGVhcigpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0Q2xlYXIoKFRlc3RBbGxUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9Ci0gICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkpCi0gICAgICAgIC5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0QWxsU2V0KCkpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KChUZXN0QWxsVHlwZXMpIG1lc3NhZ2Uud3JhcHBlZE1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLSAgICBNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9IG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKFRlc3RVdGlsLmdldEFsbFNldCgpKTsKLQotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksCi0gICAgICAgICAgICAgICAgIGFic3RyYWN0TWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZSBhYnN0cmFjdE1lc3NhZ2UgPSBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihUZXN0VXRpbC5nZXRBbGxTZXQoKSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoCi0gICAgICBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpLAotICAgICAgICAgICAgICAgICBhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkpOwotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9Ci0gICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRBbGxTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoKFRlc3RBbGxUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZ1VuaW5pdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UmVxdWlyZWRGb3JlaWduLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxNZXNzYWdlQnVpbGRlcigpLnNldER1bW15MigxMCk7Ci0gICAgQnl0ZVN0cmluZyBieXRlcyA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgTWVzc2FnZS5CdWlsZGVyIGFic3RyYWN0TWVzc2FnZUJ1aWxkZXIgPQotICAgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpKTsKLSAgICAvLyBtZXJnZUZyb20oKSBzaG91bGQgbm90IHRocm93IGluaXRpYWxpemF0aW9uIGVycm9yLgotICAgIGFic3RyYWN0TWVzc2FnZUJ1aWxkZXIubWVyZ2VGcm9tKGJ5dGVzKS5idWlsZFBhcnRpYWwoKTsKLSAgICB0cnkgewotICAgICAgYWJzdHJhY3RNZXNzYWdlQnVpbGRlci5tZXJnZUZyb20oYnl0ZXMpLmJ1aWxkKCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gZXgpIHsKLSAgICAgIC8vIHBhc3MKLSAgICB9Ci0KLSAgICAvLyB0ZXN0IER5bmFtaWNNZXNzYWdlIGRpcmVjdGx5LgotICAgIE1lc3NhZ2UuQnVpbGRlciBkeW5hbWljTWVzc2FnZUJ1aWxkZXIgPSBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKAotICAgICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgLy8gbWVyZ2VGcm9tKCkgc2hvdWxkIG5vdCB0aHJvdyBpbml0aWFsaXphdGlvbiBlcnJvci4KLSAgICBkeW5hbWljTWVzc2FnZUJ1aWxkZXIubWVyZ2VGcm9tKGJ5dGVzKS5idWlsZFBhcnRpYWwoKTsKLSAgICB0cnkgewotICAgICAgZHluYW1pY01lc3NhZ2VCdWlsZGVyLm1lcmdlRnJvbShieXRlcykuYnVpbGQoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBleCkgewotICAgICAgLy8gcGFzcwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYWNrZWRTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZSBhYnN0cmFjdE1lc3NhZ2UgPQotICAgICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoCi0gICAgICBUZXN0UGFja2VkVHlwZXMucGFyc2VGcm9tKGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpLAotICAgICAgICAgICAgICAgICBhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhY2tlZFBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKFRlc3RQYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCkpOwotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9Ci0gICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoKFRlc3RQYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5wYWNrZWRTZXJpYWxpemF0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZSBhYnN0cmFjdE1lc3NhZ2UgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoVGVzdFV0aWwuZ2V0VW5wYWNrZWRTZXQoKSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldCgKLSAgICAgIFRlc3RVbnBhY2tlZFR5cGVzLnBhcnNlRnJvbShhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpKTsKLQotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpLAotICAgICAgICAgICAgICAgICBhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlUGFja2VkVG9VbnBhY2tlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFVucGFja2VkVHlwZXMubmV3QnVpbGRlcigpKTsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQotICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCkpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0VW5wYWNrZWRGaWVsZHNTZXQoCi0gICAgICAoVGVzdFVucGFja2VkVHlwZXMpIG1lc3NhZ2Uud3JhcHBlZE1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlVW5wYWNrZWRUb1BhY2tlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKSk7Ci0gICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KLSAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RVdGlsLmdldFVucGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCkpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRmllbGRzU2V0KChUZXN0UGFja2VkVHlwZXMpIG1lc3NhZ2Uud3JhcHBlZE1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFVucGFja2VkUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFVucGFja2VkVHlwZXMubmV3QnVpbGRlcigpKTsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQotICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0VW5wYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldCgKLSAgICAgIChUZXN0VW5wYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T3B0aW1pemVkRm9yU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFdlJ3JlIG1vc3RseSBvbmx5IGNoZWNraW5nIHRoYXQgdGhpcyBjbGFzcyB3YXMgY29tcGlsZWQgc3VjY2Vzc2Z1bGx5LgotICAgIFRlc3RPcHRpbWl6ZWRGb3JTaXplIG1lc3NhZ2UgPQotICAgICAgVGVzdE9wdGltaXplZEZvclNpemUubmV3QnVpbGRlcigpLnNldEkoMSkuYnVpbGQoKTsKLSAgICBtZXNzYWdlID0gVGVzdE9wdGltaXplZEZvclNpemUucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGVzdHMgZm9yIGlzSW5pdGlhbGl6ZWQoKS4KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXN0UmVxdWlyZWQgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEID0KLSAgICBUZXN0UmVxdWlyZWQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RSZXF1aXJlZCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEID0KLSAgICBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpLnNldEEoMSkuc2V0QigyKS5zZXRDKDMpLmJ1aWxkKCk7Ci0KLSAgcHVibGljIHZvaWQgdGVzdElzSW5pdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UmVxdWlyZWQuQnVpbGRlciBidWlsZGVyID0gVGVzdFJlcXVpcmVkLm5ld0J1aWxkZXIoKTsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIgYWJzdHJhY3RCdWlsZGVyID0KLSAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoYnVpbGRlcik7Ci0KLSAgICBhc3NlcnRGYWxzZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImEsIGIsIGMiLCBhYnN0cmFjdEJ1aWxkZXIuZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKLSAgICBidWlsZGVyLnNldEEoMSk7Ci0gICAgYXNzZXJ0RmFsc2UoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJiLCBjIiwgYWJzdHJhY3RCdWlsZGVyLmdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7Ci0gICAgYnVpbGRlci5zZXRCKDEpOwotICAgIGFzc2VydEZhbHNlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydEVxdWFscygiYyIsIGFic3RyYWN0QnVpbGRlci5nZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOwotICAgIGJ1aWxkZXIuc2V0QygxKTsKLSAgICBhc3NlcnRUcnVlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgYWJzdHJhY3RCdWlsZGVyLmdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Rm9yZWlnbklzSW5pdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UmVxdWlyZWRGb3JlaWduLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpOwotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBhYnN0cmFjdEJ1aWxkZXIgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihidWlsZGVyKTsKLQotICAgIGFzc2VydFRydWUoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIiLCBhYnN0cmFjdEJ1aWxkZXIuZ2V0SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKLQotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0RmFsc2UoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5hLCBvcHRpb25hbF9tZXNzYWdlLmIsIG9wdGlvbmFsX21lc3NhZ2UuYyIsCi0gICAgICAgIGFic3RyYWN0QnVpbGRlci5nZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOwotCi0gICAgYnVpbGRlci5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0VHJ1ZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIGFic3RyYWN0QnVpbGRlci5nZXRJbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOwotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRGYWxzZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmEsIHJlcGVhdGVkX21lc3NhZ2VbMF0uYiwgcmVwZWF0ZWRfbWVzc2FnZVswXS5jIiwKLSAgICAgICAgYWJzdHJhY3RCdWlsZGVyLmdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7Ci0KLSAgICBidWlsZGVyLnNldFJlcGVhdGVkTWVzc2FnZSgwLCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgYWJzdHJhY3RCdWlsZGVyLmdldEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUZXN0cyBmb3IgbWVyZ2VGcm9tCi0KLSAgc3RhdGljIGZpbmFsIFRlc3RBbGxUeXBlcyBNRVJHRV9TT1VSQ0UgPQotICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgIC5zZXRPcHRpb25hbEludDMyKDEpCi0gICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoImZvbyIpCi0gICAgICAuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkKLSAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygiYmFyIikKLSAgICAgIC5idWlsZCgpOwotCi0gIHN0YXRpYyBmaW5hbCBUZXN0QWxsVHlwZXMgTUVSR0VfREVTVCA9Ci0gICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgLnNldE9wdGlvbmFsSW50NjQoMikKLSAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiYmF6IikKLSAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDMpLmJ1aWxkKCkpCi0gICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoInF1eCIpCi0gICAgICAuYnVpbGQoKTsKLQotICBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX1JFU1VMVF9URVhUID0KLSAgICAgICJvcHRpb25hbF9pbnQzMjogMVxuIiArCi0gICAgICAib3B0aW9uYWxfaW50NjQ6IDJcbiIgKwotICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIlxuIiArCi0gICAgICAib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIHtcbiIgKwotICAgICAgIiAgYzogM1xuIiArCi0gICAgICAifVxuIiArCi0gICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcInF1eFwiXG4iICsKLSAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiYmFyXCJcbiI7Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgcmVzdWx0ID0KLSAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoCi0gICAgICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKE1FUkdFX0RFU1QpKQotICAgICAgLm1lcmdlRnJvbShNRVJHRV9TT1VSQ0UpLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoTUVSR0VfUkVTVUxUX1RFWFQsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRlc3RzIGZvciBlcXVhbHMgYW5kIGhhc2hDb2RlCi0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0FuZEhhc2hDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIGEgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLSAgICBUZXN0QWxsVHlwZXMgYiA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKLSAgICBUZXN0QWxsVHlwZXMgYyA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKGIpLmFkZFJlcGVhdGVkU3RyaW5nKCJ4IikuYnVpbGQoKTsKLSAgICBUZXN0QWxsVHlwZXMgZCA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKGMpLmFkZFJlcGVhdGVkU3RyaW5nKCJ5IikuYnVpbGQoKTsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBlID0gVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zIGYgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKGUpCi0gICAgICAgIC5hZGRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCA5OTkpLmJ1aWxkKCk7Ci0KLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChhKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChiKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChjKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChkKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChlKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChmKTsKLQotICAgIGNoZWNrTm90RXF1YWwoYSwgYik7Ci0gICAgY2hlY2tOb3RFcXVhbChhLCBjKTsKLSAgICBjaGVja05vdEVxdWFsKGEsIGQpOwotICAgIGNoZWNrTm90RXF1YWwoYSwgZSk7Ci0gICAgY2hlY2tOb3RFcXVhbChhLCBmKTsKLQotICAgIGNoZWNrTm90RXF1YWwoYiwgYyk7Ci0gICAgY2hlY2tOb3RFcXVhbChiLCBkKTsKLSAgICBjaGVja05vdEVxdWFsKGIsIGUpOwotICAgIGNoZWNrTm90RXF1YWwoYiwgZik7Ci0KLSAgICBjaGVja05vdEVxdWFsKGMsIGQpOwotICAgIGNoZWNrTm90RXF1YWwoYywgZSk7Ci0gICAgY2hlY2tOb3RFcXVhbChjLCBmKTsKLQotICAgIGNoZWNrTm90RXF1YWwoZCwgZSk7Ci0gICAgY2hlY2tOb3RFcXVhbChkLCBmKTsKLQotICAgIGNoZWNrTm90RXF1YWwoZSwgZik7Ci0KLSAgICAvLyBEZXNlcmlhbGl6aW5nIGludG8gdGhlIFRlc3RFbXB0eU1lc3NhZ2Ugc3VjaCB0aGF0IGV2ZXJ5IGZpZWxkCi0gICAgLy8gaXMgYW4ge0BsaW5rIFVua25vd25GaWVsZFNldC5GaWVsZH0uCi0gICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlIGVVbmtub3duRmllbGRzID0KLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShlLnRvQnl0ZUFycmF5KCkpOwotICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZSBmVW5rbm93bkZpZWxkcyA9Ci0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZS5wYXJzZUZyb20oZi50b0J5dGVBcnJheSgpKTsKLSAgICBjaGVja05vdEVxdWFsKGVVbmtub3duRmllbGRzLCBmVW5rbm93bkZpZWxkcyk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZVVua25vd25GaWVsZHMpOwotICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGZVbmtub3duRmllbGRzKTsKLQotICAgIC8vIFN1YnNlcXVlbnQgcmVjb25zdGl0dXRpb25zIHNob3VsZCBiZSBpZGVudGljYWwKLSAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UgZVVua25vd25GaWVsZHMyID0KLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShlLnRvQnl0ZUFycmF5KCkpOwotICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGVVbmtub3duRmllbGRzLCBlVW5rbm93bkZpZWxkczIpOwotICB9Ci0KLQotICAvKioKLSAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBwcm90byBoYXMgc3ltbWV0cmljIGVxdWFscyBhbmQgaGFzaENvZGUgbWV0aG9kcy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGl0c2VsZi4KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgbWVzc2FnZSk7Ci0KLSAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGEgZHluYW1pYyBjb3B5IG9mIGl0c2VsZi4KLSAgICBEeW5hbWljTWVzc2FnZSBkeW5hbWljID0gRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihtZXNzYWdlKS5idWlsZCgpOwotICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KG1lc3NhZ2UsIGR5bmFtaWMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gcHJvdG9zIGFyZSBlcXVhbCBhbmQgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoTWVzc2FnZSBtZXNzYWdlMSwgTWVzc2FnZSBtZXNzYWdlMikgewotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMSwgbWVzc2FnZTIpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMiwgbWVzc2FnZTEpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5oYXNoQ29kZSgpLCBtZXNzYWdlMS5oYXNoQ29kZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvcyBhcmUgbm90IGVxdWFsIGFuZCBoYXZlIGRpZmZlcmVudCBoYXNoIGNvZGVzLgotICAgKgotICAgKiBAd2FybmluZyBJdCdzIHZhbGlkIGZvciBub24tZXF1YWwgb2JqZWN0cyB0byBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZSwgc28KLSAgICogICB0aGlzIHRlc3QgaXMgc3RyaWN0ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4gSG93ZXZlciwgdGhpcyBzaG91bGQgaGFwcGVuCi0gICAqICAgcmVsYXRpdmVseSByYXJlbHkuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tOb3RFcXVhbChNZXNzYWdlIG0xLCBNZXNzYWdlIG0yKSB7Ci0gICAgU3RyaW5nIGVxdWFsc0Vycm9yID0gU3RyaW5nLmZvcm1hdCgiJXMgc2hvdWxkIG5vdCBiZSBlcXVhbCB0byAlcyIsIG0xLCBtMik7Ci0gICAgYXNzZXJ0RmFsc2UoZXF1YWxzRXJyb3IsIG0xLmVxdWFscyhtMikpOwotICAgIGFzc2VydEZhbHNlKGVxdWFsc0Vycm9yLCBtMi5lcXVhbHMobTEpKTsKLQotICAgIGFzc2VydEZhbHNlKAotICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyBzaG91bGQgaGF2ZSBhIGRpZmZlcmVudCBoYXNoIGNvZGUgZnJvbSAlcyIsIG0xLCBtMiksCi0gICAgICAgIG0xLmhhc2hDb2RlKCkgPT0gbTIuaGFzaENvZGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2hlY2tCeXRlU3RyaW5nSXNVdGY4T25VdGY4KCkgewotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJzb21lIHRleHQiKTsKLSAgICBBYnN0cmFjdE1lc3NhZ2VMaXRlLmNoZWNrQnl0ZVN0cmluZ0lzVXRmOChieXRlU3RyaW5nKTsKLSAgICAvLyBObyBleGNlcHRpb24gdGhyb3duLgotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENoZWNrQnl0ZVN0cmluZ0lzVXRmOE9uTm9uVXRmOCgpIHsKLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPQotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tKG5ldyBieXRlW117KGJ5dGUpIDB4ODB9KTsgLy8gQSBsb25lIGNvbnRpbnVhdGlvbiBieXRlLgotICAgIHRyeSB7Ci0gICAgICBBYnN0cmFjdE1lc3NhZ2VMaXRlLmNoZWNrQnl0ZVN0cmluZ0lzVXRmOChieXRlU3RyaW5nKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIEFic3RyYWN0TWVzc2FnZUxpdGUuY2hlY2tCeXRlU3RyaW5nSXNVdGY4IHRvIHRocm93IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgIGFzc2VydEVxdWFscygiQnl0ZSBzdHJpbmcgaXMgbm90IFVURi04LiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0FueVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQW55VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZjkxZWQ5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQW55VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBhbnlfdGVzdC5BbnlUZXN0UHJvdG8uVGVzdEFueTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciBBbnkgbWVzc2FnZS4KLSAqLwotcHVibGljIGNsYXNzIEFueVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHB1YmxpYyB2b2lkIHRlc3RBbnlHZW5lcmF0ZWRBcGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBUZXN0QW55IGNvbnRhaW5lciA9IFRlc3RBbnkubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRWYWx1ZShBbnkucGFjayhtZXNzYWdlKSkuYnVpbGQoKTsKLQotICAgIGFzc2VydFRydWUoY29udGFpbmVyLmdldFZhbHVlKCkuaXMoVGVzdEFsbFR5cGVzLmNsYXNzKSk7Ci0gICAgYXNzZXJ0RmFsc2UoY29udGFpbmVyLmdldFZhbHVlKCkuaXMoVGVzdEFueS5jbGFzcykpOwotCi0gICAgVGVzdEFsbFR5cGVzIHJlc3VsdCA9IGNvbnRhaW5lci5nZXRWYWx1ZSgpLnVucGFjayhUZXN0QWxsVHlwZXMuY2xhc3MpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChyZXN1bHQpOwotCi0KLSAgICAvLyBVbnBhY2tpbmcgdG8gYSB3cm9uZyB0eXBlIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgIHRyeSB7Ci0gICAgICBUZXN0QW55IHdyb25nTWVzc2FnZSA9IGNvbnRhaW5lci5nZXRWYWx1ZSgpLnVucGFjayhUZXN0QW55LmNsYXNzKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQuCi0gICAgfQotCi0gICAgLy8gVGVzdCB0aGF0IHVucGFja2luZyB0aHJvd3MgYW4gZXhjZXB0aW9uIGlmIHBhcnNpbmcgZmFpbHMuCi0gICAgVGVzdEFueS5CdWlsZGVyIGNvbnRhaW5lckJ1aWxkZXIgPSBjb250YWluZXIudG9CdWlsZGVyKCk7Ci0gICAgY29udGFpbmVyQnVpbGRlci5nZXRWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSgKLSAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShuZXcgYnl0ZVtdezB4MTF9KSk7Ci0gICAgY29udGFpbmVyID0gY29udGFpbmVyQnVpbGRlci5idWlsZCgpOwotICAgIHRyeSB7Ci0gICAgICBUZXN0QWxsVHlwZXMgcGFyc2luZ0ZhaWxlZCA9IGNvbnRhaW5lci5nZXRWYWx1ZSgpLnVucGFjayhUZXN0QWxsVHlwZXMuY2xhc3MpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZC4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q3VzdG9tVHlwZVVybHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBUZXN0QW55IGNvbnRhaW5lciA9IFRlc3RBbnkubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRWYWx1ZShBbnkucGFjayhtZXNzYWdlLCAieHh4LmNvbSIpKS5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAieHh4LmNvbS8iICsgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICBjb250YWluZXIuZ2V0VmFsdWUoKS5nZXRUeXBlVXJsKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VmFsdWUoKS5pcyhUZXN0QWxsVHlwZXMuY2xhc3MpKTsKLSAgICBhc3NlcnRGYWxzZShjb250YWluZXIuZ2V0VmFsdWUoKS5pcyhUZXN0QW55LmNsYXNzKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXMgcmVzdWx0ID0gY29udGFpbmVyLmdldFZhbHVlKCkudW5wYWNrKFRlc3RBbGxUeXBlcy5jbGFzcyk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KHJlc3VsdCk7Ci0KLSAgICBjb250YWluZXIgPSBUZXN0QW55Lm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoQW55LnBhY2sobWVzc2FnZSwgInl5eS5jb20vIikpLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ5eXkuY29tLyIgKyBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgIGNvbnRhaW5lci5nZXRWYWx1ZSgpLmdldFR5cGVVcmwoKSk7Ci0KLSAgICBhc3NlcnRUcnVlKGNvbnRhaW5lci5nZXRWYWx1ZSgpLmlzKFRlc3RBbGxUeXBlcy5jbGFzcykpOwotICAgIGFzc2VydEZhbHNlKGNvbnRhaW5lci5nZXRWYWx1ZSgpLmlzKFRlc3RBbnkuY2xhc3MpKTsKLQotICAgIHJlc3VsdCA9IGNvbnRhaW5lci5nZXRWYWx1ZSgpLnVucGFjayhUZXN0QWxsVHlwZXMuY2xhc3MpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChyZXN1bHQpOwotCi0gICAgY29udGFpbmVyID0gVGVzdEFueS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFZhbHVlKEFueS5wYWNrKG1lc3NhZ2UsICIiKSkuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIi8iICsgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICBjb250YWluZXIuZ2V0VmFsdWUoKS5nZXRUeXBlVXJsKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShjb250YWluZXIuZ2V0VmFsdWUoKS5pcyhUZXN0QWxsVHlwZXMuY2xhc3MpKTsKLSAgICBhc3NlcnRGYWxzZShjb250YWluZXIuZ2V0VmFsdWUoKS5pcyhUZXN0QW55LmNsYXNzKSk7Ci0KLSAgICByZXN1bHQgPSBjb250YWluZXIuZ2V0VmFsdWUoKS51bnBhY2soVGVzdEFsbFR5cGVzLmNsYXNzKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQocmVzdWx0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDYWNoZWRVbnBhY2tSZXN1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBUZXN0QW55IGNvbnRhaW5lciA9IFRlc3RBbnkubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRWYWx1ZShBbnkucGFjayhtZXNzYWdlKSkuYnVpbGQoKTsKLQotICAgIGFzc2VydFRydWUoY29udGFpbmVyLmdldFZhbHVlKCkuaXMoVGVzdEFsbFR5cGVzLmNsYXNzKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXMgcmVzdWx0MSA9IGNvbnRhaW5lci5nZXRWYWx1ZSgpLnVucGFjayhUZXN0QWxsVHlwZXMuY2xhc3MpOwotICAgIFRlc3RBbGxUeXBlcyByZXN1bHQyID0gY29udGFpbmVyLmdldFZhbHVlKCkudW5wYWNrKFRlc3RBbGxUeXBlcy5jbGFzcyk7Ci0gICAgYXNzZXJ0VHJ1ZShyZXN1bHQxID09IHJlc3VsdDIpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jvb2xlYW5BcnJheUxpc3RUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jvb2xlYW5BcnJheUxpc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0Yjk2YzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Cb29sZWFuQXJyYXlMaXN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgQm9vbGVhbkFycmF5TGlzdH0uCi0gKiAKLSAqIEBhdXRob3IgZHdlaXNAZ29vZ2xlLmNvbSAoRGFuaWVsIFdlaXMpCi0gKi8KLXB1YmxpYyBjbGFzcyBCb29sZWFuQXJyYXlMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5BcnJheUxpc3QgVU5BUllfTElTVCA9IG5ld0ltbXV0YWJsZUJvb2xlYW5BcnJheUxpc3QodHJ1ZSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEJvb2xlYW5BcnJheUxpc3QgVEVSVElBUllfTElTVCA9Ci0gICAgICBuZXdJbW11dGFibGVCb29sZWFuQXJyYXlMaXN0KHRydWUsIHRydWUsIGZhbHNlKTsKLSAgCi0gIHByaXZhdGUgQm9vbGVhbkFycmF5TGlzdCBsaXN0OwotICAKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbGlzdCA9IG5ldyBCb29sZWFuQXJyYXlMaXN0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUxpc3RSZXR1cm5zU2FtZUluc3RhbmNlKCkgewotICAgIGFzc2VydFNhbWUoQm9vbGVhbkFycmF5TGlzdC5lbXB0eUxpc3QoKSwgQm9vbGVhbkFycmF5TGlzdC5lbXB0eUxpc3QoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUxpc3RJc0ltbXV0YWJsZSgpIHsKLSAgICBhc3NlcnRJbW11dGFibGUoQm9vbGVhbkFycmF5TGlzdC5lbXB0eUxpc3QoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNYWtlSW1tdXRhYmxlKCkgewotICAgIGxpc3QuYWRkQm9vbGVhbih0cnVlKTsKLSAgICBsaXN0LmFkZEJvb2xlYW4oZmFsc2UpOwotICAgIGxpc3QuYWRkQm9vbGVhbih0cnVlKTsKLSAgICBsaXN0LmFkZEJvb2xlYW4odHJ1ZSk7Ci0gICAgbGlzdC5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgYXNzZXJ0SW1tdXRhYmxlKGxpc3QpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZpY2F0aW9uV2l0aEl0ZXJhdGlvbigpIHsKLSAgICBsaXN0LmFkZEFsbChhc0xpc3QodHJ1ZSwgZmFsc2UsIGZhbHNlLCB0cnVlKSk7Ci0gICAgSXRlcmF0b3I8Qm9vbGVhbj4gaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgKGJvb2xlYW4pIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgKGJvb2xlYW4pIGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgbGlzdC5zZXQoMCwgdHJ1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCAoYm9vbGVhbikgaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICB0cnkgewotICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgbGlzdC5hZGQoMCwgZmFsc2UpOwotICAgIHRyeSB7Ci0gICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgKGJvb2xlYW4pIFRFUlRJQVJZX0xJU1QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgKGJvb2xlYW4pIFRFUlRJQVJZX0xJU1QuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIChib29sZWFuKSBURVJUSUFSWV9MSVNULmdldCgyKSk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIFRFUlRJQVJZX0xJU1QuZ2V0KC0xKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBURVJUSUFSWV9MSVNULmdldCgzKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotICAgIGFzc2VydEVxdWFscyh0cnVlLCBURVJUSUFSWV9MSVNULmdldEJvb2xlYW4oMCkpOwotICAgIGFzc2VydEVxdWFscyh0cnVlLCBURVJUSUFSWV9MSVNULmdldEJvb2xlYW4oMSkpOwotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgVEVSVElBUllfTElTVC5nZXRCb29sZWFuKDIpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgVEVSVElBUllfTElTVC5nZXQoLTEpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIFRFUlRJQVJZX0xJU1QuZ2V0KDMpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotICAgIGFzc2VydEVxdWFscygwLCBCb29sZWFuQXJyYXlMaXN0LmVtcHR5TGlzdCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIFVOQVJZX0xJU1Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgVEVSVElBUllfTElTVC5zaXplKCkpOwotCi0gICAgbGlzdC5hZGRCb29sZWFuKHRydWUpOwotICAgIGxpc3QuYWRkQm9vbGVhbihmYWxzZSk7Ci0gICAgbGlzdC5hZGRCb29sZWFuKGZhbHNlKTsKLSAgICBsaXN0LmFkZEJvb2xlYW4oZmFsc2UpOwotICAgIGFzc2VydEVxdWFscyg0LCBsaXN0LnNpemUoKSk7Ci0gICAgCi0gICAgbGlzdC5yZW1vdmUoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICAKLSAgICBsaXN0LmFkZCh0cnVlKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgbGlzdC5zaXplKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotICAgIGxpc3QuYWRkQm9vbGVhbihmYWxzZSk7Ci0gICAgbGlzdC5hZGRCb29sZWFuKGZhbHNlKTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIChib29sZWFuKSBsaXN0LnNldCgwLCB0cnVlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpc3QuZ2V0Qm9vbGVhbigwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIChib29sZWFuKSBsaXN0LnNldCgxLCBmYWxzZSkpOwotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5nZXRCb29sZWFuKDEpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoLTEsIHRydWUpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoMiwgZmFsc2UpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXRJbnQoKSB7Ci0gICAgbGlzdC5hZGRCb29sZWFuKHRydWUpOwotICAgIGxpc3QuYWRkQm9vbGVhbih0cnVlKTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbGlzdC5zZXRCb29sZWFuKDAsIGZhbHNlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmdldEJvb2xlYW4oMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIGxpc3Quc2V0Qm9vbGVhbigxLCBmYWxzZSkpOwotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbGlzdC5nZXRCb29sZWFuKDEpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXRCb29sZWFuKC0xLCBmYWxzZSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LnNldEJvb2xlYW4oMiwgdHJ1ZSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZCh0cnVlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCh0cnVlKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRUcnVlKGxpc3QuYWRkKGZhbHNlKSk7Ci0gICAgbGlzdC5hZGQoMCwgZmFsc2UpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoZmFsc2UsIHRydWUsIGZhbHNlKSwgbGlzdCk7Ci0gICAgCi0gICAgbGlzdC5hZGQoMCwgZmFsc2UpOwotICAgIGxpc3QuYWRkKDAsIHRydWUpOwotICAgIC8vIEZvcmNlIGEgcmVzaXplIGJ5IGdldHRpbmcgdXAgdG8gMTEgZWxlbWVudHMuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGxpc3QuYWRkKHRydWUpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KHRydWUsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUsIHRydWUpLCBsaXN0KTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoLTEsIGZhbHNlKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZCg0LCB0cnVlKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QWRkSW50KCkgewotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LnNpemUoKSk7Ci0KLSAgICBsaXN0LmFkZEJvb2xlYW4odHJ1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCh0cnVlKSwgbGlzdCk7Ci0KLSAgICBsaXN0LmFkZEJvb2xlYW4oZmFsc2UpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QodHJ1ZSwgZmFsc2UpLCBsaXN0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oZmFsc2UpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIChib29sZWFuKSBsaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBsaXN0LmdldEJvb2xlYW4oMCkpOwotICAgIAotICAgIGFzc2VydFRydWUobGlzdC5hZGRBbGwoYXNMaXN0KHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdChmYWxzZSwgdHJ1ZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSksIGxpc3QpOwotICAgIAotICAgIGFzc2VydFRydWUobGlzdC5hZGRBbGwoVEVSVElBUllfTElTVCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoZmFsc2UsIHRydWUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsIHRydWUsIHRydWUsIGZhbHNlKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRGYWxzZShsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy48Qm9vbGVhbj5lbXB0eUxpc3QoKSkpOwotICAgIGFzc2VydEZhbHNlKGxpc3QuYWRkQWxsKEJvb2xlYW5BcnJheUxpc3QuZW1wdHlMaXN0KCkpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLSAgICBsaXN0LmFkZEFsbChURVJUSUFSWV9MSVNUKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgKGJvb2xlYW4pIGxpc3QucmVtb3ZlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KHRydWUsIGZhbHNlKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRUcnVlKGxpc3QucmVtb3ZlKEJvb2xlYW4uVFJVRSkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoZmFsc2UpLCBsaXN0KTsKLQotICAgIGFzc2VydEZhbHNlKGxpc3QucmVtb3ZlKEJvb2xlYW4uVFJVRSkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoZmFsc2UpLCBsaXN0KTsKLQotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgKGJvb2xlYW4pIGxpc3QucmVtb3ZlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KCksIGxpc3QpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgtMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmUoMCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEltbXV0YWJsZShCb29sZWFuQXJyYXlMaXN0IGxpc3QpIHsKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoZmFsc2UpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZCgwLCB0cnVlKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoQ29sbGVjdGlvbnMuPEJvb2xlYW4+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KGZhbHNlKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKG5ldyBCb29sZWFuQXJyYXlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKHRydWUpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgVU5BUllfTElTVCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKDAsIENvbGxlY3Rpb25zLjxCb29sZWFuPmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRCb29sZWFuKHRydWUpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmNsZWFyKCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmUoMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKG5ldyBPYmplY3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlQWxsKENvbGxlY3Rpb25zLjxCb29sZWFuPmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKEJvb2xlYW4uVFJVRSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoQ29sbGVjdGlvbnMuPEJvb2xlYW4+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJldGFpbkFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oQm9vbGVhbi5UUlVFKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmV0YWluQWxsKFVOQVJZX0xJU1QpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnNldCgwLCB0cnVlKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXRCb29sZWFuKDAsIGZhbHNlKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgQm9vbGVhbkFycmF5TGlzdCBuZXdJbW11dGFibGVCb29sZWFuQXJyYXlMaXN0KGJvb2xlYW4uLi4gZWxlbWVudHMpIHsKLSAgICBCb29sZWFuQXJyYXlMaXN0IGxpc3QgPSBuZXcgQm9vbGVhbkFycmF5TGlzdCgpOwotICAgIGZvciAoYm9vbGVhbiBlbGVtZW50IDogZWxlbWVudHMpIHsKLSAgICAgIGxpc3QuYWRkQm9vbGVhbihlbGVtZW50KTsKLSAgICB9Ci0gICAgbGlzdC5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQm91bmRlZEJ5dGVTdHJpbmdUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0JvdW5kZWRCeXRlU3RyaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYjEwZWU3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQm91bmRlZEJ5dGVTdHJpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMDAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRlc3RzIHtAbGluayBCb3VuZGVkQnl0ZVN0cmluZ30sIHdoaWNoIGV4dGVuZHMge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nfSwKLSAqIGJ5IGluaGVyaXRpbmcgdGhlIHRlc3RzIGZyb20ge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nVGVzdH0uICBUaGUgb25seSBtZXRob2Qgd2hpY2gKLSAqIGlzIHN0cmFuZ2UgZW5vdWdoIHRoYXQgaXQgbmVlZHMgdG8gYmUgb3ZlcnJpZGRlbiBoZXJlIGlzIHtAbGluayAjdGVzdFRvU3RyaW5nKCl9LgotICoKLSAqIEBhdXRob3IgY2FybGFudG9uQGdvb2dsZS5jb20gKENhcmwgSGF2ZXJsKQotICovCi1wdWJsaWMgY2xhc3MgQm91bmRlZEJ5dGVTdHJpbmdUZXN0IGV4dGVuZHMgTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0IHsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBjbGFzc1VuZGVyVGVzdCA9ICJCb3VuZGVkQnl0ZVN0cmluZyI7Ci0gICAgYnl0ZVtdIHNvdXJjZUJ5dGVzID0gQnl0ZVN0cmluZ1Rlc3QuZ2V0VGVzdEJ5dGVzKDIzNDEsIDExMzM3NzY2TCk7Ci0gICAgaW50IGZyb20gPSAxMDA7Ci0gICAgaW50IHRvID0gc291cmNlQnl0ZXMubGVuZ3RoIC0gMTAwOwotICAgIHN0cmluZ1VuZGVyVGVzdCA9IEJ5dGVTdHJpbmcuY29weUZyb20oc291cmNlQnl0ZXMpLnN1YnN0cmluZyhmcm9tLCB0byk7Ci0gICAgcmVmZXJlbmNlQnl0ZXMgPSBuZXcgYnl0ZVt0byAtIGZyb21dOwotICAgIFN5c3RlbS5hcnJheWNvcHkoc291cmNlQnl0ZXMsIGZyb20sIHJlZmVyZW5jZUJ5dGVzLCAwLCB0byAtIGZyb20pOwotICAgIGV4cGVjdGVkSGFzaENvZGUgPSA3Mjc1NzU4ODc7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIHVuaWNvZGUgPSBCeXRlU3RyaW5nLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcyhJbnRlcm5hbC5VVEZfOCkpOwotICAgIEJ5dGVTdHJpbmcgY2hvcHBlZCA9IHVuaWNvZGUuc3Vic3RyaW5nKDIsIHVuaWNvZGUuc2l6ZSgpIC0gNik7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIi5zdWJzdHJpbmcoKSBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHR5cGUiLAotICAgICAgICBjbGFzc1VuZGVyVGVzdCwgZ2V0QWN0dWFsQ2xhc3NOYW1lKGNob3BwZWQpKTsKLQotICAgIFN0cmluZyByb3VuZFRyaXBTdHJpbmcgPSBjaG9wcGVkLnRvU3RyaW5nKFVURl84KTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHVuaWNvZGUgYnl0ZXMgbXVzdCBtYXRjaCIsCi0gICAgICAgIHRlc3RTdHJpbmcuc3Vic3RyaW5nKDIsIHRlc3RTdHJpbmcubGVuZ3RoKCkgLSA2KSwgcm91bmRUcmlwU3RyaW5nKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldFRvU3RyaW5nKCkgewotICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIHVuaWNvZGUgPSBCeXRlU3RyaW5nLndyYXAodGVzdFN0cmluZy5nZXRCeXRlcyhJbnRlcm5hbC5VVEZfOCkpOwotICAgIEJ5dGVTdHJpbmcgY2hvcHBlZCA9IHVuaWNvZGUuc3Vic3RyaW5nKDIsIHVuaWNvZGUuc2l6ZSgpIC0gNik7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIi5zdWJzdHJpbmcoKSBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHR5cGUiLAotICAgICAgICBjbGFzc1VuZGVyVGVzdCwgZ2V0QWN0dWFsQ2xhc3NOYW1lKGNob3BwZWQpKTsKLQotICAgIFN0cmluZyByb3VuZFRyaXBTdHJpbmcgPSBjaG9wcGVkLnRvU3RyaW5nKEludGVybmFsLlVURl84KTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHVuaWNvZGUgYnl0ZXMgbXVzdCBtYXRjaCIsCi0gICAgICAgIHRlc3RTdHJpbmcuc3Vic3RyaW5nKDIsIHRlc3RTdHJpbmcubGVuZ3RoKCkgLSA2KSwgcm91bmRUcmlwU3RyaW5nKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7Ci0gICAgb29zLndyaXRlT2JqZWN0KHN0cmluZ1VuZGVyVGVzdCk7Ci0gICAgb29zLmNsb3NlKCk7Ci0gICAgYnl0ZVtdIHBpY2tsZWQgPSBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwaWNrbGVkKTsKLSAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgIE9iamVjdCBvID0gb2lzLnJlYWRPYmplY3QoKTsKLSAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgZ2V0IGEgQnl0ZVN0cmluZyBiYWNrIiwgbyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpOwotICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGdldCBhbiBlcXVhbCBCeXRlU3RyaW5nIGJhY2siLCBzdHJpbmdVbmRlclRlc3QsIG8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVCdWZmZXJXcml0ZXJUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVCdWZmZXJXcml0ZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNiZTc0MmUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlQnVmZmVyV3JpdGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5uaW8uQnl0ZUJ1ZmZlcjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5SYW5kb207Ci0KLS8qKgotICogVGVzdHMgZm9yIHtAbGluayBCeXRlQnVmZmVyV3JpdGVyfS4KLSAqLwotcHVibGljIGNsYXNzIEJ5dGVCdWZmZXJXcml0ZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHB1YmxpYyB2b2lkIHRlc3RIZWFwQnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0IGEgc21hbGwgYW5kIGxhcmdlIGJ1ZmZlci4KLSAgICB0ZXN0V3JpdGUoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDApKTsKLSAgICB0ZXN0V3JpdGUoQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxMDI0ICogMTAwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RGlyZWN0QnVmZmVyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0IGEgc21hbGwgYW5kIGxhcmdlIGJ1ZmZlci4KLSAgICB0ZXN0V3JpdGUoQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgxMDApKTsKLSAgICB0ZXN0V3JpdGUoQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdCgxMDI0ICogMTAwKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdGVzdFdyaXRlKEJ5dGVCdWZmZXIgYnVmZmVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbGxSYW5kb20oYnVmZmVyKTsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKGJ1ZmZlci5yZW1haW5pbmcoKSk7Ci0gICAgQnl0ZUJ1ZmZlcldyaXRlci53cml0ZShidWZmZXIsIG9zKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVmZmVyLnBvc2l0aW9uKCkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh0b0FycmF5KGJ1ZmZlciksIG9zLnRvQnl0ZUFycmF5KCkpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBmaWxsUmFuZG9tKEJ5dGVCdWZmZXIgYnVmKSB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnVmLnJlbWFpbmluZygpXTsKLSAgICBuZXcgUmFuZG9tKCkubmV4dEJ5dGVzKGJ5dGVzKTsKLSAgICBidWYucHV0KGJ5dGVzKTsKLSAgICBidWYuZmxpcCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHByaXZhdGUgYnl0ZVtdIHRvQXJyYXkoQnl0ZUJ1ZmZlciBidWYpIHsKLSAgICBpbnQgb3JpZ2luYWxQb3NpdGlvbiA9IGJ1Zi5wb3NpdGlvbigpOwotICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J1Zi5yZW1haW5pbmcoKV07Ci0gICAgYnVmLmdldChieXRlcyk7Ci0gICAgYnVmLnBvc2l0aW9uKG9yaWdpbmFsUG9zaXRpb24pOwotICAgIHJldHVybiBieXRlczsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDlmMjY2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQnl0ZVN0cmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLk91dHB1dDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0LkZpZWxkOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLQotLyoqCi0gKiBUZXN0IG1ldGhvZHMgd2l0aCBpbXBsZW1lbnRhdGlvbnMgaW4ge0BsaW5rIEJ5dGVTdHJpbmd9LCBwbHVzIGRvIHNvbWUgdG9wLWxldmVsICJpbnRlZ3JhdGlvbiIKLSAqIHRlc3RzLgotICoKLSAqIEBhdXRob3IgY2FybGFudG9uQGdvb2dsZS5jb20gKENhcmwgSGF2ZXJsKQotICovCi1wdWJsaWMgY2xhc3MgQnl0ZVN0cmluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQ2hhcnNldCBVVEZfMTYgPSBDaGFyc2V0LmZvck5hbWUoIlVURi0xNiIpOwotCi0gIHN0YXRpYyBieXRlW10gZ2V0VGVzdEJ5dGVzKGludCBzaXplLCBsb25nIHNlZWQpIHsKLSAgICBSYW5kb20gcmFuZG9tID0gbmV3IFJhbmRvbShzZWVkKTsKLSAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgcmFuZG9tLm5leHRCeXRlcyhyZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIGJ5dGVbXSBnZXRUZXN0Qnl0ZXMoaW50IHNpemUpIHsKLSAgICByZXR1cm4gZ2V0VGVzdEJ5dGVzKHNpemUsIDQ0NTU2NkwpOwotICB9Ci0KLSAgcHJpdmF0ZSBieXRlW10gZ2V0VGVzdEJ5dGVzKCkgewotICAgIHJldHVybiBnZXRUZXN0Qnl0ZXMoMTAwMCk7Ci0gIH0KLQotICAvLyBDb21wYXJlIHRoZSBlbnRpcmUgbGVmdCBhcnJheSB3aXRoIGEgc3Vic2V0IG9mIHRoZSByaWdodCBhcnJheS4KLSAgcHJpdmF0ZSBib29sZWFuIGlzQXJyYXlSYW5nZShieXRlW10gbGVmdCwgYnl0ZVtdIHJpZ2h0LCBpbnQgcmlnaHRPZmZzZXQsIGludCBsZW5ndGgpIHsKLSAgICBib29sZWFuIHN0aWxsRXF1YWwgPSAobGVmdC5sZW5ndGggPT0gbGVuZ3RoKTsKLSAgICBmb3IgKGludCBpID0gMDsgKHN0aWxsRXF1YWwgJiYgaSA8IGxlbmd0aCk7ICsraSkgewotICAgICAgc3RpbGxFcXVhbCA9IChsZWZ0W2ldID09IHJpZ2h0W3JpZ2h0T2Zmc2V0ICsgaV0pOwotICAgIH0KLSAgICByZXR1cm4gc3RpbGxFcXVhbDsKLSAgfQotCi0gIC8vIFJldHVybnMgdHJ1ZSBvbmx5IGlmIHRoZSBnaXZlbiB0d28gYXJyYXlzIGhhdmUgaWRlbnRpY2FsIGNvbnRlbnRzLgotICBwcml2YXRlIGJvb2xlYW4gaXNBcnJheShieXRlW10gbGVmdCwgYnl0ZVtdIHJpZ2h0KSB7Ci0gICAgcmV0dXJuIGxlZnQubGVuZ3RoID09IHJpZ2h0Lmxlbmd0aCAmJiBpc0FycmF5UmFuZ2UobGVmdCwgcmlnaHQsIDAsIGxlZnQubGVuZ3RoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTdWJzdHJpbmdfQmVnaW5JbmRleCgpIHsKLSAgICBieXRlW10gYnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoKTsKLSAgICBCeXRlU3RyaW5nIHN1YnN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpLnN1YnN0cmluZyg1MDApOwotICAgIGFzc2VydFRydWUoInN1YnN0cmluZyBtdXN0IGNvbnRhaW4gdGhlIHRhaWwgb2YgdGhlIHN0cmluZyIsCi0gICAgICAgIGlzQXJyYXlSYW5nZShzdWJzdHJpbmcudG9CeXRlQXJyYXkoKSwgYnl0ZXMsIDUwMCwgYnl0ZXMubGVuZ3RoIC0gNTAwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weUZyb21fQnl0ZXNPZmZzZXRTaXplKCkgewotICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOwotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMsIDUwMCwgMjAwKTsKLSAgICBhc3NlcnRUcnVlKCJjb3B5RnJvbSBzdWItcmFuZ2UgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCi0gICAgICAgIGlzQXJyYXlSYW5nZShieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIGJ5dGVzLCA1MDAsIDIwMCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvcHlGcm9tX0J5dGVzKCkgewotICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOwotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpOwotICAgIGFzc2VydFRydWUoImNvcHlGcm9tIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAotICAgICAgICBpc0FycmF5KGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwgYnl0ZXMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbV9CeXRlQnVmZmVyU2l6ZSgpIHsKLSAgICBieXRlW10gYnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoKTsKLSAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKGJ5dGVzLmxlbmd0aCk7Ci0gICAgYnl0ZUJ1ZmZlci5wdXQoYnl0ZXMpOwotICAgIGJ5dGVCdWZmZXIucG9zaXRpb24oNTAwKTsKLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVCdWZmZXIsIDIwMCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiY29weUZyb20gYnl0ZUJ1ZmZlciBzdWItcmFuZ2UgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCi0gICAgICAgIGlzQXJyYXlSYW5nZShieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIGJ5dGVzLCA1MDAsIDIwMCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvcHlGcm9tX0J5dGVCdWZmZXIoKSB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKCk7Ci0gICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShieXRlcy5sZW5ndGgpOwotICAgIGJ5dGVCdWZmZXIucHV0KGJ5dGVzKTsKLSAgICBieXRlQnVmZmVyLnBvc2l0aW9uKDUwMCk7Ci0gICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbShieXRlQnVmZmVyKTsKLSAgICBhc3NlcnRUcnVlKCJjb3B5RnJvbSBieXRlQnVmZmVyIHN1Yi1yYW5nZSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKLSAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwgYnl0ZXMsIDUwMCwgYnl0ZXMubGVuZ3RoIC0gNTAwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weUZyb21fU3RyaW5nRW5jb2RpbmcoKSB7Ci0gICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiSSBsb3ZlIHVuaWNvZGUgXHUxMjM0XHU1Njc4IGNoYXJhY3RlcnMiOwotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20odGVzdFN0cmluZywgVVRGXzE2KTsKLSAgICBieXRlW10gdGVzdEJ5dGVzID0gdGVzdFN0cmluZy5nZXRCeXRlcyhVVEZfMTYpOwotICAgIGFzc2VydFRydWUoImNvcHlGcm9tIHN0cmluZyBtdXN0IHJlc3BlY3QgdGhlIGNoYXJzZXQiLAotICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCB0ZXN0Qnl0ZXMsIDAsIHRlc3RCeXRlcy5sZW5ndGgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbV9VdGY4KCkgewotICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCh0ZXN0U3RyaW5nKTsKLSAgICBieXRlW10gdGVzdEJ5dGVzID0gdGVzdFN0cmluZy5nZXRCeXRlcyhJbnRlcm5hbC5VVEZfOCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiY29weUZyb21VdGY4IHN0cmluZyBtdXN0IHJlc3BlY3QgdGhlIGNoYXJzZXQiLAotICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCB0ZXN0Qnl0ZXMsIDAsIHRlc3RCeXRlcy5sZW5ndGgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb3B5RnJvbV9JdGVyYWJsZSgpIHsKLSAgICBieXRlW10gdGVzdEJ5dGVzID0gZ2V0VGVzdEJ5dGVzKDc3Nzc3LCAxMTMzNDRMKTsKLSAgICBmaW5hbCBMaXN0PEJ5dGVTdHJpbmc+IHBpZWNlcyA9IG1ha2VDb25jcmV0ZVBpZWNlcyh0ZXN0Qnl0ZXMpOwotICAgIC8vIENhbGwgY29weUZyb20oKSBvbiBhIENvbGxlY3Rpb24KLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHBpZWNlcyk7Ci0gICAgYXNzZXJ0VHJ1ZSgiY29weUZyb20gYSBMaXN0IG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAotICAgICAgICBpc0FycmF5UmFuZ2UoYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCB0ZXN0Qnl0ZXMsIDAsIHRlc3RCeXRlcy5sZW5ndGgpKTsKLSAgICAvLyBDYWxsIGNvcHlGcm9tIG9uIGFuIGl0ZXJhdGlvbiB0aGF0J3Mgbm90IGEgY29sbGVjdGlvbgotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZ0FsdCA9IEJ5dGVTdHJpbmcuY29weUZyb20obmV3IEl0ZXJhYmxlPEJ5dGVTdHJpbmc+KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgSXRlcmF0b3I8Qnl0ZVN0cmluZz4gaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBwaWVjZXMuaXRlcmF0b3IoKTsKLSAgICAgIH0KLSAgICB9KTsKLSAgICBhc3NlcnRFcXVhbHMoImNvcHlGcm9tIGZyb20gYW4gSXRlcmF0aW9uIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAotICAgICAgICBieXRlU3RyaW5nLCBieXRlU3RyaW5nQWx0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb3B5VG9fVGFyZ2V0T2Zmc2V0KCkgewotICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOwotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpOwotICAgIGJ5dGVbXSB0YXJnZXQgPSBuZXcgYnl0ZVtieXRlcy5sZW5ndGggKyAxMDAwXTsKLSAgICBieXRlU3RyaW5nLmNvcHlUbyh0YXJnZXQsIDQwMCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiY29weUZyb20gYnl0ZUJ1ZmZlciBzdWItcmFuZ2UgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCi0gICAgICAgIGlzQXJyYXlSYW5nZShieXRlcywgdGFyZ2V0LCA0MDAsIGJ5dGVzLmxlbmd0aCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRGcm9tX2VtcHR5U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPQotICAgICAgICBCeXRlU3RyaW5nLnJlYWRGcm9tKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShuZXcgYnl0ZVswXSkpOwotICAgIGFzc2VydFNhbWUoInJlYWRpbmcgYW4gZW1wdHkgc3RyZWFtIG11c3QgcmVzdWx0IGluIHRoZSBFTVBUWSBjb25zdGFudCAiCi0gICAgICAgICsgImJ5dGUgc3RyaW5nIiwgQnl0ZVN0cmluZy5FTVBUWSwgYnl0ZVN0cmluZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21fc21hbGxTdHJlYW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygxMCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRGcm9tX211dGF0aW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBieXRlW10gY2FwdHVyZWRBcnJheSA9IG51bGw7Ci0gICAgRXZpbElucHV0U3RyZWFtIGVpcyA9IG5ldyBFdmlsSW5wdXRTdHJlYW0oKTsKLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLnJlYWRGcm9tKGVpcyk7Ci0KLSAgICBjYXB0dXJlZEFycmF5ID0gZWlzLmNhcHR1cmVkQXJyYXk7Ci0gICAgYnl0ZVtdIG9yaWdpbmFsVmFsdWUgPSBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCk7Ci0gICAgZm9yIChpbnQgeCA9IDA7IHggPCBjYXB0dXJlZEFycmF5Lmxlbmd0aDsgKyt4KSB7Ci0gICAgICBjYXB0dXJlZEFycmF5W3hdID0gKGJ5dGUpIDA7Ci0gICAgfQotCi0gICAgYnl0ZVtdIG5ld1ZhbHVlID0gYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpOwotICAgIGFzc2VydFRydWUoImNvcHlGcm9tIGJ5dGVCdWZmZXIgbXVzdCBub3QgZ3JhbnQgYWNjZXNzIHRvIHVuZGVybHlpbmcgYXJyYXkiLAotICAgICAgICBBcnJheXMuZXF1YWxzKG9yaWdpbmFsVmFsdWUsIG5ld1ZhbHVlKSk7Ci0gIH0KLQotICAvLyBUZXN0cyBzaXplcyB0aGF0IGFyZSBuZWFyIHRoZSByb3BlIGNvcHktb3V0IHRocmVzaG9sZC4KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRGcm9tX21lZGl1bVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKEJ5dGVTdHJpbmcuQ09OQ0FURU5BVEVfQllfQ09QWV9TSVpFIC0gMSkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhCeXRlU3RyaW5nLkNPTkNBVEVOQVRFX0JZX0NPUFlfU0laRSkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhCeXRlU3RyaW5nLkNPTkNBVEVOQVRFX0JZX0NPUFlfU0laRSArIDEpKTsKLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoMjAwKSk7Ci0gIH0KLQotICAvLyBUZXN0cyBzaXplcyB0aGF0IGFyZSBvdmVyIG11bHRpLXNlZ21lbnQgcm9wZSB0aHJlc2hvbGQuCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkRnJvbV9sYXJnZVN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDB4MTAwKSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDB4MTAxKSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDB4MTEwKSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDB4MTAwMCkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygweDEwMDEpKTsKLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoMHgxMDEwKSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKDB4MTAwMDApKTsKLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMoMHgxMDAwMSkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcygweDEwMDEwKSk7Ci0gIH0KLQotICAvLyBUZXN0cyBzaXplcyB0aGF0IGFyZSBuZWFyIHRoZSByZWFkIGJ1ZmZlciBzaXplLgotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21fYnl0ZUJvdW5kYXJpZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBtaW4gPSBCeXRlU3RyaW5nLk1JTl9SRUFEX0ZST01fQ0hVTktfU0laRTsKLSAgICBmaW5hbCBpbnQgbWF4ID0gQnl0ZVN0cmluZy5NQVhfUkVBRF9GUk9NX0NIVU5LX1NJWkU7Ci0KLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluIC0gMSkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtaW4pKTsKLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluICsgMSkpOwotCi0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiAqIDIgLSAxKSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiAqIDIpKTsKLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluICogMiArIDEpKTsKLQotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtaW4gKiA0IC0gMSkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtaW4gKiA0KSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1pbiAqIDQgKyAxKSk7Ci0KLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluICogOCAtIDEpKTsKLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWluICogOCkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtaW4gKiA4ICsgMSkpOwotCi0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1heCAtIDEpKTsKLSAgICBhc3NlcnRSZWFkRnJvbShnZXRUZXN0Qnl0ZXMobWF4KSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1heCArIDEpKTsKLQotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtYXggKiAyIC0gMSkpOwotICAgIGFzc2VydFJlYWRGcm9tKGdldFRlc3RCeXRlcyhtYXggKiAyKSk7Ci0gICAgYXNzZXJ0UmVhZEZyb20oZ2V0VGVzdEJ5dGVzKG1heCAqIDIgKyAxKSk7Ci0gIH0KLQotICAvLyBUZXN0cyB0aGF0IElPRXhjZXB0aW9ucyBwcm9wYWdhdGUgdGhyb3VnaCBCeXRlU3RyaW5nLnJlYWRGcm9tKCkuCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkRnJvbV9JT0V4Y2VwdGlvbnMoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIEJ5dGVTdHJpbmcucmVhZEZyb20obmV3IEZhaWxTdHJlYW0oKSk7Ci0gICAgICBmYWlsKCJyZWFkRnJvbSBtdXN0IHRocm93IHRoZSB1bmRlcmx5aW5nIElPRXhjZXB0aW9uIik7Ci0KLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoInJlYWRGcm9tIG11c3QgdGhyb3cgdGhlIGV4cGVjdGVkIGV4Y2VwdGlvbiIsCi0gICAgICAgICAgICAgICAgICAgInN5bnRoZXRpYyBmYWlsdXJlIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIC8vIFRlc3RzIHRoYXQgQnl0ZVN0cmluZy5yZWFkRnJvbSB3b3JrcyB3aXRoIHN0cmVhbXMgdGhhdCBkb24ndAotICAvLyBhbHdheXMgZmlsbCB0aGVpciBidWZmZXJzLgotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21fcmVsdWN0YW50U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBieXRlW10gZGF0YSA9IGdldFRlc3RCeXRlcygweDEwMDApOwotCi0gICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gQnl0ZVN0cmluZy5yZWFkRnJvbShuZXcgUmVsdWN0YW50U3RyZWFtKGRhdGEpKTsKLSAgICBhc3NlcnRUcnVlKCJyZWFkRnJvbSBieXRlIHN0cmVhbSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKLSAgICAgICAgaXNBcnJheShieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIGRhdGEpKTsKLQotICAgIC8vIFNhbWUgdGVzdCBhcyBhYm92ZSwgYnV0IHdpdGggc29tZSBzcGVjaWZpYyBjaHVuayBzaXplcy4KLSAgICBhc3NlcnRSZWFkRnJvbVJlbHVjdGFudFN0cmVhbShkYXRhLCAxMDApOwotICAgIGFzc2VydFJlYWRGcm9tUmVsdWN0YW50U3RyZWFtKGRhdGEsIDI0OCk7Ci0gICAgYXNzZXJ0UmVhZEZyb21SZWx1Y3RhbnRTdHJlYW0oZGF0YSwgMjQ5KTsKLSAgICBhc3NlcnRSZWFkRnJvbVJlbHVjdGFudFN0cmVhbShkYXRhLCAyNTApOwotICAgIGFzc2VydFJlYWRGcm9tUmVsdWN0YW50U3RyZWFtKGRhdGEsIDI1MSk7Ci0gICAgYXNzZXJ0UmVhZEZyb21SZWx1Y3RhbnRTdHJlYW0oZGF0YSwgMHgxMDAwKTsKLSAgICBhc3NlcnRSZWFkRnJvbVJlbHVjdGFudFN0cmVhbShkYXRhLCAweDEwMDEpOwotICB9Ci0KLSAgLy8gRmFpbHMgdW5sZXNzIEJ5dGVTdHJpbmcucmVhZEZyb20gcmVhZHMgdGhlIGJ5dGVzIGNvcnJlY3RseSBmcm9tIGEKLSAgLy8gcmVsdWN0YW50IHN0cmVhbSB3aXRoIHRoZSBnaXZlbiBjaHVua1NpemUgcGFyYW1ldGVyLgotICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVhZEZyb21SZWx1Y3RhbnRTdHJlYW0oYnl0ZVtdIGJ5dGVzLCBpbnQgY2h1bmtTaXplKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nIGIgPSBCeXRlU3RyaW5nLnJlYWRGcm9tKG5ldyBSZWx1Y3RhbnRTdHJlYW0oYnl0ZXMpLCBjaHVua1NpemUpOwotICAgIGFzc2VydFRydWUoInJlYWRGcm9tIGJ5dGUgc3RyZWFtIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAotICAgICAgICBpc0FycmF5KGIudG9CeXRlQXJyYXkoKSwgYnl0ZXMpKTsKLSAgfQotCi0gIC8vIFRlc3RzIHRoYXQgQnl0ZVN0cmluZy5yZWFkRnJvbSB3b3JrcyB3aXRoIHN0cmVhbXMgdGhhdCBpbXBsZW1lbnQKLSAgLy8gYXZhaWxhYmxlKCkuCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkRnJvbV9hdmFpbGFibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gZ2V0VGVzdEJ5dGVzKDB4MTAwMSk7Ci0KLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLnJlYWRGcm9tKG5ldyBBdmFpbGFibGVTdHJlYW0oZGF0YSkpOwotICAgIGFzc2VydFRydWUoInJlYWRGcm9tIGJ5dGUgc3RyZWFtIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAotICAgICAgICBpc0FycmF5KGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwgZGF0YSkpOwotICB9Ci0KLSAgLy8gRmFpbHMgdW5sZXNzIEJ5dGVTdHJpbmcucmVhZEZyb20gcmVhZHMgdGhlIGJ5dGVzIGNvcnJlY3RseS4KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRGcm9tKGJ5dGVbXSBieXRlcykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPQotICAgICAgICBCeXRlU3RyaW5nLnJlYWRGcm9tKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpOwotICAgIGFzc2VydFRydWUoInJlYWRGcm9tIGJ5dGUgc3RyZWFtIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAotICAgICAgICBpc0FycmF5KGJ5dGVTdHJpbmcudG9CeXRlQXJyYXkoKSwgYnl0ZXMpKTsKLSAgfQotCi0gIC8vIEEgc3RyZWFtIHRoYXQgZmFpbHMgd2hlbiByZWFkLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBGYWlsU3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IHJlYWQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJzeW50aGV0aWMgZmFpbHVyZSIpOwotICAgIH0KLSAgfQotCi0gIC8vIEEgc3RyZWFtIHRoYXQgc2ltdWxhdGVzIGJsb2NraW5nIGJ5IG9ubHkgcHJvZHVjaW5nIDI1MCBjaGFyYWN0ZXJzCi0gIC8vIHBlciBjYWxsIHRvIHJlYWQoYnl0ZVtdKS4KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVsdWN0YW50U3RyZWFtIGV4dGVuZHMgSW5wdXRTdHJlYW0gewotICAgIHByb3RlY3RlZCBmaW5hbCBieXRlW10gZGF0YTsKLSAgICBwcm90ZWN0ZWQgaW50IHBvcyA9IDA7Ci0KLSAgICBwdWJsaWMgUmVsdWN0YW50U3RyZWFtKGJ5dGVbXSBkYXRhKSB7Ci0gICAgICB0aGlzLmRhdGEgPSBkYXRhOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IHJlYWQoKSB7Ci0gICAgICBpZiAocG9zID09IGRhdGEubGVuZ3RoKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBkYXRhW3BvcysrXTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYpIHsKLSAgICAgIHJldHVybiByZWFkKGJ1ZiwgMCwgYnVmLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmVhZChieXRlW10gYnVmLCBpbnQgb2Zmc2V0LCBpbnQgc2l6ZSkgewotICAgICAgaWYgKHBvcyA9PSBkYXRhLmxlbmd0aCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBpbnQgY291bnQgPSBNYXRoLm1pbihNYXRoLm1pbihzaXplLCBkYXRhLmxlbmd0aCAtIHBvcyksIDI1MCk7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIHBvcywgYnVmLCBvZmZzZXQsIGNvdW50KTsKLSAgICAgIHBvcyArPSBjb3VudDsKLSAgICAgIHJldHVybiBjb3VudDsKLSAgICB9Ci0gIH0KLQotICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgYWxzbyBpbXBsZW1lbnRzIGF2YWlsYWJsZSgpLgotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBdmFpbGFibGVTdHJlYW0gZXh0ZW5kcyBSZWx1Y3RhbnRTdHJlYW0gewotICAgIHB1YmxpYyBBdmFpbGFibGVTdHJlYW0oYnl0ZVtdIGRhdGEpIHsKLSAgICAgIHN1cGVyKGRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZSBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHsKLSAgICAgIHJldHVybiBNYXRoLm1pbigyNTAsIGRhdGEubGVuZ3RoIC0gcG9zKTsKLSAgICB9Ci0gIH0KLQotICAvLyBBIHN0cmVhbSB3aGljaCBleHBvc2VzIHRoZSBieXRlIGFycmF5IHBhc3NlZCBpbnRvIHJlYWQoYnl0ZVtdLCBpbnQsIGludCkuCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEV2aWxJbnB1dFN0cmVhbSBleHRlbmRzIElucHV0U3RyZWFtIHsKLSAgICBwdWJsaWMgYnl0ZVtdIGNhcHR1cmVkQXJyYXkgPSBudWxsOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgIGlmIChjYXB0dXJlZEFycmF5ICE9IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY2FwdHVyZWRBcnJheSA9IGJ1ZjsKLSAgICAgICAgZm9yIChpbnQgeCA9IDA7IHggPCBsZW47ICsreCkgewotICAgICAgICAgIGJ1Zlt4XSA9IChieXRlKSB4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsZW47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKCkgewotICAgICAgLy8gUHVycG9zZWZ1bGx5IGRvIG5vdGhpbmcuCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgLy8gQSBzdHJlYW0gd2hpY2ggZXhwb3NlcyB0aGUgYnl0ZSBhcnJheSBwYXNzZWQgaW50byB3cml0ZShieXRlW10sIGludCwgaW50KS4KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgRXZpbE91dHB1dFN0cmVhbSBleHRlbmRzIE91dHB1dFN0cmVhbSB7Ci0gICAgcHVibGljIGJ5dGVbXSBjYXB0dXJlZEFycmF5ID0gbnVsbDsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSBidWYsIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgIGlmIChjYXB0dXJlZEFycmF5ID09IG51bGwpIHsKLSAgICAgICAgY2FwdHVyZWRBcnJheSA9IGJ1ZjsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgaWdub3JlZCkgewotICAgICAgLy8gUHVycG9zZWZ1bGx5IGRvIG5vdGhpbmcuCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nVXRmOCgpIHsKLSAgICBTdHJpbmcgdGVzdFN0cmluZyA9ICJJIGxvdmUgdW5pY29kZSBcdTEyMzRcdTU2NzggY2hhcmFjdGVycyI7Ci0gICAgYnl0ZVtdIHRlc3RCeXRlcyA9IHRlc3RTdHJpbmcuZ2V0Qnl0ZXMoSW50ZXJuYWwuVVRGXzgpOwotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20odGVzdEJ5dGVzKTsKLSAgICBhc3NlcnRFcXVhbHMoImNvcHlUb1N0cmluZ1V0ZjggbXVzdCByZXNwZWN0IHRoZSBjaGFyc2V0IiwKLSAgICAgICAgdGVzdFN0cmluZywgYnl0ZVN0cmluZy50b1N0cmluZ1V0ZjgoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0X0luaXRpYWxDYXBhY2l0eSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKCk7Ci0gICAgQnl0ZVN0cmluZy5PdXRwdXQgb3V0cHV0ID0gQnl0ZVN0cmluZy5uZXdPdXRwdXQoYnl0ZXMubGVuZ3RoICsgMTAwKTsKLSAgICBvdXRwdXQud3JpdGUoYnl0ZXMpOwotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IG91dHB1dC50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRUcnVlKAotICAgICAgICAiU3RyaW5nIGJ1aWx0IGZyb20gbmV3T3V0cHV0KGludCkgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCi0gICAgICAgIGlzQXJyYXlSYW5nZShieXRlcywgYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpLCAwLCBieXRlcy5sZW5ndGgpKTsKLSAgfQotCi0gIC8vIFRlc3QgbmV3T3V0cHV0KCkgdXNpbmcgYSB2YXJpZXR5IG9mIGJ1ZmZlciBzaXplcyBhbmQgYSB2YXJpZXR5IG9mIChmaXhlZCkKLSAgLy8gd3JpdGUgc2l6ZXMKLSAgcHVibGljIHZvaWQgdGVzdE5ld091dHB1dF9BcnJheVdyaXRlKCkgewotICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOwotICAgIGludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7Ci0gICAgaW50W10gYnVmZmVyU2l6ZXMgPSB7MTI4LCAyNTYsIGxlbmd0aCAvIDIsIGxlbmd0aCAtIDEsIGxlbmd0aCwgbGVuZ3RoICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAyICogbGVuZ3RoLCAzICogbGVuZ3RofTsKLSAgICBpbnRbXSB3cml0ZVNpemVzID0gezEsIDQsIDUsIDcsIDIzLCBieXRlcy5sZW5ndGh9OwotCi0gICAgZm9yIChpbnQgYnVmZmVyU2l6ZSA6IGJ1ZmZlclNpemVzKSB7Ci0gICAgICBmb3IgKGludCB3cml0ZVNpemUgOiB3cml0ZVNpemVzKSB7Ci0gICAgICAgIC8vIFRlc3Qgd3JpdGluZyB0aGUgZW50aXJlIG91dHB1dCB3cml0ZVNpemUgYnl0ZXMgYXQgYSB0aW1lLgotICAgICAgICBCeXRlU3RyaW5nLk91dHB1dCBvdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dChidWZmZXJTaXplKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGg7IGkgKz0gd3JpdGVTaXplKSB7Ci0gICAgICAgICAgb3V0cHV0LndyaXRlKGJ5dGVzLCBpLCBNYXRoLm1pbih3cml0ZVNpemUsIGxlbmd0aCAtIGkpKTsKLSAgICAgICAgfQotICAgICAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBvdXRwdXQudG9CeXRlU3RyaW5nKCk7Ci0gICAgICAgIGFzc2VydFRydWUoIlN0cmluZyBidWlsdCBmcm9tIG5ld091dHB1dCgpIG11c3QgY29udGFpbiB0aGUgZXhwZWN0ZWQgYnl0ZXMiLAotICAgICAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVzLCBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIDAsIGJ5dGVzLmxlbmd0aCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFRlc3QgbmV3T3V0cHV0KCkgdXNpbmcgYSB2YXJpZXR5IG9mIGJ1ZmZlciBzaXplcywgYnV0IHdyaXRpbmcgYWxsIHRoZQotICAvLyBjaGFyYWN0ZXJzIHVzaW5nIHdyaXRlKGJ5dGUpOwotICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0X1dyaXRlQ2hhcigpIHsKLSAgICBieXRlW10gYnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoKTsKLSAgICBpbnQgbGVuZ3RoID0gYnl0ZXMubGVuZ3RoOwotICAgIGludFtdIGJ1ZmZlclNpemVzID0gezAsIDEsIDEyOCwgMjU2LCBsZW5ndGggLyAyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCAtIDEsIGxlbmd0aCwgbGVuZ3RoICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAyICogbGVuZ3RoLCAzICogbGVuZ3RofTsKLSAgICBmb3IgKGludCBidWZmZXJTaXplIDogYnVmZmVyU2l6ZXMpIHsKLSAgICAgIEJ5dGVTdHJpbmcuT3V0cHV0IG91dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KGJ1ZmZlclNpemUpOwotICAgICAgZm9yIChieXRlIGJ5dGVWYWx1ZSA6IGJ5dGVzKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZShieXRlVmFsdWUpOwotICAgICAgfQotICAgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gb3V0cHV0LnRvQnl0ZVN0cmluZygpOwotICAgICAgYXNzZXJ0VHJ1ZSgiU3RyaW5nIGJ1aWx0IGZyb20gbmV3T3V0cHV0KCkgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCi0gICAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVzLCBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIDAsIGJ5dGVzLmxlbmd0aCkpOwotICAgIH0KLSAgfQotCi0gIC8vIFRlc3QgbmV3T3V0cHV0KCkgaW4gd2hpY2ggd2Ugd3JpdGUgdGhlIGJ5dGVzIHVzaW5nIGEgdmFyaWV0eSBvZiBtZXRob2RzCi0gIC8vIGFuZCBzaXplcywgYW5kIGluIHdoaWNoIHdlIHJlcGVhdGVkbHkgY2FsbCB0b0J5dGVTdHJpbmcoKSBpbiB0aGUgbWlkZGxlLgotICBwdWJsaWMgdm9pZCB0ZXN0TmV3T3V0cHV0X01peGVkKCkgewotICAgIFJhbmRvbSBybmcgPSBuZXcgUmFuZG9tKDEpOwotICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygpOwotICAgIGludCBsZW5ndGggPSBieXRlcy5sZW5ndGg7Ci0gICAgaW50W10gYnVmZmVyU2l6ZXMgPSB7MCwgMSwgMTI4LCAyNTYsIGxlbmd0aCAvIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoIC0gMSwgbGVuZ3RoLCBsZW5ndGggKyAxLAotICAgICAgICAgICAgICAgICAgICAgICAgIDIgKiBsZW5ndGgsIDMgKiBsZW5ndGh9OwotCi0gICAgZm9yIChpbnQgYnVmZmVyU2l6ZSA6IGJ1ZmZlclNpemVzKSB7Ci0gICAgICAvLyBUZXN0IHdyaXRpbmcgdGhlIGVudGlyZSBvdXRwdXQgdXNpbmcgYSBtaXh0dXJlIG9mIHdyaXRlIHNpemVzIGFuZAotICAgICAgLy8gbWV0aG9kczsKLSAgICAgIEJ5dGVTdHJpbmcuT3V0cHV0IG91dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KGJ1ZmZlclNpemUpOwotICAgICAgaW50IHBvc2l0aW9uID0gMDsKLSAgICAgIHdoaWxlIChwb3NpdGlvbiA8IGJ5dGVzLmxlbmd0aCkgewotICAgICAgICBpZiAocm5nLm5leHRCb29sZWFuKCkpIHsKLSAgICAgICAgICBpbnQgY291bnQgPSAxICsgcm5nLm5leHRJbnQoYnl0ZXMubGVuZ3RoIC0gcG9zaXRpb24pOwotICAgICAgICAgIG91dHB1dC53cml0ZShieXRlcywgcG9zaXRpb24sIGNvdW50KTsKLSAgICAgICAgICBwb3NpdGlvbiArPSBjb3VudDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvdXRwdXQud3JpdGUoYnl0ZXNbcG9zaXRpb25dKTsKLSAgICAgICAgICBwb3NpdGlvbisrOwotICAgICAgICB9Ci0gICAgICAgIGFzc2VydEVxdWFscygic2l6ZSgpIHJldHVybnMgdGhlIHJpZ2h0IHZhbHVlIiwgcG9zaXRpb24sIG91dHB1dC5zaXplKCkpOwotICAgICAgICBhc3NlcnRUcnVlKCJuZXdPdXRwdXQoKSBzdWJzdHJpbmcgbXVzdCBoYXZlIGNvcnJlY3QgYnl0ZXMiLAotICAgICAgICAgICAgaXNBcnJheVJhbmdlKG91dHB1dC50b0J5dGVTdHJpbmcoKS50b0J5dGVBcnJheSgpLAotICAgICAgICAgICAgICAgIGJ5dGVzLCAwLCBwb3NpdGlvbikpOwotICAgICAgfQotICAgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gb3V0cHV0LnRvQnl0ZVN0cmluZygpOwotICAgICAgYXNzZXJ0VHJ1ZSgiU3RyaW5nIGJ1aWx0IGZyb20gbmV3T3V0cHV0KCkgbXVzdCBjb250YWluIHRoZSBleHBlY3RlZCBieXRlcyIsCi0gICAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVzLCBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIDAsIGJ5dGVzLmxlbmd0aCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXdPdXRwdXRFbXB0eSgpIHsKLSAgICAvLyBNYWtlIHN1cmUgbmV3T3V0cHV0KCkgY29ycmVjdGx5IGJ1aWxkcyBlbXB0eSBieXRlIHN0cmluZ3MKLSAgICBCeXRlU3RyaW5nIGJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpLnRvQnl0ZVN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBieXRlU3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXdPdXRwdXRfTXV0YXRpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIE91dHB1dCBvcyA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KDUpOwotICAgIG9zLndyaXRlKG5ldyBieXRlW10gezEsIDIsIDMsIDQsIDV9KTsKLSAgICBFdmlsT3V0cHV0U3RyZWFtIGVvcyA9IG5ldyBFdmlsT3V0cHV0U3RyZWFtKCk7Ci0gICAgb3Mud3JpdGVUbyhlb3MpOwotICAgIGJ5dGVbXSBjYXB0dXJlZEFycmF5ID0gZW9zLmNhcHR1cmVkQXJyYXk7Ci0gICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gb3MudG9CeXRlU3RyaW5nKCk7Ci0gICAgYnl0ZVtdIG9sZFZhbHVlID0gYnl0ZVN0cmluZy50b0J5dGVBcnJheSgpOwotICAgIEFycmF5cy5maWxsKGNhcHR1cmVkQXJyYXksIChieXRlKSAwKTsKLSAgICBieXRlW10gbmV3VmFsdWUgPSBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiT3V0cHV0IG11c3Qgbm90IHByb3ZpZGUgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nIGJ5dGUgYXJyYXkiLAotICAgICAgICBBcnJheXMuZXF1YWxzKG9sZFZhbHVlLCBuZXdWYWx1ZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5ld0NvZGVkQnVpbGRlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKCk7Ci0gICAgQnl0ZVN0cmluZy5Db2RlZEJ1aWxkZXIgYnVpbGRlciA9IEJ5dGVTdHJpbmcubmV3Q29kZWRCdWlsZGVyKGJ5dGVzLmxlbmd0aCk7Ci0gICAgYnVpbGRlci5nZXRDb2RlZE91dHB1dCgpLndyaXRlUmF3Qnl0ZXMoYnl0ZXMpOwotICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKCJTdHJpbmcgYnVpbHQgZnJvbSBuZXdDb2RlZEJ1aWxkZXIoKSBtdXN0IGNvbnRhaW4gdGhlIGV4cGVjdGVkIGJ5dGVzIiwKLSAgICAgICAgaXNBcnJheVJhbmdlKGJ5dGVzLCBieXRlU3RyaW5nLnRvQnl0ZUFycmF5KCksIDAsIGJ5dGVzLmxlbmd0aCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFN1YnN0cmluZ1Bhcml0eSgpIHsKLSAgICBieXRlW10gYmlnQnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoMjA0OCAqIDEwMjQsIDExMzM0NEwpOwotICAgIGludCBzdGFydCA9IDUxMiAqIDEwMjQgLSAzMzMzOwotICAgIGludCBlbmQgICA9IDUxMiAqIDEwMjQgKyA3Nzc3OwotICAgIEJ5dGVTdHJpbmcgY29uY3JldGVTdWJzdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJpZ0J5dGVzKS5zdWJzdHJpbmcoc3RhcnQsIGVuZCk7Ci0gICAgYm9vbGVhbiBvayA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBvayAmJiBpIDwgZW5kOyArK2kpIHsKLSAgICAgIG9rID0gKGJpZ0J5dGVzW2ldID09IGNvbmNyZXRlU3Vic3RyaW5nLmJ5dGVBdChpIC0gc3RhcnQpKTsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZSgiQ29uY3JldGUgc3Vic3RyaW5nIGRpZG4ndCBjYXB0dXJlIHRoZSByaWdodCBieXRlcyIsIG9rKTsKLQotICAgIEJ5dGVTdHJpbmcgbGl0ZXJhbFN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYmlnQnl0ZXMsIHN0YXJ0LCBlbmQgLSBzdGFydCk7Ci0gICAgYXNzZXJ0VHJ1ZSgiU3Vic3RyaW5nIG11c3QgYmUgZXF1YWwgdG8gbGl0ZXJhbCBzdHJpbmciLAotICAgICAgICBjb25jcmV0ZVN1YnN0cmluZy5lcXVhbHMobGl0ZXJhbFN0cmluZykpOwotICAgIGFzc2VydEVxdWFscygiU3Vic3RyaW5nIG11c3QgaGF2ZSBzYW1lIGhhc2hjb2RlIGFzIGxpdGVyYWwgc3RyaW5nIiwKLSAgICAgICAgbGl0ZXJhbFN0cmluZy5oYXNoQ29kZSgpLCBjb25jcmV0ZVN1YnN0cmluZy5oYXNoQ29kZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb21wb3NpdGVTdWJzdHJpbmcoKSB7Ci0gICAgYnl0ZVtdIHJlZmVyZW5jZUJ5dGVzID0gZ2V0VGVzdEJ5dGVzKDc3NzQ4LCAxMTMzNDRMKTsKLQotICAgIExpc3Q8Qnl0ZVN0cmluZz4gcGllY2VzID0gbWFrZUNvbmNyZXRlUGllY2VzKHJlZmVyZW5jZUJ5dGVzKTsKLSAgICBCeXRlU3RyaW5nIGxpc3RTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHBpZWNlcyk7Ci0KLSAgICBpbnQgZnJvbSA9IDEwMDA7Ci0gICAgaW50IHRvID0gNDAwMDA7Ci0gICAgQnl0ZVN0cmluZyBjb21wb3NpdGVTdWJzdHJpbmcgPSBsaXN0U3RyaW5nLnN1YnN0cmluZyhmcm9tLCB0byk7Ci0gICAgYnl0ZVtdIHN1YnN0cmluZ0J5dGVzID0gY29tcG9zaXRlU3Vic3RyaW5nLnRvQnl0ZUFycmF5KCk7Ci0gICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgc3RpbGxFcXVhbCAmJiBpIDwgdG8gLSBmcm9tOyArK2kpIHsKLSAgICAgIHN0aWxsRXF1YWwgPSByZWZlcmVuY2VCeXRlc1tmcm9tICsgaV0gPT0gc3Vic3RyaW5nQnl0ZXNbaV07Ci0gICAgfQotICAgIGFzc2VydFRydWUoIlN1YnN0cmluZyBtdXN0IHJldHVybiBjb3JyZWN0IGJ5dGVzIiwgc3RpbGxFcXVhbCk7Ci0KLSAgICBzdGlsbEVxdWFsID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgc3RpbGxFcXVhbCAmJiBpIDwgdG8gLSBmcm9tOyArK2kpIHsKLSAgICAgIHN0aWxsRXF1YWwgPSByZWZlcmVuY2VCeXRlc1tmcm9tICsgaV0gPT0gY29tcG9zaXRlU3Vic3RyaW5nLmJ5dGVBdChpKTsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZSgiU3Vic3RyaW5nIG11c3Qgc3VwcG9ydCBieXRlQXQoKSBjb3JyZWN0bHkiLCBzdGlsbEVxdWFsKTsKLQotICAgIEJ5dGVTdHJpbmcgbGl0ZXJhbFN1YnN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20ocmVmZXJlbmNlQnl0ZXMsIGZyb20sIHRvIC0gZnJvbSk7Ci0gICAgYXNzZXJ0VHJ1ZSgiQ29tcG9zaXRlIHN1YnN0cmluZyBtdXN0IGVxdWFsIGEgbGl0ZXJhbCBzdWJzdHJpbmcgb3ZlciB0aGUgc2FtZSBieXRlcyIsCi0gICAgICAgIGNvbXBvc2l0ZVN1YnN0cmluZy5lcXVhbHMobGl0ZXJhbFN1YnN0cmluZykpOwotICAgIGFzc2VydFRydWUoIkxpdGVyYWwgc3Vic3RyaW5nIG11c3QgZXF1YWwgYSBjb21wb3NpdGUgc3Vic3RyaW5nIG92ZXIgdGhlIHNhbWUgYnl0ZXMiLAotICAgICAgICBsaXRlcmFsU3Vic3RyaW5nLmVxdWFscyhjb21wb3NpdGVTdWJzdHJpbmcpKTsKLQotICAgIGFzc2VydEVxdWFscygiV2UgbXVzdCBnZXQgdGhlIHNhbWUgaGFzaGNvZGVzIGZvciBjb21wb3NpdGUgYW5kIGxpdGVyYWwgc3Vic3RyaW5ncyIsCi0gICAgICAgIGxpdGVyYWxTdWJzdHJpbmcuaGFzaENvZGUoKSwgY29tcG9zaXRlU3Vic3RyaW5nLmhhc2hDb2RlKCkpOwotCi0gICAgYXNzZXJ0RmFsc2UoIldlIGNhbid0IGJlIGVxdWFsIHRvIGEgcHJvcGVyIHN1YnN0cmluZyIsCi0gICAgICAgIGNvbXBvc2l0ZVN1YnN0cmluZy5lcXVhbHMobGl0ZXJhbFN1YnN0cmluZy5zdWJzdHJpbmcoMCwgbGl0ZXJhbFN1YnN0cmluZy5zaXplKCkgLSAxKSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvcHlGcm9tTGlzdCgpIHsKLSAgICBieXRlW10gcmVmZXJlbmNlQnl0ZXMgPSBnZXRUZXN0Qnl0ZXMoNzc3NDgsIDExMzM0NEwpOwotICAgIEJ5dGVTdHJpbmcgbGl0ZXJhbFN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20ocmVmZXJlbmNlQnl0ZXMpOwotCi0gICAgTGlzdDxCeXRlU3RyaW5nPiBwaWVjZXMgPSBtYWtlQ29uY3JldGVQaWVjZXMocmVmZXJlbmNlQnl0ZXMpOwotICAgIEJ5dGVTdHJpbmcgbGlzdFN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20ocGllY2VzKTsKLQotICAgIGFzc2VydFRydWUoIkNvbXBvc2l0ZSBzdHJpbmcgbXVzdCBiZSBlcXVhbCB0byBsaXRlcmFsIHN0cmluZyIsCi0gICAgICAgIGxpc3RTdHJpbmcuZXF1YWxzKGxpdGVyYWxTdHJpbmcpKTsKLSAgICBhc3NlcnRFcXVhbHMoIkNvbXBvc2l0ZSBzdHJpbmcgbXVzdCBoYXZlIHNhbWUgaGFzaGNvZGUgYXMgbGl0ZXJhbCBzdHJpbmciLAotICAgICAgICBsaXRlcmFsU3RyaW5nLmhhc2hDb2RlKCksIGxpc3RTdHJpbmcuaGFzaENvZGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0KCkgewotICAgIGJ5dGVbXSByZWZlcmVuY2VCeXRlcyA9IGdldFRlc3RCeXRlcyg3Nzc0OCwgMTEzMzQ0TCk7Ci0gICAgQnl0ZVN0cmluZyBsaXRlcmFsU3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbShyZWZlcmVuY2VCeXRlcyk7Ci0KLSAgICBMaXN0PEJ5dGVTdHJpbmc+IHBpZWNlcyA9IG1ha2VDb25jcmV0ZVBpZWNlcyhyZWZlcmVuY2VCeXRlcyk7Ci0KLSAgICBJdGVyYXRvcjxCeXRlU3RyaW5nPiBpdGVyID0gcGllY2VzLml0ZXJhdG9yKCk7Ci0gICAgQnl0ZVN0cmluZyBjb25jYXRlbmF0ZWRTdHJpbmcgPSBpdGVyLm5leHQoKTsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIGNvbmNhdGVuYXRlZFN0cmluZyA9IGNvbmNhdGVuYXRlZFN0cmluZy5jb25jYXQoaXRlci5uZXh0KCkpOwotICAgIH0KLQotICAgIGFzc2VydFRydWUoIkNvbmNhdGVuYXRlZCBzdHJpbmcgbXVzdCBiZSBlcXVhbCB0byBsaXRlcmFsIHN0cmluZyIsCi0gICAgICAgIGNvbmNhdGVuYXRlZFN0cmluZy5lcXVhbHMobGl0ZXJhbFN0cmluZykpOwotICAgIGFzc2VydEVxdWFscygiQ29uY2F0ZW5hdGVkIHN0cmluZyBtdXN0IGhhdmUgc2FtZSBoYXNoY29kZSBhcyBsaXRlcmFsIHN0cmluZyIsCi0gICAgICAgIGxpdGVyYWxTdHJpbmcuaGFzaENvZGUoKSwgY29uY2F0ZW5hdGVkU3RyaW5nLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgdGhlIFJvcGUgaW1wbGVtZW50YXRpb24gY2FuIGRlYWwgd2l0aCBFbXB0eSBub2RlcywgZXZlbiB0aG91Z2ggd2UKLSAgICogZ3VhcmQgYWdhaW5zdCB0aGVtLiBTZWUgYWxzbyB7QGxpbmsgTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0I3Rlc3RDb25jYXRfZW1wdHkoKX0uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0X2VtcHR5KCkgewotICAgIGJ5dGVbXSByZWZlcmVuY2VCeXRlcyA9IGdldFRlc3RCeXRlcyg3NzQ4LCAxMTMzNDRMKTsKLSAgICBCeXRlU3RyaW5nIGxpdGVyYWxTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlZmVyZW5jZUJ5dGVzKTsKLQotICAgIEJ5dGVTdHJpbmcgZHVvID0gUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KGxpdGVyYWxTdHJpbmcsIGxpdGVyYWxTdHJpbmcpOwotICAgIEJ5dGVTdHJpbmcgdGVtcCA9IFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdCgKLSAgICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KGxpdGVyYWxTdHJpbmcsIEJ5dGVTdHJpbmcuRU1QVFkpLAotICAgICAgICBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3QoQnl0ZVN0cmluZy5FTVBUWSwgbGl0ZXJhbFN0cmluZykpOwotICAgIEJ5dGVTdHJpbmcgcXVpbnRldCA9IFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdCh0ZW1wLCBCeXRlU3RyaW5nLkVNUFRZKTsKLQotICAgIGFzc2VydFRydWUoIlN0cmluZyB3aXRoIGNvbmNhdGVuYXRlZCBudWxscyBtdXN0IGVxdWFsIHNpbXBsZSBjb25jYXRlbmF0ZSIsCi0gICAgICAgIGR1by5lcXVhbHMocXVpbnRldCkpOwotICAgIGFzc2VydEVxdWFscygiU3RyaW5nIHdpdGggY29uY2F0ZW5hdGVkIG51bGxzIGhhdmUgc2FtZSBoYXNoY29kZSBhcyBzaW1wbGUgY29uY2F0ZW5hdGUiLAotICAgICAgICBkdW8uaGFzaENvZGUoKSwgcXVpbnRldC5oYXNoQ29kZSgpKTsKLQotICAgIEJ5dGVTdHJpbmcuQnl0ZUl0ZXJhdG9yIGR1b0l0ZXIgPSBkdW8uaXRlcmF0b3IoKTsKLSAgICBCeXRlU3RyaW5nLkJ5dGVJdGVyYXRvciBxdWludGV0SXRlciA9IHF1aW50ZXQuaXRlcmF0b3IoKTsKLSAgICBib29sZWFuIHN0aWxsRXF1YWwgPSB0cnVlOwotICAgIHdoaWxlIChzdGlsbEVxdWFsICYmIHF1aW50ZXRJdGVyLmhhc05leHQoKSkgewotICAgICAgc3RpbGxFcXVhbCA9IChkdW9JdGVyLm5leHRCeXRlKCkgPT0gcXVpbnRldEl0ZXIubmV4dEJ5dGUoKSk7Ci0gICAgfQotICAgIGFzc2VydFRydWUoIldlIG11c3QgZ2V0IHRoZSBzYW1lIGNoYXJhY3RlcnMgYnkgaXRlcmF0aW5nIiwgc3RpbGxFcXVhbCk7Ci0gICAgYXNzZXJ0RmFsc2UoIkl0ZXJhdG9yIG11c3QgYmUgZXhoYXVzdGVkIiwgZHVvSXRlci5oYXNOZXh0KCkpOwotICAgIHRyeSB7Ci0gICAgICBkdW9JdGVyLm5leHRCeXRlKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBxdWludGV0SXRlci5uZXh0Qnl0ZSgpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hFbGVtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcwotICAgIH0KLQotICAgIC8vIFRlc3QgdGhhdCBldmVuIGlmIHdlIGZvcmNlIGVtcHR5IHN0cmluZ3MgaW4gYXMgcm9wZSBsZWF2ZXMgaW4gdGhpcwotICAgIC8vIGNvbmZpZ3VyYXRpb24sIHdlIGFsd2F5cyBnZXQgYSAocG9zc2libHkgQm91bmRlZCkgTGl0ZXJhbEJ5dGVTdHJpbmcKLSAgICAvLyBmb3IgYSBsZW5ndGggMSBzdWJzdHJpbmcuCi0gICAgLy8KLSAgICAvLyBJdCBpcyBwb3NzaWJsZSwgdXNpbmcgdGhlIHRlc3RpbmcgZmFjdG9yeSBtZXRob2QgdG8gY3JlYXRlIGRlZXBseSBuZXN0ZWQKLSAgICAvLyB0cmVlcyBvZiBlbXB0eSBsZWF2ZXMsIHRvIG1ha2UgYSBzdHJpbmcgdGhhdCB3aWxsIGZhaWwgdGhpcyB0ZXN0LgotICAgIGZvciAoaW50IGkgPSAxOyBpIDwgZHVvLnNpemUoKTsgKytpKSB7Ci0gICAgICBhc3NlcnRUcnVlKCJTdWJzdHJpbmdzIG9mIHNpemUoKSA8IDIgbXVzdCBub3QgYmUgUm9wZUJ5dGVTdHJpbmdzIiwKLSAgICAgICAgICBkdW8uc3Vic3RyaW5nKGkgLSAxLCBpKSBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcuTGVhZkJ5dGVTdHJpbmcpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMTsgaSA8IHF1aW50ZXQuc2l6ZSgpOyArK2kpIHsKLSAgICAgIGFzc2VydFRydWUoIlN1YnN0cmluZ3Mgb2Ygc2l6ZSgpIDwgMiBtdXN0IG5vdCBiZSBSb3BlQnl0ZVN0cmluZ3MiLAotICAgICAgICAgIHF1aW50ZXQuc3Vic3RyaW5nKGkgLSAxLCBpKSBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcuTGVhZkJ5dGVTdHJpbmcpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTdGFydHNXaXRoKCkgewotICAgIGJ5dGVbXSBieXRlcyA9IGdldFRlc3RCeXRlcygxMDAwLCAxMjM0TCk7Ci0gICAgQnl0ZVN0cmluZyBzdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzKTsKLSAgICBCeXRlU3RyaW5nIHByZWZpeCA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMsIDAsIDUwMCk7Ci0gICAgQnl0ZVN0cmluZyBzdWZmaXggPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVzLCA0MDAsIDYwMCk7Ci0gICAgYXNzZXJ0VHJ1ZShzdHJpbmcuc3RhcnRzV2l0aChCeXRlU3RyaW5nLkVNUFRZKSk7Ci0gICAgYXNzZXJ0VHJ1ZShzdHJpbmcuc3RhcnRzV2l0aChzdHJpbmcpKTsKLSAgICBhc3NlcnRUcnVlKHN0cmluZy5zdGFydHNXaXRoKHByZWZpeCkpOwotICAgIGFzc2VydEZhbHNlKHN0cmluZy5zdGFydHNXaXRoKHN1ZmZpeCkpOwotICAgIGFzc2VydEZhbHNlKHByZWZpeC5zdGFydHNXaXRoKHN1ZmZpeCkpOwotICAgIGFzc2VydEZhbHNlKHN1ZmZpeC5zdGFydHNXaXRoKHByZWZpeCkpOwotICAgIGFzc2VydEZhbHNlKEJ5dGVTdHJpbmcuRU1QVFkuc3RhcnRzV2l0aChwcmVmaXgpKTsKLSAgICBhc3NlcnRUcnVlKEJ5dGVTdHJpbmcuRU1QVFkuc3RhcnRzV2l0aChCeXRlU3RyaW5nLkVNUFRZKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RW5kc1dpdGgoKSB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gZ2V0VGVzdEJ5dGVzKDEwMDAsIDEyMzRMKTsKLSAgICBCeXRlU3RyaW5nIHN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpOwotICAgIEJ5dGVTdHJpbmcgcHJlZml4ID0gQnl0ZVN0cmluZy5jb3B5RnJvbShieXRlcywgMCwgNTAwKTsKLSAgICBCeXRlU3RyaW5nIHN1ZmZpeCA9IEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMsIDQwMCwgNjAwKTsKLSAgICBhc3NlcnRUcnVlKHN0cmluZy5lbmRzV2l0aChCeXRlU3RyaW5nLkVNUFRZKSk7Ci0gICAgYXNzZXJ0VHJ1ZShzdHJpbmcuZW5kc1dpdGgoc3RyaW5nKSk7Ci0gICAgYXNzZXJ0VHJ1ZShzdHJpbmcuZW5kc1dpdGgoc3VmZml4KSk7Ci0gICAgYXNzZXJ0RmFsc2Uoc3RyaW5nLmVuZHNXaXRoKHByZWZpeCkpOwotICAgIGFzc2VydEZhbHNlKHN1ZmZpeC5lbmRzV2l0aChwcmVmaXgpKTsKLSAgICBhc3NlcnRGYWxzZShwcmVmaXguZW5kc1dpdGgoc3VmZml4KSk7Ci0gICAgYXNzZXJ0RmFsc2UoQnl0ZVN0cmluZy5FTVBUWS5lbmRzV2l0aChzdWZmaXgpKTsKLSAgICBhc3NlcnRUcnVlKEJ5dGVTdHJpbmcuRU1QVFkuZW5kc1dpdGgoQnl0ZVN0cmluZy5FTVBUWSkpOwotICB9Ci0KLSAgc3RhdGljIExpc3Q8Qnl0ZVN0cmluZz4gbWFrZUNvbmNyZXRlUGllY2VzKGJ5dGVbXSByZWZlcmVuY2VCeXRlcykgewotICAgIExpc3Q8Qnl0ZVN0cmluZz4gcGllY2VzID0gbmV3IEFycmF5TGlzdDxCeXRlU3RyaW5nPigpOwotICAgIC8vIFN0YXJ0aW5nIGxlbmd0aCBzaG91bGQgYmUgc21hbGwgZW5vdWdoIHRoYXQgd2UnbGwgZG8gc29tZSBjb25jYXRlbmF0aW5nIGJ5Ci0gICAgLy8gY29weWluZyBpZiB3ZSBqdXN0IGNvbmNhdGVuYXRlIGFsbCB0aGVzZSBwaWVjZXMgdG9nZXRoZXIuCi0gICAgZm9yIChpbnQgc3RhcnQgPSAwLCBsZW5ndGggPSAxNjsgc3RhcnQgPCByZWZlcmVuY2VCeXRlcy5sZW5ndGg7IHN0YXJ0ICs9IGxlbmd0aCkgewotICAgICAgbGVuZ3RoID0gKGxlbmd0aCA8PCAxKSAtIDE7Ci0gICAgICBpZiAoc3RhcnQgKyBsZW5ndGggPiByZWZlcmVuY2VCeXRlcy5sZW5ndGgpIHsKLSAgICAgICAgbGVuZ3RoID0gcmVmZXJlbmNlQnl0ZXMubGVuZ3RoIC0gc3RhcnQ7Ci0gICAgICB9Ci0gICAgICBwaWVjZXMuYWRkKEJ5dGVTdHJpbmcuY29weUZyb20ocmVmZXJlbmNlQnl0ZXMsIHN0YXJ0LCBsZW5ndGgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHBpZWNlczsKLSAgfQotCi0gIHByaXZhdGUgYnl0ZVtdIHN1YnN0cmluZ1VzaW5nV3JpdGVUbygKLSAgICAgIEJ5dGVTdHJpbmcgZGF0YSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIGRhdGEud3JpdGVUbyhvdXRwdXQsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICByZXR1cm4gb3V0cHV0LnRvQnl0ZUFycmF5KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb091dHB1dFN0cmVhbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIENob29zZSBhIHNpemUgbGFyZ2UgZW5vdWdoIHNvIHdoZW4gdHdvIEJ5dGVTdHJpbmdzIGFyZSBjb25jYXRlbmF0ZWQgdGhleQotICAgIC8vIHdvbid0IGJlIG1lcmdlZCBpbnRvIG9uZSBieXRlIGFycmF5IGR1ZSB0byBzb21lIG9wdGltaXphdGlvbnMuCi0gICAgZmluYWwgaW50IGRhdGFTaXplID0gQnl0ZVN0cmluZy5DT05DQVRFTkFURV9CWV9DT1BZX1NJWkUgKyAxOwotICAgIGJ5dGVbXSBkYXRhMSA9IG5ldyBieXRlW2RhdGFTaXplXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGExLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBkYXRhMVtpXSA9IChieXRlKSAxOwotICAgIH0KLSAgICBkYXRhMVsxXSA9IChieXRlKSAxMTsKLSAgICAvLyBUZXN0IExpdGVyYWxCeXRlU3RyaW5nLndyaXRlVG8oT3V0cHV0U3RyZWFtLGludCxpbnQpCi0gICAgQnl0ZVN0cmluZyBsZWZ0ID0gQnl0ZVN0cmluZy53cmFwKGRhdGExKTsKLSAgICBieXRlW10gcmVzdWx0ID0gc3Vic3RyaW5nVXNpbmdXcml0ZVRvKGxlZnQsIDEsIDEpOwotICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDExLCByZXN1bHRbMF0pOwotCi0gICAgYnl0ZVtdIGRhdGEyID0gbmV3IGJ5dGVbZGF0YVNpemVdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGF0YTEubGVuZ3RoOyBpKyspIHsKLSAgICAgIGRhdGEyW2ldID0gKGJ5dGUpIDI7Ci0gICAgfQotICAgIEJ5dGVTdHJpbmcgcmlnaHQgPSBCeXRlU3RyaW5nLndyYXAoZGF0YTIpOwotICAgIC8vIENvbmNhdGVuYXRlIHR3byBCeXRlU3RyaW5ncyB0byBjcmVhdGUgYSBSb3BlQnl0ZVN0cmluZy4KLSAgICBCeXRlU3RyaW5nIHJvb3QgPSBsZWZ0LmNvbmNhdChyaWdodCk7Ci0gICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBhY3R1YWxseSB0ZXN0aW5nIGEgUm9wZUJ5dGVTdHJpbmcgd2l0aCBhIHNpbXBsZSB0cmVlCi0gICAgLy8gc3RydWN0dXJlLgotICAgIGFzc2VydEVxdWFscygxLCByb290LmdldFRyZWVEZXB0aCgpKTsKLSAgICAvLyBXcml0ZSBwYXJ0cyBvZiB0aGUgbGVmdCBub2RlLgotICAgIHJlc3VsdCA9IHN1YnN0cmluZ1VzaW5nV3JpdGVUbyhyb290LCAwLCBkYXRhU2l6ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGRhdGFTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDEsIHJlc3VsdFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSAxLCByZXN1bHRbZGF0YVNpemUgLSAxXSk7Ci0gICAgLy8gV3JpdGUgcGFydHMgb2YgdGhlIHJpZ2h0IG5vZGUuCi0gICAgcmVzdWx0ID0gc3Vic3RyaW5nVXNpbmdXcml0ZVRvKHJvb3QsIGRhdGFTaXplLCBkYXRhU2l6ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGRhdGFTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDIsIHJlc3VsdFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSAyLCByZXN1bHRbZGF0YVNpemUgLSAxXSk7Ci0gICAgLy8gV3JpdGUgYSBzZWdtZW50IG9mIGJ5dGVzIHRoYXQgcnVucyBhY3Jvc3MgYm90aCBub2Rlcy4KLSAgICByZXN1bHQgPSBzdWJzdHJpbmdVc2luZ1dyaXRlVG8ocm9vdCwgZGF0YVNpemUgLyAyLCBkYXRhU2l6ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGRhdGFTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDEsIHJlc3VsdFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSAxLCByZXN1bHRbZGF0YVNpemUgLSBkYXRhU2l6ZSAvIDIgLSAxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSAyLCByZXN1bHRbZGF0YVNpemUgLSBkYXRhU2l6ZSAvIDJdKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDIsIHJlc3VsdFtkYXRhU2l6ZSAtIDFdKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFRlc3RzIEJ5dGVTdHJpbmcgdXNlcyBBcnJheXMgYmFzZWQgYnl0ZSBjb3BpZXIgd2hlbiBydW5uaW5nIHVuZGVyIEhvdHN0b3AgVk0uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUFycmF5Q29waWVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmllbGQgZmllbGQgPSBCeXRlU3RyaW5nLmNsYXNzLmdldERlY2xhcmVkRmllbGQoImJ5dGVBcnJheUNvcGllciIpOwotICAgIGZpZWxkLnNldEFjY2Vzc2libGUodHJ1ZSk7Ci0gICAgT2JqZWN0IGJ5dGVBcnJheUNvcGllciA9IGZpZWxkLmdldChudWxsKTsKLSAgICBhc3NlcnROb3ROdWxsKGJ5dGVBcnJheUNvcGllcik7Ci0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgYnl0ZUFycmF5Q29waWVyLnRvU3RyaW5nKCksCi0gICAgICAgIGJ5dGVBcnJheUNvcGllci5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKS5lbmRzV2l0aCgiQXJyYXlzQnl0ZUFycmF5Q29waWVyIikpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NoZWNrVXRmOFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ2hlY2tVdGY4VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYzY1ZDE5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ2hlY2tVdGY4VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90bzJfdGVzdF9jaGVja191dGY4LlRlc3RDaGVja1V0ZjguQnl0ZXNXcmFwcGVyOwotaW1wb3J0IHByb3RvMl90ZXN0X2NoZWNrX3V0ZjguVGVzdENoZWNrVXRmOC5TdHJpbmdXcmFwcGVyOwotaW1wb3J0IHByb3RvMl90ZXN0X2NoZWNrX3V0Zjhfc2l6ZS5UZXN0Q2hlY2tVdGY4U2l6ZS5CeXRlc1dyYXBwZXJTaXplOwotaW1wb3J0IHByb3RvMl90ZXN0X2NoZWNrX3V0Zjhfc2l6ZS5UZXN0Q2hlY2tVdGY4U2l6ZS5TdHJpbmdXcmFwcGVyU2l6ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IHRoYXQgcHJvdG9zIGdlbmVyYXRlZCB3aXRoIGZpbGUgb3B0aW9uIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggZG8gaW4KLSAqIGZhY3QgcGVyZm9ybSBhcHByb3ByaWF0ZSBVVEYtOCBjaGVja3MuCi0gKgotICogQGF1dGhvciBqYmF1bUBnb29nbGUuY29tIChKYWNvYiBCdXRjaGVyKQotICovCi1wdWJsaWMgY2xhc3MgQ2hlY2tVdGY4VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgVVRGOF9CWVRFX1NUUklOR19URVhUID0gInNvbWUgdGV4dCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEJ5dGVTdHJpbmcgVVRGOF9CWVRFX1NUUklORyA9Ci0gICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChVVEY4X0JZVEVfU1RSSU5HX1RFWFQpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlU3RyaW5nIE5PTl9VVEY4X0JZVEVfU1RSSU5HID0KLSAgICAgIEJ5dGVTdHJpbmcuY29weUZyb20obmV3IGJ5dGVbXXsoYnl0ZSkgMHg4MH0pOyAvLyBBIGxvbmUgY29udGludWF0aW9uIGJ5dGUuCi0KLSAgcHVibGljIHZvaWQgdGVzdEJ1aWxkUmVxdWlyZWRTdHJpbmdXaXRoR29vZFV0ZjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoVVRGOF9CWVRFX1NUUklOR19URVhULAotICAgICAgICAgICAgICAgICBTdHJpbmdXcmFwcGVyLm5ld0J1aWxkZXIoKS5zZXRSZXFCeXRlcyhVVEY4X0JZVEVfU1RSSU5HKS5nZXRSZXEoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VSZXF1aXJlZFN0cmluZ1dpdGhHb29kVXRmOCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcgc2VyaWFsaXplZCA9Ci0gICAgICAgIEJ5dGVzV3JhcHBlci5uZXdCdWlsZGVyKCkuc2V0UmVxKFVURjhfQllURV9TVFJJTkcpLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVURjhfQllURV9TVFJJTkdfVEVYVCwgU3RyaW5nV3JhcHBlci5wYXJzZXIoKS5wYXJzZUZyb20oc2VyaWFsaXplZCkuZ2V0UmVxKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJ1aWxkUmVxdWlyZWRTdHJpbmdXaXRoQmFkVXRmOCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBTdHJpbmdXcmFwcGVyLm5ld0J1aWxkZXIoKS5zZXRSZXFCeXRlcyhOT05fVVRGOF9CWVRFX1NUUklORyk7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZm9yIG5vbiBVVEYtOCBieXRlIHN0cmluZy4iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoIkJ5dGUgc3RyaW5nIGlzIG5vdCBVVEYtOC4iLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRPcHRpb25hbFN0cmluZ1dpdGhCYWRVdGY4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFN0cmluZ1dyYXBwZXIubmV3QnVpbGRlcigpLnNldE9wdEJ5dGVzKE5PTl9VVEY4X0JZVEVfU1RSSU5HKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmb3Igbm9uIFVURi04IGJ5dGUgc3RyaW5nLiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgIGFzc2VydEVxdWFscygiQnl0ZSBzdHJpbmcgaXMgbm90IFVURi04LiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFJlcGVhdGVkU3RyaW5nV2l0aEJhZFV0ZjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgU3RyaW5nV3JhcHBlci5uZXdCdWlsZGVyKCkuYWRkUmVwQnl0ZXMoTk9OX1VURjhfQllURV9TVFJJTkcpOwotICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBub24gVVRGLTggYnl0ZSBzdHJpbmcuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgYXNzZXJ0RXF1YWxzKCJCeXRlIHN0cmluZyBpcyBub3QgVVRGLTguIiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlUmVxdWlyZWRTdHJpbmdXaXRoQmFkVXRmOCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcgc2VyaWFsaXplZCA9Ci0gICAgICAgIEJ5dGVzV3JhcHBlci5uZXdCdWlsZGVyKCkuc2V0UmVxKE5PTl9VVEY4X0JZVEVfU1RSSU5HKS5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotICAgIHRyeSB7Ci0gICAgICBTdHJpbmdXcmFwcGVyLnBhcnNlcigpLnBhcnNlRnJvbShzZXJpYWxpemVkKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBmb3Igbm9uIFVURi04IGJ5dGUgc3RyaW5nLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgIGFzc2VydEVxdWFscygiUHJvdG9jb2wgbWVzc2FnZSBoYWQgaW52YWxpZCBVVEYtOC4iLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0QnVpbGRSZXF1aXJlZFN0cmluZ1dpdGhCYWRVdGY4U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBTdHJpbmdXcmFwcGVyU2l6ZS5uZXdCdWlsZGVyKCkuc2V0UmVxQnl0ZXMoTk9OX1VURjhfQllURV9TVFJJTkcpOwotICAgICAgZmFpbCgiRXhwZWN0ZWQgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGZvciBub24gVVRGLTggYnl0ZSBzdHJpbmcuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgYXNzZXJ0RXF1YWxzKCJCeXRlIHN0cmluZyBpcyBub3QgVVRGLTguIiwgZXhjZXB0aW9uLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJ1aWxkT3B0aW9uYWxTdHJpbmdXaXRoQmFkVXRmOFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgU3RyaW5nV3JhcHBlclNpemUubmV3QnVpbGRlcigpLnNldE9wdEJ5dGVzKE5PTl9VVEY4X0JZVEVfU1RSSU5HKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBmb3Igbm9uIFVURi04IGJ5dGUgc3RyaW5nLiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgIGFzc2VydEVxdWFscygiQnl0ZSBzdHJpbmcgaXMgbm90IFVURi04LiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFJlcGVhdGVkU3RyaW5nV2l0aEJhZFV0ZjhTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFN0cmluZ1dyYXBwZXJTaXplLm5ld0J1aWxkZXIoKS5hZGRSZXBCeXRlcyhOT05fVVRGOF9CWVRFX1NUUklORyk7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZm9yIG5vbiBVVEYtOCBieXRlIHN0cmluZy4iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZXhjZXB0aW9uKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoIkJ5dGUgc3RyaW5nIGlzIG5vdCBVVEYtOC4iLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VSZXF1aXJlZFN0cmluZ1dpdGhCYWRVdGY4U2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcgc2VyaWFsaXplZCA9Ci0gICAgICAgIEJ5dGVzV3JhcHBlclNpemUubmV3QnVpbGRlcigpLnNldFJlcShOT05fVVRGOF9CWVRFX1NUUklORykuYnVpbGQoKS50b0J5dGVTdHJpbmcoKTsKLSAgICB0cnkgewotICAgICAgU3RyaW5nV3JhcHBlclNpemUucGFyc2VyKCkucGFyc2VGcm9tKHNlcmlhbGl6ZWQpOwotICAgICAgZmFpbCgiRXhwZWN0ZWQgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGZvciBub24gVVRGLTggYnl0ZSBzdHJpbmcuIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGV4Y2VwdGlvbikgewotICAgICAgYXNzZXJ0RXF1YWxzKCJQcm90b2NvbCBtZXNzYWdlIGhhZCBpbnZhbGlkIFVURi04LiIsIGV4Y2VwdGlvbi5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW1UZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhOTQwY2UuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODIxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkJvb2xNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uSW50MzJNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uSW50NjRNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlY3Vyc2l2ZU1lc3NhZ2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIENvZGVkSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAvKioKLSAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIGJ5dGUgYXJyYXkgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKLSAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycwotICAgKiBhYm91dCBwcmVjaXNpb24uCi0gICAqLwotICBwcml2YXRlIGJ5dGVbXSBieXRlcyhpbnQuLi4gYnl0ZXNBc0ludHMpIHsKLSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlc0FzSW50cy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNBc0ludHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpIGJ5dGVzQXNJbnRzW2ldOwotICAgIH0KLSAgICByZXR1cm4gYnl0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogQW4gSW5wdXRTdHJlYW0gd2hpY2ggbGltaXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgcmVhZHMgYXQgYSB0aW1lLgotICAgKiBXZSB1c2UgdGhpcyB0byBtYWtlIHN1cmUgdGhhdCBDb2RlZElucHV0U3RyZWFtIGRvZXNuJ3Qgc2NyZXcgdXAgd2hlbgotICAgKiByZWFkaW5nIGluIHNtYWxsIGJsb2Nrcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNtYWxsQmxvY2tJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKLSAgICBwcml2YXRlIGZpbmFsIGludCBibG9ja1NpemU7Ci0KLSAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKGJ5dGVbXSBkYXRhLCBpbnQgYmxvY2tTaXplKSB7Ci0gICAgICB0aGlzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgYmxvY2tTaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgYmxvY2tTaXplKSB7Ci0gICAgICBzdXBlcihpbik7Ci0gICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gc3VwZXIucmVhZChiLCAwLCBNYXRoLm1pbihiLmxlbmd0aCwgYmxvY2tTaXplKSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHN1cGVyLnJlYWQoYiwgb2ZmLCBNYXRoLm1pbihsZW4sIGJsb2NrU2l6ZSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnREYXRhQ29uc3VtZWQoYnl0ZVtdIGRhdGEsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgaW5wdXQuZ2V0VG90YWxCeXRlc1JlYWQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgcmVhZFJhd1ZhcmludDMyKCkgYW5kIHJlYWRSYXdWYXJpbnQ2NCgpIGFuZAotICAgKiBjaGVja3MgdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRWYXJpbnQoYnl0ZVtdIGRhdGEsIGxvbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEpOwotICAgIGFzc2VydEVxdWFscygoaW50KSB2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDMyKCkpOwotICAgIGFzc2VydERhdGFDb25zdW1lZChkYXRhLCBpbnB1dCk7Ci0KLSAgICBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBpbnB1dC5yZWFkUmF3VmFyaW50NjQoKSk7Ci0gICAgYXNzZXJ0RGF0YUNvbnN1bWVkKGRhdGEsIGlucHV0KTsKLQotICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdWYXJpbnQ2NFNsb3dQYXRoKCkpOwotICAgIGFzc2VydERhdGFDb25zdW1lZChkYXRhLCBpbnB1dCk7Ci0KLSAgICBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7Ci0gICAgYXNzZXJ0VHJ1ZShpbnB1dC5za2lwRmllbGQoV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpKTsKLSAgICBhc3NlcnREYXRhQ29uc3VtZWQoZGF0YSwgaW5wdXQpOwotCi0gICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKSB7Ci0gICAgICBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCi0gICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0oZGF0YSwgYmxvY2tTaXplKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoKGludCkgdmFsdWUsIGlucHV0LnJlYWRSYXdWYXJpbnQzMigpKTsKLSAgICAgIGFzc2VydERhdGFDb25zdW1lZChkYXRhLCBpbnB1dCk7Ci0KLSAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKLSAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDY0KCkpOwotICAgICAgYXNzZXJ0RGF0YUNvbnN1bWVkKGRhdGEsIGlucHV0KTsKLQotICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAotICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBpbnB1dC5yZWFkUmF3VmFyaW50NjRTbG93UGF0aCgpKTsKLSAgICAgIGFzc2VydERhdGFDb25zdW1lZChkYXRhLCBpbnB1dCk7Ci0KLSAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKLSAgICAgIGFzc2VydFRydWUoaW5wdXQuc2tpcEZpZWxkKFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSk7Ci0gICAgICBhc3NlcnREYXRhQ29uc3VtZWQoZGF0YSwgaW5wdXQpOwotICAgIH0KLQotICAgIC8vIFRyeSByZWFkaW5nIGRpcmVjdCBmcm9tIGFuIElucHV0U3RyZWFtLiAgV2Ugd2FudCB0byB2ZXJpZnkgdGhhdCBpdAotICAgIC8vIGRvZXNuJ3QgcmVhZCBwYXN0IHRoZSBlbmQgb2YgdGhlIGlucHV0LCBzbyB3ZSBjb3B5IHRvIGEgbmV3LCBiaWdnZXIKLSAgICAvLyBhcnJheSBmaXJzdC4KLSAgICBieXRlW10gbG9uZ2VyRGF0YSA9IG5ldyBieXRlW2RhdGEubGVuZ3RoICsgMV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShkYXRhLCAwLCBsb25nZXJEYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0gICAgSW5wdXRTdHJlYW0gcmF3SW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0obG9uZ2VyRGF0YSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChpbnQpIHZhbHVlLCBDb2RlZElucHV0U3RyZWFtLnJlYWRSYXdWYXJpbnQzMihyYXdJbnB1dCkpOwotICAgIGFzc2VydEVxdWFscygxLCByYXdJbnB1dC5hdmFpbGFibGUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyByZWFkUmF3VmFyaW50MzIoKSBhbmQgcmVhZFJhd1ZhcmludDY0KCkgYW5kCi0gICAqIGV4cGVjdHMgdGhlbSB0byBmYWlsIHdpdGggYW4gSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHdob3NlCi0gICAqIGRlc2NyaXB0aW9uIG1hdGNoZXMgdGhlIGdpdmVuIG9uZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkVmFyaW50RmFpbHVyZSgKLSAgICAgIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleHBlY3RlZCwgYnl0ZVtdIGRhdGEpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICB0cnkgewotICAgICAgaW5wdXQucmVhZFJhd1ZhcmludDMyKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEpOwotICAgIHRyeSB7Ci0gICAgICBpbnB1dC5yZWFkUmF3VmFyaW50NjQoKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5nZXRNZXNzYWdlKCksIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0KLSAgICBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7Ci0gICAgdHJ5IHsKLSAgICAgIGlucHV0LnJlYWRSYXdWYXJpbnQ2NFNsb3dQYXRoKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHdlIGdldCB0aGUgc2FtZSBlcnJvciB3aGVuIHJlYWRpbmcgZGlyZWN0IGZyb20gYW4gSW5wdXRTdHJlYW0uCi0gICAgdHJ5IHsKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0ucmVhZFJhd1ZhcmludDMyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFRlc3RzIHJlYWRSYXdWYXJpbnQzMigpIGFuZCByZWFkUmF3VmFyaW50NjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDApLCAwKTsKLSAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDEpLCAxKTsKLSAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4N2YpLCAxMjcpOwotICAgIC8vIDE0ODgyCi0gICAgYXNzZXJ0UmVhZFZhcmludChieXRlcygweGEyLCAweDc0KSwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KSk7Ci0gICAgLy8gMjk2MTQ4ODgzMAotICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCi0gICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAgICgweDBiTCA8PCAyOCkpOwotCi0gICAgLy8gNjQtYml0Ci0gICAgLy8gNzI1NjQ1NjEyNgotICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYiksCi0gICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAgICgweDFiTCA8PCAyOCkpOwotICAgIC8vIDQxMjU2MjAyNTgwNzE4MzM2Ci0gICAgYXNzZXJ0UmVhZFZhcmludCgKLSAgICAgIGJ5dGVzKDB4ODAsIDB4ZTYsIDB4ZWIsIDB4OWMsIDB4YzMsIDB4YzksIDB4YTQsIDB4NDkpLAotICAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8Ci0gICAgICAoMHg0M0wgPDwgMjgpIHwgKDB4NDlMIDw8IDM1KSB8ICgweDI0TCA8PCA0MikgfCAoMHg0OUwgPDwgNDkpKTsKLSAgICAvLyAxMTk2NDM3ODMzMDk3ODczNTEzMQotICAgIGFzc2VydFJlYWRWYXJpbnQoCi0gICAgICBieXRlcygweDliLCAweGE4LCAweGY5LCAweGMyLCAweGJiLCAweGQ2LCAweDgwLCAweDg1LCAweGE2LCAweDAxKSwKLSAgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAotICAgICAgKDB4M2JMIDw8IDI4KSB8ICgweDU2TCA8PCAzNSkgfCAoMHgwMEwgPDwgNDIpIHwKLSAgICAgICgweDA1TCA8PCA0OSkgfCAoMHgyNkwgPDwgNTYpIHwgKDB4MDFMIDw8IDYzKSk7Ci0KLSAgICAvLyBGYWlsdXJlcwotICAgIGFzc2VydFJlYWRWYXJpbnRGYWlsdXJlKAotICAgICAgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpLAotICAgICAgYnl0ZXMoMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKLSAgICAgICAgICAgIDB4MDApKTsKLSAgICBhc3NlcnRSZWFkVmFyaW50RmFpbHVyZSgKLSAgICAgIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCksCi0gICAgICBieXRlcygweDgwKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgY2hlY2tzCi0gICAqIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZVtdIGRhdGEsIGludCB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsKLSAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0KLSAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKLSAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKLSAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOwotICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MKLSAgICogdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRMaXR0bGVFbmRpYW42NChieXRlW10gZGF0YSwgbG9uZyB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW42NCgpKTsKLSAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0KLSAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKLSAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKLSAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOwotICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKiBUZXN0cyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgcmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkTGl0dGxlRW5kaWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjMyKGJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIpLCAweDEyMzQ1Njc4KTsKLSAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksIDB4OWFiY2RlZjApOwotCi0gICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjY0KAotICAgICAgYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksCi0gICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsKLSAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoCi0gICAgICBieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyLCAweGYwLCAweGRlLCAweGJjLCAweDlhKSwKLSAgICAgIDB4OWFiY2RlZjAxMjM0NTY3OEwpOwotICB9Ci0KLSAgLyoqIFRlc3QgZGVjb2RlWmlnWmFnMzIoKSBhbmQgZGVjb2RlWmlnWmFnNjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdERlY29kZVppZ1phZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyggMCwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMikpOwotICAgIGFzc2VydEVxdWFscygtMiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigzKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4M0ZGRkZGRkYsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHg3RkZGRkZGRSkpOwotICAgIGFzc2VydEVxdWFscygweEMwMDAwMDAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigweEZGRkZGRkZFKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4ODAwMDAwMDAsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHhGRkZGRkZGRikpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoLTEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMSkpOwotICAgIGFzc2VydEVxdWFscyggMSwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0yLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMDNGRkZGRkZGTCwKLSAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwN0ZGRkZGRkVMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkZDMDAwMDAwMEwsCi0gICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZGTCkpOwotICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwN0ZGRkZGRkZMLAotICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4MDAwMDAwMDBGRkZGRkZGRUwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRjgwMDAwMDAwTCwKLSAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwRkZGRkZGRkZMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4N0ZGRkZGRkZGRkZGRkZGRkwsCi0gICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkZGRkZGRkZFTCkpOwotICAgIGFzc2VydEVxdWFscygweDgwMDAwMDAwMDAwMDAwMDBMLAotICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4RkZGRkZGRkZGRkZGRkZGRkwpKTsKLSAgfQotCi0gIC8qKiBUZXN0cyByZWFkaW5nIGFuZCBwYXJzaW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IGZpZWxkIHR5cGUuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkV2hvbGVNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLQotICAgIGJ5dGVbXSByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRFcXVhbHMocmF3Qnl0ZXMubGVuZ3RoLCBtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShyYXdCeXRlcyk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLQotICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCi0gICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDwgMjU2OyBibG9ja1NpemUgKj0gMikgewotICAgICAgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKAotICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKHJhd0J5dGVzLCBibG9ja1NpemUpKTsKLSAgICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFRlc3RzIHNraXBGaWVsZCgpLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFdob2xlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOwotCi0gICAgLy8gQ3JlYXRlIHR3byBwYXJhbGxlbCBpbnB1dHMuICBQYXJzZSBvbmUgYXMgdW5rbm93biBmaWVsZHMgd2hpbGUgdXNpbmcKLSAgICAvLyBza2lwRmllbGQoKSB0byBza2lwIGVhY2ggZmllbGQgb24gdGhlIG90aGVyLiAgRXhwZWN0IHRoZSBzYW1lIHRhZ3MuCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dDEgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd0J5dGVzKTsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0MiA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOwotICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCB0YWcgPSBpbnB1dDEucmVhZFRhZygpOwotICAgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQyLnJlYWRUYWcoKSk7Ci0gICAgICBpZiAodGFnID09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB1bmtub3duRmllbGRzLm1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQxKTsKLSAgICAgIGlucHV0Mi5za2lwRmllbGQodGFnKTsKLSAgICB9Ci0gIH0KLQotCi0gIC8qKgotICAgKiBUZXN0IHRoYXQgYSBidWcgaW4gc2tpcFJhd0J5dGVzKCkgaGFzIGJlZW4gZml4ZWQ6ICBpZiB0aGUgc2tpcCBza2lwcwotICAgKiBleGFjdGx5IHVwIHRvIGEgbGltaXQsIHRoaXMgc2hvdWxkIG5vdCBicmVhayB0aGluZ3MuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFJhd0J5dGVzQnVnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIHJhd0J5dGVzID0gbmV3IGJ5dGVbXSB7IDEsIDIgfTsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdCeXRlcyk7Ci0KLSAgICBpbnQgbGltaXQgPSBpbnB1dC5wdXNoTGltaXQoMSk7Ci0gICAgaW5wdXQuc2tpcFJhd0J5dGVzKDEpOwotICAgIGlucHV0LnBvcExpbWl0KGxpbWl0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgaW5wdXQucmVhZFJhd0J5dGUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IGEgYnVnIGluIHNraXBSYXdCeXRlcygpIGhhcyBiZWVuIGZpeGVkOiAgaWYgdGhlIHNraXAgc2tpcHMKLSAgICogcGFzdCB0aGUgZW5kIG9mIGEgYnVmZmVyIHdpdGggYSBsaW1pdCB0aGF0IGhhcyBiZWVuIHNldCBwYXN0IHRoZSBlbmQgb2YKLSAgICogdGhhdCBidWZmZXIsIHRoaXMgc2hvdWxkIG5vdCBicmVhayB0aGluZ3MuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFJhd0J5dGVzUGFzdEVuZE9mQnVmZmVyV2l0aExpbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIHJhd0J5dGVzID0gbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQsIDUgfTsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShyYXdCeXRlcywgMykpOwotCi0gICAgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KDQpOwotICAgIC8vIEluIG9yZGVyIHRvIGV4cG9zZSB0aGUgYnVnIHdlIG5lZWQgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSB0byBwcmltZSB0aGUKLSAgICAvLyBidWZmZXIgaW5zaWRlIHRoZSBDb2RlZElucHV0U3RyZWFtLgotICAgIGFzc2VydEVxdWFscygxLCBpbnB1dC5yZWFkUmF3Qnl0ZSgpKTsKLSAgICAvLyBTa2lwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbWl0LgotICAgIGlucHV0LnNraXBSYXdCeXRlcygzKTsKLSAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0gICAgaW5wdXQucG9wTGltaXQobGltaXQpOwotICAgIGFzc2VydEVxdWFscyg1LCBpbnB1dC5yZWFkUmF3Qnl0ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkSHVnZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIDFNQiBibG9iLgotICAgIGJ5dGVbXSBibG9iID0gbmV3IGJ5dGVbMSA8PCAyMF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBibG9iLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBibG9iW2ldID0gKGJ5dGUpIGk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBhIG1lc3NhZ2UgY29udGFpbmluZyBpdC4KLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb20oYmxvYikpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgLy8gU2VyaWFsaXplIGFuZCBwYXJzZSBpdC4gIE1ha2Ugc3VyZSB0byBwYXJzZSBmcm9tIGFuIElucHV0U3RyZWFtLCBub3QKLSAgICAvLyBkaXJlY3RseSBmcm9tIGEgQnl0ZVN0cmluZywgc28gdGhhdCBDb2RlZElucHV0U3RyZWFtIHVzZXMgYnVmZmVyZWQKLSAgICAvLyByZWFkaW5nLgotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9Ci0gICAgICBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkubmV3SW5wdXQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRPcHRpb25hbEJ5dGVzKCksIG1lc3NhZ2UyLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBvdGhlciBmaWVsZHMgd2VyZSBwYXJzZWQgY29ycmVjdGx5LgotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMyA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKG1lc3NhZ2UyKQotICAgICAgLnNldE9wdGlvbmFsQnl0ZXMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0T3B0aW9uYWxCeXRlcygpKQotICAgICAgLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkTWFsaWNpb3VzbHlMYXJnZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nLk91dHB1dCByYXdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7Ci0KLSAgICBpbnQgdGFnID0gV2lyZUZvcm1hdC5tYWtlVGFnKDEsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIodGFnKTsKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigweDdGRkZGRkZGKTsKLSAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVszMl0pOyAgLy8gUGFkIHdpdGggYSBmZXcgcmFuZG9tIGJ5dGVzLgotICAgIG91dHB1dC5mbHVzaCgpOwotCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQucmVhZFRhZygpKTsKLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dC5yZWFkQnl0ZXMoKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MuCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBtYWtlUmVjdXJzaXZlTWVzc2FnZShpbnQgZGVwdGgpIHsKLSAgICBpZiAoZGVwdGggPT0gMCkgewotICAgICAgcmV0dXJuIFRlc3RSZWN1cnNpdmVNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDUpLmJ1aWxkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBUZXN0UmVjdXJzaXZlTWVzc2FnZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEEobWFrZVJlY3Vyc2l2ZU1lc3NhZ2UoZGVwdGggLSAxKSkuYnVpbGQoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZURlcHRoKFRlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2UsIGludCBkZXB0aCkgewotICAgIGlmIChkZXB0aCA9PSAwKSB7Ci0gICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0EoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNSwgbWVzc2FnZS5nZXRJKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzQSgpKTsKLSAgICAgIGFzc2VydE1lc3NhZ2VEZXB0aChtZXNzYWdlLmdldEEoKSwgZGVwdGggLSAxKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWFsaWNpb3VzUmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQnl0ZVN0cmluZyBkYXRhMTAwID0gbWFrZVJlY3Vyc2l2ZU1lc3NhZ2UoMTAwKS50b0J5dGVTdHJpbmcoKTsKLSAgICBCeXRlU3RyaW5nIGRhdGExMDEgPSBtYWtlUmVjdXJzaXZlTWVzc2FnZSgxMDEpLnRvQnl0ZVN0cmluZygpOwotCi0gICAgYXNzZXJ0TWVzc2FnZURlcHRoKFRlc3RSZWN1cnNpdmVNZXNzYWdlLnBhcnNlRnJvbShkYXRhMTAwKSwgMTAwKTsKLQotICAgIHRyeSB7Ci0gICAgICBUZXN0UmVjdXJzaXZlTWVzc2FnZS5wYXJzZUZyb20oZGF0YTEwMSk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzLgotICAgIH0KLQotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhMTAwLm5ld0NvZGVkSW5wdXQoKTsKLSAgICBpbnB1dC5zZXRSZWN1cnNpb25MaW1pdCg4KTsKLSAgICB0cnkgewotICAgICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UucGFyc2VGcm9tKGlucHV0KTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MuCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoZWNrU2l6ZUxpbWl0RXhjZWVkZWQoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uc2l6ZUxpbWl0RXhjZWVkZWQoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNpemVMaW1pdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAotICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKAotICAgICAgICAgICAgVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCkubmV3SW5wdXQoKSwgMTYpKTsKLSAgICBpbnB1dC5zZXRTaXplTGltaXQoMTYpOwotCi0gICAgdHJ5IHsKLSAgICAgIFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oaW5wdXQpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiEiKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIGNoZWNrU2l6ZUxpbWl0RXhjZWVkZWQoZXhwZWN0ZWQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXNldFNpemVDb3VudGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCi0gICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0obmV3IGJ5dGVbMjU2XSwgOCkpOwotICAgIGlucHV0LnNldFNpemVMaW1pdCgxNik7Ci0gICAgaW5wdXQucmVhZFJhd0J5dGVzKDE2KTsKLSAgICBhc3NlcnRFcXVhbHMoMTYsIGlucHV0LmdldFRvdGFsQnl0ZXNSZWFkKCkpOwotCi0gICAgdHJ5IHsKLSAgICAgIGlucHV0LnJlYWRSYXdCeXRlKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgY2hlY2tTaXplTGltaXRFeGNlZWRlZChleHBlY3RlZCk7Ci0gICAgfQotCi0gICAgaW5wdXQucmVzZXRTaXplQ291bnRlcigpOwotICAgIGFzc2VydEVxdWFscygwLCBpbnB1dC5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKLSAgICBpbnB1dC5yZWFkUmF3Qnl0ZSgpOyAgLy8gTm8gZXhjZXB0aW9uIHRocm93bi4KLSAgICBpbnB1dC5yZXNldFNpemVDb3VudGVyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGlucHV0LmdldFRvdGFsQnl0ZXNSZWFkKCkpOwotICAgIGlucHV0LnJlYWRSYXdCeXRlcygxNik7Ci0gICAgYXNzZXJ0RXF1YWxzKDE2LCBpbnB1dC5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKLSAgICBpbnB1dC5yZXNldFNpemVDb3VudGVyKCk7Ci0KLSAgICB0cnkgewotICAgICAgaW5wdXQucmVhZFJhd0J5dGVzKDE3KTsgIC8vIEhpdHMgbGltaXQgYWdhaW4uCi0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgY2hlY2tTaXplTGltaXRFeGNlZWRlZChleHBlY3RlZCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNpemVMaW1pdE11bHRpcGxlTWVzc2FnZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVsyNTZdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpIGk7Ci0gICAgfQotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAotICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGJ5dGVzLCA3KSk7Ci0gICAgaW5wdXQuc2V0U2l6ZUxpbWl0KDE2KTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI1NiAvIDE2OyBpKyspIHsKLSAgICAgIGJ5dGVbXSBtZXNzYWdlID0gaW5wdXQucmVhZFJhd0J5dGVzKDE2KTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgbWVzc2FnZS5sZW5ndGg7IGorKykgewotICAgICAgICBhc3NlcnRFcXVhbHMoaSAqIDE2ICsgaiwgbWVzc2FnZVtqXSAmIDB4ZmYpOwotICAgICAgfQotICAgICAgYXNzZXJ0RXF1YWxzKDE2LCBpbnB1dC5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKLSAgICAgIGlucHV0LnJlc2V0U2l6ZUNvdW50ZXIoKTsKLSAgICAgIGFzc2VydEVxdWFscygwLCBpbnB1dC5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN0cmluZyBsb3JlbSA9ICJMb3JlbSBpcHN1bSBkb2xvciBzaXQgYW1ldCAiOwotICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0MDk2OyBpICs9IGxvcmVtLmxlbmd0aCgpKSB7Ci0gICAgICBidWlsZGVyLmFwcGVuZChsb3JlbSk7Ci0gICAgfQotICAgIGxvcmVtID0gYnVpbGRlci50b1N0cmluZygpLnN1YnN0cmluZygwLCA0MDk2KTsKLSAgICBieXRlW10gYnl0ZXMgPSBsb3JlbS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICBCeXRlU3RyaW5nLk91dHB1dCByYXdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCwgYnl0ZXMubGVuZ3RoKTsKLQotICAgIGludCB0YWcgPSBXaXJlRm9ybWF0Lm1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOwotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKGJ5dGVzLmxlbmd0aCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3Qnl0ZXMoYnl0ZXMpOwotICAgIG91dHB1dC5mbHVzaCgpOwotCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9Ci0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCi0gICAgICAgICAgICBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ocmF3T3V0cHV0LnRvQnl0ZVN0cmluZygpLnRvQnl0ZUFycmF5KCkpKTsKLSAgICBhc3NlcnRFcXVhbHModGFnLCBpbnB1dC5yZWFkVGFnKCkpOwotICAgIFN0cmluZyB0ZXh0ID0gaW5wdXQucmVhZFN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhsb3JlbSwgdGV4dCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZ1JlcXVpcmVVdGY4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGxvcmVtID0gIkxvcmVtIGlwc3VtIGRvbG9yIHNpdCBhbWV0ICI7Ci0gICAgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQwOTY7IGkgKz0gbG9yZW0ubGVuZ3RoKCkpIHsKLSAgICAgIGJ1aWxkZXIuYXBwZW5kKGxvcmVtKTsKLSAgICB9Ci0gICAgbG9yZW0gPSBidWlsZGVyLnRvU3RyaW5nKCkuc3Vic3RyaW5nKDAsIDQwOTYpOwotICAgIGJ5dGVbXSBieXRlcyA9IGxvcmVtLmdldEJ5dGVzKCJVVEYtOCIpOwotICAgIEJ5dGVTdHJpbmcuT3V0cHV0IHJhd091dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KCk7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0LCBieXRlcy5sZW5ndGgpOwotCi0gICAgaW50IHRhZyA9IFdpcmVGb3JtYXQubWFrZVRhZygxLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKHRhZyk7Ci0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoYnl0ZXMubGVuZ3RoKTsKLSAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhieXRlcyk7Ci0gICAgb3V0cHV0LmZsdXNoKCk7Ci0KLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0KLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShyYXdPdXRwdXQudG9CeXRlU3RyaW5nKCkudG9CeXRlQXJyYXkoKSkpOwotICAgIGFzc2VydEVxdWFscyh0YWcsIGlucHV0LnJlYWRUYWcoKSk7Ci0gICAgU3RyaW5nIHRleHQgPSBpbnB1dC5yZWFkU3RyaW5nUmVxdWlyZVV0ZjgoKTsKLSAgICBhc3NlcnRFcXVhbHMobG9yZW0sIHRleHQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgaWYgd2UgcmVhZFN0cmluZyBpbnZhbGlkIFVURi04IGJ5dGVzLCBubyBleGNlcHRpb24KLSAgICogaXMgdGhyb3duLiAgSW5zdGVhZCwgdGhlIGludmFsaWQgYnl0ZXMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIFVuaWNvZGUKLSAgICogInJlcGxhY2VtZW50IGNoYXJhY3RlciIgVStGRkZELgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRTdHJpbmdJbnZhbGlkVXRmOCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcuT3V0cHV0IHJhd091dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KCk7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKLQotICAgIGludCB0YWcgPSBXaXJlRm9ybWF0Lm1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOwotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDEpOwotICAgIG91dHB1dC53cml0ZVJhd0J5dGVzKG5ldyBieXRlW10geyAoYnl0ZSkgMHg4MCB9KTsKLSAgICBvdXRwdXQuZmx1c2goKTsKLQotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSByYXdPdXRwdXQudG9CeXRlU3RyaW5nKCkubmV3Q29kZWRJbnB1dCgpOwotICAgIGFzc2VydEVxdWFscyh0YWcsIGlucHV0LnJlYWRUYWcoKSk7Ci0gICAgU3RyaW5nIHRleHQgPSBpbnB1dC5yZWFkU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4ZmZmZCwgdGV4dC5jaGFyQXQoMCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgaWYgd2UgcmVhZFN0cmluZ1JlcXVpcmVVdGY4IGludmFsaWQgVVRGLTggYnl0ZXMsIGFuCi0gICAqIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZFN0cmluZ1JlcXVpcmVVdGY4SW52YWxpZFV0ZjgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nLk91dHB1dCByYXdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7Ci0KLSAgICBpbnQgdGFnID0gV2lyZUZvcm1hdC5tYWtlVGFnKDEsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIodGFnKTsKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigxKTsKLSAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVtdIHsgKGJ5dGUpIDB4ODAgfSk7Ci0gICAgb3V0cHV0LmZsdXNoKCk7Ci0KLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gcmF3T3V0cHV0LnRvQnl0ZVN0cmluZygpLm5ld0NvZGVkSW5wdXQoKTsKLSAgICBhc3NlcnRFcXVhbHModGFnLCBpbnB1dC5yZWFkVGFnKCkpOwotICAgIHRyeSB7Ci0gICAgICBpbnB1dC5yZWFkU3RyaW5nUmVxdWlyZVV0ZjgoKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIGludmFsaWQgVVRGLTggZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleGNlcHRpb24pIHsKLSAgICAgIGFzc2VydEVxdWFscygiUHJvdG9jb2wgbWVzc2FnZSBoYWQgaW52YWxpZCBVVEYtOC4iLCBleGNlcHRpb24uZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21TbGljZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGJ5dGVbXSBieXRlcyA9IGJ5dGVzKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpOwotICAgIENvZGVkSW5wdXRTdHJlYW0gaW4gPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVzLCAzLCA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDM7IGkgPCA4OyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBpbi5yZWFkUmF3Qnl0ZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhpIC0gMiwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7Ci0gICAgfQotICAgIC8vIGVvZgotICAgIGFzc2VydEVxdWFscygwLCBpbi5yZWFkVGFnKCkpOwotICAgIGFzc2VydEVxdWFscyg1LCBpbi5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkVGFnKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gQW55IHRhZyBudW1iZXIgd2hpY2ggY29ycmVzcG9uZHMgdG8gZmllbGQgbnVtYmVyIHplcm8gaXMgaW52YWxpZCBhbmQKLSAgICAvLyBzaG91bGQgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgICB0cnkgewotICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVzKGkpKS5yZWFkVGFnKCk7Ci0gICAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICBhc3NlcnRFcXVhbHMoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRUYWcoKS5nZXRNZXNzYWdlKCksCi0gICAgICAgICAgICAgICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRCeXRlQXJyYXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nLk91dHB1dCByYXdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7Ci0gICAgLy8gWmVyby1zaXplZCBieXRlcyBmaWVsZC4KLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigwKTsKLSAgICAvLyBPbmUgb25lLWJ5dGUgYnl0ZXMgZmllbGQKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigxKTsKLSAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVtdIHsgKGJ5dGUpIDIzIH0pOwotICAgIC8vIEFub3RoZXIgb25lLWJ5dGUgYnl0ZXMgZmllbGQKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigxKTsKLSAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVtdIHsgKGJ5dGUpIDQ1IH0pOwotICAgIC8vIEEgYnl0ZXMgZmllbGQgbGFyZ2UgZW5vdWdoIHRoYXQgd29uJ3QgZml0IGludG8gdGhlIDRLIGJ1ZmZlci4KLSAgICBmaW5hbCBpbnQgYnl0ZXNMZW5ndGggPSAxNiAqIDEwMjQ7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNMZW5ndGhdOwotICAgIGJ5dGVzWzBdID0gKGJ5dGUpIDY3OwotICAgIGJ5dGVzW2J5dGVzTGVuZ3RoIC0gMV0gPSAoYnl0ZSkgODk7Ci0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoYnl0ZXNMZW5ndGgpOwotICAgIG91dHB1dC53cml0ZVJhd0J5dGVzKGJ5dGVzKTsKLQotICAgIG91dHB1dC5mbHVzaCgpOwotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW0gPSByYXdPdXRwdXQudG9CeXRlU3RyaW5nKCkubmV3Q29kZWRJbnB1dCgpOwotCi0gICAgYnl0ZVtdIHJlc3VsdCA9IGlucHV0U3RyZWFtLnJlYWRCeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gaW5wdXRTdHJlYW0ucmVhZEJ5dGVBcnJheSgpOwotICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDIzLCByZXN1bHRbMF0pOwotICAgIHJlc3VsdCA9IGlucHV0U3RyZWFtLnJlYWRCeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSA0NSwgcmVzdWx0WzBdKTsKLSAgICByZXN1bHQgPSBpbnB1dFN0cmVhbS5yZWFkQnl0ZUFycmF5KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGJ5dGVzTGVuZ3RoLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDY3LCByZXN1bHRbMF0pOwotICAgIGFzc2VydEVxdWFscygoYnl0ZSkgODksIHJlc3VsdFtieXRlc0xlbmd0aCAtIDFdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZUJ1ZmZlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcuT3V0cHV0IHJhd091dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KCk7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKLSAgICAvLyBaZXJvLXNpemVkIGJ5dGVzIGZpZWxkLgotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDApOwotICAgIC8vIE9uZSBvbmUtYnl0ZSBieXRlcyBmaWVsZAotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDEpOwotICAgIG91dHB1dC53cml0ZVJhd0J5dGVzKG5ldyBieXRlW117KGJ5dGUpIDIzfSk7Ci0gICAgLy8gQW5vdGhlciBvbmUtYnl0ZSBieXRlcyBmaWVsZAotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDEpOwotICAgIG91dHB1dC53cml0ZVJhd0J5dGVzKG5ldyBieXRlW117KGJ5dGUpIDQ1fSk7Ci0gICAgLy8gQSBieXRlcyBmaWVsZCBsYXJnZSBlbm91Z2ggdGhhdCB3b24ndCBmaXQgaW50byB0aGUgNEsgYnVmZmVyLgotICAgIGZpbmFsIGludCBieXRlc0xlbmd0aCA9IDE2ICogMTAyNDsKLSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlc0xlbmd0aF07Ci0gICAgYnl0ZXNbMF0gPSAoYnl0ZSkgNjc7Ci0gICAgYnl0ZXNbYnl0ZXNMZW5ndGggLSAxXSA9IChieXRlKSA4OTsKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMihieXRlc0xlbmd0aCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3Qnl0ZXMoYnl0ZXMpOwotCi0gICAgb3V0cHV0LmZsdXNoKCk7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dFN0cmVhbSA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7Ci0KLSAgICBCeXRlQnVmZmVyIHJlc3VsdCA9IGlucHV0U3RyZWFtLnJlYWRCeXRlQnVmZmVyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5jYXBhY2l0eSgpKTsKLSAgICByZXN1bHQgPSBpbnB1dFN0cmVhbS5yZWFkQnl0ZUJ1ZmZlcigpOwotICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuY2FwYWNpdHkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSAyMywgcmVzdWx0LmdldCgpKTsKLSAgICByZXN1bHQgPSBpbnB1dFN0cmVhbS5yZWFkQnl0ZUJ1ZmZlcigpOwotICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuY2FwYWNpdHkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSA0NSwgcmVzdWx0LmdldCgpKTsKLSAgICByZXN1bHQgPSBpbnB1dFN0cmVhbS5yZWFkQnl0ZUJ1ZmZlcigpOwotICAgIGFzc2VydEVxdWFscyhieXRlc0xlbmd0aCwgcmVzdWx0LmNhcGFjaXR5KCkpOwotICAgIGFzc2VydEVxdWFscygoYnl0ZSkgNjcsIHJlc3VsdC5nZXQoKSk7Ci0gICAgcmVzdWx0LnBvc2l0aW9uKGJ5dGVzTGVuZ3RoIC0gMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSA4OSwgcmVzdWx0LmdldCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkQnl0ZUJ1ZmZlckFsaWFzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJ5dGVBcnJheVN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShieXRlQXJyYXlTdHJlYW0pOwotICAgIC8vIFplcm8tc2l6ZWQgYnl0ZXMgZmllbGQuCi0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoMCk7Ci0gICAgLy8gT25lIG9uZS1ieXRlIGJ5dGVzIGZpZWxkCi0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoMSk7Ci0gICAgb3V0cHV0LndyaXRlUmF3Qnl0ZXMobmV3IGJ5dGVbXXsoYnl0ZSkgMjN9KTsKLSAgICAvLyBBbm90aGVyIG9uZS1ieXRlIGJ5dGVzIGZpZWxkCi0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoMSk7Ci0gICAgb3V0cHV0LndyaXRlUmF3Qnl0ZXMobmV3IGJ5dGVbXXsoYnl0ZSkgNDV9KTsKLSAgICAvLyBBIGJ5dGVzIGZpZWxkIGxhcmdlIGVub3VnaCB0aGF0IHdvbid0IGZpdCBpbnRvIHRoZSA0SyBidWZmZXIuCi0gICAgZmluYWwgaW50IGJ5dGVzTGVuZ3RoID0gMTYgKiAxMDI0OwotICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVzTGVuZ3RoXTsKLSAgICBieXRlc1swXSA9IChieXRlKSA2NzsKLSAgICBieXRlc1tieXRlc0xlbmd0aCAtIDFdID0gKGJ5dGUpIDg5OwotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKGJ5dGVzTGVuZ3RoKTsKLSAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhieXRlcyk7Ci0gICAgb3V0cHV0LmZsdXNoKCk7Ci0gICAgYnl0ZVtdIGRhdGEgPSBieXRlQXJyYXlTdHJlYW0udG9CeXRlQXJyYXkoKTsKLQotICAgIC8vIFdpdGhvdXQgYWxpYXNpbmcKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0U3RyZWFtID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBCeXRlQnVmZmVyIHJlc3VsdCA9IGlucHV0U3RyZWFtLnJlYWRCeXRlQnVmZmVyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIHJlc3VsdC5jYXBhY2l0eSgpKTsKLSAgICByZXN1bHQgPSBpbnB1dFN0cmVhbS5yZWFkQnl0ZUJ1ZmZlcigpOwotICAgIGFzc2VydFRydWUocmVzdWx0LmFycmF5KCkgIT0gZGF0YSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5jYXBhY2l0eSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDIzLCByZXN1bHQuZ2V0KCkpOwotICAgIHJlc3VsdCA9IGlucHV0U3RyZWFtLnJlYWRCeXRlQnVmZmVyKCk7Ci0gICAgYXNzZXJ0VHJ1ZShyZXN1bHQuYXJyYXkoKSAhPSBkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgcmVzdWx0LmNhcGFjaXR5KCkpOwotICAgIGFzc2VydEVxdWFscygoYnl0ZSkgNDUsIHJlc3VsdC5nZXQoKSk7Ci0gICAgcmVzdWx0ID0gaW5wdXRTdHJlYW0ucmVhZEJ5dGVCdWZmZXIoKTsKLSAgICBhc3NlcnRUcnVlKHJlc3VsdC5hcnJheSgpICE9IGRhdGEpOwotICAgIGFzc2VydEVxdWFscyhieXRlc0xlbmd0aCwgcmVzdWx0LmNhcGFjaXR5KCkpOwotICAgIGFzc2VydEVxdWFscygoYnl0ZSkgNjcsIHJlc3VsdC5nZXQoKSk7Ci0gICAgcmVzdWx0LnBvc2l0aW9uKGJ5dGVzTGVuZ3RoIC0gMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSA4OSwgcmVzdWx0LmdldCgpKTsKLQotICAgIC8vIEVuYWJsZSBhbGlhc2luZwotICAgIGlucHV0U3RyZWFtID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBpbnB1dFN0cmVhbS5lbmFibGVBbGlhc2luZyh0cnVlKTsKLSAgICByZXN1bHQgPSBpbnB1dFN0cmVhbS5yZWFkQnl0ZUJ1ZmZlcigpOwotICAgIGFzc2VydEVxdWFscygwLCByZXN1bHQuY2FwYWNpdHkoKSk7Ci0gICAgcmVzdWx0ID0gaW5wdXRTdHJlYW0ucmVhZEJ5dGVCdWZmZXIoKTsKLSAgICBhc3NlcnRUcnVlKHJlc3VsdC5hcnJheSgpID09IGRhdGEpOwotICAgIGFzc2VydEVxdWFscygxLCByZXN1bHQuY2FwYWNpdHkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChieXRlKSAyMywgcmVzdWx0LmdldCgpKTsKLSAgICByZXN1bHQgPSBpbnB1dFN0cmVhbS5yZWFkQnl0ZUJ1ZmZlcigpOwotICAgIGFzc2VydFRydWUocmVzdWx0LmFycmF5KCkgPT0gZGF0YSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlc3VsdC5jYXBhY2l0eSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDQ1LCByZXN1bHQuZ2V0KCkpOwotICAgIHJlc3VsdCA9IGlucHV0U3RyZWFtLnJlYWRCeXRlQnVmZmVyKCk7Ci0gICAgYXNzZXJ0VHJ1ZShyZXN1bHQuYXJyYXkoKSA9PSBkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoYnl0ZXNMZW5ndGgsIHJlc3VsdC5jYXBhY2l0eSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoKGJ5dGUpIDY3LCByZXN1bHQuZ2V0KCkpOwotICAgIHJlc3VsdC5wb3NpdGlvbihieXRlc0xlbmd0aCAtIDEpOwotICAgIGFzc2VydEVxdWFscygoYnl0ZSkgODksIHJlc3VsdC5nZXQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29tcGF0aWJsZVR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbG9uZyBkYXRhID0gMHgxMDAwMDAwMDBMOwotICAgIEludDY0TWVzc2FnZSBtZXNzYWdlID0gSW50NjRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREYXRhKGRhdGEpLmJ1aWxkKCk7Ci0gICAgQnl0ZVN0cmluZyBzZXJpYWxpemVkID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIC8vIFRlc3QgaW50NjQobG9uZykgaXMgY29tcGF0aWJsZSB3aXRoIGJvb2woYm9vbGVhbikKLSAgICBCb29sTWVzc2FnZSBtc2cyID0gQm9vbE1lc3NhZ2UucGFyc2VGcm9tKHNlcmlhbGl6ZWQpOwotICAgIGFzc2VydFRydWUobXNnMi5nZXREYXRhKCkpOwotCi0gICAgLy8gVGVzdCBpbnQ2NChsb25nKSBpcyBjb21wYXRpYmxlIHdpdGggaW50MzIoaW50KQotICAgIEludDMyTWVzc2FnZSBtc2czID0gSW50MzJNZXNzYWdlLnBhcnNlRnJvbShzZXJpYWxpemVkKTsKLSAgICBhc3NlcnRFcXVhbHMoKGludCkgZGF0YSwgbXNnMy5nZXREYXRhKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzNhYTQzNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzc2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtLk91dE9mU3BhY2VFeGNlcHRpb247Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5TcGFyc2VFbnVtTWVzc2FnZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTcGFyc2VFbnVtOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHtAbGluayBDb2RlZE91dHB1dFN0cmVhbX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBpbnRlcmZhY2UgQ29kZXIgewotICAgIENvZGVkT3V0cHV0U3RyZWFtIHN0cmVhbSgpOwotCi0gICAgYnl0ZVtdIHRvQnl0ZUFycmF5KCk7Ci0KLSAgICBPdXRwdXRUeXBlIGdldE91dHB1dFR5cGUoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE91dHB1dFN0cmVhbUNvZGVyIGltcGxlbWVudHMgQ29kZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gc3RyZWFtOwotICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dDsKLQotICAgIE91dHB1dFN0cmVhbUNvZGVyKGludCBzaXplKSB7Ci0gICAgICBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBzdHJlYW0gPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShvdXRwdXQsIHNpemUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW0oKSB7Ci0gICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7Ci0gICAgICByZXR1cm4gb3V0cHV0LnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE91dHB1dFR5cGUgZ2V0T3V0cHV0VHlwZSgpIHsKLSAgICAgIHJldHVybiBPdXRwdXRUeXBlLlNUUkVBTTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBBcnJheUNvZGVyIGltcGxlbWVudHMgQ29kZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gc3RyZWFtOwotICAgIHByaXZhdGUgZmluYWwgYnl0ZVtdIGJ5dGVzOwotCi0gICAgQXJyYXlDb2RlcihpbnQgc2l6ZSkgewotICAgICAgYnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICAgIHN0cmVhbSA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVzKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQ29kZWRPdXRwdXRTdHJlYW0gc3RyZWFtKCkgewotICAgICAgcmV0dXJuIHN0cmVhbTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYnl0ZVtdIHRvQnl0ZUFycmF5KCkgewotICAgICAgcmV0dXJuIEFycmF5cy5jb3B5T2YoYnl0ZXMsIHN0cmVhbS5nZXRUb3RhbEJ5dGVzV3JpdHRlbigpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT3V0cHV0VHlwZSBnZXRPdXRwdXRUeXBlKCkgewotICAgICAgcmV0dXJuIE91dHB1dFR5cGUuQVJSQVk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgTmlvSGVhcENvZGVyIGltcGxlbWVudHMgQ29kZXIgewotICAgIHByaXZhdGUgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gc3RyZWFtOwotICAgIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5pdGlhbFBvc2l0aW9uOwotCi0gICAgTmlvSGVhcENvZGVyKGludCBzaXplKSB7Ci0gICAgICB0aGlzKHNpemUsIDApOwotICAgIH0KLQotICAgIE5pb0hlYXBDb2RlcihpbnQgc2l6ZSwgaW50IGluaXRpYWxQb3NpdGlvbikgewotICAgICAgdGhpcy5pbml0aWFsUG9zaXRpb24gPSBpbml0aWFsUG9zaXRpb247Ci0gICAgICBidWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHNpemUpOwotICAgICAgYnVmZmVyLnBvc2l0aW9uKGluaXRpYWxQb3NpdGlvbik7Ci0gICAgICBzdHJlYW0gPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShidWZmZXIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW0oKSB7Ci0gICAgICByZXR1cm4gc3RyZWFtOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7Ci0gICAgICBCeXRlQnVmZmVyIGR1cCA9IGJ1ZmZlci5kdXBsaWNhdGUoKTsKLSAgICAgIGR1cC5wb3NpdGlvbihpbml0aWFsUG9zaXRpb24pOwotICAgICAgZHVwLmxpbWl0KGJ1ZmZlci5wb3NpdGlvbigpKTsKLQotICAgICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbZHVwLnJlbWFpbmluZygpXTsKLSAgICAgIGR1cC5nZXQoYnl0ZXMpOwotICAgICAgcmV0dXJuIGJ5dGVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPdXRwdXRUeXBlIGdldE91dHB1dFR5cGUoKSB7Ci0gICAgICByZXR1cm4gT3V0cHV0VHlwZS5OSU9fSEVBUDsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBOaW9EaXJlY3RDb2RlciBpbXBsZW1lbnRzIENvZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIGludCBpbml0aWFsUG9zaXRpb247Ci0gICAgcHJpdmF0ZSBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW07Ci0gICAgcHJpdmF0ZSBmaW5hbCBCeXRlQnVmZmVyIGJ1ZmZlcjsKLQotICAgIE5pb0RpcmVjdENvZGVyKGludCBzaXplKSB7Ci0gICAgICB0aGlzKHNpemUsIDApOwotICAgIH0KLQotICAgIE5pb0RpcmVjdENvZGVyKGludCBzaXplLCBpbnQgaW5pdGlhbFBvc2l0aW9uKSB7Ci0gICAgICB0aGlzLmluaXRpYWxQb3NpdGlvbiA9IGluaXRpYWxQb3NpdGlvbjsKLSAgICAgIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGVEaXJlY3Qoc2l6ZSk7Ci0gICAgICBidWZmZXIucG9zaXRpb24oaW5pdGlhbFBvc2l0aW9uKTsKLSAgICAgIHN0cmVhbSA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIENvZGVkT3V0cHV0U3RyZWFtIHN0cmVhbSgpIHsKLSAgICAgIHJldHVybiBzdHJlYW07Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKLSAgICAgIEJ5dGVCdWZmZXIgZHVwID0gYnVmZmVyLmR1cGxpY2F0ZSgpOwotICAgICAgZHVwLnBvc2l0aW9uKGluaXRpYWxQb3NpdGlvbik7Ci0gICAgICBkdXAubGltaXQoYnVmZmVyLnBvc2l0aW9uKCkpOwotCi0gICAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtkdXAucmVtYWluaW5nKCldOwotICAgICAgZHVwLmdldChieXRlcyk7Ci0gICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE91dHB1dFR5cGUgZ2V0T3V0cHV0VHlwZSgpIHsKLSAgICAgIHJldHVybiBPdXRwdXRUeXBlLk5JT19ESVJFQ1Q7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBlbnVtIE91dHB1dFR5cGUgewotICAgIEFSUkFZKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBDb2RlciBuZXdDb2RlcihpbnQgc2l6ZSkgewotICAgICAgICByZXR1cm4gbmV3IEFycmF5Q29kZXIoc2l6ZSk7Ci0gICAgICB9Ci0gICAgfSwKLSAgICBOSU9fSEVBUCgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgQ29kZXIgbmV3Q29kZXIoaW50IHNpemUpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBOaW9IZWFwQ29kZXIoc2l6ZSk7Ci0gICAgICB9Ci0gICAgfSwKLSAgICBOSU9fRElSRUNUKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBDb2RlciBuZXdDb2RlcihpbnQgc2l6ZSkgewotICAgICAgICByZXR1cm4gbmV3IE5pb0RpcmVjdENvZGVyKHNpemUpOwotICAgICAgfQotICAgIH0sCi0gICAgU1RSRUFNKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBDb2RlciBuZXdDb2RlcihpbnQgc2l6ZSkgewotICAgICAgICByZXR1cm4gbmV3IE91dHB1dFN0cmVhbUNvZGVyKHNpemUpOwotICAgICAgfQotICAgIH07Ci0KLSAgICBhYnN0cmFjdCBDb2RlciBuZXdDb2RlcihpbnQgc2l6ZSk7Ci0gIH0KLQotICAvKiogQ2hlY2tzIHRoYXQgaW52YXJpYW50cyBhcmUgbWFpbnRhaW5lZCBmb3IgdmFyaW50IHJvdW5kIHRyaXAgaW5wdXQgYW5kIG91dHB1dC4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFZhcmludFJvdW5kVHJpcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmb3IgKE91dHB1dFR5cGUgb3V0cHV0VHlwZSA6IE91dHB1dFR5cGUudmFsdWVzKCkpIHsKLSAgICAgIGFzc2VydFZhcmludFJvdW5kVHJpcChvdXRwdXRUeXBlLCAwTCk7Ci0gICAgICBmb3IgKGludCBiaXRzID0gMDsgYml0cyA8IDY0OyBiaXRzKyspIHsKLSAgICAgICAgbG9uZyB2YWx1ZSA9IDFMIDw8IGJpdHM7Ci0gICAgICAgIGFzc2VydFZhcmludFJvdW5kVHJpcChvdXRwdXRUeXBlLCB2YWx1ZSk7Ci0gICAgICAgIGFzc2VydFZhcmludFJvdW5kVHJpcChvdXRwdXRUeXBlLCB2YWx1ZSArIDEpOwotICAgICAgICBhc3NlcnRWYXJpbnRSb3VuZFRyaXAob3V0cHV0VHlwZSwgdmFsdWUgLSAxKTsKLSAgICAgICAgYXNzZXJ0VmFyaW50Um91bmRUcmlwKG91dHB1dFR5cGUsIC12YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqIFRlc3RzIHdyaXRlUmF3VmFyaW50MzIoKSBhbmQgd3JpdGVSYXdWYXJpbnQ2NCgpLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRXcml0ZVZhcmludChieXRlcygweDAwKSwgMCk7Ci0gICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHgwMSksIDEpOwotICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4N2YpLCAxMjcpOwotICAgIC8vIDE0ODgyCi0gICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHhhMiwgMHg3NCksICgweDIyIDw8IDApIHwgKDB4NzQgPDwgNykpOwotICAgIC8vIDI5NjE0ODg4MzAKLSAgICBhc3NlcnRXcml0ZVZhcmludCgKLSAgICAgICAgYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCi0gICAgICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfCAoMHgwYkwgPDwgMjgpKTsKLQotICAgIC8vIDY0LWJpdAotICAgIC8vIDcyNTY0NTYxMjYKLSAgICBhc3NlcnRXcml0ZVZhcmludCgKLSAgICAgICAgYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYiksCi0gICAgICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfCAoMHgxYkwgPDwgMjgpKTsKLSAgICAvLyA0MTI1NjIwMjU4MDcxODMzNgotICAgIGFzc2VydFdyaXRlVmFyaW50KAotICAgICAgICBieXRlcygweDgwLCAweGU2LCAweGViLCAweDljLCAweGMzLCAweGM5LCAweGE0LCAweDQ5KSwKLSAgICAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8ICgweDQzTCA8PCAyOCkgfCAoMHg0OUwgPDwgMzUpCi0gICAgICAgIHwgKDB4MjRMIDw8IDQyKSB8ICgweDQ5TCA8PCA0OSkpOwotICAgIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxCi0gICAgYXNzZXJ0V3JpdGVWYXJpbnQoCi0gICAgICAgIGJ5dGVzKDB4OWIsIDB4YTgsIDB4ZjksIDB4YzIsIDB4YmIsIDB4ZDYsIDB4ODAsIDB4ODUsIDB4YTYsIDB4MDEpLAotICAgICAgICAoMHgxYiA8PCAwKSB8ICgweDI4IDw8IDcpIHwgKDB4NzkgPDwgMTQpIHwgKDB4NDIgPDwgMjEpIHwgKDB4M2JMIDw8IDI4KSB8ICgweDU2TCA8PCAzNSkKLSAgICAgICAgfCAoMHgwMEwgPDwgNDIpIHwgKDB4MDVMIDw8IDQ5KSB8ICgweDI2TCA8PCA1NikgfCAoMHgwMUwgPDwgNjMpKTsKLSAgfQotCi0gIC8qKiBUZXN0cyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFdyaXRlTGl0dGxlRW5kaWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyKSwgMHgxMjM0NTY3OCk7Ci0gICAgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlcygweGYwLCAweGRlLCAweGJjLCAweDlhKSwgMHg5YWJjZGVmMCk7Ci0KLSAgICBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KAotICAgICAgICBieXRlcygweGYwLCAweGRlLCAweGJjLCAweDlhLCAweDc4LCAweDU2LCAweDM0LCAweDEyKSwgMHgxMjM0NTY3ODlhYmNkZWYwTCk7Ci0gICAgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW42NCgKLSAgICAgICAgYnl0ZXMoMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksIDB4OWFiY2RlZjAxMjM0NTY3OEwpOwotICB9Ci0KLSAgLyoqIFRlc3QgZW5jb2RlWmlnWmFnMzIoKSBhbmQgZW5jb2RlWmlnWmFnNjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdEVuY29kZVppZ1phZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscygwLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKC0xKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoLTIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoMHgzRkZGRkZGRikpOwotICAgIGFzc2VydEVxdWFscygweDdGRkZGRkZGLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigweEMwMDAwMDAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkUsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRiwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoMHg4MDAwMDAwMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoLTEpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMSkpOwotICAgIGFzc2VydEVxdWFscygzLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgtMikpOwotICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwN0ZGRkZGRkVMLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweDAwMDAwMDAwM0ZGRkZGRkZMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAwMDA3RkZGRkZGRkwsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4RkZGRkZGRkZDMDAwMDAwMEwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMEZGRkZGRkZFTCwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZGTCkpOwotICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwRkZGRkZGRkZMLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweEZGRkZGRkZGODAwMDAwMDBMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkZGRkZGRkZGRUwsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4N0ZGRkZGRkZGRkZGRkZGRkwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRkZGRkZGRkZGTCwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHg4MDAwMDAwMDAwMDAwMDAwTCkpOwotCi0gICAgLy8gU29tZSBlYXNpZXItdG8tdmVyaWZ5IHJvdW5kLXRyaXAgdGVzdHMuICBUaGUgaW5wdXRzIChvdGhlciB0aGFuIDAsIDEsIC0xKQotICAgIC8vIHdlcmUgY2hvc2VuIHNlbWktcmFuZG9tbHkgdmlhIGtleWJvYXJkIGJhc2hpbmcuCi0gICAgYXNzZXJ0RXF1YWxzKDAsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigxKSkpOwotICAgIGFzc2VydEVxdWFscygtMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigtMSkpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTQ5MjcsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMTQ5MjcpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0zNjEyLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMihDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKC0zNjEyKSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgxKSkpOwotICAgIGFzc2VydEVxdWFscygtMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgtMSkpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTQ5MjcsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMTQ5MjcpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0zNjEyLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KC0zNjEyKSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICA4NTY5MTIzMDQ4MDE0MTZMLAotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDg1NjkxMjMwNDgwMTQxNkwpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAtNzUxMjM5MDU0Mzk1NzEyNTZMLAotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KC03NTEyMzkwNTQzOTU3MTI1NkwpKSk7Ci0gIH0KLQotICAvKiogVGVzdHMgd3JpdGluZyBhIHdob2xlIG1lc3NhZ2Ugd2l0aCBldmVyeSBmaWVsZCB0eXBlLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaG9sZU1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBieXRlW10gZXhwZWN0ZWRCeXRlcyA9IFRlc3RVdGlsLmdldEdvbGRlbk1lc3NhZ2UoKS50b0J5dGVBcnJheSgpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0KLSAgICBmb3IgKE91dHB1dFR5cGUgb3V0cHV0VHlwZSA6IE91dHB1dFR5cGUudmFsdWVzKCkpIHsKLSAgICAgIENvZGVyIGNvZGVyID0gb3V0cHV0VHlwZS5uZXdDb2RlcihtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgICAgbWVzc2FnZS53cml0ZVRvKGNvZGVyLnN0cmVhbSgpKTsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICBieXRlW10gcmF3Qnl0ZXMgPSBjb2Rlci50b0J5dGVBcnJheSgpOwotICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhvdXRwdXRUeXBlLCBleHBlY3RlZEJ5dGVzLCByYXdCeXRlcyk7Ci0gICAgfQotCi0gICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPCAyNTY7IGJsb2NrU2l6ZSAqPSAyKSB7Ci0gICAgICBDb2RlciBjb2RlciA9IE91dHB1dFR5cGUuU1RSRUFNLm5ld0NvZGVyKGJsb2NrU2l6ZSk7Ci0gICAgICBtZXNzYWdlLndyaXRlVG8oY29kZXIuc3RyZWFtKCkpOwotICAgICAgY29kZXIuc3RyZWFtKCkuZmx1c2goKTsKLSAgICAgIGFzc2VydEVxdWFsQnl0ZXMoT3V0cHV0VHlwZS5TVFJFQU0sIGV4cGVjdGVkQnl0ZXMsIGNvZGVyLnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB3cml0aW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IHBhY2tlZCBmaWVsZCB0eXBlLiBFbnN1cmVzIHRoZQotICAgKiB3aXJlIGZvcm1hdCBvZiBwYWNrZWQgZmllbGRzIGlzIGNvbXBhdGlibGUgd2l0aCBDKysuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaG9sZVBhY2tlZEZpZWxkc01lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBieXRlW10gZXhwZWN0ZWRCeXRlcyA9IFRlc3RVdGlsLmdldEdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2UoKS50b0J5dGVBcnJheSgpOwotICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7Ci0KLSAgICBmb3IgKE91dHB1dFR5cGUgb3V0cHV0VHlwZSA6IE91dHB1dFR5cGUudmFsdWVzKCkpIHsKLSAgICAgIENvZGVyIGNvZGVyID0gb3V0cHV0VHlwZS5uZXdDb2RlcihtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgICAgbWVzc2FnZS53cml0ZVRvKGNvZGVyLnN0cmVhbSgpKTsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICBieXRlW10gcmF3Qnl0ZXMgPSBjb2Rlci50b0J5dGVBcnJheSgpOwotICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhvdXRwdXRUeXBlLCBleHBlY3RlZEJ5dGVzLCByYXdCeXRlcyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3Qgd3JpdGluZyBhIG1lc3NhZ2UgY29udGFpbmluZyBhIG5lZ2F0aXZlIGVudW0gdmFsdWUuIFRoaXMgdXNlZCB0bwotICAgKiBmYWlsIGJlY2F1c2UgdGhlIHNpemUgd2FzIG5vdCBwcm9wZXJseSBjb21wdXRlZCBhcyBhIHNpZ24tZXh0ZW5kZWQgdmFyaW50LgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFdyaXRlTWVzc2FnZVdpdGhOZWdhdGl2ZUVudW1WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFNwYXJzZUVudW1NZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgICBTcGFyc2VFbnVtTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0U3BhcnNlRW51bShUZXN0U3BhcnNlRW51bS5TUEFSU0VfRSkuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0U3BhcnNlRW51bSgpLmdldE51bWJlcigpIDwgMCk7Ci0gICAgZm9yIChPdXRwdXRUeXBlIG91dHB1dFR5cGUgOiBPdXRwdXRUeXBlLnZhbHVlcygpKSB7Ci0gICAgICBDb2RlciBjb2RlciA9IG91dHB1dFR5cGUubmV3Q29kZXIobWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICAgIG1lc3NhZ2Uud3JpdGVUbyhjb2Rlci5zdHJlYW0oKSk7Ci0gICAgICBjb2Rlci5zdHJlYW0oKS5mbHVzaCgpOwotICAgICAgYnl0ZVtdIHJhd0J5dGVzID0gY29kZXIudG9CeXRlQXJyYXkoKTsKLSAgICAgIFNwYXJzZUVudW1NZXNzYWdlIG1lc3NhZ2UyID0gU3BhcnNlRW51bU1lc3NhZ2UucGFyc2VGcm9tKHJhd0J5dGVzKTsKLSAgICAgIGFzc2VydEVxdWFscyhUZXN0U3BhcnNlRW51bS5TUEFSU0VfRSwgbWVzc2FnZTIuZ2V0U3BhcnNlRW51bSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKiogVGVzdCBnZXRUb3RhbEJ5dGVzV3JpdHRlbigpICovCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRUb3RhbEJ5dGVzV3JpdHRlbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIENvZGVyIGNvZGVyID0gT3V0cHV0VHlwZS5TVFJFQU0ubmV3Q29kZXIoNCAqIDEwMjQpOwotCi0gICAgLy8gV3JpdGUgc29tZSBzb21lIGJ5dGVzIChtb3JlIHRoYW4gdGhlIGJ1ZmZlciBjYW4gaG9sZCkgYW5kIHZlcmlmeSB0aGF0IHRvdGFsV3JpdHRlbgotICAgIC8vIGlzIGNvcnJlY3QuCi0gICAgYnl0ZVtdIHZhbHVlID0gImFiY2RlIi5nZXRCeXRlcyhJbnRlcm5hbC5VVEZfOCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyArK2kpIHsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlUmF3Qnl0ZXModmFsdWUsIDAsIHZhbHVlLmxlbmd0aCk7Ci0gICAgfQotICAgIGFzc2VydEVxdWFscyh2YWx1ZS5sZW5ndGggKiAxMDI0LCBjb2Rlci5zdHJlYW0oKS5nZXRUb3RhbEJ5dGVzV3JpdHRlbigpKTsKLQotICAgIC8vIE5vdyB3cml0ZSBhbiBlbmNvZGVkIHN0cmluZy4KLSAgICBTdHJpbmcgc3RyaW5nID0KLSAgICAgICAgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6YWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5eiI7Ci0gICAgLy8gRW5zdXJlIHdlIHRha2UgdGhlIHNsb3dlciBmYXN0IHBhdGguCi0gICAgYXNzZXJ0VHJ1ZShDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVUludDMyU2l6ZU5vVGFnKHN0cmluZy5sZW5ndGgoKSkKLSAgICAgICAgIT0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQzMlNpemVOb1RhZyhzdHJpbmcubGVuZ3RoKCkgKiBVdGY4Lk1BWF9CWVRFU19QRVJfQ0hBUikpOwotCi0gICAgY29kZXIuc3RyZWFtKCkud3JpdGVTdHJpbmdOb1RhZyhzdHJpbmcpOwotICAgIGludCBzdHJpbmdTaXplID0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVN0cmluZ1NpemVOb1RhZyhzdHJpbmcpOwotCi0gICAgLy8gVmVyaWZ5IHRoYXQgdGhlIHRvdGFsIGJ5dGVzIHdyaXR0ZW4gaXMgY29ycmVjdAotICAgIGFzc2VydEVxdWFscygodmFsdWUubGVuZ3RoICogMTAyNCkgKyBzdHJpbmdTaXplLCBjb2Rlci5zdHJlYW0oKS5nZXRUb3RhbEJ5dGVzV3JpdHRlbigpKTsKLSAgfQotCi0gIC8vIFRPRE8oZHdlaXMpOiBXcml0ZSBhIGNvbXByZWhlbnNpdmUgdGVzdCBzdWl0ZSBmb3IgQ29kZWRPdXRwdXRTdHJlYW0gdGhhdCBjb3ZlcnMgbW9yZSB0aGFuIGp1c3QKLSAgLy8gICAgdGhpcyBjYXNlLgotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVTdHJpbmdOb1RhZ19mYXN0cGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGludCBidWZmZXJTaXplID0gMTUzOwotICAgIFN0cmluZyB0aHJlZUJ5dGVzUGVyID0gIlx1MDk4MSI7Ci0gICAgU3RyaW5nIHN0cmluZyA9IHRocmVlQnl0ZXNQZXI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0gICAgICBzdHJpbmcgKz0gdGhyZWVCeXRlc1BlcjsKLSAgICB9Ci0gICAgLy8gVGhlc2UgY2hlY2tzIGVuc3VyZSB3ZSB3aWxsIHRpY2tsZSB0aGUgc2xvd2VyIGZhc3QgcGF0aC4KLSAgICBhc3NlcnRFcXVhbHMoMSwgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQzMlNpemVOb1RhZyhzdHJpbmcubGVuZ3RoKCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDIsIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVVSW50MzJTaXplTm9UYWcoc3RyaW5nLmxlbmd0aCgpICogVXRmOC5NQVhfQllURVNfUEVSX0NIQVIpKTsKLSAgICBhc3NlcnRFcXVhbHMoYnVmZmVyU2l6ZSwgc3RyaW5nLmxlbmd0aCgpICogVXRmOC5NQVhfQllURVNfUEVSX0NIQVIpOwotCi0gICAgZm9yIChPdXRwdXRUeXBlIG91dHB1dFR5cGUgOiBPdXRwdXRUeXBlLnZhbHVlcygpKSB7Ci0gICAgICBDb2RlciBjb2RlciA9IG91dHB1dFR5cGUubmV3Q29kZXIoYnVmZmVyU2l6ZSArIDIpOwotICAgICAgY29kZXIuc3RyZWFtKCkud3JpdGVTdHJpbmdOb1RhZyhzdHJpbmcpOwotICAgICAgY29kZXIuc3RyZWFtKCkuZmx1c2goKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb0J5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSA9IDE2ICogMTAyNDsKLSAgICBCeXRlQnVmZmVyIGJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoYnVmZmVyU2l6ZSk7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRTdHJlYW0gPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShidWZmZXIpOwotICAgIC8vIFdyaXRlIHJhdyBieXRlcyBpbnRvIHRoZSBCeXRlQnVmZmVyLgotICAgIGZpbmFsIGludCBsZW5ndGgxID0gNTAwMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDE7IGkrKykgewotICAgICAgY29kZWRTdHJlYW0ud3JpdGVSYXdCeXRlKChieXRlKSAxKTsKLSAgICB9Ci0gICAgZmluYWwgaW50IGxlbmd0aDIgPSA4ICogMTAyNDsKLSAgICBieXRlW10gZGF0YSA9IG5ldyBieXRlW2xlbmd0aDJdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbGVuZ3RoMjsgaSsrKSB7Ci0gICAgICBkYXRhW2ldID0gKGJ5dGUpIDI7Ci0gICAgfQotICAgIGNvZGVkU3RyZWFtLndyaXRlUmF3Qnl0ZXMoZGF0YSk7Ci0gICAgZmluYWwgaW50IGxlbmd0aDMgPSBidWZmZXJTaXplIC0gbGVuZ3RoMSAtIGxlbmd0aDI7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW5ndGgzOyBpKyspIHsKLSAgICAgIGNvZGVkU3RyZWFtLndyaXRlUmF3Qnl0ZSgoYnl0ZSkgMyk7Ci0gICAgfQotICAgIGNvZGVkU3RyZWFtLmZsdXNoKCk7Ci0KLSAgICAvLyBDaGVjayB0aGF0IGRhdGEgaXMgY29ycmVjdGx5IHdyaXR0ZW4gdG8gdGhlIEJ5dGVCdWZmZXIuCi0gICAgYXNzZXJ0RXF1YWxzKDAsIGJ1ZmZlci5yZW1haW5pbmcoKSk7Ci0gICAgYnVmZmVyLmZsaXAoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDE7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKChieXRlKSAxLCBidWZmZXIuZ2V0KCkpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDI7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKChieXRlKSAyLCBidWZmZXIuZ2V0KCkpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbmd0aDM7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKChieXRlKSAzLCBidWZmZXIuZ2V0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZUJ5dGVCdWZmZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBieXRlW10gdmFsdWUgPSAiYWJjZGUiLmdldEJ5dGVzKEludGVybmFsLlVURl84KTsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkU3RyZWFtID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2Uob3V0cHV0U3RyZWFtKTsKLSAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBCeXRlQnVmZmVyLndyYXAodmFsdWUsIDAsIDEpOwotICAgIC8vIFRoaXMgd2lsbCBhY3R1YWxseSB3cml0ZSA1IGJ5dGVzIGludG8gdGhlIENvZGVkT3V0cHV0U3RyZWFtIGFzIHRoZQotICAgIC8vIEJ5dGVCdWZmZXIncyBjYXBhY2l0eSgpIGlzIDUuCi0gICAgY29kZWRTdHJlYW0ud3JpdGVSYXdCeXRlcyhieXRlQnVmZmVyKTsKLSAgICAvLyBUaGUgYWJvdmUgY2FsbCBzaG91bGRuJ3QgYWZmZWN0IHRoZSBCeXRlQnVmZmVyJ3Mgc3RhdGUuCi0gICAgYXNzZXJ0RXF1YWxzKDAsIGJ5dGVCdWZmZXIucG9zaXRpb24oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ5dGVCdWZmZXIubGltaXQoKSk7Ci0KLSAgICAvLyBUaGUgY29ycmVjdCB3YXkgdG8gd3JpdGUgcGFydCBvZiBhbiBhcnJheSB1c2luZyBCeXRlQnVmZmVyLgotICAgIGNvZGVkU3RyZWFtLndyaXRlUmF3Qnl0ZXMoQnl0ZUJ1ZmZlci53cmFwKHZhbHVlLCAyLCAxKS5zbGljZSgpKTsKLQotICAgIGNvZGVkU3RyZWFtLmZsdXNoKCk7Ci0gICAgYnl0ZVtdIHJlc3VsdCA9IG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpOwotICAgIGFzc2VydEVxdWFscyg2LCByZXN1bHQubGVuZ3RoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlW2ldLCByZXN1bHRbaV0pOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHModmFsdWVbMl0sIHJlc3VsdFs1XSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVCeXRlQXJyYXlXaXRoT2Zmc2V0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGJ5dGVbXSBmdWxsQXJyYXkgPSBieXRlcygweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4KTsKLSAgICBieXRlW10gZGVzdGluYXRpb24gPSBuZXcgYnl0ZVs0XTsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZFN0cmVhbSA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKGRlc3RpbmF0aW9uKTsKLSAgICBjb2RlZFN0cmVhbS53cml0ZUJ5dGVBcnJheU5vVGFnKGZ1bGxBcnJheSwgMiwgMik7Ci0gICAgYXNzZXJ0RXF1YWxCeXRlcyhPdXRwdXRUeXBlLkFSUkFZLCBieXRlcygweDAyLCAweDMzLCAweDQ0LCAweDAwKSwgZGVzdGluYXRpb24pOwotICAgIGFzc2VydEVxdWFscygzLCBjb2RlZFN0cmVhbS5nZXRUb3RhbEJ5dGVzV3JpdHRlbigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVVdGY4X011bHRpcGxlU21hbGxXcml0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBTdHJpbmcgc291cmNlID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLQotICAgIC8vIEdlbmVyYXRlIHRoZSBleHBlY3RlZCBvdXRwdXQgaWYgdGhlIHNvdXJjZSBzdHJpbmcgaXMgd3JpdHRlbiAyIGJ5dGVzIGF0IGEgdGltZS4KLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gZXhwZWN0ZWRCeXRlc1N0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCBzb3VyY2UubGVuZ3RoKCk7IHBvcyArPSAyKSB7Ci0gICAgICBTdHJpbmcgc3Vic3RyID0gc291cmNlLnN1YnN0cmluZyhwb3MsIHBvcyArIDIpOwotICAgICAgZXhwZWN0ZWRCeXRlc1N0cmVhbS53cml0ZSgyKTsKLSAgICAgIGV4cGVjdGVkQnl0ZXNTdHJlYW0ud3JpdGUoc3Vic3RyLmdldEJ5dGVzKEludGVybmFsLlVURl84KSk7Ci0gICAgfQotICAgIGZpbmFsIGJ5dGVbXSBleHBlY3RlZEJ5dGVzID0gZXhwZWN0ZWRCeXRlc1N0cmVhbS50b0J5dGVBcnJheSgpOwotCi0gICAgLy8gRm9yIGVhY2ggb3V0cHV0IHR5cGUsIHdyaXRlIHRoZSBzb3VyY2Ugc3RyaW5nIDIgYnl0ZXMgYXQgYSB0aW1lIGFuZCB2ZXJpZnkgdGhlIG91dHB1dC4KLSAgICBmb3IgKE91dHB1dFR5cGUgb3V0cHV0VHlwZSA6IE91dHB1dFR5cGUudmFsdWVzKCkpIHsKLSAgICAgIENvZGVyIGNvZGVyID0gb3V0cHV0VHlwZS5uZXdDb2RlcihleHBlY3RlZEJ5dGVzLmxlbmd0aCk7Ci0gICAgICBmb3IgKGludCBwb3MgPSAwOyBwb3MgPCBzb3VyY2UubGVuZ3RoKCk7IHBvcyArPSAyKSB7Ci0gICAgICAgIFN0cmluZyBzdWJzdHIgPSBzb3VyY2Uuc3Vic3RyaW5nKHBvcywgcG9zICsgMik7Ci0gICAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlU3RyaW5nTm9UYWcoc3Vic3RyKTsKLSAgICAgIH0KLSAgICAgIGNvZGVyLnN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICBhc3NlcnRFcXVhbEJ5dGVzKG91dHB1dFR5cGUsIGV4cGVjdGVkQnl0ZXMsIGNvZGVyLnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVJbnZhbGlkVXRmOCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN0cmluZ1tdIGludmFsaWRTdHJpbmdzID0gbmV3IFN0cmluZ1tdIHtuZXdTdHJpbmcoQ2hhcmFjdGVyLk1JTl9ISUdIX1NVUlJPR0FURSksCi0gICAgICAgICJmb29iYXIiICsgbmV3U3RyaW5nKENoYXJhY3Rlci5NSU5fSElHSF9TVVJST0dBVEUpLCBuZXdTdHJpbmcoQ2hhcmFjdGVyLk1JTl9MT1dfU1VSUk9HQVRFKSwKLSAgICAgICAgImZvb2JhciIgKyBuZXdTdHJpbmcoQ2hhcmFjdGVyLk1JTl9MT1dfU1VSUk9HQVRFKSwKLSAgICAgICAgbmV3U3RyaW5nKENoYXJhY3Rlci5NSU5fSElHSF9TVVJST0dBVEUsIENoYXJhY3Rlci5NSU5fSElHSF9TVVJST0dBVEUpfTsKLQotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dFdpdGhTdHJlYW0gPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCkpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dFdpdGhBcnJheSA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG5ldyBieXRlWzEwMDAwXSk7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0V2l0aEJ5dGVCdWZmZXIgPQotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShCeXRlQnVmZmVyLmFsbG9jYXRlKDEwMDAwKSk7Ci0gICAgZm9yIChTdHJpbmcgcyA6IGludmFsaWRTdHJpbmdzKSB7Ci0gICAgICAvLyBUT0RPKGR3ZWlzKTogVGhlc2Ugc2hvdWxkIGFsbCBmYWlsOyBpbnN0ZWFkIHRoZXkgYXJlIGNvcnJ1cHRpbmcgZGF0YS4KLSAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVTdHJpbmdTaXplTm9UYWcocyk7Ci0gICAgICBvdXRwdXRXaXRoU3RyZWFtLndyaXRlU3RyaW5nTm9UYWcocyk7Ci0gICAgICBvdXRwdXRXaXRoQXJyYXkud3JpdGVTdHJpbmdOb1RhZyhzKTsKLSAgICAgIG91dHB1dFdpdGhCeXRlQnVmZmVyLndyaXRlU3RyaW5nTm9UYWcocyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVE9ETyhuYXRoYW5taXR0bGVyKTogVGhpcyB0ZXN0IGNhbiBiZSBkZWxldGVkIG9uY2Ugd2UgcHJvcGVybHkgdGhyb3cgSU9FeGNlcHRpb24gd2hpbGUKLSAgLy8gZW5jb2RpbmcgaW52YWxpZCBVVEYtOCBzdHJpbmdzLgotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplSW52YWxpZFV0ZjhGb2xsb3dlZEJ5T3V0T2ZTcGFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIGludCBub3RFbm91Z2hCeXRlcyA9IDQ7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0V2l0aEFycmF5ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UobmV3IGJ5dGVbbm90RW5vdWdoQnl0ZXNdKTsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRXaXRoQnl0ZUJ1ZmZlciA9Ci0gICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKEJ5dGVCdWZmZXIuYWxsb2NhdGUobm90RW5vdWdoQnl0ZXMpKTsKLQotICAgIFN0cmluZyBpbnZhbGlkU3RyaW5nID0gbmV3U3RyaW5nKENoYXJhY3Rlci5NSU5fSElHSF9TVVJST0dBVEUsICdmJywgJ28nLCAnbycsICdiJywgJ2EnLCAncicpOwotICAgIHRyeSB7Ci0gICAgICBvdXRwdXRXaXRoQXJyYXkud3JpdGVTdHJpbmdOb1RhZyhpbnZhbGlkU3RyaW5nKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIE91dE9mU3BhY2VFeGNlcHRpb24iKTsKLSAgICB9IGNhdGNoIChPdXRPZlNwYWNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydFRydWUoZS5nZXRDYXVzZSgpIGluc3RhbmNlb2YgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbik7Ci0gICAgfQotICAgIHRyeSB7Ci0gICAgICBvdXRwdXRXaXRoQnl0ZUJ1ZmZlci53cml0ZVN0cmluZ05vVGFnKGludmFsaWRTdHJpbmcpOwotICAgICAgZmFpbCgiRXhwZWN0ZWQgT3V0T2ZTcGFjZUV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKE91dE9mU3BhY2VFeGNlcHRpb24gZSkgewotICAgICAgYXNzZXJ0VHJ1ZShlLmdldENhdXNlKCkgaW5zdGFuY2VvZiBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLQotICAvKiogUmVncmVzc2lvbiB0ZXN0IGZvciBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmL2lzc3Vlcy8yOTIgKi8KLSAgcHVibGljIHZvaWQgdGVzdENvcnJlY3RFeGNlcHRpb25UaHJvd1doZW5FbmNvZGluZ1N0cmluZ3NXaXRob3V0RW5vdWdoU3BhY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgdGVzdENhc2UgPSAiRm9vb29vb29vIjsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVVSW50MzJTaXplTm9UYWcodGVzdENhc2UubGVuZ3RoKCkpLAotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVUludDMyU2l6ZU5vVGFnKHRlc3RDYXNlLmxlbmd0aCgpICogMykpOwotICAgIGFzc2VydEVxdWFscygxMSwgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVN0cmluZ1NpemUoMSwgdGVzdENhc2UpKTsKLSAgICAvLyBUYWcgaXMgb25lIGJ5dGUsIHZhcmludCBkZXNjcmliaW5nIHN0cmluZyBsZW5ndGggaXMgMSBieXRlLCBzdHJpbmcgbGVuZ3RoIGlzIDkgYnl0ZXMuCi0gICAgLy8gQW4gYXJyYXkgb2Ygc2l6ZSAxIHdpbGwgY2F1c2UgYSBmYWlsdXJlIHdoZW4gdHJ5aW5nIHRvIHdyaXRlIHRoZSB2YXJpbnQuCi0gICAgZm9yIChPdXRwdXRUeXBlIG91dHB1dFR5cGUgOgotICAgICAgICBuZXcgT3V0cHV0VHlwZVtdIHtPdXRwdXRUeXBlLkFSUkFZLCBPdXRwdXRUeXBlLk5JT19IRUFQLCBPdXRwdXRUeXBlLk5JT19ESVJFQ1R9KSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IDExOyBpKyspIHsKLSAgICAgICAgQ29kZXIgY29kZXIgPSBvdXRwdXRUeXBlLm5ld0NvZGVyKGkpOwotICAgICAgICB0cnkgewotICAgICAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlU3RyaW5nKDEsIHRlc3RDYXNlKTsKLSAgICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gb3V0IG9mIHNwYWNlIGV4Y2VwdGlvbiIpOwotICAgICAgICB9IGNhdGNoIChDb2RlZE91dHB1dFN0cmVhbS5PdXRPZlNwYWNlRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RGlmZmVyZW50U3RyaW5nTGVuZ3RocygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3Qgc3RyaW5nIHNlcmlhbGl6YXRpb24gcm91bmR0cmlwIHVzaW5nIHN0cmluZ3Mgb2YgdGhlIGZvbGxvd2luZyBsZW5ndGhzLAotICAgIC8vIHdpdGggQVNDSUkgYW5kIFVuaWNvZGUgY2hhcmFjdGVycyByZXF1aXJpbmcgZGlmZmVyZW50IFVURi04IGJ5dGUgY291bnRzIHBlcgotICAgIC8vIGNoYXIsIGhlbmNlIGNhdXNpbmcgdGhlIGxlbmd0aCBkZWxpbWl0ZXIgdmFyaW50IHRvIHNvbWV0aW1lcyByZXF1aXJlIG1vcmUKLSAgICAvLyBieXRlcyBmb3IgdGhlIFVuaWNvZGUgc3RyaW5ncyB0aGFuIHRoZSBBU0NJSSBzdHJpbmcgb2YgdGhlIHNhbWUgbGVuZ3RoLgotICAgIGludFtdIGxlbmd0aHMgPSBuZXcgaW50W10gewotICAgICAgICAwLAotICAgICAgICAxLAotICAgICAgICAoMSA8PCA0KSAtIDEsIC8vIDEgYnl0ZSBmb3IgQVNDSUkgYW5kIFVuaWNvZGUKLSAgICAgICAgKDEgPDwgNykgLSAxLCAvLyAxIGJ5dGUgZm9yIEFTQ0lJLCAyIGJ5dGVzIGZvciBVbmljb2RlCi0gICAgICAgICgxIDw8IDExKSAtIDEsIC8vIDIgYnl0ZXMgZm9yIEFTQ0lJIGFuZCBVbmljb2RlCi0gICAgICAgICgxIDw8IDE0KSAtIDEsIC8vIDIgYnl0ZXMgZm9yIEFTQ0lJLCAzIGJ5dGVzIGZvciBVbmljb2RlCi0gICAgICAgICgxIDw8IDE3KSAtIDEsCi0gICAgICAgIC8vIDMgYnl0ZXMgZm9yIEFTQ0lJIGFuZCBVbmljb2RlCi0gICAgfTsKLSAgICBmb3IgKE91dHB1dFR5cGUgb3V0cHV0VHlwZSA6IE91dHB1dFR5cGUudmFsdWVzKCkpIHsKLSAgICAgIGZvciAoaW50IGkgOiBsZW5ndGhzKSB7Ci0gICAgICAgIHRlc3RFbmNvZGluZ09mU3RyaW5nKG91dHB1dFR5cGUsICdxJywgaSk7IC8vIDEgYnl0ZSBwZXIgY2hhcgotICAgICAgICB0ZXN0RW5jb2RpbmdPZlN0cmluZyhvdXRwdXRUeXBlLCAnXHUwN0ZGJywgaSk7IC8vIDIgYnl0ZXMgcGVyIGNoYXIKLSAgICAgICAgdGVzdEVuY29kaW5nT2ZTdHJpbmcob3V0cHV0VHlwZSwgJ1x1MDk4MScsIGkpOyAvLyAzIGJ5dGVzIHBlciBjaGFyCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5pb0VuY29kZXJzV2l0aEluaXRpYWxPZmZzZXRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIHZhbHVlID0gImFiYyI7Ci0gICAgZm9yIChDb2RlciBjb2RlciA6IG5ldyBDb2RlcltdIHtuZXcgTmlvSGVhcENvZGVyKDEwLCAyKSwgbmV3IE5pb0RpcmVjdENvZGVyKDEwLCAyKX0pIHsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlU3RyaW5nTm9UYWcodmFsdWUpOwotICAgICAgY29kZXIuc3RyZWFtKCkuZmx1c2goKTsKLSAgICAgIGFzc2VydEVxdWFsQnl0ZXMoY29kZXIuZ2V0T3V0cHV0VHlwZSgpLCBuZXcgYnl0ZVtdezMsICdhJywgJ2InLCAnYyd9LCBjb2Rlci50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIGNoZWNrcwotICAgKiB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFdyaXRlTGl0dGxlRW5kaWFuMzIoYnl0ZVtdIGRhdGEsIGludCB2YWx1ZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZm9yIChPdXRwdXRUeXBlIG91dHB1dFR5cGUgOiBPdXRwdXRUeXBlLnZhbHVlcygpKSB7Ci0gICAgICBDb2RlciBjb2RlciA9IG91dHB1dFR5cGUubmV3Q29kZXIoZGF0YS5sZW5ndGgpOwotICAgICAgY29kZXIuc3RyZWFtKCkud3JpdGVGaXhlZDMyTm9UYWcodmFsdWUpOwotICAgICAgY29kZXIuc3RyZWFtKCkuZmx1c2goKTsKLSAgICAgIGFzc2VydEVxdWFsQnl0ZXMob3V0cHV0VHlwZSwgZGF0YSwgY29kZXIudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotCi0gICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKSB7Ci0gICAgICBDb2RlciBjb2RlciA9IE91dHB1dFR5cGUuU1RSRUFNLm5ld0NvZGVyKGJsb2NrU2l6ZSk7Ci0gICAgICBjb2Rlci5zdHJlYW0oKS53cml0ZUZpeGVkMzJOb1RhZyh2YWx1ZSk7Ci0gICAgICBjb2Rlci5zdHJlYW0oKS5mbHVzaCgpOwotICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhPdXRwdXRUeXBlLlNUUkVBTSwgZGF0YSwgY29kZXIudG9CeXRlQXJyYXkoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MKLSAgICogdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmb3IgKE91dHB1dFR5cGUgb3V0cHV0VHlwZSA6IE91dHB1dFR5cGUudmFsdWVzKCkpIHsKLSAgICAgIENvZGVyIGNvZGVyID0gb3V0cHV0VHlwZS5uZXdDb2RlcihkYXRhLmxlbmd0aCk7Ci0gICAgICBjb2Rlci5zdHJlYW0oKS53cml0ZUZpeGVkNjROb1RhZyh2YWx1ZSk7Ci0gICAgICBjb2Rlci5zdHJlYW0oKS5mbHVzaCgpOwotICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhvdXRwdXRUeXBlLCBkYXRhLCBjb2Rlci50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0KLSAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKLSAgICAgIENvZGVyIGNvZGVyID0gT3V0cHV0VHlwZS5TVFJFQU0ubmV3Q29kZXIoYmxvY2tTaXplKTsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlKTsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICBhc3NlcnRFcXVhbEJ5dGVzKE91dHB1dFR5cGUuU1RSRUFNLCBkYXRhLCBjb2Rlci50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgbmV3U3RyaW5nKGNoYXIuLi4gY2hhcnMpIHsKLSAgICByZXR1cm4gbmV3IFN0cmluZyhjaGFycyk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIHRlc3RFbmNvZGluZ09mU3RyaW5nKE91dHB1dFR5cGUgb3V0cHV0VHlwZSwgY2hhciBjLCBpbnQgbGVuZ3RoKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGZ1bGxTdHJpbmcgPSBmdWxsU3RyaW5nKGMsIGxlbmd0aCk7Ci0gICAgVGVzdEFsbFR5cGVzIHRlc3RBbGxUeXBlcyA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxTdHJpbmcoZnVsbFN0cmluZykuYnVpbGQoKTsKLSAgICBDb2RlciBjb2RlciA9IG91dHB1dFR5cGUubmV3Q29kZXIodGVzdEFsbFR5cGVzLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIHRlc3RBbGxUeXBlcy53cml0ZVRvKGNvZGVyLnN0cmVhbSgpKTsKLSAgICBjb2Rlci5zdHJlYW0oKS5mbHVzaCgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIk91cHV0VHlwZTogIiArIG91dHB1dFR5cGUsCi0gICAgICAgIGZ1bGxTdHJpbmcsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oY29kZXIudG9CeXRlQXJyYXkoKSkuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZnVsbFN0cmluZyhjaGFyIGMsIGludCBsZW5ndGgpIHsKLSAgICBjaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLSAgICBBcnJheXMuZmlsbChyZXN1bHQsIGMpOwotICAgIHJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIGJ5dGUgYXJyYXkgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKLSAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycwotICAgKiBhYm91dCBwcmVjaXNpb24uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBieXRlW10gYnl0ZXMoaW50Li4uIGJ5dGVzQXNJbnRzKSB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzQXNJbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBieXRlc1tpXSA9IChieXRlKSBieXRlc0FzSW50c1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ5dGVzOwotICB9Ci0KLSAgLyoqIEFycmF5cy5hc0xpc3QoKSBkb2VzIG5vdCB3b3JrIHdpdGggYXJyYXlzIG9mIHByaW1pdGl2ZXMuICA6KCAqLwotICBwcml2YXRlIHN0YXRpYyBMaXN0PEJ5dGU+IHRvTGlzdChieXRlW10gYnl0ZXMpIHsKLSAgICBMaXN0PEJ5dGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZT4oKTsKLSAgICBmb3IgKGJ5dGUgYiA6IGJ5dGVzKSB7Ci0gICAgICByZXN1bHQuYWRkKGIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbEJ5dGVzKE91dHB1dFR5cGUgb3V0cHV0VHlwZSwgYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKG91dHB1dFR5cGUubmFtZSgpLCB0b0xpc3QoYSksIHRvTGlzdChiKSk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGVzIHRoZSBnaXZlbiB2YWx1ZSB1c2luZyB3cml0ZVJhd1ZhcmludDMyKCkgYW5kIHdyaXRlUmF3VmFyaW50NjQoKSBhbmQKLSAgICogY2hlY2tzIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiBieXRlcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZVtdIGRhdGEsIGxvbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZvciAoT3V0cHV0VHlwZSBvdXRwdXRUeXBlIDogT3V0cHV0VHlwZS52YWx1ZXMoKSkgewotICAgICAgLy8gT25seSB0ZXN0IDMyLWJpdCB3cml0ZSBpZiB0aGUgdmFsdWUgZml0cyBpbnRvIGFuIGludC4KLSAgICAgIGlmICh2YWx1ZSA9PSAoaW50KSB2YWx1ZSkgewotICAgICAgICBDb2RlciBjb2RlciA9IG91dHB1dFR5cGUubmV3Q29kZXIoMTApOwotICAgICAgICBjb2Rlci5zdHJlYW0oKS53cml0ZVVJbnQzMk5vVGFnKChpbnQpIHZhbHVlKTsKLSAgICAgICAgY29kZXIuc3RyZWFtKCkuZmx1c2goKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhvdXRwdXRUeXBlLCBkYXRhLCBjb2Rlci50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICAvLyBBbHNvIHRyeSBjb21wdXRpbmcgc2l6ZS4KLSAgICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLCBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlVUludDMyU2l6ZU5vVGFnKChpbnQpIHZhbHVlKSk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgQ29kZXIgY29kZXIgPSBvdXRwdXRUeXBlLm5ld0NvZGVyKDEwKTsKLSAgICAgICAgY29kZXIuc3RyZWFtKCkud3JpdGVVSW50NjROb1RhZyh2YWx1ZSk7Ci0gICAgICAgIGNvZGVyLnN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFsQnl0ZXMob3V0cHV0VHlwZSwgZGF0YSwgY29kZXIudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgICAgLy8gQWxzbyB0cnkgY29tcHV0aW5nIHNpemUuCi0gICAgICAgIGFzc2VydEVxdWFscyhkYXRhLmxlbmd0aCwgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyh2YWx1ZSkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCi0gICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikgewotICAgICAgLy8gT25seSB0ZXN0IDMyLWJpdCB3cml0ZSBpZiB0aGUgdmFsdWUgZml0cyBpbnRvIGFuIGludC4KLSAgICAgIGlmICh2YWx1ZSA9PSAoaW50KSB2YWx1ZSkgewotICAgICAgICBDb2RlciBjb2RlciA9IE91dHB1dFR5cGUuU1RSRUFNLm5ld0NvZGVyKGJsb2NrU2l6ZSk7Ci0gICAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlVUludDY0Tm9UYWcoKGludCkgdmFsdWUpOwotICAgICAgICBjb2Rlci5zdHJlYW0oKS5mbHVzaCgpOwotICAgICAgICBhc3NlcnRFcXVhbEJ5dGVzKE91dHB1dFR5cGUuU1RSRUFNLCBkYXRhLCBjb2Rlci50b0J5dGVBcnJheSgpKTsKLQotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7Ci0gICAgICAgIG91dHB1dC53cml0ZVVJbnQzMk5vVGFnKChpbnQpIHZhbHVlKTsKLSAgICAgICAgb3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFsQnl0ZXMoT3V0cHV0VHlwZS5TVFJFQU0sIGRhdGEsIHJhd091dHB1dC50b0J5dGVBcnJheSgpKTsKLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBDb2RlciBjb2RlciA9IE91dHB1dFR5cGUuU1RSRUFNLm5ld0NvZGVyKGJsb2NrU2l6ZSk7Ci0gICAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlVUludDY0Tm9UYWcodmFsdWUpOwotICAgICAgICBjb2Rlci5zdHJlYW0oKS5mbHVzaCgpOwotICAgICAgICBhc3NlcnRFcXVhbEJ5dGVzKE91dHB1dFR5cGUuU1RSRUFNLCBkYXRhLCBjb2Rlci50b0J5dGVBcnJheSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydFZhcmludFJvdW5kVHJpcChPdXRwdXRUeXBlIG91dHB1dFR5cGUsIGxvbmcgdmFsdWUpIHRocm93cyBFeGNlcHRpb24gewotICAgIHsKLSAgICAgIENvZGVyIGNvZGVyID0gb3V0cHV0VHlwZS5uZXdDb2RlcigxMCk7Ci0gICAgICBjb2Rlci5zdHJlYW0oKS53cml0ZVVJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLmZsdXNoKCk7Ci0gICAgICBieXRlW10gYnl0ZXMgPSBjb2Rlci50b0J5dGVBcnJheSgpOwotICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgIG91dHB1dFR5cGUubmFtZSgpLCBieXRlcy5sZW5ndGgsIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVVSW50NjRTaXplTm9UYWcodmFsdWUpKTsKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShieXRlcykpOwotICAgICAgYXNzZXJ0RXF1YWxzKG91dHB1dFR5cGUubmFtZSgpLCB2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDY0KCkpOwotICAgIH0KLQotICAgIGlmICh2YWx1ZSA9PSAoaW50KSB2YWx1ZSkgewotICAgICAgQ29kZXIgY29kZXIgPSBvdXRwdXRUeXBlLm5ld0NvZGVyKDEwKTsKLSAgICAgIGNvZGVyLnN0cmVhbSgpLndyaXRlVUludDMyTm9UYWcoKGludCkgdmFsdWUpOwotICAgICAgY29kZXIuc3RyZWFtKCkuZmx1c2goKTsKLSAgICAgIGJ5dGVbXSBieXRlcyA9IGNvZGVyLnRvQnl0ZUFycmF5KCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgb3V0cHV0VHlwZS5uYW1lKCksIGJ5dGVzLmxlbmd0aCwgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQzMlNpemVOb1RhZygoaW50KSB2YWx1ZSkpOwotICAgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMob3V0cHV0VHlwZS5uYW1lKCksIHZhbHVlLCBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKSk7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0RlcHJlY2F0ZWRGaWVsZFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVwcmVjYXRlZEZpZWxkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjZTg1YWUyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVwcmVjYXRlZEZpZWxkVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsODEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdERlcHJlY2F0ZWRGaWVsZHM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5Bbm5vdGF0ZWRFbGVtZW50OwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lk1ldGhvZDsKLQotLyoqCi0gKiBUZXN0IGZpZWxkIGRlcHJlY2F0aW9uCi0gKiAKLSAqIEBhdXRob3IgYmlyZG9AZ29vZ2xlLmNvbSAoUm9iZXJ0byBTY2FyYW11enppKQotICovCi1wdWJsaWMgY2xhc3MgRGVwcmVjYXRlZEZpZWxkVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBTdHJpbmdbXSBkZXByZWNhdGVkR2V0dGVyTmFtZXMgPSB7Ci0gICAgICAiaGFzRGVwcmVjYXRlZEludDMyIiwKLSAgICAgICJnZXREZXByZWNhdGVkSW50MzIifTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gZGVwcmVjYXRlZEJ1aWxkZXJHZXR0ZXJOYW1lcyA9IHsKLSAgICAgICJoYXNEZXByZWNhdGVkSW50MzIiLAotICAgICAgImdldERlcHJlY2F0ZWRJbnQzMiIsCi0gICAgICAiY2xlYXJEZXByZWNhdGVkSW50MzIifTsKLSAgCi0gIHByaXZhdGUgU3RyaW5nW10gZGVwcmVjYXRlZEJ1aWxkZXJTZXR0ZXJOYW1lcyA9IHsKLSAgICAgICJzZXREZXByZWNhdGVkSW50MzIifTsgCi0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RGVwcmVjYXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQ2xhc3M8Pz4gZGVwcmVjYXRlZEZpZWxkcyA9IFRlc3REZXByZWNhdGVkRmllbGRzLmNsYXNzOwotICAgIENsYXNzPD8+IGRlcHJlY2F0ZWRGaWVsZHNCdWlsZGVyID0gVGVzdERlcHJlY2F0ZWRGaWVsZHMuQnVpbGRlci5jbGFzczsKLSAgICBmb3IgKFN0cmluZyBuYW1lIDogZGVwcmVjYXRlZEdldHRlck5hbWVzKSB7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gZGVwcmVjYXRlZEZpZWxkcy5nZXRNZXRob2QobmFtZSk7Ci0gICAgICBhc3NlcnRUcnVlKCJNZXRob2QgIiArIG5hbWUgKyAiIHNob3VsZCBiZSBkZXByZWNhdGVkIiwKLSAgICAgICAgICBpc0RlcHJlY2F0ZWQobWV0aG9kKSk7Ci0gICAgfQotICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkZXByZWNhdGVkQnVpbGRlckdldHRlck5hbWVzKSB7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gZGVwcmVjYXRlZEZpZWxkc0J1aWxkZXIuZ2V0TWV0aG9kKG5hbWUpOwotICAgICAgYXNzZXJ0VHJ1ZSgiTWV0aG9kICIgKyBuYW1lICsgIiBzaG91bGQgYmUgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgaXNEZXByZWNhdGVkKG1ldGhvZCkpOwotICAgIH0KLSAgICBmb3IgKFN0cmluZyBuYW1lIDogZGVwcmVjYXRlZEJ1aWxkZXJTZXR0ZXJOYW1lcykgewotICAgICAgTWV0aG9kIG1ldGhvZCA9IGRlcHJlY2F0ZWRGaWVsZHNCdWlsZGVyLmdldE1ldGhvZChuYW1lLCBpbnQuY2xhc3MpOwotICAgICAgYXNzZXJ0VHJ1ZSgiTWV0aG9kICIgKyBuYW1lICsgIiBzaG91bGQgYmUgZGVwcmVjYXRlZCIsCi0gICAgICAgICAgaXNEZXByZWNhdGVkKG1ldGhvZCkpOwotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSBib29sZWFuIGlzRGVwcmVjYXRlZChBbm5vdGF0ZWRFbGVtZW50IGFubm90YXRlZCkgewotICAgIHJldHVybiBhbm5vdGF0ZWQuaXNBbm5vdGF0aW9uUHJlc2VudChEZXByZWNhdGVkLmNsYXNzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9yc1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVmODliMzguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9yc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDgwMCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90bzsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90bzsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90bzsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b3MuRmlsZURlc2NyaXB0b3JQcm90bzsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLk9uZW9mRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5Vbml0dGVzdEltcG9ydDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QuVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QuVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bUZvck1hcDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5UZXN0Q3VzdG9tT3B0aW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdEN1c3RvbU9wdGlvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXNlcnZlZEZpZWxkczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTZXJ2aWNlOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIERlc2NyaXB0b3JzfS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgY2xhc3MgRGVzY3JpcHRvcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYnVnIHdoZXJlIHJlZmVyZW5jaW5nIGEgRmllbGREZXNjcmlwdG9yLlR5cGUgdmFsdWUKLSAgLy8gYmVmb3JlIGEgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB2YWx1ZSB3b3VsZCB5aWVsZCBhCi0gIC8vIEV4Y2VwdGlvbkluSW5pdGlhbGl6ZXJFcnJvci4KLSAgQFN1cHByZXNzV2FybmluZ3MoInVudXNlZCIpCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIE9iamVjdCBTVEFUSUNfSU5JVF9URVNUID0gRmllbGREZXNjcmlwdG9yLlR5cGUuQk9PTDsKLQotICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRUeXBlRW51bU1hcHBpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUudmFsdWVzKCkubGVuZ3RoLAotICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLnZhbHVlcygpLmxlbmd0aCk7Ci0gICAgZm9yIChGaWVsZERlc2NyaXB0b3IuVHlwZSB0eXBlIDogRmllbGREZXNjcmlwdG9yLlR5cGUudmFsdWVzKCkpIHsKLSAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgcHJvdG9UeXBlID0gdHlwZS50b1Byb3RvKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoIlRZUEVfIiArIHR5cGUubmFtZSgpLCBwcm90b1R5cGUubmFtZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyh0eXBlLCBGaWVsZERlc2NyaXB0b3IuVHlwZS52YWx1ZU9mKHByb3RvVHlwZSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaWxlRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZpbGVEZXNjcmlwdG9yIGZpbGUgPSBVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKTsKLQotICAgIGFzc2VydEVxdWFscygiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIiwgZmlsZS5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscygicHJvdG9idWZfdW5pdHRlc3QiLCBmaWxlLmdldFBhY2thZ2UoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIlVuaXR0ZXN0UHJvdG8iLCBmaWxlLmdldE9wdGlvbnMoKS5nZXRKYXZhT3V0ZXJDbGFzc25hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iLAotICAgICAgICAgICAgICAgICBmaWxlLnRvUHJvdG8oKS5nZXROYW1lKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpKSwKLSAgICAgICAgICAgICAgICAgZmlsZS5nZXREZXBlbmRlbmNpZXMoKSk7Ci0KLSAgICBEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVR5cGUsIGZpbGUuZ2V0TWVzc2FnZVR5cGVzKCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVR5cGUsIGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJUZXN0QWxsVHlwZXMiKSk7Ci0gICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKLSAgICBhc3NlcnROdWxsKGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldE1lc3NhZ2VUeXBlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRNZXNzYWdlVHlwZXMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7Ci0gICAgfQotCi0gICAgRW51bURlc2NyaXB0b3IgZW51bVR5cGUgPSBGb3JlaWduRW51bS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVudW1UeXBlLCBmaWxlLmdldEVudW1UeXBlcygpLmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVudW1UeXBlLCBmaWxlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9yZWlnbkVudW0iKSk7Ci0gICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKLSAgICBhc3NlcnROdWxsKGZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChJbXBvcnRFbnVtLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJbXBvcnRFbnVtRm9yTWFwLmdldERlc2NyaXB0b3IoKSksCi0gICAgICAgICAgICAgICAgIFVuaXR0ZXN0SW1wb3J0LmdldERlc2NyaXB0b3IoKS5nZXRFbnVtVHlwZXMoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldEVudW1UeXBlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRFbnVtVHlwZXMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7Ci0gICAgfQotCi0gICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKTsKLSAgICBhc3NlcnRFcXVhbHMoc2VydmljZSwgZmlsZS5nZXRTZXJ2aWNlcygpLmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNlcnZpY2UsIGZpbGUuZmluZFNlcnZpY2VCeU5hbWUoIlRlc3RTZXJ2aWNlIikpOwotICAgIGFzc2VydE51bGwoZmlsZS5maW5kU2VydmljZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKLSAgICBhc3NlcnROdWxsKGZpbGUuZmluZFNlcnZpY2VCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlIikpOwotICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwKLSAgICAgICAgICAgICAgICAgVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpLmdldFNlcnZpY2VzKCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5nZXRTZXJ2aWNlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRTZXJ2aWNlcygpLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uID0KLSAgICAgIFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4dGVuc2lvbiwgZmlsZS5nZXRFeHRlbnNpb25zKCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICBmaWxlLmZpbmRFeHRlbnNpb25CeU5hbWUoIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIpKTsKLSAgICBhc3NlcnROdWxsKGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHQiKSk7Ci0gICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRFeHRlbnNpb25CeU5hbWUoCi0gICAgICAicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIikpOwotICAgIGFzc2VydEVxdWFscyhDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSwKLSAgICAgICAgICAgICAgICAgVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpLmdldEV4dGVuc2lvbnMoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldEV4dGVuc2lvbnMoKS5zaXplKCk7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKGksIGZpbGUuZ2V0RXh0ZW5zaW9ucygpLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIERlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIERlc2NyaXB0b3IgbmVzdGVkVHlwZSA9IFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLmdldERlc2NyaXB0b3IoKTsKLQotICAgIGFzc2VydEVxdWFscygiVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIsIG1lc3NhZ2VUeXBlLmdldEZ1bGxOYW1lKCkpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwgbWVzc2FnZVR5cGUuZ2V0RmlsZSgpKTsKLSAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmdldENvbnRhaW5pbmdUeXBlKCkpOwotICAgIGFzc2VydEVxdWFscyhEZXNjcmlwdG9yUHJvdG9zLk1lc3NhZ2VPcHRpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICBtZXNzYWdlVHlwZS5nZXRPcHRpb25zKCkpOwotICAgIGFzc2VydEVxdWFscygiVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUudG9Qcm90bygpLmdldE5hbWUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIk5lc3RlZE1lc3NhZ2UiLCBuZXN0ZWRUeXBlLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgIG5lc3RlZFR5cGUuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBuZXN0ZWRUeXBlLmdldEZpbGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VUeXBlLCBuZXN0ZWRUeXBlLmdldENvbnRhaW5pbmdUeXBlKCkpOwotCi0gICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gbWVzc2FnZVR5cGUuZ2V0RmllbGRzKCkuZ2V0KDApOwotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzIiLCBmaWVsZC5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscyhmaWVsZCwgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpKTsKLSAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgibm9fc3VjaF9maWVsZCIpKTsKLSAgICBhc3NlcnRFcXVhbHMoZmllbGQsIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKLSAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TnVtYmVyKDU3MTI4MykpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGUuZ2V0RmllbGRzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBtZXNzYWdlVHlwZS5nZXRGaWVsZHMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7Ci0gICAgfQotCi0gICAgYXNzZXJ0RXF1YWxzKG5lc3RlZFR5cGUsIG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVzKCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMobmVzdGVkVHlwZSwgbWVzc2FnZVR5cGUuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk5lc3RlZE1lc3NhZ2UiKSk7Ci0gICAgYXNzZXJ0TnVsbChtZXNzYWdlVHlwZS5maW5kTmVzdGVkVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBtZXNzYWdlVHlwZS5nZXROZXN0ZWRUeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLmdldERlc2NyaXB0b3IoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIG1lc3NhZ2VUeXBlLmdldEVudW1UeXBlcygpLmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVudW1UeXBlLCBtZXNzYWdlVHlwZS5maW5kRW51bVR5cGVCeU5hbWUoIk5lc3RlZEVudW0iKSk7Ci0gICAgYXNzZXJ0TnVsbChtZXNzYWdlVHlwZS5maW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZS5nZXRFbnVtVHlwZXMoKS5zaXplKCk7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKGksIG1lc3NhZ2VUeXBlLmdldEVudW1UeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RmllbGREZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRGVzY3JpcHRvciBtZXNzYWdlVHlwZSA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRmllbGREZXNjcmlwdG9yIHByaW1pdGl2ZUZpZWxkID0KLSAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgZW51bUZpZWxkID0KLSAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgbWVzc2FnZUZpZWxkID0KLSAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIik7Ci0gICAgRmllbGREZXNjcmlwdG9yIGNvcmRGaWVsZCA9Ci0gICAgICBtZXNzYWdlVHlwZS5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2NvcmQiKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgZXh0ZW5zaW9uID0KLSAgICAgIFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRmllbGREZXNjcmlwdG9yIG5lc3RlZEV4dGVuc2lvbiA9IFRlc3RSZXF1aXJlZC5zaW5nbGUuZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMiIsIHByaW1pdGl2ZUZpZWxkLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMub3B0aW9uYWxfaW50MzIiLAotICAgICAgICAgICAgICAgICBwcmltaXRpdmVGaWVsZC5nZXRGdWxsTmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgcHJpbWl0aXZlRmllbGQuZ2V0TnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlVHlwZSwgcHJpbWl0aXZlRmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBwcmltaXRpdmVGaWVsZC5nZXRGaWxlKCkpOwotICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS5JTlQzMiwgcHJpbWl0aXZlRmllbGQuZ2V0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLklOVCwgcHJpbWl0aXZlRmllbGQuZ2V0SmF2YVR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICBwcmltaXRpdmVGaWVsZC5nZXRPcHRpb25zKCkpOwotICAgIGFzc2VydEZhbHNlKHByaW1pdGl2ZUZpZWxkLmlzRXh0ZW5zaW9uKCkpOwotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzIiLCBwcmltaXRpdmVGaWVsZC50b1Byb3RvKCkuZ2V0TmFtZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfbmVzdGVkX2VudW0iLCBlbnVtRmllbGQuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuRU5VTSwgZW51bUZpZWxkLmdldFR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5FTlVNLCBlbnVtRmllbGQuZ2V0SmF2YVR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgZW51bUZpZWxkLmdldEVudW1UeXBlKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiLCBtZXNzYWdlRmllbGQuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSwgbWVzc2FnZUZpZWxkLmdldFR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFLCBtZXNzYWdlRmllbGQuZ2V0SmF2YVR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZvcmVpZ25NZXNzYWdlLmdldERlc2NyaXB0b3IoKSwgbWVzc2FnZUZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9jb3JkIiwgY29yZEZpZWxkLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5UeXBlLlNUUklORywgY29yZEZpZWxkLmdldFR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5TVFJJTkcsIGNvcmRGaWVsZC5nZXRKYXZhVHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuQ1R5cGUuQ09SRCwKLSAgICAgICAgICAgICAgICAgY29yZEZpZWxkLmdldE9wdGlvbnMoKS5nZXRDdHlwZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIiwgZXh0ZW5zaW9uLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24iLAotICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGV4dGVuc2lvbi5nZXROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldENvbnRhaW5pbmdUeXBlKCkpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwgZXh0ZW5zaW9uLmdldEZpbGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5UeXBlLklOVDMyLCBleHRlbnNpb24uZ2V0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLklOVCwgZXh0ZW5zaW9uLmdldEphdmFUeXBlKCkpOwotICAgIGFzc2VydEVxdWFscyhEZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmdldE9wdGlvbnMoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShleHRlbnNpb24uaXNFeHRlbnNpb24oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG51bGwsIGV4dGVuc2lvbi5nZXRFeHRlbnNpb25TY29wZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIsIGV4dGVuc2lvbi50b1Byb3RvKCkuZ2V0TmFtZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygic2luZ2xlIiwgbmVzdGVkRXh0ZW5zaW9uLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQuc2luZ2xlIiwKLSAgICAgICAgICAgICAgICAgbmVzdGVkRXh0ZW5zaW9uLmdldEZ1bGxOYW1lKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBuZXN0ZWRFeHRlbnNpb24uZ2V0RXh0ZW5zaW9uU2NvcGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RmllbGREZXNjcmlwdG9yTGFiZWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWVsZERlc2NyaXB0b3IgcmVxdWlyZWRGaWVsZCA9Ci0gICAgICBUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgiYSIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBvcHRpb25hbEZpZWxkID0KLSAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpOwotICAgIEZpZWxkRGVzY3JpcHRvciByZXBlYXRlZEZpZWxkID0KLSAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOwotCi0gICAgYXNzZXJ0VHJ1ZShyZXF1aXJlZEZpZWxkLmlzUmVxdWlyZWQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UocmVxdWlyZWRGaWVsZC5pc1JlcGVhdGVkKCkpOwotICAgIGFzc2VydEZhbHNlKG9wdGlvbmFsRmllbGQuaXNSZXF1aXJlZCgpKTsKLSAgICBhc3NlcnRGYWxzZShvcHRpb25hbEZpZWxkLmlzUmVwZWF0ZWQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UocmVwZWF0ZWRGaWVsZC5pc1JlcXVpcmVkKCkpOwotICAgIGFzc2VydFRydWUocmVwZWF0ZWRGaWVsZC5pc1JlcGVhdGVkKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RmllbGREZXNjcmlwdG9ySnNvbk5hbWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWVsZERlc2NyaXB0b3IgcmVxdWlyZWRGaWVsZCA9IFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJhIik7Ci0gICAgRmllbGREZXNjcmlwdG9yIG9wdGlvbmFsRmllbGQgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgcmVwZWF0ZWRGaWVsZCA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOwotICAgIGFzc2VydEVxdWFscygiYSIsIHJlcXVpcmVkRmllbGQuZ2V0SnNvbk5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbEludDMyIiwgb3B0aW9uYWxGaWVsZC5nZXRKc29uTmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInJlcGVhdGVkSW50MzIiLCByZXBlYXRlZEZpZWxkLmdldEpzb25OYW1lKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEZpZWxkRGVzY3JpcHRvckRlZmF1bHQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9yIGQgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIGFzc2VydEZhbHNlKGQuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpLmhhc0RlZmF1bHRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZC5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIikuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgIGFzc2VydFRydWUoZC5maW5kRmllbGRCeU5hbWUoImRlZmF1bHRfaW50MzIiKS5oYXNEZWZhdWx0VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQxLCBkLmZpbmRGaWVsZEJ5TmFtZSgiZGVmYXVsdF9pbnQzMiIpLmdldERlZmF1bHRWYWx1ZSgpKTsKLQotICAgIGQgPSBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgIEJ5dGVTdHJpbmcuY29weUZyb20oCi0gICAgICAgICJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCJcdTAwZmUiLmdldEJ5dGVzKEludGVybmFsLklTT184ODU5XzEpKSwKLSAgICAgIGQuZmluZEZpZWxkQnlOYW1lKCJlc2NhcGVkX2J5dGVzIikuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygtMSwgZC5maW5kRmllbGRCeU5hbWUoImxhcmdlX3VpbnQzMiIpLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTFMLCBkLmZpbmRGaWVsZEJ5TmFtZSgibGFyZ2VfdWludDY0IikuZ2V0RGVmYXVsdFZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudW1EZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRW51bURlc2NyaXB0b3IgZW51bVR5cGUgPSBGb3JlaWduRW51bS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRW51bURlc2NyaXB0b3IgbmVzdGVkVHlwZSA9IFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLmdldERlc2NyaXB0b3IoKTsKLQotICAgIGFzc2VydEVxdWFscygiRm9yZWlnbkVudW0iLCBlbnVtVHlwZS5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscygicHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0iLCBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5nZXREZXNjcmlwdG9yKCksIGVudW1UeXBlLmdldEZpbGUoKSk7Ci0gICAgYXNzZXJ0TnVsbChlbnVtVHlwZS5nZXRDb250YWluaW5nVHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRGVzY3JpcHRvclByb3Rvcy5FbnVtT3B0aW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpKTsKLQotICAgIGFzc2VydEVxdWFscygiTmVzdGVkRW51bSIsIG5lc3RlZFR5cGUuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIiwKLSAgICAgICAgICAgICAgICAgbmVzdGVkVHlwZS5nZXRGdWxsTmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5nZXREZXNjcmlwdG9yKCksIG5lc3RlZFR5cGUuZ2V0RmlsZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbmVzdGVkVHlwZS5nZXRDb250YWluaW5nVHlwZSgpKTsKLQotICAgIEVudW1WYWx1ZURlc2NyaXB0b3IgdmFsdWUgPSBGb3JlaWduRW51bS5GT1JFSUdOX0ZPTy5nZXRWYWx1ZURlc2NyaXB0b3IoKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIGVudW1UeXBlLmdldFZhbHVlcygpLmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJGT1JFSUdOX0ZPTyIsIHZhbHVlLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJGT1JFSUdOX0ZPTyIsIHZhbHVlLnRvU3RyaW5nKCkpOwotICAgIGFzc2VydEVxdWFscyg0LCB2YWx1ZS5nZXROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBlbnVtVHlwZS5maW5kVmFsdWVCeU5hbWUoIkZPUkVJR05fRk9PIikpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXIoNCkpOwotICAgIGFzc2VydE51bGwoZW51bVR5cGUuZmluZFZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVR5cGUuZ2V0VmFsdWVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBlbnVtVHlwZS5nZXRWYWx1ZXMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKTsKLQotICAgIGFzc2VydEVxdWFscygiVGVzdFNlcnZpY2UiLCBzZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0U2VydmljZSIsIHNlcnZpY2UuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBzZXJ2aWNlLmdldEZpbGUoKSk7Ci0KLQotICAgIE1ldGhvZERlc2NyaXB0b3IgZm9vTWV0aG9kID0gc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KDApOwotICAgIGFzc2VydEVxdWFscygiRm9vIiwgZm9vTWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uRm9vUmVxdWVzdC5nZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgIGZvb01ldGhvZC5nZXRJbnB1dFR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uRm9vUmVzcG9uc2UuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBmb29NZXRob2QuZ2V0T3V0cHV0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9vTWV0aG9kLCBzZXJ2aWNlLmZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKLQotICAgIE1ldGhvZERlc2NyaXB0b3IgYmFyTWV0aG9kID0gc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KDEpOwotICAgIGFzc2VydEVxdWFscygiQmFyIiwgYmFyTWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uQmFyUmVxdWVzdC5nZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgIGJhck1ldGhvZC5nZXRJbnB1dFR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uQmFyUmVzcG9uc2UuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBiYXJNZXRob2QuZ2V0T3V0cHV0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoYmFyTWV0aG9kLCBzZXJ2aWNlLmZpbmRNZXRob2RCeU5hbWUoIkJhciIpKTsKLQotICAgIGFzc2VydE51bGwoc2VydmljZS5maW5kTWV0aG9kQnlOYW1lKCJOb1N1Y2hNZXRob2QiKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2UuZ2V0TWV0aG9kcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KGkpLmdldEluZGV4KCkpOwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHZvaWQgdGVzdEN1c3RvbU9wdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBHZXQgdGhlIGRlc2NyaXB0b3IgaW5kaXJlY3RseSBmcm9tIGEgZGVwZW5kZW50IHByb3RvIGNsYXNzLiBUaGlzIGlzIHRvCi0gICAgLy8gZW5zdXJlIHRoYXQgd2hlbiBhIHByb3RvIGNsYXNzIGlzIGxvYWRlZCwgY3VzdG9tIG9wdGlvbnMgZGVmaW5lZCBpbiBpdHMKLSAgICAvLyBkZXBlbmRlbmNpZXMgYXJlIGFsc28gcHJvcGVybHkgaW5pdGlhbGl6ZWQuCi0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0KLSAgICAgICAgVGVzdEN1c3RvbU9wdGlvbnMuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uc0NvbnRhaW5lci5nZXREZXNjcmlwdG9yKCkKLSAgICAgICAgLmZpbmRGaWVsZEJ5TmFtZSgiZmllbGQiKS5nZXRNZXNzYWdlVHlwZSgpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgIGRlc2NyaXB0b3IuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMubWVzc2FnZU9wdDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKC01NiksCi0gICAgICBkZXNjcmlwdG9yLmdldE9wdGlvbnMoKS5nZXRFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLm1lc3NhZ2VPcHQxKSk7Ci0KLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgiZmllbGQxIik7Ci0gICAgYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0KLSAgICBhc3NlcnRUcnVlKAotICAgICAgZmllbGQuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZmllbGRPcHQxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig4NzY1NDMyMTA5TCksCi0gICAgICBmaWVsZC5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5maWVsZE9wdDEpKTsKLQotICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0KLSAgICAgIFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLkFuRW51bS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgICBhc3NlcnRUcnVlKAotICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKC03ODkpLAotICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmdldEV4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsKLQotICAgIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2UgPQotICAgICAgVW5pdHRlc3RDdXN0b21PcHRpb25zLlRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMuZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgIHNlcnZpY2UuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuc2VydmljZU9wdDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKC05ODc2NTQzMjEwTCksCi0gICAgICBzZXJ2aWNlLmdldE9wdGlvbnMoKS5nZXRFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLnNlcnZpY2VPcHQxKSk7Ci0KLSAgICBNZXRob2REZXNjcmlwdG9yIG1ldGhvZCA9IHNlcnZpY2UuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7Ci0gICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgIG1ldGhvZC5nZXRPcHRpb25zKCkuaGFzRXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5tZXRob2RPcHQxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5NZXRob2RPcHQxLk1FVEhPRE9QVDFfVkFMMiwKLSAgICAgIG1ldGhvZC5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5tZXRob2RPcHQxKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IHRoZSBGaWVsZERlc2NyaXB0b3IuVHlwZSBlbnVtIGlzIHRoZSBzYW1lIGFzIHRoZQotICAgKiBXaXJlRm9ybWF0LkZpZWxkVHlwZSBlbnVtLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEZpZWxkVHlwZVRhYmxlc01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmllbGREZXNjcmlwdG9yLlR5cGVbXSB2YWx1ZXMxID0gRmllbGREZXNjcmlwdG9yLlR5cGUudmFsdWVzKCk7Ci0gICAgV2lyZUZvcm1hdC5GaWVsZFR5cGVbXSB2YWx1ZXMyID0gV2lyZUZvcm1hdC5GaWVsZFR5cGUudmFsdWVzKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHModmFsdWVzMS5sZW5ndGgsIHZhbHVlczIubGVuZ3RoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzMS5sZW5ndGg7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlczFbaV0udG9TdHJpbmcoKSwgdmFsdWVzMltpXS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IHRoZSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUgZW51bSBpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICogV2lyZUZvcm1hdC5KYXZhVHlwZSBlbnVtLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEphdmFUeXBlVGFibGVzTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGVbXSB2YWx1ZXMxID0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLnZhbHVlcygpOwotICAgIFdpcmVGb3JtYXQuSmF2YVR5cGVbXSB2YWx1ZXMyID0gV2lyZUZvcm1hdC5KYXZhVHlwZS52YWx1ZXMoKTsKLQotICAgIGFzc2VydEVxdWFscyh2YWx1ZXMxLmxlbmd0aCwgdmFsdWVzMi5sZW5ndGgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMxLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHModmFsdWVzMVtpXS50b1N0cmluZygpLCB2YWx1ZXMyW2ldLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbm9ybW91c0Rlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyBmaWxlIGlzIGxhcmdlciB0aGFuIDY0aywgeWV0IGl0IGRpZCBub3QgY2F1c2UKLSAgICAvLyBhIGNvbXBpbGVyIGVycm9yIGR1ZSB0byBhbiBvdmVyLWxvbmcgc3RyaW5nIGxpdGVyYWwuCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgVW5pdHRlc3RFbm9ybW91c0Rlc2NyaXB0b3IuZ2V0RGVzY3JpcHRvcigpCi0gICAgICAgICAgLnRvUHJvdG8oKS5nZXRTZXJpYWxpemVkU2l6ZSgpID4gNjU1MzYpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgdGhlIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHdvcmtzIGFzIGludGVuZGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdERlc2NyaXB0b3JWYWxpZGF0b3JFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVEZXNjcmlwdG9yUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCi0gICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgLnNldE5hbWUoIkZvbyIpCi0gICAgICAgIC5hZGRGaWVsZChGaWVsZERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAuc2V0TGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfT1BUSU9OQUwpCi0gICAgICAgICAgLnNldFR5cGUoRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZS5UWVBFX0lOVDMyKQotICAgICAgICAgIC5zZXROYW1lKCJmb28iKQotICAgICAgICAgIC5zZXROdW1iZXIoMSkKLSAgICAgICAgICAuc2V0RGVmYXVsdFZhbHVlKCJpbnZhbGlkIikKLSAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAuYnVpbGQoKTsKLSAgICB0cnkgewotICAgICAgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKGZpbGVEZXNjcmlwdG9yUHJvdG8sCi0gICAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yWzBdKTsKLSAgICAgIGZhaWwoIkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7Ci0gICAgfSBjYXRjaCAoRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQ7IGNoZWNrIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgY29udGFpbnMgc29tZSB1c2VmdWwgaGludHMKLSAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiZm9vIikgIT0gLTEpOwotICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJGb28iKSAhPSAtMSk7Ci0gICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoImludmFsaWQiKSAhPSAtMSk7Ci0gICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE51bWJlckZvcm1hdEV4Y2VwdGlvbik7Ci0gICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiaW52YWxpZCIpICE9IC0xKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdGhlIHRyYW5zbGF0ZS9jcm9zc2xpbmsgZm9yIGFuIGV4YW1wbGUgd2hlcmUgYSBtZXNzYWdlIGZpZWxkJ3MgbmFtZQotICAgKiBhbmQgdHlwZSBuYW1lIGFyZSB0aGUgc2FtZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdG9yQ29tcGxleENyb3NzbGluaygpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZURlc2NyaXB0b3JQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAuc2V0TmFtZSgiZm9vLnByb3RvIikKLSAgICAgIC5hZGRNZXNzYWdlVHlwZShEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROYW1lKCJGb28iKQotICAgICAgICAuYWRkRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgLnNldExhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX09QVElPTkFMKQotICAgICAgICAgIC5zZXRUeXBlKEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUuVFlQRV9JTlQzMikKLSAgICAgICAgICAuc2V0TmFtZSgiZm9vIikKLSAgICAgICAgICAuc2V0TnVtYmVyKDEpCi0gICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpKQotICAgICAgLmFkZE1lc3NhZ2VUeXBlKERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoIkJhciIpCi0gICAgICAgIC5hZGRGaWVsZChGaWVsZERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAuc2V0TGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfT1BUSU9OQUwpCi0gICAgICAgICAgLnNldFR5cGVOYW1lKCJGb28iKQotICAgICAgICAgIC5zZXROYW1lKCJGb28iKQotICAgICAgICAgIC5zZXROdW1iZXIoMSkKLSAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAuYnVpbGQoKTsKLSAgICAvLyB0cmFuc2xhdGUgYW5kIGNyb3NzbGluawotICAgIEZpbGVEZXNjcmlwdG9yIGZpbGUgPQotICAgICAgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKGZpbGVEZXNjcmlwdG9yUHJvdG8sCi0gICAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yWzBdKTsKLSAgICAvLyB2ZXJpZnkgcmVzdWx0aW5nIGRlc2NyaXB0b3JzCi0gICAgYXNzZXJ0Tm90TnVsbChmaWxlKTsKLSAgICBMaXN0PERlc2NyaXB0b3I+IG1zZ2xpc3QgPSBmaWxlLmdldE1lc3NhZ2VUeXBlcygpOwotICAgIGFzc2VydE5vdE51bGwobXNnbGlzdCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dsaXN0LnNpemUoKSA9PSAyKTsKLSAgICBib29sZWFuIGJhckZvdW5kID0gZmFsc2U7Ci0gICAgZm9yIChEZXNjcmlwdG9yIGRlc2MgOiBtc2dsaXN0KSB7Ci0gICAgICBpZiAoZGVzYy5nZXROYW1lKCkuZXF1YWxzKCJCYXIiKSkgewotICAgICAgICBiYXJGb3VuZCA9IHRydWU7Ci0gICAgICAgIGFzc2VydE5vdE51bGwoZGVzYy5nZXRGaWVsZHMoKSk7Ci0gICAgICAgIExpc3Q8RmllbGREZXNjcmlwdG9yPiBmaWVsZGxpc3QgPSBkZXNjLmdldEZpZWxkcygpOwotICAgICAgICBhc3NlcnROb3ROdWxsKGZpZWxkbGlzdCk7Ci0gICAgICAgIGFzc2VydFRydWUoZmllbGRsaXN0LnNpemUoKSA9PSAxKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWVsZGxpc3QuZ2V0KDApLmdldFR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuVHlwZS5NRVNTQUdFKTsKLSAgICAgICAgYXNzZXJ0VHJ1ZShmaWVsZGxpc3QuZ2V0KDApLmdldE1lc3NhZ2VUeXBlKCkuZ2V0TmFtZSgpLmVxdWFscygiRm9vIikpOwotICAgICAgfQotICAgIH0KLSAgICBhc3NlcnRUcnVlKGJhckZvdW5kKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REZXBlbmRlbmN5T3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb1Byb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpLmJ1aWxkKCk7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROYW1lKCJiYXIucHJvdG8iKQotICAgICAgICAuYWRkRGVwZW5kZW5jeSgiZm9vLnByb3RvIikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXpQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROYW1lKCJiYXoucHJvdG8iKQotICAgICAgICAuYWRkRGVwZW5kZW5jeSgiZm9vLnByb3RvIikKLSAgICAgICAgLmFkZERlcGVuZGVuY3koImJhci5wcm90byIpCi0gICAgICAgIC5hZGRQdWJsaWNEZXBlbmRlbmN5KDApCi0gICAgICAgIC5hZGRQdWJsaWNEZXBlbmRlbmN5KDEpCi0gICAgICAgIC5idWlsZCgpOwotICAgIEZpbGVEZXNjcmlwdG9yIGZvb0ZpbGUgPSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oZm9vUHJvdG8sCi0gICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7Ci0gICAgRmlsZURlc2NyaXB0b3IgYmFyRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbShiYXJQcm90bywKLSAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yW10ge2Zvb0ZpbGV9KTsKLQotICAgIC8vIEl0ZW1zIGluIHRoZSBGaWxlRGVzY3JpcHRvciBhcnJheSBjYW4gYmUgaW4gYW55IG9yZGVyLgotICAgIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbShiYXpQcm90bywKLSAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yW10ge2Zvb0ZpbGUsIGJhckZpbGV9KTsKLSAgICBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oYmF6UHJvdG8sCi0gICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvcltdIHtiYXJGaWxlLCBmb29GaWxlfSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFB1YmxpY0RlcGVuZGVuY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb1Byb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpLmJ1aWxkKCk7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROYW1lKCJib28ucHJvdG8iKQotICAgICAgICAuYWRkRGVwZW5kZW5jeSgiZm9vLnByb3RvIikKLSAgICAgICAgLmFkZFB1YmxpY0RlcGVuZGVuY3koMSkgIC8vIEVycm9yLCBzaG91bGQgYmUgMC4KLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRmlsZURlc2NyaXB0b3IgZm9vRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbShmb29Qcm90bywKLSAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yWzBdKTsKLSAgICB0cnkgewotICAgICAgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKGJhclByb3RvLAotICAgICAgICAgIG5ldyBGaWxlRGVzY3JpcHRvcltdIHtmb29GaWxlfSk7Ci0gICAgICBmYWlsKCJEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCIpOwotICAgIH0gY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC4iKSAhPSAtMSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFVua25vd25GaWVsZHNEZW5pZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb1Byb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCi0gICAgICAgIC5hZGRNZXNzYWdlVHlwZShEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0TmFtZSgiRm9vIikKLSAgICAgICAgICAgIC5hZGRGaWVsZChGaWVsZERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0TGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfT1BUSU9OQUwpCi0gICAgICAgICAgICAgICAgLnNldFR5cGVOYW1lKCJCYXIiKQotICAgICAgICAgICAgICAgIC5zZXROYW1lKCJiYXIiKQotICAgICAgICAgICAgICAgIC5zZXROdW1iZXIoMSkpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIHRyeSB7Ci0gICAgICBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oZm9vUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7Ci0gICAgICBmYWlsKCJEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCIpOwotICAgIH0gY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiQmFyIikgIT0gLTEpOwotICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJpcyBub3QgZGVmaW5lZCIpICE9IC0xKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkZpZWxkc0FsbG93ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb1Byb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCi0gICAgICAgIC5hZGREZXBlbmRlbmN5KCJiYXIucHJvdG8iKQotICAgICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldE5hbWUoIkZvbyIpCi0gICAgICAgICAgICAuYWRkRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldExhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX09QVElPTkFMKQotICAgICAgICAgICAgICAgIC5zZXRUeXBlTmFtZSgiQmFyIikKLSAgICAgICAgICAgICAgICAuc2V0TmFtZSgiYmFyIikKLSAgICAgICAgICAgICAgICAuc2V0TnVtYmVyKDEpKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKGZvb1Byb3RvLCBuZXcgRmlsZURlc2NyaXB0b3JbMF0sIHRydWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEhpZGRlbkRlcGVuZGVuY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhclByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoImJhci5wcm90byIpCi0gICAgICAgIC5hZGRNZXNzYWdlVHlwZShEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpLnNldE5hbWUoIkJhciIpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvcndhcmRQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROYW1lKCJmb3J3YXJkLnByb3RvIikKLSAgICAgICAgLmFkZERlcGVuZGVuY3koImJhci5wcm90byIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TmFtZSgiZm9vLnByb3RvIikKLSAgICAgICAgLmFkZERlcGVuZGVuY3koImZvcndhcmQucHJvdG8iKQotICAgICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldE5hbWUoIkZvbyIpCi0gICAgICAgICAgICAuYWRkRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldExhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX09QVElPTkFMKQotICAgICAgICAgICAgICAgIC5zZXRUeXBlTmFtZSgiQmFyIikKLSAgICAgICAgICAgICAgICAuc2V0TmFtZSgiYmFyIikKLSAgICAgICAgICAgICAgICAuc2V0TnVtYmVyKDEpKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRmlsZURlc2NyaXB0b3IgYmFyRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgKLSAgICAgICAgYmFyUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7Ci0gICAgRmlsZURlc2NyaXB0b3IgZm9yd2FyZEZpbGUgPSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCi0gICAgICAgIGZvcndhcmRQcm90bywgbmV3IEZpbGVEZXNjcmlwdG9yW10ge2JhckZpbGV9KTsKLQotICAgIHRyeSB7Ci0gICAgICBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCi0gICAgICAgICAgZm9vUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvcltdIHtmb3J3YXJkRmlsZX0pOwotICAgICAgZmFpbCgiRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQiKTsKLSAgICB9IGNhdGNoIChEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoIkJhciIpICE9IC0xKTsKLSAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiaXMgbm90IGRlZmluZWQiKSAhPSAtMSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFB1YmxpY0RlcGVuZGVuY3koKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhclByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoImJhci5wcm90byIpCi0gICAgICAgIC5hZGRNZXNzYWdlVHlwZShEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpLnNldE5hbWUoIkJhciIpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvcndhcmRQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROYW1lKCJmb3J3YXJkLnByb3RvIikKLSAgICAgICAgLmFkZERlcGVuZGVuY3koImJhci5wcm90byIpCi0gICAgICAgIC5hZGRQdWJsaWNEZXBlbmRlbmN5KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TmFtZSgiZm9vLnByb3RvIikKLSAgICAgICAgLmFkZERlcGVuZGVuY3koImZvcndhcmQucHJvdG8iKQotICAgICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldE5hbWUoIkZvbyIpCi0gICAgICAgICAgICAuYWRkRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldExhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX09QVElPTkFMKQotICAgICAgICAgICAgICAgIC5zZXRUeXBlTmFtZSgiQmFyIikKLSAgICAgICAgICAgICAgICAuc2V0TmFtZSgiYmFyIikKLSAgICAgICAgICAgICAgICAuc2V0TnVtYmVyKDEpKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRmlsZURlc2NyaXB0b3IgYmFyRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgKLSAgICAgICAgYmFyUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7Ci0gICAgRmlsZURlc2NyaXB0b3IgZm9yd2FyZEZpbGUgPSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCi0gICAgICAgIGZvcndhcmRQcm90bywgbmV3IEZpbGVEZXNjcmlwdG9yW117YmFyRmlsZX0pOwotICAgIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgKLSAgICAgICAgZm9vUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvcltdIHtmb3J3YXJkRmlsZX0pOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoZSB0cmFuc2xhdGUvY3Jvc3NsaW5rIGZvciBhbiBleGFtcGxlIHdpdGggYSBtb3JlIGNvbXBsZXggbmFtZXNwYWNlCi0gICAqIHJlZmVyZW5jaW5nLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdENvbXBsZXhOYW1lc3BhY2VQdWJsaWNEZXBlbmRlbmN5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29Qcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROYW1lKCJiYXIucHJvdG8iKQotICAgICAgICAuc2V0UGFja2FnZSgiYS5iLmMuZC5iYXIuc2hhcmVkIikKLSAgICAgICAgLmFkZEVudW1UeXBlKEVudW1EZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0TmFtZSgiTXlFbnVtIikKLSAgICAgICAgICAgIC5hZGRWYWx1ZShFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldE5hbWUoIkJMQUgiKQotICAgICAgICAgICAgICAgIC5zZXROdW1iZXIoMSkpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGJhclByb3RvID0gRmlsZURlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoImZvby5wcm90byIpCi0gICAgICAgIC5hZGREZXBlbmRlbmN5KCJiYXIucHJvdG8iKQotICAgICAgICAuc2V0UGFja2FnZSgiYS5iLmMuZC5mb28uc2hhcmVkIikKLSAgICAgICAgLmFkZE1lc3NhZ2VUeXBlKERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXROYW1lKCJNeU1lc3NhZ2UiKQotICAgICAgICAgICAgLmFkZEZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9SRVBFQVRFRCkKLSAgICAgICAgICAgICAgICAuc2V0VHlwZU5hbWUoImJhci5zaGFyZWQuTXlFbnVtIikKLSAgICAgICAgICAgICAgICAuc2V0TmFtZSgiTXlGaWVsZCIpCi0gICAgICAgICAgICAgICAgLnNldE51bWJlcigxKSkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIC8vIHRyYW5zbGF0ZSBhbmQgY3Jvc3NsaW5rCi0gICAgRmlsZURlc2NyaXB0b3IgZm9vRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgKLSAgICAgICAgZm9vUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7Ci0gICAgRmlsZURlc2NyaXB0b3IgYmFyRmlsZSA9IERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgKLSAgICAgICAgYmFyUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvcltde2Zvb0ZpbGV9KTsKLSAgICAvLyB2ZXJpZnkgcmVzdWx0aW5nIGRlc2NyaXB0b3JzCi0gICAgYXNzZXJ0Tm90TnVsbChiYXJGaWxlKTsKLSAgICBMaXN0PERlc2NyaXB0b3I+IG1zZ2xpc3QgPSBiYXJGaWxlLmdldE1lc3NhZ2VUeXBlcygpOwotICAgIGFzc2VydE5vdE51bGwobXNnbGlzdCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dsaXN0LnNpemUoKSA9PSAxKTsKLSAgICBEZXNjcmlwdG9yIGRlc2MgPSBtc2dsaXN0LmdldCgwKTsKLSAgICBpZiAoZGVzYy5nZXROYW1lKCkuZXF1YWxzKCJNeU1lc3NhZ2UiKSkgewotICAgICAgYXNzZXJ0Tm90TnVsbChkZXNjLmdldEZpZWxkcygpKTsKLSAgICAgIExpc3Q8RmllbGREZXNjcmlwdG9yPiBmaWVsZGxpc3QgPSBkZXNjLmdldEZpZWxkcygpOwotICAgICAgYXNzZXJ0Tm90TnVsbChmaWVsZGxpc3QpOwotICAgICAgYXNzZXJ0VHJ1ZShmaWVsZGxpc3Quc2l6ZSgpID09IDEpOwotICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZmllbGRsaXN0LmdldCgwKTsKLSAgICAgIGFzc2VydFRydWUoZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLkVOVU0pOwotICAgICAgYXNzZXJ0VHJ1ZShmaWVsZC5nZXRFbnVtVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMoIk15RW51bSIpKTsKLSAgICAgIGFzc2VydFRydWUoZmllbGQuZ2V0RW51bVR5cGUoKS5nZXRGaWxlKCkuZ2V0TmFtZSgpLmVxdWFscygiYmFyLnByb3RvIikpOwotICAgICAgYXNzZXJ0VHJ1ZShmaWVsZC5nZXRFbnVtVHlwZSgpLmdldEZpbGUoKS5nZXRQYWNrYWdlKCkuZXF1YWxzKAotICAgICAgICAgICJhLmIuYy5kLmJhci5zaGFyZWQiKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9uZW9mRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIERlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9Ci0gICAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib25lb2ZfbmVzdGVkX21lc3NhZ2UiKTsKLSAgICBPbmVvZkRlc2NyaXB0b3Igb25lb2ZEZXNjcmlwdG9yID0gZmllbGQuZ2V0Q29udGFpbmluZ09uZW9mKCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChvbmVvZkRlc2NyaXB0b3IpOwotICAgIGFzc2VydFNhbWUob25lb2ZEZXNjcmlwdG9yLCBtZXNzYWdlVHlwZS5nZXRPbmVvZnMoKS5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscygib25lb2ZfZmllbGQiLCBvbmVvZkRlc2NyaXB0b3IuZ2V0TmFtZSgpKTsKLQotICAgIGFzc2VydEVxdWFscyg0LCBvbmVvZkRlc2NyaXB0b3IuZ2V0RmllbGRDb3VudCgpKTsKLSAgICBhc3NlcnRTYW1lKG9uZW9mRGVzY3JpcHRvci5nZXRGaWVsZCgxKSwgZmllbGQpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDQsIG9uZW9mRGVzY3JpcHRvci5nZXRGaWVsZHMoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhvbmVvZkRlc2NyaXB0b3IuZ2V0RmllbGRzKCkuZ2V0KDEpLCBmaWVsZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZURlc2NyaXB0b3JFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5pc0V4dGVuZGFibGUoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCkuaXNFeHRlbmRhYmxlKCkpOwotICAgIGFzc2VydFRydWUoVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLmdldERlc2NyaXB0b3IoKS5pc0V4dGVuZGFibGUoKSk7Ci0KLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmlzRXh0ZW5zaW9uTnVtYmVyKDMpKTsKLSAgICBhc3NlcnRUcnVlKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKS5pc0V4dGVuc2lvbk51bWJlcigzKSk7Ci0gICAgYXNzZXJ0VHJ1ZShUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuZ2V0RGVzY3JpcHRvcigpLmlzRXh0ZW5zaW9uTnVtYmVyKDQyKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLmdldERlc2NyaXB0b3IoKS5pc0V4dGVuc2lvbk51bWJlcig0MykpOwotICAgIGFzc2VydEZhbHNlKFRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5nZXREZXNjcmlwdG9yKCkuaXNFeHRlbnNpb25OdW1iZXIoNDE0MikpOwotICAgIGFzc2VydFRydWUoVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLmdldERlc2NyaXB0b3IoKS5pc0V4dGVuc2lvbk51bWJlcig0MTQzKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVzZXJ2ZWRGaWVsZHMoKSB7Ci0gICAgRGVzY3JpcHRvciBkID0gVGVzdFJlc2VydmVkRmllbGRzLmdldERlc2NyaXB0b3IoKTsKLSAgICBhc3NlcnRUcnVlKGQuaXNSZXNlcnZlZE51bWJlcigyKSk7Ci0gICAgYXNzZXJ0RmFsc2UoZC5pc1Jlc2VydmVkTnVtYmVyKDgpKTsKLSAgICBhc3NlcnRUcnVlKGQuaXNSZXNlcnZlZE51bWJlcig5KSk7Ci0gICAgYXNzZXJ0VHJ1ZShkLmlzUmVzZXJ2ZWROdW1iZXIoMTApKTsKLSAgICBhc3NlcnRUcnVlKGQuaXNSZXNlcnZlZE51bWJlcigxMSkpOwotICAgIGFzc2VydEZhbHNlKGQuaXNSZXNlcnZlZE51bWJlcigxMikpOwotICAgIGFzc2VydEZhbHNlKGQuaXNSZXNlcnZlZE5hbWUoImZvbyIpKTsKLSAgICBhc3NlcnRUcnVlKGQuaXNSZXNlcnZlZE5hbWUoImJhciIpKTsKLSAgICBhc3NlcnRUcnVlKGQuaXNSZXNlcnZlZE5hbWUoImJheiIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5vcHRpb25hbF91aW50NjQiLAotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOdW1iZXIoCi0gICAgICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5PUFRJT05BTF9VSU5UNjRfRklFTERfTlVNQkVSKS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYWNrZWRFbnVtRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVEZXNjcmlwdG9yUHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TmFtZSgiZm9vLnByb3RvIikKLSAgICAgICAgLmFkZEVudW1UeXBlKEVudW1EZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgLnNldE5hbWUoIkVudW0iKQotICAgICAgICAgIC5hZGRWYWx1ZShFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0TmFtZSgiRk9PIikKLSAgICAgICAgICAgIC5zZXROdW1iZXIoMSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYWRkTWVzc2FnZVR5cGUoRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgIC5zZXROYW1lKCJNZXNzYWdlIikKLSAgICAgICAgICAuYWRkRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0TmFtZSgiZm9vIikKLSAgICAgICAgICAgIC5zZXRUeXBlTmFtZSgiRW51bSIpCi0gICAgICAgICAgICAuc2V0TnVtYmVyKDEpCi0gICAgICAgICAgICAuc2V0TGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfUkVQRUFURUQpCi0gICAgICAgICAgICAuc2V0T3B0aW9ucyhEZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgLnNldFBhY2tlZCh0cnVlKQotICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCi0gICAgICAgIGZpbGVEZXNjcmlwdG9yUHJvdG8sIG5ldyBGaWxlRGVzY3JpcHRvclswXSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRG91YmxlQXJyYXlMaXN0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Eb3VibGVBcnJheUxpc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YjQxOGMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Eb3VibGVBcnJheUxpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NTkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci0KLS8qKgotICogVGVzdHMgZm9yIHtAbGluayBEb3VibGVBcnJheUxpc3R9LgotICogCi0gKiBAYXV0aG9yIGR3ZWlzQGdvb2dsZS5jb20gKERhbmllbCBXZWlzKQotICovCi1wdWJsaWMgY2xhc3MgRG91YmxlQXJyYXlMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIERvdWJsZUFycmF5TGlzdCBVTkFSWV9MSVNUID0gbmV3SW1tdXRhYmxlRG91YmxlQXJyYXlMaXN0KDEpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBEb3VibGVBcnJheUxpc3QgVEVSVElBUllfTElTVCA9Ci0gICAgICBuZXdJbW11dGFibGVEb3VibGVBcnJheUxpc3QoMSwgMiwgMyk7Ci0gIAotICBwcml2YXRlIERvdWJsZUFycmF5TGlzdCBsaXN0OwotICAKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbGlzdCA9IG5ldyBEb3VibGVBcnJheUxpc3QoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEVtcHR5TGlzdFJldHVybnNTYW1lSW5zdGFuY2UoKSB7Ci0gICAgYXNzZXJ0U2FtZShEb3VibGVBcnJheUxpc3QuZW1wdHlMaXN0KCksIERvdWJsZUFycmF5TGlzdC5lbXB0eUxpc3QoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUxpc3RJc0ltbXV0YWJsZSgpIHsKLSAgICBhc3NlcnRJbW11dGFibGUoRG91YmxlQXJyYXlMaXN0LmVtcHR5TGlzdCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1ha2VJbW11dGFibGUoKSB7Ci0gICAgbGlzdC5hZGREb3VibGUoMik7Ci0gICAgbGlzdC5hZGREb3VibGUoNCk7Ci0gICAgbGlzdC5hZGREb3VibGUoNik7Ci0gICAgbGlzdC5hZGREb3VibGUoOCk7Ci0gICAgbGlzdC5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgYXNzZXJ0SW1tdXRhYmxlKGxpc3QpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZpY2F0aW9uV2l0aEl0ZXJhdGlvbigpIHsKLSAgICBsaXN0LmFkZEFsbChhc0xpc3QoMUQsIDJELCAzRCwgNEQpKTsKLSAgICBJdGVyYXRvcjxEb3VibGU+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIGFzc2VydEVxdWFscyg0LCBsaXN0LnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFELCAoZG91YmxlKSBsaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFELCAoZG91YmxlKSBpdGVyYXRvci5uZXh0KCkpOwotICAgIGxpc3Quc2V0KDAsIDFEKTsKLSAgICBhc3NlcnRFcXVhbHMoMkQsIChkb3VibGUpIGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgbGlzdC5yZW1vdmUoMCk7Ci0gICAgdHJ5IHsKLSAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIGxpc3QuYWRkKDAsIDBEKTsKLSAgICB0cnkgewotICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDFELCAoZG91YmxlKSBURVJUSUFSWV9MSVNULmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDJELCAoZG91YmxlKSBURVJUSUFSWV9MSVNULmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDNELCAoZG91YmxlKSBURVJUSUFSWV9MSVNULmdldCgyKSk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIFRFUlRJQVJZX0xJU1QuZ2V0KC0xKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBURVJUSUFSWV9MSVNULmdldCgzKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0SW50KCkgewotICAgIGFzc2VydEVxdWFscygxRCwgVEVSVElBUllfTElTVC5nZXREb3VibGUoMCkpOwotICAgIGFzc2VydEVxdWFscygyRCwgVEVSVElBUllfTElTVC5nZXREb3VibGUoMSkpOwotICAgIGFzc2VydEVxdWFscygzRCwgVEVSVElBUllfTElTVC5nZXREb3VibGUoMikpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICBURVJUSUFSWV9MSVNULmdldCgtMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgVEVSVElBUllfTElTVC5nZXQoMyk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIERvdWJsZUFycmF5TGlzdC5lbXB0eUxpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBVTkFSWV9MSVNULnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIFRFUlRJQVJZX0xJU1Quc2l6ZSgpKTsKLQotICAgIGxpc3QuYWRkRG91YmxlKDIpOwotICAgIGxpc3QuYWRkRG91YmxlKDQpOwotICAgIGxpc3QuYWRkRG91YmxlKDYpOwotICAgIGxpc3QuYWRkRG91YmxlKDgpOwotICAgIGFzc2VydEVxdWFscyg0LCBsaXN0LnNpemUoKSk7Ci0gICAgCi0gICAgbGlzdC5yZW1vdmUoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICAKLSAgICBsaXN0LmFkZCgxNkQpOwotICAgIGFzc2VydEVxdWFscyg0LCBsaXN0LnNpemUoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXQoKSB7Ci0gICAgbGlzdC5hZGREb3VibGUoMik7Ci0gICAgbGlzdC5hZGREb3VibGUoNCk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDJELCAoZG91YmxlKSBsaXN0LnNldCgwLCAwRCkpOwotICAgIGFzc2VydEVxdWFscygwRCwgbGlzdC5nZXREb3VibGUoMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDRELCAoZG91YmxlKSBsaXN0LnNldCgxLCAwRCkpOwotICAgIGFzc2VydEVxdWFscygwRCwgbGlzdC5nZXREb3VibGUoMSkpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnNldCgtMSwgMEQpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoMiwgMEQpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXRJbnQoKSB7Ci0gICAgbGlzdC5hZGREb3VibGUoMik7Ci0gICAgbGlzdC5hZGREb3VibGUoNCk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDJELCBsaXN0LnNldERvdWJsZSgwLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBELCBsaXN0LmdldERvdWJsZSgwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoNEQsIGxpc3Quc2V0RG91YmxlKDEsIDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMEQsIGxpc3QuZ2V0RG91YmxlKDEpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXREb3VibGUoLTEsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5zZXREb3VibGUoMiwgMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZCgyRCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMkQpLCBsaXN0KTsKLQotICAgIGFzc2VydFRydWUobGlzdC5hZGQoM0QpKTsKLSAgICBsaXN0LmFkZCgwLCA0RCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0RCwgMkQsIDNEKSwgbGlzdCk7Ci0gICAgCi0gICAgbGlzdC5hZGQoMCwgMUQpOwotICAgIGxpc3QuYWRkKDAsIDBEKTsKLSAgICAvLyBGb3JjZSBhIHJlc2l6ZSBieSBnZXR0aW5nIHVwIHRvIDExIGVsZW1lbnRzLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBsaXN0LmFkZChEb3VibGUudmFsdWVPZig1ICsgaSkpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDBELCAxRCwgNEQsIDJELCAzRCwgNUQsIDZELCA3RCwgOEQsIDlELCAxMEQpLCBsaXN0KTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoLTEsIDVEKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZCg0LCA1RCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZEludCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOwotCi0gICAgbGlzdC5hZGREb3VibGUoMik7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyRCksIGxpc3QpOwotCi0gICAgbGlzdC5hZGREb3VibGUoMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyRCwgM0QpLCBsaXN0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oMUQpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUQsIChkb3VibGUpIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMUQsIGxpc3QuZ2V0RG91YmxlKDApKTsKLSAgICAKLSAgICBhc3NlcnRUcnVlKGxpc3QuYWRkQWxsKGFzTGlzdCgyRCwgM0QsIDRELCA1RCwgNkQpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgxRCwgMkQsIDNELCA0RCwgNUQsIDZEKSwgbGlzdCk7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZEFsbChURVJUSUFSWV9MSVNUKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgxRCwgMkQsIDNELCA0RCwgNUQsIDZELCAxRCwgMkQsIDNEKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRGYWxzZShsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy48RG91YmxlPmVtcHR5TGlzdCgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UobGlzdC5hZGRBbGwoRG91YmxlQXJyYXlMaXN0LmVtcHR5TGlzdCgpKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0gICAgbGlzdC5hZGRBbGwoVEVSVElBUllfTElTVCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFELCAoZG91YmxlKSBsaXN0LnJlbW92ZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyRCwgM0QpLCBsaXN0KTsKLQotICAgIGFzc2VydFRydWUobGlzdC5yZW1vdmUoRG91YmxlLnZhbHVlT2YoMykpKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDJEKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRGYWxzZShsaXN0LnJlbW92ZShEb3VibGUudmFsdWVPZigzKSkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMkQpLCBsaXN0KTsKLQotICAgIGFzc2VydEVxdWFscygyRCwgKGRvdWJsZSkgbGlzdC5yZW1vdmUoMCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgbGlzdCk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKC0xKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYXNzZXJ0SW1tdXRhYmxlKERvdWJsZUFycmF5TGlzdCBsaXN0KSB7Ci0gICAgaWYgKGxpc3QuY29udGFpbnMoMUQpKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHRlc3QgdGhlIGltbXV0YWJpbGl0eSBvZiBsaXN0cyB0aGF0IGNvbnRhaW4gMS4iKTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKDFEKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoMCwgMUQpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy48RG91YmxlPmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uTGlzdCgxRCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChuZXcgRG91YmxlQXJyYXlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKDFEKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKDAsIFVOQVJZX0xJU1QpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbCgwLCBDb2xsZWN0aW9ucy48RG91YmxlPmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGREb3VibGUoMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuY2xlYXIoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgxKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmUobmV3IE9iamVjdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuPERvdWJsZT5lbXB0eUxpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlQWxsKENvbGxlY3Rpb25zLnNpbmdsZXRvbigxRCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJldGFpbkFsbChDb2xsZWN0aW9ucy48RG91YmxlPmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKDFEKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmV0YWluQWxsKFVOQVJZX0xJU1QpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnNldCgwLCAwRCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0RG91YmxlKDAsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBEb3VibGVBcnJheUxpc3QgbmV3SW1tdXRhYmxlRG91YmxlQXJyYXlMaXN0KGRvdWJsZS4uLiBlbGVtZW50cykgewotICAgIERvdWJsZUFycmF5TGlzdCBsaXN0ID0gbmV3IERvdWJsZUFycmF5TGlzdCgpOwotICAgIGZvciAoZG91YmxlIGVsZW1lbnQgOiBlbGVtZW50cykgewotICAgICAgbGlzdC5hZGREb3VibGUoZWxlbWVudCk7Ci0gICAgfQotICAgIGxpc3QubWFrZUltbXV0YWJsZSgpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzYTc0Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHtAbGluayBEeW5hbWljTWVzc2FnZX0uICBTZWUgYWxzbyB7QGxpbmsgTWVzc2FnZVRlc3R9LCB3aGljaAotICogdGVzdHMgc29tZSB7QGxpbmsgRHluYW1pY01lc3NhZ2V9IGZ1bmN0aW9uYWxpdHkuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIER5bmFtaWNNZXNzYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uVGVzdGVyID0KLSAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLCBudWxsKTsKLQotICBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyID0KLSAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSk7Ci0gIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcGFja2VkUmVmbGVjdGlvblRlc3RlciA9Ci0gICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdFBhY2tlZFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlQWNjZXNzb3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXR0ZXJzQWZ0ZXJCdWlsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgTWVzc2FnZSBmaXJzdE1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgLy8gZG91YmxlIGJ1aWxkKCkKLSAgICBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgLy8gY2xlYXIoKSBhZnRlciBidWlsZCgpCi0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIC8vIHNldHRlcnMgYWZ0ZXIgYnVpbGQoKQotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOwotICAgIC8vIHJlcGVhdGVkIHNldHRlcnMgYWZ0ZXIgYnVpbGQoKQotICAgIHJlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkVmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLSAgICAvLyBmaXJzdE1lc3NhZ2Ugc2hvdWxkbid0IGhhdmUgYmVlbiBtb2RpZmllZC4KLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbihmaXJzdE1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFVua25vd25GaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEVtcHR5TWVzc2FnZS5nZXREZXNjcmlwdG9yKCkpOwotICAgIGJ1aWxkZXIuc2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRGaWVsZCgxLCBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpLmFkZFZhcmludCgxKS5idWlsZCgpKQotICAgICAgICAuYWRkRmllbGQoMiwgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKS5hZGRGaXhlZDMyKDEpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuc2l6ZSgpKTsKLSAgICAvLyBjbG9uZSgpIHdpdGggdW5rbm93biBmaWVsZHMKLSAgICBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlciA9IGJ1aWxkZXIuY2xvbmUoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3QnVpbGRlci5nZXRVbmtub3duRmllbGRzKCkuYXNNYXAoKS5zaXplKCkpOwotICAgIC8vIGNsZWFyKCkgd2l0aCB1bmtub3duIGZpZWxkcwotICAgIG5ld0J1aWxkZXIuY2xlYXIoKTsKLSAgICBhc3NlcnRUcnVlKG5ld0J1aWxkZXIuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuaXNFbXB0eSgpKTsKLSAgICAvLyBzZXJpYWxpemUvcGFyc2Ugd2l0aCB1bmtub3duIGZpZWxkcwotICAgIG5ld0J1aWxkZXIubWVyZ2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdCdWlsZGVyLmdldFVua25vd25GaWVsZHMoKS5hc01hcCgpLnNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VFeHRlbnNpb25BY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGV4dGVuc2l2ZWx5IHRlc3QgRHluYW1pY01lc3NhZ2UncyBoYW5kbGluZyBvZgotICAgIC8vIGV4dGVuc2lvbnMgYmVjYXVzZSwgZnJhbmtseSwgaXQgZG9lc24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhlbS4KLSAgICAvLyBJdCB0cmVhdHMgdGhlbSBqdXN0IGxpa2UgYW55IG90aGVyIGZpZWxkcy4KLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZUV4dGVuc2lvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCkpOwotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCi0gICAgICBEeW5hbWljTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKAotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKS5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVNlcmlhbGl6ZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLQotICAgIE1lc3NhZ2UuQnVpbGRlciBkeW5hbWljQnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihkeW5hbWljQnVpbGRlcik7Ci0gICAgTWVzc2FnZSBkeW5hbWljTWVzc2FnZSA9IGR5bmFtaWNCdWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpLAotICAgICAgICAgICAgICAgICBkeW5hbWljTWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci0KLSAgICAvLyBJbiBmYWN0LCB0aGUgc2VyaWFsaXplZCBmb3JtcyBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSwgYnl0ZS1mb3ItYnl0ZS4KLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCksIHJhd0J5dGVzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIE1lc3NhZ2UgbWVzc2FnZTIgPQotICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIHJhd0J5dGVzKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZTIpOwotCi0gICAgLy8gVGVzdCBQYXJzZXIgaW50ZXJmYWNlLgotICAgIE1lc3NhZ2UgbWVzc2FnZTMgPSBtZXNzYWdlMi5nZXRQYXJzZXJGb3JUeXBlKCkucGFyc2VGcm9tKHJhd0J5dGVzKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZTMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlRXh0ZW5zaW9uUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKAotICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCksIHJhd0J5dGVzLAotICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOwotCi0gICAgLy8gVGVzdCBQYXJzZXIgaW50ZXJmYWNlLgotICAgIE1lc3NhZ2UgbWVzc2FnZTIgPSBtZXNzYWdlLmdldFBhcnNlckZvclR5cGUoKS5wYXJzZUZyb20oCi0gICAgICAgIHJhd0J5dGVzLCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVBhY2tlZFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcGFja2VkUmVmbGVjdGlvblRlc3Rlci5zZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMiA9IFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRmllbGRzU2V0KG1lc3NhZ2UyKTsKLQotICAgIC8vIEluIGZhY3QsIHRoZSBzZXJpYWxpemVkIGZvcm1zIHNob3VsZCBiZSBleGFjdGx5IHRoZSBzYW1lLCBieXRlLWZvci1ieXRlLgotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSwgcmF3Qnl0ZXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUGFja2VkUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UGFja2VkVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldFBhY2tlZEZpZWxkcyhidWlsZGVyKTsKLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotCi0gICAgTWVzc2FnZSBtZXNzYWdlMiA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5wYXJzZUZyb20oVGVzdFBhY2tlZFR5cGVzLmdldERlc2NyaXB0b3IoKSwgcmF3Qnl0ZXMpOwotICAgIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlMik7Ci0KLSAgICAvLyBUZXN0IFBhcnNlciBpbnRlcmZhY2UuCi0gICAgTWVzc2FnZSBtZXNzYWdlMyA9IG1lc3NhZ2UyLmdldFBhcnNlckZvclR5cGUoKS5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotICAgIHBhY2tlZFJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlMyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VDb3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgRHluYW1pY01lc3NhZ2UgY29weSA9IER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIobWVzc2FnZSkuYnVpbGQoKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oY29weSk7Ci0KLSAgICAvLyBUZXN0IG9uZW9mIGJlaGF2aW9yCi0gICAgRmllbGREZXNjcmlwdG9yIGJ5dGVzRmllbGQgPQotICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib25lb2ZfYnl0ZXMiKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgdWludDMyRmllbGQgPQotICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib25lb2ZfdWludDMyIik7Ci0gICAgYXNzZXJ0VHJ1ZShjb3B5Lmhhc0ZpZWxkKGJ5dGVzRmllbGQpKTsKLSAgICBhc3NlcnRGYWxzZShjb3B5Lmhhc0ZpZWxkKHVpbnQzMkZpZWxkKSk7Ci0gICAgRHluYW1pY01lc3NhZ2UgY29weTIgPQotICAgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKG1lc3NhZ2UpLnNldEZpZWxkKHVpbnQzMkZpZWxkLCAxMjMpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2UoY29weTIuaGFzRmllbGQoYnl0ZXNGaWVsZCkpOwotICAgIGFzc2VydFRydWUoY29weTIuaGFzRmllbGQodWludDMyRmllbGQpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBjb3B5Mi5nZXRGaWVsZCh1aW50MzJGaWVsZCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIGludCB1bmtub3duRmllbGROdW0gPSA5OwotICAgIGxvbmcgdW5rbm93bkZpZWxkVmFsID0gOTA7Ci0gICAgYnVpbGRlci5zZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEZpZWxkKHVua25vd25GaWVsZE51bSwKLSAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkVmFyaW50KHVua25vd25GaWVsZFZhbCkuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkpOwotICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBEeW5hbWljTWVzc2FnZSBkZXJpdmVkID0gbWVzc2FnZS50b0J1aWxkZXIoKS5idWlsZCgpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihkZXJpdmVkKTsKLSAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCh1bmtub3duRmllbGRWYWwpLAotICAgICAgICBkZXJpdmVkLmdldFVua25vd25GaWVsZHMoKS5nZXRGaWVsZCh1bmtub3duRmllbGROdW0pLmdldFZhcmludExpc3QoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY09uZW9mTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgT25lb2ZEZXNjcmlwdG9yIG9uZW9mID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5nZXRPbmVvZnMoKS5nZXQoMCk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5oYXNPbmVvZihvbmVvZikpOwotICAgIGFzc2VydFNhbWUobnVsbCwgYnVpbGRlci5nZXRPbmVvZkZpZWxkRGVzY3JpcHRvcihvbmVvZikpOwotCi0gICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5oYXNPbmVvZihvbmVvZikpOwotICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IG9uZW9mLmdldEZpZWxkKDMpOwotICAgIGFzc2VydFNhbWUoZmllbGQsIGJ1aWxkZXIuZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3Iob25lb2YpKTsKLQotICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNPbmVvZihvbmVvZikpOwotCi0gICAgRHluYW1pY01lc3NhZ2UuQnVpbGRlciBtZXJnZWRCdWlsZGVyID0KLSAgICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgbWVyZ2VkRmllbGQgPSBvbmVvZi5nZXRGaWVsZCgwKTsKLSAgICBtZXJnZWRCdWlsZGVyLnNldEZpZWxkKG1lcmdlZEZpZWxkLCAxMjMpOwotICAgIGFzc2VydFRydWUobWVyZ2VkQnVpbGRlci5oYXNGaWVsZChtZXJnZWRGaWVsZCkpOwotICAgIG1lcmdlZEJ1aWxkZXIubWVyZ2VGcm9tKG1lc3NhZ2UpOwotICAgIGFzc2VydFRydWUobWVyZ2VkQnVpbGRlci5oYXNGaWVsZChmaWVsZCkpOwotICAgIGFzc2VydEZhbHNlKG1lcmdlZEJ1aWxkZXIuaGFzRmllbGQobWVyZ2VkRmllbGQpKTsKLQotICAgIGJ1aWxkZXIuY2xlYXJPbmVvZihvbmVvZik7Ci0gICAgYXNzZXJ0U2FtZShudWxsLCBidWlsZGVyLmdldE9uZW9mRmllbGREZXNjcmlwdG9yKG9uZW9mKSk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRTYW1lKG51bGwsIG1lc3NhZ2UuZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3Iob25lb2YpKTsKLSAgfQotCi0gIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYSBidWcgdGhhdCBtYWtlcyBzZXRGaWVsZCgpIG5vdCB3b3JrIGZvciByZXBlYXRlZAotICAvLyBlbnVtIGZpZWxkcy4KLSAgcHVibGljIHZvaWQgdGVzdFNldHRlcnNGb3JSZXBlYXRlZEVudW1GaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkRW51bUZpZWxkID0KLSAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoCi0gICAgICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW0iKTsKLSAgICBFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLmdldERlc2NyaXB0b3IoKTsKLSAgICBidWlsZGVyLnNldEZpZWxkKHJlcGVhdGVkRW51bUZpZWxkLCBlbnVtRGVzY3JpcHRvci5nZXRWYWx1ZXMoKSk7Ci0gICAgRHluYW1pY01lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIGVudW1EZXNjcmlwdG9yLmdldFZhbHVlcygpLCBtZXNzYWdlLmdldEZpZWxkKHJlcGVhdGVkRW51bUZpZWxkKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRW51bVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRW51bVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTRjNzQwNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0VudW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuRm9yZWlnbkVudW1MaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxUeXBlc0xpdGU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduRW51bTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotcHVibGljIGNsYXNzIEVudW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAKLSAgcHVibGljIHZvaWQgdGVzdEZvck51bWJlcigpIHsKLSAgICBGb3JlaWduRW51bSBlID0gRm9yZWlnbkVudW0uZm9yTnVtYmVyKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLmdldE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIGUpOwotCi0gICAgZSA9IEZvcmVpZ25FbnVtLmZvck51bWJlcigxMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RGb3JOdW1iZXJfb25lb2YoKSB7Ci0gICAgVGVzdEFsbFR5cGVzLk9uZW9mRmllbGRDYXNlIGUgPSBUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZENhc2UuZm9yTnVtYmVyKAotICAgICAgICBUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZENhc2UuT05FT0ZfTkVTVEVEX01FU1NBR0UuZ2V0TnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZENhc2UuT05FT0ZfTkVTVEVEX01FU1NBR0UsIGUpOwotCi0gICAgZSA9IFRlc3RBbGxUeXBlcy5PbmVvZkZpZWxkQ2FzZS5mb3JOdW1iZXIoMTAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG51bGwsIGUpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Rm9yTnVtYmVyTGl0ZSgpIHsKLSAgICBGb3JlaWduRW51bUxpdGUgZSA9IEZvcmVpZ25FbnVtTGl0ZS5mb3JOdW1iZXIoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIuZ2V0TnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwgZSk7Ci0KLSAgICBlID0gRm9yZWlnbkVudW1MaXRlLmZvck51bWJlcigxMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RGb3JOdW1iZXJMaXRlX29uZW9mKCkgewotICAgIFRlc3RBbGxUeXBlc0xpdGUuT25lb2ZGaWVsZENhc2UgZSA9IFRlc3RBbGxUeXBlc0xpdGUuT25lb2ZGaWVsZENhc2UuZm9yTnVtYmVyKAotICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk9uZW9mRmllbGRDYXNlLk9ORU9GX05FU1RFRF9NRVNTQUdFLmdldE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5PbmVvZkZpZWxkQ2FzZS5PTkVPRl9ORVNURURfTUVTU0FHRSwgZSk7Ci0KLSAgICBlID0gVGVzdEFsbFR5cGVzTGl0ZS5PbmVvZkZpZWxkQ2FzZS5mb3JOdW1iZXIoMTAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG51bGwsIGUpOwotICB9Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmllbGRQcmVzZW5jZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmllbGRQcmVzZW5jZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzA0Y2VjNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkUHJlc2VuY2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNzMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkZpZWxkUHJlc2VuY2VUZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRmllbGRQcmVzZW5jZVRlc3RQcm90by5UZXN0T3B0aW9uYWxGaWVsZHNPbmx5OwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRmllbGRQcmVzZW5jZVRlc3RQcm90by5UZXN0UmVwZWF0ZWRGaWVsZHNPbmx5OwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVW5pdCB0ZXN0cyBmb3IgcHJvdG9zIHRoYXQgZG9lc24ndCBzdXBwb3J0IGZpZWxkIHByZXNlbmNlIHRlc3QgZm9yIG9wdGlvbmFsCi0gKiBub24tbWVzc2FnZSBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZFByZXNlbmNlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBoYXNNZXRob2QoQ2xhc3M8Pz4gY2xhenosIFN0cmluZyBuYW1lKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGlmIChjbGF6ei5nZXRNZXRob2QobmFtZSkgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0SGFzTWV0aG9kUmVtb3ZlZCgKLSAgICAgIENsYXNzPD8+IGNsYXNzV2l0aEZpZWxkUHJlc2VuY2UsCi0gICAgICBDbGFzczw/PiBjbGFzc1dpdGhvdXRGaWVsZFByZXNlbmNlLAotICAgICAgU3RyaW5nIGNhbWVsTmFtZSkgewotICAgIGFzc2VydFRydWUoaGFzTWV0aG9kKGNsYXNzV2l0aEZpZWxkUHJlc2VuY2UsICJnZXQiICsgY2FtZWxOYW1lKSk7Ci0gICAgYXNzZXJ0VHJ1ZShoYXNNZXRob2QoY2xhc3NXaXRoRmllbGRQcmVzZW5jZSwgImhhcyIgKyBjYW1lbE5hbWUpKTsKLSAgICBhc3NlcnRUcnVlKGhhc01ldGhvZChjbGFzc1dpdGhvdXRGaWVsZFByZXNlbmNlLCAiZ2V0IiArIGNhbWVsTmFtZSkpOwotICAgIGFzc2VydEZhbHNlKGhhc01ldGhvZChjbGFzc1dpdGhvdXRGaWVsZFByZXNlbmNlLCAiaGFzIiArIGNhbWVsTmFtZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEhhc01ldGhvZCgpIHsKLSAgICAvLyBPcHRpb25hbCBub24tbWVzc2FnZSBmaWVsZHMgZG9uJ3QgaGF2ZSBhIGhhc0ZvbygpIG1ldGhvZCBnZW5lcmF0ZWQuCi0gICAgYXNzZXJ0SGFzTWV0aG9kUmVtb3ZlZCgKLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5jbGFzcywKLSAgICAgICAgIk9wdGlvbmFsSW50MzIiKTsKLSAgICBhc3NlcnRIYXNNZXRob2RSZW1vdmVkKAotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5jbGFzcywKLSAgICAgICAgVGVzdEFsbFR5cGVzLmNsYXNzLAotICAgICAgICAiT3B0aW9uYWxTdHJpbmciKTsKLSAgICBhc3NlcnRIYXNNZXRob2RSZW1vdmVkKAotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5jbGFzcywKLSAgICAgICAgVGVzdEFsbFR5cGVzLmNsYXNzLAotICAgICAgICAiT3B0aW9uYWxCeXRlcyIpOwotICAgIGFzc2VydEhhc01ldGhvZFJlbW92ZWQoCi0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLmNsYXNzLAotICAgICAgICBUZXN0QWxsVHlwZXMuY2xhc3MsCi0gICAgICAgICJPcHRpb25hbE5lc3RlZEVudW0iKTsKLQotICAgIGFzc2VydEhhc01ldGhvZFJlbW92ZWQoCi0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLkJ1aWxkZXIuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyLmNsYXNzLAotICAgICAgICAiT3B0aW9uYWxJbnQzMiIpOwotICAgIGFzc2VydEhhc01ldGhvZFJlbW92ZWQoCi0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLkJ1aWxkZXIuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyLmNsYXNzLAotICAgICAgICAiT3B0aW9uYWxTdHJpbmciKTsKLSAgICBhc3NlcnRIYXNNZXRob2RSZW1vdmVkKAotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5CdWlsZGVyLmNsYXNzLAotICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlci5jbGFzcywKLSAgICAgICAgIk9wdGlvbmFsQnl0ZXMiKTsKLSAgICBhc3NlcnRIYXNNZXRob2RSZW1vdmVkKAotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5CdWlsZGVyLmNsYXNzLAotICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlci5jbGFzcywKLSAgICAgICAgIk9wdGlvbmFsTmVzdGVkRW51bSIpOwotCi0gICAgLy8gbWVzc2FnZSBmaWVsZHMgc3RpbGwgaGF2ZSB0aGUgaGFzRm9vKCkgbWV0aG9kIGdlbmVyYXRlZC4KLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCkuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKCkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKCkpOwotCi0gICAgLy8gb25lb2YgZmllbGRzIGRvbid0IGhhdmUgaGFzRm9vKCkgbWV0aG9kcyAoZXZlbiBmb3IgbWVzc2FnZSB0eXBlcykuCi0gICAgYXNzZXJ0SGFzTWV0aG9kUmVtb3ZlZCgKLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5jbGFzcywKLSAgICAgICAgIk9uZW9mVWludDMyIik7Ci0gICAgYXNzZXJ0SGFzTWV0aG9kUmVtb3ZlZCgKLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5jbGFzcywKLSAgICAgICAgIk9uZW9mU3RyaW5nIik7Ci0gICAgYXNzZXJ0SGFzTWV0aG9kUmVtb3ZlZCgKLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5jbGFzcywKLSAgICAgICAgIk9uZW9mQnl0ZXMiKTsKLSAgICBhc3NlcnRIYXNNZXRob2RSZW1vdmVkKAotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5jbGFzcywKLSAgICAgICAgVGVzdEFsbFR5cGVzLmNsYXNzLAotICAgICAgICAiT25lb2ZOZXN0ZWRNZXNzYWdlIik7Ci0KLSAgICBhc3NlcnRIYXNNZXRob2RSZW1vdmVkKAotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5CdWlsZGVyLmNsYXNzLAotICAgICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlci5jbGFzcywKLSAgICAgICAgIk9uZW9mVWludDMyIik7Ci0gICAgYXNzZXJ0SGFzTWV0aG9kUmVtb3ZlZCgKLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMuQnVpbGRlci5jbGFzcywKLSAgICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIuY2xhc3MsCi0gICAgICAgICJPbmVvZlN0cmluZyIpOwotICAgIGFzc2VydEhhc01ldGhvZFJlbW92ZWQoCi0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLkJ1aWxkZXIuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyLmNsYXNzLAotICAgICAgICAiT25lb2ZCeXRlcyIpOwotICAgIGFzc2VydEhhc01ldGhvZFJlbW92ZWQoCi0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLkJ1aWxkZXIuY2xhc3MsCi0gICAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyLmNsYXNzLAotICAgICAgICAiT25lb2ZOZXN0ZWRNZXNzYWdlIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTEgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgLy8gU2V0IG1lc3NhZ2UyJ3Mgb25lb2ZfdWludDMyIGZpZWxkIHRvIGRlZmFsdXQgdmFsdWUuIFRoZSB0d28KLSAgICAvLyBtZXNzYWdlcyBzaG91bGQgYmUgZGlmZmVyZW50IHdoZW4gY2hlY2sgd2l0aCBvbmVvZiBjYXNlLgotICAgIGJ1aWxkZXIuc2V0T25lb2ZVaW50MzIoMCk7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UxLmVxdWFscyhtZXNzYWdlMikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEZpZWxkUHJlc2VuY2UoKSB7Ci0gICAgLy8gT3B0aW9uYWwgbm9uLW1lc3NhZ2UgZmllbGRzIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlIGFyZSB0cmVhdGVkIHRoZQotICAgIC8vIHNhbWUgd2F5IGFzIG5vdCBzZXQuCi0KLSAgICAvLyBTZXJpYWxpemF0aW9uIHdpbGwgaWdub3JlIHN1Y2ggZmllbGRzLgotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigwKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU3RyaW5nKCIiKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsQnl0ZXMoQnl0ZVN0cmluZy5FTVBUWSk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIC8vIG1lcmdlRnJvbSgpIHdpbGwgaWdub3JlIHN1Y2ggZmllbGRzLgotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGEgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGEuc2V0T3B0aW9uYWxJbnQzMigxKTsKLSAgICBhLnNldE9wdGlvbmFsU3RyaW5nKCJ4Iik7Ci0gICAgYS5zZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJ5IikpOwotICAgIGEuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYiA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYi5zZXRPcHRpb25hbEludDMyKDApOwotICAgIGIuc2V0T3B0aW9uYWxTdHJpbmcoIiIpOwotICAgIGIuc2V0T3B0aW9uYWxCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKTsKLSAgICBiLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08pOwotICAgIGEubWVyZ2VGcm9tKGIuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZSA9IGEuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygieCIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJ5IiksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKLQotICAgIC8vIGVxdWFscygpL2hhc2hDb2RlKCkgc2hvdWxkIHByb2R1Y2UgdGhlIHNhbWUgcmVzdWx0cy4KLSAgICBUZXN0QWxsVHlwZXMgZW1wdHkgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKGVtcHR5LmVxdWFscyhtZXNzYWdlKSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmVxdWFscyhlbXB0eSkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eS5oYXNoQ29kZSgpLCBtZXNzYWdlLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEZpZWxkUHJlc2VuY2VCeVJlZmxlY3Rpb24oKSB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKLSAgICBGaWVsZERlc2NyaXB0b3Igb3B0aW9uYWxJbnQzMkZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7Ci0gICAgRmllbGREZXNjcmlwdG9yIG9wdGlvbmFsU3RyaW5nRmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfc3RyaW5nIik7Ci0gICAgRmllbGREZXNjcmlwdG9yIG9wdGlvbmFsQnl0ZXNGaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9ieXRlcyIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBvcHRpb25hbE5lc3RlZEVudW1GaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOwotCi0gICAgLy8gRmllbGQgbm90IHByZXNlbnQuCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChvcHRpb25hbEludDMyRmllbGQpKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKG9wdGlvbmFsU3RyaW5nRmllbGQpKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKG9wdGlvbmFsQnl0ZXNGaWVsZCkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQob3B0aW9uYWxOZXN0ZWRFbnVtRmllbGQpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRBbGxGaWVsZHMoKS5zaXplKCkpOwotCi0gICAgLy8gRmllbGQgc2V0IHRvIGRlZmF1bHQgdmFsdWUgaXMgc2VlbiBhcyBub3QgcHJlc2VudC4KLSAgICBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigwKQotICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoIiIpCi0gICAgICAgIC5zZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuRU1QVFkpCi0gICAgICAgIC5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKG9wdGlvbmFsSW50MzJGaWVsZCkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQob3B0aW9uYWxTdHJpbmdGaWVsZCkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQob3B0aW9uYWxCeXRlc0ZpZWxkKSk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChvcHRpb25hbE5lc3RlZEVudW1GaWVsZCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEFsbEZpZWxkcygpLnNpemUoKSk7Ci0KLSAgICAvLyBGaWVsZCBzZXQgdG8gbm9uLWRlZmF1bHQgdmFsdWUgaXMgc2VlbiBhcyBwcmVzZW50LgotICAgIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbEludDMyKDEpCi0gICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygieCIpCi0gICAgICAgIC5zZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJ5IikpCi0gICAgICAgIC5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQob3B0aW9uYWxJbnQzMkZpZWxkKSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKG9wdGlvbmFsU3RyaW5nRmllbGQpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQob3B0aW9uYWxCeXRlc0ZpZWxkKSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKG9wdGlvbmFsTmVzdGVkRW51bUZpZWxkKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2UuZ2V0QWxsRmllbGRzKCkuc2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlRmllbGQoKSB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5idWlsZCgpLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSgpKTsKLQotICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgbmVzdGVkQnVpbGRlciA9Ci0gICAgICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlQnVpbGRlcigpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmJ1aWxkKCkuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKCkpOwotCi0gICAgbmVzdGVkQnVpbGRlci5zZXRWYWx1ZSgxKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlci5idWlsZCgpLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldFZhbHVlKCkpOwotCi0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKCkpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuYnVpbGQoKS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKSk7Ci0KLSAgICAvLyBVbmxpa2Ugbm9uLW1lc3NhZ2UgZmllbGRzLCBpZiB3ZSBzZXQgYSBtZXNzYWdlIGZpZWxkIHRvIGl0cyBkZWZhdWx0IHZhbHVlIChpLmUuLAotICAgIC8vIGRlZmF1bHQgaW5zdGFuY2UpLCB0aGUgZmllbGQgc2hvdWxkIGJlIHNlZW4gYXMgcHJlc2VudC4KLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuYnVpbGQoKS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplQW5kUGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMTIzNCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbFN0cmluZygiaGVsbG8iKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgLy8gU2V0IGFuIG9uZW9mIGZpZWxkIHRvIGl0cyBkZWZhdWx0IHZhbHVlIGFuZCBleHBlY3QgaXQgdG8gYmUgc2VyaWFsaXplZCAoaS5lLiwKLSAgICAvLyBhbiBvbmVvZiBmaWVsZCBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgcHJlc2VudCkuCi0gICAgYnVpbGRlci5zZXRPbmVvZkludDMyKDApOwotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IGJ1aWxkZXIuYnVpbGQoKS50b0J5dGVTdHJpbmcoKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgbWVzc2FnZS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICAgIC8vIEZpZWxkcyBub3Qgc2V0IHdpbGwgaGF2ZSB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICBhc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRPcHRpb25hbEJ5dGVzKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgIC8vIFRoZSBtZXNzYWdlIGZpZWxkIGlzIHNldCBkZXNwaXRlIHRoYXQgaXQncyBzZXQgd2l0aCBhIGRlZmF1bHQgaW5zdGFuY2UuCi0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKS5nZXRWYWx1ZSgpKTsKLSAgICAvLyBUaGUgb25lb2YgZmllbGQgc2V0IHRvIGl0cyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gcHJlc2VudC4KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIFRlc3RBbGxUeXBlcy5PbmVvZkZpZWxkQ2FzZS5PTkVPRl9JTlQzMiwgbWVzc2FnZS5nZXRPbmVvZkZpZWxkQ2FzZSgpKTsKLSAgfQotCi0gIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYi8xNjE3MzM5NwotICAvLyBNYWtlIHN1cmUgd2UgaGF2ZW4ndCBzY3Jld2VkIHVwIHRoZSBjb2RlIGdlbmVyYXRpb24gZm9yIHJlcGVhdGVkIGZpZWxkcy4KLSAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDEyMzQpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTdHJpbmcoImhlbGxvIik7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMig0MzIxKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU3RyaW5nKCJ3b3JsZCIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBidWlsZGVyLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBUZXN0T3B0aW9uYWxGaWVsZHNPbmx5IG9wdGlvbmFsT25seU1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxGaWVsZHNPbmx5LnBhcnNlRnJvbShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgb3B0aW9uYWxPbmx5TWVzc2FnZS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBvcHRpb25hbE9ubHlNZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICAgIGFzc2VydFRydWUob3B0aW9uYWxPbmx5TWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG9wdGlvbmFsT25seU1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKCkuZ2V0VmFsdWUoKSk7Ci0KLSAgICBUZXN0UmVwZWF0ZWRGaWVsZHNPbmx5IHJlcGVhdGVkT25seU1lc3NhZ2UgPSBUZXN0UmVwZWF0ZWRGaWVsZHNPbmx5LnBhcnNlRnJvbShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgcmVwZWF0ZWRPbmx5TWVzc2FnZS5nZXRSZXBlYXRlZEludDMyQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQzMjEsIHJlcGVhdGVkT25seU1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMigwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlcGVhdGVkT25seU1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgcmVwZWF0ZWRPbmx5TWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlcGVhdGVkT25seU1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIHJlcGVhdGVkT25seU1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKDApLmdldFZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdElzSW5pdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLQotICAgIC8vIFRlc3Qgb3B0aW9uYWwgcHJvdG8yIG1lc3NhZ2UgZmllbGRzLgotICAgIFVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkLkJ1aWxkZXIgcHJvdG8yQnVpbGRlciA9Ci0gICAgICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxQcm90bzJNZXNzYWdlQnVpbGRlcigpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmJ1aWxkUGFydGlhbCgpLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBwcm90bzJCdWlsZGVyLnNldEEoMSkuc2V0QigyKS5zZXRDKDMpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgLy8gVGVzdCBvbmVvZiBwcm90bzIgbWVzc2FnZSBmaWVsZHMuCi0gICAgcHJvdG8yQnVpbGRlciA9IGJ1aWxkZXIuZ2V0T25lb2ZQcm90bzJNZXNzYWdlQnVpbGRlcigpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmJ1aWxkUGFydGlhbCgpLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBwcm90bzJCdWlsZGVyLnNldEEoMSkuc2V0QigyKS5zZXRDKDMpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgLy8gVGVzdCByZXBlYXRlZCBwcm90bzIgbWVzc2FnZSBmaWVsZHMuCi0gICAgcHJvdG8yQnVpbGRlciA9IGJ1aWxkZXIuYWRkUmVwZWF0ZWRQcm90bzJNZXNzYWdlQnVpbGRlcigpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmJ1aWxkUGFydGlhbCgpLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBwcm90bzJCdWlsZGVyLnNldEEoMSkuc2V0QigyKS5zZXRDKDMpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLQotICAvLyBUZXN0IHRoYXQgdW5rbm93biBmaWVsZHMgYXJlIGRyb3BwZWQuCi0gIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDEyMzQpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMig1Njc4KTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotCi0gICAgVGVzdE9wdGlvbmFsRmllbGRzT25seSBvcHRpb25hbE9ubHlNZXNzYWdlID0KLSAgICAgICAgVGVzdE9wdGlvbmFsRmllbGRzT25seS5wYXJzZUZyb20oZGF0YSk7Ci0gICAgLy8gVW5rbm93bkZpZWxkU2V0IHNob3VsZCBiZSBlbXB0eS4KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDAsIG9wdGlvbmFsT25seU1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLnRvQnl0ZVN0cmluZygpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMzQsIG9wdGlvbmFsT25seU1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShvcHRpb25hbE9ubHlNZXNzYWdlLnRvQnl0ZVN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgbWVzc2FnZS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIC8vIFRoZSByZXBlYXRlZCBmaWVsZCBpcyBkaXNjYXJkZWQgYmVjYXVzZSBpdCdzIHVua25vd24gdG8gdGhlIG9wdGlvbmFsLW9ubHkKLSAgICAvLyBtZXNzYWdlLgotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJDb3VudCgpKTsKLQotICAgIER5bmFtaWNNZXNzYWdlIGR5bmFtaWNPcHRpb25hbE9ubHlNZXNzYWdlID0KLSAgICAgICAgRHluYW1pY01lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKAotICAgICAgICAgICAgVGVzdE9wdGlvbmFsRmllbGRzT25seS5nZXREZXNjcmlwdG9yKCkpCi0gICAgICAgIC5nZXRQYXJzZXJGb3JUeXBlKCkucGFyc2VGcm9tKGRhdGEpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgMCwgZHluYW1pY09wdGlvbmFsT25seU1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLnRvQnl0ZVN0cmluZygpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG9wdGlvbmFsT25seU1lc3NhZ2UudG9CeXRlU3RyaW5nKCksCi0gICAgICAgIGR5bmFtaWNPcHRpb25hbE9ubHlNZXNzYWdlLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GbG9hdEFycmF5TGlzdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmxvYXRBcnJheUxpc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg4YTc1NzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GbG9hdEFycmF5TGlzdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgc3RhdGljIGphdmEudXRpbC5BcnJheXMuYXNMaXN0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5Db25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIEZsb2F0QXJyYXlMaXN0fS4KLSAqIAotICogQGF1dGhvciBkd2Vpc0Bnb29nbGUuY29tIChEYW5pZWwgV2VpcykKLSAqLwotcHVibGljIGNsYXNzIEZsb2F0QXJyYXlMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZsb2F0QXJyYXlMaXN0IFVOQVJZX0xJU1QgPSBuZXdJbW11dGFibGVGbG9hdEFycmF5TGlzdCgxKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmxvYXRBcnJheUxpc3QgVEVSVElBUllfTElTVCA9Ci0gICAgICBuZXdJbW11dGFibGVGbG9hdEFycmF5TGlzdCgxLCAyLCAzKTsKLSAgCi0gIHByaXZhdGUgRmxvYXRBcnJheUxpc3QgbGlzdDsKLSAgCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGxpc3QgPSBuZXcgRmxvYXRBcnJheUxpc3QoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEVtcHR5TGlzdFJldHVybnNTYW1lSW5zdGFuY2UoKSB7Ci0gICAgYXNzZXJ0U2FtZShGbG9hdEFycmF5TGlzdC5lbXB0eUxpc3QoKSwgRmxvYXRBcnJheUxpc3QuZW1wdHlMaXN0KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMaXN0SXNJbW11dGFibGUoKSB7Ci0gICAgYXNzZXJ0SW1tdXRhYmxlKEZsb2F0QXJyYXlMaXN0LmVtcHR5TGlzdCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1ha2VJbW11dGFibGUoKSB7Ci0gICAgbGlzdC5hZGRGbG9hdCgyKTsKLSAgICBsaXN0LmFkZEZsb2F0KDQpOwotICAgIGxpc3QuYWRkRmxvYXQoNik7Ci0gICAgbGlzdC5hZGRGbG9hdCg4KTsKLSAgICBsaXN0Lm1ha2VJbW11dGFibGUoKTsKLSAgICBhc3NlcnRJbW11dGFibGUobGlzdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RpZmljYXRpb25XaXRoSXRlcmF0aW9uKCkgewotICAgIGxpc3QuYWRkQWxsKGFzTGlzdCgxRiwgMkYsIDNGLCA0RikpOwotICAgIEl0ZXJhdG9yPEZsb2F0PiBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgbGlzdC5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxRiwgKGZsb2F0KSBsaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFGLCAoZmxvYXQpIGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgbGlzdC5zZXQoMCwgMUYpOwotICAgIGFzc2VydEVxdWFscygyRiwgKGZsb2F0KSBpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGxpc3QucmVtb3ZlKDApOwotICAgIHRyeSB7Ci0gICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICBsaXN0LmFkZCgwLCAwRik7Ci0gICAgdHJ5IHsKLSAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0KCkgewotICAgIGFzc2VydEVxdWFscygxRiwgKGZsb2F0KSBURVJUSUFSWV9MSVNULmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDJGLCAoZmxvYXQpIFRFUlRJQVJZX0xJU1QuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoM0YsIChmbG9hdCkgVEVSVElBUllfTElTVC5nZXQoMikpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICBURVJUSUFSWV9MSVNULmdldCgtMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgVEVSVElBUllfTElTVC5nZXQoMyk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldEZsb2F0KCkgewotICAgIGFzc2VydEVxdWFscygxRiwgVEVSVElBUllfTElTVC5nZXRGbG9hdCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDJGLCBURVJUSUFSWV9MSVNULmdldEZsb2F0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoM0YsIFRFUlRJQVJZX0xJU1QuZ2V0RmxvYXQoMikpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICBURVJUSUFSWV9MSVNULmdldCgtMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgVEVSVElBUllfTElTVC5nZXQoMyk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIEZsb2F0QXJyYXlMaXN0LmVtcHR5TGlzdCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIFVOQVJZX0xJU1Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgVEVSVElBUllfTElTVC5zaXplKCkpOwotCi0gICAgbGlzdC5hZGRGbG9hdCgyKTsKLSAgICBsaXN0LmFkZEZsb2F0KDQpOwotICAgIGxpc3QuYWRkRmxvYXQoNik7Ci0gICAgbGlzdC5hZGRGbG9hdCg4KTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgbGlzdC5zaXplKCkpOwotICAgIAotICAgIGxpc3QucmVtb3ZlKDApOwotICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0gICAgCi0gICAgbGlzdC5hZGQoMTZGKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgbGlzdC5zaXplKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotICAgIGxpc3QuYWRkRmxvYXQoMik7Ci0gICAgbGlzdC5hZGRGbG9hdCg0KTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMoMkYsIChmbG9hdCkgbGlzdC5zZXQoMCwgMEYpKTsKLSAgICBhc3NlcnRFcXVhbHMoMEYsIGxpc3QuZ2V0RmxvYXQoMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDRGLCAoZmxvYXQpIGxpc3Quc2V0KDEsIDBGKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBGLCBsaXN0LmdldEZsb2F0KDEpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoLTEsIDBGKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDIsIDBGKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2V0RmxvYXQoKSB7Ci0gICAgbGlzdC5hZGRGbG9hdCgyKTsKLSAgICBsaXN0LmFkZEZsb2F0KDQpOwotICAgIAotICAgIGFzc2VydEVxdWFscygyRiwgbGlzdC5zZXRGbG9hdCgwLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBGLCBsaXN0LmdldEZsb2F0KDApKTsKLQotICAgIGFzc2VydEVxdWFscyg0RiwgbGlzdC5zZXRGbG9hdCgxLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBGLCBsaXN0LmdldEZsb2F0KDEpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXRGbG9hdCgtMSwgMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LnNldEZsb2F0KDIsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQotICAgIGFzc2VydFRydWUobGlzdC5hZGQoMkYpKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDJGKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRUcnVlKGxpc3QuYWRkKDNGKSk7Ci0gICAgbGlzdC5hZGQoMCwgNEYpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoNEYsIDJGLCAzRiksIGxpc3QpOwotICAgIAotICAgIGxpc3QuYWRkKDAsIDFGKTsKLSAgICBsaXN0LmFkZCgwLCAwRik7Ci0gICAgLy8gRm9yY2UgYSByZXNpemUgYnkgZ2V0dGluZyB1cCB0byAxMSBlbGVtZW50cy4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgbGlzdC5hZGQoRmxvYXQudmFsdWVPZig1ICsgaSkpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDBGLCAxRiwgNEYsIDJGLCAzRiwgNUYsIDZGLCA3RiwgOEYsIDlGLCAxMEYpLCBsaXN0KTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoLTEsIDVGKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZCg0LCA1Rik7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZEZsb2F0KCkgewotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LnNpemUoKSk7Ci0KLSAgICBsaXN0LmFkZEZsb2F0KDIpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMkYpLCBsaXN0KTsKLQotICAgIGxpc3QuYWRkRmxvYXQoMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyRiwgM0YpLCBsaXN0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZEFsbCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oMUYpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUYsIChmbG9hdCkgbGlzdC5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscygxRiwgbGlzdC5nZXRGbG9hdCgwKSk7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZEFsbChhc0xpc3QoMkYsIDNGLCA0RiwgNUYsIDZGKSkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMUYsIDJGLCAzRiwgNEYsIDVGLCA2RiksIGxpc3QpOwotICAgIAotICAgIGFzc2VydFRydWUobGlzdC5hZGRBbGwoVEVSVElBUllfTElTVCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMUYsIDJGLCAzRiwgNEYsIDVGLCA2RiwgMUYsIDJGLCAzRiksIGxpc3QpOwotCi0gICAgYXNzZXJ0RmFsc2UobGlzdC5hZGRBbGwoQ29sbGVjdGlvbnMuPEZsb2F0PmVtcHR5TGlzdCgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UobGlzdC5hZGRBbGwoRmxvYXRBcnJheUxpc3QuZW1wdHlMaXN0KCkpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLSAgICBsaXN0LmFkZEFsbChURVJUSUFSWV9MSVNUKTsKLSAgICBhc3NlcnRFcXVhbHMoMUYsIChmbG9hdCkgbGlzdC5yZW1vdmUoMCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMkYsIDNGKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRUcnVlKGxpc3QucmVtb3ZlKEZsb2F0LnZhbHVlT2YoMykpKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDJGKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRGYWxzZShsaXN0LnJlbW92ZShGbG9hdC52YWx1ZU9mKDMpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyRiksIGxpc3QpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDJGLCAoZmxvYXQpIGxpc3QucmVtb3ZlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KCksIGxpc3QpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgtMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmUoMCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEltbXV0YWJsZShGbG9hdEFycmF5TGlzdCBsaXN0KSB7Ci0gICAgaWYgKGxpc3QuY29udGFpbnMoMUYpKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2Fubm90IHRlc3QgdGhlIGltbXV0YWJpbGl0eSBvZiBsaXN0cyB0aGF0IGNvbnRhaW4gMS4iKTsKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKDFGKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoMCwgMUYpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy48RmxvYXQ+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KDFGKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKG5ldyBGbG9hdEFycmF5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoVU5BUllfTElTVCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKDAsIENvbGxlY3Rpb25zLnNpbmdsZXRvbigxRikpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbCgwLCBVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgQ29sbGVjdGlvbnMuPEZsb2F0PmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRGbG9hdCgwKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5jbGVhcigpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKDEpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZShuZXcgT2JqZWN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChDb2xsZWN0aW9ucy48RmxvYXQ+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oMUYpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmVBbGwoVU5BUllfTElTVCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmV0YWluQWxsKENvbGxlY3Rpb25zLjxGbG9hdD5lbXB0eUxpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmV0YWluQWxsKENvbGxlY3Rpb25zLnNpbmdsZXRvbigxRikpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJldGFpbkFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoMCwgMEYpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnNldEZsb2F0KDAsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBGbG9hdEFycmF5TGlzdCBuZXdJbW11dGFibGVGbG9hdEFycmF5TGlzdChpbnQuLi4gZWxlbWVudHMpIHsKLSAgICBGbG9hdEFycmF5TGlzdCBsaXN0ID0gbmV3IEZsb2F0QXJyYXlMaXN0KCk7Ci0gICAgZm9yIChpbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0gICAgICBsaXN0LmFkZEZsb2F0KGVsZW1lbnQpOwotICAgIH0KLSAgICBsaXN0Lm1ha2VJbW11dGFibGUoKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Gb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRm9yY2VGaWVsZEJ1aWxkZXJzUHJlUnVuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI3ZWFlYmYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Gb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogQSBwcmVydW4gZm9yIGEgdGVzdCBzdWl0ZSB0aGF0IGFsbG93cyBydW5uaW5nIHRoZSBmdWxsIHByb3RvY29sIGJ1ZmZlcgotICogdGVzdHMgaW4gYSBtb2RlIHRoYXQgZGlzYWJsZXMgdGhlIG9wdGltaXphdGlvbiBmb3Igbm90IHVzaW5nCi0gKiB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9IGFuZCB7QGxpbmsgU2luZ2xlRmllbGRCdWlsZGVyfSB1bnRpbCB0aGV5IGFyZQotICogcmVxdWVzdGVkLiBUaGlzIGFsbG93cyB1cyB0byBydW4gYWxsIHRoZSB0ZXN0cyB0aHJvdWdoIGJvdGggY29kZSBwYXRocwotICogYW5kIGVuc3VyZXMgdGhhdCBib3RoIGNvZGUgcGF0aHMgcHJvZHVjZSBpZGVudGljYWwgcmVzdWx0cy4KLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqLwotcHVibGljIGNsYXNzIEZvcmNlRmllbGRCdWlsZGVyc1ByZVJ1biBpbXBsZW1lbnRzIFJ1bm5hYmxlIHsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgcnVuKCkgewotICAgIEdlbmVyYXRlZE1lc3NhZ2UuZW5hYmxlQWx3YXlzVXNlRmllbGRCdWlsZGVyc0ZvclRlc3RpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWI4YjYzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NzYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0OwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LkVudW1XaXRoTm9PdXRlcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5NZXNzYWdlV2l0aE5vT3V0ZXI7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTXVsdGlwbGVGaWxlc1Rlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5OZXN0ZWRFeHRlbnNpb24uTXlOZXN0ZWRFeHRlbnNpb247Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTmVzdGVkRXh0ZW5zaW9uTGl0ZS5NeU5lc3RlZEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTm9uTmVzdGVkRXh0ZW5zaW9uOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbi5NZXNzYWdlVG9CZUV4dGVuZGVkOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbi5NeU5vbk5lc3RlZEV4dGVuc2lvbjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbkxpdGUuTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQ7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZS5NeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuT3V0ZXJDbGFzc05hbWVUZXN0Mk91dGVyQ2xhc3M7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuT3V0ZXJDbGFzc05hbWVUZXN0M091dGVyQ2xhc3M7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuT3V0ZXJDbGFzc05hbWVUZXN0T3V0ZXJDbGFzczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5TZXJ2aWNlV2l0aE5vT3V0ZXI7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RPcHRpbWl6ZUZvci5UZXN0T3B0aW1pemVkRm9yU2l6ZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RPcHRpbWl6ZUZvci5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduRW51bTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25NZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXI7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5OZXN0ZWRUZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdE9uZW9mMjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RVbnBhY2tlZFR5cGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIGdlbmVyYXRlZCBtZXNzYWdlcyBhbmQgZ2VuZXJhdGVkIGNvZGUuICBTZWUgYWxzbwotICoge0BsaW5rIE1lc3NhZ2VUZXN0fSwgd2hpY2ggdGVzdHMgc29tZSBnZW5lcmF0ZWQgbWVzc2FnZSBmdW5jdGlvbmFsaXR5LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uVGVzdGVyID0KLSAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLCBudWxsKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKTsKLSAgICBhc3NlcnRTYW1lKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlT3JCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RVc2luZ0J1aWxkZXJNdWx0aXBsZVRpbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgLy8gcHJpbWl0aXZlIGZpZWxkIHNjYWxhciBhbmQgcmVwZWF0ZWQKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU2ZpeGVkNjQoMTAwKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMTAwKTsKLSAgICAvLyBlbnVtIGZpZWxkIHNjYWxhciBhbmQgcmVwZWF0ZWQKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbXBvcnRFbnVtKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUik7Ci0gICAgLy8gcHJvdG8gZmllbGQgc2NhbGFyIGFuZCByZXBlYXRlZAotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxKSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDEpKTsKLQotICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTEgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMTAwLCB2YWx1ZTEuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwLCB2YWx1ZTEuZ2V0UmVwZWF0ZWRJbnQzMigwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKLSAgICAgICAgdmFsdWUxLmdldE9wdGlvbmFsSW1wb3J0RW51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfQkFSLAotICAgICAgICB2YWx1ZTEuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZTEuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwKS5nZXRDKCkpOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQgYnVpbGRlciBkaWRuJ3QgdXBkYXRlIHByZXZpb3VzbHkgY3JlYXRlZCB2YWx1ZXMKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU2ZpeGVkNjQoMjAwKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkSW50MzIoMCwgMjAwKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08pOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDAsIFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0ZPTyk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDIpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCwgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMikpOwotCi0gICAgVGVzdEFsbFR5cGVzIHZhbHVlMiA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB2YWx1ZTEgZGlkbid0IGNoYW5nZS4KLSAgICBhc3NlcnRFcXVhbHMoMTAwLCB2YWx1ZTEuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwLCB2YWx1ZTEuZ2V0UmVwZWF0ZWRJbnQzMigwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKLSAgICAgICAgdmFsdWUxLmdldE9wdGlvbmFsSW1wb3J0RW51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfQkFSLAotICAgICAgICB2YWx1ZTEuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFscygxLCB2YWx1ZTEuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwKS5nZXRDKCkpOwotCi0gICAgLy8gTWFrZSBzdXJlIHZhbHVlMiBpcyBjb3JyZWN0Ci0gICAgYXNzZXJ0RXF1YWxzKDIwMCwgdmFsdWUyLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIwMCwgdmFsdWUyLmdldFJlcGVhdGVkSW50MzIoMCkpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08sCi0gICAgICAgIHZhbHVlMi5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0ZPTywKLSAgICAgICAgdmFsdWUyLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlMi5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgdmFsdWUyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQcm90b3NTaGFyZVJlcGVhdGVkQXJyYXlzSWZEaWRudENoYW5nZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigxMDApOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXMgdmFsdWUxID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTIgPSB2YWx1ZTEudG9CdWlsZGVyKCkuYnVpbGQoKTsKLQotICAgIGFzc2VydFNhbWUodmFsdWUxLmdldFJlcGVhdGVkSW50MzJMaXN0KCksIHZhbHVlMi5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRTYW1lKHZhbHVlMS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpLAotICAgICAgICB2YWx1ZTIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRBcnJheXNBcmVJbW11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMTAwKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUoYnVpbGRlci5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkSW1wb3J0RW51bUxpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUoYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOwotCi0KLSAgICBUZXN0QWxsVHlwZXMgdmFsdWUgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRJbnQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEZsb2F0TGlzdCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZWRNZXNzYWdlc0FyZUltbXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyB2YWx1ZSA9IFRlc3RBbGxUeXBlcy5wYXJzZXIoKS5wYXJzZUZyb20oVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkSW50MzJMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkSW50NjRMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkVWludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRTaW50MzJMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkU2ludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEZpeGVkMzJMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRml4ZWQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRTZml4ZWQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRTZml4ZWQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRGbG9hdExpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWREb3VibGVMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkQm9vbExpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRTdHJpbmdMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkQnl0ZXNMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkR3JvdXBMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZUxpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QoKSk7Ci0gICAgYXNzZXJ0SXNVbm1vZGlmaWFibGUodmFsdWUuZ2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZE5lc3RlZEVudW1MaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkSW1wb3J0RW51bUxpc3QoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0SXNVbm1vZGlmaWFibGUoTGlzdDw/PiBsaXN0KSB7Ci0gICAgaWYgKGxpc3QgPT0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkpIHsKLSAgICAgIC8vIE9LQVkgLS0gTmVlZCB0byBjaGVjayB0aGlzIGIvYyBFbXB0eUxpc3QgYWxsb3dzIHlvdSB0byBjYWxsIGNsZWFyLgotICAgIH0gZWxzZSB7Ci0gICAgICB0cnkgewotICAgICAgICBsaXN0LmNsZWFyKCk7Ci0gICAgICAgIGZhaWwoIkxpc3Qgd2Fzbid0IGltbXV0YWJsZSIpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBnb29kCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTdHJpbmcobnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLnNldE9wdGlvbmFsQnl0ZXMobnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpIG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoCi0gICAgICAgICAgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIpIG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZEVudW0obnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkU3RyaW5nKG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzKG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKSBudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKAotICAgICAgICAgIChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZFNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdFV0aWwubW9kaWZ5UmVwZWF0ZWRGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0KLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU3RyaW5nKCJvbmUiKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU3RyaW5nKCJ0d28iKTsKLSAgICB0cnkgewotICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZFN0cmluZygxLCBudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0KLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkQnl0ZXMoVGVzdFV0aWwudG9CeXRlcygib25lIikpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCeXRlcyhUZXN0VXRpbC50b0J5dGVzKCJ0d28iKSk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRCeXRlcygxLCBudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0KLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigyMTgpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDQ1NikuYnVpbGQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKDEsIChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLnNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAxLCAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOwotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLnNldFJlcGVhdGVkTmVzdGVkRW51bSgxLCBudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRBcHBlbmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLQotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRJbnQzMihBcnJheXMuYXNMaXN0KDEsIDIsIDMsIDQpKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRm9yZWlnbkVudW0oQXJyYXlzLmFzTGlzdChGb3JlaWduRW51bS5GT1JFSUdOX0JBWikpOwotCi0gICAgRm9yZWlnbk1lc3NhZ2UgZm9yZWlnbk1lc3NhZ2UgPQotICAgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxMikuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoQXJyYXlzLmFzTGlzdChmb3JlaWduTWVzc2FnZSkpOwotCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMkxpc3QoKSwgQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bUxpc3QoKSwKLSAgICAgICAgQXJyYXlzLmFzTGlzdChGb3JlaWduRW51bS5GT1JFSUdOX0JBWikpOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwKS5nZXRDKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkQXBwZW5kUmVqZWN0c051bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLQotICAgIEZvcmVpZ25NZXNzYWdlIGZvcmVpZ25NZXNzYWdlID0KLSAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIpLmJ1aWxkKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgKLSAgICAgICAgICBBcnJheXMuYXNMaXN0KGZvcmVpZ25NZXNzYWdlLCAoRm9yZWlnbk1lc3NhZ2UpIG51bGwpKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25FbnVtKAotICAgICAgICAgIEFycmF5cy5hc0xpc3QoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG51bGwpKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZFN0cmluZyhBcnJheXMuYXNMaXN0KCJvbmUiLCBudWxsKSk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRCeXRlcyhBcnJheXMuYXNMaXN0KFRlc3RVdGlsLnRvQnl0ZXMoIm9uZSIpLCBudWxsKSk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRBcHBlbmRJdGVyYXRlT25seU9uY2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBDcmVhdGUgYSBJdGVyYWJsZSB0aGF0IGNhbiBvbmx5IGJlIGl0ZXJhdGVkIG9uY2UuCi0gICAgSXRlcmFibGU8U3RyaW5nPiBzdHJpbmdJdGVyYWJsZSA9IG5ldyBJdGVyYWJsZTxTdHJpbmc+KCkgewotICAgICAgcHJpdmF0ZSBib29sZWFuIGNhbGxlZCA9IGZhbHNlOwotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgSXRlcmF0b3I8U3RyaW5nPiBpdGVyYXRvcigpIHsKLSAgICAgICAgaWYgKGNhbGxlZCkgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oKTsKLSAgICAgICAgfQotICAgICAgICBjYWxsZWQgPSB0cnVlOwotICAgICAgICByZXR1cm4gQXJyYXlzLmFzTGlzdCgib25lIiwgInR3byIsICJ0aHJlZSIpLml0ZXJhdG9yKCk7Ci0gICAgICB9Ci0gICAgfTsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkU3RyaW5nKHN0cmluZ0l0ZXJhYmxlKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRSZXBlYXRlZFN0cmluZ0NvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygib25lIiwgYnVpbGRlci5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ0d28iLCBidWlsZGVyLmdldFJlcGVhdGVkU3RyaW5nKDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoInRocmVlIiwgYnVpbGRlci5nZXRSZXBlYXRlZFN0cmluZygyKSk7Ci0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZFN0cmluZyhzdHJpbmdJdGVyYWJsZSk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb21PdGhlclJlamVjdHNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgICAgYnVpbGRlci5tZXJnZUZyb20oKFRlc3RBbGxUeXBlcykgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNldHRpbmdGb3JlaWduTWVzc2FnZVVzaW5nQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAvLyBQYXNzIGJ1aWxkZXIgZm9yIGZvcmVpZ24gbWVzc2FnZSBpbnN0YW5jZS4KLSAgICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIzKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbFR5cGVzIGV4cGVjdGVkTWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLy8gQ3JlYXRlIGV4cGVjdGVkIHZlcnNpb24gcGFzc2luZyBmb3JlaWduIG1lc3NhZ2UgaW5zdGFuY2UgZXhwbGljaXRseS4KLSAgICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoCi0gICAgICAgICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxMjMpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIC8vIFRPRE8obmdkKTogVXBncmFkZSB0byB1c2luZyByZWFsICNlcXVhbHMgbWV0aG9kIG9uY2UgaW1wbGVtZW50ZWQKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZXNzYWdlLnRvU3RyaW5nKCksIG1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2V0dGluZ1JlcGVhdGVkRm9yZWlnbk1lc3NhZ2VVc2luZ0J1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLy8gUGFzcyBidWlsZGVyIGZvciBmb3JlaWduIG1lc3NhZ2UgaW5zdGFuY2UuCi0gICAgICAgIC5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDQ1NikpCi0gICAgICAgIC5idWlsZCgpOwotICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZE1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC8vIENyZWF0ZSBleHBlY3RlZCB2ZXJzaW9uIHBhc3NpbmcgZm9yZWlnbiBtZXNzYWdlIGluc3RhbmNlIGV4cGxpY2l0bHkuCi0gICAgICAgIC5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKAotICAgICAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoNDU2KS5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRNZXNzYWdlLnRvU3RyaW5nKCksIG1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcihUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIFRlc3RVdGlsLmFzc2VydENsZWFyKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuYnVpbGQoKSk7Ci0KLSAgICBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMgbWVzc2FnZSA9Ci0gICAgICAgIFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICBhc3NlcnRFcXVhbHMoIlx1MTIzNCIsIG1lc3NhZ2UuZ2V0VXRmOFN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZLCBtZXNzYWdlLmdldEluZkRvdWJsZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZLCBtZXNzYWdlLmdldE5lZ0luZkRvdWJsZSgpKTsKLSAgICBhc3NlcnRUcnVlKERvdWJsZS5pc05hTihtZXNzYWdlLmdldE5hbkRvdWJsZSgpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZsb2F0LlBPU0lUSVZFX0lORklOSVRZLCBtZXNzYWdlLmdldEluZkZsb2F0KCkpOwotICAgIGFzc2VydEVxdWFscyhGbG9hdC5ORUdBVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXROZWdJbmZGbG9hdCgpKTsKLSAgICBhc3NlcnRUcnVlKEZsb2F0LmlzTmFOKG1lc3NhZ2UuZ2V0TmFuRmxvYXQoKSkpOwotICAgIGFzc2VydEVxdWFscygiPyA/ID8/ID8/ID8/PyA/Py8gPz8tIiwgbWVzc2FnZS5nZXRDcHBUcmlncmFwaCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLmFzc2VydENsZWFyKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0Q2xlYXIoYnVpbGRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvbkdldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25TZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChidWlsZGVyKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoYnVpbGRlcik7Ci0KLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25SZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbigKLSAgICAgIFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCi0gICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25HZXRPbmVvZigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2YgPQotICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmdldE9uZW9mcygpLmdldCgwKTsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQgPQotICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib25lb2ZfYnl0ZXMiKTsKLSAgICBhc3NlcnRTYW1lKGZpZWxkLCBidWlsZGVyLmdldE9uZW9mRmllbGREZXNjcmlwdG9yKG9uZW9mKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRTYW1lKGZpZWxkLCBtZXNzYWdlLmdldE9uZW9mRmllbGREZXNjcmlwdG9yKG9uZW9mKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvbkNsZWFyT25lb2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7Ci0gICAgRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIG9uZW9mID0KLSAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5nZXRPbmVvZnMoKS5nZXQoMCk7Ci0gICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkID0KLSAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoIm9uZW9mX2J5dGVzIik7Ci0KLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaGFzT25lb2Yob25lb2YpKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaGFzRmllbGQoZmllbGQpKTsKLSAgICBidWlsZGVyLmNsZWFyT25lb2Yob25lb2YpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaGFzT25lb2Yob25lb2YpKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmhhc0ZpZWxkKGZpZWxkKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RW51bUludGVyZmFjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydFRydWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLmdldERlZmF1bHROZXN0ZWRFbnVtKCkKLSAgICAgICAgaW5zdGFuY2VvZiBQcm90b2NvbE1lc3NhZ2VFbnVtKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnVtTWFwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgSW50ZXJuYWwuRW51bUxpdGVNYXA8Rm9yZWlnbkVudW0+IG1hcCA9IEZvcmVpZ25FbnVtLmludGVybmFsR2V0VmFsdWVNYXAoKTsKLQotICAgIGZvciAoRm9yZWlnbkVudW0gdmFsdWUgOiBGb3JlaWduRW51bS52YWx1ZXMoKSkgewotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBtYXAuZmluZFZhbHVlQnlOdW1iZXIodmFsdWUuZ2V0TnVtYmVyKCkpKTsKLSAgICB9Ci0KLSAgICBhc3NlcnRUcnVlKG1hcC5maW5kVmFsdWVCeU51bWJlcigxMjM0NSkgPT0gbnVsbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQYWNrZWRUb1VucGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFVucGFja2VkVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVbnBhY2tlZFR5cGVzIG1lc3NhZ2UgPQotICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCkpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0VW5wYWNrZWRGaWVsZHNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbnBhY2tlZFRvUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RQYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPQotICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0VW5wYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBFeHRlbnNpb25zLgotCi0gIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIgPQotICAgIG5ldyBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uTWVzc2FnZU9yQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZXBlYXRlZFNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFV0aWwuc2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5tb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyKFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKS5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RVbnNldFJlcGVhdGVkRXh0ZW5zaW9uR2V0RmllbGQoKSB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgIE9iamVjdCB2YWx1ZTsKLQotICAgIHZhbHVlID0gbWVzc2FnZS5nZXRGaWVsZChVbml0dGVzdFByb3RvLnJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpOwotICAgIGFzc2VydFRydWUoKChMaXN0PD8+KSB2YWx1ZSkuaXNFbXB0eSgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSgoTGlzdDw/PikgdmFsdWUpOwotCi0gICAgdmFsdWUgPSBtZXNzYWdlLmdldEZpZWxkKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSh2YWx1ZSBpbnN0YW5jZW9mIExpc3QpOwotICAgIGFzc2VydFRydWUoKChMaXN0PD8+KSB2YWx1ZSkuaXNFbXB0eSgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSgoTGlzdDw/PikgdmFsdWUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25HZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLQotICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKLSAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlcik7Ci0KLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOwotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOwotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKGJ1aWxkZXIpOwotCi0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoCi0gICAgICAgIGJ1aWxkZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbigKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFeHRlbnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBjbGVhckV4dGVuc2lvbigpIGlzIG5vdCBhY3R1YWxseSB1c2VkIGluIFRlc3RVdGlsLCBzbyB0cnkgaXQgbWFudWFsbHkuCi0gICAgYXNzZXJ0RmFsc2UoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpCi0gICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24pCi0gICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDEpCi0gICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pCi0gICAgICAgIC5nZXRFeHRlbnNpb25Db3VudChVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgb3JpZ2luYWwgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIob3JpZ2luYWwpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChjb3B5KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25NZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBvcmlnaW5hbCA9Ci0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVyZ2VkID0KLSAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLm1lcmdlRnJvbShvcmlnaW5hbCkuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lcmdlZC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAxLCAoaW50KSBtZXJnZWQuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbikpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gTGl0ZSBFeHRlbnNpb25zLgotCi0gIC8vIFdlIHRlc3QgbGl0ZSBleHRlbnNpb25zIGRpcmVjdGx5IGJlY2F1c2UgdGhleSBoYXZlIGEgc2VwYXJhdGUKLSAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBmdWxsIGV4dGVuc2lvbnMuICBJbiBjb250cmFzdCwgd2UgZG8gbm90IHRlc3QKLSAgLy8gbGl0ZSBmaWVsZHMgZGlyZWN0bHkgc2luY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgZXhhY3RseSB0aGUgc2FtZSBhcwotICAvLyByZWd1bGFyIGZpZWxkcy4KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbk1lc3NhZ2VPckJ1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbExpdGUuc2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KGJ1aWxkZXIpOwotCi0gICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RMaXRlRXh0ZW5zaW9uUmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFV0aWxMaXRlLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7Ci0gICAgVGVzdFV0aWxMaXRlLm1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChidWlsZGVyKTsKLQotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyTGl0ZUV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGNsZWFyRXh0ZW5zaW9uKCkgaXMgbm90IGFjdHVhbGx5IHVzZWQgaW4gVGVzdFV0aWwsIHNvIHRyeSBpdCBtYW51YWxseS4KLSAgICBhc3NlcnRGYWxzZSgKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEpCi0gICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpCi0gICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAxKQotICAgICAgICAuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKQotICAgICAgICAuZ2V0RXh0ZW5zaW9uQ291bnQoVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbkNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgb3JpZ2luYWwgPSBUZXN0VXRpbExpdGUuZ2V0QWxsTGl0ZUV4dGVuc2lvbnNTZXQoKTsKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgY29weSA9Ci0gICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKG9yaWdpbmFsKS5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoY29weSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbk1lcmdlRnJvbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBvcmlnaW5hbCA9Ci0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlLCAxKS5idWlsZCgpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXJnZWQgPQotICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpLm1lcmdlRnJvbShvcmlnaW5hbCkuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lcmdlZC5oYXNFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAxLCAoaW50KSBtZXJnZWQuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gbXVsdGlwbGVfZmlsZXNfdGVzdAotCi0gIC8vIFRlc3QgdGhhdCBjdXN0b20gb3B0aW9ucyBvZiBhbiBmaWxlIGxldmVsIGVudW0gYXJlIHByb3Blcmx5IGluaXRpYWxpemVkLgotICAvLyBUaGlzIHRlc3QgbmVlZHMgdG8gYmUgcHV0IGJlZm9yZSBhbnkgb3RoZXIgYWNjZXNzIHRvIE11bHRpcGxlRmlsZXNUZXN0UHJvdG8KLSAgLy8gb3IgbWVzc2FnZXMgZGVmaW5lZCBpbiBtdWx0aXBsZV9maWxlc190ZXN0LnByb3RvIGJlY2F1c2UgdGhlIGNsYXNzIGxvYWRpbmcKLSAgLy8gb3JkZXIgYWZmZWN0cyBpbml0aWFsaXphdGlvbiBwcm9jZXNzIG9mIGN1c3RvbSBvcHRpb25zLgotICBwdWJsaWMgdm9pZCB0ZXN0RW51bVZhbHVlT3B0aW9uc0luTXVsdGlwbGVGaWxlc01vZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNDUsIEVudW1XaXRoTm9PdXRlci5GT08uZ2V0VmFsdWVEZXNjcmlwdG9yKCkuZ2V0T3B0aW9ucygpCi0gICAgICAgIC5nZXRFeHRlbnNpb24oTXVsdGlwbGVGaWxlc1Rlc3RQcm90by5lbnVtVmFsdWVPcHRpb24pLmludFZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsZXNPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBXZSBtb3N0bHkganVzdCB3YW50IHRvIGNoZWNrIHRoYXQgdGhpbmdzIGNvbXBpbGUuCi0gICAgTWVzc2FnZVdpdGhOb091dGVyIG1lc3NhZ2UgPQotICAgICAgTWVzc2FnZVdpdGhOb091dGVyLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TmVzdGVkKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDEpKQotICAgICAgICAuYWRkRm9yZWlnbihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSkpCi0gICAgICAgIC5zZXROZXN0ZWRFbnVtKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRFbnVtLkJBWikKLSAgICAgICAgLnNldEZvcmVpZ25FbnVtKEVudW1XaXRoTm9PdXRlci5CQVIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBNZXNzYWdlV2l0aE5vT3V0ZXIucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpKTsKLQotICAgIGFzc2VydEVxdWFscyhNdWx0aXBsZUZpbGVzVGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgTWVzc2FnZVdpdGhOb091dGVyLmdldERlc2NyaXB0b3IoKS5nZXRGaWxlKCkpOwotCi0gICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkID0KLSAgICAgIE1lc3NhZ2VXaXRoTm9PdXRlci5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJmb3JlaWduX2VudW0iKTsKLSAgICBhc3NlcnRFcXVhbHMoRW51bVdpdGhOb091dGVyLkJBUi5nZXRWYWx1ZURlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRGaWVsZChmaWVsZCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKE11bHRpcGxlRmlsZXNUZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuZ2V0RGVzY3JpcHRvcigpLmdldEZpbGUoKSk7Ci0KLSAgICBhc3NlcnRGYWxzZSgKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLmhhc0V4dGVuc2lvbigKLSAgICAgICAgTXVsdGlwbGVGaWxlc1Rlc3RQcm90by5leHRlbnNpb25XaXRoT3V0ZXIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbEZpZWxkV2l0aFJlcXVpcmVkU3ViZmllbGRzT3B0aW1pemVkRm9yU2l6ZSgpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlID0KLSAgICAgICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAotICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKQotICAgICAgICApLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAotICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRYKDUpLmJ1aWxkUGFydGlhbCgpCi0gICAgICAgICkuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5pbml0aWFsaXplZEV4dGVuc2lvbkluT3B0aW1pemVkRm9yU2l6ZSgpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdE9wdGltaXplZEZvclNpemUudGVzdEV4dGVuc2lvbjIsCi0gICAgICAgIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlciA9IFRlc3RPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0T3B0aW1pemVkRm9yU2l6ZS50ZXN0RXh0ZW5zaW9uMiwKLSAgICAgICAgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCkuc2V0WCgxMCkuYnVpbGRQYXJ0aWFsKCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRDb25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CQl9GSUVMRF9OVU1CRVIsIDEpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuT1BUSU9OQUxfSU5UMzJfRklFTERfTlVNQkVSLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMR1JPVVBfRklFTERfTlVNQkVSLCAxNik7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5PUFRJT05BTF9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIsIDE4KTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9FTlVNX0ZJRUxEX05VTUJFUiwgMjEpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLCAzMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFREdST1VQX0ZJRUxEX05VTUJFUiwgNDYpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRklFTERfTlVNQkVSLCA0OCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFRF9ORVNURURfRU5VTV9GSUVMRF9OVU1CRVIsIDUxKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZC5TSU5HTEVfRklFTERfTlVNQkVSLCAxMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQuTVVMVElfRklFTERfTlVNQkVSLCAxMDAxKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTEdST1VQX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE2KTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICBVbml0dGVzdFByb3RvLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE4KTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAyMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfSU5UMzJfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMzEpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVER1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDYpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgIFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDgpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVEX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDUxKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlID0KLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChtZXNzYWdlLmdldEEoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEEoKSA9PSBtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIGV4cGVjdGVkID0gYnVpbGRlci5idWlsZCgpOwotICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgIHRyeSB7Ci0gICAgICBvdXQud3JpdGVPYmplY3QoZXhwZWN0ZWQpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgIFRlc3RBbGxUeXBlcyBhY3R1YWwgPSAoVGVzdEFsbFR5cGVzKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZVBhcnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYmFvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0QWxsVHlwZXMgZXhwZWN0ZWQgPSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgIHRyeSB7Ci0gICAgICBvdXQud3JpdGVPYmplY3QoZXhwZWN0ZWQpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgIFRlc3RBbGxUeXBlcyBhY3R1YWwgPSAoVGVzdEFsbFR5cGVzKSBpbi5yZWFkT2JqZWN0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBhY3R1YWwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudW1WYWx1ZXMoKSB7Ci0gICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUi5nZXROdW1iZXIoKSwKLSAgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUl9WQUxVRSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVouZ2V0TnVtYmVyKCksCi0gICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWl9WQUxVRSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08uZ2V0TnVtYmVyKCksCi0gICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPT19WQUxVRSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Tm9uTmVzdGVkRXh0ZW5zaW9uSW5pdGlhbGl6YXRpb24oKSB7Ci0gICAgYXNzZXJ0VHJ1ZShOb25OZXN0ZWRFeHRlbnNpb24ubm9uTmVzdGVkRXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAuZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIGluc3RhbmNlb2YgTXlOb25OZXN0ZWRFeHRlbnNpb24pOwotICAgIGFzc2VydEVxdWFscygibm9uTmVzdGVkRXh0ZW5zaW9uIiwKLSAgICAgICAgICAgICAgICAgTm9uTmVzdGVkRXh0ZW5zaW9uLm5vbk5lc3RlZEV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0TmFtZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeHRlbnNpb25Jbml0aWFsaXphdGlvbigpIHsKLSAgICBhc3NlcnRUcnVlKE15TmVzdGVkRXh0ZW5zaW9uLnJlY3Vyc2l2ZUV4dGVuc2lvbi5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkKLSAgICAgICAgICAgICAgIGluc3RhbmNlb2YgTWVzc2FnZVRvQmVFeHRlbmRlZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJyZWN1cnNpdmVFeHRlbnNpb24iLAotICAgICAgICAgICAgICAgICBNeU5lc3RlZEV4dGVuc2lvbi5yZWN1cnNpdmVFeHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldE5hbWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Tm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZUluaXRpYWxpemF0aW9uKCkgewotICAgIGFzc2VydFRydWUoTm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZS5ub25OZXN0ZWRFeHRlbnNpb25MaXRlCi0gICAgICAgICAgICAgICAuZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIGluc3RhbmNlb2YgTXlOb25OZXN0ZWRFeHRlbnNpb25MaXRlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRFeHRlbnNpb25MaXRlSW5pdGlhbGl6YXRpb24oKSB7Ci0gICAgYXNzZXJ0VHJ1ZShNeU5lc3RlZEV4dGVuc2lvbkxpdGUucmVjdXJzaXZlRXh0ZW5zaW9uTGl0ZQotICAgICAgICAgICAgICAgLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSBpbnN0YW5jZW9mIE1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgR2VuZXJhdGVkTWVzc2FnZS5lbmFibGVBbHdheXNVc2VGaWVsZEJ1aWxkZXJzRm9yVGVzdGluZygpOwotICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIG5lc3RlZE1lc3NhZ2UxID0KLSAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTWVzc2FnZTIgPQotICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKLQotICAgIC8vIFNldCBhbGwgdGhyZWUgZmxhdm9ycyAoZW51bSwgcHJpbWl0aXZlLCBtZXNzYWdlIGFuZCBzaW5ndWxhci9yZXBlYXRlZCkKLSAgICAvLyBhbmQgdmVyaWZ5IG5vIGludmFsaWRhdGlvbnMgZmlyZWQKLSAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7Ci0KLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gKFRlc3RBbGxUeXBlcy5CdWlsZGVyKQotICAgICAgICAoKEdlbmVyYXRlZE1lc3NhZ2UpIFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSkuCi0gICAgICAgICAgICBuZXdCdWlsZGVyRm9yVHlwZShtb2NrUGFyZW50KTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMSk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShuZXN0ZWRNZXNzYWdlMSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDEpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UobmVzdGVkTWVzc2FnZTEpOwotICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gICAgLy8gTm93IHRlbGwgaXQgd2Ugd2FudCBjaGFuZ2VzIGFuZCBtYWtlIHN1cmUgaXQncyBvbmx5IGZpcmVkIG9uY2UKLSAgICAvLyBBbmQgZG8gdGhpcyBmb3IgZWFjaCBmbGF2b3IKLQotICAgIC8vIHByaW1pdGl2ZSBzaW5nbGUKLSAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigyKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICAvLyBlbnVtIHNpbmdsZQotICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOwotICAgIGFzc2VydEVxdWFscygyLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gICAgLy8gbWVzc2FnZSBzaW5nbGUKLSAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UyKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShuZXN0ZWRNZXNzYWdlMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICAvLyBwcmltaXRpdmUgcmVwZWF0ZWQKLSAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigyKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICAvLyBlbnVtIHJlcGVhdGVkCi0gICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7Ci0gICAgYXNzZXJ0RXF1YWxzKDUsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICAvLyBtZXNzYWdlIHJlcGVhdGVkCi0gICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShuZXN0ZWRNZXNzYWdlMik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UobmVzdGVkTWVzc2FnZTEpOwotICAgIGFzc2VydEVxdWFscyg2LCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZGF0aW9uc19FeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotCi0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gKFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIpCi0gICAgICAgICgoR2VuZXJhdGVkTWVzc2FnZSkgVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLgotICAgICAgICAgICAgbmV3QnVpbGRlckZvclR5cGUobW9ja1BhcmVudCk7Ci0KLSAgICBidWlsZGVyLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDEpOwotICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMCwgMik7Ci0gICAgYnVpbGRlci5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pOwotICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gICAgLy8gTm93IHRlbGwgaXQgd2Ugd2FudCBjaGFuZ2VzIGFuZCBtYWtlIHN1cmUgaXQncyBvbmx5IGZpcmVkIG9uY2UKLSAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIGJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMik7Ci0gICAgYnVpbGRlci5hZGRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAzKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLQotICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAwLCA0KTsKLSAgICBidWlsZGVyLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDEsIDUpOwotICAgIGFzc2VydEVxdWFscygyLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBidWlsZGVyLmNsZWFyRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbik7Ci0gICAgYnVpbGRlci5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pOwotICAgIGFzc2VydEVxdWFscygzLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJhc2VNZXNzYWdlT3JCdWlsZGVyKCkgewotICAgIC8vIE1vc3RseSBqdXN0IG1ha2VzIHN1cmUgdGhlIGJhc2UgaW50ZXJmYWNlIGV4aXN0cyBhbmQgaGFzIHNvbWUgbWV0aG9kcy4KLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyIGJ1aWxkZXJBc0ludGVyZmFjZSA9IChUZXN0QWxsVHlwZXNPckJ1aWxkZXIpIGJ1aWxkZXI7Ci0gICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyIG1lc3NhZ2VBc0ludGVyZmFjZSA9IChUZXN0QWxsVHlwZXNPckJ1aWxkZXIpIG1lc3NhZ2U7Ci0KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIG1lc3NhZ2VBc0ludGVyZmFjZS5nZXREZWZhdWx0Qm9vbCgpLAotICAgICAgICBtZXNzYWdlQXNJbnRlcmZhY2UuZ2V0RGVmYXVsdEJvb2woKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBtZXNzYWdlQXNJbnRlcmZhY2UuZ2V0T3B0aW9uYWxEb3VibGUoKSwKLSAgICAgICAgbWVzc2FnZUFzSW50ZXJmYWNlLmdldE9wdGlvbmFsRG91YmxlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VPckJ1aWxkZXJHZXR0ZXJzKCkgewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotCi0gICAgLy8gc2luZ2xlIGZpZWxkcwotICAgIGFzc2VydFNhbWUoRm9yZWlnbk1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigpKTsKLSAgICBGb3JlaWduTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPQotICAgICAgICBidWlsZGVyLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VCdWlsZGVyKCk7Ci0gICAgYXNzZXJ0U2FtZShzdWJCdWlsZGVyLCBidWlsZGVyLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoKSk7Ci0KLSAgICAvLyByZXBlYXRlZCBmaWVsZHMKLSAgICBGb3JlaWduTWVzc2FnZSBtMCA9IEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKTsKLSAgICBGb3JlaWduTWVzc2FnZSBtMSA9IEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKTsKLSAgICBGb3JlaWduTWVzc2FnZSBtMiA9IEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UobTApOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShtMSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKG0yKTsKLSAgICBhc3NlcnRTYW1lKG0wLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMCkpOwotICAgIGFzc2VydFNhbWUobTEsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigxKSk7Ci0gICAgYXNzZXJ0U2FtZShtMiwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDIpKTsKLSAgICBGb3JlaWduTWVzc2FnZS5CdWlsZGVyIGIwID0gYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQnVpbGRlcigwKTsKLSAgICBGb3JlaWduTWVzc2FnZS5CdWlsZGVyIGIxID0gYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQnVpbGRlcigxKTsKLSAgICBhc3NlcnRTYW1lKGIwLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMCkpOwotICAgIGFzc2VydFNhbWUoYjEsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigxKSk7Ci0gICAgYXNzZXJ0U2FtZShtMiwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDIpKTsKLQotICAgIExpc3Q8PyBleHRlbmRzIEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyPiBtZXNzYWdlT3JCdWlsZGVyTGlzdCA9Ci0gICAgICAgIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlckxpc3QoKTsKLSAgICBhc3NlcnRTYW1lKGIwLCBtZXNzYWdlT3JCdWlsZGVyTGlzdC5nZXQoMCkpOwotICAgIGFzc2VydFNhbWUoYjEsIG1lc3NhZ2VPckJ1aWxkZXJMaXN0LmdldCgxKSk7Ci0gICAgYXNzZXJ0U2FtZShtMiwgbWVzc2FnZU9yQnVpbGRlckxpc3QuZ2V0KDIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRGaWVsZEJ1aWxkZXIoKSB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKLQotICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgPQotICAgICAgICBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgZm9yZWlnbkZpZWxkRGVzY3JpcHRvciA9Ci0gICAgICAgIGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgaW1wb3J0RmllbGREZXNjcmlwdG9yID0KLSAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIik7Ci0KLSAgICAvLyBNdXRhdGUgdGhlIG1lc3NhZ2Ugd2l0aCBuZXcgZmllbGQgYnVpbGRlcgotICAgIC8vIE11dGF0ZSBuZXN0ZWQgbWVzc2FnZQotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIxID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgZmllbGRCdWlsZGVyMSA9IGJ1aWxkZXIxLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZERlc2NyaXB0b3IpCi0gICAgICAgIC5tZXJnZUZyb20oKE1lc3NhZ2UpIGJ1aWxkZXIxLmdldEZpZWxkKGZpZWxkRGVzY3JpcHRvcikpOwotICAgIEZpZWxkRGVzY3JpcHRvciBzdWJGaWVsZERlc2NyaXB0b3IxID0KLSAgICAgICAgZmllbGRCdWlsZGVyMS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgiYmIiKTsKLSAgICBmaWVsZEJ1aWxkZXIxLnNldEZpZWxkKHN1YkZpZWxkRGVzY3JpcHRvcjEsIDEpOwotICAgIGJ1aWxkZXIxLnNldEZpZWxkKGZpZWxkRGVzY3JpcHRvciwgZmllbGRCdWlsZGVyMS5idWlsZCgpKTsKLQotICAgIC8vIE11dGF0ZSBmb3JlaWduIG1lc3NhZ2UKLSAgICBNZXNzYWdlLkJ1aWxkZXIgZm9yZWlnbkZpZWxkQnVpbGRlcjEgPSBidWlsZGVyMS5uZXdCdWlsZGVyRm9yRmllbGQoCi0gICAgICAgIGZvcmVpZ25GaWVsZERlc2NyaXB0b3IpCi0gICAgICAgIC5tZXJnZUZyb20oKE1lc3NhZ2UpIGJ1aWxkZXIxLmdldEZpZWxkKGZvcmVpZ25GaWVsZERlc2NyaXB0b3IpKTsKLSAgICBGaWVsZERlc2NyaXB0b3Igc3ViRm9yZWlnbkZpZWxkRGVzY3JpcHRvcjEgPQotICAgICAgICBmb3JlaWduRmllbGRCdWlsZGVyMS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgiYyIpOwotICAgIGZvcmVpZ25GaWVsZEJ1aWxkZXIxLnNldEZpZWxkKHN1YkZvcmVpZ25GaWVsZERlc2NyaXB0b3IxLCAyKTsKLSAgICBidWlsZGVyMS5zZXRGaWVsZChmb3JlaWduRmllbGREZXNjcmlwdG9yLCBmb3JlaWduRmllbGRCdWlsZGVyMS5idWlsZCgpKTsKLQotICAgIC8vIE11dGF0ZSBpbXBvcnQgbWVzc2FnZQotICAgIE1lc3NhZ2UuQnVpbGRlciBpbXBvcnRGaWVsZEJ1aWxkZXIxID0gYnVpbGRlcjEubmV3QnVpbGRlckZvckZpZWxkKAotICAgICAgICBpbXBvcnRGaWVsZERlc2NyaXB0b3IpCi0gICAgICAgIC5tZXJnZUZyb20oKE1lc3NhZ2UpIGJ1aWxkZXIxLmdldEZpZWxkKGltcG9ydEZpZWxkRGVzY3JpcHRvcikpOwotICAgIEZpZWxkRGVzY3JpcHRvciBzdWJJbXBvcnRGaWVsZERlc2NyaXB0b3IxID0KLSAgICAgICAgaW1wb3J0RmllbGRCdWlsZGVyMS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgiZCIpOwotICAgIGltcG9ydEZpZWxkQnVpbGRlcjEuc2V0RmllbGQoc3ViSW1wb3J0RmllbGREZXNjcmlwdG9yMSwgMyk7Ci0gICAgYnVpbGRlcjEuc2V0RmllbGQoaW1wb3J0RmllbGREZXNjcmlwdG9yLCBpbXBvcnRGaWVsZEJ1aWxkZXIxLmJ1aWxkKCkpOwotCi0gICAgTWVzc2FnZSBuZXdNZXNzYWdlMSA9IGJ1aWxkZXIxLmJ1aWxkKCk7Ci0KLSAgICAvLyBNdXRhdGUgdGhlIG1lc3NhZ2Ugd2l0aCBleGlzdGluZyBmaWVsZCBidWlsZGVyCi0gICAgLy8gTXV0YXRlIG5lc3RlZCBtZXNzYWdlCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlcjIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIE1lc3NhZ2UuQnVpbGRlciBmaWVsZEJ1aWxkZXIyID0gYnVpbGRlcjIuZ2V0RmllbGRCdWlsZGVyKGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgRmllbGREZXNjcmlwdG9yIHN1YkZpZWxkRGVzY3JpcHRvcjIgPQotICAgICAgICBmaWVsZEJ1aWxkZXIyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJiYiIpOwotICAgIGZpZWxkQnVpbGRlcjIuc2V0RmllbGQoc3ViRmllbGREZXNjcmlwdG9yMiwgMSk7Ci0gICAgYnVpbGRlcjIuc2V0RmllbGQoZmllbGREZXNjcmlwdG9yLCBmaWVsZEJ1aWxkZXIyLmJ1aWxkKCkpOwotCi0gICAgLy8gTXV0YXRlIGZvcmVpZ24gbWVzc2FnZQotICAgIE1lc3NhZ2UuQnVpbGRlciBmb3JlaWduRmllbGRCdWlsZGVyMiA9IGJ1aWxkZXIyLm5ld0J1aWxkZXJGb3JGaWVsZCgKLSAgICAgICAgZm9yZWlnbkZpZWxkRGVzY3JpcHRvcikKLSAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgYnVpbGRlcjIuZ2V0RmllbGQoZm9yZWlnbkZpZWxkRGVzY3JpcHRvcikpOwotICAgIEZpZWxkRGVzY3JpcHRvciBzdWJGb3JlaWduRmllbGREZXNjcmlwdG9yMiA9Ci0gICAgICAgIGZvcmVpZ25GaWVsZEJ1aWxkZXIyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJjIik7Ci0gICAgZm9yZWlnbkZpZWxkQnVpbGRlcjIuc2V0RmllbGQoc3ViRm9yZWlnbkZpZWxkRGVzY3JpcHRvcjIsIDIpOwotICAgIGJ1aWxkZXIyLnNldEZpZWxkKGZvcmVpZ25GaWVsZERlc2NyaXB0b3IsIGZvcmVpZ25GaWVsZEJ1aWxkZXIyLmJ1aWxkKCkpOwotCi0gICAgLy8gTXV0YXRlIGltcG9ydCBtZXNzYWdlCi0gICAgTWVzc2FnZS5CdWlsZGVyIGltcG9ydEZpZWxkQnVpbGRlcjIgPSBidWlsZGVyMi5uZXdCdWlsZGVyRm9yRmllbGQoCi0gICAgICAgIGltcG9ydEZpZWxkRGVzY3JpcHRvcikKLSAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgYnVpbGRlcjIuZ2V0RmllbGQoaW1wb3J0RmllbGREZXNjcmlwdG9yKSk7Ci0gICAgRmllbGREZXNjcmlwdG9yIHN1YkltcG9ydEZpZWxkRGVzY3JpcHRvcjIgPQotICAgICAgICBpbXBvcnRGaWVsZEJ1aWxkZXIyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJkIik7Ci0gICAgaW1wb3J0RmllbGRCdWlsZGVyMi5zZXRGaWVsZChzdWJJbXBvcnRGaWVsZERlc2NyaXB0b3IyLCAzKTsKLSAgICBidWlsZGVyMi5zZXRGaWVsZChpbXBvcnRGaWVsZERlc2NyaXB0b3IsIGltcG9ydEZpZWxkQnVpbGRlcjIuYnVpbGQoKSk7Ci0KLSAgICBNZXNzYWdlIG5ld01lc3NhZ2UyID0gYnVpbGRlcjIuYnVpbGQoKTsKLQotICAgIC8vIFRoZXNlIHR3byBtZXNzYWdlcyBzaG91bGQgYmUgZXF1YWwuCi0gICAgYXNzZXJ0RXF1YWxzKG5ld01lc3NhZ2UxLCBuZXdNZXNzYWdlMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRCdWlsZGVyV2l0aEluaXRpYWxpemVkVmFsdWUoKSB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yID0KLSAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7Ci0KLSAgICAvLyBCZWZvcmUgc2V0dGluZyBmaWVsZCwgYnVpbGRlciBpcyBpbml0aWFsaXplZCBieSBkZWZhdWx0IHZhbHVlLiAKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBOZXN0ZWRNZXNzYWdlLkJ1aWxkZXIgZmllbGRCdWlsZGVyID0KLSAgICAgICAgKE5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgYnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoZmllbGREZXNjcmlwdG9yKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZmllbGRCdWlsZGVyLmdldEJiKCkpOwotCi0gICAgLy8gU2V0dGluZyBmaWVsZCB2YWx1ZSB3aXRoIG5ldyBmaWVsZCBidWlsZGVyIGluc3RhbmNlLgotICAgIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIE5lc3RlZE1lc3NhZ2UuQnVpbGRlciBuZXdGaWVsZEJ1aWxkZXIgPQotICAgICAgICBidWlsZGVyLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZUJ1aWxkZXIoKTsKLSAgICBuZXdGaWVsZEJ1aWxkZXIuc2V0QmIoMik7Ci0gICAgLy8gVGhlbiBnZXQgdGhlIGZpZWxkIGJ1aWxkZXIgaW5zdGFuY2UgYnkgZ2V0RmllbGRCdWlsZGVyKCkuCi0gICAgZmllbGRCdWlsZGVyID0KLSAgICAgICAgKE5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgYnVpbGRlci5nZXRGaWVsZEJ1aWxkZXIoZmllbGREZXNjcmlwdG9yKTsKLSAgICAvLyBJdCBzaG91bGQgY29udGFpbiBuZXcgdmFsdWUuCi0gICAgYXNzZXJ0RXF1YWxzKDIsIGZpZWxkQnVpbGRlci5nZXRCYigpKTsKLSAgICAvLyBUaGVzZSB0d28gYnVpbGRlciBzaG91bGQgYmUgZXF1YWwuCi0gICAgYXNzZXJ0U2FtZShmaWVsZEJ1aWxkZXIsIG5ld0ZpZWxkQnVpbGRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0RmllbGRCdWlsZGVyTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuZ2V0RmllbGRCdWlsZGVyKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuZ2V0RmllbGRCdWlsZGVyKAotICAgICAgICAgIGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuZ2V0RmllbGRCdWlsZGVyKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuZ2V0RmllbGRCdWlsZGVyKAotICAgICAgICAgIGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuZ2V0RmllbGRCdWlsZGVyKAotICAgICAgICAgIGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gIH0KLQotICAvLyBUZXN0IHRoYXQgd2hlbiB0aGUgZGVmYXVsdCBvdXRlciBjbGFzcyBuYW1lIGNvbmZsaWN0cyB3aXRoIGFub3RoZXIgdHlwZQotICAvLyBkZWZpbmVkIGluIHRoZSBwcm90byB0aGUgY29tcGlsZXIgd2lsbCBhcHBlbmQgYSBzdWZmaXggdG8gYXZvaWQgdGhlCi0gIC8vIGNvbmZsaWN0LgotICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmxpY3RpbmdPdXRlckNsYXNzTmFtZSgpIHsKLSAgICAvLyBXZSBqdXN0IG5lZWQgdG8gbWFrZSBzdXJlIHdlIGNhbiByZWZlciB0byB0aGUgb3V0ZXIgY2xhc3Mgd2l0aCB0aGUKLSAgICAvLyBleHBlY3RlZCBuYW1lLiBUaGVyZSBpcyBub3RoaW5nIGVsc2UgdG8gdGVzdC4KLSAgICBPdXRlckNsYXNzTmFtZVRlc3RPdXRlckNsYXNzLk91dGVyQ2xhc3NOYW1lVGVzdCBtZXNzYWdlID0KLSAgICAgICAgT3V0ZXJDbGFzc05hbWVUZXN0T3V0ZXJDbGFzcy5PdXRlckNsYXNzTmFtZVRlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkgPT0KLSAgICAgICAgT3V0ZXJDbGFzc05hbWVUZXN0T3V0ZXJDbGFzcy5PdXRlckNsYXNzTmFtZVRlc3QuZ2V0RGVzY3JpcHRvcigpKTsKLQotICAgIE91dGVyQ2xhc3NOYW1lVGVzdDJPdXRlckNsYXNzLlRlc3RNZXNzYWdlMi5OZXN0ZWRNZXNzYWdlLk91dGVyQ2xhc3NOYW1lVGVzdDIKLSAgICAgICAgbWVzc2FnZTIgPSBPdXRlckNsYXNzTmFtZVRlc3QyT3V0ZXJDbGFzcy5UZXN0TWVzc2FnZTIuTmVzdGVkTWVzc2FnZQotICAgICAgICAgICAgLk91dGVyQ2xhc3NOYW1lVGVzdDIubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UyLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotCi0gICAgT3V0ZXJDbGFzc05hbWVUZXN0M091dGVyQ2xhc3MuVGVzdE1lc3NhZ2UzLk5lc3RlZE1lc3NhZ2UuT3V0ZXJDbGFzc05hbWVUZXN0MwotICAgICAgICBlbnVtVmFsdWUgPSBPdXRlckNsYXNzTmFtZVRlc3QzT3V0ZXJDbGFzcy5UZXN0TWVzc2FnZTMuTmVzdGVkTWVzc2FnZQotICAgICAgICAgICAgLk91dGVyQ2xhc3NOYW1lVGVzdDMuRFVNTVlfVkFMVUU7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGVudW1WYWx1ZS5nZXROdW1iZXIoKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBvbmVvZiBnZW5lcmF0ZWQgY29kZSB0ZXN0Ci0gIHB1YmxpYyB2b2lkIHRlc3RPbmVvZkVudW1DYXNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE9uZW9mMiBtZXNzYWdlID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZvb0ludCgxMjMpLnNldEZvb1N0cmluZygiZm9vIikuc2V0Rm9vQ29yZCgiYmFyIikuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBdE1vc3RPbmVGaWVsZFNldE9uZW9mKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyT25lb2YoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpLnNldEZvb0ludCgxMjMpOwotICAgIGFzc2VydEVxdWFscyhUZXN0T25lb2YyLkZvb0Nhc2UuRk9PX0lOVCwgYnVpbGRlci5nZXRGb29DYXNlKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJGb28oKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE9uZW9mMi5Gb29DYXNlLkZPT19OT1RfU0VULCBidWlsZGVyLmdldEZvb0Nhc2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2V0T25lb2ZDbGVhcnNPdGhlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpOwotICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9Ci0gICAgICAgIGJ1aWxkZXIuc2V0Rm9vSW50KDEyMykuc2V0Rm9vU3RyaW5nKCJmb28iKS5idWlsZFBhcnRpYWwoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vU3RyaW5nKCkpOwotICAgIFRlc3RVdGlsLmFzc2VydEF0TW9zdE9uZUZpZWxkU2V0T25lb2YobWVzc2FnZSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5zZXRGb29Db3JkKCJiYXIiKS5idWlsZFBhcnRpYWwoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vQ29yZCgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBdE1vc3RPbmVGaWVsZFNldE9uZW9mKG1lc3NhZ2UpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vU3RyaW5nUGllY2UoImJheiIpLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNGb29TdHJpbmdQaWVjZSgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBdE1vc3RPbmVGaWVsZFNldE9uZW9mKG1lc3NhZ2UpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vQnl0ZXMoVGVzdFV0aWwudG9CeXRlcygicXV4IikpLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNGb29CeXRlcygpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBdE1vc3RPbmVGaWVsZFNldE9uZW9mKG1lc3NhZ2UpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vRW51bShUZXN0T25lb2YyLk5lc3RlZEVudW0uRk9PKS5idWlsZFBhcnRpYWwoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vRW51bSgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBdE1vc3RPbmVGaWVsZFNldE9uZW9mKG1lc3NhZ2UpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vTWVzc2FnZSgKLSAgICAgICAgVGVzdE9uZW9mMi5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRRdXhJbnQoMjM0KS5idWlsZCgpKS5idWlsZFBhcnRpYWwoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vTWVzc2FnZSgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBdE1vc3RPbmVGaWVsZFNldE9uZW9mKG1lc3NhZ2UpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vSW50KDEyMykuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb0ludCgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBdE1vc3RPbmVGaWVsZFNldE9uZW9mKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9uZW9mVHlwZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBQcmltaXRpdmUKLSAgICB7Ci0gICAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpOwotICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkZXIuZ2V0Rm9vSW50KCksIDApOwotICAgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5oYXNGb29JbnQoKSk7Ci0gICAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuc2V0Rm9vSW50KDEyMykuaGFzRm9vSW50KCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkZXIuZ2V0Rm9vSW50KCksIDEyMyk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb0ludCgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldEZvb0ludCgpLCAxMjMpOwotCi0gICAgICBhc3NlcnRGYWxzZShidWlsZGVyLmNsZWFyRm9vSW50KCkuaGFzRm9vSW50KCkpOwotICAgICAgVGVzdE9uZW9mMiBtZXNzYWdlMiA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UyLmhhc0Zvb0ludCgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5nZXRGb29JbnQoKSwgMCk7Ci0gICAgfQotCi0gICAgLy8gRW51bQotICAgIHsKLSAgICAgIFRlc3RPbmVvZjIuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoYnVpbGRlci5nZXRGb29FbnVtKCksIFRlc3RPbmVvZjIuTmVzdGVkRW51bS5GT08pOwotICAgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLnNldEZvb0VudW0oVGVzdE9uZW9mMi5OZXN0ZWRFbnVtLkJBUikuaGFzRm9vRW51bSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhidWlsZGVyLmdldEZvb0VudW0oKSwgVGVzdE9uZW9mMi5OZXN0ZWRFbnVtLkJBUik7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb0VudW0oKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRGb29FbnVtKCksIFRlc3RPbmVvZjIuTmVzdGVkRW51bS5CQVIpOwotCi0gICAgICBhc3NlcnRGYWxzZShidWlsZGVyLmNsZWFyRm9vRW51bSgpLmhhc0Zvb0VudW0oKSk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UyID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZTIuaGFzRm9vRW51bSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5nZXRGb29FbnVtKCksIFRlc3RPbmVvZjIuTmVzdGVkRW51bS5GT08pOwotICAgIH0KLQotICAgIC8vIFN0cmluZwotICAgIHsKLSAgICAgIFRlc3RPbmVvZjIuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoYnVpbGRlci5nZXRGb29TdHJpbmcoKSwgIiIpOwotICAgICAgYnVpbGRlci5zZXRGb29TdHJpbmcoImZvbyIpOwotICAgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmhhc0Zvb1N0cmluZygpKTsKLSAgICAgIGFzc2VydEVxdWFscyhidWlsZGVyLmdldEZvb1N0cmluZygpLCAiZm9vIik7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb1N0cmluZygpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldEZvb1N0cmluZygpLCAiZm9vIik7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRGb29TdHJpbmdCeXRlcygpLCBUZXN0VXRpbC50b0J5dGVzKCJmb28iKSk7Ci0KLSAgICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuY2xlYXJGb29TdHJpbmcoKS5oYXNGb29TdHJpbmcoKSk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UyID0gYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UyLmhhc0Zvb1N0cmluZygpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5nZXRGb29TdHJpbmcoKSwgIiIpOwotICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UyLmdldEZvb1N0cmluZ0J5dGVzKCksIFRlc3RVdGlsLnRvQnl0ZXMoIiIpKTsKLQotICAgICAgLy8gR2V0IG1ldGhvZCBzaG91bGQgbm90IGNoYW5nZSB0aGUgb25lb2YgdmFsdWUuCi0gICAgICBidWlsZGVyLnNldEZvb0ludCgxMjMpOwotICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkZXIuZ2V0Rm9vU3RyaW5nKCksICIiKTsKLSAgICAgIGFzc2VydEVxdWFscyhidWlsZGVyLmdldEZvb1N0cmluZ0J5dGVzKCksIFRlc3RVdGlsLnRvQnl0ZXMoIiIpKTsKLSAgICAgIGFzc2VydEVxdWFscygxMjMsIGJ1aWxkZXIuZ2V0Rm9vSW50KCkpOwotCi0gICAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0Rm9vU3RyaW5nKCksICIiKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldEZvb1N0cmluZ0J5dGVzKCksIFRlc3RVdGlsLnRvQnl0ZXMoIiIpKTsKLSAgICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2UuZ2V0Rm9vSW50KCkpOwotICAgIH0KLQotICAgIC8vIENvcmQKLSAgICB7Ci0gICAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpOwotICAgICAgYXNzZXJ0RXF1YWxzKGJ1aWxkZXIuZ2V0Rm9vQ29yZCgpLCAiIik7Ci0gICAgICBidWlsZGVyLnNldEZvb0NvcmQoImZvbyIpOwotICAgICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmhhc0Zvb0NvcmQoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoYnVpbGRlci5nZXRGb29Db3JkKCksICJmb28iKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vQ29yZCgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldEZvb0NvcmQoKSwgImZvbyIpOwotICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0Rm9vQ29yZEJ5dGVzKCksIFRlc3RVdGlsLnRvQnl0ZXMoImZvbyIpKTsKLQotICAgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5jbGVhckZvb0NvcmQoKS5oYXNGb29Db3JkKCkpOwotICAgICAgVGVzdE9uZW9mMiBtZXNzYWdlMiA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UyLmhhc0Zvb0NvcmQoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTIuZ2V0Rm9vQ29yZCgpLCAiIik7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTIuZ2V0Rm9vQ29yZEJ5dGVzKCksIFRlc3RVdGlsLnRvQnl0ZXMoIiIpKTsKLSAgICB9Ci0KLSAgICAvLyBTdHJpbmdQaWVjZQotICAgIHsKLSAgICAgIFRlc3RPbmVvZjIuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoYnVpbGRlci5nZXRGb29TdHJpbmdQaWVjZSgpLCAiIik7Ci0gICAgICBidWlsZGVyLnNldEZvb1N0cmluZ1BpZWNlKCJmb28iKTsKLSAgICAgIGFzc2VydFRydWUoYnVpbGRlci5oYXNGb29TdHJpbmdQaWVjZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhidWlsZGVyLmdldEZvb1N0cmluZ1BpZWNlKCksICJmb28iKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vU3RyaW5nUGllY2UoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRGb29TdHJpbmdQaWVjZSgpLCAiZm9vIik7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRGb29TdHJpbmdQaWVjZUJ5dGVzKCksIFRlc3RVdGlsLnRvQnl0ZXMoImZvbyIpKTsKLQotICAgICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5jbGVhckZvb1N0cmluZ1BpZWNlKCkuaGFzRm9vU3RyaW5nUGllY2UoKSk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UyID0gYnVpbGRlci5idWlsZCgpOwotICAgICAgYXNzZXJ0RmFsc2UobWVzc2FnZTIuaGFzRm9vU3RyaW5nUGllY2UoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTIuZ2V0Rm9vU3RyaW5nUGllY2UoKSwgIiIpOwotICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UyLmdldEZvb1N0cmluZ1BpZWNlQnl0ZXMoKSwgVGVzdFV0aWwudG9CeXRlcygiIikpOwotICAgIH0KLQotICAgIC8vIE1lc3NhZ2UKLSAgICB7Ci0gICAgICAvLyBzZXQKLSAgICAgIFRlc3RPbmVvZjIuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoYnVpbGRlci5nZXRGb29NZXNzYWdlKCkuZ2V0UXV4SW50KCksIDApOwotICAgICAgYnVpbGRlci5zZXRGb29NZXNzYWdlKAotICAgICAgICAgIFRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0UXV4SW50KDIzNCkuYnVpbGQoKSk7Ci0gICAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaGFzRm9vTWVzc2FnZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhidWlsZGVyLmdldEZvb01lc3NhZ2UoKS5nZXRRdXhJbnQoKSwgMjM0KTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vTWVzc2FnZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldEZvb01lc3NhZ2UoKS5nZXRRdXhJbnQoKSwgMjM0KTsKLQotICAgICAgLy8gY2xlYXIKLSAgICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuY2xlYXJGb29NZXNzYWdlKCkuaGFzRm9vU3RyaW5nKCkpOwotICAgICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRm9vTWVzc2FnZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldEZvb01lc3NhZ2UoKS5nZXRRdXhJbnQoKSwgMCk7Ci0KLSAgICAgIC8vIG5lc3RlZCBidWlsZGVyCi0gICAgICBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgICBhc3NlcnRTYW1lKGJ1aWxkZXIuZ2V0Rm9vTWVzc2FnZU9yQnVpbGRlcigpLAotICAgICAgICAgIFRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgICBhc3NlcnRGYWxzZShidWlsZGVyLmhhc0Zvb01lc3NhZ2UoKSk7Ci0gICAgICBidWlsZGVyLmdldEZvb01lc3NhZ2VCdWlsZGVyKCkuc2V0UXV4SW50KDEyMyk7Ci0gICAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaGFzRm9vTWVzc2FnZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhidWlsZGVyLmdldEZvb01lc3NhZ2UoKS5nZXRRdXhJbnQoKSwgMTIzKTsKLSAgICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vTWVzc2FnZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldEZvb01lc3NhZ2UoKS5nZXRRdXhJbnQoKSwgMTIzKTsKLSAgICB9Ci0KLSAgICAvLyBMYXp5TWVzc2FnZSBpcyB0ZXN0ZWQgaW4gTGF6eU1lc3NhZ2VMaXRlVGVzdC5qYXZhCi0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFByaW1pdGl2ZSBUeXBlCi0gICAgewotICAgICAgVGVzdE9uZW9mMi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vSW50KDEyMykuYnVpbGQoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZTIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20obWVzc2FnZSkuYnVpbGQoKTsKLSAgICAgIGFzc2VydFRydWUobWVzc2FnZTIuaGFzRm9vSW50KCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UyLmdldEZvb0ludCgpLCAxMjMpOwotICAgIH0KLQotICAgIC8vIFN0cmluZwotICAgIHsKLSAgICAgIFRlc3RPbmVvZjIuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UgPSBidWlsZGVyLnNldEZvb1N0cmluZygiZm9vIikuYnVpbGQoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZTIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20obWVzc2FnZSkuYnVpbGQoKTsKLSAgICAgIGFzc2VydFRydWUobWVzc2FnZTIuaGFzRm9vU3RyaW5nKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UyLmdldEZvb1N0cmluZygpLCAiZm9vIik7Ci0gICAgfQotCi0gICAgLy8gRW51bQotICAgIHsKLSAgICAgIFRlc3RPbmVvZjIuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UgPSBidWlsZGVyLnNldEZvb0VudW0oVGVzdE9uZW9mMi5OZXN0ZWRFbnVtLkJBUikuYnVpbGQoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZTIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20obWVzc2FnZSkuYnVpbGQoKTsKLSAgICAgIGFzc2VydFRydWUobWVzc2FnZTIuaGFzRm9vRW51bSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5nZXRGb29FbnVtKCksIFRlc3RPbmVvZjIuTmVzdGVkRW51bS5CQVIpOwotICAgIH0KLQotICAgIC8vIE1lc3NhZ2UKLSAgICB7Ci0gICAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpOwotICAgICAgVGVzdE9uZW9mMiBtZXNzYWdlID0gYnVpbGRlci5zZXRGb29NZXNzYWdlKAotICAgICAgICAgIFRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0UXV4SW50KDIzNCkuYnVpbGQoKSkuYnVpbGQoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZTIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20obWVzc2FnZSkuYnVpbGQoKTsKLSAgICAgIGFzc2VydFRydWUobWVzc2FnZTIuaGFzRm9vTWVzc2FnZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5nZXRGb29NZXNzYWdlKCkuZ2V0UXV4SW50KCksIDIzNCk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9uZW9mU2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFByaW1pdGl2ZSBUeXBlCi0gICAgewotICAgICAgVGVzdE9uZW9mMi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vSW50KDEyMykuYnVpbGQoKTsKLSAgICAgIEJ5dGVTdHJpbmcgc2VyaWFsaXplZCA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UyID0gVGVzdE9uZW9mMi5wYXJzZUZyb20oc2VyaWFsaXplZCk7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UyLmhhc0Zvb0ludCgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5nZXRGb29JbnQoKSwgMTIzKTsKLSAgICB9Ci0KLSAgICAvLyBTdHJpbmcKLSAgICB7Ci0gICAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpOwotICAgICAgVGVzdE9uZW9mMiBtZXNzYWdlID0gYnVpbGRlci5zZXRGb29TdHJpbmcoImZvbyIpLmJ1aWxkKCk7Ci0gICAgICBCeXRlU3RyaW5nIHNlcmlhbGl6ZWQgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgICAgVGVzdE9uZW9mMiBtZXNzYWdlMiA9IFRlc3RPbmVvZjIucGFyc2VGcm9tKHNlcmlhbGl6ZWQpOwotICAgICAgYXNzZXJ0VHJ1ZShtZXNzYWdlMi5oYXNGb29TdHJpbmcoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTIuZ2V0Rm9vU3RyaW5nKCksICJmb28iKTsKLSAgICB9Ci0KLSAgICAvLyBFbnVtCi0gICAgewotICAgICAgVGVzdE9uZW9mMi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9IGJ1aWxkZXIuc2V0Rm9vRW51bShUZXN0T25lb2YyLk5lc3RlZEVudW0uQkFSKS5idWlsZCgpOwotICAgICAgQnl0ZVN0cmluZyBzZXJpYWxpemVkID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLSAgICAgIFRlc3RPbmVvZjIgbWVzc2FnZTIgPSBUZXN0T25lb2YyLnBhcnNlRnJvbShzZXJpYWxpemVkKTsKLSAgICAgIGFzc2VydFRydWUobWVzc2FnZTIuaGFzRm9vRW51bSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5nZXRGb29FbnVtKCksIFRlc3RPbmVvZjIuTmVzdGVkRW51bS5CQVIpOwotICAgIH0KLQotICAgIC8vIE1lc3NhZ2UKLSAgICB7Ci0gICAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpOwotICAgICAgVGVzdE9uZW9mMiBtZXNzYWdlID0gYnVpbGRlci5zZXRGb29NZXNzYWdlKAotICAgICAgICAgIFRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0UXV4SW50KDIzNCkuYnVpbGQoKSkuYnVpbGQoKTsKLSAgICAgIEJ5dGVTdHJpbmcgc2VyaWFsaXplZCA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgICBUZXN0T25lb2YyIG1lc3NhZ2UyID0gVGVzdE9uZW9mMi5wYXJzZUZyb20oc2VyaWFsaXplZCk7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UyLmhhc0Zvb01lc3NhZ2UoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTIuZ2V0Rm9vTWVzc2FnZSgpLmdldFF1eEludCgpLCAyMzQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPbmVvZk5lc3RlZEJ1aWxkZXJPbkNoYW5nZVByb3BhZ2F0aW9uKCkgewotICAgIE5lc3RlZFRlc3RBbGxUeXBlcy5CdWlsZGVyIHBhcmVudEJ1aWxkZXIgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBwYXJlbnRCdWlsZGVyLmdldFBheWxvYWRCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5nZXRPbmVvZk5lc3RlZE1lc3NhZ2VCdWlsZGVyKCk7Ci0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmhhc09uZW9mTmVzdGVkTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRUcnVlKHBhcmVudEJ1aWxkZXIuaGFzUGF5bG9hZCgpKTsKLSAgICBOZXN0ZWRUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IHBhcmVudEJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzUGF5bG9hZCgpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0UGF5bG9hZCgpLmhhc09uZW9mTmVzdGVkTWVzc2FnZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXBlYXRlZEZpZWxkQnVpbGRlcigpIHsKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA9Ci0gICAgICAgIGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBmb3JlaWduRmllbGREZXNjcmlwdG9yID0KLSAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBpbXBvcnRGaWVsZERlc2NyaXB0b3IgPQotICAgICAgICBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKTsKLQotICAgIC8vIE11dGF0ZSB0aGUgbWVzc2FnZSB3aXRoIG5ldyBmaWVsZCBidWlsZGVyCi0gICAgLy8gTXV0YXRlIG5lc3RlZCBtZXNzYWdlCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlcjEgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIE1lc3NhZ2UuQnVpbGRlciBmaWVsZEJ1aWxkZXIxID0gYnVpbGRlcjEubmV3QnVpbGRlckZvckZpZWxkKAotICAgICAgICBmaWVsZERlc2NyaXB0b3IpOwotICAgIEZpZWxkRGVzY3JpcHRvciBzdWJGaWVsZERlc2NyaXB0b3IxID0KLSAgICAgICAgZmllbGRCdWlsZGVyMS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgiYmIiKTsKLSAgICBmaWVsZEJ1aWxkZXIxLnNldEZpZWxkKHN1YkZpZWxkRGVzY3JpcHRvcjEsIDEpOwotICAgIGJ1aWxkZXIxLmFkZFJlcGVhdGVkRmllbGQoZmllbGREZXNjcmlwdG9yLCBmaWVsZEJ1aWxkZXIxLmJ1aWxkKCkpOwotCi0gICAgLy8gTXV0YXRlIGZvcmVpZ24gbWVzc2FnZQotICAgIE1lc3NhZ2UuQnVpbGRlciBmb3JlaWduRmllbGRCdWlsZGVyMSA9IGJ1aWxkZXIxLm5ld0J1aWxkZXJGb3JGaWVsZCgKLSAgICAgICAgZm9yZWlnbkZpZWxkRGVzY3JpcHRvcik7Ci0gICAgRmllbGREZXNjcmlwdG9yIHN1YkZvcmVpZ25GaWVsZERlc2NyaXB0b3IxID0KLSAgICAgICAgZm9yZWlnbkZpZWxkQnVpbGRlcjEuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUoImMiKTsKLSAgICBmb3JlaWduRmllbGRCdWlsZGVyMS5zZXRGaWVsZChzdWJGb3JlaWduRmllbGREZXNjcmlwdG9yMSwgMik7Ci0gICAgYnVpbGRlcjEuYWRkUmVwZWF0ZWRGaWVsZChmb3JlaWduRmllbGREZXNjcmlwdG9yLAotICAgICAgICBmb3JlaWduRmllbGRCdWlsZGVyMS5idWlsZCgpKTsKLQotICAgIC8vIE11dGF0ZSBpbXBvcnQgbWVzc2FnZQotICAgIE1lc3NhZ2UuQnVpbGRlciBpbXBvcnRGaWVsZEJ1aWxkZXIxID0gYnVpbGRlcjEubmV3QnVpbGRlckZvckZpZWxkKAotICAgICAgICBpbXBvcnRGaWVsZERlc2NyaXB0b3IpOwotICAgIEZpZWxkRGVzY3JpcHRvciBzdWJJbXBvcnRGaWVsZERlc2NyaXB0b3IxID0KLSAgICAgICAgaW1wb3J0RmllbGRCdWlsZGVyMS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgiZCIpOwotICAgIGltcG9ydEZpZWxkQnVpbGRlcjEuc2V0RmllbGQoc3ViSW1wb3J0RmllbGREZXNjcmlwdG9yMSwgMyk7Ci0gICAgYnVpbGRlcjEuYWRkUmVwZWF0ZWRGaWVsZChpbXBvcnRGaWVsZERlc2NyaXB0b3IsCi0gICAgICAgIGltcG9ydEZpZWxkQnVpbGRlcjEuYnVpbGQoKSk7Ci0KLSAgICBNZXNzYWdlIG5ld01lc3NhZ2UxID0gYnVpbGRlcjEuYnVpbGQoKTsKLQotICAgIC8vIE11dGF0ZSB0aGUgbWVzc2FnZSB3aXRoIGV4aXN0aW5nIGZpZWxkIGJ1aWxkZXIKLSAgICAvLyBNdXRhdGUgbmVzdGVkIG1lc3NhZ2UKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyMiA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlcjIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlQnVpbGRlcigpOwotICAgIE1lc3NhZ2UuQnVpbGRlciBmaWVsZEJ1aWxkZXIyID0gYnVpbGRlcjIuZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoCi0gICAgICAgIGZpZWxkRGVzY3JpcHRvciwgMCk7Ci0gICAgRmllbGREZXNjcmlwdG9yIHN1YkZpZWxkRGVzY3JpcHRvcjIgPQotICAgICAgICBmaWVsZEJ1aWxkZXIyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJiYiIpOwotICAgIGZpZWxkQnVpbGRlcjIuc2V0RmllbGQoc3ViRmllbGREZXNjcmlwdG9yMiwgMSk7Ci0KLSAgICAvLyBNdXRhdGUgZm9yZWlnbiBtZXNzYWdlCi0gICAgTWVzc2FnZS5CdWlsZGVyIGZvcmVpZ25GaWVsZEJ1aWxkZXIyID0gYnVpbGRlcjIubmV3QnVpbGRlckZvckZpZWxkKAotICAgICAgICBmb3JlaWduRmllbGREZXNjcmlwdG9yKTsKLSAgICBGaWVsZERlc2NyaXB0b3Igc3ViRm9yZWlnbkZpZWxkRGVzY3JpcHRvcjIgPQotICAgICAgICBmb3JlaWduRmllbGRCdWlsZGVyMi5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgiYyIpOwotICAgIGZvcmVpZ25GaWVsZEJ1aWxkZXIyLnNldEZpZWxkKHN1YkZvcmVpZ25GaWVsZERlc2NyaXB0b3IyLCAyKTsKLSAgICBidWlsZGVyMi5hZGRSZXBlYXRlZEZpZWxkKGZvcmVpZ25GaWVsZERlc2NyaXB0b3IsCi0gICAgICAgIGZvcmVpZ25GaWVsZEJ1aWxkZXIyLmJ1aWxkKCkpOwotCi0gICAgLy8gTXV0YXRlIGltcG9ydCBtZXNzYWdlCi0gICAgTWVzc2FnZS5CdWlsZGVyIGltcG9ydEZpZWxkQnVpbGRlcjIgPSBidWlsZGVyMi5uZXdCdWlsZGVyRm9yRmllbGQoCi0gICAgICAgIGltcG9ydEZpZWxkRGVzY3JpcHRvcik7Ci0gICAgRmllbGREZXNjcmlwdG9yIHN1YkltcG9ydEZpZWxkRGVzY3JpcHRvcjIgPQotICAgICAgICBpbXBvcnRGaWVsZEJ1aWxkZXIyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJkIik7Ci0gICAgaW1wb3J0RmllbGRCdWlsZGVyMi5zZXRGaWVsZChzdWJJbXBvcnRGaWVsZERlc2NyaXB0b3IyLCAzKTsKLSAgICBidWlsZGVyMi5hZGRSZXBlYXRlZEZpZWxkKGltcG9ydEZpZWxkRGVzY3JpcHRvciwKLSAgICAgICAgaW1wb3J0RmllbGRCdWlsZGVyMi5idWlsZCgpKTsKLQotICAgIE1lc3NhZ2UgbmV3TWVzc2FnZTIgPSBidWlsZGVyMi5idWlsZCgpOwotCi0gICAgLy8gVGhlc2UgdHdvIG1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KLSAgICBhc3NlcnRFcXVhbHMobmV3TWVzc2FnZTEsIG5ld01lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRSZXBlYXRlZEZpZWxkQnVpbGRlcldpdGhJbml0aWFsaXplZFZhbHVlKCkgewotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA9Ci0gICAgICAgIGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpOwotCi0gICAgLy8gQmVmb3JlIHNldHRpbmcgZmllbGQsIGJ1aWxkZXIgaXMgaW5pdGlhbGl6ZWQgYnkgZGVmYXVsdCB2YWx1ZS4gCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2VCdWlsZGVyKCk7Ci0gICAgTmVzdGVkTWVzc2FnZS5CdWlsZGVyIGZpZWxkQnVpbGRlciA9Ci0gICAgICAgIChOZXN0ZWRNZXNzYWdlLkJ1aWxkZXIpIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoZmllbGREZXNjcmlwdG9yLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZmllbGRCdWlsZGVyLmdldEJiKCkpOwotCi0gICAgLy8gU2V0dGluZyBmaWVsZCB2YWx1ZSB3aXRoIG5ldyBmaWVsZCBidWlsZGVyIGluc3RhbmNlLgotICAgIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIE5lc3RlZE1lc3NhZ2UuQnVpbGRlciBuZXdGaWVsZEJ1aWxkZXIgPQotICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZUJ1aWxkZXIoKTsKLSAgICBuZXdGaWVsZEJ1aWxkZXIuc2V0QmIoMik7Ci0gICAgLy8gVGhlbiBnZXQgdGhlIGZpZWxkIGJ1aWxkZXIgaW5zdGFuY2UgYnkgZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoKS4KLSAgICBmaWVsZEJ1aWxkZXIgPQotICAgICAgICAoTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBidWlsZGVyLmdldFJlcGVhdGVkRmllbGRCdWlsZGVyKGZpZWxkRGVzY3JpcHRvciwgMCk7Ci0gICAgLy8gSXQgc2hvdWxkIGNvbnRhaW4gbmV3IHZhbHVlLgotICAgIGFzc2VydEVxdWFscygyLCBmaWVsZEJ1aWxkZXIuZ2V0QmIoKSk7Ci0gICAgLy8gVGhlc2UgdHdvIGJ1aWxkZXIgc2hvdWxkIGJlIGVxdWFsLgotICAgIGFzc2VydFNhbWUoZmllbGRCdWlsZGVyLCBuZXdGaWVsZEJ1aWxkZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldFJlcGVhdGVkRmllbGRCdWlsZGVyTm90U3VwcG9ydGVkRXhjZXB0aW9uKCkgewotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIiksIDApOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkQnVpbGRlcigKLSAgICAgICAgICBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLmdldFJlcGVhdGVkRmllbGRCdWlsZGVyKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpLCAwKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZEJ1aWxkZXIoCi0gICAgICAgICAgZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiksIDApOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkQnVpbGRlcigKLSAgICAgICAgICBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSwgMCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ludEFycmF5TGlzdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50QXJyYXlMaXN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZmI4ZjNlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50QXJyYXlMaXN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgSW50QXJyYXlMaXN0fS4KLSAqIAotICogQGF1dGhvciBkd2Vpc0Bnb29nbGUuY29tIChEYW5pZWwgV2VpcykKLSAqLwotcHVibGljIGNsYXNzIEludEFycmF5TGlzdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRBcnJheUxpc3QgVU5BUllfTElTVCA9IG5ld0ltbXV0YWJsZUludEFycmF5TGlzdCgxKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgSW50QXJyYXlMaXN0IFRFUlRJQVJZX0xJU1QgPQotICAgICAgbmV3SW1tdXRhYmxlSW50QXJyYXlMaXN0KDEsIDIsIDMpOwotICAKLSAgcHJpdmF0ZSBJbnRBcnJheUxpc3QgbGlzdDsKLSAgCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGxpc3QgPSBuZXcgSW50QXJyYXlMaXN0KCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUxpc3RSZXR1cm5zU2FtZUluc3RhbmNlKCkgewotICAgIGFzc2VydFNhbWUoSW50QXJyYXlMaXN0LmVtcHR5TGlzdCgpLCBJbnRBcnJheUxpc3QuZW1wdHlMaXN0KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMaXN0SXNJbW11dGFibGUoKSB7Ci0gICAgYXNzZXJ0SW1tdXRhYmxlKEludEFycmF5TGlzdC5lbXB0eUxpc3QoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNYWtlSW1tdXRhYmxlKCkgewotICAgIGxpc3QuYWRkSW50KDIpOwotICAgIGxpc3QuYWRkSW50KDQpOwotICAgIGxpc3QuYWRkSW50KDYpOwotICAgIGxpc3QuYWRkSW50KDgpOwotICAgIGxpc3QubWFrZUltbXV0YWJsZSgpOwotICAgIGFzc2VydEltbXV0YWJsZShsaXN0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RpZmljYXRpb25XaXRoSXRlcmF0aW9uKCkgewotICAgIGxpc3QuYWRkQWxsKGFzTGlzdCgxLCAyLCAzLCA0KSk7Ci0gICAgSXRlcmF0b3I8SW50ZWdlcj4gaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgKGludCkgbGlzdC5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscygxLCAoaW50KSBpdGVyYXRvci5uZXh0KCkpOwotICAgIGxpc3Quc2V0KDAsIDEpOwotICAgIGFzc2VydEVxdWFscygyLCAoaW50KSBpdGVyYXRvci5uZXh0KCkpOwotICAgIAotICAgIGxpc3QucmVtb3ZlKDApOwotICAgIHRyeSB7Ci0gICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLQotICAgIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIGxpc3QuYWRkKDAsIDApOwotICAgIHRyeSB7Ci0gICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMSwgKGludCkgVEVSVElBUllfTElTVC5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscygyLCAoaW50KSBURVJUSUFSWV9MSVNULmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIChpbnQpIFRFUlRJQVJZX0xJU1QuZ2V0KDIpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgVEVSVElBUllfTElTVC5nZXQoLTEpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIFRFUlRJQVJZX0xJU1QuZ2V0KDMpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRJbnQoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIFRFUlRJQVJZX0xJU1QuZ2V0SW50KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgVEVSVElBUllfTElTVC5nZXRJbnQoMSkpOwotICAgIGFzc2VydEVxdWFscygzLCBURVJUSUFSWV9MSVNULmdldEludCgyKSk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIFRFUlRJQVJZX0xJU1QuZ2V0KC0xKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBURVJUSUFSWV9MSVNULmdldCgzKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2l6ZSgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgSW50QXJyYXlMaXN0LmVtcHR5TGlzdCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIFVOQVJZX0xJU1Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgVEVSVElBUllfTElTVC5zaXplKCkpOwotCi0gICAgbGlzdC5hZGRJbnQoMik7Ci0gICAgbGlzdC5hZGRJbnQoNCk7Ci0gICAgbGlzdC5hZGRJbnQoNik7Ci0gICAgbGlzdC5hZGRJbnQoOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGxpc3Quc2l6ZSgpKTsKLSAgICAKLSAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotICAgIAotICAgIGxpc3QuYWRkKDE2KTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgbGlzdC5zaXplKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotICAgIGxpc3QuYWRkSW50KDIpOwotICAgIGxpc3QuYWRkSW50KDQpOwotICAgIAotICAgIGFzc2VydEVxdWFscygyLCAoaW50KSBsaXN0LnNldCgwLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SW50KDApKTsKLQotICAgIGFzc2VydEVxdWFscyg0LCAoaW50KSBsaXN0LnNldCgxLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0SW50KDEpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoLTEsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoMiwgMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNldEludCgpIHsKLSAgICBsaXN0LmFkZEludCgyKTsKLSAgICBsaXN0LmFkZEludCg0KTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdC5zZXRJbnQoMCwgMCkpOwotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LmdldEludCgwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoNCwgbGlzdC5zZXRJbnQoMSwgMCkpOwotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LmdldEludCgxKSk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0SW50KC0xLCAwKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0SW50KDIsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RBZGQoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQotICAgIGFzc2VydFRydWUobGlzdC5hZGQoMikpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMiksIGxpc3QpOwotCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZCgzKSk7Ci0gICAgbGlzdC5hZGQoMCwgNCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0LCAyLCAzKSwgbGlzdCk7Ci0gICAgCi0gICAgbGlzdC5hZGQoMCwgMSk7Ci0gICAgbGlzdC5hZGQoMCwgMCk7Ci0gICAgLy8gRm9yY2UgYSByZXNpemUgYnkgZ2V0dGluZyB1cCB0byAxMSBlbGVtZW50cy4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgbGlzdC5hZGQoNSArIGkpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDAsIDEsIDQsIDIsIDMsIDUsIDYsIDcsIDgsIDksIDEwKSwgbGlzdCk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKC0xLCA1KTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZCg0LCA1KTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QWRkSW50KCkgewotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LnNpemUoKSk7Ci0KLSAgICBsaXN0LmFkZEludCgyKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDIpLCBsaXN0KTsKLQotICAgIGxpc3QuYWRkSW50KDMpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMiwgMyksIGxpc3QpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LnNpemUoKSk7Ci0KLSAgICBhc3NlcnRUcnVlKGxpc3QuYWRkQWxsKENvbGxlY3Rpb25zLnNpbmdsZXRvbigxKSkpOwotICAgIGFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIChpbnQpIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXRJbnQoMCkpOwotICAgIAotICAgIGFzc2VydFRydWUobGlzdC5hZGRBbGwoYXNMaXN0KDIsIDMsIDQsIDUsIDYpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgxLCAyLCAzLCA0LCA1LCA2KSwgbGlzdCk7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZEFsbChURVJUSUFSWV9MSVNUKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgxLCAyLCAzLCA0LCA1LCA2LCAxLCAyLCAzKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRGYWxzZShsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy48SW50ZWdlcj5lbXB0eUxpc3QoKSkpOwotICAgIGFzc2VydEZhbHNlKGxpc3QuYWRkQWxsKEludEFycmF5TGlzdC5lbXB0eUxpc3QoKSkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotICAgIGxpc3QuYWRkQWxsKFRFUlRJQVJZX0xJU1QpOwotICAgIGFzc2VydEVxdWFscygxLCAoaW50KSBsaXN0LnJlbW92ZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyLCAzKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRUcnVlKGxpc3QucmVtb3ZlKEludGVnZXIudmFsdWVPZigzKSkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMiksIGxpc3QpOwotCi0gICAgYXNzZXJ0RmFsc2UobGlzdC5yZW1vdmUoSW50ZWdlci52YWx1ZU9mKDMpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMiwgKGludCkgbGlzdC5yZW1vdmUoMCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgbGlzdCk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKC0xKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYXNzZXJ0SW1tdXRhYmxlKEludEFycmF5TGlzdCBsaXN0KSB7Ci0gICAgaWYgKGxpc3QuY29udGFpbnMoMSkpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdGVzdCB0aGUgaW1tdXRhYmlsaXR5IG9mIGxpc3RzIHRoYXQgY29udGFpbiAxLiIpOwotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKDAsIDEpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy48SW50ZWdlcj5lbXB0eUxpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoMSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChuZXcgSW50QXJyYXlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKDEpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgVU5BUllfTElTVCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKDAsIENvbGxlY3Rpb25zLjxJbnRlZ2VyPmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRJbnQoMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuY2xlYXIoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgxKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmUobmV3IE9iamVjdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuPEludGVnZXI+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oMSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoQ29sbGVjdGlvbnMuPEludGVnZXI+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJldGFpbkFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oMSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJldGFpbkFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoMCwgMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0SW50KDAsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBJbnRBcnJheUxpc3QgbmV3SW1tdXRhYmxlSW50QXJyYXlMaXN0KGludC4uLiBlbGVtZW50cykgewotICAgIEludEFycmF5TGlzdCBsaXN0ID0gbmV3IEludEFycmF5TGlzdCgpOwotICAgIGZvciAoaW50IGVsZW1lbnQgOiBlbGVtZW50cykgewotICAgICAgbGlzdC5hZGRJbnQoZWxlbWVudCk7Ci0gICAgfQotICAgIGxpc3QubWFrZUltbXV0YWJsZSgpOwotICAgIHJldHVybiBsaXN0OwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0lzVmFsaWRVdGY4VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Jc1ZhbGlkVXRmOFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzU2MDQ5Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0lzVmFsaWRVdGY4VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTg2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Jc1ZhbGlkVXRmOFRlc3RVdGlsLkRJUkVDVF9OSU9fRkFDVE9SWTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Jc1ZhbGlkVXRmOFRlc3RVdGlsLkVYUEVDVEVEX09ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLklzVmFsaWRVdGY4VGVzdFV0aWwuRVhQRUNURURfVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVDsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Jc1ZhbGlkVXRmOFRlc3RVdGlsLkhFQVBfTklPX0ZBQ1RPUlk7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuSXNWYWxpZFV0ZjhUZXN0VXRpbC5MSVRFUkFMX0ZBQ1RPUlk7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuSXNWYWxpZFV0ZjhUZXN0VXRpbC50ZXN0Qnl0ZXM7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLklzVmFsaWRVdGY4VGVzdFV0aWwuQnl0ZVN0cmluZ0ZhY3Rvcnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Jc1ZhbGlkVXRmOFRlc3RVdGlsLlNoYXJkOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIGNhc2VzIGZvciB7QGxpbmsgQnl0ZVN0cmluZyNpc1ZhbGlkVXRmOCgpfS4gVGhpcyBpbmNsdWRlcyB0aHJlZQotICogYnJ1dGUgZm9yY2UgdGVzdHMgdGhhdCBhY3R1YWxseSB0ZXN0IGV2ZXJ5IHBlcm11dGF0aW9uIG9mIG9uZSBieXRlLCB0d28gYnl0ZSwKLSAqIGFuZCB0aHJlZSBieXRlIHNlcXVlbmNlcyB0byBlbnN1cmUgdGhhdCB0aGUgbWV0aG9kIHByb2R1Y2VzIHRoZSByaWdodCByZXN1bHQKLSAqIGZvciBldmVyeSBwb3NzaWJsZSBieXRlIGVuY29kaW5nIHdoZXJlICJyaWdodCIgbWVhbnMgaXQncyBjb25zaXN0ZW50IHdpdGgKLSAqIGphdmEncyBVVEYtOCBzdHJpbmcgZW5jb2RpbmcvZGVjb2Rpbmcgc3VjaCB0aGF0IHRoZSBtZXRob2QgcmV0dXJucyB0cnVlIGZvcgotICogYW55IHNlcXVlbmNlIHRoYXQgd2lsbCByb3VuZCB0cmlwIHdoZW4gY29udmVydGVkIHRvIGEgU3RyaW5nIGFuZCB0aGVuIGJhY2sgdG8KLSAqIGJ5dGVzIGFuZCB3aWxsIHJldHVybiBmYWxzZSBmb3IgYW55IHNlcXVlbmNlIHRoYXQgd2lsbCBub3Qgcm91bmQgdHJpcC4KLSAqIFNlZSBhbHNvIHtAbGluayBJc1ZhbGlkVXRmOEZvdXJCeXRlVGVzdH0uIEl0IGFsc28gaW5jbHVkZXMgc29tZQotICogb3RoZXIgbW9yZSB0YXJnZXRlZCB0ZXN0cy4KLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqIEBhdXRob3IgbWFydGlucmJAZ29vZ2xlLmNvbSAoTWFydGluIEJ1Y2hob2x6KQotICovCi1wdWJsaWMgY2xhc3MgSXNWYWxpZFV0ZjhUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAvKioKLSAgICogVGVzdHMgdGhhdCByb3VuZCB0cmlwcGluZyBvZiBhbGwgdHdvIGJ5dGUgcGVybXV0YXRpb25zIHdvcmsuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0SXNWYWxpZFV0ZjhfMUJ5dGUoKSB7Ci0gICAgdGVzdEJ5dGVzKExJVEVSQUxfRkFDVE9SWSwgMSwgRVhQRUNURURfT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ09VTlQpOwotICAgIHRlc3RCeXRlcyhIRUFQX05JT19GQUNUT1JZLCAxLCBFWFBFQ1RFRF9PTkVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCk7Ci0gICAgdGVzdEJ5dGVzKERJUkVDVF9OSU9fRkFDVE9SWSwgMSwgRVhQRUNURURfT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ09VTlQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgcm91bmQgdHJpcHBpbmcgb2YgYWxsIHR3byBieXRlIHBlcm11dGF0aW9ucyB3b3JrLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdElzVmFsaWRVdGY4XzJCeXRlcygpIHsKLSAgICB0ZXN0Qnl0ZXMoTElURVJBTF9GQUNUT1JZLCAyLCBJc1ZhbGlkVXRmOFRlc3RVdGlsLkVYUEVDVEVEX1RXT19CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UKTsKLSAgICB0ZXN0Qnl0ZXMoSEVBUF9OSU9fRkFDVE9SWSwgMiwgSXNWYWxpZFV0ZjhUZXN0VXRpbC5FWFBFQ1RFRF9UV09fQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCk7Ci0gICAgdGVzdEJ5dGVzKERJUkVDVF9OSU9fRkFDVE9SWSwgMiwgSXNWYWxpZFV0ZjhUZXN0VXRpbC5FWFBFQ1RFRF9UV09fQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdGhhdCByb3VuZCB0cmlwcGluZyBvZiBhbGwgdGhyZWUgYnl0ZSBwZXJtdXRhdGlvbnMgd29yay4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJc1ZhbGlkVXRmOF8zQnl0ZXMoKSB7Ci0gICAgLy8gVHJhdmlzJyBPT00ga2lsbGVyIGRvZXNuJ3QgbGlrZSB0aGlzIHRlc3QKLSAgICBpZiAoU3lzdGVtLmdldGVudigiVFJBVklTIikgPT0gbnVsbCkgewotICAgICAgdGVzdEJ5dGVzKExJVEVSQUxfRkFDVE9SWSwgMywgRVhQRUNURURfVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCk7Ci0gICAgICB0ZXN0Qnl0ZXMoSEVBUF9OSU9fRkFDVE9SWSwgMywgRVhQRUNURURfVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCk7Ci0gICAgICB0ZXN0Qnl0ZXMoRElSRUNUX05JT19GQUNUT1JZLCAzLCBFWFBFQ1RFRF9USFJFRV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdGhhdCByb3VuZCB0cmlwcGluZyBvZiBhIHNhbXBsZSBvZiBmb3VyIGJ5dGUgcGVybXV0YXRpb25zIHdvcmsuCi0gICAqIEFsbCBwZXJtdXRhdGlvbnMgYXJlIHByb2hpYml0aXZlbHkgZXhwZW5zaXZlIHRvIHRlc3QgZm9yIGF1dG9tYXRlZCBydW5zOwotICAgKiB7QGxpbmsgSXNWYWxpZFV0ZjhGb3VyQnl0ZVRlc3R9IGlzIHVzZWQgZm9yIGZ1bGwgY292ZXJhZ2UuIFRoaXMgbWV0aG9kCi0gICAqIHRlc3RzIHNwZWNpZmljIGZvdXItYnl0ZSBjYXNlcy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RJc1ZhbGlkVXRmOF80Qnl0ZXNTYW1wbGVzKCkgewotICAgIC8vIFZhbGlkIDQgYnl0ZS4KLSAgICBhc3NlcnRWYWxpZFV0ZjgoMHhGMCwgMHhBNCwgMHhBRCwgMHhBMik7Ci0KLSAgICAvLyBCYWQgdHJhaWxpbmcgYnl0ZXMKLSAgICBhc3NlcnRJbnZhbGlkVXRmOCgweEYwLCAweEE0LCAweEFELCAweDdGKTsKLSAgICBhc3NlcnRJbnZhbGlkVXRmOCgweEYwLCAweEE0LCAweEFELCAweEMwKTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZXMgZm9yIGJ5dGUyCi0gICAgYXNzZXJ0SW52YWxpZFV0ZjgoMHhGMCwgMHg4RiwgMHhBRCwgMHhBMik7Ci0gICAgYXNzZXJ0SW52YWxpZFV0ZjgoMHhGNCwgMHg5MCwgMHhBRCwgMHhBMik7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgc29tZSBoYXJkLWNvZGVkIHRlc3QgY2FzZXMuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U29tZVNlcXVlbmNlcygpIHsKLSAgICAvLyBFbXB0eQotICAgIGFzc2VydFRydWUoYXNCeXRlcygiIikuaXNWYWxpZFV0ZjgoKSk7Ci0KLSAgICAvLyBPbmUtYnl0ZSBjaGFyYWN0ZXJzLCBpbmNsdWRpbmcgY29udHJvbCBjaGFyYWN0ZXJzCi0gICAgYXNzZXJ0VHJ1ZShhc0J5dGVzKCJcdTAwMDBhYmNcdTAwN2YiKS5pc1ZhbGlkVXRmOCgpKTsKLQotICAgIC8vIFR3by1ieXRlIGNoYXJhY3RlcnMKLSAgICBhc3NlcnRUcnVlKGFzQnl0ZXMoIlx1MDBhMlx1MDBhMiIpLmlzVmFsaWRVdGY4KCkpOwotCi0gICAgLy8gVGhyZWUtYnl0ZSBjaGFyYWN0ZXJzCi0gICAgYXNzZXJ0VHJ1ZShhc0J5dGVzKCJcdTAyMGFjXHUwMjBhYyIpLmlzVmFsaWRVdGY4KCkpOwotCi0gICAgLy8gRm91ci1ieXRlIGNoYXJhY3RlcnMKLSAgICBhc3NlcnRUcnVlKGFzQnl0ZXMoIlx1MDI0QjYyXHUwMjRCNjIiKS5pc1ZhbGlkVXRmOCgpKTsKLQotICAgIC8vIE1peGVkIHN0cmluZwotICAgIGFzc2VydFRydWUoYXNCeXRlcygiYVx1MDIwYWNcdTAwYTJiXFx1MDI0QjYydTAyMGFjY1x1MDBhMmRlXHUwMjRCNjIiKS5pc1ZhbGlkVXRmOCgpKTsKLQotICAgIC8vIE5vdCBhIHZhbGlkIHN0cmluZwotICAgIGFzc2VydEludmFsaWRVdGY4KC0xLCAwLCAtMSwgMCk7Ci0gIH0KLQotICBwcml2YXRlIGJ5dGVbXSB0b0J5dGVBcnJheShpbnQuLi4gYnl0ZXMpIHsKLSAgICBieXRlW10gcmVhbEJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICByZWFsQnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNbaV07Ci0gICAgfQotICAgIHJldHVybiByZWFsQnl0ZXM7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0VmFsaWRVdGY4KEJ5dGVTdHJpbmdGYWN0b3J5IGZhY3RvcnksIGludFtdIGJ5dGVzLCBib29sZWFuIG5vdCkgewotICAgIGJ5dGVbXSByZWFsQnl0ZXMgPSB0b0J5dGVBcnJheShieXRlcyk7Ci0gICAgYXNzZXJ0VHJ1ZShub3QgXiBVdGY4LmlzVmFsaWRVdGY4KHJlYWxCeXRlcykpOwotICAgIGFzc2VydFRydWUobm90IF4gVXRmOC5pc1ZhbGlkVXRmOChyZWFsQnl0ZXMsIDAsIGJ5dGVzLmxlbmd0aCkpOwotICAgIEJ5dGVTdHJpbmcgbGVhZiA9IGZhY3RvcnkubmV3Qnl0ZVN0cmluZyhyZWFsQnl0ZXMpOwotICAgIEJ5dGVTdHJpbmcgc3ViID0gbGVhZi5zdWJzdHJpbmcoMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG5vdCBeIGxlYWYuaXNWYWxpZFV0ZjgoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShub3QgXiBzdWIuaXNWYWxpZFV0ZjgoKSk7Ci0gICAgQnl0ZVN0cmluZ1tdIHJvcGVzID0gewotICAgICAgICBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3QoQnl0ZVN0cmluZy5FTVBUWSwgbGVhZiksCi0gICAgICAgIFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdChCeXRlU3RyaW5nLkVNUFRZLCBzdWIpLAotICAgICAgICBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3QobGVhZiwgQnl0ZVN0cmluZy5FTVBUWSksCi0gICAgICAgIFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdChzdWIsIEJ5dGVTdHJpbmcuRU1QVFkpLAotICAgICAgICBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3Qoc3ViLCBsZWFmKX07Ci0gICAgZm9yIChCeXRlU3RyaW5nIHJvcGUgOiByb3BlcykgewotICAgICAgYXNzZXJ0VHJ1ZShub3QgXiByb3BlLmlzVmFsaWRVdGY4KCkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRWYWxpZFV0ZjgoaW50Li4uIGJ5dGVzKSB7Ci0gICAgYXNzZXJ0VmFsaWRVdGY4KExJVEVSQUxfRkFDVE9SWSwgYnl0ZXMsIGZhbHNlKTsKLSAgICBhc3NlcnRWYWxpZFV0ZjgoSEVBUF9OSU9fRkFDVE9SWSwgYnl0ZXMsIGZhbHNlKTsKLSAgICBhc3NlcnRWYWxpZFV0ZjgoRElSRUNUX05JT19GQUNUT1JZLCBieXRlcywgZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEludmFsaWRVdGY4KGludC4uLiBieXRlcykgewotICAgIGFzc2VydFZhbGlkVXRmOChMSVRFUkFMX0ZBQ1RPUlksIGJ5dGVzLCB0cnVlKTsKLSAgICBhc3NlcnRWYWxpZFV0ZjgoSEVBUF9OSU9fRkFDVE9SWSwgYnl0ZXMsIHRydWUpOwotICAgIGFzc2VydFZhbGlkVXRmOChESVJFQ1RfTklPX0ZBQ1RPUlksIGJ5dGVzLCB0cnVlKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgYXNCeXRlcyhTdHJpbmcgcykgewotICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTaGFyZHNIYXZlRXhwZWN0ZWRSb3VuZFRyaXBwYWJsZXMoKSB7Ci0gICAgLy8gQSBzYW5pdHkgY2hlY2suCi0gICAgaW50IGFjdHVhbCA9IDA7Ci0gICAgZm9yIChTaGFyZCBzaGFyZCA6IElzVmFsaWRVdGY4VGVzdFV0aWwuRk9VUl9CWVRFX1NIQVJEUykgewotICAgICAgYWN0dWFsICs9IHNoYXJkLmV4cGVjdGVkOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoSXNWYWxpZFV0ZjhUZXN0VXRpbC5FWFBFQ1RFRF9GT1VSX0JZVEVfUk9VTkRUUklQUEFCTEVfQ09VTlQsIGFjdHVhbCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSXNWYWxpZFV0ZjhUZXN0VXRpbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Jc1ZhbGlkVXRmOFRlc3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2YTgwOGIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Jc1ZhbGlkVXRmOFRlc3RVdGlsLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0NDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEVxdWFsczsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRGYWxzZTsKLWltcG9ydCBzdGF0aWMgb3JnLmp1bml0LkFzc2VydC5hc3NlcnRTYW1lOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGphdmEubGFuZy5yZWYuU29mdFJlZmVyZW5jZTsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkNoYXJCdWZmZXI7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5DaGFyc2V0RGVjb2RlcjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXRFbmNvZGVyOwotaW1wb3J0IGphdmEubmlvLmNoYXJzZXQuQ29kZXJSZXN1bHQ7Ci1pbXBvcnQgamF2YS5uaW8uY2hhcnNldC5Db2RpbmdFcnJvckFjdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbTsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogU2hhcmVkIHRlc3RpbmcgY29kZSBmb3Ige0BsaW5rIElzVmFsaWRVdGY4VGVzdH0gYW5kCi0gKiB7QGxpbmsgSXNWYWxpZFV0ZjhGb3VyQnl0ZVRlc3R9LgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICogQGF1dGhvciBtYXJ0aW5yYkBnb29nbGUuY29tIChNYXJ0aW4gQnVjaGhvbHopCi0gKi8KLWZpbmFsIGNsYXNzIElzVmFsaWRVdGY4VGVzdFV0aWwgewotICBwcml2YXRlIHN0YXRpYyBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihJc1ZhbGlkVXRmOFRlc3RVdGlsLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHJpdmF0ZSBJc1ZhbGlkVXRmOFRlc3RVdGlsKCkge30KLQotICBzdGF0aWMgaW50ZXJmYWNlIEJ5dGVTdHJpbmdGYWN0b3J5IHsKLSAgICBCeXRlU3RyaW5nIG5ld0J5dGVTdHJpbmcoYnl0ZVtdIGJ5dGVzKTsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBCeXRlU3RyaW5nRmFjdG9yeSBMSVRFUkFMX0ZBQ1RPUlkgPSBuZXcgQnl0ZVN0cmluZ0ZhY3RvcnkoKSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ5dGVTdHJpbmcgbmV3Qnl0ZVN0cmluZyhieXRlW10gYnl0ZXMpIHsKLSAgICAgIHJldHVybiBCeXRlU3RyaW5nLndyYXAoYnl0ZXMpOwotICAgIH0KLSAgfTsKLQotICBzdGF0aWMgZmluYWwgQnl0ZVN0cmluZ0ZhY3RvcnkgSEVBUF9OSU9fRkFDVE9SWSA9IG5ldyBCeXRlU3RyaW5nRmFjdG9yeSgpIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnl0ZVN0cmluZyBuZXdCeXRlU3RyaW5nKGJ5dGVbXSBieXRlcykgewotICAgICAgcmV0dXJuIG5ldyBOaW9CeXRlU3RyaW5nKEJ5dGVCdWZmZXIud3JhcChieXRlcykpOwotICAgIH0KLSAgfTsKLQotICBwcml2YXRlIHN0YXRpYyBUaHJlYWRMb2NhbDxTb2Z0UmVmZXJlbmNlPEJ5dGVCdWZmZXI+PiBkaXJlY3RCdWZmZXIgPQotICAgICAgbmV3IFRocmVhZExvY2FsPFNvZnRSZWZlcmVuY2U8Qnl0ZUJ1ZmZlcj4+KCk7Ci0KLSAgLyoqCi0gICAqIEZhY3RvcnkgZm9yIGRpcmVjdCB7QGxpbmsgQnl0ZUJ1ZmZlcn0gaW5zdGFuY2VzLiBUbyByZWR1Y2UgZGlyZWN0IG1lbW9yeSB1c2FnZSwgdGhpcwotICAgKiB1c2VzIGEgdGhyZWFkIGxvY2FsIGRpcmVjdCBidWZmZXIuIFRoaXMgbWVhbnMgdGhhdCBlYWNoIGNhbGwgd2lsbCBvdmVyd3JpdGUgdGhlIGJ1ZmZlcidzCi0gICAqIGNvbnRlbnRzIGZyb20gdGhlIHByZXZpb3VzIGNhbGwsIHNvIHRoZSBjYWxsaW5nIGNvZGUgbXVzdCBiZSBjYXJlZnVsIG5vdCB0byBjb250aW51ZSB1c2luZwotICAgKiBhIGJ1ZmZlciByZXR1cm5lZCBmcm9tIGEgcHJldmlvdXMgaW52b2NhdGlvbi4KLSAgICovCi0gIHN0YXRpYyBmaW5hbCBCeXRlU3RyaW5nRmFjdG9yeSBESVJFQ1RfTklPX0ZBQ1RPUlkgPSBuZXcgQnl0ZVN0cmluZ0ZhY3RvcnkoKSB7Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ5dGVTdHJpbmcgbmV3Qnl0ZVN0cmluZyhieXRlW10gYnl0ZXMpIHsKLSAgICAgIFNvZnRSZWZlcmVuY2U8Qnl0ZUJ1ZmZlcj4gcmVmID0gZGlyZWN0QnVmZmVyLmdldCgpOwotICAgICAgQnl0ZUJ1ZmZlciBidWZmZXIgPSByZWYgPT0gbnVsbCA/IG51bGwgOiByZWYuZ2V0KCk7Ci0gICAgICBpZiAoYnVmZmVyID09IG51bGwgfHwgYnVmZmVyLmNhcGFjaXR5KCkgPCBieXRlcy5sZW5ndGgpIHsKLSAgICAgICAgYnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZURpcmVjdChieXRlcy5sZW5ndGgpOwotICAgICAgICBkaXJlY3RCdWZmZXIuc2V0KG5ldyBTb2Z0UmVmZXJlbmNlPEJ5dGVCdWZmZXI+KGJ1ZmZlcikpOwotICAgICAgfQotICAgICAgYnVmZmVyLmNsZWFyKCk7Ci0gICAgICBidWZmZXIucHV0KGJ5dGVzKTsKLSAgICAgIGJ1ZmZlci5mbGlwKCk7Ci0gICAgICByZXR1cm4gbmV3IE5pb0J5dGVTdHJpbmcoYnVmZmVyKTsKLSAgICB9Ci0gIH07Ci0KLSAgLy8gMTI4IC0gW2NoYXJzIDB4MDAwMCB0byAweDAwN2ZdCi0gIHN0YXRpYyBmaW5hbCBsb25nIE9ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgPSAweDAwN2YgLSAweDAwMDAgKyAxOwotCi0gIC8vIDEyOAotICBzdGF0aWMgZmluYWwgbG9uZyBFWFBFQ1RFRF9PTkVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCA9IE9ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlM7Ci0KLSAgLy8gMTkyMCBbY2hhcnMgMHgwMDgwIHRvIDB4MDdGRl0KLSAgc3RhdGljIGZpbmFsIGxvbmcgVFdPX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyA9IDB4MDdGRiAtIDB4MDA4MCArIDE7Ci0KLSAgLy8gMTgsMzA0Ci0gIHN0YXRpYyBmaW5hbCBsb25nIEVYUEVDVEVEX1RXT19CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UID0KLSAgICAgIC8vIEJvdGggYnl0ZXMgYXJlIG9uZSBieXRlIGNoYXJhY3RlcnMKLSAgICAgIChsb25nKSBNYXRoLnBvdyhFWFBFQ1RFRF9PTkVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCwgMikgKwotICAgICAgLy8gVGhlIHBvc3NpYmxlIG51bWJlciBvZiB0d28gYnl0ZSBjaGFyYWN0ZXJzCi0gICAgICBUV09fQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTOwotCi0gIC8vIDIwNDgKLSAgc3RhdGljIGZpbmFsIGxvbmcgVEhSRUVfQllURV9TVVJST0dBVEVTID0gMiAqIDEwMjQ7Ci0KLSAgLy8gNjEsNDQwIFtjaGFycyAweDA4MDAgdG8gMHhGRkZGLCBtaW51cyBzdXJyb2dhdGVzXQotICBzdGF0aWMgZmluYWwgbG9uZyBUSFJFRV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgPQotICAgICAgMHhGRkZGIC0gMHgwODAwICsgMSAtIFRIUkVFX0JZVEVfU1VSUk9HQVRFUzsKLQotICAvLyAyLDY1MCwxMTIKLSAgc3RhdGljIGZpbmFsIGxvbmcgRVhQRUNURURfVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DT1VOVCA9Ci0gICAgICAvLyBBbGwgb25lIGJ5dGUgY2hhcmFjdGVycwotICAgICAgKGxvbmcpIE1hdGgucG93KEVYUEVDVEVEX09ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5ULCAzKSArCi0gICAgICAvLyBPbmUgdHdvIGJ5dGUgY2hhcmFjdGVyIGFuZCBhIG9uZSBieXRlIGNoYXJhY3RlcgotICAgICAgMiAqIFRXT19CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgKiBPTkVfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTICsKLSAgICAgIC8vIFRocmVlIGJ5dGUgY2hhcmFjdGVycwotICAgICAgVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTOwotCi0gIC8vIDEsMDQ4LDU3NiBbY2hhcnMgMHgxMDAwMEwgdG8gMHgxMEZGRkZdCi0gIHN0YXRpYyBmaW5hbCBsb25nIEZPVVJfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTID0gMHgxMEZGRkYgLSAweDEwMDAwTCArIDE7Ci0KLSAgLy8gMjg5LDU3MSw4MzkKLSAgc3RhdGljIGZpbmFsIGxvbmcgRVhQRUNURURfRk9VUl9CWVRFX1JPVU5EVFJJUFBBQkxFX0NPVU5UID0KLSAgICAgIC8vIEFsbCBvbmUgYnl0ZSBjaGFyYWN0ZXJzCi0gICAgICAobG9uZykgTWF0aC5wb3coRVhQRUNURURfT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ09VTlQsIDQpICsKLSAgICAgIC8vIE9uZSBhbmQgdGhyZWUgYnl0ZSBjaGFyYWN0ZXJzCi0gICAgICAyICogVEhSRUVfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTICogT05FX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyArCi0gICAgICAvLyBUd28gdHdvIGJ5dGUgY2hhcmFjdGVycwotICAgICAgVFdPX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUyAqIFRXT19CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgKwotICAgICAgLy8gUGVybXV0YXRpb25zIG9mIG9uZSBhbmQgdHdvIGJ5dGUgY2hhcmFjdGVycwotICAgICAgMyAqIFRXT19CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMgKiBPTkVfQllURV9ST1VORFRSSVBQQUJMRV9DSEFSQUNURVJTCi0gICAgICAqIE9ORV9CWVRFX1JPVU5EVFJJUFBBQkxFX0NIQVJBQ1RFUlMKLSAgICAgICsKLSAgICAgIC8vIEZvdXIgYnl0ZSBjaGFyYWN0ZXJzCi0gICAgICBGT1VSX0JZVEVfUk9VTkRUUklQUEFCTEVfQ0hBUkFDVEVSUzsKLQotICBzdGF0aWMgZmluYWwgY2xhc3MgU2hhcmQgewotICAgIGZpbmFsIGxvbmcgaW5kZXg7Ci0gICAgZmluYWwgbG9uZyBzdGFydDsKLSAgICBmaW5hbCBsb25nIGxpbTsKLSAgICBmaW5hbCBsb25nIGV4cGVjdGVkOwotCi0KLSAgICBwdWJsaWMgU2hhcmQobG9uZyBpbmRleCwgbG9uZyBzdGFydCwgbG9uZyBsaW0sIGxvbmcgZXhwZWN0ZWQpIHsKLSAgICAgIGFzc2VydFRydWUoc3RhcnQgPCBsaW0pOwotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgICAgdGhpcy5zdGFydCA9IHN0YXJ0OwotICAgICAgdGhpcy5saW0gPSBsaW07Ci0gICAgICB0aGlzLmV4cGVjdGVkID0gZXhwZWN0ZWQ7Ci0gICAgfQotICB9Ci0KLSAgc3RhdGljIGZpbmFsIGxvbmdbXSBGT1VSX0JZVEVfU0hBUkRTX0VYUEVDVEVEX1JPVU5UUklQUEFCTEVTID0KLSAgICAgIGdlbmVyYXRlRm91ckJ5dGVTaGFyZHNFeHBlY3RlZFJ1bm5hYmxlcygpOwotCi0gIHByaXZhdGUgc3RhdGljIGxvbmdbXSBnZW5lcmF0ZUZvdXJCeXRlU2hhcmRzRXhwZWN0ZWRSdW5uYWJsZXMoKSB7Ci0gICAgbG9uZ1tdIGV4cGVjdGVkID0gbmV3IGxvbmdbMTI4XTsKLQotICAgIC8vIDAtNjMgYXJlIGFsbCA1MzAwMjI0Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPD0gNjM7IGkrKykgewotICAgICAgZXhwZWN0ZWRbaV0gPSA1MzAwMjI0OwotICAgIH0KLQotICAgIC8vIDk3LTExMSBhcmUgYWxsIDIzNDI5MTIKLSAgICBmb3IgKGludCBpID0gOTc7IGkgPD0gMTExOyBpKyspIHsKLSAgICAgIGV4cGVjdGVkW2ldID0gMjM0MjkxMjsKLSAgICB9Ci0KLSAgICAvLyAxMTMtMTE3IGFyZSBhbGwgMTA0ODU3NgotICAgIGZvciAoaW50IGkgPSAxMTM7IGkgPD0gMTE3OyBpKyspIHsKLSAgICAgIGV4cGVjdGVkW2ldID0gMTA0ODU3NjsKLSAgICB9Ci0KLSAgICAvLyBPbmUgb2ZmcwotICAgIGV4cGVjdGVkWzExMl0gPSA3ODY0MzI7Ci0gICAgZXhwZWN0ZWRbMTE4XSA9IDc4NjQzMjsKLSAgICBleHBlY3RlZFsxMTldID0gMTA0ODU3NjsKLSAgICBleHBlY3RlZFsxMjBdID0gNDU4NzUyOwotICAgIGV4cGVjdGVkWzEyMV0gPSA1MjQyODg7Ci0gICAgZXhwZWN0ZWRbMTIyXSA9IDY1NTM2OwotCi0gICAgLy8gQW55dGhpbmcgbm90IGFzc2lnbmVkIHdhcyB0aGUgZGVmYXVsdCAwLgotICAgIHJldHVybiBleHBlY3RlZDsKLSAgfQotCi0gIHN0YXRpYyBmaW5hbCBMaXN0PFNoYXJkPiBGT1VSX0JZVEVfU0hBUkRTID0KLSAgICAgIGdlbmVyYXRlRm91ckJ5dGVTaGFyZHMoMTI4LCBGT1VSX0JZVEVfU0hBUkRTX0VYUEVDVEVEX1JPVU5UUklQUEFCTEVTKTsKLQotCi0gIHByaXZhdGUgc3RhdGljIExpc3Q8U2hhcmQ+IGdlbmVyYXRlRm91ckJ5dGVTaGFyZHMoaW50IG51bVNoYXJkcywgbG9uZ1tdIGV4cGVjdGVkKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKG51bVNoYXJkcywgZXhwZWN0ZWQubGVuZ3RoKTsKLSAgICBMaXN0PFNoYXJkPiBzaGFyZHMgPSBuZXcgQXJyYXlMaXN0PFNoYXJkPihudW1TaGFyZHMpOwotICAgIGxvbmcgTElNID0gMUwgPDwgMzI7Ci0gICAgbG9uZyBpbmNyZW1lbnQgPSBMSU0gLyBudW1TaGFyZHM7Ci0gICAgYXNzZXJ0VHJ1ZShMSU0gJSBudW1TaGFyZHMgPT0gMCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1TaGFyZHM7IGkrKykgewotICAgICAgc2hhcmRzLmFkZChuZXcgU2hhcmQoaSwgaW5jcmVtZW50ICogaSwgaW5jcmVtZW50ICogKGkgKyAxKSwgZXhwZWN0ZWRbaV0pKTsKLSAgICB9Ci0gICAgcmV0dXJuIHNoYXJkczsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgdG8gcnVuIHRoZSBsb29wIHRvIHRlc3QgYWxsIHRoZSBwZXJtdXRhdGlvbnMgZm9yIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICogc3BlY2lmaWVkLgotICAgKgotICAgKiBAcGFyYW0gZmFjdG9yeSB0aGUgZmFjdG9yeSBmb3Ige0BsaW5rIEJ5dGVTdHJpbmd9IGluc3RhbmNlcy4KLSAgICogQHBhcmFtIG51bUJ5dGVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ5dGUgYXJyYXkKLSAgICogQHBhcmFtIGV4cGVjdGVkQ291bnQgdGhlIGV4cGVjdGVkIG51bWJlciBvZiByb3VuZHRyaXBwYWJsZSBwZXJtdXRhdGlvbnMKLSAgICovCi0gIHN0YXRpYyB2b2lkIHRlc3RCeXRlcyhCeXRlU3RyaW5nRmFjdG9yeSBmYWN0b3J5LCBpbnQgbnVtQnl0ZXMsIGxvbmcgZXhwZWN0ZWRDb3VudCkgewotICAgIHRlc3RCeXRlcyhmYWN0b3J5LCBudW1CeXRlcywgZXhwZWN0ZWRDb3VudCwgMCwgLTEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciB0byBydW4gdGhlIGxvb3AgdG8gdGVzdCBhbGwgdGhlIHBlcm11dGF0aW9ucyBmb3IgdGhlIG51bWJlciBvZiBieXRlcwotICAgKiBzcGVjaWZpZWQuIFRoaXMgb3ZlcmxvYWQgaXMgdXNlZnVsIGZvciBkZWJ1Z2dpbmcgdG8gZ2V0IHRoZSBsb29wIHRvIHN0YXJ0Ci0gICAqIGF0IGEgY2VydGFpbiBjaGFyYWN0ZXIuCi0gICAqCi0gICAqIEBwYXJhbSBmYWN0b3J5IHRoZSBmYWN0b3J5IGZvciB7QGxpbmsgQnl0ZVN0cmluZ30gaW5zdGFuY2VzLgotICAgKiBAcGFyYW0gbnVtQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnl0ZSBhcnJheQotICAgKiBAcGFyYW0gZXhwZWN0ZWRDb3VudCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHJvdW5kdHJpcHBhYmxlIHBlcm11dGF0aW9ucwotICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGJ5dGVzIGVuY29kZWQgYXMgYSBsb25nIGFzIGJpZy1lbmRpYW4KLSAgICogQHBhcmFtIGxpbSB0aGUgbGltaXQgb2YgYnl0ZXMgdG8gcHJvY2VzcyBlbmNvZGVkIGFzIGEgbG9uZyBhcyBiaWctZW5kaWFuLAotICAgKiAgICAgb3IgLTEgdG8gbWVhbiB0aGUgbWF4IGxpbWl0IGZvciBudW1CeXRlcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdGVzdEJ5dGVzKAotICAgICAgQnl0ZVN0cmluZ0ZhY3RvcnkgZmFjdG9yeSwgaW50IG51bUJ5dGVzLCBsb25nIGV4cGVjdGVkQ291bnQsIGxvbmcgc3RhcnQsIGxvbmcgbGltKSB7Ci0gICAgUmFuZG9tIHJuZCA9IG5ldyBSYW5kb20oKTsKLSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtudW1CeXRlc107Ci0KLSAgICBpZiAobGltID09IC0xKSB7Ci0gICAgICBsaW0gPSAxTCA8PCAobnVtQnl0ZXMgKiA4KTsKLSAgICB9Ci0gICAgbG9uZyBjb3VudCA9IDA7Ci0gICAgbG9uZyBjb3VudFJvdW5kVHJpcHBlZCA9IDA7Ci0gICAgZm9yIChsb25nIGJ5dGVDaGFyID0gc3RhcnQ7IGJ5dGVDaGFyIDwgbGltOyBieXRlQ2hhcisrKSB7Ci0gICAgICBsb25nIHRtcEJ5dGVDaGFyID0gYnl0ZUNoYXI7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ5dGVzOyBpKyspIHsKLSAgICAgICAgYnl0ZXNbYnl0ZXMubGVuZ3RoIC0gaSAtIDFdID0gKGJ5dGUpIHRtcEJ5dGVDaGFyOwotICAgICAgICB0bXBCeXRlQ2hhciA9IHRtcEJ5dGVDaGFyID4+IDg7Ci0gICAgICB9Ci0gICAgICBCeXRlU3RyaW5nIGJzID0gZmFjdG9yeS5uZXdCeXRlU3RyaW5nKGJ5dGVzKTsKLSAgICAgIGJvb2xlYW4gaXNSb3VuZFRyaXBwYWJsZSA9IGJzLmlzVmFsaWRVdGY4KCk7Ci0gICAgICBTdHJpbmcgcyA9IG5ldyBTdHJpbmcoYnl0ZXMsIEludGVybmFsLlVURl84KTsKLSAgICAgIGJ5dGVbXSBieXRlc1JlZW5jb2RlZCA9IHMuZ2V0Qnl0ZXMoSW50ZXJuYWwuVVRGXzgpOwotICAgICAgYm9vbGVhbiBieXRlc0VxdWFsID0gQXJyYXlzLmVxdWFscyhieXRlcywgYnl0ZXNSZWVuY29kZWQpOwotCi0gICAgICBpZiAoYnl0ZXNFcXVhbCAhPSBpc1JvdW5kVHJpcHBhYmxlKSB7Ci0gICAgICAgIG91dHB1dEZhaWx1cmUoYnl0ZUNoYXIsIGJ5dGVzLCBieXRlc1JlZW5jb2RlZCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGFncmVlbWVudCB3aXRoIHN0YXRpYyBVdGY4IG1ldGhvZHMuCi0gICAgICBhc3NlcnRFcXVhbHMoaXNSb3VuZFRyaXBwYWJsZSwgVXRmOC5pc1ZhbGlkVXRmOChieXRlcykpOwotICAgICAgYXNzZXJ0RXF1YWxzKGlzUm91bmRUcmlwcGFibGUsIFV0ZjguaXNWYWxpZFV0ZjgoYnl0ZXMsIDAsIG51bUJ5dGVzKSk7Ci0KLSAgICAgIC8vIFRlc3QgcGFydGlhbCBzZXF1ZW5jZXMuCi0gICAgICAvLyBQYXJ0aXRpb24gbnVtQnl0ZXMgaW50byB0aHJlZSBzZWdtZW50cyAobm90IG5lY2Vzc2FyaWx5IG5vbi1lbXB0eSkuCi0gICAgICBpbnQgaSA9IHJuZC5uZXh0SW50KG51bUJ5dGVzKTsKLSAgICAgIGludCBqID0gcm5kLm5leHRJbnQobnVtQnl0ZXMpOwotICAgICAgaWYgKGogPCBpKSB7Ci0gICAgICAgIGludCB0bXAgPSBpOwotICAgICAgICBpID0gajsKLSAgICAgICAgaiA9IHRtcDsKLSAgICAgIH0KLSAgICAgIGludCBzdGF0ZTEgPSBVdGY4LnBhcnRpYWxJc1ZhbGlkVXRmOChVdGY4LkNPTVBMRVRFLCBieXRlcywgMCwgaSk7Ci0gICAgICBpbnQgc3RhdGUyID0gVXRmOC5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUxLCBieXRlcywgaSwgaik7Ci0gICAgICBpbnQgc3RhdGUzID0gVXRmOC5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUyLCBieXRlcywgaiwgbnVtQnl0ZXMpOwotICAgICAgaWYgKGlzUm91bmRUcmlwcGFibGUgIT0gKHN0YXRlMyA9PSBVdGY4LkNPTVBMRVRFKSkgewotICAgICAgICBTeXN0ZW0ub3V0LnByaW50Zigic3RhdGU9JTA0eCAlMDR4ICUwNHggaT0lZCBqPSVkJW4iLCBzdGF0ZTEsIHN0YXRlMiwgc3RhdGUzLCBpLCBqKTsKLSAgICAgICAgb3V0cHV0RmFpbHVyZShieXRlQ2hhciwgYnl0ZXMsIGJ5dGVzUmVlbmNvZGVkKTsKLSAgICAgIH0KLSAgICAgIGFzc2VydEVxdWFscyhpc1JvdW5kVHJpcHBhYmxlLCAoc3RhdGUzID09IFV0ZjguQ09NUExFVEUpKTsKLQotICAgICAgLy8gVGVzdCByb3BlcyBidWlsdCBvdXQgb2Ygc21hbGwgcGFydGlhbCBzZXF1ZW5jZXMKLSAgICAgIEJ5dGVTdHJpbmcgcm9wZSA9IFJvcGVCeXRlU3RyaW5nLm5ld0luc3RhbmNlRm9yVGVzdCgKLSAgICAgICAgICBicy5zdWJzdHJpbmcoMCwgaSksCi0gICAgICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KGJzLnN1YnN0cmluZyhpLCBqKSwgYnMuc3Vic3RyaW5nKGosIG51bUJ5dGVzKSkpOwotICAgICAgYXNzZXJ0U2FtZShSb3BlQnl0ZVN0cmluZy5jbGFzcywgcm9wZS5nZXRDbGFzcygpKTsKLQotICAgICAgQnl0ZVN0cmluZ1tdIGJ5dGVTdHJpbmdzID0ge2JzLCBicy5zdWJzdHJpbmcoMCwgbnVtQnl0ZXMpLCByb3BlfTsKLSAgICAgIGZvciAoQnl0ZVN0cmluZyB4IDogYnl0ZVN0cmluZ3MpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGlzUm91bmRUcmlwcGFibGUsIHguaXNWYWxpZFV0ZjgoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0ZTMsIHgucGFydGlhbElzVmFsaWRVdGY4KFV0ZjguQ09NUExFVEUsIDAsIG51bUJ5dGVzKSk7Ci0KLSAgICAgICAgYXNzZXJ0RXF1YWxzKHN0YXRlMSwgeC5wYXJ0aWFsSXNWYWxpZFV0ZjgoVXRmOC5DT01QTEVURSwgMCwgaSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdGUxLCB4LnN1YnN0cmluZygwLCBpKS5wYXJ0aWFsSXNWYWxpZFV0ZjgoVXRmOC5DT01QTEVURSwgMCwgaSkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoc3RhdGUyLCB4LnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZTEsIGksIGogLSBpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0ZTIsIHguc3Vic3RyaW5nKGksIGopLnBhcnRpYWxJc1ZhbGlkVXRmOChzdGF0ZTEsIDAsIGogLSBpKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0ZTMsIHgucGFydGlhbElzVmFsaWRVdGY4KHN0YXRlMiwgaiwgbnVtQnl0ZXMgLSBqKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzdGF0ZTMsIHguc3Vic3RyaW5nKGosIG51bUJ5dGVzKS5wYXJ0aWFsSXNWYWxpZFV0Zjgoc3RhdGUyLCAwLCBudW1CeXRlcyAtIGopKTsKLSAgICAgIH0KLQotICAgICAgLy8gQnl0ZVN0cmluZyByZWR1cGxpY2F0aW9uIHNob3VsZCBub3QgYWZmZWN0IGl0cyBVVEYtOCB2YWxpZGl0eS4KLSAgICAgIEJ5dGVTdHJpbmcgcm9wZUFEb3BlID0gUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KGJzLCBicy5zdWJzdHJpbmcoMCwgbnVtQnl0ZXMpKTsKLSAgICAgIGFzc2VydEVxdWFscyhpc1JvdW5kVHJpcHBhYmxlLCByb3BlQURvcGUuaXNWYWxpZFV0ZjgoKSk7Ci0KLSAgICAgIGlmIChpc1JvdW5kVHJpcHBhYmxlKSB7Ci0gICAgICAgIGNvdW50Um91bmRUcmlwcGVkKys7Ci0gICAgICB9Ci0gICAgICBjb3VudCsrOwotICAgICAgaWYgKGJ5dGVDaGFyICE9IDAgJiYgYnl0ZUNoYXIgJSAxMDAwMDAwTCA9PSAwKSB7Ci0gICAgICAgIGxvZ2dlci5pbmZvKCJQcm9jZXNzZWQgIiArIChieXRlQ2hhciAvIDEwMDAwMDBMKSArICIgbWlsbGlvbiBjaGFyYWN0ZXJzIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGxvZ2dlci5pbmZvKCJSb3VuZCB0cmlwcGVkICIgKyBjb3VudFJvdW5kVHJpcHBlZCArICIgb2YgIiArIGNvdW50KTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb3VudCwgY291bnRSb3VuZFRyaXBwZWQpOwotICB9Ci0KLSAgLyoqCi0gICAqIFZhcmlhdGlvbiBvZiB7QGxpbmsgI3Rlc3RCeXRlc30gdGhhdCBkb2VzIGxlc3MgYWxsb2NhdGlvbiB1c2luZyB0aGUKLSAgICogbG93LWxldmVsIGVuY29kZXJzL2RlY29kZXJzIGRpcmVjdGx5LiBDaGVja2VkIGluIGJlY2F1c2UgaXQncyB1c2VmdWwgZm9yCi0gICAqIGRlYnVnZ2luZyB3aGVuIHRyeWluZyB0byBwcm9jZXNzIGJ5dGVzIGZhc3RlciwgYnV0IHNpbmNlIGl0IGRvZXNuJ3QgdXNlIHRoZQotICAgKiBhY3R1YWwgU3RyaW5nIGNsYXNzLCBpdCdzIHBvc3NpYmxlIGZvciBpbmNvbXBhdGliaWxpdGllcyB0byBkZXZlbG9wCi0gICAqIChhbHRob3VnaCB1bmxpa2VseSkuCi0gICAqCi0gICAqIEBwYXJhbSBmYWN0b3J5IHRoZSBmYWN0b3J5IGZvciB7QGxpbmsgQnl0ZVN0cmluZ30gaW5zdGFuY2VzLgotICAgKiBAcGFyYW0gbnVtQnl0ZXMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgYnl0ZSBhcnJheQotICAgKiBAcGFyYW0gZXhwZWN0ZWRDb3VudCB0aGUgZXhwZWN0ZWQgbnVtYmVyIG9mIHJvdW5kdHJpcHBhYmxlIHBlcm11dGF0aW9ucwotICAgKiBAcGFyYW0gc3RhcnQgdGhlIHN0YXJ0aW5nIGJ5dGVzIGVuY29kZWQgYXMgYSBsb25nIGFzIGJpZy1lbmRpYW4KLSAgICogQHBhcmFtIGxpbSB0aGUgbGltaXQgb2YgYnl0ZXMgdG8gcHJvY2VzcyBlbmNvZGVkIGFzIGEgbG9uZyBhcyBiaWctZW5kaWFuLAotICAgKiAgICAgb3IgLTEgdG8gbWVhbiB0aGUgbWF4IGxpbWl0IGZvciBudW1CeXRlcwotICAgKi8KLSAgc3RhdGljIHZvaWQgdGVzdEJ5dGVzVXNpbmdCeXRlQnVmZmVycygKLSAgICAgIEJ5dGVTdHJpbmdGYWN0b3J5IGZhY3RvcnksIGludCBudW1CeXRlcywgbG9uZyBleHBlY3RlZENvdW50LCBsb25nIHN0YXJ0LCBsb25nIGxpbSkgewotICAgIENoYXJzZXREZWNvZGVyIGRlY29kZXIgPQotICAgICAgICBJbnRlcm5hbC5VVEZfOC5uZXdEZWNvZGVyKCkKLSAgICAgICAgICAgIC5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpCi0gICAgICAgICAgICAub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotICAgIENoYXJzZXRFbmNvZGVyIGVuY29kZXIgPQotICAgICAgICBJbnRlcm5hbC5VVEZfOC5uZXdFbmNvZGVyKCkKLSAgICAgICAgICAgIC5vbk1hbGZvcm1lZElucHV0KENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpCi0gICAgICAgICAgICAub25Vbm1hcHBhYmxlQ2hhcmFjdGVyKENvZGluZ0Vycm9yQWN0aW9uLlJFUExBQ0UpOwotICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW251bUJ5dGVzXTsKLSAgICBpbnQgbWF4Q2hhcnMgPSAoaW50KSAoZGVjb2Rlci5tYXhDaGFyc1BlckJ5dGUoKSAqIG51bUJ5dGVzKSArIDE7Ci0gICAgY2hhcltdIGNoYXJzRGVjb2RlZCA9IG5ldyBjaGFyWyhpbnQpIChkZWNvZGVyLm1heENoYXJzUGVyQnl0ZSgpICogbnVtQnl0ZXMpICsgMV07Ci0gICAgaW50IG1heEJ5dGVzID0gKGludCkgKGVuY29kZXIubWF4Qnl0ZXNQZXJDaGFyKCkgKiBtYXhDaGFycykgKyAxOwotICAgIGJ5dGVbXSBieXRlc1JlZW5jb2RlZCA9IG5ldyBieXRlW21heEJ5dGVzXTsKLQotICAgIEJ5dGVCdWZmZXIgYmIgPSBCeXRlQnVmZmVyLndyYXAoYnl0ZXMpOwotICAgIENoYXJCdWZmZXIgY2IgPSBDaGFyQnVmZmVyLndyYXAoY2hhcnNEZWNvZGVkKTsKLSAgICBCeXRlQnVmZmVyIGJiUmVlbmNvZGVkID0gQnl0ZUJ1ZmZlci53cmFwKGJ5dGVzUmVlbmNvZGVkKTsKLSAgICBpZiAobGltID09IC0xKSB7Ci0gICAgICBsaW0gPSAxTCA8PCAobnVtQnl0ZXMgKiA4KTsKLSAgICB9Ci0gICAgbG9uZyBjb3VudCA9IDA7Ci0gICAgbG9uZyBjb3VudFJvdW5kVHJpcHBlZCA9IDA7Ci0gICAgZm9yIChsb25nIGJ5dGVDaGFyID0gc3RhcnQ7IGJ5dGVDaGFyIDwgbGltOyBieXRlQ2hhcisrKSB7Ci0gICAgICBiYi5yZXdpbmQoKTsKLSAgICAgIGJiLmxpbWl0KGJ5dGVzLmxlbmd0aCk7Ci0gICAgICBjYi5yZXdpbmQoKTsKLSAgICAgIGNiLmxpbWl0KGNoYXJzRGVjb2RlZC5sZW5ndGgpOwotICAgICAgYmJSZWVuY29kZWQucmV3aW5kKCk7Ci0gICAgICBiYlJlZW5jb2RlZC5saW1pdChieXRlc1JlZW5jb2RlZC5sZW5ndGgpOwotICAgICAgZW5jb2Rlci5yZXNldCgpOwotICAgICAgZGVjb2Rlci5yZXNldCgpOwotICAgICAgbG9uZyB0bXBCeXRlQ2hhciA9IGJ5dGVDaGFyOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBieXRlc1tieXRlcy5sZW5ndGggLSBpIC0gMV0gPSAoYnl0ZSkgdG1wQnl0ZUNoYXI7Ci0gICAgICAgIHRtcEJ5dGVDaGFyID0gdG1wQnl0ZUNoYXIgPj4gODsKLSAgICAgIH0KLSAgICAgIGJvb2xlYW4gaXNSb3VuZFRyaXBwYWJsZSA9IGZhY3RvcnkubmV3Qnl0ZVN0cmluZyhieXRlcykuaXNWYWxpZFV0ZjgoKTsKLSAgICAgIENvZGVyUmVzdWx0IHJlc3VsdCA9IGRlY29kZXIuZGVjb2RlKGJiLCBjYiwgdHJ1ZSk7Ci0gICAgICBhc3NlcnRGYWxzZShyZXN1bHQuaXNFcnJvcigpKTsKLSAgICAgIHJlc3VsdCA9IGRlY29kZXIuZmx1c2goY2IpOwotICAgICAgYXNzZXJ0RmFsc2UocmVzdWx0LmlzRXJyb3IoKSk7Ci0KLSAgICAgIGludCBjaGFyTGVuID0gY2IucG9zaXRpb24oKTsKLSAgICAgIGNiLnJld2luZCgpOwotICAgICAgY2IubGltaXQoY2hhckxlbik7Ci0gICAgICByZXN1bHQgPSBlbmNvZGVyLmVuY29kZShjYiwgYmJSZWVuY29kZWQsIHRydWUpOwotICAgICAgYXNzZXJ0RmFsc2UocmVzdWx0LmlzRXJyb3IoKSk7Ci0gICAgICByZXN1bHQgPSBlbmNvZGVyLmZsdXNoKGJiUmVlbmNvZGVkKTsKLSAgICAgIGFzc2VydEZhbHNlKHJlc3VsdC5pc0Vycm9yKCkpOwotCi0gICAgICBib29sZWFuIGJ5dGVzRXF1YWwgPSB0cnVlOwotICAgICAgaW50IGJ5dGVzTGVuID0gYmJSZWVuY29kZWQucG9zaXRpb24oKTsKLSAgICAgIGlmIChieXRlc0xlbiAhPSBudW1CeXRlcykgewotICAgICAgICBieXRlc0VxdWFsID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bUJ5dGVzOyBpKyspIHsKLSAgICAgICAgICBpZiAoYnl0ZXNbaV0gIT0gYnl0ZXNSZWVuY29kZWRbaV0pIHsKLSAgICAgICAgICAgIGJ5dGVzRXF1YWwgPSBmYWxzZTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKGJ5dGVzRXF1YWwgIT0gaXNSb3VuZFRyaXBwYWJsZSkgewotICAgICAgICBvdXRwdXRGYWlsdXJlKGJ5dGVDaGFyLCBieXRlcywgYnl0ZXNSZWVuY29kZWQsIGJ5dGVzTGVuKTsKLSAgICAgIH0KLQotICAgICAgY291bnQrKzsKLSAgICAgIGlmIChpc1JvdW5kVHJpcHBhYmxlKSB7Ci0gICAgICAgIGNvdW50Um91bmRUcmlwcGVkKys7Ci0gICAgICB9Ci0gICAgICBpZiAoYnl0ZUNoYXIgIT0gMCAmJiBieXRlQ2hhciAlIDEwMDAwMDAgPT0gMCkgewotICAgICAgICBsb2dnZXIuaW5mbygiUHJvY2Vzc2VkICIgKyAoYnl0ZUNoYXIgLyAxMDAwMDAwKSArICIgbWlsbGlvbiBjaGFyYWN0ZXJzIik7Ci0gICAgICB9Ci0gICAgfQotICAgIGxvZ2dlci5pbmZvKCJSb3VuZCB0cmlwcGVkICIgKyBjb3VudFJvdW5kVHJpcHBlZCArICIgb2YgIiArIGNvdW50KTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRDb3VudCwgY291bnRSb3VuZFRyaXBwZWQpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdXRwdXRGYWlsdXJlKGxvbmcgYnl0ZUNoYXIsIGJ5dGVbXSBieXRlcywgYnl0ZVtdIGFmdGVyKSB7Ci0gICAgb3V0cHV0RmFpbHVyZShieXRlQ2hhciwgYnl0ZXMsIGFmdGVyLCBhZnRlci5sZW5ndGgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBvdXRwdXRGYWlsdXJlKGxvbmcgYnl0ZUNoYXIsIGJ5dGVbXSBieXRlcywgYnl0ZVtdIGFmdGVyLCBpbnQgbGVuKSB7Ci0gICAgZmFpbCgiRmFpbHVyZTogKCIgKyBMb25nLnRvSGV4U3RyaW5nKGJ5dGVDaGFyKSArICIpICIgKyB0b0hleFN0cmluZyhieXRlcykgKyAiID0+ICIKLSAgICAgICAgKyB0b0hleFN0cmluZyhhZnRlciwgbGVuKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgdG9IZXhTdHJpbmcoYnl0ZVtdIGIpIHsKLSAgICByZXR1cm4gdG9IZXhTdHJpbmcoYiwgYi5sZW5ndGgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHRvSGV4U3RyaW5nKGJ5dGVbXSBiLCBpbnQgbGVuKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBzLmFwcGVuZCgiXCIiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgcy5hcHBlbmQoIiAiKTsKLSAgICAgIH0KLSAgICAgIHMuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMngiLCBiW2ldICYgMHhGRikpOwotICAgIH0KLSAgICBzLmFwcGVuZCgiXCIiKTsKLSAgICByZXR1cm4gcy50b1N0cmluZygpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZExpdGVUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZExpdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhkMWRlNmQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5RmllbGRMaXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjcyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsSW50NjRFeHRlbnNpb247Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIHtAbGluayBMYXp5RmllbGRMaXRlfS4KLSAqCi0gKiBAYXV0aG9yIHhpYW5nbEBnb29nbGUuY29tIChYaWFuZyBMaSkKLSAqLwotcHVibGljIGNsYXNzIExhenlGaWVsZExpdGVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLSAgICBNZXNzYWdlTGl0ZSBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgTGF6eUZpZWxkTGl0ZSBsYXp5RmllbGQgPSBjcmVhdGVMYXp5RmllbGRMaXRlRnJvbU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGxhenlGaWVsZC5nZXRWYWx1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBjaGFuZ2VWYWx1ZShsYXp5RmllbGQpOwotICAgIGFzc2VydE5vdEVxdWFsKG1lc3NhZ2UsIGxhenlGaWVsZC5nZXRWYWx1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZUV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbEV4dGVuc2lvbnNTZXQoKTsKLSAgICBMYXp5RmllbGRMaXRlIGxhenlGaWVsZCA9IGNyZWF0ZUxhenlGaWVsZExpdGVGcm9tTWVzc2FnZShtZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgbGF6eUZpZWxkLmdldFZhbHVlKFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgY2hhbmdlVmFsdWUobGF6eUZpZWxkKTsKLSAgICBhc3NlcnROb3RFcXVhbChtZXNzYWdlLCBsYXp5RmllbGQuZ2V0VmFsdWUoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZSgpIHsKLSAgICBNZXNzYWdlTGl0ZSBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgTGF6eUZpZWxkTGl0ZSBsYXp5RmllbGQgPSBjcmVhdGVMYXp5RmllbGRMaXRlRnJvbU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgY2hhbmdlVmFsdWUobGF6eUZpZWxkKTsKLSAgICBhc3NlcnROb3RFcXVhbChtZXNzYWdlLCBsYXp5RmllbGQuZ2V0VmFsdWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgbWVzc2FnZSA9IGxhenlGaWVsZC5nZXRWYWx1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGNoYW5nZVZhbHVlKGxhenlGaWVsZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIGxhenlGaWVsZC5nZXRWYWx1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZUV4KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbEV4dGVuc2lvbnNTZXQoKTsKLSAgICBMYXp5RmllbGRMaXRlIGxhenlGaWVsZCA9IGNyZWF0ZUxhenlGaWVsZExpdGVGcm9tTWVzc2FnZShtZXNzYWdlKTsKLSAgICBjaGFuZ2VWYWx1ZShsYXp5RmllbGQpOwotICAgIGFzc2VydE5vdEVxdWFsKG1lc3NhZ2UsIGxhenlGaWVsZC5nZXRWYWx1ZShUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIE1lc3NhZ2VMaXRlIHZhbHVlID0gbGF6eUZpZWxkLmdldFZhbHVlKFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBjaGFuZ2VWYWx1ZShsYXp5RmllbGQpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgbGF6eUZpZWxkLmdldFZhbHVlKFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgTWVzc2FnZUxpdGUgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotICAgIExhenlGaWVsZExpdGUgbGF6eUZpZWxkID0gY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksIGxhenlGaWVsZC5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBjaGFuZ2VWYWx1ZShsYXp5RmllbGQpOwotICAgIGFzc2VydE5vdEVxdWFsKG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSwgbGF6eUZpZWxkLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldFNlcmlhbGl6ZWRTaXplRXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpOwotICAgIExhenlGaWVsZExpdGUgbGF6eUZpZWxkID0gY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksIGxhenlGaWVsZC5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBjaGFuZ2VWYWx1ZShsYXp5RmllbGQpOwotICAgIGFzc2VydE5vdEVxdWFsKG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSwgbGF6eUZpZWxkLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldEJ5dGVTdHJpbmcoKSB7Ci0gICAgTWVzc2FnZUxpdGUgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotICAgIExhenlGaWVsZExpdGUgbGF6eUZpZWxkID0gY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLnRvQnl0ZVN0cmluZygpLCBsYXp5RmllbGQudG9CeXRlU3RyaW5nKCkpOwotICAgIGNoYW5nZVZhbHVlKGxhenlGaWVsZCk7Ci0gICAgYXNzZXJ0Tm90RXF1YWwobWVzc2FnZS50b0J5dGVTdHJpbmcoKSwgbGF6eUZpZWxkLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRCeXRlU3RyaW5nRXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpOwotICAgIExhenlGaWVsZExpdGUgbGF6eUZpZWxkID0gY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLnRvQnl0ZVN0cmluZygpLCBsYXp5RmllbGQudG9CeXRlU3RyaW5nKCkpOwotICAgIGNoYW5nZVZhbHVlKGxhenlGaWVsZCk7Ci0gICAgYXNzZXJ0Tm90RXF1YWwobWVzc2FnZS50b0J5dGVTdHJpbmcoKSwgbGF6eUZpZWxkLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpOwotICAgIExhenlGaWVsZExpdGUgb3JpZ2luYWwgPSBjcmVhdGVMYXp5RmllbGRMaXRlRnJvbU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgTGF6eUZpZWxkTGl0ZSBtZXJnZWQgPSBuZXcgTGF6eUZpZWxkTGl0ZSgpOwotICAgIG1lcmdlZC5tZXJnZShvcmlnaW5hbCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgdmFsdWUgPSAoVGVzdEFsbEV4dGVuc2lvbnMpIG1lcmdlZC5nZXRWYWx1ZSgKLSAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCB2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMYXp5RmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBMYXp5RmllbGRMaXRlIGZpZWxkID0gbmV3IExhenlGaWVsZExpdGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZmllbGQuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIGZpZWxkLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJbnZhbGlkUHJvdG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBTaWxlbnRseSBmYWlscyBhbmQgdXNlcyB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KLSAgICBMYXp5RmllbGRMaXRlIGZpZWxkID0gbmV3IExhenlGaWVsZExpdGUoCi0gICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJpbnZhbGlkIikpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBmaWVsZC5nZXRWYWx1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZmllbGQuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIGZpZWxkLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUJlZm9yZVBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTEgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSkuYnVpbGQoKTsKLSAgICBMYXp5RmllbGRMaXRlIGZpZWxkMSA9IGNyZWF0ZUxhenlGaWVsZExpdGVGcm9tTWVzc2FnZShtZXNzYWdlMSk7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDY0KDIpLmJ1aWxkKCk7Ci0gICAgTGF6eUZpZWxkTGl0ZSBmaWVsZDIgPSBjcmVhdGVMYXp5RmllbGRMaXRlRnJvbU1lc3NhZ2UobWVzc2FnZTIpOwotCi0gICAgZmllbGQxLm1lcmdlKGZpZWxkMik7Ci0gICAgVGVzdEFsbFR5cGVzIGV4cGVjdGVkID0KLSAgICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpLnNldE9wdGlvbmFsSW50NjQoMikuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGZpZWxkMS5nZXRWYWx1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU9uZU5vdFBhcnNlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3QgYSBmZXcgZGlmZmVyZW50IHBhdGhzIHRoYXQgaW52b2x2ZSBvbmUgbWVzc2FnZSB0aGF0IHdhcyBub3QgcGFyc2VkLgotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQ2NCgyKS5idWlsZCgpOwotICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZCA9Ci0gICAgICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5zZXRPcHRpb25hbEludDY0KDIpLmJ1aWxkKCk7Ci0KLSAgICBMYXp5RmllbGRMaXRlIGZpZWxkMSA9IExhenlGaWVsZExpdGUuZnJvbVZhbHVlKG1lc3NhZ2UxKTsKLSAgICBmaWVsZDEuZ2V0VmFsdWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKTsgIC8vIEZvcmNlIHBhcnNpbmcuCi0gICAgTGF6eUZpZWxkTGl0ZSBmaWVsZDIgPSBjcmVhdGVMYXp5RmllbGRMaXRlRnJvbU1lc3NhZ2UobWVzc2FnZTIpOwotICAgIGZpZWxkMS5tZXJnZShmaWVsZDIpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZmllbGQxLmdldFZhbHVlKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotCi0gICAgLy8gTm93IHJldmVyc2Ugd2hpY2ggb25lIGlzIHBhcnNlZCBmaXJzdC4KLSAgICBmaWVsZDEgPSBMYXp5RmllbGRMaXRlLmZyb21WYWx1ZShtZXNzYWdlMSk7Ci0gICAgZmllbGQyID0gY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKG1lc3NhZ2UyKTsKLSAgICBmaWVsZDIuZ2V0VmFsdWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKTsgIC8vIEZvcmNlIHBhcnNpbmcuCi0gICAgZmllbGQxLm1lcmdlKGZpZWxkMik7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBmaWVsZDEuZ2V0VmFsdWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VJbnZhbGlkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCBhIGZldyBkaWZmZXJlbnQgcGF0aHMgdGhhdCBpbnZvbHZlIG9uZSBtZXNzYWdlIHRoYXQgd2FzIG5vdCBwYXJzZWQuCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSkuYnVpbGQoKTsKLSAgICBMYXp5RmllbGRMaXRlIHZhbGlkID0gTGF6eUZpZWxkTGl0ZS5mcm9tVmFsdWUobWVzc2FnZSk7Ci0gICAgTGF6eUZpZWxkTGl0ZSBpbnZhbGlkID0gbmV3IExhenlGaWVsZExpdGUoCi0gICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJpbnZhbGlkIikpOwotICAgIGludmFsaWQubWVyZ2UodmFsaWQpOwotCi0gICAgLy8gV2Ugc3dhbGxvdyB0aGUgZXhjZXB0aW9uIGFuZCBqdXN0IHVzZSB0aGUgc2V0IGZpZWxkLgotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBpbnZhbGlkLmdldFZhbHVlKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlS2VlcHNFeHRlbnNpb25zV2hlblBvc3NpYmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gSW4gdGhpcyB0ZXN0IHdlIGF0dGVtcHQgdG8gb25seSB1c2UgdGhlIGVtcHR5IHJlZ2lzdHJ5LCB3aGljaCB3aWxsIHN0cmlwIG91dCBhbGwgZXh0ZW5zaW9ucwotICAgIC8vIHdoZW4gc2VyaWFsaXppbmcgYW5kIHRoZW4gcGFyc2luZy4gV2UgdmVyaWZ5IHRoYXQgZWFjaCBjb2RlIHBhdGggd2lsbCBhdHRlbXB0IHRvIG5vdAotICAgIC8vIHNlcmlhbGl6ZSBhbmQgcGFyc2UgYSBtZXNzYWdlIHRoYXQgd2FzIHNldCBkaXJlY3RseSB3aXRob3V0IGdvaW5nIHRocm91Z2ggdGhlCi0gICAgLy8gZXh0ZW5zaW9uUmVnaXN0cnkuCi0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZVdpdGhFeHRlbnNpb25zID0KLSAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLnNldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uLCA0MikuYnVpbGQoKTsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBlbXB0eU1lc3NhZ2UgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKLQotICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBlbXB0eVJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLmdldEVtcHR5UmVnaXN0cnkoKTsKLQotICAgIExhenlGaWVsZExpdGUgZmllbGQgPSBMYXp5RmllbGRMaXRlLmZyb21WYWx1ZShtZXNzYWdlV2l0aEV4dGVuc2lvbnMpOwotICAgIGZpZWxkLm1lcmdlKGNyZWF0ZUxhenlGaWVsZExpdGVGcm9tTWVzc2FnZShlbXB0eVJlZ2lzdHJ5LCBlbXB0eU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVdpdGhFeHRlbnNpb25zLCBmaWVsZC5nZXRWYWx1ZShUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotCi0gICAgLy8gTm93IHJldmVyc2UgdGhlIG9yZGVyIG9mIHRoZSBtZXJnaW5nLgotICAgIGZpZWxkID0gY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKGVtcHR5UmVnaXN0cnksIGVtcHR5TWVzc2FnZSk7Ci0gICAgZmllbGQubWVyZ2UoTGF6eUZpZWxkTGl0ZS5mcm9tVmFsdWUobWVzc2FnZVdpdGhFeHRlbnNpb25zKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgZmllbGQuZ2V0VmFsdWUoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLQotICAgIC8vIE5vdyB0cnkgcGFyc2luZyB0aGUgZW1wdHkgZmllbGQgZmlyc3QuCi0gICAgZmllbGQgPSBMYXp5RmllbGRMaXRlLmZyb21WYWx1ZShtZXNzYWdlV2l0aEV4dGVuc2lvbnMpOwotICAgIExhenlGaWVsZExpdGUgb3RoZXIgPSBjcmVhdGVMYXp5RmllbGRMaXRlRnJvbU1lc3NhZ2UoZW1wdHlSZWdpc3RyeSwgZW1wdHlNZXNzYWdlKTsKLSAgICBvdGhlci5nZXRWYWx1ZShUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSk7ICAvLyBGb3JjZSBwYXJzaW5nLgotICAgIGZpZWxkLm1lcmdlKG90aGVyKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVdpdGhFeHRlbnNpb25zLCBmaWVsZC5nZXRWYWx1ZShUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotCi0gICAgLy8gQW5kIGFnYWluIHJldmVyc2UuCi0gICAgZmllbGQgPSBjcmVhdGVMYXp5RmllbGRMaXRlRnJvbU1lc3NhZ2UoZW1wdHlSZWdpc3RyeSwgZW1wdHlNZXNzYWdlKTsKLSAgICBmaWVsZC5nZXRWYWx1ZShUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZWZhdWx0SW5zdGFuY2UoKSk7ICAvLyBGb3JjZSBwYXJzaW5nLgotICAgIG90aGVyID0gTGF6eUZpZWxkTGl0ZS5mcm9tVmFsdWUobWVzc2FnZVdpdGhFeHRlbnNpb25zKTsKLSAgICBmaWVsZC5tZXJnZShvdGhlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VXaXRoRXh0ZW5zaW9ucywgZmllbGQuZ2V0VmFsdWUoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU1pZ2h0TG9zZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0IHRoYXQgd2UgZG9uJ3Qga25vdyBhYm91dCB0aGUgZXh0ZW5zaW9ucyB3aGVuIHBhcnNpbmcuCi0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEgPQotICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTIgPQotICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb24sIDJMKS5idWlsZCgpOwotCi0gICAgTGF6eUZpZWxkTGl0ZSBmaWVsZCA9IExhenlGaWVsZExpdGUuZnJvbVZhbHVlKG1lc3NhZ2UxKTsKLSAgICBmaWVsZC5tZXJnZShMYXp5RmllbGRMaXRlLmZyb21WYWx1ZShtZXNzYWdlMikpOwotCi0gICAgLy8gV2UgbG9zZSB0aGUgZXh0ZW5zaW9ucyBmcm9tIG1lc3NhZ2UgMiBiZWNhdXNlIHdlIGhhdmUgdG8gc2VyaWFsaXplIGl0IGFuZCB0aGVuIHBhcnNlIGl0Ci0gICAgLy8gYWdhaW4sIHVzaW5nIHRoZSBlbXB0eSByZWdpc3RyeSB0aGlzIHRpbWUuCi0gICAgVGVzdEFsbEV4dGVuc2lvbnMgdmFsdWUgPQotICAgICAgICAoVGVzdEFsbEV4dGVuc2lvbnMpIGZpZWxkLmdldFZhbHVlKFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRUcnVlKHZhbHVlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigxKSwgdmFsdWUuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRGYWxzZSh2YWx1ZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbikpOwotCi0gICAgLy8gVGhlIGZpZWxkIGlzIHN0aWxsIHRoZXJlLCBpdCBpcyBqdXN0IHVua25vd24uCi0gICAgYXNzZXJ0VHJ1ZSh2YWx1ZS5nZXRVbmtub3duRmllbGRzKCkKLSAgICAgICAgLmhhc0ZpZWxkKG9wdGlvbmFsSW50NjRFeHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldE51bWJlcigpKSk7Ci0gIH0KLQotCi0gIC8vIEhlbHAgbWV0aG9kcy4KLQotICBwcml2YXRlIExhenlGaWVsZExpdGUgY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKE1lc3NhZ2VMaXRlIG1lc3NhZ2UpIHsKLSAgICByZXR1cm4gY3JlYXRlTGF6eUZpZWxkTGl0ZUZyb21NZXNzYWdlKFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksIG1lc3NhZ2UpOwotICB9Ci0KLSAgcHJpdmF0ZSBMYXp5RmllbGRMaXRlIGNyZWF0ZUxhenlGaWVsZExpdGVGcm9tTWVzc2FnZSgKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwgTWVzc2FnZUxpdGUgbWVzc2FnZSkgewotICAgIEJ5dGVTdHJpbmcgYnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIHJldHVybiBuZXcgTGF6eUZpZWxkTGl0ZShleHRlbnNpb25SZWdpc3RyeSwgYnl0ZXMpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNoYW5nZVZhbHVlKExhenlGaWVsZExpdGUgbGF6eUZpZWxkKSB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnVpbGRlcigpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCb29sKHRydWUpOwotICAgIE1lc3NhZ2VMaXRlIG5ld01lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgbGF6eUZpZWxkLnNldFZhbHVlKG5ld01lc3NhZ2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vdEVxdWFsKE9iamVjdCB1bmV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0gICAgYXNzZXJ0RmFsc2UodW5leHBlY3RlZCA9PSBhY3R1YWwKLSAgICAgICAgfHwgKHVuZXhwZWN0ZWQgIT0gbnVsbCAmJiB1bmV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKSk7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5RmllbGRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2U0NzNhZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlGaWVsZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgTGF6eUZpZWxkfS4KLSAqCi0gKiBAYXV0aG9yIHhpYW5nbEBnb29nbGUuY29tIChYaWFuZyBMaSkKLSAqLwotcHVibGljIGNsYXNzIExhenlGaWVsZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHB1YmxpYyB2b2lkIHRlc3RIYXNoQ29kZSgpIHsKLSAgICBNZXNzYWdlTGl0ZSBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgTGF6eUZpZWxkIGxhenlGaWVsZCA9Ci0gICAgICAgIGNyZWF0ZUxhenlGaWVsZEZyb21NZXNzYWdlKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmhhc2hDb2RlKCksIGxhenlGaWVsZC5oYXNoQ29kZSgpKTsKLSAgICBsYXp5RmllbGQuZ2V0VmFsdWUoKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5oYXNoQ29kZSgpLCBsYXp5RmllbGQuaGFzaENvZGUoKSk7Ci0gICAgY2hhbmdlVmFsdWUobGF6eUZpZWxkKTsKLSAgICAvLyBtYWtlIHN1cmUgdHdvIG1lc3NhZ2VzIGhhdmUgZGlmZmVyZW50IGhhc2ggY29kZQotICAgIGFzc2VydE5vdEVxdWFsKG1lc3NhZ2UuaGFzaENvZGUoKSwgbGF6eUZpZWxkLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlRXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpOwotICAgIExhenlGaWVsZCBsYXp5RmllbGQgPSBjcmVhdGVMYXp5RmllbGRGcm9tTWVzc2FnZShtZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5oYXNoQ29kZSgpLCBsYXp5RmllbGQuaGFzaENvZGUoKSk7Ci0gICAgbGF6eUZpZWxkLmdldFZhbHVlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuaGFzaENvZGUoKSwgbGF6eUZpZWxkLmhhc2hDb2RlKCkpOwotICAgIGNoYW5nZVZhbHVlKGxhenlGaWVsZCk7Ci0gICAgLy8gbWFrZSBzdXJlIHR3byBtZXNzYWdlcyBoYXZlIGRpZmZlcmVudCBoYXNoIGNvZGUKLSAgICBhc3NlcnROb3RFcXVhbChtZXNzYWdlLmhhc2hDb2RlKCksIGxhenlGaWVsZC5oYXNoQ29kZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRWYWx1ZSgpIHsKLSAgICBNZXNzYWdlTGl0ZSBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgTGF6eUZpZWxkIGxhenlGaWVsZCA9IGNyZWF0ZUxhenlGaWVsZEZyb21NZXNzYWdlKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBsYXp5RmllbGQuZ2V0VmFsdWUoKSk7Ci0gICAgY2hhbmdlVmFsdWUobGF6eUZpZWxkKTsKLSAgICBhc3NlcnROb3RFcXVhbChtZXNzYWdlLCBsYXp5RmllbGQuZ2V0VmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0VmFsdWVFeCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7Ci0gICAgTGF6eUZpZWxkIGxhenlGaWVsZCA9IGNyZWF0ZUxhenlGaWVsZEZyb21NZXNzYWdlKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBsYXp5RmllbGQuZ2V0VmFsdWUoKSk7Ci0gICAgY2hhbmdlVmFsdWUobGF6eUZpZWxkKTsKLSAgICBhc3NlcnROb3RFcXVhbChtZXNzYWdlLCBsYXp5RmllbGQuZ2V0VmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0KCkgewotICAgIE1lc3NhZ2VMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLSAgICBMYXp5RmllbGQgbGF6eUZpZWxkID0gY3JlYXRlTGF6eUZpZWxkRnJvbU1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgYXNzZXJ0VHJ1ZShsYXp5RmllbGQuZXF1YWxzKG1lc3NhZ2UpKTsKLSAgICBjaGFuZ2VWYWx1ZShsYXp5RmllbGQpOwotICAgIGFzc2VydEZhbHNlKGxhenlGaWVsZC5lcXVhbHMobWVzc2FnZSkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuZXF1YWxzKGxhenlGaWVsZC5nZXRWYWx1ZSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzT2JqZWN0RXgoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpOwotICAgIExhenlGaWVsZCBsYXp5RmllbGQgPSBjcmVhdGVMYXp5RmllbGRGcm9tTWVzc2FnZShtZXNzYWdlKTsKLSAgICBhc3NlcnRUcnVlKGxhenlGaWVsZC5lcXVhbHMobWVzc2FnZSkpOwotICAgIGNoYW5nZVZhbHVlKGxhenlGaWVsZCk7Ci0gICAgYXNzZXJ0RmFsc2UobGF6eUZpZWxkLmVxdWFscyhtZXNzYWdlKSk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5lcXVhbHMobGF6eUZpZWxkLmdldFZhbHVlKCkpKTsKLSAgfQotCi0gIC8vIEhlbHAgbWV0aG9kcy4KLQotICBwcml2YXRlIExhenlGaWVsZCBjcmVhdGVMYXp5RmllbGRGcm9tTWVzc2FnZShNZXNzYWdlTGl0ZSBtZXNzYWdlKSB7Ci0gICAgQnl0ZVN0cmluZyBieXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgcmV0dXJuIG5ldyBMYXp5RmllbGQobWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCksCi0gICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksIGJ5dGVzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGFuZ2VWYWx1ZShMYXp5RmllbGQgbGF6eUZpZWxkKSB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnVpbGRlcigpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCb29sKHRydWUpOwotICAgIE1lc3NhZ2VMaXRlIG5ld01lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgbGF6eUZpZWxkLnNldFZhbHVlKG5ld01lc3NhZ2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydE5vdEVxdWFsKE9iamVjdCB1bmV4cGVjdGVkLCBPYmplY3QgYWN0dWFsKSB7Ci0gICAgYXNzZXJ0RmFsc2UodW5leHBlY3RlZCA9PSBhY3R1YWwKLSAgICAgICAgfHwgKHVuZXhwZWN0ZWQgIT0gbnVsbCAmJiB1bmV4cGVjdGVkLmVxdWFscyhhY3R1YWwpKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eU1lc3NhZ2VMaXRlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5TWVzc2FnZUxpdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmZTBmZmYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5TWVzc2FnZUxpdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzMDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LkxhenlGaWVsZHNMaXRlLkxhenlFeHRlbnNpb247Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTGF6eUZpZWxkc0xpdGUuTGF6eUlubmVyTWVzc2FnZUxpdGU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTGF6eUZpZWxkc0xpdGUuTGF6eU1lc3NhZ2VMaXRlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LkxhenlGaWVsZHNMaXRlLkxhenlOZXN0ZWRJbm5lck1lc3NhZ2VMaXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLQotLyoqCi0gKiBVbml0IHRlc3QgZm9yIG1lc3NhZ2VzIHdpdGggbGF6eSBmaWVsZHMuCi0gKgotICogQGF1dGhvciBuaXdhc2FraUBnb29nbGUuY29tIChOYW9raSBJd2FzYWtpKQotICovCi1wdWJsaWMgY2xhc3MgTGF6eU1lc3NhZ2VMaXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwcml2YXRlIFBhcnNlcjxMYXp5SW5uZXJNZXNzYWdlTGl0ZT4gb3JpZ2luYWxMYXp5SW5uZXJNZXNzYWdlTGl0ZVBhcnNlcjsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBzdXBlci5zZXRVcCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHRlYXJEb3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgc3VwZXIudGVhckRvd24oKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXRWYWx1ZXMoKSB7Ci0gICAgTGF6eU5lc3RlZElubmVyTWVzc2FnZUxpdGUgbmVzdGVkID0gTGF6eU5lc3RlZElubmVyTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROdW0oMykKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgTGF6eUlubmVyTWVzc2FnZUxpdGUgaW5uZXIgPSBMYXp5SW5uZXJNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE51bSgyKQotICAgICAgICAuc2V0TmVzdGVkKG5lc3RlZCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgTGF6eU1lc3NhZ2VMaXRlIG91dGVyID0gTGF6eU1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TnVtKDEpCi0gICAgICAgIC5zZXRJbm5lcihpbm5lcikKLSAgICAgICAgLnNldE9uZW9mTnVtKDEyMykKLSAgICAgICAgLnNldE9uZW9mSW5uZXIoaW5uZXIpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDEsIG91dGVyLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIxLCBvdXRlci5nZXROdW1XaXRoRGVmYXVsdCgpKTsKLQotICAgIGFzc2VydEVxdWFscygyLCBvdXRlci5nZXRJbm5lcigpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIsIG91dGVyLmdldElubmVyKCkuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgb3V0ZXIuZ2V0SW5uZXIoKS5nZXROZXN0ZWQoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG91dGVyLmdldElubmVyKCkuZ2V0TmVzdGVkKCkuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0KLSAgICBhc3NlcnRGYWxzZShvdXRlci5oYXNPbmVvZk51bSgpKTsKLSAgICBhc3NlcnRUcnVlKG91dGVyLmhhc09uZW9mSW5uZXIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMiwgb3V0ZXIuZ2V0T25lb2ZJbm5lcigpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIsIG91dGVyLmdldE9uZW9mSW5uZXIoKS5nZXROdW1XaXRoRGVmYXVsdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgb3V0ZXIuZ2V0T25lb2ZJbm5lcigpLmdldE5lc3RlZCgpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgb3V0ZXIuZ2V0T25lb2ZJbm5lcigpLmdldE5lc3RlZCgpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNldFJlcGVhdGVkVmFsdWVzKCkgewotICAgIExhenlNZXNzYWdlTGl0ZSBvdXRlciA9IExhenlNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE51bSgxKQotICAgICAgICAuYWRkUmVwZWF0ZWRJbm5lcihMYXp5SW5uZXJNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0TnVtKDExOSkpCi0gICAgICAgIC5hZGRSZXBlYXRlZElubmVyKExhenlJbm5lck1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXROdW0oMTIyKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMSwgb3V0ZXIuZ2V0TnVtKCkpOwotICAgIGFzc2VydEVxdWFscygyLCBvdXRlci5nZXRSZXBlYXRlZElubmVyQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExOSwgb3V0ZXIuZ2V0UmVwZWF0ZWRJbm5lcigwKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMiwgb3V0ZXIuZ2V0UmVwZWF0ZWRJbm5lcigxKS5nZXROdW0oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotICAgIEFycmF5TGlzdDxMYXp5SW5uZXJNZXNzYWdlTGl0ZT4gaW5uZXJzID0gbmV3IEFycmF5TGlzdDxMYXp5SW5uZXJNZXNzYWdlTGl0ZT4oKTsKLSAgICBpbnQgY291bnQgPSA0OwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgICAgTGF6eUlubmVyTWVzc2FnZUxpdGUgaW5uZXIgPSBMYXp5SW5uZXJNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAuc2V0TnVtKGkpCi0gICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICBpbm5lcnMuYWRkKGlubmVyKTsKLSAgICB9Ci0KLSAgICBMYXp5TWVzc2FnZUxpdGUgb3V0ZXIgPSBMYXp5TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRBbGxSZXBlYXRlZElubmVyKGlubmVycykKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNvdW50LCBvdXRlci5nZXRSZXBlYXRlZElubmVyQ291bnQoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgb3V0ZXIuZ2V0UmVwZWF0ZWRJbm5lcihpKS5nZXROdW0oKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldERlZmF1bHRWYWx1ZXMoKSB7Ci0gICAgTGF6eU1lc3NhZ2VMaXRlIG91dGVyID0gTGF6eU1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygwLCBvdXRlci5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQyMSwgb3V0ZXIuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgb3V0ZXIuZ2V0SW5uZXIoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQyLCBvdXRlci5nZXRJbm5lcigpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG91dGVyLmdldElubmVyKCkuZ2V0TmVzdGVkKCkuZ2V0TnVtKCkpOwotICAgIGFzc2VydEVxdWFscyg0LCBvdXRlci5nZXRJbm5lcigpLmdldE5lc3RlZCgpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG91dGVyLmdldE9uZW9mTnVtKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG91dGVyLmdldE9uZW9mSW5uZXIoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQyLCBvdXRlci5nZXRPbmVvZklubmVyKCkuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG91dGVyLmdldE9uZW9mSW5uZXIoKS5nZXROZXN0ZWQoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG91dGVyLmdldE9uZW9mSW5uZXIoKS5nZXROZXN0ZWQoKS5nZXROdW1XaXRoRGVmYXVsdCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDbGVhclZhbHVlcygpIHsKLSAgICBMYXp5SW5uZXJNZXNzYWdlTGl0ZSBpbm5lciA9IExhenlJbm5lck1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TnVtKDExNSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBMYXp5TWVzc2FnZUxpdGUuQnVpbGRlciBvdXRlckJ1aWxkZXIgPSBMYXp5TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG91dGVyQnVpbGRlci5idWlsZCgpLmdldE51bSgpKTsKLQotCi0gICAgLy8gU2V0L0NsZWFyIG51bQotICAgIG91dGVyQnVpbGRlci5zZXROdW0oMTAwKTsKLQotICAgIGFzc2VydEVxdWFscygxMDAsIG91dGVyQnVpbGRlci5idWlsZCgpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIxLCBvdXRlckJ1aWxkZXIuYnVpbGQoKS5nZXROdW1XaXRoRGVmYXVsdCgpKTsKLSAgICBhc3NlcnRGYWxzZShvdXRlckJ1aWxkZXIuYnVpbGQoKS5oYXNJbm5lcigpKTsKLQotICAgIG91dGVyQnVpbGRlci5jbGVhck51bSgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG91dGVyQnVpbGRlci5idWlsZCgpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIxLCBvdXRlckJ1aWxkZXIuYnVpbGQoKS5nZXROdW1XaXRoRGVmYXVsdCgpKTsKLSAgICBhc3NlcnRGYWxzZShvdXRlckJ1aWxkZXIuYnVpbGQoKS5oYXNJbm5lcigpKTsKLQotCi0gICAgLy8gU2V0L0NsZWFyIGFsbAotICAgIG91dGVyQnVpbGRlci5zZXROdW0oMTAwKQotICAgICAgICAuc2V0SW5uZXIoaW5uZXIpCi0gICAgICAgIC5hZGRSZXBlYXRlZElubmVyKExhenlJbm5lck1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXROdW0oMTE5KSkKLSAgICAgICAgLmFkZFJlcGVhdGVkSW5uZXIoTGF6eUlubmVyTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldE51bSgxMjIpKQotICAgICAgICAuc2V0T25lb2ZJbm5lcihMYXp5SW5uZXJNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0TnVtKDEyMykpOwotCi0gICAgTGF6eU1lc3NhZ2VMaXRlIG91dGVyID0gb3V0ZXJCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwMCwgb3V0ZXIuZ2V0TnVtKCkpOwotICAgIGFzc2VydEVxdWFscyg0MjEsIG91dGVyLmdldE51bVdpdGhEZWZhdWx0KCkpOwotICAgIGFzc2VydFRydWUob3V0ZXIuaGFzSW5uZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExNSwgb3V0ZXIuZ2V0SW5uZXIoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG91dGVyLmdldFJlcGVhdGVkSW5uZXJDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTE5LCBvdXRlci5nZXRSZXBlYXRlZElubmVyKDApLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIyLCBvdXRlci5nZXRSZXBlYXRlZElubmVyKDEpLmdldE51bSgpKTsKLSAgICBhc3NlcnRUcnVlKG91dGVyLmhhc09uZW9mSW5uZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgb3V0ZXIuZ2V0T25lb2ZJbm5lcigpLmdldE51bSgpKTsKLQotICAgIG91dGVyQnVpbGRlci5jbGVhcigpOwotCi0gICAgb3V0ZXIgPSBvdXRlckJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygwLCBvdXRlci5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQyMSwgb3V0ZXIuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0gICAgYXNzZXJ0RmFsc2Uob3V0ZXIuaGFzSW5uZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG91dGVyLmdldFJlcGVhdGVkSW5uZXJDb3VudCgpKTsKLSAgICBhc3NlcnRGYWxzZShvdXRlci5oYXNPbmVvZklubmVyKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBvdXRlci5nZXRPbmVvZklubmVyKCkuZ2V0TnVtKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlVmFsdWVzKCkgewotICAgIExhenlNZXNzYWdlTGl0ZSBvdXRlckJhc2UgPSBMYXp5TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROdW1XaXRoRGVmYXVsdCgxMjIpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgTGF6eUlubmVyTWVzc2FnZUxpdGUgaW5uZXJNZXJnaW5nID0gTGF6eUlubmVyTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROdW0oMTE1KQotICAgICAgICAuYnVpbGQoKTsKLSAgICBMYXp5TWVzc2FnZUxpdGUgb3V0ZXJNZXJnaW5nID0gTGF6eU1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TnVtKDExOSkKLSAgICAgICAgLnNldElubmVyKGlubmVyTWVyZ2luZykKLSAgICAgICAgLnNldE9uZW9mSW5uZXIoaW5uZXJNZXJnaW5nKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIExhenlNZXNzYWdlTGl0ZSBtZXJnZWQgPSBMYXp5TWVzc2FnZUxpdGUKLSAgICAgICAgLm5ld0J1aWxkZXIob3V0ZXJCYXNlKQotICAgICAgICAubWVyZ2VGcm9tKG91dGVyTWVyZ2luZykKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExOSwgbWVyZ2VkLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIyLCBtZXJnZWQuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExNSwgbWVyZ2VkLmdldElubmVyKCkuZ2V0TnVtKCkpOwotICAgIGFzc2VydEVxdWFscyg0MiwgbWVyZ2VkLmdldElubmVyKCkuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExNSwgbWVyZ2VkLmdldE9uZW9mSW5uZXIoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQyLCBtZXJnZWQuZ2V0T25lb2ZJbm5lcigpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRGVmYXVsdFZhbHVlcygpIHsKLSAgICBMYXp5SW5uZXJNZXNzYWdlTGl0ZSBpbm5lckJhc2UgPSBMYXp5SW5uZXJNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE51bSgxMTUpCi0gICAgICAgIC5idWlsZCgpOwotICAgIExhenlNZXNzYWdlTGl0ZSBvdXRlckJhc2UgPSBMYXp5TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROdW0oMTE5KQotICAgICAgICAuc2V0TnVtV2l0aERlZmF1bHQoMTIyKQotICAgICAgICAuc2V0SW5uZXIoaW5uZXJCYXNlKQotICAgICAgICAuc2V0T25lb2ZJbm5lcihpbm5lckJhc2UpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgTGF6eU1lc3NhZ2VMaXRlIG91dGVyTWVyZ2luZyA9IExhenlNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBMYXp5TWVzc2FnZUxpdGUgbWVyZ2VkID0gTGF6eU1lc3NhZ2VMaXRlCi0gICAgICAgIC5uZXdCdWlsZGVyKG91dGVyQmFzZSkKLSAgICAgICAgLm1lcmdlRnJvbShvdXRlck1lcmdpbmcpCi0gICAgICAgIC5idWlsZCgpOwotICAgIC8vIE1lcmdpbmcgZGVmYXVsdC1pbnN0YW5jZSBzaG91bGRuJ3Qgb3ZlcndyaXRlIHZhbHVlcyBpbiB0aGUgYmFzZSBtZXNzYWdlLgotICAgIGFzc2VydEVxdWFscygxMTksIG1lcmdlZC5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMiwgbWVyZ2VkLmdldE51bVdpdGhEZWZhdWx0KCkpOwotICAgIGFzc2VydEVxdWFscygxMTUsIG1lcmdlZC5nZXRJbm5lcigpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIsIG1lcmdlZC5nZXRJbm5lcigpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotICAgIGFzc2VydEVxdWFscygxMTUsIG1lcmdlZC5nZXRPbmVvZklubmVyKCkuZ2V0TnVtKCkpOwotICAgIGFzc2VydEVxdWFscyg0MiwgbWVyZ2VkLmdldE9uZW9mSW5uZXIoKS5nZXROdW1XaXRoRGVmYXVsdCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemUoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICBMYXp5TmVzdGVkSW5uZXJNZXNzYWdlTGl0ZSBuZXN0ZWQgPSBMYXp5TmVzdGVkSW5uZXJNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE51bSgzKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBMYXp5SW5uZXJNZXNzYWdlTGl0ZSBpbm5lciA9IExhenlJbm5lck1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TnVtKDIpCi0gICAgICAgIC5zZXROZXN0ZWQobmVzdGVkKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBMYXp5TWVzc2FnZUxpdGUgb3V0ZXIgPSBMYXp5TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXROdW0oMSkKLSAgICAgICAgLnNldElubmVyKGlubmVyKQotICAgICAgICAuc2V0T25lb2ZJbm5lcihpbm5lcikKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBCeXRlU3RyaW5nIGJ5dGVzID0gb3V0ZXIudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGJ5dGVzLnNpemUoKSwgb3V0ZXIuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0KLSAgICBMYXp5TWVzc2FnZUxpdGUgZGVzZXJpYWxpemVkID0gTGF6eU1lc3NhZ2VMaXRlLnBhcnNlRnJvbShieXRlcyk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMSwgZGVzZXJpYWxpemVkLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIxLCAgZGVzZXJpYWxpemVkLmdldE51bVdpdGhEZWZhdWx0KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDIsICBkZXNlcmlhbGl6ZWQuZ2V0SW5uZXIoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQyLCAgZGVzZXJpYWxpemVkLmdldElubmVyKCkuZ2V0TnVtV2l0aERlZmF1bHQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgIGRlc2VyaWFsaXplZC5nZXRJbm5lcigpLmdldE5lc3RlZCgpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgIGRlc2VyaWFsaXplZC5nZXRJbm5lcigpLmdldE5lc3RlZCgpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDIsICBkZXNlcmlhbGl6ZWQuZ2V0T25lb2ZJbm5lcigpLmdldE51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDIsICBkZXNlcmlhbGl6ZWQuZ2V0T25lb2ZJbm5lcigpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotICAgIGFzc2VydEVxdWFscygzLCAgZGVzZXJpYWxpemVkLmdldE9uZW9mSW5uZXIoKS5nZXROZXN0ZWQoKS5nZXROdW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsICBkZXNlcmlhbGl6ZWQuZ2V0T25lb2ZJbm5lcigpLmdldE5lc3RlZCgpLmdldE51bVdpdGhEZWZhdWx0KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGJ5dGVzLCBkZXNlcmlhbGl6ZWQudG9CeXRlU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBMYXp5SW5uZXJNZXNzYWdlTGl0ZS5CdWlsZGVyIGlubmVyQnVpbGRlciA9IExhenlJbm5lck1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKTsKLSAgICBpbm5lckJ1aWxkZXIuc2V0RXh0ZW5zaW9uKAotICAgICAgICBMYXp5RXh0ZW5zaW9uLmV4dGVuc2lvbiwgTGF6eUV4dGVuc2lvbi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE5hbWUoIm5hbWUiKS5idWlsZCgpKTsKLSAgICBhc3NlcnRUcnVlKGlubmVyQnVpbGRlci5oYXNFeHRlbnNpb24oTGF6eUV4dGVuc2lvbi5leHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHMoIm5hbWUiLCBpbm5lckJ1aWxkZXIuZ2V0RXh0ZW5zaW9uKExhenlFeHRlbnNpb24uZXh0ZW5zaW9uKS5nZXROYW1lKCkpOwotCi0gICAgTGF6eUlubmVyTWVzc2FnZUxpdGUgaW5uZXJNZXNzYWdlID0gaW5uZXJCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VHJ1ZShpbm5lck1lc3NhZ2UuaGFzRXh0ZW5zaW9uKExhenlFeHRlbnNpb24uZXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJuYW1lIiwgaW5uZXJNZXNzYWdlLmdldEV4dGVuc2lvbihMYXp5RXh0ZW5zaW9uLmV4dGVuc2lvbikuZ2V0TmFtZSgpKTsKLQotICAgIExhenlNZXNzYWdlTGl0ZSBsaXRlID0gTGF6eU1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0SW5uZXIoaW5uZXJNZXNzYWdlKS5idWlsZCgpOwotICAgIGFzc2VydFRydWUobGl0ZS5nZXRJbm5lcigpLmhhc0V4dGVuc2lvbihMYXp5RXh0ZW5zaW9uLmV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFscygibmFtZSIsIGxpdGUuZ2V0SW5uZXIoKS5nZXRFeHRlbnNpb24oTGF6eUV4dGVuc2lvbi5leHRlbnNpb24pLmdldE5hbWUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0FycmF5TGlzdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0FycmF5TGlzdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGY0MmFjNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNjIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHN0YXRpYyBqYXZhLnV0aWwuQXJyYXlzLmFzTGlzdDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgTGF6eVN0cmluZ0FycmF5TGlzdH0uCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5U3RyaW5nQXJyYXlMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0EgPSAiQSI7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQiA9ICJCIjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19DID0gIkMiOwotCi0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgQllURV9TVFJJTkdfQSA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJBIik7Ci0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgQllURV9TVFJJTkdfQiA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJCIik7Ci0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgQllURV9TVFJJTkdfQyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJDIik7Ci0KLSAgcHVibGljIHZvaWQgdGVzdEp1c3RTdHJpbmdzKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoU1RSSU5HX0EpOwotICAgIGxpc3QuYWRkKFNUUklOR19CKTsKLSAgICBsaXN0LmFkZChTVFJJTkdfQyk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19CLCBsaXN0LmdldCgxKSk7Ci0gICAgYXNzZXJ0U2FtZShTVFJJTkdfQywgbGlzdC5nZXQoMikpOwotCi0gICAgbGlzdC5zZXQoMSwgU1RSSU5HX0MpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0MsIGxpc3QuZ2V0KDEpKTsKLQotICAgIGxpc3QucmVtb3ZlKDEpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0LmdldCgxKSk7Ci0KLSAgICBMaXN0PEJ5dGVTdHJpbmc+IGJ5dGVTdHJpbmdMaXN0ID0gbGlzdC5hc0J5dGVTdHJpbmdMaXN0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0EsIGJ5dGVTdHJpbmdMaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0MsIGJ5dGVTdHJpbmdMaXN0LmdldCgxKSk7Ci0KLSAgICAvLyBVbmRlcmx5aW5nIGxpc3Qgc2hvdWxkIGJlIHRyYW5zZm9ybWVkLgotICAgIGFzc2VydFNhbWUoYnl0ZVN0cmluZ0xpc3QuZ2V0KDApLCBsaXN0LmdldEJ5dGVTdHJpbmcoMCkpOwotICAgIGFzc2VydFNhbWUoYnl0ZVN0cmluZ0xpc3QuZ2V0KDEpLCBsaXN0LmdldEJ5dGVTdHJpbmcoMSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEp1c3RCeXRlU3RyaW5nKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQSk7Ci0gICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQik7Ci0gICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQyk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQSwgbGlzdC5nZXRCeXRlU3RyaW5nKDApKTsKLSAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0IsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7Ci0gICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19DLCBsaXN0LmdldEJ5dGVTdHJpbmcoMikpOwotCi0gICAgbGlzdC5yZW1vdmUoMSk7Ci0gICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19BLCBsaXN0LmdldEJ5dGVTdHJpbmcoMCkpOwotICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQywgbGlzdC5nZXRCeXRlU3RyaW5nKDEpKTsKLQotICAgIExpc3Q8Qnl0ZVN0cmluZz4gYnl0ZVN0cmluZ0xpc3QgPSBsaXN0LmFzQnl0ZVN0cmluZ0xpc3QoKTsKLSAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0EsIGJ5dGVTdHJpbmdMaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19DLCBieXRlU3RyaW5nTGlzdC5nZXQoMSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25CYWNrQW5kRm9ydGgoKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCBsaXN0ID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChTVFJJTkdfQSk7Ci0gICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQik7Ci0gICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQyk7Ci0KLSAgICAvLyBTdHJpbmcgYSBzaG91bGQgYmUgdGhlIHNhbWUgYmVjYXVzZSBpdCB3YXMgb3JpZ2luYWxseSBhIHN0cmluZwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QuZ2V0KDApKTsKLQotICAgIC8vIFN0cmluZyBiIGFuZCBjIHNob3VsZCBiZSBkaWZmZXJlbnQgYmVjYXVzZSB0aGUgc3RyaW5nIGhhcyB0byBiZSBjb21wdXRlZAotICAgIC8vIGZyb20gdGhlIEJ5dGVTdHJpbmcKLSAgICBTdHJpbmcgYlByaW1lID0gbGlzdC5nZXQoMSk7Ci0gICAgYXNzZXJ0Tm90U2FtZShTVFJJTkdfQiwgYlByaW1lKTsKLSAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX0IsIGJQcmltZSk7Ci0gICAgU3RyaW5nIGNQcmltZSA9IGxpc3QuZ2V0KDIpOwotICAgIGFzc2VydE5vdFNhbWUoU1RSSU5HX0MsIGNQcmltZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFNUUklOR19DLCBjUHJpbWUpOwotCi0gICAgLy8gU3RyaW5nIGMgYW5kIGMgc2hvdWxkIHN0YXkgdGhlIHNhbWUgb25jZSBjYWNoZWQuCi0gICAgYXNzZXJ0U2FtZShiUHJpbWUsIGxpc3QuZ2V0KDEpKTsKLSAgICBhc3NlcnRTYW1lKGNQcmltZSwgbGlzdC5nZXQoMikpOwotCi0gICAgLy8gQnl0ZVN0cmluZyBuZWVkcyB0byBiZSBjb21wdXRlZCBmcm9tIHN0cmluZyBmb3IgYm90aCBhIGFuZCBiCi0gICAgQnl0ZVN0cmluZyBhUHJpbWVCeXRlU3RyaW5nID0gbGlzdC5nZXRCeXRlU3RyaW5nKDApOwotICAgIGFzc2VydEVxdWFscyhCWVRFX1NUUklOR19BLCBhUHJpbWVCeXRlU3RyaW5nKTsKLSAgICBCeXRlU3RyaW5nIGJQcmltZUJ5dGVTdHJpbmcgPSBsaXN0LmdldEJ5dGVTdHJpbmcoMSk7Ci0gICAgYXNzZXJ0Tm90U2FtZShCWVRFX1NUUklOR19CLCBiUHJpbWVCeXRlU3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoQllURV9TVFJJTkdfQiwgbGlzdC5nZXRCeXRlU3RyaW5nKDEpKTsKLQotICAgIC8vIE9uY2UgY2FjaGVkLCBCeXRlU3RyaW5nIHNob3VsZCBzdGF5IGNhY2hlZC4KLSAgICBhc3NlcnRTYW1lKGFQcmltZUJ5dGVTdHJpbmcsIGxpc3QuZ2V0Qnl0ZVN0cmluZygwKSk7Ci0gICAgYXNzZXJ0U2FtZShiUHJpbWVCeXRlU3RyaW5nLCBsaXN0LmdldEJ5dGVTdHJpbmcoMSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvcHlDb25zdHJ1Y3RvckNvcGllc0J5UmVmZXJlbmNlKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdDEgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdCgpOwotICAgIGxpc3QxLmFkZChTVFJJTkdfQSk7Ci0gICAgbGlzdDEuYWRkKEJZVEVfU1RSSU5HX0IpOwotICAgIGxpc3QxLmFkZChCWVRFX1NUUklOR19DKTsKLQotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdDIgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdChsaXN0MSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3QyLnNpemUoKSk7Ci0gICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdDIuZ2V0KDApKTsKLSAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0IsIGxpc3QyLmdldEJ5dGVTdHJpbmcoMSkpOwotICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQywgbGlzdDIuZ2V0Qnl0ZVN0cmluZygyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGlzdENvcHlDb25zdHJ1Y3RvcigpIHsKLSAgICBMaXN0PFN0cmluZz4gbGlzdDEgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICBsaXN0MS5hZGQoU1RSSU5HX0EpOwotICAgIGxpc3QxLmFkZChTVFJJTkdfQik7Ci0gICAgbGlzdDEuYWRkKFNUUklOR19DKTsKLQotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdDIgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdChsaXN0MSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3QyLnNpemUoKSk7Ci0gICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdDIuZ2V0KDApKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19CLCBsaXN0Mi5nZXQoMSkpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0MsIGxpc3QyLmdldCgyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsQ29waWVzQnlSZWZlcmVuY2VJZlBvc3NpYmxlKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdDEgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdCgpOwotICAgIGxpc3QxLmFkZChTVFJJTkdfQSk7Ci0gICAgbGlzdDEuYWRkKEJZVEVfU1RSSU5HX0IpOwotICAgIGxpc3QxLmFkZChCWVRFX1NUUklOR19DKTsKLQotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdDIgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdCgpOwotICAgIGxpc3QyLmFkZEFsbChsaXN0MSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdDIuc2l6ZSgpKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19BLCBsaXN0Mi5nZXQoMCkpOwotICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQiwgbGlzdDIuZ2V0Qnl0ZVN0cmluZygxKSk7Ci0gICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19DLCBsaXN0Mi5nZXRCeXRlU3RyaW5nKDIpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1vZGlmaWNhdGlvbldpdGhJdGVyYXRpb24oKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCBsaXN0ID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZEFsbChhc0xpc3QoU1RSSU5HX0EsIFNUUklOR19CLCBTVFJJTkdfQykpOwotICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX0EsIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX0EsIGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgCi0gICAgLy8gRG9lcyBub3Qgc3RydWN0dXJhbGx5IG1vZGlmeS4KLSAgICBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICBsaXN0LnNldCgwLCBTVFJJTkdfQik7Ci0gICAgaXRlcmF0b3IubmV4dCgpOwotICAgIAotICAgIGxpc3QucmVtb3ZlKDApOwotICAgIHRyeSB7Ci0gICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICBpdGVyYXRvciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICBsaXN0LmFkZCgwLCBTVFJJTkdfQyk7Ci0gICAgdHJ5IHsKLSAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TWFrZUltbXV0YWJsZSgpIHsKLSAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IGxpc3QgPSBuZXcgTGF6eVN0cmluZ0FycmF5TGlzdCgpOwotICAgIGxpc3QuYWRkKFNUUklOR19BKTsKLSAgICBsaXN0LmFkZChTVFJJTkdfQik7Ci0gICAgbGlzdC5hZGQoU1RSSU5HX0MpOwotICAgIGxpc3QubWFrZUltbXV0YWJsZSgpOwotICAgIGFzc2VydEdlbmVyaWNMaXN0SW1tdXRhYmxlKGxpc3QsIFNUUklOR19BKTsKLSAgICAKLSAgICAvLyBMYXp5U3RyaW5nQXJyYXlMaXN0IGhhcyBleHRyYSBtZXRob2RzIG5vdCBjb3ZlcmVkIGluIHRoZSBnZW5lcmljCi0gICAgLy8gYXNzZXJ0aW9uLgotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZChCWVRFX1NUUklOR19BLnRvQnl0ZUFycmF5KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZChCWVRFX1NUUklOR19BKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGxCeXRlQXJyYXkoYXNMaXN0KEJZVEVfU1RSSU5HX0EudG9CeXRlQXJyYXkoKSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbEJ5dGVTdHJpbmcoYXNMaXN0KEJZVEVfU1RSSU5HX0EpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5tZXJnZUZyb20obmV3IExhenlTdHJpbmdBcnJheUxpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDAsIEJZVEVfU1RSSU5HX0EudG9CeXRlQXJyYXkoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDAsIEJZVEVfU1RSSU5HX0EpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SW1tdXRhYmlsaXR5UHJvcGFnYXRpb24oKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCBsaXN0ID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChTVFJJTkdfQSk7Ci0gICAgbGlzdC5tYWtlSW1tdXRhYmxlKCk7Ci0KLSAgICBhc3NlcnRHZW5lcmljTGlzdEltbXV0YWJsZShsaXN0LmFzQnl0ZVN0cmluZ0xpc3QoKSwgQllURV9TVFJJTkdfQSk7Ci0gICAgCi0gICAgLy8gQXJyYXlzIHVzZSByZWZlcmVuY2UgZXF1YWxpdHkgc28gbmVlZCB0byByZXRyaWV2ZSB0aGUgdW5kZXJseWluZyB2YWx1ZQotICAgIC8vIHRvIHByb3Blcmx5IHRlc3QgZGVlcCBpbW11dGFiaWxpdHkuCi0gICAgTGlzdDxieXRlW10+IGJ5dGVBcnJheUxpc3QgPSBsaXN0LmFzQnl0ZUFycmF5TGlzdCgpOwotICAgIGFzc2VydEdlbmVyaWNMaXN0SW1tdXRhYmxlKGJ5dGVBcnJheUxpc3QsIGJ5dGVBcnJheUxpc3QuZ2V0KDApKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgPFQ+IHZvaWQgYXNzZXJ0R2VuZXJpY0xpc3RJbW11dGFibGUoTGlzdDxUPiBsaXN0LCBUIHZhbHVlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKHZhbHVlKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoMCwgdmFsdWUpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChhc0xpc3QodmFsdWUpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgYXNMaXN0KHZhbHVlKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5jbGVhcigpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmUodmFsdWUpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChhc0xpc3QodmFsdWUpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoYXNMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJldGFpbkFsbChhc0xpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDAsIHZhbHVlKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nRW5kVG9FbmRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdFbmRUb0VuZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGVmNDE0YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdFbmRUb0VuZFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0cyB0byBtYWtlIHN1cmUgdGhlIGxhenkgY29udmVyc2lvbiBvZiBVVEY4LWVuY29kZWQgYnl0ZSBhcnJheXMgdG8KLSAqIHN0cmluZ3Mgd29ya3MgY29ycmVjdGx5LgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgY2xhc3MgTGF6eVN0cmluZ0VuZFRvRW5kVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjggPQotICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShuZXcgYnl0ZVtdIHsKLSAgICAgICAgICAxMTQsIDQsIC0xLCAwLCAtMSwgMCwgLTMwLCAyLCA0LCAtMSwKLSAgICAgICAgICAwLCAtMSwgMCwgLTMwLCAyLCA0LCAtMSwgMCwgLTEsIDAsIH0pOwotCi0gIHByaXZhdGUgQnl0ZVN0cmluZyBlbmNvZGVkVGVzdEFsbFR5cGVzOwotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgdGhpcy5lbmNvZGVkVGVzdEFsbFR5cGVzID0gVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiZm9vIikKLSAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJiYXIiKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImJheiIpCi0gICAgICAgIC5idWlsZCgpCi0gICAgICAgIC50b0J5dGVTdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0aGF0IGFuIGludmFsaWQgVVRGOCBzdHJpbmcgd2lsbCByb3VuZHRyaXAgdGhyb3VnaCBhIHBhcnNlCi0gICAqIGFuZCBzZXJpYWxpemF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlQW5kU2VyaWFsaXplKCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMgdFYyID0gVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMucGFyc2VGcm9tKAotICAgICAgICBURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4KTsKLSAgICBCeXRlU3RyaW5nIGJ5dGVzID0gdFYyLnRvQnl0ZVN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4LCBieXRlcyk7Ci0KLSAgICB0VjIuZ2V0T3B0aW9uYWxTdHJpbmcoKTsKLSAgICBieXRlcyA9IHRWMi50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRFcXVhbHMoVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCwgYnl0ZXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlQW5kV3JpdGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzIHRWMiA9IFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLnBhcnNlRnJvbSgKLSAgICAgICAgVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCk7Ci0gICAgYnl0ZVtdIHNpbmsgPSBuZXcgYnl0ZVtURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4LnNpemUoKV07Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2Uoc2luayk7Ci0gICAgdFYyLndyaXRlVG8ob3V0cHV0U3RyZWFtKTsKLSAgICBvdXRwdXRTdHJlYW0uZmx1c2goKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjgsCi0gICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb20oc2luaykpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Q2FjaGluZygpIHsKLSAgICBTdHJpbmcgYSA9ICJhIjsKLSAgICBTdHJpbmcgYiA9ICJiIjsKLSAgICBTdHJpbmcgYyA9ICJjIjsKLSAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcyBwcm90byA9IFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoYSkKLSAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKGIpCi0gICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZyhjKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIC8vIFN0cmluZyBzaG91bGQgYmUgdGhlIG9uZSB3ZSBwYXNzZWQgaXQuCi0gICAgYXNzZXJ0U2FtZShhLCBwcm90by5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgICBhc3NlcnRTYW1lKGIsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDApKTsKLSAgICBhc3NlcnRTYW1lKGMsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDEpKTsKLQotCi0gICAgLy8gRW5zdXJlIHNlcmlhbGl6YXRpb24ga2VlcHMgc3RyaW5ncyBjYWNoZWQuCi0gICAgcHJvdG8udG9CeXRlU3RyaW5nKCk7Ci0KLSAgICAvLyBBbmQgbm93IHRoZSBzdHJpbmcgc2hvdWxkIHN0YXkgY2FjaGVkLgotICAgIGFzc2VydFNhbWUoYSwgcHJvdG8uZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0U2FtZShiLCBwcm90by5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYXNzZXJ0U2FtZShjLCBwcm90by5nZXRSZXBlYXRlZFN0cmluZygxKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Tm9TdHJpbmdDYWNoaW5nSWZPbmx5Qnl0ZXNBY2Nlc3NlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzIHByb3RvID0KLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMucGFyc2VGcm9tKGVuY29kZWRUZXN0QWxsVHlwZXMpOwotICAgIEJ5dGVTdHJpbmcgb3B0aW9uYWwgPSBwcm90by5nZXRPcHRpb25hbFN0cmluZ0J5dGVzKCk7Ci0gICAgYXNzZXJ0U2FtZShvcHRpb25hbCwgcHJvdG8uZ2V0T3B0aW9uYWxTdHJpbmdCeXRlcygpKTsKLSAgICBhc3NlcnRTYW1lKG9wdGlvbmFsLCBwcm90by50b0J1aWxkZXIoKS5nZXRPcHRpb25hbFN0cmluZ0J5dGVzKCkpOwotCi0gICAgQnl0ZVN0cmluZyByZXBlYXRlZDAgPSBwcm90by5nZXRSZXBlYXRlZFN0cmluZ0J5dGVzKDApOwotICAgIEJ5dGVTdHJpbmcgcmVwZWF0ZWQxID0gcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygxKTsKLSAgICBhc3NlcnRTYW1lKHJlcGVhdGVkMCwgcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygwKSk7Ci0gICAgYXNzZXJ0U2FtZShyZXBlYXRlZDEsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nQnl0ZXMoMSkpOwotICAgIGFzc2VydFNhbWUocmVwZWF0ZWQwLCBwcm90by50b0J1aWxkZXIoKS5nZXRSZXBlYXRlZFN0cmluZ0J5dGVzKDApKTsKLSAgICBhc3NlcnRTYW1lKHJlcGVhdGVkMSwgcHJvdG8udG9CdWlsZGVyKCkuZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygxKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZUVxdWFsc0FuZEhhc2hUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVFcXVhbHNBbmRIYXNoVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyOWU4ZDg3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZUVxdWFsc0FuZEhhc2hUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LmxpdGVfZXF1YWxzX2FuZF9oYXNoLkxpdGVFcXVhbHNBbmRIYXNoLkJhcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5saXRlX2VxdWFsc19hbmRfaGFzaC5MaXRlRXF1YWxzQW5kSGFzaC5CYXJQcmltZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5saXRlX2VxdWFsc19hbmRfaGFzaC5MaXRlRXF1YWxzQW5kSGFzaC5Gb287Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QubGl0ZV9lcXVhbHNfYW5kX2hhc2guTGl0ZUVxdWFsc0FuZEhhc2guVGVzdE9uZW9mRXF1YWxzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LmxpdGVfZXF1YWxzX2FuZF9oYXNoLkxpdGVFcXVhbHNBbmRIYXNoLlRlc3RSZWN1cnNpdmVPbmVvZjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0IGdlbmVyYXRlIGVxdWFsIGFuZCBoYXNoIG1ldGhvZHMgZm9yIHRoZSBsaXRlIHJ1bnRpbWUuCi0gKgotICogQGF1dGhvciBwYm9nbGVAZ29vZ2xlLmNvbSBQaGlsIEJvZ2xlCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXRlRXF1YWxzQW5kSGFzaFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFNpbmNlIHRoZSBnZW5lcmF0ZWQgZXF1YWxzIGFuZCBoYXNoQ29kZSBtZXRob2RzIGZvciBsaXRlIG1lc3NhZ2VzIGFyZSBhCi0gICAgLy8gbW9zdGx5IGNvbXBsZXRlIHN1YnNldCBvZiB0aG9zZSBmb3IgcmVndWxhciBtZXNzYWdlcywgd2UgY2FuIG1vc3RseSBhc3N1bWUKLSAgICAvLyB0aGF0IHRoZSBnZW5lcmF0ZWQgbWV0aG9kcyBhcmUgYWxyZWFkeSB0aG9yb3VnaGx5IHRlc3RlZCBieSB0aGUgcmVndWxhciB0ZXN0cy4KLQotICAgIC8vIFRoaXMgdGVzdCBtb3N0bHkganVzdCB2ZXJpZmllcyBpcyB0aGF0IGEgcHJvdG8gd2l0aAotICAgIC8vIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBhbmQgamF2YV9nZW5lcmF0ZXNfZXF1YWxzX2FuZF9oYXNoX2NvbXBpbGVzCi0gICAgLy8gY29ycmVjdGx5IHdoZW4gbGlua2VkIG9ubHkgYWdhaW5zdCB0aGUgbGl0ZSBsaWJyYXJ5LgotCi0gICAgLy8gV2UgZG8gaG93ZXZlciBkbyBzb21lIGJhc2ljIHRlc3RpbmcgdG8gbWFrZSBzdXJlIHRoYXQgZXF1YWxzIGlzIGFjdHVhbGx5Ci0gICAgLy8gb3ZlcnJpZGVuIHRvIHRlc3QgZm9yIHZhbHVlIGVxdWFsaXR5IHJhdGhlciB0aGFuIHNpbXBsZSBvYmplY3QgZXF1YWxpdHkuCi0KLSAgICAvLyBDaGVjayB0aGF0IHR3byBpZGVudGljYWwgb2JqcyBhcmUgZXF1YWwuCi0gICAgRm9vIGZvbzFhID0gRm9vLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLmFkZEJhcihCYXIubmV3QnVpbGRlcigpLnNldE5hbWUoImZvbzEiKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRm9vIGZvbzFiID0gRm9vLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLmFkZEJhcihCYXIubmV3QnVpbGRlcigpLnNldE5hbWUoImZvbzEiKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRm9vIGZvbzIgPSBGb28ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRWYWx1ZSgxKQotICAgICAgICAuYWRkQmFyKEJhci5uZXdCdWlsZGVyKCkuc2V0TmFtZSgiZm9vMiIpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIC8vIENoZWNrIHRoYXQgZXF1YWxzIGlzIGRvaW5nIHZhbHVlIHJhdGhlciB0aGFuIG9iamVjdCBlcXVhbGl0eS4KLSAgICBhc3NlcnRFcXVhbHMoZm9vMWEsIGZvbzFiKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9vMWEuaGFzaENvZGUoKSwgZm9vMWIuaGFzaENvZGUoKSk7Ci0KLSAgICAvLyBDaGVjayB0aGF0IGEgZGlmZmVlbnQgb2JqZWN0IGlzIG5vdCBlcXVhbC4KLSAgICBhc3NlcnRGYWxzZShmb28xYS5lcXVhbHMoZm9vMikpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCB0d28gb2JqZWN0cyB3aGljaCBoYXZlIGRpZmZlcmVudCB0eXBlcyBidXQgdGhlIHNhbWUgZmllbGQgdmFsdWVzIGFyZSBub3QKLSAgICAvLyBjb25zaWRlcmVkIHRvIGJlIGVxdWFsLgotICAgIEJhciBiYXIgPSBCYXIubmV3QnVpbGRlcigpLnNldE5hbWUoImJhciIpLmJ1aWxkKCk7Ci0gICAgQmFyUHJpbWUgYmFyUHJpbWUgPSBCYXJQcmltZS5uZXdCdWlsZGVyKCkuc2V0TmFtZSgiYmFyIikuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShiYXIuZXF1YWxzKGJhclByaW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T25lb2ZFcXVhbHMuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mRXF1YWxzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0T25lb2ZFcXVhbHMgbWVzc2FnZTEgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgLy8gU2V0IG1lc3NhZ2UyJ3MgbmFtZSBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLiBUaGUgdHdvIG1lc3NhZ2VzIHNob3VsZCBiZSBkaWZmZXJlbnQgd2hlbiB3ZQotICAgIC8vIGNoZWNrIHdpdGggdGhlIG9uZW9mIGNhc2UuCi0gICAgYnVpbGRlci5zZXROYW1lKCIiKTsKLSAgICBUZXN0T25lb2ZFcXVhbHMgbWVzc2FnZTIgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZTEuZXF1YWxzKG1lc3NhZ2UyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaENvZGVXaXRoVW5rbm93bkZpZWxkcygpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIEZvbyBmb29XaXRoT25seVZhbHVlID0gRm9vLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBGb28gZm9vV2l0aFZhbHVlQW5kRXh0ZW5zaW9uID0gZm9vV2l0aE9ubHlWYWx1ZS50b0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLnNldEV4dGVuc2lvbihCYXIuZm9vRXh0LCBCYXIubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0TmFtZSgibmFtZSIpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBGb28gZm9vV2l0aFZhbHVlQW5kVW5rbm93bkZpZWxkcyA9IEZvby5wYXJzZUZyb20oZm9vV2l0aFZhbHVlQW5kRXh0ZW5zaW9uLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzQW5kSGFzaENvZGVBcmVGYWxzZShmb29XaXRoT25seVZhbHVlLCBmb29XaXRoVmFsdWVBbmRVbmtub3duRmllbGRzKTsKLSAgICBhc3NlcnRFcXVhbHNBbmRIYXNoQ29kZUFyZUZhbHNlKGZvb1dpdGhWYWx1ZUFuZEV4dGVuc2lvbiwgZm9vV2l0aFZhbHVlQW5kVW5rbm93bkZpZWxkcyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0RXF1YWxzQW5kSGFzaENvZGVBcmVGYWxzZShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgIGFzc2VydEZhbHNlKG8xLmVxdWFscyhvMikpOwotICAgIGFzc2VydEZhbHNlKG8xLmhhc2hDb2RlKCkgPT0gbzIuaGFzaENvZGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlSGFzaGNvZGUoKSB7Ci0gICAgLy8gVGhpcyB0ZXN0cyB0aGF0IHdlIGRvbid0IGluZmluaXRlIGxvb3AuCi0gICAgVGVzdFJlY3Vyc2l2ZU9uZW9mLmdldERlZmF1bHRJbnN0YW5jZSgpLmhhc2hDb2RlKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhjM2UwYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjI5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdDsKLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkNvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3Q7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0SW1wb3J0TGl0ZS5JbXBvcnRFbnVtTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0SW1wb3J0UHVibGljTGl0ZS5QdWJsaWNJbXBvcnRNZXNzYWdlTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5Gb3JlaWduRW51bUxpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuRm9yZWlnbk1lc3NhZ2VMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxFeHRlbnNpb25zTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbFR5cGVzTGl0ZS5PbmVvZkZpZWxkQ2FzZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlLk9wdGlvbmFsR3JvdXA7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbFR5cGVzTGl0ZS5SZXBlYXRlZEdyb3VwOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxUeXBlc0xpdGVPckJ1aWxkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QubGl0ZV9lcXVhbHNfYW5kX2hhc2guTGl0ZUVxdWFsc0FuZEhhc2guQmFyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LmxpdGVfZXF1YWxzX2FuZF9oYXNoLkxpdGVFcXVhbHNBbmRIYXNoLkJhclByaW1lOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LmxpdGVfZXF1YWxzX2FuZF9oYXNoLkxpdGVFcXVhbHNBbmRIYXNoLkZvbzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5saXRlX2VxdWFsc19hbmRfaGFzaC5MaXRlRXF1YWxzQW5kSGFzaC5UZXN0T25lb2ZFcXVhbHM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QubGl0ZV9lcXVhbHNfYW5kX2hhc2guTGl0ZUVxdWFsc0FuZEhhc2guVGVzdFJlY3Vyc2l2ZU9uZW9mOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk5vdFNlcmlhbGl6YWJsZUV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIFRlc3QgbGl0ZSBydW50aW1lLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCB0aGF0IG5lc3RlZCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZCBjb3JyZWN0bHkgZXZlbiBpZiB0aGUgb3V0ZXIKLSAgICAvLyBjbGFzcyBoYXMgbm90IGJlZW4gYWNjZXNzZWQgZGlyZWN0bHkuICBUaGlzIHdhcyBvbmNlIGEgYnVnIHdpdGggbGl0ZQotICAgIC8vIG1lc3NhZ2VzLgotICAgIC8vCi0gICAgLy8gV2UgcHV0IHRoaXMgaW4gc2V0VXAoKSByYXRoZXIgdGhhbiBpbiBpdHMgb3duIHRlc3QgbWV0aG9kIGJlY2F1c2Ugd2UKLSAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBydW5zIGJlZm9yZSBhbnkgYWN0dWFsIHRlc3RzLgotICAgIGFzc2VydFRydWUoVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUubmVzdGVkRXh0ZW5zaW9uICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBTaW5jZSBsaXRlIG1lc3NhZ2VzIGFyZSBhIHN1YnNldCBvZiByZWd1bGFyIG1lc3NhZ2VzLCB3ZSBjYW4gbW9zdGx5Ci0gICAgLy8gYXNzdW1lIHRoYXQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbGl0ZSBtZXNzYWdlcyBpcyBhbHJlYWR5IHRob3JvdWdobHkKLSAgICAvLyB0ZXN0ZWQgYnkgdGhlIHJlZ3VsYXIgdGVzdHMuICBBbGwgdGhpcyB0ZXN0IHJlYWxseSB2ZXJpZmllcyBpcyB0aGF0Ci0gICAgLy8gYSBwcm90byB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjb21waWxlcyBjb3JyZWN0bHkgd2hlbgotICAgIC8vIGxpbmtlZCBvbmx5IGFnYWluc3QgdGhlIGxpdGUgbGlicmFyeS4gIFRoYXQgaXMgYWxsIHRlc3RlZCBhdCBjb21waWxlCi0gICAgLy8gdGltZSwgbGVhdmluZyBub3QgbXVjaCB0byBkbyBpbiB0aGlzIG1ldGhvZC4gIExldCdzIGp1c3QgZG8gc29tZSByYW5kb20KLSAgICAvLyBzdHVmZiB0byBtYWtlIHN1cmUgdGhlIGxpdGUgbWVzc2FnZSBpcyBhY3R1YWxseSBoZXJlIGFuZCB1c2FibGUuCi0KLSAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UgPQotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxMjMpCi0gICAgICAgICAgICAgICAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJoZWxsbyIpCi0gICAgICAgICAgICAgICAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig3KSkKLSAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzTGl0ZS5wYXJzZUZyb20oZGF0YSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlMi5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZ0NvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDcsIG1lc3NhZ2UyLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldEJiKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVE9ETyhrZW50b24pOiAgVW5saWtlIG90aGVyIGZlYXR1cmVzIG9mIHRoZSBsaXRlIGxpYnJhcnksIGV4dGVuc2lvbnMgYXJlCi0gICAgLy8gICBpbXBsZW1lbnRlZCBjb21wbGV0ZWx5IGRpZmZlcmVudGx5IGZyb20gdGhlIHJlZ3VsYXIgbGlicmFyeS4gIFdlCi0gICAgLy8gICBzaG91bGQgcHJvYmFibHkgdGVzdCB0aGVtIG1vcmUgdGhvcm91Z2hseS4KLQotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0KLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykKLSAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAiaGVsbG8iKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWikKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNykuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAvLyBUZXN0IGNvcHlpbmcgYSBtZXNzYWdlLCBzaW5jZSBjb3BpbmcgZXh0ZW5zaW9ucyBhY3R1YWxseSBkb2VzIHVzZSBhCi0gICAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aCBiZXR3ZWVuIGxpdGUgYW5kIHJlZ3VsYXIgbGlicmFyaWVzLCBhbmQgYXMgb2YgdGhpcwotICAgIC8vIHdyaXRpbmcsIHBhcnNpbmcgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlMiA9IG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygxMjMsIChpbnQpIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKLSAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKLSAgICAgICAgVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAotICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKLSAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHMoNywgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAotICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuZ2V0QmIoKSk7Ci0gIH0KLSAgCi0gIAotICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZS5CdWlsZGVyIGV4cGVjdGVkID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsSW50MzIoMTIzKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIGV4cGVjdGVkLmdldE9wdGlvbmFsSW50MzIoKSwgZXhwZWN0ZWQuY2xvbmUoKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgCi0gICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgZXhwZWN0ZWQyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIGV4cGVjdGVkMi5nZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSwKLSAgICAgICAgZXhwZWN0ZWQyLmNsb25lKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0QWRkQWxsKCkgewotICAgIHRyeSB7Ci0gICAgICBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAgIC5hZGRBbGxSZXBlYXRlZEJ5dGVzKG51bGwpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkLgotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNhbml0eUNvcHlPbldyaXRlKCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgLy8gU2luY2UgYnVpbGRlcnMgYXJlIGltcGxlbWVudGVkIGFzIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCBhIG1lc3NhZ2UKLSAgICAvLyBpbnN0YW5jZSwgd2UgYXR0ZW1wdCB0byB2ZXJpZnkgdGhhdCB3ZSBjYW4ndCBjYXVzZSB0aGUgYnVpbGRlciB0byBtb2RpZnkKLSAgICAvLyBhIHByb2R1Y2VkIG1lc3NhZ2UuCi0KLSAgICBUZXN0QWxsVHlwZXNMaXRlLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpOwotICAgIFRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2VBZnRlckJ1aWxkOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxCb29sKHRydWUpOwotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRPcHRpb25hbEJvb2woKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxCb29sKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyh0cnVlLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEJvb2woKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldE9wdGlvbmFsQm9vbCgpKTsKLSAgICBidWlsZGVyLmNsZWFyT3B0aW9uYWxCb29sKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBidWlsZGVyLmdldE9wdGlvbmFsQm9vbCgpKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxCb29sKCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsQnl0ZXMoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIikpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJoaSIpLCBidWlsZGVyLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiaGkiKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRPcHRpb25hbEJ5dGVzKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbEJ5dGVzKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIGJ1aWxkZXIuZ2V0T3B0aW9uYWxCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJoaSIpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEJ5dGVzKCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsQ29yZCgiaGkiKTsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxDb3JkKCkpOwotICAgIGFzc2VydEVxdWFscygiaGkiLCBidWlsZGVyLmdldE9wdGlvbmFsQ29yZCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxDb3JkKCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRPcHRpb25hbENvcmQoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsQ29yZCgpOwotICAgIGFzc2VydEVxdWFscygiIiwgYnVpbGRlci5nZXRPcHRpb25hbENvcmQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoaSIsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsQ29yZCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbENvcmRCeXRlcyhCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgibm8iKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxDb3JkQnl0ZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJubyIpLCBidWlsZGVyLmdldE9wdGlvbmFsQ29yZEJ5dGVzKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIm5vIiksCi0gICAgICAgIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsQ29yZEJ5dGVzKCkpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldE9wdGlvbmFsQ29yZEJ5dGVzKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbENvcmQoKTsKLSAgICBhc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgYnVpbGRlci5nZXRPcHRpb25hbENvcmRCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJubyIpLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbENvcmRCeXRlcygpKTsKLSAgICAKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxEb3VibGUoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBELCBtZXNzYWdlLmdldE9wdGlvbmFsRG91YmxlKCkpOwotICAgIGFzc2VydEVxdWFscygxRCwgYnVpbGRlci5nZXRPcHRpb25hbERvdWJsZSgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMUQsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsRG91YmxlKCkpOwotICAgIGFzc2VydEVxdWFscygwRCwgbWVzc2FnZS5nZXRPcHRpb25hbERvdWJsZSgpKTsKLSAgICBidWlsZGVyLmNsZWFyT3B0aW9uYWxEb3VibGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoMEQsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxEb3VibGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFELCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbERvdWJsZSgpKTsKLSAgICAKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGaXhlZDMyKDEpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlci5nZXRPcHRpb25hbEZpeGVkMzIoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsRml4ZWQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkMzIoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsRml4ZWQzMigpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldE9wdGlvbmFsRml4ZWQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxGaXhlZDMyKCkpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEZpeGVkNjQoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGaXhlZDY0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxTCwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxGaXhlZDY0KCkpOwotICAgIGFzc2VydEVxdWFscygwTCwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkNjQoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsRml4ZWQ2NCgpOwotICAgIGFzc2VydEVxdWFscygwTCwgYnVpbGRlci5nZXRPcHRpb25hbEZpeGVkNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEZpeGVkNjQoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGbG9hdCgxKTsKLSAgICBhc3NlcnRFcXVhbHMoMEYsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGbG9hdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUYsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGbG9hdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMUYsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsRmxvYXQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBGLCBtZXNzYWdlLmdldE9wdGlvbmFsRmxvYXQoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsRmxvYXQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMEYsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGbG9hdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUYsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsRmxvYXQoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGb3JlaWduRW51bShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTywgbWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25FbnVtKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEZvcmVpZ25FbnVtKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBidWlsZGVyLmNsZWFyT3B0aW9uYWxGb3JlaWduRW51bSgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08sIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEZvcmVpZ25FbnVtKCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBGb3JlaWduTWVzc2FnZUxpdGUgZm9yZWlnbk1lc3NhZ2UgPSBGb3JlaWduTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRDKDEpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShmb3JlaWduTWVzc2FnZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBGb3JlaWduTWVzc2FnZUxpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9yZWlnbk1lc3NhZ2UsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9yZWlnbk1lc3NhZ2UsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBGb3JlaWduTWVzc2FnZUxpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpKTsKLSAgICBidWlsZGVyLmNsZWFyT3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICBidWlsZGVyLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZvcmVpZ25NZXNzYWdlLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBGb3JlaWduTWVzc2FnZUxpdGUuQnVpbGRlciBmb3JlaWduTWVzc2FnZUJ1aWxkZXIgPQotICAgICAgICBGb3JlaWduTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0QygzKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoZm9yZWlnbk1lc3NhZ2VCdWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgbWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOwotICAgIGFzc2VydEVxdWFscyhmb3JlaWduTWVzc2FnZUJ1aWxkZXIuYnVpbGQoKSwgYnVpbGRlci5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhmb3JlaWduTWVzc2FnZUJ1aWxkZXIuYnVpbGQoKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgbWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBGb3JlaWduTWVzc2FnZUxpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9yZWlnbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkKCksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIE9wdGlvbmFsR3JvdXAgb3B0aW9uYWxHcm91cCA9IE9wdGlvbmFsR3JvdXAubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRBKDEpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxHcm91cChvcHRpb25hbEdyb3VwKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIE9wdGlvbmFsR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCgpKTsKLSAgICBhc3NlcnRFcXVhbHMob3B0aW9uYWxHcm91cCwgYnVpbGRlci5nZXRPcHRpb25hbEdyb3VwKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhvcHRpb25hbEdyb3VwLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEdyb3VwKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgT3B0aW9uYWxHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSwgbWVzc2FnZS5nZXRPcHRpb25hbEdyb3VwKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbEdyb3VwKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBPcHRpb25hbEdyb3VwLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE9wdGlvbmFsR3JvdXAoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG9wdGlvbmFsR3JvdXAsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsR3JvdXAoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIE9wdGlvbmFsR3JvdXAuQnVpbGRlciBvcHRpb25hbEdyb3VwQnVpbGRlciA9IE9wdGlvbmFsR3JvdXAubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRBKDMpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxHcm91cChvcHRpb25hbEdyb3VwQnVpbGRlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBPcHRpb25hbEdyb3VwLmdldERlZmF1bHRJbnN0YW5jZSgpLCBtZXNzYWdlLmdldE9wdGlvbmFsR3JvdXAoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG9wdGlvbmFsR3JvdXBCdWlsZGVyLmJ1aWxkKCksIGJ1aWxkZXIuZ2V0T3B0aW9uYWxHcm91cCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMob3B0aW9uYWxHcm91cEJ1aWxkZXIuYnVpbGQoKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxHcm91cCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIE9wdGlvbmFsR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCgpKTsKLSAgICBidWlsZGVyLmNsZWFyT3B0aW9uYWxHcm91cCgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgT3B0aW9uYWxHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRPcHRpb25hbEdyb3VwKCkpOwotICAgIGFzc2VydEVxdWFscyhvcHRpb25hbEdyb3VwQnVpbGRlci5idWlsZCgpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEdyb3VwKCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlci5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsSW50MzIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEludDMyKCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW50NjQoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50NjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBidWlsZGVyLmdldE9wdGlvbmFsSW50NjQoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEludDY0KCkpOwotICAgIGFzc2VydEVxdWFscygwTCwgbWVzc2FnZS5nZXRPcHRpb25hbEludDY0KCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbEludDY0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBidWlsZGVyLmdldE9wdGlvbmFsSW50NjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbEludDY0KCkpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgTmVzdGVkTWVzc2FnZSBuZXN0ZWRNZXNzYWdlID0gTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEJiKDEpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxMYXp5TWVzc2FnZShuZXN0ZWRNZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIE5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIG1lc3NhZ2UuZ2V0T3B0aW9uYWxMYXp5TWVzc2FnZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobmVzdGVkTWVzc2FnZSwgYnVpbGRlci5nZXRPcHRpb25hbExhenlNZXNzYWdlKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhuZXN0ZWRNZXNzYWdlLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbExhenlNZXNzYWdlKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgbWVzc2FnZS5nZXRPcHRpb25hbExhenlNZXNzYWdlKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbExhenlNZXNzYWdlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBOZXN0ZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5lc3RlZE1lc3NhZ2UsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIE5lc3RlZE1lc3NhZ2UuQnVpbGRlciBuZXN0ZWRNZXNzYWdlQnVpbGRlciA9Ci0gICAgICAgIE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0QmIoMyk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbExhenlNZXNzYWdlKG5lc3RlZE1lc3NhZ2VCdWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIE5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIG1lc3NhZ2UuZ2V0T3B0aW9uYWxMYXp5TWVzc2FnZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobmVzdGVkTWVzc2FnZUJ1aWxkZXIuYnVpbGQoKSwgYnVpbGRlci5nZXRPcHRpb25hbExhenlNZXNzYWdlKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhuZXN0ZWRNZXNzYWdlQnVpbGRlci5idWlsZCgpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbExhenlNZXNzYWdlKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgbWVzc2FnZS5nZXRPcHRpb25hbExhenlNZXNzYWdlKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbExhenlNZXNzYWdlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBOZXN0ZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5lc3RlZE1lc3NhZ2VCdWlsZGVyLmJ1aWxkKCksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTZml4ZWQzMigxKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbFNmaXhlZDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9wdGlvbmFsU2ZpeGVkMzIoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsU2ZpeGVkMzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQzMigpKTsKLSAgICBidWlsZGVyLmNsZWFyT3B0aW9uYWxTZml4ZWQzMigpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldE9wdGlvbmFsU2ZpeGVkMzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsU2ZpeGVkMzIoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTZml4ZWQ2NCgxKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsU2ZpeGVkNjQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTaW50MzIoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTaW50MzIoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsU2ludDMyKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbFNpbnQzMigpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldE9wdGlvbmFsU2ludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbFNpbnQzMigpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbFNpbnQ2NCgxKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50NjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBidWlsZGVyLmdldE9wdGlvbmFsU2ludDY0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxTCwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxTaW50NjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ludDY0KCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbFNpbnQ2NCgpOwotICAgIGFzc2VydEVxdWFscygwTCwgYnVpbGRlci5nZXRPcHRpb25hbFNpbnQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsU2ludDY0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU3RyaW5nKCJoaSIpOwotICAgIGFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbFN0cmluZygpOwotICAgIGFzc2VydEVxdWFscygiIiwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTdHJpbmdCeXRlcyhCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgibm8iKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmdCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJubyIpLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nQnl0ZXMoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgibm8iKSwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxTdHJpbmdCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZ0J5dGVzKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbFN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nQnl0ZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgibm8iKSwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxTdHJpbmdCeXRlcygpKTsKLSAgICAKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTdHJpbmdQaWVjZSgiaGkiKTsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmdQaWVjZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZ1BpZWNlKCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygiaGkiLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbFN0cmluZ1BpZWNlKCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZ1BpZWNlKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbFN0cmluZ1BpZWNlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIiLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nUGllY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoaSIsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsU3RyaW5nUGllY2UoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTdHJpbmdQaWVjZUJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJubyIpKTsKLSAgICBhc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZ1BpZWNlQnl0ZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgibm8iKSwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZ1BpZWNlQnl0ZXMoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgibm8iKSwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxTdHJpbmdQaWVjZUJ5dGVzKCkpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nUGllY2VCeXRlcygpKTsKLSAgICBidWlsZGVyLmNsZWFyT3B0aW9uYWxTdHJpbmdQaWVjZSgpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nUGllY2VCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJubyIpLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbFN0cmluZ1BpZWNlQnl0ZXMoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxVaW50MzIoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxVaW50MzIoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsVWludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDMyKCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbFVpbnQzMigpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldE9wdGlvbmFsVWludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPcHRpb25hbFVpbnQzMigpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbFVpbnQ2NCgxKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50NjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBidWlsZGVyLmdldE9wdGlvbmFsVWludDY0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxTCwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T3B0aW9uYWxVaW50NjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDY0KCkpOwotICAgIGJ1aWxkZXIuY2xlYXJPcHRpb25hbFVpbnQ2NCgpOwotICAgIGFzc2VydEVxdWFscygwTCwgYnVpbGRlci5nZXRPcHRpb25hbFVpbnQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9wdGlvbmFsVWludDY0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkQm9vbChzaW5nbGV0b25MaXN0KHRydWUpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCh0cnVlKSwgYnVpbGRlci5nZXRSZXBlYXRlZEJvb2xMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2xMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEJvb2woKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRCb29sTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCh0cnVlKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRCb29sTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEJ5dGVzKHNpbmdsZXRvbkxpc3QoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIikpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlc0xpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJoaSIpKSwKLSAgICAgICAgYnVpbGRlci5nZXRSZXBlYXRlZEJ5dGVzTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlc0xpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkQnl0ZXMoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRCeXRlc0xpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJoaSIpKSwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRCeXRlc0xpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRDb3JkKHNpbmdsZXRvbkxpc3QoImhpIikpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KCJoaSIpLCBidWlsZGVyLmdldFJlcGVhdGVkQ29yZExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZExpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkQ29yZCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZENvcmRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KCJoaSIpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZENvcmRMaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRG91YmxlKHNpbmdsZXRvbkxpc3QoMUQpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGVMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDFEKSwgYnVpbGRlci5nZXRSZXBlYXRlZERvdWJsZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWREb3VibGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWREb3VibGVMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDFEKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWREb3VibGVMaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRml4ZWQzMihzaW5nbGV0b25MaXN0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZpeGVkMzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzJMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEZpeGVkMzIoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaXhlZDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRGaXhlZDMyTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZpeGVkNjQoc2luZ2xldG9uTGlzdCgxTCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDFMKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZpeGVkNjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjRMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEZpeGVkNjQoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaXhlZDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxTCksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkRml4ZWQ2NExpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRGbG9hdChzaW5nbGV0b25MaXN0KDFGKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDFGKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZsb2F0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdExpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkRmxvYXQoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGbG9hdExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUYpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEZsb2F0TGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25FbnVtKAotICAgICAgICBzaW5nbGV0b25MaXN0KEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgc2luZ2xldG9uTGlzdChGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiksCi0gICAgICAgIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEZvcmVpZ25FbnVtKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgc2luZ2xldG9uTGlzdChGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiksCi0gICAgICAgIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2Uoc2luZ2xldG9uTGlzdChmb3JlaWduTWVzc2FnZSkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoZm9yZWlnbk1lc3NhZ2UpLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoZm9yZWlnbk1lc3NhZ2UpLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEdyb3VwKAotICAgICAgICBzaW5nbGV0b25MaXN0KFJlcGVhdGVkR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KFJlcGVhdGVkR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAotICAgICAgICBidWlsZGVyLmdldFJlcGVhdGVkR3JvdXBMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRHcm91cCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEdyb3VwTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoUmVwZWF0ZWRHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSksCi0gICAgICAgIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkR3JvdXBMaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkSW50MzIoc2luZ2xldG9uTGlzdCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBidWlsZGVyLmdldFJlcGVhdGVkSW50MzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRJbnQzMigpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRJbnQzMkxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRJbnQ2NChzaW5nbGV0b25MaXN0KDFMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDFMKSwgYnVpbGRlci5nZXRSZXBlYXRlZEludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQ2NExpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkSW50NjQoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbnQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEludDY0TGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZExhenlNZXNzYWdlKHNpbmdsZXRvbkxpc3QobmVzdGVkTWVzc2FnZSkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QobmVzdGVkTWVzc2FnZSksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZExhenlNZXNzYWdlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgc2luZ2xldG9uTGlzdChuZXN0ZWRNZXNzYWdlKSwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZUxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRTZml4ZWQzMihzaW5nbGV0b25MaXN0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMSksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTZml4ZWQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzJMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFNmaXhlZDMyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ZpeGVkMzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFNmaXhlZDMyTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZFNmaXhlZDY0KHNpbmdsZXRvbkxpc3QoMUwpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ZpeGVkNjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTZml4ZWQ2NCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoMUwpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZFNpbnQzMihzaW5nbGV0b25MaXN0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzJMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFNpbnQzMigpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFNpbnQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMSksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkU2ludDMyTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZFNpbnQ2NChzaW5nbGV0b25MaXN0KDFMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxTCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTaW50NjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQ2NExpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkU2ludDY0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxTCksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkU2ludDY0TGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZFN0cmluZyhzaW5nbGV0b25MaXN0KCJoaSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KCJoaSIpLCBidWlsZGVyLmdldFJlcGVhdGVkU3RyaW5nTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFN0cmluZ0xpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KCJoaSIpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFN0cmluZ0xpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRTdHJpbmdQaWVjZShzaW5nbGV0b25MaXN0KCJoaSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoImhpIiksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFN0cmluZ1BpZWNlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgc2luZ2xldG9uTGlzdCgiaGkiKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRVaW50MzIoc2luZ2xldG9uTGlzdCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxKSwgYnVpbGRlci5nZXRSZXBlYXRlZFVpbnQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRVaW50MzIoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRVaW50MzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFVpbnQzMkxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRVaW50NjQoc2luZ2xldG9uTGlzdCgxTCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBidWlsZGVyLmdldFJlcGVhdGVkVWludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjRMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFVpbnQ2NCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCb29sKHRydWUpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2xMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KHRydWUpLCBidWlsZGVyLmdldFJlcGVhdGVkQm9vbExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbExpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkQm9vbCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEJvb2xMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KHRydWUpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEJvb2xMaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkQnl0ZXMoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIikpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIikpLAotICAgICAgICBidWlsZGVyLmdldFJlcGVhdGVkQnl0ZXNMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRCeXRlcygpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEJ5dGVzTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIikpLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEJ5dGVzTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZENvcmQoImhpIik7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoImhpIiksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRDb3JkTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRDb3JkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkQ29yZExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoImhpIiksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkQ29yZExpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWREb3VibGUoMUQpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUQpLCBidWlsZGVyLmdldFJlcGVhdGVkRG91YmxlTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGVMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZERvdWJsZSgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZERvdWJsZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUQpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZERvdWJsZUxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaXhlZDMyKDEpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBidWlsZGVyLmdldFJlcGVhdGVkRml4ZWQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQzMkxpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkRml4ZWQzMigpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZpeGVkMzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEZpeGVkMzJMaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRml4ZWQ2NCgxTCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBidWlsZGVyLmdldFJlcGVhdGVkRml4ZWQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NExpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkRml4ZWQ2NCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZpeGVkNjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDFMKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRGaXhlZDY0TGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZsb2F0KDFGKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUYpLCBidWlsZGVyLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0TGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRGbG9hdCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZsb2F0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxRiksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbkVudW0oRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIpLAotICAgICAgICBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRGb3JlaWduRW51bSgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIpLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKGZvcmVpZ25NZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KGZvcmVpZ25NZXNzYWdlKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5yZW1vdmVSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoZm9yZWlnbk1lc3NhZ2UpLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEdyb3VwKFJlcGVhdGVkR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoUmVwZWF0ZWRHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSksCi0gICAgICAgIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRHcm91cExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXBMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIucmVtb3ZlUmVwZWF0ZWRHcm91cCgwKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRHcm91cExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KFJlcGVhdGVkR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAotICAgICAgICBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEdyb3VwTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDEpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxKSwgYnVpbGRlci5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMkxpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkSW50MzIoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbnQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMSksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkSW50MzJMaXN0KCkpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50NjQoMUwpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxTCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbnQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjRMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEludDY0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkSW50NjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDFMKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRJbnQ2NExpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRMYXp5TWVzc2FnZShuZXN0ZWRNZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KG5lc3RlZE1lc3NhZ2UpLCBidWlsZGVyLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLnJlbW92ZVJlcGVhdGVkTGF6eU1lc3NhZ2UoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgc2luZ2xldG9uTGlzdChuZXN0ZWRNZXNzYWdlKSwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZUxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTZml4ZWQzMigxKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMSksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTZml4ZWQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzJMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFNmaXhlZDMyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ZpeGVkMzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFNmaXhlZDMyTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNmaXhlZDY0KDFMKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ZpeGVkNjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTZml4ZWQ2NCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHNpbmdsZXRvbkxpc3QoMUwpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNpbnQzMigxKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzJMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFNpbnQzMigpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFNpbnQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMSksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkU2ludDMyTGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNpbnQ2NCgxTCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxTCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTaW50NjRMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQ2NExpc3QoKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkU2ludDY0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkU2ludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxTCksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkU2ludDY0TGlzdCgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygiaGkiKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KCJoaSIpLCBidWlsZGVyLmdldFJlcGVhdGVkU3RyaW5nTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFN0cmluZ0xpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBzaW5nbGV0b25MaXN0KCJoaSIpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFN0cmluZ0xpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTdHJpbmdQaWVjZSgiaGkiKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoImhpIiksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFN0cmluZ1BpZWNlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBidWlsZGVyLmdldFJlcGVhdGVkU3RyaW5nUGllY2VMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgc2luZ2xldG9uTGlzdCgiaGkiKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRVaW50MzIoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2luZ2xldG9uTGlzdCgxKSwgYnVpbGRlci5nZXRSZXBlYXRlZFVpbnQzMkxpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TGlzdCgpLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyTGlzdCgpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRVaW50MzIoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRVaW50MzJMaXN0KCkpOwotICAgIGFzc2VydEVxdWFscyhzaW5nbGV0b25MaXN0KDEpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFVpbnQzMkxpc3QoKSk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRVaW50NjQoMUwpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBidWlsZGVyLmdldFJlcGVhdGVkVWludDY0TGlzdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlMaXN0KCksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjRMaXN0KCkpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZFVpbnQ2NCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eUxpc3QoKSwgYnVpbGRlci5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbmdsZXRvbkxpc3QoMUwpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSk7Ci0gICAgCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkQm9vbCh0cnVlKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2xDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkQm9vbCgwLCBmYWxzZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkQm9vbCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBidWlsZGVyLmdldFJlcGVhdGVkQm9vbCgwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkQm9vbCgpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJoaSIpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZEJ5dGVzKDAsIEJ5dGVTdHJpbmcuRU1QVFkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIiksIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkQnl0ZXMoMCkpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBidWlsZGVyLmdldFJlcGVhdGVkQnl0ZXMoMCkpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEJ5dGVzKCk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRDb3JkKCJoaSIpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRDb3JkKDAsICIiKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRDb3JkKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRDb3JkKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRDb3JkKCk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRDb3JkQnl0ZXMoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIikpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRDb3JkKDAsICIiKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJoaSIpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZENvcmRCeXRlcygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRDb3JkQnl0ZXMoMCkpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZENvcmQoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZERvdWJsZSgxRCk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGVDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkRG91YmxlKDAsIDBEKTsKLSAgICBhc3NlcnRFcXVhbHMoMUQsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkRG91YmxlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMEQsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWREb3VibGUoMCkpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZERvdWJsZSgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRml4ZWQzMigxKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzJDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkRml4ZWQzMigwLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRGaXhlZDMyKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRSZXBlYXRlZEZpeGVkMzIoMCkpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEZpeGVkMzIoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpeGVkNjQoMUwpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NENvdW50KCkpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaXhlZDY0KDAsIDBMKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkRml4ZWQ2NCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBidWlsZGVyLmdldFJlcGVhdGVkRml4ZWQ2NCgwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkRml4ZWQ2NCgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmxvYXQoMUYpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXRDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkRmxvYXQoMCwgMEYpOwotICAgIGFzc2VydEVxdWFscygxRiwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRGbG9hdCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBGLCBidWlsZGVyLmdldFJlcGVhdGVkRmxvYXQoMCkpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEZsb2F0KCk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduRW51bShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUik7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bUNvdW50KCkpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGb3JlaWduRW51bSgwLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTyk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTywgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRGb3JlaWduRW51bSgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoZm9yZWlnbk1lc3NhZ2UpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCi0gICAgICAgIDAsIEZvcmVpZ25NZXNzYWdlTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBmb3JlaWduTWVzc2FnZSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBGb3JlaWduTWVzc2FnZUxpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoKTsKLSAgICAKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShmb3JlaWduTWVzc2FnZUJ1aWxkZXIpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCi0gICAgICAgIDAsIEZvcmVpZ25NZXNzYWdlTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZvcmVpZ25NZXNzYWdlQnVpbGRlci5idWlsZCgpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCwgZm9yZWlnbk1lc3NhZ2UpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCwgZm9yZWlnbk1lc3NhZ2VCdWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIGZvcmVpZ25NZXNzYWdlLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9yZWlnbk1lc3NhZ2VCdWlsZGVyLmJ1aWxkKCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgUmVwZWF0ZWRHcm91cCByZXBlYXRlZEdyb3VwID0gUmVwZWF0ZWRHcm91cC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEEoMSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEdyb3VwKHJlcGVhdGVkR3JvdXApOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkR3JvdXAoMCwgUmVwZWF0ZWRHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlcGVhdGVkR3JvdXAsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkR3JvdXAoMCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgUmVwZWF0ZWRHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEdyb3VwKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRHcm91cCgpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEdyb3VwKDAsIHJlcGVhdGVkR3JvdXApOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkR3JvdXAoMCwgUmVwZWF0ZWRHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlcGVhdGVkR3JvdXAsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkR3JvdXAoMCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgUmVwZWF0ZWRHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRSZXBlYXRlZEdyb3VwKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRHcm91cCgpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgUmVwZWF0ZWRHcm91cC5CdWlsZGVyIHJlcGVhdGVkR3JvdXBCdWlsZGVyID0gUmVwZWF0ZWRHcm91cC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEEoMyk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEdyb3VwKHJlcGVhdGVkR3JvdXBCdWlsZGVyKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZEdyb3VwKDAsIFJlcGVhdGVkR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGFzc2VydEVxdWFscyhyZXBlYXRlZEdyb3VwQnVpbGRlci5idWlsZCgpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEdyb3VwKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIFJlcGVhdGVkR3JvdXAuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRHcm91cCgwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkR3JvdXAoKTsKLSAgICAKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRHcm91cCgwLCByZXBlYXRlZEdyb3VwQnVpbGRlcik7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cENvdW50KCkpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRHcm91cCgwLCBSZXBlYXRlZEdyb3VwLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMocmVwZWF0ZWRHcm91cEJ1aWxkZXIuYnVpbGQoKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRHcm91cCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBSZXBlYXRlZEdyb3VwLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldFJlcGVhdGVkR3JvdXAoMCkpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZEdyb3VwKCk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigxKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZEludDMyKDAsIDApOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZEludDMyKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRSZXBlYXRlZEludDMyKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRJbnQzMigpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50NjQoMUwpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwTCwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0Q291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZEludDY0KDAsIDBMKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkSW50NjQoMCkpOwotICAgIGFzc2VydEVxdWFscygwTCwgYnVpbGRlci5nZXRSZXBlYXRlZEludDY0KDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRJbnQ2NCgpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZExhenlNZXNzYWdlKG5lc3RlZE1lc3NhZ2UpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkTGF6eU1lc3NhZ2UoMCwgTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5lc3RlZE1lc3NhZ2UsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2UoMCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRSZXBlYXRlZExhenlNZXNzYWdlKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRMYXp5TWVzc2FnZSgpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZExhenlNZXNzYWdlKDAsIG5lc3RlZE1lc3NhZ2UpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkTGF6eU1lc3NhZ2UoMCwgTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5lc3RlZE1lc3NhZ2UsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2UoMCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRSZXBlYXRlZExhenlNZXNzYWdlKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRMYXp5TWVzc2FnZSgpOwotICAgIAotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZExhenlNZXNzYWdlKG5lc3RlZE1lc3NhZ2VCdWlsZGVyKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZExhenlNZXNzYWdlKDAsIE5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGFzc2VydEVxdWFscyhuZXN0ZWRNZXNzYWdlQnVpbGRlci5idWlsZCgpLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZExhenlNZXNzYWdlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIE5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZSgwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkTGF6eU1lc3NhZ2UoKTsKLSAgICAKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRMYXp5TWVzc2FnZSgwLCBuZXN0ZWRNZXNzYWdlQnVpbGRlcik7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZUNvdW50KCkpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRMYXp5TWVzc2FnZSgwLCBOZXN0ZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobmVzdGVkTWVzc2FnZUJ1aWxkZXIuYnVpbGQoKSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBOZXN0ZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2UoMCkpOwotICAgIGJ1aWxkZXIuY2xlYXJSZXBlYXRlZExhenlNZXNzYWdlKCk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTZml4ZWQzMigxKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDMyQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZFNmaXhlZDMyKDAsIDApOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFNmaXhlZDMyKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRSZXBlYXRlZFNmaXhlZDMyKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTZml4ZWQzMigpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ZpeGVkNjQoMUwpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwTCwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0Q291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZFNmaXhlZDY0KDAsIDBMKTsKLSAgICBhc3NlcnRFcXVhbHMoMUwsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkU2ZpeGVkNjQoMCkpOwotICAgIGFzc2VydEVxdWFscygwTCwgYnVpbGRlci5nZXRSZXBlYXRlZFNmaXhlZDY0KDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTZml4ZWQ2NCgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ludDMyKDEpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZFNpbnQzMigwLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRTaW50MzIoMCkpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldFJlcGVhdGVkU2ludDMyKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTaW50MzIoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNpbnQ2NCgxTCk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0Q291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZFNpbnQ2NCgwLCAwTCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFNpbnQ2NCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBidWlsZGVyLmdldFJlcGVhdGVkU2ludDY0KDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTaW50NjQoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygiaGkiKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkU3RyaW5nKDAsICIiKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRTdHJpbmcoMCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgYnVpbGRlci5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkU3RyaW5nKCk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTdHJpbmdCeXRlcyhCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiaGkiKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZFN0cmluZygwLCAiIik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiaGkiKSwKLSAgICAgICAgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTdHJpbmdCeXRlcygwKSk7Ci0gICAgYnVpbGRlci5jbGVhclJlcGVhdGVkU3RyaW5nKCk7Ci0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTdHJpbmdQaWVjZSgiaGkiKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50KCkpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRTdHJpbmdQaWVjZSgwLCAiIik7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoaSIsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkU3RyaW5nUGllY2UoMCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgYnVpbGRlci5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTdHJpbmdQaWVjZSgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU3RyaW5nUGllY2VCeXRlcyhCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiaGkiKSk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2VDb3VudCgpKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkU3RyaW5nUGllY2UoMCwgIiIpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImhpIiksCi0gICAgICAgIG1lc3NhZ2VBZnRlckJ1aWxkLmdldFJlcGVhdGVkU3RyaW5nUGllY2VCeXRlcygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUJ5dGVzKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRTdHJpbmdQaWVjZSgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkVWludDMyKDEpOwotICAgIG1lc3NhZ2VBZnRlckJ1aWxkID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyQ291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZFVpbnQzMigwLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0UmVwZWF0ZWRVaW50MzIoMCkpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldFJlcGVhdGVkVWludDMyKDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRVaW50MzIoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFVpbnQ2NCgxTCk7Ci0gICAgbWVzc2FnZUFmdGVyQnVpbGQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDY0Q291bnQoKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZFVpbnQ2NCgwLCAwTCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDFMLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRSZXBlYXRlZFVpbnQ2NCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDBMLCBidWlsZGVyLmdldFJlcGVhdGVkVWludDY0KDApKTsKLSAgICBidWlsZGVyLmNsZWFyUmVwZWF0ZWRVaW50NjQoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsQm9vbCh0cnVlKQotICAgICAgICAuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ1aWxkZXIuYnVpbGQoKS5nZXRPcHRpb25hbEJvb2woKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsQm9vbCgpOwotCi0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxCb29sKHRydWUpCi0gICAgICAgIC5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYnVpbGRlci5idWlsZCgpLmdldE9wdGlvbmFsQm9vbCgpKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuYnVpbGQoKS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYnVpbGRlci5tZXJnZU9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoZm9yZWlnbk1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgZm9yZWlnbk1lc3NhZ2UuZ2V0QygpLAotICAgICAgICBidWlsZGVyLmJ1aWxkKCkuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKTsKLQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYnVpbGRlci5tZXJnZU9wdGlvbmFsTGF6eU1lc3NhZ2UobmVzdGVkTWVzc2FnZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBuZXN0ZWRNZXNzYWdlLmdldEJiKCksCi0gICAgICAgIGJ1aWxkZXIuYnVpbGQoKS5nZXRPcHRpb25hbExhenlNZXNzYWdlKCkuZ2V0QmIoKSk7Ci0gICAgYnVpbGRlci5jbGVhck9wdGlvbmFsTGF6eU1lc3NhZ2UoKTsKLSAgICAKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuc2V0T25lb2ZTdHJpbmcoImhpIik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBPbmVvZkZpZWxkQ2FzZS5PTkVPRkZJRUxEX05PVF9TRVQsIG1lc3NhZ2UuZ2V0T25lb2ZGaWVsZENhc2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKE9uZW9mRmllbGRDYXNlLk9ORU9GX1NUUklORywgYnVpbGRlci5nZXRPbmVvZkZpZWxkQ2FzZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhpIiwgYnVpbGRlci5nZXRPbmVvZlN0cmluZygpKTsKLSAgICBtZXNzYWdlQWZ0ZXJCdWlsZCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIE9uZW9mRmllbGRDYXNlLk9ORU9GX1NUUklORywgbWVzc2FnZUFmdGVyQnVpbGQuZ2V0T25lb2ZGaWVsZENhc2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoaSIsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9uZW9mU3RyaW5nKCkpOwotICAgIGJ1aWxkZXIuc2V0T25lb2ZVaW50MzIoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBPbmVvZkZpZWxkQ2FzZS5PTkVPRl9TVFJJTkcsIG1lc3NhZ2VBZnRlckJ1aWxkLmdldE9uZW9mRmllbGRDYXNlKCkpOwotICAgIGFzc2VydEVxdWFscygiaGkiLCBtZXNzYWdlQWZ0ZXJCdWlsZC5nZXRPbmVvZlN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoT25lb2ZGaWVsZENhc2UuT05FT0ZfVUlOVDMyLCBidWlsZGVyLmdldE9uZW9mRmllbGRDYXNlKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9uZW9mVWludDMyKCkpOwotICAgIFRlc3RBbGxUeXBlc0xpdGVPckJ1aWxkZXIgbWVzc2FnZU9yQnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgYXNzZXJ0RXF1YWxzKE9uZW9mRmllbGRDYXNlLk9ORU9GX1VJTlQzMiwgbWVzc2FnZU9yQnVpbGRlci5nZXRPbmVvZkZpZWxkQ2FzZSgpKTsKLSAgICAKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBleHRlbmRhYmxlTWVzc2FnZUJ1aWxkZXIgPQotICAgICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBleHRlbmRhYmxlTWVzc2FnZSA9IGV4dGVuZGFibGVNZXNzYWdlQnVpbGRlci5idWlsZCgpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlQnVpbGRlci5zZXRFeHRlbnNpb24oCi0gICAgICAgIFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSwgMSk7Ci0gICAgYXNzZXJ0RmFsc2UoZXh0ZW5kYWJsZU1lc3NhZ2UuaGFzRXh0ZW5zaW9uKAotICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBleHRlbmRhYmxlTWVzc2FnZSA9IGV4dGVuZGFibGVNZXNzYWdlQnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgMSwgKGludCkgZXh0ZW5kYWJsZU1lc3NhZ2VCdWlsZGVyLmdldEV4dGVuc2lvbigKLSAgICAgICAgICAgIFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgMSwgKGludCkgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2VCdWlsZGVyLnNldEV4dGVuc2lvbigKLSAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlLCAzKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDMsIChpbnQpIGV4dGVuZGFibGVNZXNzYWdlQnVpbGRlci5nZXRFeHRlbnNpb24oCi0gICAgICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDEsIChpbnQpIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbigKLSAgICAgICAgICAgIFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlID0gZXh0ZW5kYWJsZU1lc3NhZ2VCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAzLCAoaW50KSBleHRlbmRhYmxlTWVzc2FnZUJ1aWxkZXIuZ2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAzLCAoaW50KSBleHRlbmRhYmxlTWVzc2FnZS5nZXRFeHRlbnNpb24oCi0gICAgICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICAKLSAgICAvLyBObyBleHRlbnNpb24gcmVnaXN0cnksIHNvIGl0IHNob3VsZCBiZSBpbiB1bmtub3duIGZpZWxkcy4KLSAgICBleHRlbmRhYmxlTWVzc2FnZSA9Ci0gICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5wYXJzZUZyb20oZXh0ZW5kYWJsZU1lc3NhZ2UudG9CeXRlQXJyYXkoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoZXh0ZW5kYWJsZU1lc3NhZ2UuaGFzRXh0ZW5zaW9uKAotICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICAKLSAgICBleHRlbmRhYmxlTWVzc2FnZUJ1aWxkZXIgPSBleHRlbmRhYmxlTWVzc2FnZS50b0J1aWxkZXIoKTsKLSAgICBleHRlbmRhYmxlTWVzc2FnZUJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMTEpCi0gICAgICAgIC5idWlsZCgpKTsKLSAgICAKLSAgICBleHRlbmRhYmxlTWVzc2FnZSA9IGV4dGVuZGFibGVNZXNzYWdlQnVpbGRlci5idWlsZCgpOwotICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5uZXdJbnN0YW5jZSgpOwotICAgIFVuaXR0ZXN0TGl0ZS5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLnBhcnNlRnJvbSgKLSAgICAgICAgZXh0ZW5kYWJsZU1lc3NhZ2UudG9CeXRlQXJyYXkoKSwgcmVnaXN0cnkpOwotICAgIAotICAgIC8vIFRoZSB1bmtub3duIGZpZWxkIHdhcyBwcmVzZXJ2ZWQuCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAzLCAoaW50KSBleHRlbmRhYmxlTWVzc2FnZS5nZXRFeHRlbnNpb24oCi0gICAgICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDExLCAoaW50KSBleHRlbmRhYmxlTWVzc2FnZS5nZXRFeHRlbnNpb24oCi0gICAgICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nRGVmYXVsdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0VG9TdHJpbmdFcXVhbHMoIiIsIFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nUHJpbWl0aXZlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc0xpdGUgcHJvdG8gPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxKQotICAgICAgICAuc2V0T3B0aW9uYWxJbnQ2NCg5MjIzMzcyMDM2ODU0Nzc1ODA3TCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VG9TdHJpbmdFcXVhbHMoIm9wdGlvbmFsX2ludDMyOiAxXG5vcHRpb25hbF9pbnQ2NDogOTIyMzM3MjAzNjg1NDc3NTgwNyIsIHByb3RvKTsKLQotICAgIHByb3RvID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsQm9vbCh0cnVlKQotICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVopCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydFRvU3RyaW5nRXF1YWxzKCJvcHRpb25hbF9ib29sOiB0cnVlXG5vcHRpb25hbF9uZXN0ZWRfZW51bTogQkFaIiwgcHJvdG8pOwotCi0gICAgcHJvdG8gPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxGbG9hdCgyLjcyZikKLSAgICAgICAgLnNldE9wdGlvbmFsRG91YmxlKDMuMTQpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydFRvU3RyaW5nRXF1YWxzKCJvcHRpb25hbF9kb3VibGU6IDMuMTRcbm9wdGlvbmFsX2Zsb2F0OiAyLjcyIiwgcHJvdG8pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nU3RyaW5nRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZSBwcm90byA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiZm9vXCJiYXJcbmJhelxcIikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VG9TdHJpbmdFcXVhbHMoIm9wdGlvbmFsX3N0cmluZzogXCJmb29cXFwiYmFyXFxuYmF6XFxcXFwiIiwgcHJvdG8pOwotCi0gICAgcHJvdG8gPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoIlx1NjU4NyIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydFRvU3RyaW5nRXF1YWxzKCJvcHRpb25hbF9zdHJpbmc6IFwiXFwzNDZcXDIyNlxcMjA3XCIiLCBwcm90byk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdOZXN0ZWRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZSBwcm90byA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRUb1N0cmluZ0VxdWFscygib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uge1xufSIsIHByb3RvKTsKLQotICAgIHByb3RvID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNykpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydFRvU3RyaW5nRXF1YWxzKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7XG4gIGJiOiA3XG59IiwgcHJvdG8pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nUmVwZWF0ZWRGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNMaXRlIHByb3RvID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkSW50MzIoMzIpCi0gICAgICAgIC5hZGRSZXBlYXRlZEludDMyKDMyKQotICAgICAgICAuYWRkUmVwZWF0ZWRJbnQ2NCg2NCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VG9TdHJpbmdFcXVhbHMoInJlcGVhdGVkX2ludDMyOiAzMlxucmVwZWF0ZWRfaW50MzI6IDMyXG5yZXBlYXRlZF9pbnQ2NDogNjQiLCBwcm90byk7Ci0KLSAgICBwcm90byA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZExhenlNZXNzYWdlKAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig3KSkKLSAgICAgICAgLmFkZFJlcGVhdGVkTGF6eU1lc3NhZ2UoCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRUb1N0cmluZ0VxdWFscygKLSAgICAgICAgInJlcGVhdGVkX2xhenlfbWVzc2FnZSB7XG4gIGJiOiA3XG59XG5yZXBlYXRlZF9sYXp5X21lc3NhZ2Uge1xuICBiYjogOFxufSIsCi0gICAgICAgIHByb3RvKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ0ZvcmVpZ25GaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNMaXRlIHByb3RvID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbkVudW0oRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIpCi0gICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKAotICAgICAgICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldEMoMykpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydFRvU3RyaW5nRXF1YWxzKAotICAgICAgICAib3B0aW9uYWxfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0xJVEVfQkFSXG5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2Uge1xuICBjOiAzXG59IiwKLSAgICAgICAgcHJvdG8pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSwgMTIzKQotICAgICAgICAuYWRkRXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUsICJzcGFtIikKLSAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAiZWdncyIpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFaKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig3KS5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRUb1N0cmluZ0VxdWFscygKLSAgICAgICAgIlsxXTogMTIzXG5bMThdIHtcbiAgYmI6IDdcbn1cblsyMV06IDNcbls0NF06IFwic3BhbVwiXG5bNDRdOiBcImVnZ3NcIiIsCi0gICAgICAgIG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nVW5rbm93bkZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlV2l0aEV4dGVuc2lvbnMgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlLCAxMjMpCi0gICAgICAgIC5hZGRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSwgInNwYW0iKQotICAgICAgICAuYWRkRXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUsICJlZ2dzIikKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVopCi0gICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUsCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDcpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlV2l0aFVua25vd25GaWVsZHMgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUucGFyc2VGcm9tKAotICAgICAgICBtZXNzYWdlV2l0aEV4dGVuc2lvbnMudG9CeXRlQXJyYXkoKSk7Ci0gICAgYXNzZXJ0VG9TdHJpbmdFcXVhbHMoCi0gICAgICAgICIxOiAxMjNcbjE4OiBcIlxcYlxcYVwiXG4yMTogM1xuNDQ6IFwic3BhbVwiXG40NDogXCJlZ2dzXCIiLAotICAgICAgICBtZXNzYWdlV2l0aFVua25vd25GaWVsZHMpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdMYXp5TWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbExhenlNZXNzYWdlKE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDEpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydFRvU3RyaW5nRXF1YWxzKCJvcHRpb25hbF9sYXp5X21lc3NhZ2Uge1xuICBiYjogMVxufSIsIG1lc3NhZ2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdHcm91cCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbEdyb3VwKE9wdGlvbmFsR3JvdXAubmV3QnVpbGRlcigpLnNldEEoMSkuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VG9TdHJpbmdFcXVhbHMoIm9wdGlvbmFsX2dyb3VwIHtcbiAgYTogMVxufSIsIG1lc3NhZ2UpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdPbmVvZigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPbmVvZlN0cmluZygiaGVsbG8iKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRUb1N0cmluZ0VxdWFscygib25lb2Zfc3RyaW5nOiBcImhlbGxvXCIiLCBtZXNzYWdlKTsKLSAgfQotCi0gIC8vIEFzc2VydHMgdGhhdCB0aGUgdG9TdHJpbmcoKSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZSBtYXRjaGVzIHRoZSBleHBlY3RlZC4gVGhpcyB2ZXJpZmllcwotICAvLyB0aGUgZmlyc3QgbGluZSBzdGFydHMgd2l0aCBhIGNvbW1lbnQ7IGJ1dCwgZG9lcyBub3QgZmFjdG9yIGluIHNhaWQgY29tbWVudCBhcyBwYXJ0IG9mIHRoZQotICAvLyBjb21wYXJpc29uIGFzIGl0IGNvbnRhaW5zIHVuc3RhYmxlIGFkZHJlc3Nlcy4KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRUb1N0cmluZ0VxdWFscyhTdHJpbmcgZXhwZWN0ZWQsIE1lc3NhZ2VMaXRlIG1lc3NhZ2UpIHsKLSAgICBTdHJpbmcgdG9TdHJpbmcgPSBtZXNzYWdlLnRvU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCcjJywgdG9TdHJpbmcuY2hhckF0KDApKTsKLSAgICBpZiAodG9TdHJpbmcuaW5kZXhPZigiXG4iKSA+PSAwKSB7Ci0gICAgICB0b1N0cmluZyA9IHRvU3RyaW5nLnN1YnN0cmluZyh0b1N0cmluZy5pbmRleE9mKCJcbiIpICsgMSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRvU3RyaW5nID0gIiI7Ci0gICAgfQotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgdG9TdHJpbmcpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VMYXp5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQnl0ZVN0cmluZyBiYiA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbExhenlNZXNzYWdlKE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0QmIoMTEpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgQnl0ZVN0cmluZyBjYyA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbExhenlNZXNzYWdlKE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0Q2MoMjIpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgCi0gICAgQnl0ZVN0cmluZyBjb25jYXQgPSBiYi5jb25jYXQoY2MpOwotICAgIFRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSA9IFRlc3RBbGxUeXBlc0xpdGUucGFyc2VGcm9tKGNvbmNhdCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMTEsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxMYXp5TWVzc2FnZSgpLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFscygyMkwsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxMYXp5TWVzc2FnZSgpLmdldENjKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VMYXp5X29uZU9mKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQnl0ZVN0cmluZyBiYiA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPbmVvZkxhenlOZXN0ZWRNZXNzYWdlKE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0QmIoMTEpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgQnl0ZVN0cmluZyBjYyA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPbmVvZkxhenlOZXN0ZWRNZXNzYWdlKE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0Q2MoMjIpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgCi0gICAgQnl0ZVN0cmluZyBjb25jYXQgPSBiYi5jb25jYXQoY2MpOwotICAgIFRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSA9IFRlc3RBbGxUeXBlc0xpdGUucGFyc2VGcm9tKGNvbmNhdCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMTEsIG1lc3NhZ2UuZ2V0T25lb2ZMYXp5TmVzdGVkTWVzc2FnZSgpLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFscygyMkwsIG1lc3NhZ2UuZ2V0T25lb2ZMYXp5TmVzdGVkTWVzc2FnZSgpLmdldENjKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbVN0cmVhbV9yZXBlYXRlZEZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImhlbGxvIik7Ci0gICAgYnVpbGRlci5tZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShidWlsZGVyLmJ1aWxkKCkudG9CeXRlQXJyYXkoKSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb21TdHJlYW1faW52YWxpZEJ5dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdEJvb2wodHJ1ZSk7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoIkludmFsaWQgYnl0ZXMiLmdldEJ5dGVzKEludGVybmFsLlVURl84KSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleHBlY3RlZCkge30KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbV9zYW5pdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNMaXRlIG9uZSA9IFRlc3RVdGlsTGl0ZS5nZXRBbGxMaXRlU2V0QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gb25lLnRvQnl0ZUFycmF5KCk7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZSB0d28gPSBUZXN0QWxsVHlwZXNMaXRlLnBhcnNlRnJvbShieXRlcyk7Ci0gICAgCi0gICAgb25lID0gb25lLnRvQnVpbGRlcigpLm1lcmdlRnJvbShvbmUpLmJ1aWxkKCk7Ci0gICAgdHdvID0gdHdvLnRvQnVpbGRlcigpLm1lcmdlRnJvbShieXRlcykuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMob25lLCB0d28pOwotICAgIGFzc2VydEVxdWFscyh0d28sIG9uZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG9uZS5oYXNoQ29kZSgpLCB0d28uaGFzaENvZGUoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNfbm90RXF1YWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNMaXRlIG9uZSA9IFRlc3RVdGlsTGl0ZS5nZXRBbGxMaXRlU2V0QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gb25lLnRvQnl0ZUFycmF5KCk7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZSB0d28gPSBvbmUudG9CdWlsZGVyKCkubWVyZ2VGcm9tKG9uZSkubWVyZ2VGcm9tKGJ5dGVzKS5idWlsZCgpOwotICAgIAotICAgIGFzc2VydEZhbHNlKG9uZS5lcXVhbHModHdvKSk7Ci0gICAgYXNzZXJ0RmFsc2UodHdvLmVxdWFscyhvbmUpKTsKLSAgICAKLSAgICBhc3NlcnRGYWxzZShvbmUuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmUpKTsKLSAgICAKLSAgICBUZXN0QWxsVHlwZXNMaXRlIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldERlZmF1bHRCb29sKHRydWUpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0Qnl0ZXMoQnl0ZVN0cmluZy5FTVBUWSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldERlZmF1bHRDb3JkKCIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdENvcmRCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdERvdWJsZSgwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdEZpeGVkMzIoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldERlZmF1bHRGaXhlZDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0RmxvYXQoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldERlZmF1bHRGb3JlaWduRW51bShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldERlZmF1bHRJbXBvcnRFbnVtKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldERlZmF1bHRJbnQzMigwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdEludDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0TmVzdGVkRW51bShOZXN0ZWRFbnVtLkJBUikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldERlZmF1bHRTZml4ZWQzMigwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdFNmaXhlZDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0U2ludDMyKDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0U2ludDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0U3RyaW5nKCIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdFN0cmluZ0J5dGVzKEJ5dGVTdHJpbmcuRU1QVFkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0U3RyaW5nUGllY2UoIiIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXREZWZhdWx0U3RyaW5nUGllY2VCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdFVpbnQzMigwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdFVpbnQ2NCgwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWRCb29sKHRydWUpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZEJ5dGVzKEJ5dGVTdHJpbmcuRU1QVFkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZENvcmQoIiIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZENvcmRCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkRml4ZWQzMigwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWRGaXhlZDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZEZsb2F0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWRJbXBvcnRFbnVtKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkSW50MzIoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkSW50NjQoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkTmVzdGVkRW51bShOZXN0ZWRFbnVtLkJBUikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkU2ZpeGVkMzIoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkU2ZpeGVkNjQoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkU2ludDMyKDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZFNpbnQ2NCgwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoIiIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZ0J5dGVzKEJ5dGVTdHJpbmcuRU1QVFkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZFN0cmluZ1BpZWNlKCIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmdQaWVjZUJ5dGVzKEJ5dGVTdHJpbmcuRU1QVFkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZFVpbnQzMigwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkUmVwZWF0ZWRVaW50NjQoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsQm9vbCh0cnVlKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxDb3JkKCIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxDb3JkQnl0ZXMoQnl0ZVN0cmluZy5FTVBUWSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsRG91YmxlKDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbEZpeGVkMzIoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsRml4ZWQ2NCgwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxGbG9hdCgwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxGb3JlaWduRW51bShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsSW1wb3J0RW51bShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbEludDMyKDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbEludDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbE5lc3RlZEVudW0oTmVzdGVkRW51bS5CQVIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbFNmaXhlZDMyKDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbFNmaXhlZDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbFNpbnQzMigwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxTaW50NjQoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmdCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmdQaWVjZSgiIikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nUGllY2VCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxVaW50MzIoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsVWludDY0KDApCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPbmVvZkJ5dGVzKEJ5dGVTdHJpbmcuRU1QVFkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPbmVvZkxhenlOZXN0ZWRNZXNzYWdlKE5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICAKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPbmVvZk5lc3RlZE1lc3NhZ2UoTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotICAgIAotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9uZW9mU3RyaW5nKCIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T25lb2ZTdHJpbmdCeXRlcyhCeXRlU3RyaW5nLkVNUFRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0gICAgCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T25lb2ZVaW50MzIoMCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZUxpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLQotICAgIG9uZUZpZWxkU2V0ID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsR3JvdXAoT3B0aW9uYWxHcm91cC5nZXREZWZhdWx0SW5zdGFuY2UoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2Uob25lRmllbGRTZXQuZXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICBhc3NlcnRGYWxzZShUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpLmVxdWFscyhvbmVGaWVsZFNldCkpOwotCi0gICAgb25lRmllbGRTZXQgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlKFB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVGaWVsZFNldC5lcXVhbHMoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKFRlc3RBbGxUeXBlc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZXF1YWxzKG9uZUZpZWxkU2V0KSk7Ci0KLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbExhenlNZXNzYWdlKE5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgCi0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgICBvbmVGaWVsZFNldCA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZExhenlNZXNzYWdlKE5lc3RlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG9uZUZpZWxkU2V0LmVxdWFscyhUZXN0QWxsVHlwZXNMaXRlLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5lcXVhbHMob25lRmllbGRTZXQpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBDaGVjayB0aGF0IHR3byBpZGVudGljYWwgb2JqcyBhcmUgZXF1YWwuCi0gICAgRm9vIGZvbzFhID0gRm9vLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLmFkZEJhcihCYXIubmV3QnVpbGRlcigpLnNldE5hbWUoImZvbzEiKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRm9vIGZvbzFiID0gRm9vLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLmFkZEJhcihCYXIubmV3QnVpbGRlcigpLnNldE5hbWUoImZvbzEiKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRm9vIGZvbzIgPSBGb28ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRWYWx1ZSgxKQotICAgICAgICAuYWRkQmFyKEJhci5uZXdCdWlsZGVyKCkuc2V0TmFtZSgiZm9vMiIpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIC8vIENoZWNrIHRoYXQgZXF1YWxzIGlzIGRvaW5nIHZhbHVlIHJhdGhlciB0aGFuIG9iamVjdCBlcXVhbGl0eS4KLSAgICBhc3NlcnRFcXVhbHMoZm9vMWEsIGZvbzFiKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9vMWEuaGFzaENvZGUoKSwgZm9vMWIuaGFzaENvZGUoKSk7Ci0KLSAgICAvLyBDaGVjayB0aGF0IGEgZGlmZmVlbnQgb2JqZWN0IGlzIG5vdCBlcXVhbC4KLSAgICBhc3NlcnRGYWxzZShmb28xYS5lcXVhbHMoZm9vMikpOwotCi0gICAgLy8gQ2hlY2sgdGhhdCB0d28gb2JqZWN0cyB3aGljaCBoYXZlIGRpZmZlcmVudCB0eXBlcyBidXQgdGhlIHNhbWUgZmllbGQgdmFsdWVzIGFyZSBub3QKLSAgICAvLyBjb25zaWRlcmVkIHRvIGJlIGVxdWFsLgotICAgIEJhciBiYXIgPSBCYXIubmV3QnVpbGRlcigpLnNldE5hbWUoImJhciIpLmJ1aWxkKCk7Ci0gICAgQmFyUHJpbWUgYmFyUHJpbWUgPSBCYXJQcmltZS5uZXdCdWlsZGVyKCkuc2V0TmFtZSgiYmFyIikuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShiYXIuZXF1YWxzKGJhclByaW1lKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T25lb2ZFcXVhbHMuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mRXF1YWxzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0T25lb2ZFcXVhbHMgbWVzc2FnZTEgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgLy8gU2V0IG1lc3NhZ2UyJ3MgbmFtZSBmaWVsZCB0byBkZWZhdWx0IHZhbHVlLiBUaGUgdHdvIG1lc3NhZ2VzIHNob3VsZCBiZSBkaWZmZXJlbnQgd2hlbiB3ZQotICAgIC8vIGNoZWNrIHdpdGggdGhlIG9uZW9mIGNhc2UuCi0gICAgYnVpbGRlci5zZXROYW1lKCIiKTsKLSAgICBUZXN0T25lb2ZFcXVhbHMgbWVzc2FnZTIgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZTEuZXF1YWxzKG1lc3NhZ2UyKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNfc2FuaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZSBvbmUgPSBUZXN0VXRpbExpdGUuZ2V0QWxsTGl0ZVNldEJ1aWxkZXIoKS5idWlsZCgpOwotICAgIFRlc3RBbGxUeXBlc0xpdGUgdHdvID0gVGVzdEFsbFR5cGVzTGl0ZS5wYXJzZUZyb20ob25lLnRvQnl0ZUFycmF5KCkpOwotICAgIGFzc2VydEVxdWFscyhvbmUsIHR3byk7Ci0gICAgYXNzZXJ0RXF1YWxzKG9uZS5oYXNoQ29kZSgpLCB0d28uaGFzaENvZGUoKSk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBvbmUudG9CdWlsZGVyKCkubWVyZ2VGcm9tKHR3bykuYnVpbGQoKSwKLSAgICAgICAgdHdvLnRvQnVpbGRlcigpLm1lcmdlRnJvbSh0d28udG9CeXRlQXJyYXkoKSkuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaENvZGVXaXRoVW5rbm93bkZpZWxkcygpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIEZvbyBmb29XaXRoT25seVZhbHVlID0gRm9vLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBGb28gZm9vV2l0aFZhbHVlQW5kRXh0ZW5zaW9uID0gZm9vV2l0aE9ubHlWYWx1ZS50b0J1aWxkZXIoKQotICAgICAgICAuc2V0VmFsdWUoMSkKLSAgICAgICAgLnNldEV4dGVuc2lvbihCYXIuZm9vRXh0LCBCYXIubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0TmFtZSgibmFtZSIpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBGb28gZm9vV2l0aFZhbHVlQW5kVW5rbm93bkZpZWxkcyA9IEZvby5wYXJzZUZyb20oZm9vV2l0aFZhbHVlQW5kRXh0ZW5zaW9uLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzQW5kSGFzaENvZGVBcmVGYWxzZShmb29XaXRoT25seVZhbHVlLCBmb29XaXRoVmFsdWVBbmRVbmtub3duRmllbGRzKTsKLSAgICBhc3NlcnRFcXVhbHNBbmRIYXNoQ29kZUFyZUZhbHNlKGZvb1dpdGhWYWx1ZUFuZEV4dGVuc2lvbiwgZm9vV2l0aFZhbHVlQW5kVW5rbm93bkZpZWxkcyk7Ci0gIH0KLSAgCi0gIC8vIFRlc3QgdG8gZW5zdXJlIHdlIGF2b2lkIGEgY2xhc3MgY2FzdCBleGNlcHRpb24gd2l0aCBvbmVvZnMuCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNfb25lT2ZNZXNzYWdlcygpIHsKLSAgICBUZXN0QWxsVHlwZXNMaXRlIG1pbmUgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T25lb2ZTdHJpbmcoIkhlbGxvIikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgCi0gICAgVGVzdEFsbFR5cGVzTGl0ZSBvdGhlciA9IFRlc3RBbGxUeXBlc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPbmVvZk5lc3RlZE1lc3NhZ2UoTmVzdGVkTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgCi0gICAgYXNzZXJ0RmFsc2UobWluZS5lcXVhbHMob3RoZXIpKTsKLSAgICBhc3NlcnRGYWxzZShvdGhlci5lcXVhbHMobWluZSkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsc0FuZEhhc2hDb2RlQXJlRmFsc2UoT2JqZWN0IG8xLCBPYmplY3QgbzIpIHsKLSAgICBhc3NlcnRGYWxzZShvMS5lcXVhbHMobzIpKTsKLSAgICBhc3NlcnRGYWxzZShvMS5oYXNoQ29kZSgpID09IG8yLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlY3Vyc2l2ZUhhc2hjb2RlKCkgewotICAgIC8vIFRoaXMgdGVzdHMgdGhhdCB3ZSBkb24ndCBpbmZpbml0ZSBsb29wLgotICAgIFRlc3RSZWN1cnNpdmVPbmVvZi5nZXREZWZhdWx0SW5zdGFuY2UoKS5oYXNoQ29kZSgpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVyYWxCeXRlU3RyaW5nVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MaXRlcmFsQnl0ZVN0cmluZ1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmU3NzkyYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVyYWxCeXRlU3RyaW5nVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdCB7QGNvZGUgTGl0ZXJhbEJ5dGVTdHJpbmd9IGJ5IHNldHRpbmcgdXAgYSByZWZlcmVuY2Ugc3RyaW5nIGluIHtAbGluayAjc2V0VXAoKX0uCi0gKiBUaGlzIGNsYXNzIGlzIGRlc2lnbmVkIHRvIGJlIGV4dGVuZGVkIGZvciB0ZXN0aW5nIGV4dGVuc2lvbnMgb2Yge0Bjb2RlIExpdGVyYWxCeXRlU3RyaW5nfQotICogc3VjaCBhcyB7QGNvZGUgQm91bmRlZEJ5dGVTdHJpbmd9LCBzZWUge0BsaW5rIEJvdW5kZWRCeXRlU3RyaW5nVGVzdH0uCi0gKgotICogQGF1dGhvciBjYXJsYW50b25AZ29vZ2xlLmNvbSAoQ2FybCBIYXZlcmwpCi0gKi8KLXB1YmxpYyBjbGFzcyBMaXRlcmFsQnl0ZVN0cmluZ1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgU3RyaW5nIFVURl84ID0gIlVURi04IjsKLQotICBwcm90ZWN0ZWQgU3RyaW5nIGNsYXNzVW5kZXJUZXN0OwotICBwcm90ZWN0ZWQgYnl0ZVtdIHJlZmVyZW5jZUJ5dGVzOwotICBwcm90ZWN0ZWQgQnl0ZVN0cmluZyBzdHJpbmdVbmRlclRlc3Q7Ci0gIHByb3RlY3RlZCBpbnQgZXhwZWN0ZWRIYXNoQ29kZTsKLQotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBjbGFzc1VuZGVyVGVzdCA9ICJMaXRlcmFsQnl0ZVN0cmluZyI7Ci0gICAgcmVmZXJlbmNlQnl0ZXMgPSBCeXRlU3RyaW5nVGVzdC5nZXRUZXN0Qnl0ZXMoMTIzNCwgMTEzMzc3NjZMKTsKLSAgICBzdHJpbmdVbmRlclRlc3QgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlZmVyZW5jZUJ5dGVzKTsKLSAgICBleHBlY3RlZEhhc2hDb2RlID0gMzMxMTYxODUyOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4cGVjdGVkVHlwZSgpIHsKLSAgICBTdHJpbmcgYWN0dWFsQ2xhc3NOYW1lID0gZ2V0QWN0dWFsQ2xhc3NOYW1lKHN0cmluZ1VuZGVyVGVzdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBzaG91bGQgbWF0Y2ggdHlwZSBleGFjdGx5IiwgY2xhc3NVbmRlclRlc3QsIGFjdHVhbENsYXNzTmFtZSk7Ci0gIH0KLQotICBwcm90ZWN0ZWQgU3RyaW5nIGdldEFjdHVhbENsYXNzTmFtZShPYmplY3Qgb2JqZWN0KSB7Ci0gICAgcmV0dXJuIG9iamVjdC5nZXRDbGFzcygpLmdldFNpbXBsZU5hbWUoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCeXRlQXQoKSB7Ci0gICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gdHJ1ZTsKLSAgICBmb3IgKGludCBpID0gMDsgc3RpbGxFcXVhbCAmJiBpIDwgcmVmZXJlbmNlQnl0ZXMubGVuZ3RoOyArK2kpIHsKLSAgICAgIHN0aWxsRXF1YWwgPSAocmVmZXJlbmNlQnl0ZXNbaV0gPT0gc3RyaW5nVW5kZXJUZXN0LmJ5dGVBdChpKSk7Ci0gICAgfQotICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgY2FwdHVyZSB0aGUgcmlnaHQgYnl0ZXMiLCBzdGlsbEVxdWFsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCeXRlSXRlcmF0b3IoKSB7Ci0gICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gdHJ1ZTsKLSAgICBCeXRlU3RyaW5nLkJ5dGVJdGVyYXRvciBpdGVyID0gc3RyaW5nVW5kZXJUZXN0Lml0ZXJhdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IHN0aWxsRXF1YWwgJiYgaSA8IHJlZmVyZW5jZUJ5dGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICBzdGlsbEVxdWFsID0gKGl0ZXIuaGFzTmV4dCgpICYmIHJlZmVyZW5jZUJ5dGVzW2ldID09IGl0ZXIubmV4dEJ5dGUoKSk7Ci0gICAgfQotICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgY2FwdHVyZSB0aGUgcmlnaHQgYnl0ZXMiLCBzdGlsbEVxdWFsKTsKLSAgICBhc3NlcnRGYWxzZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBoYXZlIGV4aGF1c3RlZCB0aGUgaXRlcnRvciIsIGl0ZXIuaGFzTmV4dCgpKTsKLQotICAgIHRyeSB7Ci0gICAgICBpdGVyLm5leHRCeXRlKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJ5dGVJdGVyYWJsZSgpIHsKLSAgICBib29sZWFuIHN0aWxsRXF1YWwgPSB0cnVlOwotICAgIGludCBqID0gMDsKLSAgICBmb3IgKGJ5dGUgcXVhbnR1bSA6IHN0cmluZ1VuZGVyVGVzdCkgewotICAgICAgc3RpbGxFcXVhbCA9IChyZWZlcmVuY2VCeXRlc1tqXSA9PSBxdWFudHVtKTsKLSAgICAgICsrajsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBjYXB0dXJlIHRoZSByaWdodCBieXRlcyBhcyBCeXRlcyIsIHN0aWxsRXF1YWwpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgaXRlcmFibGUgY2hhcmFjdGVyIGNvdW50IiwgcmVmZXJlbmNlQnl0ZXMubGVuZ3RoLCBqKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBoYXZlIHRoZSBleHBlY3RlZCBzaXplIiwgcmVmZXJlbmNlQnl0ZXMubGVuZ3RoLAotICAgICAgICBzdHJpbmdVbmRlclRlc3Quc2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRUcmVlRGVwdGgoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGhhdmUgZGVwdGggMCIsIDAsIHN0cmluZ1VuZGVyVGVzdC5nZXRUcmVlRGVwdGgoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SXNCYWxhbmNlZCgpIHsKLSAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIiBpcyB0ZWNobmljYWxseSBiYWxhbmNlZCIsIHN0cmluZ1VuZGVyVGVzdC5pc0JhbGFuY2VkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvcHlUb19CeXRlQXJyYXlPZmZzZXRMZW5ndGgoKSB7Ci0gICAgaW50IGRlc3RpbmF0aW9uT2Zmc2V0ID0gNTA7Ci0gICAgaW50IGxlbmd0aCA9IDEwMDsKLSAgICBieXRlW10gZGVzdGluYXRpb24gPSBuZXcgYnl0ZVtkZXN0aW5hdGlvbk9mZnNldCArIGxlbmd0aF07Ci0gICAgaW50IHNvdXJjZU9mZnNldCA9IDIxMzsKLSAgICBzdHJpbmdVbmRlclRlc3QuY29weVRvKGRlc3RpbmF0aW9uLCBzb3VyY2VPZmZzZXQsIGRlc3RpbmF0aW9uT2Zmc2V0LCBsZW5ndGgpOwotICAgIGJvb2xlYW4gc3RpbGxFcXVhbCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IHN0aWxsRXF1YWwgJiYgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgICBzdGlsbEVxdWFsID0gcmVmZXJlbmNlQnl0ZXNbaSArIHNvdXJjZU9mZnNldF0gPT0gZGVzdGluYXRpb25baSArIGRlc3RpbmF0aW9uT2Zmc2V0XTsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIuY29weVRvKDQgYXJnKSBtdXN0IGdpdmUgdGhlIGV4cGVjdGVkIGJ5dGVzIiwgc3RpbGxFcXVhbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weVRvX0J5dGVBcnJheU9mZnNldExlbmd0aEVycm9ycygpIHsKLSAgICBpbnQgZGVzdGluYXRpb25PZmZzZXQgPSA1MDsKLSAgICBpbnQgbGVuZ3RoID0gMTAwOwotICAgIGJ5dGVbXSBkZXN0aW5hdGlvbiA9IG5ldyBieXRlW2Rlc3RpbmF0aW9uT2Zmc2V0ICsgbGVuZ3RoXTsKLQotICAgIHRyeSB7Ci0gICAgICAvLyBDb3B5IG9uZSB0b28gbWFueSBieXRlcwotICAgICAgc3RyaW5nVW5kZXJUZXN0LmNvcHlUbyhkZXN0aW5hdGlvbiwgc3RyaW5nVW5kZXJUZXN0LnNpemUoKSArIDEgLSBsZW5ndGgsCi0gICAgICAgICAgZGVzdGluYXRpb25PZmZzZXQsIGxlbmd0aCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gY29weWluZyB0b28gbWFueSBieXRlcyBvZiBhICIKLSAgICAgICAgICArIGNsYXNzVW5kZXJUZXN0KTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gQ29weSB3aXRoIGlsbGVnYWwgbmVnYXRpdmUgc291cmNlT2Zmc2V0Ci0gICAgICBzdHJpbmdVbmRlclRlc3QuY29weVRvKGRlc3RpbmF0aW9uLCAtMSwgZGVzdGluYXRpb25PZmZzZXQsIGxlbmd0aCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gYSBuZWdhdGl2ZSBzb3VyY2VPZmZzZXQgaW4gIgotICAgICAgICAgICsgY2xhc3NVbmRlclRlc3QpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBDb3B5IHdpdGggaWxsZWdhbCBuZWdhdGl2ZSBkZXN0aW5hdGlvbk9mZnNldAotICAgICAgc3RyaW5nVW5kZXJUZXN0LmNvcHlUbyhkZXN0aW5hdGlvbiwgMCwgLTEsIGxlbmd0aCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gYSBuZWdhdGl2ZSBkZXN0aW5hdGlvbk9mZnNldCBpbiAiCi0gICAgICAgICAgKyBjbGFzc1VuZGVyVGVzdCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIENvcHkgd2l0aCBpbGxlZ2FsIG5lZ2F0aXZlIHNpemUKLSAgICAgIHN0cmluZ1VuZGVyVGVzdC5jb3B5VG8oZGVzdGluYXRpb24sIDAsIDAsIC0xKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gd2hlbiBnaXZlbiBhIG5lZ2F0aXZlIHNpemUgaW4gIgotICAgICAgICAgICsgY2xhc3NVbmRlclRlc3QpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBDb3B5IHdpdGggaWxsZWdhbCB0b28tbGFyZ2Ugc291cmNlT2Zmc2V0Ci0gICAgICBzdHJpbmdVbmRlclRlc3QuY29weVRvKGRlc3RpbmF0aW9uLCAyICogc3RyaW5nVW5kZXJUZXN0LnNpemUoKSwgMCwgbGVuZ3RoKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gd2hlbiB0aGUgZGVzdGluYXRpb25PZmZzZXQgaXMgdG9vIGxhcmdlIGluICIKLSAgICAgICAgICArIGNsYXNzVW5kZXJUZXN0KTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gQ29weSB3aXRoIGlsbGVnYWwgdG9vLWxhcmdlIGRlc3RpbmF0aW9uT2Zmc2V0Ci0gICAgICBzdHJpbmdVbmRlclRlc3QuY29weVRvKGRlc3RpbmF0aW9uLCAwLCAyICogZGVzdGluYXRpb24ubGVuZ3RoLCBsZW5ndGgpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZSBkZXN0aW5hdGlvbk9mZnNldCBpcyB0b28gbGFyZ2UgaW4gIgotICAgICAgICAgICsgY2xhc3NVbmRlclRlc3QpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb3B5VG9fQnl0ZUJ1ZmZlcigpIHsKLSAgICBCeXRlQnVmZmVyIG15QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZShyZWZlcmVuY2VCeXRlcy5sZW5ndGgpOwotICAgIHN0cmluZ1VuZGVyVGVzdC5jb3B5VG8obXlCdWZmZXIpOwotICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiLmNvcHlUbyhCeXRlQnVmZmVyKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIG15QnVmZmVyLmFycmF5KCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNYXJrU3VwcG9ydGVkKCkgewotICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IHN0cmluZ1VuZGVyVGVzdC5uZXdJbnB1dCgpOwotICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiLm5ld0lucHV0KCkgbXVzdCBzdXBwb3J0IG1hcmtpbmciLCBzdHJlYW0ubWFya1N1cHBvcnRlZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNYXJrQW5kUmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGludCBmcmFjdGlvbiA9IHN0cmluZ1VuZGVyVGVzdC5zaXplKCkgLyAzOwotCi0gICAgSW5wdXRTdHJlYW0gc3RyZWFtID0gc3RyaW5nVW5kZXJUZXN0Lm5ld0lucHV0KCk7Ci0gICAgc3RyZWFtLm1hcmsoc3RyaW5nVW5kZXJUZXN0LnNpemUoKSk7IC8vIEZpcnN0LCBtYXJrKCkgdGhlIGVuZC4KLQotICAgIHNraXBGdWxseShzdHJlYW0sIGZyYWN0aW9uKTsgLy8gU2tpcCBhIGxhcmdlIGZyYWN0aW9uLCBidXQgbm90IGFsbC4KLSAgICBpbnQgYXZhaWxhYmxlID0gc3RyZWFtLmF2YWlsYWJsZSgpOwotICAgIGFzc2VydFRydWUoCi0gICAgICAgIGNsYXNzVW5kZXJUZXN0ICsgIjogYWZ0ZXIgc2tpcHBpbmcgdG8gdGhlICdtaWRkbGUnLCBoYWxmIHRoZSBieXRlcyBhcmUgYXZhaWxhYmxlIiwKLSAgICAgICAgKHN0cmluZ1VuZGVyVGVzdC5zaXplKCkgLSBmcmFjdGlvbikgPT0gYXZhaWxhYmxlKTsKLSAgICBzdHJlYW0ucmVzZXQoKTsKLQotICAgIHNraXBGdWxseShzdHJlYW0sIHN0cmluZ1VuZGVyVGVzdC5zaXplKCkpOyAvLyBTa2lwIHRvIHRoZSBlbmQuCi0gICAgYXZhaWxhYmxlID0gc3RyZWFtLmF2YWlsYWJsZSgpOwotICAgIGFzc2VydFRydWUoCi0gICAgICAgIGNsYXNzVW5kZXJUZXN0ICsgIjogYWZ0ZXIgc2tpcHBpbmcgdG8gdGhlIGVuZCwgbm8gbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlIiwKLSAgICAgICAgMCA9PSBhdmFpbGFibGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIERpc2NhcmRzIHtAY29kZSBufSBieXRlcyBvZiBkYXRhIGZyb20gdGhlIGlucHV0IHN0cmVhbS4gVGhpcyBtZXRob2QKLSAgICogd2lsbCBibG9jayB1bnRpbCB0aGUgZnVsbCBhbW91bnQgaGFzIGJlZW4gc2tpcHBlZC4gRG9lcyBub3QgY2xvc2UgdGhlCi0gICAqIHN0cmVhbS4KLSAgICogPHA+Q29waWVkIGZyb20gY29tLmdvb2dsZS5jb21tb24uaW8uQnl0ZVN0cmVhbXMgdG8gYXZvaWQgYWRkaW5nIGRlcGVuZGVuY3kuCi0gICAqCi0gICAqIEBwYXJhbSBpbiB0aGUgaW5wdXQgc3RyZWFtIHRvIHJlYWQgZnJvbQotICAgKiBAcGFyYW0gbiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHNraXAKLSAgICogQHRocm93cyBFT0ZFeGNlcHRpb24gaWYgdGhpcyBzdHJlYW0gcmVhY2hlcyB0aGUgZW5kIGJlZm9yZSBza2lwcGluZyBhbGwKLSAgICogICAgIHRoZSBieXRlcwotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIEkvTyBlcnJvciBvY2N1cnMsIG9yIHRoZSBzdHJlYW0gZG9lcyBub3QKLSAgICogICAgIHN1cHBvcnQgc2tpcHBpbmcKLSAgICovCi0gIHN0YXRpYyB2b2lkIHNraXBGdWxseShJbnB1dFN0cmVhbSBpbiwgbG9uZyBuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGxvbmcgdG9Ta2lwID0gbjsKLSAgICB3aGlsZSAobiA+IDApIHsKLSAgICAgIGxvbmcgYW10ID0gaW4uc2tpcChuKTsKLSAgICAgIGlmIChhbXQgPT0gMCkgewotICAgICAgICAvLyBGb3JjZSBhIGJsb2NraW5nIHJlYWQgdG8gYXZvaWQgaW5maW5pdGUgbG9vcAotICAgICAgICBpZiAoaW4ucmVhZCgpID09IC0xKSB7Ci0gICAgICAgICAgbG9uZyBza2lwcGVkID0gdG9Ta2lwIC0gbjsKLSAgICAgICAgICB0aHJvdyBuZXcgRU9GRXhjZXB0aW9uKCJyZWFjaGVkIGVuZCBvZiBzdHJlYW0gYWZ0ZXIgc2tpcHBpbmcgIgotICAgICAgICAgICAgICArIHNraXBwZWQgKyAiIGJ5dGVzOyAiICsgdG9Ta2lwICsgIiBieXRlcyBleHBlY3RlZCIpOwotICAgICAgICB9Ci0gICAgICAgIG4tLTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG4gLT0gYW10OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RBc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIHsKLSAgICBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIgPSBzdHJpbmdVbmRlclRlc3QuYXNSZWFkT25seUJ5dGVCdWZmZXIoKTsKLSAgICBieXRlW10gcm91bmRUcmlwQnl0ZXMgPSBuZXcgYnl0ZVtyZWZlcmVuY2VCeXRlcy5sZW5ndGhdOwotICAgIGFzc2VydFRydWUoYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKSA9PSByZWZlcmVuY2VCeXRlcy5sZW5ndGgpOwotICAgIGFzc2VydFRydWUoYnl0ZUJ1ZmZlci5pc1JlYWRPbmx5KCkpOwotICAgIGJ5dGVCdWZmZXIuZ2V0KHJvdW5kVHJpcEJ5dGVzKTsKLSAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIi5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIG11c3QgZ2l2ZSBiYWNrIHRoZSBzYW1lIGJ5dGVzIiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhyZWZlcmVuY2VCeXRlcywgcm91bmRUcmlwQnl0ZXMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RBc1JlYWRPbmx5Qnl0ZUJ1ZmZlckxpc3QoKSB7Ci0gICAgTGlzdDxCeXRlQnVmZmVyPiBieXRlQnVmZmVycyA9IHN0cmluZ1VuZGVyVGVzdC5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlckxpc3QoKTsKLSAgICBpbnQgYnl0ZXNTZWVuID0gMDsKLSAgICBieXRlW10gcm91bmRUcmlwQnl0ZXMgPSBuZXcgYnl0ZVtyZWZlcmVuY2VCeXRlcy5sZW5ndGhdOwotICAgIGZvciAoQnl0ZUJ1ZmZlciBieXRlQnVmZmVyIDogYnl0ZUJ1ZmZlcnMpIHsKLSAgICAgIGludCB0aGlzTGVuZ3RoID0gYnl0ZUJ1ZmZlci5yZW1haW5pbmcoKTsKLSAgICAgIGFzc2VydFRydWUoYnl0ZUJ1ZmZlci5pc1JlYWRPbmx5KCkpOwotICAgICAgYXNzZXJ0VHJ1ZShieXRlc1NlZW4gKyB0aGlzTGVuZ3RoIDw9IHJlZmVyZW5jZUJ5dGVzLmxlbmd0aCk7Ci0gICAgICBieXRlQnVmZmVyLmdldChyb3VuZFRyaXBCeXRlcywgYnl0ZXNTZWVuLCB0aGlzTGVuZ3RoKTsKLSAgICAgIGJ5dGVzU2VlbiArPSB0aGlzTGVuZ3RoOwotICAgIH0KLSAgICBhc3NlcnRUcnVlKGJ5dGVzU2VlbiA9PSByZWZlcmVuY2VCeXRlcy5sZW5ndGgpOwotICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiLmFzUmVhZE9ubHlCeXRlQnVmZmVyVGVzdCgpIG11c3QgZ2l2ZSBiYWNrIHRoZSBzYW1lIGJ5dGVzIiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhyZWZlcmVuY2VCeXRlcywgcm91bmRUcmlwQnl0ZXMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUb0J5dGVBcnJheSgpIHsKLSAgICBieXRlW10gcm91bmRUcmlwQnl0ZXMgPSBzdHJpbmdVbmRlclRlc3QudG9CeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIi50b0J5dGVBcnJheSgpIG11c3QgZ2l2ZSBiYWNrIHRoZSBzYW1lIGJ5dGVzIiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhyZWZlcmVuY2VCeXRlcywgcm91bmRUcmlwQnl0ZXMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYm9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIHN0cmluZ1VuZGVyVGVzdC53cml0ZVRvKGJvcyk7Ci0gICAgYnl0ZVtdIHJvdW5kVHJpcEJ5dGVzID0gYm9zLnRvQnl0ZUFycmF5KCk7Ci0gICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIud3JpdGVUbygpIG11c3QgZ2l2ZSBiYWNrIHRoZSBzYW1lIGJ5dGVzIiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhyZWZlcmVuY2VCeXRlcywgcm91bmRUcmlwQnl0ZXMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvU2hvdWxkTm90RXhwb3NlSW50ZXJuYWxCdWZmZXJUb091dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IE91dHB1dFN0cmVhbSgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgICAgQXJyYXlzLmZpbGwoYiwgb2ZmLCBvZmYgKyBsZW4sIChieXRlKSAwKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgc3RyaW5nVW5kZXJUZXN0LndyaXRlVG8ob3MpOwotICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiLndyaXRlVG8oKSBtdXN0IG5vdCBncmFudCBhY2Nlc3MgdG8gdW5kZXJseWluZyBhcnJheSIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIHN0cmluZ1VuZGVyVGVzdC50b0J5dGVBcnJheSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb0ludGVybmFsU2hvdWxkRXhwb3NlSW50ZXJuYWxCdWZmZXJUb091dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IE91dHB1dFN0cmVhbSgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgICAgQXJyYXlzLmZpbGwoYiwgb2ZmLCBvZmYgKyBsZW4sIChieXRlKSAwKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgc3RyaW5nVW5kZXJUZXN0LndyaXRlVG9JbnRlcm5hbChvcywgMCwgc3RyaW5nVW5kZXJUZXN0LnNpemUoKSk7Ci0gICAgYnl0ZVtdIGFsbFplcm9zID0gbmV3IGJ5dGVbc3RyaW5nVW5kZXJUZXN0LnNpemUoKV07Ci0gICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIud3JpdGVUb0ludGVybmFsKCkgbXVzdCBncmFudCBhY2Nlc3MgdG8gdW5kZXJseWluZyBhcnJheSIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMoYWxsWmVyb3MsIHN0cmluZ1VuZGVyVGVzdC50b0J5dGVBcnJheSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUb1Nob3VsZEV4cG9zZUludGVybmFsQnVmZmVyVG9CeXRlT3V0cHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlT3V0cHV0IG91dCA9IG5ldyBCeXRlT3V0cHV0KCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHdyaXRlTGF6eShieXRlW10gdmFsdWUsIGludCBvZmZzZXQsIGludCBsZW5ndGgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5cy5maWxsKHZhbHVlLCBvZmZzZXQsIG9mZnNldCArIGxlbmd0aCwgKGJ5dGUpIDApOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKEJ5dGVCdWZmZXIgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHdyaXRlTGF6eShCeXRlQnVmZmVyIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgc3RyaW5nVW5kZXJUZXN0LndyaXRlVG8ob3V0KTsKLSAgICBieXRlW10gYWxsWmVyb3MgPSBuZXcgYnl0ZVtzdHJpbmdVbmRlclRlc3Quc2l6ZSgpXTsKLSAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIi53cml0ZVRvSW50ZXJuYWwoKSBtdXN0IGdyYW50IGFjY2VzcyB0byB1bmRlcmx5aW5nIGFycmF5IiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhhbGxaZXJvcywgc3RyaW5nVW5kZXJUZXN0LnRvQnl0ZUFycmF5KCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXdPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgQnl0ZVN0cmluZy5PdXRwdXQgb3V0cHV0ID0gQnl0ZVN0cmluZy5uZXdPdXRwdXQoKTsKLSAgICBzdHJpbmdVbmRlclRlc3Qud3JpdGVUbyhvdXRwdXQpOwotICAgIGFzc2VydEVxdWFscygiT3V0cHV0IFNpemUgcmV0dXJucyBjb3JyZWN0IHJlc3VsdCIsCi0gICAgICAgIG91dHB1dC5zaXplKCksIHN0cmluZ1VuZGVyVGVzdC5zaXplKCkpOwotICAgIG91dHB1dC53cml0ZVRvKGJvcyk7Ci0gICAgYXNzZXJ0VHJ1ZSgiT3V0cHV0LndyaXRlVG8oKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIGJvcy50b0J5dGVBcnJheSgpKSk7Ci0KLSAgICAvLyB3cml0ZSB0aGUgb3V0cHV0IHN0cmVhbSB0byBpdHNlbGYhIFRoaXMgc2hvdWxkIGNhdXNlIGl0IHRvIGRvdWJsZQotICAgIG91dHB1dC53cml0ZVRvKG91dHB1dCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJXcml0aW5nIGFuIG91dHB1dCBzdHJlYW0gdG8gaXRzZWxmIGlzIHN1Y2Nlc3NmdWwiLAotICAgICAgICBzdHJpbmdVbmRlclRlc3QuY29uY2F0KHN0cmluZ1VuZGVyVGVzdCksIG91dHB1dC50b0J5dGVTdHJpbmcoKSk7Ci0KLSAgICBvdXRwdXQucmVzZXQoKTsKLSAgICBhc3NlcnRFcXVhbHMoIk91dHB1dC5yZXNldCgpIHJlc2V0cyB0aGUgb3V0cHV0IiwgMCwgb3V0cHV0LnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJPdXRwdXQucmVzZXQoKSByZXNldHMgdGhlIG91dHB1dCIsCi0gICAgICAgIEJ5dGVTdHJpbmcuRU1QVFksIG91dHB1dC50b0J5dGVTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiSSBsb3ZlIHVuaWNvZGUgXHUxMjM0XHU1Njc4IGNoYXJhY3RlcnMiOwotICAgIEJ5dGVTdHJpbmcgdW5pY29kZSA9IEJ5dGVTdHJpbmcud3JhcCh0ZXN0U3RyaW5nLmdldEJ5dGVzKEludGVybmFsLlVURl84KSk7Ci0gICAgU3RyaW5nIHJvdW5kVHJpcFN0cmluZyA9IHVuaWNvZGUudG9TdHJpbmcoVVRGXzgpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgdW5pY29kZSBtdXN0IG1hdGNoIiwgdGVzdFN0cmluZywgcm91bmRUcmlwU3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDaGFyc2V0VG9TdHJpbmcoKSB7Ci0gICAgU3RyaW5nIHRlc3RTdHJpbmcgPSAiSSBsb3ZlIHVuaWNvZGUgXHUxMjM0XHU1Njc4IGNoYXJhY3RlcnMiOwotICAgIEJ5dGVTdHJpbmcgdW5pY29kZSA9IEJ5dGVTdHJpbmcud3JhcCh0ZXN0U3RyaW5nLmdldEJ5dGVzKEludGVybmFsLlVURl84KSk7Ci0gICAgU3RyaW5nIHJvdW5kVHJpcFN0cmluZyA9IHVuaWNvZGUudG9TdHJpbmcoSW50ZXJuYWwuVVRGXzgpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgdW5pY29kZSBtdXN0IG1hdGNoIiwgdGVzdFN0cmluZywgcm91bmRUcmlwU3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ19yZXR1cm5zQ2Fub25pY2FsRW1wdHlTdHJpbmcoKSB7Ci0gICAgYXNzZXJ0U2FtZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBiZSB0aGUgc2FtZSBzdHJpbmcgcmVmZXJlbmNlcyIsCi0gICAgICAgIEJ5dGVTdHJpbmcuRU1QVFkudG9TdHJpbmcoSW50ZXJuYWwuVVRGXzgpLAotICAgICAgICBCeXRlU3RyaW5nLndyYXAobmV3IGJ5dGVbXXt9KS50b1N0cmluZyhJbnRlcm5hbC5VVEZfOCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nX3JhaXNlc0V4Y2VwdGlvbigpIHsKLSAgICB0cnkgewotICAgICAgQnl0ZVN0cmluZy5FTVBUWS50b1N0cmluZygiaW52YWxpZCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgQnl0ZVN0cmluZy53cmFwKHJlZmVyZW5jZUJ5dGVzKS50b1N0cmluZygiaW52YWxpZCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzKCkgewotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBub3QgZXF1YWwgbnVsbCIsIGZhbHNlLCBzdHJpbmdVbmRlclRlc3QuZXF1YWxzKG51bGwpKTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgZXF1YWwgc2VsZiIsIHN0cmluZ1VuZGVyVGVzdCwgc3RyaW5nVW5kZXJUZXN0KTsKLSAgICBhc3NlcnRGYWxzZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBub3QgZXF1YWwgdGhlIGVtcHR5IHN0cmluZyIsCi0gICAgICAgIHN0cmluZ1VuZGVyVGVzdC5lcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSkpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgZW1wdHkgc3RyaW5ncyBtdXN0IGJlIGVxdWFsIiwKLSAgICAgICAgQnl0ZVN0cmluZy53cmFwKG5ldyBieXRlW117fSksIHN0cmluZ1VuZGVyVGVzdC5zdWJzdHJpbmcoNTUsIDU1KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGVxdWFsIGFub3RoZXIgc3RyaW5nIHdpdGggdGhlIHNhbWUgdmFsdWUiLAotICAgICAgICBzdHJpbmdVbmRlclRlc3QsIEJ5dGVTdHJpbmcud3JhcChyZWZlcmVuY2VCeXRlcykpOwotCi0gICAgYnl0ZVtdIG11bmdlZEJ5dGVzID0gbmV3IGJ5dGVbcmVmZXJlbmNlQnl0ZXMubGVuZ3RoXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHJlZmVyZW5jZUJ5dGVzLCAwLCBtdW5nZWRCeXRlcywgMCwgcmVmZXJlbmNlQnl0ZXMubGVuZ3RoKTsKLSAgICBtdW5nZWRCeXRlc1ttdW5nZWRCeXRlcy5sZW5ndGggLSA1XSA9IChieXRlKSAobXVuZ2VkQnl0ZXNbbXVuZ2VkQnl0ZXMubGVuZ3RoIC0gNV0gXiAweEZGKTsKLSAgICBhc3NlcnRGYWxzZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBub3QgZXF1YWwgZXZlcnkgc3RyaW5nIHdpdGggdGhlIHNhbWUgbGVuZ3RoIiwKLSAgICAgICAgc3RyaW5nVW5kZXJUZXN0LmVxdWFscyhCeXRlU3RyaW5nLndyYXAobXVuZ2VkQnl0ZXMpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGUoKSB7Ci0gICAgaW50IGhhc2ggPSBzdHJpbmdVbmRlclRlc3QuaGFzaENvZGUoKTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgaGF2ZSBleHBlY3RlZCBoYXNoQ29kZSIsIGV4cGVjdGVkSGFzaENvZGUsIGhhc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBlZWtDYWNoZWRIYXNoQ29kZSgpIHsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiLnBlZWtDYWNoZWRIYXNoQ29kZSgpIHNob3VsZCByZXR1cm4gemVybyBhdCBmaXJzdCIsIDAsCi0gICAgICAgIHN0cmluZ1VuZGVyVGVzdC5wZWVrQ2FjaGVkSGFzaENvZGUoKSk7Ci0gICAgc3RyaW5nVW5kZXJUZXN0Lmhhc2hDb2RlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIi5wZWVrQ2FjaGVkSGFzaENvZGUgc2hvdWxkIHJldHVybiB6ZXJvIGF0IGZpcnN0IiwKLSAgICAgICAgZXhwZWN0ZWRIYXNoQ29kZSwgc3RyaW5nVW5kZXJUZXN0LnBlZWtDYWNoZWRIYXNoQ29kZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJ0aWFsSGFzaCgpIHsKLSAgICAvLyBwYXJ0aWFsSGFzaCgpIGlzIG1vcmUgc3RyZW51b3VzbHkgdGVzdGVkIGVsc2V3aGVyZSBieSB0ZXN0aW5nIGhhc2hlcyBvZiBzdWJzdHJpbmdzLgotICAgIC8vIFRoaXMgdGVzdCB3b3VsZCBmYWlsIGlmIHRoZSBleHBlY3RlZCBoYXNoIHdlcmUgMS4gIEl0J3Mgbm90LgotICAgIGludCBoYXNoID0gc3RyaW5nVW5kZXJUZXN0LnBhcnRpYWxIYXNoKHN0cmluZ1VuZGVyVGVzdC5zaXplKCksIDAsIHN0cmluZ1VuZGVyVGVzdC5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIucGFydGlhbEhhc2goKSBtdXN0IHlpZWxkIGV4cGVjdGVkIGhhc2hDb2RlIiwKLSAgICAgICAgZXhwZWN0ZWRIYXNoQ29kZSwgaGFzaCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmV3SW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIElucHV0U3RyZWFtIGlucHV0ID0gc3RyaW5nVW5kZXJUZXN0Lm5ld0lucHV0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSByZXR1cm5zIGNvcnJlY3QgdmFsdWUiLAotICAgICAgICBzdHJpbmdVbmRlclRlc3Quc2l6ZSgpLCBpbnB1dC5hdmFpbGFibGUoKSk7Ci0gICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gdHJ1ZTsKLSAgICBmb3IgKGJ5dGUgcmVmZXJlbmNlQnl0ZSA6IHJlZmVyZW5jZUJ5dGVzKSB7Ci0gICAgICBpbnQgZXhwZWN0ZWRJbnQgPSAocmVmZXJlbmNlQnl0ZSAmIDB4RkYpOwotICAgICAgc3RpbGxFcXVhbCA9IChleHBlY3RlZEludCA9PSBpbnB1dC5yZWFkKCkpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLmF2YWlsYWJsZSgpIHJldHVybnMgY29ycmVjdCB2YWx1ZSIsCi0gICAgICAgIDAsIGlucHV0LmF2YWlsYWJsZSgpKTsKLSAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGdpdmUgdGhlIHNhbWUgYnl0ZXMgZnJvbSB0aGUgSW5wdXRTdHJlYW0iLCBzdGlsbEVxdWFsKTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIElucHV0U3RyZWFtIG11c3Qgbm93IGJlIGV4aGF1c3RlZCIsIC0xLCBpbnB1dC5yZWFkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5ld0lucHV0X3NraXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIElucHV0U3RyZWFtIGlucHV0ID0gc3RyaW5nVW5kZXJUZXN0Lm5ld0lucHV0KCk7Ci0gICAgaW50IHN0cmluZ1NpemUgPSBzdHJpbmdVbmRlclRlc3Quc2l6ZSgpOwotICAgIGludCBuZWFyRW5kSW5kZXggPSBzdHJpbmdTaXplICogMiAvIDM7Ci0gICAgbG9uZyBza2lwcGVkMSA9IGlucHV0LnNraXAobmVhckVuZEluZGV4KTsKLSAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLnNraXAoKSIsIHNraXBwZWQxLCBuZWFyRW5kSW5kZXgpOwotICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkiLAotICAgICAgICBzdHJpbmdTaXplIC0gc2tpcHBlZDEsIGlucHV0LmF2YWlsYWJsZSgpKTsKLSAgICBhc3NlcnRUcnVlKCJJbnB1dFN0cmVhbS5tYXJrKCkgaXMgYXZhaWxhYmxlIiwgaW5wdXQubWFya1N1cHBvcnRlZCgpKTsKLSAgICBpbnB1dC5tYXJrKDApOwotICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0uc2tpcCgpLCByZWFkKCkiLAotICAgICAgICBzdHJpbmdVbmRlclRlc3QuYnl0ZUF0KG5lYXJFbmRJbmRleCkgJiAweEZGLCBpbnB1dC5yZWFkKCkpOwotICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkiLAotICAgICAgICAgICAgICAgICBzdHJpbmdTaXplIC0gc2tpcHBlZDEgLSAxLCBpbnB1dC5hdmFpbGFibGUoKSk7Ci0gICAgbG9uZyBza2lwcGVkMiA9IGlucHV0LnNraXAoc3RyaW5nU2l6ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5za2lwKCkgaW5jb21wbGV0ZSIsCi0gICAgICAgIHNraXBwZWQyLCBzdHJpbmdTaXplIC0gc2tpcHBlZDEgLSAxKTsKLSAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLnNraXAoKSwgbm8gbW9yZSBpbnB1dCIsIDAsIGlucHV0LmF2YWlsYWJsZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLnNraXAoKSwgbm8gbW9yZSBpbnB1dCIsIC0xLCBpbnB1dC5yZWFkKCkpOwotICAgIGlucHV0LnJlc2V0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5yZXNldCgpIHN1Y2NlZGVkIiwKLSAgICAgICAgICAgICAgICAgc3RyaW5nU2l6ZSAtIHNraXBwZWQxLCBpbnB1dC5hdmFpbGFibGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5yZXNldCgpLCByZWFkKCkiLAotICAgICAgICBzdHJpbmdVbmRlclRlc3QuYnl0ZUF0KG5lYXJFbmRJbmRleCkgJiAweEZGLCBpbnB1dC5yZWFkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5ld0NvZGVkSW5wdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIENvZGVkSW5wdXRTdHJlYW0gY2lzID0gc3RyaW5nVW5kZXJUZXN0Lm5ld0NvZGVkSW5wdXQoKTsKLSAgICBieXRlW10gcm91bmRUcmlwQnl0ZXMgPSBjaXMucmVhZFJhd0J5dGVzKHJlZmVyZW5jZUJ5dGVzLmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBnaXZlIHRoZSBzYW1lIGJ5dGVzIGJhY2sgZnJvbSB0aGUgQ29kZWRJbnB1dFN0cmVhbSIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMocmVmZXJlbmNlQnl0ZXMsIHJvdW5kVHJpcEJ5dGVzKSk7Ci0gICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIgQ29kZWRJbnB1dFN0cmVhbSBtdXN0IG5vdyBiZSBleGhhdXN0ZWQiLCBjaXMuaXNBdEVuZCgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBNYWtlIHN1cmUgd2Uga2VlcCB0aGluZ3Mgc2ltcGxlIHdoZW4gY29uY2F0ZW5hdGluZyB3aXRoIGVtcHR5LiBTZWUgYWxzbwotICAgKiB7QGxpbmsgQnl0ZVN0cmluZ1Rlc3QjdGVzdENvbmNhdF9lbXB0eSgpfS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RDb25jYXRfZW1wdHkoKSB7Ci0gICAgYXNzZXJ0U2FtZShjbGFzc1VuZGVyVGVzdCArICIgY29uY2F0ZW5hdGVkIHdpdGggZW1wdHkgbXVzdCBnaXZlICIgKyBjbGFzc1VuZGVyVGVzdCwKLSAgICAgICAgc3RyaW5nVW5kZXJUZXN0LmNvbmNhdChCeXRlU3RyaW5nLkVNUFRZKSwgc3RyaW5nVW5kZXJUZXN0KTsKLSAgICBhc3NlcnRTYW1lKCJlbXB0eSBjb25jYXRlbmF0ZWQgd2l0aCAiICsgY2xhc3NVbmRlclRlc3QgKyAiIG11c3QgZ2l2ZSAiICsgY2xhc3NVbmRlclRlc3QsCi0gICAgICAgIEJ5dGVTdHJpbmcuRU1QVFkuY29uY2F0KHN0cmluZ1VuZGVyVGVzdCksIHN0cmluZ1VuZGVyVGVzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7Ci0gICAgb29zLndyaXRlT2JqZWN0KHN0cmluZ1VuZGVyVGVzdCk7Ci0gICAgb29zLmNsb3NlKCk7Ci0gICAgYnl0ZVtdIHBpY2tsZWQgPSBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwaWNrbGVkKTsKLSAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgIE9iamVjdCBvID0gb2lzLnJlYWRPYmplY3QoKTsKLSAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgZ2V0IGEgQnl0ZVN0cmluZyBiYWNrIiwgbyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpOwotICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGdldCBhbiBlcXVhbCBCeXRlU3RyaW5nIGJhY2siLCBzdHJpbmdVbmRlclRlc3QsIG8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xvbmdBcnJheUxpc3RUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xvbmdBcnJheUxpc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBhOGY5ZWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Mb25nQXJyYXlMaXN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDU5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgTG9uZ0FycmF5TGlzdH0uCi0gKiAKLSAqIEBhdXRob3IgZHdlaXNAZ29vZ2xlLmNvbSAoRGFuaWVsIFdlaXMpCi0gKi8KLXB1YmxpYyBjbGFzcyBMb25nQXJyYXlMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdBcnJheUxpc3QgVU5BUllfTElTVCA9IG5ld0ltbXV0YWJsZUxvbmdBcnJheUxpc3QoMSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdBcnJheUxpc3QgVEVSVElBUllfTElTVCA9Ci0gICAgICBuZXdJbW11dGFibGVMb25nQXJyYXlMaXN0KDEsIDIsIDMpOwotICAKLSAgcHJpdmF0ZSBMb25nQXJyYXlMaXN0IGxpc3Q7Ci0gIAotICBAT3ZlcnJpZGUKLSAgcHJvdGVjdGVkIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBsaXN0ID0gbmV3IExvbmdBcnJheUxpc3QoKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEVtcHR5TGlzdFJldHVybnNTYW1lSW5zdGFuY2UoKSB7Ci0gICAgYXNzZXJ0U2FtZShMb25nQXJyYXlMaXN0LmVtcHR5TGlzdCgpLCBMb25nQXJyYXlMaXN0LmVtcHR5TGlzdCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEVtcHR5TGlzdElzSW1tdXRhYmxlKCkgewotICAgIGFzc2VydEltbXV0YWJsZShMb25nQXJyYXlMaXN0LmVtcHR5TGlzdCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1ha2VJbW11dGFibGUoKSB7Ci0gICAgbGlzdC5hZGRMb25nKDIpOwotICAgIGxpc3QuYWRkTG9uZyg0KTsKLSAgICBsaXN0LmFkZExvbmcoNik7Ci0gICAgbGlzdC5hZGRMb25nKDgpOwotICAgIGxpc3QubWFrZUltbXV0YWJsZSgpOwotICAgIGFzc2VydEltbXV0YWJsZShsaXN0KTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1vZGlmaWNhdGlvbldpdGhJdGVyYXRpb24oKSB7Ci0gICAgbGlzdC5hZGRBbGwoYXNMaXN0KDFMLCAyTCwgM0wsIDRMKSk7Ci0gICAgSXRlcmF0b3I8TG9uZz4gaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgKGxvbmcpIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgKGxvbmcpIGl0ZXJhdG9yLm5leHQoKSk7Ci0gICAgbGlzdC5zZXQoMCwgMUwpOwotICAgIGFzc2VydEVxdWFscygyLCAobG9uZykgaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICB0cnkgewotICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgbGlzdC5hZGQoMCwgMEwpOwotICAgIHRyeSB7Ci0gICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEdldCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMSwgKGxvbmcpIFRFUlRJQVJZX0xJU1QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgKGxvbmcpIFRFUlRJQVJZX0xJU1QuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgKGxvbmcpIFRFUlRJQVJZX0xJU1QuZ2V0KDIpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgVEVSVElBUllfTElTVC5nZXQoLTEpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIFRFUlRJQVJZX0xJU1QuZ2V0KDMpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRMb25nKCkgewotICAgIGFzc2VydEVxdWFscygxLCBURVJUSUFSWV9MSVNULmdldExvbmcoMCkpOwotICAgIGFzc2VydEVxdWFscygyLCBURVJUSUFSWV9MSVNULmdldExvbmcoMSkpOwotICAgIGFzc2VydEVxdWFscygzLCBURVJUSUFSWV9MSVNULmdldExvbmcoMikpOwotICAgIAotICAgIHRyeSB7Ci0gICAgICBURVJUSUFSWV9MSVNULmdldCgtMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgVEVSVElBUllfTElTVC5nZXQoMyk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNpemUoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIExvbmdBcnJheUxpc3QuZW1wdHlMaXN0KCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgVU5BUllfTElTVC5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBURVJUSUFSWV9MSVNULnNpemUoKSk7Ci0KLSAgICBsaXN0LmFkZExvbmcoMik7Ci0gICAgbGlzdC5hZGRMb25nKDQpOwotICAgIGxpc3QuYWRkTG9uZyg2KTsKLSAgICBsaXN0LmFkZExvbmcoOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGxpc3Quc2l6ZSgpKTsKLSAgICAKLSAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotICAgIAotICAgIGxpc3QuYWRkKDE2TCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGxpc3Quc2l6ZSgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFNldCgpIHsKLSAgICBsaXN0LmFkZExvbmcoMik7Ci0gICAgbGlzdC5hZGRMb25nKDQpOwotICAgIAotICAgIGFzc2VydEVxdWFscygyLCAobG9uZykgbGlzdC5zZXQoMCwgMEwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRMb25nKDApKTsKLQotICAgIGFzc2VydEVxdWFscyg0LCAobG9uZykgbGlzdC5zZXQoMSwgMEwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXRMb25nKDEpKTsKLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoLTEsIDBMKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDIsIDBMKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2V0TG9uZygpIHsKLSAgICBsaXN0LmFkZExvbmcoMik7Ci0gICAgbGlzdC5hZGRMb25nKDQpOwotICAgIAotICAgIGFzc2VydEVxdWFscygyLCBsaXN0LnNldExvbmcoMCwgMCkpOwotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LmdldExvbmcoMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDQsIGxpc3Quc2V0TG9uZygxLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3QuZ2V0TG9uZygxKSk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0TG9uZygtMSwgMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LnNldExvbmcoMiwgMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdEFkZCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5zaXplKCkpOwotCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZCgyTCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMkwpLCBsaXN0KTsKLQotICAgIGFzc2VydFRydWUobGlzdC5hZGQoM0wpKTsKLSAgICBsaXN0LmFkZCgwLCA0TCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCg0TCwgMkwsIDNMKSwgbGlzdCk7Ci0gICAgCi0gICAgbGlzdC5hZGQoMCwgMUwpOwotICAgIGxpc3QuYWRkKDAsIDBMKTsKLSAgICAvLyBGb3JjZSBhIHJlc2l6ZSBieSBnZXR0aW5nIHVwIHRvIDExIGVsZW1lbnRzLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBsaXN0LmFkZChMb25nLnZhbHVlT2YoNSArIGkpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgwTCwgMUwsIDRMLCAyTCwgM0wsIDVMLCA2TCwgN0wsIDhMLCA5TCwgMTBMKSwgbGlzdCk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKC0xLCA1TCk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoNCwgNUwpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RBZGRMb25nKCkgewotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LnNpemUoKSk7Ci0KLSAgICBsaXN0LmFkZExvbmcoMik7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyTCksIGxpc3QpOwotCi0gICAgbGlzdC5hZGRMb25nKDMpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMkwsIDNMKSwgbGlzdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RBZGRBbGwoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGxpc3Quc2l6ZSgpKTsKLQotICAgIGFzc2VydFRydWUobGlzdC5hZGRBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKDFMKSkpOwotICAgIGFzc2VydEVxdWFscygxLCBsaXN0LnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIChsb25nKSBsaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGxpc3QuZ2V0TG9uZygwKSk7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZShsaXN0LmFkZEFsbChhc0xpc3QoMkwsIDNMLCA0TCwgNUwsIDZMKSkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMUwsIDJMLCAzTCwgNEwsIDVMLCA2TCksIGxpc3QpOwotICAgIAotICAgIGFzc2VydFRydWUobGlzdC5hZGRBbGwoVEVSVElBUllfTElTVCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMUwsIDJMLCAzTCwgNEwsIDVMLCA2TCwgMUwsIDJMLCAzTCksIGxpc3QpOwotCi0gICAgYXNzZXJ0RmFsc2UobGlzdC5hZGRBbGwoQ29sbGVjdGlvbnMuPExvbmc+ZW1wdHlMaXN0KCkpKTsKLSAgICBhc3NlcnRGYWxzZShsaXN0LmFkZEFsbChMb25nQXJyYXlMaXN0LmVtcHR5TGlzdCgpKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0gICAgbGlzdC5hZGRBbGwoVEVSVElBUllfTElTVCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIChsb25nKSBsaXN0LnJlbW92ZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyTCwgM0wpLCBsaXN0KTsKLQotICAgIGFzc2VydFRydWUobGlzdC5yZW1vdmUoM0wpKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDJMKSwgbGlzdCk7Ci0KLSAgICBhc3NlcnRGYWxzZShsaXN0LnJlbW92ZSgzTCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoMkwpLCBsaXN0KTsKLQotICAgIGFzc2VydEVxdWFscygyLCAobG9uZykgbGlzdC5yZW1vdmUoMCkpOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgbGlzdCk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKC0xKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHZvaWQgYXNzZXJ0SW1tdXRhYmxlKExvbmdBcnJheUxpc3QgbGlzdCkgewotICAgIGlmIChsaXN0LmNvbnRhaW5zKDFMKSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIkNhbm5vdCB0ZXN0IHRoZSBpbW11dGFiaWxpdHkgb2YgbGlzdHMgdGhhdCBjb250YWluIDEuIik7Ci0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZCgxTCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKDAsIDFMKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoQ29sbGVjdGlvbnMuPExvbmc+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b25MaXN0KDFMKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKG5ldyBMb25nQXJyYXlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgQ29sbGVjdGlvbnMuc2luZ2xldG9uKDFMKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKDAsIFVOQVJZX0xJU1QpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbCgwLCBDb2xsZWN0aW9ucy48TG9uZz5lbXB0eUxpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkTG9uZygwKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5jbGVhcigpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKDEpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZShuZXcgT2JqZWN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChDb2xsZWN0aW9ucy48TG9uZz5lbXB0eUxpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlQWxsKENvbGxlY3Rpb25zLnNpbmdsZXRvbigxTCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZUFsbChVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoQ29sbGVjdGlvbnMuPExvbmc+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJldGFpbkFsbChDb2xsZWN0aW9ucy5zaW5nbGV0b24oMUwpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoVU5BUllfTElTVCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDAsIDBMKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5zZXRMb25nKDAsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBMb25nQXJyYXlMaXN0IG5ld0ltbXV0YWJsZUxvbmdBcnJheUxpc3QobG9uZy4uLiBlbGVtZW50cykgewotICAgIExvbmdBcnJheUxpc3QgbGlzdCA9IG5ldyBMb25nQXJyYXlMaXN0KCk7Ci0gICAgZm9yIChsb25nIGVsZW1lbnQgOiBlbGVtZW50cykgewotICAgICAgbGlzdC5hZGRMb25nKGVsZW1lbnQpOwotICAgIH0KLSAgICBsaXN0Lm1ha2VJbW11dGFibGUoKTsKLSAgICByZXR1cm4gbGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NYXBGb3JQcm90bzJMaXRlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NYXBGb3JQcm90bzJMaXRlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzlkMDAyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWFwRm9yUHJvdG8yTGl0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ1OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgbWFwX2xpdGVfdGVzdC5NYXBGb3JQcm90bzJUZXN0UHJvdG8uVGVzdE1hcDsKLWltcG9ydCBtYXBfbGl0ZV90ZXN0Lk1hcEZvclByb3RvMlRlc3RQcm90by5UZXN0TWFwLk1lc3NhZ2VWYWx1ZTsKLWltcG9ydCBtYXBfbGl0ZV90ZXN0Lk1hcEZvclByb3RvMlRlc3RQcm90by5UZXN0VW5rbm93bkVudW1WYWx1ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIG1hcCBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBGb3JQcm90bzJMaXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSB2b2lkIHNldE1hcFZhbHVlcyhUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDEsIDExKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgyLCAyMik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMywgMzMpOwotCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1N0cmluZ0ZpZWxkKCkucHV0KDEsICIxMSIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TdHJpbmdGaWVsZCgpLnB1dCgyLCAiMjIiKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoMywgIjMzIik7Ci0gICAgCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5wdXQoMSwgVGVzdFV0aWwudG9CeXRlcygiMTEiKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5wdXQoMiwgVGVzdFV0aWwudG9CeXRlcygiMjIiKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5wdXQoMywgVGVzdFV0aWwudG9CeXRlcygiMzMiKSk7Ci0gICAgCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZCgpLnB1dCgxLCBUZXN0TWFwLkVudW1WYWx1ZS5GT08pOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5wdXQoMiwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCkucHV0KDMsIFRlc3RNYXAuRW51bVZhbHVlLkJBWik7Ci0gICAgCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb01lc3NhZ2VGaWVsZCgpLnB1dCgKLSAgICAgICAgMSwgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgxMSkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb01lc3NhZ2VGaWVsZCgpLnB1dCgKLSAgICAgICAgMiwgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgyMikuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb01lc3NhZ2VGaWVsZCgpLnB1dCgKLSAgICAgICAgMywgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgzMykuYnVpbGQoKSk7Ci0gICAgCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlU3RyaW5nVG9JbnQzMkZpZWxkKCkucHV0KCIxIiwgMTEpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJGaWVsZCgpLnB1dCgiMiIsIDIyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVTdHJpbmdUb0ludDMyRmllbGQoKS5wdXQoIjMiLCAzMyk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgY29weU1hcFZhbHVlcyhUZXN0TWFwIHNvdXJjZSwgVGVzdE1hcC5CdWlsZGVyIGRlc3RpbmF0aW9uKSB7Ci0gICAgZGVzdGluYXRpb24KLSAgICAgICAgLnB1dEFsbEludDMyVG9JbnQzMkZpZWxkKHNvdXJjZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKQotICAgICAgICAucHV0QWxsSW50MzJUb1N0cmluZ0ZpZWxkKHNvdXJjZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKSkKLSAgICAgICAgLnB1dEFsbEludDMyVG9CeXRlc0ZpZWxkKHNvdXJjZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpKQotICAgICAgICAucHV0QWxsSW50MzJUb0VudW1GaWVsZChzb3VyY2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpKQotICAgICAgICAucHV0QWxsSW50MzJUb01lc3NhZ2VGaWVsZChzb3VyY2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpKQotICAgICAgICAucHV0QWxsU3RyaW5nVG9JbnQzMkZpZWxkKHNvdXJjZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0TWFwVmFsdWVzU2V0KFRlc3RNYXAgbWVzc2FnZSkgewotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTEsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMSkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIyLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDIpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygzMywgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgzKS5pbnRWYWx1ZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxMSIsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjIyIiwgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5nZXQoMikpOwotICAgIGFzc2VydEVxdWFscygiMzMiLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLmdldCgzKSk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC50b0J5dGVzKCIxMSIpLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwudG9CeXRlcygiMjIiKSwgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLmdldCgyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLnRvQnl0ZXMoIjMzIiksIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5nZXQoMykpOwotICAgIAotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5GT08sIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLkJBUiwgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDIpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE1hcC5FbnVtVmFsdWUuQkFaLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5nZXQoMykpOwotICAgIAotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxMSwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDEpLmdldFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygyMiwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDIpLmdldFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygzMywgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDMpLmdldFZhbHVlKCkpOwotICAgIAotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLmdldCgiMSIpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygyMiwgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5nZXQoIjIiKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzMsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuZ2V0KCIzIikuaW50VmFsdWUoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTWFwVmFsdWVzKFRlc3RNYXAuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMTExKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnJlbW92ZSgyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCg0LCA0NCk7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoMSwgIjExMSIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TdHJpbmdGaWVsZCgpLnJlbW92ZSgyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoNCwgIjQ0Iik7Ci0gICAgCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5wdXQoMSwgVGVzdFV0aWwudG9CeXRlcygiMTExIikpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9CeXRlc0ZpZWxkKCkucmVtb3ZlKDIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9CeXRlc0ZpZWxkKCkucHV0KDQsIFRlc3RVdGlsLnRvQnl0ZXMoIjQ0IikpOwotICAgIAotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5wdXQoMSwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCkucmVtb3ZlKDIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5wdXQoNCwgVGVzdE1hcC5FbnVtVmFsdWUuUVVYKTsKLSAgICAKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAxLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDExMSkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb01lc3NhZ2VGaWVsZCgpLnJlbW92ZSgyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICA0LCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDQ0KS5idWlsZCgpKTsKLSAgICAKLSAgICBidWlsZGVyLmdldE11dGFibGVTdHJpbmdUb0ludDMyRmllbGQoKS5wdXQoIjEiLCAxMTEpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJGaWVsZCgpLnJlbW92ZSgiMiIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJGaWVsZCgpLnB1dCgiNCIsIDQ0KTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRNYXBWYWx1ZXNVcGRhdGVkKFRlc3RNYXAgbWVzc2FnZSkgewotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTExLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDEpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygzMywgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgzKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDQsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoNCkuaW50VmFsdWUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiMTExIiwgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5nZXQoMSkpOwotICAgIGFzc2VydEVxdWFscygiMzMiLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLmdldCgzKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCI0NCIsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuZ2V0KDQpKTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLnRvQnl0ZXMoIjExMSIpLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwudG9CeXRlcygiMzMiKSwgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLmdldCgzKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLnRvQnl0ZXMoIjQ0IiksIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5nZXQoNCkpOwotICAgIAotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5CQVIsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLkJBWiwgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE1hcC5FbnVtVmFsdWUuUVVYLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5nZXQoNCkpOwotICAgIAotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxMTEsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLmdldCgxKS5nZXRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzMsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLmdldCgzKS5nZXRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDQsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLmdldCg0KS5nZXRWYWx1ZSgpKTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxMTEsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuZ2V0KCIxIikuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMzLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLmdldCgiMyIpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg0NCwgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5nZXQoIjQiKS5pbnRWYWx1ZSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRNYXBWYWx1ZXNDbGVhcmVkKFRlc3RNYXAgbWVzc2FnZSkgewotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5zaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNhbml0eUNvcHlPbldyaXRlKCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgLy8gU2luY2UgYnVpbGRlcnMgYXJlIGltcGxlbWVudGVkIGFzIGEgdGhpbiB3cmFwcGVyIGFyb3VuZCBhIG1lc3NhZ2UKLSAgICAvLyBpbnN0YW5jZSwgd2UgYXR0ZW1wdCB0byB2ZXJpZnkgdGhhdCB3ZSBjYW4ndCBjYXVzZSB0aGUgYnVpbGRlciB0byBtb2RpZnkKLSAgICAvLyBhIHByb2R1Y2VkIG1lc3NhZ2UuCi0gICAgCi0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgTWFwPEludGVnZXIsIEludGVnZXI+IGludE1hcCA9IGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCk7Ci0gICAgaW50TWFwLnB1dCgxLCAyKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5pc0VtcHR5KCkpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5wdXQoMiwgMyk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAyKSwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBidWlsZGVyLmdldEludDMyVG9JbnQzMkZpZWxkKCkpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDIsIDMpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAyLCAyLCAzKSwgYnVpbGRlci5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE11dGFibGVNYXBMaWZlY3ljbGUoKSB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gaW50TWFwID0gYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKTsKLSAgICBpbnRNYXAucHV0KDEsIDIpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgICB0cnkgewotICAgICAgaW50TWFwLnB1dCgyLCAzKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBidWlsZGVyLmdldEludDMyVG9JbnQzMkZpZWxkKCkpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDIsIDMpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiwgMiwgMyksIGJ1aWxkZXIuZ2V0SW50MzJUb0ludDMyRmllbGQoKSk7Ci0KLSAgICBNYXA8SW50ZWdlciwgVGVzdE1hcC5FbnVtVmFsdWU+IGVudW1NYXAgPSBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCk7Ci0gICAgZW51bU1hcC5wdXQoMSwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIFRlc3RNYXAuRW51bVZhbHVlLkJBUiksIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvRW51bUZpZWxkKCkpOwotICAgIHRyeSB7Ci0gICAgICBlbnVtTWFwLnB1dCgyLCBUZXN0TWFwLkVudW1WYWx1ZS5GT08pOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSKSwgYnVpbGRlci5nZXRJbnQzMlRvRW51bUZpZWxkKCkpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5wdXQoMiwgVGVzdE1hcC5FbnVtVmFsdWUuRk9PKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIG5ld01hcCgxLCBUZXN0TWFwLkVudW1WYWx1ZS5CQVIsIDIsIFRlc3RNYXAuRW51bVZhbHVlLkZPTyksCi0gICAgICAgIGJ1aWxkZXIuZ2V0SW50MzJUb0VudW1GaWVsZCgpKTsKLSAgICAKLSAgICBNYXA8SW50ZWdlciwgU3RyaW5nPiBzdHJpbmdNYXAgPSBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKTsKLSAgICBzdHJpbmdNYXAucHV0KDEsICIxIik7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAiMSIpLCBidWlsZGVyLmJ1aWxkKCkuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkpOwotICAgIHRyeSB7Ci0gICAgICBzdHJpbmdNYXAucHV0KDIsICIyIik7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAiMSIpLCBidWlsZGVyLmdldEludDMyVG9TdHJpbmdGaWVsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoMiwgIjIiKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIG5ld01hcCgxLCAiMSIsIDIsICIyIiksCi0gICAgICAgIGJ1aWxkZXIuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkpOwotICAgIAotICAgIE1hcDxJbnRlZ2VyLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZT4gbWVzc2FnZU1hcCA9IGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9NZXNzYWdlRmllbGQoKTsKLSAgICBtZXNzYWdlTWFwLnB1dCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSksCi0gICAgICAgIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkpOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlTWFwLnB1dCgyLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSksCi0gICAgICAgIGJ1aWxkZXIuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KDIsIFRlc3RNYXAuTWVzc2FnZVZhbHVlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIG5ld01hcCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgIDIsIFRlc3RNYXAuTWVzc2FnZVZhbHVlLmdldERlZmF1bHRJbnN0YW5jZSgpKSwKLSAgICAgICAgYnVpbGRlci5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE11dGFibGVNYXBMaWZlY3ljbGVfY29sbGVjdGlvbnMoKSB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gaW50TWFwID0gYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKTsKLSAgICBpbnRNYXAucHV0KDEsIDIpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgICB0cnkgewotICAgICAgaW50TWFwLnJlbW92ZSgyKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICB0cnkgewotICAgICAgaW50TWFwLmVudHJ5U2V0KCkucmVtb3ZlKG5ldyBPYmplY3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5rZXlTZXQoKS5yZW1vdmUobmV3IE9iamVjdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICB0cnkgewotICAgICAgaW50TWFwLnZhbHVlcygpLnJlbW92ZShuZXcgT2JqZWN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBpbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKS5yZW1vdmUoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBpbnRNYXApOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIGJ1aWxkZXIuZ2V0SW50MzJUb0ludDMyRmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAyKSwgYnVpbGRlci5idWlsZCgpLmdldEludDMyVG9JbnQzMkZpZWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldHRlcnNBbmRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzQ2xlYXJlZChtZXNzYWdlKTsKLSAgICAKLSAgICBidWlsZGVyID0gbWVzc2FnZS50b0J1aWxkZXIoKTsKLSAgICBzZXRNYXBWYWx1ZXMoYnVpbGRlcik7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRNYXBWYWx1ZXNTZXQobWVzc2FnZSk7Ci0gICAgCi0gICAgYnVpbGRlciA9IG1lc3NhZ2UudG9CdWlsZGVyKCk7Ci0gICAgdXBkYXRlTWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzVXBkYXRlZChtZXNzYWdlKTsKLSAgICAKLSAgICBidWlsZGVyID0gbWVzc2FnZS50b0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRNYXBWYWx1ZXNDbGVhcmVkKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFB1dEFsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBzb3VyY2VCdWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKHNvdXJjZUJ1aWxkZXIpOwotICAgIFRlc3RNYXAgc291cmNlID0gc291cmNlQnVpbGRlci5idWlsZCgpOwotCi0gICAgVGVzdE1hcC5CdWlsZGVyIGRlc3RpbmF0aW9uID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgY29weU1hcFZhbHVlcyhzb3VyY2UsIGRlc3RpbmF0aW9uKTsKLSAgICBhc3NlcnRNYXBWYWx1ZXNTZXQoZGVzdGluYXRpb24uYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplQW5kUGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIHNldE1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSwgbWVzc2FnZS50b0J5dGVTdHJpbmcoKS5zaXplKCkpOwotICAgIG1lc3NhZ2UgPSBUZXN0TWFwLnBhcnNlcigpLnBhcnNlRnJvbShtZXNzYWdlLnRvQnl0ZVN0cmluZygpKTsKLSAgICBhc3NlcnRNYXBWYWx1ZXNTZXQobWVzc2FnZSk7Ci0gICAgCi0gICAgYnVpbGRlciA9IG1lc3NhZ2UudG9CdWlsZGVyKCk7Ci0gICAgdXBkYXRlTWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSwgbWVzc2FnZS50b0J5dGVTdHJpbmcoKS5zaXplKCkpOwotICAgIG1lc3NhZ2UgPSBUZXN0TWFwLnBhcnNlcigpLnBhcnNlRnJvbShtZXNzYWdlLnRvQnl0ZVN0cmluZygpKTsKLSAgICBhc3NlcnRNYXBWYWx1ZXNVcGRhdGVkKG1lc3NhZ2UpOwotICAgIAotICAgIGJ1aWxkZXIgPSBtZXNzYWdlLnRvQnVpbGRlcigpOwotICAgIGJ1aWxkZXIuY2xlYXIoKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksIG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkuc2l6ZSgpKTsKLSAgICBtZXNzYWdlID0gVGVzdE1hcC5wYXJzZXIoKS5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzQ2xlYXJlZChtZXNzYWdlKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIFRlc3RNYXAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAKLSAgICBUZXN0TWFwLkJ1aWxkZXIgb3RoZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBvdGhlci5tZXJnZUZyb20obWVzc2FnZSk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzU2V0KG90aGVyLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0FuZEhhc2hDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCB0aGF0IGdlbmVyYXRlZCBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSB3aWxsIGRpc3JlZ2FyZCB0aGUgb3JkZXIKLSAgICAvLyBvZiBtYXAgZW50cmllcyB3aGVuIGNvbXBhcmluZy9oYXNoaW5nIG1hcCBmaWVsZHMuCi0gICAgCi0gICAgLy8gV2UgY2FuJ3QgY29udHJvbCB0aGUgb3JkZXIgb2YgZWxlbWVudHMgaW4gYSBIYXNoTWFwLiBUaGUgYmVzdCB3ZSBjYW4gZG8KLSAgICAvLyBoZXJlIGlzIHRvIGFkZCBlbGVtZW50cyBpbiBkaWZmZXJlbnQgb3JkZXIuCi0gICAgVGVzdE1hcC5CdWlsZGVyIGIxID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgYjEuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDEsIDIpOwotICAgIGIxLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgzLCA0KTsKLSAgICBiMS5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoNSwgNik7Ci0gICAgVGVzdE1hcCBtMSA9IGIxLmJ1aWxkKCk7Ci0gICAgCi0gICAgVGVzdE1hcC5CdWlsZGVyIGIyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgYjIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDUsIDYpOwotICAgIGIyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgxLCAyKTsKLSAgICBiMi5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMywgNCk7Ci0gICAgVGVzdE1hcCBtMiA9IGIyLmJ1aWxkKCk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKG0xLCBtMik7Ci0gICAgYXNzZXJ0RXF1YWxzKG0xLmhhc2hDb2RlKCksIG0yLmhhc2hDb2RlKCkpOwotICAgIAotICAgIC8vIE1ha2Ugc3VyZSB3ZSBkaWQgY29tcGFyZSBtYXAgZmllbGRzLgotICAgIGIyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgxLCAwKTsKLSAgICBtMiA9IGIyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2UobTEuZXF1YWxzKG0yKSk7Ci0gICAgLy8gRG9uJ3QgY2hlY2sgbTEuaGFzaENvZGUoKSAhPSBtMi5oYXNoQ29kZSgpIGJlY2F1c2UgaXQncyBub3QgZ3VhcmFudGVlZAotICAgIC8vIHRvIGJlIGRpZmZlcmVudC4KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRW51bVZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RVbmtub3duRW51bVZhbHVlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgIFRlc3RVbmtub3duRW51bVZhbHVlLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgxLCAxKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgyLCA1NDMyMSk7Ci0gICAgQnl0ZVN0cmluZyBkYXRhID0gYnVpbGRlci5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotCi0gICAgVGVzdE1hcCBtZXNzYWdlID0gVGVzdE1hcC5wYXJzZUZyb20oZGF0YSk7Ci0gICAgLy8gRW50cmllcyB3aXRoIHVua25vd24gZW51bSB2YWx1ZXMgd2lsbCBiZSBzdG9yZWQgaW50byBVbmtub3duRmllbGRTZXQgc28KLSAgICAvLyB0aGVyZSBpcyBvbmx5IG9uZSBlbnRyeSBpbiB0aGUgbWFwLgotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5CQVIsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCgxKSk7Ci0gICAgLy8gU2VyaWFsaXppbmcgYW5kIHBhcnNpbmcgc2hvdWxkIHByZXNlcnZlIHRoZSB1bmtub3duIGVudHJ5LgotICAgIGRhdGEgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIFRlc3RVbmtub3duRW51bVZhbHVlIG1lc3NhZ2VXaXRoVW5rbm93bkVudW1zID0KLSAgICAgICAgVGVzdFVua25vd25FbnVtVmFsdWUucGFyc2VGcm9tKGRhdGEpOwotICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlV2l0aFVua25vd25FbnVtcy5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VXaXRoVW5rbm93bkVudW1zLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDEpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg1NDMyMSwgbWVzc2FnZVdpdGhVbmtub3duRW51bXMuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMikuaW50VmFsdWUoKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRpb25PcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIFRlc3RNYXAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIxIiwgIjIiLCAiMyIpLAotICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4obWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5rZXlTZXQoKSkpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyA8SywgVj4gTWFwPEssIFY+IG5ld01hcChLIGtleTEsIFYgdmFsdWUxKSB7Ci0gICAgTWFwPEssIFY+IG1hcCA9IG5ldyBIYXNoTWFwPEssIFY+KCk7Ci0gICAgbWFwLnB1dChrZXkxLCB2YWx1ZTEpOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gbmV3TWFwKEsga2V5MSwgViB2YWx1ZTEsIEsga2V5MiwgViB2YWx1ZTIpIHsKLSAgICBNYXA8SywgVj4gbWFwID0gbmV3IEhhc2hNYXA8SywgVj4oKTsKLSAgICBtYXAucHV0KGtleTEsIHZhbHVlMSk7Ci0gICAgbWFwLnB1dChrZXkyLCB2YWx1ZTIpOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWFwRm9yUHJvdG8yVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NYXBGb3JQcm90bzJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczMTU0YzAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NYXBGb3JQcm90bzJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IG1hcF90ZXN0Lk1hcEZvclByb3RvMlRlc3RQcm90by5UZXN0TWFwOwotaW1wb3J0IG1hcF90ZXN0Lk1hcEZvclByb3RvMlRlc3RQcm90by5UZXN0TWFwLk1lc3NhZ2VWYWx1ZTsKLWltcG9ydCBtYXBfdGVzdC5NYXBGb3JQcm90bzJUZXN0UHJvdG8uVGVzdE1hcC5NZXNzYWdlV2l0aFJlcXVpcmVkRmllbGRzOwotaW1wb3J0IG1hcF90ZXN0Lk1hcEZvclByb3RvMlRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWFwOwotaW1wb3J0IG1hcF90ZXN0Lk1hcEZvclByb3RvMlRlc3RQcm90by5UZXN0VW5rbm93bkVudW1WYWx1ZTsKLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBVbml0IHRlc3RzIGZvciBtYXAgZmllbGRzIGluIHByb3RvMiBwcm90b3MuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBGb3JQcm90bzJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIHZvaWQgc2V0TWFwVmFsdWVzKFRlc3RNYXAuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMTEpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDIsIDIyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgzLCAzMyk7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoMSwgIjExIik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1N0cmluZ0ZpZWxkKCkucHV0KDIsICIyMiIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TdHJpbmdGaWVsZCgpLnB1dCgzLCAiMzMiKTsKLSAgICAKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvQnl0ZXNGaWVsZCgpLnB1dCgxLCBUZXN0VXRpbC50b0J5dGVzKCIxMSIpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvQnl0ZXNGaWVsZCgpLnB1dCgyLCBUZXN0VXRpbC50b0J5dGVzKCIyMiIpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvQnl0ZXNGaWVsZCgpLnB1dCgzLCBUZXN0VXRpbC50b0J5dGVzKCIzMyIpKTsKLSAgICAKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCkucHV0KDEsIFRlc3RNYXAuRW51bVZhbHVlLkZPTyk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZCgpLnB1dCgyLCBUZXN0TWFwLkVudW1WYWx1ZS5CQVIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5wdXQoMywgVGVzdE1hcC5FbnVtVmFsdWUuQkFaKTsKLSAgICAKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAxLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDExKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAyLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDIyKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAzLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDMzKS5idWlsZCgpKTsKLSAgICAKLSAgICBidWlsZGVyLmdldE11dGFibGVTdHJpbmdUb0ludDMyRmllbGQoKS5wdXQoIjEiLCAxMSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU3RyaW5nVG9JbnQzMkZpZWxkKCkucHV0KCIyIiwgMjIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJGaWVsZCgpLnB1dCgiMyIsIDMzKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjb3B5TWFwVmFsdWVzKFRlc3RNYXAgc291cmNlLCBUZXN0TWFwLkJ1aWxkZXIgZGVzdGluYXRpb24pIHsKLSAgICBkZXN0aW5hdGlvbgotICAgICAgICAucHV0QWxsSW50MzJUb0ludDMyRmllbGQoc291cmNlLmdldEludDMyVG9JbnQzMkZpZWxkKCkpCi0gICAgICAgIC5wdXRBbGxJbnQzMlRvU3RyaW5nRmllbGQoc291cmNlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpKQotICAgICAgICAucHV0QWxsSW50MzJUb0J5dGVzRmllbGQoc291cmNlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkpCi0gICAgICAgIC5wdXRBbGxJbnQzMlRvRW51bUZpZWxkKHNvdXJjZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkpCi0gICAgICAgIC5wdXRBbGxJbnQzMlRvTWVzc2FnZUZpZWxkKHNvdXJjZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkpCi0gICAgICAgIC5wdXRBbGxTdHJpbmdUb0ludDMyRmllbGQoc291cmNlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRNYXBWYWx1ZXNTZXQoVGVzdE1hcCBtZXNzYWdlKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxMSwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgxKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMjIsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMikuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMzLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDMpLmludFZhbHVlKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjExIiwgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5nZXQoMSkpOwotICAgIGFzc2VydEVxdWFscygiMjIiLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLmdldCgyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIzMyIsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuZ2V0KDMpKTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLnRvQnl0ZXMoIjExIiksIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5nZXQoMSkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC50b0J5dGVzKCIyMiIpLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuZ2V0KDIpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwudG9CeXRlcygiMzMiKSwgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLmdldCgzKSk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLkZPTywgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE1hcC5FbnVtVmFsdWUuQkFSLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5nZXQoMikpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5CQVosIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCgzKSk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoMSkuZ2V0VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIyLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoMikuZ2V0VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMzLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoMykuZ2V0VmFsdWUoKSk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTEsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuZ2V0KCIxIikuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIyLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLmdldCgiMiIpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygzMywgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5nZXQoIjMiKS5pbnRWYWx1ZSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB1cGRhdGVNYXBWYWx1ZXMoVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgxLCAxMTEpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucmVtb3ZlKDIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDQsIDQ0KTsKLQotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TdHJpbmdGaWVsZCgpLnB1dCgxLCAiMTExIik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1N0cmluZ0ZpZWxkKCkucmVtb3ZlKDIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TdHJpbmdGaWVsZCgpLnB1dCg0LCAiNDQiKTsKLSAgICAKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvQnl0ZXNGaWVsZCgpLnB1dCgxLCBUZXN0VXRpbC50b0J5dGVzKCIxMTEiKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5yZW1vdmUoMik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5wdXQoNCwgVGVzdFV0aWwudG9CeXRlcygiNDQiKSk7Ci0gICAgCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZCgpLnB1dCgxLCBUZXN0TWFwLkVudW1WYWx1ZS5CQVIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5yZW1vdmUoMik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZCgpLnB1dCg0LCBUZXN0TWFwLkVudW1WYWx1ZS5RVVgpOwotICAgIAotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9NZXNzYWdlRmllbGQoKS5wdXQoCi0gICAgICAgIDEsIE1lc3NhZ2VWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMTExKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucmVtb3ZlKDIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9NZXNzYWdlRmllbGQoKS5wdXQoCi0gICAgICAgIDQsIE1lc3NhZ2VWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoNDQpLmJ1aWxkKCkpOwotICAgIAotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJGaWVsZCgpLnB1dCgiMSIsIDExMSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU3RyaW5nVG9JbnQzMkZpZWxkKCkucmVtb3ZlKCIyIik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU3RyaW5nVG9JbnQzMkZpZWxkKCkucHV0KCI0IiwgNDQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydE1hcFZhbHVlc1VwZGF0ZWQoVGVzdE1hcCBtZXNzYWdlKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxMTEsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMSkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMzLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDMpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg0NCwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCg0KS5pbnRWYWx1ZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxMTEiLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIzMyIsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuZ2V0KDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQ0IiwgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5nZXQoNCkpOwotICAgIAotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwudG9CeXRlcygiMTExIiksIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5nZXQoMSkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC50b0J5dGVzKCIzMyIpLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuZ2V0KDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwudG9CeXRlcygiNDQiKSwgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLmdldCg0KSk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLkJBUiwgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE1hcC5FbnVtVmFsdWUuQkFaLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5nZXQoMykpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5RVVgsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCg0KSk7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExMSwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDEpLmdldFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygzMywgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDMpLmdldFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg0NCwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDQpLmdldFZhbHVlKCkpOwotICAgIAotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExMSwgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5nZXQoIjEiKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzMsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuZ2V0KCIzIikuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ0LCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLmdldCgiNCIpLmludFZhbHVlKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydE1hcFZhbHVlc0NsZWFyZWQoVGVzdE1hcCBtZXNzYWdlKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNdXRhYmxlTWFwTGlmZWN5Y2xlKCkgewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgTWFwPEludGVnZXIsIEludGVnZXI+IGludE1hcCA9IGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCk7Ci0gICAgaW50TWFwLnB1dCgxLCAyKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBidWlsZGVyLmJ1aWxkKCkuZ2V0SW50MzJUb0ludDMyRmllbGQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5wdXQoMiwgMyk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAyKSwgYnVpbGRlci5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgyLCAzKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIsIDIsIDMpLCBidWlsZGVyLmdldEludDMyVG9JbnQzMkZpZWxkKCkpOwotCi0gICAgTWFwPEludGVnZXIsIFRlc3RNYXAuRW51bVZhbHVlPiBlbnVtTWFwID0gYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZCgpOwotICAgIGVudW1NYXAucHV0KDEsIFRlc3RNYXAuRW51bVZhbHVlLkJBUik7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCBUZXN0TWFwLkVudW1WYWx1ZS5CQVIpLCBidWlsZGVyLmJ1aWxkKCkuZ2V0SW50MzJUb0VudW1GaWVsZCgpKTsKLSAgICB0cnkgewotICAgICAgZW51bU1hcC5wdXQoMiwgVGVzdE1hcC5FbnVtVmFsdWUuRk9PKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIFRlc3RNYXAuRW51bVZhbHVlLkJBUiksIGJ1aWxkZXIuZ2V0SW50MzJUb0VudW1GaWVsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCkucHV0KDIsIFRlc3RNYXAuRW51bVZhbHVlLkZPTyk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBuZXdNYXAoMSwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSLCAyLCBUZXN0TWFwLkVudW1WYWx1ZS5GT08pLAotICAgICAgICBidWlsZGVyLmdldEludDMyVG9FbnVtRmllbGQoKSk7Ci0gICAgCi0gICAgTWFwPEludGVnZXIsIFN0cmluZz4gc3RyaW5nTWFwID0gYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1N0cmluZ0ZpZWxkKCk7Ci0gICAgc3RyaW5nTWFwLnB1dCgxLCAiMSIpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgIjEiKSwgYnVpbGRlci5idWlsZCgpLmdldEludDMyVG9TdHJpbmdGaWVsZCgpKTsKLSAgICB0cnkgewotICAgICAgc3RyaW5nTWFwLnB1dCgyLCAiMiIpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgIjEiKSwgYnVpbGRlci5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1N0cmluZ0ZpZWxkKCkucHV0KDIsICIyIik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBuZXdNYXAoMSwgIjEiLCAyLCAiMiIpLAotICAgICAgICBidWlsZGVyLmdldEludDMyVG9TdHJpbmdGaWVsZCgpKTsKLSAgICAKLSAgICBNYXA8SW50ZWdlciwgVGVzdE1hcC5NZXNzYWdlVmFsdWU+IG1lc3NhZ2VNYXAgPSBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCk7Ci0gICAgbWVzc2FnZU1hcC5wdXQoMSwgVGVzdE1hcC5NZXNzYWdlVmFsdWUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgVGVzdE1hcC5NZXNzYWdlVmFsdWUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAotICAgICAgICBidWlsZGVyLmJ1aWxkKCkuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpKTsKLSAgICB0cnkgewotICAgICAgbWVzc2FnZU1hcC5wdXQoMiwgVGVzdE1hcC5NZXNzYWdlVmFsdWUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgVGVzdE1hcC5NZXNzYWdlVmFsdWUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAotICAgICAgICBidWlsZGVyLmdldEludDMyVG9NZXNzYWdlRmllbGQoKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb01lc3NhZ2VGaWVsZCgpLnB1dCgyLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBuZXdNYXAoMSwgVGVzdE1hcC5NZXNzYWdlVmFsdWUuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAyLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSksCi0gICAgICAgIGJ1aWxkZXIuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNdXRhYmxlTWFwTGlmZWN5Y2xlX2NvbGxlY3Rpb25zKCkgewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgTWFwPEludGVnZXIsIEludGVnZXI+IGludE1hcCA9IGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCk7Ci0gICAgaW50TWFwLnB1dCgxLCAyKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBidWlsZGVyLmJ1aWxkKCkuZ2V0SW50MzJUb0ludDMyRmllbGQoKSk7Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5yZW1vdmUoMik7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5lbnRyeVNldCgpLnJlbW92ZShuZXcgT2JqZWN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBpbnRNYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpLnJlbW92ZSgpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBpbnRNYXAua2V5U2V0KCkucmVtb3ZlKG5ldyBPYmplY3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC52YWx1ZXMoKS5yZW1vdmUobmV3IE9iamVjdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICB0cnkgewotICAgICAgaW50TWFwLnZhbHVlcygpLml0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAyKSwgaW50TWFwKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBidWlsZGVyLmdldEludDMyVG9JbnQzMkZpZWxkKCkpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXR0ZXJzQW5kU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdE1hcCBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydE1hcFZhbHVlc0NsZWFyZWQobWVzc2FnZSk7Ci0gICAgCi0gICAgYnVpbGRlciA9IG1lc3NhZ2UudG9CdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzU2V0KG1lc3NhZ2UpOwotICAgIAotICAgIGJ1aWxkZXIgPSBtZXNzYWdlLnRvQnVpbGRlcigpOwotICAgIHVwZGF0ZU1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydE1hcFZhbHVlc1VwZGF0ZWQobWVzc2FnZSk7Ci0gICAgCi0gICAgYnVpbGRlciA9IG1lc3NhZ2UudG9CdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzQ2xlYXJlZChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQdXRBbGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgc291cmNlQnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIHNldE1hcFZhbHVlcyhzb3VyY2VCdWlsZGVyKTsKLSAgICBUZXN0TWFwIHNvdXJjZSA9IHNvdXJjZUJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIFRlc3RNYXAuQnVpbGRlciBkZXN0aW5hdGlvbiA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGNvcHlNYXBWYWx1ZXMoc291cmNlLCBkZXN0aW5hdGlvbik7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzU2V0KGRlc3RpbmF0aW9uLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZUFuZFBhcnNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRNYXBWYWx1ZXMoYnVpbGRlcik7Ci0gICAgVGVzdE1hcCBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksIG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkuc2l6ZSgpKTsKLSAgICBtZXNzYWdlID0gVGVzdE1hcC5wYXJzZXIoKS5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzU2V0KG1lc3NhZ2UpOwotICAgIAotICAgIGJ1aWxkZXIgPSBtZXNzYWdlLnRvQnVpbGRlcigpOwotICAgIHVwZGF0ZU1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksIG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkuc2l6ZSgpKTsKLSAgICBtZXNzYWdlID0gVGVzdE1hcC5wYXJzZXIoKS5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzVXBkYXRlZChtZXNzYWdlKTsKLSAgICAKLSAgICBidWlsZGVyID0gbWVzc2FnZS50b0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpLCBtZXNzYWdlLnRvQnl0ZVN0cmluZygpLnNpemUoKSk7Ci0gICAgbWVzc2FnZSA9IFRlc3RNYXAucGFyc2VyKCkucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICAgIGFzc2VydE1hcFZhbHVlc0NsZWFyZWQobWVzc2FnZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIHNldE1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgCi0gICAgVGVzdE1hcC5CdWlsZGVyIG90aGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgb3RoZXIubWVyZ2VGcm9tKG1lc3NhZ2UpOwotICAgIGFzc2VydE1hcFZhbHVlc1NldChvdGhlci5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNBbmRIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3QgdGhhdCBnZW5lcmF0ZWQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkgd2lsbCBkaXNyZWdhcmQgdGhlIG9yZGVyCi0gICAgLy8gb2YgbWFwIGVudHJpZXMgd2hlbiBjb21wYXJpbmcvaGFzaGluZyBtYXAgZmllbGRzLgotICAgIAotICAgIC8vIFdlIGNhbid0IGNvbnRyb2wgdGhlIG9yZGVyIG9mIGVsZW1lbnRzIGluIGEgSGFzaE1hcC4gVGhlIGJlc3Qgd2UgY2FuIGRvCi0gICAgLy8gaGVyZSBpcyB0byBhZGQgZWxlbWVudHMgaW4gZGlmZmVyZW50IG9yZGVyLgotICAgIFRlc3RNYXAuQnVpbGRlciBiMSA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGIxLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgxLCAyKTsKLSAgICBiMS5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMywgNCk7Ci0gICAgYjEuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDUsIDYpOwotICAgIFRlc3RNYXAgbTEgPSBiMS5idWlsZCgpOwotICAgIAotICAgIFRlc3RNYXAuQnVpbGRlciBiMiA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGIyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCg1LCA2KTsKLSAgICBiMi5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMik7Ci0gICAgYjIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDMsIDQpOwotICAgIFRlc3RNYXAgbTIgPSBiMi5idWlsZCgpOwotICAgIAotICAgIGFzc2VydEVxdWFscyhtMSwgbTIpOwotICAgIGFzc2VydEVxdWFscyhtMS5oYXNoQ29kZSgpLCBtMi5oYXNoQ29kZSgpKTsKLSAgICAKLSAgICAvLyBNYWtlIHN1cmUgd2UgZGlkIGNvbXBhcmUgbWFwIGZpZWxkcy4KLSAgICBiMi5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMCk7Ci0gICAgbTIgPSBiMi5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG0xLmVxdWFscyhtMikpOwotICAgIC8vIERvbid0IGNoZWNrIG0xLmhhc2hDb2RlKCkgIT0gbTIuaGFzaENvZGUoKSBiZWNhdXNlIGl0J3Mgbm90IGd1YXJhbnRlZWQKLSAgICAvLyB0byBiZSBkaWZmZXJlbnQuCi0gIH0KLSAgCi0gIAotICAvLyBUaGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIHVzZWQgdG8gdGVzdCByZWZsZWN0aW9uIEFQSS4KLSAgCi0gIHByaXZhdGUgc3RhdGljIEZpZWxkRGVzY3JpcHRvciBmKFN0cmluZyBuYW1lKSB7Ci0gICAgcmV0dXJuIFRlc3RNYXAuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoTWVzc2FnZSBtYXBFbnRyeSwgU3RyaW5nIG5hbWUpIHsKLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBtYXBFbnRyeS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICByZXR1cm4gbWFwRW50cnkuZ2V0RmllbGQoZmllbGQpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBNZXNzYWdlLkJ1aWxkZXIgc2V0RmllbGRWYWx1ZSgKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBtYXBFbnRyeSwgU3RyaW5nIG5hbWUsIE9iamVjdCB2YWx1ZSkgewotICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IG1hcEVudHJ5LmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKG5hbWUpOwotICAgIG1hcEVudHJ5LnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIG1hcEVudHJ5OwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEhhc01hcFZhbHVlcyhNZXNzYWdlIG1lc3NhZ2UsIFN0cmluZyBuYW1lLCBNYXA8PywgPz4gdmFsdWVzKSB7Ci0gICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZihuYW1lKTsKLSAgICBmb3IgKE9iamVjdCBlbnRyeSA6IChMaXN0PD8+KSBtZXNzYWdlLmdldEZpZWxkKGZpZWxkKSkgewotICAgICAgTWVzc2FnZSBtYXBFbnRyeSA9IChNZXNzYWdlKSBlbnRyeTsKLSAgICAgIE9iamVjdCBrZXkgPSBnZXRGaWVsZFZhbHVlKG1hcEVudHJ5LCAia2V5Iik7Ci0gICAgICBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKG1hcEVudHJ5LCAidmFsdWUiKTsKLSAgICAgIGFzc2VydFRydWUodmFsdWVzLmNvbnRhaW5zS2V5KGtleSkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCB2YWx1ZXMuZ2V0KGtleSkpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHModmFsdWVzLnNpemUoKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsgaSsrKSB7Ci0gICAgICBNZXNzYWdlIG1hcEVudHJ5ID0gKE1lc3NhZ2UpIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaSk7Ci0gICAgICBPYmplY3Qga2V5ID0gZ2V0RmllbGRWYWx1ZShtYXBFbnRyeSwgImtleSIpOwotICAgICAgT2JqZWN0IHZhbHVlID0gZ2V0RmllbGRWYWx1ZShtYXBFbnRyeSwgInZhbHVlIik7Ci0gICAgICBhc3NlcnRUcnVlKHZhbHVlcy5jb250YWluc0tleShrZXkpKTsKLSAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgdmFsdWVzLmdldChrZXkpKTsKLSAgICB9Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIDxLZXlUeXBlLCBWYWx1ZVR5cGU+Ci0gIE1lc3NhZ2UgbmV3TWFwRW50cnkoTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsIFN0cmluZyBuYW1lLCBLZXlUeXBlIGtleSwgVmFsdWVUeXBlIHZhbHVlKSB7Ci0gICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gYnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgZW50cnlCdWlsZGVyID0gYnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpOwotICAgIEZpZWxkRGVzY3JpcHRvciBrZXlGaWVsZCA9IGVudHJ5QnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgia2V5Iik7Ci0gICAgRmllbGREZXNjcmlwdG9yIHZhbHVlRmllbGQgPSBlbnRyeUJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUoInZhbHVlIik7Ci0gICAgZW50cnlCdWlsZGVyLnNldEZpZWxkKGtleUZpZWxkLCBrZXkpOwotICAgIGVudHJ5QnVpbGRlci5zZXRGaWVsZCh2YWx1ZUZpZWxkLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIGVudHJ5QnVpbGRlci5idWlsZCgpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyB2b2lkIHNldE1hcFZhbHVlcyhNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgU3RyaW5nIG5hbWUsIE1hcDw/LCA/PiB2YWx1ZXMpIHsKLSAgICBMaXN0PE1lc3NhZ2U+IGVudHJ5TGlzdCA9IG5ldyBBcnJheUxpc3Q8TWVzc2FnZT4oKTsKLSAgICBmb3IgKE1hcC5FbnRyeTw/LCA/PiBlbnRyeSA6IHZhbHVlcy5lbnRyeVNldCgpKSB7Ci0gICAgICBlbnRyeUxpc3QuYWRkKG5ld01hcEVudHJ5KGJ1aWxkZXIsIG5hbWUsIGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKSk7Ci0gICAgfQotICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUobmFtZSk7Ci0gICAgYnVpbGRlci5zZXRGaWVsZChmaWVsZCwgZW50cnlMaXN0KTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgPEtleVR5cGUsIFZhbHVlVHlwZT4KLSAgTWFwPEtleVR5cGUsIFZhbHVlVHlwZT4gbWFwRm9yVmFsdWVzKAotICAgICAgS2V5VHlwZSBrZXkxLCBWYWx1ZVR5cGUgdmFsdWUxLCBLZXlUeXBlIGtleTIsIFZhbHVlVHlwZSB2YWx1ZTIpIHsKLSAgICBNYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBtYXAgPSBuZXcgSGFzaE1hcDxLZXlUeXBlLCBWYWx1ZVR5cGU+KCk7Ci0gICAgbWFwLnB1dChrZXkxLCB2YWx1ZTEpOwotICAgIG1hcC5wdXQoa2V5MiwgdmFsdWUyKTsKLSAgICByZXR1cm4gbWFwOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25BcGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBJbiByZWZsZWN0aW9uIEFQSSwgbWFwIGZpZWxkcyBhcmUganVzdCByZXBlYXRlZCBtZXNzYWdlIGZpZWxkcy4KLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDEsIDIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDMsIDQpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9NZXNzYWdlRmllbGQoKS5wdXQoCi0gICAgICAgIDExLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDIyKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAzMywgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSg0NCkuYnVpbGQoKSk7Ci0gICAgVGVzdE1hcCBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgLy8gVGVzdCBnZXRGaWVsZCgpLCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoKSwgZ2V0UmVwZWF0ZWRGaWVsZCgpLgotICAgIGFzc2VydEhhc01hcFZhbHVlcyhtZXNzYWdlLCAiaW50MzJfdG9faW50MzJfZmllbGQiLAotICAgICAgICBtYXBGb3JWYWx1ZXMoMSwgMiwgMywgNCkpOwotICAgIGFzc2VydEhhc01hcFZhbHVlcyhtZXNzYWdlLCAiaW50MzJfdG9fbWVzc2FnZV9maWVsZCIsCi0gICAgICAgIG1hcEZvclZhbHVlcygKLSAgICAgICAgICAgIDExLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDIyKS5idWlsZCgpLAotICAgICAgICAgICAgMzMsIE1lc3NhZ2VWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoNDQpLmJ1aWxkKCkpKTsKLSAgICAKLSAgICAvLyBUZXN0IGNsZWFyRmllbGQoKQotICAgIGJ1aWxkZXIuY2xlYXJGaWVsZChmKCJpbnQzMl90b19pbnQzMl9maWVsZCIpKTsKLSAgICBidWlsZGVyLmNsZWFyRmllbGQoZigiaW50MzJfdG9fbWVzc2FnZV9maWVsZCIpKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuc2l6ZSgpKTsKLSAgICAKLSAgICAvLyBUZXN0IHNldEZpZWxkKCkKLSAgICBzZXRNYXBWYWx1ZXMoYnVpbGRlciwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwKLSAgICAgICAgbWFwRm9yVmFsdWVzKDExLCAyMiwgMzMsIDQ0KSk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIsICJpbnQzMl90b19tZXNzYWdlX2ZpZWxkIiwKLSAgICAgICAgbWFwRm9yVmFsdWVzKAotICAgICAgICAgICAgMTExLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDIyMikuYnVpbGQoKSwKLSAgICAgICAgICAgIDMzMywgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSg0NDQpLmJ1aWxkKCkpKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygyMiwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgxMSkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ0LCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDMzKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMjIyLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoMTExKS5nZXRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDQ0LCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoMzMzKS5nZXRWYWx1ZSgpKTsKLSAgICAKLSAgICAvLyBUZXN0IGFkZFJlcGVhdGVkRmllbGQKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigiaW50MzJfdG9faW50MzJfZmllbGQiKSwKLSAgICAgICAgbmV3TWFwRW50cnkoYnVpbGRlciwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwgNTUsIDY2KSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoImludDMyX3RvX21lc3NhZ2VfZmllbGQiKSwKLSAgICAgICAgbmV3TWFwRW50cnkoYnVpbGRlciwgImludDMyX3RvX21lc3NhZ2VfZmllbGQiLCA1NTUsCi0gICAgICAgICAgICBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDY2NikuYnVpbGQoKSkpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDY2LCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDU1KS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNjY2LCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoNTU1KS5nZXRWYWx1ZSgpKTsKLQotICAgIC8vIFRlc3QgYWRkUmVwZWF0ZWRGaWVsZCAob3ZlcnJpZGluZyBleGlzdGluZyB2YWx1ZXMpCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoImludDMyX3RvX2ludDMyX2ZpZWxkIiksCi0gICAgICAgIG5ld01hcEVudHJ5KGJ1aWxkZXIsICJpbnQzMl90b19pbnQzMl9maWVsZCIsIDU1LCA1NSkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJpbnQzMl90b19tZXNzYWdlX2ZpZWxkIiksCi0gICAgICAgIG5ld01hcEVudHJ5KGJ1aWxkZXIsICJpbnQzMl90b19tZXNzYWdlX2ZpZWxkIiwgNTU1LAotICAgICAgICAgICAgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSg1NTUpLmJ1aWxkKCkpKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyg1NSwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCg1NSkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU1NSwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDU1NSkuZ2V0VmFsdWUoKSk7Ci0gICAgCi0gICAgLy8gVGVzdCBzZXRSZXBlYXRlZEZpZWxkCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWlsZGVyLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJpbnQzMl90b19pbnQzMl9maWVsZCIpKTsgaSsrKSB7Ci0gICAgICBNZXNzYWdlIG1hcEVudHJ5ID0gKE1lc3NhZ2UpIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZChmKCJpbnQzMl90b19pbnQzMl9maWVsZCIpLCBpKTsKLSAgICAgIGludCBvbGRLZXkgPSAoKEludGVnZXIpIGdldEZpZWxkVmFsdWUobWFwRW50cnksICJrZXkiKSkuaW50VmFsdWUoKTsKLSAgICAgIGludCBvbGRWYWx1ZSA9ICgoSW50ZWdlcikgZ2V0RmllbGRWYWx1ZShtYXBFbnRyeSwgInZhbHVlIikpLmludFZhbHVlKCk7Ci0gICAgICAvLyBTd2FwIGtleSB3aXRoIHZhbHVlIGZvciBlYWNoIGVudHJ5LgotICAgICAgTWVzc2FnZS5CdWlsZGVyIG1hcEVudHJ5QnVpbGRlciA9IG1hcEVudHJ5LnRvQnVpbGRlcigpOwotICAgICAgc2V0RmllbGRWYWx1ZShtYXBFbnRyeUJ1aWxkZXIsICJrZXkiLCBvbGRWYWx1ZSk7Ci0gICAgICBzZXRGaWVsZFZhbHVlKG1hcEVudHJ5QnVpbGRlciwgInZhbHVlIiwgb2xkS2V5KTsKLSAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmKCJpbnQzMl90b19pbnQzMl9maWVsZCIpLCBpLCBtYXBFbnRyeUJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgfQotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDIyKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzMsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoNDQpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg1NSwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCg1NSkuaW50VmFsdWUoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RUZXh0Rm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRNYXBWYWx1ZXMoYnVpbGRlcik7Ci0gICAgVGVzdE1hcCBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIAotICAgIFN0cmluZyB0ZXh0RGF0YSA9IFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhtZXNzYWdlKTsKLSAgICAKLSAgICBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZSh0ZXh0RGF0YSwgYnVpbGRlcik7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAKLSAgICBhc3NlcnRNYXBWYWx1ZXNTZXQobWVzc2FnZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIFRlc3RNYXAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAKLSAgICBNZXNzYWdlIGR5bmFtaWNEZWZhdWx0SW5zdGFuY2UgPQotICAgICAgICBEeW5hbWljTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoVGVzdE1hcC5nZXREZXNjcmlwdG9yKCkpOwotICAgIE1lc3NhZ2UgZHluYW1pY01lc3NhZ2UgPSBkeW5hbWljRGVmYXVsdEluc3RhbmNlCi0gICAgICAgIC5uZXdCdWlsZGVyRm9yVHlwZSgpLm1lcmdlRnJvbShtZXNzYWdlLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOwotICAgIAotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBkeW5hbWljTWVzc2FnZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UuaGFzaENvZGUoKSwgZHluYW1pY01lc3NhZ2UuaGFzaENvZGUoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uRXF1YWxzQW5kSGFzaENvZGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0IHRoYXQgZ2VuZXJhdGVkIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIHdpbGwgZGlzcmVnYXJkIHRoZSBvcmRlcgotICAgIC8vIG9mIG1hcCBlbnRyaWVzIHdoZW4gY29tcGFyaW5nL2hhc2hpbmcgbWFwIGZpZWxkcy4KLQotICAgIC8vIFdlIHVzZSBEeW5hbWljTWVzc2FnZSB0byB0ZXN0IHJlZmxlY3Rpb24gYmFzZWQgZXF1YWxzKCkvaGFzaENvZGUoKS4KLSAgICBNZXNzYWdlIGR5bmFtaWNEZWZhdWx0SW5zdGFuY2UgPQotICAgICAgICBEeW5hbWljTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoVGVzdE1hcC5nZXREZXNjcmlwdG9yKCkpOwotICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGYoImludDMyX3RvX2ludDMyX2ZpZWxkIik7Ci0gICAgCi0gICAgTWVzc2FnZS5CdWlsZGVyIGIxID0gZHluYW1pY0RlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgIGIxLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIG5ld01hcEVudHJ5KGIxLCAiaW50MzJfdG9faW50MzJfZmllbGQiLCAxLCAyKSk7Ci0gICAgYjEuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgbmV3TWFwRW50cnkoYjEsICJpbnQzMl90b19pbnQzMl9maWVsZCIsIDMsIDQpKTsKLSAgICBiMS5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBuZXdNYXBFbnRyeShiMSwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwgNSwgNikpOwotICAgIE1lc3NhZ2UgbTEgPSBiMS5idWlsZCgpOwotICAgIAotICAgIE1lc3NhZ2UuQnVpbGRlciBiMiA9IGR5bmFtaWNEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICBiMi5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBuZXdNYXBFbnRyeShiMiwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwgNSwgNikpOwotICAgIGIyLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIG5ld01hcEVudHJ5KGIyLCAiaW50MzJfdG9faW50MzJfZmllbGQiLCAxLCAyKSk7Ci0gICAgYjIuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgbmV3TWFwRW50cnkoYjIsICJpbnQzMl90b19pbnQzMl9maWVsZCIsIDMsIDQpKTsKLSAgICBNZXNzYWdlIG0yID0gYjIuYnVpbGQoKTsKLSAgICAKLSAgICBhc3NlcnRFcXVhbHMobTEsIG0yKTsKLSAgICBhc3NlcnRFcXVhbHMobTEuaGFzaENvZGUoKSwgbTIuaGFzaENvZGUoKSk7Ci0gICAgCi0gICAgLy8gTWFrZSBzdXJlIHdlIGRpZCBjb21wYXJlIG1hcCBmaWVsZHMuCi0gICAgYjIuc2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgMCwgbmV3TWFwRW50cnkoYjEsICJpbnQzMl90b19pbnQzMl9maWVsZCIsIDAsIDApKTsKLSAgICBtMiA9IGIyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RmFsc2UobTEuZXF1YWxzKG0yKSk7Ci0gICAgLy8gRG9uJ3QgY2hlY2sgbTEuaGFzaENvZGUoKSAhPSBtMi5oYXNoQ29kZSgpIGJlY2F1c2UgaXQncyBub3QgZ3VhcmFudGVlZAotICAgIC8vIHRvIGJlIGRpZmZlcmVudC4KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFVua25vd25FbnVtVmFsdWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFVua25vd25FbnVtVmFsdWUuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgVGVzdFVua25vd25FbnVtVmFsdWUubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDEsIDEpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDIsIDU0MzIxKTsKLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBidWlsZGVyLmJ1aWxkKCkudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBUZXN0TWFwLnBhcnNlRnJvbShkYXRhKTsKLSAgICAvLyBFbnRyaWVzIHdpdGggdW5rbm93biBlbnVtIHZhbHVlcyB3aWxsIGJlIHN0b3JlZCBpbnRvIFVua25vd25GaWVsZFNldCBzbwotICAgIC8vIHRoZXJlIGlzIG9ubHkgb25lIGVudHJ5IGluIHRoZSBtYXAuCi0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLkJBUiwgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDEpKTsKLSAgICAvLyBVbmtub3duRmllbGRTZXQgc2hvdWxkIG5vdCBiZSBlbXB0eS4KLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKS5hc01hcCgpLmlzRW1wdHkoKSk7Ci0gICAgLy8gU2VyaWFsaXppbmcgYW5kIHBhcnNpbmcgc2hvdWxkIHByZXNlcnZlIHRoZSB1bmtub3duIGVudHJ5LgotICAgIGRhdGEgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIFRlc3RVbmtub3duRW51bVZhbHVlIG1lc3NhZ2VXaXRoVW5rbm93bkVudW1zID0KLSAgICAgICAgVGVzdFVua25vd25FbnVtVmFsdWUucGFyc2VGcm9tKGRhdGEpOwotICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlV2l0aFVua25vd25FbnVtcy5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2VXaXRoVW5rbm93bkVudW1zLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDEpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg1NDMyMSwgbWVzc2FnZVdpdGhVbmtub3duRW51bXMuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMikuaW50VmFsdWUoKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZE1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVJlcXVpcmVkTWVzc2FnZU1hcCgpLnB1dCgwLAotICAgICAgICBNZXNzYWdlV2l0aFJlcXVpcmVkRmllbGRzLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKSk7Ci0gICAgVGVzdE1hcCBtZXNzYWdlID0gYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVSZXF1aXJlZE1lc3NhZ2VNYXAoKS5wdXQoMCwKLSAgICAgICAgTWVzc2FnZVdpdGhSZXF1aXJlZEZpZWxkcy5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UmVjdXJzaXZlTWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZWN1cnNpdmVNYXAubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVJlY3Vyc2l2ZU1hcEZpZWxkKCkucHV0KAotICAgICAgICAxLCBUZXN0UmVjdXJzaXZlTWFwLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgyKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVSZWN1cnNpdmVNYXBGaWVsZCgpLnB1dCgKLSAgICAgICAgMywgVGVzdFJlY3Vyc2l2ZU1hcC5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoNCkuYnVpbGQoKSk7Ci0gICAgQnl0ZVN0cmluZyBkYXRhID0gYnVpbGRlci5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotCi0gICAgVGVzdFJlY3Vyc2l2ZU1hcCBtZXNzYWdlID0gVGVzdFJlY3Vyc2l2ZU1hcC5wYXJzZUZyb20oZGF0YSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVjdXJzaXZlTWFwRmllbGQoKS5nZXQoMSkuZ2V0VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2UuZ2V0UmVjdXJzaXZlTWFwRmllbGQoKS5nZXQoMykuZ2V0VmFsdWUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SXRlcmF0aW9uT3JkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIHNldE1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCgiMSIsICIyIiwgIjMiKSwKLSAgICAgICAgbmV3IEFycmF5TGlzdDxTdHJpbmc+KG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkua2V5U2V0KCkpKTsKLSAgfQotCi0gIC8vIFJlZ3Jlc3Npb24gdGVzdCBmb3IgYi8yMDQ5NDc4OAotICBwdWJsaWMgdm9pZCB0ZXN0TWFwSW5pdGlhbGl6YXRpb25PcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscygiUmVkYWN0QWxsVHlwZXMiLCBtYXBfdGVzdC5SZWRhY3RBbGxUeXBlcwotICAgICAgICAuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXROYW1lKCkpOwotCi0gICAgbWFwX3Rlc3QuTWVzc2FnZTEuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgbWFwX3Rlc3QuTWVzc2FnZTEubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZU1hcEZpZWxkKCkucHV0KCJrZXkiLCB0cnVlKTsKLSAgICBtYXBfdGVzdC5NZXNzYWdlMSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIE1lc3NhZ2UgbWFwRW50cnkgPSAoTWVzc2FnZSkgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKAotICAgICAgICBtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKCJtYXBfZmllbGQiKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1hcEVudHJ5LmdldEFsbEZpZWxkcygpLnNpemUoKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gbmV3TWFwKEsga2V5MSwgViB2YWx1ZTEpIHsKLSAgICBNYXA8SywgVj4gbWFwID0gbmV3IEhhc2hNYXA8SywgVj4oKTsKLSAgICBtYXAucHV0KGtleTEsIHZhbHVlMSk7Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgPEssIFY+IE1hcDxLLCBWPiBuZXdNYXAoSyBrZXkxLCBWIHZhbHVlMSwgSyBrZXkyLCBWIHZhbHVlMikgewotICAgIE1hcDxLLCBWPiBtYXAgPSBuZXcgSGFzaE1hcDxLLCBWPigpOwotICAgIG1hcC5wdXQoa2V5MSwgdmFsdWUxKTsKLSAgICBtYXAucHV0KGtleTIsIHZhbHVlMik7Ci0gICAgcmV0dXJuIG1hcDsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01hcFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWFwVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZGM1Nzg3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWFwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzgyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci1pbXBvcnQgbWFwX3Rlc3QuTWFwVGVzdFByb3RvLlRlc3RNYXA7Ci1pbXBvcnQgbWFwX3Rlc3QuTWFwVGVzdFByb3RvLlRlc3RNYXAuTWVzc2FnZVZhbHVlOwotaW1wb3J0IG1hcF90ZXN0Lk1hcFRlc3RQcm90by5UZXN0T25DaGFuZ2VFdmVudFByb3BhZ2F0aW9uOwotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIG1hcCBmaWVsZHMuCi0gKi8KLXB1YmxpYyBjbGFzcyBNYXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIHZvaWQgc2V0TWFwVmFsdWVzKFRlc3RNYXAuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMTEpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDIsIDIyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgzLCAzMyk7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoMSwgIjExIik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1N0cmluZ0ZpZWxkKCkucHV0KDIsICIyMiIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TdHJpbmdGaWVsZCgpLnB1dCgzLCAiMzMiKTsKLQotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9CeXRlc0ZpZWxkKCkucHV0KDEsIFRlc3RVdGlsLnRvQnl0ZXMoIjExIikpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9CeXRlc0ZpZWxkKCkucHV0KDIsIFRlc3RVdGlsLnRvQnl0ZXMoIjIyIikpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9CeXRlc0ZpZWxkKCkucHV0KDMsIFRlc3RVdGlsLnRvQnl0ZXMoIjMzIikpOwotCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZCgpLnB1dCgxLCBUZXN0TWFwLkVudW1WYWx1ZS5GT08pOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5wdXQoMiwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCkucHV0KDMsIFRlc3RNYXAuRW51bVZhbHVlLkJBWik7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAxLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDExKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAyLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDIyKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAzLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDMzKS5idWlsZCgpKTsKLQotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJGaWVsZCgpLnB1dCgiMSIsIDExKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVTdHJpbmdUb0ludDMyRmllbGQoKS5wdXQoIjIiLCAyMik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU3RyaW5nVG9JbnQzMkZpZWxkKCkucHV0KCIzIiwgMzMpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGNvcHlNYXBWYWx1ZXMoVGVzdE1hcCBzb3VyY2UsIFRlc3RNYXAuQnVpbGRlciBkZXN0aW5hdGlvbikgewotICAgIGRlc3RpbmF0aW9uCi0gICAgICAgIC5wdXRBbGxJbnQzMlRvSW50MzJGaWVsZChzb3VyY2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKSkKLSAgICAgICAgLnB1dEFsbEludDMyVG9TdHJpbmdGaWVsZChzb3VyY2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkpCi0gICAgICAgIC5wdXRBbGxJbnQzMlRvQnl0ZXNGaWVsZChzb3VyY2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKSkKLSAgICAgICAgLnB1dEFsbEludDMyVG9FbnVtRmllbGQoc291cmNlLmdldEludDMyVG9FbnVtRmllbGQoKSkKLSAgICAgICAgLnB1dEFsbEludDMyVG9NZXNzYWdlRmllbGQoc291cmNlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKSkKLSAgICAgICAgLnB1dEFsbFN0cmluZ1RvSW50MzJGaWVsZChzb3VyY2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydE1hcFZhbHVlc1NldChUZXN0TWFwIG1lc3NhZ2UpIHsKLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDEpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygyMiwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgyKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzMsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMykuaW50VmFsdWUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiMTEiLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIyMiIsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuZ2V0KDIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjMzIiwgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5nZXQoMykpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC50b0J5dGVzKCIxMSIpLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwudG9CeXRlcygiMjIiKSwgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLmdldCgyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLnRvQnl0ZXMoIjMzIiksIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5nZXQoMykpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLkZPTywgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE1hcC5FbnVtVmFsdWUuQkFSLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5nZXQoMikpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5CQVosIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCgzKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTEsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLmdldCgxKS5nZXRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMjIsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLmdldCgyKS5nZXRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzMsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLmdldCgzKS5nZXRWYWx1ZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLmdldCgiMSIpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygyMiwgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5nZXQoIjIiKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzMsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuZ2V0KCIzIikuaW50VmFsdWUoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdXBkYXRlTWFwVmFsdWVzKFRlc3RNYXAuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMTExKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnJlbW92ZSgyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCg0LCA0NCk7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoMSwgIjExMSIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TdHJpbmdGaWVsZCgpLnJlbW92ZSgyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoNCwgIjQ0Iik7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvQnl0ZXNGaWVsZCgpLnB1dCgxLCBUZXN0VXRpbC50b0J5dGVzKCIxMTEiKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5yZW1vdmUoMik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0J5dGVzRmllbGQoKS5wdXQoNCwgVGVzdFV0aWwudG9CeXRlcygiNDQiKSk7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCkucHV0KDEsIFRlc3RNYXAuRW51bVZhbHVlLkJBUik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZCgpLnJlbW92ZSgyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCkucHV0KDQsIFRlc3RNYXAuRW51bVZhbHVlLlFVWCk7Ci0KLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICAxLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDExMSkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb01lc3NhZ2VGaWVsZCgpLnJlbW92ZSgyKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KAotICAgICAgICA0LCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDQ0KS5idWlsZCgpKTsKLQotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJGaWVsZCgpLnB1dCgiMSIsIDExMSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU3RyaW5nVG9JbnQzMkZpZWxkKCkucmVtb3ZlKCIyIik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU3RyaW5nVG9JbnQzMkZpZWxkKCkucHV0KCI0IiwgNDQpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydE1hcFZhbHVlc1VwZGF0ZWQoVGVzdE1hcCBtZXNzYWdlKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygxMTEsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMSkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMzLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDMpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg0NCwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCg0KS5pbnRWYWx1ZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxMTEiLCBtZXNzYWdlLmdldEludDMyVG9TdHJpbmdGaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIzMyIsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuZ2V0KDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjQ0IiwgbWVzc2FnZS5nZXRJbnQzMlRvU3RyaW5nRmllbGQoKS5nZXQoNCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC50b0J5dGVzKCIxMTEiKSwgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLnRvQnl0ZXMoIjMzIiksIG1lc3NhZ2UuZ2V0SW50MzJUb0J5dGVzRmllbGQoKS5nZXQoMykpOwotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC50b0J5dGVzKCI0NCIpLCBtZXNzYWdlLmdldEludDMyVG9CeXRlc0ZpZWxkKCkuZ2V0KDQpKTsKLQotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5CQVIsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLkJBWiwgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE1hcC5FbnVtVmFsdWUuUVVYLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5nZXQoNCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExMSwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDEpLmdldFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygzMywgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDMpLmdldFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg0NCwgbWVzc2FnZS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkuZ2V0KDQpLmdldFZhbHVlKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTExLCBtZXNzYWdlLmdldFN0cmluZ1RvSW50MzJGaWVsZCgpLmdldCgiMSIpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygzMywgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5nZXQoIjMiKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDQsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuZ2V0KCI0IikuaW50VmFsdWUoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0TWFwVmFsdWVzQ2xlYXJlZChUZXN0TWFwIG1lc3NhZ2UpIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMlRvQnl0ZXNGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U3RyaW5nVG9JbnQzMkZpZWxkKCkuc2l6ZSgpKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE11dGFibGVNYXBMaWZlY3ljbGUoKSB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gaW50TWFwID0gYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKTsKLSAgICBpbnRNYXAucHV0KDEsIDIpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgICB0cnkgewotICAgICAgaW50TWFwLnB1dCgyLCAzKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBidWlsZGVyLmdldEludDMyVG9JbnQzMkZpZWxkKCkpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDIsIDMpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiwgMiwgMyksIGJ1aWxkZXIuZ2V0SW50MzJUb0ludDMyRmllbGQoKSk7Ci0KLSAgICBNYXA8SW50ZWdlciwgVGVzdE1hcC5FbnVtVmFsdWU+IGVudW1NYXAgPSBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkKCk7Ci0gICAgZW51bU1hcC5wdXQoMSwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIFRlc3RNYXAuRW51bVZhbHVlLkJBUiksIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvRW51bUZpZWxkKCkpOwotICAgIHRyeSB7Ci0gICAgICBlbnVtTWFwLnB1dCgyLCBUZXN0TWFwLkVudW1WYWx1ZS5GT08pOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgVGVzdE1hcC5FbnVtVmFsdWUuQkFSKSwgYnVpbGRlci5nZXRJbnQzMlRvRW51bUZpZWxkKCkpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGQoKS5wdXQoMiwgVGVzdE1hcC5FbnVtVmFsdWUuRk9PKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIG5ld01hcCgxLCBUZXN0TWFwLkVudW1WYWx1ZS5CQVIsIDIsIFRlc3RNYXAuRW51bVZhbHVlLkZPTyksCi0gICAgICAgIGJ1aWxkZXIuZ2V0SW50MzJUb0VudW1GaWVsZCgpKTsKLSAgICAKLSAgICBNYXA8SW50ZWdlciwgU3RyaW5nPiBzdHJpbmdNYXAgPSBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKTsKLSAgICBzdHJpbmdNYXAucHV0KDEsICIxIik7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAiMSIpLCBidWlsZGVyLmJ1aWxkKCkuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkpOwotICAgIHRyeSB7Ci0gICAgICBzdHJpbmdNYXAucHV0KDIsICIyIik7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAiMSIpLCBidWlsZGVyLmdldEludDMyVG9TdHJpbmdGaWVsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU3RyaW5nRmllbGQoKS5wdXQoMiwgIjIiKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIG5ld01hcCgxLCAiMSIsIDIsICIyIiksCi0gICAgICAgIGJ1aWxkZXIuZ2V0SW50MzJUb1N0cmluZ0ZpZWxkKCkpOwotICAgIAotICAgIE1hcDxJbnRlZ2VyLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZT4gbWVzc2FnZU1hcCA9IGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9NZXNzYWdlRmllbGQoKTsKLSAgICBtZXNzYWdlTWFwLnB1dCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSksCi0gICAgICAgIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkpOwotICAgIHRyeSB7Ci0gICAgICBtZXNzYWdlTWFwLnB1dCgyLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSksCi0gICAgICAgIGJ1aWxkZXIuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvTWVzc2FnZUZpZWxkKCkucHV0KDIsIFRlc3RNYXAuTWVzc2FnZVZhbHVlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIG5ld01hcCgxLCBUZXN0TWFwLk1lc3NhZ2VWYWx1ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgIDIsIFRlc3RNYXAuTWVzc2FnZVZhbHVlLmdldERlZmF1bHRJbnN0YW5jZSgpKSwKLSAgICAgICAgYnVpbGRlci5nZXRJbnQzMlRvTWVzc2FnZUZpZWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE11dGFibGVNYXBMaWZlY3ljbGVfY29sbGVjdGlvbnMoKSB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gaW50TWFwID0gYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKTsKLSAgICBpbnRNYXAucHV0KDEsIDIpOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIGJ1aWxkZXIuYnVpbGQoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpKTsKLSAgICB0cnkgewotICAgICAgaW50TWFwLnJlbW92ZSgyKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICB0cnkgewotICAgICAgaW50TWFwLmVudHJ5U2V0KCkucmVtb3ZlKG5ldyBPYmplY3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGludE1hcC5rZXlTZXQoKS5yZW1vdmUobmV3IE9iamVjdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICB0cnkgewotICAgICAgaW50TWFwLnZhbHVlcygpLnJlbW92ZShuZXcgT2JqZWN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBpbnRNYXAudmFsdWVzKCkuaXRlcmF0b3IoKS5yZW1vdmUoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMobmV3TWFwKDEsIDIpLCBpbnRNYXApOwotICAgIGFzc2VydEVxdWFscyhuZXdNYXAoMSwgMiksIGJ1aWxkZXIuZ2V0SW50MzJUb0ludDMyRmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5ld01hcCgxLCAyKSwgYnVpbGRlci5idWlsZCgpLmdldEludDMyVG9JbnQzMkZpZWxkKCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0R2V0dGVyc0FuZFNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIFRlc3RNYXAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRNYXBWYWx1ZXNDbGVhcmVkKG1lc3NhZ2UpOwotCi0gICAgYnVpbGRlciA9IG1lc3NhZ2UudG9CdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzU2V0KG1lc3NhZ2UpOwotCi0gICAgYnVpbGRlciA9IG1lc3NhZ2UudG9CdWlsZGVyKCk7Ci0gICAgdXBkYXRlTWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzVXBkYXRlZChtZXNzYWdlKTsKLQotICAgIGJ1aWxkZXIgPSBtZXNzYWdlLnRvQnVpbGRlcigpOwotICAgIGJ1aWxkZXIuY2xlYXIoKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydE1hcFZhbHVlc0NsZWFyZWQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHV0QWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE1hcC5CdWlsZGVyIHNvdXJjZUJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRNYXBWYWx1ZXMoc291cmNlQnVpbGRlcik7Ci0gICAgVGVzdE1hcCBzb3VyY2UgPSBzb3VyY2VCdWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBUZXN0TWFwLkJ1aWxkZXIgZGVzdGluYXRpb24gPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBjb3B5TWFwVmFsdWVzKHNvdXJjZSwgZGVzdGluYXRpb24pOwotICAgIGFzc2VydE1hcFZhbHVlc1NldChkZXN0aW5hdGlvbi5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQdXRBbGxGb3JVbmtub3duRW51bVZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBzb3VyY2VCdWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc291cmNlQnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZFZhbHVlKCkucHV0KDAsIDApOwotICAgIHNvdXJjZUJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGRWYWx1ZSgpLnB1dCgxLCAxKTsKLSAgICBzb3VyY2VCdWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkVmFsdWUoKS5wdXQoMiwgMTAwMCk7ICAvLyB1bmtub3duIHZhbHVlLgotICAgIFRlc3RNYXAgc291cmNlID0gc291cmNlQnVpbGRlci5idWlsZCgpOwotCi0gICAgVGVzdE1hcC5CdWlsZGVyIGRlc3RpbmF0aW9uQnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGRlc3RpbmF0aW9uQnVpbGRlci5wdXRBbGxJbnQzMlRvRW51bUZpZWxkVmFsdWUoc291cmNlLmdldEludDMyVG9FbnVtRmllbGRWYWx1ZSgpKTsKLSAgICBUZXN0TWFwIGRlc3RpbmF0aW9uID0gZGVzdGluYXRpb25CdWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgZGVzdGluYXRpb24uZ2V0SW50MzJUb0VudW1GaWVsZFZhbHVlKCkuZ2V0KDApLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBkZXN0aW5hdGlvbi5nZXRJbnQzMlRvRW51bUZpZWxkVmFsdWUoKS5nZXQoMSkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwMDAsIGRlc3RpbmF0aW9uLmdldEludDMyVG9FbnVtRmllbGRWYWx1ZSgpLmdldCgyKS5pbnRWYWx1ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVBbmRQYXJzZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIFRlc3RNYXAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpLCBtZXNzYWdlLnRvQnl0ZVN0cmluZygpLnNpemUoKSk7Ci0gICAgbWVzc2FnZSA9IFRlc3RNYXAucGFyc2VyKCkucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICAgIGFzc2VydE1hcFZhbHVlc1NldChtZXNzYWdlKTsKLQotICAgIGJ1aWxkZXIgPSBtZXNzYWdlLnRvQnVpbGRlcigpOwotICAgIHVwZGF0ZU1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksIG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkuc2l6ZSgpKTsKLSAgICBtZXNzYWdlID0gVGVzdE1hcC5wYXJzZXIoKS5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzVXBkYXRlZChtZXNzYWdlKTsKLQotICAgIGJ1aWxkZXIgPSBtZXNzYWdlLnRvQnVpbGRlcigpOwotICAgIGJ1aWxkZXIuY2xlYXIoKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCksIG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkuc2l6ZSgpKTsKLSAgICBtZXNzYWdlID0gVGVzdE1hcC5wYXJzZXIoKS5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzQ2xlYXJlZChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIHNldE1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBUZXN0TWFwLkJ1aWxkZXIgb3RoZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBvdGhlci5tZXJnZUZyb20obWVzc2FnZSk7Ci0gICAgYXNzZXJ0TWFwVmFsdWVzU2V0KG90aGVyLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0FuZEhhc2hDb2RlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCB0aGF0IGdlbmVyYXRlZCBlcXVhbHMoKSBhbmQgaGFzaENvZGUoKSB3aWxsIGRpc3JlZ2FyZCB0aGUgb3JkZXIKLSAgICAvLyBvZiBtYXAgZW50cmllcyB3aGVuIGNvbXBhcmluZy9oYXNoaW5nIG1hcCBmaWVsZHMuCi0KLSAgICAvLyBXZSBjYW4ndCBjb250cm9sIHRoZSBvcmRlciBvZiBlbGVtZW50cyBpbiBhIEhhc2hNYXAuIFRoZSBiZXN0IHdlIGNhbiBkbwotICAgIC8vIGhlcmUgaXMgdG8gYWRkIGVsZW1lbnRzIGluIGRpZmZlcmVudCBvcmRlci4KLSAgICBUZXN0TWFwLkJ1aWxkZXIgYjEgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBiMS5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMik7Ci0gICAgYjEuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDMsIDQpOwotICAgIGIxLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCg1LCA2KTsKLSAgICBUZXN0TWFwIG0xID0gYjEuYnVpbGQoKTsKLQotICAgIFRlc3RNYXAuQnVpbGRlciBiMiA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGIyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCg1LCA2KTsKLSAgICBiMi5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMik7Ci0gICAgYjIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDMsIDQpOwotICAgIFRlc3RNYXAgbTIgPSBiMi5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKG0xLCBtMik7Ci0gICAgYXNzZXJ0RXF1YWxzKG0xLmhhc2hDb2RlKCksIG0yLmhhc2hDb2RlKCkpOwotCi0gICAgLy8gTWFrZSBzdXJlIHdlIGRpZCBjb21wYXJlIG1hcCBmaWVsZHMuCi0gICAgYjIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDEsIDApOwotICAgIG0yID0gYjIuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShtMS5lcXVhbHMobTIpKTsKLSAgICAvLyBEb24ndCBjaGVjayBtMS5oYXNoQ29kZSgpICE9IG0yLmhhc2hDb2RlKCkgYmVjYXVzZSBpdCdzIG5vdCBndWFyYW50ZWVkCi0gICAgLy8gdG8gYmUgZGlmZmVyZW50LgotCi0gICAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBiLzE4NTQ5MTkwOiBpZiBhIG1hcCBpcyBhIHN1YnNldCBvZiB0aGUgb3RoZXIgbWFwLAotICAgIC8vIGVxdWFscygpIHNob3VsZCByZXR1cm4gZmFsc2UuCi0gICAgYjIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucmVtb3ZlKDEpOwotICAgIG0yID0gYjIuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShtMS5lcXVhbHMobTIpKTsKLSAgICBhc3NlcnRGYWxzZShtMi5lcXVhbHMobTEpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRCdWlsZGVyT25DaGFuZ2VFdmVudFByb3BhZ2F0aW9uKCkgewotICAgIFRlc3RPbkNoYW5nZUV2ZW50UHJvcGFnYXRpb24uQnVpbGRlciBwYXJlbnQgPQotICAgICAgICBUZXN0T25DaGFuZ2VFdmVudFByb3BhZ2F0aW9uLm5ld0J1aWxkZXIoKTsKLSAgICBwYXJlbnQuZ2V0T3B0aW9uYWxNZXNzYWdlQnVpbGRlcigpLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgxLCAyKTsKLSAgICBUZXN0T25DaGFuZ2VFdmVudFByb3BhZ2F0aW9uIG1lc3NhZ2UgPSBwYXJlbnQuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRPcHRpb25hbE1lc3NhZ2UoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgxKS5pbnRWYWx1ZSgpKTsKLQotICAgIC8vIE1ha2UgYSBjaGFuZ2UgdXNpbmcgbmVzdGVkIGJ1aWxkZXIuCi0gICAgcGFyZW50LmdldE9wdGlvbmFsTWVzc2FnZUJ1aWxkZXIoKS5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMyk7Ci0KLSAgICAvLyBTaG91bGQgYmUgYWJsZSB0byBvYnNlcnZlIHRoZSBjaGFuZ2UuCi0gICAgbWVzc2FnZSA9IHBhcmVudC5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLmdldE9wdGlvbmFsTWVzc2FnZSgpLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDEpLmludFZhbHVlKCkpOwotCi0gICAgLy8gTWFrZSBhbm90aGVyIGNoYW5nZSB1c2luZyBtZXJnZUZyb20oKQotICAgIFRlc3RNYXAuQnVpbGRlciBvdGhlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIG90aGVyLmdldE11dGFibGVJbnQzMlRvSW50MzJGaWVsZCgpLnB1dCgxLCA0KTsKLSAgICBwYXJlbnQuZ2V0T3B0aW9uYWxNZXNzYWdlQnVpbGRlcigpLm1lcmdlRnJvbShvdGhlci5idWlsZCgpKTsKLQotICAgIC8vIFNob3VsZCBiZSBhYmxlIHRvIG9ic2VydmUgdGhlIGNoYW5nZS4KLSAgICBtZXNzYWdlID0gcGFyZW50LmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxNZXNzYWdlKCkuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoMSkuaW50VmFsdWUoKSk7Ci0KLSAgICAvLyBNYWtlIHlldCBhbm90aGVyIGNoYW5nZSBieSBjbGVhcmluZyB0aGUgbmVzdGVkIGJ1aWxkZXIuCi0gICAgcGFyZW50LmdldE9wdGlvbmFsTWVzc2FnZUJ1aWxkZXIoKS5jbGVhcigpOwotCi0gICAgLy8gU2hvdWxkIGJlIGFibGUgdG8gb2JzZXJ2ZSB0aGUgY2hhbmdlLgotICAgIG1lc3NhZ2UgPSBwYXJlbnQuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbE1lc3NhZ2UoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmVzdGVkQnVpbGRlck9uQ2hhbmdlRXZlbnRQcm9wYWdhdGlvblJlZmxlY3Rpb24oKSB7Ci0gICAgRmllbGREZXNjcmlwdG9yIGludE1hcEZpZWxkID0gZigiaW50MzJfdG9faW50MzJfZmllbGQiKTsKLSAgICAvLyBDcmVhdGUgYW4gb3V0ZXIgbWVzc2FnZSBidWlsZGVyIHdpdGggbmVzdGVkIGJ1aWxkZXIuCi0gICAgVGVzdE9uQ2hhbmdlRXZlbnRQcm9wYWdhdGlvbi5CdWlsZGVyIHBhcmVudEJ1aWxkZXIgPQotICAgICAgICBUZXN0T25DaGFuZ2VFdmVudFByb3BhZ2F0aW9uLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgdGVzdE1hcEJ1aWxkZXIgPSBwYXJlbnRCdWlsZGVyLmdldE9wdGlvbmFsTWVzc2FnZUJ1aWxkZXIoKTsKLQotICAgIC8vIENyZWF0ZSBhIG1hcCBlbnRyeSBtZXNzYWdlLgotICAgIFRlc3RNYXAuQnVpbGRlciBlbnRyeUJ1aWxkZXIgPSBUZXN0TWFwLm5ld0J1aWxkZXIoKTsKLSAgICBlbnRyeUJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDEsIDEpOwotCi0gICAgLy8gUHV0IHRoZSBlbnRyeSBpbnRvIHRoZSBuZXN0ZWQgYnVpbGRlci4KLSAgICB0ZXN0TWFwQnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKAotICAgICAgICBpbnRNYXBGaWVsZCwgZW50cnlCdWlsZGVyLmdldFJlcGVhdGVkRmllbGQoaW50TWFwRmllbGQsIDApKTsKLQotICAgIC8vIFNob3VsZCBiZSBhYmxlIHRvIG9ic2VydmUgdGhlIGNoYW5nZS4KLSAgICBUZXN0T25DaGFuZ2VFdmVudFByb3BhZ2F0aW9uIG1lc3NhZ2UgPSBwYXJlbnRCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxNZXNzYWdlKCkuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5zaXplKCkpOwotCi0gICAgLy8gQ2hhbmdlIHRoZSBlbnRyeSB2YWx1ZS4KLSAgICBlbnRyeUJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMkZpZWxkKCkucHV0KDEsIDQpOwotICAgIHRlc3RNYXBCdWlsZGVyID0gcGFyZW50QnVpbGRlci5nZXRPcHRpb25hbE1lc3NhZ2VCdWlsZGVyKCk7Ci0gICAgdGVzdE1hcEJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgaW50TWFwRmllbGQsIDAsIGVudHJ5QnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkKGludE1hcEZpZWxkLCAwKSk7Ci0KLSAgICAvLyBTaG91bGQgYmUgYWJsZSB0byBvYnNlcnZlIHRoZSBjaGFuZ2UuCi0gICAgbWVzc2FnZSA9IHBhcmVudEJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwKLSAgICAgICAgbWVzc2FnZS5nZXRPcHRpb25hbE1lc3NhZ2UoKS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgxKS5pbnRWYWx1ZSgpKTsKLQotICAgIC8vIENsZWFyIHRoZSBuZXN0ZWQgYnVpbGRlci4KLSAgICB0ZXN0TWFwQnVpbGRlciA9IHBhcmVudEJ1aWxkZXIuZ2V0T3B0aW9uYWxNZXNzYWdlQnVpbGRlcigpOwotICAgIHRlc3RNYXBCdWlsZGVyLmNsZWFyRmllbGQoaW50TWFwRmllbGQpOwotCi0gICAgLy8gU2hvdWxkIGJlIGFibGUgdG8gb2JzZXJ2ZSB0aGUgY2hhbmdlLgotICAgIG1lc3NhZ2UgPSBwYXJlbnRCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxNZXNzYWdlKCkuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5zaXplKCkpOwotICB9Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIHRlc3QgcmVmbGVjdGlvbiBBUEkuCi0KLSAgcHJpdmF0ZSBzdGF0aWMgRmllbGREZXNjcmlwdG9yIGYoU3RyaW5nIG5hbWUpIHsKLSAgICByZXR1cm4gVGVzdE1hcC5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKG5hbWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgT2JqZWN0IGdldEZpZWxkVmFsdWUoTWVzc2FnZSBtYXBFbnRyeSwgU3RyaW5nIG5hbWUpIHsKLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBtYXBFbnRyeS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICByZXR1cm4gbWFwRW50cnkuZ2V0RmllbGQoZmllbGQpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgTWVzc2FnZS5CdWlsZGVyIHNldEZpZWxkVmFsdWUoCi0gICAgICBNZXNzYWdlLkJ1aWxkZXIgbWFwRW50cnksIFN0cmluZyBuYW1lLCBPYmplY3QgdmFsdWUpIHsKLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBtYXBFbnRyeS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICBtYXBFbnRyeS5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgIHJldHVybiBtYXBFbnRyeTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0SGFzTWFwVmFsdWVzKE1lc3NhZ2UgbWVzc2FnZSwgU3RyaW5nIG5hbWUsIE1hcDw/LCA/PiB2YWx1ZXMpIHsKLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBmKG5hbWUpOwotICAgIGZvciAoT2JqZWN0IGVudHJ5IDogKExpc3Q8Pz4pIG1lc3NhZ2UuZ2V0RmllbGQoZmllbGQpKSB7Ci0gICAgICBNZXNzYWdlIG1hcEVudHJ5ID0gKE1lc3NhZ2UpIGVudHJ5OwotICAgICAgT2JqZWN0IGtleSA9IGdldEZpZWxkVmFsdWUobWFwRW50cnksICJrZXkiKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IGdldEZpZWxkVmFsdWUobWFwRW50cnksICJ2YWx1ZSIpOwotICAgICAgYXNzZXJ0VHJ1ZSh2YWx1ZXMuY29udGFpbnNLZXkoa2V5KSk7Ci0gICAgICBhc3NlcnRFcXVhbHModmFsdWUsIHZhbHVlcy5nZXQoa2V5KSk7Ci0gICAgfQotICAgIGFzc2VydEVxdWFscyh2YWx1ZXMuc2l6ZSgpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOyBpKyspIHsKLSAgICAgIE1lc3NhZ2UgbWFwRW50cnkgPSAoTWVzc2FnZSkgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpKTsKLSAgICAgIE9iamVjdCBrZXkgPSBnZXRGaWVsZFZhbHVlKG1hcEVudHJ5LCAia2V5Iik7Ci0gICAgICBPYmplY3QgdmFsdWUgPSBnZXRGaWVsZFZhbHVlKG1hcEVudHJ5LCAidmFsdWUiKTsKLSAgICAgIGFzc2VydFRydWUodmFsdWVzLmNvbnRhaW5zS2V5KGtleSkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCB2YWx1ZXMuZ2V0KGtleSkpOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIDxLZXlUeXBlLCBWYWx1ZVR5cGU+Ci0gIE1lc3NhZ2UgbmV3TWFwRW50cnkoTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsIFN0cmluZyBuYW1lLCBLZXlUeXBlIGtleSwgVmFsdWVUeXBlIHZhbHVlKSB7Ci0gICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gYnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgZW50cnlCdWlsZGVyID0gYnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpOwotICAgIEZpZWxkRGVzY3JpcHRvciBrZXlGaWVsZCA9IGVudHJ5QnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmZpbmRGaWVsZEJ5TmFtZSgia2V5Iik7Ci0gICAgRmllbGREZXNjcmlwdG9yIHZhbHVlRmllbGQgPSBlbnRyeUJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kRmllbGRCeU5hbWUoInZhbHVlIik7Ci0gICAgZW50cnlCdWlsZGVyLnNldEZpZWxkKGtleUZpZWxkLCBrZXkpOwotICAgIGVudHJ5QnVpbGRlci5zZXRGaWVsZCh2YWx1ZUZpZWxkLCB2YWx1ZSk7Ci0gICAgcmV0dXJuIGVudHJ5QnVpbGRlci5idWlsZCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBzZXRNYXBWYWx1ZXMoTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsIFN0cmluZyBuYW1lLCBNYXA8PywgPz4gdmFsdWVzKSB7Ci0gICAgTGlzdDxNZXNzYWdlPiBlbnRyeUxpc3QgPSBuZXcgQXJyYXlMaXN0PE1lc3NhZ2U+KCk7Ci0gICAgZm9yIChNYXAuRW50cnk8PywgPz4gZW50cnkgOiB2YWx1ZXMuZW50cnlTZXQoKSkgewotICAgICAgZW50cnlMaXN0LmFkZChuZXdNYXBFbnRyeShidWlsZGVyLCBuYW1lLCBlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSkpOwotICAgIH0KLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBidWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZmluZEZpZWxkQnlOYW1lKG5hbWUpOwotICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIGVudHJ5TGlzdCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyA8S2V5VHlwZSwgVmFsdWVUeXBlPgotICBNYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBtYXBGb3JWYWx1ZXMoCi0gICAgICBLZXlUeXBlIGtleTEsIFZhbHVlVHlwZSB2YWx1ZTEsIEtleVR5cGUga2V5MiwgVmFsdWVUeXBlIHZhbHVlMikgewotICAgIE1hcDxLZXlUeXBlLCBWYWx1ZVR5cGU+IG1hcCA9IG5ldyBIYXNoTWFwPEtleVR5cGUsIFZhbHVlVHlwZT4oKTsKLSAgICBtYXAucHV0KGtleTEsIHZhbHVlMSk7Ci0gICAgbWFwLnB1dChrZXkyLCB2YWx1ZTIpOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvbkFwaSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEluIHJlZmxlY3Rpb24gQVBJLCBtYXAgZmllbGRzIGFyZSBqdXN0IHJlcGVhdGVkIG1lc3NhZ2UgZmllbGRzLgotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMSwgMik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyRmllbGQoKS5wdXQoMywgNCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb01lc3NhZ2VGaWVsZCgpLnB1dCgKLSAgICAgICAgMTEsIE1lc3NhZ2VWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMjIpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9NZXNzYWdlRmllbGQoKS5wdXQoCi0gICAgICAgIDMzLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDQ0KS5idWlsZCgpKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICAvLyBUZXN0IGdldEZpZWxkKCksIGdldFJlcGVhdGVkRmllbGRDb3VudCgpLCBnZXRSZXBlYXRlZEZpZWxkKCkuCi0gICAgYXNzZXJ0SGFzTWFwVmFsdWVzKG1lc3NhZ2UsICJpbnQzMl90b19pbnQzMl9maWVsZCIsCi0gICAgICAgIG1hcEZvclZhbHVlcygxLCAyLCAzLCA0KSk7Ci0gICAgYXNzZXJ0SGFzTWFwVmFsdWVzKG1lc3NhZ2UsICJpbnQzMl90b19tZXNzYWdlX2ZpZWxkIiwKLSAgICAgICAgbWFwRm9yVmFsdWVzKAotICAgICAgICAgICAgMTEsIE1lc3NhZ2VWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMjIpLmJ1aWxkKCksCi0gICAgICAgICAgICAzMywgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSg0NCkuYnVpbGQoKSkpOwotCi0gICAgLy8gVGVzdCBjbGVhckZpZWxkKCkKLSAgICBidWlsZGVyLmNsZWFyRmllbGQoZigiaW50MzJfdG9faW50MzJfZmllbGQiKSk7Ci0gICAgYnVpbGRlci5jbGVhckZpZWxkKGYoImludDMyX3RvX21lc3NhZ2VfZmllbGQiKSk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLnNpemUoKSk7Ci0KLSAgICAvLyBUZXN0IHNldEZpZWxkKCkKLSAgICBzZXRNYXBWYWx1ZXMoYnVpbGRlciwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwKLSAgICAgICAgbWFwRm9yVmFsdWVzKDExLCAyMiwgMzMsIDQ0KSk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIsICJpbnQzMl90b19tZXNzYWdlX2ZpZWxkIiwKLSAgICAgICAgbWFwRm9yVmFsdWVzKAotICAgICAgICAgICAgMTExLCBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDIyMikuYnVpbGQoKSwKLSAgICAgICAgICAgIDMzMywgTWVzc2FnZVZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSg0NDQpLmJ1aWxkKCkpKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygyMiwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgxMSkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ0LCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDMzKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMjIyLCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoMTExKS5nZXRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDQ0LCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoMzMzKS5nZXRWYWx1ZSgpKTsKLQotICAgIC8vIFRlc3QgYWRkUmVwZWF0ZWRGaWVsZAotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJpbnQzMl90b19pbnQzMl9maWVsZCIpLAotICAgICAgICBuZXdNYXBFbnRyeShidWlsZGVyLCAiaW50MzJfdG9faW50MzJfZmllbGQiLCA1NSwgNjYpKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigiaW50MzJfdG9fbWVzc2FnZV9maWVsZCIpLAotICAgICAgICBuZXdNYXBFbnRyeShidWlsZGVyLCAiaW50MzJfdG9fbWVzc2FnZV9maWVsZCIsIDU1NSwKLSAgICAgICAgICAgIE1lc3NhZ2VWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoNjY2KS5idWlsZCgpKSk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNjYsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoNTUpLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg2NjYsIG1lc3NhZ2UuZ2V0SW50MzJUb01lc3NhZ2VGaWVsZCgpLmdldCg1NTUpLmdldFZhbHVlKCkpOwotCi0gICAgLy8gVGVzdCBhZGRSZXBlYXRlZEZpZWxkIChvdmVycmlkaW5nIGV4aXN0aW5nIHZhbHVlcykKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigiaW50MzJfdG9faW50MzJfZmllbGQiKSwKLSAgICAgICAgbmV3TWFwRW50cnkoYnVpbGRlciwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwgNTUsIDU1KSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoImludDMyX3RvX21lc3NhZ2VfZmllbGQiKSwKLSAgICAgICAgbmV3TWFwRW50cnkoYnVpbGRlciwgImludDMyX3RvX21lc3NhZ2VfZmllbGQiLCA1NTUsCi0gICAgICAgICAgICBNZXNzYWdlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDU1NSkuYnVpbGQoKSkpOwotICAgIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU1LCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDU1KS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNTU1LCBtZXNzYWdlLmdldEludDMyVG9NZXNzYWdlRmllbGQoKS5nZXQoNTU1KS5nZXRWYWx1ZSgpKTsKLQotICAgIC8vIFRlc3Qgc2V0UmVwZWF0ZWRGaWVsZAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigiaW50MzJfdG9faW50MzJfZmllbGQiKSk7IGkrKykgewotICAgICAgTWVzc2FnZSBtYXBFbnRyeSA9IChNZXNzYWdlKSBidWlsZGVyLmdldFJlcGVhdGVkRmllbGQoZigiaW50MzJfdG9faW50MzJfZmllbGQiKSwgaSk7Ci0gICAgICBpbnQgb2xkS2V5ID0gKChJbnRlZ2VyKSBnZXRGaWVsZFZhbHVlKG1hcEVudHJ5LCAia2V5IikpLmludFZhbHVlKCk7Ci0gICAgICBpbnQgb2xkVmFsdWUgPSAoKEludGVnZXIpIGdldEZpZWxkVmFsdWUobWFwRW50cnksICJ2YWx1ZSIpKS5pbnRWYWx1ZSgpOwotICAgICAgLy8gU3dhcCBrZXkgd2l0aCB2YWx1ZSBmb3IgZWFjaCBlbnRyeS4KLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBtYXBFbnRyeUJ1aWxkZXIgPSBtYXBFbnRyeS50b0J1aWxkZXIoKTsKLSAgICAgIHNldEZpZWxkVmFsdWUobWFwRW50cnlCdWlsZGVyLCAia2V5Iiwgb2xkVmFsdWUpOwotICAgICAgc2V0RmllbGRWYWx1ZShtYXBFbnRyeUJ1aWxkZXIsICJ2YWx1ZSIsIG9sZEtleSk7Ci0gICAgICBidWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZigiaW50MzJfdG9faW50MzJfZmllbGQiKSwgaSwgbWFwRW50cnlCdWlsZGVyLmJ1aWxkKCkpOwotICAgIH0KLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxMSwgbWVzc2FnZS5nZXRJbnQzMlRvSW50MzJGaWVsZCgpLmdldCgyMikuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMzLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMkZpZWxkKCkuZ2V0KDQ0KS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNTUsIG1lc3NhZ2UuZ2V0SW50MzJUb0ludDMyRmllbGQoKS5nZXQoNTUpLmludFZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRleHRGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIHNldE1hcFZhbHVlcyhidWlsZGVyKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBTdHJpbmcgdGV4dERhdGEgPSBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcobWVzc2FnZSk7Ci0KLSAgICBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZSh0ZXh0RGF0YSwgYnVpbGRlcik7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGFzc2VydE1hcFZhbHVlc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIFRlc3RNYXAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIE1lc3NhZ2UgZHluYW1pY0RlZmF1bHRJbnN0YW5jZSA9Ci0gICAgICAgIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShUZXN0TWFwLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgTWVzc2FnZSBkeW5hbWljTWVzc2FnZSA9IGR5bmFtaWNEZWZhdWx0SW5zdGFuY2UKLSAgICAgICAgLm5ld0J1aWxkZXJGb3JUeXBlKCkubWVyZ2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgZHluYW1pY01lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmhhc2hDb2RlKCksIGR5bmFtaWNNZXNzYWdlLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25FcXVhbHNBbmRIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3QgdGhhdCBnZW5lcmF0ZWQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkgd2lsbCBkaXNyZWdhcmQgdGhlIG9yZGVyCi0gICAgLy8gb2YgbWFwIGVudHJpZXMgd2hlbiBjb21wYXJpbmcvaGFzaGluZyBtYXAgZmllbGRzLgotCi0gICAgLy8gV2UgdXNlIER5bmFtaWNNZXNzYWdlIHRvIHRlc3QgcmVmbGVjdGlvbiBiYXNlZCBlcXVhbHMoKS9oYXNoQ29kZSgpLgotICAgIE1lc3NhZ2UgZHluYW1pY0RlZmF1bHRJbnN0YW5jZSA9Ci0gICAgICAgIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShUZXN0TWFwLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZigiaW50MzJfdG9faW50MzJfZmllbGQiKTsKLQotICAgIE1lc3NhZ2UuQnVpbGRlciBiMSA9IGR5bmFtaWNEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICBiMS5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBuZXdNYXBFbnRyeShiMSwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwgMSwgMikpOwotICAgIGIxLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIG5ld01hcEVudHJ5KGIxLCAiaW50MzJfdG9faW50MzJfZmllbGQiLCAzLCA0KSk7Ci0gICAgYjEuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgbmV3TWFwRW50cnkoYjEsICJpbnQzMl90b19pbnQzMl9maWVsZCIsIDUsIDYpKTsKLSAgICBNZXNzYWdlIG0xID0gYjEuYnVpbGQoKTsKLQotICAgIE1lc3NhZ2UuQnVpbGRlciBiMiA9IGR5bmFtaWNEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICBiMi5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBuZXdNYXBFbnRyeShiMiwgImludDMyX3RvX2ludDMyX2ZpZWxkIiwgNSwgNikpOwotICAgIGIyLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIG5ld01hcEVudHJ5KGIyLCAiaW50MzJfdG9faW50MzJfZmllbGQiLCAxLCAyKSk7Ci0gICAgYjIuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgbmV3TWFwRW50cnkoYjIsICJpbnQzMl90b19pbnQzMl9maWVsZCIsIDMsIDQpKTsKLSAgICBNZXNzYWdlIG0yID0gYjIuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscyhtMSwgbTIpOwotICAgIGFzc2VydEVxdWFscyhtMS5oYXNoQ29kZSgpLCBtMi5oYXNoQ29kZSgpKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB3ZSBkaWQgY29tcGFyZSBtYXAgZmllbGRzLgotICAgIGIyLnNldFJlcGVhdGVkRmllbGQoZmllbGQsIDAsIG5ld01hcEVudHJ5KGIxLCAiaW50MzJfdG9faW50MzJfZmllbGQiLCAwLCAwKSk7Ci0gICAgbTIgPSBiMi5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG0xLmVxdWFscyhtMikpOwotICAgIC8vIERvbid0IGNoZWNrIG0xLmhhc2hDb2RlKCkgIT0gbTIuaGFzaENvZGUoKSBiZWNhdXNlIGl0J3Mgbm90IGd1YXJhbnRlZWQKLSAgICAvLyB0byBiZSBkaWZmZXJlbnQuCi0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkVudW1WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGRWYWx1ZSgpLnB1dCgwLCAwKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bUZpZWxkVmFsdWUoKS5wdXQoMSwgMSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1GaWVsZFZhbHVlKCkucHV0KDIsIDEwMDApOyAgLy8gdW5rbm93biB2YWx1ZS4KLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoVGVzdE1hcC5FbnVtVmFsdWUuRk9PLAotICAgICAgICBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TWFwLkVudW1WYWx1ZS5CQVIsCi0gICAgICAgIG1lc3NhZ2UuZ2V0SW50MzJUb0VudW1GaWVsZCgpLmdldCgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RNYXAuRW51bVZhbHVlLlVOUkVDT0dOSVpFRCwKLSAgICAgICAgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkKCkuZ2V0KDIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwMCwgbWVzc2FnZS5nZXRJbnQzMlRvRW51bUZpZWxkVmFsdWUoKS5nZXQoMikuaW50VmFsdWUoKSk7Ci0KLSAgICAvLyBVbmtub3duIGVudW0gdmFsdWVzIHNob3VsZCBiZSBwcmVzZXJ2ZWQgYWZ0ZXI6Ci0gICAgLy8gICAxLiBTZXJpYWxpemF0aW9uIGFuZCBwYXJzaW5nLgotICAgIC8vICAgMi4gdG9CdWlsZCgpLgotICAgIC8vICAgMy4gbWVyZ2VGcm9tKCkuCi0gICAgbWVzc2FnZSA9IFRlc3RNYXAucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICAgIGFzc2VydEVxdWFscygxMDAwLCBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGRWYWx1ZSgpLmdldCgyKS5pbnRWYWx1ZSgpKTsKLSAgICBidWlsZGVyID0gbWVzc2FnZS50b0J1aWxkZXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwMCwgYnVpbGRlci5nZXRJbnQzMlRvRW51bUZpZWxkVmFsdWUoKS5nZXQoMikuaW50VmFsdWUoKSk7Ci0gICAgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpLm1lcmdlRnJvbShtZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwMCwgYnVpbGRlci5nZXRJbnQzMlRvRW51bUZpZWxkVmFsdWUoKS5nZXQoMikuaW50VmFsdWUoKSk7Ci0KLSAgICAvLyBoYXNoQ29kZSgpL2VxdWFscygpIHNob3VsZCB0YWtlIHVua25vd24gZW51bSB2YWx1ZXMgaW50byBhY2NvdW50LgotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGRWYWx1ZSgpLnB1dCgyLCAxMDAxKTsKLSAgICBUZXN0TWFwIG1lc3NhZ2UyID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzaENvZGUoKSA9PSBtZXNzYWdlMi5oYXNoQ29kZSgpKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmVxdWFscyhtZXNzYWdlMikpOwotICAgIC8vIFVua25vd24gdmFsdWVzIHdpbGwgYmUgY29udmVydGVkIHRvIFVOUkVDT0dOSVpFRCBzbyB0aGUgcmVzdWx0ZWQgZW51bSBtYXAKLSAgICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuCi0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGQoKS5lcXVhbHMobWVzc2FnZTIuZ2V0SW50MzJUb0VudW1GaWVsZCgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkVudW1WYWx1ZXNJblJlZmxlY3Rpb25BcGkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0TWFwLmdldERlc2NyaXB0b3IoKTsKLSAgICBFbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvciA9IFRlc3RNYXAuRW51bVZhbHVlLmdldERlc2NyaXB0b3IoKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgiaW50MzJfdG9fZW51bV9maWVsZCIpOwotCi0gICAgTWFwPEludGVnZXIsIEludGVnZXI+IGRhdGEgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgIGRhdGEucHV0KDAsIDApOwotICAgIGRhdGEucHV0KDEsIDEpOwotICAgIGRhdGEucHV0KDIsIDEwMDApOyAgLy8gdW5rbm93biB2YWx1ZS4KLQotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgOiBkYXRhLmVudHJ5U2V0KCkpIHsKLSAgICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtRmllbGRWYWx1ZSgpLnB1dChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLy8gVHJ5IHRvIHJlYWQgdW5rbm93biBlbnVtIHZhbHVlcyB1c2luZyByZWZsZWN0aW9uIEFQSS4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsgaSsrKSB7Ci0gICAgICBNZXNzYWdlIG1hcEVudHJ5ID0gKE1lc3NhZ2UpIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaSk7Ci0gICAgICBpbnQga2V5ID0gKChJbnRlZ2VyKSBnZXRGaWVsZFZhbHVlKG1hcEVudHJ5LCAia2V5IikpLmludFZhbHVlKCk7Ci0gICAgICBpbnQgdmFsdWUgPSAoKEVudW1WYWx1ZURlc2NyaXB0b3IpIGdldEZpZWxkVmFsdWUobWFwRW50cnksICJ2YWx1ZSIpKS5nZXROdW1iZXIoKTsKLSAgICAgIGFzc2VydEVxdWFscyhkYXRhLmdldChrZXkpLmludFZhbHVlKCksIHZhbHVlKTsKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBtYXBFbnRyeUJ1aWxkZXIgPSBtYXBFbnRyeS50b0J1aWxkZXIoKTsKLSAgICAgIC8vIEluY3JlYXNlIHRoZSB2YWx1ZSBieSAxLgotICAgICAgc2V0RmllbGRWYWx1ZShtYXBFbnRyeUJ1aWxkZXIsICJ2YWx1ZSIsCi0gICAgICAgICAgZW51bURlc2NyaXB0b3IuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSArIDEpKTsKLSAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaSwgbWFwRW50cnlCdWlsZGVyLmJ1aWxkKCkpOwotICAgIH0KLQotICAgIC8vIFZlcmlmeSB0aGF0IGVudW0gdmFsdWVzIGhhdmUgYmVlbiBzdWNjZXNzZnVsbHkgdXBkYXRlZC4KLSAgICBUZXN0TWFwIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgZm9yIChNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgOiBtZXNzYWdlLmdldEludDMyVG9FbnVtRmllbGRWYWx1ZSgpLmVudHJ5U2V0KCkpIHsKLSAgICAgIGFzc2VydEVxdWFscyhkYXRhLmdldChlbnRyeS5nZXRLZXkoKSkgKyAxLCBlbnRyeS5nZXRWYWx1ZSgpLmludFZhbHVlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRpb25PcmRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0TWFwVmFsdWVzKGJ1aWxkZXIpOwotICAgIFRlc3RNYXAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KCIxIiwgIjIiLCAiMyIpLAotICAgICAgICBuZXcgQXJyYXlMaXN0PFN0cmluZz4obWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyRmllbGQoKS5rZXlTZXQoKSkpOwotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyA8SywgVj4gTWFwPEssIFY+IG5ld01hcChLIGtleTEsIFYgdmFsdWUxKSB7Ci0gICAgTWFwPEssIFY+IG1hcCA9IG5ldyBIYXNoTWFwPEssIFY+KCk7Ci0gICAgbWFwLnB1dChrZXkxLCB2YWx1ZTEpOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIDxLLCBWPiBNYXA8SywgVj4gbmV3TWFwKEsga2V5MSwgViB2YWx1ZTEsIEsga2V5MiwgViB2YWx1ZTIpIHsKLSAgICBNYXA8SywgVj4gbWFwID0gbmV3IEhhc2hNYXA8SywgVj4oKTsKLSAgICBtYXAucHV0KGtleTEsIHZhbHVlMSk7Ci0gICAgbWFwLnB1dChrZXkyLCB2YWx1ZTIpOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGNkMWFiYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwzNTMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZEZvcmVpZ247Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBNaXNjLiB1bml0IHRlc3RzIGZvciBtZXNzYWdlIG9wZXJhdGlvbnMgdGhhdCBhcHBseSB0byBib3RoIGdlbmVyYXRlZAotICogYW5kIGR5bmFtaWMgbWVzc2FnZXMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIE1lc3NhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBNZXNzYWdlLW1lcmdpbmcgdGVzdHMuCi0KLSAgc3RhdGljIGZpbmFsIFRlc3RBbGxUeXBlcyBNRVJHRV9TT1VSQ0UgPQotICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgIC5zZXRPcHRpb25hbEludDMyKDEpCi0gICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoImZvbyIpCi0gICAgICAuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkKLSAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygiYmFyIikKLSAgICAgIC5idWlsZCgpOwotCi0gIHN0YXRpYyBmaW5hbCBUZXN0QWxsVHlwZXMgTUVSR0VfREVTVCA9Ci0gICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgLnNldE9wdGlvbmFsSW50NjQoMikKLSAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiYmF6IikKLSAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDMpLmJ1aWxkKCkpCi0gICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoInF1eCIpCi0gICAgICAuYnVpbGQoKTsKLQotICBzdGF0aWMgZmluYWwgU3RyaW5nIE1FUkdFX1JFU1VMVF9URVhUID0KLSAgICAgICJvcHRpb25hbF9pbnQzMjogMVxuIiArCi0gICAgICAib3B0aW9uYWxfaW50NjQ6IDJcbiIgKwotICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIlxuIiArCi0gICAgICAib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIHtcbiIgKwotICAgICAgIiAgYzogM1xuIiArCi0gICAgICAifVxuIiArCi0gICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcInF1eFwiXG4iICsKLSAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiYmFyXCJcbiI7Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyByZXN1bHQgPQotICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoTUVSR0VfREVTVCkKLSAgICAgICAgLm1lcmdlRnJvbShNRVJHRV9TT1VSQ0UpLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoTUVSR0VfUkVTVUxUX1RFWFQsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0IG1lcmdpbmcgYSBEeW5hbWljTWVzc2FnZSBpbnRvIGEgR2VuZXJhdGVkTWVzc2FnZS4gIEFzIGxvbmcgYXMgdGhleQotICAgKiBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3IsIHRoaXMgc2hvdWxkIHdvcmssIGJ1dCBpdCBpcyBhbiBlbnRpcmVseSBkaWZmZXJlbnQKLSAgICogY29kZSBwYXRoLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRnJvbUR5bmFtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgcmVzdWx0ID0KLSAgICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKE1FUkdFX0RFU1QpCi0gICAgICAgIC5tZXJnZUZyb20oRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihNRVJHRV9TT1VSQ0UpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKE1FUkdFX1JFU1VMVF9URVhULCByZXN1bHQudG9TdHJpbmcoKSk7Ci0gIH0KLQotICAvKiogVGVzdCBtZXJnaW5nIHR3byBEeW5hbWljTWVzc2FnZXMuICovCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRHluYW1pY01lc3NhZ2UgcmVzdWx0ID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoTUVSR0VfREVTVCkKLSAgICAgICAgLm1lcmdlRnJvbShEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKE1FUkdFX1NPVVJDRSkuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoTUVSR0VfUkVTVUxUX1RFWFQsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFJlcXVpcmVkLWZpZWxkLXJlbGF0ZWQgdGVzdHMuCi0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVzdFJlcXVpcmVkIFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCA9Ci0gICAgVGVzdFJlcXVpcmVkLmdldERlZmF1bHRJbnN0YW5jZSgpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXN0UmVxdWlyZWQgVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCA9Ci0gICAgVGVzdFJlcXVpcmVkLm5ld0J1aWxkZXIoKS5zZXRBKDEpLnNldEIoMikuc2V0QygzKS5idWlsZCgpOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpOwotCi0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGJ1aWxkZXIuc2V0QSgxKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYnVpbGRlci5zZXRCKDEpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBidWlsZGVyLnNldEMoMSk7Ci0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRGb3JlaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWRGb3JlaWduLm5ld0J1aWxkZXIoKTsKLQotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRSZXBlYXRlZE1lc3NhZ2UoMCwgVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVxdWlyZWRFeHRlbnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0KLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFRlc3RSZXF1aXJlZC5zaW5nbGUsIFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdFJlcXVpcmVkLnNpbmdsZSwgVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLmFkZEV4dGVuc2lvbihUZXN0UmVxdWlyZWQubXVsdGksIFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdFJlcXVpcmVkLm11bHRpLCAwLCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZER5bmFtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpOwotICAgIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoZGVzY3JpcHRvcik7Ci0KLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYnVpbGRlci5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgiYSIpLCAxKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYnVpbGRlci5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgiYiIpLCAxKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYnVpbGRlci5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgiYyIpLCAxKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZER5bmFtaWNGb3JlaWduKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkRm9yZWlnbi5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRHluYW1pY01lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihkZXNjcmlwdG9yKTsKLQotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbWVzc2FnZSIpLAotICAgICAgICAgICAgICAgICAgICAgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9tZXNzYWdlIiksCi0gICAgICAgICAgICAgICAgICAgICBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbWVzc2FnZSIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbWVzc2FnZSIpLCAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RVbmluaXRpYWxpemVkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gZSkgewotICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBhLCBiLCBjIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCdWlsZFBhcnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBXZSdyZSBtb3N0bHkgdGVzdGluZyB0aGF0IG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgVGVzdFJlcXVpcmVkIG1lc3NhZ2UgPSBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXN0ZWRVbmluaXRpYWxpemVkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQotICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKLSAgICAgICAgLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCi0gICAgICAgIC5idWlsZCgpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiICsKLSAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYSwgIiArCi0gICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmIsICIgKwotICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5jLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYSwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmIsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5jLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYSwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmIsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5jIiwKLSAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCdWlsZE5lc3RlZFBhcnRpYWwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBXZSdyZSBtb3N0bHkgdGVzdGluZyB0aGF0IG5vIGV4Y2VwdGlvbiBpcyB0aHJvd24uCi0gICAgVGVzdFJlcXVpcmVkRm9yZWlnbiBtZXNzYWdlID0KLSAgICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQotICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKLSAgICAgICAgLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCi0gICAgICAgIC5idWlsZFBhcnRpYWwoKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbml0aXRpYWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFRlc3RSZXF1aXJlZC5wYXJzZUZyb20oQnl0ZVN0cmluZy5FTVBUWSk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlTmVzdGVkVW5pdGl0aWFsaXplZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcgZGF0YSA9Ci0gICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKLSAgICAgICAgLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCi0gICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQotICAgICAgICAuYnVpbGRQYXJ0aWFsKCkudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICB0cnkgewotICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5wYXJzZUZyb20oZGF0YSk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiICsKLSAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYSwgIiArCi0gICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmIsICIgKwotICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5jLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYSwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmIsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5jLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYSwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmIsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5jIiwKLSAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljVW5pbml0aWFsaXplZEV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCkpLmJ1aWxkKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY0J1aWxkUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFdlJ3JlIG1vc3RseSB0ZXN0aW5nIHRoYXQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICBEeW5hbWljTWVzc2FnZSBtZXNzYWdlID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKSkKLSAgICAgICAgLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljUGFyc2VVbml0aXRpYWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCk7Ci0gICAgICBEeW5hbWljTWVzc2FnZS5wYXJzZUZyb20oZGVzY3JpcHRvciwgQnl0ZVN0cmluZy5FTVBUWSk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0gIAotICAvKiogVGVzdCByZWFkaW5nIHVuc2V0IHJlcGVhdGVkIG1lc3NhZ2UgZnJvbSBEeW5hbWljTWVzc2FnZS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNSZXBlYXRlZE1lc3NhZ2VOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKTsKLSAgICBEeW5hbWljTWVzc2FnZSByZXN1bHQgPQotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKQotICAgICAgICAubWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoTUVSR0VfU09VUkNFKS5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIGFzc2VydFRydWUocmVzdWx0LmdldEZpZWxkKHJlc3VsdC5nZXREZXNjcmlwdG9yRm9yVHlwZSgpCi0gICAgICAgIC5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSBpbnN0YW5jZW9mIExpc3Q8Pz4pOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KHJlc3VsdC5nZXREZXNjcmlwdG9yRm9yVHlwZSgpCi0gICAgICAgIC5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSwgMCk7Ci0gIH0KLSAgCi0gIC8qKiBUZXN0IHJlYWRpbmcgcmVwZWF0ZWQgbWVzc2FnZSBmcm9tIER5bmFtaWNNZXNzYWdlLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY1JlcGVhdGVkTWVzc2FnZU5vdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLQotICAgIFRlc3RBbGxUeXBlcyBSRVBFQVRFRF9ORVNURUQgPQotICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxKQotICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoImZvbyIpCi0gICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImJhciIpCi0gICAgICAgIC5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQotICAgICAgICAuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKTsKLSAgICBEeW5hbWljTWVzc2FnZSByZXN1bHQgPQotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKQotICAgICAgICAubWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoUkVQRUFURURfTkVTVEVEKS5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIGFzc2VydFRydWUocmVzdWx0LmdldEZpZWxkKHJlc3VsdC5nZXREZXNjcmlwdG9yRm9yVHlwZSgpCi0gICAgICAgIC5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSBpbnN0YW5jZW9mIExpc3Q8Pz4pOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KHJlc3VsdC5nZXREZXNjcmlwdG9yRm9yVHlwZSgpCi0gICAgICAgIC5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSwgMik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmVzdGVkQnVpbGRlcnNUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL05lc3RlZEJ1aWxkZXJzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDJlMjhjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmVzdGVkQnVpbGRlcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlZlaGljbGU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuV2hlZWw7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRlc3QgY2FzZXMgdGhhdCBleGVyY2lzZSBlbmQtdG8tZW5kIHVzZSBjYXNlcyBpbnZvbHZpbmcKLSAqIHtAbGluayBTaW5nbGVGaWVsZEJ1aWxkZXJ9IGFuZCB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9LgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgY2xhc3MgTmVzdGVkQnVpbGRlcnNUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlc0FuZEJ1aWxkZXJzKCkgewotICAgIFZlaGljbGUuQnVpbGRlciB2ZWhpY2xlQnVpbGRlciA9IFZlaGljbGUubmV3QnVpbGRlcigpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoNCkKLSAgICAgICAgLnNldFdpZHRoKDEpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoNCkKLSAgICAgICAgLnNldFdpZHRoKDIpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoNCkKLSAgICAgICAgLnNldFdpZHRoKDMpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoNCkKLSAgICAgICAgLnNldFdpZHRoKDQpOwotICAgIHZlaGljbGVCdWlsZGVyLmdldEVuZ2luZUJ1aWxkZXIoKQotICAgICAgICAuc2V0TGl0ZXJzKDEwKTsKLQotICAgIFZlaGljbGUgdmVoaWNsZSA9IHZlaGljbGVCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIHZlaGljbGUuZ2V0V2hlZWxDb3VudCgpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgV2hlZWwgd2hlZWwgPSB2ZWhpY2xlLmdldFdoZWVsKGkpOwotICAgICAgYXNzZXJ0RXF1YWxzKDQsIHdoZWVsLmdldFJhZGl1cygpKTsKLSAgICAgIGFzc2VydEVxdWFscyhpICsgMSwgd2hlZWwuZ2V0V2lkdGgoKSk7Ci0gICAgfQotICAgIGFzc2VydEVxdWFscygxMCwgdmVoaWNsZS5nZXRFbmdpbmUoKS5nZXRMaXRlcnMoKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgICAgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxCdWlsZGVyKGkpCi0gICAgICAgICAgLnNldFJhZGl1cyg1KQotICAgICAgICAgIC5zZXRXaWR0aChpICsgMTApOwotICAgIH0KLSAgICB2ZWhpY2xlQnVpbGRlci5nZXRFbmdpbmVCdWlsZGVyKCkuc2V0TGl0ZXJzKDIwKTsKLQotICAgIHZlaGljbGUgPSB2ZWhpY2xlQnVpbGRlci5idWlsZCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICBXaGVlbCB3aGVlbCA9IHZlaGljbGUuZ2V0V2hlZWwoaSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNSwgd2hlZWwuZ2V0UmFkaXVzKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAxMCwgd2hlZWwuZ2V0V2lkdGgoKSk7Ci0gICAgfQotICAgIGFzc2VydEVxdWFscygyMCwgdmVoaWNsZS5nZXRFbmdpbmUoKS5nZXRMaXRlcnMoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSh2ZWhpY2xlLmhhc0VuZ2luZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlc0FyZUNhY2hlZCgpIHsKLSAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQotICAgICAgICAuc2V0UmFkaXVzKDEpCi0gICAgICAgIC5zZXRXaWR0aCgyKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQotICAgICAgICAuc2V0UmFkaXVzKDMpCi0gICAgICAgIC5zZXRXaWR0aCg0KTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQotICAgICAgICAuc2V0UmFkaXVzKDUpCi0gICAgICAgIC5zZXRXaWR0aCg2KTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQotICAgICAgICAuc2V0UmFkaXVzKDcpCi0gICAgICAgIC5zZXRXaWR0aCg4KTsKLQotICAgIC8vIE1ha2Ugc3VyZSBtZXNzYWdlcyBhcmUgY2FjaGVkLgotICAgIExpc3Q8V2hlZWw+IHdoZWVscyA9IG5ldyBBcnJheUxpc3Q8V2hlZWw+KHZlaGljbGVCdWlsZGVyLmdldFdoZWVsTGlzdCgpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdoZWVscy5zaXplKCk7IGkrKykgewotICAgICAgYXNzZXJ0U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7Ci0gICAgfQotCi0gICAgLy8gTm93IGdldCBidWlsZGVycyBhbmQgY2hlY2sgdGhleSBkaWRuJ3QgY2hhbmdlLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2hlZWxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aGVlbHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydFNhbWUod2hlZWxzLmdldChpKSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoaSkpOwotICAgIH0KLQotICAgIC8vIENoYW5nZSBqdXN0IG9uZQotICAgIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsQnVpbGRlcigzKQotICAgICAgICAuc2V0UmFkaXVzKDIwKS5zZXRXaWR0aCgyMCk7Ci0KLSAgICAvLyBOb3cgZ2V0IHdoZWVscyBhbmQgY2hlY2sgdGhhdCBvbmx5IHRoYXQgb25lIGNoYW5nZWQKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdoZWVscy5zaXplKCk7IGkrKykgewotICAgICAgaWYgKGkgPCAzKSB7Ci0gICAgICAgIGFzc2VydFNhbWUod2hlZWxzLmdldChpKSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoaSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYXNzZXJ0Tm90U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlbW92ZV9XaXRoTmVzdGVkQnVpbGRlcnMoKSB7Ci0gICAgVmVoaWNsZS5CdWlsZGVyIHZlaGljbGVCdWlsZGVyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cygxKQotICAgICAgICAuc2V0V2lkdGgoMSk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cygyKQotICAgICAgICAuc2V0V2lkdGgoMik7Ci0gICAgdmVoaWNsZUJ1aWxkZXIucmVtb3ZlV2hlZWwoMCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoMCkuZ2V0UmFkaXVzKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlbW92ZV9XaXRoTmVzdGVkTWVzc2FnZXMoKSB7Ci0gICAgVmVoaWNsZS5CdWlsZGVyIHZlaGljbGVCdWlsZGVyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWwoV2hlZWwubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoMSkKLSAgICAgICAgLnNldFdpZHRoKDEpKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbChXaGVlbC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cygyKQotICAgICAgICAuc2V0V2lkdGgoMikpOwotICAgIHZlaGljbGVCdWlsZGVyLnJlbW92ZVdoZWVsKDApOwotCi0gICAgYXNzZXJ0RXF1YWxzKDEsIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsKDApLmdldFJhZGl1cygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHsKLSAgICBWZWhpY2xlIHZlaGljbGUxID0gVmVoaWNsZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFdoZWVsKFdoZWVsLm5ld0J1aWxkZXIoKS5zZXRSYWRpdXMoMSkuYnVpbGQoKSkKLSAgICAgICAgLmFkZFdoZWVsKFdoZWVsLm5ld0J1aWxkZXIoKS5zZXRSYWRpdXMoMikuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBWZWhpY2xlIHZlaGljbGUyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLm1lcmdlRnJvbSh2ZWhpY2xlMSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgLy8gTGlzdCBzaG91bGQgYmUgdGhlIHNhbWUgLS0gbm8gYWxsb2NhdGlvbgotICAgIGFzc2VydFNhbWUodmVoaWNsZTEuZ2V0V2hlZWxMaXN0KCksIHZlaGljbGUyLmdldFdoZWVsTGlzdCgpKTsKLQotICAgIFZlaGljbGUgdmVoaWNsZTMgPSB2ZWhpY2xlMS50b0J1aWxkZXIoKS5idWlsZCgpOwotICAgIGFzc2VydFNhbWUodmVoaWNsZTEuZ2V0V2hlZWxMaXN0KCksIHZlaGljbGUzLmdldFdoZWVsTGlzdCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXR0aW5nQnVpbGRlck1hcmtzRmllbGRBc0hhdmluZygpIHsKLSAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5nZXRFbmdpbmVCdWlsZGVyKCk7Ci0gICAgVmVoaWNsZSB2ZWhpY2xlID0gdmVoaWNsZUJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYXNzZXJ0VHJ1ZSh2ZWhpY2xlLmhhc0VuZ2luZSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OaW9CeXRlU3RyaW5nVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OaW9CeXRlU3RyaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YmU1YjkzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmlvQnl0ZVN0cmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDYyMCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuVVRGXzg7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uRU9GRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk5vU3VjaEVsZW1lbnRFeGNlcHRpb247Ci0KLS8qKgotICogVGVzdHMgZm9yIHtAbGluayBOaW9CeXRlU3RyaW5nfS4KLSAqLwotcHVibGljIGNsYXNzIE5pb0J5dGVTdHJpbmdUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCeXRlU3RyaW5nIEVNUFRZID0gbmV3IE5pb0J5dGVTdHJpbmcoQnl0ZUJ1ZmZlci53cmFwKG5ldyBieXRlWzBdKSk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBDTEFTU05BTUUgPSBOaW9CeXRlU3RyaW5nLmNsYXNzLmdldFNpbXBsZU5hbWUoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgYnl0ZVtdIEJZVEVTID0gQnl0ZVN0cmluZ1Rlc3QuZ2V0VGVzdEJ5dGVzKDEyMzQsIDExMzM3NzY2TCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBFWFBFQ1RFRF9IQVNIID0gQnl0ZVN0cmluZy53cmFwKEJZVEVTKS5oYXNoQ29kZSgpOwotCi0gIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBiYWNraW5nQnVmZmVyID0gQnl0ZUJ1ZmZlci53cmFwKEJZVEVTLmNsb25lKCkpOwotICBwcml2YXRlIGZpbmFsIEJ5dGVTdHJpbmcgdGVzdFN0cmluZyA9IG5ldyBOaW9CeXRlU3RyaW5nKGJhY2tpbmdCdWZmZXIpOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHBlY3RlZFR5cGUoKSB7Ci0gICAgU3RyaW5nIGFjdHVhbENsYXNzTmFtZSA9IGdldEFjdHVhbENsYXNzTmFtZSh0ZXN0U3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoQ0xBU1NOQU1FICsgIiBzaG91bGQgbWF0Y2ggdHlwZSBleGFjdGx5IiwgQ0xBU1NOQU1FLCBhY3R1YWxDbGFzc05hbWUpOwotICB9Ci0KLSAgcHJvdGVjdGVkIFN0cmluZyBnZXRBY3R1YWxDbGFzc05hbWUoT2JqZWN0IG9iamVjdCkgewotICAgIFN0cmluZyBhY3R1YWxDbGFzc05hbWUgPSBvYmplY3QuZ2V0Q2xhc3MoKS5nZXROYW1lKCk7Ci0gICAgYWN0dWFsQ2xhc3NOYW1lID0gYWN0dWFsQ2xhc3NOYW1lLnN1YnN0cmluZyhhY3R1YWxDbGFzc05hbWUubGFzdEluZGV4T2YoJy4nKSArIDEpOwotICAgIHJldHVybiBhY3R1YWxDbGFzc05hbWU7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Qnl0ZUF0KCkgewotICAgIGJvb2xlYW4gc3RpbGxFcXVhbCA9IHRydWU7Ci0gICAgZm9yIChpbnQgaSA9IDA7IHN0aWxsRXF1YWwgJiYgaSA8IEJZVEVTLmxlbmd0aDsgKytpKSB7Ci0gICAgICBzdGlsbEVxdWFsID0gKEJZVEVTW2ldID09IHRlc3RTdHJpbmcuYnl0ZUF0KGkpKTsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZShDTEFTU05BTUUgKyAiIG11c3QgY2FwdHVyZSB0aGUgcmlnaHQgYnl0ZXMiLCBzdGlsbEVxdWFsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCeXRlSXRlcmF0b3IoKSB7Ci0gICAgYm9vbGVhbiBzdGlsbEVxdWFsID0gdHJ1ZTsKLSAgICBCeXRlU3RyaW5nLkJ5dGVJdGVyYXRvciBpdGVyID0gdGVzdFN0cmluZy5pdGVyYXRvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBzdGlsbEVxdWFsICYmIGkgPCBCWVRFUy5sZW5ndGg7ICsraSkgewotICAgICAgc3RpbGxFcXVhbCA9IChpdGVyLmhhc05leHQoKSAmJiBCWVRFU1tpXSA9PSBpdGVyLm5leHRCeXRlKCkpOwotICAgIH0KLSAgICBhc3NlcnRUcnVlKENMQVNTTkFNRSArICIgbXVzdCBjYXB0dXJlIHRoZSByaWdodCBieXRlcyIsIHN0aWxsRXF1YWwpOwotICAgIGFzc2VydEZhbHNlKENMQVNTTkFNRSArICIgbXVzdCBoYXZlIGV4aGF1c3RlZCB0aGUgaXRlcnRvciIsIGl0ZXIuaGFzTmV4dCgpKTsKLQotICAgIHRyeSB7Ci0gICAgICBpdGVyLm5leHRCeXRlKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKE5vU3VjaEVsZW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJ5dGVJdGVyYWJsZSgpIHsKLSAgICBib29sZWFuIHN0aWxsRXF1YWwgPSB0cnVlOwotICAgIGludCBqID0gMDsKLSAgICBmb3IgKGJ5dGUgcXVhbnR1bSA6IHRlc3RTdHJpbmcpIHsKLSAgICAgIHN0aWxsRXF1YWwgPSAoQllURVNbal0gPT0gcXVhbnR1bSk7Ci0gICAgICArK2o7Ci0gICAgfQotICAgIGFzc2VydFRydWUoQ0xBU1NOQU1FICsgIiBtdXN0IGNhcHR1cmUgdGhlIHJpZ2h0IGJ5dGVzIGFzIEJ5dGVzIiwgc3RpbGxFcXVhbCk7Ci0gICAgYXNzZXJ0RXF1YWxzKENMQVNTTkFNRSArICIgaXRlcmFibGUgY2hhcmFjdGVyIGNvdW50IiwgQllURVMubGVuZ3RoLCBqKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTaXplKCkgewotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIG11c3QgaGF2ZSB0aGUgZXhwZWN0ZWQgc2l6ZSIsIEJZVEVTLmxlbmd0aCwKLSAgICAgICAgdGVzdFN0cmluZy5zaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldFRyZWVEZXB0aCgpIHsKLSAgICBhc3NlcnRFcXVhbHMoQ0xBU1NOQU1FICsgIiBtdXN0IGhhdmUgZGVwdGggMCIsIDAsIHRlc3RTdHJpbmcuZ2V0VHJlZURlcHRoKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdElzQmFsYW5jZWQoKSB7Ci0gICAgYXNzZXJ0VHJ1ZShDTEFTU05BTUUgKyAiIGlzIHRlY2huaWNhbGx5IGJhbGFuY2VkIiwgdGVzdFN0cmluZy5pc0JhbGFuY2VkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvcHlUb19CeXRlQXJyYXlPZmZzZXRMZW5ndGgoKSB7Ci0gICAgaW50IGRlc3RpbmF0aW9uT2Zmc2V0ID0gNTA7Ci0gICAgaW50IGxlbmd0aCA9IDEwMDsKLSAgICBieXRlW10gZGVzdGluYXRpb24gPSBuZXcgYnl0ZVtkZXN0aW5hdGlvbk9mZnNldCArIGxlbmd0aF07Ci0gICAgaW50IHNvdXJjZU9mZnNldCA9IDIxMzsKLSAgICB0ZXN0U3RyaW5nLmNvcHlUbyhkZXN0aW5hdGlvbiwgc291cmNlT2Zmc2V0LCBkZXN0aW5hdGlvbk9mZnNldCwgbGVuZ3RoKTsKLSAgICBib29sZWFuIHN0aWxsRXF1YWwgPSB0cnVlOwotICAgIGZvciAoaW50IGkgPSAwOyBzdGlsbEVxdWFsICYmIGkgPCBsZW5ndGg7ICsraSkgewotICAgICAgc3RpbGxFcXVhbCA9IEJZVEVTW2kgKyBzb3VyY2VPZmZzZXRdID09IGRlc3RpbmF0aW9uW2kgKyBkZXN0aW5hdGlvbk9mZnNldF07Ci0gICAgfQotICAgIGFzc2VydFRydWUoQ0xBU1NOQU1FICsgIi5jb3B5VG8oNCBhcmcpIG11c3QgZ2l2ZSB0aGUgZXhwZWN0ZWQgYnl0ZXMiLCBzdGlsbEVxdWFsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb3B5VG9fQnl0ZUFycmF5T2Zmc2V0TGVuZ3RoRXJyb3JzKCkgewotICAgIGludCBkZXN0aW5hdGlvbk9mZnNldCA9IDUwOwotICAgIGludCBsZW5ndGggPSAxMDA7Ci0gICAgYnl0ZVtdIGRlc3RpbmF0aW9uID0gbmV3IGJ5dGVbZGVzdGluYXRpb25PZmZzZXQgKyBsZW5ndGhdOwotCi0gICAgdHJ5IHsKLSAgICAgIC8vIENvcHkgb25lIHRvbyBtYW55IGJ5dGVzCi0gICAgICB0ZXN0U3RyaW5nLmNvcHlUbyhkZXN0aW5hdGlvbiwgdGVzdFN0cmluZy5zaXplKCkgKyAxIC0gbGVuZ3RoLAotICAgICAgICAgIGRlc3RpbmF0aW9uT2Zmc2V0LCBsZW5ndGgpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiB3aGVuIGNvcHlpbmcgdG9vIG1hbnkgYnl0ZXMgb2YgYSAiCi0gICAgICAgICAgKyBDTEFTU05BTUUpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBDb3B5IHdpdGggaWxsZWdhbCBuZWdhdGl2ZSBzb3VyY2VPZmZzZXQKLSAgICAgIHRlc3RTdHJpbmcuY29weVRvKGRlc3RpbmF0aW9uLCAtMSwgZGVzdGluYXRpb25PZmZzZXQsIGxlbmd0aCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gYSBuZWdhdGl2ZSBzb3VyY2VPZmZzZXQgaW4gIgotICAgICAgICAgICsgQ0xBU1NOQU1FKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gQ29weSB3aXRoIGlsbGVnYWwgbmVnYXRpdmUgZGVzdGluYXRpb25PZmZzZXQKLSAgICAgIHRlc3RTdHJpbmcuY29weVRvKGRlc3RpbmF0aW9uLCAwLCAtMSwgbGVuZ3RoKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24gd2hlbiBnaXZlbiBhIG5lZ2F0aXZlIGRlc3RpbmF0aW9uT2Zmc2V0IGluICIKLSAgICAgICAgICArIENMQVNTTkFNRSk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIENvcHkgd2l0aCBpbGxlZ2FsIG5lZ2F0aXZlIHNpemUKLSAgICAgIHRlc3RTdHJpbmcuY29weVRvKGRlc3RpbmF0aW9uLCAwLCAwLCAtMSk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gZ2l2ZW4gYSBuZWdhdGl2ZSBzaXplIGluICIKLSAgICAgICAgICArIENMQVNTTkFNRSk7Ci0gICAgfSBjYXRjaCAoSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIENvcHkgd2l0aCBpbGxlZ2FsIHRvby1sYXJnZSBzb3VyY2VPZmZzZXQKLSAgICAgIHRlc3RTdHJpbmcuY29weVRvKGRlc3RpbmF0aW9uLCAyICogdGVzdFN0cmluZy5zaXplKCksIDAsIGxlbmd0aCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gdGhlIGRlc3RpbmF0aW9uT2Zmc2V0IGlzIHRvbyBsYXJnZSBpbiAiCi0gICAgICAgICAgKyBDTEFTU05BTUUpOwotICAgIH0gY2F0Y2ggKEluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBDb3B5IHdpdGggaWxsZWdhbCB0b28tbGFyZ2UgZGVzdGluYXRpb25PZmZzZXQKLSAgICAgIHRlc3RTdHJpbmcuY29weVRvKGRlc3RpbmF0aW9uLCAwLCAyICogZGVzdGluYXRpb24ubGVuZ3RoLCBsZW5ndGgpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiB3aGVuIHRoZSBkZXN0aW5hdGlvbk9mZnNldCBpcyB0b28gbGFyZ2UgaW4gIgotICAgICAgICAgICsgQ0xBU1NOQU1FKTsKLSAgICB9IGNhdGNoIChJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weVRvX0J5dGVCdWZmZXIoKSB7Ci0gICAgLy8gU2FtZSBsZW5ndGguCi0gICAgQnl0ZUJ1ZmZlciBteUJ1ZmZlciA9IEJ5dGVCdWZmZXIuYWxsb2NhdGUoQllURVMubGVuZ3RoKTsKLSAgICB0ZXN0U3RyaW5nLmNvcHlUbyhteUJ1ZmZlcik7Ci0gICAgbXlCdWZmZXIuZmxpcCgpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiLmNvcHlUbyhCeXRlQnVmZmVyKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCi0gICAgICAgIGJhY2tpbmdCdWZmZXIsIG15QnVmZmVyKTsKLQotICAgIC8vIFRhcmdldCBidWZmZXIgYmlnZ2VyIHRoYW4gcmVxdWlyZWQuCi0gICAgbXlCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKHRlc3RTdHJpbmcuc2l6ZSgpICsgMSk7Ci0gICAgdGVzdFN0cmluZy5jb3B5VG8obXlCdWZmZXIpOwotICAgIG15QnVmZmVyLmZsaXAoKTsKLSAgICBhc3NlcnRFcXVhbHMoYmFja2luZ0J1ZmZlciwgbXlCdWZmZXIpOwotCi0gICAgLy8gVGFyZ2V0IGJ1ZmZlciBoYXMgbm8gc3BhY2UuCi0gICAgbXlCdWZmZXIgPSBCeXRlQnVmZmVyLmFsbG9jYXRlKDApOwotICAgIHRyeSB7Ci0gICAgICB0ZXN0U3RyaW5nLmNvcHlUbyhteUJ1ZmZlcik7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uIHdoZW4gdGFyZ2V0IEJ5dGVCdWZmZXIgaGFzIGluc3VmZmljaWVudCBjYXBhY2l0eSIpOwotICAgIH0gY2F0Y2ggKEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIC8vIFRhcmdldCBidWZmZXIgdG9vIHNtYWxsLgotICAgIG15QnVmZmVyID0gQnl0ZUJ1ZmZlci5hbGxvY2F0ZSgxKTsKLSAgICB0cnkgewotICAgICAgdGVzdFN0cmluZy5jb3B5VG8obXlCdWZmZXIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbiB3aGVuIHRhcmdldCBCeXRlQnVmZmVyIGhhcyBpbnN1ZmZpY2llbnQgY2FwYWNpdHkiKTsKLSAgICB9IGNhdGNoIChCdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWFya1N1cHBvcnRlZCgpIHsKLSAgICBJbnB1dFN0cmVhbSBzdHJlYW0gPSB0ZXN0U3RyaW5nLm5ld0lucHV0KCk7Ci0gICAgYXNzZXJ0VHJ1ZShDTEFTU05BTUUgKyAiLm5ld0lucHV0KCkgbXVzdCBzdXBwb3J0IG1hcmtpbmciLCBzdHJlYW0ubWFya1N1cHBvcnRlZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNYXJrQW5kUmVzZXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGludCBmcmFjdGlvbiA9IHRlc3RTdHJpbmcuc2l6ZSgpIC8gMzsKLQotICAgIElucHV0U3RyZWFtIHN0cmVhbSA9IHRlc3RTdHJpbmcubmV3SW5wdXQoKTsKLSAgICBzdHJlYW0ubWFyayh0ZXN0U3RyaW5nLnNpemUoKSk7IC8vIEZpcnN0LCBtYXJrKCkgdGhlIGVuZC4KLQotICAgIHNraXBGdWxseShzdHJlYW0sIGZyYWN0aW9uKTsgLy8gU2tpcCBhIGxhcmdlIGZyYWN0aW9uLCBidXQgbm90IGFsbC4KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIENMQVNTTkFNRSArICI6IGFmdGVyIHNraXBwaW5nIHRvIHRoZSAnbWlkZGxlJywgaGFsZiB0aGUgYnl0ZXMgYXJlIGF2YWlsYWJsZSIsCi0gICAgICAgICh0ZXN0U3RyaW5nLnNpemUoKSAtIGZyYWN0aW9uKSwgc3RyZWFtLmF2YWlsYWJsZSgpKTsKLSAgICBzdHJlYW0ucmVzZXQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIENMQVNTTkFNRSArICI6IGFmdGVyIHJlc2V0dGluZywgYWxsIGJ5dGVzIGFyZSBhdmFpbGFibGUiLAotICAgICAgICB0ZXN0U3RyaW5nLnNpemUoKSwgc3RyZWFtLmF2YWlsYWJsZSgpKTsKLQotICAgIHNraXBGdWxseShzdHJlYW0sIHRlc3RTdHJpbmcuc2l6ZSgpKTsgLy8gU2tpcCB0byB0aGUgZW5kLgotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgQ0xBU1NOQU1FICsgIjogYWZ0ZXIgc2tpcHBpbmcgdG8gdGhlIGVuZCwgbm8gbW9yZSBieXRlcyBhcmUgYXZhaWxhYmxlIiwKLSAgICAgICAgMCwgc3RyZWFtLmF2YWlsYWJsZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBEaXNjYXJkcyB7QGNvZGUgbn0gYnl0ZXMgb2YgZGF0YSBmcm9tIHRoZSBpbnB1dCBzdHJlYW0uIFRoaXMgbWV0aG9kCi0gICAqIHdpbGwgYmxvY2sgdW50aWwgdGhlIGZ1bGwgYW1vdW50IGhhcyBiZWVuIHNraXBwZWQuIERvZXMgbm90IGNsb3NlIHRoZQotICAgKiBzdHJlYW0uCi0gICAqIDxwPkNvcGllZCBmcm9tIGNvbS5nb29nbGUuY29tbW9uLmlvLkJ5dGVTdHJlYW1zIHRvIGF2b2lkIGFkZGluZyBkZXBlbmRlbmN5LgotICAgKgotICAgKiBAcGFyYW0gaW4gdGhlIGlucHV0IHN0cmVhbSB0byByZWFkIGZyb20KLSAgICogQHBhcmFtIG4gdGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwCi0gICAqIEB0aHJvd3MgRU9GRXhjZXB0aW9uIGlmIHRoaXMgc3RyZWFtIHJlYWNoZXMgdGhlIGVuZCBiZWZvcmUgc2tpcHBpbmcgYWxsCi0gICAqICAgICB0aGUgYnl0ZXMKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiBhbiBJL08gZXJyb3Igb2NjdXJzLCBvciB0aGUgc3RyZWFtIGRvZXMgbm90Ci0gICAqICAgICBzdXBwb3J0IHNraXBwaW5nCi0gICAqLwotICBzdGF0aWMgdm9pZCBza2lwRnVsbHkoSW5wdXRTdHJlYW0gaW4sIGxvbmcgbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBsb25nIHRvU2tpcCA9IG47Ci0gICAgd2hpbGUgKG4gPiAwKSB7Ci0gICAgICBsb25nIGFtdCA9IGluLnNraXAobik7Ci0gICAgICBpZiAoYW10ID09IDApIHsKLSAgICAgICAgLy8gRm9yY2UgYSBibG9ja2luZyByZWFkIHRvIGF2b2lkIGluZmluaXRlIGxvb3AKLSAgICAgICAgaWYgKGluLnJlYWQoKSA9PSAtMSkgewotICAgICAgICAgIGxvbmcgc2tpcHBlZCA9IHRvU2tpcCAtIG47Ci0gICAgICAgICAgdGhyb3cgbmV3IEVPRkV4Y2VwdGlvbigicmVhY2hlZCBlbmQgb2Ygc3RyZWFtIGFmdGVyIHNraXBwaW5nICIKLSAgICAgICAgICAgICAgKyBza2lwcGVkICsgIiBieXRlczsgIiArIHRvU2tpcCArICIgYnl0ZXMgZXhwZWN0ZWQiKTsKLSAgICAgICAgfQotICAgICAgICBuLS07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBuIC09IGFtdDsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0QXNSZWFkT25seUJ5dGVCdWZmZXIoKSB7Ci0gICAgQnl0ZUJ1ZmZlciBieXRlQnVmZmVyID0gdGVzdFN0cmluZy5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpOwotICAgIGJ5dGVbXSByb3VuZFRyaXBCeXRlcyA9IG5ldyBieXRlW0JZVEVTLmxlbmd0aF07Ci0gICAgYXNzZXJ0VHJ1ZShieXRlQnVmZmVyLnJlbWFpbmluZygpID09IEJZVEVTLmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlQnVmZmVyLmlzUmVhZE9ubHkoKSk7Ci0gICAgYnl0ZUJ1ZmZlci5nZXQocm91bmRUcmlwQnl0ZXMpOwotICAgIGFzc2VydFRydWUoQ0xBU1NOQU1FICsgIi5hc1JlYWRPbmx5Qnl0ZUJ1ZmZlcigpIG11c3QgZ2l2ZSBiYWNrIHRoZSBzYW1lIGJ5dGVzIiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhCWVRFUywgcm91bmRUcmlwQnl0ZXMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RBc1JlYWRPbmx5Qnl0ZUJ1ZmZlckxpc3QoKSB7Ci0gICAgTGlzdDxCeXRlQnVmZmVyPiBieXRlQnVmZmVycyA9IHRlc3RTdHJpbmcuYXNSZWFkT25seUJ5dGVCdWZmZXJMaXN0KCk7Ci0gICAgaW50IGJ5dGVzU2VlbiA9IDA7Ci0gICAgYnl0ZVtdIHJvdW5kVHJpcEJ5dGVzID0gbmV3IGJ5dGVbQllURVMubGVuZ3RoXTsKLSAgICBmb3IgKEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA6IGJ5dGVCdWZmZXJzKSB7Ci0gICAgICBpbnQgdGhpc0xlbmd0aCA9IGJ5dGVCdWZmZXIucmVtYWluaW5nKCk7Ci0gICAgICBhc3NlcnRUcnVlKGJ5dGVCdWZmZXIuaXNSZWFkT25seSgpKTsKLSAgICAgIGFzc2VydFRydWUoYnl0ZXNTZWVuICsgdGhpc0xlbmd0aCA8PSBCWVRFUy5sZW5ndGgpOwotICAgICAgYnl0ZUJ1ZmZlci5nZXQocm91bmRUcmlwQnl0ZXMsIGJ5dGVzU2VlbiwgdGhpc0xlbmd0aCk7Ci0gICAgICBieXRlc1NlZW4gKz0gdGhpc0xlbmd0aDsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc1NlZW4gPT0gQllURVMubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKENMQVNTTkFNRSArICIuYXNSZWFkT25seUJ5dGVCdWZmZXJUZXN0KCkgbXVzdCBnaXZlIGJhY2sgdGhlIHNhbWUgYnl0ZXMiLAotICAgICAgICBBcnJheXMuZXF1YWxzKEJZVEVTLCByb3VuZFRyaXBCeXRlcykpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvQnl0ZUFycmF5KCkgewotICAgIGJ5dGVbXSByb3VuZFRyaXBCeXRlcyA9IHRlc3RTdHJpbmcudG9CeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRUcnVlKENMQVNTTkFNRSArICIudG9CeXRlQXJyYXkoKSBtdXN0IGdpdmUgYmFjayB0aGUgc2FtZSBieXRlcyIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMoQllURVMsIHJvdW5kVHJpcEJ5dGVzKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVUbygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICB0ZXN0U3RyaW5nLndyaXRlVG8oYm9zKTsKLSAgICBieXRlW10gcm91bmRUcmlwQnl0ZXMgPSBib3MudG9CeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRUcnVlKENMQVNTTkFNRSArICIud3JpdGVUbygpIG11c3QgZ2l2ZSBiYWNrIHRoZSBzYW1lIGJ5dGVzIiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhCWVRFUywgcm91bmRUcmlwQnl0ZXMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvU2hvdWxkTm90RXhwb3NlSW50ZXJuYWxCdWZmZXJUb091dHB1dFN0cmVhbSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgT3V0cHV0U3RyZWFtIG9zID0gbmV3IE91dHB1dFN0cmVhbSgpIHsKLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgd3JpdGUoYnl0ZVtdIGIsIGludCBvZmYsIGludCBsZW4pIHsKLSAgICAgICAgQXJyYXlzLmZpbGwoYiwgb2ZmLCBvZmYgKyBsZW4sIChieXRlKSAwKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZShpbnQgYikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgYnl0ZVtdIG9yaWdpbmFsID0gQXJyYXlzLmNvcHlPZihCWVRFUywgQllURVMubGVuZ3RoKTsKLSAgICB0ZXN0U3RyaW5nLndyaXRlVG8ob3MpOwotICAgIGFzc2VydFRydWUoQ0xBU1NOQU1FICsgIi53cml0ZVRvKCkgbXVzdCBOT1QgZ3JhbnQgYWNjZXNzIHRvIHVuZGVybHlpbmcgYnVmZmVyIiwKLSAgICAgICAgQXJyYXlzLmVxdWFscyhvcmlnaW5hbCwgQllURVMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvSW50ZXJuYWxTaG91bGRFeHBvc2VJbnRlcm5hbEJ1ZmZlclRvT3V0cHV0U3RyZWFtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBPdXRwdXRTdHJlYW0gb3MgPSBuZXcgT3V0cHV0U3RyZWFtKCkgewotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZShieXRlW10gYiwgaW50IG9mZiwgaW50IGxlbikgewotICAgICAgICBBcnJheXMuZmlsbChiLCBvZmYsIG9mZiArIGxlbiwgKGJ5dGUpIDApOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGludCBiKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotICAgIH07Ci0KLSAgICB0ZXN0U3RyaW5nLndyaXRlVG9JbnRlcm5hbChvcywgMCwgdGVzdFN0cmluZy5zaXplKCkpOwotICAgIGJ5dGVbXSBhbGxaZXJvcyA9IG5ldyBieXRlW3Rlc3RTdHJpbmcuc2l6ZSgpXTsKLSAgICBhc3NlcnRUcnVlKENMQVNTTkFNRSArICIud3JpdGVUb0ludGVybmFsKCkgbXVzdCBncmFudCBhY2Nlc3MgdG8gdW5kZXJseWluZyBidWZmZXIiLAotICAgICAgICBBcnJheXMuZXF1YWxzKGFsbFplcm9zLCBiYWNraW5nQnVmZmVyLmFycmF5KCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVRvU2hvdWxkRXhwb3NlSW50ZXJuYWxCdWZmZXJUb0J5dGVPdXRwdXQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIEJ5dGVPdXRwdXQgb3V0ID0gbmV3IEJ5dGVPdXRwdXQoKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyB2b2lkIHdyaXRlKGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgd3JpdGVMYXp5KGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgd3JpdGUoQnl0ZUJ1ZmZlciB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgd3JpdGVMYXp5KEJ5dGVCdWZmZXIgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIEFycmF5cy5maWxsKHZhbHVlLmFycmF5KCksIHZhbHVlLmFycmF5T2Zmc2V0KCksIHZhbHVlLmFycmF5T2Zmc2V0KCkgKyB2YWx1ZS5saW1pdCgpLAotICAgICAgICAgICAgKGJ5dGUpIDApOwotICAgICAgfQotICAgIH07Ci0KLSAgICB0ZXN0U3RyaW5nLndyaXRlVG8ob3V0KTsKLSAgICBieXRlW10gYWxsWmVyb3MgPSBuZXcgYnl0ZVt0ZXN0U3RyaW5nLnNpemUoKV07Ci0gICAgYXNzZXJ0VHJ1ZShDTEFTU05BTUUgKyAiLndyaXRlVG8oKSBtdXN0IGdyYW50IGFjY2VzcyB0byB1bmRlcmx5aW5nIGJ1ZmZlciIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMoYWxsWmVyb3MsIGJhY2tpbmdCdWZmZXIuYXJyYXkoKSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5ld091dHB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvcyA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBCeXRlU3RyaW5nLk91dHB1dCBvdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIHRlc3RTdHJpbmcud3JpdGVUbyhvdXRwdXQpOwotICAgIGFzc2VydEVxdWFscygiT3V0cHV0IFNpemUgcmV0dXJucyBjb3JyZWN0IHJlc3VsdCIsCi0gICAgICAgIG91dHB1dC5zaXplKCksIHRlc3RTdHJpbmcuc2l6ZSgpKTsKLSAgICBvdXRwdXQud3JpdGVUbyhib3MpOwotICAgIGFzc2VydFRydWUoIk91dHB1dC53cml0ZVRvKCkgbXVzdCBnaXZlIGJhY2sgdGhlIHNhbWUgYnl0ZXMiLAotICAgICAgICBBcnJheXMuZXF1YWxzKEJZVEVTLCBib3MudG9CeXRlQXJyYXkoKSkpOwotCi0gICAgLy8gd3JpdGUgdGhlIG91dHB1dCBzdHJlYW0gdG8gaXRzZWxmISBUaGlzIHNob3VsZCBjYXVzZSBpdCB0byBkb3VibGUKLSAgICBvdXRwdXQud3JpdGVUbyhvdXRwdXQpOwotICAgIGFzc2VydEVxdWFscygiV3JpdGluZyBhbiBvdXRwdXQgc3RyZWFtIHRvIGl0c2VsZiBpcyBzdWNjZXNzZnVsIiwKLSAgICAgICAgdGVzdFN0cmluZy5jb25jYXQodGVzdFN0cmluZyksIG91dHB1dC50b0J5dGVTdHJpbmcoKSk7Ci0KLSAgICBvdXRwdXQucmVzZXQoKTsKLSAgICBhc3NlcnRFcXVhbHMoIk91dHB1dC5yZXNldCgpIHJlc2V0cyB0aGUgb3V0cHV0IiwgMCwgb3V0cHV0LnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJPdXRwdXQucmVzZXQoKSByZXNldHMgdGhlIG91dHB1dCIsCi0gICAgICAgIEVNUFRZLCBvdXRwdXQudG9CeXRlU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nKCkgewotICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIHVuaWNvZGUgPSBmb3JTdHJpbmcodGVzdFN0cmluZyk7Ci0gICAgU3RyaW5nIHJvdW5kVHJpcFN0cmluZyA9IHVuaWNvZGUudG9TdHJpbmcoVVRGXzgpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIHVuaWNvZGUgbXVzdCBtYXRjaCIsIHRlc3RTdHJpbmcsIHJvdW5kVHJpcFN0cmluZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldFRvU3RyaW5nKCkgewotICAgIFN0cmluZyB0ZXN0U3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIHVuaWNvZGUgPSBmb3JTdHJpbmcodGVzdFN0cmluZyk7Ci0gICAgU3RyaW5nIHJvdW5kVHJpcFN0cmluZyA9IHVuaWNvZGUudG9TdHJpbmcoVVRGXzgpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIHVuaWNvZGUgbXVzdCBtYXRjaCIsIHRlc3RTdHJpbmcsIHJvdW5kVHJpcFN0cmluZyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmdfcmV0dXJuc0Nhbm9uaWNhbEVtcHR5U3RyaW5nKCkgewotICAgIGFzc2VydFNhbWUoQ0xBU1NOQU1FICsgIiBtdXN0IGJlIHRoZSBzYW1lIHN0cmluZyByZWZlcmVuY2VzIiwKLSAgICAgICAgRU1QVFkudG9TdHJpbmcoVVRGXzgpLAotICAgICAgICBuZXcgTmlvQnl0ZVN0cmluZyhCeXRlQnVmZmVyLndyYXAobmV3IGJ5dGVbMF0pKS50b1N0cmluZyhVVEZfOCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvU3RyaW5nX3JhaXNlc0V4Y2VwdGlvbigpIHsKLSAgICB0cnkgewotICAgICAgRU1QVFkudG9TdHJpbmcoImludmFsaWQiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIHRlc3RTdHJpbmcudG9TdHJpbmcoImludmFsaWQiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgLy8gVGhpcyBpcyBzdWNjZXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFscygpIHsKLSAgICBhc3NlcnRFcXVhbHMoQ0xBU1NOQU1FICsgIiBtdXN0IG5vdCBlcXVhbCBudWxsIiwgZmFsc2UsIHRlc3RTdHJpbmcuZXF1YWxzKG51bGwpKTsKLSAgICBhc3NlcnRFcXVhbHMoQ0xBU1NOQU1FICsgIiBtdXN0IGVxdWFsIHNlbGYiLCB0ZXN0U3RyaW5nLCB0ZXN0U3RyaW5nKTsKLSAgICBhc3NlcnRGYWxzZShDTEFTU05BTUUgKyAiIG11c3Qgbm90IGVxdWFsIHRoZSBlbXB0eSBzdHJpbmciLAotICAgICAgICB0ZXN0U3RyaW5nLmVxdWFscyhFTVBUWSkpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIGVtcHR5IHN0cmluZ3MgbXVzdCBiZSBlcXVhbCIsCi0gICAgICAgIEVNUFRZLCB0ZXN0U3RyaW5nLnN1YnN0cmluZyg1NSwgNTUpKTsKLSAgICBhc3NlcnRFcXVhbHMoQ0xBU1NOQU1FICsgIiBtdXN0IGVxdWFsIGFub3RoZXIgc3RyaW5nIHdpdGggdGhlIHNhbWUgdmFsdWUiLAotICAgICAgICB0ZXN0U3RyaW5nLCBuZXcgTmlvQnl0ZVN0cmluZyhiYWNraW5nQnVmZmVyKSk7Ci0KLSAgICBieXRlW10gbXVuZ2VkQnl0ZXMgPSBtdW5nZWRCeXRlcygpOwotICAgIGFzc2VydEZhbHNlKENMQVNTTkFNRSArICIgbXVzdCBub3QgZXF1YWwgZXZlcnkgc3RyaW5nIHdpdGggdGhlIHNhbWUgbGVuZ3RoIiwKLSAgICAgICAgdGVzdFN0cmluZy5lcXVhbHMobmV3IE5pb0J5dGVTdHJpbmcoQnl0ZUJ1ZmZlci53cmFwKG11bmdlZEJ5dGVzKSkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNMaXRlcmFsQnl0ZVN0cmluZygpIHsKLSAgICBCeXRlU3RyaW5nIGxpdGVyYWwgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKEJZVEVTKTsKLSAgICBhc3NlcnRFcXVhbHMoQ0xBU1NOQU1FICsgIiBtdXN0IGVxdWFsIExpdGVyYWxCeXRlU3RyaW5nIHdpdGggc2FtZSB2YWx1ZSIsIGxpdGVyYWwsCi0gICAgICAgIHRlc3RTdHJpbmcpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIG11c3QgZXF1YWwgTGl0ZXJhbEJ5dGVTdHJpbmcgd2l0aCBzYW1lIHZhbHVlIiwgdGVzdFN0cmluZywKLSAgICAgICAgbGl0ZXJhbCk7Ci0gICAgYXNzZXJ0RmFsc2UoQ0xBU1NOQU1FICsgIiBtdXN0IG5vdCBlcXVhbCB0aGUgZW1wdHkgc3RyaW5nIiwKLSAgICAgICAgdGVzdFN0cmluZy5lcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSkpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIGVtcHR5IHN0cmluZ3MgbXVzdCBiZSBlcXVhbCIsCi0gICAgICAgIEJ5dGVTdHJpbmcuRU1QVFksIHRlc3RTdHJpbmcuc3Vic3RyaW5nKDU1LCA1NSkpOwotCi0gICAgbGl0ZXJhbCA9IEJ5dGVTdHJpbmcuY29weUZyb20obXVuZ2VkQnl0ZXMoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoQ0xBU1NOQU1FICsgIiBtdXN0IG5vdCBlcXVhbCBldmVyeSBMaXRlcmFsQnl0ZVN0cmluZyB3aXRoIHRoZSBzYW1lIGxlbmd0aCIsCi0gICAgICAgIHRlc3RTdHJpbmcuZXF1YWxzKGxpdGVyYWwpKTsKLSAgICBhc3NlcnRGYWxzZShDTEFTU05BTUUgKyAiIG11c3Qgbm90IGVxdWFsIGV2ZXJ5IExpdGVyYWxCeXRlU3RyaW5nIHdpdGggdGhlIHNhbWUgbGVuZ3RoIiwKLSAgICAgICAgbGl0ZXJhbC5lcXVhbHModGVzdFN0cmluZykpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFsc1JvcGVCeXRlU3RyaW5nKCkgewotICAgIEJ5dGVTdHJpbmcgcDEgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKEJZVEVTLCAwLCA1KTsKLSAgICBCeXRlU3RyaW5nIHAyID0gQnl0ZVN0cmluZy5jb3B5RnJvbShCWVRFUywgNSwgQllURVMubGVuZ3RoIC0gNSk7Ci0gICAgQnl0ZVN0cmluZyByb3BlID0gcDEuY29uY2F0KHAyKTsKLQotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIG11c3QgZXF1YWwgUm9wZUJ5dGVTdHJpbmcgd2l0aCBzYW1lIHZhbHVlIiwgcm9wZSwKLSAgICAgICAgdGVzdFN0cmluZyk7Ci0gICAgYXNzZXJ0RXF1YWxzKENMQVNTTkFNRSArICIgbXVzdCBlcXVhbCBSb3BlQnl0ZVN0cmluZyB3aXRoIHNhbWUgdmFsdWUiLCB0ZXN0U3RyaW5nLAotICAgICAgICByb3BlKTsKLSAgICBhc3NlcnRGYWxzZShDTEFTU05BTUUgKyAiIG11c3Qgbm90IGVxdWFsIHRoZSBlbXB0eSBzdHJpbmciLAotICAgICAgICB0ZXN0U3RyaW5nLmVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLmNvbmNhdChCeXRlU3RyaW5nLkVNUFRZKSkpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIGVtcHR5IHN0cmluZ3MgbXVzdCBiZSBlcXVhbCIsCi0gICAgICAgIEJ5dGVTdHJpbmcuRU1QVFkuY29uY2F0KEJ5dGVTdHJpbmcuRU1QVFkpLCB0ZXN0U3RyaW5nLnN1YnN0cmluZyg1NSwgNTUpKTsKLQotICAgIGJ5dGVbXSBtdW5nZWRCeXRlcyA9IG11bmdlZEJ5dGVzKCk7Ci0gICAgcDEgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKG11bmdlZEJ5dGVzLCAwLCA1KTsKLSAgICBwMiA9IEJ5dGVTdHJpbmcuY29weUZyb20obXVuZ2VkQnl0ZXMsIDUsIG11bmdlZEJ5dGVzLmxlbmd0aCAtIDUpOwotICAgIHJvcGUgPSBwMS5jb25jYXQocDIpOwotICAgIGFzc2VydEZhbHNlKENMQVNTTkFNRSArICIgbXVzdCBub3QgZXF1YWwgZXZlcnkgUm9wZUJ5dGVTdHJpbmcgd2l0aCB0aGUgc2FtZSBsZW5ndGgiLAotICAgICAgICB0ZXN0U3RyaW5nLmVxdWFscyhyb3BlKSk7Ci0gICAgYXNzZXJ0RmFsc2UoQ0xBU1NOQU1FICsgIiBtdXN0IG5vdCBlcXVhbCBldmVyeSBSb3BlQnl0ZVN0cmluZyB3aXRoIHRoZSBzYW1lIGxlbmd0aCIsCi0gICAgICAgIHJvcGUuZXF1YWxzKHRlc3RTdHJpbmcpKTsKLSAgfQotCi0gIHByaXZhdGUgYnl0ZVtdIG11bmdlZEJ5dGVzKCkgewotICAgIGJ5dGVbXSBtdW5nZWRCeXRlcyA9IG5ldyBieXRlW0JZVEVTLmxlbmd0aF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShCWVRFUywgMCwgbXVuZ2VkQnl0ZXMsIDAsIEJZVEVTLmxlbmd0aCk7Ci0gICAgbXVuZ2VkQnl0ZXNbbXVuZ2VkQnl0ZXMubGVuZ3RoIC0gNV0gPSAoYnl0ZSkgKG11bmdlZEJ5dGVzW211bmdlZEJ5dGVzLmxlbmd0aCAtIDVdIF4gMHhGRik7Ci0gICAgcmV0dXJuIG11bmdlZEJ5dGVzOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotICAgIGludCBoYXNoID0gdGVzdFN0cmluZy5oYXNoQ29kZSgpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIG11c3QgaGF2ZSBleHBlY3RlZCBoYXNoQ29kZSIsIEVYUEVDVEVEX0hBU0gsIGhhc2gpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBlZWtDYWNoZWRIYXNoQ29kZSgpIHsKLSAgICBCeXRlU3RyaW5nIG5ld1N0cmluZyA9IG5ldyBOaW9CeXRlU3RyaW5nKGJhY2tpbmdCdWZmZXIpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiLnBlZWtDYWNoZWRIYXNoQ29kZSgpIHNob3VsZCByZXR1cm4gemVybyBhdCBmaXJzdCIsIDAsCi0gICAgICAgIG5ld1N0cmluZy5wZWVrQ2FjaGVkSGFzaENvZGUoKSk7Ci0gICAgbmV3U3RyaW5nLmhhc2hDb2RlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKENMQVNTTkFNRSArICIucGVla0NhY2hlZEhhc2hDb2RlIHNob3VsZCByZXR1cm4gemVybyBhdCBmaXJzdCIsCi0gICAgICAgIEVYUEVDVEVEX0hBU0gsIG5ld1N0cmluZy5wZWVrQ2FjaGVkSGFzaENvZGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFydGlhbEhhc2goKSB7Ci0gICAgLy8gcGFydGlhbEhhc2goKSBpcyBtb3JlIHN0cmVudW91c2x5IHRlc3RlZCBlbHNld2hlcmUgYnkgdGVzdGluZyBoYXNoZXMgb2Ygc3Vic3RyaW5ncy4KLSAgICAvLyBUaGlzIHRlc3Qgd291bGQgZmFpbCBpZiB0aGUgZXhwZWN0ZWQgaGFzaCB3ZXJlIDEuICBJdCdzIG5vdC4KLSAgICBpbnQgaGFzaCA9IHRlc3RTdHJpbmcucGFydGlhbEhhc2godGVzdFN0cmluZy5zaXplKCksIDAsIHRlc3RTdHJpbmcuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoQ0xBU1NOQU1FICsgIi5wYXJ0aWFsSGFzaCgpIG11c3QgeWllbGQgZXhwZWN0ZWQgaGFzaENvZGUiLAotICAgICAgICBFWFBFQ1RFRF9IQVNILCBoYXNoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXdJbnB1dCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgSW5wdXRTdHJlYW0gaW5wdXQgPSB0ZXN0U3RyaW5nLm5ld0lucHV0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSByZXR1cm5zIGNvcnJlY3QgdmFsdWUiLAotICAgICAgICB0ZXN0U3RyaW5nLnNpemUoKSwgaW5wdXQuYXZhaWxhYmxlKCkpOwotICAgIGJvb2xlYW4gc3RpbGxFcXVhbCA9IHRydWU7Ci0gICAgZm9yIChieXRlIHJlZmVyZW5jZUJ5dGUgOiBCWVRFUykgewotICAgICAgaW50IGV4cGVjdGVkSW50ID0gKHJlZmVyZW5jZUJ5dGUgJiAweEZGKTsKLSAgICAgIHN0aWxsRXF1YWwgPSAoZXhwZWN0ZWRJbnQgPT0gaW5wdXQucmVhZCgpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSByZXR1cm5zIGNvcnJlY3QgdmFsdWUiLAotICAgICAgICAwLCBpbnB1dC5hdmFpbGFibGUoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShDTEFTU05BTUUgKyAiIG11c3QgZ2l2ZSB0aGUgc2FtZSBieXRlcyBmcm9tIHRoZSBJbnB1dFN0cmVhbSIsIHN0aWxsRXF1YWwpOwotICAgIGFzc2VydEVxdWFscyhDTEFTU05BTUUgKyAiIElucHV0U3RyZWFtIG11c3Qgbm93IGJlIGV4aGF1c3RlZCIsIC0xLCBpbnB1dC5yZWFkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5ld0lucHV0X3NraXAoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIElucHV0U3RyZWFtIGlucHV0ID0gdGVzdFN0cmluZy5uZXdJbnB1dCgpOwotICAgIGludCBzdHJpbmdTaXplID0gdGVzdFN0cmluZy5zaXplKCk7Ci0gICAgaW50IG5lYXJFbmRJbmRleCA9IHN0cmluZ1NpemUgKiAyIC8gMzsKLSAgICBsb25nIHNraXBwZWQxID0gaW5wdXQuc2tpcChuZWFyRW5kSW5kZXgpOwotICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0uc2tpcCgpIiwgc2tpcHBlZDEsIG5lYXJFbmRJbmRleCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5hdmFpbGFibGUoKSIsCi0gICAgICAgIHN0cmluZ1NpemUgLSBza2lwcGVkMSwgaW5wdXQuYXZhaWxhYmxlKCkpOwotICAgIGFzc2VydFRydWUoIklucHV0U3RyZWFtLm1hcmsoKSBpcyBhdmFpbGFibGUiLCBpbnB1dC5tYXJrU3VwcG9ydGVkKCkpOwotICAgIGlucHV0Lm1hcmsoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5za2lwKCksIHJlYWQoKSIsCi0gICAgICAgIHRlc3RTdHJpbmcuYnl0ZUF0KG5lYXJFbmRJbmRleCkgJiAweEZGLCBpbnB1dC5yZWFkKCkpOwotICAgIGFzc2VydEVxdWFscygiSW5wdXRTdHJlYW0uYXZhaWxhYmxlKCkiLAotICAgICAgICBzdHJpbmdTaXplIC0gc2tpcHBlZDEgLSAxLCBpbnB1dC5hdmFpbGFibGUoKSk7Ci0gICAgbG9uZyBza2lwcGVkMiA9IGlucHV0LnNraXAoc3RyaW5nU2l6ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5za2lwKCkgaW5jb21wbGV0ZSIsCi0gICAgICAgIHNraXBwZWQyLCBzdHJpbmdTaXplIC0gc2tpcHBlZDEgLSAxKTsKLSAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLnNraXAoKSwgbm8gbW9yZSBpbnB1dCIsIDAsIGlucHV0LmF2YWlsYWJsZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIklucHV0U3RyZWFtLnNraXAoKSwgbm8gbW9yZSBpbnB1dCIsIC0xLCBpbnB1dC5yZWFkKCkpOwotICAgIGlucHV0LnJlc2V0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5yZXNldCgpIHN1Y2NlZGVkIiwKLSAgICAgICAgc3RyaW5nU2l6ZSAtIHNraXBwZWQxLCBpbnB1dC5hdmFpbGFibGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJJbnB1dFN0cmVhbS5yZXNldCgpLCByZWFkKCkiLAotICAgICAgICB0ZXN0U3RyaW5nLmJ5dGVBdChuZWFyRW5kSW5kZXgpICYgMHhGRiwgaW5wdXQucmVhZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROZXdDb2RlZElucHV0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGNpcyA9IHRlc3RTdHJpbmcubmV3Q29kZWRJbnB1dCgpOwotICAgIGJ5dGVbXSByb3VuZFRyaXBCeXRlcyA9IGNpcy5yZWFkUmF3Qnl0ZXMoQllURVMubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKENMQVNTTkFNRSArICIgbXVzdCBnaXZlIHRoZSBzYW1lIGJ5dGVzIGJhY2sgZnJvbSB0aGUgQ29kZWRJbnB1dFN0cmVhbSIsCi0gICAgICAgIEFycmF5cy5lcXVhbHMoQllURVMsIHJvdW5kVHJpcEJ5dGVzKSk7Ci0gICAgYXNzZXJ0VHJ1ZShDTEFTU05BTUUgKyAiIENvZGVkSW5wdXRTdHJlYW0gbXVzdCBub3cgYmUgZXhoYXVzdGVkIiwgY2lzLmlzQXRFbmQoKSk7Ci0gIH0KLQotICAvKioKLSAgICogTWFrZSBzdXJlIHdlIGtlZXAgdGhpbmdzIHNpbXBsZSB3aGVuIGNvbmNhdGVuYXRpbmcgd2l0aCBlbXB0eS4gU2VlIGFsc28KLSAgICoge0BsaW5rIEJ5dGVTdHJpbmdUZXN0I3Rlc3RDb25jYXRfZW1wdHkoKX0uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Q29uY2F0X2VtcHR5KCkgewotICAgIGFzc2VydFNhbWUoQ0xBU1NOQU1FICsgIiBjb25jYXRlbmF0ZWQgd2l0aCBlbXB0eSBtdXN0IGdpdmUgIiArIENMQVNTTkFNRSwKLSAgICAgICAgdGVzdFN0cmluZy5jb25jYXQoRU1QVFkpLCB0ZXN0U3RyaW5nKTsKLSAgICBhc3NlcnRTYW1lKCJlbXB0eSBjb25jYXRlbmF0ZWQgd2l0aCAiICsgQ0xBU1NOQU1FICsgIiBtdXN0IGdpdmUgIiArIENMQVNTTkFNRSwKLSAgICAgICAgRU1QVFkuY29uY2F0KHRlc3RTdHJpbmcpLCB0ZXN0U3RyaW5nKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RKYXZhU2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgT2JqZWN0T3V0cHV0U3RyZWFtIG9vcyA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0ob3V0KTsKLSAgICBvb3Mud3JpdGVPYmplY3QodGVzdFN0cmluZyk7Ci0gICAgb29zLmNsb3NlKCk7Ci0gICAgYnl0ZVtdIHBpY2tsZWQgPSBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwaWNrbGVkKTsKLSAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgIE9iamVjdCBvID0gb2lzLnJlYWRPYmplY3QoKTsKLSAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgZ2V0IGEgQnl0ZVN0cmluZyBiYWNrIiwgbyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpOwotICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGdldCBhbiBlcXVhbCBCeXRlU3RyaW5nIGJhY2siLCB0ZXN0U3RyaW5nLCBvKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgZm9yU3RyaW5nKFN0cmluZyBzdHIpIHsKLSAgICByZXR1cm4gbmV3IE5pb0J5dGVTdHJpbmcoQnl0ZUJ1ZmZlci53cmFwKHN0ci5nZXRCeXRlcyhVVEZfOCkpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9QYXJzZUV4Y2VwdGlvbnNUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1BhcnNlRXhjZXB0aW9uc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmYxZjFkNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1BhcnNlRXhjZXB0aW9uc1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuYXNzZXJ0RXF1YWxzOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydEZhbHNlOwotaW1wb3J0IHN0YXRpYyBvcmcuanVuaXQuQXNzZXJ0LmFzc2VydFRydWU7Ci1pbXBvcnQgc3RhdGljIG9yZy5qdW5pdC5Bc3NlcnQuZmFpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG87Ci0KLWltcG9ydCBvcmcuanVuaXQuVGVzdDsKLWltcG9ydCBvcmcuanVuaXQucnVubmVyLlJ1bldpdGg7Ci1pbXBvcnQgb3JnLmp1bml0LnJ1bm5lcnMuSlVuaXQ0OwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkZpbHRlcklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBUZXN0cyB0aGUgZXhjZXB0aW9ucyB0aHJvd24gd2hlbiBwYXJzaW5nIGZyb20gYSBzdHJlYW0uIFRoZSBtZXRob2RzIG9uIHRoZSB7QGxpbmsgUGFyc2VyfQotICogaW50ZXJmYWNlIGFyZSBzcGVjaWZpZWQgdG8gb25seSB0aHJvdyB7QGxpbmsgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9ufS4gQnV0IHdlIHJlYWxseSB3YW50Ci0gKiB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIGludmFsaWQgcHJvdG9zIHZzLiBhY3R1YWwgSS9PIGVycm9ycyAobGlrZSBmYWlsdXJlcyByZWFkaW5nIGZyb20gYQotICogc29ja2V0LCBldGMuKS4gU28sIHdoZW4gd2UncmUgbm90IHVzaW5nIHRoZSBwYXJzZXIgZGlyZWN0bHksIGFuIHtAbGluayBJT0V4Y2VwdGlvbn0gc2hvdWxkIGJlCi0gKiB0aHJvd24gd2hlcmUgYXBwcm9wcmlhdGUsIGluc3RlYWQgb2YgYWx3YXlzIGFuIHtAbGluayBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259LgotICoKLSAqIEBhdXRob3IgamhAc3F1YXJldXAuY29tIChKb3NodWEgSHVtcGhyaWVzKQotICovCi1AUnVuV2l0aChKVW5pdDQuY2xhc3MpCi1wdWJsaWMgY2xhc3MgUGFyc2VFeGNlcHRpb25zVGVzdCB7Ci0KLSAgcHJpdmF0ZSBpbnRlcmZhY2UgUGFyc2VUZXN0ZXIgewotICAgIERlc2NyaXB0b3JQcm90byBwYXJzZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uOwotICB9Ci0KLSAgcHJpdmF0ZSBieXRlIHNlcmlhbGl6ZWRQcm90b1tdOwotCi0gIHByaXZhdGUgdm9pZCBzZXR1cCgpIHsKLSAgICBzZXJpYWxpemVkUHJvdG8gPSBEZXNjcmlwdG9yUHJvdG8uZ2V0RGVzY3JpcHRvcigpLnRvUHJvdG8oKS50b0J5dGVBcnJheSgpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldHVwRGVsaW1pdGVkKCkgewotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgdHJ5IHsKLSAgICAgIERlc2NyaXB0b3JQcm90by5nZXREZXNjcmlwdG9yKCkudG9Qcm90bygpLndyaXRlRGVsaW1pdGVkVG8oYm9zKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gbm90IGV4cGVjdGVkOiAiICsgZSk7Ci0gICAgfQotICAgIHNlcmlhbGl6ZWRQcm90byA9IGJvcy50b0J5dGVBcnJheSgpOwotICB9Ci0KLSAgQFRlc3QgcHVibGljIHZvaWQgbWVzc2FnZV9wYXJzZUZyb21fSW5wdXRTdHJlYW0oKSB7Ci0gICAgc2V0dXAoKTsKLSAgICB2ZXJpZnlFeGNlcHRpb25zKAotICAgICAgICBuZXcgUGFyc2VUZXN0ZXIoKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIERlc2NyaXB0b3JQcm90byBwYXJzZShJbnB1dFN0cmVhbSBpbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICAgIHJldHVybiBEZXNjcmlwdG9yUHJvdG8ucGFyc2VGcm9tKGluKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICB9Ci0KLSAgQFRlc3QgcHVibGljIHZvaWQgbWVzc2FnZV9wYXJzZUZyb21fSW5wdXRTdHJlYW1BbmRFeHRlbnNpb25SZWdpc3RyeSgpIHsKLSAgICBzZXR1cCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JQcm90by5wYXJzZUZyb20oaW4sIEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBAVGVzdCBwdWJsaWMgdm9pZCBtZXNzYWdlX3BhcnNlRnJvbV9Db2RlZElucHV0U3RyZWFtKCkgewotICAgIHNldHVwKCk7Ci0gICAgdmVyaWZ5RXhjZXB0aW9ucygKLSAgICAgICAgbmV3IFBhcnNlVGVzdGVyKCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yUHJvdG8gcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvclByb3RvLnBhcnNlRnJvbShDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGluKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgfQotCi0gIEBUZXN0IHB1YmxpYyB2b2lkIG1lc3NhZ2VfcGFyc2VGcm9tX0NvZGVkSW5wdXRTdHJlYW1BbmRFeHRlbnNpb25SZWdpc3RyeSgpIHsKLSAgICBzZXR1cCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JQcm90by5wYXJzZUZyb20oCi0gICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShpbiksIEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBAVGVzdCBwdWJsaWMgdm9pZCBtZXNzYWdlX3BhcnNlRGVsaW1pdGVkRnJvbV9JbnB1dFN0cmVhbSgpIHsKLSAgICBzZXR1cERlbGltaXRlZCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JQcm90by5wYXJzZURlbGltaXRlZEZyb20oaW4pOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBAVGVzdCBwdWJsaWMgdm9pZCBtZXNzYWdlX3BhcnNlRGVsaW1pdGVkRnJvbV9JbnB1dFN0cmVhbUFuZEV4dGVuc2lvblJlZ2lzdHJ5KCkgewotICAgIHNldHVwRGVsaW1pdGVkKCk7Ci0gICAgdmVyaWZ5RXhjZXB0aW9ucygKLSAgICAgICAgbmV3IFBhcnNlVGVzdGVyKCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yUHJvdG8gcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvclByb3RvLnBhcnNlRGVsaW1pdGVkRnJvbShpbiwgRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgfQotCi0gIEBUZXN0IHB1YmxpYyB2b2lkIG1lc3NhZ2VCdWlsZGVyX21lcmdlRnJvbV9JbnB1dFN0cmVhbSgpIHsKLSAgICBzZXR1cCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGluKS5idWlsZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBAVGVzdCBwdWJsaWMgdm9pZCBtZXNzYWdlQnVpbGRlcl9tZXJnZUZyb21fSW5wdXRTdHJlYW1BbmRFeHRlbnNpb25SZWdpc3RyeSgpIHsKLSAgICBzZXR1cCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKGluLCBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpKQotICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBAVGVzdCBwdWJsaWMgdm9pZCBtZXNzYWdlQnVpbGRlcl9tZXJnZUZyb21fQ29kZWRJbnB1dFN0cmVhbSgpIHsKLSAgICBzZXR1cCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW4pKS5idWlsZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBAVGVzdCBwdWJsaWMgdm9pZCBtZXNzYWdlQnVpbGRlcl9tZXJnZUZyb21fQ29kZWRJbnB1dFN0cmVhbUFuZEV4dGVuc2lvblJlZ2lzdHJ5KCkgewotICAgIHNldHVwKCk7Ci0gICAgdmVyaWZ5RXhjZXB0aW9ucygKLSAgICAgICAgbmV3IFBhcnNlVGVzdGVyKCkgewotICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgIHB1YmxpYyBEZXNjcmlwdG9yUHJvdG8gcGFyc2UoSW5wdXRTdHJlYW0gaW4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgICByZXR1cm4gRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5tZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShpbiksIEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICAgICAgfQotICAgICAgICB9KTsKLSAgfQotCi0gIEBUZXN0IHB1YmxpYyB2b2lkIG1lc3NhZ2VCdWlsZGVyX21lcmdlRGVsaW1pdGVkRnJvbV9JbnB1dFN0cmVhbSgpIHsKLSAgICBzZXR1cERlbGltaXRlZCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlciA9IERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLm1lcmdlRGVsaW1pdGVkRnJvbShpbik7Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBAVGVzdCBwdWJsaWMgdm9pZCBtZXNzYWdlQnVpbGRlcl9tZXJnZURlbGltaXRlZEZyb21fSW5wdXRTdHJlYW1BbmRFeHRlbnNpb25SZWdpc3RyeSgpIHsKLSAgICBzZXR1cERlbGltaXRlZCgpOwotICAgIHZlcmlmeUV4Y2VwdGlvbnMoCi0gICAgICAgIG5ldyBQYXJzZVRlc3RlcigpIHsKLSAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHBhcnNlKElucHV0U3RyZWFtIGluKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlciA9IERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCk7Ci0gICAgICAgICAgICBidWlsZGVyLm1lcmdlRGVsaW1pdGVkRnJvbShpbiwgRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKSk7Ci0gICAgICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdmVyaWZ5RXhjZXB0aW9ucyhQYXJzZVRlc3RlciBwYXJzZVRlc3RlcikgewotICAgIC8vIE5vIGV4Y2VwdGlvbgotICAgIHRyeSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoRGVzY3JpcHRvclByb3RvLmdldERlc2NyaXB0b3IoKS50b1Byb3RvKCksCi0gICAgICAgICAgcGFyc2VUZXN0ZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWRQcm90bykpKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICBmYWlsKCJObyBleGNlcHRpb24gZXhwZWN0ZWQ6ICIgKyBlKTsKLSAgICB9Ci0KLSAgICAvLyBJT0V4Y2VwdGlvbgotICAgIHRyeSB7Ci0gICAgICAvLyB1c2luZyBhICJicm9rZW4iIHN0cmVhbSB0aGF0IHdpbGwgdGhyb3cgcGFydC13YXkgdGhyb3VnaCByZWFkaW5nIHRoZSBtZXNzYWdlCi0gICAgICBwYXJzZVRlc3Rlci5wYXJzZShicm9rZW4obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWRQcm90bykpKTsKLSAgICAgIGZhaWwoIklPRXhjZXB0aW9uIGV4cGVjdGVkIGJ1dCBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgYXNzZXJ0RmFsc2UoZSBpbnN0YW5jZW9mIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbik7Ci0gICAgfQotCi0gICAgLy8gSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uCi0gICAgdHJ5IHsKLSAgICAgIC8vIG1ha2UgdGhlIHNlcmlhbGl6ZWQgcHJvdG8gaW52YWxpZAotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1MDsgaSsrKSB7Ci0gICAgICAgIHNlcmlhbGl6ZWRQcm90b1tpXSA9IC0xOwotICAgICAgfQotICAgICAgcGFyc2VUZXN0ZXIucGFyc2UobmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHNlcmlhbGl6ZWRQcm90bykpOwotICAgICAgZmFpbCgiSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGV4cGVjdGVkIGJ1dCBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgYXNzZXJ0VHJ1ZShlIGluc3RhbmNlb2YgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIElucHV0U3RyZWFtIGJyb2tlbihJbnB1dFN0cmVhbSBpKSB7Ci0gICAgcmV0dXJuIG5ldyBGaWx0ZXJJbnB1dFN0cmVhbShpKSB7Ci0gICAgICBpbnQgY291bnQgPSAwOwotCi0gICAgICBAT3ZlcnJpZGUgcHVibGljIGludCByZWFkKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGNvdW50KysgPj0gNTApIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSU9FeGNlcHRpb24oIkknbSBicm9rZW4hIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN1cGVyLnJlYWQoKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlIHB1YmxpYyBpbnQgcmVhZChieXRlIGJbXSwgaW50IG9mZiwgaW50IGxlbikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKChjb3VudCArPSBsZW4pID49IDUwKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElPRXhjZXB0aW9uKCJJJ20gYnJva2VuISIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1BhcnNlclRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDg0MmQyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUGFyc2VyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzc3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0UGFyc2luZ01lcmdlTGl0ZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0T3B0aW1pemVGb3IuVGVzdE9wdGltaXplZEZvclNpemU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RPcHRpbWl6ZUZvci5UZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG87Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFyc2luZ01lcmdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheU91dHB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgUGFyc2VyfS4KLSAqCi0gKiBAYXV0aG9yIGxpdWppc2lAZ29vZ2xlLmNvbSAoUGhlcmwgTGl1KQotICovCi1wdWJsaWMgY2xhc3MgUGFyc2VyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHVibGljIHZvaWQgdGVzdEdlbmVyYXRlZE1lc3NhZ2VQYXJzZXJTaW5nbGV0b24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMucGFyc2VyKCksIFRlc3RVdGlsLmdldEFsbFNldCgpLmdldFBhcnNlckZvclR5cGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFJvdW5kVHJpcEVxdWFscyhNZXNzYWdlTGl0ZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSkKLSAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIGJ5dGVbXSBkYXRhID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOwotICAgIGZpbmFsIGludCBvZmZzZXQgPSAyMDsKLSAgICBmaW5hbCBpbnQgbGVuZ3RoID0gZGF0YS5sZW5ndGg7Ci0gICAgZmluYWwgaW50IHBhZGRpbmcgPSAzMDsKLSAgICBQYXJzZXI8PyBleHRlbmRzIE1lc3NhZ2VMaXRlPiBwYXJzZXIgPSBtZXNzYWdlLmdldFBhcnNlckZvclR5cGUoKTsKLSAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKG1lc3NhZ2UsIHBhcnNlci5wYXJzZUZyb20oZGF0YSwgcmVnaXN0cnkpKTsKLSAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKG1lc3NhZ2UsIHBhcnNlci5wYXJzZUZyb20oCi0gICAgICAgIGdlbmVyYXRlUGFkZGluZ0FycmF5KGRhdGEsIG9mZnNldCwgcGFkZGluZyksCi0gICAgICAgIG9mZnNldCwgbGVuZ3RoLCByZWdpc3RyeSkpOwotICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbSgKLSAgICAgICAgbWVzc2FnZS50b0J5dGVTdHJpbmcoKSwgcmVnaXN0cnkpKTsKLSAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKG1lc3NhZ2UsIHBhcnNlci5wYXJzZUZyb20oCi0gICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgcmVnaXN0cnkpKTsKLSAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKG1lc3NhZ2UsIHBhcnNlci5wYXJzZUZyb20oCi0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSksIHJlZ2lzdHJ5KSk7Ci0gIH0KLQotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFJvdW5kVHJpcEVxdWFscyhNZXNzYWdlTGl0ZSBtZXNzYWdlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBieXRlW10gZGF0YSA9IG1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKLSAgICBmaW5hbCBpbnQgb2Zmc2V0ID0gMjA7Ci0gICAgZmluYWwgaW50IGxlbmd0aCA9IGRhdGEubGVuZ3RoOwotICAgIGZpbmFsIGludCBwYWRkaW5nID0gMzA7Ci0KLSAgICBQYXJzZXI8TWVzc2FnZUxpdGU+IHBhcnNlciA9Ci0gICAgICAgIChQYXJzZXI8TWVzc2FnZUxpdGU+KSBtZXNzYWdlLmdldFBhcnNlckZvclR5cGUoKTsKLSAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKG1lc3NhZ2UsIHBhcnNlci5wYXJzZUZyb20oZGF0YSkpOwotICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbSgKLSAgICAgICAgZ2VuZXJhdGVQYWRkaW5nQXJyYXkoZGF0YSwgb2Zmc2V0LCBwYWRkaW5nKSwKLSAgICAgICAgb2Zmc2V0LCBsZW5ndGgpKTsKLSAgICBhc3NlcnRNZXNzYWdlRXF1YWxzKG1lc3NhZ2UsIHBhcnNlci5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOwotICAgIGFzc2VydE1lc3NhZ2VFcXVhbHMobWVzc2FnZSwgcGFyc2VyLnBhcnNlRnJvbSgKLSAgICAgICAgbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGRhdGEpKSk7Ci0gICAgYXNzZXJ0TWVzc2FnZUVxdWFscyhtZXNzYWdlLCBwYXJzZXIucGFyc2VGcm9tKAotICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEpKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZUVxdWFscygKLSAgICAgIE1lc3NhZ2VMaXRlIGV4cGVjdGVkLCBNZXNzYWdlTGl0ZSBhY3R1YWwpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBpZiAoZXhwZWN0ZWQgaW5zdGFuY2VvZiBNZXNzYWdlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC50b0J5dGVTdHJpbmcoKSwgYWN0dWFsLnRvQnl0ZVN0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIGJ5dGVbXSBnZW5lcmF0ZVBhZGRpbmdBcnJheShieXRlW10gZGF0YSwgaW50IG9mZnNldCwgaW50IHBhZGRpbmcpIHsKLSAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbb2Zmc2V0ICsgZGF0YS5sZW5ndGggKyBwYWRkaW5nXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIHJlc3VsdCwgb2Zmc2V0LCBkYXRhLmxlbmd0aCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROb3JtYWxNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKFRlc3RVdGlsLmdldEFsbFNldCgpKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydFBhcnNlUGFydGlhbChUZXN0UmVxdWlyZWQucGFyc2VyKCksIFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkuc2V0QSgxKS5idWlsZFBhcnRpYWwoKSk7Ci0gIH0KLQotICBwcml2YXRlIDxUIGV4dGVuZHMgTWVzc2FnZUxpdGU+IHZvaWQgYXNzZXJ0UGFyc2VQYXJ0aWFsKAotICAgICAgUGFyc2VyPFQ+IHBhcnNlciwgVCBwYXJ0aWFsTWVzc2FnZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgU3RyaW5nIGVycm9yU3RyaW5nID0KLSAgICAgICAgIlNob3VsZCB0aHJvdyBleGNlcHRpb25zIHdoZW4gdGhlIHBhcnNlZCBtZXNzYWdlIGlzbid0IGluaXRpYWxpemVkLiI7Ci0KLSAgICAvLyBwYXJzZVBhcnRpYWxGcm9tIHNob3VsZCBwYXNzLgotICAgIGJ5dGVbXSBkYXRhID0gcGFydGlhbE1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRFcXVhbHMocGFydGlhbE1lc3NhZ2UsIHBhcnNlci5wYXJzZVBhcnRpYWxGcm9tKGRhdGEpKTsKLSAgICBhc3NlcnRFcXVhbHMocGFydGlhbE1lc3NhZ2UsIHBhcnNlci5wYXJzZVBhcnRpYWxGcm9tKAotICAgICAgICBwYXJ0aWFsTWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOwotICAgIGFzc2VydEVxdWFscyhwYXJ0aWFsTWVzc2FnZSwgcGFyc2VyLnBhcnNlUGFydGlhbEZyb20oCi0gICAgICAgIG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSkpOwotICAgIGFzc2VydEVxdWFscyhwYXJ0aWFsTWVzc2FnZSwgcGFyc2VyLnBhcnNlUGFydGlhbEZyb20oCi0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSkpKTsKLQotICAgIC8vIHBhcnNlRnJvbShCeXRlQXJyYXkpCi0gICAgdHJ5IHsKLSAgICAgIHBhcnNlci5wYXJzZUZyb20ocGFydGlhbE1lc3NhZ2UudG9CeXRlQXJyYXkoKSk7Ci0gICAgICBmYWlsKGVycm9yU3RyaW5nKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gcGFzcy4KLSAgICB9Ci0KLSAgICAvLyBwYXJzZUZyb20oQnl0ZVN0cmluZykKLSAgICB0cnkgewotICAgICAgcGFyc2VyLnBhcnNlRnJvbShwYXJ0aWFsTWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgICBmYWlsKGVycm9yU3RyaW5nKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gcGFzcy4KLSAgICB9Ci0KLSAgICAvLyBwYXJzZUZyb20oSW5wdXRTdHJlYW0pCi0gICAgdHJ5IHsKLSAgICAgIHBhcnNlci5wYXJzZUZyb20obmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKHBhcnRpYWxNZXNzYWdlLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgIGZhaWwoZXJyb3JTdHJpbmcpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHBhc3MuCi0gICAgfQotCi0gICAgLy8gcGFyc2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pCi0gICAgdHJ5IHsKLSAgICAgIHBhcnNlci5wYXJzZUZyb20oQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgICBwYXJ0aWFsTWVzc2FnZS50b0J5dGVBcnJheSgpKSk7Ci0gICAgICBmYWlsKGVycm9yU3RyaW5nKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBwYXNzLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoCi0gICAgICAgIFRlc3RVdGlsTGl0ZS5nZXRBbGxMaXRlRXh0ZW5zaW9uc1NldCgpLCBUZXN0VXRpbExpdGUuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoVGVzdFV0aWwuZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoCi0gICAgICAgIFRlc3RVdGlsTGl0ZS5nZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpLCBUZXN0VXRpbExpdGUuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlRGVsaW1pdGVkVG8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBXcml0ZSBub3JtYWwgTWVzc2FnZS4KLSAgICBUZXN0QWxsVHlwZXMgbm9ybWFsTWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgbm9ybWFsTWVzc2FnZS53cml0ZURlbGltaXRlZFRvKG91dHB1dCk7Ci0KLSAgICAvLyBXcml0ZSBNZXNzYWdlTGl0ZSB3aXRoIHBhY2tlZCBleHRlbnNpb24gZmllbGRzLgotICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBwYWNrZWRNZXNzYWdlID0gVGVzdFV0aWxMaXRlLmdldExpdGVQYWNrZWRFeHRlbnNpb25zU2V0KCk7Ci0gICAgcGFja2VkTWVzc2FnZS53cml0ZURlbGltaXRlZFRvKG91dHB1dCk7Ci0KLSAgICBJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgYXNzZXJ0TWVzc2FnZUVxdWFscygKLSAgICAgICAgbm9ybWFsTWVzc2FnZSwKLSAgICAgICAgbm9ybWFsTWVzc2FnZS5nZXRQYXJzZXJGb3JUeXBlKCkucGFyc2VEZWxpbWl0ZWRGcm9tKGlucHV0KSk7Ci0gICAgYXNzZXJ0TWVzc2FnZUVxdWFscygKLSAgICAgICAgcGFja2VkTWVzc2FnZSwKLSAgICAgICAgcGFja2VkTWVzc2FnZQotICAgICAgICAgICAgLmdldFBhcnNlckZvclR5cGUoKQotICAgICAgICAgICAgLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCwgVGVzdFV0aWxMaXRlLmdldEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbmtub3duRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gQWxsIGZpZWxkcyB3aWxsIGJlIHRyZWF0ZWQgYXMgdW5rbm93biBmaWVsZHMgaW4gZW1wdHlNZXNzYWdlLgotICAgIFRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlNZXNzYWdlID0KLSAgICAgICAgVGVzdEVtcHR5TWVzc2FnZS5wYXJzZXIoKS5wYXJzZUZyb20oVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCksCi0gICAgICAgIGVtcHR5TWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gIH0KLQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHRpbWl6ZUZvclNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5zZXRJKDEyKS5zZXRNc2coRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMzQpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFRlc3RPcHRpbWl6ZWRGb3JTaXplLnRlc3RFeHRlbnNpb24sIDU2KTsKLSAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0T3B0aW1pemVkRm9yU2l6ZS50ZXN0RXh0ZW5zaW9uMiwKLSAgICAgICAgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCkuc2V0WCg3OCkuYnVpbGQoKSk7Ci0KLSAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKLSAgICBVbml0dGVzdE9wdGltaXplRm9yLnJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7Ci0KLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMobWVzc2FnZSwgcmVnaXN0cnkpOwotICB9Ci0KLSAgLyoqIEhlbHBlciBtZXRob2QgZm9yIHtAbGluayAjdGVzdFBhcnNpbmdNZXJnZSgpfS4qLwotICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZU1lcmdlZChUZXN0QWxsVHlwZXMgYWxsVHlwZXMpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoMywgYWxsVHlwZXMuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgYWxsVHlwZXMuZ2V0T3B0aW9uYWxJbnQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgYWxsVHlwZXMuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gIH0KLQotICAvKiogSGVscGVyIG1ldGhvZCBmb3Ige0BsaW5rICN0ZXN0UGFyc2luZ01lcmdlTGl0ZSgpfS4qLwotICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZU1lcmdlZChUZXN0QWxsVHlwZXNMaXRlIGFsbFR5cGVzKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGFsbFR5cGVzLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGFsbFR5cGVzLmdldE9wdGlvbmFsSW50NjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIGFsbFR5cGVzLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNpbmdNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEJ1aWxkIG1lc3NhZ2VzLgotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RBbGxUeXBlcyBtc2cxID0gYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDEpLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIFRlc3RBbGxUeXBlcyBtc2cyID0gYnVpbGRlci5zZXRPcHRpb25hbEludDY0KDIpLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIFRlc3RBbGxUeXBlcyBtc2czID0gYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDMpCi0gICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiaGVsbG8iKS5idWlsZCgpOwotCi0gICAgLy8gQnVpbGQgZ3JvdXBzLgotICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxIG9wdGlvbmFsRzEgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2cxKS5idWlsZCgpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxIG9wdGlvbmFsRzIgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2cyKS5idWlsZCgpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxIG9wdGlvbmFsRzMgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2czKS5idWlsZCgpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyIHJlcGVhdGVkRzEgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2cxKS5idWlsZCgpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyIHJlcGVhdGVkRzIgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2cyKS5idWlsZCgpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2UuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyIHJlcGVhdGVkRzMgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2czKS5idWlsZCgpOwotCi0gICAgLy8gQXNzaWduIGFuZCBzZXJpYWxpemUgUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuCi0gICAgQnl0ZVN0cmluZyBkYXRhID0gVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEZpZWxkMShtc2cxKS5hZGRGaWVsZDEobXNnMikuYWRkRmllbGQxKG1zZzMpCi0gICAgICAgIC5hZGRGaWVsZDIobXNnMSkuYWRkRmllbGQyKG1zZzIpLmFkZEZpZWxkMihtc2czKQotICAgICAgICAuYWRkRmllbGQzKG1zZzEpLmFkZEZpZWxkMyhtc2cyKS5hZGRGaWVsZDMobXNnMykKLSAgICAgICAgLmFkZEdyb3VwMShvcHRpb25hbEcxKS5hZGRHcm91cDEob3B0aW9uYWxHMikuYWRkR3JvdXAxKG9wdGlvbmFsRzMpCi0gICAgICAgIC5hZGRHcm91cDIocmVwZWF0ZWRHMSkuYWRkR3JvdXAyKHJlcGVhdGVkRzIpLmFkZEdyb3VwMihyZXBlYXRlZEczKQotICAgICAgICAuYWRkRXh0MShtc2cxKS5hZGRFeHQxKG1zZzIpLmFkZEV4dDEobXNnMykKLSAgICAgICAgLmFkZEV4dDIobXNnMSkuYWRkRXh0Mihtc2cyKS5hZGRFeHQyKG1zZzMpCi0gICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotCi0gICAgLy8gUGFyc2UgVGVzdFBhcnNpbmdNZXJnZS4KLSAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgVW5pdHRlc3RQcm90by5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2UgcGFyc2luZ01lcmdlID0gVGVzdFBhcnNpbmdNZXJnZS5wYXJzZXIoKS5wYXJzZUZyb20oZGF0YSwgcmVnaXN0cnkpOwotCi0gICAgLy8gUmVxdWlyZWQgYW5kIG9wdGlvbmFsIGZpZWxkcyBzaG91bGQgYmUgbWVyZ2VkLgotICAgIGFzc2VydE1lc3NhZ2VNZXJnZWQocGFyc2luZ01lcmdlLmdldFJlcXVpcmVkQWxsVHlwZXMoKSk7Ci0gICAgYXNzZXJ0TWVzc2FnZU1lcmdlZChwYXJzaW5nTWVyZ2UuZ2V0T3B0aW9uYWxBbGxUeXBlcygpKTsKLSAgICBhc3NlcnRNZXNzYWdlTWVyZ2VkKAotICAgICAgICBwYXJzaW5nTWVyZ2UuZ2V0T3B0aW9uYWxHcm91cCgpLmdldE9wdGlvbmFsR3JvdXBBbGxUeXBlcygpKTsKLSAgICBhc3NlcnRNZXNzYWdlTWVyZ2VkKHBhcnNpbmdNZXJnZS5nZXRFeHRlbnNpb24oCi0gICAgICAgIFRlc3RQYXJzaW5nTWVyZ2Uub3B0aW9uYWxFeHQpKTsKLQotICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBzaG91bGQgbm90IGJlIG1lcmdlZC4KLSAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldFJlcGVhdGVkQWxsVHlwZXNDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBUZXN0UGFyc2luZ01lcmdlLnJlcGVhdGVkRXh0KSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2luZ01lcmdlTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEJ1aWxkIG1lc3NhZ2VzLgotICAgIFRlc3RBbGxUeXBlc0xpdGUuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZSBtc2cxID0gYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDEpLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIFRlc3RBbGxUeXBlc0xpdGUgbXNnMiA9IGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQ2NCgyKS5idWlsZCgpOwotICAgIGJ1aWxkZXIuY2xlYXIoKTsKLSAgICBUZXN0QWxsVHlwZXNMaXRlIG1zZzMgPSBidWlsZGVyLnNldE9wdGlvbmFsSW50MzIoMykKLSAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJoZWxsbyIpLmJ1aWxkKCk7Ci0KLSAgICAvLyBCdWlsZCBncm91cHMuCi0gICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxIG9wdGlvbmFsRzEgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDEubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRGaWVsZDEobXNnMSkuYnVpbGQoKTsKLSAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDEgb3B0aW9uYWxHMiA9Ci0gICAgICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2cyKS5idWlsZCgpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMSBvcHRpb25hbEczID0KLSAgICAgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAxLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RmllbGQxKG1zZzMpLmJ1aWxkKCk7Ci0gICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyIHJlcGVhdGVkRzEgPQotICAgICAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDIubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRGaWVsZDEobXNnMSkuYnVpbGQoKTsKLSAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5Hcm91cDIgcmVwZWF0ZWRHMiA9Ci0gICAgICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEZpZWxkMShtc2cyKS5idWlsZCgpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlLlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yLkdyb3VwMiByZXBlYXRlZEczID0KLSAgICAgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUuUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IuR3JvdXAyLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RmllbGQxKG1zZzMpLmJ1aWxkKCk7Ci0KLSAgICAvLyBBc3NpZ24gYW5kIHNlcmlhbGl6ZSBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvci4KLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBUZXN0UGFyc2luZ01lcmdlTGl0ZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvci5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEZpZWxkMShtc2cxKS5hZGRGaWVsZDEobXNnMikuYWRkRmllbGQxKG1zZzMpCi0gICAgICAgIC5hZGRGaWVsZDIobXNnMSkuYWRkRmllbGQyKG1zZzIpLmFkZEZpZWxkMihtc2czKQotICAgICAgICAuYWRkRmllbGQzKG1zZzEpLmFkZEZpZWxkMyhtc2cyKS5hZGRGaWVsZDMobXNnMykKLSAgICAgICAgLmFkZEdyb3VwMShvcHRpb25hbEcxKS5hZGRHcm91cDEob3B0aW9uYWxHMikuYWRkR3JvdXAxKG9wdGlvbmFsRzMpCi0gICAgICAgIC5hZGRHcm91cDIocmVwZWF0ZWRHMSkuYWRkR3JvdXAyKHJlcGVhdGVkRzIpLmFkZEdyb3VwMihyZXBlYXRlZEczKQotICAgICAgICAuYWRkRXh0MShtc2cxKS5hZGRFeHQxKG1zZzIpLmFkZEV4dDEobXNnMykKLSAgICAgICAgLmFkZEV4dDIobXNnMSkuYWRkRXh0Mihtc2cyKS5hZGRFeHQyKG1zZzMpCi0gICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotCi0gICAgLy8gUGFyc2UgVGVzdFBhcnNpbmdNZXJnZUxpdGUuCi0gICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOwotICAgIFVuaXR0ZXN0TGl0ZS5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOwotICAgIFRlc3RQYXJzaW5nTWVyZ2VMaXRlIHBhcnNpbmdNZXJnZSA9IFRlc3RQYXJzaW5nTWVyZ2VMaXRlLnBhcnNlcigpLnBhcnNlRnJvbShkYXRhLCByZWdpc3RyeSk7Ci0KLSAgICAvLyBSZXF1aXJlZCBhbmQgb3B0aW9uYWwgZmllbGRzIHNob3VsZCBiZSBtZXJnZWQuCi0gICAgYXNzZXJ0TWVzc2FnZU1lcmdlZChwYXJzaW5nTWVyZ2UuZ2V0UmVxdWlyZWRBbGxUeXBlcygpKTsKLSAgICBhc3NlcnRNZXNzYWdlTWVyZ2VkKHBhcnNpbmdNZXJnZS5nZXRPcHRpb25hbEFsbFR5cGVzKCkpOwotICAgIGFzc2VydE1lc3NhZ2VNZXJnZWQoCi0gICAgICAgIHBhcnNpbmdNZXJnZS5nZXRPcHRpb25hbEdyb3VwKCkuZ2V0T3B0aW9uYWxHcm91cEFsbFR5cGVzKCkpOwotICAgIGFzc2VydE1lc3NhZ2VNZXJnZWQocGFyc2luZ01lcmdlLmdldEV4dGVuc2lvbigKLSAgICAgICAgVGVzdFBhcnNpbmdNZXJnZUxpdGUub3B0aW9uYWxFeHQpKTsKLQotICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBzaG91bGQgbm90IGJlIG1lcmdlZC4KLSAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldFJlcGVhdGVkQWxsVHlwZXNDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgcGFyc2luZ01lcmdlLmdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBUZXN0UGFyc2luZ01lcmdlTGl0ZS5yZXBlYXRlZEV4dCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvYnVmQXJyYXlMaXN0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b2J1ZkFycmF5TGlzdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Y0NWUyMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvYnVmQXJyYXlMaXN0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjg5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBzdGF0aWMgamF2YS51dGlsLkFycmF5cy5hc0xpc3Q7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkNvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgUHJvdG9idWZBcnJheUxpc3R9LgotICovCi1wdWJsaWMgY2xhc3MgUHJvdG9idWZBcnJheUxpc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUHJvdG9idWZBcnJheUxpc3Q8SW50ZWdlcj4gVU5BUllfTElTVCA9IG5ld0ltbXV0YWJsZVByb3RvQXJyYXlMaXN0KDEpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcm90b2J1ZkFycmF5TGlzdDxJbnRlZ2VyPiBURVJUSUFSWV9MSVNUID0KLSAgICAgIG5ld0ltbXV0YWJsZVByb3RvQXJyYXlMaXN0KDEsIDIsIDMpOwotICAKLSAgcHJpdmF0ZSBQcm90b2J1ZkFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0OwotICAKLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgbGlzdCA9IG5ldyBQcm90b2J1ZkFycmF5TGlzdDxJbnRlZ2VyPigpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0RW1wdHlMaXN0UmV0dXJuc1NhbWVJbnN0YW5jZSgpIHsKLSAgICBhc3NlcnRTYW1lKFByb3RvYnVmQXJyYXlMaXN0LmVtcHR5TGlzdCgpLCBQcm90b2J1ZkFycmF5TGlzdC5lbXB0eUxpc3QoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFbXB0eUxpc3RJc0ltbXV0YWJsZSgpIHsKLSAgICBhc3NlcnRJbW11dGFibGUoUHJvdG9idWZBcnJheUxpc3QuPEludGVnZXI+ZW1wdHlMaXN0KCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZpY2F0aW9uV2l0aEl0ZXJhdGlvbigpIHsKLSAgICBsaXN0LmFkZEFsbChhc0xpc3QoMSwgMiwgMywgNCkpOwotICAgIEl0ZXJhdG9yPEludGVnZXI+IGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIGFzc2VydEVxdWFscyg0LCBsaXN0LnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIChpbnQpIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgKGludCkgaXRlcmF0b3IubmV4dCgpKTsKLSAgICAKLSAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICB0cnkgewotICAgICAgaXRlcmF0b3IubmV4dCgpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKENvbmN1cnJlbnRNb2RpZmljYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgaXRlcmF0b3IgPSBsaXN0Lml0ZXJhdG9yKCk7Ci0gICAgbGlzdC5zZXQoMCwgMSk7Ci0gICAgdHJ5IHsKLSAgICAgIGl0ZXJhdG9yLm5leHQoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIGl0ZXJhdG9yID0gbGlzdC5pdGVyYXRvcigpOwotICAgIGxpc3QuYWRkKDAsIDApOwotICAgIHRyeSB7Ci0gICAgICBpdGVyYXRvci5uZXh0KCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoQ29uY3VycmVudE1vZGlmaWNhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1ha2VJbW11dGFibGUoKSB7Ci0gICAgbGlzdC5hZGQoMik7Ci0gICAgbGlzdC5hZGQoNCk7Ci0gICAgbGlzdC5hZGQoNik7Ci0gICAgbGlzdC5hZGQoOCk7Ci0gICAgbGlzdC5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgYXNzZXJ0SW1tdXRhYmxlKGxpc3QpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlKCkgewotICAgIGxpc3QuYWRkKDIpOwotICAgIGxpc3QuYWRkKDQpOwotICAgIGxpc3QuYWRkKDYpOwotCi0gICAgbGlzdC5yZW1vdmUoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFzTGlzdCgyLCA2KSwgbGlzdCk7Ci0KLSAgICBsaXN0LnJlbW92ZSgxKTsKLSAgICBhc3NlcnRFcXVhbHMoYXNMaXN0KDIpLCBsaXN0KTsKLQotICAgIGxpc3QucmVtb3ZlKDApOwotICAgIGFzc2VydEVxdWFscyhhc0xpc3QoKSwgbGlzdCk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXQoKSB7Ci0gICAgbGlzdC5hZGQoMik7Ci0gICAgbGlzdC5hZGQoNik7Ci0gICAgCi0gICAgYXNzZXJ0RXF1YWxzKDIsIChpbnQpIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoNiwgKGludCkgbGlzdC5nZXQoMSkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0U2V0KCkgewotICAgIGxpc3QuYWRkKDIpOwotICAgIGxpc3QuYWRkKDYpOwotICAgIAotICAgIGxpc3Quc2V0KDAsIDEpOwotICAgIGFzc2VydEVxdWFscygxLCAoaW50KSBsaXN0LmdldCgwKSk7Ci0gICAgbGlzdC5zZXQoMSwgMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIChpbnQpIGxpc3QuZ2V0KDEpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRJbW11dGFibGUoTGlzdDxJbnRlZ2VyPiBsaXN0KSB7Ci0gICAgaWYgKGxpc3QuY29udGFpbnMoMSkpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJDYW5ub3QgdGVzdCB0aGUgaW1tdXRhYmlsaXR5IG9mIGxpc3RzIHRoYXQgY29udGFpbiAxLiIpOwotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKDAsIDEpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChDb2xsZWN0aW9ucy48SW50ZWdlcj5lbXB0eUxpc3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKENvbGxlY3Rpb25zLnNpbmdsZXRvbkxpc3QoMSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbChuZXcgUHJvdG9idWZBcnJheUxpc3Q8SW50ZWdlcj4oKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkQWxsKFVOQVJZX0xJU1QpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbCgwLCBDb2xsZWN0aW9ucy5zaW5nbGV0b24oMSkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIAotICAgIHRyeSB7Ci0gICAgICBsaXN0LmFkZEFsbCgwLCBVTkFSWV9MSVNUKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5hZGRBbGwoMCwgQ29sbGVjdGlvbnMuPEludGVnZXI+ZW1wdHlMaXN0KCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfSAKLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LmNsZWFyKCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmUoMSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKG5ldyBPYmplY3QoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlQWxsKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmVBbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKDEpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZW1vdmVBbGwoVU5BUllfTElTVCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmV0YWluQWxsKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoQ29sbGVjdGlvbnMuc2luZ2xldG9uKDEpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgbGlzdC5yZXRhaW5BbGwoVU5BUllfTElTVCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDAsIDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIHN0YXRpYyBQcm90b2J1ZkFycmF5TGlzdDxJbnRlZ2VyPiBuZXdJbW11dGFibGVQcm90b0FycmF5TGlzdChpbnQuLi4gZWxlbWVudHMpIHsKLSAgICBQcm90b2J1ZkFycmF5TGlzdDxJbnRlZ2VyPiBsaXN0ID0gbmV3IFByb3RvYnVmQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgZm9yIChpbnQgZWxlbWVudCA6IGVsZW1lbnRzKSB7Ci0gICAgICBsaXN0LmFkZChlbGVtZW50KTsKLSAgICB9Ci0gICAgbGlzdC5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgcmV0dXJuIGxpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ1MjMyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxOTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9LiBUaGlzIHRlc3RzIGJhc2ljIGZ1bmN0aW9uYWxpdHkuCi0gKiBNb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nIGlzIHByb3ZpZGVkIHZpYSBvdGhlciB0ZXN0cyB0aGF0IGV4ZXJjaXNlIHRoZQotICogYnVpbGRlci4KLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqLwotcHVibGljIGNsYXNzIFJlcGVhdGVkRmllbGRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNVc2UoKSB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOwotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotCi0gICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKLQotICAgIC8vIE1ha2Ugc3VyZSBpdCBkb2Vzbid0IGNoYW5nZS4KLSAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbGlzdDIgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0U2FtZShsaXN0LCBsaXN0Mik7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R29pbmdCYWNrQW5kRm9ydGgoKSB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOwotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotCi0gICAgLy8gQ29udmVydCB0byBsaXN0Ci0gICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKLQotICAgIC8vIFVwZGF0ZSAwdGggaXRlbQotICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigwKS5zZXRPcHRpb25hbFN0cmluZygiZm9vIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gICAgbGlzdCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RWYXJpb3VzTWV0aG9kcygpIHsKLSAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7Ci0gICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKLSAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0gbmV3UmVwZWF0ZWRGaWVsZEJ1aWxkZXIobW9ja1BhcmVudCk7Ci0gICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDIpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkQnVpbGRlcigwLCBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCi0gICAgICAgIC5zZXRPcHRpb25hbEludDMyKDApOwotICAgIGJ1aWxkZXIuYWRkQnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLnNldE9wdGlvbmFsSW50MzIoMyk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRNZXNzYWdlKDMpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbWVzc2FnZXMgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2VzLnNpemUoKSk7Ci0gICAgYXNzZXJ0U2FtZShtZXNzYWdlcywgYnVpbGRlci5idWlsZCgpKTsgLy8gZXhwZWN0IHNhbWUgbGlzdAotCi0gICAgLy8gUmVtb3ZlIGEgbWVzc2FnZS4KLSAgICBidWlsZGVyLnJlbW92ZSgyKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFJlbW92ZSBhIGJ1aWxkZXIuCi0gICAgYnVpbGRlci5yZW1vdmUoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0Q291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFRlc3QgY2xlYXIuCi0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldENvdW50KCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0VtcHR5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpc3RzKCkgewotICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKLSAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPSBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihtb2NrUGFyZW50KTsKLSAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZSgwLAotICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFVzZSBsaXN0IG9mIGJ1aWxkZXJzLgotICAgIExpc3Q8VGVzdEFsbFR5cGVzLkJ1aWxkZXI+IGJ1aWxkZXJzID0gYnVpbGRlci5nZXRCdWlsZGVyTGlzdCgpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVycy5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlcnMuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYnVpbGRlcnMuZ2V0KDApLnNldE9wdGlvbmFsSW50MzIoMTApOwotICAgIGJ1aWxkZXJzLmdldCgxKS5zZXRPcHRpb25hbEludDMyKDExKTsKLQotICAgIC8vIFVzZSBsaXN0IG9mIHByb3RvcwotICAgIExpc3Q8VGVzdEFsbFR5cGVzPiBwcm90b3MgPSBidWlsZGVyLmdldE1lc3NhZ2VMaXN0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwLCBwcm90b3MuZ2V0KDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBwcm90b3MuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0KLSAgICAvLyBBZGQgYW4gaXRlbSB0byB0aGUgYnVpbGRlcnMgYW5kIHZlcmlmeSBpdCdzIHVwZGF0ZWQgaW4gYm90aAotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTIpLmJ1aWxkKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVycy5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBwcm90b3Muc2l6ZSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRJc1VubW9kaWZpYWJsZShMaXN0PD8+IGxpc3QpIHsKLSAgICBpZiAobGlzdCA9PSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkgewotICAgICAgLy8gT0tBWSAtLSBOZWVkIHRvIGNoZWNrIHRoaXMgYi9jIEVtcHR5TGlzdCBhbGxvd3MgeW91IHRvIGNhbGwgY2xlYXIuCi0gICAgfSBlbHNlIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGxpc3QuY2xlYXIoKTsKLSAgICAgICAgZmFpbCgiTGlzdCB3YXNuJ3QgaW1tdXRhYmxlIik7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGdvb2QKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+Ci0gICAgICBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7Ci0gICAgcmV0dXJuIG5ldyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KENvbGxlY3Rpb25zLjxUZXN0QWxsVHlwZXM+ZW1wdHlMaXN0KCksIGZhbHNlLAotICAgICAgICBwYXJlbnQsIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Sb3BlQnl0ZVN0cmluZ1N1YnN0cmluZ1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdTdWJzdHJpbmdUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRjNTZmMmUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Sb3BlQnl0ZVN0cmluZ1N1YnN0cmluZ1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRlc3RzIHtAbGluayBSb3BlQnl0ZVN0cmluZyNzdWJzdHJpbmcoaW50LCBpbnQpfSBieSBpbmhlcml0aW5nIHRoZSB0ZXN0cyBmcm9tCi0gKiB7QGxpbmsgTGl0ZXJhbEJ5dGVTdHJpbmdUZXN0fS4gIE9ubHkgYSBjb3VwbGUgb2YgbWV0aG9kcyBhcmUgb3ZlcnJpZGRlbi4KLSAqCi0gKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIChDYXJsIEhhdmVybCkKLSAqLwotcHVibGljIGNsYXNzIFJvcGVCeXRlU3RyaW5nU3Vic3RyaW5nVGVzdCBleHRlbmRzIExpdGVyYWxCeXRlU3RyaW5nVGVzdCB7Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgY2xhc3NVbmRlclRlc3QgPSAiUm9wZUJ5dGVTdHJpbmciOwotICAgIGJ5dGVbXSBzb3VyY2VCeXRlcyA9IEJ5dGVTdHJpbmdUZXN0LmdldFRlc3RCeXRlcygyMjM0MSwgMjIzMzc3NjZMKTsKLSAgICBJdGVyYXRvcjxCeXRlU3RyaW5nPiBpdGVyID0gQnl0ZVN0cmluZ1Rlc3QubWFrZUNvbmNyZXRlUGllY2VzKHNvdXJjZUJ5dGVzKS5pdGVyYXRvcigpOwotICAgIEJ5dGVTdHJpbmcgc291cmNlU3RyaW5nID0gaXRlci5uZXh0KCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBzb3VyY2VTdHJpbmcgPSBzb3VyY2VTdHJpbmcuY29uY2F0KGl0ZXIubmV4dCgpKTsKLSAgICB9Ci0KLSAgICBpbnQgZnJvbSA9IDExMzA7Ci0gICAgaW50IHRvID0gc291cmNlQnl0ZXMubGVuZ3RoIC0gNTU1NTsKLSAgICBzdHJpbmdVbmRlclRlc3QgPSBzb3VyY2VTdHJpbmcuc3Vic3RyaW5nKGZyb20sIHRvKTsKLSAgICByZWZlcmVuY2VCeXRlcyA9IG5ldyBieXRlW3RvIC0gZnJvbV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShzb3VyY2VCeXRlcywgZnJvbSwgcmVmZXJlbmNlQnl0ZXMsIDAsIHRvIC0gZnJvbSk7Ci0gICAgZXhwZWN0ZWRIYXNoQ29kZSA9IC0xMjU5MjYwNjgwOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRUcmVlRGVwdGgoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHRyZWUgZGVwdGgiLAotICAgICAgICAzLCBzdHJpbmdVbmRlclRlc3QuZ2V0VHJlZURlcHRoKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgc291cmNlU3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIHNvdXJjZUJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChzb3VyY2VTdHJpbmcpOwotICAgIGludCBjb3BpZXMgPSAyNTA7Ci0KLSAgICAvLyBCeSBidWlsZGluZyB0aGUgUm9wZUJ5dGVTdHJpbmcgYnkgY29uY2F0ZW5hdGluZywgdGhpcyBpcyBhY3R1YWxseSBhIGZhaXJseSBzdHJlbnVvdXMgdGVzdC4KLSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihjb3BpZXMgKiBzb3VyY2VTdHJpbmcubGVuZ3RoKCkpOwotICAgIEJ5dGVTdHJpbmcgdW5pY29kZSA9IEJ5dGVTdHJpbmcuRU1QVFk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3BpZXM7ICsraSkgewotICAgICAgYnVpbGRlci5hcHBlbmQoc291cmNlU3RyaW5nKTsKLSAgICAgIHVuaWNvZGUgPSBSb3BlQnl0ZVN0cmluZy5jb25jYXRlbmF0ZSh1bmljb2RlLCBzb3VyY2VCeXRlU3RyaW5nKTsKLSAgICB9Ci0gICAgU3RyaW5nIHRlc3RTdHJpbmcgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAvLyBEbyB0aGUgc3Vic3RyaW5nIHBhcnQKLSAgICB0ZXN0U3RyaW5nID0gdGVzdFN0cmluZy5zdWJzdHJpbmcoMiwgdGVzdFN0cmluZy5sZW5ndGgoKSAtIDYpOwotICAgIHVuaWNvZGUgPSB1bmljb2RlLnN1YnN0cmluZygyLCB1bmljb2RlLnNpemUoKSAtIDYpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBmcm9tIHN0cmluZyBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHR5cGUiLAotICAgICAgICBjbGFzc1VuZGVyVGVzdCwgZ2V0QWN0dWFsQ2xhc3NOYW1lKHVuaWNvZGUpKTsKLSAgICBTdHJpbmcgcm91bmRUcmlwU3RyaW5nID0gdW5pY29kZS50b1N0cmluZyhVVEZfOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiB1bmljb2RlIGJ5dGVzIG11c3QgbWF0Y2giLAotICAgICAgICB0ZXN0U3RyaW5nLCByb3VuZFRyaXBTdHJpbmcpOwotICAgIEJ5dGVTdHJpbmcgZmxhdFN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHRlc3RTdHJpbmcpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgc3RyaW5nIG11c3QgZXF1YWwgdGhlIGZsYXQgc3RyaW5nIiwgZmxhdFN0cmluZywgdW5pY29kZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBzdHJpbmcgbXVzdCBtdXN0IGhhdmUgc2FtZSBoYXNoQ29kZSBhcyB0aGUgZmxhdCBzdHJpbmciLAotICAgICAgICBmbGF0U3RyaW5nLmhhc2hDb2RlKCksIHVuaWNvZGUuaGFzaENvZGUoKSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgdGVzdENoYXJzZXRUb1N0cmluZygpIHsKLSAgICBTdHJpbmcgc291cmNlU3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIHNvdXJjZUJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChzb3VyY2VTdHJpbmcpOwotICAgIGludCBjb3BpZXMgPSAyNTA7Ci0KLSAgICAvLyBCeSBidWlsZGluZyB0aGUgUm9wZUJ5dGVTdHJpbmcgYnkgY29uY2F0ZW5hdGluZywgdGhpcyBpcyBhY3R1YWxseSBhIGZhaXJseSBzdHJlbnVvdXMgdGVzdC4KLSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihjb3BpZXMgKiBzb3VyY2VTdHJpbmcubGVuZ3RoKCkpOwotICAgIEJ5dGVTdHJpbmcgdW5pY29kZSA9IEJ5dGVTdHJpbmcuRU1QVFk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3BpZXM7ICsraSkgewotICAgICAgYnVpbGRlci5hcHBlbmQoc291cmNlU3RyaW5nKTsKLSAgICAgIHVuaWNvZGUgPSBSb3BlQnl0ZVN0cmluZy5jb25jYXRlbmF0ZSh1bmljb2RlLCBzb3VyY2VCeXRlU3RyaW5nKTsKLSAgICB9Ci0gICAgU3RyaW5nIHRlc3RTdHJpbmcgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0KLSAgICAvLyBEbyB0aGUgc3Vic3RyaW5nIHBhcnQKLSAgICB0ZXN0U3RyaW5nID0gdGVzdFN0cmluZy5zdWJzdHJpbmcoMiwgdGVzdFN0cmluZy5sZW5ndGgoKSAtIDYpOwotICAgIHVuaWNvZGUgPSB1bmljb2RlLnN1YnN0cmluZygyLCB1bmljb2RlLnNpemUoKSAtIDYpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBmcm9tIHN0cmluZyBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHR5cGUiLAotICAgICAgICBjbGFzc1VuZGVyVGVzdCwgZ2V0QWN0dWFsQ2xhc3NOYW1lKHVuaWNvZGUpKTsKLSAgICBTdHJpbmcgcm91bmRUcmlwU3RyaW5nID0gdW5pY29kZS50b1N0cmluZyhJbnRlcm5hbC5VVEZfOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiB1bmljb2RlIGJ5dGVzIG11c3QgbWF0Y2giLAotICAgICAgICB0ZXN0U3RyaW5nLCByb3VuZFRyaXBTdHJpbmcpOwotICAgIEJ5dGVTdHJpbmcgZmxhdFN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHRlc3RTdHJpbmcpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgc3RyaW5nIG11c3QgZXF1YWwgdGhlIGZsYXQgc3RyaW5nIiwgZmxhdFN0cmluZywgdW5pY29kZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBzdHJpbmcgbXVzdCBtdXN0IGhhdmUgc2FtZSBoYXNoQ29kZSBhcyB0aGUgZmxhdCBzdHJpbmciLAotICAgICAgICBmbGF0U3RyaW5nLmhhc2hDb2RlKCksIHVuaWNvZGUuaGFzaENvZGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JvcGVCeXRlU3RyaW5nVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZWMzYTQwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUm9wZUJ5dGVTdHJpbmdUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdElucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIHRlc3RzIHtAbGluayBSb3BlQnl0ZVN0cmluZ30gYnkgaW5oZXJpdGluZyB0aGUgdGVzdHMgZnJvbQotICoge0BsaW5rIExpdGVyYWxCeXRlU3RyaW5nVGVzdH0uICBPbmx5IGEgY291cGxlIG9mIG1ldGhvZHMgYXJlIG92ZXJyaWRkZW4uCi0gKgotICogPHA+QSBmdWxsIHRlc3Qgb2YgdGhlIHJlc3VsdCBvZiB7QGxpbmsgUm9wZUJ5dGVTdHJpbmcjc3Vic3RyaW5nKGludCwgaW50KX0gaXMgZm91bmQgaW4gdGhlCi0gKiBzZXBhcmF0ZSBjbGFzcyB7QGxpbmsgUm9wZUJ5dGVTdHJpbmdTdWJzdHJpbmdUZXN0fS4KLSAqCi0gKiBAYXV0aG9yIGNhcmxhbnRvbkBnb29nbGUuY29tIChDYXJsIEhhdmVybCkKLSAqLwotcHVibGljIGNsYXNzIFJvcGVCeXRlU3RyaW5nVGVzdCBleHRlbmRzIExpdGVyYWxCeXRlU3RyaW5nVGVzdCB7Ci0KLSAgQE92ZXJyaWRlCi0gIHByb3RlY3RlZCB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgY2xhc3NVbmRlclRlc3QgPSAiUm9wZUJ5dGVTdHJpbmciOwotICAgIHJlZmVyZW5jZUJ5dGVzID0gQnl0ZVN0cmluZ1Rlc3QuZ2V0VGVzdEJ5dGVzKDIyMzQxLCAyMjMzNzc2NkwpOwotICAgIEl0ZXJhdG9yPEJ5dGVTdHJpbmc+IGl0ZXIgPSBCeXRlU3RyaW5nVGVzdC5tYWtlQ29uY3JldGVQaWVjZXMocmVmZXJlbmNlQnl0ZXMpLml0ZXJhdG9yKCk7Ci0gICAgc3RyaW5nVW5kZXJUZXN0ID0gaXRlci5uZXh0KCk7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBzdHJpbmdVbmRlclRlc3QgPSBzdHJpbmdVbmRlclRlc3QuY29uY2F0KGl0ZXIubmV4dCgpKTsKLSAgICB9Ci0gICAgZXhwZWN0ZWRIYXNoQ29kZSA9IC0xMjE0MTk3MjM4OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRUcmVlRGVwdGgoKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHRyZWUgZGVwdGgiLAotICAgICAgICA0LCBzdHJpbmdVbmRlclRlc3QuZ2V0VHJlZURlcHRoKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJhbGFuY2UoKSB7Ci0gICAgaW50IG51bWJlck9mUGllY2VzID0gMTAwMDA7Ci0gICAgaW50IHBpZWNlU2l6ZSA9IDY0OwotICAgIGJ5dGVbXSB0ZXN0Qnl0ZXMgPSBCeXRlU3RyaW5nVGVzdC5nZXRUZXN0Qnl0ZXMobnVtYmVyT2ZQaWVjZXMgKiBwaWVjZVNpemUsIDExMzM3N0wpOwotCi0gICAgLy8gQnVpbGQgdXAgYSBiaWcgQnl0ZVN0cmluZyBmcm9tIHNtYWxsZXIgcGllY2VzIHRvIGZvcmNlIGEgcmViYWxhbmNlCi0gICAgQnl0ZVN0cmluZyBjb25jYXRlbmF0ZWQgPSBCeXRlU3RyaW5nLkVNUFRZOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtYmVyT2ZQaWVjZXM7ICsraSkgewotICAgICAgY29uY2F0ZW5hdGVkID0gY29uY2F0ZW5hdGVkLmNvbmNhdChCeXRlU3RyaW5nLmNvcHlGcm9tKHRlc3RCeXRlcywgaSAqIHBpZWNlU2l6ZSwgcGllY2VTaXplKSk7Ci0gICAgfQotCi0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBmcm9tIHN0cmluZyBtdXN0IGhhdmUgdGhlIGV4cGVjdGVkIHR5cGUiLAotICAgICAgICBjbGFzc1VuZGVyVGVzdCwgZ2V0QWN0dWFsQ2xhc3NOYW1lKGNvbmNhdGVuYXRlZCkpOwotICAgIGFzc2VydFRydWUoY2xhc3NVbmRlclRlc3QgKyAiIHVuZGVybHlpbmcgYnl0ZXMgbXVzdCBtYXRjaCBhZnRlciBiYWxhbmNpbmciLAotICAgICAgICBBcnJheXMuZXF1YWxzKHRlc3RCeXRlcywgY29uY2F0ZW5hdGVkLnRvQnl0ZUFycmF5KCkpKTsKLSAgICBCeXRlU3RyaW5nIHRlc3RTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHRlc3RCeXRlcyk7Ci0gICAgYXNzZXJ0VHJ1ZShjbGFzc1VuZGVyVGVzdCArICIgYmFsYW5jZWQgc3RyaW5nIG11c3QgZXF1YWwgZmxhdCBzdHJpbmciLAotICAgICAgICBjb25jYXRlbmF0ZWQuZXF1YWxzKHRlc3RTdHJpbmcpKTsKLSAgICBhc3NlcnRUcnVlKGNsYXNzVW5kZXJUZXN0ICsgIiBmbGF0IHN0cmluZyBtdXN0IGVxdWFsIGJhbGFuY2VkIHN0cmluZyIsCi0gICAgICAgIHRlc3RTdHJpbmcuZXF1YWxzKGNvbmNhdGVuYXRlZCkpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgYmFsYW5jZWQgc3RyaW5nIG11c3QgaGF2ZSBzYW1lIGhhc2ggY29kZSBhcyBmbGF0IHN0cmluZyIsCi0gICAgICAgIHRlc3RTdHJpbmcuaGFzaENvZGUoKSwgY29uY2F0ZW5hdGVkLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZygpIHRocm93cyBVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgc291cmNlU3RyaW5nID0gIkkgbG92ZSB1bmljb2RlIFx1MTIzNFx1NTY3OCBjaGFyYWN0ZXJzIjsKLSAgICBCeXRlU3RyaW5nIHNvdXJjZUJ5dGVTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChzb3VyY2VTdHJpbmcpOwotICAgIGludCBjb3BpZXMgPSAyNTA7Ci0KLSAgICAvLyBCeSBidWlsZGluZyB0aGUgUm9wZUJ5dGVTdHJpbmcgYnkgY29uY2F0ZW5hdGluZywgdGhpcyBpcyBhY3R1YWxseSBhIGZhaXJseSBzdHJlbnVvdXMgdGVzdC4KLSAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcihjb3BpZXMgKiBzb3VyY2VTdHJpbmcubGVuZ3RoKCkpOwotICAgIEJ5dGVTdHJpbmcgdW5pY29kZSA9IEJ5dGVTdHJpbmcuRU1QVFk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3BpZXM7ICsraSkgewotICAgICAgYnVpbGRlci5hcHBlbmQoc291cmNlU3RyaW5nKTsKLSAgICAgIHVuaWNvZGUgPSBSb3BlQnl0ZVN0cmluZy5jb25jYXRlbmF0ZSh1bmljb2RlLCBzb3VyY2VCeXRlU3RyaW5nKTsKLSAgICB9Ci0gICAgU3RyaW5nIHRlc3RTdHJpbmcgPSBidWlsZGVyLnRvU3RyaW5nKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIGZyb20gc3RyaW5nIG11c3QgaGF2ZSB0aGUgZXhwZWN0ZWQgdHlwZSIsCi0gICAgICAgIGNsYXNzVW5kZXJUZXN0LCBnZXRBY3R1YWxDbGFzc05hbWUodW5pY29kZSkpOwotICAgIFN0cmluZyByb3VuZFRyaXBTdHJpbmcgPSB1bmljb2RlLnRvU3RyaW5nKFVURl84KTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHVuaWNvZGUgYnl0ZXMgbXVzdCBtYXRjaCIsCi0gICAgICAgIHRlc3RTdHJpbmcsIHJvdW5kVHJpcFN0cmluZyk7Ci0gICAgQnl0ZVN0cmluZyBmbGF0U3RyaW5nID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgodGVzdFN0cmluZyk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsYXNzVW5kZXJUZXN0ICsgIiBzdHJpbmcgbXVzdCBlcXVhbCB0aGUgZmxhdCBzdHJpbmciLCBmbGF0U3RyaW5nLCB1bmljb2RlKTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHN0cmluZyBtdXN0IG11c3QgaGF2ZSBzYW1lIGhhc2hDb2RlIGFzIHRoZSBmbGF0IHN0cmluZyIsCi0gICAgICAgIGZsYXRTdHJpbmcuaGFzaENvZGUoKSwgdW5pY29kZS5oYXNoQ29kZSgpKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB0ZXN0Q2hhcnNldFRvU3RyaW5nKCkgewotICAgIFN0cmluZyBzb3VyY2VTdHJpbmcgPSAiSSBsb3ZlIHVuaWNvZGUgXHUxMjM0XHU1Njc4IGNoYXJhY3RlcnMiOwotICAgIEJ5dGVTdHJpbmcgc291cmNlQnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHNvdXJjZVN0cmluZyk7Ci0gICAgaW50IGNvcGllcyA9IDI1MDsKLQotICAgIC8vIEJ5IGJ1aWxkaW5nIHRoZSBSb3BlQnl0ZVN0cmluZyBieSBjb25jYXRlbmF0aW5nLCB0aGlzIGlzIGFjdHVhbGx5IGEgZmFpcmx5IHN0cmVudW91cyB0ZXN0LgotICAgIFN0cmluZ0J1aWxkZXIgYnVpbGRlciA9IG5ldyBTdHJpbmdCdWlsZGVyKGNvcGllcyAqIHNvdXJjZVN0cmluZy5sZW5ndGgoKSk7Ci0gICAgQnl0ZVN0cmluZyB1bmljb2RlID0gQnl0ZVN0cmluZy5FTVBUWTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGNvcGllczsgKytpKSB7Ci0gICAgICBidWlsZGVyLmFwcGVuZChzb3VyY2VTdHJpbmcpOwotICAgICAgdW5pY29kZSA9IFJvcGVCeXRlU3RyaW5nLmNvbmNhdGVuYXRlKHVuaWNvZGUsIHNvdXJjZUJ5dGVTdHJpbmcpOwotICAgIH0KLSAgICBTdHJpbmcgdGVzdFN0cmluZyA9IGJ1aWxkZXIudG9TdHJpbmcoKTsKLQotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgZnJvbSBzdHJpbmcgbXVzdCBoYXZlIHRoZSBleHBlY3RlZCB0eXBlIiwKLSAgICAgICAgY2xhc3NVbmRlclRlc3QsIGdldEFjdHVhbENsYXNzTmFtZSh1bmljb2RlKSk7Ci0gICAgU3RyaW5nIHJvdW5kVHJpcFN0cmluZyA9IHVuaWNvZGUudG9TdHJpbmcoSW50ZXJuYWwuVVRGXzgpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgdW5pY29kZSBieXRlcyBtdXN0IG1hdGNoIiwKLSAgICAgICAgdGVzdFN0cmluZywgcm91bmRUcmlwU3RyaW5nKTsKLSAgICBCeXRlU3RyaW5nIGZsYXRTdHJpbmcgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCh0ZXN0U3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoY2xhc3NVbmRlclRlc3QgKyAiIHN0cmluZyBtdXN0IGVxdWFsIHRoZSBmbGF0IHN0cmluZyIsIGZsYXRTdHJpbmcsIHVuaWNvZGUpOwotICAgIGFzc2VydEVxdWFscyhjbGFzc1VuZGVyVGVzdCArICIgc3RyaW5nIG11c3QgbXVzdCBoYXZlIHNhbWUgaGFzaENvZGUgYXMgdGhlIGZsYXQgc3RyaW5nIiwKLSAgICAgICAgZmxhdFN0cmluZy5oYXNoQ29kZSgpLCB1bmljb2RlLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ19yZXR1cm5zQ2Fub25pY2FsRW1wdHlTdHJpbmcoKSB7Ci0gICAgUm9wZUJ5dGVTdHJpbmcgcm9wZUJ5dGVTdHJpbmcgPQotICAgICAgICBSb3BlQnl0ZVN0cmluZy5uZXdJbnN0YW5jZUZvclRlc3QoQnl0ZVN0cmluZy5FTVBUWSwgQnl0ZVN0cmluZy5FTVBUWSk7Ci0gICAgYXNzZXJ0U2FtZShjbGFzc1VuZGVyVGVzdCArICIgbXVzdCBiZSB0aGUgc2FtZSBzdHJpbmcgcmVmZXJlbmNlcyIsCi0gICAgICAgIEJ5dGVTdHJpbmcuRU1QVFkudG9TdHJpbmcoSW50ZXJuYWwuVVRGXzgpLCByb3BlQnl0ZVN0cmluZy50b1N0cmluZyhJbnRlcm5hbC5VVEZfOCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHRlc3RUb1N0cmluZ19yYWlzZXNFeGNlcHRpb24oKSB7Ci0gICAgdHJ5IHsKLSAgICAgIEJ5dGVTdHJpbmcgYnl0ZVN0cmluZyA9Ci0gICAgICAgICAgUm9wZUJ5dGVTdHJpbmcubmV3SW5zdGFuY2VGb3JUZXN0KEJ5dGVTdHJpbmcuRU1QVFksIEJ5dGVTdHJpbmcuRU1QVFkpOwotICAgICAgYnl0ZVN0cmluZy50b1N0cmluZygiaW52YWxpZCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBUaGlzIGlzIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgQnl0ZVN0cmluZyBieXRlU3RyaW5nID0gUm9wZUJ5dGVTdHJpbmcuY29uY2F0ZW5hdGUoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImZvbyIpLAotICAgICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJiYXIiKSk7Ci0gICAgICBieXRlU3RyaW5nLnRvU3RyaW5nKCJpbnZhbGlkIik7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIC8vIFRoaXMgaXMgc3VjY2VzcwotICAgIH0KLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCB0ZXN0SmF2YVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIE9iamVjdE91dHB1dFN0cmVhbSBvb3MgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKG91dCk7Ci0gICAgb29zLndyaXRlT2JqZWN0KHN0cmluZ1VuZGVyVGVzdCk7Ci0gICAgb29zLmNsb3NlKCk7Ci0gICAgYnl0ZVtdIHBpY2tsZWQgPSBvdXQudG9CeXRlQXJyYXkoKTsKLSAgICBJbnB1dFN0cmVhbSBpbiA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShwaWNrbGVkKTsKLSAgICBPYmplY3RJbnB1dFN0cmVhbSBvaXMgPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oaW4pOwotICAgIE9iamVjdCBvID0gb2lzLnJlYWRPYmplY3QoKTsKLSAgICBhc3NlcnRUcnVlKCJEaWRuJ3QgZ2V0IGEgQnl0ZVN0cmluZyBiYWNrIiwgbyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpOwotICAgIGFzc2VydEVxdWFscygiU2hvdWxkIGdldCBhbiBlcXVhbCBCeXRlU3RyaW5nIGJhY2siLCBzdHJpbmdVbmRlclRlc3QsIG8pOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5MDI3MzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvcjsKLWltcG9ydCBnb29nbGUucHJvdG9idWYubm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0LlVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTWVzc2FnZVdpdGhOb091dGVyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlNlcnZpY2VXaXRoTm9PdXRlcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkJhclJlcXVlc3Q7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5CYXJSZXNwb25zZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvb1JlcXVlc3Q7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb29SZXNwb25zZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTZXJ2aWNlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lYXN5bW9jay5JQXJndW1lbnRNYXRjaGVyOwotaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5JTW9ja3NDb250cm9sOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotLyoqCi0gKiBUZXN0cyBzZXJ2aWNlcyBhbmQgc3R1YnMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIElNb2Nrc0NvbnRyb2wgY29udHJvbDsKLSAgcHJpdmF0ZSBScGNDb250cm9sbGVyIG1vY2tDb250cm9sbGVyOwotCi0gIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBmb29EZXNjcmlwdG9yID0KLSAgICBUZXN0U2VydmljZS5nZXREZXNjcmlwdG9yKCkuZ2V0TWV0aG9kcygpLmdldCgwKTsKLSAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIGJhckRlc2NyaXB0b3IgPQotICAgIFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKS5nZXRNZXRob2RzKCkuZ2V0KDEpOwotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgY29udHJvbCA9IEVhc3lNb2NrLmNyZWF0ZVN0cmljdENvbnRyb2woKTsKLSAgICBtb2NrQ29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIFRlc3RzIFNlcnZpY2UuY2FsbE1ldGhvZCgpLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZvb1JlcXVlc3QgZm9vUmVxdWVzdCA9IEZvb1JlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgQmFyUmVxdWVzdCBiYXJSZXF1ZXN0ID0gQmFyUmVxdWVzdC5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKLSAgICBNb2NrQ2FsbGJhY2s8TWVzc2FnZT4gZm9vQ2FsbGJhY2sgPSBuZXcgTW9ja0NhbGxiYWNrPE1lc3NhZ2U+KCk7Ci0gICAgTW9ja0NhbGxiYWNrPE1lc3NhZ2U+IGJhckNhbGxiYWNrID0gbmV3IE1vY2tDYWxsYmFjazxNZXNzYWdlPigpOwotICAgIFRlc3RTZXJ2aWNlIG1vY2tTZXJ2aWNlID0gY29udHJvbC5jcmVhdGVNb2NrKFRlc3RTZXJ2aWNlLmNsYXNzKTsKLQotICAgIG1vY2tTZXJ2aWNlLmZvbyhFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy48Rm9vUmVzcG9uc2U+d3JhcHNDYWxsYmFjayhmb29DYWxsYmFjaykpOwotICAgIG1vY2tTZXJ2aWNlLmJhcihFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShiYXJSZXF1ZXN0KSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy48QmFyUmVzcG9uc2U+d3JhcHNDYWxsYmFjayhiYXJDYWxsYmFjaykpOwotICAgIGNvbnRyb2wucmVwbGF5KCk7Ci0KLSAgICBtb2NrU2VydmljZS5jYWxsTWV0aG9kKGZvb0Rlc2NyaXB0b3IsIG1vY2tDb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vUmVxdWVzdCwgZm9vQ2FsbGJhY2spOwotICAgIG1vY2tTZXJ2aWNlLmNhbGxNZXRob2QoYmFyRGVzY3JpcHRvciwgbW9ja0NvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJSZXF1ZXN0LCBiYXJDYWxsYmFjayk7Ci0gICAgY29udHJvbC52ZXJpZnkoKTsKLSAgfQotCi0gIC8qKiBUZXN0cyBTZXJ2aWNlLmdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvdG90eXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFNlcnZpY2UgbW9ja1NlcnZpY2UgPSBjb250cm9sLmNyZWF0ZU1vY2soVGVzdFNlcnZpY2UuY2xhc3MpOwotCi0gICAgYXNzZXJ0U2FtZShtb2NrU2VydmljZS5nZXRSZXF1ZXN0UHJvdG90eXBlKGZvb0Rlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgRm9vUmVxdWVzdC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0U2FtZShtb2NrU2VydmljZS5nZXRSZXNwb25zZVByb3RvdHlwZShmb29EZXNjcmlwdG9yKSwKLSAgICAgICAgICAgICAgIEZvb1Jlc3BvbnNlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlcXVlc3RQcm90b3R5cGUoYmFyRGVzY3JpcHRvciksCi0gICAgICAgICAgICAgICBCYXJSZXF1ZXN0LmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlc3BvbnNlUHJvdG90eXBlKGJhckRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgQmFyUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICB9Ci0KLSAgLyoqIFRlc3RzIGdlbmVyYXRlZCBzdHVicy4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFN0dWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGb29SZXF1ZXN0IGZvb1JlcXVlc3QgPSBGb29SZXF1ZXN0Lm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgIEJhclJlcXVlc3QgYmFyUmVxdWVzdCA9IEJhclJlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgTW9ja0NhbGxiYWNrPEZvb1Jlc3BvbnNlPiBmb29DYWxsYmFjayA9IG5ldyBNb2NrQ2FsbGJhY2s8Rm9vUmVzcG9uc2U+KCk7Ci0gICAgTW9ja0NhbGxiYWNrPEJhclJlc3BvbnNlPiBiYXJDYWxsYmFjayA9IG5ldyBNb2NrQ2FsbGJhY2s8QmFyUmVzcG9uc2U+KCk7Ci0gICAgUnBjQ2hhbm5lbCBtb2NrQ2hhbm5lbCA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDaGFubmVsLmNsYXNzKTsKLSAgICBUZXN0U2VydmljZSBzdHViID0gVGVzdFNlcnZpY2UubmV3U3R1Yihtb2NrQ2hhbm5lbCk7Ci0KLSAgICBtb2NrQ2hhbm5lbC5jYWxsTWV0aG9kKAotICAgICAgRWFzeU1vY2suc2FtZShmb29EZXNjcmlwdG9yKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAotICAgICAgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoRm9vUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAotICAgICAgdGhpcy48TWVzc2FnZT53cmFwc0NhbGxiYWNrKGZvb0NhbGxiYWNrKSk7Ci0gICAgbW9ja0NoYW5uZWwuY2FsbE1ldGhvZCgKLSAgICAgIEVhc3lNb2NrLnNhbWUoYmFyRGVzY3JpcHRvciksCi0gICAgICBFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoYmFyUmVxdWVzdCksCi0gICAgICBFYXN5TW9jay5zYW1lKEJhclJlc3BvbnNlLmdldERlZmF1bHRJbnN0YW5jZSgpKSwKLSAgICAgIHRoaXMuPE1lc3NhZ2U+d3JhcHNDYWxsYmFjayhiYXJDYWxsYmFjaykpOwotICAgIGNvbnRyb2wucmVwbGF5KCk7Ci0KLSAgICBzdHViLmZvbyhtb2NrQ29udHJvbGxlciwgZm9vUmVxdWVzdCwgZm9vQ2FsbGJhY2spOwotICAgIHN0dWIuYmFyKG1vY2tDb250cm9sbGVyLCBiYXJSZXF1ZXN0LCBiYXJDYWxsYmFjayk7Ci0gICAgY29udHJvbC52ZXJpZnkoKTsKLSAgfQotCi0gIC8qKiBUZXN0cyBnZW5lcmF0ZWQgYmxvY2tpbmcgc3R1YnMuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1N0dWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGb29SZXF1ZXN0IGZvb1JlcXVlc3QgPSBGb29SZXF1ZXN0Lm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgIEJhclJlcXVlc3QgYmFyUmVxdWVzdCA9IEJhclJlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgQmxvY2tpbmdScGNDaGFubmVsIG1vY2tDaGFubmVsID0KLSAgICAgICAgY29udHJvbC5jcmVhdGVNb2NrKEJsb2NraW5nUnBjQ2hhbm5lbC5jbGFzcyk7Ci0gICAgVGVzdFNlcnZpY2UuQmxvY2tpbmdJbnRlcmZhY2Ugc3R1YiA9Ci0gICAgICAgIFRlc3RTZXJ2aWNlLm5ld0Jsb2NraW5nU3R1Yihtb2NrQ2hhbm5lbCk7Ci0KLSAgICBGb29SZXNwb25zZSBmb29SZXNwb25zZSA9IEZvb1Jlc3BvbnNlLm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgIEJhclJlc3BvbnNlIGJhclJlc3BvbnNlID0gQmFyUmVzcG9uc2UubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0KLSAgICBFYXN5TW9jay5leHBlY3QobW9ja0NoYW5uZWwuY2FsbEJsb2NraW5nTWV0aG9kKAotICAgICAgRWFzeU1vY2suc2FtZShmb29EZXNjcmlwdG9yKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAotICAgICAgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoRm9vUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKSkuYW5kUmV0dXJuKGZvb1Jlc3BvbnNlKTsKLSAgICBFYXN5TW9jay5leHBlY3QobW9ja0NoYW5uZWwuY2FsbEJsb2NraW5nTWV0aG9kKAotICAgICAgRWFzeU1vY2suc2FtZShiYXJEZXNjcmlwdG9yKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAotICAgICAgRWFzeU1vY2suc2FtZShiYXJSZXF1ZXN0KSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoQmFyUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKSkuYW5kUmV0dXJuKGJhclJlc3BvbnNlKTsKLSAgICBjb250cm9sLnJlcGxheSgpOwotCi0gICAgYXNzZXJ0U2FtZShmb29SZXNwb25zZSwgc3R1Yi5mb28obW9ja0NvbnRyb2xsZXIsIGZvb1JlcXVlc3QpKTsKLSAgICBhc3NlcnRTYW1lKGJhclJlc3BvbnNlLCBzdHViLmJhcihtb2NrQ29udHJvbGxlciwgYmFyUmVxdWVzdCkpOwotICAgIGNvbnRyb2wudmVyaWZ5KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVmbGVjdGl2ZVNlcnZpY2UoKSB7Ci0gICAgU2VydmljZVdpdGhOb091dGVyLkludGVyZmFjZSBpbXBsID0KLSAgICAgICAgY29udHJvbC5jcmVhdGVNb2NrKFNlcnZpY2VXaXRoTm9PdXRlci5JbnRlcmZhY2UuY2xhc3MpOwotICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlV2l0aE5vT3V0ZXIubmV3UmVmbGVjdGl2ZVNlcnZpY2UoaW1wbCk7Ci0KLSAgICBNZXRob2REZXNjcmlwdG9yIGZvb01ldGhvZCA9Ci0gICAgICAgIFNlcnZpY2VXaXRoTm9PdXRlci5nZXREZXNjcmlwdG9yKCkuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7Ci0gICAgTWVzc2FnZVdpdGhOb091dGVyIHJlcXVlc3QgPSBNZXNzYWdlV2l0aE5vT3V0ZXIuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gY2FsbGJhY2sgPQotICAgICAgICBuZXcgUnBjQ2FsbGJhY2s8TWVzc2FnZT4oKSB7Ci0gICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgcHVibGljIHZvaWQgcnVuKE1lc3NhZ2UgcGFyYW1ldGVyKSB7Ci0gICAgICAgICAgICAvLyBObyByZWFzb24gdGhpcyBzaG91bGQgYmUgcnVuLgotICAgICAgICAgICAgZmFpbCgpOwotICAgICAgICAgIH0KLSAgICAgICAgfTsKLSAgICBScGNDYWxsYmFjazxUZXN0QWxsVHlwZXM+IHNwZWNpYWxpemVkQ2FsbGJhY2sgPQotICAgICAgICBScGNVdGlsLnNwZWNpYWxpemVDYWxsYmFjayhjYWxsYmFjayk7Ci0KLSAgICBpbXBsLmZvbyhFYXN5TW9jay5zYW1lKGNvbnRyb2xsZXIpLCBFYXN5TW9jay5zYW1lKHJlcXVlc3QpLAotICAgICAgICBFYXN5TW9jay5zYW1lKHNwZWNpYWxpemVkQ2FsbGJhY2spKTsKLSAgICBFYXN5TW9jay5leHBlY3RMYXN0Q2FsbCgpOwotCi0gICAgY29udHJvbC5yZXBsYXkoKTsKLQotICAgIHNlcnZpY2UuY2FsbE1ldGhvZChmb29NZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKTsKLQotICAgIGNvbnRyb2wudmVyaWZ5KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZSgpIHRocm93cyBTZXJ2aWNlRXhjZXB0aW9uIHsKLSAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuQmxvY2tpbmdJbnRlcmZhY2UgaW1wbCA9Ci0gICAgICAgIGNvbnRyb2wuY3JlYXRlTW9jayhTZXJ2aWNlV2l0aE5vT3V0ZXIuQmxvY2tpbmdJbnRlcmZhY2UuY2xhc3MpOwotICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKLSAgICBCbG9ja2luZ1NlcnZpY2Ugc2VydmljZSA9Ci0gICAgICAgIFNlcnZpY2VXaXRoTm9PdXRlci5uZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlKGltcGwpOwotCi0gICAgTWV0aG9kRGVzY3JpcHRvciBmb29NZXRob2QgPQotICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuZ2V0RGVzY3JpcHRvcigpLmZpbmRNZXRob2RCeU5hbWUoIkZvbyIpOwotICAgIE1lc3NhZ2VXaXRoTm9PdXRlciByZXF1ZXN0ID0gTWVzc2FnZVdpdGhOb091dGVyLmdldERlZmF1bHRJbnN0YW5jZSgpOwotCi0gICAgVGVzdEFsbFR5cGVzIGV4cGVjdGVkUmVzcG9uc2UgPSBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgRWFzeU1vY2suZXhwZWN0KGltcGwuZm9vKEVhc3lNb2NrLnNhbWUoY29udHJvbGxlciksIEVhc3lNb2NrLnNhbWUocmVxdWVzdCkpKQotICAgICAgICAuYW5kUmV0dXJuKGV4cGVjdGVkUmVzcG9uc2UpOwotCi0gICAgY29udHJvbC5yZXBsYXkoKTsKLQotICAgIE1lc3NhZ2UgcmVzcG9uc2UgPQotICAgICAgICBzZXJ2aWNlLmNhbGxCbG9ja2luZ01ldGhvZChmb29NZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFJlc3BvbnNlLCByZXNwb25zZSk7Ci0KLSAgICBjb250cm9sLnZlcmlmeSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5vR2VuZXJpY1NlcnZpY2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gTm9uLXNlcnZpY2VzIHNob3VsZCBiZSB1c2FibGUuCi0gICAgVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy5UZXN0TWVzc2FnZSBtZXNzYWdlID0KLSAgICAgIFVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMuVGVzdE1lc3NhZ2UubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRBKDEyMykKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLnRlc3RFeHRlbnNpb24sIDQ1NikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLlRlc3RFbnVtLkZPTy5nZXROdW1iZXIoKSk7Ci0KLSAgICAvLyBCdWlsZCBhIGxpc3Qgb2YgdGhlIGNsYXNzIG5hbWVzIG5lc3RlZCBpbiBVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLgotICAgIFN0cmluZyBvdXRlck5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLm5vX2dlbmVyaWNfc2VydmljZXNfdGVzdC4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgIlVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMiOwotICAgIENsYXNzPD8+IG91dGVyQ2xhc3MgPSBDbGFzcy5mb3JOYW1lKG91dGVyTmFtZSk7Ci0KLSAgICBTZXQ8U3RyaW5nPiBpbm5lckNsYXNzTmFtZXMgPSBuZXcgSGFzaFNldDxTdHJpbmc+KCk7Ci0gICAgZm9yIChDbGFzczw/PiBpbm5lckNsYXNzIDogb3V0ZXJDbGFzcy5nZXRDbGFzc2VzKCkpIHsKLSAgICAgIFN0cmluZyBmdWxsTmFtZSA9IGlubmVyQ2xhc3MuZ2V0TmFtZSgpOwotICAgICAgLy8gRmlndXJlIG91dCB0aGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgaW5uZXIgY2xhc3MuCi0gICAgICAvLyBOb3RlOiAgU3VycHJpc2luZ2x5LCB0aGUgZnVsbCBuYW1lIG9mIGFuIGlubmVyIGNsYXNzIHdpbGwgYmUgc2VwYXJhdGVkCi0gICAgICAvLyAgIGZyb20gdGhlIG91dGVyIGNsYXNzIG5hbWUgYnkgYSAnJCcgcmF0aGVyIHRoYW4gYSAnLicuICBUaGlzIGlzIG5vdAotICAgICAgLy8gICBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gZm9yIGphdmEubGFuZy5DbGFzcy4gIEkgZG9uJ3Qgd2FudCB0bwotICAgICAgLy8gICBtYWtlIGFzc3VtcHRpb25zLCBzbyBJJ20ganVzdCBnb2luZyB0byBhY2NlcHQgYW55IGNoYXJhY3RlciBhcyB0aGUKLSAgICAgIC8vICAgc2VwYXJhdG9yLgotICAgICAgYXNzZXJ0VHJ1ZShmdWxsTmFtZS5zdGFydHNXaXRoKG91dGVyTmFtZSkpOwotCi0gICAgICBpZiAoIVNlcnZpY2UuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbm5lckNsYXNzKSAmJgotICAgICAgICAgICFNZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW5uZXJDbGFzcykgJiYKLSAgICAgICAgICAhUHJvdG9jb2xNZXNzYWdlRW51bS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGlubmVyQ2xhc3MpKSB7Ci0gICAgICAgIC8vIElnbm9yZSBhbnkgY2xhc3NlcyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBiYXNlIGNvZGUgZ2VuZXJhdG9yLgotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLQotICAgICAgaW5uZXJDbGFzc05hbWVzLmFkZChmdWxsTmFtZS5zdWJzdHJpbmcob3V0ZXJOYW1lLmxlbmd0aCgpICsgMSkpOwotICAgIH0KLQotICAgIC8vIE5vIHNlcnZpY2UgY2xhc3Mgc2hvdWxkIGhhdmUgYmVlbiBnZW5lcmF0ZWQuCi0gICAgYXNzZXJ0VHJ1ZShpbm5lckNsYXNzTmFtZXMuY29udGFpbnMoIlRlc3RNZXNzYWdlIikpOwotICAgIGFzc2VydFRydWUoaW5uZXJDbGFzc05hbWVzLmNvbnRhaW5zKCJUZXN0RW51bSIpKTsKLSAgICBhc3NlcnRGYWxzZShpbm5lckNsYXNzTmFtZXMuY29udGFpbnMoIlRlc3RTZXJ2aWNlIikpOwotCi0gICAgLy8gQnV0IGRlc2NyaXB0b3JzIGFyZSB0aGVyZS4KLSAgICBGaWxlRGVzY3JpcHRvciBmaWxlID0gVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpbGUuZ2V0U2VydmljZXMoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiVGVzdFNlcnZpY2UiLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpbGUuZ2V0U2VydmljZXMoKS5nZXQoMCkuZ2V0TWV0aG9kcygpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJGb28iLAotICAgICAgICBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApLmdldE1ldGhvZHMoKS5nZXQoMCkuZ2V0TmFtZSgpKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqCi0gICAqIHdyYXBzQ2FsbGJhY2soKSBpcyBhbiBFYXN5TW9jayBhcmd1bWVudCBwcmVkaWNhdGUuICB3cmFwc0NhbGxiYWNrKGMpCi0gICAqIG1hdGNoZXMgYSBjYWxsYmFjayBpZiBjYWxsaW5nIHRoYXQgY2FsbGJhY2sgY2F1c2VzIGMgdG8gYmUgY2FsbGVkLgotICAgKiBJbiBvdGhlciB3b3JkcywgYyB3cmFwcyB0aGUgZ2l2ZW4gY2FsbGJhY2suCi0gICAqLwotICBwcml2YXRlIDxUeXBlIGV4dGVuZHMgTWVzc2FnZT4gUnBjQ2FsbGJhY2s8VHlwZT4gd3JhcHNDYWxsYmFjaygKLSAgICAgIE1vY2tDYWxsYmFjazw/PiBjYWxsYmFjaykgewotICAgIEVhc3lNb2NrLnJlcG9ydE1hdGNoZXIobmV3IFdyYXBzQ2FsbGJhY2soY2FsbGJhY2spKTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIC8qKiBUaGUgcGFyYW1ldGVyIHRvIHdyYXBzQ2FsbGJhY2soKSBtdXN0IGJlIGEgTW9ja0NhbGxiYWNrLiAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNb2NrQ2FsbGJhY2s8VHlwZSBleHRlbmRzIE1lc3NhZ2U+Ci0gICAgICBpbXBsZW1lbnRzIFJwY0NhbGxiYWNrPFR5cGU+IHsKLSAgICBwcml2YXRlIGJvb2xlYW4gY2FsbGVkID0gZmFsc2U7Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0NhbGxlZCgpIHsgcmV0dXJuIGNhbGxlZDsgfQotCi0gICAgcHVibGljIHZvaWQgcmVzZXQoKSB7IGNhbGxlZCA9IGZhbHNlOyB9Ci0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgcnVuKFR5cGUgbWVzc2FnZSkgewotICAgICAgY2FsbGVkID0gdHJ1ZTsgfQotICB9Ci0KLSAgLyoqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB3cmFwc0NhbGxiYWNrKCkgYXJndW1lbnQgbWF0Y2hlci4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHNDYWxsYmFjayBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgewotICAgIHByaXZhdGUgTW9ja0NhbGxiYWNrPD8+IGNhbGxiYWNrOwotCi0gICAgcHVibGljIFdyYXBzQ2FsbGJhY2soTW9ja0NhbGxiYWNrPD8+IGNhbGxiYWNrKSB7Ci0gICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgYWN0dWFsKSB7Ci0gICAgICBpZiAoIShhY3R1YWwgaW5zdGFuY2VvZiBScGNDYWxsYmFjaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUnBjQ2FsbGJhY2sgYWN0dWFsQ2FsbGJhY2sgPSAoUnBjQ2FsbGJhY2spYWN0dWFsOwotCi0gICAgICBjYWxsYmFjay5yZXNldCgpOwotICAgICAgYWN0dWFsQ2FsbGJhY2sucnVuKG51bGwpOwotICAgICAgcmV0dXJuIGNhbGxiYWNrLmlzQ2FsbGVkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotICAgICAgYnVmZmVyLmFwcGVuZCgid3JhcHNDYWxsYmFjayhtb2NrQ2FsbGJhY2spIik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlclRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGI4MDAwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlc09yQnVpbGRlcjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0uIFRoaXMgdGVzdHMgYmFzaWMgZnVuY3Rpb25hbGl0eS4KLSAqIE1vcmUgZXh0ZW5zaXZlIHRlc3RpbmcgaXMgcHJvdmlkZWQgdmlhIG90aGVyIHRlc3RzIHRoYXQgZXhlcmNpc2UgdGhlCi0gKiBidWlsZGVyLgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgY2xhc3MgU2luZ2xlRmllbGRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNVc2VBbmRJbnZhbGlkYXRpb25zKCkgewotICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKLSAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKLSAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0KLSAgICAgICAgbmV3IFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPigKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgIG1vY2tQYXJlbnQsCi0gICAgICAgICAgICBmYWxzZSk7Ci0gICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5idWlsZFBhcnRpYWwoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEwKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFRlc3QgdGhhdCB3ZSByZWNlaXZlIGludmFsaWRhdGlvbnMgbm93IHRoYXQgYnVpbGQgaGFzIGJlZW4gY2FsbGVkLgotICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMjApOwotICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gICAgLy8gVGVzdCB0aGF0IHdlIGRvbid0IGtlZXAgZ2V0dGluZyBpbnZhbGlkYXRpb25zIG9uIGV2ZXJ5IGNoYW5nZQotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMzApOwotICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2V0TWVzc2FnZSgpIHsKLSAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7Ci0gICAgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9Ci0gICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4oCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICBtb2NrUGFyZW50LAotICAgICAgICAgICAgZmFsc2UpOwotICAgIGJ1aWxkZXIuc2V0TWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0KLSAgICAvLyBVcGRhdGUgbWVzc2FnZSB1c2luZyB0aGUgYnVpbGRlcgotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgbWVzc2FnZSBzdGF5cyBjYWNoZWQKLSAgICBhc3NlcnRTYW1lKGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPQotICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICAgICAgbW9ja1BhcmVudCwKLSAgICAgICAgICAgIGZhbHNlKTsKLSAgICBidWlsZGVyLnNldE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDApLmJ1aWxkKCkpOwotICAgIGFzc2VydE5vdFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpOwotICAgIGFzc2VydE5vdFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7Ci0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2UoKSB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPQotICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICAgICAgbW9ja1BhcmVudCwKLSAgICAgICAgICAgIGZhbHNlKTsKLQotICAgIC8vIE1lcmdlIGludG8gZGVmYXVsdCBmaWVsZC4KLSAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBidWlsZGVyLmdldE1lc3NhZ2UoKSk7Ci0KLSAgICAvLyBNZXJnZSBpbnRvIG5vbi1kZWZhdWx0IGZpZWxkIG9uIGV4aXN0aW5nIGJ1aWxkZXIuCi0gICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigyKTsKLSAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbERvdWJsZSg0LjApCi0gICAgICAgIC5idWlsZFBhcnRpYWwoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQuMCwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxEb3VibGUoKSk7Ci0KLSAgICAvLyBNZXJnZSBpbnRvIG5vbi1kZWZhdWx0IGZpZWxkIG9uIGV4aXN0aW5nIG1lc3NhZ2UKLSAgICBidWlsZGVyLnNldE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxMCkKLSAgICAgICAgLmJ1aWxkUGFydGlhbCgpKTsKLSAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbERvdWJsZSg1LjApCi0gICAgICAgIC5idWlsZFBhcnRpYWwoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscyg1LjAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsRG91YmxlKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TbWFsbFNvcnRlZE1hcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTk2ZWNkNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDIzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZVNldDsKLQotLyoqCi0gKiBAYXV0aG9yIGRhcmlja0Bnb29nbGUuY29tIERhcmljayBUb25nCi0gKi8KLXB1YmxpYyBjbGFzcyBTbWFsbFNvcnRlZE1hcFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIC8vIGphdmEudXRpbC5BYnN0cmFjdE1hcC5TaW1wbGVFbnRyeSBpcyBwcml2YXRlIGluIEpESyAxLjUuIFdlIHJlLWltcGxlbWVudCBpdAotICAvLyBoZXJlIGZvciBKREsgMS41IHVzZXJzLgotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW1wbGVFbnRyeTxLLCBWPiBpbXBsZW1lbnRzIE1hcC5FbnRyeTxLLCBWPiB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBLIGtleTsKLSAgICBwcml2YXRlIFYgdmFsdWU7Ci0KLSAgICBTaW1wbGVFbnRyeShLIGtleSwgViB2YWx1ZSkgewotICAgICAgdGhpcy5rZXkgPSBrZXk7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEsgZ2V0S2V5KCkgewotICAgICAgcmV0dXJuIGtleTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgViBnZXRWYWx1ZSgpIHsKLSAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgViBzZXRWYWx1ZShWIHZhbHVlKSB7Ci0gICAgICBWIG9sZFZhbHVlID0gdGhpcy52YWx1ZTsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICAgIHJldHVybiBvbGRWYWx1ZTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGVxKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICByZXR1cm4gbzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgaWYgKCEobyBpbnN0YW5jZW9mIE1hcC5FbnRyeSkpCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIE1hcC5FbnRyeSBlID0gKE1hcC5FbnRyeSkgbzsKLSAgICAgIHJldHVybiBlcShrZXksIGUuZ2V0S2V5KCkpICYmIGVxKHZhbHVlLCBlLmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICByZXR1cm4gKChrZXkgPT0gbnVsbCkgPyAwIDoga2V5Lmhhc2hDb2RlKCkpIF4KLSAgICAgICAgICAoKHZhbHVlID09IG51bGwpID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQdXRBbmRHZXRBcnJheUVudHJpZXNPbmx5KCkgewotICAgIHJ1blB1dEFuZEdldFRlc3QoMyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHV0QW5kR2V0T3ZlcmZsb3dFbnRyaWVzKCkgewotICAgIHJ1blB1dEFuZEdldFRlc3QoNik7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgcnVuUHV0QW5kR2V0VGVzdChpbnQgbnVtRWxlbWVudHMpIHsKLSAgICAvLyBUZXN0IHdpdGggZXZlbiBhbmQgb2RkIGFycmF5U2l6ZQotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcDEgPQotICAgICAgICBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwMiA9Ci0gICAgICAgIFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCg0KTsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAzID0KLSAgICAgICAgU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcDQgPQotICAgICAgICBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoNCk7Ci0KLSAgICAvLyBUZXN0IHdpdGggcHV0cyBpbiBhc2NlbmRpbmcgb3JkZXIuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcDEucHV0KGksIGkgKyAxKSk7Ci0gICAgICBhc3NlcnROdWxsKG1hcDIucHV0KGksIGkgKyAxKSk7Ci0gICAgfQotICAgIC8vIFRlc3Qgd2l0aCBwdXRzIGluIGRlc2NlbmRpbmcgb3JkZXIuCi0gICAgZm9yIChpbnQgaSA9IG51bUVsZW1lbnRzIC0gMTsgaSA+PSAwOyBpLS0pIHsKLSAgICAgIGFzc2VydE51bGwobWFwMy5wdXQoaSwgaSArIDEpKTsKLSAgICAgIGFzc2VydE51bGwobWFwNC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0KLSAgICBhc3NlcnRFcXVhbHMoTWF0aC5taW4oMywgbnVtRWxlbWVudHMpLCBtYXAxLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoTWF0aC5taW4oNCwgbnVtRWxlbWVudHMpLCBtYXAyLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoTWF0aC5taW4oMywgbnVtRWxlbWVudHMpLCBtYXAzLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoTWF0aC5taW4oNCwgbnVtRWxlbWVudHMpLCBtYXA0LmdldE51bUFycmF5RW50cmllcygpKTsKLQotICAgIExpc3Q8U21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4+IGFsbE1hcHMgPQotICAgICAgICBuZXcgQXJyYXlMaXN0PFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+PigpOwotICAgIGFsbE1hcHMuYWRkKG1hcDEpOwotICAgIGFsbE1hcHMuYWRkKG1hcDIpOwotICAgIGFsbE1hcHMuYWRkKG1hcDMpOwotICAgIGFsbE1hcHMuYWRkKG1hcDQpOwotCi0gICAgZm9yIChTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgOiBhbGxNYXBzKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMobnVtRWxlbWVudHMsIG1hcC5zaXplKCkpOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1FbGVtZW50czsgaSsrKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMSksIG1hcC5nZXQoaSkpOwotICAgICAgfQotICAgIH0KLQotICAgIGFzc2VydEVxdWFscyhtYXAxLCBtYXAyKTsKLSAgICBhc3NlcnRFcXVhbHMobWFwMiwgbWFwMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1hcDMsIG1hcDQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlcGxhY2luZ1B1dCgpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgICAgYXNzZXJ0TnVsbChtYXAucmVtb3ZlKGkgKyAxKSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBtYXAucHV0KGksIGkgKyAyKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlbW92ZSgpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgICAgYXNzZXJ0TnVsbChtYXAucmVtb3ZlKGkgKyAxKSk7Ci0gICAgfQotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDYsICBtYXAuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobWFrZVNvcnRlZEtleVNldCgwLCAxLCAyLCAzLCA0LCA1KSwgbWFwLmtleVNldCgpKTsKLQotICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigyKSwgbWFwLnJlbW92ZSgxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDUsICBtYXAuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobWFrZVNvcnRlZEtleVNldCgwLCAyLCAzLCA0LCA1KSwgbWFwLmtleVNldCgpKTsKLQotICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig1KSwgbWFwLnJlbW92ZSg0KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsICBtYXAuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobWFrZVNvcnRlZEtleVNldCgwLCAyLCAzLCA1KSwgbWFwLmtleVNldCgpKTsKLQotICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcig0KSwgbWFwLnJlbW92ZSgzKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhtYWtlU29ydGVkS2V5U2V0KDAsIDIsIDUpLCBtYXAua2V5U2V0KCkpOwotCi0gICAgYXNzZXJ0TnVsbChtYXAucmVtb3ZlKDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbWFwLnNpemUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIG1hcC5yZW1vdmUoMCkpOwotICAgIGFzc2VydEVxdWFscygyLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygyLCBtYXAuc2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICBtYXAuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLnNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0QXJyYXlFbnRyeUFuZE92ZXJmbG93RW50cmllcygpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoMywgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDM7IGkrKykgewotICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0gbWFwLmdldEFycmF5RW50cnlBdChpKTsKLSAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpKSwgZW50cnkuZ2V0S2V5KCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gaXQgPQotICAgICAgICBtYXAuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkuaXRlcmF0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMzsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0VHJ1ZShpdC5oYXNOZXh0KCkpOwotICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkpLCBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RmFsc2UoaXQuaGFzTmV4dCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldENvbnRhaW5zKCkgewotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7Ci0gICAgfQotICAgIFNldDxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGVudHJ5U2V0ID0gbWFwLmVudHJ5U2V0KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydFRydWUoCi0gICAgICAgICAgZW50cnlTZXQuY29udGFpbnMobmV3IFNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+KGksIGkgKyAxKSkpOwotICAgICAgYXNzZXJ0RmFsc2UoCi0gICAgICAgICAgZW50cnlTZXQuY29udGFpbnMobmV3IFNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+KGksIGkpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0QWRkKCkgewotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKLSAgICBTZXQ8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBlbnRyeVNldCA9IG1hcC5lbnRyeVNldCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPQotICAgICAgICAgIG5ldyBTaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPihpLCBpICsgMSk7Ci0gICAgICBhc3NlcnRUcnVlKGVudHJ5U2V0LmFkZChlbnRyeSkpOwotICAgICAgYXNzZXJ0RmFsc2UoZW50cnlTZXQuYWRkKGVudHJ5KSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBtYXAuZ2V0KGkpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDYsIG1hcC5zaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0UmVtb3ZlKCkgewotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKLSAgICBTZXQ8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBlbnRyeVNldCA9IG1hcC5lbnRyeVNldCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9Ci0gICAgICAgICAgbmV3IFNpbXBsZUVudHJ5PEludGVnZXIsIEludGVnZXI+KGksIGkgKyAxKTsKLSAgICAgIGFzc2VydFRydWUoZW50cnlTZXQucmVtb3ZlKGVudHJ5KSk7Ci0gICAgICBhc3NlcnRGYWxzZShlbnRyeVNldC5yZW1vdmUoZW50cnkpKTsKLSAgICB9Ci0gICAgYXNzZXJ0VHJ1ZShtYXAuaXNFbXB0eSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLnNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXRDbGVhcigpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICBtYXAuZW50cnlTZXQoKS5jbGVhcigpOwotICAgIGFzc2VydFRydWUobWFwLmlzRW1wdHkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0SXRlcmF0b3JOZXh0KCkgewotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7Ci0gICAgfQotICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnRUcnVlKGl0Lmhhc05leHQoKSk7Ci0gICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPSBpdC5uZXh0KCk7Ci0gICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSksIGVudHJ5LmdldEtleSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMSksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICBhc3NlcnRGYWxzZShpdC5oYXNOZXh0KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0SXRlcmF0b3JSZW1vdmUoKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0gICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydFRydWUobWFwLmNvbnRhaW5zS2V5KGkpKTsKLSAgICAgIGl0Lm5leHQoKTsKLSAgICAgIGl0LnJlbW92ZSgpOwotICAgICAgYXNzZXJ0RmFsc2UobWFwLmNvbnRhaW5zS2V5KGkpKTsKLSAgICAgIGFzc2VydEVxdWFscyg2IC0gaSAtIDEsIG1hcC5zaXplKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNYXBFbnRyeU1vZGlmaWNhdGlvbigpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICBJdGVyYXRvcjxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOwotICAgICAgZW50cnkuc2V0VmFsdWUoaSArIDIzKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMjMpLCBtYXAuZ2V0KGkpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWFrZUltbXV0YWJsZSgpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICBtYXAubWFrZUltbXV0YWJsZSgpOwotICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcigxKSwgbWFwLmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDYsIG1hcC5zaXplKCkpOwotCi0gICAgdHJ5IHsKLSAgICAgIG1hcC5wdXQoMjMsIDIzKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICB9Ci0KLSAgICBNYXA8SW50ZWdlciwgSW50ZWdlcj4gb3RoZXIgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgIG90aGVyLnB1dCgyMywgMjMpOwotICAgIHRyeSB7Ci0gICAgICBtYXAucHV0QWxsKG90aGVyKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbWFwLnJlbW92ZSgwKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgbWFwLmNsZWFyKCk7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgfQotCi0gICAgU2V0PE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gZW50cnlTZXQgPSBtYXAuZW50cnlTZXQoKTsKLSAgICB0cnkgewotICAgICAgZW50cnlTZXQuY2xlYXIoKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICB9Ci0KLSAgICBJdGVyYXRvcjxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGl0ID0gZW50cnlTZXQuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoaXQuaGFzTmV4dCgpKSB7Ci0gICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPSBpdC5uZXh0KCk7Ci0gICAgICB0cnkgewotICAgICAgICBlbnRyeS5zZXRWYWx1ZSgwKTsKLSAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBpdC5yZW1vdmUoKTsKLSAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgU2V0PEludGVnZXI+IGtleVNldCA9IG1hcC5rZXlTZXQoKTsKLSAgICB0cnkgewotICAgICAga2V5U2V0LmNsZWFyKCk7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgfQotCi0gICAgSXRlcmF0b3I8SW50ZWdlcj4ga2V5cyA9IGtleVNldC5pdGVyYXRvcigpOwotICAgIHdoaWxlIChrZXlzLmhhc05leHQoKSkgewotICAgICAgSW50ZWdlciBrZXkgPSBrZXlzLm5leHQoKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGtleVNldC5yZW1vdmUoa2V5KTsKLSAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBrZXlzLnJlbW92ZSgpOwotICAgICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFNldDxJbnRlZ2VyPiBtYWtlU29ydGVkS2V5U2V0KEludGVnZXIuLi4ga2V5cykgewotICAgIHJldHVybiBuZXcgVHJlZVNldDxJbnRlZ2VyPihBcnJheXMuPEludGVnZXI+YXNMaXN0KGtleXMpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGVzdEJhZElkZW50aWZpZXJzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjNjBmZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhhdCBwcm90bzIgYXBpIGdlbmVyYXRpb24gZG9lc24ndCBjYXVzZSBjb21waWxlIGVycm9ycyB3aGVuCi0gKiBjb21waWxpbmcgcHJvdG9jb2wgYnVmZmVycyB0aGF0IGhhdmUgbmFtZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgY29uZmxpY3QKLSAqIGlmIG5vdCBmdWxseSBxdWFsaWZpZWQgKGxpa2UgQERlcHJlY2F0ZWQgYW5kIEBPdmVycmlkZSkuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBUZXN0QmFkSWRlbnRpZmllcnMgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvbXBpbGF0aW9uKCkgewotICAgIC8vIElmIHRoaXMgY29tcGlsZXMsIGl0IG1lYW5zIHRoZSBnZW5lcmF0aW9uIHdhcyBjb3JyZWN0LgotICAgIFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvLkRlcHJlY2F0ZWQubmV3QnVpbGRlcigpOwotICAgIFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvLk92ZXJyaWRlLm5ld0J1aWxkZXIoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXREZXNjcmlwdG9yKCkgewotICAgIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yIGZpbGVEZXNjcmlwdG9yID0KLSAgICAgICAgVGVzdEJhZElkZW50aWZpZXJzUHJvdG8uZ2V0RGVzY3JpcHRvcigpOwotICAgIFN0cmluZyBkZXNjcmlwdG9yRmllbGQgPSBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5EZXNjcmlwdG9yCi0gICAgICAgIC5nZXREZWZhdWx0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBwcm90b0Rlc2NyaXB0b3IgPSBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5EZXNjcmlwdG9yCi0gICAgICAgIC5nZXREZWZhdWx0SW5zdGFuY2UoKS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotICAgIFN0cmluZyBuZXN0ZWREZXNjcmlwdG9yRmllbGQgPSBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5EZXNjcmlwdG9yCi0gICAgICAgIC5OZXN0ZWREZXNjcmlwdG9yLmdldERlZmF1bHRJbnN0YW5jZSgpLmdldERlc2NyaXB0b3IoKTsKLSAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG5lc3RlZFByb3RvRGVzY3JpcHRvciA9IFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvCi0gICAgICAgIC5EZXNjcmlwdG9yLk5lc3RlZERlc2NyaXB0b3IuZ2V0RGVmYXVsdEluc3RhbmNlKCkKLSAgICAgICAgLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29uZmxpY3RpbmdGaWVsZE5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEJhZElkZW50aWZpZXJzUHJvdG8uVGVzdENvbmZsaWN0aW5nRmllbGROYW1lcyBtZXNzYWdlID0KLSAgICAgICAgVGVzdEJhZElkZW50aWZpZXJzUHJvdG8uVGVzdENvbmZsaWN0aW5nRmllbGROYW1lcy5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICAvLyBNYWtlIHN1cmUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBhcmUgcHJvcGVybHkgbmFtZWQuCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJGaWVsZDFDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFbnVtRmllbGQyQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U3RyaW5nRmllbGQzQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0Qnl0ZXNGaWVsZDRDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRNZXNzYWdlRmllbGQ1Q291bnQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRJbnQzMkZpZWxkQ291bnQxMSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFbnVtRmllbGRDb3VudDEyKCkuZ2V0TnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRTdHJpbmdGaWVsZENvdW50MTMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIG1lc3NhZ2UuZ2V0Qnl0ZXNGaWVsZENvdW50MTQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0TWVzc2FnZUZpZWxkQ291bnQxNSgpLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJGaWVsZDIxQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RW51bUZpZWxkMjJDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTdHJpbmdGaWVsZDIzQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0Qnl0ZXNGaWVsZDI0Q291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0TWVzc2FnZUZpZWxkMjVDb3VudCgpKTsKLQotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDMyRmllbGQxTGlzdCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJGaWVsZExpc3QzMSgpKTsKLQotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEludDY0RmllbGRDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKAotICAgICAgICBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5UZXN0Q29uZmxpY3RpbmdGaWVsZE5hbWVzLmludDY0RmllbGRDb3VudCkubG9uZ1ZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygwTCwgbWVzc2FnZS5nZXRFeHRlbnNpb24oCi0gICAgICAgIFRlc3RCYWRJZGVudGlmaWVyc1Byb3RvLlRlc3RDb25mbGljdGluZ0ZpZWxkTmFtZXMuaW50NjRGaWVsZExpc3QpLmxvbmdWYWx1ZSgpKTsKLQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Rlc3RVdGlsLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Rlc3RVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjJhNzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzg1NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9uZW9mQnl0ZXNFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vbmVvZk5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vbmVvZlN0cmluZ0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9uZW9mVWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRmxvYXRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Qm9vbEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Qnl0ZXNFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdENvcmRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdERvdWJsZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0RmxvYXRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uOwotLy8gVGhlIHN0YXRpYyBpbXBvcnRzIGFyZSB0byBhdm9pZCAxMDArIGNoYXIgbGluZXMuICBUaGUgZm9sbG93aW5nIGlzIHJvdWdobHkgZXF1aXZhbGVudCB0bwotLy8gaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLio7Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRJbnQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTaW50MzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U3RyaW5nRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0VWludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRVaW50NjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub25lb2ZCeXRlc0V4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vbmVvZk5lc3RlZE1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub25lb2ZTdHJpbmdFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub25lb2ZVaW50MzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxCb29sRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsQnl0ZXNFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxDb3JkRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZpeGVkNjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxGbG9hdEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxHcm91cEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFNpbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFNpbnQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFN0cmluZ0V4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsVWludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsVWludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEJvb2xFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkRG91YmxlRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEVudW1FeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkRml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEZsb2F0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNpbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRTaW50NjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkVWludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFVpbnQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEJvb2xFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRCeXRlc0V4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZENvcmRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWREb3VibGVFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEZsb2F0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRTaW50MzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRTaW50NjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFVpbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RJbXBvcnRMaXRlLkltcG9ydEVudW1MaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLkZvcmVpZ25FbnVtTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGVPckJ1aWxkZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbFR5cGVzTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW07Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydE1lc3NhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0UHVibGljLlB1YmxpY0ltcG9ydE1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zT3JCdWlsZGVyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdE9uZW9mMjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFVucGFja2VkVHlwZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0OwotCi1pbXBvcnQgamF2YS5pby5GaWxlOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5SYW5kb21BY2Nlc3NGaWxlOwotCi0vKioKLSAqIENvbnRhaW5zIG1ldGhvZHMgZm9yIHNldHRpbmcgYWxsIGZpZWxkcyBvZiB7QGNvZGUgVGVzdEFsbFR5cGVzfSB0bwotICogc29tZSB2YWx1ZXMgYXMgd2VsbCBhcyBjaGVja2luZyB0aGF0IGFsbCB0aGUgZmllbGRzIGFyZSBzZXQgdG8gdGhvc2UgdmFsdWVzLgotICogVGhlc2UgYXJlIHVzZWZ1bCBmb3IgdGVzdGluZyB2YXJpb3VzIHByb3RvY29sIG1lc3NhZ2UgZmVhdHVyZXMsIGUuZy4KLSAqIHNldCBhbGwgZmllbGRzIG9mIGEgbWVzc2FnZSwgc2VyaWFsaXplIGl0LCBwYXJzZSBpdCwgYW5kIGNoZWNrIHRoYXQgYWxsCi0gKiBmaWVsZHMgYXJlIHNldC4KLSAqCi0gKiA8cD5UaGlzIGNvZGUgaXMgbm90IHRvIGJlIHVzZWQgb3V0c2lkZSBvZiB7QGNvZGUgY29tLmdvb2dsZS5wcm90b2J1Zn0gYW5kCi0gKiBzdWJwYWNrYWdlcy4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgVGVzdFV0aWwgewotICBwcml2YXRlIFRlc3RVdGlsKCkge30KLQotICAvKiogSGVscGVyIHRvIGNvbnZlcnQgYSBTdHJpbmcgdG8gQnl0ZVN0cmluZy4gKi8KLSAgc3RhdGljIEJ5dGVTdHJpbmcgdG9CeXRlcyhTdHJpbmcgc3RyKSB7Ci0gICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oc3RyLmdldEJ5dGVzKEludGVybmFsLlVURl84KSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEge0Bjb2RlIFRlc3RBbGxUeXBlc30gd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5Ci0gICAqIHtAbGluayAjc2V0QWxsRmllbGRzKFRlc3RBbGxUeXBlcy5CdWlsZGVyKX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRlc3RBbGxUeXBlcyBnZXRBbGxTZXQoKSB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0QWxsRmllbGRzKGJ1aWxkZXIpOwotICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEge0Bjb2RlIFRlc3RBbGxUeXBlcy5CdWlsZGVyfSB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkKLSAgICoge0BsaW5rICNzZXRBbGxGaWVsZHMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgZ2V0QWxsU2V0QnVpbGRlcigpIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgcmV0dXJuIGJ1aWxkZXI7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfSB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkKLSAgICoge0BsaW5rICNzZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnMgZ2V0QWxsRXh0ZW5zaW9uc1NldCgpIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0QWxsRXh0ZW5zaW9ucyhidWlsZGVyKTsKLSAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkVHlwZXMgZ2V0UGFja2VkU2V0KCkgewotICAgIFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UGFja2VkVHlwZXMubmV3QnVpbGRlcigpOwotICAgIHNldFBhY2tlZEZpZWxkcyhidWlsZGVyKTsKLSAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0VW5wYWNrZWRUeXBlcyBnZXRVbnBhY2tlZFNldCgpIHsKLSAgICBUZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0VW5wYWNrZWRGaWVsZHMoYnVpbGRlcik7Ci0gICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnMgZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpIHsKLSAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UGFja2VkRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0UGFja2VkRXh0ZW5zaW9ucyhidWlsZGVyKTsKLSAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQotICAgKiB7QGNvZGUgYXNzZXJ0QWxsRmllbGRzU2V0KCl9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXMuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEludDMyICAgKDEwMSk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEludDY0ICAgKDEwMik7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFVpbnQzMiAgKDEwMyk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFVpbnQ2NCAgKDEwNCk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFNpbnQzMiAgKDEwNSk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFNpbnQ2NCAgKDEwNik7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEZpeGVkMzIgKDEwNyk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEZpeGVkNjQgKDEwOCk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFNmaXhlZDMyKDEwOSk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFNmaXhlZDY0KDExMCk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEZsb2F0ICAgKDExMSk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbERvdWJsZSAgKDExMik7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEJvb2wgICAgKHRydWUpOwotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTdHJpbmcgICgiMTE1Iik7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEJ5dGVzICAgKHRvQnl0ZXMoIjExNiIpKTsKLQotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxHcm91cCgKLSAgICAgIFRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDExNykuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoCi0gICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxMTkpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlKAotICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgxMjApLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlKAotICAgICAgUHVibGljSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RSgxMjYpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxMYXp5TWVzc2FnZSgKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigxMjcpLmJ1aWxkKCkpOwotCi0gICAgbWVzc2FnZS5zZXRPcHRpb25hbE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsSW1wb3J0RW51bSAoSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsKLQotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxTdHJpbmdQaWVjZSgiMTI0Iik7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbENvcmQoIjEyNSIpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbnQzMiAgICgyMDEpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbnQ2NCAgICgyMDIpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRVaW50MzIgICgyMDMpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRVaW50NjQgICgyMDQpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTaW50MzIgICgyMDUpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTaW50NjQgICgyMDYpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaXhlZDMyICgyMDcpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaXhlZDY0ICgyMDgpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTZml4ZWQzMigyMDkpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTZml4ZWQ2NCgyMTApOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGbG9hdCAgICgyMTEpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWREb3VibGUgICgyMTIpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRCb29sICAgICh0cnVlKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU3RyaW5nICAoIjIxNSIpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRCeXRlcyAgICh0b0J5dGVzKCIyMTYiKSk7Ci0KLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkR3JvdXAoCi0gICAgICBUZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cC5uZXdCdWlsZGVyKCkuc2V0QSgyMTcpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIxOCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKAotICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMjE5KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW1wb3J0TWVzc2FnZSgKLSAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoMjIwKS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkTGF6eU1lc3NhZ2UoCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjI3KS5idWlsZCgpKTsKLQotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtIChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGb3JlaWduRW51bShGb3JlaWduRW51bS5GT1JFSUdOX0JBUik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEltcG9ydEVudW0gKEltcG9ydEVudW0uSU1QT1JUX0JBUik7Ci0KLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU3RyaW5nUGllY2UoIjIyNCIpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRDb3JkKCIyMjUiKTsKLQotICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW50MzIgICAoMzAxKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW50NjQgICAoMzAyKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkVWludDMyICAoMzAzKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkVWludDY0ICAoMzA0KTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ludDMyICAoMzA1KTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ludDY0ICAoMzA2KTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRml4ZWQzMiAoMzA3KTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRml4ZWQ2NCAoMzA4KTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ZpeGVkMzIoMzA5KTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkU2ZpeGVkNjQoMzEwKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmxvYXQgICAoMzExKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRG91YmxlICAoMzEyKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkQm9vbCAgICAoZmFsc2UpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTdHJpbmcgICgiMzE1Iik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEJ5dGVzICAgKHRvQnl0ZXMoIjMxNiIpKTsKLQotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRHcm91cCgKLSAgICAgIFRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDMxNykuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCi0gICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygzMTkpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKAotICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgzMjApLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRMYXp5TWVzc2FnZSgKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigzMjcpLmJ1aWxkKCkpOwotCi0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW1wb3J0RW51bSAoSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsKLQotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTdHJpbmdQaWVjZSgiMzI0Iik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZENvcmQoIjMyNSIpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEludDMyICAgKDQwMSk7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0SW50NjQgICAoNDAyKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRVaW50MzIgICg0MDMpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFVpbnQ2NCAgKDQwNCk7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0U2ludDMyICAoNDA1KTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRTaW50NjQgICg0MDYpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEZpeGVkMzIgKDQwNyk7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0Rml4ZWQ2NCAoNDA4KTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRTZml4ZWQzMig0MDkpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFNmaXhlZDY0KDQxMCk7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0RmxvYXQgICAoNDExKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHREb3VibGUgICg0MTIpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEJvb2wgICAgKGZhbHNlKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRTdHJpbmcgICgiNDE1Iik7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0Qnl0ZXMgICAodG9CeXRlcygiNDE2IikpOwotCi0gICAgbWVzc2FnZS5zZXREZWZhdWx0TmVzdGVkRW51bSAoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRGb3JlaWduRW51bShGb3JlaWduRW51bS5GT1JFSUdOX0ZPTyk7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0SW1wb3J0RW51bSAoSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsKLQotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFN0cmluZ1BpZWNlKCI0MjQiKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRDb3JkKCI0MjUiKTsKLQotICAgIG1lc3NhZ2Uuc2V0T25lb2ZVaW50MzIoNjAxKTsKLSAgICBtZXNzYWdlLnNldE9uZW9mTmVzdGVkTWVzc2FnZSgKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig2MDIpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0T25lb2ZTdHJpbmcoIjYwMyIpOwotICAgIG1lc3NhZ2Uuc2V0T25lb2ZCeXRlcyh0b0J5dGVzKCI2MDQiKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZmllbGRzIG9mIHtAY29kZSBtZXNzYWdlfSB0byBjb250YWluIHRoZSB2YWx1ZXMKLSAgICogZXhwZWN0ZWQgYnkge0Bjb2RlIGFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoKX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbW9kaWZ5UmVwZWF0ZWRGaWVsZHMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbnQzMiAgICgxLCA1MDEpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbnQ2NCAgICgxLCA1MDIpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRVaW50MzIgICgxLCA1MDMpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRVaW50NjQgICgxLCA1MDQpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTaW50MzIgICgxLCA1MDUpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTaW50NjQgICgxLCA1MDYpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaXhlZDMyICgxLCA1MDcpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaXhlZDY0ICgxLCA1MDgpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTZml4ZWQzMigxLCA1MDkpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRTZml4ZWQ2NCgxLCA1MTApOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGbG9hdCAgICgxLCA1MTEpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWREb3VibGUgICgxLCA1MTIpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRCb29sICAgICgxLCB0cnVlKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkU3RyaW5nICAoMSwgIjUxNSIpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRCeXRlcyAgICgxLCB0b0J5dGVzKCI1MTYiKSk7Ci0KLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkR3JvdXAoMSwKLSAgICAgIFRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDUxNykuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoMSwKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxLAotICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoNTE5KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSgxLAotICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCg1MjApLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRMYXp5TWVzc2FnZSgxLAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDUyNykuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkTmVzdGVkRW51bSAoMSwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkRm9yZWlnbkVudW0oMSwgRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRJbXBvcnRFbnVtICgxLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOwotCi0gICAgbWVzc2FnZS5zZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEsICI1MjQiKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkQ29yZCgxLCAiNTI1Iik7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRmllbGRzfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxGaWVsZHNTZXQoVGVzdEFsbFR5cGVzT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEludDY0ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsVWludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQzMiAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkNjQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQzMigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZsb2F0ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxEb3VibGUgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZyAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyAgICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCAgICAgICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCAgICAgICAgICgpLmhhc0EoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkuaGFzQmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuaGFzQygpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSAoKS5oYXNEKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZEVudW0gKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW1wb3J0RW51bSAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nUGllY2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbENvcmQoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMSAgLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50MzIgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDIgICwgbWVzc2FnZS5nZXRPcHRpb25hbEludDY0ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAzICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNCAgLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDUgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA2ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNyAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQzMiAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDggICwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkNjQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA5ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQzMigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMCAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTEgICwgbWVzc2FnZS5nZXRPcHRpb25hbEZsb2F0ICAgKCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTIgICwgbWVzc2FnZS5nZXRPcHRpb25hbERvdWJsZSAgKCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRPcHRpb25hbEJvb2wgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjExNSIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTdHJpbmcgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjExNiIpLCBtZXNzYWdlLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExNywgbWVzc2FnZS5nZXRPcHRpb25hbEdyb3VwICAgICAgICAgICAgICAoKS5nZXRBKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE4LCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSAgICAgICgpLmdldEJiKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE5LCBtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgICAgICgpLmdldEMoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMjAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlICAgICAgKCkuZ2V0RCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyNiwgbWVzc2FnZS5nZXRPcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UoKS5nZXRFKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTI3LCBtZXNzYWdlLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UgICAgICAgICgpLmdldEJiKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0JBWiwgbWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjQiLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nUGllY2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTI1IiwgbWVzc2FnZS5nZXRPcHRpb25hbENvcmQoKSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQ2NENvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzJDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQ2NENvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQzMkNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDY0Q291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDMyQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkNjRDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdENvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZUNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbENvdW50ICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzQ291bnQgICAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cENvdW50ICAgICAgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlQ291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bUNvdW50ICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bUNvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW1Db3VudCAgICAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZUNvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmRDb3VudCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMiAgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0ICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA0ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjQgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMiAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0ICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDggICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjQgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzIoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEwICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NCgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0ICAgKDApLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEyICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGUgICgwKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbCAgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmcgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzKDApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE3LCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXAgICAgICAgICAoMCkuZ2V0QSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgKDApLmdldEJiKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UgKDApLmdldEQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRMYXp5TWVzc2FnZSAgICgwKS5nZXRCYigpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bSAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bSgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9CQVIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZSgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmQoMCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjQgICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzIgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDQgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NCAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA2ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjQgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzIgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwOCAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NCAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMigxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTAgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0KDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXQgICAoMSksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZSAgKDEpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sICAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZyAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXMoMSkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cCAgICAgICAgICgxKS5nZXRBKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE4LCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSAoMSkuZ2V0QmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxKS5nZXRDKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzIwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSAoMSkuZ2V0RCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyNywgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlICAgKDEpLmdldEJiKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0JBWiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW0oMSkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZCgxKSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0SW50MzIgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0SW50NjQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0VWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0VWludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQzMiAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQ2NCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkNjQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0RmxvYXQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0RG91YmxlICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Qm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Qnl0ZXMgICAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHROZXN0ZWRFbnVtICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRGb3JlaWduRW51bSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRJbXBvcnRFbnVtICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZ1BpZWNlKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdENvcmQoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMSAgLCBtZXNzYWdlLmdldERlZmF1bHRJbnQzMiAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMiAgLCBtZXNzYWdlLmdldERlZmF1bHRJbnQ2NCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMyAgLCBtZXNzYWdlLmdldERlZmF1bHRVaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNCAgLCBtZXNzYWdlLmdldERlZmF1bHRVaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNSAgLCBtZXNzYWdlLmdldERlZmF1bHRTaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNiAgLCBtZXNzYWdlLmdldERlZmF1bHRTaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNyAgLCBtZXNzYWdlLmdldERlZmF1bHRGaXhlZDMyICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwOCAgLCBtZXNzYWdlLmdldERlZmF1bHRGaXhlZDY0ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwOSAgLCBtZXNzYWdlLmdldERlZmF1bHRTZml4ZWQzMigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMCAgLCBtZXNzYWdlLmdldERlZmF1bHRTZml4ZWQ2NCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMSAgLCBtZXNzYWdlLmdldERlZmF1bHRGbG9hdCAgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDEyICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdERvdWJsZSAgKCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXREZWZhdWx0Qm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDE1IiwgbWVzc2FnZS5nZXREZWZhdWx0U3RyaW5nICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCI0MTYiKSwgbWVzc2FnZS5nZXREZWZhdWx0Qnl0ZXMoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywgbWVzc2FnZS5nZXREZWZhdWx0TmVzdGVkRW51bSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywgbWVzc2FnZS5nZXREZWZhdWx0Rm9yZWlnbkVudW0oKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9GT08sIG1lc3NhZ2UuZ2V0RGVmYXVsdEltcG9ydEVudW0oKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MjQiLCBtZXNzYWdlLmdldERlZmF1bHRTdHJpbmdQaWVjZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MjUiLCBtZXNzYWdlLmdldERlZmF1bHRDb3JkKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuT25lb2ZGaWVsZENhc2UuT05FT0ZfQllURVMsIG1lc3NhZ2UuZ2V0T25lb2ZGaWVsZENhc2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT25lb2ZVaW50MzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT25lb2ZOZXN0ZWRNZXNzYWdlKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09uZW9mU3RyaW5nKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT25lb2ZCeXRlcygpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiNjA0IiksIG1lc3NhZ2UuZ2V0T25lb2ZCeXRlcygpKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBjbGVhcmVkLCBhbmQgdGhhdCBnZXR0aW5nIHRoZSBmaWVsZHMgcmV0dXJucyB0aGVpcgotICAgKiBkZWZhdWx0IHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRDbGVhcihUZXN0QWxsVHlwZXNPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbnQ2NCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFVpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsVWludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQzMiAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGaXhlZDY0ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFNmaXhlZDMyKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGbG9hdCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbERvdWJsZSAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmcgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEJ5dGVzICAgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCAgICAgICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkRW51bSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydEVudW0gKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbENvcmQoKSk7Ci0KLSAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbEludDMyICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQ2NCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFVpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkMzIgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGaXhlZDY0ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNmaXhlZDY0KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGbG9hdCAgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxEb3VibGUgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxCb29sICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0KLSAgICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRPcHRpb25hbEdyb3VwICAgICAgICAgICAgICAoKS5oYXNBKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSAgICAgICgpLmhhc0JiKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgICAgICgpLmhhc0MoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlICAgICAgKCkuaGFzRCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRPcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UoKS5oYXNFKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldE9wdGlvbmFsTGF6eU1lc3NhZ2UgICAgICAgICgpLmhhc0JiKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsR3JvdXAgICAgICAgICAgICAgICgpLmdldEEoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSAgICAgICgpLmdldEJiKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlICAgICAoKS5nZXRDKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UgICAgICAoKS5nZXREKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UoKS5nZXRFKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRPcHRpb25hbExhenlNZXNzYWdlICAgICAgICAoKS5nZXRCYigpKTsKLQotICAgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLCBtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbkVudW0oKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRFbnVtKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZ1BpZWNlKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxDb3JkKCkpOwotCi0gICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMkNvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjRDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyQ291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjRDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzJDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NENvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sQ291bnQgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ0NvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXNDb3VudCAgICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwQ291bnQgICAgICAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bUNvdW50ICAgICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOwotCi0gICAgLy8gaGFzQmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEludDMyICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRJbnQ2NCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0VWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZpeGVkMzIgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDY0ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDY0KCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRGbG9hdCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0RG91YmxlICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEJvb2wgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmcgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Qnl0ZXMgICAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0TmVzdGVkRW51bSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZvcmVpZ25FbnVtKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRJbXBvcnRFbnVtICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmdQaWVjZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Q29yZCgpKTsKLQotICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDEgICAgLCBtZXNzYWdlLmdldERlZmF1bHRJbnQzMiAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MiAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEludDY0ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQzICAgICwgbWVzc2FnZS5nZXREZWZhdWx0VWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDQgICAgLCBtZXNzYWdlLmdldERlZmF1bHRVaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC00NSAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ2ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDcgICAgLCBtZXNzYWdlLmdldERlZmF1bHRGaXhlZDMyICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0OCAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZpeGVkNjQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ5ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygtNTAgICAgLCBtZXNzYWdlLmdldERlZmF1bHRTZml4ZWQ2NCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1MS41ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZsb2F0ICAgKCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNTJlMyAgLCBtZXNzYWdlLmdldERlZmF1bHREb3VibGUgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAgICwgbWVzc2FnZS5nZXREZWZhdWx0Qm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlLmdldERlZmF1bHRTdHJpbmcgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIndvcmxkIiksIG1lc3NhZ2UuZ2V0RGVmYXVsdEJ5dGVzKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsIG1lc3NhZ2UuZ2V0RGVmYXVsdE5lc3RlZEVudW0gKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZvcmVpZ25FbnVtKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFSLCBtZXNzYWdlLmdldERlZmF1bHRJbXBvcnRFbnVtKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYWJjIiwgbWVzc2FnZS5nZXREZWZhdWx0U3RyaW5nUGllY2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTIzIiwgbWVzc2FnZS5nZXREZWZhdWx0Q29yZCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09uZW9mVWludDMyKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09uZW9mTmVzdGVkTWVzc2FnZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPbmVvZlN0cmluZygpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPbmVvZkJ5dGVzKCkpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCi0gICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldEFsbEZpZWxkc30KLSAgICogZm9sbG93ZWQgYnkge0Bjb2RlIG1vZGlmeVJlcGVhdGVkRmllbGRzfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKAotICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKLSAgICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAotICAgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMkNvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjRDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyQ291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjRDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzJDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NENvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sQ291bnQgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ0NvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXNDb3VudCAgICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwQ291bnQgICAgICAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZUNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUNvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2VDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2VDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bUNvdW50ICAgICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjQgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzIgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NCAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA2TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjQgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzIgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NCAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMigwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0KDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXQgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEyRCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGUgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2wgICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlcygwKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxNywgbWVzc2FnZS5nZXRSZXBlYXRlZEdyb3VwICAgICAgICAgKDApLmdldEEoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTgsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlICgwKS5nZXRCYigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLmdldEMoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlICgwKS5nZXREKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjI3LCBtZXNzYWdlLmdldFJlcGVhdGVkTGF6eU1lc3NhZ2UgICAoMCkuZ2V0QmIoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW0gKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW0oMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2UoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkKDApKTsKLQotICAgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMiAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0ICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjQgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMiAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0ICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjQgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzIoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NCgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0ICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sICAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZyAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXMoMSkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cCAgICAgICAgICgxKS5nZXRBKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE4LCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSAoMSkuZ2V0QmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxKS5nZXRDKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTIwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSAoMSkuZ2V0RCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUyNywgbWVzc2FnZS5nZXRSZXBlYXRlZExhenlNZXNzYWdlICAgKDEpLmdldEJiKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0ZPTywgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydEVudW0oMSkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZCgxKSk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGV2ZXJ5IGZpZWxkIG9mIHtAY29kZSBtZXNzYWdlfSB0byBhIHVuaXF1ZSB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQYWNrZWRGaWVsZHMoVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2UuYWRkUGFja2VkSW50MzIgICAoNjAxKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEludDY0ICAgKDYwMik7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRVaW50MzIgICg2MDMpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkVWludDY0ICAoNjA0KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZFNpbnQzMiAgKDYwNSk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRTaW50NjQgICg2MDYpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkRml4ZWQzMiAoNjA3KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEZpeGVkNjQgKDYwOCk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRTZml4ZWQzMig2MDkpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ZpeGVkNjQoNjEwKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEZsb2F0ICAgKDYxMSk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWREb3VibGUgICg2MTIpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkQm9vbCAgICAodHJ1ZSk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRFbnVtICAgIChGb3JlaWduRW51bS5GT1JFSUdOX0JBUik7Ci0gICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgIG1lc3NhZ2UuYWRkUGFja2VkSW50MzIgICAoNzAxKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEludDY0ICAgKDcwMik7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRVaW50MzIgICg3MDMpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkVWludDY0ICAoNzA0KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZFNpbnQzMiAgKDcwNSk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRTaW50NjQgICg3MDYpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkRml4ZWQzMiAoNzA3KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEZpeGVkNjQgKDcwOCk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRTZml4ZWQzMig3MDkpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ZpeGVkNjQoNzEwKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEZsb2F0ICAgKDcxMSk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWREb3VibGUgICg3MTIpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkQm9vbCAgICAoZmFsc2UpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkRW51bSAgICAoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gYSB1bmlxdWUgdmFsdWUuIE11c3QgY29ycmVzcG9uZCB3aXRoCi0gICAqIHRoZSB2YWx1ZXMgYXBwbGllZCBieSB7QGNvZGUgc2V0UGFja2VkRmllbGRzfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRVbnBhY2tlZEZpZWxkcyhUZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkSW50MzIgICAoNjAxKTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkSW50NjQgICAoNjAyKTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkVWludDMyICAoNjAzKTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkVWludDY0ICAoNjA0KTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ludDMyICAoNjA1KTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ludDY0ICAoNjA2KTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkRml4ZWQzMiAoNjA3KTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkRml4ZWQ2NCAoNjA4KTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ZpeGVkMzIoNjA5KTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkU2ZpeGVkNjQoNjEwKTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkRmxvYXQgICAoNjExKTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkRG91YmxlICAoNjEyKTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkQm9vbCAgICAodHJ1ZSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEVudW0gICAgKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsKLSAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCi0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEludDMyICAgKDcwMSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEludDY0ICAgKDcwMik7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFVpbnQzMiAgKDcwMyk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFVpbnQ2NCAgKDcwNCk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNpbnQzMiAgKDcwNSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNpbnQ2NCAgKDcwNik7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZpeGVkMzIgKDcwNyk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZpeGVkNjQgKDcwOCk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNmaXhlZDMyKDcwOSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNmaXhlZDY0KDcxMCk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZsb2F0ICAgKDcxMSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZERvdWJsZSAgKDcxMik7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEJvb2wgICAgKGZhbHNlKTsKLSAgICBtZXNzYWdlLmFkZFVucGFja2VkRW51bSAgICAoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0UGFja2VkRmllbGRzfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQYWNrZWRGaWVsZHNTZXQoVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkSW50MzJDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkSW50NjRDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDMyQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDMyQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQzMkNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQ2NENvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkMzJDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkNjRDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRmxvYXRDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRG91YmxlQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkQm9vbENvdW50ICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UGFja2VkRW51bUNvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAxICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50MzIgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAyICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50NjQgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAzICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDMyICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA0ICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDY0ICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA1ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDMyICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA2ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDY0ICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA3ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQzMiAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA4ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQ2NCAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA5ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkMzIoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjEwICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkNjQoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjExICAsIG1lc3NhZ2UuZ2V0UGFja2VkRmxvYXQgICAoMCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTIgICwgbWVzc2FnZS5nZXRQYWNrZWREb3VibGUgICgwKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFBhY2tlZEJvb2wgICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFBhY2tlZEVudW0oMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAxICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50MzIgICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAyICAsIG1lc3NhZ2UuZ2V0UGFja2VkSW50NjQgICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAzICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA0ICAsIG1lc3NhZ2UuZ2V0UGFja2VkVWludDY0ICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA1ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA2ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ludDY0ICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA3ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQzMiAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA4ICAsIG1lc3NhZ2UuZ2V0UGFja2VkRml4ZWQ2NCAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA5ICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkMzIoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEwICAsIG1lc3NhZ2UuZ2V0UGFja2VkU2ZpeGVkNjQoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzExICAsIG1lc3NhZ2UuZ2V0UGFja2VkRmxvYXQgICAoMSksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTIgICwgbWVzc2FnZS5nZXRQYWNrZWREb3VibGUgICgxKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldFBhY2tlZEJvb2wgICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBtZXNzYWdlLmdldFBhY2tlZEVudW0oMSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0VW5wYWNrZWRGaWVsZHN9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFVucGFja2VkRmllbGRzU2V0KFRlc3RVbnBhY2tlZFR5cGVzIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQzMkNvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDY0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkVWludDMyQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50NjRDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDMyQ291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkNjRDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkMzJDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQ2NENvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEZsb2F0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkRG91YmxlQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRCb29sQ291bnQgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZEVudW1Db3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMSAgLCBtZXNzYWdlLmdldFVucGFja2VkSW50MzIgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAyICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQ2NCAgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDMgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQzMiAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNCAgLCBtZXNzYWdlLmdldFVucGFja2VkVWludDY0ICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA1ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50MzIgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDYgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQ2NCAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNyAgLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQzMiAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA4ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDY0ICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDkgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDMyKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMCAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkNjQoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjExICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGbG9hdCAgICgwKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMiAgLCBtZXNzYWdlLmdldFVucGFja2VkRG91YmxlICAoMCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRVbnBhY2tlZEJvb2wgICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFVucGFja2VkRW51bSgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDEgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDMyICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMiAgLCBtZXNzYWdlLmdldFVucGFja2VkSW50NjQgICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAzICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50MzIgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDQgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQ2NCAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNSAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA2ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50NjQgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDcgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkMzIgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOCAgLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQ2NCAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA5ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQzMigxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTAgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDY0KDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMSAgLCBtZXNzYWdlLmdldFVucGFja2VkRmxvYXQgICAoMSksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTIgICwgbWVzc2FnZS5nZXRVbnBhY2tlZERvdWJsZSAgKDEpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRCb29sICAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5nZXRVbnBhY2tlZEVudW0oMSkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBMaWtlIGFib3ZlLCBidXQgZm9yIGV4dGVuc2lvbnMKLQotICAvLyBKYXZhIGdldHMgY29uZnVzZWQgd2l0aCB0aGluZ3MgbGlrZSBhc3NlcnRFcXVhbHMoaW50LCBJbnRlZ2VyKTogIGl0IGNhbid0Ci0gIC8vIGRlY2lkZSB3aGV0aGVyIHRvIGNhbGwgYXNzZXJ0RXF1YWxzKGludCwgaW50KSBvciBhc3NlcnRFcXVhbHMoT2JqZWN0LAotICAvLyBPYmplY3QpLiAgU28gd2UgZGVmaW5lIHRoZXNlIG1ldGhvZHMgdG8gaGVscCBpdC4KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoaW50IGEsIGludCBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShsb25nIGEsIGxvbmcgYikgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmxvYXQgYSwgZmxvYXQgYikgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYiwgMC4wKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShkb3VibGUgYSwgZG91YmxlIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIsIDAuMCk7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoYm9vbGVhbiBhLCBib29sZWFuIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFN0cmluZyBhLCBTdHJpbmcgYikgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoQnl0ZVN0cmluZyBhLCBCeXRlU3RyaW5nIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtIGEsIEZvcmVpZ25FbnVtIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0gYSwgSW1wb3J0RW51bSBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0gYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZSBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGb3JlaWduRW51bUxpdGUgYikgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSW1wb3J0RW51bUxpdGUgYikgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGFuIHVubW9kaWZpYWJsZSB7QGxpbmsgRXh0ZW5zaW9uUmVnaXN0cnl9IGNvbnRhaW5pbmcgYWxsIHRoZQotICAgKiBleHRlbnNpb25zIG9mIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEV4dGVuc2lvblJlZ2lzdHJ5KCkgewotICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKLSAgICByZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOwotICAgIHJldHVybiByZWdpc3RyeS5nZXRVbm1vZGlmaWFibGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBhbGwgb2Yge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfSdzIGV4dGVuc2lvbnMgd2l0aCB0aGUKLSAgICogZ2l2ZW4ge0BsaW5rIEV4dGVuc2lvblJlZ2lzdHJ5fS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFsbEV4dGVuc2lvbnMoRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHsKLSAgICBVbml0dGVzdFByb3RvLnJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7Ci0gICAgVGVzdFV0aWxMaXRlLnJlZ2lzdGVyQWxsRXh0ZW5zaW9uc0xpdGUocmVnaXN0cnkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQotICAgKiB7QGNvZGUgYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldCgpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICAsIDEwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICwgMTAyTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICwgMTAzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbiAgLCAxMDRMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgLCAxMDUpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uICAsIDEwNkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiAsIDEwNyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICwgMTA4TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbiwgMTA5KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uLCAxMTBMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgLCAxMTFGKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbiAgLCAxMTJEKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb24gICAgLCB0cnVlKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgLCAiMTE1Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbiAgICwgdG9CeXRlcygiMTE2IikpOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiwKLSAgICAgIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLm5ld0J1aWxkZXIoKS5zZXRBKDExNykuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDExOCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwKLSAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDExOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgxMjApLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwKLSAgICAgIFB1YmxpY0ltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEUoMTI2KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDEyNykuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24sICIxMjQiKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24sICIxMjUiKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAyMDEpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDIwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDIwMyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMjA0TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMjA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAyMDZMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAyMDcpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDIwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDIwOSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMjEwTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMjExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMjEyRCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgdHJ1ZSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgIjIxNSIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICAsIHRvQnl0ZXMoIjIxNiIpKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24sCi0gICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5uZXdCdWlsZGVyKCkuc2V0QSgyMTcpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigyMTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sCi0gICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygyMTkpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwKLSAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoMjIwKS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIyNykuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFSKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sICIyMjQiKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sICIyMjUiKTsKLQotICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAzMDEpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDMwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDMwMyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMzA0TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMzA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAzMDZMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAzMDcpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDMwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDMwOSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMzEwTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMzExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMzEyRCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgZmFsc2UpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsICIzMTUiKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgLCB0b0J5dGVzKCIzMTYiKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uLAotICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24ubmV3QnVpbGRlcigpLnNldEEoMzE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24sCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMzE5KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24sCi0gICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDMyMCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbiwKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigzMjcpLmJ1aWxkKCkpOwotCi0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIEltcG9ydEVudW0uSU1QT1JUX0JBWik7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAiMzI0Iik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAiMzI1Iik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uICAgLCA0MDEpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbiAgICwgNDAyTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbiAgLCA0MDMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb24gICwgNDA0TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgLCA0MDUpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICwgNDA2TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gLCA0MDcpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uICwgNDA4TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uLCA0MDkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbiwgNDEwTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgLCA0MTFGKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uICAsIDQxMkQpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uICAgICwgZmFsc2UpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb24gICwgIjQxNSIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbiAgICwgdG9CeXRlcygiNDE2IikpOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0ZPTyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24sIEltcG9ydEVudW0uSU1QT1JUX0ZPTyk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24sICI0MjQiKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbiwgIjQyNSIpOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob25lb2ZVaW50MzJFeHRlbnNpb24sIDYwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob25lb2ZOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDYwMikuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob25lb2ZTdHJpbmdFeHRlbnNpb24sICI2MDMiKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvbmVvZkJ5dGVzRXh0ZW5zaW9uLCB0b0J5dGVzKCI2MDQiKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZXh0ZW5zaW9ucyBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gY29udGFpbiB0aGUgdmFsdWVzCi0gICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAxLCA1MDEpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDEsIDUwMkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDEsIDUwMyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMSwgNTA0TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMSwgNTA1KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAxLCA1MDZMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAxLCA1MDcpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDEsIDUwOEwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDEsIDUwOSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSwgNTEwTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMSwgNTExRik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMSwgNTEyRCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMSwgdHJ1ZSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMSwgIjUxNSIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICAsIDEsIHRvQnl0ZXMoIjUxNiIpKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24sIDEsCi0gICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5uZXdCdWlsZGVyKCkuc2V0QSg1MTcpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwgMSwKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDEsCi0gICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0Qyg1MTkpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwgMSwKLSAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoNTIwKS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uLCAxLAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDUyNykuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24gLCAxLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08pOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDEsIEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gLCAxLCBJbXBvcnRFbnVtLklNUE9SVF9GT08pOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSwgIjUyNCIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMSwgIjUyNSIpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgotICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxFeHRlbnNpb25zfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxFeHRlbnNpb25zU2V0KAotICAgICAgVGVzdEFsbEV4dGVuc2lvbnNPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbiAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkuaGFzQSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKS5oYXNCYigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5oYXNDKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApLmhhc0QoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIxMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICAgICAgKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAgICAgICkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiAgICAgKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAgICAgICkuZ2V0RCgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTI2LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2VFeHRlbnNpb24pLmdldEUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbiAgICAgICAgKS5nZXRCYigpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCAwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgLCAwKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAsIDApLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDApLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICwgMCkuZ2V0RCgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjI3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uICAgLCAwKS5nZXRCYigpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIzMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICwgMSkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gLCAxKS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAxKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAsIDEpLmdldEQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbiAgICwgMSkuZ2V0QmIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIDEpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAxKSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb24gICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbiApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjQxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb24pKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24pKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI0MjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbikpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob25lb2ZCeXRlc0V4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjYwNCIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvbmVvZkJ5dGVzRXh0ZW5zaW9uKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBleHRlbnNpb25zIG9mCi0gICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgY2xlYXJlZCwgYW5kIHRoYXQgZ2V0dGluZyB0aGUgZXh0ZW5zaW9ucyByZXR1cm5zIHRoZWlyCi0gICAqIGRlZmF1bHQgdmFsdWVzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc09yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgLy8gaGFzQmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb24gKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKLQotICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb24gICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbiApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEYgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb24gICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEQgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbikpOwotCi0gICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb24gICAgICAgICApLmhhc0EoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLmhhc0JiKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5oYXNDKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKS5oYXNEKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb24gICAgICAgICApLmdldEEoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKS5nZXREKCkpOwotCi0gICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbikpOwotCi0gICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOwotCi0gICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eSB2aWEgZ2V0RXh0ZW5zaW9uKCkuc2l6ZSgpLgotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgKS5zaXplKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbiAgICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiAgICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uICAgICkuc2l6ZSgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbikuc2l6ZSgpKTsKLQotICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbiAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24gKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uKSk7Ci0KLSAgICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDEgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQyTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MyAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDRMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoLTQ1ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NkwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDcgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ4TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0OSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgtNTBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDUxLjVGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA1MmUzRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoImhlbGxvIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIndvcmxkIiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCJhYmMiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjEyMyIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob25lb2ZVaW50MzJFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob25lb2ZOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9uZW9mU3RyaW5nRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9uZW9mQnl0ZXNFeHRlbnNpb24pKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRXh0ZW5zaW9uc30KLSAgICogZm9sbG93ZWQgYnkge0Bjb2RlIG1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9uc30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc09yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCi0gICAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKLSAgICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZENvcmRFeHRlbnNpb24pKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICwgMCkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gLCAwKS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAwKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAsIDApLmdldEQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbiAgICwgMCkuZ2V0QmIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAwKSk7Ci0KLSAgICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiNTE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24sIDEpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24gICAgICAgICAsIDEpLmdldEEoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICwgMSkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwgMSkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gLCAxKS5nZXREKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MjcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb24gICAsIDEpLmdldEJiKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0ZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCAxKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMSkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBhY2tlZEV4dGVuc2lvbnMoVGVzdFBhY2tlZEV4dGVuc2lvbnMuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb24gICAsIDYwMSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb24gICAsIDYwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbiAgLCA2MDMpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbiAgLCA2MDRMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb24gICwgNjA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb24gICwgNjA2TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbiAsIDYwNyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbiAsIDYwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uLCA2MDkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uLCA2MTBMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbiAgICwgNjExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uICAsIDYxMkQpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb24gICAgLCB0cnVlKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0JBUik7Ci0gICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uICAgLCA3MDEpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uICAgLCA3MDJMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb24gICwgNzAzKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb24gICwgNzA0TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uICAsIDcwNSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uICAsIDcwNkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb24gLCA3MDcpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb24gLCA3MDhMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbiwgNzA5KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgNzEwTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb24gICAsIDcxMUYpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbiAgLCA3MTJEKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uICAgICwgZmFsc2UpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0KFRlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkSW50MzJFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkSW50NjRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkVWludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkVWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRml4ZWQ2NEV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ZpeGVkMzJFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRmxvYXRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRG91YmxlRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkQm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRW51bUV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50MzJFeHRlbnNpb24gICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQzMkV4dGVuc2lvbiAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb24gLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbiAgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbiAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb24gLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbiAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb24gICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uLCAxKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIExpdGUgZXh0ZW5zaW9ucwotCi0gIC8qKgotICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgotICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxFeHRlbnNpb25zfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxFeHRlbnNpb25zU2V0KAotICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkuaGFzQSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuaGFzQmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpLmhhc0MoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmhhc0QoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMTE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmdldEQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEyNiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oCi0gICAgICAgIG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUpLmdldEUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUpLmdldEJiKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlLCAwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICwwKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgLDApLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLDApLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMCkuZ2V0RCgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjI3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICwwKS5nZXRCYigpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSwgMSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICAsMSkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICwxKS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwxKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgLDEpLmdldEQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAsMSkuZ2V0QmIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCAxKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIzMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAxKSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCI0MTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGUpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvbmVvZkJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjYwNCIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvbmVvZkJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgotICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIGNsZWFyZWQsIGFuZCB0aGF0IGdldHRpbmcgdGhlIGV4dGVuc2lvbnMgcmV0dXJucyB0aGVpcgotICAgKiBkZWZhdWx0IHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRFeHRlbnNpb25zQ2xlYXIoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGVPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgICAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwRiAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEQgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUpKTsKLQotICAgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICAgICAgKS5oYXNBKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICAgICAgKS5oYXNCYigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUgICAgICkuaGFzQygpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICAgICkuaGFzRCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuaGFzRSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAgICAgICkuaGFzQmIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApLmdldEEoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5nZXREKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbigKLSAgICAgICAgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuZ2V0RSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICApLmdldEJiKCkpOwotCi0gICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlICAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUpKTsKLQotICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUpKTsKLQotICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQyTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDMgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoLTQ1ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDZMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NyAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ4TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDkgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKC01MEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDUxLjVGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNTJlM0QgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoImhlbGxvIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCJ3b3JsZCIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCJhYmMiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjMiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUpKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvbmVvZlVpbnQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob25lb2ZOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvbmVvZlN0cmluZ0V4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob25lb2ZCeXRlc0V4dGVuc2lvbkxpdGUpKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRXh0ZW5zaW9uc30KLSAgICogZm9sbG93ZWQgYnkge0Bjb2RlIG1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9uc30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGVPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAotICAgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0Ci0gICAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlLCAwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICwwKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgLDApLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLDApLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMCkuZ2V0RCgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjI3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAgICwwKS5nZXRCYigpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDApKTsKLQotICAgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSwgMSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICAsMSkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICwxKS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwxKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgLDEpLmdldEQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUyNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUgICAsMSkuZ2V0QmIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCAxKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjUyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI1MjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAxKSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldChUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSkgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb25MaXRlICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gb25lb2YKLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldE9uZW9mKFRlc3RPbmVvZjIuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS5zZXRGb29MYXp5TWVzc2FnZSgKLSAgICAgICAgVGVzdE9uZW9mMi5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRRdXhJbnQoMTAwKS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldEJhclN0cmluZygiMTAxIik7Ci0gICAgbWVzc2FnZS5zZXRCYXpJbnQoMTAyKTsKLSAgICBtZXNzYWdlLnNldEJhelN0cmluZygiMTAzIik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0T25lb2ZTZXQoVGVzdE9uZW9mMiBtZXNzYWdlKSB7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGb29MYXp5TWVzc2FnZSAgICAgICAgICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEZvb0xhenlNZXNzYWdlKCkuaGFzUXV4SW50KCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNCYXJTdHJpbmcoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNCYXpJbnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNCYXpTdHJpbmcoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMCAgLCBtZXNzYWdlLmdldEZvb0xhenlNZXNzYWdlKCkuZ2V0UXV4SW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEwMSIsIG1lc3NhZ2UuZ2V0QmFyU3RyaW5nICAgICAgICAgICAgICAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDIgICwgbWVzc2FnZS5nZXRCYXpJbnQgICAgICAgICAgICAgICAgICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMDMiLCBtZXNzYWdlLmdldEJhelN0cmluZyAgICAgICAgICAgICAgICAgKCkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEF0TW9zdE9uZUZpZWxkU2V0T25lb2YoVGVzdE9uZW9mMiBtZXNzYWdlKSB7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICBpZiAobWVzc2FnZS5oYXNGb29JbnQoKSkgeyArK2NvdW50OyB9Ci0gICAgaWYgKG1lc3NhZ2UuaGFzRm9vU3RyaW5nKCkpIHsgKytjb3VudDsgfQotICAgIGlmIChtZXNzYWdlLmhhc0Zvb0NvcmQoKSkgeyArK2NvdW50OyB9Ci0gICAgaWYgKG1lc3NhZ2UuaGFzRm9vU3RyaW5nUGllY2UoKSkgeyArK2NvdW50OyB9Ci0gICAgaWYgKG1lc3NhZ2UuaGFzRm9vQnl0ZXMoKSkgeyArK2NvdW50OyB9Ci0gICAgaWYgKG1lc3NhZ2UuaGFzRm9vRW51bSgpKSB7ICsrY291bnQ7IH0KLSAgICBpZiAobWVzc2FnZS5oYXNGb29NZXNzYWdlKCkpIHsgKytjb3VudDsgfQotICAgIGlmIChtZXNzYWdlLmhhc0Zvb0dyb3VwKCkpIHsgKytjb3VudDsgfQotICAgIGlmIChtZXNzYWdlLmhhc0Zvb0xhenlNZXNzYWdlKCkpIHsgKytjb3VudDsgfQotICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvdW50IDw9IDEpOwotCi0gICAgY291bnQgPSAwOwotICAgIGlmIChtZXNzYWdlLmhhc0JhckludCgpKSB7ICsrY291bnQ7IH0KLSAgICBpZiAobWVzc2FnZS5oYXNCYXJTdHJpbmcoKSkgeyArK2NvdW50OyB9Ci0gICAgaWYgKG1lc3NhZ2UuaGFzQmFyQ29yZCgpKSB7ICsrY291bnQ7IH0KLSAgICBpZiAobWVzc2FnZS5oYXNCYXJTdHJpbmdQaWVjZSgpKSB7ICsrY291bnQ7IH0KLSAgICBpZiAobWVzc2FnZS5oYXNCYXJCeXRlcygpKSB7ICsrY291bnQ7IH0KLSAgICBpZiAobWVzc2FnZS5oYXNCYXJFbnVtKCkpIHsgKytjb3VudDsgfQotICAgIEFzc2VydC5hc3NlcnRUcnVlKGNvdW50IDw9IDEpOwotCi0gICAgc3dpdGNoIChtZXNzYWdlLmdldEZvb0Nhc2UoKSkgewotICAgICAgY2FzZSBGT09fSU5UOgotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb0ludCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZPT19TVFJJTkc6Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vU3RyaW5nKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRk9PX0NPUkQ6Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vQ29yZCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZPT19CWVRFUzoKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGb29CeXRlcygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZPT19FTlVNOgotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb0VudW0oKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGT09fTUVTU0FHRToKLSAgICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGb29NZXNzYWdlKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRk9PR1JPVVA6Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRm9vR3JvdXAoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBGT09fTEFaWV9NRVNTQUdFOgotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb0xhenlNZXNzYWdlKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRk9PX05PVF9TRVQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqCi0gICAqIFBlcmZvcm1zIHRoZSBzYW1lIHRoaW5ncyB0aGF0IHRoZSBtZXRob2RzIG9mIHtAY29kZSBUZXN0VXRpbH0gZG8sIGJ1dAotICAgKiB2aWEgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgVGhpcyBpcyBpdHMgb3duIGNsYXNzIGJlY2F1c2UgaXQgbmVlZHMKLSAgICogdG8ga25vdyB3aGF0IGRlc2NyaXB0b3IgdG8gdXNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBSZWZsZWN0aW9uVGVzdGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgYmFzZURlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeTsKLQotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IgZmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yIGltcG9ydEZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciBwdWJsaWNJbXBvcnRGaWxlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG9wdGlvbmFsR3JvdXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIHJlcGVhdGVkR3JvdXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG5lc3RlZE1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGZvcmVpZ25NZXNzYWdlOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBpbXBvcnRNZXNzYWdlOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBwdWJsaWNJbXBvcnRNZXNzYWdlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ3JvdXBBOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkR3JvdXBBOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIG5lc3RlZEI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZm9yZWlnbkM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgaW1wb3J0RDsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBpbXBvcnRFOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBuZXN0ZWRFbnVtOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3IgZm9yZWlnbkVudW07Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBpbXBvcnRFbnVtOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIG5lc3RlZEZvbzsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgbmVzdGVkQmFyOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBuZXN0ZWRCYXo7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGZvcmVpZ25Gb287Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGZvcmVpZ25CYXI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGZvcmVpZ25CYXo7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGltcG9ydEZvbzsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgaW1wb3J0QmFyOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBpbXBvcnRCYXo7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgYSB7QGNvZGUgUmVmbGVjdGlvblRlc3Rlcn0gdGhhdCB3aWxsIGV4cGVjdCBtZXNzYWdlcyB1c2luZwotICAgICAqIHRoZSBnaXZlbiBkZXNjcmlwdG9yLgotICAgICAqCi0gICAgICogTm9ybWFsbHkge0Bjb2RlIGJhc2VEZXNjcmlwdG9yfSBzaG91bGQgYmUgYSBkZXNjcmlwdG9yIGZvciB0aGUgdHlwZQotICAgICAqIHtAY29kZSBUZXN0QWxsVHlwZXN9LCBkZWZpbmVkIGluCi0gICAgICoge0Bjb2RlIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90b30uICBIb3dldmVyLCBpZgotICAgICAqIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0gaXMgbm9uLW51bGwsIHRoZW4ge0Bjb2RlIGJhc2VEZXNjcmlwdG9yfSBzaG91bGQKLSAgICAgKiBiZSBmb3Ige0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zfSBpbnN0ZWFkLCBhbmQgaW5zdGVhZCBvZiByZWFkaW5nIGFuZAotICAgICAqIHdyaXRpbmcgbm9ybWFsIGZpZWxkcywgdGhlIHRlc3RlciB3aWxsIHJlYWQgYW5kIHdyaXRlIGV4dGVuc2lvbnMuCi0gICAgICogQWxsIG9mIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc30nIGV4dGVuc2lvbnMgbXVzdCBiZSByZWdpc3RlcmVkIGluIHRoZQotICAgICAqIHJlZ2lzdHJ5LgotICAgICAqLwotICAgIHB1YmxpYyBSZWZsZWN0aW9uVGVzdGVyKERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgYmFzZURlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkpIHsKLSAgICAgIHRoaXMuYmFzZURlc2NyaXB0b3IgPSBiYXNlRGVzY3JpcHRvcjsKLSAgICAgIHRoaXMuZXh0ZW5zaW9uUmVnaXN0cnkgPSBleHRlbnNpb25SZWdpc3RyeTsKLQotICAgICAgdGhpcy5maWxlID0gYmFzZURlc2NyaXB0b3IuZ2V0RmlsZSgpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxLCBmaWxlLmdldERlcGVuZGVuY2llcygpLnNpemUoKSk7Ci0gICAgICB0aGlzLmltcG9ydEZpbGUgPSBmaWxlLmdldERlcGVuZGVuY2llcygpLmdldCgwKTsKLSAgICAgIHRoaXMucHVibGljSW1wb3J0RmlsZSA9IGltcG9ydEZpbGUuZ2V0RGVwZW5kZW5jaWVzKCkuZ2V0KDApOwotCi0gICAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIHRlc3RBbGxUeXBlczsKLSAgICAgIGlmIChiYXNlRGVzY3JpcHRvci5nZXROYW1lKCkgPT0gIlRlc3RBbGxUeXBlcyIpIHsKLSAgICAgICAgdGVzdEFsbFR5cGVzID0gYmFzZURlc2NyaXB0b3I7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0ZXN0QWxsVHlwZXMgPSBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiVGVzdEFsbFR5cGVzIik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHRlc3RBbGxUeXBlcyk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7Ci0gICAgICAgIC8vIFVzZSB0ZXN0QWxsVHlwZXMsIHJhdGhlciB0aGFuIGJhc2VEZXNjcmlwdG9yLCB0byBhbGxvdwotICAgICAgICAvLyBpbml0aWFsaXphdGlvbiB1c2luZyBUZXN0UGFja2VkVHlwZXMgZGVzY3JpcHRvcnMuIFRoZXNlIG9iamVjdHMKLSAgICAgICAgLy8gd29uJ3QgYmUgdXNlZCBieSB0aGUgbWV0aG9kcyBmb3IgcGFja2VkIGZpZWxkcy4KLSAgICAgICAgdGhpcy5vcHRpb25hbEdyb3VwID0KLSAgICAgICAgICB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk9wdGlvbmFsR3JvdXAiKTsKLSAgICAgICAgdGhpcy5yZXBlYXRlZEdyb3VwID0KLSAgICAgICAgICB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIlJlcGVhdGVkR3JvdXAiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMub3B0aW9uYWxHcm91cCA9Ci0gICAgICAgICAgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIik7Ci0gICAgICAgIHRoaXMucmVwZWF0ZWRHcm91cCA9Ci0gICAgICAgICAgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIik7Ci0gICAgICB9Ci0gICAgICB0aGlzLm5lc3RlZE1lc3NhZ2UgPSB0ZXN0QWxsVHlwZXMuZmluZE5lc3RlZFR5cGVCeU5hbWUoIk5lc3RlZE1lc3NhZ2UiKTsKLSAgICAgIHRoaXMuZm9yZWlnbk1lc3NhZ2UgPSBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9yZWlnbk1lc3NhZ2UiKTsKLSAgICAgIHRoaXMuaW1wb3J0TWVzc2FnZSA9IGltcG9ydEZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJJbXBvcnRNZXNzYWdlIik7Ci0gICAgICB0aGlzLnB1YmxpY0ltcG9ydE1lc3NhZ2UgPSBwdWJsaWNJbXBvcnRGaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKLSAgICAgICAgICAiUHVibGljSW1wb3J0TWVzc2FnZSIpOwotCi0gICAgICB0aGlzLm5lc3RlZEVudW0gPSB0ZXN0QWxsVHlwZXMuZmluZEVudW1UeXBlQnlOYW1lKCJOZXN0ZWRFbnVtIik7Ci0gICAgICB0aGlzLmZvcmVpZ25FbnVtID0gZmlsZS5maW5kRW51bVR5cGVCeU5hbWUoIkZvcmVpZ25FbnVtIik7Ci0gICAgICB0aGlzLmltcG9ydEVudW0gPSBpbXBvcnRGaWxlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiSW1wb3J0RW51bSIpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChvcHRpb25hbEdyb3VwICk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChyZXBlYXRlZEdyb3VwICk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChuZXN0ZWRNZXNzYWdlICk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChmb3JlaWduTWVzc2FnZSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChpbXBvcnRNZXNzYWdlICk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChuZXN0ZWRFbnVtICAgICk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChmb3JlaWduRW51bSAgICk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0Tm90TnVsbChpbXBvcnRFbnVtICAgICk7Ci0KLSAgICAgIHRoaXMubmVzdGVkQiAgPSBuZXN0ZWRNZXNzYWdlIC5maW5kRmllbGRCeU5hbWUoImJiIik7Ci0gICAgICB0aGlzLmZvcmVpZ25DID0gZm9yZWlnbk1lc3NhZ2UuZmluZEZpZWxkQnlOYW1lKCJjIik7Ci0gICAgICB0aGlzLmltcG9ydEQgID0gaW1wb3J0TWVzc2FnZSAuZmluZEZpZWxkQnlOYW1lKCJkIik7Ci0gICAgICB0aGlzLmltcG9ydEUgID0gcHVibGljSW1wb3J0TWVzc2FnZS5maW5kRmllbGRCeU5hbWUoImUiKTsKLSAgICAgIHRoaXMubmVzdGVkRm9vID0gbmVzdGVkRW51bS5maW5kVmFsdWVCeU5hbWUoIkZPTyIpOwotICAgICAgdGhpcy5uZXN0ZWRCYXIgPSBuZXN0ZWRFbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiQkFSIik7Ci0gICAgICB0aGlzLm5lc3RlZEJheiA9IG5lc3RlZEVudW0uZmluZFZhbHVlQnlOYW1lKCJCQVoiKTsKLSAgICAgIHRoaXMuZm9yZWlnbkZvbyA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9GT08iKTsKLSAgICAgIHRoaXMuZm9yZWlnbkJhciA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9CQVIiKTsKLSAgICAgIHRoaXMuZm9yZWlnbkJheiA9IGZvcmVpZ25FbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9SRUlHTl9CQVoiKTsKLSAgICAgIHRoaXMuaW1wb3J0Rm9vID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9GT08iKTsKLSAgICAgIHRoaXMuaW1wb3J0QmFyID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9CQVIiKTsKLSAgICAgIHRoaXMuaW1wb3J0QmF6ID0gaW1wb3J0RW51bS5maW5kVmFsdWVCeU5hbWUoIklNUE9SVF9CQVoiKTsKLQotICAgICAgdGhpcy5ncm91cEEgPSBvcHRpb25hbEdyb3VwLmZpbmRGaWVsZEJ5TmFtZSgiYSIpOwotICAgICAgdGhpcy5yZXBlYXRlZEdyb3VwQSA9IHJlcGVhdGVkR3JvdXAuZmluZEZpZWxkQnlOYW1lKCJhIik7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGdyb3VwQSAgICAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlcGVhdGVkR3JvdXBBKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEIgICAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25DICAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEQgICAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEUgICAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEZvbyAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEJhciAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKG5lc3RlZEJheiAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25Gb28gICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25CYXIgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGZvcmVpZ25CYXogICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEZvbyAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEJhciAgICAgKTsKLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGltcG9ydEJheiAgICAgKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTaG9ydGhhbmQgdG8gZ2V0IGEgRmllbGREZXNjcmlwdG9yIGZvciBhIGZpZWxkIG9mIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZihTdHJpbmcgbmFtZSkgewotICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJlc3VsdDsKLSAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7Ci0gICAgICAgIHJlc3VsdCA9IGJhc2VEZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lICsgIl9leHRlbnNpb24iKTsKLSAgICAgIH0KLSAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKHJlc3VsdCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxzIHtAY29kZSBwYXJlbnQubmV3QnVpbGRlckZvckZpZWxkKCl9IG9yIHVzZXMgdGhlCi0gICAgICoge0Bjb2RlIEV4dGVuc2lvblJlZ2lzdHJ5fSB0byBmaW5kIGFuIGFwcHJvcHJpYXRlIGJ1aWxkZXIsIGRlcGVuZGluZwotICAgICAqIG9uIHdoYXQgdHlwZSBpcyBiZWluZyB0ZXN0ZWQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKAotICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgcGFyZW50LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBwYXJlbnQubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5LkV4dGVuc2lvbkluZm8gZXh0ZW5zaW9uID0KLSAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeS5maW5kSW1tdXRhYmxlRXh0ZW5zaW9uQnlOdW1iZXIoCi0gICAgICAgICAgICAgIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCksIGZpZWxkLmdldE51bWJlcigpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZXh0ZW5zaW9uKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZXh0ZW5zaW9uLmRlZmF1bHRJbnN0YW5jZSk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgLyoqCi0gICAgICogU2V0IGV2ZXJ5IGZpZWxkIG9mIHtAY29kZSBtZXNzYWdlfSB0byB0aGUgdmFsdWVzIGV4cGVjdGVkIGJ5Ci0gICAgICoge0Bjb2RlIGFzc2VydEFsbEZpZWxkc1NldCgpfSwgdXNpbmcgdGhlIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9Ci0gICAgICogcmVmbGVjdGlvbiBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgdm9pZCBzZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIiAgICksIDEwMSApOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9pbnQ2NCIgICApLCAxMDJMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfdWludDMyIiAgKSwgMTAzICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3VpbnQ2NCIgICksIDEwNEwpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zaW50MzIiICApLCAxMDUgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfc2ludDY0IiAgKSwgMTA2TCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkMzIiICksIDEwNyApOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9maXhlZDY0IiApLCAxMDhMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkMzIiKSwgMTA5ICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IiksIDExMEwpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9mbG9hdCIgICApLCAxMTFGKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfZG91YmxlIiAgKSwgMTEyRCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiICAgICksIHRydWUpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zdHJpbmciICApLCAiMTE1Iik7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIiAgICksIHRvQnl0ZXMoIjExNiIpKTsKLQotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbGdyb3VwIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbGdyb3VwIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQoZ3JvdXBBLCAxMTcpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCAxMTgpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKGZvcmVpZ25DLCAxMTkpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChpbXBvcnRELCAxMjApLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEUsIDEyNikuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgMTI3KS5idWlsZCgpKTsKLQotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSwgIG5lc3RlZEJheik7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduQmF6KTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICksICBpbXBvcnRCYXopOwotCi0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIgKSwgIjEyNCIpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9jb3JkIiApLCAiMTI1Iik7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAyMDEgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAyMDJMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiICApLCAyMDMgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAyMDRMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAyMDUgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiICApLCAyMDZMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAyMDcgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAyMDhMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAyMDkgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAyMTBMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAyMTFGKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiICApLCAyMTJEKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCB0cnVlKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAiMjE1Iik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiICAgKSwgdG9CeXRlcygiMjE2IikpOwotCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRncm91cCIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKHJlcGVhdGVkR3JvdXBBLCAyMTcpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKG5lc3RlZEIsIDIxOCkuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChmb3JlaWduQywgMjE5KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChpbXBvcnRELCAyMjApLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgMjI3KS5idWlsZCgpKTsKLQotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAgbmVzdGVkQmFyKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbkJhcik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksICBpbXBvcnRCYXIpOwotCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiApLCAiMjI0Iik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIgKSwgIjIyNSIpOwotCi0gICAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50MzIiICAgKSwgMzAxICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMzAyTCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMzAzICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDY0IiAgKSwgMzA0TCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMzA1ICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMzA2TCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMzA3ICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMzA4TCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMzA5ICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMzEwTCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMzExRik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMzEyRCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSwgZmFsc2UpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIgICksICIzMTUiKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIgICApLCB0b0J5dGVzKCIzMTYiKSk7Ci0KLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZGdyb3VwIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQocmVwZWF0ZWRHcm91cEEsIDMxNykuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgMzE4KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKGZvcmVpZ25DLCAzMTkpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKGltcG9ydEQsIDMyMCkuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCAzMjcpLmJ1aWxkKCkpOwotCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRCYXopOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduQmF6KTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydEJheik7Ci0KLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiICksICIzMjQiKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiApLCAiMzI1Iik7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9pbnQzMiIgICApLCA0MDEgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApLCA0MDJMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF91aW50MzIiICApLCA0MDMgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF91aW50NjQiICApLCA0MDRMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApLCA0MDUgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zaW50NjQiICApLCA0MDZMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDMyIiApLCA0MDcgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApLCA0MDhMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQzMiIpLCA0MDkgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpLCA0MTBMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApLCA0MTFGKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9kb3VibGUiICApLCA0MTJEKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9ib29sIiAgICApLCBmYWxzZSk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfc3RyaW5nIiAgKSwgIjQxNSIpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2J5dGVzIiAgICksIHRvQnl0ZXMoIjQxNiIpKTsKLQotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApLCAgbmVzdGVkRm9vKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbkZvbyk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iICksICBpbXBvcnRGb28pOwotCi0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiApLCAiNDI0Iik7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfY29yZCIgKSwgIjQyNSIpOwotCi0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9uZW9mX3VpbnQzMiIgKSwgNjAxKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib25lb2ZfbmVzdGVkX21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9uZW9mX25lc3RlZF9tZXNzYWdlIikpCi0gICAgICAgICAgLnNldEZpZWxkKG5lc3RlZEIsIDYwMikuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9uZW9mX3N0cmluZyIgKSwgIjYwMyIpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvbmVvZl9ieXRlcyIgKSwgdG9CeXRlcygiNjA0IikpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZmllbGRzIG9mIHtAY29kZSBtZXNzYWdlfSB0byBjb250YWluIHRoZSB2YWx1ZXMKLSAgICAgKiBleHBlY3RlZCBieSB7QGNvZGUgYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgpfSwgdXNpbmcgdGhlCi0gICAgICoge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0gcmVmbGVjdGlvbiBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgdm9pZCBtb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZS5CdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAxLCA1MDEgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAxLCA1MDJMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiICApLCAxLCA1MDMgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAxLCA1MDRMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAxLCA1MDUgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiICApLCAxLCA1MDZMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAxLCA1MDcgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAxLCA1MDhMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAxLCA1MDkgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxLCA1MTBMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAxLCA1MTFGKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiICApLCAxLCA1MTJEKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAxLCB0cnVlKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAxLCAiNTE1Iik7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiICAgKSwgMSwgdG9CeXRlcygiNTE2IikpOwotCi0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAxLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRncm91cCIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKHJlcGVhdGVkR3JvdXBBLCA1MTcpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDEsCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKG5lc3RlZEIsIDUxOCkuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDEsCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChmb3JlaWduQywgNTE5KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChpbXBvcnRELCA1MjApLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIpLCAxLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgNTI3KS5idWlsZCgpKTsKLQotICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAxLCAgbmVzdGVkRm9vKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMSwgZm9yZWlnbkZvbyk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksIDEsICBpbXBvcnRGb28pOwotCi0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDEsICI1MjQiKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDEsICI1MjUiKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCi0gICAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRmllbGRzfSwKLSAgICAgKiB1c2luZyB0aGUge0BsaW5rIE1lc3NhZ2V9IHJlZmxlY3Rpb24gaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxncm91cCIgICAgICAgICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSkpLmhhc0ZpZWxkKGdyb3VwQSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChuZXN0ZWRCKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChmb3JlaWduQykpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChpbXBvcnREKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9jb3JkIikpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDEgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMkwgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAzICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDRMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA2TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDcgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwOEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA5ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTBMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMUYgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTEyRCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMTUiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMTE2IiksIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfYnl0ZXMiKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxncm91cCIpKSkuZ2V0RmllbGQoZ3JvdXBBKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExOCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE5LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEQpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTI2LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEUpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTI3LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmF6LCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXosIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJheiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjQiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjUiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiKSkpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ieXRlcyIgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiAgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfY29yZCIpKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDApKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTcsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRHcm91cEEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE4LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOSwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjcsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDApKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAwKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIzMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDEpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTcsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRHcm91cEEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE4LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxOSwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMjcsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiksIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJheiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJheiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJheiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDEpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAxKSk7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9jb3JkIikpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDEgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAyTCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMyAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDRMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA1ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNkwgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDcgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA4TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwOSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MTBMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDExRiAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMkQgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjQxNSIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjQxNiIpLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfYnl0ZXMiKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXN0ZWRGb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9uZXN0ZWRfZW51bSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduRm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjQyNCIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDI1IiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2NvcmQiKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9uZW9mX2J5dGVzIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiNjA0IiksIG1lc3NhZ2UuZ2V0RmllbGQoZigib25lb2ZfYnl0ZXMiKSkpOwotCi0gICAgICBpZiAoZXh0ZW5zaW9uUmVnaXN0cnkgPT0gbnVsbCkgewotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvbmVvZl91aW50MzIiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvbmVvZl9uZXN0ZWRfbWVzc2FnZSIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9uZW9mX3N0cmluZyIpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9uZW9mX3VpbnQzMiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib25lb2ZfbmVzdGVkX21lc3NhZ2UiKSkpOwotICAgICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9uZW9mX3N0cmluZyIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAxLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9uZW9mX3VpbnQzMiIpKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAyLAotICAgICAgICAgICAgKChNZXNzYWdlT3JCdWlsZGVyKSBtZXNzYWdlLmdldEZpZWxkKGYoIm9uZW9mX25lc3RlZF9tZXNzYWdlIikpKQotICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNjAzIiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvbmVvZl9zdHJpbmciKSkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKLSAgICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIGNsZWFyZWQsIGFuZCB0aGF0IGdldHRpbmcgdGhlIGZpZWxkcyByZXR1cm5zIHRoZWlyCi0gICAgICogZGVmYXVsdCB2YWx1ZXMsIHVzaW5nIHRoZSB7QGxpbmsgTWVzc2FnZX0gcmVmbGVjdGlvbiBpbnRlcmZhY2UuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgICAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW50MzIiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfdWludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfYm9vbCIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfYnl0ZXMiICAgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbGdyb3VwIiAgICAgICAgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9jb3JkIikpKTsKLQotICAgICAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBGICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEQgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIpKSk7Ci0KLSAgICAgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbGdyb3VwIikpKS5oYXNGaWVsZChncm91cEEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChmb3JlaWduQykpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQoaW1wb3J0RCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKGltcG9ydEUpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChuZXN0ZWRCKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxncm91cCIpKSkuZ2V0RmllbGQoZ3JvdXBBKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEQpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnRFKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQobmVzdGVkQikpOwotCi0gICAgICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkRm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25Gb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiKSkpOwotCi0gICAgICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDY0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkNjQiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Zsb2F0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZyIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkZ3JvdXAiICAgICAgICAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiAgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfY29yZCIpKSk7Ci0KLSAgICAgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfaW50MzIiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfdWludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfYm9vbCIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9uZXN0ZWRfZW51bSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9jb3JkIiApKSk7Ci0KLSAgICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MSAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MkwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MyAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC00NSAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NkwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NyAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0OEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0OSAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC01MEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1MS41RiAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1MmUzRCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIndvcmxkIiksIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9ieXRlcyIpKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJhciwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmFyLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYWJjIiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjMiLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfY29yZCIpKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9uZW9mX3VpbnQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvbmVvZl9uZXN0ZWRfbWVzc2FnZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvbmVvZl9zdHJpbmciKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib25lb2ZfYnl0ZXMiKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib25lb2ZfdWludDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIiIsIG1lc3NhZ2UuZ2V0RmllbGQoZigib25lb2Zfc3RyaW5nIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiIiksIG1lc3NhZ2UuZ2V0RmllbGQoZigib25lb2ZfYnl0ZXMiKSkpOwotICAgIH0KLQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkVmlhUmVmbGVjdGlvbigKLSAgICAgICAgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKLSAgICAgIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0Ci0gICAgICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ieXRlcyIgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9jb3JkIikpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMCkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEdyb3VwQSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTgsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjIwLAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksMCkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDApKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjUxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEdyb3VwQSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTgsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE5LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTIwLAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUyNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkRm9vLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduRm9vLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0Rm9vLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksMSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjUyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDEpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDMyIiAgICksIDYwMSApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQ2NCIgICApLCA2MDJMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDMyIiAgKSwgNjAzICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQ2NCIgICksIDYwNEwpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50MzIiICApLCA2MDUgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDY0IiAgKSwgNjA2TCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkMzIiICksIDYwNyApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDY0IiApLCA2MDhMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkMzIiKSwgNjA5ICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDY0IiksIDYxMEwpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9mbG9hdCIgICApLCA2MTFGKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZG91YmxlIiAgKSwgNjEyRCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Jvb2wiICAgICksIHRydWUpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9lbnVtIiApLCAgZm9yZWlnbkJhcik7Ci0gICAgICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDMyIiAgICksIDcwMSApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQ2NCIgICApLCA3MDJMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDMyIiAgKSwgNzAzICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQ2NCIgICksIDcwNEwpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50MzIiICApLCA3MDUgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDY0IiAgKSwgNzA2TCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkMzIiICksIDcwNyApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDY0IiApLCA3MDhMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkMzIiKSwgNzA5ICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDY0IiksIDcxMEwpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9mbG9hdCIgICApLCA3MTFGKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZG91YmxlIiAgKSwgNzEyRCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Jvb2wiICAgICksIGZhbHNlKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZW51bSIgKSwgIGZvcmVpZ25CYXopOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIGFzc2VydFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInBhY2tlZF9lbnVtIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50MzIiICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQ2NCIgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQzMiIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDY0IiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50MzIiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQ2NCIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQzMiIgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDY0IiApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDMyIiksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkNjQiKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9mbG9hdCIgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfYm9vbCIgICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2VudW0iICksMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQzMiIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDY0IiAgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDMyIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50NjQiICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQzMiIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA2TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDY0IiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDMyIiApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkNjQiICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQ2NCIpLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Zsb2F0IiAgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEyRCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZG91YmxlIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9ib29sIiAgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZW51bSIgKSwxKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgcmVmbGVjdGlvbiBzZXR0ZXJzIGZvciB0aGUgZ2l2ZW4uQnVpbGRlciBvYmplY3QgdGhyb3cgYQotICAgICAqIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZXkgYXJlIHBhc3NlZCBhIG51bGwgdmFsdWUuICBVc2VzIEFzc2VydCB0byB0aHJvdyBhbgotICAgICAqIGFwcHJvcHJpYXRlIGFzc2VydGlvbiBmYWlsdXJlLCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCB2ZXJpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmKCJvcHRpb25hbF9zdHJpbmciKSwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIpLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiksIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotCi0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiksIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIpLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSByZWZsZWN0aW9uIHJlcGVhdGVkIHNldHRlcnMgZm9yIHRoZSBnaXZlbiBCdWlsZGVyIG9iamVjdCB0aHJvdyBhCi0gICAgICogTnVsbFBvaW50ZXJFeGNlcHRpb24gaWYgdGhleSBhcmUgcGFzc2VkIGEgbnVsbCB2YWx1ZS4gIFVzZXMgQXNzZXJ0IHRvIHRocm93IGFuIGFwcHJvcHJpYXRlCi0gICAgICogYXNzZXJ0aW9uIGZhaWx1cmUsIGlmIHRoZSBjb25kaXRpb24gaXMgbm90IHZlcmlmaWVkLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFzc2VydFJlZmxlY3Rpb25SZXBlYXRlZFNldHRlcnNSZWplY3ROdWxsKE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciKSwgIm9uZSIpOwotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIpLCAwLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0KLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIpLCB0b0J5dGVzKCJvbmUiKSk7Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMCwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotCi0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgbmVzdGVkQmF6KTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpLCAwLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0KLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgICBmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLAotICAgICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigyMTgpLmJ1aWxkKCkpOwotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDAsIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGZpbGVQYXRoIFRoZSBwYXRoIHJlbGF0aXZlIHRvCi0gICAqIHtAbGluayAjZ2V0VGVzdERhdGFEaXJ9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgcmVhZFRleHRGcm9tRmlsZShTdHJpbmcgZmlsZVBhdGgpIHsKLSAgICByZXR1cm4gcmVhZEJ5dGVzRnJvbUZpbGUoZmlsZVBhdGgpLnRvU3RyaW5nVXRmOCgpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgRmlsZSBnZXRUZXN0RGF0YURpcigpIHsKLSAgICAvLyBTZWFyY2ggZWFjaCBwYXJlbnQgZGlyZWN0b3J5IGxvb2tpbmcgZm9yICJzcmMvZ29vZ2xlL3Byb3RvYnVmIi4KLSAgICBGaWxlIGFuY2VzdG9yID0gbmV3IEZpbGUoIi4iKTsKLSAgICB0cnkgewotICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5nZXRDYW5vbmljYWxGaWxlKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJDb3VsZG4ndCBnZXQgY2Fub25pY2FsIG5hbWUgb2Ygd29ya2luZyBkaXJlY3RvcnkuIiwgZSk7Ci0gICAgfQotICAgIHdoaWxlIChhbmNlc3RvciAhPSBudWxsICYmIGFuY2VzdG9yLmV4aXN0cygpKSB7Ci0gICAgICBpZiAobmV3IEZpbGUoYW5jZXN0b3IsICJzcmMvZ29vZ2xlL3Byb3RvYnVmIikuZXhpc3RzKCkpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBGaWxlKGFuY2VzdG9yLCAic3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YSIpOwotICAgICAgfQotICAgICAgYW5jZXN0b3IgPSBhbmNlc3Rvci5nZXRQYXJlbnRGaWxlKCk7Ci0gICAgfQotCi0gICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAiQ291bGQgbm90IGZpbmQgZ29sZGVuIGZpbGVzLiAgVGhpcyB0ZXN0IG11c3QgYmUgcnVuIGZyb20gd2l0aGluIHRoZSAiICsKLSAgICAgICJwcm90b2J1ZiBzb3VyY2UgcGFja2FnZSBzbyB0aGF0IGl0IGNhbiByZWFkIHRlc3QgZGF0YSBmaWxlcyBmcm9tIHRoZSAiICsKLSAgICAgICJDKysgc291cmNlIHRyZWUuIik7Ci0gIH0KLQotICAvKioKLSAgICogQHBhcmFtIGZpbGVuYW1lIFRoZSBwYXRoIHJlbGF0aXZlIHRvCi0gICAqIHtAbGluayAjZ2V0VGVzdERhdGFEaXJ9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIHJlYWRCeXRlc0Zyb21GaWxlKFN0cmluZyBmaWxlbmFtZSkgewotICAgIEZpbGUgZnVsbFBhdGggPSBuZXcgRmlsZShnZXRUZXN0RGF0YURpcigpLCBmaWxlbmFtZSk7Ci0gICAgdHJ5IHsKLSAgICAgIFJhbmRvbUFjY2Vzc0ZpbGUgZmlsZSA9IG5ldyBSYW5kb21BY2Nlc3NGaWxlKGZ1bGxQYXRoLCAiciIpOwotICAgICAgYnl0ZVtdIGNvbnRlbnQgPSBuZXcgYnl0ZVsoaW50KSBmaWxlLmxlbmd0aCgpXTsKLSAgICAgIGZpbGUucmVhZEZ1bGx5KGNvbnRlbnQpOwotICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oY29udGVudCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgLy8gVGhyb3cgYSBSdW50aW1lRXhjZXB0aW9uIGhlcmUgc28gdGhhdCB3ZSBjYW4gY2FsbCB0aGlzIGZ1bmN0aW9uIGZyb20KLSAgICAgIC8vIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiQ291bGRuJ3QgcmVhZCBmaWxlOiAiICsgZnVsbFBhdGguZ2V0UGF0aCgpLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBieXRlcyBvZiB0aGUgImdvbGRlbiBtZXNzYWdlIi4gIFRoaXMgaXMgYSBzZXJpYWxpemVkIFRlc3RBbGxUeXBlcwotICAgKiB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkKLSAgICoge0BsaW5rICNzZXRBbGxGaWVsZHMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIpfSwgYnV0IGl0IGlzIGxvYWRlZCBmcm9tIGEgZmlsZQotICAgKiBvbiBkaXNrIHJhdGhlciB0aGFuIGdlbmVyYXRlZCBkeW5hbWljYWxseS4gIFRoZSBmaWxlIGlzIGFjdHVhbGx5IGdlbmVyYXRlZAotICAgKiBieSBDKysgY29kZSwgc28gdGVzdGluZyBhZ2FpbnN0IGl0IHZlcmlmaWVzIGNvbXBhdGliaWxpdHkgd2l0aCBDKysuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgZ2V0R29sZGVuTWVzc2FnZSgpIHsKLSAgICBpZiAoZ29sZGVuTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICBnb2xkZW5NZXNzYWdlID0gcmVhZEJ5dGVzRnJvbUZpbGUoImdvbGRlbl9tZXNzYWdlX29uZW9mX2ltcGxlbWVudGVkIik7Ci0gICAgfQotICAgIHJldHVybiBnb2xkZW5NZXNzYWdlOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgZ29sZGVuTWVzc2FnZSA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYnl0ZXMgb2YgdGhlICJnb2xkZW4gcGFja2VkIGZpZWxkcyBtZXNzYWdlIi4gIFRoaXMgaXMgYSBzZXJpYWxpemVkCi0gICAqIFRlc3RQYWNrZWRUeXBlcyB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkKLSAgICoge0BsaW5rICNzZXRQYWNrZWRGaWVsZHMoVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIpfSwgYnV0IGl0IGlzIGxvYWRlZCBmcm9tIGEKLSAgICogZmlsZSBvbiBkaXNrIHJhdGhlciB0aGFuIGdlbmVyYXRlZCBkeW5hbWljYWxseS4gIFRoZSBmaWxlIGlzIGFjdHVhbGx5Ci0gICAqIGdlbmVyYXRlZCBieSBDKysgY29kZSwgc28gdGVzdGluZyBhZ2FpbnN0IGl0IHZlcmlmaWVzIGNvbXBhdGliaWxpdHkgd2l0aAotICAgKiBDKysuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgZ2V0R29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSgpIHsKLSAgICBpZiAoZ29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICBnb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlID0KLSAgICAgICAgICByZWFkQnl0ZXNGcm9tRmlsZSgiZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSIpOwotICAgIH0KLSAgICByZXR1cm4gZ29sZGVuUGFja2VkRmllbGRzTWVzc2FnZTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIGdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBNb2NrIGltcGxlbWVudGF0aW9uIG9mIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnR9IGZvciB0ZXN0aW5nLgotICAgKgotICAgKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgTW9ja0J1aWxkZXJQYXJlbnQKLSAgICAgIGltcGxlbWVudHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHsKLQotICAgIHByaXZhdGUgaW50IGludmFsaWRhdGlvbnM7Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgICBpbnZhbGlkYXRpb25zKys7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBnZXRJbnZhbGlkYXRpb25Db3VudCgpIHsKLSAgICAgIHJldHVybiBpbnZhbGlkYXRpb25zOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbExpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGVzdFV0aWxMaXRlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmMzNmYTEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbExpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU1OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLk9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRCb29sRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9uZW9mQnl0ZXNFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vbmVvZk5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vbmVvZlN0cmluZ0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9uZW9mVWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRmxvYXRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFVpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkTGF6eU1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZTsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RJbXBvcnRMaXRlLkltcG9ydEVudW1MaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RJbXBvcnRMaXRlLkltcG9ydE1lc3NhZ2VMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RJbXBvcnRQdWJsaWNMaXRlLlB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLkZvcmVpZ25FbnVtTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5Gb3JlaWduTWVzc2FnZUxpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbEV4dGVuc2lvbnNMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxUeXBlc0xpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlOwotCi0vKioKLSAqIENvbnRhaW5zIG1ldGhvZHMgZm9yIHNldHRpbmcgZmllbGRzIG9mIHtAY29kZSBUZXN0QWxsVHlwZXNMaXRlfSwge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zTGl0ZX0sCi0gKiBhbmQge0Bjb2RlIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZX0uIFRoaXMgaXMgYW5hbG9nb3VzIHRvIHRoZSBmdW5jdGlvbmFsaXR5IGluIFRlc3RVdGlsLmphdmEgYnV0Ci0gKiBkb2VzIG5vdCBkZXBlbmQgb24gdGhlIHByZXNlbmNlIG9mIGFueSBub24tbGl0ZSBwcm90b3MuCi0gKgotICogPHA+VGhpcyBjb2RlIGlzIG5vdCB0byBiZSB1c2VkIG91dHNpZGUgb2Yge0Bjb2RlIGNvbS5nb29nbGUucHJvdG9idWZ9IGFuZAotICogc3VicGFja2FnZXMuCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBUZXN0VXRpbExpdGUgewotICBwcml2YXRlIFRlc3RVdGlsTGl0ZSgpIHt9Ci0KLSAgLyoqIEhlbHBlciB0byBjb252ZXJ0IGEgU3RyaW5nIHRvIEJ5dGVTdHJpbmcuICovCi0gIHN0YXRpYyBCeXRlU3RyaW5nIHRvQnl0ZXMoU3RyaW5nIHN0cikgewotICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKHN0ci5nZXRCeXRlcyhJbnRlcm5hbC5VVEZfOCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIHtAY29kZSBUZXN0QWxsVHlwZXNMaXRlLkJ1aWxkZXJ9IHdpdGggYWxsIGZpZWxkcyBzZXQgYXMgdGhleSB3b3VsZCBiZSBieQotICAgKiB7QGxpbmsgI3NldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXNMaXRlLkJ1aWxkZXIpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzTGl0ZS5CdWlsZGVyIGdldEFsbExpdGVTZXRCdWlsZGVyKCkgewotICAgIFRlc3RBbGxUeXBlc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0QWxsRmllbGRzKGJ1aWxkZXIpOwotICAgIHJldHVybiBidWlsZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGV9IHdpdGggYWxsIGZpZWxkcyBzZXQgYXMgdGhleSB3b3VsZCBiZSBieQotICAgKiB7QGxpbmsgI3NldEFsbEV4dGVuc2lvbnMoVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIGdldEFsbExpdGVFeHRlbnNpb25zU2V0KCkgewotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpOwotICAgIHNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7Ci0gICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIGdldExpdGVQYWNrZWRFeHRlbnNpb25zU2V0KCkgewotICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpOwotICAgIHNldFBhY2tlZEV4dGVuc2lvbnMoYnVpbGRlcik7Ci0gICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgYnVpbGRlcn0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQotICAgKiB7QGNvZGUgYXNzZXJ0QWxsRmllbGRzU2V0KCl9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXNMaXRlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMiAgICgxMDEpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQ2NCAgICgxMDIpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxVaW50MzIgICgxMDMpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxVaW50NjQgICgxMDQpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTaW50MzIgICgxMDUpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTaW50NjQgICgxMDYpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGaXhlZDMyICgxMDcpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGaXhlZDY0ICgxMDgpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTZml4ZWQzMigxMDkpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTZml4ZWQ2NCgxMTApOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGbG9hdCAgICgxMTEpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxEb3VibGUgICgxMTIpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxCb29sICAgICh0cnVlKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU3RyaW5nICAoIjExNSIpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxCeXRlcyAgICh0b0J5dGVzKCIxMTYiKSk7Ci0KLSAgICBidWlsZGVyLnNldE9wdGlvbmFsR3JvdXAoCi0gICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuT3B0aW9uYWxHcm91cC5uZXdCdWlsZGVyKCkuc2V0QSgxMTcpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAotICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDExOCkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKAotICAgICAgICBGb3JlaWduTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEMoMTE5KS5idWlsZCgpKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSgKLSAgICAgICAgSW1wb3J0TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEQoMTIwKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSgKLSAgICAgICAgUHVibGljSW1wb3J0TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEUoMTI2KS5idWlsZCgpKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTGF6eU1lc3NhZ2UoCi0gICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTI3KS5idWlsZCgpKTsKLQotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtIChUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFaKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsRm9yZWlnbkVudW0oRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbXBvcnRFbnVtIChJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVopOwotCi0gICAgYnVpbGRlci5zZXRPcHRpb25hbFN0cmluZ1BpZWNlKCIxMjQiKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsQ29yZCgiMTI1Iik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyICAgKDIwMSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDY0ICAgKDIwMik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFVpbnQzMiAgKDIwMyk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFVpbnQ2NCAgKDIwNCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNpbnQzMiAgKDIwNSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNpbnQ2NCAgKDIwNik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpeGVkMzIgKDIwNyk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpeGVkNjQgKDIwOCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNmaXhlZDMyKDIwOSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNmaXhlZDY0KDIxMCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZsb2F0ICAgKDIxMSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZERvdWJsZSAgKDIxMik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEJvb2wgICAgKHRydWUpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTdHJpbmcgICgiMjE1Iik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzICAgKHRvQnl0ZXMoIjIxNiIpKTsKLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRHcm91cCgKLSAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5SZXBlYXRlZEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDIxNykuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCi0gICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCi0gICAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0QygyMTkpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKAotICAgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCgyMjApLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRMYXp5TWVzc2FnZSgKLSAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigyMjcpLmJ1aWxkKCkpOwotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduRW51bShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEltcG9ydEVudW0gKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUik7Ci0KLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU3RyaW5nUGllY2UoIjIyNCIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRDb3JkKCIyMjUiKTsKLQotICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIgICAoMzAxKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50NjQgICAoMzAyKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkVWludDMyICAoMzAzKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkVWludDY0ICAoMzA0KTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ludDMyICAoMzA1KTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ludDY0ICAoMzA2KTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRml4ZWQzMiAoMzA3KTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRml4ZWQ2NCAoMzA4KTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ZpeGVkMzIoMzA5KTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ZpeGVkNjQoMzEwKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmxvYXQgICAoMzExKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRG91YmxlICAoMzEyKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkQm9vbCAgICAoZmFsc2UpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTdHJpbmcgICgiMzE1Iik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzICAgKHRvQnl0ZXMoIjMxNiIpKTsKLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRHcm91cCgKLSAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5SZXBlYXRlZEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDMxNykuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCi0gICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzE4KS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCi0gICAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0QygzMTkpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKAotICAgICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCgzMjApLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRMYXp5TWVzc2FnZSgKLSAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigzMjcpLmJ1aWxkKCkpOwotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVopOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduRW51bShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEltcG9ydEVudW0gKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWik7Ci0KLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU3RyaW5nUGllY2UoIjMyNCIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRDb3JkKCIzMjUiKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBidWlsZGVyLnNldERlZmF1bHRJbnQzMiAgICg0MDEpOwotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdEludDY0ICAgKDQwMik7Ci0gICAgYnVpbGRlci5zZXREZWZhdWx0VWludDMyICAoNDAzKTsKLSAgICBidWlsZGVyLnNldERlZmF1bHRVaW50NjQgICg0MDQpOwotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdFNpbnQzMiAgKDQwNSk7Ci0gICAgYnVpbGRlci5zZXREZWZhdWx0U2ludDY0ICAoNDA2KTsKLSAgICBidWlsZGVyLnNldERlZmF1bHRGaXhlZDMyICg0MDcpOwotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdEZpeGVkNjQgKDQwOCk7Ci0gICAgYnVpbGRlci5zZXREZWZhdWx0U2ZpeGVkMzIoNDA5KTsKLSAgICBidWlsZGVyLnNldERlZmF1bHRTZml4ZWQ2NCg0MTApOwotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdEZsb2F0ICAgKDQxMSk7Ci0gICAgYnVpbGRlci5zZXREZWZhdWx0RG91YmxlICAoNDEyKTsKLSAgICBidWlsZGVyLnNldERlZmF1bHRCb29sICAgIChmYWxzZSk7Ci0gICAgYnVpbGRlci5zZXREZWZhdWx0U3RyaW5nICAoIjQxNSIpOwotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdEJ5dGVzICAgKHRvQnl0ZXMoIjQxNiIpKTsKLQotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08pOwotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PKTsKLSAgICBidWlsZGVyLnNldERlZmF1bHRJbXBvcnRFbnVtIChJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9GT08pOwotCi0gICAgYnVpbGRlci5zZXREZWZhdWx0U3RyaW5nUGllY2UoIjQyNCIpOwotICAgIGJ1aWxkZXIuc2V0RGVmYXVsdENvcmQoIjQyNSIpOwotCi0gICAgYnVpbGRlci5zZXRPbmVvZlVpbnQzMig2MDEpOwotICAgIGJ1aWxkZXIuc2V0T25lb2ZOZXN0ZWRNZXNzYWdlKAotICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDYwMikuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5zZXRPbmVvZlN0cmluZygiNjAzIik7Ci0gICAgYnVpbGRlci5zZXRPbmVvZkJ5dGVzKHRvQnl0ZXMoIjYwNCIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYW4gdW5tb2RpZmlhYmxlIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeUxpdGV9IGNvbnRhaW5pbmcgYWxsIHRoZQotICAgKiBleHRlbnNpb25zIG9mIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGV9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCkgewotICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5uZXdJbnN0YW5jZSgpOwotICAgIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc0xpdGUocmVnaXN0cnkpOwotICAgIHJldHVybiByZWdpc3RyeS5nZXRVbm1vZGlmaWFibGUoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWdpc3RlciBhbGwgb2Yge0Bjb2RlIFRlc3RBbGxFeHRlbnNpb25zTGl0ZX0ncyBleHRlbnNpb25zIHdpdGggdGhlCi0gICAqIGdpdmVuIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeUxpdGV9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQWxsRXh0ZW5zaW9uc0xpdGUoRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHJlZ2lzdHJ5KSB7Ci0gICAgVW5pdHRlc3RMaXRlLnJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhyZWdpc3RyeSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIExpdGUgZXh0ZW5zaW9ucwotCi0gIC8qKgotICAgKiBTZXQgZXZlcnkgZmllbGQgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIHRoZSB2YWx1ZXMgZXhwZWN0ZWQgYnkKLSAgICoge0Bjb2RlIGFzc2VydEFsbEV4dGVuc2lvbnNTZXQoKX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsRXh0ZW5zaW9ucyhUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDEwMkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxMDMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxMDRMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMTA1KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMTA2TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEwNyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDEwOEwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAxMDkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAxMTBMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMTExRik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlICAsIDExMkQpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsQm9vbEV4dGVuc2lvbkxpdGUgICAgLCB0cnVlKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgIjExNSIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlICAgLCB0b0J5dGVzKCIxMTYiKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uX2xpdGUubmV3QnVpbGRlcigpLnNldEEoMTE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigxMTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXRDKDExOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIEltcG9ydE1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXREKDEyMCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIFB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXRFKDEyNikuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUsCi0gICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDEyNykuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFaKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWik7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgIjEyNCIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGUsICIxMjUiKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMjAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMjAyTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDIwMyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDIwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAyMDUpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAyMDZMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMjA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMjA4TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDIwOSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDIxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAyMTFGKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMjEyRCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIHRydWUpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAiMjE1Iik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUgICAsIHRvQnl0ZXMoIjIxNiIpKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlLAotICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZS5uZXdCdWlsZGVyKCkuc2V0QSgyMTcpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUsCi0gICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDIxOCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsCi0gICAgICBGb3JlaWduTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEMoMjE5KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgSW1wb3J0TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEQoMjIwKS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjI3KS5idWlsZCgpKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFSKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAiMjI0Iik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgIjIyNSIpOwotCi0gICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAzMDEpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAzMDJMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMzAzKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMzA0TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDMwNSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDMwNkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAzMDcpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAzMDhMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMzA5KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMzEwTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDMxMUYpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAzMTJEKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgZmFsc2UpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAiMzE1Iik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUgICAsIHRvQnl0ZXMoIjMxNiIpKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlLAotICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb25fbGl0ZS5uZXdCdWlsZGVyKCkuc2V0QSgzMTcpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUsCi0gICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDMxOCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsCi0gICAgICBGb3JlaWduTWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEMoMzE5KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgSW1wb3J0TWVzc2FnZUxpdGUubmV3QnVpbGRlcigpLnNldEQoMzIwKS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZExhenlNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzI3KS5idWlsZCgpKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVopOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFaKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAiMzI0Iik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgIjMyNSIpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDQwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgNDAyTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgNDAzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZSAgLCA0MDRMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCA0MDUpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlICAsIDQwNkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDQwNyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlICwgNDA4TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgNDA5KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlLCA0MTBMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlICAgLCA0MTFGKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCA0MTJEKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUgICAgLCBmYWxzZSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgIjQxNSIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGUgICAsIHRvQnl0ZXMoIjQxNiIpKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08pOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfRk9PKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsICI0MjQiKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUsICI0MjUiKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9uZW9mVWludDMyRXh0ZW5zaW9uTGl0ZSwgNjAxKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvbmVvZk5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig2MDIpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9uZW9mU3RyaW5nRXh0ZW5zaW9uTGl0ZSwgIjYwMyIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9uZW9mQnl0ZXNFeHRlbnNpb25MaXRlLCB0b0J5dGVzKCI2MDQiKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZXh0ZW5zaW9ucyBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gY29udGFpbiB0aGUgdmFsdWVzCi0gICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEsIDUwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDEsIDUwMkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxLCA1MDMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxLCA1MDRMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSwgNTA1KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSwgNTA2TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEsIDUwNyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDEsIDUwOEwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAxLCA1MDkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAxLCA1MTBMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMSwgNTExRik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDEsIDUxMkQpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAxLCB0cnVlKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgMSwgIjUxNSIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlICAgLCAxLCB0b0J5dGVzKCI1MTYiKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSwgMSwKLSAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUubmV3QnVpbGRlcigpLnNldEEoNTE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLCAxLAotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLCAxLAotICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXRDKDUxOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwgMSwKLSAgICAgIEltcG9ydE1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXREKDUyMCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRMYXp5TWVzc2FnZUV4dGVuc2lvbkxpdGUsIDEsCi0gICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDUyNykuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICwgMSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIDEsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlICwgMSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfRk9PKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAxLCAiNTI0Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgMSwgIjUyNSIpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBhY2tlZEV4dGVuc2lvbnMoVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgNjAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDYwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgNjAzKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDYwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgNjA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDYwNkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgNjA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDYwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgNjA5KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDYxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgNjExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCA2MTJEKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIHRydWUpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUik7Ci0gICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgNzAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDcwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgNzAzKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDcwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgNzA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDcwNkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgNzA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDcwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgNzA5KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDcxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgNzExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCA3MTJEKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIGZhbHNlKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXRQYXJzZUluZm9UcmVlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTMzOGFmMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXRQYXJzZUluZm9UcmVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTgyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBAe2xpbmsgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWV9LgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWVUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIERlc2NyaXB0b3IgREVTQ1JJUFRPUiA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBPUFRJT05BTF9JTlQzMiA9Ci0gICAgICBERVNDUklQVE9SLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGREZXNjcmlwdG9yIE9QVElPTkFMX0JPT0xFQU4gPQotICAgICAgREVTQ1JJUFRPUi5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2Jvb2xlYW4iKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGREZXNjcmlwdG9yIFJFUEVBVEVEX0lOVDMyID0KLSAgICAgIERFU0NSSVBUT1IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZERlc2NyaXB0b3IgT1BUSU9OQUxfTkVTVEVEX01FU1NBR0UgPQotICAgICAgREVTQ1JJUFRPUi5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBSRVBFQVRFRF9ORVNURURfTUVTU0FHRSA9Ci0gICAgICBERVNDUklQVE9SLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRmllbGREZXNjcmlwdG9yIEZJRUxEX0JCID0KLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoImJiIik7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gTE9DMCA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgxLCAyKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gTE9DMSA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgyLCAzKTsKLQotICBwcml2YXRlIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlLkJ1aWxkZXIgcm9vdEJ1aWxkZXI7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIHNldFVwKCkgewotICAgIHJvb3RCdWlsZGVyID0gVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuYnVpbGRlcigpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJ1aWxkRW1wdHlQYXJzZVRyZWUoKSB7Ci0gICAgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUgdHJlZSA9IHJvb3RCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VHJ1ZSh0cmVlLmdldExvY2F0aW9ucyhudWxsKS5pc0VtcHR5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldExvY2F0aW9uUmV0dXJuc1NpbmdsZUxvY2F0aW9uKCkgewotICAgIHJvb3RCdWlsZGVyLnNldExvY2F0aW9uKE9QVElPTkFMX0lOVDMyLCBMT0MwKTsKLSAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSByb290ID0gcm9vdEJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoTE9DMCwgcm9vdC5nZXRMb2NhdGlvbihPUFRJT05BTF9JTlQzMiwgMCkpOwotICAgIGFzc2VydEVxdWFscygxLCByb290LmdldExvY2F0aW9ucyhPUFRJT05BTF9JTlQzMikuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldExvY2F0aW9uc1JldHVybnNOb1BhcnNlTG9jYXRpb25zRm9yVW5rbm93bkZpZWxkKCkgewotICAgIGFzc2VydFRydWUocm9vdEJ1aWxkZXIuYnVpbGQoKS5nZXRMb2NhdGlvbnMoT1BUSU9OQUxfSU5UMzIpLmlzRW1wdHkoKSk7Ci0gICAgcm9vdEJ1aWxkZXIuc2V0TG9jYXRpb24oT1BUSU9OQUxfQk9PTEVBTiwgTE9DMCk7Ci0gICAgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUgcm9vdCA9IHJvb3RCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VHJ1ZShyb290LmdldExvY2F0aW9ucyhPUFRJT05BTF9JTlQzMikuaXNFbXB0eSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoTE9DMCwgcm9vdC5nZXRMb2NhdGlvbnMoT1BUSU9OQUxfQk9PTEVBTikuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXRMb2NhdGlvblRocm93c0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbkZvclVua25vd25GaWVsZCgpIHsKLSAgICByb290QnVpbGRlci5zZXRMb2NhdGlvbihSRVBFQVRFRF9JTlQzMiwgTE9DMCk7Ci0gICAgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUgcm9vdCA9IHJvb3RCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHJvb3QuZ2V0TmVzdGVkVHJlZShPUFRJT05BTF9JTlQzMiwgMCk7Ci0gICAgICBmYWlsKCJEaWQgbm90IGRldGVjdCB1bmtub3duIGZpZWxkIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBwYXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldExvY2F0aW9uVGhyb3dzSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uRm9ySW52YWxpZEluZGV4KCkgewotICAgIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlIHJvb3QgPSByb290QnVpbGRlci5zZXRMb2NhdGlvbihPUFRJT05BTF9JTlQzMiwgTE9DMCkuYnVpbGQoKTsKLSAgICB0cnkgewotICAgICAgcm9vdC5nZXRMb2NhdGlvbihPUFRJT05BTF9JTlQzMiwgMSk7Ci0gICAgICBmYWlsKCJJbnZhbGlkIGluZGV4IG5vdCBkZXRlY3RlZCIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgLy8gcGFzcwotICAgIH0KLSAgICB0cnkgewotICAgICAgcm9vdC5nZXRMb2NhdGlvbihPUFRJT05BTF9JTlQzMiwgLTEpOwotICAgICAgZmFpbCgiTmVnYXRpdmUgaW5kZXggbm90IGRldGVjdGVkIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBwYXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldExvY2F0aW9uc1JldHVybnNNdWx0aXBsZUxvY2F0aW9ucygpIHsKLSAgICByb290QnVpbGRlci5zZXRMb2NhdGlvbihSRVBFQVRFRF9JTlQzMiwgTE9DMCk7Ci0gICAgcm9vdEJ1aWxkZXIuc2V0TG9jYXRpb24oUkVQRUFURURfSU5UMzIsIExPQzEpOwotICAgIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlIHJvb3QgPSByb290QnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhMT0MwLCByb290LmdldExvY2F0aW9uKFJFUEVBVEVEX0lOVDMyLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKExPQzEsIHJvb3QuZ2V0TG9jYXRpb24oUkVQRUFURURfSU5UMzIsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgcm9vdC5nZXRMb2NhdGlvbnMoUkVQRUFURURfSU5UMzIpLnNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R2V0TmVzdGVkVHJlZVRocm93c0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbkZvclVua25vd25GaWVsZCgpIHsKLSAgICByb290QnVpbGRlci5zZXRMb2NhdGlvbihSRVBFQVRFRF9JTlQzMiwgTE9DMCk7Ci0gICAgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUgcm9vdCA9IHJvb3RCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHJvb3QuZ2V0TmVzdGVkVHJlZShPUFRJT05BTF9ORVNURURfTUVTU0FHRSwgMCk7Ci0gICAgICBmYWlsKCJEaWQgbm90IGRldGVjdCB1bmtub3duIGZpZWxkIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBwYXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldE5lc3RlZFRyZWVzUmV0dXJuc05vUGFyc2VJbmZvVHJlZXNGb3JVbmtub3duRmllbGQoKSB7Ci0gICAgcm9vdEJ1aWxkZXIuc2V0TG9jYXRpb24oUkVQRUFURURfSU5UMzIsIExPQzApOwotICAgIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlIHJvb3QgPSByb290QnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydFRydWUocm9vdC5nZXROZXN0ZWRUcmVlcyhPUFRJT05BTF9ORVNURURfTUVTU0FHRSkuaXNFbXB0eSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXROZXN0ZWRUcmVlVGhyb3dzSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uRm9ySW52YWxpZEluZGV4KCkgewotICAgIHJvb3RCdWlsZGVyLnNldExvY2F0aW9uKFJFUEVBVEVEX0lOVDMyLCBMT0MwKTsKLSAgICByb290QnVpbGRlci5nZXRCdWlsZGVyRm9yU3ViTWVzc2FnZUZpZWxkKE9QVElPTkFMX05FU1RFRF9NRVNTQUdFKTsKLSAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSByb290ID0gcm9vdEJ1aWxkZXIuYnVpbGQoKTsKLSAgICB0cnkgewotICAgICAgcm9vdC5nZXROZXN0ZWRUcmVlKE9QVElPTkFMX05FU1RFRF9NRVNTQUdFLCAxKTsKLSAgICAgIGZhaWwoIlN1Ym1lc3NhZ2UgaW5kZXggdGhhdCBpcyB0b28gbGFyZ2Ugbm90IGRldGVjdGVkIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICAvLyBwYXNzCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICByb290QnVpbGRlci5idWlsZCgpLmdldE5lc3RlZFRyZWUoT1BUSU9OQUxfTkVTVEVEX01FU1NBR0UsIC0xKTsKLSAgICAgIGZhaWwoIkludmFsaWQgc3VibWVzc2FnZSBpbmRleCAoLTEpIG5vdCBkZXRlY3RlZCIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgLy8gcGFzcwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXROZXN0ZWRUcmVlc1JldHVybnNTaW5nbGVUcmVlKCkgewotICAgIHJvb3RCdWlsZGVyLmdldEJ1aWxkZXJGb3JTdWJNZXNzYWdlRmllbGQoT1BUSU9OQUxfTkVTVEVEX01FU1NBR0UpOwotICAgIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlIHJvb3QgPSByb290QnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxLCByb290LmdldE5lc3RlZFRyZWVzKE9QVElPTkFMX05FU1RFRF9NRVNTQUdFKS5zaXplKCkpOwotICAgIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlIHN1YnRyZWUgPSByb290LmdldE5lc3RlZFRyZWVzKE9QVElPTkFMX05FU1RFRF9NRVNTQUdFKS5nZXQoMCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChzdWJ0cmVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHZXROZXN0ZWRUcmVlc1JldHVybnNNdWx0aXBsZVRyZWVzKCkgewotICAgIFRleHRGb3JtYXRQYXJzZUluZm9UcmVlLkJ1aWxkZXIgc3VidHJlZTFCdWlsZGVyID0KLSAgICAgICAgcm9vdEJ1aWxkZXIuZ2V0QnVpbGRlckZvclN1Yk1lc3NhZ2VGaWVsZChSRVBFQVRFRF9ORVNURURfTUVTU0FHRSk7Ci0gICAgc3VidHJlZTFCdWlsZGVyLmdldEJ1aWxkZXJGb3JTdWJNZXNzYWdlRmllbGQoRklFTERfQkIpOwotICAgIHN1YnRyZWUxQnVpbGRlci5nZXRCdWlsZGVyRm9yU3ViTWVzc2FnZUZpZWxkKEZJRUxEX0JCKTsKLSAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZS5CdWlsZGVyIHN1YnRyZWUyQnVpbGRlciA9Ci0gICAgICAgIHJvb3RCdWlsZGVyLmdldEJ1aWxkZXJGb3JTdWJNZXNzYWdlRmllbGQoUkVQRUFURURfTkVTVEVEX01FU1NBR0UpOwotICAgIHN1YnRyZWUyQnVpbGRlci5nZXRCdWlsZGVyRm9yU3ViTWVzc2FnZUZpZWxkKEZJRUxEX0JCKTsKLSAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSByb290ID0gcm9vdEJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgcm9vdC5nZXROZXN0ZWRUcmVlcyhSRVBFQVRFRF9ORVNURURfTUVTU0FHRSkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDIsIHJvb3QuZ2V0TmVzdGVkVHJlZXMoUkVQRUFURURfTkVTVEVEX01FU1NBR0UpLmdldCgwKS5nZXROZXN0ZWRUcmVlcyhGSUVMRF9CQikuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDEsIHJvb3QuZ2V0TmVzdGVkVHJlZXMoUkVQRUFURURfTkVTVEVEX01FU1NBR0UpLmdldCgxKS5nZXROZXN0ZWRUcmVlcyhGSUVMRF9CQikuc2l6ZSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0UGFyc2VMb2NhdGlvblRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFBhcnNlTG9jYXRpb25UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0MmJmYTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0UGFyc2VMb2NhdGlvblRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdCBAe2xpbmsgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb259LgotICovCi1wdWJsaWMgY2xhc3MgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb25UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHB1YmxpYyB2b2lkIHRlc3RDcmVhdGVFbXB0eSgpIHsKLSAgICBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbiBsb2NhdGlvbiA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgtMSwgLTEpOwotICAgIGFzc2VydEVxdWFscyhUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbi5FTVBUWSwgbG9jYXRpb24pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENyZWF0ZSgpIHsKLSAgICBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbiBsb2NhdGlvbiA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgyLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbG9jYXRpb24uZ2V0TGluZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbG9jYXRpb24uZ2V0Q29sdW1uKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENyZWF0ZVRocm93c0lsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbkZvckludmFsaWRJbmRleCgpIHsKLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24uY3JlYXRlKC0xLCAwKTsKLSAgICAgIGZhaWwoIlNob3VsZCB0aHJvdyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgbGluZSBpcyBsZXNzIHRoYW4gMCIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB1bnVzZWQpIHsKLSAgICAgIC8vIHBhc3MKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgwLCAtMSk7Ci0gICAgICBmYWlsKCJTaG91bGQgdGhyb3csIGNvbHVtbiA8IDAiKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gdW51c2VkKSB7Ci0gICAgICAvLyBwYXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEhhc2hDb2RlKCkgewotICAgIFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uIGxvYzAgPSBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbi5jcmVhdGUoMiwgMSk7Ci0gICAgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gbG9jMSA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgyLCAxKTsKLQotICAgIGFzc2VydEVxdWFscyhsb2MwLmhhc2hDb2RlKCksIGxvYzEuaGFzaENvZGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbi5FTVBUWS5oYXNoQ29kZSgpLCBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbi5FTVBUWS5oYXNoQ29kZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHMoKSB7Ci0gICAgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gbG9jMCA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgyLCAxKTsKLSAgICBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbiBsb2MxID0gVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24uY3JlYXRlKDEsIDIpOwotICAgIFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uIGxvYzIgPSBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbi5jcmVhdGUoMiwgMik7Ci0gICAgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gbG9jMyA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZSgyLCAxKTsKLQotICAgIGFzc2VydEVxdWFscyhsb2MwLCBsb2MzKTsKLSAgICBhc3NlcnROb3RTYW1lKGxvYzAsIGxvYzEpOwotICAgIGFzc2VydE5vdFNhbWUobG9jMCwgbG9jMik7Ci0gICAgYXNzZXJ0Tm90U2FtZShsb2MxLCBsb2MyKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2M2MxN2NkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGV4dEZvcm1hdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExMjkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlRleHRGb3JtYXQuUGFyc2VyLlNpbmd1bGFyT3ZlcndyaXRlUG9saWN5OwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLk9uZVN0cmluZzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdE9uZW9mMjsKLWltcG9ydCBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdC5Vbml0dGVzdE1zZXRXaXJlRm9ybWF0LlRlc3RNZXNzYWdlU2V0OwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciB7QGxpbmsgVGV4dEZvcm1hdH0uCi0gKgotICogVE9ETyh3ZW5ib3opOiBFeHRlbnNpb25UZXN0IGFuZCByZXN0IG9mIHRleHRfZm9ybWF0X3VuaXR0ZXN0LmNjLgotICoKLSAqIEBhdXRob3Igd2VuYm96QGdvb2dsZS5jb20gKFdlbmJvIFpodSkKLSAqLwotcHVibGljIGNsYXNzIFRleHRGb3JtYXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIC8vIEEgYmFzaWMgc3RyaW5nIHdpdGggZGlmZmVyZW50IGVzY2FwYWJsZSBjaGFyYWN0ZXJzIGZvciB0ZXN0aW5nLgotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcga0VzY2FwZVRlc3RTdHJpbmcgPQotICAgICAgIlwiQSBzdHJpbmcgd2l0aCAnIGNoYXJhY3RlcnMgXG4gYW5kIFxyIG5ld2xpbmVzIGFuZCBcdCB0YWJzIGFuZCBcMDAxICIKLSAgICAgICAgICArICJzbGFzaGVzIFxcIjsKLQotICAvLyBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhYm92ZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNoYXJhY3RlcnMgZXNjYXBlZC4KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZCA9Ci0gICAgICAiXFxcIkEgc3RyaW5nIHdpdGggXFwnIGNoYXJhY3RlcnMgXFxuIGFuZCBcXHIgbmV3bGluZXMgIgotICAgICAgICAgICsgImFuZCBcXHQgdGFicyBhbmQgXFwwMDEgc2xhc2hlcyBcXFxcIjsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWxsRmllbGRzU2V0VGV4dCA9IFRlc3RVdGlsLnJlYWRUZXh0RnJvbUZpbGUoCi0gICAgInRleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfb25lb2ZfaW1wbGVtZW50ZWQudHh0Iik7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBhbGxFeHRlbnNpb25zU2V0VGV4dCA9IFRlc3RVdGlsLnJlYWRUZXh0RnJvbUZpbGUoCi0gICAgInRleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQiKTsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXhvdGljVGV4dCA9Ci0gICAgInJlcGVhdGVkX2ludDMyOiAtMVxuIiArCi0gICAgInJlcGVhdGVkX2ludDMyOiAtMjE0NzQ4MzY0OFxuIiArCi0gICAgInJlcGVhdGVkX2ludDY0OiAtMSxcbiIgKwotICAgICJyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIgKwotICAgICJyZXBlYXRlZF91aW50MzI6IDQyOTQ5NjcyOTVcbiIgKwotICAgICJyZXBlYXRlZF91aW50MzI6IDIxNDc0ODM2NDhcbiIgKwotICAgICJyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4iICsKLSAgICAicmVwZWF0ZWRfdWludDY0OiA5MjIzMzcyMDM2ODU0Nzc1ODA4XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuMFxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjVcbiIgKwotICAgICJyZXBlYXRlZF9kb3VibGU6IDAuMTI1XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAuMTI1XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAtLjEyNVxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM0UxN1xuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM0UrMTdcbiIgKwotICAgICJyZXBlYXRlZF9kb3VibGU6IC0xLjIzZS0xN1xuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogLjIzZSsxN1xuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogLS4yM0UxN1xuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzVFMjJcbiIgKwotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM1RS0xOFxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjQ1Njc4OVxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogSW5maW5pdHlcbiIgKwotICAgICJyZXBlYXRlZF9kb3VibGU6IC1JbmZpbml0eVxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogTmFOXG4iICsKLSAgICAicmVwZWF0ZWRfc3RyaW5nOiBcIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIiIgKwotICAgICAgIlxcMzQxXFwyMTBcXDI2NFwiXG4iICsKLSAgICAicmVwZWF0ZWRfYnl0ZXM6IFwiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiXFwzNzZcIlxuIjsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgY2Fub25pY2FsRXhvdGljVGV4dCA9Ci0gICAgICBleG90aWNUZXh0LnJlcGxhY2UoIjogLiIsICI6IDAuIikucmVwbGFjZSgiOiAtLiIsICI6IC0wLiIpICAgLy8gc2hvcnQtZm9ybSBkb3VibGUKLSAgICAgIC5yZXBsYWNlKCIyM2UiLCAiMjNFIikucmVwbGFjZSgiRSsiLCAiRSIpLnJlcGxhY2UoIjAuMjNFMTciLCAiMi4zRTE2IikucmVwbGFjZSgiLCIsICIiKTsKLQotICBwcml2YXRlIFN0cmluZyBtZXNzYWdlU2V0VGV4dCA9Ci0gICAgIltwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbiIgKwotICAgICIgIGk6IDEyM1xuIiArCi0gICAgIn1cbiIgKwotICAgICJbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4iICsKLSAgICAiICBzdHI6IFwiZm9vXCJcbiIgKwotICAgICJ9XG4iOwotCi0gIHByaXZhdGUgU3RyaW5nIG1lc3NhZ2VTZXRUZXh0V2l0aFJlcGVhdGVkRXh0ZW5zaW9uID0KLSAgICAgICJbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4iICsKLSAgICAgICIgIGk6IDEyM1xuIiArCi0gICAgICAifVxuIiArCi0gICAgICAiW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0ge1xuIiArCi0gICAgICAiICBpOiA0NTZcbiIgKwotICAgICAgIn1cbiI7Ci0KLQotICBwcml2YXRlIGZpbmFsIFRleHRGb3JtYXQuUGFyc2VyIHBhcnNlcldpdGhPdmVyd3JpdGVGb3JiaWRkZW4gPQotICAgICAgVGV4dEZvcm1hdC5QYXJzZXIubmV3QnVpbGRlcigpCi0gICAgICAgICAgLnNldFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5KAotICAgICAgICAgICAgICBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeS5GT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUykKLSAgICAgICAgICAuYnVpbGQoKTsKLQotICBwcml2YXRlIGZpbmFsIFRleHRGb3JtYXQuUGFyc2VyIGRlZmF1bHRQYXJzZXIgPQotICAgICAgVGV4dEZvcm1hdC5QYXJzZXIubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0KLSAgLyoqIFByaW50IFRlc3RBbGxUeXBlcyBhbmQgY29tcGFyZSB3aXRoIGdvbGRlbiBmaWxlLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGphdmFUZXh0ID0gVGV4dEZvcm1hdC5wcmludFRvU3RyaW5nKFRlc3RVdGlsLmdldEFsbFNldCgpKTsKLQotICAgIC8vIEphdmEgbGlrZXMgdG8gYWRkIGEgdHJhaWxpbmcgIi4wIiB0byBmbG9hdHMgYW5kIGRvdWJsZXMuICBDIHByaW50ZgotICAgIC8vICh3aXRoICVnIGZvcm1hdCkgZG9lcyBub3QuICBPdXIgZ29sZGVuIGZpbGVzIGFyZSB1c2VkIGZvciBib3RoCi0gICAgLy8gQysrIGFuZCBKYXZhIFRleHRGb3JtYXQgY2xhc3Nlcywgc28gd2UgbmVlZCB0byBjb25mb3JtLgotICAgIGphdmFUZXh0ID0gamF2YVRleHQucmVwbGFjZSgiLjBcbiIsICJcbiIpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkc1NldFRleHQsIGphdmFUZXh0KTsKLSAgfQotCi0gIC8qKiBQcmludCBUZXN0QWxsVHlwZXMgYXMgQnVpbGRlciBhbmQgY29tcGFyZSB3aXRoIGdvbGRlbiBmaWxlLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRNZXNzYWdlQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN0cmluZyBqYXZhVGV4dCA9IFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhUZXN0VXRpbC5nZXRBbGxTZXRCdWlsZGVyKCkpOwotCi0gICAgLy8gSmF2YSBsaWtlcyB0byBhZGQgYSB0cmFpbGluZyAiLjAiIHRvIGZsb2F0cyBhbmQgZG91Ymxlcy4gIEMgcHJpbnRmCi0gICAgLy8gKHdpdGggJWcgZm9ybWF0KSBkb2VzIG5vdC4gIE91ciBnb2xkZW4gZmlsZXMgYXJlIHVzZWQgZm9yIGJvdGgKLSAgICAvLyBDKysgYW5kIEphdmEgVGV4dEZvcm1hdCBjbGFzc2VzLCBzbyB3ZSBuZWVkIHRvIGNvbmZvcm0uCi0gICAgamF2YVRleHQgPSBqYXZhVGV4dC5yZXBsYWNlKCIuMFxuIiwgIlxuIik7Ci0KLSAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzU2V0VGV4dCwgamF2YVRleHQpOwotICB9Ci0KLSAgLyoqIFByaW50IFRlc3RBbGxFeHRlbnNpb25zIGFuZCBjb21wYXJlIHdpdGggZ29sZGVuIGZpbGUuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RQcmludEV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgamF2YVRleHQgPSBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcoVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpKTsKLQotICAgIC8vIEphdmEgbGlrZXMgdG8gYWRkIGEgdHJhaWxpbmcgIi4wIiB0byBmbG9hdHMgYW5kIGRvdWJsZXMuICBDIHByaW50ZgotICAgIC8vICh3aXRoICVnIGZvcm1hdCkgZG9lcyBub3QuICBPdXIgZ29sZGVuIGZpbGVzIGFyZSB1c2VkIGZvciBib3RoCi0gICAgLy8gQysrIGFuZCBKYXZhIFRleHRGb3JtYXQgY2xhc3Nlcywgc28gd2UgbmVlZCB0byBjb25mb3JtLgotICAgIGphdmFUZXh0ID0gamF2YVRleHQucmVwbGFjZSgiLjBcbiIsICJcbiIpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGFsbEV4dGVuc2lvbnNTZXRUZXh0LCBqYXZhVGV4dCk7Ci0gIH0KLQotICAvLyBDcmVhdGVzIGFuIGV4YW1wbGUgdW5rbm93biBmaWVsZCBzZXQuCi0gIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0IG1ha2VVbmtub3duRmllbGRTZXQoKSB7Ci0gICAgcmV0dXJuIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEZpZWxkKDUsCi0gICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDEpCi0gICAgICAgICAgICAuYWRkRml4ZWQzMigyKQotICAgICAgICAgICAgLmFkZEZpeGVkNjQoMykKLSAgICAgICAgICAgIC5hZGRMZW5ndGhEZWxpbWl0ZWQoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIjQiKSkKLSAgICAgICAgICAgIC5hZGRHcm91cCgKLSAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZEZpZWxkKDEwLAotICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoNSkKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmFkZEZpZWxkKDgsCi0gICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDEpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDIpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDMpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmFkZEZpZWxkKDE1LAotICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZFZhcmludCgweEFCQ0RFRjEyMzQ1Njc4OTBMKQotICAgICAgICAgICAgLmFkZEZpeGVkMzIoMHhBQkNEMTIzNCkKLSAgICAgICAgICAgIC5hZGRGaXhlZDY0KDB4QUJDREVGMTIzNDU2Nzg5MEwpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRVbmtub3duRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCBwcmludGluZyBvZiB1bmtub3duIGZpZWxkcyBpbiBhIG1lc3NhZ2UuCi0KLSAgICBUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgVGVzdEVtcHR5TWVzc2FnZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFVua25vd25GaWVsZHMobWFrZVVua25vd25GaWVsZFNldCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygKLSAgICAgICI1OiAxXG4iICsKLSAgICAgICI1OiAweDAwMDAwMDAyXG4iICsKLSAgICAgICI1OiAweDAwMDAwMDAwMDAwMDAwMDNcbiIgKwotICAgICAgIjU6IFwiNFwiXG4iICsKLSAgICAgICI1IHtcbiIgKwotICAgICAgIiAgMTA6IDVcbiIgKwotICAgICAgIn1cbiIgKwotICAgICAgIjg6IDFcbiIgKwotICAgICAgIjg6IDJcbiIgKwotICAgICAgIjg6IDNcbiIgKwotICAgICAgIjE1OiAxMjM3OTgxMzgxMjE3Nzg5MzUyMFxuIiArCi0gICAgICAiMTU6IDB4YWJjZDEyMzRcbiIgKwotICAgICAgIjE1OiAweGFiY2RlZjEyMzQ1Njc4OTBcbiIsCi0gICAgICBUZXh0Rm9ybWF0LnByaW50VG9TdHJpbmcobWVzc2FnZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFByaW50RmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGF0YUZpZWxkID0KLSAgICAgIE9uZVN0cmluZy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJkYXRhIik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgImRhdGE6IFwidGVzdCBkYXRhXCJcbiIsCi0gICAgICBUZXh0Rm9ybWF0LnByaW50RmllbGRUb1N0cmluZyhkYXRhRmllbGQsICJ0ZXN0IGRhdGEiKSk7Ci0KLSAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3Igb3B0aW9uYWxGaWVsZCA9Ci0gICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKLSAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig0MikuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7XG4gIGJiOiA0MlxufVxuIiwKLSAgICAgIFRleHRGb3JtYXQucHJpbnRGaWVsZFRvU3RyaW5nKG9wdGlvbmFsRmllbGQsIHZhbHVlKSk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIEJ5dGVTdHJpbmcgZnJvbSBhIFN0cmluZyBjb250YWluaW5nIG9ubHkgOC1iaXQKLSAgICogY2hhcmFjdGVycy4gIFRoZSBjaGFyYWN0ZXJzIGFyZSBjb252ZXJ0ZWQgZGlyZWN0bHkgdG8gYnl0ZXMsICpub3QqCi0gICAqIGVuY29kZWQgdXNpbmcgVVRGLTguCi0gICAqLwotICBwcml2YXRlIEJ5dGVTdHJpbmcgYnl0ZXMoU3RyaW5nIHN0cikgewotICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKHN0ci5nZXRCeXRlcyhJbnRlcm5hbC5JU09fODg1OV8xKSk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIEJ5dGVTdHJpbmcgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKLSAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycwotICAgKiBhYm91dCBwcmVjaXNpb24uCi0gICAqLwotICBwcml2YXRlIEJ5dGVTdHJpbmcgYnl0ZXMoaW50Li4uIGJ5dGVzQXNJbnRzKSB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzQXNJbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBieXRlc1tpXSA9IChieXRlKSBieXRlc0FzSW50c1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFByaW50RXhvdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgLy8gU2lnbmVkIHZzLiB1bnNpZ25lZCBudW1iZXJzLgotICAgICAgLmFkZFJlcGVhdGVkSW50MzIgKC0xKQotICAgICAgLmFkZFJlcGVhdGVkVWludDMyKC0xKQotICAgICAgLmFkZFJlcGVhdGVkSW50NjQgKC0xKQotICAgICAgLmFkZFJlcGVhdGVkVWludDY0KC0xKQotCi0gICAgICAuYWRkUmVwZWF0ZWRJbnQzMiAoMSAgPDwgMzEpCi0gICAgICAuYWRkUmVwZWF0ZWRVaW50MzIoMSAgPDwgMzEpCi0gICAgICAuYWRkUmVwZWF0ZWRJbnQ2NCAoMUwgPDwgNjMpCi0gICAgICAuYWRkUmVwZWF0ZWRVaW50NjQoMUwgPDwgNjMpCi0KLSAgICAgIC8vIEZsb2F0cyBvZiB2YXJpb3VzIHByZWNpc2lvbnMgYW5kIGV4cG9uZW50cy4KLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzLjUpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMC4xMjUpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLjEyNSkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgtLjEyNSkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjNlMTUpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzZTE1KQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKC0xLjIzZS0xNykKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSguMjNlMTcpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLTIzZTE1KQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyMy41ZTIwKQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyMy41ZS0yMCkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMuNDU2Nzg5KQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZShEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoRG91YmxlLk5hTikKLQotICAgICAgLy8gU3RyaW5ncyBhbmQgYnl0ZXMgdGhhdCBuZWVkaW5nIGVzY2FwaW5nLgotICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCJcdTEyMzQiKQotICAgICAgLmFkZFJlcGVhdGVkQnl0ZXMoYnl0ZXMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIlx1MDBmZSIpKQotICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoY2Fub25pY2FsRXhvdGljVGV4dCwgbWVzc2FnZS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQcmludE1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KLSAgICAgIFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uLAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkuc2V0SSgxMjMpLmJ1aWxkKCkpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oCi0gICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24sCi0gICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm5ld0J1aWxkZXIoKS5zZXRTdHIoImZvbyIpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VTZXRUZXh0LCBtZXNzYWdlU2V0LnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXh0Rm9ybWF0Lm1lcmdlKGFsbEZpZWxkc1NldFRleHQsIGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChidWlsZGVyLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShuZXcgU3RyaW5nUmVhZGVyKGFsbEZpZWxkc1NldFRleHQpLCBidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoYnVpbGRlci5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShhbGxFeHRlbnNpb25zU2V0VGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksCi0gICAgICAgICAgICAgICAgICAgICBidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KGJ1aWxkZXIuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VDb21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIG9yaWdpbmFsID0gInJlcGVhdGVkX2Zsb2F0OiBpbmZcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLWluZlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBuYW5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogaW5mZlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtaW5mZlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBuYW5mXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMGZcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogaW5maW5pdHlmXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eWZcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IGluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtaW5maW5pdHlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IG5hblxuIjsKLSAgICBTdHJpbmcgY2Fub25pY2FsID0gICJyZXBlYXRlZF9mbG9hdDogSW5maW5pdHlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtSW5maW5pdHlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBOYU5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBJbmZpbml0eVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IE5hTlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IEluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLUluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IEluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IC1JbmZpbml0eVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiI7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShvcmlnaW5hbCwgYnVpbGRlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKGNhbm9uaWNhbCwgYnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlRXhvdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShleG90aWNUZXh0LCBidWlsZGVyKTsKLQotICAgIC8vIFRvbyBsYXp5IHRvIGNoZWNrIHRoaW5ncyBpbmRpdmlkdWFsbHkuICBEb24ndCB0cnkgdG8gZGVidWcgdGhpcwotICAgIC8vIGlmIHRlc3RQcmludEV4b3RpYygpIGlzIGZhaWxpbmcuCi0gICAgYXNzZXJ0RXF1YWxzKGNhbm9uaWNhbEV4b3RpY1RleHQsIGJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKLSAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pOwotCi0gICAgVGVzdE1lc3NhZ2VTZXQuQnVpbGRlciBidWlsZGVyID0gVGVzdE1lc3NhZ2VTZXQubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UobWVzc2FnZVNldFRleHQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKLSAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlU2V0Lmhhc0V4dGVuc2lvbigKLSAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCi0gICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2VTZXQuaGFzRXh0ZW5zaW9uKAotICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAotICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldFN0cigpKTsKLQotICAgIGJ1aWxkZXIgPSBUZXN0TWVzc2FnZVNldC5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShtZXNzYWdlU2V0VGV4dFdpdGhSZXBlYXRlZEV4dGVuc2lvbiwgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgIGJ1aWxkZXIpOwotICAgIG1lc3NhZ2VTZXQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCi0gICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXRXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOwotICAgIGV4dGVuc2lvblJlZ2lzdHJ5LmFkZChUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbik7Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKLQotICAgIFRlc3RNZXNzYWdlU2V0LkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKTsKLSAgICBwYXJzZXJXaXRoT3ZlcndyaXRlRm9yYmlkZGVuLm1lcmdlKAotICAgICAgICBtZXNzYWdlU2V0VGV4dCwgZXh0ZW5zaW9uUmVnaXN0cnksIGJ1aWxkZXIpOwotICAgIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCi0gICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKS5nZXRJKCkpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCi0gICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0U3RyKCkpOwotCi0gICAgYnVpbGRlciA9IFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKTsKLSAgICB0cnkgewotICAgICAgcGFyc2VyV2l0aE92ZXJ3cml0ZUZvcmJpZGRlbi5tZXJnZSgKLSAgICAgICAgICBtZXNzYWdlU2V0VGV4dFdpdGhSZXBlYXRlZEV4dGVuc2lvbiwgZXh0ZW5zaW9uUmVnaXN0cnksIGJ1aWxkZXIpOwotICAgICAgZmFpbCgiZXhwZWN0ZWQgcGFyc2UgZXhjZXB0aW9uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoIjY6MTogTm9uLXJlcGVhdGVkIGZpZWxkICIKLSAgICAgICAgICArICJcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb25cIiIKLSAgICAgICAgICArICIgY2Fubm90IGJlIG92ZXJ3cml0dGVuLiIsCi0gICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU51bWVyaWNFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfbmVzdGVkX2VudW06IDIiLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBidWlsZGVyLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFuZ2xlQnJhY2tldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJPcHRpb25hbEdyb3VwOiA8IGE6IDEgPiIsIGJ1aWxkZXIpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5oYXNPcHRpb25hbEdyb3VwKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9wdGlvbmFsR3JvdXAoKS5nZXRBKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UoCi0gICAgICAiIyB0aGlzIGlzIGEgY29tbWVudFxuIiArCi0gICAgICAib3B0aW9uYWxfaW50MzI6IDEgICMgYW5vdGhlciBjb21tZW50XG4iICsKLSAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIiArCi0gICAgICAiIyBFT0YgY29tbWVudCIsIGJ1aWxkZXIpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxJbnQ2NCgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRQYXJzZUVycm9yKFN0cmluZyBlcnJvciwgU3RyaW5nIHRleHQpIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5tZXJnZSh0ZXh0LCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIHBhcnNlIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LlBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscyhlcnJvciwgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFBhcnNlRXJyb3JXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKFN0cmluZyBlcnJvciwKLSAgICAgIFN0cmluZyB0ZXh0KSB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHBhcnNlcldpdGhPdmVyd3JpdGVGb3JiaWRkZW4ubWVyZ2UoCi0gICAgICAgICAgdGV4dCwgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgYnVpbGRlcik7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBwYXJzZSBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXJyb3IsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFRlc3RBbGxUeXBlcyBhc3NlcnRQYXJzZVN1Y2Nlc3NXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKAotICAgICAgU3RyaW5nIHRleHQpIHRocm93cyBUZXh0Rm9ybWF0LlBhcnNlRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBwYXJzZXJXaXRoT3ZlcndyaXRlRm9yYmlkZGVuLm1lcmdlKAotICAgICAgICB0ZXh0LCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBidWlsZGVyKTsKLSAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlRXJyb3JzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjE2OiBFeHBlY3RlZCBcIjpcIi4iLAotICAgICAgIm9wdGlvbmFsX2ludDMyIDEyMyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyMzogRXhwZWN0ZWQgaWRlbnRpZmllci4gRm91bmQgJz8nIiwKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogPyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToxODogQ291bGRuJ3QgcGFyc2UgaW50ZWdlcjogTnVtYmVyIG11c3QgYmUgcG9zaXRpdmU6IC0xIiwKLSAgICAgICJvcHRpb25hbF91aW50MzI6IC0xIik7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjE3OiBDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiBOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgc2lnbmVkICIgKwotICAgICAgICAiaW50ZWdlcjogODIzMDE0ODEyOTA4NDkwMTIzODUyMzAxNTciLAotICAgICAgIm9wdGlvbmFsX2ludDMyOiA4MjMwMTQ4MTI5MDg0OTAxMjM4NTIzMDE1NyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToxNjogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIsCi0gICAgICAib3B0aW9uYWxfYm9vbDogbWF5YmUiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTY6IEV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi4iLAotICAgICAgIm9wdGlvbmFsX2Jvb2w6IDIiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTg6IEV4cGVjdGVkIHN0cmluZy4iLAotICAgICAgIm9wdGlvbmFsX3N0cmluZzogMTIzIik7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjE4OiBTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIiwKLSAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwidWVvYXVhb2UiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLAotICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJ1ZW9hdWFvZVxuIiArCi0gICAgICAib3B0aW9uYWxfaW50MzI6IDEyMyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToxODogSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXHonIiwKLSAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiXFx6XCIiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLAotICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJ1ZW9hdWFvZVxuIiArCi0gICAgICAib3B0aW9uYWxfaW50MzI6IDEyMyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyOiBFeHRlbnNpb24gXCJub3N1Y2hleHRcIiBub3QgZm91bmQgaW4gdGhlIEV4dGVuc2lvblJlZ2lzdHJ5LiIsCi0gICAgICAiW25vc3VjaGV4dF06IDEyMyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyMDogRXh0ZW5zaW9uIFwicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXCIgZG9lcyAiICsKLSAgICAgICAgIm5vdCBleHRlbmQgbWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIuIiwKLSAgICAgICJbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogMTIzIik7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjE6IE1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCAiICsKLSAgICAgICAgIm5hbWVkIFwibm9zdWNoZmllbGRcIi4iLAotICAgICAgIm5vc3VjaGZpZWxkOiAxMjMiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MjE6IEV4cGVjdGVkIFwiPlwiLiIsCi0gICAgICAiT3B0aW9uYWxHcm91cCA8IGE6IDEiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MjM6IEVudW0gdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtXCIgaGFzIG5vICIgKwotICAgICAgICAidmFsdWUgbmFtZWQgXCJOT19TVUNIX1ZBTFVFXCIuIiwKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogTk9fU1VDSF9WQUxVRSIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyMzogRW51bSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW1cIiBoYXMgbm8gIiArCi0gICAgICAgICJ2YWx1ZSB3aXRoIG51bWJlciAxMjMuIiwKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogMTIzIik7Ci0KLSAgICAvLyBEZWxpbWl0ZXJzIG11c3QgbWF0Y2guCi0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjIyOiBFeHBlY3RlZCBpZGVudGlmaWVyLiBGb3VuZCAnfSciLAotICAgICAgIk9wdGlvbmFsR3JvdXAgPCBhOiAxIH0iKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MjI6IEV4cGVjdGVkIGlkZW50aWZpZXIuIEZvdW5kICc+JyIsCi0gICAgICAiT3B0aW9uYWxHcm91cCB7IGE6IDEgPiIpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXNjYXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gRXNjYXBlIHNlcXVlbmNlcy4KLSAgICBhc3NlcnRFcXVhbHMoIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIlxcMTc3IiwKLSAgICAgIFRleHRGb3JtYXQuZXNjYXBlQnl0ZXMoYnl0ZXMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIlwxNzciKSkpOwotICAgIGFzc2VydEVxdWFscygiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiXFwxNzciLAotICAgICAgVGV4dEZvcm1hdC5lc2NhcGVUZXh0KCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCJcMTc3IikpOwotICAgIGFzc2VydEVxdWFscyhieXRlcygiXDBcMDAxXDAwN1xiXGZcblxyXHRcMDEzXFxcJ1wiIiksCi0gICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlQnl0ZXMoIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIiIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIiIsCi0gICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIikpOwotICAgIGFzc2VydEVxdWFscyhrRXNjYXBlVGVzdFN0cmluZ0VzY2FwZWQsCi0gICAgICBUZXh0Rm9ybWF0LmVzY2FwZVRleHQoa0VzY2FwZVRlc3RTdHJpbmcpKTsKLSAgICBhc3NlcnRFcXVhbHMoa0VzY2FwZVRlc3RTdHJpbmcsCi0gICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dChrRXNjYXBlVGVzdFN0cmluZ0VzY2FwZWQpKTsKLQotICAgIC8vIEludmFyaWFudAotICAgIGFzc2VydEVxdWFscygiaGVsbG8iLAotICAgICAgICBUZXh0Rm9ybWF0LmVzY2FwZUJ5dGVzKGJ5dGVzKCJoZWxsbyIpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsCi0gICAgICAgIFRleHRGb3JtYXQuZXNjYXBlVGV4dCgiaGVsbG8iKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGJ5dGVzKCJoZWxsbyIpLAotICAgICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlQnl0ZXMoImhlbGxvIikpOwotICAgIGFzc2VydEVxdWFscygiaGVsbG8iLAotICAgICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiaGVsbG8iKSk7Ci0KLSAgICAvLyBVbmljb2RlIGhhbmRsaW5nLgotICAgIGFzc2VydEVxdWFscygiXFwzNDFcXDIxMFxcMjY0IiwgVGV4dEZvcm1hdC5lc2NhcGVUZXh0KCJcdTEyMzQiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcXDM0MVxcMjEwXFwyNjQiLAotICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LmVzY2FwZUJ5dGVzKGJ5dGVzKDB4ZTEsIDB4ODgsIDB4YjQpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFwzNDFcXDIxMFxcMjY0IikpOwotICAgIGFzc2VydEVxdWFscyhieXRlcygweGUxLCAweDg4LCAweGI0KSwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXDM0MVxcMjEwXFwyNjQiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFx4ZTFcXHg4OFxceGI0IikpOwotICAgIGFzc2VydEVxdWFscyhieXRlcygweGUxLCAweDg4LCAweGI0KSwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXHhlMVxceDg4XFx4YjQiKSk7Ci0KLSAgICAvLyBIYW5kbGluZyBvZiBzdHJpbmdzIHdpdGggdW5lc2NhcGVkIFVuaWNvZGUgY2hhcmFjdGVycyA+IDI1NS4KLSAgICBmaW5hbCBTdHJpbmcgemggPSAiXHU5OTk5XHU2ZTJmXHU0ZTBhXHU2ZDc3XHVkODRmXHVkZjgwXHU4YzUwXHU5MjgwXHU4ODRjIjsKLSAgICBCeXRlU3RyaW5nIHpoQnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHpoKTsKLSAgICBhc3NlcnRFcXVhbHMoemhCeXRlU3RyaW5nLCBUZXh0Rm9ybWF0LnVuZXNjYXBlQnl0ZXMoemgpKTsKLQotICAgIC8vIEVycm9ycy4KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxceCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LkludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVUZXh0KCJcXHoiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFwiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUludGVnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDAsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggICAgICAgICAgIjAiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAxLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAgICAgICIxIikpOwotICAgIGFzc2VydEVxdWFscyggICAgICAgICAtMSwgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAgICAgICAgICItMSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgMTIzNDUsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggICAgICAiMTIzNDUiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgLTEyMzQ1LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAiLTEyMzQ1IikpOwotICAgIGFzc2VydEVxdWFscyggMjE0NzQ4MzY0NywgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAiMjE0NzQ4MzY0NyIpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDgsIFRleHRGb3JtYXQucGFyc2VJbnQzMigiLTIxNDc0ODM2NDgiKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgICAgICAgIDAsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoICAgICAgICAgIjAiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAgICAgICAxLCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCAgICAgICAgICIxIikpOwotICAgIGFzc2VydEVxdWFscyggICAgICAgICAgICAxMjM0NSwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMiggICAgICIxMjM0NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgIDIxNDc0ODM2NDcsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIjIxNDc0ODM2NDciKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChpbnQpIDIxNDc0ODM2NDhMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCIyMTQ3NDgzNjQ4IikpOwotICAgIGFzc2VydEVxdWFscygoaW50KSA0Mjk0OTY3Mjk1TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMigiNDI5NDk2NzI5NSIpKTsKLQotICAgIGFzc2VydEVxdWFscyggICAgICAgICAgMEwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICAgICAgIjAiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAxTCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAgICAgICAgICAiMSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgLTFMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICAgICAgICAgIi0xIikpOwotICAgIGFzc2VydEVxdWFscyggICAgICAxMjM0NUwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICAiMTIzNDUiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgLTEyMzQ1TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAgICAgIi0xMjM0NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDIxNDc0ODM2NDdMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICIyMTQ3NDgzNjQ3IikpOwotICAgIGFzc2VydEVxdWFscygtMjE0NzQ4MzY0OEwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTIxNDc0ODM2NDgiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCA0Mjk0OTY3Mjk1TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAiNDI5NDk2NzI5NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTZMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICI0Mjk0OTY3Mjk2IikpOwotICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikpOwotICAgIGFzc2VydEVxdWFscygtOTIyMzM3MjAzNjg1NDc3NTgwOEwsCi0gICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDBMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICAgICAiMCIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDFMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICAgICAiMSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgMTIzNDVMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICIxMjM0NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDIxNDc0ODM2NDdMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiMjE0NzQ4MzY0NyIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTVMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiNDI5NDk2NzI5NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTZMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiNDI5NDk2NzI5NiIpKTsKLSAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsCi0gICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50NjQoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC05MjIzMzcyMDM2ODU0Nzc1ODA4TCwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiOTIyMzM3MjAzNjg1NDc3NTgwOCIpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTFMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpKTsKLQotICAgIC8vIEhleAotICAgIGFzc2VydEVxdWFscygweDEyMzRhYmNkLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIjB4MTIzNGFiY2QiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0weDEyMzRhYmNkLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIi0weDEyMzRhYmNkIikpOwotICAgIGFzc2VydEVxdWFscygtMSwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpOwotICAgIGFzc2VydEVxdWFscygweDdmZmZmZmZmZmZmZmZmZmZMLAotICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKTsKLQotICAgIC8vIE9jdGFsCi0gICAgYXNzZXJ0RXF1YWxzKDAxMjM0NTY3LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIjAxMjM0NTY3IikpOwotCi0gICAgLy8gT3V0LW9mLXJhbmdlCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQzMigiMjE0NzQ4MzY0OCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIi0yMTQ3NDgzNjQ5Iik7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIjQyOTQ5NjcyOTYiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMigiLTEiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA4Iik7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiMTg0NDY3NDQwNzM3MDk1NTE2MTYiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiLTEiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICAvLyBOb3QgYSBudW1iZXIuCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQzMigiYWJjZCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIFN0cmluZyB6aCA9ICJcdTk5OTlcdTZlMmZcdTRlMGFcdTZkNzdcdWQ4NGZcdWRmODBcdThjNTBcdTkyODBcdTg4NGMiOwotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX3N0cmluZzogXCIiICsgemggKyAiXCIiLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoemgsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VMb25nU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGxvbmdUZXh0ID0KLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOwotCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfc3RyaW5nOiBcIiIgKyBsb25nVGV4dCArICJcIiIsIGJ1aWxkZXIpOwotICAgIGFzc2VydEVxdWFscyhsb25nVGV4dCwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUJvb2xlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgZ29vZFRleHQgPQotICAgICAgICAicmVwZWF0ZWRfYm9vbDogdCAgcmVwZWF0ZWRfYm9vbCA6IDBcbiIgKwotICAgICAgICAicmVwZWF0ZWRfYm9vbCA6ZiByZXBlYXRlZF9ib29sOjFcbiIgKwotICAgICAgICAicmVwZWF0ZWRfYm9vbDogRmFsc2UgcmVwZWF0ZWRfYm9vbDogVHJ1ZSI7Ci0gICAgU3RyaW5nIGdvb2RUZXh0Q2Fub25pY2FsID0KLSAgICAgICAgInJlcGVhdGVkX2Jvb2w6IHRydWVcbiIgKwotICAgICAgICAicmVwZWF0ZWRfYm9vbDogZmFsc2VcbiIgKwotICAgICAgICAicmVwZWF0ZWRfYm9vbDogZmFsc2VcbiIgKwotICAgICAgICAicmVwZWF0ZWRfYm9vbDogdHJ1ZVxuIiArCi0gICAgICAgICJyZXBlYXRlZF9ib29sOiBmYWxzZVxuIiArCi0gICAgICAgICJyZXBlYXRlZF9ib29sOiB0cnVlXG4iOwotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UoZ29vZFRleHQsIGJ1aWxkZXIpOwotICAgIGFzc2VydEVxdWFscyhnb29kVGV4dENhbm9uaWNhbCwgYnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCkpOwotCi0gICAgdHJ5IHsKLSAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJhZEJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfYm9vbDoyIiwgYmFkQnVpbGRlcik7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKFRleHRGb3JtYXQuUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLSAgICB0cnkgewotICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYmFkQnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJvcHRpb25hbF9ib29sOiBmb28iLCBiYWRCdWlsZGVyKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlQWRqYWNlbnRTdHJpbmdMaXRlcmFscygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIiAnY29yZ2UnIFwiZ3JhdWx0XCIiLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoImZvb2NvcmdlZ3JhdWx0IiwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQcmludEZpZWxkVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIlwiSGVsbG9cIiIsICJIZWxsbyIsICJyZXBlYXRlZF9zdHJpbmciKTsKLSAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIjEyMy4wIiwgIDEyM2YsICJyZXBlYXRlZF9mbG9hdCIpOwotICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTIzLjAiLCAgMTIzZCwgInJlcGVhdGVkX2RvdWJsZSIpOwotICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTIzIiwgIDEyMywgInJlcGVhdGVkX2ludDMyIik7Ci0gICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxMjMiLCAgMTIzTCwgInJlcGVhdGVkX2ludDY0Iik7Ci0gICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCJ0cnVlIiwgIHRydWUsICJyZXBlYXRlZF9ib29sIik7Ci0gICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCI0Mjk0OTY3Mjk1IiwgMHhGRkZGRkZGRiwgInJlcGVhdGVkX3VpbnQzMiIpOwotICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTg0NDY3NDQwNzM3MDk1NTE2MTUiLCAgMHhGRkZGRkZGRkZGRkZGRkZGTCwKLSAgICAgICAgInJlcGVhdGVkX3VpbnQ2NCIpOwotICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiXCJcXDAwMVxcMDAyXFwwMDNcIiIsCi0gICAgICAgIEJ5dGVTdHJpbmcuY29weUZyb20obmV3IGJ5dGVbXSB7MSwgMiwgM30pLCAicmVwZWF0ZWRfYnl0ZXMiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRQcmludEZpZWxkVmFsdWUoU3RyaW5nIGV4cGVjdCwgT2JqZWN0IHZhbHVlLAotICAgICAgU3RyaW5nIGZpZWxkTmFtZSkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5wcmludEZpZWxkVmFsdWUoCi0gICAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKGZpZWxkTmFtZSksCi0gICAgICAgIHZhbHVlLCBzYik7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdCwgc2IudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnREZWJ1Z1N0cmluZygpIHsKLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDQyIH0gcmVwZWF0ZWRfaW50MzI6IDEiCi0gICAgICAgICsgIiByZXBlYXRlZF91aW50MzI6IDIiLAotICAgICAgICBUZXh0Rm9ybWF0LnNob3J0RGVidWdTdHJpbmcoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZFJlcGVhdGVkSW50MzIoMSkKLSAgICAgICAgICAgIC5hZGRSZXBlYXRlZFVpbnQzMigyKQotICAgICAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig0MikuYnVpbGQoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnREZWJ1Z1N0cmluZ19maWVsZCgpIHsKLSAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGF0YUZpZWxkID0KLSAgICAgIE9uZVN0cmluZy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJkYXRhIik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgImRhdGE6IFwidGVzdCBkYXRhXCIiLAotICAgICAgVGV4dEZvcm1hdC5zaG9ydERlYnVnU3RyaW5nKGRhdGFGaWVsZCwgInRlc3QgZGF0YSIpKTsKLQotICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBvcHRpb25hbEZpZWxkID0KLSAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOwotICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDQyKS5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDQyIH0iLAotICAgICAgVGV4dEZvcm1hdC5zaG9ydERlYnVnU3RyaW5nKG9wdGlvbmFsRmllbGQsIHZhbHVlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2hvcnREZWJ1Z1N0cmluZ191bmtub3duKCkgewotICAgIGFzc2VydEVxdWFscygiNTogMSA1OiAweDAwMDAwMDAyIDU6IDB4MDAwMDAwMDAwMDAwMDAwMyA1OiBcIjRcIiA1IHsgMTA6IDUgfSIKLSAgICAgICAgKyAiIDg6IDEgODogMiA4OiAzIDE1OiAxMjM3OTgxMzgxMjE3Nzg5MzUyMCAxNTogMHhhYmNkMTIzNCAxNToiCi0gICAgICAgICsgIiAweGFiY2RlZjEyMzQ1Njc4OTAiLAotICAgICAgICBUZXh0Rm9ybWF0LnNob3J0RGVidWdTdHJpbmcobWFrZVVua25vd25GaWVsZFNldCgpKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUb1VuaWNvZGVTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiYWJjXHUzMDQyZWZnXCJcbiIgKwotICAgICAgICAib3B0aW9uYWxfYnl0ZXM6IFwiXFwzNDNcXDIwMVxcMjAyXCJcbiIgKwotICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcIlx1MzA5M1hZWlwiXG4iLAotICAgICAgICBUZXh0Rm9ybWF0LnByaW50VG9Vbmljb2RlU3RyaW5nKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiYWJjXHUzMDQyZWZnIikKLSAgICAgICAgICAgIC5zZXRPcHRpb25hbEJ5dGVzKGJ5dGVzKDB4ZTMsIDB4ODEsIDB4ODIpKQotICAgICAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJcdTMwOTNYWVoiKQotICAgICAgICAgICAgLmJ1aWxkKCkpKTsKLQotICAgIC8vIERvdWJsZSBxdW90ZXMgYW5kIGJhY2tzbGFzaGVzIHNob3VsZCBiZSBlc2NhcGVkCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAib3B0aW9uYWxfc3RyaW5nOiBcImFcXFxcYmNcXFwiZWZcXFwiZ1wiXG4iLAotICAgICAgICBUZXh0Rm9ybWF0LnByaW50VG9Vbmljb2RlU3RyaW5nKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiYVxcYmNcImVmXCJnIikKLSAgICAgICAgICAgIC5idWlsZCgpKSk7Ci0KLSAgICAvLyBUZXN0IGVzY2FwaW5nIHJvdW5kdHJpcAotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoImFcXGJjXFxcImVmXCJnIikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShUZXh0Rm9ybWF0LnByaW50VG9Vbmljb2RlU3RyaW5nKG1lc3NhZ2UpLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZygpLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFByaW50VG9Vbmljb2RlU3RyaW5nV2l0aE5ld2xpbmVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gTm8gbmV3bGluZXMgYXQgc3RhcnQgYW5kIGVuZAotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfc3RyaW5nOiBcInRlc3QgbmV3bGluZXNcXG5cXG5pblxcbnN0cmluZ1wiXG4iLAotICAgICAgICBUZXh0Rm9ybWF0LnByaW50VG9Vbmljb2RlU3RyaW5nKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygidGVzdCBuZXdsaW5lc1xuXG5pblxuc3RyaW5nIikKLSAgICAgICAgICAgIC5idWlsZCgpKSk7Ci0KLSAgICAvLyBOZXdsaW5lcyBhdCBzdGFydCBhbmQgZW5kCi0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9zdHJpbmc6IFwiXFxudGVzdFxcbm5ld2xpbmVzXFxuXFxuaW5cXG5zdHJpbmdcXG5cIlxuIiwKLSAgICAgICAgVGV4dEZvcm1hdC5wcmludFRvVW5pY29kZVN0cmluZyhUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoIlxudGVzdFxubmV3bGluZXNcblxuaW5cbnN0cmluZ1xuIikKLSAgICAgICAgICAgIC5idWlsZCgpKSk7Ci0KLSAgICAvLyBTdHJpbmdzIHdpdGggMCwgMSBhbmQgMiBuZXdsaW5lcy4KLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX3N0cmluZzogXCJcIlxuIiwKLSAgICAgICAgVGV4dEZvcm1hdC5wcmludFRvVW5pY29kZVN0cmluZyhUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoIiIpCi0gICAgICAgICAgICAuYnVpbGQoKSkpOwotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfc3RyaW5nOiBcIlxcblwiXG4iLAotICAgICAgICBUZXh0Rm9ybWF0LnByaW50VG9Vbmljb2RlU3RyaW5nKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiXG4iKQotICAgICAgICAgICAgLmJ1aWxkKCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX3N0cmluZzogXCJcXG5cXG5cIlxuIiwKLSAgICAgICAgVGV4dEZvcm1hdC5wcmludFRvVW5pY29kZVN0cmluZyhUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoIlxuXG4iKQotICAgICAgICAgICAgLmJ1aWxkKCkpKTsKLQotICAgIC8vIFRlc3QgZXNjYXBpbmcgcm91bmR0cmlwCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiXG50ZXN0XG5uZXdsaW5lc1xuXG5pblxuc3RyaW5nXG4iKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXh0Rm9ybWF0Lm1lcmdlKFRleHRGb3JtYXQucHJpbnRUb1VuaWNvZGVTdHJpbmcobWVzc2FnZSksIGJ1aWxkZXIpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nKCksIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRUb1VuaWNvZGVTdHJpbmdfdW5rbm93bigpIHsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICIxOiBcIlxcMzQzXFwyMDFcXDIwMlwiXG4iLAotICAgICAgICBUZXh0Rm9ybWF0LnByaW50VG9Vbmljb2RlU3RyaW5nKFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaWVsZCgxLAotICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKGJ5dGVzKDB4ZTMsIDB4ODEsIDB4ODIpKS5idWlsZCgpKQotICAgICAgICAgICAgLmJ1aWxkKCkpKTsKLSAgfQotCi0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlTm9uUmVwZWF0ZWRGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRQYXJzZVN1Y2Nlc3NXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKAotICAgICAgICAicmVwZWF0ZWRfaW50MzI6IDFcbiIgKwotICAgICAgICAicmVwZWF0ZWRfaW50MzI6IDJcbiIpOwotICAgIGFzc2VydFBhcnNlU3VjY2Vzc1dpdGhPdmVyd3JpdGVGb3JiaWRkZW4oCi0gICAgICAgICJSZXBlYXRlZEdyb3VwIHsgYTogMSB9XG4iICsKLSAgICAgICAgIlJlcGVhdGVkR3JvdXAgeyBhOiAyIH1cbiIpOwotICAgIGFzc2VydFBhcnNlU3VjY2Vzc1dpdGhPdmVyd3JpdGVGb3JiaWRkZW4oCi0gICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAxIH1cbiIgKwotICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBiYjogMiB9XG4iKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yV2l0aE92ZXJ3cml0ZUZvcmJpZGRlbigKLSAgICAgICAgIjM6MTc6IE5vbi1yZXBlYXRlZCBmaWVsZCAiICsKLSAgICAgICAgIlwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLm9wdGlvbmFsX2ludDMyXCIgIiArCi0gICAgICAgICJjYW5ub3QgYmUgb3ZlcndyaXR0ZW4uIiwKLSAgICAgICAgIm9wdGlvbmFsX2ludDMyOiAxXG4iICsKLSAgICAgICAgIm9wdGlvbmFsX2Jvb2w6IHRydWVcbiIgKwotICAgICAgICAib3B0aW9uYWxfaW50MzI6IDFcbiIpOwotICAgIGFzc2VydFBhcnNlRXJyb3JXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKAotICAgICAgICAiMjoxNzogTm9uLXJlcGVhdGVkIGZpZWxkICIgKwotICAgICAgICAiXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMub3B0aW9uYWxncm91cFwiICIgKwotICAgICAgICAiY2Fubm90IGJlIG92ZXJ3cml0dGVuLiIsCi0gICAgICAgICJPcHRpb25hbEdyb3VwIHsgYTogMSB9XG4iICsKLSAgICAgICAgIk9wdGlvbmFsR3JvdXAgeyB9XG4iKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yV2l0aE92ZXJ3cml0ZUZvcmJpZGRlbigKLSAgICAgICAgIjI6MzM6IE5vbi1yZXBlYXRlZCBmaWVsZCAiICsKLSAgICAgICAgIlwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlXCIgIiArCi0gICAgICAgICJjYW5ub3QgYmUgb3ZlcndyaXR0ZW4uIiwKLSAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgfVxuIiArCi0gICAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAzIH1cbiIpOwotICAgIGFzc2VydFBhcnNlRXJyb3JXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKAotICAgICAgICAiMjoxNjogTm9uLXJlcGVhdGVkIGZpZWxkICIgKwotICAgICAgICAiXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuZGVmYXVsdF9pbnQzMlwiICIgKwotICAgICAgICAiY2Fubm90IGJlIG92ZXJ3cml0dGVuLiIsCi0gICAgICAgICJkZWZhdWx0X2ludDMyOiA0MVxuIiArICAvLyB0aGUgZGVmYXVsdCB2YWx1ZQotICAgICAgICAiZGVmYXVsdF9pbnQzMjogNDFcbiIpOwotICAgIGFzc2VydFBhcnNlRXJyb3JXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKAotICAgICAgICAiMjoxNzogTm9uLXJlcGVhdGVkIGZpZWxkICIgKwotICAgICAgICAiXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuZGVmYXVsdF9zdHJpbmdcIiAiICsKLSAgICAgICAgImNhbm5vdCBiZSBvdmVyd3JpdHRlbi4iLAotICAgICAgICAiZGVmYXVsdF9zdHJpbmc6IFwienhjdlwiXG4iICsKLSAgICAgICAgImRlZmF1bHRfc3RyaW5nOiBcImFzZGZcIlxuIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VTaG9ydFJlcGVhdGVkRm9ybU9mUmVwZWF0ZWRGaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRQYXJzZVN1Y2Nlc3NXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKCJyZXBlYXRlZF9mb3JlaWduX2VudW06IFtGT1JFSUdOX0ZPTywgRk9SRUlHTl9CQVJdIik7Ci0gICAgYXNzZXJ0UGFyc2VTdWNjZXNzV2l0aE92ZXJ3cml0ZUZvcmJpZGRlbigicmVwZWF0ZWRfaW50MzI6IFsgMSwgMiBdXG4iKTsKLSAgICBhc3NlcnRQYXJzZVN1Y2Nlc3NXaXRoT3ZlcndyaXRlRm9yYmlkZGVuKCJSZXBlYXRlZEdyb3VwIFt7IGE6IDEgfSx7IGE6IDIgfV1cbiIpOwotICAgIGFzc2VydFBhcnNlU3VjY2Vzc1dpdGhPdmVyd3JpdGVGb3JiaWRkZW4oInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIFt7IGJiOiAxIH0sIHsgYmI6IDIgfV1cbiIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlU2hvcnRSZXBlYXRlZEZvcm1PZk5vblJlcGVhdGVkRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcldpdGhPdmVyd3JpdGVGb3JiaWRkZW4oCi0gICAgICAgICIxOjE3OiBDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiBGb3IgaW5wdXQgc3RyaW5nOiBcIltcIiIsCi0gICAgICAgICJvcHRpb25hbF9pbnQzMjogWzFdXG4iKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIHRlc3Qgb25lb2YKLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZUZXh0Rm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE9uZW9mMi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRPbmVvZihidWlsZGVyKTsKLSAgICBUZXN0T25lb2YyIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgVGVzdE9uZW9mMi5CdWlsZGVyIGRlc3QgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKTsKLSAgICBUZXh0Rm9ybWF0Lm1lcmdlKFRleHRGb3JtYXQucHJpbnRUb1VuaWNvZGVTdHJpbmcobWVzc2FnZSksIGRlc3QpOwotICAgIFRlc3RVdGlsLmFzc2VydE9uZW9mU2V0KGRlc3QuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZPdmVyd3JpdGVGb3JiaWRkZW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgaW5wdXQgPSAiZm9vX3N0cmluZzogXCJzdHJpbmd2YWx1ZVwiIGZvb19pbnQ6IDEyMyI7Ci0gICAgVGVzdE9uZW9mMi5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T25lb2YyLm5ld0J1aWxkZXIoKTsKLSAgICB0cnkgewotICAgICAgcGFyc2VyV2l0aE92ZXJ3cml0ZUZvcmJpZGRlbi5tZXJnZSgKLSAgICAgICAgICBpbnB1dCwgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgYnVpbGRlcik7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBwYXJzZSBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoIjE6MzY6IEZpZWxkIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mMi5mb29faW50XCIiCi0gICAgICAgICAgICAgICAgICAgKyAiIGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGZpZWxkIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mMi5mb29fc3RyaW5nXCIsIgotICAgICAgICAgICAgICAgICAgICsgIiBhbm90aGVyIG1lbWJlciBvZiBvbmVvZiBcImZvb1wiLiIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZPdmVyd3JpdGVBbGxvd2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGlucHV0ID0gImZvb19zdHJpbmc6IFwic3RyaW5ndmFsdWVcIiBmb29faW50OiAxMjMiOwotICAgIFRlc3RPbmVvZjIuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mMi5uZXdCdWlsZGVyKCk7Ci0gICAgZGVmYXVsdFBhcnNlci5tZXJnZShpbnB1dCwgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgYnVpbGRlcik7Ci0gICAgLy8gT25seSB0aGUgbGFzdCB2YWx1ZSBzdGlja3MuCi0gICAgVGVzdE9uZW9mMiBvbmVvZiA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShvbmVvZi5oYXNGb29TdHJpbmcoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShvbmVvZi5oYXNGb29JbnQoKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyB0ZXN0IGxvY2F0aW9uIGluZm9ybWF0aW9uCi0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlSW5mb1RyZWVCdWlsZGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotCi0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKLSAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZS5CdWlsZGVyIHRyZWVCdWlsZGVyID0gVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUuYnVpbGRlcigpOwotICAgIC8vIFNldCB0byBhbGxvdyB1bmtub3duIGZpZWxkcwotICAgIFRleHRGb3JtYXQuUGFyc2VyIHBhcnNlciA9Ci0gICAgICAgIFRleHRGb3JtYXQuUGFyc2VyLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldFBhcnNlSW5mb1RyZWVCdWlsZGVyKHRyZWVCdWlsZGVyKQotICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBmaW5hbCBTdHJpbmcgc3RyaW5nRGF0YSA9Ci0gICAgICAgICJvcHRpb25hbF9pbnQzMjogMVxuIgotICAgICAgICArICJvcHRpb25hbF9pbnQ2NDogMlxuIgotICAgICAgICArICIgIG9wdGlvbmFsX2RvdWJsZTogMi40XG4iCi0gICAgICAgICsgInJlcGVhdGVkX2ludDMyOiA1XG4iCi0gICAgICAgICsgInJlcGVhdGVkX2ludDMyOiAxMFxuIgotICAgICAgICArICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA8XG4iCi0gICAgICAgICsgIiAgYmI6IDc4XG4iCi0gICAgICAgICsgIj5cbiIKLSAgICAgICAgKyAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPFxuIgotICAgICAgICArICIgIGJiOiA3OVxuIgotICAgICAgICArICI+XG4iCi0gICAgICAgICsgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIDxcbiIKLSAgICAgICAgKyAiICBiYjogODBcbiIKLSAgICAgICAgKyAiPiI7Ci0KLSAgICBwYXJzZXIubWVyZ2Uoc3RyaW5nRGF0YSwgYnVpbGRlcik7Ci0gICAgVGV4dEZvcm1hdFBhcnNlSW5mb1RyZWUgdHJlZSA9IHRyZWVCdWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICAvLyBWZXJpZnkgdGhhdCB0aGUgdHJlZSBoYXMgdGhlIGNvcnJlY3QgcG9zaXRpb25zLgotICAgIGFzc2VydExvY2F0aW9uKHRyZWUsIGRlc2NyaXB0b3IsICJvcHRpb25hbF9pbnQzMiIsIDAsIDAsIDApOwotICAgIGFzc2VydExvY2F0aW9uKHRyZWUsIGRlc2NyaXB0b3IsICJvcHRpb25hbF9pbnQ2NCIsIDAsIDEsIDApOwotICAgIGFzc2VydExvY2F0aW9uKHRyZWUsIGRlc2NyaXB0b3IsICJvcHRpb25hbF9kb3VibGUiLCAwLCAyLCAyKTsKLQotICAgIGFzc2VydExvY2F0aW9uKHRyZWUsIGRlc2NyaXB0b3IsICJyZXBlYXRlZF9pbnQzMiIsIDAsIDMsIDApOwotICAgIGFzc2VydExvY2F0aW9uKHRyZWUsIGRlc2NyaXB0b3IsICJyZXBlYXRlZF9pbnQzMiIsIDEsIDQsIDApOwotCi0gICAgYXNzZXJ0TG9jYXRpb24odHJlZSwgZGVzY3JpcHRvciwgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiwgMCwgNSwgMCk7Ci0gICAgYXNzZXJ0TG9jYXRpb24odHJlZSwgZGVzY3JpcHRvciwgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiwgMCwgOCwgMCk7Ci0gICAgYXNzZXJ0TG9jYXRpb24odHJlZSwgZGVzY3JpcHRvciwgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiwgMSwgMTEsIDApOwotCi0gICAgLy8gQ2hlY2sgZm9yIGZpZWxkcyBub3Qgc2V0LiBGb3IgYW4gaW52YWxpZCBmaWVsZCwgdGhlIGxvY2F0aW9uIHJldHVybmVkIHNob3VsZCBiZSAtMSwgLTEuCi0gICAgYXNzZXJ0TG9jYXRpb24odHJlZSwgZGVzY3JpcHRvciwgInJlcGVhdGVkX2ludDY0IiwgMCwgLTEsIC0xKTsKLSAgICBhc3NlcnRMb2NhdGlvbih0cmVlLCBkZXNjcmlwdG9yLCAicmVwZWF0ZWRfaW50MzIiLCA2LCAtMSwgLTEpOwotCi0gICAgLy8gVmVyaWZ5IGluc2lkZSB0aGUgbmVzdGVkIG1lc3NhZ2UuCi0gICAgRmllbGREZXNjcmlwdG9yIG5lc3RlZEZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7Ci0KLSAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSBuZXN0ZWRUcmVlID0gdHJlZS5nZXROZXN0ZWRUcmVlcyhuZXN0ZWRGaWVsZCkuZ2V0KDApOwotICAgIGFzc2VydExvY2F0aW9uKG5lc3RlZFRyZWUsIG5lc3RlZEZpZWxkLmdldE1lc3NhZ2VUeXBlKCksICJiYiIsIDAsIDYsIDIpOwotCi0gICAgLy8gVmVyaWZ5IGluc2lkZSBhbm90aGVyIG5lc3RlZCBtZXNzYWdlLgotICAgIG5lc3RlZEZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIik7Ci0gICAgbmVzdGVkVHJlZSA9IHRyZWUuZ2V0TmVzdGVkVHJlZXMobmVzdGVkRmllbGQpLmdldCgwKTsKLSAgICBhc3NlcnRMb2NhdGlvbihuZXN0ZWRUcmVlLCBuZXN0ZWRGaWVsZC5nZXRNZXNzYWdlVHlwZSgpLCAiYmIiLCAwLCA5LCAyKTsKLQotICAgIG5lc3RlZFRyZWUgPSB0cmVlLmdldE5lc3RlZFRyZWVzKG5lc3RlZEZpZWxkKS5nZXQoMSk7Ci0gICAgYXNzZXJ0TG9jYXRpb24obmVzdGVkVHJlZSwgbmVzdGVkRmllbGQuZ2V0TWVzc2FnZVR5cGUoKSwgImJiIiwgMCwgMTIsIDIpOwotCi0gICAgLy8gVmVyaWZ5IGEgTlVMTCB0cmVlIGZvciBhbiB1bmtub3duIG5lc3RlZCBmaWVsZC4KLSAgICB0cnkgewotICAgICAgdHJlZS5nZXROZXN0ZWRUcmVlKG5lc3RlZEZpZWxkLCAyKTsKLSAgICAgIGZhaWwoInVua25vd24gbmVzdGVkIGZpZWxkIHNob3VsZCB0aHJvdyIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB1bnVzZWQpIHsKLSAgICAgIC8vIHBhc3MKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0TG9jYXRpb24oCi0gICAgICBUZXh0Rm9ybWF0UGFyc2VJbmZvVHJlZSB0cmVlLAotICAgICAgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLAotICAgICAgZmluYWwgU3RyaW5nIGZpZWxkTmFtZSwKLSAgICAgIGludCBpbmRleCwKLSAgICAgIGludCBsaW5lLAotICAgICAgaW50IGNvbHVtbikgewotICAgIExpc3Q8VGV4dEZvcm1hdFBhcnNlTG9jYXRpb24+IGxvY3MgPSB0cmVlLmdldExvY2F0aW9ucyhkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShmaWVsZE5hbWUpKTsKLSAgICBpZiAoaW5kZXggPCBsb2NzLnNpemUoKSkgewotICAgICAgVGV4dEZvcm1hdFBhcnNlTG9jYXRpb24gbG9jYXRpb24gPSBsb2NzLmdldChpbmRleCk7Ci0gICAgICBUZXh0Rm9ybWF0UGFyc2VMb2NhdGlvbiBleHBlY3RlZCA9IFRleHRGb3JtYXRQYXJzZUxvY2F0aW9uLmNyZWF0ZShsaW5lLCBjb2x1bW4pOwotICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLCBsb2NhdGlvbik7Ci0gICAgfSBlbHNlIGlmIChsaW5lICE9IC0xICYmIGNvbHVtbiAhPSAtMSkgewotICAgICAgZmFpbCgKLSAgICAgICAgICBTdHJpbmcuZm9ybWF0KAotICAgICAgICAgICAgICAiVHJlZS9kZXNjcmlwdG9yL2ZpZWxkbmFtZSBkaWQgbm90IGNvbnRhaW4gaW5kZXggJWQsIGxpbmUgJWQgY29sdW1uICVkIGV4cGVjdGVkIiwKLSAgICAgICAgICAgICAgaW5kZXgsCi0gICAgICAgICAgICAgIGxpbmUsCi0gICAgICAgICAgICAgIGNvbHVtbikpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRW51bVZhbHVlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRW51bVZhbHVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZjQ1OTc2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5rbm93bkVudW1WYWx1ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRmllbGRQcmVzZW5jZVRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5UZXh0Rm9ybWF0LlBhcnNlRXhjZXB0aW9uOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFVuaXQgdGVzdHMgZm9yIHByb3RvcyB0aGF0IGtlZXAgdW5rbm93biBlbnVtIHZhbHVlcyByYXRoZXIgdGhhbiBkaXNjYXJkCi0gKiB0aGVtIGFzIHVua25vd24gZmllbGRzLgotICovCi1wdWJsaWMgY2xhc3MgVW5rbm93bkVudW1WYWx1ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRW51bVZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtVmFsdWUoNDMyMSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW1WYWx1ZSg1NDMyKTsKLSAgICBidWlsZGVyLmFkZFBhY2tlZE5lc3RlZEVudW1WYWx1ZSg2NTQzKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDMyMSwgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZEVudW1WYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNTQzMiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW1WYWx1ZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU0MzIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtVmFsdWVMaXN0KCkuZ2V0KDApLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg2NTQzLCBtZXNzYWdlLmdldFBhY2tlZE5lc3RlZEVudW1WYWx1ZSgwKSk7Ci0gICAgLy8gUmV0dXJucyBVTlJFQ09HTklaRUQgaWYgYW4gZW51bSB0eXBlIGlzIHJlcXVlc3RlZC4KLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVELCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVELCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLlVOUkVDT0dOSVpFRCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW1MaXN0KCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVELCBtZXNzYWdlLmdldFBhY2tlZE5lc3RlZEVudW0oMCkpOwotICAgIAotICAgIC8vIFRlc3Qgc2VyaWFsaXphdGlvbiBhbmQgcGFyc2luZy4KLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKGRhdGEpOwotICAgIGFzc2VydEVxdWFscyg0MzIxLCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkRW51bVZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg1NDMyLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bVZhbHVlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoNTQzMiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW1WYWx1ZUxpc3QoKS5nZXQoMCkuaW50VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDY1NDMsIG1lc3NhZ2UuZ2V0UGFja2VkTmVzdGVkRW51bVZhbHVlKDApKTsKLSAgICAvLyBSZXR1cm5zIFVOUkVDT0dOSVpFRCBpZiBhbiBlbnVtIHR5cGUgaXMgcmVxdWVzdGVkLgotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5VTlJFQ09HTklaRUQsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5VTlJFQ09HTklaRUQsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVELCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bUxpc3QoKS5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5VTlJFQ09HTklaRUQsIG1lc3NhZ2UuZ2V0UGFja2VkTmVzdGVkRW51bSgwKSk7Ci0gICAgCi0gICAgLy8gVGVzdCB0b0J1aWxkZXIoKS4KLSAgICBidWlsZGVyID0gbWVzc2FnZS50b0J1aWxkZXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDMyMSwgYnVpbGRlci5nZXRPcHRpb25hbE5lc3RlZEVudW1WYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNTQzMiwgYnVpbGRlci5nZXRSZXBlYXRlZE5lc3RlZEVudW1WYWx1ZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU0MzIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtVmFsdWVMaXN0KCkuZ2V0KDApLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg2NTQzLCBidWlsZGVyLmdldFBhY2tlZE5lc3RlZEVudW1WYWx1ZSgwKSk7ICAgIAotICAgIC8vIFJldHVybnMgVU5SRUNPR05JWkVEIGlmIGFuIGVudW0gdHlwZSBpcyByZXF1ZXN0ZWQuCi0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLlVOUkVDT0dOSVpFRCwgYnVpbGRlci5nZXRPcHRpb25hbE5lc3RlZEVudW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLlVOUkVDT0dOSVpFRCwgYnVpbGRlci5nZXRSZXBlYXRlZE5lc3RlZEVudW0oMCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5VTlJFQ09HTklaRUQsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtTGlzdCgpLmdldCgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLlVOUkVDT0dOSVpFRCwgYnVpbGRlci5nZXRQYWNrZWROZXN0ZWRFbnVtKDApKTsKLSAgICAKLSAgICAvLyBUZXN0IG1lcmdlRnJvbSgpLgotICAgIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLm1lcmdlRnJvbShtZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoNDMyMSwgYnVpbGRlci5nZXRPcHRpb25hbE5lc3RlZEVudW1WYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNTQzMiwgYnVpbGRlci5nZXRSZXBlYXRlZE5lc3RlZEVudW1WYWx1ZSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU0MzIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtVmFsdWVMaXN0KCkuZ2V0KDApLmludFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscyg2NTQzLCBidWlsZGVyLmdldFBhY2tlZE5lc3RlZEVudW1WYWx1ZSgwKSk7Ci0gICAgLy8gUmV0dXJucyBVTlJFQ09HTklaRUQgaWYgYW4gZW51bSB0eXBlIGlzIHJlcXVlc3RlZC4KLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVELCBidWlsZGVyLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVELCBidWlsZGVyLmdldFJlcGVhdGVkTmVzdGVkRW51bSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLlVOUkVDT0dOSVpFRCwgYnVpbGRlci5nZXRSZXBlYXRlZE5lc3RlZEVudW1MaXN0KCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVELCBidWlsZGVyLmdldFBhY2tlZE5lc3RlZEVudW0oMCkpOwotICAgIAotICAgIC8vIFRlc3QgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkKLSAgICBUZXN0QWxsVHlwZXMgc2FtZU1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHNhbWVNZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5oYXNoQ29kZSgpLCBzYW1lTWVzc2FnZS5oYXNoQ29kZSgpKTsKLQotICAgIC8vIEdldHRpbmcgdGhlIG51bWVyaWMgdmFsdWUgb2YgVU5SRUNPR05JWkVEIHdpbGwgdGhyb3cgYW4gZXhjZXB0aW9uLgotICAgIHRyeSB7Ci0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5VTlJFQ09HTklaRUQuZ2V0TnVtYmVyKCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIC8vIFNldHRpbmcgYW4gZW51bSBmaWVsZCB0byBhbiBVTlJFQ09HTklaRUQgdmFsdWUgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uCi0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKGJ1aWxkZXIuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKGJ1aWxkZXIuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRW51bVZhbHVlSW5SZWZsZWN0aW9uQXBpKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKLSAgICBGaWVsZERlc2NyaXB0b3Igb3B0aW9uYWxOZXN0ZWRFbnVtRmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgcmVwZWF0ZWROZXN0ZWRFbnVtRmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX2VudW0iKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgcGFja2VkTmVzdGVkRW51bUZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInBhY2tlZF9uZXN0ZWRfZW51bSIpOwotICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5zZXRGaWVsZChvcHRpb25hbE5lc3RlZEVudW1GaWVsZCwKLSAgICAgICAgZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93big0MzIxKSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKHJlcGVhdGVkTmVzdGVkRW51bUZpZWxkLAotICAgICAgICBlbnVtVHlwZS5maW5kVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKDU0MzIpKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQocGFja2VkTmVzdGVkRW51bUZpZWxkLAotICAgICAgICBlbnVtVHlwZS5maW5kVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKDY1NDMpKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICAKLSAgICAvLyBHZXR0ZXJzIHdpbGwgcmV0dXJuIHVua25vd24gZW51bSB2YWx1ZXMgYXMgRW51bVZhbHVlRGVzY3JpcHRvci4KLSAgICBFbnVtVmFsdWVEZXNjcmlwdG9yIHVua25vd240MzIxID0KLSAgICAgICAgKEVudW1WYWx1ZURlc2NyaXB0b3IpIG1lc3NhZ2UuZ2V0RmllbGQob3B0aW9uYWxOZXN0ZWRFbnVtRmllbGQpOwotICAgIEVudW1WYWx1ZURlc2NyaXB0b3IgdW5rbm93bjU0MzIgPQotICAgICAgICAoRW51bVZhbHVlRGVzY3JpcHRvcikgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKHJlcGVhdGVkTmVzdGVkRW51bUZpZWxkLCAwKTsKLSAgICBFbnVtVmFsdWVEZXNjcmlwdG9yIHVua25vd242NTQzID0KLSAgICAgICAgKEVudW1WYWx1ZURlc2NyaXB0b3IpIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChwYWNrZWROZXN0ZWRFbnVtRmllbGQsIDApOwotICAgIGFzc2VydEVxdWFscyg0MzIxLCB1bmtub3duNDMyMS5nZXROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU0MzIsIHVua25vd241NDMyLmdldE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoNjU0MywgdW5rbm93bjY1NDMuZ2V0TnVtYmVyKCkpOwotICAgIAotICAgIC8vIFVua25vd24gRW51bVZhbHVlRGVzY3JpcHRvciB3aWxsIG1hcCB0byBVTlJFQ09HTklaRUQuCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS52YWx1ZU9mKHVua25vd240MzIxKSwKLSAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVU5SRUNPR05JWkVEKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLnZhbHVlT2YodW5rbm93bjU0MzIpLAotICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5VTlJFQ09HTklaRUQpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0udmFsdWVPZih1bmtub3duNjU0MyksCi0gICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLlVOUkVDT0dOSVpFRCk7Ci0gICAgCi0gICAgLy8gU2V0dGVycyBhbHNvIGFjY2VwdCB1bmtub3duIEVudW1WYWx1ZURlc2NyaXB0b3IuCi0gICAgYnVpbGRlci5zZXRGaWVsZChvcHRpb25hbE5lc3RlZEVudW1GaWVsZCwgdW5rbm93bjY1NDMpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChyZXBlYXRlZE5lc3RlZEVudW1GaWVsZCwgMCwgdW5rbm93bjQzMjEpOwotICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChwYWNrZWROZXN0ZWRFbnVtRmllbGQsIDAsIHVua25vd241NDMyKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIC8vIExpa2Ugb3RoZXIgZGVzY3JpcHRvcnMsIHVua25vd24gRW51bVZhbHVlRGVzY3JpcHRvciBjYW4gYmUgY29tcGFyZWQgYnkKLSAgICAvLyBvYmplY3QgaWRlbnRpdHkuCi0gICAgYXNzZXJ0VHJ1ZSh1bmtub3duNjU0MyA9PSBtZXNzYWdlLmdldEZpZWxkKG9wdGlvbmFsTmVzdGVkRW51bUZpZWxkKSk7Ci0gICAgYXNzZXJ0VHJ1ZSh1bmtub3duNDMyMSA9PSBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQocmVwZWF0ZWROZXN0ZWRFbnVtRmllbGQsIDApKTsKLSAgICBhc3NlcnRUcnVlKHVua25vd241NDMyID09IG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChwYWNrZWROZXN0ZWRFbnVtRmllbGQsIDApKTsKLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdFVua25vd25FbnVtVmFsdWVXaXRoRHluYW1pY01lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIEZpZWxkRGVzY3JpcHRvciBvcHRpb25hbE5lc3RlZEVudW1GaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOwotICAgIEZpZWxkRGVzY3JpcHRvciByZXBlYXRlZE5lc3RlZEVudW1GaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBwYWNrZWROZXN0ZWRFbnVtRmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgicGFja2VkX25lc3RlZF9lbnVtIik7Ci0gICAgRW51bURlc2NyaXB0b3IgZW51bVR5cGUgPSBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5nZXREZXNjcmlwdG9yKCk7Ci0gICAgCi0gICAgTWVzc2FnZSBkeW5hbWljTWVzc2FnZURlZmF1bHRJbnN0YW5jZSA9IER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShkZXNjcmlwdG9yKTsKLQotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gZHluYW1pY01lc3NhZ2VEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICBidWlsZGVyLnNldEZpZWxkKG9wdGlvbmFsTmVzdGVkRW51bUZpZWxkLAotICAgICAgICBlbnVtVHlwZS5maW5kVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKDQzMjEpKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQocmVwZWF0ZWROZXN0ZWRFbnVtRmllbGQsCi0gICAgICAgIGVudW1UeXBlLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oNTQzMikpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChwYWNrZWROZXN0ZWRFbnVtRmllbGQsCi0gICAgICAgIGVudW1UeXBlLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oNjU0MykpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDMyMSwKLSAgICAgICAgKChFbnVtVmFsdWVEZXNjcmlwdG9yKSBtZXNzYWdlLmdldEZpZWxkKG9wdGlvbmFsTmVzdGVkRW51bUZpZWxkKSkuZ2V0TnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyg1NDMyLAotICAgICAgICAoKEVudW1WYWx1ZURlc2NyaXB0b3IpIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChyZXBlYXRlZE5lc3RlZEVudW1GaWVsZCwgMCkpLmdldE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoNjU0MywKLSAgICAgICAgKChFbnVtVmFsdWVEZXNjcmlwdG9yKSBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQocGFja2VkTmVzdGVkRW51bUZpZWxkLCAwKSkuZ2V0TnVtYmVyKCkpOwotICAgIAotICAgIC8vIFRlc3QgcmVmbGVjdGlvbiBiYXNlZCBzZXJpYWxpemF0aW9uL3BhcnNpbmcgaW1wbGVtZW50YXRpb24uCi0gICAgQnl0ZVN0cmluZyBkYXRhID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLSAgICBtZXNzYWdlID0gZHluYW1pY01lc3NhZ2VEZWZhdWx0SW5zdGFuY2UKLSAgICAgICAgLm5ld0J1aWxkZXJGb3JUeXBlKCkKLSAgICAgICAgLm1lcmdlRnJvbShkYXRhKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDMyMSwKLSAgICAgICAgKChFbnVtVmFsdWVEZXNjcmlwdG9yKSBtZXNzYWdlLmdldEZpZWxkKG9wdGlvbmFsTmVzdGVkRW51bUZpZWxkKSkuZ2V0TnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyg1NDMyLAotICAgICAgICAoKEVudW1WYWx1ZURlc2NyaXB0b3IpIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChyZXBlYXRlZE5lc3RlZEVudW1GaWVsZCwgMCkpLmdldE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoNjU0MywKLSAgICAgICAgKChFbnVtVmFsdWVEZXNjcmlwdG9yKSBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQocGFja2VkTmVzdGVkRW51bUZpZWxkLCAwKSkuZ2V0TnVtYmVyKCkpOwotICAgIAotICAgIC8vIFRlc3QgcmVmbGVjdGlvbiBiYXNlZCBlcXVhbHMoKS9oYXNoQ29kZSgpLgotICAgIGJ1aWxkZXIgPSBkeW5hbWljTWVzc2FnZURlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgIGJ1aWxkZXIuc2V0RmllbGQob3B0aW9uYWxOZXN0ZWRFbnVtRmllbGQsCi0gICAgICAgIGVudW1UeXBlLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oNDMyMSkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChyZXBlYXRlZE5lc3RlZEVudW1GaWVsZCwKLSAgICAgICAgZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93big1NDMyKSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKHBhY2tlZE5lc3RlZEVudW1GaWVsZCwKLSAgICAgICAgZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93big2NTQzKSk7Ci0gICAgTWVzc2FnZSBzYW1lTWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgc2FtZU1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmhhc2hDb2RlKCksIHNhbWVNZXNzYWdlLmhhc2hDb2RlKCkpOwotICAgIGJ1aWxkZXIuc2V0RmllbGQob3B0aW9uYWxOZXN0ZWRFbnVtRmllbGQsCi0gICAgICAgIGVudW1UeXBlLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oMCkpOwotICAgIE1lc3NhZ2UgZGlmZmVyZW50TWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmVxdWFscyhkaWZmZXJlbnRNZXNzYWdlKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RVbmtub3duRW51bVZhbHVlc0luVGV4dEZvcm1hdCgpIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bVZhbHVlKDQzMjEpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtVmFsdWUoNTQzMik7Ci0gICAgYnVpbGRlci5hZGRQYWNrZWROZXN0ZWRFbnVtVmFsdWUoNjU0Myk7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgCi0gICAgLy8gV2UgY2FuIHByaW50IGEgbWVzc2FnZSB3aXRoIHVua25vd24gZW51bSB2YWx1ZXMuCi0gICAgU3RyaW5nIHRleHREYXRhID0gVGV4dEZvcm1hdC5wcmludFRvU3RyaW5nKG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9lbnVtOiBVTktOT1dOX0VOVU1fVkFMVUVfTmVzdGVkRW51bV80MzIxXG4iCi0gICAgICAgICsgInJlcGVhdGVkX25lc3RlZF9lbnVtOiBVTktOT1dOX0VOVU1fVkFMVUVfTmVzdGVkRW51bV81NDMyXG4iCi0gICAgICAgICsgInBhY2tlZF9uZXN0ZWRfZW51bTogVU5LTk9XTl9FTlVNX1ZBTFVFX05lc3RlZEVudW1fNjU0M1xuIiwgdGV4dERhdGEpOwotICAgIAotICAgIC8vIFBhcnNpbmcgdW5rbm93biBlbnVtIHZhbHVlcyB3aWxsIGZhaWwganVzdCBsaWtlIHBhcnNpbmcgb3RoZXIga2luZHMgb2YKLSAgICAvLyB1bmtub3duIGZpZWxkcy4KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5tZXJnZSh0ZXh0RGF0YSwgYnVpbGRlcik7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQuCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldExpdGVUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldExpdGVUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU3M2NkNjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRMaXRlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbFR5cGVzTGl0ZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5saXRlX2VxdWFsc19hbmRfaGFzaC5MaXRlRXF1YWxzQW5kSGFzaDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5saXRlX2VxdWFsc19hbmRfaGFzaC5MaXRlRXF1YWxzQW5kSGFzaC5CYXI7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QubGl0ZV9lcXVhbHNfYW5kX2hhc2guTGl0ZUVxdWFsc0FuZEhhc2guRm9vOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBUZXN0cyBmb3Ige0BsaW5rIFVua25vd25GaWVsZFNldExpdGV9LgotICoKLSAqIEBhdXRob3IgZHdlaXNAZ29vZ2xlLmNvbSAoRGFuaWVsIFdlaXMpCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duRmllbGRTZXRMaXRlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0SW5zdGFuY2UoKSB7Ci0gICAgVW5rbm93bkZpZWxkU2V0TGl0ZSB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0TGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLQotICAgIGFzc2VydEVxdWFscygwLCB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCB0b0J5dGVTdHJpbmcodW5rbm93bkZpZWxkcykpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlRmllbGRGcm9tKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBGb28gZm9vID0gRm9vLm5ld0J1aWxkZXIoKQotICAgICAgLnNldFZhbHVlKDIpCi0gICAgICAuYnVpbGQoKTsKLQotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGZvby50b0J5dGVBcnJheSgpKTsKLQotICAgIFVua25vd25GaWVsZFNldExpdGUgaW5zdGFuY2UgPSBVbmtub3duRmllbGRTZXRMaXRlLm5ld0luc3RhbmNlKCk7Ci0gICAgaW5zdGFuY2UubWVyZ2VGaWVsZEZyb20oaW5wdXQucmVhZFRhZygpLCBpbnB1dCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoZm9vLnRvQnl0ZVN0cmluZygpLCB0b0J5dGVTdHJpbmcoaW5zdGFuY2UpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVkU2l6ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgRm9vIGZvbyA9IEZvby5uZXdCdWlsZGVyKCkKLSAgICAgIC5zZXRWYWx1ZSgyKQotICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShmb28udG9CeXRlQXJyYXkoKSk7Ci0KLSAgICBVbmtub3duRmllbGRTZXRMaXRlIGluc3RhbmNlID0gVW5rbm93bkZpZWxkU2V0TGl0ZS5uZXdJbnN0YW5jZSgpOwotICAgIGluc3RhbmNlLm1lcmdlRmllbGRGcm9tKGlucHV0LnJlYWRUYWcoKSwgaW5wdXQpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGZvby50b0J5dGVTdHJpbmcoKS5zaXplKCksIGluc3RhbmNlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlVmFyaW50RmllbGQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFVua25vd25GaWVsZFNldExpdGUgdW5rbm93bkZpZWxkcyA9IFVua25vd25GaWVsZFNldExpdGUubmV3SW5zdGFuY2UoKTsKLSAgICB1bmtub3duRmllbGRzLm1lcmdlVmFyaW50RmllbGQoMTAsIDIpOwotCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9Ci0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UodG9CeXRlU3RyaW5nKHVua25vd25GaWVsZHMpLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAsIFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpOwotICAgIGFzc2VydEVxdWFscygyLCBpbnB1dC5yZWFkVUludDY0KCkpOwotICAgIGFzc2VydFRydWUoaW5wdXQuaXNBdEVuZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZVZhcmludEZpZWxkX25lZ2F0aXZlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBVbmtub3duRmllbGRTZXRMaXRlIGJ1aWxkZXIgPSBVbmtub3duRmllbGRTZXRMaXRlLm5ld0luc3RhbmNlKCk7Ci0gICAgYnVpbGRlci5tZXJnZVZhcmludEZpZWxkKDEwLCAtNik7Ci0KLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0KLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSh0b0J5dGVTdHJpbmcoYnVpbGRlcikudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgIGFzc2VydEVxdWFscygxMCwgV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpKTsKLSAgICBhc3NlcnRFcXVhbHMoV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC02LCBpbnB1dC5yZWFkVUludDY0KCkpOwotICAgIGFzc2VydFRydWUoaW5wdXQuaXNBdEVuZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNBbmRIYXNoQ29kZSgpIHsKLSAgICBVbmtub3duRmllbGRTZXRMaXRlIHVua25vd25GaWVsZHMxID0gVW5rbm93bkZpZWxkU2V0TGl0ZS5uZXdJbnN0YW5jZSgpOwotICAgIHVua25vd25GaWVsZHMxLm1lcmdlVmFyaW50RmllbGQoMTAsIDIpOwotCi0gICAgVW5rbm93bkZpZWxkU2V0TGl0ZSB1bmtub3duRmllbGRzMiA9IFVua25vd25GaWVsZFNldExpdGUubmV3SW5zdGFuY2UoKTsKLSAgICB1bmtub3duRmllbGRzMi5tZXJnZVZhcmludEZpZWxkKDEwLCAyKTsKLQotICAgIGFzc2VydEVxdWFscyh1bmtub3duRmllbGRzMSwgdW5rbm93bkZpZWxkczIpOwotICAgIGFzc2VydEVxdWFscyh1bmtub3duRmllbGRzMS5oYXNoQ29kZSgpLCB1bmtub3duRmllbGRzMi5oYXNoQ29kZSgpKTsKLSAgICBhc3NlcnRGYWxzZSh1bmtub3duRmllbGRzMS5lcXVhbHMoVW5rbm93bkZpZWxkU2V0TGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKSkpOwotICAgIGFzc2VydEZhbHNlKHVua25vd25GaWVsZHMxLmhhc2hDb2RlKCkgPT0gVW5rbm93bkZpZWxkU2V0TGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKS5oYXNoQ29kZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNdXRhYmxlQ29weU9mKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBVbmtub3duRmllbGRTZXRMaXRlIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXRMaXRlLm5ld0luc3RhbmNlKCk7Ci0gICAgdW5rbm93bkZpZWxkcy5tZXJnZVZhcmludEZpZWxkKDEwLCAyKTsKLSAgICB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0TGl0ZS5tdXRhYmxlQ29weU9mKHVua25vd25GaWVsZHMsIHVua25vd25GaWVsZHMpOwotICAgIHVua25vd25GaWVsZHMuY2hlY2tNdXRhYmxlKCk7Ci0KLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0KLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSh0b0J5dGVTdHJpbmcodW5rbm93bkZpZWxkcykudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgIGFzc2VydEVxdWFscygxMCwgV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpKTsKLSAgICBhc3NlcnRFcXVhbHMoV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGlucHV0LnJlYWRVSW50NjQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoaW5wdXQuaXNBdEVuZCgpKTsKLSAgICBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwLCBXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpOwotICAgIGFzc2VydEVxdWFscyhXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgaW5wdXQucmVhZFVJbnQ2NCgpKTsKLSAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TXV0YWJsZUNvcHlPZl9lbXB0eSgpIHsKLSAgICBVbmtub3duRmllbGRTZXRMaXRlIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXRMaXRlLm11dGFibGVDb3B5T2YoCi0gICAgICAgIFVua25vd25GaWVsZFNldExpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCksIFVua25vd25GaWVsZFNldExpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIHVua25vd25GaWVsZHMuY2hlY2tNdXRhYmxlKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgdW5rbm93bkZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoQnl0ZVN0cmluZy5FTVBUWSwgdG9CeXRlU3RyaW5nKHVua25vd25GaWVsZHMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSb3VuZFRyaXBzKCkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgRm9vIGZvbyA9IEZvby5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFZhbHVlKDEpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oQmFyLmZvb0V4dCwgQmFyLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldE5hbWUoIm5hbWUiKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oTGl0ZUVxdWFsc0FuZEhhc2gudmFyaW50LCAyMikKLSAgICAgICAgLnNldEV4dGVuc2lvbihMaXRlRXF1YWxzQW5kSGFzaC5maXhlZDMyLCA0NCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihMaXRlRXF1YWxzQW5kSGFzaC5maXhlZDY0LCA2NkwpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oTGl0ZUVxdWFsc0FuZEhhc2gubXlHcm91cCwgTGl0ZUVxdWFsc0FuZEhhc2guTXlHcm91cC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXRHcm91cFZhbHVlKCJ2YWx1ZSIpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBGb28gY29weSA9IEZvby5wYXJzZUZyb20oZm9vLnRvQnl0ZUFycmF5KCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGZvby5nZXRTZXJpYWxpemVkU2l6ZSgpLCBjb3B5LmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGFzc2VydEZhbHNlKGZvby5lcXVhbHMoY29weSkpOwotCi0gICAgRm9vIHNlY29uZENvcHkgPSBGb28ucGFyc2VGcm9tKGZvby50b0J5dGVBcnJheSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoY29weSwgc2Vjb25kQ29weSk7Ci0KLSAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeUxpdGUubmV3SW5zdGFuY2UoKTsKLSAgICBMaXRlRXF1YWxzQW5kSGFzaC5yZWdpc3RlckFsbEV4dGVuc2lvbnMoZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIEZvbyBjb3B5T2ZDb3B5ID0gRm9vLnBhcnNlRnJvbShjb3B5LnRvQnl0ZUFycmF5KCksIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLQotICAgIGFzc2VydEVxdWFscyhmb28sIGNvcHlPZkNvcHkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1hbGZvcm1lZEJ5dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIEZvby5wYXJzZUZyb20oInRoaXMgaXMgYSBtYWxmb3JtZWQgcHJvdG9jb2wgYnVmZmVyIi5nZXRCeXRlcyhJbnRlcm5hbC5VVEZfOCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWlzc2luZ1N0YXJ0R3JvdXBUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcuT3V0cHV0IGJ5dGVTdHJpbmdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVTdHJpbmdPdXRwdXQpOwotICAgIG91dHB1dC53cml0ZUdyb3VwTm9UYWcoRm9vLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgxMSkuYnVpbGQoKSk7Ci0gICAgb3V0cHV0LndyaXRlVGFnKDEwMCwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOwotICAgIG91dHB1dC5mbHVzaCgpOwotCi0gICAgdHJ5IHsKLSAgICAgIEZvby5wYXJzZUZyb20oYnl0ZVN0cmluZ091dHB1dC50b0J5dGVTdHJpbmcoKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNaXNzaW5nRW5kR3JvdXBUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcuT3V0cHV0IGJ5dGVTdHJpbmdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVTdHJpbmdPdXRwdXQpOwotICAgIG91dHB1dC53cml0ZVRhZygxMDAsIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICAgIG91dHB1dC53cml0ZUdyb3VwTm9UYWcoRm9vLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgxMSkuYnVpbGQoKSk7Ci0gICAgb3V0cHV0LmZsdXNoKCk7Ci0KLSAgICB0cnkgewotICAgICAgRm9vLnBhcnNlRnJvbShieXRlU3RyaW5nT3V0cHV0LnRvQnl0ZVN0cmluZygpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1pc21hdGNoaW5nR3JvdXBUYWdzKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nLk91dHB1dCBieXRlU3RyaW5nT3V0cHV0ID0gQnl0ZVN0cmluZy5uZXdPdXRwdXQoKTsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShieXRlU3RyaW5nT3V0cHV0KTsKLSAgICBvdXRwdXQud3JpdGVUYWcoMTAwLCBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKTsKLSAgICBvdXRwdXQud3JpdGVHcm91cE5vVGFnKEZvby5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMTEpLmJ1aWxkKCkpOwotICAgIG91dHB1dC53cml0ZVRhZygxMDEsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKLSAgICBvdXRwdXQuZmx1c2goKTsKLQotICAgIHRyeSB7Ci0gICAgICBGb28ucGFyc2VGcm9tKGJ5dGVTdHJpbmdPdXRwdXQudG9CeXRlU3RyaW5nKCkpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VHJ1bmNhdGVkSW5wdXQoKSB7Ci0gICAgRm9vIGZvbyA9IEZvby5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFZhbHVlKDEpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oQmFyLmZvb0V4dCwgQmFyLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldE5hbWUoIm5hbWUiKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oTGl0ZUVxdWFsc0FuZEhhc2gudmFyaW50LCAyMikKLSAgICAgICAgLnNldEV4dGVuc2lvbihMaXRlRXF1YWxzQW5kSGFzaC5teUdyb3VwLCBMaXRlRXF1YWxzQW5kSGFzaC5NeUdyb3VwLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldEdyb3VwVmFsdWUoInZhbHVlIikKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIHRyeSB7Ci0gICAgICBGb28ucGFyc2VGcm9tKGZvby50b0J5dGVTdHJpbmcoKS5zdWJzdHJpbmcoMCwgZm9vLnRvQnl0ZVN0cmluZygpLnNpemUoKSAtIDEwKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLSAgfQotICAKLSAgcHVibGljIHZvaWQgdGVzdE1ha2VJbW11dGFibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBVbmtub3duRmllbGRTZXRMaXRlIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXRMaXRlLm5ld0luc3RhbmNlKCk7Ci0gICAgdW5rbm93bkZpZWxkcy5tYWtlSW1tdXRhYmxlKCk7Ci0gICAgCi0gICAgdHJ5IHsKLSAgICAgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCgxLCAxKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkge30KLSAgICAKLSAgICB0cnkgewotICAgICAgdW5rbm93bkZpZWxkcy5tZXJnZUxlbmd0aERlbGltaXRlZEZpZWxkKDIsIEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJoZWxsbyIpKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkge30KLSAgICAKLSAgICB0cnkgewotICAgICAgdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkRnJvbSgxLCBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKG5ldyBieXRlWzBdKSk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHt9Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RFbmRUb0VuZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc0xpdGUgdGVzdEFsbFR5cGVzID0gVGVzdEFsbFR5cGVzTGl0ZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICB0cnkgewotICAgICAgdGVzdEFsbFR5cGVzLnVua25vd25GaWVsZHMuY2hlY2tNdXRhYmxlKCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZXhwZWN0ZWQpIHt9Ci0gICAgCi0gICAgdGVzdEFsbFR5cGVzID0gVGVzdEFsbFR5cGVzTGl0ZS5wYXJzZUZyb20obmV3IGJ5dGVbMF0pOwotICAgIHRyeSB7Ci0gICAgICB0ZXN0QWxsVHlwZXMudW5rbm93bkZpZWxkcy5jaGVja011dGFibGUoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkge30KLSAgICAKLSAgICB0ZXN0QWxsVHlwZXMgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgIHRyeSB7Ci0gICAgICB0ZXN0QWxsVHlwZXMudW5rbm93bkZpZWxkcy5jaGVja011dGFibGUoKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkge30KLSAgICAKLSAgICB0ZXN0QWxsVHlwZXMgPSBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RGVmYXVsdEJvb2wodHJ1ZSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgdHJ5IHsKLSAgICAgIHRlc3RBbGxUeXBlcy51bmtub3duRmllbGRzLmNoZWNrTXV0YWJsZSgpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQotICAgIAotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSB0ZXN0QWxsRXh0ZW5zaW9ucyA9IFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLm1lcmdlRnJvbShUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSwgMikKLSAgICAgICAgICAgIC5idWlsZCgpLnRvQnl0ZUFycmF5KCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIHRyeSB7Ci0gICAgICB0ZXN0QWxsRXh0ZW5zaW9ucy51bmtub3duRmllbGRzLmNoZWNrTXV0YWJsZSgpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQotICB9Ci0KLSAgcHJpdmF0ZSBCeXRlU3RyaW5nIHRvQnl0ZVN0cmluZyhVbmtub3duRmllbGRTZXRMaXRlIHVua25vd25GaWVsZHMpIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gYnl0ZUFycmF5T3V0cHV0U3RyZWFtID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVBcnJheU91dHB1dFN0cmVhbSk7Ci0gICAgdHJ5IHsKLSAgICAgIHVua25vd25GaWVsZHMud3JpdGVUbyhvdXRwdXQpOwotICAgICAgb3V0cHV0LmZsdXNoKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oZSk7Ci0gICAgfQotICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ5dGVBcnJheU91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzIzODBmNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDY1NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGVzdHMgcmVsYXRlZCB0byB1bmtub3duIGZpZWxkIGhhbmRsaW5nLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLSAqLwotcHVibGljIGNsYXNzIFVua25vd25GaWVsZFNldFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIGFsbEZpZWxkcyA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotICAgIGFsbEZpZWxkc0RhdGEgPSBhbGxGaWVsZHMudG9CeXRlU3RyaW5nKCk7Ci0gICAgZW1wdHlNZXNzYWdlID0gVGVzdEVtcHR5TWVzc2FnZS5wYXJzZUZyb20oYWxsRmllbGRzRGF0YSk7Ci0gICAgdW5rbm93bkZpZWxkcyA9IGVtcHR5TWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCk7Ci0gIH0KLQotICBVbmtub3duRmllbGRTZXQuRmllbGQgZ2V0RmllbGQoU3RyaW5nIG5hbWUpIHsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICBhc3NlcnROb3ROdWxsKGZpZWxkKTsKLSAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5nZXRGaWVsZChmaWVsZC5nZXROdW1iZXIoKSk7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RzIGEgcHJvdG9jb2wgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIGZpZWxkcyB3aXRoIGFsbCB0aGUgc2FtZQotICAvLyBudW1iZXJzIGFzIGFsbEZpZWxkc0RhdGEgZXhjZXB0IHRoYXQgZWFjaCBmaWVsZCBpcyBzb21lIG90aGVyIHdpcmUKLSAgLy8gdHlwZS4KLSAgQnl0ZVN0cmluZyBnZXRCaXphcnJvRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIGJpemFycm9GaWVsZHMgPSBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpOwotCi0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIHZhcmludEZpZWxkID0KLSAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkuYWRkVmFyaW50KDEpLmJ1aWxkKCk7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpeGVkMzJGaWVsZCA9Ci0gICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpLmFkZEZpeGVkMzIoMSkuYnVpbGQoKTsKLQotICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIFVua25vd25GaWVsZFNldC5GaWVsZD4gZW50cnkgOgotICAgICAgICAgdW5rbm93bkZpZWxkcy5hc01hcCgpLmVudHJ5U2V0KCkpIHsKLSAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldFZhcmludExpc3QoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gT3JpZ2luYWwgZmllbGQgaXMgbm90IGEgdmFyaW50LCBzbyB1c2UgYSB2YXJpbnQuCi0gICAgICAgIGJpemFycm9GaWVsZHMuYWRkRmllbGQoZW50cnkuZ2V0S2V5KCksIHZhcmludEZpZWxkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE9yaWdpbmFsIGZpZWxkICppcyogYSB2YXJpbnQsIHNvIHVzZSBzb21ldGhpbmcgZWxzZS4KLSAgICAgICAgYml6YXJyb0ZpZWxkcy5hZGRGaWVsZChlbnRyeS5nZXRLZXkoKSwgZml4ZWQzMkZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYml6YXJyb0ZpZWxkcy5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotICB9Ci0KLSAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICBUZXN0QWxsVHlwZXMgYWxsRmllbGRzOwotICBCeXRlU3RyaW5nIGFsbEZpZWxkc0RhdGE7Ci0KLSAgLy8gQW4gZW1wdHkgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBmcm9tIGFsbEZpZWxkc0RhdGEuICBTbywgaXQgaGFzCi0gIC8vIHVua25vd24gZmllbGRzIG9mIGV2ZXJ5IHR5cGUuCi0gIFRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlNZXNzYWdlOwotICBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkczsKLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIHB1YmxpYyB2b2lkIHRlc3RWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfaW50MzIiKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0VmFyaW50TGlzdCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEludDMyKCksCi0gICAgICAgICAgICAgICAgIChsb25nKSBmaWVsZC5nZXRWYXJpbnRMaXN0KCkuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaXhlZDMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsX2ZpeGVkMzIiKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0Rml4ZWQzMkxpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxGaXhlZDMyKCksCi0gICAgICAgICAgICAgICAgIChpbnQpIGZpZWxkLmdldEZpeGVkMzJMaXN0KCkuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaXhlZDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsX2ZpeGVkNjQiKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0Rml4ZWQ2NExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxGaXhlZDY0KCksCi0gICAgICAgICAgICAgICAgIChsb25nKSBmaWVsZC5nZXRGaXhlZDY0TGlzdCgpLmdldCgwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGVuZ3RoRGVsaW1pdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsX2J5dGVzIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxCeXRlcygpLAotICAgICAgICAgICAgICAgICBmaWVsZC5nZXRMZW5ndGhEZWxpbWl0ZWRMaXN0KCkuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHcm91cCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBuZXN0ZWRGaWVsZERlc2NyaXB0b3IgPQotICAgICAgVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgiYSIpOwotICAgIGFzc2VydE5vdE51bGwobmVzdGVkRmllbGREZXNjcmlwdG9yKTsKLQotICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IGdldEZpZWxkKCJvcHRpb25hbGdyb3VwIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldEdyb3VwTGlzdCgpLnNpemUoKSk7Ci0KLSAgICBVbmtub3duRmllbGRTZXQgZ3JvdXAgPSBmaWVsZC5nZXRHcm91cExpc3QoKS5nZXQoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGdyb3VwLmFzTWFwKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRUcnVlKGdyb3VwLmhhc0ZpZWxkKG5lc3RlZEZpZWxkRGVzY3JpcHRvci5nZXROdW1iZXIoKSkpOwotCi0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIG5lc3RlZEZpZWxkID0KLSAgICAgIGdyb3VwLmdldEZpZWxkKG5lc3RlZEZpZWxkRGVzY3JpcHRvci5nZXROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZEZpZWxkLmdldFZhcmludExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxHcm91cCgpLmdldEEoKSwKLSAgICAgICAgICAgICAgICAgKGxvbmcpIG5lc3RlZEZpZWxkLmdldFZhcmludExpc3QoKS5nZXQoMCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIENoZWNrIHRoYXQgc2VyaWFsaXppbmcgdGhlIFVua25vd25GaWVsZFNldCBwcm9kdWNlcyB0aGUgb3JpZ2luYWwgZGF0YQotICAgIC8vIGFnYWluLgotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IGVtcHR5TWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzRGF0YSwgZGF0YSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgVGVzdEVtcHR5TWVzc2FnZS5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGVtcHR5TWVzc2FnZSkuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscyhlbXB0eU1lc3NhZ2UudG9TdHJpbmcoKSwgbWVzc2FnZS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0RW1wdHlNZXNzYWdlIHNvdXJjZSA9Ci0gICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VW5rbm93bkZpZWxkcygKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkRmllbGQoMiwKLSAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoMikuYnVpbGQoKSkKLSAgICAgICAgICAgIC5hZGRGaWVsZCgzLAotICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZFZhcmludCg0KS5idWlsZCgpKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIFRlc3RFbXB0eU1lc3NhZ2UgZGVzdGluYXRpb24gPQotICAgICAgVGVzdEVtcHR5TWVzc2FnZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFVua25vd25GaWVsZHMoCi0gICAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEZpZWxkKDEsCi0gICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkVmFyaW50KDEpLmJ1aWxkKCkpCi0gICAgICAgICAgICAuYWRkRmllbGQoMywKLSAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoMykuYnVpbGQoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAubWVyZ2VGcm9tKHNvdXJjZSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAiMTogMVxuIiArCi0gICAgICAiMjogMlxuIiArCi0gICAgICAiMzogM1xuIiArCi0gICAgICAiMzogNFxuIiwKLSAgICAgIGRlc3RpbmF0aW9uLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0IGZpZWxkcyA9Ci0gICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKS5jbGVhcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VHJ1ZShmaWVsZHMuYXNNYXAoKS5pc0VtcHR5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20oZW1wdHlNZXNzYWdlKS5jbGVhcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3RDbGVhckZpZWxkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgaW50IGZpZWxkTnVtYmVyID0gdW5rbm93bkZpZWxkcy5hc01hcCgpLmtleVNldCgpLml0ZXJhdG9yKCkubmV4dCgpOwotICAgIFVua25vd25GaWVsZFNldCBmaWVsZHMgPQotICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKS5jbGVhckZpZWxkKGZpZWxkTnVtYmVyKS5idWlsZCgpOwotICAgIGFzc2VydEZhbHNlKGZpZWxkcy5oYXNGaWVsZChmaWVsZE51bWJlcikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlS25vd25BbmRVbmtub3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCBtaXhpbmcga25vd24gYW5kIHVua25vd24gZmllbGRzIHdoZW4gcGFyc2luZy4KLQotICAgIFVua25vd25GaWVsZFNldCBmaWVsZHMgPQotICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIodW5rbm93bkZpZWxkcykKLSAgICAgICAgLmFkZEZpZWxkKDEyMzQ1NiwKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpLmFkZFZhcmludCg2NTQzMjEpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgQnl0ZVN0cmluZyBkYXRhID0gZmllbGRzLnRvQnl0ZVN0cmluZygpOwotICAgIFRlc3RBbGxUeXBlcyBkZXN0aW5hdGlvbiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oZGF0YSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoZGVzdGluYXRpb24pOwotICAgIGFzc2VydEVxdWFscygxLCBkZXN0aW5hdGlvbi5nZXRVbmtub3duRmllbGRzKCkuYXNNYXAoKS5zaXplKCkpOwotCi0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0KLSAgICAgIGRlc3RpbmF0aW9uLmdldFVua25vd25GaWVsZHMoKS5nZXRGaWVsZCgxMjM0NTYpOwotICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRWYXJpbnRMaXN0KCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNjU0MzIxLCAobG9uZykgZmllbGQuZ2V0VmFyaW50TGlzdCgpLmdldCgwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdUeXBlVHJlYXRlZEFzVW5rbm93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCi0gICAgLy8gd2hlbiBwYXJzaW5nLgotCi0gICAgQnl0ZVN0cmluZyBiaXphcnJvRGF0YSA9IGdldEJpemFycm9EYXRhKCk7Ci0gICAgVGVzdEFsbFR5cGVzIGFsbFR5cGVzTWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oYml6YXJyb0RhdGEpOwotICAgIFRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlNZXNzYWdlID0gVGVzdEVtcHR5TWVzc2FnZS5wYXJzZUZyb20oYml6YXJyb0RhdGEpOwotCi0gICAgLy8gQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSBiZWVuIGludGVycHJldGVkIGFzIHVua25vd24sIHNvIHRoZSBkZWJ1ZyBzdHJpbmdzCi0gICAgLy8gc2hvdWxkIGJlIHRoZSBzYW1lLgotICAgIGFzc2VydEVxdWFscyhlbXB0eU1lc3NhZ2UudG9TdHJpbmcoKSwgYWxsVHlwZXNNZXNzYWdlLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFVua25vd25FeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gTWFrZSBzdXJlIGZpZWxkcyBhcmUgcHJvcGVybHkgcGFyc2VkIHRvIHRoZSBVbmtub3duRmllbGRTZXQgZXZlbiB3aGVuCi0gICAgLy8gdGhleSBhcmUgZGVjbGFyZWQgYXMgZXh0ZW5zaW9uIG51bWJlcnMuCi0KLSAgICBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgbWVzc2FnZSA9Ci0gICAgICBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMucGFyc2VGcm9tKGFsbEZpZWxkc0RhdGEpOwotCi0gICAgYXNzZXJ0RXF1YWxzKHVua25vd25GaWVsZHMuYXNNYXAoKS5zaXplKCksCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzRGF0YSwgbWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0V3JvbmdFeHRlbnNpb25UeXBlVHJlYXRlZEFzVW5rbm93bigpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCi0gICAgLy8gd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMuCi0KLSAgICBCeXRlU3RyaW5nIGJpemFycm9EYXRhID0gZ2V0Qml6YXJyb0RhdGEoKTsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBhbGxFeHRlbnNpb25zTWVzc2FnZSA9Ci0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5wYXJzZUZyb20oYml6YXJyb0RhdGEpOwotICAgIFRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlNZXNzYWdlID0gVGVzdEVtcHR5TWVzc2FnZS5wYXJzZUZyb20oYml6YXJyb0RhdGEpOwotCi0gICAgLy8gQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSBiZWVuIGludGVycHJldGVkIGFzIHVua25vd24sIHNvIHRoZSBkZWJ1ZyBzdHJpbmdzCi0gICAgLy8gc2hvdWxkIGJlIHRoZSBzYW1lLgotICAgIGFzc2VydEVxdWFscyhlbXB0eU1lc3NhZ2UudG9TdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgYWxsRXh0ZW5zaW9uc01lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbmtub3duRW51bVZhbHVlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHNpbmd1bGFyRmllbGQgPQotICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9lbnVtIik7Ci0gICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkRmllbGQgPQotICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX25lc3RlZF9lbnVtIik7Ci0gICAgYXNzZXJ0Tm90TnVsbChzaW5ndWxhckZpZWxkKTsKLSAgICBhc3NlcnROb3ROdWxsKHJlcGVhdGVkRmllbGQpOwotCi0gICAgQnl0ZVN0cmluZyBkYXRhID0KLSAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEZpZWxkKHNpbmd1bGFyRmllbGQuZ2V0TnVtYmVyKCksCi0gICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZFZhcmludChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIuZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDUpICAgLy8gbm90IHZhbGlkCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmFkZEZpZWxkKHJlcGVhdGVkRmllbGQuZ2V0TnVtYmVyKCksCi0gICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZFZhcmludChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08uZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDQpICAgLy8gbm90IHZhbGlkCi0gICAgICAgICAgICAuYWRkVmFyaW50KFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWi5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoNikgICAvLyBub3QgdmFsaWQKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKQotICAgICAgICAudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICB7Ci0gICAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oZGF0YSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLAotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBBcnJheXMuYXNMaXN0KFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKSwKLSAgICAgICAgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW1MaXN0KCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNUwpLAotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChzaW5ndWxhckZpZWxkLmdldE51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFyaW50TGlzdCgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDRMLCA2TCksCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHJlcGVhdGVkRmllbGQuZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpbnRMaXN0KCkpOwotICAgIH0KLQotICAgIHsKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPQotICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5wYXJzZUZyb20oZGF0YSwgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLAotICAgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbikpOwotICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBBcnJheXMuYXNMaXN0KFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKSwKLSAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24pKTsKLSAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDVMKSwKLSAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoc2luZ3VsYXJGaWVsZC5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmludExpc3QoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCg0TCwgNkwpLAotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEZpZWxkLmdldE51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFyaW50TGlzdCgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGFyZ2VWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nIGRhdGEgPQotICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkRmllbGQoMSwKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDB4N0ZGRkZGRkZGRkZGRkZGRkwpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCkKLSAgICAgICAgLnRvQnl0ZVN0cmluZygpOwotICAgIFVua25vd25GaWVsZFNldCBwYXJzZWQgPSBVbmtub3duRmllbGRTZXQucGFyc2VGcm9tKGRhdGEpOwotICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IHBhcnNlZC5nZXRGaWVsZCgxKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0VmFyaW50TGlzdCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4N0ZGRkZGRkZGRkZGRkZGRkwsIChsb25nKWZpZWxkLmdldFZhcmludExpc3QoKS5nZXQoMCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFsc0FuZEhhc2hDb2RlKCkgewotICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaXhlZDMyRmllbGQgPQotICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkRml4ZWQzMigxKQotICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpeGVkNjRGaWVsZCA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaXhlZDY0KDEpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgdmFySW50RmllbGQgPQotICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDEpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgbGVuZ3RoRGVsaW1pdGVkRmllbGQgPQotICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKEJ5dGVTdHJpbmcuRU1QVFkpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZ3JvdXBGaWVsZCA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRHcm91cCh1bmtub3duRmllbGRzKQotICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBVbmtub3duRmllbGRTZXQgYSA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaWVsZCgxLCBmaXhlZDMyRmllbGQpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLSAgICBVbmtub3duRmllbGRTZXQgYiA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaWVsZCgxLCBmaXhlZDY0RmllbGQpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLSAgICBVbmtub3duRmllbGRTZXQgYyA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaWVsZCgxLCB2YXJJbnRGaWVsZCkKLSAgICAgICAgICAgIC5idWlsZCgpOwotICAgIFVua25vd25GaWVsZFNldCBkID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEZpZWxkKDEsIGxlbmd0aERlbGltaXRlZEZpZWxkKQotICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgVW5rbm93bkZpZWxkU2V0IGUgPQotICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkRmllbGQoMSwgZ3JvdXBGaWVsZCkKLSAgICAgICAgICAgIC5idWlsZCgpOwotCi0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoYSk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoYik7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoYyk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZCk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZSk7Ci0KLSAgICBjaGVja05vdEVxdWFsKGEsIGIpOwotICAgIGNoZWNrTm90RXF1YWwoYSwgYyk7Ci0gICAgY2hlY2tOb3RFcXVhbChhLCBkKTsKLSAgICBjaGVja05vdEVxdWFsKGEsIGUpOwotICAgIGNoZWNrTm90RXF1YWwoYiwgYyk7Ci0gICAgY2hlY2tOb3RFcXVhbChiLCBkKTsKLSAgICBjaGVja05vdEVxdWFsKGIsIGUpOwotICAgIGNoZWNrTm90RXF1YWwoYywgZCk7Ci0gICAgY2hlY2tOb3RFcXVhbChjLCBlKTsKLSAgICBjaGVja05vdEVxdWFsKGQsIGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gZmllbGQgc2V0cyBhcmUgbm90IGVxdWFsIGFuZCBoYXZlIGRpZmZlcmVudAotICAgKiBoYXNoIGNvZGVzLgotICAgKgotICAgKiBAd2FybmluZyBJdCdzIHZhbGlkIGZvciBub24tZXF1YWwgb2JqZWN0cyB0byBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZSwgc28KLSAgICogICB0aGlzIHRlc3QgaXMgc3RyaWN0ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4gSG93ZXZlciwgdGhpcyBzaG91bGQgaGFwcGVuCi0gICAqICAgcmVsYXRpdmVseSByYXJlbHkuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tOb3RFcXVhbChVbmtub3duRmllbGRTZXQgczEsIFVua25vd25GaWVsZFNldCBzMikgewotICAgIFN0cmluZyBlcXVhbHNFcnJvciA9IFN0cmluZy5mb3JtYXQoIiVzIHNob3VsZCBub3QgYmUgZXF1YWwgdG8gJXMiLCBzMSwgczIpOwotICAgIGFzc2VydEZhbHNlKGVxdWFsc0Vycm9yLCBzMS5lcXVhbHMoczIpKTsKLSAgICBhc3NlcnRGYWxzZShlcXVhbHNFcnJvciwgczIuZXF1YWxzKHMxKSk7Ci0KLSAgICBhc3NlcnRGYWxzZSgKLSAgICAgICAgU3RyaW5nLmZvcm1hdCgiJXMgc2hvdWxkIGhhdmUgYSBkaWZmZXJlbnQgaGFzaCBjb2RlIGZyb20gJXMiLCBzMSwgczIpLAotICAgICAgICBzMS5oYXNoQ29kZSgpID09IHMyLmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gZmllbGQgc2V0cyBhcmUgZXF1YWwgYW5kIGhhdmUgaWRlbnRpY2FsIGhhc2ggY29kZXMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoVW5rbm93bkZpZWxkU2V0IHNldCkgewotICAgIC8vIE9iamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gaXRzZWxmLgotICAgIGFzc2VydEVxdWFscyhzZXQsIHNldCk7Ci0KLSAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGEgY29weSBvZiBpdHNlbGYuCi0gICAgVW5rbm93bkZpZWxkU2V0IGNvcHkgPSBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcihzZXQpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNldCwgY29weSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNvcHksIHNldCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNldC5oYXNoQ29kZSgpLCBjb3B5Lmhhc2hDb2RlKCkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eU1lc3NhZ2VMaXRlID0KLSAgICAgICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlLnBhcnNlRnJvbShhbGxGaWVsZHNEYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzRGF0YS5zaXplKCksIGVtcHR5TWVzc2FnZUxpdGUuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgQnl0ZVN0cmluZyBkYXRhID0gZW1wdHlNZXNzYWdlTGl0ZS50b0J5dGVTdHJpbmcoKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oZGF0YSk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHNEYXRhLCBkYXRhKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RBbGxFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zIGFsbEV4dGVuc2lvbnMgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyBhbGxFeHRlbnNpb25zRGF0YSA9IGFsbEV4dGVuc2lvbnMudG9CeXRlU3RyaW5nKCk7Ci0gICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5TWVzc2FnZUxpdGUgPQotICAgICAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUucGFyc2VyKCkucGFyc2VGcm9tKGFsbEV4dGVuc2lvbnNEYXRhKTsKLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBlbXB0eU1lc3NhZ2VMaXRlLnRvQnl0ZVN0cmluZygpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPQotICAgICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5wYXJzZUZyb20oZGF0YSwgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoYWxsRXh0ZW5zaW9uc0RhdGEsIGRhdGEpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEFsbFBhY2tlZEZpZWxkc0xpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UGFja2VkVHlwZXMgYWxsUGFja2VkRmllbGRzID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyBhbGxQYWNrZWREYXRhID0gYWxsUGFja2VkRmllbGRzLnRvQnl0ZVN0cmluZygpOwotICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eU1lc3NhZ2VMaXRlID0KLSAgICAgICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlLnBhcnNlRnJvbShhbGxQYWNrZWREYXRhKTsKLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBlbXB0eU1lc3NhZ2VMaXRlLnRvQnl0ZVN0cmluZygpOwotICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlID0KLSAgICAgICAgVGVzdFBhY2tlZFR5cGVzLnBhcnNlRnJvbShkYXRhLCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQobWVzc2FnZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFsbFBhY2tlZERhdGEsIGRhdGEpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEFsbFBhY2tlZEV4dGVuc2lvbnNMaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMgYWxsUGFja2VkRXh0ZW5zaW9ucyA9IFRlc3RVdGlsLmdldFBhY2tlZEV4dGVuc2lvbnNTZXQoKTsKLSAgICBCeXRlU3RyaW5nIGFsbFBhY2tlZEV4dGVuc2lvbnNEYXRhID0gYWxsUGFja2VkRXh0ZW5zaW9ucy50b0J5dGVTdHJpbmcoKTsKLSAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlNZXNzYWdlTGl0ZSA9Ci0gICAgICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZS5wYXJzZUZyb20oYWxsUGFja2VkRXh0ZW5zaW9uc0RhdGEpOwotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IGVtcHR5TWVzc2FnZUxpdGUudG9CeXRlU3RyaW5nKCk7Ci0gICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZSA9Ci0gICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zLnBhcnNlRnJvbShkYXRhLCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhhbGxQYWNrZWRFeHRlbnNpb25zRGF0YSwgZGF0YSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weUZyb21MaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5TWVzc2FnZUxpdGUgPQotICAgICAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUucGFyc2VGcm9tKGFsbEZpZWxkc0RhdGEpOwotICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eU1lc3NhZ2VMaXRlMiA9Ci0gICAgICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLm1lcmdlRnJvbShlbXB0eU1lc3NhZ2VMaXRlKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhlbXB0eU1lc3NhZ2VMaXRlLnRvQnl0ZVN0cmluZygpLCBlbXB0eU1lc3NhZ2VMaXRlMi50b0J5dGVTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsSW50MzIoMSkKLSAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJmb28iKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImJhciIpCi0gICAgICAgIC5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsSW50NjQoMikKLSAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJiYXoiKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoInF1eCIpCi0gICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgZGF0YTEgPSBtZXNzYWdlMS50b0J5dGVTdHJpbmcoKTsKLSAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlNZXNzYWdlTGl0ZTEgPQotICAgICAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUucGFyc2VGcm9tKGRhdGExKTsKLSAgICBCeXRlU3RyaW5nIGRhdGEyID0gbWVzc2FnZTIudG9CeXRlU3RyaW5nKCk7Ci0gICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5TWVzc2FnZUxpdGUyID0KLSAgICAgICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlLnBhcnNlRnJvbShkYXRhMik7Ci0KLSAgICBtZXNzYWdlMSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKG1lc3NhZ2UxKS5tZXJnZUZyb20obWVzc2FnZTIpLmJ1aWxkKCk7Ci0gICAgZW1wdHlNZXNzYWdlTGl0ZTEgPSBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUubmV3QnVpbGRlcihlbXB0eU1lc3NhZ2VMaXRlMSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5tZXJnZUZyb20oZW1wdHlNZXNzYWdlTGl0ZTIpLmJ1aWxkKCk7Ci0KLSAgICBkYXRhMSA9IGVtcHR5TWVzc2FnZUxpdGUxLnRvQnl0ZVN0cmluZygpOwotICAgIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShkYXRhMSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZTEsIG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ1R5cGVUcmVhdGVkQXNVbmtub3duTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCi0gICAgLy8gd2hlbiBwYXJzaW5nLgotCi0gICAgQnl0ZVN0cmluZyBiaXphcnJvRGF0YSA9IGdldEJpemFycm9EYXRhKCk7Ci0gICAgVGVzdEFsbFR5cGVzIGFsbFR5cGVzTWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oYml6YXJyb0RhdGEpOwotICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eU1lc3NhZ2VMaXRlID0KLSAgICAgICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlLnBhcnNlRnJvbShiaXphcnJvRGF0YSk7Ci0gICAgQnl0ZVN0cmluZyBkYXRhID0gZW1wdHlNZXNzYWdlTGl0ZS50b0J5dGVTdHJpbmcoKTsKLSAgICBUZXN0QWxsVHlwZXMgYWxsVHlwZXNNZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20oZGF0YSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoYWxsVHlwZXNNZXNzYWdlLnRvU3RyaW5nKCksIGFsbFR5cGVzTWVzc2FnZTIudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkV4dGVuc2lvbnNMaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gTWFrZSBzdXJlIGZpZWxkcyBhcmUgcHJvcGVybHkgcGFyc2VkIHRvIHRoZSBVbmtub3duRmllbGRTZXQgZXZlbiB3aGVuCi0gICAgLy8gdGhleSBhcmUgZGVjbGFyZWQgYXMgZXh0ZW5zaW9uIG51bWJlcnMuCi0KLSAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0KLSAgICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnNMaXRlLnBhcnNlRnJvbShhbGxGaWVsZHNEYXRhKTsKLQotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHNEYXRhLCBtZXNzYWdlLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0V4dGVuc2lvblR5cGVUcmVhdGVkQXNVbmtub3duTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCi0gICAgLy8gd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMuCi0KLSAgICBCeXRlU3RyaW5nIGJpemFycm9EYXRhID0gZ2V0Qml6YXJyb0RhdGEoKTsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBhbGxFeHRlbnNpb25zTWVzc2FnZSA9Ci0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5wYXJzZUZyb20oYml6YXJyb0RhdGEpOwotICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eU1lc3NhZ2VMaXRlID0KLSAgICAgICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlLnBhcnNlRnJvbShiaXphcnJvRGF0YSk7Ci0KLSAgICAvLyBBbGwgZmllbGRzIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQgYXMgdW5rbm93biwgc28gdGhlIGJ5dGUgc3RyaW5ncwotICAgIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KLSAgICBhc3NlcnRFcXVhbHMoZW1wdHlNZXNzYWdlTGl0ZS50b0J5dGVTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgYWxsRXh0ZW5zaW9uc01lc3NhZ2UudG9CeXRlU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlVW5rbm93bkVudW1WYWx1ZUxpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3Igc2luZ3VsYXJGaWVsZCA9Ci0gICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgcmVwZWF0ZWRGaWVsZCA9Ci0gICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX2VudW0iKTsKLSAgICBhc3NlcnROb3ROdWxsKHNpbmd1bGFyRmllbGQpOwotICAgIGFzc2VydE5vdE51bGwocmVwZWF0ZWRGaWVsZCk7Ci0KLSAgICBCeXRlU3RyaW5nIGRhdGEgPQotICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkRmllbGQoc2luZ3VsYXJGaWVsZC5nZXROdW1iZXIoKSwKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUi5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoNSkgICAvLyBub3QgdmFsaWQKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYWRkRmllbGQocmVwZWF0ZWRGaWVsZC5nZXROdW1iZXIoKSwKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTy5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoNCkgICAvLyBub3QgdmFsaWQKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaLmdldE51bWJlcigpKQotICAgICAgICAgICAgLmFkZFZhcmludCg2KSAgIC8vIG5vdCB2YWxpZAotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpCi0gICAgICAgIC50b0J5dGVTdHJpbmcoKTsKLQotICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eU1lc3NhZ2VMaXRlID0KLSAgICAgICAgVW5pdHRlc3RMaXRlLlRlc3RFbXB0eU1lc3NhZ2VMaXRlLnBhcnNlRnJvbShkYXRhKTsKLSAgICBkYXRhID0gZW1wdHlNZXNzYWdlTGl0ZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIHsKLSAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShkYXRhKTsKLSAgICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZEVudW0oKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEFycmF5cy5hc0xpc3QoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopLAotICAgICAgICBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bUxpc3QoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCg1TCksCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHNpbmd1bGFyRmllbGQuZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpbnRMaXN0KCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNEwsIDZMKSwKLSAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRGaWVsZC5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmludExpc3QoKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9Ci0gICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLnBhcnNlRnJvbShkYXRhLCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCi0gICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEFycmF5cy5hc0xpc3QoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopLAotICAgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbikpOwotICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNUwpLAotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChzaW5ndWxhckZpZWxkLmdldE51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFyaW50TGlzdCgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDRMLCA2TCksCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHJlcGVhdGVkRmllbGQuZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpbnRMaXN0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDbGVhckxpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlNZXNzYWdlTGl0ZTEgPQotICAgICAgICBVbml0dGVzdExpdGUuVGVzdEVtcHR5TWVzc2FnZUxpdGUucGFyc2VGcm9tKGFsbEZpZWxkc0RhdGEpOwotICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eU1lc3NhZ2VMaXRlMiA9Ci0gICAgICAgIFVuaXR0ZXN0TGl0ZS5UZXN0RW1wdHlNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLm1lcmdlRnJvbShlbXB0eU1lc3NhZ2VMaXRlMSkuY2xlYXIoKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygwLCBlbXB0eU1lc3NhZ2VMaXRlMi5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBlbXB0eU1lc3NhZ2VMaXRlMi50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZGF0YS5zaXplKCkpOwotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0VGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMWM3NWZjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3R9LgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgY2xhc3MgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQSA9ICJBIjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19CID0gIkIiOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0MgPSAiQyI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19BID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkEiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19CID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkIiKTsKLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBCWVRFX1NUUklOR19DID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoIkMiKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZE9ubHlNZXRob2RzKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKLSAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOwotICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0gICAgYXNzZXJ0U2FtZShTVFJJTkdfQSwgbGlzdC5nZXQoMCkpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0IsIGxpc3QuZ2V0KDEpKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0LmdldCgyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0EsIGxpc3QuZ2V0Qnl0ZVN0cmluZygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0IsIGxpc3QuZ2V0Qnl0ZVN0cmluZygxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEJZVEVfU1RSSU5HX0MsIGxpc3QuZ2V0Qnl0ZVN0cmluZygyKSk7Ci0KLSAgICBMaXN0PEJ5dGVTdHJpbmc+IGJ5dGVTdHJpbmdMaXN0ID0gbGlzdC5hc0J5dGVTdHJpbmdMaXN0KCk7Ci0gICAgYXNzZXJ0U2FtZShsaXN0LmdldEJ5dGVTdHJpbmcoMCksIGJ5dGVTdHJpbmdMaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0U2FtZShsaXN0LmdldEJ5dGVTdHJpbmcoMSksIGJ5dGVTdHJpbmdMaXN0LmdldCgxKSk7Ci0gICAgYXNzZXJ0U2FtZShsaXN0LmdldEJ5dGVTdHJpbmcoMiksIGJ5dGVTdHJpbmdMaXN0LmdldCgyKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TW9kaWZ5TWV0aG9kcygpIHsKLSAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IHJhd0xpc3QgPSBjcmVhdGVTYW1wbGVMaXN0KCk7Ci0gICAgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QgbGlzdCA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChyYXdMaXN0KTsKLQotICAgIHRyeSB7Ci0gICAgICBsaXN0LnJlbW92ZSgwKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QuYWRkKFNUUklOR19CKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3Quc2V0KDEsIFNUUklOR19CKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBleHBlY3RlZAotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotCi0gICAgTGlzdDxCeXRlU3RyaW5nPiBieXRlU3RyaW5nTGlzdCA9IGxpc3QuYXNCeXRlU3RyaW5nTGlzdCgpOwotICAgIHRyeSB7Ci0gICAgICBieXRlU3RyaW5nTGlzdC5yZW1vdmUoMCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnl0ZVN0cmluZ0xpc3Quc2l6ZSgpKTsKLQotICAgIHRyeSB7Ci0gICAgICBieXRlU3RyaW5nTGlzdC5hZGQoQllURV9TVFJJTkdfQik7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnl0ZVN0cmluZ0xpc3Quc2l6ZSgpKTsKLQotICAgIHRyeSB7Ci0gICAgICBieXRlU3RyaW5nTGlzdC5zZXQoMSwgQllURV9TVFJJTkdfQik7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gZXhwZWN0ZWQKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnl0ZVN0cmluZ0xpc3Quc2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RJdGVyYXRvcigpIHsKLSAgICBMYXp5U3RyaW5nQXJyYXlMaXN0IHJhd0xpc3QgPSBjcmVhdGVTYW1wbGVMaXN0KCk7Ci0gICAgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QgbGlzdCA9IG5ldyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChyYXdMaXN0KTsKLQotICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICBjb3VudCsrOwotICAgICAgdHJ5IHsKLSAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgZmFpbCgpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBleHBlY3RlZAotICAgICAgfQotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoMywgY291bnQpOwotCi0gICAgTGlzdDxCeXRlU3RyaW5nPiBieXRlU3RyaW5nTGlzdCA9IGxpc3QuYXNCeXRlU3RyaW5nTGlzdCgpOwotICAgIEl0ZXJhdG9yPEJ5dGVTdHJpbmc+IGJ5dGVJdGVyID0gYnl0ZVN0cmluZ0xpc3QuaXRlcmF0b3IoKTsKLSAgICBjb3VudCA9IDA7Ci0gICAgd2hpbGUgKGJ5dGVJdGVyLmhhc05leHQoKSkgewotICAgICAgYnl0ZUl0ZXIubmV4dCgpOwotICAgICAgY291bnQrKzsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ5dGVJdGVyLnJlbW92ZSgpOwotICAgICAgICBmYWlsKCk7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgfQotICAgIGFzc2VydEVxdWFscygzLCBjb3VudCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGlzdEl0ZXJhdG9yKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKLSAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOwotCi0gICAgTGlzdEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgaW50IGNvdW50ID0gMDsKLSAgICB3aGlsZSAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIGl0ZXIubmV4dCgpOwotICAgICAgY291bnQrKzsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGl0ZXIucmVtb3ZlKCk7Ci0gICAgICAgIGZhaWwoKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGl0ZXIuc2V0KCJiYXIiKTsKLSAgICAgICAgZmFpbCgpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBleHBlY3RlZAotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgaXRlci5hZGQoImJhciIpOwotICAgICAgICBmYWlsKCk7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgfQotICAgIGFzc2VydEVxdWFscygzLCBjb3VudCk7Ci0KLSAgICBMaXN0PEJ5dGVTdHJpbmc+IGJ5dGVTdHJpbmdMaXN0ID0gbGlzdC5hc0J5dGVTdHJpbmdMaXN0KCk7Ci0gICAgTGlzdEl0ZXJhdG9yPEJ5dGVTdHJpbmc+IGJ5dGVJdGVyID0gYnl0ZVN0cmluZ0xpc3QubGlzdEl0ZXJhdG9yKCk7Ci0gICAgY291bnQgPSAwOwotICAgIHdoaWxlIChieXRlSXRlci5oYXNOZXh0KCkpIHsKLSAgICAgIGJ5dGVJdGVyLm5leHQoKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgICB0cnkgewotICAgICAgICBieXRlSXRlci5yZW1vdmUoKTsKLSAgICAgICAgZmFpbCgpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBleHBlY3RlZAotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgYnl0ZUl0ZXIuc2V0KEJZVEVfU1RSSU5HX0EpOwotICAgICAgICBmYWlsKCk7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBieXRlSXRlci5hZGQoQllURV9TVFJJTkdfQSk7Ci0gICAgICAgIGZhaWwoKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgIH0KLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGNvdW50KTsKLSAgfQotCi0gIHByaXZhdGUgTGF6eVN0cmluZ0FycmF5TGlzdCBjcmVhdGVTYW1wbGVMaXN0KCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7Ci0gICAgcmF3TGlzdC5hZGQoU1RSSU5HX0EpOwotICAgIHJhd0xpc3QuYWRkKFNUUklOR19CKTsKLSAgICByYXdMaXN0LmFkZChTVFJJTkdfQyk7Ci0gICAgcmV0dXJuIHJhd0xpc3Q7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2VsbEtub3duVHlwZXNUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dlbGxLbm93blR5cGVzVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ODJlMjAwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2VsbEtub3duVHlwZXNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5UZXN0V2VsbEtub3duVHlwZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogVGhpcyB0ZXN0IGVuc3VyZXMgdGhhdCB3ZWxsLWtub3duIHR5cGVzIGFyZSBpbmNsdWRlZCBpbiBwcm90b2J1ZiBKYXZhCi0gKiBydW50aW1lIGxpYnJhcnkuCi0gKi8KLXB1YmxpYyBjbGFzcyBXZWxsS25vd25UeXBlc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHB1YmxpYyB2b2lkIHRlc3RXZWxsS25vd25UeXBlcygpIHsKLSAgICAvLyBUaGUgdGVzdCBwYXNzZXMgaWYgaXQgY29tcGlsZXMuCi0gICAgVGVzdFdlbGxLbm93blR5cGVzIG1lc3NhZ2UgPSBUZXN0V2VsbEtub3duVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0QW55RmllbGQoKS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRBcGlGaWVsZCgpLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldER1cmF0aW9uRmllbGQoKS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFbXB0eUZpZWxkKCkuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RmllbGRNYXNrRmllbGQoKS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTb3VyY2VDb250ZXh0RmllbGQoKS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRTdHJ1Y3RGaWVsZCgpLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFRpbWVzdGFtcEZpZWxkKCkuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0VHlwZUZpZWxkKCkuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0SW50MzJGaWVsZCgpLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU2NmIzNzEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9XaXJlRm9ybWF0VGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjA2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5SYXdNZXNzYWdlU2V0OwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RmllbGRPcmRlcmluZ3M7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0T25lb2YyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdE9uZW9mQmFja3dhcmRzQ29tcGF0aWJsZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOwotaW1wb3J0IHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0LlVuaXR0ZXN0TXNldFdpcmVGb3JtYXQuVGVzdE1lc3NhZ2VTZXQ7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRlc3RzIHJlbGF0ZWQgdG8gcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbi4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXJlRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotCi0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKTsKLQotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcy5zaXplKCksIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0KLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTIgPSBUZXN0UGFja2VkVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCi0gICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbEV4dGVuc2lvbnMgdGhlbiBwYXJzZSBpdCBhcyBUZXN0QWxsVHlwZXMKLSAgICAvLyBpdCBzaG91bGQgd29yay4KLQotICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdFBhY2tlZFR5cGVzIGFuZCBUZXN0UGFja2VkRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUKLSAgICAvLyBmb3JtYXRzOyBjaGVjayB0aGF0IHRoZXkgc2VyaWFsaXplIHRvIHRoZSBzYW1lIHN0cmluZy4KLSAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpOwotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotCi0gICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlczIgPSBtZXNzYWdlMi50b0J5dGVTdHJpbmcoKTsKLQotICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkV2l0aG91dEdldFNlcmlhbGl6ZWRTaXplKCkKLSAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFdyaXRlIGRpcmVjdGx5IHRvIGFuIE91dHB1dFN0cmVhbSwgd2l0aG91dCBpbnZva2luZyBnZXRTZXJpYWxpemVkU2l6ZSgpCi0gICAgLy8gVGhpcyB1c2VkIHRvIGJlIGEgYnVnIHdoZXJlIHRoZSBzaXplIG9mIGEgcGFja2VkIGZpZWxkIHdhcyBpbmNvcnJlY3QsCi0gICAgLy8gc2luY2UgZ2V0U2VyaWFsaXplZFNpemUoKSB3YXMgbmV2ZXIgaW52b2tlZC4KLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldFBhY2tlZFNldCgpOwotCi0gICAgLy8gRGlyZWN0bHkgY29uc3RydWN0IGEgQ29kZWRPdXRwdXRTdHJlYW0gYXJvdW5kIHRoZSBhY3R1YWwgT3V0cHV0U3RyZWFtLAotICAgIC8vIGluIGNhc2Ugd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0cHV0KSBpbnZva2VzIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dFN0cmVhbSk7Ci0KLSAgICBtZXNzYWdlLndyaXRlVG8oY29kZWRPdXRwdXQpOwotCi0gICAgY29kZWRPdXRwdXQuZmx1c2goKTsKLQotICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMiA9IFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20oCi0gICAgICAgIG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9uc0xpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0QWxsVHlwZXMgYW5kIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZSBmb3JtYXRzLAotICAgIC8vIHNvIGlmIHdlIHNlcmlhbGl6ZSBhIFRlc3RBbGxFeHRlbnNpb25zIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbFR5cGVzCi0gICAgLy8gaXQgc2hvdWxkIHdvcmsuCi0KLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSA9IFRlc3RVdGlsTGl0ZS5nZXRBbGxMaXRlRXh0ZW5zaW9uc1NldCgpOwotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcy5zaXplKCksIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplUGFja2VkRXh0ZW5zaW9uc0xpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0UGFja2VkVHlwZXMgYW5kIFRlc3RQYWNrZWRFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZQotICAgIC8vIGZvcm1hdHM7IGNoZWNrIHRoYXQgdGhleSBzZXJpYWxpemUgdG8gdGhlIHNhbWUgc3RyaW5nLgotICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0gVGVzdFV0aWxMaXRlLmdldExpdGVQYWNrZWRFeHRlbnNpb25zU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTIgPSBUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKTsKLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzMiA9IG1lc3NhZ2UyLnRvQnl0ZVN0cmluZygpOwotCi0gICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLCByYXdCeXRlczIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCi0gICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbFR5cGVzIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbEV4dGVuc2lvbnMKLSAgICAvLyBpdCBzaG91bGQgd29yay4KLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMiA9Ci0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5wYXJzZUZyb20ocmF3Qnl0ZXMsIHJlZ2lzdHJ5KTsKLQotICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlUGFja2VkRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEVuc3VyZSB0aGF0IHBhY2tlZCBleHRlbnNpb25zIGNhbiBiZSBwcm9wZXJseSBwYXJzZWQuCi0gICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldFBhY2tlZEV4dGVuc2lvbnNTZXQoKTsKLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKTsKLQotICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2UyID0KLSAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnMucGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnNMaXRlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdEFsbFR5cGVzIGFuZCBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUgZm9ybWF0cywKLSAgICAvLyBzbyBpZiB3ZSBzZXJpYWxpemUgYSBUZXN0QWxsVHlwZXMgdGhlbiBwYXJzZSBpdCBhcyBUZXN0QWxsRXh0ZW5zaW9ucwotICAgIC8vIGl0IHNob3VsZCB3b3JrLgotCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeV9saXRlID0gVGVzdFV0aWxMaXRlLmdldEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpOwotCi0gICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UyID0KLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5wYXJzZUZyb20ocmF3Qnl0ZXMsIHJlZ2lzdHJ5X2xpdGUpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Ci0KLSAgICAvLyBUcnkgYWdhaW4gdXNpbmcgYSBmdWxsIGV4dGVuc2lvbiByZWdpc3RyeS4KLSAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZTMgPQotICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLnBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEVuc3VyZSB0aGF0IHBhY2tlZCBleHRlbnNpb25zIGNhbiBiZSBwcm9wZXJseSBwYXJzZWQuCi0gICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbExpdGUuZ2V0TGl0ZVBhY2tlZEV4dGVuc2lvbnNTZXQoKTsKLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSA9IFRlc3RVdGlsTGl0ZS5nZXRFeHRlbnNpb25SZWdpc3RyeUxpdGUoKTsKLQotICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBtZXNzYWdlMiA9Ci0gICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZS5wYXJzZUZyb20ocmF3Qnl0ZXMsIHJlZ2lzdHJ5KTsKLQotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydE5vdFNhbWUoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0U2VyaWFsaXplZFNpemUoKSwKLSAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEFsbEV4dGVuc2lvbnNTZXQoKS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVEZWxpbWl0ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIFRlc3RVdGlsLmdldEFsbFNldCgpLndyaXRlRGVsaW1pdGVkVG8ob3V0cHV0KTsKLSAgICBvdXRwdXQud3JpdGUoMTIpOwotICAgIFRlc3RVdGlsLmdldFBhY2tlZFNldCgpLndyaXRlRGVsaW1pdGVkVG8ob3V0cHV0KTsKLSAgICBvdXRwdXQud3JpdGUoMzQpOwotCi0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gaW5wdXQgPSBuZXcgQnl0ZUFycmF5SW5wdXRTdHJlYW0ob3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KFRlc3RBbGxUeXBlcy5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIsIGlucHV0LnJlYWQoKSk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRmllbGRzU2V0KFRlc3RQYWNrZWRUeXBlcy5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzQsIGlucHV0LnJlYWQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xLCBpbnB1dC5yZWFkKCkpOwotCi0gICAgLy8gV2UncmUgYXQgRU9GLCBzbyBwYXJzaW5nIGFnYWluIHNob3VsZCByZXR1cm4gbnVsbC4KLSAgICBhc3NlcnRUcnVlKFRlc3RBbGxUeXBlcy5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQpID09IG51bGwpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEZpZWxkc0luT3JkZXIoQnl0ZVN0cmluZyBkYXRhKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7Ci0gICAgaW50IHByZXZpb3VzVGFnID0gMDsKLQotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBhc3NlcnRUcnVlKHRhZyA+IHByZXZpb3VzVGFnKTsKLSAgICAgIHByZXZpb3VzVGFnID0gdGFnOwotICAgICAgaW5wdXQuc2tpcEZpZWxkKHRhZyk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEludGVybGVhdmVkRmllbGRzQW5kRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3RzIHRoYXQgZmllbGRzIGFyZSB3cml0dGVuIGluIG9yZGVyIGV2ZW4gd2hlbiBleHRlbnNpb24gcmFuZ2VzCi0gICAgLy8gYXJlIGludGVybGVhdmVkIHdpdGggZmllbGQgbnVtYmVycy4KLSAgICBCeXRlU3RyaW5nIGRhdGEgPQotICAgICAgVGVzdEZpZWxkT3JkZXJpbmdzLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TXlJbnQoMSkKLSAgICAgICAgLnNldE15U3RyaW5nKCJmb28iKQotICAgICAgICAuc2V0TXlGbG9hdCgxLjBGKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25JbnQsIDIzKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25TdHJpbmcsICJiYXIiKQotICAgICAgICAuYnVpbGQoKS50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRGaWVsZHNJbk9yZGVyKGRhdGEpOwotCi0gICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdEZpZWxkT3JkZXJpbmdzLmdldERlc2NyaXB0b3IoKTsKLSAgICBCeXRlU3RyaW5nIGR5bmFtaWNfZGF0YSA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RGaWVsZE9yZGVyaW5ncy5nZXREZXNjcmlwdG9yKCkpCi0gICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfaW50IiksIDFMKQotICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X3N0cmluZyIpLCAiZm9vIikKLSAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9mbG9hdCIpLCAxLjBGKQotICAgICAgICAuc2V0RmllbGQoVW5pdHRlc3RQcm90by5teUV4dGVuc2lvbkludC5nZXREZXNjcmlwdG9yKCksIDIzKQotICAgICAgICAuc2V0RmllbGQoVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZy5nZXREZXNjcmlwdG9yKCksICJiYXIiKQotICAgICAgICAuYnVpbGQoKS50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRGaWVsZHNJbk9yZGVyKGR5bmFtaWNfZGF0YSk7Ci0gIH0KLQotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5IGdldFRlc3RGaWVsZE9yZGVyaW5nc1JlZ2lzdHJ5KCkgewotICAgIEV4dGVuc2lvblJlZ2lzdHJ5IHJlc3VsdCA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgcmVzdWx0LmFkZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50KTsKLSAgICByZXN1bHQuYWRkKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25TdHJpbmcpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VNdWx0aXBsZUV4dGVuc2lvblJhbmdlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gcGFyc2UgYSBtZXNzYWdlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUgZXh0ZW5zaW9ucwotICAgIC8vIHJhbmdlcy4KLSAgICBUZXN0RmllbGRPcmRlcmluZ3Mgc291cmNlID0KLSAgICAgIFRlc3RGaWVsZE9yZGVyaW5ncy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE15SW50KDEpCi0gICAgICAgIC5zZXRNeVN0cmluZygiZm9vIikKLSAgICAgICAgLnNldE15RmxvYXQoMS4wRikKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50LCAyMykKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uU3RyaW5nLCAiYmFyIikKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgVGVzdEZpZWxkT3JkZXJpbmdzIGRlc3QgPQotICAgICAgVGVzdEZpZWxkT3JkZXJpbmdzLnBhcnNlRnJvbShzb3VyY2UudG9CeXRlU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldFRlc3RGaWVsZE9yZGVyaW5nc1JlZ2lzdHJ5KCkpOwotICAgIGFzc2VydEVxdWFscyhzb3VyY2UsIGRlc3QpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlTXVsdGlwbGVFeHRlbnNpb25SYW5nZXNEeW5hbWljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gU2FtZSBhcyBhYm92ZSBleGNlcHQgd2l0aCBEeW5hbWljTWVzc2FnZS4KLSAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0RmllbGRPcmRlcmluZ3MuZ2V0RGVzY3JpcHRvcigpOwotICAgIER5bmFtaWNNZXNzYWdlIHNvdXJjZSA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RGaWVsZE9yZGVyaW5ncy5nZXREZXNjcmlwdG9yKCkpCi0gICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfaW50IiksIDFMKQotICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X3N0cmluZyIpLCAiZm9vIikKLSAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9mbG9hdCIpLCAxLjBGKQotICAgICAgICAuc2V0RmllbGQoVW5pdHRlc3RQcm90by5teUV4dGVuc2lvbkludC5nZXREZXNjcmlwdG9yKCksIDIzKQotICAgICAgICAuc2V0RmllbGQoVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZy5nZXREZXNjcmlwdG9yKCksICJiYXIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBEeW5hbWljTWVzc2FnZSBkZXN0ID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLnBhcnNlRnJvbShkZXNjcmlwdG9yLCBzb3VyY2UudG9CeXRlU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdEZpZWxkT3JkZXJpbmdzUmVnaXN0cnkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZGVzdCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVU5LTk9XTl9UWVBFX0lEID0gMTU1MDA1NTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IFRZUEVfSURfMSA9Ci0gICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLmdldERlc2NyaXB0b3IoKS5nZXRFeHRlbnNpb25zKCkuZ2V0KDApLmdldE51bWJlcigpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JRF8yID0KLSAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIuZ2V0RGVzY3JpcHRvcigpLmdldEV4dGVuc2lvbnMoKS5nZXQoMCkuZ2V0TnVtYmVyKCk7Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXRFYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoRmxhZyh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVNZXNzYWdlU2V0Tm90RWFnZXJseSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RTZXJpYWxpemVNZXNzYWdlU2V0V2l0aEZsYWcoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHRlc3RTZXJpYWxpemVNZXNzYWdlU2V0V2l0aEZsYWcoYm9vbGVhbiBlYWdlclBhcnNpbmcpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuc2V0RWFnZXJseVBhcnNlTWVzc2FnZVNldHMoZWFnZXJQYXJzaW5nKTsKLSAgICAvLyBTZXQgdXAgYSBUZXN0TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCi0gICAgVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZVNldCA9Ci0gICAgICBUZXN0TWVzc2FnZVNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbigKLSAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbiwKLSAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubmV3QnVpbGRlcigpLnNldEkoMTIzKS5idWlsZCgpKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uLAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5uZXdCdWlsZGVyKCkuc2V0U3RyKCJmb28iKS5idWlsZCgpKQotICAgICAgICAuc2V0VW5rbm93bkZpZWxkcygKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkRmllbGQoVU5LTk9XTl9UWVBFX0lELAotICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiYmFyIikpCi0gICAgICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBtZXNzYWdlU2V0LnRvQnl0ZVN0cmluZygpOwotCi0gICAgLy8gUGFyc2UgYmFjayB1c2luZyBSYXdNZXNzYWdlU2V0IGFuZCBjaGVjayB0aGUgY29udGVudHMuCi0gICAgUmF3TWVzc2FnZVNldCByYXcgPSBSYXdNZXNzYWdlU2V0LnBhcnNlRnJvbShkYXRhKTsKLQotICAgIGFzc2VydFRydWUocmF3LmdldFVua25vd25GaWVsZHMoKS5hc01hcCgpLmlzRW1wdHkoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgcmF3LmdldEl0ZW1Db3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVFlQRV9JRF8xLCByYXcuZ2V0SXRlbSgwKS5nZXRUeXBlSWQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRZUEVfSURfMiwgcmF3LmdldEl0ZW0oMSkuZ2V0VHlwZUlkKCkpOwotICAgIGFzc2VydEVxdWFscyhVTktOT1dOX1RZUEVfSUQsIHJhdy5nZXRJdGVtKDIpLmdldFR5cGVJZCgpKTsKLQotICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlMSA9Ci0gICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEucGFyc2VGcm9tKAotICAgICAgICByYXcuZ2V0SXRlbSgwKS5nZXRNZXNzYWdlKCkudG9CeXRlQXJyYXkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZTEuZ2V0SSgpKTsKLQotICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlMiA9Ci0gICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIucGFyc2VGcm9tKAotICAgICAgICByYXcuZ2V0SXRlbSgxKS5nZXRNZXNzYWdlKCkudG9CeXRlQXJyYXkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBtZXNzYWdlMi5nZXRTdHIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoImJhciIsIHJhdy5nZXRJdGVtKDIpLmdldE1lc3NhZ2UoKS50b1N0cmluZ1V0ZjgoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VNZXNzYWdlU2V0RWFnZXJseSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RQYXJzZU1lc3NhZ2VTZXRXaXRoRmxhZyh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXROb3RFYWdlcmx5KCl0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0ZXN0UGFyc2VNZXNzYWdlU2V0V2l0aEZsYWcoZmFsc2UpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXRXaXRoRmxhZyhib29sZWFuIGVhZ2VyUGFyc2luZykKLSAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5zZXRFYWdlcmx5UGFyc2VNZXNzYWdlU2V0cyhlYWdlclBhcnNpbmcpOwotICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKLSAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2VTZXRFeHRlbnNpb24pOwotICAgIGV4dGVuc2lvblJlZ2lzdHJ5LmFkZChUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZVNldEV4dGVuc2lvbik7Ci0KLSAgICAvLyBTZXQgdXAgYSBSYXdNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZS4KLSAgICBSYXdNZXNzYWdlU2V0IHJhdyA9Ci0gICAgICBSYXdNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkSXRlbSgKLSAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0VHlwZUlkKFRZUEVfSURfMSkKLSAgICAgICAgICAgIC5zZXRNZXNzYWdlKAotICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldEkoMTIzKQotICAgICAgICAgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5hZGRJdGVtKAotICAgICAgICAgIFJhd01lc3NhZ2VTZXQuSXRlbS5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXRUeXBlSWQoVFlQRV9JRF8yKQotICAgICAgICAgICAgLnNldE1lc3NhZ2UoCi0gICAgICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuc2V0U3RyKCJmb28iKQotICAgICAgICAgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5hZGRJdGVtKAotICAgICAgICAgIFJhd01lc3NhZ2VTZXQuSXRlbS5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5zZXRUeXBlSWQoVU5LTk9XTl9UWVBFX0lEKQotICAgICAgICAgICAgLnNldE1lc3NhZ2UoQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoImJhciIpKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgQnl0ZVN0cmluZyBkYXRhID0gcmF3LnRvQnl0ZVN0cmluZygpOwotCi0gICAgLy8gUGFyc2UgYXMgYSBUZXN0TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLgotICAgIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXQgPQotICAgICAgVGVzdE1lc3NhZ2VTZXQucGFyc2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLQotICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAotICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldEkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBtZXNzYWdlU2V0LmdldEV4dGVuc2lvbigKLSAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlU2V0RXh0ZW5zaW9uKS5nZXRTdHIoKSk7Ci0KLSAgICAvLyBDaGVjayBmb3IgdW5rbm93biBmaWVsZCB3aXRoIHR5cGUgTEVOR1RIX0RFTElNSVRFRCwKLSAgICAvLyAgIG51bWJlciBVTktOT1dOX1RZUEVfSUQsIGFuZCBjb250ZW50cyAiYmFyIi4KLSAgICBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9IG1lc3NhZ2VTZXQuZ2V0VW5rbm93bkZpZWxkcygpOwotICAgIGFzc2VydEVxdWFscygxLCB1bmtub3duRmllbGRzLmFzTWFwKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRUcnVlKHVua25vd25GaWVsZHMuaGFzRmllbGQoVU5LTk9XTl9UWVBFX0lEKSk7Ci0KLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSB1bmtub3duRmllbGRzLmdldEZpZWxkKFVOS05PV05fVFlQRV9JRCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiYmFyIiwgZmllbGQuZ2V0TGVuZ3RoRGVsaW1pdGVkTGlzdCgpLmdldCgwKS50b1N0cmluZ1V0ZjgoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VNZXNzYWdlU2V0RXh0ZW5zaW9uRWFnZXJseSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RQYXJzZU1lc3NhZ2VTZXRFeHRlbnNpb25XaXRoRmxhZyh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXRFeHRlbnNpb25Ob3RFYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdFBhcnNlTWVzc2FnZVNldEV4dGVuc2lvbldpdGhGbGFnKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB0ZXN0UGFyc2VNZXNzYWdlU2V0RXh0ZW5zaW9uV2l0aEZsYWcoYm9vbGVhbiBlYWdlclBhcnNpbmcpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuc2V0RWFnZXJseVBhcnNlTWVzc2FnZVNldHMoZWFnZXJQYXJzaW5nKTsKLSAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKLQotICAgIC8vIFNldCB1cCBhIFJhd01lc3NhZ2VTZXQgd2l0aCBhIGtub3duIG1lc3NhZ2VzLgotICAgIGludCBUWVBFX0lEXzEgPQotICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKLSAgICAgICAgICAgIC5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpLmdldCgwKS5nZXROdW1iZXIoKTsKLSAgICBSYXdNZXNzYWdlU2V0IHJhdyA9Ci0gICAgICBSYXdNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkSXRlbSgKLSAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0VHlwZUlkKFRZUEVfSURfMSkKLSAgICAgICAgICAgIC5zZXRNZXNzYWdlKAotICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldEkoMTIzKQotICAgICAgICAgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgQnl0ZVN0cmluZyBkYXRhID0gcmF3LnRvQnl0ZVN0cmluZygpOwotCi0gICAgLy8gUGFyc2UgYXMgYSBUZXN0TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLgotICAgIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXQgPQotICAgICAgICBUZXN0TWVzc2FnZVNldC5wYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAotICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUxhenlNZXNzYWdlU2V0RXh0ZW5zaW9uRWFnZXJseSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RNZXJnZUxhenlNZXNzYWdlU2V0RXh0ZW5zaW9uV2l0aEZsYWcodHJ1ZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VMYXp5TWVzc2FnZVNldEV4dGVuc2lvbk5vdEVhZ2VybHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0ZXN0TWVyZ2VMYXp5TWVzc2FnZVNldEV4dGVuc2lvbldpdGhGbGFnKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB0ZXN0TWVyZ2VMYXp5TWVzc2FnZVNldEV4dGVuc2lvbldpdGhGbGFnKGJvb2xlYW4gZWFnZXJQYXJzaW5nKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLnNldEVhZ2VybHlQYXJzZU1lc3NhZ2VTZXRzKGVhZ2VyUGFyc2luZyk7Ci0gICAgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnkgPSBFeHRlbnNpb25SZWdpc3RyeS5uZXdJbnN0YW5jZSgpOwotICAgIGV4dGVuc2lvblJlZ2lzdHJ5LmFkZChUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbik7Ci0KLSAgICAvLyBTZXQgdXAgYSBSYXdNZXNzYWdlU2V0IHdpdGggYSBrbm93biBtZXNzYWdlcy4KLSAgICBpbnQgVFlQRV9JRF8xID0KLSAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCi0gICAgICAgICAgICAuZ2V0RGVzY3JpcHRvcigpLmdldEV4dGVuc2lvbnMoKS5nZXQoMCkuZ2V0TnVtYmVyKCk7Ci0gICAgUmF3TWVzc2FnZVNldCByYXcgPQotICAgICAgUmF3TWVzc2FnZVNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEl0ZW0oCi0gICAgICAgICAgUmF3TWVzc2FnZVNldC5JdGVtLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldFR5cGVJZChUWVBFX0lEXzEpCi0gICAgICAgICAgICAuc2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRJKDEyMykKLSAgICAgICAgICAgICAgICAuYnVpbGQoKS50b0J5dGVTdHJpbmcoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IHJhdy50b0J5dGVTdHJpbmcoKTsKLQotICAgIC8vIFBhcnNlIGFzIGEgVGVzdE1lc3NhZ2VTZXQgYW5kIHN0b3JlIHZhbHVlIGludG8gbGF6eSBmaWVsZAotICAgIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2VTZXQgPQotICAgICAgICBUZXN0TWVzc2FnZVNldC5wYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIC8vIE1lcmdlIGxhenkgZmllbGQgY2hlY2sgdGhlIGNvbnRlbnRzLgotICAgIG1lc3NhZ2VTZXQgPQotICAgICAgICBtZXNzYWdlU2V0LnRvQnVpbGRlcigpLm1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlU2V0LmdldEV4dGVuc2lvbigKLSAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldEkoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uRWFnZXJseSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRlc3RNZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25XaXRoRmxhZyh0cnVlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25Ob3RFYWdlcmx5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdGVzdE1lcmdlTWVzc2FnZVNldEV4dGVuc2lvbldpdGhGbGFnKGZhbHNlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCB0ZXN0TWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uV2l0aEZsYWcoYm9vbGVhbiBlYWdlclBhcnNpbmcpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUuc2V0RWFnZXJseVBhcnNlTWVzc2FnZVNldHMoZWFnZXJQYXJzaW5nKTsKLSAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKLQotICAgIC8vIFNldCB1cCBhIFJhd01lc3NhZ2VTZXQgd2l0aCBhIGtub3duIG1lc3NhZ2VzLgotICAgIGludCBUWVBFX0lEXzEgPQotICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKLSAgICAgICAgICAgIC5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpLmdldCgwKS5nZXROdW1iZXIoKTsKLSAgICBSYXdNZXNzYWdlU2V0IHJhdyA9Ci0gICAgICBSYXdNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkSXRlbSgKLSAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0VHlwZUlkKFRZUEVfSURfMSkKLSAgICAgICAgICAgIC5zZXRNZXNzYWdlKAotICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldEkoMTIzKQotICAgICAgICAgICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgLy8gU2VyaWFsaXplIFJhd01lc3NhZ2VTZXQgdW5ub3JtYWxseSAobWVzc2FnZSB2YWx1ZSBiZWZvcmUgdHlwZSBpZCkKLSAgICBCeXRlU3RyaW5nLkNvZGVkQnVpbGRlciBvdXQgPSBCeXRlU3RyaW5nLm5ld0NvZGVkQnVpbGRlcigKLSAgICAgICAgcmF3LmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IG91dC5nZXRDb2RlZE91dHB1dCgpOwotICAgIExpc3Q8UmF3TWVzc2FnZVNldC5JdGVtPiBpdGVtcyA9IHJhdy5nZXRJdGVtTGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaXRlbXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIFJhd01lc3NhZ2VTZXQuSXRlbSBpdGVtID0gaXRlbXMuZ2V0KGkpOwotICAgICAgb3V0cHV0LndyaXRlVGFnKDEsIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICAgICAgb3V0cHV0LndyaXRlQnl0ZXMoMywgaXRlbS5nZXRNZXNzYWdlKCkpOwotICAgICAgb3V0cHV0LndyaXRlSW50MzIoMiwgaXRlbS5nZXRUeXBlSWQoKSk7Ci0gICAgICBvdXRwdXQud3JpdGVUYWcoMSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApOwotICAgIH0KLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBvdXQuYnVpbGQoKTsKLQotICAgIC8vIE1lcmdlIGJ5dGVzIGludG8gVGVzdE1lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KLSAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KLSAgICAgICAgVGVzdE1lc3NhZ2VTZXQubmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlU2V0LmdldEV4dGVuc2lvbigKLSAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldEkoKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIG9uZW9mCi0gIHB1YmxpYyB2b2lkIHRlc3RPbmVvZldpcmVGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T25lb2YyLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RPbmVvZjIubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldE9uZW9mKGJ1aWxkZXIpOwotICAgIFRlc3RPbmVvZjIgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcy5zaXplKCksIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0KLSAgICBUZXN0T25lb2YyIG1lc3NhZ2UyID0gVGVzdE9uZW9mMi5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotICAgIFRlc3RVdGlsLmFzc2VydE9uZW9mU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPbmVvZk9ubHlMYXN0U2V0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE9uZW9mQmFja3dhcmRzQ29tcGF0aWJsZSBzb3VyY2UgPSBUZXN0T25lb2ZCYWNrd2FyZHNDb21wYXRpYmxlCi0gICAgICAgIC5uZXdCdWlsZGVyKCkuc2V0Rm9vSW50KDEwMCkuc2V0Rm9vU3RyaW5nKCIxMDEiKS5idWlsZCgpOwotCi0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IHNvdXJjZS50b0J5dGVTdHJpbmcoKTsKLSAgICBUZXN0T25lb2YyIG1lc3NhZ2UgPSBUZXN0T25lb2YyLnBhcnNlRnJvbShyYXdCeXRlcyk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGb29JbnQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0Zvb1N0cmluZygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODAxNzNkOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDQyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBhbnlfdGVzdDsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJhbnlfdGVzdCI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiQW55VGVzdFByb3RvIjsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKLQotbWVzc2FnZSBUZXN0QW55IHsKLSAgZ29vZ2xlLnByb3RvYnVmLkFueSB2YWx1ZSA9IDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9wcmVzZW5jZV90ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvZmllbGRfcHJlc2VuY2VfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGYzY2E4Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9wcmVzZW5jZV90ZXN0LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsOTMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGZpZWxkX3ByZXNlbmNlX3Rlc3Q7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJGaWVsZFByZXNlbmNlVGVzdFByb3RvIjsKLW9wdGlvbiBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IHRydWU7Ci0KLW1lc3NhZ2UgVGVzdEFsbFR5cGVzIHsKLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBGT08gPSAwOwotICAgIEJBUiA9IDE7Ci0gICAgQkFaID0gMjsKLSAgfQotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIGludDMyIHZhbHVlID0gMTsKLSAgfQotCi0gIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTsKLSAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyA9IDI7Ci0gIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gMzsKLSAgTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bSA9IDQ7Ci0gIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSA1OwotICBwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQgb3B0aW9uYWxfcHJvdG8yX21lc3NhZ2UgPSA2OwotCi0gIG9uZW9mIG9uZW9mX2ZpZWxkIHsKLSAgICBpbnQzMiBvbmVvZl9pbnQzMiA9IDExOwotICAgIHVpbnQzMiBvbmVvZl91aW50MzIgPSAxMjsKLSAgICBzdHJpbmcgb25lb2Zfc3RyaW5nID0gMTM7Ci0gICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxNDsKLSAgICBOZXN0ZWRFbnVtIG9uZW9mX25lc3RlZF9lbnVtID0gMTU7Ci0gICAgTmVzdGVkTWVzc2FnZSBvbmVvZl9uZXN0ZWRfbWVzc2FnZSA9IDE2OwotICAgIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCBvbmVvZl9wcm90bzJfbWVzc2FnZSA9IDE3OwotICB9Ci0KLSAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzIgPSAyMTsKLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyA9IDIyOwotICByZXBlYXRlZCBieXRlcyByZXBlYXRlZF9ieXRlcyA9IDIzOwotICByZXBlYXRlZCBOZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gMjQ7Ci0gIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPSAyNTsKLSAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkIHJlcGVhdGVkX3Byb3RvMl9tZXNzYWdlID0gMjY7Ci0gIHJlcGVhdGVkIE5lc3RlZEVudW0gcGFja2VkX25lc3RlZF9lbnVtID0gMjcgW3BhY2tlZCA9IHRydWVdOwotfQotCi1tZXNzYWdlIFRlc3RPcHRpb25hbEZpZWxkc09ubHkgewotICBpbnQzMiBvcHRpb25hbF9pbnQzMiA9IDE7Ci0gIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgPSAyOwotICBieXRlcyBvcHRpb25hbF9ieXRlcyA9IDM7Ci0gIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtID0gNDsKLSAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSA1OwotICBwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQgb3B0aW9uYWxfcHJvdG8yX21lc3NhZ2UgPSA2OwotfQotCi1tZXNzYWdlIFRlc3RSZXBlYXRlZEZpZWxkc09ubHkgewotICByZXBlYXRlZCBpbnQzMiByZXBlYXRlZF9pbnQzMiA9IDIxOwotICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nID0gMjI7Ci0gIHJlcGVhdGVkIGJ5dGVzIHJlcGVhdGVkX2J5dGVzID0gMjM7Ci0gIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gMjQ7Ci0gIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gMjU7Ci0gIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCByZXBlYXRlZF9wcm90bzJfbWVzc2FnZSA9IDI2OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbGF6eV9maWVsZHNfbGl0ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL2xhenlfZmllbGRzX2xpdGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ODBmNzIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbGF6eV9maWVsZHNfbGl0ZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IE5hb2tpIEl3YXNha2kgKG5pd2FzYWtpQGdvb2dsZS5jb20pCi0vLwotLy8gQSBwcm90byBmaWxlIHdpdGggbGF6eSBmaWVsZHMKLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0KLW1lc3NhZ2UgTGF6eU1lc3NhZ2VMaXRlIHsKLSAgb3B0aW9uYWwgaW50MzIgbnVtID0gMTsKLSAgb3B0aW9uYWwgaW50MzIgbnVtX3dpdGhfZGVmYXVsdCA9IDIgW2RlZmF1bHQgPSA0MjFdOwotICBvcHRpb25hbCBMYXp5SW5uZXJNZXNzYWdlTGl0ZSBpbm5lciA9IDMgW2xhenkgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgTGF6eUlubmVyTWVzc2FnZUxpdGUgcmVwZWF0ZWRfaW5uZXIgPSA0IFtsYXp5ID0gdHJ1ZV07Ci0KLSAgb25lb2Ygb25lb2ZfZmllbGQgewotICAgIGludDMyIG9uZW9mX251bSA9IDU7Ci0gICAgTGF6eUlubmVyTWVzc2FnZUxpdGUgb25lb2ZfaW5uZXIgPSA2IFtsYXp5ID0gdHJ1ZV07Ci0gIH0KLX0KLQotbWVzc2FnZSBMYXp5SW5uZXJNZXNzYWdlTGl0ZSB7Ci0gIG9wdGlvbmFsIGludDMyIG51bSA9IDE7Ci0gIG9wdGlvbmFsIGludDMyIG51bV93aXRoX2RlZmF1bHQgPSAyIFtkZWZhdWx0ID0gNDJdOwotICBvcHRpb25hbCBMYXp5TmVzdGVkSW5uZXJNZXNzYWdlTGl0ZSBuZXN0ZWQgPSAzIFtsYXp5ID0gdHJ1ZV07Ci0KLSAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKLX0KLQotbWVzc2FnZSBMYXp5RXh0ZW5zaW9uIHsKLSAgZXh0ZW5kIExhenlJbm5lck1lc3NhZ2VMaXRlIHsKLSAgICBvcHRpb25hbCBMYXp5RXh0ZW5zaW9uIGV4dGVuc2lvbiA9IDEwMDA7Ci0gIH0KLSAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotfQotCi1tZXNzYWdlIExhenlOZXN0ZWRJbm5lck1lc3NhZ2VMaXRlIHsKLSAgb3B0aW9uYWwgaW50MzIgbnVtID0gMTsKLSAgb3B0aW9uYWwgaW50MzIgbnVtX3dpdGhfZGVmYXVsdCA9IDIgW2RlZmF1bHQgPSA0XTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL2xpdGVfZXF1YWxzX2FuZF9oYXNoLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbGl0ZV9lcXVhbHNfYW5kX2hhc2gucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZlZWY0MmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbGl0ZV9lcXVhbHNfYW5kX2hhc2gucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBwYm9nbGVAZ29vZ2xlLmNvbSAoUGhpbCBCb2dsZSkKLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3QubGl0ZV9lcXVhbHNfYW5kX2hhc2g7Ci0KLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0KLW1lc3NhZ2UgVGVzdE9uZW9mRXF1YWxzIHsKLSAgb25lb2Ygb25lb2ZfZmllbGQgewotICAgIHN0cmluZyBuYW1lID0gMTsKLSAgICBpbnQzMiB2YWx1ZSA9IDI7Ci0gIH0KLX0KLQotbWVzc2FnZSBGb28gewotICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDE7Ci0gIHJlcGVhdGVkIEJhciBiYXIgPSAyOwotCi0gIGV4dGVuc2lvbnMgMTAwIHRvIG1heDsKLX0KLQotbWVzc2FnZSBCYXIgewotICBleHRlbmQgRm9vIHsKLSAgICBvcHRpb25hbCBCYXIgZm9vX2V4dCA9IDEwMDsKLSAgfQotCi0gIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLX0KLQotbWVzc2FnZSBCYXJQcmltZSB7Ci0gIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLX0KLQotbWVzc2FnZSBFbXB0eSB7Ci19Ci0KLWV4dGVuZCBGb28gewotICBvcHRpb25hbCBpbnQzMiB2YXJpbnQgPSAxMDE7Ci0gIG9wdGlvbmFsIGZpeGVkMzIgZml4ZWQzMiA9IDEwMjsKLSAgb3B0aW9uYWwgZml4ZWQ2NCBmaXhlZDY0ID0gMTAzOwotICBvcHRpb25hbCBncm91cCBNeUdyb3VwID0gMTA0IHsKLSAgICBvcHRpb25hbCBzdHJpbmcgZ3JvdXBfdmFsdWUgPSAxOwotICB9Ci19Ci0KLW1lc3NhZ2UgVGVzdFJlY3Vyc2l2ZU9uZW9mIHsKLSAgb25lb2YgRm9vIHsKLSAgICBUZXN0UmVjdXJzaXZlT25lb2YgciA9IDE7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL21hcF9mb3JfcHJvdG8yX2xpdGVfdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL21hcF9mb3JfcHJvdG8yX2xpdGVfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDU0MThmMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9tYXBfZm9yX3Byb3RvMl9saXRlX3Rlc3QucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw3NSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLQotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIk1hcEZvclByb3RvMlRlc3RQcm90byI7Ci1vcHRpb24gamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSB0cnVlOwotCi1tZXNzYWdlIFRlc3RNYXAgewotICBtZXNzYWdlIE1lc3NhZ2VWYWx1ZSB7Ci0gICAgb3B0aW9uYWwgaW50MzIgdmFsdWUgPSAxOwotICB9Ci0gIGVudW0gRW51bVZhbHVlIHsKLSAgICBGT08gPSAwOwotICAgIEJBUiA9IDE7Ci0gICAgQkFaID0gMjsKLSAgICBRVVggPSAzOwotICB9Ci0KLSAgbWFwPGludDMyLCBpbnQzMj4gICAgICAgICBpbnQzMl90b19pbnQzMl9maWVsZCA9IDE7Ci0gIG1hcDxpbnQzMiwgc3RyaW5nPiAgICAgICAgaW50MzJfdG9fc3RyaW5nX2ZpZWxkID0gMjsKLSAgbWFwPGludDMyLCBieXRlcz4gICAgICAgICBpbnQzMl90b19ieXRlc19maWVsZCA9IDM7Ci0gIG1hcDxpbnQzMiwgRW51bVZhbHVlPiAgICAgaW50MzJfdG9fZW51bV9maWVsZCA9IDQ7Ci0gIG1hcDxpbnQzMiwgTWVzc2FnZVZhbHVlPiAgaW50MzJfdG9fbWVzc2FnZV9maWVsZCA9IDU7Ci0gIG1hcDxzdHJpbmcsIGludDMyPiAgICAgICAgc3RyaW5nX3RvX2ludDMyX2ZpZWxkID0gNjsKLQotICBtZXNzYWdlIE1lc3NhZ2VXaXRoUmVxdWlyZWRGaWVsZHMgewotICAgIHJlcXVpcmVkIGludDMyIHZhbHVlID0gMTsKLSAgfQotICBtYXA8aW50MzIsIE1lc3NhZ2VXaXRoUmVxdWlyZWRGaWVsZHM+IHJlcXVpcmVkX21lc3NhZ2VfbWFwID0gMTE7Ci19Ci0KLW1lc3NhZ2UgVGVzdFVua25vd25FbnVtVmFsdWUgewotICAvLyBXaXJlLWNvbXBhdGlibGUgd2l0aCBUZXN0TWFwLmludDMyX3RvX2VudW1fZmllbGQgc28gd2UgY2FuIHRlc3QgdGhlCi0gIC8vIHBhcnNpbmcgYmVoYXZpb3Igb2YgVGVzdE1hcCByZWdhcmRpbmcgdW5rbm93biBlbnVtIHZhbHVlcy4KLSAgbWFwPGludDMyLCBpbnQzMj4gaW50MzJfdG9faW50MzJfZmllbGQgPSA0OwotfQotCi0vLyBUZXN0IHRoYXQgdGhlIG1hcHMgaW5pdGlhbGl6YXRpb24gY29kZSB3b3JrcyBjb3JyZWN0bHkgd2hlbiB0aGUgbWFwIGZpZWxkCi0vLyByZWZlcmVuY2VzIHRoZSBjb250YWluaW5nIG1lc3NhZ2UuCi1tZXNzYWdlIFRlc3RSZWN1cnNpdmVNYXAgewotICBvcHRpb25hbCBpbnQzMiB2YWx1ZSA9IDE7Ci0gIG1hcDxpbnQzMiwgVGVzdFJlY3Vyc2l2ZU1hcD4gcmVjdXJzaXZlX21hcF9maWVsZCA9IDI7Ci19Ci1wYWNrYWdlIG1hcF9mb3JfcHJvdG8yX2xpdGVfdGVzdDsKLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAibWFwX2xpdGVfdGVzdCI7Ci1vcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2Zvcl9wcm90bzJfdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL21hcF9mb3JfcHJvdG8yX3Rlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5YmU1MTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2Zvcl9wcm90bzJfdGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBtYXBfZm9yX3Byb3RvMl90ZXN0OwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gIm1hcF90ZXN0IjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJNYXBGb3JQcm90bzJUZXN0UHJvdG8iOwotb3B0aW9uIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gdHJ1ZTsKLQotbWVzc2FnZSBUZXN0TWFwIHsKLSAgbWVzc2FnZSBNZXNzYWdlVmFsdWUgewotICAgIG9wdGlvbmFsIGludDMyIHZhbHVlID0gMTsKLSAgfQotICBlbnVtIEVudW1WYWx1ZSB7Ci0gICAgRk9PID0gMDsKLSAgICBCQVIgPSAxOwotICAgIEJBWiA9IDI7Ci0gICAgUVVYID0gMzsKLSAgfQotCi0gIG1hcDxpbnQzMiwgaW50MzI+ICAgICAgICAgaW50MzJfdG9faW50MzJfZmllbGQgPSAxOwotICBtYXA8aW50MzIsIHN0cmluZz4gICAgICAgIGludDMyX3RvX3N0cmluZ19maWVsZCA9IDI7Ci0gIG1hcDxpbnQzMiwgYnl0ZXM+ICAgICAgICAgaW50MzJfdG9fYnl0ZXNfZmllbGQgPSAzOwotICBtYXA8aW50MzIsIEVudW1WYWx1ZT4gICAgIGludDMyX3RvX2VudW1fZmllbGQgPSA0OwotICBtYXA8aW50MzIsIE1lc3NhZ2VWYWx1ZT4gIGludDMyX3RvX21lc3NhZ2VfZmllbGQgPSA1OwotICBtYXA8c3RyaW5nLCBpbnQzMj4gICAgICAgIHN0cmluZ190b19pbnQzMl9maWVsZCA9IDY7Ci0KLSAgbWVzc2FnZSBNZXNzYWdlV2l0aFJlcXVpcmVkRmllbGRzIHsKLSAgICByZXF1aXJlZCBpbnQzMiB2YWx1ZSA9IDE7Ci0gIH0KLSAgbWFwPGludDMyLCBNZXNzYWdlV2l0aFJlcXVpcmVkRmllbGRzPiByZXF1aXJlZF9tZXNzYWdlX21hcCA9IDExOwotfQotCi1tZXNzYWdlIFRlc3RVbmtub3duRW51bVZhbHVlIHsKLSAgLy8gV2lyZS1jb21wYXRpYmxlIHdpdGggVGVzdE1hcC5pbnQzMl90b19lbnVtX2ZpZWxkIHNvIHdlIGNhbiB0ZXN0IHRoZQotICAvLyBwYXJzaW5nIGJlaGF2aW9yIG9mIFRlc3RNYXAgcmVnYXJkaW5nIHVua25vd24gZW51bSB2YWx1ZXMuCi0gIG1hcDxpbnQzMiwgaW50MzI+IGludDMyX3RvX2ludDMyX2ZpZWxkID0gNDsKLX0KLQotLy8gVGVzdCB0aGF0IHRoZSBtYXBzIGluaXRpYWxpemF0aW9uIGNvZGUgd29ya3MgY29ycmVjdGx5IHdoZW4gdGhlIG1hcCBmaWVsZAotLy8gcmVmZXJlbmNlcyB0aGUgY29udGFpbmluZyBtZXNzYWdlLgotbWVzc2FnZSBUZXN0UmVjdXJzaXZlTWFwIHsKLSAgb3B0aW9uYWwgaW50MzIgdmFsdWUgPSAxOwotICBtYXA8aW50MzIsIFRlc3RSZWN1cnNpdmVNYXA+IHJlY3Vyc2l2ZV9tYXBfZmllbGQgPSAyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2luaXRpYWxpemF0aW9uX29yZGVyX3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9tYXBfaW5pdGlhbGl6YXRpb25fb3JkZXJfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjAyYWM1OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9tYXBfaW5pdGlhbGl6YXRpb25fb3JkZXJfdGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDYxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBSZWdyZXNzaW9uIHRlc3QgZm9yIGEgbWFwIGluaXRpbGFpemF0aW9uIG9yZGVyIGJ1Zy4gVGhlIGJ1ZyBvbmx5IG1hbmlmZXN0cwotLy8gd2hlbjoKLS8vICAgMS4gQSBtZXNzYWdlIGNvbnRhaW5zIG1hcCBmaWVsZHMgYW5kIGlzIGFsc28gZXh0ZW5kYWJsZS4KLS8vICAgMi4gVGhlcmUgaXMgYSBmaWxlLWxldmVsIGV4dGVuc2lvbiBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUgcmVmZXJlbmNpbmcKLS8vICAgICAgdGhlIGFib3ZlIG1lc3NhZ2UgYXMgdGhlIGV4dGVuc2lvbiB0eXBlLgotLy8gICAzLiBUaGUgcHJvZ3JhbSBleGVjdXRlcyBpbiB0aGUgZm9sbG93aW5nIG9yZGVyOgotLy8gICAgICAgIGEuIGdldERlc2NyaXB0b3IoKSBpcyBjYWxsZWQgb24gYW5vdGhlciBtZXNzYWdlIGluIHRoZSBzYW1lIGZpbGUuCi0vLyAgICAgICAgYi4gdXNlIHByb3RvYnVmIHJlZmxlY3Rpb24gdG8gYWNjZXNzIHRoZSBtYXAgZmllbGQuCi0vLyBUaGUgc3ltcHRvbSBpcyBhIE51bGxQb2ludGVyRXhjZXB0aW9uIGJlaW5nIHRocm93bi4KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIG1hcF90ZXN0OwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gIm1hcF90ZXN0IjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJNYXBJbml0aWFsaXphdGlvbk9yZGVyVGVzdCI7Ci1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci0KLS8vIE1pcnJvcnMgdGhlIHN0cnVjdHVyZSBvZgotLy8gamF2YXRlc3RzL2NvbS9nb29nbGUvY2xvdWQvY29tbW9uL2xvZ2dpbmcvbG9nZ2luZ190ZXN0LnByb3RvLgotCi1tZXNzYWdlIE1lc3NhZ2UxIHsKLSAgbWFwPHN0cmluZywgYm9vbD4gbWFwX2ZpZWxkID0gMTsKLSAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKLX0KLQotZXh0ZW5kIE1lc3NhZ2UxIHsKLSAgb3B0aW9uYWwgTWVzc2FnZTEgcmVjdXJzaXZlX2V4dGVuc2lvbiA9IDEwMDE7Ci19Ci0KLW1lc3NhZ2UgUmVkYWN0QWxsVHlwZXMgewotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjI4MGFjMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBtYXBfdGVzdDsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJtYXBfdGVzdCI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiTWFwVGVzdFByb3RvIjsKLW9wdGlvbiBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IHRydWU7Ci0KLW1lc3NhZ2UgVGVzdE1hcCB7Ci0gIG1lc3NhZ2UgTWVzc2FnZVZhbHVlIHsKLSAgICBpbnQzMiB2YWx1ZSA9IDE7Ci0gIH0KLSAgZW51bSBFbnVtVmFsdWUgewotICAgIEZPTyA9IDA7Ci0gICAgQkFSID0gMTsKLSAgICBCQVogPSAyOwotICAgIFFVWCA9IDM7Ci0gIH0KLQotICBtYXA8aW50MzIsIGludDMyPiAgICAgICAgaW50MzJfdG9faW50MzJfZmllbGQgPSAxOwotICBtYXA8aW50MzIsIHN0cmluZz4gICAgICAgaW50MzJfdG9fc3RyaW5nX2ZpZWxkID0gMjsKLSAgbWFwPGludDMyLCBieXRlcz4gICAgICAgIGludDMyX3RvX2J5dGVzX2ZpZWxkID0gMzsKLSAgbWFwPGludDMyLCBFbnVtVmFsdWU+ICAgIGludDMyX3RvX2VudW1fZmllbGQgPSA0OwotICBtYXA8aW50MzIsIE1lc3NhZ2VWYWx1ZT4gaW50MzJfdG9fbWVzc2FnZV9maWVsZCA9IDU7Ci0gIG1hcDxzdHJpbmcsIGludDMyPiAgICAgICBzdHJpbmdfdG9faW50MzJfZmllbGQgPSA2OwotfQotCi0vLyBVc2VkIHRvIHRlc3QgdGhhdCBhIG5lc3RlZCBidWxpZGVyIGNvbnRhaW5pbmcgbWFwIGZpZWxkcyB3aWxsIHByb3Blcmx5Ci0vLyBwcm9wYWdhdGUgdGhlIG9uQ2hhbmdlIGV2ZW50IGFuZCBtYXJrIGl0cyBwYXJlbnQgZGlydHkgd2hlbiBhIGNoYW5nZQotLy8gaXMgbWFkZSB0byBhIG1hcCBmaWVsZC4KLW1lc3NhZ2UgVGVzdE9uQ2hhbmdlRXZlbnRQcm9wYWdhdGlvbiB7Ci0gIFRlc3RNYXAgb3B0aW9uYWxfbWVzc2FnZSA9IDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbXVsdGlwbGVfZmlsZXNfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI3OTA1MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNzggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vCi0vLyBBIHByb3RvIGZpbGUgd2hpY2ggdGVzdHMgdGhlIGphdmFfbXVsdGlwbGVfZmlsZXMgb3B0aW9uLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgotLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKLW9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iOwotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJNdWx0aXBsZUZpbGVzVGVzdFByb3RvIjsKLQotCi1tZXNzYWdlIE1lc3NhZ2VXaXRoTm9PdXRlciB7Ci0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgaW50MzIgaSA9IDE7Ci0gIH0KLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBCQVogPSAzOwotICB9Ci0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkID0gMTsKLSAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIGZvcmVpZ24gPSAyOwotICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMzsKLSAgb3B0aW9uYWwgRW51bVdpdGhOb091dGVyIGZvcmVpZ25fZW51bSA9IDQ7Ci19Ci0KLWV4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyB7Ci0gIG9wdGlvbmFsIGludDMyIGVudW1fdmFsdWVfb3B0aW9uID0gNzY1NDMyMTsKLX0KLQotZW51bSBFbnVtV2l0aE5vT3V0ZXIgewotICBGT08gPSAxIFsoZW51bV92YWx1ZV9vcHRpb24pID0gMTIzNDVdOwotICBCQVIgPSAyOwotfQotCi1zZXJ2aWNlIFNlcnZpY2VXaXRoTm9PdXRlciB7Ci0gIHJwYyBGb28oTWVzc2FnZVdpdGhOb091dGVyKSByZXR1cm5zKFRlc3RBbGxUeXBlcyk7Ci19Ci0KLWV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7Ci0gIG9wdGlvbmFsIGludDMyIGV4dGVuc2lvbl93aXRoX291dGVyID0gMTIzNDU2NzsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9idWlsZGVyc190ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2J1aWxkZXJzX3Rlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE1ZGQ2NmQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2J1aWxkZXJzX3Rlc3QucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0vLwotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJOZXN0ZWRCdWlsZGVycyI7Ci0KLQotbWVzc2FnZSBWZWhpY2xlIHsKLSAgb3B0aW9uYWwgRW5naW5lIGVuZ2luZSA9IDE7Ci0gIHJlcGVhdGVkIFdoZWVsIHdoZWVsID0gMjsKLX0KLQotbWVzc2FnZSBFbmdpbmUgewotICBvcHRpb25hbCBpbnQzMiBjeWxpbmRlciA9IDE7Ci0gIG9wdGlvbmFsIGludDMyIGxpdGVycyA9IDI7Ci19Ci0KLW1lc3NhZ2UgV2hlZWwgewotICBvcHRpb25hbCBpbnQzMiByYWRpdXMgPSAxOwotICBvcHRpb25hbCBpbnQzMiB3aWR0aCA9IDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbi5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzA0ZTY0OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogRGFyaWNrIFRvbmcgKGRhcmlja0Bnb29nbGUuY29tKQotLy8KLS8vIEEgcHJvdG8gZmlsZSB3aXRoIG5lc3RlZCBleHRlbnNpb25zLiBOb3RlIHRoYXQgdGhpcyBtdXN0IGJlIGRlZmluZWQgaW4KLS8vIGEgc2VwYXJhdGUgZmlsZSB0byBwcm9wZXJseSB0ZXN0IHRoZSBpbml0aWFsaXphdGlvbiBvZiB0aGUgb3V0ZXIgY2xhc3MuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1pbXBvcnQgImNvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8iOwotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi0KLW1lc3NhZ2UgTXlOZXN0ZWRFeHRlbnNpb24gewotICBleHRlbmQgTWVzc2FnZVRvQmVFeHRlbmRlZCB7Ci0gICAgb3B0aW9uYWwgTWVzc2FnZVRvQmVFeHRlbmRlZCByZWN1cnNpdmVFeHRlbnNpb24gPSAyOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE5NWMzOGIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogRGFyaWNrIFRvbmcgKGRhcmlja0Bnb29nbGUuY29tKQotLy8KLS8vIEEgcHJvdG8gZmlsZSB3aXRoIG5lc3RlZCBleHRlbnNpb25zIGZvciBhIE1lc3NhZ2VMaXRlIG1lc3NhZ2VzLiBOb3RlIHRoYXQKLS8vIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIGEgc2VwYXJhdGUgZmlsZSB0byBwcm9wZXJseSB0ZXN0IHRoZSBpbml0aWFsaXphdGlvbgotLy8gb2YgdGhlIG91dGVyIGNsYXNzLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLQotaW1wb3J0ICJjb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8iOwotCi1tZXNzYWdlIE15TmVzdGVkRXh0ZW5zaW9uTGl0ZSB7Ci0gIGV4dGVuZCBNZXNzYWdlTGl0ZVRvQmVFeHRlbmRlZCB7Ci0gICAgb3B0aW9uYWwgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQgcmVjdXJzaXZlRXh0ZW5zaW9uTGl0ZSA9IDM7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxZmFjNTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCi0vLwotLy8gQSBwcm90byBmaWxlIHdpdGggZXh0ZW5zaW9ucy4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLQotbWVzc2FnZSBNZXNzYWdlVG9CZUV4dGVuZGVkIHsKLSAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKLX0KLQotbWVzc2FnZSBNeU5vbk5lc3RlZEV4dGVuc2lvbiB7Ci19Ci0KLWV4dGVuZCBNZXNzYWdlVG9CZUV4dGVuZGVkIHsKLSAgb3B0aW9uYWwgTXlOb25OZXN0ZWRFeHRlbnNpb24gbm9uTmVzdGVkRXh0ZW5zaW9uID0gMTsKLX0KLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM3YzM2OWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IERhcmljayBUb25nIChkYXJpY2tAZ29vZ2xlLmNvbSkKLS8vCi0vLyBBIHByb3RvIGZpbGUgd2l0aCBleHRlbnNpb25zIGZvciBhIE1lc3NhZ2VMaXRlIG1lc3NhZ2VzLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLQotbWVzc2FnZSBNZXNzYWdlTGl0ZVRvQmVFeHRlbmRlZCB7Ci0gIGV4dGVuc2lvbnMgMSB0byBtYXg7Ci19Ci0KLW1lc3NhZ2UgTXlOb25OZXN0ZWRFeHRlbnNpb25MaXRlIHsKLX0KLQotZXh0ZW5kIE1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkIHsKLSAgb3B0aW9uYWwgTXlOb25OZXN0ZWRFeHRlbnNpb25MaXRlIG5vbk5lc3RlZEV4dGVuc2lvbkxpdGUgPSAxOwotfQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9vdXRlcl9jbGFzc19uYW1lX3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi9vdXRlcl9jbGFzc19uYW1lX3Rlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyMDgzNjguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvb3V0ZXJfY2xhc3NfbmFtZV90ZXN0LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi0KLS8vIFRoaXMgbWVzc2FnZSdzIG5hbWUgaXMgdGhlIHNhbWUgd2l0aCB0aGUgZGVmYXVsdCBvdXRlciBjbGFzcyBuYW1lIG9mIHRoaXMKLS8vIHByb3RvIGZpbGUuIEl0J3MgdXNlZCB0byB0ZXN0IGlmIHRoZSBjb21waWxlciBjYW4gYXZvaWQgdGhpcyBjb25mbGljdAotLy8gY29ycmVjdGx5LgotbWVzc2FnZSBPdXRlckNsYXNzTmFtZVRlc3QgewotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvb3V0ZXJfY2xhc3NfbmFtZV90ZXN0Mi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL291dGVyX2NsYXNzX25hbWVfdGVzdDIucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlNTk1NmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvb3V0ZXJfY2xhc3NfbmFtZV90ZXN0Mi5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotCi1tZXNzYWdlIFRlc3RNZXNzYWdlMiB7Ci0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgLy8gVGhpcyBtZXNzYWdlJ3MgbmFtZSBpcyB0aGUgc2FtZSB3aXRoIHRoZSBkZWZhdWx0IG91dGVyIGNsYXNzIG5hbWUgb2YgdGhpcwotICAgIC8vIHByb3RvIGZpbGUuIEl0J3MgdXNlZCB0byB0ZXN0IGlmIHRoZSBjb21waWxlciBjYW4gYXZvaWQgdGhpcyBjb25mbGljdAotICAgIC8vIGNvcnJlY3RseS4KLSAgICBtZXNzYWdlIE91dGVyQ2xhc3NOYW1lVGVzdDIgewotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvb3V0ZXJfY2xhc3NfbmFtZV90ZXN0My5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL291dGVyX2NsYXNzX25hbWVfdGVzdDMucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YThiYTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvb3V0ZXJfY2xhc3NfbmFtZV90ZXN0My5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDQ1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotCi1tZXNzYWdlIFRlc3RNZXNzYWdlMyB7Ci0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgLy8gVGhpcyBlbnVtJ3MgbmFtZSBpcyB0aGUgc2FtZSB3aXRoIHRoZSBkZWZhdWx0IG91dGVyIGNsYXNzIG5hbWUgb2YgdGhpcwotICAgIC8vIHByb3RvIGZpbGUuIEl0J3MgdXNlZCB0byB0ZXN0IGlmIHRoZSBjb21waWxlciBjYW4gYXZvaWQgdGhpcyBjb25mbGljdAotICAgIC8vIGNvcnJlY3RseS4KLSAgICBlbnVtIE91dGVyQ2xhc3NOYW1lVGVzdDMgewotICAgICAgRFVNTVlfVkFMVUUgPSAxOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmIxZjY1ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0KLS8vIFRoaXMgZmlsZSB0ZXN0cyB0aGF0IHZhcmlvdXMgaWRlbnRpZmllcnMgd29yayBhcyBmaWVsZCBhbmQgdHlwZSBuYW1lcyBldmVuCi0vLyB0aG91Z2ggdGhlIHNhbWUgaWRlbnRpZmllcnMgYXJlIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgamF2YSBjb2RlIGdlbmVyYXRvci4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLS8vIFNvbWUgZ2VuZXJpY19zZXJ2aWNlcyBvcHRpb24ocykgYWRkZWQgYXV0b21hdGljYWxseS4KLS8vIFNlZTogIGh0dHA6Ly9nby9wcm90bzItZ2VuZXJpYy1zZXJ2aWNlcy1kZWZhdWx0Ci1vcHRpb24gamF2YV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAvLyBhdXRvLWFkZGVkCi0KLXBhY2thZ2UgaW9fcHJvdG9jb2xfdGVzdHM7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVGVzdEJhZElkZW50aWZpZXJzUHJvdG8iOwotb3B0aW9uIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gdHJ1ZTsKLQotbWVzc2FnZSBUZXN0TWVzc2FnZSB7Ci0gIG9wdGlvbmFsIHN0cmluZyBjYWNoZWRfc2l6ZSA9IDE7Ci0gIG9wdGlvbmFsIHN0cmluZyBzZXJpYWxpemVkX3NpemUgPSAyOwotICBvcHRpb25hbCBzdHJpbmcgY2xhc3MgPSAzOwotfQotCi1tZXNzYWdlIERlc2NyaXB0b3IgewotICBvcHRpb24gbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IHRydWU7Ci0gIG9wdGlvbmFsIHN0cmluZyBkZXNjcmlwdG9yID0gMTsKLSAgbWVzc2FnZSBOZXN0ZWREZXNjcmlwdG9yIHsKLSAgICBvcHRpb24gbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IHRydWU7Ci0gICAgb3B0aW9uYWwgc3RyaW5nIGRlc2NyaXB0b3IgPSAxOwotICB9Ci0gIG9wdGlvbmFsIE5lc3RlZERlc2NyaXB0b3IgbmVzdGVkX2Rlc2NyaXB0b3IgPSAyOwotICBlbnVtIE5lc3RlZEVudW0gewotICAgIFVOS05PV04gPSAwOwotICAgIEZPTyA9IDE7Ci0gIH0KLX0KLQotbWVzc2FnZSBQYXJzZXIgewotICBlbnVtIFBhcnNlckVudW0gewotICAgIFVOS05PV04gPSAwOwotICAgIFBBUlNFUiA9IDE7Ci0gIH0KLSAgb3B0aW9uYWwgUGFyc2VyRW51bSBwYXJzZXIgPSAxOwotfQotCi1tZXNzYWdlIERlcHJlY2F0ZWQgewotICBlbnVtIFRlc3RFbnVtIHsKLSAgICBVTktOT1dOID0gMDsKLSAgICBGT08gPSAxOwotCi0gICAgLy8gVGVzdCBpZiBARGVwcmVjYXRlZCBhbm5vdGF0aW9uIGNvbmZsaWN0cyB3aXRoIERlcHJlY2F0ZWQgbWVzc2FnZSBuYW1lLgotICAgIEJBUiA9IDIgWyBkZXByZWNhdGVkID0gdHJ1ZSBdOwotICB9Ci0KLSAgb3B0aW9uYWwgaW50MzIgZmllbGQxID0gMSBbZGVwcmVjYXRlZD10cnVlXTsKLSAgb3B0aW9uYWwgVGVzdEVudW0gZmllbGQyID0gMiBbZGVwcmVjYXRlZD10cnVlXTsKLSAgb3B0aW9uYWwgVGVzdE1lc3NhZ2UgZmllbGQzID0gMyBbZGVwcmVjYXRlZD10cnVlXTsKLX0KLQotbWVzc2FnZSBPdmVycmlkZSB7Ci0gIG9wdGlvbmFsIGludDMyIG92ZXJyaWRlID0gMTsKLX0KLQotbWVzc2FnZSBPYmplY3QgewotICBvcHRpb25hbCBpbnQzMiBvYmplY3QgPSAxOwotICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nX29iamVjdCA9IDI7Ci19Ci0KLW1lc3NhZ2UgU3RyaW5nIHsKLSAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZyA9IDE7Ci19Ci0KLW1lc3NhZ2UgSW50ZWdlciB7Ci0gIG9wdGlvbmFsIGludDMyIGludGVnZXIgPSAxOwotfQotCi1tZXNzYWdlIExvbmcgewotICBvcHRpb25hbCBpbnQzMiBsb25nID0gMTsKLX0KLQotbWVzc2FnZSBGbG9hdCB7Ci0gIG9wdGlvbmFsIGZsb2F0IGZsb2F0ID0gMTsKLX0KLQotbWVzc2FnZSBEb3VibGUgewotICBvcHRpb25hbCBkb3VibGUgZG91YmxlID0gMTsKLX0KLQotc2VydmljZSBUZXN0Q29uZmxpY3RpbmdNZXRob2ROYW1lcyB7Ci0gIHJwYyBPdmVycmlkZShUZXN0TWVzc2FnZSkgcmV0dXJucyAoVGVzdE1lc3NhZ2UpOwotfQotCi1tZXNzYWdlIFRlc3RDb25mbGljdGluZ0ZpZWxkTmFtZXMgewotICBlbnVtIFRlc3RFbnVtIHsKLSAgICBVTktOT1dOID0gMDsKLSAgICBGT08gPSAxOwotICB9Ci0gIG1lc3NhZ2UgVGVzdE1lc3NhZ2UgewotICB9Ci0gIHJlcGVhdGVkIGludDMyIGludDMyX2ZpZWxkID0gMTsKLSAgcmVwZWF0ZWQgVGVzdEVudW0gZW51bV9maWVsZCA9IDI7Ci0gIHJlcGVhdGVkIHN0cmluZyBzdHJpbmdfZmllbGQgPSAzOwotICByZXBlYXRlZCBieXRlcyBieXRlc19maWVsZCA9IDQ7Ci0gIHJlcGVhdGVkIFRlc3RNZXNzYWdlIG1lc3NhZ2VfZmllbGQgPSA1OwotCi0gIG9wdGlvbmFsIGludDMyIGludDMyX2ZpZWxkX2NvdW50ID0gMTE7Ci0gIG9wdGlvbmFsIFRlc3RFbnVtIGVudW1fZmllbGRfY291bnQgPSAxMjsKLSAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZ19maWVsZF9jb3VudCA9IDEzOwotICBvcHRpb25hbCBieXRlcyBieXRlc19maWVsZF9jb3VudCA9IDE0OwotICBvcHRpb25hbCBUZXN0TWVzc2FnZSBtZXNzYWdlX2ZpZWxkX2NvdW50ID0gMTU7Ci0KLSAgcmVwZWF0ZWQgaW50MzIgSW50MzJGaWVsZCA9IDIxOyAgLy8gTk9fUFJPVE8zCi0gIHJlcGVhdGVkIFRlc3RFbnVtIEVudW1GaWVsZCA9IDIyOyAgLy8gTk9fUFJPVE8zCi0gIHJlcGVhdGVkIHN0cmluZyBTdHJpbmdGaWVsZCA9IDIzOyAgLy8gTk9fUFJPVE8zCi0gIHJlcGVhdGVkIGJ5dGVzIEJ5dGVzRmllbGQgPSAyNDsgIC8vIE5PX1BST1RPMwotICByZXBlYXRlZCBUZXN0TWVzc2FnZSBNZXNzYWdlRmllbGQgPSAyNTsgIC8vIE5PX1BST1RPMwotCi0gIC8vIFRoaXMgZmllbGQgY29uZmxpY3RzIHdpdGggImludDMyX2ZpZWxkIiBhcyB0aGV5IGJvdGggZ2VuZXJhdGUKLSAgLy8gdGhlIG1ldGhvZCBnZXRJbnQzMkZpZWxkTGlzdCgpLgotICByZXF1aXJlZCBpbnQzMiBpbnQzMl9maWVsZF9saXN0ID0gMzE7ICAvLyBOT19QUk9UTzMKLQotICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OyAgLy8gTk9fUFJPVE8zCi0KLSAgcmVwZWF0ZWQgaW50NjQgaW50NjRfZmllbGQgPSA0MTsKLSAgZXh0ZW5kIFRlc3RDb25mbGljdGluZ0ZpZWxkTmFtZXMgeyAgLy8gTk9fUFJPVE8zCi0gICAgLy8gV2UgZG9uJ3QgZ2VuZXJhdGUgYWNjZXNzb3JzIGZvciBleHRlbnNpb25zIHNvIHRoZSBmb2xsb3dpbmcgZXh0ZW5zaW9uCi0gICAgLy8gZmllbGRzIGRvbid0IGNvbmZsaWN0IHdpdGggdGhlIHJlcGVhdGVkIGZpZWxkICJpbnQ2NF9maWVsZCIuCi0gICAgb3B0aW9uYWwgaW50NjQgaW50NjRfZmllbGRfY291bnQgPSAxMDAxOyAgLy8gTk9fUFJPVE8zCi0gICAgb3B0aW9uYWwgaW50NjQgaW50NjRfZmllbGRfbGlzdCA9IDEwMDI7ICAvLyBOT19QUk9UTzMKLSAgfSAgLy8gTk9fUFJPVE8zCi19Ci0KLW1lc3NhZ2UgVGVzdE1hcEZpZWxkIHsKLSAgbWVzc2FnZSBNYXBGaWVsZCB7fQotICBtZXNzYWdlIFBhaXIge30KLSAgbWVzc2FnZSBNZXNzYWdlIHt9Ci0KLSAgbWFwPGludDMyLCBpbnQzMj4gbWFwX2ZpZWxkID0gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfY2hlY2tfdXRmOC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfY2hlY2tfdXRmOC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTE5YzFkYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2NoZWNrX3V0ZjgucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBKYWNvYiBCdXRjaGVyIChqYmF1bUBnb29nbGUuY29tKQotLy8KLS8vIFRlc3QgZmlsZSBvcHRpb24gamF2YV9zdHJpbmdfY2hlY2tfdXRmOC4KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIHByb3RvMl90ZXN0X2NoZWNrX3V0Zjg7Ci0KLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJUZXN0Q2hlY2tVdGY4IjsKLW9wdGlvbiBqYXZhX3N0cmluZ19jaGVja191dGY4ID0gdHJ1ZTsKLQotbWVzc2FnZSBTdHJpbmdXcmFwcGVyIHsKLSAgcmVxdWlyZWQgc3RyaW5nIHJlcSA9IDE7Ci0gIG9wdGlvbmFsIHN0cmluZyBvcHQgPSAyOwotICByZXBlYXRlZCBzdHJpbmcgcmVwID0gMzsKLX0KLQotbWVzc2FnZSBCeXRlc1dyYXBwZXIgewotICByZXF1aXJlZCBieXRlcyByZXEgPSAxOwotICBvcHRpb25hbCBieXRlcyBvcHQgPSAyOwotICByZXBlYXRlZCBieXRlcyByZXAgPSAzOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9jaGVja191dGY4X3NpemUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2NoZWNrX3V0Zjhfc2l6ZS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjA2ZDc2ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2NoZWNrX3V0Zjhfc2l6ZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IEphY29iIEJ1dGNoZXIgKGpiYXVtQGdvb2dsZS5jb20pCi0vLwotLy8gVGVzdCBmaWxlIG9wdGlvbiBqYXZhX3N0cmluZ19jaGVja191dGY4Lgotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgcHJvdG8yX3Rlc3RfY2hlY2tfdXRmOF9zaXplOwotCi1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVGVzdENoZWNrVXRmOFNpemUiOwotb3B0aW9uIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSB0cnVlOwotb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKLQotbWVzc2FnZSBTdHJpbmdXcmFwcGVyU2l6ZSB7Ci0gIHJlcXVpcmVkIHN0cmluZyByZXEgPSAxOwotICBvcHRpb25hbCBzdHJpbmcgb3B0ID0gMjsKLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcCA9IDM7Ci19Ci0KLW1lc3NhZ2UgQnl0ZXNXcmFwcGVyU2l6ZSB7Ci0gIHJlcXVpcmVkIGJ5dGVzIHJlcSA9IDE7Ci0gIG9wdGlvbmFsIGJ5dGVzIG9wdCA9IDI7Ci0gIHJlcGVhdGVkIGJ5dGVzIHJlcCA9IDM7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9jb3JlL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjhlZmQ0NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogRmVuZyBYaWFvICh4aWFvZmVuZ0Bnb29nbGUuY29tKQotLy8KLS8vIFRlc3QgdGhhdCBjdXN0b20gb3B0aW9ucyBkZWZpbmVkIGluIGEgcHJvdG8gZmlsZSdzIGRlcGVuZGVuY2llcyBhcmUgcHJvcGVybHkKLS8vIGluaXRpYWxpemVkLgotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iOwotCi1tZXNzYWdlIFRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnNDb250YWluZXIgewotICBvcHRpb25hbCBUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zIGZpZWxkID0gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfZXh0cmFfaW50ZXJmYWNlcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvY29yZS9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfZXh0cmFfaW50ZXJmYWNlcy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjQ1ZjU3Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2NvcmUvc3JjL3Rlc3QvcHJvdG8vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2V4dHJhX2ludGVyZmFjZXMucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw2MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotbWVzc2FnZSBQcm90bzEgewotICBvcHRpb24gZXhwZXJpbWVudGFsX2phdmFfbWVzc2FnZV9pbnRlcmZhY2UgPQotICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuRXh0cmFJbnRlcmZhY2VzLkhhc0Jvb2xWYWx1ZSI7Ci0KLSAgb3B0aW9uIGV4cGVyaW1lbnRhbF9qYXZhX2ludGVyZmFjZV9leHRlbmRzID0KLSAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkV4dHJhSW50ZXJmYWNlcy5IYXNCeXRlVmFsdWUiOwotCi0gIG9wdGlvbiBleHBlcmltZW50YWxfamF2YV9tZXNzYWdlX2ludGVyZmFjZSA9Ci0gICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRyYUludGVyZmFjZXMuSGFzU3RyaW5nVmFsdWU8UHJvdG8xPiI7Ci0KLSAgb3B0aW9uIGV4cGVyaW1lbnRhbF9qYXZhX2J1aWxkZXJfaW50ZXJmYWNlID0KLSAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkV4dHJhSW50ZXJmYWNlcy5IYXNTdHJpbmdWYWx1ZUJ1aWxkZXIiCi0gICAgICAiPFByb3RvMSwgQnVpbGRlcj4iOwotCi0gIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfdmFsdWUgPSAxOwotICBvcHRpb25hbCBib29sIGJvb2xfdmFsdWUgPSAyOwotICBvcHRpb25hbCBieXRlcyBieXRlX3ZhbHVlID0gMzsKLSAgb3B0aW9uYWwgaW50MzIgaW50X3ZhbHVlID0gNDsKLX0KLQotbWVzc2FnZSBQcm90bzIgewotICBvcHRpb24gZXhwZXJpbWVudGFsX2phdmFfbWVzc2FnZV9pbnRlcmZhY2UgPQotICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuRXh0cmFJbnRlcmZhY2VzLkhhc0Jvb2xWYWx1ZSI7Ci0KLSAgb3B0aW9uYWwgYm9vbCBib29sX3ZhbHVlID0gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvbGl0ZS9nZW5lcmF0ZS1zb3VyY2VzLWJ1aWxkLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvbGl0ZS9nZW5lcmF0ZS1zb3VyY2VzLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODljMjFjMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2xpdGUvZ2VuZXJhdGUtc291cmNlcy1idWlsZC54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08cHJvamVjdCBuYW1lPSJnZW5lcmF0ZS1zb3VyY2VzIj4KLSAgICA8ZWNobyBtZXNzYWdlPSJSdW5uaW5nIHByb3RvYyAuLi4iLz4KLSAgICA8bWtkaXIgZGlyPSIke2dlbmVyYXRlZC5zb3VyY2VzLmxpdGUuZGlyfSIvPgotICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7cHJvdG9jfSI+Ci0gICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YV9vdXQ9bGl0ZToke2dlbmVyYXRlZC5zb3VyY2VzLmxpdGUuZGlyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9JHtwcm90b2J1Zi5zb3VyY2UuZGlyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvYXBpLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIi8+Ci0gICAgPC9leGVjPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9saXRlL2dlbmVyYXRlLXRlc3Qtc291cmNlcy1idWlsZC54bWwgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2xpdGUvZ2VuZXJhdGUtdGVzdC1zb3VyY2VzLWJ1aWxkLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RkMWVlOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2xpdGUvZ2VuZXJhdGUtdGVzdC1zb3VyY2VzLWJ1aWxkLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLTxwcm9qZWN0IG5hbWU9ImdlbmVyYXRlLXRlc3Qtc291cmNlcyI+Ci0gICAgPG1rZGlyIGRpcj0iJHtnZW5lcmF0ZWQudGVzdHNvdXJjZXMubGl0ZS5kaXJ9Ii8+Ci0gICAgPGV4ZWMgZXhlY3V0YWJsZT0iJHtwcm90b2N9Ij4KLSAgICAgICAgPGFyZyB2YWx1ZT0iLS1qYXZhX291dD1saXRlOiR7Z2VuZXJhdGVkLnRlc3Rzb3VyY2VzLmxpdGUuZGlyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9JHtwcm90b2J1Zi5zb3VyY2UuZGlyfSIvPgotICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9JHt0ZXN0LnByb3RvLmRpcn0iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7cHJvdG9idWYuc291cmNlLmRpcn0vZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHtwcm90b2J1Zi5zb3VyY2UuZGlyfS9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL2xhenlfZmllbGRzX2xpdGUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9saXRlX2VxdWFsc19hbmRfaGFzaC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL211bHRpcGxlX2ZpbGVzX3Rlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfYnVpbGRlcnNfdGVzdC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb24ucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9vdXRlcl9jbGFzc19uYW1lX3Rlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9vdXRlcl9jbGFzc19uYW1lX3Rlc3QyLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvb3V0ZXJfY2xhc3NfbmFtZV90ZXN0My5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9jaGVja191dGY4LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9jaGVja191dGY4X3NpemUucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8iLz4KLSAgICAgICAgPGFyZyB2YWx1ZT0iJHt0ZXN0LnByb3RvLmRpcn0vY29tL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9wcmVzZW5jZV90ZXN0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2Zvcl9wcm90bzJfbGl0ZV90ZXN0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2Zvcl9wcm90bzJfdGVzdC5wcm90byIvPgotICAgICAgICA8YXJnIHZhbHVlPSIke3Rlc3QucHJvdG8uZGlyfS9jb20vZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LnByb3RvIi8+Ci0gICAgICAgIDxhcmcgdmFsdWU9IiR7dGVzdC5wcm90by5kaXJ9L2NvbS9nb29nbGUvcHJvdG9idWYvbWFwX2luaXRpYWxpemF0aW9uX29yZGVyX3Rlc3QucHJvdG8iLz4KLSAgICA8L2V4ZWM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL2xpdGUvcG9tLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvbGl0ZS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDAzZGMwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvbGl0ZS9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTU2ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWY8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+cHJvdG9idWYtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjMuMC4wLWJldGEtMzwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGFydGlmYWN0SWQ+cHJvdG9idWYtbGl0ZTwvYXJ0aWZhY3RJZD4KLSAgPHBhY2thZ2luZz5idW5kbGU8L3BhY2thZ2luZz4KLQotICA8bmFtZT5Qcm90b2NvbCBCdWZmZXJzIFtMaXRlXTwvbmFtZT4KLSAgPGRlc2NyaXB0aW9uPkEgdHJpbW1lZC1kb3duIHZlcnNpb24gb2YgdGhlIFByb3RvY29sIEJ1ZmZlcnMgbGlicmFyeS48L2Rlc2NyaXB0aW9uPgotCi0gIDxkZXBlbmRlbmNpZXM+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmp1bml0PC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5lYXN5bW9jazwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmVhc3ltb2NrPC9hcnRpZmFjdElkPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPm9yZy5lYXN5bW9jazwvZ3JvdXBJZD4KLSAgICAgIDxhcnRpZmFjdElkPmVhc3ltb2NrY2xhc3NleHRlbnNpb248L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLQotICA8cHJvcGVydGllcz4KLSAgICA8Y29yZS5yb290Pi4uL2NvcmU8L2NvcmUucm9vdD4KLSAgICA8dGVzdC5wcm90by5kaXI+JHtjb3JlLnJvb3R9L3NyYy90ZXN0L3Byb3RvPC90ZXN0LnByb3RvLmRpcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxidWlsZD4KLSAgICA8c291cmNlRGlyZWN0b3J5PiR7Y29yZS5yb290fS9zcmMvbWFpbi9qYXZhPC9zb3VyY2VEaXJlY3Rvcnk+Ci0gICAgPHRlc3RTb3VyY2VEaXJlY3Rvcnk+JHtjb3JlLnJvb3R9L3NyYy90ZXN0L2phdmE8L3Rlc3RTb3VyY2VEaXJlY3Rvcnk+Ci0KLSAgICA8cGx1Z2lucz4KLSAgICAgIDwhLS0gVXNlIEFudHJ1biBwbHVnaW4gdG8gZ2VuZXJhdGUgc291cmNlcyB3aXRoIHByb3RvYyAtLT4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDwhLS0gR2VuZXJhdGUgY29yZSBwcm90b3MgLS0+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8dGFyZ2V0PgotICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iZ2VuZXJhdGUtc291cmNlcy1idWlsZC54bWwiLz4KLSAgICAgICAgICAgICAgPC90YXJnZXQ+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgIDxnb2FsPnJ1bjwvZ29hbD4KLSAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgPC9leGVjdXRpb24+Ci0KLSAgICAgICAgICA8IS0tIEdlbmVyYXRlIHRoZSB0ZXN0IHByb3RvcyAtLT4KLSAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgPGlkPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICA8cGhhc2U+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8dGFyZ2V0PgotICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iZ2VuZXJhdGUtdGVzdC1zb3VyY2VzLWJ1aWxkLnhtbCIvPgotICAgICAgICAgICAgICA8L3RhcmdldD4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgIDwhLS0gT25seSBjb21waWxlIGEgc3Vic2V0IG9mIHRoZSBmaWxlcyAtLT4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGdlbmVyYXRlZFNvdXJjZXNEaXJlY3Rvcnk+JHtnZW5lcmF0ZWQuc291cmNlcy5saXRlLmRpcn08L2dlbmVyYXRlZFNvdXJjZXNEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGdlbmVyYXRlZFRlc3RTb3VyY2VzRGlyZWN0b3J5PiR7Z2VuZXJhdGVkLnRlc3Rzb3VyY2VzLmxpdGUuZGlyfTwvZ2VuZXJhdGVkVGVzdFNvdXJjZXNEaXJlY3Rvcnk+Ci0gICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovQWJzdHJhY3RQYXJzZXIuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL0Fic3RyYWN0UHJvdG9idWZMaXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9Cb29sZWFuQXJyYXlMaXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9CeXRlU3RyaW5nLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9Db2RlZElucHV0U3RyZWFtLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9Db2RlZE91dHB1dFN0cmVhbS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovRG91YmxlQXJyYXlMaXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9FeHRlbnNpb25MaXRlLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL0ZpZWxkU2V0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9GbG9hdEFycmF5TGlzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovR2VuZXJhdGVkTWVzc2FnZUxpdGUuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL0ludEFycmF5TGlzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovSW50ZXJuYWwuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL0ludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovTGF6eUZpZWxkTGl0ZS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovTGF6eVN0cmluZ0FycmF5TGlzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovTGF6eVN0cmluZ0xpc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL0xvbmdBcnJheUxpc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL01hcEVudHJ5TGl0ZS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovTWFwRmllbGRMaXRlLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9NZXNzYWdlTGl0ZS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovTWVzc2FnZUxpdGVPckJ1aWxkZXIuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL01lc3NhZ2VMaXRlVG9TdHJpbmcuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL011dGFiaWxpdHlPcmFjbGUuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL05pb0J5dGVTdHJpbmcuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL1BhcnNlci5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovUHJvdG9idWZBcnJheUxpc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL1Byb3RvY29sU3RyaW5nTGlzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovUm9wZUJ5dGVTdHJpbmcuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL1NtYWxsU29ydGVkTWFwLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9UZXh0Rm9ybWF0RXNjYXBlci5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL1Vua25vd25GaWVsZFNldExpdGUuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgIDxpbmNsdWRlPioqL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi9VbnNhZmVCeXRlT3BlcmF0aW9ucy5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovVXRmOC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgPGluY2x1ZGU+KiovV2lyZUZvcm1hdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgPHRlc3RJbmNsdWRlcz4KLSAgICAgICAgICAgIDx0ZXN0SW5jbHVkZT4qKi8qTGl0ZS5qYXZhPC90ZXN0SW5jbHVkZT4KLSAgICAgICAgICAgIDx0ZXN0SW5jbHVkZT4qKi9Cb29sZWFuQXJyYXlMaXN0VGVzdC5qYXZhPC90ZXN0SW5jbHVkZT4KLSAgICAgICAgICAgIDx0ZXN0SW5jbHVkZT4qKi9Eb3VibGVBcnJheUxpc3RUZXN0LmphdmE8L3Rlc3RJbmNsdWRlPgotICAgICAgICAgICAgPHRlc3RJbmNsdWRlPioqL0Zsb2F0QXJyYXlMaXN0VGVzdC5qYXZhPC90ZXN0SW5jbHVkZT4KLSAgICAgICAgICAgIDx0ZXN0SW5jbHVkZT4qKi9JbnRBcnJheUxpc3RUZXN0LmphdmE8L3Rlc3RJbmNsdWRlPgotICAgICAgICAgICAgPHRlc3RJbmNsdWRlPioqL0xhenlNZXNzYWdlTGl0ZVRlc3QuamF2YTwvdGVzdEluY2x1ZGU+Ci0gICAgICAgICAgICA8dGVzdEluY2x1ZGU+KiovTGl0ZVRlc3QuamF2YTwvdGVzdEluY2x1ZGU+Ci0gICAgICAgICAgICA8dGVzdEluY2x1ZGU+KiovTG9uZ0FycmF5TGlzdFRlc3QuamF2YTwvdGVzdEluY2x1ZGU+Ci0gICAgICAgICAgICA8dGVzdEluY2x1ZGU+KiovTmlvQnl0ZVN0cmluZ1Rlc3QuamF2YTwvdGVzdEluY2x1ZGU+Ci0gICAgICAgICAgICA8dGVzdEluY2x1ZGU+KiovUHJvdG9idWZBcnJheUxpc3RUZXN0LmphdmE8L3Rlc3RJbmNsdWRlPgotICAgICAgICAgICAgPHRlc3RJbmNsdWRlPioqL1Vua25vd25GaWVsZFNldExpdGVUZXN0LmphdmE8L3Rlc3RJbmNsdWRlPgotICAgICAgICAgIDwvdGVzdEluY2x1ZGVzPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLQotICAgICAgPCEtLSBPU0dJIGJ1bmRsZSBjb25maWd1cmF0aW9uIC0tPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGdyb3VwSWQ+b3JnLmFwYWNoZS5mZWxpeDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYnVuZGxlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPGluc3RydWN0aW9ucz4KLSAgICAgICAgICAgIDxCdW5kbGUtRG9jVVJMPmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvPC9CdW5kbGUtRG9jVVJMPgotICAgICAgICAgICAgPEJ1bmRsZS1TeW1ib2xpY05hbWU+Y29tLmdvb2dsZS5wcm90b2J1ZjwvQnVuZGxlLVN5bWJvbGljTmFtZT4KLSAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT5jb20uZ29vZ2xlLiR7cHJvamVjdC5hcnRpZmFjdElkfTt2ZXJzaW9uPSR7cHJvamVjdC52ZXJzaW9ufTwvRXhwb3J0LVBhY2thZ2U+Ci0gICAgICAgICAgPC9pbnN0cnVjdGlvbnM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgIDwvcGx1Z2lucz4KLSAgPC9idWlsZD4KLQotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9wb20ueG1sIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YTFhOTFmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvcG9tLnhtbAorKysgL2Rldi9udWxsCkBAIC0xLDE4OSArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgeG1sbnM6eHNpPSJodHRwOi8vd3d3LnczLm9yZy8yMDAxL1hNTFNjaGVtYS1pbnN0YW5jZSIKLSAgeHNpOnNjaGVtYUxvY2F0aW9uPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAgaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvbWF2ZW4tdjRfMF8wLnhzZCI+Ci0gIDxtb2RlbFZlcnNpb24+NC4wLjA8L21vZGVsVmVyc2lvbj4KLSAgPHBhcmVudD4KLSAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlPC9ncm91cElkPgotICAgIDxhcnRpZmFjdElkPmdvb2dsZTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICA8L3BhcmVudD4KLQotICA8Z3JvdXBJZD5jb20uZ29vZ2xlLnByb3RvYnVmPC9ncm91cElkPgotICA8YXJ0aWZhY3RJZD5wcm90b2J1Zi1wYXJlbnQ8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjMuMC4wLWJldGEtMzwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5wb208L3BhY2thZ2luZz4KLQotICA8bmFtZT5Qcm90b2NvbCBCdWZmZXJzIFtQYXJlbnRdPC9uYW1lPgotICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotICA8dXJsPmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvPC91cmw+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBQcm90b2NvbCBCdWZmZXJzIGFyZSBhIHdheSBvZiBlbmNvZGluZyBzdHJ1Y3R1cmVkIGRhdGEgaW4gYW4gZWZmaWNpZW50IHlldAotICAgIGV4dGVuc2libGUgZm9ybWF0LgotICA8L2Rlc2NyaXB0aW9uPgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDxwcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPlVURi04PC9wcm9qZWN0LmJ1aWxkLnNvdXJjZUVuY29kaW5nPgotICAgIDxwcm9qZWN0LnJlcG9ydGluZy5vdXRwdXRFbmNvZGluZz5VVEYtODwvcHJvamVjdC5yZXBvcnRpbmcub3V0cHV0RW5jb2Rpbmc+Ci0KLSAgICA8IS0tIFRoZXNlIGFyZSByZWxhdGl2ZSB0byB0aGUgc3VibW9kdWxlcyAtLT4KLSAgICA8cHJvdG9idWYuYmFzZWRpcj4ke3Byb2plY3QuYmFzZWRpcn0vLi4vLi48L3Byb3RvYnVmLmJhc2VkaXI+Ci0gICAgPHByb3RvYnVmLnNvdXJjZS5kaXI+JHtwcm90b2J1Zi5iYXNlZGlyfS9zcmM8L3Byb3RvYnVmLnNvdXJjZS5kaXI+Ci0gICAgPHByb3RvYz4ke3Byb3RvYnVmLnNvdXJjZS5kaXJ9L3Byb3RvYzwvcHJvdG9jPgotICAgIDx0ZXN0LnByb3RvLmRpcj5zcmMvdGVzdC9wcm90bzwvdGVzdC5wcm90by5kaXI+Ci0gICAgPGdlbmVyYXRlZC5zb3VyY2VzLmRpcj4ke3Byb2plY3QuYnVpbGQuZGlyZWN0b3J5fS9nZW5lcmF0ZWQtc291cmNlczwvZ2VuZXJhdGVkLnNvdXJjZXMuZGlyPgotICAgIDxnZW5lcmF0ZWQudGVzdHNvdXJjZXMuZGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXM8L2dlbmVyYXRlZC50ZXN0c291cmNlcy5kaXI+Ci0gICAgPGdlbmVyYXRlZC5zb3VyY2VzLmxpdGUuZGlyPiR7cHJvamVjdC5idWlsZC5kaXJlY3Rvcnl9L2dlbmVyYXRlZC1zb3VyY2VzLWxpdGU8L2dlbmVyYXRlZC5zb3VyY2VzLmxpdGUuZGlyPgotICAgIDxnZW5lcmF0ZWQudGVzdHNvdXJjZXMubGl0ZS5kaXI+JHtwcm9qZWN0LmJ1aWxkLmRpcmVjdG9yeX0vZ2VuZXJhdGVkLXRlc3Qtc291cmNlcy1saXRlPC9nZW5lcmF0ZWQudGVzdHNvdXJjZXMubGl0ZS5kaXI+Ci0gIDwvcHJvcGVydGllcz4KLQotICA8bGljZW5zZXM+Ci0gICAgPGxpY2Vuc2U+Ci0gICAgICA8bmFtZT5OZXcgQlNEIGxpY2Vuc2U8L25hbWU+Ci0gICAgICA8dXJsPmh0dHA6Ly93d3cub3BlbnNvdXJjZS5vcmcvbGljZW5zZXMvYnNkLWxpY2Vuc2UucGhwPC91cmw+Ci0gICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KLSAgICA8L2xpY2Vuc2U+Ci0gIDwvbGljZW5zZXM+Ci0KLSAgPHNjbT4KLSAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWY8L3VybD4KLSAgICA8Y29ubmVjdGlvbj5zY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYuZ2l0PC9jb25uZWN0aW9uPgotICA8L3NjbT4KLQotICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICA8c25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgPGlkPnNvbmF0eXBlLW5leHVzLXN0YWdpbmc8L2lkPgotICAgICAgPHVybD5odHRwczovL29zcy5zb25hdHlwZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzPC91cmw+Ci0gICAgPC9zbmFwc2hvdFJlcG9zaXRvcnk+Ci0gICAgPHJlcG9zaXRvcnk+Ci0gICAgICA8aWQ+c29uYXR5cGUtbmV4dXMtc3RhZ2luZzwvaWQ+Ci0gICAgICA8dXJsPmh0dHBzOi8vb3NzLnNvbmF0eXBlLm9yZy9zZXJ2aWNlL2xvY2FsL3N0YWdpbmcvZGVwbG95L21hdmVuMi88L3VybD4KLSAgICA8L3JlcG9zaXRvcnk+Ci0gIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLQotICA8ZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD5qdW5pdDwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjQuMTI8L3ZlcnNpb24+Ci0gICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmVhc3ltb2NrPC9hcnRpZmFjdElkPgotICAgICAgICA8dmVyc2lvbj4yLjI8L3ZlcnNpb24+Ci0gICAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICAgIDwvZGVwZW5kZW5jeT4KLSAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPmVhc3ltb2NrY2xhc3NleHRlbnNpb248L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjIuMi4xPC92ZXJzaW9uPgotICAgICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICA8ZGVwZW5kZW5jeT4KLSAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5ndWF2YTwvZ3JvdXBJZD4KLSAgICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgIDx2ZXJzaW9uPjE4LjA8L3ZlcnNpb24+Ci0gICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gIDwvZGVwZW5kZW5jeU1hbmFnZW1lbnQ+Ci0KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5NYW5hZ2VtZW50PgotICAgICAgPHBsdWdpbnM+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjMuMzwvdmVyc2lvbj4KLSAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxzb3VyY2U+MS42PC9zb3VyY2U+Ci0gICAgICAgICAgICA8dGFyZ2V0PjEuNjwvdGFyZ2V0PgotICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc291cmNlLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4yLjQ8L3ZlcnNpb24+Ci0gICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICA8aWQ+YXR0YWNoLXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgPGdvYWw+amFyLW5vLWZvcms8L2dvYWw+Ci0gICAgICAgICAgICAgIDwvZ29hbHM+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuMTAuMzwvdmVyc2lvbj4KLSAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgIDxpZD5hdHRhY2gtamF2YWRvY3M8L2lkPgotICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgPGdvYWw+amFyPC9nb2FsPgotICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1qYXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgIDx2ZXJzaW9uPjIuNjwvdmVyc2lvbj4KLSAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgPGdyb3VwSWQ+b3JnLmNvZGVoYXVzLm1vam88L2dyb3VwSWQ+Ci0gICAgICAgICAgPGFydGlmYWN0SWQ+YnVpbGQtaGVscGVyLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICA8dmVyc2lvbj4xLjEwPC92ZXJzaW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+My4wLjE8L3ZlcnNpb24+Ci0gICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8cGx1Z2luPgotICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgPHZlcnNpb24+MS44PC92ZXJzaW9uPgotICAgICAgICA8L3BsdWdpbj4KLSAgICAgIDwvcGx1Z2lucz4KLSAgICA8L3BsdWdpbk1hbmFnZW1lbnQ+Ci0gIDwvYnVpbGQ+Ci0KLSAgPHByb2ZpbGVzPgotICAgIDxwcm9maWxlPgotICAgICAgPGlkPnJlbGVhc2U8L2lkPgotICAgICAgPGJ1aWxkPgotICAgICAgICA8cGx1Z2lucz4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tZ3BnLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNjwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5zaWduLWFydGlmYWN0czwvaWQ+Ci0gICAgICAgICAgICAgICAgPHBoYXNlPnZlcmlmeTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+c2lnbjwvZ29hbD4KLSAgICAgICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgICAgIDwvZXhlY3V0aW9ucz4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLnNvbmF0eXBlLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5uZXh1cy1zdGFnaW5nLW1hdmVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjEuNi42PC92ZXJzaW9uPgotICAgICAgICAgICAgPGV4dGVuc2lvbnM+dHJ1ZTwvZXh0ZW5zaW9ucz4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8c2VydmVySWQ+c29uYXR5cGUtbmV4dXMtc3RhZ2luZzwvc2VydmVySWQ+Ci0gICAgICAgICAgICAgIDxuZXh1c1VybD5odHRwczovL29zcy5zb25hdHlwZS5vcmcvPC9uZXh1c1VybD4KLSAgICAgICAgICAgICAgPGF1dG9SZWxlYXNlQWZ0ZXJDbG9zZT5mYWxzZTwvYXV0b1JlbGVhc2VBZnRlckNsb3NlPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICA8L3BsdWdpbnM+Ci0gICAgICA8L2J1aWxkPgotICAgIDwvcHJvZmlsZT4KLSAgPC9wcm9maWxlcz4KLQotICA8bW9kdWxlcz4KLSAgICA8bW9kdWxlPmNvcmU8L21vZHVsZT4KLSAgICA8bW9kdWxlPmxpdGU8L21vZHVsZT4KLSAgICA8bW9kdWxlPnV0aWw8L21vZHVsZT4KLSAgPC9tb2R1bGVzPgotCi08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvcG9tLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MjM2ZjkwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9wb20ueG1sCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04Ij8+Ci08cHJvamVjdCB4bWxucz0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIgotICB4bWxuczp4c2k9Imh0dHA6Ly93d3cudzMub3JnLzIwMDEvWE1MU2NoZW1hLWluc3RhbmNlIgotICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9tYXZlbi12NF8wXzAueHNkIj4KLSAgPG1vZGVsVmVyc2lvbj40LjAuMDwvbW9kZWxWZXJzaW9uPgotICA8cGFyZW50PgotICAgIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWY8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+cHJvdG9idWYtcGFyZW50PC9hcnRpZmFjdElkPgotICAgIDx2ZXJzaW9uPjMuMC4wLWJldGEtMzwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0KLSAgPGFydGlmYWN0SWQ+cHJvdG9idWYtamF2YS11dGlsPC9hcnRpZmFjdElkPgotICA8cGFja2FnaW5nPmJ1bmRsZTwvcGFja2FnaW5nPgotCi0gIDxuYW1lPlByb3RvY29sIEJ1ZmZlcnMgW1V0aWxdPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+VXRpbGl0aWVzIGZvciBQcm90b2NvbCBCdWZmZXJzPC9kZXNjcmlwdGlvbj4KLQotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+JHtwcm9qZWN0Lmdyb3VwSWR9PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+cHJvdG9idWYtamF2YTwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPiR7cHJvamVjdC52ZXJzaW9ufTwvdmVyc2lvbj4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5jb20uZ29vZ2xlLmd1YXZhPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+Z3VhdmE8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5jb2RlLmdzb248L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5nc29uPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4zPC92ZXJzaW9uPgotICAgIDwvZGVwZW5kZW5jeT4KLSAgICA8ZGVwZW5kZW5jeT4KLSAgICAgIDxncm91cElkPmp1bml0PC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+anVuaXQ8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmVhc3ltb2NrPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+ZWFzeW1vY2s8L2FydGlmYWN0SWQ+Ci0gICAgPC9kZXBlbmRlbmN5PgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+b3JnLmVhc3ltb2NrPC9ncm91cElkPgotICAgICAgPGFydGlmYWN0SWQ+ZWFzeW1vY2tjbGFzc2V4dGVuc2lvbjwvYXJ0aWZhY3RJZD4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gIDwvZGVwZW5kZW5jaWVzPgotCi0gIDxwcm9wZXJ0aWVzPgotICAgIDwhLS0gVXNlIHRoZSBjb3JlIHByb3RvIGRpciBzbyB0aGF0IHdlIGNhbiBjYWxsIHRoZSBjb3JlIGdlbmVyYXRpb24gc2NyaXB0IC0tPgotICAgIDx0ZXN0LnByb3RvLmRpcj4uLi9jb3JlL3NyYy90ZXN0L3Byb3RvPC90ZXN0LnByb3RvLmRpcj4KLSAgPC9wcm9wZXJ0aWVzPgotCi0gIDxidWlsZD4KLSAgICA8cGx1Z2lucz4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWFudHJ1bi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgIDwhLS0gR2VuZXJhdGUgdGhlIHRlc3QgcHJvdG9zIC0tPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDx0YXJnZXQ+Ci0gICAgICAgICAgICAgICAgPCEtLSBHZW5lcmF0ZSBhbGwgb2YgdGhlIHRlc3QgcHJvdG9zIGZyb20gdGhlIGNvcmUgbW9kdWxlIC0tPgotICAgICAgICAgICAgICAgIDxhbnQgYW50ZmlsZT0iLi4vY29yZS9nZW5lcmF0ZS10ZXN0LXNvdXJjZXMtYnVpbGQueG1sIi8+Ci0KLSAgICAgICAgICAgICAgICA8IS0tIEdlbmVyYXRlIGFkZGl0aW9uYWwgdGVzdCBwcm90b3MgZm9yIHRoaXMgbW9kdWxlIC0tPgotICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9IiR7cHJvdG9jfSI+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLWphdmFfb3V0PSR7Z2VuZXJhdGVkLnRlc3Rzb3VyY2VzLmRpcn0iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9JHtwcm90b2J1Zi5zb3VyY2UuZGlyfSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3Rlc3QucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgPC9leGVjPgotICAgICAgICAgICAgICA8L3RhcmdldD4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPCEtLSBBZGQgdGhlIGdlbmVyYXRlZCB0ZXN0IHNvdXJjZXMgdG8gdGhlIGJ1aWxkIC0tPgotICAgICAgICAgIDxnZW5lcmF0ZWRUZXN0U291cmNlc0RpcmVjdG9yeT4ke2dlbmVyYXRlZC50ZXN0c291cmNlcy5kaXJ9PC9nZW5lcmF0ZWRUZXN0U291cmNlc0RpcmVjdG9yeT4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0KLSAgICAgIDwhLS0gQ29uZmlndXJlIHRoZSBPU0dJIGJ1bmRsZSAtLT4KLSAgICAgIDxwbHVnaW4+Ci0gICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUuZmVsaXg8L2dyb3VwSWQ+Ci0gICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWJ1bmRsZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgIDxpbnN0cnVjdGlvbnM+Ci0gICAgICAgICAgICA8QnVuZGxlLURvY1VSTD5odHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLzwvQnVuZGxlLURvY1VSTD4KLSAgICAgICAgICAgIDxCdW5kbGUtU3ltYm9saWNOYW1lPmNvbS5nb29nbGUucHJvdG9idWYudXRpbDwvQnVuZGxlLVN5bWJvbGljTmFtZT4KLSAgICAgICAgICAgIDxFeHBvcnQtUGFja2FnZT5jb20uZ29vZ2xlLnByb3RvYnVmLnV0aWw7dmVyc2lvbj0ke3Byb2plY3QudmVyc2lvbn08L0V4cG9ydC1QYWNrYWdlPgotICAgICAgICAgIDwvaW5zdHJ1Y3Rpb25zPgotICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICA8L3BsdWdpbj4KLQotICAgICAgPCEtLSBDb25maWd1cmUgdGhlIGZhdCBqYXIgdG8gaW5jbHVkZSBhbGwgZGVwZW5kZW5jaWVzIC0tPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8ZGVzY3JpcHRvclJlZnM+Ci0gICAgICAgICAgICA8ZGVzY3JpcHRvclJlZj5qYXItd2l0aC1kZXBlbmRlbmNpZXM8L2Rlc2NyaXB0b3JSZWY+Ci0gICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotPC9wcm9qZWN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0ZpZWxkTWFza1RyZWUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9GaWVsZE1hc2tUcmVlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2OGQ2NWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0ZpZWxkTWFza1RyZWUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI3NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwLkVudHJ5OwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotaW1wb3J0IGphdmEudXRpbC5sb2dnaW5nLkxvZ2dlcjsKLQotLyoqCi0gKiBBIHRyZWUgcmVwcmVzZW50YXRpb24gb2YgYSBGaWVsZE1hc2suIEVhY2ggbGVhZiBub2RlIGluIHRoaXMgdHJlZSByZXByZXNlbnQKLSAqIGEgZmllbGQgcGF0aCBpbiB0aGUgRmllbGRNYXNrLgotICoKLSAqIDxwPkZvciBleGFtcGxlLCBGaWVsZE1hc2sgImZvby5iYXIsZm9vLmJheixiYXIuYmF6IiBhcyBhIHRyZWUgd2lsbCBiZToKLSAqIDxwcmU+Ci0gKiAgIFtyb290XSAtKy0gZm9vIC0rLSBiYXIKLSAqICAgICAgICAgICB8ICAgICAgIHwKLSAqICAgICAgICAgICB8ICAgICAgICstIGJhegotICogICAgICAgICAgIHwKLSAqICAgICAgICAgICArLSBiYXIgLS0tIGJhegotICogPC9wcmU+Ci0gKgotICogPHA+QnkgcmVwcmVzZW50aW5nIEZpZWxkTWFza3Mgd2l0aCB0aGlzIHRyZWUgc3RydWN0dXJlIHdlIGNhbiBlYXNpbHkgY29udmVydAotICogYSBGaWVsZE1hc2sgdG8gYSBjYW5vbmljYWwgZm9ybSwgbWVyZ2UgdHdvIEZpZWxkTWFza3MsIGNhbGN1bGF0ZSB0aGUKLSAqIGludGVyc2VjdGlvbiB0byB0d28gRmllbGRNYXNrcyBhbmQgdHJhdmVyc2UgYWxsIGZpZWxkcyBzcGVjaWZpZWQgYnkgdGhlCi0gKiBGaWVsZE1hc2sgaW4gYSBtZXNzYWdlIHRyZWUuCi0gKi8KLWNsYXNzIEZpZWxkTWFza1RyZWUgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBMb2dnZXIgbG9nZ2VyID0gTG9nZ2VyLmdldExvZ2dlcihGaWVsZE1hc2tUcmVlLmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1BBVEhfU0VQQVJBVE9SX1JFR0VYID0gIlxcLiI7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTm9kZSB7Ci0gICAgcHVibGljIFRyZWVNYXA8U3RyaW5nLCBOb2RlPiBjaGlsZHJlbiA9IG5ldyBUcmVlTWFwPFN0cmluZywgTm9kZT4oKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgTm9kZSByb290ID0gbmV3IE5vZGUoKTsKLQotICAvKiogQ3JlYXRlcyBhbiBlbXB0eSBGaWVsZE1hc2tUcmVlLiAqLwotICBwdWJsaWMgRmllbGRNYXNrVHJlZSgpIHt9Ci0KLSAgLyoqIENyZWF0ZXMgYSBGaWVsZE1hc2tUcmVlIGZvciBhIGdpdmVuIEZpZWxkTWFzay4gKi8KLSAgcHVibGljIEZpZWxkTWFza1RyZWUoRmllbGRNYXNrIG1hc2spIHsKLSAgICBtZXJnZUZyb21GaWVsZE1hc2sobWFzayk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gRmllbGRNYXNrVXRpbC50b1N0cmluZyh0b0ZpZWxkTWFzaygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBZGRzIGEgZmllbGQgcGF0aCB0byB0aGUgdHJlZS4gSW4gYSBGaWVsZE1hc2ssIGV2ZXJ5IGZpZWxkIHBhdGggbWF0Y2hlcyB0aGUKLSAgICogc3BlY2lmaWVkIGZpZWxkIGFzIHdlbGwgYXMgYWxsIGl0cyBzdWItZmllbGRzLiBGb3IgZXhhbXBsZSwgYSBmaWVsZCBwYXRoCi0gICAqICJmb28uYmFyIiBtYXRjaGVzIGZpZWxkICJmb28uYmFyIiBhbmQgYWxzbyAiZm9vLmJhci5iYXoiLCBldGMuIFdoZW4gYWRkaW5nCi0gICAqIGEgZmllbGQgcGF0aCB0byB0aGUgdHJlZSwgcmVkdW5kYW50IHN1Yi1wYXRocyB3aWxsIGJlIHJlbW92ZWQuIFRoYXQgaXMsCi0gICAqIGFmdGVyIGFkZGluZyAiZm9vLmJhciIgdG8gdGhlIHRyZWUsICJmb28uYmFyLmJheiIgd2lsbCBiZSByZW1vdmVkIGlmIGl0Ci0gICAqIGV4aXN0cywgd2hpY2ggd2lsbCB0dXJuIHRoZSB0cmVlIG5vZGUgZm9yICJmb28uYmFyIiB0byBhIGxlYWYgbm9kZS4KLSAgICogTGlrZXdpc2UsIGlmIHRoZSBmaWVsZCBwYXRoIHRvIGFkZCBpcyBhIHN1Yi1wYXRoIG9mIGFuIGV4aXN0aW5nIGxlYWYgbm9kZSwKLSAgICogbm90aGluZyB3aWxsIGJlIGNoYW5nZWQgaW4gdGhlIHRyZWUuCi0gICAqLwotICBwdWJsaWMgRmllbGRNYXNrVHJlZSBhZGRGaWVsZFBhdGgoU3RyaW5nIHBhdGgpIHsKLSAgICBTdHJpbmdbXSBwYXJ0cyA9IHBhdGguc3BsaXQoRklFTERfUEFUSF9TRVBBUkFUT1JfUkVHRVgpOwotICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMCkgewotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotICAgIE5vZGUgbm9kZSA9IHJvb3Q7Ci0gICAgYm9vbGVhbiBjcmVhdGVOZXdCcmFuY2ggPSBmYWxzZTsKLSAgICAvLyBGaW5kIHRoZSBtYXRjaGluZyBub2RlIGluIHRoZSB0cmVlLgotICAgIGZvciAoU3RyaW5nIHBhcnQgOiBwYXJ0cykgewotICAgICAgLy8gQ2hlY2sgd2hldGhlciB0aGUgcGF0aCBtYXRjaGVzIGFuIGV4aXN0aW5nIGxlYWYgbm9kZS4KLSAgICAgIGlmICghY3JlYXRlTmV3QnJhbmNoICYmIG5vZGUgIT0gcm9vdCAmJiBub2RlLmNoaWxkcmVuLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBUaGUgcGF0aCB0byBhZGQgaXMgYSBzdWItcGF0aCBvZiBhbiBleGlzdGluZyBsZWFmIG5vZGUuCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgaWYgKG5vZGUuY2hpbGRyZW4uY29udGFpbnNLZXkocGFydCkpIHsKLSAgICAgICAgbm9kZSA9IG5vZGUuY2hpbGRyZW4uZ2V0KHBhcnQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY3JlYXRlTmV3QnJhbmNoID0gdHJ1ZTsKLSAgICAgICAgTm9kZSB0bXAgPSBuZXcgTm9kZSgpOwotICAgICAgICBub2RlLmNoaWxkcmVuLnB1dChwYXJ0LCB0bXApOwotICAgICAgICBub2RlID0gdG1wOwotICAgICAgfQotICAgIH0KLSAgICAvLyBUdXJuIHRoZSBtYXRjaGluZyBub2RlIGludG8gYSBsZWFmIG5vZGUgKGkuZS4sIHJlbW92ZSBzdWItcGF0aHMpLgotICAgIG5vZGUuY2hpbGRyZW4uY2xlYXIoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBNZXJnZXMgYWxsIGZpZWxkIHBhdGhzIGluIGEgRmllbGRNYXNrIGludG8gdGhpcyB0cmVlLgotICAgKi8KLSAgcHVibGljIEZpZWxkTWFza1RyZWUgbWVyZ2VGcm9tRmllbGRNYXNrKEZpZWxkTWFzayBtYXNrKSB7Ci0gICAgZm9yIChTdHJpbmcgcGF0aCA6IG1hc2suZ2V0UGF0aHNMaXN0KCkpIHsKLSAgICAgIGFkZEZpZWxkUGF0aChwYXRoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKiogQ29udmVydHMgdGhpcyB0cmVlIHRvIGEgRmllbGRNYXNrLiAqLwotICBwdWJsaWMgRmllbGRNYXNrIHRvRmllbGRNYXNrKCkgewotICAgIGlmIChyb290LmNoaWxkcmVuLmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIEZpZWxkTWFzay5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICB9Ci0gICAgTGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgZ2V0RmllbGRQYXRocyhyb290LCAiIiwgcGF0aHMpOwotICAgIHJldHVybiBGaWVsZE1hc2submV3QnVpbGRlcigpLmFkZEFsbFBhdGhzKHBhdGhzKS5idWlsZCgpOwotICB9Ci0KLSAgLyoqIEdhdGhlcnMgYWxsIGZpZWxkIHBhdGhzIGluIGEgc3ViLXRyZWUuICovCi0gIHByaXZhdGUgdm9pZCBnZXRGaWVsZFBhdGhzKE5vZGUgbm9kZSwgU3RyaW5nIHBhdGgsIExpc3Q8U3RyaW5nPiBwYXRocykgewotICAgIGlmIChub2RlLmNoaWxkcmVuLmlzRW1wdHkoKSkgewotICAgICAgcGF0aHMuYWRkKHBhdGgpOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmb3IgKEVudHJ5PFN0cmluZywgTm9kZT4gZW50cnkgOiBub2RlLmNoaWxkcmVuLmVudHJ5U2V0KCkpIHsKLSAgICAgIFN0cmluZyBjaGlsZFBhdGggPSBwYXRoLmlzRW1wdHkoKSA/IGVudHJ5LmdldEtleSgpIDogcGF0aCArICIuIiArIGVudHJ5LmdldEtleSgpOwotICAgICAgZ2V0RmllbGRQYXRocyhlbnRyeS5nZXRWYWx1ZSgpLCBjaGlsZFBhdGgsIHBhdGhzKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQWRkcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHRoaXMgdHJlZSB3aXRoIHRoZSBnaXZlbiB7QGNvZGUgcGF0aH0gdG8KLSAgICoge0Bjb2RlIG91dHB1dH0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBpbnRlcnNlY3RGaWVsZFBhdGgoU3RyaW5nIHBhdGgsIEZpZWxkTWFza1RyZWUgb3V0cHV0KSB7Ci0gICAgaWYgKHJvb3QuY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIFN0cmluZ1tdIHBhcnRzID0gcGF0aC5zcGxpdChGSUVMRF9QQVRIX1NFUEFSQVRPUl9SRUdFWCk7Ci0gICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIE5vZGUgbm9kZSA9IHJvb3Q7Ci0gICAgZm9yIChTdHJpbmcgcGFydCA6IHBhcnRzKSB7Ci0gICAgICBpZiAobm9kZSAhPSByb290ICYmIG5vZGUuY2hpbGRyZW4uaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIFRoZSBnaXZlbiBwYXRoIGlzIGEgc3ViLXBhdGggb2YgYW4gZXhpc3RpbmcgbGVhZiBub2RlIGluIHRoZSB0cmVlLgotICAgICAgICBvdXRwdXQuYWRkRmllbGRQYXRoKHBhdGgpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAobm9kZS5jaGlsZHJlbi5jb250YWluc0tleShwYXJ0KSkgewotICAgICAgICBub2RlID0gbm9kZS5jaGlsZHJlbi5nZXQocGFydCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFdlIGZvdW5kIGEgbWF0Y2hpbmcgbm9kZSBmb3IgdGhlIHBhdGguIEFsbCBsZWFmIGNoaWxkcmVuIG9mIHRoaXMgbWF0Y2hpbmcKLSAgICAvLyBub2RlIGlzIGluIHRoZSBpbnRlcnNlY3Rpb24uCi0gICAgTGlzdDxTdHJpbmc+IHBhdGhzID0gbmV3IEFycmF5TGlzdDxTdHJpbmc+KCk7Ci0gICAgZ2V0RmllbGRQYXRocyhub2RlLCBwYXRoLCBwYXRocyk7Ci0gICAgZm9yIChTdHJpbmcgdmFsdWUgOiBwYXRocykgewotICAgICAgb3V0cHV0LmFkZEZpZWxkUGF0aCh2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIE1lcmdlcyBhbGwgZmllbGRzIHNwZWNpZmllZCBieSB0aGlzIEZpZWxkTWFza1RyZWUgZnJvbSB7QGNvZGUgc291cmNlfSB0bwotICAgKiB7QGNvZGUgZGVzdGluYXRpb259LgotICAgKi8KLSAgcHVibGljIHZvaWQgbWVyZ2UoCi0gICAgICBNZXNzYWdlIHNvdXJjZSwgTWVzc2FnZS5CdWlsZGVyIGRlc3RpbmF0aW9uLCBGaWVsZE1hc2tVdGlsLk1lcmdlT3B0aW9ucyBvcHRpb25zKSB7Ci0gICAgaWYgKHNvdXJjZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpICE9IGRlc3RpbmF0aW9uLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkNhbm5vdCBtZXJnZSBtZXNzYWdlcyBvZiBkaWZmZXJlbnQgdHlwZXMuIik7Ci0gICAgfQotICAgIGlmIChyb290LmNoaWxkcmVuLmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBtZXJnZShyb290LCAiIiwgc291cmNlLCBkZXN0aW5hdGlvbiwgb3B0aW9ucyk7Ci0gIH0KLQotICAvKiogTWVyZ2VzIGFsbCBmaWVsZHMgc3BlY2lmaWVkIGJ5IGEgc3ViLXRyZWUgZnJvbSB7QGNvZGUgc291cmNlfSB0bwotICAgKiB7QGNvZGUgZGVzdGluYXRpb259LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIG1lcmdlKAotICAgICAgTm9kZSBub2RlLAotICAgICAgU3RyaW5nIHBhdGgsCi0gICAgICBNZXNzYWdlIHNvdXJjZSwKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBkZXN0aW5hdGlvbiwKLSAgICAgIEZpZWxkTWFza1V0aWwuTWVyZ2VPcHRpb25zIG9wdGlvbnMpIHsKLSAgICBhc3NlcnQgc291cmNlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkgPT0gZGVzdGluYXRpb24uZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLQotICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IHNvdXJjZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotICAgIGZvciAoRW50cnk8U3RyaW5nLCBOb2RlPiBlbnRyeSA6IG5vZGUuY2hpbGRyZW4uZW50cnlTZXQoKSkgewotICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgbG9nZ2VyLndhcm5pbmcoCi0gICAgICAgICAgICAiQ2Fubm90IGZpbmQgZmllbGQgXCIiCi0gICAgICAgICAgICAgICAgKyBlbnRyeS5nZXRLZXkoKQotICAgICAgICAgICAgICAgICsgIlwiIGluIG1lc3NhZ2UgdHlwZSAiCi0gICAgICAgICAgICAgICAgKyBkZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCkpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICghZW50cnkuZ2V0VmFsdWUoKS5jaGlsZHJlbi5pc0VtcHR5KCkpIHsKLSAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSB8fCBmaWVsZC5nZXRKYXZhVHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgbG9nZ2VyLndhcm5pbmcoCi0gICAgICAgICAgICAgICJGaWVsZCBcIiIKLSAgICAgICAgICAgICAgICAgICsgZmllbGQuZ2V0RnVsbE5hbWUoKQotICAgICAgICAgICAgICAgICAgKyAiXCIgaXMgbm90IGEgIgotICAgICAgICAgICAgICAgICAgKyAic2luZ2x1YXIgbWVzc2FnZSBmaWVsZCBhbmQgY2Fubm90IGhhdmUgc3ViLWZpZWxkcy4iKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBTdHJpbmcgY2hpbGRQYXRoID0gcGF0aC5pc0VtcHR5KCkgPyBlbnRyeS5nZXRLZXkoKSA6IHBhdGggKyAiLiIgKyBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgbWVyZ2UoCi0gICAgICAgICAgICBlbnRyeS5nZXRWYWx1ZSgpLAotICAgICAgICAgICAgY2hpbGRQYXRoLAotICAgICAgICAgICAgKE1lc3NhZ2UpIHNvdXJjZS5nZXRGaWVsZChmaWVsZCksCi0gICAgICAgICAgICBkZXN0aW5hdGlvbi5nZXRGaWVsZEJ1aWxkZXIoZmllbGQpLAotICAgICAgICAgICAgb3B0aW9ucyk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICBpZiAob3B0aW9ucy5yZXBsYWNlUmVwZWF0ZWRGaWVsZHMoKSkgewotICAgICAgICAgIGRlc3RpbmF0aW9uLnNldEZpZWxkKGZpZWxkLCBzb3VyY2UuZ2V0RmllbGQoZmllbGQpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmb3IgKE9iamVjdCBlbGVtZW50IDogKExpc3QpIHNvdXJjZS5nZXRGaWVsZChmaWVsZCkpIHsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIGVsZW1lbnQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICBpZiAob3B0aW9ucy5yZXBsYWNlTWVzc2FnZUZpZWxkcygpKSB7Ci0gICAgICAgICAgICBpZiAoIXNvdXJjZS5oYXNGaWVsZChmaWVsZCkpIHsKLSAgICAgICAgICAgICAgZGVzdGluYXRpb24uY2xlYXJGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBkZXN0aW5hdGlvbi5zZXRGaWVsZChmaWVsZCwgc291cmNlLmdldEZpZWxkKGZpZWxkKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChzb3VyY2UuaGFzRmllbGQoZmllbGQpKSB7Ci0gICAgICAgICAgICAgIGRlc3RpbmF0aW9uLmdldEZpZWxkQnVpbGRlcihmaWVsZCkubWVyZ2VGcm9tKChNZXNzYWdlKSBzb3VyY2UuZ2V0RmllbGQoZmllbGQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHNvdXJjZS5oYXNGaWVsZChmaWVsZCkgfHwgIW9wdGlvbnMucmVwbGFjZVByaW1pdGl2ZUZpZWxkcygpKSB7Ci0gICAgICAgICAgICBkZXN0aW5hdGlvbi5zZXRGaWVsZChmaWVsZCwgc291cmNlLmdldEZpZWxkKGZpZWxkKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGRlc3RpbmF0aW9uLmNsZWFyRmllbGQoZmllbGQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0ZpZWxkTWFza1V0aWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9GaWVsZE1hc2tVdGlsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk2OTYxNTIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0ZpZWxkTWFza1V0aWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWw7Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5jb21tb24uYmFzZS5QcmVjb25kaXRpb25zLmNoZWNrQXJndW1lbnQ7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLmNvbW1vbi5wcmltaXRpdmVzLkludHM7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRmllbGRNYXNrOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWw7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBVdGlsaXR5IGhlbHBlciBmdW5jdGlvbnMgdG8gd29yayB3aXRoIHtAbGluayBjb20uZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza30uCi0gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZE1hc2tVdGlsIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nIEZJRUxEX1BBVEhfU0VQQVJBVE9SID0gIiwiOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgRklFTERfUEFUSF9TRVBBUkFUT1JfUkVHRVggPSAiLCI7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFN0cmluZyBGSUVMRF9TRVBBUkFUT1JfUkVHRVggPSAiXFwuIjsKLSAgCi0gIHByaXZhdGUgRmllbGRNYXNrVXRpbCgpIHt9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIGEgRmllbGRNYXNrIHRvIGEgc3RyaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoRmllbGRNYXNrIGZpZWxkTWFzaykgewotICAgIC8vIFRPRE8oeGlhb2ZlbmcpOiBDb25zaWRlciB1c2luZyBjb20uZ29vZ2xlLmNvbW1vbi5iYXNlLkpvaW5lciBoZXJlIGluc3RlYWQuCi0gICAgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgIGZvciAoU3RyaW5nIHZhbHVlIDogZmllbGRNYXNrLmdldFBhdGhzTGlzdCgpKSB7Ci0gICAgICBpZiAodmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgIC8vIElnbm9yZSBlbXB0eSBwYXRocy4KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZmlyc3QpIHsKLSAgICAgICAgZmlyc3QgPSBmYWxzZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoRklFTERfUEFUSF9TRVBBUkFUT1IpOwotICAgICAgfQotICAgICAgcmVzdWx0LmFwcGVuZCh2YWx1ZSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgZnJvbSBhIHN0cmluZyB0byBhIEZpZWxkTWFzay4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRmllbGRNYXNrIGZyb21TdHJpbmcoU3RyaW5nIHZhbHVlKSB7Ci0gICAgLy8gVE9ETyh4aWFvZmVuZyk6IENvbnNpZGVyIHVzaW5nIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXIgaGVyZSBpbnN0ZWFkLgotICAgIHJldHVybiBmcm9tU3RyaW5nTGlzdCgKLSAgICAgICAgbnVsbCwgQXJyYXlzLmFzTGlzdCh2YWx1ZS5zcGxpdChGSUVMRF9QQVRIX1NFUEFSQVRPUl9SRUdFWCkpKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgZnJvbSBhIHN0cmluZyB0byBhIEZpZWxkTWFzayBhbmQgdmFsaWRhdGVzIGFsbCBmaWVsZCBwYXRocy4KLSAgICogCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgZmllbGQgcGF0aCBpcyBpbnZhbGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWVsZE1hc2sgZnJvbVN0cmluZyhDbGFzczw/IGV4dGVuZHMgTWVzc2FnZT4gdHlwZSwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgLy8gVE9ETyh4aWFvZmVuZyk6IENvbnNpZGVyIHVzaW5nIGNvbS5nb29nbGUuY29tbW9uLmJhc2UuU3BsaXR0ZXIgaGVyZSBpbnN0ZWFkLgotICAgIHJldHVybiBmcm9tU3RyaW5nTGlzdCgKLSAgICAgICAgdHlwZSwgQXJyYXlzLmFzTGlzdCh2YWx1ZS5zcGxpdChGSUVMRF9QQVRIX1NFUEFSQVRPUl9SRUdFWCkpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgRmllbGRNYXNrIGZvciBhIGxpc3Qgb2YgZmllbGQgcGF0aHMgaW4gYSBjZXJ0YWluIHR5cGUuCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgZmllbGQgcGF0aCBpcyBub3QgdmFsaWQuCi0gICAqLwotICAvLyBUT0RPKHhpYW9mZW5nKTogQ29uc2lkZXIgcmVuYW1pbmcgZnJvbVN0cmluZ3MoKQotICBwdWJsaWMgc3RhdGljIEZpZWxkTWFzayBmcm9tU3RyaW5nTGlzdCgKLSAgICAgIENsYXNzPD8gZXh0ZW5kcyBNZXNzYWdlPiB0eXBlLCBJdGVyYWJsZTxTdHJpbmc+IHBhdGhzKSB7Ci0gICAgRmllbGRNYXNrLkJ1aWxkZXIgYnVpbGRlciA9IEZpZWxkTWFzay5uZXdCdWlsZGVyKCk7Ci0gICAgZm9yIChTdHJpbmcgcGF0aCA6IHBhdGhzKSB7Ci0gICAgICBpZiAocGF0aC5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gSWdub3JlIGVtcHR5IGZpZWxkIHBhdGhzLgotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIGlmICh0eXBlICE9IG51bGwgJiYgIWlzVmFsaWQodHlwZSwgcGF0aCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgIHBhdGggKyAiIGlzIG5vdCBhIHZhbGlkIHBhdGggZm9yICIgKyB0eXBlKTsKLSAgICAgIH0KLSAgICAgIGJ1aWxkZXIuYWRkUGF0aHMocGF0aCk7Ci0gICAgfQotICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIEZpZWxkTWFzayBmcm9tIHRoZSBwYXNzZWQgZmllbGQgbnVtYmVycy4KLSAgICoKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgYW55IG9mIHRoZSBmaWVsZHMgYXJlIGludmFsaWQgZm9yIHRoZSBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWVsZE1hc2sgZnJvbUZpZWxkTnVtYmVycyhDbGFzczw/IGV4dGVuZHMgTWVzc2FnZT4gdHlwZSwgaW50Li4uIGZpZWxkTnVtYmVycykgewotICAgIHJldHVybiBmcm9tRmllbGROdW1iZXJzKHR5cGUsIEludHMuYXNMaXN0KGZpZWxkTnVtYmVycykpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBGaWVsZE1hc2sgZnJvbSB0aGUgcGFzc2VkIGZpZWxkIG51bWJlcnMuCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgZmllbGRzIGFyZSBpbnZhbGlkIGZvciB0aGUgbWVzc2FnZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRmllbGRNYXNrIGZyb21GaWVsZE51bWJlcnMoCi0gICAgICBDbGFzczw/IGV4dGVuZHMgTWVzc2FnZT4gdHlwZSwgSXRlcmFibGU8SW50ZWdlcj4gZmllbGROdW1iZXJzKSB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gSW50ZXJuYWwuZ2V0RGVmYXVsdEluc3RhbmNlKHR5cGUpLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0KLSAgICBGaWVsZE1hc2suQnVpbGRlciBidWlsZGVyID0gRmllbGRNYXNrLm5ld0J1aWxkZXIoKTsKLSAgICBmb3IgKEludGVnZXIgZmllbGROdW1iZXIgOiBmaWVsZE51bWJlcnMpIHsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOdW1iZXIoZmllbGROdW1iZXIpOwotICAgICAgY2hlY2tBcmd1bWVudCgKLSAgICAgICAgICBmaWVsZCAhPSBudWxsLAotICAgICAgICAgIFN0cmluZy5mb3JtYXQoIiVzIGlzIG5vdCBhIHZhbGlkIGZpZWxkIG51bWJlciBmb3IgJXMuIiwgZmllbGROdW1iZXIsIHR5cGUpKTsKLSAgICAgIGJ1aWxkZXIuYWRkUGF0aHMoZmllbGQuZ2V0TmFtZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciBwYXRocyBpbiBhIGdpdmVuIGZpZWxkcyBtYXNrIGFyZSB2YWxpZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc1ZhbGlkKENsYXNzPD8gZXh0ZW5kcyBNZXNzYWdlPiB0eXBlLCBGaWVsZE1hc2sgZmllbGRNYXNrKSB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0KLSAgICAgICAgSW50ZXJuYWwuZ2V0RGVmYXVsdEluc3RhbmNlKHR5cGUpLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0gICAgCi0gICAgcmV0dXJuIGlzVmFsaWQoZGVzY3JpcHRvciwgZmllbGRNYXNrKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENoZWNrcyB3aGV0aGVyIHBhdGhzIGluIGEgZ2l2ZW4gZmllbGRzIG1hc2sgYXJlIHZhbGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBGaWVsZE1hc2sgZmllbGRNYXNrKSB7Ci0gICAgZm9yIChTdHJpbmcgcGF0aCA6IGZpZWxkTWFzay5nZXRQYXRoc0xpc3QoKSkgewotICAgICAgaWYgKCFpc1ZhbGlkKGRlc2NyaXB0b3IsIHBhdGgpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgYSBnaXZlbiBmaWVsZCBwYXRoIGlzIHZhbGlkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWQoQ2xhc3M8PyBleHRlbmRzIE1lc3NhZ2U+IHR5cGUsIFN0cmluZyBwYXRoKSB7Ci0gICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0KLSAgICAgICAgSW50ZXJuYWwuZ2V0RGVmYXVsdEluc3RhbmNlKHR5cGUpLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0gICAgCi0gICAgcmV0dXJuIGlzVmFsaWQoZGVzY3JpcHRvciwgcGF0aCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2hlY2tzIHdoZXRoZXIgcGF0aHMgaW4gYSBnaXZlbiBmaWVsZHMgbWFzayBhcmUgdmFsaWQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gaXNWYWxpZChEZXNjcmlwdG9yIGRlc2NyaXB0b3IsIFN0cmluZyBwYXRoKSB7Ci0gICAgU3RyaW5nW10gcGFydHMgPSBwYXRoLnNwbGl0KEZJRUxEX1NFUEFSQVRPUl9SRUdFWCk7Ci0gICAgaWYgKHBhcnRzLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoU3RyaW5nIG5hbWUgOiBwYXJ0cykgewotICAgICAgaWYgKGRlc2NyaXB0b3IgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICghZmllbGQuaXNSZXBlYXRlZCgpCi0gICAgICAgICAgJiYgZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICBkZXNjcmlwdG9yID0gZmllbGQuZ2V0TWVzc2FnZVR5cGUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGRlc2NyaXB0b3IgPSBudWxsOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICAKLSAgLyoqCi0gICAqIENvbnZlcnRzIGEgRmllbGRNYXNrIHRvIGl0cyBjYW5vbmljYWwgZm9ybS4gSW4gdGhlIGNhbm9uaWNhbCBmb3JtIG9mIGEKLSAgICogRmllbGRNYXNrLCBhbGwgZmllbGQgcGF0aHMgYXJlIHNvcnRlZCBhbHBoYWJldGljYWxseSBhbmQgcmVkdW5kYW50IGZpZWxkCi0gICAqIHBhdGhzIGFyZSBtb3ZlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRmllbGRNYXNrIG5vcm1hbGl6ZShGaWVsZE1hc2sgbWFzaykgewotICAgIHJldHVybiBuZXcgRmllbGRNYXNrVHJlZShtYXNrKS50b0ZpZWxkTWFzaygpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSB1bmlvbiBvZiB0d28gb3IgbW9yZSBGaWVsZE1hc2tzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWVsZE1hc2sgdW5pb24oCi0gICAgICBGaWVsZE1hc2sgZmlyc3RNYXNrLCBGaWVsZE1hc2sgc2Vjb25kTWFzaywgRmllbGRNYXNrLi4uIG90aGVyTWFza3MpIHsKLSAgICBGaWVsZE1hc2tUcmVlIG1hc2tUcmVlID0gbmV3IEZpZWxkTWFza1RyZWUoZmlyc3RNYXNrKS5tZXJnZUZyb21GaWVsZE1hc2soc2Vjb25kTWFzayk7Ci0gICAgZm9yIChGaWVsZE1hc2sgbWFzayA6IG90aGVyTWFza3MpIHsKLSAgICAgIG1hc2tUcmVlLm1lcmdlRnJvbUZpZWxkTWFzayhtYXNrKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1hc2tUcmVlLnRvRmllbGRNYXNrKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlcyB0aGUgaW50ZXJzZWN0aW9uIG9mIHR3byBGaWVsZE1hc2tzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBGaWVsZE1hc2sgaW50ZXJzZWN0aW9uKEZpZWxkTWFzayBtYXNrMSwgRmllbGRNYXNrIG1hc2syKSB7Ci0gICAgRmllbGRNYXNrVHJlZSB0cmVlID0gbmV3IEZpZWxkTWFza1RyZWUobWFzazEpOwotICAgIEZpZWxkTWFza1RyZWUgcmVzdWx0ID0gbmV3IEZpZWxkTWFza1RyZWUoKTsKLSAgICBmb3IgKFN0cmluZyBwYXRoIDogbWFzazIuZ2V0UGF0aHNMaXN0KCkpIHsKLSAgICAgIHRyZWUuaW50ZXJzZWN0RmllbGRQYXRoKHBhdGgsIHJlc3VsdCk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQudG9GaWVsZE1hc2soKTsKLSAgfQotCi0gIC8qKgotICAgKiBPcHRpb25zIHRvIGN1c3RvbWl6ZSBtZXJnaW5nIGJlaGF2aW9yLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBNZXJnZU9wdGlvbnMgewotICAgIHByaXZhdGUgYm9vbGVhbiByZXBsYWNlTWVzc2FnZUZpZWxkcyA9IGZhbHNlOwotICAgIHByaXZhdGUgYm9vbGVhbiByZXBsYWNlUmVwZWF0ZWRGaWVsZHMgPSBmYWxzZTsKLSAgICAvLyBUT0RPKGIvMjgyNzcxMzcpOiBjaGFuZ2UgdGhlIGRlZmF1bHQgYmVoYXZpb3IgdG8gYWx3YXlzIHJlcGxhY2UgcHJpbWl0aXZlIGZpZWxkcyBhZnRlcgotICAgIC8vIGZpeGluZyBhbGwgZmFpbGluZyBUQVAgdGVzdHMuCi0gICAgcHJpdmF0ZSBib29sZWFuIHJlcGxhY2VQcmltaXRpdmVGaWVsZHMgPSBmYWxzZTsKLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gcmVwbGFjZSBtZXNzYWdlIGZpZWxkcyAoaS5lLiwgZGlzY2FyZCBleGlzdGluZyBjb250ZW50IGluCi0gICAgICogZGVzdGluYXRpb24gbWVzc2FnZSBmaWVsZHMpIHdoZW4gbWVyZ2luZy4KLSAgICAgKiBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIG1lcmdlIHRoZSBzb3VyY2UgbWVzc2FnZSBmaWVsZCBpbnRvIHRoZQotICAgICAqIGRlc3RpbmF0aW9uIG1lc3NhZ2UgZmllbGQuCi0gICAgICovIAotICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2VNZXNzYWdlRmllbGRzKCkgewotICAgICAgcmV0dXJuIHJlcGxhY2VNZXNzYWdlRmllbGRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFdoZXRoZXIgdG8gcmVwbGFjZSByZXBlYXRlZCBmaWVsZHMgKGkuZS4sIGRpc2NhcmQgZXhpc3RpbmcgY29udGVudCBpbgotICAgICAqIGRlc3RpbmF0aW9uIHJlcGVhdGVkIGZpZWxkcykgd2hlbiBtZXJnaW5nLgotICAgICAqIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gYXBwZW5kIGVsZW1lbnRzIGZyb20gc291cmNlIHJlcGVhdGVkIGZpZWxkIHRvIHRoZQotICAgICAqIGRlc3RpbmF0aW9uIHJlcGVhdGVkIGZpZWxkLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2VSZXBlYXRlZEZpZWxkcygpIHsKLSAgICAgIHJldHVybiByZXBsYWNlUmVwZWF0ZWRGaWVsZHM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0byByZXBsYWNlIHByaW1pdGl2ZSAobm9uLXJlcGVhdGVkIGFuZCBub24tbWVzc2FnZSkgZmllbGRzIGluCi0gICAgICogZGVzdGluYXRpb24gbWVzc2FnZSBmaWVsZHMgd2l0aCB0aGUgc291cmNlIHByaW1pdGl2ZSBmaWVsZHMgKGkuZS4sIGlmIHRoZQotICAgICAqIGZpZWxkIGlzIHNldCBpbiB0aGUgc291cmNlLCB0aGUgdmFsdWUgaXMgY29waWVkIHRvIHRoZQotICAgICAqIGRlc3RpbmF0aW9uOyBpZiB0aGUgZmllbGQgaXMgdW5zZXQgaW4gdGhlIHNvdXJjZSwgdGhlIGZpZWxkIGlzIGNsZWFyZWQKLSAgICAgKiBmcm9tIHRoZSBkZXN0aW5hdGlvbikgd2hlbiBtZXJnaW5nLgotICAgICAqCi0gICAgICogPHA+RGVmYXVsdCBiZWhhdmlvciBpcyB0byBhbHdheXMgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgc291cmNlIHByaW1pdGl2ZQotICAgICAqIGZpZWxkIHRvIHRoZSBkZXN0aW5hdGlvbiBwcmltaXRpdmUgZmllbGQsIGFuZCBpZiB0aGUgc291cmNlIGZpZWxkIGlzCi0gICAgICogdW5zZXQsIHRoZSBkZWZhdWx0IHZhbHVlIG9mIHRoZSBzb3VyY2UgZmllbGQgaXMgY29waWVkIHRvIHRoZQotICAgICAqIGRlc3RpbmF0aW9uLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHJlcGxhY2VQcmltaXRpdmVGaWVsZHMoKSB7Ci0gICAgICByZXR1cm4gcmVwbGFjZVByaW1pdGl2ZUZpZWxkczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlTWVzc2FnZUZpZWxkcyhib29sZWFuIHZhbHVlKSB7Ci0gICAgICByZXBsYWNlTWVzc2FnZUZpZWxkcyA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyB2b2lkIHNldFJlcGxhY2VSZXBlYXRlZEZpZWxkcyhib29sZWFuIHZhbHVlKSB7Ci0gICAgICByZXBsYWNlUmVwZWF0ZWRGaWVsZHMgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXRSZXBsYWNlUHJpbWl0aXZlRmllbGRzKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgIHJlcGxhY2VQcmltaXRpdmVGaWVsZHMgPSB2YWx1ZTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTWVyZ2VzIGZpZWxkcyBzcGVjaWZpZWQgYnkgYSBGaWVsZE1hc2sgZnJvbSBvbmUgbWVzc2FnZSB0byBhbm90aGVyIHdpdGggdGhlCi0gICAqIHNwZWNpZmllZCBtZXJnZSBvcHRpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlKEZpZWxkTWFzayBtYXNrLCBNZXNzYWdlIHNvdXJjZSwKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBkZXN0aW5hdGlvbiwgTWVyZ2VPcHRpb25zIG9wdGlvbnMpIHsKLSAgICBuZXcgRmllbGRNYXNrVHJlZShtYXNrKS5tZXJnZShzb3VyY2UsIGRlc3RpbmF0aW9uLCBvcHRpb25zKTsKLSAgfQotCi0gIC8qKgotICAgKiBNZXJnZXMgZmllbGRzIHNwZWNpZmllZCBieSBhIEZpZWxkTWFzayBmcm9tIG9uZSBtZXNzYWdlIHRvIGFub3RoZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoRmllbGRNYXNrIG1hc2ssIE1lc3NhZ2Ugc291cmNlLAotICAgICAgTWVzc2FnZS5CdWlsZGVyIGRlc3RpbmF0aW9uKSB7Ci0gICAgbWVyZ2UobWFzaywgc291cmNlLCBkZXN0aW5hdGlvbiwgbmV3IE1lcmdlT3B0aW9ucygpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0pzb25Gb3JtYXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9Kc29uRm9ybWF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc2ZjM0MzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0pzb25Gb3JtYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2NzggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5jb21tb24uaW8uQmFzZUVuY29kaW5nOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uOwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Hc29uQnVpbGRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbkFycmF5OwotaW1wb3J0IGNvbS5nb29nbGUuZ3Nvbi5Kc29uRWxlbWVudDsKLWltcG9ydCBjb20uZ29vZ2xlLmdzb24uSnNvbk51bGw7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25PYmplY3Q7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QYXJzZXI7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLkpzb25QcmltaXRpdmU7Ci1pbXBvcnQgY29tLmdvb2dsZS5nc29uLnN0cmVhbS5Kc29uUmVhZGVyOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuQW55OwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZzsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVzVmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Eb3VibGVWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRHluYW1pY01lc3NhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5GbG9hdFZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9yQnVpbGRlcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuU3RydWN0OwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlZhbHVlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlJlYWRlcjsKLWltcG9ydCBqYXZhLmlvLlN0cmluZ1JlYWRlcjsKLWltcG9ydCBqYXZhLm1hdGguQmlnRGVjaW1hbDsKLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5IYXNoU2V0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLWltcG9ydCBqYXZhLnV0aWwubG9nZ2luZy5Mb2dnZXI7Ci0KLS8qKgotICogVXRpbGl0eSBjbGFzc2VzIHRvIGNvbnZlcnQgcHJvdG9idWYgbWVzc2FnZXMgdG8vZnJvbSBKU09OIGZvcm1hdC4gVGhlIEpTT04KLSAqIGZvcm1hdCBmb2xsb3dzIFByb3RvMyBKU09OIHNwZWNpZmljYXRpb24gYW5kIG9ubHkgcHJvdG8zIGZlYXR1cmVzIGFyZQotICogc3VwcG9ydGVkLiBQcm90bzIgb25seSBmZWF0dXJlcyAoZS5nLiwgZXh0ZW5zaW9ucyBhbmQgdW5rbm93biBmaWVsZHMpIHdpbGwKLSAqIGJlIGRpc2NhcmRlZCBpbiB0aGUgY29udmVyc2lvbi4gVGhhdCBpcywgd2hlbiBjb252ZXJ0aW5nIHByb3RvMiBtZXNzYWdlcwotICogdG8gSlNPTiBmb3JtYXQsIGV4dGVuc2lvbnMgYW5kIHVua25vd24gZmllbGRzIHdpbGwgYmUgdHJlYXRlZCBhcyBpZiB0aGV5Ci0gKiBkbyBub3QgZXhpc3QuIFRoaXMgYXBwbGllcyB0byBwcm90bzIgbWVzc2FnZXMgZW1iZWRkZWQgaW4gcHJvdG8zIG1lc3NhZ2VzCi0gKiBhcyB3ZWxsLgotICovCi1wdWJsaWMgY2xhc3MgSnNvbkZvcm1hdCB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvZ2dlciBsb2dnZXIgPQotICAgICAgTG9nZ2VyLmdldExvZ2dlcihKc29uRm9ybWF0LmNsYXNzLmdldE5hbWUoKSk7Ci0KLSAgcHJpdmF0ZSBKc29uRm9ybWF0KCkge30KLSAgCi0gIC8qKgotICAgKiBDcmVhdGVzIGEge0BsaW5rIFByaW50ZXJ9IHdpdGggZGVmYXVsdCBjb25maWd1cmF0aW9ucy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgUHJpbnRlciBwcmludGVyKCkgewotICAgIHJldHVybiBuZXcgUHJpbnRlcihUeXBlUmVnaXN0cnkuZ2V0RW1wdHlUeXBlUmVnaXN0cnkoKSwgZmFsc2UsIGZhbHNlKTsKLSAgfQotICAKLSAgLyoqCi0gICAqIEEgUHJpbnRlciBjb252ZXJ0cyBwcm90b2J1ZiBtZXNzYWdlIHRvIEpTT04gZm9ybWF0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBQcmludGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIFR5cGVSZWdpc3RyeSByZWdpc3RyeTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBwcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzOwotCi0gICAgcHJpdmF0ZSBQcmludGVyKAotICAgICAgICBUeXBlUmVnaXN0cnkgcmVnaXN0cnksCi0gICAgICAgIGJvb2xlYW4gaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRzLAotICAgICAgICBib29sZWFuIHByZXNlcnZpbmdQcm90b0ZpZWxkTmFtZXMpIHsKLSAgICAgIHRoaXMucmVnaXN0cnkgPSByZWdpc3RyeTsKLSAgICAgIHRoaXMuaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRzID0gaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRzOwotICAgICAgdGhpcy5wcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzID0gcHJlc2VydmluZ1Byb3RvRmllbGROYW1lczsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUHJpbnRlcn0gdXNpbmcgdGhlIGdpdmVuIHJlZ2lzdHJ5LiBUaGUgbmV3IFByaW50ZXIKLSAgICAgKiBjbG9uZXMgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIGN1cnJlbnQge0BsaW5rIFByaW50ZXJ9LgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgcmVnaXN0cnkgaXMgYWxyZWFkeSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIFByaW50ZXIgdXNpbmdUeXBlUmVnaXN0cnkoVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0gICAgICBpZiAodGhpcy5yZWdpc3RyeSAhPSBUeXBlUmVnaXN0cnkuZ2V0RW1wdHlUeXBlUmVnaXN0cnkoKSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJPbmx5IG9uZSByZWdpc3RyeSBpcyBhbGxvd2VkLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIG5ldyBQcmludGVyKHJlZ2lzdHJ5LCBpbmNsdWRpbmdEZWZhdWx0VmFsdWVGaWVsZHMsIHByZXNlcnZpbmdQcm90b0ZpZWxkTmFtZXMpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYSBuZXcge0BsaW5rIFByaW50ZXJ9IHRoYXQgd2lsbCBhbHNvIHByaW50IGZpZWxkcyBzZXQgdG8gdGhlaXIKLSAgICAgKiBkZWZhdWx0cy4gRW1wdHkgcmVwZWF0ZWQgZmllbGRzIGFuZCBtYXAgZmllbGRzIHdpbGwgYmUgcHJpbnRlZCBhcyB3ZWxsLgotICAgICAqIFRoZSBuZXcgUHJpbnRlciBjbG9uZXMgYWxsIG90aGVyIGNvbmZpZ3VyYXRpb25zIGZyb20gdGhlIGN1cnJlbnQKLSAgICAgKiB7QGxpbmsgUHJpbnRlcn0uCi0gICAgICovCi0gICAgcHVibGljIFByaW50ZXIgaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRzKCkgewotICAgICAgcmV0dXJuIG5ldyBQcmludGVyKHJlZ2lzdHJ5LCB0cnVlLCBwcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBQcmludGVyfSB0aGF0IGlzIGNvbmZpZ3VyZWQgdG8gdXNlIHRoZSBvcmlnaW5hbCBwcm90bwotICAgICAqIGZpZWxkIG5hbWVzIGFzIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlIHJhdGhlciB0aGFuIGNvbnZlcnRpbmcgdGhlbSB0bwotICAgICAqIGxvd2VyQ2FtZWxDYXNlLiBUaGUgbmV3IFByaW50ZXIgY2xvbmVzIGFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBmcm9tIHRoZQotICAgICAqIGN1cnJlbnQge0BsaW5rIFByaW50ZXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBQcmludGVyIHByZXNlcnZpbmdQcm90b0ZpZWxkTmFtZXMoKSB7Ci0gICAgICByZXR1cm4gbmV3IFByaW50ZXIocmVnaXN0cnksIGluY2x1ZGluZ0RlZmF1bHRWYWx1ZUZpZWxkcywgdHJ1ZSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGEgcHJvdG9idWYgbWVzc2FnZSB0byBKU09OIGZvcm1hdC4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpZiB0aGUgbWVzc2FnZSBjb250YWlucyBBbnkgdHlwZXMKLSAgICAgKiAgICAgICAgIHRoYXQgY2FuJ3QgYmUgcmVzb2x2ZWQuCi0gICAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB3cml0aW5nIHRvIHRoZSBvdXRwdXQgZmFpbHMuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVG8oTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlLCBBcHBlbmRhYmxlIG91dHB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIFRPRE8oeGlhb2ZlbmcpOiBJbnZlc3RpZ2F0ZSB0aGUgYWxsb2NhdGlvbiBvdmVyaGVhZCBhbmQgb3B0aW1pemUgZm9yCi0gICAgICAvLyBtb2JpbGUuCi0gICAgICBuZXcgUHJpbnRlckltcGwocmVnaXN0cnksIGluY2x1ZGluZ0RlZmF1bHRWYWx1ZUZpZWxkcywgcHJlc2VydmluZ1Byb3RvRmllbGROYW1lcywgb3V0cHV0KQotICAgICAgICAgIC5wcmludChtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0cyBhIHByb3RvYnVmIG1lc3NhZ2UgdG8gSlNPTiBmb3JtYXQuIFRocm93cyBleGNlcHRpb25zIGlmIHRoZXJlCi0gICAgICogYXJlIHVua25vd24gQW55IHR5cGVzIGluIHRoZSBtZXNzYWdlLiAKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIHByaW50KE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBTdHJpbmdCdWlsZGVyIGJ1aWxkZXIgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgICBhcHBlbmRUbyhtZXNzYWdlLCBidWlsZGVyKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFVuZXhwZWN0ZWQgSU9FeGNlcHRpb24uCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSB7QGxpbmsgUGFyc2VyfSB3aXRoIGRlZmF1bHQgY29uZmlndXJhdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgUGFyc2VyIHBhcnNlcigpIHsKLSAgICByZXR1cm4gbmV3IFBhcnNlcihUeXBlUmVnaXN0cnkuZ2V0RW1wdHlUeXBlUmVnaXN0cnkoKSk7Ci0gIH0KLSAgCi0gIC8qKgotICAgKiBBIFBhcnNlciBwYXJzZXMgSlNPTiB0byBwcm90b2J1ZiBtZXNzYWdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBjbGFzcyBQYXJzZXIgewotICAgIHByaXZhdGUgZmluYWwgVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotICAgIAotICAgIHByaXZhdGUgUGFyc2VyKFR5cGVSZWdpc3RyeSByZWdpc3RyeSkgewotICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OyAKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgUGFyc2VyfSB1c2luZyB0aGUgZ2l2ZW4gcmVnaXN0cnkuIFRoZSBuZXcgUGFyc2VyCi0gICAgICogY2xvbmVzIGFsbCBvdGhlciBjb25maWd1cmF0aW9ucyBmcm9tIHRoaXMgUGFyc2VyLgotICAgICAqIAotICAgICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIGEgcmVnaXN0cnkgaXMgYWxyZWFkeSBzZXQuCi0gICAgICovCi0gICAgcHVibGljIFBhcnNlciB1c2luZ1R5cGVSZWdpc3RyeShUeXBlUmVnaXN0cnkgcmVnaXN0cnkpIHsKLSAgICAgIGlmICh0aGlzLnJlZ2lzdHJ5ICE9IFR5cGVSZWdpc3RyeS5nZXRFbXB0eVR5cGVSZWdpc3RyeSgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIk9ubHkgb25lIHJlZ2lzdHJ5IGlzIGFsbG93ZWQuIik7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbmV3IFBhcnNlcihyZWdpc3RyeSk7Ci0gICAgfQotICAgIAotICAgIC8qKgotICAgICAqIFBhcnNlcyBmcm9tIEpTT04gaW50byBhIHByb3RvYnVmIG1lc3NhZ2UuCi0gICAgICogCi0gICAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gaWYgdGhlIGlucHV0IGlzIG5vdCB2YWxpZCBKU09OCi0gICAgICogICAgICAgICBmb3JtYXQgb3IgdGhlcmUgYXJlIHVua25vd24gZmllbGRzIGluIHRoZSBpbnB1dC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBtZXJnZShTdHJpbmcganNvbiwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgLy8gVE9ETyh4aWFvZmVuZyk6IEludmVzdGlnYXRlIHRoZSBhbGxvY2F0aW9uIG92ZXJoZWFkIGFuZCBvcHRpbWl6ZSBmb3IKLSAgICAgIC8vIG1vYmlsZS4KLSAgICAgIG5ldyBQYXJzZXJJbXBsKHJlZ2lzdHJ5KS5tZXJnZShqc29uLCBidWlsZGVyKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogUGFyc2VzIGZyb20gSlNPTiBpbnRvIGEgcHJvdG9idWYgbWVzc2FnZS4KLSAgICAgKiAKLSAgICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpZiB0aGUgaW5wdXQgaXMgbm90IHZhbGlkIEpTT04KLSAgICAgKiAgICAgICAgIGZvcm1hdCBvciB0aGVyZSBhcmUgdW5rbm93biBmaWVsZHMgaW4gdGhlIGlucHV0LgotICAgICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgcmVhZGluZyBmcm9tIHRoZSBpbnB1dCB0aHJvd3MuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgbWVyZ2UoUmVhZGVyIGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgLy8gVE9ETyh4aWFvZmVuZyk6IEludmVzdGlnYXRlIHRoZSBhbGxvY2F0aW9uIG92ZXJoZWFkIGFuZCBvcHRpbWl6ZSBmb3IKLSAgICAgIC8vIG1vYmlsZS4KLSAgICAgIG5ldyBQYXJzZXJJbXBsKHJlZ2lzdHJ5KS5tZXJnZShqc29uLCBidWlsZGVyKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQSBUeXBlUmVnaXN0cnkgaXMgdXNlZCB0byByZXNvbHZlIEFueSBtZXNzYWdlcyBpbiB0aGUgSlNPTiBjb252ZXJzaW9uLgotICAgKiBZb3UgbXVzdCBwcm92aWRlIGEgVHlwZVJlZ2lzdHJ5IGNvbnRhaW5pbmcgYWxsIG1lc3NhZ2UgdHlwZXMgdXNlZCBpbgotICAgKiBBbnkgbWVzc2FnZSBmaWVsZHMsIG9yIHRoZSBKU09OIGNvbnZlcnNpb24gd2lsbCBmYWlsIGJlY2F1c2UgZGF0YQotICAgKiBpbiBBbnkgbWVzc2FnZSBmaWVsZHMgaXMgdW5yZWNvZ25pemFibGUuIFlvdSBkb24ndCBuZWVkIHRvIHN1cHBseSBhCi0gICAqIFR5cGVSZWdpc3RyeSBpZiB5b3UgZG9uJ3QgdXNlIEFueSBtZXNzYWdlIGZpZWxkcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgVHlwZVJlZ2lzdHJ5IHsKLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBFbXB0eVR5cGVSZWdpc3RyeUhvbGRlciB7Ci0gICAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUeXBlUmVnaXN0cnkgRU1QVFkgPSBuZXcgVHlwZVJlZ2lzdHJ5KAotICAgICAgICAgIENvbGxlY3Rpb25zLjxTdHJpbmcsIERlc2NyaXB0b3I+ZW1wdHlNYXAoKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBUeXBlUmVnaXN0cnkgZ2V0RW1wdHlUeXBlUmVnaXN0cnkoKSB7Ci0gICAgICByZXR1cm4gRW1wdHlUeXBlUmVnaXN0cnlIb2xkZXIuRU1QVFk7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7Ci0gICAgICByZXR1cm4gbmV3IEJ1aWxkZXIoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGEgdHlwZSBieSBpdHMgZnVsbCBuYW1lLiBSZXR1cm5zIG51bGwgaWYgaXQgY2Fubm90IGJlIGZvdW5kIGluCi0gICAgICogdGhpcyB7QGxpbmsgVHlwZVJlZ2lzdHJ5fS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBmaW5kKFN0cmluZyBuYW1lKSB7Ci0gICAgICByZXR1cm4gdHlwZXMuZ2V0KG5hbWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgRGVzY3JpcHRvcj4gdHlwZXM7Ci0KLSAgICBwcml2YXRlIFR5cGVSZWdpc3RyeShNYXA8U3RyaW5nLCBEZXNjcmlwdG9yPiB0eXBlcykgewotICAgICAgdGhpcy50eXBlcyA9IHR5cGVzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEEgQnVpbGRlciBpcyB1c2VkIHRvIGJ1aWxkIHtAbGluayBUeXBlUmVnaXN0cnl9LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgY2xhc3MgQnVpbGRlciB7Ci0gICAgICBwcml2YXRlIEJ1aWxkZXIoKSB7fQotCi0gICAgICAvKioKLSAgICAgICAqIEFkZHMgYSBtZXNzYWdlIHR5cGUgYW5kIGFsbCB0eXBlcyBkZWZpbmVkIGluIHRoZSBzYW1lIC5wcm90byBmaWxlIGFzCi0gICAgICAgKiB3ZWxsIGFzIGFsbCB0cmFuc2l0aXZlbHkgaW1wb3J0ZWQgLnByb3RvIGZpbGVzIHRvIHRoaXMge0BsaW5rIEJ1aWxkZXJ9LgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBhZGQoRGVzY3JpcHRvciBtZXNzYWdlVHlwZSkgewotICAgICAgICBpZiAodHlwZXMgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJBIFR5cGVSZWdpc3RyeS5CdWlsZXIgY2FuIG9ubHkgYmUgdXNlZCBvbmNlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGFkZEZpbGUobWVzc2FnZVR5cGUuZ2V0RmlsZSgpKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogQWRkcyBtZXNzYWdlIHR5cGVzIGFuZCBhbGwgdHlwZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSAucHJvdG8gZmlsZSBhcwotICAgICAgICogd2VsbCBhcyBhbGwgdHJhbnNpdGl2ZWx5IGltcG9ydGVkIC5wcm90byBmaWxlcyB0byB0aGlzIHtAbGluayBCdWlsZGVyfS4KLSAgICAgICAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgYWRkKEl0ZXJhYmxlPERlc2NyaXB0b3I+IG1lc3NhZ2VUeXBlcykgewotICAgICAgICBpZiAodHlwZXMgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJBIFR5cGVSZWdpc3RyeS5CdWlsZXIgY2FuIG9ubHkgYmUgdXNlZCBvbmNlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRGVzY3JpcHRvciB0eXBlIDogbWVzc2FnZVR5cGVzKSB7Ci0gICAgICAgICAgYWRkRmlsZSh0eXBlLmdldEZpbGUoKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogQnVpbGRzIGEge0BsaW5rIFR5cGVSZWdpc3RyeX0uIFRoaXMgbWV0aG9kIGNhbiBvbmx5IGJlIGNhbGxlZCBvbmNlIGZvcgotICAgICAgICogb25lIEJ1aWxkZXIuCi0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBUeXBlUmVnaXN0cnkgYnVpbGQoKSB7Ci0gICAgICAgIFR5cGVSZWdpc3RyeSByZXN1bHQgPSBuZXcgVHlwZVJlZ2lzdHJ5KHR5cGVzKTsKLSAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBidWlsdCB7QGxpbmsgVHlwZVJlZ2lzdHJ5fSBpcyBpbW11dGFibGUuCi0gICAgICAgIHR5cGVzID0gbnVsbDsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSB2b2lkIGFkZEZpbGUoRmlsZURlc2NyaXB0b3IgZmlsZSkgewotICAgICAgICAvLyBTa2lwIHRoZSBmaWxlIGlmIGl0J3MgYWxyZWFkeSBhZGRlZC4KLSAgICAgICAgaWYgKCFmaWxlcy5hZGQoZmlsZS5nZXRGdWxsTmFtZSgpKSkgewotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBmb3IgKEZpbGVEZXNjcmlwdG9yIGRlcGVuZGVuY3kgOiBmaWxlLmdldERlcGVuZGVuY2llcygpKSB7Ci0gICAgICAgICAgYWRkRmlsZShkZXBlbmRlbmN5KTsKLSAgICAgICAgfQotICAgICAgICBmb3IgKERlc2NyaXB0b3IgbWVzc2FnZSA6IGZpbGUuZ2V0TWVzc2FnZVR5cGVzKCkpIHsKLSAgICAgICAgICBhZGRNZXNzYWdlKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgdm9pZCBhZGRNZXNzYWdlKERlc2NyaXB0b3IgbWVzc2FnZSkgewotICAgICAgICBmb3IgKERlc2NyaXB0b3IgbmVzdGVkVHlwZSA6IG1lc3NhZ2UuZ2V0TmVzdGVkVHlwZXMoKSkgewotICAgICAgICAgIGFkZE1lc3NhZ2UobmVzdGVkVHlwZSk7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodHlwZXMuY29udGFpbnNLZXkobWVzc2FnZS5nZXRGdWxsTmFtZSgpKSkgewotICAgICAgICAgIGxvZ2dlci53YXJuaW5nKCJUeXBlICIgKyBtZXNzYWdlLmdldEZ1bGxOYW1lKCkKLSAgICAgICAgICAgICAgKyAiIGlzIGFkZGVkIG11bHRpcGxlIHRpbWVzLiIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotCi0gICAgICAgIHR5cGVzLnB1dChtZXNzYWdlLmdldEZ1bGxOYW1lKCksIG1lc3NhZ2UpOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGZpbmFsIFNldDxTdHJpbmc+IGZpbGVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBEZXNjcmlwdG9yPiB0eXBlcyA9Ci0gICAgICAgICAgbmV3IEhhc2hNYXA8U3RyaW5nLCBEZXNjcmlwdG9yPigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBIFRleHRHZW5lcmF0b3IgYWRkcyBpbmRlbnRhdGlvbiB3aGVuIHdyaXRpbmcgZm9ybWF0dGVkIHRleHQuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUZXh0R2VuZXJhdG9yIHsKLSAgICBwcml2YXRlIGZpbmFsIEFwcGVuZGFibGUgb3V0cHV0OwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nQnVpbGRlciBpbmRlbnQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgIHByaXZhdGUgYm9vbGVhbiBhdFN0YXJ0T2ZMaW5lID0gdHJ1ZTsKLQotICAgIHByaXZhdGUgVGV4dEdlbmVyYXRvcihmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkgewotICAgICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW5kZW50IHRleHQgYnkgdHdvIHNwYWNlcy4gIEFmdGVyIGNhbGxpbmcgSW5kZW50KCksIHR3byBzcGFjZXMgd2lsbCBiZQotICAgICAqIGluc2VydGVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIG9mIHRleHQuICBJbmRlbnQoKSBtYXkgYmUgY2FsbGVkCi0gICAgICogbXVsdGlwbGUgdGltZXMgdG8gcHJvZHVjZSBkZWVwZXIgaW5kZW50cy4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBpbmRlbnQoKSB7Ci0gICAgICBpbmRlbnQuYXBwZW5kKCIgICIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlZHVjZXMgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIGJ5IHR3byBzcGFjZXMsIG9yIGNyYXNoZXMgaWYgdGhlIGluZGVudAotICAgICAqIGxldmVsIGlzIHplcm8uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgb3V0ZGVudCgpIHsKLSAgICAgIGZpbmFsIGludCBsZW5ndGggPSBpbmRlbnQubGVuZ3RoKCk7Ci0gICAgICBpZiAobGVuZ3RoIDwgMikgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIiBPdXRkZW50KCkgd2l0aG91dCBtYXRjaGluZyBJbmRlbnQoKS4iKTsKLSAgICAgIH0KLSAgICAgIGluZGVudC5kZWxldGUobGVuZ3RoIC0gMiwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50KGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IHNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgaW50IHBvcyA9IDA7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgd3JpdGUodGV4dC5zdWJTZXF1ZW5jZShwb3MsIGkgKyAxKSk7Ci0gICAgICAgICAgcG9zID0gaSArIDE7Ci0gICAgICAgICAgYXRTdGFydE9mTGluZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdyaXRlKHRleHQuc3ViU2VxdWVuY2UocG9zLCBzaXplKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKGZpbmFsIENoYXJTZXF1ZW5jZSBkYXRhKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgaWYgKGRhdGEubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoYXRTdGFydE9mTGluZSkgewotICAgICAgICBhdFN0YXJ0T2ZMaW5lID0gZmFsc2U7Ci0gICAgICAgIG91dHB1dC5hcHBlbmQoaW5kZW50KTsKLSAgICAgIH0KLSAgICAgIG91dHB1dC5hcHBlbmQoZGF0YSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEEgUHJpbnRlciBjb252ZXJ0cyBwcm90b2J1ZiBtZXNzYWdlcyB0byBKU09OIGZvcm1hdC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFByaW50ZXJJbXBsIHsKLSAgICBwcml2YXRlIGZpbmFsIFR5cGVSZWdpc3RyeSByZWdpc3RyeTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRzOwotICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBwcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzOwotICAgIHByaXZhdGUgZmluYWwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0gICAgLy8gV2UgdXNlIEdzb24gdG8gaGVscCBoYW5kbGUgc3RyaW5nIGVzY2FwZXMuCi0gICAgcHJpdmF0ZSBmaW5hbCBHc29uIGdzb247Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBHc29uSG9sZGVyIHsKLSAgICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEdzb24gREVGQVVMVF9HU09OID0gbmV3IEdzb25CdWlsZGVyKCkuZGlzYWJsZUh0bWxFc2NhcGluZygpLmNyZWF0ZSgpOwotICAgIH0KLQotICAgIFByaW50ZXJJbXBsKAotICAgICAgICBUeXBlUmVnaXN0cnkgcmVnaXN0cnksCi0gICAgICAgIGJvb2xlYW4gaW5jbHVkaW5nRGVmYXVsdFZhbHVlRmllbGRzLAotICAgICAgICBib29sZWFuIHByZXNlcnZpbmdQcm90b0ZpZWxkTmFtZXMsCi0gICAgICAgIEFwcGVuZGFibGUganNvbk91dHB1dCkgewotICAgICAgdGhpcy5yZWdpc3RyeSA9IHJlZ2lzdHJ5OwotICAgICAgdGhpcy5pbmNsdWRpbmdEZWZhdWx0VmFsdWVGaWVsZHMgPSBpbmNsdWRpbmdEZWZhdWx0VmFsdWVGaWVsZHM7Ci0gICAgICB0aGlzLnByZXNlcnZpbmdQcm90b0ZpZWxkTmFtZXMgPSBwcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzOwotICAgICAgdGhpcy5nZW5lcmF0b3IgPSBuZXcgVGV4dEdlbmVyYXRvcihqc29uT3V0cHV0KTsKLSAgICAgIHRoaXMuZ3NvbiA9IEdzb25Ib2xkZXIuREVGQVVMVF9HU09OOwotICAgIH0KLQotICAgIHZvaWQgcHJpbnQoTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgV2VsbEtub3duVHlwZVByaW50ZXIgc3BlY2lhbFByaW50ZXIgPSB3ZWxsS25vd25UeXBlUHJpbnRlcnMuZ2V0KAotICAgICAgICAgIG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGdWxsTmFtZSgpKTsKLSAgICAgIGlmIChzcGVjaWFsUHJpbnRlciAhPSBudWxsKSB7Ci0gICAgICAgIHNwZWNpYWxQcmludGVyLnByaW50KHRoaXMsIG1lc3NhZ2UpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBwcmludChtZXNzYWdlLCBudWxsKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgV2VsbEtub3duVHlwZVByaW50ZXIgewotICAgICAgdm9pZCBwcmludChQcmludGVySW1wbCBwcmludGVyLCBNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpCi0gICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBNYXA8U3RyaW5nLCBXZWxsS25vd25UeXBlUHJpbnRlcj4KLSAgICB3ZWxsS25vd25UeXBlUHJpbnRlcnMgPSBidWlsZFdlbGxLbm93blR5cGVQcmludGVycygpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFdlbGxLbm93blR5cGVQcmludGVyPgotICAgIGJ1aWxkV2VsbEtub3duVHlwZVByaW50ZXJzKCkgewotICAgICAgTWFwPFN0cmluZywgV2VsbEtub3duVHlwZVByaW50ZXI+IHByaW50ZXJzID0KLSAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIFdlbGxLbm93blR5cGVQcmludGVyPigpOwotICAgICAgLy8gU3BlY2lhbC1jYXNlIEFueS4KLSAgICAgIHByaW50ZXJzLnB1dChBbnkuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgbmV3IFdlbGxLbm93blR5cGVQcmludGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRlckltcGwgcHJpbnRlciwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICBwcmludGVyLnByaW50QW55KG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIC8vIFNwZWNpYWwtY2FzZSB3cmFwcGVyIHR5cGVzLgotICAgICAgV2VsbEtub3duVHlwZVByaW50ZXIgd3JhcHBlcnNQcmludGVyID0gbmV3IFdlbGxLbm93blR5cGVQcmludGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRlckltcGwgcHJpbnRlciwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICBwcmludGVyLnByaW50V3JhcHBlcihtZXNzYWdlKTsKLSAgICAgICAgICAKLSAgICAgICAgfQotICAgICAgfTsKLSAgICAgIHByaW50ZXJzLnB1dChCb29sVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIHdyYXBwZXJzUHJpbnRlcik7Ci0gICAgICBwcmludGVycy5wdXQoSW50MzJWYWx1ZS5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSwgd3JhcHBlcnNQcmludGVyKTsKLSAgICAgIHByaW50ZXJzLnB1dChVSW50MzJWYWx1ZS5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSwgd3JhcHBlcnNQcmludGVyKTsKLSAgICAgIHByaW50ZXJzLnB1dChJbnQ2NFZhbHVlLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLCB3cmFwcGVyc1ByaW50ZXIpOwotICAgICAgcHJpbnRlcnMucHV0KFVJbnQ2NFZhbHVlLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLCB3cmFwcGVyc1ByaW50ZXIpOwotICAgICAgcHJpbnRlcnMucHV0KFN0cmluZ1ZhbHVlLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLCB3cmFwcGVyc1ByaW50ZXIpOwotICAgICAgcHJpbnRlcnMucHV0KEJ5dGVzVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIHdyYXBwZXJzUHJpbnRlcik7Ci0gICAgICBwcmludGVycy5wdXQoRmxvYXRWYWx1ZS5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSwgd3JhcHBlcnNQcmludGVyKTsKLSAgICAgIHByaW50ZXJzLnB1dChEb3VibGVWYWx1ZS5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSwgd3JhcHBlcnNQcmludGVyKTsKLSAgICAgIC8vIFNwZWNpYWwtY2FzZSBUaW1lc3RhbXAuCi0gICAgICBwcmludGVycy5wdXQoVGltZXN0YW1wLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICAgIG5ldyBXZWxsS25vd25UeXBlUHJpbnRlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFByaW50ZXJJbXBsIHByaW50ZXIsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcHJpbnRlci5wcmludFRpbWVzdGFtcChtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICAvLyBTcGVjaWFsLWNhc2UgRHVyYXRpb24uCi0gICAgICBwcmludGVycy5wdXQoRHVyYXRpb24uZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgbmV3IFdlbGxLbm93blR5cGVQcmludGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRlckltcGwgcHJpbnRlciwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICBwcmludGVyLnByaW50RHVyYXRpb24obWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgLy8gU3BlY2lhbC1jYXNlIEZpZWxkTWFzay4KLSAgICAgIHByaW50ZXJzLnB1dChGaWVsZE1hc2suZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgbmV3IFdlbGxLbm93blR5cGVQcmludGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRlckltcGwgcHJpbnRlciwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICBwcmludGVyLnByaW50RmllbGRNYXNrKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIC8vIFNwZWNpYWwtY2FzZSBTdHJ1Y3QuCi0gICAgICBwcmludGVycy5wdXQoU3RydWN0LmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICAgIG5ldyBXZWxsS25vd25UeXBlUHJpbnRlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIHByaW50KFByaW50ZXJJbXBsIHByaW50ZXIsIE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkKLSAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgICAgcHJpbnRlci5wcmludFN0cnVjdChtZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICAvLyBTcGVjaWFsLWNhc2UgVmFsdWUuCi0gICAgICBwcmludGVycy5wdXQoVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgbmV3IFdlbGxLbm93blR5cGVQcmludGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRlckltcGwgcHJpbnRlciwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICBwcmludGVyLnByaW50VmFsdWUobWVzc2FnZSk7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgLy8gU3BlY2lhbC1jYXNlIExpc3RWYWx1ZS4KLSAgICAgIHByaW50ZXJzLnB1dChMaXN0VmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgbmV3IFdlbGxLbm93blR5cGVQcmludGVyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgcHJpbnQoUHJpbnRlckltcGwgcHJpbnRlciwgTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKQotICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgICBwcmludGVyLnByaW50TGlzdFZhbHVlKG1lc3NhZ2UpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIHJldHVybiBwcmludGVyczsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFByaW50cyBnb29nbGUucHJvdG9idWYuQW55ICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50QW55KE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciB0eXBlVXJsRmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgidHlwZV91cmwiKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciB2YWx1ZUZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInZhbHVlIik7Ci0gICAgICAvLyBWYWxpZGF0ZXMgdHlwZSBvZiB0aGUgbWVzc2FnZS4gTm90ZSB0aGF0IHdlIGNhbid0IGp1c3QgY2FzdCB0aGUgbWVzc2FnZQotICAgICAgLy8gdG8gY29tLmdvb2dsZS5wcm90b2J1Zi5BbnkgYmVjYXVzZSBpdCBtaWdodCBiZSBhIER5bmFtaWNNZXNzYWdlLiAKLSAgICAgIGlmICh0eXBlVXJsRmllbGQgPT0gbnVsbCB8fCB2YWx1ZUZpZWxkID09IG51bGwKLSAgICAgICAgICB8fCB0eXBlVXJsRmllbGQuZ2V0VHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5UeXBlLlNUUklORwotICAgICAgICAgIHx8IHZhbHVlRmllbGQuZ2V0VHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5UeXBlLkJZVEVTKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgQW55IHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICBTdHJpbmcgdHlwZVVybCA9IChTdHJpbmcpIG1lc3NhZ2UuZ2V0RmllbGQodHlwZVVybEZpZWxkKTsKLSAgICAgIFN0cmluZyB0eXBlTmFtZSA9IGdldFR5cGVOYW1lKHR5cGVVcmwpOwotICAgICAgRGVzY3JpcHRvciB0eXBlID0gcmVnaXN0cnkuZmluZCh0eXBlTmFtZSk7Ci0gICAgICBpZiAodHlwZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAiQ2Fubm90IGZpbmQgdHlwZSBmb3IgdXJsOiAiICsgdHlwZVVybCk7Ci0gICAgICB9Ci0gICAgICBCeXRlU3RyaW5nIGNvbnRlbnQgPSAoQnl0ZVN0cmluZykgbWVzc2FnZS5nZXRGaWVsZCh2YWx1ZUZpZWxkKTsKLSAgICAgIE1lc3NhZ2UgY29udGVudE1lc3NhZ2UgPSBEeW5hbWljTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UodHlwZSkKLSAgICAgICAgICAuZ2V0UGFyc2VyRm9yVHlwZSgpLnBhcnNlRnJvbShjb250ZW50KTsKLSAgICAgIFdlbGxLbm93blR5cGVQcmludGVyIHByaW50ZXIgPSB3ZWxsS25vd25UeXBlUHJpbnRlcnMuZ2V0KHR5cGVOYW1lKTsKLSAgICAgIGlmIChwcmludGVyICE9IG51bGwpIHsKLSAgICAgICAgLy8gSWYgdGhlIHR5cGUgaXMgb25lIG9mIHRoZSB3ZWxsLWtub3duIHR5cGVzLCB3ZSB1c2UgYSBzcGVjaWFsCi0gICAgICAgIC8vIGZvcm1hdHRpbmcuCi0gICAgICAgIGdlbmVyYXRvci5wcmludCgie1xuIik7Ci0gICAgICAgIGdlbmVyYXRvci5pbmRlbnQoKTsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIkB0eXBlXCI6ICIgKyBnc29uLnRvSnNvbih0eXBlVXJsKSArICIsXG4iKTsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcInZhbHVlXCI6ICIpOwotICAgICAgICBwcmludGVyLnByaW50KHRoaXMsIGNvbnRlbnRNZXNzYWdlKTsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcbiIpOwotICAgICAgICBnZW5lcmF0b3Iub3V0ZGVudCgpOwotICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn0iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFByaW50IHRoZSBjb250ZW50IG1lc3NhZ2UgaW5zdGVhZCAod2l0aCBhICJAdHlwZSIgZmllbGQgYWRkZWQpLgotICAgICAgICBwcmludChjb250ZW50TWVzc2FnZSwgdHlwZVVybCk7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIC8qKiBQcmludHMgd3JhcHBlciB0eXBlcyAoZS5nLiwgZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUpICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50V3JhcHBlcihNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgdmFsdWVGaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOwotICAgICAgaWYgKHZhbHVlRmllbGQgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJJbnZhbGlkIFdyYXBwZXIgdHlwZS4iKTsKLSAgICAgIH0KLSAgICAgIC8vIFdoZW4gZm9ybWF0dGluZyB3cmFwcGVyIHR5cGVzLCB3ZSBqdXN0IHByaW50IGl0cyB2YWx1ZSBmaWVsZCBpbnN0ZWFkIG9mCi0gICAgICAvLyB0aGUgd2hvbGUgbWVzc2FnZS4KLSAgICAgIHByaW50U2luZ2xlRmllbGRWYWx1ZSh2YWx1ZUZpZWxkLCBtZXNzYWdlLmdldEZpZWxkKHZhbHVlRmllbGQpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBCeXRlU3RyaW5nIHRvQnl0ZVN0cmluZyhNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAgIGlmIChtZXNzYWdlIGluc3RhbmNlb2YgTWVzc2FnZSkgewotICAgICAgICByZXR1cm4gKChNZXNzYWdlKSBtZXNzYWdlKS50b0J5dGVTdHJpbmcoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoKE1lc3NhZ2UuQnVpbGRlcikgbWVzc2FnZSkuYnVpbGQoKS50b0J5dGVTdHJpbmcoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqIFByaW50cyBnb29nbGUucHJvdG9idWYuVGltZXN0YW1wICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50VGltZXN0YW1wKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIFRpbWVzdGFtcCB2YWx1ZSA9IFRpbWVzdGFtcC5wYXJzZUZyb20odG9CeXRlU3RyaW5nKG1lc3NhZ2UpKTsKLSAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiICsgVGltZVV0aWwudG9TdHJpbmcodmFsdWUpICsgIlwiIik7Ci0gICAgfQotICAgIAotICAgIC8qKiBQcmludHMgZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50RHVyYXRpb24oTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgRHVyYXRpb24gdmFsdWUgPSBEdXJhdGlvbi5wYXJzZUZyb20odG9CeXRlU3RyaW5nKG1lc3NhZ2UpKTsKLSAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiICsgVGltZVV0aWwudG9TdHJpbmcodmFsdWUpICsgIlwiIik7Ci0gICAgICAKLSAgICB9Ci0gICAgCi0gICAgLyoqIFByaW50cyBnb29nbGUucHJvdG9idWYuRmllbGRNYXNrICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50RmllbGRNYXNrKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIEZpZWxkTWFzayB2YWx1ZSA9IEZpZWxkTWFzay5wYXJzZUZyb20odG9CeXRlU3RyaW5nKG1lc3NhZ2UpKTsKLSAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiICsgRmllbGRNYXNrVXRpbC50b1N0cmluZyh2YWx1ZSkgKyAiXCIiKTsKLSAgICB9Ci0gICAgCi0gICAgLyoqIFByaW50cyBnb29nbGUucHJvdG9idWYuU3RydWN0ICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50U3RydWN0KE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJmaWVsZHMiKTsKLSAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgU3RydWN0IHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICAvLyBTdHJ1Y3QgaXMgZm9ybWF0dGVkIGFzIGEgbWFwIG9iamVjdC4KLSAgICAgIHByaW50TWFwRmllbGRWYWx1ZShmaWVsZCwgbWVzc2FnZS5nZXRGaWVsZChmaWVsZCkpOwotICAgIH0KLSAgICAKLSAgICAvKiogUHJpbnRzIGdvb2dsZS5wcm90b2J1Zi5WYWx1ZSAqLwotICAgIHByaXZhdGUgdm9pZCBwcmludFZhbHVlKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIEZvciBhIFZhbHVlIG1lc3NhZ2UsIG9ubHkgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBpcyBmb3JtYXR0ZWQuCi0gICAgICBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGZpZWxkcyA9IG1lc3NhZ2UuZ2V0QWxsRmllbGRzKCk7Ci0gICAgICBpZiAoZmllbGRzLmlzRW1wdHkoKSkgewotICAgICAgICAvLyBObyB2YWx1ZSBzZXQuCi0gICAgICAgIGdlbmVyYXRvci5wcmludCgibnVsbCIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAvLyBBIFZhbHVlIG1lc3NhZ2UgY2FuIG9ubHkgaGF2ZSBhdCBtb3N0IG9uZSBmaWVsZCBzZXQgKGl0IG9ubHkgY29udGFpbnMKLSAgICAgIC8vIGFuIG9uZW9mKS4KLSAgICAgIGlmIChmaWVsZHMuc2l6ZSgpICE9IDEpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiSW52YWxpZCBWYWx1ZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgZm9yIChNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgcHJpbnRTaW5nbGVGaWVsZFZhbHVlKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqIFByaW50cyBnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlICovCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50TGlzdFZhbHVlKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJ2YWx1ZXMiKTsKLSAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgTGlzdFZhbHVlIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICBwcmludFJlcGVhdGVkRmllbGRWYWx1ZShmaWVsZCwgbWVzc2FnZS5nZXRGaWVsZChmaWVsZCkpOwotICAgIH0KLQotICAgIC8qKiBQcmludHMgYSByZWd1bGFyIG1lc3NhZ2Ugd2l0aCBhbiBvcHRpb25hbCB0eXBlIFVSTC4gKi8KLSAgICBwcml2YXRlIHZvaWQgcHJpbnQoTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlLCBTdHJpbmcgdHlwZVVybCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGdlbmVyYXRvci5wcmludCgie1xuIik7Ci0gICAgICBnZW5lcmF0b3IuaW5kZW50KCk7Ci0KLSAgICAgIGJvb2xlYW4gcHJpbnRlZEZpZWxkID0gZmFsc2U7Ci0gICAgICBpZiAodHlwZVVybCAhPSBudWxsKSB7Ci0gICAgICAgIGdlbmVyYXRvci5wcmludCgiXCJAdHlwZVwiOiAiICsgZ3Nvbi50b0pzb24odHlwZVVybCkpOwotICAgICAgICBwcmludGVkRmllbGQgPSB0cnVlOwotICAgICAgfQotICAgICAgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBmaWVsZHNUb1ByaW50ID0gbnVsbDsKLSAgICAgIGlmIChpbmNsdWRpbmdEZWZhdWx0VmFsdWVGaWVsZHMpIHsKLSAgICAgICAgZmllbGRzVG9QcmludCA9IG5ldyBUcmVlTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PigpOwotICAgICAgICBmb3IgKEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWVsZHMoKSkgewotICAgICAgICAgIGlmIChmaWVsZC5pc09wdGlvbmFsKCkKLSAgICAgICAgICAgICAgJiYgZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRQotICAgICAgICAgICAgICAmJiAhbWVzc2FnZS5oYXNGaWVsZChmaWVsZCkpIHsKLSAgICAgICAgICAgIC8vIEFsd2F5cyBza2lwIGVtcHR5IG9wdGlvbmFsIG1lc3NhZ2UgZmllbGRzLiBJZiBub3Qgd2Ugd2lsbCByZWN1cnNlIGluZGVmaW5pdGVseSBpZgotICAgICAgICAgICAgLy8gYSBtZXNzYWdlIGhhcyBpdHNlbGYgYXMgYSBzdWItZmllbGQuCi0gICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgZmllbGRzVG9QcmludC5wdXQoZmllbGQsIG1lc3NhZ2UuZ2V0RmllbGQoZmllbGQpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGRzVG9QcmludCA9IG1lc3NhZ2UuZ2V0QWxsRmllbGRzKCk7Ci0gICAgICB9Ci0gICAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZmllbGQgOiBmaWVsZHNUb1ByaW50LmVudHJ5U2V0KCkpIHsKLSAgICAgICAgaWYgKHByaW50ZWRGaWVsZCkgewotICAgICAgICAgIC8vIEFkZCBsaW5lLWVuZGluZ3MgZm9yIHRoZSBwcmV2aW91cyBmaWVsZC4KLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIixcbiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByaW50ZWRGaWVsZCA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRGaWVsZChmaWVsZC5nZXRLZXkoKSwgZmllbGQuZ2V0VmFsdWUoKSk7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIC8vIEFkZCBsaW5lLWVuZGluZ3MgZm9yIHRoZSBsYXN0IGZpZWxkLgotICAgICAgaWYgKHByaW50ZWRGaWVsZCkgewotICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlxuIik7Ci0gICAgICB9Ci0gICAgICBnZW5lcmF0b3Iub3V0ZGVudCgpOwotICAgICAgZ2VuZXJhdG9yLnByaW50KCJ9Iik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50RmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBPYmplY3QgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAocHJlc2VydmluZ1Byb3RvRmllbGROYW1lcykgewotICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIiArIGZpZWxkLmdldE5hbWUoKSArICJcIjogIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIiArIGZpZWxkLmdldEpzb25OYW1lKCkgKyAiXCI6ICIpOwotICAgICAgfQotICAgICAgaWYgKGZpZWxkLmlzTWFwRmllbGQoKSkgewotICAgICAgICBwcmludE1hcEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlKTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIHByaW50UmVwZWF0ZWRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludFNpbmdsZUZpZWxkVmFsdWUoZmllbGQsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInJhd3R5cGVzIikKLSAgICBwcml2YXRlIHZvaWQgcHJpbnRSZXBlYXRlZEZpZWxkVmFsdWUoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBPYmplY3QgdmFsdWUpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBnZW5lcmF0b3IucHJpbnQoIlsiKTsKLSAgICAgIGJvb2xlYW4gcHJpbnRlZEVsZW1lbnQgPSBmYWxzZTsKLSAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgdmFsdWUpIHsKLSAgICAgICAgaWYgKHByaW50ZWRFbGVtZW50KSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCIsICIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHByaW50ZWRFbGVtZW50ID0gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBwcmludFNpbmdsZUZpZWxkVmFsdWUoZmllbGQsIGVsZW1lbnQpOwotICAgICAgfQotICAgICAgZ2VuZXJhdG9yLnByaW50KCJdIik7Ci0gICAgfQotICAgIAotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJyYXd0eXBlcyIpCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50TWFwRmllbGRWYWx1ZShGaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIERlc2NyaXB0b3IgdHlwZSA9IGZpZWxkLmdldE1lc3NhZ2VUeXBlKCk7Ci0gICAgICBGaWVsZERlc2NyaXB0b3Iga2V5RmllbGQgPSB0eXBlLmZpbmRGaWVsZEJ5TmFtZSgia2V5Iik7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgdmFsdWVGaWVsZCA9IHR5cGUuZmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOwotICAgICAgaWYgKGtleUZpZWxkID09IG51bGwgfHwgdmFsdWVGaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgbWFwIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgZ2VuZXJhdG9yLnByaW50KCJ7XG4iKTsKLSAgICAgIGdlbmVyYXRvci5pbmRlbnQoKTsKLSAgICAgIGJvb2xlYW4gcHJpbnRlZEVsZW1lbnQgPSBmYWxzZTsKLSAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCkgdmFsdWUpIHsKLSAgICAgICAgTWVzc2FnZSBlbnRyeSA9IChNZXNzYWdlKSBlbGVtZW50OwotICAgICAgICBPYmplY3QgZW50cnlLZXkgPSBlbnRyeS5nZXRGaWVsZChrZXlGaWVsZCk7Ci0gICAgICAgIE9iamVjdCBlbnRyeVZhbHVlID0gZW50cnkuZ2V0RmllbGQodmFsdWVGaWVsZCk7Ci0gICAgICAgIGlmIChwcmludGVkRWxlbWVudCkgewotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiLFxuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHJpbnRlZEVsZW1lbnQgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIC8vIEtleSBmaWVsZHMgYXJlIGFsd2F5cyBkb3VibGUtcXVvdGVkLgotICAgICAgICBwcmludFNpbmdsZUZpZWxkVmFsdWUoa2V5RmllbGQsIGVudHJ5S2V5LCB0cnVlKTsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCI6ICIpOwotICAgICAgICBwcmludFNpbmdsZUZpZWxkVmFsdWUodmFsdWVGaWVsZCwgZW50cnlWYWx1ZSk7Ci0gICAgICB9Ci0gICAgICBpZiAocHJpbnRlZEVsZW1lbnQpIHsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcbiIpOwotICAgICAgfQotICAgICAgZ2VuZXJhdG9yLm91dGRlbnQoKTsKLSAgICAgIGdlbmVyYXRvci5wcmludCgifSIpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgcHJpbnRTaW5nbGVGaWVsZFZhbHVlKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcHJpbnRTaW5nbGVGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgZmFsc2UpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByaW50cyBhIGZpZWxkJ3MgdmFsdWUgaW4gSlNPTiBmb3JtYXQuCi0gICAgICogCi0gICAgICogQHBhcmFtIGFsd2F5c1dpdGhRdW90ZXMgd2hldGhlciB0byBhbHdheXMgYWRkIGRvdWJsZS1xdW90ZXMgdG8gcHJpbWl0aXZlCi0gICAgICogICAgICAgIHR5cGVzLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBwcmludFNpbmdsZUZpZWxkVmFsdWUoCi0gICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgT2JqZWN0IHZhbHVlLAotICAgICAgICBib29sZWFuIGFsd2F5c1dpdGhRdW90ZXMpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIElOVDMyOgotICAgICAgICBjYXNlIFNJTlQzMjoKLSAgICAgICAgY2FzZSBTRklYRUQzMjoKLSAgICAgICAgICBpZiAoYWx3YXlzV2l0aFF1b3RlcykgewotICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChJbnRlZ2VyKSB2YWx1ZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgaWYgKGFsd2F5c1dpdGhRdW90ZXMpIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBJTlQ2NDoKLSAgICAgICAgY2FzZSBTSU5UNjQ6Ci0gICAgICAgIGNhc2UgU0ZJWEVENjQ6Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIgKyAoKExvbmcpIHZhbHVlKS50b1N0cmluZygpICsgIlwiIik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCT09MOgotICAgICAgICAgIGlmIChhbHdheXNXaXRoUXVvdGVzKSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICgoKEJvb2xlYW4pIHZhbHVlKS5ib29sZWFuVmFsdWUoKSkgewotICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJ0cnVlIik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiZmFsc2UiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGFsd2F5c1dpdGhRdW90ZXMpIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGTE9BVDoKLSAgICAgICAgICBGbG9hdCBmbG9hdFZhbHVlID0gKEZsb2F0KSB2YWx1ZTsKLSAgICAgICAgICBpZiAoZmxvYXRWYWx1ZS5pc05hTigpKSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiTmFOXCIiKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGZsb2F0VmFsdWUuaXNJbmZpbml0ZSgpKSB7Ci0gICAgICAgICAgICBpZiAoZmxvYXRWYWx1ZSA8IDApIHsKLSAgICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIi1JbmZpbml0eVwiIik7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiSW5maW5pdHlcIiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoYWx3YXlzV2l0aFF1b3RlcykgewotICAgICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZmxvYXRWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChhbHdheXNXaXRoUXVvdGVzKSB7Ci0gICAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgCi0gICAgICAgIGNhc2UgRE9VQkxFOgotICAgICAgICAgIERvdWJsZSBkb3VibGVWYWx1ZSA9IChEb3VibGUpIHZhbHVlOwotICAgICAgICAgIGlmIChkb3VibGVWYWx1ZS5pc05hTigpKSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiTmFOXCIiKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGRvdWJsZVZhbHVlLmlzSW5maW5pdGUoKSkgewotICAgICAgICAgICAgaWYgKGRvdWJsZVZhbHVlIDwgMCkgewotICAgICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiLUluZmluaXR5XCIiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCJJbmZpbml0eVwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmIChhbHdheXNXaXRoUXVvdGVzKSB7Ci0gICAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludChkb3VibGVWYWx1ZS50b1N0cmluZygpKTsKLSAgICAgICAgICAgIGlmIChhbHdheXNXaXRoUXVvdGVzKSB7Ci0gICAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgIGNhc2UgRklYRUQzMjoKLSAgICAgICAgICBpZiAoYWx3YXlzV2l0aFF1b3RlcykgewotICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQodW5zaWduZWRUb1N0cmluZygoSW50ZWdlcikgdmFsdWUpKTsKLSAgICAgICAgICBpZiAoYWx3YXlzV2l0aFF1b3RlcykgewotICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgY2FzZSBGSVhFRDY0OgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiICsgdW5zaWduZWRUb1N0cmluZygoTG9uZykgdmFsdWUpICsgIlwiIik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGdzb24udG9Kc29uKHZhbHVlKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCWVRFUzoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KAotICAgICAgICAgICAgICBCYXNlRW5jb2RpbmcuYmFzZTY0KCkuZW5jb2RlKCgoQnl0ZVN0cmluZykgdmFsdWUpLnRvQnl0ZUFycmF5KCkpKTsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBFTlVNOgotICAgICAgICAgIC8vIFNwZWNpYWwtY2FzZSBnb29nbGUucHJvdG9idWYuTnVsbFZhbHVlIChpdCdzIGFuIEVudW0pLgotICAgICAgICAgIGlmIChmaWVsZC5nZXRFbnVtVHlwZSgpLmdldEZ1bGxOYW1lKCkuZXF1YWxzKAotICAgICAgICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5OdWxsVmFsdWUiKSkgewotICAgICAgICAgICAgLy8gTm8gbWF0dGVyIHdoYXQgdmFsdWUgaXQgY29udGFpbnMsIHdlIGFsd2F5cyBwcmludCBpdCBhcyAibnVsbCIuCi0gICAgICAgICAgICBpZiAoYWx3YXlzV2l0aFF1b3RlcykgewotICAgICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlwiIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIm51bGwiKTsKLSAgICAgICAgICAgIGlmIChhbHdheXNXaXRoUXVvdGVzKSB7Ci0gICAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKCgoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpLmdldEluZGV4KCkgPT0gLTEpIHsKLSAgICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KAotICAgICAgICAgICAgICAgICAgU3RyaW5nLnZhbHVlT2YoKChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSkuZ2V0TnVtYmVyKCkpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgKLSAgICAgICAgICAgICAgICAgICJcIiIgKyAoKEVudW1WYWx1ZURlc2NyaXB0b3IpIHZhbHVlKS5nZXROYW1lKCkgKyAiXCIiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICBjYXNlIEdST1VQOgotICAgICAgICAgIHByaW50KChNZXNzYWdlKSB2YWx1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqIENvbnZlcnQgYW4gdW5zaWduZWQgMzItYml0IGludGVnZXIgdG8gYSBzdHJpbmcuICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyB1bnNpZ25lZFRvU3RyaW5nKGZpbmFsIGludCB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA+PSAwKSB7Ci0gICAgICByZXR1cm4gSW50ZWdlci50b1N0cmluZyh2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBMb25nLnRvU3RyaW5nKHZhbHVlICYgMHgwMDAwMDAwMEZGRkZGRkZGTCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIENvbnZlcnQgYW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIgdG8gYSBzdHJpbmcuICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyB1bnNpZ25lZFRvU3RyaW5nKGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgPj0gMCkgewotICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBQdWxsIG9mZiB0aGUgbW9zdC1zaWduaWZpY2FudCBiaXQgc28gdGhhdCBCaWdJbnRlZ2VyIGRvZXNuJ3QgdGhpbmsKLSAgICAgIC8vIHRoZSBudW1iZXIgaXMgbmVnYXRpdmUsIHRoZW4gc2V0IGl0IGFnYWluIHVzaW5nIHNldEJpdCgpLgotICAgICAgcmV0dXJuIEJpZ0ludGVnZXIudmFsdWVPZih2YWx1ZSAmIExvbmcuTUFYX1ZBTFVFKQotICAgICAgICAgICAgICAgICAgICAgICAuc2V0Qml0KExvbmcuU0laRSAtIDEpLnRvU3RyaW5nKCk7Ci0gICAgfQotICB9Ci0gIAotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZShTdHJpbmcgdHlwZVVybCkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIFN0cmluZ1tdIHBhcnRzID0gdHlwZVVybC5zcGxpdCgiLyIpOwotICAgIGlmIChwYXJ0cy5sZW5ndGggPT0gMSkgewotICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAiSW52YWxpZCB0eXBlIHVybCBmb3VuZDogIiArIHR5cGVVcmwpOwotICAgIH0KLSAgICByZXR1cm4gcGFydHNbcGFydHMubGVuZ3RoIC0gMV07Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIFBhcnNlckltcGwgewotICAgIHByaXZhdGUgZmluYWwgVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5OwotICAgIHByaXZhdGUgZmluYWwgSnNvblBhcnNlciBqc29uUGFyc2VyOwotICAgIAotICAgIFBhcnNlckltcGwoVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB7Ci0gICAgICB0aGlzLnJlZ2lzdHJ5ID0gcmVnaXN0cnk7Ci0gICAgICB0aGlzLmpzb25QYXJzZXIgPSBuZXcgSnNvblBhcnNlcigpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIG1lcmdlKFJlYWRlciBqc29uLCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIEpzb25SZWFkZXIgcmVhZGVyID0gbmV3IEpzb25SZWFkZXIoanNvbik7Ci0gICAgICByZWFkZXIuc2V0TGVuaWVudChmYWxzZSk7Ci0gICAgICBtZXJnZShqc29uUGFyc2VyLnBhcnNlKHJlYWRlciksIGJ1aWxkZXIpOwotICAgIH0KLSAgICAKLSAgICB2b2lkIG1lcmdlKFN0cmluZyBqc29uLCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBKc29uUmVhZGVyIHJlYWRlciA9IG5ldyBKc29uUmVhZGVyKG5ldyBTdHJpbmdSZWFkZXIoanNvbikpOwotICAgICAgICByZWFkZXIuc2V0TGVuaWVudChmYWxzZSk7Ci0gICAgICAgIG1lcmdlKGpzb25QYXJzZXIucGFyc2UocmVhZGVyKSwgYnVpbGRlcik7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgY29udmVydCBhbGwgZXhjZXB0aW9ucyBmcm9tIEpTT04gcGFyc2luZyB0byBvdXIgb3duIGV4Y2VwdGlvbnMuCi0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oZS5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludGVyZmFjZSBXZWxsS25vd25UeXBlUGFyc2VyIHsKLSAgICAgIHZvaWQgbWVyZ2UoUGFyc2VySW1wbCBwYXJzZXIsIEpzb25FbGVtZW50IGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIE1hcDxTdHJpbmcsIFdlbGxLbm93blR5cGVQYXJzZXI+IHdlbGxLbm93blR5cGVQYXJzZXJzID0KLSAgICAgICAgYnVpbGRXZWxsS25vd25UeXBlUGFyc2VycygpOwotICAgIAotICAgIHByaXZhdGUgc3RhdGljIE1hcDxTdHJpbmcsIFdlbGxLbm93blR5cGVQYXJzZXI+Ci0gICAgYnVpbGRXZWxsS25vd25UeXBlUGFyc2VycygpIHsKLSAgICAgIE1hcDxTdHJpbmcsIFdlbGxLbm93blR5cGVQYXJzZXI+IHBhcnNlcnMgPQotICAgICAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgV2VsbEtub3duVHlwZVBhcnNlcj4oKTsKLSAgICAgIC8vIFNwZWNpYWwtY2FzZSBBbnkuCi0gICAgICBwYXJzZXJzLnB1dChBbnkuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIG5ldyBXZWxsS25vd25UeXBlUGFyc2VyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbWVyZ2UoUGFyc2VySW1wbCBwYXJzZXIsIEpzb25FbGVtZW50IGpzb24sCi0gICAgICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcGFyc2VyLm1lcmdlQW55KGpzb24sIGJ1aWxkZXIpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIC8vIFNwZWNpYWwtY2FzZSB3cmFwcGVyIHR5cGVzLgotICAgICAgV2VsbEtub3duVHlwZVBhcnNlciB3cmFwcGVyc1ByaW50ZXIgPSBuZXcgV2VsbEtub3duVHlwZVBhcnNlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lcmdlKFBhcnNlckltcGwgcGFyc2VyLCBKc29uRWxlbWVudCBqc29uLAotICAgICAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgICAgIHBhcnNlci5tZXJnZVdyYXBwZXIoanNvbiwgYnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICAgIH07Ci0gICAgICBwYXJzZXJzLnB1dChCb29sVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIHdyYXBwZXJzUHJpbnRlcik7Ci0gICAgICBwYXJzZXJzLnB1dChJbnQzMlZhbHVlLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLCB3cmFwcGVyc1ByaW50ZXIpOwotICAgICAgcGFyc2Vycy5wdXQoVUludDMyVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIHdyYXBwZXJzUHJpbnRlcik7Ci0gICAgICBwYXJzZXJzLnB1dChJbnQ2NFZhbHVlLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLCB3cmFwcGVyc1ByaW50ZXIpOwotICAgICAgcGFyc2Vycy5wdXQoVUludDY0VmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIHdyYXBwZXJzUHJpbnRlcik7Ci0gICAgICBwYXJzZXJzLnB1dChTdHJpbmdWYWx1ZS5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSwgd3JhcHBlcnNQcmludGVyKTsKLSAgICAgIHBhcnNlcnMucHV0KEJ5dGVzVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIHdyYXBwZXJzUHJpbnRlcik7Ci0gICAgICBwYXJzZXJzLnB1dChGbG9hdFZhbHVlLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLCB3cmFwcGVyc1ByaW50ZXIpOwotICAgICAgcGFyc2Vycy5wdXQoRG91YmxlVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksIHdyYXBwZXJzUHJpbnRlcik7Ci0gICAgICAvLyBTcGVjaWFsLWNhc2UgVGltZXN0YW1wLgotICAgICAgcGFyc2Vycy5wdXQoVGltZXN0YW1wLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICAgIG5ldyBXZWxsS25vd25UeXBlUGFyc2VyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbWVyZ2UoUGFyc2VySW1wbCBwYXJzZXIsIEpzb25FbGVtZW50IGpzb24sCi0gICAgICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcGFyc2VyLm1lcmdlVGltZXN0YW1wKGpzb24sIGJ1aWxkZXIpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIC8vIFNwZWNpYWwtY2FzZSBEdXJhdGlvbi4KLSAgICAgIHBhcnNlcnMucHV0KER1cmF0aW9uLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICAgIG5ldyBXZWxsS25vd25UeXBlUGFyc2VyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbWVyZ2UoUGFyc2VySW1wbCBwYXJzZXIsIEpzb25FbGVtZW50IGpzb24sCi0gICAgICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcGFyc2VyLm1lcmdlRHVyYXRpb24oanNvbiwgYnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgLy8gU3BlY2lhbC1jYXNlIEZpZWxkTWFzay4KLSAgICAgIHBhcnNlcnMucHV0KEZpZWxkTWFzay5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSwKLSAgICAgICAgICBuZXcgV2VsbEtub3duVHlwZVBhcnNlcigpIHsKLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHB1YmxpYyB2b2lkIG1lcmdlKFBhcnNlckltcGwgcGFyc2VyLCBKc29uRWxlbWVudCBqc29uLAotICAgICAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgICAgIHBhcnNlci5tZXJnZUZpZWxkTWFzayhqc29uLCBidWlsZGVyKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICAvLyBTcGVjaWFsLWNhc2UgU3RydWN0LgotICAgICAgcGFyc2Vycy5wdXQoU3RydWN0LmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpLAotICAgICAgICAgIG5ldyBXZWxsS25vd25UeXBlUGFyc2VyKCkgewotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHVibGljIHZvaWQgbWVyZ2UoUGFyc2VySW1wbCBwYXJzZXIsIEpzb25FbGVtZW50IGpzb24sCi0gICAgICAgICAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICAgICAgcGFyc2VyLm1lcmdlU3RydWN0KGpzb24sIGJ1aWxkZXIpOwotICAgICAgICB9Ci0gICAgICB9KTsKLSAgICAgIC8vIFNwZWNpYWwtY2FzZSBMaXN0VmFsdWUuCi0gICAgICBwYXJzZXJzLnB1dChMaXN0VmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgbmV3IFdlbGxLbm93blR5cGVQYXJzZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBtZXJnZShQYXJzZXJJbXBsIHBhcnNlciwgSnNvbkVsZW1lbnQganNvbiwKLSAgICAgICAgICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgICAgICBwYXJzZXIubWVyZ2VMaXN0VmFsdWUoanNvbiwgYnVpbGRlcik7Ci0gICAgICAgIH0KLSAgICAgIH0pOwotICAgICAgLy8gU3BlY2lhbC1jYXNlIFZhbHVlLgotICAgICAgcGFyc2Vycy5wdXQoVmFsdWUuZ2V0RGVzY3JpcHRvcigpLmdldEZ1bGxOYW1lKCksCi0gICAgICAgICAgbmV3IFdlbGxLbm93blR5cGVQYXJzZXIoKSB7Ci0gICAgICAgIEBPdmVycmlkZQotICAgICAgICBwdWJsaWMgdm9pZCBtZXJnZShQYXJzZXJJbXBsIHBhcnNlciwgSnNvbkVsZW1lbnQganNvbiwKLSAgICAgICAgICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgICAgICBwYXJzZXIubWVyZ2VWYWx1ZShqc29uLCBidWlsZGVyKTsKLSAgICAgICAgfQotICAgICAgfSk7Ci0gICAgICByZXR1cm4gcGFyc2VyczsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlKEpzb25FbGVtZW50IGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIFdlbGxLbm93blR5cGVQYXJzZXIgc3BlY2lhbFBhcnNlciA9IHdlbGxLbm93blR5cGVQYXJzZXJzLmdldCgKLSAgICAgICAgICBidWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgICBpZiAoc3BlY2lhbFBhcnNlciAhPSBudWxsKSB7Ci0gICAgICAgIHNwZWNpYWxQYXJzZXIubWVyZ2UodGhpcywganNvbiwgYnVpbGRlcik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIG1lcmdlTWVzc2FnZShqc29uLCBidWlsZGVyLCBmYWxzZSk7Ci0gICAgfQotICAgIAotICAgIC8vIE1hcHMgZnJvbSBjYW1lbC1jYXNlIGZpZWxkIG5hbWVzIHRvIEZpZWxkRGVzY3JpcHRvci4KLSAgICBwcml2YXRlIGZpbmFsIE1hcDxEZXNjcmlwdG9yLCBNYXA8U3RyaW5nLCBGaWVsZERlc2NyaXB0b3I+PiBmaWVsZE5hbWVNYXBzID0KLSAgICAgICAgbmV3IEhhc2hNYXA8RGVzY3JpcHRvciwgTWFwPFN0cmluZywgRmllbGREZXNjcmlwdG9yPj4oKTsKLSAgICAKLSAgICBwcml2YXRlIE1hcDxTdHJpbmcsIEZpZWxkRGVzY3JpcHRvcj4gZ2V0RmllbGROYW1lTWFwKAotICAgICAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgIGlmICghZmllbGROYW1lTWFwcy5jb250YWluc0tleShkZXNjcmlwdG9yKSkgewotICAgICAgICBNYXA8U3RyaW5nLCBGaWVsZERlc2NyaXB0b3I+IGZpZWxkTmFtZU1hcCA9Ci0gICAgICAgICAgICBuZXcgSGFzaE1hcDxTdHJpbmcsIEZpZWxkRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgZm9yIChGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBkZXNjcmlwdG9yLmdldEZpZWxkcygpKSB7Ci0gICAgICAgICAgZmllbGROYW1lTWFwLnB1dChmaWVsZC5nZXROYW1lKCksIGZpZWxkKTsKLSAgICAgICAgICBmaWVsZE5hbWVNYXAucHV0KGZpZWxkLmdldEpzb25OYW1lKCksIGZpZWxkKTsKLSAgICAgICAgfQotICAgICAgICBmaWVsZE5hbWVNYXBzLnB1dChkZXNjcmlwdG9yLCBmaWVsZE5hbWVNYXApOwotICAgICAgICByZXR1cm4gZmllbGROYW1lTWFwOwotICAgICAgfQotICAgICAgcmV0dXJuIGZpZWxkTmFtZU1hcHMuZ2V0KGRlc2NyaXB0b3IpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbWVyZ2VNZXNzYWdlKEpzb25FbGVtZW50IGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLAotICAgICAgICBib29sZWFuIHNraXBUeXBlVXJsKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIGlmICghKGpzb24gaW5zdGFuY2VvZiBKc29uT2JqZWN0KSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIkV4cGVjdCBtZXNzYWdlIG9iamVjdCBidXQgZ290OiAiICsganNvbik7Ci0gICAgICB9Ci0gICAgICBKc29uT2JqZWN0IG9iamVjdCA9IChKc29uT2JqZWN0KSBqc29uOwotICAgICAgTWFwPFN0cmluZywgRmllbGREZXNjcmlwdG9yPiBmaWVsZE5hbWVNYXAgPQotICAgICAgICAgIGdldEZpZWxkTmFtZU1hcChidWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpOwotICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBKc29uRWxlbWVudD4gZW50cnkgOiBvYmplY3QuZW50cnlTZXQoKSkgewotICAgICAgICBpZiAoc2tpcFR5cGVVcmwgJiYgZW50cnkuZ2V0S2V5KCkuZXF1YWxzKCJAdHlwZSIpKSB7Ci0gICAgICAgICAgY29udGludWU7Ci0gICAgICAgIH0KLSAgICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZmllbGROYW1lTWFwLmdldChlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIkNhbm5vdCBmaW5kIGZpZWxkOiAiICsgZW50cnkuZ2V0S2V5KCkgKyAiIGluIG1lc3NhZ2UgIgotICAgICAgICAgICAgICArIGJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGdWxsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBtZXJnZUZpZWxkKGZpZWxkLCBlbnRyeS5nZXRWYWx1ZSgpLCBidWlsZGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlQW55KEpzb25FbGVtZW50IGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciB0eXBlVXJsRmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgidHlwZV91cmwiKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciB2YWx1ZUZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInZhbHVlIik7Ci0gICAgICAvLyBWYWxpZGF0ZXMgdHlwZSBvZiB0aGUgbWVzc2FnZS4gTm90ZSB0aGF0IHdlIGNhbid0IGp1c3QgY2FzdCB0aGUgbWVzc2FnZQotICAgICAgLy8gdG8gY29tLmdvb2dsZS5wcm90b2J1Zi5BbnkgYmVjYXVzZSBpdCBtaWdodCBiZSBhIER5bmFtaWNNZXNzYWdlLiAKLSAgICAgIGlmICh0eXBlVXJsRmllbGQgPT0gbnVsbCB8fCB2YWx1ZUZpZWxkID09IG51bGwKLSAgICAgICAgICB8fCB0eXBlVXJsRmllbGQuZ2V0VHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5UeXBlLlNUUklORwotICAgICAgICAgIHx8IHZhbHVlRmllbGQuZ2V0VHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5UeXBlLkJZVEVTKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgQW55IHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICAKLSAgICAgIGlmICghKGpzb24gaW5zdGFuY2VvZiBKc29uT2JqZWN0KSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIkV4cGVjdCBtZXNzYWdlIG9iamVjdCBidXQgZ290OiAiICsganNvbik7Ci0gICAgICB9Ci0gICAgICBKc29uT2JqZWN0IG9iamVjdCA9IChKc29uT2JqZWN0KSBqc29uOwotICAgICAgSnNvbkVsZW1lbnQgdHlwZVVybEVsZW1lbnQgPSBvYmplY3QuZ2V0KCJAdHlwZSIpOwotICAgICAgaWYgKHR5cGVVcmxFbGVtZW50ID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJNaXNzaW5nIHR5cGUgdXJsIHdoZW4gcGFyc2luZzogIiArIGpzb24pOwotICAgICAgfQotICAgICAgU3RyaW5nIHR5cGVVcmwgPSB0eXBlVXJsRWxlbWVudC5nZXRBc1N0cmluZygpOwotICAgICAgRGVzY3JpcHRvciBjb250ZW50VHlwZSA9IHJlZ2lzdHJ5LmZpbmQoZ2V0VHlwZU5hbWUodHlwZVVybCkpOwotICAgICAgaWYgKGNvbnRlbnRUeXBlID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJDYW5ub3QgcmVzb2x2ZSB0eXBlOiAiICsgdHlwZVVybCk7Ci0gICAgICB9Ci0gICAgICBidWlsZGVyLnNldEZpZWxkKHR5cGVVcmxGaWVsZCwgdHlwZVVybCk7Ci0gICAgICBNZXNzYWdlLkJ1aWxkZXIgY29udGVudEJ1aWxkZXIgPQotICAgICAgICAgIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShjb250ZW50VHlwZSkubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICAgIFdlbGxLbm93blR5cGVQYXJzZXIgc3BlY2lhbFBhcnNlciA9Ci0gICAgICAgICAgd2VsbEtub3duVHlwZVBhcnNlcnMuZ2V0KGNvbnRlbnRUeXBlLmdldEZ1bGxOYW1lKCkpOwotICAgICAgaWYgKHNwZWNpYWxQYXJzZXIgIT0gbnVsbCkgewotICAgICAgICBKc29uRWxlbWVudCB2YWx1ZSA9IG9iamVjdC5nZXQoInZhbHVlIik7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgc3BlY2lhbFBhcnNlci5tZXJnZSh0aGlzLCB2YWx1ZSwgY29udGVudEJ1aWxkZXIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtZXJnZU1lc3NhZ2UoanNvbiwgY29udGVudEJ1aWxkZXIsIHRydWUpOwotICAgICAgfQotICAgICAgYnVpbGRlci5zZXRGaWVsZCh2YWx1ZUZpZWxkLCBjb250ZW50QnVpbGRlci5idWlsZCgpLnRvQnl0ZVN0cmluZygpKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlRmllbGRNYXNrKEpzb25FbGVtZW50IGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIEZpZWxkTWFzayB2YWx1ZSA9IEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZyhqc29uLmdldEFzU3RyaW5nKCkpOwotICAgICAgYnVpbGRlci5tZXJnZUZyb20odmFsdWUudG9CeXRlU3RyaW5nKCkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbWVyZ2VUaW1lc3RhbXAoSnNvbkVsZW1lbnQganNvbiwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgVGltZXN0YW1wIHZhbHVlID0gVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoanNvbi5nZXRBc1N0cmluZygpKTsKLSAgICAgICAgYnVpbGRlci5tZXJnZUZyb20odmFsdWUudG9CeXRlU3RyaW5nKCkpOwotICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIkZhaWxlZCB0byBwYXJzZSB0aW1lc3RhbXA6ICIgKyBqc29uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlRHVyYXRpb24oSnNvbkVsZW1lbnQganNvbiwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgRHVyYXRpb24gdmFsdWUgPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKGpzb24uZ2V0QXNTdHJpbmcoKSk7Ci0gICAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKHZhbHVlLnRvQnl0ZVN0cmluZygpKTsKLSAgICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJGYWlsZWQgdG8gcGFyc2UgZHVyYXRpb246ICIgKyBqc29uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlU3RydWN0KEpzb25FbGVtZW50IGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJmaWVsZHMiKTsKLSAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIkludmFsaWQgU3RydWN0IHR5cGUuIik7Ci0gICAgICB9Ci0gICAgICBtZXJnZU1hcEZpZWxkKGZpZWxkLCBqc29uLCBidWlsZGVyKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbWVyZ2VMaXN0VmFsdWUoSnNvbkVsZW1lbnQganNvbiwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gYnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoInZhbHVlcyIpOwotICAgICAgaWYgKGZpZWxkID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiSW52YWxpZCBMaXN0VmFsdWUgdHlwZS4iKTsKLSAgICAgIH0KLSAgICAgIG1lcmdlUmVwZWF0ZWRGaWVsZChmaWVsZCwganNvbiwgYnVpbGRlcik7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBtZXJnZVZhbHVlKEpzb25FbGVtZW50IGpzb24sIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIERlc2NyaXB0b3IgdHlwZSA9IGJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIGlmIChqc29uIGluc3RhbmNlb2YgSnNvblByaW1pdGl2ZSkgewotICAgICAgICBKc29uUHJpbWl0aXZlIHByaW1pdGl2ZSA9IChKc29uUHJpbWl0aXZlKSBqc29uOwotICAgICAgICBpZiAocHJpbWl0aXZlLmlzQm9vbGVhbigpKSB7Ci0gICAgICAgICAgYnVpbGRlci5zZXRGaWVsZCh0eXBlLmZpbmRGaWVsZEJ5TmFtZSgiYm9vbF92YWx1ZSIpLAotICAgICAgICAgICAgICBwcmltaXRpdmUuZ2V0QXNCb29sZWFuKCkpOwotICAgICAgICB9IGVsc2UgaWYgKHByaW1pdGl2ZS5pc051bWJlcigpKSB7Ci0gICAgICAgICAgYnVpbGRlci5zZXRGaWVsZCh0eXBlLmZpbmRGaWVsZEJ5TmFtZSgibnVtYmVyX3ZhbHVlIiksCi0gICAgICAgICAgICAgIHByaW1pdGl2ZS5nZXRBc0RvdWJsZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBidWlsZGVyLnNldEZpZWxkKHR5cGUuZmluZEZpZWxkQnlOYW1lKCJzdHJpbmdfdmFsdWUiKSwKLSAgICAgICAgICAgICAgcHJpbWl0aXZlLmdldEFzU3RyaW5nKCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGpzb24gaW5zdGFuY2VvZiBKc29uT2JqZWN0KSB7Ci0gICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IHR5cGUuZmluZEZpZWxkQnlOYW1lKCJzdHJ1Y3RfdmFsdWUiKTsKLSAgICAgICAgTWVzc2FnZS5CdWlsZGVyIHN0cnVjdEJ1aWxkZXIgPSBidWlsZGVyLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZCk7Ci0gICAgICAgIG1lcmdlKGpzb24sIHN0cnVjdEJ1aWxkZXIpOwotICAgICAgICBidWlsZGVyLnNldEZpZWxkKGZpZWxkLCBzdHJ1Y3RCdWlsZGVyLmJ1aWxkKCkpOwotICAgICAgfSBlbHNlIGlmIChqc29uIGluc3RhbmNlb2YgSnNvbkFycmF5KSB7Ci0gICAgICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IHR5cGUuZmluZEZpZWxkQnlOYW1lKCJsaXN0X3ZhbHVlIik7Ci0gICAgICAgIE1lc3NhZ2UuQnVpbGRlciBsaXN0QnVpbGRlciA9IGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKLSAgICAgICAgbWVyZ2UoanNvbiwgbGlzdEJ1aWxkZXIpOwotICAgICAgICBidWlsZGVyLnNldEZpZWxkKGZpZWxkLCBsaXN0QnVpbGRlci5idWlsZCgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlVuZXhwZWN0ZWQganNvbiBkYXRhOiAiICsganNvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBtZXJnZVdyYXBwZXIoSnNvbkVsZW1lbnQganNvbiwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgRGVzY3JpcHRvciB0eXBlID0gYnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU5hbWUoInZhbHVlIik7Ci0gICAgICBpZiAoZmllbGQgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIkludmFsaWQgd3JhcHBlciB0eXBlOiAiICsgdHlwZS5nZXRGdWxsTmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIHBhcnNlRmllbGRWYWx1ZShmaWVsZCwganNvbiwgYnVpbGRlcikpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHZvaWQgbWVyZ2VGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIEpzb25FbGVtZW50IGpzb24sCi0gICAgICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgaWYgKGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKSA+IDApIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiRmllbGQgIiArIGZpZWxkLmdldEZ1bGxOYW1lKCkgKyAiIGhhcyBhbHJlYWR5IGJlZW4gc2V0LiIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoYnVpbGRlci5oYXNGaWVsZChmaWVsZCkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiRmllbGQgIiArIGZpZWxkLmdldEZ1bGxOYW1lKCkgKyAiIGhhcyBhbHJlYWR5IGJlZW4gc2V0LiIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nT25lb2YoKSAhPSBudWxsCi0gICAgICAgICAgICAmJiBidWlsZGVyLmdldE9uZW9mRmllbGREZXNjcmlwdG9yKGZpZWxkLmdldENvbnRhaW5pbmdPbmVvZigpKSAhPSBudWxsKSB7Ci0gICAgICAgICAgRmllbGREZXNjcmlwdG9yIG90aGVyID0gYnVpbGRlci5nZXRPbmVvZkZpZWxkRGVzY3JpcHRvcihmaWVsZC5nZXRDb250YWluaW5nT25lb2YoKSk7Ci0gICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgZmllbGQgIiArIGZpZWxkLmdldEZ1bGxOYW1lKCkgKyAiIGJlY2F1c2UgYW5vdGhlciBmaWVsZCAiCi0gICAgICAgICAgICAgICsgb3RoZXIuZ2V0RnVsbE5hbWUoKSArICIgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9uZW9mIGhhcyBhbHJlYWR5IGJlZW4gc2V0ICIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpICYmIGpzb24gaW5zdGFuY2VvZiBKc29uTnVsbCkgewotICAgICAgICAvLyBXZSBhbGxvdyAibnVsbCIgYXMgdmFsdWUgZm9yIGFsbCBmaWVsZCB0eXBlcyBhbmQgdHJlYXQgaXQgYXMgaWYgdGhlCi0gICAgICAgIC8vIGZpZWxkIGlzIG5vdCBwcmVzZW50LgotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGQuaXNNYXBGaWVsZCgpKSB7Ci0gICAgICAgIG1lcmdlTWFwRmllbGQoZmllbGQsIGpzb24sIGJ1aWxkZXIpOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgbWVyZ2VSZXBlYXRlZEZpZWxkKGZpZWxkLCBqc29uLCBidWlsZGVyKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIE9iamVjdCB2YWx1ZSA9IHBhcnNlRmllbGRWYWx1ZShmaWVsZCwganNvbiwgYnVpbGRlcik7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgdm9pZCBtZXJnZU1hcEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgSnNvbkVsZW1lbnQganNvbiwKLSAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgaWYgKCEoanNvbiBpbnN0YW5jZW9mIEpzb25PYmplY3QpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAiRXhwZWN0IGEgbWFwIG9iamVjdCBidXQgZm91bmQ6ICIgKyBqc29uKTsKLSAgICAgIH0KLSAgICAgIERlc2NyaXB0b3IgdHlwZSA9IGZpZWxkLmdldE1lc3NhZ2VUeXBlKCk7Ci0gICAgICBGaWVsZERlc2NyaXB0b3Iga2V5RmllbGQgPSB0eXBlLmZpbmRGaWVsZEJ5TmFtZSgia2V5Iik7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgdmFsdWVGaWVsZCA9IHR5cGUuZmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOwotICAgICAgaWYgKGtleUZpZWxkID09IG51bGwgfHwgdmFsdWVGaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAiSW52YWxpZCBtYXAgZmllbGQ6ICIgKyBmaWVsZC5nZXRGdWxsTmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIEpzb25PYmplY3Qgb2JqZWN0ID0gKEpzb25PYmplY3QpIGpzb247Ci0gICAgICBmb3IgKE1hcC5FbnRyeTxTdHJpbmcsIEpzb25FbGVtZW50PiBlbnRyeSA6IG9iamVjdC5lbnRyeVNldCgpKSB7Ci0gICAgICAgIE1lc3NhZ2UuQnVpbGRlciBlbnRyeUJ1aWxkZXIgPSBidWlsZGVyLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZCk7Ci0gICAgICAgIE9iamVjdCBrZXkgPSBwYXJzZUZpZWxkVmFsdWUoCi0gICAgICAgICAgICBrZXlGaWVsZCwgbmV3IEpzb25QcmltaXRpdmUoZW50cnkuZ2V0S2V5KCkpLCBlbnRyeUJ1aWxkZXIpOwotICAgICAgICBPYmplY3QgdmFsdWUgPSBwYXJzZUZpZWxkVmFsdWUoCi0gICAgICAgICAgICB2YWx1ZUZpZWxkLCBlbnRyeS5nZXRWYWx1ZSgpLCBlbnRyeUJ1aWxkZXIpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJNYXAgdmFsdWUgY2Fubm90IGJlIG51bGwuIik7Ci0gICAgICAgIH0KLSAgICAgICAgZW50cnlCdWlsZGVyLnNldEZpZWxkKGtleUZpZWxkLCBrZXkpOwotICAgICAgICBlbnRyeUJ1aWxkZXIuc2V0RmllbGQodmFsdWVGaWVsZCwgdmFsdWUpOwotICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIGVudHJ5QnVpbGRlci5idWlsZCgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmaWVsZCB0eXBlLiBOb3RlIHRoYXQgd2UgdXNlIHByb3RvMwotICAgICAqIGxhbmd1YWdlIGRlZmF1bHRzIGFuZCBpZ25vcmUgYW55IGRlZmF1bHQgdmFsdWVzIHNldCB0aHJvdWdoIHRoZQotICAgICAqIHByb3RvICJkZWZhdWx0IiBvcHRpb24uIAotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IGdldERlZmF1bHRWYWx1ZShGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIElOVDMyOgotICAgICAgICBjYXNlIFNJTlQzMjoKLSAgICAgICAgY2FzZSBTRklYRUQzMjoKLSAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgIGNhc2UgRklYRUQzMjoKLSAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgY2FzZSBJTlQ2NDoKLSAgICAgICAgY2FzZSBTSU5UNjQ6Ci0gICAgICAgIGNhc2UgU0ZJWEVENjQ6Ci0gICAgICAgIGNhc2UgVUlOVDY0OgotICAgICAgICBjYXNlIEZJWEVENjQ6Ci0gICAgICAgICAgcmV0dXJuIDBMOwotICAgICAgICBjYXNlIEZMT0FUOgotICAgICAgICAgIHJldHVybiAwLjBmOwotICAgICAgICBjYXNlIERPVUJMRToKLSAgICAgICAgICByZXR1cm4gMC4wOwotICAgICAgICBjYXNlIEJPT0w6Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICByZXR1cm4gIiI7Ci0gICAgICAgIGNhc2UgQllURVM6Ci0gICAgICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuRU1QVFk7Ci0gICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICByZXR1cm4gZmllbGQuZ2V0RW51bVR5cGUoKS5nZXRWYWx1ZXMoKS5nZXQoMCk7Ci0gICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgY2FzZSBHUk9VUDoKLSAgICAgICAgICByZXR1cm4gYnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiSW52YWxpZCBmaWVsZCB0eXBlOiAiICsgZmllbGQuZ2V0VHlwZSgpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSB2b2lkIG1lcmdlUmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIEpzb25FbGVtZW50IGpzb24sCi0gICAgICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIGlmICghKGpzb24gaW5zdGFuY2VvZiBKc29uQXJyYXkpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAiRXhwZWN0IGFuIGFycmF5IGJ1dCBmb3VuZDogIiArIGpzb24pOwotICAgICAgfQotICAgICAgSnNvbkFycmF5IGFycmF5ID0gKEpzb25BcnJheSkganNvbjsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXkuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgT2JqZWN0IHZhbHVlID0gcGFyc2VGaWVsZFZhbHVlKGZpZWxkLCBhcnJheS5nZXQoaSksIGJ1aWxkZXIpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJSZXBlYXRlZCBmaWVsZCBlbGVtZW50cyBjYW5ub3QgYmUgbnVsbCIpOwotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIGludCBwYXJzZUludDMyKEpzb25FbGVtZW50IGpzb24pCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgcmV0dXJuIEludGVnZXIucGFyc2VJbnQoanNvbi5nZXRBc1N0cmluZygpKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIEZhbGwgdGhyb3VnaC4KLSAgICAgIH0KLSAgICAgIC8vIEpTT04gZG9lc24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGludGVnZXIgdmFsdWVzIGFuZCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgc28gIjEiIGFuZAotICAgICAgLy8gIjEuMDAwIiBhcmUgdHJlYXRlZCBhcyBlcXVhbCBpbiBKU09OLiBGb3IgdGhpcyByZWFzb24gd2UgYWNjZXB0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBmb3IKLSAgICAgIC8vIGludGVnZXIgZmllbGRzIGFzIHdlbGwgYXMgbG9uZyBhcyBpdCBhY3R1YWxseSBpcyBhbiBpbnRlZ2VyIChpLmUuLCByb3VuZCh2YWx1ZSkgPT0gdmFsdWUpLgotICAgICAgdHJ5IHsKLSAgICAgICAgQmlnRGVjaW1hbCB2YWx1ZSA9IG5ldyBCaWdEZWNpbWFsKGpzb24uZ2V0QXNTdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5pbnRWYWx1ZUV4YWN0KCk7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJOb3QgYW4gaW50MzIgdmFsdWU6ICIgKyBqc29uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBsb25nIHBhcnNlSW50NjQoSnNvbkVsZW1lbnQganNvbikKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICByZXR1cm4gTG9uZy5wYXJzZUxvbmcoanNvbi5nZXRBc1N0cmluZygpKTsKLSAgICAgIH0gY2F0Y2ggKEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIEZhbGwgdGhyb3VnaC4KLSAgICAgIH0KLSAgICAgIC8vIEpTT04gZG9lc24ndCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGludGVnZXIgdmFsdWVzIGFuZCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgc28gIjEiIGFuZAotICAgICAgLy8gIjEuMDAwIiBhcmUgdHJlYXRlZCBhcyBlcXVhbCBpbiBKU09OLiBGb3IgdGhpcyByZWFzb24gd2UgYWNjZXB0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBmb3IKLSAgICAgIC8vIGludGVnZXIgZmllbGRzIGFzIHdlbGwgYXMgbG9uZyBhcyBpdCBhY3R1YWxseSBpcyBhbiBpbnRlZ2VyIChpLmUuLCByb3VuZCh2YWx1ZSkgPT0gdmFsdWUpLgotICAgICAgdHJ5IHsKLSAgICAgICAgQmlnRGVjaW1hbCB2YWx1ZSA9IG5ldyBCaWdEZWNpbWFsKGpzb24uZ2V0QXNTdHJpbmcoKSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZS5sb25nVmFsdWVFeGFjdCgpOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigiTm90IGFuIGludDMyIHZhbHVlOiAiICsganNvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgaW50IHBhcnNlVWludDMyKEpzb25FbGVtZW50IGpzb24pCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgbG9uZyByZXN1bHQgPSBMb25nLnBhcnNlTG9uZyhqc29uLmdldEFzU3RyaW5nKCkpOwotICAgICAgICBpZiAocmVzdWx0IDwgMCB8fCByZXN1bHQgPiAweEZGRkZGRkZGTCkgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJPdXQgb2YgcmFuZ2UgdWludDMyIHZhbHVlOiAiICsganNvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIChpbnQpIHJlc3VsdDsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBGYWxsIHRocm91Z2guCi0gICAgICB9Ci0gICAgICAvLyBKU09OIGRvZXNuJ3QgZGlzdGluZ3Vpc2ggYmV0d2VlbiBpbnRlZ2VyIHZhbHVlcyBhbmQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIHNvICIxIiBhbmQKLSAgICAgIC8vICIxLjAwMCIgYXJlIHRyZWF0ZWQgYXMgZXF1YWwgaW4gSlNPTi4gRm9yIHRoaXMgcmVhc29uIHdlIGFjY2VwdCBmbG9hdGluZyBwb2ludCB2YWx1ZXMgZm9yCi0gICAgICAvLyBpbnRlZ2VyIGZpZWxkcyBhcyB3ZWxsIGFzIGxvbmcgYXMgaXQgYWN0dWFsbHkgaXMgYW4gaW50ZWdlciAoaS5lLiwgcm91bmQodmFsdWUpID09IHZhbHVlKS4KLSAgICAgIHRyeSB7Ci0gICAgICAgIEJpZ0RlY2ltYWwgZGVjaW1hbFZhbHVlID0gbmV3IEJpZ0RlY2ltYWwoanNvbi5nZXRBc1N0cmluZygpKTsKLSAgICAgICAgQmlnSW50ZWdlciB2YWx1ZSA9IGRlY2ltYWxWYWx1ZS50b0JpZ0ludGVnZXJFeGFjdCgpOwotICAgICAgICBpZiAodmFsdWUuc2lnbnVtKCkgPCAwIHx8IHZhbHVlLmNvbXBhcmVUbyhuZXcgQmlnSW50ZWdlcigiRkZGRkZGRkYiLCAxNikpID4gMCkgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oIk91dCBvZiByYW5nZSB1aW50MzIgdmFsdWU6ICIgKyBqc29uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdmFsdWUuaW50VmFsdWUoKTsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIk5vdCBhbiB1aW50MzIgdmFsdWU6ICIgKyBqc29uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnSW50ZWdlciBNQVhfVUlOVDY0ID0KLSAgICAgICAgbmV3IEJpZ0ludGVnZXIoIkZGRkZGRkZGRkZGRkZGRkYiLCAxNik7Ci0gICAgCi0gICAgcHJpdmF0ZSBsb25nIHBhcnNlVWludDY0KEpzb25FbGVtZW50IGpzb24pCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgQmlnRGVjaW1hbCBkZWNpbWFsVmFsdWUgPSBuZXcgQmlnRGVjaW1hbChqc29uLmdldEFzU3RyaW5nKCkpOwotICAgICAgICBCaWdJbnRlZ2VyIHZhbHVlID0gZGVjaW1hbFZhbHVlLnRvQmlnSW50ZWdlckV4YWN0KCk7Ci0gICAgICAgIGlmICh2YWx1ZS5jb21wYXJlVG8oQmlnSW50ZWdlci5aRVJPKSA8IDAKLSAgICAgICAgICAgIHx8IHZhbHVlLmNvbXBhcmVUbyhNQVhfVUlOVDY0KSA+IDApIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiT3V0IG9mIHJhbmdlIHVpbnQ2NCB2YWx1ZTogIiArIGpzb24pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWx1ZS5sb25nVmFsdWUoKTsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIk5vdCBhbiB1aW50NjQgdmFsdWU6ICIgKyBqc29uKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBib29sZWFuIHBhcnNlQm9vbChKc29uRWxlbWVudCBqc29uKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIGlmIChqc29uLmdldEFzU3RyaW5nKCkuZXF1YWxzKCJ0cnVlIikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoanNvbi5nZXRBc1N0cmluZygpLmVxdWFscygiZmFsc2UiKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJJbnZhbGlkIGJvb2wgdmFsdWU6ICIgKyBqc29uKTsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgZG91YmxlIEVQU0lMT04gPSAxZS02OwotICAgIAotICAgIHByaXZhdGUgZmxvYXQgcGFyc2VGbG9hdChKc29uRWxlbWVudCBqc29uKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIGlmIChqc29uLmdldEFzU3RyaW5nKCkuZXF1YWxzKCJOYU4iKSkgewotICAgICAgICByZXR1cm4gRmxvYXQuTmFOOwotICAgICAgfSBlbHNlIGlmIChqc29uLmdldEFzU3RyaW5nKCkuZXF1YWxzKCJJbmZpbml0eSIpKSB7Ci0gICAgICAgIHJldHVybiBGbG9hdC5QT1NJVElWRV9JTkZJTklUWTsKLSAgICAgIH0gZWxzZSBpZiAoanNvbi5nZXRBc1N0cmluZygpLmVxdWFscygiLUluZmluaXR5IikpIHsKLSAgICAgICAgcmV0dXJuIEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZOwotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgdXNlIEZsb2F0LnBhcnNlRmxvYXQoKSBoZXJlIGJlY2F1c2UgdGhhdCBmdW5jdGlvbiBzaW1wbHkKLSAgICAgICAgLy8gYWNjZXB0cyBhbGwgZG91YmxlIHZhbHVlcy4gSGVyZSB3ZSBwYXJzZSB0aGUgdmFsdWUgaW50byBhIERvdWJsZQotICAgICAgICAvLyBhbmQgZG8gZXhwbGljaXQgcmFuZ2UgY2hlY2sgb24gaXQuCi0gICAgICAgIGRvdWJsZSB2YWx1ZSA9IERvdWJsZS5wYXJzZURvdWJsZShqc29uLmdldEFzU3RyaW5nKCkpOwotICAgICAgICAvLyBXaGVuIGEgZmxvYXQgdmFsdWUgaXMgcHJpbnRlZCwgdGhlIHByaW50ZWQgdmFsdWUgbWlnaHQgYmUgYSBsaXR0bGUKLSAgICAgICAgLy8gbGFyZ2VyIG9yIHNtYWxsZXIgZHVlIHRvIHByZWNpc2lvbiBsb3NzLiBIZXJlIHdlIG5lZWQgdG8gYWRkIGEgYml0Ci0gICAgICAgIC8vIG9mIHRvbGVyYW5jZSB3aGVuIGNoZWNraW5nIHdoZXRoZXIgdGhlIGZsb2F0IHZhbHVlIGlzIGluIHJhbmdlLgotICAgICAgICBpZiAodmFsdWUgPiBGbG9hdC5NQVhfVkFMVUUgKiAoMS4wICsgRVBTSUxPTikKLSAgICAgICAgICAgIHx8IHZhbHVlIDwgLUZsb2F0Lk1BWF9WQUxVRSAqICgxLjAgKyBFUFNJTE9OKSkgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJPdXQgb2YgcmFuZ2UgZmxvYXQgdmFsdWU6ICIgKyBqc29uKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKGZsb2F0KSB2YWx1ZTsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCJOb3QgYSBmbG9hdCB2YWx1ZTogIiArIGpzb24pOwotICAgICAgfQotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBCaWdEZWNpbWFsIE1PUkVfVEhBTl9PTkUgPSBuZXcgQmlnRGVjaW1hbCgKLSAgICAgICAgU3RyaW5nLnZhbHVlT2YoMS4wICsgRVBTSUxPTikpOwotICAgIC8vIFdoZW4gYSBmbG9hdCB2YWx1ZSBpcyBwcmludGVkLCB0aGUgcHJpbnRlZCB2YWx1ZSBtaWdodCBiZSBhIGxpdHRsZQotICAgIC8vIGxhcmdlciBvciBzbWFsbGVyIGR1ZSB0byBwcmVjaXNpb24gbG9zcy4gSGVyZSB3ZSBuZWVkIHRvIGFkZCBhIGJpdAotICAgIC8vIG9mIHRvbGVyYW5jZSB3aGVuIGNoZWNraW5nIHdoZXRoZXIgdGhlIGZsb2F0IHZhbHVlIGlzIGluIHJhbmdlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0RlY2ltYWwgTUFYX0RPVUJMRSA9IG5ldyBCaWdEZWNpbWFsKAotICAgICAgICBTdHJpbmcudmFsdWVPZihEb3VibGUuTUFYX1ZBTFVFKSkubXVsdGlwbHkoTU9SRV9USEFOX09ORSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQmlnRGVjaW1hbCBNSU5fRE9VQkxFID0gbmV3IEJpZ0RlY2ltYWwoCi0gICAgICAgIFN0cmluZy52YWx1ZU9mKC1Eb3VibGUuTUFYX1ZBTFVFKSkubXVsdGlwbHkoTU9SRV9USEFOX09ORSk7Ci0gICAgCi0gICAgcHJpdmF0ZSBkb3VibGUgcGFyc2VEb3VibGUoSnNvbkVsZW1lbnQganNvbikKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICBpZiAoanNvbi5nZXRBc1N0cmluZygpLmVxdWFscygiTmFOIikpIHsKLSAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47Ci0gICAgICB9IGVsc2UgaWYgKGpzb24uZ2V0QXNTdHJpbmcoKS5lcXVhbHMoIkluZmluaXR5IikpIHsKLSAgICAgICAgcmV0dXJuIERvdWJsZS5QT1NJVElWRV9JTkZJTklUWTsKLSAgICAgIH0gZWxzZSBpZiAoanNvbi5nZXRBc1N0cmluZygpLmVxdWFscygiLUluZmluaXR5IikpIHsKLSAgICAgICAgcmV0dXJuIERvdWJsZS5ORUdBVElWRV9JTkZJTklUWTsKLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIC8vIFdlIGRvbid0IHVzZSBEb3VibGUucGFyc2VEb3VibGUoKSBoZXJlIGJlY2F1c2UgdGhhdCBmdW5jdGlvbiBzaW1wbHkKLSAgICAgICAgLy8gYWNjZXB0cyBhbGwgdmFsdWVzLiBIZXJlIHdlIHBhcnNlIHRoZSB2YWx1ZSBpbnRvIGEgQmlnRGVjaW1hbCBhbmQgZG8KLSAgICAgICAgLy8gZXhwbGljaXQgcmFuZ2UgY2hlY2sgb24gaXQuCi0gICAgICAgIEJpZ0RlY2ltYWwgdmFsdWUgPSBuZXcgQmlnRGVjaW1hbChqc29uLmdldEFzU3RyaW5nKCkpOwotICAgICAgICBpZiAodmFsdWUuY29tcGFyZVRvKE1BWF9ET1VCTEUpID4gMAotICAgICAgICAgICAgfHwgdmFsdWUuY29tcGFyZVRvKE1JTl9ET1VCTEUpIDwgMCkgewotICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJPdXQgb2YgcmFuZ2UgZG91YmxlIHZhbHVlOiAiICsganNvbik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHZhbHVlLmRvdWJsZVZhbHVlKCk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfSBjYXRjaCAoRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICAgICAgICJOb3QgYW4gZG91YmxlIHZhbHVlOiAiICsganNvbik7Ci0gICAgICB9Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgU3RyaW5nIHBhcnNlU3RyaW5nKEpzb25FbGVtZW50IGpzb24pIHsKLSAgICAgIHJldHVybiBqc29uLmdldEFzU3RyaW5nKCk7Ci0gICAgfQotICAgIAotICAgIHByaXZhdGUgQnl0ZVN0cmluZyBwYXJzZUJ5dGVzKEpzb25FbGVtZW50IGpzb24pIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgU3RyaW5nIGVuY29kZWQgPSBqc29uLmdldEFzU3RyaW5nKCk7Ci0gICAgICBpZiAoZW5jb2RlZC5sZW5ndGgoKSAlIDQgIT0gMCkgewotICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgIkJ5dGVzIGZpZWxkIGlzIG5vdCBlbmNvZGVkIGluIHN0YW5kYXJkIEJBU0U2NCB3aXRoIHBhZGRpbmdzOiAiICsgZW5jb2RlZCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbSgKLSAgICAgICAgICBCYXNlRW5jb2RpbmcuYmFzZTY0KCkuZGVjb2RlKGpzb24uZ2V0QXNTdHJpbmcoKSkpOwotICAgIH0KLSAgICAKLSAgICBwcml2YXRlIEVudW1WYWx1ZURlc2NyaXB0b3IgcGFyc2VFbnVtKEVudW1EZXNjcmlwdG9yIGVudW1EZXNjcmlwdG9yLAotICAgICAgICBKc29uRWxlbWVudCBqc29uKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIFN0cmluZyB2YWx1ZSA9IGpzb24uZ2V0QXNTdHJpbmcoKTsKLSAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3IgcmVzdWx0ID0gZW51bURlc2NyaXB0b3IuZmluZFZhbHVlQnlOYW1lKHZhbHVlKTsKLSAgICAgIGlmIChyZXN1bHQgPT0gbnVsbCkgewotICAgICAgICAvLyBUcnkgdG8gaW50ZXJwcmV0IHRoZSB2YWx1ZSBhcyBhIG51bWJlci4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICBpbnQgbnVtZXJpY1ZhbHVlID0gcGFyc2VJbnQzMihqc29uKTsKLSAgICAgICAgICBpZiAoZW51bURlc2NyaXB0b3IuZ2V0RmlsZSgpLmdldFN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yLlN5bnRheC5QUk9UTzMpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGVudW1EZXNjcmlwdG9yLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24obnVtZXJpY1ZhbHVlKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVzdWx0ID0gZW51bURlc2NyaXB0b3IuZmluZFZhbHVlQnlOdW1iZXIobnVtZXJpY1ZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgLy8gRmFsbCB0aHJvdWdoLiBUaGlzIGV4Y2VwdGlvbiBpcyBhYm91dCBpbnZhbGlkIGludDMyIHZhbHVlIHdlIGdldCBmcm9tIHBhcnNlSW50MzIoKSBidXQKLSAgICAgICAgICAvLyB0aGF0J3Mgbm90IHRoZSBleGNlcHRpb24gd2Ugd2FudCB0aGUgdXNlciB0byBzZWUuIFNpbmNlIHJlc3VsdCA9PSBudWxsLCB3ZSB3aWxsIHRocm93Ci0gICAgICAgICAgLy8gYW4gZXhjZXB0aW9uIGxhdGVyLgotICAgICAgICB9Ci0gICAgICAgIAotICAgICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiSW52YWxpZCBlbnVtIHZhbHVlOiAiICsgdmFsdWUgKyAiIGZvciBlbnVtIHR5cGU6ICIKLSAgICAgICAgICAgICAgKyBlbnVtRGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgCi0gICAgcHJpdmF0ZSBPYmplY3QgcGFyc2VGaWVsZFZhbHVlKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgSnNvbkVsZW1lbnQganNvbiwKLSAgICAgICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgaWYgKGpzb24gaW5zdGFuY2VvZiBKc29uTnVsbCkgewotICAgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRQotICAgICAgICAgICAgJiYgZmllbGQuZ2V0TWVzc2FnZVR5cGUoKS5nZXRGdWxsTmFtZSgpLmVxdWFscygKLSAgICAgICAgICAgICAgICAgICBWYWx1ZS5nZXREZXNjcmlwdG9yKCkuZ2V0RnVsbE5hbWUoKSkpIHsKLSAgICAgICAgICAvLyBGb3IgZXZlcnkgb3RoZXIgdHlwZSwgIm51bGwiIG1lYW5zIGFic2VuY2UsIGJ1dCBmb3IgdGhlIHNwZWNpYWwKLSAgICAgICAgICAvLyBWYWx1ZSBtZXNzYWdlLCBpdCBtZWFucyB0aGUgIm51bGxfdmFsdWUiIGZpZWxkIGhhcyBiZWVuIHNldC4KLSAgICAgICAgICBWYWx1ZSB2YWx1ZSA9IFZhbHVlLm5ld0J1aWxkZXIoKS5zZXROdWxsVmFsdWVWYWx1ZSgwKS5idWlsZCgpOwotICAgICAgICAgIHJldHVybiBidWlsZGVyLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZCkubWVyZ2VGcm9tKAotICAgICAgICAgICAgICB2YWx1ZS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgIGNhc2UgU0lOVDMyOgotICAgICAgICBjYXNlIFNGSVhFRDMyOgotICAgICAgICAgIHJldHVybiBwYXJzZUludDMyKGpzb24pOwotCi0gICAgICAgIGNhc2UgSU5UNjQ6Ci0gICAgICAgIGNhc2UgU0lOVDY0OgotICAgICAgICBjYXNlIFNGSVhFRDY0OgotICAgICAgICAgIHJldHVybiBwYXJzZUludDY0KGpzb24pOwotCi0gICAgICAgIGNhc2UgQk9PTDoKLSAgICAgICAgICByZXR1cm4gcGFyc2VCb29sKGpzb24pOwotCi0gICAgICAgIGNhc2UgRkxPQVQ6Ci0gICAgICAgICAgcmV0dXJuIHBhcnNlRmxvYXQoanNvbik7Ci0gICAgICAgICAgCi0gICAgICAgIGNhc2UgRE9VQkxFOgotICAgICAgICAgIHJldHVybiBwYXJzZURvdWJsZShqc29uKTsKLQotICAgICAgICBjYXNlIFVJTlQzMjoKLSAgICAgICAgY2FzZSBGSVhFRDMyOgotICAgICAgICAgIHJldHVybiBwYXJzZVVpbnQzMihqc29uKTsKLQotICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgY2FzZSBGSVhFRDY0OgotICAgICAgICAgIHJldHVybiBwYXJzZVVpbnQ2NChqc29uKTsKLQotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICByZXR1cm4gcGFyc2VTdHJpbmcoanNvbik7Ci0KLSAgICAgICAgY2FzZSBCWVRFUzoKLSAgICAgICAgICByZXR1cm4gcGFyc2VCeXRlcyhqc29uKTsKLQotICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgcmV0dXJuIHBhcnNlRW51bShmaWVsZC5nZXRFbnVtVHlwZSgpLCBqc29uKTsKLQotICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgIGNhc2UgR1JPVVA6Ci0gICAgICAgICAgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBidWlsZGVyLm5ld0J1aWxkZXJGb3JGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgbWVyZ2UoanNvbiwgc3ViQnVpbGRlcik7Ci0gICAgICAgICAgcmV0dXJuIHN1YkJ1aWxkZXIuYnVpbGQoKTsKLSAgICAgICAgICAKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiSW52YWxpZCBmaWVsZCB0eXBlOiAiICsgZmllbGQuZ2V0VHlwZSgpKTsKLSAgICAgIH0gCi0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvVGltZVV0aWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9UaW1lVXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMDMzMTgyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9UaW1lVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTQ5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYudXRpbDsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRHVyYXRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXA7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS50ZXh0LlNpbXBsZURhdGVGb3JtYXQ7Ci1pbXBvcnQgamF2YS51dGlsLkRhdGU7Ci1pbXBvcnQgamF2YS51dGlsLkdyZWdvcmlhbkNhbGVuZGFyOwotaW1wb3J0IGphdmEudXRpbC5UaW1lWm9uZTsKLQotLyoqCi0gKiBVdGlsaXRpZXMgdG8gaGVscCBjcmVhdGUvbWFuaXB1bGF0ZSBUaW1lc3RhbXAvRHVyYXRpb24KLSAqLwotcHVibGljIGNsYXNzIFRpbWVVdGlsIHsKLSAgLy8gVGltZXN0YW1wIGZvciAiMDAwMS0wMS0wMVQwMDowMDowMFoiCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBUSU1FU1RBTVBfU0VDT05EU19NSU4gPSAtNjIxMzU1OTY4MDBMOwotCi0gIC8vIFRpbWVzdGFtcCBmb3IgIjk5OTktMTItMzFUMjM6NTk6NTlaIgotICBwdWJsaWMgc3RhdGljIGZpbmFsIGxvbmcgVElNRVNUQU1QX1NFQ09ORFNfTUFYID0gMjUzNDAyMzAwNzk5TDsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIERVUkFUSU9OX1NFQ09ORFNfTUlOID0gLTMxNTU3NjAwMDAwMEw7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgbG9uZyBEVVJBVElPTl9TRUNPTkRTX01BWCA9IDMxNTU3NjAwMDAwMEw7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBOQU5PU19QRVJfU0VDT05EID0gMTAwMDAwMDAwMDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBOQU5PU19QRVJfTUlMTElTRUNPTkQgPSAxMDAwMDAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE5BTk9TX1BFUl9NSUNST1NFQ09ORCA9IDEwMDA7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgTUlMTElTX1BFUl9TRUNPTkQgPSAxMDAwOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIE1JQ1JPU19QRVJfU0VDT05EID0gMTAwMDAwMDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUaHJlYWRMb2NhbDxTaW1wbGVEYXRlRm9ybWF0PiB0aW1lc3RhbXBGb3JtYXQgPQotICAgICAgbmV3IFRocmVhZExvY2FsPFNpbXBsZURhdGVGb3JtYXQ+KCkgewotICAgICAgICBwcm90ZWN0ZWQgU2ltcGxlRGF0ZUZvcm1hdCBpbml0aWFsVmFsdWUoKSB7Ci0gICAgICAgICAgcmV0dXJuIGNyZWF0ZVRpbWVzdGFtcEZvcm1hdCgpOwotICAgICAgICB9Ci0gICAgICB9OwotCi0gIHByaXZhdGUgc3RhdGljIFNpbXBsZURhdGVGb3JtYXQgY3JlYXRlVGltZXN0YW1wRm9ybWF0KCkgewotICAgIFNpbXBsZURhdGVGb3JtYXQgc2RmID0gbmV3IFNpbXBsZURhdGVGb3JtYXQoInl5eXktTU0tZGQnVCdISDptbTpzcyIpOwotICAgIEdyZWdvcmlhbkNhbGVuZGFyIGNhbGVuZGFyID0KLSAgICAgIG5ldyBHcmVnb3JpYW5DYWxlbmRhcihUaW1lWm9uZS5nZXRUaW1lWm9uZSgiVVRDIikpOwotICAgIC8vIFdlIHVzZSBQcm9sZXB0aWMgR3JlZ29yaWFuIENhbGVuZGFyIChpLmUuLCBHcmVnb3JpYW4gY2FsZW5kYXIgZXh0ZW5kcwotICAgIC8vIGJhY2t3YXJkcyB0byB5ZWFyIG9uZSkgZm9yIHRpbWVzdGFtcCBmb3JtYXRpbmcuCi0gICAgY2FsZW5kYXIuc2V0R3JlZ29yaWFuQ2hhbmdlKG5ldyBEYXRlKExvbmcuTUlOX1ZBTFVFKSk7Ci0gICAgc2RmLnNldENhbGVuZGFyKGNhbGVuZGFyKTsKLSAgICByZXR1cm4gc2RmOwotICB9Ci0KLSAgcHJpdmF0ZSBUaW1lVXRpbCgpIHt9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgVGltZXN0YW1wIHRvIFJGQyAzMzM5IGRhdGUgc3RyaW5nIGZvcm1hdC4gVGhlIG91dHB1dCB3aWxsIGFsd2F5cwotICAgKiBiZSBaLW5vcm1hbGl6ZWQgYW5kIHVzZXMgMywgNiBvciA5IGZyYWN0aW9uYWwgZGlnaXRzIGFzIHJlcXVpcmVkIHRvCi0gICAqIHJlcHJlc2VudCB0aGUgZXhhY3QgdmFsdWUuIE5vdGUgdGhhdCBUaW1lc3RhbXAgY2FuIG9ubHkgcmVwcmVzZW50IHRpbWUKLSAgICogZnJvbSAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVouIFNlZQotICAgKiBodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQKLSAgICoKLSAgICogPHA+RXhhbXBsZSBvZiBnZW5lcmF0ZWQgZm9ybWF0OiAiMTk3Mi0wMS0wMVQxMDowMDoyMC4wMjFaIgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIHRpbWVzdGFtcC4KLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYgdGhlIGdpdmVuIHRpbWVzdGFtcCBpcyBub3QgaW4gdGhlCi0gICAqICAgICAgICAgdmFsaWQgcmFuZ2UuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyB0b1N0cmluZyhUaW1lc3RhbXAgdGltZXN0YW1wKQotICAgIHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gewotICAgIFN0cmluZ0J1aWxkZXIgcmVzdWx0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAvLyBGb3JtYXQgdGhlIHNlY29uZHMgcGFydC4KLSAgICBpZiAodGltZXN0YW1wLmdldFNlY29uZHMoKSA8IFRJTUVTVEFNUF9TRUNPTkRTX01JTgotICAgICAgICB8fCB0aW1lc3RhbXAuZ2V0U2Vjb25kcygpID4gVElNRVNUQU1QX1NFQ09ORFNfTUFYKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJUaW1lc3RhbXAgaXMgb3V0IG9mIHJhbmdlLiIpOwotICAgIH0KLSAgICBEYXRlIGRhdGUgPSBuZXcgRGF0ZSh0aW1lc3RhbXAuZ2V0U2Vjb25kcygpICogTUlMTElTX1BFUl9TRUNPTkQpOwotICAgIHJlc3VsdC5hcHBlbmQodGltZXN0YW1wRm9ybWF0LmdldCgpLmZvcm1hdChkYXRlKSk7Ci0gICAgLy8gRm9ybWF0IHRoZSBuYW5vcyBwYXJ0LgotICAgIGlmICh0aW1lc3RhbXAuZ2V0TmFub3MoKSA8IDAgfHwgdGltZXN0YW1wLmdldE5hbm9zKCkgPj0gTkFOT1NfUEVSX1NFQ09ORCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVGltZXN0YW1wIGhhcyBpbnZhbGlkIG5hbm9zIHZhbHVlLiIpOwotICAgIH0KLSAgICBpZiAodGltZXN0YW1wLmdldE5hbm9zKCkgIT0gMCkgewotICAgICAgcmVzdWx0LmFwcGVuZCgiLiIpOwotICAgICAgcmVzdWx0LmFwcGVuZChmb3JtYXROYW5vcyh0aW1lc3RhbXAuZ2V0TmFub3MoKSkpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJaIik7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGZyb20gUkZDIDMzMzkgZGF0ZSBzdHJpbmcgdG8gVGltZXN0YW1wLiBUaGlzIG1ldGhvZCBhY2NlcHRzIGFsbAotICAgKiBvdXRwdXRzIG9mIHtAbGluayAjdG9TdHJpbmcoVGltZXN0YW1wKX0gYW5kIGl0IGFsc28gYWNjZXB0cyBhbnkgZnJhY3Rpb25hbAotICAgKiBkaWdpdHMgKG9yIG5vbmUpIGFuZCBhbnkgb2Zmc2V0IGFzIGxvbmcgYXMgdGhleSBmaXQgaW50byBuYW5vLXNlY29uZHMKLSAgICogcHJlY2lzaW9uLgotICAgKgotICAgKiA8cD5FeGFtcGxlIG9mIGFjY2VwdGVkIGZvcm1hdDogIjE5NzItMDEtMDFUMTA6MDA6MjAuMDIxLTA1OjAwIgotICAgKgotICAgKiBAcmV0dXJuIEEgVGltZXN0YW1wIHBhcnNlZCBmcm9tIHRoZSBzdHJpbmcuCi0gICAqIEB0aHJvd3MgUGFyc2VFeGNlcHRpb24gaWYgcGFyc2luZyBmYWlscy4KLSAgICovCi0KLSAgcHVibGljIHN0YXRpYyBUaW1lc3RhbXAgcGFyc2VUaW1lc3RhbXAoU3RyaW5nIHZhbHVlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIGludCBkYXlPZmZzZXQgPSB2YWx1ZS5pbmRleE9mKCdUJyk7Ci0gICAgaWYgKGRheU9mZnNldCA9PSAtMSkgewotICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHRpbWVzdGFtcDogaW52YWxpZCB0aW1lc3RhbXAgXCIiICsgdmFsdWUgKyAiXCIiLCAwKTsKLSAgICB9Ci0gICAgaW50IHRpbWV6b25lT2Zmc2V0UG9zaXRpb24gPSB2YWx1ZS5pbmRleE9mKCdaJywgZGF5T2Zmc2V0KTsKLSAgICBpZiAodGltZXpvbmVPZmZzZXRQb3NpdGlvbiA9PSAtMSkgewotICAgICAgdGltZXpvbmVPZmZzZXRQb3NpdGlvbiA9IHZhbHVlLmluZGV4T2YoJysnLCBkYXlPZmZzZXQpOwotICAgIH0KLSAgICBpZiAodGltZXpvbmVPZmZzZXRQb3NpdGlvbiA9PSAtMSkgewotICAgICAgdGltZXpvbmVPZmZzZXRQb3NpdGlvbiA9IHZhbHVlLmluZGV4T2YoJy0nLCBkYXlPZmZzZXQpOwotICAgIH0KLSAgICBpZiAodGltZXpvbmVPZmZzZXRQb3NpdGlvbiA9PSAtMSkgewotICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHRpbWVzdGFtcDogbWlzc2luZyB2YWxpZCB0aW1lem9uZSBvZmZzZXQuIiwgMCk7Ci0gICAgfQotICAgIC8vIFBhcnNlIHNlY29uZHMgYW5kIG5hbm9zLgotICAgIFN0cmluZyB0aW1lVmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdGltZXpvbmVPZmZzZXRQb3NpdGlvbik7Ci0gICAgU3RyaW5nIHNlY29uZFZhbHVlID0gdGltZVZhbHVlOwotICAgIFN0cmluZyBuYW5vVmFsdWUgPSAiIjsKLSAgICBpbnQgcG9pbnRQb3NpdGlvbiA9IHRpbWVWYWx1ZS5pbmRleE9mKCcuJyk7Ci0gICAgaWYgKHBvaW50UG9zaXRpb24gIT0gLTEpIHsKLSAgICAgIHNlY29uZFZhbHVlID0gdGltZVZhbHVlLnN1YnN0cmluZygwLCBwb2ludFBvc2l0aW9uKTsKLSAgICAgIG5hbm9WYWx1ZSA9IHRpbWVWYWx1ZS5zdWJzdHJpbmcocG9pbnRQb3NpdGlvbiArIDEpOwotICAgIH0KLSAgICBEYXRlIGRhdGUgPSB0aW1lc3RhbXBGb3JtYXQuZ2V0KCkucGFyc2Uoc2Vjb25kVmFsdWUpOwotICAgIGxvbmcgc2Vjb25kcyA9IGRhdGUuZ2V0VGltZSgpIC8gTUlMTElTX1BFUl9TRUNPTkQ7Ci0gICAgaW50IG5hbm9zID0gbmFub1ZhbHVlLmlzRW1wdHkoKSA/IDAgOiBwYXJzZU5hbm9zKG5hbm9WYWx1ZSk7Ci0gICAgLy8gUGFyc2UgdGltZXpvbmUgb2Zmc2V0cy4KLSAgICBpZiAodmFsdWUuY2hhckF0KHRpbWV6b25lT2Zmc2V0UG9zaXRpb24pID09ICdaJykgewotICAgICAgaWYgKHZhbHVlLmxlbmd0aCgpICE9IHRpbWV6b25lT2Zmc2V0UG9zaXRpb24gKyAxKSB7Ci0gICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHRpbWVzdGFtcDogaW52YWxpZCB0cmFpbGluZyBkYXRhIFwiIgotICAgICAgICAgICsgdmFsdWUuc3Vic3RyaW5nKHRpbWV6b25lT2Zmc2V0UG9zaXRpb24pICsgIlwiIiwgMCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIFN0cmluZyBvZmZzZXRWYWx1ZSA9IHZhbHVlLnN1YnN0cmluZyh0aW1lem9uZU9mZnNldFBvc2l0aW9uICsgMSk7Ci0gICAgICBsb25nIG9mZnNldCA9IHBhcnNlVGltZXpvbmVPZmZzZXQob2Zmc2V0VmFsdWUpOwotICAgICAgaWYgKHZhbHVlLmNoYXJBdCh0aW1lem9uZU9mZnNldFBvc2l0aW9uKSA9PSAnKycpIHsKLSAgICAgICAgc2Vjb25kcyAtPSBvZmZzZXQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzZWNvbmRzICs9IG9mZnNldDsKLSAgICAgIH0KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBub3JtYWxpemVkVGltZXN0YW1wKHNlY29uZHMsIG5hbm9zKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHRpbWVzdG1hcDogdGltZXN0YW1wIGlzIG91dCBvZiByYW5nZS4iLCAwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ29udmVydCBEdXJhdGlvbiB0byBzdHJpbmcgZm9ybWF0LiBUaGUgc3RyaW5nIGZvcm1hdCB3aWxsIGNvbnRhaW5zIDMsIDYsCi0gICAqIG9yIDkgZnJhY3Rpb25hbCBkaWdpdHMgZGVwZW5kaW5nIG9uIHRoZSBwcmVjaXNpb24gcmVxdWlyZWQgdG8gcmVwcmVzZW50Ci0gICAqIHRoZSBleGFjdCBEdXJhdGlvbiB2YWx1ZS4gRm9yIGV4YW1wbGU6ICIxcyIsICIxLjAxMHMiLCAiMS4wMDAwMDAxMDBzIiwKLSAgICogIi0zLjEwMHMiIFRoZSByYW5nZSB0aGF0IGNhbiBiZSByZXByZXNlbnRlZCBieSBEdXJhdGlvbiBpcyBmcm9tCi0gICAqIC0zMTUsNTc2LDAwMCwwMDAgdG8gKzMxNSw1NzYsMDAwLDAwMCBpbmNsdXNpdmUgKGluIHNlY29uZHMpLgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGR1cmF0aW9uLgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBpZiB0aGUgZ2l2ZW4gZHVyYXRpb24gaXMgbm90IGluIHRoZSB2YWxpZAotICAgKiAgICAgICAgIHJhbmdlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgdG9TdHJpbmcoRHVyYXRpb24gZHVyYXRpb24pCi0gICAgdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiB7Ci0gICAgaWYgKGR1cmF0aW9uLmdldFNlY29uZHMoKSA8IERVUkFUSU9OX1NFQ09ORFNfTUlOCi0gICAgICB8fCBkdXJhdGlvbi5nZXRTZWNvbmRzKCkgPiBEVVJBVElPTl9TRUNPTkRTX01BWCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRHVyYXRpb24gaXMgb3V0IG9mIHZhbGlkIHJhbmdlLiIpOwotICAgIH0KLSAgICBTdHJpbmdCdWlsZGVyIHJlc3VsdCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgbG9uZyBzZWNvbmRzID0gZHVyYXRpb24uZ2V0U2Vjb25kcygpOwotICAgIGludCBuYW5vcyA9IGR1cmF0aW9uLmdldE5hbm9zKCk7Ci0gICAgaWYgKHNlY29uZHMgPCAwIHx8IG5hbm9zIDwgMCkgewotICAgICAgaWYgKHNlY29uZHMgPiAwIHx8IG5hbm9zID4gMCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIkludmFsaWQgZHVyYXRpb246IHNlY29uZHMgdmFsdWUgYW5kIG5hbm9zIHZhbHVlIG11c3QgaGF2ZSB0aGUgc2FtZSIKLSAgICAgICAgICAgICsgInNpZ24uIik7Ci0gICAgICB9Ci0gICAgICByZXN1bHQuYXBwZW5kKCItIik7Ci0gICAgICBzZWNvbmRzID0gLXNlY29uZHM7Ci0gICAgICBuYW5vcyA9IC1uYW5vczsKLSAgICB9Ci0gICAgcmVzdWx0LmFwcGVuZChzZWNvbmRzKTsKLSAgICBpZiAobmFub3MgIT0gMCkgewotICAgICAgcmVzdWx0LmFwcGVuZCgiLiIpOwotICAgICAgcmVzdWx0LmFwcGVuZChmb3JtYXROYW5vcyhuYW5vcykpOwotICAgIH0KLSAgICByZXN1bHQuYXBwZW5kKCJzIik7Ci0gICAgcmV0dXJuIHJlc3VsdC50b1N0cmluZygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGZyb20gYSBzdHJpbmcgdG8gcHJvZHVjZSBhIGR1cmF0aW9uLgotICAgKgotICAgKiBAcmV0dXJuIEEgRHVyYXRpb24gcGFyc2VkIGZyb20gdGhlIHN0cmluZy4KLSAgICogQHRocm93cyBQYXJzZUV4Y2VwdGlvbiBpZiBwYXJzaW5nIGZhaWxzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBwYXJzZUR1cmF0aW9uKFN0cmluZyB2YWx1ZSkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAvLyBNdXN0IGVuZGVkIHdpdGggInMiLgotICAgIGlmICh2YWx1ZS5pc0VtcHR5KCkgfHwgdmFsdWUuY2hhckF0KHZhbHVlLmxlbmd0aCgpIC0gMSkgIT0gJ3MnKSB7Ci0gICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkludmFsaWQgZHVyYXRpb24gc3RyaW5nOiAiICsgdmFsdWUsIDApOwotICAgIH0KLSAgICBib29sZWFuIG5lZ2F0aXZlID0gZmFsc2U7Ci0gICAgaWYgKHZhbHVlLmNoYXJBdCgwKSA9PSAnLScpIHsKLSAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKLSAgICAgIHZhbHVlID0gdmFsdWUuc3Vic3RyaW5nKDEpOwotICAgIH0KLSAgICBTdHJpbmcgc2Vjb25kVmFsdWUgPSB2YWx1ZS5zdWJzdHJpbmcoMCwgdmFsdWUubGVuZ3RoKCkgLSAxKTsKLSAgICBTdHJpbmcgbmFub1ZhbHVlID0gIiI7Ci0gICAgaW50IHBvaW50UG9zaXRpb24gPSBzZWNvbmRWYWx1ZS5pbmRleE9mKCcuJyk7Ci0gICAgaWYgKHBvaW50UG9zaXRpb24gIT0gLTEpIHsKLSAgICAgIG5hbm9WYWx1ZSA9IHNlY29uZFZhbHVlLnN1YnN0cmluZyhwb2ludFBvc2l0aW9uICsgMSk7Ci0gICAgICBzZWNvbmRWYWx1ZSA9IHNlY29uZFZhbHVlLnN1YnN0cmluZygwLCBwb2ludFBvc2l0aW9uKTsKLSAgICB9Ci0gICAgbG9uZyBzZWNvbmRzID0gTG9uZy5wYXJzZUxvbmcoc2Vjb25kVmFsdWUpOwotICAgIGludCBuYW5vcyA9IG5hbm9WYWx1ZS5pc0VtcHR5KCkgPyAwIDogcGFyc2VOYW5vcyhuYW5vVmFsdWUpOwotICAgIGlmIChzZWNvbmRzIDwgMCkgewotICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJJbnZhbGlkIGR1cmF0aW9uIHN0cmluZzogIiArIHZhbHVlLCAwKTsKLSAgICB9Ci0gICAgaWYgKG5lZ2F0aXZlKSB7Ci0gICAgICBzZWNvbmRzID0gLXNlY29uZHM7Ci0gICAgICBuYW5vcyA9IC1uYW5vczsKLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBub3JtYWxpemVkRHVyYXRpb24oc2Vjb25kcywgbmFub3MpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUGFyc2VFeGNlcHRpb24oIkR1cmF0aW9uIHZhbHVlIGlzIG91dCBvZiByYW5nZS4iLCAwKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgVGltZXN0YW1wIGZyb20gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMgZWxhcHNlZCBmcm9tIHRoZSBlcG9jaC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGltZXN0YW1wIGNyZWF0ZVRpbWVzdGFtcEZyb21NaWxsaXMobG9uZyBtaWxsaXNlY29uZHMpIHsKLSAgICByZXR1cm4gbm9ybWFsaXplZFRpbWVzdGFtcChtaWxsaXNlY29uZHMgLyBNSUxMSVNfUEVSX1NFQ09ORCwKLSAgICAgIChpbnQpIChtaWxsaXNlY29uZHMgJSBNSUxMSVNfUEVSX1NFQ09ORCAqIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gdGhlIG51bWJlciBvZiBtaWxsaXNlY29uZHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGNyZWF0ZUR1cmF0aW9uRnJvbU1pbGxpcyhsb25nIG1pbGxpc2Vjb25kcykgewotICAgIHJldHVybiBub3JtYWxpemVkRHVyYXRpb24obWlsbGlzZWNvbmRzIC8gTUlMTElTX1BFUl9TRUNPTkQsCi0gICAgICAoaW50KSAobWlsbGlzZWNvbmRzICUgTUlMTElTX1BFUl9TRUNPTkQgKiBOQU5PU19QRVJfTUlMTElTRUNPTkQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IGEgVGltZXN0YW1wIHRvIHRoZSBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIGVsYXBzZWQgZnJvbSB0aGUgZXBvY2guCi0gICAqCi0gICAqIDxwPlRoZSByZXN1bHQgd2lsbCBiZSByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgbWlsbGlzZWNvbmQuIEUuZy4sIGlmIHRoZQotICAgKiB0aW1lc3RhbXAgcmVwcmVzZW50cyAiMTk2OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwgaXQgd2lsbCBiZSByb3VuZGVkCi0gICAqIHRvIC0xIG1pbGxpc2Vjb25kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIHRvTWlsbGlzKFRpbWVzdGFtcCB0aW1lc3RhbXApIHsKLSAgICByZXR1cm4gdGltZXN0YW1wLmdldFNlY29uZHMoKSAqIE1JTExJU19QRVJfU0VDT05EICsgdGltZXN0YW1wLmdldE5hbm9zKCkKLSAgICAgIC8gTkFOT1NfUEVSX01JTExJU0VDT05EOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYSBEdXJhdGlvbiB0byB0aGUgbnVtYmVyIG9mIG1pbGxpc2Vjb25kcy5UaGUgcmVzdWx0IHdpbGwgYmUKLSAgICogcm91bmRlZCB0b3dhcmRzIDAgdG8gdGhlIG5lYXJlc3QgbWlsbGlzZWNvbmQuIEUuZy4sIGlmIHRoZSBkdXJhdGlvbgotICAgKiByZXByZXNlbnRzIC0xIG5hbm9zZWNvbmQsIGl0IHdpbGwgYmUgcm91bmRlZCB0byAwLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIHRvTWlsbGlzKER1cmF0aW9uIGR1cmF0aW9uKSB7Ci0gICAgcmV0dXJuIGR1cmF0aW9uLmdldFNlY29uZHMoKSAqIE1JTExJU19QRVJfU0VDT05EICsgZHVyYXRpb24uZ2V0TmFub3MoKQotICAgICAgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQ7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgVGltZXN0YW1wIGZyb20gdGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMgZWxhcHNlZCBmcm9tIHRoZSBlcG9jaC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGltZXN0YW1wIGNyZWF0ZVRpbWVzdGFtcEZyb21NaWNyb3MobG9uZyBtaWNyb3NlY29uZHMpIHsKLSAgICByZXR1cm4gbm9ybWFsaXplZFRpbWVzdGFtcChtaWNyb3NlY29uZHMgLyBNSUNST1NfUEVSX1NFQ09ORCwKLSAgICAgIChpbnQpIChtaWNyb3NlY29uZHMgJSBNSUNST1NfUEVSX1NFQ09ORCAqIE5BTk9TX1BFUl9NSUNST1NFQ09ORCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gdGhlIG51bWJlciBvZiBtaWNyb3NlY29uZHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGNyZWF0ZUR1cmF0aW9uRnJvbU1pY3Jvcyhsb25nIG1pY3Jvc2Vjb25kcykgewotICAgIHJldHVybiBub3JtYWxpemVkRHVyYXRpb24obWljcm9zZWNvbmRzIC8gTUlDUk9TX1BFUl9TRUNPTkQsCi0gICAgICAoaW50KSAobWljcm9zZWNvbmRzICUgTUlDUk9TX1BFUl9TRUNPTkQgKiBOQU5PU19QRVJfTUlDUk9TRUNPTkQpKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0IGEgVGltZXN0YW1wIHRvIHRoZSBudW1iZXIgb2YgbWljcm9zZWNvbmRzIGVsYXBzZWQgZnJvbSB0aGUgZXBvY2guCi0gICAqCi0gICAqIDxwPlRoZSByZXN1bHQgd2lsbCBiZSByb3VuZGVkIGRvd24gdG8gdGhlIG5lYXJlc3QgbWljcm9zZWNvbmQuIEUuZy4sIGlmIHRoZQotICAgKiB0aW1lc3RhbXAgcmVwcmVzZW50cyAiMTk2OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwgaXQgd2lsbCBiZSByb3VuZGVkCi0gICAqIHRvIC0xIG1pbGxpc2Vjb25kLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIHRvTWljcm9zKFRpbWVzdGFtcCB0aW1lc3RhbXApIHsKLSAgICByZXR1cm4gdGltZXN0YW1wLmdldFNlY29uZHMoKSAqIE1JQ1JPU19QRVJfU0VDT05EICsgdGltZXN0YW1wLmdldE5hbm9zKCkKLSAgICAgIC8gTkFOT1NfUEVSX01JQ1JPU0VDT05EOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYSBEdXJhdGlvbiB0byB0aGUgbnVtYmVyIG9mIG1pY3Jvc2Vjb25kcy5UaGUgcmVzdWx0IHdpbGwgYmUKLSAgICogcm91bmRlZCB0b3dhcmRzIDAgdG8gdGhlIG5lYXJlc3QgbWljcm9zZWNvbmRzLiBFLmcuLCBpZiB0aGUgZHVyYXRpb24KLSAgICogcmVwcmVzZW50cyAtMSBuYW5vc2Vjb25kLCBpdCB3aWxsIGJlIHJvdW5kZWQgdG8gMC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyB0b01pY3JvcyhEdXJhdGlvbiBkdXJhdGlvbikgewotICAgIHJldHVybiBkdXJhdGlvbi5nZXRTZWNvbmRzKCkgKiBNSUNST1NfUEVSX1NFQ09ORCArIGR1cmF0aW9uLmdldE5hbm9zKCkKLSAgICAgIC8gTkFOT1NfUEVSX01JQ1JPU0VDT05EOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIFRpbWVzdGFtcCBmcm9tIHRoZSBudW1iZXIgb2YgbmFub3NlY29uZHMgZWxhcHNlZCBmcm9tIHRoZSBlcG9jaC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGltZXN0YW1wIGNyZWF0ZVRpbWVzdGFtcEZyb21OYW5vcyhsb25nIG5hbm9zZWNvbmRzKSB7Ci0gICAgcmV0dXJuIG5vcm1hbGl6ZWRUaW1lc3RhbXAobmFub3NlY29uZHMgLyBOQU5PU19QRVJfU0VDT05ELAotICAgICAgKGludCkgKG5hbm9zZWNvbmRzICUgTkFOT1NfUEVSX1NFQ09ORCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIER1cmF0aW9uIGZyb20gdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gY3JlYXRlRHVyYXRpb25Gcm9tTmFub3MobG9uZyBuYW5vc2Vjb25kcykgewotICAgIHJldHVybiBub3JtYWxpemVkRHVyYXRpb24obmFub3NlY29uZHMgLyBOQU5PU19QRVJfU0VDT05ELAotICAgICAgKGludCkgKG5hbm9zZWNvbmRzICUgTkFOT1NfUEVSX1NFQ09ORCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYSBUaW1lc3RhbXAgdG8gdGhlIG51bWJlciBvZiBuYW5vc2Vjb25kcyBlbGFwc2VkIGZyb20gdGhlIGVwb2NoLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIHRvTmFub3MoVGltZXN0YW1wIHRpbWVzdGFtcCkgewotICAgIHJldHVybiB0aW1lc3RhbXAuZ2V0U2Vjb25kcygpICogTkFOT1NfUEVSX1NFQ09ORCArIHRpbWVzdGFtcC5nZXROYW5vcygpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnQgYSBEdXJhdGlvbiB0byB0aGUgbnVtYmVyIG9mIG5hbm9zZWNvbmRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBsb25nIHRvTmFub3MoRHVyYXRpb24gZHVyYXRpb24pIHsKLSAgICByZXR1cm4gZHVyYXRpb24uZ2V0U2Vjb25kcygpICogTkFOT1NfUEVSX1NFQ09ORCArIGR1cmF0aW9uLmdldE5hbm9zKCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBjdXJyZW50IHRpbWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRpbWVzdGFtcCBnZXRDdXJyZW50VGltZSgpIHsKLSAgICByZXR1cm4gY3JlYXRlVGltZXN0YW1wRnJvbU1pbGxpcyhTeXN0ZW0uY3VycmVudFRpbWVNaWxsaXMoKSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBlcG9jaC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGltZXN0YW1wIGdldEVwb2NoKCkgewotICAgIHJldHVybiBUaW1lc3RhbXAuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsY3VsYXRlIHRoZSBkaWZmZXJlbmNlIGJldHdlZW4gdHdvIHRpbWVzdGFtcHMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGRpc3RhbmNlKFRpbWVzdGFtcCBmcm9tLCBUaW1lc3RhbXAgdG8pIHsKLSAgICByZXR1cm4gbm9ybWFsaXplZER1cmF0aW9uKHRvLmdldFNlY29uZHMoKSAtIGZyb20uZ2V0U2Vjb25kcygpLAotICAgICAgdG8uZ2V0TmFub3MoKSAtIGZyb20uZ2V0TmFub3MoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQWRkIGEgZHVyYXRpb24gdG8gYSB0aW1lc3RhbXAuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRpbWVzdGFtcCBhZGQoVGltZXN0YW1wIHN0YXJ0LCBEdXJhdGlvbiBsZW5ndGgpIHsKLSAgICByZXR1cm4gbm9ybWFsaXplZFRpbWVzdGFtcChzdGFydC5nZXRTZWNvbmRzKCkgKyBsZW5ndGguZ2V0U2Vjb25kcygpLAotICAgICAgc3RhcnQuZ2V0TmFub3MoKSArIGxlbmd0aC5nZXROYW5vcygpKTsKLSAgfQotCi0gIC8qKgotICAgKiBTdWJ0cmFjdCBhIGR1cmF0aW9uIGZyb20gYSB0aW1lc3RhbXAuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFRpbWVzdGFtcCBzdWJ0cmFjdChUaW1lc3RhbXAgc3RhcnQsIER1cmF0aW9uIGxlbmd0aCkgewotICAgIHJldHVybiBub3JtYWxpemVkVGltZXN0YW1wKHN0YXJ0LmdldFNlY29uZHMoKSAtIGxlbmd0aC5nZXRTZWNvbmRzKCksCi0gICAgICBzdGFydC5nZXROYW5vcygpIC0gbGVuZ3RoLmdldE5hbm9zKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFkZCB0d28gZHVyYXRpb25zLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBhZGQoRHVyYXRpb24gZDEsIER1cmF0aW9uIGQyKSB7Ci0gICAgcmV0dXJuIG5vcm1hbGl6ZWREdXJhdGlvbihkMS5nZXRTZWNvbmRzKCkgKyBkMi5nZXRTZWNvbmRzKCksCi0gICAgICBkMS5nZXROYW5vcygpICsgZDIuZ2V0TmFub3MoKSk7Ci0gIH0KLQotICAvKioKLSAgICogU3VidHJhY3QgYSBkdXJhdGlvbiBmcm9tIGFub3RoZXIuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIHN1YnRyYWN0KER1cmF0aW9uIGQxLCBEdXJhdGlvbiBkMikgewotICAgIHJldHVybiBub3JtYWxpemVkRHVyYXRpb24oZDEuZ2V0U2Vjb25kcygpIC0gZDIuZ2V0U2Vjb25kcygpLAotICAgICAgZDEuZ2V0TmFub3MoKSAtIGQyLmdldE5hbm9zKCkpOwotICB9Ci0KLSAgLy8gTXVsdGlwbGljYXRpb25zIGFuZCBkaXZpc2lvbnMuCi0KLSAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiBtdWx0aXBseShEdXJhdGlvbiBkdXJhdGlvbiwgZG91YmxlIHRpbWVzKSB7Ci0gICAgZG91YmxlIHJlc3VsdCA9IGR1cmF0aW9uLmdldFNlY29uZHMoKSAqIHRpbWVzICsgZHVyYXRpb24uZ2V0TmFub3MoKSAqIHRpbWVzCi0gICAgICAvIDEwMDAwMDAwMDAuMDsKLSAgICBpZiAocmVzdWx0IDwgTG9uZy5NSU5fVkFMVUUgfHwgcmVzdWx0ID4gTG9uZy5NQVhfVkFMVUUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlJlc3VsdCBpcyBvdXQgb2YgdmFsaWQgcmFuZ2UuIik7Ci0gICAgfQotICAgIGxvbmcgc2Vjb25kcyA9IChsb25nKSByZXN1bHQ7Ci0gICAgaW50IG5hbm9zID0gKGludCkgKChyZXN1bHQgLSBzZWNvbmRzKSAqIDEwMDAwMDAwMDApOwotICAgIHJldHVybiBub3JtYWxpemVkRHVyYXRpb24oc2Vjb25kcywgbmFub3MpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGRpdmlkZShEdXJhdGlvbiBkdXJhdGlvbiwgZG91YmxlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIG11bHRpcGx5KGR1cmF0aW9uLCAxLjAgLyB2YWx1ZSk7Ci0gIH0KLSAgCi0gIHB1YmxpYyBzdGF0aWMgRHVyYXRpb24gbXVsdGlwbHkoRHVyYXRpb24gZHVyYXRpb24sIGxvbmcgdGltZXMpIHsKLSAgICByZXR1cm4gY3JlYXRlRHVyYXRpb25Gcm9tQmlnSW50ZWdlcigKLSAgICAgIHRvQmlnSW50ZWdlcihkdXJhdGlvbikubXVsdGlwbHkodG9CaWdJbnRlZ2VyKHRpbWVzKSkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIER1cmF0aW9uIGRpdmlkZShEdXJhdGlvbiBkdXJhdGlvbiwgbG9uZyB0aW1lcykgewotICAgIHJldHVybiBjcmVhdGVEdXJhdGlvbkZyb21CaWdJbnRlZ2VyKAotICAgICAgdG9CaWdJbnRlZ2VyKGR1cmF0aW9uKS5kaXZpZGUodG9CaWdJbnRlZ2VyKHRpbWVzKSkpOwotICB9Ci0gIAotICBwdWJsaWMgc3RhdGljIGxvbmcgZGl2aWRlKER1cmF0aW9uIGQxLCBEdXJhdGlvbiBkMikgewotICAgIHJldHVybiB0b0JpZ0ludGVnZXIoZDEpLmRpdmlkZSh0b0JpZ0ludGVnZXIoZDIpKS5sb25nVmFsdWUoKTsKLSAgfQotICAKLSAgcHVibGljIHN0YXRpYyBEdXJhdGlvbiByZW1haW5kZXIoRHVyYXRpb24gZDEsIER1cmF0aW9uIGQyKSB7Ci0gICAgcmV0dXJuIGNyZWF0ZUR1cmF0aW9uRnJvbUJpZ0ludGVnZXIoCi0gICAgICB0b0JpZ0ludGVnZXIoZDEpLnJlbWFpbmRlcih0b0JpZ0ludGVnZXIoZDIpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEJpZ0ludGVnZXIgTkFOT1NfUEVSX1NFQ09ORF9CSUdfSU5URUdFUiA9Ci0gICAgICBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihOQU5PU19QRVJfU0VDT05EKSk7Ci0gIAotICBwcml2YXRlIHN0YXRpYyBCaWdJbnRlZ2VyIHRvQmlnSW50ZWdlcihEdXJhdGlvbiBkdXJhdGlvbikgewotICAgIHJldHVybiB0b0JpZ0ludGVnZXIoZHVyYXRpb24uZ2V0U2Vjb25kcygpKQotICAgICAgLm11bHRpcGx5KE5BTk9TX1BFUl9TRUNPTkRfQklHX0lOVEVHRVIpCi0gICAgICAuYWRkKHRvQmlnSW50ZWdlcihkdXJhdGlvbi5nZXROYW5vcygpKSk7Ci0gIH0KLSAgCi0gIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgdG9CaWdJbnRlZ2VyKGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gbmV3IEJpZ0ludGVnZXIoU3RyaW5nLnZhbHVlT2YodmFsdWUpKTsKLSAgfQotICAKLSAgcHJpdmF0ZSBzdGF0aWMgRHVyYXRpb24gY3JlYXRlRHVyYXRpb25Gcm9tQmlnSW50ZWdlcihCaWdJbnRlZ2VyIHZhbHVlKSB7Ci0gICAgbG9uZyBzZWNvbmRzID0gdmFsdWUuZGl2aWRlKAotICAgICAgbmV3IEJpZ0ludGVnZXIoU3RyaW5nLnZhbHVlT2YoTkFOT1NfUEVSX1NFQ09ORCkpKS5sb25nVmFsdWUoKTsKLSAgICBpbnQgbmFub3MgPSB2YWx1ZS5yZW1haW5kZXIoCi0gICAgICBuZXcgQmlnSW50ZWdlcihTdHJpbmcudmFsdWVPZihOQU5PU19QRVJfU0VDT05EKSkpLmludFZhbHVlKCk7Ci0gICAgcmV0dXJuIG5vcm1hbGl6ZWREdXJhdGlvbihzZWNvbmRzLCBuYW5vcyk7Ci0gICAgCi0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBEdXJhdGlvbiBub3JtYWxpemVkRHVyYXRpb24obG9uZyBzZWNvbmRzLCBpbnQgbmFub3MpIHsKLSAgICBpZiAobmFub3MgPD0gLU5BTk9TX1BFUl9TRUNPTkQgfHwgbmFub3MgPj0gTkFOT1NfUEVSX1NFQ09ORCkgewotICAgICAgc2Vjb25kcyArPSBuYW5vcyAvIE5BTk9TX1BFUl9TRUNPTkQ7Ci0gICAgICBuYW5vcyAlPSBOQU5PU19QRVJfU0VDT05EOwotICAgIH0KLSAgICBpZiAoc2Vjb25kcyA+IDAgJiYgbmFub3MgPCAwKSB7Ci0gICAgICBuYW5vcyArPSBOQU5PU19QRVJfU0VDT05EOwotICAgICAgc2Vjb25kcyAtPSAxOwotICAgIH0KLSAgICBpZiAoc2Vjb25kcyA8IDAgJiYgbmFub3MgPiAwKSB7Ci0gICAgICBuYW5vcyAtPSBOQU5PU19QRVJfU0VDT05EOwotICAgICAgc2Vjb25kcyArPSAxOwotICAgIH0KLSAgICBpZiAoc2Vjb25kcyA8IERVUkFUSU9OX1NFQ09ORFNfTUlOIHx8IHNlY29uZHMgPiBEVVJBVElPTl9TRUNPTkRTX01BWCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiRHVyYXRpb24gaXMgb3V0IG9mIHZhbGlkIHJhbmdlLiIpOwotICAgIH0KLSAgICByZXR1cm4gRHVyYXRpb24ubmV3QnVpbGRlcigpLnNldFNlY29uZHMoc2Vjb25kcykuc2V0TmFub3MobmFub3MpLmJ1aWxkKCk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBUaW1lc3RhbXAgbm9ybWFsaXplZFRpbWVzdGFtcChsb25nIHNlY29uZHMsIGludCBuYW5vcykgewotICAgIGlmIChuYW5vcyA8PSAtTkFOT1NfUEVSX1NFQ09ORCB8fCBuYW5vcyA+PSBOQU5PU19QRVJfU0VDT05EKSB7Ci0gICAgICBzZWNvbmRzICs9IG5hbm9zIC8gTkFOT1NfUEVSX1NFQ09ORDsKLSAgICAgIG5hbm9zICU9IE5BTk9TX1BFUl9TRUNPTkQ7Ci0gICAgfQotICAgIGlmIChuYW5vcyA8IDApIHsKLSAgICAgIG5hbm9zICs9IE5BTk9TX1BFUl9TRUNPTkQ7Ci0gICAgICBzZWNvbmRzIC09IDE7Ci0gICAgfQotICAgIGlmIChzZWNvbmRzIDwgVElNRVNUQU1QX1NFQ09ORFNfTUlOIHx8IHNlY29uZHMgPiBUSU1FU1RBTVBfU0VDT05EU19NQVgpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlRpbWVzdGFtcCBpcyBvdXQgb2YgdmFsaWQgcmFuZ2UuIik7Ci0gICAgfQotICAgIHJldHVybiBUaW1lc3RhbXAubmV3QnVpbGRlcigpLnNldFNlY29uZHMoc2Vjb25kcykuc2V0TmFub3MobmFub3MpLmJ1aWxkKCk7Ci0gIH0KLQotICAvKioKLSAgICogRm9ybWF0IHRoZSBuYW5vIHBhcnQgb2YgYSB0aW1lc3RhbXAgb3IgYSBkdXJhdGlvbi4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBmb3JtYXROYW5vcyhpbnQgbmFub3MpIHsKLSAgICBhc3NlcnQgbmFub3MgPj0gMSAmJiBuYW5vcyA8PSA5OTk5OTk5OTk7Ci0gICAgLy8gRGV0ZXJtaW5lIHdoZXRoZXIgdG8gdXNlIDMsIDYsIG9yIDkgZGlnaXRzIGZvciB0aGUgbmFubyBwYXJ0LgotICAgIGlmIChuYW5vcyAlIE5BTk9TX1BFUl9NSUxMSVNFQ09ORCA9PSAwKSB7Ci0gICAgICByZXR1cm4gU3RyaW5nLmZvcm1hdCgiJTEkMDNkIiwgbmFub3MgLyBOQU5PU19QRVJfTUlMTElTRUNPTkQpOwotICAgIH0gZWxzZSBpZiAobmFub3MgJSBOQU5PU19QRVJfTUlDUk9TRUNPTkQgPT0gMCkgewotICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJDA2ZCIsIG5hbm9zIC8gTkFOT1NfUEVSX01JQ1JPU0VDT05EKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIFN0cmluZy5mb3JtYXQoIiUxJDA5ZCIsIG5hbm9zKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgcGFyc2VOYW5vcyhTdHJpbmcgdmFsdWUpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA5OyArK2kpIHsKLSAgICAgIHJlc3VsdCA9IHJlc3VsdCAqIDEwOwotICAgICAgaWYgKGkgPCB2YWx1ZS5sZW5ndGgoKSkgewotICAgICAgICBpZiAodmFsdWUuY2hhckF0KGkpIDwgJzAnIHx8IHZhbHVlLmNoYXJBdChpKSA+ICc5JykgewotICAgICAgICAgIHRocm93IG5ldyBQYXJzZUV4Y2VwdGlvbigiSW52YWxpZCBuYW5vc2VjbmRzLiIsIDApOwotICAgICAgICB9Ci0gICAgICAgIHJlc3VsdCArPSB2YWx1ZS5jaGFyQXQoaSkgLSAnMCc7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBsb25nIHBhcnNlVGltZXpvbmVPZmZzZXQoU3RyaW5nIHZhbHVlKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIGludCBwb3MgPSB2YWx1ZS5pbmRleE9mKCc6Jyk7Ci0gICAgaWYgKHBvcyA9PSAtMSkgewotICAgICAgdGhyb3cgbmV3IFBhcnNlRXhjZXB0aW9uKCJJbnZhbGlkIG9mZnNldCB2YWx1ZTogIiArIHZhbHVlLCAwKTsKLSAgICB9Ci0gICAgU3RyaW5nIGhvdXJzID0gdmFsdWUuc3Vic3RyaW5nKDAsIHBvcyk7Ci0gICAgU3RyaW5nIG1pbnV0ZXMgPSB2YWx1ZS5zdWJzdHJpbmcocG9zICsgMSk7Ci0gICAgcmV0dXJuIChMb25nLnBhcnNlTG9uZyhob3VycykgKiA2MCArIExvbmcucGFyc2VMb25nKG1pbnV0ZXMpKSAqIDYwOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvRmllbGRNYXNrVHJlZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9GaWVsZE1hc2tUcmVlVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZWUwZmM2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9GaWVsZE1hc2tUcmVlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjYxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYudXRpbDsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uTmVzdGVkVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLXB1YmxpYyBjbGFzcyBGaWVsZE1hc2tUcmVlVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHVibGljIHZvaWQgdGVzdEFkZEZpZWxkUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZpZWxkTWFza1RyZWUgdHJlZSA9IG5ldyBGaWVsZE1hc2tUcmVlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIiLCB0cmVlLnRvU3RyaW5nKCkpOwotICAgIHRyZWUuYWRkRmllbGRQYXRoKCIiKTsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIHRyZWUudG9TdHJpbmcoKSk7Ci0gICAgLy8gTmV3IGJyYW5jaC4KLSAgICB0cmVlLmFkZEZpZWxkUGF0aCgiZm9vIik7Ci0gICAgYXNzZXJ0RXF1YWxzKCJmb28iLCB0cmVlLnRvU3RyaW5nKCkpOwotICAgIC8vIFJlZHVuZGFudCBwYXRoLgotICAgIHRyZWUuYWRkRmllbGRQYXRoKCJmb28iKTsKLSAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHRyZWUudG9TdHJpbmcoKSk7Ci0gICAgLy8gTmV3IGJyYW5jaC4KLSAgICB0cmVlLmFkZEZpZWxkUGF0aCgiYmFyLmJheiIpOwotICAgIGFzc2VydEVxdWFscygiYmFyLmJheixmb28iLCB0cmVlLnRvU3RyaW5nKCkpOwotICAgIC8vIFJlZHVuZGFudCBzdWItcGF0aC4KLSAgICB0cmVlLmFkZEZpZWxkUGF0aCgiZm9vLmJhciIpOwotICAgIGFzc2VydEVxdWFscygiYmFyLmJheixmb28iLCB0cmVlLnRvU3RyaW5nKCkpOwotICAgIC8vIE5ldyBicmFuY2ggZnJvbSBhIG5vbi1yb290IG5vZGUuCi0gICAgdHJlZS5hZGRGaWVsZFBhdGgoImJhci5xdXoiKTsKLSAgICBhc3NlcnRFcXVhbHMoImJhci5iYXosYmFyLnF1eixmb28iLCB0cmVlLnRvU3RyaW5nKCkpOwotICAgIC8vIEEgcGF0aCB0aGF0IG1hdGNoZXMgc2V2ZXJhbCBleGlzdGluZyBzdWItcGF0aHMuCi0gICAgdHJlZS5hZGRGaWVsZFBhdGgoImJhciIpOwotICAgIGFzc2VydEVxdWFscygiYmFyLGZvbyIsIHRyZWUudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tRmllbGRNYXNrKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmllbGRNYXNrVHJlZSB0cmVlID0gbmV3IEZpZWxkTWFza1RyZWUoRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJmb28sYmFyLmJheixiYXIucXV6IikpOwotICAgIGFzc2VydEVxdWFscygiYmFyLmJheixiYXIucXV6LGZvbyIsIHRyZWUudG9TdHJpbmcoKSk7Ci0gICAgdHJlZS5tZXJnZUZyb21GaWVsZE1hc2soRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJmb28uYmFyLGJhciIpKTsKLSAgICBhc3NlcnRFcXVhbHMoImJhcixmb28iLCB0cmVlLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEludGVyc2VjdEZpZWxkUGF0aCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZpZWxkTWFza1RyZWUgdHJlZSA9IG5ldyBGaWVsZE1hc2tUcmVlKEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZygiZm9vLGJhci5iYXosYmFyLnF1eiIpKTsKLSAgICBGaWVsZE1hc2tUcmVlIHJlc3VsdCA9IG5ldyBGaWVsZE1hc2tUcmVlKCk7Ci0gICAgLy8gRW1wdHkgcGF0aC4KLSAgICB0cmVlLmludGVyc2VjdEZpZWxkUGF0aCgiIiwgcmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAvLyBOb24tZXhpc3QgcGF0aC4KLSAgICB0cmVlLmludGVyc2VjdEZpZWxkUGF0aCgicXV6IiwgcmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAvLyBTdWItcGF0aCBvZiBhbiBleGlzdGluZyBsZWFmLgotICAgIHRyZWUuaW50ZXJzZWN0RmllbGRQYXRoKCJmb28uYmFyIiwgcmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoImZvby5iYXIiLCByZXN1bHQudG9TdHJpbmcoKSk7Ci0gICAgLy8gTWF0Y2ggYW4gZXhpc3RpbmcgbGVhZiBub2RlLgotICAgIHRyZWUuaW50ZXJzZWN0RmllbGRQYXRoKCJmb28iLCByZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgcmVzdWx0LnRvU3RyaW5nKCkpOwotICAgIC8vIE5vbi1leGlzdCBwYXRoLgotICAgIHRyZWUuaW50ZXJzZWN0RmllbGRQYXRoKCJiYXIuZm9vIiwgcmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoImZvbyIsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgICAvLyBNYXRjaCBhIG5vbi1sZWFmIG5vZGUuCi0gICAgdHJlZS5pbnRlcnNlY3RGaWVsZFBhdGgoImJhciIsIHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJiYXIuYmF6LGJhci5xdXosZm9vIiwgcmVzdWx0LnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIHZhbHVlID0KLSAgICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldE9wdGlvbmFsSW50MzIoMTIzNCkKLSAgICAgICAgICAgIC5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNTY3OCkpCi0gICAgICAgICAgICAuYWRkUmVwZWF0ZWRJbnQzMig0MzIxKQotICAgICAgICAgICAgLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig4NzY1KSkKLSAgICAgICAgICAgIC5idWlsZCgpOwotICAgIE5lc3RlZFRlc3RBbGxUeXBlcyBzb3VyY2UgPQotICAgICAgICBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0UGF5bG9hZCh2YWx1ZSkKLSAgICAgICAgICAgIC5zZXRDaGlsZChOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldFBheWxvYWQodmFsdWUpKQotICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgLy8gTm93IHdlIGhhdmUgYSBtZXNzYWdlIHNvdXJjZSB3aXRoIHRoZSBmb2xsb3dpbmcgc3RydWN0dXJlOgotICAgIC8vICAgW3Jvb3RdIC0rLSBwYXlsb2FkIC0rLSBvcHRpb25hbF9pbnQzMgotICAgIC8vICAgICAgICAgICB8ICAgICAgICAgICArLSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQotICAgIC8vICAgICAgICAgICB8ICAgICAgICAgICArLSByZXBlYXRlZF9pbnQzMgotICAgIC8vICAgICAgICAgICB8ICAgICAgICAgICArLSByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZQotICAgIC8vICAgICAgICAgICB8Ci0gICAgLy8gICAgICAgICAgICstIGNoaWxkIC0tLSBwYXlsb2FkIC0rLSBvcHRpb25hbF9pbnQzMgotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKy0gb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICstIHJlcGVhdGVkX2ludDMyCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArLSByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZQotCi0gICAgRmllbGRNYXNrVXRpbC5NZXJnZU9wdGlvbnMgb3B0aW9ucyA9IG5ldyBGaWVsZE1hc2tVdGlsLk1lcmdlT3B0aW9ucygpOwotCi0gICAgLy8gVGVzdCBtZXJnaW5nIGVhY2ggaW5kaXZpZHVhbCBmaWVsZC4KLSAgICBOZXN0ZWRUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBuZXcgRmllbGRNYXNrVHJlZSgpLmFkZEZpZWxkUGF0aCgicGF5bG9hZC5vcHRpb25hbF9pbnQzMiIpLm1lcmdlKHNvdXJjZSwgYnVpbGRlciwgb3B0aW9ucyk7Ci0gICAgTmVzdGVkVGVzdEFsbFR5cGVzLkJ1aWxkZXIgZXhwZWN0ZWQgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGV4cGVjdGVkLmdldFBheWxvYWRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxMjM0KTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuYnVpbGQoKSwgYnVpbGRlci5idWlsZCgpKTsKLQotICAgIGJ1aWxkZXIgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIG5ldyBGaWVsZE1hc2tUcmVlKCkKLSAgICAgICAgLmFkZEZpZWxkUGF0aCgicGF5bG9hZC5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpCi0gICAgICAgIC5tZXJnZShzb3VyY2UsIGJ1aWxkZXIsIG9wdGlvbnMpOwotICAgIGV4cGVjdGVkID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBleHBlY3RlZC5nZXRQYXlsb2FkQnVpbGRlcigpLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZShOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1Njc4KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmJ1aWxkKCksIGJ1aWxkZXIuYnVpbGQoKSk7Ci0KLSAgICBidWlsZGVyID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBuZXcgRmllbGRNYXNrVHJlZSgpLmFkZEZpZWxkUGF0aCgicGF5bG9hZC5yZXBlYXRlZF9pbnQzMiIpLm1lcmdlKHNvdXJjZSwgYnVpbGRlciwgb3B0aW9ucyk7Ci0gICAgZXhwZWN0ZWQgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGV4cGVjdGVkLmdldFBheWxvYWRCdWlsZGVyKCkuYWRkUmVwZWF0ZWRJbnQzMig0MzIxKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuYnVpbGQoKSwgYnVpbGRlci5idWlsZCgpKTsKLQotICAgIGJ1aWxkZXIgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIG5ldyBGaWVsZE1hc2tUcmVlKCkKLSAgICAgICAgLmFkZEZpZWxkUGF0aCgicGF5bG9hZC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpCi0gICAgICAgIC5tZXJnZShzb3VyY2UsIGJ1aWxkZXIsIG9wdGlvbnMpOwotICAgIGV4cGVjdGVkID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBleHBlY3RlZC5nZXRQYXlsb2FkQnVpbGRlcigpLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig4NzY1KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmJ1aWxkKCksIGJ1aWxkZXIuYnVpbGQoKSk7Ci0KLSAgICBidWlsZGVyID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBuZXcgRmllbGRNYXNrVHJlZSgpCi0gICAgICAgIC5hZGRGaWVsZFBhdGgoImNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIiKQotICAgICAgICAubWVyZ2Uoc291cmNlLCBidWlsZGVyLCBvcHRpb25zKTsKLSAgICBleHBlY3RlZCA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgZXhwZWN0ZWQuZ2V0Q2hpbGRCdWlsZGVyKCkuZ2V0UGF5bG9hZEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEyMzQpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5idWlsZCgpLCBidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgYnVpbGRlciA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgbmV3IEZpZWxkTWFza1RyZWUoKQotICAgICAgICAuYWRkRmllbGRQYXRoKCJjaGlsZC5wYXlsb2FkLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikKLSAgICAgICAgLm1lcmdlKHNvdXJjZSwgYnVpbGRlciwgb3B0aW9ucyk7Ci0gICAgZXhwZWN0ZWQgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGV4cGVjdGVkCi0gICAgICAgIC5nZXRDaGlsZEJ1aWxkZXIoKQotICAgICAgICAuZ2V0UGF5bG9hZEJ1aWxkZXIoKQotICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDU2NzgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuYnVpbGQoKSwgYnVpbGRlci5idWlsZCgpKTsKLQotICAgIGJ1aWxkZXIgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIG5ldyBGaWVsZE1hc2tUcmVlKCkKLSAgICAgICAgLmFkZEZpZWxkUGF0aCgiY2hpbGQucGF5bG9hZC5yZXBlYXRlZF9pbnQzMiIpCi0gICAgICAgIC5tZXJnZShzb3VyY2UsIGJ1aWxkZXIsIG9wdGlvbnMpOwotICAgIGV4cGVjdGVkID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBleHBlY3RlZC5nZXRDaGlsZEJ1aWxkZXIoKS5nZXRQYXlsb2FkQnVpbGRlcigpLmFkZFJlcGVhdGVkSW50MzIoNDMyMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmJ1aWxkKCksIGJ1aWxkZXIuYnVpbGQoKSk7Ci0KLSAgICBidWlsZGVyID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBuZXcgRmllbGRNYXNrVHJlZSgpCi0gICAgICAgIC5hZGRGaWVsZFBhdGgoImNoaWxkLnBheWxvYWQucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKQotICAgICAgICAubWVyZ2Uoc291cmNlLCBidWlsZGVyLCBvcHRpb25zKTsKLSAgICBleHBlY3RlZCA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgZXhwZWN0ZWQKLSAgICAgICAgLmdldENoaWxkQnVpbGRlcigpCi0gICAgICAgIC5nZXRQYXlsb2FkQnVpbGRlcigpCi0gICAgICAgIC5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoODc2NSkpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC5idWlsZCgpLCBidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgLy8gVGVzdCBtZXJnaW5nIGFsbCBmaWVsZHMuCi0gICAgYnVpbGRlciA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgbmV3IEZpZWxkTWFza1RyZWUoKQotICAgICAgICAuYWRkRmllbGRQYXRoKCJjaGlsZCIpCi0gICAgICAgIC5hZGRGaWVsZFBhdGgoInBheWxvYWQiKQotICAgICAgICAubWVyZ2Uoc291cmNlLCBidWlsZGVyLCBvcHRpb25zKTsKLSAgICBhc3NlcnRFcXVhbHMoc291cmNlLCBidWlsZGVyLmJ1aWxkKCkpOwotCi0gICAgLy8gVGVzdCByZXBlYXRlZCBvcHRpb25zLgotICAgIGJ1aWxkZXIgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0UGF5bG9hZEJ1aWxkZXIoKS5hZGRSZXBlYXRlZEludDMyKDEwMDApOwotICAgIG5ldyBGaWVsZE1hc2tUcmVlKCkuYWRkRmllbGRQYXRoKCJwYXlsb2FkLnJlcGVhdGVkX2ludDMyIikubWVyZ2Uoc291cmNlLCBidWlsZGVyLCBvcHRpb25zKTsKLSAgICAvLyBEZWZhdWx0IGJlaGF2aW9yIGlzIHRvIGFwcGVuZCByZXBlYXRlZCBmaWVsZHMuCi0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0UGF5bG9hZCgpLmdldFJlcGVhdGVkSW50MzJDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwMCwgYnVpbGRlci5nZXRQYXlsb2FkKCkuZ2V0UmVwZWF0ZWRJbnQzMigwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQzMjEsIGJ1aWxkZXIuZ2V0UGF5bG9hZCgpLmdldFJlcGVhdGVkSW50MzIoMSkpOwotICAgIC8vIENoYW5nZSB0byByZXBsYWNlIHJlcGVhdGVkIGZpZWxkcy4KLSAgICBvcHRpb25zLnNldFJlcGxhY2VSZXBlYXRlZEZpZWxkcyh0cnVlKTsKLSAgICBuZXcgRmllbGRNYXNrVHJlZSgpLmFkZEZpZWxkUGF0aCgicGF5bG9hZC5yZXBlYXRlZF9pbnQzMiIpLm1lcmdlKHNvdXJjZSwgYnVpbGRlciwgb3B0aW9ucyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0UGF5bG9hZCgpLmdldFJlcGVhdGVkSW50MzJDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDMyMSwgYnVpbGRlci5nZXRQYXlsb2FkKCkuZ2V0UmVwZWF0ZWRJbnQzMigwKSk7Ci0KLSAgICAvLyBUZXN0IG1lc3NhZ2Ugb3B0aW9ucy4KLSAgICBidWlsZGVyID0gTmVzdGVkVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmdldFBheWxvYWRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxMDAwKTsKLSAgICBidWlsZGVyLmdldFBheWxvYWRCdWlsZGVyKCkuc2V0T3B0aW9uYWxVaW50MzIoMjAwMCk7Ci0gICAgbmV3IEZpZWxkTWFza1RyZWUoKS5hZGRGaWVsZFBhdGgoInBheWxvYWQiKS5tZXJnZShzb3VyY2UsIGJ1aWxkZXIsIG9wdGlvbnMpOwotICAgIC8vIERlZmF1bHQgYmVoYXZpb3IgaXMgdG8gbWVyZ2UgbWVzc2FnZSBmaWVsZHMuCi0gICAgYXNzZXJ0RXF1YWxzKDEyMzQsIGJ1aWxkZXIuZ2V0UGF5bG9hZCgpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIwMDAsIGJ1aWxkZXIuZ2V0UGF5bG9hZCgpLmdldE9wdGlvbmFsVWludDMyKCkpOwotCi0gICAgLy8gVGVzdCBtZXJnaW5nIHVuc2V0IG1lc3NhZ2UgZmllbGRzLgotICAgIE5lc3RlZFRlc3RBbGxUeXBlcyBjbGVhcmVkU291cmNlID0gc291cmNlLnRvQnVpbGRlcigpLmNsZWFyUGF5bG9hZCgpLmJ1aWxkKCk7Ci0gICAgYnVpbGRlciA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgbmV3IEZpZWxkTWFza1RyZWUoKS5hZGRGaWVsZFBhdGgoInBheWxvYWQiKS5tZXJnZShjbGVhcmVkU291cmNlLCBidWlsZGVyLCBvcHRpb25zKTsKLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIGJ1aWxkZXIuaGFzUGF5bG9hZCgpKTsKLQotICAgIC8vIENoYW5nZSB0byByZXBsYWNlIG1lc3NhZ2UgZmllbGRzLgotICAgIG9wdGlvbnMuc2V0UmVwbGFjZU1lc3NhZ2VGaWVsZHModHJ1ZSk7Ci0gICAgYnVpbGRlciA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5nZXRQYXlsb2FkQnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTAwMCk7Ci0gICAgYnVpbGRlci5nZXRQYXlsb2FkQnVpbGRlcigpLnNldE9wdGlvbmFsVWludDMyKDIwMDApOwotICAgIG5ldyBGaWVsZE1hc2tUcmVlKCkuYWRkRmllbGRQYXRoKCJwYXlsb2FkIikubWVyZ2Uoc291cmNlLCBidWlsZGVyLCBvcHRpb25zKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgYnVpbGRlci5nZXRQYXlsb2FkKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRQYXlsb2FkKCkuZ2V0T3B0aW9uYWxVaW50MzIoKSk7Ci0KLSAgICAvLyBUZXN0IG1lcmdpbmcgdW5zZXQgbWVzc2FnZSBmaWVsZHMuCi0gICAgYnVpbGRlciA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5nZXRQYXlsb2FkQnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTAwMCk7Ci0gICAgYnVpbGRlci5nZXRQYXlsb2FkQnVpbGRlcigpLnNldE9wdGlvbmFsVWludDMyKDIwMDApOwotICAgIG5ldyBGaWVsZE1hc2tUcmVlKCkuYWRkRmllbGRQYXRoKCJwYXlsb2FkIikubWVyZ2UoY2xlYXJlZFNvdXJjZSwgYnVpbGRlciwgb3B0aW9ucyk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCBidWlsZGVyLmhhc1BheWxvYWQoKSk7Ci0KLSAgICAvLyBUZXN0IG1lcmdpbmcgdW5zZXQgcHJpbWl0aXZlIGZpZWxkcy4KLSAgICBidWlsZGVyID0gc291cmNlLnRvQnVpbGRlcigpOwotICAgIGJ1aWxkZXIuZ2V0UGF5bG9hZEJ1aWxkZXIoKS5jbGVhck9wdGlvbmFsSW50MzIoKTsKLSAgICBOZXN0ZWRUZXN0QWxsVHlwZXMgc291cmNlV2l0aFBheWxvYWRJbnQzMlVuc2V0ID0gYnVpbGRlci5idWlsZCgpOwotICAgIGJ1aWxkZXIgPSBzb3VyY2UudG9CdWlsZGVyKCk7Ci0gICAgbmV3IEZpZWxkTWFza1RyZWUoKQotICAgICAgICAuYWRkRmllbGRQYXRoKCJwYXlsb2FkLm9wdGlvbmFsX2ludDMyIikKLSAgICAgICAgLm1lcmdlKHNvdXJjZVdpdGhQYXlsb2FkSW50MzJVbnNldCwgYnVpbGRlciwgb3B0aW9ucyk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ1aWxkZXIuZ2V0UGF5bG9hZCgpLmhhc09wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuZ2V0UGF5bG9hZCgpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0KLSAgICAvLyBDaGFuZ2UgdG8gY2xlYXIgdW5zZXQgcHJpbWl0aXZlIGZpZWxkcy4KLSAgICBvcHRpb25zLnNldFJlcGxhY2VQcmltaXRpdmVGaWVsZHModHJ1ZSk7Ci0gICAgYnVpbGRlciA9IHNvdXJjZS50b0J1aWxkZXIoKTsKLSAgICBuZXcgRmllbGRNYXNrVHJlZSgpCi0gICAgICAgIC5hZGRGaWVsZFBhdGgoInBheWxvYWQub3B0aW9uYWxfaW50MzIiKQotICAgICAgICAubWVyZ2Uoc291cmNlV2l0aFBheWxvYWRJbnQzMlVuc2V0LCBidWlsZGVyLCBvcHRpb25zKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgYnVpbGRlci5oYXNQYXlsb2FkKCkpOwotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgYnVpbGRlci5nZXRQYXlsb2FkKCkuaGFzT3B0aW9uYWxJbnQzMigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0ZpZWxkTWFza1V0aWxUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvRmllbGRNYXNrVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTk0ZjdiOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvRmllbGRNYXNrVXRpbFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWw7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzazsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLk5lc3RlZFRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBGaWVsZE1hc2tVdGlsfS4gKi8KLXB1YmxpYyBjbGFzcyBGaWVsZE1hc2tVdGlsVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHVibGljIHZvaWQgdGVzdElzVmFsaWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRUcnVlKEZpZWxkTWFza1V0aWwuaXNWYWxpZChOZXN0ZWRUZXN0QWxsVHlwZXMuY2xhc3MsICJwYXlsb2FkIikpOwotICAgIGFzc2VydEZhbHNlKEZpZWxkTWFza1V0aWwuaXNWYWxpZChOZXN0ZWRUZXN0QWxsVHlwZXMuY2xhc3MsICJub25leGlzdCIpKTsKLSAgICBhc3NlcnRUcnVlKEZpZWxkTWFza1V0aWwuaXNWYWxpZCgKLSAgICAgICAgTmVzdGVkVGVzdEFsbFR5cGVzLmNsYXNzLCAicGF5bG9hZC5vcHRpb25hbF9pbnQzMiIpKTsKLSAgICBhc3NlcnRUcnVlKEZpZWxkTWFza1V0aWwuaXNWYWxpZCgKLSAgICAgICAgTmVzdGVkVGVzdEFsbFR5cGVzLmNsYXNzLCAicGF5bG9hZC5yZXBlYXRlZF9pbnQzMiIpKTsKLSAgICBhc3NlcnRUcnVlKEZpZWxkTWFza1V0aWwuaXNWYWxpZCgKLSAgICAgICAgTmVzdGVkVGVzdEFsbFR5cGVzLmNsYXNzLCAicGF5bG9hZC5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgICBhc3NlcnRUcnVlKEZpZWxkTWFza1V0aWwuaXNWYWxpZCgKLSAgICAgICAgTmVzdGVkVGVzdEFsbFR5cGVzLmNsYXNzLCAicGF5bG9hZC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgICBhc3NlcnRGYWxzZShGaWVsZE1hc2tVdGlsLmlzVmFsaWQoCi0gICAgICAgIE5lc3RlZFRlc3RBbGxUeXBlcy5jbGFzcywgInBheWxvYWQubm9uZXhpc3QiKSk7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZShGaWVsZE1hc2tVdGlsLmlzVmFsaWQoCi0gICAgICAgIE5lc3RlZFRlc3RBbGxUeXBlcy5jbGFzcywgRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJwYXlsb2FkIikpKTsKLSAgICBhc3NlcnRGYWxzZShGaWVsZE1hc2tVdGlsLmlzVmFsaWQoCi0gICAgICAgIE5lc3RlZFRlc3RBbGxUeXBlcy5jbGFzcywgRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJub25leGlzdCIpKSk7Ci0gICAgYXNzZXJ0RmFsc2UoRmllbGRNYXNrVXRpbC5pc1ZhbGlkKAotICAgICAgICBOZXN0ZWRUZXN0QWxsVHlwZXMuY2xhc3MsIEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZygicGF5bG9hZCxub25leGlzdCIpKSk7Ci0gICAgCi0gICAgYXNzZXJ0VHJ1ZShGaWVsZE1hc2tVdGlsLmlzVmFsaWQoTmVzdGVkVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgInBheWxvYWQiKSk7Ci0gICAgYXNzZXJ0RmFsc2UoRmllbGRNYXNrVXRpbC5pc1ZhbGlkKE5lc3RlZFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksICJub25leGlzdCIpKTsKLSAgICAKLSAgICBhc3NlcnRUcnVlKEZpZWxkTWFza1V0aWwuaXNWYWxpZCgKLSAgICAgICAgTmVzdGVkVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJwYXlsb2FkIikpKTsKLSAgICBhc3NlcnRGYWxzZShGaWVsZE1hc2tVdGlsLmlzVmFsaWQoCi0gICAgICAgIE5lc3RlZFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZygibm9uZXhpc3QiKSkpOwotICAgIAotICAgIGFzc2VydFRydWUoRmllbGRNYXNrVXRpbC5pc1ZhbGlkKAotICAgICAgICBOZXN0ZWRUZXN0QWxsVHlwZXMuY2xhc3MsICJwYXlsb2FkLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiIikpOwotICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBjYW5ub3QgaGF2ZSBzdWItcGF0aHMuCi0gICAgYXNzZXJ0RmFsc2UoRmllbGRNYXNrVXRpbC5pc1ZhbGlkKAotICAgICAgICBOZXN0ZWRUZXN0QWxsVHlwZXMuY2xhc3MsICJwYXlsb2FkLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmJiIikpOwotICAgIC8vIE5vbi1tZXNzYWdlIGZpZWxkcyBjYW5ub3QgaGF2ZSBzdWItcGF0aHMuCi0gICAgYXNzZXJ0RmFsc2UoRmllbGRNYXNrVXRpbC5pc1ZhbGlkKAotICAgICAgICBOZXN0ZWRUZXN0QWxsVHlwZXMuY2xhc3MsICJwYXlsb2FkLm9wdGlvbmFsX2ludDMyLmJiIikpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VG9TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoIiIsIEZpZWxkTWFza1V0aWwudG9TdHJpbmcoRmllbGRNYXNrLmdldERlZmF1bHRJbnN0YW5jZSgpKSk7Ci0gICAgRmllbGRNYXNrIG1hc2sgPSBGaWVsZE1hc2submV3QnVpbGRlcigpLmFkZFBhdGhzKCJmb28iKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgRmllbGRNYXNrVXRpbC50b1N0cmluZyhtYXNrKSk7Ci0gICAgbWFzayA9IEZpZWxkTWFzay5uZXdCdWlsZGVyKCkuYWRkUGF0aHMoImZvbyIpLmFkZFBhdGhzKCJiYXIiKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygiZm9vLGJhciIsIEZpZWxkTWFza1V0aWwudG9TdHJpbmcobWFzaykpOwotICAgIAotICAgIC8vIEVtcHR5IGZpZWxkIHBhdGhzIGFyZSBpZ25vcmVkLgotICAgIG1hc2sgPSBGaWVsZE1hc2submV3QnVpbGRlcigpLmFkZFBhdGhzKCIiKS5hZGRQYXRocygiZm9vIikuYWRkUGF0aHMoIiIpLgotICAgICAgYWRkUGF0aHMoImJhciIpLmFkZFBhdGhzKCIiKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygiZm9vLGJhciIsIEZpZWxkTWFza1V0aWwudG9TdHJpbmcobWFzaykpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEZyb21TdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWVsZE1hc2sgbWFzayA9IEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZygiIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hc2suZ2V0UGF0aHNDb3VudCgpKTsKLSAgICBtYXNrID0gRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJmb28iKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbWFzay5nZXRQYXRoc0NvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgbWFzay5nZXRQYXRocygwKSk7Ci0gICAgbWFzayA9IEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZygiZm9vLGJhci5iYXoiKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbWFzay5nZXRQYXRoc0NvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgbWFzay5nZXRQYXRocygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJiYXIuYmF6IiwgbWFzay5nZXRQYXRocygxKSk7Ci0KLSAgICAvLyBFbXB0eSBmaWVsZCBwYXRocyBhcmUgaWdub3JlLgotICAgIG1hc2sgPSBGaWVsZE1hc2tVdGlsLmZyb21TdHJpbmcoIixmb28sLGJhciwiKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbWFzay5nZXRQYXRoc0NvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgbWFzay5nZXRQYXRocygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJiYXIiLCBtYXNrLmdldFBhdGhzKDEpKTsKLQotICAgIC8vIENoZWNrIHdoZXRoZXIgdGhlIGZpZWxkIHBhdGhzIGFyZSB2YWxpZCBpZiBhIGNsYXNzIHBhcmFtZXRlciBpcyBwcm92aWRlZC4KLSAgICBtYXNrID0gRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKE5lc3RlZFRlc3RBbGxUeXBlcy5jbGFzcywgIixwYXlsb2FkIik7Ci0KLSAgICB0cnkgewotICAgICAgbWFzayA9IEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZygKLSAgICAgICAgICBOZXN0ZWRUZXN0QWxsVHlwZXMuY2xhc3MsICJwYXlsb2FkLG5vbmV4aXN0Iik7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGcm9tRmllbGROdW1iZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmllbGRNYXNrIG1hc2sgPSBGaWVsZE1hc2tVdGlsLmZyb21GaWVsZE51bWJlcnMoVGVzdEFsbFR5cGVzLmNsYXNzKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFzay5nZXRQYXRoc0NvdW50KCkpOwotICAgIG1hc2sgPQotICAgICAgICBGaWVsZE1hc2tVdGlsLmZyb21GaWVsZE51bWJlcnMoCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXMuY2xhc3MsIFRlc3RBbGxUeXBlcy5PUFRJT05BTF9JTlQzMl9GSUVMRF9OVU1CRVIpOwotICAgIGFzc2VydEVxdWFscygxLCBtYXNrLmdldFBhdGhzQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMiIsIG1hc2suZ2V0UGF0aHMoMCkpOwotICAgIG1hc2sgPQotICAgICAgICBGaWVsZE1hc2tVdGlsLmZyb21GaWVsZE51bWJlcnMoCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXMuY2xhc3MsCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXMuT1BUSU9OQUxfSU5UMzJfRklFTERfTlVNQkVSLAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzLk9QVElPTkFMX0lOVDY0X0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1hc2suZ2V0UGF0aHNDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2ludDMyIiwgbWFzay5nZXRQYXRocygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQ2NCIsIG1hc2suZ2V0UGF0aHMoMSkpOwotCi0gICAgdHJ5IHsKLSAgICAgIGludCBpbnZhbGlkRmllbGROdW1iZXIgPSAxMDAwOwotICAgICAgbWFzayA9IEZpZWxkTWFza1V0aWwuZnJvbUZpZWxkTnVtYmVycyhUZXN0QWxsVHlwZXMuY2xhc3MsIGludmFsaWRGaWVsZE51bWJlcik7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgfQotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0VW5pb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBPbmx5IHRlc3QgYSBzaW1wbGUgY2FzZSBoZXJlIGFuZCBleHBlY3QKLSAgICAvLyB7QGxpbmsgRmllbGRNYXNrVHJlZVRlc3QjdGVzdEFkZEZpZWxkUGF0aH0gdG8gY292ZXIgYWxsIHNjZW5hcmlvcy4KLSAgICBGaWVsZE1hc2sgbWFzazEgPSBGaWVsZE1hc2tVdGlsLmZyb21TdHJpbmcoImZvbyxiYXIuYmF6LGJhci5xdXoiKTsKLSAgICBGaWVsZE1hc2sgbWFzazIgPSBGaWVsZE1hc2tVdGlsLmZyb21TdHJpbmcoImZvby5iYXIsYmFyIik7Ci0gICAgRmllbGRNYXNrIHJlc3VsdCA9IEZpZWxkTWFza1V0aWwudW5pb24obWFzazEsIG1hc2syKTsKLSAgICBhc3NlcnRFcXVhbHMoImJhcixmb28iLCBGaWVsZE1hc2tVdGlsLnRvU3RyaW5nKHJlc3VsdCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFVuaW9uX3VzaW5nVmFyQXJncygpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZpZWxkTWFzayBtYXNrMSA9IEZpZWxkTWFza1V0aWwuZnJvbVN0cmluZygiZm9vIik7Ci0gICAgRmllbGRNYXNrIG1hc2syID0gRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJmb28uYmFyLGJhci5xdXoiKTsKLSAgICBGaWVsZE1hc2sgbWFzazMgPSBGaWVsZE1hc2tVdGlsLmZyb21TdHJpbmcoImJhci5xdXoiKTsKLSAgICBGaWVsZE1hc2sgbWFzazQgPSBGaWVsZE1hc2tVdGlsLmZyb21TdHJpbmcoImJhciIpOwotICAgIEZpZWxkTWFzayByZXN1bHQgPSBGaWVsZE1hc2tVdGlsLnVuaW9uKG1hc2sxLCBtYXNrMiwgbWFzazMsIG1hc2s0KTsKLSAgICBhc3NlcnRFcXVhbHMoImJhcixmb28iLCBGaWVsZE1hc2tVdGlsLnRvU3RyaW5nKHJlc3VsdCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJzZWN0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gT25seSB0ZXN0IGEgc2ltcGxlIGNhc2UgaGVyZSBhbmQgZXhwZWN0Ci0gICAgLy8ge0BsaW5rIEZpZWxkTWFza1RyZWVUZXN0I3Rlc3RJbnRlcnNlY3RGaWVsZFBhdGh9IHRvIGNvdmVyIGFsbCBzY2VuYXJpb3MuCi0gICAgRmllbGRNYXNrIG1hc2sxID0gRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJmb28sYmFyLmJheixiYXIucXV6Iik7Ci0gICAgRmllbGRNYXNrIG1hc2syID0gRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJmb28uYmFyLGJhciIpOwotICAgIEZpZWxkTWFzayByZXN1bHQgPSBGaWVsZE1hc2tVdGlsLmludGVyc2VjdGlvbihtYXNrMSwgbWFzazIpOwotICAgIGFzc2VydEVxdWFscygiYmFyLmJheixiYXIucXV6LGZvby5iYXIiLCBGaWVsZE1hc2tVdGlsLnRvU3RyaW5nKHJlc3VsdCkpOwotICB9Ci0gIAotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBPbmx5IHRlc3QgYSBzaW1wbGUgY2FzZSBoZXJlIGFuZCBleHBlY3QKLSAgICAvLyB7QGxpbmsgRmllbGRNYXNrVHJlZVRlc3QjdGVzdE1lcmdlfSB0byBjb3ZlciBhbGwgc2NlbmFyaW9zLgotICAgIE5lc3RlZFRlc3RBbGxUeXBlcyBzb3VyY2UgPSBOZXN0ZWRUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRQYXlsb2FkKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxMjM0KSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgTmVzdGVkVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IE5lc3RlZFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgRmllbGRNYXNrVXRpbC5tZXJnZShGaWVsZE1hc2tVdGlsLmZyb21TdHJpbmcoInBheWxvYWQiKSwgc291cmNlLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgYnVpbGRlci5nZXRQYXlsb2FkKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi91dGlsL0pzb25Gb3JtYXRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvSnNvbkZvcm1hdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDk1YjYyNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvSnNvbkZvcm1hdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDExNzQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Bbnk7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Cb29sVmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZXNWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnQ2NFZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuTGlzdFZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuU3RydWN0OwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVUludDMyVmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5VSW50NjRWYWx1ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlZhbHVlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudXRpbC5Kc29uRm9ybWF0LlR5cGVSZWdpc3RyeTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWwuSnNvblRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsLkpzb25UZXN0UHJvdG8uVGVzdEFsbFR5cGVzLk5lc3RlZEVudW07Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsLkpzb25UZXN0UHJvdG8uVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsLkpzb25UZXN0UHJvdG8uVGVzdEFueTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWwuSnNvblRlc3RQcm90by5UZXN0Q3VzdG9tSnNvbk5hbWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsLkpzb25UZXN0UHJvdG8uVGVzdER1cmF0aW9uOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudXRpbC5Kc29uVGVzdFByb3RvLlRlc3RGaWVsZE1hc2s7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsLkpzb25UZXN0UHJvdG8uVGVzdE1hcDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWwuSnNvblRlc3RQcm90by5UZXN0T25lb2Y7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsLkpzb25UZXN0UHJvdG8uVGVzdFN0cnVjdDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnV0aWwuSnNvblRlc3RQcm90by5UZXN0VGltZXN0YW1wOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudXRpbC5Kc29uVGVzdFByb3RvLlRlc3RXcmFwcGVyczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0RlY2ltYWw7Ci1pbXBvcnQgamF2YS5tYXRoLkJpZ0ludGVnZXI7Ci0KLXB1YmxpYyBjbGFzcyBKc29uRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHJpdmF0ZSB2b2lkIHNldEFsbEZpZWxkcyhUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDEyMzQpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQ2NCgxMjM0NTY3ODkwMTIzNDU2Nzg5TCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbFVpbnQzMig1Njc4KTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsVWludDY0KDIzNDU2Nzg5MDEyMzQ1Njc4OTBMKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU2ludDMyKDkwMTIpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxTaW50NjQoMzQ1Njc4OTAxMjM0NTY3ODkwMUwpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGaXhlZDMyKDM0NTYpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGaXhlZDY0KDQ1Njc4OTAxMjM0NTY3ODkwMTJMKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU2ZpeGVkMzIoNzg5MCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbFNmaXhlZDY0KDU2Nzg5MDEyMzQ1Njc4OTAxMjNMKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsRmxvYXQoMS41Zik7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbERvdWJsZSgxLjI1KTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsQm9vbCh0cnVlKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsU3RyaW5nKCJIZWxsbyB3b3JsZCEiKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsQnl0ZXMoQnl0ZVN0cmluZy5jb3B5RnJvbShuZXcgYnl0ZVtdezAsIDEsIDJ9KSk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZEVudW0oTmVzdGVkRW51bS5CQVIpOwotICAgIGJ1aWxkZXIuZ2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlQnVpbGRlcigpLnNldFZhbHVlKDEwMCk7Ci0KLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMTIzNCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDY0KDEyMzQ1Njc4OTAxMjM0NTY3ODlMKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkVWludDMyKDU2NzgpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRVaW50NjQoMjM0NTY3ODkwMTIzNDU2Nzg5MEwpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTaW50MzIoOTAxMik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNpbnQ2NCgzNDU2Nzg5MDEyMzQ1Njc4OTAxTCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpeGVkMzIoMzQ1Nik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpeGVkNjQoNDU2Nzg5MDEyMzQ1Njc4OTAxMkwpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTZml4ZWQzMig3ODkwKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ZpeGVkNjQoNTY3ODkwMTIzNDU2Nzg5MDEyM0wpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGbG9hdCgxLjVmKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRG91YmxlKDEuMjUpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCb29sKHRydWUpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTdHJpbmcoIkhlbGxvIHdvcmxkISIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCeXRlcyhCeXRlU3RyaW5nLmNvcHlGcm9tKG5ldyBieXRlW117MCwgMSwgMn0pKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShOZXN0ZWRFbnVtLkJBUik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2VCdWlsZGVyKCkuc2V0VmFsdWUoMTAwKTsKLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigyMzQpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQ2NCgyMzQ1Njc4OTAxMjM0NTY3ODlMKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkVWludDMyKDY3OCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFVpbnQ2NCgzNDU2Nzg5MDEyMzQ1Njc4OTBMKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkU2ludDMyKDAxMik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFNpbnQ2NCg0NTY3ODkwMTIzNDU2Nzg5MDFMKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRml4ZWQzMig0NTYpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaXhlZDY0KDU2Nzg5MDEyMzQ1Njc4OTAxMkwpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTZml4ZWQzMig4OTApOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTZml4ZWQ2NCg2Nzg5MDEyMzQ1Njc4OTAxMjNMKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmxvYXQoMTEuNWYpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWREb3VibGUoMTEuMjUpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCb29sKHRydWUpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRTdHJpbmcoImVsbG8gd29ybGQhIik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb20obmV3IGJ5dGVbXXsxLCAyfSkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKE5lc3RlZEVudW0uQkFaKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZUJ1aWxkZXIoKS5zZXRWYWx1ZSgyMDApOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFJvdW5kVHJpcEVxdWFscyhNZXNzYWdlIG1lc3NhZ2UpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlLCBUeXBlUmVnaXN0cnkuZ2V0RW1wdHlUeXBlUmVnaXN0cnkoKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKE1lc3NhZ2UgbWVzc2FnZSwgVHlwZVJlZ2lzdHJ5IHJlZ2lzdHJ5KSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBKc29uRm9ybWF0LlByaW50ZXIgcHJpbnRlciA9IEpzb25Gb3JtYXQucHJpbnRlcigpLnVzaW5nVHlwZVJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLSAgICBKc29uRm9ybWF0LlBhcnNlciBwYXJzZXIgPSBKc29uRm9ybWF0LnBhcnNlcigpLnVzaW5nVHlwZVJlZ2lzdHJ5KHJlZ2lzdHJ5KTsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9IG1lc3NhZ2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICBwYXJzZXIubWVyZ2UocHJpbnRlci5wcmludChtZXNzYWdlKSwgYnVpbGRlcik7Ci0gICAgTWVzc2FnZSBwYXJzZWRNZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLnRvU3RyaW5nKCksIHBhcnNlZE1lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwcml2YXRlIFN0cmluZyB0b0pzb25TdHJpbmcoTWVzc2FnZSBtZXNzYWdlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBKc29uRm9ybWF0LnByaW50ZXIoKS5wcmludChtZXNzYWdlKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBtZXJnZUZyb21Kc29uKFN0cmluZyBqc29uLCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBKc29uRm9ybWF0LnBhcnNlcigpLm1lcmdlKGpzb24sIGJ1aWxkZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEFsbEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIHNldEFsbEZpZWxkcyhidWlsZGVyKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbEludDMyXCI6IDEyMzQsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxJbnQ2NFwiOiBcIjEyMzQ1Njc4OTAxMjM0NTY3ODlcIixcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbFVpbnQzMlwiOiA1Njc4LFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsVWludDY0XCI6IFwiMjM0NTY3ODkwMTIzNDU2Nzg5MFwiLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsU2ludDMyXCI6IDkwMTIsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxTaW50NjRcIjogXCIzNDU2Nzg5MDEyMzQ1Njc4OTAxXCIsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxGaXhlZDMyXCI6IDM0NTYsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxGaXhlZDY0XCI6IFwiNDU2Nzg5MDEyMzQ1Njc4OTAxMlwiLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsU2ZpeGVkMzJcIjogNzg5MCxcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbFNmaXhlZDY0XCI6IFwiNTY3ODkwMTIzNDU2Nzg5MDEyM1wiLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsRmxvYXRcIjogMS41LFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsRG91YmxlXCI6IDEuMjUsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxCb29sXCI6IHRydWUsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxTdHJpbmdcIjogXCJIZWxsbyB3b3JsZCFcIixcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbEJ5dGVzXCI6IFwiQUFFQ1wiLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsTmVzdGVkTWVzc2FnZVwiOiB7XG4iCi0gICAgICAgICAgICArICIgICAgXCJ2YWx1ZVwiOiAxMDBcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbE5lc3RlZEVudW1cIjogXCJCQVJcIixcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZEludDMyXCI6IFsxMjM0LCAyMzRdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkSW50NjRcIjogW1wiMTIzNDU2Nzg5MDEyMzQ1Njc4OVwiLCBcIjIzNDU2Nzg5MDEyMzQ1Njc4OVwiXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFVpbnQzMlwiOiBbNTY3OCwgNjc4XSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFVpbnQ2NFwiOiBbXCIyMzQ1Njc4OTAxMjM0NTY3ODkwXCIsIFwiMzQ1Njc4OTAxMjM0NTY3ODkwXCJdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkU2ludDMyXCI6IFs5MDEyLCAxMF0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRTaW50NjRcIjogW1wiMzQ1Njc4OTAxMjM0NTY3ODkwMVwiLCBcIjQ1Njc4OTAxMjM0NTY3ODkwMVwiXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZEZpeGVkMzJcIjogWzM0NTYsIDQ1Nl0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRGaXhlZDY0XCI6IFtcIjQ1Njc4OTAxMjM0NTY3ODkwMTJcIiwgXCI1Njc4OTAxMjM0NTY3ODkwMTJcIl0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRTZml4ZWQzMlwiOiBbNzg5MCwgODkwXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFNmaXhlZDY0XCI6IFtcIjU2Nzg5MDEyMzQ1Njc4OTAxMjNcIiwgXCI2Nzg5MDEyMzQ1Njc4OTAxMjNcIl0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRGbG9hdFwiOiBbMS41LCAxMS41XSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZERvdWJsZVwiOiBbMS4yNSwgMTEuMjVdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkQm9vbFwiOiBbdHJ1ZSwgdHJ1ZV0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRTdHJpbmdcIjogW1wiSGVsbG8gd29ybGQhXCIsIFwiZWxsbyB3b3JsZCFcIl0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRCeXRlc1wiOiBbXCJBQUVDXCIsIFwiQVFJPVwiXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZE5lc3RlZE1lc3NhZ2VcIjogW3tcbiIKLSAgICAgICAgICAgICsgIiAgICBcInZhbHVlXCI6IDEwMFxuIgotICAgICAgICAgICAgKyAiICB9LCB7XG4iCi0gICAgICAgICAgICArICIgICAgXCJ2YWx1ZVwiOiAyMDBcbiIKLSAgICAgICAgICAgICsgIiAgfV0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWROZXN0ZWRFbnVtXCI6IFtcIkJBUlwiLCBcIkJBWlwiXVxuIgotICAgICAgICAgICAgKyAifSIsCi0gICAgICAgIHRvSnNvblN0cmluZyhtZXNzYWdlKSk7Ci0KLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkVudW1WYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkRW51bVZhbHVlKDEyMzQ1KQotICAgICAgICAuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtVmFsdWUoMTIzNDUpCi0gICAgICAgIC5hZGRSZXBlYXRlZE5lc3RlZEVudW1WYWx1ZSgwKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJvcHRpb25hbE5lc3RlZEVudW1cIjogMTIzNDUsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZE5lc3RlZEVudW1cIjogWzEyMzQ1LCBcIkZPT1wiXVxuIgotICAgICAgICArICJ9IiwgdG9Kc29uU3RyaW5nKG1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMobWVzc2FnZSk7Ci0KLSAgICBUZXN0TWFwLkJ1aWxkZXIgbWFwQnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIG1hcEJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9FbnVtTWFwVmFsdWUoKS5wdXQoMSwgMCk7Ci0gICAgbWFwQnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0VudW1NYXBWYWx1ZSgpLnB1dCgyLCAxMjM0NSk7Ci0gICAgVGVzdE1hcCBtYXBNZXNzYWdlID0gbWFwQnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgICAgICsgIiAgXCJpbnQzMlRvRW51bU1hcFwiOiB7XG4iCi0gICAgICAgICAgICArICIgICAgXCIxXCI6IFwiRk9PXCIsXG4iCi0gICAgICAgICAgICArICIgICAgXCIyXCI6IDEyMzQ1XG4iCi0gICAgICAgICAgICArICIgIH1cbiIKLSAgICAgICAgICAgICsgIn0iLAotICAgICAgICB0b0pzb25TdHJpbmcobWFwTWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtYXBNZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTcGVjaWFsRmxvYXRWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZFJlcGVhdGVkRmxvYXQoRmxvYXQuTmFOKQotICAgICAgICAuYWRkUmVwZWF0ZWRGbG9hdChGbG9hdC5QT1NJVElWRV9JTkZJTklUWSkKLSAgICAgICAgLmFkZFJlcGVhdGVkRmxvYXQoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkpCi0gICAgICAgIC5hZGRSZXBlYXRlZERvdWJsZShEb3VibGUuTmFOKQotICAgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZKQotICAgICAgICAuYWRkUmVwZWF0ZWREb3VibGUoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZEZsb2F0XCI6IFtcIk5hTlwiLCBcIkluZmluaXR5XCIsIFwiLUluZmluaXR5XCJdLFxuIgotICAgICAgICArICIgIFwicmVwZWF0ZWREb3VibGVcIjogW1wiTmFOXCIsIFwiSW5maW5pdHlcIiwgXCItSW5maW5pdHlcIl1cbiIKLSAgICAgICAgKyAifSIsIHRvSnNvblN0cmluZyhtZXNzYWdlKSk7Ci0KLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyQWNjZXB0U3RyaW5nRm9yTnVtYmVyaWNGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIG1lcmdlRnJvbUpzb24oCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJvcHRpb25hbEludDMyXCI6IFwiMTIzNFwiLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxVaW50MzJcIjogXCI1Njc4XCIsXG4iCi0gICAgICAgICsgIiAgXCJvcHRpb25hbFNpbnQzMlwiOiBcIjkwMTJcIixcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsRml4ZWQzMlwiOiBcIjM0NTZcIixcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsU2ZpeGVkMzJcIjogXCI3ODkwXCIsXG4iCi0gICAgICAgICsgIiAgXCJvcHRpb25hbEZsb2F0XCI6IFwiMS41XCIsXG4iCi0gICAgICAgICsgIiAgXCJvcHRpb25hbERvdWJsZVwiOiBcIjEuMjVcIixcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsQm9vbFwiOiBcInRydWVcIlxuIgotICAgICAgICArICJ9IiwgYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMzQsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoNTY3OCwgbWVzc2FnZS5nZXRPcHRpb25hbFVpbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoOTAxMiwgbWVzc2FnZS5nZXRPcHRpb25hbFNpbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMzQ1NiwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkMzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDc4OTAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMS41ZiwgbWVzc2FnZS5nZXRPcHRpb25hbEZsb2F0KCkpOwotICAgIGFzc2VydEVxdWFscygxLjI1LCBtZXNzYWdlLmdldE9wdGlvbmFsRG91YmxlKCkpOwotICAgIGFzc2VydEVxdWFscyh0cnVlLCBtZXNzYWdlLmdldE9wdGlvbmFsQm9vbCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJBY2NlcHRGbG9hdGluZ1BvaW50VmFsdWVGb3JJbnRlZ2VyRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0IHRoYXQgbnVtZXJpYyB2YWx1ZXMgbGlrZSAiMS4wMDAiLCAiMWU1IiB3aWxsIGFsc28gYmUgYWNjZXB0ZWQuCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgbWVyZ2VGcm9tSnNvbigKLSAgICAgICAgIntcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZEludDMyXCI6IFsxLjAwMCwgMWU1LCBcIjEuMDAwXCIsIFwiMWU1XCJdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkVWludDMyXCI6IFsxLjAwMCwgMWU1LCBcIjEuMDAwXCIsIFwiMWU1XCJdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkSW50NjRcIjogWzEuMDAwLCAxZTUsIFwiMS4wMDBcIiwgXCIxZTVcIl0sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRVaW50NjRcIjogWzEuMDAwLCAxZTUsIFwiMS4wMDBcIiwgXCIxZTVcIl1cbiIKLSAgICAgICAgICAgICsgIn0iLCBidWlsZGVyKTsKLSAgICBpbnRbXSBleHBlY3RlZFZhbHVlcyA9IG5ldyBpbnRbXXsxLCAxMDAwMDAsIDEsIDEwMDAwMH07Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbnQzMkNvdW50KCkpOwotICAgIGFzc2VydEVxdWFscyg0LCBidWlsZGVyLmdldFJlcGVhdGVkVWludDMyQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbnQ2NENvdW50KCkpOwotICAgIGFzc2VydEVxdWFscyg0LCBidWlsZGVyLmdldFJlcGVhdGVkVWludDY0Q291bnQoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyArK2kpIHsKLSAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlc1tpXSwgYnVpbGRlci5nZXRSZXBlYXRlZEludDMyKGkpKTsKLSAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZFZhbHVlc1tpXSwgYnVpbGRlci5nZXRSZXBlYXRlZFVpbnQzMihpKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZXNbaV0sIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbnQ2NChpKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRWYWx1ZXNbaV0sIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRVaW50NjQoaSkpOwotICAgIH0KLQotICAgIC8vIE5vbi1pbnRlZ2VycyB3aWxsIHN0aWxsIGJlIHJlamVjdGVkLgotICAgIGFzc2VydFJlamVjdHMoIm9wdGlvbmFsSW50MzIiLCAiMS41Iik7Ci0gICAgYXNzZXJ0UmVqZWN0cygib3B0aW9uYWxVaW50MzIiLCAiMS41Iik7Ci0gICAgYXNzZXJ0UmVqZWN0cygib3B0aW9uYWxJbnQ2NCIsICIxLjUiKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbFVpbnQ2NCIsICIxLjUiKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRSZWplY3RzKFN0cmluZyBuYW1lLCBTdHJpbmcgdmFsdWUpIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICB0cnkgewotICAgICAgLy8gTnVtZXJpYyBmb3JtIGlzIHJlamVjdGVkLgotICAgICAgbWVyZ2VGcm9tSnNvbigie1wiIiArIG5hbWUgKyAiXCI6IiArIHZhbHVlICsgIn0iLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFN0cmluZyBmb3JtIGlzIGFsc28gcmVqZWN0ZWQuCi0gICAgICBtZXJnZUZyb21Kc29uKCJ7XCIiICsgbmFtZSArICJcIjpcIiIgKyB2YWx1ZSArICJcIn0iLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0QWNjZXB0cyhTdHJpbmcgbmFtZSwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIC8vIEJvdGggbnVtZXJpYyBmb3JtIGFuZCBzdHJpbmcgZm9ybSBhcmUgYWNjZXB0ZWQuCi0gICAgbWVyZ2VGcm9tSnNvbigie1wiIiArIG5hbWUgKyAiXCI6IiArIHZhbHVlICsgIn0iLCBidWlsZGVyKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgbWVyZ2VGcm9tSnNvbigie1wiIiArIG5hbWUgKyAiXCI6XCIiICsgdmFsdWUgKyAiXCJ9IiwgYnVpbGRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyUmVqZWN0T3V0T2ZSYW5nZU51bWVyaWNWYWx1ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRBY2NlcHRzKCJvcHRpb25hbEludDMyIiwgU3RyaW5nLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUpKTsKLSAgICBhc3NlcnRBY2NlcHRzKCJvcHRpb25hbEludDMyIiwgU3RyaW5nLnZhbHVlT2YoSW50ZWdlci5NSU5fVkFMVUUpKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbEludDMyIiwgU3RyaW5nLnZhbHVlT2YoSW50ZWdlci5NQVhfVkFMVUUgKyAxTCkpOwotICAgIGFzc2VydFJlamVjdHMoIm9wdGlvbmFsSW50MzIiLCBTdHJpbmcudmFsdWVPZihJbnRlZ2VyLk1JTl9WQUxVRSAtIDFMKSk7Ci0KLSAgICBhc3NlcnRBY2NlcHRzKCJvcHRpb25hbFVpbnQzMiIsIFN0cmluZy52YWx1ZU9mKEludGVnZXIuTUFYX1ZBTFVFICsgMUwpKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbFVpbnQzMiIsICIxMjM0NTY3ODkwMTIzNDUiKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbFVpbnQzMiIsICItMSIpOwotCi0gICAgQmlnSW50ZWdlciBvbmUgPSBuZXcgQmlnSW50ZWdlcigiMSIpOwotICAgIEJpZ0ludGVnZXIgbWF4TG9uZyA9IG5ldyBCaWdJbnRlZ2VyKFN0cmluZy52YWx1ZU9mKExvbmcuTUFYX1ZBTFVFKSk7Ci0gICAgQmlnSW50ZWdlciBtaW5Mb25nID0gbmV3IEJpZ0ludGVnZXIoU3RyaW5nLnZhbHVlT2YoTG9uZy5NSU5fVkFMVUUpKTsKLSAgICBhc3NlcnRBY2NlcHRzKCJvcHRpb25hbEludDY0IiwgbWF4TG9uZy50b1N0cmluZygpKTsKLSAgICBhc3NlcnRBY2NlcHRzKCJvcHRpb25hbEludDY0IiwgbWluTG9uZy50b1N0cmluZygpKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbEludDY0IiwgbWF4TG9uZy5hZGQob25lKS50b1N0cmluZygpKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbEludDY0IiwgbWluTG9uZy5zdWJ0cmFjdChvbmUpLnRvU3RyaW5nKCkpOwotCi0gICAgYXNzZXJ0QWNjZXB0cygib3B0aW9uYWxVaW50NjQiLCBtYXhMb25nLmFkZChvbmUpLnRvU3RyaW5nKCkpOwotICAgIGFzc2VydFJlamVjdHMoIm9wdGlvbmFsVWludDY0IiwgIjEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDUiKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbFVpbnQ2NCIsICItMSIpOwotCi0gICAgYXNzZXJ0QWNjZXB0cygib3B0aW9uYWxCb29sIiwgInRydWUiKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbEJvb2wiLCAiMSIpOwotICAgIGFzc2VydFJlamVjdHMoIm9wdGlvbmFsQm9vbCIsICIwIik7Ci0KLSAgICBhc3NlcnRBY2NlcHRzKCJvcHRpb25hbEZsb2F0IiwgU3RyaW5nLnZhbHVlT2YoRmxvYXQuTUFYX1ZBTFVFKSk7Ci0gICAgYXNzZXJ0QWNjZXB0cygib3B0aW9uYWxGbG9hdCIsIFN0cmluZy52YWx1ZU9mKC1GbG9hdC5NQVhfVkFMVUUpKTsKLSAgICBhc3NlcnRSZWplY3RzKCJvcHRpb25hbEZsb2F0IiwgU3RyaW5nLnZhbHVlT2YoRG91YmxlLk1BWF9WQUxVRSkpOwotICAgIGFzc2VydFJlamVjdHMoIm9wdGlvbmFsRmxvYXQiLCBTdHJpbmcudmFsdWVPZigtRG91YmxlLk1BWF9WQUxVRSkpOwotCi0gICAgQmlnRGVjaW1hbCBtb3JlVGhhbk9uZSA9IG5ldyBCaWdEZWNpbWFsKCIxLjAwMDAwMSIpOwotICAgIEJpZ0RlY2ltYWwgbWF4RG91YmxlID0gbmV3IEJpZ0RlY2ltYWwoRG91YmxlLk1BWF9WQUxVRSk7Ci0gICAgQmlnRGVjaW1hbCBtaW5Eb3VibGUgPSBuZXcgQmlnRGVjaW1hbCgtRG91YmxlLk1BWF9WQUxVRSk7Ci0gICAgYXNzZXJ0QWNjZXB0cygib3B0aW9uYWxEb3VibGUiLCBtYXhEb3VibGUudG9TdHJpbmcoKSk7Ci0gICAgYXNzZXJ0QWNjZXB0cygib3B0aW9uYWxEb3VibGUiLCBtaW5Eb3VibGUudG9TdHJpbmcoKSk7Ci0gICAgYXNzZXJ0UmVqZWN0cygib3B0aW9uYWxEb3VibGUiLCBtYXhEb3VibGUubXVsdGlwbHkobW9yZVRoYW5PbmUpLnRvU3RyaW5nKCkpOwotICAgIGFzc2VydFJlamVjdHMoIm9wdGlvbmFsRG91YmxlIiwgbWluRG91YmxlLm11bHRpcGx5KG1vcmVUaGFuT25lKS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJBY2NlcHROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgbWVyZ2VGcm9tSnNvbigKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsSW50MzJcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsSW50NjRcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsVWludDMyXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJvcHRpb25hbFVpbnQ2NFwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxTaW50MzJcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsU2ludDY0XCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJvcHRpb25hbEZpeGVkMzJcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsRml4ZWQ2NFwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxTZml4ZWQzMlwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxTZml4ZWQ2NFwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxGbG9hdFwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxEb3VibGVcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsQm9vbFwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxTdHJpbmdcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsQnl0ZXNcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcIm9wdGlvbmFsTmVzdGVkTWVzc2FnZVwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwib3B0aW9uYWxOZXN0ZWRFbnVtXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZEludDMyXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZEludDY0XCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZFVpbnQzMlwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwicmVwZWF0ZWRVaW50NjRcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcInJlcGVhdGVkU2ludDMyXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZFNpbnQ2NFwiOiBudWxsLFxuIgotICAgICAgICArICIgIFwicmVwZWF0ZWRGaXhlZDMyXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZEZpeGVkNjRcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcInJlcGVhdGVkU2ZpeGVkMzJcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcInJlcGVhdGVkU2ZpeGVkNjRcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcInJlcGVhdGVkRmxvYXRcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcInJlcGVhdGVkRG91YmxlXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZEJvb2xcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcInJlcGVhdGVkU3RyaW5nXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZEJ5dGVzXCI6IG51bGwsXG4iCi0gICAgICAgICsgIiAgXCJyZXBlYXRlZE5lc3RlZE1lc3NhZ2VcIjogbnVsbCxcbiIKLSAgICAgICAgKyAiICBcInJlcGVhdGVkTmVzdGVkRW51bVwiOiBudWxsXG4iCi0gICAgICAgICsgIn0iLCBidWlsZGVyKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLCBtZXNzYWdlKTsKLQotICAgIC8vIFJlcGVhdGVkIGZpZWxkIGVsZW1lbnRzIGNhbm5vdCBiZSBudWxsLgotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICAgIG1lcmdlRnJvbUpzb24oCi0gICAgICAgICAgIntcbiIKLSAgICAgICAgICArICIgIFwicmVwZWF0ZWRJbnQzMlwiOiBbbnVsbCwgbnVsbF0sXG4iCi0gICAgICAgICAgKyAifSIsIGJ1aWxkZXIpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeGNlcHRpb24gZXhwZWN0ZWQuCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgICAgbWVyZ2VGcm9tSnNvbigKLSAgICAgICAgICAie1xuIgotICAgICAgICAgICsgIiAgXCJyZXBlYXRlZE5lc3RlZE1lc3NhZ2VcIjogW251bGwsIG51bGxdLFxuIgotICAgICAgICAgICsgIn0iLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhjZXB0aW9uIGV4cGVjdGVkLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJSZWplY3REdXBsaWNhdGVkRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVE9ETyh4aWFvZmVuZyk6IFRoZSBwYXJzZXIgd2UgYXJlIGN1cnJlbnRseSB1c2luZyAoR1NPTikgd2lsbCBhY2NlcHQgYW5kIGtlZXAgdGhlIGxhc3QKLSAgICAvLyBvbmUgaWYgbXVsdGlwbGUgZW50cmllcyBoYXZlIHRoZSBzYW1lIG5hbWUuIFRoaXMgaXMgbm90IHRoZSBkZXNpcmVkIGJlaGF2aW9yIGJ1dCBpdCBjYW4KLSAgICAvLyBvbmx5IGJlIGZpeGVkIGJ5IHVzaW5nIG91ciBvd24gcGFyc2VyLiBIZXJlIHdlIG9ubHkgdGVzdCB0aGUgY2FzZXMgd2hlcmUgdGhlIG5hbWVzIGFyZQotICAgIC8vIGRpZmZlcmVudCBidXQgc3RpbGwgcmVmZXJyaW5nIHRvIHRoZSBzYW1lIGZpZWxkLgotCi0gICAgLy8gRHVwbGljYXRlZCBvcHRpb25hbCBmaWVsZHMuCi0gICAgdHJ5IHsKLSAgICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgICAgbWVyZ2VGcm9tSnNvbigKLSAgICAgICAgICAie1xuIgotICAgICAgICAgICAgICArICIgIFwib3B0aW9uYWxOZXN0ZWRNZXNzYWdlXCI6IHt9LFxuIgotICAgICAgICAgICAgICArICIgIFwib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VcIjoge31cbiIKLSAgICAgICAgICArICJ9IiwgYnVpbGRlcik7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4Y2VwdGlvbiBleHBlY3RlZC4KLSAgICB9Ci0KLSAgICAvLyBEdXBsaWNhdGVkIHJlcGVhdGVkIGZpZWxkcy4KLSAgICB0cnkgewotICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgICBtZXJnZUZyb21Kc29uKAotICAgICAgICAgICJ7XG4iCi0gICAgICAgICAgKyAiICBcInJlcGVhdGVkTmVzdGVkTWVzc2FnZVwiOiBbbnVsbCwgbnVsbF0sXG4iCi0gICAgICAgICAgKyAiICBcInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXCI6IFtudWxsLCBudWxsXVxuIgotICAgICAgICAgICsgIn0iLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhjZXB0aW9uIGV4cGVjdGVkLgotICAgIH0KLQotICAgIC8vIER1cGxpY2F0ZWQgb25lb2YgZmllbGRzLgotICAgIHRyeSB7Ci0gICAgICBUZXN0T25lb2YuQnVpbGRlciBidWlsZGVyID0gVGVzdE9uZW9mLm5ld0J1aWxkZXIoKTsKLSAgICAgIG1lcmdlRnJvbUpzb24oCi0gICAgICAgICAgIntcbiIKLSAgICAgICAgICArICIgIFwib25lb2ZJbnQzMlwiOiAxLFxuIgotICAgICAgICAgICsgIiAgXCJvbmVvZl9pbnQzMlwiOiAyXG4iCi0gICAgICAgICAgKyAifSIsIGJ1aWxkZXIpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeGNlcHRpb24gZXhwZWN0ZWQuCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1hcEZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyTWFwKCkucHV0KDEsIDEwKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQ2NFRvSW50MzJNYXAoKS5wdXQoMTIzNDU2Nzg5MDEyMzQ1Njc4OUwsIDEwKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVVaW50MzJUb0ludDMyTWFwKCkucHV0KDIsIDIwKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVVaW50NjRUb0ludDMyTWFwKCkucHV0KDIyMzQ1Njc4OTAxMjM0NTY3ODlMLCAyMCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU2ludDMyVG9JbnQzMk1hcCgpLnB1dCgzLCAzMCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU2ludDY0VG9JbnQzMk1hcCgpLnB1dCgzMjM0NTY3ODkwMTIzNDU2Nzg5TCwgMzApOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUZpeGVkMzJUb0ludDMyTWFwKCkucHV0KDQsIDQwKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVGaXhlZDY0VG9JbnQzMk1hcCgpLnB1dCg0MjM0NTY3ODkwMTIzNDU2Nzg5TCwgNDApOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVNmaXhlZDMyVG9JbnQzMk1hcCgpLnB1dCg1LCA1MCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlU2ZpeGVkNjRUb0ludDMyTWFwKCkucHV0KDUyMzQ1Njc4OTAxMjM0NTY3ODlMLCA1MCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlQm9vbFRvSW50MzJNYXAoKS5wdXQoZmFsc2UsIDYpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZVN0cmluZ1RvSW50MzJNYXAoKS5wdXQoIkhlbGxvIiwgMTApOwotCi0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDY0TWFwKCkucHV0KDEsIDEyMzQ1Njc4OTAxMjM0NTY3ODlMKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvVWludDMyTWFwKCkucHV0KDIsIDIwKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvVWludDY0TWFwKCkucHV0KDIsIDIyMzQ1Njc4OTAxMjM0NTY3ODlMKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU2ludDMyTWFwKCkucHV0KDMsIDMwKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvU2ludDY0TWFwKCkucHV0KDMsIDMyMzQ1Njc4OTAxMjM0NTY3ODlMKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRml4ZWQzMk1hcCgpLnB1dCg0LCA0MCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ZpeGVkNjRNYXAoKS5wdXQoNCwgNDIzNDU2Nzg5MDEyMzQ1Njc4OUwpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9TZml4ZWQzMk1hcCgpLnB1dCg1LCA1MCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1NmaXhlZDY0TWFwKCkucHV0KDUsIDUyMzQ1Njc4OTAxMjM0NTY3ODlMKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRmxvYXRNYXAoKS5wdXQoNiwgMS41Zik7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0RvdWJsZU1hcCgpLnB1dCg2LCAxLjI1KTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvQm9vbE1hcCgpLnB1dCg3LCBmYWxzZSk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb1N0cmluZ01hcCgpLnB1dCg3LCAiV29ybGQiKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvQnl0ZXNNYXAoKS5wdXQoCi0gICAgICAgIDgsIEJ5dGVTdHJpbmcuY29weUZyb20obmV3IGJ5dGVbXXsxLCAyLCAzfSkpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9NZXNzYWdlTWFwKCkucHV0KAotICAgICAgICA4LCBOZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgxMjM0KS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmdldE11dGFibGVJbnQzMlRvRW51bU1hcCgpLnB1dCg5LCBOZXN0ZWRFbnVtLkJBUik7Ci0gICAgVGVzdE1hcCBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiaW50MzJUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiMVwiOiAxMFxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCIxMjM0NTY3ODkwMTIzNDU2Nzg5XCI6IDEwXG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcInVpbnQzMlRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCIyXCI6IDIwXG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcInVpbnQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCIyMjM0NTY3ODkwMTIzNDU2Nzg5XCI6IDIwXG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcInNpbnQzMlRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCIzXCI6IDMwXG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcInNpbnQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCIzMjM0NTY3ODkwMTIzNDU2Nzg5XCI6IDMwXG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcImZpeGVkMzJUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiNFwiOiA0MFxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJmaXhlZDY0VG9JbnQzMk1hcFwiOiB7XG4iCi0gICAgICAgICsgIiAgICBcIjQyMzQ1Njc4OTAxMjM0NTY3ODlcIjogNDBcbiIKLSAgICAgICAgKyAiICB9LFxuIgotICAgICAgICArICIgIFwic2ZpeGVkMzJUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiNVwiOiA1MFxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJzZml4ZWQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCI1MjM0NTY3ODkwMTIzNDU2Nzg5XCI6IDUwXG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcImJvb2xUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiZmFsc2VcIjogNlxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJzdHJpbmdUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiSGVsbG9cIjogMTBcbiIKLSAgICAgICAgKyAiICB9LFxuIgotICAgICAgICArICIgIFwiaW50MzJUb0ludDY0TWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiMVwiOiBcIjEyMzQ1Njc4OTAxMjM0NTY3ODlcIlxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvVWludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiMlwiOiAyMFxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvVWludDY0TWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiMlwiOiBcIjIyMzQ1Njc4OTAxMjM0NTY3ODlcIlxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvU2ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiM1wiOiAzMFxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvU2ludDY0TWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiM1wiOiBcIjMyMzQ1Njc4OTAxMjM0NTY3ODlcIlxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvRml4ZWQzMk1hcFwiOiB7XG4iCi0gICAgICAgICsgIiAgICBcIjRcIjogNDBcbiIKLSAgICAgICAgKyAiICB9LFxuIgotICAgICAgICArICIgIFwiaW50MzJUb0ZpeGVkNjRNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCI0XCI6IFwiNDIzNDU2Nzg5MDEyMzQ1Njc4OVwiXG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcImludDMyVG9TZml4ZWQzMk1hcFwiOiB7XG4iCi0gICAgICAgICsgIiAgICBcIjVcIjogNTBcbiIKLSAgICAgICAgKyAiICB9LFxuIgotICAgICAgICArICIgIFwiaW50MzJUb1NmaXhlZDY0TWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiNVwiOiBcIjUyMzQ1Njc4OTAxMjM0NTY3ODlcIlxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvRmxvYXRNYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCI2XCI6IDEuNVxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvRG91YmxlTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiNlwiOiAxLjI1XG4iCi0gICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgKyAiICBcImludDMyVG9Cb29sTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiN1wiOiBmYWxzZVxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvU3RyaW5nTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiN1wiOiBcIldvcmxkXCJcbiIKLSAgICAgICAgKyAiICB9LFxuIgotICAgICAgICArICIgIFwiaW50MzJUb0J5dGVzTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiOFwiOiBcIkFRSURcIlxuIgotICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICsgIiAgXCJpbnQzMlRvTWVzc2FnZU1hcFwiOiB7XG4iCi0gICAgICAgICsgIiAgICBcIjhcIjoge1xuIgotICAgICAgICArICIgICAgICBcInZhbHVlXCI6IDEyMzRcbiIKLSAgICAgICAgKyAiICAgIH1cbiIKLSAgICAgICAgKyAiICB9LFxuIgotICAgICAgICArICIgIFwiaW50MzJUb0VudW1NYXBcIjoge1xuIgotICAgICAgICArICIgICAgXCI5XCI6IFwiQkFSXCJcbiIKLSAgICAgICAgKyAiICB9XG4iCi0gICAgICAgICsgIn0iLCB0b0pzb25TdHJpbmcobWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlKTsKLQotICAgIC8vIFRlc3QgbXVsdGlwbGUgZW50cmllcy4KLSAgICBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5nZXRNdXRhYmxlSW50MzJUb0ludDMyTWFwKCkucHV0KDEsIDIpOwotICAgIGJ1aWxkZXIuZ2V0TXV0YWJsZUludDMyVG9JbnQzMk1hcCgpLnB1dCgzLCA0KTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiaW50MzJUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwiMVwiOiAyLFxuIgotICAgICAgICArICIgICAgXCIzXCI6IDRcbiIKLSAgICAgICAgKyAiICB9XG4iCi0gICAgICAgICsgIn0iLCB0b0pzb25TdHJpbmcobWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNYXBOdWxsVmFsdWVJc1JlamVjdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIFRlc3RNYXAuQnVpbGRlciBidWlsZGVyID0gVGVzdE1hcC5uZXdCdWlsZGVyKCk7Ci0gICAgICBtZXJnZUZyb21Kc29uKAotICAgICAgICAgICJ7XG4iCi0gICAgICAgICAgKyAiICBcImludDMyVG9JbnQzMk1hcFwiOiB7bnVsbDogMX0sXG4iCi0gICAgICAgICAgKyAiICBcImludDMyVG9NZXNzYWdlTWFwXCI6IHtudWxsOiAyfVxuIgotICAgICAgICAgICsgIn0iLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhjZXB0aW9uIGV4cGVjdGVkLgotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgICAgbWVyZ2VGcm9tSnNvbigKLSAgICAgICAgICAie1xuIgotICAgICAgICAgICsgIiAgXCJpbnQzMlRvSW50MzJNYXBcIjoge1wiMVwiOiBudWxsfSxcbiIKLSAgICAgICAgICArICIgIFwiaW50MzJUb01lc3NhZ2VNYXBcIjoge1wiMlwiOiBudWxsfVxuIgotICAgICAgICAgICsgIn0iLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhjZXB0aW9uIGV4cGVjdGVkLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJBY2NlcHROb25RdW90ZWRPYmplY3RLZXkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RNYXAubmV3QnVpbGRlcigpOwotICAgIG1lcmdlRnJvbUpzb24oCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgaW50MzJUb0ludDMyTWFwOiB7MTogMn0sXG4iCi0gICAgICAgICsgIiAgc3RyaW5nVG9JbnQzMk1hcDoge2hlbGxvOiAzfVxuIgotICAgICAgICArICJ9IiwgYnVpbGRlcik7Ci0gICAgVGVzdE1hcCBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEludDMyVG9JbnQzMk1hcCgpLmdldCgxKS5pbnRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5nZXRTdHJpbmdUb0ludDMyTWFwKCkuZ2V0KCJoZWxsbyIpLmludFZhbHVlKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFdyYXBwZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFdyYXBwZXJzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RXcmFwcGVycy5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5nZXRCb29sVmFsdWVCdWlsZGVyKCkuc2V0VmFsdWUoZmFsc2UpOwotICAgIGJ1aWxkZXIuZ2V0SW50MzJWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSgwKTsKLSAgICBidWlsZGVyLmdldEludDY0VmFsdWVCdWlsZGVyKCkuc2V0VmFsdWUoMCk7Ci0gICAgYnVpbGRlci5nZXRVaW50MzJWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSgwKTsKLSAgICBidWlsZGVyLmdldFVpbnQ2NFZhbHVlQnVpbGRlcigpLnNldFZhbHVlKDApOwotICAgIGJ1aWxkZXIuZ2V0RmxvYXRWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSgwLjBmKTsKLSAgICBidWlsZGVyLmdldERvdWJsZVZhbHVlQnVpbGRlcigpLnNldFZhbHVlKDAuMCk7Ci0gICAgYnVpbGRlci5nZXRTdHJpbmdWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSgiIik7Ci0gICAgYnVpbGRlci5nZXRCeXRlc1ZhbHVlQnVpbGRlcigpLnNldFZhbHVlKEJ5dGVTdHJpbmcuRU1QVFkpOwotICAgIFRlc3RXcmFwcGVycyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiaW50MzJWYWx1ZVwiOiAwLFxuIgotICAgICAgICArICIgIFwidWludDMyVmFsdWVcIjogMCxcbiIKLSAgICAgICAgKyAiICBcImludDY0VmFsdWVcIjogXCIwXCIsXG4iCi0gICAgICAgICsgIiAgXCJ1aW50NjRWYWx1ZVwiOiBcIjBcIixcbiIKLSAgICAgICAgKyAiICBcImZsb2F0VmFsdWVcIjogMC4wLFxuIgotICAgICAgICArICIgIFwiZG91YmxlVmFsdWVcIjogMC4wLFxuIgotICAgICAgICArICIgIFwiYm9vbFZhbHVlXCI6IGZhbHNlLFxuIgotICAgICAgICArICIgIFwic3RyaW5nVmFsdWVcIjogXCJcIixcbiIKLSAgICAgICAgKyAiICBcImJ5dGVzVmFsdWVcIjogXCJcIlxuIgotICAgICAgICArICJ9IiwgdG9Kc29uU3RyaW5nKG1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMobWVzc2FnZSk7Ci0KLSAgICBidWlsZGVyID0gVGVzdFdyYXBwZXJzLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmdldEJvb2xWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSh0cnVlKTsKLSAgICBidWlsZGVyLmdldEludDMyVmFsdWVCdWlsZGVyKCkuc2V0VmFsdWUoMSk7Ci0gICAgYnVpbGRlci5nZXRJbnQ2NFZhbHVlQnVpbGRlcigpLnNldFZhbHVlKDIpOwotICAgIGJ1aWxkZXIuZ2V0VWludDMyVmFsdWVCdWlsZGVyKCkuc2V0VmFsdWUoMyk7Ci0gICAgYnVpbGRlci5nZXRVaW50NjRWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSg0KTsKLSAgICBidWlsZGVyLmdldEZsb2F0VmFsdWVCdWlsZGVyKCkuc2V0VmFsdWUoNS4wZik7Ci0gICAgYnVpbGRlci5nZXREb3VibGVWYWx1ZUJ1aWxkZXIoKS5zZXRWYWx1ZSg2LjApOwotICAgIGJ1aWxkZXIuZ2V0U3RyaW5nVmFsdWVCdWlsZGVyKCkuc2V0VmFsdWUoIjciKTsKLSAgICBidWlsZGVyLmdldEJ5dGVzVmFsdWVCdWlsZGVyKCkuc2V0VmFsdWUoQnl0ZVN0cmluZy5jb3B5RnJvbShuZXcgYnl0ZVtdezh9KSk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcImludDMyVmFsdWVcIjogMSxcbiIKLSAgICAgICAgKyAiICBcInVpbnQzMlZhbHVlXCI6IDMsXG4iCi0gICAgICAgICsgIiAgXCJpbnQ2NFZhbHVlXCI6IFwiMlwiLFxuIgotICAgICAgICArICIgIFwidWludDY0VmFsdWVcIjogXCI0XCIsXG4iCi0gICAgICAgICsgIiAgXCJmbG9hdFZhbHVlXCI6IDUuMCxcbiIKLSAgICAgICAgKyAiICBcImRvdWJsZVZhbHVlXCI6IDYuMCxcbiIKLSAgICAgICAgKyAiICBcImJvb2xWYWx1ZVwiOiB0cnVlLFxuIgotICAgICAgICArICIgIFwic3RyaW5nVmFsdWVcIjogXCI3XCIsXG4iCi0gICAgICAgICsgIiAgXCJieXRlc1ZhbHVlXCI6IFwiQ0E9PVwiXG4iCi0gICAgICAgICsgIn0iLCB0b0pzb25TdHJpbmcobWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUaW1lc3RhbXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0VGltZXN0YW1wIG1lc3NhZ2UgPSBUZXN0VGltZXN0YW1wLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VGltZXN0YW1wVmFsdWUoVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjE5NzAtMDEtMDFUMDA6MDA6MDBaIikpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwidGltZXN0YW1wVmFsdWVcIjogXCIxOTcwLTAxLTAxVDAwOjAwOjAwWlwiXG4iCi0gICAgICAgICsgIn0iLCB0b0pzb25TdHJpbmcobWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REdXJhdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3REdXJhdGlvbiBtZXNzYWdlID0gVGVzdER1cmF0aW9uLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RHVyYXRpb25WYWx1ZShUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCIxMjM0NXMiKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJkdXJhdGlvblZhbHVlXCI6IFwiMTIzNDVzXCJcbiIKLSAgICAgICAgKyAifSIsIHRvSnNvblN0cmluZyhtZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEZpZWxkTWFzaygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RGaWVsZE1hc2sgbWVzc2FnZSA9IFRlc3RGaWVsZE1hc2submV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRGaWVsZE1hc2tWYWx1ZShGaWVsZE1hc2tVdGlsLmZyb21TdHJpbmcoImZvby5iYXIsYmF6IikpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiZmllbGRNYXNrVmFsdWVcIjogXCJmb28uYmFyLGJhelwiXG4iCi0gICAgICAgICsgIn0iLCB0b0pzb25TdHJpbmcobWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTdHJ1Y3QoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBCdWlsZCBhIHN0cnVjdCB3aXRoIGFsbCBwb3NzaWJsZSB2YWx1ZXMuCi0gICAgVGVzdFN0cnVjdC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0U3RydWN0Lm5ld0J1aWxkZXIoKTsKLSAgICBTdHJ1Y3QuQnVpbGRlciBzdHJ1Y3RCdWlsZGVyID0gYnVpbGRlci5nZXRTdHJ1Y3RWYWx1ZUJ1aWxkZXIoKTsKLSAgICBzdHJ1Y3RCdWlsZGVyLmdldE11dGFibGVGaWVsZHMoKS5wdXQoCi0gICAgICAgICJudWxsX3ZhbHVlIiwgVmFsdWUubmV3QnVpbGRlcigpLnNldE51bGxWYWx1ZVZhbHVlKDApLmJ1aWxkKCkpOwotICAgIHN0cnVjdEJ1aWxkZXIuZ2V0TXV0YWJsZUZpZWxkcygpLnB1dCgKLSAgICAgICAgIm51bWJlcl92YWx1ZSIsIFZhbHVlLm5ld0J1aWxkZXIoKS5zZXROdW1iZXJWYWx1ZSgxLjI1KS5idWlsZCgpKTsKLSAgICBzdHJ1Y3RCdWlsZGVyLmdldE11dGFibGVGaWVsZHMoKS5wdXQoCi0gICAgICAgICJzdHJpbmdfdmFsdWUiLCBWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0U3RyaW5nVmFsdWUoImhlbGxvIikuYnVpbGQoKSk7Ci0gICAgU3RydWN0LkJ1aWxkZXIgc3ViU3RydWN0QnVpbGRlciA9IFN0cnVjdC5uZXdCdWlsZGVyKCk7Ci0gICAgc3ViU3RydWN0QnVpbGRlci5nZXRNdXRhYmxlRmllbGRzKCkucHV0KAotICAgICAgICAibnVtYmVyX3ZhbHVlIiwgVmFsdWUubmV3QnVpbGRlcigpLnNldE51bWJlclZhbHVlKDEyMzQpLmJ1aWxkKCkpOwotICAgIHN0cnVjdEJ1aWxkZXIuZ2V0TXV0YWJsZUZpZWxkcygpLnB1dCgKLSAgICAgICAgInN0cnVjdF92YWx1ZSIsIFZhbHVlLm5ld0J1aWxkZXIoKS5zZXRTdHJ1Y3RWYWx1ZShzdWJTdHJ1Y3RCdWlsZGVyLmJ1aWxkKCkpLmJ1aWxkKCkpOwotICAgIExpc3RWYWx1ZS5CdWlsZGVyIGxpc3RCdWlsZGVyID0gTGlzdFZhbHVlLm5ld0J1aWxkZXIoKTsKLSAgICBsaXN0QnVpbGRlci5hZGRWYWx1ZXMoVmFsdWUubmV3QnVpbGRlcigpLnNldE51bWJlclZhbHVlKDEuMTI1KS5idWlsZCgpKTsKLSAgICBsaXN0QnVpbGRlci5hZGRWYWx1ZXMoVmFsdWUubmV3QnVpbGRlcigpLnNldE51bGxWYWx1ZVZhbHVlKDApLmJ1aWxkKCkpOwotICAgIHN0cnVjdEJ1aWxkZXIuZ2V0TXV0YWJsZUZpZWxkcygpLnB1dCgKLSAgICAgICAgImxpc3RfdmFsdWUiLCBWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0TGlzdFZhbHVlKGxpc3RCdWlsZGVyLmJ1aWxkKCkpLmJ1aWxkKCkpOwotICAgIFRlc3RTdHJ1Y3QgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcInN0cnVjdFZhbHVlXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwibnVsbF92YWx1ZVwiOiBudWxsLFxuIgotICAgICAgICArICIgICAgXCJudW1iZXJfdmFsdWVcIjogMS4yNSxcbiIKLSAgICAgICAgKyAiICAgIFwic3RyaW5nX3ZhbHVlXCI6IFwiaGVsbG9cIixcbiIKLSAgICAgICAgKyAiICAgIFwic3RydWN0X3ZhbHVlXCI6IHtcbiIKLSAgICAgICAgKyAiICAgICAgXCJudW1iZXJfdmFsdWVcIjogMTIzNC4wXG4iCi0gICAgICAgICsgIiAgICB9LFxuIgotICAgICAgICArICIgICAgXCJsaXN0X3ZhbHVlXCI6IFsxLjEyNSwgbnVsbF1cbiIKLSAgICAgICAgKyAiICB9XG4iCi0gICAgICAgICsgIn0iLCB0b0pzb25TdHJpbmcobWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlKTsKLQotICAgIGJ1aWxkZXIgPSBUZXN0U3RydWN0Lm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLnNldFZhbHVlKFZhbHVlLm5ld0J1aWxkZXIoKS5zZXROdWxsVmFsdWVWYWx1ZSgwKS5idWlsZCgpKTsKLSAgICBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcInZhbHVlXCI6IG51bGxcbiIKLSAgICAgICAgKyAifSIsIHRvSnNvblN0cmluZyhtZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKG1lc3NhZ2UpOwotCi0gICAgYnVpbGRlciA9IFRlc3RTdHJ1Y3QubmV3QnVpbGRlcigpOwotICAgIGxpc3RCdWlsZGVyID0gYnVpbGRlci5nZXRMaXN0VmFsdWVCdWlsZGVyKCk7Ci0gICAgbGlzdEJ1aWxkZXIuYWRkVmFsdWVzKFZhbHVlLm5ld0J1aWxkZXIoKS5zZXROdW1iZXJWYWx1ZSgzMTgzMS4xMjUpLmJ1aWxkKCkpOwotICAgIGxpc3RCdWlsZGVyLmFkZFZhbHVlcyhWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0TnVsbFZhbHVlVmFsdWUoMCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJsaXN0VmFsdWVcIjogWzMxODMxLjEyNSwgbnVsbF1cbiIKLSAgICAgICAgKyAifSIsIHRvSnNvblN0cmluZyhtZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEFueUZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBjb250ZW50ID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEyMzQpLmJ1aWxkKCk7Ci0gICAgVGVzdEFueSBtZXNzYWdlID0gVGVzdEFueS5uZXdCdWlsZGVyKCkuc2V0QW55VmFsdWUoQW55LnBhY2soY29udGVudCkpLmJ1aWxkKCk7Ci0KLSAgICAvLyBBIFR5cGVSZWdpc3RyeSBtdXN0IGJlIHByb3ZpZGVkIGluIG9yZGVyIHRvIGNvbnZlcnQgQW55IHR5cGVzLgotICAgIHRyeSB7Ci0gICAgICB0b0pzb25TdHJpbmcobWVzc2FnZSk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotCi0gICAgSnNvbkZvcm1hdC5UeXBlUmVnaXN0cnkgcmVnaXN0cnkgPSBKc29uRm9ybWF0LlR5cGVSZWdpc3RyeS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZChUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKS5idWlsZCgpOwotICAgIEpzb25Gb3JtYXQuUHJpbnRlciBwcmludGVyID0gSnNvbkZvcm1hdC5wcmludGVyKCkudXNpbmdUeXBlUmVnaXN0cnkocmVnaXN0cnkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiYW55VmFsdWVcIjoge1xuIgotICAgICAgICArICIgICAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vanNvbl90ZXN0LlRlc3RBbGxUeXBlc1wiLFxuIgotICAgICAgICArICIgICAgXCJvcHRpb25hbEludDMyXCI6IDEyMzRcbiIKLSAgICAgICAgKyAiICB9XG4iCi0gICAgICAgICsgIn0iICwgcHJpbnRlci5wcmludChtZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKG1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLQotCi0gICAgLy8gV2VsbC1rbm93biB0eXBlcyBoYXZlIGEgc3BlY2lhbCBmb3JtYXR0aW5nIHdoZW4gZW1iZWRkZWQgaW4gQW55LgotICAgIC8vCi0gICAgLy8gMS4gQW55IGluIEFueS4KLSAgICBBbnkgYW55TWVzc2FnZSA9IEFueS5wYWNrKEFueS5wYWNrKGNvbnRlbnQpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueVwiLFxuIgotICAgICAgICArICIgIFwidmFsdWVcIjoge1xuIgotICAgICAgICArICIgICAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vanNvbl90ZXN0LlRlc3RBbGxUeXBlc1wiLFxuIgotICAgICAgICArICIgICAgXCJvcHRpb25hbEludDMyXCI6IDEyMzRcbiIKLSAgICAgICAgKyAiICB9XG4iCi0gICAgICAgICsgIn0iLCBwcmludGVyLnByaW50KGFueU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoYW55TWVzc2FnZSwgcmVnaXN0cnkpOwotCi0gICAgLy8gMi4gV3JhcHBlcnMgaW4gQW55LgotICAgIGFueU1lc3NhZ2UgPSBBbnkucGFjayhJbnQzMlZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgxMjM0NSkuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiQHR5cGVcIjogXCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlXCIsXG4iCi0gICAgICAgICsgIiAgXCJ2YWx1ZVwiOiAxMjM0NVxuIgotICAgICAgICArICJ9IiwgcHJpbnRlci5wcmludChhbnlNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKGFueU1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLSAgICBhbnlNZXNzYWdlID0gQW55LnBhY2soVUludDMyVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDEyMzQ1KS5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlVJbnQzMlZhbHVlXCIsXG4iCi0gICAgICAgICsgIiAgXCJ2YWx1ZVwiOiAxMjM0NVxuIgotICAgICAgICArICJ9IiwgcHJpbnRlci5wcmludChhbnlNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKGFueU1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLSAgICBhbnlNZXNzYWdlID0gQW55LnBhY2soSW50NjRWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMTIzNDUpLmJ1aWxkKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcIkB0eXBlXCI6IFwidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuSW50NjRWYWx1ZVwiLFxuIgotICAgICAgICArICIgIFwidmFsdWVcIjogXCIxMjM0NVwiXG4iCi0gICAgICAgICsgIn0iLCBwcmludGVyLnByaW50KGFueU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoYW55TWVzc2FnZSwgcmVnaXN0cnkpOwotICAgIGFueU1lc3NhZ2UgPSBBbnkucGFjayhVSW50NjRWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMTIzNDUpLmJ1aWxkKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcIkB0eXBlXCI6IFwidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVUludDY0VmFsdWVcIixcbiIKLSAgICAgICAgKyAiICBcInZhbHVlXCI6IFwiMTIzNDVcIlxuIgotICAgICAgICArICJ9IiwgcHJpbnRlci5wcmludChhbnlNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKGFueU1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLSAgICBhbnlNZXNzYWdlID0gQW55LnBhY2soRmxvYXRWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoMTIzNDUpLmJ1aWxkKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcIkB0eXBlXCI6IFwidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuRmxvYXRWYWx1ZVwiLFxuIgotICAgICAgICArICIgIFwidmFsdWVcIjogMTIzNDUuMFxuIgotICAgICAgICArICJ9IiwgcHJpbnRlci5wcmludChhbnlNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKGFueU1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLSAgICBhbnlNZXNzYWdlID0gQW55LnBhY2soRG91YmxlVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDEyMzQ1KS5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkRvdWJsZVZhbHVlXCIsXG4iCi0gICAgICAgICsgIiAgXCJ2YWx1ZVwiOiAxMjM0NS4wXG4iCi0gICAgICAgICsgIn0iLCBwcmludGVyLnByaW50KGFueU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoYW55TWVzc2FnZSwgcmVnaXN0cnkpOwotICAgIGFueU1lc3NhZ2UgPSBBbnkucGFjayhCb29sVmFsdWUubmV3QnVpbGRlcigpLnNldFZhbHVlKHRydWUpLmJ1aWxkKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIKLSAgICAgICAgKyAiICBcIkB0eXBlXCI6IFwidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuQm9vbFZhbHVlXCIsXG4iCi0gICAgICAgICsgIiAgXCJ2YWx1ZVwiOiB0cnVlXG4iCi0gICAgICAgICsgIn0iLCBwcmludGVyLnByaW50KGFueU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoYW55TWVzc2FnZSwgcmVnaXN0cnkpOwotICAgIGFueU1lc3NhZ2UgPSBBbnkucGFjayhTdHJpbmdWYWx1ZS5uZXdCdWlsZGVyKCkuc2V0VmFsdWUoIkhlbGxvIikuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiQHR5cGVcIjogXCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5TdHJpbmdWYWx1ZVwiLFxuIgotICAgICAgICArICIgIFwidmFsdWVcIjogXCJIZWxsb1wiXG4iCi0gICAgICAgICsgIn0iLCBwcmludGVyLnByaW50KGFueU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoYW55TWVzc2FnZSwgcmVnaXN0cnkpOwotICAgIGFueU1lc3NhZ2UgPSBBbnkucGFjayhCeXRlc1ZhbHVlLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgKLSAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShuZXcgYnl0ZVtdezEsIDJ9KSkuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiQHR5cGVcIjogXCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlXCIsXG4iCi0gICAgICAgICsgIiAgXCJ2YWx1ZVwiOiBcIkFRST1cIlxuIgotICAgICAgICArICJ9IiwgcHJpbnRlci5wcmludChhbnlNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKGFueU1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLQotICAgIC8vIDMuIFRpbWVzdGFtcCBpbiBBbnkuCi0gICAgYW55TWVzc2FnZSA9IEFueS5wYWNrKFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCIxOTY5LTEyLTMxVDIzOjU5OjU5WiIpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcFwiLFxuIgotICAgICAgICArICIgIFwidmFsdWVcIjogXCIxOTY5LTEyLTMxVDIzOjU5OjU5WlwiXG4iCi0gICAgICAgICsgIn0iLCBwcmludGVyLnByaW50KGFueU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoYW55TWVzc2FnZSwgcmVnaXN0cnkpOwotCi0gICAgLy8gNC4gRHVyYXRpb24gaW4gQW55Ci0gICAgYW55TWVzc2FnZSA9IEFueS5wYWNrKFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIjEyMzQ1LjEwcyIpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uXCIsXG4iCi0gICAgICAgICsgIiAgXCJ2YWx1ZVwiOiBcIjEyMzQ1LjEwMHNcIlxuIgotICAgICAgICArICJ9IiwgcHJpbnRlci5wcmludChhbnlNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKGFueU1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLQotICAgIC8vIDUuIEZpZWxkTWFzayBpbiBBbnkKLSAgICBhbnlNZXNzYWdlID0gQW55LnBhY2soRmllbGRNYXNrVXRpbC5mcm9tU3RyaW5nKCJmb28uYmFyLGJheiIpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFza1wiLFxuIgotICAgICAgICArICIgIFwidmFsdWVcIjogXCJmb28uYmFyLGJhelwiXG4iCi0gICAgICAgICsgIn0iLCBwcmludGVyLnByaW50KGFueU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRSb3VuZFRyaXBFcXVhbHMoYW55TWVzc2FnZSwgcmVnaXN0cnkpOwotCi0gICAgLy8gNi4gU3RydWN0IGluIEFueQotICAgIFN0cnVjdC5CdWlsZGVyIHN0cnVjdEJ1aWxkZXIgPSBTdHJ1Y3QubmV3QnVpbGRlcigpOwotICAgIHN0cnVjdEJ1aWxkZXIuZ2V0TXV0YWJsZUZpZWxkcygpLnB1dCgKLSAgICAgICAgIm51bWJlciIsIFZhbHVlLm5ld0J1aWxkZXIoKS5zZXROdW1iZXJWYWx1ZSgxLjEyNSkuYnVpbGQoKSk7Ci0gICAgYW55TWVzc2FnZSA9IEFueS5wYWNrKHN0cnVjdEJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIgotICAgICAgICArICIgIFwiQHR5cGVcIjogXCJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5TdHJ1Y3RcIixcbiIKLSAgICAgICAgKyAiICBcInZhbHVlXCI6IHtcbiIKLSAgICAgICAgKyAiICAgIFwibnVtYmVyXCI6IDEuMTI1XG4iCi0gICAgICAgICsgIiAgfVxuIgotICAgICAgICArICJ9IiwgcHJpbnRlci5wcmludChhbnlNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0Um91bmRUcmlwRXF1YWxzKGFueU1lc3NhZ2UsIHJlZ2lzdHJ5KTsKLSAgICBWYWx1ZS5CdWlsZGVyIHZhbHVlQnVpbGRlciA9IFZhbHVlLm5ld0J1aWxkZXIoKTsKLSAgICB2YWx1ZUJ1aWxkZXIuc2V0TnVtYmVyVmFsdWUoMSk7Ci0gICAgYW55TWVzc2FnZSA9IEFueS5wYWNrKHZhbHVlQnVpbGRlci5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICsgIiAgXCJAdHlwZVwiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlZhbHVlXCIsXG4iCi0gICAgICAgICsgIiAgXCJ2YWx1ZVwiOiAxLjBcbiIKLSAgICAgICAgKyAifSIsIHByaW50ZXIucHJpbnQoYW55TWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhhbnlNZXNzYWdlLCByZWdpc3RyeSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyTWlzc2luZ1R5cGVVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgQW55LkJ1aWxkZXIgYnVpbGRlciA9IEFueS5uZXdCdWlsZGVyKCk7Ci0gICAgICBtZXJnZUZyb21Kc29uKAotICAgICAgICAgICJ7XG4iCi0gICAgICAgICAgKyAiICBcIm9wdGlvbmFsSW50MzJcIjogMTIzNFxuIgotICAgICAgICAgICsgIn0iLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyVW5leHBlY3RlZFR5cGVVcmwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgICBtZXJnZUZyb21Kc29uKAotICAgICAgICAgICJ7XG4iCi0gICAgICAgICAgKyAiICBcIkB0eXBlXCI6IFwidHlwZS5nb29nbGVhcGlzLmNvbS9qc29uX3Rlc3QuVGVzdEFsbFR5cGVzXCIsXG4iCi0gICAgICAgICAgKyAiICBcIm9wdGlvbmFsSW50MzJcIjogMTIzNDVcbiIKLSAgICAgICAgICArICJ9IiwgYnVpbGRlcik7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlclJlamVjdFRyYWlsaW5nQ29tbWEoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgICBtZXJnZUZyb21Kc29uKAotICAgICAgICAgICJ7XG4iCi0gICAgICAgICAgKyAiICBcIm9wdGlvbmFsSW50MzJcIjogMTIzNDUsXG4iCi0gICAgICAgICAgKyAifSIsIGJ1aWxkZXIpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIC8vIFRPRE8oeGlhb2ZlbmcpOiBHU09OIGFsbG93cyB0cmFpbGluZyBjb21tYSBpbiBhcnJheXMgZXZlbiBhZnRlciBJIHNldAotICAgIC8vIHRoZSBKc29uUmVhZGVyIHRvIG5vbi1sZW5pZW50IG1vZGUuIElmIHdlIHdhbnQgdG8gZW5mb3JjZSBzdHJpY3QgSlNPTgotICAgIC8vIGNvbXBsaWFuY2UsIHdlIG1pZ2h0IHdhbnQgdG8gc3dpdGNoIHRvIGEgZGlmZmVyZW50IEpTT04gcGFyc2VyIG9yCi0gICAgLy8gaW1wbGVtZW50IG9uZSBieSBvdXJzZWx2ZXMuCi0gICAgLy8gdHJ5IHsKLSAgICAvLyAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIC8vICAgSnNvbkZvcm1hdC5tZXJnZSgKLSAgICAvLyAgICAgICAie1xuIgotICAgIC8vICAgICAgICsgIiAgXCJyZXBlYXRlZEludDMyXCI6IFsxMjM0NSxdXG4iCi0gICAgLy8gICAgICAgKyAifSIsIGJ1aWxkZXIpOwotICAgIC8vICAgZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIC8vIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAvLyAgIC8vIEV4cGVjdGVkLgotICAgIC8vIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZXJSZWplY3RJbnZhbGlkQmFzZTY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0UmVqZWN0cygib3B0aW9uYWxCeXRlcyIsICIhQCMkIik7Ci0gICAgLy8gV2UgdXNlIHN0YW5kYXJkIEJBU0U2NCB3aXRoIHBhZGRpbmdzLgotICAgIGFzc2VydFJlamVjdHMoIm9wdGlvbmFsQnl0ZXMiLCAiQVFJIik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VyUmVqZWN0SW52YWxpZEVudW1WYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHRyeSB7Ci0gICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICAgIG1lcmdlRnJvbUpzb24oCi0gICAgICAgICAgIntcbiIKLSAgICAgICAgICArICIgIFwib3B0aW9uYWxOZXN0ZWRFbnVtXCI6IFwiWFhYXCJcbiIKLSAgICAgICAgICArICJ9IiwgYnVpbGRlcik7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDdXN0b21Kc29uTmFtZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RDdXN0b21Kc29uTmFtZSBtZXNzYWdlID0gVGVzdEN1c3RvbUpzb25OYW1lLm5ld0J1aWxkZXIoKS5zZXRWYWx1ZSgxMjM0NSkuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoIntcbiIgKyAiICBcIkB2YWx1ZVwiOiAxMjM0NVxuIiArICJ9IiwgSnNvbkZvcm1hdC5wcmludGVyKCkucHJpbnQobWVzc2FnZSkpOwotICAgIGFzc2VydFJvdW5kVHJpcEVxdWFscyhtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REZWZhdWx0R3NvbkRvZXNOb3RIdG1sRXNjYXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsU3RyaW5nKCI9IikuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iICsgIiAgXCJvcHRpb25hbFN0cmluZ1wiOiBcIj1cIiIgKyAiXG59IiwgSnNvbkZvcm1hdC5wcmludGVyKCkucHJpbnQobWVzc2FnZSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEluY2x1ZGluZ0RlZmF1bHRWYWx1ZUZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgIGFzc2VydEVxdWFscygie1xufSIsIEpzb25Gb3JtYXQucHJpbnRlcigpLnByaW50KG1lc3NhZ2UpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxJbnQzMlwiOiAwLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsSW50NjRcIjogXCIwXCIsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxVaW50MzJcIjogMCxcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbFVpbnQ2NFwiOiBcIjBcIixcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbFNpbnQzMlwiOiAwLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsU2ludDY0XCI6IFwiMFwiLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsRml4ZWQzMlwiOiAwLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsRml4ZWQ2NFwiOiBcIjBcIixcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbFNmaXhlZDMyXCI6IDAsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxTZml4ZWQ2NFwiOiBcIjBcIixcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbEZsb2F0XCI6IDAuMCxcbiIKLSAgICAgICAgICAgICsgIiAgXCJvcHRpb25hbERvdWJsZVwiOiAwLjAsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxCb29sXCI6IGZhbHNlLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsU3RyaW5nXCI6IFwiXCIsXG4iCi0gICAgICAgICAgICArICIgIFwib3B0aW9uYWxCeXRlc1wiOiBcIlwiLFxuIgotICAgICAgICAgICAgKyAiICBcIm9wdGlvbmFsTmVzdGVkRW51bVwiOiBcIkZPT1wiLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkSW50MzJcIjogW10sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRJbnQ2NFwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFVpbnQzMlwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFVpbnQ2NFwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFNpbnQzMlwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFNpbnQ2NFwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZEZpeGVkMzJcIjogW10sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRGaXhlZDY0XCI6IFtdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkU2ZpeGVkMzJcIjogW10sXG4iCi0gICAgICAgICAgICArICIgIFwicmVwZWF0ZWRTZml4ZWQ2NFwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZEZsb2F0XCI6IFtdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkRG91YmxlXCI6IFtdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkQm9vbFwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZFN0cmluZ1wiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZEJ5dGVzXCI6IFtdLFxuIgotICAgICAgICAgICAgKyAiICBcInJlcGVhdGVkTmVzdGVkTWVzc2FnZVwiOiBbXSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJyZXBlYXRlZE5lc3RlZEVudW1cIjogW11cbiIKLSAgICAgICAgICAgICsgIn0iLAotICAgICAgICBKc29uRm9ybWF0LnByaW50ZXIoKS5pbmNsdWRpbmdEZWZhdWx0VmFsdWVGaWVsZHMoKS5wcmludChtZXNzYWdlKSk7Ci0KLSAgICBUZXN0TWFwIG1hcE1lc3NhZ2UgPSBUZXN0TWFwLmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgIGFzc2VydEVxdWFscygie1xufSIsIEpzb25Gb3JtYXQucHJpbnRlcigpLnByaW50KG1hcE1lc3NhZ2UpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICJ7XG4iCi0gICAgICAgICAgICArICIgIFwiaW50MzJUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJpbnQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcInVpbnQzMlRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcInVpbnQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcInNpbnQzMlRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcInNpbnQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImZpeGVkMzJUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJmaXhlZDY0VG9JbnQzMk1hcFwiOiB7XG4iCi0gICAgICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICAgICArICIgIFwic2ZpeGVkMzJUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJzZml4ZWQ2NFRvSW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImJvb2xUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJzdHJpbmdUb0ludDMyTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJpbnQzMlRvSW50NjRNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9VaW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9VaW50NjRNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9TaW50MzJNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9TaW50NjRNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9GaXhlZDMyTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJpbnQzMlRvRml4ZWQ2NE1hcFwiOiB7XG4iCi0gICAgICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICAgICArICIgIFwiaW50MzJUb1NmaXhlZDMyTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfSxcbiIKLSAgICAgICAgICAgICsgIiAgXCJpbnQzMlRvU2ZpeGVkNjRNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9GbG9hdE1hcFwiOiB7XG4iCi0gICAgICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICAgICArICIgIFwiaW50MzJUb0RvdWJsZU1hcFwiOiB7XG4iCi0gICAgICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICAgICArICIgIFwiaW50MzJUb0Jvb2xNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9TdHJpbmdNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9CeXRlc01hcFwiOiB7XG4iCi0gICAgICAgICAgICArICIgIH0sXG4iCi0gICAgICAgICAgICArICIgIFwiaW50MzJUb01lc3NhZ2VNYXBcIjoge1xuIgotICAgICAgICAgICAgKyAiICB9LFxuIgotICAgICAgICAgICAgKyAiICBcImludDMyVG9FbnVtTWFwXCI6IHtcbiIKLSAgICAgICAgICAgICsgIiAgfVxuIgotICAgICAgICAgICAgKyAifSIsCi0gICAgICAgIEpzb25Gb3JtYXQucHJpbnRlcigpLmluY2x1ZGluZ0RlZmF1bHRWYWx1ZUZpZWxkcygpLnByaW50KG1hcE1lc3NhZ2UpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTIzNDUpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ7XG4iICsgIiAgXCJvcHRpb25hbEludDMyXCI6IDEyMzQ1XG4iICsgIn0iLCBKc29uRm9ybWF0LnByaW50ZXIoKS5wcmludChtZXNzYWdlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAie1xuIiArICIgIFwib3B0aW9uYWxfaW50MzJcIjogMTIzNDVcbiIgKyAifSIsCi0gICAgICAgIEpzb25Gb3JtYXQucHJpbnRlcigpLnByZXNlcnZpbmdQcm90b0ZpZWxkTmFtZXMoKS5wcmludChtZXNzYWdlKSk7Ci0KLSAgICAvLyBUaGUganNvbl9uYW1lIGZpZWxkIG9wdGlvbiBpcyBpZ25vcmVkIHdoZW4gY29uZmlndXJlZCB0byB1c2Ugb3JpZ2luYWwgcHJvdG8gZmllbGQgbmFtZXMuCi0gICAgVGVzdEN1c3RvbUpzb25OYW1lIG1lc3NhZ2VXaXRoQ3VzdG9tSnNvbk5hbWUgPQotICAgICAgICBUZXN0Q3VzdG9tSnNvbk5hbWUubmV3QnVpbGRlcigpLnNldFZhbHVlKDEyMzQ1KS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIntcbiIgKyAiICBcInZhbHVlXCI6IDEyMzQ1XG4iICsgIn0iLAotICAgICAgICBKc29uRm9ybWF0LnByaW50ZXIoKS5wcmVzZXJ2aW5nUHJvdG9GaWVsZE5hbWVzKCkucHJpbnQobWVzc2FnZVdpdGhDdXN0b21Kc29uTmFtZSkpOwotCi0gICAgLy8gUGFyc2VycyBhY2NlcHQgYm90aCBvcmlnaW5hbCBwcm90byBmaWVsZCBuYW1lcyBhbmQgbG93ZXJDYW1lbENhc2UgbmFtZXMuCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgSnNvbkZvcm1hdC5wYXJzZXIoKS5tZXJnZSgie1wib3B0aW9uYWxJbnQzMlwiOiAxMjM0NX0iLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNDUsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgSnNvbkZvcm1hdC5wYXJzZXIoKS5tZXJnZSgie1wib3B0aW9uYWxfaW50MzJcIjogNTQzMjF9IiwgYnVpbGRlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKDU0MzIxLCBidWlsZGVyLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9UaW1lVXRpbFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9UaW1lVXRpbFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMzMWIyYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhL3V0aWwvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvVGltZVV0aWxUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MDYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IG9yZy5qdW5pdC5Bc3NlcnQ7Ci0KLWltcG9ydCBqYXZhLnRleHQuUGFyc2VFeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqIFVuaXQgdGVzdHMgZm9yIHtAbGluayBUaW1lVXRpbH0uICovCi1wdWJsaWMgY2xhc3MgVGltZVV0aWxUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwdWJsaWMgdm9pZCB0ZXN0VGltZXN0YW1wU3RyaW5nRm9ybWF0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGltZXN0YW1wIHN0YXJ0ID0gVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjAwMDEtMDEtMDFUMDA6MDA6MDBaIik7Ci0gICAgVGltZXN0YW1wIGVuZCA9IFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCI5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVoiKTsKLSAgICBhc3NlcnRFcXVhbHMoVGltZVV0aWwuVElNRVNUQU1QX1NFQ09ORFNfTUlOLCBzdGFydC5nZXRTZWNvbmRzKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBzdGFydC5nZXROYW5vcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGltZVV0aWwuVElNRVNUQU1QX1NFQ09ORFNfTUFYLCBlbmQuZ2V0U2Vjb25kcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoOTk5OTk5OTk5LCBlbmQuZ2V0TmFub3MoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsIFRpbWVVdGlsLnRvU3RyaW5nKHN0YXJ0KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCI5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVoiLCBUaW1lVXRpbC50b1N0cmluZyhlbmQpKTsKLQotICAgIFRpbWVzdGFtcCB2YWx1ZSA9IFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCIxOTcwLTAxLTAxVDAwOjAwOjAwWiIpOwotICAgIGFzc2VydEVxdWFscygwLCB2YWx1ZS5nZXRTZWNvbmRzKCkpOwotICAgIGFzc2VydEVxdWFscygwLCB2YWx1ZS5nZXROYW5vcygpKTsKLQotICAgIC8vIFRlc3QgbmVnYXRpdmUgdGltZXN0YW1wcy4KLSAgICB2YWx1ZSA9IFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCIxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OVoiKTsKLSAgICBhc3NlcnRFcXVhbHMoLTEsIHZhbHVlLmdldFNlY29uZHMoKSk7Ci0gICAgLy8gTmFubyBwYXJ0IGlzIGluIHRoZSByYW5nZSBvZiBbMCwgOTk5OTk5OTk5XSBmb3IgVGltZXN0YW1wLgotICAgIGFzc2VydEVxdWFscyg5OTkwMDAwMDAsIHZhbHVlLmdldE5hbm9zKCkpOwotCi0gICAgLy8gVGVzdCB0aGF0IDMsIDYsIG9yIDkgZGlnaXRzIGFyZSB1c2VkIGZvciB0aGUgZnJhY3Rpb25hbCBwYXJ0LgotICAgIHZhbHVlID0gVGltZXN0YW1wLm5ld0J1aWxkZXIoKS5zZXROYW5vcygxMCkuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDAwMDAwMDEwWiIsIFRpbWVVdGlsLnRvU3RyaW5nKHZhbHVlKSk7Ci0gICAgdmFsdWUgPSBUaW1lc3RhbXAubmV3QnVpbGRlcigpLnNldE5hbm9zKDEwMDAwKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygiMTk3MC0wMS0wMVQwMDowMDowMC4wMDAwMTBaIiwgVGltZVV0aWwudG9TdHJpbmcodmFsdWUpKTsKLSAgICB2YWx1ZSA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0TmFub3MoMTAwMDAwMDApLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxOTcwLTAxLTAxVDAwOjAwOjAwLjAxMFoiLCBUaW1lVXRpbC50b1N0cmluZyh2YWx1ZSkpOwotCi0gICAgLy8gVGVzdCB0aGF0IHBhcnNpbmcgYWNjZXB0cyB0aW1lem9uZSBvZmZzZXRzLgotICAgIHZhbHVlID0gVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDEwKzA4OjAwIik7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxOTY5LTEyLTMxVDE2OjAwOjAwLjAxMFoiLCBUaW1lVXRpbC50b1N0cmluZyh2YWx1ZSkpOwotICAgIHZhbHVlID0gVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDEwLTA4OjAwIik7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxOTcwLTAxLTAxVDA4OjAwOjAwLjAxMFoiLCBUaW1lVXRpbC50b1N0cmluZyh2YWx1ZSkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2xhdGlsZSBib29sZWFuIHN0b3BQYXJzaW5nVGhyZWFkcyA9IGZhbHNlOwotICBwcml2YXRlIHZvbGF0aWxlIFN0cmluZyBlcnJvck1lc3NhZ2UgPSAiIjsKLQotICBwcml2YXRlIGNsYXNzIFBhcnNlVGltZXN0YW1wVGhyZWFkIGV4dGVuZHMgVGhyZWFkIHsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZ1tdIHN0cmluZ3M7Ci0gICAgcHJpdmF0ZSBmaW5hbCBUaW1lc3RhbXBbXSB2YWx1ZXM7Ci0gICAgcHVibGljIFBhcnNlVGltZXN0YW1wVGhyZWFkKFN0cmluZ1tdIHN0cmluZ3MsIFRpbWVzdGFtcFtdIHZhbHVlcykgewotICAgICAgdGhpcy5zdHJpbmdzID0gc3RyaW5nczsKLSAgICAgIHRoaXMudmFsdWVzID0gdmFsdWVzOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICAgIGludCBpbmRleCA9IDA7Ci0gICAgICB3aGlsZSAoIXN0b3BQYXJzaW5nVGhyZWFkcykgewotICAgICAgICBUaW1lc3RhbXAgcmVzdWx0OwotICAgICAgICB0cnkgewotICAgICAgICAgIHJlc3VsdCA9IFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKHN0cmluZ3NbaW5kZXhdKTsKLSAgICAgICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJGYWlsZWQgdG8gcGFyc2UgdGltZXN0YW1wOiAiICsgc3RyaW5nc1tpbmRleF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5nZXRTZWNvbmRzKCkgIT0gdmFsdWVzW2luZGV4XS5nZXRTZWNvbmRzKCkKLSAgICAgICAgICAgIHx8IHJlc3VsdC5nZXROYW5vcygpICE9IHZhbHVlc1tpbmRleF0uZ2V0TmFub3MoKSkgewotICAgICAgICAgIGVycm9yTWVzc2FnZSA9ICJBY3R1YWwgcmVzdWx0OiAiICsgcmVzdWx0LnRvU3RyaW5nKCkgKyAiLCBleHBlY3RlZDogIgotICAgICAgICAgICAgICArIHZhbHVlc1tpbmRleF0udG9TdHJpbmcoKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBpbmRleCA9IChpbmRleCArIDEpICUgc3RyaW5ncy5sZW5ndGg7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRpbWVzdGFtcENvbmN1cnJlbnRQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nW10gdGltZXN0YW1wU3RyaW5ncyA9IG5ldyBTdHJpbmdbXXsKLSAgICAgICIwMDAxLTAxLTAxVDAwOjAwOjAwWiIsCi0gICAgICAiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwKLSAgICAgICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsCi0gICAgICAiMTk2OS0xMi0zMVQyMzo1OTo1OS45OTlaIiwKLSAgICB9OwotICAgIFRpbWVzdGFtcFtdIHRpbWVzdGFtcFZhbHVlcyA9IG5ldyBUaW1lc3RhbXBbdGltZXN0YW1wU3RyaW5ncy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGltZXN0YW1wU3RyaW5ncy5sZW5ndGg7IGkrKykgewotICAgICAgdGltZXN0YW1wVmFsdWVzW2ldID0gVGltZVV0aWwucGFyc2VUaW1lc3RhbXAodGltZXN0YW1wU3RyaW5nc1tpXSk7Ci0gICAgfQotCi0gICAgZmluYWwgaW50IFRIUkVBRF9DT1VOVCA9IDE2OwotICAgIGZpbmFsIGludCBSVU5OSU5HX1RJTUUgPSA1MDAwOyAgLy8gaW4gbWlsbGlzZWNvbmRzLgotICAgIGZpbmFsIExpc3Q8VGhyZWFkPiB0aHJlYWRzID0gbmV3IEFycmF5TGlzdDxUaHJlYWQ+KCk7Ci0KLSAgICBzdG9wUGFyc2luZ1RocmVhZHMgPSBmYWxzZTsKLSAgICBlcnJvck1lc3NhZ2UgPSAiIjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFRIUkVBRF9DT1VOVDsgaSsrKSB7Ci0gICAgICBUaHJlYWQgdGhyZWFkID0gbmV3IFBhcnNlVGltZXN0YW1wVGhyZWFkKAotICAgICAgICAgIHRpbWVzdGFtcFN0cmluZ3MsIHRpbWVzdGFtcFZhbHVlcyk7Ci0gICAgICB0aHJlYWQuc3RhcnQoKTsKLSAgICAgIHRocmVhZHMuYWRkKHRocmVhZCk7Ci0gICAgfQotICAgIFRocmVhZC5zbGVlcChSVU5OSU5HX1RJTUUpOwotICAgIHN0b3BQYXJzaW5nVGhyZWFkcyA9IHRydWU7Ci0gICAgZm9yIChUaHJlYWQgdGhyZWFkIDogdGhyZWFkcykgewotICAgICAgdGhyZWFkLmpvaW4oKTsKLSAgICB9Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgZXJyb3JNZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUaW1ldGFtcEludmFsaWRGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgLy8gVmFsdWUgdG9vIHNtYWxsLgotICAgICAgVGltZXN0YW1wIHZhbHVlID0gVGltZXN0YW1wLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0U2Vjb25kcyhUaW1lVXRpbC5USU1FU1RBTVBfU0VDT05EU19NSU4gLSAxKS5idWlsZCgpOwotICAgICAgVGltZVV0aWwudG9TdHJpbmcodmFsdWUpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIFZhbHVlIHRvbyBsYXJnZS4KLSAgICAgIFRpbWVzdGFtcCB2YWx1ZSA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFNlY29uZHMoVGltZVV0aWwuVElNRVNUQU1QX1NFQ09ORFNfTUFYICsgMSkuYnVpbGQoKTsKLSAgICAgIFRpbWVVdGlsLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgLy8gSW52YWxpZCBuYW5vcyB2YWx1ZS4KLSAgICAgIFRpbWVzdGFtcCB2YWx1ZSA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0TmFub3MoLTEpLmJ1aWxkKCk7Ci0gICAgICBUaW1lVXRpbC50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gSW52YWxpZCBuYW5vcyB2YWx1ZS4KLSAgICAgIFRpbWVzdGFtcCB2YWx1ZSA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0TmFub3MoMTAwMDAwMDAwMCkuYnVpbGQoKTsKLSAgICAgIFRpbWVVdGlsLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBWYWx1ZSB0byBzbWFsbC4KLSAgICAgIFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCIwMDAwLTAxLTAxVDAwOjAwOjAwWiIpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gVmFsdWUgdG8gbGFyZ2UuCi0gICAgICBUaW1lVXRpbC5wYXJzZVRpbWVzdGFtcCgiMTAwMDAtMDEtMDFUMDA6MDA6MDBaIik7Ci0gICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBNaXNzaW5nICdUJy4KLSAgICAgIFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCIxOTcwLTAxLTAxIDAwOjAwOjAwWiIpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gTWlzc2luZyAnWicuCi0gICAgICBUaW1lVXRpbC5wYXJzZVRpbWVzdGFtcCgiMTk3MC0wMS0wMVQwMDowMDowMCIpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gSW52YWxpZCBvZmZzZXQuCi0gICAgICBUaW1lVXRpbC5wYXJzZVRpbWVzdGFtcCgiMTk3MC0wMS0wMVQwMDowMDowMCswMDAwIik7Ci0gICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBUcmFpbGluZyB0ZXh0LgotICAgICAgVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjE5NzAtMDEtMDFUMDA6MDA6MDBaMCIpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gSW52YWxpZCBuYW5vc2Vjb25kIHZhbHVlLgotICAgICAgVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjE5NzAtMDEtMDFUMDA6MDA6MDAuQUJDWiIpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHVyYXRpb25TdHJpbmdGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUaW1lc3RhbXAgc3RhcnQgPSBUaW1lVXRpbC5wYXJzZVRpbWVzdGFtcCgiMDAwMS0wMS0wMVQwMDowMDowMFoiKTsKLSAgICBUaW1lc3RhbXAgZW5kID0gVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjk5OTktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5WiIpOwotICAgIER1cmF0aW9uIGR1cmF0aW9uID0gVGltZVV0aWwuZGlzdGFuY2Uoc3RhcnQsIGVuZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIzMTU1Mzc4OTc1OTkuOTk5OTk5OTk5cyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0gICAgZHVyYXRpb24gPSBUaW1lVXRpbC5kaXN0YW5jZShlbmQsIHN0YXJ0KTsKLSAgICBhc3NlcnRFcXVhbHMoIi0zMTU1Mzc4OTc1OTkuOTk5OTk5OTk5cyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0KLSAgICAvLyBHZW5lcmF0ZWQgb3V0cHV0IHNob3VsZCBjb250YWluIDMsIDYsIG9yIDkgZnJhY3Rpb25hbCBkaWdpdHMuCi0gICAgZHVyYXRpb24gPSBEdXJhdGlvbi5uZXdCdWlsZGVyKCkuc2V0U2Vjb25kcygxKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygiMXMiLCBUaW1lVXRpbC50b1N0cmluZyhkdXJhdGlvbikpOwotICAgIGR1cmF0aW9uID0gRHVyYXRpb24ubmV3QnVpbGRlcigpLnNldE5hbm9zKDEwMDAwMDAwKS5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygiMC4wMTBzIiwgVGltZVV0aWwudG9TdHJpbmcoZHVyYXRpb24pKTsKLSAgICBkdXJhdGlvbiA9IER1cmF0aW9uLm5ld0J1aWxkZXIoKS5zZXROYW5vcygxMDAwMCkuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoIjAuMDAwMDEwcyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0gICAgZHVyYXRpb24gPSBEdXJhdGlvbi5uZXdCdWlsZGVyKCkuc2V0TmFub3MoMTApLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIwLjAwMDAwMDAxMHMiLCBUaW1lVXRpbC50b1N0cmluZyhkdXJhdGlvbikpOwotCi0gICAgLy8gUGFyc2luZyBhY2NlcHRzIGFuIGZyYWN0aW9uYWwgZGlnaXRzIGFzIGxvbmcgYXMgdGhleSBmaXQgaW50byBuYW5vCi0gICAgLy8gcHJlY2lzaW9uLgotICAgIGR1cmF0aW9uID0gVGltZVV0aWwucGFyc2VEdXJhdGlvbigiMC4xcyIpOwotICAgIGFzc2VydEVxdWFscygxMDAwMDAwMDAsIGR1cmF0aW9uLmdldE5hbm9zKCkpOwotICAgIGR1cmF0aW9uID0gVGltZVV0aWwucGFyc2VEdXJhdGlvbigiMC4wMDAxcyIpOwotICAgIGFzc2VydEVxdWFscygxMDAwMDAsIGR1cmF0aW9uLmdldE5hbm9zKCkpOwotICAgIGR1cmF0aW9uID0gVGltZVV0aWwucGFyc2VEdXJhdGlvbigiMC4wMDAwMDAxcyIpOwotICAgIGFzc2VydEVxdWFscygxMDAsIGR1cmF0aW9uLmdldE5hbm9zKCkpOwotCi0gICAgLy8gRHVyYXRpb24gbXVzdCBzdXBwb3J0IHJhbmdlIGZyb20gLTMxNSw1NzYsMDAwLDAwMHMgdG8gKzMxNTU3NjAwMDAwMHMKLSAgICAvLyB3aGljaCBpbmNsdWRlcyBuZWdhdGl2ZSB2YWx1ZXMuCi0gICAgZHVyYXRpb24gPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCIzMTU1NzYwMDAwMDAuOTk5OTk5OTk5cyIpOwotICAgIGFzc2VydEVxdWFscygzMTU1NzYwMDAwMDBMLCBkdXJhdGlvbi5nZXRTZWNvbmRzKCkpOwotICAgIGFzc2VydEVxdWFscyg5OTk5OTk5OTksIGR1cmF0aW9uLmdldE5hbm9zKCkpOwotICAgIGR1cmF0aW9uID0gVGltZVV0aWwucGFyc2VEdXJhdGlvbigiLTMxNTU3NjAwMDAwMC45OTk5OTk5OTlzIik7Ci0gICAgYXNzZXJ0RXF1YWxzKC0zMTU1NzYwMDAwMDBMLCBkdXJhdGlvbi5nZXRTZWNvbmRzKCkpOwotICAgIGFzc2VydEVxdWFscygtOTk5OTk5OTk5LCBkdXJhdGlvbi5nZXROYW5vcygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REdXJhdGlvbkludmFsaWRGb3JtYXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgLy8gVmFsdWUgdG9vIHNtYWxsLgotICAgICAgRHVyYXRpb24gdmFsdWUgPSBEdXJhdGlvbi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFNlY29uZHMoVGltZVV0aWwuRFVSQVRJT05fU0VDT05EU19NSU4gLSAxKS5idWlsZCgpOwotICAgICAgVGltZVV0aWwudG9TdHJpbmcodmFsdWUpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIFZhbHVlIHRvbyBsYXJnZS4KLSAgICAgIER1cmF0aW9uIHZhbHVlID0gRHVyYXRpb24ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRTZWNvbmRzKFRpbWVVdGlsLkRVUkFUSU9OX1NFQ09ORFNfTUFYICsgMSkuYnVpbGQoKTsKLSAgICAgIFRpbWVVdGlsLnRvU3RyaW5nKHZhbHVlKTsKLSAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLSAgICAKLSAgICB0cnkgewotICAgICAgLy8gSW52YWxpZCBuYW5vcyB2YWx1ZS4KLSAgICAgIER1cmF0aW9uIHZhbHVlID0gRHVyYXRpb24ubmV3QnVpbGRlcigpLnNldFNlY29uZHMoMSkuc2V0TmFub3MoLTEpCi0gICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICBUaW1lVXRpbC50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gSW52YWxpZCBuYW5vcyB2YWx1ZS4KLSAgICAgIER1cmF0aW9uIHZhbHVlID0gRHVyYXRpb24ubmV3QnVpbGRlcigpLnNldFNlY29uZHMoLTEpLnNldE5hbm9zKDEpCi0gICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICBUaW1lVXRpbC50b1N0cmluZyh2YWx1ZSk7Ci0gICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gVmFsdWUgdG9vIHNtYWxsLgotICAgICAgVGltZVV0aWwucGFyc2VEdXJhdGlvbigiLTMxNTU3NjAwMDAwMXMiKTsKLSAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIFZhbHVlIHRvbyBsYXJnZS4KLSAgICAgIFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIjMxNTU3NjAwMDAwMXMiKTsKLSAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIEVtcHR5LgotICAgICAgVGltZVV0aWwucGFyc2VEdXJhdGlvbigiIik7Ci0gICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICAvLyBNaXNzaW5nICJzIi4KLSAgICAgIFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIjAiKTsKLSAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoUGFyc2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIC8vIEludmFsaWQgdHJhaWxpbmcgZGF0YS4KLSAgICAgIFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIjBzMCIpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChQYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBFeHBlY3RlZC4KLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgLy8gSW52YWxpZCBwcmVmaXguCi0gICAgICBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCItLTFzIik7Ci0gICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIGlzIGV4cGVjdGVkLiIpOwotICAgIH0gY2F0Y2ggKFBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUaW1lc3RhbXBDb252ZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9Ci0gICAgICBUaW1lVXRpbC5wYXJzZVRpbWVzdGFtcCgiMTk3MC0wMS0wMVQwMDowMDowMS4xMTExMTExMTFaIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDExMTExMTExMTEsIFRpbWVVdGlsLnRvTmFub3ModGltZXN0YW1wKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExMTExMTEsIFRpbWVVdGlsLnRvTWljcm9zKHRpbWVzdGFtcCkpOwotICAgIGFzc2VydEVxdWFscygxMTExLCBUaW1lVXRpbC50b01pbGxpcyh0aW1lc3RhbXApKTsKLSAgICB0aW1lc3RhbXAgPSBUaW1lVXRpbC5jcmVhdGVUaW1lc3RhbXBGcm9tTmFub3MoMTExMTExMTExMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxOTcwLTAxLTAxVDAwOjAwOjAxLjExMTExMTExMVoiLCBUaW1lVXRpbC50b1N0cmluZyh0aW1lc3RhbXApKTsKLSAgICB0aW1lc3RhbXAgPSBUaW1lVXRpbC5jcmVhdGVUaW1lc3RhbXBGcm9tTWljcm9zKDExMTExMTEpOwotICAgIGFzc2VydEVxdWFscygiMTk3MC0wMS0wMVQwMDowMDowMS4xMTExMTFaIiwgVGltZVV0aWwudG9TdHJpbmcodGltZXN0YW1wKSk7Ci0gICAgdGltZXN0YW1wID0gVGltZVV0aWwuY3JlYXRlVGltZXN0YW1wRnJvbU1pbGxpcygxMTExKTsKLSAgICBhc3NlcnRFcXVhbHMoIjE5NzAtMDEtMDFUMDA6MDA6MDEuMTExWiIsIFRpbWVVdGlsLnRvU3RyaW5nKHRpbWVzdGFtcCkpOwotICAgIAotICAgIHRpbWVzdGFtcCA9IFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCIxOTY5LTEyLTMxVDIzOjU5OjU5LjExMTExMTExMVoiKTsKLSAgICBhc3NlcnRFcXVhbHMoLTg4ODg4ODg4OSwgVGltZVV0aWwudG9OYW5vcyh0aW1lc3RhbXApKTsKLSAgICBhc3NlcnRFcXVhbHMoLTg4ODg4OSwgVGltZVV0aWwudG9NaWNyb3ModGltZXN0YW1wKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC04ODksIFRpbWVVdGlsLnRvTWlsbGlzKHRpbWVzdGFtcCkpOwotICAgIHRpbWVzdGFtcCA9IFRpbWVVdGlsLmNyZWF0ZVRpbWVzdGFtcEZyb21OYW5vcygtODg4ODg4ODg5KTsKLSAgICBhc3NlcnRFcXVhbHMoIjE5NjktMTItMzFUMjM6NTk6NTkuMTExMTExMTExWiIsIFRpbWVVdGlsLnRvU3RyaW5nKHRpbWVzdGFtcCkpOwotICAgIHRpbWVzdGFtcCA9IFRpbWVVdGlsLmNyZWF0ZVRpbWVzdGFtcEZyb21NaWNyb3MoLTg4ODg4OSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxOTY5LTEyLTMxVDIzOjU5OjU5LjExMTExMVoiLCBUaW1lVXRpbC50b1N0cmluZyh0aW1lc3RhbXApKTsKLSAgICB0aW1lc3RhbXAgPSBUaW1lVXRpbC5jcmVhdGVUaW1lc3RhbXBGcm9tTWlsbGlzKC04ODkpOwotICAgIGFzc2VydEVxdWFscygiMTk2OS0xMi0zMVQyMzo1OTo1OS4xMTFaIiwgVGltZVV0aWwudG9TdHJpbmcodGltZXN0YW1wKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHVyYXRpb25Db252ZXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRHVyYXRpb24gZHVyYXRpb24gPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCIxLjExMTExMTExMXMiKTsKLSAgICBhc3NlcnRFcXVhbHMoMTExMTExMTExMSwgVGltZVV0aWwudG9OYW5vcyhkdXJhdGlvbikpOwotICAgIGFzc2VydEVxdWFscygxMTExMTExLCBUaW1lVXRpbC50b01pY3JvcyhkdXJhdGlvbikpOwotICAgIGFzc2VydEVxdWFscygxMTExLCBUaW1lVXRpbC50b01pbGxpcyhkdXJhdGlvbikpOwotICAgIGR1cmF0aW9uID0gVGltZVV0aWwuY3JlYXRlRHVyYXRpb25Gcm9tTmFub3MoMTExMTExMTExMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIxLjExMTExMTExMXMiLCBUaW1lVXRpbC50b1N0cmluZyhkdXJhdGlvbikpOwotICAgIGR1cmF0aW9uID0gVGltZVV0aWwuY3JlYXRlRHVyYXRpb25Gcm9tTWljcm9zKDExMTExMTEpOwotICAgIGFzc2VydEVxdWFscygiMS4xMTExMTFzIiwgVGltZVV0aWwudG9TdHJpbmcoZHVyYXRpb24pKTsKLSAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLmNyZWF0ZUR1cmF0aW9uRnJvbU1pbGxpcygxMTExKTsKLSAgICBhc3NlcnRFcXVhbHMoIjEuMTExcyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0gICAgCi0gICAgZHVyYXRpb24gPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCItMS4xMTExMTExMTFzIik7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xMTExMTExMTExLCBUaW1lVXRpbC50b05hbm9zKGR1cmF0aW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xMTExMTExLCBUaW1lVXRpbC50b01pY3JvcyhkdXJhdGlvbikpOwotICAgIGFzc2VydEVxdWFscygtMTExMSwgVGltZVV0aWwudG9NaWxsaXMoZHVyYXRpb24pKTsKLSAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLmNyZWF0ZUR1cmF0aW9uRnJvbU5hbm9zKC0xMTExMTExMTExKTsKLSAgICBhc3NlcnRFcXVhbHMoIi0xLjExMTExMTExMXMiLCBUaW1lVXRpbC50b1N0cmluZyhkdXJhdGlvbikpOwotICAgIGR1cmF0aW9uID0gVGltZVV0aWwuY3JlYXRlRHVyYXRpb25Gcm9tTWljcm9zKC0xMTExMTExKTsKLSAgICBhc3NlcnRFcXVhbHMoIi0xLjExMTExMXMiLCBUaW1lVXRpbC50b1N0cmluZyhkdXJhdGlvbikpOwotICAgIGR1cmF0aW9uID0gVGltZVV0aWwuY3JlYXRlRHVyYXRpb25Gcm9tTWlsbGlzKC0xMTExKTsKLSAgICBhc3NlcnRFcXVhbHMoIi0xLjExMXMiLCBUaW1lVXRpbC50b1N0cmluZyhkdXJhdGlvbikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRpbWVPcGVyYXRpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGltZXN0YW1wIHN0YXJ0ID0gVGltZVV0aWwucGFyc2VUaW1lc3RhbXAoIjAwMDEtMDEtMDFUMDA6MDA6MDBaIik7Ci0gICAgVGltZXN0YW1wIGVuZCA9IFRpbWVVdGlsLnBhcnNlVGltZXN0YW1wKCI5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVoiKTsKLQotICAgIER1cmF0aW9uIGR1cmF0aW9uID0gVGltZVV0aWwuZGlzdGFuY2Uoc3RhcnQsIGVuZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCIzMTU1Mzc4OTc1OTkuOTk5OTk5OTk5cyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0gICAgVGltZXN0YW1wIHZhbHVlID0gVGltZVV0aWwuYWRkKHN0YXJ0LCBkdXJhdGlvbik7Ci0gICAgYXNzZXJ0RXF1YWxzKGVuZCwgdmFsdWUpOwotICAgIHZhbHVlID0gVGltZVV0aWwuc3VidHJhY3QoZW5kLCBkdXJhdGlvbik7Ci0gICAgYXNzZXJ0RXF1YWxzKHN0YXJ0LCB2YWx1ZSk7Ci0KLSAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLmRpc3RhbmNlKGVuZCwgc3RhcnQpOwotICAgIGFzc2VydEVxdWFscygiLTMxNTUzNzg5NzU5OS45OTk5OTk5OTlzIiwgVGltZVV0aWwudG9TdHJpbmcoZHVyYXRpb24pKTsKLSAgICB2YWx1ZSA9IFRpbWVVdGlsLmFkZChlbmQsIGR1cmF0aW9uKTsKLSAgICBhc3NlcnRFcXVhbHMoc3RhcnQsIHZhbHVlKTsKLSAgICB2YWx1ZSA9IFRpbWVVdGlsLnN1YnRyYWN0KHN0YXJ0LCBkdXJhdGlvbik7Ci0gICAgYXNzZXJ0RXF1YWxzKGVuZCwgdmFsdWUpOwotCi0gICAgLy8gUmVzdWx0IGlzIGxhcmdlciB0aGFuIExvbmcuTUFYX1ZBTFVFLgotICAgIHRyeSB7Ci0gICAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIjMxNTUzNzg5NzU5OS45OTk5OTk5OTlzIik7Ci0gICAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLm11bHRpcGx5KGR1cmF0aW9uLCAzMTU1Mzc4OTc1OTkuOTk5OTk5OTk5KTsKLSAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gaXMgZXhwZWN0ZWQuIik7Ci0gICAgfSBjYXRjaCAoSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIEV4cGVjdGVkLgotICAgIH0KLQotICAgIC8vIFJlc3VsdCBpcyBsZXNzZXIgdGhhbiBMb25nLk1JTl9WQUxVRS4KLSAgICB0cnkgewotICAgICAgZHVyYXRpb24gPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCIzMTU1Mzc4OTc1OTkuOTk5OTk5OTk5cyIpOwotICAgICAgZHVyYXRpb24gPSBUaW1lVXRpbC5tdWx0aXBseShkdXJhdGlvbiwgLTMxNTUzNzg5NzU5OS45OTk5OTk5OTkpOwotICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiBpcyBleHBlY3RlZC4iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQuCi0gICAgfQotCi0gICAgZHVyYXRpb24gPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCItMS4xMjVzIik7Ci0gICAgZHVyYXRpb24gPSBUaW1lVXRpbC5kaXZpZGUoZHVyYXRpb24sIDIuMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCItMC41NjI1MDBzIiwgVGltZVV0aWwudG9TdHJpbmcoZHVyYXRpb24pKTsKLSAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLm11bHRpcGx5KGR1cmF0aW9uLCAyLjApOwotICAgIGFzc2VydEVxdWFscygiLTEuMTI1cyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0KLSAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLmFkZChkdXJhdGlvbiwgZHVyYXRpb24pOwotICAgIGFzc2VydEVxdWFscygiLTIuMjUwcyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0gICAgCi0gICAgZHVyYXRpb24gPSBUaW1lVXRpbC5zdWJ0cmFjdChkdXJhdGlvbiwgVGltZVV0aWwucGFyc2VEdXJhdGlvbigiLTFzIikpOwotICAgIGFzc2VydEVxdWFscygiLTEuMjUwcyIsIFRpbWVVdGlsLnRvU3RyaW5nKGR1cmF0aW9uKSk7Ci0gICAgCi0gICAgLy8gTXVsdGlwbGljYXRpb25zICh3aXRoIHJlc3VsdHMgbGFyZ2VyIHRoYW4gTG9uZy5NQVhfVkFMVUUgaW4gbmFub3NlY29uZHMpLgotICAgIGR1cmF0aW9uID0gVGltZVV0aWwucGFyc2VEdXJhdGlvbigiMC45OTk5OTk5OTlzIik7Ci0gICAgYXNzZXJ0RXF1YWxzKCIzMTU1NzU5OTk2ODQuNDI0cyIsCi0gICAgICBUaW1lVXRpbC50b1N0cmluZyhUaW1lVXRpbC5tdWx0aXBseShkdXJhdGlvbiwgMzE1NTc2MDAwMDAwTCkpKTsKLSAgICBkdXJhdGlvbiA9IFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIi0wLjk5OTk5OTk5OXMiKTsKLSAgICBhc3NlcnRFcXVhbHMoIi0zMTU1NzU5OTk2ODQuNDI0cyIsCi0gICAgICBUaW1lVXRpbC50b1N0cmluZyhUaW1lVXRpbC5tdWx0aXBseShkdXJhdGlvbiwgMzE1NTc2MDAwMDAwTCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjMxNTU3NTk5OTY4NC40MjRzIiwKLSAgICAgIFRpbWVVdGlsLnRvU3RyaW5nKFRpbWVVdGlsLm11bHRpcGx5KGR1cmF0aW9uLCAtMzE1NTc2MDAwMDAwTCkpKTsKLSAgICAKLSAgICAvLyBEaXZpc2lvbnMgKHdpdGggdmFsdWVzIGxhcmdlciB0aGFuIExvbmcuTUFYX1ZBTFVFIGluIG5hbm9zZWNvbmRzKS4KLSAgICBEdXJhdGlvbiBkMSA9IFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIjMxNTU3NjAwMDAwMHMiKTsKLSAgICBEdXJhdGlvbiBkMiA9IFRpbWVVdGlsLnN1YnRyYWN0KGQxLCBUaW1lVXRpbC5jcmVhdGVEdXJhdGlvbkZyb21OYW5vcygxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIFRpbWVVdGlsLmRpdmlkZShkMSwgZDIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgVGltZVV0aWwuZGl2aWRlKGQyLCBkMSkpOwotICAgIGFzc2VydEVxdWFscygiMC4wMDAwMDAwMDFzIiwgVGltZVV0aWwudG9TdHJpbmcoVGltZVV0aWwucmVtYWluZGVyKGQxLCBkMikpKTsKLSAgICBhc3NlcnRFcXVhbHMoIjMxNTU3NTk5OTk5OS45OTk5OTk5OTlzIiwKLSAgICAgIFRpbWVVdGlsLnRvU3RyaW5nKFRpbWVVdGlsLnJlbWFpbmRlcihkMiwgZDEpKSk7Ci0gICAgCi0gICAgLy8gRGl2aXNpb25zIGludm9sdmluZyBuZWdhdGl2ZSB2YWx1ZXMuCi0gICAgLy8KLSAgICAvLyAoLTUpIC8gMiA9IC0yLCByZW1haW5kZXIgPSAtMQotICAgIGQxID0gVGltZVV0aWwucGFyc2VEdXJhdGlvbigiLTVzIik7Ci0gICAgZDIgPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCIycyIpOwotICAgIGFzc2VydEVxdWFscygtMiwgVGltZVV0aWwuZGl2aWRlKGQxLCBkMikpOwotICAgIGFzc2VydEVxdWFscygtMiwgVGltZVV0aWwuZGl2aWRlKGQxLCAyKS5nZXRTZWNvbmRzKCkpOwotICAgIGFzc2VydEVxdWFscygtMSwgVGltZVV0aWwucmVtYWluZGVyKGQxLCBkMikuZ2V0U2Vjb25kcygpKTsKLSAgICAvLyAoLTUpIC8gKC0yKSA9IDIsIHJlbWFpbmRlciA9IC0xCi0gICAgZDEgPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCItNXMiKTsKLSAgICBkMiA9IFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIi0ycyIpOwotICAgIGFzc2VydEVxdWFscygyLCBUaW1lVXRpbC5kaXZpZGUoZDEsIGQyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIFRpbWVVdGlsLmRpdmlkZShkMSwgLTIpLmdldFNlY29uZHMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xLCBUaW1lVXRpbC5yZW1haW5kZXIoZDEsIGQyKS5nZXRTZWNvbmRzKCkpOwotICAgIC8vIDUgLyAoLTIpID0gLTIsIHJlbWFpbmRlciA9IDEKLSAgICBkMSA9IFRpbWVVdGlsLnBhcnNlRHVyYXRpb24oIjVzIik7Ci0gICAgZDIgPSBUaW1lVXRpbC5wYXJzZUR1cmF0aW9uKCItMnMiKTsKLSAgICBhc3NlcnRFcXVhbHMoLTIsIFRpbWVVdGlsLmRpdmlkZShkMSwgZDIpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTIsIFRpbWVVdGlsLmRpdmlkZShkMSwgLTIpLmdldFNlY29uZHMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIFRpbWVVdGlsLnJlbWFpbmRlcihkMSwgZDIpLmdldFNlY29uZHMoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmEvdXRpbC9zcmMvdGVzdC9wcm90by9jb20vZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl90ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3Rlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY4NmVkYzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YS91dGlsL3NyYy90ZXN0L3Byb3RvL2NvbS9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3Rlc3QucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBqc29uX3Rlc3Q7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1Zi51dGlsIjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJKc29uVGVzdFByb3RvIjsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIjsKLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90byI7Ci1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wcm90byI7Ci1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvIjsKLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90byI7Ci0KLW1lc3NhZ2UgVGVzdEFsbFR5cGVzIHsKLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBGT08gPSAwOwotICAgIEJBUiA9IDE7Ci0gICAgQkFaID0gMjsKLSAgfQotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIGludDMyIHZhbHVlID0gMTsKLSAgfQotCi0gIGludDMyIG9wdGlvbmFsX2ludDMyID0gMTsKLSAgaW50NjQgb3B0aW9uYWxfaW50NjQgPSAyOwotICB1aW50MzIgb3B0aW9uYWxfdWludDMyID0gMzsKLSAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCA9IDQ7Ci0gIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgPSA1OwotICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ID0gNjsKLSAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyID0gNzsKLSAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ID0gODsKLSAgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSA5OwotICBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOwotICBmbG9hdCBvcHRpb25hbF9mbG9hdCA9IDExOwotICBkb3VibGUgb3B0aW9uYWxfZG91YmxlID0gMTI7Ci0gIGJvb2wgb3B0aW9uYWxfYm9vbCA9IDEzOwotICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nID0gMTQ7Ci0gIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gMTU7Ci0gIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSAxODsKLSAgTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bSA9IDIxOwotCi0gIC8vIFJlcGVhdGVkCi0gIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyID0gMzE7Ci0gIHJlcGVhdGVkIGludDY0IHJlcGVhdGVkX2ludDY0ID0gMzI7Ci0gIHJlcGVhdGVkIHVpbnQzMiByZXBlYXRlZF91aW50MzIgPSAzMzsKLSAgcmVwZWF0ZWQgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCA9IDM0OwotICByZXBlYXRlZCBzaW50MzIgcmVwZWF0ZWRfc2ludDMyID0gMzU7Ci0gIHJlcGVhdGVkIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgPSAzNjsKLSAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gMzc7Ci0gIHJlcGVhdGVkIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCA9IDM4OwotICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOwotICByZXBlYXRlZCBmbG9hdCByZXBlYXRlZF9mbG9hdCA9IDQxOwotICByZXBlYXRlZCBkb3VibGUgcmVwZWF0ZWRfZG91YmxlID0gNDI7Ci0gIHJlcGVhdGVkIGJvb2wgcmVwZWF0ZWRfYm9vbCA9IDQzOwotICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nID0gNDQ7Ci0gIHJlcGVhdGVkIGJ5dGVzIHJlcGVhdGVkX2J5dGVzID0gNDU7Ci0gIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPSA0ODsKLSAgcmVwZWF0ZWQgTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bSA9IDUxOwotfQotCi1tZXNzYWdlIFRlc3RPbmVvZiB7Ci0gIG9uZW9mIG9uZW9mX2ZpZWxkIHsKLSAgICBpbnQzMiBvbmVvZl9pbnQzMiA9IDE7Ci0gICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2Ugb25lb2ZfbmVzdGVkX21lc3NhZ2UgPSAyOwotICB9Ci19Ci0KLW1lc3NhZ2UgVGVzdE1hcCB7Ci0gIC8vIEluc3RlYWQgb2YgdGVzdGluZyBhbGwgY29tYmluYXRpb25zICh0b28gbWFueSksIHdlIG9ubHkgbWFrZSBzdXJlIGFsbAotICAvLyB2YWxpZCB0eXBlcyBoYXZlIGJlZW4gdXNlZCBhdCBsZWFzdCBpbiBvbmUgZmllbGQgYXMga2V5IGFuZCBpbiBvbmUKLSAgLy8gZmllbGQgYXMgdmFsdWUuCi0gIG1hcDxpbnQzMiwgaW50MzI+IGludDMyX3RvX2ludDMyX21hcCA9IDE7Ci0gIG1hcDxpbnQ2NCwgaW50MzI+IGludDY0X3RvX2ludDMyX21hcCA9IDI7Ci0gIG1hcDx1aW50MzIsIGludDMyPiB1aW50MzJfdG9faW50MzJfbWFwID0gMzsKLSAgbWFwPHVpbnQ2NCwgaW50MzI+IHVpbnQ2NF90b19pbnQzMl9tYXAgPSA0OwotICBtYXA8c2ludDMyLCBpbnQzMj4gc2ludDMyX3RvX2ludDMyX21hcCA9IDU7Ci0gIG1hcDxzaW50NjQsIGludDMyPiBzaW50NjRfdG9faW50MzJfbWFwID0gNjsKLSAgbWFwPGZpeGVkMzIsIGludDMyPiBmaXhlZDMyX3RvX2ludDMyX21hcCA9IDc7Ci0gIG1hcDxmaXhlZDY0LCBpbnQzMj4gZml4ZWQ2NF90b19pbnQzMl9tYXAgPSA4OwotICBtYXA8c2ZpeGVkMzIsIGludDMyPiBzZml4ZWQzMl90b19pbnQzMl9tYXAgPSA5OwotICBtYXA8c2ZpeGVkNjQsIGludDMyPiBzZml4ZWQ2NF90b19pbnQzMl9tYXAgPSAxMDsKLSAgbWFwPGJvb2wsIGludDMyPiBib29sX3RvX2ludDMyX21hcCA9IDExOwotICBtYXA8c3RyaW5nLCBpbnQzMj4gc3RyaW5nX3RvX2ludDMyX21hcCA9IDEyOwotCi0gIG1hcDxpbnQzMiwgaW50NjQ+IGludDMyX3RvX2ludDY0X21hcCA9IDEwMTsKLSAgbWFwPGludDMyLCB1aW50MzI+IGludDMyX3RvX3VpbnQzMl9tYXAgPSAxMDI7Ci0gIG1hcDxpbnQzMiwgdWludDY0PiBpbnQzMl90b191aW50NjRfbWFwID0gMTAzOwotICBtYXA8aW50MzIsIHNpbnQzMj4gaW50MzJfdG9fc2ludDMyX21hcCA9IDEwNDsKLSAgbWFwPGludDMyLCBzaW50NjQ+IGludDMyX3RvX3NpbnQ2NF9tYXAgPSAxMDU7Ci0gIG1hcDxpbnQzMiwgZml4ZWQzMj4gaW50MzJfdG9fZml4ZWQzMl9tYXAgPSAxMDY7Ci0gIG1hcDxpbnQzMiwgZml4ZWQ2ND4gaW50MzJfdG9fZml4ZWQ2NF9tYXAgPSAxMDc7Ci0gIG1hcDxpbnQzMiwgc2ZpeGVkMzI+IGludDMyX3RvX3NmaXhlZDMyX21hcCA9IDEwODsKLSAgbWFwPGludDMyLCBzZml4ZWQ2ND4gaW50MzJfdG9fc2ZpeGVkNjRfbWFwID0gMTA5OwotICBtYXA8aW50MzIsIGZsb2F0PiBpbnQzMl90b19mbG9hdF9tYXAgPSAxMTA7Ci0gIG1hcDxpbnQzMiwgZG91YmxlPiBpbnQzMl90b19kb3VibGVfbWFwID0gMTExOwotICBtYXA8aW50MzIsIGJvb2w+IGludDMyX3RvX2Jvb2xfbWFwID0gMTEyOwotICBtYXA8aW50MzIsIHN0cmluZz4gaW50MzJfdG9fc3RyaW5nX21hcCA9IDExMzsKLSAgbWFwPGludDMyLCBieXRlcz4gaW50MzJfdG9fYnl0ZXNfbWFwID0gMTE0OwotICBtYXA8aW50MzIsIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlPiBpbnQzMl90b19tZXNzYWdlX21hcCA9IDExNTsKLSAgbWFwPGludDMyLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bT4gaW50MzJfdG9fZW51bV9tYXAgPSAxMTY7Ci19Ci0KLW1lc3NhZ2UgVGVzdFdyYXBwZXJzIHsKLSAgZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWUgaW50MzJfdmFsdWUgPSAxOwotICBnb29nbGUucHJvdG9idWYuVUludDMyVmFsdWUgdWludDMyX3ZhbHVlID0gMjsKLSAgZ29vZ2xlLnByb3RvYnVmLkludDY0VmFsdWUgaW50NjRfdmFsdWUgPSAzOwotICBnb29nbGUucHJvdG9idWYuVUludDY0VmFsdWUgdWludDY0X3ZhbHVlID0gNDsKLSAgZ29vZ2xlLnByb3RvYnVmLkZsb2F0VmFsdWUgZmxvYXRfdmFsdWUgPSA1OwotICBnb29nbGUucHJvdG9idWYuRG91YmxlVmFsdWUgZG91YmxlX3ZhbHVlID0gNjsKLSAgZ29vZ2xlLnByb3RvYnVmLkJvb2xWYWx1ZSBib29sX3ZhbHVlID0gNzsKLSAgZ29vZ2xlLnByb3RvYnVmLlN0cmluZ1ZhbHVlIHN0cmluZ192YWx1ZSA9IDg7Ci0gIGdvb2dsZS5wcm90b2J1Zi5CeXRlc1ZhbHVlIGJ5dGVzX3ZhbHVlID0gOTsKLX0KLQotbWVzc2FnZSBUZXN0VGltZXN0YW1wIHsKLSAgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCB0aW1lc3RhbXBfdmFsdWUgPSAxOwotfQotCi1tZXNzYWdlIFRlc3REdXJhdGlvbiB7Ci0gIGdvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiBkdXJhdGlvbl92YWx1ZSA9IDE7Ci19Ci0KLW1lc3NhZ2UgVGVzdEZpZWxkTWFzayB7Ci0gIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE1hc2sgZmllbGRfbWFza192YWx1ZSA9IDE7Ci19Ci0KLW1lc3NhZ2UgVGVzdFN0cnVjdCB7Ci0gIGdvb2dsZS5wcm90b2J1Zi5TdHJ1Y3Qgc3RydWN0X3ZhbHVlID0gMTsKLSAgZ29vZ2xlLnByb3RvYnVmLlZhbHVlIHZhbHVlID0gMjsKLSAgZ29vZ2xlLnByb3RvYnVmLkxpc3RWYWx1ZSBsaXN0X3ZhbHVlID0gMzsKLX0KLQotbWVzc2FnZSBUZXN0QW55IHsKLSAgZ29vZ2xlLnByb3RvYnVmLkFueSBhbnlfdmFsdWUgPSAxOwotfQotCi1tZXNzYWdlIFRlc3RDdXN0b21Kc29uTmFtZSB7Ci0gIGludDMyIHZhbHVlID0gMSBbanNvbl9uYW1lID0gIkB2YWx1ZSJdOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTliOTBiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL1JFQURNRS5tZAorKysgL2Rldi9udWxsCkBAIC0xLDM5OCArMCwwIEBACi1Qcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1bIVtCdWlsZCBTdGF0dXNdKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9nb29nbGUvcHJvdG9idWYuc3ZnP2JyYW5jaD1tYXN0ZXIpXShodHRwczovL3RyYXZpcy1jaS5vcmcvZ29vZ2xlL3Byb3RvYnVmKQotCi1Db3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgSmF2YSBQcm90b2NvbCBCdWZmZXJzIE5hbm8gcnVudGltZSBsaWJyYXJ5LgotCi1JbnN0YWxsYXRpb24gLSBXaXRoIE1hdmVuCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVRoZSBQcm90b2NvbCBCdWZmZXJzIGJ1aWxkIGlzIG1hbmFnZWQgdXNpbmcgTWF2ZW4uICBJZiB5b3Ugd291bGQKLXJhdGhlciBidWlsZCB3aXRob3V0IE1hdmVuLCBzZWUgYmVsb3cuCi0KLTEpIEluc3RhbGwgQXBhY2hlIE1hdmVuIGlmIHlvdSBkb24ndCBoYXZlIGl0OgotCi0gICAgIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnLwotCi0yKSBCdWlsZCB0aGUgQysrIGNvZGUsIG9yIG9idGFpbiBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgcHJvdG9jLiAgSWYKLSAgIHlvdSBpbnN0YWxsIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIHNhbWUKLSAgIHZlcnNpb24gYXMgdGhpcyBwYWNrYWdlLiAgSWYgaW4gZG91YnQsIHJ1bjoKLQotICAgICAkIHByb3RvYyAtLXZlcnNpb24KLQotICAgWW91IHdpbGwgbmVlZCB0byBwbGFjZSB0aGUgcHJvdG9jIGV4ZWN1dGFibGUgaW4gLi4vc3JjLiAgKElmIHlvdQotICAgYnVpbHQgaXQgeW91cnNlbGYsIGl0IHNob3VsZCBhbHJlYWR5IGJlIHRoZXJlLikKLQotMykgUnVuIHRoZSB0ZXN0czoKLQotICAgICAkIG12biB0ZXN0Ci0KLSAgIElmIHNvbWUgdGVzdHMgZmFpbCwgdGhpcyBsaWJyYXJ5IG1heSBub3Qgd29yayBjb3JyZWN0bHkgb24geW91cgotICAgc3lzdGVtLiAgQ29udGludWUgYXQgeW91ciBvd24gcmlzay4KLQotNCkgSW5zdGFsbCB0aGUgbGlicmFyeSBpbnRvIHlvdXIgTWF2ZW4gcmVwb3NpdG9yeToKLQotICAgICAkIG12biBpbnN0YWxsCi0KLTUpIElmIHlvdSBkbyBub3QgdXNlIE1hdmVuIHRvIG1hbmFnZSB5b3VyIG93biBidWlsZCwgeW91IGNhbiBidWlsZCBhCi0gICAuamFyIGZpbGUgdG8gdXNlOgotCi0gICAgICQgbXZuIHBhY2thZ2UKLQotICAgVGhlIC5qYXIgd2lsbCBiZSBwbGFjZWQgaW4gdGhlICJ0YXJnZXQiIGRpcmVjdG9yeS4KLQotSW5zdGFsbGF0aW9uIC0gV2l0aG91dCBNYXZlbgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1JZiB5b3Ugd291bGQgcmF0aGVyIG5vdCBpbnN0YWxsIE1hdmVuIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCB5b3UgbWF5Ci1mb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIGluc3RlYWQuICBOb3RlIHRoYXQgdGhlc2UgaW5zdHJ1Y3Rpb25zIHNraXAKLXJ1bm5pbmcgdW5pdCB0ZXN0cy4KLQotMSkgQnVpbGQgdGhlIEMrKyBjb2RlLCBvciBvYnRhaW4gYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHByb3RvYy4gIElmCi0gICB5b3UgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24sIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRoZSBzYW1lCi0gICB2ZXJzaW9uIGFzIHRoaXMgcGFja2FnZS4gIElmIGluIGRvdWJ0LCBydW46Ci0KLSAgICAgJCBwcm90b2MgLS12ZXJzaW9uCi0KLSAgIElmIHlvdSBidWlsdCB0aGUgQysrIGNvZGUgd2l0aG91dCBpbnN0YWxsaW5nLCB0aGUgY29tcGlsZXIgYmluYXJ5Ci0gICBzaG91bGQgYmUgbG9jYXRlZCBpbiAuLi9zcmMuCi0KLTIpIEludm9rZSBwcm90b2MgdG8gYnVpbGQgRGVzY3JpcHRvclByb3Rvcy5qYXZhOgotCi0gICAgICQgcHJvdG9jIC0tamF2YV9vdXQ9c3JjL21haW4vamF2YSAtSS4uL3NyYyBcCi0gICAgICAgICAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KLQotMykgQ29tcGlsZSB0aGUgY29kZSBpbiBzcmMvbWFpbi9qYXZhIHVzaW5nIHdoYXRldmVyIG1lYW5zIHlvdSBwcmVmZXIuCi0KLTQpIEluc3RhbGwgdGhlIGNsYXNzZXMgd2hlcmV2ZXIgeW91IHByZWZlci4KLQotTmFubyB2ZXJzaW9uCi0tLS0tLS0tLS0tLS0KLQotSmF2YU5hbm8gaXMgYSBzcGVjaWFsIGNvZGUgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGxpYnJhcnkgZGVzaWduZWQgc3BlY2lhbGx5IGZvcgotcmVzb3VyY2UtcmVzdHJpY3RlZCBzeXN0ZW1zLCBsaWtlIEFuZHJvaWQuIEl0IGlzIHZlcnkgcmVzb3VyY2UtZnJpZW5kbHkgaW4gYm90aAotdGhlIGFtb3VudCBvZiBjb2RlIGFuZCB0aGUgcnVudGltZSBvdmVyaGVhZC4gSGVyZSBpcyBhbiBvdmVydmlldyBvZiBKYXZhTmFubwotZmVhdHVyZXMgY29tcGFyZWQgd2l0aCB0aGUgb2ZmaWNpYWwgSmF2YSBwcm90b2J1ZjoKLQotLSBObyBkZXNjcmlwdG9ycyBvciBtZXNzYWdlIGJ1aWxkZXJzLgotLSBBbGwgbWVzc2FnZXMgYXJlIG11dGFibGU7IGZpZWxkcyBhcmUgcHVibGljIEphdmEgZmllbGRzLgotLSBGb3Igb3B0aW9uYWwgZmllbGRzIG9ubHksIGVuY2Fwc3VsYXRpb24gYmVoaW5kIHNldHRlci9nZXR0ZXIvaGF6emVyLwotICBjbGVhcmVyIGZ1bmN0aW9ucyBpcyBvcHQtaW4sIHdoaWNoIHByb3ZpZGUgcHJvcGVyICdoYXMnIHN0YXRlIHN1cHBvcnQuCi0tIEZvciBwcm90bzIsIGlmIG5vdCBvcHRlZCBpbiwgaGFzIHN0YXRlIChmaWVsZCBwcmVzZW5jZSkgaXMgbm90IGF2YWlsYWJsZS4KLSAgU2VyaWFsaXphdGlvbiBvdXRwdXRzIGFsbCBmaWVsZHMgbm90IGVxdWFsIHRvIHRoZWlyIGRlZmF1bHRzCi0gIChzZWUgaW1wb3J0YW50IGltcGxpY2F0aW9ucyBiZWxvdykuCi0gIFRoZSBiZWhhdmlvciBpcyBjb25zaXN0ZW50IHdpdGggcHJvdG8zIHNlbWFudGljcy4KLS0gUmVxdWlyZWQgZmllbGRzIChwcm90bzIgb25seSkgYXJlIGFsd2F5cyBzZXJpYWxpemVkLgotLSBFbnVtIGNvbnN0YW50cyBhcmUgaW50ZWdlcnM7IHByb3RlY3Rpb24gYWdhaW5zdCBpbnZhbGlkIHZhbHVlcyBvbmx5Ci0gIHdoZW4gcGFyc2luZyBmcm9tIHRoZSB3aXJlLgotLSBFbnVtIGNvbnN0YW50cyBjYW4gYmUgZ2VuZXJhdGVkIGludG8gY29udGFpbmVyIGludGVyZmFjZXMgYmVhcmluZwotICB0aGUgZW51bSdzIG5hbWUgKHNvIHRoZSByZWZlcmVuY2luZyBjb2RlIGlzIGluIEphdmEgc3R5bGUpLgotLSBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gY2FuIG9ubHkgdGFrZSBieXRlW10gKG5vdCBJbnB1dFN0cmVhbSkuCi0tIFNpbWlsYXJseSBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIGNhbiBvbmx5IHdyaXRlIHRvIGJ5dGVbXS4KLS0gUmVwZWF0ZWQgZmllbGRzIGFyZSBpbiBhcnJheXMsIG5vdCBBcnJheUxpc3Qgb3IgVmVjdG9yLiBOdWxsIGFycmF5Ci0gIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGFuZCBzaWxlbnRseSBpZ25vcmVkLgotLSBGdWxsIHN1cHBvcnQgZm9yIHNlcmlhbGl6aW5nL2Rlc2VyaWFsaXppbmcgcmVwZWF0ZWQgcGFja2VkIGZpZWxkcy4KLS0gU3VwcG9ydCAgZXh0ZW5zaW9ucyAoaW4gcHJvdG8yKS4KLS0gVW5zZXQgbWVzc2FnZXMvZ3JvdXBzIGFyZSBudWxsLCBub3QgYW4gaW1tdXRhYmxlIGVtcHR5IGRlZmF1bHQKLSAgaW5zdGFuY2UuCi0tIHRvQnl0ZUFycmF5KC4uLikgYW5kIG1lcmdlRnJvbSguLi4pIGFyZSBub3cgc3RhdGljIGZ1bmN0aW9ucyBvZgotICBNZXNzYWdlTmFuby4KLS0gVGhlICdieXRlcycgdHlwZSB0cmFuc2xhdGVzIHRvIHRoZSBKYXZhIHR5cGUgYnl0ZVtdLgotCi1UaGUgZ2VuZXJhdGVkIG1lc3NhZ2VzIGFyZSBub3QgdGhyZWFkLXNhZmUgZm9yIHdyaXRlcywgYnV0IG1heSBiZQotdXNlZCBzaW11bHRhbmVvdXNseSBmcm9tIG11bHRpcGxlIHRocmVhZHMgaW4gYSByZWFkLW9ubHkgbWFubmVyLgotSW4gb3RoZXIgd29yZHMsIGFuIGFwcHJvcHJpYXRlIHN5bmNocm9uaXphdGlvbiBtZWNoYW5pc20gKHN1Y2ggYXMKLWEgUmVhZFdyaXRlTG9jaykgbXVzdCBiZSB1c2VkIHRvIGVuc3VyZSB0aGF0IGEgbWVzc2FnZSwgaXRzCi1hbmNlc3RvcnMsIGFuZCBkZXNjZW5kYW50cyBhcmUgbm90IGFjY2Vzc2VkIGJ5IGFueSBvdGhlciB0aHJlYWRzCi13aGlsZSB0aGUgbWVzc2FnZSBpcyBiZWluZyBtb2RpZmllZC4gRmllbGQgcmVhZHMsIGdldHRlciBtZXRob2RzCi0oYnV0IG5vdCBnZXRFeHRlbnNpb24oLi4uKSksIHRvQnl0ZUFycmF5KC4uLiksIHdyaXRlVG8oLi4uKSwKLWdldENhY2hlZFNpemUoKSwgYW5kIGdldFNlcmlhbGl6ZWRTaXplKCkgYXJlIGFsbCBjb25zaWRlcmVkIHJlYWQtb25seQotb3BlcmF0aW9ucy4KLQotSU1QT1JUQU5UOiBJZiB5b3UgaGF2ZSBmaWVsZHMgd2l0aCBkZWZhdWx0cyBhbmQgb3B0IG91dCBvZiBhY2Nlc3NvcnMKLQotSG93IGZpZWxkcyB3aXRoIGRlZmF1bHRzIGFyZSBzZXJpYWxpemVkIGhhcyBjaGFuZ2VkLiBCZWNhdXNlIHdlIGRvbid0Ci1rZWVwICJoYXMiIHN0YXRlLCBhbnkgZmllbGQgZXF1YWwgdG8gaXRzIGRlZmF1bHQgaXMgYXNzdW1lZCB0byBiZSBub3QKLXNldCBhbmQgdGhlcmVmb3JlIGlzIG5vdCBzZXJpYWxpemVkLiBDb25zaWRlciB0aGUgc2l0dWF0aW9uIHdoZXJlIHdlCi1jaGFuZ2UgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYSBmaWVsZC4gU2VuZGVycyBjb21waWxlZCBhZ2FpbnN0IGFuIG9sZGVyCi12ZXJzaW9uIG9mIHRoZSBwcm90byBjb250aW51ZSB0byBtYXRjaCBhZ2FpbnN0IHRoZSBvbGQgZGVmYXVsdCwgYW5kCi1kb24ndCBzZW5kIHZhbHVlcyB0byB0aGUgcmVjZWl2ZXIgZXZlbiB0aG91Z2ggdGhlIHJlY2VpdmVyIGFzc3VtZXMgdGhlCi1uZXcgZGVmYXVsdCB2YWx1ZS4gVGhlcmVmb3JlLCB0aGluayBjYXJlZnVsbHkgYWJvdXQgdGhlIGltcGxpY2F0aW9ucwotb2YgY2hhbmdpbmcgdGhlIGRlZmF1bHQgdmFsdWUuIEFsdGVybmF0aXZlbHksIHR1cm4gb24gYWNjZXNzb3JzIGFuZAotZW5qb3kgdGhlIGJlbmVmaXQgb2YgdGhlIGV4cGxpY2l0IGhhcygpIGNoZWNrcy4KLQotSU1QT1JUQU5UOiBJZiB5b3UgaGF2ZSAiYnl0ZXMiIGZpZWxkcyB3aXRoIG5vbi1lbXB0eSBkZWZhdWx0cwotCi1CZWNhdXNlIHRoZSBieXRlIGJ1ZmZlciBpcyBub3cgb2YgbXV0YWJsZSB0eXBlIGJ5dGVbXSwgdGhlIGRlZmF1bHQKLXN0YXRpYyBmaW5hbCBjYW5ub3QgYmUgZXhwb3NlZCB0aHJvdWdoIGEgcHVibGljIGZpZWxkLiBFYWNoIHRpbWUgYQotbWVzc2FnZSdzIGNvbnN0cnVjdG9yIG9yIGNsZWFyKCkgZnVuY3Rpb24gaXMgY2FsbGVkLCB0aGUgZGVmYXVsdCB2YWx1ZQotKGtlcHQgaW4gYSBwcml2YXRlIGJ5dGVbXSkgaXMgY2xvbmVkLiBUaGlzIGNhdXNlcyBhIHNtYWxsIG1lbW9yeQotcGVuYWx0eS4gVGhpcyBpcyBub3QgYSBwcm9ibGVtIGlmIHRoZSBmaWVsZCBoYXMgbm8gZGVmYXVsdCBvciBpcyBhbgotZW1wdHkgZGVmYXVsdC4KLQotTmFubyBHZW5lcmF0b3Igb3B0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1gYGAKLWphdmFfcGFja2FnZSAgICAgICAgICAgLT4gPGZpbGUtbmFtZT58PHBhY2thZ2UtbmFtZT4KLWphdmFfb3V0ZXJfY2xhc3NuYW1lICAgLT4gPGZpbGUtbmFtZT58PHBhY2thZ2UtbmFtZT4KLWphdmFfbXVsdGlwbGVfZmlsZXMgICAgLT4gdHJ1ZSBvciBmYWxzZQotamF2YV9uYW5vX2dlbmVyYXRlX2hhcyAtPiB0cnVlIG9yIGZhbHNlIFtERVBSRUNBVEVEXQotb3B0aW9uYWxfZmllbGRfc3R5bGUgICAtPiBkZWZhdWx0IG9yIGFjY2Vzc29ycwotZW51bV9zdHlsZSAgICAgICAgICAgICAtPiBjIG9yIGphdmEKLWlnbm9yZV9zZXJ2aWNlcyAgICAgICAgLT4gdHJ1ZSBvciBmYWxzZQotcGFyY2VsYWJsZV9tZXNzYWdlcyAgICAtPiB0cnVlIG9yIGZhbHNlCi1nZW5lcmF0ZV9pbnRkZWZzICAgICAgIC0+IHRydWUgb3IgZmFsc2UKLWBgYAotCi0qKmphdmFfcGFja2FnZT1cPGZpbGUtbmFtZVw+fFw8cGFja2FnZS1uYW1lXD4qKiAobm8gZGVmYXVsdCkKLQotICBUaGlzIGFsbG93cyBvdmVycmlkaW5nIHRoZSAnamF2YV9wYWNrYWdlJyBvcHRpb24gdmFsdWUKLSAgZm9yIHRoZSBnaXZlbiBmaWxlIGZyb20gdGhlIGNvbW1hbmQgbGluZS4gVXNlIG11bHRpcGxlCi0gIGphdmFfcGFja2FnZSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvcHRpb24gZm9yIG11bHRpcGxlCi0gIGZpbGVzLiBUaGUgZmluYWwgSmF2YSBwYWNrYWdlIGZvciBlYWNoIGZpbGUgaXMgdGhlIHZhbHVlCi0gIG9mIHRoaXMgY29tbWFuZCBsaW5lIG9wdGlvbiBpZiBwcmVzZW50LCBvciB0aGUgdmFsdWUgb2YKLSAgdGhlIHNhbWUgb3B0aW9uIGRlZmluZWQgaW4gdGhlIGZpbGUgaWYgcHJlc2VudCwgb3IgdGhlCi0gIHByb3RvIHBhY2thZ2UgaWYgcHJlc2VudCwgb3IgdGhlIGRlZmF1bHQgSmF2YSBwYWNrYWdlLgotCi0qKmphdmFfb3V0ZXJfY2xhc3NuYW1lPVw8ZmlsZS1uYW1lXD58XDxvdXRlci1jbGFzc25hbWVcPioqIChubyBkZWZhdWx0KQotCi0gIFRoaXMgYWxsb3dzIG92ZXJyaWRpbmcgdGhlICdqYXZhX291dGVyX2NsYXNzbmFtZScgb3B0aW9uCi0gIGZvciB0aGUgZ2l2ZW4gZmlsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUuIFVzZSBtdWx0aXBsZQotICBqYXZhX291dGVyX2NsYXNzbmFtZSBvcHRpb25zIHRvIG92ZXJyaWRlIHRoZSBvcHRpb24gZm9yCi0gIG11bHRpcGxlIGZpbGVzLiBUaGUgZmluYWwgSmF2YSBvdXRlciBjbGFzcyBuYW1lIGZvciBlYWNoCi0gIGZpbGUgaXMgdGhlIHZhbHVlIG9mIHRoaXMgY29tbWFuZCBsaW5lIG9wdGlvbiBpZiBwcmVzZW50LAotICBvciB0aGUgdmFsdWUgb2YgdGhlIHNhbWUgb3B0aW9uIGRlZmluZWQgaW4gdGhlIGZpbGUgaWYKLSAgcHJlc2VudCwgb3IgdGhlIGZpbGUgbmFtZSBjb252ZXJ0ZWQgdG8gQ2FtZWxDYXNlLiBUaGlzCi0gIG91dGVyIGNsYXNzIHdpbGwgbmVzdCBhbGwgY2xhc3NlcyBhbmQgaW50ZWdlciBjb25zdGFudHMKLSAgZ2VuZXJhdGVkIGZyb20gZmlsZS1zY29wZSBtZXNzYWdlcyBhbmQgZW51bXMuCi0KLSoqamF2YV9tdWx0aXBsZV9maWxlcz17dHJ1ZSxmYWxzZX0qKiAobm8gZGVmYXVsdCkKLQotICBUaGlzIGFsbG93cyBvdmVycmlkaW5nIHRoZSAnamF2YV9tdWx0aXBsZV9maWxlcycgb3B0aW9uCi0gIGluIGFsbCBzb3VyY2UgZmlsZXMgYW5kIHRoZWlyIGltcG9ydGVkIGZpbGVzIGZyb20gdGhlCi0gIGNvbW1hbmQgbGluZS4gVGhlIGZpbmFsIHZhbHVlIG9mIHRoaXMgb3B0aW9uIGZvciBlYWNoCi0gIGZpbGUgaXMgdGhlIHZhbHVlIGRlZmluZWQgaW4gdGhpcyBjb21tYW5kIGxpbmUgb3B0aW9uLCBvcgotICB0aGUgdmFsdWUgb2YgdGhlIHNhbWUgb3B0aW9uIGRlZmluZWQgaW4gdGhlIGZpbGUgaWYKLSAgcHJlc2VudCwgb3IgZmFsc2UuIFRoaXMgc3BlY2lmaWVzIHdoZXRoZXIgdG8gZ2VuZXJhdGUKLSAgcGFja2FnZS1sZXZlbCBjbGFzc2VzIGZvciB0aGUgZmlsZS1zY29wZSBtZXNzYWdlcyBpbiB0aGUKLSAgc2FtZSBKYXZhIHBhY2thZ2UgYXMgdGhlIG91dGVyIGNsYXNzIChpbnN0ZWFkIG9mIG5lc3RlZAotICBjbGFzc2VzIGluIHRoZSBvdXRlciBjbGFzcykuIEZpbGUtc2NvcGUgZW51bSBjb25zdGFudHMKLSAgYXJlIHN0aWxsIGdlbmVyYXRlZCBhcyBpbnRlZ2VyIGNvbnN0YW50cyBpbiB0aGUgb3V0ZXIKLSAgY2xhc3MuIFRoaXMgYWZmZWN0cyB0aGUgZnVsbHkgcXVhbGlmaWVkIHJlZmVyZW5jZXMgaW4gdGhlCi0gIEphdmEgY29kZS4gTk9URTogYmVjYXVzZSB0aGUgY29tbWFuZCBsaW5lIG9wdGlvbgotICBvdmVycmlkZXMgdGhlIHZhbHVlIGZvciBhbGwgZmlsZXMgYW5kIHRoZWlyIGltcG9ydGVkCi0gIGZpbGVzLCB1c2luZyB0aGlzIG9wdGlvbiBpbmNvbnNpc3RlbnRseSBtYXkgcmVzdWx0IGluCi0gIGluY29ycmVjdCByZWZlcmVuY2VzIHRvIHRoZSBpbXBvcnRlZCBtZXNzYWdlcyBhbmQgZW51bQotICBjb25zdGFudHMuCi0KLSoqamF2YV9uYW5vX2dlbmVyYXRlX2hhcz17dHJ1ZSxmYWxzZX0qKiAoZGVmYXVsdDogZmFsc2UpCi0KLSAgREVQUkVDQVRFRC4gVXNlIG9wdGlvbmFsX2ZpZWxkX3N0eWxlPWFjY2Vzc29ycy4KLQotICBJZiB0cnVlLCBnZW5lcmF0ZXMgYSBwdWJsaWMgYm9vbGVhbiB2YXJpYWJsZSBoYXNcPGZpZWxkbmFtZVw+Ci0gIGFjY29tcGFueWluZyBlYWNoIG9wdGlvbmFsIG9yIHJlcXVpcmVkIGZpZWxkIChub3QgcHJlc2VudCBmb3IKLSAgcmVwZWF0ZWQgZmllbGRzLCBncm91cHMgb3IgbWVzc2FnZXMpLiBJdCBpcyBzZXQgdG8gZmFsc2UgaW5pdGlhbGx5Ci0gIGFuZCB1cG9uIGNsZWFyKCkuIElmIHBhcnNlRnJvbSguLi4pIHJlYWRzIHRoZSBmaWVsZCBmcm9tIHRoZSB3aXJlLAotICBpdCBpcyBzZXQgdG8gdHJ1ZS4gVGhpcyBpcyBhIHdheSBmb3IgY2xpZW50cyB0byBpbnNwZWN0IHRoZSAiaGFzIgotICB2YWx1ZSB1cG9uIHBhcnNlLiBJZiBpdCBpcyBzZXQgdG8gdHJ1ZSwgd3JpdGVUbyguLi4pIHdpbGwgQUxXQVlTCi0gIG91dHB1dCB0aGF0IGZpZWxkIChldmVuIGlmIGZpZWxkIHZhbHVlIGlzIGVxdWFsIHRvIGl0cwotICBkZWZhdWx0KS4KLQotICBJTVBPUlRBTlQ6IFRoaXMgb3B0aW9uIGNvc3RzIGFuIGV4dHJhIDQgYnl0ZXMgcGVyIHByaW1pdGl2ZSBmaWVsZCBpbgotICB0aGUgbWVzc2FnZS4gVGhpbmsgY2FyZWZ1bGx5IGFib3V0IHdoZXRoZXIgeW91IHJlYWxseSBuZWVkIHRoaXMuIEluCi0gIG1hbnkgY2FzZXMgcmVhZGluZyB0aGUgZGVmYXVsdCB3b3JrcyBhbmQgZGV0ZXJtaW5pbmcgd2hldGhlciB0aGUKLSAgZmllbGQgd2FzIHJlY2VpdmVkIG92ZXIgdGhlIHdpcmUgaXMgaXJyZWxldmFudC4KLQotKipvcHRpb25hbF9maWVsZF9zdHlsZT17ZGVmYXVsdCxhY2Nlc3NvcnMscmVmdHlwZXN9KiogKGRlZmF1bHQ6IGRlZmF1bHQpCi0KLSAgRGVmaW5lcyB0aGUgc3R5bGUgb2YgdGhlIGdlbmVyYXRlZCBjb2RlIGZvciBmaWVsZHMuCi0KLSAgKiBkZWZhdWx0Ci0KLSAgSW4gdGhlIGRlZmF1bHQgc3R5bGUsIG9wdGlvbmFsIGZpZWxkcyB0cmFuc2xhdGUgaW50byBwdWJsaWMgbXV0YWJsZQotICBKYXZhIGZpZWxkcywgYW5kIHRoZSBzZXJpYWxpemF0aW9uIHByb2Nlc3MgaXMgYXMgZGlzY3Vzc2VkIGluIHRoZQotICAiSU1QT1JUQU5UIiBzZWN0aW9uIGFib3ZlLgotCi0gICogYWNjZXNzb3JzCi0KLSAgV2hlbiBzZXQgdG8gJ2FjY2Vzc29ycycsIGVhY2ggb3B0aW9uYWwgZmllbGQgaXMgZW5jYXBzdWxhdGVkIGJlaGluZAotICA0IGFjY2Vzc29ycywgbmFtZWx5IGdldFw8ZmllbGRuYW1lXD4oKSwgc2V0XDxmaWVsZG5hbWVcPigpLCBoYXNcPGZpZWxkbmFtZVw+KCkKLSAgYW5kIGNsZWFyXDxmaWVsZG5hbWVcPigpIG1ldGhvZHMsIHdpdGggdGhlIHN0YW5kYXJkIHNlbWFudGljcy4gVGhlIGhhenplcidzCi0gIHJldHVybiB2YWx1ZSBkZXRlcm1pbmVzIHdoZXRoZXIgYSBmaWVsZCBpcyBzZXJpYWxpemVkLCBzbyB0aGlzIHN0eWxlIGlzCi0gIHVzZWZ1bCB3aGVuIHlvdSBuZWVkIHRvIHNlcmlhbGl6ZSBhIGZpZWxkIHdpdGggdGhlIGRlZmF1bHQgdmFsdWUsIG9yIGNoZWNrCi0gIGlmIGEgZmllbGQgaGFzIGJlZW4gZXhwbGljaXRseSBzZXQgdG8gaXRzIGRlZmF1bHQgdmFsdWUgZnJvbSB0aGUgd2lyZS4KLQotICBJbiB0aGUgJ2FjY2Vzc29ycycgc3R5bGUsIHJlcXVpcmVkIGFuZCBuZXN0ZWQgbWVzc2FnZSBmaWVsZHMgYXJlIHN0aWxsCi0gIHRyYW5zbGF0ZWQgdG8gb25lIHB1YmxpYyBtdXRhYmxlIEphdmEgZmllbGQgZWFjaCwgcmVwZWF0ZWQgZmllbGRzIGFyZSBzdGlsbAotICB0cmFuc2xhdGVkIHRvIGFycmF5cy4gTm8gYWNjZXNzb3JzIGFyZSBnZW5lcmF0ZWQgZm9yIHRoZW0uCi0KLSAgSU1QT1JUQU5UOiBXaGVuIHVzaW5nIHRoZSAnYWNjZXNzb3JzJyBzdHlsZSwgUHJvR3VhcmQgc2hvdWxkIGFsd2F5cwotICBiZSBlbmFibGVkIHdpdGggb3B0aW1pemF0aW9uIChkb24ndCB1c2UgLWRvbnRvcHRpbWl6ZSkgYW5kIGFsbG93aW5nCi0gIGFjY2VzcyBtb2RpZmljYXRpb24gKHVzZSAtYWxsb3dhY2Nlc3Ntb2RpZmljYXRpb24pLiBUaGlzIHJlbW92ZXMgdGhlCi0gIHVudXNlZCBhY2Nlc3NvcnMgYW5kIG1heWJlIGlubGluZSB0aGUgcmVzdCBhdCB0aGUgY2FsbCBzaXRlcywKLSAgcmVkdWNpbmcgdGhlIGZpbmFsIGNvZGUgc2l6ZS4KLSAgVE9ETyhtYXh0cm95KTogZmluZCBQcm9HdWFyZCBjb25maWcgdGhhdCB3b3VsZCB3b3JrIHRoZSBiZXN0LgotCi0gICogcmVmdHlwZXMKLQotICBXaGVuIHNldCB0byAncmVmdHlwZXMnLCBlYWNoIHByb3RvIGZpZWxkIGlzIGdlbmVyYXRlZCBhcyBhIHB1YmxpYyBKYXZhCi0gIGZpZWxkLiBGb3IgcHJpbWl0aXZlIHR5cGVzLCB0aGVzZSBmaWVsZHMgdXNlIHRoZSBKYXZhIHJlZmVyZW5jZSB0eXBlcwotICBzdWNoIGFzIGphdmEubGFuZy5JbnRlZ2VyIGluc3RlYWQgb2YgcHJpbWl0aXZlIHR5cGVzIHN1Y2ggYXMgaW50LgotCi0gIEluIHRoZSAncmVmdHlwZXMnIHN0eWxlLCBmaWVsZHMgYXJlIGluaXRpYWxpemVkIHRvIG51bGwgKG9yIGVtcHR5Ci0gIGFycmF5cyBmb3IgcmVwZWF0ZWQgZmllbGRzKSwgYW5kIHRoZWlyIGRlZmF1bHQgdmFsdWVzIGFyZSBub3QgYXZhaWxhYmxlLgotICBUaGV5IGFyZSBzZXJpYWxpemVkIG92ZXIgdGhlIHdpcmUgYmFzZWQgb24gZXF1YWxpdHkgdG8gbnVsbC4KLQotICBUaGUgJ3JlZnR5cGVzJyBtb2RlIGhhcyBzb21lIGFkZGl0aW9uYWwgY29zdCBkdWUgdG8gYXV0b2JveGluZyBhbmQgdXNhZ2UKLSAgb2YgcmVmZXJlbmNlIHR5cGVzLiBJbiBwcmFjdGljZSwgbWFueSBib3hlZCB0eXBlcyBhcmUgY2FjaGVkLCBhbmQgc28gZG9uJ3QKLSAgcmVzdWx0IGluIG9iamVjdCBjcmVhdGlvbi4gSG93ZXZlciwgcmVmZXJlbmNlcyBkbyB0YWtlIHNsaWdodGx5IG1vcmUgbWVtb3J5Ci0gIHRoYW4gcHJpbWl0aXZlcy4KLQotICBUaGUgJ3JlZnR5cGVzJyBtb2RlIGlzIHVzZWZ1bCB3aGVuIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gc2VyaWFsaXplIGZpZWxkcwotICB3aXRoIGRlZmF1bHQgdmFsdWVzLCBvciBjaGVjayBpZiBhIGZpZWxkIGhhcyBiZWVuIGV4cGxpY2l0bHkgc2V0IHRvIHRoZQotICBkZWZhdWx0IG92ZXIgdGhlIHdpcmUgd2l0aG91dCBwYXlpbmcgdGhlIGV4dHJhIG1ldGhvZCBjb3N0IG9mIHRoZQotICAnYWNjZXNzb3JzJyBtb2RlLgotCi0gIE5vdGUgdGhhdCBpZiB5b3UgYXR0ZW1wdCB0byB3cml0ZSBudWxsIHRvIGEgcmVxdWlyZWQgZmllbGQgaW4gdGhlIHJlZnR5cGVzCi0gIG1vZGUsIHNlcmlhbGl6YXRpb24gb2YgdGhlIHByb3RvIHdpbGwgY2F1c2UgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4gVGhpcyBpcwotICBhbiBpbnRlbnRpb25hbCBpbmRpY2F0b3IgdGhhdCB5b3UgbXVzdCBzZXQgcmVxdWlyZWQgZmllbGRzLgotCi0gIE5PVEUKLSAgb3B0aW9uYWxfZmllbGRfc3R5bGU9YWNjZXNzb3JzIG9yIHJlZnR5cGVzIGNhbm5vdCBiZSB1c2VkIHRvZ2V0aGVyIHdpdGgKLSAgamF2YV9uYW5vX2dlbmVyYXRlX2hhcz10cnVlLiBJZiB5b3UgbmVlZCB0aGUgJ2hhcycgZmxhZyBmb3IgYW55Ci0gIHJlcXVpcmVkIGZpZWxkICh5b3UgaGF2ZSBubyByZWFzb24gdG8pLCB5b3UgY2FuIG9ubHkgdXNlCi0gIGphdmFfbmFub19nZW5lcmF0ZV9oYXM9dHJ1ZS4KLQotKiplbnVtX3N0eWxlPXtjLGphdmF9KiogKGRlZmF1bHQ6IGMpCi0KLSAgRGVmaW5lcyB3aGVyZSB0byBwdXQgdGhlIGludCBjb25zdGFudHMgZ2VuZXJhdGVkIGZyb20gZW51bSBtZW1iZXJzLgotCi0gICogYwotCi0gIFVzZSBDLXN0eWxlLCBzbyB0aGUgZW51bSBjb25zdGFudHMgYXJlIGF2YWlsYWJsZSBhdCB0aGUgc2NvcGUgd2hlcmUKLSAgdGhlIGVudW0gaXMgZGVmaW5lZC4gQSBmaWxlLXNjb3BlIGVudW0ncyBtZW1iZXJzIGFyZSByZWZlcmVuY2VkIGxpa2UKLSAgJ0ZpbGVPdXRlckNsYXNzLkVOVU1fVkFMVUUnOyBhIG1lc3NhZ2Utc2NvcGUgZW51bSdzIG1lbWJlcnMgYXJlCi0gIHJlZmVyZW5jZWQgYXMgJ01lc3NhZ2UuRU5VTV9WQUxVRScuIFRoZSBlbnVtIG5hbWUgaXMgdW5hdmFpbGFibGUuCi0gIFRoaXMgY29tcGxpZXMgd2l0aCB0aGUgTWljcm8gY29kZSBnZW5lcmF0b3IncyBiZWhhdmlvci4KLQotICAqIGphdmEKLQotICBVc2UgSmF2YS1zdHlsZSwgc28gdGhlIGVudW0gY29uc3RhbnRzIGFyZSBhdmFpbGFibGUgdW5kZXIgdGhlIGVudW0KLSAgbmFtZSBhbmQgcmVmZXJlbmNlZCBsaWtlICdFbnVtTmFtZS5FTlVNX1ZBTFVFJyAodGhleSBhcmUgc3RpbGwgaW50Ci0gIGNvbnN0YW50cykuIFRoZSBlbnVtIG5hbWUgYmVjb21lcyB0aGUgbmFtZSBvZiBhIHB1YmxpYyBpbnRlcmZhY2UsIGF0Ci0gIHRoZSBzY29wZSB3aGVyZSB0aGUgZW51bSBpcyBkZWZpbmVkLiBJZiB0aGUgZW51bSBpcyBmaWxlLXNjb3BlIGFuZAotICB0aGUgamF2YV9tdWx0aXBsZV9maWxlcyBvcHRpb24gaXMgb24sIHRoZSBpbnRlcmZhY2Ugd2lsbCBiZSBkZWZpbmVkCi0gIGluIGl0cyBvd24gZmlsZS4gVG8gcmVkdWNlIGNvZGUgc2l6ZSwgdGhpcyBpbnRlcmZhY2Ugc2hvdWxkIG5vdCBiZQotICBpbXBsZW1lbnRlZCBhbmQgUHJvR3VhcmQgc2hyaW5raW5nIHNob3VsZCBiZSB1c2VkLCBzbyBhZnRlciB0aGUgSmF2YQotICBjb21waWxlciBpbmxpbmVzIGFsbCByZWZlcmVuY2VkIGVudW0gY29uc3RhbnRzIGludG8gdGhlIGNhbGwgc2l0ZXMsCi0gIHRoZSBpbnRlcmZhY2UgcmVtYWlucyB1bnVzZWQgYW5kIGNhbiBiZSByZW1vdmVkIGJ5IFByb0d1YXJkLgotCi0qKmlnbm9yZV9zZXJ2aWNlcz17dHJ1ZSxmYWxzZX0qKiAoZGVmYXVsdDogZmFsc2UpCi0KLSAgU2tpcHMgc2VydmljZXMgZGVmaW5pdGlvbnMuCi0KLSAgTmFubyBkb2Vzbid0IHN1cHBvcnQgc2VydmljZXMuIEJ5IGRlZmF1bHQsIGlmIGEgc2VydmljZSBpcyBkZWZpbmVkCi0gIGl0IHdpbGwgZ2VuZXJhdGUgYSBjb21waWxhdGlvbiBlcnJvci4gSWYgdGhpcyBmbGFnIGlzIHNldCB0byB0cnVlLAotICBzZXJ2aWNlcyB3aWxsIGJlIHNpbGVudGx5IGlnbm9yZWQsIGluc3RlYWQuCi0KLSoqcGFyY2VsYWJsZV9tZXNzYWdlcz17dHJ1ZSxmYWxzZX0qKiAoZGVmYXVsdDogZmFsc2UpCi0KLSAgQW5kcm9pZC1zcGVjaWZpYyBvcHRpb24gdG8gZ2VuZXJhdGUgUGFyY2VsYWJsZSBtZXNzYWdlcy4KLQotKipnZW5lcmF0ZV9pbnRkZWZzPXt0cnVlLGZhbHNlfSoqIChkZWZhdWx0OiBmYWxzZSkKLSAgQW5kcm9pZC1zcGVjaWZpYyBvcHRpb24gdG8gZ2VuZXJhdGUgQEludERlZiBhbm5vdGF0aW9ucyBmb3IgZW51bXMuCi0KLSAgSWYgdHVybmVkIG9uLCBhbiAnQEludERlZicgYW5ub3RhdGlvbiAoYSBwdWJsaWMgQGludGVyZmFjZSkgd2lsbCBiZQotICBnZW5lcmF0ZWQgZm9yIGVhY2ggZW51bSwgYW5kIGV2ZXJ5IGludGVnZXIgcGFyYW1ldGVyIGFuZCByZXR1cm4KLSAgdmFsdWUgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIG1lYW50IGZvciB0aGlzIGVudW0gd2lsbCBiZSBhbm5vdGF0ZWQKLSAgd2l0aCBpdC4gVGhpcyBpbnRlcmZhY2UgaXMgZ2VuZXJhdGVkIHdpdGggdGhlIHNhbWUgbmFtZSBhbmQgYXQgdGhlCi0gIHNhbWUgcGxhY2UgYXMgdGhlIGVudW0gbWVtYmVycycgY29udGFpbmVyIGludGVyZmFjZXMgZGVzY3JpYmVkCi0gIGFib3ZlIHVuZGVyICdlbnVtX3N0eWxlPWphdmEnLCByZWdhcmRsZXNzIG9mIHRoZSBlbnVtX3N0eWxlIG9wdGlvbgotICB1c2VkLiBXaGVuIHRoaXMgaXMgY29tYmluZWQgd2l0aCBlbnVtX3N0eWxlPWphdmEsIHRoZSBpbnRlcmZhY2UKLSAgd2lsbCBiZSBib3RoIHRoZSAnQEludERlZicgYW5ub3RhdGlvbiBhbmQgdGhlIGNvbnRhaW5lciBvZiB0aGUgZW51bQotICBtZW1iZXJzOyBvdGhlcndpc2UgdGhlIGludGVyZmFjZSBoYXMgYW4gZW1wdHkgYm9keS4KLQotICBZb3VyIGFwcCBtdXN0IGRlY2xhcmUgYSBjb21waWxlLXRpbWUgZGVwZW5kZW5jeSBvbiB0aGUKLSAgYW5kcm9pZC1zdXBwb3J0LWFubm90YXRpb25zIGxpYnJhcnkuCi0KLSAgRm9yIG1vcmUgaW5mb3JtYXRpb24gb24gaG93IHRoZXNlIEBJbnREZWYgYW5ub3RhdGlvbnMgaGVscCB3aXRoCi0gIGNvbXBpbGUtdGltZSB0eXBlIHNhZmV0eSwgc2VlOgotICBodHRwczovL3NpdGVzLmdvb2dsZS5jb20vYS9hbmRyb2lkLmNvbS90b29scy90ZWNoLWRvY3Mvc3VwcG9ydC1hbm5vdGF0aW9ucwotICBhbmQKLSAgaHR0cHM6Ly9kZXZlbG9wZXIuYW5kcm9pZC5jb20vcmVmZXJlbmNlL2FuZHJvaWQvc3VwcG9ydC9hbm5vdGF0aW9uL0ludERlZi5odG1sCi0KLQotVG8gdXNlIG5hbm8gcHJvdG9idWZzIHdpdGhpbiB0aGUgQW5kcm9pZCByZXBvOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tIFNldCAnTE9DQUxfUFJPVE9DX09QVElNSVpFX1RZUEUgOj0gbmFubycgaW4geW91ciBsb2NhbCAubWsgZmlsZS4KLSAgV2hlbiBidWlsZGluZyBhIEphdmEgbGlicmFyeSBvciBhbiBhcHAgKHBhY2thZ2UpIHRhcmdldCwgdGhlIGJ1aWxkCi0gIHN5c3RlbSB3aWxsIGFkZCB0aGUgSmF2YSBuYW5vIHJ1bnRpbWUgbGlicmFyeSB0byB0aGUKLSAgTE9DQUxfU1RBVElDX0pBVkFfTElCUkFSSUVTIHZhcmlhYmxlLCBzbyB5b3UgZG9uJ3QgbmVlZCB0by4KLS0gU2V0ICdMT0NBTF9QUk9UT19KQVZBX09VVFBVVF9QQVJBTVMgOj0gLi4uJyBpbiB5b3VyIGxvY2FsIC5tayBmaWxlCi0gIGZvciBhbnkgY29tbWFuZC1saW5lIG9wdGlvbnMgeW91IG5lZWQuIFVzZSBjb21tYXMgdG8gam9pbiBtdWx0aXBsZQotICBvcHRpb25zLiBJbiB0aGUgbmFubyBmbGF2b3Igb25seSwgd2hpdGVzcGFjZSBzdXJyb3VuZGluZyB0aGUgb3B0aW9uCi0gIG5hbWVzIGFuZCB2YWx1ZXMgYXJlIGlnbm9yZWQsIHNvIHlvdSBjYW4gdXNlIGJhY2tzbGFzaC1uZXdsaW5lIG9yCi0gICcrPScgdG8gc3RydWN0dXJlIHlvdXIgbWFrZSBmaWxlcyBuaWNlbHkuCi0tIFRoZSBvcHRpb25zIHdpbGwgYmUgYXBwbGllZCB0byAqYWxsKiBwcm90byBmaWxlcyBpbiBMT0NBTF9TUkNfRklMRVMKLSAgd2hlbiB5b3UgYnVpbGQgYSBKYXZhIGxpYnJhcnkgb3IgcGFja2FnZS4gSW4gY2FzZSBkaWZmZXJlbnQgb3B0aW9ucwotICBhcmUgbmVlZGVkIGZvciBkaWZmZXJlbnQgcHJvdG8gZmlsZXMsIGJ1aWxkIHNlcGFyYXRlIEphdmEgbGlicmFyaWVzCi0gIGFuZCByZWZlcmVuY2UgdGhlbSBpbiB5b3VyIG1haW4gdGFyZ2V0LiBOb3RlOiB5b3Ugc2hvdWxkIG1ha2Ugc3VyZQotICB0aGF0LCBmb3IgZWFjaCBzZXBhcmF0ZSB0YXJnZXQsIGFsbCBwcm90byBmaWxlcyBpbXBvcnRlZCBmcm9tIGFueQotICBwcm90byBmaWxlIGluIExPQ0FMX1NSQ19GSUxFUyBhcmUgaW5jbHVkZWQgaW4gTE9DQUxfU1JDX0ZJTEVTLiBUaGlzCi0gIGlzIGJlY2F1c2UgdGhlIGdlbmVyYXRvciBoYXMgdG8gYXNzdW1lIHRoYXQgdGhlIGltcG9ydGVkIGZpbGVzIGFyZQotICBidWlsdCB1c2luZyB0aGUgc2FtZSBvcHRpb25zLCBhbmQgd2lsbCBnZW5lcmF0ZSBjb2RlIHRoYXQgcmVmZXJlbmNlCi0gIHRoZSBmaWVsZHMgYW5kIGVudW1zIGZyb20gdGhlIGltcG9ydGVkIGZpbGVzIHVzaW5nIHRoZSBzYW1lIGNvZGUKLSAgc3R5bGUuCi0tIEhpbnQ6ICdpbmNsdWRlICQoQ0xFQVJfVkFSUyknIHJlc2V0cyBhbGwgTE9DQUxfIHZhcmlhYmxlcywgaW5jbHVkaW5nCi0gIHRoZSB0d28gYWJvdmUuCi0KLVRvIHVzZSBuYW5vIHByb3RvYnVmcyBvdXRzaWRlIG9mIEFuZHJvaWQgcmVwbzoKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLSBMaW5rIHdpdGggdGhlIGdlbmVyYXRlZCBqYXIgZmlsZQotICBcPHByb3RvYnVmLXJvb3RcPmphdmEvdGFyZ2V0L3Byb3RvYnVmLWphdmEtMi4zLjAtbmFuby5qYXIuCi0tIEludm9rZSB3aXRoIC0tamF2YW5hbm9fb3V0LCBlLmcuOgotYGBgCi0uL3Byb3RvYyAnLS1qYXZhbmFub19vdXQ9XAotICAgIGphdmFfcGFja2FnZT1zcmMvcHJvdG8vc2ltcGxlLWRhdGEucHJvdG98bXlfcGFja2FnZSxcCi0gICAgamF2YV9vdXRlcl9jbGFzc25hbWU9c3JjL3Byb3RvL3NpbXBsZS1kYXRhLnByb3RvfE91dGVyTmFtZVwKLSAgOi4nIHNyYy9wcm90by9zaW1wbGUtZGF0YS5wcm90bwotYGBgCi0KLUNvbnRyaWJ1dGluZyB0byBuYW5vOgotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVBsZWFzZSBhZGQvZWRpdCB0ZXN0cyBpbiBOYW5vVGVzdC5qYXZhLgotCi1QbGVhc2UgcnVuIHRoZSBmb2xsb3dpbmcgc3RlcHMgdG8gdGVzdDoKLQotLSBjZCBleHRlcm5hbC9wcm90b2J1ZgotLSAuL2NvbmZpZ3VyZQotLSBSdW4gIm1ha2UgLWoxMiBjaGVjayIgYW5kIHZlcmlmeSBhbGwgdGVzdHMgcGFzcy4KLS0gY2QgamF2YQotLSBSdW4gIm12biB0ZXN0IiBhbmQgdmVyaWZ5IGFsbCB0ZXN0cyBwYXNzLgotLSBjZCAuLi8uLi8uLgotLSAuIGJ1aWxkL2VudnNldHVwLnNoCi0tIGx1bmNoIDEKLS0gIm1ha2UgLWoxMiBhcHJvdG9jIGxpYnByb3RvYnVmLWphdmEtMi4zLjAtbmFubyBhcHJvdG9jLXRlc3QtbmFuby1wYXJhbXMgTmFub0FuZHJvaWRUZXN0IiBhbmQKLSAgY2hlY2sgZm9yIGJ1aWxkIGVycm9ycy4KLS0gUGx1ZyBpbiBhbiBBbmRyb2lkIGRldmljZSBvciBzdGFydCBhbiBlbXVsYXRvci4KLS0gYWRiIGluc3RhbGwgLXIgb3V0L3RhcmdldC9wcm9kdWN0L2dlbmVyaWMvZGF0YS9hcHAvTmFub0FuZHJvaWRUZXN0LmFwawotLSBSdW46Ci0gICJhZGIgc2hlbGwgYW0gaW5zdHJ1bWVudCAtdyBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8udGVzdC9hbmRyb2lkLnRlc3QuSW5zdHJ1bWVudGF0aW9uVGVzdFJ1bm5lciIKLSAgYW5kIHZlcmlmeSBhbGwgdGVzdHMgcGFzcy4KLS0gcmVwbyBzeW5jIC1jIC1qMjU2Ci0tICJtYWtlIC1qMTIiIGFuZCBjaGVjayBmb3IgYnVpbGQgZXJyb3JzCi0KLVVzYWdlCi0tLS0tLQotCi1UaGUgY29tcGxldGUgZG9jdW1lbnRhdGlvbiBmb3IgUHJvdG9jb2wgQnVmZmVycyBpcyBhdmFpbGFibGUgdmlhIHRoZQotd2ViIGF0OgotCi0gICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3BvbS54bWwgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMmVjYTA5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwyNDQgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+Y29tLmdvb2dsZTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5nb29nbGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWYubmFubzwvZ3JvdXBJZD4KLSAgPGFydGlmYWN0SWQ+cHJvdG9idWYtamF2YW5hbm88L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjMuMC4wLWFscGhhLTY8L3ZlcnNpb24+Ci0gIDxwYWNrYWdpbmc+YnVuZGxlPC9wYWNrYWdpbmc+Ci0gIDxuYW1lPlByb3RvY29sIEJ1ZmZlciBKYXZhTmFubyBBUEk8L25hbWU+Ci0gIDxkZXNjcmlwdGlvbj4KLSAgICBQcm90b2NvbCBCdWZmZXJzIGFyZSBhIHdheSBvZiBlbmNvZGluZyBzdHJ1Y3R1cmVkIGRhdGEgaW4gYW4gZWZmaWNpZW50IHlldAotICAgIGV4dGVuc2libGUgZm9ybWF0LgotICA8L2Rlc2NyaXB0aW9uPgotICA8aW5jZXB0aW9uWWVhcj4yMDA4PC9pbmNlcHRpb25ZZWFyPgotICA8dXJsPmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvPC91cmw+Ci0gIDxsaWNlbnNlcz4KLSAgICA8bGljZW5zZT4KLSAgICAgIDxuYW1lPk5ldyBCU0QgbGljZW5zZTwvbmFtZT4KLSAgICAgIDx1cmw+aHR0cDovL3d3dy5vcGVuc291cmNlLm9yZy9saWNlbnNlcy9ic2QtbGljZW5zZS5waHA8L3VybD4KLSAgICAgIDxkaXN0cmlidXRpb24+cmVwbzwvZGlzdHJpYnV0aW9uPgotICAgIDwvbGljZW5zZT4KLSAgPC9saWNlbnNlcz4KLSAgPHNjbT4KLSAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWY8L3VybD4KLSAgICA8Y29ubmVjdGlvbj4KLSAgICAgIHNjbTpnaXQ6aHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi5naXQKLSAgICA8L2Nvbm5lY3Rpb24+Ci0gIDwvc2NtPgotICA8cHJvcGVydGllcz4KLSAgICA8cHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz5VVEYtODwvcHJvamVjdC5idWlsZC5zb3VyY2VFbmNvZGluZz4KLSAgPC9wcm9wZXJ0aWVzPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjQuNDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9ja2NsYXNzZXh0ZW5zaW9uPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L2lkPgotICAgICAgICAgICAgPHBoYXNlPmdlbmVyYXRlLXRlc3Qtc291cmNlczwvcGhhc2U+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPHRhc2tzPgotICAgICAgICAgICAgICAgIDxta2RpciBkaXI9InRhcmdldC9nZW5lcmF0ZWQtdGVzdC1zb3VyY2VzIiAvPgotICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uL3NyYy9wcm90b2MiPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1qYXZhbmFub19vdXQ9Z2VuZXJhdGVfZXF1YWxzPXRydWU6dGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXMiIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9c3JjL3Rlc3QvamF2YS9jb20iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3Rfc2ltcGxlX25hbm8ucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9zdHJpbmd1dGY4X25hbm8ucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9yZWN1cnNpdmVfbmFuby5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2ltcG9ydF9uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3Rfc2luZ2xlX25hbm8ucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9tdWx0aXBsZV9uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfbXVsdGlwbGVfbmFtZWNsYXNoX25hbm8ucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9lbnVtX2NsYXNzX25hbm8ucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9yZXBlYXRlZF9tZXJnZV9uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vbWFwX3Rlc3QucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgPC9leGVjPgotICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uL3NyYy9wcm90b2MiPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1qYXZhbmFub19vdXQ9c3RvcmVfdW5rbm93bl9maWVsZHM9dHJ1ZSxnZW5lcmF0ZV9lcXVhbHM9dHJ1ZSxnZW5lcmF0ZV9jbG9uZT10cnVlOnRhcmdldC9nZW5lcmF0ZWQtdGVzdC1zb3VyY2VzIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1wcm90b19wYXRoPXNyYy90ZXN0L2phdmEvY29tIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZXh0ZW5zaW9uX25hbm8ucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9leHRlbnNpb25fc2luZ3VsYXJfbmFuby5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2V4dGVuc2lvbl9yZXBlYXRlZF9uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YW5hbm9fb3V0PXN0b3JlX3Vua25vd25fZmllbGRzPXRydWUsZ2VuZXJhdGVfY2xvbmU9dHJ1ZTp0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhL2NvbSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2V4dGVuc2lvbl9wYWNrZWRfbmFuby5wcm90byIgLz4KLSAgICAgICAgICAgICAgICA8L2V4ZWM+Ci0gICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vc3JjL3Byb3RvYyI+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLWphdmFuYW5vX291dD1qYXZhX25hbm9fZ2VuZXJhdGVfaGFzPXRydWUsZ2VuZXJhdGVfZXF1YWxzPXRydWUsZ2VuZXJhdGVfY2xvbmU9dHJ1ZTp0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhL2NvbSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2hhc19uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YW5hbm9fb3V0PW9wdGlvbmFsX2ZpZWxkX3N0eWxlPWFjY2Vzc29ycyxnZW5lcmF0ZV9lcXVhbHM9dHJ1ZTp0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhL2NvbSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2FjY2Vzc29yc19uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YW5hbm9fb3V0PWVudW1fc3R5bGU9amF2YTp0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhL2NvbSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2VudW1fY2xhc3NfbmFuby5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2VudW1fY2xhc3NfbXVsdGlwbGVfbmFuby5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlcGVhdGVkX3BhY2thYmxlc19uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZW51bV92YWxpZGl0eV9uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YW5hbm9fb3V0PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZpZWxkX3N0eWxlPWFjY2Vzc29ycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBqYXZhX291dGVyX2NsYXNzbmFtZT1nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9lbnVtX3ZhbGlkaXR5X25hbm8ucHJvdG98RW51bVZhbGlkaXR5QWNjZXNzb3JzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhL2NvbSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2VudW1fdmFsaWRpdHlfbmFuby5wcm90byIgLz4KLSAgICAgICAgICAgICAgICA8L2V4ZWM+Ci0gICAgICAgICAgICAgICAgPGV4ZWMgZXhlY3V0YWJsZT0iLi4vc3JjL3Byb3RvYyI+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLWphdmFuYW5vX291dD1vcHRpb25hbF9maWVsZF9zdHlsZT1yZWZ0eXBlcyxnZW5lcmF0ZV9lcXVhbHM9dHJ1ZTp0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhL2NvbSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlZmVyZW5jZV90eXBlc19uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YW5hbm9fb3V0PQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZpZWxkX3N0eWxlPXJlZnR5cGVzX2NvbXBhdF9tb2RlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRlX2VxdWFscz10cnVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lPWdvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlZmVyZW5jZV90eXBlc19uYW5vLnByb3RvfE5hbm9SZWZlcmVuY2VUeXBlc0NvbXBhdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDp0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tcHJvdG9fcGF0aD1zcmMvdGVzdC9qYXZhL2NvbSIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlZmVyZW5jZV90eXBlc19uYW5vLnByb3RvIiAvPgotICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgPHRlc3RTb3VyY2VSb290PnRhcmdldC9nZW5lcmF0ZWQtdGVzdC1zb3VyY2VzPC90ZXN0U291cmNlUm9vdD4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgPGdvYWw+cnVuPC9nb2FsPgotICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICA8L2V4ZWN1dGlvbj4KLSAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgPC9wbHVnaW4+Ci0gICAgICA8cGx1Z2luPgotICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLmZlbGl4PC9ncm91cElkPgotICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1idW5kbGUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8ZXh0ZW5zaW9ucz50cnVlPC9leHRlbnNpb25zPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8aW5zdHJ1Y3Rpb25zPgotICAgICAgICAgICAgPEJ1bmRsZS1Eb2NVUkw+aHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy88L0J1bmRsZS1Eb2NVUkw+Ci0gICAgICAgICAgICA8QnVuZGxlLVN5bWJvbGljTmFtZT5jb20uZ29vZ2xlLnByb3RvYnVmPC9CdW5kbGUtU3ltYm9saWNOYW1lPgotICAgICAgICAgICAgPEV4cG9ydC1QYWNrYWdlPmNvbS5nb29nbGUucHJvdG9idWY7dmVyc2lvbj0zLjAuMC1hbHBoYS01PC9FeHBvcnQtUGFja2FnZT4KLSAgICAgICAgICA8L2luc3RydWN0aW9ucz4KLSAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgPC9wbHVnaW4+Ci0gICAgPC9wbHVnaW5zPgotICA8L2J1aWxkPgotICA8cHJvZmlsZXM+Ci0gICAgPHByb2ZpbGU+Ci0gICAgICA8aWQ+cmVsZWFzZTwvaWQ+Ci0gICAgICA8ZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgICAgPHNuYXBzaG90UmVwb3NpdG9yeT4KLSAgICAgICAgICA8aWQ+c29uYXR5cGUtbmV4dXMtc3RhZ2luZzwvaWQ+Ci0gICAgICAgICAgPHVybD5odHRwczovL29zcy5zb25hdHlwZS5vcmcvY29udGVudC9yZXBvc2l0b3JpZXMvc25hcHNob3RzPC91cmw+Ci0gICAgICAgIDwvc25hcHNob3RSZXBvc2l0b3J5PgotICAgICAgICA8cmVwb3NpdG9yeT4KLSAgICAgICAgICA8aWQ+c29uYXR5cGUtbmV4dXMtc3RhZ2luZzwvaWQ+Ci0gICAgICAgICAgPHVybD5odHRwczovL29zcy5zb25hdHlwZS5vcmcvc2VydmljZS9sb2NhbC9zdGFnaW5nL2RlcGxveS9tYXZlbjIvPC91cmw+Ci0gICAgICAgIDwvcmVwb3NpdG9yeT4KLSAgICAgIDwvZGlzdHJpYnV0aW9uTWFuYWdlbWVudD4KLSAgICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLXNvdXJjZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4yLjIuMTwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleGVjdXRpb25zPgotICAgICAgICAgICAgICA8ZXhlY3V0aW9uPgotICAgICAgICAgICAgICAgIDxpZD5hdHRhY2gtc291cmNlczwvaWQ+Ci0gICAgICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICAgICAgPGdvYWw+amFyLW5vLWZvcms8L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphdmFkb2MtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgPHZlcnNpb24+Mi45LjE8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8aWQ+YXR0YWNoLWphdmFkb2NzPC9pZD4KLSAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICA8Z29hbD5qYXI8L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5hcGFjaGUubWF2ZW4ucGx1Z2luczwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWdwZy1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjU8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8ZXhlY3V0aW9ucz4KLSAgICAgICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgICAgICA8aWQ+c2lnbi1hcnRpZmFjdHM8L2lkPgotICAgICAgICAgICAgICAgIDxwaGFzZT52ZXJpZnk8L3BoYXNlPgotICAgICAgICAgICAgICAgIDxnb2Fscz4KLSAgICAgICAgICAgICAgICAgIDxnb2FsPnNpZ248L2dvYWw+Ci0gICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxncm91cElkPm9yZy5zb25hdHlwZS5wbHVnaW5zPC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+bmV4dXMtc3RhZ2luZy1tYXZlbi1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjYuMzwvdmVyc2lvbj4KLSAgICAgICAgICAgIDxleHRlbnNpb25zPnRydWU8L2V4dGVuc2lvbnM+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgIDxzZXJ2ZXJJZD5zb25hdHlwZS1uZXh1cy1zdGFnaW5nPC9zZXJ2ZXJJZD4KLSAgICAgICAgICAgICAgIDxuZXh1c1VybD5odHRwczovL29zcy5zb25hdHlwZS5vcmcvPC9uZXh1c1VybD4KLSAgICAgICAgICAgICAgIDxhdXRvUmVsZWFzZUFmdGVyQ2xvc2U+ZmFsc2U8L2F1dG9SZWxlYXNlQWZ0ZXJDbG9zZT4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgPC9idWlsZD4KLSAgICA8L3Byb2ZpbGU+Ci0gIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby9Db2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0NvZGVkSW5wdXRCeXRlQnVmZmVyTmFuby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzk5MzE1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0NvZGVkSW5wdXRCeXRlQnVmZmVyTmFuby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNjgzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYubmFubzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogUmVhZHMgYW5kIGRlY29kZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuCi0gKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0d28ga2luZHMgb2YgbWV0aG9kczogIG1ldGhvZHMgdGhhdCByZWFkIHNwZWNpZmljCi0gKiBwcm90b2NvbCBtZXNzYWdlIGNvbnN0cnVjdHMgYW5kIGZpZWxkIHR5cGVzIChlLmcuIHtAbGluayAjcmVhZFRhZygpfSBhbmQKLSAqIHtAbGluayAjcmVhZEludDMyKCl9KSBhbmQgbWV0aG9kcyB0aGF0IHJlYWQgbG93LWxldmVsIHZhbHVlcyAoZS5nLgotICoge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoKX0gYW5kIHtAbGluayAjcmVhZFJhd0J5dGVzfSkuICBJZiB5b3UgYXJlIHJlYWRpbmcKLSAqIGVuY29kZWQgcHJvdG9jb2wgbWVzc2FnZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBmb3JtZXIgbWV0aG9kcywgYnV0IGlmIHlvdSBhcmUKLSAqIHJlYWRpbmcgc29tZSBvdGhlciBmb3JtYXQgb2YgeW91ciBvd24gZGVzaWduLCB1c2UgdGhlIGxhdHRlci4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vIHsKLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gbmV3SW5zdGFuY2UoZmluYWwgYnl0ZVtdIGJ1ZikgewotICAgIHJldHVybiBuZXdJbnN0YW5jZShidWYsIDAsIGJ1Zi5sZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5IHNsaWNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gbmV3SW5zdGFuY2UoZmluYWwgYnl0ZVtdIGJ1ZiwgZmluYWwgaW50IG9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW4pIHsKLSAgICByZXR1cm4gbmV3IENvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyhidWYsIG9mZiwgbGVuKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gcmVhZCBhIGZpZWxkIHRhZywgcmV0dXJuaW5nIHplcm8gaWYgd2UgaGF2ZSByZWFjaGVkIEVPRi4KLSAgICogUHJvdG9jb2wgbWVzc2FnZSBwYXJzZXJzIHVzZSB0aGlzIHRvIHJlYWQgdGFncywgc2luY2UgYSBwcm90b2NvbCBtZXNzYWdlCi0gICAqIG1heSBsZWdhbGx5IGVuZCB3aGVyZXZlciBhIHRhZyBvY2N1cnMsIGFuZCB6ZXJvIGlzIG5vdCBhIHZhbGlkIHRhZyBudW1iZXIuCi0gICAqLwotICBwdWJsaWMgaW50IHJlYWRUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChpc0F0RW5kKCkpIHsKLSAgICAgIGxhc3RUYWcgPSAwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbGFzdFRhZyA9IHJlYWRSYXdWYXJpbnQzMigpOwotICAgIGlmIChsYXN0VGFnID09IDApIHsKLSAgICAgIC8vIElmIHdlIGFjdHVhbGx5IHJlYWQgemVybywgdGhhdCdzIG5vdCBhIHZhbGlkIHRhZy4KLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24uaW52YWxpZFRhZygpOwotICAgIH0KLSAgICByZXR1cm4gbGFzdFRhZzsKLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZmllcyB0aGF0IHRoZSBsYXN0IGNhbGwgdG8gcmVhZFRhZygpIHJldHVybmVkIHRoZSBnaXZlbiB0YWcgdmFsdWUuCi0gICAqIFRoaXMgaXMgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIG5lc3RlZCBncm91cCBlbmRlZCB3aXRoIHRoZSBjb3JyZWN0Ci0gICAqIGVuZCB0YWcuCi0gICAqCi0gICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7QGNvZGUgdmFsdWV9IGRvZXMgbm90IG1hdGNoIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IHRhZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoZWNrTGFzdFRhZ1dhcyhmaW5hbCBpbnQgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGxhc3RUYWcgIT0gdmFsdWUpIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24uaW52YWxpZEVuZFRhZygpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhbmQgZGlzY2FyZHMgYSBzaW5nbGUgZmllbGQsIGdpdmVuIGl0cyB0YWcgdmFsdWUuCi0gICAqCi0gICAqIEByZXR1cm4ge0Bjb2RlIGZhbHNlfSBpZiB0aGUgdGFnIGlzIGFuIGVuZGdyb3VwIHRhZywgaW4gd2hpY2ggY2FzZQotICAgKiAgICAgICAgIG5vdGhpbmcgaXMgc2tpcHBlZC4gIE90aGVyd2lzZSwgcmV0dXJucyB7QGNvZGUgdHJ1ZX0uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBza2lwRmllbGQoZmluYWwgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBzd2l0Y2ggKFdpcmVGb3JtYXROYW5vLmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfVkFSSU5UOgotICAgICAgICByZWFkSW50MzIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0ZJWEVENjQ6Ci0gICAgICAgIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgc2tpcFJhd0J5dGVzKHJlYWRSYXdWYXJpbnQzMigpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX1NUQVJUX0dST1VQOgotICAgICAgICBza2lwTWVzc2FnZSgpOwotICAgICAgICBjaGVja0xhc3RUYWdXYXMoCi0gICAgICAgICAgV2lyZUZvcm1hdE5hbm8ubWFrZVRhZyhXaXJlRm9ybWF0TmFuby5nZXRUYWdGaWVsZE51bWJlcih0YWcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9FTkRfR1JPVVApKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0VORF9HUk9VUDoKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgY2FzZSBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9GSVhFRDMyOgotICAgICAgICByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uLmludmFsaWRXaXJlVHlwZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhbmQgZGlzY2FyZHMgYW4gZW50aXJlIG1lc3NhZ2UuICBUaGlzIHdpbGwgcmVhZCBlaXRoZXIgdW50aWwgRU9GCi0gICAqIG9yIHVudGlsIGFuIGVuZGdyb3VwIHRhZywgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgotICAgKi8KLSAgcHVibGljIHZvaWQgc2tpcE1lc3NhZ2UoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBmaW5hbCBpbnQgdGFnID0gcmVhZFRhZygpOwotICAgICAgaWYgKHRhZyA9PSAwIHx8ICFza2lwRmllbGQodGFnKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKiogUmVhZCBhIHtAY29kZSBkb3VibGV9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGRvdWJsZSByZWFkRG91YmxlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gRG91YmxlLmxvbmdCaXRzVG9Eb3VibGUocmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgZmxvYXR9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGZsb2F0IHJlYWRGbG9hdCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIEZsb2F0LmludEJpdHNUb0Zsb2F0KHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIHVpbnQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkVUludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDY0KCk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiB7QGNvZGUgaW50NjR9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGxvbmcgcmVhZEludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDY0KCk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiB7QGNvZGUgaW50MzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkSW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3VmFyaW50MzIoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGZpeGVkNjR9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGxvbmcgcmVhZEZpeGVkNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGZpeGVkMzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkRml4ZWQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgYm9vbH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgYm9vbGVhbiByZWFkQm9vbCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMigpICE9IDA7Ci0gIH0KLQotICAvKiogUmVhZCBhIHtAY29kZSBzdHJpbmd9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIFN0cmluZyByZWFkU3RyaW5nKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgc2l6ZSA9IHJlYWRSYXdWYXJpbnQzMigpOwotICAgIGlmIChzaXplIDw9IChidWZmZXJTaXplIC0gYnVmZmVyUG9zKSAmJiBzaXplID4gMCkgewotICAgICAgLy8gRmFzdCBwYXRoOiAgV2UgYWxyZWFkeSBoYXZlIHRoZSBieXRlcyBpbiBhIGNvbnRpZ3VvdXMgYnVmZmVyLCBzbwotICAgICAgLy8gICBqdXN0IGNvcHkgZGlyZWN0bHkgZnJvbSBpdC4KLSAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBuZXcgU3RyaW5nKGJ1ZmZlciwgYnVmZmVyUG9zLCBzaXplLCBJbnRlcm5hbE5hbm8uVVRGXzgpOwotICAgICAgYnVmZmVyUG9zICs9IHNpemU7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0LgotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVhZFJhd0J5dGVzKHNpemUpLCBJbnRlcm5hbE5hbm8uVVRGXzgpOwotICAgIH0KLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHJlYWRHcm91cChmaW5hbCBNZXNzYWdlTmFubyBtc2csIGZpbmFsIGludCBmaWVsZE51bWJlcikKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKHJlY3Vyc2lvbkRlcHRoID49IHJlY3Vyc2lvbkxpbWl0KSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uLnJlY3Vyc2lvbkxpbWl0RXhjZWVkZWQoKTsKLSAgICB9Ci0gICAgKytyZWN1cnNpb25EZXB0aDsKLSAgICBtc2cubWVyZ2VGcm9tKHRoaXMpOwotICAgIGNoZWNrTGFzdFRhZ1dhcygKLSAgICAgIFdpcmVGb3JtYXROYW5vLm1ha2VUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0VORF9HUk9VUCkpOwotICAgIC0tcmVjdXJzaW9uRGVwdGg7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCByZWFkTWVzc2FnZShmaW5hbCBNZXNzYWdlTmFubyBtc2cpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkUmF3VmFyaW50MzIoKTsKLSAgICBpZiAocmVjdXJzaW9uRGVwdGggPj0gcmVjdXJzaW9uTGltaXQpIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24ucmVjdXJzaW9uTGltaXRFeGNlZWRlZCgpOwotICAgIH0KLSAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBwdXNoTGltaXQobGVuZ3RoKTsKLSAgICArK3JlY3Vyc2lvbkRlcHRoOwotICAgIG1zZy5tZXJnZUZyb20odGhpcyk7Ci0gICAgY2hlY2tMYXN0VGFnV2FzKDApOwotICAgIC0tcmVjdXJzaW9uRGVwdGg7Ci0gICAgcG9wTGltaXQob2xkTGltaXQpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgYnl0ZXN9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGJ5dGVbXSByZWFkQnl0ZXMoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBzaXplID0gcmVhZFJhd1ZhcmludDMyKCk7Ci0gICAgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpICYmIHNpemUgPiAwKSB7Ci0gICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCi0gICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0LgotICAgICAgZmluYWwgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW3NpemVdOwotICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclBvcywgcmVzdWx0LCAwLCBzaXplKTsKLSAgICAgIGJ1ZmZlclBvcyArPSBzaXplOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGVsc2UgaWYgKHNpemUgPT0gMCkgewotICAgICAgcmV0dXJuIFdpcmVGb3JtYXROYW5vLkVNUFRZX0JZVEVTOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0LgotICAgICAgcmV0dXJuIHJlYWRSYXdCeXRlcyhzaXplKTsKLSAgICB9Ci0gIH0KLQotICAvKiogUmVhZCBhIHtAY29kZSB1aW50MzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkVUludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCk7Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBhbiBlbnVtIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gIENhbGxlciBpcyByZXNwb25zaWJsZQotICAgKiBmb3IgY29udmVydGluZyB0aGUgbnVtZXJpYyB2YWx1ZSB0byBhbiBhY3R1YWwgZW51bS4KLSAgICovCi0gIHB1YmxpYyBpbnQgcmVhZEVudW0oKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3VmFyaW50MzIoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIHtAY29kZSBzZml4ZWQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgaW50IHJlYWRTRml4ZWQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpOwotICB9Ci0KLSAgLyoqIFJlYWQgYW4ge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBsb25nIHJlYWRTRml4ZWQ2NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpOwotICB9Ci0KLSAgLyoqIFJlYWQgYW4ge0Bjb2RlIHNpbnQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgaW50IHJlYWRTSW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBkZWNvZGVaaWdaYWczMihyZWFkUmF3VmFyaW50MzIoKSk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiB7QGNvZGUgc2ludDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBsb25nIHJlYWRTSW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBkZWNvZGVaaWdaYWc2NChyZWFkUmF3VmFyaW50NjQoKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBSZWFkIGEgcmF3IFZhcmludCBmcm9tIHRoZSBzdHJlYW0uICBJZiBsYXJnZXIgdGhhbiAzMiBiaXRzLCBkaXNjYXJkIHRoZQotICAgKiB1cHBlciBiaXRzLgotICAgKi8KLSAgcHVibGljIGludCByZWFkUmF3VmFyaW50MzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGJ5dGUgdG1wID0gcmVhZFJhd0J5dGUoKTsKLSAgICBpZiAodG1wID49IDApIHsKLSAgICAgIHJldHVybiB0bXA7Ci0gICAgfQotICAgIGludCByZXN1bHQgPSB0bXAgJiAweDdmOwotICAgIGlmICgodG1wID0gcmVhZFJhd0J5dGUoKSkgPj0gMCkgewotICAgICAgcmVzdWx0IHw9IHRtcCA8PCA3OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDc7Ci0gICAgICBpZiAoKHRtcCA9IHJlYWRSYXdCeXRlKCkpID49IDApIHsKLSAgICAgICAgcmVzdWx0IHw9IHRtcCA8PCAxNDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgMTQ7Ci0gICAgICAgIGlmICgodG1wID0gcmVhZFJhd0J5dGUoKSkgPj0gMCkgewotICAgICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMjE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCAyMTsKLSAgICAgICAgICByZXN1bHQgfD0gKHRtcCA9IHJlYWRSYXdCeXRlKCkpIDw8IDI4OwotICAgICAgICAgIGlmICh0bXAgPCAwKSB7Ci0gICAgICAgICAgICAvLyBEaXNjYXJkIHVwcGVyIDMyIGJpdHMuCi0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDU7IGkrKykgewotICAgICAgICAgICAgICBpZiAocmVhZFJhd0J5dGUoKSA+PSAwKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbi5tYWxmb3JtZWRWYXJpbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKiBSZWFkIGEgcmF3IFZhcmludCBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBsb25nIHJlYWRSYXdWYXJpbnQ2NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaW50IHNoaWZ0ID0gMDsKLSAgICBsb25nIHJlc3VsdCA9IDA7Ci0gICAgd2hpbGUgKHNoaWZ0IDwgNjQpIHsKLSAgICAgIGZpbmFsIGJ5dGUgYiA9IHJlYWRSYXdCeXRlKCk7Ci0gICAgICByZXN1bHQgfD0gKGxvbmcpKGIgJiAweDdGKSA8PCBzaGlmdDsKLSAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICAgIHNoaWZ0ICs9IDc7Ci0gICAgfQotICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24ubWFsZm9ybWVkVmFyaW50KCk7Ci0gIH0KLQotICAvKiogUmVhZCBhIDMyLWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgaW50IHJlYWRSYXdMaXR0bGVFbmRpYW4zMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgYnl0ZSBiMSA9IHJlYWRSYXdCeXRlKCk7Ci0gICAgZmluYWwgYnl0ZSBiMiA9IHJlYWRSYXdCeXRlKCk7Ci0gICAgZmluYWwgYnl0ZSBiMyA9IHJlYWRSYXdCeXRlKCk7Ci0gICAgZmluYWwgYnl0ZSBiNCA9IHJlYWRSYXdCeXRlKCk7Ci0gICAgcmV0dXJuICgoYjEgJiAweGZmKSAgICAgICkgfAotICAgICAgICAgICAoKGIyICYgMHhmZikgPDwgIDgpIHwKLSAgICAgICAgICAgKChiMyAmIDB4ZmYpIDw8IDE2KSB8Ci0gICAgICAgICAgICgoYjQgJiAweGZmKSA8PCAyNCk7Ci0gIH0KLQotICAvKiogUmVhZCBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGJ5dGUgYjEgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjIgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjMgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjQgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjUgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjYgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjcgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjggPSByZWFkUmF3Qnl0ZSgpOwotICAgIHJldHVybiAoKChsb25nKWIxICYgMHhmZikgICAgICApIHwKLSAgICAgICAgICAgKCgobG9uZyliMiAmIDB4ZmYpIDw8ICA4KSB8Ci0gICAgICAgICAgICgoKGxvbmcpYjMgJiAweGZmKSA8PCAxNikgfAotICAgICAgICAgICAoKChsb25nKWI0ICYgMHhmZikgPDwgMjQpIHwKLSAgICAgICAgICAgKCgobG9uZyliNSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgICAgICAgICgoKGxvbmcpYjYgJiAweGZmKSA8PCA0MCkgfAotICAgICAgICAgICAoKChsb25nKWI3ICYgMHhmZikgPDwgNDgpIHwKLSAgICAgICAgICAgKCgobG9uZyliOCAmIDB4ZmYpIDw8IDU2KTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWNvZGUgYSBaaWdaYWctZW5jb2RlZCAzMi1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKLSAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCi0gICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLSAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLSAgICoKLSAgICogQHBhcmFtIG4gQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQotICAgKiAgICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgotICAgKiBAcmV0dXJuIEEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZGVjb2RlWmlnWmFnMzIoZmluYWwgaW50IG4pIHsKLSAgICByZXR1cm4gKG4gPj4+IDEpIF4gLShuICYgMSk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGEgWmlnWmFnLWVuY29kZWQgNjQtYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCi0gICAqIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLAotICAgKiBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsCi0gICAqIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCi0gICAqCi0gICAqIEBwYXJhbSBuIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLCBzdG9yZWQgaW4gYSBzaWduZWQgaW50IGJlY2F1c2UKLSAgICogICAgICAgICAgSmF2YSBoYXMgbm8gZXhwbGljaXQgdW5zaWduZWQgc3VwcG9ydC4KLSAgICogQHJldHVybiBBIHNpZ25lZCA2NC1iaXQgaW50ZWdlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBkZWNvZGVaaWdaYWc2NChmaW5hbCBsb25nIG4pIHsKLSAgICByZXR1cm4gKG4gPj4+IDEpIF4gLShuICYgMSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHByaXZhdGUgZmluYWwgYnl0ZVtdIGJ1ZmZlcjsKLSAgcHJpdmF0ZSBpbnQgYnVmZmVyU3RhcnQ7Ci0gIHByaXZhdGUgaW50IGJ1ZmZlclNpemU7Ci0gIHByaXZhdGUgaW50IGJ1ZmZlclNpemVBZnRlckxpbWl0OwotICBwcml2YXRlIGludCBidWZmZXJQb3M7Ci0gIHByaXZhdGUgaW50IGxhc3RUYWc7Ci0KLSAgLyoqIFRoZSBhYnNvbHV0ZSBwb3NpdGlvbiBvZiB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IG1lc3NhZ2UuICovCi0gIHByaXZhdGUgaW50IGN1cnJlbnRMaW1pdCA9IEludGVnZXIuTUFYX1ZBTFVFOwotCi0gIC8qKiBTZWUgc2V0UmVjdXJzaW9uTGltaXQoKSAqLwotICBwcml2YXRlIGludCByZWN1cnNpb25EZXB0aDsKLSAgcHJpdmF0ZSBpbnQgcmVjdXJzaW9uTGltaXQgPSBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVDsKLQotICAvKiogU2VlIHNldFNpemVMaW1pdCgpICovCi0gIHByaXZhdGUgaW50IHNpemVMaW1pdCA9IERFRkFVTFRfU0laRV9MSU1JVDsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9SRUNVUlNJT05fTElNSVQgPSA2NDsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU0laRV9MSU1JVCA9IDY0IDw8IDIwOyAgLy8gNjRNQgotCi0gIHByaXZhdGUgQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHsKLSAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICBidWZmZXJTdGFydCA9IG9mZjsKLSAgICBidWZmZXJTaXplID0gb2ZmICsgbGVuOwotICAgIGJ1ZmZlclBvcyA9IG9mZjsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gbWVzc2FnZSByZWN1cnNpb24gZGVwdGguICBJbiBvcmRlciB0byBwcmV2ZW50IG1hbGljaW91cwotICAgKiBtZXNzYWdlcyBmcm9tIGNhdXNpbmcgc3RhY2sgb3ZlcmZsb3dzLCB7QGNvZGUgQ29kZWRJbnB1dFN0cmVhbX0gbGltaXRzCi0gICAqIGhvdyBkZWVwbHkgbWVzc2FnZXMgbWF5IGJlIG5lc3RlZC4gIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBvbGQgbGltaXQuCi0gICAqLwotICBwdWJsaWMgaW50IHNldFJlY3Vyc2lvbkxpbWl0KGZpbmFsIGludCBsaW1pdCkgewotICAgIGlmIChsaW1pdCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJSZWN1cnNpb24gbGltaXQgY2Fubm90IGJlIG5lZ2F0aXZlOiAiICsgbGltaXQpOwotICAgIH0KLSAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSByZWN1cnNpb25MaW1pdDsKLSAgICByZWN1cnNpb25MaW1pdCA9IGxpbWl0OwotICAgIHJldHVybiBvbGRMaW1pdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gbWVzc2FnZSBzaXplLiAgSW4gb3JkZXIgdG8gcHJldmVudCBtYWxpY2lvdXMKLSAgICogbWVzc2FnZXMgZnJvbSBleGhhdXN0aW5nIG1lbW9yeSBvciBjYXVzaW5nIGludGVnZXIgb3ZlcmZsb3dzLAotICAgKiB7QGNvZGUgQ29kZWRJbnB1dFN0cmVhbX0gbGltaXRzIGhvdyBsYXJnZSBhIG1lc3NhZ2UgbWF5IGJlLgotICAgKiBUaGUgZGVmYXVsdCBsaW1pdCBpcyA2NE1CLiAgWW91IHNob3VsZCBzZXQgdGhpcyBsaW1pdCBhcyBzbWFsbAotICAgKiBhcyB5b3UgY2FuIHdpdGhvdXQgaGFybWluZyB5b3VyIGFwcCdzIGZ1bmN0aW9uYWxpdHkuICBOb3RlIHRoYXQKLSAgICogc2l6ZSBsaW1pdHMgb25seSBhcHBseSB3aGVuIHJlYWRpbmcgZnJvbSBhbiB7QGNvZGUgSW5wdXRTdHJlYW19LCBub3QKLSAgICogd2hlbiBjb25zdHJ1Y3RlZCBhcm91bmQgYSByYXcgYnl0ZSBhcnJheS4KLSAgICogPHA+Ci0gICAqIElmIHlvdSB3YW50IHRvIHJlYWQgc2V2ZXJhbCBtZXNzYWdlcyBmcm9tIGEgc2luZ2xlIENvZGVkSW5wdXRTdHJlYW0sIHlvdQotICAgKiBjb3VsZCBjYWxsIHtAbGluayAjcmVzZXRTaXplQ291bnRlcigpfSBhZnRlciBlYWNoIG9uZSB0byBhdm9pZCBoaXR0aW5nIHRoZQotICAgKiBzaXplIGxpbWl0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBvbGQgbGltaXQuCi0gICAqLwotICBwdWJsaWMgaW50IHNldFNpemVMaW1pdChmaW5hbCBpbnQgbGltaXQpIHsKLSAgICBpZiAobGltaXQgPCAwKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiU2l6ZSBsaW1pdCBjYW5ub3QgYmUgbmVnYXRpdmU6ICIgKyBsaW1pdCk7Ci0gICAgfQotICAgIGZpbmFsIGludCBvbGRMaW1pdCA9IHNpemVMaW1pdDsKLSAgICBzaXplTGltaXQgPSBsaW1pdDsKLSAgICByZXR1cm4gb2xkTGltaXQ7Ci0gIH0KLQotICAvKioKLSAgICogUmVzZXRzIHRoZSBjdXJyZW50IHNpemUgY291bnRlciB0byB6ZXJvIChzZWUge0BsaW5rICNzZXRTaXplTGltaXQoaW50KX0pLgotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXRTaXplQ291bnRlcigpIHsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHtAY29kZSBjdXJyZW50TGltaXR9IHRvIChjdXJyZW50IHBvc2l0aW9uKSArIHtAY29kZSBieXRlTGltaXR9LiAgVGhpcwotICAgKiBpcyBjYWxsZWQgd2hlbiBkZXNjZW5kaW5nIGludG8gYSBsZW5ndGgtZGVsaW1pdGVkIGVtYmVkZGVkIG1lc3NhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG9sZCBsaW1pdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgcHVzaExpbWl0KGludCBieXRlTGltaXQpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIHsKLSAgICBpZiAoYnl0ZUxpbWl0IDwgMCkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbi5uZWdhdGl2ZVNpemUoKTsKLSAgICB9Ci0gICAgYnl0ZUxpbWl0ICs9IGJ1ZmZlclBvczsKLSAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBjdXJyZW50TGltaXQ7Ci0gICAgaWYgKGJ5dGVMaW1pdCA+IG9sZExpbWl0KSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgY3VycmVudExpbWl0ID0gYnl0ZUxpbWl0OwotCi0gICAgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKLQotICAgIHJldHVybiBvbGRMaW1pdDsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCByZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpIHsKLSAgICBidWZmZXJTaXplICs9IGJ1ZmZlclNpemVBZnRlckxpbWl0OwotICAgIGZpbmFsIGludCBidWZmZXJFbmQgPSBidWZmZXJTaXplOwotICAgIGlmIChidWZmZXJFbmQgPiBjdXJyZW50TGltaXQpIHsKLSAgICAgIC8vIExpbWl0IGlzIGluIGN1cnJlbnQgYnVmZmVyLgotICAgICAgYnVmZmVyU2l6ZUFmdGVyTGltaXQgPSBidWZmZXJFbmQgLSBjdXJyZW50TGltaXQ7Ci0gICAgICBidWZmZXJTaXplIC09IGJ1ZmZlclNpemVBZnRlckxpbWl0OwotICAgIH0gZWxzZSB7Ci0gICAgICBidWZmZXJTaXplQWZ0ZXJMaW1pdCA9IDA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIERpc2NhcmRzIHRoZSBjdXJyZW50IGxpbWl0LCByZXR1cm5pbmcgdG8gdGhlIHByZXZpb3VzIGxpbWl0LgotICAgKgotICAgKiBAcGFyYW0gb2xkTGltaXQgVGhlIG9sZCBsaW1pdCwgYXMgcmV0dXJuZWQgYnkge0Bjb2RlIHB1c2hMaW1pdH0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBwb3BMaW1pdChmaW5hbCBpbnQgb2xkTGltaXQpIHsKLSAgICBjdXJyZW50TGltaXQgPSBvbGRMaW1pdDsKLSAgICByZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB0byBiZSByZWFkIGJlZm9yZSB0aGUgY3VycmVudCBsaW1pdC4KLSAgICogSWYgbm8gbGltaXQgaXMgc2V0LCByZXR1cm5zIC0xLgotICAgKi8KLSAgcHVibGljIGludCBnZXRCeXRlc1VudGlsTGltaXQoKSB7Ci0gICAgaWYgKGN1cnJlbnRMaW1pdCA9PSBJbnRlZ2VyLk1BWF9WQUxVRSkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIGZpbmFsIGludCBjdXJyZW50QWJzb2x1dGVQb3NpdGlvbiA9IGJ1ZmZlclBvczsKLSAgICByZXR1cm4gY3VycmVudExpbWl0IC0gY3VycmVudEFic29sdXRlUG9zaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZQotICAgKiBjYXNlIGlmIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IHNvdXJjZSBoYXMgYmVlbiByZWFjaGVkIG9yCi0gICAqIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgYSBsaW1pdCBjcmVhdGVkIHVzaW5nIHtAbGluayAjcHVzaExpbWl0KGludCl9LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdEVuZCgpIHsKLSAgICByZXR1cm4gYnVmZmVyUG9zID09IGJ1ZmZlclNpemU7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGN1cnJlbnQgcG9zaXRpb24gaW4gYnVmZmVyIHJlbGF0aXZlIHRvIGJlZ2lubmluZyBvZmZzZXQuCi0gICAqLwotICBwdWJsaWMgaW50IGdldFBvc2l0aW9uKCkgewotICAgIHJldHVybiBidWZmZXJQb3MgLSBidWZmZXJTdGFydDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXRyaWV2ZXMgYSBzdWJzZXQgb2YgZGF0YSBpbiB0aGUgYnVmZmVyLiBUaGUgcmV0dXJuZWQgYXJyYXkgaXMgbm90IGJhY2tlZCBieSB0aGUgb3JpZ2luYWwKLSAgICogYnVmZmVyIGFycmF5LgotICAgKgotICAgKiBAcGFyYW0gb2Zmc2V0IHRoZSBwb3NpdGlvbiAocmVsYXRpdmUgdG8gdGhlIGJ1ZmZlciBzdGFydCBwb3NpdGlvbikgdG8gc3RhcnQgYXQuCi0gICAqIEBwYXJhbSBsZW5ndGggdGhlIG51bWJlciBvZiBieXRlcyB0byByZXRyaWV2ZS4KLSAgICovCi0gIHB1YmxpYyBieXRlW10gZ2V0RGF0YShpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gV2lyZUZvcm1hdE5hbm8uRU1QVFlfQllURVM7Ci0gICAgfQotICAgIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbbGVuZ3RoXTsKLSAgICBpbnQgc3RhcnQgPSBidWZmZXJTdGFydCArIG9mZnNldDsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgc3RhcnQsIGNvcHksIDAsIGxlbmd0aCk7Ci0gICAgcmV0dXJuIGNvcHk7Ci0gIH0KLQotICAvKioKLSAgICogUmV3aW5kIHRvIHByZXZpb3VzIHBvc2l0aW9uLiBDYW5ub3QgZ28gZm9yd2FyZC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHJld2luZFRvUG9zaXRpb24oaW50IHBvc2l0aW9uKSB7Ci0gICAgaWYgKHBvc2l0aW9uID4gYnVmZmVyUG9zIC0gYnVmZmVyU3RhcnQpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJQb3NpdGlvbiAiICsgcG9zaXRpb24gKyAiIGlzIGJleW9uZCBjdXJyZW50ICIgKyAoYnVmZmVyUG9zIC0gYnVmZmVyU3RhcnQpKTsKLSAgICB9Ci0gICAgaWYgKHBvc2l0aW9uIDwgMCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHBvc2l0aW9uICIgKyBwb3NpdGlvbik7Ci0gICAgfQotICAgIGJ1ZmZlclBvcyA9IGJ1ZmZlclN0YXJ0ICsgcG9zaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmVhZCBvbmUgYnl0ZSBmcm9tIHRoZSBpbnB1dC4KLSAgICoKLSAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIFRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB3YXMgcmVhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBieXRlIHJlYWRSYXdCeXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoYnVmZmVyUG9zID09IGJ1ZmZlclNpemUpIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgIH0KLSAgICByZXR1cm4gYnVmZmVyW2J1ZmZlclBvcysrXTsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIGEgZml4ZWQgc2l6ZSBvZiBieXRlcyBmcm9tIHRoZSBpbnB1dC4KLSAgICoKLSAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIFRoZSBlbmQgb2YgdGhlIHN0cmVhbSBvciB0aGUgY3VycmVudAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCB3YXMgcmVhY2hlZC4KLSAgICovCi0gIHB1YmxpYyBieXRlW10gcmVhZFJhd0J5dGVzKGZpbmFsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbi5uZWdhdGl2ZVNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAoYnVmZmVyUG9zICsgc2l6ZSA+IGN1cnJlbnRMaW1pdCkgewotICAgICAgLy8gUmVhZCB0byB0aGUgZW5kIG9mIHRoZSBzdHJlYW0gYW55d2F5LgotICAgICAgc2tpcFJhd0J5dGVzKGN1cnJlbnRMaW1pdCAtIGJ1ZmZlclBvcyk7Ci0gICAgICAvLyBUaGVuIGZhaWwuCi0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zKSB7Ci0gICAgICAvLyBXZSBoYXZlIGFsbCB0aGUgYnl0ZXMgd2UgbmVlZCBhbHJlYWR5LgotICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVyUG9zLCBieXRlcywgMCwgc2l6ZSk7Ci0gICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKLSAgICAgIHJldHVybiBieXRlczsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGFuZCBkaXNjYXJkcyB7QGNvZGUgc2l6ZX0gYnl0ZXMuCi0gICAqCi0gICAqIEB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiBUaGUgZW5kIG9mIHRoZSBzdHJlYW0gb3IgdGhlIGN1cnJlbnQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgd2FzIHJlYWNoZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCBza2lwUmF3Qnl0ZXMoZmluYWwgaW50IHNpemUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKHNpemUgPCAwKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uLm5lZ2F0aXZlU2l6ZSgpOwotICAgIH0KLQotICAgIGlmIChidWZmZXJQb3MgKyBzaXplID4gY3VycmVudExpbWl0KSB7Ci0gICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbnl3YXkuCi0gICAgICBza2lwUmF3Qnl0ZXMoY3VycmVudExpbWl0IC0gYnVmZmVyUG9zKTsKLSAgICAgIC8vIFRoZW4gZmFpbC4KLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgIH0KLQotICAgIGlmIChzaXplIDw9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpIHsKLSAgICAgIC8vIFdlIGhhdmUgYWxsIHRoZSBieXRlcyB3ZSBuZWVkIGFscmVhZHkuCi0gICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVhZCBhIHByaW1pdGl2ZSB0eXBlLgotICBPYmplY3QgcmVhZFByaW1pdGl2ZUZpZWxkKGludCB0eXBlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgcmV0dXJuIHJlYWREb3VibGUoKTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfRkxPQVQ6Ci0gICAgICAgICAgcmV0dXJuIHJlYWRGbG9hdCgpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9JTlQ2NDoKLSAgICAgICAgICByZXR1cm4gcmVhZEludDY0KCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1VJTlQ2NDoKLSAgICAgICAgICByZXR1cm4gcmVhZFVJbnQ2NCgpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9JTlQzMjoKLSAgICAgICAgICByZXR1cm4gcmVhZEludDMyKCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0ZJWEVENjQ6Ci0gICAgICAgICAgcmV0dXJuIHJlYWRGaXhlZDY0KCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0ZJWEVEMzI6Ci0gICAgICAgICAgcmV0dXJuIHJlYWRGaXhlZDMyKCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0JPT0w6Ci0gICAgICAgICAgcmV0dXJuIHJlYWRCb29sKCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NUUklORzoKLSAgICAgICAgICByZXR1cm4gcmVhZFN0cmluZygpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9CWVRFUzoKLSAgICAgICAgICByZXR1cm4gcmVhZEJ5dGVzKCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1VJTlQzMjoKLSAgICAgICAgICByZXR1cm4gcmVhZFVJbnQzMigpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9FTlVNOgotICAgICAgICAgIHJldHVybiByZWFkRW51bSgpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9TRklYRUQzMjoKLSAgICAgICAgICByZXR1cm4gcmVhZFNGaXhlZDMyKCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NGSVhFRDY0OgotICAgICAgICAgIHJldHVybiByZWFkU0ZpeGVkNjQoKTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfU0lOVDMyOgotICAgICAgICAgIHJldHVybiByZWFkU0ludDMyKCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NJTlQ2NDoKLSAgICAgICAgICByZXR1cm4gcmVhZFNJbnQ2NCgpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHR5cGUgIiArIHR5cGUpOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjJhZGE4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0NvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CdWZmZXJPdmVyZmxvd0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5CeXRlQnVmZmVyOwotaW1wb3J0IGphdmEubmlvLkJ5dGVPcmRlcjsKLWltcG9ydCBqYXZhLm5pby5SZWFkT25seUJ1ZmZlckV4Y2VwdGlvbjsKLQotLyoqCi0gKiBFbmNvZGVzIGFuZCB3cml0ZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuCi0gKgotICogPHA+VGhpcyBjbGFzcyBjb250YWlucyB0d28ga2luZHMgb2YgbWV0aG9kczogIG1ldGhvZHMgdGhhdCB3cml0ZSBzcGVjaWZpYwotICogcHJvdG9jb2wgbWVzc2FnZSBjb25zdHJ1Y3RzIGFuZCBmaWVsZCB0eXBlcyAoZS5nLiB7QGxpbmsgI3dyaXRlVGFnfSBhbmQKLSAqIHtAbGluayAjd3JpdGVJbnQzMn0pIGFuZCBtZXRob2RzIHRoYXQgd3JpdGUgbG93LWxldmVsIHZhbHVlcyAoZS5nLgotICoge0BsaW5rICN3cml0ZVJhd1ZhcmludDMyfSBhbmQge0BsaW5rICN3cml0ZVJhd0J5dGVzfSkuICBJZiB5b3UgYXJlCi0gKiB3cml0aW5nIGVuY29kZWQgcHJvdG9jb2wgbWVzc2FnZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBmb3JtZXIgbWV0aG9kcywgYnV0IGlmCi0gKiB5b3UgYXJlIHdyaXRpbmcgc29tZSBvdGhlciBmb3JtYXQgb2YgeW91ciBvd24gZGVzaWduLCB1c2UgdGhlIGxhdHRlci4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGlzIHRvdGFsbHkgdW5zeW5jaHJvbml6ZWQuCi0gKgotICogQGF1dGhvciBrbmV0b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8gewotICAvKiBtYXggYnl0ZXMgcGVyIGphdmEgVVRGLTE2IGNoYXIgaW4gVVRGLTggKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IE1BWF9VVEY4X0VYUEFOU0lPTiA9IDM7Ci0gIHByaXZhdGUgZmluYWwgQnl0ZUJ1ZmZlciBidWZmZXI7Ci0KLSAgcHJpdmF0ZSBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbmd0aCkgewotICAgIHRoaXMoQnl0ZUJ1ZmZlci53cmFwKGJ1ZmZlciwgb2Zmc2V0LCBsZW5ndGgpKTsKLSAgfQotCi0gIHByaXZhdGUgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyhmaW5hbCBCeXRlQnVmZmVyIGJ1ZmZlcikgewotICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgIHRoaXMuYnVmZmVyLm9yZGVyKEJ5dGVPcmRlci5MSVRUTEVfRU5ESUFOKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgZ2l2ZW4KLSAgICogYnl0ZSBhcnJheS4gIElmIG1vcmUgYnl0ZXMgYXJlIHdyaXR0ZW4gdGhhbiBmaXQgaW4gdGhlIGFycmF5LAotICAgKiB7QGxpbmsgT3V0T2ZTcGFjZUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uICBXcml0aW5nIGRpcmVjdGx5IHRvIGEgZmxhdAotICAgKiBhcnJheSBpcyBmYXN0ZXIgdGhhbiB3cml0aW5nIHRvIGFuIHtAY29kZSBPdXRwdXRTdHJlYW19LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBmbGF0QXJyYXkpIHsKLSAgICByZXR1cm4gbmV3SW5zdGFuY2UoZmxhdEFycmF5LCAwLCBmbGF0QXJyYXkubGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB0aGF0IHdyaXRlcyBkaXJlY3RseSB0byB0aGUgZ2l2ZW4KLSAgICogYnl0ZSBhcnJheSBzbGljZS4gIElmIG1vcmUgYnl0ZXMgYXJlIHdyaXR0ZW4gdGhhbiBmaXQgaW4gdGhlIHNsaWNlLAotICAgKiB7QGxpbmsgT3V0T2ZTcGFjZUV4Y2VwdGlvbn0gd2lsbCBiZSB0aHJvd24uICBXcml0aW5nIGRpcmVjdGx5IHRvIGEgZmxhdAotICAgKiBhcnJheSBpcyBmYXN0ZXIgdGhhbiB3cml0aW5nIHRvIGFuIHtAY29kZSBPdXRwdXRTdHJlYW19LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBmbGF0QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIG5ldyBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vKGZsYXRBcnJheSwgb2Zmc2V0LCBsZW5ndGgpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZG91YmxlfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVEb3VibGUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBkb3VibGUgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0ZJWEVENjQpOwotICAgIHdyaXRlRG91YmxlTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVGbG9hdChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGZsb2F0IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0ZJWEVEMzIpOwotICAgIHdyaXRlRmxvYXROb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgdWludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVVSW50NjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9WQVJJTlQpOwotICAgIHdyaXRlVUludDY0Tm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlSW50NjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgd3JpdGVJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgaW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgd3JpdGVJbnQzMk5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBmaXhlZDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0ZJWEVENjQpOwotICAgIHdyaXRlRml4ZWQ2NE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBmaXhlZDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfRklYRUQzMik7Ci0gICAgd3JpdGVGaXhlZDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGJvb2x9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBib29sZWFuIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfVkFSSU5UKTsKLSAgICB3cml0ZUJvb2xOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgc3RyaW5nfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTdHJpbmcoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBTdHJpbmcgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgIHdyaXRlU3RyaW5nTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVHcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VOYW5vIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX1NUQVJUX0dST1VQKTsKLSAgICB3cml0ZUdyb3VwTm9UYWcodmFsdWUpOwotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9FTkRfR1JPVVApOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIE1lc3NhZ2VOYW5vIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgd3JpdGVNZXNzYWdlTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVCeXRlcyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGJ5dGVbXSB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICB3cml0ZUJ5dGVzTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlVUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9WQVJJTlQpOwotICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGFuIGVudW0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICBDYWxsZXIgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIGNvbnZlcnRpbmcgdGhlIGVudW0gdmFsdWUgdG8gaXRzIG51bWVyaWMgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUVudW0oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9WQVJJTlQpOwotICAgIHdyaXRlRW51bU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVNGaXhlZDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0ZJWEVEMzIpOwotICAgIHdyaXRlU0ZpeGVkMzJOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfRklYRUQ2NCk7Ci0gICAgd3JpdGVTRml4ZWQ2NE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgc2ludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTSW50MzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgd3JpdGVTSW50MzJOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlU0ludDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfVkFSSU5UKTsKLSAgICB3cml0ZVNJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IgaGlzdG9yaWNhbCByZWFzb25zLAotICAgKiB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCi0gICAqLwotLy8gIHB1YmxpYyB2b2lkIHdyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VNaWNybyB2YWx1ZSkKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLS8vICAgIHdyaXRlVGFnKFdpcmVGb3JtYXRNaWNyby5NRVNTQUdFX1NFVF9JVEVNLCBXaXJlRm9ybWF0TWljcm8uV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotLy8gICAgd3JpdGVVSW50MzIoV2lyZUZvcm1hdE1pY3JvLk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKTsKLS8vICAgIHdyaXRlTWVzc2FnZShXaXJlRm9ybWF0TWljcm8uTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOwotLy8gICAgd3JpdGVUYWcoV2lyZUZvcm1hdE1pY3JvLk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXRNaWNyby5XSVJFVFlQRV9FTkRfR1JPVVApOwotLy8gIH0KLQotICAvKioKLSAgICogV3JpdGUgYW4gdW5wYXJzZWQgTWVzc2FnZVNldCBleHRlbnNpb24gZmllbGQgdG8gdGhlIHN0cmVhbS4gIEZvcgotICAgKiBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KLSAgICovCi0vLyAgcHVibGljIHZvaWQgd3JpdGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpbmFsIGludCBmaWVsZE51bWJlciwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVN0cmluZ01pY3JvIHZhbHVlKQotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotLy8gICAgd3JpdGVUYWcoV2lyZUZvcm1hdE1pY3JvLk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXRNaWNyby5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7Ci0vLyAgICB3cml0ZVVJbnQzMihXaXJlRm9ybWF0TWljcm8uTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpOwotLy8gICAgd3JpdGVCeXRlcyhXaXJlRm9ybWF0TWljcm8uTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOwotLy8gICAgd3JpdGVUYWcoV2lyZUZvcm1hdE1pY3JvLk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXRNaWNyby5XSVJFVFlQRV9FTkRfR1JPVVApOwotLy8gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBkb3VibGV9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlTm9UYWcoZmluYWwgZG91YmxlIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHModmFsdWUpKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBmbG9hdH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVGbG9hdE5vVGFnKGZpbmFsIGZsb2F0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIoRmxvYXQuZmxvYXRUb0ludEJpdHModmFsdWUpKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSB1aW50NjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlVUludDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgaW50NjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlSW50NjROb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3VmFyaW50NjQodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVJbnQzMk5vVGFnKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAodmFsdWUgPj0gMCkgewotICAgICAgd3JpdGVSYXdWYXJpbnQzMih2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE11c3Qgc2lnbi1leHRlbmQuCi0gICAgICB3cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVGaXhlZDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd0xpdHRsZUVuZGlhbjY0KHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBmaXhlZDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVkMzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdMaXR0bGVFbmRpYW4zMih2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgYm9vbH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVCb29sTm9UYWcoZmluYWwgYm9vbGVhbiB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd0J5dGUodmFsdWUgPyAxIDogMCk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgc3RyaW5nfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZ05vVGFnKGZpbmFsIFN0cmluZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBVVEYtOCBieXRlIGxlbmd0aCBvZiB0aGUgc3RyaW5nIGlzIGF0IGxlYXN0IGl0cyBVVEYtMTYgY29kZSB1bml0IGxlbmd0aCAodmFsdWUubGVuZ3RoKCkpLAotICAgIC8vIGFuZCBhdCBtb3N0IDMgdGltZXMgb2YgaXQuIE9wdGltaXplIGZvciB0aGUgY2FzZSB3aGVyZSB3ZSBrbm93IHRoaXMgbGVuZ3RoIHJlc3VsdHMgaW4gYQotICAgIC8vIGNvbnN0YW50IHZhcmludCBsZW5ndGggLSBzYXZlcyBtZWFzdXJpbmcgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuCi0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIGludCBtaW5MZW5ndGhWYXJJbnRTaXplID0gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZS5sZW5ndGgoKSk7Ci0gICAgICBmaW5hbCBpbnQgbWF4TGVuZ3RoVmFySW50U2l6ZSA9IGNvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUubGVuZ3RoKCkgKiBNQVhfVVRGOF9FWFBBTlNJT04pOwotICAgICAgaWYgKG1pbkxlbmd0aFZhckludFNpemUgPT0gbWF4TGVuZ3RoVmFySW50U2l6ZSkgewotICAgICAgICBpbnQgb2xkUG9zaXRpb24gPSBidWZmZXIucG9zaXRpb24oKTsKLSAgICAgICAgLy8gQnVmZmVyLnBvc2l0aW9uLCB3aGVuIHBhc3NlZCBhIHBvc2l0aW9uIHRoYXQgaXMgcGFzdCBpdHMgbGltaXQsIHRocm93cwotICAgICAgICAvLyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24sIGFuZCB0aGlzIGNsYXNzIGlzIGRvY3VtZW50ZWQgdG8gdGhyb3cKLSAgICAgICAgLy8gT3V0T2ZTcGFjZUV4Y2VwdGlvbiBpbnN0ZWFkLgotICAgICAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgbWluTGVuZ3RoVmFySW50U2l6ZSkgewotICAgICAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKG9sZFBvc2l0aW9uICsgbWluTGVuZ3RoVmFySW50U2l6ZSwgYnVmZmVyLmxpbWl0KCkpOwotICAgICAgICB9Ci0gICAgICAgIGJ1ZmZlci5wb3NpdGlvbihvbGRQb3NpdGlvbiArIG1pbkxlbmd0aFZhckludFNpemUpOwotICAgICAgICBlbmNvZGUodmFsdWUsIGJ1ZmZlcik7Ci0gICAgICAgIGludCBuZXdQb3NpdGlvbiA9IGJ1ZmZlci5wb3NpdGlvbigpOwotICAgICAgICBidWZmZXIucG9zaXRpb24ob2xkUG9zaXRpb24pOwotICAgICAgICB3cml0ZVJhd1ZhcmludDMyKG5ld1Bvc2l0aW9uIC0gb2xkUG9zaXRpb24gLSBtaW5MZW5ndGhWYXJJbnRTaXplKTsKLSAgICAgICAgYnVmZmVyLnBvc2l0aW9uKG5ld1Bvc2l0aW9uKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdyaXRlUmF3VmFyaW50MzIoZW5jb2RlZExlbmd0aCh2YWx1ZSkpOwotICAgICAgICBlbmNvZGUodmFsdWUsIGJ1ZmZlcik7Ci0gICAgICB9Ci0gICAgfSBjYXRjaCAoQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gZSkgewotICAgICAgZmluYWwgT3V0T2ZTcGFjZUV4Y2VwdGlvbiBvdXRPZlNwYWNlRXhjZXB0aW9uID0gbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oYnVmZmVyLnBvc2l0aW9uKCksCi0gICAgICAgICAgYnVmZmVyLmxpbWl0KCkpOwotICAgICAgb3V0T2ZTcGFjZUV4Y2VwdGlvbi5pbml0Q2F1c2UoZSk7Ci0gICAgICB0aHJvdyBvdXRPZlNwYWNlRXhjZXB0aW9uOwotICAgIH0KLSAgfQotCi0gIC8vIFRoZXNlIFVURi04IGhhbmRsaW5nIG1ldGhvZHMgYXJlIGNvcGllZCBmcm9tIEd1YXZhJ3MgVXRmOCBjbGFzcy4KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBpbiB0aGUgVVRGLTgtZW5jb2RlZCBmb3JtIG9mIHtAY29kZSBzZXF1ZW5jZX0uIEZvciBhIHN0cmluZywKLSAgICogdGhpcyBtZXRob2QgaXMgZXF1aXZhbGVudCB0byB7QGNvZGUgc3RyaW5nLmdldEJ5dGVzKFVURl84KS5sZW5ndGh9LCBidXQgaXMgbW9yZSBlZmZpY2llbnQgaW4KLSAgICogYm90aCB0aW1lIGFuZCBzcGFjZS4KLSAgICoKLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gaWYge0Bjb2RlIHNlcXVlbmNlfSBjb250YWlucyBpbGwtZm9ybWVkIFVURi0xNiAodW5wYWlyZWQKLSAgICogICAgIHN1cnJvZ2F0ZXMpCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgZW5jb2RlZExlbmd0aChDaGFyU2VxdWVuY2Ugc2VxdWVuY2UpIHsKLSAgICAvLyBXYXJuaW5nIHRvIG1haW50YWluZXJzOiB0aGlzIGltcGxlbWVudGF0aW9uIGlzIGhpZ2hseSBvcHRpbWl6ZWQuCi0gICAgaW50IHV0ZjE2TGVuZ3RoID0gc2VxdWVuY2UubGVuZ3RoKCk7Ci0gICAgaW50IHV0ZjhMZW5ndGggPSB1dGYxNkxlbmd0aDsKLSAgICBpbnQgaSA9IDA7Ci0KLSAgICAvLyBUaGlzIGxvb3Agb3B0aW1pemVzIGZvciBwdXJlIEFTQ0lJLgotICAgIHdoaWxlIChpIDwgdXRmMTZMZW5ndGggJiYgc2VxdWVuY2UuY2hhckF0KGkpIDwgMHg4MCkgewotICAgICAgaSsrOwotICAgIH0KLQotICAgIC8vIFRoaXMgbG9vcCBvcHRpbWl6ZXMgZm9yIGNoYXJzIGxlc3MgdGhhbiAweDgwMC4KLSAgICBmb3IgKDsgaSA8IHV0ZjE2TGVuZ3RoOyBpKyspIHsKLSAgICAgIGNoYXIgYyA9IHNlcXVlbmNlLmNoYXJBdChpKTsKLSAgICAgIGlmIChjIDwgMHg4MDApIHsKLSAgICAgICAgdXRmOExlbmd0aCArPSAoKDB4N2YgLSBjKSA+Pj4gMzEpOyAgLy8gYnJhbmNoIGZyZWUhCi0gICAgICB9IGVsc2UgewotICAgICAgICB1dGY4TGVuZ3RoICs9IGVuY29kZWRMZW5ndGhHZW5lcmFsKHNlcXVlbmNlLCBpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHV0ZjhMZW5ndGggPCB1dGYxNkxlbmd0aCkgewotICAgICAgLy8gTmVjZXNzYXJ5IGFuZCBzdWZmaWNpZW50IGNvbmRpdGlvbiBmb3Igb3ZlcmZsb3cgYmVjYXVzZSBvZiBtYXhpbXVtIDN4IGV4cGFuc2lvbgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVVRGLTggbGVuZ3RoIGRvZXMgbm90IGZpdCBpbiBpbnQ6ICIKLSAgICAgICAgICAgICAgKyAodXRmOExlbmd0aCArICgxTCA8PCAzMikpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHV0ZjhMZW5ndGg7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgZW5jb2RlZExlbmd0aEdlbmVyYWwoQ2hhclNlcXVlbmNlIHNlcXVlbmNlLCBpbnQgc3RhcnQpIHsKLSAgICBpbnQgdXRmMTZMZW5ndGggPSBzZXF1ZW5jZS5sZW5ndGgoKTsKLSAgICBpbnQgdXRmOExlbmd0aCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0OyBpIDwgdXRmMTZMZW5ndGg7IGkrKykgewotICAgICAgY2hhciBjID0gc2VxdWVuY2UuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPCAweDgwMCkgewotICAgICAgICB1dGY4TGVuZ3RoICs9ICgweDdmIC0gYykgPj4+IDMxOyAvLyBicmFuY2ggZnJlZSEKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHV0ZjhMZW5ndGggKz0gMjsKLSAgICAgICAgLy8gamRrNys6IGlmIChDaGFyYWN0ZXIuaXNTdXJyb2dhdGUoYykpIHsKLSAgICAgICAgaWYgKENoYXJhY3Rlci5NSU5fU1VSUk9HQVRFIDw9IGMgJiYgYyA8PSBDaGFyYWN0ZXIuTUFYX1NVUlJPR0FURSkgewotICAgICAgICAgIC8vIENoZWNrIHRoYXQgd2UgaGF2ZSBhIHdlbGwtZm9ybWVkIHN1cnJvZ2F0ZSBwYWlyLgotICAgICAgICAgIGludCBjcCA9IENoYXJhY3Rlci5jb2RlUG9pbnRBdChzZXF1ZW5jZSwgaSk7Ci0gICAgICAgICAgaWYgKGNwIDwgQ2hhcmFjdGVyLk1JTl9TVVBQTEVNRU5UQVJZX0NPREVfUE9JTlQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVucGFpcmVkIHN1cnJvZ2F0ZSBhdCBpbmRleCAiICsgaSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGkrKzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdXRmOExlbmd0aDsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIHtAY29kZSBzZXF1ZW5jZX0gaW50byBVVEYtOCwgaW4ge0Bjb2RlIGJ5dGVCdWZmZXJ9LiBGb3IgYSBzdHJpbmcsIHRoaXMgbWV0aG9kIGlzCi0gICAqIGVxdWl2YWxlbnQgdG8ge0Bjb2RlIGJ1ZmZlci5wdXQoc3RyaW5nLmdldEJ5dGVzKFVURl84KSl9LCBidXQgaXMgbW9yZSBlZmZpY2llbnQgaW4gYm90aCB0aW1lCi0gICAqIGFuZCBzcGFjZS4gQnl0ZXMgYXJlIHdyaXR0ZW4gc3RhcnRpbmcgYXQgdGhlIGN1cnJlbnQgcG9zaXRpb24uIFRoaXMgbWV0aG9kIHJlcXVpcmVzIHBhaXJlZAotICAgKiBzdXJyb2dhdGVzLCBhbmQgdGhlcmVmb3JlIGRvZXMgbm90IHN1cHBvcnQgY2h1bmtpbmcuCi0gICAqCi0gICAqIDxwPlRvIGVuc3VyZSBzdWZmaWNpZW50IHNwYWNlIGluIHRoZSBvdXRwdXQgYnVmZmVyLCBlaXRoZXIgY2FsbCB7QGxpbmsgI2VuY29kZWRMZW5ndGh9IHRvCi0gICAqIGNvbXB1dGUgdGhlIGV4YWN0IGFtb3VudCBuZWVkZWQsIG9yIGxlYXZlIHJvb20gZm9yIHtAY29kZSAzICogc2VxdWVuY2UubGVuZ3RoKCl9LCB3aGljaCBpcyB0aGUKLSAgICogbGFyZ2VzdCBwb3NzaWJsZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBhbnkgaW5wdXQgY2FuIGJlIGVuY29kZWQgdG8uCi0gICAqCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIGlmIHtAY29kZSBzZXF1ZW5jZX0gY29udGFpbnMgaWxsLWZvcm1lZCBVVEYtMTYgKHVucGFpcmVkCi0gICAqICAgICBzdXJyb2dhdGVzKQotICAgKiBAdGhyb3dzIEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uIGlmIHtAY29kZSBzZXF1ZW5jZX0gZW5jb2RlZCBpbiBVVEYtOCBkb2VzIG5vdCBmaXQgaW4KLSAgICogICAgIHtAY29kZSBieXRlQnVmZmVyfSdzIHJlbWFpbmluZyBzcGFjZS4KLSAgICogQHRocm93cyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiBpZiB7QGNvZGUgYnl0ZUJ1ZmZlcn0gaXMgYSByZWFkLW9ubHkgYnVmZmVyLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBlbmNvZGUoQ2hhclNlcXVlbmNlIHNlcXVlbmNlLCBCeXRlQnVmZmVyIGJ5dGVCdWZmZXIpIHsKLSAgICBpZiAoYnl0ZUJ1ZmZlci5pc1JlYWRPbmx5KCkpIHsKLSAgICAgIHRocm93IG5ldyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbigpOwotICAgIH0gZWxzZSBpZiAoYnl0ZUJ1ZmZlci5oYXNBcnJheSgpKSB7Ci0gICAgICB0cnkgewotICAgICAgICBpbnQgZW5jb2RlZCA9IGVuY29kZShzZXF1ZW5jZSwKLSAgICAgICAgICAgICAgICBieXRlQnVmZmVyLmFycmF5KCksCi0gICAgICAgICAgICAgICAgYnl0ZUJ1ZmZlci5hcnJheU9mZnNldCgpICsgYnl0ZUJ1ZmZlci5wb3NpdGlvbigpLAotICAgICAgICAgICAgICAgIGJ5dGVCdWZmZXIucmVtYWluaW5nKCkpOwotICAgICAgICBieXRlQnVmZmVyLnBvc2l0aW9uKGVuY29kZWQgLSBieXRlQnVmZmVyLmFycmF5T2Zmc2V0KCkpOwotICAgICAgfSBjYXRjaCAoQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gYm9lID0gbmV3IEJ1ZmZlck92ZXJmbG93RXhjZXB0aW9uKCk7Ci0gICAgICAgIGJvZS5pbml0Q2F1c2UoZSk7Ci0gICAgICAgIHRocm93IGJvZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZW5jb2RlRGlyZWN0KHNlcXVlbmNlLCBieXRlQnVmZmVyKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGVuY29kZURpcmVjdChDaGFyU2VxdWVuY2Ugc2VxdWVuY2UsIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlcikgewotICAgIGludCB1dGYxNkxlbmd0aCA9IHNlcXVlbmNlLmxlbmd0aCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdXRmMTZMZW5ndGg7IGkrKykgewotICAgICAgZmluYWwgY2hhciBjID0gc2VxdWVuY2UuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPCAweDgwKSB7IC8vIEFTQ0lJCi0gICAgICAgIGJ5dGVCdWZmZXIucHV0KChieXRlKSBjKTsKLSAgICAgIH0gZWxzZSBpZiAoYyA8IDB4ODAwKSB7IC8vIDExIGJpdHMsIHR3byBVVEYtOCBieXRlcwotICAgICAgICBieXRlQnVmZmVyLnB1dCgoYnl0ZSkgKCgweEYgPDwgNikgfCAoYyA+Pj4gNikpKTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5wdXQoKGJ5dGUpICgweDgwIHwgKDB4M0YgJiBjKSkpOwotICAgICAgfSBlbHNlIGlmIChjIDwgQ2hhcmFjdGVyLk1JTl9TVVJST0dBVEUgfHwgQ2hhcmFjdGVyLk1BWF9TVVJST0dBVEUgPCBjKSB7Ci0gICAgICAgIC8vIE1heGltaXVtIHNpbmdsZS1jaGFyIGNvZGUgcG9pbnQgaXMgMHhGRkZGLCAxNiBiaXRzLCB0aHJlZSBVVEYtOCBieXRlcwotICAgICAgICBieXRlQnVmZmVyLnB1dCgoYnl0ZSkgKCgweEYgPDwgNSkgfCAoYyA+Pj4gMTIpKSk7Ci0gICAgICAgIGJ5dGVCdWZmZXIucHV0KChieXRlKSAoMHg4MCB8ICgweDNGICYgKGMgPj4+IDYpKSkpOwotICAgICAgICBieXRlQnVmZmVyLnB1dCgoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGMpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaW5hbCBjaGFyIGxvdzsKLSAgICAgICAgaWYgKGkgKyAxID09IHNlcXVlbmNlLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgfHwgIUNoYXJhY3Rlci5pc1N1cnJvZ2F0ZVBhaXIoYywgKGxvdyA9IHNlcXVlbmNlLmNoYXJBdCgrK2kpKSkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnBhaXJlZCBzdXJyb2dhdGUgYXQgaW5kZXggIiArIChpIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGludCBjb2RlUG9pbnQgPSBDaGFyYWN0ZXIudG9Db2RlUG9pbnQoYywgbG93KTsKLSAgICAgICAgYnl0ZUJ1ZmZlci5wdXQoKGJ5dGUpICgoMHhGIDw8IDQpIHwgKGNvZGVQb2ludCA+Pj4gMTgpKSk7Ci0gICAgICAgIGJ5dGVCdWZmZXIucHV0KChieXRlKSAoMHg4MCB8ICgweDNGICYgKGNvZGVQb2ludCA+Pj4gMTIpKSkpOwotICAgICAgICBieXRlQnVmZmVyLnB1dCgoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIChjb2RlUG9pbnQgPj4+IDYpKSkpOwotICAgICAgICBieXRlQnVmZmVyLnB1dCgoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGNvZGVQb2ludCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBpbnQgZW5jb2RlKENoYXJTZXF1ZW5jZSBzZXF1ZW5jZSwgYnl0ZVtdIGJ5dGVzLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgaW50IHV0ZjE2TGVuZ3RoID0gc2VxdWVuY2UubGVuZ3RoKCk7Ci0gICAgaW50IGogPSBvZmZzZXQ7Ci0gICAgaW50IGkgPSAwOwotICAgIGludCBsaW1pdCA9IG9mZnNldCArIGxlbmd0aDsKLSAgICAvLyBEZXNpZ25lZCB0byB0YWtlIGFkdmFudGFnZSBvZgotICAgIC8vIGh0dHBzOi8vd2lraXMub3JhY2xlLmNvbS9kaXNwbGF5L0hvdFNwb3RJbnRlcm5hbHMvUmFuZ2VDaGVja0VsaW1pbmF0aW9uCi0gICAgZm9yIChjaGFyIGM7IGkgPCB1dGYxNkxlbmd0aCAmJiBpICsgaiA8IGxpbWl0ICYmIChjID0gc2VxdWVuY2UuY2hhckF0KGkpKSA8IDB4ODA7IGkrKykgewotICAgICAgYnl0ZXNbaiArIGldID0gKGJ5dGUpIGM7Ci0gICAgfQotICAgIGlmIChpID09IHV0ZjE2TGVuZ3RoKSB7Ci0gICAgICByZXR1cm4gaiArIHV0ZjE2TGVuZ3RoOwotICAgIH0KLSAgICBqICs9IGk7Ci0gICAgZm9yIChjaGFyIGM7IGkgPCB1dGYxNkxlbmd0aDsgaSsrKSB7Ci0gICAgICBjID0gc2VxdWVuY2UuY2hhckF0KGkpOwotICAgICAgaWYgKGMgPCAweDgwICYmIGogPCBsaW1pdCkgewotICAgICAgICBieXRlc1tqKytdID0gKGJ5dGUpIGM7Ci0gICAgICB9IGVsc2UgaWYgKGMgPCAweDgwMCAmJiBqIDw9IGxpbWl0IC0gMikgeyAvLyAxMSBiaXRzLCB0d28gVVRGLTggYnl0ZXMKLSAgICAgICAgYnl0ZXNbaisrXSA9IChieXRlKSAoKDB4RiA8PCA2KSB8IChjID4+PiA2KSk7Ci0gICAgICAgIGJ5dGVzW2orK10gPSAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGMpKTsKLSAgICAgIH0gZWxzZSBpZiAoKGMgPCBDaGFyYWN0ZXIuTUlOX1NVUlJPR0FURSB8fCBDaGFyYWN0ZXIuTUFYX1NVUlJPR0FURSA8IGMpICYmIGogPD0gbGltaXQgLSAzKSB7Ci0gICAgICAgIC8vIE1heGltdW0gc2luZ2xlLWNoYXIgY29kZSBwb2ludCBpcyAweEZGRkYsIDE2IGJpdHMsIHRocmVlIFVURi04IGJ5dGVzCi0gICAgICAgIGJ5dGVzW2orK10gPSAoYnl0ZSkgKCgweEYgPDwgNSkgfCAoYyA+Pj4gMTIpKTsKLSAgICAgICAgYnl0ZXNbaisrXSA9IChieXRlKSAoMHg4MCB8ICgweDNGICYgKGMgPj4+IDYpKSk7Ci0gICAgICAgIGJ5dGVzW2orK10gPSAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIGMpKTsKLSAgICAgIH0gZWxzZSBpZiAoaiA8PSBsaW1pdCAtIDQpIHsKLSAgICAgICAgLy8gTWluaW11bSBjb2RlIHBvaW50IHJlcHJlc2VudGVkIGJ5IGEgc3Vycm9nYXRlIHBhaXIgaXMgMHgxMDAwMCwgMTcgYml0cywgZm91ciBVVEYtOCBieXRlcwotICAgICAgICBmaW5hbCBjaGFyIGxvdzsKLSAgICAgICAgaWYgKGkgKyAxID09IHNlcXVlbmNlLmxlbmd0aCgpCi0gICAgICAgICAgICAgICAgfHwgIUNoYXJhY3Rlci5pc1N1cnJvZ2F0ZVBhaXIoYywgKGxvdyA9IHNlcXVlbmNlLmNoYXJBdCgrK2kpKSkpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbnBhaXJlZCBzdXJyb2dhdGUgYXQgaW5kZXggIiArIChpIC0gMSkpOwotICAgICAgICB9Ci0gICAgICAgIGludCBjb2RlUG9pbnQgPSBDaGFyYWN0ZXIudG9Db2RlUG9pbnQoYywgbG93KTsKLSAgICAgICAgYnl0ZXNbaisrXSA9IChieXRlKSAoKDB4RiA8PCA0KSB8IChjb2RlUG9pbnQgPj4+IDE4KSk7Ci0gICAgICAgIGJ5dGVzW2orK10gPSAoYnl0ZSkgKDB4ODAgfCAoMHgzRiAmIChjb2RlUG9pbnQgPj4+IDEyKSkpOwotICAgICAgICBieXRlc1tqKytdID0gKGJ5dGUpICgweDgwIHwgKDB4M0YgJiAoY29kZVBvaW50ID4+PiA2KSkpOwotICAgICAgICBieXRlc1tqKytdID0gKGJ5dGUpICgweDgwIHwgKDB4M0YgJiBjb2RlUG9pbnQpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRocm93IG5ldyBBcnJheUluZGV4T3V0T2ZCb3VuZHNFeGNlcHRpb24oIkZhaWxlZCB3cml0aW5nICIgKyBjICsgIiBhdCBpbmRleCAiICsgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBqOwotICB9Ci0KLSAgLy8gRW5kIGd1YXZhIFVURi04IG1ldGhvZHMKLQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBncm91cH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVHcm91cE5vVGFnKGZpbmFsIE1lc3NhZ2VOYW5vIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHZhbHVlLndyaXRlVG8odGhpcyk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VOb1RhZyhmaW5hbCBNZXNzYWdlTmFubyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDMyKHZhbHVlLmdldENhY2hlZFNpemUoKSk7Ci0gICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBieXRlc30gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVCeXRlc05vVGFnKGZpbmFsIGJ5dGVbXSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDMyKHZhbHVlLmxlbmd0aCk7Ci0gICAgd3JpdGVSYXdCeXRlcyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgdWludDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVVJbnQzMk5vVGFnKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDMyKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhbiBlbnVtIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBDYWxsZXIgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIGNvbnZlcnRpbmcgdGhlIGVudW0gdmFsdWUgdG8gaXRzIG51bWVyaWMgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUVudW1Ob1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdWYXJpbnQzMih2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNmaXhlZDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVNGaXhlZDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4ge0Bjb2RlIHNpbnQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTSW50MzJOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdWYXJpbnQzMihlbmNvZGVaaWdaYWczMih2YWx1ZSkpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50NjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlU0ludDY0Tm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDY0KGVuY29kZVppZ1phZzY0KHZhbHVlKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGRvdWJsZX0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRG91YmxlU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGRvdWJsZSB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRG91YmxlU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGbG9hdFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBmbG9hdCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRmxvYXRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgdWludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlVUludDY0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIHtAY29kZSBpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlSW50NjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlSW50NjRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIGludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRml4ZWQzMlNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGJvb2x9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJvb2xTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUJvb2xTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgc3RyaW5nfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTdHJpbmdTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgU3RyaW5nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTdHJpbmdTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUdyb3VwU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZU5hbm8gdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICogMiArIGNvbXB1dGVHcm91cFNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU1lc3NhZ2VTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VOYW5vIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVNZXNzYWdlU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGJ5dGVzfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCeXRlc1NpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJ5dGVbXSB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlQnl0ZXNTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgdWludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVSW50MzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVVSW50MzJTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICogZW51bSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4gIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyB0aGUKLSAgICogZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVFbnVtU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRW51bVNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDMyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTRml4ZWQzMlNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ZpeGVkNjRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIHNpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDMyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIHtAY29kZSBzaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNJbnQ2NFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTSW50NjRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiBNZXNzYWdlU2V0IGV4dGVuc2lvbiB0byB0aGUgc3RyZWFtLiAgRm9yIGhpc3RvcmljYWwgcmVhc29ucywKLSAgICogdGhlIHdpcmUgZm9ybWF0IGRpZmZlcnMgZnJvbSBub3JtYWwgZmllbGRzLgotICAgKi8KLS8vICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCi0vLyAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgTWVzc2FnZU1pY3JvIHZhbHVlKSB7Ci0vLyAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoV2lyZUZvcm1hdE1pY3JvLk1FU1NBR0VfU0VUX0lURU0pICogMiArCi0vLyAgICAgICAgICAgY29tcHV0ZVVJbnQzMlNpemUoV2lyZUZvcm1hdE1pY3JvLk1FU1NBR0VfU0VUX1RZUEVfSUQsIGZpZWxkTnVtYmVyKSArCi0vLyAgICAgICAgICAgY29tcHV0ZU1lc3NhZ2VTaXplKFdpcmVGb3JtYXRNaWNyby5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7Ci0vLyAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIHVucGFyc2VkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBzdHJlYW0uICBGb3IKLSAgICogaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCi0gICAqLwotLy8gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZSgKLS8vICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nTWljcm8gdmFsdWUpIHsKLS8vICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShXaXJlRm9ybWF0TWljcm8uTUVTU0FHRV9TRVRfSVRFTSkgKiAyICsKLS8vICAgICAgICAgICBjb21wdXRlVUludDMyU2l6ZShXaXJlRm9ybWF0TWljcm8uTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpICsKLS8vICAgICAgICAgICBjb21wdXRlQnl0ZXNTaXplKFdpcmVGb3JtYXRNaWNyby5NRVNTQUdFX1NFVF9NRVNTQUdFLCB2YWx1ZSk7Ci0vLyAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZG91YmxlfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVEb3VibGVTaXplTm9UYWcoZmluYWwgZG91YmxlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fNjRfU0laRTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGbG9hdFNpemVOb1RhZyhmaW5hbCBmbG9hdCB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSB1aW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIGludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIGludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgPj0gMCkgewotICAgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kLgotICAgICAgcmV0dXJuIDEwOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzY0X1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBmaXhlZDMyfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBib29sfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCb29sU2l6ZU5vVGFnKGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIHN0cmluZ30gZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgIGZpbmFsIGludCBsZW5ndGggPSBlbmNvZGVkTGVuZ3RoKHZhbHVlKTsKLSAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShsZW5ndGgpICsgbGVuZ3RoOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUdyb3VwU2l6ZU5vVGFnKGZpbmFsIE1lc3NhZ2VOYW5vIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbiBlbWJlZGRlZAotICAgKiBtZXNzYWdlIGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcoZmluYWwgTWVzc2FnZU5hbm8gdmFsdWUpIHsKLSAgICBmaW5hbCBpbnQgc2l6ZSA9IHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoc2l6ZSkgKyBzaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgYnl0ZXN9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKGZpbmFsIGJ5dGVbXSB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKHZhbHVlLmxlbmd0aCkgKyB2YWx1ZS5sZW5ndGg7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSB1aW50MzJ9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbiBlbnVtIGZpZWxkLgotICAgKiBDYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIGNvbnZlcnRpbmcgdGhlIGVudW0gdmFsdWUgdG8gaXRzIG51bWVyaWMgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRW51bVNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkNjR9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gTElUVExFX0VORElBTl82NF9TSVpFOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIHNpbnQzMn0gZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKGVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ludDY0fSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTSW50NjRTaXplTm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50NjRTaXplKGVuY29kZVppZ1phZzY0KHZhbHVlKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBJZiB3cml0aW5nIHRvIGEgZmxhdCBhcnJheSwgcmV0dXJuIHRoZSBzcGFjZSBsZWZ0IGluIHRoZSBhcnJheS4KLSAgICogT3RoZXJ3aXNlLCB0aHJvd3Mge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICovCi0gIHB1YmxpYyBpbnQgc3BhY2VMZWZ0KCkgewotICAgIHJldHVybiBidWZmZXIucmVtYWluaW5nKCk7Ci0gIH0KLQotICAvKioKLSAgICogVmVyaWZpZXMgdGhhdCB7QGxpbmsgI3NwYWNlTGVmdCgpfSByZXR1cm5zIHplcm8uICBJdCdzIGNvbW1vbiB0byBjcmVhdGUKLSAgICogYSBieXRlIGFycmF5IHRoYXQgaXMgZXhhY3RseSBiaWcgZW5vdWdoIHRvIGhvbGQgYSBtZXNzYWdlLCB0aGVuIHdyaXRlIHRvCi0gICAqIGl0IHdpdGggYSB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19LiAgQ2FsbGluZyB7QGNvZGUgY2hlY2tOb1NwYWNlTGVmdCgpfQotICAgKiBhZnRlciB3cml0aW5nIHZlcmlmaWVzIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIGFjdHVhbGx5IGFzIGJpZyBhcyBleHBlY3RlZCwKLSAgICogd2hpY2ggY2FuIGhlbHAgY2F0Y2ggYnVncy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoZWNrTm9TcGFjZUxlZnQoKSB7Ci0gICAgaWYgKHNwYWNlTGVmdCgpICE9IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICJEaWQgbm90IHdyaXRlIGFzIG11Y2ggZGF0YSBhcyBleHBlY3RlZC4iKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0aGUgcG9zaXRpb24gd2l0aGluIHRoZSBpbnRlcm5hbCBidWZmZXIuCi0gICAqLwotICBwdWJsaWMgaW50IHBvc2l0aW9uKCkgewotICAgIHJldHVybiBidWZmZXIucG9zaXRpb24oKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIHBvc2l0aW9uIHdpdGhpbiB0aGUgaW50ZXJuYWwgYnVmZmVyIHRvIHplcm8uCi0gICAqCi0gICAqIEBzZWUgI3Bvc2l0aW9uCi0gICAqIEBzZWUgI3NwYWNlTGVmdAotICAgKi8KLSAgcHVibGljIHZvaWQgcmVzZXQoKSB7Ci0gICAgYnVmZmVyLmNsZWFyKCk7Ci0gIH0KLQotICAvKioKLSAgICogSWYgeW91IGNyZWF0ZSBhIENvZGVkT3V0cHV0U3RyZWFtIGFyb3VuZCBhIHNpbXBsZSBmbGF0IGFycmF5LCB5b3UgbXVzdAotICAgKiBub3QgYXR0ZW1wdCB0byB3cml0ZSBtb3JlIGJ5dGVzIHRoYW4gdGhlIGFycmF5IGhhcyBzcGFjZS4gIE90aGVyd2lzZSwKLSAgICogdGhpcyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE91dE9mU3BhY2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY5NDc0ODY4ODY5OTc4ODk0OTlMOwotCi0gICAgT3V0T2ZTcGFjZUV4Y2VwdGlvbihpbnQgcG9zaXRpb24sIGludCBsaW1pdCkgewotICAgICAgc3VwZXIoIkNvZGVkT3V0cHV0U3RyZWFtIHdhcyB3cml0aW5nIHRvIGEgZmxhdCBieXRlIGFycmF5IGFuZCByYW4gIiArCi0gICAgICAgICAgICAib3V0IG9mIHNwYWNlIChwb3MgIiArIHBvc2l0aW9uICsgIiBsaW1pdCAiICsgbGltaXQgKyAiKS4iKTsKLSAgICB9Ci0gIH0KLQotICAvKiogV3JpdGUgYSBzaW5nbGUgYnl0ZS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlKGZpbmFsIGJ5dGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKCFidWZmZXIuaGFzUmVtYWluaW5nKCkpIHsKLSAgICAgIC8vIFdlJ3JlIHdyaXRpbmcgdG8gYSBzaW5nbGUgYnVmZmVyLgotICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oYnVmZmVyLnBvc2l0aW9uKCksIGJ1ZmZlci5saW1pdCgpKTsKLSAgICB9Ci0KLSAgICBidWZmZXIucHV0KHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHNpbmdsZSBieXRlLCByZXByZXNlbnRlZCBieSBhbiBpbnRlZ2VyIHZhbHVlLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGUoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3Qnl0ZSgoYnl0ZSkgdmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIGFycmF5IG9mIGJ5dGVzLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIGJ5dGVbXSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd0J5dGVzKHZhbHVlLCAwLCB2YWx1ZS5sZW5ndGgpOwotICB9Ci0KLSAgLyoqIFdyaXRlIHBhcnQgb2YgYW4gYXJyYXkgb2YgYnl0ZXMuICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZXMoZmluYWwgYnl0ZVtdIHZhbHVlLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGJ1ZmZlci5yZW1haW5pbmcoKSA+PSBsZW5ndGgpIHsKLSAgICAgIGJ1ZmZlci5wdXQodmFsdWUsIG9mZnNldCwgbGVuZ3RoKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gV2UncmUgd3JpdGluZyB0byBhIHNpbmdsZSBidWZmZXIuCi0gICAgICB0aHJvdyBuZXcgT3V0T2ZTcGFjZUV4Y2VwdGlvbihidWZmZXIucG9zaXRpb24oKSwgYnVmZmVyLmxpbWl0KCkpOwotICAgIH0KLSAgfQotCi0gIC8qKiBFbmNvZGUgYW5kIHdyaXRlIGEgdGFnLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVRhZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB3aXJlVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDMyKFdpcmVGb3JtYXROYW5vLm1ha2VUYWcoZmllbGROdW1iZXIsIHdpcmVUeXBlKSk7Ci0gIH0KLQotICAvKiogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhIHRhZy4gKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVRhZ1NpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoV2lyZUZvcm1hdE5hbm8ubWFrZVRhZyhmaWVsZE51bWJlciwgMCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZSBhbmQgd3JpdGUgYSB2YXJpbnQuICB7QGNvZGUgdmFsdWV9IGlzIHRyZWF0ZWQgYXMKLSAgICogdW5zaWduZWQsIHNvIGl0IHdvbid0IGJlIHNpZ24tZXh0ZW5kZWQgaWYgbmVnYXRpdmUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVJhd1ZhcmludDMyKGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaWYgKCh2YWx1ZSAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICAgIHdyaXRlUmF3Qnl0ZSh2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdyaXRlUmF3Qnl0ZSgodmFsdWUgJiAweDdGKSB8IDB4ODApOwotICAgICAgICB2YWx1ZSA+Pj49IDc7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYSB2YXJpbnQuCi0gICAqIHtAY29kZSB2YWx1ZX0gaXMgdHJlYXRlZCBhcyB1bnNpZ25lZCwgc28gaXQgd29uJ3QgYmUgc2lnbi1leHRlbmRlZCBpZgotICAgKiBuZWdhdGl2ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8ICA3KSkgPT0gMCkgcmV0dXJuIDE7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDE0KSkgPT0gMCkgcmV0dXJuIDI7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDIxKSkgPT0gMCkgcmV0dXJuIDM7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDI4KSkgPT0gMCkgcmV0dXJuIDQ7Ci0gICAgcmV0dXJuIDU7Ci0gIH0KLQotICAvKiogRW5jb2RlIGFuZCB3cml0ZSBhIHZhcmludC4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdWYXJpbnQ2NChsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpZiAoKHZhbHVlICYgfjB4N0ZMKSA9PSAwKSB7Ci0gICAgICAgIHdyaXRlUmF3Qnl0ZSgoaW50KXZhbHVlKTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgd3JpdGVSYXdCeXRlKCgoaW50KXZhbHVlICYgMHg3RikgfCAweDgwKTsKLSAgICAgICAgdmFsdWUgPj4+PSA3OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEgdmFyaW50LiAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlUmF3VmFyaW50NjRTaXplKGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgIDcpKSA9PSAwKSByZXR1cm4gMTsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMTQpKSA9PSAwKSByZXR1cm4gMjsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMjEpKSA9PSAwKSByZXR1cm4gMzsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMjgpKSA9PSAwKSByZXR1cm4gNDsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMzUpKSA9PSAwKSByZXR1cm4gNTsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNDIpKSA9PSAwKSByZXR1cm4gNjsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNDkpKSA9PSAwKSByZXR1cm4gNzsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNTYpKSA9PSAwKSByZXR1cm4gODsKLSAgICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNjMpKSA9PSAwKSByZXR1cm4gOTsKLSAgICByZXR1cm4gMTA7Ci0gIH0KLQotICAvKiogV3JpdGUgYSBsaXR0bGUtZW5kaWFuIDMyLWJpdCBpbnRlZ2VyLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgNCkgewotICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oYnVmZmVyLnBvc2l0aW9uKCksIGJ1ZmZlci5saW1pdCgpKTsKLSAgICB9Ci0gICAgYnVmZmVyLnB1dEludCh2YWx1ZSk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRUTEVfRU5ESUFOXzMyX1NJWkUgPSA0OwotCi0gIC8qKiBXcml0ZSBhIGxpdHRsZS1lbmRpYW4gNjQtYml0IGludGVnZXIuICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoZmluYWwgbG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoYnVmZmVyLnJlbWFpbmluZygpIDwgOCkgewotICAgICAgdGhyb3cgbmV3IE91dE9mU3BhY2VFeGNlcHRpb24oYnVmZmVyLnBvc2l0aW9uKCksIGJ1ZmZlci5saW1pdCgpKTsKLSAgICB9Ci0gICAgYnVmZmVyLnB1dExvbmcodmFsdWUpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgTElUVExFX0VORElBTl82NF9TSVpFID0gODsKLQotICAvKioKLSAgICogRW5jb2RlIGEgWmlnWmFnLWVuY29kZWQgMzItYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCi0gICAqIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLAotICAgKiBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsCi0gICAqIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCi0gICAqCi0gICAqIEBwYXJhbSBuIEEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgotICAgKiBAcmV0dXJuIEFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLCBzdG9yZWQgaW4gYSBzaWduZWQgaW50IGJlY2F1c2UKLSAgICogICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZW5jb2RlWmlnWmFnMzIoZmluYWwgaW50IG4pIHsKLSAgICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYwotICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgYSBaaWdaYWctZW5jb2RlZCA2NC1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKLSAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCi0gICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLSAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLSAgICoKLSAgICogQHBhcmFtIG4gQSBzaWduZWQgNjQtYml0IGludGVnZXIuCi0gICAqIEByZXR1cm4gQW4gdW5zaWduZWQgNjQtYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQotICAgKiAgICAgICAgIEphdmEgaGFzIG5vIGV4cGxpY2l0IHVuc2lnbmVkIHN1cHBvcnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGxvbmcgZW5jb2RlWmlnWmFnNjQoZmluYWwgbG9uZyBuKSB7Ci0gICAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMKLSAgICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiA2Myk7Ci0gIH0KLQotICBzdGF0aWMgaW50IGNvbXB1dGVGaWVsZFNpemUoaW50IG51bWJlciwgaW50IHR5cGUsIE9iamVjdCBvYmplY3QpIHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfQk9PTDoKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVCb29sU2l6ZShudW1iZXIsIChCb29sZWFuKSBvYmplY3QpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9CWVRFUzoKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVCeXRlc1NpemUobnVtYmVyLCAoYnl0ZVtdKSBvYmplY3QpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiBjb21wdXRlU3RyaW5nU2l6ZShudW1iZXIsIChTdHJpbmcpIG9iamVjdCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0ZMT0FUOgotICAgICAgICByZXR1cm4gY29tcHV0ZUZsb2F0U2l6ZShudW1iZXIsIChGbG9hdCkgb2JqZWN0KTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfRE9VQkxFOgotICAgICAgICByZXR1cm4gY29tcHV0ZURvdWJsZVNpemUobnVtYmVyLCAoRG91YmxlKSBvYmplY3QpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9FTlVNOgotICAgICAgICByZXR1cm4gY29tcHV0ZUVudW1TaXplKG51bWJlciwgKEludGVnZXIpIG9iamVjdCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0ZJWEVEMzI6Ci0gICAgICAgIHJldHVybiBjb21wdXRlRml4ZWQzMlNpemUobnVtYmVyLCAoSW50ZWdlcikgb2JqZWN0KTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfSU5UMzI6Ci0gICAgICAgIHJldHVybiBjb21wdXRlSW50MzJTaXplKG51bWJlciwgKEludGVnZXIpIG9iamVjdCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1VJTlQzMjoKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVVSW50MzJTaXplKG51bWJlciwgKEludGVnZXIpIG9iamVjdCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NJTlQzMjoKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVTSW50MzJTaXplKG51bWJlciwgKEludGVnZXIpIG9iamVjdCk7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NGSVhFRDMyOgotICAgICAgICByZXR1cm4gY29tcHV0ZVNGaXhlZDMyU2l6ZShudW1iZXIsIChJbnRlZ2VyKSBvYmplY3QpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9JTlQ2NDoKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVJbnQ2NFNpemUobnVtYmVyLCAoTG9uZykgb2JqZWN0KTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfVUlOVDY0OgotICAgICAgICByZXR1cm4gY29tcHV0ZVVJbnQ2NFNpemUobnVtYmVyLCAoTG9uZykgb2JqZWN0KTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfU0lOVDY0OgotICAgICAgICByZXR1cm4gY29tcHV0ZVNJbnQ2NFNpemUobnVtYmVyLCAoTG9uZykgb2JqZWN0KTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfRklYRUQ2NDoKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVGaXhlZDY0U2l6ZShudW1iZXIsIChMb25nKSBvYmplY3QpOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9TRklYRUQ2NDoKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVTRml4ZWQ2NFNpemUobnVtYmVyLCAoTG9uZykgb2JqZWN0KTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIGNvbXB1dGVNZXNzYWdlU2l6ZShudW1iZXIsIChNZXNzYWdlTmFubykgb2JqZWN0KTsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfR1JPVVA6Ci0gICAgICAgIHJldHVybiBjb21wdXRlR3JvdXBTaXplKG51bWJlciwgKE1lc3NhZ2VOYW5vKSBvYmplY3QpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB0eXBlOiAiICsgdHlwZSk7Ci0gICAgfQotICB9Ci0KLSAgdm9pZCB3cml0ZUZpZWxkKGludCBudW1iZXIsIGludCB0eXBlLCBPYmplY3QgdmFsdWUpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9ET1VCTEU6Ci0gICAgICAgIERvdWJsZSBkb3VibGVWYWx1ZSA9IChEb3VibGUpIHZhbHVlOwotICAgICAgICB3cml0ZURvdWJsZShudW1iZXIsIGRvdWJsZVZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0ZMT0FUOgotICAgICAgICBGbG9hdCBmbG9hdFZhbHVlID0gKEZsb2F0KSB2YWx1ZTsKLSAgICAgICAgd3JpdGVGbG9hdChudW1iZXIsIGZsb2F0VmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfSU5UNjQ6Ci0gICAgICAgIExvbmcgaW50NjRWYWx1ZSA9IChMb25nKSB2YWx1ZTsKLSAgICAgICAgd3JpdGVJbnQ2NChudW1iZXIsIGludDY0VmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfVUlOVDY0OgotICAgICAgICBMb25nIHVpbnQ2NFZhbHVlID0gKExvbmcpIHZhbHVlOwotICAgICAgICB3cml0ZVVJbnQ2NChudW1iZXIsIHVpbnQ2NFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0lOVDMyOgotICAgICAgICBJbnRlZ2VyIGludDMyVmFsdWUgPSAoSW50ZWdlcikgdmFsdWU7Ci0gICAgICAgIHdyaXRlSW50MzIobnVtYmVyLCBpbnQzMlZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0ZJWEVENjQ6Ci0gICAgICAgIExvbmcgZml4ZWQ2NFZhbHVlID0gKExvbmcpIHZhbHVlOwotICAgICAgICB3cml0ZUZpeGVkNjQobnVtYmVyLCBmaXhlZDY0VmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfRklYRUQzMjoKLSAgICAgICAgSW50ZWdlciBmaXhlZDMyVmFsdWUgPSAoSW50ZWdlcikgdmFsdWU7Ci0gICAgICAgIHdyaXRlRml4ZWQzMihudW1iZXIsIGZpeGVkMzJWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9CT09MOgotICAgICAgICBCb29sZWFuIGJvb2xWYWx1ZSA9IChCb29sZWFuKSB2YWx1ZTsKLSAgICAgICAgd3JpdGVCb29sKG51bWJlciwgYm9vbFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NUUklORzoKLSAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgIHdyaXRlU3RyaW5nKG51bWJlciwgc3RyaW5nVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfQllURVM6Ci0gICAgICAgIGJ5dGVbXSBieXRlc1ZhbHVlID0gKGJ5dGVbXSkgdmFsdWU7Ci0gICAgICAgIHdyaXRlQnl0ZXMobnVtYmVyLCBieXRlc1ZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1VJTlQzMjoKLSAgICAgICAgSW50ZWdlciB1aW50MzJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgd3JpdGVVSW50MzIobnVtYmVyLCB1aW50MzJWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9FTlVNOgotICAgICAgICBJbnRlZ2VyIGVudW1WYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgd3JpdGVFbnVtKG51bWJlciwgZW51bVZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NGSVhFRDMyOgotICAgICAgICBJbnRlZ2VyIHNmaXhlZDMyVmFsdWUgPSAoSW50ZWdlcikgdmFsdWU7Ci0gICAgICAgIHdyaXRlU0ZpeGVkMzIobnVtYmVyLCBzZml4ZWQzMlZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NGSVhFRDY0OgotICAgICAgICBMb25nIHNmaXhlZDY0VmFsdWUgPSAoTG9uZykgdmFsdWU7Ci0gICAgICAgIHdyaXRlU0ZpeGVkNjQobnVtYmVyLCBzZml4ZWQ2NFZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX1NJTlQzMjoKLSAgICAgICAgSW50ZWdlciBzaW50MzJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgd3JpdGVTSW50MzIobnVtYmVyLCBzaW50MzJWYWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBJbnRlcm5hbE5hbm8uVFlQRV9TSU5UNjQ6Ci0gICAgICAgIExvbmcgc2ludDY0VmFsdWUgPSAoTG9uZykgdmFsdWU7Ci0gICAgICAgIHdyaXRlU0ludDY0KG51bWJlciwgc2ludDY0VmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgSW50ZXJuYWxOYW5vLlRZUEVfTUVTU0FHRToKLSAgICAgICAgTWVzc2FnZU5hbm8gbWVzc2FnZVZhbHVlID0gKE1lc3NhZ2VOYW5vKSB2YWx1ZTsKLSAgICAgICAgd3JpdGVNZXNzYWdlKG51bWJlciwgbWVzc2FnZVZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEludGVybmFsTmFuby5UWVBFX0dST1VQOgotICAgICAgICBNZXNzYWdlTmFubyBncm91cFZhbHVlID0gKE1lc3NhZ2VOYW5vKSB2YWx1ZTsKLSAgICAgICAgd3JpdGVHcm91cChudW1iZXIsIGdyb3VwVmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHRocm93IG5ldyBJT0V4Y2VwdGlvbigiVW5rbm93biB0eXBlOiAiICsgdHlwZSk7Ci0gICAgfQotICB9Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0V4dGVuZGFibGVNZXNzYWdlTmFuby5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OTczZDcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNjkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBCYXNlIGNsYXNzIG9mIHRob3NlIFByb3RvY29sIEJ1ZmZlciBtZXNzYWdlcyB0aGF0IG5lZWQgdG8gc3RvcmUgdW5rbm93biBmaWVsZHMsCi0gKiBzdWNoIGFzIGV4dGVuc2lvbnMuCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBFeHRlbmRhYmxlTWVzc2FnZU5hbm88TSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlTmFubzxNPj4KLSAgICAgICAgZXh0ZW5kcyBNZXNzYWdlTmFubyB7Ci0gICAgLyoqCi0gICAgICogQSBjb250YWluZXIgZm9yIGZpZWxkcyB1bmtub3duIHRvIHRoZSBtZXNzYWdlLCBpbmNsdWRpbmcgZXh0ZW5zaW9ucy4gRXh0ZW5zaW9uIGZpZWxkcyBjYW4KLSAgICAgKiBjYW4gYmUgYWNjZXNzZWQgdGhyb3VnaCB0aGUge0BsaW5rICNnZXRFeHRlbnNpb259IGFuZCB7QGxpbmsgI3NldEV4dGVuc2lvbn0gbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgRmllbGRBcnJheSB1bmtub3duRmllbGREYXRhOwotCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGludCBjb21wdXRlU2VyaWFsaXplZFNpemUoKSB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgaWYgKHVua25vd25GaWVsZERhdGEgIT0gbnVsbCkgewotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duRmllbGREYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgRmllbGREYXRhIGZpZWxkID0gdW5rbm93bkZpZWxkRGF0YS5kYXRhQXQoaSk7Ci0gICAgICAgICAgICAgICAgc2l6ZSArPSBmaWVsZC5jb21wdXRlU2VyaWFsaXplZFNpemUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAodW5rbm93bkZpZWxkRGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duRmllbGREYXRhLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBGaWVsZERhdGEgZmllbGQgPSB1bmtub3duRmllbGREYXRhLmRhdGFBdChpKTsKLSAgICAgICAgICAgIGZpZWxkLndyaXRlVG8ob3V0cHV0KTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENoZWNrcyBpZiB0aGVyZSBpcyBhIHZhbHVlIHN0b3JlZCBmb3IgdGhlIHNwZWNpZmllZCBleHRlbnNpb24gaW4gdGhpcwotICAgICAqIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHVibGljIGZpbmFsIGJvb2xlYW4gaGFzRXh0ZW5zaW9uKEV4dGVuc2lvbjxNLCA/PiBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKHVua25vd25GaWVsZERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIEZpZWxkRGF0YSBmaWVsZCA9IHVua25vd25GaWVsZERhdGEuZ2V0KFdpcmVGb3JtYXROYW5vLmdldFRhZ0ZpZWxkTnVtYmVyKGV4dGVuc2lvbi50YWcpKTsKLSAgICAgICAgcmV0dXJuIGZpZWxkICE9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0cyB0aGUgdmFsdWUgc3RvcmVkIGluIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIG9mIHRoaXMgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgPFQ+IFQgZ2V0RXh0ZW5zaW9uKEV4dGVuc2lvbjxNLCBUPiBleHRlbnNpb24pIHsKLSAgICAgICAgaWYgKHVua25vd25GaWVsZERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgRmllbGREYXRhIGZpZWxkID0gdW5rbm93bkZpZWxkRGF0YS5nZXQoV2lyZUZvcm1hdE5hbm8uZ2V0VGFnRmllbGROdW1iZXIoZXh0ZW5zaW9uLnRhZykpOwotICAgICAgICByZXR1cm4gZmllbGQgPT0gbnVsbCA/IG51bGwgOiBmaWVsZC5nZXRWYWx1ZShleHRlbnNpb24pOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNldHMgdGhlIHZhbHVlIG9mIHRoZSBzcGVjaWZpZWQgZXh0ZW5zaW9uIG9mIHRoaXMgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgPFQ+IE0gc2V0RXh0ZW5zaW9uKEV4dGVuc2lvbjxNLCBUPiBleHRlbnNpb24sIFQgdmFsdWUpIHsKLSAgICAgICAgaW50IGZpZWxkTnVtYmVyID0gV2lyZUZvcm1hdE5hbm8uZ2V0VGFnRmllbGROdW1iZXIoZXh0ZW5zaW9uLnRhZyk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICBpZiAodW5rbm93bkZpZWxkRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkRGF0YS5yZW1vdmUoZmllbGROdW1iZXIpOwotICAgICAgICAgICAgICAgIGlmICh1bmtub3duRmllbGREYXRhLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgICAgICAgICB1bmtub3duRmllbGREYXRhID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBGaWVsZERhdGEgZmllbGQgPSBudWxsOwotICAgICAgICAgICAgaWYgKHVua25vd25GaWVsZERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHVua25vd25GaWVsZERhdGEgPSBuZXcgRmllbGRBcnJheSgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaWVsZCA9IHVua25vd25GaWVsZERhdGEuZ2V0KGZpZWxkTnVtYmVyKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkRGF0YS5wdXQoZmllbGROdW1iZXIsIG5ldyBGaWVsZERhdGEoZXh0ZW5zaW9uLCB2YWx1ZSkpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBmaWVsZC5zZXRWYWx1ZShleHRlbnNpb24sIHZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAvLyBHZW5lcmF0ZWQgY29kZSBzaG91bGQgZ3VhcmFudGVlIHR5cGUgc2FmZXR5Ci0gICAgICAgIE0gdHlwZWRUaGlzID0gKE0pIHRoaXM7Ci0gICAgICAgIHJldHVybiB0eXBlZFRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU3RvcmVzIHRoZSBiaW5hcnkgZGF0YSBvZiBhbiB1bmtub3duIGZpZWxkLgotICAgICAqCi0gICAgICogPHA+R2VuZXJhdGVkIG1lc3NhZ2VzIHdpbGwgY2FsbCB0aGlzIGZvciB1bmtub3duIGZpZWxkcyBpZiB0aGUgc3RvcmVfdW5rbm93bl9maWVsZHMKLSAgICAgKiBvcHRpb24gaXMgb24uCi0gICAgICoKLSAgICAgKiA8cD5Ob3RlIHRoYXQgdGhlIHRhZyBtaWdodCBiZSBhIGVuZC1ncm91cCB0YWcgKHJhdGhlciB0aGFuIHRoZSBzdGFydCBvZiBhbiB1bmtub3duIGZpZWxkKSBpbgotICAgICAqIHdoaWNoIGNhc2Ugd2UgZG8gbm90IHdhbnQgdG8gYWRkIGFuIHVua25vd24gZmllbGQgZW50cnkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IGJ1ZmZlci4KLSAgICAgKiBAcGFyYW0gdGFnIHRoZSB0YWcgb2YgdGhlIGZpZWxkLgotCi0gICAgICogQHJldHVybiB7QGxpdGVyYWwgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiBzdG9yZVVua25vd25GaWVsZChDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gaW5wdXQsIGludCB0YWcpCi0gICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpbnQgc3RhcnRQb3MgPSBpbnB1dC5nZXRQb3NpdGlvbigpOwotICAgICAgICBpZiAoIWlucHV0LnNraXBGaWVsZCh0YWcpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAvLyBUaGlzIHdhc24ndCBhbiB1bmtub3duIGZpZWxkLCBpdCdzIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICAgIH0KLSAgICAgICAgaW50IGZpZWxkTnVtYmVyID0gV2lyZUZvcm1hdE5hbm8uZ2V0VGFnRmllbGROdW1iZXIodGFnKTsKLSAgICAgICAgaW50IGVuZFBvcyA9IGlucHV0LmdldFBvc2l0aW9uKCk7Ci0gICAgICAgIGJ5dGVbXSBieXRlcyA9IGlucHV0LmdldERhdGEoc3RhcnRQb3MsIGVuZFBvcyAtIHN0YXJ0UG9zKTsKLSAgICAgICAgVW5rbm93bkZpZWxkRGF0YSB1bmtub3duRmllbGQgPSBuZXcgVW5rbm93bkZpZWxkRGF0YSh0YWcsIGJ5dGVzKTsKLQotICAgICAgICBGaWVsZERhdGEgZmllbGQgPSBudWxsOwotICAgICAgICBpZiAodW5rbm93bkZpZWxkRGF0YSA9PSBudWxsKSB7Ci0gICAgICAgICAgICB1bmtub3duRmllbGREYXRhID0gbmV3IEZpZWxkQXJyYXkoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpZWxkID0gdW5rbm93bkZpZWxkRGF0YS5nZXQoZmllbGROdW1iZXIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWVsZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICBmaWVsZCA9IG5ldyBGaWVsZERhdGEoKTsKLSAgICAgICAgICAgIHVua25vd25GaWVsZERhdGEucHV0KGZpZWxkTnVtYmVyLCBmaWVsZCk7Ci0gICAgICAgIH0KLSAgICAgICAgZmllbGQuYWRkVW5rbm93bkZpZWxkKHVua25vd25GaWVsZCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBNIGNsb25lKCkgdGhyb3dzIENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIHsKLSAgICAgICAgTSBjbG9uZWQgPSAoTSkgc3VwZXIuY2xvbmUoKTsKLSAgICAgICAgSW50ZXJuYWxOYW5vLmNsb25lVW5rbm93bkZpZWxkRGF0YSh0aGlzLCBjbG9uZWQpOwotICAgICAgICByZXR1cm4gY2xvbmVkOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0V4dGVuc2lvbi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRXh0ZW5zaW9uLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0NThmOWIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRXh0ZW5zaW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MDYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5BcnJheTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFJlcHJlc2VudHMgYW4gZXh0ZW5zaW9uLgotICoKLSAqIEBhdXRob3IgYmR1ZmZAZ29vZ2xlLmNvbSAoQnJpYW4gRHVmZikKLSAqIEBhdXRob3IgbWF4dHJveUBnb29nbGUuY29tIChNYXggQ2FpKQotICogQHBhcmFtIDxNPiB0aGUgdHlwZSBvZiB0aGUgZXh0ZW5kYWJsZSBtZXNzYWdlIHRoaXMgZXh0ZW5zaW9uIGlzIGZvci4KLSAqIEBwYXJhbSA8VD4gdGhlIEphdmEgdHlwZSBvZiB0aGUgZXh0ZW5zaW9uOyBzZWUge0BsaW5rICNjbGF6en0uCi0gKi8KLXB1YmxpYyBjbGFzcyBFeHRlbnNpb248TSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlTmFubzxNPiwgVD4gewotCi0gICAgLyoKLSAgICAgKiBCZWNhdXNlIHdlIHR5cGljYWxseSBvbmx5IGRlZmluZSBtZXNzYWdlLXR5cGVkIGV4dGVuc2lvbnMsIHRoZSBFeHRlbnNpb24gY2xhc3MgaGllcmFyY2h5IGlzCi0gICAgICogZGVzaWduZWQgYXMgZm9sbG93cywgdG8gYWxsb3cgYSBiaWcgYW1vdW50IG9mIGNvZGUgaW4gdGhpcyBmaWxlIHRvIGJlIHJlbW92ZWQgYnkgUHJvR3VhcmQ6Ci0gICAgICoKLSAgICAgKiAgICAgICAgICAgIEV4dGVuc2lvbiAgICAgICAgICAvLyByZWFkeSB0byB1c2UgZm9yIG1lc3NhZ2UvZ3JvdXAgdHlwZWQgZXh0ZW5zaW9ucwotICAgICAqICAgICAgICAgICAgICAgIM6UCi0gICAgICogICAgICAgICAgICAgICAgfAotICAgICAqICAgICAgIFByaW1pdGl2ZUV4dGVuc2lvbiAgICAgIC8vIGZvciBwcmltaXRpdmUvZW51bSB0eXBlZCBleHRlbnNpb25zCi0gICAgICovCi0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0RPVUJMRSAgID0gSW50ZXJuYWxOYW5vLlRZUEVfRE9VQkxFOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRkxPQVQgICAgPSBJbnRlcm5hbE5hbm8uVFlQRV9GTE9BVDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVDY0ICAgID0gSW50ZXJuYWxOYW5vLlRZUEVfSU5UNjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VSU5UNjQgICA9IEludGVybmFsTmFuby5UWVBFX1VJTlQ2NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVDMyICAgID0gSW50ZXJuYWxOYW5vLlRZUEVfSU5UMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GSVhFRDY0ICA9IEludGVybmFsTmFuby5UWVBFX0ZJWEVENjQ7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GSVhFRDMyICA9IEludGVybmFsTmFuby5UWVBFX0ZJWEVEMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CT09MICAgICA9IEludGVybmFsTmFuby5UWVBFX0JPT0w7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TVFJJTkcgICA9IEludGVybmFsTmFuby5UWVBFX1NUUklORzsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0dST1VQICAgID0gSW50ZXJuYWxOYW5vLlRZUEVfR1JPVVA7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9NRVNTQUdFICA9IEludGVybmFsTmFuby5UWVBFX01FU1NBR0U7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9CWVRFUyAgICA9IEludGVybmFsTmFuby5UWVBFX0JZVEVTOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfVUlOVDMyICAgPSBJbnRlcm5hbE5hbm8uVFlQRV9VSU5UMzI7Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9FTlVNICAgICA9IEludGVybmFsTmFuby5UWVBFX0VOVU07Ci0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRklYRUQzMiA9IEludGVybmFsTmFuby5UWVBFX1NGSVhFRDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0ZJWEVENjQgPSBJbnRlcm5hbE5hbm8uVFlQRV9TRklYRUQ2NDsKLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NJTlQzMiAgID0gSW50ZXJuYWxOYW5vLlRZUEVfU0lOVDMyOwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0lOVDY0ICAgPSBJbnRlcm5hbE5hbm8uVFlQRV9TSU5UNjQ7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGFuIHtAY29kZSBFeHRlbnNpb259IG9mIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUgYW5kIHRhZyBudW1iZXIuCi0gICAgICogU2hvdWxkIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSB7QGxpbmsgI1RZUEVfTUVTU0FHRX0gb3Ige0BsaW5rICNUWVBFX0dST1VQfQotICAgICAqIEBkZXByZWNhdGVkIHVzZSB7QGxpbmsgI2NyZWF0ZU1lc3NhZ2VUeXBlZChpbnQsIENsYXNzLCBsb25nKX0gaW5zdGVhZC4KLSAgICAgKi8KLSAgICBARGVwcmVjYXRlZAotICAgIHB1YmxpYyBzdGF0aWMgPE0gZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZU5hbm88TT4sIFQgZXh0ZW5kcyBNZXNzYWdlTmFubz4KLSAgICAgICAgICAgIEV4dGVuc2lvbjxNLCBUPiBjcmVhdGVNZXNzYWdlVHlwZWQoaW50IHR5cGUsIENsYXNzPFQ+IGNsYXp6LCBpbnQgdGFnKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uPE0sIFQ+KHR5cGUsIGNsYXp6LCB0YWcsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvLyBOb3RlOiB0aGVzZSBjcmVhdGUuLi4oKSBtZXRob2RzIHRha2UgYSBsb25nIGZvciB0aGUgdGFnIHBhcmFtZXRlciwKLSAgICAvLyBiZWNhdXNlIHRhZ3MgYXJlIHJlcHJlc2VudGVkIGFzIHVuc2lnbmVkIGludHMsIGFuZCB0aGVzZSB2YWx1ZXMgZXhpc3QKLSAgICAvLyBpbiBnZW5lcmF0ZWQgY29kZSBhcyBsb25nIHZhbHVlcy4gSG93ZXZlciwgdGhleSBjYW4gZml0IGluIDMyLWJpdHMsIHNvCi0gICAgLy8gaXQncyBzYWZlIHRvIGNhc3QgdGhlbSB0byBpbnQgd2l0aG91dCBsb3NzIG9mIHByZWNpc2lvbi4KLQotICAgIC8qKgotICAgICAqIENyZWF0ZXMgYW4ge0Bjb2RlIEV4dGVuc2lvbn0gb2YgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZSBhbmQgdGFnIG51bWJlci4KLSAgICAgKiBTaG91bGQgYmUgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHtAbGluayAjVFlQRV9NRVNTQUdFfSBvciB7QGxpbmsgI1RZUEVfR1JPVVB9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8TSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlTmFubzxNPiwgVCBleHRlbmRzIE1lc3NhZ2VOYW5vPgotICAgICAgICAgICAgRXh0ZW5zaW9uPE0sIFQ+IGNyZWF0ZU1lc3NhZ2VUeXBlZChpbnQgdHlwZSwgQ2xhc3M8VD4gY2xhenosIGxvbmcgdGFnKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uPE0sIFQ+KHR5cGUsIGNsYXp6LCAoaW50KSB0YWcsIGZhbHNlKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgcmVwZWF0ZWQge0Bjb2RlIEV4dGVuc2lvbn0gb2YgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZSBhbmQgdGFnIG51bWJlci4KLSAgICAgKiBTaG91bGQgYmUgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIHtAbGluayAjVFlQRV9NRVNTQUdFfSBvciB7QGxpbmsgI1RZUEVfR1JPVVB9Ci0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyA8TSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlTmFubzxNPiwgVCBleHRlbmRzIE1lc3NhZ2VOYW5vPgotICAgICAgICAgICAgRXh0ZW5zaW9uPE0sIFRbXT4gY3JlYXRlUmVwZWF0ZWRNZXNzYWdlVHlwZWQoaW50IHR5cGUsIENsYXNzPFRbXT4gY2xhenosIGxvbmcgdGFnKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uPE0sIFRbXT4odHlwZSwgY2xhenosIChpbnQpIHRhZywgdHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhbiB7QGNvZGUgRXh0ZW5zaW9ufSBvZiB0aGUgZ2l2ZW4gcHJpbWl0aXZlIHR5cGUgYW5kIHRhZyBudW1iZXIuCi0gICAgICogU2hvdWxkIGJlIHVzZWQgYnkgdGhlIGdlbmVyYXRlZCBjb2RlIG9ubHkuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gdHlwZSBvbmUgb2Yge0Bjb2RlIFRZUEVfKn0sIGV4Y2VwdCB7QGxpbmsgI1RZUEVfTUVTU0FHRX0gYW5kIHtAbGluayAjVFlQRV9HUk9VUH0KLSAgICAgKiBAcGFyYW0gY2xhenogdGhlIGJveGVkIEphdmEgdHlwZSBvZiB0aGlzIGV4dGVuc2lvbgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgPE0gZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZU5hbm88TT4sIFQ+Ci0gICAgICAgICAgICBFeHRlbnNpb248TSwgVD4gY3JlYXRlUHJpbWl0aXZlVHlwZWQoaW50IHR5cGUsIENsYXNzPFQ+IGNsYXp6LCBsb25nIHRhZykgewotICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUV4dGVuc2lvbjxNLCBUPih0eXBlLCBjbGF6eiwgKGludCkgdGFnLCBmYWxzZSwgMCwgMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHJlcGVhdGVkIHtAY29kZSBFeHRlbnNpb259IG9mIHRoZSBnaXZlbiBwcmltaXRpdmUgdHlwZSBhbmQgdGFnIG51bWJlci4KLSAgICAgKiBTaG91bGQgYmUgdXNlZCBieSB0aGUgZ2VuZXJhdGVkIGNvZGUgb25seS4KLSAgICAgKgotICAgICAqIEBwYXJhbSB0eXBlIG9uZSBvZiB7QGNvZGUgVFlQRV8qfSwgZXhjZXB0IHtAbGluayAjVFlQRV9NRVNTQUdFfSBhbmQge0BsaW5rICNUWVBFX0dST1VQfQotICAgICAqIEBwYXJhbSBjbGF6eiB0aGUgSmF2YSBhcnJheSB0eXBlIG9mIHRoaXMgZXh0ZW5zaW9uLCB3aXRoIGFuIHVuYm94ZWQgY29tcG9uZW50IHR5cGUKLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxNIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vPE0+LCBUPgotICAgICAgICAgICAgRXh0ZW5zaW9uPE0sIFQ+IGNyZWF0ZVJlcGVhdGVkUHJpbWl0aXZlVHlwZWQoCi0gICAgICAgICAgICAgICAgICAgIGludCB0eXBlLCBDbGFzczxUPiBjbGF6eiwgbG9uZyB0YWcsIGxvbmcgbm9uUGFja2VkVGFnLCBsb25nIHBhY2tlZFRhZykgewotICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUV4dGVuc2lvbjxNLCBUPih0eXBlLCBjbGF6eiwgKGludCkgdGFnLCB0cnVlLAotICAgICAgICAgICAgKGludCkgbm9uUGFja2VkVGFnLCAoaW50KSBwYWNrZWRUYWcpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFByb3RvY29sIEJ1ZmZlciB0eXBlIG9mIHRoaXMgZXh0ZW5zaW9uOyBvbmUgb2YgdGhlIHtAY29kZSBUWVBFX30gY29uc3RhbnRzLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBpbnQgdHlwZTsKLQotICAgIC8qKgotICAgICAqIEphdmEgdHlwZSBvZiB0aGlzIGV4dGVuc2lvbi4gRm9yIGEgc2luZ3VsYXIgZXh0ZW5zaW9uLCB0aGlzIGlzIHRoZSBib3hlZCBKYXZhIHR5cGUgZm9yIHRoZQotICAgICAqIFByb3RvY29sIEJ1ZmZlciB7QGxpbmsgI3R5cGV9OyBmb3IgYSByZXBlYXRlZCBleHRlbnNpb24sIHRoaXMgaXMgYW4gYXJyYXkgdHlwZSB3aG9zZQotICAgICAqIGNvbXBvbmVudCB0eXBlIGlzIHRoZSB1bmJveGVkIEphdmEgdHlwZSBmb3Ige0BsaW5rICN0eXBlfS4gRm9yIGV4YW1wbGUsIGZvciBhIHNpbmd1bGFyCi0gICAgICoge0Bjb2RlIGludDMyfS97QGxpbmsgI1RZUEVfSU5UMzJ9IGV4dGVuc2lvbiwgdGhpcyBlcXVhbHMge0Bjb2RlIEludGVnZXIuY2xhc3N9OyBmb3IgYQotICAgICAqIHJlcGVhdGVkIHtAY29kZSBpbnQzMn0gZXh0ZW5zaW9uLCB0aGlzIGVxdWFscyB7QGNvZGUgaW50W10uY2xhc3N9LgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCBDbGFzczxUPiBjbGF6ejsKLQotICAgIC8qKgotICAgICAqIFRhZyBudW1iZXIgb2YgdGhpcyBleHRlbnNpb24uIFRoZSBkYXRhIHNob3VsZCBiZSB2aWV3ZWQgYXMgYW4gdW5zaWduZWQgMzItYml0IHZhbHVlLgotICAgICAqLwotICAgIHB1YmxpYyBmaW5hbCBpbnQgdGFnOwotCi0gICAgLyoqCi0gICAgICogV2hldGhlciB0aGlzIGV4dGVuc2lvbiBpcyByZXBlYXRlZC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgZmluYWwgYm9vbGVhbiByZXBlYXRlZDsKLQotICAgIHByaXZhdGUgRXh0ZW5zaW9uKGludCB0eXBlLCBDbGFzczxUPiBjbGF6eiwgaW50IHRhZywgYm9vbGVhbiByZXBlYXRlZCkgewotICAgICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgICB0aGlzLmNsYXp6ID0gY2xheno7Ci0gICAgICAgIHRoaXMudGFnID0gdGFnOwotICAgICAgICB0aGlzLnJlcGVhdGVkID0gcmVwZWF0ZWQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgb2YgdGhpcyBleHRlbnNpb24gc3RvcmVkIGluIHRoZSBnaXZlbiBsaXN0IG9mIHVua25vd24gZmllbGRzLCBvcgotICAgICAqIHtAY29kZSBudWxsfSBpZiBubyB1bmtub3duIGZpZWxkcyBtYXRjaGVzIHRoaXMgZXh0ZW5zaW9uLgotICAgICAqCi0gICAgICogQHBhcmFtIHVua25vd25GaWVsZHMgYSBsaXN0IG9mIHtAbGluayBVbmtub3duRmllbGREYXRhfS4gQWxsIG9mIHRoZSBlbGVtZW50cyBtdXN0IGhhdmUgYSB0YWcKLSAgICAgKiAgICAgICAgICAgICAgICAgICAgICB0aGF0IG1hdGNoZXMgdGhpcyBFeHRlbnNpb24ncyB0YWcuCi0gICAgICoKLSAgICAgKi8KLSAgICBmaW5hbCBUIGdldFZhbHVlRnJvbShMaXN0PFVua25vd25GaWVsZERhdGE+IHVua25vd25GaWVsZHMpIHsKLSAgICAgICAgaWYgKHVua25vd25GaWVsZHMgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlcGVhdGVkID8gZ2V0UmVwZWF0ZWRWYWx1ZUZyb20odW5rbm93bkZpZWxkcykgOiBnZXRTaW5ndWxhclZhbHVlRnJvbSh1bmtub3duRmllbGRzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgZ2V0UmVwZWF0ZWRWYWx1ZUZyb20oTGlzdDxVbmtub3duRmllbGREYXRhPiB1bmtub3duRmllbGRzKSB7Ci0gICAgICAgIC8vIEZvciByZXBlYXRlZCBleHRlbnNpb25zLCByZWFkIGFsbCBtYXRjaGluZyB1bmtub3duIGZpZWxkcyBpbiB0aGVpciBvcmlnaW5hbCBvcmRlci4KLSAgICAgICAgTGlzdDxPYmplY3Q+IHJlc3VsdExpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duRmllbGRzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBVbmtub3duRmllbGREYXRhIGRhdGEgPSB1bmtub3duRmllbGRzLmdldChpKTsKLSAgICAgICAgICAgIGlmIChkYXRhLmJ5dGVzLmxlbmd0aCAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgcmVhZERhdGFJbnRvKGRhdGEsIHJlc3VsdExpc3QpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaW50IHJlc3VsdFNpemUgPSByZXN1bHRMaXN0LnNpemUoKTsKLSAgICAgICAgaWYgKHJlc3VsdFNpemUgPT0gMCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBUIHJlc3VsdCA9IGNsYXp6LmNhc3QoQXJyYXkubmV3SW5zdGFuY2UoY2xhenouZ2V0Q29tcG9uZW50VHlwZSgpLCByZXN1bHRTaXplKSk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgIEFycmF5LnNldChyZXN1bHQsIGksIHJlc3VsdExpc3QuZ2V0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFQgZ2V0U2luZ3VsYXJWYWx1ZUZyb20oTGlzdDxVbmtub3duRmllbGREYXRhPiB1bmtub3duRmllbGRzKSB7Ci0gICAgICAgIC8vIEZvciBzaW5ndWxhciBleHRlbnNpb25zLCBnZXQgdGhlIGxhc3QgcGllY2Ugb2YgZGF0YSBzdG9yZWQgdW5kZXIgdGhpcyBleHRlbnNpb24uCi0gICAgICAgIGlmICh1bmtub3duRmllbGRzLmlzRW1wdHkoKSkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgVW5rbm93bkZpZWxkRGF0YSBsYXN0RGF0YSA9IHVua25vd25GaWVsZHMuZ2V0KHVua25vd25GaWVsZHMuc2l6ZSgpIC0gMSk7Ci0gICAgICAgIHJldHVybiBjbGF6ei5jYXN0KHJlYWREYXRhKENvZGVkSW5wdXRCeXRlQnVmZmVyTmFuby5uZXdJbnN0YW5jZShsYXN0RGF0YS5ieXRlcykpKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgT2JqZWN0IHJlYWREYXRhKENvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyBpbnB1dCkgewotICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciBtZXNzYWdlL2dyb3VwIGV4dGVuc2lvbnMuCi0gICAgICAgIENsYXNzPD8+IG1lc3NhZ2VUeXBlID0gcmVwZWF0ZWQgPyBjbGF6ei5nZXRDb21wb25lbnRUeXBlKCkgOiBjbGF6ejsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9HUk9VUDoKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZU5hbm8gZ3JvdXAgPSAoTWVzc2FnZU5hbm8pIG1lc3NhZ2VUeXBlLm5ld0luc3RhbmNlKCk7Ci0gICAgICAgICAgICAgICAgICAgIGlucHV0LnJlYWRHcm91cChncm91cCwgV2lyZUZvcm1hdE5hbm8uZ2V0VGFnRmllbGROdW1iZXIodGFnKSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBncm91cDsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZU5hbm8gbWVzc2FnZSA9IChNZXNzYWdlTmFubykgbWVzc2FnZVR5cGUubmV3SW5zdGFuY2UoKTsKLSAgICAgICAgICAgICAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBtZXNzYWdlOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZSAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKEluc3RhbnRpYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNyZWF0aW5nIGluc3RhbmNlIG9mIGNsYXNzICIgKyBtZXNzYWdlVHlwZSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkVycm9yIGNyZWF0aW5nIGluc3RhbmNlIG9mIGNsYXNzICIgKyBtZXNzYWdlVHlwZSwgZSk7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgZXh0ZW5zaW9uIGZpZWxkIiwgZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCByZWFkRGF0YUludG8oVW5rbm93bkZpZWxkRGF0YSBkYXRhLCBMaXN0PE9iamVjdD4gcmVzdWx0TGlzdCkgewotICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciBtZXNzYWdlL2dyb3VwIGV4dGVuc2lvbnMuCi0gICAgICAgIHJlc3VsdExpc3QuYWRkKHJlYWREYXRhKENvZGVkSW5wdXRCeXRlQnVmZmVyTmFuby5uZXdJbnN0YW5jZShkYXRhLmJ5dGVzKSkpOwotICAgIH0KLQotICAgIHZvaWQgd3JpdGVUbyhPYmplY3QgdmFsdWUsIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBpZiAocmVwZWF0ZWQpIHsKLSAgICAgICAgICAgIHdyaXRlUmVwZWF0ZWREYXRhKHZhbHVlLCBvdXRwdXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgd3JpdGVTaW5ndWxhckRhdGEodmFsdWUsIG91dHB1dCk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCB3cml0ZVNpbmd1bGFyRGF0YShPYmplY3QgdmFsdWUsIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8gb3V0KSB7Ci0gICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZm9yIG1lc3NhZ2UvZ3JvdXAgZXh0ZW5zaW9ucy4KLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIG91dC53cml0ZVJhd1ZhcmludDMyKHRhZyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfR1JPVVA6Ci0gICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VOYW5vIGdyb3VwVmFsdWUgPSAoTWVzc2FnZU5hbm8pIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGROdW1iZXIgPSBXaXJlRm9ybWF0TmFuby5nZXRUYWdGaWVsZE51bWJlcih0YWcpOwotICAgICAgICAgICAgICAgICAgICBvdXQud3JpdGVHcm91cE5vVGFnKGdyb3VwVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAvLyBUaGUgZW5kZ3JvdXAgdGFnIG11c3QgYmUgaW5jbHVkZWQgaW4gdGhlIGRhdGEgcGF5bG9hZC4KLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0TmFuby5XSVJFVFlQRV9FTkRfR1JPVVApOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfTUVTU0FHRToKLSAgICAgICAgICAgICAgICAgICAgTWVzc2FnZU5hbm8gbWVzc2FnZVZhbHVlID0gKE1lc3NhZ2VOYW5vKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgb3V0LndyaXRlTWVzc2FnZU5vVGFnKG1lc3NhZ2VWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVua25vd24gdHlwZSAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgd3JpdGVSZXBlYXRlZERhdGEoT2JqZWN0IGFycmF5LCBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG91dHB1dCkgewotICAgICAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIGZvciBub24tcGFja2VkIGV4dGVuc2lvbnMuCi0gICAgICAgIGludCBhcnJheUxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBBcnJheS5nZXQoYXJyYXksIGkpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHdyaXRlU2luZ3VsYXJEYXRhKGVsZW1lbnQsIG91dHB1dCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBpbnQgY29tcHV0ZVNlcmlhbGl6ZWRTaXplKE9iamVjdCB2YWx1ZSkgewotICAgICAgICBpZiAocmVwZWF0ZWQpIHsKLSAgICAgICAgICAgIHJldHVybiBjb21wdXRlUmVwZWF0ZWRTZXJpYWxpemVkU2l6ZSh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gY29tcHV0ZVNpbmd1bGFyU2VyaWFsaXplZFNpemUodmFsdWUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBjb21wdXRlUmVwZWF0ZWRTZXJpYWxpemVkU2l6ZShPYmplY3QgYXJyYXkpIHsKLSAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBmb3Igbm9uLXBhY2tlZCBleHRlbnNpb25zLgotICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgIGludCBhcnJheUxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgT2JqZWN0IGVsZW1lbnQgPSBBcnJheS5nZXQoYXJyYXksIGkpOwotICAgICAgICAgICAgaWYgKGVsZW1lbnQgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHNpemUgKz0gY29tcHV0ZVNpbmd1bGFyU2VyaWFsaXplZFNpemUoQXJyYXkuZ2V0KGFycmF5LCBpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGludCBjb21wdXRlU2luZ3VsYXJTZXJpYWxpemVkU2l6ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpcyBmb3IgbWVzc2FnZS9ncm91cCBleHRlbnNpb25zLgotICAgICAgICBpbnQgZmllbGROdW1iZXIgPSBXaXJlRm9ybWF0TmFuby5nZXRUYWdGaWVsZE51bWJlcih0YWcpOwotICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgVFlQRV9HUk9VUDoKLSAgICAgICAgICAgICAgICBNZXNzYWdlTmFubyBncm91cFZhbHVlID0gKE1lc3NhZ2VOYW5vKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlR3JvdXBTaXplKGZpZWxkTnVtYmVyLCBncm91cFZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgVFlQRV9NRVNTQUdFOgotICAgICAgICAgICAgICAgIE1lc3NhZ2VOYW5vIG1lc3NhZ2VWYWx1ZSA9IChNZXNzYWdlTmFubykgdmFsdWU7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZU1lc3NhZ2VTaXplKGZpZWxkTnVtYmVyLCBtZXNzYWdlVmFsdWUpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHR5cGUgIiArIHR5cGUpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhbiBleHRlbnNpb24gb2YgYSBwcmltaXRpdmUgKGluY2x1ZGluZyBlbnVtKSB0eXBlLiBJZiB0aGVyZSBpcyBubyBwcmltaXRpdmUKLSAgICAgKiBleHRlbnNpb25zLCB0aGlzIHN1YmNsYXNzIHdpbGwgYmUgcmVtb3ZhYmxlIGJ5IFByb0d1YXJkLgotICAgICAqLwotICAgIHByaXZhdGUgc3RhdGljIGNsYXNzIFByaW1pdGl2ZUV4dGVuc2lvbjxNIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vPE0+LCBUPgotICAgICAgICAgICAgZXh0ZW5kcyBFeHRlbnNpb248TSwgVD4gewotCi0gICAgICAgIC8qKgotICAgICAgICAgKiBUYWcgb2YgYSBwaWVjZSBvZiBub24tcGFja2VkIGRhdGEgZnJvbSB0aGUgd2lyZSBjb21wYXRpYmxlIHdpdGggdGhpcyBleHRlbnNpb24uCi0gICAgICAgICAqLwotICAgICAgICBwcml2YXRlIGZpbmFsIGludCBub25QYWNrZWRUYWc7Ci0KLSAgICAgICAgLyoqCi0gICAgICAgICAqIFRhZyBvZiBhIHBpZWNlIG9mIHBhY2tlZCBkYXRhIGZyb20gdGhlIHdpcmUgY29tcGF0aWJsZSB3aXRoIHRoaXMgZXh0ZW5zaW9uLgotICAgICAgICAgKiAwIGlmIHRoZSB0eXBlIG9mIHRoaXMgZXh0ZW5zaW9uIGlzIG5vdCBwYWNrYWJsZS4KLSAgICAgICAgICovCi0gICAgICAgIHByaXZhdGUgZmluYWwgaW50IHBhY2tlZFRhZzsKLQotICAgICAgICBwdWJsaWMgUHJpbWl0aXZlRXh0ZW5zaW9uKGludCB0eXBlLCBDbGFzczxUPiBjbGF6eiwgaW50IHRhZywgYm9vbGVhbiByZXBlYXRlZCwKLSAgICAgICAgICAgICAgICBpbnQgbm9uUGFja2VkVGFnLCBpbnQgcGFja2VkVGFnKSB7Ci0gICAgICAgICAgICBzdXBlcih0eXBlLCBjbGF6eiwgdGFnLCByZXBlYXRlZCk7Ci0gICAgICAgICAgICB0aGlzLm5vblBhY2tlZFRhZyA9IG5vblBhY2tlZFRhZzsKLSAgICAgICAgICAgIHRoaXMucGFja2VkVGFnID0gcGFja2VkVGFnOwotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCBPYmplY3QgcmVhZERhdGEoQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vIGlucHV0KSB7Ci0gICAgICAgICAgICB0cnkgewotICAgICAgICAgICAgICByZXR1cm4gaW5wdXQucmVhZFByaW1pdGl2ZUZpZWxkKHR5cGUpOwotICAgICAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgZXh0ZW5zaW9uIGZpZWxkIiwgZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIHZvaWQgcmVhZERhdGFJbnRvKFVua25vd25GaWVsZERhdGEgZGF0YSwgTGlzdDxPYmplY3Q+IHJlc3VsdExpc3QpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgZm9yIHByaW1pdGl2ZSB0eXBlZCBleHRlbnNpb25zLAotICAgICAgICAgICAgLy8gd2hpY2ggY2FuIHJlYWQgYm90aCBwYWNrZWQgYW5kIG5vbi1wYWNrZWQgZGF0YS4KLSAgICAgICAgICAgIGlmIChkYXRhLnRhZyA9PSBub25QYWNrZWRUYWcpIHsKLSAgICAgICAgICAgICAgICByZXN1bHRMaXN0LmFkZChyZWFkRGF0YShDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8ubmV3SW5zdGFuY2UoZGF0YS5ieXRlcykpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vIGJ1ZmZlciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8ubmV3SW5zdGFuY2UoZGF0YS5ieXRlcyk7Ci0gICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnB1c2hMaW1pdChidWZmZXIucmVhZFJhd1ZhcmludDMyKCkpOyAvLyBsZW5ndGggbGltaXQKLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIkVycm9yIHJlYWRpbmcgZXh0ZW5zaW9uIGZpZWxkIiwgZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHdoaWxlICghYnVmZmVyLmlzQXRFbmQoKSkgewotICAgICAgICAgICAgICAgICAgICByZXN1bHRMaXN0LmFkZChyZWFkRGF0YShidWZmZXIpKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIHZvaWQgd3JpdGVTaW5ndWxhckRhdGEoT2JqZWN0IHZhbHVlLCBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG91dHB1dCkgewotICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICAgICAgRG91YmxlIGRvdWJsZVZhbHVlID0gKERvdWJsZSkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVEb3VibGVOb1RhZyhkb3VibGVWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICAgICAgRmxvYXQgZmxvYXRWYWx1ZSA9IChGbG9hdCkgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVGbG9hdE5vVGFnKGZsb2F0VmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcgaW50NjRWYWx1ZSA9IChMb25nKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZUludDY0Tm9UYWcoaW50NjRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VJTlQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcgdWludDY0VmFsdWUgPSAoTG9uZykgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVVSW50NjROb1RhZyh1aW50NjRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0lOVDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBpbnQzMlZhbHVlID0gKEludGVnZXIpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlSW50MzJOb1RhZyhpbnQzMlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRklYRUQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIExvbmcgZml4ZWQ2NFZhbHVlID0gKExvbmcpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQ2NE5vVGFnKGZpeGVkNjRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0ZJWEVEMzI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGZpeGVkMzJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZUZpeGVkMzJOb1RhZyhmaXhlZDMyVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9CT09MOgotICAgICAgICAgICAgICAgICAgICAgICAgQm9vbGVhbiBib29sVmFsdWUgPSAoQm9vbGVhbikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVCb29sTm9UYWcoYm9vbFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU1RSSU5HOgotICAgICAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVTdHJpbmdOb1RhZyhzdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0JZVEVTOgotICAgICAgICAgICAgICAgICAgICAgICAgYnl0ZVtdIGJ5dGVzVmFsdWUgPSAoYnl0ZVtdKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZUJ5dGVzTm9UYWcoYnl0ZXNWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VJTlQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgdWludDMyVmFsdWUgPSAoSW50ZWdlcikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVVSW50MzJOb1RhZyh1aW50MzJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0VOVU06Ci0gICAgICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGVudW1WYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZUVudW1Ob1RhZyhlbnVtVmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TRklYRUQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIgc2ZpeGVkMzJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVNGaXhlZDMyTm9UYWcoc2ZpeGVkMzJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX1NGSVhFRDY0OgotICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyBzZml4ZWQ2NFZhbHVlID0gKExvbmcpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlU0ZpeGVkNjROb1RhZyhzZml4ZWQ2NFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0lOVDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzaW50MzJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVNJbnQzMk5vVGFnKHNpbnQzMlZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0lOVDY0OgotICAgICAgICAgICAgICAgICAgICAgICAgTG9uZyBzaW50NjRWYWx1ZSA9IChMb25nKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVNJbnQ2NE5vVGFnKHNpbnQ2NFZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5rbm93biB0eXBlICIgKyB0eXBlKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgIHByb3RlY3RlZCB2b2lkIHdyaXRlUmVwZWF0ZWREYXRhKE9iamVjdCBhcnJheSwgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyBvdXRwdXQpIHsKLSAgICAgICAgICAgIGlmICh0YWcgPT0gbm9uUGFja2VkVGFnKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIG5vbi1wYWNrZWQgZGF0YQotICAgICAgICAgICAgICAgIHN1cGVyLndyaXRlUmVwZWF0ZWREYXRhKGFycmF5LCBvdXRwdXQpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gcGFja2VkVGFnKSB7Ci0gICAgICAgICAgICAgICAgLy8gUGFja2VkLiBOb3RlIHRoYXQgdGhlIGFycmF5IGVsZW1lbnQgdHlwZSBpcyBndWFyYW50ZWVkIHRvIGJlIHByaW1pdGl2ZSwgc28gdGhlcmUKLSAgICAgICAgICAgICAgICAvLyB3b24ndCBiZSBhbnkgbnVsbCBlbGVtZW50cywgc28gbm8gbnVsbCBjaGVjayBpbiB0aGlzIGJsb2NrLgotICAgICAgICAgICAgICAgIGludCBhcnJheUxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgICAgICAgICAgaW50IGRhdGFTaXplID0gY29tcHV0ZVBhY2tlZERhdGFTaXplKGFycmF5KTsKLQotICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKHRhZyk7Ci0gICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKGRhdGFTaXplKTsKLSAgICAgICAgICAgICAgICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfQk9PTDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlQm9vbE5vVGFnKEFycmF5LmdldEJvb2xlYW4oYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRklYRUQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQzMk5vVGFnKEFycmF5LmdldEludChhcnJheSwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TRklYRUQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlU0ZpeGVkMzJOb1RhZyhBcnJheS5nZXRJbnQoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZUZsb2F0Tm9UYWcoQXJyYXkuZ2V0RmxvYXQoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRklYRUQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQ2NE5vVGFnKEFycmF5LmdldExvbmcoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0ZJWEVENjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVNGaXhlZDY0Tm9UYWcoQXJyYXkuZ2V0TG9uZyhhcnJheSwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZURvdWJsZU5vVGFnKEFycmF5LmdldERvdWJsZShhcnJheSwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0LndyaXRlSW50MzJOb1RhZyhBcnJheS5nZXRJbnQoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0lOVDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVTSW50MzJOb1RhZyhBcnJheS5nZXRJbnQoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVUlOVDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVVSW50MzJOb1RhZyhBcnJheS5nZXRJbnQoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZUludDY0Tm9UYWcoQXJyYXkuZ2V0TG9uZyhhcnJheSwgaSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TSU5UNjQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZVNJbnQ2NE5vVGFnKEFycmF5LmdldExvbmcoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVUlOVDY0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQud3JpdGVVSW50NjROb1RhZyhBcnJheS5nZXRMb25nKGFycmF5LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBUWVBFX0VOVU06Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dC53cml0ZUVudW1Ob1RhZyhBcnJheS5nZXRJbnQoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlVucGFja2FibGUgdHlwZSAiICsgdHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIC8vIFNob3VsZCBub3QgaGFwcGVuLgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCByZXBlYXRlZCBleHRlbnNpb24gdGFnICIgKyB0YWcKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiwgdW5lcXVhbCB0byBib3RoIG5vbi1wYWNrZWQgdmFyaWFudCAiICsgbm9uUGFja2VkVGFnCi0gICAgICAgICAgICAgICAgICAgICAgICArICIgYW5kIHBhY2tlZCB2YXJpYW50ICIgKyBwYWNrZWRUYWcpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgcHJpdmF0ZSBpbnQgY29tcHV0ZVBhY2tlZERhdGFTaXplKE9iamVjdCBhcnJheSkgewotICAgICAgICAgICAgaW50IGRhdGFTaXplID0gMDsKLSAgICAgICAgICAgIGludCBhcnJheUxlbmd0aCA9IEFycmF5LmdldExlbmd0aChhcnJheSk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfQk9PTDoKLSAgICAgICAgICAgICAgICAgICAgLy8gQm9vbHMgYXJlIHN0b3JlZCBhcyBpbnQzMiBidXQganVzdCBhcyAwIG9yIDEsIHNvIDEgYnl0ZSBlYWNoLgotICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSA9IGFycmF5TGVuZ3RoOwotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRklYRUQzMjoKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0ZJWEVEMzI6Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX0ZMT0FUOgotICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSA9IGFycmF5TGVuZ3RoICogQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5MSVRUTEVfRU5ESUFOXzMyX1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9GSVhFRDY0OgotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TRklYRUQ2NDoKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSA9IGFycmF5TGVuZ3RoICogQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5MSVRUTEVfRU5ESUFOXzY0X1NJWkU7Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9JTlQzMjoKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVJbnQzMlNpemVOb1RhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuZ2V0SW50KGFycmF5LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX1NJTlQzMjoKLSAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcnJheUxlbmd0aDsgaSsrKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBkYXRhU2l6ZSArPSBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVTSW50MzJTaXplTm9UYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmdldEludChhcnJheSwgaSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9VSU5UMzI6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUgKz0gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlVUludDMyU2l6ZU5vVGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5nZXRJbnQoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUgKz0gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlSW50NjRTaXplTm9UYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFycmF5LmdldExvbmcoYXJyYXksIGkpKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfU0lOVDY0OgotICAgICAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFycmF5TGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRhdGFTaXplICs9IENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZVNJbnQ2NFNpemVOb1RhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuZ2V0TG9uZyhhcnJheSwgaSkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9VSU5UNjQ6Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUgKz0gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlVUludDY0U2l6ZU5vVGFnKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcnJheS5nZXRMb25nKGFycmF5LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX0VOVU06Ci0gICAgICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyYXlMZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUgKz0gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlRW51bVNpemVOb1RhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJyYXkuZ2V0SW50KGFycmF5LCBpKSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiVW5leHBlY3RlZCBub24tcGFja2FibGUgdHlwZSAiICsgdHlwZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gZGF0YVNpemU7Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGludCBjb21wdXRlUmVwZWF0ZWRTZXJpYWxpemVkU2l6ZShPYmplY3QgYXJyYXkpIHsKLSAgICAgICAgICAgIGlmICh0YWcgPT0gbm9uUGFja2VkVGFnKSB7Ci0gICAgICAgICAgICAgICAgLy8gVXNlIGJhc2UgaW1wbGVtZW50YXRpb24gZm9yIG5vbi1wYWNrZWQgZGF0YQotICAgICAgICAgICAgICAgIHJldHVybiBzdXBlci5jb21wdXRlUmVwZWF0ZWRTZXJpYWxpemVkU2l6ZShhcnJheSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSBwYWNrZWRUYWcpIHsKLSAgICAgICAgICAgICAgICAvLyBQYWNrZWQuCi0gICAgICAgICAgICAgICAgaW50IGRhdGFTaXplID0gY29tcHV0ZVBhY2tlZERhdGFTaXplKGFycmF5KTsKLSAgICAgICAgICAgICAgICBpbnQgcGF5bG9hZFNpemUgPQotICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVNpemUgKyBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVSYXdWYXJpbnQzMlNpemUoZGF0YVNpemUpOwotICAgICAgICAgICAgICAgIHJldHVybiBwYXlsb2FkU2l6ZSArIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh0YWcpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmV4cGVjdGVkIHJlcGVhdGVkIGV4dGVuc2lvbiB0YWcgIiArIHRhZwotICAgICAgICAgICAgICAgICAgICAgICAgKyAiLCB1bmVxdWFsIHRvIGJvdGggbm9uLXBhY2tlZCB2YXJpYW50ICIgKyBub25QYWNrZWRUYWcKLSAgICAgICAgICAgICAgICAgICAgICAgICsgIiBhbmQgcGFja2VkIHZhcmlhbnQgIiArIHBhY2tlZFRhZyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgcHJvdGVjdGVkIGZpbmFsIGludCBjb21wdXRlU2luZ3VsYXJTZXJpYWxpemVkU2l6ZShPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgICAgIGludCBmaWVsZE51bWJlciA9IFdpcmVGb3JtYXROYW5vLmdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7Ci0gICAgICAgICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRE9VQkxFOgotICAgICAgICAgICAgICAgICAgICBEb3VibGUgZG91YmxlVmFsdWUgPSAoRG91YmxlKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZURvdWJsZVNpemUoZmllbGROdW1iZXIsIGRvdWJsZVZhbHVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfRkxPQVQ6Ci0gICAgICAgICAgICAgICAgICAgIEZsb2F0IGZsb2F0VmFsdWUgPSAoRmxvYXQpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlRmxvYXRTaXplKGZpZWxkTnVtYmVyLCBmbG9hdFZhbHVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgICAgICAgICAgIExvbmcgaW50NjRWYWx1ZSA9IChMb25nKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZUludDY0U2l6ZShmaWVsZE51bWJlciwgaW50NjRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX1VJTlQ2NDoKLSAgICAgICAgICAgICAgICAgICAgTG9uZyB1aW50NjRWYWx1ZSA9IChMb25nKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZVVJbnQ2NFNpemUoZmllbGROdW1iZXIsIHVpbnQ2NFZhbHVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfSU5UMzI6Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgaW50MzJWYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZUludDMyU2l6ZShmaWVsZE51bWJlciwgaW50MzJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX0ZJWEVENjQ6Ci0gICAgICAgICAgICAgICAgICAgIExvbmcgZml4ZWQ2NFZhbHVlID0gKExvbmcpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlRml4ZWQ2NFNpemUoZmllbGROdW1iZXIsIGZpeGVkNjRWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX0ZJWEVEMzI6Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgZml4ZWQzMlZhbHVlID0gKEludGVnZXIpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlRml4ZWQzMlNpemUoZmllbGROdW1iZXIsIGZpeGVkMzJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX0JPT0w6Ci0gICAgICAgICAgICAgICAgICAgIEJvb2xlYW4gYm9vbFZhbHVlID0gKEJvb2xlYW4pIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlQm9vbFNpemUoZmllbGROdW1iZXIsIGJvb2xWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX1NUUklORzoKLSAgICAgICAgICAgICAgICAgICAgU3RyaW5nIHN0cmluZ1ZhbHVlID0gKFN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVTdHJpbmdTaXplKGZpZWxkTnVtYmVyLCBzdHJpbmdWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX0JZVEVTOgotICAgICAgICAgICAgICAgICAgICBieXRlW10gYnl0ZXNWYWx1ZSA9IChieXRlW10pIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlQnl0ZXNTaXplKGZpZWxkTnVtYmVyLCBieXRlc1ZhbHVlKTsKLSAgICAgICAgICAgICAgICBjYXNlIFRZUEVfVUlOVDMyOgotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIHVpbnQzMlZhbHVlID0gKEludGVnZXIpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlVUludDMyU2l6ZShmaWVsZE51bWJlciwgdWludDMyVmFsdWUpOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9FTlVNOgotICAgICAgICAgICAgICAgICAgICBJbnRlZ2VyIGVudW1WYWx1ZSA9IChJbnRlZ2VyKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZUVudW1TaXplKGZpZWxkTnVtYmVyLCBlbnVtVmFsdWUpOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TRklYRUQzMjoKLSAgICAgICAgICAgICAgICAgICAgSW50ZWdlciBzZml4ZWQzMlZhbHVlID0gKEludGVnZXIpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlU0ZpeGVkMzJTaXplKGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmaXhlZDMyVmFsdWUpOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TRklYRUQ2NDoKLSAgICAgICAgICAgICAgICAgICAgTG9uZyBzZml4ZWQ2NFZhbHVlID0gKExvbmcpIHZhbHVlOwotICAgICAgICAgICAgICAgICAgICByZXR1cm4gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlU0ZpeGVkNjRTaXplKGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNmaXhlZDY0VmFsdWUpOwotICAgICAgICAgICAgICAgIGNhc2UgVFlQRV9TSU5UMzI6Ci0gICAgICAgICAgICAgICAgICAgIEludGVnZXIgc2ludDMyVmFsdWUgPSAoSW50ZWdlcikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVTSW50MzJTaXplKGZpZWxkTnVtYmVyLCBzaW50MzJWYWx1ZSk7Ci0gICAgICAgICAgICAgICAgY2FzZSBUWVBFX1NJTlQ2NDoKLSAgICAgICAgICAgICAgICAgICAgTG9uZyBzaW50NjRWYWx1ZSA9IChMb25nKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZVNJbnQ2NFNpemUoZmllbGROdW1iZXIsIHNpbnQ2NFZhbHVlKTsKLSAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJVbmtub3duIHR5cGUgIiArIHR5cGUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRmllbGRBcnJheS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRmllbGRBcnJheS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNDlhOTdmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0ZpZWxkQXJyYXkuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDI5MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm87Ci0KLQotLyoqCi0gKiBBIGN1c3RvbSB2ZXJzaW9uIG9mIHtAY29kZSBhbmRyb2lkLnV0aWwuU3BhcnNlQXJyYXl9IHdpdGggdGhlIG1pbmltYWwgQVBJCi0gKiBmb3Igc3RvcmluZyB7QGxpbmsgRmllbGREYXRhfSBvYmplY3RzLgotICoKLSAqIDxwPlRoaXMgY2xhc3MgaXMgYW4gaW50ZXJuYWwgaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIG5hbm8gYW5kIHNob3VsZCBub3QKLSAqIGJlIGNhbGxlZCBkaXJlY3RseSBieSBjbGllbnRzLgotICoKLSAqIEJhc2VkIG9uIHtAY29kZSBhbmRyb2lkLnN1cHBvcnQudjQudXRpbC5TcGFyZUFycmF5Q29tcGF0fS4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEZpZWxkQXJyYXkgaW1wbGVtZW50cyBDbG9uZWFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkRGF0YSBERUxFVEVEID0gbmV3IEZpZWxkRGF0YSgpOwotICAgIHByaXZhdGUgYm9vbGVhbiBtR2FyYmFnZSA9IGZhbHNlOwotCi0gICAgcHJpdmF0ZSBpbnRbXSBtRmllbGROdW1iZXJzOwotICAgIHByaXZhdGUgRmllbGREYXRhW10gbURhdGE7Ci0gICAgcHJpdmF0ZSBpbnQgbVNpemU7Ci0KLSAgICAvKioKLSAgICAgKiBDcmVhdGVzIGEgbmV3IEZpZWxkQXJyYXkgY29udGFpbmluZyBubyBmaWVsZHMuCi0gICAgICovCi0gICAgRmllbGRBcnJheSgpIHsKLSAgICAgICAgdGhpcygxMCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBGaWVsZEFycmF5IGNvbnRhaW5pbmcgbm8gbWFwcGluZ3MgdGhhdCB3aWxsIG5vdAotICAgICAqIHJlcXVpcmUgYW55IGFkZGl0aW9uYWwgbWVtb3J5IGFsbG9jYXRpb24gdG8gc3RvcmUgdGhlIHNwZWNpZmllZAotICAgICAqIG51bWJlciBvZiBtYXBwaW5ncy4KLSAgICAgKi8KLSAgICBGaWVsZEFycmF5KGludCBpbml0aWFsQ2FwYWNpdHkpIHsKLSAgICAgICAgaW5pdGlhbENhcGFjaXR5ID0gaWRlYWxJbnRBcnJheVNpemUoaW5pdGlhbENhcGFjaXR5KTsKLSAgICAgICAgbUZpZWxkTnVtYmVycyA9IG5ldyBpbnRbaW5pdGlhbENhcGFjaXR5XTsKLSAgICAgICAgbURhdGEgPSBuZXcgRmllbGREYXRhW2luaXRpYWxDYXBhY2l0eV07Ci0gICAgICAgIG1TaXplID0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSBGaWVsZERhdGEgbWFwcGVkIGZyb20gdGhlIHNwZWNpZmllZCBmaWVsZE51bWJlciwgb3IgPGNvZGU+bnVsbDwvY29kZT4KLSAgICAgKiBpZiBubyBzdWNoIG1hcHBpbmcgaGFzIGJlZW4gbWFkZS4KLSAgICAgKi8KLSAgICBGaWVsZERhdGEgZ2V0KGludCBmaWVsZE51bWJlcikgewotICAgICAgICBpbnQgaSA9IGJpbmFyeVNlYXJjaChmaWVsZE51bWJlcik7Ci0KLSAgICAgICAgaWYgKGkgPCAwIHx8IG1EYXRhW2ldID09IERFTEVURUQpIHsKLSAgICAgICAgICAgIHJldHVybiBudWxsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG1EYXRhW2ldOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVtb3ZlcyB0aGUgZGF0YSBmcm9tIHRoZSBzcGVjaWZpZWQgZmllbGROdW1iZXIsIGlmIHRoZXJlIHdhcyBhbnkuCi0gICAgICovCi0gICAgdm9pZCByZW1vdmUoaW50IGZpZWxkTnVtYmVyKSB7Ci0gICAgICAgIGludCBpID0gYmluYXJ5U2VhcmNoKGZpZWxkTnVtYmVyKTsKLQotICAgICAgICBpZiAoaSA+PSAwICYmIG1EYXRhW2ldICE9IERFTEVURUQpIHsKLSAgICAgICAgICAgIG1EYXRhW2ldID0gREVMRVRFRDsKLSAgICAgICAgICAgIG1HYXJiYWdlID0gdHJ1ZTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBnYygpIHsKLSAgICAgICAgaW50IG4gPSBtU2l6ZTsKLSAgICAgICAgaW50IG8gPSAwOwotICAgICAgICBpbnRbXSBrZXlzID0gbUZpZWxkTnVtYmVyczsKLSAgICAgICAgRmllbGREYXRhW10gdmFsdWVzID0gbURhdGE7Ci0KLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICAgICAgICAgIEZpZWxkRGF0YSB2YWwgPSB2YWx1ZXNbaV07Ci0KLSAgICAgICAgICAgIGlmICh2YWwgIT0gREVMRVRFRCkgewotICAgICAgICAgICAgICAgIGlmIChpICE9IG8pIHsKLSAgICAgICAgICAgICAgICAgICAga2V5c1tvXSA9IGtleXNbaV07Ci0gICAgICAgICAgICAgICAgICAgIHZhbHVlc1tvXSA9IHZhbDsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzW2ldID0gbnVsbDsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBvKys7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBtR2FyYmFnZSA9IGZhbHNlOwotICAgICAgICBtU2l6ZSA9IG87Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIG1hcHBpbmcgZnJvbSB0aGUgc3BlY2lmaWVkIGZpZWxkTnVtYmVyIHRvIHRoZSBzcGVjaWZpZWQgZGF0YSwKLSAgICAgKiByZXBsYWNpbmcgdGhlIHByZXZpb3VzIG1hcHBpbmcgaWYgdGhlcmUgd2FzIG9uZS4KLSAgICAgKi8KLSAgICB2b2lkIHB1dChpbnQgZmllbGROdW1iZXIsIEZpZWxkRGF0YSBkYXRhKSB7Ci0gICAgICAgIGludCBpID0gYmluYXJ5U2VhcmNoKGZpZWxkTnVtYmVyKTsKLQotICAgICAgICBpZiAoaSA+PSAwKSB7Ci0gICAgICAgICAgICBtRGF0YVtpXSA9IGRhdGE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpID0gfmk7Ci0KLSAgICAgICAgICAgIGlmIChpIDwgbVNpemUgJiYgbURhdGFbaV0gPT0gREVMRVRFRCkgewotICAgICAgICAgICAgICAgIG1GaWVsZE51bWJlcnNbaV0gPSBmaWVsZE51bWJlcjsKLSAgICAgICAgICAgICAgICBtRGF0YVtpXSA9IGRhdGE7Ci0gICAgICAgICAgICAgICAgcmV0dXJuOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAobUdhcmJhZ2UgJiYgbVNpemUgPj0gbUZpZWxkTnVtYmVycy5sZW5ndGgpIHsKLSAgICAgICAgICAgICAgICBnYygpOwotCi0gICAgICAgICAgICAgICAgLy8gU2VhcmNoIGFnYWluIGJlY2F1c2UgaW5kaWNlcyBtYXkgaGF2ZSBjaGFuZ2VkLgotICAgICAgICAgICAgICAgIGkgPSB+IGJpbmFyeVNlYXJjaChmaWVsZE51bWJlcik7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIGlmIChtU2l6ZSA+PSBtRmllbGROdW1iZXJzLmxlbmd0aCkgewotICAgICAgICAgICAgICAgIGludCBuID0gaWRlYWxJbnRBcnJheVNpemUobVNpemUgKyAxKTsKLQotICAgICAgICAgICAgICAgIGludFtdIG5rZXlzID0gbmV3IGludFtuXTsKLSAgICAgICAgICAgICAgICBGaWVsZERhdGFbXSBudmFsdWVzID0gbmV3IEZpZWxkRGF0YVtuXTsKLQotICAgICAgICAgICAgICAgIFN5c3RlbS5hcnJheWNvcHkobUZpZWxkTnVtYmVycywgMCwgbmtleXMsIDAsIG1GaWVsZE51bWJlcnMubGVuZ3RoKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1EYXRhLCAwLCBudmFsdWVzLCAwLCBtRGF0YS5sZW5ndGgpOwotCi0gICAgICAgICAgICAgICAgbUZpZWxkTnVtYmVycyA9IG5rZXlzOwotICAgICAgICAgICAgICAgIG1EYXRhID0gbnZhbHVlczsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKG1TaXplIC0gaSAhPSAwKSB7Ci0gICAgICAgICAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRmllbGROdW1iZXJzLCBpLCBtRmllbGROdW1iZXJzLCBpICsgMSwgbVNpemUgLSBpKTsKLSAgICAgICAgICAgICAgICBTeXN0ZW0uYXJyYXljb3B5KG1EYXRhLCBpLCBtRGF0YSwgaSArIDEsIG1TaXplIC0gaSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIG1GaWVsZE51bWJlcnNbaV0gPSBmaWVsZE51bWJlcjsKLSAgICAgICAgICAgIG1EYXRhW2ldID0gZGF0YTsKLSAgICAgICAgICAgIG1TaXplKys7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2Yga2V5LXZhbHVlIG1hcHBpbmdzIHRoYXQgdGhpcyBGaWVsZEFycmF5Ci0gICAgICogY3VycmVudGx5IHN0b3Jlcy4KLSAgICAgKi8KLSAgICBpbnQgc2l6ZSgpIHsKLSAgICAgICAgaWYgKG1HYXJiYWdlKSB7Ci0gICAgICAgICAgICBnYygpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmV0dXJuIG1TaXplOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzRW1wdHkoKSB7Ci0gICAgICAgIHJldHVybiBzaXplKCkgPT0gMDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHaXZlbiBhbiBpbmRleCBpbiB0aGUgcmFuZ2UgPGNvZGU+MC4uLnNpemUoKS0xPC9jb2RlPiwgcmV0dXJucwotICAgICAqIHRoZSB2YWx1ZSBmcm9tIHRoZSA8Y29kZT5pbmRleDwvY29kZT50aCBrZXktdmFsdWUgbWFwcGluZyB0aGF0IHRoaXMKLSAgICAgKiBGaWVsZEFycmF5IHN0b3Jlcy4KLSAgICAgKi8KLSAgICBGaWVsZERhdGEgZGF0YUF0KGludCBpbmRleCkgewotICAgICAgICBpZiAobUdhcmJhZ2UpIHsKLSAgICAgICAgICAgIGdjKCk7Ci0gICAgICAgIH0KLQotICAgICAgICByZXR1cm4gbURhdGFbaW5kZXhdOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgICBpZiAobyA9PSB0aGlzKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIShvIGluc3RhbmNlb2YgRmllbGRBcnJheSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICAgIEZpZWxkQXJyYXkgb3RoZXIgPSAoRmllbGRBcnJheSkgbzsKLSAgICAgICAgaWYgKHNpemUoKSAhPSBvdGhlci5zaXplKCkpIHsgIC8vIHNpemUoKSB3aWxsIGNhbGwgZ2MoKSBpZiBuZWNlc3NhcnkuCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGFycmF5RXF1YWxzKG1GaWVsZE51bWJlcnMsIG90aGVyLm1GaWVsZE51bWJlcnMsIG1TaXplKSAmJgotICAgICAgICAgICAgICAgIGFycmF5RXF1YWxzKG1EYXRhLCBvdGhlci5tRGF0YSwgbVNpemUpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICAgIGlmIChtR2FyYmFnZSkgewotICAgICAgICAgICAgZ2MoKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgcmVzdWx0ID0gMTc7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbVNpemU7IGkrKykgewotICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBtRmllbGROdW1iZXJzW2ldOwotICAgICAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBtRGF0YVtpXS5oYXNoQ29kZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBpbnQgaWRlYWxJbnRBcnJheVNpemUoaW50IG5lZWQpIHsKLSAgICAgICAgcmV0dXJuIGlkZWFsQnl0ZUFycmF5U2l6ZShuZWVkICogNCkgLyA0OwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGlkZWFsQnl0ZUFycmF5U2l6ZShpbnQgbmVlZCkgewotICAgICAgICBmb3IgKGludCBpID0gNDsgaSA8IDMyOyBpKyspCi0gICAgICAgICAgICBpZiAobmVlZCA8PSAoMSA8PCBpKSAtIDEyKQotICAgICAgICAgICAgICAgIHJldHVybiAoMSA8PCBpKSAtIDEyOwotCi0gICAgICAgIHJldHVybiBuZWVkOwotICAgIH0KLQotICAgIHByaXZhdGUgaW50IGJpbmFyeVNlYXJjaChpbnQgdmFsdWUpIHsKLSAgICAgICAgaW50IGxvID0gMDsKLSAgICAgICAgaW50IGhpID0gbVNpemUgLSAxOwotCi0gICAgICAgIHdoaWxlIChsbyA8PSBoaSkgewotICAgICAgICAgICAgaW50IG1pZCA9IChsbyArIGhpKSA+Pj4gMTsKLSAgICAgICAgICAgIGludCBtaWRWYWwgPSBtRmllbGROdW1iZXJzW21pZF07Ci0KLSAgICAgICAgICAgIGlmIChtaWRWYWwgPCB2YWx1ZSkgewotICAgICAgICAgICAgICAgIGxvID0gbWlkICsgMTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAobWlkVmFsID4gdmFsdWUpIHsKLSAgICAgICAgICAgICAgICBoaSA9IG1pZCAtIDE7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIHJldHVybiBtaWQ7IC8vIHZhbHVlIGZvdW5kCi0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIH5sbzsgLy8gdmFsdWUgbm90IHByZXNlbnQKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gYXJyYXlFcXVhbHMoaW50W10gYSwgaW50W10gYiwgaW50IHNpemUpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChhW2ldICE9IGJbaV0pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBib29sZWFuIGFycmF5RXF1YWxzKEZpZWxkRGF0YVtdIGEsIEZpZWxkRGF0YVtdIGIsIGludCBzaXplKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoIWFbaV0uZXF1YWxzKGJbaV0pKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBGaWVsZEFycmF5IGNsb25lKCkgewotICAgICAgICAvLyBUcmlnZ2VyIEdDIHNvIHdlIGNvbXBhY3QgYW5kIGRvbid0IGNvcHkgREVMRVRFRCBlbGVtZW50cy4KLSAgICAgICAgaW50IHNpemUgPSBzaXplKCk7Ci0gICAgICAgIEZpZWxkQXJyYXkgY2xvbmUgPSBuZXcgRmllbGRBcnJheShzaXplKTsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShtRmllbGROdW1iZXJzLCAwLCBjbG9uZS5tRmllbGROdW1iZXJzLCAwLCBzaXplKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgICAgIGlmIChtRGF0YVtpXSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgY2xvbmUubURhdGFbaV0gPSBtRGF0YVtpXS5jbG9uZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGNsb25lLm1TaXplID0gc2l6ZTsKLSAgICAgICAgcmV0dXJuIGNsb25lOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0ZpZWxkRGF0YS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRmllbGREYXRhLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGViZWJhYmMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vRmllbGREYXRhLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogU3RvcmVzIHVua25vd24gZmllbGRzLiBUaGVzZSBtaWdodCBiZSBleHRlbnNpb25zIG9yIGZpZWxkcyB0aGF0IHRoZSBnZW5lcmF0ZWQgQVBJIGRvZXNuJ3QKLSAqIGtub3cgYWJvdXQgeWV0LgotICovCi1jbGFzcyBGaWVsZERhdGEgaW1wbGVtZW50cyBDbG9uZWFibGUgewotICAgIHByaXZhdGUgRXh0ZW5zaW9uPD8sID8+IGNhY2hlZEV4dGVuc2lvbjsKLSAgICBwcml2YXRlIE9iamVjdCB2YWx1ZTsKLSAgICAvKiogVGhlIHNlcmlhbGlzZWQgdmFsdWVzIGZvciB0aGlzIG9iamVjdC4gV2lsbCBiZSBjbGVhcmVkIGlmIGdldFZhbHVlIGlzIGNhbGxlZCAqLwotICAgIHByaXZhdGUgTGlzdDxVbmtub3duRmllbGREYXRhPiB1bmtub3duRmllbGREYXRhOwotCi0gICAgPFQ+IEZpZWxkRGF0YShFeHRlbnNpb248PywgVD4gZXh0ZW5zaW9uLCBUIG5ld1ZhbHVlKSB7Ci0gICAgICAgIGNhY2hlZEV4dGVuc2lvbiA9IGV4dGVuc2lvbjsKLSAgICAgICAgdmFsdWUgPSBuZXdWYWx1ZTsKLSAgICB9Ci0KLSAgICBGaWVsZERhdGEoKSB7Ci0gICAgICAgIHVua25vd25GaWVsZERhdGEgPSBuZXcgQXJyYXlMaXN0PFVua25vd25GaWVsZERhdGE+KCk7Ci0gICAgfQotCi0gICAgdm9pZCBhZGRVbmtub3duRmllbGQoVW5rbm93bkZpZWxkRGF0YSB1bmtub3duRmllbGQpIHsKLSAgICAgICAgdW5rbm93bkZpZWxkRGF0YS5hZGQodW5rbm93bkZpZWxkKTsKLSAgICB9Ci0KLSAgICBVbmtub3duRmllbGREYXRhIGdldFVua25vd25GaWVsZChpbnQgaW5kZXgpIHsKLSAgICAgICAgaWYgKHVua25vd25GaWVsZERhdGEgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGluZGV4IDwgdW5rbm93bkZpZWxkRGF0YS5zaXplKCkpIHsKLSAgICAgICAgICAgIHJldHVybiB1bmtub3duRmllbGREYXRhLmdldChpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfQotCi0gICAgaW50IGdldFVua25vd25GaWVsZFNpemUoKSB7Ci0gICAgICAgIGlmICh1bmtub3duRmllbGREYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB1bmtub3duRmllbGREYXRhLnNpemUoKTsKLSAgICB9Ci0KLSAgICA8VD4gVCBnZXRWYWx1ZShFeHRlbnNpb248PywgVD4gZXh0ZW5zaW9uKSB7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKXsKLSAgICAgICAgICAgIGlmIChjYWNoZWRFeHRlbnNpb24gIT0gZXh0ZW5zaW9uKSB7ICAvLyBFeHRlbnNpb24gb2JqZWN0cyBhcmUgc2luZ2xldG9ucy4KLSAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIGdldEV4dGVuc2lvbiB3aXRoIGEgZGlmZmVyZXJudCBFeHRlbnNpb24uIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBjYWNoZWRFeHRlbnNpb24gPSBleHRlbnNpb247Ci0gICAgICAgICAgICB2YWx1ZSA9IGV4dGVuc2lvbi5nZXRWYWx1ZUZyb20odW5rbm93bkZpZWxkRGF0YSk7Ci0gICAgICAgICAgICB1bmtub3duRmllbGREYXRhID0gbnVsbDsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gKFQpIHZhbHVlOwotICAgIH0KLQotICAgIDxUPiB2b2lkIHNldFZhbHVlKEV4dGVuc2lvbjw/LCBUPiBleHRlbnNpb24sIFQgbmV3VmFsdWUpIHsKLSAgICAgICAgY2FjaGVkRXh0ZW5zaW9uID0gZXh0ZW5zaW9uOwotICAgICAgICB2YWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgICB1bmtub3duRmllbGREYXRhID0gbnVsbDsKLSAgICB9Ci0KLSAgICBpbnQgY29tcHV0ZVNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgICAgIGlmICh2YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBzaXplID0gY2FjaGVkRXh0ZW5zaW9uLmNvbXB1dGVTZXJpYWxpemVkU2l6ZSh2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmb3IgKFVua25vd25GaWVsZERhdGEgdW5rbm93bkZpZWxkIDogdW5rbm93bkZpZWxkRGF0YSkgewotICAgICAgICAgICAgICAgIHNpemUgKz0gdW5rbm93bkZpZWxkLmNvbXB1dGVTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzaXplOwotICAgIH0KLQotICAgIHZvaWQgd3JpdGVUbyhDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKHZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgIGNhY2hlZEV4dGVuc2lvbi53cml0ZVRvKHZhbHVlLCBvdXRwdXQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZm9yIChVbmtub3duRmllbGREYXRhIHVua25vd25GaWVsZCA6IHVua25vd25GaWVsZERhdGEpIHsKLSAgICAgICAgICAgICAgICB1bmtub3duRmllbGQud3JpdGVUbyhvdXRwdXQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBGaWVsZERhdGEpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBGaWVsZERhdGEgb3RoZXIgPSAoRmllbGREYXRhKSBvOwotICAgICAgICBpZiAodmFsdWUgIT0gbnVsbCAmJiBvdGhlci52YWx1ZSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiBib3RoIG9iamVjdHMgaGF2ZSBkZXNlcmlhbGl6ZWQgdmFsdWVzLCBjb21wYXJlIHRob3NlLgotICAgICAgICAgICAgLy8gU2luY2UgdW5rbm93biBmaWVsZHMgYXJlIG9ubHkgY29tcGFyZWQgaWYgbWVzc2FnZXMgaGF2ZSBnZW5lcmF0ZWQgZXF1YWxzIG1ldGhvZHMKLSAgICAgICAgICAgIC8vIHdlIGtub3cgdGhpcyB3aWxsIGJlIGEgbWVhbmluZ2Z1bCBjb21wYXJpc29uIChub3QgaWRlbnRpdHkpIGZvciBhbGwgdmFsdWVzLgotICAgICAgICAgICAgaWYgKGNhY2hlZEV4dGVuc2lvbiAhPSBvdGhlci5jYWNoZWRFeHRlbnNpb24pIHsgIC8vIEV4dGVuc2lvbiBvYmplY3RzIGFyZSBzaW5nbGV0b25zLgotICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmICghY2FjaGVkRXh0ZW5zaW9uLmNsYXp6LmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgIC8vIENhbid0IHRlc3QgKCFjYWNoZWRFeHRlbnNpb24ucmVwZWF0ZWQpIGR1ZSB0byAnYnl0ZXMnIC0+ICdieXRlW10nCi0gICAgICAgICAgICAgICAgcmV0dXJuIHZhbHVlLmVxdWFscyhvdGhlci52YWx1ZSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAodmFsdWUgaW5zdGFuY2VvZiBieXRlW10pIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gQXJyYXlzLmVxdWFscygoYnl0ZVtdKSB2YWx1ZSwgKGJ5dGVbXSkgb3RoZXIudmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGludFtdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGludFtdKSB2YWx1ZSwgKGludFtdKSBvdGhlci52YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgbG9uZ1tdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGxvbmdbXSkgdmFsdWUsIChsb25nW10pIG90aGVyLnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBmbG9hdFtdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGZsb2F0W10pIHZhbHVlLCAoZmxvYXRbXSkgb3RoZXIudmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSBpbnN0YW5jZW9mIGRvdWJsZVtdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGRvdWJsZVtdKSB2YWx1ZSwgKGRvdWJsZVtdKSBvdGhlci52YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgYm9vbGVhbltdKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGJvb2xlYW5bXSkgdmFsdWUsIChib29sZWFuW10pIG90aGVyLnZhbHVlKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIEFycmF5cy5kZWVwRXF1YWxzKChPYmplY3RbXSkgdmFsdWUsIChPYmplY3RbXSkgb3RoZXIudmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlmICh1bmtub3duRmllbGREYXRhICE9IG51bGwgJiYgb3RoZXIudW5rbm93bkZpZWxkRGF0YSAhPSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBJZiBib3RoIG9iamVjdHMgaGF2ZSBieXRlIGFycmF5cyBjb21wYXJlIHRob3NlIGRpcmVjdGx5LgotICAgICAgICAgICAgcmV0dXJuIHVua25vd25GaWVsZERhdGEuZXF1YWxzKG90aGVyLnVua25vd25GaWVsZERhdGEpOwotICAgICAgICB9Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBBcyBhIGxhc3QgcmVzb3J0LCBzZXJpYWxpemUgYW5kIGNvbXBhcmUgdGhlIHJlc3VsdGluZyBieXRlIGFycmF5cy4KLSAgICAgICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKHRvQnl0ZUFycmF5KCksIG90aGVyLnRvQnl0ZUFycmF5KCkpOwotICAgICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAvLyBTaG91bGQgbm90IGhhcHBlbi4KLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICBpbnQgcmVzdWx0ID0gMTc7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAvLyBUaGUgb25seSB3YXkgdG8gZ2VuZXJhdGUgYSBjb25zaXN0ZW50IGhhc2ggaXMgdG8gdXNlIHRoZSBzZXJpYWxpemVkIGZvcm0uCi0gICAgICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIEFycmF5cy5oYXNoQ29kZSh0b0J5dGVBcnJheSgpKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgLy8gU2hvdWxkIG5vdCBoYXBwZW4uCi0gICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKGUpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBieXRlW10gdG9CeXRlQXJyYXkoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBieXRlW10gcmVzdWx0ID0gbmV3IGJ5dGVbY29tcHV0ZVNlcmlhbGl6ZWRTaXplKCldOwotICAgICAgICBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG91dHB1dCA9IENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8ubmV3SW5zdGFuY2UocmVzdWx0KTsKLSAgICAgICAgd3JpdGVUbyhvdXRwdXQpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBmaW5hbCBGaWVsZERhdGEgY2xvbmUoKSB7Ci0gICAgICAgIEZpZWxkRGF0YSBjbG9uZSA9IG5ldyBGaWVsZERhdGEoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIGNsb25lLmNhY2hlZEV4dGVuc2lvbiA9IGNhY2hlZEV4dGVuc2lvbjsKLSAgICAgICAgICAgIGlmICh1bmtub3duRmllbGREYXRhID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBjbG9uZS51bmtub3duRmllbGREYXRhID0gbnVsbDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY2xvbmUudW5rbm93bkZpZWxkRGF0YS5hZGRBbGwodW5rbm93bkZpZWxkRGF0YSk7Ci0gICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgIC8vIFdoZXRoZXIgd2UgbmVlZCB0byBkZWVwIGNsb25lIHZhbHVlIGRlcGVuZHMgb24gaXRzIHR5cGUuIFByaW1pdGl2ZSByZWZlcmVuY2UgdHlwZXMKLSAgICAgICAgICAgIC8vIChlLmcuIEludGVnZXIsIExvbmcgZXRjLikgYXJlIG9rLCBzaW5jZSB0aGV5J3JlIGltbXV0YWJsZS4gV2UgbmVlZCB0byBjbG9uZSBhcnJheXMKLSAgICAgICAgICAgIC8vIGFuZCBtZXNzYWdlcy4KLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgLy8gTm8gY2xvbmluZyByZXF1aXJlZC4KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBNZXNzYWdlTmFubykgewotICAgICAgICAgICAgICAgIGNsb25lLnZhbHVlID0gKChNZXNzYWdlTmFubykgdmFsdWUpLmNsb25lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICAgICAgICAgICAgY2xvbmUudmFsdWUgPSAoKGJ5dGVbXSkgdmFsdWUpLmNsb25lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgYnl0ZVtdW10pIHsKLSAgICAgICAgICAgICAgICBieXRlW11bXSB2YWx1ZUFycmF5ID0gKGJ5dGVbXVtdKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBieXRlW11bXSBjbG9uZUFycmF5ID0gbmV3IGJ5dGVbdmFsdWVBcnJheS5sZW5ndGhdW107Ci0gICAgICAgICAgICAgICAgY2xvbmUudmFsdWUgPSBjbG9uZUFycmF5OwotICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVBcnJheS5sZW5ndGg7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBjbG9uZUFycmF5W2ldID0gdmFsdWVBcnJheVtpXS5jbG9uZSgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBib29sZWFuW10pIHsKLSAgICAgICAgICAgICAgICBjbG9uZS52YWx1ZSA9ICgoYm9vbGVhbltdKSB2YWx1ZSkuY2xvbmUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBpbnRbXSkgewotICAgICAgICAgICAgICAgIGNsb25lLnZhbHVlID0gKChpbnRbXSkgdmFsdWUpLmNsb25lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgbG9uZ1tdKSB7Ci0gICAgICAgICAgICAgICAgY2xvbmUudmFsdWUgPSAoKGxvbmdbXSkgdmFsdWUpLmNsb25lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgZmxvYXRbXSkgewotICAgICAgICAgICAgICAgIGNsb25lLnZhbHVlID0gKChmbG9hdFtdKSB2YWx1ZSkuY2xvbmUoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBkb3VibGVbXSkgewotICAgICAgICAgICAgICAgIGNsb25lLnZhbHVlID0gKChkb3VibGVbXSkgdmFsdWUpLmNsb25lKCk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlIGluc3RhbmNlb2YgTWVzc2FnZU5hbm9bXSkgewotICAgICAgICAgICAgICAgIE1lc3NhZ2VOYW5vW10gdmFsdWVBcnJheSA9IChNZXNzYWdlTmFub1tdKSB2YWx1ZTsKLSAgICAgICAgICAgICAgICBNZXNzYWdlTmFub1tdIGNsb25lQXJyYXkgPSBuZXcgTWVzc2FnZU5hbm9bdmFsdWVBcnJheS5sZW5ndGhdOwotICAgICAgICAgICAgICAgIGNsb25lLnZhbHVlID0gY2xvbmVBcnJheTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlQXJyYXkubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgICAgICAgICAgICAgY2xvbmVBcnJheVtpXSA9IHZhbHVlQXJyYXlbaV0uY2xvbmUoKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY2xvbmU7Ci0gICAgICAgIH0gY2F0Y2ggKENsb25lTm90U3VwcG9ydGVkRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBBc3NlcnRpb25FcnJvcihlKTsKLSAgICAgICAgfQotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0ludGVybmFsTmFuby5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vSW50ZXJuYWxOYW5vLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYxMjYzZGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vSW50ZXJuYWxOYW5vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1NDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1hcEZhY3Rvcmllcy5NYXBGYWN0b3J5OwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5jaGFyc2V0LkNoYXJzZXQ7Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXAuRW50cnk7Ci0KLS8qKgotICogVGhlIGNsYXNzZXMgY29udGFpbmVkIHdpdGhpbiBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBQcm90b2NvbCBCdWZmZXIKLSAqIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBtZXNzYWdlIGltcGxlbWVudGF0aW9ucy4gVGhleSBhcmUgcHVibGljIG9ubHkgYmVjYXVzZQotICogdGhvc2UgZ2VuZXJhdGVkIG1lc3NhZ2VzIGRvIG5vdCByZXNpZGUgaW4gdGhlIHtAY29kZSBwcm90b2J1Zn0gcGFja2FnZS4KLSAqIE90aGVycyBzaG91bGQgbm90IHVzZSB0aGlzIGNsYXNzIGRpcmVjdGx5LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIEludGVybmFsTmFubyB7Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9ET1VCTEUgICA9IDE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfRkxPQVQgICAgPSAyOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0lOVDY0ICAgID0gMzsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VSU5UNjQgICA9IDQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfSU5UMzIgICAgPSA1OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0ZJWEVENjQgID0gNjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9GSVhFRDMyICA9IDc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQk9PTCAgICAgPSA4OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NUUklORyAgID0gOTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9HUk9VUCAgICA9IDEwOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX01FU1NBR0UgID0gMTE7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfQllURVMgICAgPSAxMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9VSU5UMzIgICA9IDEzOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX0VOVU0gICAgID0gMTQ7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0ZJWEVEMzIgPSAxNTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9TRklYRUQ2NCA9IDE2OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBUWVBFX1NJTlQzMiAgID0gMTc7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFRZUEVfU0lOVDY0ICAgPSAxODsKLQotICBwcm90ZWN0ZWQgc3RhdGljIGZpbmFsIENoYXJzZXQgVVRGXzggPSBDaGFyc2V0LmZvck5hbWUoIlVURi04Iik7Ci0gIHByb3RlY3RlZCBzdGF0aWMgZmluYWwgQ2hhcnNldCBJU09fODg1OV8xID0gQ2hhcnNldC5mb3JOYW1lKCJJU08tODg1OS0xIik7Ci0KLSAgcHJpdmF0ZSBJbnRlcm5hbE5hbm8oKSB7fQotCi0gIC8qKgotICAgKiBBbiBvYmplY3QgdG8gcHJvdmlkZSBzeW5jaHJvbml6YXRpb24gd2hlbiBsYXppbHkgaW5pdGlhbGl6aW5nIHN0YXRpYyBmaWVsZHMKLSAgICogb2Yge0BsaW5rIE1lc3NhZ2VOYW5vfSBzdWJjbGFzc2VzLgotICAgKiA8cD4KLSAgICogVG8gZW5hYmxlIGVhcmxpZXIgdmVyc2lvbnMgb2YgUHJvR3VhcmQgdG8gaW5saW5lIHNob3J0IG1ldGhvZHMgZnJvbSBhCi0gICAqIGdlbmVyYXRlZCBNZXNzYWdlTmFubyBzdWJjbGFzcyB0byB0aGUgY2FsbCBzaXRlcywgdGhhdCBjbGFzcyBtdXN0IG5vdCBoYXZlCi0gICAqIGEgY2xhc3MgaW5pdGlhbGl6ZXIsIHdoaWNoIHdpbGwgYmUgY3JlYXRlZCBpZiB0aGVyZSBpcyBhbnkgc3RhdGljIHZhcmlhYmxlCi0gICAqIGluaXRpYWxpemVycy4gVG8gbGF6aWx5IGluaXRpYWxpemUgdGhlIHN0YXRpYyB2YXJpYWJsZXMgaW4gYSB0aHJlYWQtc2FmZQotICAgKiBtYW5uZXIsIHRoZSBpbml0aWFsaXphdGlvbiBjb2RlIHdpbGwgc3luY2hyb25pemUgb24gdGhpcyBvYmplY3QuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIE9iamVjdCBMQVpZX0lOSVRfTE9DSyA9IG5ldyBPYmplY3QoKTsKLQotICAvKioKLSAgICogSGVscGVyIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSB0byBjb25zdHJ1Y3QgZGVmYXVsdCB2YWx1ZXMgZm9yIHN0cmluZwotICAgKiBmaWVsZHMuCi0gICAqIDxwPgotICAgKiBUaGUgcHJvdG9jb2wgY29tcGlsZXIgZG9lcyBub3QgYWN0dWFsbHkgY29udGFpbiBhIFVURi04IGRlY29kZXIgLS0gaXQKLSAgICoganVzdCBwdXNoZXMgVVRGLTgtZW5jb2RlZCB0ZXh0IGFyb3VuZCB3aXRob3V0IHRvdWNoaW5nIGl0LiAgVGhlIG9uZSBwbGFjZQotICAgKiB3aGVyZSB0aGlzIHByZXNlbnRzIGEgcHJvYmxlbSBpcyB3aGVuIGdlbmVyYXRpbmcgSmF2YSBzdHJpbmcgbGl0ZXJhbHMuCi0gICAqIFVuaWNvZGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGxpdGVyYWwgd291bGQgbm9ybWFsbHkgbmVlZCB0byBiZSBlbmNvZGVkCi0gICAqIHVzaW5nIGEgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UsIHdoaWNoIHdvdWxkIHJlcXVpcmUgZGVjb2RpbmcgdGhlbS4KLSAgICogVG8gZ2V0IGFyb3VuZCB0aGlzLCBwcm90b2MgaW5zdGVhZCBlbWJlZHMgdGhlIFVURi04IGJ5dGVzIGludG8gdGhlCi0gICAqIGdlbmVyYXRlZCBjb2RlIGFuZCBsZWF2ZXMgaXQgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSB0byBkZWNvZGUgdGhlbS4KLSAgICogPHA+Ci0gICAqIEl0IGdldHMgd29yc2UsIHRob3VnaC4gIElmIHByb3RvYyBqdXN0IGdlbmVyYXRlZCBhIGJ5dGUgYXJyYXksIGxpa2U6Ci0gICAqICAgbmV3IGJ5dGVbXSB7MHgxMiwgMHgzNCwgMHg1NiwgMHg3OH0KLSAgICogSmF2YSBhY3R1YWxseSBnZW5lcmF0ZXMgKmNvZGUqIHdoaWNoIGFsbG9jYXRlcyBhbiBhcnJheSBhbmQgdGhlbiBmaWxscwotICAgKiBpbiBlYWNoIHZhbHVlLiAgVGhpcyBpcyBtdWNoIGxlc3MgZWZmaWNpZW50IHRoYW4ganVzdCBlbWJlZGRpbmcgdGhlIGJ5dGVzCi0gICAqIGRpcmVjdGx5IGludG8gdGhlIGJ5dGVjb2RlLiAgVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBuZWVkIGFub3RoZXIKLSAgICogd29yay1hcm91bmQuICBTdHJpbmcgbGl0ZXJhbHMgYXJlIGVtYmVkZGVkIGRpcmVjdGx5LCBzbyBwcm90b2MgYWN0dWFsbHkKLSAgICogZ2VuZXJhdGVzIGEgc3RyaW5nIGxpdGVyYWwgY29ycmVzcG9uZGluZyB0byB0aGUgYnl0ZXMuICBUaGUgZWFzaWVzdCB3YXkKLSAgICogdG8gZG8gdGhpcyBpcyB0byB1c2UgdGhlIElTTy04ODU5LTEgY2hhcmFjdGVyIHNldCwgd2hpY2ggY29ycmVzcG9uZHMgdG8KLSAgICogdGhlIGZpcnN0IDI1NiBjaGFyYWN0ZXJzIG9mIHRoZSBVbmljb2RlIHJhbmdlLiAgUHJvdG9jIGNhbiB0aGVuIHVzZQotICAgKiBnb29kIG9sZCBDRXNjYXBlIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmcuCi0gICAqIDxwPgotICAgKiBTbyB3ZSBoYXZlIGEgc3RyaW5nIGxpdGVyYWwgd2hpY2ggcmVwcmVzZW50cyBhIHNldCBvZiBieXRlcyB3aGljaAotICAgKiByZXByZXNlbnRzIGFub3RoZXIgc3RyaW5nLiAgVGhpcyBmdW5jdGlvbiAtLSBzdHJpbmdEZWZhdWx0VmFsdWUgLS0KLSAgICogY29udmVydHMgZnJvbSB0aGUgZ2VuZXJhdGVkIHN0cmluZyB0byB0aGUgc3RyaW5nIHdlIGFjdHVhbGx5IHdhbnQuICBUaGUKLSAgICogZ2VuZXJhdGVkIGNvZGUgY2FsbHMgdGhpcyBhdXRvbWF0aWNhbGx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRGVmYXVsdFZhbHVlKFN0cmluZyBieXRlcykgewotICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLmdldEJ5dGVzKElTT184ODU5XzEpLCBJbnRlcm5hbE5hbm8uVVRGXzgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gY29uc3RydWN0IGRlZmF1bHQgdmFsdWVzIGZvciBieXRlcwotICAgKiBmaWVsZHMuCi0gICAqIDxwPgotICAgKiBUaGlzIGlzIGEgbG90IGxpa2Uge0BsaW5rICNzdHJpbmdEZWZhdWx0VmFsdWV9LCBidXQgZm9yIGJ5dGVzIGZpZWxkcy4KLSAgICogSW4gdGhpcyBjYXNlIHdlIG9ubHkgbmVlZCB0aGUgc2Vjb25kIG9mIHRoZSB0d28gaGFja3MgLS0gYWxsb3dpbmcgdXMgdG8KLSAgICogZW1iZWQgcmF3IGJ5dGVzIGFzIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCBJU08tODg1OS0xIGVuY29kaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBieXRlW10gYnl0ZXNEZWZhdWx0VmFsdWUoU3RyaW5nIGJ5dGVzKSB7Ci0gICAgcmV0dXJuIGJ5dGVzLmdldEJ5dGVzKElTT184ODU5XzEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBmdW5jdGlvbiB0byBjb252ZXJ0IGEgc3RyaW5nIGludG8gVVRGLTggd2hpbGUgdHVybmluZyB0aGUKLSAgICogVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB0byBhIFJ1bnRpbWVFeGNlcHRpb24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJ5dGVbXSBjb3B5RnJvbVV0ZjgoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICByZXR1cm4gdGV4dC5nZXRCeXRlcyhJbnRlcm5hbE5hbm8uVVRGXzgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyByZXBlYXRlZCBpbnQgZmllbGQgZXF1YWxpdHk7IG51bGwtdmFsdWUgYW5kIDAtbGVuZ3RoIGZpZWxkcyBhcmUKLSAgICogY29uc2lkZXJlZCBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoaW50W10gZmllbGQxLCBpbnRbXSBmaWVsZDIpIHsKLSAgICBpZiAoZmllbGQxID09IG51bGwgfHwgZmllbGQxLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmllbGQyID09IG51bGwgfHwgZmllbGQyLmxlbmd0aCA9PSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhmaWVsZDEsIGZpZWxkMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyByZXBlYXRlZCBsb25nIGZpZWxkIGVxdWFsaXR5OyBudWxsLXZhbHVlIGFuZCAwLWxlbmd0aCBmaWVsZHMgYXJlCi0gICAqIGNvbnNpZGVyZWQgZXF1YWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGxvbmdbXSBmaWVsZDEsIGxvbmdbXSBmaWVsZDIpIHsKLSAgICBpZiAoZmllbGQxID09IG51bGwgfHwgZmllbGQxLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmllbGQyID09IG51bGwgfHwgZmllbGQyLmxlbmd0aCA9PSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhmaWVsZDEsIGZpZWxkMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyByZXBlYXRlZCBmbG9hdCBmaWVsZCBlcXVhbGl0eTsgbnVsbC12YWx1ZSBhbmQgMC1sZW5ndGggZmllbGRzIGFyZQotICAgKiBjb25zaWRlcmVkIGVxdWFsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhmbG9hdFtdIGZpZWxkMSwgZmxvYXRbXSBmaWVsZDIpIHsKLSAgICBpZiAoZmllbGQxID09IG51bGwgfHwgZmllbGQxLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmllbGQyID09IG51bGwgfHwgZmllbGQyLmxlbmd0aCA9PSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhmaWVsZDEsIGZpZWxkMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyByZXBlYXRlZCBkb3VibGUgZmllbGQgZXF1YWxpdHk7IG51bGwtdmFsdWUgYW5kIDAtbGVuZ3RoIGZpZWxkcyBhcmUKLSAgICogY29uc2lkZXJlZCBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoZG91YmxlW10gZmllbGQxLCBkb3VibGVbXSBmaWVsZDIpIHsKLSAgICBpZiAoZmllbGQxID09IG51bGwgfHwgZmllbGQxLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmllbGQyID09IG51bGwgfHwgZmllbGQyLmxlbmd0aCA9PSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhmaWVsZDEsIGZpZWxkMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyByZXBlYXRlZCBib29sZWFuIGZpZWxkIGVxdWFsaXR5OyBudWxsLXZhbHVlIGFuZCAwLWxlbmd0aCBmaWVsZHMgYXJlCi0gICAqIGNvbnNpZGVyZWQgZXF1YWwuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGJvb2xlYW4gZXF1YWxzKGJvb2xlYW5bXSBmaWVsZDEsIGJvb2xlYW5bXSBmaWVsZDIpIHsKLSAgICBpZiAoZmllbGQxID09IG51bGwgfHwgZmllbGQxLmxlbmd0aCA9PSAwKSB7Ci0gICAgICByZXR1cm4gZmllbGQyID09IG51bGwgfHwgZmllbGQyLmxlbmd0aCA9PSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmVxdWFscyhmaWVsZDEsIGZpZWxkMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENoZWNrcyByZXBlYXRlZCBieXRlcyBmaWVsZCBlcXVhbGl0eS4gT25seSBub24tbnVsbCBlbGVtZW50cyBhcmUgdGVzdGVkLgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIHR3byBmaWVsZHMgaGF2ZSB0aGUgc2FtZSBzZXF1ZW5jZSBvZiBub24tbnVsbAotICAgKiBlbGVtZW50cy4gTnVsbC12YWx1ZSBmaWVsZHMgYW5kIGZpZWxkcyBvZiBhbnkgbGVuZ3RoIHdpdGggb25seSBudWxsCi0gICAqIGVsZW1lbnRzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGVxdWFscyhieXRlW11bXSBmaWVsZDEsIGJ5dGVbXVtdIGZpZWxkMikgewotICAgIGludCBpbmRleDEgPSAwOwotICAgIGludCBsZW5ndGgxID0gZmllbGQxID09IG51bGwgPyAwIDogZmllbGQxLmxlbmd0aDsKLSAgICBpbnQgaW5kZXgyID0gMDsKLSAgICBpbnQgbGVuZ3RoMiA9IGZpZWxkMiA9PSBudWxsID8gMCA6IGZpZWxkMi5sZW5ndGg7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIHdoaWxlIChpbmRleDEgPCBsZW5ndGgxICYmIGZpZWxkMVtpbmRleDFdID09IG51bGwpIHsKLSAgICAgICAgaW5kZXgxKys7Ci0gICAgICB9Ci0gICAgICB3aGlsZSAoaW5kZXgyIDwgbGVuZ3RoMiAmJiBmaWVsZDJbaW5kZXgyXSA9PSBudWxsKSB7Ci0gICAgICAgIGluZGV4MisrOwotICAgICAgfQotICAgICAgYm9vbGVhbiBhdEVuZE9mMSA9IGluZGV4MSA+PSBsZW5ndGgxOwotICAgICAgYm9vbGVhbiBhdEVuZE9mMiA9IGluZGV4MiA+PSBsZW5ndGgyOwotICAgICAgaWYgKGF0RW5kT2YxICYmIGF0RW5kT2YyKSB7Ci0gICAgICAgIC8vIG5vIG1vcmUgbm9uLW51bGwgZWxlbWVudHMgdG8gdGVzdCBpbiBib3RoIGFycmF5cwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0gZWxzZSBpZiAoYXRFbmRPZjEgIT0gYXRFbmRPZjIpIHsKLSAgICAgICAgLy8gb25lIG9mIHRoZSBhcnJheXMgaGF2ZSBleHRyYSBub24tbnVsbCBlbGVtZW50cwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKCFBcnJheXMuZXF1YWxzKGZpZWxkMVtpbmRleDFdLCBmaWVsZDJbaW5kZXgyXSkpIHsKLSAgICAgICAgLy8gZWxlbWVudCBtaXNtYXRjaAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpbmRleDErKzsKLSAgICAgIGluZGV4MisrOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3MgcmVwZWF0ZWQgc3RyaW5nL21lc3NhZ2UgZmllbGQgZXF1YWxpdHkuIE9ubHkgbm9uLW51bGwgZWxlbWVudHMgYXJlCi0gICAqIHRlc3RlZC4gUmV0dXJucyB0cnVlIGlmIHRoZSB0d28gZmllbGRzIGhhdmUgdGhlIHNhbWUgc2VxdWVuY2Ugb2Ygbm9uLW51bGwKLSAgICogZWxlbWVudHMuIE51bGwtdmFsdWUgZmllbGRzIGFuZCBmaWVsZHMgb2YgYW55IGxlbmd0aCB3aXRoIG9ubHkgbnVsbAotICAgKiBlbGVtZW50cyBhcmUgY29uc2lkZXJlZCBlcXVhbC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0W10gZmllbGQxLCBPYmplY3RbXSBmaWVsZDIpIHsKLSAgICBpbnQgaW5kZXgxID0gMDsKLSAgICBpbnQgbGVuZ3RoMSA9IGZpZWxkMSA9PSBudWxsID8gMCA6IGZpZWxkMS5sZW5ndGg7Ci0gICAgaW50IGluZGV4MiA9IDA7Ci0gICAgaW50IGxlbmd0aDIgPSBmaWVsZDIgPT0gbnVsbCA/IDAgOiBmaWVsZDIubGVuZ3RoOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICB3aGlsZSAoaW5kZXgxIDwgbGVuZ3RoMSAmJiBmaWVsZDFbaW5kZXgxXSA9PSBudWxsKSB7Ci0gICAgICAgIGluZGV4MSsrOwotICAgICAgfQotICAgICAgd2hpbGUgKGluZGV4MiA8IGxlbmd0aDIgJiYgZmllbGQyW2luZGV4Ml0gPT0gbnVsbCkgewotICAgICAgICBpbmRleDIrKzsKLSAgICAgIH0KLSAgICAgIGJvb2xlYW4gYXRFbmRPZjEgPSBpbmRleDEgPj0gbGVuZ3RoMTsKLSAgICAgIGJvb2xlYW4gYXRFbmRPZjIgPSBpbmRleDIgPj0gbGVuZ3RoMjsKLSAgICAgIGlmIChhdEVuZE9mMSAmJiBhdEVuZE9mMikgewotICAgICAgICAvLyBubyBtb3JlIG5vbi1udWxsIGVsZW1lbnRzIHRvIHRlc3QgaW4gYm90aCBhcnJheXMKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKGF0RW5kT2YxICE9IGF0RW5kT2YyKSB7Ci0gICAgICAgIC8vIG9uZSBvZiB0aGUgYXJyYXlzIGhhdmUgZXh0cmEgbm9uLW51bGwgZWxlbWVudHMKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIGlmICghZmllbGQxW2luZGV4MV0uZXF1YWxzKGZpZWxkMltpbmRleDJdKSkgewotICAgICAgICAvLyBlbGVtZW50IG1pc21hdGNoCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGluZGV4MSsrOwotICAgICAgaW5kZXgyKys7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGVzIHRoZSBoYXNoIGNvZGUgb2YgYSByZXBlYXRlZCBpbnQgZmllbGQuIE51bGwtdmFsdWUgYW5kIDAtbGVuZ3RoCi0gICAqIGZpZWxkcyBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGludFtdIGZpZWxkKSB7Ci0gICAgcmV0dXJuIGZpZWxkID09IG51bGwgfHwgZmllbGQubGVuZ3RoID09IDAgPyAwIDogQXJyYXlzLmhhc2hDb2RlKGZpZWxkKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIG9mIGEgcmVwZWF0ZWQgbG9uZyBmaWVsZC4gTnVsbC12YWx1ZSBhbmQgMC1sZW5ndGgKLSAgICogZmllbGRzIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUobG9uZ1tdIGZpZWxkKSB7Ci0gICAgcmV0dXJuIGZpZWxkID09IG51bGwgfHwgZmllbGQubGVuZ3RoID09IDAgPyAwIDogQXJyYXlzLmhhc2hDb2RlKGZpZWxkKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIG9mIGEgcmVwZWF0ZWQgZmxvYXQgZmllbGQuIE51bGwtdmFsdWUgYW5kIDAtbGVuZ3RoCi0gICAqIGZpZWxkcyBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGZsb2F0W10gZmllbGQpIHsKLSAgICByZXR1cm4gZmllbGQgPT0gbnVsbCB8fCBmaWVsZC5sZW5ndGggPT0gMCA/IDAgOiBBcnJheXMuaGFzaENvZGUoZmllbGQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGVzIHRoZSBoYXNoIGNvZGUgb2YgYSByZXBlYXRlZCBkb3VibGUgZmllbGQuIE51bGwtdmFsdWUgYW5kIDAtbGVuZ3RoCi0gICAqIGZpZWxkcyBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGRvdWJsZVtdIGZpZWxkKSB7Ci0gICAgcmV0dXJuIGZpZWxkID09IG51bGwgfHwgZmllbGQubGVuZ3RoID09IDAgPyAwIDogQXJyYXlzLmhhc2hDb2RlKGZpZWxkKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIG9mIGEgcmVwZWF0ZWQgYm9vbGVhbiBmaWVsZC4gTnVsbC12YWx1ZSBhbmQgMC1sZW5ndGgKLSAgICogZmllbGRzIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgaGFzaENvZGUoYm9vbGVhbltdIGZpZWxkKSB7Ci0gICAgcmV0dXJuIGZpZWxkID09IG51bGwgfHwgZmllbGQubGVuZ3RoID09IDAgPyAwIDogQXJyYXlzLmhhc2hDb2RlKGZpZWxkKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlcyB0aGUgaGFzaCBjb2RlIG9mIGEgcmVwZWF0ZWQgYnl0ZXMgZmllbGQuIE9ubHkgdGhlIHNlcXVlbmNlIG9mIGFsbAotICAgKiBub24tbnVsbCBlbGVtZW50cyBhcmUgdXNlZCBpbiB0aGUgY29tcHV0YXRpb24uIE51bGwtdmFsdWUgZmllbGRzIGFuZCBmaWVsZHMKLSAgICogb2YgYW55IGxlbmd0aCB3aXRoIG9ubHkgbnVsbCBlbGVtZW50cyBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGhhc2hDb2RlKGJ5dGVbXVtdIGZpZWxkKSB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDAsIHNpemUgPSBmaWVsZCA9PSBudWxsID8gMCA6IGZpZWxkLmxlbmd0aDsgaSA8IHNpemU7IGkrKykgewotICAgICAgYnl0ZVtdIGVsZW1lbnQgPSBmaWVsZFtpXTsKLSAgICAgIGlmIChlbGVtZW50ICE9IG51bGwpIHsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBBcnJheXMuaGFzaENvZGUoZWxlbWVudCk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZXMgdGhlIGhhc2ggY29kZSBvZiBhIHJlcGVhdGVkIHN0cmluZy9tZXNzYWdlIGZpZWxkLiBPbmx5IHRoZQotICAgKiBzZXF1ZW5jZSBvZiBhbGwgbm9uLW51bGwgZWxlbWVudHMgYXJlIHVzZWQgaW4gdGhlIGNvbXB1dGF0aW9uLiBOdWxsLXZhbHVlCi0gICAqIGZpZWxkcyBhbmQgZmllbGRzIG9mIGFueSBsZW5ndGggd2l0aCBvbmx5IG51bGwgZWxlbWVudHMgaGF2ZSB0aGUgc2FtZSBoYXNoCi0gICAqIGNvZGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBoYXNoQ29kZShPYmplY3RbXSBmaWVsZCkgewotICAgIGludCByZXN1bHQgPSAwOwotICAgIGZvciAoaW50IGkgPSAwLCBzaXplID0gZmllbGQgPT0gbnVsbCA/IDAgOiBmaWVsZC5sZW5ndGg7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgIE9iamVjdCBlbGVtZW50ID0gZmllbGRbaV07Ci0gICAgICBpZiAoZWxlbWVudCAhPSBudWxsKSB7Ci0gICAgICAgIHJlc3VsdCA9IDMxICogcmVzdWx0ICsgZWxlbWVudC5oYXNoQ29kZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0gIHByaXZhdGUgc3RhdGljIE9iamVjdCBwcmltaXRpdmVEZWZhdWx0VmFsdWUoaW50IHR5cGUpIHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgIGNhc2UgVFlQRV9CT09MOgotICAgICAgICByZXR1cm4gQm9vbGVhbi5GQUxTRTsKLSAgICAgIGNhc2UgVFlQRV9CWVRFUzoKLSAgICAgICAgcmV0dXJuIFdpcmVGb3JtYXROYW5vLkVNUFRZX0JZVEVTOwotICAgICAgY2FzZSBUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuICIiOwotICAgICAgY2FzZSBUWVBFX0ZMT0FUOgotICAgICAgICByZXR1cm4gRmxvYXQudmFsdWVPZigwKTsKLSAgICAgIGNhc2UgVFlQRV9ET1VCTEU6Ci0gICAgICAgIHJldHVybiBEb3VibGUudmFsdWVPZigwKTsKLSAgICAgIGNhc2UgVFlQRV9FTlVNOgotICAgICAgY2FzZSBUWVBFX0ZJWEVEMzI6Ci0gICAgICBjYXNlIFRZUEVfSU5UMzI6Ci0gICAgICBjYXNlIFRZUEVfVUlOVDMyOgotICAgICAgY2FzZSBUWVBFX1NJTlQzMjoKLSAgICAgIGNhc2UgVFlQRV9TRklYRUQzMjoKLSAgICAgICAgcmV0dXJuIEludGVnZXIudmFsdWVPZigwKTsKLSAgICAgIGNhc2UgVFlQRV9JTlQ2NDoKLSAgICAgIGNhc2UgVFlQRV9VSU5UNjQ6Ci0gICAgICBjYXNlIFRZUEVfU0lOVDY0OgotICAgICAgY2FzZSBUWVBFX0ZJWEVENjQ6Ci0gICAgICBjYXNlIFRZUEVfU0ZJWEVENjQ6Ci0gICAgICAgIHJldHVybiBMb25nLnZhbHVlT2YoMEwpOwotICAgICAgY2FzZSBUWVBFX01FU1NBR0U6Ci0gICAgICBjYXNlIFRZUEVfR1JPVVA6Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIlR5cGU6ICIgKyB0eXBlICsgIiBpcyBub3QgYSBwcmltaXRpdmUgdHlwZS4iKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTWVyZ2VzIHRoZSBtYXAgZW50cnkgaW50byB0aGUgbWFwIGZpZWxkLiBOb3RlIHRoaXMgaXMgb25seSBzdXBwb3NlZCB0bwotICAgKiBiZSBjYWxsZWQgYnkgZ2VuZXJhdGVkIG1lc3NhZ2VzLgotICAgKgotICAgKiBAcGFyYW0gbWFwIHRoZSBtYXAgZmllbGQ7IG1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlIGEgbWFwIHdpbGwgYmUKLSAgICogICAgICAgIGluc3RhbnRpYXRlZCB1c2luZyB0aGUge0BsaW5rIE1hcEZhY3Rvcmllcy5NYXBGYWN0b3J5fQotICAgKiBAcGFyYW0gaW5wdXQgdGhlIGlucHV0IGJ5dGUgYnVmZmVyCi0gICAqIEBwYXJhbSBrZXlUeXBlIGtleSB0eXBlLCBhcyBkZWZpbmVkIGluIEludGVybmFsTmFuby5UWVBFXyoKLSAgICogQHBhcmFtIHZhbHVlVHlwZSB2YWx1ZSB0eXBlLCBhcyBkZWZpbmVkIGluIEludGVybmFsTmFuby5UWVBFXyoKLSAgICogQHBhcmFtIHZhbHVlIGFuIG5ldyBpbnN0YW5jZSBvZiB0aGUgdmFsdWUsIGlmIHRoZSB2YWx1ZSBpcyBhIFRZUEVfTUVTU0FHRTsKLSAgICogICAgICAgIG90aGVyd2lzZSB0aGlzIHBhcmFtZXRlciBjYW4gYmUgbnVsbCBhbmQgd2lsbCBiZSBpZ25vcmVkLgotICAgKiBAcGFyYW0ga2V5VGFnIHdpcmUgdGFnIGZvciB0aGUga2V5Ci0gICAqIEBwYXJhbSB2YWx1ZVRhZyB3aXJlIHRhZyBmb3IgdGhlIHZhbHVlCi0gICAqIEByZXR1cm4gdGhlIG1hcCBmaWVsZAotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIHN0YXRpYyBmaW5hbCA8SywgVj4gTWFwPEssIFY+IG1lcmdlTWFwRW50cnkoCi0gICAgICBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gaW5wdXQsCi0gICAgICBNYXA8SywgVj4gbWFwLAotICAgICAgTWFwRmFjdG9yeSBtYXBGYWN0b3J5LAotICAgICAgaW50IGtleVR5cGUsCi0gICAgICBpbnQgdmFsdWVUeXBlLAotICAgICAgViB2YWx1ZSwKLSAgICAgIGludCBrZXlUYWcsCi0gICAgICBpbnQgdmFsdWVUYWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgbWFwID0gbWFwRmFjdG9yeS5mb3JNYXAobWFwKTsKLSAgICBmaW5hbCBpbnQgbGVuZ3RoID0gaW5wdXQucmVhZFJhd1ZhcmludDMyKCk7Ci0gICAgZmluYWwgaW50IG9sZExpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7Ci0gICAgSyBrZXkgPSBudWxsOwotICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICBpbnQgdGFnID0gaW5wdXQucmVhZFRhZygpOwotICAgICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgaWYgKHRhZyA9PSBrZXlUYWcpIHsKLSAgICAgICAga2V5ID0gKEspIGlucHV0LnJlYWRQcmltaXRpdmVGaWVsZChrZXlUeXBlKTsKLSAgICAgIH0gZWxzZSBpZiAodGFnID09IHZhbHVlVGFnKSB7Ci0gICAgICAgIGlmICh2YWx1ZVR5cGUgPT0gVFlQRV9NRVNTQUdFKSB7Ci0gICAgICAgICAgaW5wdXQucmVhZE1lc3NhZ2UoKE1lc3NhZ2VOYW5vKSB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdmFsdWUgPSAoVikgaW5wdXQucmVhZFByaW1pdGl2ZUZpZWxkKHZhbHVlVHlwZSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmICghaW5wdXQuc2tpcEZpZWxkKHRhZykpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7Ci0gICAgaW5wdXQucG9wTGltaXQob2xkTGltaXQpOwotCi0gICAgaWYgKGtleSA9PSBudWxsKSB7Ci0gICAgICAvLyBrZXkgY2FuIG9ubHkgYmUgcHJpbWl0aXZlIHR5cGVzLgotICAgICAga2V5ID0gKEspIHByaW1pdGl2ZURlZmF1bHRWYWx1ZShrZXlUeXBlKTsKLSAgICB9Ci0KLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgLy8gbWVzc2FnZSB0eXBlIHZhbHVlIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYnkgY29kZS1nZW4uCi0gICAgICB2YWx1ZSA9IChWKSBwcmltaXRpdmVEZWZhdWx0VmFsdWUodmFsdWVUeXBlKTsKLSAgICB9Ci0KLSAgICBtYXAucHV0KGtleSwgdmFsdWUpOwotICAgIHJldHVybiBtYXA7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIDxLLCBWPiB2b2lkIHNlcmlhbGl6ZU1hcEZpZWxkKAotICAgICAgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyBvdXRwdXQsCi0gICAgICBNYXA8SywgVj4gbWFwLCBpbnQgbnVtYmVyLCBpbnQga2V5VHlwZSwgaW50IHZhbHVlVHlwZSkKLSAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZvciAoRW50cnk8SywgVj4gZW50cnk6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICBLIGtleSA9IGVudHJ5LmdldEtleSgpOwotICAgICAgViB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICBpZiAoa2V5ID09IG51bGwgfHwgdmFsdWUgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgImtleXMgYW5kIHZhbHVlcyBpbiBtYXBzIGNhbm5vdCBiZSBudWxsIik7Ci0gICAgICB9Ci0gICAgICBpbnQgZW50cnlTaXplID0KLSAgICAgICAgICBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVGaWVsZFNpemUoMSwga2V5VHlwZSwga2V5KSArCi0gICAgICAgICAgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlRmllbGRTaXplKDIsIHZhbHVlVHlwZSwgdmFsdWUpOwotICAgICAgb3V0cHV0LndyaXRlVGFnKG51bWJlciwgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMihlbnRyeVNpemUpOwotICAgICAgb3V0cHV0LndyaXRlRmllbGQoMSwga2V5VHlwZSwga2V5KTsKLSAgICAgIG91dHB1dC53cml0ZUZpZWxkKDIsIHZhbHVlVHlwZSwgdmFsdWUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgPEssIFY+IGludCBjb21wdXRlTWFwRmllbGRTaXplKAotICAgICAgTWFwPEssIFY+IG1hcCwgaW50IG51bWJlciwgaW50IGtleVR5cGUsIGludCB2YWx1ZVR5cGUpIHsKLSAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgaW50IHRhZ1NpemUgPSBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVUYWdTaXplKG51bWJlcik7Ci0gICAgZm9yIChFbnRyeTxLLCBWPiBlbnRyeTogbWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgIEsga2V5ID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBWIHZhbHVlID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgIGlmIChrZXkgPT0gbnVsbCB8fCB2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAia2V5cyBhbmQgdmFsdWVzIGluIG1hcHMgY2Fubm90IGJlIG51bGwiKTsKLSAgICAgIH0KLSAgICAgIGludCBlbnRyeVNpemUgPQotICAgICAgICAgIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZUZpZWxkU2l6ZSgxLCBrZXlUeXBlLCBrZXkpICsKLSAgICAgICAgICBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVGaWVsZFNpemUoMiwgdmFsdWVUeXBlLCB2YWx1ZSk7Ci0gICAgICBzaXplICs9IHRhZ1NpemUgKyBlbnRyeVNpemUKLSAgICAgICAgICArIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShlbnRyeVNpemUpOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIC8qKgotICAgKiBDaGVja3Mgd2hldGhlciB0d28ge0BsaW5rIE1hcH0gYXJlIGVxdWFsLiBXZSBkb24ndCB1c2UgdGhlIGRlZmF1bHQgZXF1YWxzCi0gICAqIG1ldGhvZCBvZiB7QGxpbmsgTWFwfSBiZWNhdXNlIGl0IGNvbXBhcmVzIGJ5IGlkZW50aXR5IG5vdCBieSBjb250ZW50IGZvcgotICAgKiBieXRlIGFycmF5cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgPEssIFY+IGJvb2xlYW4gZXF1YWxzKE1hcDxLLCBWPiBhLCBNYXA8SywgVj4gYikgewotICAgIGlmIChhID09IGIpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoYSA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gYi5zaXplKCkgPT0gMDsKLSAgICB9Ci0gICAgaWYgKGIgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGEuc2l6ZSgpID09IDA7Ci0gICAgfQotICAgIGlmIChhLnNpemUoKSAhPSBiLnNpemUoKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKEVudHJ5PEssIFY+IGVudHJ5IDogYS5lbnRyeVNldCgpKSB7Ci0gICAgICBpZiAoIWIuY29udGFpbnNLZXkoZW50cnkuZ2V0S2V5KCkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmICghZXF1YWxzTWFwVmFsdWUoZW50cnkuZ2V0VmFsdWUoKSwgYi5nZXQoZW50cnkuZ2V0S2V5KCkpKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcXVhbHNNYXBWYWx1ZShPYmplY3QgYSwgT2JqZWN0IGIpIHsKLSAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAia2V5cyBhbmQgdmFsdWVzIGluIG1hcHMgY2Fubm90IGJlIG51bGwiKTsKLSAgICB9Ci0gICAgaWYgKGEgaW5zdGFuY2VvZiBieXRlW10gJiYgYiBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoKGJ5dGVbXSkgYSwgKGJ5dGVbXSkgYik7Ci0gICAgfQotICAgIHJldHVybiBhLmVxdWFscyhiKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgPEssIFY+IGludCBoYXNoQ29kZShNYXA8SywgVj4gbWFwKSB7Ci0gICAgaWYgKG1hcCA9PSBudWxsKSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgZm9yIChFbnRyeTxLLCBWPiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICByZXN1bHQgKz0gaGFzaENvZGVGb3JNYXAoZW50cnkuZ2V0S2V5KCkpCi0gICAgICAgICAgXiBoYXNoQ29kZUZvck1hcChlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGludCBoYXNoQ29kZUZvck1hcChPYmplY3QgbykgewotICAgIGlmIChvIGluc3RhbmNlb2YgYnl0ZVtdKSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKChieXRlW10pIG8pOwotICAgIH0KLSAgICByZXR1cm4gby5oYXNoQ29kZSgpOwotICB9Ci0KLSAgLy8gVGhpcyBhdm9pZHMgaGF2aW5nIHRvIG1ha2UgRmllbGRBcnJheSBwdWJsaWMuCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBjbG9uZVVua25vd25GaWVsZERhdGEoRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vIG9yaWdpbmFsLAotICAgICAgRXh0ZW5kYWJsZU1lc3NhZ2VOYW5vIGNsb25lZCkgewotICAgIGlmIChvcmlnaW5hbC51bmtub3duRmllbGREYXRhICE9IG51bGwpIHsKLSAgICAgIGNsb25lZC51bmtub3duRmllbGREYXRhID0gKEZpZWxkQXJyYXkpIG9yaWdpbmFsLnVua25vd25GaWVsZERhdGEuY2xvbmUoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0ludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL0ludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzg2NGQzOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby9JbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm87Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFRocm93biB3aGVuIGEgcHJvdG9jb2wgbWVzc2FnZSBiZWluZyBwYXJzZWQgaXMgaW52YWxpZCBpbiBzb21lIHdheSwKLSAqIGUuZy4gaXQgY29udGFpbnMgYSBtYWxmb3JtZWQgdmFyaW50IG9yIGEgbmVnYXRpdmUgYnl0ZSBsZW5ndGguCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC0xNjE2MTUxNzYzMDcyNDUwNDc2TDsKLQotICBwdWJsaWMgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICBzdXBlcihkZXNjcmlwdGlvbik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB0cnVuY2F0ZWRNZXNzYWdlKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbigKLSAgICAgICJXaGlsZSBwYXJzaW5nIGEgcHJvdG9jb2wgbWVzc2FnZSwgdGhlIGlucHV0IGVuZGVkIHVuZXhwZWN0ZWRseSAiICsKLSAgICAgICJpbiB0aGUgbWlkZGxlIG9mIGEgZmllbGQuICBUaGlzIGNvdWxkIG1lYW4gZWl0aGVyIHRoYW4gdGhlICIgKwotICAgICAgImlucHV0IGhhcyBiZWVuIHRydW5jYXRlZCBvciB0aGF0IGFuIGVtYmVkZGVkIG1lc3NhZ2UgIiArCi0gICAgICAibWlzcmVwb3J0ZWQgaXRzIG93biBsZW5ndGguIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiBuZWdhdGl2ZVNpemUoKSB7Ci0gICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uKAotICAgICAgIkNvZGVkSW5wdXRTdHJlYW0gZW5jb3VudGVyZWQgYW4gZW1iZWRkZWQgc3RyaW5nIG9yIG1lc3NhZ2UgIiArCi0gICAgICAid2hpY2ggY2xhaW1lZCB0byBoYXZlIG5lZ2F0aXZlIHNpemUuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiBtYWxmb3JtZWRWYXJpbnQoKSB7Ci0gICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uKAotICAgICAgIkNvZGVkSW5wdXRTdHJlYW0gZW5jb3VudGVyZWQgYSBtYWxmb3JtZWQgdmFyaW50LiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24gaW52YWxpZFRhZygpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24oCi0gICAgICAiUHJvdG9jb2wgbWVzc2FnZSBjb250YWluZWQgYW4gaW52YWxpZCB0YWcgKHplcm8pLiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24gaW52YWxpZEVuZFRhZygpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24oCi0gICAgICAiUHJvdG9jb2wgbWVzc2FnZSBlbmQtZ3JvdXAgdGFnIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgdGFnLiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24gaW52YWxpZFdpcmVUeXBlKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbigKLSAgICAgICJQcm90b2NvbCBtZXNzYWdlIHRhZyBoYWQgaW52YWxpZCB3aXJlIHR5cGUuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiByZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbigKLSAgICAgICJQcm90b2NvbCBtZXNzYWdlIGhhZCB0b28gbWFueSBsZXZlbHMgb2YgbmVzdGluZy4gIE1heSBiZSBtYWxpY2lvdXMuICAiICsKLSAgICAgICJVc2UgQ29kZWRJbnB1dFN0cmVhbS5zZXRSZWN1cnNpb25MaW1pdCgpIHRvIGluY3JlYXNlIHRoZSBkZXB0aCBsaW1pdC4iKTsKLSAgfQotCi0gIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIHNpemVMaW1pdEV4Y2VlZGVkKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbigKLSAgICAgICJQcm90b2NvbCBtZXNzYWdlIHdhcyB0b28gbGFyZ2UuICBNYXkgYmUgbWFsaWNpb3VzLiAgIiArCi0gICAgICAiVXNlIENvZGVkSW5wdXRTdHJlYW0uc2V0U2l6ZUxpbWl0KCkgdG8gaW5jcmVhc2UgdGhlIHNpemUgbGltaXQuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL01hcEZhY3Rvcmllcy5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vTWFwRmFjdG9yaWVzLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4ZmE0ODcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vTWFwRmFjdG9yaWVzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm87Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFV0aWxpdHkgY2xhc3MgZm9yIG1hcHMgc3VwcG9ydC4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1hcEZhY3RvcmllcyB7Ci0gIHB1YmxpYyBzdGF0aWMgaW50ZXJmYWNlIE1hcEZhY3RvcnkgewotICAgIDxLLCBWPiBNYXA8SywgVj4gZm9yTWFwKE1hcDxLLCBWPiBvbGRNYXApOwotICB9Ci0KLSAgLy8gTk9URShsaXVqaXNpKTogVGhlIGZhY3Rvcnkgc2V0dGVyIGlzIHRlbXBvcmFyaWx5IG1hcmtlZCBhcyBwYWNrYWdlIHByaXZhdGUuCi0gIC8vIFRoZSB3YXkgdG8gcHJvdmlkZSBjdXN0b21pemVkIGltcGxlbWVudGF0aW9ucyBvZiBtYXBzIGZvciBkaWZmZXJlbnQKLSAgLy8gcGxhdGZvcm1zIGFyZSBzdGlsbCB1bmRlciBkaXNjdXNzaW9uLiAgTWFyayBpdCBhcyBwcml2YXRlIHRvIGF2b2lkIGV4cG9zaW5nCi0gIC8vIHRoZSBBUEkgaW4gcHJvdG8zIGFscGhhIHJlbGVhc2UuCi0gIC8qIHB1YmxpYyAqLyBzdGF0aWMgdm9pZCBzZXRNYXBGYWN0b3J5KE1hcEZhY3RvcnkgbmV3TWFwRmFjdG9yeSkgewotICAgIG1hcEZhY3RvcnkgPSBuZXdNYXBGYWN0b3J5OwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBNYXBGYWN0b3J5IGdldE1hcEZhY3RvcnkoKSB7Ci0gICAgcmV0dXJuIG1hcEZhY3Rvcnk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBEZWZhdWx0TWFwRmFjdG9yeSBpbXBsZW1lbnRzIE1hcEZhY3RvcnkgewotICAgIHB1YmxpYyA8SywgVj4gTWFwPEssIFY+IGZvck1hcChNYXA8SywgVj4gb2xkTWFwKSB7Ci0gICAgICBpZiAob2xkTWFwID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBIYXNoTWFwPEssIFY+KCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gb2xkTWFwOwotICAgIH0KLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2xhdGlsZSBNYXBGYWN0b3J5IG1hcEZhY3RvcnkgPSBuZXcgRGVmYXVsdE1hcEZhY3RvcnkoKTsKLQotICBwcml2YXRlIE1hcEZhY3RvcmllcygpIHt9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby9NZXNzYWdlTmFuby5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vTWVzc2FnZU5hbm8uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjM0NzUwMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby9NZXNzYWdlTmFuby5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTk4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYubmFubzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgUHJvdG9jb2wgTWVzc2FnZSBvYmplY3RzLgotICoKLSAqIEBhdXRob3Igd2lua0Bnb29nbGUuY29tIFdpbmsgU2F2aWxsZQotICovCi1wdWJsaWMgYWJzdHJhY3QgY2xhc3MgTWVzc2FnZU5hbm8gewotICAgIHByb3RlY3RlZCB2b2xhdGlsZSBpbnQgY2FjaGVkU2l6ZSA9IC0xOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgbWVzc2FnZS4KLSAgICAgKiBSZXR1cm5zIHRoZSBjYWNoZWQgc2l6ZSBvciBjYWxscyBnZXRTZXJpYWxpemVkU2l6ZSB3aGljaAotICAgICAqIHNldHMgdGhlIGNhY2hlZCBzaXplLiBUaGlzIGlzIHVzZWQgaW50ZXJuYWxseSB3aGVuIHNlcmlhbGl6aW5nCi0gICAgICogc28gdGhlIHNpemUgaXMgb25seSBjb21wdXRlZCBvbmNlLiBJZiBhIG1lbWJlciBpcyBtb2RpZmllZAotICAgICAqIHRoZW4gdGhpcyBjb3VsZCBiZSBzdGFsZSBjYWxsIGdldFNlcmlhbGl6ZWRTaXplIGlmIGluIGRvdWJ0LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0Q2FjaGVkU2l6ZSgpIHsKLSAgICAgICAgaWYgKGNhY2hlZFNpemUgPCAwKSB7Ci0gICAgICAgICAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSBzZXRzIGNhY2hlZFNpemUKLSAgICAgICAgICAgIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNhY2hlZFNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBtZXNzYWdlLgotICAgICAqIFRoZSBzaXplIGlzIGNhY2hlZCBhbmQgdGhlIGNhY2hlZCByZXN1bHQgY2FuIGJlIHJldHJpZXZlZAotICAgICAqIHVzaW5nIGdldENhY2hlZFNpemUoKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkgewotICAgICAgICBpbnQgc2l6ZSA9IGNvbXB1dGVTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgICBjYWNoZWRTaXplID0gc2l6ZTsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcHV0ZXMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBtZXNzYWdlLiBUaGlzIGRvZXMgbm90IHVwZGF0ZSB0aGUKLSAgICAgKiBjYWNoZWQgc2l6ZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgaW50IGNvbXB1dGVTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIC8vIFRoaXMgaXMgb3ZlcnJpZGRlbiBpZiB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgaGFzIHNlcmlhbGl6ZWQgZmllbGRzLgotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LgotICAgICAqCi0gICAgICogQHBhcmFtIG91dHB1dCB0aGUgb3V0cHV0IHRvIHJlY2VpdmUgdGhlIHNlcmlhbGl6ZWQgZm9ybS4KLSAgICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uIGlmIGFuIGVycm9yIG9jY3VycmVkIHdyaXRpbmcgdG8ge0Bjb2RlIG91dHB1dH0uCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgd3JpdGVUbyhDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgLy8gRG9lcyBub3RoaW5nIGJ5IGRlZmF1bHQuIE92ZXJyaWRkZW4gYnkgc3ViY2xhc3NlcyB3aGljaCBoYXZlIGRhdGEgdG8gd3JpdGUuCi0gICAgfQotCi0gICAgLyoqCi0gICAgICogUGFyc2Uge0Bjb2RlIGlucHV0fSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuCi0gICAgICovCi0gICAgcHVibGljIGFic3RyYWN0IE1lc3NhZ2VOYW5vIG1lcmdlRnJvbShDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZSB0byBhIGJ5dGUgYXJyYXkuCi0gICAgICogQHJldHVybiBieXRlIGFycmF5IHdpdGggdGhlIHNlcmlhbGl6ZWQgZGF0YS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSB0b0J5dGVBcnJheShNZXNzYWdlTmFubyBtc2cpIHsKLSAgICAgICAgZmluYWwgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW21zZy5nZXRTZXJpYWxpemVkU2l6ZSgpXTsKLSAgICAgICAgdG9CeXRlQXJyYXkobXNnLCByZXN1bHQsIDAsIHJlc3VsdC5sZW5ndGgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNlcmlhbGl6ZSB0byBhIGJ5dGUgYXJyYXkgc3RhcnRpbmcgYXQgb2Zmc2V0IHRocm91Z2ggbGVuZ3RoLiBUaGUKLSAgICAgKiBtZXRob2QgZ2V0U2VyaWFsaXplZFNpemUgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIHByaW9yIHRvIGNhbGxpbmcKLSAgICAgKiB0aGlzIG1ldGhvZCBzbyB0aGUgcHJvcGVyIGxlbmd0aCBpcyBrbm93LiAgSWYgYW4gYXR0ZW1wdCB0bwotICAgICAqIHdyaXRlIG1vcmUgdGhhbiBsZW5ndGggYnl0ZXMgT3V0T2ZTcGFjZUV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bgotICAgICAqIGFuZCBpZiBsZW5ndGggYnl0ZXMgYXJlIG5vdCB3cml0dGVuIHRoZW4gSWxsZWdhbFN0YXRlRXhjZXB0aW9uCi0gICAgICogaXMgdGhyb3duLgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgdm9pZCB0b0J5dGVBcnJheShNZXNzYWdlTmFubyBtc2csIGJ5dGVbXSBkYXRhLCBpbnQgb2Zmc2V0LCBpbnQgbGVuZ3RoKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBmaW5hbCBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vIG91dHB1dCA9Ci0gICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5uZXdJbnN0YW5jZShkYXRhLCBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICAgICAgICBtc2cud3JpdGVUbyhvdXRwdXQpOwotICAgICAgICAgICAgb3V0cHV0LmNoZWNrTm9TcGFjZUxlZnQoKTsKLSAgICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlNlcmlhbGl6aW5nIHRvIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICsgIihzaG91bGQgbmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuCi0gICAgICovCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCA8VCBleHRlbmRzIE1lc3NhZ2VOYW5vPiBUIG1lcmdlRnJvbShUIG1zZywgZmluYWwgYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIHsKLSAgICAgICAgcmV0dXJuIG1lcmdlRnJvbShtc2csIGRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgPFQgZXh0ZW5kcyBNZXNzYWdlTmFubz4gVCBtZXJnZUZyb20oVCBtc2csIGZpbmFsIGJ5dGVbXSBkYXRhLAotICAgICAgICAgICAgZmluYWwgaW50IG9mZiwgZmluYWwgaW50IGxlbikgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlck5hbm9FeGNlcHRpb24gewotICAgICAgICB0cnkgewotICAgICAgICAgICAgZmluYWwgQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vIGlucHV0ID0KLSAgICAgICAgICAgICAgICBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8ubmV3SW5zdGFuY2UoZGF0YSwgb2ZmLCBsZW4pOwotICAgICAgICAgICAgbXNnLm1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7Ci0gICAgICAgICAgICByZXR1cm4gbXNnOwotICAgICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJOYW5vRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGU7Ci0gICAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIgotICAgICAgICAgICAgICAgICAgICArICJuZXZlciBoYXBwZW4pLiIpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29tcGFyZXMgdHdvIHtAY29kZSBNZXNzYWdlTmFub31zIGFuZCByZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NhZ2UncyBhcmUgdGhlIHNhbWUgY2xhc3MgYW5kCi0gICAgICogaGF2ZSBzZXJpYWxpemVkIGZvcm0gZXF1YWxpdHkgKGkuZS4gYWxsIG9mIHRoZSBmaWVsZCB2YWx1ZXMgYXJlIHRoZSBzYW1lKS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGJvb2xlYW4gbWVzc2FnZU5hbm9FcXVhbHMoTWVzc2FnZU5hbm8gYSwgTWVzc2FnZU5hbm8gYikgewotICAgICAgICBpZiAoYSA9PSBiKSB7Ci0gICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgfQotICAgICAgICBpZiAoYSA9PSBudWxsIHx8IGIgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGlmIChhLmdldENsYXNzKCkgIT0gYi5nZXRDbGFzcygpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCBzZXJpYWxpemVkU2l6ZSA9IGEuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgICAgaWYgKGIuZ2V0U2VyaWFsaXplZFNpemUoKSAhPSBzZXJpYWxpemVkU2l6ZSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGJ5dGVbXSBhQnl0ZUFycmF5ID0gbmV3IGJ5dGVbc2VyaWFsaXplZFNpemVdOwotICAgICAgICBmaW5hbCBieXRlW10gYkJ5dGVBcnJheSA9IG5ldyBieXRlW3NlcmlhbGl6ZWRTaXplXTsKLSAgICAgICAgdG9CeXRlQXJyYXkoYSwgYUJ5dGVBcnJheSwgMCwgc2VyaWFsaXplZFNpemUpOwotICAgICAgICB0b0J5dGVBcnJheShiLCBiQnl0ZUFycmF5LCAwLCBzZXJpYWxpemVkU2l6ZSk7Ci0gICAgICAgIHJldHVybiBBcnJheXMuZXF1YWxzKGFCeXRlQXJyYXksIGJCeXRlQXJyYXkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMgYSBzdHJpbmcgdGhhdCBpcyAobW9zdGx5KSBjb21wYXRpYmxlIHdpdGggUHJvdG9CdWZmZXIncyBUZXh0Rm9ybWF0LiBOb3RlIHRoYXQgZ3JvdXBzCi0gICAgICogKHdoaWNoIGFyZSBkZXByZWNhdGVkKSBhcmUgbm90IHNlcmlhbGl6ZWQgd2l0aCB0aGUgY29ycmVjdCBmaWVsZCBuYW1lLgotICAgICAqCi0gICAgICogPHA+VGhpcyBpcyBpbXBsZW1lbnRlZCB1c2luZyByZWZsZWN0aW9uLCBzbyBpdCBpcyBub3QgZXNwZWNpYWxseSBmYXN0IG5vciBpcyBpdCBndWFyYW50ZWVkCi0gICAgICogdG8gZmluZCBhbGwgZmllbGRzIGlmIHlvdSBoYXZlIG1ldGhvZCByZW1vdmFsIHR1cm5lZCBvbiBmb3IgcHJvZ3VhcmQuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICAgICAgcmV0dXJuIE1lc3NhZ2VOYW5vUHJpbnRlci5wcmludCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcm92aWRlcyBzdXBwb3J0IGZvciBjbG9uaW5nLiBUaGlzIG9ubHkgd29ya3MgaWYgeW91IHNwZWNpZnkgdGhlIGdlbmVyYXRlX2Nsb25lIG1ldGhvZC4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgTWVzc2FnZU5hbm8gY2xvbmUoKSB0aHJvd3MgQ2xvbmVOb3RTdXBwb3J0ZWRFeGNlcHRpb24gewotICAgICAgICByZXR1cm4gKE1lc3NhZ2VOYW5vKSBzdXBlci5jbG9uZSgpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL01lc3NhZ2VOYW5vUHJpbnRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vTWVzc2FnZU5hbm9QcmludGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ5NTAwYmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vTWVzc2FnZU5hbm9QcmludGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQXJyYXk7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTW9kaWZpZXI7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBTdGF0aWMgaGVscGVyIG1ldGhvZHMgZm9yIHByaW50aW5nIG5hbm8gcHJvdG9zLgotICoKLSAqIEBhdXRob3IgZmx5bm5AZ29vZ2xlLmNvbSBBbmRyZXcgRmx5bm4KLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIE1lc3NhZ2VOYW5vUHJpbnRlciB7Ci0gICAgLy8gRG8gbm90IGFsbG93IGluc3RhbnRpYXRpb24KLSAgICBwcml2YXRlIE1lc3NhZ2VOYW5vUHJpbnRlcigpIHt9Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBTdHJpbmcgSU5ERU5UID0gIiAgIjsKLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgTUFYX1NUUklOR19MRU4gPSAyMDA7Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGFuIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSBNZXNzYWdlTmFubyBzdWl0YWJsZSBmb3IgZGVidWdnaW5nLiBUaGUgcmV0dXJuZWQgc3RyaW5nCi0gICAgICogaXMgbW9zdGx5IGNvbXBhdGlibGUgd2l0aCBQcm90b2NvbCBCdWZmZXIncyBUZXh0Rm9ybWF0IChhcyBwcm92aWRlZCBieSBub24tbmFubyBwcm90b2NvbAotICAgICAqIGJ1ZmZlcnMpIC0tIGdyb3VwcyAod2hpY2ggYXJlIGRlcHJlY2F0ZWQpIGFyZSBvdXRwdXQgd2l0aCBhbiB1bmRlcnNjb3JlIG5hbWUgKGUuZy4gZm9vX2JhcgotICAgICAqIGluc3RlYWQgb2YgRm9vQmFyKSBhbmQgd2lsbCB0aHVzIG5vdCBwYXJzZS4KLSAgICAgKgotICAgICAqIDxwPkVtcGxveXMgSmF2YSByZWZsZWN0aW9uIG9uIHRoZSBnaXZlbiBvYmplY3QgYW5kIHJlY3Vyc2l2ZWx5IHByaW50cyBwcmltaXRpdmUgZmllbGRzLAotICAgICAqIGdyb3VwcywgYW5kIG1lc3NhZ2VzLjwvcD4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgTWVzc2FnZU5hbm8+IFN0cmluZyBwcmludChUIG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgICAgICAgcmV0dXJuICIiOwotICAgICAgICB9Ci0KLSAgICAgICAgU3RyaW5nQnVmZmVyIGJ1ZiA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHByaW50KG51bGwsIG1lc3NhZ2UsIG5ldyBTdHJpbmdCdWZmZXIoKSwgYnVmKTsKLSAgICAgICAgfSBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gIkVycm9yIHByaW50aW5nIHByb3RvOiAiICsgZS5nZXRNZXNzYWdlKCk7Ci0gICAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgcmV0dXJuICJFcnJvciBwcmludGluZyBwcm90bzogIiArIGUuZ2V0TWVzc2FnZSgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWYudG9TdHJpbmcoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGdW5jdGlvbiB0aGF0IHdpbGwgcHJpbnQgdGhlIGdpdmVuIG1lc3NhZ2UvZmllbGQgaW50byB0aGUgU3RyaW5nQnVmZmVyLgotICAgICAqIE1lYW50IHRvIGJlIGNhbGxlZCByZWN1cnNpdmVseS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBpZGVudGlmaWVyIHRoZSBpZGVudGlmaWVyIHRvIHVzZSwgb3Ige0Bjb2RlIG51bGx9IGlmIHRoaXMgaXMgdGhlIHJvb3QgbWVzc2FnZSB0bwotICAgICAqICAgICAgICBwcmludC4KLSAgICAgKiBAcGFyYW0gb2JqZWN0IHRoZSB2YWx1ZSB0byBwcmludC4gTWF5IGluIGZhY3QgYmUgYSBwcmltaXRpdmUgdmFsdWUgb3IgYnl0ZSBhcnJheSBhbmQgbm90IGEKLSAgICAgKiAgICAgICAgbWVzc2FnZS4KLSAgICAgKiBAcGFyYW0gaW5kZW50QnVmIHRoZSBpbmRlbnRhdGlvbiBlYWNoIGxpbmUgc2hvdWxkIGJlZ2luIHdpdGguCi0gICAgICogQHBhcmFtIGJ1ZiB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIHByaW50KFN0cmluZyBpZGVudGlmaWVyLCBPYmplY3Qgb2JqZWN0LAotICAgICAgICAgICAgU3RyaW5nQnVmZmVyIGluZGVudEJ1ZiwgU3RyaW5nQnVmZmVyIGJ1ZikgdGhyb3dzIElsbGVnYWxBY2Nlc3NFeGNlcHRpb24sCi0gICAgICAgICAgICBJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKG9iamVjdCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAvLyBUaGlzIGNhbiBoYXBwZW4gaWYuLi4KLSAgICAgICAgICAgIC8vICAgLSB3ZSdyZSBhYm91dCB0byBwcmludCBhIG1lc3NhZ2UsIFN0cmluZywgb3IgYnl0ZVtdLCBidXQgaXQgbm90IHByZXNlbnQ7Ci0gICAgICAgICAgICAvLyAgIC0gd2UncmUgYWJvdXQgdG8gcHJpbnQgYSBwcmltaXRpdmUsIGJ1dCAicmVmdHlwZSIgb3B0aW9uYWwgc3R5bGUgaXMgZW5hYmxlZCwgYW5kCi0gICAgICAgICAgICAvLyAgICAgdGhlIGZpZWxkIGlzIHVuc2V0LgotICAgICAgICAgICAgLy8gSW4gYm90aCBjYXNlcyB0aGUgYXBwcm9wcmlhdGUgYmVoYXZpb3IgaXMgdG8gb3V0cHV0IG5vdGhpbmcuCi0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWVzc2FnZU5hbm8pIHsgIC8vIE5hbm8gcHJvdG8gbWVzc2FnZQotICAgICAgICAgICAgaW50IG9yaWdJbmRlbnRCdWZMZW5ndGggPSBpbmRlbnRCdWYubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpZiAoaWRlbnRpZmllciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpbmRlbnRCdWYpLmFwcGVuZChkZUNhbWVsQ2FzZWlmeShpZGVudGlmaWVyKSkuYXBwZW5kKCIgPFxuIik7Ci0gICAgICAgICAgICAgICAgaW5kZW50QnVmLmFwcGVuZChJTkRFTlQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgQ2xhc3M8Pz4gY2xhenogPSBvYmplY3QuZ2V0Q2xhc3MoKTsKLQotICAgICAgICAgICAgLy8gUHJvdG8gZmllbGRzIGZvbGxvdyBvbmUgb2YgdHdvIGZvcm1hdHM6Ci0gICAgICAgICAgICAvLwotICAgICAgICAgICAgLy8gMSkgUHVibGljLCBub24tc3RhdGljIHZhcmlhYmxlcyB0aGF0IGRvIG5vdCBiZWdpbiBvciBlbmQgd2l0aCAnXycKLSAgICAgICAgICAgIC8vIEZpbmQgYW5kIHByaW50IHRoZXNlIHVzaW5nIGRlY2xhcmVkIHB1YmxpYyBmaWVsZHMKLSAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQgOiBjbGF6ei5nZXRGaWVsZHMoKSkgewotICAgICAgICAgICAgICAgIGludCBtb2RpZmllcnMgPSBmaWVsZC5nZXRNb2RpZmllcnMoKTsKLSAgICAgICAgICAgICAgICBTdHJpbmcgZmllbGROYW1lID0gZmllbGQuZ2V0TmFtZSgpOwotICAgICAgICAgICAgICAgIGlmICgiY2FjaGVkU2l6ZSIuZXF1YWxzKGZpZWxkTmFtZSkpIHsKLSAgICAgICAgICAgICAgICAgICAgLy8gVE9ETyhiZHVmZik6IHBlcmhhcHMgY2FjaGVkU2l6ZSBzaG91bGQgaGF2ZSBhIG1vcmUgb2JzY3VyZSBuYW1lLgotICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICB9Ci0KLSAgICAgICAgICAgICAgICBpZiAoKG1vZGlmaWVycyAmIE1vZGlmaWVyLlBVQkxJQykgPT0gTW9kaWZpZXIuUFVCTElDCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAobW9kaWZpZXJzICYgTW9kaWZpZXIuU1RBVElDKSAhPSBNb2RpZmllci5TVEFUSUMKLSAgICAgICAgICAgICAgICAgICAgICAgICYmICFmaWVsZE5hbWUuc3RhcnRzV2l0aCgiXyIpCi0gICAgICAgICAgICAgICAgICAgICAgICAmJiAhZmllbGROYW1lLmVuZHNXaXRoKCJfIikpIHsKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gZmllbGRUeXBlID0gZmllbGQuZ2V0VHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUgPSBmaWVsZC5nZXQob2JqZWN0KTsKLQotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGRUeXBlLmlzQXJyYXkoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3M8Pz4gYXJyYXlUeXBlID0gZmllbGRUeXBlLmdldENvbXBvbmVudFR5cGUoKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnl0ZXMgaXMgc3BlY2lhbCBzaW5jZSBpdCdzIG5vdCByZXBlYXRlZCwgYnV0IGlzIHJlcHJlc2VudGVkIGJ5IGFuIGFycmF5Ci0gICAgICAgICAgICAgICAgICAgICAgICBpZiAoYXJyYXlUeXBlID09IGJ5dGUuY2xhc3MpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludChmaWVsZE5hbWUsIHZhbHVlLCBpbmRlbnRCdWYsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW4gPSB2YWx1ZSA9PSBudWxsID8gMCA6IEFycmF5LmdldExlbmd0aCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgZWxlbSA9IEFycmF5LmdldCh2YWx1ZSwgaSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGZpZWxkTmFtZSwgZWxlbSwgaW5kZW50QnVmLCBidWYpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHByaW50KGZpZWxkTmFtZSwgdmFsdWUsIGluZGVudEJ1ZiwgYnVmKTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gMikgRmllbGRzIHRoYXQgYXJlIGFjY2Vzc2VkIHZpYSBnZXR0ZXIgbWV0aG9kcyAod2hlbiBhY2Nlc3NvcnMKLSAgICAgICAgICAgIC8vICAgIG1vZGUgaXMgdHVybmVkIG9uKQotICAgICAgICAgICAgLy8gRmluZCBhbmQgcHJpbnQgdGhlc2UgdXNpbmcgZ2V0dGVyIG1ldGhvZHMuCi0gICAgICAgICAgICBmb3IgKE1ldGhvZCBtZXRob2QgOiBjbGF6ei5nZXRNZXRob2RzKCkpIHsKLSAgICAgICAgICAgICAgICBTdHJpbmcgbmFtZSA9IG1ldGhvZC5nZXROYW1lKCk7Ci0gICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIHRoZSBzZXR0ZXIgYWNjZXNzb3IgbWV0aG9kIHNpbmNlIGdldHRlcnMgYW5kIGhhenplcnMgYm90aCBoYXZlCi0gICAgICAgICAgICAgICAgLy8gbm9uLXByb3RvLWZpZWxkIG5hbWUgY29sbGlzaW9ucyAoaGFzaENvZGUoKSBhbmQgZ2V0U2VyaWFsaXplZFNpemUoKSkKLSAgICAgICAgICAgICAgICBpZiAobmFtZS5zdGFydHNXaXRoKCJzZXQiKSkgewotICAgICAgICAgICAgICAgICAgICBTdHJpbmcgc3ViZmllbGROYW1lID0gbmFtZS5zdWJzdHJpbmcoMyk7Ci0KLSAgICAgICAgICAgICAgICAgICAgTWV0aG9kIGhhenplciA9IG51bGw7Ci0gICAgICAgICAgICAgICAgICAgIHRyeSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBoYXp6ZXIgPSBjbGF6ei5nZXRNZXRob2QoImhhcyIgKyBzdWJmaWVsZE5hbWUpOwotICAgICAgICAgICAgICAgICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgLy8gSWYgaGF6emVyIGRvZXMndCBleGlzdCBvciByZXR1cm5zIGZhbHNlLCBubyBuZWVkIHRvIGNvbnRpbnVlCi0gICAgICAgICAgICAgICAgICAgIGlmICghKEJvb2xlYW4pIGhhenplci5pbnZva2Uob2JqZWN0KSkgewotICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgICAgICBNZXRob2QgZ2V0dGVyID0gbnVsbDsKLSAgICAgICAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGdldHRlciA9IGNsYXp6LmdldE1ldGhvZCgiZ2V0IiArIHN1YmZpZWxkTmFtZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0gY2F0Y2ggKE5vU3VjaE1ldGhvZEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgICAgICAgICAgICAgfQotCi0gICAgICAgICAgICAgICAgICAgIHByaW50KHN1YmZpZWxkTmFtZSwgZ2V0dGVyLmludm9rZShvYmplY3QpLCBpbmRlbnRCdWYsIGJ1Zik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKGlkZW50aWZpZXIgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIGluZGVudEJ1Zi5zZXRMZW5ndGgob3JpZ0luZGVudEJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChpbmRlbnRCdWYpLmFwcGVuZCgiPlxuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAob2JqZWN0IGluc3RhbmNlb2YgTWFwKSB7Ci0gICAgICAgICAgTWFwPD8sPz4gbWFwID0gKE1hcDw/LD8+KSBvYmplY3Q7Ci0gICAgICAgICAgaWRlbnRpZmllciA9IGRlQ2FtZWxDYXNlaWZ5KGlkZW50aWZpZXIpOwotCi0gICAgICAgICAgZm9yIChNYXAuRW50cnk8Pyw/PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKGluZGVudEJ1ZikuYXBwZW5kKGlkZW50aWZpZXIpLmFwcGVuZCgiIDxcbiIpOwotICAgICAgICAgICAgaW50IG9yaWdJbmRlbnRCdWZMZW5ndGggPSBpbmRlbnRCdWYubGVuZ3RoKCk7Ci0gICAgICAgICAgICBpbmRlbnRCdWYuYXBwZW5kKElOREVOVCk7Ci0gICAgICAgICAgICBwcmludCgia2V5IiwgZW50cnkuZ2V0S2V5KCksIGluZGVudEJ1ZiwgYnVmKTsKLSAgICAgICAgICAgIHByaW50KCJ2YWx1ZSIsIGVudHJ5LmdldFZhbHVlKCksIGluZGVudEJ1ZiwgYnVmKTsKLSAgICAgICAgICAgIGluZGVudEJ1Zi5zZXRMZW5ndGgob3JpZ0luZGVudEJ1Zkxlbmd0aCk7Ci0gICAgICAgICAgICBidWYuYXBwZW5kKGluZGVudEJ1ZikuYXBwZW5kKCI+XG4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAvLyBOb24tbnVsbCBwcmltaXRpdmUgdmFsdWUKLSAgICAgICAgICAgIGlkZW50aWZpZXIgPSBkZUNhbWVsQ2FzZWlmeShpZGVudGlmaWVyKTsKLSAgICAgICAgICAgIGJ1Zi5hcHBlbmQoaW5kZW50QnVmKS5hcHBlbmQoaWRlbnRpZmllcikuYXBwZW5kKCI6ICIpOwotICAgICAgICAgICAgaWYgKG9iamVjdCBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgICAgICAgICAgIFN0cmluZyBzdHJpbmdNZXNzYWdlID0gc2FuaXRpemVTdHJpbmcoKFN0cmluZykgb2JqZWN0KTsKLSAgICAgICAgICAgICAgICBidWYuYXBwZW5kKCJcIiIpLmFwcGVuZChzdHJpbmdNZXNzYWdlKS5hcHBlbmQoIlwiIik7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKG9iamVjdCBpbnN0YW5jZW9mIGJ5dGVbXSkgewotICAgICAgICAgICAgICAgIGFwcGVuZFF1b3RlZEJ5dGVzKChieXRlW10pIG9iamVjdCwgYnVmKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgYnVmLmFwcGVuZChvYmplY3QpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnVmLmFwcGVuZCgiXG4iKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnZlcnRzIGFuIGlkZW50aWZpZXIgb2YgdGhlIGZvcm1hdCAiRmllbGROYW1lIiBpbnRvICJmaWVsZF9uYW1lIi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZGVDYW1lbENhc2VpZnkoU3RyaW5nIGlkZW50aWZpZXIpIHsKLSAgICAgICAgU3RyaW5nQnVmZmVyIG91dCA9IG5ldyBTdHJpbmdCdWZmZXIoKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpZGVudGlmaWVyLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgY3VycmVudENoYXIgPSBpZGVudGlmaWVyLmNoYXJBdChpKTsKLSAgICAgICAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgICAgICAgICBvdXQuYXBwZW5kKENoYXJhY3Rlci50b0xvd2VyQ2FzZShjdXJyZW50Q2hhcikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChDaGFyYWN0ZXIuaXNVcHBlckNhc2UoY3VycmVudENoYXIpKSB7Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZCgnXycpLmFwcGVuZChDaGFyYWN0ZXIudG9Mb3dlckNhc2UoY3VycmVudENoYXIpKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgb3V0LmFwcGVuZChjdXJyZW50Q2hhcik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG91dC50b1N0cmluZygpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3J0ZW5zIGFuZCBlc2NhcGVzIHRoZSBnaXZlbiBzdHJpbmcuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHNhbml0aXplU3RyaW5nKFN0cmluZyBzdHIpIHsKLSAgICAgICAgaWYgKCFzdHIuc3RhcnRzV2l0aCgiaHR0cCIpICYmIHN0ci5sZW5ndGgoKSA+IE1BWF9TVFJJTkdfTEVOKSB7Ci0gICAgICAgICAgICAvLyBUcmltIG5vbi1VUkwgc3RyaW5ncy4KLSAgICAgICAgICAgIHN0ciA9IHN0ci5zdWJzdHJpbmcoMCwgTUFYX1NUUklOR19MRU4pICsgIlsuLi5dIjsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZXNjYXBlU3RyaW5nKHN0cik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRXNjYXBlIGV2ZXJ5dGhpbmcgZXhjZXB0IGZvciBsb3cgQVNDSUkgY29kZSBwb2ludHMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGVzY2FwZVN0cmluZyhTdHJpbmcgc3RyKSB7Ci0gICAgICAgIGludCBzdHJMZW4gPSBzdHIubGVuZ3RoKCk7Ci0gICAgICAgIFN0cmluZ0J1aWxkZXIgYiA9IG5ldyBTdHJpbmdCdWlsZGVyKHN0ckxlbik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RyTGVuOyBpKyspIHsKLSAgICAgICAgICAgIGNoYXIgb3JpZ2luYWwgPSBzdHIuY2hhckF0KGkpOwotICAgICAgICAgICAgaWYgKG9yaWdpbmFsID49ICcgJyAmJiBvcmlnaW5hbCA8PSAnficgJiYgb3JpZ2luYWwgIT0gJyInICYmIG9yaWdpbmFsICE9ICdcJycpIHsKLSAgICAgICAgICAgICAgICBiLmFwcGVuZChvcmlnaW5hbCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGIuYXBwZW5kKFN0cmluZy5mb3JtYXQoIlxcdSUwNHgiLCAoaW50KSBvcmlnaW5hbCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBiLnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQXBwZW5kcyBhIHF1b3RlZCBieXRlIGFycmF5IHRvIHRoZSBwcm92aWRlZCB7QGNvZGUgU3RyaW5nQnVmZmVyfS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGFwcGVuZFF1b3RlZEJ5dGVzKGJ5dGVbXSBieXRlcywgU3RyaW5nQnVmZmVyIGJ1aWxkZXIpIHsKLSAgICAgICAgaWYgKGJ5dGVzID09IG51bGwpIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKCJcIlwiIik7Ci0gICAgICAgICAgICByZXR1cm47Ci0gICAgICAgIH0KLQotICAgICAgICBidWlsZGVyLmFwcGVuZCgnIicpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzLmxlbmd0aDsgKytpKSB7Ci0gICAgICAgICAgICBpbnQgY2ggPSBieXRlc1tpXSAmIDB4ZmY7Ci0gICAgICAgICAgICBpZiAoY2ggPT0gJ1xcJyB8fCBjaCA9PSAnIicpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgnXFwnKS5hcHBlbmQoKGNoYXIpIGNoKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoY2ggPj0gMzIgJiYgY2ggPCAxMjcpIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcikgY2gpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBidWlsZGVyLmFwcGVuZChTdHJpbmcuZm9ybWF0KCJcXCUwM28iLCBjaCkpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJ1aWxkZXIuYXBwZW5kKCciJyk7Ci0gICAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vVW5rbm93bkZpZWxkRGF0YS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vVW5rbm93bkZpZWxkRGF0YS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMTY3OGQxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL1Vua25vd25GaWVsZERhdGEuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYubmFubzsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLQotLyoqCi0gKiBTdG9yZXMgdW5rbm93biBmaWVsZHMuIFRoZXNlIG1pZ2h0IGJlIGV4dGVuc2lvbnMgb3IgZmllbGRzIHRoYXQgdGhlIGdlbmVyYXRlZAotICogQVBJIGRvZXNuJ3Qga25vdyBhYm91dCB5ZXQuCi0gKgotICogQGF1dGhvciBiZHVmZkBnb29nbGUuY29tIChCcmlhbiBEdWZmKQotICovCi1maW5hbCBjbGFzcyBVbmtub3duRmllbGREYXRhIHsKLQotICAgIGZpbmFsIGludCB0YWc7Ci0gICAgLyoqCi0gICAgICogSW1wb3J0YW50OiB0aGlzIHNob3VsZCBiZSB0cmVhdGVkIGFzIGltbXV0YWJsZSwgZXZlbiB0aG91Z2ggaXQncyBwb3NzaWJsZQotICAgICAqIHRvIGNoYW5nZSB0aGUgYXJyYXkgdmFsdWVzLgotICAgICAqLwotICAgIGZpbmFsIGJ5dGVbXSBieXRlczsKLQotICAgIFVua25vd25GaWVsZERhdGEoaW50IHRhZywgYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgICAgIHRoaXMudGFnID0gdGFnOwotICAgICAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7Ci0gICAgfQotCi0gICAgaW50IGNvbXB1dGVTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgICAgaW50IHNpemUgPSAwOwotICAgICAgICBzaXplICs9IENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh0YWcpOwotICAgICAgICBzaXplICs9IGJ5dGVzLmxlbmd0aDsKLSAgICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgdm9pZCB3cml0ZVRvKENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOwotICAgICAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhieXRlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvKSB7Ci0gICAgICAgIGlmIChvID09IHRoaXMpIHsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9Ci0gICAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBVbmtub3duRmllbGREYXRhKSkgewotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0KLSAgICAgICAgVW5rbm93bkZpZWxkRGF0YSBvdGhlciA9IChVbmtub3duRmllbGREYXRhKSBvOwotICAgICAgICByZXR1cm4gdGFnID09IG90aGVyLnRhZyAmJiBBcnJheXMuZXF1YWxzKGJ5dGVzLCBvdGhlci5ieXRlcyk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgICAgaW50IHJlc3VsdCA9IDE3OwotICAgICAgICByZXN1bHQgPSAzMSAqIHJlc3VsdCArIHRhZzsKLSAgICAgICAgcmVzdWx0ID0gMzEgKiByZXN1bHQgKyBBcnJheXMuaGFzaENvZGUoYnl0ZXMpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL1dpcmVGb3JtYXROYW5vLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby9XaXJlRm9ybWF0TmFuby5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmI2MzcwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL1dpcmVGb3JtYXROYW5vLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkgYW5kIGdlbmVyYXRlZAotICogbWVzc2FnZSBpbXBsZW1lbnRhdGlvbnMuICBJdCBpcyBwdWJsaWMgb25seSBiZWNhdXNlIHRob3NlIGdlbmVyYXRlZCBtZXNzYWdlcwotICogZG8gbm90IHJlc2lkZSBpbiB0aGUge0Bjb2RlIHByb3RvYnVmfSBwYWNrYWdlLiAgT3RoZXJzIHNob3VsZCBub3QgdXNlIHRoaXMKLSAqIGNsYXNzIGRpcmVjdGx5LgotICoKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgY29uc3RhbnRzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHVzZWZ1bCBmb3IgZGVhbGluZyB3aXRoCi0gKiB0aGUgUHJvdG9jb2wgQnVmZmVyIHdpcmUgZm9ybWF0LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXaXJlRm9ybWF0TmFubyB7Ci0gIC8vIERvIG5vdCBhbGxvdyBpbnN0YW50aWF0aW9uLgotICBwcml2YXRlIFdpcmVGb3JtYXROYW5vKCkge30KLQotICBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICAgPSAwOwotICBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0ZJWEVENjQgICAgICAgICAgPSAxOwotICBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQgPSAyOwotICBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX1NUQVJUX0dST1VQICAgICAgPSAzOwotICBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0VORF9HUk9VUCAgICAgICAgPSA0OwotICBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICAgPSA1OwotCi0gIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfQklUUyA9IDM7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgVEFHX1RZUEVfTUFTSyA9ICgxIDw8IFRBR19UWVBFX0JJVFMpIC0gMTsKLQotICAvKiogR2l2ZW4gYSB0YWcgdmFsdWUsIGRldGVybWluZXMgdGhlIHdpcmUgdHlwZSAodGhlIGxvd2VyIDMgYml0cykuICovCi0gIHN0YXRpYyBpbnQgZ2V0VGFnV2lyZVR5cGUoZmluYWwgaW50IHRhZykgewotICAgIHJldHVybiB0YWcgJiBUQUdfVFlQRV9NQVNLOwotICB9Ci0KLSAgLyoqIEdpdmVuIGEgdGFnIHZhbHVlLCBkZXRlcm1pbmVzIHRoZSBmaWVsZCBudW1iZXIgKHRoZSB1cHBlciAyOSBiaXRzKS4gKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZ2V0VGFnRmllbGROdW1iZXIoZmluYWwgaW50IHRhZykgewotICAgIHJldHVybiB0YWcgPj4+IFRBR19UWVBFX0JJVFM7Ci0gIH0KLQotICAvKiogTWFrZXMgYSB0YWcgdmFsdWUgZ2l2ZW4gYSBmaWVsZCBudW1iZXIgYW5kIHdpcmUgdHlwZS4gKi8KLSAgc3RhdGljIGludCBtYWtlVGFnKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHdpcmVUeXBlKSB7Ci0gICAgcmV0dXJuIChmaWVsZE51bWJlciA8PCBUQUdfVFlQRV9CSVRTKSB8IHdpcmVUeXBlOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgRU1QVFlfSU5UX0FSUkFZW10gPSB7fTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBsb25nIEVNUFRZX0xPTkdfQVJSQVlbXSA9IHt9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGZsb2F0IEVNUFRZX0ZMT0FUX0FSUkFZW10gPSB7fTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBkb3VibGUgRU1QVFlfRE9VQkxFX0FSUkFZW10gPSB7fTsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBib29sZWFuIEVNUFRZX0JPT0xFQU5fQVJSQVlbXSA9IHt9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIFN0cmluZyBFTVBUWV9TVFJJTkdfQVJSQVlbXSA9IHt9OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGJ5dGVbXSBFTVBUWV9CWVRFU19BUlJBWVtdID0ge307Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgYnl0ZVtdIEVNUFRZX0JZVEVTID0ge307Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyBhbiB1bmtub3duIGZpZWxkLiBUaGlzIGltcGxlbWVudGF0aW9uIHNraXBzIHRoZSBmaWVsZC4KLSAgICoKLSAgICogPHA+R2VuZXJhdGVkIG1lc3NhZ2VzIHdpbGwgY2FsbCB0aGlzIGZvciB1bmtub3duIGZpZWxkcyBpZiB0aGUgc3RvcmVfdW5rbm93bl9maWVsZHMKLSAgICogb3B0aW9uIGlzIG9mZi4KLSAgICoKLSAgICogQHJldHVybiB7QGxpdGVyYWwgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBwYXJzZVVua25vd25GaWVsZCgKLSAgICAgIGZpbmFsIENvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyBpbnB1dCwKLSAgICAgIGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGlucHV0LnNraXBGaWVsZCh0YWcpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGVzIHRoZSBhcnJheSBsZW5ndGggb2YgYSByZXBlYXRlZCBmaWVsZC4gV2UgYXNzdW1lIHRoYXQgaW4gdGhlIGNvbW1vbiBjYXNlIHJlcGVhdGVkCi0gICAqIGZpZWxkcyBhcmUgY29udGlndW91c2x5IHNlcmlhbGl6ZWQgYnV0IHdlIHN0aWxsIGNvcnJlY3RseSBoYW5kbGUgaW50ZXJzcGVyc2VkIHZhbHVlcyBvZiBhCi0gICAqIHJlcGVhdGVkIGZpZWxkIChidXQgd2l0aCBleHRyYSBhbGxvY2F0aW9ucykuCi0gICAqCi0gICAqIFJld2luZHMgdG8gY3VycmVudCBpbnB1dCBwb3NpdGlvbiBiZWZvcmUgcmV0dXJuaW5nLgotICAgKgotICAgKiBAcGFyYW0gaW5wdXQgc3RyZWFtIGlucHV0LCBwb2ludGluZyB0byB0aGUgYnl0ZSBhZnRlciB0aGUgZmlyc3QgdGFnCi0gICAqIEBwYXJhbSB0YWcgcmVwZWF0ZWQgZmllbGQgdGFnIGp1c3QgcmVhZAotICAgKiBAcmV0dXJuIGxlbmd0aCBvZiBhcnJheQotICAgKiBAdGhyb3dzIElPRXhjZXB0aW9uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBnZXRSZXBlYXRlZEZpZWxkQXJyYXlMZW5ndGgoCi0gICAgICBmaW5hbCBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gaW5wdXQsCi0gICAgICBmaW5hbCBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGludCBhcnJheUxlbmd0aCA9IDE7Ci0gICAgaW50IHN0YXJ0UG9zID0gaW5wdXQuZ2V0UG9zaXRpb24oKTsKLSAgICBpbnB1dC5za2lwRmllbGQodGFnKTsKLSAgICB3aGlsZSAoaW5wdXQucmVhZFRhZygpID09IHRhZykgewotICAgICAgaW5wdXQuc2tpcEZpZWxkKHRhZyk7Ci0gICAgICBhcnJheUxlbmd0aCsrOwotICAgIH0KLSAgICBpbnB1dC5yZXdpbmRUb1Bvc2l0aW9uKHN0YXJ0UG9zKTsKLSAgICByZXR1cm4gYXJyYXlMZW5ndGg7Ci0gIH0KLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vTmFub1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL05hbm9UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlYmY3YzAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vTmFub1Rlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ0NjggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMyBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk1hcFRlc3RQcm90by5UZXN0TWFwOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Db2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5NYXBUZXN0UHJvdG8uVGVzdE1hcC5NZXNzYWdlVmFsdWU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk5hbm9BY2Nlc3NvcnNPdXRlckNsYXNzLlRlc3ROYW5vQWNjZXNzb3JzOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5OYW5vSGFzT3V0ZXJDbGFzcy5UZXN0QWxsVHlwZXNOYW5vSGFzOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5OYW5vT3V0ZXJDbGFzcy5UZXN0QWxsVHlwZXNOYW5vOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Vbml0dGVzdFJlY3Vyc2l2ZU5hbm8uUmVjdXJzaXZlTWVzc2FnZU5hbm87Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLk5hbm9SZWZlcmVuY2VUeXBlc0NvbXBhdDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8uVW5pdHRlc3RTaW1wbGVOYW5vLlNpbXBsZU1lc3NhZ2VOYW5vOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby5Vbml0dGVzdFNpbmdsZU5hbm8uU2luZ2xlTWVzc2FnZU5hbm87Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5uYW5vLnRlc3RleHQubmFuby5FeHRlbnNpb25zOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYubmFuby50ZXN0ZXh0Lm5hbm8uRXh0ZW5zaW9ucy5Bbm90aGVyTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8udGVzdGV4dC5uYW5vLkV4dGVuc2lvbnMuTWVzc2FnZVdpdGhHcm91cDsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8udGVzdGltcG9ydC5uYW5vLlVuaXR0ZXN0SW1wb3J0TmFubzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheXM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuVHJlZU1hcDsKLQotLyoqCi0gKiBUZXN0IG5hbm8gcnVudGltZS4KLSAqCi0gKiBAYXV0aG9yIHVsYXNAZ29vZ2xlLmNvbSBVbGFzIEtpcmF6Y2kKLSAqLwotcHVibGljIGNsYXNzIE5hbm9UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgc2V0VXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTaW1wbGVNZXNzYWdlTmFubygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFNpbXBsZU1lc3NhZ2VOYW5vIG1zZyA9IG5ldyBTaW1wbGVNZXNzYWdlTmFubygpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1zZy5kKTsKLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgbXNnLm5lc3RlZE1zZyk7Ci0gICAgYXNzZXJ0RXF1YWxzKFNpbXBsZU1lc3NhZ2VOYW5vLkJBWiwgbXNnLmRlZmF1bHROZXN0ZWRFbnVtKTsKLQotICAgIG1zZy5kID0gNDU2OwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5kKTsKLQotICAgIFNpbXBsZU1lc3NhZ2VOYW5vLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTXNnID0gbmV3IFNpbXBsZU1lc3NhZ2VOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBuZXN0ZWRNc2cuYmIgPSAyOwotICAgIGFzc2VydEVxdWFscygyLCBuZXN0ZWRNc2cuYmIpOwotICAgIG1zZy5uZXN0ZWRNc2cgPSBuZXN0ZWRNc2c7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5uZXN0ZWRNc2cuYmIpOwotCi0gICAgbXNnLmRlZmF1bHROZXN0ZWRFbnVtID0gU2ltcGxlTWVzc2FnZU5hbm8uQkFSOwotICAgIGFzc2VydEVxdWFscyhTaW1wbGVNZXNzYWdlTmFuby5CQVIsIG1zZy5kZWZhdWx0TmVzdGVkRW51bSk7Ci0KLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDkpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBTaW1wbGVNZXNzYWdlTmFubyBuZXdNc2cgPSBTaW1wbGVNZXNzYWdlTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBuZXdNc2cuZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5uZXN0ZWRNc2cuYmIpOwotICAgIGFzc2VydEVxdWFscyhTaW1wbGVNZXNzYWdlTmFuby5CQVIsIG1zZy5kZWZhdWx0TmVzdGVkRW51bSk7Ci0KLSAgICBtc2cubmVzdGVkTXNnID0gbnVsbDsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplICE9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVjdXJzaXZlTWVzc2FnZU5hbm8oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBSZWN1cnNpdmVNZXNzYWdlTmFubyBtc2cgPSBuZXcgUmVjdXJzaXZlTWVzc2FnZU5hbm8oKTsKLSAgICBhc3NlcnRUcnVlKG1zZy5yZXBlYXRlZFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vLmxlbmd0aCA9PSAwKTsKLQotICAgIFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vIG1zZzEgPSBuZXcgUmVjdXJzaXZlTWVzc2FnZU5hbm8oKTsKLSAgICBtc2cxLmlkID0gMTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnMS5pZCk7Ci0gICAgUmVjdXJzaXZlTWVzc2FnZU5hbm8gbXNnMiA9IG5ldyBSZWN1cnNpdmVNZXNzYWdlTmFubygpOwotICAgIG1zZzIuaWQgPSAyOwotICAgIFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vIG1zZzMgPSBuZXcgUmVjdXJzaXZlTWVzc2FnZU5hbm8oKTsKLSAgICBtc2czLmlkID0gMzsKLQotICAgIFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTXNnID0gbmV3IFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBuZXN0ZWRNc2cuYSA9IG1zZzE7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZE1zZy5hLmlkKTsKLQotICAgIG1zZy5pZCA9IDA7Ci0gICAgbXNnLm5lc3RlZE1lc3NhZ2UgPSBuZXN0ZWRNc2c7Ci0gICAgbXNnLm9wdGlvbmFsUmVjdXJzaXZlTWVzc2FnZU5hbm8gPSBtc2cyOwotICAgIG1zZy5yZXBlYXRlZFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vID0gbmV3IFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vW10geyBtc2czIH07Ci0KLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDE2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgUmVjdXJzaXZlTWVzc2FnZU5hbm8gbmV3TXNnID0gUmVjdXJzaXZlTWVzc2FnZU5hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vLmxlbmd0aCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLmlkKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLm5lc3RlZE1lc3NhZ2UuYS5pZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5vcHRpb25hbFJlY3Vyc2l2ZU1lc3NhZ2VOYW5vLmlkKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbmV3TXNnLnJlcGVhdGVkUmVjdXJzaXZlTWVzc2FnZU5hbm9bMF0uaWQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VOb0ZpZWxkcygpIHsKLSAgICBTaW5nbGVNZXNzYWdlTmFubyBtc2cgPSBuZXcgU2luZ2xlTWVzc2FnZU5hbm8oKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpLmxlbmd0aCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcXVpcmVkSW50MzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLmlkID0gMTIzOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1zZy5pZCk7Ci0gICAgbXNnLmNsZWFyKCkuaWQgPSA0NTY7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLmlkKTsKLSAgICBtc2cuY2xlYXIoKTsKLQotICAgIG1zZy5pZCA9IDEyMzsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDMpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLmlkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxJbnQzMigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxJbnQzMiA9IDEyMzsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtc2cub3B0aW9uYWxJbnQzMik7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxJbnQzMiA9IDQ1NjsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cub3B0aW9uYWxJbnQzMik7Ci0gICAgbXNnLmNsZWFyKCk7Ci0KLSAgICBtc2cub3B0aW9uYWxJbnQzMiA9IDEyMzsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDUpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLm9wdGlvbmFsSW50MzIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9PcHRpb25hbEludDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5vcHRpb25hbEludDY0ID0gMTIzOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1zZy5vcHRpb25hbEludDY0KTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5vcHRpb25hbEludDY0ID0gNDU2OwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5vcHRpb25hbEludDY0KTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLm9wdGlvbmFsSW50NjQpOwotCi0gICAgbXNnLm9wdGlvbmFsSW50NjQgPSAxMjM7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA1KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5vcHRpb25hbEludDY0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxVaW50MzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsVWludDMyID0gMTIzOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1zZy5vcHRpb25hbFVpbnQzMik7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxVaW50MzIgPSA0NTY7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLm9wdGlvbmFsVWludDMyKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLm9wdGlvbmFsVWludDMyKTsKLQotICAgIG1zZy5vcHRpb25hbFVpbnQzMiA9IDEyMzsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDUpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLm9wdGlvbmFsVWludDMyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxVaW50NjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsVWludDY0ID0gMTIzOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1zZy5vcHRpb25hbFVpbnQ2NCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxVaW50NjQgPSA0NTY7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLm9wdGlvbmFsVWludDY0KTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLm9wdGlvbmFsVWludDY0KTsKLQotICAgIG1zZy5vcHRpb25hbFVpbnQ2NCA9IDEyMzsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDUpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLm9wdGlvbmFsVWludDY0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxTaW50MzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsU2ludDMyID0gMTIzOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1zZy5vcHRpb25hbFNpbnQzMik7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxTaW50MzIgPSA0NTY7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLm9wdGlvbmFsU2ludDMyKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLm9wdGlvbmFsU2ludDMyKTsKLQotICAgIG1zZy5vcHRpb25hbFNpbnQzMiA9IC0xMjM7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygtMTIzLCBuZXdNc2cub3B0aW9uYWxTaW50MzIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9PcHRpb25hbFNpbnQ2NCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxTaW50NjQgPSAxMjM7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbXNnLm9wdGlvbmFsU2ludDY0KTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5vcHRpb25hbFNpbnQ2NCA9IDQ1NjsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cub3B0aW9uYWxTaW50NjQpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cub3B0aW9uYWxTaW50NjQpOwotCi0gICAgbXNnLm9wdGlvbmFsU2ludDY0ID0gLTEyMzsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDYpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xMjMsIG5ld01zZy5vcHRpb25hbFNpbnQ2NCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub09wdGlvbmFsRml4ZWQzMigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxGaXhlZDMyID0gMTIzOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1zZy5vcHRpb25hbEZpeGVkMzIpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLm9wdGlvbmFsRml4ZWQzMiA9IDQ1NjsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cub3B0aW9uYWxGaXhlZDMyKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLm9wdGlvbmFsRml4ZWQzMik7Ci0KLSAgICBtc2cub3B0aW9uYWxGaXhlZDMyID0gMTIzOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cub3B0aW9uYWxGaXhlZDMyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxGaXhlZDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5vcHRpb25hbEZpeGVkNjQgPSAxMjM7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbXNnLm9wdGlvbmFsRml4ZWQ2NCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxGaXhlZDY0ID0gNDU2OwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5vcHRpb25hbEZpeGVkNjQpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cub3B0aW9uYWxGaXhlZDY0KTsKLQotICAgIG1zZy5vcHRpb25hbEZpeGVkNjQgPSAxMjM7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxMik7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cub3B0aW9uYWxGaXhlZDY0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxTZml4ZWQzMigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxTZml4ZWQzMiA9IDEyMzsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtc2cub3B0aW9uYWxTZml4ZWQzMik7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxTZml4ZWQzMiA9IDQ1NjsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cub3B0aW9uYWxTZml4ZWQzMik7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5vcHRpb25hbFNmaXhlZDMyKTsKLQotICAgIG1zZy5vcHRpb25hbFNmaXhlZDMyID0gMTIzOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cub3B0aW9uYWxTZml4ZWQzMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub09wdGlvbmFsU2ZpeGVkNjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsU2ZpeGVkNjQgPSAxMjM7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbXNnLm9wdGlvbmFsU2ZpeGVkNjQpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLm9wdGlvbmFsU2ZpeGVkNjQgPSA0NTY7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLm9wdGlvbmFsU2ZpeGVkNjQpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cub3B0aW9uYWxTZml4ZWQ2NCk7Ci0KLSAgICBtc2cub3B0aW9uYWxTZml4ZWQ2NCA9IC0xMjM7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxMik7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoLTEyMywgbmV3TXNnLm9wdGlvbmFsU2ZpeGVkNjQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9PcHRpb25hbEZsb2F0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5vcHRpb25hbEZsb2F0ID0gMTIzZjsKLSAgICBhc3NlcnRUcnVlKDEyMy4wZiA9PSBtc2cub3B0aW9uYWxGbG9hdCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxGbG9hdCA9IDQ1Ni4wZjsKLSAgICBhc3NlcnRUcnVlKDQ1Ni4wZiA9PSBtc2cub3B0aW9uYWxGbG9hdCk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0VHJ1ZSgwLjBmID09IG1zZy5vcHRpb25hbEZsb2F0KTsKLQotICAgIG1zZy5vcHRpb25hbEZsb2F0ID0gLTEyMy40NTZmOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRUcnVlKC0xMjMuNDU2ZiA9PSBuZXdNc2cub3B0aW9uYWxGbG9hdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub09wdGlvbmFsRG91YmxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5vcHRpb25hbERvdWJsZSA9IDEyMzsKLSAgICBhc3NlcnRUcnVlKDEyMy4wID09IG1zZy5vcHRpb25hbERvdWJsZSk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxEb3VibGUgPSA0NTYuMDsKLSAgICBhc3NlcnRUcnVlKDQ1Ni4wID09IG1zZy5vcHRpb25hbERvdWJsZSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0VHJ1ZSgwLjAgPT0gbXNnLm9wdGlvbmFsRG91YmxlKTsKLQotICAgIG1zZy5vcHRpb25hbERvdWJsZSA9IC0xMjMuNDU2OwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTIpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0VHJ1ZSgtMTIzLjQ1NiA9PSBuZXdNc2cub3B0aW9uYWxEb3VibGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9PcHRpb25hbEJvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsQm9vbCA9IHRydWU7Ci0gICAgYXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxCb29sKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5vcHRpb25hbEJvb2wgPSB0cnVlOwotICAgIGFzc2VydFRydWUobXNnLm9wdGlvbmFsQm9vbCk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLm9wdGlvbmFsQm9vbCk7Ci0KLSAgICBtc2cub3B0aW9uYWxCb29sID0gdHJ1ZTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDUpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cub3B0aW9uYWxCb29sKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxTdHJpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsU3RyaW5nID0gImhlbGxvIjsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbXNnLm9wdGlvbmFsU3RyaW5nKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRUcnVlKG1zZy5vcHRpb25hbFN0cmluZy5pc0VtcHR5KCkpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLm9wdGlvbmFsU3RyaW5nID0gImhlbGxvMiI7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbzIiLCBtc2cub3B0aW9uYWxTdHJpbmcpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydFRydWUobXNnLm9wdGlvbmFsU3RyaW5nLmlzRW1wdHkoKSk7Ci0KLSAgICBtc2cub3B0aW9uYWxTdHJpbmcgPSAiYnllIjsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDgpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cub3B0aW9uYWxTdHJpbmcgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJieWUiLCBuZXdNc2cub3B0aW9uYWxTdHJpbmcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9PcHRpb25hbEJ5dGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbEJ5dGVzLmxlbmd0aCA+IDApOwotICAgIG1zZy5vcHRpb25hbEJ5dGVzID0gSW50ZXJuYWxOYW5vLmNvcHlGcm9tVXRmOCgiaGVsbG8iKTsKLSAgICBhc3NlcnRUcnVlKG1zZy5vcHRpb25hbEJ5dGVzLmxlbmd0aCA+IDApOwotICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBuZXcgU3RyaW5nKG1zZy5vcHRpb25hbEJ5dGVzLCBJbnRlcm5hbE5hbm8uVVRGXzgpKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRGYWxzZShtc2cub3B0aW9uYWxCeXRlcy5sZW5ndGggPiAwKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5vcHRpb25hbEJ5dGVzID0gSW50ZXJuYWxOYW5vLmNvcHlGcm9tVXRmOCgiaGVsbG8iKTsKLSAgICBhc3NlcnRUcnVlKG1zZy5vcHRpb25hbEJ5dGVzLmxlbmd0aCA+IDApOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbEJ5dGVzLmxlbmd0aCA+IDApOwotCi0gICAgbXNnLm9wdGlvbmFsQnl0ZXMgPSBJbnRlcm5hbE5hbm8uY29weUZyb21VdGY4KCJieWUiKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDgpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cub3B0aW9uYWxCeXRlcy5sZW5ndGggPiAwKTsKLSAgICBhc3NlcnRFcXVhbHMoImJ5ZSIsIG5ldyBTdHJpbmcobmV3TXNnLm9wdGlvbmFsQnl0ZXMsIEludGVybmFsTmFuby5VVEZfOCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9PcHRpb25hbEdyb3VwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIFRlc3RBbGxUeXBlc05hbm8uT3B0aW9uYWxHcm91cCBncnAgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5PcHRpb25hbEdyb3VwKCk7Ci0gICAgZ3JwLmEgPSAxOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbEdyb3VwICE9IG51bGwpOwotICAgIG1zZy5vcHRpb25hbEdyb3VwID0gZ3JwOwotICAgIGFzc2VydFRydWUobXNnLm9wdGlvbmFsR3JvdXAgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5vcHRpb25hbEdyb3VwLmEpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbEdyb3VwICE9IG51bGwpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLm9wdGlvbmFsR3JvdXAgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5PcHRpb25hbEdyb3VwKCk7Ci0gICAgbXNnLm9wdGlvbmFsR3JvdXAuYSA9IDI7Ci0gICAgYXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxHcm91cCAhPSBudWxsKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRGYWxzZShtc2cub3B0aW9uYWxHcm91cCAhPSBudWxsKTsKLQotICAgIG1zZy5vcHRpb25hbEdyb3VwID0gZ3JwOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTApOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cub3B0aW9uYWxHcm91cCAhPSBudWxsKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLm9wdGlvbmFsR3JvdXAuYSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub09wdGlvbmFsR3JvdXBXaXRoVW5rbm93bkZpZWxkc0VuYWJsZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlV2l0aEdyb3VwIG1zZyA9IG5ldyBNZXNzYWdlV2l0aEdyb3VwKCk7Ci0gICAgTWVzc2FnZVdpdGhHcm91cC5Hcm91cCBncnAgPSBuZXcgTWVzc2FnZVdpdGhHcm91cC5Hcm91cCgpOwotICAgIGdycC5hID0gMTsKLSAgICBtc2cuZ3JvdXAgPSBncnA7Ci0gICAgYnl0ZSBbXSBzZXJpYWxpemVkID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLQotICAgIE1lc3NhZ2VXaXRoR3JvdXAgcGFyc2VkID0gTWVzc2FnZVdpdGhHcm91cC5wYXJzZUZyb20oc2VyaWFsaXplZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHBhcnNlZC5ncm91cC5hKTsKLQotICAgIGJ5dGUgW10gc2VyaWFsaXplZDIgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShwYXJzZWQpOwotICAgIGFzc2VydEVxdWFscyhzZXJpYWxpemVkLmxlbmd0aCwgc2VyaWFsaXplZDIubGVuZ3RoKTsKLSAgICBNZXNzYWdlV2l0aEdyb3VwIHBhcnNlZDIgPSBNZXNzYWdlV2l0aEdyb3VwLnBhcnNlRnJvbShzZXJpYWxpemVkMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHBhcnNlZDIuZ3JvdXAuYSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub09wdGlvbmFsTmVzdGVkTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSgpOwotICAgIG5lc3RlZE1zZy5iYiA9IDE7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSAhPSBudWxsKTsKLSAgICBtc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gbmVzdGVkTXNnOwotICAgIGFzc2VydFRydWUobXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSAhPSBudWxsKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5iYik7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSAhPSBudWxsKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5iYiA9IDI7Ci0gICAgYXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlICE9IG51bGwpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgIT0gbnVsbCk7Ci0KLSAgICBtc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gbmVzdGVkTXNnOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UuYmIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9PcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIE5hbm9PdXRlckNsYXNzLkZvcmVpZ25NZXNzYWdlTmFubyBuZXN0ZWRNc2cgPSBuZXcgTmFub091dGVyQ2xhc3MuRm9yZWlnbk1lc3NhZ2VOYW5vKCk7Ci0gICAgbmVzdGVkTXNnLmMgPSAxOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbEZvcmVpZ25NZXNzYWdlICE9IG51bGwpOwotICAgIG1zZy5vcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gbmVzdGVkTXNnOwotICAgIGFzc2VydFRydWUobXNnLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5vcHRpb25hbEZvcmVpZ25NZXNzYWdlLmMpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbEZvcmVpZ25NZXNzYWdlICE9IG51bGwpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSBuZXcgTmFub091dGVyQ2xhc3MuRm9yZWlnbk1lc3NhZ2VOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuYyA9IDI7Ci0gICAgYXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxGb3JlaWduTWVzc2FnZSAhPSBudWxsKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRGYWxzZShtc2cub3B0aW9uYWxGb3JlaWduTWVzc2FnZSAhPSBudWxsKTsKLQotICAgIG1zZy5vcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gbmVzdGVkTXNnOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5vcHRpb25hbEZvcmVpZ25NZXNzYWdlICE9IG51bGwpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cub3B0aW9uYWxGb3JlaWduTWVzc2FnZS5jKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxJbXBvcnRNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIFVuaXR0ZXN0SW1wb3J0TmFuby5JbXBvcnRNZXNzYWdlTmFubyBuZXN0ZWRNc2cgPSBuZXcgVW5pdHRlc3RJbXBvcnROYW5vLkltcG9ydE1lc3NhZ2VOYW5vKCk7Ci0gICAgbmVzdGVkTXNnLmQgPSAxOwotICAgIGFzc2VydEZhbHNlKG1zZy5vcHRpb25hbEltcG9ydE1lc3NhZ2UgIT0gbnVsbCk7Ci0gICAgbXNnLm9wdGlvbmFsSW1wb3J0TWVzc2FnZSA9IG5lc3RlZE1zZzsKLSAgICBhc3NlcnRUcnVlKG1zZy5vcHRpb25hbEltcG9ydE1lc3NhZ2UgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5vcHRpb25hbEltcG9ydE1lc3NhZ2UuZCk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLm9wdGlvbmFsSW1wb3J0TWVzc2FnZSAhPSBudWxsKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5vcHRpb25hbEltcG9ydE1lc3NhZ2UgPSBuZXcgVW5pdHRlc3RJbXBvcnROYW5vLkltcG9ydE1lc3NhZ2VOYW5vKCk7Ci0gICAgbXNnLm9wdGlvbmFsSW1wb3J0TWVzc2FnZS5kID0gMjsKLSAgICBhc3NlcnRUcnVlKG1zZy5vcHRpb25hbEltcG9ydE1lc3NhZ2UgIT0gbnVsbCk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLm9wdGlvbmFsSW1wb3J0TWVzc2FnZSAhPSBudWxsKTsKLQotICAgIG1zZy5vcHRpb25hbEltcG9ydE1lc3NhZ2UgPSBuZXN0ZWRNc2c7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA4KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydFRydWUobmV3TXNnLm9wdGlvbmFsSW1wb3J0TWVzc2FnZSAhPSBudWxsKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLm9wdGlvbmFsSW1wb3J0TWVzc2FnZS5kKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxOZXN0ZWRFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5vcHRpb25hbE5lc3RlZEVudW0gPSBUZXN0QWxsVHlwZXNOYW5vLkJBUjsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVIsIG1zZy5vcHRpb25hbE5lc3RlZEVudW0pOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLm9wdGlvbmFsTmVzdGVkRW51bSA9IFRlc3RBbGxUeXBlc05hbm8uQkFaOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkJBWiwgbXNnLm9wdGlvbmFsTmVzdGVkRW51bSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uRk9PLCBtc2cub3B0aW9uYWxOZXN0ZWRFbnVtKTsKLQotICAgIG1zZy5vcHRpb25hbE5lc3RlZEVudW0gPSBUZXN0QWxsVHlwZXNOYW5vLkJBUjsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDYpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uQkFSLCBuZXdNc2cub3B0aW9uYWxOZXN0ZWRFbnVtKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxGb3JlaWduRW51bSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxGb3JlaWduRW51bSA9IE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVI7Ci0gICAgYXNzZXJ0RXF1YWxzKE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVIsIG1zZy5vcHRpb25hbEZvcmVpZ25FbnVtKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5vcHRpb25hbEZvcmVpZ25FbnVtID0gTmFub091dGVyQ2xhc3MuRk9SRUlHTl9OQU5PX0JBWjsKLSAgICBhc3NlcnRFcXVhbHMoTmFub091dGVyQ2xhc3MuRk9SRUlHTl9OQU5PX0JBWiwgbXNnLm9wdGlvbmFsRm9yZWlnbkVudW0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscyhOYW5vT3V0ZXJDbGFzcy5GT1JFSUdOX05BTk9fRk9PLCBtc2cub3B0aW9uYWxGb3JlaWduRW51bSk7Ci0KLSAgICBtc2cub3B0aW9uYWxGb3JlaWduRW51bSA9IE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVI7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscyhOYW5vT3V0ZXJDbGFzcy5GT1JFSUdOX05BTk9fQkFSLCBuZXdNc2cub3B0aW9uYWxGb3JlaWduRW51bSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub09wdGlvbmFsSW1wb3J0RW51bSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxJbXBvcnRFbnVtID0gVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0JBUjsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0JBUiwgbXNnLm9wdGlvbmFsSW1wb3J0RW51bSk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxJbXBvcnRFbnVtID0gVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0JBWjsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0JBWiwgbXNnLm9wdGlvbmFsSW1wb3J0RW51bSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0TmFuby5JTVBPUlRfTkFOT19GT08sIG1zZy5vcHRpb25hbEltcG9ydEVudW0pOwotCi0gICAgbXNnLm9wdGlvbmFsSW1wb3J0RW51bSA9IFVuaXR0ZXN0SW1wb3J0TmFuby5JTVBPUlRfTkFOT19CQVI7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fQkFSLCBuZXdNc2cub3B0aW9uYWxJbXBvcnRFbnVtKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vT3B0aW9uYWxTdHJpbmdQaWVjZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxTdHJpbmdQaWVjZSA9ICJoZWxsbyI7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG1zZy5vcHRpb25hbFN0cmluZ1BpZWNlKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRUcnVlKG1zZy5vcHRpb25hbFN0cmluZ1BpZWNlLmlzRW1wdHkoKSk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxTdHJpbmdQaWVjZSA9ICJoZWxsbzIiOwotICAgIGFzc2VydEVxdWFscygiaGVsbG8yIiwgbXNnLm9wdGlvbmFsU3RyaW5nUGllY2UpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydFRydWUobXNnLm9wdGlvbmFsU3RyaW5nUGllY2UuaXNFbXB0eSgpKTsKLQotICAgIG1zZy5vcHRpb25hbFN0cmluZ1BpZWNlID0gImJ5ZSI7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA5KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydFRydWUobmV3TXNnLm9wdGlvbmFsU3RyaW5nUGllY2UgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJieWUiLCBuZXdNc2cub3B0aW9uYWxTdHJpbmdQaWVjZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub09wdGlvbmFsQ29yZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cub3B0aW9uYWxDb3JkID0gImhlbGxvIjsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbXNnLm9wdGlvbmFsQ29yZCk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxDb3JkLmlzRW1wdHkoKSk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAub3B0aW9uYWxDb3JkID0gImhlbGxvMiI7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbzIiLCBtc2cub3B0aW9uYWxDb3JkKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRUcnVlKG1zZy5vcHRpb25hbENvcmQuaXNFbXB0eSgpKTsKLQotICAgIG1zZy5vcHRpb25hbENvcmQgPSAiYnllIjsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDkpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cub3B0aW9uYWxDb3JkICE9IG51bGwpOwotICAgIGFzc2VydEVxdWFscygiYnllIiwgbmV3TXNnLm9wdGlvbmFsQ29yZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcGVhdGVkSW50MzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEludDMyLmxlbmd0aCk7Ci0gICAgbXNnLnJlcGVhdGVkSW50MzIgPSBuZXcgaW50W10geyAxMjMsIDc4OSwgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDc4OSwgbXNnLnJlcGVhdGVkSW50MzJbMV0pOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZEludDMyWzJdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkSW50MzIubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEludDMyID0gbmV3IGludFtdIHsgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEludDMyLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkSW50MzJbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRJbnQzMi5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRJbnQzMiA9IG5ldyBpbnRbXSB7IDEyMyB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRJbnQzMi5sZW5ndGgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gNik7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZEludDMyLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkSW50MzJbMF0pOwotCi0gICAgLy8gVGVzdCAyIGVudHJpZXMKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEludDMyID0gbmV3IGludFtdIHsgMTIzLCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkSW50MzIubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDEwKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkSW50MzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRJbnQzMlswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkSW50MzJbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZEludDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRJbnQ2NC5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZEludDY0ID0gbmV3IGxvbmdbXSB7IDEyMywgNzg5LCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LCBtc2cucmVwZWF0ZWRJbnQ2NFsxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkSW50NjRbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRJbnQ2NC5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkSW50NjQgPSBuZXcgbG9uZ1tdIHsgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEludDY0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkSW50NjRbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRJbnQ2NC5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRJbnQ2NCA9IG5ldyBsb25nW10geyAxMjMgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkSW50NjQubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDYpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRJbnQ2NC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZEludDY0WzBdKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRJbnQ2NCA9IG5ldyBsb25nW10geyAxMjMsIDQ1NiB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRJbnQ2NC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTApOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cucmVwZWF0ZWRJbnQ2NC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZEludDY0WzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBuZXdNc2cucmVwZWF0ZWRJbnQ2NFsxXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcGVhdGVkVWludDMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRVaW50MzIubGVuZ3RoKTsKLSAgICBtc2cucmVwZWF0ZWRVaW50MzIgPSBuZXcgaW50W10geyAxMjMsIDc4OSwgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDc4OSwgbXNnLnJlcGVhdGVkVWludDMyWzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cucmVwZWF0ZWRVaW50MzJbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRVaW50MzIubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFVpbnQzMiA9IG5ldyBpbnRbXSB7IDQ1NiB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRVaW50MzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cucmVwZWF0ZWRVaW50MzJbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRVaW50MzIubGVuZ3RoKTsKLQotICAgIC8vIFRlc3QgMSBlbnRyeQotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkVWludDMyID0gbmV3IGludFtdIHsgMTIzIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFVpbnQzMi5sZW5ndGgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gNik7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZFVpbnQzMi5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZFVpbnQzMlswXSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkVWludDMyID0gbmV3IGludFtdIHsgMTIzLCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkVWludDMyLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5yZXBlYXRlZFVpbnQzMi5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZFVpbnQzMlswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkVWludDMyWzFdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWRVaW50NjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFVpbnQ2NC5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZFVpbnQ2NCA9IG5ldyBsb25nW10geyAxMjMsIDc4OSwgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDc4OSwgbXNnLnJlcGVhdGVkVWludDY0WzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cucmVwZWF0ZWRVaW50NjRbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRVaW50NjQubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFVpbnQ2NCA9IG5ldyBsb25nW10geyA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkVWludDY0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkVWludDY0WzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkVWludDY0Lmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDEgZW50cnkKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFVpbnQ2NCA9IG5ldyBsb25nW10geyAxMjMgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkVWludDY0Lmxlbmd0aCk7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkVWludDY0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkVWludDY0WzBdKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRVaW50NjQgPSBuZXcgbG9uZ1tdIHsgMTIzLCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkVWludDY0Lmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5yZXBlYXRlZFVpbnQ2NC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZFVpbnQ2NFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkVWludDY0WzFdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWRTaW50MzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFNpbnQzMi5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZFNpbnQzMiA9IG5ldyBpbnRbXSB7IDEyMywgNzg5LCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LCBtc2cucmVwZWF0ZWRTaW50MzJbMV0pOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZFNpbnQzMlsyXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFNpbnQzMi5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkU2ludDMyID0gbmV3IGludFtdIHsgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFNpbnQzMi5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZFNpbnQzMlswXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFNpbnQzMi5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRTaW50MzIgPSBuZXcgaW50W10geyAxMjMgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkU2ludDMyLmxlbmd0aCk7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA3KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkU2ludDMyLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkU2ludDMyWzBdKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRTaW50MzIgPSBuZXcgaW50W10geyAxMjMsIDQ1NiB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRTaW50MzIubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDExKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkU2ludDMyLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkU2ludDMyWzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBuZXdNc2cucmVwZWF0ZWRTaW50MzJbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZFNpbnQ2NCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkU2ludDY0Lmxlbmd0aCk7Ci0gICAgbXNnLnJlcGVhdGVkU2ludDY0ID0gbmV3IGxvbmdbXSB7IDEyMywgNzg5LCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LCBtc2cucmVwZWF0ZWRTaW50NjRbMV0pOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZFNpbnQ2NFsyXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFNpbnQ2NC5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkU2ludDY0ID0gbmV3IGxvbmdbXSB7IDQ1NiB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRTaW50NjQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cucmVwZWF0ZWRTaW50NjRbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTaW50NjQubGVuZ3RoKTsKLQotICAgIC8vIFRlc3QgMSBlbnRyeQotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkU2ludDY0ID0gbmV3IGxvbmdbXSB7IDEyMyB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRTaW50NjQubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDcpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRTaW50NjQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRTaW50NjRbMF0pOwotCi0gICAgLy8gVGVzdCAyIGVudHJpZXMKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFNpbnQ2NCA9IG5ldyBsb25nW10geyAxMjMsIDQ1NiB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRTaW50NjQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDExKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkU2ludDY0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkU2ludDY0WzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBuZXdNc2cucmVwZWF0ZWRTaW50NjRbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZEZpeGVkMzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEZpeGVkMzIubGVuZ3RoKTsKLSAgICBtc2cucmVwZWF0ZWRGaXhlZDMyID0gbmV3IGludFtdIHsgMTIzLCA3ODksIDQ1NiB9OwotICAgIGFzc2VydEVxdWFscyg3ODksIG1zZy5yZXBlYXRlZEZpeGVkMzJbMV0pOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZEZpeGVkMzJbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRGaXhlZDMyLmxlbmd0aCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRGaXhlZDMyID0gbmV3IGludFtdIHsgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEZpeGVkMzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cucmVwZWF0ZWRGaXhlZDMyWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkRml4ZWQzMi5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRGaXhlZDMyID0gbmV3IGludFtdIHsgMTIzIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEZpeGVkMzIubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDkpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRGaXhlZDMyLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkRml4ZWQzMlswXSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkRml4ZWQzMiA9IG5ldyBpbnRbXSB7IDEyMywgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5yZXBlYXRlZEZpeGVkMzIubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDE1KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkRml4ZWQzMi5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZEZpeGVkMzJbMF0pOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG5ld01zZy5yZXBlYXRlZEZpeGVkMzJbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZEZpeGVkNjQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEZpeGVkNjQubGVuZ3RoKTsKLSAgICBtc2cucmVwZWF0ZWRGaXhlZDY0ID0gbmV3IGxvbmdbXSB7IDEyMywgNzg5LCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LCBtc2cucmVwZWF0ZWRGaXhlZDY0WzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cucmVwZWF0ZWRGaXhlZDY0WzJdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkRml4ZWQ2NC5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkRml4ZWQ2NCA9IG5ldyBsb25nW10geyA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkRml4ZWQ2NC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZEZpeGVkNjRbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRGaXhlZDY0Lmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDEgZW50cnkKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEZpeGVkNjQgPSBuZXcgbG9uZ1tdIHsgMTIzIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEZpeGVkNjQubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDEzKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkRml4ZWQ2NC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZEZpeGVkNjRbMF0pOwotCi0gICAgLy8gVGVzdCAyIGVudHJpZXMKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEZpeGVkNjQgPSBuZXcgbG9uZ1tdIHsgMTIzLCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkRml4ZWQ2NC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMjMpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cucmVwZWF0ZWRGaXhlZDY0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkRml4ZWQ2NFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkRml4ZWQ2NFsxXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcGVhdGVkU2ZpeGVkMzIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFNmaXhlZDMyLmxlbmd0aCk7Ci0gICAgbXNnLnJlcGVhdGVkU2ZpeGVkMzIgPSBuZXcgaW50W10geyAxMjMsIDc4OSwgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDc4OSwgbXNnLnJlcGVhdGVkU2ZpeGVkMzJbMV0pOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZFNmaXhlZDMyWzJdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkU2ZpeGVkMzIubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFNmaXhlZDMyID0gbmV3IGludFtdIHsgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFNmaXhlZDMyLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkU2ZpeGVkMzJbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTZml4ZWQzMi5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRTZml4ZWQzMiA9IG5ldyBpbnRbXSB7IDEyMyB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRTZml4ZWQzMi5sZW5ndGgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZFNmaXhlZDMyLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkU2ZpeGVkMzJbMF0pOwotCi0gICAgLy8gVGVzdCAyIGVudHJpZXMKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFNmaXhlZDMyID0gbmV3IGludFtdIHsgMTIzLCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkU2ZpeGVkMzIubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDE1KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkU2ZpeGVkMzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRTZml4ZWQzMlswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkU2ZpeGVkMzJbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZFNmaXhlZDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTZml4ZWQ2NC5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZFNmaXhlZDY0ID0gbmV3IGxvbmdbXSB7IDEyMywgNzg5LCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LCBtc2cucmVwZWF0ZWRTZml4ZWQ2NFsxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkU2ZpeGVkNjRbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTZml4ZWQ2NC5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkU2ZpeGVkNjQgPSBuZXcgbG9uZ1tdIHsgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFNmaXhlZDY0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkU2ZpeGVkNjRbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTZml4ZWQ2NC5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRTZml4ZWQ2NCA9IG5ldyBsb25nW10geyAxMjMgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDEzKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRTZml4ZWQ2NFswXSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkU2ZpeGVkNjQgPSBuZXcgbG9uZ1tdIHsgMTIzLCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDIzKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRTZml4ZWQ2NFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkU2ZpeGVkNjRbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZEZsb2F0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRGbG9hdC5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZEZsb2F0ID0gbmV3IGZsb2F0W10geyAxMjNmLCA3ODlmLCA0NTZmIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDc4OWYsIG1zZy5yZXBlYXRlZEZsb2F0WzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2ZiwgbXNnLnJlcGVhdGVkRmxvYXRbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRGbG9hdC5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkRmxvYXQgPSBuZXcgZmxvYXRbXSB7IDQ1NmYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkRmxvYXQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2ZiwgbXNnLnJlcGVhdGVkRmxvYXRbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRGbG9hdC5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRGbG9hdCA9IG5ldyBmbG9hdFtdIHsgMTIzZiB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRGbG9hdC5sZW5ndGgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZEZsb2F0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyM2YsIG5ld01zZy5yZXBlYXRlZEZsb2F0WzBdKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRGbG9hdCA9IG5ldyBmbG9hdFtdIHsgMTIzZiwgNDU2ZiB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRGbG9hdC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTUpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cucmVwZWF0ZWRGbG9hdC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjNmLCBuZXdNc2cucmVwZWF0ZWRGbG9hdFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NmYsIG5ld01zZy5yZXBlYXRlZEZsb2F0WzFdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWREb3VibGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZERvdWJsZS5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZERvdWJsZSA9IG5ldyBkb3VibGVbXSB7IDEyMy4wLCA3ODkuMCwgNDU2LjAgfTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LjAsIG1zZy5yZXBlYXRlZERvdWJsZVsxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1Ni4wLCBtc2cucmVwZWF0ZWREb3VibGVbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWREb3VibGUubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZERvdWJsZSA9IG5ldyBkb3VibGVbXSB7IDQ1Ni4wIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZERvdWJsZS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyg0NTYuMCwgbXNnLnJlcGVhdGVkRG91YmxlWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkRG91YmxlLmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDEgZW50cnkKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZERvdWJsZSA9IG5ldyBkb3VibGVbXSB7IDEyMy4wIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZERvdWJsZS5sZW5ndGgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTMpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWREb3VibGUubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLjAsIG5ld01zZy5yZXBlYXRlZERvdWJsZVswXSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkRG91YmxlID0gbmV3IGRvdWJsZVtdIHsgMTIzLjAsIDQ1Ni4wIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5yZXBlYXRlZERvdWJsZS5sZW5ndGgpOwotICAgIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMjMpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cucmVwZWF0ZWREb3VibGUubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLjAsIG5ld01zZy5yZXBlYXRlZERvdWJsZVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1Ni4wLCBuZXdNc2cucmVwZWF0ZWREb3VibGVbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZEJvb2woKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEJvb2wubGVuZ3RoKTsKLSAgICBtc2cucmVwZWF0ZWRCb29sID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlLCB0cnVlLCBmYWxzZSB9OwotICAgIGFzc2VydFRydWUobXNnLnJlcGVhdGVkQm9vbFsxXSk7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLnJlcGVhdGVkQm9vbFsyXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEJvb2wubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEJvb2wgPSBuZXcgYm9vbGVhbltdIHsgdHJ1ZSB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRCb29sLmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2cucmVwZWF0ZWRCb29sWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkQm9vbC5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRCb29sID0gbmV3IGJvb2xlYW5bXSB7IGZhbHNlIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEJvb2wubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDYpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRCb29sLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RmFsc2UobmV3TXNnLnJlcGVhdGVkQm9vbFswXSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkQm9vbCA9IG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRCb29sLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA5KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkQm9vbC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobmV3TXNnLnJlcGVhdGVkQm9vbFswXSk7Ci0gICAgYXNzZXJ0RmFsc2UobmV3TXNnLnJlcGVhdGVkQm9vbFsxXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcGVhdGVkU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTdHJpbmcubGVuZ3RoKTsKLSAgICBtc2cucmVwZWF0ZWRTdHJpbmcgPSBuZXcgU3RyaW5nW10geyAiaGVsbG8iLCAiYnllIiwgImJvbyIgfTsKLSAgICBhc3NlcnRFcXVhbHMoImJ5ZSIsIG1zZy5yZXBlYXRlZFN0cmluZ1sxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJib28iLCBtc2cucmVwZWF0ZWRTdHJpbmdbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTdHJpbmcubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFN0cmluZyA9IG5ldyBTdHJpbmdbXSB7ICJib28iIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFN0cmluZy5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygiYm9vIiwgbXNnLnJlcGVhdGVkU3RyaW5nWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkU3RyaW5nLmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDEgZW50cnkKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFN0cmluZyA9IG5ldyBTdHJpbmdbXSB7ICIiIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFN0cmluZy5sZW5ndGgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gNik7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZFN0cmluZy5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobmV3TXNnLnJlcGVhdGVkU3RyaW5nWzBdLmlzRW1wdHkoKSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkU3RyaW5nID0gbmV3IFN0cmluZ1tdIHsgImhlbGxvIiwgIndvcmxkIiB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRTdHJpbmcubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDE5KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkU3RyaW5nLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG5ld01zZy5yZXBlYXRlZFN0cmluZ1swXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIG5ld01zZy5yZXBlYXRlZFN0cmluZ1sxXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcGVhdGVkQnl0ZXMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEJ5dGVzLmxlbmd0aCk7Ci0gICAgbXNnLnJlcGVhdGVkQnl0ZXMgPSBuZXcgYnl0ZVtdW10gewotICAgICAgICBJbnRlcm5hbE5hbm8uY29weUZyb21VdGY4KCJoZWxsbyIpLAotICAgICAgICBJbnRlcm5hbE5hbm8uY29weUZyb21VdGY4KCJieWUiKSwKLSAgICAgICAgSW50ZXJuYWxOYW5vLmNvcHlGcm9tVXRmOCgiYm9vIikKLSAgICB9OwotICAgIGFzc2VydEVxdWFscygiYnllIiwgbmV3IFN0cmluZyhtc2cucmVwZWF0ZWRCeXRlc1sxXSwgSW50ZXJuYWxOYW5vLlVURl84KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJib28iLCBuZXcgU3RyaW5nKG1zZy5yZXBlYXRlZEJ5dGVzWzJdLCBJbnRlcm5hbE5hbm8uVVRGXzgpKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkQnl0ZXMubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEJ5dGVzID0gbmV3IGJ5dGVbXVtdIHsgSW50ZXJuYWxOYW5vLmNvcHlGcm9tVXRmOCgiYm9vIikgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkQnl0ZXMubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoImJvbyIsIG5ldyBTdHJpbmcobXNnLnJlcGVhdGVkQnl0ZXNbMF0sIEludGVybmFsTmFuby5VVEZfOCkpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRCeXRlcy5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRCeXRlcyA9IG5ldyBieXRlW11bXSB7IEludGVybmFsTmFuby5jb3B5RnJvbVV0ZjgoIiIpIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEJ5dGVzLmxlbmd0aCk7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkQnl0ZXMubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5yZXBlYXRlZEJ5dGVzWzBdLmxlbmd0aCA9PSAwKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRCeXRlcyA9IG5ldyBieXRlW11bXSB7Ci0gICAgICBJbnRlcm5hbE5hbm8uY29weUZyb21VdGY4KCJoZWxsbyIpLAotICAgICAgSW50ZXJuYWxOYW5vLmNvcHlGcm9tVXRmOCgid29ybGQiKQotICAgIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5yZXBlYXRlZEJ5dGVzLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxOSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5yZXBlYXRlZEJ5dGVzLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG5ldyBTdHJpbmcobmV3TXNnLnJlcGVhdGVkQnl0ZXNbMF0sIEludGVybmFsTmFuby5VVEZfOCkpOwotICAgIGFzc2VydEVxdWFscygid29ybGQiLCBuZXcgU3RyaW5nKG5ld01zZy5yZXBlYXRlZEJ5dGVzWzFdLCBJbnRlcm5hbE5hbm8uVVRGXzgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWRHcm91cCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vLlJlcGVhdGVkR3JvdXAgZ3JvdXAwID0KLSAgICAgIG5ldyBUZXN0QWxsVHlwZXNOYW5vLlJlcGVhdGVkR3JvdXAoKTsKLSAgICBncm91cDAuYSA9IDA7Ci0gICAgVGVzdEFsbFR5cGVzTmFuby5SZXBlYXRlZEdyb3VwIGdyb3VwMSA9Ci0gICAgICBuZXcgVGVzdEFsbFR5cGVzTmFuby5SZXBlYXRlZEdyb3VwKCk7Ci0gICAgZ3JvdXAxLmEgPSAxOwotICAgIFRlc3RBbGxUeXBlc05hbm8uUmVwZWF0ZWRHcm91cCBncm91cDIgPQotICAgICAgbmV3IFRlc3RBbGxUeXBlc05hbm8uUmVwZWF0ZWRHcm91cCgpOwotICAgIGdyb3VwMi5hID0gMjsKLQotICAgIG1zZy5yZXBlYXRlZEdyb3VwID0gbmV3IFRlc3RBbGxUeXBlc05hbm8uUmVwZWF0ZWRHcm91cFtdIHsgZ3JvdXAwLCBncm91cDEsIGdyb3VwMiB9OwotICAgIGFzc2VydEVxdWFscygzLCBtc2cucmVwZWF0ZWRHcm91cC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRHcm91cFswXS5hKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkR3JvdXBbMV0uYSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5yZXBlYXRlZEdyb3VwWzJdLmEpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRHcm91cC5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkR3JvdXAgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5SZXBlYXRlZEdyb3VwW10geyBncm91cDEgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkR3JvdXAubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkR3JvdXBbMF0uYSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEdyb3VwLmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDEgZW50cnkKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEdyb3VwID0gbmV3IFRlc3RBbGxUeXBlc05hbm8uUmVwZWF0ZWRHcm91cFtdIHsgZ3JvdXAwIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEdyb3VwLmxlbmd0aCk7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA3KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkR3JvdXAubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLnJlcGVhdGVkR3JvdXBbMF0uYSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkR3JvdXAgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5SZXBlYXRlZEdyb3VwW10geyBncm91cDAsIGdyb3VwMSB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRHcm91cC5sZW5ndGgpOwotICAgIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTQpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cucmVwZWF0ZWRHcm91cC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygwLCBuZXdNc2cucmVwZWF0ZWRHcm91cFswXS5hKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkR3JvdXBbMV0uYSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcGVhdGVkTmVzdGVkTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTXNnMCA9Ci0gICAgICBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbmVzdGVkTXNnMC5iYiA9IDA7Ci0gICAgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlIG5lc3RlZE1zZzEgPQotICAgICAgbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSgpOwotICAgIG5lc3RlZE1zZzEuYmIgPSAxOwotICAgIFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSBuZXN0ZWRNc2cyID0KLSAgICAgIG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBuZXN0ZWRNc2cyLmJiID0gMjsKLQotICAgIG1zZy5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UgPQotICAgICAgICBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlW10geyBuZXN0ZWRNc2cwLCBuZXN0ZWRNc2cxLCBuZXN0ZWRNc2cyIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1zZy5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXS5iYik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VbMV0uYmIpOwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzJdLmJiKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZS5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2VbXSB7IG5lc3RlZE1zZzEgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzBdLmJiKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZS5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZVtdIHsgbmVzdGVkTXNnMCB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlLmxlbmd0aCk7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygwLCBuZXdNc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzBdLmJiKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZVtdIHsgbmVzdGVkTXNnMCwgbmVzdGVkTXNnMSB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXS5iYik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VbMV0uYmIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZEZvcmVpZ25NZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIE5hbm9PdXRlckNsYXNzLkZvcmVpZ25NZXNzYWdlTmFubyBmb3JlaWduTXNnMCA9Ci0gICAgICBuZXcgTmFub091dGVyQ2xhc3MuRm9yZWlnbk1lc3NhZ2VOYW5vKCk7Ci0gICAgZm9yZWlnbk1zZzAuYyA9IDA7Ci0gICAgTmFub091dGVyQ2xhc3MuRm9yZWlnbk1lc3NhZ2VOYW5vIGZvcmVpZ25Nc2cxID0KLSAgICAgIG5ldyBOYW5vT3V0ZXJDbGFzcy5Gb3JlaWduTWVzc2FnZU5hbm8oKTsKLSAgICBmb3JlaWduTXNnMS5jID0gMTsKLSAgICBOYW5vT3V0ZXJDbGFzcy5Gb3JlaWduTWVzc2FnZU5hbm8gZm9yZWlnbk1zZzIgPQotICAgICAgbmV3IE5hbm9PdXRlckNsYXNzLkZvcmVpZ25NZXNzYWdlTmFubygpOwotICAgIGZvcmVpZ25Nc2cyLmMgPSAyOwotCi0gICAgbXNnLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UgPQotICAgICAgICBuZXcgTmFub091dGVyQ2xhc3MuRm9yZWlnbk1lc3NhZ2VOYW5vW10geyBmb3JlaWduTXNnMCwgZm9yZWlnbk1zZzEsIGZvcmVpZ25Nc2cyIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1zZy5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlWzBdLmMpOwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRGb3JlaWduTWVzc2FnZVsxXS5jKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VbMl0uYyk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlLmxlbmd0aCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRGb3JlaWduTWVzc2FnZSA9IG5ldyBOYW5vT3V0ZXJDbGFzcy5Gb3JlaWduTWVzc2FnZU5hbm9bXSB7IGZvcmVpZ25Nc2cxIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlWzBdLmMpOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRGb3JlaWduTWVzc2FnZS5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRGb3JlaWduTWVzc2FnZSA9IG5ldyBOYW5vT3V0ZXJDbGFzcy5Gb3JlaWduTWVzc2FnZU5hbm9bXSB7IGZvcmVpZ25Nc2cwIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlLmxlbmd0aCk7Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VbMF0uYyk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UgPSBuZXcgTmFub091dGVyQ2xhc3MuRm9yZWlnbk1lc3NhZ2VOYW5vW10geyBmb3JlaWduTXNnMCwgZm9yZWlnbk1zZzEgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDExKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VbMF0uYyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlWzFdLmMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZEltcG9ydE1lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgVW5pdHRlc3RJbXBvcnROYW5vLkltcG9ydE1lc3NhZ2VOYW5vIGZvcmVpZ25Nc2cwID0KLSAgICAgIG5ldyBVbml0dGVzdEltcG9ydE5hbm8uSW1wb3J0TWVzc2FnZU5hbm8oKTsKLSAgICBmb3JlaWduTXNnMC5kID0gMDsKLSAgICBVbml0dGVzdEltcG9ydE5hbm8uSW1wb3J0TWVzc2FnZU5hbm8gZm9yZWlnbk1zZzEgPQotICAgICAgbmV3IFVuaXR0ZXN0SW1wb3J0TmFuby5JbXBvcnRNZXNzYWdlTmFubygpOwotICAgIGZvcmVpZ25Nc2cxLmQgPSAxOwotICAgIFVuaXR0ZXN0SW1wb3J0TmFuby5JbXBvcnRNZXNzYWdlTmFubyBmb3JlaWduTXNnMiA9Ci0gICAgICBuZXcgVW5pdHRlc3RJbXBvcnROYW5vLkltcG9ydE1lc3NhZ2VOYW5vKCk7Ci0gICAgZm9yZWlnbk1zZzIuZCA9IDI7Ci0KLSAgICBtc2cucmVwZWF0ZWRJbXBvcnRNZXNzYWdlID0KLSAgICAgICAgbmV3IFVuaXR0ZXN0SW1wb3J0TmFuby5JbXBvcnRNZXNzYWdlTmFub1tdIHsgZm9yZWlnbk1zZzAsIGZvcmVpZ25Nc2cxLCBmb3JlaWduTXNnMiB9OwotICAgIGFzc2VydEVxdWFscygzLCBtc2cucmVwZWF0ZWRJbXBvcnRNZXNzYWdlLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2VbMF0uZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2VbMV0uZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2VbMl0uZCk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEltcG9ydE1lc3NhZ2UgPSBuZXcgVW5pdHRlc3RJbXBvcnROYW5vLkltcG9ydE1lc3NhZ2VOYW5vW10geyBmb3JlaWduTXNnMSB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRJbXBvcnRNZXNzYWdlLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2VbMF0uZCk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2UubGVuZ3RoKTsKLQotICAgIC8vIFRlc3QgMSBlbnRyeQotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkSW1wb3J0TWVzc2FnZSA9IG5ldyBVbml0dGVzdEltcG9ydE5hbm8uSW1wb3J0TWVzc2FnZU5hbm9bXSB7IGZvcmVpZ25Nc2cwIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDYpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRJbXBvcnRNZXNzYWdlLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG5ld01zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2VbMF0uZCk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkSW1wb3J0TWVzc2FnZSA9IG5ldyBVbml0dGVzdEltcG9ydE5hbm8uSW1wb3J0TWVzc2FnZU5hbm9bXSB7IGZvcmVpZ25Nc2cwLCBmb3JlaWduTXNnMSB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRJbXBvcnRNZXNzYWdlLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5yZXBlYXRlZEltcG9ydE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLnJlcGVhdGVkSW1wb3J0TWVzc2FnZVswXS5kKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkSW1wb3J0TWVzc2FnZVsxXS5kKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWROZXN0ZWRFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5yZXBlYXRlZE5lc3RlZEVudW0gPSBuZXcgaW50W10gewotICAgICAgICBUZXN0QWxsVHlwZXNOYW5vLkZPTywKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5CQVIsCi0gICAgICAgIFRlc3RBbGxUeXBlc05hbm8uQkFaCi0gICAgfTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbXNnLnJlcGVhdGVkTmVzdGVkRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkZPTywgbXNnLnJlcGVhdGVkTmVzdGVkRW51bVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uQkFSLCBtc2cucmVwZWF0ZWROZXN0ZWRFbnVtWzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVosIG1zZy5yZXBlYXRlZE5lc3RlZEVudW1bMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWROZXN0ZWRFbnVtLmxlbmd0aCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWROZXN0ZWRFbnVtID0gbmV3IGludFtdIHsgVGVzdEFsbFR5cGVzTmFuby5CQVIgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkTmVzdGVkRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkJBUiwgbXNnLnJlcGVhdGVkTmVzdGVkRW51bVswXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZE5lc3RlZEVudW0ubGVuZ3RoKTsKLQotICAgIC8vIFRlc3QgMSBlbnRyeQotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7IFRlc3RBbGxUeXBlc05hbm8uRk9PIH07Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkTmVzdGVkRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkZPTywgbXNnLnJlcGVhdGVkTmVzdGVkRW51bVswXSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7IFRlc3RBbGxUeXBlc05hbm8uRk9PLCBUZXN0QWxsVHlwZXNOYW5vLkJBUiB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWROZXN0ZWRFbnVtLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA5KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkTmVzdGVkRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkZPTywgbXNnLnJlcGVhdGVkTmVzdGVkRW51bVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uQkFSLCBtc2cucmVwZWF0ZWROZXN0ZWRFbnVtWzFdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWRGb3JlaWduRW51bSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cucmVwZWF0ZWRGb3JlaWduRW51bSA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19GT08sCi0gICAgICAgIE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVIsCi0gICAgICAgIE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVoKLSAgICB9OwotICAgIGFzc2VydEVxdWFscygzLCBtc2cucmVwZWF0ZWRGb3JlaWduRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhOYW5vT3V0ZXJDbGFzcy5GT1JFSUdOX05BTk9fRk9PLCBtc2cucmVwZWF0ZWRGb3JlaWduRW51bVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVIsIG1zZy5yZXBlYXRlZEZvcmVpZ25FbnVtWzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoTmFub091dGVyQ2xhc3MuRk9SRUlHTl9OQU5PX0JBWiwgbXNnLnJlcGVhdGVkRm9yZWlnbkVudW1bMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRGb3JlaWduRW51bS5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkRm9yZWlnbkVudW0gPSBuZXcgaW50W10geyBOYW5vT3V0ZXJDbGFzcy5GT1JFSUdOX05BTk9fQkFSIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZEZvcmVpZ25FbnVtLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVIsIG1zZy5yZXBlYXRlZEZvcmVpZ25FbnVtWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkRm9yZWlnbkVudW0ubGVuZ3RoKTsKLQotICAgIC8vIFRlc3QgMSBlbnRyeQotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkRm9yZWlnbkVudW0gPSBuZXcgaW50W10geyBOYW5vT3V0ZXJDbGFzcy5GT1JFSUdOX05BTk9fRk9PIH07Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkRm9yZWlnbkVudW0ubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoTmFub091dGVyQ2xhc3MuRk9SRUlHTl9OQU5PX0ZPTywgbXNnLnJlcGVhdGVkRm9yZWlnbkVudW1bMF0pOwotCi0gICAgLy8gVGVzdCAyIGVudHJpZXMKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEZvcmVpZ25FbnVtID0gbmV3IGludFtdIHsKLSAgICAgIE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19GT08sCi0gICAgICBOYW5vT3V0ZXJDbGFzcy5GT1JFSUdOX05BTk9fQkFSCi0gICAgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkRm9yZWlnbkVudW0ubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDkpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cucmVwZWF0ZWRGb3JlaWduRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhOYW5vT3V0ZXJDbGFzcy5GT1JFSUdOX05BTk9fRk9PLCBtc2cucmVwZWF0ZWRGb3JlaWduRW51bVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKE5hbm9PdXRlckNsYXNzLkZPUkVJR05fTkFOT19CQVIsIG1zZy5yZXBlYXRlZEZvcmVpZ25FbnVtWzFdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWRJbXBvcnRFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5yZXBlYXRlZEltcG9ydEVudW0gPSBuZXcgaW50W10gewotICAgICAgICBVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fRk9PLAotICAgICAgICBVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fQkFSLAotICAgICAgICBVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fQkFaCi0gICAgfTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbXNnLnJlcGVhdGVkSW1wb3J0RW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fRk9PLCBtc2cucmVwZWF0ZWRJbXBvcnRFbnVtWzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0JBUiwgbXNnLnJlcGVhdGVkSW1wb3J0RW51bVsxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0TmFuby5JTVBPUlRfTkFOT19CQVosIG1zZy5yZXBlYXRlZEltcG9ydEVudW1bMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRJbXBvcnRFbnVtLmxlbmd0aCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRJbXBvcnRFbnVtID0gbmV3IGludFtdIHsgVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0JBUiB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRJbXBvcnRFbnVtLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0TmFuby5JTVBPUlRfTkFOT19CQVIsIG1zZy5yZXBlYXRlZEltcG9ydEVudW1bMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRJbXBvcnRFbnVtLmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDEgZW50cnkKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZEltcG9ydEVudW0gPSBuZXcgaW50W10geyBVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fRk9PIH07Ci0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA2KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkSW1wb3J0RW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fRk9PLCBtc2cucmVwZWF0ZWRJbXBvcnRFbnVtWzBdKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRJbXBvcnRFbnVtID0gbmV3IGludFtdIHsKLSAgICAgIFVuaXR0ZXN0SW1wb3J0TmFuby5JTVBPUlRfTkFOT19GT08sCi0gICAgICBVbml0dGVzdEltcG9ydE5hbm8uSU1QT1JUX05BTk9fQkFSCi0gICAgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkSW1wb3J0RW51bS5sZW5ndGgpOwotICAgIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gOSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5yZXBlYXRlZEltcG9ydEVudW0ubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0ZPTywgbXNnLnJlcGVhdGVkSW1wb3J0RW51bVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0TmFuby5JTVBPUlRfTkFOT19CQVIsIG1zZy5yZXBlYXRlZEltcG9ydEVudW1bMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZFN0cmluZ1BpZWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRTdHJpbmdQaWVjZS5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZFN0cmluZ1BpZWNlID0gbmV3IFN0cmluZ1tdIHsgImhlbGxvIiwgImJ5ZSIsICJib28iIH07Ci0gICAgYXNzZXJ0RXF1YWxzKCJieWUiLCBtc2cucmVwZWF0ZWRTdHJpbmdQaWVjZVsxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJib28iLCBtc2cucmVwZWF0ZWRTdHJpbmdQaWVjZVsyXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFN0cmluZ1BpZWNlLmxlbmd0aCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRTdHJpbmdQaWVjZSA9IG5ldyBTdHJpbmdbXSB7ICJib28iIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFN0cmluZ1BpZWNlLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJib28iLCBtc2cucmVwZWF0ZWRTdHJpbmdQaWVjZVswXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFN0cmluZ1BpZWNlLmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDEgZW50cnkKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFN0cmluZ1BpZWNlID0gbmV3IFN0cmluZ1tdIHsgIiIgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkU3RyaW5nUGllY2UubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDYpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRTdHJpbmdQaWVjZS5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobmV3TXNnLnJlcGVhdGVkU3RyaW5nUGllY2VbMF0uaXNFbXB0eSgpKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRTdHJpbmdQaWVjZSA9IG5ldyBTdHJpbmdbXSB7ICJoZWxsbyIsICJ3b3JsZCIgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkU3RyaW5nUGllY2UubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDE5KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkU3RyaW5nUGllY2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbmV3TXNnLnJlcGVhdGVkU3RyaW5nUGllY2VbMF0pOwotICAgIGFzc2VydEVxdWFscygid29ybGQiLCBuZXdNc2cucmVwZWF0ZWRTdHJpbmdQaWVjZVsxXSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1JlcGVhdGVkQ29yZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkQ29yZC5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZENvcmQgPSBuZXcgU3RyaW5nW10geyAiaGVsbG8iLCAiYnllIiwgImJvbyIgfTsKLSAgICBhc3NlcnRFcXVhbHMoImJ5ZSIsIG1zZy5yZXBlYXRlZENvcmRbMV0pOwotICAgIGFzc2VydEVxdWFscygiYm9vIiwgbXNnLnJlcGVhdGVkQ29yZFsyXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZENvcmQubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZENvcmQgPSBuZXcgU3RyaW5nW10geyAiYm9vIiB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRDb3JkLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJib28iLCBtc2cucmVwZWF0ZWRDb3JkWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkQ29yZC5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRDb3JkID0gbmV3IFN0cmluZ1tdIHsgIiIgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkQ29yZC5sZW5ndGgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gNik7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5ld01zZy5yZXBlYXRlZENvcmQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5yZXBlYXRlZENvcmRbMF0uaXNFbXB0eSgpKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRDb3JkID0gbmV3IFN0cmluZ1tdIHsgImhlbGxvIiwgIndvcmxkIiB9OwotICAgIGFzc2VydEVxdWFscygyLCBtc2cucmVwZWF0ZWRDb3JkLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSAxOSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm8ucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5yZXBlYXRlZENvcmQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbmV3TXNnLnJlcGVhdGVkQ29yZFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIG5ld01zZy5yZXBlYXRlZENvcmRbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZFBhY2tlZEludDMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRQYWNrZWRJbnQzMi5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZFBhY2tlZEludDMyID0gbmV3IGludFtdIHsgMTIzLCA3ODksIDQ1NiB9OwotICAgIGFzc2VydEVxdWFscyg3ODksIG1zZy5yZXBlYXRlZFBhY2tlZEludDMyWzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoNDU2LCBtc2cucmVwZWF0ZWRQYWNrZWRJbnQzMlsyXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFBhY2tlZEludDMyLmxlbmd0aCk7Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRQYWNrZWRJbnQzMiA9IG5ldyBpbnRbXSB7IDQ1NiB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRQYWNrZWRJbnQzMi5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG1zZy5yZXBlYXRlZFBhY2tlZEludDMyWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkUGFja2VkSW50MzIubGVuZ3RoKTsKLQotICAgIC8vIFRlc3QgMSBlbnRyeQotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkUGFja2VkSW50MzIgPSBuZXcgaW50W10geyAxMjMgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkUGFja2VkSW50MzIubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDcpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRQYWNrZWRJbnQzMi5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG5ld01zZy5yZXBlYXRlZFBhY2tlZEludDMyWzBdKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRQYWNrZWRJbnQzMiA9IG5ldyBpbnRbXSB7IDEyMywgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5yZXBlYXRlZFBhY2tlZEludDMyLmxlbmd0aCk7Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA9PSA5KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkUGFja2VkSW50MzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRQYWNrZWRJbnQzMlswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkUGFja2VkSW50MzJbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZFBhY2tlZFNmaXhlZDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NC5sZW5ndGgpOwotICAgIG1zZy5yZXBlYXRlZFBhY2tlZFNmaXhlZDY0ID0gbmV3IGxvbmdbXSB7IDEyMywgNzg5LCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LCBtc2cucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NFsxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjRbMl0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NC5sZW5ndGgpOwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjQgPSBuZXcgbG9uZ1tdIHsgNDU2IH07Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1zZy5yZXBlYXRlZFBhY2tlZFNmaXhlZDY0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbXNnLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjRbMF0pOwotICAgIG1zZy5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygwLCBtc2cucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NC5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NCA9IG5ldyBsb25nW10geyAxMjMgfTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbXNnLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDE0KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbmV3TXNnLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NFswXSk7Ci0KLSAgICAvLyBUZXN0IDIgZW50cmllcwotICAgIG1zZy5jbGVhcigpCi0gICAgICAgLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjQgPSBuZXcgbG9uZ1tdIHsgMTIzLCA0NTYgfTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbXNnLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDIyKTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbmV3TXNnLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBuZXdNc2cucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQ1NiwgbmV3TXNnLnJlcGVhdGVkUGFja2VkU2ZpeGVkNjRbMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZFBhY2tlZE5lc3RlZEVudW0oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLnJlcGVhdGVkUGFja2VkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIFRlc3RBbGxUeXBlc05hbm8uRk9PLAotICAgICAgICBUZXN0QWxsVHlwZXNOYW5vLkJBUiwKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5CQVoKLSAgICB9OwotICAgIGFzc2VydEVxdWFscygzLCBtc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uRk9PLCBtc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtWzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVIsIG1zZy5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW1bMV0pOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkJBWiwgbXNnLnJlcGVhdGVkUGFja2VkTmVzdGVkRW51bVsyXSk7Ci0gICAgbXNnLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1zZy5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW0ubGVuZ3RoKTsKLSAgICBtc2cuY2xlYXIoKQotICAgICAgIC5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW0gPSBuZXcgaW50W10geyBUZXN0QWxsVHlwZXNOYW5vLkJBUiB9OwotICAgIGFzc2VydEVxdWFscygxLCBtc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uQkFSLCBtc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtWzBdKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkUGFja2VkTmVzdGVkRW51bS5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxIGVudHJ5Ci0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtID0gbmV3IGludFtdIHsgVGVzdEFsbFR5cGVzTmFuby5GT08gfTsKLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDcpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygxLCBuZXdNc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uRk9PLCBtc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtWzBdKTsKLQotICAgIC8vIFRlc3QgMiBlbnRyaWVzCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtID0gbmV3IGludFtdIHsgVGVzdEFsbFR5cGVzTmFuby5GT08sIFRlc3RBbGxUeXBlc05hbm8uQkFSIH07Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1zZy5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW0ubGVuZ3RoKTsKLSAgICByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDgpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uRk9PLCBtc2cucmVwZWF0ZWRQYWNrZWROZXN0ZWRFbnVtWzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVIsIG1zZy5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW1bMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZFBhY2tlZFNlcmlhbGl6ZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5yZXBlYXRlZFBhY2tlZEludDMyID0gbmV3IGludFtdIHsgMTIzLCA3ODksIDQ1NiB9OwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTEpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cyID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cyLnJlcGVhdGVkUGFja2VkSW50MzIgPSBuZXcgaW50W10geyAxMjMsIDc4OSwgNDU2IH07Ci0gICAgYnl0ZSBbXSByZXN1bHQyID0gbmV3IGJ5dGVbbXNnU2VyaWFsaXplZFNpemVdOwotICAgIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZzIsIHJlc3VsdDIsIDAsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLQotICAgIC8vIENoZWNrIGVxdWFsIHNpemUgYW5kIGNvbnRlbnQuCi0gICAgYXNzZXJ0RXF1YWxzKG1zZ1NlcmlhbGl6ZWRTaXplLCBtc2cyLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhyZXN1bHQsIHJlc3VsdDIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWRJbnQzMlJlTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLnJlcGVhdGVkSW50MzIgPSBuZXcgaW50W10geyAyMzQgfTsKLSAgICBieXRlIFtdIHJlc3VsdDEgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotCi0gICAgbXNnLmNsZWFyKCkub3B0aW9uYWxJbnQzMiA9IDc4OTsKLSAgICBieXRlIFtdIHJlc3VsdDIgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotCi0gICAgbXNnLmNsZWFyKCkucmVwZWF0ZWRJbnQzMiA9IG5ldyBpbnRbXSB7IDEyMywgNDU2IH07Ci0gICAgYnl0ZSBbXSByZXN1bHQzID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLQotICAgIC8vIENvbmNhdGVuYXRlIHRoZSB0aHJlZSBzZXJpYWxpemF0aW9ucyBhbmQgcmVhZCBhcyBvbmUgbWVzc2FnZS4KLSAgICBieXRlIFtdIHJlc3VsdCA9IG5ldyBieXRlW3Jlc3VsdDEubGVuZ3RoICsgcmVzdWx0Mi5sZW5ndGggKyByZXN1bHQzLmxlbmd0aF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQxLCAwLCByZXN1bHQsIDAsIHJlc3VsdDEubGVuZ3RoKTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdDIsIDAsIHJlc3VsdCwgcmVzdWx0MS5sZW5ndGgsIHJlc3VsdDIubGVuZ3RoKTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdDMsIDAsIHJlc3VsdCwgcmVzdWx0MS5sZW5ndGggKyByZXN1bHQyLmxlbmd0aCwgcmVzdWx0My5sZW5ndGgpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscyg3ODksIG5ld01zZy5vcHRpb25hbEludDMyKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbmV3TXNnLnJlcGVhdGVkSW50MzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMjM0LCBuZXdNc2cucmVwZWF0ZWRJbnQzMlswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLnJlcGVhdGVkSW50MzJbMV0pOwotICAgIGFzc2VydEVxdWFscyg0NTYsIG5ld01zZy5yZXBlYXRlZEludDMyWzJdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vUmVwZWF0ZWROZXN0ZWRFbnVtUmVNZXJnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtc2cucmVwZWF0ZWROZXN0ZWRFbnVtID0gbmV3IGludFtdIHsgVGVzdEFsbFR5cGVzTmFuby5GT08gfTsKLSAgICBieXRlIFtdIHJlc3VsdDEgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotCi0gICAgbXNnLmNsZWFyKCkub3B0aW9uYWxJbnQzMiA9IDc4OTsKLSAgICBieXRlIFtdIHJlc3VsdDIgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotCi0gICAgbXNnLmNsZWFyKCkucmVwZWF0ZWROZXN0ZWRFbnVtID0gbmV3IGludFtdIHsgVGVzdEFsbFR5cGVzTmFuby5CQVIsIFRlc3RBbGxUeXBlc05hbm8uRk9PIH07Ci0gICAgYnl0ZSBbXSByZXN1bHQzID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLQotICAgIC8vIENvbmNhdGVuYXRlIHRoZSB0aHJlZSBzZXJpYWxpemF0aW9ucyBhbmQgcmVhZCBhcyBvbmUgbWVzc2FnZS4KLSAgICBieXRlIFtdIHJlc3VsdCA9IG5ldyBieXRlW3Jlc3VsdDEubGVuZ3RoICsgcmVzdWx0Mi5sZW5ndGggKyByZXN1bHQzLmxlbmd0aF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQxLCAwLCByZXN1bHQsIDAsIHJlc3VsdDEubGVuZ3RoKTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdDIsIDAsIHJlc3VsdCwgcmVzdWx0MS5sZW5ndGgsIHJlc3VsdDIubGVuZ3RoKTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KHJlc3VsdDMsIDAsIHJlc3VsdCwgcmVzdWx0MS5sZW5ndGggKyByZXN1bHQyLmxlbmd0aCwgcmVzdWx0My5sZW5ndGgpOwotCi0gICAgVGVzdEFsbFR5cGVzTmFubyBuZXdNc2cgPSBUZXN0QWxsVHlwZXNOYW5vLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydEVxdWFscyg3ODksIG5ld01zZy5vcHRpb25hbEludDMyKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbmV3TXNnLnJlcGVhdGVkTmVzdGVkRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkZPTywgbmV3TXNnLnJlcGVhdGVkTmVzdGVkRW51bVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uQkFSLCBuZXdNc2cucmVwZWF0ZWROZXN0ZWRFbnVtWzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5GT08sIG5ld01zZy5yZXBlYXRlZE5lc3RlZEVudW1bMl0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9SZXBlYXRlZE5lc3RlZE1lc3NhZ2VSZU1lcmdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSBuZXN0ZWRNc2cwID0KLSAgICAgIG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBuZXN0ZWRNc2cwLmJiID0gMDsKLSAgICBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTXNnMSA9Ci0gICAgICBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbmVzdGVkTXNnMS5iYiA9IDE7Ci0gICAgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlIG5lc3RlZE1zZzIgPQotICAgICAgbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSgpOwotICAgIG5lc3RlZE1zZzIuYmIgPSAyOwotCi0gICAgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2VbXSB7IG5lc3RlZE1zZzAgfTsKLSAgICBieXRlIFtdIHJlc3VsdDEgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotCi0gICAgbXNnLmNsZWFyKCkub3B0aW9uYWxJbnQzMiA9IDc4OTsKLSAgICBieXRlIFtdIHJlc3VsdDIgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotCi0gICAgbXNnLmNsZWFyKCkucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0KLSAgICAgICAgbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZVtdIHsgbmVzdGVkTXNnMSwgbmVzdGVkTXNnMiB9OwotICAgIGJ5dGUgW10gcmVzdWx0MyA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0KLSAgICAvLyBDb25jYXRlbmF0ZSB0aGUgdGhyZWUgc2VyaWFsaXphdGlvbnMgYW5kIHJlYWQgYXMgb25lIG1lc3NhZ2UuCi0gICAgYnl0ZSBbXSByZXN1bHQgPSBuZXcgYnl0ZVtyZXN1bHQxLmxlbmd0aCArIHJlc3VsdDIubGVuZ3RoICsgcmVzdWx0My5sZW5ndGhdOwotICAgIFN5c3RlbS5hcnJheWNvcHkocmVzdWx0MSwgMCwgcmVzdWx0LCAwLCByZXN1bHQxLmxlbmd0aCk7Ci0gICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQyLCAwLCByZXN1bHQsIHJlc3VsdDEubGVuZ3RoLCByZXN1bHQyLmxlbmd0aCk7Ci0gICAgU3lzdGVtLmFycmF5Y29weShyZXN1bHQzLCAwLCByZXN1bHQsIHJlc3VsdDEubGVuZ3RoICsgcmVzdWx0Mi5sZW5ndGgsIHJlc3VsdDMubGVuZ3RoKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFuby5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRFcXVhbHMoNzg5LCBuZXdNc2cub3B0aW9uYWxJbnQzMik7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG5ld01zZy5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMobmVzdGVkTXNnMC5iYiwgbmV3TXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXS5iYik7Ci0gICAgYXNzZXJ0RXF1YWxzKG5lc3RlZE1zZzEuYmIsIG5ld01zZy5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VbMV0uYmIpOwotICAgIGFzc2VydEVxdWFscyhuZXN0ZWRNc2cyLmJiLCBuZXdNc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzJdLmJiKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0aGF0IGludmFsaWQgZW51bSB2YWx1ZXMgZnJvbSB0aGUgd2lyZSBhcmUgbm90IGFjY2VwdGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9FbnVtVmFsaWRpdHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgaW52YWxpZCA9IDEyMDsKLSAgICBmaW5hbCBpbnQgYWxzb0ludmFsaWQgPSAxMjE7Ci0KLSAgICBFbnVtVmFsaWRpdHkuTSBtID0gbmV3IEVudW1WYWxpZGl0eS5NKCk7Ci0gICAgLy8gU2FuaXR5IGNoZWNrICYgYmFzZWxpbmUgb2YgdGhlIGFzc2VydGlvbnMgZm9yIHRoZSBmaXJzdCBjYXNlIGJlbG93LgotICAgIGFzc2VydEVxdWFscyhFbnVtVmFsaWRpdHkuRS5kZWZhdWx0XywgbS5vcHRpb25hbEUpOwotICAgIGFzc2VydEVxdWFscyhFbnVtVmFsaWRpdHkuRS5CQVosIG0uZGVmYXVsdEUpOwotCi0gICAgbS5vcHRpb25hbEUgPSBpbnZhbGlkOwotICAgIG0uZGVmYXVsdEUgPSBpbnZhbGlkOwotICAgIC8vIEUgY29udGFpbnMgYWxsIHZhbGlkIHZhbHVlcwotICAgIG0ucmVwZWF0ZWRFID0gbmV3IGludFtdIHtFbnVtVmFsaWRpdHkuRS5GT08sIEVudW1WYWxpZGl0eS5FLkJBUn07Ci0gICAgbS5wYWNrZWRFID0gbmV3IGludFtdIHtFbnVtVmFsaWRpdHkuRS5GT08sIEVudW1WYWxpZGl0eS5FLkJBWn07Ci0gICAgLy8gRTIgY29udGFpbnMgc29tZSBpbnZhbGlkIHZhbHVlcwotICAgIG0ucmVwZWF0ZWRFMiA9IG5ldyBpbnRbXSB7aW52YWxpZCwgRW51bVZhbGlkaXR5LkUuQkFSLCBhbHNvSW52YWxpZH07Ci0gICAgbS5wYWNrZWRFMiA9IG5ldyBpbnRbXSB7RW51bVZhbGlkaXR5LkUuRk9PLCBpbnZhbGlkLCBhbHNvSW52YWxpZH07Ci0gICAgLy8gRTMgY29udGFpbnMgYWxsIGludmFsaWQgdmFsdWVzCi0gICAgbS5yZXBlYXRlZEUzID0gbmV3IGludFtdIHtpbnZhbGlkLCBpbnZhbGlkfTsKLSAgICBtLnBhY2tlZEUzID0gbmV3IGludFtdIHthbHNvSW52YWxpZCwgYWxzb0ludmFsaWR9OwotICAgIGJ5dGVbXSBzZXJpYWxpemVkID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobSk7Ci0gICAgLy8gU2FuaXR5IGNoZWNrIHRoYXQgd2UgZG8gaGF2ZSBhbGwgZGF0YSBpbiB0aGUgYnl0ZSBhcnJheS4KLSAgICBhc3NlcnRFcXVhbHMoMzEsIHNlcmlhbGl6ZWQubGVuZ3RoKTsKLQotICAgIC8vIFRlc3QgMTogdGVzdHMgdGhhdCBpbnZhbGlkIHZhbHVlcyBhcmVuJ3QgaW5jbHVkZWQgaW4gdGhlIGRlc2VyaWFsaXplZCBtZXNzYWdlLgotICAgIEVudW1WYWxpZGl0eS5NIGRlc2VyaWFsaXplZCA9IE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShuZXcgRW51bVZhbGlkaXR5Lk0oKSwgc2VyaWFsaXplZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKEVudW1WYWxpZGl0eS5FLmRlZmF1bHRfLCBkZXNlcmlhbGl6ZWQub3B0aW9uYWxFKTsKLSAgICBhc3NlcnRFcXVhbHMoRW51bVZhbGlkaXR5LkUuQkFaLCBkZXNlcmlhbGl6ZWQuZGVmYXVsdEUpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgbmV3IGludFtdIHtFbnVtVmFsaWRpdHkuRS5GT08sIEVudW1WYWxpZGl0eS5FLkJBUn0sIGRlc2VyaWFsaXplZC5yZXBlYXRlZEUpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgIG5ldyBpbnRbXSB7RW51bVZhbGlkaXR5LkUuRk9PLCBFbnVtVmFsaWRpdHkuRS5CQVp9LCBkZXNlcmlhbGl6ZWQucGFja2VkRSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgbmV3IGludFtdIHtFbnVtVmFsaWRpdHkuRS5CQVJ9LCBkZXNlcmlhbGl6ZWQucmVwZWF0ZWRFMikpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscygKLSAgICAgICAgbmV3IGludFtdIHtFbnVtVmFsaWRpdHkuRS5GT099LCBkZXNlcmlhbGl6ZWQucGFja2VkRTIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZGVzZXJpYWxpemVkLnJlcGVhdGVkRTMubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgZGVzZXJpYWxpemVkLnBhY2tlZEUzLmxlbmd0aCk7Ci0KLSAgICAvLyBUZXN0IDI6IHRlc3RzIHRoYXQgaW52YWxpZCB2YWx1ZXMgZG8gbm90IG92ZXJyaWRlIHByZXZpb3VzIHZhbHVlcyBpbiB0aGUgZmllbGQsIGluY2x1ZGluZwotICAgIC8vIGFycmF5cywgaW5jbHVkaW5nIHByZS1leGlzdGluZyBpbnZhbGlkIHZhbHVlcy4KLSAgICBkZXNlcmlhbGl6ZWQub3B0aW9uYWxFID0gRW51bVZhbGlkaXR5LkUuQkFSOwotICAgIGRlc2VyaWFsaXplZC5kZWZhdWx0RSA9IGFsc29JbnZhbGlkOwotICAgIGRlc2VyaWFsaXplZC5yZXBlYXRlZEUgPSBuZXcgaW50W10ge0VudW1WYWxpZGl0eS5FLkJBWn07Ci0gICAgZGVzZXJpYWxpemVkLnBhY2tlZEUgPSBuZXcgaW50W10ge0VudW1WYWxpZGl0eS5FLkJBWiwgYWxzb0ludmFsaWR9OwotICAgIGRlc2VyaWFsaXplZC5yZXBlYXRlZEUyID0gbmV3IGludFtdIHtpbnZhbGlkLCBhbHNvSW52YWxpZH07Ci0gICAgZGVzZXJpYWxpemVkLnBhY2tlZEUyID0gbnVsbDsKLSAgICBkZXNlcmlhbGl6ZWQucmVwZWF0ZWRFMyA9IG51bGw7Ci0gICAgZGVzZXJpYWxpemVkLnBhY2tlZEUzID0gbmV3IGludFswXTsKLSAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20oZGVzZXJpYWxpemVkLCBzZXJpYWxpemVkKTsKLSAgICBhc3NlcnRFcXVhbHMoRW51bVZhbGlkaXR5LkUuQkFSLCBkZXNlcmlhbGl6ZWQub3B0aW9uYWxFKTsKLSAgICBhc3NlcnRFcXVhbHMoYWxzb0ludmFsaWQsIGRlc2VyaWFsaXplZC5kZWZhdWx0RSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICBuZXcgaW50W10ge0VudW1WYWxpZGl0eS5FLkJBWiwgLyogKyAqLyBFbnVtVmFsaWRpdHkuRS5GT08sIEVudW1WYWxpZGl0eS5FLkJBUn0sCi0gICAgICAgIGRlc2VyaWFsaXplZC5yZXBlYXRlZEUpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoCi0gICAgICAgIG5ldyBpbnRbXSB7RW51bVZhbGlkaXR5LkUuQkFaLCBhbHNvSW52YWxpZCwgLyogKyAqLyBFbnVtVmFsaWRpdHkuRS5GT08sIEVudW1WYWxpZGl0eS5FLkJBWn0sCi0gICAgICAgIGRlc2VyaWFsaXplZC5wYWNrZWRFKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICBuZXcgaW50W10ge2ludmFsaWQsIGFsc29JbnZhbGlkLCAvKiArICovIEVudW1WYWxpZGl0eS5FLkJBUn0sCi0gICAgICAgIGRlc2VyaWFsaXplZC5yZXBlYXRlZEUyKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKAotICAgICAgICBuZXcgaW50W10gey8qIDxudWxsPiArICovIEVudW1WYWxpZGl0eS5FLkZPT30sCi0gICAgICAgIGRlc2VyaWFsaXplZC5wYWNrZWRFMikpOwotICAgIGFzc2VydE51bGwoZGVzZXJpYWxpemVkLnJlcGVhdGVkRTMpOyAvLyBudWxsICsgYWxsIGludmFsaWQgPT0gbnVsbAotICAgIGFzc2VydEVxdWFscygwLCBkZXNlcmlhbGl6ZWQucGFja2VkRTMubGVuZ3RoKTsgLy8gZW1wdHkgKyBhbGwgaW52YWxpZCA9PSBlbXB0eQotCi0gICAgLy8gVGVzdCAzOiByZWFkaW5nIGJ5IGFsdGVybmF0aXZlIGZvcm1zCi0gICAgRW51bVZhbGlkaXR5LkFsdCBhbHQgPSBNZXNzYWdlTmFuby5tZXJnZUZyb20obmV3IEVudW1WYWxpZGl0eS5BbHQoKSwgc2VyaWFsaXplZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKEVudW1WYWxpZGl0eS5FLkJBUiwgLy8gbGFzdCB2YWxpZCB2YWx1ZSBpbiBtLnJlcGVhdGVkRTIKLSAgICAgICAgYWx0LnJlcGVhdGVkRTJBc09wdGlvbmFsKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHtFbnVtVmFsaWRpdHkuRS5GT099LCBhbHQucGFja2VkRTJBc05vblBhY2tlZCkpOwotICAgIGFzc2VydEVxdWFscygwLCBhbHQubm9uUGFja2VkRTNBc1BhY2tlZC5sZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoZSBzYW1lIGFzIHtAbGluayAjdGVzdE5hbm9FbnVtVmFsaWRpdHkoKX0gd2l0aCBhY2Nlc3NvciBzdHlsZS4gUmVwZWF0ZWQgZmllbGRzIGFyZQotICAgKiBub3QgcmUtdGVzdGVkIGhlcmUgYmVjYXVzZSB0aGV5IGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhlIGFjY2Vzc29yIHN0eWxlLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9FbnVtVmFsaWRpdHlBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgaW52YWxpZCA9IDEyMDsKLSAgICBmaW5hbCBpbnQgYWxzb0ludmFsaWQgPSAxMjE7Ci0KLSAgICBFbnVtVmFsaWRpdHlBY2Nlc3NvcnMuTSBtID0gbmV3IEVudW1WYWxpZGl0eUFjY2Vzc29ycy5NKCk7Ci0gICAgLy8gU2FuaXR5IGNoZWNrICYgYmFzZWxpbmUgb2YgdGhlIGFzc2VydGlvbnMgZm9yIHRoZSBmaXJzdCBjYXNlIGJlbG93LgotICAgIGFzc2VydEVxdWFscyhFbnVtVmFsaWRpdHlBY2Nlc3NvcnMuZGVmYXVsdF8sIG0uZ2V0T3B0aW9uYWxFKCkpOwotICAgIGFzc2VydEVxdWFscyhFbnVtVmFsaWRpdHlBY2Nlc3NvcnMuQkFaLCBtLmdldERlZmF1bHRFKCkpOwotCi0gICAgbS5zZXRPcHRpb25hbEUoaW52YWxpZCk7Ci0gICAgbS5zZXREZWZhdWx0RShpbnZhbGlkKTsKLSAgICAvLyBTZXQgcmVwZWF0ZWRFMiBmb3IgQWx0LnJlcGVhdGVkRTJBc09wdGlvbmFsCi0gICAgbS5yZXBlYXRlZEUyID0gbmV3IGludFtdIHtpbnZhbGlkLCBFbnVtVmFsaWRpdHlBY2Nlc3NvcnMuQkFSLCBhbHNvSW52YWxpZH07Ci0gICAgYnl0ZVtdIHNlcmlhbGl6ZWQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtKTsKLSAgICAvLyBTYW5pdHkgY2hlY2sgdGhhdCB3ZSBkbyBoYXZlIGFsbCBkYXRhIGluIHRoZSBieXRlIGFycmF5LgotICAgIGFzc2VydEVxdWFscygxMCwgc2VyaWFsaXplZC5sZW5ndGgpOwotCi0gICAgLy8gVGVzdCAxOiB0ZXN0cyB0aGF0IGludmFsaWQgdmFsdWVzIGFyZW4ndCBpbmNsdWRlZCBpbiB0aGUgZGVzZXJpYWxpemVkIG1lc3NhZ2UuCi0gICAgRW51bVZhbGlkaXR5QWNjZXNzb3JzLk0gZGVzZXJpYWxpemVkID0KLSAgICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKG5ldyBFbnVtVmFsaWRpdHlBY2Nlc3NvcnMuTSgpLCBzZXJpYWxpemVkKTsKLSAgICBhc3NlcnRFcXVhbHMoRW51bVZhbGlkaXR5QWNjZXNzb3JzLmRlZmF1bHRfLCBkZXNlcmlhbGl6ZWQuZ2V0T3B0aW9uYWxFKCkpOwotICAgIGFzc2VydEVxdWFscyhFbnVtVmFsaWRpdHlBY2Nlc3NvcnMuQkFaLCBkZXNlcmlhbGl6ZWQuZ2V0RGVmYXVsdEUoKSk7Ci0KLSAgICAvLyBUZXN0IDI6IHRlc3RzIHRoYXQgaW52YWxpZCB2YWx1ZXMgZG8gbm90IG92ZXJyaWRlIHByZXZpb3VzIHZhbHVlcyBpbiB0aGUgZmllbGQsIGluY2x1ZGluZwotICAgIC8vIHByZS1leGlzdGluZyBpbnZhbGlkIHZhbHVlcy4KLSAgICBkZXNlcmlhbGl6ZWQuc2V0T3B0aW9uYWxFKEVudW1WYWxpZGl0eUFjY2Vzc29ycy5CQVIpOwotICAgIGRlc2VyaWFsaXplZC5zZXREZWZhdWx0RShhbHNvSW52YWxpZCk7Ci0gICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKGRlc2VyaWFsaXplZCwgc2VyaWFsaXplZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKEVudW1WYWxpZGl0eUFjY2Vzc29ycy5CQVIsIGRlc2VyaWFsaXplZC5nZXRPcHRpb25hbEUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFsc29JbnZhbGlkLCBkZXNlcmlhbGl6ZWQuZ2V0RGVmYXVsdEUoKSk7Ci0KLSAgICAvLyBUZXN0IDM6IHJlYWRpbmcgYnkgYWx0ZXJuYXRpdmUgZm9ybXMKLSAgICBFbnVtVmFsaWRpdHlBY2Nlc3NvcnMuQWx0IGFsdCA9Ci0gICAgICAgIE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShuZXcgRW51bVZhbGlkaXR5QWNjZXNzb3JzLkFsdCgpLCBzZXJpYWxpemVkKTsKLSAgICBhc3NlcnRFcXVhbHMoRW51bVZhbGlkaXR5QWNjZXNzb3JzLkJBUiwgLy8gbGFzdCB2YWxpZCB2YWx1ZSBpbiBtLnJlcGVhdGVkRTIKLSAgICAgICAgYWx0LmdldFJlcGVhdGVkRTJBc09wdGlvbmFsKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgY29kZSBnZW5lcmF0aW9uIGNvcnJlY3RseSB3cmFwcyBhIHNpbmdsZSBtZXNzYWdlIGludG8gaXRzIG91dGVyCi0gICAqIGNsYXNzLiBUaGUgY2xhc3Mge0Bjb2RlIFNpbmdsZU1lc3NhZ2VOYW5vfSBpcyBpbXBvcnRlZCBmcm9tIHRoZSBvdXRlcgotICAgKiBjbGFzcyB7QGNvZGUgVW5pdHRlc3RTaW5nbGVOYW5vfSwgd2hvc2UgbmFtZSBpcyBpbXBsaWNpdC4gQW55IGVycm9yIHdvdWxkCi0gICAqIGNhdXNlIHRoaXMgbWV0aG9kIHRvIGZhaWwgY29tcGlsYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1NpbmdsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFNpbmdsZU1lc3NhZ2VOYW5vIG1zZyA9IG5ldyBTaW5nbGVNZXNzYWdlTmFubygpOwotICAgIGFzc2VydE5vdE51bGwobXNnKTsKLSAgfQotCi0gIC8qKgotICAgKiBUZXN0cyB0aGF0IGNvZGUgZ2VuZXJhdGlvbiBjb3JyZWN0bHkgc2tpcHMgZ2VuZXJhdGluZyB0aGUgb3V0ZXIgY2xhc3MgaWYKLSAgICogdW5uZWNlc3NhcnksIGxldHRpbmcgYSBmaWxlLXNjb3BlIGVudGl0eSBoYXZlIHRoZSBzYW1lIG5hbWUuIFRoZSBjbGFzcwotICAgKiB7QGNvZGUgTXVsdGlwbGVOYW1lQ2xhc2hOYW5vfSBzaGFyZXMgdGhlIHNhbWUgbmFtZSB3aXRoIHRoZSBmaWxlJ3Mgb3V0ZXIKLSAgICogY2xhc3MgZGVmaW5lZCBleHBsaWNpdGx5LCBidXQgdGhlIGZpbGUgY29udGFpbnMgbm8gb3RoZXIgZW50aXRpZXMgYW5kIGhhcwotICAgKiBqYXZhX211bHRpcGxlX2ZpbGVzIHNldC4gQW55IGVycm9yIHdvdWxkIGNhdXNlIHRoaXMgbWV0aG9kIHRvIGZhaWwKLSAgICogY29tcGlsYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0TmFub011bHRpcGxlTmFtZUNsYXNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTXVsdGlwbGVOYW1lQ2xhc2hOYW5vIG1zZyA9IG5ldyBNdWx0aXBsZU5hbWVDbGFzaE5hbm8oKTsKLSAgICBtc2cuZmllbGQgPSAwOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgY29kZSBnZW5lcmF0aW9uIGNvcnJlY3RseSBoYW5kbGVzIGVudW1zIGluIGRpZmZlcmVudCBzY29wZXMgaW4KLSAgICogYSBzb3VyY2UgZmlsZSB3aXRoIHRoZSBvcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyBzZXQgdG8gdHJ1ZS4gQW55IGVycm9yCi0gICAqIHdvdWxkIGNhdXNlIHRoaXMgbWV0aG9kIHRvIGZhaWwgY29tcGlsYXRpb24uCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0TmFub011bHRpcGxlRW51bVNjb3BpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWxlU2NvcGVFbnVtUmVmTmFubyBtc2cxID0gbmV3IEZpbGVTY29wZUVudW1SZWZOYW5vKCk7Ci0gICAgbXNnMS5lbnVtRmllbGQgPSBVbml0dGVzdE11bHRpcGxlTmFuby5PTkU7Ci0gICAgTWVzc2FnZVNjb3BlRW51bVJlZk5hbm8gbXNnMiA9IG5ldyBNZXNzYWdlU2NvcGVFbnVtUmVmTmFubygpOwotICAgIG1zZzIuZW51bUZpZWxkID0gTWVzc2FnZVNjb3BlRW51bVJlZk5hbm8uVFdPOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgY29kZSBnZW5lcmF0aW9uIHdpdGggbWl4ZWQgdmFsdWVzIG9mIHRoZSBqYXZhX211bHRpcGxlX2ZpbGVzCi0gICAqIG9wdGlvbnMgYmV0d2VlbiB0aGUgbWFpbiBzb3VyY2UgZmlsZSBhbmQgdGhlIGltcG9ydGVkIHNvdXJjZSBmaWxlcyB3b3VsZAotICAgKiBnZW5lcmF0ZSBjb3JyZWN0IHJlZmVyZW5jZXMuIEFueSBlcnJvciB3b3VsZCBjYXVzZSB0aGlzIG1ldGhvZCB0byBmYWlsCi0gICAqIGNvbXBpbGF0aW9uLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9NdWx0aXBsZUltcG9ydGluZ05vbk11bHRpcGxlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5pdHRlc3RJbXBvcnROYW5vLkltcG9ydE1lc3NhZ2VOYW5vIGltcG9ydE1zZyA9IG5ldyBVbml0dGVzdEltcG9ydE5hbm8uSW1wb3J0TWVzc2FnZU5hbm8oKTsKLSAgICBNdWx0aXBsZUltcG9ydGluZ05vbk11bHRpcGxlTmFubzEgbmFubzEgPSBuZXcgTXVsdGlwbGVJbXBvcnRpbmdOb25NdWx0aXBsZU5hbm8xKCk7Ci0gICAgbmFubzEuZmllbGQgPSBpbXBvcnRNc2c7Ci0gICAgTXVsdGlwbGVJbXBvcnRpbmdOb25NdWx0aXBsZU5hbm8yIG5hbm8yID0gbmV3IE11bHRpcGxlSW1wb3J0aW5nTm9uTXVsdGlwbGVOYW5vMigpOwotICAgIG5hbm8yLm5hbm8xID0gbmFubzE7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub0RlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoNDEsIG1zZy5kZWZhdWx0SW50MzIpOwotICAgICAgYXNzZXJ0RXF1YWxzKDQyLCBtc2cuZGVmYXVsdEludDY0KTsKLSAgICAgIGFzc2VydEVxdWFscyg0MywgbXNnLmRlZmF1bHRVaW50MzIpOwotICAgICAgYXNzZXJ0RXF1YWxzKDQ0LCBtc2cuZGVmYXVsdFVpbnQ2NCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoLTQ1LCBtc2cuZGVmYXVsdFNpbnQzMik7Ci0gICAgICBhc3NlcnRFcXVhbHMoNDYsIG1zZy5kZWZhdWx0U2ludDY0KTsKLSAgICAgIGFzc2VydEVxdWFscyg0NywgbXNnLmRlZmF1bHRGaXhlZDMyKTsKLSAgICAgIGFzc2VydEVxdWFscyg0OCwgbXNnLmRlZmF1bHRGaXhlZDY0KTsKLSAgICAgIGFzc2VydEVxdWFscyg0OSwgbXNnLmRlZmF1bHRTZml4ZWQzMik7Ci0gICAgICBhc3NlcnRFcXVhbHMoLTUwLCBtc2cuZGVmYXVsdFNmaXhlZDY0KTsKLSAgICAgIGFzc2VydFRydWUoNTEuNWYgPT0gbXNnLmRlZmF1bHRGbG9hdCk7Ci0gICAgICBhc3NlcnRUcnVlKDUyLjBlMyA9PSBtc2cuZGVmYXVsdERvdWJsZSk7Ci0gICAgICBhc3NlcnRFcXVhbHModHJ1ZSwgbXNnLmRlZmF1bHRCb29sKTsKLSAgICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBtc2cuZGVmYXVsdFN0cmluZyk7Ci0gICAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgbmV3IFN0cmluZyhtc2cuZGVmYXVsdEJ5dGVzLCBJbnRlcm5hbE5hbm8uVVRGXzgpKTsKLSAgICAgIGFzc2VydEVxdWFscygiZMO8bnlhIiwgbXNnLmRlZmF1bHRTdHJpbmdOb25hc2NpaSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoImTDvG55YWIiLCBuZXcgU3RyaW5nKG1zZy5kZWZhdWx0Qnl0ZXNOb25hc2NpaSwgSW50ZXJuYWxOYW5vLlVURl84KSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVIsIG1zZy5kZWZhdWx0TmVzdGVkRW51bSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoTmFub091dGVyQ2xhc3MuRk9SRUlHTl9OQU5PX0JBUiwgbXNnLmRlZmF1bHRGb3JlaWduRW51bSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnROYW5vLklNUE9SVF9OQU5PX0JBUiwgbXNnLmRlZmF1bHRJbXBvcnRFbnVtKTsKLSAgICAgIGFzc2VydEVxdWFscyhGbG9hdC5QT1NJVElWRV9JTkZJTklUWSwgbXNnLmRlZmF1bHRGbG9hdEluZik7Ci0gICAgICBhc3NlcnRFcXVhbHMoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFksIG1zZy5kZWZhdWx0RmxvYXROZWdJbmYpOwotICAgICAgYXNzZXJ0RXF1YWxzKEZsb2F0Lk5hTiwgbXNnLmRlZmF1bHRGbG9hdE5hbik7Ci0gICAgICBhc3NlcnRFcXVhbHMoRG91YmxlLlBPU0lUSVZFX0lORklOSVRZLCBtc2cuZGVmYXVsdERvdWJsZUluZik7Ci0gICAgICBhc3NlcnRFcXVhbHMoRG91YmxlLk5FR0FUSVZFX0lORklOSVRZLCBtc2cuZGVmYXVsdERvdWJsZU5lZ0luZik7Ci0gICAgICBhc3NlcnRFcXVhbHMoRG91YmxlLk5hTiwgbXNnLmRlZmF1bHREb3VibGVOYW4pOwotCi0gICAgICAvLyBEZWZhdWx0IHZhbHVlcyBhcmUgbm90IG91dHB1dCwgZXhjZXB0IGZvciByZXF1aXJlZCBmaWVsZHMuCi0gICAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAgIC8vU3lzdGVtLm91dC5wcmludGYoIm1zcz0lZCByZXN1bHQubGVuZ3RoPSVkXG4iLCBtc2dTZXJpYWxpemVkU2l6ZSwgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDMpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJlc3VsdC5sZW5ndGgsIG1zZ1NlcmlhbGl6ZWRTaXplKTsKLSAgICAgIG1zZy5jbGVhcigpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REaWZmZXJlbnRTdHJpbmdMZW5ndGhzTmFubygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3Qgc3RyaW5nIHNlcmlhbGl6YXRpb24gcm91bmR0cmlwIHVzaW5nIHN0cmluZ3Mgb2YgdGhlIGZvbGxvd2luZyBsZW5ndGhzLAotICAgIC8vIHdpdGggQVNDSUkgYW5kIFVuaWNvZGUgY2hhcmFjdGVycyByZXF1aXJpbmcgZGlmZmVyZW50IFVURi04IGJ5dGUgY291bnRzIHBlcgotICAgIC8vIGNoYXIsIGhlbmNlIGNhdXNpbmcgdGhlIGxlbmd0aCBkZWxpbWl0ZXIgdmFyaW50IHRvIHNvbWV0aW1lcyByZXF1aXJlIG1vcmUKLSAgICAvLyBieXRlcyBmb3IgdGhlIFVuaWNvZGUgc3RyaW5ncyB0aGFuIHRoZSBBU0NJSSBzdHJpbmcgb2YgdGhlIHNhbWUgbGVuZ3RoLgotICAgIGludFtdIGxlbmd0aHMgPSBuZXcgaW50W10gewotICAgICAgICAgICAgMCwKLSAgICAgICAgICAgIDEsCi0gICAgICAgICAgICAoMSA8PCA0KSAtIDEsICAvLyAxIGJ5dGUgZm9yIEFTQ0lJIGFuZCBVbmljb2RlCi0gICAgICAgICAgICAoMSA8PCA3KSAtIDEsICAvLyAxIGJ5dGUgZm9yIEFTQ0lJLCAyIGJ5dGVzIGZvciBVbmljb2RlCi0gICAgICAgICAgICAoMSA8PCAxMSkgLSAxLCAvLyAyIGJ5dGVzIGZvciBBU0NJSSBhbmQgVW5pY29kZQotICAgICAgICAgICAgKDEgPDwgMTQpIC0gMSwgLy8gMiBieXRlcyBmb3IgQVNDSUksIDMgYnl0ZXMgZm9yIFVuaWNvZGUKLSAgICAgICAgICAgICgxIDw8IDE3KSAtIDEsIC8vIDMgYnl0ZXMgZm9yIEFTQ0lJIGFuZCBVbmljb2RlCi0gICAgfTsKLSAgICBmb3IgKGludCBpIDogbGVuZ3RocykgewotICAgICAgdGVzdEVuY29kaW5nT2ZTdHJpbmcoJ3EnLCBpKTsgICAgICAvLyAxIGJ5dGUgcGVyIGNoYXIKLSAgICAgIHRlc3RFbmNvZGluZ09mU3RyaW5nKCdcdTA3RkYnLCBpKTsgLy8gMiBieXRlcyBwZXIgY2hhcgotICAgICAgdGVzdEVuY29kaW5nT2ZTdHJpbmcoJ1x1MDk4MScsIGkpOyAvLyAzIGJ5dGVzIHBlciBjaGFyCi0gICAgfQotICB9Ci0KLSAgLyoqIFJlZ3Jlc3Npb24gdGVzdCBmb3IgaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi9pc3N1ZXMvMjkyICovCi0gIHB1YmxpYyB2b2lkIHRlc3RDb3JyZWN0RXhjZXB0aW9uVGhyb3dXaGVuRW5jb2RpbmdTdHJpbmdzV2l0aG91dEVub3VnaFNwYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIHRlc3RDYXNlID0gIkZvb29vb29vbyI7Ci0gICAgYXNzZXJ0RXF1YWxzKENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh0ZXN0Q2FzZS5sZW5ndGgoKSksCi0gICAgICAgICAgICBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVSYXdWYXJpbnQzMlNpemUodGVzdENhc2UubGVuZ3RoKCkgKiAzKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLmNvbXB1dGVTdHJpbmdTaXplKDEsIHRlc3RDYXNlKSk7Ci0gICAgLy8gVGFnIGlzIG9uZSBieXRlLCB2YXJpbnQgZGVzY3JpYmluZyBzdHJpbmcgbGVuZ3RoIGlzIDEgYnl0ZSwgc3RyaW5nIGxlbmd0aCBpcyA5IGJ5dGVzLgotICAgIC8vIEFuIGFycmF5IG9mIHNpemUgMSB3aWxsIGNhdXNlIGEgZmFpbHVyZSB3aGVuIHRyeWluZyB0byB3cml0ZSB0aGUgdmFyaW50LgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTE7IGkrKykgewotICAgICAgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyBidWZmZXJOYW5vID0gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5uZXdJbnN0YW5jZShuZXcgYnl0ZVtpXSk7Ci0gICAgICB0cnkgewotICAgICAgICBidWZmZXJOYW5vLndyaXRlU3RyaW5nKDEsIHRlc3RDYXNlKTsKLSAgICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIG91dCBvZiBzcGFjZSBleGNlcHRpb24iKTsKLSAgICAgIH0gY2F0Y2ggKENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8uT3V0T2ZTcGFjZUV4Y2VwdGlvbiBleHBlY3RlZCkge30KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgdGVzdEVuY29kaW5nT2ZTdHJpbmcoY2hhciBjLCBpbnQgbGVuZ3RoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyB0ZXN0QWxsVHlwZXNOYW5vID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBmaW5hbCBTdHJpbmcgZnVsbFN0cmluZyA9IGZ1bGxTdHJpbmcoYywgbGVuZ3RoKTsKLSAgICB0ZXN0QWxsVHlwZXNOYW5vLm9wdGlvbmFsU3RyaW5nID0gZnVsbFN0cmluZzsKLSAgICBmaW5hbCBUZXN0QWxsVHlwZXNOYW5vIHJlc3VsdE5hbm8gPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShyZXN1bHROYW5vLCBNZXNzYWdlTmFuby50b0J5dGVBcnJheSh0ZXN0QWxsVHlwZXNOYW5vKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZ1bGxTdHJpbmcsIHJlc3VsdE5hbm8ub3B0aW9uYWxTdHJpbmcpOwotICB9Ci0KLSAgcHJpdmF0ZSBTdHJpbmcgZnVsbFN0cmluZyhjaGFyIGMsIGludCBsZW5ndGgpIHsKLSAgICBjaGFyW10gcmVzdWx0ID0gbmV3IGNoYXJbbGVuZ3RoXTsKLSAgICBBcnJheXMuZmlsbChyZXN1bHQsIGMpOwotICAgIHJldHVybiBuZXcgU3RyaW5nKHJlc3VsdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1dpdGhIYXNQYXJzZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vSGFzIG1zZyA9IG51bGw7Ci0gICAgLy8gVGVzdCBmYWxzZSBvbiBjcmVhdGlvbiwgYWZ0ZXIgY2xlYXIgYW5kIHVwb24gZW1wdHkgcGFyc2UuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgIGlmIChpID09IDApIHsKLSAgICAgICAgbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm9IYXMoKTsKLSAgICAgIH0gZWxzZSBpZiAoaSA9PSAxKSB7Ci0gICAgICAgIG1zZy5jbGVhcigpOwotICAgICAgfSBlbHNlIGlmIChpID09IDIpIHsKLSAgICAgICAgbXNnID0gVGVzdEFsbFR5cGVzTmFub0hhcy5wYXJzZUZyb20obmV3IGJ5dGVbMF0pOwotICAgICAgfQotICAgICAgYXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsSW50MzIpOwotICAgICAgYXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsU3RyaW5nKTsKLSAgICAgIGFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEJ5dGVzKTsKLSAgICAgIGFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbE5lc3RlZEVudW0pOwotICAgICAgYXNzZXJ0RmFsc2UobXNnLmhhc0RlZmF1bHRJbnQzMik7Ci0gICAgICBhc3NlcnRGYWxzZShtc2cuaGFzRGVmYXVsdFN0cmluZyk7Ci0gICAgICBhc3NlcnRGYWxzZShtc2cuaGFzRGVmYXVsdEJ5dGVzKTsKLSAgICAgIGFzc2VydEZhbHNlKG1zZy5oYXNEZWZhdWx0RmxvYXROYW4pOwotICAgICAgYXNzZXJ0RmFsc2UobXNnLmhhc0RlZmF1bHROZXN0ZWRFbnVtKTsKLSAgICAgIGFzc2VydEZhbHNlKG1zZy5oYXNJZCk7Ci0gICAgICBhc3NlcnRGYWxzZShtc2cuaGFzUmVxdWlyZWRFbnVtKTsKLSAgICAgIG1zZy5vcHRpb25hbEludDMyID0gMTIzOwotICAgICAgbXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vSGFzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICAgIG1zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UuYmIgPSAyOwotICAgICAgbXNnLm9wdGlvbmFsTmVzdGVkRW51bSA9IFRlc3RBbGxUeXBlc05hbm8uQkFaOwotICAgIH0KLQotICAgIGJ5dGUgW10gcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBpbnQgbXNnU2VyaWFsaXplZFNpemUgPSBtc2cuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICAvL1N5c3RlbS5vdXQucHJpbnRmKCJtc3M9JWQgcmVzdWx0Lmxlbmd0aD0lZFxuIiwgbXNnU2VyaWFsaXplZFNpemUsIHJlc3VsdC5sZW5ndGgpOwotICAgIGFzc2VydFRydWUobXNnU2VyaWFsaXplZFNpemUgPT0gMTApOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICAvLyBIYXMgZmllbGRzIHRydWUgdXBvbiBwYXJzZS4KLSAgICBUZXN0QWxsVHlwZXNOYW5vSGFzIG5ld01zZyA9IFRlc3RBbGxUeXBlc05hbm9IYXMucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbmV3TXNnLm9wdGlvbmFsSW50MzIpOwotICAgIGFzc2VydFRydWUobmV3TXNnLmhhc09wdGlvbmFsSW50MzIpOwotICAgIGFzc2VydEVxdWFscygyLCBuZXdNc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmJiKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UuaGFzQmIpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vSGFzLkJBWiwgbmV3TXNnLm9wdGlvbmFsTmVzdGVkRW51bSk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vV2l0aEhhc1NlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm9IYXMgbXNnID0gbmV3IFRlc3RBbGxUeXBlc05hbm9IYXMoKTsKLSAgICBtc2cuaGFzT3B0aW9uYWxJbnQzMiA9IHRydWU7Ci0gICAgbXNnLmhhc09wdGlvbmFsU3RyaW5nID0gdHJ1ZTsKLSAgICBtc2cuaGFzT3B0aW9uYWxCeXRlcyA9IHRydWU7Ci0gICAgbXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vSGFzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmhhc0JiID0gdHJ1ZTsKLSAgICBtc2cuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtID0gdHJ1ZTsKLSAgICBtc2cuaGFzRGVmYXVsdEludDMyID0gdHJ1ZTsKLSAgICBtc2cuaGFzRGVmYXVsdFN0cmluZyA9IHRydWU7Ci0gICAgbXNnLmhhc0RlZmF1bHRCeXRlcyA9IHRydWU7Ci0gICAgbXNnLmhhc0RlZmF1bHRGbG9hdE5hbiA9IHRydWU7Ci0gICAgbXNnLmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gdHJ1ZTsKLSAgICBtc2cuaGFzSWQgPSB0cnVlOwotICAgIG1zZy5oYXNSZXF1aXJlZEVudW0gPSB0cnVlOwotCi0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICAvLyBOb3cgZGVzZXJpYWxpemUgYW5kIGZpbmQgdGhhdCBhbGwgZmllbGRzIGFyZSBzZXQgYW5kIGVxdWFsIHRvIHRoZWlyIGRlZmF1bHRzLgotICAgIFRlc3RBbGxUeXBlc05hbm9IYXMgbmV3TXNnID0gVGVzdEFsbFR5cGVzTmFub0hhcy5wYXJzZUZyb20ocmVzdWx0KTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5oYXNPcHRpb25hbEludDMyKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5oYXNPcHRpb25hbFN0cmluZyk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzT3B0aW9uYWxCeXRlcyk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmhhc0JiKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5oYXNPcHRpb25hbE5lc3RlZEVudW0pOwotICAgIGFzc2VydFRydWUobmV3TXNnLmhhc0RlZmF1bHRJbnQzMik7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzRGVmYXVsdFN0cmluZyk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzRGVmYXVsdEJ5dGVzKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5oYXNEZWZhdWx0RmxvYXROYW4pOwotICAgIGFzc2VydFRydWUobmV3TXNnLmhhc0RlZmF1bHROZXN0ZWRFbnVtKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5oYXNJZCk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzUmVxdWlyZWRFbnVtKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLm9wdGlvbmFsSW50MzIpOwotICAgIGFzc2VydEVxdWFscygwLCBuZXdNc2cub3B0aW9uYWxTdHJpbmcubGVuZ3RoKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBuZXdNc2cub3B0aW9uYWxCeXRlcy5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygwLCBuZXdNc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmJiKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFub0hhcy5GT08sIG5ld01zZy5vcHRpb25hbE5lc3RlZEVudW0pOwotICAgIGFzc2VydEVxdWFscyg0MSwgbmV3TXNnLmRlZmF1bHRJbnQzMik7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG5ld01zZy5kZWZhdWx0U3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoIndvcmxkIiwgbmV3IFN0cmluZyhuZXdNc2cuZGVmYXVsdEJ5dGVzLCBJbnRlcm5hbE5hbm8uVVRGXzgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFub0hhcy5CQVIsIG5ld01zZy5kZWZhdWx0TmVzdGVkRW51bSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZsb2F0Lk5hTiwgbmV3TXNnLmRlZmF1bHRGbG9hdE5hbik7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG5ld01zZy5pZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm9IYXMuRk9PLCBuZXdNc2cucmVxdWlyZWRFbnVtKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vV2l0aEFjY2Vzc29yc0Jhc2ljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE5hbm9BY2Nlc3NvcnMgbXNnID0gbmV3IFRlc3ROYW5vQWNjZXNzb3JzKCk7Ci0KLSAgICAvLyBNYWtlcyBzdXJlIHJlcXVpcmVkLCByZXBlYXRlZCwgYW5kIG1lc3NhZ2UgZmllbGRzIGFyZSBzdGlsbCBwdWJsaWMKLSAgICBtc2cuaWQgPSAzOwotICAgIG1zZy5yZXBlYXRlZEJ5dGVzID0gbmV3IGJ5dGVbMl1bM107Ci0gICAgbXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IG51bGw7Ci0KLSAgICAvLyBUZXN0IGFjY2Vzc29ycwotICAgIGFzc2VydEVxdWFscygwLCBtc2cuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxJbnQzMigpKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxJbnQzMigxMzUpOwotICAgIGFzc2VydEVxdWFscygxMzUsIG1zZy5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsSW50MzIoKSk7Ci0gICAgbXNnLmNsZWFyT3B0aW9uYWxJbnQzMigpOwotICAgIGFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEludDMyKCkpOwotICAgIG1zZy5zZXRPcHRpb25hbEludDMyKDApOyAvLyBkZWZhdWx0IHZhbHVlCi0gICAgYXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFRlc3QgTlBFCi0gICAgdHJ5IHsKLSAgICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKG51bGwpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGV4cGVjdGVkKSB7fQotICAgIHRyeSB7Ci0gICAgICBtc2cuc2V0T3B0aW9uYWxTdHJpbmcobnVsbCk7Ci0gICAgICBmYWlsKCk7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZXhwZWN0ZWQpIHt9Ci0KLSAgICAvLyBUZXN0IGhhcyBiaXQgb24gYnl0ZXMgZmllbGQgd2l0aCBkZWZhdWx0cyBhbmQgY2xlYXIoKSByZS1jbG9uZXMgdGhlIGRlZmF1bHQgYXJyYXkKLSAgICBhc3NlcnRGYWxzZShtc2cuaGFzRGVmYXVsdEJ5dGVzKCkpOwotICAgIGJ5dGVbXSBkZWZhdWx0Qnl0ZXMgPSBtc2cuZ2V0RGVmYXVsdEJ5dGVzKCk7Ci0gICAgbXNnLnNldERlZmF1bHRCeXRlcyhkZWZhdWx0Qnl0ZXMpOwotICAgIGFzc2VydFRydWUobXNnLmhhc0RlZmF1bHRCeXRlcygpKTsKLSAgICBtc2cuY2xlYXJEZWZhdWx0Qnl0ZXMoKTsKLSAgICBhc3NlcnRGYWxzZShtc2cuaGFzRGVmYXVsdEJ5dGVzKCkpOwotICAgIGRlZmF1bHRCeXRlc1swXSsrOyAvLyBtb2RpZnkgb3JpZ2luYWwgYXJyYXkKLSAgICBhc3NlcnRGYWxzZShBcnJheXMuZXF1YWxzKGRlZmF1bHRCeXRlcywgbXNnLmdldERlZmF1bHRCeXRlcygpKSk7Ci0KLSAgICAvLyBUZXN0IGhhcyBiaXRzIHRoYXQgcmVxdWlyZSBhZGRpdGlvbmFsIGJpdCBmaWVsZHMKLSAgICBhc3NlcnRGYWxzZShtc2cuaGFzQml0RmllbGRDaGVjaygpKTsKLSAgICBtc2cuc2V0Qml0RmllbGRDaGVjaygwKTsKLSAgICBhc3NlcnRUcnVlKG1zZy5oYXNCaXRGaWVsZENoZWNrKCkpOwotICAgIGFzc2VydEZhbHNlKG1zZy5oYXNCZWZvcmVCaXRGaWVsZENoZWNrKCkpOyAvLyBjaGVja3MgYml0IGZpZWxkIGRvZXMgbm90IGxlYWsKLSAgICBhc3NlcnRGYWxzZShtc2cuaGFzQWZ0ZXJCaXRGaWVsZENoZWNrKCkpOwotCi0gICAgLy8gVGVzdCBjbGVhcigpIGNsZWFycyBoYXMgYml0cwotICAgIG1zZy5zZXRPcHRpb25hbFN0cmluZygiaGkiKTsKLSAgICBtc2cuc2V0RGVmYXVsdFN0cmluZygidGhlcmUiKTsKLSAgICBtc2cuY2xlYXIoKTsKLSAgICBhc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLmhhc0RlZmF1bHRTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RmFsc2UobXNnLmhhc0JpdEZpZWxkQ2hlY2soKSk7Ci0KLSAgICAvLyBUZXN0IHNldCgpIGFuZCBjbGVhcigpIHJldHVybnMgaXRzZWxmIChjb21waWxlcyA9IHN1Y2Nlc3MpCi0gICAgbXNnLmNsZWFyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsSW50MzIoMykKLSAgICAgICAgLmNsZWFyRGVmYXVsdEJ5dGVzKCkKLSAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCI0Iik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1dpdGhBY2Nlc3NvcnNQYXJzZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TmFub0FjY2Vzc29ycyBtc2cgPSBudWxsOwotICAgIC8vIFRlc3QgZmFsc2Ugb24gY3JlYXRpb24sIGFmdGVyIGNsZWFyIGFuZCB1cG9uIGVtcHR5IHBhcnNlLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgaSsrKSB7Ci0gICAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICAgIG1zZyA9IG5ldyBUZXN0TmFub0FjY2Vzc29ycygpOwotICAgICAgfSBlbHNlIGlmIChpID09IDEpIHsKLSAgICAgICAgbXNnLmNsZWFyKCk7Ci0gICAgICB9IGVsc2UgaWYgKGkgPT0gMikgewotICAgICAgICBtc2cgPSBUZXN0TmFub0FjY2Vzc29ycy5wYXJzZUZyb20obmV3IGJ5dGVbMF0pOwotICAgICAgfQotICAgICAgYXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsSW50MzIoKSk7Ci0gICAgICBhc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxTdHJpbmcoKSk7Ci0gICAgICBhc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxCeXRlcygpKTsKLSAgICAgIGFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbE5lc3RlZEVudW0oKSk7Ci0gICAgICBhc3NlcnRGYWxzZShtc2cuaGFzRGVmYXVsdEludDMyKCkpOwotICAgICAgYXNzZXJ0RmFsc2UobXNnLmhhc0RlZmF1bHRTdHJpbmcoKSk7Ci0gICAgICBhc3NlcnRGYWxzZShtc2cuaGFzRGVmYXVsdEJ5dGVzKCkpOwotICAgICAgYXNzZXJ0RmFsc2UobXNnLmhhc0RlZmF1bHRGbG9hdE5hbigpKTsKLSAgICAgIGFzc2VydEZhbHNlKG1zZy5oYXNEZWZhdWx0TmVzdGVkRW51bSgpKTsKLSAgICAgIG1zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdE5hbm9BY2Nlc3NvcnMuTmVzdGVkTWVzc2FnZSgpOwotICAgICAgbXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5zZXRCYigyKTsKLSAgICAgIG1zZy5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdE5hbm9BY2Nlc3NvcnMuQkFaKTsKLSAgICAgIG1zZy5zZXREZWZhdWx0SW50MzIobXNnLmdldERlZmF1bHRJbnQzMigpKTsKLSAgICB9Ci0KLSAgICBieXRlIFtdIHJlc3VsdCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZyk7Ci0gICAgaW50IG1zZ1NlcmlhbGl6ZWRTaXplID0gbXNnLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgLy9TeXN0ZW0ub3V0LnByaW50ZigibXNzPSVkIHJlc3VsdC5sZW5ndGg9JWRcbiIsIG1zZ1NlcmlhbGl6ZWRTaXplLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKG1zZ1NlcmlhbGl6ZWRTaXplID09IDE0KTsKLSAgICBhc3NlcnRFcXVhbHMocmVzdWx0Lmxlbmd0aCwgbXNnU2VyaWFsaXplZFNpemUpOwotCi0gICAgLy8gSGFzIGZpZWxkcyB0cnVlIHVwb24gcGFyc2UuCi0gICAgVGVzdE5hbm9BY2Nlc3NvcnMgbmV3TXNnID0gVGVzdE5hbm9BY2Nlc3NvcnMucGFyc2VGcm9tKHJlc3VsdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG5ld01zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmhhc0JiKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0TmFub0FjY2Vzc29ycy5CQVosIG5ld01zZy5nZXRPcHRpb25hbE5lc3RlZEVudW0oKSk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotCi0gICAgLy8gSGFzIGZpZWxkIHRydWUgb24gZmllbGRzIHdpdGggZXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgZnJvbSB3aXJlLgotICAgIGFzc2VydFRydWUobmV3TXNnLmhhc0RlZmF1bHRJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDEsIG5ld01zZy5nZXREZWZhdWx0SW50MzIoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1dpdGhBY2Nlc3NvcnNQdWJsaWNGaWVsZFR5cGVzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE5hbm9BY2Nlc3NvcnMgbXNnID0gbmV3IFRlc3ROYW5vQWNjZXNzb3JzKCk7Ci0gICAgYXNzZXJ0TnVsbChtc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLmlkKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLnJlcGVhdGVkTmVzdGVkRW51bS5sZW5ndGgpOwotCi0gICAgVGVzdE5hbm9BY2Nlc3NvcnMgbmV3TXNnID0gVGVzdE5hbm9BY2Nlc3NvcnMucGFyc2VGcm9tKE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1zZykpOwotICAgIGFzc2VydE51bGwobmV3TXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG5ld01zZy5pZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG5ld01zZy5yZXBlYXRlZE5lc3RlZEVudW0ubGVuZ3RoKTsKLQotICAgIFRlc3ROYW5vQWNjZXNzb3JzLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0TmFub0FjY2Vzc29ycy5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbmVzdGVkTWVzc2FnZS5zZXRCYig1KTsKLSAgICBuZXdNc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gbmVzdGVkTWVzc2FnZTsKLSAgICBuZXdNc2cuaWQgPSAtMTsKLSAgICBuZXdNc2cucmVwZWF0ZWROZXN0ZWRFbnVtID0gbmV3IGludFtdIHsgVGVzdEFsbFR5cGVzTmFuby5GT08gfTsKLQotICAgIFRlc3ROYW5vQWNjZXNzb3JzIG5ld01zZzIgPSBUZXN0TmFub0FjY2Vzc29ycy5wYXJzZUZyb20oTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobmV3TXNnKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG5lc3RlZE1lc3NhZ2UuZ2V0QmIoKSwgbmV3TXNnMi5vcHRpb25hbE5lc3RlZE1lc3NhZ2UuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xLCBuZXdNc2cyLmlkKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5GT08sIG5ld01zZzIucmVwZWF0ZWROZXN0ZWRFbnVtWzBdKTsKLQotICAgIG5ld01zZzIub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gbnVsbDsKLSAgICBuZXdNc2cyLmlkID0gMDsKLSAgICBuZXdNc2cyLnJlcGVhdGVkTmVzdGVkRW51bSA9IG51bGw7Ci0KLSAgICBUZXN0TmFub0FjY2Vzc29ycyBuZXdNc2czID0gVGVzdE5hbm9BY2Nlc3NvcnMucGFyc2VGcm9tKE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG5ld01zZzIpKTsKLSAgICBhc3NlcnROdWxsKG5ld01zZzMub3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnMy5pZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG5ld01zZzMucmVwZWF0ZWROZXN0ZWRFbnVtLmxlbmd0aCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmFub1dpdGhBY2Nlc3NvcnNTZXJpYWxpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TmFub0FjY2Vzc29ycyBtc2cgPSBuZXcgVGVzdE5hbm9BY2Nlc3NvcnMoKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxJbnQzMihtc2cuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxTdHJpbmcobXNnLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKG1zZy5nZXRPcHRpb25hbEJ5dGVzKCkpOwotICAgIFRlc3ROYW5vQWNjZXNzb3JzLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0TmFub0FjY2Vzc29ycy5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbmVzdGVkTWVzc2FnZS5zZXRCYihuZXN0ZWRNZXNzYWdlLmdldEJiKCkpOwotICAgIG1zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBuZXN0ZWRNZXNzYWdlOwotICAgIG1zZy5zZXRPcHRpb25hbE5lc3RlZEVudW0obXNnLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKLSAgICBtc2cuc2V0RGVmYXVsdEludDMyKG1zZy5nZXREZWZhdWx0SW50MzIoKSk7Ci0gICAgbXNnLnNldERlZmF1bHRTdHJpbmcobXNnLmdldERlZmF1bHRTdHJpbmcoKSk7Ci0gICAgbXNnLnNldERlZmF1bHRCeXRlcyhtc2cuZ2V0RGVmYXVsdEJ5dGVzKCkpOwotICAgIG1zZy5zZXREZWZhdWx0RmxvYXROYW4obXNnLmdldERlZmF1bHRGbG9hdE5hbigpKTsKLSAgICBtc2cuc2V0RGVmYXVsdE5lc3RlZEVudW0obXNnLmdldERlZmF1bHROZXN0ZWRFbnVtKCkpOwotCi0gICAgYnl0ZSBbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIGFzc2VydEVxdWFscyhyZXN1bHQubGVuZ3RoLCBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0KLSAgICAvLyBOb3cgZGVzZXJpYWxpemUgYW5kIGZpbmQgdGhhdCBhbGwgZmllbGRzIGFyZSBzZXQgYW5kIGVxdWFsIHRvIHRoZWlyIGRlZmF1bHRzLgotICAgIFRlc3ROYW5vQWNjZXNzb3JzIG5ld01zZyA9IFRlc3ROYW5vQWNjZXNzb3JzLnBhcnNlRnJvbShyZXN1bHQpOwotICAgIGFzc2VydFRydWUobmV3TXNnLmhhc09wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzT3B0aW9uYWxTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzT3B0aW9uYWxCeXRlcygpKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UuaGFzQmIoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgIGFzc2VydFRydWUobmV3TXNnLmhhc0RlZmF1bHRJbnQzMigpKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5oYXNEZWZhdWx0U3RyaW5nKCkpOwotICAgIGFzc2VydFRydWUobmV3TXNnLmhhc0RlZmF1bHRCeXRlcygpKTsKLSAgICBhc3NlcnRUcnVlKG5ld01zZy5oYXNEZWZhdWx0RmxvYXROYW4oKSk7Ci0gICAgYXNzZXJ0VHJ1ZShuZXdNc2cuaGFzRGVmYXVsdE5lc3RlZEVudW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG5ld01zZy5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBuZXdNc2cuZ2V0T3B0aW9uYWxTdHJpbmcoKS5sZW5ndGgoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG5ld01zZy5nZXRPcHRpb25hbEJ5dGVzKCkubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE5hbm9BY2Nlc3NvcnMuRk9PLCBuZXdNc2cuZ2V0T3B0aW9uYWxOZXN0ZWRFbnVtKCkpOwotICAgIGFzc2VydEVxdWFscyg0MSwgbmV3TXNnLmdldERlZmF1bHRJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbmV3TXNnLmdldERlZmF1bHRTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJ3b3JsZCIsIG5ldyBTdHJpbmcobmV3TXNnLmdldERlZmF1bHRCeXRlcygpLCBJbnRlcm5hbE5hbm8uVVRGXzgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdE5hbm9BY2Nlc3NvcnMuQkFSLCBuZXdNc2cuZ2V0RGVmYXVsdE5lc3RlZEVudW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZsb2F0Lk5hTiwgbmV3TXNnLmdldERlZmF1bHRGbG9hdE5hbigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbmV3TXNnLmlkKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROYW5vSmF2YUVudW1TdHlsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEVudW1DbGFzc05hbm9zLkVudW1DbGFzc05hbm8gbXNnID0gbmV3IEVudW1DbGFzc05hbm9zLkVudW1DbGFzc05hbm8oKTsKLSAgICBhc3NlcnRFcXVhbHMoRW51bUNsYXNzTmFub3MuRmlsZVNjb3BlRW51bS5PTkUsIG1zZy5vbmUpOwotICAgIGFzc2VydEVxdWFscyhFbnVtQ2xhc3NOYW5vcy5FbnVtQ2xhc3NOYW5vLk1lc3NhZ2VTY29wZUVudW0uVFdPLCBtc2cudHdvKTsKLQotICAgIEVudW1DbGFzc05hbm9NdWx0aXBsZSBtc2cyID0gbmV3IEVudW1DbGFzc05hbm9NdWx0aXBsZSgpOwotICAgIGFzc2VydEVxdWFscyhGaWxlU2NvcGVFbnVtTXVsdGlwbGUuVEhSRUUsIG1zZzIudGhyZWUpOwotICAgIGFzc2VydEVxdWFscyhFbnVtQ2xhc3NOYW5vTXVsdGlwbGUuTWVzc2FnZVNjb3BlRW51bU11bHRpcGxlLkZPVVIsIG1zZzIuZm91cik7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdGhhdCBmaWVsZHMgd2l0aCBhIGRlZmF1bHQgdmFsdWUgb2YgTmFOIGFyZSBub3Qgc2VyaWFsaXplZCB3aGVuCi0gICAqIHNldCB0byBOYU4uIFRoaXMgaXMgYSBzcGVjaWFsIGNhc2UgYXMgTmFOICE9IE5hTiwgc28gbm9ybWFsIGVxdWFsaXR5Ci0gICAqIGNoZWNrcyBkb24ndCB3b3JrLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE5hbm9Ob3RBTnVtYmVyRGVmYXVsdHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLmRlZmF1bHREb3VibGVOYW4gPSAwOwotICAgIG1zZy5kZWZhdWx0RmxvYXROYW4gPSAwOwotICAgIGJ5dGVbXSByZXN1bHQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtc2cpOwotICAgIGludCBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIGFzc2VydFRydWUocmVzdWx0Lmxlbmd0aCA9PSBtc2dTZXJpYWxpemVkU2l6ZSk7Ci0gICAgYXNzZXJ0VHJ1ZShtc2dTZXJpYWxpemVkU2l6ZSA+IDMpOwotCi0gICAgbXNnLmRlZmF1bHREb3VibGVOYW4gPSBEb3VibGUuTmFOOwotICAgIG1zZy5kZWZhdWx0RmxvYXROYW4gPSBGbG9hdC5OYU47Ci0gICAgcmVzdWx0ID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobXNnKTsKLSAgICBtc2dTZXJpYWxpemVkU2l6ZSA9IG1zZy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgIGFzc2VydEVxdWFscygzLCByZXN1bHQubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbXNnU2VyaWFsaXplZFNpemUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgdGhhdCBhIGJ1ZyBpbiBza2lwUmF3Qnl0ZXMoKSBoYXMgYmVlbiBmaXhlZDogIGlmIHRoZSBza2lwIHNraXBzCi0gICAqIGV4YWN0bHkgdXAgdG8gYSBsaW1pdCwgdGhpcyBzaG91bGQgbm90IGJyZWFrIHRoaW5ncy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RTa2lwUmF3Qnl0ZXNCdWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBieXRlW10gcmF3Qnl0ZXMgPSBuZXcgYnl0ZVtdIHsgMSwgMiB9OwotICAgIENvZGVkSW5wdXRCeXRlQnVmZmVyTmFubyBpbnB1dCA9IENvZGVkSW5wdXRCeXRlQnVmZmVyTmFuby5uZXdJbnN0YW5jZShyYXdCeXRlcyk7Ci0KLSAgICBpbnQgbGltaXQgPSBpbnB1dC5wdXNoTGltaXQoMSk7Ci0gICAgaW5wdXQuc2tpcFJhd0J5dGVzKDEpOwotICAgIGlucHV0LnBvcExpbWl0KGxpbWl0KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgaW5wdXQucmVhZFJhd0J5dGUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IGEgYnVnIGluIHNraXBSYXdCeXRlcygpIGhhcyBiZWVuIGZpeGVkOiAgaWYgdGhlIHNraXAgc2tpcHMKLSAgICogcGFzdCB0aGUgZW5kIG9mIGEgYnVmZmVyIHdpdGggYSBsaW1pdCB0aGF0IGhhcyBiZWVuIHNldCBwYXN0IHRoZSBlbmQgb2YKLSAgICogdGhhdCBidWZmZXIsIHRoaXMgc2hvdWxkIG5vdCBicmVhayB0aGluZ3MuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFJhd0J5dGVzUGFzdEVuZE9mQnVmZmVyV2l0aExpbWl0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYnl0ZVtdIHJhd0J5dGVzID0gbmV3IGJ5dGVbXSB7IDEsIDIsIDMsIDQsIDUgfTsKLSAgICBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gaW5wdXQgPSBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOwotCi0gICAgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KDQpOwotICAgIC8vIEluIG9yZGVyIHRvIGV4cG9zZSB0aGUgYnVnIHdlIG5lZWQgdG8gcmVhZCBhdCBsZWFzdCBvbmUgYnl0ZSB0byBwcmltZSB0aGUKLSAgICAvLyBidWZmZXIgaW5zaWRlIHRoZSBDb2RlZElucHV0U3RyZWFtLgotICAgIGFzc2VydEVxdWFscygxLCBpbnB1dC5yZWFkUmF3Qnl0ZSgpKTsKLSAgICAvLyBTa2lwIHRvIHRoZSBlbmQgb2YgdGhlIGxpbWl0LgotICAgIGlucHV0LnNraXBSYXdCeXRlcygzKTsKLSAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0gICAgaW5wdXQucG9wTGltaXQobGltaXQpOwotICAgIGFzc2VydEVxdWFscyg1LCBpbnB1dC5yZWFkUmF3Qnl0ZSgpKTsKLSAgfQotCi0gIC8vIFRlc3QgYSBzbWF0dGVyaW5nIG9mIHZhcmlvdXMgcHJvdG8gdHlwZXMgZm9yIHByaW50aW5nCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlTmFub1ByaW50ZXIoKSB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtc2cgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1zZy5vcHRpb25hbEludDMyID0gMTQ7Ci0gICAgbXNnLm9wdGlvbmFsRmxvYXQgPSA0Mi4zZjsKLSAgICBtc2cub3B0aW9uYWxTdHJpbmcgPSAiU3RyaW5nIFwid2l0aCcgYm90aCBxdW90ZXMiOwotICAgIG1zZy5vcHRpb25hbEJ5dGVzID0gbmV3IGJ5dGVbXSB7JyInLCAnXDAnLCAxLCA4fTsKLSAgICBtc2cub3B0aW9uYWxHcm91cCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk9wdGlvbmFsR3JvdXAoKTsKLSAgICBtc2cub3B0aW9uYWxHcm91cC5hID0gMTU7Ci0gICAgbXNnLnJlcGVhdGVkSW50NjQgPSBuZXcgbG9uZ1syXTsKLSAgICBtc2cucmVwZWF0ZWRJbnQ2NFswXSA9IDFMOwotICAgIG1zZy5yZXBlYXRlZEludDY0WzFdID0gLTFMOwotICAgIG1zZy5yZXBlYXRlZEJ5dGVzID0gbmV3IGJ5dGVbMl1bXTsKLSAgICBtc2cucmVwZWF0ZWRCeXRlc1sxXSA9IG5ldyBieXRlW10geydoJywgJ2UnLCAnbCcsICdsJywgJ28nfTsKLSAgICBtc2cucmVwZWF0ZWRHcm91cCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLlJlcGVhdGVkR3JvdXBbMl07Ci0gICAgbXNnLnJlcGVhdGVkR3JvdXBbMF0gPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5SZXBlYXRlZEdyb3VwKCk7Ci0gICAgbXNnLnJlcGVhdGVkR3JvdXBbMF0uYSA9IC0yNzsKLSAgICBtc2cucmVwZWF0ZWRHcm91cFsxXSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLlJlcGVhdGVkR3JvdXAoKTsKLSAgICBtc2cucmVwZWF0ZWRHcm91cFsxXS5hID0gLTcyOwotICAgIG1zZy5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbXNnLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5iYiA9IDc7Ci0gICAgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2VbMl07Ci0gICAgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzBdLmJiID0gNzc7Ci0gICAgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVsxXSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzFdLmJiID0gODg7Ci0gICAgbXNnLm9wdGlvbmFsTmVzdGVkRW51bSA9IFRlc3RBbGxUeXBlc05hbm8uQkFaOwotICAgIG1zZy5yZXBlYXRlZE5lc3RlZEVudW0gPSBuZXcgaW50WzJdOwotICAgIG1zZy5yZXBlYXRlZE5lc3RlZEVudW1bMF0gPSBUZXN0QWxsVHlwZXNOYW5vLkJBUjsKLSAgICBtc2cucmVwZWF0ZWROZXN0ZWRFbnVtWzFdID0gVGVzdEFsbFR5cGVzTmFuby5GT087Ci0gICAgbXNnLnJlcGVhdGVkU3RyaW5nUGllY2UgPSBuZXcgU3RyaW5nW10ge251bGwsICJ3b3JsZCJ9OwotICAgIG1zZy5zZXRPbmVvZlN0cmluZygiaGVsbG8iKTsKLQotICAgIFN0cmluZyBwcm90b1ByaW50ID0gbXNnLnRvU3RyaW5nKCk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJvcHRpb25hbF9pbnQzMjogMTQiKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJvcHRpb25hbF9mbG9hdDogNDIuMyIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoIm9wdGlvbmFsX2RvdWJsZTogMC4wIikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygib3B0aW9uYWxfc3RyaW5nOiBcIlN0cmluZyBcXHUwMDIyd2l0aFxcdTAwMjcgYm90aCBxdW90ZXNcIiIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoIm9wdGlvbmFsX2J5dGVzOiBcIlxcXCJcXDAwMFxcMDAxXFwwMTBcIiIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoIm9wdGlvbmFsX2dyb3VwIDxcbiAgYTogMTVcbj4iKSk7Ci0KLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoInJlcGVhdGVkX2ludDY0OiAxXG5yZXBlYXRlZF9pbnQ2NDogLTEiKSk7Ci0gICAgYXNzZXJ0RmFsc2UocHJvdG9QcmludC5jb250YWlucygicmVwZWF0ZWRfYnl0ZXM6IFwiXCIiKSk7IC8vIG51bGwgc2hvdWxkIGJlIGRyb3BwZWQKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoInJlcGVhdGVkX2J5dGVzOiBcImhlbGxvXCIiKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJyZXBlYXRlZF9ncm91cCA8XG4gIGE6IC0yN1xuPlxuIgotICAgICAgICAgICAgKyAicmVwZWF0ZWRfZ3JvdXAgPFxuICBhOiAtNzJcbj4iKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA8XG4gIGJiOiA3XG4+IikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPFxuICBiYjogNzdcbj5cbiIKLSAgICAgICAgICAgICsgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIDxcbiAgYmI6IDg4XG4+IikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygib3B0aW9uYWxfbmVzdGVkX2VudW06IDMiKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJyZXBlYXRlZF9uZXN0ZWRfZW51bTogMlxucmVwZWF0ZWRfbmVzdGVkX2VudW06IDEiKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJkZWZhdWx0X2ludDMyOiA0MSIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoImRlZmF1bHRfc3RyaW5nOiBcImhlbGxvXCIiKSk7Ci0gICAgYXNzZXJ0RmFsc2UocHJvdG9QcmludC5jb250YWlucygicmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiBcIlwiIikpOyAgLy8gbnVsbCBzaG91bGQgYmUgZHJvcHBlZAotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygicmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiBcIndvcmxkXCIiKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJvbmVvZl9zdHJpbmc6IFwiaGVsbG9cIiIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlTmFub1ByaW50ZXJBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TmFub0FjY2Vzc29ycyBtc2cgPSBuZXcgVGVzdE5hbm9BY2Nlc3NvcnMoKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxJbnQzMigxMyk7Ci0gICAgbXNnLnNldE9wdGlvbmFsU3RyaW5nKCJmb28iKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxCeXRlcyhuZXcgYnl0ZVtdIHsnIicsICdcMCcsIDEsIDh9KTsKLSAgICBtc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3ROYW5vQWNjZXNzb3JzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtc2cub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLnNldEJiKDcpOwotICAgIG1zZy5zZXRPcHRpb25hbE5lc3RlZEVudW0oVGVzdE5hbm9BY2Nlc3NvcnMuQkFaKTsKLSAgICBtc2cucmVwZWF0ZWRJbnQzMiA9IG5ldyBpbnRbXSB7IDEsIC0xIH07Ci0gICAgbXNnLnJlcGVhdGVkU3RyaW5nID0gbmV3IFN0cmluZ1tdIHsgIkhlbGxvIiwgIndvcmxkIiB9OwotICAgIG1zZy5yZXBlYXRlZEJ5dGVzID0gbmV3IGJ5dGVbMl1bXTsKLSAgICBtc2cucmVwZWF0ZWRCeXRlc1sxXSA9IG5ldyBieXRlW10geydoJywgJ2UnLCAnbCcsICdsJywgJ28nfTsKLSAgICBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3ROYW5vQWNjZXNzb3JzLk5lc3RlZE1lc3NhZ2VbMl07Ci0gICAgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXSA9IG5ldyBUZXN0TmFub0FjY2Vzc29ycy5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbXNnLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXS5zZXRCYig1KTsKLSAgICBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzFdID0gbmV3IFRlc3ROYW5vQWNjZXNzb3JzLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtc2cucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzFdLnNldEJiKDYpOwotICAgIG1zZy5yZXBlYXRlZE5lc3RlZEVudW0gPSBuZXcgaW50W10geyBUZXN0TmFub0FjY2Vzc29ycy5GT08sIFRlc3ROYW5vQWNjZXNzb3JzLkJBUiB9OwotICAgIG1zZy5pZCA9IDMzOwotCi0gICAgU3RyaW5nIHByb3RvUHJpbnQgPSBtc2cudG9TdHJpbmcoKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoIm9wdGlvbmFsX2ludDMyOiAxMyIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIiIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoIm9wdGlvbmFsX2J5dGVzOiBcIlxcXCJcXDAwMFxcMDAxXFwwMTBcIiIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIDxcbiAgYmI6IDdcbj4iKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJvcHRpb25hbF9uZXN0ZWRfZW51bTogMyIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoInJlcGVhdGVkX2ludDMyOiAxXG5yZXBlYXRlZF9pbnQzMjogLTEiKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJyZXBlYXRlZF9zdHJpbmc6IFwiSGVsbG9cIlxucmVwZWF0ZWRfc3RyaW5nOiBcIndvcmxkXCIiKSk7Ci0gICAgYXNzZXJ0RmFsc2UocHJvdG9QcmludC5jb250YWlucygicmVwZWF0ZWRfYnl0ZXM6IFwiXCIiKSk7IC8vIG51bGwgc2hvdWxkIGJlIGRyb3BwZWQKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoInJlcGVhdGVkX2J5dGVzOiBcImhlbGxvXCIiKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8XG4gIGJiOiA1XG4+XG4iCi0gICAgICAgICAgICArICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8XG4gIGJiOiA2XG4+IikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygicmVwZWF0ZWRfbmVzdGVkX2VudW06IDFcbnJlcGVhdGVkX25lc3RlZF9lbnVtOiAyIikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygiaWQ6IDMzIikpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VOYW5vUHJpbnRlckZvck1hcHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwIG1zZyA9IG5ldyBUZXN0TWFwKCk7Ci0gICAgTWVzc2FnZVZhbHVlIG1zZ1ZhbHVlc1tdID0gbmV3IE1lc3NhZ2VWYWx1ZVtdIHsKLSAgICAgIG5ldyBNZXNzYWdlVmFsdWUoKSwgbmV3IE1lc3NhZ2VWYWx1ZSgpCi0gICAgfTsKLSAgICBtc2dWYWx1ZXNbMF0udmFsdWUgPSAxOwotICAgIG1zZ1ZhbHVlc1sxXS52YWx1ZSA9IDI7Ci0gICAgbXNnLmludDMyVG9CeXRlc0ZpZWxkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgYnl0ZVtdPigpOwotICAgIG1zZy5pbnQzMlRvQnl0ZXNGaWVsZC5wdXQoMSwgbmV3IGJ5dGVbXSB7JyInLCAnXDAnfSk7Ci0gICAgbXNnLmludDMyVG9CeXRlc0ZpZWxkLnB1dCgyLCBuZXcgYnl0ZVtdIHsxLCA4fSk7Ci0gICAgbXNnLnN0cmluZ1RvSW50MzJGaWVsZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICBtc2cuc3RyaW5nVG9JbnQzMkZpZWxkLnB1dCgiaGVsbG8iLCAxKTsKLSAgICBtc2cuc3RyaW5nVG9JbnQzMkZpZWxkLnB1dCgid29ybGQiLCAyKTsKLSAgICBtc2cuaW50MzJUb01lc3NhZ2VGaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIE1hcFRlc3RQcm90by5UZXN0TWFwLk1lc3NhZ2VWYWx1ZT4oKTsKLSAgICBtc2cuaW50MzJUb01lc3NhZ2VGaWVsZC5wdXQoMCwgbXNnVmFsdWVzWzBdKTsKLSAgICBtc2cuaW50MzJUb01lc3NhZ2VGaWVsZC5wdXQoMSwgbXNnVmFsdWVzWzFdKTsKLSAgICBtc2cuaW50MzJUb0VudW1GaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0gICAgbXNnLmludDMyVG9FbnVtRmllbGQucHV0KDEsIDIpOwotICAgIG1zZy5pbnQzMlRvRW51bUZpZWxkLnB1dCgyLCAzKTsKLSAgICBTdHJpbmcgcHJvdG9QcmludCA9IG1zZy50b1N0cmluZygpOwotCi0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKAotICAgICAgICAiaW50MzJfdG9fYnl0ZXNfZmllbGQgPFxuICBrZXk6IDFcbiAgdmFsdWU6IFwiXFxcIlxcMDAwXCJcbj4iKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKAotICAgICAgICAiaW50MzJfdG9fYnl0ZXNfZmllbGQgPFxuICBrZXk6IDJcbiAgdmFsdWU6IFwiXFwwMDFcXDAxMFwiXG4+IikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygKLSAgICAgICAgInN0cmluZ190b19pbnQzMl9maWVsZCA8XG4gIGtleTogXCJoZWxsb1wiXG4gIHZhbHVlOiAxXG4+IikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygKLSAgICAgICAgInN0cmluZ190b19pbnQzMl9maWVsZCA8XG4gIGtleTogXCJ3b3JsZFwiXG4gIHZhbHVlOiAyXG4+IikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygKLSAgICAgICAgImludDMyX3RvX21lc3NhZ2VfZmllbGQgPFxuICBrZXk6IDBcbiAgdmFsdWUgPFxuICAgIHZhbHVlOiAxXG4iKSk7Ci0gICAgYXNzZXJ0VHJ1ZShwcm90b1ByaW50LmNvbnRhaW5zKAotICAgICAgICAiaW50MzJfdG9fbWVzc2FnZV9maWVsZCA8XG4gIGtleTogMVxuICB2YWx1ZSA8XG4gICAgdmFsdWU6IDJcbiIpKTsKLSAgICBhc3NlcnRUcnVlKHByb3RvUHJpbnQuY29udGFpbnMoCi0gICAgICAgICJpbnQzMl90b19lbnVtX2ZpZWxkIDxcbiAga2V5OiAxXG4gIHZhbHVlOiAyXG4+IikpOwotICAgIGFzc2VydFRydWUocHJvdG9QcmludC5jb250YWlucygKLSAgICAgICAgImludDMyX3RvX2VudW1fZmllbGQgPFxuICBrZXk6IDJcbiAgdmFsdWU6IDNcbj4iKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIEV4dGVuc2lvbnMuRXh0ZW5kYWJsZU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlKCk7Ci0gICAgbWVzc2FnZS5maWVsZCA9IDU7Ci0gICAgaW50W10gaW50MzJzID0gezEsIDJ9OwotICAgIGludFtdIHVpbnQzMnMgPSB7MywgNH07Ci0gICAgaW50W10gc2ludDMycyA9IHstNSwgLTZ9OwotICAgIGxvbmdbXSBpbnQ2NHMgPSB7NywgOH07Ci0gICAgbG9uZ1tdIHVpbnQ2NHMgPSB7OSwgMTB9OwotICAgIGxvbmdbXSBzaW50NjRzID0gey0xMSwgLTEyfTsKLSAgICBpbnRbXSBmaXhlZDMycyA9IHsxMywgMTR9OwotICAgIGludFtdIHNmaXhlZDMycyA9IHstMTUsIC0xNn07Ci0gICAgbG9uZ1tdIGZpeGVkNjRzID0gezE3LCAxOH07Ci0gICAgbG9uZ1tdIHNmaXhlZDY0cyA9IHstMTksIC0yMH07Ci0gICAgYm9vbGVhbltdIGJvb2xzID0ge3RydWUsIGZhbHNlfTsKLSAgICBmbG9hdFtdIGZsb2F0cyA9IHsyLjFmLCAyLjJmfTsKLSAgICBkb3VibGVbXSBkb3VibGVzID0gezIuMywgMi40fTsKLSAgICBpbnRbXSBlbnVtcyA9IHtFeHRlbnNpb25zLlNFQ09ORF9WQUxVRSwgRXh0ZW5zaW9ucy5GSVJTVF9WQUxVRX07Ci0gICAgU3RyaW5nW10gc3RyaW5ncyA9IHsidmlqZmVudHdpbnRpZyIsICJ0d2VudHktc2l4In07Ci0gICAgYnl0ZVtdW10gYnl0ZXNzID0ge3syLCA3fSwgezIsIDh9fTsKLSAgICBBbm90aGVyTWVzc2FnZSBhbm90aGVyMSA9IG5ldyBBbm90aGVyTWVzc2FnZSgpOwotICAgIGFub3RoZXIxLnN0cmluZyA9ICJlciBzaGkgaml1IjsKLSAgICBhbm90aGVyMS52YWx1ZSA9IGZhbHNlOwotICAgIEFub3RoZXJNZXNzYWdlIGFub3RoZXIyID0gbmV3IEFub3RoZXJNZXNzYWdlKCk7Ci0gICAgYW5vdGhlcjIuc3RyaW5nID0gInRyZW50ZSI7Ci0gICAgYW5vdGhlcjIudmFsdWUgPSB0cnVlOwotICAgIEFub3RoZXJNZXNzYWdlW10gbWVzc2FnZXMgPSB7YW5vdGhlcjEsIGFub3RoZXIyfTsKLSAgICBSZXBlYXRlZEV4dGVuc2lvbnMuUmVwZWF0ZWRHcm91cCBncm91cDEgPSBuZXcgUmVwZWF0ZWRFeHRlbnNpb25zLlJlcGVhdGVkR3JvdXAoKTsKLSAgICBncm91cDEuYSA9IDMxOwotICAgIFJlcGVhdGVkRXh0ZW5zaW9ucy5SZXBlYXRlZEdyb3VwIGdyb3VwMiA9IG5ldyBSZXBlYXRlZEV4dGVuc2lvbnMuUmVwZWF0ZWRHcm91cCgpOwotICAgIGdyb3VwMi5hID0gMzI7Ci0gICAgUmVwZWF0ZWRFeHRlbnNpb25zLlJlcGVhdGVkR3JvdXBbXSBncm91cHMgPSB7Z3JvdXAxLCBncm91cDJ9OwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEludDMyKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkSW50MzIsIGludDMycyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRJbnQzMikpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQzMikpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQzMiwgdWludDMycyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRVaW50MzIpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTaW50MzIsIHNpbnQzMnMpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEludDY0KSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkSW50NjQsIGludDY0cyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRJbnQ2NCkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQ2NCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQ2NCwgdWludDY0cyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRVaW50NjQpKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTaW50NjQpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTaW50NjQsIHNpbnQ2NHMpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU2ludDY0KSk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRml4ZWQzMikpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkMzIsIGZpeGVkMzJzKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkMzIpKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTZml4ZWQzMikpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNmaXhlZDMyLCBzZml4ZWQzMnMpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU2ZpeGVkMzIpKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGaXhlZDY0KSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRml4ZWQ2NCwgZml4ZWQ2NHMpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRml4ZWQ2NCkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNmaXhlZDY0KSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU2ZpeGVkNjQsIHNmaXhlZDY0cyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTZml4ZWQ2NCkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEJvb2wpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRCb29sLCBib29scyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRCb29sKSk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRmxvYXQpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGbG9hdCwgZmxvYXRzKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZsb2F0KSk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRG91YmxlKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRG91YmxlLCBkb3VibGVzKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZERvdWJsZSkpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEVudW0pKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRFbnVtLCBlbnVtcyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRFbnVtKSk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU3RyaW5nKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU3RyaW5nLCBzdHJpbmdzKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFN0cmluZykpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEJ5dGVzKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkQnl0ZXMsIGJ5dGVzcyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRCeXRlcykpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZE1lc3NhZ2UpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRNZXNzYWdlLCBtZXNzYWdlcyk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkR3JvdXApKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRHcm91cCwgZ3JvdXBzKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEdyb3VwKSk7Ci0KLSAgICBieXRlW10gZGF0YSA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1lc3NhZ2UpOwotICAgIG1lc3NhZ2UgPSBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlLnBhcnNlRnJvbShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgbWVzc2FnZS5maWVsZCk7Ci0KLSAgICAvLyBUZXN0IHJlYWRpbmcgYmFjayB1c2luZyBTaW5ndWxhckV4dGVuc2lvbnM6IHRoZSByZXRyaWV2ZWQgdmFsdWUgc2hvdWxkIGVxdWFsIHRoZSBsYXN0Ci0gICAgLy8gaW4gZWFjaCBhcnJheS4KLSAgICBhc3NlcnRFcXVhbHMoaW50MzJzWzFdLCAoaW50KSBtZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZUludDMyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHVpbnQzMnNbMV0sIChpbnQpIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lVWludDMyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbnQzMnNbMV0sIChpbnQpIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lU2ludDMyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGludDY0c1sxXSwgKGxvbmcpIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lSW50NjQpKTsKLSAgICBhc3NlcnRFcXVhbHModWludDY0c1sxXSwgKGxvbmcpIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lVWludDY0KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNpbnQ2NHNbMV0sIChsb25nKSBtZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZVNpbnQ2NCkpOwotICAgIGFzc2VydEVxdWFscyhmaXhlZDMyc1sxXSwgKGludCkgbWVzc2FnZS5nZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVGaXhlZDMyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNmaXhlZDMyc1sxXSwgKGludCkgbWVzc2FnZS5nZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVTZml4ZWQzMikpOwotICAgIGFzc2VydEVxdWFscyhmaXhlZDY0c1sxXSwgKGxvbmcpIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lRml4ZWQ2NCkpOwotICAgIGFzc2VydEVxdWFscyhzZml4ZWQ2NHNbMV0sIChsb25nKSBtZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZVNmaXhlZDY0KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGJvb2xzWzFdLCAoYm9vbGVhbikgbWVzc2FnZS5nZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVCb29sKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZsb2F0c1sxXSwgKGZsb2F0KSBtZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZUZsb2F0KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGRvdWJsZXNbMV0sIChkb3VibGUpIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lRG91YmxlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGVudW1zWzFdLCAoaW50KSBtZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZUVudW0pKTsKLSAgICBhc3NlcnRFcXVhbHMoc3RyaW5nc1sxXSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVTdHJpbmcpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZXNzWzFdLCBtZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZUJ5dGVzKSkpOwotICAgIEFub3RoZXJNZXNzYWdlIGRlc2VyaWFsaXplZE1lc3NhZ2UgPSBtZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZU1lc3NhZ2UpOwotICAgIGFzc2VydEVxdWFscyhhbm90aGVyMi5zdHJpbmcsIGRlc2VyaWFsaXplZE1lc3NhZ2Uuc3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoYW5vdGhlcjIudmFsdWUsIGRlc2VyaWFsaXplZE1lc3NhZ2UudmFsdWUpOwotICAgIGFzc2VydEVxdWFscyhncm91cDIuYSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVHcm91cCkuYSk7Ci0KLSAgICAvLyBUZXN0IHJlYWRpbmcgYmFjayB1c2luZyBSZXBlYXRlZEV4dGVuc2lvbnM6IHRoZSBhcnJheXMgc2hvdWxkIGJlIGVxdWFsLgotICAgIG1lc3NhZ2UgPSBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlLnBhcnNlRnJvbShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgbWVzc2FnZS5maWVsZCk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGludDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkSW50MzIpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHVpbnQzMnMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQzMikpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoc2ludDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU2ludDMyKSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhpbnQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEludDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh1aW50NjRzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRVaW50NjQpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHNpbnQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNpbnQ2NCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZml4ZWQzMnMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkMzIpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHNmaXhlZDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU2ZpeGVkMzIpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGZpeGVkNjRzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGaXhlZDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhzZml4ZWQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNmaXhlZDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhib29scywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkQm9vbCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZmxvYXRzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGbG9hdCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZG91YmxlcywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRG91YmxlKSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbnVtcywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRW51bSkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoc3RyaW5ncywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU3RyaW5nKSkpOwotICAgIGJ5dGVbXVtdIGRlc2VyaWFsaXplZFJlcGVhdGVkQnl0ZXMgPSBtZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRCeXRlcyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGRlc2VyaWFsaXplZFJlcGVhdGVkQnl0ZXMubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZXNzWzBdLCBkZXNlcmlhbGl6ZWRSZXBlYXRlZEJ5dGVzWzBdKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJ5dGVzc1sxXSwgZGVzZXJpYWxpemVkUmVwZWF0ZWRCeXRlc1sxXSkpOwotICAgIEFub3RoZXJNZXNzYWdlW10gZGVzZXJpYWxpemVkUmVwZWF0ZWRNZXNzYWdlID0KLSAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkTWVzc2FnZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGRlc2VyaWFsaXplZFJlcGVhdGVkTWVzc2FnZS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhhbm90aGVyMS5zdHJpbmcsIGRlc2VyaWFsaXplZFJlcGVhdGVkTWVzc2FnZVswXS5zdHJpbmcpOwotICAgIGFzc2VydEVxdWFscyhhbm90aGVyMS52YWx1ZSwgZGVzZXJpYWxpemVkUmVwZWF0ZWRNZXNzYWdlWzBdLnZhbHVlKTsKLSAgICBhc3NlcnRFcXVhbHMoYW5vdGhlcjIuc3RyaW5nLCBkZXNlcmlhbGl6ZWRSZXBlYXRlZE1lc3NhZ2VbMV0uc3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoYW5vdGhlcjIudmFsdWUsIGRlc2VyaWFsaXplZFJlcGVhdGVkTWVzc2FnZVsxXS52YWx1ZSk7Ci0gICAgUmVwZWF0ZWRFeHRlbnNpb25zLlJlcGVhdGVkR3JvdXBbXSBkZXNlcmlhbGl6ZWRSZXBlYXRlZEdyb3VwID0KLSAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkR3JvdXApOwotICAgIGFzc2VydEVxdWFscygyLCBkZXNlcmlhbGl6ZWRSZXBlYXRlZEdyb3VwLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGdyb3VwMS5hLCBkZXNlcmlhbGl6ZWRSZXBlYXRlZEdyb3VwWzBdLmEpOwotICAgIGFzc2VydEVxdWFscyhncm91cDIuYSwgZGVzZXJpYWxpemVkUmVwZWF0ZWRHcm91cFsxXS5hKTsKLQotICAgIG1lc3NhZ2UgPSBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlLnBhcnNlRnJvbShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgbWVzc2FnZS5maWVsZCk7Ci0gICAgLy8gVGVzdCBoYXNFeHRlbnNpb24gdXNpbmcgUGFja2VkRXh0ZW5zaW9ucy4KLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkSW50MzIpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkVWludDMyKSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZFNpbnQzMikpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRJbnQ2NCkpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRVaW50NjQpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkU2ludDY0KSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEZpeGVkMzIpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkU2ZpeGVkMzIpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkRml4ZWQ2NCkpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRTZml4ZWQ2NCkpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRCb29sKSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEZsb2F0KSk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZERvdWJsZSkpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRFbnVtKSk7Ci0KLSAgICAvLyBUZXN0IHJlYWRpbmcgYmFjayB1c2luZyBQYWNrZWRFeHRlbnNpb25zOiB0aGUgYXJyYXlzIHNob3VsZCBiZSBlcXVhbCwgZXZlbiB0aGUgZmllbGRzCi0gICAgLy8gYXJlIG5vbi1wYWNrZWQuCi0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGludDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRJbnQzMikpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHModWludDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRVaW50MzIpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHNpbnQzMnMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkU2ludDMyKSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhpbnQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkSW50NjQpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHVpbnQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkVWludDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhzaW50NjRzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZFNpbnQ2NCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZml4ZWQzMnMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkRml4ZWQzMikpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoc2ZpeGVkMzJzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZFNmaXhlZDMyKSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhmaXhlZDY0cywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRGaXhlZDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhzZml4ZWQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkU2ZpeGVkNjQpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGJvb2xzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEJvb2wpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGZsb2F0cywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRGbG9hdCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZG91YmxlcywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWREb3VibGUpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGVudW1zLCBtZXNzYWdlLmdldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEVudW0pKSk7Ci0KLSAgICAvLyBOb3cgc2V0IHRoZSBwYWNrYWJsZSBleHRlbnNpb24gdmFsdWVzIHVzaW5nIFBhY2tlZEV4dGVuc2lvbnMgc28gdGhleSdyZSBzZXJpYWxpemVkIHBhY2tlZC4KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEludDMyLCBpbnQzMnMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkVWludDMyLCB1aW50MzJzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZFNpbnQzMiwgc2ludDMycyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRJbnQ2NCwgaW50NjRzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZFVpbnQ2NCwgdWludDY0cyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRTaW50NjQsIHNpbnQ2NHMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkRml4ZWQzMiwgZml4ZWQzMnMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkU2ZpeGVkMzIsIHNmaXhlZDMycyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRGaXhlZDY0LCBmaXhlZDY0cyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oUGFja2VkRXh0ZW5zaW9ucy5wYWNrZWRTZml4ZWQ2NCwgc2ZpeGVkNjRzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEJvb2wsIGJvb2xzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEZsb2F0LCBmbG9hdHMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFBhY2tlZEV4dGVuc2lvbnMucGFja2VkRG91YmxlLCBkb3VibGVzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihQYWNrZWRFeHRlbnNpb25zLnBhY2tlZEVudW0sIGVudW1zKTsKLQotICAgIC8vIEFuZCByZWFkIGJhY2sgdXNpbmcgbm9uLXBhY2tlZCBSZXBlYXRlZEV4dGVuc2lvbnMuCi0gICAgYnl0ZVtdIGRhdGEyID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobWVzc2FnZSk7Ci0gICAgbWVzc2FnZSA9IE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShuZXcgRXh0ZW5zaW9ucy5FeHRlbmRhYmxlTWVzc2FnZSgpLCBkYXRhMik7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGludDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkSW50MzIpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHVpbnQzMnMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQzMikpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoc2ludDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU2ludDMyKSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhpbnQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEludDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyh1aW50NjRzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRVaW50NjQpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHNpbnQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNpbnQ2NCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZml4ZWQzMnMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkMzIpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKHNmaXhlZDMycywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkU2ZpeGVkMzIpKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKGZpeGVkNjRzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGaXhlZDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhzZml4ZWQ2NHMsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNmaXhlZDY0KSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhib29scywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkQm9vbCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZmxvYXRzLCBtZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGbG9hdCkpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoZG91YmxlcywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRG91YmxlKSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhlbnVtcywgbWVzc2FnZS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkRW51bSkpKTsKLQotICAgIC8vIENsb25lIHRoZSBtZXNzYWdlIGFuZCBlbnN1cmUgaXQncyBzdGlsbCBlcXVhbC4KLSAgICBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlIGNsb25lID0gbWVzc2FnZS5jbG9uZSgpOwotICAgIGFzc2VydEVxdWFscyhjbG9uZSwgbWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TnVsbEV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBDaGVjayB0aGF0IGNsZWFyaW5nIHRoZSBleHRlbnNpb24gb24gYW4gZW1wdHkgbWVzc2FnZSBpcyBhIG5vLW9wLgotICAgIEV4dGVuc2lvbnMuRXh0ZW5kYWJsZU1lc3NhZ2UgbWVzc2FnZSA9IG5ldyBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlKCk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVNZXNzYWdlKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVNZXNzYWdlLCBudWxsKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZU1lc3NhZ2UpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobWVzc2FnZSkubGVuZ3RoKTsKLQotICAgIC8vIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgaXMgZW1wdHkgYWZ0ZXIgc2V0dGluZyBhbmQgY2xlYXJpbmcgYW4gZXh0ZW5zaW9uLgotICAgIEFub3RoZXJNZXNzYWdlIGFub3RoZXIgPSBuZXcgQW5vdGhlck1lc3NhZ2UoKTsKLSAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZU1lc3NhZ2UpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZU1lc3NhZ2UsIGFub3RoZXIpOwotICAgIGFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVNZXNzYWdlKSk7Ci0gICAgYXNzZXJ0VHJ1ZShNZXNzYWdlTmFuby50b0J5dGVBcnJheShtZXNzYWdlKS5sZW5ndGggPiAwKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZU1lc3NhZ2UsIG51bGwpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lTWVzc2FnZSkpOwotICAgIGFzc2VydEVxdWFscygwLCBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtZXNzYWdlKS5sZW5ndGgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbnNNdXRhdGlvbigpIHsKLSAgICBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlIGV4dGVuZGFibGVNZXNzYWdlID0gbmV3IEV4dGVuc2lvbnMuRXh0ZW5kYWJsZU1lc3NhZ2UoKTsKLSAgICBleHRlbmRhYmxlTWVzc2FnZS5zZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVNZXNzYWdlLAotICAgICAgICBuZXcgRXh0ZW5zaW9ucy5Bbm90aGVyTWVzc2FnZSgpKTsKLQotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZU1lc3NhZ2UpLnN0cmluZyA9ICJub3QgZW1wdHkiOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJub3QgZW1wdHkiLAotICAgICAgICBleHRlbmRhYmxlTWVzc2FnZS5nZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVNZXNzYWdlKS5zdHJpbmcpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbnNNdXRhdGlvbl9FcXVhbHMoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyTmFub0V4Y2VwdGlvbiB7Ci0gICAgRXh0ZW5zaW9ucy5FeHRlbmRhYmxlTWVzc2FnZSBleHRlbmRhYmxlTWVzc2FnZSA9IG5ldyBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlKCk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZmllbGQgPSA1OwotICAgIGludCBpbnQzMiA9IDQyOwotICAgIGludFtdIHVpbnQzMnMgPSB7MywgNH07Ci0gICAgaW50W10gc2ludDMycyA9IHstNSwgLTZ9OwotICAgIGxvbmdbXSBpbnQ2NHMgPSB7NywgOH07Ci0gICAgbG9uZ1tdIHVpbnQ2NHMgPSB7OSwgMTB9OwotICAgIGxvbmdbXSBzaW50NjRzID0gey0xMSwgLTEyfTsKLSAgICBpbnRbXSBmaXhlZDMycyA9IHsxMywgMTR9OwotICAgIGludFtdIHNmaXhlZDMycyA9IHstMTUsIC0xNn07Ci0gICAgbG9uZ1tdIGZpeGVkNjRzID0gezE3LCAxOH07Ci0gICAgbG9uZ1tdIHNmaXhlZDY0cyA9IHstMTksIC0yMH07Ci0gICAgYm9vbGVhbltdIGJvb2xzID0ge3RydWUsIGZhbHNlfTsKLSAgICBmbG9hdFtdIGZsb2F0cyA9IHsyLjFmLCAyLjJmfTsKLSAgICBkb3VibGVbXSBkb3VibGVzID0gezIuMywgMi40fTsKLSAgICBpbnRbXSBlbnVtcyA9IHtFeHRlbnNpb25zLlNFQ09ORF9WQUxVRSwgRXh0ZW5zaW9ucy5GSVJTVF9WQUxVRX07Ci0gICAgU3RyaW5nW10gc3RyaW5ncyA9IHsidmlqZmVudHdpbnRpZyIsICJ0d2VudHktc2l4In07Ci0gICAgYnl0ZVtdW10gYnl0ZXNzID0ge3syLCA3fSwgezIsIDh9fTsKLSAgICBBbm90aGVyTWVzc2FnZSBhbm90aGVyMSA9IG5ldyBBbm90aGVyTWVzc2FnZSgpOwotICAgIGFub3RoZXIxLnN0cmluZyA9ICJlciBzaGkgaml1IjsKLSAgICBhbm90aGVyMS52YWx1ZSA9IGZhbHNlOwotICAgIEFub3RoZXJNZXNzYWdlIGFub3RoZXIyID0gbmV3IEFub3RoZXJNZXNzYWdlKCk7Ci0gICAgYW5vdGhlcjIuc3RyaW5nID0gInRyZW50ZSI7Ci0gICAgYW5vdGhlcjIudmFsdWUgPSB0cnVlOwotICAgIEFub3RoZXJNZXNzYWdlW10gbWVzc2FnZXMgPSB7YW5vdGhlcjEsIGFub3RoZXIyfTsKLSAgICBSZXBlYXRlZEV4dGVuc2lvbnMuUmVwZWF0ZWRHcm91cCBncm91cDEgPSBuZXcgUmVwZWF0ZWRFeHRlbnNpb25zLlJlcGVhdGVkR3JvdXAoKTsKLSAgICBncm91cDEuYSA9IDMxOwotICAgIFJlcGVhdGVkRXh0ZW5zaW9ucy5SZXBlYXRlZEdyb3VwIGdyb3VwMiA9IG5ldyBSZXBlYXRlZEV4dGVuc2lvbnMuUmVwZWF0ZWRHcm91cCgpOwotICAgIGdyb3VwMi5hID0gMzI7Ci0gICAgUmVwZWF0ZWRFeHRlbnNpb25zLlJlcGVhdGVkR3JvdXBbXSBncm91cHMgPSB7Z3JvdXAxLCBncm91cDJ9OwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZUludDMyLCBpbnQzMik7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQzMiwgdWludDMycyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNpbnQzMiwgc2ludDMycyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEludDY0LCBpbnQ2NHMpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRVaW50NjQsIHVpbnQ2NHMpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTaW50NjQsIHNpbnQ2NHMpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGaXhlZDMyLCBmaXhlZDMycyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNmaXhlZDMyLCBzZml4ZWQzMnMpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGaXhlZDY0LCBmaXhlZDY0cyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNmaXhlZDY0LCBzZml4ZWQ2NHMpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRCb29sLCBib29scyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZsb2F0LCBmbG9hdHMpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWREb3VibGUsIGRvdWJsZXMpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRFbnVtLCBlbnVtcyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFN0cmluZywgc3RyaW5ncyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEJ5dGVzLCBieXRlc3MpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLnNldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRNZXNzYWdlLCBtZXNzYWdlcyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEdyb3VwLCBncm91cHMpOwotCi0gICAgYnl0ZVtdIGRhdGEgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShleHRlbmRhYmxlTWVzc2FnZSk7Ci0KLSAgICBleHRlbmRhYmxlTWVzc2FnZSA9IEV4dGVuc2lvbnMuRXh0ZW5kYWJsZU1lc3NhZ2UucGFyc2VGcm9tKGRhdGEpOwotICAgIEV4dGVuc2lvbnMuRXh0ZW5kYWJsZU1lc3NhZ2UgbWVzc2FnZUNvcHkgPSBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlLnBhcnNlRnJvbShkYXRhKTsKLQotICAgIC8vIFdpdGhvdXQgZGVzZXJpYWxpc2luZy4KLSAgICBhc3NlcnRFcXVhbHMoZXh0ZW5kYWJsZU1lc3NhZ2UsIG1lc3NhZ2VDb3B5KTsKLSAgICBhc3NlcnRFcXVhbHMoZXh0ZW5kYWJsZU1lc3NhZ2UuaGFzaENvZGUoKSwgbWVzc2FnZUNvcHkuaGFzaENvZGUoKSk7Ci0KLSAgICAvLyBPbmx5IG9uZSBkZXNlcmlhbGl6ZWQuCi0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lSW50MzIpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRVaW50MzIpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTaW50MzIpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRJbnQ2NCk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQ2NCk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNpbnQ2NCk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkMzIpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTZml4ZWQzMik7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkNjQpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTZml4ZWQ2NCk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEJvb2wpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGbG9hdCk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZERvdWJsZSk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEVudW0pOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTdHJpbmcpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRCeXRlcyk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZE1lc3NhZ2UpOwotICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRHcm91cCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4dGVuZGFibGVNZXNzYWdlLCBtZXNzYWdlQ29weSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4dGVuZGFibGVNZXNzYWdlLmhhc2hDb2RlKCksIG1lc3NhZ2VDb3B5Lmhhc2hDb2RlKCkpOwotCi0gICAgLy8gQm90aCBkZXNlcmlhbGl6ZWQuCi0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lSW50MzIpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRVaW50MzIpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTaW50MzIpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRJbnQ2NCk7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFVpbnQ2NCk7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZFNpbnQ2NCk7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkMzIpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTZml4ZWQzMik7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEZpeGVkNjQpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTZml4ZWQ2NCk7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEJvb2wpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRGbG9hdCk7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZERvdWJsZSk7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZEVudW0pOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRTdHJpbmcpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRCeXRlcyk7Ci0gICAgbWVzc2FnZUNvcHkuZ2V0RXh0ZW5zaW9uKFJlcGVhdGVkRXh0ZW5zaW9ucy5yZXBlYXRlZE1lc3NhZ2UpOwotICAgIG1lc3NhZ2VDb3B5LmdldEV4dGVuc2lvbihSZXBlYXRlZEV4dGVuc2lvbnMucmVwZWF0ZWRHcm91cCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4dGVuZGFibGVNZXNzYWdlLCBtZXNzYWdlQ29weSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4dGVuZGFibGVNZXNzYWdlLmhhc2hDb2RlKCksIG1lc3NhZ2VDb3B5Lmhhc2hDb2RlKCkpOwotCi0gICAgLy8gQ2hhbmdlIG9uZSwgbWFrZSBzdXJlIHRoZXkgYXJlIHN0aWxsIGRpZmZlcmVudC4KLSAgICBtZXNzYWdlQ29weS5nZXRFeHRlbnNpb24oUmVwZWF0ZWRFeHRlbnNpb25zLnJlcGVhdGVkTWVzc2FnZSlbMF0uc3RyaW5nID0gIm5vdCBlbXB0eSI7Ci0gICAgYXNzZXJ0RmFsc2UoZXh0ZW5kYWJsZU1lc3NhZ2UuZXF1YWxzKG1lc3NhZ2VDb3B5KSk7Ci0KLSAgICAvLyBFdmVuIGlmIHRoZSBleHRlbnNpb24gaGFzbid0IGJlZW4gZGVzZXJpYWxpemVkLgotICAgIGV4dGVuZGFibGVNZXNzYWdlID0gRXh0ZW5zaW9ucy5FeHRlbmRhYmxlTWVzc2FnZS5wYXJzZUZyb20oZGF0YSk7Ci0gICAgYXNzZXJ0RmFsc2UoZXh0ZW5kYWJsZU1lc3NhZ2UuZXF1YWxzKG1lc3NhZ2VDb3B5KSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uc0NhY2hpbmcoKSB7Ci0gICAgRXh0ZW5zaW9ucy5FeHRlbmRhYmxlTWVzc2FnZSBleHRlbmRhYmxlTWVzc2FnZSA9IG5ldyBFeHRlbnNpb25zLkV4dGVuZGFibGVNZXNzYWdlKCk7Ci0gICAgZXh0ZW5kYWJsZU1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKFNpbmd1bGFyRXh0ZW5zaW9ucy5zb21lTWVzc2FnZSwKLSAgICAgICAgbmV3IEV4dGVuc2lvbnMuQW5vdGhlck1lc3NhZ2UoKSk7Ci0gICAgYXNzZXJ0U2FtZSgiQ29uc2VjdXRpdmUgY2FsbHMgdG8gZ2V0RXh0ZW5zaW9ucyBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIG9iamVjdCIsCi0gICAgICAgIGV4dGVuZGFibGVNZXNzYWdlLmdldEV4dGVuc2lvbihTaW5ndWxhckV4dGVuc2lvbnMuc29tZU1lc3NhZ2UpLAotICAgICAgICBleHRlbmRhYmxlTWVzc2FnZS5nZXRFeHRlbnNpb24oU2luZ3VsYXJFeHRlbnNpb25zLnNvbWVNZXNzYWdlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkZpZWxkcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIENoZWNrIHRoYXQgd2Ugcm91bmR0cmlwIChzZXJpYWxpemUgYW5kIGRlc2VyaWFsaXplKSB1bnJlY29nbml6ZWQgZmllbGRzLgotICAgIEFub3RoZXJNZXNzYWdlIG1lc3NhZ2UgPSBuZXcgQW5vdGhlck1lc3NhZ2UoKTsKLSAgICBtZXNzYWdlLnN0cmluZyA9ICJIZWxsbyBXb3JsZCI7Ci0gICAgbWVzc2FnZS52YWx1ZSA9IGZhbHNlOwotCi0gICAgYnl0ZVtdIGJ5dGVzID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobWVzc2FnZSk7Ci0gICAgaW50IGV4dHJhRmllbGRTaXplID0gQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5jb21wdXRlU3RyaW5nU2l6ZSgKLSAgICAgICAgMTAwMSwgIlRoaXMgaXMgYW4gdW5rbm93biBmaWVsZCIpOwotICAgIGJ5dGVbXSBuZXdCeXRlcyA9IG5ldyBieXRlW2J5dGVzLmxlbmd0aCArIGV4dHJhRmllbGRTaXplXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGJ5dGVzLCAwLCBuZXdCeXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgICBDb2RlZE91dHB1dEJ5dGVCdWZmZXJOYW5vLm5ld0luc3RhbmNlKG5ld0J5dGVzLCBieXRlcy5sZW5ndGgsIGV4dHJhRmllbGRTaXplKQotICAgICAgICAud3JpdGVTdHJpbmcoMTAwMSwgIlRoaXMgaXMgYW4gdW5rbm93biBmaWVsZCIpOwotCi0gICAgLy8gRGVzZXJpYWxpemUgd2l0aCBhbiB1bmtub3duIGZpZWxkLgotICAgIEFub3RoZXJNZXNzYWdlIGRlc2VyaWFsaXplZCA9IEFub3RoZXJNZXNzYWdlLnBhcnNlRnJvbShuZXdCeXRlcyk7Ci0gICAgYnl0ZVtdIHNlcmlhbGl6ZWQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShkZXNlcmlhbGl6ZWQpOwotCi0gICAgYXNzZXJ0RXF1YWxzKG5ld0J5dGVzLmxlbmd0aCwgc2VyaWFsaXplZC5sZW5ndGgpOwotCi0gICAgLy8gQ2xlYXIsIGFuZCBtYWtlIHN1cmUgaXQgY2xlYXJzIGV2ZXJ5dGhpbmcuCi0gICAgZGVzZXJpYWxpemVkLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KGRlc2VyaWFsaXplZCkubGVuZ3RoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTaW1wbGVNZXNzYWdlTmFubyBtZXNzYWdlID0gbmV3IFNpbXBsZU1lc3NhZ2VOYW5vKCk7Ci0gICAgbWVzc2FnZS5kID0gMTIzOwotICAgIGJ5dGVbXSBieXRlcyA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1lc3NhZ2UpOwotCi0gICAgU2ltcGxlTWVzc2FnZU5hbm8gbmV3TWVzc2FnZSA9IE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShuZXcgU2ltcGxlTWVzc2FnZU5hbm8oKSwgYnl0ZXMpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmQsIG5ld01lc3NhZ2UuZCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SmF2YUtleXdvcmQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1zZyA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbXNnLnN5bmNocm9uaXplZF8gPSAxMjM7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbXNnLnN5bmNocm9uaXplZF8pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlZmVyZW5jZVR5cGVzRm9yUHJpbWl0aXZlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vIG1lc3NhZ2UgPSBuZXcgTmFub1JlZmVyZW5jZVR5cGVzLlRlc3RBbGxUeXBlc05hbm8oKTsKLQotICAgIC8vIEJhc2UgY2hlY2sgLSB3aGVuIG5vdGhpbmcgaXMgc2V0LCB3ZSBzZXJpYWxpemUgbm90aGluZy4KLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCBmYWxzZSk7Ci0KLSAgICBtZXNzYWdlLmRlZmF1bHRCb29sID0gdHJ1ZTsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCB0cnVlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdEJvb2wgPSBmYWxzZTsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCB0cnVlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdEJvb2wgPSBudWxsOwotICAgIGFzc2VydEhhc1dpcmVEYXRhKG1lc3NhZ2UsIGZhbHNlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdEludDMyID0gNTsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCB0cnVlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdEludDMyID0gbnVsbDsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCBmYWxzZSk7Ci0KLSAgICBtZXNzYWdlLmRlZmF1bHRJbnQ2NCA9IDEyMzQ1Nkw7Ci0gICAgYXNzZXJ0SGFzV2lyZURhdGEobWVzc2FnZSwgdHJ1ZSk7Ci0KLSAgICBtZXNzYWdlLmRlZmF1bHRJbnQ2NCA9IG51bGw7Ci0gICAgYXNzZXJ0SGFzV2lyZURhdGEobWVzc2FnZSwgZmFsc2UpOwotCi0gICAgbWVzc2FnZS5kZWZhdWx0RmxvYXQgPSAxZjsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCB0cnVlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdEZsb2F0ID0gbnVsbDsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCBmYWxzZSk7Ci0KLSAgICBtZXNzYWdlLmRlZmF1bHREb3VibGUgPSAyLjE7Ci0gICAgYXNzZXJ0SGFzV2lyZURhdGEobWVzc2FnZSwgdHJ1ZSk7Ci0KLSAgICBtZXNzYWdlLmRlZmF1bHREb3VibGUgPSBudWxsOwotICAgIGFzc2VydEhhc1dpcmVEYXRhKG1lc3NhZ2UsIGZhbHNlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdFN0cmluZyA9ICJoZWxsbyI7Ci0gICAgYXNzZXJ0SGFzV2lyZURhdGEobWVzc2FnZSwgdHJ1ZSk7Ci0KLSAgICBtZXNzYWdlLmRlZmF1bHRTdHJpbmcgPSBudWxsOwotICAgIGFzc2VydEhhc1dpcmVEYXRhKG1lc3NhZ2UsIGZhbHNlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdEJ5dGVzID0gbmV3IGJ5dGVbXSB7IDEsIDIsIDMgfTsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCB0cnVlKTsKLQotICAgIG1lc3NhZ2UuZGVmYXVsdEJ5dGVzID0gbnVsbDsKLSAgICBhc3NlcnRIYXNXaXJlRGF0YShtZXNzYWdlLCBmYWxzZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SGFzaENvZGVFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBDb21wbGV0ZSBlcXVhbGl0eToKLSAgICBUZXN0QWxsVHlwZXNOYW5vIGEgPSBjcmVhdGVNZXNzYWdlRm9ySGFzaENvZGVFcXVhbHNUZXN0KCk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBhRXF1aXZhbGVudCA9IGNyZWF0ZU1lc3NhZ2VGb3JIYXNoQ29kZUVxdWFsc1Rlc3QoKTsKLQotICAgIGFzc2VydFRydWUoTWVzc2FnZU5hbm8ubWVzc2FnZU5hbm9FcXVhbHMoYSwgYUVxdWl2YWxlbnQpKTsKLSAgICBhc3NlcnRGYWxzZShNZXNzYWdlTmFuby5tZXNzYWdlTmFub0VxdWFscyhhLCBuZXcgVGVzdEFsbFR5cGVzTmFubygpKSk7Ci0KLSAgICAvLyBOdWxsIGFuZCBlbXB0eSBhcnJheSBmb3IgcmVwZWF0ZWQgZmllbGRzIGVxdWFsaXR5OgotICAgIFRlc3RBbGxUeXBlc05hbm8gYiA9IGNyZWF0ZU1lc3NhZ2VGb3JIYXNoQ29kZUVxdWFsc1Rlc3QoKTsKLSAgICBiLnJlcGVhdGVkQm9vbCA9IG51bGw7Ci0gICAgYi5yZXBlYXRlZEZsb2F0ID0gbmV3IGZsb2F0WzBdOwotICAgIFRlc3RBbGxUeXBlc05hbm8gYkVxdWl2YWxlbnQgPSBjcmVhdGVNZXNzYWdlRm9ySGFzaENvZGVFcXVhbHNUZXN0KCk7Ci0gICAgYkVxdWl2YWxlbnQucmVwZWF0ZWRCb29sID0gbmV3IGJvb2xlYW5bMF07Ci0gICAgYkVxdWl2YWxlbnQucmVwZWF0ZWRGbG9hdCA9IG51bGw7Ci0KLSAgICAvLyBSZWYtZWxlbWVudC10eXBlIHJlcGVhdGVkIGZpZWxkcyB1c2Ugbm9uLW51bGwgc3Vic2VxdWVuY2UgZXF1YWxpdHk6Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBjID0gY3JlYXRlTWVzc2FnZUZvckhhc2hDb2RlRXF1YWxzVGVzdCgpOwotICAgIGMucmVwZWF0ZWRTdHJpbmcgPSBudWxsOwotICAgIGMucmVwZWF0ZWRTdHJpbmdQaWVjZSA9IG5ldyBTdHJpbmdbXSB7bnVsbCwgIm9uZSIsIG51bGwsICJ0d28ifTsKLSAgICBjLnJlcGVhdGVkQnl0ZXMgPSBuZXcgYnl0ZVtdW10ge3szLCA0fSwgbnVsbH07Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBjRXF1aXZhbGVudCA9IGNyZWF0ZU1lc3NhZ2VGb3JIYXNoQ29kZUVxdWFsc1Rlc3QoKTsKLSAgICBjRXF1aXZhbGVudC5yZXBlYXRlZFN0cmluZyA9IG5ldyBTdHJpbmdbM107Ci0gICAgY0VxdWl2YWxlbnQucmVwZWF0ZWRTdHJpbmdQaWVjZSA9IG5ldyBTdHJpbmdbXSB7Im9uZSIsICJ0d28iLCBudWxsfTsKLSAgICBjRXF1aXZhbGVudC5yZXBlYXRlZEJ5dGVzID0gbmV3IGJ5dGVbXVtdIHt7MywgNH19OwotCi0gICAgLy8gQ29tcGxldGUgZXF1YWxpdHkgZm9yIG1lc3NhZ2VzIHdpdGggaGFzIGZpZWxkczoKLSAgICBUZXN0QWxsVHlwZXNOYW5vSGFzIGQgPSBjcmVhdGVNZXNzYWdlV2l0aEhhc0Zvckhhc2hDb2RlRXF1YWxzVGVzdCgpOwotICAgIFRlc3RBbGxUeXBlc05hbm9IYXMgZEVxdWl2YWxlbnQgPSBjcmVhdGVNZXNzYWdlV2l0aEhhc0Zvckhhc2hDb2RlRXF1YWxzVGVzdCgpOwotCi0gICAgLy8gSWYgaGFzLWZpZWxkcyBleGlzdCwgZmllbGRzIHdpdGggdGhlIHNhbWUgZGVmYXVsdCB2YWx1ZXMgYnV0Ci0gICAgLy8gZGlmZmVyZW50IGhhcy1maWVsZCB2YWx1ZXMgYXJlIGRpZmZlcmVudC4KLSAgICBUZXN0QWxsVHlwZXNOYW5vSGFzIGUgPSBjcmVhdGVNZXNzYWdlV2l0aEhhc0Zvckhhc2hDb2RlRXF1YWxzVGVzdCgpOwotICAgIGUub3B0aW9uYWxJbnQzMisrOyAvLyBtYWtlIGRpZmZlcmVudCBmcm9tIGQKLSAgICBlLmhhc0RlZmF1bHRTdHJpbmcgPSBmYWxzZTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vSGFzIGVEaWZmZXJlbnQgPSBjcmVhdGVNZXNzYWdlV2l0aEhhc0Zvckhhc2hDb2RlRXF1YWxzVGVzdCgpOwotICAgIGVEaWZmZXJlbnQub3B0aW9uYWxJbnQzMiA9IGUub3B0aW9uYWxJbnQzMjsKLSAgICBlRGlmZmVyZW50Lmhhc0RlZmF1bHRTdHJpbmcgPSB0cnVlOwotCi0gICAgLy8gQ29tcGxldGUgZXF1YWxpdHkgZm9yIG1lc3NhZ2VzIHdpdGggYWNjZXNzb3JzOgotICAgIFRlc3ROYW5vQWNjZXNzb3JzIGYgPSBjcmVhdGVNZXNzYWdlV2l0aEFjY2Vzc29yc0Zvckhhc2hDb2RlRXF1YWxzVGVzdCgpOwotICAgIFRlc3ROYW5vQWNjZXNzb3JzIGZFcXVpdmFsZW50ID0gY3JlYXRlTWVzc2FnZVdpdGhBY2Nlc3NvcnNGb3JIYXNoQ29kZUVxdWFsc1Rlc3QoKTsKLQotICAgIC8vIElmIHVzaW5nIGFjY2Vzc29ycywgZXhwbGljaXRseSBzZXR0aW5nIGEgZmllbGQgdG8gaXRzIGRlZmF1bHQgdmFsdWUKLSAgICAvLyBzaG91bGQgbWFrZSB0aGUgbWVzc2FnZSBkaWZmZXJlbnQuCi0gICAgVGVzdE5hbm9BY2Nlc3NvcnMgZyA9IGNyZWF0ZU1lc3NhZ2VXaXRoQWNjZXNzb3JzRm9ySGFzaENvZGVFcXVhbHNUZXN0KCk7Ci0gICAgZy5zZXRPcHRpb25hbEludDMyKGcuZ2V0T3B0aW9uYWxJbnQzMigpICsgMSk7IC8vIG1ha2UgZGlmZmVyZW50IGZyb20gZgotICAgIGcuY2xlYXJEZWZhdWx0U3RyaW5nKCk7Ci0gICAgVGVzdE5hbm9BY2Nlc3NvcnMgZ0RpZmZlcmVudCA9IGNyZWF0ZU1lc3NhZ2VXaXRoQWNjZXNzb3JzRm9ySGFzaENvZGVFcXVhbHNUZXN0KCk7Ci0gICAgZ0RpZmZlcmVudC5zZXRPcHRpb25hbEludDMyKGcuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBnRGlmZmVyZW50LnNldERlZmF1bHRTdHJpbmcoZy5nZXREZWZhdWx0U3RyaW5nKCkpOwotCi0gICAgLy8gQ29tcGxldGUgZXF1YWxpdHkgZm9yIHJlZmVyZW5jZSB0eXBlZCBtZXNzYWdlczoKLSAgICBOYW5vUmVmZXJlbmNlVHlwZXMuVGVzdEFsbFR5cGVzTmFubyBoID0gY3JlYXRlUmVmVHlwZWRNZXNzYWdlRm9ySGFzaENvZGVFcXVhbHNUZXN0KCk7Ci0gICAgTmFub1JlZmVyZW5jZVR5cGVzLlRlc3RBbGxUeXBlc05hbm8gaEVxdWl2YWxlbnQgPSBjcmVhdGVSZWZUeXBlZE1lc3NhZ2VGb3JIYXNoQ29kZUVxdWFsc1Rlc3QoKTsKLQotICAgIC8vIEluZXF1YWxpdHkgb2YgbnVsbCBhbmQgZGVmYXVsdCB2YWx1ZSBmb3IgcmVmZXJlbmNlIHR5cGVkIG1lc3NhZ2VzOgotICAgIE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vIGkgPSBjcmVhdGVSZWZUeXBlZE1lc3NhZ2VGb3JIYXNoQ29kZUVxdWFsc1Rlc3QoKTsKLSAgICBpLm9wdGlvbmFsSW50MzIgPSAxOyAvLyBtYWtlIGRpZmZlcmVudCBmcm9tIGgKLSAgICBpLm9wdGlvbmFsRmxvYXQgPSBudWxsOwotICAgIE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vIGlEaWZmZXJlbnQgPSBjcmVhdGVSZWZUeXBlZE1lc3NhZ2VGb3JIYXNoQ29kZUVxdWFsc1Rlc3QoKTsKLSAgICBpRGlmZmVyZW50Lm9wdGlvbmFsSW50MzIgPSBpLm9wdGlvbmFsSW50MzI7Ci0gICAgaURpZmZlcmVudC5vcHRpb25hbEZsb2F0ID0gMC4wZjsKLQotICAgIEhhc2hNYXA8TWVzc2FnZU5hbm8sIFN0cmluZz4gaGFzaE1hcCA9IG5ldyBIYXNoTWFwPE1lc3NhZ2VOYW5vLCBTdHJpbmc+KCk7Ci0gICAgaGFzaE1hcC5wdXQoYSwgImEiKTsKLSAgICBoYXNoTWFwLnB1dChiLCAiYiIpOwotICAgIGhhc2hNYXAucHV0KGMsICJjIik7Ci0gICAgaGFzaE1hcC5wdXQoZCwgImQiKTsKLSAgICBoYXNoTWFwLnB1dChlLCAiZSIpOwotICAgIGhhc2hNYXAucHV0KGYsICJmIik7Ci0gICAgaGFzaE1hcC5wdXQoZywgImciKTsKLSAgICBoYXNoTWFwLnB1dChoLCAiaCIpOwotICAgIGhhc2hNYXAucHV0KGksICJpIik7Ci0KLSAgICBhc3NlcnRFcXVhbHMoOSwgaGFzaE1hcC5zaXplKCkpOyAvLyBhLWkgc2hvdWxkIGJlIGRpZmZlcmVudCBmcm9tIGVhY2ggb3RoZXIuCi0KLSAgICBhc3NlcnRFcXVhbHMoImEiLCBoYXNoTWFwLmdldChhKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJhIiwgaGFzaE1hcC5nZXQoYUVxdWl2YWxlbnQpKTsKLQotICAgIGFzc2VydEVxdWFscygiYiIsIGhhc2hNYXAuZ2V0KGIpKTsKLSAgICBhc3NlcnRFcXVhbHMoImIiLCBoYXNoTWFwLmdldChiRXF1aXZhbGVudCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJjIiwgaGFzaE1hcC5nZXQoYykpOwotICAgIGFzc2VydEVxdWFscygiYyIsIGhhc2hNYXAuZ2V0KGNFcXVpdmFsZW50KSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoImQiLCBoYXNoTWFwLmdldChkKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJkIiwgaGFzaE1hcC5nZXQoZEVxdWl2YWxlbnQpKTsKLQotICAgIGFzc2VydEVxdWFscygiZSIsIGhhc2hNYXAuZ2V0KGUpKTsKLSAgICBhc3NlcnROdWxsKGhhc2hNYXAuZ2V0KGVEaWZmZXJlbnQpKTsKLQotICAgIGFzc2VydEVxdWFscygiZiIsIGhhc2hNYXAuZ2V0KGYpKTsKLSAgICBhc3NlcnRFcXVhbHMoImYiLCBoYXNoTWFwLmdldChmRXF1aXZhbGVudCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJnIiwgaGFzaE1hcC5nZXQoZykpOwotICAgIGFzc2VydE51bGwoaGFzaE1hcC5nZXQoZ0RpZmZlcmVudCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJoIiwgaGFzaE1hcC5nZXQoaCkpOwotICAgIGFzc2VydEVxdWFscygiaCIsIGhhc2hNYXAuZ2V0KGhFcXVpdmFsZW50KSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoImkiLCBoYXNoTWFwLmdldChpKSk7Ci0gICAgYXNzZXJ0TnVsbChoYXNoTWFwLmdldChpRGlmZmVyZW50KSk7Ci0gIH0KLQotICBwcml2YXRlIFRlc3RBbGxUeXBlc05hbm8gY3JlYXRlTWVzc2FnZUZvckhhc2hDb2RlRXF1YWxzVGVzdCgpIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1lc3NhZ2Uub3B0aW9uYWxJbnQzMiA9IDU7Ci0gICAgbWVzc2FnZS5vcHRpb25hbEludDY0ID0gNzc3OwotICAgIG1lc3NhZ2Uub3B0aW9uYWxGbG9hdCA9IDEuMGY7Ci0gICAgbWVzc2FnZS5vcHRpb25hbERvdWJsZSA9IDIuMDsKLSAgICBtZXNzYWdlLm9wdGlvbmFsQm9vbCA9IHRydWU7Ci0gICAgbWVzc2FnZS5vcHRpb25hbFN0cmluZyA9ICJIZWxsbyI7Ci0gICAgbWVzc2FnZS5vcHRpb25hbEJ5dGVzID0gbmV3IGJ5dGVbXSB7IDEsIDIsIDMgfTsKLSAgICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5iYiA9IDI3OwotICAgIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRFbnVtID0gVGVzdEFsbFR5cGVzTmFuby5CQVI7Ci0gICAgbWVzc2FnZS5yZXBlYXRlZEludDMyID0gbmV3IGludFtdIHsgNSwgNiwgNywgOCB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWRJbnQ2NCA9IG5ldyBsb25nW10geyAyN0wsIDI4TCwgMjlMIH07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZEZsb2F0ID0gbmV3IGZsb2F0W10geyA1LjBmLCA2LjBmIH07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZERvdWJsZSA9IG5ldyBkb3VibGVbXSB7IDk5LjEsIDIyLjUgfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkQm9vbCA9IG5ldyBib29sZWFuW10geyB0cnVlLCBmYWxzZSwgdHJ1ZSB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWRTdHJpbmcgPSBuZXcgU3RyaW5nW10geyAiT25lIiwgIlR3byIgfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkQnl0ZXMgPSBuZXcgYnl0ZVtdW10geyB7IDIsIDcgfSwgeyAyLCA3IH0gfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2VbXSB7Ci0gICAgICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSwKLSAgICAgIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlCi0gICAgfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7Ci0gICAgICBUZXN0QWxsVHlwZXNOYW5vLkJBUiwKLSAgICAgIFRlc3RBbGxUeXBlc05hbm8uQkFaCi0gICAgfTsKLSAgICBtZXNzYWdlLnNldE9uZW9mVWludDMyKDMpOwotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHJpdmF0ZSBUZXN0QWxsVHlwZXNOYW5vSGFzIGNyZWF0ZU1lc3NhZ2VXaXRoSGFzRm9ySGFzaENvZGVFcXVhbHNUZXN0KCkgewotICAgIFRlc3RBbGxUeXBlc05hbm9IYXMgbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vSGFzKCk7Ci0gICAgbWVzc2FnZS5vcHRpb25hbEludDMyID0gNTsKLSAgICBtZXNzYWdlLm9wdGlvbmFsU3RyaW5nID0gIkhlbGxvIjsKLSAgICBtZXNzYWdlLm9wdGlvbmFsQnl0ZXMgPSBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9OwotICAgIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlc05hbm9IYXMuTmVzdGVkTWVzc2FnZSgpOwotICAgIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmJiID0gMjc7Ci0gICAgbWVzc2FnZS5vcHRpb25hbE5lc3RlZEVudW0gPSBUZXN0QWxsVHlwZXNOYW5vLkJBUjsKLSAgICBtZXNzYWdlLnJlcGVhdGVkSW50MzIgPSBuZXcgaW50W10geyA1LCA2LCA3LCA4IH07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZFN0cmluZyA9IG5ldyBTdHJpbmdbXSB7ICJPbmUiLCAiVHdvIiB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWRCeXRlcyA9IG5ldyBieXRlW11bXSB7IHsgMiwgNyB9LCB7IDIsIDcgfSB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlc05hbm9IYXMuTmVzdGVkTWVzc2FnZVtdIHsKLSAgICAgIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLAotICAgICAgbWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2UKLSAgICB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtID0gbmV3IGludFtdIHsKLSAgICAgIFRlc3RBbGxUeXBlc05hbm8uQkFSLAotICAgICAgVGVzdEFsbFR5cGVzTmFuby5CQVoKLSAgICB9OwotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHJpdmF0ZSBUZXN0TmFub0FjY2Vzc29ycyBjcmVhdGVNZXNzYWdlV2l0aEFjY2Vzc29yc0Zvckhhc2hDb2RlRXF1YWxzVGVzdCgpIHsKLSAgICBUZXN0TmFub0FjY2Vzc29ycyBtZXNzYWdlID0gbmV3IFRlc3ROYW5vQWNjZXNzb3JzKCkKLSAgICAgICAgLnNldE9wdGlvbmFsSW50MzIoNSkKLSAgICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJIZWxsbyIpCi0gICAgICAgIC5zZXRPcHRpb25hbEJ5dGVzKG5ldyBieXRlW10gezEsIDIsIDN9KQotICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKFRlc3ROYW5vQWNjZXNzb3JzLkJBUik7Ci0gICAgbWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdE5hbm9BY2Nlc3NvcnMuTmVzdGVkTWVzc2FnZSgpLnNldEJiKDI3KTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkSW50MzIgPSBuZXcgaW50W10geyA1LCA2LCA3LCA4IH07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZFN0cmluZyA9IG5ldyBTdHJpbmdbXSB7ICJPbmUiLCAiVHdvIiB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWRCeXRlcyA9IG5ldyBieXRlW11bXSB7IHsgMiwgNyB9LCB7IDIsIDcgfSB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3ROYW5vQWNjZXNzb3JzLk5lc3RlZE1lc3NhZ2VbXSB7Ci0gICAgICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSwKLSAgICAgIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlCi0gICAgfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7Ci0gICAgICBUZXN0QWxsVHlwZXNOYW5vLkJBUiwKLSAgICAgIFRlc3RBbGxUeXBlc05hbm8uQkFaCi0gICAgfTsKLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIHByaXZhdGUgTmFub1JlZmVyZW5jZVR5cGVzLlRlc3RBbGxUeXBlc05hbm8gY3JlYXRlUmVmVHlwZWRNZXNzYWdlRm9ySGFzaENvZGVFcXVhbHNUZXN0KCkgewotICAgIE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vIG1lc3NhZ2UgPSBuZXcgTmFub1JlZmVyZW5jZVR5cGVzLlRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtZXNzYWdlLm9wdGlvbmFsSW50MzIgPSA1OwotICAgIG1lc3NhZ2Uub3B0aW9uYWxJbnQ2NCA9IDc3N0w7Ci0gICAgbWVzc2FnZS5vcHRpb25hbEZsb2F0ID0gMS4wZjsKLSAgICBtZXNzYWdlLm9wdGlvbmFsRG91YmxlID0gMi4wOwotICAgIG1lc3NhZ2Uub3B0aW9uYWxCb29sID0gdHJ1ZTsKLSAgICBtZXNzYWdlLm9wdGlvbmFsU3RyaW5nID0gIkhlbGxvIjsKLSAgICBtZXNzYWdlLm9wdGlvbmFsQnl0ZXMgPSBuZXcgYnl0ZVtdIHsgMSwgMiwgMyB9OwotICAgIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0KLSAgICAgICAgbmV3IE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5mb28gPSAyNzsKLSAgICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkRW51bSA9IE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vLkJBUjsKLSAgICBtZXNzYWdlLnJlcGVhdGVkSW50MzIgPSBuZXcgaW50W10geyA1LCA2LCA3LCA4IH07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZEludDY0ID0gbmV3IGxvbmdbXSB7IDI3TCwgMjhMLCAyOUwgfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkRmxvYXQgPSBuZXcgZmxvYXRbXSB7IDUuMGYsIDYuMGYgfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkRG91YmxlID0gbmV3IGRvdWJsZVtdIHsgOTkuMSwgMjIuNSB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWRCb29sID0gbmV3IGJvb2xlYW5bXSB7IHRydWUsIGZhbHNlLCB0cnVlIH07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZFN0cmluZyA9IG5ldyBTdHJpbmdbXSB7ICJPbmUiLCAiVHdvIiB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWRCeXRlcyA9IG5ldyBieXRlW11bXSB7IHsgMiwgNyB9LCB7IDIsIDcgfSB9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0KLSAgICAgICAgbmV3IE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2VbXSB7Ci0gICAgICAgICAgbWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2UsCi0gICAgICAgICAgbWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2UKLSAgICAgICAgfTsKLSAgICBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7Ci0gICAgICBOYW5vUmVmZXJlbmNlVHlwZXMuVGVzdEFsbFR5cGVzTmFuby5CQVIsCi0gICAgICBOYW5vUmVmZXJlbmNlVHlwZXMuVGVzdEFsbFR5cGVzTmFuby5CQVoKLSAgICB9OwotICAgIHJldHVybiBtZXNzYWdlOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVxdWFsc1dpdGhTcGVjaWFsRmxvYXRpbmdQb2ludFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIENoZWNrcyB0aGF0IHRoZSBuYW5vIGltcGxlbWVudGF0aW9uIGNvbXBsaWVzIHdpdGggT2JqZWN0LmVxdWFscygpIHdoZW4gdHJlYXRpbmcKLSAgICAvLyBmbG9hdGluZyBwb2ludCBudW1iZXJzLCBpLmUuIE5hTiA9PSBOYU4gYW5kICswLjAgIT0gLTAuMC4KLSAgICAvLyBUaGlzIHRlc3QgYXNzdW1lcyB0aGF0IHRoZSBnZW5lcmF0ZWQgZXF1YWxzKCkgaW1wbGVtZW50YXRpb25zIGFyZSBzeW1tZXRyaWMsIHNvCi0gICAgLy8gdGhlcmUgd2lsbCBvbmx5IGJlIG9uZSBkaXJlY3Rpb24gZm9yIGVhY2ggZXF1YWxpdHkgY2hlY2suCi0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG0xID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtMS5vcHRpb25hbEZsb2F0ID0gRmxvYXQuTmFOOwotICAgIG0xLm9wdGlvbmFsRG91YmxlID0gRG91YmxlLk5hTjsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG0yID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtMi5vcHRpb25hbEZsb2F0ID0gRmxvYXQuTmFOOwotICAgIG0yLm9wdGlvbmFsRG91YmxlID0gRG91YmxlLk5hTjsKLSAgICBhc3NlcnRUcnVlKG0xLmVxdWFscyhtMikpOwotICAgIGFzc2VydFRydWUobTEuZXF1YWxzKAotICAgICAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20obmV3IFRlc3RBbGxUeXBlc05hbm8oKSwgTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobTEpKSkpOwotCi0gICAgbTEub3B0aW9uYWxGbG9hdCA9ICswZjsKLSAgICBtMi5vcHRpb25hbEZsb2F0ID0gLTBmOwotICAgIGFzc2VydEZhbHNlKG0xLmVxdWFscyhtMikpOwotCi0gICAgbTEub3B0aW9uYWxGbG9hdCA9IC0wZjsKLSAgICBtMS5vcHRpb25hbERvdWJsZSA9ICswZDsKLSAgICBtMi5vcHRpb25hbERvdWJsZSA9IC0wZDsKLSAgICBhc3NlcnRGYWxzZShtMS5lcXVhbHMobTIpKTsKLQotICAgIG0xLm9wdGlvbmFsRG91YmxlID0gLTBkOwotICAgIGFzc2VydFRydWUobTEuZXF1YWxzKG0yKSk7Ci0gICAgYXNzZXJ0RmFsc2UobTEuZXF1YWxzKG5ldyBUZXN0QWxsVHlwZXNOYW5vKCkpKTsgLy8gLTAgZG9lcyBub3QgZXF1YWxzKCkgdGhlIGRlZmF1bHQgKzAKLSAgICBhc3NlcnRUcnVlKG0xLmVxdWFscygKLSAgICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKG5ldyBUZXN0QWxsVHlwZXNOYW5vKCksIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG0xKSkpKTsKLQotICAgIC8vIC0tLS0tLS0KLQotICAgIFRlc3RBbGxUeXBlc05hbm9IYXMgbTMgPSBuZXcgVGVzdEFsbFR5cGVzTmFub0hhcygpOwotICAgIG0zLm9wdGlvbmFsRmxvYXQgPSBGbG9hdC5OYU47Ci0gICAgbTMuaGFzT3B0aW9uYWxGbG9hdCA9IHRydWU7Ci0gICAgbTMub3B0aW9uYWxEb3VibGUgPSBEb3VibGUuTmFOOwotICAgIG0zLmhhc09wdGlvbmFsRG91YmxlID0gdHJ1ZTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vSGFzIG00ID0gbmV3IFRlc3RBbGxUeXBlc05hbm9IYXMoKTsKLSAgICBtNC5vcHRpb25hbEZsb2F0ID0gRmxvYXQuTmFOOwotICAgIG00Lmhhc09wdGlvbmFsRmxvYXQgPSB0cnVlOwotICAgIG00Lm9wdGlvbmFsRG91YmxlID0gRG91YmxlLk5hTjsKLSAgICBtNC5oYXNPcHRpb25hbERvdWJsZSA9IHRydWU7Ci0gICAgYXNzZXJ0VHJ1ZShtMy5lcXVhbHMobTQpKTsKLSAgICBhc3NlcnRUcnVlKG0zLmVxdWFscygKLSAgICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKG5ldyBUZXN0QWxsVHlwZXNOYW5vSGFzKCksIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG0zKSkpKTsKLQotICAgIG0zLm9wdGlvbmFsRmxvYXQgPSArMGY7Ci0gICAgbTQub3B0aW9uYWxGbG9hdCA9IC0wZjsKLSAgICBhc3NlcnRGYWxzZShtMy5lcXVhbHMobTQpKTsKLQotICAgIG0zLm9wdGlvbmFsRmxvYXQgPSAtMGY7Ci0gICAgbTMub3B0aW9uYWxEb3VibGUgPSArMGQ7Ci0gICAgbTQub3B0aW9uYWxEb3VibGUgPSAtMGQ7Ci0gICAgYXNzZXJ0RmFsc2UobTMuZXF1YWxzKG00KSk7Ci0KLSAgICBtMy5vcHRpb25hbERvdWJsZSA9IC0wZDsKLSAgICBtMy5oYXNPcHRpb25hbEZsb2F0ID0gZmFsc2U7ICAvLyAtMCBkb2VzIG5vdCBlcXVhbHMoKSB0aGUgZGVmYXVsdCArMCwKLSAgICBtMy5oYXNPcHRpb25hbERvdWJsZSA9IGZhbHNlOyAvLyBzbyB0aGVzZSBpbmNvcnJlY3QgJ2hhcycgZmxhZ3Mgc2hvdWxkIGJlIGRpc3JlZ2FyZGVkLgotICAgIGFzc2VydFRydWUobTMuZXF1YWxzKG00KSk7ICAgIC8vIG5vdGU6IG00IGhhcyB0aGUgJ2hhcycgZmxhZ3Mgc2V0LgotICAgIGFzc2VydEZhbHNlKG0zLmVxdWFscyhuZXcgVGVzdEFsbFR5cGVzTmFub0hhcygpKSk7IC8vIG5vdGU6IHRoZSBuZXcgbWVzc2FnZSBoYXMgKzAgZGVmYXVsdHMKLSAgICBhc3NlcnRUcnVlKG0zLmVxdWFscygKLSAgICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKG5ldyBUZXN0QWxsVHlwZXNOYW5vSGFzKCksIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG0zKSkpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RlOiB0aGUgZGVzZXJpYWxpemVkIG1lc3NhZ2UgaGFzIHRoZSAnaGFzJyBmbGFncyBzZXQuCi0KLSAgICAvLyAtLS0tLS0tCi0KLSAgICBUZXN0TmFub0FjY2Vzc29ycyBtNSA9IG5ldyBUZXN0TmFub0FjY2Vzc29ycygpOwotICAgIG01LnNldE9wdGlvbmFsRmxvYXQoRmxvYXQuTmFOKTsKLSAgICBtNS5zZXRPcHRpb25hbERvdWJsZShEb3VibGUuTmFOKTsKLSAgICBUZXN0TmFub0FjY2Vzc29ycyBtNiA9IG5ldyBUZXN0TmFub0FjY2Vzc29ycygpOwotICAgIG02LnNldE9wdGlvbmFsRmxvYXQoRmxvYXQuTmFOKTsKLSAgICBtNi5zZXRPcHRpb25hbERvdWJsZShEb3VibGUuTmFOKTsKLSAgICBhc3NlcnRUcnVlKG01LmVxdWFscyhtNikpOwotICAgIGFzc2VydFRydWUobTUuZXF1YWxzKAotICAgICAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20obmV3IFRlc3ROYW5vQWNjZXNzb3JzKCksIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG02KSkpKTsKLQotICAgIG01LnNldE9wdGlvbmFsRmxvYXQoKzBmKTsKLSAgICBtNi5zZXRPcHRpb25hbEZsb2F0KC0wZik7Ci0gICAgYXNzZXJ0RmFsc2UobTUuZXF1YWxzKG02KSk7Ci0KLSAgICBtNS5zZXRPcHRpb25hbEZsb2F0KC0wZik7Ci0gICAgbTUuc2V0T3B0aW9uYWxEb3VibGUoKzBkKTsKLSAgICBtNi5zZXRPcHRpb25hbERvdWJsZSgtMGQpOwotICAgIGFzc2VydEZhbHNlKG01LmVxdWFscyhtNikpOwotCi0gICAgbTUuc2V0T3B0aW9uYWxEb3VibGUoLTBkKTsKLSAgICBhc3NlcnRUcnVlKG01LmVxdWFscyhtNikpOwotICAgIGFzc2VydEZhbHNlKG01LmVxdWFscyhuZXcgVGVzdE5hbm9BY2Nlc3NvcnMoKSkpOwotICAgIGFzc2VydFRydWUobTUuZXF1YWxzKAotICAgICAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20obmV3IFRlc3ROYW5vQWNjZXNzb3JzKCksIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG02KSkpKTsKLQotICAgIC8vIC0tLS0tLS0KLQotICAgIE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vIG03ID0gbmV3IE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbTcub3B0aW9uYWxGbG9hdCA9IEZsb2F0Lk5hTjsKLSAgICBtNy5vcHRpb25hbERvdWJsZSA9IERvdWJsZS5OYU47Ci0gICAgTmFub1JlZmVyZW5jZVR5cGVzLlRlc3RBbGxUeXBlc05hbm8gbTggPSBuZXcgTmFub1JlZmVyZW5jZVR5cGVzLlRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBtOC5vcHRpb25hbEZsb2F0ID0gRmxvYXQuTmFOOwotICAgIG04Lm9wdGlvbmFsRG91YmxlID0gRG91YmxlLk5hTjsKLSAgICBhc3NlcnRUcnVlKG03LmVxdWFscyhtOCkpOwotICAgIGFzc2VydFRydWUobTcuZXF1YWxzKE1lc3NhZ2VOYW5vLm1lcmdlRnJvbSgKLSAgICAgICAgbmV3IE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vKCksIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG03KSkpKTsKLQotICAgIG03Lm9wdGlvbmFsRmxvYXQgPSArMGY7Ci0gICAgbTgub3B0aW9uYWxGbG9hdCA9IC0wZjsKLSAgICBhc3NlcnRGYWxzZShtNy5lcXVhbHMobTgpKTsKLQotICAgIG03Lm9wdGlvbmFsRmxvYXQgPSAtMGY7Ci0gICAgbTcub3B0aW9uYWxEb3VibGUgPSArMGQ7Ci0gICAgbTgub3B0aW9uYWxEb3VibGUgPSAtMGQ7Ci0gICAgYXNzZXJ0RmFsc2UobTcuZXF1YWxzKG04KSk7Ci0KLSAgICBtNy5vcHRpb25hbERvdWJsZSA9IC0wZDsKLSAgICBhc3NlcnRUcnVlKG03LmVxdWFscyhtOCkpOwotICAgIGFzc2VydEZhbHNlKG03LmVxdWFscyhuZXcgTmFub1JlZmVyZW5jZVR5cGVzLlRlc3RBbGxUeXBlc05hbm8oKSkpOwotICAgIGFzc2VydFRydWUobTcuZXF1YWxzKE1lc3NhZ2VOYW5vLm1lcmdlRnJvbSgKLSAgICAgICAgbmV3IE5hbm9SZWZlcmVuY2VUeXBlcy5UZXN0QWxsVHlwZXNOYW5vKCksIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG03KSkpKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIFRlc3RBbGxUeXBlc05hbm8gZ2VuZXJhdGVNZXNzYWdlRm9yT25lb2YoaW50IGNhc2VOdW1iZXIpIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIHJlc3VsdCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlIG5lc3RlZCA9Ci0gICAgICAgIG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBuZXN0ZWQuYmIgPSAyOwotICAgIHN3aXRjaCAoY2FzZU51bWJlcikgewotICAgICAgY2FzZSBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX1VJTlQzMl9GSUVMRF9OVU1CRVI6Ci0gICAgICAgIHJlc3VsdC5zZXRPbmVvZlVpbnQzMigxKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfRU5VTV9GSUVMRF9OVU1CRVI6Ci0gICAgICAgIHJlc3VsdC5zZXRPbmVvZkVudW0oVGVzdEFsbFR5cGVzTmFuby5CQVIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVI6Ci0gICAgICAgIHJlc3VsdC5zZXRPbmVvZk5lc3RlZE1lc3NhZ2UobmVzdGVkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfQllURVNfRklFTERfTlVNQkVSOgotICAgICAgICByZXN1bHQuc2V0T25lb2ZCeXRlcyhuZXcgYnl0ZVtdIHsxLCAyfSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX1NUUklOR19GSUVMRF9OVU1CRVI6Ci0gICAgICAgIHJlc3VsdC5zZXRPbmVvZlN0cmluZygiaGVsbG8iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfRklYRUQ2NF9GSUVMRF9OVU1CRVI6Ci0gICAgICAgIHJlc3VsdC5zZXRPbmVvZkZpeGVkNjQoLTFMKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigidW5leHBlY3RlZCBjYXNlIG51bWJlcjogIiArIGNhc2VOdW1iZXIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9uZW9mSGFzaENvZGVFcXVhbHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG0xID0gZ2VuZXJhdGVNZXNzYWdlRm9yT25lb2YoCi0gICAgICAgIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfVUlOVDMyX0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKG0xLCBnZW5lcmF0ZU1lc3NhZ2VGb3JPbmVvZigKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9VSU5UMzJfRklFTERfTlVNQkVSKSk7Ci0gICAgYXNzZXJ0RmFsc2UobTEuZXF1YWxzKG5ldyBUZXN0QWxsVHlwZXNOYW5vKCkpKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbTIgPSBnZW5lcmF0ZU1lc3NhZ2VGb3JPbmVvZigKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9FTlVNX0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKG0yLCBnZW5lcmF0ZU1lc3NhZ2VGb3JPbmVvZigKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9FTlVNX0ZJRUxEX05VTUJFUikpOwotICAgIGFzc2VydEZhbHNlKG0yLmVxdWFscyhuZXcgVGVzdEFsbFR5cGVzTmFubygpKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG0zID0gZ2VuZXJhdGVNZXNzYWdlRm9yT25lb2YoCi0gICAgICAgIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfTkVTVEVEX01FU1NBR0VfRklFTERfTlVNQkVSKTsKLSAgICBhc3NlcnRFcXVhbHMobTMsIGdlbmVyYXRlTWVzc2FnZUZvck9uZW9mKAotICAgICAgICBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUikpOwotICAgIGFzc2VydEZhbHNlKG0zLmVxdWFscyhuZXcgVGVzdEFsbFR5cGVzTmFubygpKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG00ID0gZ2VuZXJhdGVNZXNzYWdlRm9yT25lb2YoCi0gICAgICAgIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfQllURVNfRklFTERfTlVNQkVSKTsKLSAgICBhc3NlcnRFcXVhbHMobTQsIGdlbmVyYXRlTWVzc2FnZUZvck9uZW9mKAotICAgICAgICBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0JZVEVTX0ZJRUxEX05VTUJFUikpOwotICAgIGFzc2VydEZhbHNlKG00LmVxdWFscyhuZXcgVGVzdEFsbFR5cGVzTmFubygpKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG01ID0gZ2VuZXJhdGVNZXNzYWdlRm9yT25lb2YoCi0gICAgICAgIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfU1RSSU5HX0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKG01LCBnZW5lcmF0ZU1lc3NhZ2VGb3JPbmVvZigKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9TVFJJTkdfRklFTERfTlVNQkVSKSk7Ci0gICAgYXNzZXJ0RmFsc2UobTUuZXF1YWxzKG5ldyBUZXN0QWxsVHlwZXNOYW5vKCkpKTsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbTYgPSBnZW5lcmF0ZU1lc3NhZ2VGb3JPbmVvZigKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9GSVhFRDY0X0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKG02LCBnZW5lcmF0ZU1lc3NhZ2VGb3JPbmVvZigKLSAgICAgICAgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9GSVhFRDY0X0ZJRUxEX05VTUJFUikpOwotICAgIGFzc2VydEZhbHNlKG02LmVxdWFscyhuZXcgVGVzdEFsbFR5cGVzTmFubygpKSk7Ci0KLSAgICBNYXA8VGVzdEFsbFR5cGVzTmFubywgSW50ZWdlcj4gbWFwID0KLSAgICAgICAgbmV3IEhhc2hNYXA8VGVzdEFsbFR5cGVzTmFubywgSW50ZWdlcj4oKTsKLSAgICBtYXAucHV0KG0xLCAxKTsKLSAgICBtYXAucHV0KG0yLCAyKTsKLSAgICBtYXAucHV0KG0zLCAzKTsKLSAgICBtYXAucHV0KG00LCA0KTsKLSAgICBtYXAucHV0KG01LCA1KTsKLSAgICBtYXAucHV0KG02LCA2KTsKLQotICAgIGFzc2VydEVxdWFscyg2LCBtYXAuc2l6ZSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBjaGVja09uZW9mQ2FzZShUZXN0QWxsVHlwZXNOYW5vIG5hbm8sIGludCBmaWVsZCkKLSAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyhmaWVsZCwgbmFuby5nZXRPbmVvZkZpZWxkQ2FzZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIGZpZWxkID09IFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfQllURVNfRklFTERfTlVNQkVSLAotICAgICAgICBuYW5vLmhhc09uZW9mQnl0ZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBmaWVsZCA9PSBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0VOVU1fRklFTERfTlVNQkVSLAotICAgICAgICBuYW5vLmhhc09uZW9mRW51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIGZpZWxkID09IFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfRklYRUQ2NF9GSUVMRF9OVU1CRVIsCi0gICAgICAgIG5hbm8uaGFzT25lb2ZGaXhlZDY0KCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgZmllbGQgPT0gVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIsCi0gICAgICAgIG5hbm8uaGFzT25lb2ZOZXN0ZWRNZXNzYWdlKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgZmllbGQgPT0gVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9TVFJJTkdfRklFTERfTlVNQkVSLAotICAgICAgICBuYW5vLmhhc09uZW9mU3RyaW5nKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgZmllbGQgPT0gVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9VSU5UMzJfRklFTERfTlVNQkVSLAotICAgICAgICBuYW5vLmhhc09uZW9mVWludDMyKCkpOwotCi0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZEZWZhdWx0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtMSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgY2hlY2tPbmVvZkNhc2UobTEsIDApOwotICAgIGFzc2VydEVxdWFscyhXaXJlRm9ybWF0TmFuby5FTVBUWV9CWVRFUywgbTEuZ2V0T25lb2ZCeXRlcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5GT08sIG0xLmdldE9uZW9mRW51bSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMEwsIG0xLmdldE9uZW9mRml4ZWQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgbTEuZ2V0T25lb2ZOZXN0ZWRNZXNzYWdlKCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgbTEuZ2V0T25lb2ZTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG0xLmdldE9uZW9mVWludDMyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9uZW9mRXhjbHVzaXZlbmVzcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgY2hlY2tPbmVvZkNhc2UobSwgMCk7Ci0KLSAgICBtLnNldE9uZW9mQnl0ZXMobmV3IGJ5dGVbXXswLCAxfSk7Ci0gICAgY2hlY2tPbmVvZkNhc2UobSwgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9CWVRFU19GSUVMRF9OVU1CRVIpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYnl0ZVtdezAsICAxfSwgbS5nZXRPbmVvZkJ5dGVzKCkpKTsKLQotICAgIG0uc2V0T25lb2ZFbnVtKFRlc3RBbGxUeXBlc05hbm8uQkFaKTsKLSAgICBjaGVja09uZW9mQ2FzZShtLCBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0VOVU1fRklFTERfTlVNQkVSKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVosIG0uZ2V0T25lb2ZFbnVtKCkpOwotICAgIGFzc2VydEVxdWFscyhXaXJlRm9ybWF0TmFuby5FTVBUWV9CWVRFUywgbS5nZXRPbmVvZkJ5dGVzKCkpOwotCi0gICAgbS5zZXRPbmVvZkZpeGVkNjQoLTFMKTsKLSAgICBjaGVja09uZW9mQ2FzZShtLCBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0ZJWEVENjRfRklFTERfTlVNQkVSKTsKLSAgICBhc3NlcnRFcXVhbHMoLTFMLCBtLmdldE9uZW9mRml4ZWQ2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5GT08sIG0uZ2V0T25lb2ZFbnVtKCkpOwotCi0gICAgbS5zZXRPbmVvZk5lc3RlZE1lc3NhZ2UobmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSgpKTsKLSAgICBjaGVja09uZW9mQ2FzZShtLCBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCksIG0uZ2V0T25lb2ZOZXN0ZWRNZXNzYWdlKCkpOwotICAgIGFzc2VydEVxdWFscygwTCwgbS5nZXRPbmVvZkZpeGVkNjQoKSk7Ci0KLSAgICBtLnNldE9uZW9mU3RyaW5nKCJoZWxsbyIpOwotICAgIGNoZWNrT25lb2ZDYXNlKG0sIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfU1RSSU5HX0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG0uZ2V0T25lb2ZTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0TnVsbChtLmdldE9uZW9mTmVzdGVkTWVzc2FnZSgpKTsKLQotICAgIG0uc2V0T25lb2ZVaW50MzIoMTApOwotICAgIGNoZWNrT25lb2ZDYXNlKG0sIFRlc3RBbGxUeXBlc05hbm8uT05FT0ZfVUlOVDMyX0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwLCBtLmdldE9uZW9mVWludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygiIiwgbS5nZXRPbmVvZlN0cmluZygpKTsKLQotICAgIG0uc2V0T25lb2ZCeXRlcyhuZXcgYnl0ZVtdezAsIDF9KTsKLSAgICBjaGVja09uZW9mQ2FzZShtLCBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0JZVEVTX0ZJRUxEX05VTUJFUik7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MCwgIDF9LCBtLmdldE9uZW9mQnl0ZXMoKSkpOwotICAgIGFzc2VydEVxdWFscygwLCBtLmdldE9uZW9mVWludDMyKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9uZW9mQ2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIG0gPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG0uc2V0T25lb2ZCeXRlcyhuZXcgYnl0ZVtdezAsIDF9KTsKLSAgICBtLmNsZWFyT25lb2ZGaWVsZCgpOwotICAgIGNoZWNrT25lb2ZDYXNlKG0sIDApOwotCi0gICAgbS5zZXRPbmVvZkVudW0oVGVzdEFsbFR5cGVzTmFuby5CQVopOwotICAgIG0uY2xlYXJPbmVvZkZpZWxkKCk7Ci0gICAgY2hlY2tPbmVvZkNhc2UobSwgMCk7Ci0KLSAgICBtLnNldE9uZW9mRml4ZWQ2NCgtMUwpOwotICAgIG0uY2xlYXJPbmVvZkZpZWxkKCk7Ci0gICAgY2hlY2tPbmVvZkNhc2UobSwgMCk7Ci0KLSAgICBtLnNldE9uZW9mTmVzdGVkTWVzc2FnZShuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCkpOwotICAgIG0uY2xlYXJPbmVvZkZpZWxkKCk7Ci0gICAgY2hlY2tPbmVvZkNhc2UobSwgMCk7Ci0KLSAgICBtLnNldE9uZW9mU3RyaW5nKCJoZWxsbyIpOwotICAgIG0uY2xlYXJPbmVvZkZpZWxkKCk7Ci0gICAgY2hlY2tPbmVvZkNhc2UobSwgMCk7Ci0KLSAgICBtLnNldE9uZW9mVWludDMyKDEwKTsKLSAgICBtLmNsZWFyT25lb2ZGaWVsZCgpOwotICAgIGNoZWNrT25lb2ZDYXNlKG0sIDApOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE9uZW9mTWFyc2hhbGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlc05hbm8gbSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBwYXJzZWQgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIHsKLSAgICAgIG0uc2V0T25lb2ZCeXRlcyhuZXcgYnl0ZVtdezAsIDF9KTsKLSAgICAgIGJ5dGVbXSBzZXJpYWxpemVkID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobSk7Ci0gICAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20ocGFyc2VkLCBzZXJpYWxpemVkKTsKLSAgICAgIGNoZWNrT25lb2ZDYXNlKHBhcnNlZCwgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9CWVRFU19GSUVMRF9OVU1CRVIpOwotICAgICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBieXRlW117MCwgMX0sIHBhcnNlZC5nZXRPbmVvZkJ5dGVzKCkpKTsKLSAgICB9Ci0gICAgewotICAgICAgbS5zZXRPbmVvZkVudW0oVGVzdEFsbFR5cGVzTmFuby5CQVopOwotICAgICAgYnl0ZVtdIHNlcmlhbGl6ZWQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtKTsKLSAgICAgIE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShwYXJzZWQsIHNlcmlhbGl6ZWQpOwotICAgICAgY2hlY2tPbmVvZkNhc2UobSwgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9FTlVNX0ZJRUxEX05VTUJFUik7Ci0gICAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVosIG0uZ2V0T25lb2ZFbnVtKCkpOwotICAgIH0KLSAgICB7Ci0gICAgICBtLnNldE9uZW9mRW51bShUZXN0QWxsVHlwZXNOYW5vLkJBWik7Ci0gICAgICBieXRlW10gc2VyaWFsaXplZCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG0pOwotICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKHBhcnNlZCwgc2VyaWFsaXplZCk7Ci0gICAgICBjaGVja09uZW9mQ2FzZShtLCBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0VOVU1fRklFTERfTlVNQkVSKTsKLSAgICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkJBWiwgbS5nZXRPbmVvZkVudW0oKSk7Ci0gICAgfQotICAgIHsKLSAgICAgIG0uc2V0T25lb2ZGaXhlZDY0KC0xTCk7Ci0gICAgICBieXRlW10gc2VyaWFsaXplZCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG0pOwotICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKHBhcnNlZCwgc2VyaWFsaXplZCk7Ci0gICAgICBjaGVja09uZW9mQ2FzZShtLCBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0ZJWEVENjRfRklFTERfTlVNQkVSKTsKLSAgICAgIGFzc2VydEVxdWFscygtMUwsIG0uZ2V0T25lb2ZGaXhlZDY0KCkpOwotICAgIH0KLSAgICB7Ci0gICAgICBtLnNldE9uZW9mTmVzdGVkTWVzc2FnZShuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCkpOwotICAgICAgYnl0ZVtdIHNlcmlhbGl6ZWQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtKTsKLSAgICAgIE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShwYXJzZWQsIHNlcmlhbGl6ZWQpOwotICAgICAgY2hlY2tPbmVvZkNhc2UobSwgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIpOwotICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgIG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKSwgbS5nZXRPbmVvZk5lc3RlZE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHsKLSAgICAgIG0uc2V0T25lb2ZTdHJpbmcoImhlbGxvIik7Ci0gICAgICBieXRlW10gc2VyaWFsaXplZCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG0pOwotICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKHBhcnNlZCwgc2VyaWFsaXplZCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbS5nZXRPbmVvZlN0cmluZygpKTsKLSAgICAgIGFzc2VydE51bGwobS5nZXRPbmVvZk5lc3RlZE1lc3NhZ2UoKSk7Ci0gICAgfQotICAgIHsKLSAgICAgIG0uc2V0T25lb2ZVaW50MzIoMTApOwotICAgICAgYnl0ZVtdIHNlcmlhbGl6ZWQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtKTsKLSAgICAgIE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShwYXJzZWQsIHNlcmlhbGl6ZWQpOwotICAgICAgY2hlY2tPbmVvZkNhc2UobSwgVGVzdEFsbFR5cGVzTmFuby5PTkVPRl9VSU5UMzJfRklFTERfTlVNQkVSKTsKLSAgICAgIGFzc2VydEVxdWFscygxMCwgbS5nZXRPbmVvZlVpbnQzMigpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0T25lb2ZTZXJpYWxpemVkQ29uY2F0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzTmFubyBtMSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbTEuc2V0T25lb2ZCeXRlcyhuZXcgYnl0ZVtdIHswLCAxfSk7Ci0gICAgYnl0ZVtdIGIxID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobTEpOwotICAgIFRlc3RBbGxUeXBlc05hbm8gbTIgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG0yLnNldE9uZW9mRW51bShUZXN0QWxsVHlwZXNOYW5vLkJBWik7Ci0gICAgYnl0ZVtdIGIyID0gTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobTIpOwotICAgIGJ5dGVbXSBiMyA9IG5ldyBieXRlW2IxLmxlbmd0aCArIGIyLmxlbmd0aF07Ci0gICAgU3lzdGVtLmFycmF5Y29weShiMSwgMCwgYjMsIDAsIGIxLmxlbmd0aCk7Ci0gICAgU3lzdGVtLmFycmF5Y29weShiMiwgMCwgYjMsIGIxLmxlbmd0aCwgYjIubGVuZ3RoKTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIHBhcnNlZCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKHBhcnNlZCwgYjMpOwotICAgIC8vIHRoZSBsYXN0IG9uIHRoZSB3aXJlIHdpbnMuCi0gICAgY2hlY2tPbmVvZkNhc2UocGFyc2VkLCBUZXN0QWxsVHlwZXNOYW5vLk9ORU9GX0VOVU1fRklFTERfTlVNQkVSKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVosIHBhcnNlZC5nZXRPbmVvZkVudW0oKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TnVsbFJlcGVhdGVkRmllbGRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gQ2hlY2sgdGhhdCBzZXJpYWxpemF0aW9uIGFmdGVyIGV4cGxpY2l0bHkgc2V0dGluZyBhIHJlcGVhdGVkIGZpZWxkCi0gICAgLy8gdG8gbnVsbCBkb2Vzbid0IE5QRS4KLSAgICBUZXN0QWxsVHlwZXNOYW5vIG1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIG1lc3NhZ2UucmVwZWF0ZWRJbnQzMiA9IG51bGw7Ci0gICAgTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobWVzc2FnZSk7ICAvLyBzaG91bGQgbm90IE5QRQotICAgIG1lc3NhZ2UudG9TdHJpbmcoKTsgLy8gc2hvdWxkIG5vdCBOUEUKLQotICAgIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtID0gbnVsbDsKLSAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtZXNzYWdlKTsgIC8vIHNob3VsZCBub3QgTlBFCi0gICAgbWVzc2FnZS50b1N0cmluZygpOyAvLyBzaG91bGQgbm90IE5QRQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZEJ5dGVzID0gbnVsbDsKLSAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtZXNzYWdlKTsgLy8gc2hvdWxkIG5vdCBOUEUKLSAgICBtZXNzYWdlLnRvU3RyaW5nKCk7IC8vIHNob3VsZCBub3QgTlBFCi0KLSAgICBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZSA9IG51bGw7Ci0gICAgTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobWVzc2FnZSk7IC8vIHNob3VsZCBub3QgTlBFCi0gICAgbWVzc2FnZS50b1N0cmluZygpOyAvLyBzaG91bGQgbm90IE5QRQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZFBhY2tlZEludDMyID0gbnVsbDsKLSAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtZXNzYWdlKTsgLy8gc2hvdWxkIG5vdCBOUEUKLSAgICBtZXNzYWdlLnRvU3RyaW5nKCk7IC8vIHNob3VsZCBub3QgTlBFCi0KLSAgICBtZXNzYWdlLnJlcGVhdGVkUGFja2VkTmVzdGVkRW51bSA9IG51bGw7Ci0gICAgTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkobWVzc2FnZSk7IC8vIHNob3VsZCBub3QgTlBFCi0gICAgbWVzc2FnZS50b1N0cmluZygpOyAvLyBzaG91bGQgbm90IE5QRQotCi0gICAgLy8gQ3JlYXRlIGEgc2Vjb25kIG1lc3NhZ2UgdG8gbWVyZ2UgaW50byBtZXNzYWdlLgotICAgIFRlc3RBbGxUeXBlc05hbm8gc2Vjb25kTWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgc2Vjb25kTWVzc2FnZS5yZXBlYXRlZEludDMyID0gbmV3IGludFtdIHsxLCAyLCAzfTsKLSAgICBzZWNvbmRNZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7Ci0gICAgICBUZXN0QWxsVHlwZXNOYW5vLkZPTywgVGVzdEFsbFR5cGVzTmFuby5CQVIKLSAgICB9OwotICAgIHNlY29uZE1lc3NhZ2UucmVwZWF0ZWRCeXRlcyA9IG5ldyBieXRlW11bXSB7ezEsIDJ9LCB7MywgNH19OwotICAgIFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSBuZXN0ZWQgPQotICAgICAgICBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlKCk7Ci0gICAgbmVzdGVkLmJiID0gNTU7Ci0gICAgc2Vjb25kTWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UgPQotICAgICAgICBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlW10ge25lc3RlZH07Ci0gICAgc2Vjb25kTWVzc2FnZS5yZXBlYXRlZFBhY2tlZEludDMyID0gbmV3IGludFtdIHsxLCAyLCAzfTsKLSAgICBzZWNvbmRNZXNzYWdlLnJlcGVhdGVkUGFja2VkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7Ci0gICAgICAgIFRlc3RBbGxUeXBlc05hbm8uRk9PLCBUZXN0QWxsVHlwZXNOYW5vLkJBUgotICAgICAgfTsKLQotICAgIC8vIFNob3VsZCBub3QgTlBFCi0gICAgbWVzc2FnZS5tZXJnZUZyb20oQ29kZWRJbnB1dEJ5dGVCdWZmZXJOYW5vLm5ld0luc3RhbmNlKAotICAgICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzZWNvbmRNZXNzYWdlKSkpOwotICAgIGFzc2VydEVxdWFscygzLCBtZXNzYWdlLnJlcGVhdGVkSW50MzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5yZXBlYXRlZEludDMyWzJdKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5yZXBlYXRlZE5lc3RlZEVudW0ubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5GT08sIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtWzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5yZXBlYXRlZEJ5dGVzLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2UucmVwZWF0ZWRCeXRlc1sxXVsxXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRNZXNzYWdlLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU1LCBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXS5iYik7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UucmVwZWF0ZWRQYWNrZWRJbnQzMi5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlLnJlcGVhdGVkUGFja2VkSW50MzJbMV0pOwotICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlLnJlcGVhdGVkUGFja2VkTmVzdGVkRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkJBUiwgbWVzc2FnZS5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW1bMV0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE51bGxSZXBlYXRlZEZpZWxkRWxlbWVudHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBDaGVjayB0aGF0IHNlcmlhbGl6YXRpb24gd2l0aCBudWxsIGFycmF5IGVsZW1lbnRzIGRvZXNuJ3QgTlBFLgotICAgIFN0cmluZyBzdHJpbmcxID0gIjEiOwotICAgIFN0cmluZyBzdHJpbmcyID0gIjIiOwotICAgIGJ5dGVbXSBieXRlczEgPSB7MywgNH07Ci0gICAgYnl0ZVtdIGJ5dGVzMiA9IHs1LCA2fTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UgbXNnMSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtc2cxLmJiID0gNzsKLSAgICBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UgbXNnMiA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKTsKLSAgICBtc2cyLmJiID0gODsKLQotICAgIFRlc3RBbGxUeXBlc05hbm8gbWVzc2FnZSA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgbWVzc2FnZS5yZXBlYXRlZFN0cmluZyA9IG5ldyBTdHJpbmdbXSB7bnVsbCwgc3RyaW5nMSwgc3RyaW5nMn07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZEJ5dGVzID0gbmV3IGJ5dGVbXVtdIHtieXRlczEsIG51bGwsIGJ5dGVzMn07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlW10ge21zZzEsIG1zZzIsIG51bGx9OwotICAgIG1lc3NhZ2UucmVwZWF0ZWRHcm91cCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vLlJlcGVhdGVkR3JvdXBbXSB7bnVsbCwgbnVsbCwgbnVsbH07Ci0KLSAgICBieXRlW10gc2VyaWFsaXplZCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1lc3NhZ2UpOyAvLyBzaG91bGQgbm90IE5QRQotICAgIFRlc3RBbGxUeXBlc05hbm8gZGVzZXJpYWxpemVkID0gTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKG5ldyBUZXN0QWxsVHlwZXNOYW5vKCksIHNlcmlhbGl6ZWQpOwotICAgIGFzc2VydEVxdWFscygyLCBkZXNlcmlhbGl6ZWQucmVwZWF0ZWRTdHJpbmcubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoc3RyaW5nMSwgZGVzZXJpYWxpemVkLnJlcGVhdGVkU3RyaW5nWzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoc3RyaW5nMiwgZGVzZXJpYWxpemVkLnJlcGVhdGVkU3RyaW5nWzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgZGVzZXJpYWxpemVkLnJlcGVhdGVkQnl0ZXMubGVuZ3RoKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMoYnl0ZXMxLCBkZXNlcmlhbGl6ZWQucmVwZWF0ZWRCeXRlc1swXSkpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhieXRlczIsIGRlc2VyaWFsaXplZC5yZXBlYXRlZEJ5dGVzWzFdKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGRlc2VyaWFsaXplZC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnMS5iYiwgZGVzZXJpYWxpemVkLnJlcGVhdGVkTmVzdGVkTWVzc2FnZVswXS5iYik7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZzIuYmIsIGRlc2VyaWFsaXplZC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VbMV0uYmIpOwotICAgIGFzc2VydEVxdWFscygwLCBkZXNlcmlhbGl6ZWQucmVwZWF0ZWRHcm91cC5sZW5ndGgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkTWVyZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBDaGVjayB0aGF0IG1lcmdpbmcgcmVwZWF0ZWQgZmllbGRzIGNhdXNlIHRoZSBhcnJheXMgdG8gZXhwYW5kIHdpdGgKLSAgICAvLyBuZXcgZGF0YS4KLSAgICBUZXN0QWxsVHlwZXNOYW5vIGZpcnN0ID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBmaXJzdC5yZXBlYXRlZEludDMyID0gbmV3IGludFtdIHsxLCAyLCAzfTsKLSAgICBUZXN0QWxsVHlwZXNOYW5vIHNlY29uZCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgc2Vjb25kLnJlcGVhdGVkSW50MzIgPSBuZXcgaW50W10gezQsIDV9OwotICAgIE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShmaXJzdCwgTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkoc2Vjb25kKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDUsIGZpcnN0LnJlcGVhdGVkSW50MzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmlyc3QucmVwZWF0ZWRJbnQzMlswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIGZpcnN0LnJlcGVhdGVkSW50MzJbM10pOwotCi0gICAgZmlyc3QgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGZpcnN0LnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7VGVzdEFsbFR5cGVzTmFuby5CQVJ9OwotICAgIHNlY29uZCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgc2Vjb25kLnJlcGVhdGVkTmVzdGVkRW51bSA9IG5ldyBpbnRbXSB7VGVzdEFsbFR5cGVzTmFuby5GT099OwotICAgIE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShmaXJzdCwgTWVzc2FnZU5hbm8udG9CeXRlQXJyYXkoc2Vjb25kKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGZpcnN0LnJlcGVhdGVkTmVzdGVkRW51bS5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXNOYW5vLkJBUiwgZmlyc3QucmVwZWF0ZWROZXN0ZWRFbnVtWzBdKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5GT08sIGZpcnN0LnJlcGVhdGVkTmVzdGVkRW51bVsxXSk7Ci0KLSAgICBmaXJzdCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgZmlyc3QucmVwZWF0ZWROZXN0ZWRNZXNzYWdlID0gbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZVtdIHsKLSAgICAgIG5ldyBUZXN0QWxsVHlwZXNOYW5vLk5lc3RlZE1lc3NhZ2UoKQotICAgIH07Ci0gICAgZmlyc3QucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzBdLmJiID0gMzsKLSAgICBzZWNvbmQgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIHNlY29uZC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UgPSBuZXcgVGVzdEFsbFR5cGVzTmFuby5OZXN0ZWRNZXNzYWdlW10gewotICAgICAgbmV3IFRlc3RBbGxUeXBlc05hbm8uTmVzdGVkTWVzc2FnZSgpCi0gICAgfTsKLSAgICBzZWNvbmQucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzBdLmJiID0gNTsKLSAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20oZmlyc3QsIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KHNlY29uZCkpOwotICAgIGFzc2VydEVxdWFscygyLCBmaXJzdC5yZXBlYXRlZE5lc3RlZE1lc3NhZ2UubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgZmlyc3QucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzBdLmJiKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgZmlyc3QucmVwZWF0ZWROZXN0ZWRNZXNzYWdlWzFdLmJiKTsKLQotICAgIGZpcnN0ID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBmaXJzdC5yZXBlYXRlZFBhY2tlZFNmaXhlZDY0ID0gbmV3IGxvbmdbXSB7LTEsIC0yLCAtM307Ci0gICAgc2Vjb25kID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBzZWNvbmQucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NCA9IG5ldyBsb25nW10gey00LCAtNX07Ci0gICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKGZpcnN0LCBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzZWNvbmQpKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgZmlyc3QucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NC5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygtMSwgZmlyc3QucmVwZWF0ZWRQYWNrZWRTZml4ZWQ2NFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC00LCBmaXJzdC5yZXBlYXRlZFBhY2tlZFNmaXhlZDY0WzNdKTsKLQotICAgIGZpcnN0ID0gbmV3IFRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBmaXJzdC5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW0gPSBuZXcgaW50W10ge1Rlc3RBbGxUeXBlc05hbm8uQkFSfTsKLSAgICBzZWNvbmQgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIHNlY29uZC5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW0gPSBuZXcgaW50W10ge1Rlc3RBbGxUeXBlc05hbm8uRk9PfTsKLSAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20oZmlyc3QsIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KHNlY29uZCkpOwotICAgIGFzc2VydEVxdWFscygyLCBmaXJzdC5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW0ubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzTmFuby5CQVIsIGZpcnN0LnJlcGVhdGVkUGFja2VkTmVzdGVkRW51bVswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc05hbm8uRk9PLCBmaXJzdC5yZXBlYXRlZFBhY2tlZE5lc3RlZEVudW1bMV0pOwotCi0gICAgLy8gTm93IHRlc3QgcmVwZWF0ZWQgbWVyZ2luZyBpbiBhIG5lc3RlZCBzY29wZQotICAgIFRlc3RSZXBlYXRlZE1lcmdlTmFubyBmaXJzdENvbnRhaW5lciA9IG5ldyBUZXN0UmVwZWF0ZWRNZXJnZU5hbm8oKTsKLSAgICBmaXJzdENvbnRhaW5lci5jb250YWluZWQgPSBuZXcgVGVzdEFsbFR5cGVzTmFubygpOwotICAgIGZpcnN0Q29udGFpbmVyLmNvbnRhaW5lZC5yZXBlYXRlZEludDMyID0gbmV3IGludFtdIHsxMCwgMjB9OwotICAgIFRlc3RSZXBlYXRlZE1lcmdlTmFubyBzZWNvbmRDb250YWluZXIgPSBuZXcgVGVzdFJlcGVhdGVkTWVyZ2VOYW5vKCk7Ci0gICAgc2Vjb25kQ29udGFpbmVyLmNvbnRhaW5lZCA9IG5ldyBUZXN0QWxsVHlwZXNOYW5vKCk7Ci0gICAgc2Vjb25kQ29udGFpbmVyLmNvbnRhaW5lZC5yZXBlYXRlZEludDMyID0gbmV3IGludFtdIHszMH07Ci0gICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKGZpcnN0Q29udGFpbmVyLCBNZXNzYWdlTmFuby50b0J5dGVBcnJheShzZWNvbmRDb250YWluZXIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgZmlyc3RDb250YWluZXIuY29udGFpbmVkLnJlcGVhdGVkSW50MzIubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMjAsIGZpcnN0Q29udGFpbmVyLmNvbnRhaW5lZC5yZXBlYXRlZEludDMyWzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoMzAsIGZpcnN0Q29udGFpbmVyLmNvbnRhaW5lZC5yZXBlYXRlZEludDMyWzJdKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZFBhY2thYmxlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIENoZWNrIHRoYXQgcmVwZWF0ZWQgZmllbGRzIHdpdGggcGFja2FibGUgdHlwZXMgY2FuIGFjY2VwdCBib3RoIHBhY2tlZCBhbmQgdW5wYWNrZWQKLSAgICAvLyBzZXJpYWxpemVkIGZvcm1zLgotICAgIE5hbm9SZXBlYXRlZFBhY2thYmxlcy5Ob25QYWNrZWQgbm9uUGFja2VkID0gbmV3IE5hbm9SZXBlYXRlZFBhY2thYmxlcy5Ob25QYWNrZWQoKTsKLSAgICAvLyBFeGFnZ2VyYXRlcyB0aGUgZmlyc3QgdmFsdWVzIG9mIHZhcmludC10eXBlZCBhcnJheXMuIFRoaXMgaXMgdG8gdGVzdCB0aGF0IHRoZSBwYXJzaW5nIGNvZGUKLSAgICAvLyBvZiBwYWNrZWQgZmllbGRzIGhhbmRsZXMgbm9uLXBhY2tlZCBkYXRhIGNvcnJlY3RseS4gSWYgdGhlIGNvZGUgaW5jb3JyZWN0bHkgdGhpbmtzIGl0IGlzCi0gICAgLy8gcmVhZGluZyBmcm9tIGEgcGFja2VkIHRhZywgaXQgd2lsbCByZWFkIHRoZSBmaXJzdCB2YWx1ZSBhcyB0aGUgYnl0ZSBsZW5ndGggb2YgdGhlIGZpZWxkLAotICAgIC8vIGFuZCB0aGUgbGFyZ2UgbnVtYmVyIHdpbGwgY2F1c2UgdGhlIGlucHV0IHRvIGdvIG91dCBvZiBib3VuZHMsIHRodXMgY2FwdHVyaW5nIHRoZSBlcnJvci4KLSAgICBub25QYWNrZWQuaW50MzJTID0gbmV3IGludFtdIHsxMDAwLCAyLCAzfTsKLSAgICBub25QYWNrZWQuaW50NjRTID0gbmV3IGxvbmdbXSB7NDAwMCwgNSwgNn07Ci0gICAgbm9uUGFja2VkLnVpbnQzMlMgPSBuZXcgaW50W10gezcwMDAsIDgsIDl9OwotICAgIG5vblBhY2tlZC51aW50NjRTID0gbmV3IGxvbmdbXSB7MTAwMDAsIDExLCAxMn07Ci0gICAgbm9uUGFja2VkLnNpbnQzMlMgPSBuZXcgaW50W10gezEzMDAwLCAxNCwgMTV9OwotICAgIG5vblBhY2tlZC5zaW50NjRTID0gbmV3IGxvbmdbXSB7MTYwMDAsIDE3LCAxOH07Ci0gICAgbm9uUGFja2VkLmZpeGVkMzJTID0gbmV3IGludFtdIHsxOSwgMjAsIDIxfTsKLSAgICBub25QYWNrZWQuZml4ZWQ2NFMgPSBuZXcgbG9uZ1tdIHsyMiwgMjMsIDI0fTsKLSAgICBub25QYWNrZWQuc2ZpeGVkMzJTID0gbmV3IGludFtdIHsyNSwgMjYsIDI3fTsKLSAgICBub25QYWNrZWQuc2ZpeGVkNjRTID0gbmV3IGxvbmdbXSB7MjgsIDI5LCAzMH07Ci0gICAgbm9uUGFja2VkLmZsb2F0cyA9IG5ldyBmbG9hdFtdIHszMSwgMzIsIDMzfTsKLSAgICBub25QYWNrZWQuZG91YmxlcyA9IG5ldyBkb3VibGVbXSB7MzQsIDM1LCAzNn07Ci0gICAgbm9uUGFja2VkLmJvb2xzID0gbmV3IGJvb2xlYW5bXSB7ZmFsc2UsIHRydWV9OwotICAgIG5vblBhY2tlZC5lbnVtcyA9IG5ldyBpbnRbXSB7Ci0gICAgICBOYW5vUmVwZWF0ZWRQYWNrYWJsZXMuRW51bS5PUFRJT05fT05FLAotICAgICAgTmFub1JlcGVhdGVkUGFja2FibGVzLkVudW0uT1BUSU9OX1RXTywKLSAgICB9OwotICAgIG5vblBhY2tlZC5ub2lzZSA9IDEzNTc5OwotCi0gICAgYnl0ZVtdIG5vblBhY2tlZFNlcmlhbGl6ZWQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShub25QYWNrZWQpOwotCi0gICAgTmFub1JlcGVhdGVkUGFja2FibGVzLlBhY2tlZCBwYWNrZWQgPQotICAgICAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20obmV3IE5hbm9SZXBlYXRlZFBhY2thYmxlcy5QYWNrZWQoKSwgbm9uUGFja2VkU2VyaWFsaXplZCk7Ci0gICAgYXNzZXJ0UmVwZWF0ZWRQYWNrYWJsZXNFcXVhbChub25QYWNrZWQsIHBhY2tlZCk7Ci0KLSAgICBieXRlW10gcGFja2VkU2VyaWFsaXplZCA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KHBhY2tlZCk7Ci0gICAgLy8gSnVzdCBhIGNhdXRpb3VzIGNoZWNrIHRoYXQgdGhlIHR3byBzZXJpYWxpemVkIGZvcm1zIGFyZSBkaWZmZXJlbnQsCi0gICAgLy8gdG8gbWFrZSBzdXJlIHRoZSByZW1haW5pbmcgb2YgdGhpcyB0ZXN0IGlzIHVzZWZ1bDoKLSAgICBhc3NlcnRGYWxzZShBcnJheXMuZXF1YWxzKG5vblBhY2tlZFNlcmlhbGl6ZWQsIHBhY2tlZFNlcmlhbGl6ZWQpKTsKLQotICAgIG5vblBhY2tlZCA9IE1lc3NhZ2VOYW5vLm1lcmdlRnJvbShuZXcgTmFub1JlcGVhdGVkUGFja2FibGVzLk5vblBhY2tlZCgpLCBwYWNrZWRTZXJpYWxpemVkKTsKLSAgICBhc3NlcnRSZXBlYXRlZFBhY2thYmxlc0VxdWFsKG5vblBhY2tlZCwgcGFja2VkKTsKLQotICAgIC8vIFRlc3QgbWl4ZWQgc2VyaWFsaXplZCBmb3JtLgotICAgIGJ5dGVbXSBtaXhlZFNlcmlhbGl6ZWQgPSBuZXcgYnl0ZVtub25QYWNrZWRTZXJpYWxpemVkLmxlbmd0aCArIHBhY2tlZFNlcmlhbGl6ZWQubGVuZ3RoXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KG5vblBhY2tlZFNlcmlhbGl6ZWQsIDAsIG1peGVkU2VyaWFsaXplZCwgMCwgbm9uUGFja2VkU2VyaWFsaXplZC5sZW5ndGgpOwotICAgIFN5c3RlbS5hcnJheWNvcHkocGFja2VkU2VyaWFsaXplZCwgMCwKLSAgICAgICAgbWl4ZWRTZXJpYWxpemVkLCBub25QYWNrZWRTZXJpYWxpemVkLmxlbmd0aCwgcGFja2VkU2VyaWFsaXplZC5sZW5ndGgpOwotCi0gICAgbm9uUGFja2VkID0gTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKG5ldyBOYW5vUmVwZWF0ZWRQYWNrYWJsZXMuTm9uUGFja2VkKCksIG1peGVkU2VyaWFsaXplZCk7Ci0gICAgcGFja2VkID0gTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKG5ldyBOYW5vUmVwZWF0ZWRQYWNrYWJsZXMuUGFja2VkKCksIG1peGVkU2VyaWFsaXplZCk7Ci0gICAgYXNzZXJ0UmVwZWF0ZWRQYWNrYWJsZXNFcXVhbChub25QYWNrZWQsIHBhY2tlZCk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5ldyBpbnRbXSB7MTAwMCwgMiwgMywgMTAwMCwgMiwgM30sIG5vblBhY2tlZC5pbnQzMlMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsxMzAwMCwgMTQsIDE1LCAxMzAwMCwgMTQsIDE1fSwgbm9uUGFja2VkLnNpbnQzMlMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobmV3IGludFtdIHsyNSwgMjYsIDI3LCAyNSwgMjYsIDI3fSwgbm9uUGFja2VkLnNmaXhlZDMyUykpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhuZXcgYm9vbGVhbltdIHtmYWxzZSwgdHJ1ZSwgZmFsc2UsIHRydWV9LCBub25QYWNrZWQuYm9vbHMpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNYXBzU2VyaWFsaXplQW5kUGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwIG9yaWdpbiA9IG5ldyBUZXN0TWFwKCk7Ci0gICAgc2V0TWFwTWVzc2FnZShvcmlnaW4pOwotICAgIGFzc2VydE1hcE1lc3NhZ2VTZXQob3JpZ2luKTsKLQotICAgIGJ5dGVbXSBvdXRwdXQgPSBNZXNzYWdlTmFuby50b0J5dGVBcnJheShvcmlnaW4pOwotICAgIFRlc3RNYXAgcGFyc2VkID0gbmV3IFRlc3RNYXAoKTsKLSAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20ocGFyc2VkLCBvdXRwdXQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1hcFNlcmlhbGl6ZVJlamVjdE51bGwoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWFwIHByaW1pdGl2ZU1hcCA9IG5ldyBUZXN0TWFwKCk7Ci0gICAgcHJpbWl0aXZlTWFwLmludDMyVG9JbnQzMkZpZWxkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICBwcmltaXRpdmVNYXAuaW50MzJUb0ludDMyRmllbGQucHV0KG51bGwsIDEpOwotICAgIHRyeSB7Ci0gICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShwcmltaXRpdmVNYXApOwotICAgICAgZmFpbCgic2hvdWxkIHJlamVjdCBudWxsIGtleXMiKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgLy8gcGFzcy4KLSAgICB9Ci0KLSAgICBUZXN0TWFwIG1lc3NhZ2VNYXAgPSBuZXcgVGVzdE1hcCgpOwotICAgIG1lc3NhZ2VNYXAuaW50MzJUb01lc3NhZ2VGaWVsZCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIE1hcFRlc3RQcm90by5UZXN0TWFwLk1lc3NhZ2VWYWx1ZT4oKTsKLSAgICBtZXNzYWdlTWFwLmludDMyVG9NZXNzYWdlRmllbGQucHV0KDAsIG51bGwpOwotICAgIHRyeSB7Ci0gICAgICBNZXNzYWdlTmFuby50b0J5dGVBcnJheShtZXNzYWdlTWFwKTsKLSAgICAgIGZhaWwoInNob3VsZCByZWplY3QgbnVsbCB2YWx1ZXMiKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgLy8gcGFzcy4KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdGhhdCBtZXJnaW5nIGJ5dGVzIGNvbnRhaW5pbmcgY29uZmxpY3Rpbmcga2V5cyB3aXRoIG92ZXJyaWRlIHRoZQotICAgKiBtZXNzYWdlIHZhbHVlIGluc3RlYWQgb2YgbWVyZ2luZyB0aGUgbWVzc2FnZSB2YWx1ZSBpbnRvIHRoZSBleGlzdGluZyBlbnRyeS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RNYXBNZXJnZU92ZXJyaWRlTWVzc2FnZVZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAuTWVzc2FnZVZhbHVlIG9yaWdWYWx1ZSA9IG5ldyBUZXN0TWFwLk1lc3NhZ2VWYWx1ZSgpOwotICAgIG9yaWdWYWx1ZS52YWx1ZSA9IDE7Ci0gICAgb3JpZ1ZhbHVlLnZhbHVlMiA9IDI7Ci0gICAgVGVzdE1hcC5NZXNzYWdlVmFsdWUgbmV3VmFsdWUgPSBuZXcgVGVzdE1hcC5NZXNzYWdlVmFsdWUoKTsKLSAgICBuZXdWYWx1ZS52YWx1ZSA9IDM7Ci0KLSAgICBUZXN0TWFwIG9yaWdNZXNzYWdlID0gbmV3IFRlc3RNYXAoKTsKLSAgICBvcmlnTWVzc2FnZS5pbnQzMlRvTWVzc2FnZUZpZWxkID0KLSAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgTWFwVGVzdFByb3RvLlRlc3RNYXAuTWVzc2FnZVZhbHVlPigpOwotICAgIG9yaWdNZXNzYWdlLmludDMyVG9NZXNzYWdlRmllbGQucHV0KDEsIG9yaWdWYWx1ZSk7Ci0KLSAgICBUZXN0TWFwIG5ld01lc3NhZ2UgPSBuZXcgVGVzdE1hcCgpOwotICAgIG5ld01lc3NhZ2UuaW50MzJUb01lc3NhZ2VGaWVsZCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIE1hcFRlc3RQcm90by5UZXN0TWFwLk1lc3NhZ2VWYWx1ZT4oKTsKLSAgICBuZXdNZXNzYWdlLmludDMyVG9NZXNzYWdlRmllbGQucHV0KDEsIG5ld1ZhbHVlKTsKLSAgICBNZXNzYWdlTmFuby5tZXJnZUZyb20ob3JpZ01lc3NhZ2UsCi0gICAgICAgIE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG5ld01lc3NhZ2UpKTsKLSAgICBUZXN0TWFwLk1lc3NhZ2VWYWx1ZSBtZXJnZWRWYWx1ZSA9IG9yaWdNZXNzYWdlLmludDMyVG9NZXNzYWdlRmllbGQuZ2V0KDEpOwotICAgIGFzc2VydEVxdWFscygzLCBtZXJnZWRWYWx1ZS52YWx1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lcmdlZFZhbHVlLnZhbHVlMik7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdHMgdGhhdCB3aGVuIG1lcmdpbmcgd2l0aCBlbXB0eSBlbnRyaWVzLAotICAgKiB3ZSB3aWxsIHVzZSBkZWZhdWx0IGZvciB0aGUga2V5IGFuZCB2YWx1ZSwgaW5zdGVhZCBvZiBudWxsLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdE1hcE1lcmdlRW1wdHlFbnRyeSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAgdGVzdE1hcCA9IG5ldyBUZXN0TWFwKCk7Ci0gICAgYnl0ZVtdIGJ1ZmZlciA9IG5ldyBieXRlWzEwMjRdOwotICAgIENvZGVkT3V0cHV0Qnl0ZUJ1ZmZlck5hbm8gb3V0cHV0ID0KLSAgICAgICAgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFuby5uZXdJbnN0YW5jZShidWZmZXIpOwotICAgIC8vIEFuIGVtcHR5IGVudHJ5IGZvciBpbnQzMl90b19pbnQzMiBtYXAuCi0gICAgb3V0cHV0LndyaXRlVGFnKDEsIFdpcmVGb3JtYXROYW5vLldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDApOwotICAgIC8vIEFuIGVtcHR5IGVudHJ5IGZvciBpbnQzMl90b19tZXNzYWdlIG1hcC4KLSAgICBvdXRwdXQud3JpdGVUYWcoNSwgV2lyZUZvcm1hdE5hbm8uV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoMCk7Ci0KLSAgICBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gaW5wdXQgPSBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8ubmV3SW5zdGFuY2UoCi0gICAgICAgIGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCAtIG91dHB1dC5zcGFjZUxlZnQoKSk7Ci0gICAgdGVzdE1hcC5tZXJnZUZyb20oaW5wdXQpOwotICAgIGFzc2VydE5vdE51bGwodGVzdE1hcC5pbnQzMlRvSW50MzJGaWVsZCk7OwotICAgIGFzc2VydEVxdWFscygxLCB0ZXN0TWFwLmludDMyVG9JbnQzMkZpZWxkLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEludGVnZXIudmFsdWVPZigwKSwgdGVzdE1hcC5pbnQzMlRvSW50MzJGaWVsZC5nZXQoMCkpOwotICAgIGFzc2VydE5vdE51bGwodGVzdE1hcC5pbnQzMlRvTWVzc2FnZUZpZWxkKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgdGVzdE1hcC5pbnQzMlRvTWVzc2FnZUZpZWxkLnNpemUoKSk7Ci0gICAgVGVzdE1hcC5NZXNzYWdlVmFsdWUgbWVzc2FnZVZhbHVlID0gdGVzdE1hcC5pbnQzMlRvTWVzc2FnZUZpZWxkLmdldCgwKTsKLSAgICBhc3NlcnROb3ROdWxsKG1lc3NhZ2VWYWx1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2VWYWx1ZS52YWx1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2VWYWx1ZS52YWx1ZTIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1hcEVxdWFscygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RNYXAgYSA9IG5ldyBUZXN0TWFwKCk7Ci0gICAgVGVzdE1hcCBiID0gbmV3IFRlc3RNYXAoKTsKLQotICAgIC8vIGVtcHR5IGFuZCBudWxsIG1hcCBmaWVsZHMgYXJlIGVxdWFsLgotICAgIGFzc2VydFRlc3RNYXBFcXVhbChhLCBiKTsKLSAgICBhLmludDMyVG9CeXRlc0ZpZWxkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgYnl0ZVtdPigpOwotICAgIGFzc2VydFRlc3RNYXBFcXVhbChhLCBiKTsKLQotICAgIGEuaW50MzJUb0ludDMyRmllbGQgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgIGIuaW50MzJUb0ludDMyRmllbGQgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgIHNldE1hcChhLmludDMyVG9JbnQzMkZpZWxkLCBkZWVwQ29weShpbnQzMlZhbHVlcyksIGRlZXBDb3B5KGludDMyVmFsdWVzKSk7Ci0gICAgc2V0TWFwKGIuaW50MzJUb0ludDMyRmllbGQsIGRlZXBDb3B5KGludDMyVmFsdWVzKSwgZGVlcENvcHkoaW50MzJWYWx1ZXMpKTsKLSAgICBhc3NlcnRUZXN0TWFwRXF1YWwoYSwgYik7Ci0KLSAgICBhLmludDMyVG9NZXNzYWdlRmllbGQgPQotICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBNYXBUZXN0UHJvdG8uVGVzdE1hcC5NZXNzYWdlVmFsdWU+KCk7Ci0gICAgYi5pbnQzMlRvTWVzc2FnZUZpZWxkID0KLSAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgTWFwVGVzdFByb3RvLlRlc3RNYXAuTWVzc2FnZVZhbHVlPigpOwotICAgIHNldE1hcChhLmludDMyVG9NZXNzYWdlRmllbGQsCi0gICAgICAgIGRlZXBDb3B5KGludDMyVmFsdWVzKSwgZGVlcENvcHkobWVzc2FnZVZhbHVlcykpOwotICAgIHNldE1hcChiLmludDMyVG9NZXNzYWdlRmllbGQsCi0gICAgICAgIGRlZXBDb3B5KGludDMyVmFsdWVzKSwgZGVlcENvcHkobWVzc2FnZVZhbHVlcykpOwotICAgIGFzc2VydFRlc3RNYXBFcXVhbChhLCBiKTsKLQotICAgIGEuc3RyaW5nVG9JbnQzMkZpZWxkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgIGIuc3RyaW5nVG9JbnQzMkZpZWxkID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBJbnRlZ2VyPigpOwotICAgIHNldE1hcChhLnN0cmluZ1RvSW50MzJGaWVsZCwgZGVlcENvcHkoc3RyaW5nVmFsdWVzKSwgZGVlcENvcHkoaW50MzJWYWx1ZXMpKTsKLSAgICBzZXRNYXAoYi5zdHJpbmdUb0ludDMyRmllbGQsIGRlZXBDb3B5KHN0cmluZ1ZhbHVlcyksIGRlZXBDb3B5KGludDMyVmFsdWVzKSk7Ci0gICAgYXNzZXJ0VGVzdE1hcEVxdWFsKGEsIGIpOwotCi0gICAgYS5pbnQzMlRvQnl0ZXNGaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIGJ5dGVbXT4oKTsKLSAgICBiLmludDMyVG9CeXRlc0ZpZWxkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgYnl0ZVtdPigpOwotICAgIHNldE1hcChhLmludDMyVG9CeXRlc0ZpZWxkLCBkZWVwQ29weShpbnQzMlZhbHVlcyksIGRlZXBDb3B5KGJ5dGVzVmFsdWVzKSk7Ci0gICAgc2V0TWFwKGIuaW50MzJUb0J5dGVzRmllbGQsIGRlZXBDb3B5KGludDMyVmFsdWVzKSwgZGVlcENvcHkoYnl0ZXNWYWx1ZXMpKTsKLSAgICBhc3NlcnRUZXN0TWFwRXF1YWwoYSwgYik7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdGhlIG1hcCBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBtYXR0ZXIuCi0gICAgYS5pbnQzMlRvU3RyaW5nRmllbGQgPSBuZXcgVHJlZU1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgYi5pbnQzMlRvU3RyaW5nRmllbGQgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBTdHJpbmc+KCk7Ci0gICAgc2V0TWFwKGEuaW50MzJUb1N0cmluZ0ZpZWxkLCBkZWVwQ29weShpbnQzMlZhbHVlcyksIGRlZXBDb3B5KHN0cmluZ1ZhbHVlcykpOwotICAgIHNldE1hcChiLmludDMyVG9TdHJpbmdGaWVsZCwgZGVlcENvcHkoaW50MzJWYWx1ZXMpLCBkZWVwQ29weShzdHJpbmdWYWx1ZXMpKTsKLSAgICBhc3NlcnRUZXN0TWFwRXF1YWwoYSwgYik7Ci0KLSAgICBhLmNsZWFyKCk7Ci0gICAgYi5jbGVhcigpOwotCi0gICAgLy8gdW5lcXVhbCBjYXNlczogZGlmZmVyZW50IHZhbHVlCi0gICAgYS5pbnQzMlRvSW50MzJGaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0gICAgYi5pbnQzMlRvSW50MzJGaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0gICAgYS5pbnQzMlRvSW50MzJGaWVsZC5wdXQoMSwgMSk7Ci0gICAgYi5pbnQzMlRvSW50MzJGaWVsZC5wdXQoMSwgMik7Ci0gICAgYXNzZXJ0VGVzdE1hcFVuZXF1YWwoYSwgYik7Ci0gICAgLy8gdW5lcXVhbCBjYXNlOiBhZGRpdGlvbmFsIGVudHJ5Ci0gICAgYi5pbnQzMlRvSW50MzJGaWVsZC5wdXQoMSwgMSk7Ci0gICAgYi5pbnQzMlRvSW50MzJGaWVsZC5wdXQoMiwgMSk7Ci0gICAgYXNzZXJ0VGVzdE1hcFVuZXF1YWwoYSwgYik7Ci0gICAgYS5pbnQzMlRvSW50MzJGaWVsZC5wdXQoMiwgMSk7Ci0gICAgYXNzZXJ0VGVzdE1hcEVxdWFsKGEsIGIpOwotCi0gICAgLy8gdW5lcXVhbCBjYXNlOiBkaWZmZXJlbnQgbWVzc2FnZSB2YWx1ZS4KLSAgICBhLmludDMyVG9NZXNzYWdlRmllbGQgPQotICAgICAgICBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBNYXBUZXN0UHJvdG8uVGVzdE1hcC5NZXNzYWdlVmFsdWU+KCk7Ci0gICAgYi5pbnQzMlRvTWVzc2FnZUZpZWxkID0KLSAgICAgICAgbmV3IEhhc2hNYXA8SW50ZWdlciwgTWFwVGVzdFByb3RvLlRlc3RNYXAuTWVzc2FnZVZhbHVlPigpOwotICAgIE1lc3NhZ2VWYWx1ZSB2YSA9IG5ldyBNZXNzYWdlVmFsdWUoKTsKLSAgICB2YS52YWx1ZSA9IDE7Ci0gICAgTWVzc2FnZVZhbHVlIHZiID0gbmV3IE1lc3NhZ2VWYWx1ZSgpOwotICAgIHZiLnZhbHVlID0gMTsKLSAgICBhLmludDMyVG9NZXNzYWdlRmllbGQucHV0KDEsIHZhKTsKLSAgICBiLmludDMyVG9NZXNzYWdlRmllbGQucHV0KDEsIHZiKTsKLSAgICBhc3NlcnRUZXN0TWFwRXF1YWwoYSwgYik7Ci0gICAgdmIudmFsdWUgPSAyOwotICAgIGFzc2VydFRlc3RNYXBVbmVxdWFsKGEsIGIpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRUZXN0TWFwRXF1YWwoVGVzdE1hcCBhLCBUZXN0TWFwIGIpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoYS5oYXNoQ29kZSgpLCBiLmhhc2hDb2RlKCkpOwotICAgIGFzc2VydFRydWUoYS5lcXVhbHMoYikpOwotICAgIGFzc2VydFRydWUoYi5lcXVhbHMoYSkpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRUZXN0TWFwVW5lcXVhbChUZXN0TWFwIGEsIFRlc3RNYXAgYikKLSAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEZhbHNlKGEuZXF1YWxzKGIpKTsKLSAgICBhc3NlcnRGYWxzZShiLmVxdWFscyhhKSk7Ci0gIH0KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyW10gaW50MzJWYWx1ZXMgPSBuZXcgSW50ZWdlcltdIHsKLSAgICAwLCAxLCAtMSwgSW50ZWdlci5NQVhfVkFMVUUsIEludGVnZXIuTUlOX1ZBTFVFLAotICB9OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIExvbmdbXSBpbnQ2NFZhbHVlcyA9IG5ldyBMb25nW10gewotICAgIDBMLCAxTCwgLTFMLCBMb25nLk1BWF9WQUxVRSwgTG9uZy5NSU5fVkFMVUUsCi0gIH07Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgU3RyaW5nW10gc3RyaW5nVmFsdWVzID0gbmV3IFN0cmluZ1tdIHsKLSAgICAiIiwgImhlbGxvIiwgIndvcmxkIiwgImZvbyIsICJiYXIiLAotICB9OwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGJ5dGVbXVtdIGJ5dGVzVmFsdWVzID0gbmV3IGJ5dGVbXVtdIHsKLSAgICBuZXcgYnl0ZVtdIHt9LAotICAgIG5ldyBieXRlW10gezB9LAotICAgIG5ldyBieXRlW10gezEsIC0xfSwKLSAgICBuZXcgYnl0ZVtdIHsxMjcsIC0xMjh9LAotICAgIG5ldyBieXRlW10geydhJywgJ2InLCAnMCcsICcxJ30sCi0gIH07Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgQm9vbGVhbltdIGJvb2xWYWx1ZXMgPSBuZXcgQm9vbGVhbltdIHsKLSAgICBmYWxzZSwgdHJ1ZSwKLSAgfTsKLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBJbnRlZ2VyW10gZW51bVZhbHVlcyA9IG5ldyBJbnRlZ2VyW10gewotICAgIFRlc3RNYXAuRk9PLCBUZXN0TWFwLkJBUiwgVGVzdE1hcC5CQVosIFRlc3RNYXAuUVVYLAotICAgIEludGVnZXIuTUFYX1ZBTFVFIC8qIHVua25vd24gKi8sCi0gIH07Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVzdE1hcC5NZXNzYWdlVmFsdWVbXSBtZXNzYWdlVmFsdWVzID0KLSAgICAgIG5ldyBUZXN0TWFwLk1lc3NhZ2VWYWx1ZVtdIHsKLSAgICBuZXdNYXBWYWx1ZU1lc3NhZ2UoMCksCi0gICAgbmV3TWFwVmFsdWVNZXNzYWdlKDEpLAotICAgIG5ld01hcFZhbHVlTWVzc2FnZSgtMSksCi0gICAgbmV3TWFwVmFsdWVNZXNzYWdlKEludGVnZXIuTUFYX1ZBTFVFKSwKLSAgICBuZXdNYXBWYWx1ZU1lc3NhZ2UoSW50ZWdlci5NSU5fVkFMVUUpLAotICB9OwotCi0gIHByaXZhdGUgc3RhdGljIFRlc3RNYXAuTWVzc2FnZVZhbHVlIG5ld01hcFZhbHVlTWVzc2FnZShpbnQgdmFsdWUpIHsKLSAgICBUZXN0TWFwLk1lc3NhZ2VWYWx1ZSByZXN1bHQgPSBuZXcgVGVzdE1hcC5NZXNzYWdlVmFsdWUoKTsKLSAgICByZXN1bHQudmFsdWUgPSB2YWx1ZTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHByaXZhdGUgc3RhdGljIDxUPiBUW10gZGVlcENvcHkoVFtdIG9yaWcpIHRocm93cyBFeGNlcHRpb24gewotICAgIGlmIChvcmlnIGluc3RhbmNlb2YgTWVzc2FnZVZhbHVlW10pIHsKLSAgICAgIE1lc3NhZ2VWYWx1ZVtdIHJlc3VsdCA9IG5ldyBNZXNzYWdlVmFsdWVbb3JpZy5sZW5ndGhdOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcmlnLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIHJlc3VsdFtpXSA9IG5ldyBNZXNzYWdlVmFsdWUoKTsKLSAgICAgICAgTWVzc2FnZU5hbm8ubWVyZ2VGcm9tKAotICAgICAgICAgICAgcmVzdWx0W2ldLCBNZXNzYWdlTmFuby50b0J5dGVBcnJheSgoTWVzc2FnZVZhbHVlKSBvcmlnW2ldKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gKFRbXSkgcmVzdWx0OwotICAgIH0KLSAgICBpZiAob3JpZyBpbnN0YW5jZW9mIGJ5dGVbXVtdKSB7Ci0gICAgICBieXRlW11bXSByZXN1bHQgPSBuZXcgYnl0ZVtvcmlnLmxlbmd0aF1bXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3JpZy5sZW5ndGg7IGkrKykgewotICAgICAgICBieXRlW10gb3JpZ0J5dGVzID0gKGJ5dGVbXSkgb3JpZ1tpXTsKLSAgICAgICAgcmVzdWx0W2ldID0gQXJyYXlzLmNvcHlPZihvcmlnQnl0ZXMsIG9yaWdCeXRlcy5sZW5ndGgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gQXJyYXlzLmNvcHlPZihvcmlnLCBvcmlnLmxlbmd0aCk7Ci0gIH0KLQotICBwcml2YXRlIDxLLCBWPiB2b2lkIHNldE1hcChNYXA8SywgVj4gbWFwLCBLW10ga2V5cywgVltdIHZhbHVlcykgewotICAgIGFzc2VydChrZXlzLmxlbmd0aCA9PSB2YWx1ZXMubGVuZ3RoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGtleXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIG1hcC5wdXQoa2V5c1tpXSwgdmFsdWVzW2ldKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIDxLLCBWPiB2b2lkIGFzc2VydE1hcFNldCgKLSAgICAgIE1hcDxLLCBWPiBtYXAsIEtbXSBrZXlzLCBWW10gdmFsdWVzKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnQoa2V5cy5sZW5ndGggPT0gdmFsdWVzLmxlbmd0aCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyh2YWx1ZXNbaV0sIG1hcC5nZXQoa2V5c1tpXSkpOwotICAgIH0KLSAgICBhc3NlcnRFcXVhbHMoa2V5cy5sZW5ndGgsIG1hcC5zaXplKCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHNldE1hcE1lc3NhZ2UoVGVzdE1hcCB0ZXN0TWFwKSB7Ci0gICAgdGVzdE1hcC5pbnQzMlRvSW50MzJGaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIEludGVnZXI+KCk7Ci0gICAgdGVzdE1hcC5pbnQzMlRvQnl0ZXNGaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIGJ5dGVbXT4oKTsKLSAgICB0ZXN0TWFwLmludDMyVG9FbnVtRmllbGQgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgIHRlc3RNYXAuaW50MzJUb01lc3NhZ2VGaWVsZCA9Ci0gICAgICAgIG5ldyBIYXNoTWFwPEludGVnZXIsIE1hcFRlc3RQcm90by5UZXN0TWFwLk1lc3NhZ2VWYWx1ZT4oKTsKLSAgICB0ZXN0TWFwLmludDMyVG9TdHJpbmdGaWVsZCA9IG5ldyBIYXNoTWFwPEludGVnZXIsIFN0cmluZz4oKTsKLSAgICB0ZXN0TWFwLnN0cmluZ1RvSW50MzJGaWVsZCA9IG5ldyBIYXNoTWFwPFN0cmluZywgSW50ZWdlcj4oKTsKLSAgICB0ZXN0TWFwLmJvb2xUb0Jvb2xGaWVsZCA9IG5ldyBIYXNoTWFwPEJvb2xlYW4sIEJvb2xlYW4+KCk7Ci0gICAgdGVzdE1hcC51aW50MzJUb1VpbnQzMkZpZWxkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICB0ZXN0TWFwLnNpbnQzMlRvU2ludDMyRmllbGQgPSBuZXcgSGFzaE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPigpOwotICAgIHRlc3RNYXAuZml4ZWQzMlRvRml4ZWQzMkZpZWxkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICB0ZXN0TWFwLnNmaXhlZDMyVG9TZml4ZWQzMkZpZWxkID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICB0ZXN0TWFwLmludDY0VG9JbnQ2NEZpZWxkID0gbmV3IEhhc2hNYXA8TG9uZywgTG9uZz4oKTsKLSAgICB0ZXN0TWFwLnVpbnQ2NFRvVWludDY0RmllbGQgPSBuZXcgSGFzaE1hcDxMb25nLCBMb25nPigpOwotICAgIHRlc3RNYXAuc2ludDY0VG9TaW50NjRGaWVsZCA9IG5ldyBIYXNoTWFwPExvbmcsIExvbmc+KCk7Ci0gICAgdGVzdE1hcC5maXhlZDY0VG9GaXhlZDY0RmllbGQgPSBuZXcgSGFzaE1hcDxMb25nLCBMb25nPigpOwotICAgIHRlc3RNYXAuc2ZpeGVkNjRUb1NmaXhlZDY0RmllbGQgPSBuZXcgSGFzaE1hcDxMb25nLCBMb25nPigpOwotICAgIHNldE1hcCh0ZXN0TWFwLmludDMyVG9JbnQzMkZpZWxkLCBpbnQzMlZhbHVlcywgaW50MzJWYWx1ZXMpOwotICAgIHNldE1hcCh0ZXN0TWFwLmludDMyVG9CeXRlc0ZpZWxkLCBpbnQzMlZhbHVlcywgYnl0ZXNWYWx1ZXMpOwotICAgIHNldE1hcCh0ZXN0TWFwLmludDMyVG9FbnVtRmllbGQsIGludDMyVmFsdWVzLCBlbnVtVmFsdWVzKTsKLSAgICBzZXRNYXAodGVzdE1hcC5pbnQzMlRvTWVzc2FnZUZpZWxkLCBpbnQzMlZhbHVlcywgbWVzc2FnZVZhbHVlcyk7Ci0gICAgc2V0TWFwKHRlc3RNYXAuaW50MzJUb1N0cmluZ0ZpZWxkLCBpbnQzMlZhbHVlcywgc3RyaW5nVmFsdWVzKTsKLSAgICBzZXRNYXAodGVzdE1hcC5zdHJpbmdUb0ludDMyRmllbGQsIHN0cmluZ1ZhbHVlcywgaW50MzJWYWx1ZXMpOwotICAgIHNldE1hcCh0ZXN0TWFwLmJvb2xUb0Jvb2xGaWVsZCwgYm9vbFZhbHVlcywgYm9vbFZhbHVlcyk7Ci0gICAgc2V0TWFwKHRlc3RNYXAudWludDMyVG9VaW50MzJGaWVsZCwgaW50MzJWYWx1ZXMsIGludDMyVmFsdWVzKTsKLSAgICBzZXRNYXAodGVzdE1hcC5zaW50MzJUb1NpbnQzMkZpZWxkLCBpbnQzMlZhbHVlcywgaW50MzJWYWx1ZXMpOwotICAgIHNldE1hcCh0ZXN0TWFwLmZpeGVkMzJUb0ZpeGVkMzJGaWVsZCwgaW50MzJWYWx1ZXMsIGludDMyVmFsdWVzKTsKLSAgICBzZXRNYXAodGVzdE1hcC5zZml4ZWQzMlRvU2ZpeGVkMzJGaWVsZCwgaW50MzJWYWx1ZXMsIGludDMyVmFsdWVzKTsKLSAgICBzZXRNYXAodGVzdE1hcC5pbnQ2NFRvSW50NjRGaWVsZCwgaW50NjRWYWx1ZXMsIGludDY0VmFsdWVzKTsKLSAgICBzZXRNYXAodGVzdE1hcC51aW50NjRUb1VpbnQ2NEZpZWxkLCBpbnQ2NFZhbHVlcywgaW50NjRWYWx1ZXMpOwotICAgIHNldE1hcCh0ZXN0TWFwLnNpbnQ2NFRvU2ludDY0RmllbGQsIGludDY0VmFsdWVzLCBpbnQ2NFZhbHVlcyk7Ci0gICAgc2V0TWFwKHRlc3RNYXAuZml4ZWQ2NFRvRml4ZWQ2NEZpZWxkLCBpbnQ2NFZhbHVlcywgaW50NjRWYWx1ZXMpOwotICAgIHNldE1hcCh0ZXN0TWFwLnNmaXhlZDY0VG9TZml4ZWQ2NEZpZWxkLCBpbnQ2NFZhbHVlcywgaW50NjRWYWx1ZXMpOwotICB9Ci0gIHByaXZhdGUgdm9pZCBhc3NlcnRNYXBNZXNzYWdlU2V0KFRlc3RNYXAgdGVzdE1hcCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0TWFwU2V0KHRlc3RNYXAuaW50MzJUb0ludDMyRmllbGQsIGludDMyVmFsdWVzLCBpbnQzMlZhbHVlcyk7Ci0gICAgYXNzZXJ0TWFwU2V0KHRlc3RNYXAuaW50MzJUb0J5dGVzRmllbGQsIGludDMyVmFsdWVzLCBieXRlc1ZhbHVlcyk7Ci0gICAgYXNzZXJ0TWFwU2V0KHRlc3RNYXAuaW50MzJUb0VudW1GaWVsZCwgaW50MzJWYWx1ZXMsIGVudW1WYWx1ZXMpOwotICAgIGFzc2VydE1hcFNldCh0ZXN0TWFwLmludDMyVG9NZXNzYWdlRmllbGQsIGludDMyVmFsdWVzLCBtZXNzYWdlVmFsdWVzKTsKLSAgICBhc3NlcnRNYXBTZXQodGVzdE1hcC5pbnQzMlRvU3RyaW5nRmllbGQsIGludDMyVmFsdWVzLCBzdHJpbmdWYWx1ZXMpOwotICAgIGFzc2VydE1hcFNldCh0ZXN0TWFwLnN0cmluZ1RvSW50MzJGaWVsZCwgc3RyaW5nVmFsdWVzLCBpbnQzMlZhbHVlcyk7Ci0gICAgYXNzZXJ0TWFwU2V0KHRlc3RNYXAuYm9vbFRvQm9vbEZpZWxkLCBib29sVmFsdWVzLCBib29sVmFsdWVzKTsKLSAgICBhc3NlcnRNYXBTZXQodGVzdE1hcC51aW50MzJUb1VpbnQzMkZpZWxkLCBpbnQzMlZhbHVlcywgaW50MzJWYWx1ZXMpOwotICAgIGFzc2VydE1hcFNldCh0ZXN0TWFwLnNpbnQzMlRvU2ludDMyRmllbGQsIGludDMyVmFsdWVzLCBpbnQzMlZhbHVlcyk7Ci0gICAgYXNzZXJ0TWFwU2V0KHRlc3RNYXAuZml4ZWQzMlRvRml4ZWQzMkZpZWxkLCBpbnQzMlZhbHVlcywgaW50MzJWYWx1ZXMpOwotICAgIGFzc2VydE1hcFNldCh0ZXN0TWFwLnNmaXhlZDMyVG9TZml4ZWQzMkZpZWxkLCBpbnQzMlZhbHVlcywgaW50MzJWYWx1ZXMpOwotICAgIGFzc2VydE1hcFNldCh0ZXN0TWFwLmludDY0VG9JbnQ2NEZpZWxkLCBpbnQ2NFZhbHVlcywgaW50NjRWYWx1ZXMpOwotICAgIGFzc2VydE1hcFNldCh0ZXN0TWFwLnVpbnQ2NFRvVWludDY0RmllbGQsIGludDY0VmFsdWVzLCBpbnQ2NFZhbHVlcyk7Ci0gICAgYXNzZXJ0TWFwU2V0KHRlc3RNYXAuc2ludDY0VG9TaW50NjRGaWVsZCwgaW50NjRWYWx1ZXMsIGludDY0VmFsdWVzKTsKLSAgICBhc3NlcnRNYXBTZXQodGVzdE1hcC5maXhlZDY0VG9GaXhlZDY0RmllbGQsIGludDY0VmFsdWVzLCBpbnQ2NFZhbHVlcyk7Ci0gICAgYXNzZXJ0TWFwU2V0KHRlc3RNYXAuc2ZpeGVkNjRUb1NmaXhlZDY0RmllbGQsIGludDY0VmFsdWVzLCBpbnQ2NFZhbHVlcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRGaWVsZEluaXRpYWxpemVkSW5SZWZ0eXBlc0NvbXBhdE1vZGUoKSB7Ci0gICAgTmFub1JlZmVyZW5jZVR5cGVzQ29tcGF0LlRlc3RBbGxUeXBlc05hbm8gcHJvdG8gPSBuZXcgTmFub1JlZmVyZW5jZVR5cGVzQ29tcGF0LlRlc3RBbGxUeXBlc05hbm8oKTsKLSAgICBhc3NlcnROb3ROdWxsKHByb3RvLnJlcGVhdGVkU3RyaW5nKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRSZXBlYXRlZFBhY2thYmxlc0VxdWFsKAotICAgICAgTmFub1JlcGVhdGVkUGFja2FibGVzLk5vblBhY2tlZCBub25QYWNrZWQsIE5hbm9SZXBlYXRlZFBhY2thYmxlcy5QYWNrZWQgcGFja2VkKSB7Ci0gICAgLy8gTm90IHVzaW5nIE1lc3NhZ2VOYW5vLmVxdWFscygpIC0tIHRoYXQgYmVsb25ncyB0byBhIHNlcGFyYXRlIHRlc3QuCi0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5vblBhY2tlZC5pbnQzMlMsIHBhY2tlZC5pbnQzMlMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobm9uUGFja2VkLmludDY0UywgcGFja2VkLmludDY0UykpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhub25QYWNrZWQudWludDMyUywgcGFja2VkLnVpbnQzMlMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobm9uUGFja2VkLnVpbnQ2NFMsIHBhY2tlZC51aW50NjRTKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5vblBhY2tlZC5zaW50MzJTLCBwYWNrZWQuc2ludDMyUykpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhub25QYWNrZWQuc2ludDY0UywgcGFja2VkLnNpbnQ2NFMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobm9uUGFja2VkLmZpeGVkMzJTLCBwYWNrZWQuZml4ZWQzMlMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobm9uUGFja2VkLmZpeGVkNjRTLCBwYWNrZWQuZml4ZWQ2NFMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobm9uUGFja2VkLnNmaXhlZDMyUywgcGFja2VkLnNmaXhlZDMyUykpOwotICAgIGFzc2VydFRydWUoQXJyYXlzLmVxdWFscyhub25QYWNrZWQuc2ZpeGVkNjRTLCBwYWNrZWQuc2ZpeGVkNjRTKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5vblBhY2tlZC5mbG9hdHMsIHBhY2tlZC5mbG9hdHMpKTsKLSAgICBhc3NlcnRUcnVlKEFycmF5cy5lcXVhbHMobm9uUGFja2VkLmRvdWJsZXMsIHBhY2tlZC5kb3VibGVzKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5vblBhY2tlZC5ib29scywgcGFja2VkLmJvb2xzKSk7Ci0gICAgYXNzZXJ0VHJ1ZShBcnJheXMuZXF1YWxzKG5vblBhY2tlZC5lbnVtcywgcGFja2VkLmVudW1zKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xvbmUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBBIHNpbXBsZSBtZXNzYWdlLgotICAgIEFub3RoZXJNZXNzYWdlIGFub3RoZXJNZXNzYWdlID0gbmV3IEFub3RoZXJNZXNzYWdlKCk7Ci0gICAgYW5vdGhlck1lc3NhZ2Uuc3RyaW5nID0gIkhlbGxvIjsKLSAgICBhbm90aGVyTWVzc2FnZS52YWx1ZSA9IHRydWU7Ci0gICAgYW5vdGhlck1lc3NhZ2UuaW50ZWdlcnMgPSBuZXcgaW50W10geyAxLCAyLCAzIH07Ci0KLSAgICBBbm90aGVyTWVzc2FnZSBjbG9uZSA9IGFub3RoZXJNZXNzYWdlLmNsb25lKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNsb25lLCBhbm90aGVyTWVzc2FnZSk7Ci0KLSAgICAvLyBWZXJpZnkgaXQgd2FzIGEgZGVlcCBjbG9uZSAtIGNoYW5nZXMgdG8gdGhlIGNsb25lIHNob3VsZG4ndCBhZmZlY3QgdGhlCi0gICAgLy8gb3JpZ2luYWwuCi0gICAgY2xvbmUuaW50ZWdlcnNbMV0gPSAxMDA7Ci0gICAgYXNzZXJ0RmFsc2UoY2xvbmUuZXF1YWxzKGFub3RoZXJNZXNzYWdlKSk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0SGFzV2lyZURhdGEoTWVzc2FnZU5hbm8gbWVzc2FnZSwgYm9vbGVhbiBleHBlY3RlZCkgewotICAgIGJ5dGVbXSBieXRlcyA9IE1lc3NhZ2VOYW5vLnRvQnl0ZUFycmF5KG1lc3NhZ2UpOwotICAgIGludCB3aXJlTGVuZ3RoID0gYnl0ZXMubGVuZ3RoOwotICAgIGlmIChleHBlY3RlZCkgewotICAgICAgYXNzZXJ0RmFsc2Uod2lyZUxlbmd0aCA9PSAwKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHdpcmVMZW5ndGggIT0gMCkgewotICAgICAgICBmYWlsKCJFeHBlY3RlZCBubyB3aXJlIGRhdGEgZm9yIG1lc3NhZ2UgXG4iICsgbWVzc2FnZQotICAgICAgICAgICAgKyAiXG5CdXQgZ290OlxuIgotICAgICAgICAgICAgKyBoZXhEdW1wKGJ5dGVzKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGhleER1bXAoYnl0ZVtdIGJ5dGVzKSB7Ci0gICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgZm9yIChieXRlIGIgOiBieXRlcykgewotICAgICAgc2IuYXBwZW5kKFN0cmluZy5mb3JtYXQoIiUwMnggIiwgYikpOwotICAgIH0KLSAgICByZXR1cm4gc2IudG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vbWFwX3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby9tYXBfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTE0OThhNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby9tYXBfdGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDcwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBtYXBfdGVzdDsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJNYXBUZXN0UHJvdG8iOwotCi1tZXNzYWdlIFRlc3RNYXAgewotICBtZXNzYWdlIE1lc3NhZ2VWYWx1ZSB7Ci0gICAgaW50MzIgdmFsdWUgPSAxOwotICAgIGludDMyIHZhbHVlMiA9IDI7Ci0gIH0KLSAgZW51bSBFbnVtVmFsdWUgewotICAgIEZPTyA9IDA7Ci0gICAgQkFSID0gMTsKLSAgICBCQVogPSAyOwotICAgIFFVWCA9IDM7Ci0gIH0KLQotICBtYXA8aW50MzIsIGludDMyPiAgICAgICAgaW50MzJfdG9faW50MzJfZmllbGQgPSAxOwotICBtYXA8aW50MzIsIHN0cmluZz4gICAgICAgaW50MzJfdG9fc3RyaW5nX2ZpZWxkID0gMjsKLSAgbWFwPGludDMyLCBieXRlcz4gICAgICAgIGludDMyX3RvX2J5dGVzX2ZpZWxkID0gMzsKLSAgbWFwPGludDMyLCBFbnVtVmFsdWU+ICAgIGludDMyX3RvX2VudW1fZmllbGQgPSA0OwotICBtYXA8aW50MzIsIE1lc3NhZ2VWYWx1ZT4gaW50MzJfdG9fbWVzc2FnZV9maWVsZCA9IDU7Ci0gIG1hcDxzdHJpbmcsIGludDMyPiAgICAgICBzdHJpbmdfdG9faW50MzJfZmllbGQgPSA2OwotICBtYXA8Ym9vbCwgYm9vbD4gICAgICAgICAgYm9vbF90b19ib29sX2ZpZWxkID0gNzsKLQotICAvLyBUZXN0IGFsbCB0aGUgb3RoZXIgcHJpbWl0aXZlIHR5cGVzLiBBcyB0aGUga2V5IGFuZCB2YWx1ZSBhcmUgbm90IGNvdXBsZWQgaW4KLSAgLy8gdGhlIGltcGxlbWVudGF0aW9uLCB3ZSBkbyBub3QgdGVzdCBhbGwgdGhlIGNvbWJpbmF0aW9ucyBvZiBrZXkvdmFsdWUgcGFpcnMsCi0gIC8vIHNvIHRoYXQgd2UgY2FuIGtlZXAgdGhlIG51bWJlciBvZiB0ZXN0IGNhc2VzIG1hbmFnZWFibGUKLSAgbWFwPHVpbnQzMiwgdWludDMyPiAgICAgIHVpbnQzMl90b191aW50MzJfZmllbGQgPSAxMTsKLSAgbWFwPHNpbnQzMiwgc2ludDMyPiAgICAgIHNpbnQzMl90b19zaW50MzJfZmllbGQgPSAxMjsKLSAgbWFwPGZpeGVkMzIsIGZpeGVkMzI+ICAgIGZpeGVkMzJfdG9fZml4ZWQzMl9maWVsZCA9IDEzOwotICBtYXA8c2ZpeGVkMzIsIHNmaXhlZDMyPiAgc2ZpeGVkMzJfdG9fc2ZpeGVkMzJfZmllbGQgPSAxNDsKLSAgbWFwPGludDY0LCBpbnQ2ND4gICAgICAgIGludDY0X3RvX2ludDY0X2ZpZWxkID0gMTU7Ci0gIG1hcDx1aW50NjQsIHVpbnQ2ND4gICAgICB1aW50NjRfdG9fdWludDY0X2ZpZWxkID0gMTY7Ci0gIG1hcDxzaW50NjQsIHNpbnQ2ND4gICAgICBzaW50NjRfdG9fc2ludDY0X2ZpZWxkID0gMTc7Ci0gIG1hcDxmaXhlZDY0LCBmaXhlZDY0PiAgICBmaXhlZDY0X3RvX2ZpeGVkNjRfZmllbGQgPSAxODsKLSAgbWFwPHNmaXhlZDY0LCBzZml4ZWQ2ND4gIHNmaXhlZDY0X3RvX3NmaXhlZDY0X2ZpZWxkID0gMTk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9hY2Nlc3NvcnNfbmFuby5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2FjY2Vzc29yc19uYW5vLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTExZTQ3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2FjY2Vzc29yc19uYW5vLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTE4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IG1heHRyb3lAZ29vZ2xlLmNvbSAoTWF4IENhaSkKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJOYW5vQWNjZXNzb3JzT3V0ZXJDbGFzcyI7Ci0KLW1lc3NhZ2UgVGVzdE5hbm9BY2Nlc3NvcnMgewotCi0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOwotICB9Ci0KLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBGT08gPSAxOwotICAgIEJBUiA9IDI7Ci0gICAgQkFaID0gMzsKLSAgfQotCi0gIC8vIFNpbmd1bGFyCi0gIG9wdGlvbmFsIGludDMyICBvcHRpb25hbF9pbnQzMiAgICA9ICAxOwotICBvcHRpb25hbCBmbG9hdCAgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKLSAgb3B0aW9uYWwgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSAgID0gMTI7Ci0gIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgICA9IDE0OwotICBvcHRpb25hbCBieXRlcyAgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKLQotICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTg7Ci0KLSAgb3B0aW9uYWwgTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bSA9IDIxOwotCi0gIC8vIFJlcGVhdGVkCi0gIHJlcGVhdGVkIGludDMyICByZXBlYXRlZF9pbnQzMiAgICA9IDMxOwotICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nICAgPSA0NDsKLSAgcmVwZWF0ZWQgYnl0ZXMgIHJlcGVhdGVkX2J5dGVzICAgID0gNDU7Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAgPSA0ODsKLQotICByZXBlYXRlZCBOZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtICA9IDUxOwotCi0gIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKLSAgb3B0aW9uYWwgaW50MzIgIGRlZmF1bHRfaW50MzIgICAgPSA2MSBbZGVmYXVsdCA9ICA0MSAgICBdOwotICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmcgICA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07Ci0gIG9wdGlvbmFsIGJ5dGVzICBkZWZhdWx0X2J5dGVzICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKLQotICBvcHRpb25hbCBmbG9hdCBkZWZhdWx0X2Zsb2F0X25hbiA9IDk5ICBbZGVmYXVsdCA9ICBuYW5dOwotCi0gIG9wdGlvbmFsIE5lc3RlZEVudW0gZGVmYXVsdF9uZXN0ZWRfZW51bSA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKLQotICAvLyBSZXF1aXJlZAotICByZXF1aXJlZCBpbnQzMiBpZCA9IDg2OwotCi0gIC8vIEFkZCBlbm91Z2ggb3B0aW9uYWwgZmllbGRzIHRvIG1ha2UgMiBiaXQgZmllbGRzIGluIHRvdGFsCi0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEwMCA9IDEwMDsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTAxID0gMTAxOwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMDIgPSAxMDI7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEwMyA9IDEwMzsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTA0ID0gMTA0OwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMDUgPSAxMDU7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEwNiA9IDEwNjsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTA3ID0gMTA3OwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMDggPSAxMDg7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEwOSA9IDEwOTsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTEwID0gMTEwOwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMTEgPSAxMTE7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjExMiA9IDExMjsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTEzID0gMTEzOwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMTQgPSAxMTQ7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjExNSA9IDExNTsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTE2ID0gMTE2OwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMTcgPSAxMTc7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjExOCA9IDExODsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTE5ID0gMTE5OwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMjAgPSAxMjA7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEyMSA9IDEyMTsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTIyID0gMTIyOwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMjMgPSAxMjM7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEyNCA9IDEyNDsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTI1ID0gMTI1OwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMjYgPSAxMjY7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEyNyA9IDEyNzsKLSAgb3B0aW9uYWwgaW50MzIgZmlsbGVyMTI4ID0gMTI4OwotICBvcHRpb25hbCBpbnQzMiBmaWxsZXIxMjkgPSAxMjk7Ci0gIG9wdGlvbmFsIGludDMyIGZpbGxlcjEzMCA9IDEzMDsKLQotICBvcHRpb25hbCBpbnQzMiBiZWZvcmVfYml0X2ZpZWxkX2NoZWNrID0gMTM5OwotICBvcHRpb25hbCBpbnQzMiBiaXRfZmllbGRfY2hlY2sgPSAxNDA7Ci0gIG9wdGlvbmFsIGludDMyIGFmdGVyX2JpdF9maWVsZF9jaGVjayA9IDE0MTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2VudW1fY2xhc3NfbXVsdGlwbGVfbmFuby5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2VudW1fY2xhc3NfbXVsdGlwbGVfbmFuby5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTU4ZTFmMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9lbnVtX2NsYXNzX211bHRpcGxlX25hbm8ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBtYXh0cm95QGdvb2dsZS5jb20gKE1heCBDYWkpCi0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci0KLWVudW0gRmlsZVNjb3BlRW51bU11bHRpcGxlIHsKLSAgVEhSRUUgPSAzOwotfQotCi1tZXNzYWdlIEVudW1DbGFzc05hbm9NdWx0aXBsZSB7Ci0gIGVudW0gTWVzc2FnZVNjb3BlRW51bU11bHRpcGxlIHsKLSAgICBGT1VSID0gNDsKLSAgfQotICBvcHRpb25hbCBGaWxlU2NvcGVFbnVtTXVsdGlwbGUgdGhyZWUgPSAzIFsgZGVmYXVsdCA9IFRIUkVFIF07Ci0gIG9wdGlvbmFsIE1lc3NhZ2VTY29wZUVudW1NdWx0aXBsZSBmb3VyID0gNCBbIGRlZmF1bHQgPSBGT1VSIF07Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9lbnVtX2NsYXNzX25hbm8ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9lbnVtX2NsYXNzX25hbm8ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNhMWUwN2YuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZW51bV9jbGFzc19uYW5vLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogbWF4dHJveUBnb29nbGUuY29tIChNYXggQ2FpKQotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkVudW1DbGFzc05hbm9zIjsKLQotZW51bSBGaWxlU2NvcGVFbnVtIHsKLSAgT05FID0gMTsKLX0KLQotbWVzc2FnZSBFbnVtQ2xhc3NOYW5vIHsKLSAgZW51bSBNZXNzYWdlU2NvcGVFbnVtIHsKLSAgICBUV08gPSAyOwotICB9Ci0gIG9wdGlvbmFsIEZpbGVTY29wZUVudW0gb25lID0gMSBbIGRlZmF1bHQgPSBPTkUgXTsKLSAgb3B0aW9uYWwgTWVzc2FnZVNjb3BlRW51bSB0d28gPSAyIFsgZGVmYXVsdCA9IFRXTyBdOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZW51bV92YWxpZGl0eV9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZW51bV92YWxpZGl0eV9uYW5vLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGRhOGI0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2VudW1fdmFsaWRpdHlfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDI4ICswLDAgQEAKLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiRW51bVZhbGlkaXR5IjsKLQotZW51bSBFIHsKLSAgZGVmYXVsdCA9IDE7IC8vIHRlc3QgamF2YSBrZXl3b3JkIHJlbmFtaW5nCi0gIEZPTyA9IDI7Ci0gIEJBUiA9IDM7Ci0gIEJBWiA9IDQ7Ci19Ci0KLW1lc3NhZ2UgTSB7Ci0gIG9wdGlvbmFsIEUgb3B0aW9uYWxfZSA9IDE7Ci0gIG9wdGlvbmFsIEUgZGVmYXVsdF9lID0gMiBbIGRlZmF1bHQgPSBCQVogXTsKLSAgcmVwZWF0ZWQgRSByZXBlYXRlZF9lID0gMzsKLSAgcmVwZWF0ZWQgRSBwYWNrZWRfZSA9IDQgWyBwYWNrZWQgPSB0cnVlIF07Ci0gIHJlcGVhdGVkIEUgcmVwZWF0ZWRfZTIgPSA1OwotICByZXBlYXRlZCBFIHBhY2tlZF9lMiA9IDYgWyBwYWNrZWQgPSB0cnVlIF07Ci0gIHJlcGVhdGVkIEUgcmVwZWF0ZWRfZTMgPSA3OwotICByZXBlYXRlZCBFIHBhY2tlZF9lMyA9IDggWyBwYWNrZWQgPSB0cnVlIF07Ci19Ci0KLW1lc3NhZ2UgQWx0IHsKLSAgb3B0aW9uYWwgRSByZXBlYXRlZF9lMl9hc19vcHRpb25hbCA9IDU7Ci0gIHJlcGVhdGVkIEUgcGFja2VkX2UyX2FzX25vbl9wYWNrZWQgPSA2OwotICByZXBlYXRlZCBFIG5vbl9wYWNrZWRfZTNfYXNfcGFja2VkID0gNyBbIHBhY2tlZCA9IHRydWUgXTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2V4dGVuc2lvbl9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZXh0ZW5zaW9uX25hbm8ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNhNTZiM2QuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZXh0ZW5zaW9uX25hbm8ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwzNyArMCwwIEBACi1zeW50YXggPSAicHJvdG8yIjsKLQotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIkV4dGVuc2lvbnMiOwotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8udGVzdGV4dCI7Ci0KLW1lc3NhZ2UgRXh0ZW5kYWJsZU1lc3NhZ2UgewotICBvcHRpb25hbCBpbnQzMiBmaWVsZCA9IDE7Ci0gIGV4dGVuc2lvbnMgMTAgdG8gbWF4OwotfQotCi1lbnVtIEFuRW51bSB7Ci0gIEZJUlNUX1ZBTFVFID0gMTsKLSAgU0VDT05EX1ZBTFVFID0gMjsKLX0KLQotbWVzc2FnZSBBbm90aGVyTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIHN0cmluZyBzdHJpbmcgPSAxOwotICBvcHRpb25hbCBib29sIHZhbHVlID0gMjsKLSAgcmVwZWF0ZWQgaW50MzIgaW50ZWdlcnMgPSAzOwotfQotCi1tZXNzYWdlIENvbnRhaW5lck1lc3NhZ2UgewotICBleHRlbmQgRXh0ZW5kYWJsZU1lc3NhZ2UgewotICAgIG9wdGlvbmFsIGJvb2wgYW5vdGhlcl90aGluZyA9IDEwMDsKLSAgICAvLyBUaGUgbGFyZ2VzdCBwZXJtaXR0ZWQgZmllbGQgbnVtYmVyLCBwZXIKLSAgICAvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvcHJvdG8jc2ltcGxlCi0gICAgb3B0aW9uYWwgYm9vbCBsYXJnZV9maWVsZF9udW1iZXIgPSA1MzY4NzA5MTE7Ci0gIH0KLX0KLQotLy8gRm9yIHRlc3ROYW5vT3B0aW9uYWxHcm91cFdpdGhVbmtub3duRmllbGRzRW5hYmxlZDsKLS8vIG5vdCBwYXJ0IG9mIHRoZSBleHRlbnNpb25zIHRlc3RzLgotbWVzc2FnZSBNZXNzYWdlV2l0aEdyb3VwIHsKLSAgb3B0aW9uYWwgZ3JvdXAgR3JvdXAgPSAxIHsKLSAgICBvcHRpb25hbCBpbnQzMiBhID0gMjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZXh0ZW5zaW9uX3BhY2tlZF9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZXh0ZW5zaW9uX3BhY2tlZF9uYW5vLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYjdhMDA0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2V4dGVuc2lvbl9wYWNrZWRfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDI5ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzIiOwotCi1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2V4dGVuc2lvbl9uYW5vLnByb3RvIjsKLQotLy8gTXVzdCBiZSBjb21waWxlZCBzZXBhcmF0ZWx5IGR1ZSB0byBleHRlbnNpb24gbnVtYmVyIHJldXNlLgotLy8gVGhlIHJldXNlIGlzIGRlbGliZXJhdGUsIGZvciB0ZXN0aW5nIHdpcmUgY29tcGF0aWJpbGl0eS4KLQotbWVzc2FnZSBQYWNrZWRFeHRlbnNpb25zIHsKLSAgZXh0ZW5kIEV4dGVuZGFibGVNZXNzYWdlIHsKLSAgICByZXBlYXRlZCBpbnQzMiAgICBwYWNrZWRfaW50MzIgICAgPSAxMCBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCB1aW50MzIgICBwYWNrZWRfdWludDMyICAgPSAxMSBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBzaW50MzIgICBwYWNrZWRfc2ludDMyICAgPSAxMiBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBpbnQ2NCAgICBwYWNrZWRfaW50NjQgICAgPSAxMyBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCB1aW50NjQgICBwYWNrZWRfdWludDY0ICAgPSAxNCBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBzaW50NjQgICBwYWNrZWRfc2ludDY0ICAgPSAxNSBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBmaXhlZDMyICBwYWNrZWRfZml4ZWQzMiAgPSAxNiBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzIgPSAxNyBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBmaXhlZDY0ICBwYWNrZWRfZml4ZWQ2NCAgPSAxOCBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjQgPSAxOSBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBib29sICAgICBwYWNrZWRfYm9vbCAgICAgPSAyMCBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBmbG9hdCAgICBwYWNrZWRfZmxvYXQgICAgPSAyMSBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBkb3VibGUgICBwYWNrZWRfZG91YmxlICAgPSAyMiBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICByZXBlYXRlZCBBbkVudW0gICBwYWNrZWRfZW51bSAgICAgPSAyMyBbIHBhY2tlZCA9IHRydWUgXTsKLSAgICAvLyBOb24tcGFja2FibGUgdHlwZXMgb21pdHRlZC4KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZXh0ZW5zaW9uX3JlcGVhdGVkX25hbm8ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9leHRlbnNpb25fcmVwZWF0ZWRfbmFuby5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTUzM2M2NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9leHRlbnNpb25fcmVwZWF0ZWRfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzIiOwotCi1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2V4dGVuc2lvbl9uYW5vLnByb3RvIjsKLQotLy8gTXVzdCBiZSBjb21waWxlZCBzZXBhcmF0ZWx5IGR1ZSB0byBleHRlbnNpb24gbnVtYmVyIHJldXNlLgotLy8gVGhlIHJldXNlIGlzIGRlbGliZXJhdGUsIGZvciB0ZXN0aW5nIHdpcmUgY29tcGF0aWJpbGl0eS4KLQotbWVzc2FnZSBSZXBlYXRlZEV4dGVuc2lvbnMgewotICBleHRlbmQgRXh0ZW5kYWJsZU1lc3NhZ2UgewotICAgIHJlcGVhdGVkIGludDMyICAgICAgICAgIHJlcGVhdGVkX2ludDMyICAgID0gMTA7Ci0gICAgcmVwZWF0ZWQgdWludDMyICAgICAgICAgcmVwZWF0ZWRfdWludDMyICAgPSAxMTsKLSAgICByZXBlYXRlZCBzaW50MzIgICAgICAgICByZXBlYXRlZF9zaW50MzIgICA9IDEyOwotICAgIHJlcGVhdGVkIGludDY0ICAgICAgICAgIHJlcGVhdGVkX2ludDY0ICAgID0gMTM7Ci0gICAgcmVwZWF0ZWQgdWludDY0ICAgICAgICAgcmVwZWF0ZWRfdWludDY0ICAgPSAxNDsKLSAgICByZXBlYXRlZCBzaW50NjQgICAgICAgICByZXBlYXRlZF9zaW50NjQgICA9IDE1OwotICAgIHJlcGVhdGVkIGZpeGVkMzIgICAgICAgIHJlcGVhdGVkX2ZpeGVkMzIgID0gMTY7Ci0gICAgcmVwZWF0ZWQgc2ZpeGVkMzIgICAgICAgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAxNzsKLSAgICByZXBlYXRlZCBmaXhlZDY0ICAgICAgICByZXBlYXRlZF9maXhlZDY0ICA9IDE4OwotICAgIHJlcGVhdGVkIHNmaXhlZDY0ICAgICAgIHJlcGVhdGVkX3NmaXhlZDY0ID0gMTk7Ci0gICAgcmVwZWF0ZWQgYm9vbCAgICAgICAgICAgcmVwZWF0ZWRfYm9vbCAgICAgPSAyMDsKLSAgICByZXBlYXRlZCBmbG9hdCAgICAgICAgICByZXBlYXRlZF9mbG9hdCAgICA9IDIxOwotICAgIHJlcGVhdGVkIGRvdWJsZSAgICAgICAgIHJlcGVhdGVkX2RvdWJsZSAgID0gMjI7Ci0gICAgcmVwZWF0ZWQgQW5FbnVtICAgICAgICAgcmVwZWF0ZWRfZW51bSAgICAgPSAyMzsKLSAgICByZXBlYXRlZCBzdHJpbmcgICAgICAgICByZXBlYXRlZF9zdHJpbmcgICA9IDI0OwotICAgIHJlcGVhdGVkIGJ5dGVzICAgICAgICAgIHJlcGVhdGVkX2J5dGVzICAgID0gMjU7Ci0gICAgcmVwZWF0ZWQgQW5vdGhlck1lc3NhZ2UgcmVwZWF0ZWRfbWVzc2FnZSAgPSAyNjsKLSAgICByZXBlYXRlZCBncm91cCAgICAgICAgICBSZXBlYXRlZEdyb3VwICAgICA9IDI3IHsKLSAgICAgIG9wdGlvbmFsIGludDMyIGEgPSAxOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfZXh0ZW5zaW9uX3Npbmd1bGFyX25hbm8ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9leHRlbnNpb25fc2luZ3VsYXJfbmFuby5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGIyZDk2NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9leHRlbnNpb25fc2luZ3VsYXJfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzIiOwotCi1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2V4dGVuc2lvbl9uYW5vLnByb3RvIjsKLQotLy8gTXVzdCBiZSBjb21waWxlZCBzZXBhcmF0ZWx5IGR1ZSB0byBleHRlbnNpb24gbnVtYmVyIHJldXNlLgotLy8gVGhlIHJldXNlIGlzIGRlbGliZXJhdGUsIGZvciB0ZXN0aW5nIHdpcmUgY29tcGF0aWJpbGl0eS4KLQotbWVzc2FnZSBTaW5ndWxhckV4dGVuc2lvbnMgewotICBleHRlbmQgRXh0ZW5kYWJsZU1lc3NhZ2UgewotICAgIG9wdGlvbmFsIGludDMyICAgICAgICAgIHNvbWVfaW50MzIgICAgPSAxMDsKLSAgICBvcHRpb25hbCB1aW50MzIgICAgICAgICBzb21lX3VpbnQzMiAgID0gMTE7Ci0gICAgb3B0aW9uYWwgc2ludDMyICAgICAgICAgc29tZV9zaW50MzIgICA9IDEyOwotICAgIG9wdGlvbmFsIGludDY0ICAgICAgICAgIHNvbWVfaW50NjQgICAgPSAxMzsKLSAgICBvcHRpb25hbCB1aW50NjQgICAgICAgICBzb21lX3VpbnQ2NCAgID0gMTQ7Ci0gICAgb3B0aW9uYWwgc2ludDY0ICAgICAgICAgc29tZV9zaW50NjQgICA9IDE1OwotICAgIG9wdGlvbmFsIGZpeGVkMzIgICAgICAgIHNvbWVfZml4ZWQzMiAgPSAxNjsKLSAgICBvcHRpb25hbCBzZml4ZWQzMiAgICAgICBzb21lX3NmaXhlZDMyID0gMTc7Ci0gICAgb3B0aW9uYWwgZml4ZWQ2NCAgICAgICAgc29tZV9maXhlZDY0ICA9IDE4OwotICAgIG9wdGlvbmFsIHNmaXhlZDY0ICAgICAgIHNvbWVfc2ZpeGVkNjQgPSAxOTsKLSAgICBvcHRpb25hbCBib29sICAgICAgICAgICBzb21lX2Jvb2wgICAgID0gMjA7Ci0gICAgb3B0aW9uYWwgZmxvYXQgICAgICAgICAgc29tZV9mbG9hdCAgICA9IDIxOwotICAgIG9wdGlvbmFsIGRvdWJsZSAgICAgICAgIHNvbWVfZG91YmxlICAgPSAyMjsKLSAgICBvcHRpb25hbCBBbkVudW0gICAgICAgICBzb21lX2VudW0gICAgID0gMjM7Ci0gICAgb3B0aW9uYWwgc3RyaW5nICAgICAgICAgc29tZV9zdHJpbmcgICA9IDI0OwotICAgIG9wdGlvbmFsIGJ5dGVzICAgICAgICAgIHNvbWVfYnl0ZXMgICAgPSAyNTsKLSAgICBvcHRpb25hbCBBbm90aGVyTWVzc2FnZSBzb21lX21lc3NhZ2UgID0gMjY7Ci0gICAgb3B0aW9uYWwgZ3JvdXAgICAgICAgICAgU29tZUdyb3VwICAgICA9IDI3IHsKLSAgICAgIG9wdGlvbmFsIGludDMyIGEgPSAxOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfaGFzX25hbm8ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9oYXNfbmFuby5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmU3ZDE3OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9oYXNfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHVsYXNAZ29vZ2xlLmNvbSAoVWxhcyBLaXJhemNpKQotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIk5hbm9IYXNPdXRlckNsYXNzIjsKLQotbWVzc2FnZSBUZXN0QWxsVHlwZXNOYW5vSGFzIHsKLQotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKLSAgfQotCi0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgRk9PID0gMTsKLSAgICBCQVIgPSAyOwotICAgIEJBWiA9IDM7Ci0gIH0KLQotICAvLyBTaW5ndWxhcgotICBvcHRpb25hbCBpbnQzMiAgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKLSAgb3B0aW9uYWwgZmxvYXQgIG9wdGlvbmFsX2Zsb2F0ICAgID0gMTE7Ci0gIG9wdGlvbmFsIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgICA9IDEyOwotICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKLSAgb3B0aW9uYWwgYnl0ZXMgIG9wdGlvbmFsX2J5dGVzICAgID0gMTU7Ci0KLSAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA9IDE4OwotCi0gIG9wdGlvbmFsIE5lc3RlZEVudW0gb3B0aW9uYWxfbmVzdGVkX2VudW0gPSAyMTsKLQotICAvLyBSZXBlYXRlZAotICByZXBlYXRlZCBpbnQzMiAgcmVwZWF0ZWRfaW50MzIgICAgPSAzMTsKLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyAgID0gNDQ7Ci0gIHJlcGVhdGVkIGJ5dGVzICByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OwotCi0gIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgID0gNDg7Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bSAgPSA1MTsKLQotICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCi0gIG9wdGlvbmFsIGludDMyICBkZWZhdWx0X2ludDMyICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOwotICBvcHRpb25hbCBieXRlcyAgZGVmYXVsdF9ieXRlcyAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07Ci0KLSAgb3B0aW9uYWwgZmxvYXQgZGVmYXVsdF9mbG9hdF9uYW4gPSA5OSAgW2RlZmF1bHQgPSAgbmFuXTsKLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtIGRlZmF1bHRfbmVzdGVkX2VudW0gPSA4MSBbZGVmYXVsdCA9IEJBUl07Ci0KLSAgcmVxdWlyZWQgaW50MzIgaWQgPSA4NjsKLSAgcmVxdWlyZWQgTmVzdGVkRW51bSByZXF1aXJlZF9lbnVtID0gODc7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2ltcG9ydF9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfaW1wb3J0X25hbm8ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFhM2RkYzUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfaW1wb3J0X25hbm8ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8KLS8vIFRoaXMgaXMgbGlrZSB1bml0dGVzdF9pbXBvcnQucHJvdG8gYnV0IHdpdGggb3B0aW1pemVfZm9yID0gTkFOT19SVU5USU1FLgotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydDsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLm5hbm8udGVzdGltcG9ydCI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RJbXBvcnROYW5vIjsKLQotbWVzc2FnZSBJbXBvcnRNZXNzYWdlTmFubyB7Ci0gIG9wdGlvbmFsIGludDMyIGQgPSAxOwotfQotCi1lbnVtIEltcG9ydEVudW1OYW5vIHsKLSAgSU1QT1JUX05BTk9fRk9PID0gNzsKLSAgSU1QT1JUX05BTk9fQkFSID0gODsKLSAgSU1QT1JUX05BTk9fQkFaID0gOTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X211bHRpcGxlX25hbWVjbGFzaF9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfbXVsdGlwbGVfbmFtZWNsYXNoX25hbm8ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIzMWM0MzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfbXVsdGlwbGVfbmFtZWNsYXNoX25hbm8ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBtYXh0cm95QGdvb2dsZS5jb20gKE1heCBDYWkpCi0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIk11bHRpcGxlTmFtZUNsYXNoTmFubyI7Ci1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci0KLW1lc3NhZ2UgTXVsdGlwbGVOYW1lQ2xhc2hOYW5vIHsKLSAgb3B0aW9uYWwgaW50MzIgZmllbGQgPSAxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfbXVsdGlwbGVfbmFuby5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X211bHRpcGxlX25hbm8ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQwNmFiNzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfbXVsdGlwbGVfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IG1heHRyb3lAZ29vZ2xlLmNvbSAoTWF4IENhaSkKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfaW1wb3J0X25hbm8ucHJvdG8iOwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOwotCi1lbnVtIEZpbGVTY29wZUVudW0gewotICBPTkUgPSAxOwotICBUV08gPSAyOwotfQotCi1tZXNzYWdlIEZpbGVTY29wZUVudW1SZWZOYW5vIHsKLSAgb3B0aW9uYWwgRmlsZVNjb3BlRW51bSBlbnVtX2ZpZWxkID0gMTsKLX0KLQotbWVzc2FnZSBNZXNzYWdlU2NvcGVFbnVtUmVmTmFubyB7Ci0gIGVudW0gTWVzc2FnZVNjb3BlRW51bSB7Ci0gICAgT05FID0gMTsKLSAgICBUV08gPSAyOwotICB9Ci0gIG9wdGlvbmFsIE1lc3NhZ2VTY29wZUVudW0gZW51bV9maWVsZCA9IDE7Ci19Ci0KLW1lc3NhZ2UgTXVsdGlwbGVJbXBvcnRpbmdOb25NdWx0aXBsZU5hbm8xIHsKLSAgb3B0aW9uYWwgSW1wb3J0TWVzc2FnZU5hbm8gZmllbGQgPSAxOwotfQotCi1tZXNzYWdlIE11bHRpcGxlSW1wb3J0aW5nTm9uTXVsdGlwbGVOYW5vMiB7Ci0gIG9wdGlvbmFsIE11bHRpcGxlSW1wb3J0aW5nTm9uTXVsdGlwbGVOYW5vMSBuYW5vMSA9IDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfbmFuby5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2ZmZjI0Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9uYW5vLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTk1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHdpbmtAZ29vZ2xlLmNvbSAoV2luayBTYXZpbGxlKQotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X2ltcG9ydF9uYW5vLnByb3RvIjsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJOYW5vT3V0ZXJDbGFzcyI7Ci0KLS8vIFNhbWUgYXMgVGVzdEFsbFR5cGVzIGJ1dCB3aXRoIHRoZSBuYW5vIHJ1bnRpbWUuCi1tZXNzYWdlIFRlc3RBbGxUeXBlc05hbm8gewotCi0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOwotICB9Ci0KLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBGT08gPSAxOwotICAgIEJBUiA9IDI7Ci0gICAgQkFaID0gMzsKLSAgfQotCi0gIC8vIFNpbmd1bGFyCi0gIG9wdGlvbmFsICAgIGludDMyIG9wdGlvbmFsX2ludDMyICAgID0gIDE7Ci0gIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0ICAgID0gIDI7Ci0gIG9wdGlvbmFsICAgdWludDMyIG9wdGlvbmFsX3VpbnQzMiAgID0gIDM7Ci0gIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCAgID0gIDQ7Ci0gIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiAgID0gIDU7Ci0gIG9wdGlvbmFsICAgc2ludDY0IG9wdGlvbmFsX3NpbnQ2NCAgID0gIDY7Ci0gIG9wdGlvbmFsICBmaXhlZDMyIG9wdGlvbmFsX2ZpeGVkMzIgID0gIDc7Ci0gIG9wdGlvbmFsICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjQgID0gIDg7Ci0gIG9wdGlvbmFsIHNmaXhlZDMyIG9wdGlvbmFsX3NmaXhlZDMyID0gIDk7Ci0gIG9wdGlvbmFsIHNmaXhlZDY0IG9wdGlvbmFsX3NmaXhlZDY0ID0gMTA7Ci0gIG9wdGlvbmFsICAgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ICAgID0gMTE7Ci0gIG9wdGlvbmFsICAgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSAgID0gMTI7Ci0gIG9wdGlvbmFsICAgICBib29sIG9wdGlvbmFsX2Jvb2wgICAgID0gMTM7Ci0gIG9wdGlvbmFsICAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyAgID0gMTQ7Ci0gIG9wdGlvbmFsICAgIGJ5dGVzIG9wdGlvbmFsX2J5dGVzICAgID0gMTU7Ci0KLSAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDE2IHsKLSAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7Ci0gIH0KLQotICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgID0gMTg7Ci0gIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlTmFubyBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2VOYW5vCi0gICAgb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgPSAyMDsKLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7Ci0gIG9wdGlvbmFsIEZvcmVpZ25FbnVtTmFubyBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1OYW5vIG9wdGlvbmFsX2ltcG9ydF9lbnVtID0gMjM7Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOwotICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKLQotICAvLyBSZXBlYXRlZAotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOwotICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOwotICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOwotICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OwotICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OwotICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OwotICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OwotICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OwotICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOwotICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOwotICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOwotICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOwotICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OwotICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OwotCi0gIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OwotICB9Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICA9IDQ4OwotICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZU5hbm8gcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7Ci0gIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTmFubwotICAgIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlID0gNTA7Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkRW51bSAgICAgIHJlcGVhdGVkX25lc3RlZF9lbnVtICA9IDUxOwotICByZXBlYXRlZCBGb3JlaWduRW51bU5hbm8gcmVwZWF0ZWRfZm9yZWlnbl9lbnVtID0gNTI7Ci0gIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTmFubyByZXBlYXRlZF9pbXBvcnRfZW51bSA9IDUzOwotCi0gIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2UgPSA1NCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGU9Q09SRF07Ci0KLSAgLy8gUmVwZWF0ZWQgcGFja2VkCi0gIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX3BhY2tlZF9pbnQzMiAgICA9IDg3IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3BhY2tlZF9zZml4ZWQ2NCA9IDg4IFtwYWNrZWQ9dHJ1ZV07Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkRW51bSByZXBlYXRlZF9wYWNrZWRfbmVzdGVkX2VudW0gID0gODkgW3BhY2tlZD10cnVlXTsKLQotICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCi0gIG9wdGlvbmFsICAgIGludDMyIGRlZmF1bHRfaW50MzIgICAgPSA2MSBbZGVmYXVsdCA9ICA0MSAgICBdOwotICBvcHRpb25hbCAgICBpbnQ2NCBkZWZhdWx0X2ludDY0ICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKLSAgb3B0aW9uYWwgICB1aW50MzIgZGVmYXVsdF91aW50MzIgICA9IDYzIFtkZWZhdWx0ID0gIDQzICAgIF07Ci0gIG9wdGlvbmFsICAgdWludDY0IGRlZmF1bHRfdWludDY0ICAgPSA2NCBbZGVmYXVsdCA9ICA0NCAgICBdOwotICBvcHRpb25hbCAgIHNpbnQzMiBkZWZhdWx0X3NpbnQzMiAgID0gNjUgW2RlZmF1bHQgPSAtNDUgICAgXTsKLSAgb3B0aW9uYWwgICBzaW50NjQgZGVmYXVsdF9zaW50NjQgICA9IDY2IFtkZWZhdWx0ID0gIDQ2ICAgIF07Ci0gIG9wdGlvbmFsICBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMiAgPSA2NyBbZGVmYXVsdCA9ICA0NyAgICBdOwotICBvcHRpb25hbCAgZml4ZWQ2NCBkZWZhdWx0X2ZpeGVkNjQgID0gNjggW2RlZmF1bHQgPSAgNDggICAgXTsKLSAgb3B0aW9uYWwgc2ZpeGVkMzIgZGVmYXVsdF9zZml4ZWQzMiA9IDY5IFtkZWZhdWx0ID0gIDQ5ICAgIF07Ci0gIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjQgPSA3MCBbZGVmYXVsdCA9IC01MCAgICBdOwotICBvcHRpb25hbCAgICBmbG9hdCBkZWZhdWx0X2Zsb2F0ICAgID0gNzEgW2RlZmF1bHQgPSAgNTEuNSAgXTsKLSAgb3B0aW9uYWwgICBkb3VibGUgZGVmYXVsdF9kb3VibGUgICA9IDcyIFtkZWZhdWx0ID0gIDUyZTMgIF07Ci0gIG9wdGlvbmFsICAgICBib29sIGRlZmF1bHRfYm9vbCAgICAgPSA3MyBbZGVmYXVsdCA9IHRydWUgICBdOwotICBvcHRpb25hbCAgIHN0cmluZyBkZWZhdWx0X3N0cmluZyAgID0gNzQgW2RlZmF1bHQgPSAiaGVsbG8iXTsKLSAgb3B0aW9uYWwgICAgYnl0ZXMgZGVmYXVsdF9ieXRlcyAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX25vbmFzY2lpID0gNzYgW2RlZmF1bHQgPSAiZMO8bnlhIl07Ci0gIG9wdGlvbmFsICBieXRlcyBkZWZhdWx0X2J5dGVzX25vbmFzY2lpICA9IDc3IFtkZWZhdWx0ID0gImTDvG55YWIiXTsKLQotICBvcHRpb25hbCAgZmxvYXQgZGVmYXVsdF9mbG9hdF9pbmYgICAgICA9IDk3ICBbZGVmYXVsdCA9ICBpbmZdOwotICBvcHRpb25hbCAgZmxvYXQgZGVmYXVsdF9mbG9hdF9uZWdfaW5mICA9IDk4ICBbZGVmYXVsdCA9IC1pbmZdOwotICBvcHRpb25hbCAgZmxvYXQgZGVmYXVsdF9mbG9hdF9uYW4gICAgICA9IDk5ICBbZGVmYXVsdCA9ICBuYW5dOwotICBvcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGVfaW5mICAgICA9IDEwMCBbZGVmYXVsdCA9ICBpbmZdOwotICBvcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGVfbmVnX2luZiA9IDEwMSBbZGVmYXVsdCA9IC1pbmZdOwotICBvcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGVfbmFuICAgICA9IDEwMiBbZGVmYXVsdCA9ICBuYW5dOwotCi0gIG9wdGlvbmFsIE5lc3RlZEVudW0gZGVmYXVsdF9uZXN0ZWRfZW51bSA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKLSAgb3B0aW9uYWwgRm9yZWlnbkVudW1OYW5vIGRlZmF1bHRfZm9yZWlnbl9lbnVtID0gODIKLSAgICAgIFtkZWZhdWx0ID0gRk9SRUlHTl9OQU5PX0JBUl07Ci0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTmFubwotICAgICAgZGVmYXVsdF9pbXBvcnRfZW51bSA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX05BTk9fQkFSXTsKLQotICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2UgPSA4NCBbY3R5cGU9U1RSSU5HX1BJRUNFLGRlZmF1bHQ9ImFiYyJdOwotICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9jb3JkID0gODUgW2N0eXBlPUNPUkQsZGVmYXVsdD0iMTIzIl07Ci0KLSAgcmVxdWlyZWQgaW50MzIgaWQgPSA4NjsKLQotICAvLyBUcnkgdG8gY2F1c2UgY29uZmxpY3RzLgotICBvcHRpb25hbCBpbnQzMiB0YWcgPSA5MzsKLSAgb3B0aW9uYWwgaW50MzIgZ2V0X3NlcmlhbGl6ZWRfc2l6ZSA9IDk0OwotICBvcHRpb25hbCBpbnQzMiB3cml0ZV90byA9IDk1OwotCi0gIC8vIFRyeSB0byBmYWlsIHdpdGggamF2YSByZXNlcnZlZCBrZXl3b3JkcwotICBvcHRpb25hbCBpbnQzMiBzeW5jaHJvbml6ZWQgPSA5NjsKLQotICBvbmVvZiBvbmVvZl9maWVsZCB7Ci0gICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKLSAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlID0gMTEyOwotICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMjM7Ci0gICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMjQ7Ci0gICAgZml4ZWQ2NCBvbmVvZl9maXhlZDY0ID0gMTE1OwotICAgIE5lc3RlZEVudW0gb25lb2ZfZW51bSA9IDExNjsKLSAgfQotfQotCi1tZXNzYWdlIEZvcmVpZ25NZXNzYWdlTmFubyB7Ci0gIG9wdGlvbmFsIGludDMyIGMgPSAxOwotfQotCi1lbnVtIEZvcmVpZ25FbnVtTmFubyB7Ci0gIEZPUkVJR05fTkFOT19GT08gPSA0OwotICBGT1JFSUdOX05BTk9fQkFSID0gNTsKLSAgRk9SRUlHTl9OQU5PX0JBWiA9IDY7Ci19Ci0KLS8vIFRlc3QgdGhhdCBkZXByZWNhdGVkIGZpZWxkcyB3b3JrLiAgV2Ugb25seSB2ZXJpZnkgdGhhdCB0aGV5IGNvbXBpbGUgKGF0IG9uZQotLy8gcG9pbnQgdGhpcyBmYWlsZWQpLgotbWVzc2FnZSBUZXN0RGVwcmVjYXRlZE5hbm8gewotICBvcHRpb25hbCBpbnQzMiBkZXByZWNhdGVkX2ZpZWxkID0gMSBbZGVwcmVjYXRlZCA9IHRydWVdOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfcmVjdXJzaXZlX25hbm8ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9yZWN1cnNpdmVfbmFuby5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjliOTQ0Zi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9yZWN1cnNpdmVfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHdpbmtAZ29vZ2xlLmNvbSAoV2luayBTYXZpbGxlKQotLy8KLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci0vLyBFeHBsaWNpdCBvdXRlciBjbGFzc25hbWUgdG8gc3VwcHJlc3MgbGVnYWN5IGluZm8uCi1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RSZWN1cnNpdmVOYW5vIjsKLQotbWVzc2FnZSBSZWN1cnNpdmVNZXNzYWdlTmFubyB7Ci0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgUmVjdXJzaXZlTWVzc2FnZU5hbm8gYSA9IDE7Ci0gIH0KLQotICByZXF1aXJlZCBpbnQzMiBpZCA9IDE7Ci0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkX21lc3NhZ2UgPSAyOwotICBvcHRpb25hbCBSZWN1cnNpdmVNZXNzYWdlTmFubyBvcHRpb25hbF9yZWN1cnNpdmVfbWVzc2FnZV9uYW5vID0gMzsKLSAgcmVwZWF0ZWQgUmVjdXJzaXZlTWVzc2FnZU5hbm8gcmVwZWF0ZWRfcmVjdXJzaXZlX21lc3NhZ2VfbmFubyA9IDQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9yZWZlcmVuY2VfdHlwZXNfbmFuby5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlZmVyZW5jZV90eXBlc19uYW5vLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmViOGQxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlZmVyZW5jZV90eXBlc19uYW5vLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTE2ICswLDAgQEAKLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiTmFub1JlZmVyZW5jZVR5cGVzIjsKLQotbWVzc2FnZSBUZXN0QWxsVHlwZXNOYW5vIHsKLQotICBlbnVtIE5lc3RlZEVudW0gewotICAgIEZPTyA9IDE7Ci0gICAgQkFSID0gMjsKLSAgICBCQVogPSAzOwotICB9Ci0KLSAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKLSAgICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOwotICB9Ci0KLSAgLy8gU2luZ3VsYXIKLSAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKLSAgb3B0aW9uYWwgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKLSAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKLSAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKLSAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKLSAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKLSAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKLSAgb3B0aW9uYWwgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKLSAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKLSAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKLSAgb3B0aW9uYWwgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKLSAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKLSAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKLSAgb3B0aW9uYWwgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKLSAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKLQotICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgewotICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKLSAgfQotCi0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAxODsKLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOwotICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKLQotICAvLyBSZXBlYXRlZAotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOwotICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOwotICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOwotICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OwotICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OwotICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OwotICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OwotICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OwotICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOwotICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOwotICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOwotICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOwotICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OwotICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OwotCi0gIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OwotICB9Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICA9IDQ4OwotCi0gIHJlcGVhdGVkIE5lc3RlZEVudW0gICAgICByZXBlYXRlZF9uZXN0ZWRfZW51bSAgPSA1MTsKLQotICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07Ci0gIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlPUNPUkRdOwotCi0gIC8vIFJlcGVhdGVkIHBhY2tlZAotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9wYWNrZWRfaW50MzIgICAgPSA4NyBbcGFja2VkPXRydWVdOwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9wYWNrZWRfc2ZpeGVkNjQgPSA4OCBbcGFja2VkPXRydWVdOwotCi0gIHJlcGVhdGVkIE5lc3RlZEVudW0gcmVwZWF0ZWRfcGFja2VkX25lc3RlZF9lbnVtICA9IDg5IFtwYWNrZWQ9dHJ1ZV07Ci0KLSAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cwotICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKLSAgb3B0aW9uYWwgICAgaW50NjQgZGVmYXVsdF9pbnQ2NCAgICA9IDYyIFtkZWZhdWx0ID0gIDQyICAgIF07Ci0gIG9wdGlvbmFsICAgdWludDMyIGRlZmF1bHRfdWludDMyICAgPSA2MyBbZGVmYXVsdCA9ICA0MyAgICBdOwotICBvcHRpb25hbCAgIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NCAgID0gNjQgW2RlZmF1bHQgPSAgNDQgICAgXTsKLSAgb3B0aW9uYWwgICBzaW50MzIgZGVmYXVsdF9zaW50MzIgICA9IDY1IFtkZWZhdWx0ID0gLTQ1ICAgIF07Ci0gIG9wdGlvbmFsICAgc2ludDY0IGRlZmF1bHRfc2ludDY0ICAgPSA2NiBbZGVmYXVsdCA9ICA0NiAgICBdOwotICBvcHRpb25hbCAgZml4ZWQzMiBkZWZhdWx0X2ZpeGVkMzIgID0gNjcgW2RlZmF1bHQgPSAgNDcgICAgXTsKLSAgb3B0aW9uYWwgIGZpeGVkNjQgZGVmYXVsdF9maXhlZDY0ICA9IDY4IFtkZWZhdWx0ID0gIDQ4ICAgIF07Ci0gIG9wdGlvbmFsIHNmaXhlZDMyIGRlZmF1bHRfc2ZpeGVkMzIgPSA2OSBbZGVmYXVsdCA9ICA0OSAgICBdOwotICBvcHRpb25hbCBzZml4ZWQ2NCBkZWZhdWx0X3NmaXhlZDY0ID0gNzAgW2RlZmF1bHQgPSAtNTAgICAgXTsKLSAgb3B0aW9uYWwgICAgZmxvYXQgZGVmYXVsdF9mbG9hdCAgICA9IDcxIFtkZWZhdWx0ID0gIDUxLjUgIF07Ci0gIG9wdGlvbmFsICAgZG91YmxlIGRlZmF1bHRfZG91YmxlICAgPSA3MiBbZGVmYXVsdCA9ICA1MmUzICBdOwotICBvcHRpb25hbCAgICAgYm9vbCBkZWZhdWx0X2Jvb2wgICAgID0gNzMgW2RlZmF1bHQgPSB0cnVlICAgXTsKLSAgb3B0aW9uYWwgICBzdHJpbmcgZGVmYXVsdF9zdHJpbmcgICA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07Ci0gIG9wdGlvbmFsICAgIGJ5dGVzIGRlZmF1bHRfYnl0ZXMgICAgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOwotCi0KLSAgb3B0aW9uYWwgIGZsb2F0IGRlZmF1bHRfZmxvYXRfaW5mICAgICAgPSA5NyAgW2RlZmF1bHQgPSAgaW5mXTsKLSAgb3B0aW9uYWwgIGZsb2F0IGRlZmF1bHRfZmxvYXRfbmVnX2luZiAgPSA5OCAgW2RlZmF1bHQgPSAtaW5mXTsKLSAgb3B0aW9uYWwgIGZsb2F0IGRlZmF1bHRfZmxvYXRfbmFuICAgICAgPSA5OSAgW2RlZmF1bHQgPSAgbmFuXTsKLSAgb3B0aW9uYWwgZG91YmxlIGRlZmF1bHRfZG91YmxlX2luZiAgICAgPSAxMDAgW2RlZmF1bHQgPSAgaW5mXTsKLSAgb3B0aW9uYWwgZG91YmxlIGRlZmF1bHRfZG91YmxlX25lZ19pbmYgPSAxMDEgW2RlZmF1bHQgPSAtaW5mXTsKLSAgb3B0aW9uYWwgZG91YmxlIGRlZmF1bHRfZG91YmxlX25hbiAgICAgPSAxMDIgW2RlZmF1bHQgPSAgbmFuXTsKLQotfQotCi1tZXNzYWdlIEZvcmVpZ25NZXNzYWdlTmFubyB7Ci0gIG9wdGlvbmFsIGludDMyIGMgPSAxOwotfQotCi1lbnVtIEZvcmVpZ25FbnVtTmFubyB7Ci0gIEZPUkVJR05fTkFOT19GT08gPSA0OwotICBGT1JFSUdOX05BTk9fQkFSID0gNTsKLSAgRk9SRUlHTl9OQU5PX0JBWiA9IDY7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlcGVhdGVkX21lcmdlX25hbm8ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9yZXBlYXRlZF9tZXJnZV9uYW5vLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjRlMmQyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlcGVhdGVkX21lcmdlX25hbm8ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBtYXh0cm95QGdvb2dsZS5jb20gKE1heCBDYWkpCi0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3RfbmFuby5wcm90byI7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci0KLS8vIEEgY29udGFpbmVyIG1lc3NhZ2UgZm9yIHRlc3RpbmcgdGhlIG1lcmdpbmcgb2YgcmVwZWF0ZWQgZmllbGRzIGF0IGEKLS8vIG5lc3RlZCBsZXZlbC4gT3RoZXIgdGVzdHMgd2lsbCBiZSBkb25lIHVzaW5nIHRoZSByZXBlYXRlZCBmaWVsZHMgaW4KLS8vIFRlc3RBbGxUeXBlc05hbm8uCi1tZXNzYWdlIFRlc3RSZXBlYXRlZE1lcmdlTmFubyB7Ci0KLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTmFubyBjb250YWluZWQgPSAxOwotCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9yZXBlYXRlZF9wYWNrYWJsZXNfbmFuby5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlcGVhdGVkX3BhY2thYmxlc19uYW5vLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NmFmODg1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3JlcGVhdGVkX3BhY2thYmxlc19uYW5vLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsOTUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogbWF4dHJveUBnb29nbGUuY29tIChNYXggQ2FpKQotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIk5hbm9SZXBlYXRlZFBhY2thYmxlcyI7Ci0KLWVudW0gRW51bSB7Ci0gIE9QVElPTl9PTkUgPSAxOwotICBPUFRJT05fVFdPID0gMjsKLX0KLQotLy8gVHdvIGFsbW9zdCBpZGVudGljYWwgbWVzc2FnZXMgd2l0aCBhbGwgcGFja2FibGUgcmVwZWF0ZWQgZmllbGQgdHlwZXMuCi0vLyBPbmUgd2l0aCBub25lIG1hcmtlZCBhcyBwYWNrZWQgYW5kIHRoZSBvdGhlciBhbGwgcGFja2VkLiBGb3IKLS8vIGNvbXBhdGliaWxpdHksIHRoZXkgc2hvdWxkIGJlIGFibGUgdG8gcGFyc2UgZWFjaCBvdGhlcidzIHNlcmlhbGl6ZWQKLS8vIGZvcm1zLgotCi1tZXNzYWdlIE5vblBhY2tlZCB7Ci0KLSAgLy8gQWxsIHBhY2thYmxlIHR5cGVzLCBub25lIG1hcmtlZCBhcyBwYWNrZWQuCi0KLSAgcmVwZWF0ZWQgICAgaW50MzIgaW50MzJzICAgID0gMTsKLSAgcmVwZWF0ZWQgICAgaW50NjQgaW50NjRzICAgID0gMjsKLSAgcmVwZWF0ZWQgICB1aW50MzIgdWludDMycyAgID0gMzsKLSAgcmVwZWF0ZWQgICB1aW50NjQgdWludDY0cyAgID0gNDsKLSAgcmVwZWF0ZWQgICBzaW50MzIgc2ludDMycyAgID0gNTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgc2ludDY0cyAgID0gNjsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgZml4ZWQzMnMgID0gNzsKLSAgcmVwZWF0ZWQgIGZpeGVkNjQgZml4ZWQ2NHMgID0gODsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgc2ZpeGVkMzJzID0gOTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgc2ZpeGVkNjRzID0gMTA7Ci0gIHJlcGVhdGVkICAgIGZsb2F0IGZsb2F0cyAgICA9IDExOwotICByZXBlYXRlZCAgIGRvdWJsZSBkb3VibGVzICAgPSAxMjsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgYm9vbHMgICAgID0gMTM7Ci0gIHJlcGVhdGVkICAgICBFbnVtIGVudW1zICAgICA9IDE0OwotCi0gIC8vIE5vaXNlIGZvciB0ZXN0aW5nIG1lcmdlZCBkZXNlcmlhbGl6YXRpb24uCi0gIG9wdGlvbmFsIGludDMyIG5vaXNlID0gMTU7Ci0KLX0KLQotbWVzc2FnZSBQYWNrZWQgewotCi0gIC8vIEFsbCBwYWNrYWJsZSB0eXBlcywgYWxsIG1hdGNoaW5nIHRoZSBmaWVsZCBudW1iZXJzIGluIE5vblBhY2tlZCwKLSAgLy8gYWxsIG1hcmtlZCBhcyBwYWNrZWQuCi0KLSAgcmVwZWF0ZWQgICAgaW50MzIgaW50MzJzICAgID0gMSAgWyBwYWNrZWQgPSB0cnVlIF07Ci0gIHJlcGVhdGVkICAgIGludDY0IGludDY0cyAgICA9IDIgIFsgcGFja2VkID0gdHJ1ZSBdOwotICByZXBlYXRlZCAgIHVpbnQzMiB1aW50MzJzICAgPSAzICBbIHBhY2tlZCA9IHRydWUgXTsKLSAgcmVwZWF0ZWQgICB1aW50NjQgdWludDY0cyAgID0gNCAgWyBwYWNrZWQgPSB0cnVlIF07Ci0gIHJlcGVhdGVkICAgc2ludDMyIHNpbnQzMnMgICA9IDUgIFsgcGFja2VkID0gdHJ1ZSBdOwotICByZXBlYXRlZCAgIHNpbnQ2NCBzaW50NjRzICAgPSA2ICBbIHBhY2tlZCA9IHRydWUgXTsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgZml4ZWQzMnMgID0gNyAgWyBwYWNrZWQgPSB0cnVlIF07Ci0gIHJlcGVhdGVkICBmaXhlZDY0IGZpeGVkNjRzICA9IDggIFsgcGFja2VkID0gdHJ1ZSBdOwotICByZXBlYXRlZCBzZml4ZWQzMiBzZml4ZWQzMnMgPSA5ICBbIHBhY2tlZCA9IHRydWUgXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgc2ZpeGVkNjRzID0gMTAgWyBwYWNrZWQgPSB0cnVlIF07Ci0gIHJlcGVhdGVkICAgIGZsb2F0IGZsb2F0cyAgICA9IDExIFsgcGFja2VkID0gdHJ1ZSBdOwotICByZXBlYXRlZCAgIGRvdWJsZSBkb3VibGVzICAgPSAxMiBbIHBhY2tlZCA9IHRydWUgXTsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgYm9vbHMgICAgID0gMTMgWyBwYWNrZWQgPSB0cnVlIF07Ci0gIHJlcGVhdGVkICAgICBFbnVtIGVudW1zICAgICA9IDE0IFsgcGFja2VkID0gdHJ1ZSBdOwotCi0gIC8vIE5vaXNlIGZvciB0ZXN0aW5nIG1lcmdlZCBkZXNlcmlhbGl6YXRpb24uCi0gIG9wdGlvbmFsIGludDMyIG5vaXNlID0gMTU7Ci0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3NpbXBsZV9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3Rfc2ltcGxlX25hbm8ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1Nzg2Y2MuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3Rfc2ltcGxlX25hbm8ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiB3aW5rQGdvb2dsZS5jb20gKFdpbmsgU2F2aWxsZSkKLS8vCi0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwotLy8gRXhwbGljaXQgb3V0ZXIgY2xhc3NuYW1lIHRvIHN1cHByZXNzIGxlZ2FjeSBpbmZvLgotb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlVuaXR0ZXN0U2ltcGxlTmFubyI7Ci0KLW1lc3NhZ2UgU2ltcGxlTWVzc2FnZU5hbm8gewotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKLSAgfQotCi0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgRk9PID0gMTsKLSAgICBCQVIgPSAyOwotICAgIEJBWiA9IDM7Ci0gIH0KLQotICBvcHRpb25hbCBpbnQzMiBkID0gMSBbZGVmYXVsdCA9IDEyM107Ci0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkX21zZyA9IDI7Ci0gIG9wdGlvbmFsIE5lc3RlZEVudW0gZGVmYXVsdF9uZXN0ZWRfZW51bSA9IDMgW2RlZmF1bHQgPSBCQVpdOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3Rfc2luZ2xlX25hbm8ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9zaW5nbGVfbmFuby5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2RlMzBjOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qYXZhbmFuby9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmFuby91bml0dGVzdF9zaW5nbGVfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IG1heHRyb3lAZ29vZ2xlLmNvbSAoTWF4IENhaSkKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci0KLW1lc3NhZ2UgU2luZ2xlTWVzc2FnZU5hbm8gewotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3Rfc3RyaW5ndXRmOF9uYW5vLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamF2YW5hbm8vc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25hbm8vdW5pdHRlc3Rfc3RyaW5ndXRmOF9uYW5vLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiYmQ2NzdjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2phdmFuYW5vL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uYW5vL3VuaXR0ZXN0X3N0cmluZ3V0ZjhfbmFuby5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDQzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHdpbmtAZ29vZ2xlLmNvbSAoV2luayBTYXZpbGxlKQotLy8KLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci0vLyBFeHBsaWNpdCBvdXRlciBjbGFzc25hbWUgdG8gc3VwcHJlc3MgbGVnYWN5IGluZm8uCi1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RTdHJpbmd1dGY4TmFubyI7Ci0KLW1lc3NhZ2UgU3RyaW5nVXRmOCB7Ci0gIG9wdGlvbmFsIHN0cmluZyBpZCA9IDE7Ci0gIHJlcGVhdGVkIHN0cmluZyBycyA9IDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZDQ4YzguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLVByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVshW0J1aWxkIFN0YXR1c10oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9wcm90b2J1Zi5zdmc/YnJhbmNoPW1hc3RlcildKGh0dHBzOi8vdHJhdmlzLWNpLm9yZy9nb29nbGUvcHJvdG9idWYpCi0KLUNvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0KLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBKYXZhU2NyaXB0IFByb3RvY29sIEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5LgotCi1UaGUgbGlicmFyeSBpcyBjdXJyZW50bHkgY29tcGF0aWJsZSB3aXRoOgotCi0xLiBDb21tb25KUy1zdHlsZSBpbXBvcnRzIChlZy4gYHZhciBwcm90b3MgPSByZXF1aXJlKCdteS1wcm90b3MnKTtgKQotMi4gQ2xvc3VyZS1zdHlsZSBpbXBvcnRzIChlZy4gYGdvb2cucmVxdWlyZSgnbXkucGFja2FnZS5NeVByb3RvJyk7YCkKLQotU3VwcG9ydCBmb3IgRVM2LXN0eWxlIGltcG9ydHMgaXMgbm90IGltcGxlbWVudGVkIHlldC4gIEJyb3dzZXJzIGNhbgotYmUgc3VwcG9ydGVkIGJ5IHVzaW5nIEJyb3dzZXJpZnksIHdlYnBhY2ssIENsb3N1cmUgQ29tcGlsZXIsIGV0Yy4gdG8KLXJlc29sdmUgaW1wb3J0cyBhdCBjb21waWxlIHRpbWUuCi0KLVRvIHVzZSBQcm90b2NvbCBCdWZmZXJzIHdpdGggSmF2YVNjcmlwdCwgeW91IG5lZWQgdHdvIG1haW4gY29tcG9uZW50czoKLQotMS4gVGhlIHByb3RvYnVmIHJ1bnRpbWUgbGlicmFyeS4gIFlvdSBjYW4gaW5zdGFsbCB0aGlzIHdpdGgKLSAgIGBucG0gaW5zdGFsbCBnb29nbGUtcHJvdG9idWZgLCBvciB1c2UgdGhlIGZpbGVzIGluIHRoaXMgZGlyZWN0b3J5LgotMi4gVGhlIFByb3RvY29sIENvbXBpbGVyIGBwcm90b2NgLiAgVGhpcyB0cmFuc2xhdGVzIGAucHJvdG9gIGZpbGVzCi0gICBpbnRvIGAuanNgIGZpbGVzLiAgVGhlIGNvbXBpbGVyIGlzIG5vdCBjdXJyZW50bHkgYXZhaWxhYmxlIHZpYQotICAgbnBtLCBidXQgeW91IGNhbiBkb3dubG9hZCBhIHByZS1idWlsdCBiaW5hcnkKLSAgIFtvbiBHaXRIdWJdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvcmVsZWFzZXMpCi0gICAobG9vayBmb3IgdGhlIGBwcm90b2MtKi56aXBgIGZpbGVzIHVuZGVyICoqRG93bmxvYWRzKiopLgotCi0KLVNldHVwCi09PT09PQotCi1GaXJzdCwgb2J0YWluIHRoZSBQcm90b2NvbCBDb21waWxlci4gIFRoZSBlYXNpZXN0IHdheSBpcyB0byBkb3dubG9hZAotYSBwcmUtYnVpbHQgYmluYXJ5IGZyb20gW2h0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvcmVsZWFzZXNdKGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvcmVsZWFzZXMpLgotCi1JZiB5b3Ugd2FudCwgeW91IGNhbiBjb21waWxlIGBwcm90b2NgIGZyb20gc291cmNlIGluc3RlYWQuICBUbyBkbyB0aGlzCi1mb2xsb3cgdGhlIGluc3RydWN0aW9ucyBpbiBbdGhlIHRvcC1sZXZlbAotUkVBRE1FXShodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmL2Jsb2IvbWFzdGVyL3NyYy9SRUFETUUubWQpLgotCi1PbmNlIHlvdSBoYXZlIGBwcm90b2NgIGNvbXBpbGVkLCB5b3UgY2FuIHJ1biB0aGUgdGVzdHMgYnkgdHlwaW5nOgotCi0gICAgJCBjZCBqcwotICAgICQgbnBtIGluc3RhbGwKLSAgICAkIG5wbSB0ZXN0Ci0KLSAgICAjIElmIHlvdXIgcHJvdG9jIGlzIHNvbWV3aGVyZSBlbHNlIHRoYW4gLi4vc3JjL3Byb3RvYywgaW5zdGVhZCBkbyB0aGlzLgotICAgICMgQnV0IG1ha2Ugc3VyZSB5b3VyIHByb3RvYyBpcyB0aGUgc2FtZSB2ZXJzaW9uIGFzIHRoaXMgKG9yIGNvbXBhdGlibGUpIQotICAgICQgUFJPVE9DPS91c3IvbG9jYWwvYmluL3Byb3RvYyBucG0gdGVzdAotCi1UaGlzIHdpbGwgcnVuIHR3byBzZXBhcmF0ZSBjb3BpZXMgb2YgdGhlIHRlc3RzOiBvbmUgdGhhdCB1c2VzCi1DbG9zdXJlIENvbXBpbGVyIHN0eWxlIGltcG9ydHMgYW5kIG9uZSB0aGF0IHVzZXMgQ29tbW9uSlMgaW1wb3J0cy4KLVlvdSBjYW4gc2VlIGFsbCB0aGUgQ29tbW9uSlMgZmlsZXMgaW4gYGNvbW1vbmpzX291dC9gLgotSWYgYWxsIG9mIHRoZXNlIHRlc3RzIHBhc3MsIHlvdSBrbm93IHlvdSBoYXZlIGEgd29ya2luZyBzZXR1cC4KLQotCi1Vc2luZyBQcm90b2NvbCBCdWZmZXJzIGluIHlvdXIgb3duIHByb2plY3QKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UbyB1c2UgUHJvdG9jb2wgQnVmZmVycyBpbiB5b3VyIG93biBwcm9qZWN0LCB5b3UgbmVlZCB0byBpbnRlZ3JhdGUKLXRoZSBQcm90b2NvbCBDb21waWxlciBpbnRvIHlvdXIgYnVpbGQgc3lzdGVtLiAgVGhlIGRldGFpbHMgYXJlIGEKLWxpdHRsZSBkaWZmZXJlbnQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgeW91IGFyZSB1c2luZyBDbG9zdXJlIGltcG9ydHMKLW9yIENvbW1vbkpTIGltcG9ydHM6Ci0KLUNsb3N1cmUgSW1wb3J0cwotLS0tLS0tLS0tLS0tLS0tCi0KLUlmIHlvdSB3YW50IHRvIHVzZSBDbG9zdXJlIGltcG9ydHMsIHlvdXIgYnVpbGQgc2hvdWxkIHJ1biBhIGNvbW1hbmQKLWxpa2UgdGhpczoKLQotICAgICQgcHJvdG9jIC0tanNfb3V0PWxpYnJhcnk9bXlwcm90b19saWJzLGJpbmFyeTouIG1lc3NhZ2VzLnByb3RvIGJhc2UucHJvdG8KLQotRm9yIENsb3N1cmUgaW1wb3J0cywgYHByb3RvY2Agd2lsbCBnZW5lcmF0ZSBhIHNpbmdsZSBvdXRwdXQgZmlsZQotKGBteXByb3RvX2xpYnMuanNgIGluIHRoaXMgZXhhbXBsZSkuICBUaGUgZ2VuZXJhdGVkIGZpbGUgd2lsbCBgZ29vZy5wcm92aWRlKClgCi1hbGwgb2YgdGhlIHR5cGVzIGRlZmluZWQgaW4geW91ciAucHJvdG8gZmlsZXMuICBGb3IgZXhhbXBsZSwgZm9yIHRoZSB1bml0Ci10ZXN0cyB0aGUgZ2VuZXJhdGVkIGZpbGVzIGNvbnRhaW4gbWFueSBgZ29vZy5wcm92aWRlYCBzdGF0ZW1lbnRzIGxpa2U6Ci0KLSAgICBnb29nLnByb3ZpZGUoJ3Byb3RvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8nKTsKLSAgICBnb29nLnByb3ZpZGUoJ3Byb3RvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UnKTsKLSAgICBnb29nLnByb3ZpZGUoJ3Byb3RvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZScpOwotICAgIGdvb2cucHJvdmlkZSgncHJvdG8uZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8nKTsKLSAgICBnb29nLnByb3ZpZGUoJ3Byb3RvLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucycpOwotCi1UaGUgZ2VuZXJhdGVkIGNvZGUgd2lsbCBhbHNvIGBnb29nLnJlcXVpcmUoKWAgbWFueSB0eXBlcyBpbiB0aGUgY29yZSBsaWJyYXJ5LAotYW5kIHRoZXkgd2lsbCByZXF1aXJlIG1hbnkgdHlwZXMgaW4gdGhlIEdvb2dsZSBDbG9zdXJlIGxpYnJhcnkuICBTbyBtYWtlIHN1cmUKLXRoYXQgeW91ciBgZ29vZy5wcm92aWRlKClgIC8gYGdvb2cucmVxdWlyZSgpYCBzZXR1cCBjYW4gZmluZCBhbGwgb2YgeW91cgotZ2VuZXJhdGVkIGNvZGUsIHRoZSBjb3JlIGxpYnJhcnkgYC5qc2AgZmlsZXMgaW4gdGhpcyBkaXJlY3RvcnksIGFuZCB0aGUKLUdvb2dsZSBDbG9zdXJlIGxpYnJhcnkgaXRzZWxmLgotCi1PbmNlIHlvdSd2ZSBkb25lIHRoaXMsIHlvdSBzaG91bGQgYmUgYWJsZSB0byBpbXBvcnQgeW91ciB0eXBlcyB3aXRoCi1zdGF0ZW1lbnRzIGxpa2U6Ci0KLSAgICBnb29nLnJlcXVpcmUoJ3Byb3RvLm15LnBhY2thZ2UuTXlNZXNzYWdlJyk7Ci0KLSAgICB2YXIgbWVzc2FnZSA9IHByb3RvLm15LnBhY2thZ2UuTXlNZXNzYWdlKCk7Ci0KLUNvbW1vbkpTIGltcG9ydHMKLS0tLS0tLS0tLS0tLS0tLS0KLQotSWYgeW91IHdhbnQgdG8gdXNlIENvbW1vbkpTIGltcG9ydHMsIHlvdXIgYnVpbGQgc2hvdWxkIHJ1biBhIGNvbW1hbmQKLWxpa2UgdGhpczoKLQotICAgICQgcHJvdG9jIC0tanNfb3V0PWltcG9ydF9zdHlsZT1jb21tb25qcyxiaW5hcnk6LiBtZXNzYWdlcy5wcm90byBiYXNlLnByb3RvCi0KLUZvciBDb21tb25KUyBpbXBvcnRzLCBgcHJvdG9jYCB3aWxsIHNwaXQgb3V0IG9uZSBmaWxlIHBlciBpbnB1dCBmaWxlCi0oc28gYG1lc3NhZ2VzX3BiLmpzYCBhbmQgYGJhc2VfcGIuanNgIGluIHRoaXMgZXhhbXBsZSkuICBUaGUgZ2VuZXJhdGVkCi1jb2RlIHdpbGwgZGVwZW5kIG9uIHRoZSBjb3JlIHJ1bnRpbWUsIHdoaWNoIHNob3VsZCBiZSBpbiBhIGZpbGUgY2FsbGVkCi1gZ29vZ2xlLXByb3RvYnVmLmpzYC4gIElmIHlvdSBhcmUgaW5zdGFsbGluZyBmcm9tIGBucG1gLCB0aGlzIGZpbGUgc2hvdWxkCi1hbHJlYWR5IGJlIGJ1aWx0IGFuZCBhdmFpbGFibGUuICBJZiB5b3UgYXJlIHJ1bm5pbmcgZnJvbSBHaXRIdWIsIHlvdSBuZWVkCi10byBidWlsZCBpdCBmaXJzdCBieSBydW5uaW5nOgotCi0gICAgJCBndWxwIGRpc3QKLQotT25jZSB5b3UndmUgZG9uZSB0aGlzLCB5b3Ugc2hvdWxkIGJlIGFibGUgdG8gaW1wb3J0IHlvdXIgdHlwZXMgd2l0aAotc3RhdGVtZW50cyBsaWtlOgotCi0gICAgdmFyIG1lc3NhZ2VzID0gcmVxdWlyZSgnLi9tZXNzYWdlc19wYicpOwotCi0gICAgdmFyIG1lc3NhZ2UgPSBuZXcgbWVzc2FnZXMuTXlNZXNzYWdlKCk7Ci0KLVRoZSBgLS1qc19vdXRgIGZsYWcKLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotVGhlIHN5bnRheCBvZiB0aGUgYC0tanNfb3V0YCBmbGFnIGlzOgotCi0gICAgLS1qc19vdXQ9W09QVElPTlM6XW91dHB1dF9kaXIKLQotV2hlcmUgYE9QVElPTlNgIGFyZSBzZXBhcmF0ZWQgYnkgY29tbWFzLiAgT3B0aW9ucyBhcmUgZWl0aGVyIGBvcHQ9dmFsYCBvcgotanVzdCBgb3B0YCAoZm9yIG9wdGlvbnMgdGhhdCBkb24ndCB0YWtlIGEgdmFsdWUpLiAgVGhlIGF2YWlsYWJsZSBvcHRpb25zCi1hcmUgc3BlY2lmaWVkIGFuZCBkb2N1bWVudGVkIGluIHRoZSBgR2VuZXJhdG9yT3B0aW9uc2Agc3RydWN0IGluCi1bc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qcy9qc19nZW5lcmF0b3IuaF0oaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi9ibG9iL21hc3Rlci9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2pzL2pzX2dlbmVyYXRvci5oI0w1MykuCi0KLVNvbWUgZXhhbXBsZXM6Ci0KLS0gYC0tanNfb3V0PWxpYnJhcnk9bXlwcm90b3NfbGliLmpzLGJpbmFyeTouYDogdGhpcyBjb250YWlucyB0aGUgb3B0aW9ucwotICBgbGlicmFyeT1teXByb3Rvcy5saWIuanNgIGFuZCBgYmluYXJ5YCBhbmQgb3V0cHV0cyB0byB0aGUgY3VycmVudCBkaXJlY3RvcnkuCi0gIFRoZSBgaW1wb3J0X3N0eWxlYCBvcHRpb24gaXMgbGVmdCB0byB0aGUgZGVmYXVsdCwgd2hpY2ggaXMgYGNsb3N1cmVgLgotLSBgLS1qc19vdXQ9aW1wb3J0X3N0eWxlPWNvbW1vbmpzLGJpbmFyeTpwcm90b3NgOiB0aGlzIGNvbnRhaW5zIHRoZSBvcHRpb25zCi0gIGBpbXBvcnRfc3R5bGU9Y29tbW9uanNgIGFuZCBgYmluYXJ5YCBhbmQgb3V0cHV0cyB0byB0aGUgZGlyZWN0b3J5IGBwcm90b3NgLgotCi1BUEkKLT09PQotCi1UaGUgQVBJIGlzIG5vdCB3ZWxsLWRvY3VtZW50ZWQgeWV0LiAgSGVyZSBpcyBhIHF1aWNrIGV4YW1wbGUgdG8gZ2l2ZSB5b3UgYW4KLWlkZWEgb2YgaG93IHRoZSBsaWJyYXJ5IGdlbmVyYWxseSB3b3JrczoKLQotICAgIHZhciBtZXNzYWdlID0gbmV3IE15TWVzc2FnZSgpOwotCi0gICAgbWVzc2FnZS5zZXROYW1lKCJKb2huIERvZSIpOwotICAgIG1lc3NhZ2Uuc2V0QWdlKDI1KTsKLSAgICBtZXNzYWdlLnNldFBob25lTnVtYmVycyhbIjgwMC01NTUtMTIxMiIsICI4MDAtNTU1LTAwMDAiXSk7Ci0KLSAgICAvLyBTZXJpYWxpemVzIHRvIGEgVUludDhBcnJheS4KLSAgICBieXRlcyA9IG1lc3NhZ2Uuc2VyaWFsaXplQmluYXJ5KCk7Ci0KLSAgICB2YXIgbWVzc2FnZTIgPSBuZXcgTXlNZXNzYWdlKCk7Ci0gICAgbWVzc2FnZTIuZGVzZXJpYWxpemVCaW5hcnkoYnl0ZXMpOwotCi1Gb3IgbW9yZSBleGFtcGxlcywgc2VlIHRoZSB0ZXN0cy4gIFlvdSBjYW4gYWxzbyBsb29rIGF0IHRoZSBnZW5lcmF0ZWQgY29kZQotdG8gc2VlIHdoYXQgbWV0aG9kcyBhcmUgZGVmaW5lZCBmb3IgeW91ciBnZW5lcmF0ZWQgbWVzc2FnZXMuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvYXJpdGguanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvYXJpdGguanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDcwMjU3ZGUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvYmluYXJ5L2FyaXRoLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDEzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBmaWxlIGNvbnRhaW5zIGhlbHBlciBjb2RlIHVzZWQgYnkganNwYi51dGlscyB0bwotICogaGFuZGxlIDY0LWJpdCBpbnRlZ2VyIGNvbnZlcnNpb24gdG8vZnJvbSBzdHJpbmdzLgotICoKLSAqIEBhdXRob3IgY2ZhbGxpbkBnb29nbGUuY29tIChDaHJpcyBGYWxsaW4pCi0gKgotICogVE9ETyhoYWJlcm1hbik6IG1vdmUgdGhpcyB0byBqYXZhc2NyaXB0L2Nsb3N1cmUvbWF0aD8KLSAqLwotCi1nb29nLnByb3ZpZGUoJ2pzcGIuYXJpdGguSW50NjQnKTsKLWdvb2cucHJvdmlkZSgnanNwYi5hcml0aC5VSW50NjQnKTsKLQotLyoqCi0gKiBVSW50NjQgaW1wbGVtZW50cyBzb21lIDY0LWJpdCBhcml0aG1ldGljIHJvdXRpbmVzIG5lY2Vzc2FyeSBmb3IgcHJvcGVybHkKLSAqIGhhbmRsaW5nIDY0LWJpdCBpbnRlZ2VyIGZpZWxkcy4gSXQgaW1wbGVtZW50cyBsb3NzbGVzcyBpbnRlZ2VyIGFyaXRobWV0aWMgb24KLSAqIHRvcCBvZiBKYXZhU2NyaXB0J3MgbnVtYmVyIHR5cGUsIHdoaWNoIGhhcyBvbmx5IDUzIGJpdHMgb2YgcHJlY2lzaW9uLCBieQotICogcmVwcmVzZW50aW5nIDY0LWJpdCBpbnRlZ2VycyBhcyB0d28gMzItYml0IGhhbHZlcy4KLSAqCi0gKiBAcGFyYW0ge251bWJlcn0gbG8gVGhlIGxvdyAzMiBiaXRzLgotICogQHBhcmFtIHtudW1iZXJ9IGhpIFRoZSBoaWdoIDMyIGJpdHMuCi0gKiBAY29uc3RydWN0b3IKLSAqLwotanNwYi5hcml0aC5VSW50NjQgPSBmdW5jdGlvbihsbywgaGkpIHsKLSAgLyoqCi0gICAqIFRoZSBsb3cgMzIgYml0cy4KLSAgICogQHB1YmxpYyB7bnVtYmVyfQotICAgKi8KLSAgdGhpcy5sbyA9IGxvOwotICAvKioKLSAgICogVGhlIGhpZ2ggMzIgYml0cy4KLSAgICogQHB1YmxpYyB7bnVtYmVyfQotICAgKi8KLSAgdGhpcy5oaSA9IGhpOwotfTsKLQotCi0vKioKLSAqIENvbXBhcmUgdHdvIDY0LWJpdCBudW1iZXJzLiBSZXR1cm5zIC0xIGlmIHRoZSBmaXJzdCBpcwotICogbGVzcywgKzEgaWYgdGhlIGZpcnN0IGlzIGdyZWF0ZXIsIG9yIDAgaWYgYm90aCBhcmUgZXF1YWwuCi0gKiBAcGFyYW0geyFqc3BiLmFyaXRoLlVJbnQ2NH0gb3RoZXIKLSAqIEByZXR1cm4ge251bWJlcn0KLSAqLwotanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLmNtcCA9IGZ1bmN0aW9uKG90aGVyKSB7Ci0gIGlmICh0aGlzLmhpIDwgb3RoZXIuaGkgfHwgKHRoaXMuaGkgPT0gb3RoZXIuaGkgJiYgdGhpcy5sbyA8IG90aGVyLmxvKSkgewotICAgIHJldHVybiAtMTsKLSAgfSBlbHNlIGlmICh0aGlzLmhpID09IG90aGVyLmhpICYmIHRoaXMubG8gPT0gb3RoZXIubG8pIHsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFJpZ2h0LXNoaWZ0IHRoaXMgbnVtYmVyIGJ5IG9uZSBiaXQuCi0gKiBAcmV0dXJuIHshanNwYi5hcml0aC5VSW50NjR9Ci0gKi8KLWpzcGIuYXJpdGguVUludDY0LnByb3RvdHlwZS5yaWdodFNoaWZ0ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBoaSA9IHRoaXMuaGkgPj4+IDE7Ci0gIHZhciBsbyA9ICh0aGlzLmxvID4+PiAxKSB8ICgodGhpcy5oaSAmIDEpIDw8IDMxKTsKLSAgcmV0dXJuIG5ldyBqc3BiLmFyaXRoLlVJbnQ2NChsbyA+Pj4gMCwgaGkgPj4+IDApOwotfTsKLQotCi0vKioKLSAqIExlZnQtc2hpZnQgdGhpcyBudW1iZXIgYnkgb25lIGJpdC4KLSAqIEByZXR1cm4geyFqc3BiLmFyaXRoLlVJbnQ2NH0KLSAqLwotanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLmxlZnRTaGlmdCA9IGZ1bmN0aW9uKCkgewotICB2YXIgbG8gPSB0aGlzLmxvIDw8IDE7Ci0gIHZhciBoaSA9ICh0aGlzLmhpIDw8IDEpIHwgKHRoaXMubG8gPj4+IDMxKTsKLSAgcmV0dXJuIG5ldyBqc3BiLmFyaXRoLlVJbnQ2NChsbyA+Pj4gMCwgaGkgPj4+IDApOwotfTsKLQotCi0vKioKLSAqIFRlc3QgdGhlIE1TQi4KLSAqIEByZXR1cm4ge2Jvb2xlYW59Ci0gKi8KLWpzcGIuYXJpdGguVUludDY0LnByb3RvdHlwZS5tc2IgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuICEhKHRoaXMuaGkgJiAweDgwMDAwMDAwKTsKLX07Ci0KLQotLyoqCi0gKiBUZXN0IHRoZSBMU0IuCi0gKiBAcmV0dXJuIHtib29sZWFufQotICovCi1qc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUubHNiID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiAhISh0aGlzLmxvICYgMSk7Ci19OwotCi0KLS8qKgotICogVGVzdCB3aGV0aGVyIHRoaXMgbnVtYmVyIGlzIHplcm8uCi0gKiBAcmV0dXJuIHtib29sZWFufQotICovCi1qc3BiLmFyaXRoLlVJbnQ2NC5wcm90b3R5cGUuemVybyA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5sbyA9PSAwICYmIHRoaXMuaGkgPT0gMDsKLX07Ci0KLQotLyoqCi0gKiBBZGQgdHdvIDY0LWJpdCBudW1iZXJzIHRvIHByb2R1Y2UgYSA2NC1iaXQgbnVtYmVyLgotICogQHBhcmFtIHshanNwYi5hcml0aC5VSW50NjR9IG90aGVyCi0gKiBAcmV0dXJuIHshanNwYi5hcml0aC5VSW50NjR9Ci0gKi8KLWpzcGIuYXJpdGguVUludDY0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihvdGhlcikgewotICB2YXIgbG8gPSAoKHRoaXMubG8gKyBvdGhlci5sbykgJiAweGZmZmZmZmZmKSA+Pj4gMDsKLSAgdmFyIGhpID0KLSAgICAgICgoKHRoaXMuaGkgKyBvdGhlci5oaSkgJiAweGZmZmZmZmZmKSA+Pj4gMCkgKwotICAgICAgKCgodGhpcy5sbyArIG90aGVyLmxvKSA+PSAweDEwMDAwMDAwMCkgPyAxIDogMCk7Ci0gIHJldHVybiBuZXcganNwYi5hcml0aC5VSW50NjQobG8gPj4+IDAsIGhpID4+PiAwKTsKLX07Ci0KLQotLyoqCi0gKiBTdWJ0cmFjdCB0d28gNjQtYml0IG51bWJlcnMgdG8gcHJvZHVjZSBhIDY0LWJpdCBudW1iZXIuCi0gKiBAcGFyYW0geyFqc3BiLmFyaXRoLlVJbnQ2NH0gb3RoZXIKLSAqIEByZXR1cm4geyFqc3BiLmFyaXRoLlVJbnQ2NH0KLSAqLwotanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLnN1YiA9IGZ1bmN0aW9uKG90aGVyKSB7Ci0gIHZhciBsbyA9ICgodGhpcy5sbyAtIG90aGVyLmxvKSAmIDB4ZmZmZmZmZmYpID4+PiAwOwotICB2YXIgaGkgPQotICAgICAgKCgodGhpcy5oaSAtIG90aGVyLmhpKSAmIDB4ZmZmZmZmZmYpID4+PiAwKSAtCi0gICAgICAoKCh0aGlzLmxvIC0gb3RoZXIubG8pIDwgMCkgPyAxIDogMCk7Ci0gIHJldHVybiBuZXcganNwYi5hcml0aC5VSW50NjQobG8gPj4+IDAsIGhpID4+PiAwKTsKLX07Ci0KLQotLyoqCi0gKiBNdWx0aXBseSB0d28gMzItYml0IG51bWJlcnMgdG8gcHJvZHVjZSBhIDY0LWJpdCBudW1iZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgZmlyc3QgaW50ZWdlcjogIG11c3QgYmUgaW4gWzAsIDJeMzItMSkuCi0gKiBAcGFyYW0ge251bWJlcn0gYiBUaGUgc2Vjb25kIGludGVnZXI6IG11c3QgYmUgaW4gWzAsIDJeMzItMSkuCi0gKiBAcmV0dXJuIHshanNwYi5hcml0aC5VSW50NjR9Ci0gKi8KLWpzcGIuYXJpdGguVUludDY0Lm11bDMyeDMyID0gZnVuY3Rpb24oYSwgYikgewotICAvLyBEaXJlY3RseSBtdWx0aXBseWluZyB0d28gMzItYml0IG51bWJlcnMgbWF5IHByb2R1Y2UgdXAgdG8gNjQgYml0cyBvZgotICAvLyBwcmVjaXNpb24sIHRodXMgbG9zaW5nIHByZWNpc2lvbiBiZWNhdXNlIG9mIHRoZSA1My1iaXQgbWFudGlzc2Egb2YKLSAgLy8gSmF2YVNjcmlwdCBudW1iZXJzLiBTbyB3ZSBtdWx0aXBseSB3aXRoIDE2LWJpdCBkaWdpdHMgKHJhZGl4IDY1NTM2KQotICAvLyBpbnN0ZWFkLgotICB2YXIgYUxvdyA9IChhICYgMHhmZmZmKTsKLSAgdmFyIGFIaWdoID0gKGEgPj4+IDE2KTsKLSAgdmFyIGJMb3cgPSAoYiAmIDB4ZmZmZik7Ci0gIHZhciBiSGlnaCA9IChiID4+PiAxNik7Ci0gIHZhciBwcm9kdWN0TG93ID0KLSAgICAgIC8vIDMyLWJpdCByZXN1bHQsIHJlc3VsdCBiaXRzIDAtMzEsIHRha2UgYWxsIDMyIGJpdHMKLSAgICAgIChhTG93ICogYkxvdykgKwotICAgICAgLy8gMzItYml0IHJlc3VsdCwgcmVzdWx0IGJpdHMgMTYtNDcsIHRha2UgYm90dG9tIDE2IGFzIG91ciB0b3AgMTYKLSAgICAgICgoYUxvdyAqIGJIaWdoKSAmIDB4ZmZmZikgKiAweDEwMDAwICsKLSAgICAgIC8vIDMyLWJpdCByZXN1bHQsIHJlc3VsdCBiaXRzIDE2LTQ3LCB0YWtlIGJvdHRvbSAxNiBhcyBvdXIgdG9wIDE2Ci0gICAgICAoKGFIaWdoICogYkxvdykgJiAweGZmZmYpICogMHgxMDAwMDsKLSAgdmFyIHByb2R1Y3RIaWdoID0KLSAgICAgIC8vIDMyLWJpdCByZXN1bHQsIHJlc3VsdCBiaXRzIDMyLTYzLCB0YWtlIGFsbCAzMiBiaXRzCi0gICAgICAoYUhpZ2ggKiBiSGlnaCkgKwotICAgICAgLy8gMzItYml0IHJlc3VsdCwgcmVzdWx0IGJpdHMgMTYtNDcsIHRha2UgdG9wIDE2IGFzIG91ciBib3R0b20gMTYKLSAgICAgICgoYUxvdyAqIGJIaWdoKSA+Pj4gMTYpICsKLSAgICAgIC8vIDMyLWJpdCByZXN1bHQsIHJlc3VsdCBiaXRzIDE2LTQ3LCB0YWtlIHRvcCAxNiBhcyBvdXIgYm90dG9tIDE2Ci0gICAgICAoKGFIaWdoICogYkxvdykgPj4+IDE2KTsKLQotICAvLyBDYXJyeS4gTm90ZSB0aGF0IHdlIGFjdHVhbGx5IGhhdmUgdXAgdG8gKnR3byogY2FycmllcyBkdWUgdG8gYWRkaXRpb24gb2YKLSAgLy8gdGhyZWUgdGVybXMuCi0gIHdoaWxlIChwcm9kdWN0TG93ID49IDB4MTAwMDAwMDAwKSB7Ci0gICAgcHJvZHVjdExvdyAtPSAweDEwMDAwMDAwMDsKLSAgICBwcm9kdWN0SGlnaCArPSAxOwotICB9Ci0KLSAgcmV0dXJuIG5ldyBqc3BiLmFyaXRoLlVJbnQ2NChwcm9kdWN0TG93ID4+PiAwLCBwcm9kdWN0SGlnaCA+Pj4gMCk7Ci19OwotCi0KLS8qKgotICogTXVsdGlwbHkgdGhpcyBudW1iZXIgYnkgYSAzMi1iaXQgbnVtYmVyLCBwcm9kdWNpbmcgYSA5Ni1iaXQgbnVtYmVyLCB0aGVuCi0gKiB0cnVuY2F0ZSB0aGUgdG9wIDMyIGJpdHMuCi0gKiBAcGFyYW0ge251bWJlcn0gYSBUaGUgbXVsdGlwbGllci4KLSAqIEByZXR1cm4geyFqc3BiLmFyaXRoLlVJbnQ2NH0KLSAqLwotanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLm11bCA9IGZ1bmN0aW9uKGEpIHsKLSAgLy8gUHJvZHVjZSB0d28gcGFydHM6IGF0IGJpdHMgMC02MywgYW5kIDMyLTk1LgotICB2YXIgbG8gPSBqc3BiLmFyaXRoLlVJbnQ2NC5tdWwzMngzMih0aGlzLmxvLCBhKTsKLSAgdmFyIGhpID0ganNwYi5hcml0aC5VSW50NjQubXVsMzJ4MzIodGhpcy5oaSwgYSk7Ci0gIC8vIExlZnQtc2hpZnQgaGkgYnkgMzIgYml0cywgdHJ1bmNhdGluZyBpdHMgdG9wIGJpdHMuIFRoZSBwYXJ0cyB3aWxsIHRoZW4gYmUKLSAgLy8gYWxpZ25lZCBmb3IgYWRkaXRpb24uCi0gIGhpLmhpID0gaGkubG87Ci0gIGhpLmxvID0gMDsKLSAgcmV0dXJuIGxvLmFkZChoaSk7Ci19OwotCi0KLS8qKgotICogRGl2aWRlIGEgNjQtYml0IG51bWJlciBieSBhIDMyLWJpdCBudW1iZXIgdG8gcHJvZHVjZSBhCi0gKiA2NC1iaXQgcXVvdGllbnQgYW5kIGEgMzItYml0IHJlbWFpbmRlci4KLSAqIEBwYXJhbSB7bnVtYmVyfSBfZGl2aXNvcgotICogQHJldHVybiB7QXJyYXkuPGpzcGIuYXJpdGguVUludDY0Pn0gYXJyYXkgb2YgW3F1b3RpZW50LCByZW1haW5kZXJdLAotICogdW5sZXNzIGRpdmlzb3IgaXMgMCwgaW4gd2hpY2ggY2FzZSBhbiBlbXB0eSBhcnJheSBpcyByZXR1cm5lZC4KLSAqLwotanNwYi5hcml0aC5VSW50NjQucHJvdG90eXBlLmRpdiA9IGZ1bmN0aW9uKF9kaXZpc29yKSB7Ci0gIGlmIChfZGl2aXNvciA9PSAwKSB7Ci0gICAgcmV0dXJuIFtdOwotICB9Ci0KLSAgLy8gV2UgcGVyZm9ybSBsb25nIGRpdmlzaW9uIHVzaW5nIGEgcmFkaXgtMiBhbGdvcml0aG0sIGZvciBzaW1wbGljaXR5IChpLmUuLAotICAvLyBvbmUgYml0IGF0IGEgdGltZSkuIFRPRE86IG9wdGltaXplIHRvIGEgcmFkaXgtMl4zMiBhbGdvcml0aG0sIHRha2luZyBjYXJlCi0gIC8vIHRvIGdldCB0aGUgdmFyaWFibGUgc2hpZnRzIHJpZ2h0LgotICB2YXIgcXVvdGllbnQgPSBuZXcganNwYi5hcml0aC5VSW50NjQoMCwgMCk7Ci0gIHZhciByZW1haW5kZXIgPSBuZXcganNwYi5hcml0aC5VSW50NjQodGhpcy5sbywgdGhpcy5oaSk7Ci0gIHZhciBkaXZpc29yID0gbmV3IGpzcGIuYXJpdGguVUludDY0KF9kaXZpc29yLCAwKTsKLSAgdmFyIHVuaXQgPSBuZXcganNwYi5hcml0aC5VSW50NjQoMSwgMCk7Ci0KLSAgLy8gTGVmdC1zaGlmdCB0aGUgZGl2aXNvciBhbmQgdW5pdCB1bnRpbCB0aGUgaGlnaCBiaXQgb2YgZGl2aXNvciBpcyBzZXQuCi0gIHdoaWxlICghZGl2aXNvci5tc2IoKSkgewotICAgIGRpdmlzb3IgPSBkaXZpc29yLmxlZnRTaGlmdCgpOwotICAgIHVuaXQgPSB1bml0LmxlZnRTaGlmdCgpOwotICB9Ci0KLSAgLy8gUGVyZm9ybSBsb25nIGRpdmlzaW9uIG9uZSBiaXQgYXQgYSB0aW1lLgotICB3aGlsZSAoIXVuaXQuemVybygpKSB7Ci0gICAgLy8gSWYgZGl2aXNvciA8IHJlbWFpbmRlciwgYWRkIHVuaXQgdG8gcXVvdGllbnQgYW5kIHN1YnRyYWN0IGRpdmlzb3IgZnJvbQotICAgIC8vIHJlbWFpbmRlci4KLSAgICBpZiAoZGl2aXNvci5jbXAocmVtYWluZGVyKSA8PSAwKSB7Ci0gICAgICBxdW90aWVudCA9IHF1b3RpZW50LmFkZCh1bml0KTsKLSAgICAgIHJlbWFpbmRlciA9IHJlbWFpbmRlci5zdWIoZGl2aXNvcik7Ci0gICAgfQotICAgIC8vIFJpZ2h0LXNoaWZ0IHRoZSBkaXZpc29yIGFuZCB1bml0LgotICAgIGRpdmlzb3IgPSBkaXZpc29yLnJpZ2h0U2hpZnQoKTsKLSAgICB1bml0ID0gdW5pdC5yaWdodFNoaWZ0KCk7Ci0gIH0KLQotICByZXR1cm4gW3F1b3RpZW50LCByZW1haW5kZXJdOwotfTsKLQotCi0vKioKLSAqIENvbnZlcnQgYSA2NC1iaXQgbnVtYmVyIHRvIGEgc3RyaW5nLgotICogQHJldHVybiB7c3RyaW5nfQotICogQG92ZXJyaWRlCi0gKi8KLWpzcGIuYXJpdGguVUludDY0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewotICB2YXIgcmVzdWx0ID0gJyc7Ci0gIHZhciBudW0gPSB0aGlzOwotICB3aGlsZSAoIW51bS56ZXJvKCkpIHsKLSAgICB2YXIgZGl2UmVzdWx0ID0gbnVtLmRpdigxMCk7Ci0gICAgdmFyIHF1b3RpZW50ID0gZGl2UmVzdWx0WzBdLCByZW1haW5kZXIgPSBkaXZSZXN1bHRbMV07Ci0gICAgcmVzdWx0ID0gcmVtYWluZGVyLmxvICsgcmVzdWx0OwotICAgIG51bSA9IHF1b3RpZW50OwotICB9Ci0gIGlmIChyZXN1bHQgPT0gJycpIHsKLSAgICByZXN1bHQgPSAnMCc7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX07Ci0KLQotLyoqCi0gKiBQYXJzZSBhIHN0cmluZyBpbnRvIGEgNjQtYml0IG51bWJlci4gUmV0dXJucyBgbnVsbGAgb24gYSBwYXJzZSBlcnJvci4KLSAqIEBwYXJhbSB7c3RyaW5nfSBzCi0gKiBAcmV0dXJuIHs/anNwYi5hcml0aC5VSW50NjR9Ci0gKi8KLWpzcGIuYXJpdGguVUludDY0LmZyb21TdHJpbmcgPSBmdW5jdGlvbihzKSB7Ci0gIHZhciByZXN1bHQgPSBuZXcganNwYi5hcml0aC5VSW50NjQoMCwgMCk7Ci0gIC8vIG9wdGltaXphdGlvbjogcmV1c2UgdGhpcyBpbnN0YW5jZSBmb3IgZWFjaCBkaWdpdC4KLSAgdmFyIGRpZ2l0NjQgPSBuZXcganNwYi5hcml0aC5VSW50NjQoMCwgMCk7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgcy5sZW5ndGg7IGkrKykgewotICAgIGlmIChzW2ldIDwgJzAnIHx8IHNbaV0gPiAnOScpIHsKLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLSAgICB2YXIgZGlnaXQgPSBwYXJzZUludChzW2ldLCAxMCk7Ci0gICAgZGlnaXQ2NC5sbyA9IGRpZ2l0OwotICAgIHJlc3VsdCA9IHJlc3VsdC5tdWwoMTApLmFkZChkaWdpdDY0KTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfTsKLQotCi0vKioKLSAqIE1ha2UgYSBjb3B5IG9mIHRoZSB1aW50NjQuCi0gKiBAcmV0dXJuIHshanNwYi5hcml0aC5VSW50NjR9Ci0gKi8KLWpzcGIuYXJpdGguVUludDY0LnByb3RvdHlwZS5jbG9uZSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gbmV3IGpzcGIuYXJpdGguVUludDY0KHRoaXMubG8sIHRoaXMuaGkpOwotfTsKLQotCi0vKioKLSAqIEludDY0IGlzIGxpa2UgVUludDY0LCBidXQgbW9kaWZpZXMgc3RyaW5nIGNvbnZlcnNpb25zIHRvIGludGVycHJldCB0aGUgc3RvcmVkCi0gKiA2NC1iaXQgdmFsdWUgYXMgYSB0d29zLWNvbXBsZW1lbnQtc2lnbmVkIGludGVnZXIuIEl0IGRvZXMgKm5vdCogc3VwcG9ydCB0aGUKLSAqIGZ1bGwgcmFuZ2Ugb2Ygb3BlcmF0aW9ucyB0aGF0IFVJbnQ2NCBkb2VzOiBvbmx5IGFkZCwgc3VidHJhY3QsIGFuZCBzdHJpbmcKLSAqIGNvbnZlcnNpb25zLgotICoKLSAqIE4uQi4gdGhhdCBtdWx0aXBseSBhbmQgZGl2aWRlIHJvdXRpbmVzIGFyZSAqTk9UKiBzdXBwb3J0ZWQuIFRoZXkgd2lsbCB0aHJvdwotICogZXhjZXB0aW9ucy4gKFRoZXkgYXJlIG5vdCBuZWNlc3NhcnkgdG8gaW1wbGVtZW50IHN0cmluZyBjb252ZXJzaW9ucywgd2hpY2gKLSAqIGFyZSB0aGUgb25seSBvcGVyYXRpb25zIHdlIHJlYWxseSBuZWVkIGluIGpzcGIuKQotICoKLSAqIEBwYXJhbSB7bnVtYmVyfSBsbyBUaGUgbG93IDMyIGJpdHMuCi0gKiBAcGFyYW0ge251bWJlcn0gaGkgVGhlIGhpZ2ggMzIgYml0cy4KLSAqIEBjb25zdHJ1Y3RvcgotICovCi1qc3BiLmFyaXRoLkludDY0ID0gZnVuY3Rpb24obG8sIGhpKSB7Ci0gIC8qKgotICAgKiBUaGUgbG93IDMyIGJpdHMuCi0gICAqIEBwdWJsaWMge251bWJlcn0KLSAgICovCi0gIHRoaXMubG8gPSBsbzsKLSAgLyoqCi0gICAqIFRoZSBoaWdoIDMyIGJpdHMuCi0gICAqIEBwdWJsaWMge251bWJlcn0KLSAgICovCi0gIHRoaXMuaGkgPSBoaTsKLX07Ci0KLQotLyoqCi0gKiBBZGQgdHdvIDY0LWJpdCBudW1iZXJzIHRvIHByb2R1Y2UgYSA2NC1iaXQgbnVtYmVyLgotICogQHBhcmFtIHshanNwYi5hcml0aC5JbnQ2NH0gb3RoZXIKLSAqIEByZXR1cm4geyFqc3BiLmFyaXRoLkludDY0fQotICovCi1qc3BiLmFyaXRoLkludDY0LnByb3RvdHlwZS5hZGQgPSBmdW5jdGlvbihvdGhlcikgewotICB2YXIgbG8gPSAoKHRoaXMubG8gKyBvdGhlci5sbykgJiAweGZmZmZmZmZmKSA+Pj4gMDsKLSAgdmFyIGhpID0KLSAgICAgICgoKHRoaXMuaGkgKyBvdGhlci5oaSkgJiAweGZmZmZmZmZmKSA+Pj4gMCkgKwotICAgICAgKCgodGhpcy5sbyArIG90aGVyLmxvKSA+PSAweDEwMDAwMDAwMCkgPyAxIDogMCk7Ci0gIHJldHVybiBuZXcganNwYi5hcml0aC5JbnQ2NChsbyA+Pj4gMCwgaGkgPj4+IDApOwotfTsKLQotCi0vKioKLSAqIFN1YnRyYWN0IHR3byA2NC1iaXQgbnVtYmVycyB0byBwcm9kdWNlIGEgNjQtYml0IG51bWJlci4KLSAqIEBwYXJhbSB7IWpzcGIuYXJpdGguSW50NjR9IG90aGVyCi0gKiBAcmV0dXJuIHshanNwYi5hcml0aC5JbnQ2NH0KLSAqLwotanNwYi5hcml0aC5JbnQ2NC5wcm90b3R5cGUuc3ViID0gZnVuY3Rpb24ob3RoZXIpIHsKLSAgdmFyIGxvID0gKCh0aGlzLmxvIC0gb3RoZXIubG8pICYgMHhmZmZmZmZmZikgPj4+IDA7Ci0gIHZhciBoaSA9Ci0gICAgICAoKCh0aGlzLmhpIC0gb3RoZXIuaGkpICYgMHhmZmZmZmZmZikgPj4+IDApIC0KLSAgICAgICgoKHRoaXMubG8gLSBvdGhlci5sbykgPCAwKSA/IDEgOiAwKTsKLSAgcmV0dXJuIG5ldyBqc3BiLmFyaXRoLkludDY0KGxvID4+PiAwLCBoaSA+Pj4gMCk7Ci19OwotCi0KLS8qKgotICogTWFrZSBhIGNvcHkgb2YgdGhlIGludDY0LgotICogQHJldHVybiB7IWpzcGIuYXJpdGguSW50NjR9Ci0gKi8KLWpzcGIuYXJpdGguSW50NjQucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiBuZXcganNwYi5hcml0aC5JbnQ2NCh0aGlzLmxvLCB0aGlzLmhpKTsKLX07Ci0KLQotLyoqCi0gKiBDb252ZXJ0IGEgNjQtYml0IG51bWJlciB0byBhIHN0cmluZy4KLSAqIEByZXR1cm4ge3N0cmluZ30KLSAqIEBvdmVycmlkZQotICovCi1qc3BiLmFyaXRoLkludDY0LnByb3RvdHlwZS50b1N0cmluZyA9IGZ1bmN0aW9uKCkgewotICAvLyBJZiB0aGUgbnVtYmVyIGlzIG5lZ2F0aXZlLCBmaW5kIGl0cyB0d29zLWNvbXBsZW1lbnQgaW52ZXJzZS4KLSAgdmFyIHNpZ24gPSAodGhpcy5oaSAmIDB4ODAwMDAwMDApICE9IDA7Ci0gIHZhciBudW0gPSBuZXcganNwYi5hcml0aC5VSW50NjQodGhpcy5sbywgdGhpcy5oaSk7Ci0gIGlmIChzaWduKSB7Ci0gICAgbnVtID0gbmV3IGpzcGIuYXJpdGguVUludDY0KDAsIDApLnN1YihudW0pOwotICB9Ci0gIHJldHVybiAoc2lnbiA/ICctJyA6ICcnKSArIG51bS50b1N0cmluZygpOwotfTsKLQotCi0vKioKLSAqIFBhcnNlIGEgc3RyaW5nIGludG8gYSA2NC1iaXQgbnVtYmVyLiBSZXR1cm5zIGBudWxsYCBvbiBhIHBhcnNlIGVycm9yLgotICogQHBhcmFtIHtzdHJpbmd9IHMKLSAqIEByZXR1cm4gez9qc3BiLmFyaXRoLkludDY0fQotICovCi1qc3BiLmFyaXRoLkludDY0LmZyb21TdHJpbmcgPSBmdW5jdGlvbihzKSB7Ci0gIHZhciBoYXNOZWdhdGl2ZSA9IChzLmxlbmd0aCA+IDAgJiYgc1swXSA9PSAnLScpOwotICBpZiAoaGFzTmVnYXRpdmUpIHsKLSAgICBzID0gcy5zdWJzdHJpbmcoMSk7Ci0gIH0KLSAgdmFyIG51bSA9IGpzcGIuYXJpdGguVUludDY0LmZyb21TdHJpbmcocyk7Ci0gIGlmIChudW0gPT09IG51bGwpIHsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotICBpZiAoaGFzTmVnYXRpdmUpIHsKLSAgICBudW0gPSBuZXcganNwYi5hcml0aC5VSW50NjQoMCwgMCkuc3ViKG51bSk7Ci0gIH0KLSAgcmV0dXJuIG5ldyBqc3BiLmFyaXRoLkludDY0KG51bS5sbywgbnVtLmhpKTsKLX07CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvYXJpdGhfdGVzdC5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9hcml0aF90ZXN0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4OTc5NmJmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9hcml0aF90ZXN0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzU1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgVGVzdCBjYXNlcyBmb3IgSW50NjQtbWFuaXB1bGF0aW9uIGZ1bmN0aW9ucy4KLSAqCi0gKiBUZXN0IHN1aXRlIGlzIHdyaXR0ZW4gdXNpbmcgSmFzbWluZSAtLSBzZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLwotICoKLSAqIEBhdXRob3IgY2ZhbGxpbkBnb29nbGUuY29tIChDaHJpcyBGYWxsaW4pCi0gKi8KLQotZ29vZy5yZXF1aXJlKCdnb29nLnRlc3RpbmcuYXNzZXJ0cycpOwotZ29vZy5yZXF1aXJlKCdqc3BiLmFyaXRoLkludDY0Jyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuYXJpdGguVUludDY0Jyk7Ci0KLQotZGVzY3JpYmUoJ2JpbmFyeUFyaXRoVGVzdCcsIGZ1bmN0aW9uKCkgewotICAvKioKLSAgICogVGVzdHMgY29tcGFyaXNvbiBvcGVyYXRpb25zLgotICAgKi8KLSAgaXQoJ3Rlc3RDb21wYXJlJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGEgPSBuZXcganNwYi5hcml0aC5VSW50NjQoMTIzNCwgNTY3OCk7Ci0gICAgdmFyIGIgPSBuZXcganNwYi5hcml0aC5VSW50NjQoMTIzNCwgNTY3OCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGEuY21wKGIpLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoYi5jbXAoYSksIDApOwotICAgIGIubG8gLT0gMTsKLSAgICBhc3NlcnRFcXVhbHMoYS5jbXAoYiksIDEpOwotICAgIGFzc2VydEVxdWFscyhiLmNtcChhKSwgLTEpOwotICAgIGIubG8gKz0gMjsKLSAgICBhc3NlcnRFcXVhbHMoYS5jbXAoYiksIC0xKTsKLSAgICBhc3NlcnRFcXVhbHMoYi5jbXAoYSksIDEpOwotICAgIGIubG8gPSBhLmxvOwotICAgIGIuaGkgPSBhLmhpIC0gMTsKLSAgICBhc3NlcnRFcXVhbHMoYS5jbXAoYiksIDEpOwotICAgIGFzc2VydEVxdWFscyhiLmNtcChhKSwgLTEpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGEuemVybygpLCBmYWxzZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGEubXNiKCksIGZhbHNlKTsKLSAgICBhc3NlcnRFcXVhbHMoYS5sc2IoKSwgZmFsc2UpOwotICAgIGEuaGkgPSAwOwotICAgIGEubG8gPSAwOwotICAgIGFzc2VydEVxdWFscyhhLnplcm8oKSwgdHJ1ZSk7Ci0gICAgYS5oaSA9IDB4ODAwMDAwMDA7Ci0gICAgYXNzZXJ0RXF1YWxzKGEuemVybygpLCBmYWxzZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGEubXNiKCksIHRydWUpOwotICAgIGEubG8gPSAweDAwMDAwMDAxOwotICAgIGFzc2VydEVxdWFscyhhLmxzYigpLCB0cnVlKTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdHMgc2hpZnRzLgotICAgKi8KLSAgaXQoJ3Rlc3RTaGlmdHMnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgYSA9IG5ldyBqc3BiLmFyaXRoLlVJbnQ2NCgxLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoYS5sbywgMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGEuaGksIDApOwotICAgIHZhciBvcmlnID0gYTsKLSAgICBhID0gYS5sZWZ0U2hpZnQoKTsKLSAgICBhc3NlcnRFcXVhbHMob3JpZy5sbywgMSk7ICAvLyBvcmlnaW5hbCB1bm1vZGlmaWVkLgotICAgIGFzc2VydEVxdWFscyhvcmlnLmhpLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoYS5sbywgMik7Ci0gICAgYXNzZXJ0RXF1YWxzKGEuaGksIDApOwotICAgIGEgPSBhLmxlZnRTaGlmdCgpOwotICAgIGFzc2VydEVxdWFscyhhLmxvLCA0KTsKLSAgICBhc3NlcnRFcXVhbHMoYS5oaSwgMCk7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCAyOTsgaSsrKSB7Ci0gICAgICBhID0gYS5sZWZ0U2hpZnQoKTsKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKGEubG8sIDB4ODAwMDAwMDApOwotICAgIGFzc2VydEVxdWFscyhhLmhpLCAwKTsKLSAgICBhID0gYS5sZWZ0U2hpZnQoKTsKLSAgICBhc3NlcnRFcXVhbHMoYS5sbywgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGEuaGksIDEpOwotICAgIGEgPSBhLmxlZnRTaGlmdCgpOwotICAgIGFzc2VydEVxdWFscyhhLmxvLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMoYS5oaSwgMik7Ci0gICAgYSA9IGEucmlnaHRTaGlmdCgpOwotICAgIGEgPSBhLnJpZ2h0U2hpZnQoKTsKLSAgICBhc3NlcnRFcXVhbHMoYS5sbywgMHg4MDAwMDAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGEuaGksIDApOwotICAgIGEgPSBhLnJpZ2h0U2hpZnQoKTsKLSAgICBhc3NlcnRFcXVhbHMoYS5sbywgMHg0MDAwMDAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGEuaGksIDApOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBhZGRpdGlvbnMuCi0gICAqLwotICBpdCgndGVzdEFkZCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBhID0gbmV3IGpzcGIuYXJpdGguVUludDY0KC8qIGxvID0gKi8gMHg4OWFiY2RlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaGkgPSAqLyAweDAxMjM0NTY3KTsKLSAgICB2YXIgYiA9IG5ldyBqc3BiLmFyaXRoLlVJbnQ2NCgvKiBsbyA9ICovIDB4ZmY1MmFiOTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGhpID0gKi8gMHg5MmZhMjEyMyk7Ci0gICAgLy8gQWRkaXRpb24gd2l0aCBjYXJyeS4KLSAgICB2YXIgYyA9IGEuYWRkKGIpOwotICAgIGFzc2VydEVxdWFscyhhLmxvLCAweDg5YWJjZGVmKTsgIC8vIG9yaWdpbmFscyB1bm1vZGlmaWVkLgotICAgIGFzc2VydEVxdWFscyhhLmhpLCAweDAxMjM0NTY3KTsKLSAgICBhc3NlcnRFcXVhbHMoYi5sbywgMHhmZjUyYWI5MSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGIuaGksIDB4OTJmYTIxMjMpOwotICAgIGFzc2VydEVxdWFscyhjLmxvLCAweDg4ZmU3OTgwKTsKLSAgICBhc3NlcnRFcXVhbHMoYy5oaSwgMHg5NDFkNjY4Yik7Ci0KLSAgICAvLyBTaW1wbGUgYWRkaXRpb24gd2l0aG91dCBjYXJyeS4KLSAgICBhLmxvID0gMjsKLSAgICBhLmhpID0gMDsKLSAgICBiLmxvID0gMzsKLSAgICBiLmhpID0gMDsKLSAgICBjID0gYS5hZGQoYik7Ci0gICAgYXNzZXJ0RXF1YWxzKGMubG8sIDUpOwotICAgIGFzc2VydEVxdWFscyhjLmhpLCAwKTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdCBzdWJ0cmFjdGlvbnMuCi0gICAqLwotICBpdCgndGVzdFN1YicsIGZ1bmN0aW9uKCkgewotICAgIHZhciBrTGVuZ3RoID0gMTA7Ci0gICAgdmFyIGhpVmFsdWVzID0gWzB4MTY4MmVmMzIsCi0gICAgICAgICAgICAgICAgICAgIDB4NTgzOTAyZjcsCi0gICAgICAgICAgICAgICAgICAgIDB4YjYyZjU5NTUsCi0gICAgICAgICAgICAgICAgICAgIDB4NmVhOTliYmYsCi0gICAgICAgICAgICAgICAgICAgIDB4MjVhMzljMjAsCi0gICAgICAgICAgICAgICAgICAgIDB4MDcwMGEwOGIsCi0gICAgICAgICAgICAgICAgICAgIDB4MDBmNzMwNGQsCi0gICAgICAgICAgICAgICAgICAgIDB4OTFhNWI1YWYsCi0gICAgICAgICAgICAgICAgICAgIDB4ODkwNzdmZDIsCi0gICAgICAgICAgICAgICAgICAgIDB4ZTA5ZTM0N2NdOwotICAgIHZhciBsb1ZhbHVlcyA9IFsweGUxNTM4YjE4LAotICAgICAgICAgICAgICAgICAgICAweGJlYWNkNTU2LAotICAgICAgICAgICAgICAgICAgICAweDc0MTAwNzU4LAotICAgICAgICAgICAgICAgICAgICAweDk2ZTNjYjI2LAotICAgICAgICAgICAgICAgICAgICAweDU2YzM3YzNmLAotICAgICAgICAgICAgICAgICAgICAweGUwMGIzZjdkLAotICAgICAgICAgICAgICAgICAgICAweDg1OWYyNWQ3LAotICAgICAgICAgICAgICAgICAgICAweGMyZWU2MTRhLAotICAgICAgICAgICAgICAgICAgICAweGUxZDIxY2Q3LAotICAgICAgICAgICAgICAgICAgICAweDMwYWFlNmE0XTsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IGtMZW5ndGg7IGkrKykgewotICAgICAgZm9yICh2YXIgaiA9IDA7IGogPCBrTGVuZ3RoOyBqKyspIHsKLSAgICAgICAgdmFyIGEgPSBuZXcganNwYi5hcml0aC5VSW50NjQobG9WYWx1ZXNbaV0sIGhpVmFsdWVzW2pdKTsKLSAgICAgICAgdmFyIGIgPSBuZXcganNwYi5hcml0aC5VSW50NjQobG9WYWx1ZXNbal0sIGhpVmFsdWVzW2ldKTsKLSAgICAgICAgdmFyIGMgPSBhLmFkZChiKS5zdWIoYik7Ci0gICAgICAgIGFzc2VydEVxdWFscyhjLmhpLCBhLmhpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKGMubG8sIGEubG8pOwotICAgICAgfQotICAgIH0KLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdHMgMzItYnktMzIgbXVsdGlwbGljYXRpb24uCi0gICAqLwotICBpdCgndGVzdE11bDMyeDMyJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHRlc3REYXRhID0gWwotICAgICAgLy8gYSAgICAgICAgYiAgICAgICAgICBsb3coYSpiKSAgIGhpZ2goYSpiKQotICAgICAgWzB4YzBhYmUyZjgsIDB4MTYwNzg5OGEsIDB4NWRlNzExYjAsIDB4MTA5NDcxYjhdLAotICAgICAgWzB4OTE1ZWIzY2IsIDB4NGZiNjZkMGUsIDB4YmQwZDQ0MWEsIDB4MmQ0M2QwYmNdLAotICAgICAgWzB4ZmU0ZWZlNzAsIDB4ODBiNDhjMzcsIDB4YmNkZGVhMTAsIDB4N2ZkYWRhMGNdLAotICAgICAgWzB4ZTIyMmZkNGEsIDB4ZTQzZDUyNGEsIDB4ZDVlMGViNjQsIDB4Yzk5ZDU0OWNdLAotICAgICAgWzB4ZDE3MWY0NjksIDB4Yjk0ZWJkMDEsIDB4NGJlMTc5NjksIDB4OTc5YmM0ZmFdLAotICAgICAgWzB4ODI5Y2MxZGYsIDB4ZTI1OThiMzgsIDB4ZjQxNTdkYzgsIDB4NzM3YzEyYWRdLAotICAgICAgWzB4ZjEwYzM3NjcsIDB4ODM4Mjg4MWUsIDB4OTQyYjM2MTIsIDB4N2JkNDI4YjhdLAotICAgICAgWzB4YjBmNmRkMjQsIDB4MjMyNTk3ZTEsIDB4MDc5Yzk4YTQsIDB4MTg0YmJjZTddLAotICAgICAgWzB4ZmNkYjA1YTcsIDB4OTAyZjU1YmMsIDB4NjM2MTk5YTQsIDB4OGU2OWY0MTJdLAotICAgICAgWzB4MGRkMGJmYTksIDB4OTE2ZTI3YjEsIDB4NmUyNTQyZDksIDB4MDdkOTJlNjVdCi0gICAgXTsKLQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdERhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBhID0gdGVzdERhdGFbaV1bMF0gPj4+IDA7Ci0gICAgICB2YXIgYiA9IHRlc3REYXRhW2ldWzFdID4+PiAwOwotICAgICAgdmFyIGNMb3cgPSB0ZXN0RGF0YVtpXVsyXSA+Pj4gMDsKLSAgICAgIHZhciBjSGlnaCA9IHRlc3REYXRhW2ldWzNdID4+PiAwOwotICAgICAgdmFyIGMgPSBqc3BiLmFyaXRoLlVJbnQ2NC5tdWwzMngzMihhLCBiKTsKLSAgICAgIGFzc2VydEVxdWFscyhjLmxvLCBjTG93KTsKLSAgICAgIGFzc2VydEVxdWFscyhjLmhpLCBjSGlnaCk7Ci0gICAgfQotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyA2NC1ieS0zMiBtdWx0aXBsaWNhdGlvbi4KLSAgICovCi0gIGl0KCd0ZXN0TXVsJywgZnVuY3Rpb24oKSB7Ci0gICAgLy8gNjR4MzIgYml0cyBwcm9kdWNlcyA5NiBiaXRzIG9mIHByb2R1Y3QuIFRoZSBtdWx0aXBsaWNhdGlvbiBmdW5jdGlvbiB1bmRlcgotICAgIC8vIHRlc3QgdHJ1bmNhdGVzIHRoZSB0b3AgMzIgYml0cywgc28gd2UgY29tcGFyZSBhZ2FpbnN0IGEgNjQtYml0IGV4cGVjdGVkCi0gICAgLy8gcHJvZHVjdC4KLSAgICB2YXIgdGVzdERhdGEgPSBbCi0gICAgICAvLyBsb3coYSkgICBoaWdoKGEpICAgICAgICAgICAgICAgbG93KGEqYikgICBoaWdoKGEqYikKLSAgICAgIFsweGVjMTA5NTViLCAweDM2MGViMTY4LCAweDRiN2YzZjViLCAweGJmY2I3YzU5LCAweDk1MTdkYTVmXSwKLSAgICAgIFsweDQyYjAwMGZjLCAweDlkMTAxNjQyLCAweDZmYTFhYjcyLCAweDI1ODRjNDM4LCAweDZhOWU2ZDJiXSwKLSAgICAgIFsweGY0MmQ0ZmI0LCAweGFlMzY2NDAzLCAweGE2NWExMDAwLCAweDkyNDM0MDAwLCAweDFmZjk3OGRmXSwKLSAgICAgIFsweDE3ZTJmNTZiLCAweDI1NDg3NjkzLCAweGYxM2Y5OGM3LCAweDczNzk0ZTJkLCAweGE5NmIwYzZhXSwKLSAgICAgIFsweDQ5MmYyNDFmLCAweDc2YzBlYjY3LCAweDczNzdhYzQ0LCAweGQ0MzM2YzNjLCAweGZjNGIxZWJlXSwKLSAgICAgIFsweGQ2YjkyMzIxLCAweGUxODRmYTQ4LCAweGQ2ZTc2OTA0LCAweDkzMTQxNTg0LCAweGNiZjQ0ZGExXSwKLSAgICAgIFsweDRiZjAwN2VhLCAweDk2OGMwYTllLCAweGY1ZTQwMjZhLCAweDRmZGIxYWU0LCAweDYxYjlmYjdkXSwKLSAgICAgIFsweDEwYTgzYmU3LCAweDJkNjg1YmE2LCAweGM5ZTVmYjdmLCAweDJhZDQzNDk5LCAweDM3NDI0NzNkXSwKLSAgICAgIFsweDJmMjYxODI5LCAweDFhY2E2ODFhLCAweDNkMzQ5NGUzLCAweDgyMTMyMDViLCAweDI4MzcxOWY4XSwKLSAgICAgIFsweGU0ZjJjZTIxLCAweDJlNzRiN2JkLCAweGQ4MDFiMzhiLCAweGJjMTdmZWViLCAweGM2YzQ0ZTBmXQotICAgIF07Ci0KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3REYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgYSA9IG5ldyBqc3BiLmFyaXRoLlVJbnQ2NCh0ZXN0RGF0YVtpXVswXSwgdGVzdERhdGFbaV1bMV0pOwotICAgICAgdmFyIHByb2QgPSBhLm11bCh0ZXN0RGF0YVtpXVsyXSk7Ci0gICAgICBhc3NlcnRFcXVhbHMocHJvZC5sbywgdGVzdERhdGFbaV1bM10pOwotICAgICAgYXNzZXJ0RXF1YWxzKHByb2QuaGksIHRlc3REYXRhW2ldWzRdKTsKLSAgICB9Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIDY0LWRpdi1ieS0zMiBkaXZpc2lvbi4KLSAgICovCi0gIGl0KCd0ZXN0RGl2JywgZnVuY3Rpb24oKSB7Ci0gICAgLy8gQ29tcHV0ZSBhL2IsIHlpZWxkaW5nIHF1b3QgPSBhL2IgYW5kIHJlbSA9IGElYi4KLSAgICB2YXIgdGVzdERhdGEgPSBbCi0gICAgICAvLyAtLS0gZGl2aXNvcnMgaW4gKDAsIDJeMzItMSkgdG8gdGVzdCBmdWxsIGRpdmlzb3IgcmFuZ2UKLSAgICAgIC8vIGxvdyhhKSAgIGhpZ2goYSkgICAgYiAgICAgICAgICBsb3cocXVvdCkgIGhpZ2gocXVvdCkgcmVtCi0gICAgICBbMHg3MTI0NDNmMSwgMHhlODVjZWZjYywgMHhjMWE3MDUwYiwgMHgzMzJjNzlhZCwgMHgwMDAwMDAwMSwgMHg5MmZmYTg4Ml0sCi0gICAgICBbMHgxMTkxMjkxNSwgMHhiMjY5OWViNSwgMHgzMDQ2N2NiZSwgMHhiMjFiNGJlNCwgMHgwMDAwMDAwMywgMHgyODM0NjVkZF0sCi0gICAgICBbMHgwZDkxNzk4MiwgMHgyMDFmMmE2ZSwgMHgzZjM1YmYwMywgMHg4MjE3YzhlNCwgMHgwMDAwMDAwMCwgMHgxNTM0MDJkNl0sCi0gICAgICBbMHhhMDcyYzEwOCwgMHg3NDAyMGM5NiwgMHhjNjA1NjhmZCwgMHg5NWY5NjEzZSwgMHgwMDAwMDAwMCwgMHgzZjQ2NzZjMl0sCi0gICAgICBbMHhkODQ1ZDVkOCwgMHhjZGQyMzVjNCwgMHgyMDQyNjQ3NSwgMHg2MTU0ZTc4YiwgMHgwMDAwMDAwNiwgMHgyMDJmYjc1MV0sCi0gICAgICBbMHhhNGRiZjcxZiwgMHg5ZTkwNDY1ZSwgMHhmMDhlMDIyZiwgMHhhOGJlOTQ3ZiwgMHgwMDAwMDAwMCwgMHhiZTQzYjVjZV0sCi0gICAgICBbMHgzZGJlNjI3ZiwgMHhhNzkxZjRiOSwgMHgyOGE1YmQ4OSwgMHgxZjVkZmU5MywgMHgwMDAwMDAwNCwgMHgwMmJmOWVkNF0sCi0gICAgICBbMHg1YzFjNTNlZSwgMHhjY2Y1MTAyZSwgMHgxOTg1NzZlNywgMHgwN2UzYWUzMSwgMHgwMDAwMDAwOCwgMHgwMmVhOGZiN10sCi0gICAgICBbMHhmZWYxZTU4MSwgMHgwNDcxNDA2NywgMHhjYTY1NDBjMSwgMHgwNTllNzNlYywgMHgwMDAwMDAwMCwgMHgzMTY1ODA5NV0sCi0gICAgICBbMHgxZTJkZDkwYywgMHgxM2RkNjY2NywgMHg4YjIxODRjMywgMHgyNDhkMWE0MiwgMHgwMDAwMDAwMCwgMHg0Y2E2ZDBjNl0sCi0gICAgICAvLyAtLS0gZGl2aXNvcnMgaW4gKDAsIDJeMTYtMSkgdG8gdGVzdCBsYXJnZXIgcXVvdGllbnQgaGlnaC13b3JkcwotICAgICAgLy8gbG93KGEpICAgaGlnaChhKSAgICBiICAgICAgICAgIGxvdyhxdW90KSAgaGlnaChxdW90KSByZW0KLSAgICAgIFsweDg2NzIyYjQ3LCAweDJjZDU3YzlhLCAweDAwMDAzMTIzLCAweDJhZTQxYjdhLCAweDAwMDBlOTk1LCAweDAwMDAwZjk5XSwKLSAgICAgIFsweDFkZDc4ODRjLCAweGY1ZTgzOWJjLCAweDAwMDA5ZWViLCAweDVjODg2MjQyLCAweDAwMDE4YzIxLCAweDAwMDA5OWI2XSwKLSAgICAgIFsweDVjNTNkNjI1LCAweDg5OWZjN2U1LCAweDAwMDA4N2Q3LCAweGQ2MjUwMDdhLCAweDAwMDEwMzVjLCAweDAwMDAxOWFmXSwKLSAgICAgIFsweDY5MzJkOTMyLCAweDlkMGE1NDg4LCAweDAwMDA1MWZiLCAweDlkOTc2MTQzLCAweDAwMDFlYTYzLCAweDAwMDA0OTgxXSwKLSAgICAgIFsweDRkMThiYjg1LCAweDBjOTJmYjMxLCAweDAwMDAxZDlmLCAweDAzMjY1YWI0LCAweDAwMDA2Y2FjLCAweDAwMDAwMWI5XSwKLSAgICAgIFsweGJlNzU2NzY4LCAweGRlYTY3Y2NiLCAweDAwMDA4YTAzLCAweDU4YWRkNDQyLCAweDAwMDE5Y2ZmLCAweDAwMDA1NmEyXSwKLSAgICAgIFsweGUyNDY2ZjlhLCAweDI1MjFmMTE0LCAweDAwMDBjMzUwLCAweGEwYzA4NjBkLCAweDAwMDAzMGFiLCAweDAwMDBhNDhhXSwKLSAgICAgIFsweGYwMGRkYWQxLCAweGUyZjU0NDZhLCAweDAwMDAyY2ZjLCAweDc2MjY5N2E2LCAweDAwMDUwYjk2LCAweDAwMDAwYjY5XSwKLSAgICAgIFsweGE4NzkxNTJhLCAweDBhNzBlMGE1LCAweDAwMDA3Y2RmLCAweGI0NDE1MWIzLCAweDAwMDAxNTY3LCAweDAwMDAzNjNkXSwKLSAgICAgIFsweDcxNzlhNzRjLCAweDQ2MDgzZmZmLCAweDAwMDAyNTNjLCAweDRkMzliYTZlLCAweDAwMDFlMTdmLCAweDAwMDAwZjg0XQotICAgIF07Ci0KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3REYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB2YXIgYSA9IG5ldyBqc3BiLmFyaXRoLlVJbnQ2NCh0ZXN0RGF0YVtpXVswXSwgdGVzdERhdGFbaV1bMV0pOwotICAgICAgdmFyIHJlc3VsdCA9IGEuZGl2KHRlc3REYXRhW2ldWzJdKTsKLSAgICAgIHZhciBxdW90aWVudCA9IHJlc3VsdFswXTsKLSAgICAgIHZhciByZW1haW5kZXIgPSByZXN1bHRbMV07Ci0gICAgICBhc3NlcnRFcXVhbHMocXVvdGllbnQubG8sIHRlc3REYXRhW2ldWzNdKTsKLSAgICAgIGFzc2VydEVxdWFscyhxdW90aWVudC5oaSwgdGVzdERhdGFbaV1bNF0pOwotICAgICAgYXNzZXJ0RXF1YWxzKHJlbWFpbmRlci5sbywgdGVzdERhdGFbaV1bNV0pOwotICAgIH0KLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdHMgLnRvU3RyaW5nKCkgYW5kIC5mcm9tU3RyaW5nKCkuCi0gICAqLwotICBpdCgndGVzdFN0cmluZ3MnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGVzdERhdGEgPSBbCi0gICAgICAgIFsweDVlODRjOTM1LCAweGNhZTMzZDBlLCAnMTQ2MTk1OTU5NDcyOTkzNTkwMjknXSwKLSAgICAgICAgWzB4NjJiM2I4YjgsIDB4OTM0ODA1NDQsICcxMDYxMjczODMxMzE3MDQzNDIzMiddLAotICAgICAgICBbMHgzMTliZmIxMywgMHhjMDFjNDE3MiwgJzEzODQzMDExMzEzMzQ0NDQ1MjAzJ10sCi0gICAgICAgIFsweDViOGE2NWZiLCAweGE1ODg1YjMxLCAnMTE5Mjc4ODM4ODA2MzgwODA1MDcnXSwKLSAgICAgICAgWzB4NmJkYjgwZjEsIDB4YjBkMWIxNmIsICcxMjc0MTE1OTg5NTczNzAwODM2OSddLAotICAgICAgICBbMHg0YjgyYjQ0MiwgMHgyZTBkOGM5NywgJzMzMTg0NjMwODE4NzY3MzA5NDYnXSwKLSAgICAgICAgWzB4NzgwZDUyMDgsIDB4N2Q3Njc1MmMsICc5MDQwNTQyMTM1ODQ1OTk5MTEyJ10sCi0gICAgICAgIFsweDJlNDY4MDBmLCAweDA5OTM3NzhkLCAnNjkwMDI2NjE2MTY4Mjg0MTc1J10sCi0gICAgICAgIFsweGYwMGE3ZTMyLCAweGNkOGUzOTMxLCAnMTQ4MTE4MzkxMTExMTE1NDAyNzQnXSwKLSAgICAgICAgWzB4MWJhZWNjZDYsIDB4OTIzMDQ4YzQsICcxMDUzMzk5OTUzNTUzNDgyMDU2NiddLAotICAgICAgICBbMHgwMzY2OWQyOSwgMHhiZmYzYWI3MiwgJzEzODMxNTg3Mzg2NzU2NjAzMTc3J10sCi0gICAgICAgIFsweDI1MjYwNzNlLCAweDAxYWZmYzgxLCAnMTIxNTkzMzQ2NTY2NTIyNjg2J10sCi0gICAgICAgIFsweGMyNDI0NGUwLCAweGQ3ZjQwZDBlLCAnMTU1NjEwNzY5Njk1MTE3MzI0NDgnXSwKLSAgICAgICAgWzB4YzU2YTM0MWUsIDB4YTY4YjY2YTcsICcxMjAwMDc5ODUwMjgxNjQ2MTg1NCddLAotICAgICAgICBbMHg4NzM4ZDY0ZCwgMHhiZmU3ODYwNCwgJzEzODI4MTY4NTM0ODcxMDM3NTE3J10sCi0gICAgICAgIFsweDViYWZmMDNiLCAweGQ3NTcyYWVhLCAnMTU1MTY5MTgyMjcxNzczMDQxMjMnXSwKLSAgICAgICAgWzB4NGE4NDNkOGEsIDB4ODY0ZTEzMmIsICc5Njc3NjkzNzI1OTIwNDc2NTU0J10sCi0gICAgICAgIFsweDI1YjRlOTRkLCAweDIyYjU0ZGM2LCAnMjUwMDk5MDY4MTUwNTY1NTExNyddLAotICAgICAgICBbMHg2YmJlNjY0YiwgMHg1NWE1Y2MwZSwgJzYxNzE1NjMyMjY2OTAzODEzODcnXSwKLSAgICAgICAgWzB4ZWU5MTZjODEsIDB4YjAwYWFiYjMsICcxMjY4NTE0MDA4OTczMjQyNjg4MSddCi0gICAgXTsKLQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdERhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBhID0gbmV3IGpzcGIuYXJpdGguVUludDY0KHRlc3REYXRhW2ldWzBdLCB0ZXN0RGF0YVtpXVsxXSk7Ci0gICAgICB2YXIgcm91bmR0cmlwID0ganNwYi5hcml0aC5VSW50NjQuZnJvbVN0cmluZyhhLnRvU3RyaW5nKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHJvdW5kdHJpcC5sbywgYS5sbyk7Ci0gICAgICBhc3NlcnRFcXVhbHMocm91bmR0cmlwLmhpLCBhLmhpKTsKLSAgICAgIGFzc2VydEVxdWFscyhhLnRvU3RyaW5nKCksIHRlc3REYXRhW2ldWzJdKTsKLSAgICB9Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIHNpZ25lZCBJbnQ2NHMuIFRoZXNlIGFyZSBidWlsdCBvbiBVSW50NjRzLCBzbyB3ZSBvbmx5IG5lZWQgdG8gdGVzdAotICAgKiB0aGUgZXhwbGljaXQgb3ZlcnJpZGVzOiAudG9TdHJpbmcoKSBhbmQgLmZyb21TdHJpbmcoKS4KLSAgICovCi0gIGl0KCd0ZXN0U2lnbmVkSW50NjQnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgdGVzdFN0cmluZ3MgPSBbCi0gICAgICAgICctNzg0NzQ5OTY0NDE3ODU5MzY2NicsCi0gICAgICAgICczNzcxOTQ2NTAxMjI5MTM5NTIzJywKLSAgICAgICAgJzI4NzI4NTY1NDkwNTQ5OTUwNjAnLAotICAgICAgICAnLTU3ODAwNDk1OTQyNzQzNTA5MDQnLAotICAgICAgICAnMzM4Mzc4NTk1NjY5NTEwNTIwMScsCi0gICAgICAgICcyOTczMDU1MTg0ODU3MDcyNjEwJywKLSAgICAgICAgJy0zODc5NDI4NDU5MjE1NjI3MjA2JywKLSAgICAgICAgJzQ1ODk4MTI0MzEwNjQxNTY2MzEnLAotICAgICAgICAnODQ4NDA3NTU1NzMzMzY4OTk0MCcsCi0gICAgICAgICcxMDc1MzI1ODE3MDk4MDkyNDA3JywKLSAgICAgICAgJy00MzQ2Njk3NTAxMDEyMjkyMzE0JywKLSAgICAgICAgJzI0ODg2MjA0NTk3MTgzMTY2MzcnLAotICAgICAgICAnNjExMjY1NTE4NzQyMzUyMDY3MicsCi0gICAgICAgICctMzY1NTI3ODI3MzkyODYxMjEwNCcsCi0gICAgICAgICczNDM5MTU0MDE5NDM1ODAzMTk2JywKLSAgICAgICAgJzEwMDQxMTI0Nzg4NDM3NjM3NTcnLAotICAgICAgICAnLTY1ODc3OTA3NzY2MTQzNjg0MTMnLAotICAgICAgICAnNjY0MzIwMDY1MDk5NzE0NTg2JywKLSAgICAgICAgJzQ3NjA0MTI5MDk5NzMyOTI5MTInLAotICAgICAgICAnLTc5MTE5MDM5ODk2MDIyNzQ2NzInCi0gICAgXTsKLQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgdGVzdFN0cmluZ3MubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciByb3VuZHRyaXAgPQotICAgICAgICAgIGpzcGIuYXJpdGguSW50NjQuZnJvbVN0cmluZyh0ZXN0U3RyaW5nc1tpXSkudG9TdHJpbmcoKTsKLSAgICAgIGFzc2VydEVxdWFscyhyb3VuZHRyaXAsIHRlc3RTdHJpbmdzW2ldKTsKLSAgICB9Ci0gIH0pOwotfSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvY29uc3RhbnRzLmpzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvYmluYXJ5L2NvbnN0YW50cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM2MjE2Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvY29uc3RhbnRzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMzYwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBmaWxlIGNvbnRhaW5zIGNvbnN0YW50cyBhbmQgdHlwZWRlZnMgdXNlZCBieQotICoganNwYi5CaW5hcnlSZWFkZXIgYW5kIEJpbmFyeVdyaXRlci4KLSAqCi0gKiBAYXV0aG9yIGFhcHBsZWJ5QGdvb2dsZS5jb20gKEF1c3RpbiBBcHBsZWJ5KQotICovCi0KLWdvb2cucHJvdmlkZSgnanNwYi5BbnlGaWVsZFR5cGUnKTsKLWdvb2cucHJvdmlkZSgnanNwYi5CaW5hcnlDb25zdGFudHMnKTsKLWdvb2cucHJvdmlkZSgnanNwYi5CaW5hcnlNZXNzYWdlJyk7Ci1nb29nLnByb3ZpZGUoJ2pzcGIuQnVpbGRlckZ1bmN0aW9uJyk7Ci1nb29nLnByb3ZpZGUoJ2pzcGIuQnl0ZVNvdXJjZScpOwotZ29vZy5wcm92aWRlKCdqc3BiLkNsb25lckZ1bmN0aW9uJyk7Ci1nb29nLnByb3ZpZGUoJ2pzcGIuQ29tcGFyZXJGdW5jdGlvbicpOwotZ29vZy5wcm92aWRlKCdqc3BiLkNvbnN0QmluYXJ5TWVzc2FnZScpOwotZ29vZy5wcm92aWRlKCdqc3BiLlBydW5lckZ1bmN0aW9uJyk7Ci1nb29nLnByb3ZpZGUoJ2pzcGIuUmVhZGVyRnVuY3Rpb24nKTsKLWdvb2cucHJvdmlkZSgnanNwYi5SZWN5Y2xlckZ1bmN0aW9uJyk7Ci1nb29nLnByb3ZpZGUoJ2pzcGIuUmVwZWF0ZWRGaWVsZFR5cGUnKTsKLWdvb2cucHJvdmlkZSgnanNwYi5TY2FsYXJGaWVsZFR5cGUnKTsKLWdvb2cucHJvdmlkZSgnanNwYi5Xcml0ZXJGdW5jdGlvbicpOwotCi0KLWdvb2cuZm9yd2FyZERlY2xhcmUoJ2pzcGIuTWVzc2FnZScpOwotZ29vZy5mb3J3YXJkRGVjbGFyZSgnanNwcm90by5CaW5hcnlFeHRlbnNpb24nKTsKLQotCi0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgY2xhc3MgZm9yIGFsbCBjb25zdCBtZXNzYWdlcy4gRG9lcyBfX25vdF9fIGRlZmluZSBhbnkKLSAqIG1ldGhvZHMsIGFzIGRvaW5nIHNvIG9uIGEgd2lkZWx5LXVzZWQgaW50ZXJmYWNlIGRlZmVhdHMgZGVhZC1jb2RlCi0gKiBlbGltaW5hdGlvbi4KLSAqIEBpbnRlcmZhY2UKLSAqLwotanNwYi5Db25zdEJpbmFyeU1lc3NhZ2UgPSBmdW5jdGlvbigpIHt9OwotCi0KLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBjbGFzcyBmb3IgYWxsIG1lc3NhZ2VzLiBEb2VzIF9fbm90X18gZGVmaW5lIGFueSBtZXRob2RzLCBhcwotICogZG9pbmcgc28gb24gYSB3aWRlbHktdXNlZCBpbnRlcmZhY2UgZGVmZWF0cyBkZWFkLWNvZGUgZWxpbWluYXRpb24uCi0gKiBAaW50ZXJmYWNlCi0gKiBAZXh0ZW5kcyB7anNwYi5Db25zdEJpbmFyeU1lc3NhZ2V9Ci0gKi8KLWpzcGIuQmluYXJ5TWVzc2FnZSA9IGZ1bmN0aW9uKCkge307Ci0KLQotLyoqCi0gKiBUaGUgdHlwZXMgY29udmVydGlibGUgdG8gVWludDhBcnJheXMuIFN0cmluZ3MgYXJlIGFzc3VtZWQgdG8gYmUKLSAqIGJhc2U2NC1lbmNvZGVkLgotICogQHR5cGVkZWYge0FycmF5QnVmZmVyfFVpbnQ4QXJyYXl8QXJyYXk8bnVtYmVyPnxzdHJpbmd9Ci0gKi8KLWpzcGIuQnl0ZVNvdXJjZTsKLQotCi0vKioKLSAqIEEgc2NhbGFyIGZpZWxkIGluIGpzcGIgY2FuIGJlIGEgYm9vbGVhbiwgbnVtYmVyLCBvciBzdHJpbmcuCi0gKiBAdHlwZWRlZiB7Ym9vbGVhbnxudW1iZXJ8c3RyaW5nfQotICovCi1qc3BiLlNjYWxhckZpZWxkVHlwZTsKLQotCi0vKioKLSAqIEEgcmVwZWF0ZWQgZmllbGQgaW4ganNwYiBpcyBhbiBhcnJheSBvZiBzY2FsYXJzLCBibG9icywgb3IgbWVzc2FnZXMuCi0gKiBAdHlwZWRlZiB7IUFycmF5PGpzcGIuU2NhbGFyRmllbGRUeXBlPnwKLSAgICAgICAgICAgICAhQXJyYXk8IVVpbnQ4QXJyYXk+fAotICAgICAgICAgICAgICFBcnJheTwhanNwYi5CaW5hcnlNZXNzYWdlPn0KLSAqLwotanNwYi5SZXBlYXRlZEZpZWxkVHlwZTsKLQotCi0vKioKLSAqIEEgZmllbGQgaW4ganNwYiBjYW4gYmUgYSBzY2FsYXIsIGEgYmxvY2sgb2YgYnl0ZXMsIGFub3RoZXIgcHJvdG8sIG9yIGFuCi0gKiBhcnJheSBvZiBhbnkgb2YgdGhlIGFib3ZlLgotICogQHR5cGVkZWYge2pzcGIuU2NhbGFyRmllbGRUeXBlfAotICAgICAgICAgICAgIGpzcGIuUmVwZWF0ZWRGaWVsZFR5cGV8Ci0gICAgICAgICAgICAgIVVpbnQ4QXJyYXl8Ci0gICAgICAgICAgICAgIWpzcGIuQmluYXJ5TWVzc2FnZXwKLSAgICAgICAgICAgICAhanNwcm90by5CaW5hcnlFeHRlbnNpb259Ci0gKi8KLWpzcGIuQW55RmllbGRUeXBlOwotCi0KLS8qKgotICogQSBidWlsZGVyIGZ1bmN0aW9uIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgYSBtZXNzYWdlIG9iamVjdC4KLSAqIEB0eXBlZGVmIHtmdW5jdGlvbigpOiFqc3BiLkJpbmFyeU1lc3NhZ2V9Ci0gKi8KLWpzcGIuQnVpbGRlckZ1bmN0aW9uOwotCi0KLS8qKgotICogQSBjbG9uZXIgZnVuY3Rpb24gY3JlYXRlcyBhIGRlZXAgY29weSBvZiBhIG1lc3NhZ2Ugb2JqZWN0LgotICogQHR5cGVkZWYge2Z1bmN0aW9uKGpzcGIuQ29uc3RCaW5hcnlNZXNzYWdlKTpqc3BiLkJpbmFyeU1lc3NhZ2V9Ci0gKi8KLWpzcGIuQ2xvbmVyRnVuY3Rpb247Ci0KLQotLyoqCi0gKiBBIHJlY3ljbGVyIGZ1bmN0aW9uIGRlc3Ryb3lzIGFuIGluc3RhbmNlIG9mIGEgbWVzc2FnZSBvYmplY3QuCi0gKiBAdHlwZWRlZiB7ZnVuY3Rpb24oIWpzcGIuQmluYXJ5TWVzc2FnZSk6dm9pZH0KLSAqLwotanNwYi5SZWN5Y2xlckZ1bmN0aW9uOwotCi0KLS8qKgotICogQSByZWFkZXIgZnVuY3Rpb24gaW5pdGlhbGl6ZXMgYSBtZXNzYWdlIHVzaW5nIGRhdGEgZnJvbSBhIEJpbmFyeVJlYWRlci4KLSAqIEB0eXBlZGVmIHtmdW5jdGlvbighanNwYi5CaW5hcnlNZXNzYWdlLCAhanNwYi5CaW5hcnlSZWFkZXIpOnZvaWR9Ci0gKi8KLWpzcGIuUmVhZGVyRnVuY3Rpb247Ci0KLQotLyoqCi0gKiBBIHdyaXRlciBmdW5jdGlvbiBzZXJpYWxpemVzIGEgbWVzc2FnZSB0byBhIEJpbmFyeVdyaXRlci4KLSAqIEB0eXBlZGVmIHshZnVuY3Rpb24oIWpzcGIuTWVzc2FnZSwgIWpzcGIuQmluYXJ5V3JpdGVyKTp2b2lkIHwKLSAqICAgICAgICAgICAhZnVuY3Rpb24oIWpzcGIuQ29uc3RCaW5hcnlNZXNzYWdlLCAhanNwYi5CaW5hcnlXcml0ZXIpOnZvaWR9Ci0gKi8KLWpzcGIuV3JpdGVyRnVuY3Rpb247Ci0KLQotLyoqCi0gKiBBIHBydW5lciBmdW5jdGlvbiByZW1vdmVzIGRlZmF1bHQtdmFsdWVkIGZpZWxkcyBhbmQgZW1wdHkgc3VibWVzc2FnZXMgZnJvbSBhCi0gKiBtZXNzYWdlIGFuZCByZXR1cm5zIGVpdGhlciB0aGUgcHJ1bmVkIG1lc3NhZ2Ugb3IgbnVsbCBpZiB0aGUgZW50aXJlIG1lc3NhZ2UKLSAqIHdhcyBwcnVuZWQgYXdheS4KLSAqIEB0eXBlZGVmIHtmdW5jdGlvbig/anNwYi5CaW5hcnlNZXNzYWdlKTo/anNwYi5CaW5hcnlNZXNzYWdlfQotICovCi1qc3BiLlBydW5lckZ1bmN0aW9uOwotCi0KLS8qKgotICogQSBjb21wYXJlciBmdW5jdGlvbiByZXR1cm5zIHRydWUgaWYgdHdvIHByb3RvcyBhcmUgZXF1YWwuCi0gKiBAdHlwZWRlZiB7IWZ1bmN0aW9uKD9qc3BiLkNvbnN0QmluYXJ5TWVzc2FnZSwKLSAqICAgICAgICAgICAgICAgICAgICAgP2pzcGIuQ29uc3RCaW5hcnlNZXNzYWdlKTpib29sZWFufQotICovCi1qc3BiLkNvbXBhcmVyRnVuY3Rpb247Ci0KLQotLyoqCi0gKiBGaWVsZCB0eXBlIGNvZGVzLCB0YWtlbiBmcm9tIHByb3RvMi9wdWJsaWMvd2lyZV9mb3JtYXRfbGl0ZS5oLgotICogQGVudW0ge251bWJlcn0KLSAqLwotanNwYi5CaW5hcnlDb25zdGFudHMuRmllbGRUeXBlID0gewotICBJTlZBTElEOiAtMSwKLSAgRE9VQkxFOiAxLAotICBGTE9BVDogMiwKLSAgSU5UNjQ6IDMsCi0gIFVJTlQ2NDogNCwKLSAgSU5UMzI6IDUsCi0gIEZJWEVENjQ6IDYsCi0gIEZJWEVEMzI6IDcsCi0gIEJPT0w6IDgsCi0gIFNUUklORzogOSwKLSAgR1JPVVA6IDEwLAotICBNRVNTQUdFOiAxMSwKLSAgQllURVM6IDEyLAotICBVSU5UMzI6IDEzLAotICBFTlVNOiAxNCwKLSAgU0ZJWEVEMzI6IDE1LAotICBTRklYRUQ2NDogMTYsCi0gIFNJTlQzMjogMTcsCi0gIFNJTlQ2NDogMTgsCi0KLSAgLy8gRXh0ZW5kZWQgdHlwZXMgZm9yIEphdmFzY3JpcHQKLQotICBGSEFTSDY0OiAzMCwgLy8gNjQtYml0IGhhc2ggc3RyaW5nLCBmaXhlZC1sZW5ndGggZW5jb2RpbmcuCi0gIFZIQVNINjQ6IDMxICAvLyA2NC1iaXQgaGFzaCBzdHJpbmcsIHZhcmludCBlbmNvZGluZy4KLX07Ci0KLQotLyoqCi0gKiBXaXJlLWZvcm1hdCB0eXBlIGNvZGVzLCB0YWtlbiBmcm9tIHByb3RvMi9wdWJsaWMvd2lyZV9mb3JtYXRfbGl0ZS5oLgotICogQGVudW0ge251bWJlcn0KLSAqLwotanNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUgPSB7Ci0gIElOVkFMSUQ6IC0xLAotICBWQVJJTlQ6IDAsCi0gIEZJWEVENjQ6IDEsCi0gIERFTElNSVRFRDogMiwKLSAgU1RBUlRfR1JPVVA6IDMsCi0gIEVORF9HUk9VUDogNCwKLSAgRklYRUQzMjogNQotfTsKLQotCi0vKioKLSAqIFRyYW5zbGF0ZXMgZmllbGQgdHlwZSB0byB3aXJlIHR5cGUuCi0gKiBAcGFyYW0ge2pzcGIuQmluYXJ5Q29uc3RhbnRzLkZpZWxkVHlwZX0gZmllbGRUeXBlCi0gKiBAcmV0dXJuIHtqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZX0KLSAqLwotanNwYi5CaW5hcnlDb25zdGFudHMuRmllbGRUeXBlVG9XaXJlVHlwZSA9IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewotICB2YXIgZmllbGRUeXBlcyA9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLkZpZWxkVHlwZTsKLSAgdmFyIHdpcmVUeXBlcyA9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlOwotICBzd2l0Y2ggKGZpZWxkVHlwZSkgewotICAgIGNhc2UgZmllbGRUeXBlcy5JTlQzMjoKLSAgICBjYXNlIGZpZWxkVHlwZXMuSU5UNjQ6Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlVJTlQzMjoKLSAgICBjYXNlIGZpZWxkVHlwZXMuVUlOVDY0OgotICAgIGNhc2UgZmllbGRUeXBlcy5TSU5UMzI6Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlNJTlQ2NDoKLSAgICBjYXNlIGZpZWxkVHlwZXMuQk9PTDoKLSAgICBjYXNlIGZpZWxkVHlwZXMuRU5VTToKLSAgICBjYXNlIGZpZWxkVHlwZXMuVkhBU0g2NDoKLSAgICAgIHJldHVybiB3aXJlVHlwZXMuVkFSSU5UOwotCi0gICAgY2FzZSBmaWVsZFR5cGVzLkRPVUJMRToKLSAgICBjYXNlIGZpZWxkVHlwZXMuRklYRUQ2NDoKLSAgICBjYXNlIGZpZWxkVHlwZXMuU0ZJWEVENjQ6Ci0gICAgY2FzZSBmaWVsZFR5cGVzLkZIQVNINjQ6Ci0gICAgICByZXR1cm4gd2lyZVR5cGVzLkZJWEVENjQ7Ci0KLSAgICBjYXNlIGZpZWxkVHlwZXMuU1RSSU5HOgotICAgIGNhc2UgZmllbGRUeXBlcy5NRVNTQUdFOgotICAgIGNhc2UgZmllbGRUeXBlcy5CWVRFUzoKLSAgICAgIHJldHVybiB3aXJlVHlwZXMuREVMSU1JVEVEOwotCi0gICAgY2FzZSBmaWVsZFR5cGVzLkZMT0FUOgotICAgIGNhc2UgZmllbGRUeXBlcy5GSVhFRDMyOgotICAgIGNhc2UgZmllbGRUeXBlcy5TRklYRUQzMjoKLSAgICAgIHJldHVybiB3aXJlVHlwZXMuRklYRUQzMjsKLQotICAgIGNhc2UgZmllbGRUeXBlcy5JTlZBTElEOgotICAgIGNhc2UgZmllbGRUeXBlcy5HUk9VUDoKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHdpcmVUeXBlcy5JTlZBTElEOwotICB9Ci19OwotCi0KLS8qKgotICogRmxhZyB0byBpbmRpY2F0ZSBhIG1pc3NpbmcgZmllbGQuCi0gKiBAY29uc3Qge251bWJlcn0KLSAqLwotanNwYi5CaW5hcnlDb25zdGFudHMuSU5WQUxJRF9GSUVMRF9OVU1CRVIgPSAtMTsKLQotCi0vKioKLSAqIFRoZSBzbWFsbGVzdCBkZW5vcm1hbCBmbG9hdDMyIHZhbHVlLgotICogQGNvbnN0IHtudW1iZXJ9Ci0gKi8KLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfRVBTID0gMS40MDEyOTg0NjQzMjQ4MTdlLTQ1OwotCi0KLS8qKgotICogVGhlIHNtYWxsZXN0IG5vcm1hbCBmbG9hdDY0IHZhbHVlLgotICogQGNvbnN0IHtudW1iZXJ9Ci0gKi8KLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfTUlOID0gMS4xNzU0OTQzNTA4MjIyODc1ZS0zODsKLQotCi0vKioKLSAqIFRoZSBsYXJnZXN0IGZpbml0ZSBmbG9hdDMyIHZhbHVlLgotICogQGNvbnN0IHtudW1iZXJ9Ci0gKi8KLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfTUFYID0gMy40MDI4MjM0NjYzODUyODg2ZSszODsKLQotCi0vKioKLSAqIFRoZSBzbWFsbGVzdCBkZW5vcm1hbCBmbG9hdDY0IHZhbHVlLgotICogQGNvbnN0IHtudW1iZXJ9Ci0gKi8KLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfRVBTID0gNWUtMzI0OwotCi0KLS8qKgotICogVGhlIHNtYWxsZXN0IG5vcm1hbCBmbG9hdDY0IHZhbHVlLgotICogQGNvbnN0IHtudW1iZXJ9Ci0gKi8KLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUlOID0gMi4yMjUwNzM4NTg1MDcyMDE0ZS0zMDg7Ci0KLQotLyoqCi0gKiBUaGUgbGFyZ2VzdCBmaW5pdGUgZmxvYXQ2NCB2YWx1ZS4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDY0X01BWCA9IDEuNzk3NjkzMTM0ODYyMzE1N2UrMzA4OwotCi0KLS8qKgotICogQ29udmVuaWVuY2UgY29uc3RhbnQgZXF1YWwgdG8gMl4yMC4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMjAgPSAxMDQ4NTc2OwotCi0KLS8qKgotICogQ29udmVuaWVuY2UgY29uc3RhbnQgZXF1YWwgdG8gMl4yMy4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMjMgPSA4Mzg4NjA4OwotCi0KLS8qKgotICogQ29udmVuaWVuY2UgY29uc3RhbnQgZXF1YWwgdG8gMl4zMS4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEgPSAyMTQ3NDgzNjQ4OwotCi0KLS8qKgotICogQ29udmVuaWVuY2UgY29uc3RhbnQgZXF1YWwgdG8gMl4zMi4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIgPSA0Mjk0OTY3Mjk2OwotCi0KLS8qKgotICogQ29udmVuaWVuY2UgY29uc3RhbnQgZXF1YWwgdG8gMl41Mi4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNTIgPSA0NTAzNTk5NjI3MzcwNDk2OwotCi0KLS8qKgotICogQ29udmVuaWVuY2UgY29uc3RhbnQgZXF1YWwgdG8gMl42My4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMgPSA5MjIzMzcyMDM2ODU0Nzc1ODA4OwotCi0KLS8qKgotICogQ29udmVuaWVuY2UgY29uc3RhbnQgZXF1YWwgdG8gMl42NC4KLSAqIEBjb25zdCB7bnVtYmVyfQotICovCi1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjQgPSAxODQ0Njc0NDA3MzcwOTU1MTYxNjsKLQotCi0vKioKLSAqIEVpZ2h0LWNoYXJhY3RlciBzdHJpbmcgb2YgemVyb3MsIHVzZWQgYXMgdGhlIGRlZmF1bHQgNjQtYml0IGhhc2ggdmFsdWUuCi0gKiBAY29uc3Qge3N0cmluZ30KLSAqLwotanNwYi5CaW5hcnlDb25zdGFudHMuWkVST19IQVNIID0gJ1wwXDBcMFwwXDBcMFwwXDAnOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvYmluYXJ5L2RlY29kZXIuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvZGVjb2Rlci5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDEwOTRhMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvZGVjb2Rlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDEwMDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8qKgotICogQGZpbGVvdmVydmlldyBUaGlzIGZpbGUgY29udGFpbnMgdXRpbGl0aWVzIGZvciBkZWNvZGluZyBwcmltaXRpdmUgdmFsdWVzCi0gKiAoc2lnbmVkIGFuZCB1bnNpZ25lZCBpbnRlZ2VycywgdmFyaW50cywgYm9vbGVhbnMsIGVudW1zLCBoYXNoZXMsIHN0cmluZ3MsCi0gKiBhbmQgcmF3IGJ5dGVzKSBlbWJlZGRlZCBpbiBVaW50OEFycmF5cyBpbnRvIHRoZWlyIGNvcnJlc3BvbmRpbmcgSmF2YXNjcmlwdAotICogdHlwZXMuCi0gKgotICogTWFqb3IgY2F2ZWF0IC0gSmF2YXNjcmlwdCBpcyB1bmFibGUgdG8gYWNjdXJhdGVseSByZXByZXNlbnQgaW50ZWdlcnMgbGFyZ2VyCi0gKiB0aGFuIDJeNTMgZHVlIHRvIGl0cyB1c2Ugb2YgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGZvcm1hdCBvciBhbGwKLSAqIG51bWJlcnMuIElmIHlvdSBuZWVkIHRvIGd1YXJhbnRlZSB0aGF0IDY0LWJpdCB2YWx1ZXMgc3Vydml2ZSB3aXRoIGFsbCBiaXRzCi0gKiBpbnRhY3QsIHlvdSBfbXVzdF8gcmVhZCB0aGVtIHVzaW5nIG9uZSBvZiB0aGUgSGFzaDY0IG1ldGhvZHMsIHdoaWNoIHJldHVybgotICogYW4gOC1jaGFyYWN0ZXIgc3RyaW5nLgotICoKLSAqIEBhdXRob3IgYWFwcGxlYnlAZ29vZ2xlLmNvbSAoQXVzdGluIEFwcGxlYnkpCi0gKi8KLQotZ29vZy5wcm92aWRlKCdqc3BiLkJpbmFyeURlY29kZXInKTsKLWdvb2cucHJvdmlkZSgnanNwYi5CaW5hcnlJdGVyYXRvcicpOwotCi1nb29nLnJlcXVpcmUoJ2dvb2cuYXNzZXJ0cycpOwotZ29vZy5yZXF1aXJlKCdqc3BiLnV0aWxzJyk7Ci0KLQotCi0vKioKLSAqIFNpbXBsZSBoZWxwZXIgY2xhc3MgZm9yIHRyYXZlcnNpbmcgdGhlIGNvbnRlbnRzIG9mIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMuCi0gKiB0aGF0IG1heSBvciBtYXkgbm90IGhhdmUgYmVlbiBwYWNrZWQgaW50byBhIHdpcmUtZm9ybWF0IGJsb2IuCi0gKiBAcGFyYW0gez9qc3BiLkJpbmFyeURlY29kZXI9fSBvcHRfZGVjb2RlcgotICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpqc3BiLkJpbmFyeURlY29kZXIpOihudW1iZXJ8Ym9vbGVhbnxzdHJpbmcpPX0KLSAqICAgICBvcHRfbmV4dCBUaGUgZGVjb2RlciBtZXRob2QgdG8gdXNlIGZvciBuZXh0KCkuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyfGJvb2xlYW58c3RyaW5nPj19IG9wdF9lbGVtZW50cwotICogQGNvbnN0cnVjdG9yCi0gKiBAc3RydWN0Ci0gKi8KLWpzcGIuQmluYXJ5SXRlcmF0b3IgPSBmdW5jdGlvbihvcHRfZGVjb2Rlciwgb3B0X25leHQsIG9wdF9lbGVtZW50cykgewotICAvKiogQHByaXZhdGUge2pzcGIuQmluYXJ5RGVjb2Rlcn0gKi8KLSAgdGhpcy5kZWNvZGVyXyA9IG51bGw7Ci0KLSAgLyoqCi0gICAqIFRoZSBCaW5hcnlEZWNvZGVyIG1lbWJlciBmdW5jdGlvbiB1c2VkIHdoZW4gaXRlcmF0aW5nIG92ZXIgcGFja2VkIGRhdGEuCi0gICAqIEBwcml2YXRlIHs/ZnVuY3Rpb24odGhpczpqc3BiLkJpbmFyeURlY29kZXIpOihudW1iZXJ8Ym9vbGVhbnxzdHJpbmcpfQotICAgKi8KLSAgdGhpcy5uZXh0TWV0aG9kXyA9IG51bGw7Ci0KLSAgLyoqIEBwcml2YXRlIHtBcnJheS48bnVtYmVyPn0gKi8KLSAgdGhpcy5lbGVtZW50c18gPSBudWxsOwotCi0gIC8qKiBAcHJpdmF0ZSB7bnVtYmVyfSAqLwotICB0aGlzLmN1cnNvcl8gPSAwOwotCi0gIC8qKiBAcHJpdmF0ZSB7bnVtYmVyfGJvb2xlYW58c3RyaW5nfG51bGx9ICovCi0gIHRoaXMubmV4dFZhbHVlXyA9IG51bGw7Ci0KLSAgLyoqIEBwcml2YXRlIHtib29sZWFufSAqLwotICB0aGlzLmF0RW5kXyA9IHRydWU7Ci0KLSAgdGhpcy5pbml0XyhvcHRfZGVjb2Rlciwgb3B0X25leHQsIG9wdF9lbGVtZW50cyk7Ci19OwotCi0KLS8qKgotICogQHBhcmFtIHs/anNwYi5CaW5hcnlEZWNvZGVyPX0gb3B0X2RlY29kZXIKLSAqIEBwYXJhbSB7P2Z1bmN0aW9uKHRoaXM6anNwYi5CaW5hcnlEZWNvZGVyKToobnVtYmVyfGJvb2xlYW58c3RyaW5nKT19Ci0gKiAgICAgb3B0X25leHQgVGhlIGRlY29kZXIgbWV0aG9kIHRvIHVzZSBmb3IgbmV4dCgpLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcnxib29sZWFufHN0cmluZz49fSBvcHRfZWxlbWVudHMKLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5SXRlcmF0b3IucHJvdG90eXBlLmluaXRfID0KLSAgICBmdW5jdGlvbihvcHRfZGVjb2Rlciwgb3B0X25leHQsIG9wdF9lbGVtZW50cykgewotICBpZiAob3B0X2RlY29kZXIgJiYgb3B0X25leHQpIHsKLSAgICB0aGlzLmRlY29kZXJfID0gb3B0X2RlY29kZXI7Ci0gICAgdGhpcy5uZXh0TWV0aG9kXyA9IG9wdF9uZXh0OwotICB9Ci0gIHRoaXMuZWxlbWVudHNfID0gb3B0X2VsZW1lbnRzID8gb3B0X2VsZW1lbnRzIDogbnVsbDsKLSAgdGhpcy5jdXJzb3JfID0gMDsKLSAgdGhpcy5uZXh0VmFsdWVfID0gbnVsbDsKLSAgdGhpcy5hdEVuZF8gPSAhdGhpcy5kZWNvZGVyXyAmJiAhdGhpcy5lbGVtZW50c187Ci0KLSAgdGhpcy5uZXh0KCk7Ci19OwotCi0KLS8qKgotICogR2xvYmFsIHBvb2wgb2YgQmluYXJ5SXRlcmF0b3IgaW5zdGFuY2VzLgotICogQHByaXZhdGUgeyFBcnJheS48IWpzcGIuQmluYXJ5SXRlcmF0b3I+fQotICovCi1qc3BiLkJpbmFyeUl0ZXJhdG9yLmluc3RhbmNlQ2FjaGVfID0gW107Ci0KLQotLyoqCi0gKiBBbGxvY2F0ZXMgYSBCaW5hcnlJdGVyYXRvciBmcm9tIHRoZSBjYWNoZSwgY3JlYXRpbmcgYSBuZXcgb25lIGlmIHRoZSBjYWNoZQotICogaXMgZW1wdHkuCi0gKiBAcGFyYW0gez9qc3BiLkJpbmFyeURlY29kZXI9fSBvcHRfZGVjb2RlcgotICogQHBhcmFtIHs/ZnVuY3Rpb24odGhpczpqc3BiLkJpbmFyeURlY29kZXIpOihudW1iZXJ8Ym9vbGVhbnxzdHJpbmcpPX0KLSAqICAgICBvcHRfbmV4dCBUaGUgZGVjb2RlciBtZXRob2QgdG8gdXNlIGZvciBuZXh0KCkuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyfGJvb2xlYW58c3RyaW5nPj19IG9wdF9lbGVtZW50cwotICogQHJldHVybiB7IWpzcGIuQmluYXJ5SXRlcmF0b3J9Ci0gKi8KLWpzcGIuQmluYXJ5SXRlcmF0b3IuYWxsb2MgPSBmdW5jdGlvbihvcHRfZGVjb2Rlciwgb3B0X25leHQsIG9wdF9lbGVtZW50cykgewotICBpZiAoanNwYi5CaW5hcnlJdGVyYXRvci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgpIHsKLSAgICB2YXIgaXRlcmF0b3IgPSBqc3BiLkJpbmFyeUl0ZXJhdG9yLmluc3RhbmNlQ2FjaGVfLnBvcCgpOwotICAgIGl0ZXJhdG9yLmluaXRfKG9wdF9kZWNvZGVyLCBvcHRfbmV4dCwgb3B0X2VsZW1lbnRzKTsKLSAgICByZXR1cm4gaXRlcmF0b3I7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5ldyBqc3BiLkJpbmFyeUl0ZXJhdG9yKG9wdF9kZWNvZGVyLCBvcHRfbmV4dCwgb3B0X2VsZW1lbnRzKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFB1dHMgdGhpcyBpbnN0YW5jZSBiYWNrIGluIHRoZSBpbnN0YW5jZSBjYWNoZS4KLSAqLwotanNwYi5CaW5hcnlJdGVyYXRvci5wcm90b3R5cGUuZnJlZSA9IGZ1bmN0aW9uKCkgewotICB0aGlzLmNsZWFyKCk7Ci0gIGlmIChqc3BiLkJpbmFyeUl0ZXJhdG9yLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCA8IDEwMCkgewotICAgIGpzcGIuQmluYXJ5SXRlcmF0b3IuaW5zdGFuY2VDYWNoZV8ucHVzaCh0aGlzKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIENsZWFycyB0aGUgaXRlcmF0b3IuCi0gKi8KLWpzcGIuQmluYXJ5SXRlcmF0b3IucHJvdG90eXBlLmNsZWFyID0gZnVuY3Rpb24oKSB7Ci0gIGlmICh0aGlzLmRlY29kZXJfKSB7Ci0gICAgdGhpcy5kZWNvZGVyXy5mcmVlKCk7Ci0gIH0KLSAgdGhpcy5kZWNvZGVyXyA9IG51bGw7Ci0gIHRoaXMubmV4dE1ldGhvZF8gPSBudWxsOwotICB0aGlzLmVsZW1lbnRzXyA9IG51bGw7Ci0gIHRoaXMuY3Vyc29yXyA9IDA7Ci0gIHRoaXMubmV4dFZhbHVlXyA9IG51bGw7Ci0gIHRoaXMuYXRFbmRfID0gdHJ1ZTsKLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBpdGVyYXRvciwgb3IgbnVsbCBpZiB0aGUgaXRlcmF0b3IgaXMgaW52YWxpZCBvcgotICogcGFzdCB0aGUgZW5kIG9mIHRoZSBkZWNvZGVyL2FycmF5LgotICogQHJldHVybiB7bnVtYmVyfGJvb2xlYW58c3RyaW5nfG51bGx9Ci0gKi8KLWpzcGIuQmluYXJ5SXRlcmF0b3IucHJvdG90eXBlLmdldCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5uZXh0VmFsdWVfOwotfTsKLQotCi0vKioKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgaXRlcmF0b3IgaXMgYXQgdGhlIGVuZCBvZiB0aGUgZGVjb2Rlci9hcnJheS4KLSAqIEByZXR1cm4ge2Jvb2xlYW59Ci0gKi8KLWpzcGIuQmluYXJ5SXRlcmF0b3IucHJvdG90eXBlLmF0RW5kID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLmF0RW5kXzsKLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBpdGVyYXRvciBhbmQgc3RlcHMgdG8gdGhlIG5leHQgZWxlbWVudCwKLSAqIGVxdWl2YWxlbnQgdG8gJypwb2ludGVyKysnIGluIEMuCi0gKiBAcmV0dXJuIHtudW1iZXJ8Ym9vbGVhbnxzdHJpbmd8bnVsbH0KLSAqLwotanNwYi5CaW5hcnlJdGVyYXRvci5wcm90b3R5cGUubmV4dCA9IGZ1bmN0aW9uKCkgewotICB2YXIgbGFzdFZhbHVlID0gdGhpcy5uZXh0VmFsdWVfOwotICBpZiAodGhpcy5kZWNvZGVyXykgewotICAgIGlmICh0aGlzLmRlY29kZXJfLmF0RW5kKCkpIHsKLSAgICAgIHRoaXMubmV4dFZhbHVlXyA9IG51bGw7Ci0gICAgICB0aGlzLmF0RW5kXyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMubmV4dFZhbHVlXyA9IHRoaXMubmV4dE1ldGhvZF8uY2FsbCh0aGlzLmRlY29kZXJfKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodGhpcy5lbGVtZW50c18pIHsKLSAgICBpZiAodGhpcy5jdXJzb3JfID09IHRoaXMuZWxlbWVudHNfLmxlbmd0aCkgewotICAgICAgdGhpcy5uZXh0VmFsdWVfID0gbnVsbDsKLSAgICAgIHRoaXMuYXRFbmRfID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgdGhpcy5uZXh0VmFsdWVfID0gdGhpcy5lbGVtZW50c19bdGhpcy5jdXJzb3JfKytdOwotICAgIH0KLSAgfQotICByZXR1cm4gbGFzdFZhbHVlOwotfTsKLQotCi0KLS8qKgotICogQmluYXJ5RGVjb2RlciBpbXBsZW1lbnRzIHRoZSBkZWNvZGVycyBmb3IgYWxsIHRoZSB3aXJlIHR5cGVzIHNwZWNpZmllZCBpbgotICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nLgotICoKLSAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlPX0gb3B0X2J5dGVzIFRoZSBieXRlcyB3ZSdyZSByZWFkaW5nIGZyb20uCi0gKiBAcGFyYW0ge251bWJlcj19IG9wdF9zdGFydCBUaGUgb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcgYXQuCi0gKiBAcGFyYW0ge251bWJlcj19IG9wdF9sZW5ndGggVGhlIG9wdGlvbmFsIGxlbmd0aCBvZiB0aGUgYmxvY2sgdG8gcmVhZCAtCi0gKiAgICAgd2UnbGwgdGhyb3cgYW4gYXNzZXJ0aW9uIGlmIHdlIGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jay4KLSAqIEBjb25zdHJ1Y3RvcgotICogQHN0cnVjdAotICovCi1qc3BiLkJpbmFyeURlY29kZXIgPSBmdW5jdGlvbihvcHRfYnl0ZXMsIG9wdF9zdGFydCwgb3B0X2xlbmd0aCkgewotICAvKioKLSAgICogVHlwZWQgYnl0ZS13aXNlIHZpZXcgb2YgdGhlIHNvdXJjZSBidWZmZXIuCi0gICAqIEBwcml2YXRlIHs/VWludDhBcnJheX0KLSAgICovCi0gIHRoaXMuYnl0ZXNfID0gbnVsbDsKLQotICAvKioKLSAgICogU3RhcnQgcG9pbnQgb2YgdGhlIGJsb2NrIHRvIHJlYWQuCi0gICAqIEBwcml2YXRlIHtudW1iZXJ9Ci0gICAqLwotICB0aGlzLnN0YXJ0XyA9IDA7Ci0KLSAgLyoqCi0gICAqIEVuZCBwb2ludCBvZiB0aGUgYmxvY2sgdG8gcmVhZC4KLSAgICogQHByaXZhdGUge251bWJlcn0KLSAgICovCi0gIHRoaXMuZW5kXyA9IDA7Ci0KLSAgLyoqCi0gICAqIEN1cnJlbnQgcmVhZCBsb2NhdGlvbiBpbiBieXRlc18uCi0gICAqIEBwcml2YXRlIHtudW1iZXJ9Ci0gICAqLwotICB0aGlzLmN1cnNvcl8gPSAwOwotCi0gIC8qKgotICAgKiBUZW1wb3Jhcnkgc3RvcmFnZSBmb3IgdGhlIGxvdyAzMiBiaXRzIG9mIDY0LWJpdCBkYXRhIHR5cGVzIHRoYXQgd2UncmUKLSAgICogZGVjb2RpbmcuCi0gICAqIEBwcml2YXRlIHtudW1iZXJ9Ci0gICAqLwotICB0aGlzLnRlbXBMb3dfID0gMDsKLQotICAvKioKLSAgICogVGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIHRoZSBoaWdoIDMyIGJpdHMgb2YgNjQtYml0IGRhdGEgdHlwZXMgdGhhdCB3ZSdyZQotICAgKiBkZWNvZGluZy4KLSAgICogQHByaXZhdGUge251bWJlcn0KLSAgICovCi0gIHRoaXMudGVtcEhpZ2hfID0gMDsKLQotICAvKioKLSAgICogU2V0IHRvIHRydWUgaWYgdGhpcyBkZWNvZGVyIGVuY291bnRlcmVkIGFuIGVycm9yIGR1ZSB0byBjb3JydXB0IGRhdGEuCi0gICAqIEBwcml2YXRlIHtib29sZWFufQotICAgKi8KLSAgdGhpcy5lcnJvcl8gPSBmYWxzZTsKLQotICBpZiAob3B0X2J5dGVzKSB7Ci0gICAgdGhpcy5zZXRCbG9jayhvcHRfYnl0ZXMsIG9wdF9zdGFydCwgb3B0X2xlbmd0aCk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBHbG9iYWwgcG9vbCBvZiBCaW5hcnlEZWNvZGVyIGluc3RhbmNlcy4KLSAqIEBwcml2YXRlIHshQXJyYXkuPCFqc3BiLkJpbmFyeURlY29kZXI+fQotICovCi1qc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV8gPSBbXTsKLQotCi0vKioKLSAqIFBvcHMgYW4gaW5zdGFuY2Ugb2ZmIHRoZSBpbnN0YW5jZSBjYWNoZSwgb3IgY3JlYXRlcyBvbmUgaWYgdGhlIGNhY2hlIGlzCi0gKiBlbXB0eS4KLSAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlPX0gb3B0X2J5dGVzIFRoZSBieXRlcyB3ZSdyZSByZWFkaW5nIGZyb20uCi0gKiBAcGFyYW0ge251bWJlcj19IG9wdF9zdGFydCBUaGUgb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcgYXQuCi0gKiBAcGFyYW0ge251bWJlcj19IG9wdF9sZW5ndGggVGhlIG9wdGlvbmFsIGxlbmd0aCBvZiB0aGUgYmxvY2sgdG8gcmVhZCAtCi0gKiAgICAgd2UnbGwgdGhyb3cgYW4gYXNzZXJ0aW9uIGlmIHdlIGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jay4KLSAqIEByZXR1cm4geyFqc3BiLkJpbmFyeURlY29kZXJ9Ci0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYyA9IGZ1bmN0aW9uKG9wdF9ieXRlcywgb3B0X3N0YXJ0LCBvcHRfbGVuZ3RoKSB7Ci0gIGlmIChqc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV8ubGVuZ3RoKSB7Ci0gICAgdmFyIG5ld0RlY29kZXIgPSBqc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV8ucG9wKCk7Ci0gICAgaWYgKG9wdF9ieXRlcykgewotICAgICAgbmV3RGVjb2Rlci5zZXRCbG9jayhvcHRfYnl0ZXMsIG9wdF9zdGFydCwgb3B0X2xlbmd0aCk7Ci0gICAgfQotICAgIHJldHVybiBuZXdEZWNvZGVyOwotICB9IGVsc2UgewotICAgIHJldHVybiBuZXcganNwYi5CaW5hcnlEZWNvZGVyKG9wdF9ieXRlcywgb3B0X3N0YXJ0LCBvcHRfbGVuZ3RoKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFB1dHMgdGhpcyBpbnN0YW5jZSBiYWNrIGluIHRoZSBpbnN0YW5jZSBjYWNoZS4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5mcmVlID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMuY2xlYXIoKTsKLSAgaWYgKGpzcGIuQmluYXJ5RGVjb2Rlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGggPCAxMDApIHsKLSAgICBqc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV8ucHVzaCh0aGlzKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIE1ha2VzIGEgY29weSBvZiB0aGlzIGRlY29kZXIuCi0gKiBAcmV0dXJuIHshanNwYi5CaW5hcnlEZWNvZGVyfQotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLmNsb25lID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiBqc3BiLkJpbmFyeURlY29kZXIuYWxsb2ModGhpcy5ieXRlc18sCi0gICAgICB0aGlzLnN0YXJ0XywgdGhpcy5lbmRfIC0gdGhpcy5zdGFydF8pOwotfTsKLQotCi0vKioKLSAqIENsZWFycyB0aGUgZGVjb2Rlci4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5jbGVhciA9IGZ1bmN0aW9uKCkgewotICB0aGlzLmJ5dGVzXyA9IG51bGw7Ci0gIHRoaXMuc3RhcnRfID0gMDsKLSAgdGhpcy5lbmRfID0gMDsKLSAgdGhpcy5jdXJzb3JfID0gMDsKLSAgdGhpcy5lcnJvcl8gPSBmYWxzZTsKLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSByYXcgYnVmZmVyLgotICogQHJldHVybiB7P1VpbnQ4QXJyYXl9IFRoZSByYXcgYnVmZmVyLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLmdldEJ1ZmZlciA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5ieXRlc187Ci19OwotCi0KLS8qKgotICogQ2hhbmdlcyB0aGUgYmxvY2sgb2YgYnl0ZXMgd2UncmUgZGVjb2RpbmcuCi0gKiBAcGFyYW0geyFqc3BiLkJ5dGVTb3VyY2V9IGRhdGEgVGhlIGJ5dGVzIHdlJ3JlIHJlYWRpbmcgZnJvbS4KLSAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X3N0YXJ0IFRoZSBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyBhdC4KLSAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2xlbmd0aCBUaGUgb3B0aW9uYWwgbGVuZ3RoIG9mIHRoZSBibG9jayB0byByZWFkIC0KLSAqICAgICB3ZSdsbCB0aHJvdyBhbiBhc3NlcnRpb24gaWYgd2UgZ28gb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnNldEJsb2NrID0KLSAgICBmdW5jdGlvbihkYXRhLCBvcHRfc3RhcnQsIG9wdF9sZW5ndGgpIHsKLSAgdGhpcy5ieXRlc18gPSBqc3BiLnV0aWxzLmJ5dGVTb3VyY2VUb1VpbnQ4QXJyYXkoZGF0YSk7Ci0gIHRoaXMuc3RhcnRfID0gZ29vZy5pc0RlZihvcHRfc3RhcnQpID8gb3B0X3N0YXJ0IDogMDsKLSAgdGhpcy5lbmRfID0KLSAgICAgIGdvb2cuaXNEZWYob3B0X2xlbmd0aCkgPyB0aGlzLnN0YXJ0XyArIG9wdF9sZW5ndGggOiB0aGlzLmJ5dGVzXy5sZW5ndGg7Ci0gIHRoaXMuY3Vyc29yXyA9IHRoaXMuc3RhcnRfOwotfTsKLQotCi0vKioKLSAqIEByZXR1cm4ge251bWJlcn0KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5nZXRFbmQgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMuZW5kXzsKLX07Ci0KLQotLyoqCi0gKiBAcGFyYW0ge251bWJlcn0gZW5kCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUuc2V0RW5kID0gZnVuY3Rpb24oZW5kKSB7Ci0gIHRoaXMuZW5kXyA9IGVuZDsKLX07Ci0KLQotLyoqCi0gKiBNb3ZlcyB0aGUgcmVhZCBjdXJzb3IgYmFjayB0byB0aGUgc3RhcnQgb2YgdGhlIGJsb2NrLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMuY3Vyc29yXyA9IHRoaXMuc3RhcnRfOwotfTsKLQotCi0vKioKLSAqIFJldHVybnMgdGhlIGludGVybmFsIHJlYWQgY3Vyc29yLgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJuYWwgcmVhZCBjdXJzb3IuCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUuZ2V0Q3Vyc29yID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLmN1cnNvcl87Ci19OwotCi0KLS8qKgotICogUmV0dXJucyB0aGUgaW50ZXJuYWwgcmVhZCBjdXJzb3IuCi0gKiBAcGFyYW0ge251bWJlcn0gY3Vyc29yIFRoZSBuZXcgY3Vyc29yLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnNldEN1cnNvciA9IGZ1bmN0aW9uKGN1cnNvcikgewotICB0aGlzLmN1cnNvcl8gPSBjdXJzb3I7Ci19OwotCi0KLS8qKgotICogQWR2YW5jZXMgdGhlIHN0cmVhbSBjdXJzb3IgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkdmFuY2UgYnkuCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUuYWR2YW5jZSA9IGZ1bmN0aW9uKGNvdW50KSB7Ci0gIHRoaXMuY3Vyc29yXyArPSBjb3VudDsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl8gPD0gdGhpcy5lbmRfKTsKLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkZWNvZGVyIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLgotICogQHJldHVybiB7Ym9vbGVhbn0KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5hdEVuZCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5jdXJzb3JfID09IHRoaXMuZW5kXzsKLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBkZWNvZGVyIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLgotICogQHJldHVybiB7Ym9vbGVhbn0KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5wYXN0RW5kID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLmN1cnNvcl8gPiB0aGlzLmVuZF87Ci19OwotCi0KLS8qKgotICogUmV0dXJucyB0cnVlIGlmIHRoaXMgZGVjb2RlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdWUgdG8gY29ycnVwdCBkYXRhLgotICogQHJldHVybiB7Ym9vbGVhbn0KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5nZXRFcnJvciA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5lcnJvcl8gfHwKLSAgICAgICAgICh0aGlzLmN1cnNvcl8gPCAwKSB8fAotICAgICAgICAgKHRoaXMuY3Vyc29yXyA+IHRoaXMuZW5kXyk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYW4gdW5zaWduZWQgdmFyaW50IGZyb20gdGhlIGJpbmFyeSBzdHJlYW0gYW5kIHN0b3JlcyBpdCBhcyBhIHNwbGl0Ci0gKiA2NC1iaXQgaW50ZWdlci4gU2luY2UgdGhpcyBkb2VzIG5vdCBjb252ZXJ0IHRoZSB2YWx1ZSB0byBhIG51bWJlciwgbm8KLSAqIHByZWNpc2lvbiBpcyBsb3N0LgotICoKLSAqIEl0J3MgcG9zc2libGUgZm9yIGFuIHVuc2lnbmVkIHZhcmludCB0byBiZSBpbmNvcnJlY3RseSBlbmNvZGVkIC0gbW9yZSB0aGFuCi0gKiA2NCBiaXRzJyB3b3J0aCBvZiBkYXRhIGNvdWxkIGJlIHByZXNlbnQuIElmIHRoaXMgaGFwcGVucywgdGhpcyBtZXRob2Qgd2lsbAotICogdGhyb3cgYW4gZXJyb3IuCi0gKgotICogRGVjb2RpbmcgdmFyaW50cyByZXF1aXJlcyBkb2luZyBzb21lIGZ1bm55IGJhc2UtMTI4IG1hdGggLSBmb3IgbW9yZQotICogZGV0YWlscyBvbiB0aGUgZm9ybWF0LCBzZWUKLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZwotICoKLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFNwbGl0VmFyaW50NjRfID0gZnVuY3Rpb24oKSB7Ci0gIHZhciB0ZW1wOwotICB2YXIgbG93Qml0cyA9IDA7Ci0gIHZhciBoaWdoQml0cyA9IDA7Ci0KLSAgLy8gUmVhZCB0aGUgZmlyc3QgZm91ciBieXRlcyBvZiB0aGUgdmFyaW50LCBzdG9wcGluZyBhdCB0aGUgdGVybWluYXRvciBpZiB3ZQotICAvLyBzZWUgaXQuCi0gIGZvciAodmFyIGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgdGVtcCA9IHRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXTsKLSAgICBsb3dCaXRzIHw9ICh0ZW1wICYgMHg3RikgPDwgKGkgKiA3KTsKLSAgICBpZiAodGVtcCA8IDEyOCkgewotICAgICAgdGhpcy50ZW1wTG93XyA9IGxvd0JpdHMgPj4+IDA7Ci0gICAgICB0aGlzLnRlbXBIaWdoXyA9IDA7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVhZCB0aGUgZmlmdGggYnl0ZSwgd2hpY2ggc3RyYWRkbGVzIHRoZSBsb3cgYW5kIGhpZ2ggZHdvcmRzLgotICB0ZW1wID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKytdOwotICBsb3dCaXRzIHw9ICh0ZW1wICYgMHg3RikgPDwgMjg7Ci0gIGhpZ2hCaXRzIHw9ICh0ZW1wICYgMHg3RikgPj4gNDsKLSAgaWYgKHRlbXAgPCAxMjgpIHsKLSAgICB0aGlzLnRlbXBMb3dfID0gbG93Qml0cyA+Pj4gMDsKLSAgICB0aGlzLnRlbXBIaWdoXyA9IGhpZ2hCaXRzID4+PiAwOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFJlYWQgdGhlIHNpeHRoIHRocm91Z2ggdGVudGggYnl0ZS4KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICB0ZW1wID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfKytdOwotICAgIGhpZ2hCaXRzIHw9ICh0ZW1wICYgMHg3RikgPDwgKGkgKiA3ICsgMyk7Ci0gICAgaWYgKHRlbXAgPCAxMjgpIHsKLSAgICAgIHRoaXMudGVtcExvd18gPSBsb3dCaXRzID4+PiAwOwotICAgICAgdGhpcy50ZW1wSGlnaF8gPSBoaWdoQml0cyA+Pj4gMDsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiB3ZSBkaWQgbm90IHNlZSB0aGUgdGVybWluYXRvciwgdGhlIGVuY29kaW5nIHdhcyBpbnZhbGlkLgotICBnb29nLmFzc2VydHMuZmFpbCgnRmFpbGVkIHRvIHJlYWQgdmFyaW50LCBlbmNvZGluZyBpcyBpbnZhbGlkLicpOwotICB0aGlzLmVycm9yXyA9IHRydWU7Ci19OwotCi0KLS8qKgotICogU2tpcHMgb3ZlciBhIHZhcmludCBpbiB0aGUgYmxvY2sgd2l0aG91dCBkZWNvZGluZyBpdC4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5za2lwVmFyaW50ID0gZnVuY3Rpb24oKSB7Ci0gIHdoaWxlICh0aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl9dICYgMHg4MCkgewotICAgIHRoaXMuY3Vyc29yXysrOwotICB9Ci0gIHRoaXMuY3Vyc29yXysrOwotfTsKLQotCi0vKioKLSAqIFNraXBzIGJhY2t3YXJkcyBvdmVyIGEgdmFyaW50IGluIHRoZSBibG9jayAtIHRvIGRvIHRoaXMgY29ycmVjdGx5LCB3ZSBoYXZlCi0gKiB0byBrbm93IHRoZSB2YWx1ZSB3ZSdyZSBza2lwcGluZyBiYWNrd2FyZHMgb3ZlciBvciB0aGluZ3MgYXJlIGFtYmlndW91cy4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdmFyaW50IHZhbHVlIHRvIHVuc2tpcC4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS51bnNraXBWYXJpbnQgPSBmdW5jdGlvbih2YWx1ZSkgewotICB3aGlsZSAodmFsdWUgPiAxMjgpIHsKLSAgICB0aGlzLmN1cnNvcl8tLTsKLSAgICB2YWx1ZSA9IHZhbHVlID4+PiA3OwotICB9Ci0gIHRoaXMuY3Vyc29yXy0tOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgMzItYml0IHZhcmludCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLiBEdWUgdG8gYSBxdWlyayBvZiB0aGUgZW5jb2RpbmcKLSAqIGZvcm1hdCBhbmQgSmF2YXNjcmlwdCdzIGhhbmRsaW5nIG9mIGJpdHdpc2UgbWF0aCwgdGhpcyBhY3R1YWxseSB3b3JrcwotICogY29ycmVjdGx5IGZvciBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgMzItYml0IHZhcmludHMuCi0gKgotICogVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgdmFzdGx5IG1vcmUgZnJlcXVlbnRseSB0aGFuIGFueSBvdGhlciBpbgotICogQmluYXJ5RGVjb2Rlciwgc28gaXQgaGFzIGJlZW4gdW5yb2xsZWQgYW5kIHR3ZWFrZWQgZm9yIHBlcmZvcm1hbmNlLgotICoKLSAqIElmIHRoZXJlIGFyZSBtb3JlIHRoYW4gMzIgYml0cyBvZiBkYXRhIGluIHRoZSB2YXJpbnQsIGl0IF9tdXN0XyBiZSBkdWUgdG8KLSAqIHNpZ24tZXh0ZW5zaW9uLiBJZiB3ZSdyZSBpbiBkZWJ1ZyBtb2RlIGFuZCB0aGUgaGlnaCAzMiBiaXRzIGRvbid0IG1hdGNoIHRoZQotICogZXhwZWN0ZWQgc2lnbiBleHRlbnNpb24sIHRoaXMgbWV0aG9kIHdpbGwgdGhyb3cgYW4gZXJyb3IuCi0gKgotICogRGVjb2RpbmcgdmFyaW50cyByZXF1aXJlcyBkb2luZyBzb21lIGZ1bm55IGJhc2UtMTI4IG1hdGggLSBmb3IgbW9yZQotICogZGV0YWlscyBvbiB0aGUgZm9ybWF0LCBzZWUKLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZwotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlY29kZWQgdW5zaWduZWQgMzItYml0IHZhcmludC4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkVW5zaWduZWRWYXJpbnQzMiA9IGZ1bmN0aW9uKCkgewotICB2YXIgdGVtcDsKLSAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlc187Ci0KLSAgdGVtcCA9IGJ5dGVzW3RoaXMuY3Vyc29yXyArIDBdOwotICB2YXIgeCA9ICh0ZW1wICYgMHg3Rik7Ci0gIGlmICh0ZW1wIDwgMTI4KSB7Ci0gICAgdGhpcy5jdXJzb3JfICs9IDE7Ci0gICAgZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl8gPD0gdGhpcy5lbmRfKTsKLSAgICByZXR1cm4geDsKLSAgfQotCi0gIHRlbXAgPSBieXRlc1t0aGlzLmN1cnNvcl8gKyAxXTsKLSAgeCB8PSAodGVtcCAmIDB4N0YpIDw8IDc7Ci0gIGlmICh0ZW1wIDwgMTI4KSB7Ci0gICAgdGhpcy5jdXJzb3JfICs9IDI7Ci0gICAgZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl8gPD0gdGhpcy5lbmRfKTsKLSAgICByZXR1cm4geDsKLSAgfQotCi0gIHRlbXAgPSBieXRlc1t0aGlzLmN1cnNvcl8gKyAyXTsKLSAgeCB8PSAodGVtcCAmIDB4N0YpIDw8IDE0OwotICBpZiAodGVtcCA8IDEyOCkgewotICAgIHRoaXMuY3Vyc29yXyArPSAzOwotICAgIGdvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfIDw9IHRoaXMuZW5kXyk7Ci0gICAgcmV0dXJuIHg7Ci0gIH0KLQotICB0ZW1wID0gYnl0ZXNbdGhpcy5jdXJzb3JfICsgM107Ci0gIHggfD0gKHRlbXAgJiAweDdGKSA8PCAyMTsKLSAgaWYgKHRlbXAgPCAxMjgpIHsKLSAgICB0aGlzLmN1cnNvcl8gKz0gNDsKLSAgICBnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXyA8PSB0aGlzLmVuZF8pOwotICAgIHJldHVybiB4OwotICB9Ci0KLSAgdGVtcCA9IGJ5dGVzW3RoaXMuY3Vyc29yXyArIDRdOwotICB4IHw9ICh0ZW1wICYgMHgwRikgPDwgMjg7Ci0gIGlmICh0ZW1wIDwgMTI4KSB7Ci0gICAgLy8gV2UncmUgcmVhZGluZyB0aGUgaGlnaCBiaXRzIG9mIGFuIHVuc2lnbmVkIHZhcmludC4gVGhlIGJ5dGUgd2UganVzdCByZWFkCi0gICAgLy8gYWxzbyBjb250YWlucyBiaXRzIDMzIHRocm91Z2ggMzUsIHdoaWNoIHdlJ3JlIGdvaW5nIHRvIGRpc2NhcmQuIFRob3NlCi0gICAgLy8gYml0cyBfbXVzdF8gYmUgemVybywgb3IgdGhlIGVuY29kaW5nIGlzIGludmFsaWQuCi0gICAgZ29vZy5hc3NlcnRzLmFzc2VydCgodGVtcCAmIDB4RjApID09IDApOwotICAgIHRoaXMuY3Vyc29yXyArPSA1OwotICAgIGdvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfIDw9IHRoaXMuZW5kXyk7Ci0gICAgcmV0dXJuIHggPj4+IDA7Ci0gIH0KLQotICAvLyBJZiB3ZSBnZXQgaGVyZSwgd2UncmUgcmVhZGluZyB0aGUgc2lnbiBleHRlbnNpb24gb2YgYSBuZWdhdGl2ZSAzMi1iaXQgaW50LgotICAvLyBXZSBjYW4gc2tpcCB0aGVzZSBieXRlcywgYXMgd2Uga25vdyBpbiBhZHZhbmNlIHRoYXQgdGhleSBoYXZlIHRvIGJlIGFsbAotICAvLyAxJ3MgaWYgdGhlIHZhcmludCBpcyBjb3JyZWN0bHkgZW5jb2RlZC4gU2luY2Ugd2UgYWxzbyBrbm93IHRoZSB2YWx1ZSBpcwotICAvLyBuZWdhdGl2ZSwgd2UgZG9uJ3QgaGF2ZSB0byBjb2VyY2UgaXQgdG8gdW5zaWduZWQgYmVmb3JlIHdlIHJldHVybiBpdC4KLQotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh0ZW1wICYgMHhGMCkgPT0gMHhGMCk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoYnl0ZXNbdGhpcy5jdXJzb3JfICsgNV0gPT0gMHhGRik7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoYnl0ZXNbdGhpcy5jdXJzb3JfICsgNl0gPT0gMHhGRik7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoYnl0ZXNbdGhpcy5jdXJzb3JfICsgN10gPT0gMHhGRik7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoYnl0ZXNbdGhpcy5jdXJzb3JfICsgOF0gPT0gMHhGRik7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoYnl0ZXNbdGhpcy5jdXJzb3JfICsgOV0gPT0gMHgwMSk7Ci0KLSAgdGhpcy5jdXJzb3JfICs9IDEwOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXyA8PSB0aGlzLmVuZF8pOwotICByZXR1cm4geDsKLX07Ci0KLQotLyoqCi0gKiBUaGUgcmVhZFVuc2lnbmVkVmFyaW50MzIgYWJvdmUgZGVhbHMgd2l0aCBzaWduZWQgMzItYml0IHZhcmludHMgY29ycmVjdGx5LAotICogc28gdGhpcyBpcyBqdXN0IGFuIGFsaWFzLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlY29kZWQgc2lnbmVkIDMyLWJpdCB2YXJpbnQuCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFNpZ25lZFZhcmludDMyID0KLSAgICBqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVbnNpZ25lZFZhcmludDMyOwotCi0KLS8qKgotICogUmVhZHMgYSAzMi1iaXQgdW5zaWduZWQgdmFyaWFudCBhbmQgcmV0dXJucyBpdHMgdmFsdWUgYXMgYSBzdHJpbmcuCi0gKgotICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCB1bnNpZ25lZCAzMi1iaXQgdmFyaW50IGFzIGEgc3RyaW5nLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVbnNpZ25lZFZhcmludDMyU3RyaW5nID0gZnVuY3Rpb24oKSB7Ci0gIC8vIDMyLWJpdCBpbnRlZ2VycyBmaXQgaW4gSmF2YVNjcmlwdCBudW1iZXJzIHdpdGhvdXQgbG9zcyBvZiBwcmVjaXNpb24sIHNvCi0gIC8vIHN0cmluZyB2YXJpYW50cyBvZiAzMi1iaXQgdmFyaW50IHJlYWRlcnMgY2FuIHNpbXBseSBkZWxlZ2F0ZSB0aGVuIGNvbnZlcnQKLSAgLy8gdG8gc3RyaW5nLgotICB2YXIgdmFsdWUgPSB0aGlzLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7Ci0gIHJldHVybiB2YWx1ZS50b1N0cmluZygpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgMzItYml0IHNpZ25lZCB2YXJpYW50IGFuZCByZXR1cm5zIGl0cyB2YWx1ZSBhcyBhIHN0cmluZy4KLSAqCi0gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHNpZ25lZCAzMi1iaXQgdmFyaW50IGFzIGEgc3RyaW5nLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRTaWduZWRWYXJpbnQzMlN0cmluZyA9IGZ1bmN0aW9uKCkgewotICAvLyAzMi1iaXQgaW50ZWdlcnMgZml0IGluIEphdmFTY3JpcHQgbnVtYmVycyB3aXRob3V0IGxvc3Mgb2YgcHJlY2lzaW9uLCBzbwotICAvLyBzdHJpbmcgdmFyaWFudHMgb2YgMzItYml0IHZhcmludCByZWFkZXJzIGNhbiBzaW1wbHkgZGVsZWdhdGUgdGhlbiBjb252ZXJ0Ci0gIC8vIHRvIHN0cmluZy4KLSAgdmFyIHZhbHVlID0gdGhpcy5yZWFkU2lnbmVkVmFyaW50MzIoKTsKLSAgcmV0dXJuIHZhbHVlLnRvU3RyaW5nKCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBzaWduZWQsIHppZ3phZy1lbmNvZGVkIDMyLWJpdCB2YXJpbnQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqCi0gKiBaaWd6YWcgZW5jb2RpbmcgaXMgYSBtb2RpZmljYXRpb24gb2YgdmFyaW50IGVuY29kaW5nIHRoYXQgcmVkdWNlcyB0aGUKLSAqIHN0b3JhZ2Ugb3ZlcmhlYWQgZm9yIHNtYWxsIG5lZ2F0aXZlIGludGVnZXJzIC0gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKLSAqIGZvcm1hdCwgc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZwotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlY29kZWQgc2lnbmVkLCB6aWd6YWctZW5jb2RlZCAzMi1iaXQgdmFyaW50LgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRaaWd6YWdWYXJpbnQzMiA9IGZ1bmN0aW9uKCkgewotICB2YXIgcmVzdWx0ID0gdGhpcy5yZWFkVW5zaWduZWRWYXJpbnQzMigpOwotICByZXR1cm4gKHJlc3VsdCA+Pj4gMSkgXiAtIChyZXN1bHQgJiAxKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhbiB1bnNpZ25lZCA2NC1iaXQgdmFyaW50IGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uIE5vdGUgdGhhdCBzaW5jZQotICogSmF2YXNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRzLCB0aGVyZSB3aWxsIGJlCi0gKiBwcmVjaXNpb24gbG9zdCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHZhcmludCBpcyBsYXJnZXIgdGhhbiAyXjUzLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlY29kZWQgdW5zaWduZWQgdmFyaW50LiBQcmVjaXNpb24gd2lsbCBiZSBsb3N0IGlmIHRoZQotICogICAgIGludGVnZXIgZXhjZWVkcyAyXjUzLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVbnNpZ25lZFZhcmludDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMucmVhZFNwbGl0VmFyaW50NjRfKCk7Ci0gIHJldHVybiBqc3BiLnV0aWxzLmpvaW5VaW50NjQodGhpcy50ZW1wTG93XywgdGhpcy50ZW1wSGlnaF8pOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGFuIHVuc2lnbmVkIDY0LWJpdCB2YXJpbnQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbSBhbmQgcmV0dXJucyB0aGUgdmFsdWUKLSAqIGFzIGEgZGVjaW1hbCBzdHJpbmcuCi0gKgotICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCB1bnNpZ25lZCB2YXJpbnQgYXMgYSBkZWNpbWFsIHN0cmluZy4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZyA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpOwotICByZXR1cm4ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKHRoaXMudGVtcExvd18sIHRoaXMudGVtcEhpZ2hfKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHNpZ25lZCA2NC1iaXQgdmFyaW50IGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uIE5vdGUgdGhhdCBzaW5jZQotICogSmF2YXNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRzLCB0aGVyZSB3aWxsIGJlCi0gKiBwcmVjaXNpb24gbG9zdCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHZhcmludCBpcyBsYXJnZXIgdGhhbiAyXjUzLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlY29kZWQgc2lnbmVkIHZhcmludC4gUHJlY2lzaW9uIHdpbGwgYmUgbG9zdCBpZiB0aGUKLSAqICAgICBpbnRlZ2VyIGV4Y2VlZHMgMl41My4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU2lnbmVkVmFyaW50NjQgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5yZWFkU3BsaXRWYXJpbnQ2NF8oKTsKLSAgcmV0dXJuIGpzcGIudXRpbHMuam9pbkludDY0KHRoaXMudGVtcExvd18sIHRoaXMudGVtcEhpZ2hfKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhbiBzaWduZWQgNjQtYml0IHZhcmludCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtIGFuZCByZXR1cm5zIHRoZSB2YWx1ZQotICogYXMgYSBkZWNpbWFsIHN0cmluZy4KLSAqCi0gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBkZWNvZGVkIHNpZ25lZCB2YXJpbnQgYXMgYSBkZWNpbWFsIHN0cmluZy4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkU2lnbmVkVmFyaW50NjRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5yZWFkU3BsaXRWYXJpbnQ2NF8oKTsKLSAgcmV0dXJuIGpzcGIudXRpbHMuam9pblNpZ25lZERlY2ltYWxTdHJpbmcodGhpcy50ZW1wTG93XywgdGhpcy50ZW1wSGlnaF8pOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgc2lnbmVkLCB6aWd6YWctZW5jb2RlZCA2NC1iaXQgdmFyaW50IGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uIE5vdGUKLSAqIHRoYXQgc2luY2UgSmF2YXNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRzLAotICogdGhlcmUgd2lsbCBiZSBwcmVjaXNpb24gbG9zdCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIHZhcmludCBpcyBsYXJnZXIKLSAqIHRoYW4gMl41My4KLSAqCi0gKiBaaWd6YWcgZW5jb2RpbmcgaXMgYSBtb2RpZmljYXRpb24gb2YgdmFyaW50IGVuY29kaW5nIHRoYXQgcmVkdWNlcyB0aGUKLSAqIHN0b3JhZ2Ugb3ZlcmhlYWQgZm9yIHNtYWxsIG5lZ2F0aXZlIGludGVnZXJzIC0gZm9yIG1vcmUgZGV0YWlscyBvbiB0aGUKLSAqIGZvcm1hdCwgc2VlIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZwotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRlY29kZWQgemlnemFnIHZhcmludC4gUHJlY2lzaW9uIHdpbGwgYmUgbG9zdCBpZiB0aGUKLSAqICAgICBpbnRlZ2VyIGV4Y2VlZHMgMl41My4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkWmlnemFnVmFyaW50NjQgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5yZWFkU3BsaXRWYXJpbnQ2NF8oKTsKLSAgcmV0dXJuIGpzcGIudXRpbHMuam9pblppZ3phZzY0KHRoaXMudGVtcExvd18sIHRoaXMudGVtcEhpZ2hfKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHJhdyB1bnNpZ25lZCA4LWJpdCBpbnRlZ2VyIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uCi0gKgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgdW5zaWduZWQgOC1iaXQgaW50ZWdlciByZWFkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFVpbnQ4ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBhID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfICsgMF07Ci0gIHRoaXMuY3Vyc29yXyArPSAxOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXyA8PSB0aGlzLmVuZF8pOwotICByZXR1cm4gYTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHJhdyB1bnNpZ25lZCAxNi1iaXQgaW50ZWdlciBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHJlYWQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkVWludDE2ID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBhID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfICsgMF07Ci0gIHZhciBiID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfICsgMV07Ci0gIHRoaXMuY3Vyc29yXyArPSAyOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXyA8PSB0aGlzLmVuZF8pOwotICByZXR1cm4gKGEgPDwgMCkgfCAoYiA8PCA4KTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHJhdyB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHJlYWQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkVWludDMyID0gZnVuY3Rpb24oKSB7Ci0gIHZhciBhID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfICsgMF07Ci0gIHZhciBiID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfICsgMV07Ci0gIHZhciBjID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfICsgMl07Ci0gIHZhciBkID0gdGhpcy5ieXRlc19bdGhpcy5jdXJzb3JfICsgM107Ci0gIHRoaXMuY3Vyc29yXyArPSA0OwotICBnb29nLmFzc2VydHMuYXNzZXJ0KHRoaXMuY3Vyc29yXyA8PSB0aGlzLmVuZF8pOwotICByZXR1cm4gKChhIDw8IDApIHwgKGIgPDwgOCkgfCAoYyA8PCAxNikgfCAoZCA8PCAyNCkpID4+PiAwOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcmF3IHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uIE5vdGUgdGhhdCBzaW5jZQotICogSmF2YXNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRzLCB0aGVyZSB3aWxsIGJlCi0gKiBwcmVjaXNpb24gbG9zdCBpZiB0aGUgYWJzb2x1dGUgdmFsdWUgb2YgdGhlIGludGVnZXIgaXMgbGFyZ2VyIHRoYW4gMl41My4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciByZWFkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uCi0gKiAgICAgUHJlY2lzaW9uIHdpbGwgYmUgbG9zdCBpZiB0aGUgaW50ZWdlciBleGNlZWRzIDJeNTMuCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFVpbnQ2NCA9IGZ1bmN0aW9uKCkgewotICB2YXIgYml0c0xvdyA9IHRoaXMucmVhZFVpbnQzMigpOwotICB2YXIgYml0c0hpZ2ggPSB0aGlzLnJlYWRVaW50MzIoKTsKLSAgcmV0dXJuIGpzcGIudXRpbHMuam9pblVpbnQ2NChiaXRzTG93LCBiaXRzSGlnaCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSByYXcgc2lnbmVkIDgtYml0IGludGVnZXIgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzaWduZWQgOC1iaXQgaW50ZWdlciByZWFkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZEludDggPSBmdW5jdGlvbigpIHsKLSAgdmFyIGEgPSB0aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8gKyAwXTsKLSAgdGhpcy5jdXJzb3JfICs9IDE7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfIDw9IHRoaXMuZW5kXyk7Ci0gIHJldHVybiAoYSA8PCAyNCkgPj4gMjQ7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSByYXcgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uCi0gKgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgc2lnbmVkIDE2LWJpdCBpbnRlZ2VyIHJlYWQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkSW50MTYgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGEgPSB0aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8gKyAwXTsKLSAgdmFyIGIgPSB0aGlzLmJ5dGVzX1t0aGlzLmN1cnNvcl8gKyAxXTsKLSAgdGhpcy5jdXJzb3JfICs9IDI7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfIDw9IHRoaXMuZW5kXyk7Ci0gIHJldHVybiAoKChhIDw8IDApIHwgKGIgPDwgOCkpIDw8IDE2KSA+PiAxNjsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHJhdyBzaWduZWQgMzItYml0IGludGVnZXIgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzaWduZWQgMzItYml0IGludGVnZXIgcmVhZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRJbnQzMiA9IGZ1bmN0aW9uKCkgewotICB2YXIgYSA9IHRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyArIDBdOwotICB2YXIgYiA9IHRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyArIDFdOwotICB2YXIgYyA9IHRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyArIDJdOwotICB2YXIgZCA9IHRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXyArIDNdOwotICB0aGlzLmN1cnNvcl8gKz0gNDsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLmN1cnNvcl8gPD0gdGhpcy5lbmRfKTsKLSAgcmV0dXJuIChhIDw8IDApIHwgKGIgPDwgOCkgfCAoYyA8PCAxNikgfCAoZCA8PCAyNCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSByYXcgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uIE5vdGUgdGhhdCBzaW5jZQotICogSmF2YXNjcmlwdCByZXByZXNlbnRzIGFsbCBudW1iZXJzIGFzIGRvdWJsZS1wcmVjaXNpb24gZmxvYXRzLCB0aGVyZSB3aWxsIGJlCi0gKiBwcmVjaXNpb24gbG9zdCBpZiB0aGUgYWJzb2x1dGUgdmxhdWUgb2YgdGhlIGludGVnZXIgaXMgbGFyZ2VyIHRoYW4gMl41My4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBzaWduZWQgNjQtYml0IGludGVnZXIgcmVhZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLgotICogICAgIFByZWNpc2lvbiB3aWxsIGJlIGxvc3QgaWYgdGhlIGludGVnZXIgZXhjZWVkcyAyXjUzLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRJbnQ2NCA9IGZ1bmN0aW9uKCkgewotICB2YXIgYml0c0xvdyA9IHRoaXMucmVhZFVpbnQzMigpOwotICB2YXIgYml0c0hpZ2ggPSB0aGlzLnJlYWRVaW50MzIoKTsKLSAgcmV0dXJuIGpzcGIudXRpbHMuam9pbkludDY0KGJpdHNMb3csIGJpdHNIaWdoKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIDMyLWJpdCBmbG9hdGluZy1wb2ludCBudW1iZXIgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbSwgdXNpbmcgdGhlCi0gKiB0ZW1wb3JhcnkgYnVmZmVyIHRvIHJlYWxpZ24gdGhlIGRhdGEuCi0gKgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgZmxvYXQgcmVhZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRGbG9hdCA9IGZ1bmN0aW9uKCkgewotICB2YXIgYml0c0xvdyA9IHRoaXMucmVhZFVpbnQzMigpOwotICB2YXIgYml0c0hpZ2ggPSAwOwotICByZXR1cm4ganNwYi51dGlscy5qb2luRmxvYXQzMihiaXRzTG93LCBiaXRzSGlnaCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSA2NC1iaXQgZmxvYXRpbmctcG9pbnQgbnVtYmVyIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIHVzaW5nIHRoZQotICogdGVtcG9yYXJ5IGJ1ZmZlciB0byByZWFsaWduIHRoZSBkYXRhLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGRvdWJsZSByZWFkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgewotICB2YXIgYml0c0xvdyA9IHRoaXMucmVhZFVpbnQzMigpOwotICB2YXIgYml0c0hpZ2ggPSB0aGlzLnJlYWRVaW50MzIoKTsKLSAgcmV0dXJuIGpzcGIudXRpbHMuam9pbkZsb2F0NjQoYml0c0xvdywgYml0c0hpZ2gpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgYm9vbGVhbiB2YWx1ZSBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLgotICogQHJldHVybiB7Ym9vbGVhbn0gVGhlIGJvb2xlYW4gcmVhZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiAhIXRoaXMuYnl0ZXNfW3RoaXMuY3Vyc29yXysrXTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhbiBlbnVtIHZhbHVlIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIHdoaWNoIGFyZSBhbHdheXMgZW5jb2RlZCBhcwotICogc2lnbmVkIHZhcmludHMuCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBlbnVtIHZhbHVlIHJlYWQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkRW51bSA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkU2lnbmVkVmFyaW50MzIoKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhbmQgcGFyc2VzIGEgVVRGLTggZW5jb2RlZCB1bmljb2RlIHN0cmluZyBmcm9tIHRoZSBzdHJlYW0uCi0gKiBUaGUgY29kZSBpcyBpbnNwaXJlZCBieSBtYXBzLnZlY3RvcnRvd24ucGFyc2UuU3RyZWFtZWREYXRhVmlld1JlYWRlciwgd2l0aAotICogdGhlIGV4Y2VwdGlvbiB0aGF0IHRoZSBpbXBsZW1lbnRhdGlvbiBoZXJlIGRvZXMgbm90IGdldCBjb25mdXNlZCBpZiBpdAotICogZW5jb3VudGVycyBjaGFyYWN0ZXJzIGxvbmdlciB0aGFuIHRocmVlIGJ5dGVzLiBUaGVzZSBjaGFyYWN0ZXJzIGFyZSBpZ25vcmVkCi0gKiB0aG91Z2gsIGFzIHRoZXkgYXJlIGV4dHJlbWVseSByYXJlOiB0aHJlZSBVVEYtOCBieXRlcyBjb3ZlciB2aXJ0dWFsbHkgYWxsCi0gKiBjaGFyYWN0ZXJzIGluIGNvbW1vbiB1c2UgKGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVVRGLTgpLgotICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBUaGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcgdG8gcmVhZC4KLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGRlY29kZWQgc3RyaW5nLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRTdHJpbmcgPSBmdW5jdGlvbihsZW5ndGgpIHsKLSAgdmFyIGJ5dGVzID0gdGhpcy5ieXRlc187Ci0gIHZhciBjdXJzb3IgPSB0aGlzLmN1cnNvcl87Ci0gIHZhciBlbmQgPSBjdXJzb3IgKyBsZW5ndGg7Ci0gIHZhciBjaGFycyA9IFtdOwotCi0gIHdoaWxlIChjdXJzb3IgPCBlbmQpIHsKLSAgICB2YXIgYyA9IGJ5dGVzW2N1cnNvcisrXTsKLSAgICBpZiAoYyA8IDEyOCkgeyAvLyBSZWd1bGFyIDctYml0IEFTQ0lJLgotICAgICAgY2hhcnMucHVzaChjKTsKLSAgICB9IGVsc2UgaWYgKGMgPCAxOTIpIHsKLSAgICAgIC8vIFVURi04IGNvbnRpbnVhdGlvbiBtYXJrLiBXZSBhcmUgb3V0IG9mIHN5bmMuIFRoaXMKLSAgICAgIC8vIG1pZ2h0IGhhcHBlbiBpZiB3ZSBhdHRlbXB0ZWQgdG8gcmVhZCBhIGNoYXJhY3RlcgotICAgICAgLy8gd2l0aCBtb3JlIHRoYW4gdGhyZWUgYnl0ZXMuCi0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgaWYgKGMgPCAyMjQpIHsgLy8gVVRGLTggd2l0aCB0d28gYnl0ZXMuCi0gICAgICB2YXIgYzIgPSBieXRlc1tjdXJzb3IrK107Ci0gICAgICBjaGFycy5wdXNoKCgoYyAmIDMxKSA8PCA2KSB8IChjMiAmIDYzKSk7Ci0gICAgfSBlbHNlIGlmIChjIDwgMjQwKSB7IC8vIFVURi04IHdpdGggdGhyZWUgYnl0ZXMuCi0gICAgICB2YXIgYzIgPSBieXRlc1tjdXJzb3IrK107Ci0gICAgICB2YXIgYzMgPSBieXRlc1tjdXJzb3IrK107Ci0gICAgICBjaGFycy5wdXNoKCgoYyAmIDE1KSA8PCAxMikgfCAoKGMyICYgNjMpIDw8IDYpIHwgKGMzICYgNjMpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5IGlzIGZhc3RlciB0aGFuIG1hbnVhbGx5IGFwcGVuZGluZyBjaGFyYWN0ZXJzIG9uCi0gIC8vIENocm9tZSAyNSssIGFuZCBnZW5lcmF0ZXMgbm8gYWRkaXRpb25hbCBjb25zIHN0cmluZyBnYXJiYWdlLgotICB2YXIgcmVzdWx0ID0gU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLCBjaGFycyk7Ci0gIHRoaXMuY3Vyc29yXyA9IGN1cnNvcjsKLSAgcmV0dXJuIHJlc3VsdDsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhbmQgcGFyc2VzIGEgVVRGLTggZW5jb2RlZCB1bmljb2RlIHN0cmluZyAod2l0aCBsZW5ndGggcHJlZml4KSBmcm9tCi0gKiB0aGUgc3RyZWFtLgotICogQHJldHVybiB7c3RyaW5nfSBUaGUgZGVjb2RlZCBzdHJpbmcuCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFN0cmluZ1dpdGhMZW5ndGggPSBmdW5jdGlvbigpIHsKLSAgdmFyIGxlbmd0aCA9IHRoaXMucmVhZFVuc2lnbmVkVmFyaW50MzIoKTsKLSAgcmV0dXJuIHRoaXMucmVhZFN0cmluZyhsZW5ndGgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgYmxvY2sgb2YgcmF3IGJ5dGVzIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0uCi0gKgotICogQHBhcmFtIHtudW1iZXJ9IGxlbmd0aCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIHJlYWQuCi0gKiBAcmV0dXJuIHshVWludDhBcnJheX0gVGhlIGRlY29kZWQgYmxvY2sgb2YgYnl0ZXMsIG9yIGFuIGVtcHR5IGJsb2NrIGlmIHRoZQotICogICAgIGxlbmd0aCB3YXMgaW52YWxpZC4KLSAqLwotanNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkQnl0ZXMgPSBmdW5jdGlvbihsZW5ndGgpIHsKLSAgaWYgKGxlbmd0aCA8IDAgfHwKLSAgICAgIHRoaXMuY3Vyc29yXyArIGxlbmd0aCA+IHRoaXMuYnl0ZXNfLmxlbmd0aCkgewotICAgIHRoaXMuZXJyb3JfID0gdHJ1ZTsKLSAgICBnb29nLmFzc2VydHMuZmFpbCgnSW52YWxpZCBieXRlIGxlbmd0aCEnKTsKLSAgICByZXR1cm4gbmV3IFVpbnQ4QXJyYXkoMCk7Ci0gIH0KLQotICB2YXIgcmVzdWx0ID0gdGhpcy5ieXRlc18uc3ViYXJyYXkodGhpcy5jdXJzb3JfLCB0aGlzLmN1cnNvcl8gKyBsZW5ndGgpOwotCi0gIHRoaXMuY3Vyc29yXyArPSBsZW5ndGg7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5jdXJzb3JfIDw9IHRoaXMuZW5kXyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSA2NC1iaXQgdmFyaW50IGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhbiA4LWNoYXJhY3RlcgotICogVW5pY29kZSBzdHJpbmcgZm9yIHVzZSBhcyBhIGhhc2ggdGFibGUga2V5LgotICoKLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGhhc2ggdmFsdWUuCi0gKi8KLWpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFZhcmludEhhc2g2NCA9IGZ1bmN0aW9uKCkgewotICB0aGlzLnJlYWRTcGxpdFZhcmludDY0XygpOwotICByZXR1cm4ganNwYi51dGlscy5qb2luSGFzaDY0KHRoaXMudGVtcExvd18sIHRoaXMudGVtcEhpZ2hfKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIDY0LWJpdCBmaXhlZC13aWR0aCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0gYW5kIHJldHVybnMgaXQgYXMgYW4KLSAqIDgtY2hhcmFjdGVyIFVuaWNvZGUgc3RyaW5nIGZvciB1c2UgYXMgYSBoYXNoIHRhYmxlIGtleS4KLSAqCi0gKiBAcmV0dXJuIHtzdHJpbmd9IFRoZSBoYXNoIHZhbHVlLgotICovCi1qc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRGaXhlZEhhc2g2NCA9IGZ1bmN0aW9uKCkgewotICB2YXIgYnl0ZXMgPSB0aGlzLmJ5dGVzXzsKLSAgdmFyIGN1cnNvciA9IHRoaXMuY3Vyc29yXzsKLQotICB2YXIgYSA9IGJ5dGVzW2N1cnNvciArIDBdOwotICB2YXIgYiA9IGJ5dGVzW2N1cnNvciArIDFdOwotICB2YXIgYyA9IGJ5dGVzW2N1cnNvciArIDJdOwotICB2YXIgZCA9IGJ5dGVzW2N1cnNvciArIDNdOwotICB2YXIgZSA9IGJ5dGVzW2N1cnNvciArIDRdOwotICB2YXIgZiA9IGJ5dGVzW2N1cnNvciArIDVdOwotICB2YXIgZyA9IGJ5dGVzW2N1cnNvciArIDZdOwotICB2YXIgaCA9IGJ5dGVzW2N1cnNvciArIDddOwotCi0gIHRoaXMuY3Vyc29yXyArPSA4OwotCi0gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlKGEsIGIsIGMsIGQsIGUsIGYsIGcsIGgpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9kZWNvZGVyX3Rlc3QuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvZGVjb2Rlcl90ZXN0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMDQ1ZTkxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9kZWNvZGVyX3Rlc3QuanMKKysrIC9kZXYvbnVsbApAQCAtMSwzMzUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8qKgotICogQGZpbGVvdmVydmlldyBUZXN0IGNhc2VzIGZvciBqc3BiJ3MgYmluYXJ5IHByb3RvY29sIGJ1ZmZlciBkZWNvZGVyLgotICoKLSAqIFRoZXJlIGFyZSB0d28gcGFydGljdWxhciBtYWdpYyBudW1iZXJzIHRoYXQgbmVlZCB0byBiZSBwb2ludGVkIG91dCAtCi0gKiAyXjY0LTEwMjUgaXMgdGhlIGxhcmdlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgYXMgYm90aCBhIGRvdWJsZSBhbmQgYW4KLSAqIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLCBhbmQgMl42My01MTMgaXMgdGhlIGxhcmdlc3QgbnVtYmVyIHJlcHJlc2VudGFibGUgYXMKLSAqIGJvdGggYSBkb3VibGUgYW5kIGEgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLgotICoKLSAqIFRlc3Qgc3VpdGUgaXMgd3JpdHRlbiB1c2luZyBKYXNtaW5lIC0tIHNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vCi0gKgotICogQGF1dGhvciBhYXBwbGVieUBnb29nbGUuY29tIChBdXN0aW4gQXBwbGVieSkKLSAqLwotCi1nb29nLnJlcXVpcmUoJ2dvb2cudGVzdGluZy5hc3NlcnRzJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5Q29uc3RhbnRzJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5RGVjb2RlcicpOwotZ29vZy5yZXF1aXJlKCdqc3BiLkJpbmFyeUVuY29kZXInKTsKLQotCi0vKioKLSAqIFRlc3RzIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiB1bnNpZ25lZCB0eXBlcy4KLSAqIEBwYXJhbSB7RnVuY3Rpb259IHJlYWRWYWx1ZQotICogQHBhcmFtIHtGdW5jdGlvbn0gd3JpdGVWYWx1ZQotICogQHBhcmFtIHtudW1iZXJ9IGVwc2lsb24KLSAqIEBwYXJhbSB7bnVtYmVyfSB1cHBlckxpbWl0Ci0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBmaWx0ZXIKLSAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN8dmlzaWJpbGl0eX0KLSAqLwotZnVuY3Rpb24gZG9UZXN0VW5zaWduZWRWYWx1ZShyZWFkVmFsdWUsCi0gICAgd3JpdGVWYWx1ZSwgZXBzaWxvbiwgdXBwZXJMaW1pdCwgZmlsdGVyKSB7Ci0gIHZhciBlbmNvZGVyID0gbmV3IGpzcGIuQmluYXJ5RW5jb2RlcigpOwotCi0gIC8vIEVuY29kZSB6ZXJvIGFuZCBsaW1pdHMuCi0gIHdyaXRlVmFsdWUuY2FsbChlbmNvZGVyLCBmaWx0ZXIoMCkpOwotICB3cml0ZVZhbHVlLmNhbGwoZW5jb2RlciwgZmlsdGVyKGVwc2lsb24pKTsKLSAgd3JpdGVWYWx1ZS5jYWxsKGVuY29kZXIsIGZpbHRlcih1cHBlckxpbWl0KSk7Ci0KLSAgLy8gRW5jb2RlIHBvc2l0aXZlIHZhbHVlcy4KLSAgZm9yICh2YXIgY3Vyc29yID0gZXBzaWxvbjsgY3Vyc29yIDwgdXBwZXJMaW1pdDsgY3Vyc29yICo9IDEuMSkgewotICAgIHdyaXRlVmFsdWUuY2FsbChlbmNvZGVyLCBmaWx0ZXIoY3Vyc29yKSk7Ci0gIH0KLQotICB2YXIgZGVjb2RlciA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYyhlbmNvZGVyLmVuZCgpKTsKLQotICAvLyBDaGVjayB6ZXJvIGFuZCBsaW1pdHMuCi0gIGFzc2VydEVxdWFscyhmaWx0ZXIoMCksIHJlYWRWYWx1ZS5jYWxsKGRlY29kZXIpKTsKLSAgYXNzZXJ0RXF1YWxzKGZpbHRlcihlcHNpbG9uKSwgcmVhZFZhbHVlLmNhbGwoZGVjb2RlcikpOwotICBhc3NlcnRFcXVhbHMoZmlsdGVyKHVwcGVyTGltaXQpLCByZWFkVmFsdWUuY2FsbChkZWNvZGVyKSk7Ci0KLSAgLy8gQ2hlY2sgcG9zaXRpdmUgdmFsdWVzLgotICBmb3IgKHZhciBjdXJzb3IgPSBlcHNpbG9uOyBjdXJzb3IgPCB1cHBlckxpbWl0OyBjdXJzb3IgKj0gMS4xKSB7Ci0gICAgaWYgKGZpbHRlcihjdXJzb3IpICE9IHJlYWRWYWx1ZS5jYWxsKGRlY29kZXIpKSB0aHJvdyAnZmFpbCEnOwotICB9Ci0KLSAgLy8gRW5jb2RpbmcgdmFsdWVzIG91dHNpZGUgdGhlIHZhbGlkIHJhbmdlIHNob3VsZCBhc3NlcnQuCi0gIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHt3cml0ZVZhbHVlLmNhbGwoZW5jb2RlciwgLTEpO30pOwotICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7d3JpdGVWYWx1ZS5jYWxsKGVuY29kZXIsIHVwcGVyTGltaXQgKiAxLjEpO30pOwotfQotCi0KLS8qKgotICogVGVzdHMgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIHNpZ25lZCB0eXBlcy4KLSAqIEBwYXJhbSB7RnVuY3Rpb259IHJlYWRWYWx1ZQotICogQHBhcmFtIHtGdW5jdGlvbn0gd3JpdGVWYWx1ZQotICogQHBhcmFtIHtudW1iZXJ9IGVwc2lsb24KLSAqIEBwYXJhbSB7bnVtYmVyfSBsb3dlckxpbWl0Ci0gKiBAcGFyYW0ge251bWJlcn0gdXBwZXJMaW1pdAotICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyCi0gKiBAc3VwcHJlc3Mge21pc3NpbmdQcm9wZXJ0aWVzfQotICovCi1mdW5jdGlvbiBkb1Rlc3RTaWduZWRWYWx1ZShyZWFkVmFsdWUsCi0gICAgd3JpdGVWYWx1ZSwgZXBzaWxvbiwgbG93ZXJMaW1pdCwgdXBwZXJMaW1pdCwgZmlsdGVyKSB7Ci0gIHZhciBlbmNvZGVyID0gbmV3IGpzcGIuQmluYXJ5RW5jb2RlcigpOwotCi0gIC8vIEVuY29kZSB6ZXJvIGFuZCBsaW1pdHMuCi0gIHdyaXRlVmFsdWUuY2FsbChlbmNvZGVyLCBmaWx0ZXIobG93ZXJMaW1pdCkpOwotICB3cml0ZVZhbHVlLmNhbGwoZW5jb2RlciwgZmlsdGVyKC1lcHNpbG9uKSk7Ci0gIHdyaXRlVmFsdWUuY2FsbChlbmNvZGVyLCBmaWx0ZXIoMCkpOwotICB3cml0ZVZhbHVlLmNhbGwoZW5jb2RlciwgZmlsdGVyKGVwc2lsb24pKTsKLSAgd3JpdGVWYWx1ZS5jYWxsKGVuY29kZXIsIGZpbHRlcih1cHBlckxpbWl0KSk7Ci0KLSAgdmFyIGlucHV0VmFsdWVzID0gW107Ci0KLSAgLy8gRW5jb2RlIG5lZ2F0aXZlIHZhbHVlcy4KLSAgZm9yICh2YXIgY3Vyc29yID0gbG93ZXJMaW1pdDsgY3Vyc29yIDwgLWVwc2lsb247IGN1cnNvciAvPSAxLjEpIHsKLSAgICB2YXIgdmFsID0gZmlsdGVyKGN1cnNvcik7Ci0gICAgd3JpdGVWYWx1ZS5jYWxsKGVuY29kZXIsIHZhbCk7Ci0gICAgaW5wdXRWYWx1ZXMucHVzaCh2YWwpOwotICB9Ci0KLSAgLy8gRW5jb2RlIHBvc2l0aXZlIHZhbHVlcy4KLSAgZm9yICh2YXIgY3Vyc29yID0gZXBzaWxvbjsgY3Vyc29yIDwgdXBwZXJMaW1pdDsgY3Vyc29yICo9IDEuMSkgewotICAgIHZhciB2YWwgPSBmaWx0ZXIoY3Vyc29yKTsKLSAgICB3cml0ZVZhbHVlLmNhbGwoZW5jb2RlciwgdmFsKTsKLSAgICBpbnB1dFZhbHVlcy5wdXNoKHZhbCk7Ci0gIH0KLQotICB2YXIgZGVjb2RlciA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYyhlbmNvZGVyLmVuZCgpKTsKLQotICAvLyBDaGVjayB6ZXJvIGFuZCBsaW1pdHMuCi0gIGFzc2VydEVxdWFscyhmaWx0ZXIobG93ZXJMaW1pdCksIHJlYWRWYWx1ZS5jYWxsKGRlY29kZXIpKTsKLSAgYXNzZXJ0RXF1YWxzKGZpbHRlcigtZXBzaWxvbiksIHJlYWRWYWx1ZS5jYWxsKGRlY29kZXIpKTsKLSAgYXNzZXJ0RXF1YWxzKGZpbHRlcigwKSwgcmVhZFZhbHVlLmNhbGwoZGVjb2RlcikpOwotICBhc3NlcnRFcXVhbHMoZmlsdGVyKGVwc2lsb24pLCByZWFkVmFsdWUuY2FsbChkZWNvZGVyKSk7Ci0gIGFzc2VydEVxdWFscyhmaWx0ZXIodXBwZXJMaW1pdCksIHJlYWRWYWx1ZS5jYWxsKGRlY29kZXIpKTsKLQotICAvLyBWZXJpZnkgZGVjb2RlZCB2YWx1ZXMuCi0gIGZvciAodmFyIGkgPSAwOyBpIDwgaW5wdXRWYWx1ZXMubGVuZ3RoOyBpKyspIHsKLSAgICBhc3NlcnRFcXVhbHMoaW5wdXRWYWx1ZXNbaV0sIHJlYWRWYWx1ZS5jYWxsKGRlY29kZXIpKTsKLSAgfQotCi0gIC8vIEVuY29kaW5nIHZhbHVlcyBvdXRzaWRlIHRoZSB2YWxpZCByYW5nZSBzaG91bGQgYXNzZXJ0LgotICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7d3JpdGVWYWx1ZS5jYWxsKGVuY29kZXIsIGxvd2VyTGltaXQgKiAxLjEpO30pOwotICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7d3JpdGVWYWx1ZS5jYWxsKGVuY29kZXIsIHVwcGVyTGltaXQgKiAxLjEpO30pOwotfQotCi1kZXNjcmliZSgnYmluYXJ5RGVjb2RlclRlc3QnLCBmdW5jdGlvbigpIHsKLSAgLyoqCi0gICAqIFRlc3RzIHRoZSBkZWNvZGVyIGluc3RhbmNlIGNhY2hlLgotICAgKiBAc3VwcHJlc3Mge3Zpc2liaWxpdHl9Ci0gICAqLwotICBpdCgndGVzdEluc3RhbmNlQ2FjaGUnLCBmdW5jdGlvbigpIHsKLSAgICAvLyBFbXB0eSB0aGUgaW5zdGFuY2UgY2FjaGVzLgotICAgIGpzcGIuQmluYXJ5RGVjb2Rlci5pbnN0YW5jZUNhY2hlXyA9IFtdOwotCi0gICAgLy8gQWxsb2NhdGluZyBhbmQgdGhlbiBmcmVlaW5nIGEgZGVjb2RlciBzaG91bGQgcHV0IGl0IGluIHRoZSBpbnN0YW5jZQotICAgIC8vIGNhY2hlLgotICAgIGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYygpLmZyZWUoKTsKLQotICAgIGFzc2VydEVxdWFscygxLCBqc3BiLkJpbmFyeURlY29kZXIuaW5zdGFuY2VDYWNoZV8ubGVuZ3RoKTsKLQotICAgIC8vIEFsbG9jYXRpbmcgYW5kIHRoZW4gZnJlZWluZyB0aHJlZSBkZWNvZGVycyBzaG91bGQgbGVhdmUgdXMgd2l0aCB0aHJlZSBpbgotICAgIC8vIHRoZSBjYWNoZS4KLQotICAgIHZhciBkZWNvZGVyMSA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYygpOwotICAgIHZhciBkZWNvZGVyMiA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYygpOwotICAgIHZhciBkZWNvZGVyMyA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYygpOwotICAgIGRlY29kZXIxLmZyZWUoKTsKLSAgICBkZWNvZGVyMi5mcmVlKCk7Ci0gICAgZGVjb2RlcjMuZnJlZSgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIGpzcGIuQmluYXJ5RGVjb2Rlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyByZWFkaW5nIDY0LWJpdCBpbnRlZ2VycyBhcyBoYXNoIHN0cmluZ3MuCi0gICAqLwotICBpdCgndGVzdEhhc2hTdHJpbmdzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGVuY29kZXIgPSBuZXcganNwYi5CaW5hcnlFbmNvZGVyKCk7Ci0KLSAgICB2YXIgaGFzaEEgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MDAsIDB4MDAsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwKTsKLSAgICB2YXIgaGFzaEIgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MTIsIDB4MzQsIDB4MDAsIDB4MDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDAwLCAweDAwLCAweDAwLCAweDAwKTsKLSAgICB2YXIgaGFzaEMgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4MTIsIDB4MzQsIDB4NTYsIDB4NzgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweDg3LCAweDY1LCAweDQzLCAweDIxKTsKLSAgICB2YXIgaGFzaEQgPSBTdHJpbmcuZnJvbUNoYXJDb2RlKDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAweEZGLCAweEZGLCAweEZGLCAweEZGKTsKLQotICAgIGVuY29kZXIud3JpdGVWYXJpbnRIYXNoNjQoaGFzaEEpOwotICAgIGVuY29kZXIud3JpdGVWYXJpbnRIYXNoNjQoaGFzaEIpOwotICAgIGVuY29kZXIud3JpdGVWYXJpbnRIYXNoNjQoaGFzaEMpOwotICAgIGVuY29kZXIud3JpdGVWYXJpbnRIYXNoNjQoaGFzaEQpOwotCi0gICAgZW5jb2Rlci53cml0ZUZpeGVkSGFzaDY0KGhhc2hBKTsKLSAgICBlbmNvZGVyLndyaXRlRml4ZWRIYXNoNjQoaGFzaEIpOwotICAgIGVuY29kZXIud3JpdGVGaXhlZEhhc2g2NChoYXNoQyk7Ci0gICAgZW5jb2Rlci53cml0ZUZpeGVkSGFzaDY0KGhhc2hEKTsKLQotICAgIHZhciBkZWNvZGVyID0ganNwYi5CaW5hcnlEZWNvZGVyLmFsbG9jKGVuY29kZXIuZW5kKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKGhhc2hBLCBkZWNvZGVyLnJlYWRWYXJpbnRIYXNoNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGhhc2hCLCBkZWNvZGVyLnJlYWRWYXJpbnRIYXNoNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGhhc2hDLCBkZWNvZGVyLnJlYWRWYXJpbnRIYXNoNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGhhc2hELCBkZWNvZGVyLnJlYWRWYXJpbnRIYXNoNjQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoaGFzaEEsIGRlY29kZXIucmVhZEZpeGVkSGFzaDY0KCkpOwotICAgIGFzc2VydEVxdWFscyhoYXNoQiwgZGVjb2Rlci5yZWFkRml4ZWRIYXNoNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGhhc2hDLCBkZWNvZGVyLnJlYWRGaXhlZEhhc2g2NCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoaGFzaEQsIGRlY29kZXIucmVhZEZpeGVkSGFzaDY0KCkpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBWZXJpZmllcyB0aGF0IG1pc3VzZSBvZiB0aGUgZGVjb2RlciBjbGFzcyB0cmlnZ2VycyBhc3NlcnRpb25zLgotICAgKiBAc3VwcHJlc3Mge2NoZWNrVHlwZXN8dmlzaWJpbGl0eX0KLSAgICovCi0gIGl0KCd0ZXN0RGVjb2RlRXJyb3JzJywgZnVuY3Rpb24oKSB7Ci0gICAgLy8gUmVhZGluZyBhIHZhbHVlIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHNob3VsZCB0cmlnZ2VyIGFuIGFzc2VydGlvbi4KLSAgICB2YXIgZGVjb2RlciA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYyhbMCwgMSwgMl0pOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtkZWNvZGVyLnJlYWRVaW50NjQoKX0pOwotCi0gICAgLy8gT3ZlcmxvbmcgdmFyaW50cyBzaG91bGQgdHJpZ2dlciBhc3NlcnRpb25zLgotICAgIGRlY29kZXIuc2V0QmxvY2soWzI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsCi0gICAgICAgICAgICAgICAgICAgICAgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDBdKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7ZGVjb2Rlci5yZWFkVW5zaWduZWRWYXJpbnQ2NCgpfSk7Ci0gICAgZGVjb2Rlci5yZXNldCgpOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtkZWNvZGVyLnJlYWRTaWduZWRWYXJpbnQ2NCgpfSk7Ci0gICAgZGVjb2Rlci5yZXNldCgpOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtkZWNvZGVyLnJlYWRaaWd6YWdWYXJpbnQ2NCgpfSk7Ci0KLSAgICAvLyBQb3NpdGl2ZSAzMi1iaXQgdmFyaW50cyBlbmNvZGVkIHdpdGggMSBiaXRzIGluIHBvc2l0aW9ucyAzMyB0aHJvdWdoIDM1Ci0gICAgLy8gc2hvdWxkIHRyaWdnZXIgYXNzZXJ0aW9ucy4KLSAgICBkZWNvZGVyLnNldEJsb2NrKFsyNTUsIDI1NSwgMjU1LCAyNTUsIDB4MUZdKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7ZGVjb2Rlci5yZWFkVW5zaWduZWRWYXJpbnQzMigpfSk7Ci0KLSAgICBkZWNvZGVyLnNldEJsb2NrKFsyNTUsIDI1NSwgMjU1LCAyNTUsIDB4MkZdKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7ZGVjb2Rlci5yZWFkVW5zaWduZWRWYXJpbnQzMigpfSk7Ci0KLSAgICBkZWNvZGVyLnNldEJsb2NrKFsyNTUsIDI1NSwgMjU1LCAyNTUsIDB4NEZdKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7ZGVjb2Rlci5yZWFkVW5zaWduZWRWYXJpbnQzMigpfSk7Ci0KLSAgICAvLyBOZWdhdGl2ZSAzMi1iaXQgdmFyaW50cyBlbmNvZGVkIHdpdGggbm9uLTEgYml0cyBpbiB0aGUgaGlnaCBkd29yZCBzaG91bGQKLSAgICAvLyB0cmlnZ2VyIGFzc2VydGlvbnMuCi0gICAgZGVjb2Rlci5zZXRCbG9jayhbMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMCwgMjU1LCAyNTUsIDFdKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7ZGVjb2Rlci5yZWFkVW5zaWduZWRWYXJpbnQzMigpfSk7Ci0KLSAgICBkZWNvZGVyLnNldEJsb2NrKFsyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAyNTUsIDI1NSwgMjU1LCAwXSk7Ci0gICAgYXNzZXJ0VGhyb3dzKGZ1bmN0aW9uKCkge2RlY29kZXIucmVhZFVuc2lnbmVkVmFyaW50MzIoKX0pOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2YgdW5zaWduZWQgaW50ZWdlcnMuCi0gICAqLwotICBpdCgndGVzdFVuc2lnbmVkSW50ZWdlcnMnLCBmdW5jdGlvbigpIHsKLSAgICBkb1Rlc3RVbnNpZ25lZFZhbHVlKAotICAgICAgICBqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVaW50OCwKLSAgICAgICAganNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVpbnQ4LAotICAgICAgICAxLCAweEZGLCBNYXRoLnJvdW5kKTsKLQotICAgIGRvVGVzdFVuc2lnbmVkVmFsdWUoCi0gICAgICAgIGpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFVpbnQxNiwKLSAgICAgICAganNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVpbnQxNiwKLSAgICAgICAgMSwgMHhGRkZGLCBNYXRoLnJvdW5kKTsKLQotICAgIGRvVGVzdFVuc2lnbmVkVmFsdWUoCi0gICAgICAgIGpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZFVpbnQzMiwKLSAgICAgICAganNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVpbnQzMiwKLSAgICAgICAgMSwgMHhGRkZGRkZGRiwgTWF0aC5yb3VuZCk7Ci0KLSAgICBkb1Rlc3RVbnNpZ25lZFZhbHVlKAotICAgICAgICBqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRVaW50NjQsCi0gICAgICAgIGpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVVaW50NjQsCi0gICAgICAgIDEsIE1hdGgucG93KDIsIDY0KSAtIDEwMjUsIE1hdGgucm91bmQpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBlbmNvZGluZyBhbmQgZGVjb2Rpbmcgb2Ygc2lnbmVkIGludGVnZXJzLgotICAgKi8KLSAgaXQoJ3Rlc3RTaWduZWRJbnRlZ2VycycsIGZ1bmN0aW9uKCkgewotICAgIGRvVGVzdFNpZ25lZFZhbHVlKAotICAgICAgICBqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRJbnQ4LAotICAgICAgICBqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlSW50OCwKLSAgICAgICAgMSwgLTB4ODAsIDB4N0YsIE1hdGgucm91bmQpOwotCi0gICAgZG9UZXN0U2lnbmVkVmFsdWUoCi0gICAgICAgIGpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZEludDE2LAotICAgICAgICBqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlSW50MTYsCi0gICAgICAgIDEsIC0weDgwMDAsIDB4N0ZGRiwgTWF0aC5yb3VuZCk7Ci0KLSAgICBkb1Rlc3RTaWduZWRWYWx1ZSgKLSAgICAgICAganNwYi5CaW5hcnlEZWNvZGVyLnByb3RvdHlwZS5yZWFkSW50MzIsCi0gICAgICAgIGpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVJbnQzMiwKLSAgICAgICAgMSwgLTB4ODAwMDAwMDAsIDB4N0ZGRkZGRkYsIE1hdGgucm91bmQpOwotCi0gICAgZG9UZXN0U2lnbmVkVmFsdWUoCi0gICAgICAgIGpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZEludDY0LAotICAgICAgICBqc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlSW50NjQsCi0gICAgICAgIDEsIC1NYXRoLnBvdygyLCA2MyksIE1hdGgucG93KDIsIDYzKSAtIDUxMywgTWF0aC5yb3VuZCk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiBmbG9hdHMuCi0gICAqLwotICBpdCgndGVzdEZsb2F0cycsIGZ1bmN0aW9uKCkgewotICAgIC8qKgotICAgICAqIEBwYXJhbSB7bnVtYmVyfSB4Ci0gICAgICogQHJldHVybiB7bnVtYmVyfQotICAgICAqLwotICAgIGZ1bmN0aW9uIHRydW5jYXRlKHgpIHsKLSAgICAgIHZhciB0ZW1wID0gbmV3IEZsb2F0MzJBcnJheSgxKTsKLSAgICAgIHRlbXBbMF0gPSB4OwotICAgICAgcmV0dXJuIHRlbXBbMF07Ci0gICAgfQotICAgIGRvVGVzdFNpZ25lZFZhbHVlKAotICAgICAgICBqc3BiLkJpbmFyeURlY29kZXIucHJvdG90eXBlLnJlYWRGbG9hdCwKLSAgICAgICAganNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZUZsb2F0LAotICAgICAgICBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDMyX0VQUywKLSAgICAgICAgLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfTUFYLAotICAgICAgICBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDMyX01BWCwKLSAgICAgICAgdHJ1bmNhdGUpOwotCi0gICAgZG9UZXN0U2lnbmVkVmFsdWUoCi0gICAgICAgIGpzcGIuQmluYXJ5RGVjb2Rlci5wcm90b3R5cGUucmVhZERvdWJsZSwKLSAgICAgICAganNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZURvdWJsZSwKLSAgICAgICAganNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQ2NF9FUFMgKiAxMCwKLSAgICAgICAgLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUFYLAotICAgICAgICBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDY0X01BWCwKLSAgICAgICAgZnVuY3Rpb24oeCkgeyByZXR1cm4geDsgfSk7Ci0gIH0pOwotfSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvZW5jb2Rlci5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9lbmNvZGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWIwYzJhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9lbmNvZGVyLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDMwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgQmluYXJ5RW5jb2RlIGRlZmluZXMgbWV0aG9kcyBmb3IgZW5jb2RpbmcgSmF2YXNjcmlwdCB2YWx1ZXMKLSAqIGludG8gYXJyYXlzIG9mIGJ5dGVzIGNvbXBhdGlibGUgd2l0aCB0aGUgUHJvdG9jb2wgQnVmZmVyIHdpcmUgZm9ybWF0LgotICoKLSAqIEBhdXRob3IgYWFwcGxlYnlAZ29vZ2xlLmNvbSAoQXVzdGluIEFwcGxlYnkpCi0gKi8KLQotZ29vZy5wcm92aWRlKCdqc3BiLkJpbmFyeUVuY29kZXInKTsKLQotZ29vZy5yZXF1aXJlKCdnb29nLmFzc2VydHMnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlDb25zdGFudHMnKTsKLWdvb2cucmVxdWlyZSgnanNwYi51dGlscycpOwotCi0KLQotLyoqCi0gKiBCaW5hcnlFbmNvZGVyIGltcGxlbWVudHMgZW5jb2RlcnMgZm9yIGFsbCB0aGUgd2lyZSB0eXBlcyBzcGVjaWZpZWQgaW4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9lbmNvZGluZy4KLSAqCi0gKiBAY29uc3RydWN0b3IKLSAqIEBzdHJ1Y3QKLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyID0gZnVuY3Rpb24oKSB7Ci0gIC8qKiBAcHJpdmF0ZSB7IUFycmF5LjxudW1iZXI+fSAqLwotICB0aGlzLmJ1ZmZlcl8gPSBbXTsKLX07Ci0KLQotLyoqCi0gKiBAcmV0dXJuIHtudW1iZXJ9Ci0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUubGVuZ3RoID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLmJ1ZmZlcl8ubGVuZ3RoOwotfTsKLQotCi0vKioKLSAqIEByZXR1cm4geyFBcnJheS48bnVtYmVyPn0KLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS5lbmQgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGJ1ZmZlciA9IHRoaXMuYnVmZmVyXzsKLSAgdGhpcy5idWZmZXJfID0gW107Ci0gIHJldHVybiBidWZmZXI7Ci19OwotCi0KLS8qKgotICogRW5jb2RlcyBhIDY0LWJpdCBpbnRlZ2VyIGluIDMyOjMyIHNwbGl0IHJlcHJlc2VudGF0aW9uIGludG8gaXRzIHdpcmUtZm9ybWF0Ci0gKiB2YXJpbnQgcmVwcmVzZW50YXRpb24gYW5kIHN0b3JlcyBpdCBpbiB0aGUgYnVmZmVyLgotICogQHBhcmFtIHtudW1iZXJ9IGxvd0JpdHMgVGhlIGxvdyAzMiBiaXRzIG9mIHRoZSBpbnQuCi0gKiBAcGFyYW0ge251bWJlcn0gaGlnaEJpdHMgVGhlIGhpZ2ggMzIgYml0cyBvZiB0aGUgaW50LgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlU3BsaXRWYXJpbnQ2NCA9IGZ1bmN0aW9uKGxvd0JpdHMsIGhpZ2hCaXRzKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQobG93Qml0cyA9PSBNYXRoLmZsb29yKGxvd0JpdHMpKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydChoaWdoQml0cyA9PSBNYXRoLmZsb29yKGhpZ2hCaXRzKSk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKGxvd0JpdHMgPj0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAobG93Qml0cyA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMikpOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KChoaWdoQml0cyA+PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgIChoaWdoQml0cyA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMikpOwotCi0gIC8vIEJyZWFrIHRoZSBiaW5hcnkgcmVwcmVzZW50YXRpb24gaW50byBjaHVua3Mgb2YgNyBiaXRzLCBzZXQgdGhlIDh0aCBiaXQKLSAgLy8gaW4gZWFjaCBjaHVuayBpZiBpdCdzIG5vdCB0aGUgZmluYWwgY2h1bmssIGFuZCBhcHBlbmQgdG8gdGhlIHJlc3VsdC4KLSAgd2hpbGUgKGhpZ2hCaXRzID4gMCB8fCBsb3dCaXRzID4gMTI3KSB7Ci0gICAgdGhpcy5idWZmZXJfLnB1c2goKGxvd0JpdHMgJiAweDdmKSB8IDB4ODApOwotICAgIGxvd0JpdHMgPSAoKGxvd0JpdHMgPj4+IDcpIHwgKGhpZ2hCaXRzIDw8IDI1KSkgPj4+IDA7Ci0gICAgaGlnaEJpdHMgPSBoaWdoQml0cyA+Pj4gNzsKLSAgfQotICB0aGlzLmJ1ZmZlcl8ucHVzaChsb3dCaXRzKTsKLX07Ci0KLQotLyoqCi0gKiBFbmNvZGVzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgaW50byBpdHMgd2lyZS1mb3JtYXQgdmFyaW50IHJlcHJlc2VudGF0aW9uCi0gKiBhbmQgc3RvcmVzIGl0IGluIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIGludGVnZXIgdG8gY29udmVydC4KLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVuc2lnbmVkVmFyaW50MzIgPSBmdW5jdGlvbih2YWx1ZSkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KHZhbHVlID09IE1hdGguZmxvb3IodmFsdWUpKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIpKTsKLQotICB3aGlsZSAodmFsdWUgPiAxMjcpIHsKLSAgICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgJiAweDdmKSB8IDB4ODApOwotICAgIHZhbHVlID0gdmFsdWUgPj4+IDc7Ci0gIH0KLQotICB0aGlzLmJ1ZmZlcl8ucHVzaCh2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogRW5jb2RlcyBhIDMyLWJpdCBzaWduZWQgaW50ZWdlciBpbnRvIGl0cyB3aXJlLWZvcm1hdCB2YXJpbnQgcmVwcmVzZW50YXRpb24KLSAqIGFuZCBzdG9yZXMgaXQgaW4gdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgaW50ZWdlciB0byBjb252ZXJ0LgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlU2lnbmVkVmFyaW50MzIgPSBmdW5jdGlvbih2YWx1ZSkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KHZhbHVlID09IE1hdGguZmxvb3IodmFsdWUpKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gLWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpKTsKLQotICAvLyBVc2UgdGhlIHVuc2lnbmVkIHZlcnNpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCBuZWdhdGl2ZS4KLSAgaWYgKHZhbHVlID49IDApIHsKLSAgICB0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMih2YWx1ZSk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gV3JpdGUgbmluZSBieXRlcyB3aXRoIGEgX3NpZ25lZF8gcmlnaHQgc2hpZnQgc28gd2UgcHJlc2VydmUgdGhlIHNpZ24gYml0LgotICBmb3IgKHZhciBpID0gMDsgaSA8IDk7IGkrKykgewotICAgIHRoaXMuYnVmZmVyXy5wdXNoKCh2YWx1ZSAmIDB4N2YpIHwgMHg4MCk7Ci0gICAgdmFsdWUgPSB2YWx1ZSA+PiA3OwotICB9Ci0KLSAgLy8gVGhlIGFib3ZlIGxvb3Agd3JpdGVzIG91dCA2MyBiaXRzLCBzbyB0aGUgbGFzdCBieXRlIGlzIGFsd2F5cyB0aGUgc2lnbiBiaXQKLSAgLy8gd2hpY2ggaXMgYWx3YXlzIHNldCBmb3IgbmVnYXRpdmUgbnVtYmVycy4KLSAgdGhpcy5idWZmZXJfLnB1c2goMSk7Ci19OwotCi0KLS8qKgotICogRW5jb2RlcyBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGludG8gaXRzIHdpcmUtZm9ybWF0IHZhcmludCByZXByZXNlbnRhdGlvbgotICogYW5kIHN0b3JlcyBpdCBpbiB0aGUgYnVmZmVyLiBJbnRlZ2VycyB0aGF0IGFyZSBub3QgcmVwcmVzZW50YWJsZSBpbiA2NCBiaXRzCi0gKiB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgaW50ZWdlciB0byBjb252ZXJ0LgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlVW5zaWduZWRWYXJpbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodmFsdWUgPT0gTWF0aC5mbG9vcih2YWx1ZSkpOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182NCkpOwotICBqc3BiLnV0aWxzLnNwbGl0SW50NjQodmFsdWUpOwotICB0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChqc3BiLnV0aWxzLnNwbGl0NjRMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpOwotfTsKLQotCi0vKioKLSAqIEVuY29kZXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIgaW50byBpdHMgd2lyZS1mb3JtYXQgdmFyaW50IHJlcHJlc2VudGF0aW9uCi0gKiBhbmQgc3RvcmVzIGl0IGluIHRoZSBidWZmZXIuIEludGVnZXJzIHRoYXQgYXJlIG5vdCByZXByZXNlbnRhYmxlIGluIDY0IGJpdHMKLSAqIHdpbGwgYmUgdHJ1bmNhdGVkLgotICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBpbnRlZ2VyIHRvIGNvbnZlcnQuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVTaWduZWRWYXJpbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodmFsdWUgPT0gTWF0aC5mbG9vcih2YWx1ZSkpOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MykpOwotICBqc3BiLnV0aWxzLnNwbGl0SW50NjQodmFsdWUpOwotICB0aGlzLndyaXRlU3BsaXRWYXJpbnQ2NChqc3BiLnV0aWxzLnNwbGl0NjRMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpOwotfTsKLQotCi0vKioKLSAqIEVuY29kZXMgYSBKYXZhU2NyaXB0IGludGVnZXIgaW50byBpdHMgd2lyZS1mb3JtYXQsIHppZ3phZy1lbmNvZGVkIHZhcmludAotICogcmVwcmVzZW50YXRpb24gYW5kIHN0b3JlcyBpdCBpbiB0aGUgYnVmZmVyLgotICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBpbnRlZ2VyIHRvIGNvbnZlcnQuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVaaWd6YWdWYXJpbnQzMiA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodmFsdWUgPT0gTWF0aC5mbG9vcih2YWx1ZSkpOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSkpOwotICB0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMigoKHZhbHVlIDw8IDEpIF4gKHZhbHVlID4+IDMxKSkgPj4+IDApOwotfTsKLQotCi0vKioKLSAqIEVuY29kZXMgYSBKYXZhU2NyaXB0IGludGVnZXIgaW50byBpdHMgd2lyZS1mb3JtYXQsIHppZ3phZy1lbmNvZGVkIHZhcmludAotICogcmVwcmVzZW50YXRpb24gYW5kIHN0b3JlcyBpdCBpbiB0aGUgYnVmZmVyLiBJbnRlZ2VycyBub3QgcmVwcmVzZW50YWJsZSBpbiA2NAotICogYml0cyB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgaW50ZWdlciB0byBjb252ZXJ0LgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlWmlnemFnVmFyaW50NjQgPSBmdW5jdGlvbih2YWx1ZSkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KHZhbHVlID09IE1hdGguZmxvb3IodmFsdWUpKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gLWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MykgJiYKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNjMpKTsKLSAganNwYi51dGlscy5zcGxpdFppZ3phZzY0KHZhbHVlKTsKLSAgdGhpcy53cml0ZVNwbGl0VmFyaW50NjQoanNwYi51dGlscy5zcGxpdDY0TG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSA4LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHRvIHRoZSBidWZmZXIuIE51bWJlcnMgb3V0c2lkZSB0aGUgcmFuZ2UKLSAqIFswLDJeOCkgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlVWludDggPSBmdW5jdGlvbih2YWx1ZSkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KHZhbHVlID09IE1hdGguZmxvb3IodmFsdWUpKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gMCkgJiYgKHZhbHVlIDwgMjU2KSk7Ci0gIHRoaXMuYnVmZmVyXy5wdXNoKCh2YWx1ZSA+Pj4gMCkgJiAweEZGKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSAxNi1iaXQgdW5zaWduZWQgaW50ZWdlciB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUgdGhlCi0gKiByYW5nZSBbMCwyXjE2KSB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVVaW50MTYgPSBmdW5jdGlvbih2YWx1ZSkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KHZhbHVlID09IE1hdGguZmxvb3IodmFsdWUpKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gMCkgJiYgKHZhbHVlIDwgNjU1MzYpKTsKLSAgdGhpcy5idWZmZXJfLnB1c2goKHZhbHVlID4+PiAwKSAmIDB4RkYpOwotICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgPj4+IDgpICYgMHhGRik7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIgdG8gdGhlIGJ1ZmZlci4gTnVtYmVycyBvdXRzaWRlIHRoZQotICogcmFuZ2UgWzAsMl4zMikgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlVWludDMyID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh2YWx1ZSA9PSBNYXRoLmZsb29yKHZhbHVlKSk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKHZhbHVlID49IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDwganNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKSk7Ci0gIHRoaXMuYnVmZmVyXy5wdXNoKCh2YWx1ZSA+Pj4gMCkgJiAweEZGKTsKLSAgdGhpcy5idWZmZXJfLnB1c2goKHZhbHVlID4+PiA4KSAmIDB4RkYpOwotICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgPj4+IDE2KSAmIDB4RkYpOwotICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgPj4+IDI0KSAmIDB4RkYpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIHRvIHRoZSBidWZmZXIuIE51bWJlcnMgb3V0c2lkZSB0aGUKLSAqIHJhbmdlIFswLDJeNjQpIHdpbGwgYmUgdHJ1bmNhdGVkLgotICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVVpbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodmFsdWUgPT0gTWF0aC5mbG9vcih2YWx1ZSkpOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182NCkpOwotICBqc3BiLnV0aWxzLnNwbGl0VWludDY0KHZhbHVlKTsKLSAgdGhpcy53cml0ZVVpbnQzMihqc3BiLnV0aWxzLnNwbGl0NjRMb3cpOwotICB0aGlzLndyaXRlVWludDMyKGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIDgtYml0IGludGVnZXIgdG8gdGhlIGJ1ZmZlci4gTnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZQotICogWy0yXjcsMl43KSB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVJbnQ4ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh2YWx1ZSA9PSBNYXRoLmZsb29yKHZhbHVlKSk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKHZhbHVlID49IC0xMjgpICYmICh2YWx1ZSA8IDEyOCkpOwotICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgPj4+IDApICYgMHhGRik7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgMTYtYml0IGludGVnZXIgdG8gdGhlIGJ1ZmZlci4gTnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZQotICogWy0yXjE1LDJeMTUpIHdpbGwgYmUgdHJ1bmNhdGVkLgotICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZUludDE2ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh2YWx1ZSA9PSBNYXRoLmZsb29yKHZhbHVlKSk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKHZhbHVlID49IC0zMjc2OCkgJiYgKHZhbHVlIDwgMzI3NjgpKTsKLSAgdGhpcy5idWZmZXJfLnB1c2goKHZhbHVlID4+PiAwKSAmIDB4RkYpOwotICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgPj4+IDgpICYgMHhGRik7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgMzItYml0IGludGVnZXIgdG8gdGhlIGJ1ZmZlci4gTnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZQotICogWy0yXjMxLDJeMzEpIHdpbGwgYmUgdHJ1bmNhdGVkLgotICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZUludDMyID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh2YWx1ZSA9PSBNYXRoLmZsb29yKHZhbHVlKSk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKHZhbHVlID49IC1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDwganNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxKSk7Ci0gIHRoaXMuYnVmZmVyXy5wdXNoKCh2YWx1ZSA+Pj4gMCkgJiAweEZGKTsKLSAgdGhpcy5idWZmZXJfLnB1c2goKHZhbHVlID4+PiA4KSAmIDB4RkYpOwotICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgPj4+IDE2KSAmIDB4RkYpOwotICB0aGlzLmJ1ZmZlcl8ucHVzaCgodmFsdWUgPj4+IDI0KSAmIDB4RkYpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIDY0LWJpdCBpbnRlZ2VyIHRvIHRoZSBidWZmZXIuIE51bWJlcnMgb3V0c2lkZSB0aGUgcmFuZ2UKLSAqIFstMl42MywyXjYzKSB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVJbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodmFsdWUgPT0gTWF0aC5mbG9vcih2YWx1ZSkpOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MykpOwotICBqc3BiLnV0aWxzLnNwbGl0SW50NjQodmFsdWUpOwotICB0aGlzLndyaXRlVWludDMyKGpzcGIudXRpbHMuc3BsaXQ2NExvdyk7Ci0gIHRoaXMud3JpdGVVaW50MzIoanNwYi51dGlscy5zcGxpdDY0SGlnaCk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgc2luZ2xlLXByZWNpc2lvbiBmbG9hdGluZyBwb2ludCB2YWx1ZSB0byB0aGUgYnVmZmVyLiBOdW1iZXJzCi0gKiByZXF1aXJpbmcgbW9yZSB0aGFuIDMyIGJpdHMgb2YgcHJlY2lzaW9uIHdpbGwgYmUgdHJ1bmNhdGVkLgotICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZUZsb2F0ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfTUFYKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDMyX01BWCkpOwotICBqc3BiLnV0aWxzLnNwbGl0RmxvYXQzMih2YWx1ZSk7Ci0gIHRoaXMud3JpdGVVaW50MzIoanNwYi51dGlscy5zcGxpdDY0TG93KTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IHZhbHVlIHRvIHRoZSBidWZmZXIuIEFzIHRoaXMgaXMKLSAqIHRoZSBuYXRpdmUgZm9ybWF0IHVzZWQgYnkgSmF2YVNjcmlwdCwgbm8gcHJlY2lzaW9uIHdpbGwgYmUgbG9zdC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVEb3VibGUgPSBmdW5jdGlvbih2YWx1ZSkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQ2NF9NQVgpICYmCi0gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDw9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUFYKSk7Ci0gIGpzcGIudXRpbHMuc3BsaXRGbG9hdDY0KHZhbHVlKTsKLSAgdGhpcy53cml0ZVVpbnQzMihqc3BiLnV0aWxzLnNwbGl0NjRMb3cpOwotICB0aGlzLndyaXRlVWludDMyKGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIGJvb2xlYW4gdmFsdWUgdG8gdGhlIGJ1ZmZlciBhcyBhIHZhcmludC4KLSAqIEBwYXJhbSB7Ym9vbGVhbn0gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlQm9vbCA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoZ29vZy5pc0Jvb2xlYW4odmFsdWUpKTsKLSAgdGhpcy5idWZmZXJfLnB1c2godmFsdWUgPyAxIDogMCk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGVudW0gdmFsdWUgdG8gdGhlIGJ1ZmZlciBhcyBhIHZhcmludC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVFbnVtID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh2YWx1ZSA9PSBNYXRoLmZsb29yKHZhbHVlKSk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKHZhbHVlID49IC1qc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpICYmCi0gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDwganNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxKSk7Ci0gIHRoaXMud3JpdGVTaWduZWRWYXJpbnQzMih2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFyYml0cmFyeSBieXRlIGFycmF5IHRvIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0geyFVaW50OEFycmF5fSBieXRlcyBUaGUgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVCeXRlcyA9IGZ1bmN0aW9uKGJ5dGVzKSB7Ci0gIHRoaXMuYnVmZmVyXy5wdXNoLmFwcGx5KHRoaXMuYnVmZmVyXywgYnl0ZXMpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIDY0LWJpdCBoYXNoIHN0cmluZyAoOCBjaGFyYWN0ZXJzIEAgOCBiaXRzIG9mIGRhdGEgZWFjaCkgdG8gdGhlCi0gKiBidWZmZXIgYXMgYSB2YXJpbnQuCi0gKiBAcGFyYW0ge3N0cmluZ30gaGFzaCBUaGUgaGFzaCB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlFbmNvZGVyLnByb3RvdHlwZS53cml0ZVZhcmludEhhc2g2NCA9IGZ1bmN0aW9uKGhhc2gpIHsKLSAganNwYi51dGlscy5zcGxpdEhhc2g2NChoYXNoKTsKLSAgdGhpcy53cml0ZVNwbGl0VmFyaW50NjQoanNwYi51dGlscy5zcGxpdDY0TG93LAotICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSA2NC1iaXQgaGFzaCBzdHJpbmcgKDggY2hhcmFjdGVycyBAIDggYml0cyBvZiBkYXRhIGVhY2gpIHRvIHRoZQotICogYnVmZmVyIGFzIGEgZml4ZWQ2NC4KLSAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoIFRoZSBoYXNoIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeUVuY29kZXIucHJvdG90eXBlLndyaXRlRml4ZWRIYXNoNjQgPSBmdW5jdGlvbihoYXNoKSB7Ci0gIGpzcGIudXRpbHMuc3BsaXRIYXNoNjQoaGFzaCk7Ci0gIHRoaXMud3JpdGVVaW50MzIoanNwYi51dGlscy5zcGxpdDY0TG93KTsKLSAgdGhpcy53cml0ZVVpbnQzMihqc3BiLnV0aWxzLnNwbGl0NjRIaWdoKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBVVEYxNiBKYXZhc2NyaXB0IHN0cmluZyB0byB0aGUgYnVmZmVyIGVuY29kZWQgYXMgVVRGOC4KLSAqIFRPRE8oYWFwcGxlYnkpOiBBZGQgc3VwcG9ydCBmb3Igc3Vycm9nYXRlIHBhaXJzLCByZWplY3QgdW5wYWlyZWQgc3Vycm9nYXRlcy4KLSAqIEBwYXJhbSB7c3RyaW5nfSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHdyaXRlLgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgdG8gZW5jb2RlIHRoZSBzdHJpbmcuCi0gKi8KLWpzcGIuQmluYXJ5RW5jb2Rlci5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbih2YWx1ZSkgewotICB2YXIgb2xkTGVuZ3RoID0gdGhpcy5idWZmZXJfLmxlbmd0aDsKLQotICAvLyBVVEYxNiB0byBVVEY4IGNvbnZlcnNpb24gbG9vcCBzd2lwZWQgZnJvbSBnb29nLmNyeXB0LnN0cmluZ1RvVXRmOEJ5dGVBcnJheS4KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHZhciBjID0gdmFsdWUuY2hhckNvZGVBdChpKTsKLSAgICBpZiAoYyA8IDEyOCkgewotICAgICAgdGhpcy5idWZmZXJfLnB1c2goYyk7Ci0gICAgfSBlbHNlIGlmIChjIDwgMjA0OCkgewotICAgICAgdGhpcy5idWZmZXJfLnB1c2goKGMgPj4gNikgfCAxOTIpOwotICAgICAgdGhpcy5idWZmZXJfLnB1c2goKGMgJiA2MykgfCAxMjgpOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmJ1ZmZlcl8ucHVzaCgoYyA+PiAxMikgfCAyMjQpOwotICAgICAgdGhpcy5idWZmZXJfLnB1c2goKChjID4+IDYpICYgNjMpIHwgMTI4KTsKLSAgICAgIHRoaXMuYnVmZmVyXy5wdXNoKChjICYgNjMpIHwgMTI4KTsKLSAgICB9Ci0gIH0KLQotICB2YXIgbGVuZ3RoID0gdGhpcy5idWZmZXJfLmxlbmd0aCAtIG9sZExlbmd0aDsKLSAgcmV0dXJuIGxlbmd0aDsKLX07CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvcHJvdG9fdGVzdC5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9wcm90b190ZXN0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGQwZjQyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9wcm90b190ZXN0LmpzCisrKyAvZGV2L251bGwKQEAgLTEsNjI4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUZXN0IHN1aXRlIGlzIHdyaXR0ZW4gdXNpbmcgSmFzbWluZSAtLSBzZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLwotCi1nb29nLnJlcXVpcmUoJ2dvb2cuY3J5cHQuYmFzZTY0Jyk7Ci1nb29nLnJlcXVpcmUoJ2dvb2cudGVzdGluZy5hc3NlcnRzJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuTWVzc2FnZScpOwotCi0vLyBDb21tb25KUy1Mb2FkRnJvbUZpbGU6IC4uL3Rlc3RiaW5hcnlfcGIgcHJvdG8uanNwYi50ZXN0Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5FeHRlbmRzV2l0aE1lc3NhZ2UnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LkZvcmVpZ25FbnVtJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5Gb3JlaWduTWVzc2FnZScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuVGVzdEFsbFR5cGVzJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5UZXN0RXh0ZW5kYWJsZScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxCb29sJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbEJ5dGVzJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbERvdWJsZScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxGaXhlZDMyJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbEZpeGVkNjQnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsRmxvYXQnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsRm9yZWlnbkVudW0nKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsSW50MzInKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsSW50NjQnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU2ZpeGVkMzInKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU2ZpeGVkNjQnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU2ludDMyJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbFNpbnQ2NCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxTdHJpbmcnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsVWludDMyJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbFVpbnQ2NCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRCb29sTGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWREb3VibGVMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEZpeGVkMzJMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEZpeGVkNjRMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEZsb2F0TGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRGb3JlaWduRW51bUxpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkSW50MzJMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEludDY0TGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRTZml4ZWQzMkxpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkU2ZpeGVkNjRMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZFNpbnQzMkxpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkU2ludDY0TGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRVaW50MzJMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZFVpbnQ2NExpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkQm9vbExpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkQnl0ZXNMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZERvdWJsZUxpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkRml4ZWQzMkxpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkRml4ZWQ2NExpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkRmxvYXRMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRJbnQzMkxpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkSW50NjRMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZFNmaXhlZDMyTGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRTZml4ZWQ2NExpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkU2ludDMyTGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRTaW50NjRMaXN0Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZFN0cmluZ0xpc3QnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkVWludDMyTGlzdCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRVaW50NjRMaXN0Jyk7Ci0KLQotdmFyIHN1aXRlID0ge307Ci0KLXZhciBCWVRFUyA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCA4LCA5XSk7Ci0KLXZhciBCWVRFU19CNjQgPSBnb29nLmNyeXB0LmJhc2U2NC5lbmNvZGVCeXRlQXJyYXkoQllURVMpOwotCi0KLS8qKgotICogSGVscGVyOiBmaWxsIGFsbCBmaWVsZHMgb24gYSBUZXN0QWxsVHlwZXMgbWVzc2FnZS4KLSAqIEBwYXJhbSB7cHJvdG8uanNwYi50ZXN0LlRlc3RBbGxUeXBlc30gbXNnCi0gKi8KLWZ1bmN0aW9uIGZpbGxBbGxGaWVsZHMobXNnKSB7Ci0gIG1zZy5zZXRPcHRpb25hbEludDMyKC00Mik7Ci0gIC8vIGNhbiBiZSBleGFjdGx5IHJlcHJlc2VudGVkIGJ5IEpTIG51bWJlciAoNjQtYml0IGRvdWJsZSwgaS5lLiwgNTItYml0Ci0gIC8vIG1hbnRpc3NhKS4KLSAgbXNnLnNldE9wdGlvbmFsSW50NjQoLTB4N2ZmZmZmZmYwMDAwMDAwMCk7Ci0gIG1zZy5zZXRPcHRpb25hbFVpbnQzMigweDgwMDAwMDAwKTsKLSAgbXNnLnNldE9wdGlvbmFsVWludDY0KDB4ZjAwMDAwMDAwMDAwMDAwMCk7Ci0gIG1zZy5zZXRPcHRpb25hbFNpbnQzMigtMTAwKTsKLSAgbXNnLnNldE9wdGlvbmFsU2ludDY0KC0weDgwMDAwMDAwMDAwMDAwMDApOwotICBtc2cuc2V0T3B0aW9uYWxGaXhlZDMyKDEyMzQpOwotICBtc2cuc2V0T3B0aW9uYWxGaXhlZDY0KDB4MTIzNDU2NzgwMDAwMDAwMCk7Ci0gIG1zZy5zZXRPcHRpb25hbFNmaXhlZDMyKC0xMjM0KTsKLSAgbXNnLnNldE9wdGlvbmFsU2ZpeGVkNjQoLTB4MTIzNDU2NzgwMDAwMDAwMCk7Ci0gIG1zZy5zZXRPcHRpb25hbEZsb2F0KDEuNSk7Ci0gIG1zZy5zZXRPcHRpb25hbERvdWJsZSgtMS41KTsKLSAgbXNnLnNldE9wdGlvbmFsQm9vbCh0cnVlKTsKLSAgbXNnLnNldE9wdGlvbmFsU3RyaW5nKCdoZWxsbyB3b3JsZCcpOwotICBtc2cuc2V0T3B0aW9uYWxCeXRlcyhCWVRFUyk7Ci0gIG1zZy5zZXRPcHRpb25hbEdyb3VwKG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAoKSk7Ci0gIG1zZy5nZXRPcHRpb25hbEdyb3VwKCkuc2V0QSgxMDApOwotICB2YXIgc3VibXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5Gb3JlaWduTWVzc2FnZSgpOwotICBzdWJtc2cuc2V0QygxNik7Ci0gIG1zZy5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKHN1Ym1zZyk7Ci0gIG1zZy5zZXRPcHRpb25hbEZvcmVpZ25FbnVtKHByb3RvLmpzcGIudGVzdC5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPTyk7Ci0gIG1zZy5zZXRPbmVvZlN0cmluZygnb25lb2YnKTsKLQotCi0gIG1zZy5zZXRSZXBlYXRlZEludDMyTGlzdChbLTQyXSk7Ci0gIG1zZy5zZXRSZXBlYXRlZEludDY0TGlzdChbLTB4N2ZmZmZmZmYwMDAwMDAwMF0pOwotICBtc2cuc2V0UmVwZWF0ZWRVaW50MzJMaXN0KFsweDgwMDAwMDAwXSk7Ci0gIG1zZy5zZXRSZXBlYXRlZFVpbnQ2NExpc3QoWzB4ZjAwMDAwMDAwMDAwMDAwMF0pOwotICBtc2cuc2V0UmVwZWF0ZWRTaW50MzJMaXN0KFstMTAwXSk7Ci0gIG1zZy5zZXRSZXBlYXRlZFNpbnQ2NExpc3QoWy0weDgwMDAwMDAwMDAwMDAwMDBdKTsKLSAgbXNnLnNldFJlcGVhdGVkRml4ZWQzMkxpc3QoWzEyMzRdKTsKLSAgbXNnLnNldFJlcGVhdGVkRml4ZWQ2NExpc3QoWzB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICBtc2cuc2V0UmVwZWF0ZWRTZml4ZWQzMkxpc3QoWy0xMjM0XSk7Ci0gIG1zZy5zZXRSZXBlYXRlZFNmaXhlZDY0TGlzdChbLTB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICBtc2cuc2V0UmVwZWF0ZWRGbG9hdExpc3QoWzEuNV0pOwotICBtc2cuc2V0UmVwZWF0ZWREb3VibGVMaXN0KFstMS41XSk7Ci0gIG1zZy5zZXRSZXBlYXRlZEJvb2xMaXN0KFt0cnVlXSk7Ci0gIG1zZy5zZXRSZXBlYXRlZFN0cmluZ0xpc3QoWydoZWxsbyB3b3JsZCddKTsKLSAgbXNnLnNldFJlcGVhdGVkQnl0ZXNMaXN0KFtCWVRFUywgQllURVNdKTsKLSAgbXNnLnNldFJlcGVhdGVkR3JvdXBMaXN0KFtuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKCldKTsKLSAgbXNnLmdldFJlcGVhdGVkR3JvdXBMaXN0KClbMF0uc2V0QSgxMDApOwotICBzdWJtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkZvcmVpZ25NZXNzYWdlKCk7Ci0gIHN1Ym1zZy5zZXRDKDEwMDApOwotICBtc2cuc2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QoW3N1Ym1zZ10pOwotICBtc2cuc2V0UmVwZWF0ZWRGb3JlaWduRW51bUxpc3QoW3Byb3RvLmpzcGIudGVzdC5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPT10pOwotCi0gIG1zZy5zZXRQYWNrZWRSZXBlYXRlZEludDMyTGlzdChbLTQyXSk7Ci0gIG1zZy5zZXRQYWNrZWRSZXBlYXRlZEludDY0TGlzdChbLTB4N2ZmZmZmZmYwMDAwMDAwMF0pOwotICBtc2cuc2V0UGFja2VkUmVwZWF0ZWRVaW50MzJMaXN0KFsweDgwMDAwMDAwXSk7Ci0gIG1zZy5zZXRQYWNrZWRSZXBlYXRlZFVpbnQ2NExpc3QoWzB4ZjAwMDAwMDAwMDAwMDAwMF0pOwotICBtc2cuc2V0UGFja2VkUmVwZWF0ZWRTaW50MzJMaXN0KFstMTAwXSk7Ci0gIG1zZy5zZXRQYWNrZWRSZXBlYXRlZFNpbnQ2NExpc3QoWy0weDgwMDAwMDAwMDAwMDAwMDBdKTsKLSAgbXNnLnNldFBhY2tlZFJlcGVhdGVkRml4ZWQzMkxpc3QoWzEyMzRdKTsKLSAgbXNnLnNldFBhY2tlZFJlcGVhdGVkRml4ZWQ2NExpc3QoWzB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICBtc2cuc2V0UGFja2VkUmVwZWF0ZWRTZml4ZWQzMkxpc3QoWy0xMjM0XSk7Ci0gIG1zZy5zZXRQYWNrZWRSZXBlYXRlZFNmaXhlZDY0TGlzdChbLTB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICBtc2cuc2V0UGFja2VkUmVwZWF0ZWRGbG9hdExpc3QoWzEuNV0pOwotICBtc2cuc2V0UGFja2VkUmVwZWF0ZWREb3VibGVMaXN0KFstMS41XSk7Ci0gIG1zZy5zZXRQYWNrZWRSZXBlYXRlZEJvb2xMaXN0KFt0cnVlXSk7Ci0KLX0KLQotCi0vKioKLSAqIEhlbHBlcjogY29tcGFyZSBhIGJ5dGVzIGZpZWxkIHRvIGFuIGV4cGVjdGVkIHZhbHVlCi0gKiBAcGFyYW0ge1VpbnQ4QXJyYXl8c3RyaW5nfSBhcnIKLSAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWQKLSAqIEByZXR1cm4ge2Jvb2xlYW59Ci0gKi8KLWZ1bmN0aW9uIGJ5dGVzQ29tcGFyZShhcnIsIGV4cGVjdGVkKSB7Ci0gIGlmIChnb29nLmlzU3RyaW5nKGFycikpIHsKLSAgICBhcnIgPSBnb29nLmNyeXB0LmJhc2U2NC5kZWNvZGVTdHJpbmdUb1VpbnQ4QXJyYXkoYXJyKTsKLSAgfQotICBpZiAoYXJyLmxlbmd0aCAhPSBleHBlY3RlZC5sZW5ndGgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoYXJyW2ldICE9IGV4cGVjdGVkW2ldKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qKgotICogSGVscGVyOiB2ZXJpZnkgY29udGVudHMgb2YgZ2l2ZW4gVGVzdEFsbFR5cGVzIG1lc3NhZ2UgYXMgc2V0IGJ5Ci0gKiBmaWxsQWxsRmllbGRzKCkuCi0gKiBAcGFyYW0ge3Byb3RvLmpzcGIudGVzdC5UZXN0QWxsVHlwZXN9IG9yaWdpbmFsCi0gKiBAcGFyYW0ge3Byb3RvLmpzcGIudGVzdC5UZXN0QWxsVHlwZXN9IGNvcHkKLSAqLwotZnVuY3Rpb24gY2hlY2tBbGxGaWVsZHMob3JpZ2luYWwsIGNvcHkpIHsKLSAgYXNzZXJ0VHJ1ZShqc3BiLk1lc3NhZ2UuZXF1YWxzKG9yaWdpbmFsLCBjb3B5KSk7Ci0KLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxJbnQzMigpLCAtNDIpOwotICBhc3NlcnRFcXVhbHMoY29weS5nZXRPcHRpb25hbEludDY0KCksIC0weDdmZmZmZmZmMDAwMDAwMDApOwotICBhc3NlcnRFcXVhbHMoY29weS5nZXRPcHRpb25hbFVpbnQzMigpLCAweDgwMDAwMDAwKTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxVaW50NjQoKSwgMHhmMDAwMDAwMDAwMDAwMDAwKTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxTaW50MzIoKSwgLTEwMCk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldE9wdGlvbmFsU2ludDY0KCksIC0weDgwMDAwMDAwMDAwMDAwMDApOwotICBhc3NlcnRFcXVhbHMoY29weS5nZXRPcHRpb25hbEZpeGVkMzIoKSwgMTIzNCk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldE9wdGlvbmFsRml4ZWQ2NCgpLCAweDEyMzQ1Njc4MDAwMDAwMDApOwotICBhc3NlcnRFcXVhbHMoY29weS5nZXRPcHRpb25hbFNmaXhlZDMyKCksIC0xMjM0KTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpLCAtMHgxMjM0NTY3ODAwMDAwMDAwKTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxGbG9hdCgpLCAxLjUpOwotICBhc3NlcnRFcXVhbHMoY29weS5nZXRPcHRpb25hbERvdWJsZSgpLCAtMS41KTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxCb29sKCksIHRydWUpOwotICBhc3NlcnRFcXVhbHMoY29weS5nZXRPcHRpb25hbFN0cmluZygpLCAnaGVsbG8gd29ybGQnKTsKLSAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ5dGVzQ29tcGFyZShjb3B5LmdldE9wdGlvbmFsQnl0ZXMoKSwgQllURVMpKTsKLSAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ5dGVzQ29tcGFyZShjb3B5LmdldE9wdGlvbmFsQnl0ZXNfYXNVOCgpLCBCWVRFUykpOwotICBhc3NlcnRFcXVhbHMoCi0gICAgICBjb3B5LmdldE9wdGlvbmFsQnl0ZXNfYXNCNjQoKSwgZ29vZy5jcnlwdC5iYXNlNjQuZW5jb2RlQnl0ZUFycmF5KEJZVEVTKSk7Ci0KLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxHcm91cCgpLmdldEEoKSwgMTAwKTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSwgMTYpOwotICBhc3NlcnRFcXVhbHMoY29weS5nZXRPcHRpb25hbEZvcmVpZ25FbnVtKCksCi0gICAgICBwcm90by5qc3BiLnRlc3QuRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOwotCi0KLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0T25lb2ZTdHJpbmcoKSwgJ29uZW9mJyk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldE9uZW9mRmllbGRDYXNlKCksCi0gICAgICBwcm90by5qc3BiLnRlc3QuVGVzdEFsbFR5cGVzLk9uZW9mRmllbGRDYXNlLk9ORU9GX1NUUklORyk7Ci0KLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZEludDMyTGlzdCgpLCBbLTQyXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UmVwZWF0ZWRJbnQ2NExpc3QoKSwgWy0weDdmZmZmZmZmMDAwMDAwMDBdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZFVpbnQzMkxpc3QoKSwgWzB4ODAwMDAwMDBdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSwgWzB4ZjAwMDAwMDAwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscyhjb3B5LmdldFJlcGVhdGVkU2ludDMyTGlzdCgpLCBbLTEwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscyhjb3B5LmdldFJlcGVhdGVkU2ludDY0TGlzdCgpLCBbLTB4ODAwMDAwMDAwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscyhjb3B5LmdldFJlcGVhdGVkRml4ZWQzMkxpc3QoKSwgWzEyMzRdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZEZpeGVkNjRMaXN0KCksIFsweDEyMzQ1Njc4MDAwMDAwMDBdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZFNmaXhlZDMyTGlzdCgpLCBbLTEyMzRdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpLCBbLTB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscyhjb3B5LmdldFJlcGVhdGVkRmxvYXRMaXN0KCksIFsxLjVdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZERvdWJsZUxpc3QoKSwgWy0xLjVdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRSZXBlYXRlZEJvb2xMaXN0KCksIFt0cnVlXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UmVwZWF0ZWRTdHJpbmdMaXN0KCksIFsnaGVsbG8gd29ybGQnXSk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldFJlcGVhdGVkQnl0ZXNMaXN0KCkubGVuZ3RoLCAyKTsKLSAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ5dGVzQ29tcGFyZShjb3B5LmdldFJlcGVhdGVkQnl0ZXNMaXN0X2FzVTgoKVswXSwgQllURVMpKTsKLSAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ5dGVzQ29tcGFyZShjb3B5LmdldFJlcGVhdGVkQnl0ZXNMaXN0KClbMF0sIEJZVEVTKSk7Ci0gIGFzc2VydEVxdWFscyh0cnVlLCBieXRlc0NvbXBhcmUoY29weS5nZXRSZXBlYXRlZEJ5dGVzTGlzdF9hc1U4KClbMV0sIEJZVEVTKSk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldFJlcGVhdGVkQnl0ZXNMaXN0X2FzQjY0KClbMF0sIEJZVEVTX0I2NCk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldFJlcGVhdGVkQnl0ZXNMaXN0X2FzQjY0KClbMV0sIEJZVEVTX0I2NCk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldFJlcGVhdGVkR3JvdXBMaXN0KCkubGVuZ3RoLCAxKTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0UmVwZWF0ZWRHcm91cExpc3QoKVswXS5nZXRBKCksIDEwMCk7Ci0gIGFzc2VydEVxdWFscyhjb3B5LmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkubGVuZ3RoLCAxKTsKLSAgYXNzZXJ0RXF1YWxzKGNvcHkuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QoKVswXS5nZXRDKCksIDEwMDApOwotICBhc3NlcnRFbGVtZW50c0VxdWFscyhjb3B5LmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCksCi0gICAgICBbcHJvdG8uanNwYi50ZXN0LkZvcmVpZ25FbnVtLkZPUkVJR05fRk9PXSk7Ci0KLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRQYWNrZWRSZXBlYXRlZEludDMyTGlzdCgpLCBbLTQyXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRJbnQ2NExpc3QoKSwKLSAgICAgIFstMHg3ZmZmZmZmZjAwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRVaW50MzJMaXN0KCksIFsweDgwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRVaW50NjRMaXN0KCksCi0gICAgICBbMHhmMDAwMDAwMDAwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRTaW50MzJMaXN0KCksIFstMTAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRTaW50NjRMaXN0KCksCi0gICAgICBbLTB4ODAwMDAwMDAwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscyhjb3B5LmdldFBhY2tlZFJlcGVhdGVkRml4ZWQzMkxpc3QoKSwgWzEyMzRdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoY29weS5nZXRQYWNrZWRSZXBlYXRlZEZpeGVkNjRMaXN0KCksCi0gICAgICBbMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRTZml4ZWQzMkxpc3QoKSwgWy0xMjM0XSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRTZml4ZWQ2NExpc3QoKSwKLSAgICAgIFstMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKGNvcHkuZ2V0UGFja2VkUmVwZWF0ZWRGbG9hdExpc3QoKSwgWzEuNV0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscyhjb3B5LmdldFBhY2tlZFJlcGVhdGVkRG91YmxlTGlzdCgpLCBbLTEuNV0pOwotCi19Ci0KLQotLyoqCi0gKiBIZWxwZXI6IHZlcmlmeSB0aGF0IGFsbCBleHBlY3RlZCBleHRlbnNpb25zIGFyZSBwcmVzZW50LgotICogQHBhcmFtIHshcHJvdG8uanNwYi50ZXN0LlRlc3RFeHRlbmRhYmxlfSBtc2cKLSAqLwotZnVuY3Rpb24gY2hlY2tFeHRlbnNpb25zKG1zZykgewotICBhc3NlcnRFcXVhbHMoLTQyLAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxJbnQzMikpOwotICBhc3NlcnRFcXVhbHMoLTB4N2ZmZmZmZmYwMDAwMDAwMCwKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsSW50NjQpKTsKLSAgYXNzZXJ0RXF1YWxzKDB4ODAwMDAwMDAsCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbFVpbnQzMikpOwotICBhc3NlcnRFcXVhbHMoMHhmMDAwMDAwMDAwMDAwMDAwLAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxVaW50NjQpKTsKLSAgYXNzZXJ0RXF1YWxzKC0xMDAsCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbFNpbnQzMikpOwotICBhc3NlcnRFcXVhbHMoLTB4ODAwMDAwMDAwMDAwMDAwMCwKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU2ludDY0KSk7Ci0gIGFzc2VydEVxdWFscygxMjM0LAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxGaXhlZDMyKSk7Ci0gIGFzc2VydEVxdWFscygweDEyMzQ1Njc4MDAwMDAwMDAsCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbEZpeGVkNjQpKTsKLSAgYXNzZXJ0RXF1YWxzKC0xMjM0LAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxTZml4ZWQzMikpOwotICBhc3NlcnRFcXVhbHMoLTB4MTIzNDU2NzgwMDAwMDAwMCwKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU2ZpeGVkNjQpKTsKLSAgYXNzZXJ0RXF1YWxzKDEuNSwKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsRmxvYXQpKTsKLSAgYXNzZXJ0RXF1YWxzKC0xLjUsCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbERvdWJsZSkpOwotICBhc3NlcnRFcXVhbHModHJ1ZSwKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsQm9vbCkpOwotICBhc3NlcnRFcXVhbHMoJ2hlbGxvIHdvcmxkJywKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU3RyaW5nKSk7Ci0gIGFzc2VydEVxdWFscygKLSAgICAgIHRydWUsIGJ5dGVzQ29tcGFyZSgKLSAgICAgICAgICAgICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbEJ5dGVzKSwgQllURVMpKTsKLSAgYXNzZXJ0RXF1YWxzKDE2LAotICAgICAgbXNnLmdldEV4dGVuc2lvbigKLSAgICAgICAgICBwcm90by5qc3BiLnRlc3QuRXh0ZW5kc1dpdGhNZXNzYWdlLm9wdGlvbmFsRXh0ZW5zaW9uKS5nZXRGb28oKSk7Ci0KLQotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkSW50MzJMaXN0KSwKLSAgICAgIFstNDJdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZEludDY0TGlzdCksCi0gICAgICBbLTB4N2ZmZmZmZmYwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkVWludDMyTGlzdCksCi0gICAgICBbMHg4MDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkVWludDY0TGlzdCksCi0gICAgICBbMHhmMDAwMDAwMDAwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRTaW50MzJMaXN0KSwKLSAgICAgIFstMTAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRTaW50NjRMaXN0KSwKLSAgICAgIFstMHg4MDAwMDAwMDAwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRGaXhlZDMyTGlzdCksCi0gICAgICBbMTIzNF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkRml4ZWQ2NExpc3QpLAotICAgICAgWzB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkU2ZpeGVkMzJMaXN0KSwKLSAgICAgIFstMTIzNF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkU2ZpeGVkNjRMaXN0KSwKLSAgICAgIFstMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRGbG9hdExpc3QpLAotICAgICAgWzEuNV0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkRG91YmxlTGlzdCksCi0gICAgICBbLTEuNV0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkQm9vbExpc3QpLAotICAgICAgW3RydWVdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZFN0cmluZ0xpc3QpLAotICAgICAgWydoZWxsbyB3b3JsZCddKTsKLSAgYXNzZXJ0RXF1YWxzKAotICAgICAgdHJ1ZSwKLSAgICAgIGJ5dGVzQ29tcGFyZSgKLSAgICAgICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZEJ5dGVzTGlzdClbMF0sIEJZVEVTKSk7Ci0gIGFzc2VydEVxdWFscygxMDAwLAotICAgICAgbXNnLmdldEV4dGVuc2lvbigKLSAgICAgICAgICBwcm90by5qc3BiLnRlc3QuRXh0ZW5kc1dpdGhNZXNzYWdlLnJlcGVhdGVkRXh0ZW5zaW9uTGlzdClbMF0KLSAgICAgIC5nZXRGb28oKSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRGb3JlaWduRW51bUxpc3QpLAotICAgICAgW3Byb3RvLmpzcGIudGVzdC5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPT10pOwotCi0KLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEludDMyTGlzdCksCi0gICAgICBbLTQyXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRJbnQ2NExpc3QpLAotICAgICAgWy0weDdmZmZmZmZmMDAwMDAwMDBdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZFVpbnQzMkxpc3QpLAotICAgICAgWzB4ODAwMDAwMDBdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZFVpbnQ2NExpc3QpLAotICAgICAgWzB4ZjAwMDAwMDAwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkU2ludDMyTGlzdCksCi0gICAgICBbLTEwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkU2ludDY0TGlzdCksCi0gICAgICBbLTB4ODAwMDAwMDAwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkRml4ZWQzMkxpc3QpLAotICAgICAgWzEyMzRdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEZpeGVkNjRMaXN0KSwKLSAgICAgIFsweDEyMzQ1Njc4MDAwMDAwMDBdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZFNmaXhlZDMyTGlzdCksCi0gICAgICBbLTEyMzRdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZFNmaXhlZDY0TGlzdCksCi0gICAgICBbLTB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICBhc3NlcnRFbGVtZW50c0VxdWFscygKLSAgICAgIG1zZy5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkRmxvYXRMaXN0KSwKLSAgICAgIFsxLjVdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZERvdWJsZUxpc3QpLAotICAgICAgWy0xLjVdKTsKLSAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoCi0gICAgICBtc2cuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEJvb2xMaXN0KSwKLSAgICAgIFt0cnVlXSk7Ci0gIGFzc2VydEVsZW1lbnRzRXF1YWxzKAotICAgICAgbXNnLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRGb3JlaWduRW51bUxpc3QpLAotICAgICAgW3Byb3RvLmpzcGIudGVzdC5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPT10pOwotCi19Ci0KLQotZGVzY3JpYmUoJ3Byb3RvQmluYXJ5VGVzdCcsIGZ1bmN0aW9uKCkgewotICAvKioKLSAgICogVGVzdHMgYSBiYXNpYyBzZXJpYWxpemF0aW9uLWRlc2VyaWFsaXphdG9uIHJvdW5kLXRyaXAgd2l0aCBhbGwgc3VwcG9ydGVkCi0gICAqIGZpZWxkIHR5cGVzIChvbiB0aGUgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgdHlwZSkuCi0gICAqLwotICBpdCgndGVzdFJvdW5kVHJpcCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RBbGxUeXBlcygpOwotICAgIGZpbGxBbGxGaWVsZHMobXNnKTsKLSAgICB2YXIgZW5jb2RlZCA9IG1zZy5zZXJpYWxpemVCaW5hcnkoKTsKLSAgICB2YXIgZGVjb2RlZCA9IHByb3RvLmpzcGIudGVzdC5UZXN0QWxsVHlwZXMuZGVzZXJpYWxpemVCaW5hcnkoZW5jb2RlZCk7Ci0gICAgY2hlY2tBbGxGaWVsZHMobXNnLCBkZWNvZGVkKTsKLSAgfSk7Ci0KLSAgLyoqCi0gICAqIFRlc3QgdGhhdCBiYXNlNjQgc3RyaW5nIGFuZCBVaW50OEFycmF5IGFyZSBpbnRlcmNoYW5nZWFibGUgaW4gYnl0ZXMgZmllbGRzLgotICAgKi8KLSAgaXQoJ3Rlc3RCeXRlc0ZpZWxkc0dldHRlcnNJbnRlcm9wJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1zZyA9IG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdEFsbFR5cGVzKCk7Ci0gICAgLy8gU2V0IGZyb20gYSBiYXNlNjQgc3RyaW5nIGFuZCBjaGVjayBhbGwgdGhlIGdldHRlcnMgd29yay4KLSAgICBtc2cuc2V0T3B0aW9uYWxCeXRlcyhCWVRFU19CNjQpOwotICAgIGFzc2VydFRydWUoYnl0ZXNDb21wYXJlKG1zZy5nZXRPcHRpb25hbEJ5dGVzX2FzVTgoKSwgQllURVMpKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlc19hc0I2NCgpLCBCWVRFUykpOwotICAgIGFzc2VydFRydWUoYnl0ZXNDb21wYXJlKG1zZy5nZXRPcHRpb25hbEJ5dGVzKCksIEJZVEVTKSk7Ci0KLSAgICAvLyBUZXN0IGJpbmFyeSBzZXJpYWxpemUgcm91bmQgdHJpcCBkb2Vzbid0IGJyZWFrIGl0LgotICAgIG1zZyA9IHByb3RvLmpzcGIudGVzdC5UZXN0QWxsVHlwZXMuZGVzZXJpYWxpemVCaW5hcnkobXNnLnNlcmlhbGl6ZUJpbmFyeSgpKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlc19hc1U4KCksIEJZVEVTKSk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldE9wdGlvbmFsQnl0ZXNfYXNCNjQoKSwgQllURVMpKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlcygpLCBCWVRFUykpOwotCi0gICAgbXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0QWxsVHlwZXMoKTsKLSAgICAvLyBTZXQgZnJvbSBhIFVpbnQ4QXJyYXkgYW5kIGNoZWNrIGFsbCB0aGUgZ2V0dGVycyB3b3JrLgotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKEJZVEVTKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlc19hc1U4KCksIEJZVEVTKSk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldE9wdGlvbmFsQnl0ZXNfYXNCNjQoKSwgQllURVMpKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlcygpLCBCWVRFUykpOwotCi0gIH0pOwotCi0gIC8qKgotICAgKiBUZXN0IHRoYXQgYnl0ZXMgc2V0dGVycyB3aWxsIHJlY2VpdmUgcmVzdWx0IG9mIGFueSBvZiB0aGUgZ2V0dGVycy4KLSAgICovCi0gIGl0KCd0ZXN0Qnl0ZXNGaWVsZHNTZXR0ZXJzSW50ZXJvcCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RBbGxUeXBlcygpOwotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKEJZVEVTKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlcygpLCBCWVRFUykpOwotCi0gICAgbXNnLnNldE9wdGlvbmFsQnl0ZXMobXNnLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldE9wdGlvbmFsQnl0ZXMoKSwgQllURVMpKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxCeXRlcyhtc2cuZ2V0T3B0aW9uYWxCeXRlc19hc0I2NCgpKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlcygpLCBCWVRFUykpOwotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKG1zZy5nZXRPcHRpb25hbEJ5dGVzX2FzVTgoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldE9wdGlvbmFsQnl0ZXMoKSwgQllURVMpKTsKLSAgfSk7Ci0KLSAgLyoqCi0gICAqIFRlc3QgdGhhdCBieXRlcyBzZXR0ZXJzIHdpbGwgcmVjZWl2ZSByZXN1bHQgb2YgYW55IG9mIHRoZSBnZXR0ZXJzLgotICAgKi8KLSAgaXQoJ3Rlc3RSZXBlYXRlZEJ5dGVzR2V0dGVycycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RBbGxUeXBlcygpOwotCi0gICAgZnVuY3Rpb24gYXNzZXJ0R2V0dGVycygpIHsKLSAgICAgIGFzc2VydFRydWUoZ29vZy5pc1N0cmluZyhtc2cuZ2V0UmVwZWF0ZWRCeXRlc0xpc3RfYXNCNjQoKVswXSkpOwotICAgICAgYXNzZXJ0VHJ1ZShnb29nLmlzU3RyaW5nKG1zZy5nZXRSZXBlYXRlZEJ5dGVzTGlzdF9hc0I2NCgpWzFdKSk7Ci0gICAgICBhc3NlcnRUcnVlKG1zZy5nZXRSZXBlYXRlZEJ5dGVzTGlzdF9hc1U4KClbMF0gaW5zdGFuY2VvZiBVaW50OEFycmF5KTsKLSAgICAgIGFzc2VydFRydWUobXNnLmdldFJlcGVhdGVkQnl0ZXNMaXN0X2FzVTgoKVsxXSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpOwotCi0gICAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0UmVwZWF0ZWRCeXRlc0xpc3QoKVswXSwgQllURVMpKTsKLSAgICAgIGFzc2VydFRydWUoYnl0ZXNDb21wYXJlKG1zZy5nZXRSZXBlYXRlZEJ5dGVzTGlzdCgpWzFdLCBCWVRFUykpOwotICAgICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldFJlcGVhdGVkQnl0ZXNMaXN0X2FzQjY0KClbMF0sIEJZVEVTKSk7Ci0gICAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0UmVwZWF0ZWRCeXRlc0xpc3RfYXNCNjQoKVsxXSwgQllURVMpKTsKLSAgICAgIGFzc2VydFRydWUoYnl0ZXNDb21wYXJlKG1zZy5nZXRSZXBlYXRlZEJ5dGVzTGlzdF9hc1U4KClbMF0sIEJZVEVTKSk7Ci0gICAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0UmVwZWF0ZWRCeXRlc0xpc3RfYXNVOCgpWzFdLCBCWVRFUykpOwotICAgIH0KLQotICAgIG1zZy5zZXRSZXBlYXRlZEJ5dGVzTGlzdChbQllURVMsIEJZVEVTXSk7Ci0gICAgYXNzZXJ0R2V0dGVycygpOwotCi0gICAgbXNnLnNldFJlcGVhdGVkQnl0ZXNMaXN0KFtCWVRFU19CNjQsIEJZVEVTX0I2NF0pOwotICAgIGFzc2VydEdldHRlcnMoKTsKLQotICAgIG1zZy5zZXRSZXBlYXRlZEJ5dGVzTGlzdChudWxsKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLmdldFJlcGVhdGVkQnl0ZXNMaXN0KCkubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLmdldFJlcGVhdGVkQnl0ZXNMaXN0X2FzQjY0KCkubGVuZ3RoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbXNnLmdldFJlcGVhdGVkQnl0ZXNMaXN0X2FzVTgoKS5sZW5ndGgpOwotICB9KTsKLQotICAvKioKLSAgICogSGVscGVyOiBmaWxsIGFsbCBleHRlbnNpb24gdmFsdWVzLgotICAgKiBAcGFyYW0ge3Byb3RvLmpzcGIudGVzdC5UZXN0RXh0ZW5kYWJsZX0gbXNnCi0gICAqLwotICBmdW5jdGlvbiBmaWxsRXh0ZW5zaW9ucyhtc2cpIHsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxJbnQzMiwgLTQyKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxJbnQ2NCwgLTB4N2ZmZmZmZmYwMDAwMDAwMCk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsVWludDMyLCAweDgwMDAwMDAwKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxVaW50NjQsIDB4ZjAwMDAwMDAwMDAwMDAwMCk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU2ludDMyLCAtMTAwKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxTaW50NjQsIC0weDgwMDAwMDAwMDAwMDAwMDApOwotICAgIG1zZy5zZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbEZpeGVkMzIsIDEyMzQpOwotICAgIG1zZy5zZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbEZpeGVkNjQsIDB4MTIzNDU2NzgwMDAwMDAwMCk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsU2ZpeGVkMzIsIC0xMjM0KTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxTZml4ZWQ2NCwgLTB4MTIzNDU2NzgwMDAwMDAwMCk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsRmxvYXQsIDEuNSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsRG91YmxlLCAtMS41KTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxCb29sLCB0cnVlKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kT3B0aW9uYWxTdHJpbmcsICdoZWxsbyB3b3JsZCcpOwotICAgIG1zZy5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZE9wdGlvbmFsQnl0ZXMsIEJZVEVTKTsKLSAgICB2YXIgc3VibXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5FeHRlbmRzV2l0aE1lc3NhZ2UoKTsKLSAgICBzdWJtc2cuc2V0Rm9vKDE2KTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuRXh0ZW5kc1dpdGhNZXNzYWdlLm9wdGlvbmFsRXh0ZW5zaW9uLCBzdWJtc2cpOwotICAgIG1zZy5zZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5leHRlbmRPcHRpb25hbEZvcmVpZ25FbnVtLAotICAgICAgICBwcm90by5qc3BiLnRlc3QuRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOwotCi0KLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRJbnQzMkxpc3QsIFstNDJdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRJbnQ2NExpc3QsIFstMHg3ZmZmZmZmZjAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkVWludDMyTGlzdCwgWzB4ODAwMDAwMDBdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRVaW50NjRMaXN0LCBbMHhmMDAwMDAwMDAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkU2ludDMyTGlzdCwgWy0xMDBdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRTaW50NjRMaXN0LCBbLTB4ODAwMDAwMDAwMDAwMDAwMF0pOwotICAgIG1zZy5zZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZEZpeGVkMzJMaXN0LCBbMTIzNF0pOwotICAgIG1zZy5zZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZEZpeGVkNjRMaXN0LCBbMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkU2ZpeGVkMzJMaXN0LCBbLTEyMzRdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRTZml4ZWQ2NExpc3QsIFstMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkRmxvYXRMaXN0LCBbMS41XSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkRG91YmxlTGlzdCwgWy0xLjVdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRCb29sTGlzdCwgW3RydWVdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUmVwZWF0ZWRTdHJpbmdMaXN0LCBbJ2hlbGxvIHdvcmxkJ10pOwotICAgIG1zZy5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmV4dGVuZFJlcGVhdGVkQnl0ZXNMaXN0LCBbQllURVNdKTsKLSAgICBzdWJtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkV4dGVuZHNXaXRoTWVzc2FnZSgpOwotICAgIHN1Ym1zZy5zZXRGb28oMTAwMCk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LkV4dGVuZHNXaXRoTWVzc2FnZS5yZXBlYXRlZEV4dGVuc2lvbkxpc3QsIFtzdWJtc2ddKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCwKLSAgICAgICAgW3Byb3RvLmpzcGIudGVzdC5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPT10pOwotCi0KLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRJbnQzMkxpc3QsIFstNDJdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRJbnQ2NExpc3QsIFstMHg3ZmZmZmZmZjAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkVWludDMyTGlzdCwgWzB4ODAwMDAwMDBdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRVaW50NjRMaXN0LCBbMHhmMDAwMDAwMDAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkU2ludDMyTGlzdCwgWy0xMDBdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRTaW50NjRMaXN0LCBbLTB4ODAwMDAwMDAwMDAwMDAwMF0pOwotICAgIG1zZy5zZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEZpeGVkMzJMaXN0LCBbMTIzNF0pOwotICAgIG1zZy5zZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEZpeGVkNjRMaXN0LCBbMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkU2ZpeGVkMzJMaXN0LCBbLTEyMzRdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRTZml4ZWQ2NExpc3QsCi0gICAgICAgIFstMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkRmxvYXRMaXN0LCBbMS41XSk7Ci0gICAgbXNnLnNldEV4dGVuc2lvbigKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LmV4dGVuZFBhY2tlZFJlcGVhdGVkRG91YmxlTGlzdCwgWy0xLjVdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuZXh0ZW5kUGFja2VkUmVwZWF0ZWRCb29sTGlzdCwgW3RydWVdKTsKLSAgICBtc2cuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5leHRlbmRQYWNrZWRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdCwKLSAgICAgICAgW3Byb3RvLmpzcGIudGVzdC5Gb3JlaWduRW51bS5GT1JFSUdOX0ZPT10pOwotCi0gIH0KLQotCi0gIC8qKgotICAgKiBUZXN0cyBleHRlbnNpb24gc2VyaWFsaXphdGlvbiBhbmQgZGVzZXJpYWxpemF0aW9uLgotICAgKi8KLSAgaXQoJ3Rlc3RFeHRlbnNpb25zJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1zZyA9IG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdEV4dGVuZGFibGUoKTsKLSAgICBmaWxsRXh0ZW5zaW9ucyhtc2cpOwotICAgIHZhciBlbmNvZGVkID0gbXNnLnNlcmlhbGl6ZUJpbmFyeSgpOwotICAgIHZhciBkZWNvZGVkID0gcHJvdG8uanNwYi50ZXN0LlRlc3RFeHRlbmRhYmxlLmRlc2VyaWFsaXplQmluYXJ5KGVuY29kZWQpOwotICAgIGNoZWNrRXh0ZW5zaW9ucyhkZWNvZGVkKTsKLSAgfSk7Ci19KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9yZWFkZXIuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvcmVhZGVyLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNWY5MDQzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9yZWFkZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTI3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBmaWxlIGNvbnRhaW5zIHV0aWxpdGllcyBmb3IgY29udmVydGluZyBiaW5hcnksCi0gKiB3aXJlLWZvcm1hdCBwcm90b2NvbCBidWZmZXJzIGludG8gSmF2YXNjcmlwdCBkYXRhIHN0cnVjdHVyZXMuCi0gKgotICoganNwYidzIEJpbmFyeVJlYWRlciBjbGFzcyB3cmFwcyB0aGUgQmluYXJ5RGVjb2RlciBjbGFzcyB0byBhZGQgbWV0aG9kcwotICogdGhhdCB1bmRlcnN0YW5kIHRoZSBwcm90b2NvbCBidWZmZXIgc3ludGF4IGFuZCBjYW4gZG8gdGhlIHR5cGUgY2hlY2tpbmcgYW5kCi0gKiBib29ra2VlcGluZyBuZWNlc3NhcnkgdG8gcGFyc2UgdHJlZXMgb2YgbmVzdGVkIG1lc3NhZ2VzLgotICoKLSAqIE1ham9yIGNhdmVhdCAtIFVzZXJzIG9mIHRoaXMgbGlicmFyeSBfbXVzdF8ga2VlcCB0aGVpciBKYXZhc2NyaXB0IHByb3RvCi0gKiBwYXJzaW5nIGNvZGUgaW4gc3luYyB3aXRoIHRoZSBvcmlnaW5hbCAucHJvdG8gZmlsZSAtIHByZXN1bWFibHkgeW91J2xsIGJlCi0gKiB1c2luZyB0aGUgdHlwZWQganNwYiBjb2RlIGdlbmVyYXRvciwgYnV0IGlmIHlvdSBieXBhc3MgdGhhdCB5b3UnbGwgbmVlZAotICogdG8ga2VlcCB0aGluZ3MgaW4gc3luYyBieSBoYW5kLgotICoKLSAqIEBhdXRob3IgYWFwcGxlYnlAZ29vZ2xlLmNvbSAoQXVzdGluIEFwcGxlYnkpCi0gKi8KLQotZ29vZy5wcm92aWRlKCdqc3BiLkJpbmFyeVJlYWRlcicpOwotCi1nb29nLnJlcXVpcmUoJ2dvb2cuYXNzZXJ0cycpOwotZ29vZy5yZXF1aXJlKCdqc3BiLkJpbmFyeUNvbnN0YW50cycpOwotZ29vZy5yZXF1aXJlKCdqc3BiLkJpbmFyeURlY29kZXInKTsKLQotCi0KLS8qKgotICogQmluYXJ5UmVhZGVyIGltcGxlbWVudHMgdGhlIGRlY29kZXJzIGZvciBhbGwgdGhlIHdpcmUgdHlwZXMgc3BlY2lmaWVkIGluCi0gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzL2RvY3MvZW5jb2RpbmcuCi0gKgotICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2U9fSBvcHRfYnl0ZXMgVGhlIGJ5dGVzIHdlJ3JlIHJlYWRpbmcgZnJvbS4KLSAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X3N0YXJ0IFRoZSBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyBhdC4KLSAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2xlbmd0aCBUaGUgb3B0aW9uYWwgbGVuZ3RoIG9mIHRoZSBibG9jayB0byByZWFkIC0KLSAqICAgICB3ZSdsbCB0aHJvdyBhbiBhc3NlcnRpb24gaWYgd2UgZ28gb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgotICogQGNvbnN0cnVjdG9yCi0gKiBAc3RydWN0Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyID0gZnVuY3Rpb24ob3B0X2J5dGVzLCBvcHRfc3RhcnQsIG9wdF9sZW5ndGgpIHsKLSAgLyoqCi0gICAqIFdpcmUtZm9ybWF0IGRlY29kZXIuCi0gICAqIEBwcml2YXRlIHshanNwYi5CaW5hcnlEZWNvZGVyfQotICAgKi8KLSAgdGhpcy5kZWNvZGVyXyA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYyhvcHRfYnl0ZXMsIG9wdF9zdGFydCwgb3B0X2xlbmd0aCk7Ci0KLSAgLyoqCi0gICAqIEN1cnNvciBpbW1lZGlhdGVseSBiZWZvcmUgdGhlIGZpZWxkIHRhZy4KLSAgICogQHByaXZhdGUge251bWJlcn0KLSAgICovCi0gIHRoaXMuZmllbGRDdXJzb3JfID0gdGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTsKLQotICAvKioKLSAgICogRmllbGQgbnVtYmVyIG9mIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBidWZmZXIsIGZpbGxlZCBpbiBieSBuZXh0RmllbGQoKS4KLSAgICogQHByaXZhdGUge251bWJlcn0KLSAgICovCi0gIHRoaXMubmV4dEZpZWxkXyA9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLklOVkFMSURfRklFTERfTlVNQkVSOwotCi0gIC8qKgotICAgKiBXaXJlIHR5cGUgb2YgdGhlIG5leHQgcHJvdG8gZmllbGQgaW4gdGhlIGJ1ZmZlciwgZmlsbGVkIGluIGJ5Ci0gICAqIG5leHRGaWVsZCgpLgotICAgKiBAcHJpdmF0ZSB7anNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGV9Ci0gICAqLwotICB0aGlzLm5leHRXaXJlVHlwZV8gPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5JTlZBTElEOwotCi0gIC8qKgotICAgKiBTZXQgdG8gdHJ1ZSBpZiB0aGlzIHJlYWRlciBlbmNvdW50ZXJlZCBhbiBlcnJvciBkdWUgdG8gY29ycnVwdCBkYXRhLgotICAgKiBAcHJpdmF0ZSB7Ym9vbGVhbn0KLSAgICovCi0gIHRoaXMuZXJyb3JfID0gZmFsc2U7Ci0KLSAgLyoqCi0gICAqIFVzZXItZGVmaW5lZCByZWFkZXIgY2FsbGJhY2tzLgotICAgKiBAcHJpdmF0ZSB7T2JqZWN0LjxzdHJpbmcsIGZ1bmN0aW9uKCFqc3BiLkJpbmFyeVJlYWRlcik6Kj59Ci0gICAqLwotICB0aGlzLnJlYWRDYWxsYmFja3NfID0gbnVsbDsKLX07Ci0KLQotLyoqCi0gKiBHbG9iYWwgcG9vbCBvZiBCaW5hcnlSZWFkZXIgaW5zdGFuY2VzLgotICogQHByaXZhdGUgeyFBcnJheS48IWpzcGIuQmluYXJ5UmVhZGVyPn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIuaW5zdGFuY2VDYWNoZV8gPSBbXTsKLQotCi0vKioKLSAqIFBvcHMgYW4gaW5zdGFuY2Ugb2ZmIHRoZSBpbnN0YW5jZSBjYWNoZSwgb3IgY3JlYXRlcyBvbmUgaWYgdGhlIGNhY2hlIGlzCi0gKiBlbXB0eS4KLSAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlPX0gb3B0X2J5dGVzIFRoZSBieXRlcyB3ZSdyZSByZWFkaW5nIGZyb20uCi0gKiBAcGFyYW0ge251bWJlcj19IG9wdF9zdGFydCBUaGUgb3B0aW9uYWwgb2Zmc2V0IHRvIHN0YXJ0IHJlYWRpbmcgYXQuCi0gKiBAcGFyYW0ge251bWJlcj19IG9wdF9sZW5ndGggVGhlIG9wdGlvbmFsIGxlbmd0aCBvZiB0aGUgYmxvY2sgdG8gcmVhZCAtCi0gKiAgICAgd2UnbGwgdGhyb3cgYW4gYXNzZXJ0aW9uIGlmIHdlIGdvIG9mZiB0aGUgZW5kIG9mIHRoZSBibG9jay4KLSAqIEByZXR1cm4geyFqc3BiLkJpbmFyeVJlYWRlcn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIuYWxsb2MgPQotICAgIGZ1bmN0aW9uKG9wdF9ieXRlcywgb3B0X3N0YXJ0LCBvcHRfbGVuZ3RoKSB7Ci0gIGlmIChqc3BiLkJpbmFyeVJlYWRlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgpIHsKLSAgICB2YXIgbmV3UmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXIuaW5zdGFuY2VDYWNoZV8ucG9wKCk7Ci0gICAgaWYgKG9wdF9ieXRlcykgewotICAgICAgbmV3UmVhZGVyLmRlY29kZXJfLnNldEJsb2NrKG9wdF9ieXRlcywgb3B0X3N0YXJ0LCBvcHRfbGVuZ3RoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG5ld1JlYWRlcjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gbmV3IGpzcGIuQmluYXJ5UmVhZGVyKG9wdF9ieXRlcywgb3B0X3N0YXJ0LCBvcHRfbGVuZ3RoKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIEFsaWFzIGZvciB0aGUgYWJvdmUgbWV0aG9kLgotICogQHBhcmFtIHtqc3BiLkJ5dGVTb3VyY2U9fSBvcHRfYnl0ZXMgVGhlIGJ5dGVzIHdlJ3JlIHJlYWRpbmcgZnJvbS4KLSAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X3N0YXJ0IFRoZSBvcHRpb25hbCBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyBhdC4KLSAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2xlbmd0aCBUaGUgb3B0aW9uYWwgbGVuZ3RoIG9mIHRoZSBibG9jayB0byByZWFkIC0KLSAqICAgICB3ZSdsbCB0aHJvdyBhbiBhc3NlcnRpb24gaWYgd2UgZ28gb2ZmIHRoZSBlbmQgb2YgdGhlIGJsb2NrLgotICogQHJldHVybiB7IWpzcGIuQmluYXJ5UmVhZGVyfQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuYWxsb2MgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYzsKLQotCi0vKioKLSAqIFB1dHMgdGhpcyBpbnN0YW5jZSBiYWNrIGluIHRoZSBpbnN0YW5jZSBjYWNoZS4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLmZyZWUgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5kZWNvZGVyXy5jbGVhcigpOwotICB0aGlzLm5leHRGaWVsZF8gPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5JTlZBTElEX0ZJRUxEX05VTUJFUjsKLSAgdGhpcy5uZXh0V2lyZVR5cGVfID0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuSU5WQUxJRDsKLSAgdGhpcy5lcnJvcl8gPSBmYWxzZTsKLSAgdGhpcy5yZWFkQ2FsbGJhY2tzXyA9IG51bGw7Ci0KLSAgaWYgKGpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCA8IDEwMCkgewotICAgIGpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLnB1c2godGhpcyk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBjdXJzb3IgaW1tZWRpYXRlbHkgYmVmb3JlIHRoZSBjdXJyZW50IGZpZWxkJ3MgdGFnLgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgaW50ZXJuYWwgcmVhZCBjdXJzb3IuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5nZXRGaWVsZEN1cnNvciA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5maWVsZEN1cnNvcl87Ci19OwotCi0KLS8qKgotICogUmV0dXJucyB0aGUgaW50ZXJuYWwgcmVhZCBjdXJzb3IuCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbnRlcm5hbCByZWFkIGN1cnNvci4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLmdldEN1cnNvciA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTsKLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSByYXcgYnVmZmVyLgotICogQHJldHVybiB7P1VpbnQ4QXJyYXl9IFRoZSByYXcgYnVmZmVyLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuZ2V0QnVmZmVyID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLmdldEJ1ZmZlcigpOwotfTsKLQotCi0vKioKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIGZpZWxkIG51bWJlciBvZiB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgYnVmZmVyLCBvcgotICogICAgIElOVkFMSURfRklFTERfTlVNQkVSIGlmIHRoZXJlIGlzIG5vIG5leHQgZmllbGQuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5nZXRGaWVsZE51bWJlciA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5uZXh0RmllbGRfOwotfTsKLQotCi0vKioKLSAqIEByZXR1cm4ge2pzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlfSBUaGUgd2lyZSB0eXBlIG9mIHRoZSBuZXh0IGZpZWxkCi0gKiAgICAgaW4gdGhlIHN0cmVhbSwgb3IgV2lyZVR5cGUuSU5WQUxJRCBpZiB0aGVyZSBpcyBubyBuZXh0IGZpZWxkLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuZ2V0V2lyZVR5cGUgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMubmV4dFdpcmVUeXBlXzsKLX07Ci0KLQotLyoqCi0gKiBAcmV0dXJuIHtib29sZWFufSBXaGV0aGVyIHRoZSBjdXJyZW50IHdpcmUgdHlwZSBpcyBhbiBlbmQtZ3JvdXAgdGFnLiBVc2VkIGFzCi0gKiBhbiBleGl0IGNvbmRpdGlvbiBpbiBkZWNvZGVyIGxvb3BzIGluIGdlbmVyYXRlZCBjb2RlLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuaXNFbmRHcm91cCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUDsKLX07Ci0KLQotLyoqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyByZWFkZXIgaGl0IGFuIGVycm9yIGR1ZSB0byBjb3JydXB0IGRhdGEuCi0gKiBAcmV0dXJuIHtib29sZWFufQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuZ2V0RXJyb3IgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMuZXJyb3JfIHx8IHRoaXMuZGVjb2Rlcl8uZ2V0RXJyb3IoKTsKLX07Ci0KLQotLyoqCi0gKiBQb2ludHMgdGhpcyByZWFkZXIgYXQgYSBuZXcgYmxvY2sgb2YgYnl0ZXMuCi0gKiBAcGFyYW0geyFVaW50OEFycmF5fSBieXRlcyBUaGUgYmxvY2sgb2YgYnl0ZXMgd2UncmUgcmVhZGluZyBmcm9tLgotICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBvZmZzZXQgdG8gc3RhcnQgcmVhZGluZyBhdC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBsZW5ndGggVGhlIGxlbmd0aCBvZiB0aGUgYmxvY2sgdG8gcmVhZC4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnNldEJsb2NrID0gZnVuY3Rpb24oYnl0ZXMsIHN0YXJ0LCBsZW5ndGgpIHsKLSAgdGhpcy5kZWNvZGVyXy5zZXRCbG9jayhieXRlcywgc3RhcnQsIGxlbmd0aCk7Ci0gIHRoaXMubmV4dEZpZWxkXyA9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLklOVkFMSURfRklFTERfTlVNQkVSOwotICB0aGlzLm5leHRXaXJlVHlwZV8gPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5JTlZBTElEOwotfTsKLQotCi0vKioKLSAqIFJld2luZHMgdGhlIHN0cmVhbSBjdXJzb3IgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIGFuZCByZXNldHMgYWxsCi0gKiBpbnRlcm5hbCBzdGF0ZS4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlc2V0ID0gZnVuY3Rpb24oKSB7Ci0gIHRoaXMuZGVjb2Rlcl8ucmVzZXQoKTsKLSAgdGhpcy5uZXh0RmllbGRfID0ganNwYi5CaW5hcnlDb25zdGFudHMuSU5WQUxJRF9GSUVMRF9OVU1CRVI7Ci0gIHRoaXMubmV4dFdpcmVUeXBlXyA9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLklOVkFMSUQ7Ci19OwotCi0KLS8qKgotICogQWR2YW5jZXMgdGhlIHN0cmVhbSBjdXJzb3IgYnkgdGhlIGdpdmVuIG51bWJlciBvZiBieXRlcy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBjb3VudCBUaGUgbnVtYmVyIG9mIGJ5dGVzIHRvIGFkdmFuY2UgYnkuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5hZHZhbmNlID0gZnVuY3Rpb24oY291bnQpIHsKLSAgdGhpcy5kZWNvZGVyXy5hZHZhbmNlKGNvdW50KTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyB0aGUgbmV4dCBmaWVsZCBoZWFkZXIgaW4gdGhlIHN0cmVhbSBpZiB0aGVyZSBpcyBvbmUsIHJldHVybnMgdHJ1ZSBpZgotICogd2Ugc2F3IGEgdmFsaWQgZmllbGQgaGVhZGVyIG9yIGZhbHNlIGlmIHdlJ3ZlIHJlYWQgdGhlIHdob2xlIHN0cmVhbS4KLSAqIFRocm93cyBhbiBlcnJvciBpZiB3ZSBlbmNvdW50ZXJlZCBhIGRlcHJlY2F0ZWQgU1RBUlRfR1JPVVAvRU5EX0dST1VQIGZpZWxkLgotICogQHJldHVybiB7Ym9vbGVhbn0gVHJ1ZSBpZiB0aGUgc3RyZWFtIGNvbnRhaW5zIG1vcmUgZmllbGRzLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUubmV4dEZpZWxkID0gZnVuY3Rpb24oKSB7Ci0gIC8vIElmIHdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGJsb2NrLCB0aGVyZSBhcmUgbm8gbW9yZSBmaWVsZHMuCi0gIGlmICh0aGlzLmRlY29kZXJfLmF0RW5kKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBJZiB3ZSBoaXQgYW4gZXJyb3IgZGVjb2RpbmcgdGhlIHByZXZpb3VzIGZpZWxkLCBzdG9wIG5vdyBiZWZvcmUgd2UKLSAgLy8gdHJ5IHRvIGRlY29kZSBhbnl0aGluZyBlbHNlCi0gIGlmICh0aGlzLmdldEVycm9yKCkpIHsKLSAgICBnb29nLmFzc2VydHMuZmFpbCgnRGVjb2RlciBoaXQgYW4gZXJyb3InKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBPdGhlcndpc2UganVzdCByZWFkIHRoZSBoZWFkZXIgb2YgdGhlIG5leHQgZmllbGQuCi0gIHRoaXMuZmllbGRDdXJzb3JfID0gdGhpcy5kZWNvZGVyXy5nZXRDdXJzb3IoKTsKLSAgdmFyIGhlYWRlciA9IHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTsKLQotICB2YXIgbmV4dEZpZWxkID0gaGVhZGVyID4+PiAzOwotICB2YXIgbmV4dFdpcmVUeXBlID0gLyoqIEB0eXBlIHtqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZX0gKi8KLSAgICAgIChoZWFkZXIgJiAweDcpOwotCi0gIC8vIElmIHRoZSB3aXJlIHR5cGUgaXNuJ3Qgb25lIG9mIHRoZSB2YWxpZCBvbmVzLCBzb21ldGhpbmcncyBicm9rZW4uCi0gIGlmIChuZXh0V2lyZVR5cGUgIT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UICYmCi0gICAgICBuZXh0V2lyZVR5cGUgIT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQzMiAmJgotICAgICAgbmV4dFdpcmVUeXBlICE9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQgJiYKLSAgICAgIG5leHRXaXJlVHlwZSAhPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQgJiYKLSAgICAgIG5leHRXaXJlVHlwZSAhPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5TVEFSVF9HUk9VUCAmJgotICAgICAgbmV4dFdpcmVUeXBlICE9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUCkgewotICAgIGdvb2cuYXNzZXJ0cy5mYWlsKCdJbnZhbGlkIHdpcmUgdHlwZScpOwotICAgIHRoaXMuZXJyb3JfID0gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICB0aGlzLm5leHRGaWVsZF8gPSBuZXh0RmllbGQ7Ci0gIHRoaXMubmV4dFdpcmVUeXBlXyA9IG5leHRXaXJlVHlwZTsKLQotICByZXR1cm4gdHJ1ZTsKLX07Ci0KLQotLyoqCi0gKiBXaW5kcyB0aGUgcmVhZGVyIGJhY2sgdG8ganVzdCBiZWZvcmUgdGhpcyBmaWVsZCdzIGhlYWRlci4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnVuc2tpcEhlYWRlciA9IGZ1bmN0aW9uKCkgewotICB0aGlzLmRlY29kZXJfLnVuc2tpcFZhcmludCgodGhpcy5uZXh0RmllbGRfIDw8IDMpIHwgdGhpcy5uZXh0V2lyZVR5cGVfKTsKLX07Ci0KLQotLyoqCi0gKiBTa2lwcyBhbGwgY29udGlndW91cyBmaWVsZHMgd2hvc2UgaGVhZGVyIG1hdGNoZXMgdGhlIG9uZSB3ZSBqdXN0IHJlYWQuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5za2lwTWF0Y2hpbmdGaWVsZHMgPSBmdW5jdGlvbigpIHsKLSAgdmFyIGZpZWxkID0gdGhpcy5uZXh0RmllbGRfOwotICB0aGlzLnVuc2tpcEhlYWRlcigpOwotCi0gIHdoaWxlICh0aGlzLm5leHRGaWVsZCgpICYmICh0aGlzLmdldEZpZWxkTnVtYmVyKCkgPT0gZmllbGQpKSB7Ci0gICAgdGhpcy5za2lwRmllbGQoKTsKLSAgfQotCi0gIGlmICghdGhpcy5kZWNvZGVyXy5hdEVuZCgpKSB7Ci0gICAgdGhpcy51bnNraXBIZWFkZXIoKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFNraXBzIG92ZXIgdGhlIG5leHQgdmFyaW50IGZpZWxkIGluIHRoZSBiaW5hcnkgc3RyZWFtLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuc2tpcFZhcmludEZpZWxkID0gZnVuY3Rpb24oKSB7Ci0gIGlmICh0aGlzLm5leHRXaXJlVHlwZV8gIT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKSB7Ci0gICAgZ29vZy5hc3NlcnRzLmZhaWwoJ0ludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwVmFyaW50RmllbGQnKTsKLSAgICB0aGlzLnNraXBGaWVsZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRoaXMuZGVjb2Rlcl8uc2tpcFZhcmludCgpOwotfTsKLQotCi0vKioKLSAqIFNraXBzIG92ZXIgdGhlIG5leHQgZGVsaW1pdGVkIGZpZWxkIGluIHRoZSBiaW5hcnkgc3RyZWFtLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuc2tpcERlbGltaXRlZEZpZWxkID0gZnVuY3Rpb24oKSB7Ci0gIGlmICh0aGlzLm5leHRXaXJlVHlwZV8gIT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKSB7Ci0gICAgZ29vZy5hc3NlcnRzLmZhaWwoJ0ludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwRGVsaW1pdGVkRmllbGQnKTsKLSAgICB0aGlzLnNraXBGaWVsZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBsZW5ndGggPSB0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7Ci0gIHRoaXMuZGVjb2Rlcl8uYWR2YW5jZShsZW5ndGgpOwotfTsKLQotCi0vKioKLSAqIFNraXBzIG92ZXIgdGhlIG5leHQgZml4ZWQzMiBmaWVsZCBpbiB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnNraXBGaXhlZDMyRmllbGQgPSBmdW5jdGlvbigpIHsKLSAgaWYgKHRoaXMubmV4dFdpcmVUeXBlXyAhPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyKSB7Ci0gICAgZ29vZy5hc3NlcnRzLmZhaWwoJ0ludmFsaWQgd2lyZSB0eXBlIGZvciBza2lwRml4ZWQzMkZpZWxkJyk7Ci0gICAgdGhpcy5za2lwRmllbGQoKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICB0aGlzLmRlY29kZXJfLmFkdmFuY2UoNCk7Ci19OwotCi0KLS8qKgotICogU2tpcHMgb3ZlciB0aGUgbmV4dCBmaXhlZDY0IGZpZWxkIGluIHRoZSBiaW5hcnkgc3RyZWFtLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuc2tpcEZpeGVkNjRGaWVsZCA9IGZ1bmN0aW9uKCkgewotICBpZiAodGhpcy5uZXh0V2lyZVR5cGVfICE9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpIHsKLSAgICBnb29nLmFzc2VydHMuZmFpbCgnSW52YWxpZCB3aXJlIHR5cGUgZm9yIHNraXBGaXhlZDY0RmllbGQnKTsKLSAgICB0aGlzLnNraXBGaWVsZCgpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHRoaXMuZGVjb2Rlcl8uYWR2YW5jZSg4KTsKLX07Ci0KLQotLyoqCi0gKiBTa2lwcyBvdmVyIHRoZSBuZXh0IGdyb3VwIGZpZWxkIGluIHRoZSBiaW5hcnkgc3RyZWFtLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuc2tpcEdyb3VwID0gZnVuY3Rpb24oKSB7Ci0gIC8vIEtlZXAgYSBzdGFjayBvZiBzdGFydC1ncm91cCB0YWdzIHRoYXQgbXVzdCBiZSBtYXRjaGVkIGJ5IGVuZC1ncm91cCB0YWdzLgotICB2YXIgbmVzdGVkR3JvdXBzID0gW3RoaXMubmV4dEZpZWxkX107Ci0gIGRvIHsKLSAgICBpZiAoIXRoaXMubmV4dEZpZWxkKCkpIHsKLSAgICAgIGdvb2cuYXNzZXJ0cy5mYWlsKCdVbm1hdGNoZWQgc3RhcnQtZ3JvdXAgdGFnOiBzdHJlYW0gRU9GJyk7Ci0gICAgICB0aGlzLmVycm9yXyA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIGlmICh0aGlzLm5leHRXaXJlVHlwZV8gPT0KLSAgICAgICAganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuU1RBUlRfR1JPVVApIHsKLSAgICAgIC8vIE5lc3RlZCBncm91cCBzdGFydC4KLSAgICAgIG5lc3RlZEdyb3Vwcy5wdXNoKHRoaXMubmV4dEZpZWxkXyk7Ci0gICAgfSBlbHNlIGlmICh0aGlzLm5leHRXaXJlVHlwZV8gPT0KLSAgICAgICAgICAgICAgIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUCkgewotICAgICAgLy8gR3JvdXAgZW5kOiBjaGVjayB0aGF0IGl0IG1hdGNoZXMgdG9wLW9mLXN0YWNrLgotICAgICAgaWYgKHRoaXMubmV4dEZpZWxkXyAhPSBuZXN0ZWRHcm91cHMucG9wKCkpIHsKLSAgICAgICAgZ29vZy5hc3NlcnRzLmZhaWwoJ1VubWF0Y2hlZCBlbmQtZ3JvdXAgdGFnJyk7Ci0gICAgICAgIHRoaXMuZXJyb3JfID0gdHJ1ZTsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgfSB3aGlsZSAobmVzdGVkR3JvdXBzLmxlbmd0aCA+IDApOwotfTsKLQotCi0vKioKLSAqIFNraXBzIG92ZXIgdGhlIG5leHQgZmllbGQgaW4gdGhlIGJpbmFyeSBzdHJlYW0gLSB0aGlzIGlzIHVzZWZ1bCBpZiB3ZSdyZQotICogZGVjb2RpbmcgYSBtZXNzYWdlIHRoYXQgY29udGFpbiB1bmtub3duIGZpZWxkcy4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnNraXBGaWVsZCA9IGZ1bmN0aW9uKCkgewotICBzd2l0Y2ggKHRoaXMubmV4dFdpcmVUeXBlXykgewotICAgIGNhc2UganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UOgotICAgICAgdGhpcy5za2lwVmFyaW50RmllbGQoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NDoKLSAgICAgIHRoaXMuc2tpcEZpeGVkNjRGaWVsZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQ6Ci0gICAgICB0aGlzLnNraXBEZWxpbWl0ZWRGaWVsZCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyOgotICAgICAgdGhpcy5za2lwRml4ZWQzMkZpZWxkKCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlNUQVJUX0dST1VQOgotICAgICAgdGhpcy5za2lwR3JvdXAoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBnb29nLmFzc2VydHMuZmFpbCgnSW52YWxpZCB3aXJlIGVuY29kaW5nIGZvciBmaWVsZC4nKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFJlZ2lzdGVycyBhIHVzZXItZGVmaW5lZCByZWFkIGNhbGxiYWNrLgotICogQHBhcmFtIHtzdHJpbmd9IGNhbGxiYWNrTmFtZQotICogQHBhcmFtIHtmdW5jdGlvbighanNwYi5CaW5hcnlSZWFkZXIpOip9IGNhbGxiYWNrCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWdpc3RlclJlYWRDYWxsYmFjayA9Ci0gICAgZnVuY3Rpb24oY2FsbGJhY2tOYW1lLCBjYWxsYmFjaykgewotICBpZiAoZ29vZy5pc051bGwodGhpcy5yZWFkQ2FsbGJhY2tzXykpIHsKLSAgICB0aGlzLnJlYWRDYWxsYmFja3NfID0ge307Ci0gIH0KLSAgZ29vZy5hc3NlcnRzLmFzc2VydCghdGhpcy5yZWFkQ2FsbGJhY2tzX1tjYWxsYmFja05hbWVdKTsKLSAgdGhpcy5yZWFkQ2FsbGJhY2tzX1tjYWxsYmFja05hbWVdID0gY2FsbGJhY2s7Ci19OwotCi0KLS8qKgotICogUnVucyBhIHJlZ2lzdGVyZWQgcmVhZCBjYWxsYmFjay4KLSAqIEBwYXJhbSB7c3RyaW5nfSBjYWxsYmFja05hbWUgVGhlIG5hbWUgdGhlIGNhbGxiYWNrIGlzIHJlZ2lzdGVyZWQgdW5kZXIuCi0gKiBAcmV0dXJuIHsqfSBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhlIGNhbGxiYWNrLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucnVuUmVhZENhbGxiYWNrID0gZnVuY3Rpb24oY2FsbGJhY2tOYW1lKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoIWdvb2cuaXNOdWxsKHRoaXMucmVhZENhbGxiYWNrc18pKTsKLSAgdmFyIGNhbGxiYWNrID0gdGhpcy5yZWFkQ2FsbGJhY2tzX1tjYWxsYmFja05hbWVdOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KGNhbGxiYWNrKTsKLSAgcmV0dXJuIGNhbGxiYWNrKHRoaXMpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgZmllbGQgb2YgYW55IHZhbGlkIG5vbi1tZXNzYWdlIHR5cGUgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqIEBwYXJhbSB7anNwYi5CaW5hcnlDb25zdGFudHMuRmllbGRUeXBlfSBmaWVsZFR5cGUKLSAqIEByZXR1cm4ge2pzcGIuQW55RmllbGRUeXBlfQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEFueSA9IGZ1bmN0aW9uKGZpZWxkVHlwZSkgewotICB0aGlzLm5leHRXaXJlVHlwZV8gPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5GaWVsZFR5cGVUb1dpcmVUeXBlKGZpZWxkVHlwZSk7Ci0gIHZhciBmaWVsZFR5cGVzID0ganNwYi5CaW5hcnlDb25zdGFudHMuRmllbGRUeXBlOwotICBzd2l0Y2ggKGZpZWxkVHlwZSkgewotICAgIGNhc2UgZmllbGRUeXBlcy5ET1VCTEU6Ci0gICAgICByZXR1cm4gdGhpcy5yZWFkRG91YmxlKCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLkZMT0FUOgotICAgICAgcmV0dXJuIHRoaXMucmVhZEZsb2F0KCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLklOVDY0OgotICAgICAgcmV0dXJuIHRoaXMucmVhZEludDY0KCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlVJTlQ2NDoKLSAgICAgIHJldHVybiB0aGlzLnJlYWRVaW50NjQoKTsKLSAgICBjYXNlIGZpZWxkVHlwZXMuSU5UMzI6Ci0gICAgICByZXR1cm4gdGhpcy5yZWFkSW50MzIoKTsKLSAgICBjYXNlIGZpZWxkVHlwZXMuRklYRUQ2NDoKLSAgICAgIHJldHVybiB0aGlzLnJlYWRGaXhlZDY0KCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLkZJWEVEMzI6Ci0gICAgICByZXR1cm4gdGhpcy5yZWFkRml4ZWQzMigpOwotICAgIGNhc2UgZmllbGRUeXBlcy5CT09MOgotICAgICAgcmV0dXJuIHRoaXMucmVhZEJvb2woKTsKLSAgICBjYXNlIGZpZWxkVHlwZXMuU1RSSU5HOgotICAgICAgcmV0dXJuIHRoaXMucmVhZFN0cmluZygpOwotICAgIGNhc2UgZmllbGRUeXBlcy5HUk9VUDoKLSAgICAgIGdvb2cuYXNzZXJ0cy5mYWlsKCdHcm91cCBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpJyk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLk1FU1NBR0U6Ci0gICAgICBnb29nLmFzc2VydHMuZmFpbCgnTWVzc2FnZSBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gcmVhZEFueSgpJyk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLkJZVEVTOgotICAgICAgcmV0dXJuIHRoaXMucmVhZEJ5dGVzKCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlVJTlQzMjoKLSAgICAgIHJldHVybiB0aGlzLnJlYWRVaW50MzIoKTsKLSAgICBjYXNlIGZpZWxkVHlwZXMuRU5VTToKLSAgICAgIHJldHVybiB0aGlzLnJlYWRFbnVtKCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlNGSVhFRDMyOgotICAgICAgcmV0dXJuIHRoaXMucmVhZFNmaXhlZDMyKCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlNGSVhFRDY0OgotICAgICAgcmV0dXJuIHRoaXMucmVhZFNmaXhlZDY0KCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlNJTlQzMjoKLSAgICAgIHJldHVybiB0aGlzLnJlYWRTaW50MzIoKTsKLSAgICBjYXNlIGZpZWxkVHlwZXMuU0lOVDY0OgotICAgICAgcmV0dXJuIHRoaXMucmVhZFNpbnQ2NCgpOwotICAgIGNhc2UgZmllbGRUeXBlcy5GSEFTSDY0OgotICAgICAgcmV0dXJuIHRoaXMucmVhZEZpeGVkSGFzaDY0KCk7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlZIQVNINjQ6Ci0gICAgICByZXR1cm4gdGhpcy5yZWFkVmFyaW50SGFzaDY0KCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGdvb2cuYXNzZXJ0cy5mYWlsKCdJbnZhbGlkIGZpZWxkIHR5cGUgaW4gcmVhZEFueSgpJyk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19OwotCi0KLS8qKgotICogRGVzZXJpYWxpemUgYSBwcm90byBpbnRvIHRoZSBwcm92aWRlZCBtZXNzYWdlIG9iamVjdCB1c2luZyB0aGUgcHJvdmlkZWQKLSAqIHJlYWRlciBmdW5jdGlvbi4gVGhpcyBmdW5jdGlvbiBpcyB0ZW1wbGF0ZWQgYXMgd2UgY3VycmVudGx5IGhhdmUgb25lIGNsaWVudAotICogd2hvIGlzIHVzaW5nIG1hbnVhbCBkZXNlcmlhbGl6YXRpb24gaW5zdGVhZCBvZiB0aGUgY29kZS1nZW5lcmF0ZWQgdmVyc2lvbnMuCi0gKiBAdGVtcGxhdGUgVAotICogQHBhcmFtIHtUfSBtZXNzYWdlCi0gKiBAcGFyYW0ge2Z1bmN0aW9uKFQsICFqc3BiLkJpbmFyeVJlYWRlcil9IHJlYWRlcgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZE1lc3NhZ2UgPSBmdW5jdGlvbihtZXNzYWdlLCByZWFkZXIpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQpOwotCi0gIC8vIFNhdmUgdGhlIGN1cnJlbnQgZW5kcG9pbnQgb2YgdGhlIGRlY29kZXIgYW5kIG1vdmUgaXQgdG8gdGhlIGVuZCBvZiB0aGUKLSAgLy8gZW1iZWRkZWQgbWVzc2FnZS4KLSAgdmFyIG9sZEVuZCA9IHRoaXMuZGVjb2Rlcl8uZ2V0RW5kKCk7Ci0gIHZhciBsZW5ndGggPSB0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7Ci0gIHZhciBuZXdFbmQgPSB0aGlzLmRlY29kZXJfLmdldEN1cnNvcigpICsgbGVuZ3RoOwotICB0aGlzLmRlY29kZXJfLnNldEVuZChuZXdFbmQpOwotCi0gIC8vIERlc2VyaWFsaXplIHRoZSBlbWJlZGRlZCBtZXNzYWdlLgotICByZWFkZXIobWVzc2FnZSwgdGhpcyk7Ci0KLSAgLy8gQWR2YW5jZSB0aGUgZGVjb2RlciBwYXN0IHRoZSBlbWJlZGRlZCBtZXNzYWdlIGFuZCByZXN0b3JlIHRoZSBlbmRwb2ludC4KLSAgdGhpcy5kZWNvZGVyXy5zZXRDdXJzb3IobmV3RW5kKTsKLSAgdGhpcy5kZWNvZGVyXy5zZXRFbmQob2xkRW5kKTsKLX07Ci0KLQotLyoqCi0gKiBEZXNlcmlhbGl6ZSBhIHByb3RvIGludG8gdGhlIHByb3ZpZGVkIG1lc3NhZ2Ugb2JqZWN0IHVzaW5nIHRoZSBwcm92aWRlZAotICogcmVhZGVyIGZ1bmN0aW9uLCBhc3N1bWluZyB0aGF0IHRoZSBtZXNzYWdlIGlzIHNlcmlhbGl6ZWQgYXMgYSBncm91cAotICogd2l0aCB0aGUgZ2l2ZW4gdGFnLgotICogQHRlbXBsYXRlIFQKLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZAotICogQHBhcmFtIHtUfSBtZXNzYWdlCi0gKiBAcGFyYW0ge2Z1bmN0aW9uKFQsICFqc3BiLkJpbmFyeVJlYWRlcil9IHJlYWRlcgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEdyb3VwID0KLSAgICBmdW5jdGlvbihmaWVsZCwgbWVzc2FnZSwgcmVhZGVyKSB7Ci0gIC8vIEVuc3VyZSB0aGF0IHRoZSB3aXJlIHR5cGUgaXMgY29ycmVjdC4KLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5TVEFSVF9HUk9VUCk7Ci0gIC8vIEVuc3VyZSB0aGF0IHRoZSBmaWVsZCBudW1iZXIgaXMgY29ycmVjdC4KLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh0aGlzLm5leHRGaWVsZF8gPT0gZmllbGQpOwotCi0gIC8vIERlc2VyaWFsaXplIHRoZSBtZXNzYWdlLiBUaGUgZGVzZXJpYWxpemF0aW9uIHdpbGwgc3RvcCBhdCBhbiBFTkRfR1JPVVAgdGFnLgotICByZWFkZXIobWVzc2FnZSwgdGhpcyk7Ci0KLSAgaWYgKCF0aGlzLmVycm9yXyAmJgotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfICE9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkVORF9HUk9VUCkgewotICAgIGdvb2cuYXNzZXJ0cy5mYWlsKCdHcm91cCBzdWJtZXNzYWdlIGRpZCBub3QgZW5kIHdpdGggYW4gRU5EX0dST1VQIHRhZycpOwotICAgIHRoaXMuZXJyb3JfID0gdHJ1ZTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFJldHVybiBhIGRlY29kZXIgdGhhdCB3cmFwcyB0aGUgY3VycmVudCBkZWxpbWl0ZWQgZmllbGQuCi0gKiBAcmV0dXJuIHshanNwYi5CaW5hcnlEZWNvZGVyfQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUuZ2V0RmllbGREZWNvZGVyID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoCi0gICAgICB0aGlzLm5leHRXaXJlVHlwZV8gPT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLQotICB2YXIgbGVuZ3RoID0gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpOwotICB2YXIgc3RhcnQgPSB0aGlzLmRlY29kZXJfLmdldEN1cnNvcigpOwotICB2YXIgZW5kID0gc3RhcnQgKyBsZW5ndGg7Ci0KLSAgdmFyIGlubmVyRGVjb2RlciA9Ci0gICAgICBqc3BiLkJpbmFyeURlY29kZXIuYWxsb2ModGhpcy5kZWNvZGVyXy5nZXRCdWZmZXIoKSwgc3RhcnQsIGxlbmd0aCk7Ci0gIHRoaXMuZGVjb2Rlcl8uc2V0Q3Vyc29yKGVuZCk7Ci0gIHJldHVybiBpbm5lckRlY29kZXI7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBzaWduZWQgMzItYml0IGludGVnZXIgZmllbGQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbSwgb3IgdGhyb3dzIGFuCi0gKiBlcnJvciBpZiB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgc3RyZWFtIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB3aXJlIHR5cGUuCi0gKgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhlIHNpZ25lZCAzMi1iaXQgaW50ZWdlciBmaWVsZC4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRJbnQzMiA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQzMigpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbgotICogZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgc3RyaW5nLgotICoKLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBzaWduZWQgMzItYml0IGludGVnZXIgZmllbGQgYXMgYSBkZWNpbWFsCi0gKiBzdHJpbmcuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkSW50MzJTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50MzJTdHJpbmcoKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHNpZ25lZCA2NC1iaXQgaW50ZWdlciBmaWVsZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLCBvciB0aHJvd3MgYW4KLSAqIGVycm9yIGlmIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBzdHJlYW0gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHdpcmUgdHlwZS4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGZpZWxkLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEludDY0ID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoCi0gICAgICB0aGlzLm5leHRXaXJlVHlwZV8gPT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgcmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDY0KCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBzaWduZWQgNjQtYml0IGludGVnZXIgZmllbGQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbSwgb3IgdGhyb3dzIGFuCi0gKiBlcnJvciBpZiB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgc3RyZWFtIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB3aXJlIHR5cGUuCi0gKgotICogUmV0dXJucyB0aGUgdmFsdWUgYXMgYSBzdHJpbmcuCi0gKgotICogQHJldHVybiB7c3RyaW5nfSBUaGUgdmFsdWUgb2YgdGhlIHNpZ25lZCA2NC1iaXQgaW50ZWdlciBmaWVsZCBhcyBhIGRlY2ltYWwKLSAqIHN0cmluZy4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRJbnQ2NFN0cmluZyA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZygpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbgotICogZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlIG9mIHRoZSB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmaWVsZC4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRVaW50MzIgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbgotICogZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgc3RyaW5nLgotICoKLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciBmaWVsZCBhcyBhIGRlY2ltYWwKLSAqIHN0cmluZy4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRVaW50MzJTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMlN0cmluZygpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbgotICogZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlIG9mIHRoZSB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciBmaWVsZC4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRVaW50NjQgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NCgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbgotICogZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIFJldHVybnMgdGhlIHZhbHVlIGFzIGEgc3RyaW5nLgotICoKLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciBmaWVsZCBhcyBhIGRlY2ltYWwKLSAqIHN0cmluZy4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRVaW50NjRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NFN0cmluZygpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgc2lnbmVkIHppZ3phZy1lbmNvZGVkIDMyLWJpdCBpbnRlZ2VyIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sCi0gKiBvciB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3QKLSAqIHdpcmUgdHlwZS4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIGZpZWxkLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNpbnQzMiA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQzMigpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgc2lnbmVkIHppZ3phZy1lbmNvZGVkIDY0LWJpdCBpbnRlZ2VyIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sCi0gKiBvciB0aHJvd3MgYW4gZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3QKLSAqIHdpcmUgdHlwZS4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgc2lnbmVkIDY0LWJpdCBpbnRlZ2VyIGZpZWxkLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNpbnQ2NCA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQ2NCgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGFuIHVuc2lnbmVkIDMyLWJpdCBmaXhlZC1sZW5ndGggaW50ZWdlciBmaWllbGQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbSwKLSAqIG9yIHRocm93cyBhbiBlcnJvciBpZiB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgc3RyZWFtIGlzIG5vdCBvZiB0aGUgY29ycmVjdAotICogd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlIG9mIHRoZSBkb3VibGUgZmllbGQuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkRml4ZWQzMiA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVEMzIpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkVWludDMyKCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYW4gdW5zaWduZWQgNjQtYml0IGZpeGVkLWxlbmd0aCBpbnRlZ2VyIGZpaWVsZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLAotICogb3IgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBzdHJlYW0gaXMgbm90IG9mIHRoZSBjb3JyZWN0Ci0gKiB3aXJlIHR5cGUuCi0gKgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhlIGZsb2F0IGZpZWxkLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEZpeGVkNjQgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0KTsKLSAgcmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFVpbnQ2NCgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgc2lnbmVkIDMyLWJpdCBmaXhlZC1sZW5ndGggaW50ZWdlciBmaWllbGQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbSwgb3IKLSAqIHRocm93cyBhbiBlcnJvciBpZiB0aGUgbmV4dCBmaWVsZCBpbiB0aGUgc3RyZWFtIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB3aXJlCi0gKiB0eXBlLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlIG9mIHRoZSBkb3VibGUgZmllbGQuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU2ZpeGVkMzIgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyKTsKLSAgcmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEludDMyKCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBzaWduZWQgNjQtYml0IGZpeGVkLWxlbmd0aCBpbnRlZ2VyIGZpaWVsZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLCBvcgotICogdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBzdHJlYW0gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHdpcmUKLSAqIHR5cGUuCi0gKgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhlIGZsb2F0IGZpZWxkLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNmaXhlZDY0ID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoCi0gICAgICB0aGlzLm5leHRXaXJlVHlwZV8gPT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQ2NCk7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLnJlYWRJbnQ2NCgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgMzItYml0IGZsb2F0aW5nLXBvaW50IGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbgotICogZXJyb3IgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIHZhbHVlIG9mIHRoZSBmbG9hdCBmaWVsZC4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRGbG9hdCA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVEMzIpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkRmxvYXQoKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIDY0LWJpdCBmbG9hdGluZy1wb2ludCBmaWVsZCBmcm9tIHRoZSBiaW5hcnkgc3RyZWFtLCBvciB0aHJvd3MgYW4KLSAqIGVycm9yIGlmIHRoZSBuZXh0IGZpZWxkIGluIHRoZSBzdHJlYW0gaXMgbm90IG9mIHRoZSBjb3JyZWN0IHdpcmUgdHlwZS4KLSAqCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSB2YWx1ZSBvZiB0aGUgZG91YmxlIGZpZWxkLgotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZERvdWJsZSA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpOwotICByZXR1cm4gdGhpcy5kZWNvZGVyXy5yZWFkRG91YmxlKCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBib29sZWFuIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbiBlcnJvciBpZiB0aGUgbmV4dAotICogZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge2Jvb2xlYW59IFRoZSB2YWx1ZSBvZiB0aGUgYm9vbGVhbiBmaWVsZC4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRCb29sID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoCi0gICAgICB0aGlzLm5leHRXaXJlVHlwZV8gPT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgcmV0dXJuICEhdGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQzMigpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGFuIGVudW0gZmllbGQgZnJvbSB0aGUgYmluYXJ5IHN0cmVhbSwgb3IgdGhyb3dzIGFuIGVycm9yIGlmIHRoZSBuZXh0Ci0gKiBmaWVsZCBpbiB0aGUgc3RyZWFtIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB3aXJlIHR5cGUuCi0gKgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgdmFsdWUgb2YgdGhlIGVudW0gZmllbGQuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkRW51bSA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NCgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgc3RyaW5nIGZpZWxkIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHRocm93cyBhbiBlcnJvciBpZiB0aGUgbmV4dAotICogZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIHZhbHVlIG9mIHRoZSBzdHJpbmcgZmllbGQuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU3RyaW5nID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoCi0gICAgICB0aGlzLm5leHRXaXJlVHlwZV8gPT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLSAgdmFyIGxlbmd0aCA9IHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTsKLSAgcmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFN0cmluZyhsZW5ndGgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgbGVuZ3RoLXByZWZpeGVkIGJsb2NrIG9mIGJ5dGVzIGZyb20gdGhlIGJpbmFyeSBzdHJlYW0sIG9yIHJldHVybnMKLSAqIG51bGwgaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBoYXMgYW4gaW52YWxpZCBsZW5ndGggdmFsdWUuCi0gKgotICogQHJldHVybiB7IVVpbnQ4QXJyYXl9IFRoZSBibG9jayBvZiBieXRlcy4KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRCeXRlcyA9IGZ1bmN0aW9uKCkgewotICBnb29nLmFzc2VydHMuYXNzZXJ0KAotICAgICAgdGhpcy5uZXh0V2lyZVR5cGVfID09IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCk7Ci0gIHZhciBsZW5ndGggPSB0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKCk7Ci0gIHJldHVybiB0aGlzLmRlY29kZXJfLnJlYWRCeXRlcyhsZW5ndGgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgNjQtYml0IHZhcmludCBvciBmaXhlZDY0IGZpZWxkIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhCi0gKiA4LWNoYXJhY3RlciBVbmljb2RlIHN0cmluZyBmb3IgdXNlIGFzIGEgaGFzaCB0YWJsZSBrZXksIG9yIHRocm93cyBhbiBlcnJvcgotICogaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGhhc2ggdmFsdWUuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkVmFyaW50SGFzaDY0ID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoCi0gICAgICB0aGlzLm5leHRXaXJlVHlwZV8gPT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgcmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZFZhcmludEhhc2g2NCgpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgNjQtYml0IHZhcmludCBvciBmaXhlZDY0IGZpZWxkIGZyb20gdGhlIHN0cmVhbSBhbmQgcmV0dXJucyBpdCBhcyBhCi0gKiA4LWNoYXJhY3RlciBVbmljb2RlIHN0cmluZyBmb3IgdXNlIGFzIGEgaGFzaCB0YWJsZSBrZXksIG9yIHRocm93cyBhbiBlcnJvcgotICogaWYgdGhlIG5leHQgZmllbGQgaW4gdGhlIHN0cmVhbSBpcyBub3Qgb2YgdGhlIGNvcnJlY3Qgd2lyZSB0eXBlLgotICoKLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGhhc2ggdmFsdWUuCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkRml4ZWRIYXNoNjQgPSBmdW5jdGlvbigpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgKLSAgICAgIHRoaXMubmV4dFdpcmVUeXBlXyA9PSBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0KTsKLSAgcmV0dXJuIHRoaXMuZGVjb2Rlcl8ucmVhZEZpeGVkSGFzaDY0KCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBwYWNrZWQgc2NhbGFyIGZpZWxkIHVzaW5nIHRoZSBzdXBwbGllZCByYXcgcmVhZGVyIGZ1bmN0aW9uLgotICogQHBhcmFtIHtmdW5jdGlvbigpfSBkZWNvZGVNZXRob2QKLSAqIEByZXR1cm4geyFBcnJheX0KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkRmllbGRfID0gZnVuY3Rpb24oZGVjb2RlTWV0aG9kKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoCi0gICAgICB0aGlzLm5leHRXaXJlVHlwZV8gPT0ganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLSAgdmFyIGxlbmd0aCA9IHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzIoKTsKLSAgdmFyIGVuZCA9IHRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCkgKyBsZW5ndGg7Ci0gIHZhciByZXN1bHQgPSBbXTsKLSAgd2hpbGUgKHRoaXMuZGVjb2Rlcl8uZ2V0Q3Vyc29yKCkgPCBlbmQpIHsKLSAgICAvLyBUT0RPKGFhcHBsZWJ5KTogLmNhbGwgaXMgc2xvdwotICAgIHJlc3VsdC5wdXNoKGRlY29kZU1ldGhvZC5jYWxsKHRoaXMuZGVjb2Rlcl8pKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcGFja2VkIGludDMyIGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdCBvZgotICogc2lnbmVkIHZhcmludHMuCi0gKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkSW50MzIgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQzMik7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBwYWNrZWQgaW50MzIgZmllbGQsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIGhlYWRlciBhbmQgYSBsaXN0IG9mCi0gKiBzaWduZWQgdmFyaW50cy4gUmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncy4KLSAqIEByZXR1cm4geyFBcnJheS48c3RyaW5nPn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRJbnQzMlN0cmluZyA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFNpZ25lZFZhcmludDMyU3RyaW5nKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCBpbnQ2NCBmaWVsZCwgd2hpY2ggY29uc2lzdHMgb2YgYSBsZW5ndGggaGVhZGVyIGFuZCBhIGxpc3Qgb2YKLSAqIHNpZ25lZCB2YXJpbnRzLgotICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZEludDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkU2lnbmVkVmFyaW50NjQpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcGFja2VkIGludDY0IGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdCBvZgotICogc2lnbmVkIHZhcmludHMuIFJldHVybnMgYSBsaXN0IG9mIHN0cmluZ3MuCi0gKiBAcmV0dXJuIHshQXJyYXkuPHN0cmluZz59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkSW50NjRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRTaWduZWRWYXJpbnQ2NFN0cmluZyk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBwYWNrZWQgdWludDMyIGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdCBvZgotICogdW5zaWduZWQgdmFyaW50cy4KLSAqIEByZXR1cm4geyFBcnJheS48bnVtYmVyPn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRVaW50MzIgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDMyKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCB1aW50MzIgZmllbGQsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIGhlYWRlciBhbmQgYSBsaXN0IG9mCi0gKiB1bnNpZ25lZCB2YXJpbnRzLiBSZXR1cm5zIGEgbGlzdCBvZiBzdHJpbmdzLgotICogQHJldHVybiB7IUFycmF5LjxzdHJpbmc+fQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZFVpbnQzMlN0cmluZyA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFVuc2lnbmVkVmFyaW50MzJTdHJpbmcpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcGFja2VkIHVpbnQ2NCBmaWVsZCwgd2hpY2ggY29uc2lzdHMgb2YgYSBsZW5ndGggaGVhZGVyIGFuZCBhIGxpc3Qgb2YKLSAqIHVuc2lnbmVkIHZhcmludHMuCi0gKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkVWludDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVW5zaWduZWRWYXJpbnQ2NCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBwYWNrZWQgdWludDY0IGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdCBvZgotICogdW5zaWduZWQgdmFyaW50cy4gUmV0dXJucyBhIGxpc3Qgb2Ygc3RyaW5ncy4KLSAqIEByZXR1cm4geyFBcnJheS48c3RyaW5nPn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRVaW50NjRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRVbnNpZ25lZFZhcmludDY0U3RyaW5nKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCBzaW50MzIgZmllbGQsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIGhlYWRlciBhbmQgYSBsaXN0IG9mCi0gKiB6aWd6YWcgdmFyaW50cy4KLSAqIEByZXR1cm4geyFBcnJheS48bnVtYmVyPn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRTaW50MzIgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRaaWd6YWdWYXJpbnQzMik7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBwYWNrZWQgc2ludDY0IGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdCBvZgotICogemlnemFnIHZhcmludHMuCi0gKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkU2ludDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkWmlnemFnVmFyaW50NjQpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcGFja2VkIGZpeGVkMzIgZmllbGQsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIGhlYWRlciBhbmQgYSBsaXN0Ci0gKiBvZiB1bnNpZ25lZCAzMi1iaXQgaW50cy4KLSAqIEByZXR1cm4geyFBcnJheS48bnVtYmVyPn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRGaXhlZDMyID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVWludDMyKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCBmaXhlZDY0IGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdAotICogb2YgdW5zaWduZWQgNjQtYml0IGludHMuCi0gKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkRml4ZWQ2NCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZFVpbnQ2NCk7Ci19OwotCi0KLS8qKgotICogUmVhZHMgYSBwYWNrZWQgc2ZpeGVkMzIgZmllbGQsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIGhlYWRlciBhbmQgYSBsaXN0Ci0gKiBvZiAzMi1iaXQgaW50cy4KLSAqIEByZXR1cm4geyFBcnJheS48bnVtYmVyPn0KLSAqLwotanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRQYWNrZWRTZml4ZWQzMiA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEludDMyKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCBzZml4ZWQ2NCBmaWVsZCwgd2hpY2ggY29uc2lzdHMgb2YgYSBsZW5ndGggaGVhZGVyIGFuZCBhIGxpc3QKLSAqIG9mIDY0LWJpdCBpbnRzLgotICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZFNmaXhlZDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkSW50NjQpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcGFja2VkIGZsb2F0IGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdCBvZgotICogZmxvYXRzLgotICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZEZsb2F0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkRmxvYXQpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcGFja2VkIGRvdWJsZSBmaWVsZCwgd2hpY2ggY29uc2lzdHMgb2YgYSBsZW5ndGggaGVhZGVyIGFuZCBhIGxpc3Qgb2YKLSAqIGRvdWJsZXMuCi0gKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkRG91YmxlID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkRG91YmxlKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCBib29sIGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEgbGlzdCBvZgotICogdW5zaWduZWQgdmFyaW50cy4KLSAqIEByZXR1cm4geyFBcnJheS48Ym9vbGVhbj59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkQm9vbCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5yZWFkUGFja2VkRmllbGRfKHRoaXMuZGVjb2Rlcl8ucmVhZEJvb2wpOwotfTsKLQotCi0vKioKLSAqIFJlYWRzIGEgcGFja2VkIGVudW0gZmllbGQsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIGhlYWRlciBhbmQgYSBsaXN0IG9mCi0gKiB1bnNpZ25lZCB2YXJpbnRzLgotICogQHJldHVybiB7IUFycmF5LjxudW1iZXI+fQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZEVudW0gPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMucmVhZFBhY2tlZEZpZWxkXyh0aGlzLmRlY29kZXJfLnJlYWRFbnVtKTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCB2YXJpbnQgaGFzaDY0IGZpZWxkLCB3aGljaCBjb25zaXN0cyBvZiBhIGxlbmd0aCBoZWFkZXIgYW5kIGEKLSAqIGxpc3Qgb2YgdmFyaW50IGhhc2g2NHMuCi0gKiBAcmV0dXJuIHshQXJyYXkuPHN0cmluZz59Ci0gKi8KLWpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkUGFja2VkVmFyaW50SGFzaDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkVmFyaW50SGFzaDY0KTsKLX07Ci0KLQotLyoqCi0gKiBSZWFkcyBhIHBhY2tlZCBmaXhlZCBoYXNoNjQgZmllbGQsIHdoaWNoIGNvbnNpc3RzIG9mIGEgbGVuZ3RoIGhlYWRlciBhbmQgYQotICogbGlzdCBvZiBmaXhlZCBoYXNoNjRzLgotICogQHJldHVybiB7IUFycmF5LjxzdHJpbmc+fQotICovCi1qc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFBhY2tlZEZpeGVkSGFzaDY0ID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiB0aGlzLnJlYWRQYWNrZWRGaWVsZF8odGhpcy5kZWNvZGVyXy5yZWFkRml4ZWRIYXNoNjQpOwotfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9yZWFkZXJfdGVzdC5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS9yZWFkZXJfdGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmY3ZTVkNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvcmVhZGVyX3Rlc3QuanMKKysrIC9kZXYvbnVsbApAQCAtMSw4NzMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8qKgotICogQGZpbGVvdmVydmlldyBUZXN0IGNhc2VzIGZvciBqc3BiJ3MgYmluYXJ5IHByb3RvY29sIGJ1ZmZlciByZWFkZXIuCi0gKgotICogVGhlcmUgYXJlIHR3byBwYXJ0aWN1bGFyIG1hZ2ljIG51bWJlcnMgdGhhdCBuZWVkIHRvIGJlIHBvaW50ZWQgb3V0IC0KLSAqIDJeNjQtMTAyNSBpcyB0aGUgbGFyZ2VzdCBudW1iZXIgcmVwcmVzZW50YWJsZSBhcyBib3RoIGEgZG91YmxlIGFuZCBhbgotICogdW5zaWduZWQgNjQtYml0IGludGVnZXIsIGFuZCAyXjYzLTUxMyBpcyB0aGUgbGFyZ2VzdCBudW1iZXIgcmVwcmVzZW50YWJsZSBhcwotICogYm90aCBhIGRvdWJsZSBhbmQgYSBzaWduZWQgNjQtYml0IGludGVnZXIuCi0gKgotICogVGVzdCBzdWl0ZSBpcyB3cml0dGVuIHVzaW5nIEphc21pbmUgLS0gc2VlIGh0dHA6Ly9qYXNtaW5lLmdpdGh1Yi5pby8KLSAqCi0gKiBAYXV0aG9yIGFhcHBsZWJ5QGdvb2dsZS5jb20gKEF1c3RpbiBBcHBsZWJ5KQotICovCi0KLWdvb2cucmVxdWlyZSgnZ29vZy50ZXN0aW5nLmFzc2VydHMnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlDb25zdGFudHMnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlEZWNvZGVyJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5UmVhZGVyJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5V3JpdGVyJyk7Ci0KLQotCi1kZXNjcmliZSgnYmluYXJ5UmVhZGVyVGVzdCcsIGZ1bmN0aW9uKCkgewotICAvKioKLSAgICogVGVzdHMgdGhlIHJlYWRlciBpbnN0YW5jZSBjYWNoZS4KLSAgICogQHN1cHByZXNzIHt2aXNpYmlsaXR5fQotICAgKi8KLSAgaXQoJ3Rlc3RJbnN0YW5jZUNhY2hlcycsIGZ1bmN0aW9uKCkgewotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLSAgICB2YXIgZHVtbXlNZXNzYWdlID0gLyoqIEB0eXBlIHshanNwYi5CaW5hcnlNZXNzYWdlfSAqLyh7fSk7Ci0gICAgd3JpdGVyLndyaXRlTWVzc2FnZSgxLCBkdW1teU1lc3NhZ2UsIGdvb2cubnVsbEZ1bmN0aW9uKTsKLSAgICB3cml0ZXIud3JpdGVNZXNzYWdlKDIsIGR1bW15TWVzc2FnZSwgZ29vZy5udWxsRnVuY3Rpb24pOwotCi0gICAgdmFyIGJ1ZmZlciA9IHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKTsKLQotICAgIC8vIEVtcHR5IHRoZSBpbnN0YW5jZSBjYWNoZXMuCi0gICAganNwYi5CaW5hcnlSZWFkZXIuaW5zdGFuY2VDYWNoZV8gPSBbXTsKLQotICAgIC8vIEFsbG9jYXRpbmcgYW5kIHRoZW4gZnJlZWluZyB0aHJlZSBkZWNvZGVycyBzaG91bGQgbGVhdmUgdXMgd2l0aCB0aHJlZSBpbgotICAgIC8vIHRoZSBjYWNoZS4KLQotICAgIHZhciBkZWNvZGVyMSA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYygpOwotICAgIHZhciBkZWNvZGVyMiA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYygpOwotICAgIHZhciBkZWNvZGVyMyA9IGpzcGIuQmluYXJ5RGVjb2Rlci5hbGxvYygpOwotICAgIGRlY29kZXIxLmZyZWUoKTsKLSAgICBkZWNvZGVyMi5mcmVlKCk7Ci0gICAgZGVjb2RlcjMuZnJlZSgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDMsIGpzcGIuQmluYXJ5RGVjb2Rlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgpOwotICAgIGFzc2VydEVxdWFscygwLCBqc3BiLkJpbmFyeVJlYWRlci5pbnN0YW5jZUNhY2hlXy5sZW5ndGgpOwotCi0gICAgLy8gQWxsb2NhdGluZyBhbmQgdGhlbiBmcmVlaW5nIGEgcmVhZGVyIHNob3VsZCByZW1vdmUgb25lIGRlY29kZXIgZnJvbSBpdHMKLSAgICAvLyBjYWNoZSwgYnV0IGl0IHNob3VsZCBzdGF5IHN0dWNrIHRvIHRoZSByZWFkZXIgYWZ0ZXJ3YXJkcyBzaW5jZSB3ZSBjYW4ndAotICAgIC8vIGhhdmUgYSByZWFkZXIgd2l0aG91dCBhIGRlY29kZXIuCi0gICAganNwYi5CaW5hcnlSZWFkZXIuYWxsb2MoKS5mcmVlKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMiwganNwYi5CaW5hcnlEZWNvZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0KLSAgICAvLyBBbGxvY2F0aW5nIGEgcmVhZGVyIHNob3VsZCByZW1vdmUgYSByZWFkZXIgZnJvbSB0aGUgY2FjaGUuCi0gICAgdmFyIHJlYWRlciA9IGpzcGIuQmluYXJ5UmVhZGVyLmFsbG9jKGJ1ZmZlcik7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMiwganNwYi5CaW5hcnlEZWNvZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0KLSAgICAvLyBQcm9jZXNzaW5nIHRoZSBtZXNzYWdlIHJldXNlcyB0aGUgY3VycmVudCByZWFkZXIuCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygxLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgcmVhZGVyLnJlYWRNZXNzYWdlKGR1bW15TWVzc2FnZSwgZnVuY3Rpb24oKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoMCwganNwYi5CaW5hcnlSZWFkZXIuaW5zdGFuY2VDYWNoZV8ubGVuZ3RoKTsKLSAgICB9KTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIHJlYWRlci5yZWFkTWVzc2FnZShkdW1teU1lc3NhZ2UsIGZ1bmN0aW9uKCkgewotICAgICAgYXNzZXJ0RXF1YWxzKDAsIGpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0gICAgfSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0RmllbGQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMiwganNwYi5CaW5hcnlEZWNvZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0KLSAgICAvLyBGcmVlaW5nIHRoZSByZWFkZXIgc2hvdWxkIHB1dCBpdCBiYWNrIGludG8gdGhlIGNhY2hlLgotICAgIHJlYWRlci5mcmVlKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMiwganNwYi5CaW5hcnlEZWNvZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGpzcGIuQmluYXJ5UmVhZGVyLmluc3RhbmNlQ2FjaGVfLmxlbmd0aCk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIEBwYXJhbSB7bnVtYmVyfSB4Ci0gICAqIEByZXR1cm4ge251bWJlcn0KLSAgICovCi0gIGZ1bmN0aW9uIHRydW5jYXRlKHgpIHsKLSAgICB2YXIgdGVtcCA9IG5ldyBGbG9hdDMyQXJyYXkoMSk7Ci0gICAgdGVtcFswXSA9IHg7Ci0gICAgcmV0dXJuIHRlbXBbMF07Ci0gIH0KLQotCi0gIC8qKgotICAgKiBWZXJpZmllcyB0aGF0IG1pc3VzZSBvZiB0aGUgcmVhZGVyIGNsYXNzIHRyaWdnZXJzIGFzc2VydGlvbnMuCi0gICAqIEBzdXBwcmVzcyB7Y2hlY2tUeXBlc3x2aXNpYmlsaXR5fQotICAgKi8KLSAgaXQoJ3Rlc3RSZWFkRXJyb3JzJywgZnVuY3Rpb24oKSB7Ci0gICAgLy8gQ2FsbGluZyByZWFkTWVzc2FnZSBvbiBhIG5vbi1kZWxpbWl0ZWQgZmllbGQgc2hvdWxkIHRyaWdnZXIgYW4KLSAgICAvLyBhc3NlcnRpb24uCi0gICAgdmFyIHJlYWRlciA9IGpzcGIuQmluYXJ5UmVhZGVyLmFsbG9jKFs4LCAxXSk7Ci0gICAgdmFyIGR1bW15TWVzc2FnZSA9IC8qKiBAdHlwZSB7IWpzcGIuQmluYXJ5TWVzc2FnZX0gKi8oe30pOwotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7Ci0gICAgICByZWFkZXIucmVhZE1lc3NhZ2UoZHVtbXlNZXNzYWdlLCBnb29nLm51bGxGdW5jdGlvbik7Ci0gICAgfSk7Ci0KLSAgICAvLyBSZWFkaW5nIHBhc3QgdGhlIGVuZCBvZiB0aGUgc3RyZWFtIHNob3VsZCB0cmlnZ2VyIGFuIGFzc2VydGlvbi4KLSAgICByZWFkZXIgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYyhbOSwgMV0pOwotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRGaXhlZDY0KCl9KTsKLQotICAgIC8vIFJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIGEgc3VibWVzc2FnZSBzaG91bGQgdHJpZ2dlciBhbiBhc3NlcnRpb24uCi0gICAgcmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXIuYWxsb2MoWzEwLCA0LCAxMywgMSwgMSwgMV0pOwotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICByZWFkZXIucmVhZE1lc3NhZ2UoZHVtbXlNZXNzYWdlLCBmdW5jdGlvbigpIHsKLSAgICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtyZWFkZXIucmVhZEZpeGVkMzIoKX0pOwotICAgIH0pOwotCi0gICAgLy8gU2tpcHBpbmcgYW4gaW52YWxpZCBmaWVsZCBzaG91bGQgdHJpZ2dlciBhbiBhc3NlcnRpb24uCi0gICAgcmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXIuYWxsb2MoWzEyLCAxXSk7Ci0gICAgcmVhZGVyLm5leHRXaXJlVHlwZV8gPSAxMDAwOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtyZWFkZXIuc2tpcEZpZWxkKCl9KTsKLQotICAgIC8vIFJlYWRpbmcgZmllbGRzIHdpdGggdGhlIHdyb25nIHdpcmUgdHlwZSBzaG91bGQgYXNzZXJ0LgotICAgIHJlYWRlciA9IGpzcGIuQmluYXJ5UmVhZGVyLmFsbG9jKFs5LCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwXSk7Ci0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtyZWFkZXIucmVhZEludDMyKCl9KTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRJbnQzMlN0cmluZygpfSk7Ci0gICAgYXNzZXJ0VGhyb3dzKGZ1bmN0aW9uKCkge3JlYWRlci5yZWFkSW50NjQoKX0pOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtyZWFkZXIucmVhZEludDY0U3RyaW5nKCl9KTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRVaW50MzIoKX0pOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtyZWFkZXIucmVhZFVpbnQzMlN0cmluZygpfSk7Ci0gICAgYXNzZXJ0VGhyb3dzKGZ1bmN0aW9uKCkge3JlYWRlci5yZWFkVWludDY0KCl9KTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRVaW50NjRTdHJpbmcoKX0pOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtyZWFkZXIucmVhZFNpbnQzMigpfSk7Ci0gICAgYXNzZXJ0VGhyb3dzKGZ1bmN0aW9uKCkge3JlYWRlci5yZWFkQm9vbCgpfSk7Ci0gICAgYXNzZXJ0VGhyb3dzKGZ1bmN0aW9uKCkge3JlYWRlci5yZWFkRW51bSgpfSk7Ci0KLSAgICByZWFkZXIgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYyhbOCwgMV0pOwotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRGaXhlZDMyKCl9KTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRGaXhlZDY0KCl9KTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRTZml4ZWQzMigpfSk7Ci0gICAgYXNzZXJ0VGhyb3dzKGZ1bmN0aW9uKCkge3JlYWRlci5yZWFkU2ZpeGVkNjQoKX0pOwotICAgIGFzc2VydFRocm93cyhmdW5jdGlvbigpIHtyZWFkZXIucmVhZEZsb2F0KCl9KTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWREb3VibGUoKX0pOwotCi0gICAgYXNzZXJ0VGhyb3dzKGZ1bmN0aW9uKCkge3JlYWRlci5yZWFkU3RyaW5nKCl9KTsKLSAgICBhc3NlcnRUaHJvd3MoZnVuY3Rpb24oKSB7cmVhZGVyLnJlYWRCeXRlcygpfSk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGVuY29kaW5nIGFuZCBkZWNvZGluZyBvZiB1bnNpZ25lZCBmaWVsZCB0eXBlcy4KLSAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVhZEZpZWxkCi0gICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyaXRlRmllbGQKLSAgICogQHBhcmFtIHtudW1iZXJ9IGVwc2lsb24KLSAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyTGltaXQKLSAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyCi0gICAqIEBwcml2YXRlCi0gICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9Ci0gICAqLwotICBmdW5jdGlvbiBkb1Rlc3RVbnNpZ25lZEZpZWxkXyhyZWFkRmllbGQsCi0gICAgICB3cml0ZUZpZWxkLCBlcHNpbG9uLCB1cHBlckxpbWl0LCBmaWx0ZXIpIHsKLSAgICBhc3NlcnROb3ROdWxsKHJlYWRGaWVsZCk7Ci0gICAgYXNzZXJ0Tm90TnVsbCh3cml0ZUZpZWxkKTsKLQotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLQotICAgIC8vIEVuY29kZSB6ZXJvIGFuZCBsaW1pdHMuCi0gICAgd3JpdGVGaWVsZC5jYWxsKHdyaXRlciwgMSwgZmlsdGVyKDApKTsKLSAgICB3cml0ZUZpZWxkLmNhbGwod3JpdGVyLCAyLCBmaWx0ZXIoZXBzaWxvbikpOwotICAgIHdyaXRlRmllbGQuY2FsbCh3cml0ZXIsIDMsIGZpbHRlcih1cHBlckxpbWl0KSk7Ci0KLSAgICAvLyBFbmNvZGUgcG9zaXRpdmUgdmFsdWVzLgotICAgIGZvciAodmFyIGN1cnNvciA9IGVwc2lsb247IGN1cnNvciA8IHVwcGVyTGltaXQ7IGN1cnNvciAqPSAxLjEpIHsKLSAgICAgIHdyaXRlRmllbGQuY2FsbCh3cml0ZXIsIDQsIGZpbHRlcihjdXJzb3IpKTsKLSAgICB9Ci0KLSAgICB2YXIgcmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXIuYWxsb2Mod3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpKTsKLQotICAgIC8vIENoZWNrIHplcm8gYW5kIGxpbWl0cy4KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoZmlsdGVyKDApLCByZWFkRmllbGQuY2FsbChyZWFkZXIpKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhmaWx0ZXIoZXBzaWxvbiksIHJlYWRGaWVsZC5jYWxsKHJlYWRlcikpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygzLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZpbHRlcih1cHBlckxpbWl0KSwgcmVhZEZpZWxkLmNhbGwocmVhZGVyKSk7Ci0KLSAgICAvLyBDaGVjayBwb3NpdGl2ZSB2YWx1ZXMuCi0gICAgZm9yICh2YXIgY3Vyc29yID0gZXBzaWxvbjsgY3Vyc29yIDwgdXBwZXJMaW1pdDsgY3Vyc29yICo9IDEuMSkgewotICAgICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgICAgaWYgKDQgIT0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHRocm93ICdmYWlsISc7Ci0gICAgICBpZiAoZmlsdGVyKGN1cnNvcikgIT0gcmVhZEZpZWxkLmNhbGwocmVhZGVyKSkgdGhyb3cgJ2ZhaWwhJzsKLSAgICB9Ci0gIH07Ci0KLQotICAvKioKLSAgICogVGVzdHMgZW5jb2RpbmcgYW5kIGRlY29kaW5nIG9mIHNpZ25lZCBmaWVsZCB0eXBlcy4KLSAgICogQHBhcmFtIHtGdW5jdGlvbn0gcmVhZEZpZWxkCi0gICAqIEBwYXJhbSB7RnVuY3Rpb259IHdyaXRlRmllbGQKLSAgICogQHBhcmFtIHtudW1iZXJ9IGVwc2lsb24KLSAgICogQHBhcmFtIHtudW1iZXJ9IGxvd2VyTGltaXQKLSAgICogQHBhcmFtIHtudW1iZXJ9IHVwcGVyTGltaXQKLSAgICogQHBhcmFtIHtGdW5jdGlvbn0gZmlsdGVyCi0gICAqIEBwcml2YXRlCi0gICAqIEBzdXBwcmVzcyB7bWlzc2luZ1Byb3BlcnRpZXN9Ci0gICAqLwotICBmdW5jdGlvbiBkb1Rlc3RTaWduZWRGaWVsZF8ocmVhZEZpZWxkLAotICAgICAgd3JpdGVGaWVsZCwgZXBzaWxvbiwgbG93ZXJMaW1pdCwgdXBwZXJMaW1pdCwgZmlsdGVyKSB7Ci0gICAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpOwotCi0gICAgLy8gRW5jb2RlIHplcm8gYW5kIGxpbWl0cy4KLSAgICB3cml0ZUZpZWxkLmNhbGwod3JpdGVyLCAxLCBmaWx0ZXIobG93ZXJMaW1pdCkpOwotICAgIHdyaXRlRmllbGQuY2FsbCh3cml0ZXIsIDIsIGZpbHRlcigtZXBzaWxvbikpOwotICAgIHdyaXRlRmllbGQuY2FsbCh3cml0ZXIsIDMsIGZpbHRlcigwKSk7Ci0gICAgd3JpdGVGaWVsZC5jYWxsKHdyaXRlciwgNCwgZmlsdGVyKGVwc2lsb24pKTsKLSAgICB3cml0ZUZpZWxkLmNhbGwod3JpdGVyLCA1LCBmaWx0ZXIodXBwZXJMaW1pdCkpOwotCi0gICAgdmFyIGlucHV0VmFsdWVzID0gW107Ci0KLSAgICAvLyBFbmNvZGUgbmVnYXRpdmUgdmFsdWVzLgotICAgIGZvciAodmFyIGN1cnNvciA9IGxvd2VyTGltaXQ7IGN1cnNvciA8IC1lcHNpbG9uOyBjdXJzb3IgLz0gMS4xKSB7Ci0gICAgICB2YXIgdmFsID0gZmlsdGVyKGN1cnNvcik7Ci0gICAgICB3cml0ZUZpZWxkLmNhbGwod3JpdGVyLCA2LCB2YWwpOwotICAgICAgaW5wdXRWYWx1ZXMucHVzaCh7Ci0gICAgICAgIGZpZWxkTnVtYmVyOiA2LAotICAgICAgICB2YWx1ZTogdmFsCi0gICAgICB9KTsKLSAgICB9Ci0KLSAgICAvLyBFbmNvZGUgcG9zaXRpdmUgdmFsdWVzLgotICAgIGZvciAodmFyIGN1cnNvciA9IGVwc2lsb247IGN1cnNvciA8IHVwcGVyTGltaXQ7IGN1cnNvciAqPSAxLjEpIHsKLSAgICAgIHZhciB2YWwgPSBmaWx0ZXIoY3Vyc29yKTsKLSAgICAgIHdyaXRlRmllbGQuY2FsbCh3cml0ZXIsIDcsIHZhbCk7Ci0gICAgICBpbnB1dFZhbHVlcy5wdXNoKHsKLSAgICAgICAgZmllbGROdW1iZXI6IDcsCi0gICAgICAgIHZhbHVlOiB2YWwKLSAgICAgIH0pOwotICAgIH0KLQotICAgIHZhciByZWFkZXIgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYyh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotCi0gICAgLy8gQ2hlY2sgemVybyBhbmQgbGltaXRzLgotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhmaWx0ZXIobG93ZXJMaW1pdCksIHJlYWRGaWVsZC5jYWxsKHJlYWRlcikpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygyLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZpbHRlcigtZXBzaWxvbiksIHJlYWRGaWVsZC5jYWxsKHJlYWRlcikpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygzLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZpbHRlcigwKSwgcmVhZEZpZWxkLmNhbGwocmVhZGVyKSk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoZmlsdGVyKGVwc2lsb24pLCByZWFkRmllbGQuY2FsbChyZWFkZXIpKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhmaWx0ZXIodXBwZXJMaW1pdCksIHJlYWRGaWVsZC5jYWxsKHJlYWRlcikpOwotCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBpbnB1dFZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgdmFyIGV4cGVjdGVkID0gaW5wdXRWYWx1ZXNbaV07Ci0gICAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZmllbGROdW1iZXIsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICAgIGFzc2VydEVxdWFscyhleHBlY3RlZC52YWx1ZSwgcmVhZEZpZWxkLmNhbGwocmVhZGVyKSk7Ci0gICAgfQotICB9OwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGZpZWxkcyB0aGF0IHVzZSB2YXJpbnQgZW5jb2RpbmcuCi0gICAqLwotICBpdCgndGVzdFZhcmludEZpZWxkcycsIGZ1bmN0aW9uKCkgewotICAgIGFzc2VydE5vdE51bGwoanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRVaW50MzIpOwotICAgIGFzc2VydE5vdE51bGwoanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLndyaXRlVWludDMyKTsKLSAgICBhc3NlcnROb3ROdWxsKGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkVWludDY0KTsKLSAgICBhc3NlcnROb3ROdWxsKGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS53cml0ZVVpbnQ2NCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEJvb2wpOwotICAgIGFzc2VydE5vdE51bGwoanNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLndyaXRlQm9vbCk7Ci0gICAgZG9UZXN0VW5zaWduZWRGaWVsZF8oCi0gICAgICAgIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkVWludDMyLAotICAgICAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVVaW50MzIsCi0gICAgICAgIDEsIE1hdGgucG93KDIsIDMyKSAtIDEsIE1hdGgucm91bmQpOwotCi0gICAgZG9UZXN0VW5zaWduZWRGaWVsZF8oCi0gICAgICAgIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkVWludDY0LAotICAgICAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVVaW50NjQsCi0gICAgICAgIDEsIE1hdGgucG93KDIsIDY0KSAtIDEwMjUsIE1hdGgucm91bmQpOwotCi0gICAgZG9UZXN0U2lnbmVkRmllbGRfKAotICAgICAgICBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEludDMyLAotICAgICAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVJbnQzMiwKLSAgICAgICAgMSwgLU1hdGgucG93KDIsIDMxKSwgTWF0aC5wb3coMiwgMzEpIC0gMSwgTWF0aC5yb3VuZCk7Ci0KLSAgICBkb1Rlc3RTaWduZWRGaWVsZF8oCi0gICAgICAgIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkSW50NjQsCi0gICAgICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUludDY0LAotICAgICAgICAxLCAtTWF0aC5wb3coMiwgNjMpLCBNYXRoLnBvdygyLCA2MykgLSA1MTMsIE1hdGgucm91bmQpOwotCi0gICAgZG9UZXN0U2lnbmVkRmllbGRfKAotICAgICAgICBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEVudW0sCi0gICAgICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUVudW0sCi0gICAgICAgIDEsIC1NYXRoLnBvdygyLCAzMSksIE1hdGgucG93KDIsIDMxKSAtIDEsIE1hdGgucm91bmQpOwotCi0gICAgZG9UZXN0VW5zaWduZWRGaWVsZF8oCi0gICAgICAgIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkQm9vbCwKLSAgICAgICAganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlQm9vbCwKLSAgICAgICAgMSwgMSwgZnVuY3Rpb24oeCkgeyByZXR1cm4gISF4OyB9KTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdHMgNjQtYml0IGZpZWxkcyB0aGF0IGFyZSBoYW5kbGVkIGFzIHN0cmluZ3MuCi0gICAqLwotICBpdCgndGVzdFN0cmluZ0ludDY0RmllbGRzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpOwotCi0gICAgdmFyIHRlc3RTaWduZWREYXRhID0gWwotICAgICAgJzI3MzA1MzgyNTIyMDc4MDE3NzYnLAotICAgICAgJy0yNjg4NDcwOTk0ODQ0NjA0NTYwJywKLSAgICAgICczMzk4NTI5Nzc5NDg2NTM2MzU5JywKLSAgICAgICczNTY4NTc3NDExNjI3OTcxMDAwJywKLSAgICAgICcyNzI0NzcxODg4NDc0ODQ5MDAnLAotICAgICAgJy02NjQ5MDU4NzE0MDg2MTU4MTg4JywKLSAgICAgICctNzY5NTI1NDc2NTcxMjA2MDgwNicsCi0gICAgICAnLTQ1MjU1NDE0MzgwMzcxMDQwMjknLAotICAgICAgJy00OTkzNzA2NTM4ODM2NTA4NTY4JywKLSAgICAgICc0OTkwMTYwMzIxODkzNzI5MTM4JwotICAgIF07Ci0gICAgdmFyIHRlc3RVbnNpZ25lZERhdGEgPSBbCi0gICAgICAnNzgyMjczMjYzMDI0MTY5NDg4MicsCi0gICAgICAnNjc1MzYwMjk3MTkxNjY4NzM1MicsCi0gICAgICAnMjM5OTkzNTA3NTI0NDQ0MjExNicsCi0gICAgICAnODcyNDI5MjU2NzMyNTMzODg2NycsCi0gICAgICAnMTY5NDg3ODQ4MDI2MjU2OTY1ODQnLAotICAgICAgJzQxMzYyNzU5MDg1MTYwNjY5MzQnLAotICAgICAgJzM1NzUzODgzNDY3OTM3MDAzNjQnLAotICAgICAgJzUxNjcxNDIwMjgzNzkyNTk0NjEnLAotICAgICAgJzE1NTc1NzM5NDg2ODk3Mzc2OTknLAotICAgICAgJzE3MTAwNzI1MjgwODEyNTQ4NTY3JwotICAgIF07Ci0KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHRlc3RTaWduZWREYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICB3cml0ZXIud3JpdGVJbnQ2NFN0cmluZygyICogaSArIDEsIHRlc3RTaWduZWREYXRhW2ldKTsKLSAgICAgIHdyaXRlci53cml0ZVVpbnQ2NFN0cmluZygyICogaSArIDIsIHRlc3RVbnNpZ25lZERhdGFbaV0pOwotICAgIH0KLQotICAgIHZhciByZWFkZXIgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYyh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCB0ZXN0U2lnbmVkRGF0YS5sZW5ndGg7IGkrKykgewotICAgICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKDIgKiBpICsgMSwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RTaWduZWREYXRhW2ldLCByZWFkZXIucmVhZEludDY0U3RyaW5nKCkpOwotICAgICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKDIgKiBpICsgMiwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHRlc3RVbnNpZ25lZERhdGFbaV0sIHJlYWRlci5yZWFkVWludDY0U3RyaW5nKCkpOwotICAgIH0KLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdHMgZmllbGRzIHRoYXQgdXNlIHppZ3phZyBlbmNvZGluZy4KLSAgICovCi0gIGl0KCd0ZXN0WmlnemFnRmllbGRzJywgZnVuY3Rpb24oKSB7Ci0gICAgZG9UZXN0U2lnbmVkRmllbGRfKAotICAgICAgICBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNpbnQzMiwKLSAgICAgICAganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU2ludDMyLAotICAgICAgICAxLCAtTWF0aC5wb3coMiwgMzEpLCBNYXRoLnBvdygyLCAzMSkgLSAxLCBNYXRoLnJvdW5kKTsKLQotICAgIGRvVGVzdFNpZ25lZEZpZWxkXygKLSAgICAgICAganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRTaW50NjQsCi0gICAgICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVNpbnQ2NCwKLSAgICAgICAgMSwgLU1hdGgucG93KDIsIDYzKSwgTWF0aC5wb3coMiwgNjMpIC0gNTEzLCBNYXRoLnJvdW5kKTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdHMgZmllbGRzIHRoYXQgdXNlIGZpeGVkLWxlbmd0aCBlbmNvZGluZy4KLSAgICovCi0gIGl0KCd0ZXN0Rml4ZWRGaWVsZHMnLCBmdW5jdGlvbigpIHsKLSAgICBkb1Rlc3RVbnNpZ25lZEZpZWxkXygKLSAgICAgICAganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWRGaXhlZDMyLAotICAgICAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVGaXhlZDMyLAotICAgICAgICAxLCBNYXRoLnBvdygyLCAzMikgLSAxLCBNYXRoLnJvdW5kKTsKLQotICAgIGRvVGVzdFVuc2lnbmVkRmllbGRfKAotICAgICAgICBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEZpeGVkNjQsCi0gICAgICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUZpeGVkNjQsCi0gICAgICAgIDEsIE1hdGgucG93KDIsIDY0KSAtIDEwMjUsIE1hdGgucm91bmQpOwotCi0gICAgZG9UZXN0U2lnbmVkRmllbGRfKAotICAgICAgICBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZFNmaXhlZDMyLAotICAgICAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTZml4ZWQzMiwKLSAgICAgICAgMSwgLU1hdGgucG93KDIsIDMxKSwgTWF0aC5wb3coMiwgMzEpIC0gMSwgTWF0aC5yb3VuZCk7Ci0KLSAgICBkb1Rlc3RTaWduZWRGaWVsZF8oCi0gICAgICAgIGpzcGIuQmluYXJ5UmVhZGVyLnByb3RvdHlwZS5yZWFkU2ZpeGVkNjQsCi0gICAgICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVNmaXhlZDY0LAotICAgICAgICAxLCAtTWF0aC5wb3coMiwgNjMpLCBNYXRoLnBvdygyLCA2MykgLSA1MTMsIE1hdGgucm91bmQpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBmbG9hdGluZyBwb2ludCBmaWVsZHMuCi0gICAqLwotICBpdCgndGVzdEZsb2F0RmllbGRzJywgZnVuY3Rpb24oKSB7Ci0gICAgZG9UZXN0U2lnbmVkRmllbGRfKAotICAgICAgICBqc3BiLkJpbmFyeVJlYWRlci5wcm90b3R5cGUucmVhZEZsb2F0LAotICAgICAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVGbG9hdCwKLSAgICAgICAganNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9NSU4sCi0gICAgICAgIC1qc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDMyX01BWCwKLSAgICAgICAganNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9NQVgsCi0gICAgICAgIHRydW5jYXRlKTsKLQotICAgIGRvVGVzdFNpZ25lZEZpZWxkXygKLSAgICAgICAganNwYi5CaW5hcnlSZWFkZXIucHJvdG90eXBlLnJlYWREb3VibGUsCi0gICAgICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZURvdWJsZSwKLSAgICAgICAganNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQ2NF9FUFMgKiAxMCwKLSAgICAgICAgLWpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUlOLAotICAgICAgICBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDY0X01JTiwKLSAgICAgICAgZnVuY3Rpb24oeCkgeyByZXR1cm4geDsgfSk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGxlbmd0aC1kZWxpbWl0ZWQgc3RyaW5nIGZpZWxkcy4KLSAgICovCi0gIGl0KCd0ZXN0U3RyaW5nRmllbGRzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHMxID0gJ1RoZSBxdWljayBicm93biBmb3gganVtcHMgb3ZlciB0aGUgbGF6eSBkb2cuJzsKLSAgICB2YXIgczIgPSAn5Lq65Lq655Sf6ICM6Ieq55Sx77yM5Zyo5bCK5Zq05ZKM5qyK5Yip5LiK5LiA5b6L5bmz562J44CCJzsKLQotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLQotICAgIHdyaXRlci53cml0ZVN0cmluZygxLCBzMSk7Ci0gICAgd3JpdGVyLndyaXRlU3RyaW5nKDIsIHMyKTsKLQotICAgIHZhciByZWFkZXIgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYyh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygxLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHMxLCByZWFkZXIucmVhZFN0cmluZygpKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhzMiwgcmVhZGVyLnJlYWRTdHJpbmcoKSk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGxlbmd0aC1kZWxpbWl0ZWQgYnl0ZSBmaWVsZHMuCi0gICAqLwotICBpdCgndGVzdEJ5dGVGaWVsZHMnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbWVzc2FnZSA9IFtdOwotICAgIHZhciBsb3dlckxpbWl0ID0gMTsKLSAgICB2YXIgdXBwZXJMaW1pdCA9IDI1NjsKLSAgICB2YXIgc2NhbGUgPSAxLjE7Ci0KLSAgICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7Ci0KLSAgICBmb3IgKHZhciBjdXJzb3IgPSBsb3dlckxpbWl0OyBjdXJzb3IgPCB1cHBlckxpbWl0OyBjdXJzb3IgKj0gMS4xKSB7Ci0gICAgICB2YXIgbGVuID0gTWF0aC5yb3VuZChjdXJzb3IpOwotICAgICAgdmFyIGJ5dGVzID0gW107Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGxlbjsgaSsrKSBieXRlcy5wdXNoKGkgJSAyNTYpOwotCi0gICAgICB3cml0ZXIud3JpdGVCeXRlcyhsZW4sIGJ5dGVzKTsKLSAgICB9Ci0KLSAgICB2YXIgcmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXIuYWxsb2Mod3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpKTsKLQotICAgIGZvciAodmFyIGN1cnNvciA9IGxvd2VyTGltaXQ7IHJlYWRlci5uZXh0RmllbGQoKTsgY3Vyc29yICo9IDEuMSkgewotICAgICAgdmFyIGxlbiA9IE1hdGgucm91bmQoY3Vyc29yKTsKLSAgICAgIGlmIChsZW4gIT0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHRocm93ICdmYWlsISc7Ci0KLSAgICAgIHZhciBieXRlcyA9IHJlYWRlci5yZWFkQnl0ZXMoKTsKLSAgICAgIGlmIChsZW4gIT0gYnl0ZXMubGVuZ3RoKSB0aHJvdyAnZmFpbCEnOwotICAgICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBpZiAoaSAlIDI1NiAhPSBieXRlc1tpXSkgdGhyb3cgJ2ZhaWwhJzsKLSAgICAgIH0KLSAgICB9Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIG5lc3RlZCBtZXNzYWdlcy4KLSAgICovCi0gIGl0KCd0ZXN0TmVzdGluZycsIGZ1bmN0aW9uKCkgewotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLSAgICB2YXIgZHVtbXlNZXNzYWdlID0gLyoqIEB0eXBlIHshanNwYi5CaW5hcnlNZXNzYWdlfSAqLyh7fSk7Ci0KLSAgICB3cml0ZXIud3JpdGVJbnQzMigxLCAxMDApOwotCi0gICAgLy8gQWRkIG9uZSBtZXNzYWdlIHdpdGggMyBpbnQgZmllbGRzLgotICAgIHdyaXRlci53cml0ZU1lc3NhZ2UoMiwgZHVtbXlNZXNzYWdlLCBmdW5jdGlvbigpIHsKLSAgICAgIHdyaXRlci53cml0ZUludDMyKDMsIDMwMCk7Ci0gICAgICB3cml0ZXIud3JpdGVJbnQzMig0LCA0MDApOwotICAgICAgd3JpdGVyLndyaXRlSW50MzIoNSwgNTAwKTsKLSAgICB9KTsKLQotICAgIC8vIEFkZCBvbmUgZW1wdHkgbWVzc2FnZS4KLSAgICB3cml0ZXIud3JpdGVNZXNzYWdlKDYsIGR1bW15TWVzc2FnZSwgZ29vZy5udWxsRnVuY3Rpb24pOwotCi0gICAgd3JpdGVyLndyaXRlSW50MzIoNywgNzAwKTsKLQotICAgIHZhciByZWFkZXIgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYyh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotCi0gICAgLy8gVmFsaWRhdGUgb3V0ZXJtb3N0IG1lc3NhZ2UuCi0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwLCByZWFkZXIucmVhZEludDMyKCkpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygyLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgcmVhZGVyLnJlYWRNZXNzYWdlKGR1bW15TWVzc2FnZSwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBWYWxpZGF0ZSBlbWJlZGRlZCBtZXNzYWdlIDEuCi0gICAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoMywgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKDMwMCwgcmVhZGVyLnJlYWRJbnQzMigpKTsKLQotICAgICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKDQsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICAgIGFzc2VydEVxdWFscyg0MDAsIHJlYWRlci5yZWFkSW50MzIoKSk7Ci0KLSAgICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICAgIGFzc2VydEVxdWFscyg1LCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNTAwLCByZWFkZXIucmVhZEludDMyKCkpOwotCi0gICAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0RmllbGQoKSk7Ci0gICAgfSk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDYsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICByZWFkZXIucmVhZE1lc3NhZ2UoZHVtbXlNZXNzYWdlLCBmdW5jdGlvbigpIHsKLSAgICAgIC8vIFZhbGlkYXRlIGVtYmVkZGVkIG1lc3NhZ2UgMi4KLQotICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEZpZWxkKCkpOwotICAgIH0pOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscyg3LCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDcwMCwgcmVhZGVyLnJlYWRJbnQzMigpKTsKLQotICAgIGFzc2VydEVxdWFscyhmYWxzZSwgcmVhZGVyLm5leHRGaWVsZCgpKTsKLSAgfSk7Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHNraXBwaW5nIGZpZWxkcyBvZiBlYWNoIHR5cGUgYnkgaW50ZXJsZWF2aW5nIHRoZW0gd2l0aCBzZW50aW5lbAotICAgKiB2YWx1ZXMgYW5kIHNraXBwaW5nIGV2ZXJ5dGhpbmcgdGhhdCdzIG5vdCBhIHNlbnRpbmVsLgotICAgKi8KLSAgaXQoJ3Rlc3RTa2lwRmllbGQnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7Ci0KLSAgICB2YXIgc2VudGluZWwgPSAxMjM0NTY3ODk7Ci0KLSAgICAvLyBXcml0ZSB2YXJpbnQgZmllbGRzIG9mIGRpZmZlcmVudCBzaXplcy4KLSAgICB3cml0ZXIud3JpdGVJbnQzMigxLCBzZW50aW5lbCk7Ci0gICAgd3JpdGVyLndyaXRlSW50MzIoMSwgMSk7Ci0gICAgd3JpdGVyLndyaXRlSW50MzIoMSwgMTAwMCk7Ci0gICAgd3JpdGVyLndyaXRlSW50MzIoMSwgMTAwMDAwMCk7Ci0gICAgd3JpdGVyLndyaXRlSW50MzIoMSwgMTAwMDAwMDAwMCk7Ci0KLSAgICAvLyBXcml0ZSBmaXhlZCA2NC1iaXQgZW5jb2RlZCBmaWVsZHMuCi0gICAgd3JpdGVyLndyaXRlSW50MzIoMiwgc2VudGluZWwpOwotICAgIHdyaXRlci53cml0ZURvdWJsZSgyLCAxKTsKLSAgICB3cml0ZXIud3JpdGVGaXhlZDY0KDIsIDEpOwotICAgIHdyaXRlci53cml0ZVNmaXhlZDY0KDIsIDEpOwotCi0gICAgLy8gV3JpdGUgZml4ZWQgMzItYml0IGVuY29kZWQgZmllbGRzLgotICAgIHdyaXRlci53cml0ZUludDMyKDMsIHNlbnRpbmVsKTsKLSAgICB3cml0ZXIud3JpdGVGbG9hdCgzLCAxKTsKLSAgICB3cml0ZXIud3JpdGVGaXhlZDMyKDMsIDEpOwotICAgIHdyaXRlci53cml0ZVNmaXhlZDMyKDMsIDEpOwotCi0gICAgLy8gV3JpdGUgZGVsaW1pdGVkIGZpZWxkcy4KLSAgICB3cml0ZXIud3JpdGVJbnQzMig0LCBzZW50aW5lbCk7Ci0gICAgd3JpdGVyLndyaXRlQnl0ZXMoNCwgWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXSk7Ci0gICAgd3JpdGVyLndyaXRlU3RyaW5nKDQsICdUaGUgcXVpY2sgYnJvd24gZm94IGp1bXBzIG92ZXIgdGhlIGxhenkgZG9nJyk7Ci0KLSAgICAvLyBXcml0ZSBhIGdyb3VwIHdpdGggYSBuZXN0ZWQgZ3JvdXAgaW5zaWRlLgotICAgIHdyaXRlci53cml0ZUludDMyKDUsIHNlbnRpbmVsKTsKLSAgICB2YXIgZHVtbXlNZXNzYWdlID0gLyoqIEB0eXBlIHshanNwYi5CaW5hcnlNZXNzYWdlfSAqLyh7fSk7Ci0gICAgd3JpdGVyLndyaXRlR3JvdXAoNSwgZHVtbXlNZXNzYWdlLCBmdW5jdGlvbigpIHsKLSAgICAgIHdyaXRlci53cml0ZUludDY0KDQyLCA0Mik7Ci0gICAgICB3cml0ZXIud3JpdGVHcm91cCg2LCBkdW1teU1lc3NhZ2UsIGZ1bmN0aW9uKCkgewotICAgICAgICB3cml0ZXIud3JpdGVJbnQ2NCg4NCwgNDIpOwotICAgICAgfSk7Ci0gICAgfSk7Ci0KLSAgICAvLyBXcml0ZSBmaW5hbCBzZW50aW5lbC4KLSAgICB3cml0ZXIud3JpdGVJbnQzMig2LCBzZW50aW5lbCk7Ci0KLSAgICB2YXIgcmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXIuYWxsb2Mod3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpKTsKLQotICAgIGZ1bmN0aW9uIHNraXAoZmllbGQsIGNvdW50KSB7Ci0gICAgICBmb3IgKHZhciBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICAgICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgICAgICBpZiAoZmllbGQgIT0gcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpIHRocm93ICdmYWlsISc7Ci0gICAgICAgIHJlYWRlci5za2lwRmllbGQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2VudGluZWwsIHJlYWRlci5yZWFkSW50MzIoKSk7Ci0gICAgc2tpcCgxLCA0KTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhzZW50aW5lbCwgcmVhZGVyLnJlYWRJbnQzMigpKTsKLSAgICBza2lwKDIsIDMpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygzLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNlbnRpbmVsLCByZWFkZXIucmVhZEludDMyKCkpOwotICAgIHNraXAoMywgMyk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoc2VudGluZWwsIHJlYWRlci5yZWFkSW50MzIoKSk7Ci0gICAgc2tpcCg0LCAyKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhzZW50aW5lbCwgcmVhZGVyLnJlYWRJbnQzMigpKTsKLSAgICBza2lwKDUsIDEpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscyg2LCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNlbnRpbmVsLCByZWFkZXIucmVhZEludDMyKCkpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBwYWNrZWQgZmllbGRzLgotICAgKi8KLSAgaXQoJ3Rlc3RQYWNrZWRGaWVsZHMnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7Ci0KLSAgICB2YXIgc2VudGluZWwgPSAxMjM0NTY3ODk7Ci0KLSAgICB2YXIgdW5zaWduZWREYXRhID0gWzEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDksIDEwXTsKLSAgICB2YXIgc2lnbmVkRGF0YSA9IFstMSwgMiwgLTMsIDQsIC01LCA2LCAtNywgOCwgLTksIDEwXTsKLSAgICB2YXIgZmxvYXREYXRhID0gWzEuMSwgMi4yLCAzLjMsIDQuNCwgNS41LCA2LjYsIDcuNywgOC44LCA5LjksIDEwLjEwXTsKLSAgICB2YXIgZG91YmxlRGF0YSA9IFsxLjEsIDIuMiwgMy4zLCA0LjQsIDUuNSwgNi42LCA3LjcsIDguOCwgOS45LCAxMC4xMF07Ci0gICAgdmFyIGJvb2xEYXRhID0gW3RydWUsIGZhbHNlLCB0cnVlLCB0cnVlLCBmYWxzZSwgZmFsc2UsIHRydWUsIGZhbHNlXTsKLQotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgZmxvYXREYXRhLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBmbG9hdERhdGFbaV0gPSB0cnVuY2F0ZShmbG9hdERhdGFbaV0pOwotICAgIH0KLQotICAgIHdyaXRlci53cml0ZUludDMyKDEsIHNlbnRpbmVsKTsKLQotICAgIHdyaXRlci53cml0ZVBhY2tlZEludDMyKDIsIHNpZ25lZERhdGEpOwotICAgIHdyaXRlci53cml0ZVBhY2tlZEludDY0KDIsIHNpZ25lZERhdGEpOwotICAgIHdyaXRlci53cml0ZVBhY2tlZFVpbnQzMigyLCB1bnNpZ25lZERhdGEpOwotICAgIHdyaXRlci53cml0ZVBhY2tlZFVpbnQ2NCgyLCB1bnNpZ25lZERhdGEpOwotICAgIHdyaXRlci53cml0ZVBhY2tlZFNpbnQzMigyLCBzaWduZWREYXRhKTsKLSAgICB3cml0ZXIud3JpdGVQYWNrZWRTaW50NjQoMiwgc2lnbmVkRGF0YSk7Ci0gICAgd3JpdGVyLndyaXRlUGFja2VkRml4ZWQzMigyLCB1bnNpZ25lZERhdGEpOwotICAgIHdyaXRlci53cml0ZVBhY2tlZEZpeGVkNjQoMiwgdW5zaWduZWREYXRhKTsKLSAgICB3cml0ZXIud3JpdGVQYWNrZWRTZml4ZWQzMigyLCBzaWduZWREYXRhKTsKLSAgICB3cml0ZXIud3JpdGVQYWNrZWRTZml4ZWQ2NCgyLCBzaWduZWREYXRhKTsKLSAgICB3cml0ZXIud3JpdGVQYWNrZWRGbG9hdCgyLCBmbG9hdERhdGEpOwotICAgIHdyaXRlci53cml0ZVBhY2tlZERvdWJsZSgyLCBkb3VibGVEYXRhKTsKLSAgICB3cml0ZXIud3JpdGVQYWNrZWRCb29sKDIsIGJvb2xEYXRhKTsKLSAgICB3cml0ZXIud3JpdGVQYWNrZWRFbnVtKDIsIHVuc2lnbmVkRGF0YSk7Ci0KLSAgICB3cml0ZXIud3JpdGVJbnQzMigzLCBzZW50aW5lbCk7Ci0KLSAgICB2YXIgcmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXIuYWxsb2Mod3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoc2VudGluZWwsIHJlYWRlci5yZWFkSW50MzIoKSk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMocmVhZGVyLnJlYWRQYWNrZWRJbnQzMigpLCBzaWduZWREYXRhKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhyZWFkZXIucmVhZFBhY2tlZEludDY0KCksIHNpZ25lZERhdGEpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKHJlYWRlci5yZWFkUGFja2VkVWludDMyKCksIHVuc2lnbmVkRGF0YSk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMocmVhZGVyLnJlYWRQYWNrZWRVaW50NjQoKSwgdW5zaWduZWREYXRhKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhyZWFkZXIucmVhZFBhY2tlZFNpbnQzMigpLCBzaWduZWREYXRhKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhyZWFkZXIucmVhZFBhY2tlZFNpbnQ2NCgpLCBzaWduZWREYXRhKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhyZWFkZXIucmVhZFBhY2tlZEZpeGVkMzIoKSwgdW5zaWduZWREYXRhKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhyZWFkZXIucmVhZFBhY2tlZEZpeGVkNjQoKSwgdW5zaWduZWREYXRhKTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhyZWFkZXIucmVhZFBhY2tlZFNmaXhlZDMyKCksIHNpZ25lZERhdGEpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKHJlYWRlci5yZWFkUGFja2VkU2ZpeGVkNjQoKSwgc2lnbmVkRGF0YSk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMocmVhZGVyLnJlYWRQYWNrZWRGbG9hdCgpLCBmbG9hdERhdGEpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKHJlYWRlci5yZWFkUGFja2VkRG91YmxlKCksIGRvdWJsZURhdGEpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKHJlYWRlci5yZWFkUGFja2VkQm9vbCgpLCBib29sRGF0YSk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMocmVhZGVyLnJlYWRQYWNrZWRFbnVtKCksIHVuc2lnbmVkRGF0YSk7Ci0KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNlbnRpbmVsLCByZWFkZXIucmVhZEludDMyKCkpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBCeXRlIGJsb2JzIGluc2lkZSBuZXN0ZWQgbWVzc2FnZXMgc2hvdWxkIGFsd2F5cyBoYXZlIHRoZWlyIGJ5dGUgb2Zmc2V0IHNldAotICAgKiByZWxhdGl2ZSB0byB0aGUgc3RhcnQgb2YgdGhlIG91dGVybW9zdCBibG9iLCBub3QgdGhlIHN0YXJ0IG9mIHRoZWlyIHBhcmVudAotICAgKiBibG9iLgotICAgKi8KLSAgaXQoJ3Rlc3ROZXN0ZWRCbG9icycsIGZ1bmN0aW9uKCkgewotICAgIC8vIENyZWF0ZSBhIHByb3RvIGNvbnNpc3Rpbmcgb2YgdHdvIG5lc3RlZCBtZXNzYWdlcywgd2l0aCB0aGUgaW5uZXIgb25lCi0gICAgLy8gY29udGFpbmluZyBhIGJsb2Igb2YgYnl0ZXMuCi0KLSAgICB2YXIgZmllbGRUYWcgPSAoMSA8PCAzKSB8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRDsKLSAgICB2YXIgYmxvYiA9IFsxLCAyLCAzLCA0LCA1XTsKLSAgICB2YXIgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7Ci0gICAgdmFyIGR1bW15TWVzc2FnZSA9IC8qKiBAdHlwZSB7IWpzcGIuQmluYXJ5TWVzc2FnZX0gKi8oe30pOwotCi0gICAgd3JpdGVyLndyaXRlTWVzc2FnZSgxLCBkdW1teU1lc3NhZ2UsIGZ1bmN0aW9uKCkgewotICAgICAgd3JpdGVyLndyaXRlTWVzc2FnZSgxLCBkdW1teU1lc3NhZ2UsIGZ1bmN0aW9uKCkgewotICAgICAgICB3cml0ZXIud3JpdGVCeXRlcygxLCBibG9iKTsKLSAgICAgIH0pOwotICAgIH0pOwotCi0gICAgLy8gUGVlbCBvZmYgdGhlIG91dGVyIHR3byBtZXNzYWdlIGxheWVycy4gRWFjaCBsYXllciBzaG91bGQgaGF2ZSB0d28gYnl0ZXMKLSAgICAvLyBvZiBvdmVyaGVhZCwgb25lIGZvciB0aGUgZmllbGQgdGFnIGFuZCBvbmUgZm9yIHRoZSBsZW5ndGggb2YgdGhlIGlubmVyCi0gICAgLy8gYmxvYi4KLQotICAgIHZhciBkZWNvZGVyMSA9IG5ldyBqc3BiLkJpbmFyeURlY29kZXIod3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoZmllbGRUYWcsIGRlY29kZXIxLnJlYWRVbnNpZ25lZFZhcmludDMyKCkpOwotICAgIGFzc2VydEVxdWFscyhibG9iLmxlbmd0aCArIDQsIGRlY29kZXIxLnJlYWRVbnNpZ25lZFZhcmludDMyKCkpOwotCi0gICAgdmFyIGRlY29kZXIyID0gbmV3IGpzcGIuQmluYXJ5RGVjb2RlcihkZWNvZGVyMS5yZWFkQnl0ZXMoYmxvYi5sZW5ndGggKyA0KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZpZWxkVGFnLCBkZWNvZGVyMi5yZWFkVW5zaWduZWRWYXJpbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoYmxvYi5sZW5ndGggKyAyLCBkZWNvZGVyMi5yZWFkVW5zaWduZWRWYXJpbnQzMigpKTsKLQotICAgIGFzc2VydEVxdWFscyhmaWVsZFRhZywgZGVjb2RlcjIucmVhZFVuc2lnbmVkVmFyaW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGJsb2IubGVuZ3RoLCBkZWNvZGVyMi5yZWFkVW5zaWduZWRWYXJpbnQzMigpKTsKLSAgICB2YXIgYnl0ZXMgPSBkZWNvZGVyMi5yZWFkQnl0ZXMoYmxvYi5sZW5ndGgpOwotCi0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMoYnl0ZXMsIGJsb2IpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyByZWFkIGNhbGxiYWNrcy4KLSAgICovCi0gIGl0KCd0ZXN0UmVhZENhbGxiYWNrcycsIGZ1bmN0aW9uKCkgewotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLSAgICB2YXIgZHVtbXlNZXNzYWdlID0gLyoqIEB0eXBlIHshanNwYi5CaW5hcnlNZXNzYWdlfSAqLyh7fSk7Ci0KLSAgICAvLyBBZGQgYW4gaW50LCBhIHN1Ym1lc3NhZ2UsIGFuZCBhbm90aGVyIGludC4KLSAgICB3cml0ZXIud3JpdGVJbnQzMigxLCAxMDApOwotCi0gICAgd3JpdGVyLndyaXRlTWVzc2FnZSgyLCBkdW1teU1lc3NhZ2UsIGZ1bmN0aW9uKCkgewotICAgICAgd3JpdGVyLndyaXRlSW50MzIoMywgMzAwKTsKLSAgICAgIHdyaXRlci53cml0ZUludDMyKDQsIDQwMCk7Ci0gICAgICB3cml0ZXIud3JpdGVJbnQzMig1LCA1MDApOwotICAgIH0pOwotCi0gICAgd3JpdGVyLndyaXRlSW50MzIoNywgNzAwKTsKLQotICAgIC8vIENyZWF0ZSB0aGUgcmVhZGVyIGFuZCByZWdpc3RlciBhIGN1c3RvbSByZWFkIGNhbGxiYWNrLgotICAgIHZhciByZWFkZXIgPSBqc3BiLkJpbmFyeVJlYWRlci5hbGxvYyh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHshanNwYi5CaW5hcnlSZWFkZXJ9IHJlYWRlcgotICAgICAqIEByZXR1cm4geyp9Ci0gICAgICovCi0gICAgZnVuY3Rpb24gcmVhZENhbGxiYWNrKHJlYWRlcikgewotICAgICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKDMsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICAgIGFzc2VydEVxdWFscygzMDAsIHJlYWRlci5yZWFkSW50MzIoKSk7Ci0KLSAgICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICAgIGFzc2VydEVxdWFscyg0LCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNDAwLCByZWFkZXIucmVhZEludDMyKCkpOwotCi0gICAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNSwgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKDUwMCwgcmVhZGVyLnJlYWRJbnQzMigpKTsKLQotICAgICAgYXNzZXJ0RXF1YWxzKGZhbHNlLCByZWFkZXIubmV4dEZpZWxkKCkpOwotICAgIH07Ci0KLSAgICByZWFkZXIucmVnaXN0ZXJSZWFkQ2FsbGJhY2soJ3JlYWRDYWxsYmFjaycsIHJlYWRDYWxsYmFjayk7Ci0KLSAgICAvLyBSZWFkIHRoZSBjb250YWluZXIgbWVzc2FnZS4KLSAgICByZWFkZXIubmV4dEZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHJlYWRlci5nZXRGaWVsZE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAwLCByZWFkZXIucmVhZEludDMyKCkpOwotCi0gICAgcmVhZGVyLm5leHRGaWVsZCgpOwotICAgIGFzc2VydEVxdWFscygyLCByZWFkZXIuZ2V0RmllbGROdW1iZXIoKSk7Ci0gICAgcmVhZGVyLnJlYWRNZXNzYWdlKGR1bW15TWVzc2FnZSwgZnVuY3Rpb24oKSB7Ci0gICAgICAvLyBEZWNvZGUgdGhlIGVtYmVkZGVkIG1lc3NhZ2UgdXNpbmcgdGhlIHJlZ2lzdGVyZWQgY2FsbGJhY2suCi0gICAgICByZWFkZXIucnVuUmVhZENhbGxiYWNrKCdyZWFkQ2FsbGJhY2snKTsKLSAgICB9KTsKLQotICAgIHJlYWRlci5uZXh0RmllbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNywgcmVhZGVyLmdldEZpZWxkTnVtYmVyKCkpOwotICAgIGFzc2VydEVxdWFscyg3MDAsIHJlYWRlci5yZWFkSW50MzIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlYWRlci5uZXh0RmllbGQoKSk7Ci0gIH0pOwotfSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvdXRpbHMuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvdXRpbHMuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUxNDA1NTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvYmluYXJ5L3V0aWxzLmpzCisrKyAvZGV2L251bGwKQEAgLTEsOTc1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgVGhpcyBmaWxlIGNvbnRhaW5zIGhlbHBlciBjb2RlIHVzZWQgYnkganNwYi5CaW5hcnlSZWFkZXIKLSAqIGFuZCBCaW5hcnlXcml0ZXIuCi0gKgotICogQGF1dGhvciBhYXBwbGVieUBnb29nbGUuY29tIChBdXN0aW4gQXBwbGVieSkKLSAqLwotCi1nb29nLnByb3ZpZGUoJ2pzcGIudXRpbHMnKTsKLQotZ29vZy5yZXF1aXJlKCdnb29nLmFzc2VydHMnKTsKLWdvb2cucmVxdWlyZSgnZ29vZy5jcnlwdC5iYXNlNjQnKTsKLWdvb2cucmVxdWlyZSgnZ29vZy5zdHJpbmcnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlDb25zdGFudHMnKTsKLQotCi0vKioKLSAqIEphdmFzY3JpcHQgY2FuJ3QgbmF0aXZlbHkgaGFuZGxlIDY0LWJpdCBkYXRhIHR5cGVzLCBzbyB0byBtYW5pcHVsYXRlIHRoZW0gd2UKLSAqIGhhdmUgdG8gc3BsaXQgdGhlbSBpbnRvIHR3byAzMi1iaXQgaGFsdmVzIGFuZCBkbyB0aGUgbWF0aCBtYW51YWxseS4KLSAqCi0gKiBJbnN0ZWFkIG9mIGluc3RhbnRpYXRpbmcgYW5kIHBhc3Npbmcgc21hbGwgc3RydWN0dXJlcyBhcm91bmQgdG8gZG8gdGhpcywgd2UKLSAqIGluc3RlYWQganVzdCB1c2UgdHdvIGdsb2JhbCB0ZW1wb3JhcnkgdmFsdWVzLiBUaGlzIG9uZSBzdG9yZXMgdGhlIGxvdyAzMgotICogYml0cyBvZiBhIHNwbGl0IHZhbHVlIC0gZm9yIGV4YW1wbGUsIGlmIHRoZSBvcmlnaW5hbCB2YWx1ZSB3YXMgYSA2NC1iaXQKLSAqIGludGVnZXIsIHRoaXMgdGVtcG9yYXJ5IHZhbHVlIHdpbGwgY29udGFpbiB0aGUgbG93IDMyIGJpdHMgb2YgdGhhdCBpbnRlZ2VyLgotICogSWYgdGhlIG9yaWdpbmFsIHZhbHVlIHdhcyBhIGRvdWJsZSwgdGhpcyB0ZW1wb3JhcnkgdmFsdWUgd2lsbCBjb250YWluIHRoZQotICogbG93IDMyIGJpdHMgb2YgdGhlIGJpbmFyeSByZXByZXNlbnRhdGlvbiBvZiB0aGF0IGRvdWJsZSwgZXRjZXRlcmEuCi0gKiBAdHlwZSB7bnVtYmVyfQotICovCi1qc3BiLnV0aWxzLnNwbGl0NjRMb3cgPSAwOwotCi0KLS8qKgotICogQW5kIGNvcnJlc3BvbmRpbmdseSwgdGhpcyB0ZW1wb3JhcnkgdmFyaWFibGUgd2lsbCBjb250YWluIHRoZSBoaWdoIDMyIGJpdHMKLSAqIG9mIHdoYXRldmVyIHZhbHVlIHdhcyBzcGxpdC4KLSAqIEB0eXBlIHtudW1iZXJ9Ci0gKi8KLWpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSAwOwotCi0KLS8qKgotICogU3BsaXRzIGFuIHVuc2lnbmVkIEphdmFzY3JpcHQgaW50ZWdlciBpbnRvIHR3byAzMi1iaXQgaGFsdmVzIGFuZCBzdG9yZXMgaXQKLSAqIGluIHRoZSB0ZW1wIHZhbHVlcyBhYm92ZS4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgbnVtYmVyIHRvIHNwbGl0LgotICovCi1qc3BiLnV0aWxzLnNwbGl0VWludDY0ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgLy8gRXh0cmFjdCBsb3cgMzIgYml0cyBhbmQgaGlnaCAzMiBiaXRzIGFzIHVuc2lnbmVkIGludGVnZXJzLgotICB2YXIgbG93Qml0cyA9IHZhbHVlID4+PiAwOwotICB2YXIgaGlnaEJpdHMgPSBNYXRoLmZsb29yKCh2YWx1ZSAtIGxvd0JpdHMpIC8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIpID4+PiAwOwotCi0gIGpzcGIudXRpbHMuc3BsaXQ2NExvdyA9IGxvd0JpdHM7Ci0gIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSBoaWdoQml0czsKLX07Ci0KLQotLyoqCi0gKiBTcGxpdHMgYSBzaWduZWQgSmF2YXNjcmlwdCBpbnRlZ2VyIGludG8gdHdvIDMyLWJpdCBoYWx2ZXMgYW5kIHN0b3JlcyBpdCBpbgotICogdGhlIHRlbXAgdmFsdWVzIGFib3ZlLgotICogQHBhcmFtIHtudW1iZXJ9IHZhbHVlIFRoZSBudW1iZXIgdG8gc3BsaXQuCi0gKi8KLWpzcGIudXRpbHMuc3BsaXRJbnQ2NCA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIC8vIENvbnZlcnQgdG8gc2lnbi1tYWduaXR1ZGUgcmVwcmVzZW50YXRpb24uCi0gIHZhciBzaWduID0gKHZhbHVlIDwgMCk7Ci0gIHZhbHVlID0gTWF0aC5hYnModmFsdWUpOwotCi0gIC8vIEV4dHJhY3QgbG93IDMyIGJpdHMgYW5kIGhpZ2ggMzIgYml0cyBhcyB1bnNpZ25lZCBpbnRlZ2Vycy4KLSAgdmFyIGxvd0JpdHMgPSB2YWx1ZSA+Pj4gMDsKLSAgdmFyIGhpZ2hCaXRzID0gTWF0aC5mbG9vcigodmFsdWUgLSBsb3dCaXRzKSAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAganNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKTsKLSAgaGlnaEJpdHMgPSBoaWdoQml0cyA+Pj4gMDsKLQotICAvLyBQZXJmb3JtIHR3bydzIGNvbXBsZW1lbnQgY29udmVyc2lvbiBpZiB0aGUgc2lnbiBiaXQgd2FzIHNldC4KLSAgaWYgKHNpZ24pIHsKLSAgICBoaWdoQml0cyA9IH5oaWdoQml0cyA+Pj4gMDsKLSAgICBsb3dCaXRzID0gfmxvd0JpdHMgPj4+IDA7Ci0gICAgbG93Qml0cyArPSAxOwotICAgIGlmIChsb3dCaXRzID4gMHhGRkZGRkZGRikgewotICAgICAgbG93Qml0cyA9IDA7Ci0gICAgICBoaWdoQml0cysrOwotICAgICAgaWYgKGhpZ2hCaXRzID4gMHhGRkZGRkZGRikgaGlnaEJpdHMgPSAwOwotICAgIH0KLSAgfQotCi0gIGpzcGIudXRpbHMuc3BsaXQ2NExvdyA9IGxvd0JpdHM7Ci0gIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSBoaWdoQml0czsKLX07Ci0KLQotLyoqCi0gKiBDb252ZXJzIGEgc2lnbmVkIEphdmFzY3JpcHQgaW50ZWdlciBpbnRvIHppZ3phZyBmb3JtYXQsIHNwbGl0cyBpdCBpbnRvIHR3bwotICogMzItYml0IGhhbHZlcywgYW5kIHN0b3JlcyBpdCBpbiB0aGUgdGVtcCB2YWx1ZXMgYWJvdmUuCi0gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUgVGhlIG51bWJlciB0byBzcGxpdC4KLSAqLwotanNwYi51dGlscy5zcGxpdFppZ3phZzY0ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAgLy8gQ29udmVydCB0byBzaWduLW1hZ25pdHVkZSBhbmQgc2NhbGUgYnkgMiBiZWZvcmUgd2Ugc3BsaXQgdGhlIHZhbHVlLgotICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDApOwotICB2YWx1ZSA9IE1hdGguYWJzKHZhbHVlKSAqIDI7Ci0KLSAganNwYi51dGlscy5zcGxpdFVpbnQ2NCh2YWx1ZSk7Ci0gIHZhciBsb3dCaXRzID0ganNwYi51dGlscy5zcGxpdDY0TG93OwotICB2YXIgaGlnaEJpdHMgPSBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoOwotCi0gIC8vIElmIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSwgc3VidHJhY3QgMSBmcm9tIHRoZSBzcGxpdCByZXByZXNlbnRhdGlvbiBzbyB3ZQotICAvLyBkb24ndCBsb3NlIHRoZSBzaWduIGJpdCBkdWUgdG8gcHJlY2lzaW9uIGlzc3Vlcy4KLSAgaWYgKHNpZ24pIHsKLSAgICBpZiAobG93Qml0cyA9PSAwKSB7Ci0gICAgICBpZiAoaGlnaEJpdHMgPT0gMCkgewotICAgICAgICBsb3dCaXRzID0gMHhGRkZGRkZGRjsKLSAgICAgICAgaGlnaEJpdHMgPSAweEZGRkZGRkZGOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaGlnaEJpdHMtLTsKLSAgICAgICAgbG93Qml0cyA9IDB4RkZGRkZGRkY7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGxvd0JpdHMtLTsKLSAgICB9Ci0gIH0KLQotICBqc3BiLnV0aWxzLnNwbGl0NjRMb3cgPSBsb3dCaXRzOwotICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoID0gaGlnaEJpdHM7Ci19OwotCi0KLS8qKgotICogQ29udmVydHMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaW50byAzMi1iaXQgSUVFRSByZXByZXNlbnRhdGlvbiBhbmQgc3RvcmVzCi0gKiBpdCBpbiB0aGUgdGVtcCB2YWx1ZXMgYWJvdmUuCi0gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUKLSAqLwotanNwYi51dGlscy5zcGxpdEZsb2F0MzIgPSBmdW5jdGlvbih2YWx1ZSkgewotICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDApID8gMSA6IDA7Ci0gIHZhbHVlID0gc2lnbiA/IC12YWx1ZSA6IHZhbHVlOwotICB2YXIgZXhwOwotICB2YXIgbWFudDsKLQotICAvLyBIYW5kbGUgemVyb3MuCi0gIGlmICh2YWx1ZSA9PT0gMCkgewotICAgIGlmICgoMSAvIHZhbHVlKSA+IDApIHsKLSAgICAgIC8vIFBvc2l0aXZlIHplcm8uCi0gICAgICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoID0gMDsKLSAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NExvdyA9IDB4MDAwMDAwMDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5lZ2F0aXZlIHplcm8uCi0gICAgICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoID0gMDsKLSAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NExvdyA9IDB4ODAwMDAwMDA7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEhhbmRsZSBuYW5zLgotICBpZiAoaXNOYU4odmFsdWUpKSB7Ci0gICAganNwYi51dGlscy5zcGxpdDY0SGlnaCA9IDA7Ci0gICAganNwYi51dGlscy5zcGxpdDY0TG93ID0gMHg3RkZGRkZGRjsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBIYW5kbGUgaW5maW5pdGllcy4KLSAgaWYgKHZhbHVlID4ganNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9NQVgpIHsKLSAgICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoID0gMDsKLSAgICBqc3BiLnV0aWxzLnNwbGl0NjRMb3cgPSAoKHNpZ24gPDwgMzEpIHwgKDB4N0Y4MDAwMDApKSA+Pj4gMDsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBIYW5kbGUgZGVub3JtYWxzLgotICBpZiAodmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDMyX01JTikgewotICAgIC8vIE51bWJlciBpcyBhIGRlbm9ybWFsLgotICAgIG1hbnQgPSBNYXRoLnJvdW5kKHZhbHVlIC8gTWF0aC5wb3coMiwgLTE0OSkpOwotICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSAwOwotICAgIGpzcGIudXRpbHMuc3BsaXQ2NExvdyA9ICgoc2lnbiA8PCAzMSkgfCBtYW50KSA+Pj4gMDsKLSAgICByZXR1cm47Ci0gIH0KLQotICBleHAgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKTsKLSAgbWFudCA9IHZhbHVlICogTWF0aC5wb3coMiwgLWV4cCk7Ci0gIG1hbnQgPSBNYXRoLnJvdW5kKG1hbnQgKiBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMjMpICYgMHg3RkZGRkY7Ci0KLSAganNwYi51dGlscy5zcGxpdDY0SGlnaCA9IDA7Ci0gIGpzcGIudXRpbHMuc3BsaXQ2NExvdyA9ICgoc2lnbiA8PCAzMSkgfCAoKGV4cCArIDEyNykgPDwgMjMpIHwgbWFudCkgPj4+IDA7Ci19OwotCi0KLS8qKgotICogQ29udmVydHMgYSBmbG9hdGluZy1wb2ludCBudW1iZXIgaW50byA2NC1iaXQgSUVFRSByZXByZXNlbnRhdGlvbiBhbmQgc3RvcmVzCi0gKiBpdCBpbiB0aGUgdGVtcCB2YWx1ZXMgYWJvdmUuCi0gKiBAcGFyYW0ge251bWJlcn0gdmFsdWUKLSAqLwotanNwYi51dGlscy5zcGxpdEZsb2F0NjQgPSBmdW5jdGlvbih2YWx1ZSkgewotICB2YXIgc2lnbiA9ICh2YWx1ZSA8IDApID8gMSA6IDA7Ci0gIHZhbHVlID0gc2lnbiA/IC12YWx1ZSA6IHZhbHVlOwotCi0gIC8vIEhhbmRsZSB6ZXJvcy4KLSAgaWYgKHZhbHVlID09PSAwKSB7Ci0gICAgaWYgKCgxIC8gdmFsdWUpID4gMCkgewotICAgICAgLy8gUG9zaXRpdmUgemVyby4KLSAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSAweDAwMDAwMDAwOwotICAgICAganNwYi51dGlscy5zcGxpdDY0TG93ID0gMHgwMDAwMDAwMDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTmVnYXRpdmUgemVyby4KLSAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSAweDgwMDAwMDAwOwotICAgICAganNwYi51dGlscy5zcGxpdDY0TG93ID0gMHgwMDAwMDAwMDsKLSAgICB9Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSGFuZGxlIG5hbnMuCi0gIGlmIChpc05hTih2YWx1ZSkpIHsKLSAgICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoID0gMHg3RkZGRkZGRjsKLSAgICBqc3BiLnV0aWxzLnNwbGl0NjRMb3cgPSAweEZGRkZGRkZGOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEhhbmRsZSBpbmZpbml0aWVzLgotICBpZiAodmFsdWUgPiBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDY0X01BWCkgewotICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSAoKHNpZ24gPDwgMzEpIHwgKDB4N0ZGMDAwMDApKSA+Pj4gMDsKLSAgICBqc3BiLnV0aWxzLnNwbGl0NjRMb3cgPSAwOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEhhbmRsZSBkZW5vcm1hbHMuCi0gIGlmICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUlOKSB7Ci0gICAgLy8gTnVtYmVyIGlzIGEgZGVub3JtYWwuCi0gICAgdmFyIG1hbnQgPSB2YWx1ZSAvIE1hdGgucG93KDIsIC0xMDc0KTsKLSAgICB2YXIgbWFudEhpZ2ggPSAobWFudCAvIGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMik7Ci0gICAganNwYi51dGlscy5zcGxpdDY0SGlnaCA9ICgoc2lnbiA8PCAzMSkgfCBtYW50SGlnaCkgPj4+IDA7Ci0gICAganNwYi51dGlscy5zcGxpdDY0TG93ID0gKG1hbnQgPj4+IDApOwotICAgIHJldHVybjsKLSAgfQotCi0gIHZhciBleHAgPSBNYXRoLmZsb29yKE1hdGgubG9nKHZhbHVlKSAvIE1hdGguTE4yKTsKLSAgaWYgKGV4cCA9PSAxMDI0KSBleHAgPSAxMDIzOwotICB2YXIgbWFudCA9IHZhbHVlICogTWF0aC5wb3coMiwgLWV4cCk7Ci0KLSAgdmFyIG1hbnRIaWdoID0gKG1hbnQgKiBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMjApICYgMHhGRkZGRjsKLSAgdmFyIG1hbnRMb3cgPSAobWFudCAqIGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT181MikgPj4+IDA7Ci0KLSAganNwYi51dGlscy5zcGxpdDY0SGlnaCA9Ci0gICAgICAoKHNpZ24gPDwgMzEpIHwgKChleHAgKyAxMDIzKSA8PCAyMCkgfCBtYW50SGlnaCkgPj4+IDA7Ci0gIGpzcGIudXRpbHMuc3BsaXQ2NExvdyA9IG1hbnRMb3c7Ci19OwotCi0KLS8qKgotICogQ29udmVydHMgYW4gOC1jaGFyYWN0ZXIgaGFzaCBzdHJpbmcgaW50byB0d28gMzItYml0IG51bWJlcnMgYW5kIHN0b3JlcyB0aGVtCi0gKiBpbiB0aGUgdGVtcCB2YWx1ZXMgYWJvdmUuCi0gKiBAcGFyYW0ge3N0cmluZ30gaGFzaAotICovCi1qc3BiLnV0aWxzLnNwbGl0SGFzaDY0ID0gZnVuY3Rpb24oaGFzaCkgewotICB2YXIgYSA9IGhhc2guY2hhckNvZGVBdCgwKTsKLSAgdmFyIGIgPSBoYXNoLmNoYXJDb2RlQXQoMSk7Ci0gIHZhciBjID0gaGFzaC5jaGFyQ29kZUF0KDIpOwotICB2YXIgZCA9IGhhc2guY2hhckNvZGVBdCgzKTsKLSAgdmFyIGUgPSBoYXNoLmNoYXJDb2RlQXQoNCk7Ci0gIHZhciBmID0gaGFzaC5jaGFyQ29kZUF0KDUpOwotICB2YXIgZyA9IGhhc2guY2hhckNvZGVBdCg2KTsKLSAgdmFyIGggPSBoYXNoLmNoYXJDb2RlQXQoNyk7Ci0KLSAganNwYi51dGlscy5zcGxpdDY0TG93ID0gKGEgKyAoYiA8PCA4KSArIChjIDw8IDE2KSArIChkIDw8IDI0KSkgPj4+IDA7Ci0gIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2ggPSAoZSArIChmIDw8IDgpICsgKGcgPDwgMTYpICsgKGggPDwgMjQpKSA+Pj4gMDsKLX07Ci0KLQotLyoqCi0gKiBKb2lucyB0d28gMzItYml0IHZhbHVlcyBpbnRvIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIuIFByZWNpc2lvbiB3aWxsIGJlCi0gKiBsb3N0IGlmIHRoZSByZXN1bHQgaXMgZ3JlYXRlciB0aGFuIDJeNTIuCi0gKiBAcGFyYW0ge251bWJlcn0gYml0c0xvdwotICogQHBhcmFtIHtudW1iZXJ9IGJpdHNIaWdoCi0gKiBAcmV0dXJuIHtudW1iZXJ9Ci0gKi8KLWpzcGIudXRpbHMuam9pblVpbnQ2NCA9IGZ1bmN0aW9uKGJpdHNMb3csIGJpdHNIaWdoKSB7Ci0gIHJldHVybiBiaXRzSGlnaCAqIGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMiArIGJpdHNMb3c7Ci19OwotCi0KLS8qKgotICogSm9pbnMgdHdvIDMyLWJpdCB2YWx1ZXMgaW50byBhIDY0LWJpdCBzaWduZWQgaW50ZWdlci4gUHJlY2lzaW9uIHdpbGwgYmUgbG9zdAotICogaWYgdGhlIHJlc3VsdCBpcyBncmVhdGVyIHRoYW4gMl41Mi4KLSAqIEBwYXJhbSB7bnVtYmVyfSBiaXRzTG93Ci0gKiBAcGFyYW0ge251bWJlcn0gYml0c0hpZ2gKLSAqIEByZXR1cm4ge251bWJlcn0KLSAqLwotanNwYi51dGlscy5qb2luSW50NjQgPSBmdW5jdGlvbihiaXRzTG93LCBiaXRzSGlnaCkgewotICAvLyBJZiB0aGUgaGlnaCBiaXQgaXMgc2V0LCBkbyBhIG1hbnVhbCB0d28ncyBjb21wbGVtZW50IGNvbnZlcnNpb24uCi0gIHZhciBzaWduID0gKGJpdHNIaWdoICYgMHg4MDAwMDAwMCk7Ci0gIGlmIChzaWduKSB7Ci0gICAgYml0c0xvdyA9ICh+Yml0c0xvdyArIDEpID4+PiAwOwotICAgIGJpdHNIaWdoID0gfmJpdHNIaWdoID4+PiAwOwotICAgIGlmIChiaXRzTG93ID09IDApIHsKLSAgICAgIGJpdHNIaWdoID0gKGJpdHNIaWdoICsgMSkgPj4+IDA7Ci0gICAgfQotICB9Ci0KLSAgdmFyIHJlc3VsdCA9IGpzcGIudXRpbHMuam9pblVpbnQ2NChiaXRzTG93LCBiaXRzSGlnaCk7Ci0gIHJldHVybiBzaWduID8gLXJlc3VsdCA6IHJlc3VsdDsKLX07Ci0KLQotLyoqCi0gKiBKb2lucyB0d28gMzItYml0IHZhbHVlcyBpbnRvIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgYW5kIGFwcGxpZXMgemlnemFnCi0gKiBkZWNvZGluZy4gUHJlY2lzaW9uIHdpbGwgYmUgbG9zdCBpZiB0aGUgcmVzdWx0IGlzIGdyZWF0ZXIgdGhhbiAyXjUyLgotICogQHBhcmFtIHtudW1iZXJ9IGJpdHNMb3cKLSAqIEBwYXJhbSB7bnVtYmVyfSBiaXRzSGlnaAotICogQHJldHVybiB7bnVtYmVyfQotICovCi1qc3BiLnV0aWxzLmpvaW5aaWd6YWc2NCA9IGZ1bmN0aW9uKGJpdHNMb3csIGJpdHNIaWdoKSB7Ci0gIC8vIEV4dHJhY3QgdGhlIHNpZ24gYml0IGFuZCBzaGlmdCByaWdodCBieSBvbmUuCi0gIHZhciBzaWduID0gYml0c0xvdyAmIDE7Ci0gIGJpdHNMb3cgPSAoKGJpdHNMb3cgPj4+IDEpIHwgKGJpdHNIaWdoIDw8IDMxKSkgPj4+IDA7Ci0gIGJpdHNIaWdoID0gYml0c0hpZ2ggPj4+IDE7Ci0KLSAgLy8gSW5jcmVtZW50IHRoZSBzcGxpdCB2YWx1ZSBpZiB0aGUgc2lnbiBiaXQgd2FzIHNldC4KLSAgaWYgKHNpZ24pIHsKLSAgICBiaXRzTG93ID0gKGJpdHNMb3cgKyAxKSA+Pj4gMDsKLSAgICBpZiAoYml0c0xvdyA9PSAwKSB7Ci0gICAgICBiaXRzSGlnaCA9IChiaXRzSGlnaCArIDEpID4+PiAwOwotICAgIH0KLSAgfQotCi0gIHZhciByZXN1bHQgPSBqc3BiLnV0aWxzLmpvaW5VaW50NjQoYml0c0xvdywgYml0c0hpZ2gpOwotICByZXR1cm4gc2lnbiA/IC1yZXN1bHQgOiByZXN1bHQ7Ci19OwotCi0KLS8qKgotICogSm9pbnMgdHdvIDMyLWJpdCB2YWx1ZXMgaW50byBhIDMyLWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQKLSAqIGNvbnZlcnRzIGl0IGJhY2sgaW50byBhIEphdmFzY3JpcHQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXJ9IGJpdHNMb3cgVGhlIGxvdyAzMiBiaXRzIG9mIHRoZSBiaW5hcnkgbnVtYmVyOwotICogQHBhcmFtIHtudW1iZXJ9IGJpdHNIaWdoIFRoZSBoaWdoIDMyIGJpdHMgb2YgdGhlIGJpbmFyeSBudW1iZXIuCi0gKiBAcmV0dXJuIHtudW1iZXJ9Ci0gKi8KLWpzcGIudXRpbHMuam9pbkZsb2F0MzIgPSBmdW5jdGlvbihiaXRzTG93LCBiaXRzSGlnaCkgewotICB2YXIgc2lnbiA9ICgoYml0c0xvdyA+PiAzMSkgKiAyICsgMSk7Ci0gIHZhciBleHAgPSAoYml0c0xvdyA+Pj4gMjMpICYgMHhGRjsKLSAgdmFyIG1hbnQgPSBiaXRzTG93ICYgMHg3RkZGRkY7Ci0KLSAgaWYgKGV4cCA9PSAweEZGKSB7Ci0gICAgaWYgKG1hbnQpIHsKLSAgICAgIHJldHVybiBOYU47Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBzaWduICogSW5maW5pdHk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGV4cCA9PSAwKSB7Ci0gICAgLy8gRGVub3JtYWwuCi0gICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCAtMTQ5KSAqIG1hbnQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHNpZ24gKiBNYXRoLnBvdygyLCBleHAgLSAxNTApICoKLSAgICAgICAgICAgKG1hbnQgKyBNYXRoLnBvdygyLCAyMykpOwotICB9Ci19OwotCi0KLS8qKgotICogSm9pbnMgdHdvIDMyLWJpdCB2YWx1ZXMgaW50byBhIDY0LWJpdCBJRUVFIGZsb2F0aW5nIHBvaW50IG51bWJlciBhbmQKLSAqIGNvbnZlcnRzIGl0IGJhY2sgaW50byBhIEphdmFzY3JpcHQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXJ9IGJpdHNMb3cgVGhlIGxvdyAzMiBiaXRzIG9mIHRoZSBiaW5hcnkgbnVtYmVyOwotICogQHBhcmFtIHtudW1iZXJ9IGJpdHNIaWdoIFRoZSBoaWdoIDMyIGJpdHMgb2YgdGhlIGJpbmFyeSBudW1iZXIuCi0gKiBAcmV0dXJuIHtudW1iZXJ9Ci0gKi8KLWpzcGIudXRpbHMuam9pbkZsb2F0NjQgPSBmdW5jdGlvbihiaXRzTG93LCBiaXRzSGlnaCkgewotICB2YXIgc2lnbiA9ICgoYml0c0hpZ2ggPj4gMzEpICogMiArIDEpOwotICB2YXIgZXhwID0gKGJpdHNIaWdoID4+PiAyMCkgJiAweDdGRjsKLSAgdmFyIG1hbnQgPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIgKiAoYml0c0hpZ2ggJiAweEZGRkZGKSArIGJpdHNMb3c7Ci0KLSAgaWYgKGV4cCA9PSAweDdGRikgewotICAgIGlmIChtYW50KSB7Ci0gICAgICByZXR1cm4gTmFOOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gc2lnbiAqIEluZmluaXR5OwotICAgIH0KLSAgfQotCi0gIGlmIChleHAgPT0gMCkgewotICAgIC8vIERlbm9ybWFsLgotICAgIHJldHVybiBzaWduICogTWF0aC5wb3coMiwgLTEwNzQpICogbWFudDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc2lnbiAqIE1hdGgucG93KDIsIGV4cCAtIDEwNzUpICoKLSAgICAgICAgICAgKG1hbnQgKyBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fNTIpOwotICB9Ci19OwotCi0KLS8qKgotICogSm9pbnMgdHdvIDMyLWJpdCB2YWx1ZXMgaW50byBhbiA4LWNoYXJhY3RlciBoYXNoIHN0cmluZy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBiaXRzTG93Ci0gKiBAcGFyYW0ge251bWJlcn0gYml0c0hpZ2gKLSAqIEByZXR1cm4ge3N0cmluZ30KLSAqLwotanNwYi51dGlscy5qb2luSGFzaDY0ID0gZnVuY3Rpb24oYml0c0xvdywgYml0c0hpZ2gpIHsKLSAgdmFyIGEgPSAoYml0c0xvdyA+Pj4gMCkgJiAweEZGOwotICB2YXIgYiA9IChiaXRzTG93ID4+PiA4KSAmIDB4RkY7Ci0gIHZhciBjID0gKGJpdHNMb3cgPj4+IDE2KSAmIDB4RkY7Ci0gIHZhciBkID0gKGJpdHNMb3cgPj4+IDI0KSAmIDB4RkY7Ci0gIHZhciBlID0gKGJpdHNIaWdoID4+PiAwKSAmIDB4RkY7Ci0gIHZhciBmID0gKGJpdHNIaWdoID4+PiA4KSAmIDB4RkY7Ci0gIHZhciBnID0gKGJpdHNIaWdoID4+PiAxNikgJiAweEZGOwotICB2YXIgaCA9IChiaXRzSGlnaCA+Pj4gMjQpICYgMHhGRjsKLQotICByZXR1cm4gU3RyaW5nLmZyb21DaGFyQ29kZShhLCBiLCBjLCBkLCBlLCBmLCBnLCBoKTsKLX07Ci0KLQotLyoqCi0gKiBJbmRpdmlkdWFsIGRpZ2l0cyBmb3IgbnVtYmVyLT5zdHJpbmcgY29udmVyc2lvbi4KLSAqIEBjb25zdCB7IUFycmF5LjxudW1iZXI+fQotICovCi1qc3BiLnV0aWxzLkRJR0lUUyA9IFsKLSAgJzAnLCAnMScsICcyJywgJzMnLCAnNCcsICc1JywgJzYnLCAnNycsCi0gICc4JywgJzknLCAnYScsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnCi1dOwotCi0KLS8qKgotICogTG9zc2xlc3NseSBjb252ZXJ0cyBhIDY0LWJpdCB1bnNpZ25lZCBpbnRlZ2VyIGluIDMyOjMyIHNwbGl0IHJlcHJlc2VudGF0aW9uCi0gKiBpbnRvIGEgZGVjaW1hbCBzdHJpbmcuCi0gKiBAcGFyYW0ge251bWJlcn0gYml0c0xvdyBUaGUgbG93IDMyIGJpdHMgb2YgdGhlIGJpbmFyeSBudW1iZXI7Ci0gKiBAcGFyYW0ge251bWJlcn0gYml0c0hpZ2ggVGhlIGhpZ2ggMzIgYml0cyBvZiB0aGUgYmluYXJ5IG51bWJlci4KLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJpbmFyeSBudW1iZXIgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCi0gKi8KLWpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKGJpdHNMb3csIGJpdHNIaWdoKSB7Ci0gIC8vIFNraXAgdGhlIGV4cGVuc2l2ZSBjb252ZXJzaW9uIGlmIHRoZSBudW1iZXIgaXMgc21hbGwgZW5vdWdoIHRvIHVzZSB0aGUKLSAgLy8gYnVpbHQtaW4gY29udmVyc2lvbnMuCi0gIGlmIChiaXRzSGlnaCA8PSAweDFGRkZGRikgewotICAgIHJldHVybiAnJyArIChqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIgKiBiaXRzSGlnaCArIGJpdHNMb3cpOwotICB9Ci0KLSAgLy8gV2hhdCB0aGlzIGNvZGUgaXMgZG9pbmcgaXMgZXNzZW50aWFsbHkgY29udmVydGluZyB0aGUgaW5wdXQgbnVtYmVyIGZyb20KLSAgLy8gYmFzZS0yIHRvIGJhc2UtMWU3LCB3aGljaCBhbGxvd3MgdXMgdG8gcmVwcmVzZW50IHRoZSA2NC1iaXQgcmFuZ2Ugd2l0aAotICAvLyBvbmx5IDMgKHZlcnkgbGFyZ2UpIGRpZ2l0cy4gVGhvc2UgZGlnaXRzIGFyZSB0aGVuIHRyaXZpYWwgdG8gY29udmVydCB0bwotICAvLyBhIGJhc2UtMTAgc3RyaW5nLgotCi0gIC8vIFRoZSBtYWdpYyBudW1iZXJzIHVzZWQgaGVyZSBhcmUgLQotICAvLyAyXjI0ID0gMTY3NzcyMTYgPSAoMSw2Nzc3MjE2KSBpbiBiYXNlLTFlNy4KLSAgLy8gMl40OCA9IDI4MTQ3NDk3NjcxMDY1NiA9ICgyLDgxNDc0OTcsNjcxMDY1NikgaW4gYmFzZS0xZTcuCi0KLSAgLy8gU3BsaXQgMzI6MzIgcmVwcmVzZW50YXRpb24gaW50byAxNjoyNDoyNCByZXByZXNlbnRhdGlvbiBzbyBvdXIKLSAgLy8gaW50ZXJtZWRpYXRlIGRpZ2l0cyBkb24ndCBvdmVyZmxvdy4KLSAgdmFyIGxvdyA9IGJpdHNMb3cgJiAweEZGRkZGRjsKLSAgdmFyIG1pZCA9ICgoKGJpdHNMb3cgPj4+IDI0KSB8IChiaXRzSGlnaCA8PCA4KSkgPj4+IDApICYgMHhGRkZGRkY7Ci0gIHZhciBoaWdoID0gKGJpdHNIaWdoID4+IDE2KSAmIDB4RkZGRjsKLQotICAvLyBBc3NlbWJsZSBvdXIgdGhyZWUgYmFzZS0xZTcgZGlnaXRzLCBpZ25vcmluZyBjYXJyaWVzLiBUaGUgbWF4aW11bQotICAvLyB2YWx1ZSBpbiBhIGRpZ2l0IGF0IHRoaXMgc3RlcCBpcyByZXByZXNlbnRhYmxlIGFzIGEgNDgtYml0IGludGVnZXIsIHdoaWNoCi0gIC8vIGNhbiBiZSBzdG9yZWQgaW4gYSA2NC1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotICB2YXIgZGlnaXRBID0gbG93ICsgKG1pZCAqIDY3NzcyMTYpICsgKGhpZ2ggKiA2NzEwNjU2KTsKLSAgdmFyIGRpZ2l0QiA9IG1pZCArIChoaWdoICogODE0NzQ5Nyk7Ci0gIHZhciBkaWdpdEMgPSAoaGlnaCAqIDIpOwotCi0gIC8vIEFwcGx5IGNhcnJpZXMgZnJvbSBBIHRvIEIgYW5kIGZyb20gQiB0byBDLgotICB2YXIgYmFzZSA9IDEwMDAwMDAwOwotICBpZiAoZGlnaXRBID49IGJhc2UpIHsKLSAgICBkaWdpdEIgKz0gTWF0aC5mbG9vcihkaWdpdEEgLyBiYXNlKTsKLSAgICBkaWdpdEEgJT0gYmFzZTsKLSAgfQotCi0gIGlmIChkaWdpdEIgPj0gYmFzZSkgewotICAgIGRpZ2l0QyArPSBNYXRoLmZsb29yKGRpZ2l0QiAvIGJhc2UpOwotICAgIGRpZ2l0QiAlPSBiYXNlOwotICB9Ci0KLSAgLy8gQ29udmVydCBiYXNlLTFlNyBkaWdpdHMgdG8gYmFzZS0xMCwgb21pdHRpbmcgbGVhZGluZyB6ZXJvZXMuCi0gIHZhciB0YWJsZSA9IGpzcGIudXRpbHMuRElHSVRTOwotICB2YXIgc3RhcnQgPSBmYWxzZTsKLSAgdmFyIHJlc3VsdCA9ICcnOwotCi0gIGZ1bmN0aW9uIGVtaXQoZGlnaXQpIHsKLSAgICB2YXIgdGVtcCA9IGJhc2U7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCA3OyBpKyspIHsKLSAgICAgIHRlbXAgLz0gMTA7Ci0gICAgICB2YXIgZGVjaW1hbERpZ2l0ID0gKChkaWdpdCAvIHRlbXApICUgMTApID4+PiAwOwotICAgICAgaWYgKChkZWNpbWFsRGlnaXQgPT0gMCkgJiYgIXN0YXJ0KSBjb250aW51ZTsKLSAgICAgIHN0YXJ0ID0gdHJ1ZTsKLSAgICAgIHJlc3VsdCArPSB0YWJsZVtkZWNpbWFsRGlnaXRdOwotICAgIH0KLSAgfQotCi0gIGlmIChkaWdpdEMgfHwgc3RhcnQpIGVtaXQoZGlnaXRDKTsKLSAgaWYgKGRpZ2l0QiB8fCBzdGFydCkgZW1pdChkaWdpdEIpOwotICBpZiAoZGlnaXRBIHx8IHN0YXJ0KSBlbWl0KGRpZ2l0QSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX07Ci0KLQotLyoqCi0gKiBMb3NzbGVzc2x5IGNvbnZlcnRzIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyIGluIDMyOjMyIHNwbGl0IHJlcHJlc2VudGF0aW9uCi0gKiBpbnRvIGEgZGVjaW1hbCBzdHJpbmcuCi0gKiBAcGFyYW0ge251bWJlcn0gYml0c0xvdyBUaGUgbG93IDMyIGJpdHMgb2YgdGhlIGJpbmFyeSBudW1iZXI7Ci0gKiBAcGFyYW0ge251bWJlcn0gYml0c0hpZ2ggVGhlIGhpZ2ggMzIgYml0cyBvZiB0aGUgYmluYXJ5IG51bWJlci4KLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGJpbmFyeSBudW1iZXIgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcuCi0gKi8KLWpzcGIudXRpbHMuam9pblNpZ25lZERlY2ltYWxTdHJpbmcgPSBmdW5jdGlvbihiaXRzTG93LCBiaXRzSGlnaCkgewotICAvLyBJZiB3ZSdyZSB0cmVhdGluZyB0aGUgaW5wdXQgYXMgYSBzaWduZWQgdmFsdWUgYW5kIHRoZSBoaWdoIGJpdCBpcyBzZXQsIGRvCi0gIC8vIGEgbWFudWFsIHR3bydzIGNvbXBsZW1lbnQgY29udmVyc2lvbiBiZWZvcmUgdGhlIGRlY2ltYWwgY29udmVyc2lvbi4KLSAgdmFyIG5lZ2F0aXZlID0gKGJpdHNIaWdoICYgMHg4MDAwMDAwMCk7Ci0gIGlmIChuZWdhdGl2ZSkgewotICAgIGJpdHNMb3cgPSAofmJpdHNMb3cgKyAxKSA+Pj4gMDsKLSAgICB2YXIgY2FycnkgPSAoYml0c0xvdyA9PSAwKSA/IDEgOiAwOwotICAgIGJpdHNIaWdoID0gKH5iaXRzSGlnaCArIGNhcnJ5KSA+Pj4gMDsKLSAgfQotCi0gIHZhciByZXN1bHQgPSBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoYml0c0xvdywgYml0c0hpZ2gpOwotICByZXR1cm4gbmVnYXRpdmUgPyAnLScgKyByZXN1bHQgOiByZXN1bHQ7Ci19OwotCi0KLS8qKgotICogQ29udmVydCBhbiA4LWNoYXJhY3RlciBoYXNoIHN0cmluZyByZXByZXNlbnRpbmcgZWl0aGVyIGEgc2lnbmVkIG9yIHVuc2lnbmVkCi0gKiA2NC1iaXQgaW50ZWdlciBpbnRvIGl0cyBkZWNpbWFsIHJlcHJlc2VudGF0aW9uIHdpdGhvdXQgbG9zaW5nIGFjY3VyYWN5LgotICogQHBhcmFtIHtzdHJpbmd9IGhhc2ggVGhlIGhhc2ggc3RyaW5nIHRvIGNvbnZlcnQuCi0gKiBAcGFyYW0ge2Jvb2xlYW59IHNpZ25lZCBUcnVlIGlmIHdlIHNob3VsZCB0cmVhdCB0aGUgaGFzaCBzdHJpbmcgYXMgZW5jb2RpbmcKLSAqICAgICBhIHNpZ25lZCBpbnRlZ2VyLgotICogQHJldHVybiB7c3RyaW5nfQotICovCi1qc3BiLnV0aWxzLmhhc2g2NFRvRGVjaW1hbFN0cmluZyA9IGZ1bmN0aW9uKGhhc2gsIHNpZ25lZCkgewotICBqc3BiLnV0aWxzLnNwbGl0SGFzaDY0KGhhc2gpOwotICB2YXIgYml0c0xvdyA9IGpzcGIudXRpbHMuc3BsaXQ2NExvdzsKLSAgdmFyIGJpdHNIaWdoID0ganNwYi51dGlscy5zcGxpdDY0SGlnaDsKLSAgcmV0dXJuIHNpZ25lZCA/Ci0gICAgICBqc3BiLnV0aWxzLmpvaW5TaWduZWREZWNpbWFsU3RyaW5nKGJpdHNMb3csIGJpdHNIaWdoKSA6Ci0gICAgICBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoYml0c0xvdywgYml0c0hpZ2gpOwotfTsKLQotCi0vKioKLSAqIENvbnZlcnRzIGFuIGFycmF5IG9mIDgtY2hhcmFjdGVyIGhhc2ggc3RyaW5ncyBpbnRvIHRoZWlyIGRlY2ltYWwKLSAqIHJlcHJlc2VudGF0aW9ucy4KLSAqIEBwYXJhbSB7IUFycmF5LjxzdHJpbmc+fSBoYXNoZXMgVGhlIGFycmF5IG9mIGhhc2ggc3RyaW5ncyB0byBjb252ZXJ0LgotICogQHBhcmFtIHtib29sZWFufSBzaWduZWQgVHJ1ZSBpZiB3ZSBzaG91bGQgdHJlYXQgdGhlIGhhc2ggc3RyaW5nIGFzIGVuY29kaW5nCi0gKiAgICAgYSBzaWduZWQgaW50ZWdlci4KLSAqIEByZXR1cm4geyFBcnJheS48c3RyaW5nPn0KLSAqLwotanNwYi51dGlscy5oYXNoNjRBcnJheVRvRGVjaW1hbFN0cmluZ3MgPSBmdW5jdGlvbihoYXNoZXMsIHNpZ25lZCkgewotICB2YXIgcmVzdWx0ID0gbmV3IEFycmF5KGhhc2hlcy5sZW5ndGgpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IGhhc2hlcy5sZW5ndGg7IGkrKykgewotICAgIHJlc3VsdFtpXSA9IGpzcGIudXRpbHMuaGFzaDY0VG9EZWNpbWFsU3RyaW5nKGhhc2hlc1tpXSwgc2lnbmVkKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfTsKLQotCi0vKioKLSAqIENvbnZlcnRzIGEgc2lnbmVkIG9yIHVuc2lnbmVkIGRlY2ltYWwgc3RyaW5nIGludG8gaXRzIGhhc2ggc3RyaW5nCi0gKiByZXByZXNlbnRhdGlvbi4KLSAqIEBwYXJhbSB7c3RyaW5nfSBkZWMKLSAqIEByZXR1cm4ge3N0cmluZ30KLSAqLwotanNwYi51dGlscy5kZWNpbWFsU3RyaW5nVG9IYXNoNjQgPSBmdW5jdGlvbihkZWMpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydChkZWMubGVuZ3RoID4gMCk7Ci0KLSAgLy8gQ2hlY2sgZm9yIG1pbnVzIHNpZ24uCi0gIHZhciBtaW51cyA9IGZhbHNlOwotICBpZiAoZGVjWzBdID09PSAnLScpIHsKLSAgICBtaW51cyA9IHRydWU7Ci0gICAgZGVjID0gZGVjLnNsaWNlKDEpOwotICB9Ci0KLSAgLy8gU3RvcmUgcmVzdWx0IGFzIGEgYnl0ZSBhcnJheS4KLSAgdmFyIHJlc3VsdEJ5dGVzID0gWzAsIDAsIDAsIDAsIDAsIDAsIDAsIDBdOwotCi0gIC8vIFNldCByZXN1bHQgdG8gbSpyZXN1bHQgKyBjLgotICBmdW5jdGlvbiBtdWxhZGQobSwgYykgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgOCAmJiAobSAhPT0gMSB8fCBjID4gMCk7IGkrKykgewotICAgICAgdmFyIHIgPSBtICogcmVzdWx0Qnl0ZXNbaV0gKyBjOwotICAgICAgcmVzdWx0Qnl0ZXNbaV0gPSByICYgMHhGRjsKLSAgICAgIGMgPSByID4+PiA4OwotICAgIH0KLSAgfQotCi0gIC8vIE5lZ2F0ZSB0aGUgcmVzdWx0IGJpdHMuCi0gIGZ1bmN0aW9uIG5lZygpIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgcmVzdWx0Qnl0ZXNbaV0gPSAofnJlc3VsdEJ5dGVzW2ldKSAmIDB4RkY7Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9yIGVhY2ggZGVjaW1hbCBkaWdpdCwgc2V0IHJlc3VsdCB0byAxMCpyZXN1bHQgKyBkaWdpdC4KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBkZWMubGVuZ3RoOyBpKyspIHsKLSAgICBtdWxhZGQoMTAsIGpzcGIudXRpbHMuRElHSVRTLmluZGV4T2YoZGVjW2ldKSk7Ci0gIH0KLQotICAvLyBJZiB0aGVyZSdzIGEgbWludXMgc2lnbiwgY29udmVydCBpbnRvIHR3bydzIGNvbXBsZW1lbnQuCi0gIGlmIChtaW51cykgewotICAgIG5lZygpOwotICAgIG11bGFkZCgxLCAxKTsKLSAgfQotCi0gIHJldHVybiBTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsIHJlc3VsdEJ5dGVzKTsKLX07Ci0KLQotLyoqCi0gKiBDb252ZXJ0cyBhbiA4LWNoYXJhY3RlciBoYXNoIHN0cmluZyBpbnRvIGl0cyBoZXhhZGVjaW1hbCByZXByZXNlbnRhdGlvbi4KLSAqIEBwYXJhbSB7c3RyaW5nfSBoYXNoCi0gKiBAcmV0dXJuIHtzdHJpbmd9Ci0gKi8KLWpzcGIudXRpbHMuaGFzaDY0VG9IZXhTdHJpbmcgPSBmdW5jdGlvbihoYXNoKSB7Ci0gIHZhciB0ZW1wID0gbmV3IEFycmF5KDE4KTsKLSAgdGVtcFswXSA9ICcwJzsKLSAgdGVtcFsxXSA9ICd4JzsKLQotICBmb3IgKHZhciBpID0gMDsgaSA8IDg7IGkrKykgewotICAgIHZhciBjID0gaGFzaC5jaGFyQ29kZUF0KDcgLSBpKTsKLSAgICB0ZW1wW2kgKiAyICsgMl0gPSBqc3BiLnV0aWxzLkRJR0lUU1tjID4+IDRdOwotICAgIHRlbXBbaSAqIDIgKyAzXSA9IGpzcGIudXRpbHMuRElHSVRTW2MgJiAweEZdOwotICB9Ci0KLSAgdmFyIHJlc3VsdCA9IHRlbXAuam9pbignJyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19OwotCi0KLS8qKgotICogQ29udmVydHMgYSAnMHg8MTYgZGlnaXRzPicgaGV4IHN0cmluZyBpbnRvIGl0cyBoYXNoIHN0cmluZyByZXByZXNlbnRhdGlvbi4KLSAqIEBwYXJhbSB7c3RyaW5nfSBoZXgKLSAqIEByZXR1cm4ge3N0cmluZ30KLSAqLwotanNwYi51dGlscy5oZXhTdHJpbmdUb0hhc2g2NCA9IGZ1bmN0aW9uKGhleCkgewotICBoZXggPSBoZXgudG9Mb3dlckNhc2UoKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydChoZXgubGVuZ3RoID09IDE4KTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydChoZXhbMF0gPT0gJzAnKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydChoZXhbMV0gPT0gJ3gnKTsKLQotICB2YXIgcmVzdWx0ID0gJyc7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgdmFyIGhpID0ganNwYi51dGlscy5ESUdJVFMuaW5kZXhPZihoZXhbaSAqIDIgKyAyXSk7Ci0gICAgdmFyIGxvID0ganNwYi51dGlscy5ESUdJVFMuaW5kZXhPZihoZXhbaSAqIDIgKyAzXSk7Ci0gICAgcmVzdWx0ID0gU3RyaW5nLmZyb21DaGFyQ29kZShoaSAqIDE2ICsgbG8pICsgcmVzdWx0OwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX07Ci0KLQotLyoqCi0gKiBDb252ZXJ0IGFuIDgtY2hhcmFjdGVyIGhhc2ggc3RyaW5nIHJlcHJlc2VudGluZyBlaXRoZXIgYSBzaWduZWQgb3IgdW5zaWduZWQKLSAqIDY0LWJpdCBpbnRlZ2VyIGludG8gYSBKYXZhc2NyaXB0IG51bWJlci4gV2lsbCBsb3NlIGFjY3VyYWN5IGlmIHRoZSByZXN1bHQgaXMKLSAqIGxhcmdlciB0aGFuIDJeNTIuCi0gKiBAcGFyYW0ge3N0cmluZ30gaGFzaCBUaGUgaGFzaCBzdHJpbmcgdG8gY29udmVydC4KLSAqIEBwYXJhbSB7Ym9vbGVhbn0gc2lnbmVkIFRydWUgaWYgdGhlIGhhcyBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzaWduZWQKLSAqICAgICBudW1iZXIuCi0gKiBAcmV0dXJuIHtudW1iZXJ9Ci0gKi8KLWpzcGIudXRpbHMuaGFzaDY0VG9OdW1iZXIgPSBmdW5jdGlvbihoYXNoLCBzaWduZWQpIHsKLSAganNwYi51dGlscy5zcGxpdEhhc2g2NChoYXNoKTsKLSAgdmFyIGJpdHNMb3cgPSBqc3BiLnV0aWxzLnNwbGl0NjRMb3c7Ci0gIHZhciBiaXRzSGlnaCA9IGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2g7Ci0gIHJldHVybiBzaWduZWQgPyBqc3BiLnV0aWxzLmpvaW5JbnQ2NChiaXRzTG93LCBiaXRzSGlnaCkgOgotICAgICAgICAgICAgICAgICAganNwYi51dGlscy5qb2luVWludDY0KGJpdHNMb3csIGJpdHNIaWdoKTsKLX07Ci0KLQotLyoqCi0gKiBDb252ZXJ0IGEgSmF2YXNjcmlwdCBudW1iZXIgaW50byBhbiA4LWNoYXJhY3RlciBoYXNoIHN0cmluZy4gV2lsbCBsb3NlCi0gKiBwcmVjaXNpb24gaWYgdGhlIHZhbHVlIGlzIG5vbi1pbnRlZ3JhbCBvciBncmVhdGVyIHRoYW4gMl42NC4KLSAqIEBwYXJhbSB7bnVtYmVyfSB2YWx1ZSBUaGUgaW50ZWdlciB0byBjb252ZXJ0LgotICogQHJldHVybiB7c3RyaW5nfQotICovCi1qc3BiLnV0aWxzLm51bWJlclRvSGFzaDY0ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAganNwYi51dGlscy5zcGxpdEludDY0KHZhbHVlKTsKLSAgcmV0dXJuIGpzcGIudXRpbHMuam9pbkhhc2g2NChqc3BiLnV0aWxzLnNwbGl0NjRMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAganNwYi51dGlscy5zcGxpdDY0SGlnaCk7Ci19OwotCi0KLS8qKgotICogQ291bnRzIHRoZSBudW1iZXIgb2YgY29udGlndW91cyB2YXJpbnRzIGluIGEgYnVmZmVyLgotICogQHBhcmFtIHshVWludDhBcnJheX0gYnVmZmVyIFRoZSBidWZmZXIgdG8gc2Nhbi4KLSAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIGJ1ZmZlciB0byBzY2FuLgotICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIHBvaW50IGluIHRoZSBidWZmZXIgdG8gc2Nhbi4KLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiB2YXJpbnRzIGluIHRoZSBidWZmZXIuCi0gKi8KLWpzcGIudXRpbHMuY291bnRWYXJpbnRzID0gZnVuY3Rpb24oYnVmZmVyLCBzdGFydCwgZW5kKSB7Ci0gIC8vIENvdW50IGhvdyBtYW55IGhpZ2ggYml0cyBvZiBlYWNoIGJ5dGUgd2VyZSBzZXQgaW4gdGhlIGJ1ZmZlci4KLSAgdmFyIGNvdW50ID0gMDsKLSAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgZW5kOyBpKyspIHsKLSAgICBjb3VudCArPSBidWZmZXJbaV0gPj4gNzsKLSAgfQotCi0gIC8vIFRoZSBudW1iZXIgb2YgdmFyaW50cyBpbiB0aGUgYnVmZmVyIGVxdWFscyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyIG1pbnVzCi0gIC8vIHRoZSBudW1iZXIgb2Ygbm9uLXRlcm1pbmFsIGJ5dGVzIGluIHRoZSBidWZmZXIgKHRob3NlIHdpdGggdGhlIGhpZ2ggYml0Ci0gIC8vIHNldCkuCi0gIHJldHVybiAoZW5kIC0gc3RhcnQpIC0gY291bnQ7Ci19OwotCi0KLS8qKgotICogQ291bnRzIHRoZSBudW1iZXIgb2YgY29udGlndW91cyB2YXJpbnQgZmllbGRzIHdpdGggdGhlIGdpdmVuIGZpZWxkIG51bWJlciBpbgotICogdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7IVVpbnQ4QXJyYXl9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIHNjYW4uCi0gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0aW5nIHBvaW50IGluIHRoZSBidWZmZXIgdG8gc2Nhbi4KLSAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBwb2ludCBpbiB0aGUgYnVmZmVyIHRvIHNjYW4uCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlciB0byBjb3VudC4KLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBtYXRjaGluZyBmaWVsZHMgaW4gdGhlIGJ1ZmZlci4KLSAqLwotanNwYi51dGlscy5jb3VudFZhcmludEZpZWxkcyA9IGZ1bmN0aW9uKGJ1ZmZlciwgc3RhcnQsIGVuZCwgZmllbGQpIHsKLSAgdmFyIGNvdW50ID0gMDsKLSAgdmFyIGN1cnNvciA9IHN0YXJ0OwotICB2YXIgdGFnID0gZmllbGQgKiA4ICsganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UOwotCi0gIGlmICh0YWcgPCAxMjgpIHsKLSAgICAvLyBTaW5nbGUtYnl0ZSBmaWVsZCB0YWcsIHdlIGNhbiB1c2UgYSBzbGlnaHRseSBxdWlja2VyIGNvdW50LgotICAgIHdoaWxlIChjdXJzb3IgPCBlbmQpIHsKLSAgICAgIC8vIFNraXAgdGhlIGZpZWxkIHRhZywgb3IgZXhpdCBpZiB3ZSBmaW5kIGEgbm9uLW1hdGNoaW5nIHRhZy4KLSAgICAgIGlmIChidWZmZXJbY3Vyc29yKytdICE9IHRhZykgcmV0dXJuIGNvdW50OwotCi0gICAgICAvLyBGaWVsZCB0YWcgbWF0Y2hlcywgd2UndmUgZm91bmQgYSB2YWxpZCBmaWVsZC4KLSAgICAgIGNvdW50Kys7Ci0KLSAgICAgIC8vIFNraXAgdGhlIHZhcmludC4KLSAgICAgIHdoaWxlICgxKSB7Ci0gICAgICAgIHZhciB4ID0gYnVmZmVyW2N1cnNvcisrXTsKLSAgICAgICAgaWYgKCh4ICYgMHg4MCkgPT0gMCkgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIHdoaWxlIChjdXJzb3IgPCBlbmQpIHsKLSAgICAgIC8vIFNraXAgdGhlIGZpZWxkIHRhZywgb3IgZXhpdCBpZiB3ZSBmaW5kIGEgbm9uLW1hdGNoaW5nIHRhZy4KLSAgICAgIHZhciB0ZW1wID0gdGFnOwotICAgICAgd2hpbGUgKHRlbXAgPiAxMjgpIHsKLSAgICAgICAgaWYgKGJ1ZmZlcltjdXJzb3JdICE9ICgodGVtcCAmIDB4N0YpIHwgMHg4MCkpIHJldHVybiBjb3VudDsKLSAgICAgICAgY3Vyc29yKys7Ci0gICAgICAgIHRlbXAgPj49IDc7Ci0gICAgICB9Ci0gICAgICBpZiAoYnVmZmVyW2N1cnNvcisrXSAhPSB0ZW1wKSByZXR1cm4gY291bnQ7Ci0KLSAgICAgIC8vIEZpZWxkIHRhZyBtYXRjaGVzLCB3ZSd2ZSBmb3VuZCBhIHZhbGlkIGZpZWxkLgotICAgICAgY291bnQrKzsKLQotICAgICAgLy8gU2tpcCB0aGUgdmFyaW50LgotICAgICAgd2hpbGUgKDEpIHsKLSAgICAgICAgdmFyIHggPSBidWZmZXJbY3Vyc29yKytdOwotICAgICAgICBpZiAoKHggJiAweDgwKSA9PSAwKSBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfTsKLQotCi0vKioKLSAqIENvdW50cyB0aGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgZml4ZWQzMiBmaWVsZHMgd2l0aCB0aGUgZ2l2ZW4gdGFnIGluIHRoZQotICogYnVmZmVyLgotICogQHBhcmFtIHshVWludDhBcnJheX0gYnVmZmVyIFRoZSBidWZmZXIgdG8gc2Nhbi4KLSAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnRpbmcgcG9pbnQgaW4gdGhlIGJ1ZmZlciB0byBzY2FuLgotICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIHBvaW50IGluIHRoZSBidWZmZXIgdG8gc2Nhbi4KLSAqIEBwYXJhbSB7bnVtYmVyfSB0YWcgVGhlIHRhZyB2YWx1ZSB0byBjb3VudC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBzdHJpZGUgVGhlIG51bWJlciBvZiBieXRlcyB0byBza2lwIHBlciBmaWVsZC4KLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBmaWVsZHMgd2l0aCBhIG1hdGNoaW5nIHRhZyBpbiB0aGUgYnVmZmVyLgotICogQHByaXZhdGUKLSAqLwotanNwYi51dGlscy5jb3VudEZpeGVkRmllbGRzXyA9Ci0gICAgZnVuY3Rpb24oYnVmZmVyLCBzdGFydCwgZW5kLCB0YWcsIHN0cmlkZSkgewotICB2YXIgY291bnQgPSAwOwotICB2YXIgY3Vyc29yID0gc3RhcnQ7Ci0KLSAgaWYgKHRhZyA8IDEyOCkgewotICAgIC8vIFNpbmdsZS1ieXRlIGZpZWxkIHRhZywgd2UgY2FuIHVzZSBhIHNsaWdodGx5IHF1aWNrZXIgY291bnQuCi0gICAgd2hpbGUgKGN1cnNvciA8IGVuZCkgewotICAgICAgLy8gU2tpcCB0aGUgZmllbGQgdGFnLCBvciBleGl0IGlmIHdlIGZpbmQgYSBub24tbWF0Y2hpbmcgdGFnLgotICAgICAgaWYgKGJ1ZmZlcltjdXJzb3IrK10gIT0gdGFnKSByZXR1cm4gY291bnQ7Ci0KLSAgICAgIC8vIEZpZWxkIHRhZyBtYXRjaGVzLCB3ZSd2ZSBmb3VuZCBhIHZhbGlkIGZpZWxkLgotICAgICAgY291bnQrKzsKLQotICAgICAgLy8gU2tpcCB0aGUgdmFsdWUuCi0gICAgICBjdXJzb3IgKz0gc3RyaWRlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB3aGlsZSAoY3Vyc29yIDwgZW5kKSB7Ci0gICAgICAvLyBTa2lwIHRoZSBmaWVsZCB0YWcsIG9yIGV4aXQgaWYgd2UgZmluZCBhIG5vbi1tYXRjaGluZyB0YWcuCi0gICAgICB2YXIgdGVtcCA9IHRhZzsKLSAgICAgIHdoaWxlICh0ZW1wID4gMTI4KSB7Ci0gICAgICAgIGlmIChidWZmZXJbY3Vyc29yKytdICE9ICgodGVtcCAmIDB4N0YpIHwgMHg4MCkpIHJldHVybiBjb3VudDsKLSAgICAgICAgdGVtcCA+Pj0gNzsKLSAgICAgIH0KLSAgICAgIGlmIChidWZmZXJbY3Vyc29yKytdICE9IHRlbXApIHJldHVybiBjb3VudDsKLQotICAgICAgLy8gRmllbGQgdGFnIG1hdGNoZXMsIHdlJ3ZlIGZvdW5kIGEgdmFsaWQgZmllbGQuCi0gICAgICBjb3VudCsrOwotCi0gICAgICAvLyBTa2lwIHRoZSB2YWx1ZS4KLSAgICAgIGN1cnNvciArPSBzdHJpZGU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBjb3VudDsKLX07Ci0KLQotLyoqCi0gKiBDb3VudHMgdGhlIG51bWJlciBvZiBjb250aWd1b3VzIGZpeGVkMzIgZmllbGRzIHdpdGggdGhlIGdpdmVuIGZpZWxkIG51bWJlcgotICogaW4gdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7IVVpbnQ4QXJyYXl9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIHNjYW4uCi0gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0aW5nIHBvaW50IGluIHRoZSBidWZmZXIgdG8gc2Nhbi4KLSAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBwb2ludCBpbiB0aGUgYnVmZmVyIHRvIHNjYW4uCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlciB0byBjb3VudC4KLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBtYXRjaGluZyBmaWVsZHMgaW4gdGhlIGJ1ZmZlci4KLSAqLwotanNwYi51dGlscy5jb3VudEZpeGVkMzJGaWVsZHMgPSBmdW5jdGlvbihidWZmZXIsIHN0YXJ0LCBlbmQsIGZpZWxkKSB7Ci0gIHZhciB0YWcgPSBmaWVsZCAqIDggKyBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyOwotICByZXR1cm4ganNwYi51dGlscy5jb3VudEZpeGVkRmllbGRzXyhidWZmZXIsIHN0YXJ0LCBlbmQsIHRhZywgNCk7Ci19OwotCi0KLS8qKgotICogQ291bnRzIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBmaXhlZDY0IGZpZWxkcyB3aXRoIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIKLSAqIGluIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0geyFVaW50OEFycmF5fSBidWZmZXIgVGhlIGJ1ZmZlciB0byBzY2FuLgotICogQHBhcmFtIHtudW1iZXJ9IHN0YXJ0IFRoZSBzdGFydGluZyBwb2ludCBpbiB0aGUgYnVmZmVyIHRvIHNjYW4uCi0gKiBAcGFyYW0ge251bWJlcn0gZW5kIFRoZSBlbmQgcG9pbnQgaW4gdGhlIGJ1ZmZlciB0byBzY2FuLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIgdG8gY291bnQKLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBtYXRjaGluZyBmaWVsZHMgaW4gdGhlIGJ1ZmZlci4KLSAqLwotanNwYi51dGlscy5jb3VudEZpeGVkNjRGaWVsZHMgPSBmdW5jdGlvbihidWZmZXIsIHN0YXJ0LCBlbmQsIGZpZWxkKSB7Ci0gIHZhciB0YWcgPSBmaWVsZCAqIDggKyBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0OwotICByZXR1cm4ganNwYi51dGlscy5jb3VudEZpeGVkRmllbGRzXyhidWZmZXIsIHN0YXJ0LCBlbmQsIHRhZywgOCk7Ci19OwotCi0KLS8qKgotICogQ291bnRzIHRoZSBudW1iZXIgb2YgY29udGlndW91cyBkZWxpbWl0ZWQgZmllbGRzIHdpdGggdGhlIGdpdmVuIGZpZWxkIG51bWJlcgotICogaW4gdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7IVVpbnQ4QXJyYXl9IGJ1ZmZlciBUaGUgYnVmZmVyIHRvIHNjYW4uCi0gKiBAcGFyYW0ge251bWJlcn0gc3RhcnQgVGhlIHN0YXJ0aW5nIHBvaW50IGluIHRoZSBidWZmZXIgdG8gc2Nhbi4KLSAqIEBwYXJhbSB7bnVtYmVyfSBlbmQgVGhlIGVuZCBwb2ludCBpbiB0aGUgYnVmZmVyIHRvIHNjYW4uCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlciB0byBjb3VudC4KLSAqIEByZXR1cm4ge251bWJlcn0gVGhlIG51bWJlciBvZiBtYXRjaGluZyBmaWVsZHMgaW4gdGhlIGJ1ZmZlci4KLSAqLwotanNwYi51dGlscy5jb3VudERlbGltaXRlZEZpZWxkcyA9IGZ1bmN0aW9uKGJ1ZmZlciwgc3RhcnQsIGVuZCwgZmllbGQpIHsKLSAgdmFyIGNvdW50ID0gMDsKLSAgdmFyIGN1cnNvciA9IHN0YXJ0OwotICB2YXIgdGFnID0gZmllbGQgKiA4ICsganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEOwotCi0gIHdoaWxlIChjdXJzb3IgPCBlbmQpIHsKLSAgICAvLyBTa2lwIHRoZSBmaWVsZCB0YWcsIG9yIGV4aXQgaWYgd2UgZmluZCBhIG5vbi1tYXRjaGluZyB0YWcuCi0gICAgdmFyIHRlbXAgPSB0YWc7Ci0gICAgd2hpbGUgKHRlbXAgPiAxMjgpIHsKLSAgICAgIGlmIChidWZmZXJbY3Vyc29yKytdICE9ICgodGVtcCAmIDB4N0YpIHwgMHg4MCkpIHJldHVybiBjb3VudDsKLSAgICAgIHRlbXAgPj49IDc7Ci0gICAgfQotICAgIGlmIChidWZmZXJbY3Vyc29yKytdICE9IHRlbXApIHJldHVybiBjb3VudDsKLQotICAgIC8vIEZpZWxkIHRhZyBtYXRjaGVzLCB3ZSd2ZSBmb3VuZCBhIHZhbGlkIGZpZWxkLgotICAgIGNvdW50Kys7Ci0KLSAgICAvLyBEZWNvZGUgdGhlIGxlbmd0aCBwcmVmaXguCi0gICAgdmFyIGxlbmd0aCA9IDA7Ci0gICAgdmFyIHNoaWZ0ID0gMTsKLSAgICB3aGlsZSAoMSkgewotICAgICAgdGVtcCA9IGJ1ZmZlcltjdXJzb3IrK107Ci0gICAgICBsZW5ndGggKz0gKHRlbXAgJiAweDdmKSAqIHNoaWZ0OwotICAgICAgc2hpZnQgKj0gMTI4OwotICAgICAgaWYgKCh0ZW1wICYgMHg4MCkgPT0gMCkgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gQWR2YW5jZSB0aGUgY3Vyc29yIHBhc3QgdGhlIGJsb2IuCi0gICAgY3Vyc29yICs9IGxlbmd0aDsKLSAgfQotICByZXR1cm4gY291bnQ7Ci19OwotCi0KLS8qKgotICogU3RyaW5nLWlmeSBieXRlcyBmb3IgdGV4dCBmb3JtYXQuIFNob3VsZCBiZSBvcHRpbWl6ZWQgYXdheSBpbiBub24tZGVidWcuCi0gKiBUaGUgcmV0dXJuZWQgc3RyaW5nIHVzZXMgXHhYWCBlc2NhcGVzIGZvciBhbGwgdmFsdWVzIGFuZCBpcyBpdHNlbGYgcXVvdGVkLgotICogWzEsIDMxXSBzZXJpYWxpemVzIHRvICciXHgwMVx4MWYiJy4KLSAqIEBwYXJhbSB7anNwYi5CeXRlU291cmNlfSBieXRlU291cmNlIFRoZSBieXRlcyB0byBzZXJpYWxpemUuCi0gKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZ2lmaWVkIGJ5dGVzIGZvciB0ZXh0IGZvcm1hdC4KLSAqLwotanNwYi51dGlscy5kZWJ1Z0J5dGVzVG9UZXh0Rm9ybWF0ID0gZnVuY3Rpb24oYnl0ZVNvdXJjZSkgewotICB2YXIgcyA9ICciJzsKLSAgaWYgKGJ5dGVTb3VyY2UpIHsKLSAgICB2YXIgYnl0ZXMgPSBqc3BiLnV0aWxzLmJ5dGVTb3VyY2VUb1VpbnQ4QXJyYXkoYnl0ZVNvdXJjZSk7Ci0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBieXRlcy5sZW5ndGg7IGkrKykgewotICAgICAgcyArPSAnXFx4JzsKLSAgICAgIGlmIChieXRlc1tpXSA8IDE2KSBzICs9ICcwJzsKLSAgICAgIHMgKz0gYnl0ZXNbaV0udG9TdHJpbmcoMTYpOwotICAgIH0KLSAgfQotICByZXR1cm4gcyArICciJzsKLX07Ci0KLQotLyoqCi0gKiBTdHJpbmctaWZ5IGEgc2NhbGFyIGZvciB0ZXh0IGZvcm1hdC4gU2hvdWxkIGJlIG9wdGltaXplZCBhd2F5IGluIG5vbi1kZWJ1Zy4KLSAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxib29sZWFufSBzY2FsYXIgVGhlIHNjYWxhciB0byBzdHJpbmdpZnkuCi0gKiBAcmV0dXJuIHtzdHJpbmd9IFN0cmluZ2lmaWVkIHNjYWxhciBmb3IgdGV4dCBmb3JtYXQuCi0gKi8KLWpzcGIudXRpbHMuZGVidWdTY2FsYXJUb1RleHRGb3JtYXQgPSBmdW5jdGlvbihzY2FsYXIpIHsKLSAgaWYgKGdvb2cuaXNTdHJpbmcoc2NhbGFyKSkgewotICAgIHJldHVybiBnb29nLnN0cmluZy5xdW90ZShzY2FsYXIpOwotICB9IGVsc2UgewotICAgIHJldHVybiBzY2FsYXIudG9TdHJpbmcoKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFV0aWxpdHkgZnVuY3Rpb246IGNvbnZlcnQgYSBzdHJpbmcgd2l0aCBjb2RlcG9pbnRzIDAtLTI1NSBpbmNsdXNpdmUgdG8gYQotICogVWludDhBcnJheS4gSWYgYW55IGNvZGVwb2ludHMgZ3JlYXRlciB0aGFuIDI1NSBleGlzdCBpbiB0aGUgc3RyaW5nLCB0aHJvd3MgYW4KLSAqIGV4Y2VwdGlvbi4KLSAqIEBwYXJhbSB7c3RyaW5nfSBzdHIKLSAqIEByZXR1cm4geyFVaW50OEFycmF5fQotICovCi1qc3BiLnV0aWxzLnN0cmluZ1RvQnl0ZUFycmF5ID0gZnVuY3Rpb24oc3RyKSB7Ci0gIHZhciBhcnIgPSBuZXcgVWludDhBcnJheShzdHIubGVuZ3RoKTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKLSAgICB2YXIgY29kZXBvaW50ID0gc3RyLmNoYXJDb2RlQXQoaSk7Ci0gICAgaWYgKGNvZGVwb2ludCA+IDI1NSkgewotICAgICAgdGhyb3cgbmV3IEVycm9yKCdDb252ZXJzaW9uIGVycm9yOiBzdHJpbmcgY29udGFpbnMgY29kZXBvaW50ICcgKwotICAgICAgICAgICAgICAgICAgICAgICdvdXRzaWRlIG9mIGJ5dGUgcmFuZ2UnKTsKLSAgICB9Ci0gICAgYXJyW2ldID0gY29kZXBvaW50OwotICB9Ci0gIHJldHVybiBhcnI7Ci19OwotCi0KLS8qKgotICogQ29udmVydHMgYW55IHR5cGUgZGVmaW5lZCBpbiBqc3BiLkJ5dGVTb3VyY2UgaW50byBhIFVpbnQ4QXJyYXkuCi0gKiBAcGFyYW0geyFqc3BiLkJ5dGVTb3VyY2V9IGRhdGEKLSAqIEByZXR1cm4geyFVaW50OEFycmF5fQotICogQHN1cHByZXNzIHtpbnZhbGlkQ2FzdHN9Ci0gKi8KLWpzcGIudXRpbHMuYnl0ZVNvdXJjZVRvVWludDhBcnJheSA9IGZ1bmN0aW9uKGRhdGEpIHsKLSAgaWYgKGRhdGEuY29uc3RydWN0b3IgPT09IFVpbnQ4QXJyYXkpIHsKLSAgICByZXR1cm4gLyoqIEB0eXBlIHshVWludDhBcnJheX0gKi8oZGF0YSk7Ci0gIH0KLQotICBpZiAoZGF0YS5jb25zdHJ1Y3RvciA9PT0gQXJyYXlCdWZmZXIpIHsKLSAgICBkYXRhID0gLyoqIEB0eXBlIHshQXJyYXlCdWZmZXJ9ICovKGRhdGEpOwotICAgIHJldHVybiAvKiogQHR5cGUgeyFVaW50OEFycmF5fSAqLyhuZXcgVWludDhBcnJheShkYXRhKSk7Ci0gIH0KLQotICBpZiAoZGF0YS5jb25zdHJ1Y3RvciA9PT0gQXJyYXkpIHsKLSAgICBkYXRhID0gLyoqIEB0eXBlIHshQXJyYXkuPG51bWJlcj59ICovKGRhdGEpOwotICAgIHJldHVybiAvKiogQHR5cGUgeyFVaW50OEFycmF5fSAqLyhuZXcgVWludDhBcnJheShkYXRhKSk7Ci0gIH0KLQotICBpZiAoZGF0YS5jb25zdHJ1Y3RvciA9PT0gU3RyaW5nKSB7Ci0gICAgZGF0YSA9IC8qKiBAdHlwZSB7c3RyaW5nfSAqLyhkYXRhKTsKLSAgICByZXR1cm4gZ29vZy5jcnlwdC5iYXNlNjQuZGVjb2RlU3RyaW5nVG9VaW50OEFycmF5KGRhdGEpOwotICB9Ci0KLSAgZ29vZy5hc3NlcnRzLmZhaWwoJ1R5cGUgbm90IGNvbnZlcnRpYmxlIHRvIFVpbnQ4QXJyYXkuJyk7Ci0gIHJldHVybiAvKiogQHR5cGUgeyFVaW50OEFycmF5fSAqLyhuZXcgVWludDhBcnJheSgwKSk7Ci19OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvYmluYXJ5L3V0aWxzX3Rlc3QuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvdXRpbHNfdGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3ZTVlYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvdXRpbHNfdGVzdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDY2OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3IFRlc3QgY2FzZXMgZm9yIGpzcGIncyBoZWxwZXIgZnVuY3Rpb25zLgotICoKLSAqIFRlc3Qgc3VpdGUgaXMgd3JpdHRlbiB1c2luZyBKYXNtaW5lIC0tIHNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vCi0gKgotICogQGF1dGhvciBhYXBwbGVieUBnb29nbGUuY29tIChBdXN0aW4gQXBwbGVieSkKLSAqLwotCi1nb29nLnJlcXVpcmUoJ2dvb2cuY3J5cHQuYmFzZTY0Jyk7Ci1nb29nLnJlcXVpcmUoJ2dvb2cudGVzdGluZy5hc3NlcnRzJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5Q29uc3RhbnRzJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5V3JpdGVyJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIudXRpbHMnKTsKLQotCi0vKioKLSAqIEBwYXJhbSB7bnVtYmVyfSB4Ci0gKiBAcmV0dXJuIHtudW1iZXJ9Ci0gKi8KLWZ1bmN0aW9uIHRydW5jYXRlKHgpIHsKLSAgdmFyIHRlbXAgPSBuZXcgRmxvYXQzMkFycmF5KDEpOwotICB0ZW1wWzBdID0geDsKLSAgcmV0dXJuIHRlbXBbMF07Ci19Ci0KLQotLyoqCi0gKiBDb252ZXJ0cyBhbiA2NC1iaXQgaW50ZWdlciBpbiBzcGxpdCByZXByZXNlbnRhdGlvbiB0byBhIDY0LWJpdCBoYXNoIHN0cmluZwotICogKDggYml0cyBlbmNvZGVkIHBlciBjaGFyYWN0ZXIpLgotICogQHBhcmFtIHtudW1iZXJ9IGJpdHNMb3cgVGhlIGxvdyAzMiBiaXRzIG9mIHRoZSBzcGxpdCA2NC1iaXQgaW50ZWdlci4KLSAqIEBwYXJhbSB7bnVtYmVyfSBiaXRzSGlnaCBUaGUgaGlnaCAzMiBiaXRzIG9mIHRoZSBzcGxpdCA2NC1iaXQgaW50ZWdlci4KLSAqIEByZXR1cm4ge3N0cmluZ30gVGhlIGVuY29kZWQgaGFzaCBzdHJpbmcsIDggYml0cyBwZXIgY2hhcmFjdGVyLgotICovCi1mdW5jdGlvbiB0b0hhc2hTdHJpbmcoYml0c0xvdywgYml0c0hpZ2gpIHsKLSAgcmV0dXJuIFN0cmluZy5mcm9tQ2hhckNvZGUoKGJpdHNMb3cgPj4+IDApICYgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdHNMb3cgPj4+IDgpICYgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdHNMb3cgPj4+IDE2KSAmIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXRzTG93ID4+PiAyNCkgJiAweEZGLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYml0c0hpZ2ggPj4+IDApICYgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdHNIaWdoID4+PiA4KSAmIDB4RkYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChiaXRzSGlnaCA+Pj4gMTYpICYgMHhGRiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGJpdHNIaWdoID4+PiAyNCkgJiAweEZGKTsKLX0KLQotCi1kZXNjcmliZSgnYmluYXJ5VXRpbHNUZXN0JywgZnVuY3Rpb24oKSB7Ci0gIC8qKgotICAgKiBUZXN0cyBsb3NzbGVzcyBiaW5hcnktdG8tZGVjaW1hbCBjb252ZXJzaW9uLgotICAgKi8KLSAgaXQoJ3Rlc3REZWNpbWFsQ29udmVyc2lvbicsIGZ1bmN0aW9uKCkgewotICAgIC8vIENoZWNrIHNvbWUgbWFnaWMgbnVtYmVycy4KLSAgICB2YXIgcmVzdWx0ID0KLSAgICAgICAganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4ODllODAwMDEsIDB4OGFjNzIzMDQpOwotICAgIGFzc2VydEVxdWFscygnMTAwMDAwMDAwMDAwMDAwMDAwMDEnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4YWNkMDVmMTUsIDB4MWI2OWI0Yik7Ci0gICAgYXNzZXJ0RXF1YWxzKCcxMjM0NTY3ODkxMjM0NTY3ODknLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4ZWIxZjBhZDIsIDB4YWI1NGE5OGMpOwotICAgIGFzc2VydEVxdWFscygnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4ZTNiNzBjYjEsIDB4ODkxMDg3YjgpOwotICAgIGFzc2VydEVxdWFscygnOTg3NjU0MzIxMDk4NzY1NDMyMScsIHJlc3VsdCk7Ci0KLSAgICAvLyBDaGVjayBsaW1pdHMuCi0gICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApOwotICAgIGFzc2VydEVxdWFscygnMCcsIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoMHhGRkZGRkZGRiwgMHhGRkZGRkZGRik7Ci0gICAgYXNzZXJ0RXF1YWxzKCcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIHJlc3VsdCk7Ci0KLSAgICAvLyBDaGVjayBlYWNoIGJpdCBvZiB0aGUgbG93IGR3b3JkLgotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMzI7IGkrKykgewotICAgICAgdmFyIGxvdyA9ICgxIDw8IGkpID4+PiAwOwotICAgICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKGxvdywgMCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoJycgKyBNYXRoLnBvdygyLCBpKSwgcmVzdWx0KTsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayB0aGUgZmlyc3QgMjAgYml0cyBvZiB0aGUgaGlnaCBkd29yZC4KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IDIwOyBpKyspIHsKLSAgICAgIHZhciBoaWdoID0gKDEgPDwgaSkgPj4+IDA7Ci0gICAgICByZXN1bHQgPSBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoMCwgaGlnaCk7Ci0gICAgICBhc3NlcnRFcXVhbHMoJycgKyBNYXRoLnBvdygyLCAzMiArIGkpLCByZXN1bHQpOwotICAgIH0KLQotICAgIC8vIFY4J3MgaW50ZXJuYWwgZG91YmxlLXRvLXN0cmluZyBjb252ZXJzaW9uIGlzIGluYWNjdXJhdGUgZm9yIHZhbHVlcyBhYm92ZQotICAgIC8vIDJeNTIsIGV2ZW4gaWYgdGhleSdyZSByZXByZXNlbnRhYmxlIGludGVnZXJzIC0gY2hlY2sgdGhlIHJlc3Qgb2YgdGhlIGJpdHMKLSAgICAvLyBtYW51YWxseSBhZ2FpbnN0IHRoZSBjb3JyZWN0IHN0cmluZyByZXByZXNlbnRhdGlvbnMgb2YgMl5OLgotCi0gICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4MDAwMDAwMDAsIDB4MDAxMDAwMDApOwotICAgIGFzc2VydEVxdWFscygnNDUwMzU5OTYyNzM3MDQ5NicsIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoMHgwMDAwMDAwMCwgMHgwMDIwMDAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCc5MDA3MTk5MjU0NzQwOTkyJywgcmVzdWx0KTsKLQotICAgIHJlc3VsdCA9IGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZygweDAwMDAwMDAwLCAweDAwNDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoJzE4MDE0Mzk4NTA5NDgxOTg0JywgcmVzdWx0KTsKLQotICAgIHJlc3VsdCA9IGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZygweDAwMDAwMDAwLCAweDAwODAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoJzM2MDI4Nzk3MDE4OTYzOTY4JywgcmVzdWx0KTsKLQotICAgIHJlc3VsdCA9IGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZygweDAwMDAwMDAwLCAweDAxMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoJzcyMDU3NTk0MDM3OTI3OTM2JywgcmVzdWx0KTsKLQotICAgIHJlc3VsdCA9IGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZygweDAwMDAwMDAwLCAweDAyMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoJzE0NDExNTE4ODA3NTg1NTg3MicsIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoMHgwMDAwMDAwMCwgMHgwNDAwMDAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCcyODgyMzAzNzYxNTE3MTE3NDQnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4MDAwMDAwMDAsIDB4MDgwMDAwMDApOwotICAgIGFzc2VydEVxdWFscygnNTc2NDYwNzUyMzAzNDIzNDg4JywgcmVzdWx0KTsKLQotICAgIHJlc3VsdCA9IGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZygweDAwMDAwMDAwLCAweDEwMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoJzExNTI5MjE1MDQ2MDY4NDY5NzYnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0ganNwYi51dGlscy5qb2luVW5zaWduZWREZWNpbWFsU3RyaW5nKDB4MDAwMDAwMDAsIDB4MjAwMDAwMDApOwotICAgIGFzc2VydEVxdWFscygnMjMwNTg0MzAwOTIxMzY5Mzk1MicsIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBqc3BiLnV0aWxzLmpvaW5VbnNpZ25lZERlY2ltYWxTdHJpbmcoMHgwMDAwMDAwMCwgMHg0MDAwMDAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCc0NjExNjg2MDE4NDI3Mzg3OTA0JywgcmVzdWx0KTsKLQotICAgIHJlc3VsdCA9IGpzcGIudXRpbHMuam9pblVuc2lnbmVkRGVjaW1hbFN0cmluZygweDAwMDAwMDAwLCAweDgwMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCByZXN1bHQpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBHb2luZyBmcm9tIGhhc2ggc3RyaW5ncyB0byBkZWNpbWFsIHN0cmluZ3Mgc2hvdWxkIGFsc28gYmUgbG9zc2xlc3MuCi0gICAqLwotICBpdCgndGVzdEhhc2hUb0RlY2ltYWxDb252ZXJzaW9uJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlc3VsdDsKLSAgICB2YXIgY29udmVydCA9IGpzcGIudXRpbHMuaGFzaDY0VG9EZWNpbWFsU3RyaW5nOwotCi0gICAgcmVzdWx0ID0gY29udmVydCh0b0hhc2hTdHJpbmcoMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCksIGZhbHNlKTsKLSAgICBhc3NlcnRFcXVhbHMoJzAnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCh0b0hhc2hTdHJpbmcoMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCksIHRydWUpOwotICAgIGFzc2VydEVxdWFscygnMCcsIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KHRvSGFzaFN0cmluZygweEZGRkZGRkZGLCAweEZGRkZGRkZGKSwgZmFsc2UpOwotICAgIGFzc2VydEVxdWFscygnMTg0NDY3NDQwNzM3MDk1NTE2MTUnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCh0b0hhc2hTdHJpbmcoMHhGRkZGRkZGRiwgMHhGRkZGRkZGRiksIHRydWUpOwotICAgIGFzc2VydEVxdWFscygnLTEnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCh0b0hhc2hTdHJpbmcoMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCksIGZhbHNlKTsKLSAgICBhc3NlcnRFcXVhbHMoJzkyMjMzNzIwMzY4NTQ3NzU4MDgnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCh0b0hhc2hTdHJpbmcoMHgwMDAwMDAwMCwgMHg4MDAwMDAwMCksIHRydWUpOwotICAgIGFzc2VydEVxdWFscygnLTkyMjMzNzIwMzY4NTQ3NzU4MDgnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCh0b0hhc2hTdHJpbmcoMHhhY2QwNWYxNSwgMHgwMWI2OWI0YiksIGZhbHNlKTsKLSAgICBhc3NlcnRFcXVhbHMoJzEyMzQ1Njc4OTEyMzQ1Njc4OScsIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KHRvSGFzaFN0cmluZyh+MHhhY2QwNWYxNSArIDEsIH4weDAxYjY5YjRiKSwgdHJ1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCctMTIzNDU2Nzg5MTIzNDU2Nzg5JywgcmVzdWx0KTsKLQotICAgIC8vIEFuZCBjb252ZXJ0aW5nIGFycmF5cyBvZiBoYXNoZXMgc2hvdWxkIHdvcmsgdGhlIHNhbWUgd2F5LgotICAgIHJlc3VsdCA9IGpzcGIudXRpbHMuaGFzaDY0QXJyYXlUb0RlY2ltYWxTdHJpbmdzKFsKLSAgICAgIHRvSGFzaFN0cmluZygweEZGRkZGRkZGLCAweEZGRkZGRkZGKSwKLSAgICAgIHRvSGFzaFN0cmluZygweDAwMDAwMDAwLCAweDgwMDAwMDAwKSwKLSAgICAgIHRvSGFzaFN0cmluZygweGFjZDA1ZjE1LCAweDAxYjY5YjRiKV0sIGZhbHNlKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgcmVzdWx0Lmxlbmd0aCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCcxODQ0Njc0NDA3MzcwOTU1MTYxNScsIHJlc3VsdFswXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCc5MjIzMzcyMDM2ODU0Nzc1ODA4JywgcmVzdWx0WzFdKTsKLSAgICBhc3NlcnRFcXVhbHMoJzEyMzQ1Njc4OTEyMzQ1Njc4OScsIHJlc3VsdFsyXSk7Ci0gIH0pOwotCi0gIC8qCi0gICAqIEdvaW5nIGZyb20gZGVjaW1hbCBzdHJpbmdzIHRvIGhhc2ggc3RyaW5ncyBzaG91bGQgYmUgbG9zc2xlc3MuCi0gICAqLwotICBpdCgndGVzdERlY2ltYWxUb0hhc2hDb252ZXJzaW9uJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlc3VsdDsKLSAgICB2YXIgY29udmVydCA9IGpzcGIudXRpbHMuZGVjaW1hbFN0cmluZ1RvSGFzaDY0OwotCi0gICAgcmVzdWx0ID0gY29udmVydCgnMCcpOwotICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsCi0gICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCgnLTEnKTsKLSAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLAotICAgICAgWzB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZdKSwgcmVzdWx0KTsKLQotICAgIHJlc3VsdCA9IGNvbnZlcnQoJzE4NDQ2NzQ0MDczNzA5NTUxNjE1Jyk7Ci0gICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwKLSAgICAgIFsweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGLCAweEZGXSksIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KCc5MjIzMzcyMDM2ODU0Nzc1ODA4Jyk7Ci0gICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwKLSAgICAgIFsweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDAwLCAweDgwXSksIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KCctOTIyMzM3MjAzNjg1NDc3NTgwOCcpOwotICAgIGFzc2VydEVxdWFscyhTdHJpbmcuZnJvbUNoYXJDb2RlLmFwcGx5KG51bGwsCi0gICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHg4MF0pLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCgnMTIzNDU2Nzg5MTIzNDU2Nzg5Jyk7Ci0gICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwKLSAgICAgIFsweDE1LCAweDVGLCAweEQwLCAweEFDLCAweDRCLCAweDlCLCAweEI2LCAweDAxXSksIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KCctMTIzNDU2Nzg5MTIzNDU2Nzg5Jyk7Ci0gICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwKLSAgICAgIFsweEVCLCAweEEwLCAweDJGLCAweDUzLCAweEI0LCAweDY0LCAweDQ5LCAweEZFXSksIHJlc3VsdCk7Ci0gIH0pOwotCi0gIC8qKgotICAgKiBHb2luZyBmcm9tIGhhc2ggc3RyaW5ncyB0byBoZXggc3RyaW5ncyBzaG91bGQgYmUgbG9zc2xlc3MuCi0gICAqLwotICBpdCgndGVzdEhhc2hUb0hleENvbnZlcnNpb24nLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgcmVzdWx0OwotICAgIHZhciBjb252ZXJ0ID0ganNwYi51dGlscy5oYXNoNjRUb0hleFN0cmluZzsKLQotICAgIHJlc3VsdCA9IGNvbnZlcnQodG9IYXNoU3RyaW5nKDB4MDAwMDAwMDAsIDB4MDAwMDAwMDApKTsKLSAgICBhc3NlcnRFcXVhbHMoJzB4MDAwMDAwMDAwMDAwMDAwMCcsIHJlc3VsdCk7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KHRvSGFzaFN0cmluZygweEZGRkZGRkZGLCAweEZGRkZGRkZGKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCcweGZmZmZmZmZmZmZmZmZmZmYnLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCh0b0hhc2hTdHJpbmcoMHgxMjM0NTY3OCwgMHg5QUJDREVGMCkpOwotICAgIGFzc2VydEVxdWFscygnMHg5YWJjZGVmMDEyMzQ1Njc4JywgcmVzdWx0KTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogR29pbmcgZnJvbSBoZXggc3RyaW5ncyB0byBoYXNoIHN0cmluZ3Mgc2hvdWxkIGJlIGxvc3NsZXNzLgotICAgKi8KLSAgaXQoJ3Rlc3RIZXhUb0hhc2hDb252ZXJzaW9uJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlc3VsdDsKLSAgICB2YXIgY29udmVydCA9IGpzcGIudXRpbHMuaGV4U3RyaW5nVG9IYXNoNjQ7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KCcweDAwMDAwMDAwMDAwMDAwMDAnKTsKLSAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLAotICAgICAgICBbMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMCwgMHgwMF0pLCByZXN1bHQpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCgnMHhmZmZmZmZmZmZmZmZmZmZmJyk7Ci0gICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwKLSAgICAgICAgWzB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkYsIDB4RkZdKSwgcmVzdWx0KTsKLQotICAgIC8vIEhleCBzdHJpbmcgaXMgYmlnLWVuZGlhbiwgaGFzaCBzdHJpbmcgaXMgbGl0dGxlLWVuZGlhbi4KLSAgICByZXN1bHQgPSBjb252ZXJ0KCcweDEyMzQ1Njc4OUFCQ0RFRjAnKTsKLSAgICBhc3NlcnRFcXVhbHMoU3RyaW5nLmZyb21DaGFyQ29kZS5hcHBseShudWxsLAotICAgICAgICBbMHhGMCwgMHhERSwgMHhCQywgMHg5QSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMl0pLCByZXN1bHQpOwotCi0gICAgLy8gQ2FwaXRhbGl6YXRpb24gc2hvdWxkIG5vdCBtYXR0ZXIuCi0gICAgcmVzdWx0ID0gY29udmVydCgnMHgwMDAwYWJjZGVmQUJDREVGJyk7Ci0gICAgYXNzZXJ0RXF1YWxzKFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwKLSAgICAgICAgWzB4RUYsIDB4Q0QsIDB4QUIsIDB4RUYsIDB4Q0QsIDB4QUIsIDB4MDAsIDB4MDBdKSwgcmVzdWx0KTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogR29pbmcgZnJvbSBudW1iZXJzIHRvIGhhc2ggc3RyaW5ncyBzaG91bGQgYmUgbG9zc2xlc3MgZm9yIHVwIHRvIDUzIGJpdHMgb2YKLSAgICogcHJlY2lzaW9uLgotICAgKi8KLSAgaXQoJ3Rlc3ROdW1iZXJUb0hhc2hDb252ZXJzaW9uJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHJlc3VsdDsKLSAgICB2YXIgY29udmVydCA9IGpzcGIudXRpbHMubnVtYmVyVG9IYXNoNjQ7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KDB4MDAwMDAwMDAwMDAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCcweDAwMDAwMDAwMDAwMDAwMDAnLCBqc3BiLnV0aWxzLmhhc2g2NFRvSGV4U3RyaW5nKHJlc3VsdCkpOwotCi0gICAgcmVzdWx0ID0gY29udmVydCgweEZGRkZGRkZGRkZGRkYpOwotICAgIGFzc2VydEVxdWFscygnMHgwMDBmZmZmZmZmZmZmZmZmJywganNwYi51dGlscy5oYXNoNjRUb0hleFN0cmluZyhyZXN1bHQpKTsKLQotICAgIHJlc3VsdCA9IGNvbnZlcnQoMHgxMjM0NTY3ODlBQkNEKTsKLSAgICBhc3NlcnRFcXVhbHMoJzB4MDAwMTIzNDU2Nzg5YWJjZCcsIGpzcGIudXRpbHMuaGFzaDY0VG9IZXhTdHJpbmcocmVzdWx0KSk7Ci0KLSAgICByZXN1bHQgPSBjb252ZXJ0KDB4RENCQTk4NzY1NDMyMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCcweDAwMGRjYmE5ODc2NTQzMjEnLCBqc3BiLnV0aWxzLmhhc2g2NFRvSGV4U3RyaW5nKHJlc3VsdCkpOwotCi0gICAgLy8gNTMgYml0cyBvZiBwcmVjaXNpb24gc2hvdWxkIG5vdCBiZSB0cnVuY2F0ZWQuCi0gICAgcmVzdWx0ID0gY29udmVydCgweDEwMDAwMDAwMDAwMDAxKTsKLSAgICBhc3NlcnRFcXVhbHMoJzB4MDAxMDAwMDAwMDAwMDAwMScsIGpzcGIudXRpbHMuaGFzaDY0VG9IZXhTdHJpbmcocmVzdWx0KSk7Ci0KLSAgICAvLyA1NCBiaXRzIG9mIHByZWNpc2lvbiBzaG91bGQgYmUgdHJ1bmNhdGVkLgotICAgIHJlc3VsdCA9IGNvbnZlcnQoMHgyMDAwMDAwMDAwMDAwMSk7Ci0gICAgYXNzZXJ0Tm90RXF1YWxzKAotICAgICAgICAnMHgwMDIwMDAwMDAwMDAwMDAxJywganNwYi51dGlscy5oYXNoNjRUb0hleFN0cmluZyhyZXN1bHQpKTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogU2FuaXR5IGNoZWNrIHRoZSBiZWhhdmlvciBvZiBKYXZhc2NyaXB0J3Mgc3RyaW5ncyB3aGVuIGRvaW5nIGZ1bm55IHRoaW5ncwotICAgKiB3aXRoIHVuaWNvZGUgY2hhcmFjdGVycy4KLSAgICovCi0gIGl0KCdzYW5pdHlDaGVja1VuaWNvZGVTdHJpbmdzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHN0cmluZ3MgPSBuZXcgQXJyYXkoNjU1MzYpOwotCi0gICAgLy8gQWxsIHBvc3NpYmxlIHVuc2lnbmVkIDE2LWJpdCB2YWx1ZXMgc2hvdWxkIGJlIHN0b3JhYmxlIGluIGEgc3RyaW5nLCB0aGV5Ci0gICAgLy8gc2hvdWxkbid0IGRvIHdlaXJkIHRoaW5ncyB3aXRoIHRoZSBsZW5ndGggb2YgdGhlIHN0cmluZywgYW5kIHRoZXkgc2hvdWxkCi0gICAgLy8gY29tZSBiYWNrIG91dCBvZiB0aGUgc3RyaW5nIHVuY2hhbmdlZC4KLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IDY1NTM2OyBpKyspIHsKLSAgICAgIHN0cmluZ3NbaV0gPSAnYScgKyBTdHJpbmcuZnJvbUNoYXJDb2RlKGkpICsgJ2EnOwotICAgICAgaWYgKDMgIT0gc3RyaW5nc1tpXS5sZW5ndGgpIHRocm93ICdmYWlsISc7Ci0gICAgICBpZiAoaSAhPSBzdHJpbmdzW2ldLmNoYXJDb2RlQXQoMSkpIHRocm93ICdmYWlsISc7Ci0gICAgfQotCi0gICAgLy8gRWFjaCB1bmljb2RlIGNoYXJhY3RlciBzaG91bGQgY29tcGFyZSBlcXVhbCB0byBpdHNlbGYgYW5kIG5vdCBlcXVhbCB0byBhCi0gICAgLy8gZGlmZmVyZW50IHVuaWNvZGUgY2hhcmFjdGVyLgotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgNjU1MzY7IGkrKykgewotICAgICAgaWYgKHN0cmluZ3NbaV0gIT0gc3RyaW5nc1tpXSkgdGhyb3cgJ2ZhaWwhJzsKLSAgICAgIGlmIChzdHJpbmdzW2ldID09IHN0cmluZ3NbKGkgKyAxKSAlIDY1NTM2XSkgdGhyb3cgJ2ZhaWwhJzsKLSAgICB9Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGNvbnZlcnNpb24gZnJvbSAzMi1iaXQgZmxvYXRpbmcgcG9pbnQgbnVtYmVycyB0byBzcGxpdDY0IG51bWJlcnMuCi0gICAqLwotICBpdCgndGVzdEZsb2F0MzJUb1NwbGl0NjQnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgZjMyX2VwcyA9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUMzJfRVBTOwotICAgIHZhciBmMzJfbWluID0ganNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQzMl9NSU47Ci0gICAgdmFyIGYzMl9tYXggPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDMyX01BWDsKLQotICAgIC8vIE5hTi4KLSAgICBqc3BiLnV0aWxzLnNwbGl0RmxvYXQzMihOYU4pOwotICAgIGlmICghaXNOYU4oanNwYi51dGlscy5qb2luRmxvYXQzMihqc3BiLnV0aWxzLnNwbGl0NjRMb3csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpKSkgewotICAgICAgdGhyb3cgJ2ZhaWwhJzsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBAcGFyYW0ge251bWJlcn0geAotICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2JpdHMKLSAgICAgKi8KLSAgICBmdW5jdGlvbiB0ZXN0KHgsIG9wdF9iaXRzKSB7Ci0gICAgICBqc3BiLnV0aWxzLnNwbGl0RmxvYXQzMih4KTsKLSAgICAgIGlmIChnb29nLmlzRGVmKG9wdF9iaXRzKSkgewotICAgICAgICBpZiAob3B0X2JpdHMgIT0ganNwYi51dGlscy5zcGxpdDY0TG93KSB0aHJvdyAnZmFpbCEnOwotICAgICAgfQotICAgICAgaWYgKHRydW5jYXRlKHgpICE9IGpzcGIudXRpbHMuam9pbkZsb2F0MzIoanNwYi51dGlscy5zcGxpdDY0TG93LAotICAgICAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpKSB7Ci0gICAgICAgIHRocm93ICdmYWlsISc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGluZmluaXR5LgotICAgIHRlc3QoSW5maW5pdHksIDB4N2Y4MDAwMDApOwotICAgIHRlc3QoLUluZmluaXR5LCAweGZmODAwMDAwKTsKLQotICAgIC8vIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB6ZXJvLgotICAgIHRlc3QoMCwgMHgwMDAwMDAwMCk7Ci0gICAgdGVzdCgtMCwgMHg4MDAwMDAwMCk7Ci0KLSAgICAvLyBQb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZXBzaWxvbi4KLSAgICB0ZXN0KGYzMl9lcHMsIDB4MDAwMDAwMDEpOwotICAgIHRlc3QoLWYzMl9lcHMsIDB4ODAwMDAwMDEpOwotCi0gICAgLy8gUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1pbi4KLSAgICB0ZXN0KGYzMl9taW4sIDB4MDA4MDAwMDApOwotICAgIHRlc3QoLWYzMl9taW4sIDB4ODA4MDAwMDApOwotCi0gICAgLy8gUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1heC4KLSAgICB0ZXN0KGYzMl9tYXgsIDB4N0Y3RkZGRkYpOwotICAgIHRlc3QoLWYzMl9tYXgsIDB4RkY3RkZGRkYpOwotCi0gICAgLy8gVmFyaW91cyBwb3NpdGl2ZSB2YWx1ZXMuCi0gICAgdmFyIGN1cnNvciA9IGYzMl9lcHMgKiAxMDsKLSAgICB3aGlsZSAoY3Vyc29yICE9IEluZmluaXR5KSB7Ci0gICAgICB0ZXN0KGN1cnNvcik7Ci0gICAgICBjdXJzb3IgKj0gMS4xOwotICAgIH0KLQotICAgIC8vIFZhcmlvdXMgbmVnYXRpdmUgdmFsdWVzLgotICAgIGN1cnNvciA9IC1mMzJfZXBzICogMTA7Ci0gICAgd2hpbGUgKGN1cnNvciAhPSAtSW5maW5pdHkpIHsKLSAgICAgIHRlc3QoY3Vyc29yKTsKLSAgICAgIGN1cnNvciAqPSAxLjE7Ci0gICAgfQotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBjb252ZXJzaW9uIGZyb20gNjQtYml0IGZsb2F0aW5nIHBvaW50IG51bWJlcnMgdG8gc3BsaXQ2NCBudW1iZXJzLgotICAgKi8KLSAgaXQoJ3Rlc3RGbG9hdDY0VG9TcGxpdDY0JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGY2NF9lcHMgPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5GTE9BVDY0X0VQUzsKLSAgICB2YXIgZjY0X21pbiA9IGpzcGIuQmluYXJ5Q29uc3RhbnRzLkZMT0FUNjRfTUlOOwotICAgIHZhciBmNjRfbWF4ID0ganNwYi5CaW5hcnlDb25zdGFudHMuRkxPQVQ2NF9NQVg7Ci0KLSAgICAvLyBOYU4uCi0gICAganNwYi51dGlscy5zcGxpdEZsb2F0NjQoTmFOKTsKLSAgICBpZiAoIWlzTmFOKGpzcGIudXRpbHMuam9pbkZsb2F0NjQoanNwYi51dGlscy5zcGxpdDY0TG93LAotICAgICAgICBqc3BiLnV0aWxzLnNwbGl0NjRIaWdoKSkpIHsKLSAgICAgIHRocm93ICdmYWlsISc7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQHBhcmFtIHtudW1iZXJ9IHgKLSAgICAgKiBAcGFyYW0ge251bWJlcj19IG9wdF9oaWdoQml0cwotICAgICAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X2xvd0JpdHMKLSAgICAgKi8KLSAgICBmdW5jdGlvbiB0ZXN0KHgsIG9wdF9oaWdoQml0cywgb3B0X2xvd0JpdHMpIHsKLSAgICAgIGpzcGIudXRpbHMuc3BsaXRGbG9hdDY0KHgpOwotICAgICAgaWYgKGdvb2cuaXNEZWYob3B0X2hpZ2hCaXRzKSkgewotICAgICAgICBpZiAob3B0X2hpZ2hCaXRzICE9IGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpIHRocm93ICdmYWlsISc7Ci0gICAgICB9Ci0gICAgICBpZiAoZ29vZy5pc0RlZihvcHRfbG93Qml0cykpIHsKLSAgICAgICAgaWYgKG9wdF9sb3dCaXRzICE9IGpzcGIudXRpbHMuc3BsaXQ2NExvdykgdGhyb3cgJ2ZhaWwhJzsKLSAgICAgIH0KLSAgICAgIGlmICh4ICE9IGpzcGIudXRpbHMuam9pbkZsb2F0NjQoanNwYi51dGlscy5zcGxpdDY0TG93LAotICAgICAgICAgIGpzcGIudXRpbHMuc3BsaXQ2NEhpZ2gpKSB7Ci0gICAgICAgIHRocm93ICdmYWlsISc7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIGluZmluaXR5LgotICAgIHRlc3QoSW5maW5pdHksIDB4N2ZmMDAwMDAsIDB4MDAwMDAwMDApOwotICAgIHRlc3QoLUluZmluaXR5LCAweGZmZjAwMDAwLCAweDAwMDAwMDAwKTsKLQotICAgIC8vIFBvc2l0aXZlIGFuZCBuZWdhdGl2ZSB6ZXJvLgotICAgIHRlc3QoMCwgMHgwMDAwMDAwMCwgMHgwMDAwMDAwMCk7Ci0gICAgdGVzdCgtMCwgMHg4MDAwMDAwMCwgMHgwMDAwMDAwMCk7Ci0KLSAgICAvLyBQb3NpdGl2ZSBhbmQgbmVnYXRpdmUgZXBzaWxvbi4KLSAgICB0ZXN0KGY2NF9lcHMsIDB4MDAwMDAwMDAsIDB4MDAwMDAwMDEpOwotICAgIHRlc3QoLWY2NF9lcHMsIDB4ODAwMDAwMDAsIDB4MDAwMDAwMDEpOwotCi0gICAgLy8gUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1pbi4KLSAgICB0ZXN0KGY2NF9taW4sIDB4MDAxMDAwMDAsIDB4MDAwMDAwMDApOwotICAgIHRlc3QoLWY2NF9taW4sIDB4ODAxMDAwMDAsIDB4MDAwMDAwMDApOwotCi0gICAgLy8gUG9zaXRpdmUgYW5kIG5lZ2F0aXZlIG1heC4KLSAgICB0ZXN0KGY2NF9tYXgsIDB4N0ZFRkZGRkYsIDB4RkZGRkZGRkYpOwotICAgIHRlc3QoLWY2NF9tYXgsIDB4RkZFRkZGRkYsIDB4RkZGRkZGRkYpOwotCi0gICAgLy8gVmFyaW91cyBwb3NpdGl2ZSB2YWx1ZXMuCi0gICAgdmFyIGN1cnNvciA9IGY2NF9lcHMgKiAxMDsKLSAgICB3aGlsZSAoY3Vyc29yICE9IEluZmluaXR5KSB7Ci0gICAgICB0ZXN0KGN1cnNvcik7Ci0gICAgICBjdXJzb3IgKj0gMS4xOwotICAgIH0KLQotICAgIC8vIFZhcmlvdXMgbmVnYXRpdmUgdmFsdWVzLgotICAgIGN1cnNvciA9IC1mNjRfZXBzICogMTA7Ci0gICAgd2hpbGUgKGN1cnNvciAhPSAtSW5maW5pdHkpIHsKLSAgICAgIHRlc3QoY3Vyc29yKTsKLSAgICAgIGN1cnNvciAqPSAxLjE7Ci0gICAgfQotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBjb3VudGluZyBwYWNrZWQgdmFyaW50cy4KLSAgICovCi0gIGl0KCd0ZXN0Q291bnRWYXJpbnRzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHZhbHVlcyA9IFtdOwotICAgIGZvciAodmFyIGkgPSAxOyBpIDwgMTAwMDAwMDAwMDsgaSAqPSAxLjEpIHsKLSAgICAgIHZhbHVlcy5wdXNoKE1hdGguZmxvb3IoaSkpOwotICAgIH0KLQotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLSAgICB3cml0ZXIud3JpdGVQYWNrZWRVaW50NjQoMSwgdmFsdWVzKTsKLQotICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotCi0gICAgLy8gV2Ugc2hvdWxkIGhhdmUgdHdvIG1vcmUgdmFyaW50cyB0aGFuIHdlIHN0YXJ0ZWQgd2l0aCAtIG9uZSBmb3IgdGhlIGZpZWxkCi0gICAgLy8gdGFnLCBvbmUgZm9yIHRoZSBwYWNrZWQgbGVuZ3RoLgotICAgIGFzc2VydEVxdWFscyh2YWx1ZXMubGVuZ3RoICsgMiwKLSAgICAgICAgICAgICAgICAganNwYi51dGlscy5jb3VudFZhcmludHMoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoKSk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGNvdW50aW5nIG1hdGNoaW5nIHZhcmludCBmaWVsZHMuCi0gICAqLwotICBpdCgndGVzdENvdW50VmFyaW50RmllbGRzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpOwotCi0gICAgdmFyIGNvdW50ID0gMDsKLSAgICBmb3IgKHZhciBpID0gMTsgaSA8IDEwMDAwMDAwMDA7IGkgKj0gMS4xKSB7Ci0gICAgICB3cml0ZXIud3JpdGVVaW50NjQoMSwgTWF0aC5mbG9vcihpKSk7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgICB3cml0ZXIud3JpdGVTdHJpbmcoMiwgJ3Rlcm1pbmF0b3InKTsKLQotICAgIHZhciBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhjb3VudCwKLSAgICAgICAganNwYi51dGlscy5jb3VudFZhcmludEZpZWxkcyhidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIDEpKTsKLQotICAgIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpOwotCi0gICAgY291bnQgPSAwOwotICAgIGZvciAodmFyIGkgPSAxOyBpIDwgMTAwMDAwMDAwMDsgaSAqPSAxLjEpIHsKLSAgICAgIHdyaXRlci53cml0ZVVpbnQ2NCgxMjM0NTY3ODksIE1hdGguZmxvb3IoaSkpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgd3JpdGVyLndyaXRlU3RyaW5nKDIsICd0ZXJtaW5hdG9yJyk7Ci0KLSAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhjb3VudCwKLSAgICAgICAganNwYi51dGlscy5jb3VudFZhcmludEZpZWxkcyhidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIDEyMzQ1Njc4OSkpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBjb3VudGluZyBtYXRjaGluZyBmaXhlZDMyIGZpZWxkcy4KLSAgICovCi0gIGl0KCd0ZXN0Q291bnRGaXhlZDMyRmllbGRzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpOwotCi0gICAgdmFyIGNvdW50ID0gMDsKLSAgICBmb3IgKHZhciBpID0gMTsgaSA8IDEwMDAwMDAwMDA7IGkgKj0gMS4xKSB7Ci0gICAgICB3cml0ZXIud3JpdGVGaXhlZDMyKDEsIE1hdGguZmxvb3IoaSkpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgd3JpdGVyLndyaXRlU3RyaW5nKDIsICd0ZXJtaW5hdG9yJyk7Ci0KLSAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoY291bnQsCi0gICAgICAgIGpzcGIudXRpbHMuY291bnRGaXhlZDMyRmllbGRzKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgMSkpOwotCi0gICAgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7Ci0KLSAgICBjb3VudCA9IDA7Ci0gICAgZm9yICh2YXIgaSA9IDE7IGkgPCAxMDAwMDAwMDAwOyBpICo9IDEuMSkgewotICAgICAgd3JpdGVyLndyaXRlRml4ZWQzMigxMjM0NTY3ODksIE1hdGguZmxvb3IoaSkpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgd3JpdGVyLndyaXRlU3RyaW5nKDIsICd0ZXJtaW5hdG9yJyk7Ci0KLSAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhjb3VudCwKLSAgICAgICAganNwYi51dGlscy5jb3VudEZpeGVkMzJGaWVsZHMoYnVmZmVyLCAwLCBidWZmZXIubGVuZ3RoLCAxMjM0NTY3ODkpKTsKLSAgfSk7Ci0KLQotICAvKioKLSAgICogVGVzdHMgY291bnRpbmcgbWF0Y2hpbmcgZml4ZWQ2NCBmaWVsZHMuCi0gICAqLwotICBpdCgndGVzdENvdW50Rml4ZWQ2NEZpZWxkcycsIGZ1bmN0aW9uKCkgewotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLQotICAgIHZhciBjb3VudCA9IDA7Ci0gICAgZm9yICh2YXIgaSA9IDE7IGkgPCAxMDAwMDAwMDAwOyBpICo9IDEuMSkgewotICAgICAgd3JpdGVyLndyaXRlRG91YmxlKDEsIGkpOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgd3JpdGVyLndyaXRlU3RyaW5nKDIsICd0ZXJtaW5hdG9yJyk7Ci0KLSAgICB2YXIgYnVmZmVyID0gbmV3IFVpbnQ4QXJyYXkod3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoY291bnQsCi0gICAgICAgIGpzcGIudXRpbHMuY291bnRGaXhlZDY0RmllbGRzKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgMSkpOwotCi0gICAgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7Ci0KLSAgICBjb3VudCA9IDA7Ci0gICAgZm9yICh2YXIgaSA9IDE7IGkgPCAxMDAwMDAwMDAwOyBpICo9IDEuMSkgewotICAgICAgd3JpdGVyLndyaXRlRG91YmxlKDEyMzQ1Njc4OSwgaSk7Ci0gICAgICBjb3VudCsrOwotICAgIH0KLSAgICB3cml0ZXIud3JpdGVTdHJpbmcoMiwgJ3Rlcm1pbmF0b3InKTsKLQotICAgIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNvdW50LAotICAgICAgICBqc3BiLnV0aWxzLmNvdW50Rml4ZWQ2NEZpZWxkcyhidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIDEyMzQ1Njc4OSkpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBjb3VudGluZyBtYXRjaGluZyBkZWxpbWl0ZWQgZmllbGRzLgotICAgKi8KLSAgaXQoJ3Rlc3RDb3VudERlbGltaXRlZEZpZWxkcycsIGZ1bmN0aW9uKCkgewotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLQotICAgIHZhciBjb3VudCA9IDA7Ci0gICAgZm9yICh2YXIgaSA9IDE7IGkgPCAxMDAwOyBpICo9IDEuMSkgewotICAgICAgd3JpdGVyLndyaXRlQnl0ZXMoMSwgW01hdGguZmxvb3IoaSldKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgfQotICAgIHdyaXRlci53cml0ZVN0cmluZygyLCAndGVybWluYXRvcicpOwotCi0gICAgdmFyIGJ1ZmZlciA9IG5ldyBVaW50OEFycmF5KHdyaXRlci5nZXRSZXN1bHRCdWZmZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGNvdW50LAotICAgICAgICBqc3BiLnV0aWxzLmNvdW50RGVsaW1pdGVkRmllbGRzKGJ1ZmZlciwgMCwgYnVmZmVyLmxlbmd0aCwgMSkpOwotCi0gICAgd3JpdGVyID0gbmV3IGpzcGIuQmluYXJ5V3JpdGVyKCk7Ci0KLSAgICBjb3VudCA9IDA7Ci0gICAgZm9yICh2YXIgaSA9IDE7IGkgPCAxMDAwOyBpICo9IDEuMSkgewotICAgICAgd3JpdGVyLndyaXRlQnl0ZXMoMTIzNDU2Nzg5LCBbTWF0aC5mbG9vcihpKV0pOwotICAgICAgY291bnQrKzsKLSAgICB9Ci0gICAgd3JpdGVyLndyaXRlU3RyaW5nKDIsICd0ZXJtaW5hdG9yJyk7Ci0KLSAgICBidWZmZXIgPSBuZXcgVWludDhBcnJheSh3cml0ZXIuZ2V0UmVzdWx0QnVmZmVyKCkpOwotICAgIGFzc2VydEVxdWFscyhjb3VudCwKLSAgICAgICAganNwYi51dGlscy5jb3VudERlbGltaXRlZEZpZWxkcyhidWZmZXIsIDAsIGJ1ZmZlci5sZW5ndGgsIDEyMzQ1Njc4OSkpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0cyBieXRlIGZvcm1hdCBmb3IgZGVidWcgc3RyaW5ncy4KLSAgICovCi0gIGl0KCd0ZXN0RGVidWdCeXRlc1RvVGV4dEZvcm1hdCcsIGZ1bmN0aW9uKCkgewotICAgIGFzc2VydEVxdWFscygnIiInLCBqc3BiLnV0aWxzLmRlYnVnQnl0ZXNUb1RleHRGb3JtYXQobnVsbCkpOwotICAgIGFzc2VydEVxdWFscygnIlxceDAwXFx4MTBcXHhmZiInLAotICAgICAgICBqc3BiLnV0aWxzLmRlYnVnQnl0ZXNUb1RleHRGb3JtYXQoWzAsIDE2LCAyNTVdKSk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3RzIGNvbnZlcnRpbmcgYnl0ZSBibG9iIHNvdXJjZXMgaW50byBieXRlIGJsb2JzLgotICAgKi8KLSAgaXQoJ3Rlc3RCeXRlU291cmNlVG9VaW50OEFycmF5JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGNvbnZlcnQgPSBqc3BiLnV0aWxzLmJ5dGVTb3VyY2VUb1VpbnQ4QXJyYXk7Ci0KLSAgICB2YXIgc291cmNlRGF0YSA9IFtdOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgMjU2OyBpKyspIHsKLSAgICAgIHNvdXJjZURhdGEucHVzaChpKTsKLSAgICB9Ci0KLSAgICB2YXIgc291cmNlQnl0ZXMgPSBuZXcgVWludDhBcnJheShzb3VyY2VEYXRhKTsKLSAgICB2YXIgc291cmNlQnVmZmVyID0gc291cmNlQnl0ZXMuYnVmZmVyOwotICAgIHZhciBzb3VyY2VCYXNlNjQgPSBnb29nLmNyeXB0LmJhc2U2NC5lbmNvZGVCeXRlQXJyYXkoc291cmNlRGF0YSk7Ci0gICAgdmFyIHNvdXJjZVN0cmluZyA9IFN0cmluZy5mcm9tQ2hhckNvZGUuYXBwbHkobnVsbCwgc291cmNlRGF0YSk7Ci0KLSAgICBmdW5jdGlvbiBjaGVjayhyZXN1bHQpIHsKLSAgICAgIGFzc2VydEVxdWFscyhVaW50OEFycmF5LCByZXN1bHQuY29uc3RydWN0b3IpOwotICAgICAgYXNzZXJ0RXF1YWxzKHNvdXJjZURhdGEubGVuZ3RoLCByZXN1bHQubGVuZ3RoKTsKLSAgICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVzdWx0Lmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGFzc2VydEVxdWFscyhzb3VyY2VEYXRhW2ldLCByZXN1bHRbaV0pOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIENvbnZlcnRpbmcgVWludDhBcnJheXMgaW50byBVaW50OEFycmF5cyBzaG91bGQgYmUgYSBuby1vcC4KLSAgICBhc3NlcnRFcXVhbHMoc291cmNlQnl0ZXMsIGNvbnZlcnQoc291cmNlQnl0ZXMpKTsKLQotICAgIC8vIENvbnZlcnRpbmcgQXJyYXkuPG51bWJlcnM+IGludG8gVWludDhBcnJheXMgc2hvdWxkIHdvcmsuCi0gICAgY2hlY2soY29udmVydChzb3VyY2VEYXRhKSk7Ci0KLSAgICAvLyBDb252ZXJ0aW5nIEFycmF5QnVmZmVycyBpbnRvIFVpbnQ4QXJyYXlzIHNob3VsZCB3b3JrLgotICAgIGNoZWNrKGNvbnZlcnQoc291cmNlQnVmZmVyKSk7Ci0KLSAgICAvLyBDb252ZXJ0aW5nIGJhc2U2NC1lbmNvZGVkIHN0cmluZ3MgaW50byBVaW50OEFycmF5cyBzaG91bGQgd29yay4KLSAgICBjaGVjayhjb252ZXJ0KHNvdXJjZUJhc2U2NCkpOwotICB9KTsKLX0pOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvYmluYXJ5L3dyaXRlci5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS93cml0ZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJlNDQ3OGUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvYmluYXJ5L3dyaXRlci5qcworKysgL2Rldi9udWxsCkBAIC0xLDE1NjEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8qKgotICogQGZpbGVvdmVydmlldyBUaGlzIGZpbGUgY29udGFpbnMgdXRpbGl0aWVzIGZvciBlbmNvZGluZyBKYXZhc2NyaXB0IG9iamVjdHMKLSAqIGludG8gYmluYXJ5LCB3aXJlLWZvcm1hdCBwcm90b2NvbCBidWZmZXJzIChpbiB0aGUgZm9ybSBvZiBVaW50OEFycmF5cykgdGhhdAotICogYSBzZXJ2ZXIgY2FuIGNvbnN1bWUgZGlyZWN0bHkuCi0gKgotICoganNwYidzIEJpbmFyeVdyaXRlciBjbGFzcyBkZWZpbmVzIG1ldGhvZHMgZm9yIGVmZmljaWVudGx5IGVuY29kaW5nCi0gKiBKYXZhc2NyaXB0IG9iamVjdHMgaW50byBiaW5hcnksIHdpcmUtZm9ybWF0IHByb3RvY29sIGJ1ZmZlcnMgYW5kIHN1cHBvcnRzCi0gKiBhbGwgdGhlIGZ1bmRhbWVudGFsIGZpZWxkIHR5cGVzIHVzZWQgaW4gcHJvdG9jb2wgYnVmZmVycy4KLSAqCi0gKiBNYWpvciBjYXZlYXQgMSAtIFVzZXJzIG9mIHRoaXMgbGlicmFyeSBfbXVzdF8ga2VlcCB0aGVpciBKYXZhc2NyaXB0IHByb3RvCi0gKiBwYXJzaW5nIGNvZGUgaW4gc3luYyB3aXRoIHRoZSBvcmlnaW5hbCAucHJvdG8gZmlsZSAtIHByZXN1bWFibHkgeW91J2xsIGJlCi0gKiB1c2luZyB0aGUgdHlwZWQganNwYiBjb2RlIGdlbmVyYXRvciwgYnV0IGlmIHlvdSBieXBhc3MgdGhhdCB5b3UnbGwgbmVlZAotICogdG8ga2VlcCB0aGluZ3MgaW4gc3luYyBieSBoYW5kLgotICoKLSAqIE1ham9yIGNhdmVhdCAyIC0gSmF2YXNjcmlwdCBpcyB1bmFibGUgdG8gYWNjdXJhdGVseSByZXByZXNlbnQgaW50ZWdlcnMKLSAqIGxhcmdlciB0aGFuIDJeNTMgZHVlIHRvIGl0cyB1c2Ugb2YgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGZvcm1hdAotICogZm9yIGFsbCBudW1iZXJzLiBCaW5hcnlXcml0ZXIgZG9lcyBub3QgbWFrZSBhbnkgc3BlY2lhbCBlZmZvcnQgdG8gcHJlc2VydmUKLSAqIHByZWNpc2lvbiBmb3IgdmFsdWVzIGFib3ZlIHRoaXMgbGltaXQgLSBpZiB5b3UgbmVlZCB0byBwYXNzIDY0LWJpdCBpbnRlZ2VycwotICogKGhhc2ggY29kZXMsIGZvciBleGFtcGxlKSBiZXR3ZWVuIHRoZSBjbGllbnQgYW5kIHNlcnZlciB3aXRob3V0IHByZWNpc2lvbgotICogbG9zcywgZG8gX25vdF8gdXNlIHRoaXMgbGlicmFyeS4KLSAqCi0gKiBNYWpvciBjYXZlYXQgMyAtIFRoaXMgY2xhc3MgdXNlcyB0eXBlZCBhcnJheXMgYW5kIG11c3Qgbm90IGJlIHVzZWQgb24gb2xkZXIKLSAqIGJyb3dzZXJzIHRoYXQgZG8gbm90IHN1cHBvcnQgdGhlbS4KLSAqCi0gKiBAYXV0aG9yIGFhcHBsZWJ5QGdvb2dsZS5jb20gKEF1c3RpbiBBcHBsZWJ5KQotICovCi0KLWdvb2cucHJvdmlkZSgnanNwYi5CaW5hcnlXcml0ZXInKTsKLQotZ29vZy5yZXF1aXJlKCdnb29nLmFzc2VydHMnKTsKLWdvb2cucmVxdWlyZSgnZ29vZy5jcnlwdC5iYXNlNjQnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlDb25zdGFudHMnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlFbmNvZGVyJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuYXJpdGguSW50NjQnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5hcml0aC5VSW50NjQnKTsKLWdvb2cucmVxdWlyZSgnanNwYi51dGlscycpOwotCi0KLQotLyoqCi0gKiBCaW5hcnlXcml0ZXIgaW1wbGVtZW50cyBlbmNvZGVycyBmb3IgYWxsIHRoZSB3aXJlIHR5cGVzIHNwZWNpZmllZCBpbgotICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL2VuY29kaW5nLgotICoKLSAqIEBjb25zdHJ1Y3RvcgotICogQHN0cnVjdAotICovCi1qc3BiLkJpbmFyeVdyaXRlciA9IGZ1bmN0aW9uKCkgewotICAvKioKLSAgICogQmxvY2tzIG9mIHNlcmlhbGl6ZWQgZGF0YSB0aGF0IHdpbGwgYmUgY29uY2F0ZW5hdGVkIG9uY2UgYWxsIG1lc3NhZ2VzIGhhdmUKLSAgICogYmVlbiB3cml0dGVuLgotICAgKiBAcHJpdmF0ZSB7IUFycmF5PCFVaW50OEFycmF5fCFBcnJheTxudW1iZXI+Pn0KLSAgICovCi0gIHRoaXMuYmxvY2tzXyA9IFtdOwotCi0gIC8qKgotICAgKiBUb3RhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJsb2Nrc18gYXJyYXkuIERvZXMgX25vdF8gaW5jbHVkZSBieXRlcyBpbgotICAgKiB0aGUgZW5jb2RlciBiZWxvdy4KLSAgICogQHByaXZhdGUge251bWJlcn0KLSAgICovCi0gIHRoaXMudG90YWxMZW5ndGhfID0gMDsKLQotICAvKioKLSAgICogQmluYXJ5IGVuY29kZXIgaG9sZGluZyBwaWVjZXMgb2YgYSBtZXNzYWdlIHRoYXQgd2UncmUgc3RpbGwgc2VyaWFsaXppbmcuCi0gICAqIFdoZW4gd2UgZ2V0IHRvIGEgc3RvcHBpbmcgcG9pbnQgKGVpdGhlciB0aGUgc3RhcnQgb2YgYSBuZXcgc3VibWVzc2FnZSwgb3IKLSAgICogd2hlbiB3ZSBuZWVkIHRvIGFwcGVuZCBhIHJhdyBVaW50OEFycmF5KSwgdGhlIGVuY29kZXIncyBidWZmZXIgd2lsbCBiZQotICAgKiBhZGRlZCB0byB0aGUgYmxvY2sgYXJyYXkgYWJvdmUgYW5kIHRoZSBlbmNvZGVyIHdpbGwgYmUgcmVzZXQuCi0gICAqIEBwcml2YXRlIHshanNwYi5CaW5hcnlFbmNvZGVyfQotICAgKi8KLSAgdGhpcy5lbmNvZGVyXyA9IG5ldyBqc3BiLkJpbmFyeUVuY29kZXIoKTsKLQotICAvKioKLSAgICogQSBzdGFjayBvZiBib29rbWFya3MgY29udGFpbmluZyB0aGUgcGFyZW50IGJsb2NrcyBmb3IgZWFjaCBtZXNzYWdlIHN0YXJ0ZWQKLSAgICogdmlhIGJlZ2luU3ViTWVzc2FnZSgpLCBuZWVkZWQgYXMgYm9va2tlZXBpbmcgZm9yIGVuZFN1Yk1lc3NhZ2UoKS4KLSAgICogVE9ETyhhYXBwbGVieSk6IERlcHJlY2F0ZWQsIHVzZXJzIHNob3VsZCBiZSBjYWxsaW5nIHdyaXRlTWVzc2FnZSgpLgotICAgKiBAcHJpdmF0ZSB7IUFycmF5LjwhQXJyYXkuPG51bWJlcj4+fQotICAgKi8KLSAgdGhpcy5ib29rbWFya3NfID0gW107Ci19OwotCi0KLS8qKgotICogQXBwZW5kIGEgdHlwZWQgYXJyYXkgb2YgYnl0ZXMgb250byB0aGUgYnVmZmVyLgotICoKLSAqIEBwYXJhbSB7IVVpbnQ4QXJyYXl9IGFyciBUaGUgYnl0ZSBhcnJheSB0byBhcHBlbmQuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUuYXBwZW5kVWludDhBcnJheV8gPSBmdW5jdGlvbihhcnIpIHsKLSAgdmFyIHRlbXAgPSB0aGlzLmVuY29kZXJfLmVuZCgpOwotICB0aGlzLmJsb2Nrc18ucHVzaCh0ZW1wKTsKLSAgdGhpcy5ibG9ja3NfLnB1c2goYXJyKTsKLSAgdGhpcy50b3RhbExlbmd0aF8gKz0gdGVtcC5sZW5ndGggKyBhcnIubGVuZ3RoOwotfTsKLQotCi0vKioKLSAqIEJlZ2lucyBhIG5ldyBtZXNzYWdlIGJ5IHdyaXRpbmcgdGhlIGZpZWxkIGhlYWRlciBhbmQgcmV0dXJuaW5nIGEgYm9va21hcmsKLSAqIHdoaWNoIHdlIHdpbGwgdXNlIHRvIHBhdGNoIGluIHRoZSBtZXNzYWdlIGxlbmd0aCB0byBpbiBlbmREZWxpbWl0ZWRfIGJlbG93LgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkCi0gKiBAcmV0dXJuIHshQXJyYXkuPG51bWJlcj59Ci0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUuYmVnaW5EZWxpbWl0ZWRfID0gZnVuY3Rpb24oZmllbGQpIHsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLSAgdmFyIGJvb2ttYXJrID0gdGhpcy5lbmNvZGVyXy5lbmQoKTsKLSAgdGhpcy5ibG9ja3NfLnB1c2goYm9va21hcmspOwotICB0aGlzLnRvdGFsTGVuZ3RoXyArPSBib29rbWFyay5sZW5ndGg7Ci0gIGJvb2ttYXJrLnB1c2godGhpcy50b3RhbExlbmd0aF8pOwotICByZXR1cm4gYm9va21hcms7Ci19OwotCi0KLS8qKgotICogRW5kcyBhIG1lc3NhZ2UgYnkgZW5jb2RpbmcgdGhlIF9jaGFuZ2VfIGluIGxlbmd0aCBvZiB0aGUgYnVmZmVyIHRvIHRoZQotICogcGFyZW50IGJsb2NrIGFuZCBhZGRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSB0aGF0IGxlbmd0aCB0bwotICogdGhlIHRvdGFsIGJ5dGUgbGVuZ3RoLgotICogQHBhcmFtIHshQXJyYXkuPG51bWJlcj59IGJvb2ttYXJrCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUuZW5kRGVsaW1pdGVkXyA9IGZ1bmN0aW9uKGJvb2ttYXJrKSB7Ci0gIHZhciBvbGRMZW5ndGggPSBib29rbWFyay5wb3AoKTsKLSAgdmFyIG1lc3NhZ2VMZW5ndGggPSB0aGlzLnRvdGFsTGVuZ3RoXyArIHRoaXMuZW5jb2Rlcl8ubGVuZ3RoKCkgLSBvbGRMZW5ndGg7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQobWVzc2FnZUxlbmd0aCA+PSAwKTsKLQotICB3aGlsZSAobWVzc2FnZUxlbmd0aCA+IDEyNykgewotICAgIGJvb2ttYXJrLnB1c2goKG1lc3NhZ2VMZW5ndGggJiAweDdmKSB8IDB4ODApOwotICAgIG1lc3NhZ2VMZW5ndGggPSBtZXNzYWdlTGVuZ3RoID4+PiA3OwotICAgIHRoaXMudG90YWxMZW5ndGhfKys7Ci0gIH0KLQotICBib29rbWFyay5wdXNoKG1lc3NhZ2VMZW5ndGgpOwotICB0aGlzLnRvdGFsTGVuZ3RoXysrOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIHByZS1zZXJpYWxpemVkIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7IVVpbnQ4QXJyYXl9IGJ5dGVzIFRoZSBhcnJheSBvZiBieXRlcyB0byB3cml0ZS4KLSAqIEBwYXJhbSB7bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIHdyaXRlLgotICogQHBhcmFtIHtudW1iZXJ9IGVuZCBUaGUgZW5kIG9mIHRoZSByYW5nZSB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU2VyaWFsaXplZE1lc3NhZ2UgPSBmdW5jdGlvbigKLSAgICBieXRlcywgc3RhcnQsIGVuZCkgewotICB0aGlzLmFwcGVuZFVpbnQ4QXJyYXlfKGJ5dGVzLnN1YmFycmF5KHN0YXJ0LCBlbmQpKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBwcmUtc2VyaWFsaXplZCBtZXNzYWdlIHRvIHRoZSBidWZmZXIgaWYgdGhlIG1lc3NhZ2UgYW5kIGVuZHBvaW50cwotICogYXJlIG5vbi1udWxsLgotICogQHBhcmFtIHs/VWludDhBcnJheX0gYnl0ZXMgVGhlIGFycmF5IG9mIGJ5dGVzIHRvIHdyaXRlLgotICogQHBhcmFtIHs/bnVtYmVyfSBzdGFydCBUaGUgc3RhcnQgb2YgdGhlIHJhbmdlIHRvIHdyaXRlLgotICogQHBhcmFtIHs/bnVtYmVyfSBlbmQgVGhlIGVuZCBvZiB0aGUgcmFuZ2UgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5tYXliZVdyaXRlU2VyaWFsaXplZE1lc3NhZ2UgPSBmdW5jdGlvbigKLSAgICBieXRlcywgc3RhcnQsIGVuZCkgewotICBpZiAoYnl0ZXMgIT0gbnVsbCAmJiBzdGFydCAhPSBudWxsICYmIGVuZCAhPSBudWxsKSB7Ci0gICAgdGhpcy53cml0ZVNlcmlhbGl6ZWRNZXNzYWdlKGJ5dGVzLCBzdGFydCwgZW5kKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFJlc2V0cyB0aGUgd3JpdGVyLCB0aHJvd2luZyBhd2F5IGFueSBhY2N1bXVsYXRlZCBidWZmZXJzLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUucmVzZXQgPSBmdW5jdGlvbigpIHsKLSAgdGhpcy5ibG9ja3NfID0gW107Ci0gIHRoaXMuZW5jb2Rlcl8uZW5kKCk7Ci0gIHRoaXMudG90YWxMZW5ndGhfID0gMDsKLSAgdGhpcy5ib29rbWFya3NfID0gW107Ci19OwotCi0KLS8qKgotICogQ29udmVydHMgdGhlIGVuY29kZWQgZGF0YSBpbnRvIGEgVWludDhBcnJheS4KLSAqIEByZXR1cm4geyFVaW50OEFycmF5fQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUuZ2V0UmVzdWx0QnVmZmVyID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5ib29rbWFya3NfLmxlbmd0aCA9PSAwKTsKLQotICB2YXIgZmxhdCA9IG5ldyBVaW50OEFycmF5KHRoaXMudG90YWxMZW5ndGhfICsgdGhpcy5lbmNvZGVyXy5sZW5ndGgoKSk7Ci0KLSAgdmFyIGJsb2NrcyA9IHRoaXMuYmxvY2tzXzsKLSAgdmFyIGJsb2NrQ291bnQgPSBibG9ja3MubGVuZ3RoOwotICB2YXIgb2Zmc2V0ID0gMDsKLQotICBmb3IgKHZhciBpID0gMDsgaSA8IGJsb2NrQ291bnQ7IGkrKykgewotICAgIHZhciBibG9jayA9IGJsb2Nrc1tpXTsKLSAgICBmbGF0LnNldChibG9jaywgb2Zmc2V0KTsKLSAgICBvZmZzZXQgKz0gYmxvY2subGVuZ3RoOwotICB9Ci0KLSAgdmFyIHRhaWwgPSB0aGlzLmVuY29kZXJfLmVuZCgpOwotICBmbGF0LnNldCh0YWlsLCBvZmZzZXQpOwotICBvZmZzZXQgKz0gdGFpbC5sZW5ndGg7Ci0KLSAgLy8gUG9zdCBjb25kaXRpb246IGBmbGF0dGVuZWRgIG11c3QgaGF2ZSBoYWQgZXZlcnkgYnl0ZSB3cml0dGVuLgotICBnb29nLmFzc2VydHMuYXNzZXJ0KG9mZnNldCA9PSBmbGF0Lmxlbmd0aCk7Ci0KLSAgLy8gUmVwbGFjZSBvdXIgYmxvY2sgbGlzdCB3aXRoIHRoZSBmbGF0dGVuZWQgYmxvY2ssIHdoaWNoIGxldHMgR0MgcmVjbGFpbQotICAvLyB0aGUgdGVtcCBibG9ja3Mgc29vbmVyLgotICB0aGlzLmJsb2Nrc18gPSBbZmxhdF07Ci0KLSAgcmV0dXJuIGZsYXQ7Ci19OwotCi0KLS8qKgotICogQ29udmVydHMgdGhlIGVuY29kZWQgZGF0YSBpbnRvIGEgYmFzNjQtZW5jb2RlZCBzdHJpbmcuCi0gKiBAcmV0dXJuIHtzdHJpbmd9Ci0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5nZXRSZXN1bHRCYXNlNjRTdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIGdvb2cuY3J5cHQuYmFzZTY0LmVuY29kZUJ5dGVBcnJheSh0aGlzLmdldFJlc3VsdEJ1ZmZlcigpKTsKLX07Ci0KLQotLyoqCi0gKiBCZWdpbnMgYSBuZXcgc3ViLW1lc3NhZ2UuIFRoZSBjbGllbnQgbXVzdCBjYWxsIGVuZFN1Yk1lc3NhZ2UoKSB3aGVuIHRoZXkncmUKLSAqIGRvbmUuCi0gKiBUT0RPKGFhcHBsZWJ5KTogRGVwcmVjYXRlZC4gTW92ZSBjYWxsZXJzIHRvIHdyaXRlTWVzc2FnZSgpLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIgb2YgdGhlIHN1Yi1tZXNzYWdlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUuYmVnaW5TdWJNZXNzYWdlID0gZnVuY3Rpb24oZmllbGQpIHsKLSAgdGhpcy5ib29rbWFya3NfLnB1c2godGhpcy5iZWdpbkRlbGltaXRlZF8oZmllbGQpKTsKLX07Ci0KLQotLyoqCi0gKiBGaW5pc2hlcyBhIHN1Yi1tZXNzYWdlIGFuZCBwYWNrcyBpdCBpbnRvIHRoZSBwYXJlbnQgbWVzc2FnZXMnIGJ1ZmZlci4KLSAqIFRPRE8oYWFwcGxlYnkpOiBEZXByZWNhdGVkLiBNb3ZlIGNhbGxlcnMgdG8gd3JpdGVNZXNzYWdlKCkuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS5lbmRTdWJNZXNzYWdlID0gZnVuY3Rpb24oKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQodGhpcy5ib29rbWFya3NfLmxlbmd0aCA+PSAwKTsKLSAgdGhpcy5lbmREZWxpbWl0ZWRfKHRoaXMuYm9va21hcmtzXy5wb3AoKSk7Ci19OwotCi0KLS8qKgotICogRW5jb2RlcyBhIChmaWVsZCBudW1iZXIsIHdpcmUgdHlwZSkgdHVwbGUgaW50byBhIHdpcmUtZm9ybWF0IGZpZWxkIGhlYWRlcgotICogYW5kIHN0b3JlcyBpdCBpbiB0aGUgYnVmZmVyIGFzIGEgdmFyaW50LgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gd2lyZVR5cGUgVGhlIHdpcmUtdHlwZSBvZiB0aGUgZmllbGQsIGFzIHNwZWNpZmllZCBpbiB0aGUKLSAqICAgICBwcm90b2NvbCBidWZmZXIgZG9jdW1lbnRhdGlvbi4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUZpZWxkSGVhZGVyXyA9Ci0gICAgZnVuY3Rpb24oZmllbGQsIHdpcmVUeXBlKSB7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoZmllbGQgPj0gMSAmJiBmaWVsZCA9PSBNYXRoLmZsb29yKGZpZWxkKSk7Ci0gIHZhciB4ID0gZmllbGQgKiA4ICsgd2lyZVR5cGU7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKHgpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIGZpZWxkIG9mIGFueSB2YWxpZCBzY2FsYXIgdHlwZSB0byB0aGUgYmluYXJ5IHN0cmVhbS4KLSAqIEBwYXJhbSB7anNwYi5CaW5hcnlDb25zdGFudHMuRmllbGRUeXBlfSBmaWVsZFR5cGUKLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZAotICogQHBhcmFtIHtqc3BiLkFueUZpZWxkVHlwZX0gdmFsdWUKLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlQW55ID0gZnVuY3Rpb24oZmllbGRUeXBlLCBmaWVsZCwgdmFsdWUpIHsKLSAgdmFyIGZpZWxkVHlwZXMgPSBqc3BiLkJpbmFyeUNvbnN0YW50cy5GaWVsZFR5cGU7Ci0gIHN3aXRjaCAoZmllbGRUeXBlKSB7Ci0gICAgY2FzZSBmaWVsZFR5cGVzLkRPVUJMRToKLSAgICAgIHRoaXMud3JpdGVEb3VibGUoZmllbGQsIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgZmllbGRUeXBlcy5GTE9BVDoKLSAgICAgIHRoaXMud3JpdGVGbG9hdChmaWVsZCwgLyoqIEB0eXBlIHtudW1iZXJ9ICovKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBmaWVsZFR5cGVzLklOVDY0OgotICAgICAgdGhpcy53cml0ZUludDY0KGZpZWxkLCAvKiogQHR5cGUge251bWJlcn0gKi8odmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIGZpZWxkVHlwZXMuVUlOVDY0OgotICAgICAgdGhpcy53cml0ZVVpbnQ2NChmaWVsZCwgLyoqIEB0eXBlIHtudW1iZXJ9ICovKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBmaWVsZFR5cGVzLklOVDMyOgotICAgICAgdGhpcy53cml0ZUludDMyKGZpZWxkLCAvKiogQHR5cGUge251bWJlcn0gKi8odmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIGZpZWxkVHlwZXMuRklYRUQ2NDoKLSAgICAgIHRoaXMud3JpdGVGaXhlZDY0KGZpZWxkLCAvKiogQHR5cGUge251bWJlcn0gKi8odmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIGZpZWxkVHlwZXMuRklYRUQzMjoKLSAgICAgIHRoaXMud3JpdGVGaXhlZDMyKGZpZWxkLCAvKiogQHR5cGUge251bWJlcn0gKi8odmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIGZpZWxkVHlwZXMuQk9PTDoKLSAgICAgIHRoaXMud3JpdGVCb29sKGZpZWxkLCAvKiogQHR5cGUge2Jvb2xlYW59ICovKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlNUUklORzoKLSAgICAgIHRoaXMud3JpdGVTdHJpbmcoZmllbGQsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgZmllbGRUeXBlcy5HUk9VUDoKLSAgICAgIGdvb2cuYXNzZXJ0cy5mYWlsKCdHcm91cCBmaWVsZCB0eXBlIG5vdCBzdXBwb3J0ZWQgaW4gd3JpdGVBbnkoKScpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgZmllbGRUeXBlcy5NRVNTQUdFOgotICAgICAgZ29vZy5hc3NlcnRzLmZhaWwoJ01lc3NhZ2UgZmllbGQgdHlwZSBub3Qgc3VwcG9ydGVkIGluIHdyaXRlQW55KCknKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIGZpZWxkVHlwZXMuQllURVM6Ci0gICAgICB0aGlzLndyaXRlQnl0ZXMoZmllbGQsIC8qKiBAdHlwZSB7P1VpbnQ4QXJyYXl9ICovKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlVJTlQzMjoKLSAgICAgIHRoaXMud3JpdGVVaW50MzIoZmllbGQsIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgZmllbGRUeXBlcy5FTlVNOgotICAgICAgdGhpcy53cml0ZUVudW0oZmllbGQsIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgZmllbGRUeXBlcy5TRklYRUQzMjoKLSAgICAgIHRoaXMud3JpdGVTZml4ZWQzMihmaWVsZCwgLyoqIEB0eXBlIHtudW1iZXJ9ICovKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlNGSVhFRDY0OgotICAgICAgdGhpcy53cml0ZVNmaXhlZDY0KGZpZWxkLCAvKiogQHR5cGUge251bWJlcn0gKi8odmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIGZpZWxkVHlwZXMuU0lOVDMyOgotICAgICAgdGhpcy53cml0ZVNpbnQzMihmaWVsZCwgLyoqIEB0eXBlIHtudW1iZXJ9ICovKHZhbHVlKSk7Ci0gICAgICByZXR1cm47Ci0gICAgY2FzZSBmaWVsZFR5cGVzLlNJTlQ2NDoKLSAgICAgIHRoaXMud3JpdGVTaW50NjQoZmllbGQsIC8qKiBAdHlwZSB7bnVtYmVyfSAqLyh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGNhc2UgZmllbGRUeXBlcy5GSEFTSDY0OgotICAgICAgdGhpcy53cml0ZUZpeGVkSGFzaDY0KGZpZWxkLCAvKiogQHR5cGUge3N0cmluZ30gKi8odmFsdWUpKTsKLSAgICAgIHJldHVybjsKLSAgICBjYXNlIGZpZWxkVHlwZXMuVkhBU0g2NDoKLSAgICAgIHRoaXMud3JpdGVWYXJpbnRIYXNoNjQoZmllbGQsIC8qKiBAdHlwZSB7c3RyaW5nfSAqLyh2YWx1ZSkpOwotICAgICAgcmV0dXJuOwotICAgIGRlZmF1bHQ6Ci0gICAgICBnb29nLmFzc2VydHMuZmFpbCgnSW52YWxpZCBmaWVsZCB0eXBlIGluIHdyaXRlQW55KCknKTsKLSAgICAgIHJldHVybjsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIHZhcmludCBmaWVsZCB0byB0aGUgYnVmZmVyIHdpdGhvdXQgcmFuZ2UgY2hlY2tpbmcuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICogQHByaXZhdGUKLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlVW5zaWduZWRWYXJpbnQzMl8gPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIodmFsdWUpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIHZhcmludCBmaWVsZCB0byB0aGUgYnVmZmVyIHdpdGhvdXQgcmFuZ2UgY2hlY2tpbmcuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICogQHByaXZhdGUKLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlU2lnbmVkVmFyaW50MzJfID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMih2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgdmFyaW50IGZpZWxkIHRvIHRoZSBidWZmZXIgd2l0aG91dCByYW5nZSBjaGVja2luZy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVVbnNpZ25lZFZhcmludDY0XyA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICB0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQ2NCh2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgdmFyaW50IGZpZWxkIHRvIHRoZSBidWZmZXIgd2l0aG91dCByYW5nZSBjaGVja2luZy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTaWduZWRWYXJpbnQ2NF8gPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDY0KHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSB6aWd6YWcgdmFyaW50IGZpZWxkIHRvIHRoZSBidWZmZXIgd2l0aG91dCByYW5nZSBjaGVja2luZy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVaaWd6YWdWYXJpbnQzMl8gPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDMyKHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSB6aWd6YWcgdmFyaW50IGZpZWxkIHRvIHRoZSBidWZmZXIgd2l0aG91dCByYW5nZSBjaGVja2luZy4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVaaWd6YWdWYXJpbnQ2NF8gPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVppZ3phZ1ZhcmludDY0KHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gaW50MzIgZmllbGQgdG8gdGhlIGJ1ZmZlci4gTnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZSBbLTJeMzEsMl4zMSkKLSAqIHdpbGwgYmUgdHJ1bmNhdGVkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0ge251bWJlcj99IHZhbHVlIFRoZSB2YWx1ZSB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlSW50MzIgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gLWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpKTsKLSAgdGhpcy53cml0ZVNpZ25lZFZhcmludDMyXyhmaWVsZCwgdmFsdWUpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBpbnQzMiBmaWVsZCByZXByZXNlbnRlZCBhcyBhIHN0cmluZyB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUKLSAqIHRoZSByYW5nZSBbLTJeMzEsMl4zMSkgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7c3RyaW5nP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVJbnQzMlN0cmluZyA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICB2YXIgaW50VmFsdWUgPSAvKioge251bWJlcn0gKi8gcGFyc2VJbnQodmFsdWUsIDEwKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgoaW50VmFsdWUgPj0gLWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAoaW50VmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpKTsKLSAgdGhpcy53cml0ZVNpZ25lZFZhcmludDMyXyhmaWVsZCwgaW50VmFsdWUpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBpbnQ2NCBmaWVsZCB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUgdGhlIHJhbmdlIFstMl42MywyXjYzKQotICogd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVJbnQ2NCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MykpOwotICB0aGlzLndyaXRlU2lnbmVkVmFyaW50NjRfKGZpZWxkLCB2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgaW50NjQgZmllbGQgKHdpdGggdmFsdWUgYXMgYSBzdHJpbmcpIHRvIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7c3RyaW5nP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVJbnQ2NFN0cmluZyA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICB2YXIgbnVtID0ganNwYi5hcml0aC5JbnQ2NC5mcm9tU3RyaW5nKHZhbHVlKTsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQobnVtLmxvLCBudW0uaGkpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIHVpbnQzMiBmaWVsZCB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUgdGhlIHJhbmdlIFswLDJeMzIpCi0gKiB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVVpbnQzMiA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMikpOwotICB0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQzMl8oZmllbGQsIHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSB1aW50MzIgZmllbGQgcmVwcmVzZW50ZWQgYXMgYSBzdHJpbmcgdG8gdGhlIGJ1ZmZlci4gTnVtYmVycyBvdXRzaWRlCi0gKiB0aGUgcmFuZ2UgWzAsMl4zMikgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7c3RyaW5nP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVVaW50MzJTdHJpbmcgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgdmFyIGludFZhbHVlID0gLyoqIHtudW1iZXJ9ICovIHBhcnNlSW50KHZhbHVlLCAxMCk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKGludFZhbHVlID49IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgKGludFZhbHVlIDwganNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMyKSk7Ci0gIHRoaXMud3JpdGVVbnNpZ25lZFZhcmludDMyXyhmaWVsZCwgaW50VmFsdWUpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIHVpbnQ2NCBmaWVsZCB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUgdGhlIHJhbmdlIFswLDJeNjQpCi0gKiB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVVpbnQ2NCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAwKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182NCkpOwotICB0aGlzLndyaXRlVW5zaWduZWRWYXJpbnQ2NF8oZmllbGQsIHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSB1aW50NjQgZmllbGQgKHdpdGggdmFsdWUgYXMgYSBzdHJpbmcpIHRvIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7c3RyaW5nP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVVaW50NjRTdHJpbmcgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgdmFyIG51bSA9IGpzcGIuYXJpdGguVUludDY0LmZyb21TdHJpbmcodmFsdWUpOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICB0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRWYXJpbnQ2NChudW0ubG8sIG51bS5oaSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgc2ludDMyIGZpZWxkIHRvIHRoZSBidWZmZXIuIE51bWJlcnMgb3V0c2lkZSB0aGUgcmFuZ2UgWy0yXjMxLDJeMzEpCi0gKiB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVNpbnQzMiA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSkpOwotICB0aGlzLndyaXRlWmlnemFnVmFyaW50MzJfKGZpZWxkLCB2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgc2ludDY0IGZpZWxkIHRvIHRoZSBidWZmZXIuIE51bWJlcnMgb3V0c2lkZSB0aGUgcmFuZ2UgWy0yXjYzLDJeNjMpCi0gKiB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVNpbnQ2NCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MykpOwotICB0aGlzLndyaXRlWmlnemFnVmFyaW50NjRfKGZpZWxkLCB2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgZml4ZWQzMiBmaWVsZCB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUgdGhlIHJhbmdlIFswLDJeMzIpCi0gKiB3aWxsIGJlIHRydW5jYXRlZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUZpeGVkMzIgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gMCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzIpKTsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRklYRUQzMik7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVVaW50MzIodmFsdWUpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIGZpeGVkNjQgZmllbGQgdG8gdGhlIGJ1ZmZlci4gTnVtYmVycyBvdXRzaWRlIHRoZSByYW5nZSBbMCwyXjY0KQotICogd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVGaXhlZDY0ID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQoKHZhbHVlID49IDApICYmCi0gICAgICAgICAgICAgICAgICAgICAgKHZhbHVlIDwganNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzY0KSk7Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpOwotICB0aGlzLmVuY29kZXJfLndyaXRlVWludDY0KHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBzZml4ZWQzMiBmaWVsZCB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUgdGhlIHJhbmdlCi0gKiBbLTJeMzEsMl4zMSkgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTZml4ZWQzMiA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzMxKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSkpOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZUludDMyKHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBzZml4ZWQ2NCBmaWVsZCB0byB0aGUgYnVmZmVyLiBOdW1iZXJzIG91dHNpZGUgdGhlIHJhbmdlCi0gKiBbLTJeNjMsMl42Mykgd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTZml4ZWQ2NCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KCh2YWx1ZSA+PSAtanNwYi5CaW5hcnlDb25zdGFudHMuVFdPX1RPXzYzKSAmJgotICAgICAgICAgICAgICAgICAgICAgICh2YWx1ZSA8IGpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT182MykpOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0KTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZUludDY0KHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGZpZWxkIHRvIHRoZSBidWZmZXIuIE51bWJlcnMKLSAqIHJlcXVpcmluZyBtb3JlIHRoYW4gMzIgYml0cyBvZiBwcmVjaXNpb24gd2lsbCBiZSB0cnVuY2F0ZWQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyP30gdmFsdWUgVGhlIHZhbHVlIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVGbG9hdCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDMyKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZUZsb2F0KHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBkb3VibGUtcHJlY2lzaW9uIGZsb2F0aW5nIHBvaW50IGZpZWxkIHRvIHRoZSBidWZmZXIuIEFzIHRoaXMgaXMgdGhlCi0gKiBuYXRpdmUgZm9ybWF0IHVzZWQgYnkgSmF2YVNjcmlwdCwgbm8gcHJlY2lzaW9uIHdpbGwgYmUgbG9zdC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZURvdWJsZSA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5GSVhFRDY0KTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZURvdWJsZSh2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgYm9vbGVhbiBmaWVsZCB0byB0aGUgYnVmZmVyLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0ge2Jvb2xlYW4/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUJvb2wgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydChnb29nLmlzQm9vbGVhbih2YWx1ZSkpOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5WQVJJTlQpOwotICB0aGlzLmVuY29kZXJfLndyaXRlQm9vbCh2YWx1ZSk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGVudW0gZmllbGQgdG8gdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtudW1iZXI/fSB2YWx1ZSBUaGUgdmFsdWUgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUVudW0gPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCgodmFsdWUgPj0gLWpzcGIuQmluYXJ5Q29uc3RhbnRzLlRXT19UT18zMSkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAodmFsdWUgPCBqc3BiLkJpbmFyeUNvbnN0YW50cy5UV09fVE9fMzEpKTsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuVkFSSU5UKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBzdHJpbmcgZmllbGQgdG8gdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHtzdHJpbmc/fSB2YWx1ZSBUaGUgc3RyaW5nIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVTdHJpbmcgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgdmFyIGJvb2ttYXJrID0gdGhpcy5iZWdpbkRlbGltaXRlZF8oZmllbGQpOwotICB0aGlzLmVuY29kZXJfLndyaXRlU3RyaW5nKHZhbHVlKTsKLSAgdGhpcy5lbmREZWxpbWl0ZWRfKGJvb2ttYXJrKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJiaXRyYXJ5IGJ5dGUgZmllbGQgdG8gdGhlIGJ1ZmZlci4gTm90ZSAtIHRvIG1hdGNoIHRoZSBiZWhhdmlvcgotICogb2YgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiwgZW1wdHkgYnl0ZSBhcnJheXMgX2FyZV8gc2VyaWFsaXplZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/anNwYi5CeXRlU291cmNlfSB2YWx1ZSBUaGUgYXJyYXkgb2YgYnl0ZXMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUJ5dGVzID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIHZhciBieXRlcyA9IGpzcGIudXRpbHMuYnl0ZVNvdXJjZVRvVWludDhBcnJheSh2YWx1ZSk7Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCk7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKGJ5dGVzLmxlbmd0aCk7Ci0gIHRoaXMuYXBwZW5kVWludDhBcnJheV8oYnl0ZXMpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIG1lc3NhZ2UgdG8gdGhlIGJ1ZmZlci4KLSAqIEB0ZW1wbGF0ZSBNZXNzYWdlVHlwZQotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9NZXNzYWdlVHlwZX0gdmFsdWUgVGhlIG1lc3NhZ2UgdG8gd3JpdGUuCi0gKiBAcGFyYW0geyFqc3BiLldyaXRlckZ1bmN0aW9ufSB3cml0ZXJDYWxsYmFjayBXaWxsIGJlIGludm9rZWQgd2l0aCB0aGUgdmFsdWUKLSAqICAgICB0byB3cml0ZSBhbmQgdGhlIHdyaXRlciB0byB3cml0ZSBpdCB3aXRoLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVNZXNzYWdlID0gZnVuY3Rpb24oCi0gICAgZmllbGQsIHZhbHVlLCB3cml0ZXJDYWxsYmFjaykgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICB2YXIgYm9va21hcmsgPSB0aGlzLmJlZ2luRGVsaW1pdGVkXyhmaWVsZCk7Ci0gIHdyaXRlckNhbGxiYWNrKHZhbHVlLCB0aGlzKTsKLSAgdGhpcy5lbmREZWxpbWl0ZWRfKGJvb2ttYXJrKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBncm91cCBtZXNzYWdlIHRvIHRoZSBidWZmZXIuCi0gKgotICogQHRlbXBsYXRlIE1lc3NhZ2VUeXBlCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P01lc3NhZ2VUeXBlfSB2YWx1ZSBUaGUgbWVzc2FnZSB0byB3cml0ZSwgd3JhcHBlZCB3aXRoIFNUQVJUX0dST1VQIC8KLSAqICAgICBFTkRfR1JPVVAgdGFncy4gV2lsbCBiZSBhIG5vLW9wIGlmICd2YWx1ZScgaXMgbnVsbC4KLSAqIEBwYXJhbSB7IWpzcGIuV3JpdGVyRnVuY3Rpb259IHdyaXRlckNhbGxiYWNrIFdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSB2YWx1ZQotICogICAgIHRvIHdyaXRlIGFuZCB0aGUgd3JpdGVyIHRvIHdyaXRlIGl0IHdpdGguCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZUdyb3VwID0gZnVuY3Rpb24oCi0gICAgZmllbGQsIHZhbHVlLCB3cml0ZXJDYWxsYmFjaykgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5TVEFSVF9HUk9VUCk7Ci0gIHdyaXRlckNhbGxiYWNrKHZhbHVlLCB0aGlzKTsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuRU5EX0dST1VQKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSA2NC1iaXQgaGFzaCBzdHJpbmcgZmllbGQgKDggY2hhcmFjdGVycyBAIDggYml0cyBvZiBkYXRhIGVhY2gpIHRvCi0gKiB0aGUgYnVmZmVyLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0ge3N0cmluZz99IHZhbHVlIFRoZSBoYXNoIHN0cmluZy4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlRml4ZWRIYXNoNjQgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh2YWx1ZS5sZW5ndGggPT0gOCk7Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkZJWEVENjQpOwotICB0aGlzLmVuY29kZXJfLndyaXRlRml4ZWRIYXNoNjQodmFsdWUpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIDY0LWJpdCBoYXNoIHN0cmluZyBmaWVsZCAoOCBjaGFyYWN0ZXJzIEAgOCBiaXRzIG9mIGRhdGEgZWFjaCkgdG8KLSAqIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7c3RyaW5nP30gdmFsdWUgVGhlIGhhc2ggc3RyaW5nLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVWYXJpbnRIYXNoNjQgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydCh2YWx1ZS5sZW5ndGggPT0gOCk7Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLlZBUklOVCk7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVWYXJpbnRIYXNoNjQodmFsdWUpOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSByZXBlYXRlZCB2YXJpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkVW5zaWduZWRWYXJpbnQzMl8gPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZVVuc2lnbmVkVmFyaW50MzJfKGZpZWxkLCB2YWx1ZVtpXSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcmVwZWF0ZWQgdmFyaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFNpZ25lZFZhcmludDMyXyA9Ci0gICAgZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLndyaXRlU2lnbmVkVmFyaW50MzJfKGZpZWxkLCB2YWx1ZVtpXSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcmVwZWF0ZWQgdmFyaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFVuc2lnbmVkVmFyaW50NjRfID0KLSAgICBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVVbnNpZ25lZFZhcmludDY0XyhmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIHZhcmludCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICogQHByaXZhdGUKLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTaWduZWRWYXJpbnQ2NF8gPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZVNpZ25lZFZhcmludDY0XyhmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIHppZ3phZyBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICogQHByaXZhdGUKLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRaaWd6YWczMl8gPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVaaWd6YWdWYXJpbnQzMl8oZmllbGQsIHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSByZXBlYXRlZCB6aWd6YWcgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkWmlnemFnXyA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZVppZ3phZ1ZhcmludDY0XyhmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIDMyLWJpdCBpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRJbnQzMiA9Ci0gICAganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRTaWduZWRWYXJpbnQzMl87Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyBmb3JtYXR0ZWQgYXMgc3RyaW5ncyB0byB0aGUgYnVmZmVyIGFzIGEgcmVwZWF0ZWQKLSAqIDMyLWJpdCBpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxzdHJpbmc+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRJbnQzMlN0cmluZyA9Ci0gICAgZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLndyaXRlSW50MzJTdHJpbmcoZmllbGQsIHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSByZXBlYXRlZCA2NC1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkSW50NjQgPQotICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkU2lnbmVkVmFyaW50NjRfOwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgZm9ybWF0dGVkIGFzIHN0cmluZ3MgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkCi0gKiA2NC1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48c3RyaW5nPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkSW50NjRTdHJpbmcgPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZUludDY0U3RyaW5nKGZpZWxkLCB2YWx1ZVtpXSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcmVwZWF0ZWQgdW5zaWduZWQgMzItYml0IGludAotICogICAgIGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkVWludDMyID0KLSAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFVuc2lnbmVkVmFyaW50MzJfOwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgZm9ybWF0dGVkIGFzIHN0cmluZ3MgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkCi0gKiB1bnNpZ25lZCAzMi1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48c3RyaW5nPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkVWludDMyU3RyaW5nID0KLSAgICBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVVaW50MzJTdHJpbmcoZmllbGQsIHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSByZXBlYXRlZCB1bnNpZ25lZCA2NC1iaXQgaW50Ci0gKiAgICAgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRVaW50NjQgPQotICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkVW5zaWduZWRWYXJpbnQ2NF87Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyBmb3JtYXR0ZWQgYXMgc3RyaW5ncyB0byB0aGUgYnVmZmVyIGFzIGEgcmVwZWF0ZWQKLSAqIHVuc2lnbmVkIDY0LWJpdCBpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxzdHJpbmc+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRVaW50NjRTdHJpbmcgPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZVVpbnQ2NFN0cmluZyhmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIHNpZ25lZCAzMi1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkU2ludDMyID0KLSAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFppZ3phZzMyXzsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSByZXBlYXRlZCBzaWduZWQgNjQtYml0IGludCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFNpbnQ2NCA9Ci0gICAganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRaaWd6YWdfOwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIGZpeGVkMzIgZmllbGQuIFRoaXMKLSAqIHdvcmtzIGZvciBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgZml4ZWQzMnMuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRGaXhlZDMyID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLndyaXRlRml4ZWQzMihmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIGZpeGVkNjQgZmllbGQuIFRoaXMKLSAqIHdvcmtzIGZvciBib3RoIHNpZ25lZCBhbmQgdW5zaWduZWQgZml4ZWQ2NHMuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRGaXhlZDY0ID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLndyaXRlRml4ZWQ2NChmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIHNmaXhlZDMyIGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkU2ZpeGVkMzIgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVTZml4ZWQzMihmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIHNmaXhlZDY0IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkU2ZpeGVkNjQgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVTZml4ZWQ2NChmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIGZsb2F0IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkRmxvYXQgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVGbG9hdChmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIGRvdWJsZSBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZERvdWJsZSA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZURvdWJsZShmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIGJvb2xlYW5zIHRvIHRoZSBidWZmZXIgYXMgYSByZXBlYXRlZCBib29sIGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48Ym9vbGVhbj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZEJvb2wgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVCb29sKGZpZWxkLCB2YWx1ZVtpXSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgZW51bXMgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIGVudW0gZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRFbnVtID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSByZXR1cm47Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLndyaXRlRW51bShmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIHN0cmluZ3MgdG8gdGhlIGJ1ZmZlciBhcyBhIHJlcGVhdGVkIHN0cmluZyBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPHN0cmluZz59IHZhbHVlIFRoZSBhcnJheSBvZiBzdHJpbmdzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZFN0cmluZyA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZVN0cmluZyhmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIGFyYml0cmFyeSBieXRlIGZpZWxkcyB0byB0aGUgYnVmZmVyLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48IWpzcGIuQnl0ZVNvdXJjZT59IHZhbHVlIFRoZSBhcnJheXMgb2YgYXJyYXlzIG9mIGJ5dGVzIHRvCi0gKiAgICAgd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkQnl0ZXMgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMud3JpdGVCeXRlcyhmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG1lc3NhZ2VzIHRvIHRoZSBidWZmZXIuCi0gKiBAdGVtcGxhdGUgTWVzc2FnZVR5cGUKLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPE1lc3NhZ2VUeXBlPn0gdmFsdWUgVGhlIGFycmF5IG9mIG1lc3NhZ2VzIHRvCi0gKiAgICB3cml0ZS4KLSAqIEBwYXJhbSB7IWpzcGIuV3JpdGVyRnVuY3Rpb259IHdyaXRlckNhbGxiYWNrIFdpbGwgYmUgaW52b2tlZCB3aXRoIHRoZSB2YWx1ZQotICogICAgIHRvIHdyaXRlIGFuZCB0aGUgd3JpdGVyIHRvIHdyaXRlIGl0IHdpdGguCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkTWVzc2FnZSA9IGZ1bmN0aW9uKAotICAgIGZpZWxkLCB2YWx1ZSwgd3JpdGVyQ2FsbGJhY2spIHsKLSAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybjsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHZhciBib29rbWFyayA9IHRoaXMuYmVnaW5EZWxpbWl0ZWRfKGZpZWxkKTsKLSAgICB3cml0ZXJDYWxsYmFjayh2YWx1ZVtpXSwgdGhpcyk7Ci0gICAgdGhpcy5lbmREZWxpbWl0ZWRfKGJvb2ttYXJrKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBncm91cCBtZXNzYWdlcyB0byB0aGUgYnVmZmVyLgotICogQHRlbXBsYXRlIE1lc3NhZ2VUeXBlCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxNZXNzYWdlVHlwZT59IHZhbHVlIFRoZSBhcnJheSBvZiBtZXNzYWdlcyB0bwotICogICAgd3JpdGUuCi0gKiBAcGFyYW0geyFqc3BiLldyaXRlckZ1bmN0aW9ufSB3cml0ZXJDYWxsYmFjayBXaWxsIGJlIGludm9rZWQgd2l0aCB0aGUgdmFsdWUKLSAqICAgICB0byB3cml0ZSBhbmQgdGhlIHdyaXRlciB0byB3cml0ZSBpdCB3aXRoLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVSZXBlYXRlZEdyb3VwID0gZnVuY3Rpb24oCi0gICAgZmllbGQsIHZhbHVlLCB3cml0ZXJDYWxsYmFjaykgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuU1RBUlRfR1JPVVApOwotICAgIHdyaXRlckNhbGxiYWNrKHZhbHVlW2ldLCB0aGlzKTsKLSAgICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5FTkRfR1JPVVApOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGEgNjQtYml0IGhhc2ggc3RyaW5nIGZpZWxkICg4IGNoYXJhY3RlcnMgQCA4IGJpdHMgb2YgZGF0YSBlYWNoKSB0bwotICogdGhlIGJ1ZmZlci4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPHN0cmluZz59IHZhbHVlIFRoZSBhcnJheSBvZiBoYXNoZXMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVJlcGVhdGVkRml4ZWRIYXNoNjQgPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZUZpeGVkSGFzaDY0KGZpZWxkLCB2YWx1ZVtpXSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSByZXBlYXRlZCA2NC1iaXQgaGFzaCBzdHJpbmcgZmllbGQgKDggY2hhcmFjdGVycyBAIDggYml0cyBvZiBkYXRhCi0gKiBlYWNoKSB0byB0aGUgYnVmZmVyLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48c3RyaW5nPn0gdmFsdWUgVGhlIGFycmF5IG9mIGhhc2hlcyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUmVwZWF0ZWRWYXJpbnRIYXNoNjQgPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy53cml0ZVZhcmludEhhc2g2NChmaWVsZCwgdmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCB2YXJpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFVuc2lnbmVkVmFyaW50MzJfID0gZnVuY3Rpb24oCi0gICAgZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdmFyIGJvb2ttYXJrID0gdGhpcy5iZWdpbkRlbGltaXRlZF8oZmllbGQpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIodmFsdWVbaV0pOwotICB9Ci0gIHRoaXMuZW5kRGVsaW1pdGVkXyhib29rbWFyayk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCB2YXJpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFNpZ25lZFZhcmludDMyXyA9IGZ1bmN0aW9uKAotICAgIGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHZhciBib29rbWFyayA9IHRoaXMuYmVnaW5EZWxpbWl0ZWRfKGZpZWxkKTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMuZW5jb2Rlcl8ud3JpdGVTaWduZWRWYXJpbnQzMih2YWx1ZVtpXSk7Ci0gIH0KLSAgdGhpcy5lbmREZWxpbWl0ZWRfKGJvb2ttYXJrKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcGFja2VkIHZhcmludCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICogQHByaXZhdGUKLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkVW5zaWduZWRWYXJpbnQ2NF8gPSBmdW5jdGlvbigKLSAgICBmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwgfHwgIXZhbHVlLmxlbmd0aCkgcmV0dXJuOwotICB2YXIgYm9va21hcmsgPSB0aGlzLmJlZ2luRGVsaW1pdGVkXyhmaWVsZCk7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQ2NCh2YWx1ZVtpXSk7Ci0gIH0KLSAgdGhpcy5lbmREZWxpbWl0ZWRfKGJvb2ttYXJrKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcGFja2VkIHZhcmludCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICogQHByaXZhdGUKLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU2lnbmVkVmFyaW50NjRfID0gZnVuY3Rpb24oCi0gICAgZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdmFyIGJvb2ttYXJrID0gdGhpcy5iZWdpbkRlbGltaXRlZF8oZmllbGQpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDY0KHZhbHVlW2ldKTsKLSAgfQotICB0aGlzLmVuZERlbGltaXRlZF8oYm9va21hcmspOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQgemlnemFnIGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRaaWd6YWczMl8gPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwgfHwgIXZhbHVlLmxlbmd0aCkgcmV0dXJuOwotICB2YXIgYm9va21hcmsgPSB0aGlzLmJlZ2luRGVsaW1pdGVkXyhmaWVsZCk7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLmVuY29kZXJfLndyaXRlWmlnemFnVmFyaW50MzIodmFsdWVbaV0pOwotICB9Ci0gIHRoaXMuZW5kRGVsaW1pdGVkXyhib29rbWFyayk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCB6aWd6YWcgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFppZ3phZzY0XyA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHZhciBib29rbWFyayA9IHRoaXMuYmVnaW5EZWxpbWl0ZWRfKGZpZWxkKTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMuZW5jb2Rlcl8ud3JpdGVaaWd6YWdWYXJpbnQ2NCh2YWx1ZVtpXSk7Ci0gIH0KLSAgdGhpcy5lbmREZWxpbWl0ZWRfKGJvb2ttYXJrKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcGFja2VkIDMyLWJpdCBpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkSW50MzIgPQotICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFNpZ25lZFZhcmludDMyXzsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHJlcHJlc2VudGVkIGFzIHN0cmluZ3MgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZAotICogMzItYml0IGludCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZAotICogQHBhcmFtIHs/QXJyYXkuPHN0cmluZz59IHZhbHVlCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZEludDMyU3RyaW5nID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdmFyIGJvb2ttYXJrID0gdGhpcy5iZWdpbkRlbGltaXRlZF8oZmllbGQpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy5lbmNvZGVyXy53cml0ZVNpZ25lZFZhcmludDMyKHBhcnNlSW50KHZhbHVlW2ldLCAxMCkpOwotICB9Ci0gIHRoaXMuZW5kRGVsaW1pdGVkXyhib29rbWFyayk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCA2NC1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZEludDY0ID0KLSAgICBqc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRTaWduZWRWYXJpbnQ2NF87Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyByZXByZXNlbnRlZCBhcyBzdHJpbmdzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQKLSAqIDY0LWJpdCBpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQKLSAqIEBwYXJhbSB7P0FycmF5LjxzdHJpbmc+fSB2YWx1ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRJbnQ2NFN0cmluZyA9Ci0gICAgZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdmFyIGJvb2ttYXJrID0gdGhpcy5iZWdpbkRlbGltaXRlZF8oZmllbGQpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdmFyIG51bSA9IGpzcGIuYXJpdGguSW50NjQuZnJvbVN0cmluZyh2YWx1ZVtpXSk7Ci0gICAgdGhpcy5lbmNvZGVyXy53cml0ZVNwbGl0VmFyaW50NjQobnVtLmxvLCBudW0uaGkpOwotICB9Ci0gIHRoaXMuZW5kRGVsaW1pdGVkXyhib29rbWFyayk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCB1bnNpZ25lZCAzMi1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFVpbnQzMiA9Ci0gICAganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkVW5zaWduZWRWYXJpbnQzMl87Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyByZXByZXNlbnRlZCBhcyBzdHJpbmdzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQKLSAqIHVuc2lnbmVkIDMyLWJpdCBpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQKLSAqIEBwYXJhbSB7P0FycmF5LjxzdHJpbmc+fSB2YWx1ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRVaW50MzJTdHJpbmcgPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHZhciBib29rbWFyayA9IHRoaXMuYmVnaW5EZWxpbWl0ZWRfKGZpZWxkKTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKHBhcnNlSW50KHZhbHVlW2ldLCAxMCkpOwotICB9Ci0gIHRoaXMuZW5kRGVsaW1pdGVkXyhib29rbWFyayk7Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCB1bnNpZ25lZCA2NC1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFVpbnQ2NCA9Ci0gICAganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkVW5zaWduZWRWYXJpbnQ2NF87Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyByZXByZXNlbnRlZCBhcyBzdHJpbmdzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQKLSAqIHVuc2lnbmVkIDY0LWJpdCBpbnQgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQKLSAqIEBwYXJhbSB7P0FycmF5LjxzdHJpbmc+fSB2YWx1ZQotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRVaW50NjRTdHJpbmcgPQotICAgIGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHZhciBib29rbWFyayA9IHRoaXMuYmVnaW5EZWxpbWl0ZWRfKGZpZWxkKTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHZhciBudW0gPSBqc3BiLmFyaXRoLlVJbnQ2NC5mcm9tU3RyaW5nKHZhbHVlW2ldKTsKLSAgICB0aGlzLmVuY29kZXJfLndyaXRlU3BsaXRWYXJpbnQ2NChudW0ubG8sIG51bS5oaSk7Ci0gIH0KLSAgdGhpcy5lbmREZWxpbWl0ZWRfKGJvb2ttYXJrKTsKLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcGFja2VkIHNpZ25lZCAzMi1iaXQgaW50IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFNpbnQzMiA9Ci0gICAganNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkWmlnemFnMzJfOwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCBzaWduZWQgNjQtYml0IGludCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRTaW50NjQgPQotICAgIGpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFppZ3phZzY0XzsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQgZml4ZWQzMiBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGaXhlZDMyID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIodmFsdWUubGVuZ3RoICogNCk7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLmVuY29kZXJfLndyaXRlVWludDMyKHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQgZml4ZWQ2NCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGaXhlZDY0ID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIodmFsdWUubGVuZ3RoICogOCk7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLmVuY29kZXJfLndyaXRlVWludDY0KHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQgc2ZpeGVkMzIgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkU2ZpeGVkMzIgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwgfHwgIXZhbHVlLmxlbmd0aCkgcmV0dXJuOwotICB0aGlzLndyaXRlRmllbGRIZWFkZXJfKGZpZWxkLCBqc3BiLkJpbmFyeUNvbnN0YW50cy5XaXJlVHlwZS5ERUxJTUlURUQpOwotICB0aGlzLmVuY29kZXJfLndyaXRlVW5zaWduZWRWYXJpbnQzMih2YWx1ZS5sZW5ndGggKiA0KTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMuZW5jb2Rlcl8ud3JpdGVJbnQzMih2YWx1ZVtpXSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgbnVtYmVycyB0byB0aGUgYnVmZmVyIGFzIGEgcGFja2VkIHNmaXhlZDY0IGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZFNmaXhlZDY0ID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIodmFsdWUubGVuZ3RoICogOCk7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLmVuY29kZXJfLndyaXRlSW50NjQodmFsdWVbaV0pOwotICB9Ci19OwotCi0KLS8qKgotICogV3JpdGVzIGFuIGFycmF5IG9mIG51bWJlcnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCBmbG9hdCBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZCBUaGUgZmllbGQgbnVtYmVyLgotICogQHBhcmFtIHs/QXJyYXkuPG51bWJlcj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGbG9hdCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCk7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKHZhbHVlLmxlbmd0aCAqIDQpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy5lbmNvZGVyXy53cml0ZUZsb2F0KHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBudW1iZXJzIHRvIHRoZSBidWZmZXIgYXMgYSBwYWNrZWQgZG91YmxlIGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48bnVtYmVyPn0gdmFsdWUgVGhlIGFycmF5IG9mIGludHMgdG8gd3JpdGUuCi0gKi8KLWpzcGIuQmluYXJ5V3JpdGVyLnByb3RvdHlwZS53cml0ZVBhY2tlZERvdWJsZSA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCk7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKHZhbHVlLmxlbmd0aCAqIDgpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy5lbmNvZGVyXy53cml0ZURvdWJsZSh2YWx1ZVtpXSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYW4gYXJyYXkgb2YgYm9vbGVhbnMgdG8gdGhlIGJ1ZmZlciBhcyBhIHBhY2tlZCBib29sIGZpZWxkLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0gez9BcnJheS48Ym9vbGVhbj59IHZhbHVlIFRoZSBhcnJheSBvZiBpbnRzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRCb29sID0gZnVuY3Rpb24oZmllbGQsIHZhbHVlKSB7Ci0gIGlmICh2YWx1ZSA9PSBudWxsIHx8ICF2YWx1ZS5sZW5ndGgpIHJldHVybjsKLSAgdGhpcy53cml0ZUZpZWxkSGVhZGVyXyhmaWVsZCwganNwYi5CaW5hcnlDb25zdGFudHMuV2lyZVR5cGUuREVMSU1JVEVEKTsKLSAgdGhpcy5lbmNvZGVyXy53cml0ZVVuc2lnbmVkVmFyaW50MzIodmFsdWUubGVuZ3RoKTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMuZW5jb2Rlcl8ud3JpdGVCb29sKHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhbiBhcnJheSBvZiBlbnVtcyB0byB0aGUgYnVmZmVyIGFzIGEgcGFja2VkIGVudW0gZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxudW1iZXI+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaW50cyB0byB3cml0ZS4KLSAqLwotanNwYi5CaW5hcnlXcml0ZXIucHJvdG90eXBlLndyaXRlUGFja2VkRW51bSA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHZhciBib29rbWFyayA9IHRoaXMuYmVnaW5EZWxpbWl0ZWRfKGZpZWxkKTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCB2YWx1ZS5sZW5ndGg7IGkrKykgewotICAgIHRoaXMuZW5jb2Rlcl8ud3JpdGVFbnVtKHZhbHVlW2ldKTsKLSAgfQotICB0aGlzLmVuZERlbGltaXRlZF8oYm9va21hcmspOwotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIDY0LWJpdCBoYXNoIHN0cmluZyBmaWVsZCAoOCBjaGFyYWN0ZXJzIEAgOCBiaXRzIG9mIGRhdGEgZWFjaCkgdG8KLSAqIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxzdHJpbmc+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaGFzaGVzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRGaXhlZEhhc2g2NCA9IGZ1bmN0aW9uKGZpZWxkLCB2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCAhdmFsdWUubGVuZ3RoKSByZXR1cm47Ci0gIHRoaXMud3JpdGVGaWVsZEhlYWRlcl8oZmllbGQsIGpzcGIuQmluYXJ5Q29uc3RhbnRzLldpcmVUeXBlLkRFTElNSVRFRCk7Ci0gIHRoaXMuZW5jb2Rlcl8ud3JpdGVVbnNpZ25lZFZhcmludDMyKHZhbHVlLmxlbmd0aCAqIDgpOwotICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlLmxlbmd0aDsgaSsrKSB7Ci0gICAgdGhpcy5lbmNvZGVyXy53cml0ZUZpeGVkSGFzaDY0KHZhbHVlW2ldKTsKLSAgfQotfTsKLQotCi0vKioKLSAqIFdyaXRlcyBhIDY0LWJpdCBoYXNoIHN0cmluZyBmaWVsZCAoOCBjaGFyYWN0ZXJzIEAgOCBiaXRzIG9mIGRhdGEgZWFjaCkgdG8KLSAqIHRoZSBidWZmZXIuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGQgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7P0FycmF5LjxzdHJpbmc+fSB2YWx1ZSBUaGUgYXJyYXkgb2YgaGFzaGVzIHRvIHdyaXRlLgotICovCi1qc3BiLkJpbmFyeVdyaXRlci5wcm90b3R5cGUud3JpdGVQYWNrZWRWYXJpbnRIYXNoNjQgPSBmdW5jdGlvbihmaWVsZCwgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID09IG51bGwgfHwgIXZhbHVlLmxlbmd0aCkgcmV0dXJuOwotICB2YXIgYm9va21hcmsgPSB0aGlzLmJlZ2luRGVsaW1pdGVkXyhmaWVsZCk7Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICB0aGlzLmVuY29kZXJfLndyaXRlVmFyaW50SGFzaDY0KHZhbHVlW2ldKTsKLSAgfQotICB0aGlzLmVuZERlbGltaXRlZF8oYm9va21hcmspOwotfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS93cml0ZXJfdGVzdC5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2JpbmFyeS93cml0ZXJfdGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkMzdhMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9iaW5hcnkvd3JpdGVyX3Rlc3QuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMjMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8qKgotICogQGZpbGVvdmVydmlldyBUZXN0IGNhc2VzIGZvciBqc3BiJ3MgYmluYXJ5IHByb3RvY29sIGJ1ZmZlciB3cml0ZXIuIEluCi0gKiBwcmFjdGljZSBCaW5hcnlXcml0ZXIgaXMgdXNlZCB0byBkcml2ZSB0aGUgRGVjb2RlciBhbmQgUmVhZGVyIHRlc3QgY2FzZXMsCi0gKiBzbyBvbmx5IHdyaXRlci1zcGVjaWZpYyB0ZXN0cyBhcmUgaGVyZS4KLSAqCi0gKiBUZXN0IHN1aXRlIGlzIHdyaXR0ZW4gdXNpbmcgSmFzbWluZSAtLSBzZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLwotICoKLSAqIEBhdXRob3IgYWFwcGxlYnlAZ29vZ2xlLmNvbSAoQXVzdGluIEFwcGxlYnkpCi0gKi8KLQotZ29vZy5yZXF1aXJlKCdnb29nLmNyeXB0Jyk7Ci1nb29nLnJlcXVpcmUoJ2dvb2cudGVzdGluZy5hc3NlcnRzJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5V3JpdGVyJyk7Ci0KLQotLyoqCi0gKiBAcGFyYW0ge2Z1bmN0aW9uKCl9IGZ1bmMgVGhpcyBmdW5jdGlvbiBzaG91bGQgdGhyb3cgYW4gZXJyb3Igd2hlbiBydW4uCi0gKi8KLWZ1bmN0aW9uIGFzc2VydEZhaWxzKGZ1bmMpIHsKLSAgdmFyIGUgPSBhc3NlcnRUaHJvd3MoZnVuYyk7Ci0gIGNvbnNvbGUubG9nKGUpOwotICAvL2Fzc2VydE5vdE51bGwoZS50b1N0cmluZygpLm1hdGNoKC9FcnJvci8pKTsKLX0KLQotCi1kZXNjcmliZSgnYmluYXJ5V3JpdGVyVGVzdCcsIGZ1bmN0aW9uKCkgewotICAvKioKLSAgICogVmVyaWZpZXMgdGhhdCBtaXN1c2Ugb2YgdGhlIHdyaXRlciBjbGFzcyB0cmlnZ2VycyBhc3NlcnRpb25zLgotICAgKi8KLSAgaXQoJ3Rlc3RXcml0ZUVycm9ycycsIGZ1bmN0aW9uKCkgewotICAgIC8vIFN1Ym1lc3NhZ2VzIHdpdGggaW52YWxpZCBmaWVsZCBpbmRpY2VzIHNob3VsZCBhc3NlcnQuCi0gICAgdmFyIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpOwotICAgIHZhciBkdW1teU1lc3NhZ2UgPSAvKiogQHR5cGUgeyFqc3BiLkJpbmFyeU1lc3NhZ2V9ICovKHt9KTsKLQotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkgewotICAgICAgd3JpdGVyLndyaXRlTWVzc2FnZSgtMSwgZHVtbXlNZXNzYWdlLCBnb29nLm51bGxGdW5jdGlvbik7Ci0gICAgfSk7Ci0KLSAgICAvLyBXcml0aW5nIGludmFsaWQgZmllbGQgaW5kaWNlcyBzaG91bGQgYXNzZXJ0LgotICAgIHdyaXRlciA9IG5ldyBqc3BiLkJpbmFyeVdyaXRlcigpOwotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZVVpbnQ2NCgtMSwgMSk7fSk7Ci0KLSAgICAvLyBXcml0aW5nIG91dC1vZi1yYW5nZSBmaWVsZCB2YWx1ZXMgc2hvdWxkIGFzc2VydC4KLSAgICB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLQotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZUludDMyKDEsIC1JbmZpbml0eSk7fSk7Ci0gICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24oKSB7d3JpdGVyLndyaXRlSW50MzIoMSwgSW5maW5pdHkpO30pOwotCi0gICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24oKSB7d3JpdGVyLndyaXRlSW50NjQoMSwgLUluZmluaXR5KTt9KTsKLSAgICBhc3NlcnRGYWlscyhmdW5jdGlvbigpIHt3cml0ZXIud3JpdGVJbnQ2NCgxLCBJbmZpbml0eSk7fSk7Ci0KLSAgICBhc3NlcnRGYWlscyhmdW5jdGlvbigpIHt3cml0ZXIud3JpdGVVaW50MzIoMSwgLTEpO30pOwotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZVVpbnQzMigxLCBJbmZpbml0eSk7fSk7Ci0KLSAgICBhc3NlcnRGYWlscyhmdW5jdGlvbigpIHt3cml0ZXIud3JpdGVVaW50NjQoMSwgLTEpO30pOwotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZVVpbnQ2NCgxLCBJbmZpbml0eSk7fSk7Ci0KLSAgICBhc3NlcnRGYWlscyhmdW5jdGlvbigpIHt3cml0ZXIud3JpdGVTaW50MzIoMSwgLUluZmluaXR5KTt9KTsKLSAgICBhc3NlcnRGYWlscyhmdW5jdGlvbigpIHt3cml0ZXIud3JpdGVTaW50MzIoMSwgSW5maW5pdHkpO30pOwotCi0gICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24oKSB7d3JpdGVyLndyaXRlU2ludDY0KDEsIC1JbmZpbml0eSk7fSk7Ci0gICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24oKSB7d3JpdGVyLndyaXRlU2ludDY0KDEsIEluZmluaXR5KTt9KTsKLQotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZUZpeGVkMzIoMSwgLTEpO30pOwotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZUZpeGVkMzIoMSwgSW5maW5pdHkpO30pOwotCi0gICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24oKSB7d3JpdGVyLndyaXRlRml4ZWQ2NCgxLCAtMSk7fSk7Ci0gICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24oKSB7d3JpdGVyLndyaXRlRml4ZWQ2NCgxLCBJbmZpbml0eSk7fSk7Ci0KLSAgICBhc3NlcnRGYWlscyhmdW5jdGlvbigpIHt3cml0ZXIud3JpdGVTZml4ZWQzMigxLCAtSW5maW5pdHkpO30pOwotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZVNmaXhlZDMyKDEsIEluZmluaXR5KTt9KTsKLQotICAgIGFzc2VydEZhaWxzKGZ1bmN0aW9uKCkge3dyaXRlci53cml0ZVNmaXhlZDY0KDEsIC1JbmZpbml0eSk7fSk7Ci0gICAgYXNzZXJ0RmFpbHMoZnVuY3Rpb24oKSB7d3JpdGVyLndyaXRlU2ZpeGVkNjQoMSwgSW5maW5pdHkpO30pOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBCYXNpYyB0ZXN0IG9mIHJldHJpZXZpbmcgdGhlIHJlc3VsdCBhcyBhIFVpbnQ4QXJyYXkgYnVmZmVyCi0gICAqLwotICBpdCgndGVzdEdldFJlc3VsdEJ1ZmZlcicsIGZ1bmN0aW9uKCkgewotICAgIHZhciBleHBlY3RlZCA9ICcwODY0MTIwYjQ4NjU2YzZjNmYyMDc3NmY3MjZjNjQxYTAzMDEwMjAzMjBjODAxJzsKLQotICAgIHZhciB3cml0ZXIgPSBuZXcganNwYi5CaW5hcnlXcml0ZXIoKTsKLSAgICB3cml0ZXIud3JpdGVVaW50MzIoMSwgMTAwKTsKLSAgICB3cml0ZXIud3JpdGVTdHJpbmcoMiwgJ0hlbGxvIHdvcmxkJyk7Ci0gICAgd3JpdGVyLndyaXRlQnl0ZXMoMywgbmV3IFVpbnQ4QXJyYXkoWzEsIDIsIDNdKSk7Ci0gICAgd3JpdGVyLndyaXRlVWludDMyKDQsIDIwMCk7Ci0KLSAgICB2YXIgYnVmZmVyID0gd3JpdGVyLmdldFJlc3VsdEJ1ZmZlcigpOwotICAgIGFzc2VydEVxdWFscyhleHBlY3RlZCwgZ29vZy5jcnlwdC5ieXRlQXJyYXlUb0hleChidWZmZXIpKTsKLSAgfSk7Ci19KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2NvbW1vbmpzL2V4cG9ydC5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2NvbW1vbmpzL2V4cG9ydC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTNjZmJkNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9leHBvcnQuanMKKysrIC9kZXYvbnVsbApAQCAtMSwyMiArMCwwIEBACi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgRXhwb3J0IHN5bWJvbHMgbmVlZGVkIGJ5IGdlbmVyYXRlZCBjb2RlIGluIENvbW1vbkpTIHN0eWxlLgotICoKLSAqIFRoaXMgZWZmZWN0aXZlbHkgaXMgb3VyIGNhbm9uaWNhbCBsaXN0IG9mIHdoYXQgd2UgcHVibGljbHkgZXhwb3J0IGZyb20KLSAqIHRoZSBnb29nbGUtcHJvdG9idWYuanMgZmlsZSB0aGF0IHdlIGJ1aWxkIGF0IGRpc3RyaWJ1dGlvbiB0aW1lLgotICovCi0KLWdvb2cucmVxdWlyZSgnZ29vZy5vYmplY3QnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlSZWFkZXInKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlXcml0ZXInKTsKLWdvb2cucmVxdWlyZSgnanNwYi5FeHRlbnNpb25GaWVsZEluZm8nKTsKLWdvb2cucmVxdWlyZSgnanNwYi5NZXNzYWdlJyk7Ci0KLWV4cG9ydHMuTWVzc2FnZSA9IGpzcGIuTWVzc2FnZTsKLWV4cG9ydHMuQmluYXJ5UmVhZGVyID0ganNwYi5CaW5hcnlSZWFkZXI7Ci1leHBvcnRzLkJpbmFyeVdyaXRlciA9IGpzcGIuQmluYXJ5V3JpdGVyOwotZXhwb3J0cy5FeHRlbnNpb25GaWVsZEluZm8gPSBqc3BiLkV4dGVuc2lvbkZpZWxkSW5mbzsKLQotLy8gVGhlc2UgYXJlIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUgYnV0IHNob3VsZCBub3QgYmUgdXNlZCBkaXJlY3RseSBieSBjbGllbnRzLgotZXhwb3J0cy5leHBvcnRTeW1ib2wgPSBnb29nLmV4cG9ydFN5bWJvbDsKLWV4cG9ydHMuaW5oZXJpdHMgPSBnb29nLmluaGVyaXRzOwotZXhwb3J0cy5vYmplY3QgPSB7ZXh0ZW5kOiBnb29nLm9iamVjdC5leHRlbmR9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvZXhwb3J0X2Fzc2VydHMuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9leHBvcnRfYXNzZXJ0cy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIxOWQxMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9leHBvcnRfYXNzZXJ0cy5qcworKysgL2Rldi9udWxsCkBAIC0xLDM3ICswLDAgQEAKLS8qKgotICogQGZpbGVvdmVydmlldyBFeHBvcnRzIHN5bWJvbHMgbmVlZGVkIG9ubHkgYnkgdGVzdHMuCi0gKgotICogVGhpcyBmaWxlIGV4cG9ydHMgc2V2ZXJhbCBDbG9zdXJlIExpYnJhcnkgc3ltYm9scyB0aGF0IGFyZSBvbmx5Ci0gKiB1c2VkIGJ5IHRlc3RzLiAgSXQgaXMgdXNlZCB0byBnZW5lcmF0ZSBhIGZpbGUKLSAqIGNsb3N1cmVfYXNzZXJ0c19jb21tb25qcy5qcyB0aGF0IGlzIG9ubHkgdXNlZCBhdCB0ZXN0aW5nIHRpbWUuCi0gKi8KLQotZ29vZy5yZXF1aXJlKCdnb29nLnRlc3RpbmcuYXNzZXJ0cycpOwotCi12YXIgZ2xvYmFsID0gRnVuY3Rpb24oJ3JldHVybiB0aGlzJykoKTsKLQotLy8gQWxsIG9mIHRoZSBjbG9zdXJlICJhc3NlcnQiIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgYXQgdGhlIGdsb2JhbCBsZXZlbC4KLS8vCi0vLyBUaGUgR29vZ2xlIENsb3N1cmUgYXNzZXJ0IGZ1bmN0aW9ucyBzdGFydCB3aXRoIGFzc2VydCwgZWcuCi0vLyAgIGFzc2VydFRocm93cwotLy8gICBhc3NlcnROb3RUaHJvd3MKLS8vICAgYXNzZXJ0VHJ1ZQotLy8gICAuLi4KLS8vCi0vLyBUaGUgb25lIGV4Y2VwdGlvbiBpcyB0aGUgImZhaWwiIGZ1bmN0aW9uLgotZnVuY3Rpb24gc2hvdWxkRXhwb3J0KHN0cikgewotICByZXR1cm4gc3RyLmxhc3RJbmRleE9mKCdhc3NlcnQnKSA9PT0gMCB8fCBzdHIgPT0gJ2ZhaWwnOwotfQotCi1mb3IgKHZhciBrZXkgaW4gZ2xvYmFsKSB7Ci0gIGlmICgodHlwZW9mIGtleSA9PSAic3RyaW5nIikgJiYgZ2xvYmFsLmhhc093blByb3BlcnR5KGtleSkgJiYKLSAgICAgIHNob3VsZEV4cG9ydChrZXkpKSB7Ci0gICAgZXhwb3J0c1trZXldID0gZ2xvYmFsW2tleV07Ci0gIH0KLX0KLQotLy8gVGhlIENPTVBJTEVEIHZhcmlhYmxlIGlzIHNldCBieSBDbG9zdXJlIGNvbXBpbGVyIHRvICJ0cnVlIiB3aGVuIGl0IGNvbXBpbGVzCi0vLyBKYXZhU2NyaXB0LCBzbyBpbiBwcmFjdGljZSB0aGlzIGlzIGVxdWl2YWxlbnQgdG8gImV4cG9ydHMuQ09NUElMRUQgPSB0cnVlIi4KLS8vIFRoaXMgd2lsbCBkaXNhYmxlIHNvbWUgZGVidWdnaW5nIGZ1bmN0aW9uYWxpdHkgaW4gZGVidWcuanMuICBXZSBjb3VsZAotLy8gaW52ZXN0aWdhdGUgd2hldGhlciB0aGlzIGNhbi9zaG91bGQgYmUgZW5hYmxlZCBpbiBDb21tb25KUyBidWlsZHMuCi1leHBvcnRzLkNPTVBJTEVEID0gQ09NUElMRUQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2NvbW1vbmpzL2V4cG9ydF90ZXN0ZGVwcy5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2NvbW1vbmpzL2V4cG9ydF90ZXN0ZGVwcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTljNzdjYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9leHBvcnRfdGVzdGRlcHMuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxOCArMCwwIEBACi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgRXhwb3J0IHN5bWJvbHMgbmVlZGVkIGJ5IHRlc3RzIGluIENvbW1vbkpTIHN0eWxlLgotICoKLSAqIFRoaXMgZmlsZSBpcyBsaWtlIGV4cG9ydC5qcywgYnV0IGZvciBzeW1ib2xzIHRoYXQgYXJlIG9ubHkgdXNlZCBieSB0ZXN0cy4KLSAqIEhvd2V2ZXIgd2UgZXhjbHVkZSBhc3NlcnQgZnVuY3Rpb25zIGhlcmUsIGJlY2F1c2UgdGhleSBhcmUgZXhwb3J0ZWQgaW50bwotICogdGhlIGdsb2JhbCBuYW1lc3BhY2UsIHNvIHRob3NlIGFyZSBoYW5kbGVkIGFzIGEgc3BlY2lhbCBjYXNlIGluCi0gKiBleHBvcnRfYXNzZXJ0cy5qcy4KLSAqLwotCi1nb29nLnJlcXVpcmUoJ2dvb2cuY3J5cHQuYmFzZTY0Jyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuYXJpdGguSW50NjQnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5hcml0aC5VSW50NjQnKTsKLWdvb2cucmVxdWlyZSgnanNwYi5CaW5hcnlFbmNvZGVyJyk7Ci1nb29nLnJlcXVpcmUoJ2pzcGIuQmluYXJ5RGVjb2RlcicpOwotZ29vZy5yZXF1aXJlKCdqc3BiLnV0aWxzJyk7Ci0KLWV4cG9ydHMuZ29vZyA9IGdvb2c7Ci1leHBvcnRzLmpzcGIgPSBqc3BiOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvaW1wb3J0X3Rlc3QuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9pbXBvcnRfdGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmZhMzRmZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9pbXBvcnRfdGVzdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUZXN0IHN1aXRlIGlzIHdyaXR0ZW4gdXNpbmcgSmFzbWluZSAtLSBzZWUgaHR0cDovL2phc21pbmUuZ2l0aHViLmlvLwotCi0KLQotdmFyIGdvb2dsZVByb3RvYnVmID0gcmVxdWlyZSgnZ29vZ2xlLXByb3RvYnVmJyk7Ci12YXIgYXNzZXJ0cyA9IHJlcXVpcmUoJ2Nsb3N1cmVfYXNzZXJ0c19jb21tb25qcycpOwotdmFyIGdsb2JhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7Ci0KLS8vIEJyaW5nIGFzc2VydHMgaW50byB0aGUgZ2xvYmFsIG5hbWVzcGFjZS4KLWdvb2dsZVByb3RvYnVmLm9iamVjdC5leHRlbmQoZ2xvYmFsLCBhc3NlcnRzKTsKLWdvb2dsZVByb3RvYnVmLmV4cG9ydFN5bWJvbCgnanNwYi5NZXNzYWdlJywgZ29vZ2xlUHJvdG9idWYuTWVzc2FnZSwgZ2xvYmFsKTsKLQotdmFyIHRlc3Q3X3BiID0gcmVxdWlyZSgnLi90ZXN0Ny90ZXN0N19wYicpOwotZ29vZ2xlUHJvdG9idWYuZXhwb3J0U3ltYm9sKCdwcm90by5qc3BiLnRlc3QuZnJhbWluZy5GcmFtaW5nTWVzc2FnZScsIHRlc3Q3X3BiLkZyYW1pbmdNZXNzYWdlLCBnbG9iYWwpOwotCi1kZXNjcmliZSgnSW1wb3J0IHRlc3Qgc3VpdGUnLCBmdW5jdGlvbigpIHsKLSAgaXQoJ3Rlc3RJbXBvcnRlZE1lc3NhZ2UnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgZnJhbWluZzEgPSBuZXcgcHJvdG8uanNwYi50ZXN0LmZyYW1pbmcuRnJhbWluZ01lc3NhZ2UoW10pOwotICAgIHZhciBmcmFtaW5nMiA9IG5ldyBwcm90by5qc3BiLnRlc3QuZnJhbWluZy5GcmFtaW5nTWVzc2FnZShbXSk7Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKGZyYW1pbmcxLnRvT2JqZWN0KCksIGZyYW1pbmcyLnRvT2JqZWN0KCkpOwotICB9KTsKLX0pOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvamFzbWluZS5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvamFzbWluZS5qc29uCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NjZiOGVkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2NvbW1vbmpzL2phc21pbmUuanNvbgorKysgL2Rldi9udWxsCkBAIC0xLDkgKzAsMCBAQAotewotICAgICJzcGVjX2RpciI6ICIiLAotICAgICJzcGVjX2ZpbGVzIjogWwotICAgICAgICAiKl90ZXN0LmpzIiwKLSAgICAgICAgImJpbmFyeS9wcm90b190ZXN0LmpzIgotICAgIF0sCi0gICAgImhlbHBlcnMiOiBbCi0gICAgXQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvcmV3cml0ZV90ZXN0c19mb3JfY29tbW9uanMuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9yZXdyaXRlX3Rlc3RzX2Zvcl9jb21tb25qcy5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjZkOTBkMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy9yZXdyaXRlX3Rlc3RzX2Zvcl9jb21tb25qcy5qcworKysgL2Rldi9udWxsCkBAIC0xLDk3ICswLDAgQEAKLS8qKgotICogQGZpbGVvdmVydmlldyBVdGlsaXR5IHRvIHRyYW5zbGF0ZSB0ZXN0IGZpbGVzIHRvIENvbW1vbkpTIGltcG9ydHMuCi0gKgotICogVGhpcyBpcyBhIHNvbWV3aGF0IGhhY2t5IHRvb2wgZGVzaWduZWQgdG8gZG8gb25lIHZlcnkgc3BlY2lmaWMgdGhpbmcuCi0gKiBBbGwgb2YgdGhlIHRlc3QgZmlsZXMgaW4gKl90ZXN0LmpzIGFyZSB3cml0dGVuIHdpdGggQ2xvc3VyZS1zdHlsZQotICogaW1wb3J0cyAoZ29vZy5yZXF1aXJlKCkpLiAgVGhpcyB3b3JrcyBncmVhdCBmb3IgcnVubmluZyB0aGUgdGVzdHMKLSAqIGFnYWluc3QgQ2xvc3VyZS1zdHlsZSBnZW5lcmF0ZWQgY29kZSwgYnV0IHdlIGFsc28gd2FudCB0byBydW4gdGhlCi0gKiB0ZXN0cyBhZ2FpbnN0IENvbW1vbkpTLXN0eWxlIGdlbmVyYXRlZCBjb2RlIHdpdGhvdXQgaGF2aW5nIHRvIGZvcmsKLSAqIHRoZSB0ZXN0cy4KLSAqCi0gKiBDbG9zdXJlLXN0eWxlIGltcG9ydHMgaW1wb3J0IGVhY2ggaW5kaXZpZHVhbCB0eXBlIGJ5IG5hbWUuICBUaGlzIGlzCi0gKiB2ZXJ5IGRpZmZlcmVudCB0aGFuIENvbW1vbkpTIGltcG9ydHMgd2hpY2ggYXJlIGJ5IGZpbGUuICBTbyB3ZSBwdXQKLSAqIHNwZWNpYWwgY29tbWVudHMgaW4gdGhlc2UgdGVzdHMgbGlrZToKLSAqCi0gKiAvLyBDb21tb25KUy1Mb2FkRnJvbUZpbGU6IHRlc3RfcGIKLSAqIGdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uJyk7Ci0gKiBnb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5Db21wbGV4Jyk7Ci0gKiBnb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5EZWZhdWx0VmFsdWVzJyk7Ci0gKgotICogVGhpcyBzY3JpcHQgcGFyc2VzIHRoYXQgc3BlY2lhbCBjb21tZW50IGFuZCB1c2VzIGl0IHRvIGdlbmVyYXRlIHByb3BlcgotICogQ29tbW9uSlMgcmVxdWlyZSgpIHN0YXRlbWVudHMgc28gdGhhdCB0aGUgdGVzdHMgY2FuIHJ1biBhbmQgcGFzcyB1c2luZwotICogQ29tbW9uSlMgaW1wb3J0cy4gIFRoZSBzY3JpcHQgd2lsbCBjaGFuZ2UgdGhlIGFib3ZlIHN0YXRlbWVudHMgaW50bzoKLSAqCi0gKiAgIHZhciB0ZXN0X3BiID0gcmVxdWlyZSgndGVzdF9wYicpOwotICogICBnb29nbGVQcm90b2J1Zi5leHBvcnRTeW1ib2woJ3Byb3RvLmpzcGIudGVzdC5DbG9uZUV4dGVuc2lvbicsIHRlc3RfcGIuQ2xvbmVFeHRlbnNpb24sIGdsb2JhbCk7Ci0gKiAgIGdvb2dsZVByb3RvYnVmLmV4cG9ydFN5bWJvbCgncHJvdG8uanNwYi50ZXN0LkNvbXBsZXgnLCB0ZXN0X3BiLkNvbXBsZXgsIGdsb2JhbCk7Ci0gKiAgIGdvb2dsZVByb3RvYnVmLmV4cG9ydFN5bWJvbCgncHJvdG8uanNwYi50ZXN0LkRlZmF1bHRWYWx1ZXMnLCB0ZXN0X3BiLkRlZmF1bHRWYWx1ZXMsIGdsb2JhbCk7Ci0gKgotICogKFRoZSAiZXhwb3J0U3ltYm9sIiBmdW5jdGlvbiB3aWxsIGRlZmluZSB0aGUgZ2l2ZW4gbmFtZXMgaW4gdGhlIGdsb2JhbAotICogbmFtZXNwYWNlLCB0YWtpbmcgY2FyZSBub3QgdG8gb3ZlcndyaXRlIGFueSBwcmV2aW91cyB2YWx1ZSBmb3IKLSAqICJwcm90by5qc3BiLnRlc3QiKS4KLSAqLwotCi12YXIgbGluZVJlYWRlciA9IHJlcXVpcmUoJ3JlYWRsaW5lJykuY3JlYXRlSW50ZXJmYWNlKHsKLSAgaW5wdXQ6IHByb2Nlc3Muc3RkaW4sCi0gIG91dHB1dDogcHJvY2Vzcy5zdGRvdXQKLX0pOwotCi1mdW5jdGlvbiB0cnlTdHJpcFByZWZpeChzdHIsIHByZWZpeCkgewotICBpZiAoc3RyLmxhc3RJbmRleE9mKHByZWZpeCkgIT09IDApIHsKLSAgICB0aHJvdyAiU3RyaW5nOiAiICsgc3RyICsgIiBkaWRuJ3Qgc3RhcnQgd2l0aDogIiArIHByZWZpeDsKLSAgfQotICByZXR1cm4gc3RyLnN1YnN0cihwcmVmaXgubGVuZ3RoKTsKLX0KLQotZnVuY3Rpb24gY2FtZWxDYXNlKHN0cikgewotICB2YXIgcmV0ID0gJyc7Ci0gIHZhciB1Y2FzZU5leHQgPSBmYWxzZTsKLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBzdHIubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoc3RyW2ldID09ICctJykgewotICAgICAgdWNhc2VOZXh0ID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKHVjYXNlTmV4dCkgewotICAgICAgcmV0ICs9IHN0cltpXS50b1VwcGVyQ2FzZSgpOwotICAgICAgdWNhc2VOZXh0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldCArPSBzdHJbaV07Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZhciBtb2R1bGUgPSBudWxsOwotdmFyIHBrZyA9IG51bGw7Ci0KLS8vIEhlYWRlcjogZ29lcyBpbiBldmVyeSBmaWxlIGF0IHRoZSB0b3AuCi1jb25zb2xlLmxvZygidmFyIGdsb2JhbCA9IEZ1bmN0aW9uKCdyZXR1cm4gdGhpcycpKCk7Iik7Ci1jb25zb2xlLmxvZygidmFyIGdvb2dsZVByb3RvYnVmID0gcmVxdWlyZSgnZ29vZ2xlLXByb3RvYnVmJyk7Iik7Ci1jb25zb2xlLmxvZygidmFyIHRlc3RkZXBzID0gcmVxdWlyZSgndGVzdGRlcHNfY29tbW9uanMnKTsiKTsKLWNvbnNvbGUubG9nKCJnbG9iYWwuZ29vZyA9IHRlc3RkZXBzLmdvb2c7Iik7Ci1jb25zb2xlLmxvZygiZ2xvYmFsLmpzcGIgPSB0ZXN0ZGVwcy5qc3BiOyIpOwotY29uc29sZS5sb2coInZhciBhc3NlcnRzID0gcmVxdWlyZSgnY2xvc3VyZV9hc3NlcnRzX2NvbW1vbmpzJyk7Iik7Ci1jb25zb2xlLmxvZygiIik7Ci1jb25zb2xlLmxvZygiLy8gQnJpbmcgYXNzZXJ0cyBpbnRvIHRoZSBnbG9iYWwgbmFtZXNwYWNlLiIpOwotY29uc29sZS5sb2coImdvb2dsZVByb3RvYnVmLm9iamVjdC5leHRlbmQoZ2xvYmFsLCBhc3NlcnRzKTsiKTsKLQotbGluZVJlYWRlci5vbignbGluZScsIGZ1bmN0aW9uKGxpbmUpIHsKLSAgdmFyIGlzUmVxdWlyZSA9IGxpbmUubWF0Y2goL2dvb2dcLnJlcXVpcmVcKCcoW14nXSopJ1wpLyk7Ci0gIHZhciBpc0xvYWRGcm9tRmlsZSA9IGxpbmUubWF0Y2goL0NvbW1vbkpTLUxvYWRGcm9tRmlsZTogKFxTKikgKC4qKS8pOwotICB2YXIgaXNTZXRUZXN0T25seSA9IGxpbmUubWF0Y2goL2dvb2cuc2V0VGVzdE9ubHkoKS8pOwotICBpZiAoaXNSZXF1aXJlKSB7Ci0gICAgaWYgKG1vZHVsZSkgeyAgLy8gU2tpcCBnb29nLnJlcXVpcmUoKSBsaW5lcyBiZWZvcmUgdGhlIGZpcnN0IGRpcmVjdGl2ZS4KLSAgICAgIHZhciBmdWxsU3ltID0gaXNSZXF1aXJlWzFdOwotICAgICAgdmFyIHN5bSA9IHRyeVN0cmlwUHJlZml4KGZ1bGxTeW0sIHBrZyk7Ci0gICAgICBjb25zb2xlLmxvZygiZ29vZ2xlUHJvdG9idWYuZXhwb3J0U3ltYm9sKCciICsgZnVsbFN5bSArICInLCAiICsgbW9kdWxlICsgc3ltICsgJywgZ2xvYmFsKTsnKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoaXNMb2FkRnJvbUZpbGUpIHsKLSAgICB2YXIgbW9kdWxlX3BhdGggPSBpc0xvYWRGcm9tRmlsZVsxXS5zcGxpdCgnLycpOwotICAgIG1vZHVsZSA9IGNhbWVsQ2FzZShtb2R1bGVfcGF0aFttb2R1bGVfcGF0aC5sZW5ndGggLSAxXSk7Ci0gICAgcGtnID0gaXNMb2FkRnJvbUZpbGVbMl07Ci0KLSAgICBpZiAobW9kdWxlICE9ICJnb29nbGVQcm90b2J1ZiIpIHsgIC8vIFdlIHVuY29uZGl0aW9uYWxseSByZXF1aXJlIHRoaXMgaW4gdGhlIGhlYWRlci4KLSAgICAgIGNvbnNvbGUubG9nKCJ2YXIgIiArIG1vZHVsZSArICIgPSByZXF1aXJlKCcuLyIgKyBpc0xvYWRGcm9tRmlsZVsxXSArICInKTsiKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoIWlzU2V0VGVzdE9ubHkpIHsgIC8vIFJlbW92ZSBnb29nLnNldFRlc3RPbmx5KCkgbGluZXMuCi0gICAgY29uc29sZS5sb2cobGluZSk7Ci0gIH0KLX0pOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvdGVzdDYvdGVzdDYucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy90ZXN0Ni90ZXN0Ni5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTA2MDkyNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9jb21tb25qcy90ZXN0Ni90ZXN0Ni5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTYgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8zIjsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLmFwcHMuanNwYi5wcm90byI7Ci1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci0KLXBhY2thZ2UganNwYi50ZXN0LmltcG9ydGluZzsKLQotbWVzc2FnZSBJbXBvcnRlZE1lc3NhZ2UgewotICBzdHJpbmcgc3RyaW5nX3ZhbHVlID0gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2NvbW1vbmpzL3Rlc3Q3L3Rlc3Q3LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvdGVzdDcvdGVzdDcucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1NTc0YTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvY29tbW9uanMvdGVzdDcvdGVzdDcucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotc3ludGF4ID0gInByb3RvMyI7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5hcHBzLmpzcGIucHJvdG8iOwotb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOwotCi1wYWNrYWdlIGpzcGIudGVzdC5mcmFtaW5nOwotCi1pbXBvcnQgInRlc3Q2L3Rlc3Q2LnByb3RvIjsKLQotbWVzc2FnZSBGcmFtaW5nTWVzc2FnZSB7Ci0gIGpzcGIudGVzdC5pbXBvcnRpbmcuSW1wb3J0ZWRNZXNzYWdlIGltcG9ydGVkX21lc3NhZ2UgPSAxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvZGF0YS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2RhdGEucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc0YThhOTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvZGF0YS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDUxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IG13ckBnb29nbGUuY29tIChNYXJrIFJhd2xpbmcpCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUuYXBwcy5qc3BiLnByb3RvIjsKLW9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKLQotcGFja2FnZSBqc3BiLnRlc3Q7Ci0KLS8vIGxlZ2FjeSBkYXRhLCBtdXN0IGJlIG5lc3RlZAotbWVzc2FnZSBkYXRhIHsKLSAgbWVzc2FnZSBOZXN0ZWREYXRhIHsKLSAgICByZXF1aXJlZCBzdHJpbmcgc3RyID0gMTsKLSAgfQotfQotCi0vLyBuZXcgZGF0YSwgZG9lcyBub3QgcmVxdWlyZSBuZXN0aW5nCi1tZXNzYWdlIFVubmVzdGVkRGF0YSB7Ci0gIHJlcXVpcmVkIHN0cmluZyBzdHIgPSAxOwotfQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9kZWJ1Zy5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2RlYnVnLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNzAxYTA5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2RlYnVnLmpzCisrKyAvZGV2L251bGwKQEAgLTEsMTQwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vKioKLSAqIEBmaWxlb3ZlcnZpZXcgVXRpbGl0aWVzIHRvIGRlYnVnIEpTUEIgYmFzZWQgcHJvdG8gb2JqZWN0cy4KLSAqLwotCi1nb29nLnByb3ZpZGUoJ2pzcGIuZGVidWcnKTsKLQotZ29vZy5yZXF1aXJlKCdnb29nLmFycmF5Jyk7Ci1nb29nLnJlcXVpcmUoJ2dvb2cuYXNzZXJ0cycpOwotZ29vZy5yZXF1aXJlKCdnb29nLm9iamVjdCcpOwotZ29vZy5yZXF1aXJlKCdqc3BiLk1lc3NhZ2UnKTsKLQotCi0vKioKLSAqIFR1cm5zIGEgcHJvdG8gaW50byBhIGh1bWFuIHJlYWRhYmxlIG9iamVjdCB0aGF0IGNhbiBpLmUuIGJlIHdyaXR0ZW4gdG8gdGhlCi0gKiBjb25zb2xlOiB7QGNvZGUgY29uc29sZS5sb2coanNwYi5kZWJ1Zy5kdW1wKG15UHJvdG8pKX0uCi0gKiBUaGlzIGZ1bmN0aW9uIG1ha2VzIGEgYmVzdCBlZmZvcnQgYW5kIG1heSBub3Qgd29yayBpbiBhbGwgY2FzZXMuIEl0IHdpbGwgbm90Ci0gKiB3b3JrIGluIG9iZnVzY2F0ZWQgYW5kIG9yIG9wdGltaXplZCBjb2RlLgotICogVXNlIHRoaXMgaW4gZW52aXJvbm1lbnRzIHdoZXJlIHtAc2VlIGpzcGIuTWVzc2FnZS5wcm90b3R5cGUudG9PYmplY3R9IGlzCi0gKiBub3QgYXZhaWxhYmxlIGZvciBjb2RlIHNpemUgcmVhc29ucy4KLSAqIEBwYXJhbSB7anNwYi5NZXNzYWdlfSBtZXNzYWdlIEEganNwYi5NZXNzYWdlLgotICogQHJldHVybiB7T2JqZWN0fQotICovCi1qc3BiLmRlYnVnLmR1bXAgPSBmdW5jdGlvbihtZXNzYWdlKSB7Ci0gIGlmICghZ29vZy5ERUJVRykgewotICAgIHJldHVybiBudWxsOwotICB9Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQobWVzc2FnZSBpbnN0YW5jZW9mIGpzcGIuTWVzc2FnZSwKLSAgICAgICdqc3BiLk1lc3NhZ2UgaW5zdGFuY2UgZXhwZWN0ZWQnKTsKLSAgLyoqIEB0eXBlIHtPYmplY3R9ICovCi0gIHZhciBvYmplY3QgPSBtZXNzYWdlOwotICBnb29nLmFzc2VydHMuYXNzZXJ0KG9iamVjdFsnZ2V0RXh0ZW5zaW9uJ10sCi0gICAgICAnT25seSB1bm9iZnVzY2F0ZWQgYW5kIHVub3B0aW1pemVkIGNvbXBpbGF0aW9uIG1vZGVzIHN1cHBvcnRlZC4nKTsKLSAgcmV0dXJuIC8qKiBAdHlwZSB7T2JqZWN0fSAqLyAoanNwYi5kZWJ1Zy5kdW1wXyhtZXNzYWdlKSk7Ci19OwotCi0KLS8qKgotICogUmVjdXJzaXZlbHkgaW50cm9zcGVjdHMgYSBtZXNzYWdlIGFuZCB0aGUgdmFsdWVzIGl0cyBnZXR0ZXJzIHJldHVybiB0bwotICogbWFrZSBhIGJlc3QgZWZmb3J0IGluIGNyZWF0aW5nIGEgaHVtYW4gcmVhZGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlCi0gKiBtZXNzYWdlLgotICogQHBhcmFtIHs/fSB0aGluZyBBIGpzcGIuTWVzc2FnZSwgQXJyYXkgb3IgcHJpbWl0aXZlIHR5cGUgdG8gZHVtcC4KLSAqIEByZXR1cm4geyp9Ci0gKiBAcHJpdmF0ZQotICovCi1qc3BiLmRlYnVnLmR1bXBfID0gZnVuY3Rpb24odGhpbmcpIHsKLSAgdmFyIHR5cGUgPSBnb29nLnR5cGVPZih0aGluZyk7Ci0gIGlmICh0eXBlID09ICdudW1iZXInIHx8IHR5cGUgPT0gJ3N0cmluZycgfHwgdHlwZSA9PSAnYm9vbGVhbicgfHwKLSAgICAgIHR5cGUgPT0gJ251bGwnIHx8IHR5cGUgPT0gJ3VuZGVmaW5lZCcpIHsKLSAgICByZXR1cm4gdGhpbmc7Ci0gIH0KLSAgaWYgKHR5cGUgPT0gJ2FycmF5JykgewotICAgIGdvb2cuYXNzZXJ0cy5hc3NlcnRBcnJheSh0aGluZyk7Ci0gICAgcmV0dXJuIGdvb2cuYXJyYXkubWFwKHRoaW5nLCBqc3BiLmRlYnVnLmR1bXBfKTsKLSAgfQotICB2YXIgbWVzc2FnZSA9IHRoaW5nOyAgLy8gQ29weSBiZWNhdXNlIHdlIGRvbid0IHdhbnQgdHlwZSBpbmZlcmVuY2Ugb24gdGhpbmcuCi0gIGdvb2cuYXNzZXJ0cy5hc3NlcnQobWVzc2FnZSBpbnN0YW5jZW9mIGpzcGIuTWVzc2FnZSwKLSAgICAgICdPbmx5IG1lc3NhZ2VzIGV4cGVjdGVkOiAnICsgdGhpbmcpOwotICB2YXIgY3RvciA9IG1lc3NhZ2UuY29uc3RydWN0b3I7Ci0gIHZhciBtZXNzYWdlTmFtZSA9IGN0b3IubmFtZSB8fCBjdG9yLmRpc3BsYXlOYW1lOwotICB2YXIgb2JqZWN0ID0gewotICAgICckbmFtZSc6IG1lc3NhZ2VOYW1lCi0gIH07Ci0gIGZvciAodmFyIG5hbWUgaW4gY3Rvci5wcm90b3R5cGUpIHsKLSAgICB2YXIgbWF0Y2ggPSAvXmdldChbQS1aXVx3KikvLmV4ZWMobmFtZSk7Ci0gICAgaWYgKG1hdGNoICYmIG5hbWUgIT0gJ2dldEV4dGVuc2lvbicgJiYKLSAgICAgICAgbmFtZSAhPSAnZ2V0SnNQYk1lc3NhZ2VJZCcpIHsKLSAgICAgIHZhciB2YWwgPSB0aGluZ1tuYW1lXSgpOwotICAgICAgaWYgKHZhbCAhPSBudWxsKSB7Ci0gICAgICAgIG9iamVjdFtqc3BiLmRlYnVnLmZvcm1hdEZpZWxkTmFtZV8obWF0Y2hbMV0pXSA9IGpzcGIuZGVidWcuZHVtcF8odmFsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgaWYgKENPTVBJTEVEICYmIHRoaW5nWydleHRlbnNpb25PYmplY3RfJ10pIHsKLSAgICBvYmplY3RbJyRleHRlbnNpb25zJ10gPSAnUmVjdXJzaXZlIGR1bXBpbmcgb2YgZXh0ZW5zaW9ucyBub3Qgc3VwcG9ydGVkICcgKwotICAgICAgICAnaW4gY29tcGlsZWQgY29kZS4gU3dpdGNoIHRvIHVuY29tcGlsZWQgb3IgZHVtcCBleHRlbnNpb24gb2JqZWN0ICcgKwotICAgICAgICAnZGlyZWN0bHknOwotICAgIHJldHVybiBvYmplY3Q7Ci0gIH0KLSAgdmFyIGV4dGVuc2lvbnNPYmplY3Q7Ci0gIGZvciAodmFyIGlkIGluIGN0b3JbJ2V4dGVuc2lvbnMnXSkgewotICAgIGlmICgvXlxkKyQvLnRlc3QoaWQpKSB7Ci0gICAgICB2YXIgZXh0ID0gY3RvclsnZXh0ZW5zaW9ucyddW2lkXTsKLSAgICAgIHZhciBleHRWYWwgPSB0aGluZy5nZXRFeHRlbnNpb24oZXh0KTsKLSAgICAgIHZhciBmaWVsZE5hbWUgPSBnb29nLm9iamVjdC5nZXRLZXlzKGV4dC5maWVsZE5hbWUpWzBdOwotICAgICAgaWYgKGV4dFZhbCAhPSBudWxsKSB7Ci0gICAgICAgIGlmICghZXh0ZW5zaW9uc09iamVjdCkgewotICAgICAgICAgIGV4dGVuc2lvbnNPYmplY3QgPSBvYmplY3RbJyRleHRlbnNpb25zJ10gPSB7fTsKLSAgICAgICAgfQotICAgICAgICBleHRlbnNpb25zT2JqZWN0W2pzcGIuZGVidWcuZm9ybWF0RmllbGROYW1lXyhmaWVsZE5hbWUpXSA9Ci0gICAgICAgICAgICBqc3BiLmRlYnVnLmR1bXBfKGV4dFZhbCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBvYmplY3Q7Ci19OwotCi0KLS8qKgotICogRm9ybWF0cyBhIGZpZWxkIG5hbWUgZm9yIG91dHB1dCBhcyBjYW1lbENhc2UuCi0gKgotICogQHBhcmFtIHtzdHJpbmd9IG5hbWUgTmFtZSBvZiB0aGUgZmllbGQuCi0gKiBAcmV0dXJuIHtzdHJpbmd9Ci0gKiBAcHJpdmF0ZQotICovCi1qc3BiLmRlYnVnLmZvcm1hdEZpZWxkTmFtZV8gPSBmdW5jdGlvbihuYW1lKSB7Ci0gIC8vIE5hbWUgbWF5IGJlIGluIFRpdGxlQ2FzZS4KLSAgcmV0dXJuIG5hbWUucmVwbGFjZSgvXltBLVpdLywgZnVuY3Rpb24oYykgewotICAgIHJldHVybiBjLnRvTG93ZXJDYXNlKCk7Ci0gIH0pOwotfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2RlYnVnX3Rlc3QuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9kZWJ1Z190ZXN0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWNiZjg5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2RlYnVnX3Rlc3QuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMDUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLWdvb2cuc2V0VGVzdE9ubHkoKTsKLQotZ29vZy5yZXF1aXJlKCdnb29nLnRlc3RpbmcuYXNzZXJ0cycpOwotCi0vLyBDb21tb25KUy1Mb2FkRnJvbUZpbGU6IGdvb2dsZS1wcm90b2J1ZgotZ29vZy5yZXF1aXJlKCdqc3BiLmRlYnVnJyk7Ci0KLS8vIENvbW1vbkpTLUxvYWRGcm9tRmlsZTogdGVzdF9wYgotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucycpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuSXNFeHRlbnNpb24nKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LlNpbXBsZTEnKTsKLQotCi0KLWRlc2NyaWJlKCdkZWJ1Z1Rlc3QnLCBmdW5jdGlvbigpIHsKLSAgaXQoJ3Rlc3RTaW1wbGUxJywgZnVuY3Rpb24oKSB7Ci0gICAgaWYgKENPTVBJTEVEKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKCk7Ci0gICAgbWVzc2FnZS5zZXRBU3RyaW5nKCdmb28nKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoewotICAgICAgJG5hbWU6ICdwcm90by5qc3BiLnRlc3QuU2ltcGxlMScsCi0gICAgICAnYVN0cmluZyc6ICdmb28nLAotICAgICAgJ2FSZXBlYXRlZFN0cmluZ0xpc3QnOiBbXQotICAgIH0sIGpzcGIuZGVidWcuZHVtcChtZXNzYWdlKSk7Ci0KLSAgICBtZXNzYWdlLnNldEFCb29sZWFuKHRydWUpOwotICAgIG1lc3NhZ2Uuc2V0QVJlcGVhdGVkU3RyaW5nTGlzdChbJzEnLCAnMiddKTsKLQotICAgIGFzc2VydE9iamVjdEVxdWFscyh7Ci0gICAgICAkbmFtZTogJ3Byb3RvLmpzcGIudGVzdC5TaW1wbGUxJywKLSAgICAgICdhU3RyaW5nJzogJ2ZvbycsCi0gICAgICAnYVJlcGVhdGVkU3RyaW5nTGlzdCc6IFsnMScsICcyJ10sCi0gICAgICAnYUJvb2xlYW4nOiB0cnVlCi0gICAgfSwganNwYi5kZWJ1Zy5kdW1wKG1lc3NhZ2UpKTsKLQotICAgIG1lc3NhZ2Uuc2V0QVN0cmluZyh1bmRlZmluZWQpOwotCi0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKHsKLSAgICAgICRuYW1lOiAncHJvdG8uanNwYi50ZXN0LlNpbXBsZTEnLAotICAgICAgJ2FSZXBlYXRlZFN0cmluZ0xpc3QnOiBbJzEnLCAnMiddLAotICAgICAgJ2FCb29sZWFuJzogdHJ1ZQotICAgIH0sIGpzcGIuZGVidWcuZHVtcChtZXNzYWdlKSk7Ci0gIH0pOwotCi0KLSAgaXQoJ3Rlc3RFeHRlbnNpb25zJywgZnVuY3Rpb24oKSB7Ci0gICAgaWYgKENPTVBJTEVEKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHZhciBleHRlbnNpb24gPSBuZXcgcHJvdG8uanNwYi50ZXN0LklzRXh0ZW5zaW9uKCk7Ci0gICAgZXh0ZW5zaW9uLnNldEV4dDEoJ2V4dDFmaWVsZCcpOwotICAgIHZhciBleHRlbmRhYmxlID0gbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKCk7Ci0gICAgZXh0ZW5kYWJsZS5zZXRTdHIxKCd2MScpOwotICAgIGV4dGVuZGFibGUuc2V0U3RyMigndjInKTsKLSAgICBleHRlbmRhYmxlLnNldFN0cjMoJ3YzJyk7Ci0gICAgZXh0ZW5kYWJsZS5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LklzRXh0ZW5zaW9uLmV4dEZpZWxkLCBleHRlbnNpb24pOwotCi0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKHsKLSAgICAgICckbmFtZSc6ICdwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucycsCi0gICAgICAnc3RyMSc6ICd2MScsCi0gICAgICAnc3RyMic6ICd2MicsCi0gICAgICAnc3RyMyc6ICd2MycsCi0gICAgICAnJGV4dGVuc2lvbnMnOiB7Ci0gICAgICAgICdleHRGaWVsZCc6IHsKLSAgICAgICAgICAnJG5hbWUnOiAncHJvdG8uanNwYi50ZXN0LklzRXh0ZW5zaW9uJywKLSAgICAgICAgICAnZXh0MSc6ICdleHQxZmllbGQnCi0gICAgICAgIH0sCi0gICAgICAgICdyZXBlYXRlZFNpbXBsZUxpc3QnOiBbXQotICAgICAgfQotICAgIH0sIGpzcGIuZGVidWcuZHVtcChleHRlbmRhYmxlKSk7Ci0gIH0pOwotCi19KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL2d1bHBmaWxlLmpzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvZ3VscGZpbGUuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1MjIwMTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvZ3VscGZpbGUuanMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTAgKzAsMCBAQAotdmFyIGd1bHAgPSByZXF1aXJlKCdndWxwJyk7Ci12YXIgZXhlY0ZpbGUgPSByZXF1aXJlKCdjaGlsZF9wcm9jZXNzJykuZXhlY0ZpbGU7Ci12YXIgZ2xvYiA9IHJlcXVpcmUoJ2dsb2InKTsKLQotZnVuY3Rpb24gZXhlYyhjb21tYW5kLCBjYikgewotICBleGVjRmlsZSgnc2gnLCBbJy1jJywgY29tbWFuZF0sIGNiKTsKLX0KLQotdmFyIHByb3RvYyA9IHByb2Nlc3MuZW52LlBST1RPQyB8fCAnLi4vc3JjL3Byb3RvYyc7Ci0KLWd1bHAudGFzaygnZ2VucHJvdG9fY2xvc3VyZScsIGZ1bmN0aW9uIChjYikgewotICBleGVjKHByb3RvYyArICcgLS1qc19vdXQ9bGlicmFyeT10ZXN0cHJvdG9fbGlicyxiaW5hcnk6LiAgLUkgLi4vc3JjIC1JIC4gKi5wcm90byAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8nLAotICAgICAgIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgY29uc29sZS5sb2coc3Rkb3V0KTsKLSAgICBjb25zb2xlLmxvZyhzdGRlcnIpOwotICAgIGNiKGVycik7Ci0gIH0pOwotfSk7Ci0KLWd1bHAudGFzaygnZ2VucHJvdG9fY29tbW9uanMnLCBmdW5jdGlvbiAoY2IpIHsKLSAgZXhlYygnbWtkaXIgLXAgY29tbW9uanNfb3V0ICYmICcgKyBwcm90b2MgKyAnIC0tanNfb3V0PWltcG9ydF9zdHlsZT1jb21tb25qcyxiaW5hcnk6Y29tbW9uanNfb3V0IC1JIC4uL3NyYyAtSSBjb21tb25qcyAtSSAuICoucHJvdG8gY29tbW9uanMvdGVzdCovKi5wcm90byAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8nLAotICAgICAgIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgY29uc29sZS5sb2coc3Rkb3V0KTsKLSAgICBjb25zb2xlLmxvZyhzdGRlcnIpOwotICAgIGNiKGVycik7Ci0gIH0pOwotfSk7Ci0KLWd1bHAudGFzaygnZGlzdCcsIGZ1bmN0aW9uIChjYikgewotICAvLyBUT0RPKGhhYmVybWFuKTogbWluaWZ5IHRoaXMgbW9yZSBhZ2dyZXNzaXZlbHkuCi0gIC8vIFdpbGwgcmVxdWlyZSBwcm9wZXIgZXh0ZXJucy9leHBvcnRzLgotICBleGVjKCcuL25vZGVfbW9kdWxlcy9nb29nbGUtY2xvc3VyZS1saWJyYXJ5L2Nsb3N1cmUvYmluL2NhbGNkZXBzLnB5IC1pIG1lc3NhZ2UuanMgLWkgYmluYXJ5L3JlYWRlci5qcyAtaSBiaW5hcnkvd3JpdGVyLmpzIC1pIGNvbW1vbmpzL2V4cG9ydC5qcyAtcCAuIC1wIG5vZGVfbW9kdWxlcy9nb29nbGUtY2xvc3VyZS1saWJyYXJ5L2Nsb3N1cmUgLW8gY29tcGlsZWQgLS1jb21waWxlcl9qYXIgbm9kZV9tb2R1bGVzL2dvb2dsZS1jbG9zdXJlLWNvbXBpbGVyL2NvbXBpbGVyLmphciA+IGdvb2dsZS1wcm90b2J1Zi5qcycsCi0gICAgICAgZnVuY3Rpb24gKGVyciwgc3Rkb3V0LCBzdGRlcnIpIHsKLSAgICBjb25zb2xlLmxvZyhzdGRvdXQpOwotICAgIGNvbnNvbGUubG9nKHN0ZGVycik7Ci0gICAgY2IoZXJyKTsKLSAgfSk7Ci19KTsKLQotZ3VscC50YXNrKCdjb21tb25qc19hc3NlcnRzJywgZnVuY3Rpb24gKGNiKSB7Ci0gIGV4ZWMoJ21rZGlyIC1wIGNvbW1vbmpzX291dC90ZXN0X25vZGVfbW9kdWxlcyAmJiAuL25vZGVfbW9kdWxlcy9nb29nbGUtY2xvc3VyZS1saWJyYXJ5L2Nsb3N1cmUvYmluL2NhbGNkZXBzLnB5IC1pIGNvbW1vbmpzL2V4cG9ydF9hc3NlcnRzLmpzIC1wIC4gLXAgbm9kZV9tb2R1bGVzL2dvb2dsZS1jbG9zdXJlLWxpYnJhcnkvY2xvc3VyZSAtbyBjb21waWxlZCAtLWNvbXBpbGVyX2phciBub2RlX21vZHVsZXMvZ29vZ2xlLWNsb3N1cmUtY29tcGlsZXIvY29tcGlsZXIuamFyID4gY29tbW9uanNfb3V0L3Rlc3Rfbm9kZV9tb2R1bGVzL2Nsb3N1cmVfYXNzZXJ0c19jb21tb25qcy5qcycsCi0gICAgICAgZnVuY3Rpb24gKGVyciwgc3Rkb3V0LCBzdGRlcnIpIHsKLSAgICBjb25zb2xlLmxvZyhzdGRvdXQpOwotICAgIGNvbnNvbGUubG9nKHN0ZGVycik7Ci0gICAgY2IoZXJyKTsKLSAgfSk7Ci19KTsKLQotZ3VscC50YXNrKCdjb21tb25qc190ZXN0ZGVwcycsIGZ1bmN0aW9uIChjYikgewotICBleGVjKCdta2RpciAtcCBjb21tb25qc19vdXQvdGVzdF9ub2RlX21vZHVsZXMgJiYgLi9ub2RlX21vZHVsZXMvZ29vZ2xlLWNsb3N1cmUtbGlicmFyeS9jbG9zdXJlL2Jpbi9jYWxjZGVwcy5weSAtaSBjb21tb25qcy9leHBvcnRfdGVzdGRlcHMuanMgLXAgLiAtcCBub2RlX21vZHVsZXMvZ29vZ2xlLWNsb3N1cmUtbGlicmFyeS9jbG9zdXJlIC1vIGNvbXBpbGVkIC0tY29tcGlsZXJfamFyIG5vZGVfbW9kdWxlcy9nb29nbGUtY2xvc3VyZS1jb21waWxlci9jb21waWxlci5qYXIgPiBjb21tb25qc19vdXQvdGVzdF9ub2RlX21vZHVsZXMvdGVzdGRlcHNfY29tbW9uanMuanMnLAotICAgICAgIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgY29uc29sZS5sb2coc3Rkb3V0KTsKLSAgICBjb25zb2xlLmxvZyhzdGRlcnIpOwotICAgIGNiKGVycik7Ci0gIH0pOwotfSk7Ci0KLWd1bHAudGFzaygnbWFrZV9jb21tb25qc19vdXQnLCBbJ2Rpc3QnLCAnZ2VucHJvdG9fY29tbW9uanMnLCAnY29tbW9uanNfYXNzZXJ0cycsICdjb21tb25qc190ZXN0ZGVwcyddLCBmdW5jdGlvbiAoY2IpIHsKLSAgLy8gVE9ETyhoYWJlcm1hbik6IG1pbmlmeSB0aGlzIG1vcmUgYWdncmVzc2l2ZWx5LgotICAvLyBXaWxsIHJlcXVpcmUgcHJvcGVyIGV4dGVybnMvZXhwb3J0cy4KLSAgdmFyIGNtZCA9ICJta2RpciAtcCBjb21tb25qc19vdXQvYmluYXJ5ICYmIG1rZGlyIC1wIGNvbW1vbmpzX291dC90ZXN0X25vZGVfbW9kdWxlcyAmJiAiOwotICBmdW5jdGlvbiBhZGRUZXN0RmlsZShmaWxlKSB7Ci0gICAgY21kICs9ICdub2RlIGNvbW1vbmpzL3Jld3JpdGVfdGVzdHNfZm9yX2NvbW1vbmpzLmpzIDwgJyArIGZpbGUgKwotICAgICAgICAgICAnID4gY29tbW9uanNfb3V0LycgKyBmaWxlICsgJyYmICc7Ci0gIH0KLQotICBnbG9iLnN5bmMoJypfdGVzdC5qcycpLmZvckVhY2goYWRkVGVzdEZpbGUpOwotICBnbG9iLnN5bmMoJ2JpbmFyeS8qX3Rlc3QuanMnKS5mb3JFYWNoKGFkZFRlc3RGaWxlKTsKLQotICBleGVjKGNtZCArCi0gICAgICAgJ2NwIGNvbW1vbmpzL2phc21pbmUuanNvbiBjb21tb25qc19vdXQvamFzbWluZS5qc29uICYmICcgKwotICAgICAgICdjcCBnb29nbGUtcHJvdG9idWYuanMgY29tbW9uanNfb3V0L3Rlc3Rfbm9kZV9tb2R1bGVzICYmICcgKwotICAgICAgICdjcCBjb21tb25qcy9pbXBvcnRfdGVzdC5qcyBjb21tb25qc19vdXQvaW1wb3J0X3Rlc3QuanMnLAotICAgICAgIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgY29uc29sZS5sb2coc3Rkb3V0KTsKLSAgICBjb25zb2xlLmxvZyhzdGRlcnIpOwotICAgIGNiKGVycik7Ci0gIH0pOwotfSk7Ci0KLWd1bHAudGFzaygnZGVwcycsIFsnZ2VucHJvdG9fY2xvc3VyZSddLCBmdW5jdGlvbiAoY2IpIHsKLSAgZXhlYygnLi9ub2RlX21vZHVsZXMvZ29vZ2xlLWNsb3N1cmUtbGlicmFyeS9jbG9zdXJlL2Jpbi9idWlsZC9kZXBzd3JpdGVyLnB5ICouanMgYmluYXJ5LyouanMgPiBkZXBzLmpzJywKLSAgICAgICBmdW5jdGlvbiAoZXJyLCBzdGRvdXQsIHN0ZGVycikgewotICAgIGNvbnNvbGUubG9nKHN0ZG91dCk7Ci0gICAgY29uc29sZS5sb2coc3RkZXJyKTsKLSAgICBjYihlcnIpOwotICB9KTsKLX0pOwotCi1ndWxwLnRhc2soJ3Rlc3RfY2xvc3VyZScsIFsnZ2VucHJvdG9fY2xvc3VyZScsICdkZXBzJ10sIGZ1bmN0aW9uIChjYikgewotICBleGVjKCdKQVNNSU5FX0NPTkZJR19QQVRIPWphc21pbmUuanNvbiAuL25vZGVfbW9kdWxlcy8uYmluL2phc21pbmUnLAotICAgICAgIGZ1bmN0aW9uIChlcnIsIHN0ZG91dCwgc3RkZXJyKSB7Ci0gICAgY29uc29sZS5sb2coc3Rkb3V0KTsKLSAgICBjb25zb2xlLmxvZyhzdGRlcnIpOwotICAgIGNiKGVycik7Ci0gIH0pOwotfSk7Ci0KLWd1bHAudGFzaygndGVzdF9jb21tb25qcycsIFsnbWFrZV9jb21tb25qc19vdXQnXSwgZnVuY3Rpb24gKGNiKSB7Ci0gIGV4ZWMoJ2NkIGNvbW1vbmpzX291dCAmJiBKQVNNSU5FX0NPTkZJR19QQVRIPWphc21pbmUuanNvbiBOT0RFX1BBVEg9dGVzdF9ub2RlX21vZHVsZXMgLi4vbm9kZV9tb2R1bGVzLy5iaW4vamFzbWluZScsCi0gICAgICAgZnVuY3Rpb24gKGVyciwgc3Rkb3V0LCBzdGRlcnIpIHsKLSAgICBjb25zb2xlLmxvZyhzdGRvdXQpOwotICAgIGNvbnNvbGUubG9nKHN0ZGVycik7Ci0gICAgY2IoZXJyKTsKLSAgfSk7Ci19KTsKLQotZ3VscC50YXNrKCd0ZXN0JywgWyd0ZXN0X2Nsb3N1cmUnLCAndGVzdF9jb21tb25qcyddLCBmdW5jdGlvbihjYikgewotICBjYigpOwotfSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9qYXNtaW5lLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9qYXNtaW5lLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY4M2M1NGMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvamFzbWluZS5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsMTIgKzAsMCBAQAotewotICAgICJzcGVjX2RpciI6ICIiLAotICAgICJzcGVjX2ZpbGVzIjogWwotICAgICAgICAiKl90ZXN0LmpzIiwKLSAgICAgICAgImJpbmFyeS8qX3Rlc3QuanMiCi0gICAgXSwKLSAgICAiaGVscGVycyI6IFsKLSAgICAgICAgIm5vZGVfbW9kdWxlcy9nb29nbGUtY2xvc3VyZS1saWJyYXJ5L2Nsb3N1cmUvZ29vZy9ib290c3RyYXAvbm9kZWpzLmpzIiwKLSAgICAgICAgIm5vZGVfbG9hZGVyLmpzIiwKLSAgICAgICAgImRlcHMuanMiCi0gICAgXQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvbWVzc2FnZS5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL21lc3NhZ2UuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgxM2U2YjguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvbWVzc2FnZS5qcworKysgL2Rldi9udWxsCkBAIC0xLDEzMzcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8qKgotICogQGZpbGVvdmVydmlldyBEZWZpbml0aW9uIG9mIGpzcGIuTWVzc2FnZS4KLSAqCi0gKiBAYXV0aG9yIG13ckBnb29nbGUuY29tIChNYXJrIFJhd2xpbmcpCi0gKi8KLQotZ29vZy5wcm92aWRlKCdqc3BiLkV4dGVuc2lvbkZpZWxkSW5mbycpOwotZ29vZy5wcm92aWRlKCdqc3BiLk1lc3NhZ2UnKTsKLQotZ29vZy5yZXF1aXJlKCdnb29nLmFycmF5Jyk7Ci1nb29nLnJlcXVpcmUoJ2dvb2cuYXNzZXJ0cycpOwotZ29vZy5yZXF1aXJlKCdnb29nLmNyeXB0LmJhc2U2NCcpOwotZ29vZy5yZXF1aXJlKCdnb29nLmpzb24nKTsKLQotLy8gTm90IG5lZWRlZCBpbiBjb21waWxhdGlvbiB1bml0cyB0aGF0IGhhdmUgbm8gcHJvdG9zIHdpdGggeGlkcy4KLWdvb2cuZm9yd2FyZERlY2xhcmUoJ3hpZC5TdHJpbmcnKTsKLQotCi0KLS8qKgotICogU3RvcmVzIGluZm9ybWF0aW9uIGZvciBhIHNpbmdsZSBleHRlbnNpb24gZmllbGQuCi0gKgotICogRm9yIGV4YW1wbGUsIGFuIGV4dGVuc2lvbiBmaWVsZCBkZWZpbmVkIGxpa2Ugc286Ci0gKgotICogICAgIGV4dGVuZCBCYXNlTWVzc2FnZSB7Ci0gKiAgICAgICBvcHRpb25hbCBNeU1lc3NhZ2UgbXlfZmllbGQgPSAxMjM7Ci0gKiAgICAgfQotICoKLSAqIHdpbGwgcmVzdWx0IGluIGFuIEV4dGVuc2lvbkZpZWxkSW5mbyBvYmplY3Qgd2l0aCB0aGVzZSBwcm9wZXJ0aWVzOgotICoKLSAqICAgICB7Ci0gKiAgICAgICBmaWVsZEluZGV4OiAxMjMsCi0gKiAgICAgICBmaWVsZE5hbWU6IHtteV9maWVsZF9yZW5hbWVkOiAwfSwKLSAqICAgICAgIGN0b3I6IHByb3RvLmV4YW1wbGUuTXlNZXNzYWdlLAotICogICAgICAgdG9PYmplY3RGbjogcHJvdG8uZXhhbXBsZS5NeU1lc3NhZ2UudG9PYmplY3QsCi0gKiAgICAgICBpc1JlcGVhdGVkOiAwCi0gKiAgICAgfQotICoKLSAqIFdlIGluY2x1ZGUgYHRvT2JqZWN0Rm5gIHRvIGFsbG93IHRoZSBKU0NvbXBpbGVyIHRvIHBlcmZvcm0gZGVhZC1jb2RlIHJlbW92YWwKLSAqIG9uIHVudXNlZCB0b09iamVjdCgpIG1ldGhvZHMuCi0gKgotICogSWYgYW4gZXh0ZW5zaW9uIGZpZWxkIGlzIHByaW1pdGl2ZSwgY3RvciBhbmQgdG9PYmplY3RGbiB3aWxsIGJlIG51bGwuCi0gKiBpc1JlcGVhdGVkIHNob3VsZCBiZSAwIG9yIDEuCi0gKgotICogYmluYXJ5e1JlYWRlcixXcml0ZXJ9Rm4gYW5kIChpZiBtZXNzYWdlIHR5cGUpIGJpbmFyeU1lc3NhZ2VTZXJpYWxpemVGbiBhcmUKLSAqIGFsd2F5cyBwcm92aWRlZC4gYmluYXJ5UmVhZGVyRm4gYW5kIGJpbmFyeVdyaXRlckZuIGFyZSByZWZlcmVuY2VzIHRvIHRoZQotICogYXBwcm9wcmlhdGUgbWV0aG9kcyBvbiBCaW5hcnlSZWFkZXIvQmluYXJ5V3JpdGVyIHRvIHJlYWQvd3JpdGUgdGhlIHZhbHVlIG9mCi0gKiB0aGlzIGV4dGVuc2lvbiwgYW5kIGJpbmFyeU1lc3NhZ2VTZXJpYWxpemVGbiBpcyBhIHJlZmVyZW5jZSB0byB0aGUgbWVzc2FnZQotICogY2xhc3MncyAuc2VyaWFsaXplQmluYXJ5IG1ldGhvZCwgaWYgYXZhaWxhYmxlLgotICoKLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZE51bWJlcgotICogQHBhcmFtIHtPYmplY3R9IGZpZWxkTmFtZSBUaGlzIGhhcyB0aGUgZXh0ZW5zaW9uIGZpZWxkIG5hbWUgYXMgYSBwcm9wZXJ0eS4KLSAqIEBwYXJhbSB7P2Z1bmN0aW9uKG5ldzoganNwYi5NZXNzYWdlLCBBcnJheT0pfSBjdG9yCi0gKiBAcGFyYW0gez9mdW5jdGlvbigoYm9vbGVhbnx1bmRlZmluZWQpLCFqc3BiLk1lc3NhZ2UpOiFPYmplY3R9IHRvT2JqZWN0Rm4KLSAqIEBwYXJhbSB7bnVtYmVyfSBpc1JlcGVhdGVkCi0gKiBAcGFyYW0gez9mdW5jdGlvbihudW1iZXIsPyk9fSBvcHRfYmluYXJ5UmVhZGVyRm4KLSAqIEBwYXJhbSB7P2Z1bmN0aW9uKG51bWJlciw/KXxmdW5jdGlvbihudW1iZXIsPyw/LD8sPyw/KT19IG9wdF9iaW5hcnlXcml0ZXJGbgotICogQHBhcmFtIHs/ZnVuY3Rpb24oPyw/KT19IG9wdF9iaW5hcnlNZXNzYWdlU2VyaWFsaXplRm4KLSAqIEBwYXJhbSB7P2Z1bmN0aW9uKD8sPyk9fSBvcHRfYmluYXJ5TWVzc2FnZURlc2VyaWFsaXplRm4KLSAqIEBwYXJhbSB7P2Jvb2xlYW49fSBvcHRfaXNQYWNrZWQKLSAqIEBjb25zdHJ1Y3RvcgotICogQHN0cnVjdAotICogQHRlbXBsYXRlIFQKLSAqLwotanNwYi5FeHRlbnNpb25GaWVsZEluZm8gPSBmdW5jdGlvbihmaWVsZE51bWJlciwgZmllbGROYW1lLCBjdG9yLCB0b09iamVjdEZuLAotICAgIGlzUmVwZWF0ZWQsIG9wdF9iaW5hcnlSZWFkZXJGbiwgb3B0X2JpbmFyeVdyaXRlckZuLAotICAgIG9wdF9iaW5hcnlNZXNzYWdlU2VyaWFsaXplRm4sIG9wdF9iaW5hcnlNZXNzYWdlRGVzZXJpYWxpemVGbiwKLSAgICBvcHRfaXNQYWNrZWQpIHsKLSAgLyoqIEBjb25zdCAqLwotICB0aGlzLmZpZWxkSW5kZXggPSBmaWVsZE51bWJlcjsKLSAgLyoqIEBjb25zdCAqLwotICB0aGlzLmZpZWxkTmFtZSA9IGZpZWxkTmFtZTsKLSAgLyoqIEBjb25zdCAqLwotICB0aGlzLmN0b3IgPSBjdG9yOwotICAvKiogQGNvbnN0ICovCi0gIHRoaXMudG9PYmplY3RGbiA9IHRvT2JqZWN0Rm47Ci0gIC8qKiBAY29uc3QgKi8KLSAgdGhpcy5iaW5hcnlSZWFkZXJGbiA9IG9wdF9iaW5hcnlSZWFkZXJGbjsKLSAgLyoqIEBjb25zdCAqLwotICB0aGlzLmJpbmFyeVdyaXRlckZuID0gb3B0X2JpbmFyeVdyaXRlckZuOwotICAvKiogQGNvbnN0ICovCi0gIHRoaXMuYmluYXJ5TWVzc2FnZVNlcmlhbGl6ZUZuID0gb3B0X2JpbmFyeU1lc3NhZ2VTZXJpYWxpemVGbjsKLSAgLyoqIEBjb25zdCAqLwotICB0aGlzLmJpbmFyeU1lc3NhZ2VEZXNlcmlhbGl6ZUZuID0gb3B0X2JpbmFyeU1lc3NhZ2VEZXNlcmlhbGl6ZUZuOwotICAvKiogQGNvbnN0ICovCi0gIHRoaXMuaXNSZXBlYXRlZCA9IGlzUmVwZWF0ZWQ7Ci0gIC8qKiBAY29uc3QgKi8KLSAgdGhpcy5pc1BhY2tlZCA9IG9wdF9pc1BhY2tlZDsKLX07Ci0KLQotLyoqCi0gKiBAcmV0dXJuIHtib29sZWFufSBEb2VzIHRoaXMgZmllbGQgcmVwcmVzZW50IGEgc3ViIE1lc3NhZ2U/Ci0gKi8KLWpzcGIuRXh0ZW5zaW9uRmllbGRJbmZvLnByb3RvdHlwZS5pc01lc3NhZ2VUeXBlID0gZnVuY3Rpb24oKSB7Ci0gIHJldHVybiAhIXRoaXMuY3RvcjsKLX07Ci0KLQotLyoqCi0gKiBCYXNlIGNsYXNzIGZvciBhbGwgSnNQYiBtZXNzYWdlcy4KLSAqIEBjb25zdHJ1Y3RvcgotICogQHN0cnVjdAotICovCi1qc3BiLk1lc3NhZ2UgPSBmdW5jdGlvbigpIHsKLX07Ci0KLQotLyoqCi0gKiBAZGVmaW5lIHtib29sZWFufSBXaGV0aGVyIHRvIGdlbmVyYXRlIHRvT2JqZWN0IG1ldGhvZHMgZm9yIG9iamVjdHMuIFR1cm4KLSAqICAgICB0aGlzIG9mZiwgaWYgeW91IGRvIG5vdCB3YW50IHRvT2JqZWN0IHRvIGJlIGV2ZXIgdXNlZCBpbiB5b3VyIHByb2plY3QuCi0gKiAgICAgV2hlbiB0dXJuaW5nIG9mZiB0aGlzIGZsYWcsIGNvbnNpZGVyIGFkZGluZyBhIGNvbmZvcm1hbmNlIHRlc3QgdGhhdCBiYW5zCi0gKiAgICAgY2FsbGluZyB0b09iamVjdC4gRW5hYmxpbmcgdGhpcyB3aWxsIGRpc2FibGUgdGhlIEpTQ29tcGlsZXIncyBhYmlsaXR5IHRvCi0gKiAgICAgZGVhZCBjb2RlIGVsaW1pbmF0ZSBmaWVsZHMgdXNlZCBpbiBwcm90b2NvbCBidWZmZXJzIHRoYXQgYXJlIG5ldmVyIHVzZWQKLSAqICAgICBpbiBhbiBhcHBsaWNhdGlvbi4KLSAqLwotZ29vZy5kZWZpbmUoJ2pzcGIuTWVzc2FnZS5HRU5FUkFURV9UT19PQkpFQ1QnLCB0cnVlKTsKLQotCi0vKioKLSAqIEBkZWZpbmUge2Jvb2xlYW59IFdoZXRoZXIgdG8gZ2VuZXJhdGUgZnJvbU9iamVjdCBtZXRob2RzIGZvciBvYmplY3RzLiBUdXJuCi0gKiAgICAgdGhpcyBvZmYsIGlmIHlvdSBkbyBub3Qgd2FudCBmcm9tT2JqZWN0IHRvIGJlIGV2ZXIgdXNlZCBpbiB5b3VyIHByb2plY3QuCi0gKiAgICAgV2hlbiB0dXJuaW5nIG9mZiB0aGlzIGZsYWcsIGNvbnNpZGVyIGFkZGluZyBhIGNvbmZvcm1hbmNlIHRlc3QgdGhhdCBiYW5zCi0gKiAgICAgY2FsbGluZyBmcm9tT2JqZWN0LiBFbmFibGluZyB0aGlzIG1pZ2h0IGRpc2FibGUgdGhlIEpTQ29tcGlsZXIncyBhYmlsaXR5Ci0gKiAgICAgdG8gZGVhZCBjb2RlIGVsaW1pbmF0ZSBmaWVsZHMgdXNlZCBpbiBwcm90b2NvbCBidWZmZXJzIHRoYXQgYXJlIG5ldmVyCi0gKiAgICAgdXNlZCBpbiBhbiBhcHBsaWNhdGlvbi4KLSAqICAgICBOT1RFOiBCeSBkZWZhdWx0IG5vIHByb3RvcyBhY3R1YWxseSBoYXZlIGEgZnJvbU9iamVjdCBtZXRob2QuIFlvdSBuZWVkIHRvCi0gKiAgICAgYWRkIHRoZSBqc3BiLmdlbmVyYXRlX2Zyb21fb2JqZWN0IG9wdGlvbnMgdG8gdGhlIHByb3RvIGRlZmluaXRpb24gdG8KLSAqICAgICBhY3RpdmF0ZSB0aGUgZmVhdHVyZS4KLSAqICAgICBCeSBkZWZhdWx0IHRoaXMgaXMgZW5hYmxlZCBmb3IgdGVzdCBjb2RlIG9ubHkuCi0gKi8KLWdvb2cuZGVmaW5lKCdqc3BiLk1lc3NhZ2UuR0VORVJBVEVfRlJPTV9PQkpFQ1QnLCAhZ29vZy5ESVNBTExPV19URVNUX09OTFlfQ09ERSk7Ci0KLQotLyoqCi0gKiBAZGVmaW5lIHtib29sZWFufSBUdXJuaW5nIG9uIHRoaXMgZmxhZyBkb2VzIE5PVCBjaGFuZ2UgdGhlIGJlaGF2aW9yIG9mIEpTUEIKLSAqICAgICBhbmQgb25seSBhZmZlY3RzIHByaXZhdGUgaW50ZXJuYWwgc3RhdGUuIEl0IG1heSwgaG93ZXZlciwgYnJlYWsgc29tZQotICogICAgIHRlc3RzIHRoYXQgdXNlIG5haXZlIGRlZXBseS1lcXVhbHMgYWxnb3JpdGhtcywgYmVjYXVzZSB1c2luZyBhIHByb3RvCi0gKiAgICAgbXV0YXRlcyBpdHMgaW50ZXJuYWwgc3RhdGUuCi0gKiAgICAgUHJvamVjdHMgYXJlIGFkdmlzZWQgdG8gdHVybiB0aGlzIGZsYWcgYWx3YXlzIG9uLgotICovCi1nb29nLmRlZmluZSgnanNwYi5NZXNzYWdlLk1JTklNSVpFX01FTU9SWV9BTExPQ0FUSU9OUycsIENPTVBJTEVEKTsKLS8vIFRPRE8oYi8xOTQxOTQzNikgVHVybiB0aGlzIG9uIGJ5IGRlZmF1bHQuCi0KLQotLyoqCi0gKiBEb2VzIHRoaXMgYnJvd3NlciBzdXBwb3J0IFVpbnQ4QXJheSB0eXBlZCBhcnJheXM/Ci0gKiBAdHlwZSB7Ym9vbGVhbn0KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuTWVzc2FnZS5TVVBQT1JUU19VSU5UOEFSUkFZXyA9ICh0eXBlb2YgVWludDhBcnJheSA9PSAnZnVuY3Rpb24nKTsKLQotCi0vKioKLSAqIFRoZSBpbnRlcm5hbCBkYXRhIGFycmF5LgotICogQHR5cGUgeyFBcnJheX0KLSAqIEBwcm90ZWN0ZWQKLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS5hcnJheTsKLQotCi0vKioKLSAqIFdyYXBwZXJzIGFyZSB0aGUgY29uc3RydWN0ZWQgaW5zdGFuY2VzIG9mIG1lc3NhZ2UtdHlwZSBmaWVsZHMuIFRoZXkgYXJlIGJ1aWx0Ci0gKiBvbiBkZW1hbmQgZnJvbSB0aGUgcmF3IGFycmF5IGRhdGEuIEluY2x1ZGVzIG1lc3NhZ2UgZmllbGRzLCByZXBlYXRlZCBtZXNzYWdlCi0gKiBmaWVsZHMgYW5kIGV4dGVuc2lvbiBtZXNzYWdlIGZpZWxkcy4gSW5kZXhlZCBieSBmaWVsZCBudW1iZXIuCi0gKiBAdHlwZSB7T2JqZWN0fQotICogQHByaXZhdGUKLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS53cmFwcGVyc187Ci0KLQotLyoqCi0gKiBUaGUgb2JqZWN0IHRoYXQgY29udGFpbnMgZXh0ZW5zaW9uIGZpZWxkcywgaWYgYW55LiBUaGlzIGlzIGFuIG9iamVjdCB0aGF0Ci0gKiBtYXBzIGZyb20gYSBwcm90byBmaWVsZCBudW1iZXIgdG8gdGhlIGZpZWxkJ3MgdmFsdWUuCi0gKiBAdHlwZSB7T2JqZWN0fQotICogQHByaXZhdGUKLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS5leHRlbnNpb25PYmplY3RfOwotCi0KLS8qKgotICogTm9uLWV4dGVuc2lvbiBmaWVsZHMgd2l0aCBhIGZpZWxkIG51bWJlciBhdCBvciBhYm92ZSB0aGUgcGl2b3QgYXJlCi0gKiBzdG9yZWQgaW4gdGhlIGV4dGVuc2lvbiBvYmplY3QgKGluIGFkZGl0aW9uIHRvIGFsbCBleHRlbnNpb24gZmllbGRzKS4KLSAqIEB0eXBlIHtudW1iZXJ9Ci0gKiBAcHJpdmF0ZQotICovCi1qc3BiLk1lc3NhZ2UucHJvdG90eXBlLnBpdm90XzsKLQotCi0vKioKLSAqIFRoZSBKc1BiIG1lc3NhZ2VfaWQgb2YgdGhpcyBwcm90by4KLSAqIEB0eXBlIHtzdHJpbmd8dW5kZWZpbmVkfSB0aGUgbWVzc2FnZSBpZCBvciB1bmRlZmluZWQgaWYgdGhpcyBtZXNzYWdlCi0gKiAgICAgaGFzIG5vIGlkLgotICogQHByaXZhdGUKLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS5tZXNzYWdlSWRfOwotCi0KLS8qKgotICogUmVwZWF0ZWQgZmxvYXQgb3IgZG91YmxlIGZpZWxkcyB3aGljaCBoYXZlIGJlZW4gY29udmVydGVkIHRvIGluY2x1ZGUgb25seQotICogbnVtYmVycyBhbmQgbm90IHN0cmluZ3MgaG9sZGluZyAiTmFOIiwgIkluZmluaXR5IiBhbmQgIi1JbmZpbml0eSIuCi0gKiBAcHJpdmF0ZSB7IU9iamVjdDxudW1iZXIsYm9vbGVhbj58dW5kZWZpbmVkfQotICovCi1qc3BiLk1lc3NhZ2UucHJvdG90eXBlLmNvbnZlcnRlZEZsb2F0aW5nUG9pbnRGaWVsZHNfOwotCi0KLS8qKgotICogVGhlIHhpZCBvZiB0aGlzIHByb3RvIHR5cGUgKFRoZSBzYW1lIGZvciBhbGwgaW5zdGFuY2VzIG9mIGEgcHJvdG8pLiBQcm92aWRlcwotICogYSB3YXkgdG8gaWRlbnRpZnkgYSBwcm90byBieSBzdGFibGUgb2JmdXNjYXRlZCBuYW1lLgotICogQHNlZSB7eGlkfS4KLSAqIEF2YWlsYWJsZSBpZiB7QGxpbmsganNwYi5nZW5lcmF0ZV94aWR9IGlzIGFkZGVkIGFzIGEgTWVzc2FnZSBvcHRpb24gdG8KLSAqIGEgcHJvdG9jb2wgYnVmZmVyLgotICogQGNvbnN0IHsheGlkLlN0cmluZ3x1bmRlZmluZWR9IFRoZSB4aWQgb3IgdW5kZWZpbmVkIGlmIG1lc3NhZ2UgaXMKLSAqICAgICBhbm5vdGF0ZWQgdG8gZ2VuZXJhdGUgdGhlIHhpZC4KLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS5tZXNzYWdlWGlkOwotCi0KLQotLyoqCi0gKiBSZXR1cm5zIHRoZSBKc1BiIG1lc3NhZ2VfaWQgb2YgdGhpcyBwcm90by4KLSAqIEByZXR1cm4ge3N0cmluZ3x1bmRlZmluZWR9IHRoZSBtZXNzYWdlIGlkIG9yIHVuZGVmaW5lZCBpZiB0aGlzIG1lc3NhZ2UKLSAqICAgICBoYXMgbm8gaWQuCi0gKi8KLWpzcGIuTWVzc2FnZS5wcm90b3R5cGUuZ2V0SnNQYk1lc3NhZ2VJZCA9IGZ1bmN0aW9uKCkgewotICByZXR1cm4gdGhpcy5tZXNzYWdlSWRfOwotfTsKLQotCi0vKioKLSAqIEFuIG9mZnNldCBhcHBsaWVkIHRvIGxvb2t1cHMgaW50byB0aGlzLmFycmF5IHRvIGFjY291bnQgZm9yIHRoZSBwcmVzZW5jZSBvcgotICogYWJzZW5jZSBvZiBhIG1lc3NhZ2VJZCBhdCBwb3NpdGlvbiAwLiBGb3IgcmVzcG9uc2UgbWVzc2FnZXMsIHRoaXMgd2lsbCBiZSAwLgotICogT3RoZXJ3aXNlLCBpdCB3aWxsIGJlIC0xIHNvIHRoYXQgdGhlIGZpcnN0IGFycmF5IHBvc2l0aW9uIGlzIG5vdCB3YXN0ZWQuCi0gKiBAdHlwZSB7bnVtYmVyfQotICogQHByaXZhdGUKLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS5hcnJheUluZGV4T2Zmc2V0XzsKLQotCi0vKioKLSAqIFJldHVybnMgdGhlIGluZGV4IGludG8gbXNnLmFycmF5IGF0IHdoaWNoIHRoZSBwcm90byBmaWVsZCB3aXRoIHRhZyBudW1iZXIKLSAqIGZpZWxkTnVtYmVyIHdpbGwgYmUgbG9jYXRlZC4KLSAqIEBwYXJhbSB7IWpzcGIuTWVzc2FnZX0gbXNnIE1lc3NhZ2UgZm9yIHdoaWNoIHdlJ3JlIGNhbGN1bGF0aW5nIGFuIGluZGV4LgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkTnVtYmVyIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcmV0dXJuIHtudW1iZXJ9IFRoZSBpbmRleC4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuTWVzc2FnZS5nZXRJbmRleF8gPSBmdW5jdGlvbihtc2csIGZpZWxkTnVtYmVyKSB7Ci0gIHJldHVybiBmaWVsZE51bWJlciArIG1zZy5hcnJheUluZGV4T2Zmc2V0XzsKLX07Ci0KLQotLyoqCi0gKiBJbml0aWFsaXplcyBhIEpzUGIgTWVzc2FnZS4KLSAqIEBwYXJhbSB7IWpzcGIuTWVzc2FnZX0gbXNnIFRoZSBKc1BiIHByb3RvIHRvIG1vZGlmeS4KLSAqIEBwYXJhbSB7QXJyYXl8dW5kZWZpbmVkfSBkYXRhIEFuIGluaXRpYWwgZGF0YSBhcnJheS4KLSAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcn0gbWVzc2FnZUlkIEZvciByZXNwb25zZSBtZXNzYWdlcywgdGhlIG1lc3NhZ2UgaWQgb3IgJycKLSAqICAgICBpZiBubyBtZXNzYWdlIGlkIGlzIHNwZWNpZmllZC4gRm9yIG5vbi1yZXNwb25zZSBtZXNzYWdlcywgMC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBzdWdnZXN0ZWRQaXZvdCBUaGUgZmllbGQgbnVtYmVyIGF0IHdoaWNoIHRvIHN0YXJ0IHB1dHRpbmcKLSAqICAgICBmaWVsZHMgaW50byB0aGUgZXh0ZW5zaW9uIG9iamVjdC4gVGhpcyBpcyBvbmx5IHVzZWQgaWYgZGF0YSBkb2VzIG5vdAotICogICAgIGNvbnRhaW4gYW4gZXh0ZW5zaW9uIG9iamVjdCBhbHJlYWR5LiAtMSBpZiBubyBleHRlbnNpb24gb2JqZWN0IGlzCi0gKiAgICAgcmVxdWlyZWQgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgotICogQHBhcmFtIHtBcnJheTxudW1iZXI+fSByZXBlYXRlZEZpZWxkcyBUaGUgbWVzc2FnZSdzIHJlcGVhdGVkIGZpZWxkcy4KLSAqIEBwYXJhbSB7QXJyYXk8IUFycmF5PG51bWJlcj4+PX0gb3B0X29uZW9mRmllbGRzIFRoZSBmaWVsZHMgYmVsb25naW5nIHRvCi0gKiAgICAgZWFjaCBvZiB0aGUgbWVzc2FnZSdzIG9uZW9mIHVuaW9ucy4KLSAqIEBwcm90ZWN0ZWQKLSAqLwotanNwYi5NZXNzYWdlLmluaXRpYWxpemUgPSBmdW5jdGlvbigKLSAgICBtc2csIGRhdGEsIG1lc3NhZ2VJZCwgc3VnZ2VzdGVkUGl2b3QsIHJlcGVhdGVkRmllbGRzLCBvcHRfb25lb2ZGaWVsZHMpIHsKLSAgbXNnLndyYXBwZXJzXyA9IGpzcGIuTWVzc2FnZS5NSU5JTUlaRV9NRU1PUllfQUxMT0NBVElPTlMgPyBudWxsIDoge307Ci0gIGlmICghZGF0YSkgewotICAgIGRhdGEgPSBtZXNzYWdlSWQgPyBbbWVzc2FnZUlkXSA6IFtdOwotICB9Ci0gIG1zZy5tZXNzYWdlSWRfID0gbWVzc2FnZUlkID8gU3RyaW5nKG1lc3NhZ2VJZCkgOiB1bmRlZmluZWQ7Ci0gIC8vIElmIHRoZSBtZXNzYWdlSWQgaXMgMCwgdGhpcyBtZXNzYWdlIGlzIG5vdCBhIHJlc3BvbnNlIG1lc3NhZ2UsIHNvIHdlIHNoaWZ0Ci0gIC8vIGFycmF5IGluZGljZXMgZG93biBieSAxIHNvIGFzIG5vdCB0byB3YXN0ZSB0aGUgZmlyc3QgcG9zaXRpb24gaW4gdGhlIGFycmF5LAotICAvLyB3aGljaCB3b3VsZCBvdGhlcndpc2UgZ28gdW51c2VkLgotICBtc2cuYXJyYXlJbmRleE9mZnNldF8gPSBtZXNzYWdlSWQgPT09IDAgPyAtMSA6IDA7Ci0gIG1zZy5hcnJheSA9IGRhdGE7Ci0gIGpzcGIuTWVzc2FnZS5tYXRlcmlhbGl6ZUV4dGVuc2lvbk9iamVjdF8obXNnLCBzdWdnZXN0ZWRQaXZvdCk7Ci0gIG1zZy5jb252ZXJ0ZWRGbG9hdGluZ1BvaW50RmllbGRzXyA9IHt9OwotCi0gIGlmIChyZXBlYXRlZEZpZWxkcykgewotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgcmVwZWF0ZWRGaWVsZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciBmaWVsZE51bWJlciA9IHJlcGVhdGVkRmllbGRzW2ldOwotICAgICAgaWYgKGZpZWxkTnVtYmVyIDwgbXNnLnBpdm90XykgewotICAgICAgICB2YXIgaW5kZXggPSBqc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKG1zZywgZmllbGROdW1iZXIpOwotICAgICAgICBtc2cuYXJyYXlbaW5kZXhdID0gbXNnLmFycmF5W2luZGV4XSB8fAotICAgICAgICAgICAgKGpzcGIuTWVzc2FnZS5NSU5JTUlaRV9NRU1PUllfQUxMT0NBVElPTlMgPwotICAgICAgICAgICAgICAgIGpzcGIuTWVzc2FnZS5FTVBUWV9MSVNUX1NFTlRJTkVMXyA6Ci0gICAgICAgICAgICAgICAgW10pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgbXNnLmV4dGVuc2lvbk9iamVjdF9bZmllbGROdW1iZXJdID0KLSAgICAgICAgICAgIG1zZy5leHRlbnNpb25PYmplY3RfW2ZpZWxkTnVtYmVyXSB8fAotICAgICAgICAgICAgKGpzcGIuTWVzc2FnZS5NSU5JTUlaRV9NRU1PUllfQUxMT0NBVElPTlMgPwotICAgICAgICAgICAgICAgIGpzcGIuTWVzc2FnZS5FTVBUWV9MSVNUX1NFTlRJTkVMXyA6Ci0gICAgICAgICAgICAgICAgW10pOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChvcHRfb25lb2ZGaWVsZHMgJiYgb3B0X29uZW9mRmllbGRzLmxlbmd0aCkgewotICAgIC8vIENvbXB1dGUgdGhlIG9uZW9mIGNhc2UgZm9yIGVhY2ggdW5pb24uIFRoaXMgZW5zdXJlcyBvbmx5IG9uZSB2YWx1ZSBpcwotICAgIC8vIHNldCBpbiB0aGUgdW5pb24uCi0gICAgZ29vZy5hcnJheS5mb3JFYWNoKAotICAgICAgICBvcHRfb25lb2ZGaWVsZHMsIGdvb2cucGFydGlhbChqc3BiLk1lc3NhZ2UuY29tcHV0ZU9uZW9mQ2FzZSwgbXNnKSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBVc2VkIHRvIG1hcmsgZW1wdHkgcmVwZWF0ZWQgZmllbGRzLiBTZXJpYWxpemVzIHRvIG51bGwgd2hlbiBzZXJpYWxpemVkCi0gKiB0byBKU09OLgotICogV2hlbiByZWFkaW5nIGEgcmVwZWF0ZWQgZmllbGQgcmVhZGVycyBtdXN0IGNoZWNrIHRoZSByZXR1cm4gdmFsdWUgYWdhaW5zdAotICogdGhpcyB2YWx1ZSBhbmQgcmV0dXJuIGFuZCByZXBsYWNlIGl0IHdpdGggYSBuZXcgZW1wdHkgYXJyYXkgaWYgaXQgaXMKLSAqIHByZXNlbnQuCi0gKiBAcHJpdmF0ZSBAY29uc3QgeyFPYmplY3R9Ci0gKi8KLWpzcGIuTWVzc2FnZS5FTVBUWV9MSVNUX1NFTlRJTkVMXyA9IGdvb2cuREVCVUcgJiYgT2JqZWN0LmZyZWV6ZSA/Ci0gICAgT2JqZWN0LmZyZWV6ZShbXSkgOgotICAgIFtdOwotCi0KLS8qKgotICogRW5zdXJlcyB0aGF0IHRoZSBhcnJheSBjb250YWlucyBhbiBleHRlbnNpb24gb2JqZWN0IGlmIG5lY2Vzc2FyeS4KLSAqIElmIHRoZSBhcnJheSBjb250YWlucyBhbiBleHRlbnNpb24gb2JqZWN0IGluIGl0cyBsYXN0IHBvc2l0aW9uLCB0aGVuIHRoZQotICogb2JqZWN0IGlzIGtlcHQgaW4gcGxhY2UgYW5kIGl0cyBwb3NpdGlvbiBpcyB1c2VkIGFzIHRoZSBwaXZvdC4gIElmIG5vdCwgdGhlbgotICogY3JlYXRlIGFuIGV4dGVuc2lvbiBvYmplY3QgdXNpbmcgc3VnZ2VzdGVkUGl2b3QuICBJZiBzdWdnZXN0ZWRQaXZvdCBpcyAtMSwKLSAqIHdlIGRvbid0IGhhdmUgYW4gZXh0ZW5zaW9uIG9iamVjdCBhdCBhbGwsIGluIHdoaWNoIGNhc2UgYWxsIGZpZWxkcyBhcmUgc3RvcmVkCi0gKiBpbiB0aGUgYXJyYXkuCi0gKiBAcGFyYW0geyFqc3BiLk1lc3NhZ2V9IG1zZyBUaGUgSnNQYiBwcm90byB0byBtb2RpZnkuCi0gKiBAcGFyYW0ge251bWJlcn0gc3VnZ2VzdGVkUGl2b3QgU2VlIGRlc2NyaXB0aW9uIGZvciBpbml0aWFsaXplKCkuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLk1lc3NhZ2UubWF0ZXJpYWxpemVFeHRlbnNpb25PYmplY3RfID0gZnVuY3Rpb24obXNnLCBzdWdnZXN0ZWRQaXZvdCkgewotICBpZiAobXNnLmFycmF5Lmxlbmd0aCkgewotICAgIHZhciBmb3VuZEluZGV4ID0gbXNnLmFycmF5Lmxlbmd0aCAtIDE7Ci0gICAgdmFyIG9iaiA9IG1zZy5hcnJheVtmb3VuZEluZGV4XTsKLSAgICAvLyBOb3JtYWwgZmllbGRzIGFyZSBuZXZlciBvYmplY3RzLCBzbyB3ZSBjYW4gYmUgc3VyZSB0aGF0IGlmIHdlIGZpbmQgYW4KLSAgICAvLyBvYmplY3QgaGVyZSwgdGhlbiBpdCdzIHRoZSBleHRlbnNpb24gb2JqZWN0LiBIb3dldmVyLCB3ZSBtdXN0IGVuc3VyZSB0aGF0Ci0gICAgLy8gdGhlIG9iamVjdCBpcyBub3QgYW4gYXJyYXksIHNpbmNlIGFycmF5cyBhcmUgdmFsaWQgZmllbGQgdmFsdWVzLgotICAgIC8vIE5PVEUobHVrZXN0ZWJiaW5nKTogV2UgYXZvaWQgbG9va2luZyBhdCAubGVuZ3RoIHRvIGF2b2lkIGEgSklUIGJ1ZwotICAgIC8vIGluIFNhZmFyaSBvbiBpT1MgOC4gU2VlIHRoZSBkZXNjcmlwdGlvbiBvZiBDTC84NjUxMTQ2NCBmb3IgZGV0YWlscy4KLSAgICBpZiAob2JqICYmIHR5cGVvZiBvYmogPT0gJ29iamVjdCcgJiYgIWdvb2cuaXNBcnJheShvYmopKSB7Ci0gICAgICBtc2cucGl2b3RfID0gZm91bmRJbmRleCAtIG1zZy5hcnJheUluZGV4T2Zmc2V0XzsKLSAgICAgIG1zZy5leHRlbnNpb25PYmplY3RfID0gb2JqOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotICAvLyBUaGlzIGNvbXBsZXhpdHkgZXhpc3RzIGJlY2F1c2Ugd2Uga2VlcCBhbGwgZXh0ZW5zaW9uIGZpZWxkcyBpbiB0aGUKLSAgLy8gZXh0ZW5zaW9uT2JqZWN0XyByZWdhcmRsZXNzIG9mIHByb3RvIGZpZWxkIG51bWJlci4gQ2hhbmdpbmcgdGhpcyB3b3VsZAotICAvLyBzaW1wbGlmeSB0aGUgY29kZSBoZXJlLCBidXQgaXQgd291bGQgcmVxdWlyZSBjaGFuZ2luZyB0aGUgc2VyaWFsaXphdGlvbgotICAvLyBmb3JtYXQgZnJvbSB0aGUgc2VydmVyLCB3aGljaCBpcyBub3QgYmFja3dhcmRzIGNvbXBhdGlibGUuCi0gIC8vIFRPRE8oanNobmVpZXIpOiBTaG91bGQgd2UganVzdCB0cmVhdCBleHRlbnNpb24gZmllbGRzIHRoZSBzYW1lIGFzCi0gIC8vIG5vbi1leHRlbnNpb24gZmllbGRzLCBhbmQgc2VsZWN0IHdoZXRoZXIgdGhleSBhcHBlYXIgaW4gdGhlIG9iamVjdCBvciBpbgotICAvLyB0aGUgYXJyYXkgcHVyZWx5IGJhc2VkIG9uIHRhZyBudW1iZXI/IFRoaXMgd291bGQgYWxsb3cgc2ltcGxpZnlpbmcgYWxsIHRoZQotICAvLyBnZXQvc2V0RXh0ZW5zaW9uIGxvZ2ljLCBidXQgaXQgd291bGQgcmVxdWlyZSB0aGUgYnJlYWtpbmcgY2hhbmdlIGRlc2NyaWJlZAotICAvLyBhYm92ZS4KLSAgaWYgKHN1Z2dlc3RlZFBpdm90ID4gLTEpIHsKLSAgICBtc2cucGl2b3RfID0gc3VnZ2VzdGVkUGl2b3Q7Ci0gICAgdmFyIHBpdm90SW5kZXggPSBqc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKG1zZywgc3VnZ2VzdGVkUGl2b3QpOwotICAgIGlmICghanNwYi5NZXNzYWdlLk1JTklNSVpFX01FTU9SWV9BTExPQ0FUSU9OUykgewotICAgICAgbXNnLmV4dGVuc2lvbk9iamVjdF8gPSBtc2cuYXJyYXlbcGl2b3RJbmRleF0gPSB7fTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gSW5pdGlhbGl6ZSB0byBudWxsIHRvIGF2b2lkIGNoYW5naW5nIHRoZSBzaGFwZSBvZiB0aGUgcHJvdG8gd2hlbiBpdAotICAgICAgLy8gZ2V0cyBldmVudHVhbGx5IHNldC4KLSAgICAgIG1zZy5leHRlbnNpb25PYmplY3RfID0gbnVsbDsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgbXNnLnBpdm90XyA9IE51bWJlci5NQVhfVkFMVUU7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBDcmVhdGVzIGFuIGVtcHR5IGV4dGVuc2lvbk9iamVjdF8gaWYgbm9uIGV4aXN0cy4KLSAqIEBwYXJhbSB7IWpzcGIuTWVzc2FnZX0gbXNnIFRoZSBKc1BiIHByb3RvIHRvIG1vZGlmeS4KLSAqIEBwcml2YXRlCi0gKi8KLWpzcGIuTWVzc2FnZS5tYXliZUluaXRFbXB0eUV4dGVuc2lvbk9iamVjdF8gPSBmdW5jdGlvbihtc2cpIHsKLSAgdmFyIHBpdm90SW5kZXggPSBqc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKG1zZywgbXNnLnBpdm90Xyk7Ci0gIGlmICghbXNnLmFycmF5W3Bpdm90SW5kZXhdKSB7Ci0gICAgbXNnLmV4dGVuc2lvbk9iamVjdF8gPSBtc2cuYXJyYXlbcGl2b3RJbmRleF0gPSB7fTsKLSAgfQotfTsKLQotCi0vKioKLSAqIENvbnZlcnRzIGEgSnNQYiByZXBlYXRlZCBtZXNzYWdlIGZpZWxkIGludG8gYW4gb2JqZWN0IGxpc3QuCi0gKiBAcGFyYW0geyFBcnJheTxUPn0gZmllbGQgVGhlIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQgdG8gYmUKLSAqICAgICBjb252ZXJ0ZWQuCi0gKiBAcGFyYW0gez9mdW5jdGlvbihib29sZWFuPSk6IE9iamVjdHwKLSAqICAgICBmdW5jdGlvbigoYm9vbGVhbnx1bmRlZmluZWQpLFQpOiBPYmplY3R9IHRvT2JqZWN0Rm4gVGhlIHRvT2JqZWN0Ci0gKiAgICAgZnVuY3Rpb24gZm9yIHRoaXMgZmllbGQuICBXZSBuZWVkIHRvIHBhc3MgdGhpcyBmb3IgZWZmZWN0aXZlIGRlYWQgY29kZQotICogICAgIHJlbW92YWwuCi0gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgSlNQQiBpbnN0YW5jZQotICogICAgIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6IGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb24KLSAqIEByZXR1cm4geyFBcnJheTxPYmplY3Q+fSBBbiBhcnJheSBvZiBjb252ZXJ0ZWQgbWVzc2FnZSBvYmplY3RzLgotICogQHRlbXBsYXRlIFQKLSAqLwotanNwYi5NZXNzYWdlLnRvT2JqZWN0TGlzdCA9IGZ1bmN0aW9uKGZpZWxkLCB0b09iamVjdEZuLCBvcHRfaW5jbHVkZUluc3RhbmNlKSB7Ci0gIC8vIE5vdCB1c2luZyBnb29nLmFycmF5Lm1hcCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgdG8ga2VlcCBpdCBzbWFsbC4KLSAgLy8gQW5kIG5vdCB1c2luZyBpdCBoZXJlIHRvIGF2b2lkIGEgZnVuY3Rpb24gY2FsbC4KLSAgdmFyIHJlc3VsdCA9IFtdOwotICBmb3IgKHZhciBpID0gMDsgaSA8IGZpZWxkLmxlbmd0aDsgaSsrKSB7Ci0gICAgcmVzdWx0W2ldID0gdG9PYmplY3RGbi5jYWxsKGZpZWxkW2ldLCBvcHRfaW5jbHVkZUluc3RhbmNlLAotICAgICAgLyoqIEB0eXBlIHshanNwYi5NZXNzYWdlfSAqLyAoZmllbGRbaV0pKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfTsKLQotCi0vKioKLSAqIEFkZHMgYSBwcm90bydzIGV4dGVuc2lvbiBkYXRhIHRvIGEgU295IHJlbmRlcmluZyBvYmplY3QuCi0gKiBAcGFyYW0geyFqc3BiLk1lc3NhZ2V9IHByb3RvIFRoZSBwcm90byB3aG9zZSBleHRlbnNpb25zIHRvIGNvbnZlcnQuCi0gKiBAcGFyYW0geyFPYmplY3R9IG9iaiBUaGUgU295IG9iamVjdCB0byBhZGQgY29udmVydGVkIGV4dGVuc2lvbiBkYXRhIHRvLgotICogQHBhcmFtIHshT2JqZWN0fSBleHRlbnNpb25zIFRoZSBwcm90byBjbGFzcycgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICogQHBhcmFtIHtmdW5jdGlvbih0aGlzOj8sIGpzcGIuRXh0ZW5zaW9uRmllbGRJbmZvKSA6ICp9IGdldEV4dGVuc2lvbkZuCi0gKiAgICAgVGhlIHByb3RvIGNsYXNzJyBnZXRFeHRlbnNpb24gZnVuY3Rpb24uIFBhc3NlZCBmb3IgZWZmZWN0aXZlIGRlYWQgY29kZQotICogICAgIHJlbW92YWwuCi0gKiBAcGFyYW0ge2Jvb2xlYW49fSBvcHRfaW5jbHVkZUluc3RhbmNlIFdoZXRoZXIgdG8gaW5jbHVkZSB0aGUgSlNQQiBpbnN0YW5jZQotICogICAgIGZvciB0cmFuc2l0aW9uYWwgc295IHByb3RvIHN1cHBvcnQ6IGh0dHA6Ly9nb3RvL3NveS1wYXJhbS1taWdyYXRpb24KLSAqLwotanNwYi5NZXNzYWdlLnRvT2JqZWN0RXh0ZW5zaW9uID0gZnVuY3Rpb24ocHJvdG8sIG9iaiwgZXh0ZW5zaW9ucywKLSAgICBnZXRFeHRlbnNpb25Gbiwgb3B0X2luY2x1ZGVJbnN0YW5jZSkgewotICBmb3IgKHZhciBmaWVsZE51bWJlciBpbiBleHRlbnNpb25zKSB7Ci0gICAgdmFyIGZpZWxkSW5mbyA9IGV4dGVuc2lvbnNbZmllbGROdW1iZXJdOwotICAgIHZhciB2YWx1ZSA9IGdldEV4dGVuc2lvbkZuLmNhbGwocHJvdG8sIGZpZWxkSW5mbyk7Ci0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICBmb3IgKHZhciBuYW1lIGluIGZpZWxkSW5mby5maWVsZE5hbWUpIHsKLSAgICAgICAgaWYgKGZpZWxkSW5mby5maWVsZE5hbWUuaGFzT3duUHJvcGVydHkobmFtZSkpIHsKLSAgICAgICAgICBicmVhazsgLy8gdGhlIGNvbXBpbGVkIGZpZWxkIG5hbWUKLSAgICAgICAgfQotICAgICAgfQotICAgICAgaWYgKCFmaWVsZEluZm8udG9PYmplY3RGbikgewotICAgICAgICBvYmpbbmFtZV0gPSB2YWx1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmaWVsZEluZm8uaXNSZXBlYXRlZCkgewotICAgICAgICAgIG9ialtuYW1lXSA9IGpzcGIuTWVzc2FnZS50b09iamVjdExpc3QoCi0gICAgICAgICAgICAgIC8qKiBAdHlwZSB7IUFycmF5PGpzcGIuTWVzc2FnZT59ICovICh2YWx1ZSksCi0gICAgICAgICAgICAgIGZpZWxkSW5mby50b09iamVjdEZuLCBvcHRfaW5jbHVkZUluc3RhbmNlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBvYmpbbmFtZV0gPSBmaWVsZEluZm8udG9PYmplY3RGbihvcHRfaW5jbHVkZUluc3RhbmNlLCB2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBXcml0ZXMgYSBwcm90bydzIGV4dGVuc2lvbiBkYXRhIHRvIGEgYmluYXJ5LWZvcm1hdCBvdXRwdXQgc3RyZWFtLgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBwcm90byBUaGUgcHJvdG8gd2hvc2UgZXh0ZW5zaW9ucyB0byBjb252ZXJ0LgotICogQHBhcmFtIHsqfSB3cml0ZXIgVGhlIGJpbmFyeS1mb3JtYXQgd3JpdGVyIHRvIHdyaXRlIHRvLgotICogQHBhcmFtIHshT2JqZWN0fSBleHRlbnNpb25zIFRoZSBwcm90byBjbGFzcycgcmVnaXN0ZXJlZCBleHRlbnNpb25zLgotICogQHBhcmFtIHtmdW5jdGlvbihqc3BiLkV4dGVuc2lvbkZpZWxkSW5mbykgOiAqfSBnZXRFeHRlbnNpb25GbiBUaGUgcHJvdG8KLSAqICAgICBjbGFzcycgZ2V0RXh0ZW5zaW9uIGZ1bmN0aW9uLiBQYXNzZWQgZm9yIGVmZmVjdGl2ZSBkZWFkIGNvZGUgcmVtb3ZhbC4KLSAqLwotanNwYi5NZXNzYWdlLnNlcmlhbGl6ZUJpbmFyeUV4dGVuc2lvbnMgPSBmdW5jdGlvbihwcm90bywgd3JpdGVyLCBleHRlbnNpb25zLAotICAgIGdldEV4dGVuc2lvbkZuKSB7Ci0gIGZvciAodmFyIGZpZWxkTnVtYmVyIGluIGV4dGVuc2lvbnMpIHsKLSAgICB2YXIgZmllbGRJbmZvID0gZXh0ZW5zaW9uc1tmaWVsZE51bWJlcl07Ci0gICAgLy8gVGhlIG9sZCBjb2RlZ2VuIGRvZXNuJ3QgYWRkIHRoZSBleHRyYSBmaWVsZHMgdG8gRXh0ZW5zaW9uRmllbGRJbmZvLCBzbyB3ZQotICAgIC8vIG5lZWQgdG8gZ3JhY2VmdWxseSBlcnJvci1vdXQgaGVyZSByYXRoZXIgdGhhbiBwcm9kdWNlIGEgbnVsbCBkZXJlZmVyZW5jZQotICAgIC8vIGJlbG93LgotICAgIGlmICghZmllbGRJbmZvLmJpbmFyeVdyaXRlckZuKSB7Ci0gICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgZXh0ZW5zaW9uIHByZXNlbnQgdGhhdCB3YXMgZ2VuZXJhdGVkICcgKwotICAgICAgICAgICAgICAgICAgICAgICd3aXRob3V0IGJpbmFyeSBzZXJpYWxpemF0aW9uIHN1cHBvcnQnKTsKLSAgICB9Ci0gICAgdmFyIHZhbHVlID0gZ2V0RXh0ZW5zaW9uRm4uY2FsbChwcm90bywgZmllbGRJbmZvKTsKLSAgICBpZiAodmFsdWUpIHsKLSAgICAgIGlmIChmaWVsZEluZm8uaXNNZXNzYWdlVHlwZSgpKSB7Ci0gICAgICAgIC8vIElmIHRoZSBtZXNzYWdlIHR5cGUgb2YgdGhlIGV4dGVuc2lvbiB3YXMgZ2VuZXJhdGVkIHdpdGhvdXQgYmluYXJ5Ci0gICAgICAgIC8vIHN1cHBvcnQsIHRoZXJlIG1heSBub3QgYmUgYSBiaW5hcnkgbWVzc2FnZSBzZXJpYWxpemVyIGZ1bmN0aW9uLCBhbmQKLSAgICAgICAgLy8gd2UgY2FuJ3Qga25vdyB3aGVuIHdlIGNvZGVnZW4gdGhlIGV4dGVuZGluZyBtZXNzYWdlIHRoYXQgdGhlIGV4dGVuZGVkCi0gICAgICAgIC8vIG1lc3NhZ2UgbWF5IHJlcXVpcmUgYmluYXJ5IHN1cHBvcnQsIHNvIHdlIGNhbiAqb25seSogY2F0Y2ggdGhpcyBlcnJvcgotICAgICAgICAvLyBoZXJlLCBhdCBydW50aW1lIChhbmQgdGhpcyBkZWNvdXBsZWQgY29kZWdlbiBpcyB0aGUgd2hvbGUgcG9pbnQgb2YKLSAgICAgICAgLy8gZXh0ZW5zaW9ucyEpLgotICAgICAgICBpZiAoZmllbGRJbmZvLmJpbmFyeU1lc3NhZ2VTZXJpYWxpemVGbikgewotICAgICAgICAgIGZpZWxkSW5mby5iaW5hcnlXcml0ZXJGbi5jYWxsKHdyaXRlciwgZmllbGRJbmZvLmZpZWxkSW5kZXgsCi0gICAgICAgICAgICAgIHZhbHVlLCBmaWVsZEluZm8uYmluYXJ5TWVzc2FnZVNlcmlhbGl6ZUZuKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRXJyb3IoJ01lc3NhZ2UgZXh0ZW5zaW9uIHByZXNlbnQgaG9sZGluZyBzdWJtZXNzYWdlICcgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAnd2l0aG91dCBiaW5hcnkgc3VwcG9ydCBlbmFibGVkLCBhbmQgbWVzc2FnZSBpcyAnICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ2JlaW5nIHNlcmlhbGl6ZWQgdG8gYmluYXJ5IGZvcm1hdCcpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZEluZm8uYmluYXJ5V3JpdGVyRm4uY2FsbCh3cml0ZXIsIGZpZWxkSW5mby5maWVsZEluZGV4LCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi0KLS8qKgotICogUmVhZHMgYW4gZXh0ZW5zaW9uIGZpZWxkIGZyb20gdGhlIGdpdmVuIHJlYWRlciBhbmQsIGlmIGEgdmFsaWQgZXh0ZW5zaW9uLAotICogc2V0cyB0aGUgZXh0ZW5zaW9uIHZhbHVlLgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBqc3BiIHByb3RvLgotICogQHBhcmFtIHt7c2tpcEZpZWxkOmZ1bmN0aW9uKCksZ2V0RmllbGROdW1iZXI6ZnVuY3Rpb24oKTpudW1iZXJ9fSByZWFkZXIKLSAqIEBwYXJhbSB7IU9iamVjdH0gZXh0ZW5zaW9ucyBUaGUgZXh0ZW5zaW9ucyBvYmplY3QuCi0gKiBAcGFyYW0ge2Z1bmN0aW9uKGpzcGIuRXh0ZW5zaW9uRmllbGRJbmZvKX0gZ2V0RXh0ZW5zaW9uRm4KLSAqIEBwYXJhbSB7ZnVuY3Rpb24oanNwYi5FeHRlbnNpb25GaWVsZEluZm8sID8pfSBzZXRFeHRlbnNpb25GbgotICovCi1qc3BiLk1lc3NhZ2UucmVhZEJpbmFyeUV4dGVuc2lvbiA9IGZ1bmN0aW9uKG1zZywgcmVhZGVyLCBleHRlbnNpb25zLAotICAgIGdldEV4dGVuc2lvbkZuLCBzZXRFeHRlbnNpb25GbikgewotICB2YXIgZmllbGRJbmZvID0gZXh0ZW5zaW9uc1tyZWFkZXIuZ2V0RmllbGROdW1iZXIoKV07Ci0gIGlmICghZmllbGRJbmZvKSB7Ci0gICAgcmVhZGVyLnNraXBGaWVsZCgpOwotICAgIHJldHVybjsKLSAgfQotICBpZiAoIWZpZWxkSW5mby5iaW5hcnlSZWFkZXJGbikgewotICAgIHRocm93IG5ldyBFcnJvcignRGVzZXJpYWxpemluZyBleHRlbnNpb24gd2hvc2UgZ2VuZXJhdGVkIGNvZGUgZG9lcyBub3QgJyArCi0gICAgICAgICAgICAgICAgICAgICdzdXBwb3J0IGJpbmFyeSBmb3JtYXQnKTsKLSAgfQotCi0gIHZhciB2YWx1ZTsKLSAgaWYgKGZpZWxkSW5mby5pc01lc3NhZ2VUeXBlKCkpIHsKLSAgICB2YWx1ZSA9IG5ldyBmaWVsZEluZm8uY3RvcigpOwotICAgIGZpZWxkSW5mby5iaW5hcnlSZWFkZXJGbi5jYWxsKAotICAgICAgICByZWFkZXIsIHZhbHVlLCBmaWVsZEluZm8uYmluYXJ5TWVzc2FnZURlc2VyaWFsaXplRm4pOwotICB9IGVsc2UgewotICAgIC8vIEFsbCBvdGhlciB0eXBlcy4KLSAgICB2YWx1ZSA9IGZpZWxkSW5mby5iaW5hcnlSZWFkZXJGbi5jYWxsKHJlYWRlcik7Ci0gIH0KLQotICBpZiAoZmllbGRJbmZvLmlzUmVwZWF0ZWQgJiYgIWZpZWxkSW5mby5pc1BhY2tlZCkgewotICAgIHZhciBjdXJyZW50TGlzdCA9IGdldEV4dGVuc2lvbkZuLmNhbGwobXNnLCBmaWVsZEluZm8pOwotICAgIGlmICghY3VycmVudExpc3QpIHsKLSAgICAgIHNldEV4dGVuc2lvbkZuLmNhbGwobXNnLCBmaWVsZEluZm8sIFt2YWx1ZV0pOwotICAgIH0gZWxzZSB7Ci0gICAgICBjdXJyZW50TGlzdC5wdXNoKHZhbHVlKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc2V0RXh0ZW5zaW9uRm4uY2FsbChtc2csIGZpZWxkSW5mbywgdmFsdWUpOwotICB9Ci19OwotCi0KLS8qKgotICogR2V0cyB0aGUgdmFsdWUgb2YgYSBub24tZXh0ZW5zaW9uIGZpZWxkLgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBqc3BiIHByb3RvLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkTnVtYmVyIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcmV0dXJuIHtzdHJpbmd8bnVtYmVyfGJvb2xlYW58VWludDhBcnJheXxBcnJheXxudWxsfHVuZGVmaW5lZH0KLSAqIFRoZSBmaWVsZCdzIHZhbHVlLgotICogQHByb3RlY3RlZAotICovCi1qc3BiLk1lc3NhZ2UuZ2V0RmllbGQgPSBmdW5jdGlvbihtc2csIGZpZWxkTnVtYmVyKSB7Ci0gIGlmIChmaWVsZE51bWJlciA8IG1zZy5waXZvdF8pIHsKLSAgICB2YXIgaW5kZXggPSBqc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKG1zZywgZmllbGROdW1iZXIpOwotICAgIHZhciB2YWwgPSBtc2cuYXJyYXlbaW5kZXhdOwotICAgIGlmICh2YWwgPT09IGpzcGIuTWVzc2FnZS5FTVBUWV9MSVNUX1NFTlRJTkVMXykgewotICAgICAgcmV0dXJuIG1zZy5hcnJheVtpbmRleF0gPSBbXTsKLSAgICB9Ci0gICAgcmV0dXJuIHZhbDsKLSAgfSBlbHNlIHsKLSAgICB2YXIgdmFsID0gbXNnLmV4dGVuc2lvbk9iamVjdF9bZmllbGROdW1iZXJdOwotICAgIGlmICh2YWwgPT09IGpzcGIuTWVzc2FnZS5FTVBUWV9MSVNUX1NFTlRJTkVMXykgewotICAgICAgcmV0dXJuIG1zZy5leHRlbnNpb25PYmplY3RfW2ZpZWxkTnVtYmVyXSA9IFtdOwotICAgIH0KLSAgICByZXR1cm4gdmFsOwotICB9Ci19OwotCi0KLS8qKgotICogR2V0cyB0aGUgdmFsdWUgb2YgYW4gb3B0aW9uYWwgZmxvYXQgb3IgZG91YmxlIGZpZWxkLgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBqc3BiIHByb3RvLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkTnVtYmVyIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcmV0dXJuIHs/bnVtYmVyfHVuZGVmaW5lZH0gVGhlIGZpZWxkJ3MgdmFsdWUuCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5nZXRPcHRpb25hbEZsb2F0aW5nUG9pbnRGaWVsZCA9IGZ1bmN0aW9uKG1zZywgZmllbGROdW1iZXIpIHsKLSAgdmFyIHZhbHVlID0ganNwYi5NZXNzYWdlLmdldEZpZWxkKG1zZywgZmllbGROdW1iZXIpOwotICAvLyBDb252ZXJ0cyAiTmFOIiwgIkluZmluaXR5IiBhbmQgIi1JbmZpbml0eSIgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBudW1iZXJzLgotICByZXR1cm4gdmFsdWUgPT0gbnVsbCA/IHZhbHVlIDogK3ZhbHVlOwotfTsKLQotCi0vKioKLSAqIEdldHMgdGhlIHZhbHVlIG9mIGEgcmVwZWF0ZWQgZmxvYXQgb3IgZG91YmxlIGZpZWxkLgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBqc3BiIHByb3RvLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkTnVtYmVyIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcmV0dXJuIHshQXJyYXk8bnVtYmVyPn0gVGhlIGZpZWxkJ3MgdmFsdWUuCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0aW5nUG9pbnRGaWVsZCA9IGZ1bmN0aW9uKG1zZywgZmllbGROdW1iZXIpIHsKLSAgdmFyIHZhbHVlcyA9IGpzcGIuTWVzc2FnZS5nZXRGaWVsZChtc2csIGZpZWxkTnVtYmVyKTsKLSAgaWYgKCFtc2cuY29udmVydGVkRmxvYXRpbmdQb2ludEZpZWxkc18pIHsKLSAgICBtc2cuY29udmVydGVkRmxvYXRpbmdQb2ludEZpZWxkc18gPSB7fTsKLSAgfQotICBpZiAoIW1zZy5jb252ZXJ0ZWRGbG9hdGluZ1BvaW50RmllbGRzX1tmaWVsZE51bWJlcl0pIHsKLSAgICBmb3IgKHZhciBpID0gMDsgaSA8IHZhbHVlcy5sZW5ndGg7IGkrKykgewotICAgICAgLy8gQ29udmVydHMgIk5hTiIsICJJbmZpbml0eSIgYW5kICItSW5maW5pdHkiIHRvIHRoZWlyIGNvcnJlc3BvbmRpbmcKLSAgICAgIC8vIG51bWJlcnMuCi0gICAgICB2YWx1ZXNbaV0gPSArdmFsdWVzW2ldOwotICAgIH0KLSAgICBtc2cuY29udmVydGVkRmxvYXRpbmdQb2ludEZpZWxkc19bZmllbGROdW1iZXJdID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gLyoqIEB0eXBlIHshQXJyYXk8bnVtYmVyPn0gKi8gKHZhbHVlcyk7Ci19OwotCi0KLS8qKgotICogQ29lcmNlIGEgJ2J5dGVzJyBmaWVsZCB0byBhIGJhc2UgNjQgc3RyaW5nLgotICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheXxudWxsfSB2YWx1ZQotICogQHJldHVybiB7P3N0cmluZ30gVGhlIGZpZWxkJ3MgY29lcmNlZCB2YWx1ZS4KLSAqLwotanNwYi5NZXNzYWdlLmJ5dGVzQXNCNjQgPSBmdW5jdGlvbih2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCBnb29nLmlzU3RyaW5nKHZhbHVlKSkgewotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotICBpZiAoanNwYi5NZXNzYWdlLlNVUFBPUlRTX1VJTlQ4QVJSQVlfICYmIHZhbHVlIGluc3RhbmNlb2YgVWludDhBcnJheSkgewotICAgIHJldHVybiBnb29nLmNyeXB0LmJhc2U2NC5lbmNvZGVCeXRlQXJyYXkodmFsdWUpOwotICB9Ci0gIGdvb2cuYXNzZXJ0cy5mYWlsKCdDYW5ub3QgY29lcmNlIHRvIGI2NCBzdHJpbmc6ICcgKyBnb29nLnR5cGVPZih2YWx1ZSkpOwotICByZXR1cm4gbnVsbDsKLX07Ci0KLQotLyoqCi0gKiBDb2VyY2UgYSAnYnl0ZXMnIGZpZWxkIHRvIGEgVWludDhBcnJheSBieXRlIGJ1ZmZlci4KLSAqIE5vdGUgdGhhdCBVaW50OEFycmF5IGlzIG5vdCBzdXBwb3J0ZWQgb24gSUUgdmVyc2lvbnMgYmVmb3JlIDEwIG5vciBvbiBPcGVyYQotICogTWluaS4gQHNlZSBodHRwOi8vY2FuaXVzZS5jb20vVWludDhBcnJheQotICogQHBhcmFtIHtzdHJpbmd8VWludDhBcnJheXxudWxsfSB2YWx1ZQotICogQHJldHVybiB7P1VpbnQ4QXJyYXl9IFRoZSBmaWVsZCdzIGNvZXJjZWQgdmFsdWUuCi0gKi8KLWpzcGIuTWVzc2FnZS5ieXRlc0FzVTggPSBmdW5jdGlvbih2YWx1ZSkgewotICBpZiAodmFsdWUgPT0gbnVsbCB8fCB2YWx1ZSBpbnN0YW5jZW9mIFVpbnQ4QXJyYXkpIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgaWYgKGdvb2cuaXNTdHJpbmcodmFsdWUpKSB7Ci0gICAgcmV0dXJuIGdvb2cuY3J5cHQuYmFzZTY0LmRlY29kZVN0cmluZ1RvVWludDhBcnJheSh2YWx1ZSk7Ci0gIH0KLSAgZ29vZy5hc3NlcnRzLmZhaWwoJ0Nhbm5vdCBjb2VyY2UgdG8gVWludDhBcnJheTogJyArIGdvb2cudHlwZU9mKHZhbHVlKSk7Ci0gIHJldHVybiBudWxsOwotfTsKLQotCi0vKioKLSAqIENvZXJjZSBhIHJlcGVhdGVkICdieXRlcycgZmllbGQgdG8gYW4gYXJyYXkgb2YgYmFzZSA2NCBzdHJpbmdzLgotICogTm90ZTogdGhlIHJldHVybmVkIGFycmF5IHNob3VsZCBiZSB0cmVhdGVkIGFzIGltbXV0YWJsZS4KLSAqIEBwYXJhbSB7IUFycmF5PHN0cmluZz58IUFycmF5PCFVaW50OEFycmF5Pn0gdmFsdWUKLSAqIEByZXR1cm4geyFBcnJheTxzdHJpbmc/Pn0gVGhlIGZpZWxkJ3MgY29lcmNlZCB2YWx1ZS4KLSAqLwotanNwYi5NZXNzYWdlLmJ5dGVzTGlzdEFzQjY0ID0gZnVuY3Rpb24odmFsdWUpIHsKLSAganNwYi5NZXNzYWdlLmFzc2VydENvbnNpc3RlbnRUeXBlc18odmFsdWUpOwotICBpZiAoIXZhbHVlLmxlbmd0aCB8fCBnb29nLmlzU3RyaW5nKHZhbHVlWzBdKSkgewotICAgIHJldHVybiAvKiogQHR5cGUgeyFBcnJheTxzdHJpbmc+fSAqLyAodmFsdWUpOwotICB9Ci0gIHJldHVybiBnb29nLmFycmF5Lm1hcCh2YWx1ZSwganNwYi5NZXNzYWdlLmJ5dGVzQXNCNjQpOwotfTsKLQotCi0vKioKLSAqIENvZXJjZSBhIHJlcGVhdGVkICdieXRlcycgZmllbGQgdG8gYW4gYXJyYXkgb2YgVWludDhBcnJheSBieXRlIGJ1ZmZlcnMuCi0gKiBOb3RlOiB0aGUgcmV0dXJuZWQgYXJyYXkgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgaW1tdXRhYmxlLgotICogTm90ZSB0aGF0IFVpbnQ4QXJyYXkgaXMgbm90IHN1cHBvcnRlZCBvbiBJRSB2ZXJzaW9ucyBiZWZvcmUgMTAgbm9yIG9uIE9wZXJhCi0gKiBNaW5pLiBAc2VlIGh0dHA6Ly9jYW5pdXNlLmNvbS9VaW50OEFycmF5Ci0gKiBAcGFyYW0geyFBcnJheTxzdHJpbmc+fCFBcnJheTwhVWludDhBcnJheT59IHZhbHVlCi0gKiBAcmV0dXJuIHshQXJyYXk8VWludDhBcnJheT8+fSBUaGUgZmllbGQncyBjb2VyY2VkIHZhbHVlLgotICovCi1qc3BiLk1lc3NhZ2UuYnl0ZXNMaXN0QXNVOCA9IGZ1bmN0aW9uKHZhbHVlKSB7Ci0gIGpzcGIuTWVzc2FnZS5hc3NlcnRDb25zaXN0ZW50VHlwZXNfKHZhbHVlKTsKLSAgaWYgKCF2YWx1ZS5sZW5ndGggfHwgdmFsdWVbMF0gaW5zdGFuY2VvZiBVaW50OEFycmF5KSB7Ci0gICAgcmV0dXJuIC8qKiBAdHlwZSB7IUFycmF5PCFVaW50OEFycmF5Pn0gKi8gKHZhbHVlKTsKLSAgfQotICByZXR1cm4gZ29vZy5hcnJheS5tYXAodmFsdWUsIGpzcGIuTWVzc2FnZS5ieXRlc0FzVTgpOwotfTsKLQotCi0vKioKLSAqIEFzc2VydHMgdGhhdCBhbGwgZWxlbWVudHMgb2YgYW4gYXJyYXkgYXJlIG9mIHRoZSBzYW1lIHR5cGUuCi0gKiBAcGFyYW0ge0FycmF5P30gYXJyYXkgVGhlIGFycmF5IHRvIHRlc3QuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLk1lc3NhZ2UuYXNzZXJ0Q29uc2lzdGVudFR5cGVzXyA9IGZ1bmN0aW9uKGFycmF5KSB7Ci0gIGlmIChnb29nLkRFQlVHICYmIGFycmF5ICYmIGFycmF5Lmxlbmd0aCA+IDEpIHsKLSAgICB2YXIgZXhwZWN0ZWQgPSBnb29nLnR5cGVPZihhcnJheVswXSk7Ci0gICAgZ29vZy5hcnJheS5mb3JFYWNoKGFycmF5LCBmdW5jdGlvbihlKSB7Ci0gICAgICBpZiAoZ29vZy50eXBlT2YoZSkgIT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgZ29vZy5hc3NlcnRzLmZhaWwoJ0luY29uc2lzdGVudCB0eXBlIGluIEpTUEIgcmVwZWF0ZWQgZmllbGQgYXJyYXkuICcgKwotICAgICAgICAgICAgJ0dvdCAnICsgZ29vZy50eXBlT2YoZSkgKyAnIGV4cGVjdGVkICcgKyBleHBlY3RlZCk7Ci0gICAgICB9Ci0gICAgfSk7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBHZXRzIHRoZSB2YWx1ZSBvZiBhIG5vbi1leHRlbnNpb24gcHJpbWl0aXZlIGZpZWxkLCB3aXRoIHByb3RvMyAobm9uLW51bGxhYmxlCi0gKiBwcmltaXRpdmVzKSBzZW1hbnRpY3MuIFJldHVybnMgYGRlZmF1bHRWYWx1ZWAgaWYgdGhlIGZpZWxkIGlzIG5vdCBvdGhlcndpc2UKLSAqIHNldC4KLSAqIEB0ZW1wbGF0ZSBUCi0gKiBAcGFyYW0geyFqc3BiLk1lc3NhZ2V9IG1zZyBBIGpzcGIgcHJvdG8uCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGROdW1iZXIgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7VH0gZGVmYXVsdFZhbHVlIFRoZSBkZWZhdWx0IHZhbHVlLgotICogQHJldHVybiB7VH0gVGhlIGZpZWxkJ3MgdmFsdWUuCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5nZXRGaWVsZFByb3RvMyA9IGZ1bmN0aW9uKG1zZywgZmllbGROdW1iZXIsIGRlZmF1bHRWYWx1ZSkgewotICB2YXIgdmFsdWUgPSBqc3BiLk1lc3NhZ2UuZ2V0RmllbGQobXNnLCBmaWVsZE51bWJlcik7Ci0gIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgcmV0dXJuIGRlZmF1bHRWYWx1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBTZXRzIHRoZSB2YWx1ZSBvZiBhIG5vbi1leHRlbnNpb24gZmllbGQuCi0gKiBAcGFyYW0geyFqc3BiLk1lc3NhZ2V9IG1zZyBBIGpzcGIgcHJvdG8uCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGROdW1iZXIgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7c3RyaW5nfG51bWJlcnxib29sZWFufFVpbnQ4QXJyYXl8QXJyYXl8dW5kZWZpbmVkfSB2YWx1ZSBOZXcgdmFsdWUKLSAqIEBwcm90ZWN0ZWQKLSAqLwotanNwYi5NZXNzYWdlLnNldEZpZWxkID0gZnVuY3Rpb24obXNnLCBmaWVsZE51bWJlciwgdmFsdWUpIHsKLSAgaWYgKGZpZWxkTnVtYmVyIDwgbXNnLnBpdm90XykgewotICAgIG1zZy5hcnJheVtqc3BiLk1lc3NhZ2UuZ2V0SW5kZXhfKG1zZywgZmllbGROdW1iZXIpXSA9IHZhbHVlOwotICB9IGVsc2UgewotICAgIG1zZy5leHRlbnNpb25PYmplY3RfW2ZpZWxkTnVtYmVyXSA9IHZhbHVlOwotICB9Ci19OwotCi0KLS8qKgotICogU2V0cyB0aGUgdmFsdWUgb2YgYSBmaWVsZCBpbiBhIG9uZW9mIHVuaW9uIGFuZCBjbGVhcnMgYWxsIG90aGVyIGZpZWxkcyBpbgotICogdGhlIHVuaW9uLgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBqc3BiIHByb3RvLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkTnVtYmVyIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0geyFBcnJheTxudW1iZXI+fSBvbmVvZiBUaGUgZmllbGRzIGJlbG9uZ2luZyB0byB0aGUgdW5pb24uCi0gKiBAcGFyYW0ge3N0cmluZ3xudW1iZXJ8Ym9vbGVhbnxVaW50OEFycmF5fEFycmF5fHVuZGVmaW5lZH0gdmFsdWUgTmV3IHZhbHVlCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5zZXRPbmVvZkZpZWxkID0gZnVuY3Rpb24obXNnLCBmaWVsZE51bWJlciwgb25lb2YsIHZhbHVlKSB7Ci0gIHZhciBjdXJyZW50Q2FzZSA9IGpzcGIuTWVzc2FnZS5jb21wdXRlT25lb2ZDYXNlKG1zZywgb25lb2YpOwotICBpZiAoY3VycmVudENhc2UgJiYgY3VycmVudENhc2UgIT09IGZpZWxkTnVtYmVyICYmIHZhbHVlICE9PSB1bmRlZmluZWQpIHsKLSAgICBpZiAobXNnLndyYXBwZXJzXyAmJiBjdXJyZW50Q2FzZSBpbiBtc2cud3JhcHBlcnNfKSB7Ci0gICAgICBtc2cud3JhcHBlcnNfW2N1cnJlbnRDYXNlXSA9IHVuZGVmaW5lZDsKLSAgICB9Ci0gICAganNwYi5NZXNzYWdlLnNldEZpZWxkKG1zZywgY3VycmVudENhc2UsIHVuZGVmaW5lZCk7Ci0gIH0KLSAganNwYi5NZXNzYWdlLnNldEZpZWxkKG1zZywgZmllbGROdW1iZXIsIHZhbHVlKTsKLX07Ci0KLQotLyoqCi0gKiBDb21wdXRlcyB0aGUgc2VsZWN0aW9uIGluIGEgb25lb2YgZ3JvdXAgZm9yIHRoZSBnaXZlbiBtZXNzYWdlLCBlbnN1cmluZwotICogb25seSBvbmUgZmllbGQgaXMgc2V0IGluIHRoZSBwcm9jZXNzLgotICoKLSAqIEFjY29yZGluZyB0byB0aGUgcHJvdG9idWYgbGFuZ3VhZ2UgZ3VpZGUgKAotICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvI29uZW9mKSwgImlmIHRoZQotICogcGFyc2VyIGVuY291bnRlcnMgbXVsdGlwbGUgbWVtYmVycyBvZiB0aGUgc2FtZSBvbmVvZiBvbiB0aGUgd2lyZSwgb25seSB0aGUKLSAqIGxhc3QgbWVtYmVyIHNlZW4gaXMgdXNlZCBpbiB0aGUgcGFyc2VkIG1lc3NhZ2UuIiBTaW5jZSBKU1BCIHNlcmlhbGl6ZXMKLSAqIG1lc3NhZ2VzIHRvIGEgSlNPTiBhcnJheSwgdGhlICJsYXN0IG1lbWJlciBzZWVuIiB3aWxsIGFsd2F5cyBiZSB0aGUgZmllbGQKLSAqIHdpdGggdGhlIGdyZWF0ZXN0IGZpZWxkIG51bWJlciAoZGlyZWN0bHkgY29ycmVzcG9uZGluZyB0byB0aGUgZ3JlYXRlc3QKLSAqIGFycmF5IGluZGV4KS4KLSAqCi0gKiBAcGFyYW0geyFqc3BiLk1lc3NhZ2V9IG1zZyBBIGpzcGIgcHJvdG8uCi0gKiBAcGFyYW0geyFBcnJheTxudW1iZXI+fSBvbmVvZiBUaGUgZmllbGQgbnVtYmVycyBiZWxvbmdpbmcgdG8gdGhlIHVuaW9uLgotICogQHJldHVybiB7bnVtYmVyfSBUaGUgZmllbGQgbnVtYmVyIGN1cnJlbnRseSBzZXQgaW4gdGhlIHVuaW9uLCBvciAwIGlmIG5vbmUuCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5jb21wdXRlT25lb2ZDYXNlID0gZnVuY3Rpb24obXNnLCBvbmVvZikgewotICB2YXIgb25lb2ZGaWVsZDsKLSAgdmFyIG9uZW9mVmFsdWU7Ci0KLSAgZ29vZy5hcnJheS5mb3JFYWNoKG9uZW9mLCBmdW5jdGlvbihmaWVsZE51bWJlcikgewotICAgIHZhciB2YWx1ZSA9IGpzcGIuTWVzc2FnZS5nZXRGaWVsZChtc2csIGZpZWxkTnVtYmVyKTsKLSAgICBpZiAoZ29vZy5pc0RlZkFuZE5vdE51bGwodmFsdWUpKSB7Ci0gICAgICBvbmVvZkZpZWxkID0gZmllbGROdW1iZXI7Ci0gICAgICBvbmVvZlZhbHVlID0gdmFsdWU7Ci0gICAgICBqc3BiLk1lc3NhZ2Uuc2V0RmllbGQobXNnLCBmaWVsZE51bWJlciwgdW5kZWZpbmVkKTsKLSAgICB9Ci0gIH0pOwotCi0gIGlmIChvbmVvZkZpZWxkKSB7Ci0gICAgLy8gTkI6IFdlIGtub3cgdGhlIHZhbHVlIGlzIHVuaXF1ZSwgc28gd2UgY2FuIGNhbGwganNwYi5NZXNzYWdlLnNldEZpZWxkCi0gICAgLy8gZGlyZWN0bHkgaW5zdGVhZCBvZiBqcHNiLk1lc3NhZ2Uuc2V0T25lb2ZGaWVsZC4gQWxzbywgc2V0T25lb2ZGaWVsZAotICAgIC8vIGNhbGxzIHRoaXMgZnVuY3Rpb24uCi0gICAganNwYi5NZXNzYWdlLnNldEZpZWxkKG1zZywgb25lb2ZGaWVsZCwgb25lb2ZWYWx1ZSk7Ci0gICAgcmV0dXJuIG9uZW9mRmllbGQ7Ci0gIH0KLQotICByZXR1cm4gMDsKLX07Ci0KLQotLyoqCi0gKiBHZXRzIGFuZCB3cmFwcyBhIHByb3RvIGZpZWxkIG9uIGFjY2Vzcy4KLSAqIEBwYXJhbSB7IWpzcGIuTWVzc2FnZX0gbXNnIEEganNwYiBwcm90by4KLSAqIEBwYXJhbSB7ZnVuY3Rpb24obmV3OmpzcGIuTWVzc2FnZSwgQXJyYXkpfSBjdG9yIENvbnN0cnVjdG9yIGZvciB0aGUgZmllbGQuCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGROdW1iZXIgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7bnVtYmVyPX0gb3B0X3JlcXVpcmVkIFRydWUgKDEpIGlmIHRoaXMgaXMgYSByZXF1aXJlZCBmaWVsZC4KLSAqIEByZXR1cm4ge2pzcGIuTWVzc2FnZX0gVGhlIGZpZWxkIGFzIGEganNwYiBwcm90by4KLSAqIEBwcm90ZWN0ZWQKLSAqLwotanNwYi5NZXNzYWdlLmdldFdyYXBwZXJGaWVsZCA9IGZ1bmN0aW9uKG1zZywgY3RvciwgZmllbGROdW1iZXIsIG9wdF9yZXF1aXJlZCkgewotICAvLyBUT0RPKG13cik6IENvbnNpZGVyIGNvcHlpbmcgZGF0YSBhbmQvb3IgYXJyYXlzLgotICBpZiAoIW1zZy53cmFwcGVyc18pIHsKLSAgICBtc2cud3JhcHBlcnNfID0ge307Ci0gIH0KLSAgaWYgKCFtc2cud3JhcHBlcnNfW2ZpZWxkTnVtYmVyXSkgewotICAgIHZhciBkYXRhID0gLyoqIEB0eXBlIHtBcnJheX0gKi8gKGpzcGIuTWVzc2FnZS5nZXRGaWVsZChtc2csIGZpZWxkTnVtYmVyKSk7Ci0gICAgaWYgKG9wdF9yZXF1aXJlZCB8fCBkYXRhKSB7Ci0gICAgICAvLyBUT0RPKG13cik6IFJlbW92ZSBleGlzdGVuY2UgdGVzdCBmb3IgYWx3YXlzIHZhbGlkIGRlZmF1bHQgcHJvdG9zLgotICAgICAgbXNnLndyYXBwZXJzX1tmaWVsZE51bWJlcl0gPSBuZXcgY3RvcihkYXRhKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIC8qKiBAdHlwZSB7anNwYi5NZXNzYWdlfSAqLyAobXNnLndyYXBwZXJzX1tmaWVsZE51bWJlcl0pOwotfTsKLQotCi0vKioKLSAqIEdldHMgYW5kIHdyYXBzIGEgcmVwZWF0ZWQgcHJvdG8gZmllbGQgb24gYWNjZXNzLgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBqc3BiIHByb3RvLgotICogQHBhcmFtIHtmdW5jdGlvbihuZXc6anNwYi5NZXNzYWdlLCBBcnJheSl9IGN0b3IgQ29uc3RydWN0b3IgZm9yIHRoZSBmaWVsZC4KLSAqIEBwYXJhbSB7bnVtYmVyfSBmaWVsZE51bWJlciBUaGUgZmllbGQgbnVtYmVyLgotICogQHJldHVybiB7QXJyYXk8IWpzcGIuTWVzc2FnZT59IFRoZSByZXBlYXRlZCBmaWVsZCBhcyBhbiBhcnJheSBvZiBwcm90b3MuCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5nZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCA9IGZ1bmN0aW9uKG1zZywgY3RvciwgZmllbGROdW1iZXIpIHsKLSAgaWYgKCFtc2cud3JhcHBlcnNfKSB7Ci0gICAgbXNnLndyYXBwZXJzXyA9IHt9OwotICB9Ci0gIGlmICghbXNnLndyYXBwZXJzX1tmaWVsZE51bWJlcl0pIHsKLSAgICB2YXIgZGF0YSA9IGpzcGIuTWVzc2FnZS5nZXRGaWVsZChtc2csIGZpZWxkTnVtYmVyKTsKLSAgICBmb3IgKHZhciB3cmFwcGVycyA9IFtdLCBpID0gMDsgaSA8IGRhdGEubGVuZ3RoOyBpKyspIHsKLSAgICAgIHdyYXBwZXJzW2ldID0gbmV3IGN0b3IoZGF0YVtpXSk7Ci0gICAgfQotICAgIG1zZy53cmFwcGVyc19bZmllbGROdW1iZXJdID0gd3JhcHBlcnM7Ci0gIH0KLSAgdmFyIHZhbCA9IG1zZy53cmFwcGVyc19bZmllbGROdW1iZXJdOwotICBpZiAodmFsID09IGpzcGIuTWVzc2FnZS5FTVBUWV9MSVNUX1NFTlRJTkVMXykgewotICAgIHZhbCA9IG1zZy53cmFwcGVyc19bZmllbGROdW1iZXJdID0gW107Ci0gIH0KLSAgcmV0dXJuIC8qKiBAdHlwZSB7QXJyYXk8IWpzcGIuTWVzc2FnZT59ICovICh2YWwpOwotfTsKLQotCi0vKioKLSAqIFNldHMgYSBwcm90byBmaWVsZCBhbmQgc3luY3MgaXQgdG8gdGhlIGJhY2tpbmcgYXJyYXkuCi0gKiBAcGFyYW0geyFqc3BiLk1lc3NhZ2V9IG1zZyBBIGpzcGIgcHJvdG8uCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGROdW1iZXIgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7anNwYi5NZXNzYWdlfHVuZGVmaW5lZH0gdmFsdWUgQSBuZXcgdmFsdWUgZm9yIHRoaXMgcHJvdG8gZmllbGQuCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5zZXRXcmFwcGVyRmllbGQgPSBmdW5jdGlvbihtc2csIGZpZWxkTnVtYmVyLCB2YWx1ZSkgewotICBpZiAoIW1zZy53cmFwcGVyc18pIHsKLSAgICBtc2cud3JhcHBlcnNfID0ge307Ci0gIH0KLSAgdmFyIGRhdGEgPSB2YWx1ZSA/IHZhbHVlLnRvQXJyYXkoKSA6IHZhbHVlOwotICBtc2cud3JhcHBlcnNfW2ZpZWxkTnVtYmVyXSA9IHZhbHVlOwotICBqc3BiLk1lc3NhZ2Uuc2V0RmllbGQobXNnLCBmaWVsZE51bWJlciwgZGF0YSk7Ci19OwotCi0KLS8qKgotICogU2V0cyBhIHByb3RvIGZpZWxkIGluIGEgb25lb2YgdW5pb24gYW5kIHN5bmNzIGl0IHRvIHRoZSBiYWNraW5nIGFycmF5LgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBqc3BiIHByb3RvLgotICogQHBhcmFtIHtudW1iZXJ9IGZpZWxkTnVtYmVyIFRoZSBmaWVsZCBudW1iZXIuCi0gKiBAcGFyYW0geyFBcnJheTxudW1iZXI+fSBvbmVvZiBUaGUgZmllbGRzIGJlbG9uZ2luZyB0byB0aGUgdW5pb24uCi0gKiBAcGFyYW0ge2pzcGIuTWVzc2FnZXx1bmRlZmluZWR9IHZhbHVlIEEgbmV3IHZhbHVlIGZvciB0aGlzIHByb3RvIGZpZWxkLgotICogQHByb3RlY3RlZAotICovCi1qc3BiLk1lc3NhZ2Uuc2V0T25lb2ZXcmFwcGVyRmllbGQgPSBmdW5jdGlvbihtc2csIGZpZWxkTnVtYmVyLCBvbmVvZiwgdmFsdWUpIHsKLSAgaWYgKCFtc2cud3JhcHBlcnNfKSB7Ci0gICAgbXNnLndyYXBwZXJzXyA9IHt9OwotICB9Ci0gIHZhciBkYXRhID0gdmFsdWUgPyB2YWx1ZS50b0FycmF5KCkgOiB2YWx1ZTsKLSAgbXNnLndyYXBwZXJzX1tmaWVsZE51bWJlcl0gPSB2YWx1ZTsKLSAganNwYi5NZXNzYWdlLnNldE9uZW9mRmllbGQobXNnLCBmaWVsZE51bWJlciwgb25lb2YsIGRhdGEpOwotfTsKLQotCi0vKioKLSAqIFNldHMgYSByZXBlYXRlZCBwcm90byBmaWVsZCBhbmQgc3luY3MgaXQgdG8gdGhlIGJhY2tpbmcgYXJyYXkuCi0gKiBAcGFyYW0geyFqc3BiLk1lc3NhZ2V9IG1zZyBBIGpzcGIgcHJvdG8uCi0gKiBAcGFyYW0ge251bWJlcn0gZmllbGROdW1iZXIgVGhlIGZpZWxkIG51bWJlci4KLSAqIEBwYXJhbSB7QXJyYXk8IWpzcGIuTWVzc2FnZT58dW5kZWZpbmVkfSB2YWx1ZSBBbiBhcnJheSBvZiBwcm90b3MuCi0gKiBAcHJvdGVjdGVkCi0gKi8KLWpzcGIuTWVzc2FnZS5zZXRSZXBlYXRlZFdyYXBwZXJGaWVsZCA9IGZ1bmN0aW9uKG1zZywgZmllbGROdW1iZXIsIHZhbHVlKSB7Ci0gIGlmICghbXNnLndyYXBwZXJzXykgewotICAgIG1zZy53cmFwcGVyc18gPSB7fTsKLSAgfQotICB2YWx1ZSA9IHZhbHVlIHx8IFtdOwotICBmb3IgKHZhciBkYXRhID0gW10sIGkgPSAwOyBpIDwgdmFsdWUubGVuZ3RoOyBpKyspIHsKLSAgICBkYXRhW2ldID0gdmFsdWVbaV0udG9BcnJheSgpOwotICB9Ci0gIG1zZy53cmFwcGVyc19bZmllbGROdW1iZXJdID0gdmFsdWU7Ci0gIGpzcGIuTWVzc2FnZS5zZXRGaWVsZChtc2csIGZpZWxkTnVtYmVyLCBkYXRhKTsKLX07Ci0KLQotLyoqCi0gKiBDb252ZXJ0cyBhIEpzUGIgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZCBpbnRvIGEgbWFwLiBUaGUgbWFwIHdpbGwgY29udGFpbgotICogcHJvdG9zIHVubGVzcyBhbiBvcHRpb25hbCB0b09iamVjdCBmdW5jdGlvbiBpcyBnaXZlbiwgaW4gd2hpY2ggY2FzZSBpdCB3aWxsCi0gKiBjb250YWluIG9iamVjdHMgc3VpdGFibGUgZm9yIFNveSByZW5kZXJpbmcuCi0gKiBAcGFyYW0geyFBcnJheTxUPn0gZmllbGQgVGhlIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQgdG8gYmUKLSAqICAgICBjb252ZXJ0ZWQuCi0gKiBAcGFyYW0ge2Z1bmN0aW9uKCkgOiBzdHJpbmc/fSBtYXBLZXlHZXR0ZXJGbiBUaGUgZnVuY3Rpb24gdG8gZ2V0IHRoZSBrZXkgb2YKLSAqICAgICB0aGUgbWFwLgotICogQHBhcmFtIHs/ZnVuY3Rpb24oYm9vbGVhbj0pOiBPYmplY3R8Ci0gKiAgICAgZnVuY3Rpb24oKGJvb2xlYW58dW5kZWZpbmVkKSxUKTogT2JqZWN0fSBvcHRfdG9PYmplY3RGbiBUaGUKLSAqICAgICB0b09iamVjdCBmdW5jdGlvbiBmb3IgdGhpcyBmaWVsZC4gV2UgbmVlZCB0byBwYXNzIHRoaXMgZm9yIGVmZmVjdGl2ZQotICogICAgIGRlYWQgY29kZSByZW1vdmFsLgotICogQHBhcmFtIHtib29sZWFuPX0gb3B0X2luY2x1ZGVJbnN0YW5jZSBXaGV0aGVyIHRvIGluY2x1ZGUgdGhlIEpTUEIgaW5zdGFuY2UKLSAqICAgICBmb3IgdHJhbnNpdGlvbmFsIHNveSBwcm90byBzdXBwb3J0OiBodHRwOi8vZ290by9zb3ktcGFyYW0tbWlncmF0aW9uCi0gKiBAcmV0dXJuIHshT2JqZWN0LjxzdHJpbmcsIE9iamVjdD59IEEgbWFwIG9mIHByb3RvIG9yIFNveSBvYmplY3RzLgotICogQHRlbXBsYXRlIFQKLSAqLwotanNwYi5NZXNzYWdlLnRvTWFwID0gZnVuY3Rpb24oCi0gICAgZmllbGQsIG1hcEtleUdldHRlckZuLCBvcHRfdG9PYmplY3RGbiwgb3B0X2luY2x1ZGVJbnN0YW5jZSkgewotICB2YXIgcmVzdWx0ID0ge307Ci0gIGZvciAodmFyIGkgPSAwOyBpIDwgZmllbGQubGVuZ3RoOyBpKyspIHsKLSAgICByZXN1bHRbbWFwS2V5R2V0dGVyRm4uY2FsbChmaWVsZFtpXSldID0gb3B0X3RvT2JqZWN0Rm4gPwotICAgICAgICBvcHRfdG9PYmplY3RGbi5jYWxsKGZpZWxkW2ldLCBvcHRfaW5jbHVkZUluc3RhbmNlLAotICAgICAgICAgICAgLyoqIEB0eXBlIHshanNwYi5NZXNzYWdlfSAqLyAoZmllbGRbaV0pKSA6IGZpZWxkW2ldOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19OwotCi0KLS8qKgotICogUmV0dXJucyB0aGUgaW50ZXJuYWwgYXJyYXkgb2YgdGhpcyBwcm90by4KLSAqIDxwPk5vdGU6IElmIHlvdSB1c2UgdGhpcyBhcnJheSB0byBjb25zdHJ1Y3QgYSBzZWNvbmQgcHJvdG8sIHRoZSBjb250ZW50Ci0gKiB3b3VsZCB0aGVuIGJlIHBhcnRpYWxseSBzaGFyZWQgYmV0d2VlbiB0aGUgdHdvIHByb3Rvcy4KLSAqIEByZXR1cm4geyFBcnJheX0gVGhlIHByb3RvIHJlcHJlc2VudGVkIGFzIGFuIGFycmF5LgotICovCi1qc3BiLk1lc3NhZ2UucHJvdG90eXBlLnRvQXJyYXkgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMuYXJyYXk7Ci19OwotCi0KLQotCi0vKioKLSAqIENyZWF0ZXMgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGludGVybmFsIGRhdGEgYXJyYXkgb2YgdGhpcyBwcm90by4KLSAqIDxwPk5PVEU6IFRoaXMgc3RyaW5nIGlzICpub3QqIHN1aXRhYmxlIGZvciB1c2UgaW4gc2VydmVyIHJlcXVlc3RzLgotICogQHJldHVybiB7c3RyaW5nfSBBIHN0cmluZyByZXByZXNlbnRhdGlvbiBvZiB0aGlzIHByb3RvLgotICogQG92ZXJyaWRlCi0gKi8KLWpzcGIuTWVzc2FnZS5wcm90b3R5cGUudG9TdHJpbmcgPSBmdW5jdGlvbigpIHsKLSAgcmV0dXJuIHRoaXMuYXJyYXkudG9TdHJpbmcoKTsKLX07Ci0KLQotLyoqCi0gKiBHZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZW5zaW9uIGZpZWxkIGZyb20gdGhlIGV4dGVuZGVkIG9iamVjdC4KLSAqIEBwYXJhbSB7anNwYi5FeHRlbnNpb25GaWVsZEluZm8uPFQ+fSBmaWVsZEluZm8gU3BlY2lmaWVzIHRoZSBmaWVsZCB0byBnZXQuCi0gKiBAcmV0dXJuIHtUfSBUaGUgdmFsdWUgb2YgdGhlIGZpZWxkLgotICogQHRlbXBsYXRlIFQKLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS5nZXRFeHRlbnNpb24gPSBmdW5jdGlvbihmaWVsZEluZm8pIHsKLSAgaWYgKCF0aGlzLmV4dGVuc2lvbk9iamVjdF8pIHsKLSAgICByZXR1cm4gdW5kZWZpbmVkOwotICB9Ci0gIGlmICghdGhpcy53cmFwcGVyc18pIHsKLSAgICB0aGlzLndyYXBwZXJzXyA9IHt9OwotICB9Ci0gIHZhciBmaWVsZE51bWJlciA9IGZpZWxkSW5mby5maWVsZEluZGV4OwotICBpZiAoZmllbGRJbmZvLmlzUmVwZWF0ZWQpIHsKLSAgICBpZiAoZmllbGRJbmZvLmlzTWVzc2FnZVR5cGUoKSkgewotICAgICAgaWYgKCF0aGlzLndyYXBwZXJzX1tmaWVsZE51bWJlcl0pIHsKLSAgICAgICAgdGhpcy53cmFwcGVyc19bZmllbGROdW1iZXJdID0KLSAgICAgICAgICAgIGdvb2cuYXJyYXkubWFwKHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tmaWVsZE51bWJlcl0gfHwgW10sCi0gICAgICAgICAgICAgICAgZnVuY3Rpb24oYXJyKSB7Ci0gICAgICAgICAgICAgICAgICByZXR1cm4gbmV3IGZpZWxkSW5mby5jdG9yKGFycik7Ci0gICAgICAgICAgICAgICAgfSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpcy53cmFwcGVyc19bZmllbGROdW1iZXJdOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdGhpcy5leHRlbnNpb25PYmplY3RfW2ZpZWxkTnVtYmVyXTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZpZWxkSW5mby5pc01lc3NhZ2VUeXBlKCkpIHsKLSAgICAgIGlmICghdGhpcy53cmFwcGVyc19bZmllbGROdW1iZXJdICYmIHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tmaWVsZE51bWJlcl0pIHsKLSAgICAgICAgdGhpcy53cmFwcGVyc19bZmllbGROdW1iZXJdID0gbmV3IGZpZWxkSW5mby5jdG9yKAotICAgICAgICAgICAgLyoqIEB0eXBlIHtBcnJheXx1bmRlZmluZWR9ICovICgKLSAgICAgICAgICAgICAgICB0aGlzLmV4dGVuc2lvbk9iamVjdF9bZmllbGROdW1iZXJdKSk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpcy53cmFwcGVyc19bZmllbGROdW1iZXJdOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gdGhpcy5leHRlbnNpb25PYmplY3RfW2ZpZWxkTnVtYmVyXTsKLSAgICB9Ci0gIH0KLX07Ci0KLQotLyoqCi0gKiBTZXRzIHRoZSB2YWx1ZSBvZiB0aGUgZXh0ZW5zaW9uIGZpZWxkIGluIHRoZSBleHRlbmRlZCBvYmplY3QuCi0gKiBAcGFyYW0ge2pzcGIuRXh0ZW5zaW9uRmllbGRJbmZvfSBmaWVsZEluZm8gU3BlY2lmaWVzIHRoZSBmaWVsZCB0byBzZXQuCi0gKiBAcGFyYW0ge2pzcGIuTWVzc2FnZXxzdHJpbmd8VWludDhBcnJheXxudW1iZXJ8Ym9vbGVhbnxBcnJheT99IHZhbHVlIFRoZSB2YWx1ZQotICogICAgIHRvIHNldC4KLSAqLwotanNwYi5NZXNzYWdlLnByb3RvdHlwZS5zZXRFeHRlbnNpb24gPSBmdW5jdGlvbihmaWVsZEluZm8sIHZhbHVlKSB7Ci0gIGlmICghdGhpcy53cmFwcGVyc18pIHsKLSAgICB0aGlzLndyYXBwZXJzXyA9IHt9OwotICB9Ci0gIGpzcGIuTWVzc2FnZS5tYXliZUluaXRFbXB0eUV4dGVuc2lvbk9iamVjdF8odGhpcyk7Ci0gIHZhciBmaWVsZE51bWJlciA9IGZpZWxkSW5mby5maWVsZEluZGV4OwotICBpZiAoZmllbGRJbmZvLmlzUmVwZWF0ZWQpIHsKLSAgICB2YWx1ZSA9IHZhbHVlIHx8IFtdOwotICAgIGlmIChmaWVsZEluZm8uaXNNZXNzYWdlVHlwZSgpKSB7Ci0gICAgICB0aGlzLndyYXBwZXJzX1tmaWVsZE51bWJlcl0gPSB2YWx1ZTsKLSAgICAgIHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tmaWVsZE51bWJlcl0gPSBnb29nLmFycmF5Lm1hcCgKLSAgICAgICAgICAvKiogQHR5cGUge0FycmF5PGpzcGIuTWVzc2FnZT59ICovICh2YWx1ZSksIGZ1bmN0aW9uKG1zZykgewotICAgICAgICByZXR1cm4gbXNnLnRvQXJyYXkoKTsKLSAgICAgIH0pOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmV4dGVuc2lvbk9iamVjdF9bZmllbGROdW1iZXJdID0gdmFsdWU7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChmaWVsZEluZm8uaXNNZXNzYWdlVHlwZSgpKSB7Ci0gICAgICB0aGlzLndyYXBwZXJzX1tmaWVsZE51bWJlcl0gPSB2YWx1ZTsKLSAgICAgIHRoaXMuZXh0ZW5zaW9uT2JqZWN0X1tmaWVsZE51bWJlcl0gPSB2YWx1ZSA/IHZhbHVlLnRvQXJyYXkoKSA6IHZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICB0aGlzLmV4dGVuc2lvbk9iamVjdF9bZmllbGROdW1iZXJdID0gdmFsdWU7Ci0gICAgfQotICB9Ci19OwotCi0KLS8qKgotICogQ3JlYXRlcyBhIGRpZmZlcmVuY2Ugb2JqZWN0IGJldHdlZW4gdHdvIG1lc3NhZ2VzLgotICoKLSAqIFRoZSByZXN1bHQgd2lsbCBjb250YWluIHRoZSB0b3AtbGV2ZWwgZmllbGRzIG9mIG0yIHRoYXQgZGlmZmVyIGZyb20gdGhvc2Ugb2YKLSAqIG0xIGF0IGFueSBsZXZlbCBvZiBuZXN0aW5nLiBObyBkYXRhIGlzIGNsb25lZCwgdGhlIHJlc3VsdCBvYmplY3Qgd2lsbAotICogc2hhcmUgaXRzIHRvcC1sZXZlbCBlbGVtZW50cyB3aXRoIG0yIChidXQgbm90IHdpdGggbTEpLgotICoKLSAqIE5vdGUgdGhhdCByZXBlYXRlZCBmaWVsZHMgc2hvdWxkIG5vdCBoYXZlIG51bGwvdW5kZWZpbmVkIGVsZW1lbnRzLCBidXQgaWYKLSAqIHRoZXkgZG8sIHRoaXMgb3BlcmF0aW9uIHdpbGwgdHJlYXQgcmVwZWF0ZWQgZmllbGRzIG9mIGRpZmZlcmVudCBsZW5ndGggYXMKLSAqIHRoZSBzYW1lIGlmIHRoZSBvbmx5IGRpZmZlcmVuY2UgYmV0d2VlbiB0aGVtIGlzIGR1ZSB0byB0cmFpbGluZwotICogbnVsbC91bmRlZmluZWQgdmFsdWVzLgotICoKLSAqIEBwYXJhbSB7IWpzcGIuTWVzc2FnZX0gbTEgVGhlIGZpcnN0IG1lc3NhZ2Ugb2JqZWN0LgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtMiBUaGUgc2Vjb25kIG1lc3NhZ2Ugb2JqZWN0LgotICogQHJldHVybiB7IWpzcGIuTWVzc2FnZX0gVGhlIGRpZmZlcmVuY2UgcmV0dXJuZWQgYXMgYSBwcm90byBtZXNzYWdlLgotICogICAgIE5vdGUgdGhhdCB0aGUgcmV0dXJuZWQgbWVzc2FnZSBtYXkgYmUgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuIFRoaXMgaXMKLSAqICAgICBjdXJyZW50bHkgdG9sZXJhdGVkIGluIEpzLCBidXQgd291bGQgY2F1c2UgYW4gZXJyb3IgaWYgeW91IHRyaWVkIHRvCi0gKiAgICAgc2VuZCBzdWNoIGEgcHJvdG8gdG8gdGhlIHNlcnZlci4gWW91IGNhbiBhY2Nlc3MgdGhlIHJhdyBkaWZmZXJlbmNlCi0gKiAgICAgYXJyYXkgd2l0aCByZXN1bHQudG9BcnJheSgpLgotICogQHRocm93cyB7RXJyb3J9IElmIHRoZSBtZXNzYWdlcyBhcmUgcmVzcG9uc2VzIHdpdGggZGlmZmVyZW50IHR5cGVzLgotICovCi1qc3BiLk1lc3NhZ2UuZGlmZmVyZW5jZSA9IGZ1bmN0aW9uKG0xLCBtMikgewotICBpZiAoIShtMSBpbnN0YW5jZW9mIG0yLmNvbnN0cnVjdG9yKSkgewotICAgIHRocm93IG5ldyBFcnJvcignTWVzc2FnZXMgaGF2ZSBkaWZmZXJlbnQgdHlwZXMuJyk7Ci0gIH0KLSAgdmFyIGFycjEgPSBtMS50b0FycmF5KCk7Ci0gIHZhciBhcnIyID0gbTIudG9BcnJheSgpOwotICB2YXIgcmVzID0gW107Ci0gIHZhciBzdGFydCA9IDA7Ci0gIHZhciBsZW5ndGggPSBhcnIxLmxlbmd0aCA+IGFycjIubGVuZ3RoID8gYXJyMS5sZW5ndGggOiBhcnIyLmxlbmd0aDsKLSAgaWYgKG0xLmdldEpzUGJNZXNzYWdlSWQoKSkgewotICAgIHJlc1swXSA9IG0xLmdldEpzUGJNZXNzYWdlSWQoKTsKLSAgICBzdGFydCA9IDE7Ci0gIH0KLSAgZm9yICh2YXIgaSA9IHN0YXJ0OyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoIWpzcGIuTWVzc2FnZS5jb21wYXJlRmllbGRzKGFycjFbaV0sIGFycjJbaV0pKSB7Ci0gICAgICByZXNbaV0gPSBhcnIyW2ldOwotICAgIH0KLSAgfQotICByZXR1cm4gbmV3IG0xLmNvbnN0cnVjdG9yKHJlcyk7Ci19OwotCi0KLS8qKgotICogVGVzdHMgd2hldGhlciB0d28gbWVzc2FnZXMgYXJlIGVxdWFsLgotICogQHBhcmFtIHtqc3BiLk1lc3NhZ2V8dW5kZWZpbmVkfSBtMSBUaGUgZmlyc3QgbWVzc2FnZSBvYmplY3QuCi0gKiBAcGFyYW0ge2pzcGIuTWVzc2FnZXx1bmRlZmluZWR9IG0yIFRoZSBzZWNvbmQgbWVzc2FnZSBvYmplY3QuCi0gKiBAcmV0dXJuIHtib29sZWFufSB0cnVlIGlmIGJvdGggbWVzc2FnZXMgYXJlIG51bGwvdW5kZWZpbmVkLCBvciBpZiBib3RoIGFyZQotICogICAgIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGhhdmUgdGhlIHNhbWUgZmllbGQgdmFsdWVzLgotICovCi1qc3BiLk1lc3NhZ2UuZXF1YWxzID0gZnVuY3Rpb24obTEsIG0yKSB7Ci0gIHJldHVybiBtMSA9PSBtMiB8fCAoISEobTEgJiYgbTIpICYmIChtMSBpbnN0YW5jZW9mIG0yLmNvbnN0cnVjdG9yKSAmJgotICAgICAganNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMobTEudG9BcnJheSgpLCBtMi50b0FycmF5KCkpKTsKLX07Ci0KLQotLyoqCi0gKiBDb21wYXJlcyB0d28gbWVzc2FnZSBleHRlbnNpb24gZmllbGRzIHJlY3Vyc2l2ZWx5LgotICogQHBhcmFtIHshT2JqZWN0fSBleHRlbnNpb24xIFRoZSBmaXJzdCBmaWVsZC4KLSAqIEBwYXJhbSB7IU9iamVjdH0gZXh0ZW5zaW9uMiBUaGUgc2Vjb25kIGZpZWxkLgotICogQHJldHVybiB7Ym9vbGVhbn0gdHJ1ZSBpZiB0aGUgZXh0ZW5zaW9ucyBhcmUgbnVsbC91bmRlZmluZWQsIG9yIG90aGVyd2lzZQotICogICAgIGVxdWFsLgotICovCi1qc3BiLk1lc3NhZ2UuY29tcGFyZUV4dGVuc2lvbnMgPSBmdW5jdGlvbihleHRlbnNpb24xLCBleHRlbnNpb24yKSB7Ci0gIGV4dGVuc2lvbjEgPSBleHRlbnNpb24xIHx8IHt9OwotICBleHRlbnNpb24yID0gZXh0ZW5zaW9uMiB8fCB7fTsKLQotICB2YXIga2V5cyA9IHt9OwotICBmb3IgKHZhciBuYW1lIGluIGV4dGVuc2lvbjEpIHsKLSAgICBrZXlzW25hbWVdID0gMDsKLSAgfQotICBmb3IgKHZhciBuYW1lIGluIGV4dGVuc2lvbjIpIHsKLSAgICBrZXlzW25hbWVdID0gMDsKLSAgfQotICBmb3IgKG5hbWUgaW4ga2V5cykgewotICAgIGlmICghanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMoZXh0ZW5zaW9uMVtuYW1lXSwgZXh0ZW5zaW9uMltuYW1lXSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19OwotCi0KLS8qKgotICogQ29tcGFyZXMgdHdvIG1lc3NhZ2UgZmllbGRzIHJlY3Vyc2l2ZWx5LgotICogQHBhcmFtIHsqfSBmaWVsZDEgVGhlIGZpcnN0IGZpZWxkLgotICogQHBhcmFtIHsqfSBmaWVsZDIgVGhlIHNlY29uZCBmaWVsZC4KLSAqIEByZXR1cm4ge2Jvb2xlYW59IHRydWUgaWYgdGhlIGZpZWxkcyBhcmUgbnVsbC91bmRlZmluZWQsIG9yIG90aGVyd2lzZSBlcXVhbC4KLSAqLwotanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMgPSBmdW5jdGlvbihmaWVsZDEsIGZpZWxkMikgewotICAvLyBJZiB0aGUgZmllbGRzIGFyZSB0cml2aWFsbHkgZXF1YWwsIHRoZXkncmUgZXF1YWwuCi0gIGlmIChmaWVsZDEgPT0gZmllbGQyKSByZXR1cm4gdHJ1ZTsKLQotICAvLyBJZiB0aGUgZmllbGRzIGFyZW4ndCB0cml2aWFsbHkgZXF1YWwgYW5kIG9uZSBvZiB0aGVtIGlzbid0IGFuIG9iamVjdCwKLSAgLy8gdGhleSBjYW4ndCBwb3NzaWJseSBiZSBlcXVhbC4KLSAgaWYgKCFnb29nLmlzT2JqZWN0KGZpZWxkMSkgfHwgIWdvb2cuaXNPYmplY3QoZmllbGQyKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIFdlIGhhdmUgdHdvIG9iamVjdHMuIElmIHRoZXkncmUgZGlmZmVyZW50IHR5cGVzLCB0aGV5J3JlIG5vdCBlcXVhbC4KLSAgZmllbGQxID0gLyoqIEB0eXBlIHshT2JqZWN0fSAqLyhmaWVsZDEpOwotICBmaWVsZDIgPSAvKiogQHR5cGUgeyFPYmplY3R9ICovKGZpZWxkMik7Ci0gIGlmIChmaWVsZDEuY29uc3RydWN0b3IgIT0gZmllbGQyLmNvbnN0cnVjdG9yKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gSWYgYm90aCBhcmUgVWludDhBcnJheXMsIGNvbXBhcmUgdGhlbSBlbGVtZW50LWJ5LWVsZW1lbnQuCi0gIGlmIChqc3BiLk1lc3NhZ2UuU1VQUE9SVFNfVUlOVDhBUlJBWV8gJiYgZmllbGQxLmNvbnN0cnVjdG9yID09PSBVaW50OEFycmF5KSB7Ci0gICAgdmFyIGJ5dGVzMSA9IC8qKiBAdHlwZSB7IVVpbnQ4QXJyYXl9ICovKGZpZWxkMSk7Ci0gICAgdmFyIGJ5dGVzMiA9IC8qKiBAdHlwZSB7IVVpbnQ4QXJyYXl9ICovKGZpZWxkMik7Ci0gICAgaWYgKGJ5dGVzMS5sZW5ndGggIT0gYnl0ZXMyLmxlbmd0aCkgcmV0dXJuIGZhbHNlOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgYnl0ZXMxLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBpZiAoYnl0ZXMxW2ldICE9IGJ5dGVzMltpXSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIElmIHRoZXkncmUgYm90aCBBcnJheXMsIGNvbXBhcmUgdGhlbSBlbGVtZW50IGJ5IGVsZW1lbnQgZXhjZXB0IGZvciB0aGUKLSAgLy8gb3B0aW9uYWwgZXh0ZW5zaW9uIG9iamVjdHMgYXQgdGhlIGVuZCwgd2hpY2ggd2UgY29tcGFyZSBzZXBhcmF0ZWx5LgotICBpZiAoZmllbGQxLmNvbnN0cnVjdG9yID09PSBBcnJheSkgewotICAgIHZhciBleHRlbnNpb24xID0gdW5kZWZpbmVkOwotICAgIHZhciBleHRlbnNpb24yID0gdW5kZWZpbmVkOwotCi0gICAgdmFyIGxlbmd0aCA9IE1hdGgubWF4KGZpZWxkMS5sZW5ndGgsIGZpZWxkMi5sZW5ndGgpOwotICAgIGZvciAodmFyIGkgPSAwOyBpIDwgbGVuZ3RoOyBpKyspIHsKLSAgICAgIHZhciB2YWwxID0gZmllbGQxW2ldOwotICAgICAgdmFyIHZhbDIgPSBmaWVsZDJbaV07Ci0KLSAgICAgIGlmICh2YWwxICYmICh2YWwxLmNvbnN0cnVjdG9yID09IE9iamVjdCkpIHsKLSAgICAgICAgZ29vZy5hc3NlcnRzLmFzc2VydChleHRlbnNpb24xID09PSB1bmRlZmluZWQpOwotICAgICAgICBnb29nLmFzc2VydHMuYXNzZXJ0KGkgPT09IGZpZWxkMS5sZW5ndGggLSAxKTsKLSAgICAgICAgZXh0ZW5zaW9uMSA9IHZhbDE7Ci0gICAgICAgIHZhbDEgPSB1bmRlZmluZWQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh2YWwyICYmICh2YWwyLmNvbnN0cnVjdG9yID09IE9iamVjdCkpIHsKLSAgICAgICAgZ29vZy5hc3NlcnRzLmFzc2VydChleHRlbnNpb24yID09PSB1bmRlZmluZWQpOwotICAgICAgICBnb29nLmFzc2VydHMuYXNzZXJ0KGkgPT09IGZpZWxkMi5sZW5ndGggLSAxKTsKLSAgICAgICAgZXh0ZW5zaW9uMiA9IHZhbDI7Ci0gICAgICAgIHZhbDIgPSB1bmRlZmluZWQ7Ci0gICAgICB9Ci0KLSAgICAgIGlmICghanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHModmFsMSwgdmFsMikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChleHRlbnNpb24xIHx8IGV4dGVuc2lvbjIpIHsKLSAgICAgIGV4dGVuc2lvbjEgPSBleHRlbnNpb24xIHx8IHt9OwotICAgICAgZXh0ZW5zaW9uMiA9IGV4dGVuc2lvbjIgfHwge307Ci0gICAgICByZXR1cm4ganNwYi5NZXNzYWdlLmNvbXBhcmVFeHRlbnNpb25zKGV4dGVuc2lvbjEsIGV4dGVuc2lvbjIpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gSWYgdGhleSdyZSBib3RoIHBsYWluIE9iamVjdHMgKGkuZS4gZXh0ZW5zaW9ucyksIGNvbXBhcmUgdGhlbSBhcwotICAvLyBleHRlbnNpb25zLgotICBpZiAoZmllbGQxLmNvbnN0cnVjdG9yID09PSBPYmplY3QpIHsKLSAgICByZXR1cm4ganNwYi5NZXNzYWdlLmNvbXBhcmVFeHRlbnNpb25zKGZpZWxkMSwgZmllbGQyKTsKLSAgfQotCi0gIHRocm93IG5ldyBFcnJvcignSW52YWxpZCB0eXBlIGluIEpTUEIgYXJyYXknKTsKLX07Ci0KLQotLyoqCi0gKiBTdGF0aWMgY2xvbmUgZnVuY3Rpb24uIE5PVEU6IEEgdHlwZS1zYWZlIG1ldGhvZCBjYWxsZWQgImNsb25lTWVzc2FnZSIgZXhpc3RzCi0gKiBvbiBlYWNoIGdlbmVyYXRlZCBKc1BiIGNsYXNzLiBEbyBub3QgY2FsbCB0aGlzIGZ1bmN0aW9uIGRpcmVjdGx5LgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBtZXNzYWdlIHRvIGNsb25lLgotICogQHJldHVybiB7IWpzcGIuTWVzc2FnZX0gQSBkZWVwIGNsb25lIG9mIHRoZSBnaXZlbiBtZXNzYWdlLgotICovCi1qc3BiLk1lc3NhZ2UuY2xvbmUgPSBmdW5jdGlvbihtc2cpIHsKLSAgLy8gQWx0aG91Z2ggd2UgY291bGQgaW5jbHVkZSB0aGUgd3JhcHBlcnMsIHdlIGxlYXZlIHRoZW0gb3V0IGhlcmUuCi0gIHJldHVybiBqc3BiLk1lc3NhZ2UuY2xvbmVNZXNzYWdlKG1zZyk7Ci19OwotCi0KLS8qKgotICogQHBhcmFtIHshanNwYi5NZXNzYWdlfSBtc2cgQSBtZXNzYWdlIHRvIGNsb25lLgotICogQHJldHVybiB7IWpzcGIuTWVzc2FnZX0gQSBkZWVwIGNsb25lIG9mIHRoZSBnaXZlbiBtZXNzYWdlLgotICogQHByb3RlY3RlZAotICovCi1qc3BiLk1lc3NhZ2UuY2xvbmVNZXNzYWdlID0gZnVuY3Rpb24obXNnKSB7Ci0gIC8vIEFsdGhvdWdoIHdlIGNvdWxkIGluY2x1ZGUgdGhlIHdyYXBwZXJzLCB3ZSBsZWF2ZSB0aGVtIG91dCBoZXJlLgotICByZXR1cm4gbmV3IG1zZy5jb25zdHJ1Y3Rvcihqc3BiLk1lc3NhZ2UuY2xvbmVfKG1zZy50b0FycmF5KCkpKTsKLX07Ci0KLQotLyoqCi0gKiBUYWtlcyAyIG1lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUgYW5kIGNvcGllcyB0aGUgY29udGVudHMgb2YgdGhlIGZpcnN0Ci0gKiBtZXNzYWdlIGludG8gdGhlIHNlY29uZC4gQWZ0ZXIgdGhpcyB0aGUgMiBtZXNzYWdlcyB3aWxsIGVxdWFscyBpbiB0ZXJtcyBvZgotICogdmFsdWUgc2VtYW50aWNzIGJ1dCBzaGFyZSBubyBzdGF0ZS4gQWxsIGRhdGEgaW4gdGhlIGRlc3RpbmF0aW9uIG1lc3NhZ2Ugd2lsbAotICogYmUgb3ZlcnJpZGRlbi4KLSAqCi0gKiBAcGFyYW0ge01FU1NBR0V9IGZyb21NZXNzYWdlIE1lc3NhZ2UgdGhhdCB3aWxsIGJlIGNvcGllZCBpbnRvIHRvTWVzc2FnZS4KLSAqIEBwYXJhbSB7TUVTU0FHRX0gdG9NZXNzYWdlIE1lc3NhZ2Ugd2hpY2ggd2lsbCByZWNlaXZlIGEgY29weSBvZiBmcm9tTWVzc2FnZQotICogICAgIGFzIGl0cyBjb250ZW50cy4KLSAqIEB0ZW1wbGF0ZSBNRVNTQUdFCi0gKi8KLWpzcGIuTWVzc2FnZS5jb3B5SW50byA9IGZ1bmN0aW9uKGZyb21NZXNzYWdlLCB0b01lc3NhZ2UpIHsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydEluc3RhbmNlb2YoZnJvbU1lc3NhZ2UsIGpzcGIuTWVzc2FnZSk7Ci0gIGdvb2cuYXNzZXJ0cy5hc3NlcnRJbnN0YW5jZW9mKHRvTWVzc2FnZSwganNwYi5NZXNzYWdlKTsKLSAgZ29vZy5hc3NlcnRzLmFzc2VydChmcm9tTWVzc2FnZS5jb25zdHJ1Y3RvciA9PSB0b01lc3NhZ2UuY29uc3RydWN0b3IsCi0gICAgICAnQ29weSBzb3VyY2UgYW5kIHRhcmdldCBtZXNzYWdlIHNob3VsZCBoYXZlIHRoZSBzYW1lIHR5cGUuJyk7Ci0gIHZhciBjb3B5T2ZGcm9tID0ganNwYi5NZXNzYWdlLmNsb25lKGZyb21NZXNzYWdlKTsKLQotICB2YXIgdG8gPSB0b01lc3NhZ2UudG9BcnJheSgpOwotICB2YXIgZnJvbSA9IGNvcHlPZkZyb20udG9BcnJheSgpOwotCi0gIC8vIEVtcHR5IGRlc3RpbmF0aW9uIGluIGNhc2UgaXQgaGFzIG1vcmUgdmFsdWVzIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgotICB0by5sZW5ndGggPSAwOwotICAvLyBhbmQgdGhlbiBjb3B5IGV2ZXJ5dGhpbmcgZnJvbSB0aGUgbmV3IHRvIHRoZSBleGlzdGluZyBtZXNzYWdlLgotICBmb3IgKHZhciBpID0gMDsgaSA8IGZyb20ubGVuZ3RoOyBpKyspIHsKLSAgICB0b1tpXSA9IGZyb21baV07Ci0gIH0KLQotICAvLyBUaGlzIGlzIGVpdGhlciBudWxsIG9yIGVtcHR5IGZvciBhIGZyZXNoIGNvcHkuCi0gIHRvTWVzc2FnZS53cmFwcGVyc18gPSBjb3B5T2ZGcm9tLndyYXBwZXJzXzsKLSAgLy8gSnVzdCBhIHJlZmVyZW5jZSBpbnRvIHRoZSBzaGFyZWQgYXJyYXkuCi0gIHRvTWVzc2FnZS5leHRlbnNpb25PYmplY3RfID0gY29weU9mRnJvbS5leHRlbnNpb25PYmplY3RfOwotfTsKLQotCi0vKioKLSAqIEhlbHBlciBmb3IgY2xvbmluZyBhbiBpbnRlcm5hbCBKc1BiIG9iamVjdC4KLSAqIEBwYXJhbSB7IU9iamVjdH0gb2JqIEEgSnNQYiBvYmplY3QsIGVnLCBhIGZpZWxkLCB0byBiZSBjbG9uZWQuCi0gKiBAcmV0dXJuIHshT2JqZWN0fSBBIGNsb25lIG9mIHRoZSBpbnB1dCBvYmplY3QuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLk1lc3NhZ2UuY2xvbmVfID0gZnVuY3Rpb24ob2JqKSB7Ci0gIHZhciBvOwotICBpZiAoZ29vZy5pc0FycmF5KG9iaikpIHsKLSAgICAvLyBBbGxvY2F0ZSBhcnJheSBvZiBjb3JyZWN0IHNpemUuCi0gICAgdmFyIGNsb25lZEFycmF5ID0gbmV3IEFycmF5KG9iai5sZW5ndGgpOwotICAgIC8vIFVzZSBhcnJheSBpdGVyYXRpb24gd2hlcmUgcG9zc2libGUgYmVjYXVzZSBpdCBpcyBmYXN0ZXIgdGhhbiBmb3ItaW4uCi0gICAgZm9yICh2YXIgaSA9IDA7IGkgPCBvYmoubGVuZ3RoOyBpKyspIHsKLSAgICAgIGlmICgobyA9IG9ialtpXSkgIT0gbnVsbCkgewotICAgICAgICBjbG9uZWRBcnJheVtpXSA9IHR5cGVvZiBvID09ICdvYmplY3QnID8ganNwYi5NZXNzYWdlLmNsb25lXyhvKSA6IG87Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBjbG9uZWRBcnJheTsKLSAgfQotICB2YXIgY2xvbmUgPSB7fTsKLSAgZm9yICh2YXIga2V5IGluIG9iaikgewotICAgIGlmICgobyA9IG9ialtrZXldKSAhPSBudWxsKSB7Ci0gICAgICBjbG9uZVtrZXldID0gdHlwZW9mIG8gPT0gJ29iamVjdCcgPyBqc3BiLk1lc3NhZ2UuY2xvbmVfKG8pIDogbzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGNsb25lOwotfTsKLQotCi0vKioKLSAqIFJlZ2lzdGVycyBhIEpzUGIgbWVzc2FnZSB0eXBlIGlkIHdpdGggaXRzIGNvbnN0cnVjdG9yLgotICogQHBhcmFtIHtzdHJpbmd9IGlkIFRoZSBpZCBmb3IgdGhpcyB0eXBlIG9mIG1lc3NhZ2UuCi0gKiBAcGFyYW0ge0Z1bmN0aW9ufSBjb25zdHJ1Y3RvciBUaGUgbWVzc2FnZSBjb25zdHJ1Y3Rvci4KLSAqLwotanNwYi5NZXNzYWdlLnJlZ2lzdGVyTWVzc2FnZVR5cGUgPSBmdW5jdGlvbihpZCwgY29uc3RydWN0b3IpIHsKLSAganNwYi5NZXNzYWdlLnJlZ2lzdHJ5X1tpZF0gPSBjb25zdHJ1Y3RvcjsKLSAgLy8gVGhpcyBpcyBuZWVkZWQgc28gd2UgY2FuIGxhdGVyIGFjY2VzcyBtZXNzYWdlSWQgZGlyZWN0bHkgb24gdGhlIGNvbnRydWN0b3IsCi0gIC8vIG90aGVyd2lzZSBpdCBpcyBub3QgYXZhaWxhYmxlIGR1ZSB0byAncHJvcGVydHkgY29sbGFwc2luZycgYnkgdGhlIGNvbXBpbGVyLgotICBjb25zdHJ1Y3Rvci5tZXNzYWdlSWQgPSBpZDsKLX07Ci0KLQotLyoqCi0gKiBUaGUgcmVnaXN0cnkgb2YgbWVzc2FnZSBpZHMgdG8gbWVzc2FnZSBjb25zdHJ1Y3RvcnMuCi0gKiBAcHJpdmF0ZQotICovCi1qc3BiLk1lc3NhZ2UucmVnaXN0cnlfID0ge307Ci0KLQotLyoqCi0gKiBUaGUgZXh0ZW5zaW9ucyByZWdpc3RlcmVkIG9uIE1lc3NhZ2VTZXQuIFRoaXMgaXMgYSBtYXAgb2YgZXh0ZW5zaW9uCi0gKiBmaWVsZCBudW1iZXIgdG8gZmllbGQgaW5mbyBvYmplY3QuIFRoaXMgc2hvdWxkIGJlIGNvbnNpZGVyZWQgYXMgYQotICogcHJpdmF0ZSBBUEkuCi0gKgotICogVGhpcyBpcyBzaW1pbGFyIHRvIFtqc3BiIGNsYXNzIG5hbWVdLmV4dGVuc2lvbnMgb2JqZWN0IGZvcgotICogbm9uLU1lc3NhZ2VTZXQuIFdlIHNwZWNpYWwgY2FzZSBNZXNzYWdlU2V0IHNvIHRoYXQgd2UgZG8gbm90IG5lZWQKLSAqIHRvIGdvb2cucmVxdWlyZSBNZXNzYWdlU2V0IGZyb20gY2xhc3NlcyB0aGF0IGV4dGVuZHMgTWVzc2FnZVNldC4KLSAqCi0gKiBAdHlwZSB7IU9iamVjdC48bnVtYmVyLCBqc3BiLkV4dGVuc2lvbkZpZWxkSW5mbz59Ci0gKi8KLWpzcGIuTWVzc2FnZS5tZXNzYWdlU2V0RXh0ZW5zaW9ucyA9IHt9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvbWVzc2FnZV90ZXN0LmpzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvbWVzc2FnZV90ZXN0LmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMWFkZDVmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL21lc3NhZ2VfdGVzdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDEwMTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRlc3Qgc3VpdGUgaXMgd3JpdHRlbiB1c2luZyBKYXNtaW5lIC0tIHNlZSBodHRwOi8vamFzbWluZS5naXRodWIuaW8vCi0KLWdvb2cuc2V0VGVzdE9ubHkoKTsKLQotZ29vZy5yZXF1aXJlKCdnb29nLmpzb24nKTsKLWdvb2cucmVxdWlyZSgnZ29vZy50ZXN0aW5nLmFzc2VydHMnKTsKLQotLy8gQ29tbW9uSlMtTG9hZEZyb21GaWxlOiBnb29nbGUtcHJvdG9idWYganNwYgotZ29vZy5yZXF1aXJlKCdqc3BiLk1lc3NhZ2UnKTsKLQotLy8gQ29tbW9uSlMtTG9hZEZyb21GaWxlOiB0ZXN0NV9wYiBwcm90by5qc3BiLmV4dHRlc3QuYmV0YQotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLmV4dHRlc3QuYmV0YS5mbG9hdGluZ1N0ckZpZWxkJyk7Ci0KLS8vIENvbW1vbkpTLUxvYWRGcm9tRmlsZTogdGVzdDNfcGIgcHJvdG8uanNwYi5leHR0ZXN0Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIuZXh0dGVzdC5mbG9hdGluZ01zZ0ZpZWxkJyk7Ci0KLS8vIENvbW1vbkpTLUxvYWRGcm9tRmlsZTogdGVzdDRfcGIgcHJvdG8uanNwYi5leHR0ZXN0Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIuZXh0dGVzdC5mbG9hdGluZ01zZ0ZpZWxkVHdvJyk7Ci0KLS8vIENvbW1vbkpTLUxvYWRGcm9tRmlsZTogdGVzdF9wYiBwcm90by5qc3BiLnRlc3QKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5Db21wbGV4Jyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5EZWZhdWx0VmFsdWVzJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5FbXB0eScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuRW51bUNvbnRhaW5lcicpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZmxvYXRpbmdNc2dGaWVsZCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuRmxvYXRpbmdQb2ludEZpZWxkcycpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuZmxvYXRpbmdTdHJGaWVsZCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucycpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuSW5kaXJlY3RFeHRlbnNpb24nKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LklzRXh0ZW5zaW9uJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5PcHRpb25hbEZpZWxkcycpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuT3V0ZXJFbnVtJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5PdXRlck1lc3NhZ2UuQ29tcGxleCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuU2ltcGxlMScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuU2ltcGxlMicpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuU3BlY2lhbENhc2VzJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5UZXN0Q2xvbmUnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LlRlc3RHcm91cCcpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuVGVzdEdyb3VwMScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YnKTsKLWdvb2cucmVxdWlyZSgncHJvdG8uanNwYi50ZXN0LlRlc3RSZXNlcnZlZE5hbWVzJyk7Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5UZXN0UmVzZXJ2ZWROYW1lc0V4dGVuc2lvbicpOwotCi0vLyBDb21tb25KUy1Mb2FkRnJvbUZpbGU6IHRlc3QyX3BiIHByb3RvLmpzcGIudGVzdAotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuRXh0ZW5zaW9uTWVzc2FnZScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuVGVzdEV4dGVuc2lvbnNNZXNzYWdlJyk7Ci0KLQotCi0KLWRlc2NyaWJlKCdNZXNzYWdlIHRlc3Qgc3VpdGUnLCBmdW5jdGlvbigpIHsKLSAgaXQoJ3Rlc3RFbXB0eVByb3RvJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGVtcHR5MSA9IG5ldyBwcm90by5qc3BiLnRlc3QuRW1wdHkoW10pOwotICAgIHZhciBlbXB0eTIgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkVtcHR5KFtdKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoe30sIGVtcHR5MS50b09iamVjdCgpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoJ01lc3NhZ2Ugc2hvdWxkIG5vdCBiZSBjb3JydXB0ZWQ6JywgZW1wdHkyLCBlbXB0eTEpOwotICB9KTsKLQotICBpdCgndGVzdFRvcExldmVsRW51bScsIGZ1bmN0aW9uKCkgewotICAgIHZhciByZXNwb25zZSA9IG5ldyBwcm90by5qc3BiLnRlc3QuRW51bUNvbnRhaW5lcihbXSk7Ci0gICAgcmVzcG9uc2Uuc2V0T3V0ZXJFbnVtKHByb3RvLmpzcGIudGVzdC5PdXRlckVudW0uRk9PKTsKLSAgICBhc3NlcnRFcXVhbHMocHJvdG8uanNwYi50ZXN0Lk91dGVyRW51bS5GT08sIHJlc3BvbnNlLmdldE91dGVyRW51bSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RCeXRlU3RyaW5ncycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBkYXRhID0gbmV3IHByb3RvLmpzcGIudGVzdC5EZWZhdWx0VmFsdWVzKFtdKTsKLSAgICBkYXRhLnNldEJ5dGVzRmllbGQoJ3NvbWVfYnl0ZXMnKTsKLSAgICBhc3NlcnRFcXVhbHMoJ3NvbWVfYnl0ZXMnLCBkYXRhLmdldEJ5dGVzRmllbGQoKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0Q29tcGxleENvbnZlcnNpb24nLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgZGF0YTEgPSBbJ2EnLCwsIFssIDExXSwgW1ssIDIyXSwgWywgMzNdXSwsIFsnczEnLCAnczInXSwsIDFdOwotICAgIHZhciBkYXRhMiA9IFsnYScsLCwgWywgMTFdLCBbWywgMjJdLCBbLCAzM11dLCwgWydzMScsICdzMiddLCwgMV07Ci0gICAgdmFyIGZvbyA9IG5ldyBwcm90by5qc3BiLnRlc3QuQ29tcGxleChkYXRhMSk7Ci0gICAgdmFyIGJhciA9IG5ldyBwcm90by5qc3BiLnRlc3QuQ29tcGxleChkYXRhMik7Ci0gICAgdmFyIHJlc3VsdCA9IGZvby50b09iamVjdCgpOwotICAgIGFzc2VydE9iamVjdEVxdWFscyh7Ci0gICAgICBhU3RyaW5nOiAnYScsCi0gICAgICBhbk91dE9mT3JkZXJCb29sOiAxLAotICAgICAgYU5lc3RlZE1lc3NhZ2U6IHsKLSAgICAgICAgYW5JbnQ6IDExCi0gICAgICB9LAotICAgICAgYVJlcGVhdGVkTWVzc2FnZUxpc3Q6IFt7YW5JbnQ6IDIyfSwge2FuSW50OiAzM31dLAotICAgICAgYVJlcGVhdGVkU3RyaW5nTGlzdDogWydzMScsICdzMiddCi0gICAgfSwgcmVzdWx0KTsKLQotICAgIC8vIE5vdyB0ZXN0IHdpdGggdGhlIGpzcGIgaW5zdGFuY2VzIGluY2x1ZGVkLgotICAgIHJlc3VsdCA9IGZvby50b09iamVjdCh0cnVlIC8qIG9wdF9pbmNsdWRlSW5zdGFuY2UgKi8pOwotICAgIGFzc2VydE9iamVjdEVxdWFscyh7Ci0gICAgICBhU3RyaW5nOiAnYScsCi0gICAgICBhbk91dE9mT3JkZXJCb29sOiAxLAotICAgICAgYU5lc3RlZE1lc3NhZ2U6IHsKLSAgICAgICAgYW5JbnQ6IDExLAotICAgICAgICAkanNwYk1lc3NhZ2VJbnN0YW5jZTogZm9vLmdldEFOZXN0ZWRNZXNzYWdlKCkKLSAgICAgIH0sCi0gICAgICBhUmVwZWF0ZWRNZXNzYWdlTGlzdDogWwotICAgICAgICB7YW5JbnQ6IDIyLCAkanNwYk1lc3NhZ2VJbnN0YW5jZTogZm9vLmdldEFSZXBlYXRlZE1lc3NhZ2VMaXN0KClbMF19LAotICAgICAgICB7YW5JbnQ6IDMzLCAkanNwYk1lc3NhZ2VJbnN0YW5jZTogZm9vLmdldEFSZXBlYXRlZE1lc3NhZ2VMaXN0KClbMV19Ci0gICAgICBdLAotICAgICAgYVJlcGVhdGVkU3RyaW5nTGlzdDogWydzMScsICdzMiddLAotICAgICAgJGpzcGJNZXNzYWdlSW5zdGFuY2U6IGZvbwotICAgIH0sIHJlc3VsdCk7Ci0KLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RNaXNzaW5nRmllbGRzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGZvbyA9IG5ldyBwcm90by5qc3BiLnRlc3QuQ29tcGxleChbCi0gICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIFtdLAotICAgICAgICB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWRdKTsKLSAgICB2YXIgYmFyID0gbmV3IHByb3RvLmpzcGIudGVzdC5Db21wbGV4KFsKLSAgICAgICAgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgW10sCi0gICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZF0pOwotICAgIHZhciByZXN1bHQgPSBmb28udG9PYmplY3QoKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoewotICAgICAgYVN0cmluZzogdW5kZWZpbmVkLAotICAgICAgYW5PdXRPZk9yZGVyQm9vbDogdW5kZWZpbmVkLAotICAgICAgYU5lc3RlZE1lc3NhZ2U6IHsKLSAgICAgICAgYW5JbnQ6IHVuZGVmaW5lZAotICAgICAgfSwKLSAgICAgIC8vIE5vdGU6IEpzUGIgY29udmVydHMgdW5kZWZpbmVkIHJlcGVhdGVkIGZpZWxkcyB0byBlbXB0eSBhcnJheXMuCi0gICAgICBhUmVwZWF0ZWRNZXNzYWdlTGlzdDogW10sCi0gICAgICBhUmVwZWF0ZWRTdHJpbmdMaXN0OiBbXQotICAgIH0sIHJlc3VsdCk7Ci0KLSAgfSk7Ci0KLSAgaXQoJ3Rlc3ROZXN0ZWRDb21wbGV4TWVzc2FnZScsIGZ1bmN0aW9uKCkgewotICAgIC8vIEluc3RhbnRpYXRlIHRoZSBtZXNzYWdlIGFuZCBzZXQgYSB1bmlxdWUgZmllbGQsIGp1c3QgdG8gZW5zdXJlIHRoYXQgd2UKLSAgICAvLyBhcmUgbm90IGdldHRpbmcganNwYi50ZXN0LkNvbXBsZXggaW5zdGVhZC4KLSAgICB2YXIgbXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5PdXRlck1lc3NhZ2UuQ29tcGxleCgpOwotICAgIG1zZy5zZXRJbm5lckNvbXBsZXhGaWVsZCg1KTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RTcGVjaWFsQ2FzZXMnLCBmdW5jdGlvbigpIHsKLSAgICAvLyBOb3RlOiBTb21lIHByb3BlcnR5IG5hbWVzIGFyZSByZXNlcnZlZCBpbiBKYXZhU2NyaXB0LgotICAgIC8vIFRoZXNlIG5hbWVzIGFyZSBjb252ZXJ0ZWQgdG8gdGhlIEpzIHByb3BlcnR5IG5hbWVkIHBiXzxyZXNlcnZlZF9uYW1lPi4KLSAgICB2YXIgc3BlY2lhbCA9Ci0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuU3BlY2lhbENhc2VzKFsnbm9ybWFsJywgJ2RlZmF1bHQnLCAnZnVuY3Rpb24nLAotICAgICAgICAndmFyJ10pOwotICAgIHZhciByZXN1bHQgPSBzcGVjaWFsLnRvT2JqZWN0KCk7Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKHsKLSAgICAgIG5vcm1hbDogJ25vcm1hbCcsCi0gICAgICBwYl9kZWZhdWx0OiAnZGVmYXVsdCcsCi0gICAgICBwYl9mdW5jdGlvbjogJ2Z1bmN0aW9uJywKLSAgICAgIHBiX3ZhcjogJ3ZhcicKLSAgICB9LCByZXN1bHQpOwotICB9KTsKLQotICBpdCgndGVzdERlZmF1bHRWYWx1ZXMnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgZGVmYXVsdFN0cmluZyA9ICJkZWZhdWx0PD5cJ1wiYWJjIjsKLSAgICB2YXIgcmVzcG9uc2UgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkRlZmF1bHRWYWx1ZXMoKTsKLQotICAgIC8vIFRlc3QgdG9PYmplY3QKLSAgICB2YXIgZXhwZWN0ZWRPYmplY3QgPSB7Ci0gICAgICBzdHJpbmdGaWVsZDogZGVmYXVsdFN0cmluZywKLSAgICAgIGJvb2xGaWVsZDogdHJ1ZSwKLSAgICAgIGludEZpZWxkOiAxMSwKLSAgICAgIGVudW1GaWVsZDogMTMsCi0gICAgICBlbXB0eUZpZWxkOiAnJywKLSAgICAgIGJ5dGVzRmllbGQ6ICdiVzl2JwotICAgIH07Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKGV4cGVjdGVkT2JqZWN0LCByZXNwb25zZS50b09iamVjdCgpKTsKLQotCi0gICAgLy8gVGVzdCBnZXR0ZXJzCi0gICAgcmVzcG9uc2UgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkRlZmF1bHRWYWx1ZXMoKTsKLSAgICBhc3NlcnRFcXVhbHMoZGVmYXVsdFN0cmluZywgcmVzcG9uc2UuZ2V0U3RyaW5nRmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIHJlc3BvbnNlLmdldEJvb2xGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTEsIHJlc3BvbnNlLmdldEludEZpZWxkKCkpOwotICAgIGFzc2VydEVxdWFscygxMywgcmVzcG9uc2UuZ2V0RW51bUZpZWxkKCkpOwotICAgIGFzc2VydEVxdWFscygnJywgcmVzcG9uc2UuZ2V0RW1wdHlGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2JXOXYnLCByZXNwb25zZS5nZXRCeXRlc0ZpZWxkKCkpOwotCi0gICAgZnVuY3Rpb24gbWFrZURlZmF1bHQodmFsdWVzKSB7Ci0gICAgICByZXR1cm4gbmV3IHByb3RvLmpzcGIudGVzdC5EZWZhdWx0VmFsdWVzKHZhbHVlcyk7Ci0gICAgfQotCi0gICAgLy8gVGVzdCB3aXRoIHVuZGVmaW5lZCB2YWx1ZXMsCi0gICAgLy8gVXNlIHB1c2ggdG8gd29ya2Fyb3VuZCBJRSB0cmVhdGluZyB1bmRlZmluZWQgYXJyYXkgZWxlbWVudHMgYXMgaG9sZXMuCi0gICAgcmVzcG9uc2UgPSBtYWtlRGVmYXVsdChbdW5kZWZpbmVkLCB1bmRlZmluZWQsIHVuZGVmaW5lZCwgdW5kZWZpbmVkXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTdHJpbmcsIHJlc3BvbnNlLmdldFN0cmluZ0ZpZWxkKCkpOwotICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXNwb25zZS5nZXRCb29sRmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCByZXNwb25zZS5nZXRJbnRGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTMsIHJlc3BvbnNlLmdldEVudW1GaWVsZCgpKTsKLQotICAgIC8vIFRlc3Qgd2l0aCBudWxsIHZhbHVlcywgYXMgd291bGQgYmUgcmV0dXJuZWQgYnkgYSBKU09OIHNlcmlhbGl6ZXIuCi0gICAgcmVzcG9uc2UgPSBtYWtlRGVmYXVsdChbbnVsbCwgbnVsbCwgbnVsbCwgbnVsbF0pOwotICAgIGFzc2VydEVxdWFscyhkZWZhdWx0U3RyaW5nLCByZXNwb25zZS5nZXRTdHJpbmdGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzcG9uc2UuZ2V0Qm9vbEZpZWxkKCkpOwotICAgIGFzc2VydEVxdWFscygxMSwgcmVzcG9uc2UuZ2V0SW50RmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEzLCByZXNwb25zZS5nZXRFbnVtRmllbGQoKSk7Ci0KLSAgICAvLyBUZXN0IHdpdGggZmFsc2UtbGlrZSB2YWx1ZXMuCi0gICAgcmVzcG9uc2UgPSBtYWtlRGVmYXVsdChbJycsIGZhbHNlLCAwLCAwXSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCcnLCByZXNwb25zZS5nZXRTdHJpbmdGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZmFsc2UsIHJlc3BvbnNlLmdldEJvb2xGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzcG9uc2UuZ2V0SW50RmllbGQoKSA9PSAwKTsKLSAgICBhc3NlcnRFcXVhbHModHJ1ZSwgcmVzcG9uc2UuZ2V0RW51bUZpZWxkKCkgPT0gMCk7Ci0KLSAgICAvLyBUZXN0IHRoYXQgY2xlYXJpbmcgdGhlIHZhbHVlcyByZXZlcnRzIHRoZW0gdG8gdGhlIGRlZmF1bHQgc3RhdGUuCi0gICAgcmVzcG9uc2UgPSBtYWtlRGVmYXVsdChbJ2JsYWgnLCBmYWxzZSwgMTExLCA3N10pOwotICAgIHJlc3BvbnNlLmNsZWFyU3RyaW5nRmllbGQoKTsgcmVzcG9uc2UuY2xlYXJCb29sRmllbGQoKTsKLSAgICByZXNwb25zZS5jbGVhckludEZpZWxkKCk7IHJlc3BvbnNlLmNsZWFyRW51bUZpZWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTdHJpbmcsIHJlc3BvbnNlLmdldFN0cmluZ0ZpZWxkKCkpOwotICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXNwb25zZS5nZXRCb29sRmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCByZXNwb25zZS5nZXRJbnRGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTMsIHJlc3BvbnNlLmdldEVudW1GaWVsZCgpKTsKLQotICAgIC8vIFRlc3QgdGhhdCBzZXRGb28obnVsbCkgY2xlYXJzIHRoZSB2YWx1ZXMuCi0gICAgcmVzcG9uc2UgPSBtYWtlRGVmYXVsdChbJ2JsYWgnLCBmYWxzZSwgMTExLCA3N10pOwotICAgIHJlc3BvbnNlLnNldFN0cmluZ0ZpZWxkKG51bGwpOyByZXNwb25zZS5zZXRCb29sRmllbGQobnVsbCk7Ci0gICAgcmVzcG9uc2Uuc2V0SW50RmllbGQodW5kZWZpbmVkKTsgcmVzcG9uc2Uuc2V0RW51bUZpZWxkKHVuZGVmaW5lZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGRlZmF1bHRTdHJpbmcsIHJlc3BvbnNlLmdldFN0cmluZ0ZpZWxkKCkpOwotICAgIGFzc2VydEVxdWFscyh0cnVlLCByZXNwb25zZS5nZXRCb29sRmllbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCByZXNwb25zZS5nZXRJbnRGaWVsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTMsIHJlc3BvbnNlLmdldEVudW1GaWVsZCgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RNZXNzYWdlUmVnaXN0cmF0aW9uJywgZnVuY3Rpb24oKSB7Ci0gICAgLy8gZ29vZy5yZXF1aXJlKFNvbWVSZXNwb25zZSkgd2lsbCBpbmNsdWRlIGl0cyBsaWJyYXJ5LCB3aGljaCB3aWxsIGluCi0gICAgLy8gdHVybiBhZGQgU29tZVJlc3BvbnNlIHRvIHRoZSBtZXNzYWdlIHJlZ2lzdHJ5LgotICAgIGFzc2VydEVxdWFscyhqc3BiLk1lc3NhZ2UucmVnaXN0cnlfWydyZXMnXSwgcHJvdG8uanNwYi50ZXN0LlNvbWVSZXNwb25zZSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0Q2xlYXJGaWVsZHMnLCBmdW5jdGlvbigpIHsKLSAgICAvLyBXZSBkb24ndCBzZXQgJ3Byb3BlcicgZGVmYXVsdHMsIHJhdGhlciwgYm9vbHMsIHN0cmluZ3MsCi0gICAgLy8gZXRjLCBhcmUgY2xlYXJlZCB0byB1bmRlZmluZWQgb3IgbnVsbCBhbmQgdGFrZSBvbiB0aGUgSmF2YXNjcmlwdAotICAgIC8vIG1lYW5pbmcgZm9yIHRoYXQgdmFsdWUuIFJlcGVhdGVkIGZpZWxkcyBhcmUgc2V0IHRvIFtdIHdoZW4gY2xlYXJlZC4KLSAgICB2YXIgZGF0YSA9IFsnc3RyJywgdHJ1ZSwgWzExXSwgW1syMl0sIFszM11dLCBbJ3MxJywgJ3MyJ11dOwotICAgIHZhciBmb28gPSBuZXcgcHJvdG8uanNwYi50ZXN0Lk9wdGlvbmFsRmllbGRzKGRhdGEpOwotICAgIGZvby5jbGVhckFTdHJpbmcoKTsKLSAgICBmb28uY2xlYXJBQm9vbCgpOwotICAgIGZvby5jbGVhckFOZXN0ZWRNZXNzYWdlKCk7Ci0gICAgZm9vLmNsZWFyQVJlcGVhdGVkTWVzc2FnZUxpc3QoKTsKLSAgICBmb28uY2xlYXJBUmVwZWF0ZWRTdHJpbmdMaXN0KCk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKGZvby5nZXRBU3RyaW5nKCkpOwotICAgIGFzc2VydFVuZGVmaW5lZChmb28uZ2V0QUJvb2woKSk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKGZvby5nZXRBTmVzdGVkTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoW10sIGZvby5nZXRBUmVwZWF0ZWRNZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoW10sIGZvby5nZXRBUmVwZWF0ZWRTdHJpbmdMaXN0KCkpOwotICAgIC8vIE5PVEU6IFdlIHdhbnQgdGhlIG1pc3NpbmcgZmllbGRzIGluICdleHBlY3RlZCcgdG8gYmUgdW5kZWZpbmVkLAotICAgIC8vIGJ1dCB3ZSBhY3R1YWxseSBnZXQgYSBzcGFyc2UgYXJyYXkgaW5zdGVhZC4gV2UgY291bGQgdXNlIHNvbWV0aGluZwotICAgIC8vIGxpa2UgWzEsdW5kZWZpbmVkLDJdIHRvIGF2b2lkIHRoaXMsIGV4Y2VwdCB0aGF0IHRoaXMgaXMgc3RpbGwKLSAgICAvLyBzcGFyc2Ugb24gSUUuIE5vIGNvbW1lbnQuLi4KLSAgICB2YXIgZXhwZWN0ZWQgPSBbLCwsIFtdLCBbXV07Ci0gICAgZXhwZWN0ZWRbMF0gPSBleHBlY3RlZFsxXSA9IGV4cGVjdGVkWzJdID0gdW5kZWZpbmVkOwotICAgIGFzc2VydE9iamVjdEVxdWFscyhleHBlY3RlZCwgZm9vLnRvQXJyYXkoKSk7Ci0KLSAgICAvLyBUZXN0IHNldChudWxsKS4gV2UgY291bGQgZGVwcmVjYXRlZCB0aGlzIGluIGZhdm9yIG9mIGNsZWFyKCksIGJ1dAotICAgIC8vIGl0J3MgYWxzbyBjb252ZW5pZW50IHRvIGhhdmUuCi0gICAgZGF0YSA9IFsnc3RyJywgdHJ1ZSwgWzExXSwgW1syMl0sIFszM11dLCBbJ3MxJywgJ3MyJ11dOwotICAgIGZvbyA9IG5ldyBwcm90by5qc3BiLnRlc3QuT3B0aW9uYWxGaWVsZHMoZGF0YSk7Ci0gICAgZm9vLnNldEFTdHJpbmcobnVsbCk7Ci0gICAgZm9vLnNldEFCb29sKG51bGwpOwotICAgIGZvby5zZXRBTmVzdGVkTWVzc2FnZShudWxsKTsKLSAgICBmb28uc2V0QVJlcGVhdGVkTWVzc2FnZUxpc3QobnVsbCk7Ci0gICAgZm9vLnNldEFSZXBlYXRlZFN0cmluZ0xpc3QobnVsbCk7Ci0gICAgYXNzZXJ0TnVsbChmb28uZ2V0QVN0cmluZygpKTsKLSAgICBhc3NlcnROdWxsKGZvby5nZXRBQm9vbCgpKTsKLSAgICBhc3NlcnROdWxsKGZvby5nZXRBTmVzdGVkTWVzc2FnZSgpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoW10sIGZvby5nZXRBUmVwZWF0ZWRNZXNzYWdlTGlzdCgpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoW10sIGZvby5nZXRBUmVwZWF0ZWRTdHJpbmdMaXN0KCkpOwotICAgIGFzc2VydE9iamVjdEVxdWFscyhbbnVsbCwgbnVsbCwgbnVsbCwgW10sIFtdXSwgZm9vLnRvQXJyYXkoKSk7Ci0KLSAgICAvLyBUZXN0IHNldCh1bmRlZmluZWQpLiBBZ2Fpbiwgbm90IHNvbWV0aGluZyB3ZSByZWFsbHkgbmVlZCwgYW5kIG5vdAotICAgIC8vIHN1cHBvcnRlZCBkaXJlY3RseSBieSBvdXIgdHlwaW5nLCBidXQgaXQgc2hvdWxkICdkbyB0aGUgcmlnaHQgdGhpbmcnLgotICAgIGRhdGEgPSBbJ3N0cicsIHRydWUsIFsxMV0sIFtbMjJdLCBbMzNdXSwgWydzMScsICdzMiddXTsKLSAgICBmb28gPSBuZXcgcHJvdG8uanNwYi50ZXN0Lk9wdGlvbmFsRmllbGRzKGRhdGEpOwotICAgIGZvby5zZXRBU3RyaW5nKHVuZGVmaW5lZCk7Ci0gICAgZm9vLnNldEFCb29sKHVuZGVmaW5lZCk7Ci0gICAgZm9vLnNldEFOZXN0ZWRNZXNzYWdlKHVuZGVmaW5lZCk7Ci0gICAgZm9vLnNldEFSZXBlYXRlZE1lc3NhZ2VMaXN0KHVuZGVmaW5lZCk7Ci0gICAgZm9vLnNldEFSZXBlYXRlZFN0cmluZ0xpc3QodW5kZWZpbmVkKTsKLSAgICBhc3NlcnRVbmRlZmluZWQoZm9vLmdldEFTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKGZvby5nZXRBQm9vbCgpKTsKLSAgICBhc3NlcnRVbmRlZmluZWQoZm9vLmdldEFOZXN0ZWRNZXNzYWdlKCkpOwotICAgIGFzc2VydE9iamVjdEVxdWFscyhbXSwgZm9vLmdldEFSZXBlYXRlZE1lc3NhZ2VMaXN0KCkpOwotICAgIGFzc2VydE9iamVjdEVxdWFscyhbXSwgZm9vLmdldEFSZXBlYXRlZFN0cmluZ0xpc3QoKSk7Ci0gICAgZXhwZWN0ZWQgPSBbLCwsIFtdLCBbXV07Ci0gICAgZXhwZWN0ZWRbMF0gPSBleHBlY3RlZFsxXSA9IGV4cGVjdGVkWzJdID0gdW5kZWZpbmVkOwotICAgIGFzc2VydE9iamVjdEVxdWFscyhleHBlY3RlZCwgZm9vLnRvQXJyYXkoKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0RGlmZmVyZW5jZVJhd09iamVjdCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBwMSA9IG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbJ2hpJywgJ2RpZmYnLCB7fV0pOwotICAgIHZhciBwMiA9IG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbJ2hpJywgJ3doYXQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7MTAwMDogJ3VuaXF1ZSd9XSk7Ci0gICAgdmFyIGRpZmYgPSAvKiogQHR5cGUge3Byb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zfSAqLwotICAgICAgICAoanNwYi5NZXNzYWdlLmRpZmZlcmVuY2UocDEsIHAyKSk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKGRpZmYuZ2V0U3RyMSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ3doYXQnLCBkaWZmLmdldFN0cjIoKSk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKGRpZmYuZ2V0U3RyMygpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ3VuaXF1ZScsIGRpZmYuZXh0ZW5zaW9uT2JqZWN0X1sxMDAwXSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0RXF1YWxzU2ltcGxlJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIHMxID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnaGknXSk7Ci0gICAgYXNzZXJ0VHJ1ZShqc3BiLk1lc3NhZ2UuZXF1YWxzKHMxLCBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydoaSddKSkpOwotICAgIGFzc2VydEZhbHNlKGpzcGIuTWVzc2FnZS5lcXVhbHMoczEsIG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ2J5ZSddKSkpOwotICAgIHZhciBzMWIgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydoaScsIFsnaGVsbG8nXV0pOwotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmVxdWFscyhzMWIsCi0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ2hpJywgWydoZWxsbyddXSkpKTsKLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5lcXVhbHMoczFiLAotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydoaScsIFsnaGVsbG8nLCB1bmRlZmluZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZCwgdW5kZWZpbmVkXV0pKSk7Ci0gICAgYXNzZXJ0RmFsc2UoanNwYi5NZXNzYWdlLmVxdWFscyhzMWIsCi0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ25vJywgWydoZWxsbyddXSkpKTsKLSAgICAvLyBUZXN0IHdpdGggbWVzc2FnZXMgb2YgZGlmZmVyZW50IHR5cGVzCi0gICAgdmFyIHMyID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUyKFsnaGknXSk7Ci0gICAgYXNzZXJ0RmFsc2UoanNwYi5NZXNzYWdlLmVxdWFscyhzMSwgczIpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RFcXVhbHNfc29mdENvbXBhcmlzb24nLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgczEgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydoaScsIFtdLCBudWxsXSk7Ci0gICAgYXNzZXJ0VHJ1ZShqc3BiLk1lc3NhZ2UuZXF1YWxzKHMxLAotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydoaScsIFtdXSkpKTsKLQotICAgIHZhciBzMWIgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydoaScsIFtdLCB0cnVlXSk7Ci0gICAgYXNzZXJ0VHJ1ZShqc3BiLk1lc3NhZ2UuZXF1YWxzKHMxYiwKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnaGknLCBbXSwgMV0pKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0RXF1YWxzQ29tcGxleCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBkYXRhMSA9IFsnYScsLCwgWywgMTFdLCBbWywgMjJdLCBbLCAzM11dLCwgWydzMScsICdzMiddLCwgMV07Ci0gICAgdmFyIGRhdGEyID0gWydhJywsLCBbLCAxMV0sIFtbLCAyMl0sIFssIDM0XV0sLCBbJ3MxJywgJ3MyJ10sLCAxXTsKLSAgICB2YXIgZGF0YTMgPSBbJ2EnLCwsIFssIDExXSwgW1ssIDIyXV0sLCBbJ3MxJywgJ3MyJ10sLCAxXTsKLSAgICB2YXIgZGF0YTQgPSBbJ2hpJ107Ci0gICAgdmFyIGMxYSA9IG5ldyBwcm90by5qc3BiLnRlc3QuQ29tcGxleChkYXRhMSk7Ci0gICAgdmFyIGMxYiA9IG5ldyBwcm90by5qc3BiLnRlc3QuQ29tcGxleChkYXRhMSk7Ci0gICAgdmFyIGMyID0gbmV3IHByb3RvLmpzcGIudGVzdC5Db21wbGV4KGRhdGEyKTsKLSAgICB2YXIgYzMgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkNvbXBsZXgoZGF0YTMpOwotICAgIHZhciBzMSA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShkYXRhNCk7Ci0KLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5lcXVhbHMoYzFhLCBjMWIpKTsKLSAgICBhc3NlcnRGYWxzZShqc3BiLk1lc3NhZ2UuZXF1YWxzKGMxYSwgYzIpKTsKLSAgICBhc3NlcnRGYWxzZShqc3BiLk1lc3NhZ2UuZXF1YWxzKGMyLCBjMykpOwotICAgIGFzc2VydEZhbHNlKGpzcGIuTWVzc2FnZS5lcXVhbHMoYzFhLCBzMSkpOwotICB9KTsKLQotICBpdCgndGVzdEVxdWFsc0V4dGVuc2lvbnNDb25zdHJ1Y3RlZCcsIGZ1bmN0aW9uKCkgewotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmVxdWFscygKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFtdKSwKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFt7fV0pCi0gICAgKSk7Ci0gICAgYXNzZXJ0VHJ1ZShqc3BiLk1lc3NhZ2UuZXF1YWxzKAotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0Lkhhc0V4dGVuc2lvbnMoWydoaScsIHsxMDA6IFt7MjAwOiAnYSd9XX1dKSwKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFsnaGknLCB7MTAwOiBbezIwMDogJ2EnfV19XSkKLSAgICApKTsKLSAgICBhc3NlcnRGYWxzZShqc3BiLk1lc3NhZ2UuZXF1YWxzKAotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0Lkhhc0V4dGVuc2lvbnMoWydoaScsIHsxMDA6IFt7MjAwOiAnYSd9XX1dKSwKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFsnaGknLCB7MTAwOiBbezIwMDogJ2InfV19XSkKLSAgICApKTsKLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5lcXVhbHMoCi0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbezEwMDogW3syMDA6ICdhJ31dfV0pLAotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0Lkhhc0V4dGVuc2lvbnMoW3sxMDA6IFt7MjAwOiAnYSd9XX1dKQotICAgICkpOwotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmVxdWFscygKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFt7MTAwOiBbezIwMDogJ2EnfV19XSksCi0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbLCwsIHsxMDA6IFt7MjAwOiAnYSd9XX1dKQotICAgICkpOwotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmVxdWFscygKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFssLCwgezEwMDogW3syMDA6ICdhJ31dfV0pLAotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0Lkhhc0V4dGVuc2lvbnMoW3sxMDA6IFt7MjAwOiAnYSd9XX1dKQotICAgICkpOwotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmVxdWFscygKLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFsnaGknLCB7MTAwOiBbezIwMDogJ2EnfV19XSksCi0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbJ2hpJywsLCB7MTAwOiBbezIwMDogJ2EnfV19XSkKLSAgICApKTsKLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5lcXVhbHMoCi0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbJ2hpJywsLCB7MTAwOiBbezIwMDogJ2EnfV19XSksCi0gICAgICAgIG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbJ2hpJywgezEwMDogW3syMDA6ICdhJ31dfV0pCi0gICAgKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0RXF1YWxzRXh0ZW5zaW9uc1VuY29uc3RydWN0ZWQnLCBmdW5jdGlvbigpIHsKLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5jb21wYXJlRmllbGRzKFtdLCBbe31dKSk7Ci0gICAgYXNzZXJ0VHJ1ZShqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcyhbLCwsIHt9XSwgW10pKTsKLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5jb21wYXJlRmllbGRzKFssLCwge31dLCBbLCwge31dKSk7Ci0gICAgYXNzZXJ0VHJ1ZShqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcygKLSAgICAgICAgWydoaScsIHsxMDA6IFt7MjAwOiAnYSd9XX1dLCBbJ2hpJywgezEwMDogW3syMDA6ICdhJ31dfV0pKTsKLSAgICBhc3NlcnRGYWxzZShqc3BiLk1lc3NhZ2UuY29tcGFyZUZpZWxkcygKLSAgICAgICAgWydoaScsIHsxMDA6IFt7MjAwOiAnYSd9XX1dLCBbJ2hpJywgezEwMDogW3syMDA6ICdiJ31dfV0pKTsKLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5jb21wYXJlRmllbGRzKAotICAgICAgICBbezEwMDogW3syMDA6ICdhJ31dfV0sIFt7MTAwOiBbezIwMDogJ2EnfV19XSkpOwotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMoCi0gICAgICAgIFt7MTAwOiBbezIwMDogJ2EnfV19XSwgWywsLCB7MTAwOiBbezIwMDogJ2EnfV19XSkpOwotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMoCi0gICAgICAgIFssLCwgezEwMDogW3syMDA6ICdhJ31dfV0sIFt7MTAwOiBbezIwMDogJ2EnfV19XSkpOwotICAgIGFzc2VydFRydWUoanNwYi5NZXNzYWdlLmNvbXBhcmVGaWVsZHMoCi0gICAgICAgIFsnaGknLCB7MTAwOiBbezIwMDogJ2EnfV19XSwgWydoaScsLCwgezEwMDogW3syMDA6ICdhJ31dfV0pKTsKLSAgICBhc3NlcnRUcnVlKGpzcGIuTWVzc2FnZS5jb21wYXJlRmllbGRzKAotICAgICAgICBbJ2hpJywsLCB7MTAwOiBbezIwMDogJ2EnfV19XSwgWydoaScsIHsxMDA6IFt7MjAwOiAnYSd9XX1dKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0VG9NYXAnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgcDEgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydrJywgWyd2J11dKTsKLSAgICB2YXIgcDIgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydrMScsIFsndjEnLCAndjInXV0pOwotICAgIHZhciBzb3ltYXAgPSBqc3BiLk1lc3NhZ2UudG9NYXAoW3AxLCBwMl0sCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5TaW1wbGUxLnByb3RvdHlwZS5nZXRBU3RyaW5nLAotICAgICAgICBwcm90by5qc3BiLnRlc3QuU2ltcGxlMS5wcm90b3R5cGUudG9PYmplY3QpOwotICAgIGFzc2VydEVxdWFscygnaycsIHNveW1hcFsnayddLmFTdHJpbmcpOwotICAgIGFzc2VydEFycmF5RXF1YWxzKFsndiddLCBzb3ltYXBbJ2snXS5hUmVwZWF0ZWRTdHJpbmdMaXN0KTsKLSAgICB2YXIgcHJvdG9tYXAgPSBqc3BiLk1lc3NhZ2UudG9NYXAoW3AxLCBwMl0sCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5TaW1wbGUxLnByb3RvdHlwZS5nZXRBU3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2snLCBwcm90b21hcFsnayddLmdldEFTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0QXJyYXlFcXVhbHMoWyd2J10sIHByb3RvbWFwWydrJ10uZ2V0QVJlcGVhdGVkU3RyaW5nTGlzdCgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RDbG9uZScsIGZ1bmN0aW9uKCkgewotICAgIHZhciBvcmlnaW5hbCA9IG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdENsb25lKCk7Ci0gICAgb3JpZ2luYWwuc2V0U3RyKCd2MScpOwotICAgIHZhciBzaW1wbGUxID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsneDEnLCBbJ3kxJywgJ3oxJ11dKTsKLSAgICB2YXIgc2ltcGxlMiA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ3gyJywgWyd5MicsICd6MiddXSk7Ci0gICAgdmFyIHNpbXBsZTMgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWyd4MycsIFsneTMnLCAnejMnXV0pOwotICAgIG9yaWdpbmFsLnNldFNpbXBsZTEoc2ltcGxlMSk7Ci0gICAgb3JpZ2luYWwuc2V0U2ltcGxlMkxpc3QoW3NpbXBsZTIsIHNpbXBsZTNdKTsKLSAgICB2YXIgZXh0ZW5zaW9uID0gbmV3IHByb3RvLmpzcGIudGVzdC5DbG9uZUV4dGVuc2lvbigpOwotICAgIGV4dGVuc2lvbi5zZXRFeHQoJ2UxJyk7Ci0gICAgb3JpZ2luYWwuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5Jc0V4dGVuc2lvbi5leHRGaWVsZCwgZXh0ZW5zaW9uKTsKLSAgICB2YXIgY2xvbmUgPSBvcmlnaW5hbC5jbG9uZU1lc3NhZ2UoKTsKLSAgICBhc3NlcnRBcnJheUVxdWFscyhbJ3YxJywsIFsneDEnLCBbJ3kxJywgJ3oxJ11dLCwKLSAgICAgIFtbJ3gyJywgWyd5MicsICd6MiddXSwgWyd4MycsIFsneTMnLCAnejMnXV1dLCwsIHsgMTAwOiBbLCAnZTEnXSB9XSwKLSAgICAgICAgY2xvbmUudG9BcnJheSgpKTsKLSAgICBjbG9uZS5zZXRTdHIoJ3YyJyk7Ci0gICAgdmFyIHNpbXBsZTQgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydhMScsIFsnYjEnLCAnYzEnXV0pOwotICAgIHZhciBzaW1wbGU1ID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnYTInLCBbJ2IyJywgJ2MyJ11dKTsKLSAgICB2YXIgc2ltcGxlNiA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ2EzJywgWydiMycsICdjMyddXSk7Ci0gICAgY2xvbmUuc2V0U2ltcGxlMShzaW1wbGU0KTsKLSAgICBjbG9uZS5zZXRTaW1wbGUyTGlzdChbc2ltcGxlNSwgc2ltcGxlNl0pOwotICAgIHZhciBuZXdFeHRlbnNpb24gPSBuZXcgcHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uKCk7Ci0gICAgbmV3RXh0ZW5zaW9uLnNldEV4dCgnZTInKTsKLSAgICBjbG9uZS5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uLmV4dEZpZWxkLCBuZXdFeHRlbnNpb24pOwotICAgIGFzc2VydEFycmF5RXF1YWxzKFsndjInLCwgWydhMScsIFsnYjEnLCAnYzEnXV0sLAotICAgICAgW1snYTInLCBbJ2IyJywgJ2MyJ11dLCBbJ2EzJywgWydiMycsICdjMyddXV0sLCwgeyAxMDA6IFssICdlMiddIH1dLAotICAgICAgICBjbG9uZS50b0FycmF5KCkpOwotICAgIGFzc2VydEFycmF5RXF1YWxzKFsndjEnLCwgWyd4MScsIFsneTEnLCAnejEnXV0sLAotICAgICAgW1sneDInLCBbJ3kyJywgJ3oyJ11dLCBbJ3gzJywgWyd5MycsICd6MyddXV0sLCwgeyAxMDA6IFssICdlMSddIH1dLAotICAgICAgICBvcmlnaW5hbC50b0FycmF5KCkpOwotICB9KTsKLQotICBpdCgndGVzdENvcHlJbnRvJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG9yaWdpbmFsID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0Q2xvbmUoKTsKLSAgICBvcmlnaW5hbC5zZXRTdHIoJ3YxJyk7Ci0gICAgdmFyIGRlc3QgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RDbG9uZSgpOwotICAgIGRlc3Quc2V0U3RyKCdvdmVycmlkZScpOwotICAgIHZhciBzaW1wbGUxID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsneDEnLCBbJ3kxJywgJ3oxJ11dKTsKLSAgICB2YXIgc2ltcGxlMiA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ3gyJywgWyd5MicsICd6MiddXSk7Ci0gICAgdmFyIHNpbXBsZTMgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWyd4MycsIFsneTMnLCAnejMnXV0pOwotICAgIHZhciBkZXN0U2ltcGxlMSA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ294MScsIFsnb3kxJywgJ296MSddXSk7Ci0gICAgdmFyIGRlc3RTaW1wbGUyID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnb3gyJywgWydveTInLCAnb3oyJ11dKTsKLSAgICB2YXIgZGVzdFNpbXBsZTMgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlNpbXBsZTEoWydveDMnLCBbJ295MycsICdvejMnXV0pOwotICAgIG9yaWdpbmFsLnNldFNpbXBsZTEoc2ltcGxlMSk7Ci0gICAgb3JpZ2luYWwuc2V0U2ltcGxlMkxpc3QoW3NpbXBsZTIsIHNpbXBsZTNdKTsKLSAgICBkZXN0LnNldFNpbXBsZTEoZGVzdFNpbXBsZTEpOwotICAgIGRlc3Quc2V0U2ltcGxlMkxpc3QoW2Rlc3RTaW1wbGUyLCBkZXN0U2ltcGxlM10pOwotICAgIHZhciBleHRlbnNpb24gPSBuZXcgcHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uKCk7Ci0gICAgZXh0ZW5zaW9uLnNldEV4dCgnZTEnKTsKLSAgICBvcmlnaW5hbC5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uLmV4dEZpZWxkLCBleHRlbnNpb24pOwotCi0gICAganNwYi5NZXNzYWdlLmNvcHlJbnRvKG9yaWdpbmFsLCBkZXN0KTsKLSAgICBhc3NlcnRBcnJheUVxdWFscyhvcmlnaW5hbC50b0FycmF5KCksIGRlc3QudG9BcnJheSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ3gxJywgZGVzdC5nZXRTaW1wbGUxKCkuZ2V0QVN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2UxJywKLSAgICAgICAgZGVzdC5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uLmV4dEZpZWxkKS5nZXRFeHQoKSk7Ci0gICAgZGVzdC5nZXRTaW1wbGUxKCkuc2V0QVN0cmluZygnbmV3IHZhbHVlJyk7Ci0gICAgYXNzZXJ0Tm90RXF1YWxzKGRlc3QuZ2V0U2ltcGxlMSgpLmdldEFTdHJpbmcoKSwKLSAgICAgICAgb3JpZ2luYWwuZ2V0U2ltcGxlMSgpLmdldEFTdHJpbmcoKSk7Ci0gICAgZGVzdC5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LkNsb25lRXh0ZW5zaW9uLmV4dEZpZWxkKS4KLSAgICAgICAgc2V0RXh0KCduZXcgdmFsdWUnKTsKLSAgICBhc3NlcnROb3RFcXVhbHMoCi0gICAgICAgIGRlc3QuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5DbG9uZUV4dGVuc2lvbi5leHRGaWVsZCkuZ2V0RXh0KCksCi0gICAgICAgIG9yaWdpbmFsLmdldEV4dGVuc2lvbigKLSAgICAgICAgICAgIHByb3RvLmpzcGIudGVzdC5DbG9uZUV4dGVuc2lvbi5leHRGaWVsZCkuZ2V0RXh0KCkpOwotICB9KTsKLQotICBpdCgndGVzdENvcHlJbnRvX25vdFNhbWVUeXBlJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGEgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RDbG9uZSgpOwotICAgIHZhciBiID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnc3RyJywgWydzMScsICdzMiddXSk7Ci0KLSAgICB2YXIgZSA9IGFzc2VydFRocm93cyhmdW5jdGlvbigpIHsKLSAgICAgIGpzcGIuTWVzc2FnZS5jb3B5SW50byhhLCBiKTsKLSAgICB9KTsKLSAgICBhc3NlcnRDb250YWlucygnc2hvdWxkIGhhdmUgdGhlIHNhbWUgdHlwZScsIGUubWVzc2FnZSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0RXh0ZW5zaW9ucycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBleHRlbnNpb24xID0gbmV3IHByb3RvLmpzcGIudGVzdC5Jc0V4dGVuc2lvbihbJ2V4dDFmaWVsZCddKTsKLSAgICB2YXIgZXh0ZW5zaW9uMiA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ3N0cicsIFsnczEnLCAnczInXV0pOwotICAgIHZhciBleHRlbmRhYmxlID0gbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFsndjEnLCAndjInLCAndjMnXSk7Ci0gICAgZXh0ZW5kYWJsZS5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LklzRXh0ZW5zaW9uLmV4dEZpZWxkLCBleHRlbnNpb24xKTsKLSAgICBleHRlbmRhYmxlLnNldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuSW5kaXJlY3RFeHRlbnNpb24uc2ltcGxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbjIpOwotICAgIGV4dGVuZGFibGUuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5zdHIsICd4eXp6eScpOwotICAgIGV4dGVuZGFibGUuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5yZXBlYXRlZFN0ckxpc3QsCi0gICAgICAgIFsnYScsICdiJ10pOwotICAgIHZhciBzMSA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ2ZvbycsIFsnczEnLCAnczInXV0pOwotICAgIHZhciBzMiA9IG5ldyBwcm90by5qc3BiLnRlc3QuU2ltcGxlMShbJ2JhcicsIFsndDEnLCAndDInXV0pOwotICAgIGV4dGVuZGFibGUuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuSW5kaXJlY3RFeHRlbnNpb24ucmVwZWF0ZWRTaW1wbGVMaXN0LAotICAgICAgICBbczEsIHMyXSk7Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKGV4dGVuc2lvbjEsCi0gICAgICAgIGV4dGVuZGFibGUuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5Jc0V4dGVuc2lvbi5leHRGaWVsZCkpOwotICAgIGFzc2VydE9iamVjdEVxdWFscyhleHRlbnNpb24yLAotICAgICAgICBleHRlbmRhYmxlLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuSW5kaXJlY3RFeHRlbnNpb24uc2ltcGxlKSk7Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKCd4eXp6eScsCi0gICAgICAgIGV4dGVuZGFibGUuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5zdHIpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoWydhJywgJ2InXSwgZXh0ZW5kYWJsZS5nZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5yZXBlYXRlZFN0ckxpc3QpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoW3MxLCBzMl0sIGV4dGVuZGFibGUuZ2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuSW5kaXJlY3RFeHRlbnNpb24ucmVwZWF0ZWRTaW1wbGVMaXN0KSk7Ci0gICAgLy8gTm90IHN1cHBvcnRlZCB5ZXQsIGJ1dCBpdCBzaG91bGQgd29yay4uLgotICAgIGV4dGVuZGFibGUuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5zaW1wbGUsIG51bGwpOwotICAgIGFzc2VydE51bGwoCi0gICAgICAgIGV4dGVuZGFibGUuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5zaW1wbGUpKTsKLSAgICBleHRlbmRhYmxlLnNldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuSW5kaXJlY3RFeHRlbnNpb24uc3RyLCBudWxsKTsKLSAgICBhc3NlcnROdWxsKGV4dGVuZGFibGUuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5zdHIpKTsKLQotCi0gICAgLy8gRXh0ZW5zaW9uIGZpZWxkcyB3aXRoIGpzcGIuaWdub3JlID0gdHJ1ZSBhcmUgaWdub3JlZC4KLSAgICBhc3NlcnRVbmRlZmluZWQocHJvdG8uanNwYi50ZXN0LkluZGlyZWN0RXh0ZW5zaW9uWydpZ25vcmVkJ10pOwotICAgIGFzc2VydFVuZGVmaW5lZChwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9uc1snaWdub3JlZEZsb2F0aW5nJ10pOwotICB9KTsKLQotICBpdCgndGVzdEZsb2F0aW5nRXh0ZW5zaW9ucycsIGZ1bmN0aW9uKCkgewotICAgIC8vIEZyb20gYW4gYXV0b2dlbmVyYXRlZCBjb250YWluZXIuCi0gICAgdmFyIGV4dGVuZGFibGUgPSBuZXcgcHJvdG8uanNwYi50ZXN0Lkhhc0V4dGVuc2lvbnMoWyd2MScsICd2MicsICd2MyddKTsKLSAgICB2YXIgZXh0ZW5zaW9uID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnZm9vJywgWydzMScsICdzMiddXSk7Ci0gICAgZXh0ZW5kYWJsZS5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LnNpbXBsZTEsIGV4dGVuc2lvbik7Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKGV4dGVuc2lvbiwKLSAgICAgICAgZXh0ZW5kYWJsZS5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LnNpbXBsZTEpKTsKLQotICAgIC8vIEZyb20gX2xpYiBtb2RlLgotICAgIGV4dGVuc2lvbiA9IG5ldyBwcm90by5qc3BiLnRlc3QuRXh0ZW5zaW9uTWVzc2FnZShbJ3MxJ10pOwotICAgIGV4dGVuZGFibGUgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RFeHRlbnNpb25zTWVzc2FnZShbMTZdKTsKLSAgICBleHRlbmRhYmxlLnNldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZmxvYXRpbmdNc2dGaWVsZCwgZXh0ZW5zaW9uKTsKLSAgICBleHRlbmRhYmxlLnNldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuZmxvYXRpbmdTdHJGaWVsZCwgJ3MyJyk7Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKGV4dGVuc2lvbiwKLSAgICAgICAgZXh0ZW5kYWJsZS5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmZsb2F0aW5nTXNnRmllbGQpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoJ3MyJywKLSAgICAgICAgZXh0ZW5kYWJsZS5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LmZsb2F0aW5nU3RyRmllbGQpKTsKLSAgICBhc3NlcnROb3RVbmRlZmluZWQocHJvdG8uanNwYi5leHR0ZXN0LmZsb2F0aW5nTXNnRmllbGQpOwotICAgIGFzc2VydE5vdFVuZGVmaW5lZChwcm90by5qc3BiLmV4dHRlc3QuZmxvYXRpbmdNc2dGaWVsZFR3byk7Ci0gICAgYXNzZXJ0Tm90VW5kZWZpbmVkKHByb3RvLmpzcGIuZXh0dGVzdC5iZXRhLmZsb2F0aW5nU3RyRmllbGQpOwotICB9KTsKLQotICBpdCgndGVzdFRvT2JqZWN0X2V4dGVuZGVkT2JqZWN0JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGV4dGVuc2lvbjEgPSBuZXcgcHJvdG8uanNwYi50ZXN0LklzRXh0ZW5zaW9uKFsnZXh0MWZpZWxkJ10pOwotICAgIHZhciBleHRlbnNpb24yID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnc3RyJywgWydzMScsICdzMiddLCB0cnVlXSk7Ci0gICAgdmFyIGV4dGVuZGFibGUgPSBuZXcgcHJvdG8uanNwYi50ZXN0Lkhhc0V4dGVuc2lvbnMoWyd2MScsICd2MicsICd2MyddKTsKLSAgICBleHRlbmRhYmxlLnNldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuSXNFeHRlbnNpb24uZXh0RmllbGQsIGV4dGVuc2lvbjEpOwotICAgIGV4dGVuZGFibGUuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5JbmRpcmVjdEV4dGVuc2lvbi5zaW1wbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uMik7Ci0gICAgZXh0ZW5kYWJsZS5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LkluZGlyZWN0RXh0ZW5zaW9uLnN0ciwgJ3h5enp5Jyk7Ci0gICAgZXh0ZW5kYWJsZS5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LkluZGlyZWN0RXh0ZW5zaW9uLnJlcGVhdGVkU3RyTGlzdCwKLSAgICAgICAgWydhJywgJ2InXSk7Ci0gICAgdmFyIHMxID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnZm9vJywgWydzMScsICdzMiddLCB0cnVlXSk7Ci0gICAgdmFyIHMyID0gbmV3IHByb3RvLmpzcGIudGVzdC5TaW1wbGUxKFsnYmFyJywgWyd0MScsICd0MiddLCBmYWxzZV0pOwotICAgIGV4dGVuZGFibGUuc2V0RXh0ZW5zaW9uKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuSW5kaXJlY3RFeHRlbnNpb24ucmVwZWF0ZWRTaW1wbGVMaXN0LAotICAgICAgICBbczEsIHMyXSk7Ci0gICAgYXNzZXJ0T2JqZWN0RXF1YWxzKHsKLSAgICAgIHN0cjE6ICd2MScsIHN0cjI6ICd2MicsIHN0cjM6ICd2MycsCi0gICAgICBleHRGaWVsZDogeyBleHQxOiAnZXh0MWZpZWxkJyB9LAotICAgICAgc2ltcGxlOiB7Ci0gICAgICAgIGFTdHJpbmc6ICdzdHInLCBhUmVwZWF0ZWRTdHJpbmdMaXN0OiBbJ3MxJywgJ3MyJ10sIGFCb29sZWFuOiB0cnVlCi0gICAgICB9LAotICAgICAgc3RyOiAneHl6enknLAotICAgICAgcmVwZWF0ZWRTdHJMaXN0OiBbJ2EnLCAnYiddLAotICAgICAgcmVwZWF0ZWRTaW1wbGVMaXN0OiBbCi0gICAgICAgIHsgYVN0cmluZzogJ2ZvbycsIGFSZXBlYXRlZFN0cmluZ0xpc3Q6IFsnczEnLCAnczInXSwgYUJvb2xlYW46IHRydWV9LAotICAgICAgICB7IGFTdHJpbmc6ICdiYXInLCBhUmVwZWF0ZWRTdHJpbmdMaXN0OiBbJ3QxJywgJ3QyJ10sIGFCb29sZWFuOiBmYWxzZX0KLSAgICAgIF0KLSAgICB9LCBleHRlbmRhYmxlLnRvT2JqZWN0KCkpOwotCi0gICAgLy8gTm93LCB3aXRoIGluc3RhbmNlcyBpbmNsdWRlZC4KLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoewotICAgICAgc3RyMTogJ3YxJywgc3RyMjogJ3YyJywgc3RyMzogJ3YzJywKLSAgICAgIGV4dEZpZWxkOiB7Ci0gICAgICAgIGV4dDE6ICdleHQxZmllbGQnLAotICAgICAgICAkanNwYk1lc3NhZ2VJbnN0YW5jZToKLSAgICAgICAgICAgIGV4dGVuZGFibGUuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5Jc0V4dGVuc2lvbi5leHRGaWVsZCkKLSAgICAgIH0sCi0gICAgICBzaW1wbGU6IHsKLSAgICAgICAgYVN0cmluZzogJ3N0cicsCi0gICAgICAgIGFSZXBlYXRlZFN0cmluZ0xpc3Q6IFsnczEnLCAnczInXSwKLSAgICAgICAgYUJvb2xlYW46IHRydWUsCi0gICAgICAgICRqc3BiTWVzc2FnZUluc3RhbmNlOgotICAgICAgICAgICAgZXh0ZW5kYWJsZS5nZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LkluZGlyZWN0RXh0ZW5zaW9uLnNpbXBsZSkKLSAgICAgIH0sCi0gICAgICBzdHI6ICd4eXp6eScsCi0gICAgICByZXBlYXRlZFN0ckxpc3Q6IFsnYScsICdiJ10sCi0gICAgICByZXBlYXRlZFNpbXBsZUxpc3Q6IFt7Ci0gICAgICAgIGFTdHJpbmc6ICdmb28nLAotICAgICAgICBhUmVwZWF0ZWRTdHJpbmdMaXN0OiBbJ3MxJywgJ3MyJ10sCi0gICAgICAgIGFCb29sZWFuOiB0cnVlLAotICAgICAgICAkanNwYk1lc3NhZ2VJbnN0YW5jZTogczEKLSAgICAgIH0sIHsKLSAgICAgICAgYVN0cmluZzogJ2JhcicsCi0gICAgICAgIGFSZXBlYXRlZFN0cmluZ0xpc3Q6IFsndDEnLCAndDInXSwKLSAgICAgICAgYUJvb2xlYW46IGZhbHNlLAotICAgICAgICAkanNwYk1lc3NhZ2VJbnN0YW5jZTogczIKLSAgICAgIH1dLAotICAgICAgJGpzcGJNZXNzYWdlSW5zdGFuY2U6IGV4dGVuZGFibGUKLSAgICB9LCBleHRlbmRhYmxlLnRvT2JqZWN0KHRydWUgLyogb3B0X2luY2x1ZGVJbnN0YW5jZSAqLykpOwotICB9KTsKLQotICBpdCgndGVzdEluaXRpYWxpemF0aW9uX2VtcHR5QXJyYXknLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFtdKTsKLSAgICBpZiAoanNwYi5NZXNzYWdlLk1JTklNSVpFX01FTU9SWV9BTExPQ0FUSU9OUykgewotICAgICAgYXNzZXJ0QXJyYXlFcXVhbHMoW10sIG1zZy50b0FycmF5KCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBFeHRlbnNpb24gb2JqZWN0IGlzIGNyZWF0ZWQgcGFzdCBhbGwgcmVndWxhciBmaWVsZHMuCi0gICAgICBhc3NlcnRBcnJheUVxdWFscyhbLCwsIHt9XSwgbXNnLnRvQXJyYXkoKSk7Ci0gICAgfQotICB9KTsKLQotICBpdCgndGVzdEluaXRpYWxpemF0aW9uX2p1c3RFeHRlbnNpb25PYmplY3QnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5FbXB0eShbezE6ICdoaSd9XSk7Ci0gICAgLy8gVGhlIGV4dGVuc2lvbk9iamVjdCBpcyBub3QgbW92ZWQgZnJvbSBpdHMgb3JpZ2luYWwgbG9jYXRpb24uCi0gICAgYXNzZXJ0QXJyYXlFcXVhbHMoW3sxOiAnaGknfV0sIG1zZy50b0FycmF5KCkpOwotICB9KTsKLQotICBpdCgndGVzdEluaXRpYWxpemF0aW9uX2luY29tcGxldGVMaXN0JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1zZyA9IG5ldyBwcm90by5qc3BiLnRlc3QuRW1wdHkoWzEsIHs0OiAnaGknfV0pOwotICAgIC8vIFRoZSBleHRlbnNpb25PYmplY3QgaXMgbm90IG1vdmVkIGZyb20gaXRzIG9yaWdpbmFsIGxvY2F0aW9uLgotICAgIGFzc2VydEFycmF5RXF1YWxzKFsxLCB7NDogJ2hpJ31dLCBtc2cudG9BcnJheSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RJbml0aWFsaXphdGlvbl9mb3J3YXJkQ29tcGF0aWJsZScsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkVtcHR5KFsxLCAyLCAzLCB7MTogJ2hpJ31dKTsKLSAgICBhc3NlcnRBcnJheUVxdWFscyhbMSwgMiwgMywgezE6ICdoaSd9XSwgbXNnLnRvQXJyYXkoKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0RXh0ZW5kZWRNZXNzYWdlRW5zdXJlT2JqZWN0JywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGRhdGEgPSBuZXcgcHJvdG8uanNwYi50ZXN0Lkhhc0V4dGVuc2lvbnMoWydzdHIxJywKLSAgICAgICAgeydhX2tleSc6ICdhbl9vYmplY3QnfV0pOwotICAgIGFzc2VydEVxdWFscygnYW5fb2JqZWN0JywgZGF0YS5leHRlbnNpb25PYmplY3RfWydhX2tleSddKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RUb09iamVjdF9oYXNFeHRlbnNpb25GaWVsZCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBkYXRhID0gbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKFsnc3RyMScsIHsxMDA6IFsnZXh0MSddfV0pOwotICAgIHZhciBvYmogPSBkYXRhLnRvT2JqZWN0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCdzdHIxJywgb2JqLnN0cjEpOwotICAgIGFzc2VydEVxdWFscygnZXh0MScsIG9iai5leHRGaWVsZC5leHQxKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RHZXRFeHRlbnNpb24nLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgZGF0YSA9IG5ldyBwcm90by5qc3BiLnRlc3QuSGFzRXh0ZW5zaW9ucyhbJ3N0cjEnLCB7MTAwOiBbJ2V4dDEnXX1dKTsKLSAgICBhc3NlcnRFcXVhbHMoJ3N0cjEnLCBkYXRhLmdldFN0cjEoKSk7Ci0gICAgdmFyIGV4dGVuc2lvbiA9IGRhdGEuZ2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5Jc0V4dGVuc2lvbi5leHRGaWVsZCk7Ci0gICAgYXNzZXJ0Tm90TnVsbChleHRlbnNpb24pOwotICAgIGFzc2VydEVxdWFscygnZXh0MScsIGV4dGVuc2lvbi5nZXRFeHQxKCkpOwotICB9KTsKLQotICBpdCgndGVzdFNldEV4dGVuc2lvbicsIGZ1bmN0aW9uKCkgewotICAgIHZhciBkYXRhID0gbmV3IHByb3RvLmpzcGIudGVzdC5IYXNFeHRlbnNpb25zKCk7Ci0gICAgdmFyIGV4dGVuc2lvbk1lc3NhZ2UgPSBuZXcgcHJvdG8uanNwYi50ZXN0LklzRXh0ZW5zaW9uKFsnaXNfZXh0ZW5zaW9uJ10pOwotICAgIGRhdGEuc2V0RXh0ZW5zaW9uKHByb3RvLmpzcGIudGVzdC5Jc0V4dGVuc2lvbi5leHRGaWVsZCwgZXh0ZW5zaW9uTWVzc2FnZSk7Ci0gICAgdmFyIG9iaiA9IGRhdGEudG9PYmplY3QoKTsKLSAgICBhc3NlcnROb3ROdWxsKAotICAgICAgICBkYXRhLmdldEV4dGVuc2lvbihwcm90by5qc3BiLnRlc3QuSXNFeHRlbnNpb24uZXh0RmllbGQpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2lzX2V4dGVuc2lvbicsIG9iai5leHRGaWVsZC5leHQxKTsKLSAgfSk7Ci0KLSAgLyoqCi0gICAqIE5vdGUgdGhhdCBncm91cCBpcyBsb25nIGRlcHJlY2F0ZWQsIHdlIG9ubHkgc3VwcG9ydCBpdCBiZWNhdXNlIEpzUGIgaGFzCi0gICAqIGEgZ29hbCBvZiBiZWluZyBhYmxlIHRvIGdlbmVyYXRlIEpTIGNsYXNzZXMgZm9yIGFsbCBwcm90byBkZXNjcmlwdG9ycy4KLSAgICovCi0gIGl0KCd0ZXN0R3JvdXBzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGdyb3VwID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0R3JvdXAoKTsKLSAgICB2YXIgc29tZUdyb3VwID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0R3JvdXAuUmVwZWF0ZWRHcm91cCgpOwotICAgIHNvbWVHcm91cC5zZXRJZCgnZzEnKTsKLSAgICBzb21lR3JvdXAuc2V0U29tZUJvb2xMaXN0KFt0cnVlLCBmYWxzZV0pOwotICAgIGdyb3VwLnNldFJlcGVhdGVkR3JvdXBMaXN0KFtzb21lR3JvdXBdKTsKLSAgICB2YXIgZ3JvdXBzID0gZ3JvdXAuZ2V0UmVwZWF0ZWRHcm91cExpc3QoKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2cxJywgZ3JvdXBzWzBdLmdldElkKCkpOwotICAgIGFzc2VydE9iamVjdEVxdWFscyhbdHJ1ZSwgZmFsc2VdLCBncm91cHNbMF0uZ2V0U29tZUJvb2xMaXN0KCkpOwotICAgIGFzc2VydE9iamVjdEVxdWFscyh7aWQ6ICdnMScsIHNvbWVCb29sTGlzdDogW3RydWUsIGZhbHNlXX0sCi0gICAgICAgIGdyb3Vwc1swXS50b09iamVjdCgpKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoewotICAgICAgcmVwZWF0ZWRHcm91cExpc3Q6IFt7aWQ6ICdnMScsIHNvbWVCb29sTGlzdDogW3RydWUsIGZhbHNlXX1dLAotICAgICAgcmVxdWlyZWRHcm91cDoge2lkOiB1bmRlZmluZWR9LAotICAgICAgb3B0aW9uYWxHcm91cDogdW5kZWZpbmVkLAotICAgICAgcmVxdWlyZWRTaW1wbGU6IHthUmVwZWF0ZWRTdHJpbmdMaXN0OiBbXSwgYVN0cmluZzogdW5kZWZpbmVkfSwKLSAgICAgIG9wdGlvbmFsU2ltcGxlOiB1bmRlZmluZWQsCi0gICAgICBpZDogdW5kZWZpbmVkCi0gICAgfSwgZ3JvdXAudG9PYmplY3QoKSk7Ci0gICAgdmFyIGdyb3VwMSA9IG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdEdyb3VwMSgpOwotICAgIGdyb3VwMS5zZXRHcm91cChzb21lR3JvdXApOwotICAgIGFzc2VydEVxdWFscyhzb21lR3JvdXAsIGdyb3VwMS5nZXRHcm91cCgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3ROb25FeHRlbnNpb25GaWVsZHNBZnRlckV4dGVuc2lvblJhbmdlJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIGRhdGEgPSBbeycxJzogJ2Ffc3RyaW5nJ31dOwotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5Db21wbGV4KGRhdGEpOwotICAgIGFzc2VydEFycmF5RXF1YWxzKFtdLCBtZXNzYWdlLmdldEFSZXBlYXRlZFN0cmluZ0xpc3QoKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0UmVzZXJ2ZWRHZXR0ZXJOYW1lcycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0UmVzZXJ2ZWROYW1lcygpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uJCgxMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocHJvdG8uanNwYi50ZXN0LlRlc3RSZXNlcnZlZE5hbWVzRXh0ZW5zaW9uLmZvbywgMTIpOwotICAgIGFzc2VydEVxdWFscygxMSwgbWVzc2FnZS5nZXRFeHRlbnNpb24kKCkpOwotICAgIGFzc2VydEVxdWFscygxMiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0UmVzZXJ2ZWROYW1lc0V4dGVuc2lvbi5mb28pKTsKLSAgICBhc3NlcnRPYmplY3RFcXVhbHMoe2V4dGVuc2lvbjogMTEsIGZvbzogMTJ9LCBtZXNzYWdlLnRvT2JqZWN0KCkpOwotICB9KTsKLQotICBpdCgndGVzdEluaXRpYWxpemVNZXNzYWdlV2l0aFVuc2V0T25lb2YnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbWVzc2FnZSA9IG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YoW10pOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mLlBhcnRpYWxPbmVvZkNhc2UuCi0gICAgICAgICAgICBQQVJUSUFMX09ORU9GX05PVF9TRVQsCi0gICAgICAgIG1lc3NhZ2UuZ2V0UGFydGlhbE9uZW9mQ2FzZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5SZWN1cnNpdmVPbmVvZkNhc2UuCi0gICAgICAgICAgICBSRUNVUlNJVkVfT05FT0ZfTk9UX1NFVCwKLSAgICAgICAgbWVzc2FnZS5nZXRSZWN1cnNpdmVPbmVvZkNhc2UoKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0SW5pdGlhbGl6ZU1lc3NhZ2VXaXRoU2luZ2xlVmFsdWVTZXRJbk9uZW9mJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mKFssLCAneCddKTsKLQotICAgIGFzc2VydEVxdWFscygneCcsIG1lc3NhZ2UuZ2V0UG9uZSgpKTsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRQdGhyZWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuUGFydGlhbE9uZW9mQ2FzZS5QT05FLAotICAgICAgICBtZXNzYWdlLmdldFBhcnRpYWxPbmVvZkNhc2UoKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0S2VlcHNMYXN0V2lyZVZhbHVlU2V0SW5Vbmlvbl9tdWx0aXBsZVZhbHVlcycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZihbLCwgJ3gnLCwgJ3knXSk7Ci0KLSAgICBhc3NlcnRVbmRlZmluZWQoJ3gnLCBtZXNzYWdlLmdldFBvbmUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCd5JywgbWVzc2FnZS5nZXRQdGhyZWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuUGFydGlhbE9uZW9mQ2FzZS5QVEhSRUUsCi0gICAgICAgIG1lc3NhZ2UuZ2V0UGFydGlhbE9uZW9mQ2FzZSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RTZXR0aW5nT25lb2ZGaWVsZENsZWFyc090aGVycycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZjsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRQb25lKCkpOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldFB0aHJlZSgpKTsKLQotICAgIG1lc3NhZ2Uuc2V0UG9uZSgnaGknKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2hpJywgbWVzc2FnZS5nZXRQb25lKCkpOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldFB0aHJlZSgpKTsKLQotICAgIG1lc3NhZ2Uuc2V0UHRocmVlKCdieWUnKTsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRQb25lKCkpOwotICAgIGFzc2VydEVxdWFscygnYnllJywgbWVzc2FnZS5nZXRQdGhyZWUoKSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0U2V0dGluZ09uZW9mRmllbGREb2VzTm90Q2xlYXJGaWVsZHNGcm9tT3RoZXJVbmlvbnMnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgb3RoZXIgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mOwotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZjsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRQb25lKCkpOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldFB0aHJlZSgpKTsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRSb25lKCkpOwotCi0gICAgbWVzc2FnZS5zZXRQb25lKCdoaScpOwotICAgIG1lc3NhZ2Uuc2V0Um9uZShvdGhlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKCdoaScsIG1lc3NhZ2UuZ2V0UG9uZSgpKTsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRQdGhyZWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG90aGVyLCBtZXNzYWdlLmdldFJvbmUoKSk7Ci0KLSAgICBtZXNzYWdlLnNldFB0aHJlZSgnYnllJyk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKG1lc3NhZ2UuZ2V0UG9uZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2J5ZScsIG1lc3NhZ2UuZ2V0UHRocmVlKCkpOwotICAgIGFzc2VydEVxdWFscyhvdGhlciwgbWVzc2FnZS5nZXRSb25lKCkpOwotICB9KTsKLQotICBpdCgndGVzdFVuc2V0c09uZW9mQ2FzZVdoZW5GaWVsZElzQ2xlYXJlZCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZjsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5QYXJ0aWFsT25lb2ZDYXNlLgotICAgICAgICAgICAgUEFSVElBTF9PTkVPRl9OT1RfU0VULAotICAgICAgICBtZXNzYWdlLmdldFBhcnRpYWxPbmVvZkNhc2UoKSk7Ci0KLSAgICBtZXNzYWdlLnNldFBvbmUoJ2hpJyk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuUGFydGlhbE9uZW9mQ2FzZS5QT05FLAotICAgICAgICBtZXNzYWdlLmdldFBhcnRpYWxPbmVvZkNhc2UoKSk7Ci0KLSAgICBtZXNzYWdlLmNsZWFyUG9uZSgpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mLlBhcnRpYWxPbmVvZkNhc2UuCi0gICAgICAgICAgICBQQVJUSUFMX09ORU9GX05PVF9TRVQsCi0gICAgICAgIG1lc3NhZ2UuZ2V0UGFydGlhbE9uZW9mQ2FzZSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RNZXNzYWdlV2l0aERlZmF1bHRPbmVvZlZhbHVlcycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZjsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgbWVzc2FnZS5nZXRBb25lKCkpOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldEF0d28oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuRGVmYXVsdE9uZW9mQUNhc2UKLSAgICAgICAgICAgIC5ERUZBVUxUX09ORU9GX0FfTk9UX1NFVCwKLSAgICAgICAgbWVzc2FnZS5nZXREZWZhdWx0T25lb2ZBQ2FzZSgpKTsKLQotICAgIG1lc3NhZ2Uuc2V0QW9uZSg1NjcpOwotICAgIGFzc2VydEVxdWFscyg1NjcsIG1lc3NhZ2UuZ2V0QW9uZSgpKTsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRBdHdvKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mLkRlZmF1bHRPbmVvZkFDYXNlLkFPTkUsCi0gICAgICAgIG1lc3NhZ2UuZ2V0RGVmYXVsdE9uZW9mQUNhc2UoKSk7Ci0KLSAgICBtZXNzYWdlLnNldEF0d28oODkwKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgbWVzc2FnZS5nZXRBb25lKCkpOwotICAgIGFzc2VydEVxdWFscyg4OTAsIG1lc3NhZ2UuZ2V0QXR3bygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5EZWZhdWx0T25lb2ZBQ2FzZS5BVFdPLAotICAgICAgICBtZXNzYWdlLmdldERlZmF1bHRPbmVvZkFDYXNlKCkpOwotCi0gICAgbWVzc2FnZS5jbGVhckF0d28oKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzNCwgbWVzc2FnZS5nZXRBb25lKCkpOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldEF0d28oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuRGVmYXVsdE9uZW9mQUNhc2UKLSAgICAgICAgICAgIC5ERUZBVUxUX09ORU9GX0FfTk9UX1NFVCwKLSAgICAgICAgbWVzc2FnZS5nZXREZWZhdWx0T25lb2ZBQ2FzZSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RNZXNzYWdlV2l0aERlZmF1bHRPbmVvZlZhbHVlc19kZWZhdWx0Tm90T25GaXJzdEZpZWxkJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldEJvbmUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMzQsIG1lc3NhZ2UuZ2V0QnR3bygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5EZWZhdWx0T25lb2ZCQ2FzZQotICAgICAgICAgICAgLkRFRkFVTFRfT05FT0ZfQl9OT1RfU0VULAotICAgICAgICBtZXNzYWdlLmdldERlZmF1bHRPbmVvZkJDYXNlKCkpOwotCi0gICAgbWVzc2FnZS5zZXRCb25lKDIpOwotICAgIGFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEJvbmUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMzQsIG1lc3NhZ2UuZ2V0QnR3bygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5EZWZhdWx0T25lb2ZCQ2FzZS5CT05FLAotICAgICAgICBtZXNzYWdlLmdldERlZmF1bHRPbmVvZkJDYXNlKCkpOwotCi0gICAgbWVzc2FnZS5zZXRCdHdvKDMpOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldEJvbmUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuZ2V0QnR3bygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5EZWZhdWx0T25lb2ZCQ2FzZS5CVFdPLAotICAgICAgICBtZXNzYWdlLmdldERlZmF1bHRPbmVvZkJDYXNlKCkpOwotCi0gICAgbWVzc2FnZS5jbGVhckJ0d28oKTsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRCb25lKCkpOwotICAgIGFzc2VydEVxdWFscygxMjM0LCBtZXNzYWdlLmdldEJ0d28oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuRGVmYXVsdE9uZW9mQkNhc2UKLSAgICAgICAgICAgIC5ERUZBVUxUX09ORU9GX0JfTk9UX1NFVCwKLSAgICAgICAgbWVzc2FnZS5nZXREZWZhdWx0T25lb2ZCQ2FzZSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RJbml0aWFsaXplTWVzc2FnZVdpdGhPbmVvZkRlZmF1bHRzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPQotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mKG5ldyBBcnJheSg5KS5jb25jYXQoNTY3KSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDU2NywgbWVzc2FnZS5nZXRBb25lKCkpOwotICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldEF0d28oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuRGVmYXVsdE9uZW9mQUNhc2UuQU9ORSwKLSAgICAgICAgbWVzc2FnZS5nZXREZWZhdWx0T25lb2ZBQ2FzZSgpKTsKLQotICAgIG1lc3NhZ2UgPQotICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mKG5ldyBBcnJheSgxMCkuY29uY2F0KDg5MCkpOwotICAgIGFzc2VydEVxdWFscygxMjM0LCBtZXNzYWdlLmdldEFvbmUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDg5MCwgbWVzc2FnZS5nZXRBdHdvKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mLkRlZmF1bHRPbmVvZkFDYXNlLkFUV08sCi0gICAgICAgIG1lc3NhZ2UuZ2V0RGVmYXVsdE9uZW9mQUNhc2UoKSk7Ci0KLSAgICBtZXNzYWdlID0KLSAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZihuZXcgQXJyYXkoOSkuY29uY2F0KDU2NywgODkwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMzQsIG1lc3NhZ2UuZ2V0QW9uZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoODkwLCBtZXNzYWdlLmdldEF0d28oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuRGVmYXVsdE9uZW9mQUNhc2UuQVRXTywKLSAgICAgICAgbWVzc2FnZS5nZXREZWZhdWx0T25lb2ZBQ2FzZSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RJbml0aWFsaXplTWVzc2FnZVdpdGhPbmVvZkRlZmF1bHRzX2RlZmF1bHROb3RTZXRPbkZpcnN0RmllbGQnLAotICAgICAgZnVuY3Rpb24oKSB7Ci0gICAgICAgIHZhciBtZXNzYWdlOwotCi0gICAgICAgIG1lc3NhZ2UgPQotICAgICAgICAgICAgbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZihuZXcgQXJyYXkoMTEpLmNvbmNhdCg1NjcpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKDU2NywgbWVzc2FnZS5nZXRCb25lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoMTIzNCwgbWVzc2FnZS5nZXRCdHdvKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuRGVmYXVsdE9uZW9mQkNhc2UuQk9ORSwKLSAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RGVmYXVsdE9uZW9mQkNhc2UoKSk7Ci0KLSAgICAgICAgbWVzc2FnZSA9Ci0gICAgICAgICAgICBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mKG5ldyBBcnJheSgxMikuY29uY2F0KDg5MCkpOwotICAgICAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRCb25lKCkpOwotICAgICAgICBhc3NlcnRFcXVhbHMoODkwLCBtZXNzYWdlLmdldEJ0d28oKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5EZWZhdWx0T25lb2ZCQ2FzZS5CVFdPLAotICAgICAgICAgICAgbWVzc2FnZS5nZXREZWZhdWx0T25lb2ZCQ2FzZSgpKTsKLQotICAgICAgICBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZigKLSAgICAgICAgICAgIG5ldyBBcnJheSgxMSkuY29uY2F0KDU2NywgODkwKSk7Ci0gICAgICAgIGFzc2VydFVuZGVmaW5lZChtZXNzYWdlLmdldEJvbmUoKSk7Ci0gICAgICAgIGFzc2VydEVxdWFscyg4OTAsIG1lc3NhZ2UuZ2V0QnR3bygpKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgICAgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mLkRlZmF1bHRPbmVvZkJDYXNlLkJUV08sCi0gICAgICAgICAgICBtZXNzYWdlLmdldERlZmF1bHRPbmVvZkJDYXNlKCkpOwotICAgICAgfSk7Ci0KLSAgaXQoJ3Rlc3RPbmVvZkNvbnRhaW5pbmdBbm90aGVyTWVzc2FnZScsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtZXNzYWdlID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZjsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5SZWN1cnNpdmVPbmVvZkNhc2UuCi0gICAgICAgICAgICBSRUNVUlNJVkVfT05FT0ZfTk9UX1NFVCwKLSAgICAgICAgbWVzc2FnZS5nZXRSZWN1cnNpdmVPbmVvZkNhc2UoKSk7Ci0KLSAgICB2YXIgb3RoZXIgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mOwotICAgIG1lc3NhZ2Uuc2V0Um9uZShvdGhlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKG90aGVyLCBtZXNzYWdlLmdldFJvbmUoKSk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKG1lc3NhZ2UuZ2V0UnR3bygpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIHByb3RvLmpzcGIudGVzdC5UZXN0TWVzc2FnZVdpdGhPbmVvZi5SZWN1cnNpdmVPbmVvZkNhc2UuUk9ORSwKLSAgICAgICAgbWVzc2FnZS5nZXRSZWN1cnNpdmVPbmVvZkNhc2UoKSk7Ci0KLSAgICBtZXNzYWdlLnNldFJ0d28oJ2hpJyk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKG1lc3NhZ2UuZ2V0Um9uZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoJ2hpJywgbWVzc2FnZS5nZXRSdHdvKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mLlJlY3Vyc2l2ZU9uZW9mQ2FzZS5SVFdPLAotICAgICAgICBtZXNzYWdlLmdldFJlY3Vyc2l2ZU9uZW9mQ2FzZSgpKTsKLSAgfSk7Ci0KLSAgaXQoJ3Rlc3RRdWVyeWluZ09uZW9mQ2FzZUVuc3VyZXNPbmx5T25lRmllbGRJc1NldEluVW5kZXJseWluZ0FycmF5JywKLSAgICAgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1lc3NhZ2UgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mOwotICAgIG1lc3NhZ2Uuc2V0UG9uZSgneCcpOwotICAgIGFzc2VydEVxdWFscygneCcsIG1lc3NhZ2UuZ2V0UG9uZSgpKTsKLSAgICBhc3NlcnRVbmRlZmluZWQobWVzc2FnZS5nZXRQdGhyZWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBwcm90by5qc3BiLnRlc3QuVGVzdE1lc3NhZ2VXaXRoT25lb2YuUGFydGlhbE9uZW9mQ2FzZS5QT05FLAotICAgICAgICBtZXNzYWdlLmdldFBhcnRpYWxPbmVvZkNhc2UoKSk7Ci0KLSAgICB2YXIgYXJyYXkgPSBtZXNzYWdlLnRvQXJyYXkoKTsKLSAgICBhc3NlcnRFcXVhbHMoJ3gnLCBhcnJheVsyXSk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKGFycmF5WzRdKTsKLSAgICBhcnJheVs0XSA9ICd5JzsKLQotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgcHJvdG8uanNwYi50ZXN0LlRlc3RNZXNzYWdlV2l0aE9uZW9mLlBhcnRpYWxPbmVvZkNhc2UuUFRIUkVFLAotICAgICAgICBtZXNzYWdlLmdldFBhcnRpYWxPbmVvZkNhc2UoKSk7Ci0gICAgYXNzZXJ0VW5kZWZpbmVkKGFycmF5WzJdKTsKLSAgICBhc3NlcnRFcXVhbHMoJ3knLCBhcnJheVs0XSk7Ci0gIH0pOwotCi0gIGl0KCd0ZXN0RmxvYXRpbmdQb2ludEZpZWxkc1N1cHBvcnROYW4nLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgYXNzZXJ0TmFuID0gZnVuY3Rpb24oeCkgewotICAgICAgYXNzZXJ0VHJ1ZSgnRXhwZWN0ZWQgJyArIHggKyAnICgnICsgZ29vZy50eXBlT2YoeCkgKyAnKSB0byBiZSBOYU4uJywKLSAgICAgICAgICBnb29nLmlzTnVtYmVyKHgpICYmIGlzTmFOKHgpKTsKLSAgICB9OwotCi0gICAgdmFyIG1lc3NhZ2UgPSBuZXcgcHJvdG8uanNwYi50ZXN0LkZsb2F0aW5nUG9pbnRGaWVsZHMoWwotICAgICAgJ05hTicsICdOYU4nLCBbJ05hTicsICdOYU4nXSwgJ05hTicsCi0gICAgICAnTmFOJywgJ05hTicsIFsnTmFOJywgJ05hTiddLCAnTmFOJwotICAgIF0pOwotICAgIGFzc2VydE5hbihtZXNzYWdlLmdldE9wdGlvbmFsRmxvYXRGaWVsZCgpKTsKLSAgICBhc3NlcnROYW4obWVzc2FnZS5nZXRSZXF1aXJlZEZsb2F0RmllbGQoKSk7Ci0gICAgYXNzZXJ0TmFuKG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdEZpZWxkTGlzdCgpWzBdKTsKLSAgICBhc3NlcnROYW4obWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0RmllbGRMaXN0KClbMV0pOwotICAgIGFzc2VydE5hbihtZXNzYWdlLmdldERlZmF1bHRGbG9hdEZpZWxkKCkpOwotICAgIGFzc2VydE5hbihtZXNzYWdlLmdldE9wdGlvbmFsRG91YmxlRmllbGQoKSk7Ci0gICAgYXNzZXJ0TmFuKG1lc3NhZ2UuZ2V0UmVxdWlyZWREb3VibGVGaWVsZCgpKTsKLSAgICBhc3NlcnROYW4obWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZUZpZWxkTGlzdCgpWzBdKTsKLSAgICBhc3NlcnROYW4obWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZUZpZWxkTGlzdCgpWzFdKTsKLSAgICBhc3NlcnROYW4obWVzc2FnZS5nZXREZWZhdWx0RG91YmxlRmllbGQoKSk7Ci0gIH0pOwotCi19KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL25vZGVfbG9hZGVyLmpzIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvbm9kZV9sb2FkZXIuanMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5MjExYWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvbm9kZV9sb2FkZXIuanMKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLyoqCi0gKiBAZmlsZW92ZXJ2aWV3IExvYWRlciB0aGF0IGhhbmRsZXMgZ29vZy5yZXF1aXJlKCkgZm9yIE5vZGUuSlMuCi0gKi8KLQotdmFyIG9sZExvYWRlciA9IGdvb2cuZ2xvYmFsLkNMT1NVUkVfSU1QT1JUX1NDUklQVDsKLQotZ29vZy5nbG9iYWwuQ0xPU1VSRV9JTVBPUlRfU0NSSVBUID0gZnVuY3Rpb24oc3JjLCBvcHRfc291cmNlVGV4dCkgewotICBpZiAob3B0X3NvdXJjZVRleHQgPT09IHVuZGVmaW5lZCkgewotICAgIHRyeSB7Ci0gICAgICAvLyBMb2FkIGZyb20gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgotICAgICAgcmVxdWlyZSgiLi8iICsgc3JjKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gY2F0Y2ggKGUpIHsKLSAgICAgIC8vIEZhbGwgYmFjayB0byB0aGUgQ2xvc3VyZSBsb2FkZXIuCi0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG9sZExvYWRlcihzcmMsIG9wdF9zb3VyY2VUZXh0KTsKLX07CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9wYWNrYWdlLmpzb24gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9wYWNrYWdlLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlMDU3MjIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvcGFja2FnZS5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsMjQgKzAsMCBAQAotewotICAibmFtZSI6ICJnb29nbGUtcHJvdG9idWYiLAotICAidmVyc2lvbiI6ICIzLjAuMC1hbHBoYS42IiwKLSAgImRlc2NyaXB0aW9uIjogIlByb3RvY29sIEJ1ZmZlcnMgZm9yIEphdmFTY3JpcHQiLAotICAibWFpbiI6ICJnb29nbGUtcHJvdG9idWYuanMiLAotICAiZGVwZW5kZW5jaWVzIjogewotICAgICJnb29nbGUtY2xvc3VyZS1saWJyYXJ5IjogIn4yMDE2MDEyNS4wLjAiLAotICAgICJndWxwIjogIn4zLjkuMCIsCi0gICAgImphc21pbmUiOiAifjIuNC4xIgotICB9LAotICAiZGV2RGVwZW5kZW5jaWVzIjogewotICAgICJnb29nbGUtY2xvc3VyZS1jb21waWxlciI6ICJ+MjAxNTEyMTYuMi4wIiwKLSAgICAiZ2xvYiI6ICJ+Ni4wLjQiCi0gIH0sCi0gICJzY3JpcHRzIjogewotICAgICJ0ZXN0IjogIm5vZGUgLi9ub2RlX21vZHVsZXMvZ3VscC9iaW4vZ3VscC5qcyB0ZXN0IgotICB9LAotICAicmVwb3NpdG9yeSI6IHsKLSAgICAidHlwZSI6ICJnaXQiLAotICAgICJ1cmwiOiAiaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi90cmVlL21hc3Rlci9qcyIKLSAgfSwKLSAgImF1dGhvciI6ICIiLAotICAibGljZW5zZSI6ICJBcGFjaGUtMi4wIgotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvcHJvdG8zX3Rlc3QuanMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9wcm90bzNfdGVzdC5qcwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkNzc5MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9wcm90bzNfdGVzdC5qcworKysgL2Rldi9udWxsCkBAIC0xLDMxNCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotZ29vZy5yZXF1aXJlKCdnb29nLmNyeXB0LmJhc2U2NCcpOwotZ29vZy5yZXF1aXJlKCdnb29nLnRlc3RpbmcuYXNzZXJ0cycpOwotCi0vLyBDb21tb25KUy1Mb2FkRnJvbUZpbGU6IHRlc3RiaW5hcnlfcGIgcHJvdG8uanNwYi50ZXN0Ci1nb29nLnJlcXVpcmUoJ3Byb3RvLmpzcGIudGVzdC5Gb3JlaWduTWVzc2FnZScpOwotCi0vLyBDb21tb25KUy1Mb2FkRnJvbUZpbGU6IHByb3RvM190ZXN0X3BiIHByb3RvLmpzcGIudGVzdAotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuUHJvdG8zRW51bScpOwotZ29vZy5yZXF1aXJlKCdwcm90by5qc3BiLnRlc3QuVGVzdFByb3RvMycpOwotCi0KLXZhciBCWVRFUyA9IG5ldyBVaW50OEFycmF5KFsxLCAyLCA4LCA5XSk7Ci12YXIgQllURVNfQjY0ID0gZ29vZy5jcnlwdC5iYXNlNjQuZW5jb2RlQnl0ZUFycmF5KEJZVEVTKTsKLQotCi0vKioKLSAqIEhlbHBlcjogY29tcGFyZSBhIGJ5dGVzIGZpZWxkIHRvIGFuIGV4cGVjdGVkIHZhbHVlCi0gKiBAcGFyYW0ge1VpbnQ4QXJyYXl8c3RyaW5nfSBhcnIKLSAqIEBwYXJhbSB7VWludDhBcnJheX0gZXhwZWN0ZWQKLSAqIEByZXR1cm4ge2Jvb2xlYW59Ci0gKi8KLWZ1bmN0aW9uIGJ5dGVzQ29tcGFyZShhcnIsIGV4cGVjdGVkKSB7Ci0gIGlmIChnb29nLmlzU3RyaW5nKGFycikpIHsKLSAgICBhcnIgPSBnb29nLmNyeXB0LmJhc2U2NC5kZWNvZGVTdHJpbmdUb1VpbnQ4QXJyYXkoYXJyKTsKLSAgfQotICBpZiAoYXJyLmxlbmd0aCAhPSBleHBlY3RlZC5sZW5ndGgpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yICh2YXIgaSA9IDA7IGkgPCBhcnIubGVuZ3RoOyBpKyspIHsKLSAgICBpZiAoYXJyW2ldICE9IGV4cGVjdGVkW2ldKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLWRlc2NyaWJlKCdwcm90bzNUZXN0JywgZnVuY3Rpb24oKSB7Ci0gIC8qKgotICAgKiBUZXN0IGRlZmF1bHRzIGZvciBwcm90bzMgbWVzc2FnZSBmaWVsZHMuCi0gICAqLwotICBpdCgndGVzdFByb3RvM0ZpZWxkRGVmYXVsdHMnLCBmdW5jdGlvbigpIHsKLSAgICB2YXIgbXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5UZXN0UHJvdG8zKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsSW50MzIoKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbEludDY0KCksIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxVaW50MzIoKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbFVpbnQ2NCgpLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsU2ludDMyKCksIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxTaW50NjQoKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbEZpeGVkMzIoKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbEZpeGVkNjQoKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbFNmaXhlZDMyKCksIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsRmxvYXQoKSwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbERvdWJsZSgpLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsU3RyaW5nKCksICcnKTsKLQotICAgIC8vIFRPRE8oYi8yNjE3MzcwMSk6IHdoZW4gd2UgY2hhbmdlIGJ5dGVzIGZpZWxkcyBkZWZhdWx0IGdldHRlciB0byByZXR1cm4KLSAgICAvLyBVaW50OEFycmF5LCB3ZSdsbCB3YW50IHRvIHN3aXRjaCB0aGlzIGFzc2VydGlvbiB0byBtYXRjaCB0aGUgdTggY2FzZS4KLSAgICBhc3NlcnRFcXVhbHModHlwZW9mIG1zZy5nZXRPcHRpb25hbEJ5dGVzKCksICdzdHJpbmcnKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsQnl0ZXNfYXNVOCgpIGluc3RhbmNlb2YgVWludDhBcnJheSwgdHJ1ZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHR5cGVvZiBtc2cuZ2V0T3B0aW9uYWxCeXRlc19hc0I2NCgpLCAnc3RyaW5nJyk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbEJ5dGVzKCkubGVuZ3RoLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsQnl0ZXNfYXNVOCgpLmxlbmd0aCwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbEJ5dGVzX2FzQjY0KCksICcnKTsKLQotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpLAotICAgICAgICAgICAgICAgICBwcm90by5qc3BiLnRlc3QuUHJvdG8zRW51bS5QUk9UTzNfRk9PKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSwgdW5kZWZpbmVkKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSwgdW5kZWZpbmVkKTsKLQotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0UmVwZWF0ZWRJbnQzMkxpc3QoKS5sZW5ndGgsIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0UmVwZWF0ZWRJbnQ2NExpc3QoKS5sZW5ndGgsIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0UmVwZWF0ZWRVaW50MzJMaXN0KCkubGVuZ3RoLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldFJlcGVhdGVkVWludDY0TGlzdCgpLmxlbmd0aCwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRSZXBlYXRlZFNpbnQzMkxpc3QoKS5sZW5ndGgsIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0UmVwZWF0ZWRTaW50NjRMaXN0KCkubGVuZ3RoLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldFJlcGVhdGVkRml4ZWQzMkxpc3QoKS5sZW5ndGgsIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0UmVwZWF0ZWRGaXhlZDY0TGlzdCgpLmxlbmd0aCwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRSZXBlYXRlZFNmaXhlZDMyTGlzdCgpLmxlbmd0aCwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpLmxlbmd0aCwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRSZXBlYXRlZEZsb2F0TGlzdCgpLmxlbmd0aCwgMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRSZXBlYXRlZERvdWJsZUxpc3QoKS5sZW5ndGgsIDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0UmVwZWF0ZWRTdHJpbmdMaXN0KCkubGVuZ3RoLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldFJlcGVhdGVkQnl0ZXNMaXN0KCkubGVuZ3RoLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCkubGVuZ3RoLCAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkubGVuZ3RoLCAwKTsKLQotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0IHRoYXQgYWxsIGZpZWxkcyBjYW4gYmUgc2V0IGFuZCByZWFkIHZpYSBhIHNlcmlhbGl6YXRpb24gcm91bmR0cmlwLgotICAgKi8KLSAgaXQoJ3Rlc3RQcm90bzNGaWVsZFNldEdldCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RQcm90bzMoKTsKLQotICAgIG1zZy5zZXRPcHRpb25hbEludDMyKC00Mik7Ci0gICAgbXNnLnNldE9wdGlvbmFsSW50NjQoLTB4N2ZmZmZmZmYwMDAwMDAwMCk7Ci0gICAgbXNnLnNldE9wdGlvbmFsVWludDMyKDB4ODAwMDAwMDApOwotICAgIG1zZy5zZXRPcHRpb25hbFVpbnQ2NCgweGYwMDAwMDAwMDAwMDAwMDApOwotICAgIG1zZy5zZXRPcHRpb25hbFNpbnQzMigtMTAwKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxTaW50NjQoLTB4ODAwMDAwMDAwMDAwMDAwMCk7Ci0gICAgbXNnLnNldE9wdGlvbmFsRml4ZWQzMigxMjM0KTsKLSAgICBtc2cuc2V0T3B0aW9uYWxGaXhlZDY0KDB4MTIzNDU2NzgwMDAwMDAwMCk7Ci0gICAgbXNnLnNldE9wdGlvbmFsU2ZpeGVkMzIoLTEyMzQpOwotICAgIG1zZy5zZXRPcHRpb25hbFNmaXhlZDY0KC0weDEyMzQ1Njc4MDAwMDAwMDApOwotICAgIG1zZy5zZXRPcHRpb25hbEZsb2F0KDEuNSk7Ci0gICAgbXNnLnNldE9wdGlvbmFsRG91YmxlKC0xLjUpOwotICAgIG1zZy5zZXRPcHRpb25hbEJvb2wodHJ1ZSk7Ci0gICAgbXNnLnNldE9wdGlvbmFsU3RyaW5nKCdoZWxsbyB3b3JsZCcpOwotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKEJZVEVTKTsKLSAgICB2YXIgc3VibXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5Gb3JlaWduTWVzc2FnZSgpOwotICAgIHN1Ym1zZy5zZXRDKDE2KTsKLSAgICBtc2cuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShzdWJtc2cpOwotICAgIG1zZy5zZXRPcHRpb25hbEZvcmVpZ25FbnVtKHByb3RvLmpzcGIudGVzdC5Qcm90bzNFbnVtLlBST1RPM19CQVIpOwotCi0gICAgbXNnLnNldFJlcGVhdGVkSW50MzJMaXN0KFstNDJdKTsKLSAgICBtc2cuc2V0UmVwZWF0ZWRJbnQ2NExpc3QoWy0weDdmZmZmZmZmMDAwMDAwMDBdKTsKLSAgICBtc2cuc2V0UmVwZWF0ZWRVaW50MzJMaXN0KFsweDgwMDAwMDAwXSk7Ci0gICAgbXNnLnNldFJlcGVhdGVkVWludDY0TGlzdChbMHhmMDAwMDAwMDAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldFJlcGVhdGVkU2ludDMyTGlzdChbLTEwMF0pOwotICAgIG1zZy5zZXRSZXBlYXRlZFNpbnQ2NExpc3QoWy0weDgwMDAwMDAwMDAwMDAwMDBdKTsKLSAgICBtc2cuc2V0UmVwZWF0ZWRGaXhlZDMyTGlzdChbMTIzNF0pOwotICAgIG1zZy5zZXRSZXBlYXRlZEZpeGVkNjRMaXN0KFsweDEyMzQ1Njc4MDAwMDAwMDBdKTsKLSAgICBtc2cuc2V0UmVwZWF0ZWRTZml4ZWQzMkxpc3QoWy0xMjM0XSk7Ci0gICAgbXNnLnNldFJlcGVhdGVkU2ZpeGVkNjRMaXN0KFstMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gICAgbXNnLnNldFJlcGVhdGVkRmxvYXRMaXN0KFsxLjVdKTsKLSAgICBtc2cuc2V0UmVwZWF0ZWREb3VibGVMaXN0KFstMS41XSk7Ci0gICAgbXNnLnNldFJlcGVhdGVkQm9vbExpc3QoW3RydWVdKTsKLSAgICBtc2cuc2V0UmVwZWF0ZWRTdHJpbmdMaXN0KFsnaGVsbG8gd29ybGQnXSk7Ci0gICAgbXNnLnNldFJlcGVhdGVkQnl0ZXNMaXN0KFtCWVRFU10pOwotICAgIHN1Ym1zZyA9IG5ldyBwcm90by5qc3BiLnRlc3QuRm9yZWlnbk1lc3NhZ2UoKTsKLSAgICBzdWJtc2cuc2V0QygxMDAwKTsKLSAgICBtc2cuc2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUxpc3QoW3N1Ym1zZ10pOwotICAgIG1zZy5zZXRSZXBlYXRlZEZvcmVpZ25FbnVtTGlzdChbcHJvdG8uanNwYi50ZXN0LlByb3RvM0VudW0uUFJPVE8zX0JBUl0pOwotCi0gICAgbXNnLnNldE9uZW9mU3RyaW5nKCdhc2RmJyk7Ci0KLSAgICB2YXIgc2VyaWFsaXplZCA9IG1zZy5zZXJpYWxpemVCaW5hcnkoKTsKLSAgICBtc2cgPSBwcm90by5qc3BiLnRlc3QuVGVzdFByb3RvMy5kZXNlcmlhbGl6ZUJpbmFyeShzZXJpYWxpemVkKTsKLQotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxJbnQzMigpLCAtNDIpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxJbnQ2NCgpLCAtMHg3ZmZmZmZmZjAwMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsVWludDMyKCksIDB4ODAwMDAwMDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxVaW50NjQoKSwgMHhmMDAwMDAwMDAwMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsU2ludDMyKCksIC0xMDApOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxTaW50NjQoKSwgLTB4ODAwMDAwMDAwMDAwMDAwMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbEZpeGVkMzIoKSwgMTIzNCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPcHRpb25hbEZpeGVkNjQoKSwgMHgxMjM0NTY3ODAwMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsU2ZpeGVkMzIoKSwgLTEyMzQpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpLCAtMHgxMjM0NTY3ODAwMDAwMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsRmxvYXQoKSwgMS41KTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9wdGlvbmFsRG91YmxlKCksIC0xLjUpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxCb29sKCksIHRydWUpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxTdHJpbmcoKSwgJ2hlbGxvIHdvcmxkJyk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRydWUsIGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlcygpLCBCWVRFUykpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSwgMTYpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpLAotICAgICAgICBwcm90by5qc3BiLnRlc3QuUHJvdG8zRW51bS5QUk9UTzNfQkFSKTsKLQotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKG1zZy5nZXRSZXBlYXRlZEludDMyTGlzdCgpLCBbLTQyXSk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMobXNnLmdldFJlcGVhdGVkSW50NjRMaXN0KCksIFstMHg3ZmZmZmZmZjAwMDAwMDAwXSk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMobXNnLmdldFJlcGVhdGVkVWludDMyTGlzdCgpLCBbMHg4MDAwMDAwMF0pOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKG1zZy5nZXRSZXBlYXRlZFVpbnQ2NExpc3QoKSwgWzB4ZjAwMDAwMDAwMDAwMDAwMF0pOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKG1zZy5nZXRSZXBlYXRlZFNpbnQzMkxpc3QoKSwgWy0xMDBdKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhtc2cuZ2V0UmVwZWF0ZWRTaW50NjRMaXN0KCksIFstMHg4MDAwMDAwMDAwMDAwMDAwXSk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMobXNnLmdldFJlcGVhdGVkRml4ZWQzMkxpc3QoKSwgWzEyMzRdKTsKLSAgICBhc3NlcnRFbGVtZW50c0VxdWFscyhtc2cuZ2V0UmVwZWF0ZWRGaXhlZDY0TGlzdCgpLCBbMHgxMjM0NTY3ODAwMDAwMDAwXSk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMobXNnLmdldFJlcGVhdGVkU2ZpeGVkMzJMaXN0KCksIFstMTIzNF0pOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKG1zZy5nZXRSZXBlYXRlZFNmaXhlZDY0TGlzdCgpLCBbLTB4MTIzNDU2NzgwMDAwMDAwMF0pOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKG1zZy5nZXRSZXBlYXRlZEZsb2F0TGlzdCgpLCBbMS41XSk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMobXNnLmdldFJlcGVhdGVkRG91YmxlTGlzdCgpLCBbLTEuNV0pOwotICAgIGFzc2VydEVsZW1lbnRzRXF1YWxzKG1zZy5nZXRSZXBlYXRlZEJvb2xMaXN0KCksIFt0cnVlXSk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMobXNnLmdldFJlcGVhdGVkU3RyaW5nTGlzdCgpLCBbJ2hlbGxvIHdvcmxkJ10pOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0UmVwZWF0ZWRCeXRlc0xpc3QoKS5sZW5ndGgsIDEpOwotICAgIGFzc2VydEVxdWFscyh0cnVlLCBieXRlc0NvbXBhcmUobXNnLmdldFJlcGVhdGVkQnl0ZXNMaXN0KClbMF0sIEJZVEVTKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpLmxlbmd0aCwgMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpWzBdLmdldEMoKSwgMTAwMCk7Ci0gICAgYXNzZXJ0RWxlbWVudHNFcXVhbHMobXNnLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCksCi0gICAgICAgIFtwcm90by5qc3BiLnRlc3QuUHJvdG8zRW51bS5QUk9UTzNfQkFSXSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9uZW9mU3RyaW5nKCksICdhc2RmJyk7Ci0gIH0pOwotCi0KLSAgLyoqCi0gICAqIFRlc3QgdGhhdCBvbmVvZnMgY29udGludWUgdG8gaGF2ZSBhIG5vdGlvbiBvZiBmaWVsZCBwcmVzZW5jZS4KLSAgICovCi0gIGl0KCd0ZXN0T25lb2ZzJywgZnVuY3Rpb24oKSB7Ci0gICAgdmFyIG1zZyA9IG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdFByb3RvMygpOwotCi0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZlVpbnQzMigpLCB1bmRlZmluZWQpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T25lb2ZGb3JlaWduTWVzc2FnZSgpLCB1bmRlZmluZWQpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T25lb2ZTdHJpbmcoKSwgdW5kZWZpbmVkKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9uZW9mQnl0ZXMoKSwgdW5kZWZpbmVkKTsKLQotICAgIG1zZy5zZXRPbmVvZlVpbnQzMig0Mik7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZlVpbnQzMigpLCA0Mik7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZkZvcmVpZ25NZXNzYWdlKCksIHVuZGVmaW5lZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZlN0cmluZygpLCB1bmRlZmluZWQpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T25lb2ZCeXRlcygpLCB1bmRlZmluZWQpOwotCi0KLSAgICB2YXIgc3VibXNnID0gbmV3IHByb3RvLmpzcGIudGVzdC5Gb3JlaWduTWVzc2FnZSgpOwotICAgIG1zZy5zZXRPbmVvZkZvcmVpZ25NZXNzYWdlKHN1Ym1zZyk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZlVpbnQzMigpLCB1bmRlZmluZWQpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T25lb2ZGb3JlaWduTWVzc2FnZSgpLCBzdWJtc2cpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T25lb2ZTdHJpbmcoKSwgdW5kZWZpbmVkKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9uZW9mQnl0ZXMoKSwgdW5kZWZpbmVkKTsKLQotICAgIG1zZy5zZXRPbmVvZlN0cmluZygnaGVsbG8nKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9uZW9mVWludDMyKCksIHVuZGVmaW5lZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZkZvcmVpZ25NZXNzYWdlKCksIHVuZGVmaW5lZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZlN0cmluZygpLCAnaGVsbG8nKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9uZW9mQnl0ZXMoKSwgdW5kZWZpbmVkKTsKLQotICAgIG1zZy5zZXRPbmVvZkJ5dGVzKGdvb2cuY3J5cHQuYmFzZTY0LmVuY29kZVN0cmluZygnXHUwMEZGXHUwMEZGJykpOwotICAgIGFzc2VydEVxdWFscyhtc2cuZ2V0T25lb2ZVaW50MzIoKSwgdW5kZWZpbmVkKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9uZW9mRm9yZWlnbk1lc3NhZ2UoKSwgdW5kZWZpbmVkKTsKLSAgICBhc3NlcnRFcXVhbHMobXNnLmdldE9uZW9mU3RyaW5nKCksIHVuZGVmaW5lZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1zZy5nZXRPbmVvZkJ5dGVzX2FzQjY0KCksCi0gICAgICAgIGdvb2cuY3J5cHQuYmFzZTY0LmVuY29kZVN0cmluZygnXHUwMEZGXHUwMEZGJykpOwotICB9KTsKLQotCi0gIC8qKgotICAgKiBUZXN0IHRoYXQgImRlZmF1bHQiLXZhbHVlZCBwcmltaXRpdmUgZmllbGRzIGFyZSBub3QgZW1pdHRlZCBvbiB0aGUgd2lyZS4KLSAgICovCi0gIGl0KCd0ZXN0Tm9TZXJpYWxpemVEZWZhdWx0cycsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RQcm90bzMoKTsKLQotICAgIC8vIFNldCBlYWNoIHByaW1pdGl2ZSB0byBhIG5vbi1kZWZhdWx0IHZhbHVlLCB0aGVuIGJhY2sgdG8gaXRzIGRlZmF1bHQsIHRvCi0gICAgLy8gZW5zdXJlIHRoYXQgdGhlIHNlcmlhbGl6YXRpb24gaXMgYWN0dWFsbHkgY2hlY2tpbmcgdGhlIHZhbHVlIGFuZCBub3QganVzdAotICAgIC8vIHdoZXRoZXIgaXQgaGFzIGV2ZXIgYmVlbiBzZXQuCi0gICAgbXNnLnNldE9wdGlvbmFsSW50MzIoNDIpOwotICAgIG1zZy5zZXRPcHRpb25hbEludDMyKDApOwotICAgIG1zZy5zZXRPcHRpb25hbERvdWJsZSgzLjE0KTsKLSAgICBtc2cuc2V0T3B0aW9uYWxEb3VibGUoMC4wKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxCb29sKHRydWUpOwotICAgIG1zZy5zZXRPcHRpb25hbEJvb2woZmFsc2UpOwotICAgIG1zZy5zZXRPcHRpb25hbFN0cmluZygnaGVsbG8gd29ybGQnKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxTdHJpbmcoJycpOwotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKGdvb2cuY3J5cHQuYmFzZTY0LmVuY29kZVN0cmluZygnXHUwMEZGXHUwMEZGJykpOwotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKCcnKTsKLSAgICBtc2cuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShuZXcgcHJvdG8uanNwYi50ZXN0LkZvcmVpZ25NZXNzYWdlKCkpOwotICAgIG1zZy5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKG51bGwpOwotICAgIG1zZy5zZXRPcHRpb25hbEZvcmVpZ25FbnVtKHByb3RvLmpzcGIudGVzdC5Qcm90bzNFbnVtLlBST1RPM19CQVIpOwotICAgIG1zZy5zZXRPcHRpb25hbEZvcmVpZ25FbnVtKHByb3RvLmpzcGIudGVzdC5Qcm90bzNFbnVtLlBST1RPM19GT08pOwotICAgIG1zZy5zZXRPbmVvZlVpbnQzMigzMik7Ci0gICAgbXNnLnNldE9uZW9mVWludDMyKG51bGwpOwotCi0KLSAgICB2YXIgc2VyaWFsaXplZCA9IG1zZy5zZXJpYWxpemVCaW5hcnkoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgc2VyaWFsaXplZC5sZW5ndGgpOwotICB9KTsKLQotICAvKioKLSAgICogVGVzdCB0aGF0IGJhc2U2NCBzdHJpbmcgYW5kIFVpbnQ4QXJyYXkgYXJlIGludGVyY2hhbmdlYWJsZSBpbiBieXRlcyBmaWVsZHMuCi0gICAqLwotICBpdCgndGVzdEJ5dGVzRmllbGRzSW50ZXJvcCcsIGZ1bmN0aW9uKCkgewotICAgIHZhciBtc2cgPSBuZXcgcHJvdG8uanNwYi50ZXN0LlRlc3RQcm90bzMoKTsKLSAgICAvLyBTZXQgYXMgYSBiYXNlNjQgc3RyaW5nIGFuZCBjaGVjayBhbGwgdGhlIGdldHRlcnMgd29yay4KLSAgICBtc2cuc2V0T3B0aW9uYWxCeXRlcyhCWVRFU19CNjQpOwotICAgIGFzc2VydFRydWUoYnl0ZXNDb21wYXJlKG1zZy5nZXRPcHRpb25hbEJ5dGVzX2FzVTgoKSwgQllURVMpKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlc19hc0I2NCgpLCBCWVRFUykpOwotICAgIGFzc2VydFRydWUoYnl0ZXNDb21wYXJlKG1zZy5nZXRPcHRpb25hbEJ5dGVzKCksIEJZVEVTKSk7Ci0KLSAgICAvLyBUZXN0IGJpbmFyeSBzZXJpYWxpemUgcm91bmQgdHJpcCBkb2Vzbid0IGJyZWFrIGl0LgotICAgIG1zZyA9IHByb3RvLmpzcGIudGVzdC5UZXN0UHJvdG8zLmRlc2VyaWFsaXplQmluYXJ5KG1zZy5zZXJpYWxpemVCaW5hcnkoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldE9wdGlvbmFsQnl0ZXNfYXNVOCgpLCBCWVRFUykpOwotICAgIGFzc2VydFRydWUoYnl0ZXNDb21wYXJlKG1zZy5nZXRPcHRpb25hbEJ5dGVzX2FzQjY0KCksIEJZVEVTKSk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldE9wdGlvbmFsQnl0ZXMoKSwgQllURVMpKTsKLQotICAgIG1zZyA9IG5ldyBwcm90by5qc3BiLnRlc3QuVGVzdFByb3RvMygpOwotICAgIC8vIFNldCBhcyBhIFVpbnQ4QXJyYXkgYW5kIGNoZWNrIGFsbCB0aGUgZ2V0dGVycyB3b3JrLgotICAgIG1zZy5zZXRPcHRpb25hbEJ5dGVzKEJZVEVTKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlc19hc1U4KCksIEJZVEVTKSk7Ci0gICAgYXNzZXJ0VHJ1ZShieXRlc0NvbXBhcmUobXNnLmdldE9wdGlvbmFsQnl0ZXNfYXNCNjQoKSwgQllURVMpKTsKLSAgICBhc3NlcnRUcnVlKGJ5dGVzQ29tcGFyZShtc2cuZ2V0T3B0aW9uYWxCeXRlcygpLCBCWVRFUykpOwotCi0gIH0pOwotfSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy9wcm90bzNfdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Byb3RvM190ZXN0LnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhY2I2NzE2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Byb3RvM190ZXN0LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzMiOwotCi1pbXBvcnQgInRlc3RiaW5hcnkucHJvdG8iOwotCi1wYWNrYWdlIGpzcGIudGVzdDsKLQotbWVzc2FnZSBUZXN0UHJvdG8zIHsKLSAgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKLSAgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKLSAgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKLSAgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKLSAgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKLSAgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKLSAgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKLSAgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKLSAgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKLSAgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKLSAgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKLSAgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKLSAgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKLSAgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKLSAgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKLQotICBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgPSAxOTsKLSAgUHJvdG8zRW51bSAgICAgb3B0aW9uYWxfZm9yZWlnbl9lbnVtICAgID0gMjI7Ci0KLSAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzIgICAgPSAzMTsKLSAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjQgICAgPSAzMjsKLSAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyICAgPSAzMzsKLSAgcmVwZWF0ZWQgICB1aW50NjQgcmVwZWF0ZWRfdWludDY0ICAgPSAzNDsKLSAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyICAgPSAzNTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ICAgPSAzNjsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiAgPSAzNzsKLSAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCAgPSAzODsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAzOTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSA0MDsKLSAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgICAgPSA0MTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlICAgPSA0MjsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgcmVwZWF0ZWRfYm9vbCAgICAgPSA0MzsKLSAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nICAgPSA0NDsKLSAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXMgICAgPSA0NTsKLQotICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgPSA0OTsKLSAgcmVwZWF0ZWQgUHJvdG8zRW51bSAgICAgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtICAgID0gNTI7Ci0KLQotICBvbmVvZiBvbmVvZl9maWVsZCB7Ci0gICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKLSAgICBGb3JlaWduTWVzc2FnZSBvbmVvZl9mb3JlaWduX21lc3NhZ2UgPSAxMTI7Ci0gICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDExMzsKLSAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDExNDsKLSAgfQotfQotCi1lbnVtIFByb3RvM0VudW0gewotICBQUk9UTzNfRk9PID0gMDsKLSAgUFJPVE8zX0JBUiA9IDE7Ci0gIFBST1RPM19CQVogPSAyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiOWRjODkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDIzMCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBtd3JAZ29vZ2xlLmNvbSAoTWFyayBSYXdsaW5nKQotCi1zeW50YXggPSAicHJvdG8yIjsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLmFwcHMuanNwYi5wcm90byI7Ci1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOwotCi1wYWNrYWdlIGpzcGIudGVzdDsKLQotbWVzc2FnZSBFbXB0eSB7Ci19Ci0KLWVudW0gT3V0ZXJFbnVtIHsKLSAgRk9PID0gMTsKLSAgQkFSID0gMjsKLX0KLQotbWVzc2FnZSBFbnVtQ29udGFpbmVyIHsKLSAgb3B0aW9uYWwgT3V0ZXJFbnVtIG91dGVyX2VudW0gPSAxOwotfQotCi1tZXNzYWdlIFNpbXBsZTEgewotICByZXF1aXJlZCBzdHJpbmcgYV9zdHJpbmcgPSAxOwotICByZXBlYXRlZCBzdHJpbmcgYV9yZXBlYXRlZF9zdHJpbmcgPSAyOwotICBvcHRpb25hbCBib29sIGFfYm9vbGVhbiA9IDM7Ci19Ci0KLS8vIEEgbWVzc2FnZSB0aGF0IGRpZmZlcnMgZnJvbSBTaW1wbGUxIG9ubHkgYnkgbmFtZQotbWVzc2FnZSBTaW1wbGUyIHsKLSAgcmVxdWlyZWQgc3RyaW5nIGFfc3RyaW5nID0gMTsKLSAgcmVwZWF0ZWQgc3RyaW5nIGFfcmVwZWF0ZWRfc3RyaW5nID0gMjsKLX0KLQotbWVzc2FnZSBTcGVjaWFsQ2FzZXMgewotICByZXF1aXJlZCBzdHJpbmcgbm9ybWFsID0gMTsKLSAgLy8gRXhhbXBsZXMgb2YgSnMgcmVzZXJ2ZWQgbmFtZXMgdGhhdCBhcmUgY29udmVydGVkIHRvIHBiXzxuYW1lPi4KLSAgcmVxdWlyZWQgc3RyaW5nIGRlZmF1bHQgPSAyOwotICByZXF1aXJlZCBzdHJpbmcgZnVuY3Rpb24gPSAzOwotICByZXF1aXJlZCBzdHJpbmcgdmFyID0gNDsKLX0KLQotbWVzc2FnZSBPcHRpb25hbEZpZWxkcyB7Ci0gIG1lc3NhZ2UgTmVzdGVkIHsKLSAgICBvcHRpb25hbCBpbnQzMiBhbl9pbnQgPSAxOwotICB9Ci0gIG9wdGlvbmFsIHN0cmluZyBhX3N0cmluZyA9IDE7Ci0gIHJlcXVpcmVkIGJvb2wgYV9ib29sID0gMjsKLSAgb3B0aW9uYWwgTmVzdGVkIGFfbmVzdGVkX21lc3NhZ2UgPSAzOwotICByZXBlYXRlZCBOZXN0ZWQgYV9yZXBlYXRlZF9tZXNzYWdlID0gNDsKLSAgcmVwZWF0ZWQgc3RyaW5nIGFfcmVwZWF0ZWRfc3RyaW5nID0gNTsKLX0KLQotbWVzc2FnZSBIYXNFeHRlbnNpb25zIHsKLSAgb3B0aW9uYWwgc3RyaW5nIHN0cjEgPSAxOwotICBvcHRpb25hbCBzdHJpbmcgc3RyMiA9IDI7Ci0gIG9wdGlvbmFsIHN0cmluZyBzdHIzID0gMzsKLSAgZXh0ZW5zaW9ucyAxMCB0byBtYXg7Ci19Ci0KLW1lc3NhZ2UgQ29tcGxleCB7Ci0gIG1lc3NhZ2UgTmVzdGVkIHsKLSAgICByZXF1aXJlZCBpbnQzMiBhbl9pbnQgPSAyOwotICB9Ci0gIHJlcXVpcmVkIHN0cmluZyBhX3N0cmluZyA9IDE7Ci0gIHJlcXVpcmVkIGJvb2wgYW5fb3V0X29mX29yZGVyX2Jvb2wgPSA5OwotICBvcHRpb25hbCBOZXN0ZWQgYV9uZXN0ZWRfbWVzc2FnZSA9IDQ7Ci0gIHJlcGVhdGVkIE5lc3RlZCBhX3JlcGVhdGVkX21lc3NhZ2UgPSA1OwotICByZXBlYXRlZCBzdHJpbmcgYV9yZXBlYXRlZF9zdHJpbmcgPSA3OwotfQotCi1tZXNzYWdlIE91dGVyTWVzc2FnZSB7Ci0gIC8vIE1ha2Ugc3VyZSB0aGlzIGRvZXNuJ3QgY29uZmxpY3Qgd2l0aCB0aGUgb3RoZXIgQ29tcGxleCBtZXNzYWdlLgotICBtZXNzYWdlIENvbXBsZXggewotICAgIG9wdGlvbmFsIGludDMyIGlubmVyX2NvbXBsZXhfZmllbGQgPSAxOwotICB9Ci19Ci0KLW1lc3NhZ2UgSXNFeHRlbnNpb24gewotICBleHRlbmQgSGFzRXh0ZW5zaW9ucyB7Ci0gICAgb3B0aW9uYWwgSXNFeHRlbnNpb24gZXh0X2ZpZWxkID0gMTAwOwotICB9Ci0gIG9wdGlvbmFsIHN0cmluZyBleHQxID0gMTsKLQotICAvLyBFeHRlbnNpb25zIG9mIHByb3RvMiBEZXNjcmlwdG9yIG1lc3NhZ2VzIHdpbGwgYmUgaWdub3JlZC4KLSAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyB7Ci0gICAgb3B0aW9uYWwgc3RyaW5nIHNpbXBsZV9vcHRpb24gPSA0MjExMzAzODsKLSAgfQotfQotCi1tZXNzYWdlIEluZGlyZWN0RXh0ZW5zaW9uIHsKLSAgZXh0ZW5kIEhhc0V4dGVuc2lvbnMgewotICAgIG9wdGlvbmFsIFNpbXBsZTEgc2ltcGxlID0gMTAxOwotICAgIG9wdGlvbmFsIHN0cmluZyBzdHIgPSAxMDI7Ci0gICAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0ciA9IDEwMzsKLSAgICByZXBlYXRlZCBTaW1wbGUxIHJlcGVhdGVkX3NpbXBsZSA9IDEwNDsKLSAgfQotfQotCi1leHRlbmQgSGFzRXh0ZW5zaW9ucyB7Ci0gIG9wdGlvbmFsIFNpbXBsZTEgc2ltcGxlMSA9IDEwNTsKLX0KLQotbWVzc2FnZSBEZWZhdWx0VmFsdWVzIHsKLSAgZW51bSBFbnVtIHsKLSAgICBFMSA9IDEzOwotICAgIEUyID0gNzc7Ci0gIH0KLSAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZ19maWVsZCA9IDEgW2RlZmF1bHQ9ImRlZmF1bHQ8PlwnXCJhYmMiXTsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkID0gMiBbZGVmYXVsdD10cnVlXTsKLSAgb3B0aW9uYWwgaW50NjQgaW50X2ZpZWxkID0gMyBbZGVmYXVsdD0xMV07Ci0gIG9wdGlvbmFsIEVudW0gZW51bV9maWVsZCA9IDQgW2RlZmF1bHQ9RTFdOwotICBvcHRpb25hbCBzdHJpbmcgZW1wdHlfZmllbGQgPSA2IFtkZWZhdWx0PSIiXTsKLSAgb3B0aW9uYWwgYnl0ZXMgYnl0ZXNfZmllbGQgPSA4IFtkZWZhdWx0PSJtb28iXTsgLy8gQmFzZTY0IGVuY29kaW5nIGlzICJiVzl2IgotfQotCi1tZXNzYWdlIEZsb2F0aW5nUG9pbnRGaWVsZHMgewotICBvcHRpb25hbCBmbG9hdCBvcHRpb25hbF9mbG9hdF9maWVsZCA9IDE7Ci0gIHJlcXVpcmVkIGZsb2F0IHJlcXVpcmVkX2Zsb2F0X2ZpZWxkID0gMjsKLSAgcmVwZWF0ZWQgZmxvYXQgcmVwZWF0ZWRfZmxvYXRfZmllbGQgPSAzOwotICBvcHRpb25hbCBmbG9hdCBkZWZhdWx0X2Zsb2F0X2ZpZWxkID0gNCBbZGVmYXVsdCA9IDIuMF07Ci0gIG9wdGlvbmFsIGRvdWJsZSBvcHRpb25hbF9kb3VibGVfZmllbGQgPSA1OwotICByZXF1aXJlZCBkb3VibGUgcmVxdWlyZWRfZG91YmxlX2ZpZWxkID0gNjsKLSAgcmVwZWF0ZWQgZG91YmxlIHJlcGVhdGVkX2RvdWJsZV9maWVsZCA9IDc7Ci0gIG9wdGlvbmFsIGRvdWJsZSBkZWZhdWx0X2RvdWJsZV9maWVsZCA9IDggW2RlZmF1bHQgPSAyLjBdOwotfQotCi1tZXNzYWdlIFRlc3RDbG9uZSB7Ci0gIG9wdGlvbmFsIHN0cmluZyBzdHIgPSAxOwotICBvcHRpb25hbCBTaW1wbGUxIHNpbXBsZTEgPSAzOwotICByZXBlYXRlZCBTaW1wbGUxIHNpbXBsZTIgPSA1OwotICBvcHRpb25hbCBzdHJpbmcgdW51c2VkID0gNzsKLSAgZXh0ZW5zaW9ucyAxMCB0byBtYXg7Ci19Ci0KLW1lc3NhZ2UgQ2xvbmVFeHRlbnNpb24gewotICBleHRlbmQgVGVzdENsb25lIHsKLSAgICBvcHRpb25hbCBDbG9uZUV4dGVuc2lvbiBleHRfZmllbGQgPSAxMDA7Ci0gIH0KLSAgb3B0aW9uYWwgc3RyaW5nIGV4dCA9IDI7Ci19Ci0KLW1lc3NhZ2UgVGVzdEdyb3VwIHsKLSAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDEgewotICAgIHJlcXVpcmVkIHN0cmluZyBpZCA9IDE7Ci0gICAgcmVwZWF0ZWQgYm9vbCBzb21lX2Jvb2wgPSAyOwotICB9Ci0gIHJlcXVpcmVkIGdyb3VwIFJlcXVpcmVkR3JvdXAgPSAyIHsKLSAgICByZXF1aXJlZCBzdHJpbmcgaWQgPSAxOwotICB9Ci0gIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSAzIHsKLSAgICByZXF1aXJlZCBzdHJpbmcgaWQgPSAxOwotICB9Ci0gIG9wdGlvbmFsIHN0cmluZyBpZCA9IDQ7Ci0gIHJlcXVpcmVkIFNpbXBsZTIgcmVxdWlyZWRfc2ltcGxlID0gNTsKLSAgb3B0aW9uYWwgU2ltcGxlMiBvcHRpb25hbF9zaW1wbGUgPSA2OwotfQotCi1tZXNzYWdlIFRlc3RHcm91cDEgewotICBvcHRpb25hbCBUZXN0R3JvdXAuUmVwZWF0ZWRHcm91cCBncm91cCA9IDE7Ci19Ci0KLW1lc3NhZ2UgVGVzdFJlc2VydmVkTmFtZXMgewotICBvcHRpb25hbCBpbnQzMiBleHRlbnNpb24gPSAxOwotICBleHRlbnNpb25zIDEwIHRvIG1heDsKLX0KLQotbWVzc2FnZSBUZXN0UmVzZXJ2ZWROYW1lc0V4dGVuc2lvbiB7Ci0gIGV4dGVuZCBUZXN0UmVzZXJ2ZWROYW1lcyB7Ci0gICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTA7Ci0gIH0KLX0KLQotbWVzc2FnZSBUZXN0TWVzc2FnZVdpdGhPbmVvZiB7Ci0KLSAgb25lb2YgcGFydGlhbF9vbmVvZiB7Ci0gICAgc3RyaW5nIHBvbmUgPSAzOwotICAgIHN0cmluZyBwdGhyZWUgPSA1OwotICB9Ci0KLSAgb25lb2YgcmVjdXJzaXZlX29uZW9mIHsKLSAgICBUZXN0TWVzc2FnZVdpdGhPbmVvZiByb25lID0gNjsKLSAgICBzdHJpbmcgcnR3byA9IDc7Ci0gIH0KLQotICBvcHRpb25hbCBib29sIG5vcm1hbF9maWVsZCA9IDg7Ci0gIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9maWVsZCA9IDk7Ci0KLSAgb25lb2YgZGVmYXVsdF9vbmVvZl9hIHsKLSAgICBpbnQzMiBhb25lID0gMTAgW2RlZmF1bHQgPSAxMjM0XTsKLSAgICBpbnQzMiBhdHdvID0gMTE7Ci0gIH0KLQotICBvbmVvZiBkZWZhdWx0X29uZW9mX2IgewotICAgIGludDMyIGJvbmUgPSAxMjsKLSAgICBpbnQzMiBidHdvID0gMTMgW2RlZmF1bHQgPSAxMjM0XTsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy90ZXN0Mi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3QyLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGU1NWVmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3QyLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUuYXBwcy5qc3BiLnByb3RvIjsKLW9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKLQotcGFja2FnZSBqc3BiLnRlc3Q7Ci0KLW1lc3NhZ2UgVGVzdEV4dGVuc2lvbnNNZXNzYWdlIHsKLSAgb3B0aW9uYWwgaW50MzIgaW50ZmllbGQgPSAxOwotICBleHRlbnNpb25zIDEwMCB0byBtYXg7Ci19Ci0KLW1lc3NhZ2UgRXh0ZW5zaW9uTWVzc2FnZSB7Ci0gIGV4dGVuZCBUZXN0RXh0ZW5zaW9uc01lc3NhZ2UgewotICAgIG9wdGlvbmFsIEV4dGVuc2lvbk1lc3NhZ2UgZXh0X2ZpZWxkID0gMTAwOwotICB9Ci0gIG9wdGlvbmFsIHN0cmluZyBleHQxID0gMTsKLX0KLQotLy8gRmxvYXRpbmcgZXh0ZW5zaW9ucyBhcmUgb25seSBzdXBwb3J0ZWQgd2hlbiBnZW5lcmF0aW5nIGEgX2xpYi5qcyBsaWJyYXJ5LgotZXh0ZW5kIFRlc3RFeHRlbnNpb25zTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIEV4dGVuc2lvbk1lc3NhZ2UgZmxvYXRpbmdfbXNnX2ZpZWxkID0gMTAxOwotICBvcHRpb25hbCBzdHJpbmcgZmxvYXRpbmdfc3RyX2ZpZWxkID0gMTAyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdDMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy90ZXN0My5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQwYTU1Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy90ZXN0My5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLmFwcHMuanNwYi5wcm90byI7Ci1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci0KLXBhY2thZ2UganNwYi5leHR0ZXN0OwotCi1tZXNzYWdlIFRlc3RFeHRlbnNpb25zTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIGludDMyIGludGZpZWxkID0gMTsKLSAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OwotfQotCi1tZXNzYWdlIEV4dGVuc2lvbk1lc3NhZ2UgewotICBleHRlbmQgVGVzdEV4dGVuc2lvbnNNZXNzYWdlIHsKLSAgICBvcHRpb25hbCBFeHRlbnNpb25NZXNzYWdlIGV4dF9maWVsZCA9IDEwMDsKLSAgfQotICBvcHRpb25hbCBzdHJpbmcgZXh0MSA9IDE7Ci19Ci0KLWV4dGVuZCBUZXN0RXh0ZW5zaW9uc01lc3NhZ2UgewotICBvcHRpb25hbCBFeHRlbnNpb25NZXNzYWdlIGZsb2F0aW5nX21zZ19maWVsZCA9IDEwMTsKLSAgb3B0aW9uYWwgc3RyaW5nIGZsb2F0aW5nX3N0cl9maWVsZCA9IDEwMjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3Q0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdDQucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNmMjQ1MWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdDQucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5hcHBzLmpzcGIucHJvdG8iOwotb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOwotCi1wYWNrYWdlIGpzcGIuZXh0dGVzdDsKLQotaW1wb3J0ICJ0ZXN0My5wcm90byI7Ci0KLWV4dGVuZCBUZXN0RXh0ZW5zaW9uc01lc3NhZ2UgewotICBvcHRpb25hbCBFeHRlbnNpb25NZXNzYWdlIGZsb2F0aW5nX21zZ19maWVsZF90d28gPSAxMDM7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy90ZXN0NS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3Q1LnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNDk3OTUxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3Q1LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1vcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUuYXBwcy5qc3BiLnByb3RvIjsKLW9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKLQotcGFja2FnZSBqc3BiLmV4dHRlc3QuYmV0YTsKLQotbWVzc2FnZSBUZXN0QmV0YUV4dGVuc2lvbnNNZXNzYWdlIHsKLSAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OwotfQotCi1leHRlbmQgVGVzdEJldGFFeHRlbnNpb25zTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIHN0cmluZyBmbG9hdGluZ19zdHJfZmllbGQgPSAxMDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy90ZXN0X2Jvb3RzdHJhcC5qcyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3RfYm9vdHN0cmFwLmpzCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZDAwYTFjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3RfYm9vdHN0cmFwLmpzCisrKyAvZGV2L251bGwKQEAgLTEsNDEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8qKgotICogQGZpbGVvdmVydmlldyBTZXRzIGZsYWdzIGZvciB1bmNvbXBpbGVkIEpTVW5pdCB0ZXN0cy4KLSAqLwotCi0vKioKLSAqIFNldCB1bmNvbXBpbGVkIGZsYWdzLgotICovCi12YXIgQ0xPU1VSRV9ERUZJTkVTID0gewotICAgIC8vIEVuYWJsZSB0aGUgZnJvbU9iamVjdCBtZXRob2Qgb24gdGhlIG1lc3NhZ2UgY2xhc3MuCi0gICAgJ2pzcGIuTWVzc2FnZS5HRU5FUkFURV9GUk9NX09CSkVDVCc6IHRydWUKLX07CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy90ZXN0YmluYXJ5LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdGJpbmFyeS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjBjNzAxOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qcy90ZXN0YmluYXJ5LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTg1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBMSU5UOiBBTExPV19HUk9VUFMKLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLQotcGFja2FnZSBqc3BiLnRlc3Q7Ci0KLS8vIFRoZXNlIHR5cGVzIGFyZSBib3Jyb3dlZCBmcm9tIGB1bml0dGVzdC5wcm90b2AgaW4gdGhlIHByb3RvYnVmIHRyZWUuIFdlIHdhbnQKLS8vIHRvIGVuc3VyZSB0aGF0IHRoZSBiaW5hcnktZm9ybWF0IHN1cHBvcnQgd2lsbCBoYW5kbGUgYWxsIGZpZWxkIHR5cGVzCi0vLyBwcm9wZXJseS4KLW1lc3NhZ2UgVGVzdEFsbFR5cGVzIHsKLSAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKLSAgb3B0aW9uYWwgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKLSAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKLSAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKLSAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKLSAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKLSAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKLSAgb3B0aW9uYWwgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKLSAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKLSAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKLSAgb3B0aW9uYWwgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKLSAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKLSAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKLSAgb3B0aW9uYWwgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKLSAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKLSAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDE2IHsKLSAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7Ci0gIH0KLQotICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlID0gMTk7Ci0gIG9wdGlvbmFsIEZvcmVpZ25FbnVtICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKLQotICAvLyBSZXBlYXRlZAotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOwotICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOwotICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOwotICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OwotICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OwotICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OwotICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OwotICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OwotICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOwotICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOwotICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOwotICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOwotICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OwotICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OwotCi0gIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OwotICB9Ci0KLSAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA9IDQ5OwotICByZXBlYXRlZCBGb3JlaWduRW51bSAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtICAgID0gNTI7Ci0KLSAgLy8gUGFja2VkIHJlcGVhdGVkCi0gIHJlcGVhdGVkICAgIGludDMyIHBhY2tlZF9yZXBlYXRlZF9pbnQzMiAgICA9IDYxIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgIGludDY0IHBhY2tlZF9yZXBlYXRlZF9pbnQ2NCAgICA9IDYyIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgdWludDMyIHBhY2tlZF9yZXBlYXRlZF91aW50MzIgICA9IDYzIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgdWludDY0IHBhY2tlZF9yZXBlYXRlZF91aW50NjQgICA9IDY0IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgc2ludDMyIHBhY2tlZF9yZXBlYXRlZF9zaW50MzIgICA9IDY1IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgc2ludDY0IHBhY2tlZF9yZXBlYXRlZF9zaW50NjQgICA9IDY2IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICBmaXhlZDMyIHBhY2tlZF9yZXBlYXRlZF9maXhlZDMyICA9IDY3IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICBmaXhlZDY0IHBhY2tlZF9yZXBlYXRlZF9maXhlZDY0ICA9IDY4IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkIHNmaXhlZDMyIHBhY2tlZF9yZXBlYXRlZF9zZml4ZWQzMiA9IDY5IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkIHNmaXhlZDY0IHBhY2tlZF9yZXBlYXRlZF9zZml4ZWQ2NCA9IDcwIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgIGZsb2F0IHBhY2tlZF9yZXBlYXRlZF9mbG9hdCAgICA9IDcxIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgZG91YmxlIHBhY2tlZF9yZXBlYXRlZF9kb3VibGUgICA9IDcyIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgICBib29sIHBhY2tlZF9yZXBlYXRlZF9ib29sICAgICA9IDczIFtwYWNrZWQ9dHJ1ZV07Ci0KLSAgb25lb2Ygb25lb2ZfZmllbGQgewotICAgIHVpbnQzMiBvbmVvZl91aW50MzIgPSAxMTE7Ci0gICAgRm9yZWlnbk1lc3NhZ2Ugb25lb2ZfZm9yZWlnbl9tZXNzYWdlID0gMTEyOwotICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMTM7Ci0gICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMTQ7Ci0gIH0KLQotfQotCi1tZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKLSAgb3B0aW9uYWwgaW50MzIgYyA9IDE7Ci19Ci0KLWVudW0gRm9yZWlnbkVudW0gewotICBGT1JFSUdOX0ZPTyA9IDQ7Ci0gIEZPUkVJR05fQkFSID0gNTsKLSAgRk9SRUlHTl9CQVogPSA2OwotfQotCi1tZXNzYWdlIFRlc3RFeHRlbmRhYmxlIHsKLSAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKLX0KLQotbWVzc2FnZSBFeHRlbmRzV2l0aE1lc3NhZ2UgewotICBleHRlbmQgVGVzdEV4dGVuZGFibGUgewotICAgIG9wdGlvbmFsIEV4dGVuZHNXaXRoTWVzc2FnZSBvcHRpb25hbF9leHRlbnNpb24gPSAxOTsKLSAgICByZXBlYXRlZCBFeHRlbmRzV2l0aE1lc3NhZ2UgcmVwZWF0ZWRfZXh0ZW5zaW9uID0gNDk7Ci0gIH0KLSAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKLX0KLQotZXh0ZW5kIFRlc3RFeHRlbmRhYmxlIHsKLSAgb3B0aW9uYWwgICAgaW50MzIgZXh0ZW5kX29wdGlvbmFsX2ludDMyICAgID0gIDE7Ci0gIG9wdGlvbmFsICAgIGludDY0IGV4dGVuZF9vcHRpb25hbF9pbnQ2NCAgICA9ICAyOwotICBvcHRpb25hbCAgIHVpbnQzMiBleHRlbmRfb3B0aW9uYWxfdWludDMyICAgPSAgMzsKLSAgb3B0aW9uYWwgICB1aW50NjQgZXh0ZW5kX29wdGlvbmFsX3VpbnQ2NCAgID0gIDQ7Ci0gIG9wdGlvbmFsICAgc2ludDMyIGV4dGVuZF9vcHRpb25hbF9zaW50MzIgICA9ICA1OwotICBvcHRpb25hbCAgIHNpbnQ2NCBleHRlbmRfb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKLSAgb3B0aW9uYWwgIGZpeGVkMzIgZXh0ZW5kX29wdGlvbmFsX2ZpeGVkMzIgID0gIDc7Ci0gIG9wdGlvbmFsICBmaXhlZDY0IGV4dGVuZF9vcHRpb25hbF9maXhlZDY0ICA9ICA4OwotICBvcHRpb25hbCBzZml4ZWQzMiBleHRlbmRfb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKLSAgb3B0aW9uYWwgc2ZpeGVkNjQgZXh0ZW5kX29wdGlvbmFsX3NmaXhlZDY0ID0gMTA7Ci0gIG9wdGlvbmFsICAgIGZsb2F0IGV4dGVuZF9vcHRpb25hbF9mbG9hdCAgICA9IDExOwotICBvcHRpb25hbCAgIGRvdWJsZSBleHRlbmRfb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKLSAgb3B0aW9uYWwgICAgIGJvb2wgZXh0ZW5kX29wdGlvbmFsX2Jvb2wgICAgID0gMTM7Ci0gIG9wdGlvbmFsICAgc3RyaW5nIGV4dGVuZF9vcHRpb25hbF9zdHJpbmcgICA9IDE0OwotICBvcHRpb25hbCAgICBieXRlcyBleHRlbmRfb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKLSAgb3B0aW9uYWwgRm9yZWlnbkVudW0gZXh0ZW5kX29wdGlvbmFsX2ZvcmVpZ25fZW51bSAgICA9IDIyOwotCi0gIHJlcGVhdGVkICAgIGludDMyIGV4dGVuZF9yZXBlYXRlZF9pbnQzMiAgICA9IDMxOwotICByZXBlYXRlZCAgICBpbnQ2NCBleHRlbmRfcmVwZWF0ZWRfaW50NjQgICAgPSAzMjsKLSAgcmVwZWF0ZWQgICB1aW50MzIgZXh0ZW5kX3JlcGVhdGVkX3VpbnQzMiAgID0gMzM7Ci0gIHJlcGVhdGVkICAgdWludDY0IGV4dGVuZF9yZXBlYXRlZF91aW50NjQgICA9IDM0OwotICByZXBlYXRlZCAgIHNpbnQzMiBleHRlbmRfcmVwZWF0ZWRfc2ludDMyICAgPSAzNTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgZXh0ZW5kX3JlcGVhdGVkX3NpbnQ2NCAgID0gMzY7Ci0gIHJlcGVhdGVkICBmaXhlZDMyIGV4dGVuZF9yZXBlYXRlZF9maXhlZDMyICA9IDM3OwotICByZXBlYXRlZCAgZml4ZWQ2NCBleHRlbmRfcmVwZWF0ZWRfZml4ZWQ2NCAgPSAzODsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgZXh0ZW5kX3JlcGVhdGVkX3NmaXhlZDMyID0gMzk7Ci0gIHJlcGVhdGVkIHNmaXhlZDY0IGV4dGVuZF9yZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOwotICByZXBlYXRlZCAgICBmbG9hdCBleHRlbmRfcmVwZWF0ZWRfZmxvYXQgICAgPSA0MTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgZXh0ZW5kX3JlcGVhdGVkX2RvdWJsZSAgID0gNDI7Ci0gIHJlcGVhdGVkICAgICBib29sIGV4dGVuZF9yZXBlYXRlZF9ib29sICAgICA9IDQzOwotICByZXBlYXRlZCAgIHN0cmluZyBleHRlbmRfcmVwZWF0ZWRfc3RyaW5nICAgPSA0NDsKLSAgcmVwZWF0ZWQgICAgYnl0ZXMgZXh0ZW5kX3JlcGVhdGVkX2J5dGVzICAgID0gNDU7Ci0gIHJlcGVhdGVkIEZvcmVpZ25FbnVtIGV4dGVuZF9yZXBlYXRlZF9mb3JlaWduX2VudW0gICAgPSA1MjsKLQotICByZXBlYXRlZCAgICBpbnQzMiBleHRlbmRfcGFja2VkX3JlcGVhdGVkX2ludDMyICAgID0gNjEgW3BhY2tlZD10cnVlXTsKLSAgcmVwZWF0ZWQgICAgaW50NjQgZXh0ZW5kX3BhY2tlZF9yZXBlYXRlZF9pbnQ2NCAgICA9IDYyIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgdWludDMyIGV4dGVuZF9wYWNrZWRfcmVwZWF0ZWRfdWludDMyICAgPSA2MyBbcGFja2VkPXRydWVdOwotICByZXBlYXRlZCAgIHVpbnQ2NCBleHRlbmRfcGFja2VkX3JlcGVhdGVkX3VpbnQ2NCAgID0gNjQgW3BhY2tlZD10cnVlXTsKLSAgcmVwZWF0ZWQgICBzaW50MzIgZXh0ZW5kX3BhY2tlZF9yZXBlYXRlZF9zaW50MzIgICA9IDY1IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgc2ludDY0IGV4dGVuZF9wYWNrZWRfcmVwZWF0ZWRfc2ludDY0ICAgPSA2NiBbcGFja2VkPXRydWVdOwotICByZXBlYXRlZCAgZml4ZWQzMiBleHRlbmRfcGFja2VkX3JlcGVhdGVkX2ZpeGVkMzIgID0gNjcgW3BhY2tlZD10cnVlXTsKLSAgcmVwZWF0ZWQgIGZpeGVkNjQgZXh0ZW5kX3BhY2tlZF9yZXBlYXRlZF9maXhlZDY0ICA9IDY4IFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkIHNmaXhlZDMyIGV4dGVuZF9wYWNrZWRfcmVwZWF0ZWRfc2ZpeGVkMzIgPSA2OSBbcGFja2VkPXRydWVdOwotICByZXBlYXRlZCBzZml4ZWQ2NCBleHRlbmRfcGFja2VkX3JlcGVhdGVkX3NmaXhlZDY0ID0gNzAgW3BhY2tlZD10cnVlXTsKLSAgcmVwZWF0ZWQgICAgZmxvYXQgZXh0ZW5kX3BhY2tlZF9yZXBlYXRlZF9mbG9hdCAgICA9IDcxIFtwYWNrZWQ9dHJ1ZV07Ci0gIHJlcGVhdGVkICAgZG91YmxlIGV4dGVuZF9wYWNrZWRfcmVwZWF0ZWRfZG91YmxlICAgPSA3MiBbcGFja2VkPXRydWVdOwotICByZXBlYXRlZCAgICAgYm9vbCBleHRlbmRfcGFja2VkX3JlcGVhdGVkX2Jvb2wgICAgID0gNzMgW3BhY2tlZD10cnVlXTsKLSAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gZXh0ZW5kX3BhY2tlZF9yZXBlYXRlZF9mb3JlaWduX2VudW0gICAgPSA4MgotICAgICAgW3BhY2tlZD10cnVlXTsKLQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdGVtcHR5LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvanMvdGVzdGVtcHR5LnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjBiY2U0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2pzL3Rlc3RlbXB0eS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDM0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBqYXZhdGVzdHMuY29tLmdvb2dsZS5hcHBzLmpzcGI7Ci0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvRGV2VG9vbHMvY2hlY2tfdmVyc2lvbl9zdGFtcHMuc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0RldlRvb2xzL2NoZWNrX3ZlcnNpb25fc3RhbXBzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMjViNzFkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvRGV2VG9vbHMvY2hlY2tfdmVyc2lvbl9zdGFtcHMuc2gKKysrIC9kZXYvbnVsbApAQCAtMSw1NiArMCwwIEBACi0jIS9iaW4vYmFzaAotCi0jIFRoaXMgc2NyaXB0IGNoZWNrcyB0aGF0IHRoZSBydW50aW1lIHZlcnNpb24gbnVtYmVyIGNvbnN0YW50IGluIHRoZSBjb21waWxlcgotIyBzb3VyY2UgYW5kIGluIHRoZSBydW50aW1lIHNvdXJjZSBpcyB0aGUgc2FtZS4KLSMKLSMgQSBkaXN0cm8gY2FuIGJlIG1hZGUgb2YgdGhlIHByb3RvYnVmIHNvdXJjZXMgd2l0aCBvbmx5IGEgc3Vic2V0IG9mIHRoZQotIyBsYW5ndWFnZXMsIHNvIGlmIHRoZSBjb21waWxlciBkZXBlbmRlZCBvbiB0aGUgT2JqZWN0aXZlIEMgcnVudGltZSwgdGhvc2UKLSMgYnVpbGRzIHdvdWxkIGJyZWFrLiBBdCB0aGUgc2FtZSB0aW1lLCB3ZSBkb24ndCB3YW50IHRoZSBydW50aW1lIHNvdXJjZQotIyBkZXBlbmRpbmcgb24gdGhlIGNvbXBpbGVyIHNvdXJjZXM7IHNvIHR3byBjb3BpZXMgb2YgdGhlIGNvbnN0YW50IGFyZSBuZWVkZWQuCi0KLXNldCAtZXUKLQotcmVhZG9ubHkgU2NyaXB0RGlyPSQoZGlybmFtZSAiJChlY2hvICQwIHwgc2VkIC1lICJzLF5cKFteL11cKSwkKHB3ZCkvXDEsIikiKQotcmVhZG9ubHkgUHJvdG9Sb290RGlyPSIke1NjcmlwdERpcn0vLi4vLi4iCi0KLWRpZSgpIHsKLSAgICBlY2hvICJFcnJvcjogJDEiCi0gICAgZXhpdCAxCi19Ci0KLXJlYWRvbmx5IENvbnN0YW50TmFtZT1HT09HTEVfUFJPVE9CVUZfT0JKQ19HRU5fVkVSU0lPTgotCi0jIENvbGxlY3QgdmVyc2lvbiBmcm9tIHBsdWdpbiBzb3VyY2VzLgotCi1yZWFkb25seSBQbHVnaW5TcmM9IiR7UHJvdG9Sb290RGlyfS9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmNjIgotcmVhZG9ubHkgUGx1Z2luVmVyc2lvbj0kKCBcCi0gICAgY2F0ICIke1BsdWdpblNyY30iIFwKLSAgICAgICAgfCBzZWQgLW4gLWUgInM6Y29uc3QgaW50MzIgJHtDb25zdGFudE5hbWV9ID0gXChbMC05XSpcKTs6XDE6cCIKLSkKLQotaWYgW1sgLXogIiR7UGx1Z2luVmVyc2lvbn0iIF1dIDsgdGhlbgotICAgIGRpZSAiRmFpbGVkIHRvIGZpbmQgJHtDb25zdGFudE5hbWV9IGluIHRoZSBwbHVnaW4gc291cmNlICgke1BsdWdpblNyY30pLiIKLWZpCi0KLSMgQ29sbGVjdCB2ZXJzaW9uIGZyb20gcnVudGltZSBzb3VyY2VzLgotCi1yZWFkb25seSBSdW50aW1lU3JjPSIke1Byb3RvUm9vdERpcn0vb2JqZWN0aXZlYy9HUEJCb290c3RyYXAuaCIKLXJlYWRvbmx5IFJ1bnRpbWVWZXJzaW9uPSQoIFwKLSAgICBjYXQgIiR7UnVudGltZVNyY30iIFwKLSAgICAgICAgfCBzZWQgLW4gLWUgInM6I2RlZmluZSAke0NvbnN0YW50TmFtZX0gXChbMC05XSpcKTpcMTpwIgotKQotCi1pZiBbWyAteiAiJHtSdW50aW1lVmVyc2lvbn0iIF1dIDsgdGhlbgotICAgIGRpZSAiRmFpbGVkIHRvIGZpbmQgJHtDb25zdGFudE5hbWV9IGluIHRoZSBydW50aW1lIHNvdXJjZSAoJHtSdW50aW1lU3JjfSkuIgotZmkKLQotIyBDb21wYXJlIHRoZW0uCi0KLWlmIFtbICIke1BsdWdpblZlcnNpb259IiAhPSAiJHtSdW50aW1lVmVyc2lvbn0iIF1dIDsgdGhlbgotICAgIGRpZSAiVmVyc2lvbnMgZG9uJ3QgbWF0Y2ghCi0gICBQbHVnaW46ICR7UGx1Z2luVmVyc2lvbn0gZnJvbSAke1BsdWdpblNyY30KLSAgUnVudGltZTogJHtSdW50aW1lVmVyc2lvbn0gZnJvbSAke1J1bnRpbWVTcmN9Ci0iCi1maQotCi0jIFN1Y2Nlc3MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvRGV2VG9vbHMvY29tcGlsZV90ZXN0aW5nX3Byb3Rvcy5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvRGV2VG9vbHMvY29tcGlsZV90ZXN0aW5nX3Byb3Rvcy5zaApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODI5NTMxMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0RldlRvb2xzL2NvbXBpbGVfdGVzdGluZ19wcm90b3Muc2gKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotIyEvYmluL2Jhc2gKLQotIyBJbnZva2VkIGJ5IHRoZSBYY29kZSBwcm9qZWN0cyB0byBidWlsZCB0aGUgcHJvdG9zIG5lZWRlZCBmb3IgdGhlIHVuaXR0ZXN0cy4KLQotc2V0IC1ldQotCi1yZWFkb25seSBPVVRQVVRfRElSPSIke1BST0pFQ1RfREVSSVZFRF9GSUxFX0RJUn0vcHJvdG9zIgotCi0jIEhlbHBlciBmb3IgYmFpbGluZy4KLWRpZSgpIHsKLSAgZWNobyAiRXJyb3I6ICQxIgotICBleGl0IDIKLX0KLQotIyBXaGF0IHRvIGRvLgotY2FzZSAiJHtBQ1RJT059IiBpbgotICAiIikKLSAgICAjIEJ1aWxkLCBmYWxsIHRocnUKLSAgICA7OwotICAiY2xlYW4iKQotICAgIHJtIC1yZiAiJHtPVVRQVVRfRElSfSIKLSAgICBleGl0IDAKLSAgICA7OwotICAqKQotICAgIGRpZSAiVW5rbm93biBhY3Rpb24gcmVxdWVzdGVkOiAke0FDVElPTn0iCi0gICAgOzsKLWVzYWMKLQotIyBNb3ZlIHRvIHRoZSB0b3Agb2YgdGhlIHByb3RvYnVmIGRpcmVjdG9yaWVzLgotY2QgIiR7U1JDUk9PVH0vLi4iCi0KLVtbIC14IHNyYy9wcm90b2MgXV0gfHwgXAotICBkaWUgIkNvdWxkIG5vdCBmaW5kIHRoZSBwcm90b2MgYmluYXJ5OyBtYWtlIHN1cmUgeW91IGhhdmUgYnVpbHQgaXQgKG9iamVjdGl2ZWMvRGV2VG9vbHMvZnVsbF9tYWNfYnVpbGQuc2ggLWgpLiIKLQotUlVOX1BST1RPQz1ubwotaWYgW1sgISAtZCAiJHtPVVRQVVRfRElSfSIgXV0gOyB0aGVuCi0gIFJVTl9QUk9UT0M9eWVzCi1lbHNlCi0gICMgRmluZCB0aGUgbmV3ZXN0IGlucHV0IGZpbGUgKHByb3RvcywgY29tcGlsZXIsIGFuZCB0aGlzIHNjcmlwdCkuCi0gICMgKHRoZXNlIHBhdHRlcm5zIGNhdGNoIHNvbWUgZXh0cmEgc3R1ZmYsIGJ1dCBiZXR0ZXIgdG8gb3ZlciBzYW1wbGUgdGhhbgotICAjIHVuZGVyKQotICByZWFkb25seSBOZXdlc3RJbnB1dD0kKGZpbmQgXAotICAgICBzcmMvZ29vZ2xlL3Byb3RvYnVmLyoucHJvdG8gXAotICAgICBvYmplY3RpdmVjL1Rlc3RzLyoucHJvdG8gXAotICAgICBzcmMvLmxpYnMgc3JjLyoubGEgc3JjL3Byb3RvYyBcCi0gICAgIG9iamVjdGl2ZWMvRGV2VG9vbHMvY29tcGlsZV90ZXN0aW5nX3Byb3Rvcy5zaCBcCi0gICAgICAgIC10eXBlIGYgLXByaW50MCBcCi0gICAgICAgIHwgeGFyZ3MgLTAgc3RhdCAtZiAiJW0gJU4iIFwKLSAgICAgICAgfCBzb3J0IC1uIHwgdGFpbCAtbjEgfCBjdXQgLWYyLSAtZCIgIikKLSAgIyBGaW5kIHRoZSBvbGRlc3Qgb3V0cHV0IGZpbGUuCi0gIHJlYWRvbmx5IE9sZGVzdE91dHB1dD0kKGZpbmQgXAotICAgICAgICAiJHtPVVRQVVRfRElSfSIgXAotICAgICAgICAtdHlwZSBmIC1wcmludDAgXAotICAgICAgICB8IHhhcmdzIC0wIHN0YXQgLWYgIiVtICVOIiBcCi0gICAgICAgIHwgc29ydCAtbiAtciB8IHRhaWwgLW4xIHwgY3V0IC1mMi0gLWQiICIpCi0gICMgSWYgdGhlIG5ld2VzdCBpbnB1dCBpcyBuZXdlciB0aGFuIHRoZSBvbGRlc3Qgb3V0cHV0LCByZWdlbmVyYXRlLgotICBpZiBbWyAiJHtOZXdlc3RJbnB1dH0iIC1udCAiJHtPbGRlc3RPdXRwdXR9IiBdXSA7IHRoZW4KLSAgICBSVU5fUFJPVE9DPXllcwotICBmaQotZmkKLQotaWYgW1sgIiR7UlVOX1BST1RPQ30iICE9ICJ5ZXMiIF1dIDsgdGhlbgotICAjIFVwIHRvIGRhdGUuCi0gIGV4aXQgMAotZmkKLQotIyBFbnN1cmUgdGhlIG91dHB1dCBkaXIgZXhpc3RzCi1ta2RpciAtcCAiJHtPVVRQVVRfRElSfS9nb29nbGUvcHJvdG9idWYiCi0KLUNPUkVfUFJPVE9fRklMRVM9KAotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnByb3RvCi0gIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8KLSAgc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvCi0gIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvCi0gIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8KLSAgc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8KLSAgc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90bwotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8KLSAgc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCi0gIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wcm90bwotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hLnByb3RvCi0gIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfaW1wb3J0LnByb3RvCi0gIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90bwotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90bwotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvCi0gIHNyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90bwotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90bwotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucHJvdG8KLSAgc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucHJvdG8KLSAgc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wcm90bwotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8KLSAgc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucHJvdG8KLSkKLQotIyBUaGUgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gZXh0ZW5kcyB0aGUgbWVzc2FnZXMgaW4gZGVzY3JpcHRvci5wcm90bwotIyBzbyB3ZSBidWlsZCBpdCBpbiB0byB0ZXN0IGV4dGVuZGluZyBpbiBnZW5lcmFsLiBUaGUgbGlicmFyeSBkb2Vzbid0IHByb3ZpZGUKLSMgYSBkZXNjcmlwdG9yIGFzIGl0IGRvZXNuJ3QgdXNlIHRoZSBjbGFzc2VzL2VudW1zLgotQ09SRV9QUk9UT19GSUxFUys9KAotICBzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KLSkKLQotY29tcGlsZV9wcm90bygpIHsKLSAgc3JjL3Byb3RvYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIC0tb2JqY19vdXQ9IiR7T1VUUFVUX0RJUn0vZ29vZ2xlL3Byb3RvYnVmIiBcCi0gICAgLS1wcm90b19wYXRoPXNyYy9nb29nbGUvcHJvdG9idWYvICAgICAgICAgIFwKLSAgICAtLXByb3RvX3BhdGg9c3JjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICQqCi19Ci0KLWZvciBhX3Byb3RvIGluICIke0NPUkVfUFJPVE9fRklMRVNbQF19IiA7IGRvCi0gIGNvbXBpbGVfcHJvdG8gIiR7YV9wcm90b30iCi1kb25lCi0KLU9CSkNfUFJPVE9fRklMRVM9KAotICBvYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X2N5Y2xlLnByb3RvCi0gIG9iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3RfcnVudGltZV9wcm90bzIucHJvdG8KLSAgb2JqZWN0aXZlYy9UZXN0cy91bml0dGVzdF9ydW50aW1lX3Byb3RvMy5wcm90bwotICBvYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X29iamMucHJvdG8KLSAgb2JqZWN0aXZlYy9UZXN0cy91bml0dGVzdF9vYmpjX3N0YXJ0dXAucHJvdG8KLSkKLQotZm9yIGFfcHJvdG8gaW4gIiR7T0JKQ19QUk9UT19GSUxFU1tAXX0iIDsgZG8KLSAgY29tcGlsZV9wcm90byAtLXByb3RvX3BhdGg9Im9iamVjdGl2ZWMvVGVzdHMiICIke2FfcHJvdG99IgotZG9uZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9EZXZUb29scy9mdWxsX21hY19idWlsZC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvRGV2VG9vbHMvZnVsbF9tYWNfYnVpbGQuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGZmNTFkOWYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9EZXZUb29scy9mdWxsX21hY19idWlsZC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDI3MSArMCwwIEBACi0jIS9iaW4vYmFzaAotIwotIyBIZWxwZXIgdG8gZG8gYnVpbGQgc28geW91IGRvbid0IGhhdmUgdG8gcmVtZW1iZXIgYWxsIHRoZSBzdGVwcy9hcmdzLgotCi0KLXNldCAtZXUKLQotIyBTb21lIGJhc2UgbG9jYXRpb25zLgotcmVhZG9ubHkgU2NyaXB0RGlyPSQoZGlybmFtZSAiJChlY2hvICQwIHwgc2VkIC1lICJzLF5cKFteL11cKSwkKHB3ZCkvXDEsIikiKQotcmVhZG9ubHkgUHJvdG9Sb290RGlyPSIke1NjcmlwdERpcn0vLi4vLi4iCi0KLXByaW50VXNhZ2UoKSB7Ci0gIE5BTUU9JChiYXNlbmFtZSAiJHswfSIpCi0gIGNhdCA8PCBFT0YKLXVzYWdlOiAke05BTUV9IFtPUFRJT05TXQotCi1UaGlzIHNjcmlwdCBkb2VzIHRoZSBjb21tb24gYnVpbGQgc3RlcHMgbmVlZGVkLgotCi1PUFRJT05TOgotCi0gR2VuZXJhbDoKLQotICAgLWgsIC0taGVscAotICAgICAgICAgU2hvdyB0aGlzIG1lc3NhZ2UKLSAgIC1jLCAtLWNsZWFuCi0gICAgICAgICBJc3N1ZSBhIGNsZWFuIGJlZm9yZSB0aGUgbm9ybWFsIGJ1aWxkLgotICAgLWEsIC0tYXV0b2dlbgotICAgICAgICAgU3RhcnQgYnkgcmVydW5uaW5nIGF1dG9nZW4gJiBjb25maWd1cmUuCi0gICAtciwgLS1yZWdlbmVyYXRlLWRlc2NyaXB0b3JzCi0gICAgICAgICBSdW4gZ2VuZXJhdGVfZGVzY3JpcHRvcl9wcm90by5zaCB0byByZWdlbmVyYXRlIGFsbCB0aGUgY2hlY2tlZCBpbgotICAgICAgICAgcHJvdG8gc291cmNlcy4KLSAgIC1qICMsIC0tam9icyAjCi0gICAgICAgICBGb3JjZSB0aGUgbnVtYmVyIG9mIHBhcmFsbGVsIGpvYnMgKHVzZWZ1bCBmb3IgZGVidWdnaW5nIGJ1aWxkIGlzc3VlcykuCi0gICAtLWNvcmUtb25seQotICAgICAgICAgU2tpcCBzb21lIG9mIHRoZSBjb3JlIHByb3RvYnVmIGJ1aWxkL2NoZWNrcyB0byBzaG9ydGVuIHRoZSBidWlsZCB0aW1lLgotICAgLS1za2lwLXhjb2RlCi0gICAgICAgICBTa2lwIHRoZSBpbnZva2Ugb2YgWGNvZGUgdG8gdGVzdCB0aGUgcnVudGltZSBvbiBib3RoIGlPUyBhbmQgT1MgWC4KLSAgIC0tc2tpcC14Y29kZS1pb3MKLSAgICAgICAgIFNraXAgdGhlIGludm9rZSBvZiBYY29kZSB0byB0ZXN0IHRoZSBydW50aW1lIG9uIGlPUy4KLSAgIC0tc2tpcC14Y29kZS1vc3gKLSAgICAgICAgIFNraXAgdGhlIGludm9rZSBvZiBYY29kZSB0byB0ZXN0IHRoZSBydW50aW1lIG9uIE9TIFguCi0gICAtLXNraXAtb2JqYy1jb25mb3JtYW5jZQotICAgICAgICAgU2tpcCB0aGUgT2JqZWN0aXZlIEMgY29uZm9ybWFuY2UgdGVzdHMgKHJ1biBvbiBPUyBYKS4KLQotRU9GCi19Ci0KLWhlYWRlcigpIHsKLSAgZWNobyAiIgotICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCi0gIGVjaG8gIiAgICAke0B9IgotICBlY2hvICI9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0iCi19Ci0KLSMgVGhhbmtzIHRvIGxpYnRvb2wsIGJ1aWxkcyBjYW4gZmFpbCBpbiBvZGQgd2F5cyBhbmQgc2luY2UgaXQgZWF0cyBzb21lIG91dHB1dAotIyBpdCBjYW4gYmUgaGFyZCB0byBzcG90LCBzbyBmb3JjZSBlcnJvciBvdXRwdXQgaWYgbWFrZSBleGl0cyB3aXRoIGEgbm9uIHplcm8uCi13cmFwcGVkX21ha2UoKSB7Ci0gIHNldCArZSAgIyBEb24ndCBzdG9wIGlmIHRoZSBjb21tYW5kIGZhaWxzLgotICBtYWtlICQqCi0gIE1BS0VfRVhJVF9TVEFUVVM9JD8KLSAgaWYgWyAke01BS0VfRVhJVF9TVEFUVVN9IC1uZSAwIF07IHRoZW4KLSAgICBlY2hvICJFcnJvcjogJ21ha2UgJConIGV4aXRlZCB3aXRoIHN0YXR1cyAke01BS0VfRVhJVF9TVEFUVVN9IgotICAgIGV4aXQgJHtNQUtFX0VYSVRfU1RBVFVTfQotICBmaQotICBzZXQgLWUKLX0KLQotTlVNX01BS0VfSk9CUz0kKC91c3Ivc2Jpbi9zeXNjdGwgLW4gaHcubmNwdSkKLWlmIFtbICIke05VTV9NQUtFX0pPQlN9IiAtbHQgNCBdXSA7IHRoZW4KLSAgTlVNX01BS0VfSk9CUz00Ci1maQotCi1ET19BVVRPR0VOPW5vCi1ET19DTEVBTj1ubwotUkVHRU5fREVTQ1JJUFRPUlM9bm8KLUNPUkVfT05MWT1ubwotRE9fWENPREVfSU9TX1RFU1RTPXllcwotRE9fWENPREVfT1NYX1RFU1RTPXllcwotRE9fT0JKQ19DT05GT1JNQU5DRV9URVNUUz15ZXMKLXdoaWxlIFtbICQjICE9IDAgXV07IGRvCi0gIGNhc2UgIiR7MX0iIGluCi0gICAgLWggfCAtLWhlbHAgKQotICAgICAgcHJpbnRVc2FnZQotICAgICAgZXhpdCAwCi0gICAgICA7OwotICAgIC1jIHwgLS1jbGVhbiApCi0gICAgICBET19DTEVBTj15ZXMKLSAgICAgIDs7Ci0gICAgLWEgfCAtLWF1dG9nZW4gKQotICAgICAgRE9fQVVUT0dFTj15ZXMKLSAgICAgIDs7Ci0gICAgLXIgfCAtLXJlZ2VuZXJhdGUtZGVzY3JpcHRvcnMgKQotICAgICAgUkVHRU5fREVTQ1JJUFRPUlM9eWVzCi0gICAgICA7OwotICAgIC1qIHwgLS1qb2JzICkKLSAgICAgIHNoaWZ0Ci0gICAgICBOVU1fTUFLRV9KT0JTPSIkezF9IgotICAgICAgOzsKLSAgICAtLWNvcmUtb25seSApCi0gICAgICBDT1JFX09OTFk9eWVzCi0gICAgICA7OwotICAgIC0tc2tpcC14Y29kZSApCi0gICAgICBET19YQ09ERV9JT1NfVEVTVFM9bm8KLSAgICAgIERPX1hDT0RFX09TWF9URVNUUz1ubwotICAgICAgOzsKLSAgICAtLXNraXAteGNvZGUtaW9zICkKLSAgICAgIERPX1hDT0RFX0lPU19URVNUUz1ubwotICAgICAgOzsKLSAgICAtLXNraXAteGNvZGUtb3N4ICkKLSAgICAgIERPX1hDT0RFX09TWF9URVNUUz1ubwotICAgICAgOzsKLSAgICAtLXNraXAtb2JqYy1jb25mb3JtYW5jZSApCi0gICAgICBET19PQkpDX0NPTkZPUk1BTkNFX1RFU1RTPW5vCi0gICAgICA7OwotICAgIC0qKQotICAgICAgZWNobyAiRVJST1I6IFVua25vd24gb3B0aW9uOiAkezF9IiAxPiYyCi0gICAgICBwcmludFVzYWdlCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gICAgKikKLSAgICAgIGVjaG8gIkVSUk9SOiBVbmtub3duIGFyZ3VtZW50OiAkezF9IiAxPiYyCi0gICAgICBwcmludFVzYWdlCi0gICAgICBleGl0IDEKLSAgICAgIDs7Ci0gIGVzYWMKLSAgc2hpZnQKLWRvbmUKLQotIyBJbnRvIHRoZSBwcm90byBkaXIuCi1jZCAiJHtQcm90b1Jvb3REaXJ9IgotCi0jIGlmIG5vIE1ha2VmaWxlLCBmb3JjZSB0aGUgYXV0b2dlbi4KLWlmIFtbICEgLWYgTWFrZWZpbGUgXV0gOyB0aGVuCi0gIERPX0FVVE9HRU49eWVzCi1maQotCi1pZiBbWyAiJHtET19BVVRPR0VOfSIgPT0gInllcyIgXV0gOyB0aGVuCi0gIGhlYWRlciAiUnVubmluZyBhdXRvZ2VuICYgY29uZmlndXJlIgotICAuL2F1dG9nZW4uc2gKLSAgLi9jb25maWd1cmUgXAotICAgIENQUEZMQUdTPSItbW1hY29zeC12ZXJzaW9uLW1pbj0xMC45IC1XdW51c2VkLWNvbnN0LXZhcmlhYmxlIC1XdW51c2VkLWZ1bmN0aW9uIiBcCi0gICAgQ1hYRkxBR1M9Ii1Xbm9uLXZpcnR1YWwtZHRvciAtV292ZXJsb2FkZWQtdmlydHVhbCIKLWZpCi0KLWlmIFtbICIke0RPX0NMRUFOfSIgPT0gInllcyIgXV0gOyB0aGVuCi0gIGhlYWRlciAiQ2xlYW5pbmciCi0gIHdyYXBwZWRfbWFrZSBjbGVhbgotICBpZiBbWyAiJHtET19YQ09ERV9JT1NfVEVTVFN9IiA9PSAieWVzIiBdXSA7IHRoZW4KLSAgICBYQ09ERUJVSUxEX0NMRUFOX0JBU0VfSU9TPSgKLSAgICAgIHhjb2RlYnVpbGQKLSAgICAgICAgLXByb2plY3Qgb2JqZWN0aXZlYy9Qcm90b2NvbEJ1ZmZlcnNfaU9TLnhjb2RlcHJvagotICAgICAgICAtc2NoZW1lIFByb3RvY29sQnVmZmVycwotICAgICkKLSAgIiR7WENPREVCVUlMRF9DTEVBTl9CQVNFX0lPU1tAXX0iIC1jb25maWd1cmF0aW9uIERlYnVnIGNsZWFuCi0gICIke1hDT0RFQlVJTERfQ0xFQU5fQkFTRV9JT1NbQF19IiAtY29uZmlndXJhdGlvbiBSZWxlYXNlIGNsZWFuCi0gIGZpCi0gIGlmIFtbICIke0RPX1hDT0RFX09TWF9URVNUU30iID09ICJ5ZXMiIF1dIDsgdGhlbgotICAgIFhDT0RFQlVJTERfQ0xFQU5fQkFTRV9PU1g9KAotICAgICAgeGNvZGVidWlsZAotICAgICAgICAtcHJvamVjdCBvYmplY3RpdmVjL1Byb3RvY29sQnVmZmVyc19PU1gueGNvZGVwcm9qCi0gICAgICAgIC1zY2hlbWUgUHJvdG9jb2xCdWZmZXJzCi0gICAgKQotICAiJHtYQ09ERUJVSUxEX0NMRUFOX0JBU0VfT1NYW0BdfSIgLWNvbmZpZ3VyYXRpb24gRGVidWcgY2xlYW4KLSAgIiR7WENPREVCVUlMRF9DTEVBTl9CQVNFX09TWFtAXX0iIC1jb25maWd1cmF0aW9uIFJlbGVhc2UgY2xlYW4KLSAgZmkKLWZpCi0KLWlmIFtbICIke1JFR0VOX0RFU0NSSVBUT1JTfSIgPT0gInllcyIgXV0gOyB0aGVuCi0gIGhlYWRlciAiUmVnZW5lcmF0aW5nIHRoZSBkZXNjcmlwdG9yIHNvdXJjZXMuIgotICAuL2dlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2ggLWogIiR7TlVNX01BS0VfSk9CU30iCi1maQotCi1pZiBbWyAiJHtDT1JFX09OTFl9IiA9PSAieWVzIiBdXSA7IHRoZW4KLSAgaGVhZGVyICJCdWlsZGluZyBjb3JlIE9ubHkiCi0gIHdyYXBwZWRfbWFrZSAtaiAiJHtOVU1fTUFLRV9KT0JTfSIKLWVsc2UKLSAgaGVhZGVyICJCdWlsZGluZyIKLSAgIyBDYW4ndCBpc3N1ZSB0aGVzZSB0b2dldGhlciwgd2hlbiBmdWxseSBwYXJhbGxlbCwgc29tZXRoaW5nIHNvbWV0aW1lcyBjaG9rZXMKLSAgIyBhdCByYW5kb20uCi0gIHdyYXBwZWRfbWFrZSAtaiAiJHtOVU1fTUFLRV9KT0JTfSIgYWxsCi0gIHdyYXBwZWRfbWFrZSAtaiAiJHtOVU1fTUFLRV9KT0JTfSIgY2hlY2sKLSAgIyBGaXJlIG9mZiB0aGUgY29uZm9ybWFuY2UgdGVzdHMgYWxzby4KLSAgY2QgY29uZm9ybWFuY2UKLSAgd3JhcHBlZF9tYWtlIC1qICIke05VTV9NQUtFX0pPQlN9IiB0ZXN0X2NwcAotICBjZCAuLgotZmkKLQotIyBFbnN1cmUgdGhlIFdLVCBzb3VyY2VzIGNoZWNrZWQgaW4gYXJlIGN1cnJlbnQuCi1vYmplY3RpdmVjL2dlbmVyYXRlX3dlbGxfa25vd25fdHlwZXMuc2ggLS1jaGVjay1vbmx5IC1qICIke05VTV9NQUtFX0pPQlN9IgotCi1oZWFkZXIgIkNoZWNraW5nIG9uIHRoZSBPYmpDIFJ1bnRpbWUgQ29kZSIKLW9iamVjdGl2ZWMvRGV2VG9vbHMvcGRkbV90ZXN0cy5weQotaWYgISBvYmplY3RpdmVjL0RldlRvb2xzL3BkZG0ucHkgLS1kcnktcnVuIG9iamVjdGl2ZWMvKi5baG1dIG9iamVjdGl2ZWMvVGVzdHMvKi5baG1dIDsgdGhlbgotICBlY2hvICIiCi0gIGVjaG8gIlVwZGF0ZSBieSBydW5uaW5nOiIKLSAgZWNobyAiICAgb2JqZWN0aXZlYy9EZXZUb29scy9wZGRtLnB5IG9iamVjdGl2ZWMvKi5baG1dIG9iamVjdGl2ZWMvVGVzdHMvKi5baG1dIgotICBleGl0IDEKLWZpCi0KLWlmIFtbICIke0RPX1hDT0RFX0lPU19URVNUU30iID09ICJ5ZXMiIF1dIDsgdGhlbgotICBYQ09ERUJVSUxEX1RFU1RfQkFTRV9JT1M9KAotICAgIHhjb2RlYnVpbGQKLSAgICAgIC1wcm9qZWN0IG9iamVjdGl2ZWMvUHJvdG9jb2xCdWZmZXJzX2lPUy54Y29kZXByb2oKLSAgICAgIC1zY2hlbWUgUHJvdG9jb2xCdWZmZXJzCi0gICkKLSAgIyBEb24ndCBuZWVkIHRvIHdvcnJ5IGFib3V0IGZvcm0gZmFjdG9ycyBvciByZXRpbmEvbm9uIHJldGluYTsKLSAgIyBqdXN0IHBpY2sgYSBtaXggb2YgT1MgVmVyc2lvbnMgYW5kIDMyLzY0IGJpdC4KLSAgIyBOT1RFOiBEaWZmZXJlbnQgWGNvZGUgaGF2ZSBkaWZmZXJlbnQgc2ltdWxhdGVkIGhhcmR3YXJlL29zIHN1cHBvcnQuCi0gIHJlYWRvbmx5IFhDT0RFX1ZFUlNJT05fTElORT0iJCh4Y29kZWJ1aWxkIC12ZXJzaW9uIHwgZ3JlcCBYY29kZVwgICkiCi0gIHJlYWRvbmx5IFhDT0RFX1ZFUlNJT049IiR7WENPREVfVkVSU0lPTl9MSU5FL1hjb2RlIC99IiAgIyBkcm9wIHRoZSBwcmVmaXguCi0gIElPU19TSU1VTEFUT1JfTkFNRT0iU2ltdWxhdG9yIgotICBjYXNlICIke1hDT0RFX1ZFUlNJT059IiBpbgotICAgIDYuKiApCi0gICAgICBlY2hvICJFUlJPUjogWGNvZGUgNi4zLzYuNCBubyBsb25nZXIgc3VwcG9ydGVkIGZvciBidWlsZGluZywgcGxlYXNlIHVzZSA3LjAgb3IgaGlnaGVyLiIgMT4mMgotICAgICAgZXhpdCAxMAotICAgICAgOzsKLSAgICA3LjEqICkKLSAgICAgIFhDT0RFQlVJTERfVEVTVF9CQVNFX0lPUys9KAotICAgICAgICAgIC1kZXN0aW5hdGlvbiAicGxhdGZvcm09aU9TIFNpbXVsYXRvcixuYW1lPWlQaG9uZSA0cyxPUz04LjEiICMgMzJiaXQKLSAgICAgICAgICAtZGVzdGluYXRpb24gInBsYXRmb3JtPWlPUyBTaW11bGF0b3IsbmFtZT1pUGhvbmUgNixPUz05LjAiICMgNjRiaXQKLSAgICAgICAgICAtZGVzdGluYXRpb24gInBsYXRmb3JtPWlPUyBTaW11bGF0b3IsbmFtZT1pUGFkIDIsT1M9OC4xIiAjIDMyYml0Ci0gICAgICAgICAgLWRlc3RpbmF0aW9uICJwbGF0Zm9ybT1pT1MgU2ltdWxhdG9yLG5hbWU9aVBhZCBBaXIsT1M9OS4wIiAjIDY0Yml0Ci0gICAgICApCi0gICAgICA7OwotICAgIDcuMyogKQotICAgICAgWENPREVCVUlMRF9URVNUX0JBU0VfSU9TKz0oCi0gICAgICAgICAgLWRlc3RpbmF0aW9uICJwbGF0Zm9ybT1pT1MgU2ltdWxhdG9yLG5hbWU9aVBob25lIDRzLE9TPTguMSIgIyAzMmJpdAotICAgICAgICAgIC1kZXN0aW5hdGlvbiAicGxhdGZvcm09aU9TIFNpbXVsYXRvcixuYW1lPWlQaG9uZSA2LE9TPTkuMyIgIyA2NGJpdAotICAgICAgICAgIC1kZXN0aW5hdGlvbiAicGxhdGZvcm09aU9TIFNpbXVsYXRvcixuYW1lPWlQYWQgMixPUz04LjEiICMgMzJiaXQKLSAgICAgICAgICAtZGVzdGluYXRpb24gInBsYXRmb3JtPWlPUyBTaW11bGF0b3IsbmFtZT1pUGFkIEFpcixPUz05LjMiICMgNjRiaXQKLSAgICAgICkKLSAgICAgIDs7Ci0gICAgNy4qICkKLSAgICAgIFhDT0RFQlVJTERfVEVTVF9CQVNFX0lPUys9KAotICAgICAgICAgIC1kZXN0aW5hdGlvbiAicGxhdGZvcm09aU9TIFNpbXVsYXRvcixuYW1lPWlQaG9uZSA0cyxPUz04LjEiICMgMzJiaXQKLSAgICAgICAgICAtZGVzdGluYXRpb24gInBsYXRmb3JtPWlPUyBTaW11bGF0b3IsbmFtZT1pUGhvbmUgNixPUz05LjIiICMgNjRiaXQKLSAgICAgICAgICAtZGVzdGluYXRpb24gInBsYXRmb3JtPWlPUyBTaW11bGF0b3IsbmFtZT1pUGFkIDIsT1M9OC4xIiAjIDMyYml0Ci0gICAgICAgICAgLWRlc3RpbmF0aW9uICJwbGF0Zm9ybT1pT1MgU2ltdWxhdG9yLG5hbWU9aVBhZCBBaXIsT1M9OS4yIiAjIDY0Yml0Ci0gICAgICApCi0gICAgICA7OwotICAgICogKQotICAgICAgZWNobyAiVGltZSB0byB1cGRhdGUgdGhlIHNpbXVsYXRvciB0YXJnZXRzIGZvciBYY29kZSAke1hDT0RFX1ZFUlNJT059IgotICAgICAgZXhpdCAyCi0gICAgICA7OwotICBlc2FjCi0gIGhlYWRlciAiRG9pbmcgWGNvZGUgaU9TIGJ1aWxkL3Rlc3RzIC0gRGVidWciCi0gICIke1hDT0RFQlVJTERfVEVTVF9CQVNFX0lPU1tAXX0iIC1jb25maWd1cmF0aW9uIERlYnVnIHRlc3QKLSAgaGVhZGVyICJEb2luZyBYY29kZSBpT1MgYnVpbGQvdGVzdHMgLSBSZWxlYXNlIgotICAiJHtYQ09ERUJVSUxEX1RFU1RfQkFTRV9JT1NbQF19IiAtY29uZmlndXJhdGlvbiBSZWxlYXNlIHRlc3QKLSAgIyBEb24ndCBsZWF2ZSB0aGUgc2ltdWxhdG9yIGluIHRoZSBkZXZlbG9wZXIncyBmYWNlLgotICBraWxsYWxsICIke0lPU19TSU1VTEFUT1JfTkFNRX0iCi1maQotaWYgW1sgIiR7RE9fWENPREVfT1NYX1RFU1RTfSIgPT0gInllcyIgXV0gOyB0aGVuCi0gIFhDT0RFQlVJTERfVEVTVF9CQVNFX09TWD0oCi0gICAgeGNvZGVidWlsZAotICAgICAgLXByb2plY3Qgb2JqZWN0aXZlYy9Qcm90b2NvbEJ1ZmZlcnNfT1NYLnhjb2RlcHJvagotICAgICAgLXNjaGVtZSBQcm90b2NvbEJ1ZmZlcnMKLSAgICAgICMgU2luY2UgdGhlIE9iakMgMi4wIFJ1bnRpbWUgaXMgcmVxdWlyZWQsIDMyYml0IE9TIFggaXNuJ3Qgc3VwcG9ydGVkLgotICAgICAgLWRlc3RpbmF0aW9uICJwbGF0Zm9ybT1PUyBYLGFyY2g9eDg2XzY0IiAjIDY0Yml0Ci0gICkKLSAgaGVhZGVyICJEb2luZyBYY29kZSBPUyBYIGJ1aWxkL3Rlc3RzIC0gRGVidWciCi0gICIke1hDT0RFQlVJTERfVEVTVF9CQVNFX09TWFtAXX0iIC1jb25maWd1cmF0aW9uIERlYnVnIHRlc3QKLSAgaGVhZGVyICJEb2luZyBYY29kZSBPUyBYIGJ1aWxkL3Rlc3RzIC0gUmVsZWFzZSIKLSAgIiR7WENPREVCVUlMRF9URVNUX0JBU0VfT1NYW0BdfSIgLWNvbmZpZ3VyYXRpb24gUmVsZWFzZSB0ZXN0Ci1maQotCi1pZiBbWyAiJHtET19PQkpDX0NPTkZPUk1BTkNFX1RFU1RTfSIgPT0gInllcyIgXV0gOyB0aGVuCi0gIGNkIGNvbmZvcm1hbmNlCi0gIHdyYXBwZWRfbWFrZSAtaiAiJHtOVU1fTUFLRV9KT0JTfSIgdGVzdF9vYmpjCi0gIGNkIC4uCi1maQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9EZXZUb29scy9wZGRtLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9EZXZUb29scy9wZGRtLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA5YTExZmVjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvRGV2VG9vbHMvcGRkbS5weQorKysgL2Rldi9udWxsCkBAIC0xLDY4NiArMCwwIEBACi0jISAvdXNyL2Jpbi9weXRob24KLSMKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiUERETSAtIFBvb3IgRGV2ZWxvcGVycycgRGVidWctYWJsZSBNYWNyb3MKLQotQSBzaW1wbGUgbWFya3VwIHRoYXQgY2FuIGJlIGFkZGVkIGluIGNvbW1lbnRzIG9mIHNvdXJjZSBzbyB0aGV5IGNhbiB0aGVuIGJlCi1leHBhbmRlZCBvdXQgaW50byBjb2RlLiBNb3N0IG9mIHRoaXMgY291bGQgYmUgZG9uZSB3aXRoIENQUCBtYWNyb3MsIGJ1dCB0aGVuCi1kZXZlbG9wZXJzIGNhbid0IHJlYWxseSBzdGVwIHRocm91Z2ggdGhlbSBpbiB0aGUgZGVidWdnZXIsIHRoaXMgd2F5IHRoZXkgYXJlCi1leHBhbmRlZCB0byB0aGUgc2FtZSBjb2RlLCBidXQgeW91IGNhbiBkZWJ1ZyB0aGVtLgotCi1BbnkgZmlsZSBjYW4gYmUgcHJvY2Vzc2VkLCBidXQgdGhlIHN5bnRheCBpcyBkZXNpZ25lZCBhcm91bmQgYSBDIGJhc2VkIGNvbXBpbGVyLgotUHJvY2Vzc2VkIGxpbmVzIHN0YXJ0IHdpdGggIi8vJSIuICBUaGVyZSBhcmUgdGhyZWUgdHlwZXMgb2Ygc2VjdGlvbnMgeW91IGNhbgotY3JlYXRlOiBUZXh0IChsZWZ0IGFsb25lKSwgTWFjcm8gRGVmaW5pdGlvbnMsIGFuZCBNYWNybyBFeHBhbnNpb25zLiAgVGhlcmUgaXMKLW5vIG9yZGVyIHJlcXVpcmVkIGJldHdlZW4gZGVmaW5pdGlvbnMgYW5kIGV4cGFuc2lvbnMsIGFsbCBkZWZpbml0aW9ucyBhcmUgcmVhZAotYmVmb3JlIGFueSBleHBhbnNpb25zIGFyZSBwcm9jZXNzZWQgKHRodXMsIGlmIGRlc2lyZWQsIGRlZmluaXRpb25zIGNhbiBiZSBwdXQKLWF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgdG8ga2VlcCB0aGVtIG91dCBvZiB0aGUgd2F5IG9mIHRoZSBjb2RlKS4KLQotTWFjcm8gRGVmaW5pdGlvbnMgYXJlIHN0YXJ0ZWQgd2l0aCAiLy8lUERETS1ERUZJTkUgTmFtZShhcmdzKSIgYW5kIGFsbCBsaW5lcwotYWZ0ZXJ3YXJkcyB0aGF0IHN0YXJ0IHdpdGggIi8vJSIgYXJlIGluY2x1ZGVkIGluIHRoZSBkZWZpbml0aW9uLiAgTXVsdGlwbGUKLW1hY3JvcyBjYW4gYmUgZGVmaW5lZCBpbiBvbmUgYmxvY2sgYnkganVzdCB1c2luZyBhIGFub3RoZXIgIi8vJVBERE0tREVGSU5FIgotbGluZSB0byBzdGFydCB0aGUgbmV4dCBtYWNyby4gIE9wdGlvbmFsbHksIGEgbWFjcm8gY2FuIGJlIGVuZGVkIHdpdGgKLSIvLyVQRERNLURFRklORS1FTkQiLCB0aGlzIGNhbiBiZSB1c2VmdWwgd2hlbiB5b3Ugd2FudCB0byBtYWtlIGl0IGNsZWFyIHRoYXQKLXRyYWlsaW5nIGJsYW5rIGxpbmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgbWFjcm8uICBZb3UgY2FuIGFsc28gZW5kIGEgZGVmaW5pdGlvbgotd2l0aCBhbiBleHBhbnNpb24uCi0KLU1hY3JvIEV4cGFuc2lvbnMgYXJlIHN0YXJ0ZWQgYnkgc2luZ2xlIGxpbmVzIGNvbnRhaW5pbmcKLSIvLyVQRERNLUVYUEFORCBOYW1lKGFyZ3MpIiBhbmQgdGhlbiB3aXRoICIvLyVQRERNLUVYUEFORC1FTkQiIG9yIGFub3RoZXIKLWV4cGFuc2lvbnMuICBBbGwgbGluZXMgaW4tYmV0d2VlbiBhcmUgcmVwbGFjZWQgYnkgdGhlIHJlc3VsdCBvZiB0aGUgZXhwYW5zaW9uLgotVGhlIGZpcnN0IGxpbmUgb2YgdGhlIGV4cGFuc2lvbiBpcyBhbHdheXMgYSBibGFuayBsaWtlIGp1c3QgZm9yIHJlYWRhYmlsaXR5LgotCi1FeHBhbnNpb24gaXRzZWxmIGlzIHByZXR0eSBzaW1wbGUsIG9uZSBtYWNybyBjYW4gaW52b2tlIGFub3RoZXIgbWFjcm8sIGJ1dAoteW91IGNhbm5vdCBuZXN0IHRoZSBpbnZva2Ugb2YgYSBtYWNybyBpbiBhbm90aGVyIG1hY3JvIChpLmUuIC0gY2FuJ3QgZG8KLSJmb28oYmFyKGEpKSIsIGJ1dCB5b3UgY2FuIGRlZmluZSBmb28oYSkgYW5kIGJhcihiKSB3aGVyZSBiYXIgaW52b2tlcyBmb28oKQotd2l0aGluIGl0cyBleHBhbnNpb24uCi0KLVdoZW4gbWFjcm9zIGFyZSBleHBhbmRlZCwgdGhlIGFyZyByZWZlcmVuY2VzIGNhbiBhbHNvIGFkZCAiJE8iIHN1ZmZpeCB0byB0aGUKLW5hbWUgKGkuZS4gLSAiTkFNRSRPIikgdG8gc3BlY2lmeSBhbiBvcHRpb24gdG8gYmUgYXBwbGllZC4gVGhlIG9wdGlvbnMgYXJlOgotCi0gICAgJFMgLSBSZXBsYWNlIGVhY2ggY2hhcmFjdGVyIGluIHRoZSB2YWx1ZSB3aXRoIGEgc3BhY2UuCi0gICAgJGwgLSBMb3dlcmNhc2UgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgdmFsdWUuCi0gICAgJEwgLSBMb3dlcmNhc2UgdGhlIHdob2xlIHZhbHVlLgotICAgICR1IC0gVXBwZXJjYXNlIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIHZhbHVlLgotICAgICRVIC0gVXBwZXJjYXNlIHRoZSB3aG9sZSB2YWx1ZS4KLQotV2l0aGluIGEgbWFjcm8geW91IGNhbiB1c2UgIyMgdG8gY2F1c2UgdGhpbmdzIHRvIGdldCBqb2luZWQgdG9nZXRoZXIgYWZ0ZXIKLWV4cGFuc2lvbiAoaS5lLiAtICJhIyNiIiB3aXRoaW4gYSBtYWNybyB3aWxsIGJlY29tZSAiYWIiKS4KLQotRXhhbXBsZToKLQotICAgIGludCBmb28oTXlFbnVtIHgpIHsKLSAgICBzd2l0Y2ggKHgpIHsKLSAgICAvLyVQRERNLUVYUEFORCBjYXNlKEVudW1fTGVmdCwgMSkKLSAgICAvLyVQRERNLUVYUEFORCBjYXNlKEVudW1fQ2VudGVyLCAyKQotICAgIC8vJVBERE0tRVhQQU5EIGNhc2UoRW51bV9SaWdodCwgMykKLSAgICAvLyVQRERNLUVYUEFORC1FTkQKLSAgICB9Ci0KLSAgICAvLyVQRERNLURFRklORSBjYXNlKF9BLCBfQikKLSAgICAvLyUgIGNhc2UgX0E6Ci0gICAgLy8lICAgIHJldHVybiBfQjsKLQotICBBIG1hY3JvIGVuZHMgYXQgdGhlIHN0YXJ0IG9mIHRoZSBuZXh0IG9uZSwgb3IgYW4gb3B0aW9uYWwgJVBERE0tREVGSU5FLUVORAotICBjYW4gYmUgdXNlZCB0byBhdm9pZCBhZGRpbmcgZXh0cmEgYmxhbmsgbGluZXMvcmV0dXJucyAob3IgbWFrZSBpdCBjbGVhciB3aGVuCi0gIGl0IGlzIGRlc2lyZWQpLgotCi0gIE9uZSBtYWNybyBjYW4gaW52b2tlIGFub3RoZXIgYnkgc2ltcGx5IHVzaW5nIGl0cyBuYW1lIE5BTUUoQVJHUykuIFlvdSBjYW5ub3QKLSAgbmVzdCBhbiBpbnZva2UgaW5zaWRlIGFub3RoZXIgKGkuZS4gLSBOQU1FMShOQU1FMihBUkdTKSkgaXNuJ3Qgc3VwcG9ydGVkKS4KLQotICBXaXRoaW4gYSBtYWNybyB5b3UgY2FuIHVzZSAjIyB0byBjYXVzZSB0aGluZ3MgdG8gZ2V0IGpvaW5lZCB0b2dldGhlciBhZnRlcgotICBwcm9jZXNzaW5nIChpLmUuIC0gImEjI2IiIHdpdGhpbiBhIG1hY3JvIHdpbGwgYmVjb21lICJhYiIpLgotCi0KLSIiIgotCi1pbXBvcnQgb3B0cGFyc2UKLWltcG9ydCBvcwotaW1wb3J0IHJlCi1pbXBvcnQgc3lzCi0KLQotIyBSZWdleCBmb3IgbWFjcm8gZGVmaW5pdGlvbi4KLV9NQUNST19SRSA9IHJlLmNvbXBpbGUocicoP1A8bmFtZT5cdyspXCgoP1A8YXJncz4uKj8pXCknKQotIyBSZWdleCBmb3IgbWFjcm8ncyBhcmd1bWVudCBkZWZpbml0aW9uLgotX01BQ1JPX0FSR19OQU1FX1JFID0gcmUuY29tcGlsZShyJ15cdyskJykKLQotIyBMaW5lIGluc2VydGVkIGFmdGVyIGVhY2ggRVhQQU5ELgotX0dFTkVSQVRFRF9DT0RFX0xJTkUgPSAoCi0gICcvLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4nCi0pCi0KLQotZGVmIF9NYWNyb1JlZlJlKG1hY3JvX25hbWVzKToKLSAgIyBUYWtlcyBpbiBhIGxpc3Qgb2YgbWFjcm8gbmFtZXMgYW5kIG1ha2VzIGEgcmVnZXggdGhhdCB3aWxsIG1hdGNoIGludm9rZXMKLSAgIyBvZiB0aG9zZSBtYWNyb3MuCi0gIHJldHVybiByZS5jb21waWxlKHInXGIoP1A8bWFjcm9fcmVmPig/UDxuYW1lPiglcykpXCgoP1A8YXJncz4uKj8pXCkpJyAlCi0gICAgICAgICAgICAgICAgICAgICd8Jy5qb2luKG1hY3JvX25hbWVzKSkKLQotZGVmIF9NYWNyb0FyZ1JlZlJlKG1hY3JvX2FyZ19uYW1lcyk6Ci0gICMgVGFrZXMgaW4gYSBsaXN0IG9mIG1hY3JvIGFyZyBuYW1lcyBhbmQgbWFrZXMgYSByZWdleCB0aGF0IHdpbGwgbWF0Y2gKLSAgIyB1c2VzIG9mIHRob3NlIGFyZ3MuCi0gIHJldHVybiByZS5jb21waWxlKHInXGIoP1A8bmFtZT4oJXMpKShcJCg/UDxvcHRpb24+LikpP1xiJyAlCi0gICAgICAgICAgICAgICAgICAgICd8Jy5qb2luKG1hY3JvX2FyZ19uYW1lcykpCi0KLQotY2xhc3MgUERETUVycm9yKEV4Y2VwdGlvbik6Ci0gICIiIkVycm9yIHRocm93biBieSBwZGRtLiIiIgotICBwYXNzCi0KLQotY2xhc3MgTWFjcm9Db2xsZWN0aW9uKG9iamVjdCk6Ci0gICIiIkhvbGQgYSBzZXQgb2YgbWFjcm9zIGFuZCBjYW4gcmVzb2x2ZS9leHBhbmQgdGhlbS4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgYV9maWxlPU5vbmUpOgotICAgICIiIkluaXRpYWxpemVzIHRoZSBjb2xsZWN0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIGFfZmlsZTogVGhlIGZpbGUgbGlrZSBzdHJlYW0gdG8gcGFyc2UuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQRERNRXJyb3IgaWYgdGhlcmUgYXJlIGFueSBpc3N1ZXMuCi0gICAgIiIiCi0gICAgc2VsZi5fbWFjcm9zID0gZGljdCgpCi0gICAgaWYgYV9maWxlOgotICAgICAgc2VsZi5QYXJzZUlucHV0KGFfZmlsZSkKLQotICBjbGFzcyBNYWNyb0RlZmluaXRpb24ob2JqZWN0KToKLSAgICAiIiJIb2xkcyBhIG1hY3JvIGRlZmluaXRpb24uIiIiCi0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgYXJnX25hbWVzKToKLSAgICAgIHNlbGYuX25hbWUgPSBuYW1lCi0gICAgICBzZWxmLl9hcmdzID0gdHVwbGUoYXJnX25hbWVzKQotICAgICAgc2VsZi5fYm9keSA9ICcnCi0gICAgICBzZWxmLl9uZWVkTmV3TGluZSA9IEZhbHNlCi0KLSAgICBkZWYgQXBwZW5kTGluZShzZWxmLCBsaW5lKToKLSAgICAgIGlmIHNlbGYuX25lZWROZXdMaW5lOgotICAgICAgICBzZWxmLl9ib2R5ICs9ICdcbicKLSAgICAgIHNlbGYuX2JvZHkgKz0gbGluZQotICAgICAgc2VsZi5fbmVlZE5ld0xpbmUgPSBub3QgbGluZS5lbmRzd2l0aCgnXG4nKQotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIG5hbWUoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5fbmFtZQotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGFyZ3Moc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5fYXJncwotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGJvZHkoc2VsZik6Ci0gICAgICByZXR1cm4gc2VsZi5fYm9keQotCi0gIGRlZiBQYXJzZUlucHV0KHNlbGYsIGFfZmlsZSk6Ci0gICAgIiIiQ29uc3VtZXMgaW5wdXQgZXh0cmFjdGluZyBkZWZpbml0aW9ucy4KLQotICAgIEFyZ3M6Ci0gICAgICBhX2ZpbGU6IFRoZSBmaWxlIGxpa2Ugc3RyZWFtIHRvIHBhcnNlLgotCi0gICAgUmFpc2VzOgotICAgICAgUERETUVycm9yIGlmIHRoZXJlIGFyZSBhbnkgaXNzdWVzLgotICAgICIiIgotICAgIGlucHV0X2xpbmVzID0gYV9maWxlLnJlYWQoKS5zcGxpdGxpbmVzKCkKLSAgICBzZWxmLlBhcnNlTGluZXMoaW5wdXRfbGluZXMpCi0KLSAgZGVmIFBhcnNlTGluZXMoc2VsZiwgaW5wdXRfbGluZXMpOgotICAgICIiIlBhcnNlcyBsaXN0IG9mIGxpbmVzLgotCi0gICAgQXJnczoKLSAgICAgIGlucHV0X2xpbmVzOiBBIGxpc3Qgb2Ygc3RyaW5ncyBvZiBpbnB1dCB0byBwYXJzZSAobm8gbmV3bGluZXMgb24gdGhlCi0gICAgICAgICAgICAgICAgICAgc3RyaW5ncykuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQRERNRXJyb3IgaWYgdGhlcmUgYXJlIGFueSBpc3N1ZXMuCi0gICAgIiIiCi0gICAgY3VycmVudF9tYWNybyA9IE5vbmUKLSAgICBmb3IgbGluZSBpbiBpbnB1dF9saW5lczoKLSAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnUERETS0nKToKLSAgICAgICAgZGlyZWN0aXZlID0gbGluZS5zcGxpdCgnICcsIDEpWzBdCi0gICAgICAgIGlmIGRpcmVjdGl2ZSA9PSAnUERETS1ERUZJTkUnOgotICAgICAgICAgIG5hbWUsIGFyZ3MgPSBzZWxmLl9QYXJzZURlZmluZUxpbmUobGluZSkKLSAgICAgICAgICBpZiBzZWxmLl9tYWNyb3MuZ2V0KG5hbWUpOgotICAgICAgICAgICAgcmFpc2UgUERETUVycm9yKCdBdHRlbXB0IHRvIHJlZGVmaW5lIG1hY3JvOiAiJXMiJyAlIGxpbmUpCi0gICAgICAgICAgY3VycmVudF9tYWNybyA9IHNlbGYuTWFjcm9EZWZpbml0aW9uKG5hbWUsIGFyZ3MpCi0gICAgICAgICAgc2VsZi5fbWFjcm9zW25hbWVdID0gY3VycmVudF9tYWNybwotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIGlmIGRpcmVjdGl2ZSA9PSAnUERETS1ERUZJTkUtRU5EJzoKLSAgICAgICAgICBpZiBub3QgY3VycmVudF9tYWNybzoKLSAgICAgICAgICAgIHJhaXNlIFBERE1FcnJvcignR290IERFRklORS1FTkQgZGlyZWN0aXZlIHdpdGhvdXQgYW4gYWN0aXZlIG1hY3JvOicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAnICIlcyInICUgbGluZSkKLSAgICAgICAgICBjdXJyZW50X21hY3JvID0gTm9uZQotICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgIHJhaXNlIFBERE1FcnJvcignSGl0IGEgbGluZSB3aXRoIGFuIHVua25vd24gZGlyZWN0aXZlOiAiJXMiJyAlIGxpbmUpCi0KLSAgICAgIGlmIGN1cnJlbnRfbWFjcm86Ci0gICAgICAgIGN1cnJlbnRfbWFjcm8uQXBwZW5kTGluZShsaW5lKQotICAgICAgICBjb250aW51ZQotCi0gICAgICAjIEFsbG93IGJsYW5rIGxpbmVzIGJldHdlZW4gbWFjcm8gZGVmaW5pdGlvbnMuCi0gICAgICBpZiBsaW5lLnN0cmlwKCkgPT0gJyc6Ci0gICAgICAgIGNvbnRpbnVlCi0KLSAgICAgIHJhaXNlIFBERE1FcnJvcignSGl0IGEgbGluZSB0aGF0IHdhc25cJ3QgYSBkaXJlY3RpdmUgYW5kIG5vIG9wZW4gbWFjcm8nCi0gICAgICAgICAgICAgICAgICAgICAgJyBkZWZpbml0aW9uOiAiJXMiJyAlIGxpbmUpCi0KLSAgZGVmIF9QYXJzZURlZmluZUxpbmUoc2VsZiwgaW5wdXRfbGluZSk6Ci0gICAgYXNzZXJ0IGlucHV0X2xpbmUuc3RhcnRzd2l0aCgnUERETS1ERUZJTkUnKQotICAgIGxpbmUgPSBpbnB1dF9saW5lWzEyOl0uc3RyaXAoKQotICAgIG1hdGNoID0gX01BQ1JPX1JFLm1hdGNoKGxpbmUpCi0gICAgIyBNdXN0IG1hdGNoIGZ1bGwgbGluZQotICAgIGlmIG1hdGNoIGlzIE5vbmUgb3IgbWF0Y2guZ3JvdXAoMCkgIT0gbGluZToKLSAgICAgIHJhaXNlIFBERE1FcnJvcignRmFpbGVkIHRvIHBhcnNlIG1hY3JvIGRlZmluaXRpb246ICIlcyInICUgaW5wdXRfbGluZSkKLSAgICBuYW1lID0gbWF0Y2guZ3JvdXAoJ25hbWUnKQotICAgIGFyZ3Nfc3RyID0gbWF0Y2guZ3JvdXAoJ2FyZ3MnKS5zdHJpcCgpCi0gICAgYXJncyA9IFtdCi0gICAgaWYgYXJnc19zdHI6Ci0gICAgICBmb3IgcGFydCBpbiBhcmdzX3N0ci5zcGxpdCgnLCcpOgotICAgICAgICBhcmcgPSBwYXJ0LnN0cmlwKCkKLSAgICAgICAgaWYgYXJnID09ICcnOgotICAgICAgICAgIHJhaXNlIFBERE1FcnJvcignRW1wdHkgYXJnIG5hbWUgaW4gbWFjcm8gZGVmaW5pdGlvbjogIiVzIicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJSBpbnB1dF9saW5lKQotICAgICAgICBpZiBub3QgX01BQ1JPX0FSR19OQU1FX1JFLm1hdGNoKGFyZyk6Ci0gICAgICAgICAgcmFpc2UgUERETUVycm9yKCdJbnZhbGlkIGFyZyBuYW1lICIlcyIgaW4gbWFjcm8gZGVmaW5pdGlvbjogIiVzIicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJSAoYXJnLCBpbnB1dF9saW5lKSkKLSAgICAgICAgaWYgYXJnIGluIGFyZ3M6Ci0gICAgICAgICAgcmFpc2UgUERETUVycm9yKCdBcmcgbmFtZSAiJXMiIHVzZWQgbW9yZSB0aGFuIG9uY2UgaW4gbWFjcm8nCi0gICAgICAgICAgICAgICAgICAgICAgICAgICcgZGVmaW5pdGlvbjogIiVzIicgJSAoYXJnLCBpbnB1dF9saW5lKSkKLSAgICAgICAgYXJncy5hcHBlbmQoYXJnKQotICAgIHJldHVybiAobmFtZSwgdHVwbGUoYXJncykpCi0KLSAgZGVmIEV4cGFuZChzZWxmLCBtYWNyb19yZWZfc3RyKToKLSAgICAiIiJFeHBhbmRzIHRoZSBtYWNybyByZWZlcmVuY2UuCi0KLSAgICBBcmdzOgotICAgICAgbWFjcm9fcmVmX3N0cjogU3RyaW5nIG9mIGEgbWFjcm8gcmVmZXJlbmNlIChpLmUuIGZvbyhhLCBiKSkuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIHRleHQgZnJvbSB0aGUgZXhwYW5zaW9uLgotCi0gICAgUmFpc2VzOgotICAgICAgUERETUVycm9yIGlmIHRoZXJlIGFyZSBhbnkgaXNzdWVzLgotICAgICIiIgotICAgIG1hdGNoID0gX01BQ1JPX1JFLm1hdGNoKG1hY3JvX3JlZl9zdHIpCi0gICAgaWYgbWF0Y2ggaXMgTm9uZSBvciBtYXRjaC5ncm91cCgwKSAhPSBtYWNyb19yZWZfc3RyOgotICAgICAgcmFpc2UgUERETUVycm9yKCdGYWlsZWQgdG8gcGFyc2UgbWFjcm8gcmVmZXJlbmNlOiAiJXMiJyAlIG1hY3JvX3JlZl9zdHIpCi0gICAgaWYgbWF0Y2guZ3JvdXAoJ25hbWUnKSBub3QgaW4gc2VsZi5fbWFjcm9zOgotICAgICAgcmFpc2UgUERETUVycm9yKCdObyBtYWNybyBuYW1lZCAiJXMiLicgJSBtYXRjaC5ncm91cCgnbmFtZScpKQotICAgIHJldHVybiBzZWxmLl9FeHBhbmQobWF0Y2gsIFtdLCBtYWNyb19yZWZfc3RyKQotCi0gIGRlZiBfRm9ybWF0U3RhY2soc2VsZiwgbWFjcm9fcmVmX3N0YWNrKToKLSAgICByZXN1bHQgPSAnJwotICAgIGZvciBfLCBtYWNyb19yZWYgaW4gcmV2ZXJzZWQobWFjcm9fcmVmX3N0YWNrKToKLSAgICAgIHJlc3VsdCArPSAnXG4uLi53aGlsZSBleHBhbmRpbmcgIiVzIi4nICUgbWFjcm9fcmVmCi0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBfRXhwYW5kKHNlbGYsIG1hY3JvX3JlZl9tYXRjaCwgbWFjcm9fc3RhY2ssIG1hY3JvX3JlZl9zdHI9Tm9uZSk6Ci0gICAgaWYgbWFjcm9fcmVmX3N0ciBpcyBOb25lOgotICAgICAgbWFjcm9fcmVmX3N0ciA9IG1hY3JvX3JlZl9tYXRjaC5ncm91cCgnbWFjcm9fcmVmJykKLSAgICBuYW1lID0gbWFjcm9fcmVmX21hdGNoLmdyb3VwKCduYW1lJykKLSAgICBmb3IgcHJldl9uYW1lLCBwcmV2X21hY3JvX3JlZiBpbiBtYWNyb19zdGFjazoKLSAgICAgIGlmIG5hbWUgPT0gcHJldl9uYW1lOgotICAgICAgICByYWlzZSBQRERNRXJyb3IoJ0ZvdW5kIG1hY3JvIHJlY3VzaW9uLCBpbnZva2luZyAiJXMiOiVzJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAobWFjcm9fcmVmX3N0ciwgc2VsZi5fRm9ybWF0U3RhY2sobWFjcm9fc3RhY2spKSkKLSAgICBtYWNybyA9IHNlbGYuX21hY3Jvc1tuYW1lXQotICAgIGFyZ3Nfc3RyID0gbWFjcm9fcmVmX21hdGNoLmdyb3VwKCdhcmdzJykuc3RyaXAoKQotICAgIGFyZ3MgPSBbXQotICAgIGlmIGFyZ3Nfc3RyIG9yIGxlbihtYWNyby5hcmdzKToKLSAgICAgIGFyZ3MgPSBbeC5zdHJpcCgpIGZvciB4IGluIGFyZ3Nfc3RyLnNwbGl0KCcsJyldCi0gICAgaWYgbGVuKGFyZ3MpICE9IGxlbihtYWNyby5hcmdzKToKLSAgICAgIHJhaXNlIFBERE1FcnJvcignRXhwZWN0ZWQgJWQgYXJncywgZ290OiAiJXMiLiVzJyAlCi0gICAgICAgICAgICAgICAgICAgICAgKGxlbihtYWNyby5hcmdzKSwgbWFjcm9fcmVmX3N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fRm9ybWF0U3RhY2sobWFjcm9fc3RhY2spKSkKLSAgICAjIFJlcGxhY2UgYXJncyB1c2FnZXMuCi0gICAgcmVzdWx0ID0gc2VsZi5fUmVwbGFjZUFyZ1ZhbHVlcyhtYWNybywgYXJncywgbWFjcm9fcmVmX3N0ciwgbWFjcm9fc3RhY2spCi0gICAgIyBFeHBhbmQgYW55IG1hY3JvIGludm9rZXMuCi0gICAgbmV3X21hY3JvX3N0YWNrID0gbWFjcm9fc3RhY2sgKyBbKG5hbWUsIG1hY3JvX3JlZl9zdHIpXQotICAgIHdoaWxlIFRydWU6Ci0gICAgICBldmFsX3Jlc3VsdCA9IHNlbGYuX0V2YWxNYWNyb3NSZWZzKHJlc3VsdCwgbmV3X21hY3JvX3N0YWNrKQotICAgICAgIyBDb25zdW1lIGFsbCAjIyBkaXJlY3RpdmVzIHRvIGdsdWUgdGhpbmdzIHRvZ2V0aGVyLgotICAgICAgZXZhbF9yZXN1bHQgPSBldmFsX3Jlc3VsdC5yZXBsYWNlKCcjIycsICcnKQotICAgICAgaWYgZXZhbF9yZXN1bHQgPT0gcmVzdWx0OgotICAgICAgICBicmVhawotICAgICAgcmVzdWx0ID0gZXZhbF9yZXN1bHQKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIF9SZXBsYWNlQXJnVmFsdWVzKHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYWNybywgYXJnX3ZhbHVlcywgbWFjcm9fcmVmX3RvX3JlcG9ydCwgbWFjcm9fc3RhY2spOgotICAgIGlmIGxlbihhcmdfdmFsdWVzKSA9PSAwOgotICAgICAgIyBOb3RoaW5nIHRvIGRvCi0gICAgICByZXR1cm4gbWFjcm8uYm9keQotICAgIGFzc2VydCBsZW4oYXJnX3ZhbHVlcykgPT0gbGVuKG1hY3JvLmFyZ3MpCi0gICAgYXJncyA9IGRpY3QoemlwKG1hY3JvLmFyZ3MsIGFyZ192YWx1ZXMpKQotICAgIGRlZiBfbG9va3VwQXJnKG1hdGNoKToKLSAgICAgIHZhbCA9IGFyZ3NbbWF0Y2guZ3JvdXAoJ25hbWUnKV0KLSAgICAgIG9wdCA9IG1hdGNoLmdyb3VwKCdvcHRpb24nKQotICAgICAgaWYgb3B0OgotICAgICAgICBpZiBvcHQgPT0gJ1MnOiAjIFNwYWNlcyBmb3IgdGhlIGxlbmd0aAotICAgICAgICAgIHJldHVybiAnICcgKiBsZW4odmFsKQotICAgICAgICBlbGlmIG9wdCA9PSAnbCc6ICMgTG93ZXJjYXNlIGZpcnN0IGNoYXJhY3RlcgotICAgICAgICAgIGlmIHZhbDoKLSAgICAgICAgICAgIHJldHVybiB2YWxbMF0ubG93ZXIoKSArIHZhbFsxOl0KLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHZhbAotICAgICAgICBlbGlmIG9wdCA9PSAnTCc6ICMgQWxsIExvd2VyY2FzZQotICAgICAgICAgIHJldHVybiB2YWwubG93ZXIoKQotICAgICAgICBlbGlmIG9wdCA9PSAndSc6ICMgVXBwZXJjYXNlIGZpcnN0IGNoYXJhY3RlcgotICAgICAgICAgIGlmIHZhbDoKLSAgICAgICAgICAgIHJldHVybiB2YWxbMF0udXBwZXIoKSArIHZhbFsxOl0KLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgcmV0dXJuIHZhbAotICAgICAgICBlbGlmIG9wdCA9PSAnVSc6ICMgQWxsIFVwcGVyY2FzZQotICAgICAgICAgIHJldHVybiB2YWwudXBwZXIoKQotICAgICAgICBlbHNlOgotICAgICAgICAgIHJhaXNlIFBERE1FcnJvcignVW5rbm93biBhcmcgb3B0aW9uICIlcyQlcyIgd2hpbGUgZXhwYW5kaW5nICIlcyIuJXMnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICUgKG1hdGNoLmdyb3VwKCduYW1lJyksIG1hdGNoLmdyb3VwKCdvcHRpb24nKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFjcm9fcmVmX3RvX3JlcG9ydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fRm9ybWF0U3RhY2sobWFjcm9fc3RhY2spKSkKLSAgICAgIHJldHVybiB2YWwKLSAgICAjIExldCB0aGUgcmVnZXggZG8gdGhlIHdvcmshCi0gICAgbWFjcm9fYXJnX3JlZl9yZSA9IF9NYWNyb0FyZ1JlZlJlKG1hY3JvLmFyZ3MpCi0gICAgcmV0dXJuIG1hY3JvX2FyZ19yZWZfcmUuc3ViKF9sb29rdXBBcmcsIG1hY3JvLmJvZHkpCi0KLSAgZGVmIF9FdmFsTWFjcm9zUmVmcyhzZWxmLCB0ZXh0LCBtYWNyb19zdGFjayk6Ci0gICAgbWFjcm9fcmVmX3JlID0gX01hY3JvUmVmUmUoc2VsZi5fbWFjcm9zLmtleXMoKSkKLSAgICBkZWYgX3Jlc29sdmVNYWNybyhtYXRjaCk6Ci0gICAgICByZXR1cm4gc2VsZi5fRXhwYW5kKG1hdGNoLCBtYWNyb19zdGFjaykKLSAgICByZXR1cm4gbWFjcm9fcmVmX3JlLnN1YihfcmVzb2x2ZU1hY3JvLCB0ZXh0KQotCi0KLWNsYXNzIFNvdXJjZUZpbGUob2JqZWN0KToKLSAgIiIiUmVwcmVzZW50cyBhIHNvdXJjZSBmaWxlIHdpdGggUERETSBkaXJlY3RpdmVzIGluIGl0LiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBhX2ZpbGUsIGltcG9ydF9yZXNvbHZlcj1Ob25lKToKLSAgICAiIiJJbml0aWFsaXplcyB0aGUgZmlsZSByZWFkaW5nIGluIHRoZSBmaWxlLgotCi0gICAgQXJnczoKLSAgICAgIGFfZmlsZTogVGhlIGZpbGUgdG8gcmVhZCBpbi4KLSAgICAgIGltcG9ydF9yZXNvbHZlcjogYSBmdW5jdGlvbiB0aGF0IGdpdmVuIGEgcGF0aCB3aWxsIHJldHVybiBhIHN0cmVhbSBmb3IKLSAgICAgICAgdGhlIGNvbnRlbnRzLgotCi0gICAgUmFpc2VzOgotICAgICAgUERETUVycm9yIGlmIHRoZXJlIGFyZSBhbnkgaXNzdWVzLgotICAgICIiIgotICAgIHNlbGYuX3NlY3Rpb25zID0gW10KLSAgICBzZWxmLl9vcmlnaW5hbF9jb250ZW50ID0gYV9maWxlLnJlYWQoKQotICAgIHNlbGYuX2ltcG9ydF9yZXNvbHZlciA9IGltcG9ydF9yZXNvbHZlcgotICAgIHNlbGYuX3Byb2Nlc3NlZF9jb250ZW50ID0gTm9uZQotCi0gIGNsYXNzIFNlY3Rpb25CYXNlKG9iamVjdCk6Ci0KLSAgICBkZWYgX19pbml0X18oc2VsZiwgZmlyc3RfbGluZV9udW0pOgotICAgICAgc2VsZi5fbGluZXMgPSBbXQotICAgICAgc2VsZi5fZmlyc3RfbGluZV9udW0gPSBmaXJzdF9saW5lX251bQotCi0gICAgZGVmIFRyeUFwcGVuZChzZWxmLCBsaW5lLCBsaW5lX251bSk6Ci0gICAgICAiIiJUcnkgYXBwZW5kaW5nIGEgbGluZS4KLQotICAgICAgQXJnczoKLSAgICAgICAgbGluZTogVGhlIGxpbmUgdG8gYXBwZW5kLgotICAgICAgICBsaW5lX251bTogVGhlIG51bWJlciBvZiB0aGUgbGluZS4KLQotICAgICAgUmV0dXJuczoKLSAgICAgICAgQSB0dXBsZSBvZiAoU1VDQ0VTUywgQ0FOX0FERF9NT1JFKS4gIElmIFNVQ0NFU1MgaWYgRmFsc2UsIHRoZSBsaW5lCi0gICAgICAgIHdhc24ndCBhcHBlbmQuICBJZiBTVUNDRVNTIGlzIFRydWUsIHRoZW4gQ0FOX0FERF9NT1JFIGlzIFRydWUvRmFsc2UgdG8KLSAgICAgICAgaW5kaWNhdGUgaWYgbW9yZSBsaW5lcyBjYW4gYmUgYWRkZWQgYWZ0ZXIgdGhpcyBvbmUuCi0gICAgICAiIiIKLSAgICAgIGFzc2VydCBGYWxzZSwgInN1YmxjYXNzIHNob3VsZCBoYXZlIG92ZXJyaWRkZW4iCi0gICAgICByZXR1cm4gKEZhbHNlLCBGYWxzZSkKLQotICAgIGRlZiBIaXRFT0Yoc2VsZik6Ci0gICAgICAiIiJDYWxsZWQgd2hlbiB0aGUgRU9GIHdhcyByZWFjaGVkIGZvciBmb3IgYSBnaXZlbiBzZWN0aW9uLiIiIgotICAgICAgcGFzcwotCi0gICAgZGVmIEJpbmRNYWNyb0NvbGxlY3Rpb24oc2VsZiwgbWFjcm9fY29sbGVjdGlvbik6Ci0gICAgICAiIiJCaW5kcyB0aGUgY2h1bmsgdG8gYSBtYWNybyBjb2xsZWN0aW9uLgotCi0gICAgICBBcmdzOgotICAgICAgICBtYWNyb19jb2xsZWN0aW9uOiBUaGUgY29sbGVjdGlvbiB0byBiaW5kIHRvby4KLSAgICAgICIiIgotICAgICAgcGFzcwotCi0gICAgZGVmIEFwcGVuZChzZWxmLCBsaW5lKToKLSAgICAgIHNlbGYuX2xpbmVzLmFwcGVuZChsaW5lKQotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGxpbmVzKHNlbGYpOgotICAgICAgcmV0dXJuIHNlbGYuX2xpbmVzCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgbnVtX2xpbmVzX2NhcHR1cmVkKHNlbGYpOgotICAgICAgcmV0dXJuIGxlbihzZWxmLl9saW5lcykKLQotICAgIEBwcm9wZXJ0eQotICAgIGRlZiBmaXJzdF9saW5lX251bShzZWxmKToKLSAgICAgIHJldHVybiBzZWxmLl9maXJzdF9saW5lX251bQotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGZpcnN0X2xpbmUoc2VsZik6Ci0gICAgICBpZiBub3Qgc2VsZi5fbGluZXM6Ci0gICAgICAgIHJldHVybiAnJwotICAgICAgcmV0dXJuIHNlbGYuX2xpbmVzWzBdCi0KLSAgICBAcHJvcGVydHkKLSAgICBkZWYgdGV4dChzZWxmKToKLSAgICAgIHJldHVybiAnXG4nLmpvaW4oc2VsZi5saW5lcykgKyAnXG4nCi0KLSAgY2xhc3MgVGV4dFNlY3Rpb24oU2VjdGlvbkJhc2UpOgotICAgICIiIlRleHQgc2VjdGlvbiB0aGF0IGlzIGVjaG9lZCBvdXQgYXMgaXMuIiIiCi0KLSAgICBkZWYgVHJ5QXBwZW5kKHNlbGYsIGxpbmUsIGxpbmVfbnVtKToKLSAgICAgIGlmIGxpbmUuc3RhcnRzd2l0aCgnLy8lUERETScpOgotICAgICAgICByZXR1cm4gKEZhbHNlLCBGYWxzZSkKLSAgICAgIHNlbGYuQXBwZW5kKGxpbmUpCi0gICAgICByZXR1cm4gKFRydWUsIFRydWUpCi0KLSAgY2xhc3MgRXhwYW5zaW9uU2VjdGlvbihTZWN0aW9uQmFzZSk6Ci0gICAgIiIiU2VjdGlvbiB0aGF0IGlzIHRoZSByZXN1bHQgb2YgYW4gbWFjcm8gZXhwYW5zaW9uLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0X2xpbmVfbnVtKToKLSAgICAgIFNvdXJjZUZpbGUuU2VjdGlvbkJhc2UuX19pbml0X18oc2VsZiwgZmlyc3RfbGluZV9udW0pCi0gICAgICBzZWxmLl9tYWNyb19jb2xsZWN0aW9uID0gTm9uZQotCi0gICAgZGVmIFRyeUFwcGVuZChzZWxmLCBsaW5lLCBsaW5lX251bSk6Ci0gICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy8vJVBERE0nKToKLSAgICAgICAgZGlyZWN0aXZlID0gbGluZS5zcGxpdCgnICcsIDEpWzBdCi0gICAgICAgIGlmIGRpcmVjdGl2ZSA9PSAnLy8lUERETS1FWFBBTkQnOgotICAgICAgICAgIHNlbGYuQXBwZW5kKGxpbmUpCi0gICAgICAgICAgcmV0dXJuIChUcnVlLCBUcnVlKQotICAgICAgICBpZiBkaXJlY3RpdmUgPT0gJy8vJVBERE0tRVhQQU5ELUVORCc6Ci0gICAgICAgICAgYXNzZXJ0IHNlbGYubnVtX2xpbmVzX2NhcHR1cmVkID4gMAotICAgICAgICAgIHJldHVybiAoVHJ1ZSwgRmFsc2UpCi0gICAgICAgIHJhaXNlIFBERE1FcnJvcignUmFuIGludG8gZGlyZWN0aXZlICgiJXMiLCBsaW5lICVkKSB3aGlsZSBpbiAiJXMiLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgKGRpcmVjdGl2ZSwgbGluZV9udW0sIHNlbGYuZmlyc3RfbGluZSkpCi0gICAgICAjIEVhdCBvdGhlciBsaW5lcy4KLSAgICAgIHJldHVybiAoVHJ1ZSwgVHJ1ZSkKLQotICAgIGRlZiBIaXRFT0Yoc2VsZik6Ci0gICAgICByYWlzZSBQRERNRXJyb3IoJ0hpdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoaWxlIGluICIlcyIuJyAlCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdF9saW5lKQotCi0gICAgZGVmIEJpbmRNYWNyb0NvbGxlY3Rpb24oc2VsZiwgbWFjcm9fY29sbGVjdGlvbik6Ci0gICAgICBzZWxmLl9tYWNyb19jb2xsZWN0aW9uID0gbWFjcm9fY29sbGVjdGlvbgotCi0gICAgQHByb3BlcnR5Ci0gICAgZGVmIGxpbmVzKHNlbGYpOgotICAgICAgY2FwdHVyZWRfbGluZXMgPSBTb3VyY2VGaWxlLlNlY3Rpb25CYXNlLmxpbmVzLmZnZXQoc2VsZikKLSAgICAgIGRpcmVjdGl2ZV9sZW4gPSBsZW4oJy8vJVBERE0tRVhQQU5EJykKLSAgICAgIHJlc3VsdCA9IFtdCi0gICAgICBmb3IgbGluZSBpbiBjYXB0dXJlZF9saW5lczoKLSAgICAgICAgcmVzdWx0LmFwcGVuZChsaW5lKQotICAgICAgICBpZiBzZWxmLl9tYWNyb19jb2xsZWN0aW9uOgotICAgICAgICAgICMgQWx3YXlzIGFkZCBhIGJsYW5rIGxpbmUsIHNlZW1zIHRvIHJlYWQgYmV0dGVyLiAoSWYgbmVlZCBiZSwgYWRkIGFuCi0gICAgICAgICAgIyBvcHRpb24gdG8gdGhlIEVYUEFORCB0byBpbmRpY2F0ZSBpZiB0aGlzIHNob3VsZCBiZSBkb25lLikKLSAgICAgICAgICByZXN1bHQuZXh0ZW5kKFtfR0VORVJBVEVEX0NPREVfTElORSwgJyddKQotICAgICAgICAgIG1hY3JvID0gbGluZVtkaXJlY3RpdmVfbGVuOl0uc3RyaXAoKQotICAgICAgICAgIHRyeToKLSAgICAgICAgICAgIGV4cGFuZF9yZXN1bHQgPSBzZWxmLl9tYWNyb19jb2xsZWN0aW9uLkV4cGFuZChtYWNybykKLSAgICAgICAgICAgICMgU2luY2UgZXhwYW5zaW9ucyBhcmUgbGluZSBvcmllbnRlZCwgc3RyaXAgdHJhaWxpbmcgd2hpdGVzcGFjZQotICAgICAgICAgICAgIyBmcm9tIHRoZSBsaW5lcy4KLSAgICAgICAgICAgIGxpbmVzID0gW3gucnN0cmlwKCkgZm9yIHggaW4gZXhwYW5kX3Jlc3VsdC5zcGxpdCgnXG4nKV0KLSAgICAgICAgICAgIHJlc3VsdC5hcHBlbmQoJ1xuJy5qb2luKGxpbmVzKSkKLSAgICAgICAgICBleGNlcHQgUERETUVycm9yIGFzIGU6Ci0gICAgICAgICAgICByYWlzZSBQRERNRXJyb3IoJyVzXG4uLi53aGlsZSBleHBhbmRpbmcgIiVzIiBmcm9tIHRoZSBzZWN0aW9uJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICcgdGhhdCBzdGFydGVkOlxuICAgTGluZSAlZDogJXMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAoZS5tZXNzYWdlLCBtYWNybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5maXJzdF9saW5lX251bSwgc2VsZi5maXJzdF9saW5lKSkKLQotICAgICAgIyBBZGQgdGhlIGVuZGluZyBtYXJrZXIuCi0gICAgICBpZiBsZW4oY2FwdHVyZWRfbGluZXMpID09IDE6Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJy8vJSVQRERNLUVYUEFORC1FTkQgJXMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgY2FwdHVyZWRfbGluZXNbMF1bZGlyZWN0aXZlX2xlbjpdLnN0cmlwKCkpCi0gICAgICBlbHNlOgotICAgICAgICByZXN1bHQuYXBwZW5kKCcvLyUlUERETS1FWFBBTkQtRU5EICglcyBleHBhbnNpb25zKScgJSBsZW4oY2FwdHVyZWRfbGluZXMpKQotCi0gICAgICByZXR1cm4gcmVzdWx0Ci0KLSAgY2xhc3MgRGVmaW5pdGlvblNlY3Rpb24oU2VjdGlvbkJhc2UpOgotICAgICIiIlNlY3Rpb24gY29udGFpbmluZyBtYWNybyBkZWZpbml0aW9ucyIiIgotCi0gICAgZGVmIFRyeUFwcGVuZChzZWxmLCBsaW5lLCBsaW5lX251bSk6Ci0gICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCcvLyUnKToKLSAgICAgICAgcmV0dXJuIChGYWxzZSwgRmFsc2UpCi0gICAgICBpZiBsaW5lLnN0YXJ0c3dpdGgoJy8vJVBERE0nKToKLSAgICAgICAgZGlyZWN0aXZlID0gbGluZS5zcGxpdCgnICcsIDEpWzBdCi0gICAgICAgIGlmIGRpcmVjdGl2ZSA9PSAiLy8lUERETS1FWFBBTkQiOgotICAgICAgICAgIHJldHVybiBGYWxzZSwgRmFsc2UKLSAgICAgICAgaWYgZGlyZWN0aXZlIG5vdCBpbiAoJy8vJVBERE0tREVGSU5FJywgJy8vJVBERE0tREVGSU5FLUVORCcpOgotICAgICAgICAgIHJhaXNlIFBERE1FcnJvcignUmFuIGludG8gZGlyZWN0aXZlICgiJXMiLCBsaW5lICVkKSB3aGlsZSBpbiAiJXMiLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgICAoZGlyZWN0aXZlLCBsaW5lX251bSwgc2VsZi5maXJzdF9saW5lKSkKLSAgICAgIHNlbGYuQXBwZW5kKGxpbmUpCi0gICAgICByZXR1cm4gKFRydWUsIFRydWUpCi0KLSAgICBkZWYgQmluZE1hY3JvQ29sbGVjdGlvbihzZWxmLCBtYWNyb19jb2xsZWN0aW9uKToKLSAgICAgIGlmIG1hY3JvX2NvbGxlY3Rpb246Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAjIFBhcnNlIHRoZSBsaW5lcyBhZnRlciBzdHJpcHBpbmcgdGhlIHByZWZpeC4KLSAgICAgICAgICBtYWNyb19jb2xsZWN0aW9uLlBhcnNlTGluZXMoW3hbMzpdIGZvciB4IGluIHNlbGYubGluZXNdKQotICAgICAgICBleGNlcHQgUERETUVycm9yIGFzIGU6Ci0gICAgICAgICAgcmFpc2UgUERETUVycm9yKCclc1xuLi4ud2hpbGUgcGFyc2luZyBzZWN0aW9uIHRoYXQgc3RhcnRlZDpcbicKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJyAgTGluZSAlZDogJXMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKGUubWVzc2FnZSwgc2VsZi5maXJzdF9saW5lX251bSwgc2VsZi5maXJzdF9saW5lKSkKLQotICBjbGFzcyBJbXBvcnREZWZpbmVzU2VjdGlvbihTZWN0aW9uQmFzZSk6Ci0gICAgIiIiU2VjdGlvbiBjb250YWluaW5nIGFuIGltcG9ydCBvZiBQRERNLURFRklORVMgZnJvbSBhbiBleHRlcm5hbCBmaWxlLiIiIgotCi0gICAgZGVmIF9faW5pdF9fKHNlbGYsIGZpcnN0X2xpbmVfbnVtLCBpbXBvcnRfcmVzb2x2ZXIpOgotICAgICAgU291cmNlRmlsZS5TZWN0aW9uQmFzZS5fX2luaXRfXyhzZWxmLCBmaXJzdF9saW5lX251bSkKLSAgICAgIHNlbGYuX2ltcG9ydF9yZXNvbHZlciA9IGltcG9ydF9yZXNvbHZlcgotCi0gICAgZGVmIFRyeUFwcGVuZChzZWxmLCBsaW5lLCBsaW5lX251bSk6Ci0gICAgICBpZiBub3QgbGluZS5zdGFydHN3aXRoKCcvLyVQRERNLUlNUE9SVC1ERUZJTkVTICcpOgotICAgICAgICByZXR1cm4gKEZhbHNlLCBGYWxzZSkKLSAgICAgIGFzc2VydCBzZWxmLm51bV9saW5lc19jYXB0dXJlZCA9PSAwCi0gICAgICBzZWxmLkFwcGVuZChsaW5lKQotICAgICAgcmV0dXJuIChUcnVlLCBGYWxzZSkKLQotICAgIGRlZiBCaW5kTWFjcm9Db2xsZWN0aW9uKHNlbGYsIG1hY3JvX2NvbGxldGlvbik6Ci0gICAgICBpZiBub3QgbWFjcm9fY29sbGV0aW9uOgotICAgICAgICByZXR1cm4KLSAgICAgIGlmIHNlbGYuX2ltcG9ydF9yZXNvbHZlciBpcyBOb25lOgotICAgICAgICByYWlzZSBQRERNRXJyb3IoJ0dvdCBhbiBJTVBPUlQtREVGSU5FUyB3aXRob3V0IGEgcmVzb2x2ZXIgKGxpbmUgJWQpOicKLSAgICAgICAgICAgICAgICAgICAgICAgICcgIiVzIi4nICUgKHNlbGYuZmlyc3RfbGluZV9udW0sIHNlbGYuZmlyc3RfbGluZSkpCi0gICAgICBpbXBvcnRfbmFtZSA9IHNlbGYuZmlyc3RfbGluZS5zcGxpdCgnICcsIDEpWzFdLnN0cmlwKCkKLSAgICAgIGltcG9ydGVkX2ZpbGUgPSBzZWxmLl9pbXBvcnRfcmVzb2x2ZXIoaW1wb3J0X25hbWUpCi0gICAgICBpZiBpbXBvcnRlZF9maWxlIGlzIE5vbmU6Ci0gICAgICAgIHJhaXNlIFBERE1FcnJvcignUmVzb2x2ZXIgZmFpbGVkIHRvIGZpbmQgIiVzIiAobGluZSAlZCk6JwotICAgICAgICAgICAgICAgICAgICAgICAgJyAiJXMiLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgKGltcG9ydF9uYW1lLCBzZWxmLmZpcnN0X2xpbmVfbnVtLCBzZWxmLmZpcnN0X2xpbmUpKQotICAgICAgdHJ5OgotICAgICAgICBpbXBvcnRlZF9zcmNfZmlsZSA9IFNvdXJjZUZpbGUoaW1wb3J0ZWRfZmlsZSwgc2VsZi5faW1wb3J0X3Jlc29sdmVyKQotICAgICAgICBpbXBvcnRlZF9zcmNfZmlsZS5fUGFyc2VGaWxlKCkKLSAgICAgICAgZm9yIHNlY3Rpb24gaW4gaW1wb3J0ZWRfc3JjX2ZpbGUuX3NlY3Rpb25zOgotICAgICAgICAgIHNlY3Rpb24uQmluZE1hY3JvQ29sbGVjdGlvbihtYWNyb19jb2xsZXRpb24pCi0gICAgICBleGNlcHQgUERETUVycm9yIGFzIGU6Ci0gICAgICAgIHJhaXNlIFBERE1FcnJvcignJXNcbi4uLndoaWxlIGltcG9ydGluZyBkZWZpbmVzOlxuJwotICAgICAgICAgICAgICAgICAgICAgICAgJyAgTGluZSAlZDogJXMnICUKLSAgICAgICAgICAgICAgICAgICAgICAgIChlLm1lc3NhZ2UsIHNlbGYuZmlyc3RfbGluZV9udW0sIHNlbGYuZmlyc3RfbGluZSkpCi0KLSAgZGVmIF9QYXJzZUZpbGUoc2VsZik6Ci0gICAgc2VsZi5fc2VjdGlvbnMgPSBbXQotICAgIGxpbmVzID0gc2VsZi5fb3JpZ2luYWxfY29udGVudC5zcGxpdGxpbmVzKCkKLSAgICBjdXJfc2VjdGlvbiA9IE5vbmUKLSAgICBmb3IgbGluZV9udW0sIGxpbmUgaW4gZW51bWVyYXRlKGxpbmVzLCAxKToKLSAgICAgIGlmIG5vdCBjdXJfc2VjdGlvbjoKLSAgICAgICAgY3VyX3NlY3Rpb24gPSBzZWxmLl9NYWtlU2VjdGlvbihsaW5lLCBsaW5lX251bSkKLSAgICAgIHdhc19hZGRlZCwgYWNjZXB0X21vcmUgPSBjdXJfc2VjdGlvbi5UcnlBcHBlbmQobGluZSwgbGluZV9udW0pCi0gICAgICBpZiBub3Qgd2FzX2FkZGVkOgotICAgICAgICBjdXJfc2VjdGlvbiA9IHNlbGYuX01ha2VTZWN0aW9uKGxpbmUsIGxpbmVfbnVtKQotICAgICAgICB3YXNfYWRkZWQsIGFjY2VwdF9tb3JlID0gY3VyX3NlY3Rpb24uVHJ5QXBwZW5kKGxpbmUsIGxpbmVfbnVtKQotICAgICAgICBhc3NlcnQgd2FzX2FkZGVkCi0gICAgICBpZiBub3QgYWNjZXB0X21vcmU6Ci0gICAgICAgIGN1cl9zZWN0aW9uID0gTm9uZQotCi0gICAgaWYgY3VyX3NlY3Rpb246Ci0gICAgICBjdXJfc2VjdGlvbi5IaXRFT0YoKQotCi0gIGRlZiBfTWFrZVNlY3Rpb24oc2VsZiwgbGluZSwgbGluZV9udW0pOgotICAgIGlmIG5vdCBsaW5lLnN0YXJ0c3dpdGgoJy8vJVBERE0nKToKLSAgICAgIHNlY3Rpb24gPSBzZWxmLlRleHRTZWN0aW9uKGxpbmVfbnVtKQotICAgIGVsc2U6Ci0gICAgICBkaXJlY3RpdmUgPSBsaW5lLnNwbGl0KCcgJywgMSlbMF0KLSAgICAgIGlmIGRpcmVjdGl2ZSA9PSAnLy8lUERETS1FWFBBTkQnOgotICAgICAgICBzZWN0aW9uID0gc2VsZi5FeHBhbnNpb25TZWN0aW9uKGxpbmVfbnVtKQotICAgICAgZWxpZiBkaXJlY3RpdmUgPT0gJy8vJVBERE0tREVGSU5FJzoKLSAgICAgICAgc2VjdGlvbiA9IHNlbGYuRGVmaW5pdGlvblNlY3Rpb24obGluZV9udW0pCi0gICAgICBlbGlmIGRpcmVjdGl2ZSA9PSAnLy8lUERETS1JTVBPUlQtREVGSU5FUyc6Ci0gICAgICAgIHNlY3Rpb24gPSBzZWxmLkltcG9ydERlZmluZXNTZWN0aW9uKGxpbmVfbnVtLCBzZWxmLl9pbXBvcnRfcmVzb2x2ZXIpCi0gICAgICBlbHNlOgotICAgICAgICByYWlzZSBQRERNRXJyb3IoJ1VuZXhwZWN0ZWQgbGluZSAlZDogIiVzIi4nICUgKGxpbmVfbnVtLCBsaW5lKSkKLSAgICBzZWxmLl9zZWN0aW9ucy5hcHBlbmQoc2VjdGlvbikKLSAgICByZXR1cm4gc2VjdGlvbgotCi0gIGRlZiBQcm9jZXNzQ29udGVudChzZWxmLCBzdHJpcF9leHBhbnNpb249RmFsc2UpOgotICAgICIiIlByb2Nlc3NlcyB0aGUgZmlsZSBjb250ZW50cy4iIiIKLSAgICBzZWxmLl9QYXJzZUZpbGUoKQotICAgIGlmIHN0cmlwX2V4cGFuc2lvbjoKLSAgICAgICMgV2l0aG91dCBhIGNvbGxlY3Rpb24gdGhlIGV4cGFuc2lvbnMgYmVjb21lIGJsYW5rLCByZW1vdmluZyB0aGVtLgotICAgICAgY29sbGVjdGlvbiA9IE5vbmUKLSAgICBlbHNlOgotICAgICAgY29sbGVjdGlvbiA9IE1hY3JvQ29sbGVjdGlvbigpCi0gICAgZm9yIHNlY3Rpb24gaW4gc2VsZi5fc2VjdGlvbnM6Ci0gICAgICBzZWN0aW9uLkJpbmRNYWNyb0NvbGxlY3Rpb24oY29sbGVjdGlvbikKLSAgICByZXN1bHQgPSAnJwotICAgIGZvciBzZWN0aW9uIGluIHNlbGYuX3NlY3Rpb25zOgotICAgICAgcmVzdWx0ICs9IHNlY3Rpb24udGV4dAotICAgIHNlbGYuX3Byb2Nlc3NlZF9jb250ZW50ID0gcmVzdWx0Ci0KLSAgQHByb3BlcnR5Ci0gIGRlZiBvcmlnaW5hbF9jb250ZW50KHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9vcmlnaW5hbF9jb250ZW50Ci0KLSAgQHByb3BlcnR5Ci0gIGRlZiBwcm9jZXNzZWRfY29udGVudChzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fcHJvY2Vzc2VkX2NvbnRlbnQKLQotCi1kZWYgbWFpbihhcmdzKToKLSAgdXNhZ2UgPSAnJXByb2cgW09QVElPTlNdIFBBVEggLi4uJwotICBkZXNjcmlwdGlvbiA9ICgKLSAgICAgICdQcm9jZXNzZXMgUERETSBkaXJlY3RpdmVzIGluIHRoZSBnaXZlbiBwYXRocyBhbmQgd3JpdGUgdGhlbSBiYWNrIG91dC4nCi0gICkKLSAgcGFyc2VyID0gb3B0cGFyc2UuT3B0aW9uUGFyc2VyKHVzYWdlPXVzYWdlLCBkZXNjcmlwdGlvbj1kZXNjcmlwdGlvbikKLSAgcGFyc2VyLmFkZF9vcHRpb24oJy0tZHJ5LXJ1bicsCi0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9RmFsc2UsIGFjdGlvbj0nc3RvcmVfdHJ1ZScsCi0gICAgICAgICAgICAgICAgICAgIGhlbHA9J0RvblwndCB3cml0ZSBiYWNrIHRvIHRoZSBmaWxlKHMpLCBqdXN0IHJlcG9ydCBpZiB0aGUnCi0gICAgICAgICAgICAgICAgICAgICcgY29udGVudHMgbmVlZHMgYW4gdXBkYXRlIGFuZCBleGl0IHdpdGggYSB2YWx1ZSBvZiAxLicpCi0gIHBhcnNlci5hZGRfb3B0aW9uKCctLXZlcmJvc2UnLAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdSZXBvcnRzIGlzIGEgZmlsZSBpcyBhbHJlYWR5IGN1cnJlbnQuJykKLSAgcGFyc2VyLmFkZF9vcHRpb24oJy0tY29sbGFwc2UnLAotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PUZhbHNlLCBhY3Rpb249J3N0b3JlX3RydWUnLAotICAgICAgICAgICAgICAgICAgICBoZWxwPSdSZW1vdmVzIGFsbCB0aGUgZ2VuZXJhdGVkIGNvZGUuJykKLSAgb3B0cywgZXh0cmFfYXJncyA9IHBhcnNlci5wYXJzZV9hcmdzKGFyZ3MpCi0KLSAgaWYgbm90IGV4dHJhX2FyZ3M6Ci0gICAgcGFyc2VyLmVycm9yKCdOZWVkIGF0bGVhc3Qgb25lIGZpbGUgdG8gcHJvY2VzcycpCi0KLSAgcmVzdWx0ID0gMAotICBmb3IgYV9wYXRoIGluIGV4dHJhX2FyZ3M6Ci0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKGFfcGF0aCk6Ci0gICAgICBzeXMuc3RkZXJyLndyaXRlKCdFUlJPUjogRmlsZSBub3QgZm91bmQ6ICVzXG4nICUgYV9wYXRoKQotICAgICAgcmV0dXJuIDEwMAotCi0gICAgZGVmIF9JbXBvcnRSZXNvbHZlcihuYW1lKToKLSAgICAgICMgcmVzb2x2ZSBiYXNlZCBvbiB0aGUgZmlsZSBiZWluZyByZWFkLgotICAgICAgYV9kaXIgPSBvcy5wYXRoLmRpcm5hbWUoYV9wYXRoKQotICAgICAgaW1wb3J0X3BhdGggPSBvcy5wYXRoLmpvaW4oYV9kaXIsIG5hbWUpCi0gICAgICBpZiBub3Qgb3MucGF0aC5leGlzdHMoaW1wb3J0X3BhdGgpOgotICAgICAgICByZXR1cm4gTm9uZQotICAgICAgcmV0dXJuIG9wZW4oaW1wb3J0X3BhdGgsICdyJykKLQotICAgIHdpdGggb3BlbihhX3BhdGgsICdyJykgYXMgZjoKLSAgICAgIHNyY19maWxlID0gU291cmNlRmlsZShmLCBfSW1wb3J0UmVzb2x2ZXIpCi0KLSAgICB0cnk6Ci0gICAgICBzcmNfZmlsZS5Qcm9jZXNzQ29udGVudChzdHJpcF9leHBhbnNpb249b3B0cy5jb2xsYXBzZSkKLSAgICBleGNlcHQgUERETUVycm9yIGFzIGU6Ci0gICAgICBzeXMuc3RkZXJyLndyaXRlKCdFUlJPUjogJXNcbi4uLldoaWxlIHByb2Nlc3NpbmcgIiVzIlxuJyAlCi0gICAgICAgICAgICAgICAgICAgICAgIChlLm1lc3NhZ2UsIGFfcGF0aCkpCi0gICAgICByZXR1cm4gMTAxCi0KLSAgICBpZiBzcmNfZmlsZS5wcm9jZXNzZWRfY29udGVudCAhPSBzcmNfZmlsZS5vcmlnaW5hbF9jb250ZW50OgotICAgICAgaWYgbm90IG9wdHMuZHJ5X3J1bjoKLSAgICAgICAgcHJpbnQgJ1VwZGF0aW5nIGZvciAiJXMiLicgJSBhX3BhdGgKLSAgICAgICAgd2l0aCBvcGVuKGFfcGF0aCwgJ3cnKSBhcyBmOgotICAgICAgICAgIGYud3JpdGUoc3JjX2ZpbGUucHJvY2Vzc2VkX2NvbnRlbnQpCi0gICAgICBlbHNlOgotICAgICAgICAjIFNwZWNpYWwgcmVzdWx0IHRvIGluZGljYXRlIHRoaW5ncyBuZWVkIHVwZGF0aW5nLgotICAgICAgICBwcmludCAnVXBkYXRlIG5lZWRlZCBmb3IgIiVzIi4nICUgYV9wYXRoCi0gICAgICAgIHJlc3VsdCA9IDEKLSAgICBlbGlmIG9wdHMudmVyYm9zZToKLSAgICAgIHByaW50ICdObyB1cGRhdGUgZm9yICIlcyIuJyAlIGFfcGF0aAotCi0gIHJldHVybiByZXN1bHQKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBzeXMuZXhpdChtYWluKHN5cy5hcmd2WzE6XSkpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0RldlRvb2xzL3BkZG1fdGVzdHMucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0RldlRvb2xzL3BkZG1fdGVzdHMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhhNzNiODQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9EZXZUb29scy9wZGRtX3Rlc3RzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTE1ICswLDAgQEAKLSMhIC91c3IvYmluL3B5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUZXN0cyBmb3IgcGRkbS5weS4iIiIKLQotaW1wb3J0IGlvCi1pbXBvcnQgdW5pdHRlc3QKLQotaW1wb3J0IHBkZG0KLQotCi1jbGFzcyBUZXN0UGFyc2luZ01hY3Jvcyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RQYXJzZUVtcHR5KHNlbGYpOgotICAgIGYgPSBpby5TdHJpbmdJTyh1JycpCi0gICAgcmVzdWx0ID0gcGRkbS5NYWNyb0NvbGxlY3Rpb24oZikKLSAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihyZXN1bHQuX21hY3JvcyksIDApCi0KLSAgZGVmIHRlc3RQYXJzZU9uZShzZWxmKToKLSAgICBmID0gaW8uU3RyaW5nSU8odSIiIlBERE0tREVGSU5FIGZvbyggKQotYm9keSIiIikKLSAgICByZXN1bHQgPSBwZGRtLk1hY3JvQ29sbGVjdGlvbihmKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5fbWFjcm9zKSwgMSkKLSAgICBtYWNybyA9IHJlc3VsdC5fbWFjcm9zLmdldCgnZm9vJykKLSAgICBzZWxmLmFzc2VydElzTm90Tm9uZShtYWNybykKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtYWNyby5uYW1lLCAnZm9vJykKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtYWNyby5hcmdzLCB0dXBsZSgpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hY3JvLmJvZHksICdib2R5JykKLQotICBkZWYgdGVzdFBhcnNlR2VuZXJhbChzZWxmKToKLSAgICAjIFRlc3RzIG11bHRpcGxlIGRlZmluZXMsIHNwYWNlcyBpbiBhbGwgcGxhY2VzLCBldGMuCi0gICAgZiA9IGlvLlN0cmluZ0lPKHUiIiIKLVBERE0tREVGSU5FIG5vQXJncyggKQotYm9keTEKLWJvZHkyCi0KLVBERE0tREVGSU5FLUVORAotCi1QRERNLURFRklORSBvbmVBcmcoZm9vKQotYm9keTMKLVBERE0tREVGSU5FICB0d29BcmdzKCBiYXJfICwgYmF6ICkKLWJvZHk0Ci1ib2R5NSIiIikKLSAgICByZXN1bHQgPSBwZGRtLk1hY3JvQ29sbGVjdGlvbihmKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5fbWFjcm9zKSwgMykKLSAgICBtYWNybyA9IHJlc3VsdC5fbWFjcm9zLmdldCgnbm9BcmdzJykKLSAgICBzZWxmLmFzc2VydElzTm90Tm9uZShtYWNybykKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtYWNyby5uYW1lLCAnbm9BcmdzJykKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtYWNyby5hcmdzLCB0dXBsZSgpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hY3JvLmJvZHksICdib2R5MVxuYm9keTJcbicpCi0gICAgbWFjcm8gPSByZXN1bHQuX21hY3Jvcy5nZXQoJ29uZUFyZycpCi0gICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobWFjcm8pCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMobWFjcm8ubmFtZSwgJ29uZUFyZycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMobWFjcm8uYXJncywgKCdmb28nLCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMobWFjcm8uYm9keSwgJ2JvZHkzJykKLSAgICBtYWNybyA9IHJlc3VsdC5fbWFjcm9zLmdldCgndHdvQXJncycpCi0gICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobWFjcm8pCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMobWFjcm8ubmFtZSwgJ3R3b0FyZ3MnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hY3JvLmFyZ3MsICgnYmFyXycsICdiYXonKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtYWNyby5ib2R5LCAnYm9keTRcbmJvZHk1JykKLSAgICAjIEFkZCBpbnRvIGV4aXN0aW5nIGNvbGxlY3Rpb24KLSAgICBmID0gaW8uU3RyaW5nSU8odSIiIgotUERETS1ERUZJTkUgYW5vdGhlcihhLGIsYykKLWJvZHkxCi1ib2R5MiIiIikKLSAgICByZXN1bHQuUGFyc2VJbnB1dChmKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJlc3VsdC5fbWFjcm9zKSwgNCkKLSAgICBtYWNybyA9IHJlc3VsdC5fbWFjcm9zLmdldCgnYW5vdGhlcicpCi0gICAgc2VsZi5hc3NlcnRJc05vdE5vbmUobWFjcm8pCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMobWFjcm8ubmFtZSwgJ2Fub3RoZXInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1hY3JvLmFyZ3MsICgnYScsICdiJywgJ2MnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtYWNyby5ib2R5LCAnYm9keTFcbmJvZHkyJykKLQotICBkZWYgdGVzdFBhcnNlRGlyZWN0aXZlSXNzdWVzKHNlbGYpOgotICAgIHRlc3RfbGlzdCA9IFsKLSAgICAgICMgVW5rbm93biBkaXJlY3RpdmUKLSAgICAgICh1J1BERE0tREVGSU5FIGZvbygpXG5ib2R5XG5QRERNLURFRklORUQgZm9vXG5iYXonLAotICAgICAgICdIaXQgYSBsaW5lIHdpdGggYW4gdW5rbm93biBkaXJlY3RpdmU6ICcpLAotICAgICAgIyBFbmQgd2l0aG91dCBiZWdpbgotICAgICAgKHUnUERETS1ERUZJTkUgZm9vKClcbmJvZHlcblBERE0tREVGSU5FLUVORFxuUERETS1ERUZJTkUtRU5EXG4nLAotICAgICAgICdHb3QgREVGSU5FLUVORCBkaXJlY3RpdmUgd2l0aG91dCBhbiBhY3RpdmUgbWFjcm86ICcpLAotICAgICAgIyBMaW5lIG5vdCBpbiBtYWNybyBibG9jawotICAgICAgKHUnUERETS1ERUZJTkUgZm9vKClcbmJvZHlcblBERE0tREVGSU5FLUVORFxubXVtYmxlXG4nLAotICAgICAgICdIaXQgYSBsaW5lIHRoYXQgd2FzblwndCBhIGRpcmVjdGl2ZSBhbmQgbm8gb3BlbiBtYWNybyBkZWZpbml0aW9uOiAnKSwKLSAgICAgICMgUmVkZWZpbmUgbWFjcm8KLSAgICAgICh1J1BERE0tREVGSU5FIGZvbygpXG5ib2R5XG5QRERNLURFRklORSBmb28oYSlcbm11bWJsZVxuJywKLSAgICAgICAnQXR0ZW1wdCB0byByZWRlZmluZSBtYWNybzogJyksCi0gICAgXQotICAgIGZvciBpZHgsIChpbnB1dF9zdHIsIGV4cGVjdGVkX3ByZWZpeCkgaW4gZW51bWVyYXRlKHRlc3RfbGlzdCwgMSk6Ci0gICAgICBmID0gaW8uU3RyaW5nSU8oaW5wdXRfc3RyKQotICAgICAgdHJ5OgotICAgICAgICByZXN1bHQgPSBwZGRtLk1hY3JvQ29sbGVjdGlvbihmKQotICAgICAgICBzZWxmLmZhaWwoJ1Nob3VsZCB0aHJvdyBleGNlcHRpb24sIGVudHJ5ICVkJyAlIGlkeCkKLSAgICAgIGV4Y2VwdCBwZGRtLlBERE1FcnJvciBhcyBlOgotICAgICAgICBzZWxmLmFzc2VydFRydWUoZS5tZXNzYWdlLnN0YXJ0c3dpdGgoZXhwZWN0ZWRfcHJlZml4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICdFbnRyeSAlZCBmYWlsZWQ6ICVyJyAlIChpZHgsIGUpKQotCi0gIGRlZiB0ZXN0UGFyc2VCZWdpbklzc3VlcyhzZWxmKToKLSAgICB0ZXN0X2xpc3QgPSBbCi0gICAgICAjIDEuIE5vIG5hbWUKLSAgICAgICh1J1BERE0tREVGSU5FXG5tdW1ibGUnLAotICAgICAgICdGYWlsZWQgdG8gcGFyc2UgbWFjcm8gZGVmaW5pdGlvbjogJyksCi0gICAgICAjIDIuIE5vIG5hbWUgKHdpdGggc3BhY2VzKQotICAgICAgKHUnUERETS1ERUZJTkUgIFxubXVtYmxlJywKLSAgICAgICAnRmFpbGVkIHRvIHBhcnNlIG1hY3JvIGRlZmluaXRpb246ICcpLAotICAgICAgIyAzLiBObyBvcGVuIHBhcmVuCi0gICAgICAodSdQRERNLURFRklORSAgZm9vXG5tdW1ibGUnLAotICAgICAgICdGYWlsZWQgdG8gcGFyc2UgbWFjcm8gZGVmaW5pdGlvbjogJyksCi0gICAgICAjIDQuIE5vIGNsb3NlIHBhcmVuCi0gICAgICAodSdQRERNLURFRklORSBmb28oXG5tdW1ibGUnLAotICAgICAgICdGYWlsZWQgdG8gcGFyc2UgbWFjcm8gZGVmaW5pdGlvbjogJyksCi0gICAgICAjIDUuIE5vIGNsb3NlIHBhcmVuICh3aXRoIGFyZ3MpCi0gICAgICAodSdQRERNLURFRklORSBmb28oYSwgYlxubXVtYmxlJywKLSAgICAgICAnRmFpbGVkIHRvIHBhcnNlIG1hY3JvIGRlZmluaXRpb246ICcpLAotICAgICAgIyA2LiBObyBuYW1lIGJlZm9yZSBhcmdzCi0gICAgICAodSdQRERNLURFRklORSAgKGEsIGIpXG5tdW1ibGUnLAotICAgICAgICdGYWlsZWQgdG8gcGFyc2UgbWFjcm8gZGVmaW5pdGlvbjogJyksCi0gICAgICAjIDcuIE5vIG5hbWUgYmVmb3JlIGFyZ3MKLSAgICAgICh1J1BERE0tREVGSU5FIGZvbyBiYXIoYSwgYilcbm11bWJsZScsCi0gICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBtYWNybyBkZWZpbml0aW9uOiAnKSwKLSAgICAgICMgOC4gRW1wdHkgYXJnIG5hbWUKLSAgICAgICh1J1BERE0tREVGSU5FIGZvbyhhLCAsYilcbm11bWJsZScsCi0gICAgICAgJ0VtcHR5IGFyZyBuYW1lIGluIG1hY3JvIGRlZmluaXRpb246ICcpLAotICAgICAgKHUnUERETS1ERUZJTkUgZm9vKGEsLGIpXG5tdW1ibGUnLAotICAgICAgICdFbXB0eSBhcmcgbmFtZSBpbiBtYWNybyBkZWZpbml0aW9uOiAnKSwKLSAgICAgICMgMTAuIER1cGxpY2F0ZSBuYW1lCi0gICAgICAodSdQRERNLURFRklORSBmb28oYSxiLGEsYylcbm11bWJsZScsCi0gICAgICAgJ0FyZyBuYW1lICJhIiB1c2VkIG1vcmUgdGhhbiBvbmNlIGluIG1hY3JvIGRlZmluaXRpb246ICcpLAotICAgICAgIyAxMS4gSW52YWxpZCBhcmcgbmFtZQotICAgICAgKHUnUERETS1ERUZJTkUgZm9vKGEgYixjKVxubXVtYmxlJywKLSAgICAgICAnSW52YWxpZCBhcmcgbmFtZSAiYSBiIiBpbiBtYWNybyBkZWZpbml0aW9uOiAnKSwKLSAgICAgICh1J1BERE0tREVGSU5FIGZvbyhhLmIsYylcbm11bWJsZScsCi0gICAgICAgJ0ludmFsaWQgYXJnIG5hbWUgImEuYiIgaW4gbWFjcm8gZGVmaW5pdGlvbjogJyksCi0gICAgICAodSdQRERNLURFRklORSBmb28oYS1iLGMpXG5tdW1ibGUnLAotICAgICAgICdJbnZhbGlkIGFyZyBuYW1lICJhLWIiIGluIG1hY3JvIGRlZmluaXRpb246ICcpLAotICAgICAgKHUnUERETS1ERUZJTkUgZm9vKGEsYixjLilcbm11bWJsZScsCi0gICAgICAgJ0ludmFsaWQgYXJnIG5hbWUgImMuIiBpbiBtYWNybyBkZWZpbml0aW9uOiAnKSwKLSAgICAgICMgMTUuIEV4dHJhIHN0dWZmIGFmdGVyIHRoZSBuYW1lCi0gICAgICAodSdQRERNLURFRklORSBmb28oYSxjKSBmb29cbm11bWJsZScsCi0gICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBtYWNybyBkZWZpbml0aW9uOiAnKSwKLSAgICAgICh1J1BERE0tREVGSU5FIGZvbyhhLGMpIGZvbylcbm11bWJsZScsCi0gICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBtYWNybyBkZWZpbml0aW9uOiAnKSwKLSAgICBdCi0gICAgZm9yIGlkeCwgKGlucHV0X3N0ciwgZXhwZWN0ZWRfcHJlZml4KSBpbiBlbnVtZXJhdGUodGVzdF9saXN0LCAxKToKLSAgICAgIGYgPSBpby5TdHJpbmdJTyhpbnB1dF9zdHIpCi0gICAgICB0cnk6Ci0gICAgICAgIHJlc3VsdCA9IHBkZG0uTWFjcm9Db2xsZWN0aW9uKGYpCi0gICAgICAgIHNlbGYuZmFpbCgnU2hvdWxkIHRocm93IGV4Y2VwdGlvbiwgZW50cnkgJWQnICUgaWR4KQotICAgICAgZXhjZXB0IHBkZG0uUERETUVycm9yIGFzIGU6Ci0gICAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShlLm1lc3NhZ2Uuc3RhcnRzd2l0aChleHBlY3RlZF9wcmVmaXgpLAotICAgICAgICAgICAgICAgICAgICAgICAgJ0VudHJ5ICVkIGZhaWxlZDogJXInICUgKGlkeCwgZSkpCi0KLQotY2xhc3MgVGVzdEV4cGFuZGluZ01hY3Jvcyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RFeHBhbmRCYXNpY3Moc2VsZik6Ci0gICAgZiA9IGlvLlN0cmluZ0lPKHUiIiIKLVBERE0tREVGSU5FIG5vQXJncyggKQotYm9keTEKLWJvZHkyCi0KLVBERE0tREVGSU5FLUVORAotCi1QRERNLURFRklORSBvbmVBcmcoYSkKLWJvZHkzIGEKLQotUERETS1ERUZJTkUtRU5ECi0KLVBERE0tREVGSU5FIHR3b0FyZ3MoYixjKQotYm9keTQgYiBjCi1ib2R5NQotUERETS1ERUZJTkUtRU5ECi0KLSIiIikKLSAgICBtYyA9IHBkZG0uTWFjcm9Db2xsZWN0aW9uKGYpCi0gICAgdGVzdF9saXN0ID0gWwotICAgICAgKHUnbm9BcmdzKCknLAotICAgICAgICdib2R5MVxuYm9keTJcbicpLAotICAgICAgKHUnb25lQXJnKHdlZSknLAotICAgICAgICdib2R5MyB3ZWVcbicpLAotICAgICAgKHUndHdvQXJncyhoYXZpbmcgc29tZSwgZnVuKScsCi0gICAgICAgJ2JvZHk0IGhhdmluZyBzb21lIGZ1blxuYm9keTUnKSwKLSAgICAgICMgT25lIGFyZywgcGFzcyBlbXB0eS4KLSAgICAgICh1J29uZUFyZygpJywKLSAgICAgICAnYm9keTMgXG4nKSwKLSAgICAgICMgVHdvIGFyZ3MsIGdldHMgZW1wdHkgaW4gZWFjaCBzbG90LgotICAgICAgKHUndHdvQXJncygsIGVtcHR5KScsCi0gICAgICAgJ2JvZHk0ICBlbXB0eVxuYm9keTUnKSwKLSAgICAgICh1J3R3b0FyZ3MoZW1wdHksICknLAotICAgICAgICdib2R5NCBlbXB0eSBcbmJvZHk1JyksCi0gICAgICAodSd0d29BcmdzKCwgKScsCi0gICAgICAgJ2JvZHk0ICBcbmJvZHk1JyksCi0gICAgXQotICAgIGZvciBpZHgsIChpbnB1dF9zdHIsIGV4cGVjdGVkKSBpbiBlbnVtZXJhdGUodGVzdF9saXN0LCAxKToKLSAgICAgIHJlc3VsdCA9IG1jLkV4cGFuZChpbnB1dF9zdHIpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgZXhwZWN0ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICdFbnRyeSAlZCAtLVxuICAgICAgIFJlc3VsdDogJXJcbiAgICAgRXhwZWN0ZWQ6ICVyJyAlCi0gICAgICAgICAgICAgICAgICAgICAgIChpZHgsIHJlc3VsdCwgZXhwZWN0ZWQpKQotCi0gIGRlZiB0ZXN0RXhwYW5kQXJnT3B0aW9ucyhzZWxmKToKLSAgICBmID0gaW8uU3RyaW5nSU8odSIiIgotUERETS1ERUZJTkUgYmFyKGEpCi1hLWEkUy1hJGwtYSRMLWEkdS1hJFUKLVBERE0tREVGSU5FLUVORAotIiIiKQotICAgIG1jID0gcGRkbS5NYWNyb0NvbGxlY3Rpb24oZikKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWMuRXhwYW5kKCdiYXIoeFl6KScpLCAneFl6LSAgIC14WXoteHl6LVhZei1YWVonKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWMuRXhwYW5kKCdiYXIoTW5vUCknKSwgJ01ub1AtICAgIC1tbm9QLW1ub3AtTW5vUC1NTk9QJykKLSAgICAjIFRlc3QgZW1wdHkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1jLkV4cGFuZCgnYmFyKCknKSwgJy0tLS0tJykKLQotICBkZWYgdGVzdEV4cGFuZFNpbXBsZU1hY3JvRXJyb3JzKHNlbGYpOgotICAgIGYgPSBpby5TdHJpbmdJTyh1IiIiCi1QRERNLURFRklORSBmb28oYSwgYikKLTxhLXo+Ci1QRERNLURFRklORSBiYXooYSkKLWEgLSBhJHoKLSIiIikKLSAgICBtYyA9IHBkZG0uTWFjcm9Db2xsZWN0aW9uKGYpCi0gICAgdGVzdF9saXN0ID0gWwotICAgICAgIyAxLiBVbmtub3duIG1hY3JvCi0gICAgICAodSdiYXIoKScsCi0gICAgICAgJ05vIG1hY3JvIG5hbWVkICJiYXIiLicpLAotICAgICAgKHUnYmFyKGEpJywKLSAgICAgICAnTm8gbWFjcm8gbmFtZWQgImJhciIuJyksCi0gICAgICAjIDMuIEFyZyBtaXNtYXRjaAotICAgICAgKHUnZm9vKCknLAotICAgICAgICdFeHBlY3RlZCAyIGFyZ3MsIGdvdDogImZvbygpIi4nKSwKLSAgICAgICh1J2ZvbyhhIGIpJywKLSAgICAgICAnRXhwZWN0ZWQgMiBhcmdzLCBnb3Q6ICJmb28oYSBiKSIuJyksCi0gICAgICAodSdmb28oYSxiLGMpJywKLSAgICAgICAnRXhwZWN0ZWQgMiBhcmdzLCBnb3Q6ICJmb28oYSxiLGMpIi4nKSwKLSAgICAgICMgNi4gVW5rbm93biBvcHRpb24gaW4gZXhwYW5zaW9uCi0gICAgICAodSdiYXoobXVtYmxlKScsCi0gICAgICAgJ1Vua25vd24gYXJnIG9wdGlvbiAiYSR6IiB3aGlsZSBleHBhbmRpbmcgImJheihtdW1ibGUpIi4nKSwKLSAgICBdCi0gICAgZm9yIGlkeCwgKGlucHV0X3N0ciwgZXhwZWN0ZWRfZXJyKSBpbiBlbnVtZXJhdGUodGVzdF9saXN0LCAxKToKLSAgICAgIHRyeToKLSAgICAgICAgcmVzdWx0ID0gbWMuRXhwYW5kKGlucHV0X3N0cikKLSAgICAgICAgc2VsZi5mYWlsKCdTaG91bGQgdGhyb3cgZXhjZXB0aW9uLCBlbnRyeSAlZCcgJSBpZHgpCi0gICAgICBleGNlcHQgcGRkbS5QRERNRXJyb3IgYXMgZToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1lc3NhZ2UsIGV4cGVjdGVkX2VyciwKLSAgICAgICAgICAgICAgICAgICAgICAgICdFbnRyeSAlZCBmYWlsZWQ6ICVyJyAlIChpZHgsIGUpKQotCi0gIGRlZiB0ZXN0RXhwYW5kUmVmZXJlbmNlcyhzZWxmKToKLSAgICBmID0gaW8uU3RyaW5nSU8odSIiIgotUERETS1ERUZJTkUgU3RhcnRJdCgpCi1mb28oYWJjLCBkZWYpCi1mb28oZ2hpLCBqa2wpCi1QRERNLURFRklORSBmb28oYSwgYikKLWJhcihhLCBpbnQpCi1iYXIoYiwgTlNTdHJpbmcgKikKLVBERE0tREVGSU5FIGJhcihuLCB0KQotLSAodCluOwotLSAodm9pZClzZXQjI24kdSMjOih0KXZhbHVlOwotCi0iIiIpCi0gICAgbWMgPSBwZGRtLk1hY3JvQ29sbGVjdGlvbihmKQotICAgIGV4cGVjdGVkID0gIiIiLSAoaW50KWFiYzsKLS0gKHZvaWQpc2V0QWJjOihpbnQpdmFsdWU7Ci0KLS0gKE5TU3RyaW5nICopZGVmOwotLSAodm9pZClzZXREZWY6KE5TU3RyaW5nICopdmFsdWU7Ci0KLS0gKGludClnaGk7Ci0tICh2b2lkKXNldEdoaTooaW50KXZhbHVlOwotCi0tIChOU1N0cmluZyAqKWprbDsKLS0gKHZvaWQpc2V0SmtsOihOU1N0cmluZyAqKXZhbHVlOwotIiIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtYy5FeHBhbmQoJ1N0YXJ0SXQoKScpLCBleHBlY3RlZCkKLQotICBkZWYgdGVzdENhdGNoUmVjdXJzaW9uKHNlbGYpOgotICAgIGYgPSBpby5TdHJpbmdJTyh1IiIiCi1QRERNLURFRklORSBmb28oYSwgYikKLWJhcigxLCBhKQotYmFyKDIsIGIpCi1QRERNLURFRklORSBiYXIoeCwgeSkKLWZvbyh4LCB5KQotIiIiKQotICAgIG1jID0gcGRkbS5NYWNyb0NvbGxlY3Rpb24oZikKLSAgICB0cnk6Ci0gICAgICByZXN1bHQgPSBtYy5FeHBhbmQoJ2ZvbyhBLEIpJykKLSAgICAgIHNlbGYuZmFpbCgnU2hvdWxkIHRocm93IGV4Y2VwdGlvbiwgZW50cnkgJWQnICUgaWR4KQotICAgIGV4Y2VwdCBwZGRtLlBERE1FcnJvciBhcyBlOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICdGb3VuZCBtYWNybyByZWN1c2lvbiwgaW52b2tpbmcgImZvbygxLCBBKSI6XG4uLi53aGlsZSBleHBhbmRpbmcgImJhcigxLCBBKSIuXG4uLi53aGlsZSBleHBhbmRpbmcgImZvbyhBLEIpIi4nKQotCi0KLWNsYXNzIFRlc3RQYXJzaW5nU291cmNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgdGVzdEJhc2ljUGFyc2Uoc2VsZik6Ci0gICAgdGVzdF9saXN0ID0gWwotICAgICAgIyAxLiBubyBkaXJlY3RpdmVzCi0gICAgICAodSdhXG5iXG5jJywKLSAgICAgICAoMywpICksCi0gICAgICAjIDIuIE9uZSBkZWZpbmUKLSAgICAgICh1J2Fcbi8vJVBERE0tREVGSU5FIGZvbygpXG4vLyVib2R5XG5jJywKLSAgICAgICAoMSwgMiwgMSkgKSwKLSAgICAgICMgMy4gVHdvIGRlZmluZXMKLSAgICAgICh1J2Fcbi8vJVBERE0tREVGSU5FIGZvbygpXG4vLyVib2R5XG4vLyVQRERNLURFRklORSBiYXIoKVxuLy8lYm9keTJcbmMnLAotICAgICAgICgxLCA0LCAxKSApLAotICAgICAgIyA0LiBUd28gZGVmaW5lcyB3aXRoIGVuZHMKLSAgICAgICh1J2Fcbi8vJVBERE0tREVGSU5FIGZvbygpXG4vLyVib2R5XG4vLyVQRERNLURFRklORS1FTkRcbicKLSAgICAgICB1Jy8vJVBERE0tREVGSU5FIGJhcigpXG4vLyVib2R5MlxuLy8lUERETS1ERUZJTkUtRU5EXG5jJywKLSAgICAgICAoMSwgNiwgMSkgKSwKLSAgICAgICMgNS4gT25lIGV4cGFuZCwgb25lIGRlZmluZSAodGhhdCBydW5zIHRvIGVuZCBvZiBmaWxlKQotICAgICAgKHUnYVxuLy8lUERETS1FWFBBTkQgZm9vKClcbmJvZHlcbi8vJVBERE0tRVhQQU5ELUVORFxuJwotICAgICAgIHUnLy8lUERETS1ERUZJTkUgYmFyKClcbi8vJWJvZHkyXG4nLAotICAgICAgICgxLCAxLCAyKSApLAotICAgICAgIyA2LiBPbmUgZGVmaW5lIGVuZGVkIHdpdGggYW4gZXhwYW5kLgotICAgICAgKHUnYVxuYlxuLy8lUERETS1ERUZJTkUgYmFyKClcbi8vJWJvZHkyXG4nCi0gICAgICAgdScvLyVQRERNLUVYUEFORCBiYXIoKVxuYm9keTJcbi8vJVBERE0tRVhQQU5ELUVORFxuJywKLSAgICAgICAoMiwgMiwgMSkgKSwKLSAgICAgICMgNy4gVHdvIGV4cGFuZHMgKG9uZSBlbmQpLCBvbmUgZGVmaW5lLgotICAgICAgKHUnYVxuLy8lUERETS1FWFBBTkQgZm9vKDEpXG5ib2R5XG4vLyVQRERNLUVYUEFORCBmb28oMilcbmJvZHkyXG4vLyVQRERNLUVYUEFORC1FTkRcbicKLSAgICAgICB1Jy8vJVBERE0tREVGSU5FIGZvbygpXG4vLyVib2R5MlxuJywKLSAgICAgICAoMSwgMiwgMikgKSwKLSAgICBdCi0gICAgZm9yIGlkeCwgKGlucHV0X3N0ciwgbGluZV9jb3VudHMpIGluIGVudW1lcmF0ZSh0ZXN0X2xpc3QsIDEpOgotICAgICAgZiA9IGlvLlN0cmluZ0lPKGlucHV0X3N0cikKLSAgICAgIHNmID0gcGRkbS5Tb3VyY2VGaWxlKGYpCi0gICAgICBzZi5fUGFyc2VGaWxlKCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNmLl9zZWN0aW9ucyksIGxlbihsaW5lX2NvdW50cyksCi0gICAgICAgICAgICAgICAgICAgICAgICdFbnRyeSAlZCAtLSAlZCAhPSAlZCcgJQotICAgICAgICAgICAgICAgICAgICAgICAoaWR4LCBsZW4oc2YuX3NlY3Rpb25zKSwgbGVuKGxpbmVfY291bnRzKSkpCi0gICAgICBmb3IgaWR4MiwgKHNlYywgZXhwZWN0ZWQpIGluIGVudW1lcmF0ZSh6aXAoc2YuX3NlY3Rpb25zLCBsaW5lX2NvdW50cyksIDEpOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKHNlYy5udW1fbGluZXNfY2FwdHVyZWQsIGV4cGVjdGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgICdFbnRyeSAlZCwgc2VjdGlvbiAlZCAtLSAlZCAhPSAlZCcgJQotICAgICAgICAgICAgICAgICAgICAgICAgIChpZHgsIGlkeDIsIHNlYy5udW1fbGluZXNfY2FwdHVyZWQsIGV4cGVjdGVkKSkKLQotICBkZWYgdGVzdEVycm9ycyhzZWxmKToKLSAgICB0ZXN0X2xpc3QgPSBbCi0gICAgICAjIDEuIERpcmVjdGl2ZSB3aXRoaW4gZXhwYW5zaW9uCi0gICAgICAodScvLyVQRERNLUVYUEFORCBhKClcbi8vJVBERE0tQk9HVVMnLAotICAgICAgICdSYW4gaW50byBkaXJlY3RpdmUgKCIvLyVQRERNLUJPR1VTIiwgbGluZSAyKSB3aGlsZSBpbiAiLy8lUERETS1FWFBBTkQgYSgpIi4nKSwKLSAgICAgICh1Jy8vJVBERE0tRVhQQU5EIGEoKVxuLy8lUERETS1ERUZJTkUgYSgpXG4vLyVib2R5XG4nLAotICAgICAgICdSYW4gaW50byBkaXJlY3RpdmUgKCIvLyVQRERNLURFRklORSIsIGxpbmUgMikgd2hpbGUgaW4gIi8vJVBERE0tRVhQQU5EIGEoKSIuJyksCi0gICAgICAjIDMuIEV4cGFuc2lvbiByYW4gb2ZmIGVuZCBvZiBmaWxlCi0gICAgICAodScvLyVQRERNLUVYUEFORCBhKClcbmFcbmJcbicsCi0gICAgICAgJ0hpdCB0aGUgZW5kIG9mIHRoZSBmaWxlIHdoaWxlIGluICIvLyVQRERNLUVYUEFORCBhKCkiLicpLAotICAgICAgIyA0LiBEaXJlY3RpdmUgd2l0aGluIGRlZmluZQotICAgICAgKHUnLy8lUERETS1ERUZJTkUgYSgpXG4vLyVib2R5XG4vLyVQRERNLUJPR1VTJywKLSAgICAgICAnUmFuIGludG8gZGlyZWN0aXZlICgiLy8lUERETS1CT0dVUyIsIGxpbmUgMykgd2hpbGUgaW4gIi8vJVBERE0tREVGSU5FIGEoKSIuJyksCi0gICAgICAodScvLyVQRERNLURFRklORSBhKClcbi8vJWJvZHlcbi8vJVBERE0tRVhQQU5ELUVORCBhKCknLAotICAgICAgICdSYW4gaW50byBkaXJlY3RpdmUgKCIvLyVQRERNLUVYUEFORC1FTkQiLCBsaW5lIDMpIHdoaWxlIGluICIvLyVQRERNLURFRklORSBhKCkiLicpLAotICAgICAgIyA2LiBEaXJlY3RpdmVzIHRoYXQgc2hvdWxkbid0IHN0YXJ0IHNlY3Rpb25zCi0gICAgICAodSdhXG4vLyVQRERNLURFRklORS1FTkQgYSgpXG4vL2FcbicsCi0gICAgICAgJ1VuZXhwZWN0ZWQgbGluZSAyOiAiLy8lUERETS1ERUZJTkUtRU5EIGEoKSIuJyksCi0gICAgICAodSdhXG4vLyVQRERNLUVYUEFORC1FTkQgYSgpXG4vL2FcbicsCi0gICAgICAgJ1VuZXhwZWN0ZWQgbGluZSAyOiAiLy8lUERETS1FWFBBTkQtRU5EIGEoKSIuJyksCi0gICAgICAodScvLyVQRERNLUJPR1VTXG4vL2FcbicsCi0gICAgICAgJ1VuZXhwZWN0ZWQgbGluZSAxOiAiLy8lUERETS1CT0dVUyIuJyksCi0gICAgXQotICAgIGZvciBpZHgsIChpbnB1dF9zdHIsIGV4cGVjdGVkX2VycikgaW4gZW51bWVyYXRlKHRlc3RfbGlzdCwgMSk6Ci0gICAgICBmID0gaW8uU3RyaW5nSU8oaW5wdXRfc3RyKQotICAgICAgdHJ5OgotICAgICAgICBwZGRtLlNvdXJjZUZpbGUoZikuX1BhcnNlRmlsZSgpCi0gICAgICAgIHNlbGYuZmFpbCgnU2hvdWxkIHRocm93IGV4Y2VwdGlvbiwgZW50cnkgJWQnICUgaWR4KQotICAgICAgZXhjZXB0IHBkZG0uUERETUVycm9yIGFzIGU6Ci0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tZXNzYWdlLCBleHBlY3RlZF9lcnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAnRW50cnkgJWQgZmFpbGVkOiAlcicgJSAoaWR4LCBlKSkKLQotY2xhc3MgVGVzdFByb2Nlc3NpbmdTb3VyY2UodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0QmFzaWNzKHNlbGYpOgotICAgIGlucHV0X3N0ciA9IHUiIiIKLS8vJVBERE0tSU1QT1JULURFRklORVMgSW1wb3J0RmlsZQotZm9vCi0vLyVQRERNLUVYUEFORCBtdW1ibGUoYWJjKQotLy8lUERETS1FWFBBTkQtRU5ECi1iYXIKLS8vJVBERE0tRVhQQU5EIG11bWJsZShkZWYpCi0vLyVQRERNLUVYUEFORCBtdW1ibGUoZ2hpKQotLy8lUERETS1FWFBBTkQtRU5ECi1iYXoKLS8vJVBERE0tREVGSU5FIG11bWJsZShhXykKLS8vJWFfOiBnZXROYW1lKGFfKQotIiIiCi0gICAgaW5wdXRfc3RyMiA9IHUiIiIKLS8vJVBERE0tREVGSU5FIGdldE5hbWUoeF8pCi0vLyVkbyMjeF8kdSMjKGludCB4Xyk7Ci0KLSIiIgotICAgIGV4cGVjdGVkID0gdSIiIgotLy8lUERETS1JTVBPUlQtREVGSU5FUyBJbXBvcnRGaWxlCi1mb28KLS8vJVBERE0tRVhQQU5EIG11bWJsZShhYmMpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotYWJjOiBkb0FiYyhpbnQgYWJjKTsKLS8vJVBERE0tRVhQQU5ELUVORCBtdW1ibGUoYWJjKQotYmFyCi0vLyVQRERNLUVYUEFORCBtdW1ibGUoZGVmKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLWRlZjogZG9EZWYoaW50IGRlZik7Ci0vLyVQRERNLUVYUEFORCBtdW1ibGUoZ2hpKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLWdoaTogZG9HaGkoaW50IGdoaSk7Ci0vLyVQRERNLUVYUEFORC1FTkQgKDIgZXhwYW5zaW9ucykKLWJhegotLy8lUERETS1ERUZJTkUgbXVtYmxlKGFfKQotLy8lYV86IGdldE5hbWUoYV8pCi0iIiIKLSAgICBleHBlY3RlZF9zdHJpcHBlZCA9IHUiIiIKLS8vJVBERE0tSU1QT1JULURFRklORVMgSW1wb3J0RmlsZQotZm9vCi0vLyVQRERNLUVYUEFORCBtdW1ibGUoYWJjKQotLy8lUERETS1FWFBBTkQtRU5EIG11bWJsZShhYmMpCi1iYXIKLS8vJVBERE0tRVhQQU5EIG11bWJsZShkZWYpCi0vLyVQRERNLUVYUEFORCBtdW1ibGUoZ2hpKQotLy8lUERETS1FWFBBTkQtRU5EICgyIGV4cGFuc2lvbnMpCi1iYXoKLS8vJVBERE0tREVGSU5FIG11bWJsZShhXykKLS8vJWFfOiBnZXROYW1lKGFfKQotIiIiCi0gICAgZGVmIF9SZXNvbHZlcihuYW1lKToKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmFtZSwgJ0ltcG9ydEZpbGUnKQotICAgICAgcmV0dXJuIGlvLlN0cmluZ0lPKGlucHV0X3N0cjIpCi0gICAgZiA9IGlvLlN0cmluZ0lPKGlucHV0X3N0cikKLSAgICBzZiA9IHBkZG0uU291cmNlRmlsZShmLCBfUmVzb2x2ZXIpCi0gICAgc2YuUHJvY2Vzc0NvbnRlbnQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2YucHJvY2Vzc2VkX2NvbnRlbnQsIGV4cGVjdGVkKQotICAgICMgRmVlZCBpdCB0aHJvdWdoIGFuZCBub3RoaW5nIHNob3VsZCBjaGFuZ2UuCi0gICAgZjIgPSBpby5TdHJpbmdJTyhzZi5wcm9jZXNzZWRfY29udGVudCkKLSAgICBzZjIgPSBwZGRtLlNvdXJjZUZpbGUoZjIsIF9SZXNvbHZlcikKLSAgICBzZjIuUHJvY2Vzc0NvbnRlbnQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2YyLnByb2Nlc3NlZF9jb250ZW50LCBleHBlY3RlZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNmMi5wcm9jZXNzZWRfY29udGVudCwgc2YucHJvY2Vzc2VkX2NvbnRlbnQpCi0gICAgIyBUZXN0IHN0cmlwcGluZyAod2l0aCB0aGUgb3JpZ2luYWwgaW5wdXQgYW5kIGV4cGFuZGVkIHZlcnNpb24pLgotICAgIGYyID0gaW8uU3RyaW5nSU8oaW5wdXRfc3RyKQotICAgIHNmMiA9IHBkZG0uU291cmNlRmlsZShmMikKLSAgICBzZjIuUHJvY2Vzc0NvbnRlbnQoc3RyaXBfZXhwYW5zaW9uPVRydWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZjIucHJvY2Vzc2VkX2NvbnRlbnQsIGV4cGVjdGVkX3N0cmlwcGVkKQotICAgIGYyID0gaW8uU3RyaW5nSU8oc2YucHJvY2Vzc2VkX2NvbnRlbnQpCi0gICAgc2YyID0gcGRkbS5Tb3VyY2VGaWxlKGYyLCBfUmVzb2x2ZXIpCi0gICAgc2YyLlByb2Nlc3NDb250ZW50KHN0cmlwX2V4cGFuc2lvbj1UcnVlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2YyLnByb2Nlc3NlZF9jb250ZW50LCBleHBlY3RlZF9zdHJpcHBlZCkKLQotICBkZWYgdGVzdFByb2Nlc3NGaWxlV2l0aE1hY3JvUGFyc2VFcnJvcihzZWxmKToKLSAgICBpbnB1dF9zdHIgPSB1IiIiCi1mb28KLS8vJVBERE0tREVGSU5FIG11bWJsZShhXykKLS8vJWJvZHkKLS8vJVBERE0tREVGSU5FIG11bWJsZSh4XykKLS8vJWJvZHkyCi0KLSIiIgotICAgIGYgPSBpby5TdHJpbmdJTyhpbnB1dF9zdHIpCi0gICAgc2YgPSBwZGRtLlNvdXJjZUZpbGUoZikKLSAgICB0cnk6Ci0gICAgICBzZi5Qcm9jZXNzQ29udGVudCgpCi0gICAgICBzZWxmLmZhaWwoJ1Nob3VsZCB0aHJvdyBleGNlcHRpb24sIGVudHJ5ICVkJyAlIGlkeCkKLSAgICBleGNlcHQgcGRkbS5QRERNRXJyb3IgYXMgZToKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZS5tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAnQXR0ZW1wdCB0byByZWRlZmluZSBtYWNybzogIlBERE0tREVGSU5FIG11bWJsZSh4XykiXG4nCi0gICAgICAgICAgICAgICAgICAgICAgICcuLi53aGlsZSBwYXJzaW5nIHNlY3Rpb24gdGhhdCBzdGFydGVkOlxuJwotICAgICAgICAgICAgICAgICAgICAgICAnICBMaW5lIDM6IC8vJVBERE0tREVGSU5FIG11bWJsZShhXyknKQotCi0gIGRlZiB0ZXN0UHJvY2Vzc0ZpbGVXaXRoRXhwYW5kRXJyb3Ioc2VsZik6Ci0gICAgaW5wdXRfc3RyID0gdSIiIgotZm9vCi0vLyVQRERNLURFRklORSBtdW1ibGUoYV8pCi0vLyVib2R5Ci0vLyVQRERNLUVYUEFORCBmb29iYXIoeF8pCi0vLyVQRERNLUVYUEFORC1FTkQKLQotIiIiCi0gICAgZiA9IGlvLlN0cmluZ0lPKGlucHV0X3N0cikKLSAgICBzZiA9IHBkZG0uU291cmNlRmlsZShmKQotICAgIHRyeToKLSAgICAgIHNmLlByb2Nlc3NDb250ZW50KCkKLSAgICAgIHNlbGYuZmFpbCgnU2hvdWxkIHRocm93IGV4Y2VwdGlvbiwgZW50cnkgJWQnICUgaWR4KQotICAgIGV4Y2VwdCBwZGRtLlBERE1FcnJvciBhcyBlOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChlLm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICdObyBtYWNybyBuYW1lZCAiZm9vYmFyIi5cbicKLSAgICAgICAgICAgICAgICAgICAgICAgJy4uLndoaWxlIGV4cGFuZGluZyAiZm9vYmFyKHhfKSIgZnJvbSB0aGUgc2VjdGlvbiB0aGF0JwotICAgICAgICAgICAgICAgICAgICAgICAnIHN0YXJ0ZWQ6XG4gICBMaW5lIDU6IC8vJVBERE0tRVhQQU5EIGZvb2Jhcih4XyknKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJBcnJheS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJBcnJheS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmRhNTdmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQXJyYXkuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLSNpbXBvcnQgIkdQQlJ1bnRpbWVUeXBlcy5oIgotCi0vLyBUaGVzZSBjbGFzc2VzIGFyZSB1c2VkIGZvciByZXBlYXRlZCBmaWVsZHMgb2YgYmFzaWMgZGF0YSB0eXBlcy4gVGhleSBhcmUgdXNlZCBiZWNhdXNlCi0vLyB0aGV5IHBlcmZvcm0gYmV0dGVyIHRoYW4gYm94aW5nIGludG8gTlNOdW1iZXJzIGluIE5TQXJyYXlzLgotCi0vLyBOb3RlOiBUaGVzZSBhcmUgbm90IG1lYW50IHRvIGJlIHN1YmNsYXNzZWQuCi0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLS8vJVBERE0tRVhQQU5EIERFQ0xBUkVfQVJSQVlTKCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkludDMyQXJyYXkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5OwotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlOwotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlQXJyYXk6KEdQQkludDMyQXJyYXkgKilhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS8vIEluaXRpYWxpemVzIHRoZSBhcnJheSwgY29weWluZyB0aGUgdmFsdWVzLgotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVBcnJheTooR1BCSW50MzJBcnJheSAqKWFycmF5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQ7Ci0KLS0gKGludDMyX3QpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazoodm9pZCAoXikoaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrOwotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczooTlNFbnVtZXJhdGlvbk9wdGlvbnMpb3B0cwotICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazoodm9pZCAoXikoaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZFZhbHVlOihpbnQzMl90KXZhbHVlOwotLSAodm9pZClhZGRWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotLSAodm9pZClhZGRWYWx1ZXNGcm9tQXJyYXk6KEdQQkludDMyQXJyYXkgKilhcnJheTsKLQotLSAodm9pZClpbnNlcnRWYWx1ZTooaW50MzJfdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKXJlcGxhY2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggd2l0aFZhbHVlOihpbnQzMl90KXZhbHVlOwotCi0tICh2b2lkKXJlbW92ZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi0tICh2b2lkKWV4Y2hhbmdlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDEKLSAgICAgICAgICAgIHdpdGhWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MjsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIKLQotQGludGVyZmFjZSBHUEJVSW50MzJBcnJheSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXk7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWU6KHVpbnQzMl90KXZhbHVlOwotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlQXJyYXk6KEdQQlVJbnQzMkFycmF5ICopYXJyYXk7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQ7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0vLyBJbml0aWFsaXplcyB0aGUgYXJyYXksIGNvcHlpbmcgdGhlIHZhbHVlcy4KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJVSW50MzJBcnJheSAqKWFycmF5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQ7Ci0KLS0gKHVpbnQzMl90KXZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLQotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6KHZvaWQgKF4pKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKSh1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZFZhbHVlOih1aW50MzJfdCl2YWx1ZTsKLS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tICh2b2lkKWFkZFZhbHVlc0Zyb21BcnJheTooR1BCVUludDMyQXJyYXkgKilhcnJheTsKLQotLSAodm9pZClpbnNlcnRWYWx1ZToodWludDMyX3QpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZToodWludDMyX3QpdmFsdWU7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLS0gKHZvaWQpZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MQotICAgICAgICAgICAgd2l0aFZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgyOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0Ci0KLUBpbnRlcmZhY2UgR1BCSW50NjRBcnJheSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXk7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWU6KGludDY0X3QpdmFsdWU7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCSW50NjRBcnJheSAqKWFycmF5OwotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50OwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLy8gSW5pdGlhbGl6ZXMgdGhlIGFycmF5LCBjb3B5aW5nIHRoZSB2YWx1ZXMuCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJJbnQ2NEFycmF5ICopYXJyYXk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLSAoaW50NjRfdCl2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0KLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkVmFsdWU6KGludDY0X3QpdmFsdWU7Ci0tICh2b2lkKWFkZFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tICh2b2lkKWFkZFZhbHVlc0Zyb21BcnJheTooR1BCSW50NjRBcnJheSAqKWFycmF5OwotCi0tICh2b2lkKWluc2VydFZhbHVlOihpbnQ2NF90KXZhbHVlIGF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0KLS0gKHZvaWQpcmVwbGFjZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB3aXRoVmFsdWU6KGludDY0X3QpdmFsdWU7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLS0gKHZvaWQpZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MQotICAgICAgICAgICAgd2l0aFZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgyOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEFycmF5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWU7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCVUludDY0QXJyYXkgKilhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS8vIEluaXRpYWxpemVzIHRoZSBhcnJheSwgY29weWluZyB0aGUgdmFsdWVzLgotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlQXJyYXk6KEdQQlVJbnQ2NEFycmF5ICopYXJyYXk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLSAodWludDY0X3QpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazoodm9pZCAoXikodWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jazsKLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6KE5TRW51bWVyYXRpb25PcHRpb25zKW9wdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6KHZvaWQgKF4pKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkVmFsdWU6KHVpbnQ2NF90KXZhbHVlOwotLSAodm9pZClhZGRWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLS0gKHZvaWQpYWRkVmFsdWVzRnJvbUFycmF5OihHUEJVSW50NjRBcnJheSAqKWFycmF5OwotCi0tICh2b2lkKWluc2VydFZhbHVlOih1aW50NjRfdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKXJlcGxhY2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggd2l0aFZhbHVlOih1aW50NjRfdCl2YWx1ZTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0gICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDI7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gRmxvYXQKLQotQGludGVyZmFjZSBHUEJGbG9hdEFycmF5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZTooZmxvYXQpdmFsdWU7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCRmxvYXRBcnJheSAqKWFycmF5OwotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50OwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLy8gSW5pdGlhbGl6ZXMgdGhlIGFycmF5LCBjb3B5aW5nIHRoZSB2YWx1ZXMuCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVBcnJheTooR1BCRmxvYXRBcnJheSAqKWFycmF5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQ7Ci0KLS0gKGZsb2F0KXZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLQotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6KHZvaWQgKF4pKGZsb2F0IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShmbG9hdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZFZhbHVlOihmbG9hdCl2YWx1ZTsKLS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCBmbG9hdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tICh2b2lkKWFkZFZhbHVlc0Zyb21BcnJheTooR1BCRmxvYXRBcnJheSAqKWFycmF5OwotCi0tICh2b2lkKWluc2VydFZhbHVlOihmbG9hdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKXJlcGxhY2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggd2l0aFZhbHVlOihmbG9hdCl2YWx1ZTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0gICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDI7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gRG91YmxlCi0KLUBpbnRlcmZhY2UgR1BCRG91YmxlQXJyYXkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5OwotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlOihkb3VibGUpdmFsdWU7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCRG91YmxlQXJyYXkgKilhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS8vIEluaXRpYWxpemVzIHRoZSBhcnJheSwgY29weWluZyB0aGUgdmFsdWVzLgotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJEb3VibGVBcnJheSAqKWFycmF5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQ7Ci0KLS0gKGRvdWJsZSl2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0KLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShkb3VibGUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jazsKLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6KE5TRW51bWVyYXRpb25PcHRpb25zKW9wdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6KHZvaWQgKF4pKGRvdWJsZSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZFZhbHVlOihkb3VibGUpdmFsdWU7Ci0tICh2b2lkKWFkZFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLS0gKHZvaWQpYWRkVmFsdWVzRnJvbUFycmF5OihHUEJEb3VibGVBcnJheSAqKWFycmF5OwotCi0tICh2b2lkKWluc2VydFZhbHVlOihkb3VibGUpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZTooZG91YmxlKXZhbHVlOwotCi0tICh2b2lkKXJlbW92ZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi0tICh2b2lkKWV4Y2hhbmdlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDEKLSAgICAgICAgICAgIHdpdGhWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MjsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBCb29sCi0KLUBpbnRlcmZhY2UgR1BCQm9vbEFycmF5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZTooQk9PTCl2YWx1ZTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZUFycmF5OihHUEJCb29sQXJyYXkgKilhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS8vIEluaXRpYWxpemVzIHRoZSBhcnJheSwgY29weWluZyB0aGUgdmFsdWVzLgotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVBcnJheTooR1BCQm9vbEFycmF5ICopYXJyYXk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLSAoQk9PTCl2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0KLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkVmFsdWU6KEJPT0wpdmFsdWU7Ci0tICh2b2lkKWFkZFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tICh2b2lkKWFkZFZhbHVlc0Zyb21BcnJheTooR1BCQm9vbEFycmF5ICopYXJyYXk7Ci0KLS0gKHZvaWQpaW5zZXJ0VmFsdWU6KEJPT0wpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZTooQk9PTCl2YWx1ZTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0gICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDI7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gRW51bQotCi1AaW50ZXJmYWNlIEdQQkVudW1BcnJheSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIEdQQkVudW1WYWxpZGF0aW9uRnVuYyB2YWxpZGF0aW9uRnVuYzsKLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5OwotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmM7Ci0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTooaW50MzJfdCl2YWx1ZTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZUFycmF5OihHUEJFbnVtQXJyYXkgKilhcnJheTsKLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50OwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLQotLy8gSW5pdGlhbGl6ZXMgdGhlIGFycmF5LCBjb3B5aW5nIHRoZSB2YWx1ZXMuCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJFbnVtQXJyYXkgKilhcnJheTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLQotLy8gVGhlc2Ugd2lsbCByZXR1cm4ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSBpZiB0aGUgdmFsdWUgYXQgaW5kZXggaXMgbm90IGEKLS8vIHZhbGlkIGVudW1lcmF0b3IgYXMgZGVmaW5lZCBieSB2YWxpZGF0aW9uRnVuYy4gSWYgdGhlIGFjdHVhbCB2YWx1ZSBpcwotLy8gZGVzaXJlZCwgdXNlICJyYXciIHZlcnNpb24gb2YgdGhlIG1ldGhvZC4KLQotLSAoaW50MzJfdCl2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0KLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS8vIFRoZXNlIG1ldGhvZHMgYnlwYXNzIHRoZSB2YWxpZGF0aW9uRnVuYyB0byBwcm92aWRlIGFjY2VzcyB0byB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAotLy8ga25vd24gYXQgdGhlIHRpbWUgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQuCi0KLS0gKGludDMyX3QpcmF3VmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKWVudW1lcmF0ZVJhd1ZhbHVlc1dpdGhCbG9jazoodm9pZCAoXikoaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrOwotLSAodm9pZCllbnVtZXJhdGVSYXdWYWx1ZXNXaXRoT3B0aW9uczooTlNFbnVtZXJhdGlvbk9wdGlvbnMpb3B0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazoodm9pZCAoXikoaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0vLyBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMsIHRoZXNlCi0vLyBtZXRob2RzIHdpbGwgYXNzZXJ0IGluIGRlYnVnLCBhbmQgd2lsbCBsb2cgaW4gcmVsZWFzZSBhbmQgYXNzaWduIHRoZSB2YWx1ZQotLy8gdG8gdGhlIGRlZmF1bHQgdmFsdWUuIFVzZSB0aGUgcmF3VmFsdWUgbWV0aG9kcyBiZWxvdyB0byBhc3NpZ24gbm9uIGVudW1lcmF0b3IKLS8vIHZhbHVlcy4KLQotLSAodm9pZClhZGRWYWx1ZTooaW50MzJfdCl2YWx1ZTsKLS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLQotLSAodm9pZClpbnNlcnRWYWx1ZTooaW50MzJfdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKXJlcGxhY2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggd2l0aFZhbHVlOihpbnQzMl90KXZhbHVlOwotCi0vLyBUaGVzZSBtZXRob2RzIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbkZ1bmMgdG8gcHJvdmlkZSBzZXR0aW5nIG9mIHZhbHVlcyB0aGF0IHdlcmUgbm90Ci0vLyBrbm93biBhdCB0aGUgdGltZSB0aGUgYmluYXJ5IHdhcyBjb21waWxlZC4KLQotLSAodm9pZClhZGRSYXdWYWx1ZTooaW50MzJfdCl2YWx1ZTsKLS0gKHZvaWQpYWRkUmF3VmFsdWVzRnJvbUFycmF5OihHUEJFbnVtQXJyYXkgKilhcnJheTsKLS0gKHZvaWQpYWRkUmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLQotLSAodm9pZClpbnNlcnRSYXdWYWx1ZTooaW50MzJfdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotCi0tICh2b2lkKXJlcGxhY2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggd2l0aFJhd1ZhbHVlOihpbnQzMl90KXZhbHVlOwotCi0vLyBObyB2YWxpZGF0aW9uIGFwcGxpZXMgdG8gdGhlc2UgbWV0aG9kcy4KLQotLSAodm9pZClyZW1vdmVWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0gICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDI7Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQtRU5EIERFQ0xBUkVfQVJSQVlTKCkKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECi0KLS8vJVBERE0tREVGSU5FIERFQ0xBUkVfQVJSQVlTKCkKLS8vJUFSUkFZX0lOVEVSRkFDRV9TSU1QTEUoSW50MzIsIGludDMyX3QpCi0vLyVBUlJBWV9JTlRFUkZBQ0VfU0lNUExFKFVJbnQzMiwgdWludDMyX3QpCi0vLyVBUlJBWV9JTlRFUkZBQ0VfU0lNUExFKEludDY0LCBpbnQ2NF90KQotLy8lQVJSQVlfSU5URVJGQUNFX1NJTVBMRShVSW50NjQsIHVpbnQ2NF90KQotLy8lQVJSQVlfSU5URVJGQUNFX1NJTVBMRShGbG9hdCwgZmxvYXQpCi0vLyVBUlJBWV9JTlRFUkZBQ0VfU0lNUExFKERvdWJsZSwgZG91YmxlKQotLy8lQVJSQVlfSU5URVJGQUNFX1NJTVBMRShCb29sLCBCT09MKQotLy8lQVJSQVlfSU5URVJGQUNFX0VOVU0oRW51bSwgaW50MzJfdCkKLQotLy8KLS8vIFRoZSBjb21tb24gY2FzZSAoZXZlcnl0aGluZyBidXQgRW51bSkKLS8vCi0KLS8vJVBERE0tREVGSU5FIEFSUkFZX0lOVEVSRkFDRV9TSU1QTEUoTkFNRSwgVFlQRSkKLS8vJSNwcmFnbWEgbWFyayAtIE5BTUUKLS8vJQotLy8lQGludGVyZmFjZSBHUEIjI05BTUUjI0FycmF5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLS8vJQotLy8lQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlhcnJheTsKLS8vJSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZTooVFlQRSl2YWx1ZTsKLS8vJSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZUFycmF5OihHUEIjI05BTUUjI0FycmF5ICopYXJyYXk7Ci0vLyUrIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQ7Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0vLyUvLyBJbml0aWFsaXplcyB0aGUgYXJyYXksIGNvcHlpbmcgdGhlIHZhbHVlcy4KLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgVFlQRSBbXSl2YWx1ZXMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlQXJyYXk6KEdQQiMjTkFNRSMjQXJyYXkgKilhcnJheTsKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50OwotLy8lCi0vLyVBUlJBWV9JTU1VVEFCTEVfSU5URVJGQUNFKE5BTUUsIFRZUEUsIEJhc2ljKQotLy8lCi0vLyVBUlJBWV9NVVRBQkxFX0lOVEVSRkFDRShOQU1FLCBUWVBFLCBCYXNpYykKLS8vJQotLy8lQGVuZAotLy8lCi0KLS8vCi0vLyBNYWNyb3Mgc3BlY2lmaWMgdG8gRW51bXMgKHRvIHR3ZWFrIHRoZWlyIGludGVyZmFjZSkuCi0vLwotCi0vLyVQRERNLURFRklORSBBUlJBWV9JTlRFUkZBQ0VfRU5VTShOQU1FLCBUWVBFKQotLy8lI3ByYWdtYSBtYXJrIC0gTkFNRQotLy8lCi0vLyVAaW50ZXJmYWNlIEdQQiMjTkFNRSMjQXJyYXkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotLy8lCi0vLyVAcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLS8vJUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgdmFsaWRhdGlvbkZ1bmM7Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlhcnJheTsKLS8vJSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jOwotLy8lKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWU6KFRZUEUpdmFsdWU7Ci0vLyUrIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCIyNOQU1FIyNBcnJheSAqKWFycmF5OwotLy8lKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQ7Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLy8lCi0vLyUvLyBJbml0aWFsaXplcyB0aGUgYXJyYXksIGNvcHlpbmcgdGhlIHZhbHVlcy4KLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczooY29uc3QgVFlQRSBbXSl2YWx1ZXMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlQXJyYXk6KEdQQiMjTkFNRSMjQXJyYXkgKilhcnJheTsKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciljb3VudDsKLS8vJQotLy8lLy8gVGhlc2Ugd2lsbCByZXR1cm4ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSBpZiB0aGUgdmFsdWUgYXQgaW5kZXggaXMgbm90IGEKLS8vJS8vIHZhbGlkIGVudW1lcmF0b3IgYXMgZGVmaW5lZCBieSB2YWxpZGF0aW9uRnVuYy4gSWYgdGhlIGFjdHVhbCB2YWx1ZSBpcwotLy8lLy8gZGVzaXJlZCwgdXNlICJyYXciIHZlcnNpb24gb2YgdGhlIG1ldGhvZC4KLS8vJQotLy8lQVJSQVlfSU1NVVRBQkxFX0lOVEVSRkFDRShOQU1FLCBUWVBFLCBOQU1FKQotLy8lCi0vLyUvLyBUaGVzZSBtZXRob2RzIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbkZ1bmMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gdmFsdWVzIHRoYXQgd2VyZSBub3QKLS8vJS8vIGtub3duIGF0IHRoZSB0aW1lIHRoZSBiaW5hcnkgd2FzIGNvbXBpbGVkLgotLy8lCi0vLyUtIChUWVBFKXJhd1ZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLS8vJQotLy8lLSAodm9pZCllbnVtZXJhdGVSYXdWYWx1ZXNXaXRoQmxvY2s6KHZvaWQgKF4pKFRZUEUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jazsKLS8vJS0gKHZvaWQpZW51bWVyYXRlUmF3VmFsdWVzV2l0aE9wdGlvbnM6KE5TRW51bWVyYXRpb25PcHRpb25zKW9wdHMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6KHZvaWQgKF4pKFRZUEUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jazsKLS8vJQotLy8lLy8gSWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBhcyBkZWZpbmVkIGJ5IHZhbGlkYXRpb25GdW5jLCB0aGVzZQotLy8lLy8gbWV0aG9kcyB3aWxsIGFzc2VydCBpbiBkZWJ1ZywgYW5kIHdpbGwgbG9nIGluIHJlbGVhc2UgYW5kIGFzc2lnbiB0aGUgdmFsdWUKLS8vJS8vIHRvIHRoZSBkZWZhdWx0IHZhbHVlLiBVc2UgdGhlIHJhd1ZhbHVlIG1ldGhvZHMgYmVsb3cgdG8gYXNzaWduIG5vbiBlbnVtZXJhdG9yCi0vLyUvLyB2YWx1ZXMuCi0vLyUKLS8vJUFSUkFZX01VVEFCTEVfSU5URVJGQUNFKE5BTUUsIFRZUEUsIE5BTUUpCi0vLyUKLS8vJUBlbmQKLS8vJQotCi0vLyVQRERNLURFRklORSBBUlJBWV9JTU1VVEFCTEVfSU5URVJGQUNFKE5BTUUsIFRZUEUsIEhFTFBFUl9OQU1FKQotLy8lLSAoVFlQRSl2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXg7Ci0vLyUKLS8vJS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShUWVBFIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0vLyUtICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShUWVBFIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS8vJVBERE0tREVGSU5FIEFSUkFZX01VVEFCTEVfSU5URVJGQUNFKE5BTUUsIFRZUEUsIEhFTFBFUl9OQU1FKQotLy8lLSAodm9pZClhZGRWYWx1ZTooVFlQRSl2YWx1ZTsKLS8vJS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCBUWVBFIFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLS8vJUFSUkFZX0VYVFJBX01VVEFCTEVfTUVUSE9EUzFfIyNIRUxQRVJfTkFNRShOQU1FLCBUWVBFKQotLy8lLSAodm9pZClpbnNlcnRWYWx1ZTooVFlQRSl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4OwotLy8lCi0vLyUtICh2b2lkKXJlcGxhY2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggd2l0aFZhbHVlOihUWVBFKXZhbHVlOwotLy8lQVJSQVlfRVhUUkFfTVVUQUJMRV9NRVRIT0RTMl8jI0hFTFBFUl9OQU1FKE5BTUUsIFRZUEUpCi0vLyUtICh2b2lkKXJlbW92ZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLS8vJS0gKHZvaWQpcmVtb3ZlQWxsOwotLy8lCi0vLyUtICh2b2lkKWV4Y2hhbmdlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDEKLS8vJSAgICAgICAgICAgIHdpdGhWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MjsKLQotLy8KLS8vIFRoZXNlIGFyZSBob29rcyBpbnZva2VkIGJ5IHRoZSBhYm92ZSB0byBkbyBpbnNlcnQgYXMgbmVlZGVkLgotLy8KLQotLy8lUERETS1ERUZJTkUgQVJSQVlfRVhUUkFfTVVUQUJMRV9NRVRIT0RTMV9CYXNpYyhOQU1FLCBUWVBFKQotLy8lLSAodm9pZClhZGRWYWx1ZXNGcm9tQXJyYXk6KEdQQiMjTkFNRSMjQXJyYXkgKilhcnJheTsKLS8vJQotLy8lUERETS1ERUZJTkUgQVJSQVlfRVhUUkFfTVVUQUJMRV9NRVRIT0RTMl9CYXNpYyhOQU1FLCBUWVBFKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIEFSUkFZX0VYVFJBX01VVEFCTEVfTUVUSE9EUzFfRW51bShOQU1FLCBUWVBFKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIEFSUkFZX0VYVFJBX01VVEFCTEVfTUVUSE9EUzJfRW51bShOQU1FLCBUWVBFKQotLy8lCi0vLyUvLyBUaGVzZSBtZXRob2RzIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbkZ1bmMgdG8gcHJvdmlkZSBzZXR0aW5nIG9mIHZhbHVlcyB0aGF0IHdlcmUgbm90Ci0vLyUvLyBrbm93biBhdCB0aGUgdGltZSB0aGUgYmluYXJ5IHdhcyBjb21waWxlZC4KLS8vJQotLy8lLSAodm9pZClhZGRSYXdWYWx1ZTooVFlQRSl2YWx1ZTsKLS8vJS0gKHZvaWQpYWRkUmF3VmFsdWVzRnJvbUFycmF5OihHUEIjI05BTUUjI0FycmF5ICopYXJyYXk7Ci0vLyUtICh2b2lkKWFkZFJhd1ZhbHVlczooY29uc3QgVFlQRSBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0vLyUKLS8vJS0gKHZvaWQpaW5zZXJ0UmF3VmFsdWU6KFRZUEUpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleDsKLS8vJQotLy8lLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhSYXdWYWx1ZTooVFlQRSl2YWx1ZTsKLS8vJQotLy8lLy8gTm8gdmFsaWRhdGlvbiBhcHBsaWVzIHRvIHRoZXNlIG1ldGhvZHMuCi0vLyUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQXJyYXkubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQXJyYXkubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDI2YzdjYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkFycmF5Lm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNTM0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0ICJHUEJBcnJheV9QYWNrYWdlUHJpdmF0ZS5oIgotCi0jaW1wb3J0ICJHUEJNZXNzYWdlX1BhY2thZ2VQcml2YXRlLmgiCi0KLS8vIE11dGFibGUgYXJyYXlzIHVzZSBhbiBpbnRlcm5hbCBidWZmZXIgdGhhdCBjYW4gYWx3YXlzIGhvbGQgYSBtdWx0aXBsZSBvZiB0aGlzIGVsZW1lbnRzLgotI2RlZmluZSBrQ2h1bmtTaXplIDE2Ci0jZGVmaW5lIENhcGFjaXR5RnJvbUNvdW50KHgpICgoKHggLyBrQ2h1bmtTaXplKSArIDEpICoga0NodW5rU2l6ZSkKLQotc3RhdGljIEJPT0wgQXJyYXlEZWZhdWx0X0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlKSB7Ci0gIC8vIEFueXRoaW5nIGJ1dCB0aGUgYmFkIHZhbHVlIG1hcmtlciBpcyBhbGxvd2VkLgotICByZXR1cm4gKHZhbHVlICE9IGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotfQotCi0vLyVQRERNLURFRklORSBWQUxJREFURV9SQU5HRShJTkRFWCwgQ09VTlQpCi0vLyUgIGlmIChJTkRFWCA+PSBDT1VOVCkgewotLy8lICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0vLyUgICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKUlOREVYLCAodW5zaWduZWQgbG9uZylDT1VOVF07Ci0vLyUgIH0KLS8vJVBERE0tREVGSU5FIE1BWUJFX0dST1dfVE9fU0VUX0NPVU5UKE5FV19DT1VOVCkKLS8vJSAgaWYgKE5FV19DT1VOVCA+IF9jYXBhY2l0eSkgewotLy8lICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChORVdfQ09VTlQpXTsKLS8vJSAgfQotLy8lICBfY291bnQgPSBORVdfQ09VTlQ7Ci0vLyVQRERNLURFRklORSBTRVRfQ09VTlRfQU5EX01BWUJFX1NIUklOSyhORVdfQ09VTlQpCi0vLyUgIF9jb3VudCA9IE5FV19DT1VOVDsKLS8vJSAgaWYgKChORVdfQ09VTlQgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotLy8lICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChORVdfQ09VTlQpXTsKLS8vJSAgfQotCi0vLwotLy8gTWFjcm9zIGZvciB0aGUgY29tbW9uIGJhc2ljIGNhc2VzLgotLy8KLQotLy8lUERETS1ERUZJTkUgQVJSQVlfSU5URVJGQUNFX1NJTVBMRShOQU1FLCBUWVBFLCBGT1JNQVQpCi0vLyUjcHJhZ21hIG1hcmsgLSBOQU1FCi0vLyUKLS8vJUBpbXBsZW1lbnRhdGlvbiBHUEIjI05BTUUjI0FycmF5IHsKLS8vJSBAcGFja2FnZQotLy8lICBUWVBFICpfdmFsdWVzOwotLy8lICBOU1VJbnRlZ2VyIF9jb3VudDsKLS8vJSAgTlNVSW50ZWdlciBfY2FwYWNpdHk7Ci0vLyV9Ci0vLyUKLS8vJUBzeW50aGVzaXplIGNvdW50ID0gX2NvdW50OwotLy8lCi0vLyUrIChpbnN0YW5jZXR5cGUpYXJyYXkgewotLy8lICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUrIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWU6KFRZUEUpdmFsdWUgewotLy8lICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6IG9uIHRvIGdldAotLy8lICAvLyB0aGUgdHlwZSBjb3JyZWN0LgotLy8lICByZXR1cm4gW1soR1BCIyNOQU1FIyNBcnJheSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZSBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZUFycmF5OihHUEIjI05BTUUjI0FycmF5ICopYXJyYXkgewotLy8lICByZXR1cm4gW1soR1BCIyNOQU1FIyNBcnJheSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVBcnJheTphcnJheV0gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUrIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQgewotLy8lICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpjb3VudF0gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0vLyUgIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0vLyUgIC8vIE5vIHdvcmsgbmVlZGVkOwotLy8lICByZXR1cm4gc2VsZjsKLS8vJX0KLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVBcnJheTooR1BCIyNOQU1FIyNBcnJheSAqKWFycmF5IHsKLS8vJSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOmFycmF5LT5fdmFsdWVzIGNvdW50OmFycmF5LT5fY291bnRdOwotLy8lfQotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IFRZUEUgW10pdmFsdWVzIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLS8vJSAgc2VsZiA9IFtzZWxmIGluaXRdOwotLy8lICBpZiAoc2VsZikgewotLy8lICAgIGlmIChjb3VudCAmJiB2YWx1ZXMpIHsKLS8vJSAgICAgIF92YWx1ZXMgPSByZWFsbG9jZihfdmFsdWVzLCBjb3VudCAqIHNpemVvZihUWVBFKSk7Ci0vLyUgICAgICBpZiAoX3ZhbHVlcyAhPSBOVUxMKSB7Ci0vLyUgICAgICAgIF9jYXBhY2l0eSA9IGNvdW50OwotLy8lICAgICAgICBtZW1jcHkoX3ZhbHVlcywgdmFsdWVzLCBjb3VudCAqIHNpemVvZihUWVBFKSk7Ci0vLyUgICAgICAgIF9jb3VudCA9IGNvdW50OwotLy8lICAgICAgfSBlbHNlIHsKLS8vJSAgICAgICAgW3NlbGYgcmVsZWFzZV07Ci0vLyUgICAgICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU01hbGxvY0V4Y2VwdGlvbgotLy8lICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKShjb3VudCAqIHNpemVvZihUWVBFKSldOwotLy8lICAgICAgfQotLy8lICAgIH0KLS8vJSAgfQotLy8lICByZXR1cm4gc2VsZjsKLS8vJX0KLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQgewotLy8lICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBjb3VudDowXTsKLS8vJSAgaWYgKHNlbGYgJiYgY291bnQpIHsKLS8vJSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Y291bnRdOwotLy8lICB9Ci0vLyUgIHJldHVybiBzZWxmOwotLy8lfQotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLS8vJSAgcmV0dXJuIFtbR1BCIyNOQU1FIyNBcnJheSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoVmFsdWVzOl92YWx1ZXMgY291bnQ6X2NvdW50XTsKLS8vJX0KLS8vJQotLy8lQVJSQVlfSU1NVVRBQkxFX0NPUkUoTkFNRSwgVFlQRSwgLCBGT1JNQVQpCi0vLyUKLS8vJS0gKFRZUEUpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLS8vJVZBTElEQVRFX1JBTkdFKGluZGV4LCBfY291bnQpCi0vLyUgIHJldHVybiBfdmFsdWVzW2luZGV4XTsKLS8vJX0KLS8vJQotLy8lQVJSQVlfTVVUQUJMRV9DT1JFKE5BTUUsIFRZUEUsICwgRk9STUFUKQotLy8lQGVuZAotLy8lCi0KLS8vCi0vLyBTb21lIGNvcmUgbWFjcm9zIHVzZWQgZm9yIGJvdGggdGhlIHNpbXBsZSB0eXBlcyBhbmQgRW51bXMuCi0vLwotCi0vLyVQRERNLURFRklORSBBUlJBWV9JTU1VVEFCTEVfQ09SRShOQU1FLCBUWVBFLCBBQ0NFU1NPUl9OQU1FLCBGT1JNQVQpCi0vLyUtICh2b2lkKWRlYWxsb2MgewotLy8lICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotLy8lICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0vLyUgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLS8vJSAgZnJlZShfdmFsdWVzKTsKLS8vJSAgW3N1cGVyIGRlYWxsb2NdOwotLy8lfQotLy8lCi0vLyUtIChCT09MKWlzRXF1YWw6KEdQQiMjTkFNRSMjQXJyYXkgKilvdGhlciB7Ci0vLyUgIGlmIChzZWxmID09IG90aGVyKSB7Ci0vLyUgICAgcmV0dXJuIFlFUzsKLS8vJSAgfQotLy8lICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEIjI05BTUUjI0FycmF5IGNsYXNzXV0pIHsKLS8vJSAgICByZXR1cm4gTk87Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIChfY291bnQgPT0gb3RoZXItPl9jb3VudAotLy8lICAgICAgICAgICYmIG1lbWNtcChfdmFsdWVzLCBvdGhlci0+X3ZhbHVlcywgKF9jb3VudCAqIHNpemVvZihUWVBFKSkpID09IDApOwotLy8lfQotLy8lCi0vLyUtIChOU1VJbnRlZ2VyKWhhc2ggewotLy8lICAvLyBGb2xsb3cgTlNBcnJheSdzIGxlYWQsIGFuZCB1c2UgdGhlIGNvdW50IGFzIHRoZSBoYXNoLgotLy8lICByZXR1cm4gX2NvdW50OwotLy8lfQotLy8lCi0vLyUtIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLS8vJSAgTlNNdXRhYmxlU3RyaW5nICpyZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgIiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLS8vJSAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwLCBjb3VudCA9IF9jb3VudDsgaSA8IGNvdW50OyArK2kpIHsKLS8vJSAgICBpZiAoaSA9PSAwKSB7Ci0vLyUgICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiMjRk9STUFUIyMiLCBfdmFsdWVzW2ldXTsKLS8vJSAgICB9IGVsc2UgewotLy8lICAgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIsICMjRk9STUFUIyMiLCBfdmFsdWVzW2ldXTsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIgfSJdOwotLy8lICByZXR1cm4gcmVzdWx0OwotLy8lfQotLy8lCi0vLyUtICh2b2lkKWVudW1lcmF0ZSMjQUNDRVNTT1JfTkFNRSMjVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShUWVBFIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotLy8lICBbc2VsZiBlbnVtZXJhdGUjI0FDQ0VTU09SX05BTUUjI1ZhbHVlc1dpdGhPcHRpb25zOjAgdXNpbmdCbG9jazpibG9ja107Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpZW51bWVyYXRlIyNBQ0NFU1NPUl9OQU1FIyNWYWx1ZXNXaXRoT3B0aW9uczooTlNFbnVtZXJhdGlvbk9wdGlvbnMpb3B0cwotLy8lICAgICAgICAgICAgICAgICAgQUNDRVNTT1JfTkFNRSRTICAgICAgdXNpbmdCbG9jazoodm9pZCAoXikoVFlQRSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLS8vJSAgLy8gTlNFbnVtZXJhdGlvbkNvbmN1cnJlbnQgaXNuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCAoYW5kIEFwcGxlJ3MgZG9jcyBzYXkgdGhhdCBpcyBvaykuCi0vLyUgIEJPT0wgc3RvcCA9IE5POwotLy8lICBpZiAoKG9wdHMgJiBOU0VudW1lcmF0aW9uUmV2ZXJzZSkgPT0gMCkgewotLy8lICAgIGZvciAoTlNVSW50ZWdlciBpID0gMCwgY291bnQgPSBfY291bnQ7IGkgPCBjb3VudDsgKytpKSB7Ci0vLyUgICAgICBibG9jayhfdmFsdWVzW2ldLCBpLCAmc3RvcCk7Ci0vLyUgICAgICBpZiAoc3RvcCkgYnJlYWs7Ci0vLyUgICAgfQotLy8lICB9IGVsc2UgaWYgKF9jb3VudCA+IDApIHsKLS8vJSAgICBmb3IgKE5TVUludGVnZXIgaSA9IF9jb3VudDsgaSA+IDA7IC0taSkgewotLy8lICAgICAgYmxvY2soX3ZhbHVlc1tpIC0gMV0sIChpIC0gMSksICZzdG9wKTsKLS8vJSAgICAgIGlmIChzdG9wKSBicmVhazsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJX0KLQotLy8lUERETS1ERUZJTkUgTVVUQVRJT05fSE9PS19Ob25lKCkKLS8vJVBERE0tREVGSU5FIE1VVEFUSU9OX01FVEhPRFMoTkFNRSwgVFlQRSwgQUNDRVNTT1JfTkFNRSwgSE9PS18xLCBIT09LXzIpCi0vLyUtICh2b2lkKWFkZCMjQUNDRVNTT1JfTkFNRSMjVmFsdWU6KFRZUEUpdmFsdWUgewotLy8lICBbc2VsZiBhZGQjI0FDQ0VTU09SX05BTUUjI1ZhbHVlczomdmFsdWUgY291bnQ6MV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpYWRkIyNBQ0NFU1NPUl9OQU1FIyNWYWx1ZXM6KGNvbnN0IFRZUEUgW10pdmFsdWVzIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLS8vJSAgaWYgKHZhbHVlcyA9PSBOVUxMIHx8IGNvdW50ID09IDApIHJldHVybjsKLS8vJU1VVEFUSU9OX0hPT0tfIyNIT09LXzEoKSAgTlNVSW50ZWdlciBpbml0aWFsQ291bnQgPSBfY291bnQ7Ci0vLyUgIE5TVUludGVnZXIgbmV3Q291bnQgPSBpbml0aWFsQ291bnQgKyBjb3VudDsKLS8vJU1BWUJFX0dST1dfVE9fU0VUX0NPVU5UKG5ld0NvdW50KQotLy8lICBtZW1jcHkoJl92YWx1ZXNbaW5pdGlhbENvdW50XSwgdmFsdWVzLCBjb3VudCAqIHNpemVvZihUWVBFKSk7Ci0vLyUgIGlmIChfYXV0b2NyZWF0b3IpIHsKLS8vJSAgICBHUEJBdXRvY3JlYXRlZEFycmF5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLS8vJSAgfQotLy8lfQotLy8lCi0vLyUtICh2b2lkKWluc2VydCMjQUNDRVNTT1JfTkFNRSMjVmFsdWU6KFRZUEUpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0vLyVWQUxJREFURV9SQU5HRShpbmRleCwgX2NvdW50ICsgMSkKLS8vJU1VVEFUSU9OX0hPT0tfIyNIT09LXzIoKSAgTlNVSW50ZWdlciBpbml0aWFsQ291bnQgPSBfY291bnQ7Ci0vLyUgIE5TVUludGVnZXIgbmV3Q291bnQgPSBpbml0aWFsQ291bnQgKyAxOwotLy8lTUFZQkVfR1JPV19UT19TRVRfQ09VTlQobmV3Q291bnQpCi0vLyUgIGlmIChpbmRleCAhPSBpbml0aWFsQ291bnQpIHsKLS8vJSAgICBtZW1tb3ZlKCZfdmFsdWVzW2luZGV4ICsgMV0sICZfdmFsdWVzW2luZGV4XSwgKGluaXRpYWxDb3VudCAtIGluZGV4KSAqIHNpemVvZihUWVBFKSk7Ci0vLyUgIH0KLS8vJSAgX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKLS8vJSAgaWYgKF9hdXRvY3JlYXRvcikgewotLy8lICAgIEdQQkF1dG9jcmVhdGVkQXJyYXlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotLy8lICB9Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpcmVwbGFjZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB3aXRoIyNBQ0NFU1NPUl9OQU1FIyNWYWx1ZTooVFlQRSl2YWx1ZSB7Ci0vLyVWQUxJREFURV9SQU5HRShpbmRleCwgX2NvdW50KQotLy8lTVVUQVRJT05fSE9PS18jI0hPT0tfMigpICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotLy8lfQotCi0vLyVQRERNLURFRklORSBBUlJBWV9NVVRBQkxFX0NPUkUoTkFNRSwgVFlQRSwgQUNDRVNTT1JfTkFNRSwgRk9STUFUKQotLy8lLSAodm9pZClpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6KE5TVUludGVnZXIpbmV3Q2FwYWNpdHkgewotLy8lICBfdmFsdWVzID0gcmVhbGxvY2YoX3ZhbHVlcywgbmV3Q2FwYWNpdHkgKiBzaXplb2YoVFlQRSkpOwotLy8lICBpZiAoX3ZhbHVlcyA9PSBOVUxMKSB7Ci0vLyUgICAgX2NhcGFjaXR5ID0gMDsKLS8vJSAgICBfY291bnQgPSAwOwotLy8lICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU01hbGxvY0V4Y2VwdGlvbgotLy8lICAgICAgICAgICAgICAgIGZvcm1hdDpAIkZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMiLAotLy8lICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykobmV3Q2FwYWNpdHkgKiBzaXplb2YoVFlQRSkpXTsKLS8vJSAgfQotLy8lICBfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLS8vJX0KLS8vJQotLy8lTVVUQVRJT05fTUVUSE9EUyhOQU1FLCBUWVBFLCBBQ0NFU1NPUl9OQU1FLCBOb25lLCBOb25lKQotLy8lCi0vLyUtICh2b2lkKWFkZCMjQUNDRVNTT1JfTkFNRSMjVmFsdWVzRnJvbUFycmF5OihHUEIjI05BTUUjI0FycmF5ICopYXJyYXkgewotLy8lICBbc2VsZiBhZGQjI0FDQ0VTU09SX05BTUUjI1ZhbHVlczphcnJheS0+X3ZhbHVlcyBjb3VudDphcnJheS0+X2NvdW50XTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZClyZW1vdmVWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotLy8lVkFMSURBVEVfUkFOR0UoaW5kZXgsIF9jb3VudCkKLS8vJSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IF9jb3VudCAtIDE7Ci0vLyUgIGlmIChpbmRleCAhPSBuZXdDb3VudCkgewotLy8lICAgIG1lbW1vdmUoJl92YWx1ZXNbaW5kZXhdLCAmX3ZhbHVlc1tpbmRleCArIDFdLCAobmV3Q291bnQgLSBpbmRleCkgKiBzaXplb2YoVFlQRSkpOwotLy8lICB9Ci0vLyVTRVRfQ09VTlRfQU5EX01BWUJFX1NIUklOSyhuZXdDb3VudCkKLS8vJX0KLS8vJQotLy8lLSAodm9pZClyZW1vdmVBbGwgewotLy8lU0VUX0NPVU5UX0FORF9NQVlCRV9TSFJJTksoMCkKLS8vJX0KLS8vJQotLy8lLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0vLyUgICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDIgewotLy8lVkFMSURBVEVfUkFOR0UoaWR4MSwgX2NvdW50KQotLy8lVkFMSURBVEVfUkFOR0UoaWR4MiwgX2NvdW50KQotLy8lICBUWVBFIHRlbXAgPSBfdmFsdWVzW2lkeDFdOwotLy8lICBfdmFsdWVzW2lkeDFdID0gX3ZhbHVlc1tpZHgyXTsKLS8vJSAgX3ZhbHVlc1tpZHgyXSA9IHRlbXA7Ci0vLyV9Ci0vLyUKLQotLy8lUERETS1FWFBBTkQgQVJSQVlfSU5URVJGQUNFX1NJTVBMRShJbnQzMiwgaW50MzJfdCwgJWQpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gSW50MzIKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyQXJyYXkgewotIEBwYWNrYWdlCi0gIGludDMyX3QgKl92YWx1ZXM7Ci0gIE5TVUludGVnZXIgX2NvdW50OwotICBOU1VJbnRlZ2VyIF9jYXBhY2l0eTsKLX0KLQotQHN5bnRoZXNpemUgY291bnQgPSBfY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczogb24gdG8gZ2V0Ci0gIC8vIHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlQXJyYXk6KEdQQkludDMyQXJyYXkgKilhcnJheSB7Ci0gIHJldHVybiBbWyhHUEJJbnQzMkFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZUFycmF5OmFycmF5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgLy8gTm8gd29yayBuZWVkZWQ7Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJJbnQzMkFycmF5ICopYXJyYXkgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6YXJyYXktPl92YWx1ZXMgY291bnQ6YXJyYXktPl9jb3VudF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3NlbGYgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcykgewotICAgICAgX3ZhbHVlcyA9IHJlYWxsb2NmKF92YWx1ZXMsIGNvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgIGlmIChfdmFsdWVzICE9IE5VTEwpIHsKLSAgICAgICAgX2NhcGFjaXR5ID0gY291bnQ7Ci0gICAgICAgIG1lbWNweShfdmFsdWVzLCB2YWx1ZXMsIGNvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgICAgICAgX2NvdW50ID0gY291bnQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbc2VsZiByZWxlYXNlXTsKLSAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TTWFsbG9jRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIkZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGNvdW50ICogc2l6ZW9mKGludDMyX3QpKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZiAmJiBjb3VudCkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpjb3VudF07Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJJbnQzMkFycmF5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhWYWx1ZXM6X3ZhbHVlcyBjb3VudDpfY291bnRdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgZnJlZShfdmFsdWVzKTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDMyQXJyYXkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJJbnQzMkFycmF5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIChfY291bnQgPT0gb3RoZXItPl9jb3VudAotICAgICAgICAgICYmIG1lbWNtcChfdmFsdWVzLCBvdGhlci0+X3ZhbHVlcywgKF9jb3VudCAqIHNpemVvZihpbnQzMl90KSkpID09IDApOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICAvLyBGb2xsb3cgTlNBcnJheSdzIGxlYWQsIGFuZCB1c2UgdGhlIGNvdW50IGFzIHRoZSBoYXNoLgotICByZXR1cm4gX2NvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgTlNNdXRhYmxlU3RyaW5nICpyZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgIiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLSAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwLCBjb3VudCA9IF9jb3VudDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiVkIiwgX3ZhbHVlc1tpXV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiLCAlZCIsIF92YWx1ZXNbaV1dOwotICAgIH0KLSAgfQotICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiB9Il07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczowIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICAvLyBOU0VudW1lcmF0aW9uQ29uY3VycmVudCBpc24ndCBjdXJyZW50bHkgc3VwcG9ydGVkIChhbmQgQXBwbGUncyBkb2NzIHNheSB0aGF0IGlzIG9rKS4KLSAgQk9PTCBzdG9wID0gTk87Ci0gIGlmICgob3B0cyAmIE5TRW51bWVyYXRpb25SZXZlcnNlKSA9PSAwKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwLCBjb3VudCA9IF9jb3VudDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGJsb2NrKF92YWx1ZXNbaV0sIGksICZzdG9wKTsKLSAgICAgIGlmIChzdG9wKSBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoX2NvdW50ID4gMCkgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gX2NvdW50OyBpID4gMDsgLS1pKSB7Ci0gICAgICBibG9jayhfdmFsdWVzW2kgLSAxXSwgKGkgLSAxKSwgJnN0b3ApOwotICAgICAgaWYgKHN0b3ApIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0tIChpbnQzMl90KXZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICByZXR1cm4gX3ZhbHVlc1tpbmRleF07Ci19Ci0KLS0gKHZvaWQpaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OihOU1VJbnRlZ2VyKW5ld0NhcGFjaXR5IHsKLSAgX3ZhbHVlcyA9IHJlYWxsb2NmKF92YWx1ZXMsIG5ld0NhcGFjaXR5ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgaWYgKF92YWx1ZXMgPT0gTlVMTCkgewotICAgIF9jYXBhY2l0eSA9IDA7Ci0gICAgX2NvdW50ID0gMDsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5ld0NhcGFjaXR5ICogc2l6ZW9mKGludDMyX3QpKV07Ci0gIH0KLSAgX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWU6KGludDMyX3QpdmFsdWUgewotICBbc2VsZiBhZGRWYWx1ZXM6JnZhbHVlIGNvdW50OjFdOwotfQotCi0tICh2b2lkKWFkZFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBpZiAodmFsdWVzID09IE5VTEwgfHwgY291bnQgPT0gMCkgcmV0dXJuOwotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIGNvdW50OwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgbWVtY3B5KCZfdmFsdWVzW2luaXRpYWxDb3VudF0sIHZhbHVlcywgY291bnQgKiBzaXplb2YoaW50MzJfdCkpOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClpbnNlcnRWYWx1ZTooaW50MzJfdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCArIDEpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50ICsgMV07Ci0gIH0KLSAgTlNVSW50ZWdlciBpbml0aWFsQ291bnQgPSBfY291bnQ7Ci0gIE5TVUludGVnZXIgbmV3Q291bnQgPSBpbml0aWFsQ291bnQgKyAxOwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgaWYgKGluZGV4ICE9IGluaXRpYWxDb3VudCkgewotICAgIG1lbW1vdmUoJl92YWx1ZXNbaW5kZXggKyAxXSwgJl92YWx1ZXNbaW5kZXhdLCAoaW5pdGlhbENvdW50IC0gaW5kZXgpICogc2l6ZW9mKGludDMyX3QpKTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZSB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotfQotCi0tICh2b2lkKWFkZFZhbHVlc0Zyb21BcnJheTooR1BCSW50MzJBcnJheSAqKWFycmF5IHsKLSAgW3NlbGYgYWRkVmFsdWVzOmFycmF5LT5fdmFsdWVzIGNvdW50OmFycmF5LT5fY291bnRdOwotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBOU1VJbnRlZ2VyIG5ld0NvdW50ID0gX2NvdW50IC0gMTsKLSAgaWYgKGluZGV4ICE9IG5ld0NvdW50KSB7Ci0gICAgbWVtbW92ZSgmX3ZhbHVlc1tpbmRleF0sICZfdmFsdWVzW2luZGV4ICsgMV0sIChuZXdDb3VudCAtIGluZGV4KSAqIHNpemVvZihpbnQzMl90KSk7Ci0gIH0KLSAgX2NvdW50ID0gbmV3Q291bnQ7Ci0gIGlmICgobmV3Q291bnQgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgX2NvdW50ID0gMDsKLSAgaWYgKCgwICsgKDIgKiBrQ2h1bmtTaXplKSkgPCBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQoMCldOwotICB9Ci19Ci0KLS0gKHZvaWQpZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MQotICAgICAgICAgICAgd2l0aFZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgyIHsKLSAgaWYgKGlkeDEgPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaWR4MSwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBpZiAoaWR4MiA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpZHgyLCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIGludDMyX3QgdGVtcCA9IF92YWx1ZXNbaWR4MV07Ci0gIF92YWx1ZXNbaWR4MV0gPSBfdmFsdWVzW2lkeDJdOwotICBfdmFsdWVzW2lkeDJdID0gdGVtcDsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBBUlJBWV9JTlRFUkZBQ0VfU0lNUExFKFVJbnQzMiwgdWludDMyX3QsICV1KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDMyQXJyYXkgewotIEBwYWNrYWdlCi0gIHVpbnQzMl90ICpfdmFsdWVzOwotICBOU1VJbnRlZ2VyIF9jb3VudDsKLSAgTlNVSW50ZWdlciBfY2FwYWNpdHk7Ci19Ci0KLUBzeW50aGVzaXplIGNvdW50ID0gX2NvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWU6KHVpbnQzMl90KXZhbHVlIHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOiBvbiB0byBnZXQKLSAgLy8gdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlQXJyYXk6KEdQQlVJbnQzMkFycmF5ICopYXJyYXkgewotICByZXR1cm4gW1soR1BCVUludDMyQXJyYXkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlQXJyYXk6YXJyYXldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICAvLyBObyB3b3JrIG5lZWRlZDsKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlQXJyYXk6KEdQQlVJbnQzMkFycmF5ICopYXJyYXkgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6YXJyYXktPl92YWx1ZXMgY291bnQ6YXJyYXktPl9jb3VudF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMpIHsKLSAgICAgIF92YWx1ZXMgPSByZWFsbG9jZihfdmFsdWVzLCBjb3VudCAqIHNpemVvZih1aW50MzJfdCkpOwotICAgICAgaWYgKF92YWx1ZXMgIT0gTlVMTCkgewotICAgICAgICBfY2FwYWNpdHkgPSBjb3VudDsKLSAgICAgICAgbWVtY3B5KF92YWx1ZXMsIHZhbHVlcywgY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKLSAgICAgICAgX2NvdW50ID0gY291bnQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbc2VsZiByZWxlYXNlXTsKLSAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TTWFsbG9jRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIkZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGNvdW50ICogc2l6ZW9mKHVpbnQzMl90KSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYgJiYgY291bnQpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Y291bnRdOwotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCVUludDMyQXJyYXkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aFZhbHVlczpfdmFsdWVzIGNvdW50Ol9jb3VudF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBmcmVlKF92YWx1ZXMpOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDMyQXJyYXkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJVSW50MzJBcnJheSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiAoX2NvdW50ID09IG90aGVyLT5fY291bnQKLSAgICAgICAgICAmJiBtZW1jbXAoX3ZhbHVlcywgb3RoZXItPl92YWx1ZXMsIChfY291bnQgKiBzaXplb2YodWludDMyX3QpKSkgPT0gMCk7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIC8vIEZvbGxvdyBOU0FycmF5J3MgbGVhZCwgYW5kIHVzZSB0aGUgY291bnQgYXMgdGhlIGhhc2guCi0gIHJldHVybiBfY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBmb3IgKE5TVUludGVnZXIgaSA9IDAsIGNvdW50ID0gX2NvdW50OyBpIDwgY291bnQ7ICsraSkgewotICAgIGlmIChpID09IDApIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJXUiLCBfdmFsdWVzW2ldXTsKLSAgICB9IGVsc2UgewotICAgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIsICV1IiwgX3ZhbHVlc1tpXV07Ci0gICAgfQotICB9Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6KHZvaWQgKF4pKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczowIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKSh1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgLy8gTlNFbnVtZXJhdGlvbkNvbmN1cnJlbnQgaXNuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCAoYW5kIEFwcGxlJ3MgZG9jcyBzYXkgdGhhdCBpcyBvaykuCi0gIEJPT0wgc3RvcCA9IE5POwotICBpZiAoKG9wdHMgJiBOU0VudW1lcmF0aW9uUmV2ZXJzZSkgPT0gMCkgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMCwgY291bnQgPSBfY291bnQ7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBibG9jayhfdmFsdWVzW2ldLCBpLCAmc3RvcCk7Ci0gICAgICBpZiAoc3RvcCkgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgaWYgKF9jb3VudCA+IDApIHsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IF9jb3VudDsgaSA+IDA7IC0taSkgewotICAgICAgYmxvY2soX3ZhbHVlc1tpIC0gMV0sIChpIC0gMSksICZzdG9wKTsKLSAgICAgIGlmIChzdG9wKSBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLSAodWludDMyX3QpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIHJldHVybiBfdmFsdWVzW2luZGV4XTsKLX0KLQotLSAodm9pZClpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6KE5TVUludGVnZXIpbmV3Q2FwYWNpdHkgewotICBfdmFsdWVzID0gcmVhbGxvY2YoX3ZhbHVlcywgbmV3Q2FwYWNpdHkgKiBzaXplb2YodWludDMyX3QpKTsKLSAgaWYgKF92YWx1ZXMgPT0gTlVMTCkgewotICAgIF9jYXBhY2l0eSA9IDA7Ci0gICAgX2NvdW50ID0gMDsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5ld0NhcGFjaXR5ICogc2l6ZW9mKHVpbnQzMl90KSldOwotICB9Ci0gIF9jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OwotfQotCi0tICh2b2lkKWFkZFZhbHVlOih1aW50MzJfdCl2YWx1ZSB7Ci0gIFtzZWxmIGFkZFZhbHVlczomdmFsdWUgY291bnQ6MV07Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBpZiAodmFsdWVzID09IE5VTEwgfHwgY291bnQgPT0gMCkgcmV0dXJuOwotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIGNvdW50OwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgbWVtY3B5KCZfdmFsdWVzW2luaXRpYWxDb3VudF0sIHZhbHVlcywgY291bnQgKiBzaXplb2YodWludDMyX3QpKTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkQXJyYXlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpaW5zZXJ0VmFsdWU6KHVpbnQzMl90KXZhbHVlIGF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotICBpZiAoaW5kZXggPj0gX2NvdW50ICsgMSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnQgKyAxXTsKLSAgfQotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIDE7Ci0gIGlmIChuZXdDb3VudCA+IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci0gIF9jb3VudCA9IG5ld0NvdW50OwotICBpZiAoaW5kZXggIT0gaW5pdGlhbENvdW50KSB7Ci0gICAgbWVtbW92ZSgmX3ZhbHVlc1tpbmRleCArIDFdLCAmX3ZhbHVlc1tpbmRleF0sIChpbml0aWFsQ291bnQgLSBpbmRleCkgKiBzaXplb2YodWludDMyX3QpKTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZToodWludDMyX3QpdmFsdWUgewotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKLX0KLQotLSAodm9pZClhZGRWYWx1ZXNGcm9tQXJyYXk6KEdQQlVJbnQzMkFycmF5ICopYXJyYXkgewotICBbc2VsZiBhZGRWYWx1ZXM6YXJyYXktPl92YWx1ZXMgY291bnQ6YXJyYXktPl9jb3VudF07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIE5TVUludGVnZXIgbmV3Q291bnQgPSBfY291bnQgLSAxOwotICBpZiAoaW5kZXggIT0gbmV3Q291bnQpIHsKLSAgICBtZW1tb3ZlKCZfdmFsdWVzW2luZGV4XSwgJl92YWx1ZXNbaW5kZXggKyAxXSwgKG5ld0NvdW50IC0gaW5kZXgpICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIH0KLSAgX2NvdW50ID0gbmV3Q291bnQ7Ci0gIGlmICgobmV3Q291bnQgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgX2NvdW50ID0gMDsKLSAgaWYgKCgwICsgKDIgKiBrQ2h1bmtTaXplKSkgPCBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQoMCldOwotICB9Ci19Ci0KLS0gKHZvaWQpZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MQotICAgICAgICAgICAgd2l0aFZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgyIHsKLSAgaWYgKGlkeDEgPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaWR4MSwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBpZiAoaWR4MiA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpZHgyLCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIHVpbnQzMl90IHRlbXAgPSBfdmFsdWVzW2lkeDFdOwotICBfdmFsdWVzW2lkeDFdID0gX3ZhbHVlc1tpZHgyXTsKLSAgX3ZhbHVlc1tpZHgyXSA9IHRlbXA7Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQVJSQVlfSU5URVJGQUNFX1NJTVBMRShJbnQ2NCwgaW50NjRfdCwgJWxsZCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRBcnJheSB7Ci0gQHBhY2thZ2UKLSAgaW50NjRfdCAqX3ZhbHVlczsKLSAgTlNVSW50ZWdlciBfY291bnQ7Ci0gIE5TVUludGVnZXIgX2NhcGFjaXR5OwotfQotCi1Ac3ludGhlc2l6ZSBjb3VudCA9IF9jb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlOihpbnQ2NF90KXZhbHVlIHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOiBvbiB0byBnZXQKLSAgLy8gdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0QXJyYXkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCSW50NjRBcnJheSAqKWFycmF5IHsKLSAgcmV0dXJuIFtbKEdQQkludDY0QXJyYXkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlQXJyYXk6YXJyYXldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICAvLyBObyB3b3JrIG5lZWRlZDsKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlQXJyYXk6KEdQQkludDY0QXJyYXkgKilhcnJheSB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczphcnJheS0+X3ZhbHVlcyBjb3VudDphcnJheS0+X2NvdW50XTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzKSB7Ci0gICAgICBfdmFsdWVzID0gcmVhbGxvY2YoX3ZhbHVlcywgY291bnQgKiBzaXplb2YoaW50NjRfdCkpOwotICAgICAgaWYgKF92YWx1ZXMgIT0gTlVMTCkgewotICAgICAgICBfY2FwYWNpdHkgPSBjb3VudDsKLSAgICAgICAgbWVtY3B5KF92YWx1ZXMsIHZhbHVlcywgY291bnQgKiBzaXplb2YoaW50NjRfdCkpOwotICAgICAgICBfY291bnQgPSBjb3VudDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtzZWxmIHJlbGVhc2VdOwotICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiRmFpbGVkIHRvIGFsbG9jYXRlICVsdSBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoY291bnQgKiBzaXplb2YoaW50NjRfdCkpXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmICYmIGNvdW50KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OmNvdW50XTsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDY0QXJyYXkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aFZhbHVlczpfdmFsdWVzIGNvdW50Ol9jb3VudF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBmcmVlKF92YWx1ZXMpOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCSW50NjRBcnJheSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0QXJyYXkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gKF9jb3VudCA9PSBvdGhlci0+X2NvdW50Ci0gICAgICAgICAgJiYgbWVtY21wKF92YWx1ZXMsIG90aGVyLT5fdmFsdWVzLCAoX2NvdW50ICogc2l6ZW9mKGludDY0X3QpKSkgPT0gMCk7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIC8vIEZvbGxvdyBOU0FycmF5J3MgbGVhZCwgYW5kIHVzZSB0aGUgY291bnQgYXMgdGhlIGhhc2guCi0gIHJldHVybiBfY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBmb3IgKE5TVUludGVnZXIgaSA9IDAsIGNvdW50ID0gX2NvdW50OyBpIDwgY291bnQ7ICsraSkgewotICAgIGlmIChpID09IDApIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJWxsZCIsIF92YWx1ZXNbaV1dOwotICAgIH0gZWxzZSB7Ci0gICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiwgJWxsZCIsIF92YWx1ZXNbaV1dOwotICAgIH0KLSAgfQotICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiB9Il07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczowIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICAvLyBOU0VudW1lcmF0aW9uQ29uY3VycmVudCBpc24ndCBjdXJyZW50bHkgc3VwcG9ydGVkIChhbmQgQXBwbGUncyBkb2NzIHNheSB0aGF0IGlzIG9rKS4KLSAgQk9PTCBzdG9wID0gTk87Ci0gIGlmICgob3B0cyAmIE5TRW51bWVyYXRpb25SZXZlcnNlKSA9PSAwKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwLCBjb3VudCA9IF9jb3VudDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGJsb2NrKF92YWx1ZXNbaV0sIGksICZzdG9wKTsKLSAgICAgIGlmIChzdG9wKSBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoX2NvdW50ID4gMCkgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gX2NvdW50OyBpID4gMDsgLS1pKSB7Ci0gICAgICBibG9jayhfdmFsdWVzW2kgLSAxXSwgKGkgLSAxKSwgJnN0b3ApOwotICAgICAgaWYgKHN0b3ApIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0tIChpbnQ2NF90KXZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICByZXR1cm4gX3ZhbHVlc1tpbmRleF07Ci19Ci0KLS0gKHZvaWQpaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OihOU1VJbnRlZ2VyKW5ld0NhcGFjaXR5IHsKLSAgX3ZhbHVlcyA9IHJlYWxsb2NmKF92YWx1ZXMsIG5ld0NhcGFjaXR5ICogc2l6ZW9mKGludDY0X3QpKTsKLSAgaWYgKF92YWx1ZXMgPT0gTlVMTCkgewotICAgIF9jYXBhY2l0eSA9IDA7Ci0gICAgX2NvdW50ID0gMDsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5ld0NhcGFjaXR5ICogc2l6ZW9mKGludDY0X3QpKV07Ci0gIH0KLSAgX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWU6KGludDY0X3QpdmFsdWUgewotICBbc2VsZiBhZGRWYWx1ZXM6JnZhbHVlIGNvdW50OjFdOwotfQotCi0tICh2b2lkKWFkZFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBpZiAodmFsdWVzID09IE5VTEwgfHwgY291bnQgPT0gMCkgcmV0dXJuOwotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIGNvdW50OwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgbWVtY3B5KCZfdmFsdWVzW2luaXRpYWxDb3VudF0sIHZhbHVlcywgY291bnQgKiBzaXplb2YoaW50NjRfdCkpOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClpbnNlcnRWYWx1ZTooaW50NjRfdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCArIDEpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50ICsgMV07Ci0gIH0KLSAgTlNVSW50ZWdlciBpbml0aWFsQ291bnQgPSBfY291bnQ7Ci0gIE5TVUludGVnZXIgbmV3Q291bnQgPSBpbml0aWFsQ291bnQgKyAxOwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgaWYgKGluZGV4ICE9IGluaXRpYWxDb3VudCkgewotICAgIG1lbW1vdmUoJl92YWx1ZXNbaW5kZXggKyAxXSwgJl92YWx1ZXNbaW5kZXhdLCAoaW5pdGlhbENvdW50IC0gaW5kZXgpICogc2l6ZW9mKGludDY0X3QpKTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZTooaW50NjRfdCl2YWx1ZSB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotfQotCi0tICh2b2lkKWFkZFZhbHVlc0Zyb21BcnJheTooR1BCSW50NjRBcnJheSAqKWFycmF5IHsKLSAgW3NlbGYgYWRkVmFsdWVzOmFycmF5LT5fdmFsdWVzIGNvdW50OmFycmF5LT5fY291bnRdOwotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBOU1VJbnRlZ2VyIG5ld0NvdW50ID0gX2NvdW50IC0gMTsKLSAgaWYgKGluZGV4ICE9IG5ld0NvdW50KSB7Ci0gICAgbWVtbW92ZSgmX3ZhbHVlc1tpbmRleF0sICZfdmFsdWVzW2luZGV4ICsgMV0sIChuZXdDb3VudCAtIGluZGV4KSAqIHNpemVvZihpbnQ2NF90KSk7Ci0gIH0KLSAgX2NvdW50ID0gbmV3Q291bnQ7Ci0gIGlmICgobmV3Q291bnQgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgX2NvdW50ID0gMDsKLSAgaWYgKCgwICsgKDIgKiBrQ2h1bmtTaXplKSkgPCBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQoMCldOwotICB9Ci19Ci0KLS0gKHZvaWQpZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MQotICAgICAgICAgICAgd2l0aFZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgyIHsKLSAgaWYgKGlkeDEgPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaWR4MSwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBpZiAoaWR4MiA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpZHgyLCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIGludDY0X3QgdGVtcCA9IF92YWx1ZXNbaWR4MV07Ci0gIF92YWx1ZXNbaWR4MV0gPSBfdmFsdWVzW2lkeDJdOwotICBfdmFsdWVzW2lkeDJdID0gdGVtcDsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBBUlJBWV9JTlRFUkZBQ0VfU0lNUExFKFVJbnQ2NCwgdWludDY0X3QsICVsbHUpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gVUludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRBcnJheSB7Ci0gQHBhY2thZ2UKLSAgdWludDY0X3QgKl92YWx1ZXM7Ci0gIE5TVUludGVnZXIgX2NvdW50OwotICBOU1VJbnRlZ2VyIF9jYXBhY2l0eTsKLX0KLQotQHN5bnRoZXNpemUgY291bnQgPSBfY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6IG9uIHRvIGdldAotICAvLyB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0QXJyYXkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCVUludDY0QXJyYXkgKilhcnJheSB7Ci0gIHJldHVybiBbWyhHUEJVSW50NjRBcnJheSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVBcnJheTphcnJheV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIC8vIE5vIHdvcmsgbmVlZGVkOwotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVBcnJheTooR1BCVUludDY0QXJyYXkgKilhcnJheSB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczphcnJheS0+X3ZhbHVlcyBjb3VudDphcnJheS0+X2NvdW50XTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3NlbGYgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcykgewotICAgICAgX3ZhbHVlcyA9IHJlYWxsb2NmKF92YWx1ZXMsIGNvdW50ICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gICAgICBpZiAoX3ZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIF9jYXBhY2l0eSA9IGNvdW50OwotICAgICAgICBtZW1jcHkoX3ZhbHVlcywgdmFsdWVzLCBjb3VudCAqIHNpemVvZih1aW50NjRfdCkpOwotICAgICAgICBfY291bnQgPSBjb3VudDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtzZWxmIHJlbGVhc2VdOwotICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiRmFpbGVkIHRvIGFsbG9jYXRlICVsdSBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoY291bnQgKiBzaXplb2YodWludDY0X3QpKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZiAmJiBjb3VudCkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpjb3VudF07Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJVSW50NjRBcnJheSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoVmFsdWVzOl92YWx1ZXMgY291bnQ6X2NvdW50XTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIGZyZWUoX3ZhbHVlcyk7Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJVSW50NjRBcnJheSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEFycmF5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIChfY291bnQgPT0gb3RoZXItPl9jb3VudAotICAgICAgICAgICYmIG1lbWNtcChfdmFsdWVzLCBvdGhlci0+X3ZhbHVlcywgKF9jb3VudCAqIHNpemVvZih1aW50NjRfdCkpKSA9PSAwKTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgLy8gRm9sbG93IE5TQXJyYXkncyBsZWFkLCBhbmQgdXNlIHRoZSBjb3VudCBhcyB0aGUgaGFzaC4KLSAgcmV0dXJuIF9jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIE5TTXV0YWJsZVN0cmluZyAqcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICIsIFtzZWxmIGNsYXNzXSwgc2VsZl07Ci0gIGZvciAoTlNVSW50ZWdlciBpID0gMCwgY291bnQgPSBfY291bnQ7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgaWYgKGkgPT0gMCkgewotICAgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIlbGx1IiwgX3ZhbHVlc1tpXV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiLCAlbGx1IiwgX3ZhbHVlc1tpXV07Ci0gICAgfQotICB9Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6KHZvaWQgKF4pKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczowIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKSh1aW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgLy8gTlNFbnVtZXJhdGlvbkNvbmN1cnJlbnQgaXNuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCAoYW5kIEFwcGxlJ3MgZG9jcyBzYXkgdGhhdCBpcyBvaykuCi0gIEJPT0wgc3RvcCA9IE5POwotICBpZiAoKG9wdHMgJiBOU0VudW1lcmF0aW9uUmV2ZXJzZSkgPT0gMCkgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMCwgY291bnQgPSBfY291bnQ7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBibG9jayhfdmFsdWVzW2ldLCBpLCAmc3RvcCk7Ci0gICAgICBpZiAoc3RvcCkgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgaWYgKF9jb3VudCA+IDApIHsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IF9jb3VudDsgaSA+IDA7IC0taSkgewotICAgICAgYmxvY2soX3ZhbHVlc1tpIC0gMV0sIChpIC0gMSksICZzdG9wKTsKLSAgICAgIGlmIChzdG9wKSBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLSAodWludDY0X3QpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIHJldHVybiBfdmFsdWVzW2luZGV4XTsKLX0KLQotLSAodm9pZClpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6KE5TVUludGVnZXIpbmV3Q2FwYWNpdHkgewotICBfdmFsdWVzID0gcmVhbGxvY2YoX3ZhbHVlcywgbmV3Q2FwYWNpdHkgKiBzaXplb2YodWludDY0X3QpKTsKLSAgaWYgKF92YWx1ZXMgPT0gTlVMTCkgewotICAgIF9jYXBhY2l0eSA9IDA7Ci0gICAgX2NvdW50ID0gMDsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5ld0NhcGFjaXR5ICogc2l6ZW9mKHVpbnQ2NF90KSldOwotICB9Ci0gIF9jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OwotfQotCi0tICh2b2lkKWFkZFZhbHVlOih1aW50NjRfdCl2YWx1ZSB7Ci0gIFtzZWxmIGFkZFZhbHVlczomdmFsdWUgY291bnQ6MV07Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBpZiAodmFsdWVzID09IE5VTEwgfHwgY291bnQgPT0gMCkgcmV0dXJuOwotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIGNvdW50OwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgbWVtY3B5KCZfdmFsdWVzW2luaXRpYWxDb3VudF0sIHZhbHVlcywgY291bnQgKiBzaXplb2YodWludDY0X3QpKTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkQXJyYXlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpaW5zZXJ0VmFsdWU6KHVpbnQ2NF90KXZhbHVlIGF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotICBpZiAoaW5kZXggPj0gX2NvdW50ICsgMSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnQgKyAxXTsKLSAgfQotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIDE7Ci0gIGlmIChuZXdDb3VudCA+IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci0gIF9jb3VudCA9IG5ld0NvdW50OwotICBpZiAoaW5kZXggIT0gaW5pdGlhbENvdW50KSB7Ci0gICAgbWVtbW92ZSgmX3ZhbHVlc1tpbmRleCArIDFdLCAmX3ZhbHVlc1tpbmRleF0sIChpbml0aWFsQ291bnQgLSBpbmRleCkgKiBzaXplb2YodWludDY0X3QpKTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUgewotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKLX0KLQotLSAodm9pZClhZGRWYWx1ZXNGcm9tQXJyYXk6KEdQQlVJbnQ2NEFycmF5ICopYXJyYXkgewotICBbc2VsZiBhZGRWYWx1ZXM6YXJyYXktPl92YWx1ZXMgY291bnQ6YXJyYXktPl9jb3VudF07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIE5TVUludGVnZXIgbmV3Q291bnQgPSBfY291bnQgLSAxOwotICBpZiAoaW5kZXggIT0gbmV3Q291bnQpIHsKLSAgICBtZW1tb3ZlKCZfdmFsdWVzW2luZGV4XSwgJl92YWx1ZXNbaW5kZXggKyAxXSwgKG5ld0NvdW50IC0gaW5kZXgpICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIH0KLSAgX2NvdW50ID0gbmV3Q291bnQ7Ci0gIGlmICgobmV3Q291bnQgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgX2NvdW50ID0gMDsKLSAgaWYgKCgwICsgKDIgKiBrQ2h1bmtTaXplKSkgPCBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQoMCldOwotICB9Ci19Ci0KLS0gKHZvaWQpZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MQotICAgICAgICAgICAgd2l0aFZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgyIHsKLSAgaWYgKGlkeDEgPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaWR4MSwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBpZiAoaWR4MiA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpZHgyLCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIHVpbnQ2NF90IHRlbXAgPSBfdmFsdWVzW2lkeDFdOwotICBfdmFsdWVzW2lkeDFdID0gX3ZhbHVlc1tpZHgyXTsKLSAgX3ZhbHVlc1tpZHgyXSA9IHRlbXA7Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQVJSQVlfSU5URVJGQUNFX1NJTVBMRShGbG9hdCwgZmxvYXQsICVmKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEZsb2F0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJGbG9hdEFycmF5IHsKLSBAcGFja2FnZQotICBmbG9hdCAqX3ZhbHVlczsKLSAgTlNVSW50ZWdlciBfY291bnQ7Ci0gIE5TVUludGVnZXIgX2NhcGFjaXR5OwotfQotCi1Ac3ludGhlc2l6ZSBjb3VudCA9IF9jb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlOihmbG9hdCl2YWx1ZSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczogb24gdG8gZ2V0Ci0gIC8vIHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJGbG9hdEFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlQXJyYXk6KEdQQkZsb2F0QXJyYXkgKilhcnJheSB7Ci0gIHJldHVybiBbWyhHUEJGbG9hdEFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZUFycmF5OmFycmF5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgLy8gTm8gd29yayBuZWVkZWQ7Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJGbG9hdEFycmF5ICopYXJyYXkgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6YXJyYXktPl92YWx1ZXMgY291bnQ6YXJyYXktPl9jb3VudF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMpIHsKLSAgICAgIF92YWx1ZXMgPSByZWFsbG9jZihfdmFsdWVzLCBjb3VudCAqIHNpemVvZihmbG9hdCkpOwotICAgICAgaWYgKF92YWx1ZXMgIT0gTlVMTCkgewotICAgICAgICBfY2FwYWNpdHkgPSBjb3VudDsKLSAgICAgICAgbWVtY3B5KF92YWx1ZXMsIHZhbHVlcywgY291bnQgKiBzaXplb2YoZmxvYXQpKTsKLSAgICAgICAgX2NvdW50ID0gY291bnQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbc2VsZiByZWxlYXNlXTsKLSAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TTWFsbG9jRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIkZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKGNvdW50ICogc2l6ZW9mKGZsb2F0KSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYgJiYgY291bnQpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Y291bnRdOwotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCRmxvYXRBcnJheSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoVmFsdWVzOl92YWx1ZXMgY291bnQ6X2NvdW50XTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIGZyZWUoX3ZhbHVlcyk7Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJGbG9hdEFycmF5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCRmxvYXRBcnJheSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiAoX2NvdW50ID09IG90aGVyLT5fY291bnQKLSAgICAgICAgICAmJiBtZW1jbXAoX3ZhbHVlcywgb3RoZXItPl92YWx1ZXMsIChfY291bnQgKiBzaXplb2YoZmxvYXQpKSkgPT0gMCk7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIC8vIEZvbGxvdyBOU0FycmF5J3MgbGVhZCwgYW5kIHVzZSB0aGUgY291bnQgYXMgdGhlIGhhc2guCi0gIHJldHVybiBfY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBmb3IgKE5TVUludGVnZXIgaSA9IDAsIGNvdW50ID0gX2NvdW50OyBpIDwgY291bnQ7ICsraSkgewotICAgIGlmIChpID09IDApIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJWYiLCBfdmFsdWVzW2ldXTsKLSAgICB9IGVsc2UgewotICAgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIsICVmIiwgX3ZhbHVlc1tpXV07Ci0gICAgfQotICB9Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6KHZvaWQgKF4pKGZsb2F0IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczowIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShmbG9hdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgLy8gTlNFbnVtZXJhdGlvbkNvbmN1cnJlbnQgaXNuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCAoYW5kIEFwcGxlJ3MgZG9jcyBzYXkgdGhhdCBpcyBvaykuCi0gIEJPT0wgc3RvcCA9IE5POwotICBpZiAoKG9wdHMgJiBOU0VudW1lcmF0aW9uUmV2ZXJzZSkgPT0gMCkgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMCwgY291bnQgPSBfY291bnQ7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBibG9jayhfdmFsdWVzW2ldLCBpLCAmc3RvcCk7Ci0gICAgICBpZiAoc3RvcCkgYnJlYWs7Ci0gICAgfQotICB9IGVsc2UgaWYgKF9jb3VudCA+IDApIHsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IF9jb3VudDsgaSA+IDA7IC0taSkgewotICAgICAgYmxvY2soX3ZhbHVlc1tpIC0gMV0sIChpIC0gMSksICZzdG9wKTsKLSAgICAgIGlmIChzdG9wKSBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLSAoZmxvYXQpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIHJldHVybiBfdmFsdWVzW2luZGV4XTsKLX0KLQotLSAodm9pZClpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6KE5TVUludGVnZXIpbmV3Q2FwYWNpdHkgewotICBfdmFsdWVzID0gcmVhbGxvY2YoX3ZhbHVlcywgbmV3Q2FwYWNpdHkgKiBzaXplb2YoZmxvYXQpKTsKLSAgaWYgKF92YWx1ZXMgPT0gTlVMTCkgewotICAgIF9jYXBhY2l0eSA9IDA7Ci0gICAgX2NvdW50ID0gMDsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5ld0NhcGFjaXR5ICogc2l6ZW9mKGZsb2F0KSldOwotICB9Ci0gIF9jYXBhY2l0eSA9IG5ld0NhcGFjaXR5OwotfQotCi0tICh2b2lkKWFkZFZhbHVlOihmbG9hdCl2YWx1ZSB7Ci0gIFtzZWxmIGFkZFZhbHVlczomdmFsdWUgY291bnQ6MV07Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCBmbG9hdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBpZiAodmFsdWVzID09IE5VTEwgfHwgY291bnQgPT0gMCkgcmV0dXJuOwotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIGNvdW50OwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgbWVtY3B5KCZfdmFsdWVzW2luaXRpYWxDb3VudF0sIHZhbHVlcywgY291bnQgKiBzaXplb2YoZmxvYXQpKTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkQXJyYXlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpaW5zZXJ0VmFsdWU6KGZsb2F0KXZhbHVlIGF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotICBpZiAoaW5kZXggPj0gX2NvdW50ICsgMSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnQgKyAxXTsKLSAgfQotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIDE7Ci0gIGlmIChuZXdDb3VudCA+IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci0gIF9jb3VudCA9IG5ld0NvdW50OwotICBpZiAoaW5kZXggIT0gaW5pdGlhbENvdW50KSB7Ci0gICAgbWVtbW92ZSgmX3ZhbHVlc1tpbmRleCArIDFdLCAmX3ZhbHVlc1tpbmRleF0sIChpbml0aWFsQ291bnQgLSBpbmRleCkgKiBzaXplb2YoZmxvYXQpKTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZTooZmxvYXQpdmFsdWUgewotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKLX0KLQotLSAodm9pZClhZGRWYWx1ZXNGcm9tQXJyYXk6KEdQQkZsb2F0QXJyYXkgKilhcnJheSB7Ci0gIFtzZWxmIGFkZFZhbHVlczphcnJheS0+X3ZhbHVlcyBjb3VudDphcnJheS0+X2NvdW50XTsKLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IF9jb3VudCAtIDE7Ci0gIGlmIChpbmRleCAhPSBuZXdDb3VudCkgewotICAgIG1lbW1vdmUoJl92YWx1ZXNbaW5kZXhdLCAmX3ZhbHVlc1tpbmRleCArIDFdLCAobmV3Q291bnQgLSBpbmRleCkgKiBzaXplb2YoZmxvYXQpKTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgaWYgKChuZXdDb3VudCArICgyICoga0NodW5rU2l6ZSkpIDwgX2NhcGFjaXR5KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OkNhcGFjaXR5RnJvbUNvdW50KG5ld0NvdW50KV07Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBfY291bnQgPSAwOwotICBpZiAoKDAgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudCgwKV07Ci0gIH0KLX0KLQotLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0gICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDIgewotICBpZiAoaWR4MSA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpZHgxLCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIGlmIChpZHgyID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWlkeDIsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgZmxvYXQgdGVtcCA9IF92YWx1ZXNbaWR4MV07Ci0gIF92YWx1ZXNbaWR4MV0gPSBfdmFsdWVzW2lkeDJdOwotICBfdmFsdWVzW2lkeDJdID0gdGVtcDsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBBUlJBWV9JTlRFUkZBQ0VfU0lNUExFKERvdWJsZSwgZG91YmxlLCAlbGYpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gRG91YmxlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJEb3VibGVBcnJheSB7Ci0gQHBhY2thZ2UKLSAgZG91YmxlICpfdmFsdWVzOwotICBOU1VJbnRlZ2VyIF9jb3VudDsKLSAgTlNVSW50ZWdlciBfY2FwYWNpdHk7Ci19Ci0KLUBzeW50aGVzaXplIGNvdW50ID0gX2NvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWU6KGRvdWJsZSl2YWx1ZSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczogb24gdG8gZ2V0Ci0gIC8vIHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJEb3VibGVBcnJheSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZSBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZUFycmF5OihHUEJEb3VibGVBcnJheSAqKWFycmF5IHsKLSAgcmV0dXJuIFtbKEdQQkRvdWJsZUFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZUFycmF5OmFycmF5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgLy8gTm8gd29yayBuZWVkZWQ7Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJEb3VibGVBcnJheSAqKWFycmF5IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOmFycmF5LT5fdmFsdWVzIGNvdW50OmFycmF5LT5fY291bnRdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3NlbGYgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcykgewotICAgICAgX3ZhbHVlcyA9IHJlYWxsb2NmKF92YWx1ZXMsIGNvdW50ICogc2l6ZW9mKGRvdWJsZSkpOwotICAgICAgaWYgKF92YWx1ZXMgIT0gTlVMTCkgewotICAgICAgICBfY2FwYWNpdHkgPSBjb3VudDsKLSAgICAgICAgbWVtY3B5KF92YWx1ZXMsIHZhbHVlcywgY291bnQgKiBzaXplb2YoZG91YmxlKSk7Ci0gICAgICAgIF9jb3VudCA9IGNvdW50OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgW3NlbGYgcmVsZWFzZV07Ci0gICAgICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU01hbGxvY0V4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKShjb3VudCAqIHNpemVvZihkb3VibGUpKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZiAmJiBjb3VudCkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpjb3VudF07Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJEb3VibGVBcnJheSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoVmFsdWVzOl92YWx1ZXMgY291bnQ6X2NvdW50XTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIGZyZWUoX3ZhbHVlcyk7Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJEb3VibGVBcnJheSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkRvdWJsZUFycmF5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIChfY291bnQgPT0gb3RoZXItPl9jb3VudAotICAgICAgICAgICYmIG1lbWNtcChfdmFsdWVzLCBvdGhlci0+X3ZhbHVlcywgKF9jb3VudCAqIHNpemVvZihkb3VibGUpKSkgPT0gMCk7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIC8vIEZvbGxvdyBOU0FycmF5J3MgbGVhZCwgYW5kIHVzZSB0aGUgY291bnQgYXMgdGhlIGhhc2guCi0gIHJldHVybiBfY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBmb3IgKE5TVUludGVnZXIgaSA9IDAsIGNvdW50ID0gX2NvdW50OyBpIDwgY291bnQ7ICsraSkgewotICAgIGlmIChpID09IDApIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJWxmIiwgX3ZhbHVlc1tpXV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiLCAlbGYiLCBfdmFsdWVzW2ldXTsKLSAgICB9Ci0gIH0KLSAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIgfSJdOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazoodm9pZCAoXikoZG91YmxlIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczowIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShkb3VibGUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jayB7Ci0gIC8vIE5TRW51bWVyYXRpb25Db25jdXJyZW50IGlzbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgKGFuZCBBcHBsZSdzIGRvY3Mgc2F5IHRoYXQgaXMgb2spLgotICBCT09MIHN0b3AgPSBOTzsKLSAgaWYgKChvcHRzICYgTlNFbnVtZXJhdGlvblJldmVyc2UpID09IDApIHsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IDAsIGNvdW50ID0gX2NvdW50OyBpIDwgY291bnQ7ICsraSkgewotICAgICAgYmxvY2soX3ZhbHVlc1tpXSwgaSwgJnN0b3ApOwotICAgICAgaWYgKHN0b3ApIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIGlmIChfY291bnQgPiAwKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSBfY291bnQ7IGkgPiAwOyAtLWkpIHsKLSAgICAgIGJsb2NrKF92YWx1ZXNbaSAtIDFdLCAoaSAtIDEpLCAmc3RvcCk7Ci0gICAgICBpZiAoc3RvcCkgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS0gKGRvdWJsZSl2YWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgcmV0dXJuIF92YWx1ZXNbaW5kZXhdOwotfQotCi0tICh2b2lkKWludGVybmFsUmVzaXplVG9DYXBhY2l0eTooTlNVSW50ZWdlciluZXdDYXBhY2l0eSB7Ci0gIF92YWx1ZXMgPSByZWFsbG9jZihfdmFsdWVzLCBuZXdDYXBhY2l0eSAqIHNpemVvZihkb3VibGUpKTsKLSAgaWYgKF92YWx1ZXMgPT0gTlVMTCkgewotICAgIF9jYXBhY2l0eSA9IDA7Ci0gICAgX2NvdW50ID0gMDsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5ld0NhcGFjaXR5ICogc2l6ZW9mKGRvdWJsZSkpXTsKLSAgfQotICBfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLX0KLQotLSAodm9pZClhZGRWYWx1ZTooZG91YmxlKXZhbHVlIHsKLSAgW3NlbGYgYWRkVmFsdWVzOiZ2YWx1ZSBjb3VudDoxXTsKLX0KLQotLSAodm9pZClhZGRWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBpZiAodmFsdWVzID09IE5VTEwgfHwgY291bnQgPT0gMCkgcmV0dXJuOwotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIGNvdW50OwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgbWVtY3B5KCZfdmFsdWVzW2luaXRpYWxDb3VudF0sIHZhbHVlcywgY291bnQgKiBzaXplb2YoZG91YmxlKSk7Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZEFycmF5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKWluc2VydFZhbHVlOihkb3VibGUpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQgKyAxKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudCArIDFdOwotICB9Ci0gIE5TVUludGVnZXIgaW5pdGlhbENvdW50ID0gX2NvdW50OwotICBOU1VJbnRlZ2VyIG5ld0NvdW50ID0gaW5pdGlhbENvdW50ICsgMTsKLSAgaWYgKG5ld0NvdW50ID4gX2NhcGFjaXR5KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OkNhcGFjaXR5RnJvbUNvdW50KG5ld0NvdW50KV07Ci0gIH0KLSAgX2NvdW50ID0gbmV3Q291bnQ7Ci0gIGlmIChpbmRleCAhPSBpbml0aWFsQ291bnQpIHsKLSAgICBtZW1tb3ZlKCZfdmFsdWVzW2luZGV4ICsgMV0sICZfdmFsdWVzW2luZGV4XSwgKGluaXRpYWxDb3VudCAtIGluZGV4KSAqIHNpemVvZihkb3VibGUpKTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhWYWx1ZTooZG91YmxlKXZhbHVlIHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIF92YWx1ZXNbaW5kZXhdID0gdmFsdWU7Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWVzRnJvbUFycmF5OihHUEJEb3VibGVBcnJheSAqKWFycmF5IHsKLSAgW3NlbGYgYWRkVmFsdWVzOmFycmF5LT5fdmFsdWVzIGNvdW50OmFycmF5LT5fY291bnRdOwotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBOU1VJbnRlZ2VyIG5ld0NvdW50ID0gX2NvdW50IC0gMTsKLSAgaWYgKGluZGV4ICE9IG5ld0NvdW50KSB7Ci0gICAgbWVtbW92ZSgmX3ZhbHVlc1tpbmRleF0sICZfdmFsdWVzW2luZGV4ICsgMV0sIChuZXdDb3VudCAtIGluZGV4KSAqIHNpemVvZihkb3VibGUpKTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgaWYgKChuZXdDb3VudCArICgyICoga0NodW5rU2l6ZSkpIDwgX2NhcGFjaXR5KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OkNhcGFjaXR5RnJvbUNvdW50KG5ld0NvdW50KV07Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBfY291bnQgPSAwOwotICBpZiAoKDAgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudCgwKV07Ci0gIH0KLX0KLQotLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0gICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDIgewotICBpZiAoaWR4MSA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpZHgxLCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIGlmIChpZHgyID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWlkeDIsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgZG91YmxlIHRlbXAgPSBfdmFsdWVzW2lkeDFdOwotICBfdmFsdWVzW2lkeDFdID0gX3ZhbHVlc1tpZHgyXTsKLSAgX3ZhbHVlc1tpZHgyXSA9IHRlbXA7Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQVJSQVlfSU5URVJGQUNFX1NJTVBMRShCb29sLCBCT09MLCAlZCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBCb29sCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sQXJyYXkgewotIEBwYWNrYWdlCi0gIEJPT0wgKl92YWx1ZXM7Ci0gIE5TVUludGVnZXIgX2NvdW50OwotICBOU1VJbnRlZ2VyIF9jYXBhY2l0eTsKLX0KLQotQHN5bnRoZXNpemUgY291bnQgPSBfY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWx1ZTooQk9PTCl2YWx1ZSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczogb24gdG8gZ2V0Ci0gIC8vIHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sQXJyYXkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCQm9vbEFycmF5ICopYXJyYXkgewotICByZXR1cm4gW1soR1BCQm9vbEFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZUFycmF5OmFycmF5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgLy8gTm8gd29yayBuZWVkZWQ7Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZUFycmF5OihHUEJCb29sQXJyYXkgKilhcnJheSB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczphcnJheS0+X3ZhbHVlcyBjb3VudDphcnJheS0+X2NvdW50XTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzKSB7Ci0gICAgICBfdmFsdWVzID0gcmVhbGxvY2YoX3ZhbHVlcywgY291bnQgKiBzaXplb2YoQk9PTCkpOwotICAgICAgaWYgKF92YWx1ZXMgIT0gTlVMTCkgewotICAgICAgICBfY2FwYWNpdHkgPSBjb3VudDsKLSAgICAgICAgbWVtY3B5KF92YWx1ZXMsIHZhbHVlcywgY291bnQgKiBzaXplb2YoQk9PTCkpOwotICAgICAgICBfY291bnQgPSBjb3VudDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtzZWxmIHJlbGVhc2VdOwotICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiRmFpbGVkIHRvIGFsbG9jYXRlICVsdSBieXRlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykoY291bnQgKiBzaXplb2YoQk9PTCkpXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmICYmIGNvdW50KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OmNvdW50XTsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkJvb2xBcnJheSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoVmFsdWVzOl92YWx1ZXMgY291bnQ6X2NvdW50XTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIGZyZWUoX3ZhbHVlcyk7Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJCb29sQXJyYXkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJCb29sQXJyYXkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gKF9jb3VudCA9PSBvdGhlci0+X2NvdW50Ci0gICAgICAgICAgJiYgbWVtY21wKF92YWx1ZXMsIG90aGVyLT5fdmFsdWVzLCAoX2NvdW50ICogc2l6ZW9mKEJPT0wpKSkgPT0gMCk7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIC8vIEZvbGxvdyBOU0FycmF5J3MgbGVhZCwgYW5kIHVzZSB0aGUgY291bnQgYXMgdGhlIGhhc2guCi0gIHJldHVybiBfY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBmb3IgKE5TVUludGVnZXIgaSA9IDAsIGNvdW50ID0gX2NvdW50OyBpIDwgY291bnQ7ICsraSkgewotICAgIGlmIChpID09IDApIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJWQiLCBfdmFsdWVzW2ldXTsKLSAgICB9IGVsc2UgewotICAgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIsICVkIiwgX3ZhbHVlc1tpXV07Ci0gICAgfQotICB9Ci0gIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6KHZvaWQgKF4pKEJPT0wgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOjAgdXNpbmdCbG9jazpibG9ja107Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6KE5TRW51bWVyYXRpb25PcHRpb25zKW9wdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6KHZvaWQgKF4pKEJPT0wgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jayB7Ci0gIC8vIE5TRW51bWVyYXRpb25Db25jdXJyZW50IGlzbid0IGN1cnJlbnRseSBzdXBwb3J0ZWQgKGFuZCBBcHBsZSdzIGRvY3Mgc2F5IHRoYXQgaXMgb2spLgotICBCT09MIHN0b3AgPSBOTzsKLSAgaWYgKChvcHRzICYgTlNFbnVtZXJhdGlvblJldmVyc2UpID09IDApIHsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IDAsIGNvdW50ID0gX2NvdW50OyBpIDwgY291bnQ7ICsraSkgewotICAgICAgYmxvY2soX3ZhbHVlc1tpXSwgaSwgJnN0b3ApOwotICAgICAgaWYgKHN0b3ApIGJyZWFrOwotICAgIH0KLSAgfSBlbHNlIGlmIChfY291bnQgPiAwKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSBfY291bnQ7IGkgPiAwOyAtLWkpIHsKLSAgICAgIGJsb2NrKF92YWx1ZXNbaSAtIDFdLCAoaSAtIDEpLCAmc3RvcCk7Ci0gICAgICBpZiAoc3RvcCkgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS0gKEJPT0wpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIHJldHVybiBfdmFsdWVzW2luZGV4XTsKLX0KLQotLSAodm9pZClpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6KE5TVUludGVnZXIpbmV3Q2FwYWNpdHkgewotICBfdmFsdWVzID0gcmVhbGxvY2YoX3ZhbHVlcywgbmV3Q2FwYWNpdHkgKiBzaXplb2YoQk9PTCkpOwotICBpZiAoX3ZhbHVlcyA9PSBOVUxMKSB7Ci0gICAgX2NhcGFjaXR5ID0gMDsKLSAgICBfY291bnQgPSAwOwotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU01hbGxvY0V4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkZhaWxlZCB0byBhbGxvY2F0ZSAlbHUgYnl0ZXMiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykobmV3Q2FwYWNpdHkgKiBzaXplb2YoQk9PTCkpXTsKLSAgfQotICBfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKLX0KLQotLSAodm9pZClhZGRWYWx1ZTooQk9PTCl2YWx1ZSB7Ci0gIFtzZWxmIGFkZFZhbHVlczomdmFsdWUgY291bnQ6MV07Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcyBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIGlmICh2YWx1ZXMgPT0gTlVMTCB8fCBjb3VudCA9PSAwKSByZXR1cm47Ci0gIE5TVUludGVnZXIgaW5pdGlhbENvdW50ID0gX2NvdW50OwotICBOU1VJbnRlZ2VyIG5ld0NvdW50ID0gaW5pdGlhbENvdW50ICsgY291bnQ7Ci0gIGlmIChuZXdDb3VudCA+IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci0gIF9jb3VudCA9IG5ld0NvdW50OwotICBtZW1jcHkoJl92YWx1ZXNbaW5pdGlhbENvdW50XSwgdmFsdWVzLCBjb3VudCAqIHNpemVvZihCT09MKSk7Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZEFycmF5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKWluc2VydFZhbHVlOihCT09MKXZhbHVlIGF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotICBpZiAoaW5kZXggPj0gX2NvdW50ICsgMSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnQgKyAxXTsKLSAgfQotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIDE7Ci0gIGlmIChuZXdDb3VudCA+IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudChuZXdDb3VudCldOwotICB9Ci0gIF9jb3VudCA9IG5ld0NvdW50OwotICBpZiAoaW5kZXggIT0gaW5pdGlhbENvdW50KSB7Ci0gICAgbWVtbW92ZSgmX3ZhbHVlc1tpbmRleCArIDFdLCAmX3ZhbHVlc1tpbmRleF0sIChpbml0aWFsQ291bnQgLSBpbmRleCkgKiBzaXplb2YoQk9PTCkpOwotICB9Ci0gIF92YWx1ZXNbaW5kZXhdID0gdmFsdWU7Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZEFycmF5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlcGxhY2VWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggd2l0aFZhbHVlOihCT09MKXZhbHVlIHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIF92YWx1ZXNbaW5kZXhdID0gdmFsdWU7Ci19Ci0KLS0gKHZvaWQpYWRkVmFsdWVzRnJvbUFycmF5OihHUEJCb29sQXJyYXkgKilhcnJheSB7Ci0gIFtzZWxmIGFkZFZhbHVlczphcnJheS0+X3ZhbHVlcyBjb3VudDphcnJheS0+X2NvdW50XTsKLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaW5kZXggewotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IF9jb3VudCAtIDE7Ci0gIGlmIChpbmRleCAhPSBuZXdDb3VudCkgewotICAgIG1lbW1vdmUoJl92YWx1ZXNbaW5kZXhdLCAmX3ZhbHVlc1tpbmRleCArIDFdLCAobmV3Q291bnQgLSBpbmRleCkgKiBzaXplb2YoQk9PTCkpOwotICB9Ci0gIF9jb3VudCA9IG5ld0NvdW50OwotICBpZiAoKG5ld0NvdW50ICsgKDIgKiBrQ2h1bmtTaXplKSkgPCBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIF9jb3VudCA9IDA7Ci0gIGlmICgoMCArICgyICoga0NodW5rU2l6ZSkpIDwgX2NhcGFjaXR5KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OkNhcGFjaXR5RnJvbUNvdW50KDApXTsKLSAgfQotfQotCi0tICh2b2lkKWV4Y2hhbmdlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDEKLSAgICAgICAgICAgIHdpdGhWYWx1ZUF0SW5kZXg6KE5TVUludGVnZXIpaWR4MiB7Ci0gIGlmIChpZHgxID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWlkeDEsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgaWYgKGlkeDIgPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaWR4MiwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBCT09MIHRlbXAgPSBfdmFsdWVzW2lkeDFdOwotICBfdmFsdWVzW2lkeDFdID0gX3ZhbHVlc1tpZHgyXTsKLSAgX3ZhbHVlc1tpZHgyXSA9IHRlbXA7Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQtRU5EICg3IGV4cGFuc2lvbnMpCi0KLSNwcmFnbWEgbWFyayAtIEVudW0KLQotQGltcGxlbWVudGF0aW9uIEdQQkVudW1BcnJheSB7Ci0gQHBhY2thZ2UKLSAgR1BCRW51bVZhbGlkYXRpb25GdW5jIF92YWxpZGF0aW9uRnVuYzsKLSAgaW50MzJfdCAqX3ZhbHVlczsKLSAgTlNVSW50ZWdlciBfY291bnQ7Ci0gIE5TVUludGVnZXIgX2NhcGFjaXR5OwotfQotCi1Ac3ludGhlc2l6ZSBjb3VudCA9IF9jb3VudDsKLUBzeW50aGVzaXplIHZhbGlkYXRpb25GdW5jID0gX3ZhbGlkYXRpb25GdW5jOwotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246TlVMTF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOihpbnQzMl90KXZhbHVlIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWVBcnJheTooR1BCRW51bUFycmF5ICopYXJyYXkgewotICByZXR1cm4gW1soR1BCRW51bUFycmF5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZUFycmF5OmFycmF5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgY2FwYWNpdHk6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246TlVMTF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlQXJyYXk6KEdQQkVudW1BcnJheSAqKWFycmF5IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmFycmF5LT5fdmFsaWRhdGlvbkZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmFycmF5LT5fdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDphcnJheS0+X2NvdW50XTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYyB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX3ZhbGlkYXRpb25GdW5jID0gKGZ1bmMgIT0gTlVMTCA/IGZ1bmMgOiBBcnJheURlZmF1bHRfSXNWYWxpZFZhbHVlKTsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmNdOwotICBpZiAoc2VsZikgewotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMpIHsKLSAgICAgIF92YWx1ZXMgPSByZWFsbG9jZihfdmFsdWVzLCBjb3VudCAqIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICBpZiAoX3ZhbHVlcyAhPSBOVUxMKSB7Ci0gICAgICAgIF9jYXBhY2l0eSA9IGNvdW50OwotICAgICAgICBtZW1jcHkoX3ZhbHVlcywgdmFsdWVzLCBjb3VudCAqIHNpemVvZihpbnQzMl90KSk7Ci0gICAgICAgIF9jb3VudCA9IGNvdW50OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgW3NlbGYgcmVsZWFzZV07Ci0gICAgICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU01hbGxvY0V4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKShjb3VudCAqIHNpemVvZihpbnQzMl90KSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmNdOwotICBpZiAoc2VsZiAmJiBjb3VudCkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpjb3VudF07Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJFbnVtQXJyYXkgYWxsb2NXaXRoWm9uZTp6b25lXQotICAgICAgICAgICAgIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOl92YWxpZGF0aW9uRnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOl92YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpfY291bnRdOwotfQotCi0vLyVQRERNLUVYUEFORCBBUlJBWV9JTU1VVEFCTEVfQ09SRShFbnVtLCBpbnQzMl90LCBSYXcsICVkKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBmcmVlKF92YWx1ZXMpOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCRW51bUFycmF5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCRW51bUFycmF5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIChfY291bnQgPT0gb3RoZXItPl9jb3VudAotICAgICAgICAgICYmIG1lbWNtcChfdmFsdWVzLCBvdGhlci0+X3ZhbHVlcywgKF9jb3VudCAqIHNpemVvZihpbnQzMl90KSkpID09IDApOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICAvLyBGb2xsb3cgTlNBcnJheSdzIGxlYWQsIGFuZCB1c2UgdGhlIGNvdW50IGFzIHRoZSBoYXNoLgotICByZXR1cm4gX2NvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgTlNNdXRhYmxlU3RyaW5nICpyZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgIiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLSAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwLCBjb3VudCA9IF9jb3VudDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBpZiAoaSA9PSAwKSB7Ci0gICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiVkIiwgX3ZhbHVlc1tpXV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiLCAlZCIsIF92YWx1ZXNbaV1dOwotICAgIH0KLSAgfQotICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiB9Il07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlUmF3VmFsdWVzV2l0aEJsb2NrOih2b2lkICheKShpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVSYXdWYWx1ZXNXaXRoT3B0aW9uczowIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVJhd1ZhbHVlc1dpdGhPcHRpb25zOihOU0VudW1lcmF0aW9uT3B0aW9ucylvcHRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICAvLyBOU0VudW1lcmF0aW9uQ29uY3VycmVudCBpc24ndCBjdXJyZW50bHkgc3VwcG9ydGVkIChhbmQgQXBwbGUncyBkb2NzIHNheSB0aGF0IGlzIG9rKS4KLSAgQk9PTCBzdG9wID0gTk87Ci0gIGlmICgob3B0cyAmIE5TRW51bWVyYXRpb25SZXZlcnNlKSA9PSAwKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwLCBjb3VudCA9IF9jb3VudDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGJsb2NrKF92YWx1ZXNbaV0sIGksICZzdG9wKTsKLSAgICAgIGlmIChzdG9wKSBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoX2NvdW50ID4gMCkgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gX2NvdW50OyBpID4gMDsgLS1pKSB7Ci0gICAgICBibG9jayhfdmFsdWVzW2kgLSAxXSwgKGkgLSAxKSwgJnN0b3ApOwotICAgICAgaWYgKHN0b3ApIGJyZWFrOwotICAgIH0KLSAgfQotfQotLy8lUERETS1FWFBBTkQtRU5EIEFSUkFZX0lNTVVUQUJMRV9DT1JFKEVudW0sIGludDMyX3QsIFJhdywgJWQpCi0KLS0gKGludDMyX3QpdmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLS8vJVBERE0tRVhQQU5EIFZBTElEQVRFX1JBTkdFKGluZGV4LCBfY291bnQpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLS8vJVBERE0tRVhQQU5ELUVORCBWQUxJREFURV9SQU5HRShpbmRleCwgX2NvdW50KQotICBpbnQzMl90IHJlc3VsdCA9IF92YWx1ZXNbaW5kZXhdOwotICBpZiAoIV92YWxpZGF0aW9uRnVuYyhyZXN1bHQpKSB7Ci0gICAgcmVzdWx0ID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0tIChpbnQzMl90KXJhd1ZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0vLyVQRERNLUVYUEFORCBWQUxJREFURV9SQU5HRShpbmRleCwgX2NvdW50KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0vLyVQRERNLUVYUEFORC1FTkQgVkFMSURBVEVfUkFOR0UoaW5kZXgsIF9jb3VudCkKLSAgcmV0dXJuIF92YWx1ZXNbaW5kZXhdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazoodm9pZCAoXikoaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6MCB1c2luZ0Jsb2NrOmJsb2NrXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczooTlNFbnVtZXJhdGlvbk9wdGlvbnMpb3B0cwotICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazoodm9pZCAoXikoaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgLy8gTlNFbnVtZXJhdGlvbkNvbmN1cnJlbnQgaXNuJ3QgY3VycmVudGx5IHN1cHBvcnRlZCAoYW5kIEFwcGxlJ3MgZG9jcyBzYXkgdGhhdCBpcyBvaykuCi0gIEJPT0wgc3RvcCA9IE5POwotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZnVuYyA9IF92YWxpZGF0aW9uRnVuYzsKLSAgaWYgKChvcHRzICYgTlNFbnVtZXJhdGlvblJldmVyc2UpID09IDApIHsKLSAgICBpbnQzMl90ICpzY2FuID0gX3ZhbHVlczsKLSAgICBpbnQzMl90ICplbmQgPSBzY2FuICsgX2NvdW50OwotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgc2NhbiA8IGVuZDsgKytpLCArK3NjYW4pIHsKLSAgICAgIGludDMyX3QgdmFsdWUgPSAqc2NhbjsKLSAgICAgIGlmICghZnVuYyh2YWx1ZSkpIHsKLSAgICAgICAgdmFsdWUgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotICAgICAgfQotICAgICAgYmxvY2sodmFsdWUsIGksICZzdG9wKTsKLSAgICAgIGlmIChzdG9wKSBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoX2NvdW50ID4gMCkgewotICAgIGludDMyX3QgKmVuZCA9IF92YWx1ZXM7Ci0gICAgaW50MzJfdCAqc2NhbiA9IGVuZCArIChfY291bnQgLSAxKTsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IChfY291bnQgLSAxKTsgc2NhbiA+PSBlbmQ7IC0taSwgLS1zY2FuKSB7Ci0gICAgICBpbnQzMl90IHZhbHVlID0gKnNjYW47Ci0gICAgICBpZiAoIWZ1bmModmFsdWUpKSB7Ci0gICAgICAgIHZhbHVlID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLSAgICAgIH0KLSAgICAgIGJsb2NrKHZhbHVlLCBpLCAmc3RvcCk7Ci0gICAgICBpZiAoc3RvcCkgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8vJVBERE0tRVhQQU5EIEFSUkFZX01VVEFCTEVfQ09SRShFbnVtLCBpbnQzMl90LCBSYXcsICVkKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OihOU1VJbnRlZ2VyKW5ld0NhcGFjaXR5IHsKLSAgX3ZhbHVlcyA9IHJlYWxsb2NmKF92YWx1ZXMsIG5ld0NhcGFjaXR5ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgaWYgKF92YWx1ZXMgPT0gTlVMTCkgewotICAgIF9jYXBhY2l0eSA9IDA7Ci0gICAgX2NvdW50ID0gMDsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNNYWxsb2NFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJGYWlsZWQgdG8gYWxsb2NhdGUgJWx1IGJ5dGVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpKG5ld0NhcGFjaXR5ICogc2l6ZW9mKGludDMyX3QpKV07Ci0gIH0KLSAgX2NhcGFjaXR5ID0gbmV3Q2FwYWNpdHk7Ci19Ci0KLS0gKHZvaWQpYWRkUmF3VmFsdWU6KGludDMyX3QpdmFsdWUgewotICBbc2VsZiBhZGRSYXdWYWx1ZXM6JnZhbHVlIGNvdW50OjFdOwotfQotCi0tICh2b2lkKWFkZFJhd1ZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBpZiAodmFsdWVzID09IE5VTEwgfHwgY291bnQgPT0gMCkgcmV0dXJuOwotICBOU1VJbnRlZ2VyIGluaXRpYWxDb3VudCA9IF9jb3VudDsKLSAgTlNVSW50ZWdlciBuZXdDb3VudCA9IGluaXRpYWxDb3VudCArIGNvdW50OwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgbWVtY3B5KCZfdmFsdWVzW2luaXRpYWxDb3VudF0sIHZhbHVlcywgY291bnQgKiBzaXplb2YoaW50MzJfdCkpOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClpbnNlcnRSYXdWYWx1ZTooaW50MzJfdCl2YWx1ZSBhdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCArIDEpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50ICsgMV07Ci0gIH0KLSAgTlNVSW50ZWdlciBpbml0aWFsQ291bnQgPSBfY291bnQ7Ci0gIE5TVUludGVnZXIgbmV3Q291bnQgPSBpbml0aWFsQ291bnQgKyAxOwotICBpZiAobmV3Q291bnQgPiBfY2FwYWNpdHkpIHsKLSAgICBbc2VsZiBpbnRlcm5hbFJlc2l6ZVRvQ2FwYWNpdHk6Q2FwYWNpdHlGcm9tQ291bnQobmV3Q291bnQpXTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgaWYgKGluZGV4ICE9IGluaXRpYWxDb3VudCkgewotICAgIG1lbW1vdmUoJl92YWx1ZXNbaW5kZXggKyAxXSwgJl92YWx1ZXNbaW5kZXhdLCAoaW5pdGlhbENvdW50IC0gaW5kZXgpICogc2l6ZW9mKGludDMyX3QpKTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZXBsYWNlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHdpdGhSYXdWYWx1ZTooaW50MzJfdCl2YWx1ZSB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpbmRleCwgKHVuc2lnbmVkIGxvbmcpX2NvdW50XTsKLSAgfQotICBfdmFsdWVzW2luZGV4XSA9IHZhbHVlOwotfQotCi0tICh2b2lkKWFkZFJhd1ZhbHVlc0Zyb21BcnJheTooR1BCRW51bUFycmF5ICopYXJyYXkgewotICBbc2VsZiBhZGRSYXdWYWx1ZXM6YXJyYXktPl92YWx1ZXMgY291bnQ6YXJyYXktPl9jb3VudF07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWluZGV4IHsKLSAgaWYgKGluZGV4ID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWluZGV4LCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIE5TVUludGVnZXIgbmV3Q291bnQgPSBfY291bnQgLSAxOwotICBpZiAoaW5kZXggIT0gbmV3Q291bnQpIHsKLSAgICBtZW1tb3ZlKCZfdmFsdWVzW2luZGV4XSwgJl92YWx1ZXNbaW5kZXggKyAxXSwgKG5ld0NvdW50IC0gaW5kZXgpICogc2l6ZW9mKGludDMyX3QpKTsKLSAgfQotICBfY291bnQgPSBuZXdDb3VudDsKLSAgaWYgKChuZXdDb3VudCArICgyICoga0NodW5rU2l6ZSkpIDwgX2NhcGFjaXR5KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OkNhcGFjaXR5RnJvbUNvdW50KG5ld0NvdW50KV07Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBfY291bnQgPSAwOwotICBpZiAoKDAgKyAoMiAqIGtDaHVua1NpemUpKSA8IF9jYXBhY2l0eSkgewotICAgIFtzZWxmIGludGVybmFsUmVzaXplVG9DYXBhY2l0eTpDYXBhY2l0eUZyb21Db3VudCgwKV07Ci0gIH0KLX0KLQotLSAodm9pZClleGNoYW5nZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpZHgxCi0gICAgICAgICAgICB3aXRoVmFsdWVBdEluZGV4OihOU1VJbnRlZ2VyKWlkeDIgewotICBpZiAoaWR4MSA+PSBfY291bnQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNSYW5nZUV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkluZGV4ICglbHUpIGJleW9uZCBib3VuZHMgKCVsdSkiLAotICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylpZHgxLCAodW5zaWduZWQgbG9uZylfY291bnRdOwotICB9Ci0gIGlmIChpZHgyID49IF9jb3VudCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1JhbmdlRXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiSW5kZXggKCVsdSkgYmV5b25kIGJvdW5kcyAoJWx1KSIsCi0gICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25nKWlkeDIsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgaW50MzJfdCB0ZW1wID0gX3ZhbHVlc1tpZHgxXTsKLSAgX3ZhbHVlc1tpZHgxXSA9IF92YWx1ZXNbaWR4Ml07Ci0gIF92YWx1ZXNbaWR4Ml0gPSB0ZW1wOwotfQotCi0vLyVQRERNLUVYUEFORCBNVVRBVElPTl9NRVRIT0RTKEVudW0sIGludDMyX3QsICwgRW51bVZhbGlkYXRpb25MaXN0LCBFbnVtVmFsaWRhdGlvbk9uZSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0tICh2b2lkKWFkZFZhbHVlOihpbnQzMl90KXZhbHVlIHsKLSAgW3NlbGYgYWRkVmFsdWVzOiZ2YWx1ZSBjb3VudDoxXTsKLX0KLQotLSAodm9pZClhZGRWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgaWYgKHZhbHVlcyA9PSBOVUxMIHx8IGNvdW50ID09IDApIHJldHVybjsKLSAgR1BCRW51bVZhbGlkYXRpb25GdW5jIGZ1bmMgPSBfdmFsaWRhdGlvbkZ1bmM7Ci0gIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBpZiAoIWZ1bmModmFsdWVzW2ldKSkgewotICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICBmb3JtYXQ6QCIlQDogQXR0ZW1wdCB0byBzZXQgYW4gdW5rbm93biBlbnVtIHZhbHVlICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgdmFsdWVzW2ldXTsKLSAgICB9Ci0gIH0KLSAgTlNVSW50ZWdlciBpbml0aWFsQ291bnQgPSBfY291bnQ7Ci0gIE5TVUludGVnZXIgbmV3Q291bnQgPSBpbml0aWFsQ291bnQgKyBjb3VudDsKLSAgaWYgKG5ld0NvdW50ID4gX2NhcGFjaXR5KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OkNhcGFjaXR5RnJvbUNvdW50KG5ld0NvdW50KV07Ci0gIH0KLSAgX2NvdW50ID0gbmV3Q291bnQ7Ci0gIG1lbWNweSgmX3ZhbHVlc1tpbml0aWFsQ291bnRdLCB2YWx1ZXMsIGNvdW50ICogc2l6ZW9mKGludDMyX3QpKTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkQXJyYXlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpaW5zZXJ0VmFsdWU6KGludDMyX3QpdmFsdWUgYXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB7Ci0gIGlmIChpbmRleCA+PSBfY291bnQgKyAxKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudCArIDFdOwotICB9Ci0gIGlmICghX3ZhbGlkYXRpb25GdW5jKHZhbHVlKSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIiVAOiBBdHRlbXB0IHRvIHNldCBhbiB1bmtub3duIGVudW0gdmFsdWUgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgdmFsdWVdOwotICB9Ci0gIE5TVUludGVnZXIgaW5pdGlhbENvdW50ID0gX2NvdW50OwotICBOU1VJbnRlZ2VyIG5ld0NvdW50ID0gaW5pdGlhbENvdW50ICsgMTsKLSAgaWYgKG5ld0NvdW50ID4gX2NhcGFjaXR5KSB7Ci0gICAgW3NlbGYgaW50ZXJuYWxSZXNpemVUb0NhcGFjaXR5OkNhcGFjaXR5RnJvbUNvdW50KG5ld0NvdW50KV07Ci0gIH0KLSAgX2NvdW50ID0gbmV3Q291bnQ7Ci0gIGlmIChpbmRleCAhPSBpbml0aWFsQ291bnQpIHsKLSAgICBtZW1tb3ZlKCZfdmFsdWVzW2luZGV4ICsgMV0sICZfdmFsdWVzW2luZGV4XSwgKGluaXRpYWxDb3VudCAtIGluZGV4KSAqIHNpemVvZihpbnQzMl90KSk7Ci0gIH0KLSAgX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkQXJyYXlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVwbGFjZVZhbHVlQXRJbmRleDooTlNVSW50ZWdlcilpbmRleCB3aXRoVmFsdWU6KGludDMyX3QpdmFsdWUgewotICBpZiAoaW5kZXggPj0gX2NvdW50KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUmFuZ2VFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbmRleCAoJWx1KSBiZXlvbmQgYm91bmRzICglbHUpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkIGxvbmcpaW5kZXgsICh1bnNpZ25lZCBsb25nKV9jb3VudF07Ci0gIH0KLSAgaWYgKCFfdmFsaWRhdGlvbkZ1bmModmFsdWUpKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiJUA6IEF0dGVtcHQgdG8gc2V0IGFuIHVua25vd24gZW51bSB2YWx1ZSAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgY2xhc3NdLCB2YWx1ZV07Ci0gIH0KLSAgX3ZhbHVlc1tpbmRleF0gPSB2YWx1ZTsKLX0KLS8vJVBERE0tRVhQQU5ELUVORCAoMiBleHBhbnNpb25zKQotCi0vLyVQRERNLURFRklORSBNVVRBVElPTl9IT09LX0VudW1WYWxpZGF0aW9uTGlzdCgpCi0vLyUgIEdQQkVudW1WYWxpZGF0aW9uRnVuYyBmdW5jID0gX3ZhbGlkYXRpb25GdW5jOwotLy8lICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0vLyUgICAgaWYgKCFmdW5jKHZhbHVlc1tpXSkpIHsKLS8vJSAgICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotLy8lICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiJUA6IEF0dGVtcHQgdG8gc2V0IGFuIHVua25vd24gZW51bSB2YWx1ZSAoJWQpIiwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBjbGFzc10sIHZhbHVlc1tpXV07Ci0vLyUgICAgfQotLy8lICB9Ci0vLyUKLS8vJVBERE0tREVGSU5FIE1VVEFUSU9OX0hPT0tfRW51bVZhbGlkYXRpb25PbmUoKQotLy8lICBpZiAoIV92YWxpZGF0aW9uRnVuYyh2YWx1ZSkpIHsKLS8vJSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLS8vJSAgICAgICAgICAgICAgICBmb3JtYXQ6QCIlQDogQXR0ZW1wdCB0byBzZXQgYW4gdW5rbm93biBlbnVtIHZhbHVlICglZCkiLAotLy8lICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBjbGFzc10sIHZhbHVlXTsKLS8vJSAgfQotLy8lCi0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gTlNBcnJheSBTdWJjbGFzcwotCi1AaW1wbGVtZW50YXRpb24gR1BCQXV0b2NyZWF0ZWRBcnJheSB7Ci0gIE5TTXV0YWJsZUFycmF5ICpfYXJyYXk7Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2FycmF5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLSNwcmFnbWEgbWFyayBSZXF1aXJlZCBOU0FycmF5IG92ZXJyaWRlcwotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIFtfYXJyYXkgY291bnRdOwotfQotCi0tIChpZClvYmplY3RBdEluZGV4OihOU1VJbnRlZ2VyKWlkeCB7Ci0gIHJldHVybiBbX2FycmF5IG9iamVjdEF0SW5kZXg6aWR4XTsKLX0KLQotI3ByYWdtYSBtYXJrIFJlcXVpcmVkIE5TTXV0YWJsZUFycmF5IG92ZXJyaWRlcwotCi0vLyBPbmx5IG5lZWQgdG8gY2FsbCBHUEJBdXRvY3JlYXRlZEFycmF5TW9kaWZpZWQoKSB3aGVuIGFkZGluZyB0aGluZ3Mgc2luY2UKLS8vIHdlIG9ubHkgYXV0b2NyZWF0ZSBlbXB0eSBhcnJheXMuCi0KLS0gKHZvaWQpaW5zZXJ0T2JqZWN0OihpZClhbk9iamVjdCBhdEluZGV4OihOU1VJbnRlZ2VyKWlkeCB7Ci0gIGlmIChfYXJyYXkgPT0gbmlsKSB7Ci0gICAgX2FycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07Ci0gIH0KLSAgW19hcnJheSBpbnNlcnRPYmplY3Q6YW5PYmplY3QgYXRJbmRleDppZHhdOwotCi0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZEFycmF5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZU9iamVjdDooaWQpYW5PYmplY3QgewotICBbX2FycmF5IHJlbW92ZU9iamVjdDphbk9iamVjdF07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlT2JqZWN0QXRJbmRleDooTlNVSW50ZWdlcilpZHggewotICBbX2FycmF5IHJlbW92ZU9iamVjdEF0SW5kZXg6aWR4XTsKLX0KLQotLSAodm9pZClhZGRPYmplY3Q6KGlkKWFuT2JqZWN0IHsKLSAgaWYgKF9hcnJheSA9PSBuaWwpIHsKLSAgICBfYXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKLSAgfQotICBbX2FycmF5IGFkZE9iamVjdDphbk9iamVjdF07Ci0KLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkQXJyYXlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlTGFzdE9iamVjdCB7Ci0gIFtfYXJyYXkgcmVtb3ZlTGFzdE9iamVjdF07Ci19Ci0KLS0gKHZvaWQpcmVwbGFjZU9iamVjdEF0SW5kZXg6KE5TVUludGVnZXIpaWR4IHdpdGhPYmplY3Q6KGlkKWFuT2JqZWN0IHsKLSAgW19hcnJheSByZXBsYWNlT2JqZWN0QXRJbmRleDppZHggd2l0aE9iamVjdDphbk9iamVjdF07Ci19Ci0KLSNwcmFnbWEgbWFyayBFeHRyYSB0aGluZ3MgaG9va2VkCi0KLS0gKGlkKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIGlmIChfYXJyYXkgPT0gbmlsKSB7Ci0gICAgX2FycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdF07Ci0gIH0KLSAgcmV0dXJuIFtfYXJyYXkgY29weVdpdGhab25lOnpvbmVdOwotfQotCi0tIChpZCltdXRhYmxlQ29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgaWYgKF9hcnJheSA9PSBuaWwpIHsKLSAgICBfYXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0XTsKLSAgfQotICByZXR1cm4gW19hcnJheSBtdXRhYmxlQ29weVdpdGhab25lOnpvbmVdOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50QnlFbnVtZXJhdGluZ1dpdGhTdGF0ZTooTlNGYXN0RW51bWVyYXRpb25TdGF0ZSAqKXN0YXRlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0czooaWQgX191bnNhZmVfdW5yZXRhaW5lZCBbXSlidWZmZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWxlbiB7Ci0gIHJldHVybiBbX2FycmF5IGNvdW50QnlFbnVtZXJhdGluZ1dpdGhTdGF0ZTpzdGF0ZSBvYmplY3RzOmJ1ZmZlciBjb3VudDpsZW5dOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZU9iamVjdHNVc2luZ0Jsb2NrOih2b2lkICheKShpZCBvYmosIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfYXJyYXkgZW51bWVyYXRlT2JqZWN0c1VzaW5nQmxvY2s6YmxvY2tdOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZU9iamVjdHNXaXRoT3B0aW9uczooTlNFbnVtZXJhdGlvbk9wdGlvbnMpb3B0cwotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6KHZvaWQgKF4pKGlkIG9iaiwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19hcnJheSBlbnVtZXJhdGVPYmplY3RzV2l0aE9wdGlvbnM6b3B0cyB1c2luZ0Jsb2NrOmJsb2NrXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJBcnJheV9QYWNrYWdlUHJpdmF0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJBcnJheV9QYWNrYWdlUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNWE0NTM4MTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJBcnJheV9QYWNrYWdlUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0ICJHUEJBcnJheS5oIgotCi1AY2xhc3MgR1BCTWVzc2FnZTsKLQotLy8lUERETS1ERUZJTkUgREVDTEFSRV9BUlJBWV9FWFRSQVMoKQotLy8lQVJSQVlfSU5URVJGQUNFX0VYVFJBUyhJbnQzMiwgaW50MzJfdCkKLS8vJUFSUkFZX0lOVEVSRkFDRV9FWFRSQVMoVUludDMyLCB1aW50MzJfdCkKLS8vJUFSUkFZX0lOVEVSRkFDRV9FWFRSQVMoSW50NjQsIGludDY0X3QpCi0vLyVBUlJBWV9JTlRFUkZBQ0VfRVhUUkFTKFVJbnQ2NCwgdWludDY0X3QpCi0vLyVBUlJBWV9JTlRFUkZBQ0VfRVhUUkFTKEZsb2F0LCBmbG9hdCkKLS8vJUFSUkFZX0lOVEVSRkFDRV9FWFRSQVMoRG91YmxlLCBkb3VibGUpCi0vLyVBUlJBWV9JTlRFUkZBQ0VfRVhUUkFTKEJvb2wsIEJPT0wpCi0vLyVBUlJBWV9JTlRFUkZBQ0VfRVhUUkFTKEVudW0sIGludDMyX3QpCi0KLS8vJVBERE0tREVGSU5FIEFSUkFZX0lOVEVSRkFDRV9FWFRSQVMoTkFNRSwgVFlQRSkKLS8vJSNwcmFnbWEgbWFyayAtIE5BTUUKLS8vJQotLy8lQGludGVyZmFjZSBHUEIjI05BTUUjI0FycmF5ICgpIHsKLS8vJSBAcGFja2FnZQotLy8lICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotLy8lfQotLy8lQGVuZAotLy8lCi0KLS8vJVBERE0tRVhQQU5EIERFQ0xBUkVfQVJSQVlfRVhUUkFTKCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkludDMyQXJyYXkgKCkgewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMgotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMkFycmF5ICgpIHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkludDY0QXJyYXkgKCkgewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEFycmF5ICgpIHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBGbG9hdAotCi1AaW50ZXJmYWNlIEdQQkZsb2F0QXJyYXkgKCkgewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQkRvdWJsZUFycmF5ICgpIHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBCb29sCi0KLUBpbnRlcmZhY2UgR1BCQm9vbEFycmF5ICgpIHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBFbnVtCi0KLUBpbnRlcmZhY2UgR1BCRW51bUFycmF5ICgpIHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi0vLyVQRERNLUVYUEFORC1FTkQgREVDTEFSRV9BUlJBWV9FWFRSQVMoKQotCi0jcHJhZ21hIG1hcmsgLSBOU0FycmF5IFN1YmNsYXNzCi0KLUBpbnRlcmZhY2UgR1BCQXV0b2NyZWF0ZWRBcnJheSA6IE5TTXV0YWJsZUFycmF5IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJCb290c3RyYXAuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQm9vdHN0cmFwLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmZWZhNzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJCb290c3RyYXAuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGUgT2JqZWN0aXZlIEMgcnVudGltZSBoYXMgY29tcGxldGUgZW5vdWdoIGluZm8gdGhhdCBtb3N0IHByb3RvcyBkb27igJl0IGVuZAotLy8gdXAgdXNpbmcgdGhpcywgc28gbGVhdmluZyBpdCBvbiBpcyBubyBjb3N0IG9yIHZlcnkgbGl0dGxlIGNvc3QuICBJZiB5b3UKLS8vIGhhcHBlbiB0byBzZWUgaXQgY2F1c2luZyBibG9hdCwgdGhpcyBpcyB0aGUgd2F5IHRvIGRpc2FibGUgaXQuIElmIHlvdSBkbwotLy8gbmVlZCB0byBkaXNhYmxlIGl0LCB0cnkgb25seSBkaXNhYmxpbmcgaXQgZm9yIFJlbGVhc2UgYnVpbGRzIGFzIGhhdmluZwotLy8gZnVsbCBUZXh0Rm9ybWF0IGNhbiBiZSB1c2VmdWwgZm9yIGRlYnVnZ2luZy4KLSNpZm5kZWYgR1BCT0JKQ19TS0lQX01FU1NBR0VfVEVYVEZPUk1BVF9FWFRSQVMKLSNkZWZpbmUgR1BCT0JKQ19TS0lQX01FU1NBR0VfVEVYVEZPUk1BVF9FWFRSQVMgMAotI2VuZGlmCi0KLS8vIFVzZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHRvIGdpdmUgc2l6ZXMgdG8gZW51bXMuIGludDMyX3Qgd2FzIGNob3NlbiBiYXNlZAotLy8gb24gdGhlIGZhY3QgdGhhdCBQcm90b2NvbCBCdWZmZXJzIGVudW1zIGFyZSBsaW1pdGVkIHRvIHRoaXMgcmFuZ2UuCi0jaWYgIV9faGFzX2ZlYXR1cmUob2JqY19maXhlZF9lbnVtKQotICNlcnJvciBBbGwgc3VwcG9ydGVkIFhjb2RlIHZlcnNpb25zIHNob3VsZCBzdXBwb3J0IG9iamNfZml4ZWRfZW51bS4KLSNlbmRpZgotLy8gSWYgdGhlIGhlYWRlcnMgYXJlIGltcG9ydGVkIGludG8gT2JqZWN0aXZlLUMrKywgd2UgY2FuIHJ1biBpbnRvIGFuIGlzc3VlCi0vLyB3aGVyZSB0aGUgZGVmaW50aW9uIG9mIE5TX0VOVU0gKHJlYWxseSBDRl9FTlVNKSBjaGFuZ2VzIGJhc2VkIG9uIHRoZSBDKysKLS8vIHN0YW5kYXJkIHRoYXQgaXMgaW4gZWZmZWN0LiAgSWYgaXQgaXNuJ3QgQysrMTEgb3IgaGlnaGVyLCB0aGUgZGVmaW5pdGlvbgotLy8gZG9lc24ndCBhbGxvdyB1cyB0byBmb3J3YXJkIGRlY2xhcmUuIFdlIHdvcmsgYXJvdW5kIHRoaXMgb25lIGNhc2UgYnkKLS8vIHByb3ZpZGluZyBhIGxvY2FsIGRlZmluaXRpb24uIFRoZSBkZWZhdWx0IGNhc2UgaGFzIHRvIHVzZSBOU19FTlVNIGZvciB0aGUKLS8vIG1hZ2ljIHRoYXQgaXMgU3dpZnQgYnJpZGdpbmcgb2YgZW51bXMuCi0jaWYgKF9fY3BsdXNwbHVzICYmIF9fY3BsdXNwbHVzIDwgMjAxMTAzTCkKLSAjZGVmaW5lIEdQQl9FTlVNKFgpIGVudW0gWCA6IGludDMyX3QgWDsgZW51bSBYIDogaW50MzJfdAotI2Vsc2UKLSAjZGVmaW5lIEdQQl9FTlVNKFgpIE5TX0VOVU0oaW50MzJfdCwgWCkKLSNlbmRpZgotLy8gR1BCX0VOVU1fRldEX0RFQ0xBUkUgaXMgdXNlZCBmb3IgZm9yd2FyZCBkZWNsYXJpbmcgZW51bXMsIGV4OgotLy8gICBHUEJfRU5VTV9GV0RfREVDTEFSRShGb29fRW51bSkKLS8vICAgQHByb3BlcnR5IChub25hdG9taWMpIEZvb19FbnVtIHZhbHVlOwotI2RlZmluZSBHUEJfRU5VTV9GV0RfREVDTEFSRShYKSBlbnVtIFggOiBpbnQzMl90Ci0KLS8vIEJhc2VkIHVwb24gQ0ZfSU5MSU5FLiBGb3JjZXMgaW5saW5pbmcgaW4gcmVsZWFzZS4KLSNpZiAhZGVmaW5lZChERUJVRykKLSNkZWZpbmUgR1BCX0lOTElORSBzdGF0aWMgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKLSNlbHNlCi0jZGVmaW5lIEdQQl9JTkxJTkUgc3RhdGljIF9faW5saW5lX18KLSNlbmRpZgotCi0vLyBGb3IgdXNlIGluIHB1YmxpYyBoZWFkZXJzIHRoYXQgbWlnaHQgbmVlZCB0byBkZWFsIHdpdGggQVJDLgotI2lmbmRlZiBHUEJfVU5TQUZFX1VOUkVUQUlORUQKLSNpZiBfX2hhc19mZWF0dXJlKG9iamNfYXJjKQotI2RlZmluZSBHUEJfVU5TQUZFX1VOUkVUQUlORUQgX191bnNhZmVfdW5yZXRhaW5lZAotI2Vsc2UKLSNkZWZpbmUgR1BCX1VOU0FGRV9VTlJFVEFJTkVECi0jZW5kaWYKLSNlbmRpZgotCi0vLyBJZiBwcm9wZXJ0eSBuYW1lIHN0YXJ0cyB3aXRoIGluaXQgd2UgbmVlZCB0byBhbm5vdGF0ZSBpdCB0byBnZXQgcGFzdCBBUkMuCi0vLyBodHRwOi8vc3RhY2tvdmVyZmxvdy5jb20vcXVlc3Rpb25zLzE4NzIzMjI2L2hvdy1kby1pLWFubm90YXRlLWFuLW9iamVjdGl2ZS1jLXByb3BlcnR5LXdpdGgtYW4tb2JqYy1tZXRob2QtZmFtaWx5LzE4NzIzMjI3IzE4NzIzMjI3Ci0jZGVmaW5lIEdQQl9NRVRIT0RfRkFNSUxZX05PTkUgX19hdHRyaWJ1dGVfXygob2JqY19tZXRob2RfZmFtaWx5KG5vbmUpKSkKLQotLy8gVGhlIHByb3RvYy1nZW4tb2JqYyB2ZXJzaW9uIHdoaWNoIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZiB0aGUKLS8vIGdlbmVyYXRlZCBPYmplY3RpdmUgQyBzb3VyY2VzLiAgSW4gZ2VuZXJhbCB3ZSBkb24ndCB3YW50IHRvIGNoYW5nZSB0aGUKLS8vIHJ1bnRpbWUgaW50ZXJmYWNlcyAob3IgdGhpcyB2ZXJzaW9uKSBhcyBpdCBtZWFucyBldmVyeXRoaW5nIGhhcyB0byBiZQotLy8gcmVnZW5lcmF0ZWQuCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PQkpDX0dFTl9WRVJTSU9OIDMwMDAxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkNvZGVkSW5wdXRTdHJlYW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQ29kZWRJbnB1dFN0cmVhbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjRiNjRlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQ29kZWRJbnB1dFN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTMwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotQGNsYXNzIEdQQk1lc3NhZ2U7Ci1AY2xhc3MgR1BCRXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLS8vLyBSZWFkcyBhbmQgZGVjb2RlcyBwcm90b2NvbCBtZXNzYWdlIGZpZWxkcy4KLS8vLwotLy8vIFRoZSBjb21tb24gdXNlcyBvZiBwcm90b2NvbCBidWZmZXJzIHNob3VsZG4ndCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgotLy8vIEBjIEdQQk1lc3NhZ2UncyBwcm92aWRlIGEgQGMgK3BhcnNlRnJvbURhdGE6ZXJyb3I6IGFuZCBAYwotLy8vICtwYXJzZUZyb21EYXRhOmV4dGVuc2lvblJlZ2lzdHJ5OmVycm9yOiBtZXRob2QgdGhhdCB3aWxsIGRlY29kZSBhCi0vLy8gbWVzc2FnZSBmb3IgeW91LgotLy8vCi0vLy8gQG5vdGUgU3ViY2xhc3Npbmcgb2YgR1BCQ29kZWRJbnB1dFN0cmVhbSBpcyBOT1Qgc3VwcG9ydGVkLgotQGludGVyZmFjZSBHUEJDb2RlZElucHV0U3RyZWFtIDogTlNPYmplY3QKLQotLy8vIENyZWF0ZXMgYSBuZXcgc3RyZWFtIHdyYXBwaW5nIHNvbWUgZGF0YS4KLSsgKGluc3RhbmNldHlwZSlzdHJlYW1XaXRoRGF0YTooTlNEYXRhICopZGF0YTsKLQotLy8vIEluaXRpYWxpemVzIGEgc3RyZWFtIHdyYXBwaW5nIHNvbWUgZGF0YS4KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGE7Ci0KLS8vLyBBdHRlbXB0IHRvIHJlYWQgYSBmaWVsZCB0YWcsIHJldHVybmluZyB6ZXJvIGlmIHdlIGhhdmUgcmVhY2hlZCBFT0YuCi0vLy8gUHJvdG9jb2wgbWVzc2FnZSBwYXJzZXJzIHVzZSB0aGlzIHRvIHJlYWQgdGFncywgc2luY2UgYSBwcm90b2NvbCBtZXNzYWdlCi0vLy8gbWF5IGxlZ2FsbHkgZW5kIHdoZXJldmVyIGEgdGFnIG9jY3VycywgYW5kIHplcm8gaXMgbm90IGEgdmFsaWQgdGFnIG51bWJlci4KLS0gKGludDMyX3QpcmVhZFRhZzsKLQotLy8vIFJlYWQgYW5kIHJldHVybiBhIGRvdWJsZS4KLS0gKGRvdWJsZSlyZWFkRG91YmxlOwotLy8vIFJlYWQgYW5kIHJldHVybiBhIGZsb2F0LgotLSAoZmxvYXQpcmVhZEZsb2F0OwotLy8vIFJlYWQgYW5kIHJldHVybiBhIHVpbnQ2NC4KLS0gKHVpbnQ2NF90KXJlYWRVSW50NjQ7Ci0vLy8gUmVhZCBhbmQgcmV0dXJuIGEgdWludDMyLgotLSAodWludDMyX3QpcmVhZFVJbnQzMjsKLS8vLyBSZWFkIGFuZCByZXR1cm4gYW4gaW50NjQuCi0tIChpbnQ2NF90KXJlYWRJbnQ2NDsKLS8vLyBSZWFkIGFuZCByZXR1cm4gYW4gaW50MzIuCi0tIChpbnQzMl90KXJlYWRJbnQzMjsKLS8vLyBSZWFkIGFuZCByZXR1cm4gYSBmaXhlZDY0LgotLSAodWludDY0X3QpcmVhZEZpeGVkNjQ7Ci0vLy8gUmVhZCBhbmQgcmV0dXJuIGEgZml4ZWQzMi4KLS0gKHVpbnQzMl90KXJlYWRGaXhlZDMyOwotLy8vIFJlYWQgYW5kIHJldHVybiBhbiBlbnVtIChpbnQpLgotLSAoaW50MzJfdClyZWFkRW51bTsKLS8vLyBSZWFkIGFuZCByZXR1cm4gYSBzZml4ZWQzMi4KLS0gKGludDMyX3QpcmVhZFNGaXhlZDMyOwotLy8vIFJlYWQgYW5kIHJldHVybiBhIHNmaXhlZDY0LgotLSAoaW50NjRfdClyZWFkU0ZpeGVkNjQ7Ci0vLy8gUmVhZCBhbmQgcmV0dXJuIGEgc2ludDMyLgotLSAoaW50MzJfdClyZWFkU0ludDMyOwotLy8vIFJlYWQgYW5kIHJldHVybiBhIHNpbnQ2NC4KLS0gKGludDY0X3QpcmVhZFNJbnQ2NDsKLS8vLyBSZWFkIGFuZCByZXR1cm4gYSBib29sZWFuLgotLSAoQk9PTClyZWFkQm9vbDsKLS8vLyBSZWFkIGFuZCByZXR1cm4gYSBzdHJpbmcuCi0tIChOU1N0cmluZyAqKXJlYWRTdHJpbmc7Ci0vLy8gUmVhZCBhbmQgcmV0dXJuIGxlbmd0aCBkZWxpbWl0ZWQgZGF0YS4KLS0gKE5TRGF0YSAqKXJlYWRCeXRlczsKLQotLy8vIFJlYWQgYW4gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uCi0vLy8KLS8vLyBAcGFyYW0gbWVzc2FnZSAgICAgICAgICAgVGhlIG1lc3NhZ2UgdG8gc2V0IGZpZWxkcyBvbiBhcyB0aGV5IGFyZSByZWFkLgotLy8vIEBwYXJhbSBleHRlbnNpb25SZWdpc3RyeSBBbiBvcHRpb25hbCBleHRlbnNpb24gcmVnaXN0cnkgdG8gdXNlIHRvIGxvb2t1cAotLy8vICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zIGZvciBAbWVzc2FnZS4KLS0gKHZvaWQpcmVhZE1lc3NhZ2U6KEdQQk1lc3NhZ2UgKiltZXNzYWdlCi0gIGV4dGVuc2lvblJlZ2lzdHJ5OihudWxsYWJsZSBHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5OwotCi0vLy8gUmVhZHMgYW5kIGRpc2NhcmRzIGEgc2luZ2xlIGZpZWxkLCBnaXZlbiBpdHMgdGFnIHZhbHVlLgotLy8vCi0vLy8gQHBhcmFtIHRhZyBUaGUgdGFnIG51bWJlciBvZiB0aGUgZmllbGQgdG8gc2tpcC4KLS8vLwotLy8vIEByZXR1cm4gTk8gaWYgdGhlIHRhZyBpcyBhbiBlbmRncm91cCB0YWcgKGluIHdoaWNoIGNhc2Ugbm90aGluZyBpcyBza2lwcGVkKSwKLS8vLyAgICAgICAgIFlFUyBpbiBhbGwgb3RoZXIgY2FzZXMuCi0tIChCT09MKXNraXBGaWVsZDooaW50MzJfdCl0YWc7Ci0KLS8vLyBSZWFkcyBhbmQgZGlzY2FyZHMgYW4gZW50aXJlIG1lc3NhZ2UuICBUaGlzIHdpbGwgcmVhZCBlaXRoZXIgdW50aWwgRU9GCi0vLy8gb3IgdW50aWwgYW4gZW5kZ3JvdXAgdGFnLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0tICh2b2lkKXNraXBNZXNzYWdlOwotCi0vLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBsb2dpY2FsIGVuZCBvZiB0aGUgc3RyZWFtIGhhcyBiZWVuIHJlYWNoZWQuCi0vLy8KLS8vLyBUaGlzIGNhbiByZXR1cm4gTk8gd2hlbiB0aGVyZSBpcyBubyBtb3JlIGRhdGEsIGJ1dCB0aGUgY3VycmVudCBwYXJzaW5nCi0vLy8gZXhwZWN0ZWQgbW9yZSBkYXRhLgotLSAoQk9PTClpc0F0RW5kOwotCi0vLy8gVGhlIG9mZnNldCBpbnRvIHRoZSBzdHJlYW0uCi0tIChzaXplX3QpcG9zaXRpb247Ci0KLS8vLyBWZXJpZmllcyB0aGF0IHRoZSBsYXN0IGNhbGwgdG8gQGMgLXJlYWRUYWcgcmV0dXJuZWQgdGhlIGdpdmVuIHRhZyB2YWx1ZS4KLS8vLyBUaGlzIGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBuZXN0ZWQgZ3JvdXAgZW5kZWQgd2l0aCB0aGUgY29ycmVjdCBlbmQgdGFnLgotLy8vIFRocm93cyBAYyBOU1BhcnNlRXJyb3JFeGNlcHRpb24gaWYgdmFsdWUgZG9lcyBub3QgbWF0Y2ggdGhlIGxhc3QgdGFnLgotLy8vCi0vLy8gQHBhcmFtIGV4cGVjdGVkIFRoZSB0YWcgdGhhdCB3YXMgZXhwZWN0ZWQuCi0tICh2b2lkKWNoZWNrTGFzdFRhZ1dhczooaW50MzJfdClleHBlY3RlZDsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQ29kZWRJbnB1dFN0cmVhbS5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJDb2RlZElucHV0U3RyZWFtLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxOWVjMTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJDb2RlZElucHV0U3RyZWFtLm0KKysrIC9kZXYvbnVsbApAQCAtMSw0OTkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQkNvZGVkSW5wdXRTdHJlYW1fUGFja2FnZVByaXZhdGUuaCIKLQotI2ltcG9ydCAiR1BCRGljdGlvbmFyeV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCTWVzc2FnZV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkU2V0X1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJHUEJVdGlsaXRpZXNfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQldpcmVGb3JtYXQuaCIKLQotc3RhdGljIGNvbnN0IE5TVUludGVnZXIga0RlZmF1bHRSZWN1cnNpb25MaW1pdCA9IDY0OwotCi1zdGF0aWMgdm9pZCBDaGVja1NpemUoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2l6ZV90IG5ld1NpemUgPSBzdGF0ZS0+YnVmZmVyUG9zICsgc2l6ZTsKLSAgaWYgKG5ld1NpemUgPiBzdGF0ZS0+YnVmZmVyU2l6ZSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1BhcnNlRXJyb3JFeGNlcHRpb24gZm9ybWF0OkAiIl07Ci0gIH0KLSAgaWYgKG5ld1NpemUgPiBzdGF0ZS0+Y3VycmVudExpbWl0KSB7Ci0gICAgLy8gRmFzdCBmb3J3YXJkIHRvIGVuZCBvZiBjdXJyZW50TGltaXQ7Ci0gICAgc3RhdGUtPmJ1ZmZlclBvcyA9IHN0YXRlLT5jdXJyZW50TGltaXQ7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUGFyc2VFcnJvckV4Y2VwdGlvbiBmb3JtYXQ6QCIiXTsKLSAgfQotfQotCi1zdGF0aWMgaW50OF90IFJlYWRSYXdCeXRlKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgQ2hlY2tTaXplKHN0YXRlLCBzaXplb2YoaW50OF90KSk7Ci0gIHJldHVybiAoKGludDhfdCAqKXN0YXRlLT5ieXRlcylbc3RhdGUtPmJ1ZmZlclBvcysrXTsKLX0KLQotc3RhdGljIGludDMyX3QgUmVhZFJhd0xpdHRsZUVuZGlhbjMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgQ2hlY2tTaXplKHN0YXRlLCBzaXplb2YoaW50MzJfdCkpOwotICBpbnQzMl90IHZhbHVlID0gT1NSZWFkTGl0dGxlSW50MzIoc3RhdGUtPmJ5dGVzLCBzdGF0ZS0+YnVmZmVyUG9zKTsKLSAgc3RhdGUtPmJ1ZmZlclBvcyArPSBzaXplb2YoaW50MzJfdCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludDY0X3QgUmVhZFJhd0xpdHRsZUVuZGlhbjY0KEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgQ2hlY2tTaXplKHN0YXRlLCBzaXplb2YoaW50NjRfdCkpOwotICBpbnQ2NF90IHZhbHVlID0gT1NSZWFkTGl0dGxlSW50NjQoc3RhdGUtPmJ5dGVzLCBzdGF0ZS0+YnVmZmVyUG9zKTsKLSAgc3RhdGUtPmJ1ZmZlclBvcyArPSBzaXplb2YoaW50NjRfdCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotc3RhdGljIGludDMyX3QgUmVhZFJhd1ZhcmludDMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgaW50OF90IHRtcCA9IFJlYWRSYXdCeXRlKHN0YXRlKTsKLSAgaWYgKHRtcCA+PSAwKSB7Ci0gICAgcmV0dXJuIHRtcDsKLSAgfQotICBpbnQzMl90IHJlc3VsdCA9IHRtcCAmIDB4N2Y7Ci0gIGlmICgodG1wID0gUmVhZFJhd0J5dGUoc3RhdGUpKSA+PSAwKSB7Ci0gICAgcmVzdWx0IHw9IHRtcCA8PCA3OwotICB9IGVsc2UgewotICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgNzsKLSAgICBpZiAoKHRtcCA9IFJlYWRSYXdCeXRlKHN0YXRlKSkgPj0gMCkgewotICAgICAgcmVzdWx0IHw9IHRtcCA8PCAxNDsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCAxNDsKLSAgICAgIGlmICgodG1wID0gUmVhZFJhd0J5dGUoc3RhdGUpKSA+PSAwKSB7Ci0gICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMjE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDIxOwotICAgICAgICByZXN1bHQgfD0gKHRtcCA9IFJlYWRSYXdCeXRlKHN0YXRlKSkgPDwgMjg7Ci0gICAgICAgIGlmICh0bXAgPCAwKSB7Ci0gICAgICAgICAgLy8gRGlzY2FyZCB1cHBlciAzMiBiaXRzLgotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNTsgaSsrKSB7Ci0gICAgICAgICAgICBpZiAoUmVhZFJhd0J5dGUoc3RhdGUpID49IDApIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUGFyc2VFcnJvckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIlVuYWJsZSB0byByZWFkIHZhcmludDMyIl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludDY0X3QgUmVhZFJhd1ZhcmludDY0KEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgaW50MzJfdCBzaGlmdCA9IDA7Ci0gIGludDY0X3QgcmVzdWx0ID0gMDsKLSAgd2hpbGUgKHNoaWZ0IDwgNjQpIHsKLSAgICBpbnQ4X3QgYiA9IFJlYWRSYXdCeXRlKHN0YXRlKTsKLSAgICByZXN1bHQgfD0gKGludDY0X3QpKGIgJiAweDdGKSA8PCBzaGlmdDsKLSAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgICBzaGlmdCArPSA3OwotICB9Ci0gIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1BhcnNlRXJyb3JFeGNlcHRpb24gZm9ybWF0OkAiVW5hYmxlIHRvIHJlYWQgdmFyaW50NjQiXTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIFNraXBSYXdEYXRhKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUsIHNpemVfdCBzaXplKSB7Ci0gIENoZWNrU2l6ZShzdGF0ZSwgc2l6ZSk7Ci0gIHN0YXRlLT5idWZmZXJQb3MgKz0gc2l6ZTsKLX0KLQotZG91YmxlIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRG91YmxlKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgaW50NjRfdCB2YWx1ZSA9IFJlYWRSYXdMaXR0bGVFbmRpYW42NChzdGF0ZSk7Ci0gIHJldHVybiBHUEJDb252ZXJ0SW50NjRUb0RvdWJsZSh2YWx1ZSk7Ci19Ci0KLWZsb2F0IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRmxvYXQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkgewotICBpbnQzMl90IHZhbHVlID0gUmVhZFJhd0xpdHRsZUVuZGlhbjMyKHN0YXRlKTsKLSAgcmV0dXJuIEdQQkNvbnZlcnRJbnQzMlRvRmxvYXQodmFsdWUpOwotfQotCi11aW50NjRfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFVJbnQ2NChHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKSB7Ci0gIHVpbnQ2NF90IHZhbHVlID0gUmVhZFJhd1ZhcmludDY0KHN0YXRlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi11aW50MzJfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFVJbnQzMihHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKSB7Ci0gIHVpbnQzMl90IHZhbHVlID0gUmVhZFJhd1ZhcmludDMyKHN0YXRlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQ2NF90IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkSW50NjQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkgewotICBpbnQ2NF90IHZhbHVlID0gUmVhZFJhd1ZhcmludDY0KHN0YXRlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQzMl90IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkSW50MzIoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkgewotICBpbnQzMl90IHZhbHVlID0gUmVhZFJhd1ZhcmludDMyKHN0YXRlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi11aW50NjRfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEZpeGVkNjQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkgewotICB1aW50NjRfdCB2YWx1ZSA9IFJlYWRSYXdMaXR0bGVFbmRpYW42NChzdGF0ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotdWludDMyX3QgR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRGaXhlZDMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgdWludDMyX3QgdmFsdWUgPSBSZWFkUmF3TGl0dGxlRW5kaWFuMzIoc3RhdGUpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWludDMyX3QgR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRFbnVtKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgaW50MzJfdCB2YWx1ZSA9IFJlYWRSYXdWYXJpbnQzMihzdGF0ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW50MzJfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNGaXhlZDMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgaW50MzJfdCB2YWx1ZSA9IFJlYWRSYXdMaXR0bGVFbmRpYW4zMihzdGF0ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW50NjRfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNGaXhlZDY0KEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgaW50NjRfdCB2YWx1ZSA9IFJlYWRSYXdMaXR0bGVFbmRpYW42NChzdGF0ZSk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW50MzJfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNJbnQzMihHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKSB7Ci0gIGludDMyX3QgdmFsdWUgPSBHUEJEZWNvZGVaaWdaYWczMihSZWFkUmF3VmFyaW50MzIoc3RhdGUpKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1pbnQ2NF90IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ludDY0KEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgaW50NjRfdCB2YWx1ZSA9IEdQQkRlY29kZVppZ1phZzY0KFJlYWRSYXdWYXJpbnQ2NChzdGF0ZSkpOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLUJPT0wgR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRCb29sKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpIHsKLSAgcmV0dXJuIFJlYWRSYXdWYXJpbnQzMihzdGF0ZSkgIT0gMDsKLX0KLQotaW50MzJfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFRhZyhHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKSB7Ci0gIGlmIChHUEJDb2RlZElucHV0U3RyZWFtSXNBdEVuZChzdGF0ZSkpIHsKLSAgICBzdGF0ZS0+bGFzdFRhZyA9IDA7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBzdGF0ZS0+bGFzdFRhZyA9IFJlYWRSYXdWYXJpbnQzMihzdGF0ZSk7Ci0gIGlmIChzdGF0ZS0+bGFzdFRhZyA9PSAwKSB7Ci0gICAgLy8gSWYgd2UgYWN0dWFsbHkgcmVhZCB6ZXJvLCB0aGF0J3Mgbm90IGEgdmFsaWQgdGFnLgotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1BhcnNlRXJyb3JFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJJbnZhbGlkIGxhc3QgdGFnICVkIiwgc3RhdGUtPmxhc3RUYWddOwotICB9Ci0gIHJldHVybiBzdGF0ZS0+bGFzdFRhZzsKLX0KLQotTlNTdHJpbmcgKkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWRTdHJpbmcoCi0gICAgR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkgewotICBpbnQzMl90IHNpemUgPSBSZWFkUmF3VmFyaW50MzIoc3RhdGUpOwotICBOU1N0cmluZyAqcmVzdWx0OwotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgcmVzdWx0ID0gQCIiOwotICB9IGVsc2UgewotICAgIENoZWNrU2l6ZShzdGF0ZSwgc2l6ZSk7Ci0gICAgcmVzdWx0ID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhCeXRlczomc3RhdGUtPmJ5dGVzW3N0YXRlLT5idWZmZXJQb3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aDpzaXplCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gICAgc3RhdGUtPmJ1ZmZlclBvcyArPSBzaXplOwotICAgIGlmICghcmVzdWx0KSB7Ci0jaWZkZWYgREVCVUcKLSAgICAgIC8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90byNzY2FsYXIKLSAgICAgIE5TTG9nKEAiVVRGLTggZmFpbHVyZSwgaXMgc29tZSBmaWVsZCB0eXBlICdzdHJpbmcnIHdoZW4gaXQgc2hvdWxkIGJlICIKLSAgICAgICAgICAgIEAiJ2J5dGVzJz8iKTsKLSNlbmRpZgotICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUGFyc2VFcnJvckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiSW52YWxpZCBVVEYtOCBmb3IgYSAnc3RyaW5nJyJdOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1OU0RhdGEgKkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWRCeXRlcyhHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKSB7Ci0gIGludDMyX3Qgc2l6ZSA9IFJlYWRSYXdWYXJpbnQzMihzdGF0ZSk7Ci0gIGlmIChzaXplIDwgMCkgcmV0dXJuIG5pbDsKLSAgQ2hlY2tTaXplKHN0YXRlLCBzaXplKTsKLSAgTlNEYXRhICpyZXN1bHQgPSBbW05TRGF0YSBhbGxvY10gaW5pdFdpdGhCeXRlczpzdGF0ZS0+Ynl0ZXMgKyBzdGF0ZS0+YnVmZmVyUG9zCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGg6c2l6ZV07Ci0gIHN0YXRlLT5idWZmZXJQb3MgKz0gc2l6ZTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTlNEYXRhICpHUEJDb2RlZElucHV0U3RyZWFtUmVhZFJldGFpbmVkQnl0ZXNOb0NvcHkoCi0gICAgR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkgewotICBpbnQzMl90IHNpemUgPSBSZWFkUmF3VmFyaW50MzIoc3RhdGUpOwotICBpZiAoc2l6ZSA8IDApIHJldHVybiBuaWw7Ci0gIENoZWNrU2l6ZShzdGF0ZSwgc2l6ZSk7Ci0gIC8vIENhc3QgaXMgc2FmZSBiZWNhdXNlIGZyZWVXaGVuRG9uZSBpcyBOTy4KLSAgTlNEYXRhICpyZXN1bHQgPSBbW05TRGF0YSBhbGxvY10KLSAgICAgIGluaXRXaXRoQnl0ZXNOb0NvcHk6KHZvaWQgKikoc3RhdGUtPmJ5dGVzICsgc3RhdGUtPmJ1ZmZlclBvcykKLSAgICAgICAgICAgICAgICAgICBsZW5ndGg6c2l6ZQotICAgICAgICAgICAgIGZyZWVXaGVuRG9uZTpOT107Ci0gIHN0YXRlLT5idWZmZXJQb3MgKz0gc2l6ZTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc2l6ZV90IEdQQkNvZGVkSW5wdXRTdHJlYW1QdXNoTGltaXQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlTGltaXQpIHsKLSAgYnl0ZUxpbWl0ICs9IHN0YXRlLT5idWZmZXJQb3M7Ci0gIHNpemVfdCBvbGRMaW1pdCA9IHN0YXRlLT5jdXJyZW50TGltaXQ7Ci0gIGlmIChieXRlTGltaXQgPiBvbGRMaW1pdCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAImJ5dGVMaW1pdCA+IG9sZExpbWl0OiAldHUgPiAldHUiLCBieXRlTGltaXQsIG9sZExpbWl0XTsKLSAgfQotICBzdGF0ZS0+Y3VycmVudExpbWl0ID0gYnl0ZUxpbWl0OwotICByZXR1cm4gb2xkTGltaXQ7Ci19Ci0KLXZvaWQgR1BCQ29kZWRJbnB1dFN0cmVhbVBvcExpbWl0KEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2xkTGltaXQpIHsKLSAgc3RhdGUtPmN1cnJlbnRMaW1pdCA9IG9sZExpbWl0OwotfQotCi1zaXplX3QgR1BCQ29kZWRJbnB1dFN0cmVhbUJ5dGVzVW50aWxMaW1pdChHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKSB7Ci0gIHJldHVybiBzdGF0ZS0+Y3VycmVudExpbWl0IC0gc3RhdGUtPmJ1ZmZlclBvczsKLX0KLQotQk9PTCBHUEJDb2RlZElucHV0U3RyZWFtSXNBdEVuZChHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKSB7Ci0gIHJldHVybiAoc3RhdGUtPmJ1ZmZlclBvcyA9PSBzdGF0ZS0+YnVmZmVyU2l6ZSkgfHwKLSAgICAgICAgIChzdGF0ZS0+YnVmZmVyUG9zID09IHN0YXRlLT5jdXJyZW50TGltaXQpOwotfQotCi12b2lkIEdQQkNvZGVkSW5wdXRTdHJlYW1DaGVja0xhc3RUYWdXYXMoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKSB7Ci0gIGlmIChzdGF0ZS0+bGFzdFRhZyAhPSB2YWx1ZSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1BhcnNlRXJyb3JFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJMYXN0IHRhZzogJWQgc2hvdWxkIGJlICVkIiwgc3RhdGUtPmxhc3RUYWcsIHZhbHVlXTsKLSAgfQotfQotCi1AaW1wbGVtZW50YXRpb24gR1BCQ29kZWRJbnB1dFN0cmVhbQotCi0rIChpbnN0YW5jZXR5cGUpc3RyZWFtV2l0aERhdGE6KE5TRGF0YSAqKWRhdGEgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGFdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YSB7Ci0gIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKLSNpZmRlZiBERUJVRwotICAgIE5TQ0Fzc2VydChbc2VsZiBjbGFzc10gPT0gW0dQQkNvZGVkSW5wdXRTdHJlYW0gY2xhc3NdLAotICAgICAgICAgICAgICBAIlN1YmNsYXNzaW5nIG9mIEdQQkNvZGVkSW5wdXRTdHJlYW0gaXMgbm90IGFsbG93ZWQuIik7Ci0jZW5kaWYKLSAgICBidWZmZXJfID0gW2RhdGEgcmV0YWluXTsKLSAgICBzdGF0ZV8uYnl0ZXMgPSAoY29uc3QgdWludDhfdCAqKVtkYXRhIGJ5dGVzXTsKLSAgICBzdGF0ZV8uYnVmZmVyU2l6ZSA9IFtkYXRhIGxlbmd0aF07Ci0gICAgc3RhdGVfLmN1cnJlbnRMaW1pdCA9IHN0YXRlXy5idWZmZXJTaXplOwotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBbYnVmZmVyXyByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnQzMl90KXJlYWRUYWcgewotICByZXR1cm4gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRUYWcoJnN0YXRlXyk7Ci19Ci0KLS0gKHZvaWQpY2hlY2tMYXN0VGFnV2FzOihpbnQzMl90KXZhbHVlIHsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbUNoZWNrTGFzdFRhZ1dhcygmc3RhdGVfLCB2YWx1ZSk7Ci19Ci0KLS0gKEJPT0wpc2tpcEZpZWxkOihpbnQzMl90KXRhZyB7Ci0gIHN3aXRjaCAoR1BCV2lyZUZvcm1hdEdldFRhZ1dpcmVUeXBlKHRhZykpIHsKLSAgICBjYXNlIEdQQldpcmVGb3JtYXRWYXJpbnQ6Ci0gICAgICBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEludDMyKCZzdGF0ZV8pOwotICAgICAgcmV0dXJuIFlFUzsKLSAgICBjYXNlIEdQQldpcmVGb3JtYXRGaXhlZDY0OgotICAgICAgU2tpcFJhd0RhdGEoJnN0YXRlXywgc2l6ZW9mKGludDY0X3QpKTsKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgY2FzZSBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkOgotICAgICAgU2tpcFJhd0RhdGEoJnN0YXRlXywgUmVhZFJhd1ZhcmludDMyKCZzdGF0ZV8pKTsKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgY2FzZSBHUEJXaXJlRm9ybWF0U3RhcnRHcm91cDoKLSAgICAgIFtzZWxmIHNraXBNZXNzYWdlXTsKLSAgICAgIEdQQkNvZGVkSW5wdXRTdHJlYW1DaGVja0xhc3RUYWdXYXMoCi0gICAgICAgICAgJnN0YXRlXywgR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCV2lyZUZvcm1hdEdldFRhZ0ZpZWxkTnVtYmVyKHRhZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCV2lyZUZvcm1hdEVuZEdyb3VwKSk7Ci0gICAgICByZXR1cm4gWUVTOwotICAgIGNhc2UgR1BCV2lyZUZvcm1hdEVuZEdyb3VwOgotICAgICAgcmV0dXJuIE5POwotICAgIGNhc2UgR1BCV2lyZUZvcm1hdEZpeGVkMzI6Ci0gICAgICBTa2lwUmF3RGF0YSgmc3RhdGVfLCBzaXplb2YoaW50MzJfdCkpOwotICAgICAgcmV0dXJuIFlFUzsKLSAgfQotICBbTlNFeGNlcHRpb24gcmFpc2U6TlNQYXJzZUVycm9yRXhjZXB0aW9uIGZvcm1hdDpAIkludmFsaWQgdGFnICVkIiwgdGFnXTsKLSAgcmV0dXJuIE5POwotfQotCi0tICh2b2lkKXNraXBNZXNzYWdlIHsKLSAgd2hpbGUgKFlFUykgewotICAgIGludDMyX3QgdGFnID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRUYWcoJnN0YXRlXyk7Ci0gICAgaWYgKHRhZyA9PSAwIHx8ICFbc2VsZiBza2lwRmllbGQ6dGFnXSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotfQotCi0tIChCT09MKWlzQXRFbmQgewotICByZXR1cm4gR1BCQ29kZWRJbnB1dFN0cmVhbUlzQXRFbmQoJnN0YXRlXyk7Ci19Ci0KLS0gKHNpemVfdClwb3NpdGlvbiB7Ci0gIHJldHVybiBzdGF0ZV8uYnVmZmVyUG9zOwotfQotCi0tIChkb3VibGUpcmVhZERvdWJsZSB7Ci0gIHJldHVybiBHUEJDb2RlZElucHV0U3RyZWFtUmVhZERvdWJsZSgmc3RhdGVfKTsKLX0KLQotLSAoZmxvYXQpcmVhZEZsb2F0IHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRmxvYXQoJnN0YXRlXyk7Ci19Ci0KLS0gKHVpbnQ2NF90KXJlYWRVSW50NjQgewotICByZXR1cm4gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRVSW50NjQoJnN0YXRlXyk7Ci19Ci0KLS0gKGludDY0X3QpcmVhZEludDY0IHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkSW50NjQoJnN0YXRlXyk7Ci19Ci0KLS0gKGludDMyX3QpcmVhZEludDMyIHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkSW50MzIoJnN0YXRlXyk7Ci19Ci0KLS0gKHVpbnQ2NF90KXJlYWRGaXhlZDY0IHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRml4ZWQ2NCgmc3RhdGVfKTsKLX0KLQotLSAodWludDMyX3QpcmVhZEZpeGVkMzIgewotICByZXR1cm4gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRGaXhlZDMyKCZzdGF0ZV8pOwotfQotCi0tIChCT09MKXJlYWRCb29sIHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkQm9vbCgmc3RhdGVfKTsKLX0KLQotLSAoTlNTdHJpbmcgKilyZWFkU3RyaW5nIHsKLSAgcmV0dXJuIFtHUEJDb2RlZElucHV0U3RyZWFtUmVhZFJldGFpbmVkU3RyaW5nKCZzdGF0ZV8pIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAodm9pZClyZWFkR3JvdXA6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgbWVzc2FnZTooR1BCTWVzc2FnZSAqKW1lc3NhZ2UKLSAgICBleHRlbnNpb25SZWdpc3RyeTooR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeSB7Ci0gIGlmIChzdGF0ZV8ucmVjdXJzaW9uRGVwdGggPj0ga0RlZmF1bHRSZWN1cnNpb25MaW1pdCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1BhcnNlRXJyb3JFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJyZWN1cnNpb25EZXB0aCgldHUpID49ICV0dSIsIHN0YXRlXy5yZWN1cnNpb25EZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRSZWN1cnNpb25MaW1pdF07Ci0gIH0KLSAgKytzdGF0ZV8ucmVjdXJzaW9uRGVwdGg7Ci0gIFttZXNzYWdlIG1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06c2VsZiBleHRlbnNpb25SZWdpc3RyeTpleHRlbnNpb25SZWdpc3RyeV07Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1DaGVja0xhc3RUYWdXYXMoCi0gICAgICAmc3RhdGVfLCBHUEJXaXJlRm9ybWF0TWFrZVRhZyhmaWVsZE51bWJlciwgR1BCV2lyZUZvcm1hdEVuZEdyb3VwKSk7Ci0gIC0tc3RhdGVfLnJlY3Vyc2lvbkRlcHRoOwotfQotCi0tICh2b2lkKXJlYWRVbmtub3duR3JvdXA6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgbWVzc2FnZTooR1BCVW5rbm93bkZpZWxkU2V0ICopbWVzc2FnZSB7Ci0gIGlmIChzdGF0ZV8ucmVjdXJzaW9uRGVwdGggPj0ga0RlZmF1bHRSZWN1cnNpb25MaW1pdCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1BhcnNlRXJyb3JFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJyZWN1cnNpb25EZXB0aCgldHUpID49ICV0dSIsIHN0YXRlXy5yZWN1cnNpb25EZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRSZWN1cnNpb25MaW1pdF07Ci0gIH0KLSAgKytzdGF0ZV8ucmVjdXJzaW9uRGVwdGg7Ci0gIFttZXNzYWdlIG1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06c2VsZl07Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1DaGVja0xhc3RUYWdXYXMoCi0gICAgICAmc3RhdGVfLCBHUEJXaXJlRm9ybWF0TWFrZVRhZyhmaWVsZE51bWJlciwgR1BCV2lyZUZvcm1hdEVuZEdyb3VwKSk7Ci0gIC0tc3RhdGVfLnJlY3Vyc2lvbkRlcHRoOwotfQotCi0tICh2b2lkKXJlYWRNZXNzYWdlOihHUEJNZXNzYWdlICopbWVzc2FnZQotICAgIGV4dGVuc2lvblJlZ2lzdHJ5OihHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5IHsKLSAgaW50MzJfdCBsZW5ndGggPSBSZWFkUmF3VmFyaW50MzIoJnN0YXRlXyk7Ci0gIGlmIChzdGF0ZV8ucmVjdXJzaW9uRGVwdGggPj0ga0RlZmF1bHRSZWN1cnNpb25MaW1pdCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU1BhcnNlRXJyb3JFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJyZWN1cnNpb25EZXB0aCgldHUpID49ICV0dSIsIHN0YXRlXy5yZWN1cnNpb25EZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAga0RlZmF1bHRSZWN1cnNpb25MaW1pdF07Ci0gIH0KLSAgc2l6ZV90IG9sZExpbWl0ID0gR1BCQ29kZWRJbnB1dFN0cmVhbVB1c2hMaW1pdCgmc3RhdGVfLCBsZW5ndGgpOwotICArK3N0YXRlXy5yZWN1cnNpb25EZXB0aDsKLSAgW21lc3NhZ2UgbWVyZ2VGcm9tQ29kZWRJbnB1dFN0cmVhbTpzZWxmIGV4dGVuc2lvblJlZ2lzdHJ5OmV4dGVuc2lvblJlZ2lzdHJ5XTsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbUNoZWNrTGFzdFRhZ1dhcygmc3RhdGVfLCAwKTsKLSAgLS1zdGF0ZV8ucmVjdXJzaW9uRGVwdGg7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1Qb3BMaW1pdCgmc3RhdGVfLCBvbGRMaW1pdCk7Ci19Ci0KLS0gKHZvaWQpcmVhZE1hcEVudHJ5OihpZCltYXBEaWN0aW9uYXJ5Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnk6KEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICBmaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQKLSAgICAgICAgcGFyZW50TWVzc2FnZTooR1BCTWVzc2FnZSAqKXBhcmVudE1lc3NhZ2UgewotICBpbnQzMl90IGxlbmd0aCA9IFJlYWRSYXdWYXJpbnQzMigmc3RhdGVfKTsKLSAgaWYgKHN0YXRlXy5yZWN1cnNpb25EZXB0aCA+PSBrRGVmYXVsdFJlY3Vyc2lvbkxpbWl0KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUGFyc2VFcnJvckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAInJlY3Vyc2lvbkRlcHRoKCV0dSkgPj0gJXR1Iiwgc3RhdGVfLnJlY3Vyc2lvbkRlcHRoLAotICAgICAgICAgICAgICAgICAgICAgICBrRGVmYXVsdFJlY3Vyc2lvbkxpbWl0XTsKLSAgfQotICBzaXplX3Qgb2xkTGltaXQgPSBHUEJDb2RlZElucHV0U3RyZWFtUHVzaExpbWl0KCZzdGF0ZV8sIGxlbmd0aCk7Ci0gICsrc3RhdGVfLnJlY3Vyc2lvbkRlcHRoOwotICBHUEJEaWN0aW9uYXJ5UmVhZEVudHJ5KG1hcERpY3Rpb25hcnksIHNlbGYsIGV4dGVuc2lvblJlZ2lzdHJ5LCBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRNZXNzYWdlKTsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbUNoZWNrTGFzdFRhZ1dhcygmc3RhdGVfLCAwKTsKLSAgLS1zdGF0ZV8ucmVjdXJzaW9uRGVwdGg7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1Qb3BMaW1pdCgmc3RhdGVfLCBvbGRMaW1pdCk7Ci19Ci0KLS0gKE5TRGF0YSAqKXJlYWRCeXRlcyB7Ci0gIHJldHVybiBbR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRSZXRhaW5lZEJ5dGVzKCZzdGF0ZV8pIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAodWludDMyX3QpcmVhZFVJbnQzMiB7Ci0gIHJldHVybiBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFVJbnQzMigmc3RhdGVfKTsKLX0KLQotLSAoaW50MzJfdClyZWFkRW51bSB7Ci0gIHJldHVybiBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEVudW0oJnN0YXRlXyk7Ci19Ci0KLS0gKGludDMyX3QpcmVhZFNGaXhlZDMyIHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ZpeGVkMzIoJnN0YXRlXyk7Ci19Ci0KLS0gKGludDY0X3QpcmVhZFNGaXhlZDY0IHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ZpeGVkNjQoJnN0YXRlXyk7Ci19Ci0KLS0gKGludDMyX3QpcmVhZFNJbnQzMiB7Ci0gIHJldHVybiBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNJbnQzMigmc3RhdGVfKTsKLX0KLQotLSAoaW50NjRfdClyZWFkU0ludDY0IHsKLSAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ludDY0KCZzdGF0ZV8pOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkNvZGVkSW5wdXRTdHJlYW1fUGFja2FnZVByaXZhdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQ29kZWRJbnB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGJkMGM5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQ29kZWRJbnB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGhlYWRlciBpcyBwcml2YXRlIHRvIHRoZSBQcm90b2JvbEJ1ZmZlcnMgbGlicmFyeSBhbmQgbXVzdCBOT1QgYmUKLS8vIGluY2x1ZGVkIGJ5IGFueSBzb3VyY2VzIG91dHNpZGUgdGhpcyBsaWJyYXJ5LiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZQotLy8gc3ViamVjdCB0byBjaGFuZ2UgYXQgYW55IHRpbWUgd2l0aG91dCBub3RpY2UuCi0KLSNpbXBvcnQgIkdQQkNvZGVkSW5wdXRTdHJlYW0uaCIKLQotI2ltcG9ydCA8bGlia2Vybi9PU0F0b21pYy5oPgotCi1AY2xhc3MgR1BCVW5rbm93bkZpZWxkU2V0OwotQGNsYXNzIEdQQkZpZWxkRGVzY3JpcHRvcjsKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlIHsKLSAgY29uc3QgdWludDhfdCAqYnl0ZXM7Ci0gIHNpemVfdCBidWZmZXJTaXplOwotICBzaXplX3QgYnVmZmVyUG9zOwotCi0gIC8vIEZvciBwYXJzaW5nIHN1YnNlY3Rpb25zIG9mIGFuIGlucHV0IHN0cmVhbSB5b3UgY2FuIHB1dCBhIGhhcmQgbGltaXQgb24KLSAgLy8gaG93IG11Y2ggc2hvdWxkIGJlIHJlYWQuIE5vcm1hbGx5IHRoZSBsaW1pdCBpcyB0aGUgZW5kIG9mIHRoZSBzdHJlYW0sCi0gIC8vIGJ1dCB5b3UgY2FuIGFkanVzdCBpdCB0byBhbnl3aGVyZSwgYW5kIGlmIHlvdSBoaXQgaXQgeW91IHdpbGwgYmUgYXQgdGhlCi0gIC8vIGVuZCBvZiB0aGUgc3RyZWFtLCB1bnRpbCB5b3UgYWRqdXN0IHRoZSBsaW1pdC4KLSAgc2l6ZV90IGN1cnJlbnRMaW1pdDsKLSAgaW50MzJfdCBsYXN0VGFnOwotICBOU1VJbnRlZ2VyIHJlY3Vyc2lvbkRlcHRoOwotfSBHUEJDb2RlZElucHV0U3RyZWFtU3RhdGU7Ci0KLUBpbnRlcmZhY2UgR1BCQ29kZWRJbnB1dFN0cmVhbSAoKSB7Ci0gQHBhY2thZ2UKLSAgc3RydWN0IEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSBzdGF0ZV87Ci0gIE5TRGF0YSAqYnVmZmVyXzsKLX0KLQotLy8gR3JvdXAgc3VwcG9ydCBpcyBkZXByZWNhdGVkLCBzbyB3ZSBoaWRlIHRoaXMgaW50ZXJmYWNlIGZyb20gdXNlcnMsIGJ1dAotLy8gc3VwcG9ydCBmb3Igb2xkZXIgZGF0YS4KLS0gKHZvaWQpcmVhZEdyb3VwOihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgIG1lc3NhZ2U6KEdQQk1lc3NhZ2UgKiltZXNzYWdlCi0gICAgZXh0ZW5zaW9uUmVnaXN0cnk6KEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLS8vIFJlYWRzIGEgZ3JvdXAgZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtIGFuZCBtZXJnZXMgaXQgaW50byB0aGUgZ2l2ZW4KLS8vIFVua25vd25GaWVsZFNldC4KLS0gKHZvaWQpcmVhZFVua25vd25Hcm91cDooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICBtZXNzYWdlOihHUEJVbmtub3duRmllbGRTZXQgKiltZXNzYWdlOwotCi0vLyBSZWFkcyBhIG1hcCBlbnRyeS4KLS0gKHZvaWQpcmVhZE1hcEVudHJ5OihpZCltYXBEaWN0aW9uYXJ5Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnk6KEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICBmaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQKLSAgICAgICAgcGFyZW50TWVzc2FnZTooR1BCTWVzc2FnZSAqKXBhcmVudE1lc3NhZ2U7Ci1AZW5kCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLWludDMyX3QgR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRUYWcoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSk7Ci0KLWRvdWJsZSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZERvdWJsZShHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKTsKLWZsb2F0IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRmxvYXQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSk7Ci11aW50NjRfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFVJbnQ2NChHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKTsKLXVpbnQzMl90IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkVUludDMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpOwotaW50NjRfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEludDY0KEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpOwotaW50MzJfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEludDMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpOwotdWludDY0X3QgR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRGaXhlZDY0KEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpOwotdWludDMyX3QgR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRGaXhlZDMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpOwotaW50MzJfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEVudW0oR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSk7Ci1pbnQzMl90IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ZpeGVkMzIoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSk7Ci1pbnQ2NF90IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ZpeGVkNjQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSk7Ci1pbnQzMl90IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ludDMyKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpOwotaW50NjRfdCBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNJbnQ2NChHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKTsKLUJPT0wgR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRCb29sKEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUpOwotTlNTdHJpbmcgKkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWRTdHJpbmcoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkKLSAgICBfX2F0dHJpYnV0ZSgobnNfcmV0dXJuc19yZXRhaW5lZCkpOwotTlNEYXRhICpHUEJDb2RlZElucHV0U3RyZWFtUmVhZFJldGFpbmVkQnl0ZXMoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkKLSAgICBfX2F0dHJpYnV0ZSgobnNfcmV0dXJuc19yZXRhaW5lZCkpOwotTlNEYXRhICpHUEJDb2RlZElucHV0U3RyZWFtUmVhZFJldGFpbmVkQnl0ZXNOb0NvcHkoCi0gICAgR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSkgX19hdHRyaWJ1dGUoKG5zX3JldHVybnNfcmV0YWluZWQpKTsKLQotc2l6ZV90IEdQQkNvZGVkSW5wdXRTdHJlYW1QdXNoTGltaXQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlTGltaXQpOwotdm9pZCBHUEJDb2RlZElucHV0U3RyZWFtUG9wTGltaXQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvbGRMaW1pdCk7Ci1zaXplX3QgR1BCQ29kZWRJbnB1dFN0cmVhbUJ5dGVzVW50aWxMaW1pdChHUEJDb2RlZElucHV0U3RyZWFtU3RhdGUgKnN0YXRlKTsKLUJPT0wgR1BCQ29kZWRJbnB1dFN0cmVhbUlzQXRFbmQoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSk7Ci12b2lkIEdQQkNvZGVkSW5wdXRTdHJlYW1DaGVja0xhc3RUYWdXYXMoR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKTsKLQotQ0ZfRVhURVJOX0NfRU5ECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkNvZGVkT3V0cHV0U3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkNvZGVkT3V0cHV0U3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyNzI4ODAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJDb2RlZE91dHB1dFN0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzQ0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotI2ltcG9ydCAiR1BCUnVudGltZVR5cGVzLmgiCi0jaW1wb3J0ICJHUEJXaXJlRm9ybWF0LmgiCi0KLUBjbGFzcyBHUEJCb29sQXJyYXk7Ci1AY2xhc3MgR1BCRG91YmxlQXJyYXk7Ci1AY2xhc3MgR1BCRW51bUFycmF5OwotQGNsYXNzIEdQQkZsb2F0QXJyYXk7Ci1AY2xhc3MgR1BCTWVzc2FnZTsKLUBjbGFzcyBHUEJJbnQzMkFycmF5OwotQGNsYXNzIEdQQkludDY0QXJyYXk7Ci1AY2xhc3MgR1BCVUludDMyQXJyYXk7Ci1AY2xhc3MgR1BCVUludDY0QXJyYXk7Ci1AY2xhc3MgR1BCVW5rbm93bkZpZWxkU2V0OwotCi1OU19BU1NVTUVfTk9OTlVMTF9CRUdJTgotCi0vLy8gV3JpdGVzIG91dCBwcm90b2NvbCBtZXNzYWdlIGZpZWxkcy4KLS8vLwotLy8vIFRoZSBjb21tb24gdXNlcyBvZiBwcm90b2NvbCBidWZmZXJzIHNob3VsZG4ndCBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgotLy8vIEBjIEdQQk1lc3NhZ2UncyBwcm92aWRlIGEgQGMgLWRhdGEgbWV0aG9kIHRoYXQgd2lsbCBzZXJpYWxpemUgdGhlIG1lc3NhZ2UKLS8vLyBmb3IgeW91LgotLy8vCi0vLy8gQG5vdGUgU3ViY2xhc3Npbmcgb2YgR1BCQ29kZWRPdXRwdXRTdHJlYW0gaXMgTk9UIHN1cHBvcnRlZC4KLUBpbnRlcmZhY2UgR1BCQ29kZWRPdXRwdXRTdHJlYW0gOiBOU09iamVjdAotCi0vLy8gQ3JlYXRlcyBhIHN0cmVhbSB0byBmaWxsIGluIHRoZSBnaXZlbiBkYXRhLiBEYXRhIG11c3QgYmUgc2l6ZWQgdG8gZml0IG9yCi0vLy8gYW4gZXJyb3Igd2lsbCBiZSByYWlzZWQgd2hlbiBvdXQgb2Ygc3BhY2UuCi0rIChpbnN0YW5jZXR5cGUpc3RyZWFtV2l0aERhdGE6KE5TTXV0YWJsZURhdGEgKilkYXRhOwotCi0vLy8gQ3JlYXRlcyBhIHN0cmVhbSB0byB3cml0ZSBpbnRvIHRoZSBnaXZlbiBAYyBOU091dHB1dFN0cmVhbS4KLSsgKGluc3RhbmNldHlwZSlzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOihOU091dHB1dFN0cmVhbSAqKW91dHB1dDsKLQotLy8vIEluaXRpYWxpemVzIGEgc3RyZWFtIHRvIGZpbGwgaW4gdGhlIGdpdmVuIGRhdGEuIERhdGEgbXVzdCBiZSBzaXplZCB0byBmaXQKLS8vLyBvciBhbiBlcnJvciB3aWxsIGJlIHJhaXNlZCB3aGVuIG91dCBvZiBzcGFjZS4KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERhdGE6KE5TTXV0YWJsZURhdGEgKilkYXRhOwotCi0vLy8gSW5pdGlhbGl6ZXMgYSBzdHJlYW0gdG8gd3JpdGUgaW50byB0aGUgZ2l2ZW4gQGMgTlNPdXRwdXRTdHJlYW0uCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OwotCi0vLy8gRmx1c2ggYW55IGJ1ZmZlcmVkIGRhdGEgb3V0LgotLSAodm9pZClmbHVzaDsKLQotLy8vIFdyaXRlIHRoZSByYXcgYnl0ZSBvdXQuCi0tICh2b2lkKXdyaXRlUmF3Qnl0ZToodWludDhfdCl2YWx1ZTsKLQotLy8vIFdyaXRlIHRoZSB0YWcgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIgYW5kIHdpcmUgZm9ybWF0LgotLy8vCi0vLy8gQHBhcmFtIGZpZWxkTnVtYmVyIFRoZSBmaWVsZCBudW1iZXIuCi0vLy8gQHBhcmFtIGZvcm1hdCAgICAgIFRoZSB3aXJlIGZvcm1hdCB0aGUgZGF0YSBmb3IgdGhlIGZpZWxkIHdpbGwgYmUgaW4uCi0tICh2b2lkKXdyaXRlVGFnOih1aW50MzJfdClmaWVsZE51bWJlciBmb3JtYXQ6KEdQQldpcmVGb3JtYXQpZm9ybWF0OwotCi0vLy8gV3JpdGUgYSAzMmJpdCB2YWx1ZSBvdXQgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCi0tICh2b2lkKXdyaXRlUmF3TGl0dGxlRW5kaWFuMzI6KGludDMyX3QpdmFsdWU7Ci0vLy8gV3JpdGUgYSA2NGJpdCB2YWx1ZSBvdXQgaW4gbGl0dGxlIGVuZGlhbiBmb3JtYXQuCi0tICh2b2lkKXdyaXRlUmF3TGl0dGxlRW5kaWFuNjQ6KGludDY0X3QpdmFsdWU7Ci0KLS8vLyBXcml0ZSBhIDMyYml0IHZhbHVlIG91dCBpbiB2YXJpbnQgZm9ybWF0LgotLSAodm9pZCl3cml0ZVJhd1ZhcmludDMyOihpbnQzMl90KXZhbHVlOwotLy8vIFdyaXRlIGEgNjRiaXQgdmFsdWUgb3V0IGluIHZhcmludCBmb3JtYXQuCi0tICh2b2lkKXdyaXRlUmF3VmFyaW50NjQ6KGludDY0X3QpdmFsdWU7Ci0KLS8vLyBXcml0ZSBhIHNpemVfdCBvdXQgYXMgYSAzMmJpdCB2YXJpbnQgdmFsdWUuCi0vLy8KLS8vLyBAbm90ZSBUaGlzIHdpbGwgdHJ1bmNhdGUgNjQgYml0IHZhbHVlcyB0byAzMi4KLS0gKHZvaWQpd3JpdGVSYXdWYXJpbnRTaXplVEFzMzI6KHNpemVfdCl2YWx1ZTsKLQotLy8vIFdyaXRlcyB0aGUgY29udGVudHMgb2YgYW4gQGMgTlNEYXRhIG91dC4KLS0gKHZvaWQpd3JpdGVSYXdEYXRhOihOU0RhdGEgKilkYXRhOwotLy8vIFdyaXRlcyBvdXQgdGhlIGdpdmVuIGRhdGEuCi0vLy8KLS8vLyBAcGFyYW0gZGF0YSAgIFRoZSBkYXRhIGJsb2IgdG8gd3JpdGUgb3V0LgotLy8vIEBwYXJhbSBvZmZzZXQgVGhlIG9mZnNldCBpbnRvIHRoZSBibG9iIHRvIHN0YXJ0IHdyaXRpbmcgb3V0LgotLy8vIEBwYXJhbSBsZW5ndGggVGhlIG51bWJlciBvZiBieXRlcyBmcm9tIHRoZSBibG9iIHRvIHdyaXRlIG91dC4KLS0gKHZvaWQpd3JpdGVSYXdQdHI6KGNvbnN0IHZvaWQgKilkYXRhCi0gICAgICAgICAgICAgb2Zmc2V0OihzaXplX3Qpb2Zmc2V0Ci0gICAgICAgICAgICAgbGVuZ3RoOihzaXplX3QpbGVuZ3RoOwotCi0vLyVQRERNLUVYUEFORCBfV1JJVEVfREVDTFMoKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS8vLyBXcml0ZSBhIGRvdWJsZSBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVEb3VibGU6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KGRvdWJsZSl2YWx1ZTsKLS8vLyBXcml0ZSBhIHBhY2tlZCBhcnJheSBvZiBkb3VibGUgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlRG91YmxlQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgIHZhbHVlczooR1BCRG91YmxlQXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8vIFdyaXRlIGEgZG91YmxlIHdpdGhvdXQgYW55IHRhZy4KLS0gKHZvaWQpd3JpdGVEb3VibGVOb1RhZzooZG91YmxlKXZhbHVlOwotCi0vLy8gV3JpdGUgYSBmbG9hdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVGbG9hdDooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooZmxvYXQpdmFsdWU7Ci0vLy8gV3JpdGUgYSBwYWNrZWQgYXJyYXkgb2YgZmxvYXQgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlRmxvYXRBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQkZsb2F0QXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWc7Ci0vLy8gV3JpdGUgYSBmbG9hdCB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlRmxvYXROb1RhZzooZmxvYXQpdmFsdWU7Ci0KLS8vLyBXcml0ZSBhIHVpbnQ2NF90IGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZVVJbnQ2NDooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZToodWludDY0X3QpdmFsdWU7Ci0vLy8gV3JpdGUgYSBwYWNrZWQgYXJyYXkgb2YgdWludDY0X3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlVUludDY0QXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgIHZhbHVlczooR1BCVUludDY0QXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8vIFdyaXRlIGEgdWludDY0X3Qgd2l0aG91dCBhbnkgdGFnLgotLSAodm9pZCl3cml0ZVVJbnQ2NE5vVGFnOih1aW50NjRfdCl2YWx1ZTsKLQotLy8vIFdyaXRlIGEgaW50NjRfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVJbnQ2NDooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooaW50NjRfdCl2YWx1ZTsKLS8vLyBXcml0ZSBhIHBhY2tlZCBhcnJheSBvZiBpbnQ2NF90IGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZUludDY0QXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJJbnQ2NEFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8vIFdyaXRlIGEgaW50NjRfdCB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlSW50NjROb1RhZzooaW50NjRfdCl2YWx1ZTsKLQotLy8vIFdyaXRlIGEgaW50MzJfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVJbnQzMjooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooaW50MzJfdCl2YWx1ZTsKLS8vLyBXcml0ZSBhIHBhY2tlZCBhcnJheSBvZiBpbnQzMl90IGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZUludDMyQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJJbnQzMkFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8vIFdyaXRlIGEgaW50MzJfdCB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlSW50MzJOb1RhZzooaW50MzJfdCl2YWx1ZTsKLQotLy8vIFdyaXRlIGEgdWludDMyX3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlVUludDMyOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOih1aW50MzJfdCl2YWx1ZTsKLS8vLyBXcml0ZSBhIHBhY2tlZCBhcnJheSBvZiB1aW50MzJfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVVSW50MzJBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJVSW50MzJBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWc7Ci0vLy8gV3JpdGUgYSB1aW50MzJfdCB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlVUludDMyTm9UYWc6KHVpbnQzMl90KXZhbHVlOwotCi0vLy8gV3JpdGUgYSB1aW50NjRfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVGaXhlZDY0OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOih1aW50NjRfdCl2YWx1ZTsKLS8vLyBXcml0ZSBhIHBhY2tlZCBhcnJheSBvZiB1aW50NjRfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVGaXhlZDY0QXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQlVJbnQ2NEFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWc7Ci0vLy8gV3JpdGUgYSB1aW50NjRfdCB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlRml4ZWQ2NE5vVGFnOih1aW50NjRfdCl2YWx1ZTsKLQotLy8vIFdyaXRlIGEgdWludDMyX3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlRml4ZWQzMjooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZToodWludDMyX3QpdmFsdWU7Ci0vLy8gV3JpdGUgYSBwYWNrZWQgYXJyYXkgb2YgdWludDMyX3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlRml4ZWQzMkFycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJVSW50MzJBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8vIFdyaXRlIGEgdWludDMyX3Qgd2l0aG91dCBhbnkgdGFnLgotLSAodm9pZCl3cml0ZUZpeGVkMzJOb1RhZzoodWludDMyX3QpdmFsdWU7Ci0KLS8vLyBXcml0ZSBhIGludDMyX3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlU0ludDMyOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihpbnQzMl90KXZhbHVlOwotLy8vIFdyaXRlIGEgcGFja2VkIGFycmF5IG9mIGludDMyX3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlU0ludDMyQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgIHZhbHVlczooR1BCSW50MzJBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWc7Ci0vLy8gV3JpdGUgYSBpbnQzMl90IHdpdGhvdXQgYW55IHRhZy4KLS0gKHZvaWQpd3JpdGVTSW50MzJOb1RhZzooaW50MzJfdCl2YWx1ZTsKLQotLy8vIFdyaXRlIGEgaW50NjRfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVTSW50NjQ6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KGludDY0X3QpdmFsdWU7Ci0vLy8gV3JpdGUgYSBwYWNrZWQgYXJyYXkgb2YgaW50NjRfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVTSW50NjRBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJJbnQ2NEFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0YWc6KHVpbnQzMl90KXRhZzsKLS8vLyBXcml0ZSBhIGludDY0X3Qgd2l0aG91dCBhbnkgdGFnLgotLSAodm9pZCl3cml0ZVNJbnQ2NE5vVGFnOihpbnQ2NF90KXZhbHVlOwotCi0vLy8gV3JpdGUgYSBpbnQ2NF90IGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZVNGaXhlZDY0OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihpbnQ2NF90KXZhbHVlOwotLy8vIFdyaXRlIGEgcGFja2VkIGFycmF5IG9mIGludDY0X3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlU0ZpeGVkNjRBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQkludDY0QXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWc7Ci0vLy8gV3JpdGUgYSBpbnQ2NF90IHdpdGhvdXQgYW55IHRhZy4KLS0gKHZvaWQpd3JpdGVTRml4ZWQ2NE5vVGFnOihpbnQ2NF90KXZhbHVlOwotCi0vLy8gV3JpdGUgYSBpbnQzMl90IGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZVNGaXhlZDMyOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihpbnQzMl90KXZhbHVlOwotLy8vIFdyaXRlIGEgcGFja2VkIGFycmF5IG9mIGludDMyX3QgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlU0ZpeGVkMzJBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQkludDMyQXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWc7Ci0vLy8gV3JpdGUgYSBpbnQzMl90IHdpdGhvdXQgYW55IHRhZy4KLS0gKHZvaWQpd3JpdGVTRml4ZWQzMk5vVGFnOihpbnQzMl90KXZhbHVlOwotCi0vLy8gV3JpdGUgYSBCT09MIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZUJvb2w6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KEJPT0wpdmFsdWU7Ci0vLy8gV3JpdGUgYSBwYWNrZWQgYXJyYXkgb2YgQk9PTCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVCb29sQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQkJvb2xBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8vIFdyaXRlIGEgQk9PTCB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlQm9vbE5vVGFnOihCT09MKXZhbHVlOwotCi0vLy8gV3JpdGUgYSBpbnQzMl90IGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZUVudW06KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KGludDMyX3QpdmFsdWU7Ci0vLy8gV3JpdGUgYSBwYWNrZWQgYXJyYXkgb2YgaW50MzJfdCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVFbnVtQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQkVudW1BcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8vIFdyaXRlIGEgaW50MzJfdCB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlRW51bU5vVGFnOihpbnQzMl90KXZhbHVlOwotCi0vLy8gV3JpdGUgYSBOU1N0cmluZyBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS0gKHZvaWQpd3JpdGVTdHJpbmc6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KE5TU3RyaW5nICopdmFsdWU7Ci0vLy8gV3JpdGUgYW4gYXJyYXkgb2YgTlNTdHJpbmcgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlU3RyaW5nQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWVzOihOU0FycmF5PE5TU3RyaW5nKj4gKil2YWx1ZXM7Ci0vLy8gV3JpdGUgYSBOU1N0cmluZyB3aXRob3V0IGFueSB0YWcuCi0tICh2b2lkKXdyaXRlU3RyaW5nTm9UYWc6KE5TU3RyaW5nICopdmFsdWU7Ci0KLS8vLyBXcml0ZSBhIEdQQk1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlTWVzc2FnZTooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooR1BCTWVzc2FnZSAqKXZhbHVlOwotLy8vIFdyaXRlIGFuIGFycmF5IG9mIEdQQk1lc3NhZ2UgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlTWVzc2FnZUFycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlczooTlNBcnJheTxHUEJNZXNzYWdlKj4gKil2YWx1ZXM7Ci0vLy8gV3JpdGUgYSBHUEJNZXNzYWdlIHdpdGhvdXQgYW55IHRhZy4KLS0gKHZvaWQpd3JpdGVNZXNzYWdlTm9UYWc6KEdQQk1lc3NhZ2UgKil2YWx1ZTsKLQotLy8vIFdyaXRlIGEgTlNEYXRhIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZUJ5dGVzOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihOU0RhdGEgKil2YWx1ZTsKLS8vLyBXcml0ZSBhbiBhcnJheSBvZiBOU0RhdGEgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlQnl0ZXNBcnJheTooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZXM6KE5TQXJyYXk8TlNEYXRhKj4gKil2YWx1ZXM7Ci0vLy8gV3JpdGUgYSBOU0RhdGEgd2l0aG91dCBhbnkgdGFnLgotLSAodm9pZCl3cml0ZUJ5dGVzTm9UYWc6KE5TRGF0YSAqKXZhbHVlOwotCi0vLy8gV3JpdGUgYSBHUEJNZXNzYWdlIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZUdyb3VwOihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgdmFsdWU6KEdQQk1lc3NhZ2UgKil2YWx1ZTsKLS8vLyBXcml0ZSBhbiBhcnJheSBvZiBHUEJNZXNzYWdlIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLSAodm9pZCl3cml0ZUdyb3VwQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWVzOihOU0FycmF5PEdQQk1lc3NhZ2UqPiAqKXZhbHVlczsKLS8vLyBXcml0ZSBhIEdQQk1lc3NhZ2Ugd2l0aG91dCBhbnkgdGFnIChidXQgZG9lcyB3cml0ZSB0aGUgZW5kR3JvdXAgdGFnKS4KLS0gKHZvaWQpd3JpdGVHcm91cE5vVGFnOihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICB2YWx1ZTooR1BCTWVzc2FnZSAqKXZhbHVlOwotCi0vLy8gV3JpdGUgYSBHUEJVbmtub3duRmllbGRTZXQgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlVW5rbm93bkdyb3VwOihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOihHUEJVbmtub3duRmllbGRTZXQgKil2YWx1ZTsKLS8vLyBXcml0ZSBhbiBhcnJheSBvZiBHUEJVbmtub3duRmllbGRTZXQgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tICh2b2lkKXdyaXRlVW5rbm93bkdyb3VwQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWVzOihOU0FycmF5PEdQQlVua25vd25GaWVsZFNldCo+ICopdmFsdWVzOwotLy8vIFdyaXRlIGEgR1BCVW5rbm93bkZpZWxkU2V0IHdpdGhvdXQgYW55IHRhZyAoYnV0IGRvZXMgd3JpdGUgdGhlIGVuZEdyb3VwIHRhZykuCi0tICh2b2lkKXdyaXRlVW5rbm93bkdyb3VwTm9UYWc6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTooR1BCVW5rbm93bkZpZWxkU2V0ICopdmFsdWU7Ci0KLS8vJVBERE0tRVhQQU5ELUVORCBfV1JJVEVfREVDTFMoKQotCi0vLy8gV3JpdGUgYSBNZXNzYWdlU2V0IGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgc3RyZWFtLiBGb3IgaGlzdG9yaWNhbCByZWFzb25zLAotLy8vIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KLS0gKHZvaWQpd3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihHUEJNZXNzYWdlICopdmFsdWU7Ci0KLS8vLyBXcml0ZSBhbiB1bnBhcnNlZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgc3RyZWFtLiBGb3IKLS8vLyBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KLS0gKHZvaWQpd3JpdGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihOU0RhdGEgKil2YWx1ZTsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKLQotLy8gV3JpdGUgbWV0aG9kcyBmb3IgdHlwZXMgdGhhdCBjYW4gYmUgaW4gcGFja2VkIGFycmF5cy4KLS8vJVBERE0tREVGSU5FIF9XUklURV9QQUNLQUJMRV9ERUNMUyhOQU1FLCBBUlJBWV9UWVBFLCBUWVBFKQotLy8lLy8vIFdyaXRlIGEgVFlQRSBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS8vJS0gKHZvaWQpd3JpdGUjI05BTUU6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KFRZUEUpdmFsdWU7Ci0vLyUvLy8gV3JpdGUgYSBwYWNrZWQgYXJyYXkgb2YgVFlQRSBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS8vJS0gKHZvaWQpd3JpdGUjI05BTUUjI0FycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyCi0vLyUgICAgICAgTkFNRSRTICAgICB2YWx1ZXM6KEdQQiMjQVJSQVlfVFlQRSMjQXJyYXkgKil2YWx1ZXMKLS8vJSAgICAgICBOQU1FJFMgICAgICAgIHRhZzoodWludDMyX3QpdGFnOwotLy8lLy8vIFdyaXRlIGEgVFlQRSB3aXRob3V0IGFueSB0YWcuCi0vLyUtICh2b2lkKXdyaXRlIyNOQU1FIyNOb1RhZzooVFlQRSl2YWx1ZTsKLS8vJQotLy8gV3JpdGUgbWV0aG9kcyBmb3IgdHlwZXMgdGhhdCBhcmVuJ3QgaW4gcGFja2VkIGFycmF5cy4KLS8vJVBERE0tREVGSU5FIF9XUklURV9VTlBBQ0tBQkxFX0RFQ0xTKE5BTUUsIFRZUEUpCi0vLyUvLy8gV3JpdGUgYSBUWVBFIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotLy8lLSAodm9pZCl3cml0ZSMjTkFNRTooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooVFlQRSAqKXZhbHVlOwotLy8lLy8vIFdyaXRlIGFuIGFycmF5IG9mIFRZUEUgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0vLyUtICh2b2lkKXdyaXRlIyNOQU1FIyNBcnJheTooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZXM6KE5TQXJyYXk8IyNUWVBFIyMqPiAqKXZhbHVlczsKLS8vJS8vLyBXcml0ZSBhIFRZUEUgd2l0aG91dCBhbnkgdGFnLgotLy8lLSAodm9pZCl3cml0ZSMjTkFNRSMjTm9UYWc6KFRZUEUgKil2YWx1ZTsKLS8vJQotLy8gU3BlY2lhbCB3cml0ZSBtZXRob2RzIGZvciBHcm91cHMuCi0vLyVQRERNLURFRklORSBfV1JJVEVfR1JPVVBfREVDTFMoTkFNRSwgVFlQRSkKLS8vJS8vLyBXcml0ZSBhIFRZUEUgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0vLyUtICh2b2lkKXdyaXRlIyNOQU1FOihpbnQzMl90KWZpZWxkTnVtYmVyCi0vLyUgICAgICAgTkFNRSRTIHZhbHVlOihUWVBFICopdmFsdWU7Ci0vLyUvLy8gV3JpdGUgYW4gYXJyYXkgb2YgVFlQRSBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS8vJS0gKHZvaWQpd3JpdGUjI05BTUUjI0FycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlczooTlNBcnJheTwjI1RZUEUjIyo+ICopdmFsdWVzOwotLy8lLy8vIFdyaXRlIGEgVFlQRSB3aXRob3V0IGFueSB0YWcgKGJ1dCBkb2VzIHdyaXRlIHRoZSBlbmRHcm91cCB0YWcpLgotLy8lLSAodm9pZCl3cml0ZSMjTkFNRSMjTm9UYWc6KGludDMyX3QpZmllbGROdW1iZXIKLS8vJSAgICAgICAgICAgIE5BTUUkUyB2YWx1ZTooVFlQRSAqKXZhbHVlOwotLy8lCi0KLS8vIE9uZSBtYWNybyB0byBoaWRlIGl0IGFsbCB1cCBhYm92ZS4KLS8vJVBERE0tREVGSU5FIF9XUklURV9ERUNMUygpCi0vLyVfV1JJVEVfUEFDS0FCTEVfREVDTFMoRG91YmxlLCBEb3VibGUsIGRvdWJsZSkKLS8vJV9XUklURV9QQUNLQUJMRV9ERUNMUyhGbG9hdCwgRmxvYXQsIGZsb2F0KQotLy8lX1dSSVRFX1BBQ0tBQkxFX0RFQ0xTKFVJbnQ2NCwgVUludDY0LCB1aW50NjRfdCkKLS8vJV9XUklURV9QQUNLQUJMRV9ERUNMUyhJbnQ2NCwgSW50NjQsIGludDY0X3QpCi0vLyVfV1JJVEVfUEFDS0FCTEVfREVDTFMoSW50MzIsIEludDMyLCBpbnQzMl90KQotLy8lX1dSSVRFX1BBQ0tBQkxFX0RFQ0xTKFVJbnQzMiwgVUludDMyLCB1aW50MzJfdCkKLS8vJV9XUklURV9QQUNLQUJMRV9ERUNMUyhGaXhlZDY0LCBVSW50NjQsIHVpbnQ2NF90KQotLy8lX1dSSVRFX1BBQ0tBQkxFX0RFQ0xTKEZpeGVkMzIsIFVJbnQzMiwgdWludDMyX3QpCi0vLyVfV1JJVEVfUEFDS0FCTEVfREVDTFMoU0ludDMyLCBJbnQzMiwgaW50MzJfdCkKLS8vJV9XUklURV9QQUNLQUJMRV9ERUNMUyhTSW50NjQsIEludDY0LCBpbnQ2NF90KQotLy8lX1dSSVRFX1BBQ0tBQkxFX0RFQ0xTKFNGaXhlZDY0LCBJbnQ2NCwgaW50NjRfdCkKLS8vJV9XUklURV9QQUNLQUJMRV9ERUNMUyhTRml4ZWQzMiwgSW50MzIsIGludDMyX3QpCi0vLyVfV1JJVEVfUEFDS0FCTEVfREVDTFMoQm9vbCwgQm9vbCwgQk9PTCkKLS8vJV9XUklURV9QQUNLQUJMRV9ERUNMUyhFbnVtLCBFbnVtLCBpbnQzMl90KQotLy8lX1dSSVRFX1VOUEFDS0FCTEVfREVDTFMoU3RyaW5nLCBOU1N0cmluZykKLS8vJV9XUklURV9VTlBBQ0tBQkxFX0RFQ0xTKE1lc3NhZ2UsIEdQQk1lc3NhZ2UpCi0vLyVfV1JJVEVfVU5QQUNLQUJMRV9ERUNMUyhCeXRlcywgTlNEYXRhKQotLy8lX1dSSVRFX0dST1VQX0RFQ0xTKEdyb3VwLCBHUEJNZXNzYWdlKQotLy8lX1dSSVRFX0dST1VQX0RFQ0xTKFVua25vd25Hcm91cCwgR1BCVW5rbm93bkZpZWxkU2V0KQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJDb2RlZE91dHB1dFN0cmVhbS5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJDb2RlZE91dHB1dFN0cmVhbS5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZDllZDY2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQ29kZWRPdXRwdXRTdHJlYW0ubQorKysgL2Rldi9udWxsCkBAIC0xLDEyMjEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQkNvZGVkT3V0cHV0U3RyZWFtX1BhY2thZ2VQcml2YXRlLmgiCi0KLSNpbXBvcnQgPG1hY2gvdm1fcGFyYW0uaD4KLQotI2ltcG9ydCAiR1BCQXJyYXkuaCIKLSNpbXBvcnQgIkdQQlVua25vd25GaWVsZFNldF9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCVXRpbGl0aWVzX1BhY2thZ2VQcml2YXRlLmgiCi0KLS8vIFN0cnVjdHVyZSBmb3IgY29udGFpbmluZyBzdGF0ZSBvZiBhIEdQQkNvZGVkSW5wdXRTdHJlYW0uIEJyb3VnaHQgb3V0IGludG8KLS8vIGEgc3RydWN0IHNvIHRoYXQgd2UgY2FuIGlubGluZSBzZXZlcmFsIGNvbW1vbiBmdW5jdGlvbnMgaW5zdGVhZCBvZiBkZWFsaW5nCi0vLyB3aXRoIG92ZXJoZWFkIG9mIE9iakMgZGlzcGF0Y2guCi10eXBlZGVmIHN0cnVjdCBHUEJPdXRwdXRCdWZmZXJTdGF0ZSB7Ci0gIHVpbnQ4X3QgKmJ5dGVzOwotICBzaXplX3Qgc2l6ZTsKLSAgc2l6ZV90IHBvc2l0aW9uOwotICBOU091dHB1dFN0cmVhbSAqb3V0cHV0OwotfSBHUEJPdXRwdXRCdWZmZXJTdGF0ZTsKLQotQGltcGxlbWVudGF0aW9uIEdQQkNvZGVkT3V0cHV0U3RyZWFtIHsKLSAgR1BCT3V0cHV0QnVmZmVyU3RhdGUgc3RhdGVfOwotICBOU011dGFibGVEYXRhICpidWZmZXJfOwotfQotCi1zdGF0aWMgY29uc3QgaW50MzJfdCBMSVRUTEVfRU5ESUFOXzMyX1NJWkUgPSBzaXplb2YodWludDMyX3QpOwotc3RhdGljIGNvbnN0IGludDMyX3QgTElUVExFX0VORElBTl82NF9TSVpFID0gc2l6ZW9mKHVpbnQ2NF90KTsKLQotLy8gSW50ZXJuYWwgaGVscGVyIHRoYXQgd3JpdGVzIHRoZSBjdXJyZW50IGJ1ZmZlciB0byB0aGUgb3V0cHV0LiBUaGUKLS8vIGJ1ZmZlciBwb3NpdGlvbiBpcyByZXNldCB0byBpdHMgaW5pdGlhbCB2YWx1ZSB3aGVuIHRoaXMgcmV0dXJucy4KLXN0YXRpYyB2b2lkIEdQQlJlZnJlc2hCdWZmZXIoR1BCT3V0cHV0QnVmZmVyU3RhdGUgKnN0YXRlKSB7Ci0gIGlmIChzdGF0ZS0+b3V0cHV0ID09IG5pbCkgewotICAgIC8vIFdlJ3JlIHdyaXRpbmcgdG8gYSBzaW5nbGUgYnVmZmVyLgotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpAIk91dE9mU3BhY2UiIGZvcm1hdDpAIiJdOwotICB9Ci0gIGlmIChzdGF0ZS0+cG9zaXRpb24gIT0gMCkgewotICAgIE5TSW50ZWdlciB3cml0dGVuID0KLSAgICAgICAgW3N0YXRlLT5vdXRwdXQgd3JpdGU6c3RhdGUtPmJ5dGVzIG1heExlbmd0aDpzdGF0ZS0+cG9zaXRpb25dOwotICAgIGlmICh3cml0dGVuICE9IChOU0ludGVnZXIpc3RhdGUtPnBvc2l0aW9uKSB7Ci0gICAgICBbTlNFeGNlcHRpb24gcmFpc2U6QCJXcml0ZUZhaWxlZCIgZm9ybWF0OkAiIl07Ci0gICAgfQotICAgIHN0YXRlLT5wb3NpdGlvbiA9IDA7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgR1BCV3JpdGVSYXdCeXRlKEdQQk91dHB1dEJ1ZmZlclN0YXRlICpzdGF0ZSwgdWludDhfdCB2YWx1ZSkgewotICBpZiAoc3RhdGUtPnBvc2l0aW9uID09IHN0YXRlLT5zaXplKSB7Ci0gICAgR1BCUmVmcmVzaEJ1ZmZlcihzdGF0ZSk7Ci0gIH0KLSAgc3RhdGUtPmJ5dGVzW3N0YXRlLT5wb3NpdGlvbisrXSA9IHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCBHUEJXcml0ZVJhd1ZhcmludDMyKEdQQk91dHB1dEJ1ZmZlclN0YXRlICpzdGF0ZSwgaW50MzJfdCB2YWx1ZSkgewotICB3aGlsZSAoWUVTKSB7Ci0gICAgaWYgKCh2YWx1ZSAmIH4weDdGKSA9PSAwKSB7Ci0gICAgICB1aW50OF90IHZhbCA9ICh1aW50OF90KXZhbHVlOwotICAgICAgR1BCV3JpdGVSYXdCeXRlKHN0YXRlLCB2YWwpOwotICAgICAgcmV0dXJuOwotICAgIH0gZWxzZSB7Ci0gICAgICBHUEJXcml0ZVJhd0J5dGUoc3RhdGUsICh2YWx1ZSAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICB2YWx1ZSA9IEdQQkxvZ2ljYWxSaWdodFNoaWZ0MzIodmFsdWUsIDcpOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBHUEJXcml0ZVJhd1ZhcmludDY0KEdQQk91dHB1dEJ1ZmZlclN0YXRlICpzdGF0ZSwgaW50NjRfdCB2YWx1ZSkgewotICB3aGlsZSAoWUVTKSB7Ci0gICAgaWYgKCh2YWx1ZSAmIH4weDdGTCkgPT0gMCkgewotICAgICAgdWludDhfdCB2YWwgPSAodWludDhfdCl2YWx1ZTsKLSAgICAgIEdQQldyaXRlUmF3Qnl0ZShzdGF0ZSwgdmFsKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgewotICAgICAgR1BCV3JpdGVSYXdCeXRlKHN0YXRlLCAoKGludDMyX3QpdmFsdWUgJiAweDdGKSB8IDB4ODApOwotICAgICAgdmFsdWUgPSBHUEJMb2dpY2FsUmlnaHRTaGlmdDY0KHZhbHVlLCA3KTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgR1BCV3JpdGVJbnQzMk5vVGFnKEdQQk91dHB1dEJ1ZmZlclN0YXRlICpzdGF0ZSwgaW50MzJfdCB2YWx1ZSkgewotICBpZiAodmFsdWUgPj0gMCkgewotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoc3RhdGUsIHZhbHVlKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kCi0gICAgR1BCV3JpdGVSYXdWYXJpbnQ2NChzdGF0ZSwgdmFsdWUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEdQQldyaXRlVUludDMyKEdQQk91dHB1dEJ1ZmZlclN0YXRlICpzdGF0ZSwgaW50MzJfdCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlKSB7Ci0gIEdQQldyaXRlVGFnV2l0aEZvcm1hdChzdGF0ZSwgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRWYXJpbnQpOwotICBHUEJXcml0ZVJhd1ZhcmludDMyKHN0YXRlLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIEdQQldyaXRlVGFnV2l0aEZvcm1hdChHUEJPdXRwdXRCdWZmZXJTdGF0ZSAqc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXQgZm9ybWF0KSB7Ci0gIEdQQldyaXRlUmF3VmFyaW50MzIoc3RhdGUsIEdQQldpcmVGb3JtYXRNYWtlVGFnKGZpZWxkTnVtYmVyLCBmb3JtYXQpKTsKLX0KLQotc3RhdGljIHZvaWQgR1BCV3JpdGVSYXdMaXR0bGVFbmRpYW4zMihHUEJPdXRwdXRCdWZmZXJTdGF0ZSAqc3RhdGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIHsKLSAgR1BCV3JpdGVSYXdCeXRlKHN0YXRlLCAodmFsdWUpJjB4RkYpOwotICBHUEJXcml0ZVJhd0J5dGUoc3RhdGUsICh2YWx1ZSA+PiA4KSAmIDB4RkYpOwotICBHUEJXcml0ZVJhd0J5dGUoc3RhdGUsICh2YWx1ZSA+PiAxNikgJiAweEZGKTsKLSAgR1BCV3JpdGVSYXdCeXRlKHN0YXRlLCAodmFsdWUgPj4gMjQpICYgMHhGRik7Ci19Ci0KLXN0YXRpYyB2b2lkIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuNjQoR1BCT3V0cHV0QnVmZmVyU3RhdGUgKnN0YXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlKSB7Ci0gIEdQQldyaXRlUmF3Qnl0ZShzdGF0ZSwgKGludDMyX3QpKHZhbHVlKSYweEZGKTsKLSAgR1BCV3JpdGVSYXdCeXRlKHN0YXRlLCAoaW50MzJfdCkodmFsdWUgPj4gOCkgJiAweEZGKTsKLSAgR1BCV3JpdGVSYXdCeXRlKHN0YXRlLCAoaW50MzJfdCkodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0gIEdQQldyaXRlUmF3Qnl0ZShzdGF0ZSwgKGludDMyX3QpKHZhbHVlID4+IDI0KSAmIDB4RkYpOwotICBHUEJXcml0ZVJhd0J5dGUoc3RhdGUsIChpbnQzMl90KSh2YWx1ZSA+PiAzMikgJiAweEZGKTsKLSAgR1BCV3JpdGVSYXdCeXRlKHN0YXRlLCAoaW50MzJfdCkodmFsdWUgPj4gNDApICYgMHhGRik7Ci0gIEdQQldyaXRlUmF3Qnl0ZShzdGF0ZSwgKGludDMyX3QpKHZhbHVlID4+IDQ4KSAmIDB4RkYpOwotICBHUEJXcml0ZVJhd0J5dGUoc3RhdGUsIChpbnQzMl90KSh2YWx1ZSA+PiA1NikgJiAweEZGKTsKLX0KLQotI2lmIERFQlVHICYmICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0rICh2b2lkKWxvYWQgewotICAvLyBUaGlzIHRlc3QgZXhpc3RzIHRvIHZlcmlmeSB0aGF0IENGU3RyaW5ncyB3aXRoIGVtYmVkZGVkIE5VTExzIHdpbGwgd29yawotICAvLyBmb3IgdXMuIElmIHRoaXMgQXNzZXJ0IGZhaWxzLCBhbGwgY29kZSBiZWxvdyB0aGF0IGRlcGVuZHMgb24KLSAgLy8gQ0ZTdHJpbmdHZXRDU3RyaW5nUHRyIHdpbGwgTk9UIHdvcmsgcHJvcGVybHkgb24gc3RyaW5ncyB0aGF0IGNvbnRhaW4KLSAgLy8gZW1iZWRkZWQgTlVMTHMsIGFuZCB3ZSBkbyBnZXQgdGhhdCBpbiBzb21lIHByb3RvYnVmcy4KLSAgLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBub3QgYmUgY29tcGlsZWQgaW4gcmVsZWFzZS4KLSAgLy8gV2UgZGlkbid0IGZlZWwgdGhhdCBqdXN0IGtlZXBpbmcgaXQgaW4gYSB1bml0IHRlc3Qgd2FzIHN1ZmZpY2llbnQgYmVjYXVzZQotICAvLyB0aGUgUHJvdG9idWYgdW5pdCB0ZXN0cyBhcmUgb25seSBydW4gd2hlbiBzb21lYm9keSBpcyBhY3R1YWxseSB3b3JraW5nCi0gIC8vIG9uIHByb3RvYnVmcy4KLSAgQ0ZTdHJpbmdSZWYgemVyb1Rlc3QgPSBDRlNUUigiVGVzdFwwU3RyaW5nIik7Ci0gIGNvbnN0IGNoYXIgKmNTdHJpbmcgPSBDRlN0cmluZ0dldENTdHJpbmdQdHIoemVyb1Rlc3QsIGtDRlN0cmluZ0VuY29kaW5nVVRGOCk7Ci0gIE5TQXNzZXJ0KGNTdHJpbmcgPT0gTlVMTCwgQCJTZXJpb3VzIEVycm9yIik7Ci19Ci0jZW5kaWYgIC8vIERFQlVHICYmICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIFtzZWxmIGZsdXNoXTsKLSAgW3N0YXRlXy5vdXRwdXQgY2xvc2VdOwotICBbc3RhdGVfLm91dHB1dCByZWxlYXNlXTsKLSAgW2J1ZmZlcl8gcmVsZWFzZV07Ci0KLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0IHsKLSAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOlBBR0VfU0laRV07Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aE91dHB1dFN0cmVhbTpvdXRwdXQgZGF0YTpkYXRhXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGF0YTooTlNNdXRhYmxlRGF0YSAqKWRhdGEgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhPdXRwdXRTdHJlYW06bmlsIGRhdGE6ZGF0YV07Ci19Ci0KLS8vIFRoaXMgaW5pdGlhbGl6ZXIgaXNuJ3QgZXhwb3NlZCwgYnV0IGl0IGlzIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLgotLy8gU2V0dGluZyBPdXRwdXRTdHJlYW0gYW5kIE5TRGF0YSBpcyB0byBjb250cm9sIHRoZSBidWZmZXJpbmcgYmVoYXZpb3Ivc2l6ZQotLy8gb2YgdGhlIHdvcmssIGJ1dCB0aGF0IGlzIG1vcmUgb2J2aW91cyB2aWEgdGhlIGJ1ZmZlclNpemU6IHZlcnNpb24uCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGE6KE5TTXV0YWJsZURhdGEgKilkYXRhIHsKLSAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgewotICAgIGJ1ZmZlcl8gPSBbZGF0YSByZXRhaW5dOwotICAgIFtvdXRwdXQgb3Blbl07Ci0gICAgc3RhdGVfLmJ5dGVzID0gW2RhdGEgbXV0YWJsZUJ5dGVzXTsKLSAgICBzdGF0ZV8uc2l6ZSA9IFtkYXRhIGxlbmd0aF07Ci0gICAgc3RhdGVfLm91dHB1dCA9IFtvdXRwdXQgcmV0YWluXTsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKXN0cmVhbVdpdGhPdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0IHsKLSAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOlBBR0VfU0laRV07Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aE91dHB1dFN0cmVhbTpvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhOmRhdGFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKXN0cmVhbVdpdGhEYXRhOihOU011dGFibGVEYXRhICopZGF0YSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV0gYXV0b3JlbGVhc2VdOwotfQotCi0tICh2b2lkKXdyaXRlRG91YmxlTm9UYWc6KGRvdWJsZSl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuNjQoJnN0YXRlXywgR1BCQ29udmVydERvdWJsZVRvSW50NjQodmFsdWUpKTsKLX0KLQotLSAodm9pZCl3cml0ZURvdWJsZTooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooZG91YmxlKXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0Rml4ZWQ2NCk7Ci0gIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuNjQoJnN0YXRlXywgR1BCQ29udmVydERvdWJsZVRvSW50NjQodmFsdWUpKTsKLX0KLQotLSAodm9pZCl3cml0ZUZsb2F0Tm9UYWc6KGZsb2F0KXZhbHVlIHsKLSAgR1BCV3JpdGVSYXdMaXR0bGVFbmRpYW4zMigmc3RhdGVfLCBHUEJDb252ZXJ0RmxvYXRUb0ludDMyKHZhbHVlKSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVGbG9hdDooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooZmxvYXQpdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRGaXhlZDMyKTsKLSAgR1BCV3JpdGVSYXdMaXR0bGVFbmRpYW4zMigmc3RhdGVfLCBHUEJDb252ZXJ0RmxvYXRUb0ludDMyKHZhbHVlKSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVVSW50NjROb1RhZzoodWludDY0X3QpdmFsdWUgewotICBHUEJXcml0ZVJhd1ZhcmludDY0KCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZVVJbnQ2NDooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZToodWludDY0X3QpdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRWYXJpbnQpOwotICBHUEJXcml0ZVJhd1ZhcmludDY0KCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZUludDY0Tm9UYWc6KGludDY0X3QpdmFsdWUgewotICBHUEJXcml0ZVJhd1ZhcmludDY0KCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZUludDY0OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihpbnQ2NF90KXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0VmFyaW50KTsKLSAgR1BCV3JpdGVSYXdWYXJpbnQ2NCgmc3RhdGVfLCB2YWx1ZSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KXZhbHVlIHsKLSAgR1BCV3JpdGVJbnQzMk5vVGFnKCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZUludDMyOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihpbnQzMl90KXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0VmFyaW50KTsKLSAgR1BCV3JpdGVJbnQzMk5vVGFnKCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZUZpeGVkNjROb1RhZzoodWludDY0X3QpdmFsdWUgewotICBHUEJXcml0ZVJhd0xpdHRsZUVuZGlhbjY0KCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZUZpeGVkNjQ6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KHVpbnQ2NF90KXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0Rml4ZWQ2NCk7Ci0gIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuNjQoJnN0YXRlXywgdmFsdWUpOwotfQotCi0tICh2b2lkKXdyaXRlRml4ZWQzMk5vVGFnOih1aW50MzJfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuMzIoJnN0YXRlXywgdmFsdWUpOwotfQotCi0tICh2b2lkKXdyaXRlRml4ZWQzMjooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZToodWludDMyX3QpdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRGaXhlZDMyKTsKLSAgR1BCV3JpdGVSYXdMaXR0bGVFbmRpYW4zMigmc3RhdGVfLCB2YWx1ZSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVCb29sTm9UYWc6KEJPT0wpdmFsdWUgewotICBHUEJXcml0ZVJhd0J5dGUoJnN0YXRlXywgKHZhbHVlID8gMSA6IDApKTsKLX0KLQotLSAodm9pZCl3cml0ZUJvb2w6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KEJPT0wpdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRWYXJpbnQpOwotICBHUEJXcml0ZVJhd0J5dGUoJnN0YXRlXywgKHZhbHVlID8gMSA6IDApKTsKLX0KLQotLSAodm9pZCl3cml0ZVN0cmluZ05vVGFnOihjb25zdCBOU1N0cmluZyAqKXZhbHVlIHsKLSAgLy8gSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgZW1iZWRkZWQgTlVMTHMgc2VlIHRoZSB0ZXN0IGluCi0gIC8vICtsb2FkIGFib3ZlLgotICBjb25zdCBjaGFyICpxdWlja1N0cmluZyA9Ci0gICAgICBDRlN0cmluZ0dldENTdHJpbmdQdHIoKENGU3RyaW5nUmVmKXZhbHVlLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotICBzaXplX3QgbGVuZ3RoID0gKHF1aWNrU3RyaW5nICE9IE5VTEwpCi0gICAgICAgICAgICAgICAgICAgICAgPyBzdHJsZW4ocXVpY2tTdHJpbmcpCi0gICAgICAgICAgICAgICAgICAgICAgOiBbdmFsdWUgbGVuZ3RoT2ZCeXRlc1VzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWxlbmd0aCk7Ci0KLSAgaWYgKGxlbmd0aCA9PSAwKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gRmFzdCBwYXRoOiBNb3N0IHN0cmluZ3MgYXJlIHNob3J0LCBpZiB0aGUgYnVmZmVyIGFscmVhZHkgaGFzIHNwYWNlLAotICAvLyBhZGQgdG8gaXQgZGlyZWN0bHkuCi0gIE5TVUludGVnZXIgYnVmZmVyQnl0ZXNMZWZ0ID0gc3RhdGVfLnNpemUgLSBzdGF0ZV8ucG9zaXRpb247Ci0gIGlmIChidWZmZXJCeXRlc0xlZnQgPj0gbGVuZ3RoKSB7Ci0gICAgTlNVSW50ZWdlciB1c2VkQnVmZmVyTGVuZ3RoID0gMDsKLSAgICBCT09MIHJlc3VsdDsKLSAgICBpZiAocXVpY2tTdHJpbmcgIT0gTlVMTCkgewotICAgICAgbWVtY3B5KHN0YXRlXy5ieXRlcyArIHN0YXRlXy5wb3NpdGlvbiwgcXVpY2tTdHJpbmcsIGxlbmd0aCk7Ci0gICAgICB1c2VkQnVmZmVyTGVuZ3RoID0gbGVuZ3RoOwotICAgICAgcmVzdWx0ID0gWUVTOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQgPSBbdmFsdWUgZ2V0Qnl0ZXM6c3RhdGVfLmJ5dGVzICsgc3RhdGVfLnBvc2l0aW9uCi0gICAgICAgICAgICAgICAgICAgICBtYXhMZW5ndGg6YnVmZmVyQnl0ZXNMZWZ0Ci0gICAgICAgICAgICAgICAgICAgIHVzZWRMZW5ndGg6JnVzZWRCdWZmZXJMZW5ndGgKLSAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZwotICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zOjAKLSAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTpOU01ha2VSYW5nZSgwLCBbdmFsdWUgbGVuZ3RoXSkKLSAgICAgICAgICAgICAgICByZW1haW5pbmdSYW5nZTpOVUxMXTsKLSAgICB9Ci0gICAgaWYgKHJlc3VsdCkgewotICAgICAgTlNBc3NlcnQyKCh1c2VkQnVmZmVyTGVuZ3RoID09IGxlbmd0aCksCi0gICAgICAgICAgICAgICAgQCJPdXIgVVRGOCBjYWxjIHdhcyB3cm9uZz8gJXR1IHZzICV6ZCIsIHVzZWRCdWZmZXJMZW5ndGgsCi0gICAgICAgICAgICAgICAgbGVuZ3RoKTsKLSAgICAgIHN0YXRlXy5wb3NpdGlvbiArPSB1c2VkQnVmZmVyTGVuZ3RoOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIGlmIChxdWlja1N0cmluZyAhPSBOVUxMKSB7Ci0gICAgW3NlbGYgd3JpdGVSYXdQdHI6cXVpY2tTdHJpbmcgb2Zmc2V0OjAgbGVuZ3RoOmxlbmd0aF07Ci0gIH0gZWxzZSB7Ci0gICAgLy8gU2xvdyBwYXRoOiBqdXN0IGdldCBpdCBhcyBkYXRhIGFuZCB3cml0ZSBpdCBvdXQuCi0gICAgTlNEYXRhICp1dGY4RGF0YSA9IFt2YWx1ZSBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gICAgTlNBc3NlcnQyKChbdXRmOERhdGEgbGVuZ3RoXSA9PSBsZW5ndGgpLAotICAgICAgICAgICAgICBAIlN0cmluZ3MgVVRGOCBsZW5ndGggd2FzIHdyb25nPyAldHUgdnMgJXpkIiwgW3V0ZjhEYXRhIGxlbmd0aF0sCi0gICAgICAgICAgICAgIGxlbmd0aCk7Ci0gICAgW3NlbGYgd3JpdGVSYXdEYXRhOnV0ZjhEYXRhXTsKLSAgfQotfQotCi0tICh2b2lkKXdyaXRlU3RyaW5nOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihOU1N0cmluZyAqKXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW3NlbGYgd3JpdGVTdHJpbmdOb1RhZzp2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpd3JpdGVHcm91cE5vVGFnOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihHUEJNZXNzYWdlICopdmFsdWUgewotICBbdmFsdWUgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOnNlbGZdOwotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRFbmRHcm91cCk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVHcm91cDooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooR1BCTWVzc2FnZSAqKXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0U3RhcnRHcm91cCk7Ci0gIFtzZWxmIHdyaXRlR3JvdXBOb1RhZzpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpd3JpdGVVbmtub3duR3JvdXBOb1RhZzooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOihjb25zdCBHUEJVbmtub3duRmllbGRTZXQgKil2YWx1ZSB7Ci0gIFt2YWx1ZSB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06c2VsZl07Ci0gIEdQQldyaXRlVGFnV2l0aEZvcm1hdCgmc3RhdGVfLCBmaWVsZE51bWJlciwgR1BCV2lyZUZvcm1hdEVuZEdyb3VwKTsKLX0KLQotLSAodm9pZCl3cml0ZVVua25vd25Hcm91cDooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICB2YWx1ZTooR1BCVW5rbm93bkZpZWxkU2V0ICopdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRTdGFydEdyb3VwKTsKLSAgW3NlbGYgd3JpdGVVbmtub3duR3JvdXBOb1RhZzpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpd3JpdGVNZXNzYWdlTm9UYWc6KEdQQk1lc3NhZ2UgKil2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgKGludDMyX3QpW3ZhbHVlIHNlcmlhbGl6ZWRTaXplXSk7Ci0gIFt2YWx1ZSB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06c2VsZl07Ci19Ci0KLS0gKHZvaWQpd3JpdGVNZXNzYWdlOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihHUEJNZXNzYWdlICopdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbc2VsZiB3cml0ZU1lc3NhZ2VOb1RhZzp2YWx1ZV07Ci19Ci0KLS0gKHZvaWQpd3JpdGVCeXRlc05vVGFnOihOU0RhdGEgKil2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgKGludDMyX3QpW3ZhbHVlIGxlbmd0aF0pOwotICBbc2VsZiB3cml0ZVJhd0RhdGE6dmFsdWVdOwotfQotCi0tICh2b2lkKXdyaXRlQnl0ZXM6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KE5TRGF0YSAqKXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW3NlbGYgd3JpdGVCeXRlc05vVGFnOnZhbHVlXTsKLX0KLQotLSAodm9pZCl3cml0ZVVJbnQzMk5vVGFnOih1aW50MzJfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdmFsdWUpOwotfQotCi0tICh2b2lkKXdyaXRlVUludDMyOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOih1aW50MzJfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlVUludDMyKCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVFbnVtTm9UYWc6KGludDMyX3QpdmFsdWUgewotICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZUVudW06KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KGludDMyX3QpdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRWYXJpbnQpOwotICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZVNGaXhlZDMyTm9UYWc6KGludDMyX3QpdmFsdWUgewotICBHUEJXcml0ZVJhd0xpdHRsZUVuZGlhbjMyKCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZVNGaXhlZDMyOihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihpbnQzMl90KXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0Rml4ZWQzMik7Ci0gIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuMzIoJnN0YXRlXywgdmFsdWUpOwotfQotCi0tICh2b2lkKXdyaXRlU0ZpeGVkNjROb1RhZzooaW50NjRfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuNjQoJnN0YXRlXywgdmFsdWUpOwotfQotCi0tICh2b2lkKXdyaXRlU0ZpeGVkNjQ6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWU6KGludDY0X3QpdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRGaXhlZDY0KTsKLSAgR1BCV3JpdGVSYXdMaXR0bGVFbmRpYW42NCgmc3RhdGVfLCB2YWx1ZSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVTSW50MzJOb1RhZzooaW50MzJfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgR1BCRW5jb2RlWmlnWmFnMzIodmFsdWUpKTsKLX0KLQotLSAodm9pZCl3cml0ZVNJbnQzMjooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooaW50MzJfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlVGFnV2l0aEZvcm1hdCgmc3RhdGVfLCBmaWVsZE51bWJlciwgR1BCV2lyZUZvcm1hdFZhcmludCk7Ci0gIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgR1BCRW5jb2RlWmlnWmFnMzIodmFsdWUpKTsKLX0KLQotLSAodm9pZCl3cml0ZVNJbnQ2NE5vVGFnOihpbnQ2NF90KXZhbHVlIHsKLSAgR1BCV3JpdGVSYXdWYXJpbnQ2NCgmc3RhdGVfLCBHUEJFbmNvZGVaaWdaYWc2NCh2YWx1ZSkpOwotfQotCi0tICh2b2lkKXdyaXRlU0ludDY0OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlOihpbnQ2NF90KXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIGZpZWxkTnVtYmVyLCBHUEJXaXJlRm9ybWF0VmFyaW50KTsKLSAgR1BCV3JpdGVSYXdWYXJpbnQ2NCgmc3RhdGVfLCBHUEJFbmNvZGVaaWdaYWc2NCh2YWx1ZSkpOwotfQotCi0vLyVQRERNLURFRklORSBXUklURV9QQUNLQUJMRV9ERUZOUyhOQU1FLCBBUlJBWV9UWVBFLCBUWVBFLCBBQ0NFU1NPUl9OQU1FKQotLy8lLSAodm9pZCl3cml0ZSMjTkFNRSMjQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLS8vJSAgICAgICBOQU1FJFMgICAgIHZhbHVlczooR1BCIyNBUlJBWV9UWVBFIyNBcnJheSAqKXZhbHVlcwotLy8lICAgICAgIE5BTUUkUyAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotLy8lICBpZiAodGFnICE9IDApIHsKLS8vJSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLS8vJSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0vLyUgICAgW3ZhbHVlcyBlbnVtZXJhdGUjI0FDQ0VTU09SX05BTUUjI1ZhbHVlc1dpdGhCbG9jazpeKFRZUEUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0vLyUjcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0vLyUgICAgICBkYXRhU2l6ZSArPSBHUEJDb21wdXRlIyNOQU1FIyNTaXplTm9UYWcodmFsdWUpOwotLy8lICAgIH1dOwotLy8lICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLS8vJSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLS8vJSAgICBbdmFsdWVzIGVudW1lcmF0ZSMjQUNDRVNTT1JfTkFNRSMjVmFsdWVzV2l0aEJsb2NrOl4oVFlQRSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLS8vJSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLS8vJSAgICAgIFtzZWxmIHdyaXRlIyNOQU1FIyNOb1RhZzp2YWx1ZV07Ci0vLyUgICAgfV07Ci0vLyUgIH0gZWxzZSB7Ci0vLyUgICAgW3ZhbHVlcyBlbnVtZXJhdGUjI0FDQ0VTU09SX05BTUUjI1ZhbHVlc1dpdGhCbG9jazpeKFRZUEUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0vLyUjcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0vLyUgICAgICBbc2VsZiB3cml0ZSMjTkFNRTpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci0vLyUgICAgfV07Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lUERETS1ERUZJTkUgV1JJVEVfVU5QQUNLQUJMRV9ERUZOUyhOQU1FLCBUWVBFKQotLy8lLSAodm9pZCl3cml0ZSMjTkFNRSMjQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWVzOihOU0FycmF5ICopdmFsdWVzIHsKLS8vJSAgZm9yIChUWVBFICp2YWx1ZSBpbiB2YWx1ZXMpIHsKLS8vJSAgICBbc2VsZiB3cml0ZSMjTkFNRTpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lUERETS1FWFBBTkQgV1JJVEVfUEFDS0FCTEVfREVGTlMoRG91YmxlLCBEb3VibGUsIGRvdWJsZSwgKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpd3JpdGVEb3VibGVBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJEb3VibGVBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBpZiAodGFnICE9IDApIHsKLSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xihkb3VibGUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBkYXRhU2l6ZSArPSBHUEJDb21wdXRlRG91YmxlU2l6ZU5vVGFnKHZhbHVlKTsKLSAgICB9XTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIHRhZyk7Ci0gICAgR1BCV3JpdGVSYXdWYXJpbnQzMigmc3RhdGVfLCAoaW50MzJfdClkYXRhU2l6ZSk7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xihkb3VibGUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZURvdWJsZU5vVGFnOnZhbHVlXTsKLSAgICB9XTsKLSAgfSBlbHNlIHsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGRvdWJsZSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIFtzZWxmIHdyaXRlRG91YmxlOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgICB9XTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9QQUNLQUJMRV9ERUZOUyhGbG9hdCwgRmxvYXQsIGZsb2F0LCApCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl3cml0ZUZsb2F0QXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJGbG9hdEFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnIHsKLSAgaWYgKHRhZyAhPSAwKSB7Ci0gICAgaWYgKHZhbHVlcy5jb3VudCA9PSAwKSByZXR1cm47Ci0gICAgX19ibG9jayBzaXplX3QgZGF0YVNpemUgPSAwOwotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oZmxvYXQgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBkYXRhU2l6ZSArPSBHUEJDb21wdXRlRmxvYXRTaXplTm9UYWcodmFsdWUpOwotICAgIH1dOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGZsb2F0IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVGbG9hdE5vVGFnOnZhbHVlXTsKLSAgICB9XTsKLSAgfSBlbHNlIHsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGZsb2F0IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVGbG9hdDpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci0gICAgfV07Ci0gIH0KLX0KLQotLy8lUERETS1FWFBBTkQgV1JJVEVfUEFDS0FCTEVfREVGTlMoVUludDY0LCBVSW50NjQsIHVpbnQ2NF90LCApCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl3cml0ZVVJbnQ2NEFycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQlVJbnQ2NEFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0YWc6KHVpbnQzMl90KXRhZyB7Ci0gIGlmICh0YWcgIT0gMCkgewotICAgIGlmICh2YWx1ZXMuY291bnQgPT0gMCkgcmV0dXJuOwotICAgIF9fYmxvY2sgc2l6ZV90IGRhdGFTaXplID0gMDsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZVVJbnQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci0gICAgfV07Ci0gICAgR1BCV3JpdGVSYXdWYXJpbnQzMigmc3RhdGVfLCB0YWcpOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgKGludDMyX3QpZGF0YVNpemUpOwotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZVVJbnQ2NE5vVGFnOnZhbHVlXTsKLSAgICB9XTsKLSAgfSBlbHNlIHsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVVSW50NjQ6ZmllbGROdW1iZXIgdmFsdWU6dmFsdWVdOwotICAgIH1dOwotICB9Ci19Ci0KLS8vJVBERE0tRVhQQU5EIFdSSVRFX1BBQ0tBQkxFX0RFRk5TKEludDY0LCBJbnQ2NCwgaW50NjRfdCwgKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpd3JpdGVJbnQ2NEFycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgIHZhbHVlczooR1BCSW50NjRBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICB0YWc6KHVpbnQzMl90KXRhZyB7Ci0gIGlmICh0YWcgIT0gMCkgewotICAgIGlmICh2YWx1ZXMuY291bnQgPT0gMCkgcmV0dXJuOwotICAgIF9fYmxvY2sgc2l6ZV90IGRhdGFTaXplID0gMDsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBkYXRhU2l6ZSArPSBHUEJDb21wdXRlSW50NjRTaXplTm9UYWcodmFsdWUpOwotICAgIH1dOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZUludDY0Tm9UYWc6dmFsdWVdOwotICAgIH1dOwotICB9IGVsc2UgewotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIFtzZWxmIHdyaXRlSW50NjQ6ZmllbGROdW1iZXIgdmFsdWU6dmFsdWVdOwotICAgIH1dOwotICB9Ci19Ci0KLS8vJVBERE0tRVhQQU5EIFdSSVRFX1BBQ0tBQkxFX0RFRk5TKEludDMyLCBJbnQzMiwgaW50MzJfdCwgKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpd3JpdGVJbnQzMkFycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgIHZhbHVlczooR1BCSW50MzJBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICB0YWc6KHVpbnQzMl90KXRhZyB7Ci0gIGlmICh0YWcgIT0gMCkgewotICAgIGlmICh2YWx1ZXMuY291bnQgPT0gMCkgcmV0dXJuOwotICAgIF9fYmxvY2sgc2l6ZV90IGRhdGFTaXplID0gMDsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBkYXRhU2l6ZSArPSBHUEJDb21wdXRlSW50MzJTaXplTm9UYWcodmFsdWUpOwotICAgIH1dOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZUludDMyTm9UYWc6dmFsdWVdOwotICAgIH1dOwotICB9IGVsc2UgewotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIFtzZWxmIHdyaXRlSW50MzI6ZmllbGROdW1iZXIgdmFsdWU6dmFsdWVdOwotICAgIH1dOwotICB9Ci19Ci0KLS8vJVBERE0tRVhQQU5EIFdSSVRFX1BBQ0tBQkxFX0RFRk5TKFVJbnQzMiwgVUludDMyLCB1aW50MzJfdCwgKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpd3JpdGVVSW50MzJBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJVSW50MzJBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBpZiAodGFnICE9IDApIHsKLSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xih1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIGRhdGFTaXplICs9IEdQQkNvbXB1dGVVSW50MzJTaXplTm9UYWcodmFsdWUpOwotICAgIH1dOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVVSW50MzJOb1RhZzp2YWx1ZV07Ci0gICAgfV07Ci0gIH0gZWxzZSB7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xih1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIFtzZWxmIHdyaXRlVUludDMyOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgICB9XTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9QQUNLQUJMRV9ERUZOUyhGaXhlZDY0LCBVSW50NjQsIHVpbnQ2NF90LCApCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl3cml0ZUZpeGVkNjRBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgIHZhbHVlczooR1BCVUludDY0QXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICB0YWc6KHVpbnQzMl90KXRhZyB7Ci0gIGlmICh0YWcgIT0gMCkgewotICAgIGlmICh2YWx1ZXMuY291bnQgPT0gMCkgcmV0dXJuOwotICAgIF9fYmxvY2sgc2l6ZV90IGRhdGFTaXplID0gMDsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZUZpeGVkNjRTaXplTm9UYWcodmFsdWUpOwotICAgIH1dOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVGaXhlZDY0Tm9UYWc6dmFsdWVdOwotICAgIH1dOwotICB9IGVsc2UgewotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZUZpeGVkNjQ6ZmllbGROdW1iZXIgdmFsdWU6dmFsdWVdOwotICAgIH1dOwotICB9Ci19Ci0KLS8vJVBERE0tRVhQQU5EIFdSSVRFX1BBQ0tBQkxFX0RFRk5TKEZpeGVkMzIsIFVJbnQzMiwgdWludDMyX3QsICkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0tICh2b2lkKXdyaXRlRml4ZWQzMkFycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJVSW50MzJBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgIHRhZzoodWludDMyX3QpdGFnIHsKLSAgaWYgKHRhZyAhPSAwKSB7Ci0gICAgaWYgKHZhbHVlcy5jb3VudCA9PSAwKSByZXR1cm47Ci0gICAgX19ibG9jayBzaXplX3QgZGF0YVNpemUgPSAwOwotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBkYXRhU2l6ZSArPSBHUEJDb21wdXRlRml4ZWQzMlNpemVOb1RhZyh2YWx1ZSk7Ci0gICAgfV07Ci0gICAgR1BCV3JpdGVSYXdWYXJpbnQzMigmc3RhdGVfLCB0YWcpOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgKGludDMyX3QpZGF0YVNpemUpOwotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZUZpeGVkMzJOb1RhZzp2YWx1ZV07Ci0gICAgfV07Ci0gIH0gZWxzZSB7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xih1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIFtzZWxmIHdyaXRlRml4ZWQzMjpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci0gICAgfV07Ci0gIH0KLX0KLQotLy8lUERETS1FWFBBTkQgV1JJVEVfUEFDS0FCTEVfREVGTlMoU0ludDMyLCBJbnQzMiwgaW50MzJfdCwgKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpd3JpdGVTSW50MzJBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgdmFsdWVzOihHUEJJbnQzMkFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICB0YWc6KHVpbnQzMl90KXRhZyB7Ci0gIGlmICh0YWcgIT0gMCkgewotICAgIGlmICh2YWx1ZXMuY291bnQgPT0gMCkgcmV0dXJuOwotICAgIF9fYmxvY2sgc2l6ZV90IGRhdGFTaXplID0gMDsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBkYXRhU2l6ZSArPSBHUEJDb21wdXRlU0ludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgICB9XTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIHRhZyk7Ci0gICAgR1BCV3JpdGVSYXdWYXJpbnQzMigmc3RhdGVfLCAoaW50MzJfdClkYXRhU2l6ZSk7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVTSW50MzJOb1RhZzp2YWx1ZV07Ci0gICAgfV07Ci0gIH0gZWxzZSB7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVTSW50MzI6ZmllbGROdW1iZXIgdmFsdWU6dmFsdWVdOwotICAgIH1dOwotICB9Ci19Ci0KLS8vJVBERE0tRVhQQU5EIFdSSVRFX1BBQ0tBQkxFX0RFRk5TKFNJbnQ2NCwgSW50NjQsIGludDY0X3QsICkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0tICh2b2lkKXdyaXRlU0ludDY0QXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgIHZhbHVlczooR1BCSW50NjRBcnJheSAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBpZiAodGFnICE9IDApIHsKLSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZVNJbnQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci0gICAgfV07Ci0gICAgR1BCV3JpdGVSYXdWYXJpbnQzMigmc3RhdGVfLCB0YWcpOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgKGludDMyX3QpZGF0YVNpemUpOwotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIFtzZWxmIHdyaXRlU0ludDY0Tm9UYWc6dmFsdWVdOwotICAgIH1dOwotICB9IGVsc2UgewotICAgIFt2YWx1ZXMgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgIFtzZWxmIHdyaXRlU0ludDY0OmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgICB9XTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9QQUNLQUJMRV9ERUZOUyhTRml4ZWQ2NCwgSW50NjQsIGludDY0X3QsICkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0tICh2b2lkKXdyaXRlU0ZpeGVkNjRBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQkludDY0QXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBpZiAodGFnICE9IDApIHsKLSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgICB9XTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIHRhZyk7Ci0gICAgR1BCV3JpdGVSYXdWYXJpbnQzMigmc3RhdGVfLCAoaW50MzJfdClkYXRhU2l6ZSk7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVTRml4ZWQ2NE5vVGFnOnZhbHVlXTsKLSAgICB9XTsKLSAgfSBlbHNlIHsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZVNGaXhlZDY0OmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgICB9XTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9QQUNLQUJMRV9ERUZOUyhTRml4ZWQzMiwgSW50MzIsIGludDMyX3QsICkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0tICh2b2lkKXdyaXRlU0ZpeGVkMzJBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6KEdQQkludDMyQXJyYXkgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBpZiAodGFnICE9IDApIHsKLSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgICB9XTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIHRhZyk7Ci0gICAgR1BCV3JpdGVSYXdWYXJpbnQzMigmc3RhdGVfLCAoaW50MzJfdClkYXRhU2l6ZSk7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVTRml4ZWQzMk5vVGFnOnZhbHVlXTsKLSAgICB9XTsKLSAgfSBlbHNlIHsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZVNGaXhlZDMyOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgICB9XTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9QQUNLQUJMRV9ERUZOUyhCb29sLCBCb29sLCBCT09MLCApCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl3cml0ZUJvb2xBcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgIHZhbHVlczooR1BCQm9vbEFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBpZiAodGFnICE9IDApIHsKLSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZUJvb2xTaXplTm9UYWcodmFsdWUpOwotICAgIH1dOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKEJPT0wgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZUJvb2xOb1RhZzp2YWx1ZV07Ci0gICAgfV07Ci0gIH0gZWxzZSB7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVCb29sOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgICB9XTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9QQUNLQUJMRV9ERUZOUyhFbnVtLCBFbnVtLCBpbnQzMl90LCBSYXcpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl3cml0ZUVudW1BcnJheTooaW50MzJfdClmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgIHZhbHVlczooR1BCRW51bUFycmF5ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBpZiAodGFnICE9IDApIHsKLSAgICBpZiAodmFsdWVzLmNvdW50ID09IDApIHJldHVybjsKLSAgICBfX2Jsb2NrIHNpemVfdCBkYXRhU2l6ZSA9IDA7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVSYXdWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZUVudW1TaXplTm9UYWcodmFsdWUpOwotICAgIH1dOwotICAgIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdGFnKTsKLSAgICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KWRhdGFTaXplKTsKLSAgICBbdmFsdWVzIGVudW1lcmF0ZVJhd1ZhbHVlc1dpdGhCbG9jazpeKGludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICBbc2VsZiB3cml0ZUVudW1Ob1RhZzp2YWx1ZV07Ci0gICAgfV07Ci0gIH0gZWxzZSB7Ci0gICAgW3ZhbHVlcyBlbnVtZXJhdGVSYXdWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgW3NlbGYgd3JpdGVFbnVtOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgICB9XTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9VTlBBQ0tBQkxFX0RFRk5TKFN0cmluZywgTlNTdHJpbmcpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl3cml0ZVN0cmluZ0FycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlczooTlNBcnJheSAqKXZhbHVlcyB7Ci0gIGZvciAoTlNTdHJpbmcgKnZhbHVlIGluIHZhbHVlcykgewotICAgIFtzZWxmIHdyaXRlU3RyaW5nOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9VTlBBQ0tBQkxFX0RFRk5TKE1lc3NhZ2UsIEdQQk1lc3NhZ2UpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl3cml0ZU1lc3NhZ2VBcnJheTooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZXM6KE5TQXJyYXkgKil2YWx1ZXMgewotICBmb3IgKEdQQk1lc3NhZ2UgKnZhbHVlIGluIHZhbHVlcykgewotICAgIFtzZWxmIHdyaXRlTWVzc2FnZTpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci0gIH0KLX0KLQotLy8lUERETS1FWFBBTkQgV1JJVEVfVU5QQUNLQUJMRV9ERUZOUyhCeXRlcywgTlNEYXRhKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpd3JpdGVCeXRlc0FycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlczooTlNBcnJheSAqKXZhbHVlcyB7Ci0gIGZvciAoTlNEYXRhICp2YWx1ZSBpbiB2YWx1ZXMpIHsKLSAgICBbc2VsZiB3cml0ZUJ5dGVzOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORCBXUklURV9VTlBBQ0tBQkxFX0RFRk5TKEdyb3VwLCBHUEJNZXNzYWdlKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS0gKHZvaWQpd3JpdGVHcm91cEFycmF5OihpbnQzMl90KWZpZWxkTnVtYmVyIHZhbHVlczooTlNBcnJheSAqKXZhbHVlcyB7Ci0gIGZvciAoR1BCTWVzc2FnZSAqdmFsdWUgaW4gdmFsdWVzKSB7Ci0gICAgW3NlbGYgd3JpdGVHcm91cDpmaWVsZE51bWJlciB2YWx1ZTp2YWx1ZV07Ci0gIH0KLX0KLQotLy8lUERETS1FWFBBTkQgV1JJVEVfVU5QQUNLQUJMRV9ERUZOUyhVbmtub3duR3JvdXAsIEdQQlVua25vd25GaWVsZFNldCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0tICh2b2lkKXdyaXRlVW5rbm93bkdyb3VwQXJyYXk6KGludDMyX3QpZmllbGROdW1iZXIgdmFsdWVzOihOU0FycmF5ICopdmFsdWVzIHsKLSAgZm9yIChHUEJVbmtub3duRmllbGRTZXQgKnZhbHVlIGluIHZhbHVlcykgewotICAgIFtzZWxmIHdyaXRlVW5rbm93bkdyb3VwOmZpZWxkTnVtYmVyIHZhbHVlOnZhbHVlXTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORC1FTkQgKDE5IGV4cGFuc2lvbnMpCi0KLS0gKHZvaWQpd3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uOihpbnQzMl90KWZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTooR1BCTWVzc2FnZSAqKXZhbHVlIHsKLSAgR1BCV3JpdGVUYWdXaXRoRm9ybWF0KCZzdGF0ZV8sIEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0SXRlbSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdQQldpcmVGb3JtYXRTdGFydEdyb3VwKTsKLSAgR1BCV3JpdGVVSW50MzIoJnN0YXRlXywgR1BCV2lyZUZvcm1hdE1lc3NhZ2VTZXRUeXBlSWQsIGZpZWxkTnVtYmVyKTsKLSAgW3NlbGYgd3JpdGVNZXNzYWdlOkdQQldpcmVGb3JtYXRNZXNzYWdlU2V0TWVzc2FnZSB2YWx1ZTp2YWx1ZV07Ci0gIEdQQldyaXRlVGFnV2l0aEZvcm1hdCgmc3RhdGVfLCBHUEJXaXJlRm9ybWF0TWVzc2FnZVNldEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHUEJXaXJlRm9ybWF0RW5kR3JvdXApOwotfQotCi0tICh2b2lkKXdyaXRlUmF3TWVzc2FnZVNldEV4dGVuc2lvbjooaW50MzJfdClmaWVsZE51bWJlciB2YWx1ZTooTlNEYXRhICopdmFsdWUgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgR1BCV2lyZUZvcm1hdE1lc3NhZ2VTZXRJdGVtLAotICAgICAgICAgICAgICAgICAgICAgICAgR1BCV2lyZUZvcm1hdFN0YXJ0R3JvdXApOwotICBHUEJXcml0ZVVJbnQzMigmc3RhdGVfLCBHUEJXaXJlRm9ybWF0TWVzc2FnZVNldFR5cGVJZCwgZmllbGROdW1iZXIpOwotICBbc2VsZiB3cml0ZUJ5dGVzOkdQQldpcmVGb3JtYXRNZXNzYWdlU2V0TWVzc2FnZSB2YWx1ZTp2YWx1ZV07Ci0gIEdQQldyaXRlVGFnV2l0aEZvcm1hdCgmc3RhdGVfLCBHUEJXaXJlRm9ybWF0TWVzc2FnZVNldEl0ZW0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHUEJXaXJlRm9ybWF0RW5kR3JvdXApOwotfQotCi0tICh2b2lkKWZsdXNoIHsKLSAgaWYgKHN0YXRlXy5vdXRwdXQgIT0gbmlsKSB7Ci0gICAgR1BCUmVmcmVzaEJ1ZmZlcigmc3RhdGVfKTsKLSAgfQotfQotCi0tICh2b2lkKXdyaXRlUmF3Qnl0ZToodWludDhfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3Qnl0ZSgmc3RhdGVfLCB2YWx1ZSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVSYXdEYXRhOihjb25zdCBOU0RhdGEgKilkYXRhIHsKLSAgW3NlbGYgd3JpdGVSYXdQdHI6W2RhdGEgYnl0ZXNdIG9mZnNldDowIGxlbmd0aDpbZGF0YSBsZW5ndGhdXTsKLX0KLQotLSAodm9pZCl3cml0ZVJhd1B0cjooY29uc3Qgdm9pZCAqKXZhbHVlCi0gICAgICAgICAgICAgb2Zmc2V0OihzaXplX3Qpb2Zmc2V0Ci0gICAgICAgICAgICAgbGVuZ3RoOihzaXplX3QpbGVuZ3RoIHsKLSAgaWYgKHZhbHVlID09IG5pbCB8fCBsZW5ndGggPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIE5TVUludGVnZXIgYnVmZmVyTGVuZ3RoID0gc3RhdGVfLnNpemU7Ci0gIE5TVUludGVnZXIgYnVmZmVyQnl0ZXNMZWZ0ID0gYnVmZmVyTGVuZ3RoIC0gc3RhdGVfLnBvc2l0aW9uOwotICBpZiAoYnVmZmVyQnl0ZXNMZWZ0ID49IGxlbmd0aCkgewotICAgIC8vIFdlIGhhdmUgcm9vbSBpbiB0aGUgY3VycmVudCBidWZmZXIuCi0gICAgbWVtY3B5KHN0YXRlXy5ieXRlcyArIHN0YXRlXy5wb3NpdGlvbiwgKCh1aW50OF90ICopdmFsdWUpICsgb2Zmc2V0LCBsZW5ndGgpOwotICAgIHN0YXRlXy5wb3NpdGlvbiArPSBsZW5ndGg7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gV3JpdGUgZXh0ZW5kcyBwYXN0IGN1cnJlbnQgYnVmZmVyLiAgRmlsbCB0aGUgcmVzdCBvZiB0aGlzIGJ1ZmZlciBhbmQKLSAgICAvLyBmbHVzaC4KLSAgICBzaXplX3QgYnl0ZXNXcml0dGVuID0gYnVmZmVyQnl0ZXNMZWZ0OwotICAgIG1lbWNweShzdGF0ZV8uYnl0ZXMgKyBzdGF0ZV8ucG9zaXRpb24sICgodWludDhfdCAqKXZhbHVlKSArIG9mZnNldCwKLSAgICAgICAgICAgYnl0ZXNXcml0dGVuKTsKLSAgICBvZmZzZXQgKz0gYnl0ZXNXcml0dGVuOwotICAgIGxlbmd0aCAtPSBieXRlc1dyaXR0ZW47Ci0gICAgc3RhdGVfLnBvc2l0aW9uID0gYnVmZmVyTGVuZ3RoOwotICAgIEdQQlJlZnJlc2hCdWZmZXIoJnN0YXRlXyk7Ci0gICAgYnVmZmVyTGVuZ3RoID0gc3RhdGVfLnNpemU7Ci0KLSAgICAvLyBOb3cgZGVhbCB3aXRoIHRoZSByZXN0LgotICAgIC8vIFNpbmNlIHdlIGhhdmUgYW4gb3V0cHV0IHN0cmVhbSwgdGhpcyBpcyBvdXIgYnVmZmVyCi0gICAgLy8gYW5kIGJ1ZmZlciBvZmZzZXQgPT0gMAotICAgIGlmIChsZW5ndGggPD0gYnVmZmVyTGVuZ3RoKSB7Ci0gICAgICAvLyBGaXRzIGluIG5ldyBidWZmZXIuCi0gICAgICBtZW1jcHkoc3RhdGVfLmJ5dGVzLCAoKHVpbnQ4X3QgKil2YWx1ZSkgKyBvZmZzZXQsIGxlbmd0aCk7Ci0gICAgICBzdGF0ZV8ucG9zaXRpb24gPSBsZW5ndGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdyaXRlIGlzIHZlcnkgYmlnLiAgTGV0J3MgZG8gaXQgYWxsIGF0IG9uY2UuCi0gICAgICBbc3RhdGVfLm91dHB1dCB3cml0ZTooKHVpbnQ4X3QgKil2YWx1ZSkgKyBvZmZzZXQgbWF4TGVuZ3RoOmxlbmd0aF07Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpd3JpdGVUYWc6KHVpbnQzMl90KWZpZWxkTnVtYmVyIGZvcm1hdDooR1BCV2lyZUZvcm1hdClmb3JtYXQgewotICBHUEJXcml0ZVRhZ1dpdGhGb3JtYXQoJnN0YXRlXywgZmllbGROdW1iZXIsIGZvcm1hdCk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVSYXdWYXJpbnQzMjooaW50MzJfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3VmFyaW50MzIoJnN0YXRlXywgdmFsdWUpOwotfQotCi0tICh2b2lkKXdyaXRlUmF3VmFyaW50U2l6ZVRBczMyOihzaXplX3QpdmFsdWUgewotICAvLyBOb3RlIHRoZSB0cnVuY2F0aW9uLgotICBHUEJXcml0ZVJhd1ZhcmludDMyKCZzdGF0ZV8sIChpbnQzMl90KXZhbHVlKTsKLX0KLQotLSAodm9pZCl3cml0ZVJhd1ZhcmludDY0OihpbnQ2NF90KXZhbHVlIHsKLSAgR1BCV3JpdGVSYXdWYXJpbnQ2NCgmc3RhdGVfLCB2YWx1ZSk7Ci19Ci0KLS0gKHZvaWQpd3JpdGVSYXdMaXR0bGVFbmRpYW4zMjooaW50MzJfdCl2YWx1ZSB7Ci0gIEdQQldyaXRlUmF3TGl0dGxlRW5kaWFuMzIoJnN0YXRlXywgdmFsdWUpOwotfQotCi0tICh2b2lkKXdyaXRlUmF3TGl0dGxlRW5kaWFuNjQ6KGludDY0X3QpdmFsdWUgewotICBHUEJXcml0ZVJhd0xpdHRsZUVuZGlhbjY0KCZzdGF0ZV8sIHZhbHVlKTsKLX0KLQotQGVuZAotCi1zaXplX3QgR1BCQ29tcHV0ZURvdWJsZVNpemVOb1RhZyhGbG9hdDY0IHZhbHVlKSB7Ci0jcHJhZ21hIHVudXNlZCh2YWx1ZSkKLSAgcmV0dXJuIExJVFRMRV9FTkRJQU5fNjRfU0laRTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVGbG9hdFNpemVOb1RhZyhGbG9hdDMyIHZhbHVlKSB7Ci0jcHJhZ21hIHVudXNlZCh2YWx1ZSkKLSAgcmV0dXJuIExJVFRMRV9FTkRJQU5fMzJfU0laRTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVVSW50NjRTaXplTm9UYWcodWludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGludDMyX3QgdmFsdWUpIHsKLSAgaWYgKHZhbHVlID49IDApIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICByZXR1cm4gMTA7Ci0gIH0KLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVTaXplVFNpemVBc0ludDMyTm9UYWcoc2l6ZV90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlSW50MzJTaXplTm9UYWcoKGludDMyX3QpdmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUZpeGVkNjRTaXplTm9UYWcodWludDY0X3QgdmFsdWUpIHsKLSNwcmFnbWEgdW51c2VkKHZhbHVlKQotICByZXR1cm4gTElUVExFX0VORElBTl82NF9TSVpFOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUZpeGVkMzJTaXplTm9UYWcodWludDMyX3QgdmFsdWUpIHsKLSNwcmFnbWEgdW51c2VkKHZhbHVlKQotICByZXR1cm4gTElUVExFX0VORElBTl8zMl9TSVpFOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUJvb2xTaXplTm9UYWcoQk9PTCB2YWx1ZSkgewotI3ByYWdtYSB1bnVzZWQodmFsdWUpCi0gIHJldHVybiAxOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVN0cmluZ1NpemVOb1RhZyhOU1N0cmluZyAqdmFsdWUpIHsKLSAgLy8gSWYgeW91IGFyZSBjb25jZXJuZWQgYWJvdXQgZW1iZWRkZWQgTlVMTHMgc2VlIHRoZSB0ZXN0IGluCi0gIC8vICtsb2FkIGFib3ZlLgotICBjb25zdCBjaGFyICpxdWlja1N0cmluZyA9Ci0gICAgICBDRlN0cmluZ0dldENTdHJpbmdQdHIoKENGU3RyaW5nUmVmKXZhbHVlLCBrQ0ZTdHJpbmdFbmNvZGluZ1VURjgpOwotICBOU1VJbnRlZ2VyIGxlbmd0aCA9Ci0gICAgICAocXVpY2tTdHJpbmcgIT0gTlVMTCkKLSAgICAgICAgICA/IHN0cmxlbihxdWlja1N0cmluZykKLSAgICAgICAgICA6IFt2YWx1ZSBsZW5ndGhPZkJ5dGVzVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gIHJldHVybiBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihsZW5ndGgpICsgbGVuZ3RoOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUdyb3VwU2l6ZU5vVGFnKEdQQk1lc3NhZ2UgKnZhbHVlKSB7Ci0gIHJldHVybiBbdmFsdWUgc2VyaWFsaXplZFNpemVdOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVVua25vd25Hcm91cFNpemVOb1RhZyhHUEJVbmtub3duRmllbGRTZXQgKnZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZS5zZXJpYWxpemVkU2l6ZTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVNZXNzYWdlU2l6ZU5vVGFnKEdQQk1lc3NhZ2UgKnZhbHVlKSB7Ci0gIHNpemVfdCBzaXplID0gW3ZhbHVlIHNlcmlhbGl6ZWRTaXplXTsKLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKHNpemUpICsgc2l6ZTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVCeXRlc1NpemVOb1RhZyhOU0RhdGEgKnZhbHVlKSB7Ci0gIE5TVUludGVnZXIgdmFsdWVMZW5ndGggPSBbdmFsdWUgbGVuZ3RoXTsKLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKHZhbHVlTGVuZ3RoKSArIHZhbHVlTGVuZ3RoOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVVJbnQzMlNpemVOb1RhZyhpbnQzMl90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplKHZhbHVlKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVFbnVtU2l6ZU5vVGFnKGludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKGludDMyX3QgdmFsdWUpIHsKLSNwcmFnbWEgdW51c2VkKHZhbHVlKQotICByZXR1cm4gTElUVExFX0VORElBTl8zMl9TSVpFOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKGludDY0X3QgdmFsdWUpIHsKLSNwcmFnbWEgdW51c2VkKHZhbHVlKQotICByZXR1cm4gTElUVExFX0VORElBTl82NF9TSVpFOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhpbnQzMl90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplKEdQQkVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlU0ludDY0U2l6ZU5vVGFnKGludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQ2NFNpemUoR1BCRW5jb2RlWmlnWmFnNjQodmFsdWUpKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVEb3VibGVTaXplKGludDMyX3QgZmllbGROdW1iZXIsIGRvdWJsZSB2YWx1ZSkgewotICByZXR1cm4gR1BCQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgR1BCQ29tcHV0ZURvdWJsZVNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlRmxvYXRTaXplKGludDMyX3QgZmllbGROdW1iZXIsIGZsb2F0IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlRmxvYXRTaXplTm9UYWcodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVVJbnQ2NFNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgdWludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIEdQQkNvbXB1dGVVSW50NjRTaXplTm9UYWcodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUludDY0U2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBpbnQ2NF90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlSW50NjRTaXplTm9UYWcodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUludDMyU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBpbnQzMl90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlSW50MzJTaXplTm9UYWcodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUZpeGVkNjRTaXplKGludDMyX3QgZmllbGROdW1iZXIsIHVpbnQ2NF90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlRml4ZWQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlRml4ZWQzMlNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgdWludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIEdQQkNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKHZhbHVlKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVCb29sU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBCT09MIHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlQm9vbFNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlU3RyaW5nU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBOU1N0cmluZyAqdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIEdQQkNvbXB1dGVTdHJpbmdTaXplTm9UYWcodmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZUdyb3VwU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBHUEJNZXNzYWdlICp2YWx1ZSkgewotICByZXR1cm4gR1BCQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICogMiArIEdQQkNvbXB1dGVHcm91cFNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlVW5rbm93bkdyb3VwU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQlVua25vd25GaWVsZFNldCAqdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSAqIDIgKwotICAgICAgICAgR1BCQ29tcHV0ZVVua25vd25Hcm91cFNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlTWVzc2FnZVNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgR1BCTWVzc2FnZSAqdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIEdQQkNvbXB1dGVNZXNzYWdlU2l6ZU5vVGFnKHZhbHVlKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVCeXRlc1NpemUoaW50MzJfdCBmaWVsZE51bWJlciwgTlNEYXRhICp2YWx1ZSkgewotICByZXR1cm4gR1BCQ29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgR1BCQ29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKHZhbHVlKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVVSW50MzJTaXplKGludDMyX3QgZmllbGROdW1iZXIsIHVpbnQzMl90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlVUludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVFbnVtU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBpbnQzMl90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlRW51bVNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlU0ZpeGVkMzJTaXplKGludDMyX3QgZmllbGROdW1iZXIsIGludDMyX3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIEdQQkNvbXB1dGVTRml4ZWQzMlNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlU0ZpeGVkNjRTaXplKGludDMyX3QgZmllbGROdW1iZXIsIGludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIEdQQkNvbXB1dGVTRml4ZWQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlU0ludDMyU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBpbnQzMl90IHZhbHVlKSB7Ci0gIHJldHVybiBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBHUEJDb21wdXRlU0ludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVTSW50NjRTaXplKGludDMyX3QgZmllbGROdW1iZXIsIGludDY0X3QgdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArCi0gICAgICAgICBHUEJDb21wdXRlUmF3VmFyaW50NjRTaXplKEdQQkVuY29kZVppZ1phZzY0KHZhbHVlKSk7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoaW50MzJfdCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCTWVzc2FnZSAqdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0SXRlbSkgKiAyICsKLSAgICAgICAgIEdQQkNvbXB1dGVVSW50MzJTaXplKEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0VHlwZUlkLCBmaWVsZE51bWJlcikgKwotICAgICAgICAgR1BCQ29tcHV0ZU1lc3NhZ2VTaXplKEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0TWVzc2FnZSwgdmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb25TaXplKGludDMyX3QgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRGF0YSAqdmFsdWUpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVUYWdTaXplKEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0SXRlbSkgKiAyICsKLSAgICAgICAgIEdQQkNvbXB1dGVVSW50MzJTaXplKEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0VHlwZUlkLCBmaWVsZE51bWJlcikgKwotICAgICAgICAgR1BCQ29tcHV0ZUJ5dGVzU2l6ZShHUEJXaXJlRm9ybWF0TWVzc2FnZVNldE1lc3NhZ2UsIHZhbHVlKTsKLX0KLQotc2l6ZV90IEdQQkNvbXB1dGVUYWdTaXplKGludDMyX3QgZmllbGROdW1iZXIpIHsKLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemUoCi0gICAgICBHUEJXaXJlRm9ybWF0TWFrZVRhZyhmaWVsZE51bWJlciwgR1BCV2lyZUZvcm1hdFZhcmludCkpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKGludCBmaWVsZF9udW1iZXIsIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIHNpemVfdCByZXN1bHQgPSBHUEJDb21wdXRlVGFnU2l6ZShmaWVsZF9udW1iZXIpOwotICBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVHcm91cCkgewotICAgIC8vIEdyb3VwcyBoYXZlIGJvdGggYSBzdGFydCBhbmQgYW4gZW5kIHRhZy4KLSAgICByZXR1cm4gcmVzdWx0ICogMjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplKGludDMyX3QgdmFsdWUpIHsKLSAgLy8gdmFsdWUgaXMgdHJlYXRlZCBhcyB1bnNpZ25lZCwgc28gaXQgd29uJ3QgYmUgc2lnbi1leHRlbmRlZCBpZiBuZWdhdGl2ZS4KLSAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDcpKSA9PSAwKSByZXR1cm4gMTsKLSAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmIDw8IDE0KSkgPT0gMCkgcmV0dXJuIDI7Ci0gIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCAyMSkpID09IDApIHJldHVybiAzOwotICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmYgPDwgMjgpKSA9PSAwKSByZXR1cm4gNDsKLSAgcmV0dXJuIDU7Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihOU0ludGVnZXIgdmFsdWUpIHsKLSAgLy8gTm90ZSB0aGUgdHJ1bmNhdGlvbi4KLSAgcmV0dXJuIEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemUoKGludDMyX3QpdmFsdWUpOwotfQotCi1zaXplX3QgR1BCQ29tcHV0ZVJhd1ZhcmludDY0U2l6ZShpbnQ2NF90IHZhbHVlKSB7Ci0gIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA3KSkgPT0gMCkgcmV0dXJuIDE7Ci0gIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAxNCkpID09IDApIHJldHVybiAyOwotICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgMjEpKSA9PSAwKSByZXR1cm4gMzsKLSAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDI4KSkgPT0gMCkgcmV0dXJuIDQ7Ci0gIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCAzNSkpID09IDApIHJldHVybiA1OwotICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNDIpKSA9PSAwKSByZXR1cm4gNjsKLSAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDQ5KSkgPT0gMCkgcmV0dXJuIDc7Ci0gIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZmZmZmZmZmZmTCA8PCA1NikpID09IDApIHJldHVybiA4OwotICBpZiAoKHZhbHVlICYgKDB4ZmZmZmZmZmZmZmZmZmZmZkwgPDwgNjMpKSA9PSAwKSByZXR1cm4gOTsKLSAgcmV0dXJuIDEwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJDb2RlZE91dHB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJDb2RlZE91dHB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZTdiYjRjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCQ29kZWRPdXRwdXRTdHJlYW1fUGFja2FnZVByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyNiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE2IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCQ29kZWRPdXRwdXRTdHJlYW0uaCIKLQotTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KLQotQ0ZfRVhURVJOX0NfQkVHSU4KLQotc2l6ZV90IEdQQkNvbXB1dGVEb3VibGVTaXplKGludDMyX3QgZmllbGROdW1iZXIsIGRvdWJsZSB2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVGbG9hdFNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgZmxvYXQgdmFsdWUpCi0gICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLXNpemVfdCBHUEJDb21wdXRlVUludDY0U2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCB1aW50NjRfdCB2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVJbnQ2NFNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgaW50NjRfdCB2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVJbnQzMlNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgaW50MzJfdCB2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVGaXhlZDY0U2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCB1aW50NjRfdCB2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVGaXhlZDMyU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCB1aW50MzJfdCB2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVCb29sU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBCT09MIHZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVN0cmluZ1NpemUoaW50MzJfdCBmaWVsZE51bWJlciwgTlNTdHJpbmcgKnZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUdyb3VwU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBHUEJNZXNzYWdlICp2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVVbmtub3duR3JvdXBTaXplKGludDMyX3QgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCVW5rbm93bkZpZWxkU2V0ICp2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVNZXNzYWdlU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBHUEJNZXNzYWdlICp2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVCeXRlc1NpemUoaW50MzJfdCBmaWVsZE51bWJlciwgTlNEYXRhICp2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVVSW50MzJTaXplKGludDMyX3QgZmllbGROdW1iZXIsIHVpbnQzMl90IHZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVNGaXhlZDMyU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBpbnQzMl90IHZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVNGaXhlZDY0U2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBpbnQ2NF90IHZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVNJbnQzMlNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgaW50MzJfdCB2YWx1ZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVTSW50NjRTaXplKGludDMyX3QgZmllbGROdW1iZXIsIGludDY0X3QgdmFsdWUpCi0gICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLXNpemVfdCBHUEJDb21wdXRlVGFnU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShpbnQgZmllbGRfbnVtYmVyLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkKLSAgICBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotCi1zaXplX3QgR1BCQ29tcHV0ZURvdWJsZVNpemVOb1RhZyhkb3VibGUgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUZsb2F0U2l6ZU5vVGFnKGZsb2F0IHZhbHVlKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVVSW50NjRTaXplTm9UYWcodWludDY0X3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUludDY0U2l6ZU5vVGFnKGludDY0X3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUludDMyU2l6ZU5vVGFnKGludDMyX3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUZpeGVkNjRTaXplTm9UYWcodWludDY0X3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUZpeGVkMzJTaXplTm9UYWcodWludDMyX3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUJvb2xTaXplTm9UYWcoQk9PTCB2YWx1ZSkgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLXNpemVfdCBHUEJDb21wdXRlU3RyaW5nU2l6ZU5vVGFnKE5TU3RyaW5nICp2YWx1ZSkgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLXNpemVfdCBHUEJDb21wdXRlR3JvdXBTaXplTm9UYWcoR1BCTWVzc2FnZSAqdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVVua25vd25Hcm91cFNpemVOb1RhZyhHUEJVbmtub3duRmllbGRTZXQgKnZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcoR1BCTWVzc2FnZSAqdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKE5TRGF0YSAqdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVVJbnQzMlNpemVOb1RhZyhpbnQzMl90IHZhbHVlKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVFbnVtU2l6ZU5vVGFnKGludDMyX3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKGludDMyX3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKGludDY0X3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVNJbnQzMlNpemVOb1RhZyhpbnQzMl90IHZhbHVlKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotc2l6ZV90IEdQQkNvbXB1dGVTSW50NjRTaXplTm9UYWcoaW50NjRfdCB2YWx1ZSkgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLQotLy8gTm90ZSB0aGF0IHRoaXMgd2lsbCBjYWxjdWxhdGUgdGhlIHNpemUgb2YgNjQgYml0IHZhbHVlcyB0cnVuY2F0ZWQgdG8gMzIuCi1zaXplX3QgR1BCQ29tcHV0ZVNpemVUU2l6ZUFzSW50MzJOb1RhZyhzaXplX3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci0KLXNpemVfdCBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplKGludDMyX3QgdmFsdWUpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci1zaXplX3QgR1BCQ29tcHV0ZVJhd1ZhcmludDY0U2l6ZShpbnQ2NF90IHZhbHVlKSBfX2F0dHJpYnV0ZV9fKChjb25zdCkpOwotCi0vLyBOb3RlIHRoYXQgdGhpcyB3aWxsIGNhbGN1bGF0ZSB0aGUgc2l6ZSBvZiA2NCBiaXQgdmFsdWVzIHRydW5jYXRlZCB0byAzMi4KLXNpemVfdCBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihOU0ludGVnZXIgdmFsdWUpCi0gICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLQotLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0vLyBNZXNzYWdlU2V0IGV4dGVuc2lvbiB0byB0aGUgc3RyZWFtLiAgRm9yIGhpc3RvcmljYWwgcmVhc29ucywKLS8vIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KLXNpemVfdCBHUEJDb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoaW50MzJfdCBmaWVsZE51bWJlciwgR1BCTWVzc2FnZSAqdmFsdWUpCi0gICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLQotLy8gQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotLy8gdW5wYXJzZWQgTWVzc2FnZVNldCBleHRlbnNpb24gZmllbGQgdG8gdGhlIHN0cmVhbS4gIEZvcgotLy8gaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgd2lyZSBmb3JtYXQgZGlmZmVycyBmcm9tIG5vcm1hbCBmaWVsZHMuCi1zaXplX3QgR1BCQ29tcHV0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb25TaXplKGludDMyX3QgZmllbGROdW1iZXIsIE5TRGF0YSAqdmFsdWUpCi0gICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLQotc2l6ZV90IEdQQkNvbXB1dGVFbnVtU2l6ZShpbnQzMl90IGZpZWxkTnVtYmVyLCBpbnQzMl90IHZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci0KLUNGX0VYVEVSTl9DX0VORAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRGVzY3JpcHRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJEZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE2ZWZmMGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJEZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJHUEJSdW50aW1lVHlwZXMuaCIKLQotQGNsYXNzIEdQQkVudW1EZXNjcmlwdG9yOwotQGNsYXNzIEdQQkZpZWxkRGVzY3JpcHRvcjsKLUBjbGFzcyBHUEJGaWxlRGVzY3JpcHRvcjsKLUBjbGFzcyBHUEJPbmVvZkRlc2NyaXB0b3I7Ci0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLXR5cGVkZWYgTlNfRU5VTSh1aW50OF90LCBHUEJGaWxlU3ludGF4KSB7Ci0gIEdQQkZpbGVTeW50YXhVbmtub3duID0gMCwKLSAgR1BCRmlsZVN5bnRheFByb3RvMiA9IDIsCi0gIEdQQkZpbGVTeW50YXhQcm90bzMgPSAzLAotfTsKLQotdHlwZWRlZiBOU19FTlVNKHVpbnQ4X3QsIEdQQkZpZWxkVHlwZSkgewotICBHUEJGaWVsZFR5cGVTaW5nbGUsICAgIC8vIG9wdGlvbmFsL3JlcXVpcmVkCi0gIEdQQkZpZWxkVHlwZVJlcGVhdGVkLCAgLy8gcmVwZWF0ZWQKLSAgR1BCRmllbGRUeXBlTWFwLCAgICAgICAvLyBtYXA8SyxWPgotfTsKLQotQGludGVyZmFjZSBHUEJEZXNjcmlwdG9yIDogTlNPYmplY3Q8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgY29weSkgTlNTdHJpbmcgKm5hbWU7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgc3Ryb25nLCBudWxsYWJsZSkgTlNBcnJheTxHUEJGaWVsZERlc2NyaXB0b3IqPiAqZmllbGRzOwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIHN0cm9uZywgbnVsbGFibGUpIE5TQXJyYXk8R1BCT25lb2ZEZXNjcmlwdG9yKj4gKm9uZW9mczsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5LCBudWxsYWJsZSkgY29uc3QgR1BCRXh0ZW5zaW9uUmFuZ2UgKmV4dGVuc2lvblJhbmdlczsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSB1aW50MzJfdCBleHRlbnNpb25SYW5nZXNDb3VudDsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5LCBhc3NpZ24pIEdQQkZpbGVEZXNjcmlwdG9yICpmaWxlOwotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgZ2V0dGVyPWlzV2lyZUZvcm1hdCkgQk9PTCB3aXJlRm9ybWF0OwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIENsYXNzIG1lc3NhZ2VDbGFzczsKLQotLSAobnVsbGFibGUgR1BCRmllbGREZXNjcmlwdG9yICopZmllbGRXaXRoTnVtYmVyOih1aW50MzJfdClmaWVsZE51bWJlcjsKLS0gKG51bGxhYmxlIEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZTsKLS0gKG51bGxhYmxlIEdQQk9uZW9mRGVzY3JpcHRvciAqKW9uZW9mV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZTsKLQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQkZpbGVEZXNjcmlwdG9yIDogTlNPYmplY3QKLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpwYWNrYWdlOwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIEdQQkZpbGVTeW50YXggc3ludGF4OwotCi1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCT25lb2ZEZXNjcmlwdG9yIDogTlNPYmplY3QKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1N0cmluZyAqbmFtZTsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU0FycmF5PEdQQkZpZWxkRGVzY3JpcHRvcio+ICpmaWVsZHM7Ci0KLS0gKG51bGxhYmxlIEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkV2l0aE51bWJlcjoodWludDMyX3QpZmllbGROdW1iZXI7Ci0tIChudWxsYWJsZSBHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZFdpdGhOYW1lOihOU1N0cmluZyAqKW5hbWU7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCRmllbGREZXNjcmlwdG9yIDogTlNPYmplY3QKLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIGNvcHkpIE5TU3RyaW5nICpuYW1lOwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIHVpbnQzMl90IG51bWJlcjsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBHUEJEYXRhVHlwZSBkYXRhVHlwZTsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBCT09MIGhhc0RlZmF1bHRWYWx1ZTsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBHUEJHZW5lcmljVmFsdWUgZGVmYXVsdFZhbHVlOwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIGdldHRlcj1pc1JlcXVpcmVkKSBCT09MIHJlcXVpcmVkOwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIGdldHRlcj1pc09wdGlvbmFsKSBCT09MIG9wdGlvbmFsOwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIEdQQkZpZWxkVHlwZSBmaWVsZFR5cGU7Ci0vLyBJZiBpdCBpcyBhIG1hcCwgdGhlIHZhbHVlIHR5cGUgaXMgaW4gLXR5cGUuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgR1BCRGF0YVR5cGUgbWFwS2V5RGF0YVR5cGU7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgZ2V0dGVyPWlzUGFja2FibGUpIEJPT0wgcGFja2FibGU7Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5LCBhc3NpZ24sIG51bGxhYmxlKSBHUEJPbmVvZkRlc2NyaXB0b3IgKmNvbnRhaW5pbmdPbmVvZjsKLQotLy8gTWVzc2FnZSBwcm9wZXJ0aWVzCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgYXNzaWduLCBudWxsYWJsZSkgQ2xhc3MgbXNnQ2xhc3M7Ci0KLS8vIEVudW0gcHJvcGVydGllcwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIHN0cm9uZywgbnVsbGFibGUpIEdQQkVudW1EZXNjcmlwdG9yICplbnVtRGVzY3JpcHRvcjsKLQotLSAoQk9PTClpc1ZhbGlkRW51bVZhbHVlOihpbnQzMl90KXZhbHVlOwotCi0vLyBGb3Igbm93LCB0aGlzIHdpbGwgcmV0dXJuIG5pbCBpZiBpdCBkb2Vzbid0IGtub3cgdGhlIG5hbWUgdG8gdXNlIGZvcgotLy8gVGV4dEZvcm1hdC4KLS0gKG51bGxhYmxlIE5TU3RyaW5nICopdGV4dEZvcm1hdE5hbWU7Ci0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJFbnVtRGVzY3JpcHRvciA6IE5TT2JqZWN0Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5LCBjb3B5KSBOU1N0cmluZyAqbmFtZTsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZW51bVZlcmlmaWVyOwotCi0tIChudWxsYWJsZSBOU1N0cmluZyAqKWVudW1OYW1lRm9yVmFsdWU6KGludDMyX3QpbnVtYmVyOwotLSAoQk9PTClnZXRWYWx1ZToobnVsbGFibGUgaW50MzJfdCAqKW91dFZhbHVlIGZvckVudW1OYW1lOihOU1N0cmluZyAqKW5hbWU7Ci0KLS0gKG51bGxhYmxlIE5TU3RyaW5nICopdGV4dEZvcm1hdE5hbWVGb3JWYWx1ZTooaW50MzJfdCludW1iZXI7Ci0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJFeHRlbnNpb25EZXNjcmlwdG9yIDogTlNPYmplY3Q8TlNDb3B5aW5nPgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIHVpbnQzMl90IGZpZWxkTnVtYmVyOwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIENsYXNzIGNvbnRhaW5pbmdNZXNzYWdlQ2xhc3M7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgR1BCRGF0YVR5cGUgZGF0YVR5cGU7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgZ2V0dGVyPWlzUmVwZWF0ZWQpIEJPT0wgcmVwZWF0ZWQ7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgZ2V0dGVyPWlzUGFja2FibGUpIEJPT0wgcGFja2FibGU7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgYXNzaWduKSBDbGFzcyBtc2dDbGFzczsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1N0cmluZyAqc2luZ2xldG9uTmFtZTsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5LCBzdHJvbmcsIG51bGxhYmxlKSBHUEJFbnVtRGVzY3JpcHRvciAqZW51bURlc2NyaXB0b3I7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgaWQgZGVmYXVsdFZhbHVlOwotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRGVzY3JpcHRvci5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJEZXNjcmlwdG9yLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI3MDk3MzcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJEZXNjcmlwdG9yLm0KKysrIC9kZXYvbnVsbApAQCAtMSw5NjMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3JfUGFja2FnZVByaXZhdGUuaCIKLQotI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+Ci0KLSNpbXBvcnQgIkdQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCV2lyZUZvcm1hdC5oIgotI2ltcG9ydCAiR1BCTWVzc2FnZV9QYWNrYWdlUHJpdmF0ZS5oIgotCi0vLyBUaGUgYWRkcmVzcyBvZiB0aGlzIHZhcmlhYmxlIGlzIHVzZWQgYXMgYSBrZXkgZm9yIG9ial9nZXRBc3NvY2lhdGVkT2JqZWN0Lgotc3RhdGljIGNvbnN0IGNoYXIga1RleHRGb3JtYXRFeHRyYVZhbHVlS2V5ID0gMDsKLQotLy8gVXRpbGl0eSBmdW5jdGlvbiB0byBnZW5lcmF0ZSBzZWxlY3RvcnMgb24gdGhlIGZseS4KLXN0YXRpYyBTRUwgU2VsRnJvbVN0cmluZ3MoY29uc3QgY2hhciAqcHJlZml4LCBjb25zdCBjaGFyICptaWRkbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN1ZmZpeCwgQk9PTCB0YWtlc0FyZykgewotICBpZiAocHJlZml4ID09IE5VTEwgJiYgc3VmZml4ID09IE5VTEwgJiYgIXRha2VzQXJnKSB7Ci0gICAgcmV0dXJuIHNlbF9nZXRVaWQobWlkZGxlKTsKLSAgfQotICBjb25zdCBzaXplX3QgcHJlZml4TGVuID0gcHJlZml4ICE9IE5VTEwgPyBzdHJsZW4ocHJlZml4KSA6IDA7Ci0gIGNvbnN0IHNpemVfdCBtaWRkbGVMZW4gPSBzdHJsZW4obWlkZGxlKTsKLSAgY29uc3Qgc2l6ZV90IHN1ZmZpeExlbiA9IHN1ZmZpeCAhPSBOVUxMID8gc3RybGVuKHN1ZmZpeCkgOiAwOwotICBzaXplX3QgdG90YWxMZW4gPQotICAgICAgcHJlZml4TGVuICsgbWlkZGxlTGVuICsgc3VmZml4TGVuICsgMTsgIC8vIGluY2x1ZGUgc3BhY2UgZm9yIG51bGwgb24gZW5kLgotICBpZiAodGFrZXNBcmcpIHsKLSAgICB0b3RhbExlbiArPSAxOwotICB9Ci0gIGNoYXIgYnVmZmVyW3RvdGFsTGVuXTsKLSAgaWYgKHByZWZpeCAhPSBOVUxMKSB7Ci0gICAgbWVtY3B5KGJ1ZmZlciwgcHJlZml4LCBwcmVmaXhMZW4pOwotICAgIG1lbWNweShidWZmZXIgKyBwcmVmaXhMZW4sIG1pZGRsZSwgbWlkZGxlTGVuKTsKLSAgICBidWZmZXJbcHJlZml4TGVuXSA9IChjaGFyKXRvdXBwZXIoYnVmZmVyW3ByZWZpeExlbl0pOwotICB9IGVsc2UgewotICAgIG1lbWNweShidWZmZXIsIG1pZGRsZSwgbWlkZGxlTGVuKTsKLSAgfQotICBpZiAoc3VmZml4ICE9IE5VTEwpIHsKLSAgICBtZW1jcHkoYnVmZmVyICsgcHJlZml4TGVuICsgbWlkZGxlTGVuLCBzdWZmaXgsIHN1ZmZpeExlbik7Ci0gIH0KLSAgaWYgKHRha2VzQXJnKSB7Ci0gICAgYnVmZmVyW3RvdGFsTGVuIC0gMl0gPSAnOic7Ci0gIH0KLSAgLy8gQWx3YXlzIG51bGwgdGVybWluYXRlIGl0LgotICBidWZmZXJbdG90YWxMZW4gLSAxXSA9IDA7Ci0KLSAgU0VMIHJlc3VsdCA9IHNlbF9nZXRVaWQoYnVmZmVyKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIE5TQXJyYXkgKk5ld0ZpZWxkc0FycmF5Rm9ySGFzSW5kZXgoaW50IGhhc0luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNBcnJheSAqYWxsTWVzc2FnZUZpZWxkcykKLSAgICBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSk7Ci0KLXN0YXRpYyBOU0FycmF5ICpOZXdGaWVsZHNBcnJheUZvckhhc0luZGV4KGludCBoYXNJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TQXJyYXkgKmFsbE1lc3NhZ2VGaWVsZHMpIHsKLSAgTlNNdXRhYmxlQXJyYXkgKnJlc3VsdCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOwotICBmb3IgKEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGREZXNjIGluIGFsbE1lc3NhZ2VGaWVsZHMpIHsKLSAgICBpZiAoZmllbGREZXNjLT5kZXNjcmlwdGlvbl8tPmhhc0luZGV4ID09IGhhc0luZGV4KSB7Ci0gICAgICBbcmVzdWx0IGFkZE9iamVjdDpmaWVsZERlc2NdOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1AaW1wbGVtZW50YXRpb24gR1BCRGVzY3JpcHRvciB7Ci0gIENsYXNzIG1lc3NhZ2VDbGFzc187Ci0gIEdQQkZpbGVEZXNjcmlwdG9yICpmaWxlXzsKLSAgQk9PTCB3aXJlRm9ybWF0XzsKLX0KLQotQHN5bnRoZXNpemUgbWVzc2FnZUNsYXNzID0gbWVzc2FnZUNsYXNzXzsKLUBzeW50aGVzaXplIGZpZWxkcyA9IGZpZWxkc187Ci1Ac3ludGhlc2l6ZSBvbmVvZnMgPSBvbmVvZnNfOwotQHN5bnRoZXNpemUgZXh0ZW5zaW9uUmFuZ2VzID0gZXh0ZW5zaW9uUmFuZ2VzXzsKLUBzeW50aGVzaXplIGV4dGVuc2lvblJhbmdlc0NvdW50ID0gZXh0ZW5zaW9uUmFuZ2VzQ291bnRfOwotQHN5bnRoZXNpemUgZmlsZSA9IGZpbGVfOwotQHN5bnRoZXNpemUgd2lyZUZvcm1hdCA9IHdpcmVGb3JtYXRfOwotCi0rIChpbnN0YW5jZXR5cGUpCi0gICAgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6KENsYXNzKW1lc3NhZ2VDbGFzcwotICAgICAgICAgICAgICAgICAgcm9vdENsYXNzOihDbGFzcylyb290Q2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgZmlsZTooR1BCRmlsZURlc2NyaXB0b3IgKilmaWxlCi0gICAgICAgICAgICAgICAgICAgICBmaWVsZHM6KHZvaWQgKilmaWVsZERlc2NyaXB0aW9ucwotICAgICAgICAgICAgICAgICBmaWVsZENvdW50Oih1aW50MzJfdClmaWVsZENvdW50Ci0gICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6KHVpbnQzMl90KXN0b3JhZ2VTaXplCi0gICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6KEdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdzKWZsYWdzIHsKLSAgLy8gVGhlIHJvb3RDbGFzcyBpcyBubyBsb25nZXIgdXNlZCwgYnV0IGl0IGlzIHBhc3NlZCBpbiB0byBlbnN1cmUgaXQKLSAgLy8gd2FzIHN0YXJ0ZWQgdXAgZHVyaW5nIGluaXRpYWxpemF0aW9uIGFsc28uCi0gICh2b2lkKXJvb3RDbGFzczsKLSAgTlNNdXRhYmxlQXJyYXkgKmZpZWxkcyA9IG5pbDsKLSAgR1BCRmlsZVN5bnRheCBzeW50YXggPSBmaWxlLnN5bnRheDsKLSAgQk9PTCBmaWVsZHNJbmNsdWRlRGVmYXVsdCA9Ci0gICAgICAoZmxhZ3MgJiBHUEJEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25GbGFnX0ZpZWxkc1dpdGhEZWZhdWx0KSAhPSAwOwotCi0gIHZvaWQgKmRlc2M7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBmaWVsZENvdW50OyArK2kpIHsKLSAgICBpZiAoZmllbGRzID09IG5pbCkgewotICAgICAgZmllbGRzID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpmaWVsZENvdW50XTsKLSAgICB9Ci0gICAgLy8gTmVlZCBjb3JyZWN0bHkgdHlwZWQgcG9pbnRlciBmb3IgYXJyYXkgaW5kZXhpbmcgYmVsb3cgdG8gd29yay4KLSAgICBpZiAoZmllbGRzSW5jbHVkZURlZmF1bHQpIHsKLSAgICAgIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uV2l0aERlZmF1bHQgKmZpZWxkRGVzY1dpdGhEZWZhdWx0ID0gZmllbGREZXNjcmlwdGlvbnM7Ci0gICAgICBkZXNjID0gJihmaWVsZERlc2NXaXRoRGVmYXVsdFtpXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uICpmaWVsZERlc2MgPSBmaWVsZERlc2NyaXB0aW9uczsKLSAgICAgIGRlc2MgPSAmKGZpZWxkRGVzY1tpXSk7Ci0gICAgfQotICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGREZXNjcmlwdG9yID0KLSAgICAgICAgW1tHUEJGaWVsZERlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoRmllbGREZXNjcmlwdGlvbjpkZXNjCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlc0RlZmF1bHQ6ZmllbGRzSW5jbHVkZURlZmF1bHQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDpzeW50YXhdOwotICAgIFtmaWVsZHMgYWRkT2JqZWN0OmZpZWxkRGVzY3JpcHRvcl07Ci0gICAgW2ZpZWxkRGVzY3JpcHRvciByZWxlYXNlXTsKLSAgfQotCi0gIEJPT0wgd2lyZUZvcm1hdCA9IChmbGFncyAmIEdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdfV2lyZUZvcm1hdCkgIT0gMDsKLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtbc2VsZiBhbGxvY10gaW5pdFdpdGhDbGFzczptZXNzYWdlQ2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpmaWxlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c3RvcmFnZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZUZvcm1hdDp3aXJlRm9ybWF0XTsKLSAgW2ZpZWxkcyByZWxlYXNlXTsKLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENsYXNzOihDbGFzcyltZXNzYWdlQ2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOihHUEJGaWxlRGVzY3JpcHRvciAqKWZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOihOU0FycmF5ICopZmllbGRzCi0gICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZToodWludDMyX3Qpc3RvcmFnZVNpemUKLSAgICAgICAgICAgICAgICAgICB3aXJlRm9ybWF0OihCT09MKXdpcmVGb3JtYXQgewotICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7Ci0gICAgbWVzc2FnZUNsYXNzXyA9IG1lc3NhZ2VDbGFzczsKLSAgICBmaWxlXyA9IGZpbGU7Ci0gICAgZmllbGRzXyA9IFtmaWVsZHMgcmV0YWluXTsKLSAgICBzdG9yYWdlU2l6ZV8gPSBzdG9yYWdlU2l6ZTsKLSAgICB3aXJlRm9ybWF0XyA9IHdpcmVGb3JtYXQ7Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIFtmaWVsZHNfIHJlbGVhc2VdOwotICBbb25lb2ZzXyByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tICh2b2lkKXNldHVwT25lb2ZzOihjb25zdCBjaGFyICoqKW9uZW9mTmFtZXMKLSAgICAgICAgICAgICAgY291bnQ6KHVpbnQzMl90KWNvdW50Ci0gICAgICBmaXJzdEhhc0luZGV4OihpbnQzMl90KWZpcnN0SGFzSW5kZXggewotICBOU0NBc3NlcnQoZmlyc3RIYXNJbmRleCA8IDAsIEAiU2hvdWxkIGFsd2F5cyBiZSA8MCIpOwotICBOU011dGFibGVBcnJheSAqb25lb2ZzID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpjb3VudF07Ci0gIGZvciAodWludDMyX3QgaSA9IDAsIGhhc0luZGV4ID0gZmlyc3RIYXNJbmRleDsgaSA8IGNvdW50OyArK2ksIC0taGFzSW5kZXgpIHsKLSAgICBjb25zdCBjaGFyICpuYW1lID0gb25lb2ZOYW1lc1tpXTsKLSAgICBOU0FycmF5ICpmaWVsZHNGb3JPbmVvZiA9IE5ld0ZpZWxkc0FycmF5Rm9ySGFzSW5kZXgoaGFzSW5kZXgsIGZpZWxkc18pOwotICAgIE5TQ0Fzc2VydChmaWVsZHNGb3JPbmVvZi5jb3VudCA+IDAsCi0gICAgICAgICAgICAgIEAiTm8gZmllbGRzIGZvciB0aGlzIG9uZW9mPyAoJXM6JWQpIiwgbmFtZSwgaGFzSW5kZXgpOwotICAgIEdQQk9uZW9mRGVzY3JpcHRvciAqb25lb2ZEZXNjcmlwdG9yID0KLSAgICAgICAgW1tHUEJPbmVvZkRlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoTmFtZTpuYW1lIGZpZWxkczpmaWVsZHNGb3JPbmVvZl07Ci0gICAgW29uZW9mcyBhZGRPYmplY3Q6b25lb2ZEZXNjcmlwdG9yXTsKLSAgICBbb25lb2ZEZXNjcmlwdG9yIHJlbGVhc2VdOwotICAgIFtmaWVsZHNGb3JPbmVvZiByZWxlYXNlXTsKLSAgfQotICBvbmVvZnNfID0gb25lb2ZzOwotfQotCi0tICh2b2lkKXNldHVwRXh0cmFUZXh0SW5mbzooY29uc3QgY2hhciAqKWV4dHJhVGV4dEZvcm1hdEluZm8gewotICAvLyBFeHRyYSBpbmZvIGlzIGEgY29tcGlsZSB0aW1lIG9wdGlvbiwgc28gc2tpcCB0aGUgd29yayBpZiBub3QgbmVlZGVkLgotICBpZiAoZXh0cmFUZXh0Rm9ybWF0SW5mbykgewotICAgIE5TVmFsdWUgKmV4dHJhSW5mb1ZhbHVlID0gW05TVmFsdWUgdmFsdWVXaXRoUG9pbnRlcjpleHRyYVRleHRGb3JtYXRJbmZvXTsKLSAgICBmb3IgKEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGREZXNjcmlwdG9yIGluIGZpZWxkc18pIHsKLSAgICAgIGlmIChmaWVsZERlc2NyaXB0b3ItPmRlc2NyaXB0aW9uXy0+ZmxhZ3MgJiBHUEJGaWVsZFRleHRGb3JtYXROYW1lQ3VzdG9tKSB7Ci0gICAgICAgIG9iamNfc2V0QXNzb2NpYXRlZE9iamVjdChmaWVsZERlc2NyaXB0b3IsICZrVGV4dEZvcm1hdEV4dHJhVmFsdWVLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRyYUluZm9WYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9CSkNfQVNTT0NJQVRJT05fUkVUQUlOX05PTkFUT01JQyk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0dXBFeHRlbnNpb25SYW5nZXM6KGNvbnN0IEdQQkV4dGVuc2lvblJhbmdlICopcmFuZ2VzIGNvdW50OihpbnQzMl90KWNvdW50IHsKLSAgZXh0ZW5zaW9uUmFuZ2VzXyA9IHJhbmdlczsKLSAgZXh0ZW5zaW9uUmFuZ2VzQ291bnRfID0gY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopbmFtZSB7Ci0gIHJldHVybiBOU1N0cmluZ0Zyb21DbGFzcyhtZXNzYWdlQ2xhc3NfKTsKLX0KLQotLSAoaWQpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSNwcmFnbWEgdW51c2VkKHpvbmUpCi0gIHJldHVybiBbc2VsZiByZXRhaW5dOwotfQotCi0tIChHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZFdpdGhOdW1iZXI6KHVpbnQzMl90KWZpZWxkTnVtYmVyIHsKLSAgZm9yIChHUEJGaWVsZERlc2NyaXB0b3IgKmRlc2NyaXB0b3IgaW4gZmllbGRzXykgewotICAgIGlmIChHUEJGaWVsZE51bWJlcihkZXNjcmlwdG9yKSA9PSBmaWVsZE51bWJlcikgewotICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgfQotICB9Ci0gIHJldHVybiBuaWw7Ci19Ci0KLS0gKEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSB7Ci0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpkZXNjcmlwdG9yIGluIGZpZWxkc18pIHsKLSAgICBpZiAoW2Rlc2NyaXB0b3IubmFtZSBpc0VxdWFsOm5hbWVdKSB7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRvcjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbDsKLX0KLQotLSAoR1BCT25lb2ZEZXNjcmlwdG9yICopb25lb2ZXaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lIHsKLSAgZm9yIChHUEJPbmVvZkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgaW4gb25lb2ZzXykgewotICAgIGlmIChbZGVzY3JpcHRvci5uYW1lIGlzRXF1YWw6bmFtZV0pIHsKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yOwotICAgIH0KLSAgfQotICByZXR1cm4gbmlsOwotfQotCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJGaWxlRGVzY3JpcHRvciB7Ci0gIE5TU3RyaW5nICpwYWNrYWdlXzsKLSAgR1BCRmlsZVN5bnRheCBzeW50YXhfOwotfQotCi1Ac3ludGhlc2l6ZSBwYWNrYWdlID0gcGFja2FnZV87Ci1Ac3ludGhlc2l6ZSBzeW50YXggPSBzeW50YXhfOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhQYWNrYWdlOihOU1N0cmluZyAqKXBhY2thZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXg6KEdQQkZpbGVTeW50YXgpc3ludGF4IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBwYWNrYWdlXyA9IFtwYWNrYWdlIGNvcHldOwotICAgIHN5bnRheF8gPSBzeW50YXg7Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQk9uZW9mRGVzY3JpcHRvcgotCi1Ac3ludGhlc2l6ZSBmaWVsZHMgPSBmaWVsZHNfOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhOYW1lOihjb25zdCBjaGFyICopbmFtZSBmaWVsZHM6KE5TQXJyYXkgKilmaWVsZHMgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIG5hbWVfID0gbmFtZTsKLSAgICBmaWVsZHNfID0gW2ZpZWxkcyByZXRhaW5dOwotICAgIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZERlc2MgaW4gZmllbGRzKSB7Ci0gICAgICBmaWVsZERlc2MtPmNvbnRhaW5pbmdPbmVvZl8gPSBzZWxmOwotICAgIH0KLQotICAgIGNhc2VTZWxfID0gU2VsRnJvbVN0cmluZ3MoTlVMTCwgbmFtZSwgIk9uZU9mQ2FzZSIsIE5PKTsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgW2ZpZWxkc18gcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoTlNTdHJpbmcgKiluYW1lIHsKLSAgcmV0dXJuIEAobmFtZV8pOwotfQotCi0tIChHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZFdpdGhOdW1iZXI6KHVpbnQzMl90KWZpZWxkTnVtYmVyIHsKLSAgZm9yIChHUEJGaWVsZERlc2NyaXB0b3IgKmRlc2NyaXB0b3IgaW4gZmllbGRzXykgewotICAgIGlmIChHUEJGaWVsZE51bWJlcihkZXNjcmlwdG9yKSA9PSBmaWVsZE51bWJlcikgewotICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgfQotICB9Ci0gIHJldHVybiBuaWw7Ci19Ci0KLS0gKEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkV2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZSB7Ci0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpkZXNjcmlwdG9yIGluIGZpZWxkc18pIHsKLSAgICBpZiAoW2Rlc2NyaXB0b3IubmFtZSBpc0VxdWFsOm5hbWVdKSB7Ci0gICAgICByZXR1cm4gZGVzY3JpcHRvcjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5pbDsKLX0KLQotQGVuZAotCi11aW50MzJfdCBHUEJGaWVsZFRhZyhHUEJGaWVsZERlc2NyaXB0b3IgKnNlbGYpIHsKLSAgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gKmRlc2NyaXB0aW9uID0gc2VsZi0+ZGVzY3JpcHRpb25fOwotICBHUEJXaXJlRm9ybWF0IGZvcm1hdDsKLSAgaWYgKChkZXNjcmlwdGlvbi0+ZmxhZ3MgJiBHUEJGaWVsZE1hcEtleU1hc2spICE9IDApIHsKLSAgICAvLyBNYXBzIGFyZSByZXBlYXRlZCBtZXNzYWdlcyBvbiB0aGUgd2lyZS4KLSAgICBmb3JtYXQgPSBHUEJXaXJlRm9ybWF0Rm9yVHlwZShHUEJEYXRhVHlwZU1lc3NhZ2UsIE5PKTsKLSAgfSBlbHNlIHsKLSAgICBmb3JtYXQgPSBHUEJXaXJlRm9ybWF0Rm9yVHlwZShkZXNjcmlwdGlvbi0+ZGF0YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKChkZXNjcmlwdGlvbi0+ZmxhZ3MgJiBHUEJGaWVsZFBhY2tlZCkgIT0gMCkpOwotICB9Ci0gIHJldHVybiBHUEJXaXJlRm9ybWF0TWFrZVRhZyhkZXNjcmlwdGlvbi0+bnVtYmVyLCBmb3JtYXQpOwotfQotCi11aW50MzJfdCBHUEJGaWVsZEFsdGVybmF0ZVRhZyhHUEJGaWVsZERlc2NyaXB0b3IgKnNlbGYpIHsKLSAgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gKmRlc2NyaXB0aW9uID0gc2VsZi0+ZGVzY3JpcHRpb25fOwotICBOU0NBc3NlcnQoKGRlc2NyaXB0aW9uLT5mbGFncyAmIEdQQkZpZWxkUmVwZWF0ZWQpICE9IDAsCi0gICAgICAgICAgICBAIk9ubHkgdmFsaWQgb24gcmVwZWF0ZWQgZmllbGRzIik7Ci0gIEdQQldpcmVGb3JtYXQgZm9ybWF0ID0KLSAgICAgIEdQQldpcmVGb3JtYXRGb3JUeXBlKGRlc2NyaXB0aW9uLT5kYXRhVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICgoZGVzY3JpcHRpb24tPmZsYWdzICYgR1BCRmllbGRQYWNrZWQpID09IDApKTsKLSAgcmV0dXJuIEdQQldpcmVGb3JtYXRNYWtlVGFnKGRlc2NyaXB0aW9uLT5udW1iZXIsIGZvcm1hdCk7Ci19Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJGaWVsZERlc2NyaXB0b3IgewotICBHUEJHZW5lcmljVmFsdWUgZGVmYXVsdFZhbHVlXzsKLQotICAvLyBNZXNzYWdlIGl2YXJzCi0gIENsYXNzIG1zZ0NsYXNzXzsKLQotICAvLyBFbnVtIGl2YXJzLgotICAvLyBJZiBwcm90b3MgYXJlIGdlbmVyYXRlZCB3aXRoIEdlbmVyYXRlRW51bURlc2NyaXB0b3JzIG9uIHRoZW4gaXQgd2lsbAotICAvLyBiZSBhIGVudW1EZXNjcmlwdG9yLCBvdGhlcndpc2UgaXQgd2lsbCBiZSBhIGVudW1WZXJpZmllci4KLSAgdW5pb24gewotICAgIEdQQkVudW1EZXNjcmlwdG9yICplbnVtRGVzY3JpcHRvcl87Ci0gICAgR1BCRW51bVZhbGlkYXRpb25GdW5jIGVudW1WZXJpZmllcl87Ci0gIH0gZW51bUhhbmRsaW5nXzsKLX0KLQotQHN5bnRoZXNpemUgbXNnQ2xhc3MgPSBtc2dDbGFzc187Ci1Ac3ludGhlc2l6ZSBjb250YWluaW5nT25lb2YgPSBjb250YWluaW5nT25lb2ZfOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIC8vIFRocm93IGFuIGV4Y2VwdGlvbiBpZiBwZW9wbGUgYXR0ZW1wdCB0byBub3QgdXNlIHRoZSBkZXNpZ25hdGVkIGluaXRpYWxpemVyLgotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZiAhPSBuaWwpIHsKLSAgICBbc2VsZiBkb2VzTm90UmVjb2duaXplU2VsZWN0b3I6X2NtZF07Ci0gICAgc2VsZiA9IG5pbDsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRmllbGREZXNjcmlwdGlvbjoodm9pZCAqKWRlc2NyaXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZXNEZWZhdWx0OihCT09MKWluY2x1ZGVzRGVmYXVsdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDooR1BCRmlsZVN5bnRheClzeW50YXggewotICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7Ci0gICAgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gKmNvcmVEZXNjOwotICAgIGlmIChpbmNsdWRlc0RlZmF1bHQpIHsKLSAgICAgIGNvcmVEZXNjID0gJigoKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uV2l0aERlZmF1bHQgKilkZXNjcmlwdGlvbiktPmNvcmUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBjb3JlRGVzYyA9IGRlc2NyaXB0aW9uOwotICAgIH0KLSAgICBkZXNjcmlwdGlvbl8gPSBjb3JlRGVzYzsKLSAgICBnZXRTZWxfID0gc2VsX2dldFVpZChjb3JlRGVzYy0+bmFtZSk7Ci0gICAgc2V0U2VsXyA9IFNlbEZyb21TdHJpbmdzKCJzZXQiLCBjb3JlRGVzYy0+bmFtZSwgTlVMTCwgWUVTKTsKLQotICAgIEdQQkRhdGFUeXBlIGRhdGFUeXBlID0gY29yZURlc2MtPmRhdGFUeXBlOwotICAgIEJPT0wgaXNNZXNzYWdlID0gR1BCRGF0YVR5cGVJc01lc3NhZ2UoZGF0YVR5cGUpOwotICAgIEJPT0wgaXNNYXBPckFycmF5ID0gR1BCRmllbGRJc01hcE9yQXJyYXkoc2VsZik7Ci0KLSAgICBpZiAoaXNNYXBPckFycmF5KSB7Ci0gICAgICAvLyBtYXA8Pi9yZXBlYXRlZCBmaWVsZHMgZ2V0IGEgKkNvdW50IHByb3BlcnR5IChpbnBsYWNlIG9mIGEgaGFzKikgdG8KLSAgICAgIC8vIHN1cHBvcnQgY2hlY2tpbmcgaWYgdGhlcmUgYXJlIGFueSBlbnRyaWVzIHdpdGhvdXQgdHJpZ2dlcmluZwotICAgICAgLy8gYXV0b2NyZWF0aW9uLgotICAgICAgaGFzT3JDb3VudFNlbF8gPSBTZWxGcm9tU3RyaW5ncyhOVUxMLCBjb3JlRGVzYy0+bmFtZSwgIl9Db3VudCIsIE5PKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gSWYgdGhlcmUgaXMgYSBwb3NpdGl2ZSBoYXNJbmRleCwgdGhlbjoKLSAgICAgIC8vICAgLSBBbGwgZmllbGRzIHR5cGVzIGZvciBwcm90bzIgbWVzc2FnZXMgZ2V0IGhhcyogc2VsZWN0b3JzLgotICAgICAgLy8gICAtIE9ubHkgbWVzc2FnZSBmaWVsZHMgZm9yIHByb3RvMyBtZXNzYWdlcyBnZXQgaGFzKiBzZWxlY3RvcnMuCi0gICAgICAvLyBOb3RlOiB0aGUgcG9zaXRpdmUgY2hlY2sgaXMgdG8gaGFuZGxlIG9uZU9mcywgd2UgY2FuJ3QgY2hlY2sKLSAgICAgIC8vIGNvbnRhaW5pbmdPbmVvZl8gYmVjYXVzZSBpdCBpc24ndCBzZXQgdW50aWwgYWZ0ZXIgaW5pdGlhbGl6YXRpb24uCi0gICAgICBpZiAoKGNvcmVEZXNjLT5oYXNJbmRleCA+PSAwKSAmJgotICAgICAgICAgIChjb3JlRGVzYy0+aGFzSW5kZXggIT0gR1BCTm9IYXNCaXQpICYmCi0gICAgICAgICAgKChzeW50YXggIT0gR1BCRmlsZVN5bnRheFByb3RvMykgfHwgaXNNZXNzYWdlKSkgewotICAgICAgICBoYXNPckNvdW50U2VsXyA9IFNlbEZyb21TdHJpbmdzKCJoYXMiLCBjb3JlRGVzYy0+bmFtZSwgTlVMTCwgTk8pOwotICAgICAgICBzZXRIYXNTZWxfID0gU2VsRnJvbVN0cmluZ3MoInNldEhhcyIsIGNvcmVEZXNjLT5uYW1lLCBOVUxMLCBZRVMpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIEV4dHJhIHR5cGUgc3BlY2lmaWMgZGF0YS4KLSAgICBpZiAoaXNNZXNzYWdlKSB7Ci0gICAgICBjb25zdCBjaGFyICpjbGFzc05hbWUgPSBjb3JlRGVzYy0+ZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWU7Ci0gICAgICBtc2dDbGFzc18gPSBvYmpjX2dldENsYXNzKGNsYXNzTmFtZSk7Ci0gICAgICBOU0Fzc2VydChtc2dDbGFzc18sIEAiQ2xhc3MgJXMgbm90IGRlZmluZWQiLCBjbGFzc05hbWUpOwotICAgIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVFbnVtKSB7Ci0gICAgICBpZiAoKGNvcmVEZXNjLT5mbGFncyAmIEdQQkZpZWxkSGFzRW51bURlc2NyaXB0b3IpICE9IDApIHsKLSAgICAgICAgZW51bUhhbmRsaW5nXy5lbnVtRGVzY3JpcHRvcl8gPQotICAgICAgICAgICAgY29yZURlc2MtPmRhdGFUeXBlU3BlY2lmaWMuZW51bURlc2NGdW5jKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBlbnVtSGFuZGxpbmdfLmVudW1WZXJpZmllcl8gPQotICAgICAgICAgICAgY29yZURlc2MtPmRhdGFUeXBlU3BlY2lmaWMuZW51bVZlcmlmaWVyOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIE5vbiBtYXA8Pi9yZXBlYXRlZCBmaWVsZHMgY2FuIGhhdmUgZGVmYXVsdHMgaW4gcHJvdG8yIHN5bnRheC4KLSAgICBpZiAoIWlzTWFwT3JBcnJheSAmJiBpbmNsdWRlc0RlZmF1bHQpIHsKLSAgICAgIGRlZmF1bHRWYWx1ZV8gPSAoKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uV2l0aERlZmF1bHQgKilkZXNjcmlwdGlvbiktPmRlZmF1bHRWYWx1ZTsKLSAgICAgIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUJ5dGVzKSB7Ci0gICAgICAgIC8vIERhdGEgc3RvcmVkIGFzIGEgbGVuZ3RoIHByZWZpeGVkIChuZXR3b3JrIGJ5dGUgb3JkZXIpIGMtc3RyaW5nIGluCi0gICAgICAgIC8vIGRlc2NyaXB0b3Igc3RydWN0dXJlLgotICAgICAgICBjb25zdCB1aW50OF90ICpieXRlcyA9IChjb25zdCB1aW50OF90ICopZGVmYXVsdFZhbHVlXy52YWx1ZURhdGE7Ci0gICAgICAgIGlmIChieXRlcykgewotICAgICAgICAgIHVpbnQzMl90IGxlbmd0aCA9ICooKHVpbnQzMl90ICopYnl0ZXMpOwotICAgICAgICAgIGxlbmd0aCA9IG50b2hsKGxlbmd0aCk7Ci0gICAgICAgICAgYnl0ZXMgKz0gc2l6ZW9mKGxlbmd0aCk7Ci0gICAgICAgICAgZGVmYXVsdFZhbHVlXy52YWx1ZURhdGEgPQotICAgICAgICAgICAgICBbW05TRGF0YSBhbGxvY10gaW5pdFdpdGhCeXRlczpieXRlcyBsZW5ndGg6bGVuZ3RoXTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgaWYgKGRlc2NyaXB0aW9uXy0+ZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVCeXRlcyAmJgotICAgICAgIShkZXNjcmlwdGlvbl8tPmZsYWdzICYgR1BCRmllbGRSZXBlYXRlZCkpIHsKLSAgICBbZGVmYXVsdFZhbHVlXy52YWx1ZURhdGEgcmVsZWFzZV07Ci0gIH0KLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChHUEJEYXRhVHlwZSlkYXRhVHlwZSB7Ci0gIHJldHVybiBkZXNjcmlwdGlvbl8tPmRhdGFUeXBlOwotfQotCi0tIChCT09MKWhhc0RlZmF1bHRWYWx1ZSB7Ci0gIHJldHVybiAoZGVzY3JpcHRpb25fLT5mbGFncyAmIEdQQkZpZWxkSGFzRGVmYXVsdFZhbHVlKSAhPSAwOwotfQotCi0tICh1aW50MzJfdCludW1iZXIgewotICByZXR1cm4gZGVzY3JpcHRpb25fLT5udW1iZXI7Ci19Ci0KLS0gKE5TU3RyaW5nICopbmFtZSB7Ci0gIHJldHVybiBAKGRlc2NyaXB0aW9uXy0+bmFtZSk7Ci19Ci0KLS0gKEJPT0wpaXNSZXF1aXJlZCB7Ci0gIHJldHVybiAoZGVzY3JpcHRpb25fLT5mbGFncyAmIEdQQkZpZWxkUmVxdWlyZWQpICE9IDA7Ci19Ci0KLS0gKEJPT0wpaXNPcHRpb25hbCB7Ci0gIHJldHVybiAoZGVzY3JpcHRpb25fLT5mbGFncyAmIEdQQkZpZWxkT3B0aW9uYWwpICE9IDA7Ci19Ci0KLS0gKEdQQkZpZWxkVHlwZSlmaWVsZFR5cGUgewotICBHUEJGaWVsZEZsYWdzIGZsYWdzID0gZGVzY3JpcHRpb25fLT5mbGFnczsKLSAgaWYgKChmbGFncyAmIEdQQkZpZWxkUmVwZWF0ZWQpICE9IDApIHsKLSAgICByZXR1cm4gR1BCRmllbGRUeXBlUmVwZWF0ZWQ7Ci0gIH0gZWxzZSBpZiAoKGZsYWdzICYgR1BCRmllbGRNYXBLZXlNYXNrKSAhPSAwKSB7Ci0gICAgcmV0dXJuIEdQQkZpZWxkVHlwZU1hcDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gR1BCRmllbGRUeXBlU2luZ2xlOwotICB9Ci19Ci0KLS0gKEdQQkRhdGFUeXBlKW1hcEtleURhdGFUeXBlIHsKLSAgc3dpdGNoIChkZXNjcmlwdGlvbl8tPmZsYWdzICYgR1BCRmllbGRNYXBLZXlNYXNrKSB7Ci0gICAgY2FzZSBHUEJGaWVsZE1hcEtleUludDMyOgotICAgICAgcmV0dXJuIEdQQkRhdGFUeXBlSW50MzI7Ci0gICAgY2FzZSBHUEJGaWVsZE1hcEtleUludDY0OgotICAgICAgcmV0dXJuIEdQQkRhdGFUeXBlSW50NjQ7Ci0gICAgY2FzZSBHUEJGaWVsZE1hcEtleVVJbnQzMjoKLSAgICAgIHJldHVybiBHUEJEYXRhVHlwZVVJbnQzMjsKLSAgICBjYXNlIEdQQkZpZWxkTWFwS2V5VUludDY0OgotICAgICAgcmV0dXJuIEdQQkRhdGFUeXBlVUludDY0OwotICAgIGNhc2UgR1BCRmllbGRNYXBLZXlTSW50MzI6Ci0gICAgICByZXR1cm4gR1BCRGF0YVR5cGVTSW50MzI7Ci0gICAgY2FzZSBHUEJGaWVsZE1hcEtleVNJbnQ2NDoKLSAgICAgIHJldHVybiBHUEJEYXRhVHlwZVNJbnQ2NDsKLSAgICBjYXNlIEdQQkZpZWxkTWFwS2V5Rml4ZWQzMjoKLSAgICAgIHJldHVybiBHUEJEYXRhVHlwZUZpeGVkMzI7Ci0gICAgY2FzZSBHUEJGaWVsZE1hcEtleUZpeGVkNjQ6Ci0gICAgICByZXR1cm4gR1BCRGF0YVR5cGVGaXhlZDY0OwotICAgIGNhc2UgR1BCRmllbGRNYXBLZXlTRml4ZWQzMjoKLSAgICAgIHJldHVybiBHUEJEYXRhVHlwZVNGaXhlZDMyOwotICAgIGNhc2UgR1BCRmllbGRNYXBLZXlTRml4ZWQ2NDoKLSAgICAgIHJldHVybiBHUEJEYXRhVHlwZVNGaXhlZDY0OwotICAgIGNhc2UgR1BCRmllbGRNYXBLZXlCb29sOgotICAgICAgcmV0dXJuIEdQQkRhdGFUeXBlQm9vbDsKLSAgICBjYXNlIEdQQkZpZWxkTWFwS2V5U3RyaW5nOgotICAgICAgcmV0dXJuIEdQQkRhdGFUeXBlU3RyaW5nOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIE5TQXNzZXJ0KDAsIEAiTm90IGEgbWFwIHR5cGUiKTsKLSAgICAgIHJldHVybiBHUEJEYXRhVHlwZUludDMyOyAgLy8gRm9yIGxhY2sgb2YgYW55dGhpbmcgYmV0dGVyLgotICB9Ci19Ci0KLS0gKEJPT0wpaXNQYWNrYWJsZSB7Ci0gIHJldHVybiAoZGVzY3JpcHRpb25fLT5mbGFncyAmIEdQQkZpZWxkUGFja2VkKSAhPSAwOwotfQotCi0tIChCT09MKWlzVmFsaWRFbnVtVmFsdWU6KGludDMyX3QpdmFsdWUgewotICBOU0Fzc2VydChkZXNjcmlwdGlvbl8tPmRhdGFUeXBlID09IEdQQkRhdGFUeXBlRW51bSwKLSAgICAgICAgICAgQCJGaWVsZCBNdXN0IGJlIG9mIHR5cGUgR1BCRGF0YVR5cGVFbnVtIik7Ci0gIGlmIChkZXNjcmlwdGlvbl8tPmZsYWdzICYgR1BCRmllbGRIYXNFbnVtRGVzY3JpcHRvcikgewotICAgIHJldHVybiBlbnVtSGFuZGxpbmdfLmVudW1EZXNjcmlwdG9yXy5lbnVtVmVyaWZpZXIodmFsdWUpOwotICB9IGVsc2UgewotICAgIHJldHVybiBlbnVtSGFuZGxpbmdfLmVudW1WZXJpZmllcl8odmFsdWUpOwotICB9Ci19Ci0KLS0gKEdQQkVudW1EZXNjcmlwdG9yICopZW51bURlc2NyaXB0b3IgewotICBpZiAoZGVzY3JpcHRpb25fLT5mbGFncyAmIEdQQkZpZWxkSGFzRW51bURlc2NyaXB0b3IpIHsKLSAgICByZXR1cm4gZW51bUhhbmRsaW5nXy5lbnVtRGVzY3JpcHRvcl87Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotfQotCi0tIChHUEJHZW5lcmljVmFsdWUpZGVmYXVsdFZhbHVlIHsKLSAgLy8gRGVwZW5kcyBvbiB0aGUgZmFjdCB0aGF0IGRlZmF1bHRWYWx1ZV8gaXMgaW5pdGlhbGl6ZWQgZWl0aGVyIHRvICIwL25pbCIgb3IKLSAgLy8gdG8gYW4gYWN0dWFsIGRlZmF1bHRWYWx1ZSBpbiBvdXIgaW5pdGlhbGl6ZXIuCi0gIEdQQkdlbmVyaWNWYWx1ZSB2YWx1ZSA9IGRlZmF1bHRWYWx1ZV87Ci0KLSAgaWYgKCEoZGVzY3JpcHRpb25fLT5mbGFncyAmIEdQQkZpZWxkUmVwZWF0ZWQpKSB7Ci0gICAgLy8gV2Ugc3BlY2lhbCBoYW5kbGUgZGF0YSBhbmQgc3RyaW5ncy4gSWYgdGhleSBhcmUgbmlsLCB3ZSByZXBsYWNlIHRoZW0KLSAgICAvLyB3aXRoIGVtcHR5IHN0cmluZy9lbXB0eSBkYXRhLgotICAgIEdQQkRhdGFUeXBlIHR5cGUgPSBkZXNjcmlwdGlvbl8tPmRhdGFUeXBlOwotICAgIGlmICh0eXBlID09IEdQQkRhdGFUeXBlQnl0ZXMgJiYgdmFsdWUudmFsdWVEYXRhID09IG5pbCkgewotICAgICAgdmFsdWUudmFsdWVEYXRhID0gR1BCRW1wdHlOU0RhdGEoKTsKLSAgICB9IGVsc2UgaWYgKHR5cGUgPT0gR1BCRGF0YVR5cGVTdHJpbmcgJiYgdmFsdWUudmFsdWVTdHJpbmcgPT0gbmlsKSB7Ci0gICAgICB2YWx1ZS52YWx1ZVN0cmluZyA9IEAiIjsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHZhbHVlOwotfQotCi0tIChOU1N0cmluZyAqKXRleHRGb3JtYXROYW1lIHsKLSAgaWYgKChkZXNjcmlwdGlvbl8tPmZsYWdzICYgR1BCRmllbGRUZXh0Rm9ybWF0TmFtZUN1c3RvbSkgIT0gMCkgewotICAgIE5TVmFsdWUgKmV4dHJhSW5mb1ZhbHVlID0KLSAgICAgICAgb2JqY19nZXRBc3NvY2lhdGVkT2JqZWN0KHNlbGYsICZrVGV4dEZvcm1hdEV4dHJhVmFsdWVLZXkpOwotICAgIC8vIFN1cHBvcnQgY2FuIGJlIGxlZnQgb3V0IGF0IGdlbmVyYXRpb24gdGltZS4KLSAgICBpZiAoIWV4dHJhSW5mb1ZhbHVlKSB7Ci0gICAgICByZXR1cm4gbmlsOwotICAgIH0KLSAgICBjb25zdCB1aW50OF90ICpleHRyYVRleHRGb3JtYXRJbmZvID0gW2V4dHJhSW5mb1ZhbHVlIHBvaW50ZXJWYWx1ZV07Ci0gICAgcmV0dXJuIEdQQkRlY29kZVRleHRGb3JtYXROYW1lKGV4dHJhVGV4dEZvcm1hdEluZm8sIEdQQkZpZWxkTnVtYmVyKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLm5hbWUpOwotICB9Ci0KLSAgLy8gVGhlIGxvZ2ljIGhlcmUgaGFzIHRvIG1hdGNoIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKCkgZnJvbQotICAvLyBvYmplY3RpdmVjX2ZpZWxkLmNjIGluIHRoZSBwcm90byBjb21waWxlci4KLSAgTlNTdHJpbmcgKm5hbWUgPSBzZWxmLm5hbWU7Ci0gIE5TVUludGVnZXIgbGVuID0gW25hbWUgbGVuZ3RoXTsKLQotICAvLyBSZW1vdmUgdGhlICJfcCIgYWRkZWQgdG8gcmVzZXJ2ZWQgbmFtZXMuCi0gIGlmIChbbmFtZSBoYXNTdWZmaXg6QCJfcCJdKSB7Ci0gICAgbmFtZSA9IFtuYW1lIHN1YnN0cmluZ1RvSW5kZXg6KGxlbiAtIDIpXTsKLSAgICBsZW4gPSBbbmFtZSBsZW5ndGhdOwotICB9Ci0KLSAgLy8gUmVtb3ZlICJBcnJheSIgZnJvbSB0aGUgZW5kIGZvciByZXBlYXRlZCBmaWVsZHMuCi0gIGlmICgoKGRlc2NyaXB0aW9uXy0+ZmxhZ3MgJiBHUEJGaWVsZFJlcGVhdGVkKSAhPSAwKSAmJgotICAgICAgW25hbWUgaGFzU3VmZml4OkAiQXJyYXkiXSkgewotICAgIG5hbWUgPSBbbmFtZSBzdWJzdHJpbmdUb0luZGV4OihsZW4gLSA1KV07Ci0gICAgbGVuID0gW25hbWUgbGVuZ3RoXTsKLSAgfQotCi0gIC8vIEdyb3VwcyB2cy4gb3RoZXIgZmllbGRzLgotICBpZiAoZGVzY3JpcHRpb25fLT5kYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUdyb3VwKSB7Ci0gICAgLy8gSnVzdCBjYXBpdGFsaXplIHRoZSBmaXJzdCBsZXR0ZXIuCi0gICAgdW5pY2hhciBmaXJzdENoYXIgPSBbbmFtZSBjaGFyYWN0ZXJBdEluZGV4OjBdOwotICAgIGlmIChmaXJzdENoYXIgPj0gJ2EnICYmIGZpcnN0Q2hhciA8PSAneicpIHsKLSAgICAgIE5TU3RyaW5nICpmaXJzdENoYXJTdHJpbmcgPQotICAgICAgICAgIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJUMiLCAodW5pY2hhcikoZmlyc3RDaGFyIC0gJ2EnICsgJ0EnKV07Ci0gICAgICBOU1N0cmluZyAqcmVzdWx0ID0KLSAgICAgICAgICBbbmFtZSBzdHJpbmdCeVJlcGxhY2luZ0NoYXJhY3RlcnNJblJhbmdlOk5TTWFrZVJhbmdlKDAsIDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2l0aFN0cmluZzpmaXJzdENoYXJTdHJpbmddOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gICAgcmV0dXJuIG5hbWU7Ci0KLSAgfSBlbHNlIHsKLSAgICAvLyBVbmRvIHRoZSBDYW1lbENhc2UuCi0gICAgTlNNdXRhYmxlU3RyaW5nICpyZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhDYXBhY2l0eTpsZW5dOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgdW5pY2hhciBjID0gW25hbWUgY2hhcmFjdGVyQXRJbmRleDppXTsKLSAgICAgIGlmIChjID49ICdBJyAmJiBjIDw9ICdaJykgewotICAgICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIl8lQyIsICh1bmljaGFyKShjIC0gJ0EnICsgJ2EnKV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIlQyIsIGNdOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiVDIiwgY107Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCRW51bURlc2NyaXB0b3IgewotICBOU1N0cmluZyAqbmFtZV87Ci0gIC8vIHZhbHVlTmFtZXNfIGlzIGEgc2luZ2xlIGMgc3RyaW5nIHdpdGggYWxsIG9mIHRoZSB2YWx1ZSBuYW1lcyBhcHBlbmRlZAotICAvLyB0b2dldGhlciwgZWFjaCBudWxsIHRlcm1pbmF0ZWQuICAtY2FsY1ZhbHVlTmFtZU9mZnNldHMgZmlsbHMgaW4KLSAgLy8gbmFtZU9mZnNldHNfIHdpdGggdGhlIG9mZnNldHMgdG8gYWxsb3cgcXVpY2tlciBhY2Nlc3MgdG8gdGhlIGluZGl2aWR1YWwKLSAgLy8gbmFtZXMuCi0gIGNvbnN0IGNoYXIgKnZhbHVlTmFtZXNfOwotICBjb25zdCBpbnQzMl90ICp2YWx1ZXNfOwotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZW51bVZlcmlmaWVyXzsKLSAgY29uc3QgdWludDhfdCAqZXh0cmFUZXh0Rm9ybWF0SW5mb187Ci0gIHVpbnQzMl90ICpuYW1lT2Zmc2V0c187Ci0gIHVpbnQzMl90IHZhbHVlQ291bnRfOwotfQotCi1Ac3ludGhlc2l6ZSBuYW1lID0gbmFtZV87Ci1Ac3ludGhlc2l6ZSBlbnVtVmVyaWZpZXIgPSBlbnVtVmVyaWZpZXJfOwotCi0rIChpbnN0YW5jZXR5cGUpCi0gICAgYWxsb2NEZXNjcmlwdG9yRm9yTmFtZTooTlNTdHJpbmcgKiluYW1lCi0gICAgICAgICAgICAgICAgdmFsdWVOYW1lczooY29uc3QgY2hhciAqKXZhbHVlTmFtZXMKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzOihjb25zdCBpbnQzMl90ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICBjb3VudDoodWludDMyX3QpdmFsdWVDb3VudAotICAgICAgICAgICAgICBlbnVtVmVyaWZpZXI6KEdQQkVudW1WYWxpZGF0aW9uRnVuYyllbnVtVmVyaWZpZXIgewotICBHUEJFbnVtRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtbc2VsZiBhbGxvY10gaW5pdFdpdGhOYW1lOm5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVOYW1lczp2YWx1ZU5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6dmFsdWVDb3VudAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZlcmlmaWVyOmVudW1WZXJpZmllcl07Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi0rIChpbnN0YW5jZXR5cGUpCi0gICAgYWxsb2NEZXNjcmlwdG9yRm9yTmFtZTooTlNTdHJpbmcgKiluYW1lCi0gICAgICAgICAgICAgICAgdmFsdWVOYW1lczooY29uc3QgY2hhciAqKXZhbHVlTmFtZXMKLSAgICAgICAgICAgICAgICAgICAgdmFsdWVzOihjb25zdCBpbnQzMl90ICopdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICBjb3VudDoodWludDMyX3QpdmFsdWVDb3VudAotICAgICAgICAgICAgICBlbnVtVmVyaWZpZXI6KEdQQkVudW1WYWxpZGF0aW9uRnVuYyllbnVtVmVyaWZpZXIKLSAgICAgICBleHRyYVRleHRGb3JtYXRJbmZvOihjb25zdCBjaGFyICopZXh0cmFUZXh0Rm9ybWF0SW5mbyB7Ci0gIC8vIENhbGwgdGhlIGNvbW1vbiBjYXNlLgotICBHUEJFbnVtRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtzZWxmIGFsbG9jRGVzY3JpcHRvckZvck5hbWU6bmFtZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlTmFtZXM6dmFsdWVOYW1lcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDp2YWx1ZUNvdW50Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WZXJpZmllcjplbnVtVmVyaWZpZXJdOwotICAvLyBTZXQgdGhlIGV4dHJhIGluZm8uCi0gIGRlc2NyaXB0b3ItPmV4dHJhVGV4dEZvcm1hdEluZm9fID0gKGNvbnN0IHVpbnQ4X3QgKilleHRyYVRleHRGb3JtYXRJbmZvOwotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoTmFtZTooTlNTdHJpbmcgKiluYW1lCi0gICAgICAgICAgICAgICAgICB2YWx1ZU5hbWVzOihjb25zdCBjaGFyICopdmFsdWVOYW1lcwotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlczooY29uc3QgaW50MzJfdCAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoodWludDMyX3QpdmFsdWVDb3VudAotICAgICAgICAgICAgICAgIGVudW1WZXJpZmllcjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWVudW1WZXJpZmllciB7Ci0gIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKLSAgICBuYW1lXyA9IFtuYW1lIGNvcHldOwotICAgIHZhbHVlTmFtZXNfID0gdmFsdWVOYW1lczsKLSAgICB2YWx1ZXNfID0gdmFsdWVzOwotICAgIHZhbHVlQ291bnRfID0gdmFsdWVDb3VudDsKLSAgICBlbnVtVmVyaWZpZXJfID0gZW51bVZlcmlmaWVyOwotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBbbmFtZV8gcmVsZWFzZV07Ci0gIGlmIChuYW1lT2Zmc2V0c18pIGZyZWUobmFtZU9mZnNldHNfKTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tICh2b2lkKWNhbGNWYWx1ZU5hbWVPZmZzZXRzIHsKLSAgQHN5bmNocm9uaXplZChzZWxmKSB7Ci0gICAgaWYgKG5hbWVPZmZzZXRzXyAhPSBOVUxMKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHVpbnQzMl90ICpvZmZzZXRzID0gbWFsbG9jKHZhbHVlQ291bnRfICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gICAgY29uc3QgY2hhciAqc2NhbiA9IHZhbHVlTmFtZXNfOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2YWx1ZUNvdW50XzsgKytpKSB7Ci0gICAgICBvZmZzZXRzW2ldID0gKHVpbnQzMl90KShzY2FuIC0gdmFsdWVOYW1lc18pOwotICAgICAgd2hpbGUgKCpzY2FuICE9ICdcMCcpICsrc2NhbjsKLSAgICAgICsrc2NhbjsgIC8vIFN0ZXAgb3ZlciB0aGUgbnVsbC4KLSAgICB9Ci0gICAgbmFtZU9mZnNldHNfID0gb2Zmc2V0czsKLSAgfQotfQotCi0tIChOU1N0cmluZyAqKWVudW1OYW1lRm9yVmFsdWU6KGludDMyX3QpbnVtYmVyIHsKLSAgaWYgKG5hbWVPZmZzZXRzXyA9PSBOVUxMKSBbc2VsZiBjYWxjVmFsdWVOYW1lT2Zmc2V0c107Ci0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IHZhbHVlQ291bnRfOyArK2kpIHsKLSAgICBpZiAodmFsdWVzX1tpXSA9PSBudW1iZXIpIHsKLSAgICAgIGNvbnN0IGNoYXIgKnZhbHVlTmFtZSA9IHZhbHVlTmFtZXNfICsgbmFtZU9mZnNldHNfW2ldOwotICAgICAgTlNTdHJpbmcgKmZ1bGxOYW1lID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlQF8lcyIsIG5hbWVfLCB2YWx1ZU5hbWVdOwotICAgICAgcmV0dXJuIGZ1bGxOYW1lOwotICAgIH0KLSAgfQotICByZXR1cm4gbmlsOwotfQotCi0tIChCT09MKWdldFZhbHVlOihpbnQzMl90ICopb3V0VmFsdWUgZm9yRW51bU5hbWU6KE5TU3RyaW5nICopbmFtZSB7Ci0gIC8vIE11c3QgaGF2ZSB0aGUgcHJlZml4LgotICBOU1VJbnRlZ2VyIHByZWZpeExlbiA9IG5hbWVfLmxlbmd0aCArIDE7Ci0gIGlmICgobmFtZS5sZW5ndGggPD0gcHJlZml4TGVuKSB8fCAhW25hbWUgaGFzUHJlZml4Om5hbWVfXSB8fAotICAgICAgKFtuYW1lIGNoYXJhY3RlckF0SW5kZXg6cHJlZml4TGVuIC0gMV0gIT0gJ18nKSkgewotICAgIHJldHVybiBOTzsKLSAgfQotCi0gIC8vIFNraXAgb3ZlciB0aGUgcHJlZml4LgotICBjb25zdCBjaGFyICpuYW1lQXNDU3RyID0gW25hbWUgVVRGOFN0cmluZ107Ci0gIG5hbWVBc0NTdHIgKz0gcHJlZml4TGVuOwotCi0gIGlmIChuYW1lT2Zmc2V0c18gPT0gTlVMTCkgW3NlbGYgY2FsY1ZhbHVlTmFtZU9mZnNldHNdOwotCi0gIC8vIEZpbmQgaXQuCi0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCB2YWx1ZUNvdW50XzsgKytpKSB7Ci0gICAgY29uc3QgY2hhciAqdmFsdWVOYW1lID0gdmFsdWVOYW1lc18gKyBuYW1lT2Zmc2V0c19baV07Ci0gICAgaWYgKHN0cmNtcChuYW1lQXNDU3RyLCB2YWx1ZU5hbWUpID09IDApIHsKLSAgICAgIGlmIChvdXRWYWx1ZSkgewotICAgICAgICAqb3V0VmFsdWUgPSB2YWx1ZXNfW2ldOwotICAgICAgfQotICAgICAgcmV0dXJuIFlFUzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5POwotfQotCi0tIChOU1N0cmluZyAqKXRleHRGb3JtYXROYW1lRm9yVmFsdWU6KGludDMyX3QpbnVtYmVyIHsKLSAgaWYgKG5hbWVPZmZzZXRzXyA9PSBOVUxMKSBbc2VsZiBjYWxjVmFsdWVOYW1lT2Zmc2V0c107Ci0KLSAgLy8gRmluZCB0aGUgRW51bVZhbHVlIGRlc2NyaXB0b3IgYW5kIGl0cyBpbmRleC4KLSAgQk9PTCBmb3VuZEl0ID0gTk87Ci0gIHVpbnQzMl90IHZhbHVlRGVzY3JpcHRvckluZGV4OwotICBmb3IgKHZhbHVlRGVzY3JpcHRvckluZGV4ID0gMDsgdmFsdWVEZXNjcmlwdG9ySW5kZXggPCB2YWx1ZUNvdW50XzsKLSAgICAgICArK3ZhbHVlRGVzY3JpcHRvckluZGV4KSB7Ci0gICAgaWYgKHZhbHVlc19bdmFsdWVEZXNjcmlwdG9ySW5kZXhdID09IG51bWJlcikgewotICAgICAgZm91bmRJdCA9IFlFUzsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmICghZm91bmRJdCkgewotICAgIHJldHVybiBuaWw7Ci0gIH0KLQotICBOU1N0cmluZyAqcmVzdWx0ID0gbmlsOwotICAvLyBOYW1pbmcgYWRkcyBhbiB1bmRlcnNjb3JlIGJldHdlZW4gZW51bSBuYW1lIGFuZCB2YWx1ZSBuYW1lLCBza2lwIHRoYXQgYWxzby4KLSAgY29uc3QgY2hhciAqdmFsdWVOYW1lID0gdmFsdWVOYW1lc18gKyBuYW1lT2Zmc2V0c19bdmFsdWVEZXNjcmlwdG9ySW5kZXhdOwotICBOU1N0cmluZyAqc2hvcnROYW1lID0gQCh2YWx1ZU5hbWUpOwotCi0gIC8vIFNlZSBpZiBpdCBpcyBpbiB0aGUgbWFwIG9mIHNwZWNpYWwgZm9ybWF0IGhhbmRsaW5nLgotICBpZiAoZXh0cmFUZXh0Rm9ybWF0SW5mb18pIHsKLSAgICByZXN1bHQgPSBHUEJEZWNvZGVUZXh0Rm9ybWF0TmFtZShleHRyYVRleHRGb3JtYXRJbmZvXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50MzJfdCl2YWx1ZURlc2NyaXB0b3JJbmRleCwgc2hvcnROYW1lKTsKLSAgfQotICAvLyBMb2dpYyBoZXJlIG5lZWRzIHRvIG1hdGNoIHdoYXQgb2JqZWN0aXZlY19lbnVtLmNjIGRvZXMgaW4gdGhlIHByb3RvCi0gIC8vIGNvbXBpbGVyLgotICBpZiAocmVzdWx0ID09IG5pbCkgewotICAgIE5TVUludGVnZXIgbGVuID0gW3Nob3J0TmFtZSBsZW5ndGhdOwotICAgIE5TTXV0YWJsZVN0cmluZyAqd29ya2VyID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoQ2FwYWNpdHk6bGVuXTsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBsZW47IGkrKykgewotICAgICAgdW5pY2hhciBjID0gW3Nob3J0TmFtZSBjaGFyYWN0ZXJBdEluZGV4OmldOwotICAgICAgaWYgKGkgPiAwICYmIGMgPj0gJ0EnICYmIGMgPD0gJ1onKSB7Ci0gICAgICAgIFt3b3JrZXIgYXBwZW5kU3RyaW5nOkAiXyJdOwotICAgICAgfQotICAgICAgW3dvcmtlciBhcHBlbmRGb3JtYXQ6QCIlYyIsIHRvdXBwZXIoKGNoYXIpYyldOwotICAgIH0KLSAgICByZXN1bHQgPSB3b3JrZXI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciB7Ci0gIEdQQkdlbmVyaWNWYWx1ZSBkZWZhdWx0VmFsdWVfOwotfQotCi1Ac3ludGhlc2l6ZSBjb250YWluaW5nTWVzc2FnZUNsYXNzID0gY29udGFpbmluZ01lc3NhZ2VDbGFzc187Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aEV4dGVuc2lvbkRlc2NyaXB0aW9uOgotICAgICAgICAoR1BCRXh0ZW5zaW9uRGVzY3JpcHRpb24gKilkZXNjcmlwdGlvbiB7Ci0gIGlmICgoc2VsZiA9IFtzdXBlciBpbml0XSkpIHsKLSAgICBkZXNjcmlwdGlvbl8gPSBkZXNjcmlwdGlvbjsKLQotI2lmIERFQlVHCi0gICAgY29uc3QgY2hhciAqY2xhc3NOYW1lID0gZGVzY3JpcHRpb24tPm1lc3NhZ2VPckdyb3VwQ2xhc3NOYW1lOwotICAgIGlmIChjbGFzc05hbWUpIHsKLSAgICAgIE5TQXNzZXJ0KG9iamNfbG9va1VwQ2xhc3MoY2xhc3NOYW1lKSAhPSBOaWwsCi0gICAgICAgICAgICAgICBAIkNsYXNzICVzIG5vdCBkZWZpbmVkIiwgY2xhc3NOYW1lKTsKLSAgICB9Ci0jZW5kaWYKLQotICAgIGlmIChkZXNjcmlwdGlvbi0+ZXh0ZW5kZWRDbGFzcykgewotICAgICAgQ2xhc3MgY29udGFpbmluZ0NsYXNzID0gb2JqY19sb29rVXBDbGFzcyhkZXNjcmlwdGlvbi0+ZXh0ZW5kZWRDbGFzcyk7Ci0gICAgICBOU0Fzc2VydChjb250YWluaW5nQ2xhc3MsIEAiQ2xhc3MgJXMgbm90IGRlZmluZWQiLAotICAgICAgICAgICAgICAgZGVzY3JpcHRpb24tPmV4dGVuZGVkQ2xhc3MpOwotICAgICAgY29udGFpbmluZ01lc3NhZ2VDbGFzc18gPSBjb250YWluaW5nQ2xhc3M7Ci0gICAgfQotCi0gICAgR1BCRGF0YVR5cGUgdHlwZSA9IGRlc2NyaXB0aW9uXy0+ZGF0YVR5cGU7Ci0gICAgaWYgKHR5cGUgPT0gR1BCRGF0YVR5cGVCeXRlcykgewotICAgICAgLy8gRGF0YSBzdG9yZWQgYXMgYSBsZW5ndGggcHJlZml4ZWQgYy1zdHJpbmcgaW4gZGVzY3JpcHRvciByZWNvcmRzLgotICAgICAgY29uc3QgdWludDhfdCAqYnl0ZXMgPQotICAgICAgICAgIChjb25zdCB1aW50OF90ICopZGVzY3JpcHRpb24tPmRlZmF1bHRWYWx1ZS52YWx1ZURhdGE7Ci0gICAgICBpZiAoYnl0ZXMpIHsKLSAgICAgICAgdWludDMyX3QgbGVuZ3RoID0gKigodWludDMyX3QgKilieXRlcyk7Ci0gICAgICAgIC8vIFRoZSBsZW5ndGggaXMgc3RvcmVkIGluIG5ldHdvcmsgYnl0ZSBvcmRlci4KLSAgICAgICAgbGVuZ3RoID0gbnRvaGwobGVuZ3RoKTsKLSAgICAgICAgYnl0ZXMgKz0gc2l6ZW9mKGxlbmd0aCk7Ci0gICAgICAgIGRlZmF1bHRWYWx1ZV8udmFsdWVEYXRhID0KLSAgICAgICAgICAgIFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aEJ5dGVzOmJ5dGVzIGxlbmd0aDpsZW5ndGhdOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBHUEJEYXRhVHlwZU1lc3NhZ2UgfHwgdHlwZSA9PSBHUEJEYXRhVHlwZUdyb3VwKSB7Ci0gICAgICAvLyBUaGUgZGVmYXVsdCBpcyBsb29rZWQgdXAgaW4gLWRlZmF1bHRWYWx1ZSBpbnN0ZWFkIHNpbmNlIGV4dGVuc2lvbnMKLSAgICAgIC8vIGFyZW4ndCBjb21tb24sIHdlIGF2b2lkIHRoZSBoaXQgc3RhcnR1cCBoaXQgYW5kIGl0IGF2b2lkIGluaXRpYWxpemF0aW9uCi0gICAgICAvLyBvcmRlciBpc3N1ZXMuCi0gICAgfSBlbHNlIHsKLSAgICAgIGRlZmF1bHRWYWx1ZV8gPSBkZXNjcmlwdGlvbi0+ZGVmYXVsdFZhbHVlOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgaWYgKChkZXNjcmlwdGlvbl8tPmRhdGFUeXBlID09IEdQQkRhdGFUeXBlQnl0ZXMpICYmCi0gICAgICAhR1BCRXh0ZW5zaW9uSXNSZXBlYXRlZChkZXNjcmlwdGlvbl8pKSB7Ci0gICAgW2RlZmF1bHRWYWx1ZV8udmFsdWVEYXRhIHJlbGVhc2VdOwotICB9Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0jcHJhZ21hIHVudXNlZCh6b25lKQotICAvLyBJbW11dGFibGUuCi0gIHJldHVybiBbc2VsZiByZXRhaW5dOwotfQotCi0tIChOU1N0cmluZyAqKXNpbmdsZXRvbk5hbWUgewotICByZXR1cm4gQChkZXNjcmlwdGlvbl8tPnNpbmdsZXRvbk5hbWUpOwotfQotCi0tIChjb25zdCBjaGFyICopc2luZ2xldG9uTmFtZUMgewotICByZXR1cm4gZGVzY3JpcHRpb25fLT5zaW5nbGV0b25OYW1lOwotfQotCi0tICh1aW50MzJfdClmaWVsZE51bWJlciB7Ci0gIHJldHVybiBkZXNjcmlwdGlvbl8tPmZpZWxkTnVtYmVyOwotfQotCi0tIChHUEJEYXRhVHlwZSlkYXRhVHlwZSB7Ci0gIHJldHVybiBkZXNjcmlwdGlvbl8tPmRhdGFUeXBlOwotfQotCi0tIChHUEJXaXJlRm9ybWF0KXdpcmVUeXBlIHsKLSAgcmV0dXJuIEdQQldpcmVGb3JtYXRGb3JUeXBlKGRlc2NyaXB0aW9uXy0+ZGF0YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJFeHRlbnNpb25Jc1BhY2tlZChkZXNjcmlwdGlvbl8pKTsKLX0KLQotLSAoR1BCV2lyZUZvcm1hdClhbHRlcm5hdGVXaXJlVHlwZSB7Ci0gIE5TQXNzZXJ0KEdQQkV4dGVuc2lvbklzUmVwZWF0ZWQoZGVzY3JpcHRpb25fKSwKLSAgICAgICAgICAgQCJPbmx5IHZhbGlkIG9uIHJlcGVhdGVkIGV4dGVuc2lvbnMiKTsKLSAgcmV0dXJuIEdQQldpcmVGb3JtYXRGb3JUeXBlKGRlc2NyaXB0aW9uXy0+ZGF0YVR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAhR1BCRXh0ZW5zaW9uSXNQYWNrZWQoZGVzY3JpcHRpb25fKSk7Ci19Ci0KLS0gKEJPT0wpaXNSZXBlYXRlZCB7Ci0gIHJldHVybiBHUEJFeHRlbnNpb25Jc1JlcGVhdGVkKGRlc2NyaXB0aW9uXyk7Ci19Ci0KLS0gKEJPT0wpaXNNYXAgewotICByZXR1cm4gKGRlc2NyaXB0aW9uXy0+b3B0aW9ucyAmIEdQQkZpZWxkTWFwS2V5TWFzaykgIT0gMDsKLX0KLQotLSAoQk9PTClpc1BhY2thYmxlIHsKLSAgcmV0dXJuIEdQQkV4dGVuc2lvbklzUGFja2VkKGRlc2NyaXB0aW9uXyk7Ci19Ci0KLS0gKENsYXNzKW1zZ0NsYXNzIHsKLSAgcmV0dXJuIG9iamNfZ2V0Q2xhc3MoZGVzY3JpcHRpb25fLT5tZXNzYWdlT3JHcm91cENsYXNzTmFtZSk7Ci19Ci0KLS0gKEdQQkVudW1EZXNjcmlwdG9yICopZW51bURlc2NyaXB0b3IgewotICBpZiAoZGVzY3JpcHRpb25fLT5kYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUVudW0pIHsKLSAgICBHUEJFbnVtRGVzY3JpcHRvciAqZW51bURlc2NyaXB0b3IgPSBkZXNjcmlwdGlvbl8tPmVudW1EZXNjcmlwdG9yRnVuYygpOwotICAgIHJldHVybiBlbnVtRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gbmlsOwotfQotCi0tIChpZClkZWZhdWx0VmFsdWUgewotICBpZiAoR1BCRXh0ZW5zaW9uSXNSZXBlYXRlZChkZXNjcmlwdGlvbl8pKSB7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotCi0gIHN3aXRjaCAoZGVzY3JpcHRpb25fLT5kYXRhVHlwZSkgewotICAgIGNhc2UgR1BCRGF0YVR5cGVCb29sOgotICAgICAgcmV0dXJuIEAoZGVmYXVsdFZhbHVlXy52YWx1ZUJvb2wpOwotICAgIGNhc2UgR1BCRGF0YVR5cGVGbG9hdDoKLSAgICAgIHJldHVybiBAKGRlZmF1bHRWYWx1ZV8udmFsdWVGbG9hdCk7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZURvdWJsZToKLSAgICAgIHJldHVybiBAKGRlZmF1bHRWYWx1ZV8udmFsdWVEb3VibGUpOwotICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQzMjoKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDMyOgotICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOgotICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQzMjoKLSAgICAgIHJldHVybiBAKGRlZmF1bHRWYWx1ZV8udmFsdWVJbnQzMik7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUludDY0OgotICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50NjQ6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDY0OgotICAgICAgcmV0dXJuIEAoZGVmYXVsdFZhbHVlXy52YWx1ZUludDY0KTsKLSAgICBjYXNlIEdQQkRhdGFUeXBlVUludDMyOgotICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDMyOgotICAgICAgcmV0dXJuIEAoZGVmYXVsdFZhbHVlXy52YWx1ZVVJbnQzMik7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQ2NDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQ2NDoKLSAgICAgIHJldHVybiBAKGRlZmF1bHRWYWx1ZV8udmFsdWVVSW50NjQpOwotICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICAgIC8vIExpa2UgbWVzc2FnZSBmaWVsZHMsIHRoZSBkZWZhdWx0IGlzIHplcm8gbGVuZ3RoIGRhdGEuCi0gICAgICByZXR1cm4gKGRlZmF1bHRWYWx1ZV8udmFsdWVEYXRhID8gZGVmYXVsdFZhbHVlXy52YWx1ZURhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHUEJFbXB0eU5TRGF0YSgpKTsKLSAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOgotICAgICAgLy8gTGlrZSBtZXNzYWdlIGZpZWxkcywgdGhlIGRlZmF1bHQgaXMgemVybyBsZW5ndGggc3RyaW5nLgotICAgICAgcmV0dXJuIChkZWZhdWx0VmFsdWVfLnZhbHVlU3RyaW5nID8gZGVmYXVsdFZhbHVlXy52YWx1ZVN0cmluZyA6IEAiIik7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgICAgcmV0dXJuIG5pbDsKLSAgfQotfQotCi0tIChOU0NvbXBhcmlzb25SZXN1bHQpY29tcGFyZUJ5RmllbGROdW1iZXI6KEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKilvdGhlciB7Ci0gIGludDMyX3Qgc2VsZk51bWJlciA9IGRlc2NyaXB0aW9uXy0+ZmllbGROdW1iZXI7Ci0gIGludDMyX3Qgb3RoZXJOdW1iZXIgPSBvdGhlci0+ZGVzY3JpcHRpb25fLT5maWVsZE51bWJlcjsKLSAgaWYgKHNlbGZOdW1iZXIgPCBvdGhlck51bWJlcikgewotICAgIHJldHVybiBOU09yZGVyZWRBc2NlbmRpbmc7Ci0gIH0gZWxzZSBpZiAoc2VsZk51bWJlciA9PSBvdGhlck51bWJlcikgewotICAgIHJldHVybiBOU09yZGVyZWRTYW1lOwotICB9IGVsc2UgewotICAgIHJldHVybiBOU09yZGVyZWREZXNjZW5kaW5nOwotICB9Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRGVzY3JpcHRvcl9QYWNrYWdlUHJpdmF0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJEZXNjcmlwdG9yX1BhY2thZ2VQcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzZDBhODAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJEZXNjcmlwdG9yX1BhY2thZ2VQcml2YXRlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgaGVhZGVyIGlzIHByaXZhdGUgdG8gdGhlIFByb3RvYm9sQnVmZmVycyBsaWJyYXJ5IGFuZCBtdXN0IE5PVCBiZQotLy8gaW5jbHVkZWQgYnkgYW55IHNvdXJjZXMgb3V0c2lkZSB0aGlzIGxpYnJhcnkuIFRoZSBjb250ZW50cyBvZiB0aGlzIGZpbGUgYXJlCi0vLyBzdWJqZWN0IHRvIGNoYW5nZSBhdCBhbnkgdGltZSB3aXRob3V0IG5vdGljZS4KLQotI2ltcG9ydCAiR1BCRGVzY3JpcHRvci5oIgotI2ltcG9ydCAiR1BCV2lyZUZvcm1hdC5oIgotCi0vLyBEZXNjcmliZXMgYXR0cmlidXRlcyBvZiB0aGUgZmllbGQuCi10eXBlZGVmIE5TX09QVElPTlModWludDE2X3QsIEdQQkZpZWxkRmxhZ3MpIHsKLSAgLy8gVGhlc2UgbWFwIHRvIHN0YW5kYXJkIHByb3RvYnVmIGNvbmNlcHRzLgotICBHUEJGaWVsZFJlcXVpcmVkICAgICAgICA9IDEgPDwgMCwKLSAgR1BCRmllbGRSZXBlYXRlZCAgICAgICAgPSAxIDw8IDEsCi0gIEdQQkZpZWxkUGFja2VkICAgICAgICAgID0gMSA8PCAyLAotICBHUEJGaWVsZE9wdGlvbmFsICAgICAgICA9IDEgPDwgMywKLSAgR1BCRmllbGRIYXNEZWZhdWx0VmFsdWUgPSAxIDw8IDQsCi0KLSAgLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBuZWVkcyBjdXN0b20gaGFuZGxpbmcgZm9yIHRoZSBUZXh0Rm9ybWF0IG5hbWUsIGlmIG5vdAotICAvLyBzZXQsIHRoZSBuYW1lIGNhbiBiZSBkZXJpdmVkIGZyb20gdGhlIE9iakMgbmFtZS4KLSAgR1BCRmllbGRUZXh0Rm9ybWF0TmFtZUN1c3RvbSA9IDEgPDwgNiwKLSAgLy8gSW5kaWNhdGVzIHRoZSBmaWVsZCBoYXMgYW4gZW51bSBkZXNjcmlwdG9yLgotICBHUEJGaWVsZEhhc0VudW1EZXNjcmlwdG9yID0gMSA8PCA3LAotCi0gIC8vIFRoZXNlIGFyZSBub3Qgc3RhbmRhcmQgcHJvdG9idWYgY29uY2VwdHMsIHRoZXkgYXJlIHNwZWNpZmljIHRvIHRoZQotICAvLyBPYmplY3RpdmUgQyBydW50aW1lLgotCi0gIC8vIFRoZXNlIGJpdHMgYXJlIHVzZWQgdG8gbWFyayB0aGUgZmllbGQgYXMgYSBtYXAgYW5kIHdoYXQgdGhlIGtleQotICAvLyB0eXBlIGlzLgotICBHUEJGaWVsZE1hcEtleU1hc2sgICAgID0gMHhGIDw8IDgsCi0gIEdQQkZpZWxkTWFwS2V5SW50MzIgICAgPSAgMSA8PCA4LAotICBHUEJGaWVsZE1hcEtleUludDY0ICAgID0gIDIgPDwgOCwKLSAgR1BCRmllbGRNYXBLZXlVSW50MzIgICA9ICAzIDw8IDgsCi0gIEdQQkZpZWxkTWFwS2V5VUludDY0ICAgPSAgNCA8PCA4LAotICBHUEJGaWVsZE1hcEtleVNJbnQzMiAgID0gIDUgPDwgOCwKLSAgR1BCRmllbGRNYXBLZXlTSW50NjQgICA9ICA2IDw8IDgsCi0gIEdQQkZpZWxkTWFwS2V5Rml4ZWQzMiAgPSAgNyA8PCA4LAotICBHUEJGaWVsZE1hcEtleUZpeGVkNjQgID0gIDggPDwgOCwKLSAgR1BCRmllbGRNYXBLZXlTRml4ZWQzMiA9ICA5IDw8IDgsCi0gIEdQQkZpZWxkTWFwS2V5U0ZpeGVkNjQgPSAxMCA8PCA4LAotICBHUEJGaWVsZE1hcEtleUJvb2wgICAgID0gMTEgPDwgOCwKLSAgR1BCRmllbGRNYXBLZXlTdHJpbmcgICA9IDEyIDw8IDgsCi19OwotCi0vLyBOT1RFOiBUaGUgc3RydWN0dXJlcyBkZWZpbmVkIGhlcmUgaGF2ZSB0aGVpciBtZW1iZXJzIG9yZGVyZWQgdG8gbWluaW1pemUKLS8vIHRoZWlyIHNpemUuIFRoaXMgZGlyZWN0bHkgaW1wYWN0cyB0aGUgc2l6ZSBvZiBhcHBzIHNpbmNlIHRoZXNlIGV4aXN0IHBlcgotLy8gZmllbGQvZXh0ZW5zaW9uLgotCi0vLyBEZXNjcmliZXMgYSBzaW5nbGUgZmllbGQgaW4gYSBwcm90b2J1ZiBhcyBpdCBpcyByZXByZXNlbnRlZCBhcyBhbiBpdmFyLgotdHlwZWRlZiBzdHJ1Y3QgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gewotICAvLyBOYW1lIG9mIGl2YXIuCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVuaW9uIHsKLSAgICBjb25zdCBjaGFyICpjbGFzc05hbWU7ICAvLyBOYW1lIGZvciBtZXNzYWdlIGNsYXNzLgotICAgIC8vIEZvciBlbnVtcyBvbmx5OiBJZiBFbnVtRGVzY3JpcHRvcnMgYXJlIGNvbXBpbGVkIGluLCBpdCB3aWxsIGJlIHRoYXQsCi0gICAgLy8gb3RoZXJ3aXNlIGl0IHdpbGwgYmUgdGhlIHZlcmlmaWVyLgotICAgIEdQQkVudW1EZXNjcmlwdG9yRnVuYyBlbnVtRGVzY0Z1bmM7Ci0gICAgR1BCRW51bVZhbGlkYXRpb25GdW5jIGVudW1WZXJpZmllcjsKLSAgfSBkYXRhVHlwZVNwZWNpZmljOwotICAvLyBUaGUgZmllbGQgbnVtYmVyIGZvciB0aGUgaXZhci4KLSAgdWludDMyX3QgbnVtYmVyOwotICAvLyBUaGUgaW5kZXggKGluIGJpdHMpIGludG8gX2hhc19zdG9yYWdlXy4KLSAgLy8gICA+PSAwOiB0aGUgYml0IHRvIHVzZSBmb3IgYSB2YWx1ZSBiZWluZyBzZXQuCi0gIC8vICAgPSBHUEJOb0hhc0JpdChJTlQzMl9NQVgpOiBubyBzdG9yYWdlIHVzZWQuCi0gIC8vICAgPCAwOiBpbiBhIG9uZU9mLCB1c2UgYSBmdWxsIGludDMyIHRvIHJlY29yZCB0aGUgZmllbGQgYWN0aXZlLgotICBpbnQzMl90IGhhc0luZGV4OwotICAvLyBPZmZzZXQgb2YgdGhlIHZhcmlhYmxlIGludG8gaXQncyBzdHJ1Y3R1cmUgc3RydWN0LgotICB1aW50MzJfdCBvZmZzZXQ7Ci0gIC8vIEZpZWxkIGZsYWdzLiBVc2UgYWNjZXNzb3IgZnVuY3Rpb25zIGJlbG93LgotICBHUEJGaWVsZEZsYWdzIGZsYWdzOwotICAvLyBEYXRhIHR5cGUgb2YgdGhlIGl2YXIuCi0gIEdQQkRhdGFUeXBlIGRhdGFUeXBlOwotfSBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbjsKLQotLy8gRmllbGRzIGluIG1lc3NhZ2VzIGRlZmluZWQgaW4gYSAncHJvdG8yJyBzeW50YXggZmlsZSBjYW4gcHJvdmlkZSBhIGRlZmF1bHQKLS8vIHZhbHVlLiBUaGlzIHN0cnVjdCBwcm92aWRlcyB0aGUgZGVmYXVsdCBhbG9uZyB3aXRoIHRoZSBmaWVsZCBpbmZvLgotdHlwZWRlZiBzdHJ1Y3QgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb25XaXRoRGVmYXVsdCB7Ci0gIC8vIERlZmF1bHQgdmFsdWUgZm9yIHRoZSBpdmFyLgotICBHUEJHZW5lcmljVmFsdWUgZGVmYXVsdFZhbHVlOwotCi0gIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGNvcmU7Ci19IEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uV2l0aERlZmF1bHQ7Ci0KLS8vIERlc2NyaWJlcyBhdHRyaWJ1dGVzIG9mIHRoZSBleHRlbnNpb24uCi10eXBlZGVmIE5TX09QVElPTlModWludDhfdCwgR1BCRXh0ZW5zaW9uT3B0aW9ucykgewotICAvLyBUaGVzZSBtYXAgdG8gc3RhbmRhcmQgcHJvdG9idWYgY29uY2VwdHMuCi0gIEdQQkV4dGVuc2lvblJlcGVhdGVkICAgICAgPSAxIDw8IDAsCi0gIEdQQkV4dGVuc2lvblBhY2tlZCAgICAgICAgPSAxIDw8IDEsCi0gIEdQQkV4dGVuc2lvblNldFdpcmVGb3JtYXQgPSAxIDw8IDIsCi19OwotCi0vLyBBbiBleHRlbnNpb24KLXR5cGVkZWYgc3RydWN0IEdQQkV4dGVuc2lvbkRlc2NyaXB0aW9uIHsKLSAgR1BCR2VuZXJpY1ZhbHVlIGRlZmF1bHRWYWx1ZTsKLSAgY29uc3QgY2hhciAqc2luZ2xldG9uTmFtZTsKLSAgY29uc3QgY2hhciAqZXh0ZW5kZWRDbGFzczsKLSAgY29uc3QgY2hhciAqbWVzc2FnZU9yR3JvdXBDbGFzc05hbWU7Ci0gIEdQQkVudW1EZXNjcmlwdG9yRnVuYyBlbnVtRGVzY3JpcHRvckZ1bmM7Ci0gIGludDMyX3QgZmllbGROdW1iZXI7Ci0gIEdQQkRhdGFUeXBlIGRhdGFUeXBlOwotICBHUEJFeHRlbnNpb25PcHRpb25zIG9wdGlvbnM7Ci19IEdQQkV4dGVuc2lvbkRlc2NyaXB0aW9uOwotCi10eXBlZGVmIE5TX09QVElPTlModWludDMyX3QsIEdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdzKSB7Ci0gIEdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdfRmllbGRzV2l0aERlZmF1bHQgPSAxIDw8IDAsCi0gIEdQQkRlc2NyaXB0b3JJbml0aWFsaXphdGlvbkZsYWdfV2lyZUZvcm1hdCAgICAgICAgPSAxIDw8IDEsCi19OwotCi1AaW50ZXJmYWNlIEdQQkRlc2NyaXB0b3IgKCkgewotIEBwYWNrYWdlCi0gIE5TQXJyYXkgKmZpZWxkc187Ci0gIE5TQXJyYXkgKm9uZW9mc187Ci0gIHVpbnQzMl90IHN0b3JhZ2VTaXplXzsKLX0KLQotLy8gZmllbGREZXNjcmlwdGlvbnMgaGF2ZSB0byBiZSBsb25nIGxpdmVkLCB0aGV5IGFyZSBoZWxkIGFzIHJhdyBwb2ludGVycy4KLSsgKGluc3RhbmNldHlwZSkKLSAgICBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczooQ2xhc3MpbWVzc2FnZUNsYXNzCi0gICAgICAgICAgICAgICAgICByb290Q2xhc3M6KENsYXNzKXJvb3RDbGFzcwotICAgICAgICAgICAgICAgICAgICAgICBmaWxlOihHUEJGaWxlRGVzY3JpcHRvciAqKWZpbGUKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkczoodm9pZCAqKWZpZWxkRGVzY3JpcHRpb25zCi0gICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KWZpZWxkQ291bnQKLSAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZToodWludDMyX3Qpc3RvcmFnZVNpemUKLSAgICAgICAgICAgICAgICAgICAgICBmbGFnczooR1BCRGVzY3JpcHRvckluaXRpYWxpemF0aW9uRmxhZ3MpZmxhZ3M7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENsYXNzOihDbGFzcyltZXNzYWdlQ2xhc3MKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOihHUEJGaWxlRGVzY3JpcHRvciAqKWZpbGUKLSAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOihOU0FycmF5ICopZmllbGRzCi0gICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZToodWludDMyX3Qpc3RvcmFnZQotICAgICAgICAgICAgICAgICAgIHdpcmVGb3JtYXQ6KEJPT0wpd2lyZUZvcm1hdDsKLQotLy8gQ2FsbGVkIHJpZ2h0IGFmdGVyIGluaXQgdG8gcHJvdmlkZSBleHRyYSBpbmZvcm1hdGlvbiB0byBhdm9pZCBpbml0IGhhdmluZwotLy8gYW4gZXhwbG9zaW9uIG9mIGFyZ3MuIFRoZXNlIHBvaW50ZXJzIGFyZSByZWNvcmRlZCwgc28gdGhleSBhcmUgZXhwZWN0ZWQKLS8vIHRvIGxpdmUgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgYXBwLgotLSAodm9pZClzZXR1cE9uZW9mczooY29uc3QgY2hhciAqKilvbmVvZk5hbWVzCi0gICAgICAgICAgICAgIGNvdW50Oih1aW50MzJfdCljb3VudAotICAgICAgZmlyc3RIYXNJbmRleDooaW50MzJfdClmaXJzdEhhc0luZGV4OwotLSAodm9pZClzZXR1cEV4dHJhVGV4dEluZm86KGNvbnN0IGNoYXIgKilleHRyYVRleHRGb3JtYXRJbmZvOwotLSAodm9pZClzZXR1cEV4dGVuc2lvblJhbmdlczooY29uc3QgR1BCRXh0ZW5zaW9uUmFuZ2UgKilyYW5nZXMgY291bnQ6KGludDMyX3QpY291bnQ7Ci0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJGaWxlRGVzY3JpcHRvciAoKQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoUGFja2FnZTooTlNTdHJpbmcgKilwYWNrYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OihHUEJGaWxlU3ludGF4KXN5bnRheDsKLUBlbmQKLQotQGludGVyZmFjZSBHUEJPbmVvZkRlc2NyaXB0b3IgKCkgewotIEBwYWNrYWdlCi0gIGNvbnN0IGNoYXIgKm5hbWVfOwotICBOU0FycmF5ICpmaWVsZHNfOwotICBTRUwgY2FzZVNlbF87Ci19Ci0vLyBuYW1lIG11c3QgYmUgbG9uZyBsaXZlZC4KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aE5hbWU6KGNvbnN0IGNoYXIgKiluYW1lIGZpZWxkczooTlNBcnJheSAqKWZpZWxkczsKLUBlbmQKLQotQGludGVyZmFjZSBHUEJGaWVsZERlc2NyaXB0b3IgKCkgewotIEBwYWNrYWdlCi0gIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uICpkZXNjcmlwdGlvbl87Ci0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJPbmVvZkRlc2NyaXB0b3IgKmNvbnRhaW5pbmdPbmVvZl87Ci0KLSAgU0VMIGdldFNlbF87Ci0gIFNFTCBzZXRTZWxfOwotICBTRUwgaGFzT3JDb3VudFNlbF87ICAvLyAqQ291bnQgZm9yIG1hcDw+L3JlcGVhdGVkIGZpZWxkcywgaGFzKiBvdGhlcndpc2UuCi0gIFNFTCBzZXRIYXNTZWxfOwotfQotCi0vLyBTaW5nbGUgaW5pdGlhbGl6ZXIKLS8vIGRlc2NyaXB0aW9uIGhhcyB0byBiZSBsb25nIGxpdmVkLCBpdCBpcyBoZWxkIGFzIGEgcmF3IHBvaW50ZXIuCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhGaWVsZERlc2NyaXB0aW9uOih2b2lkICopZGVzY3JpcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlc0RlZmF1bHQ6KEJPT0wpaW5jbHVkZXNEZWZhdWx0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OihHUEJGaWxlU3ludGF4KXN5bnRheDsKLUBlbmQKLQotQGludGVyZmFjZSBHUEJFbnVtRGVzY3JpcHRvciAoKQotLy8gdmFsdWVOYW1lcywgdmFsdWVzIGFuZCBleHRyYVRleHRGb3JtYXRJbmZvIGhhdmUgdG8gYmUgbG9uZyBsaXZlZCwgdGhleSBhcmUKLS8vIGhlbGQgYXMgcmF3IHBvaW50ZXJzLgotKyAoaW5zdGFuY2V0eXBlKQotICAgIGFsbG9jRGVzY3JpcHRvckZvck5hbWU6KE5TU3RyaW5nICopbmFtZQotICAgICAgICAgICAgICAgIHZhbHVlTmFtZXM6KGNvbnN0IGNoYXIgKil2YWx1ZU5hbWVzCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlczooY29uc3QgaW50MzJfdCAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgY291bnQ6KHVpbnQzMl90KXZhbHVlQ291bnQKLSAgICAgICAgICAgICAgZW51bVZlcmlmaWVyOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZW51bVZlcmlmaWVyOwotKyAoaW5zdGFuY2V0eXBlKQotICAgIGFsbG9jRGVzY3JpcHRvckZvck5hbWU6KE5TU3RyaW5nICopbmFtZQotICAgICAgICAgICAgICAgIHZhbHVlTmFtZXM6KGNvbnN0IGNoYXIgKil2YWx1ZU5hbWVzCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlczooY29uc3QgaW50MzJfdCAqKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgY291bnQ6KHVpbnQzMl90KXZhbHVlQ291bnQKLSAgICAgICAgICAgICAgZW51bVZlcmlmaWVyOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZW51bVZlcmlmaWVyCi0gICAgICAgZXh0cmFUZXh0Rm9ybWF0SW5mbzooY29uc3QgY2hhciAqKWV4dHJhVGV4dEZvcm1hdEluZm87Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aE5hbWU6KE5TU3RyaW5nICopbmFtZQotICAgICAgICAgICAgICAgICAgdmFsdWVOYW1lczooY29uc3QgY2hhciAqKXZhbHVlTmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6KGNvbnN0IGludDMyX3QgKil2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KHVpbnQzMl90KXZhbHVlQ291bnQKLSAgICAgICAgICAgICAgICBlbnVtVmVyaWZpZXI6KEdQQkVudW1WYWxpZGF0aW9uRnVuYyllbnVtVmVyaWZpZXI7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAoKSB7Ci0gQHBhY2thZ2UKLSAgR1BCRXh0ZW5zaW9uRGVzY3JpcHRpb24gKmRlc2NyaXB0aW9uXzsKLX0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBHUEJXaXJlRm9ybWF0IHdpcmVUeXBlOwotCi0vLyBGb3IgcmVwZWF0ZWQgZXh0ZW5zaW9ucywgYWx0ZXJuYXRlV2lyZVR5cGUgaXMgdGhlIHdpcmVUeXBlIHdpdGggdGhlIG9wcG9zaXRlCi0vLyB2YWx1ZSBmb3IgdGhlIHBhY2thYmxlIHByb3BlcnR5LiAgaS5lLiAtIGlmIHRoZSBleHRlbnNpb24gd2FzIG1hcmtlZCBwYWNrZWQKLS8vIGl0IHdvdWxkIGJlIHRoZSB3aXJlIHR5cGUgZm9yIHVucGFja2VkOyBpZiB0aGUgZXh0ZW5zaW9uIHdhcyBtYXJrZWQgdW5wYWNrZWQsCi0vLyBpdCB3b3VsZCBiZSB0aGUgd2lyZSB0eXBlIGZvciBwYWNrZWQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgR1BCV2lyZUZvcm1hdCBhbHRlcm5hdGVXaXJlVHlwZTsKLQotLy8gZGVzY3JpcHRpb24gaGFzIHRvIGJlIGxvbmcgbGl2ZWQsIGl0IGlzIGhlbGQgYXMgYSByYXcgcG9pbnRlci4KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aEV4dGVuc2lvbkRlc2NyaXB0aW9uOgotICAgIChHUEJFeHRlbnNpb25EZXNjcmlwdGlvbiAqKWRlc2NyaXB0aW9uOwotLSAoTlNDb21wYXJpc29uUmVzdWx0KWNvbXBhcmVCeUZpZWxkTnVtYmVyOihHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopb3RoZXI7Ci1AZW5kCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLUdQQl9JTkxJTkUgQk9PTCBHUEJGaWVsZElzTWFwT3JBcnJheShHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIHJldHVybiAoZmllbGQtPmRlc2NyaXB0aW9uXy0+ZmxhZ3MgJgotICAgICAgICAgIChHUEJGaWVsZFJlcGVhdGVkIHwgR1BCRmllbGRNYXBLZXlNYXNrKSkgIT0gMDsKLX0KLQotR1BCX0lOTElORSBHUEJEYXRhVHlwZSBHUEJHZXRGaWVsZERhdGFUeXBlKEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgcmV0dXJuIGZpZWxkLT5kZXNjcmlwdGlvbl8tPmRhdGFUeXBlOwotfQotCi1HUEJfSU5MSU5FIGludDMyX3QgR1BCRmllbGRIYXNJbmRleChHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIHJldHVybiBmaWVsZC0+ZGVzY3JpcHRpb25fLT5oYXNJbmRleDsKLX0KLQotR1BCX0lOTElORSB1aW50MzJfdCBHUEJGaWVsZE51bWJlcihHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIHJldHVybiBmaWVsZC0+ZGVzY3JpcHRpb25fLT5udW1iZXI7Ci19Ci0KLXVpbnQzMl90IEdQQkZpZWxkVGFnKEdQQkZpZWxkRGVzY3JpcHRvciAqc2VsZik7Ci0KLS8vIEZvciByZXBlYXRlZCBmaWVsZHMsIGFsdGVybmF0ZVdpcmVUeXBlIGlzIHRoZSB3aXJlVHlwZSB3aXRoIHRoZSBvcHBvc2l0ZQotLy8gdmFsdWUgZm9yIHRoZSBwYWNrYWJsZSBwcm9wZXJ0eS4gIGkuZS4gLSBpZiB0aGUgZmllbGQgd2FzIG1hcmtlZCBwYWNrZWQgaXQKLS8vIHdvdWxkIGJlIHRoZSB3aXJlIHR5cGUgZm9yIHVucGFja2VkOyBpZiB0aGUgZmllbGQgd2FzIG1hcmtlZCB1bnBhY2tlZCwgaXQKLS8vIHdvdWxkIGJlIHRoZSB3aXJlIHR5cGUgZm9yIHBhY2tlZC4KLXVpbnQzMl90IEdQQkZpZWxkQWx0ZXJuYXRlVGFnKEdQQkZpZWxkRGVzY3JpcHRvciAqc2VsZik7Ci0KLUdQQl9JTkxJTkUgQk9PTCBHUEJQcmVzZXJ2ZVVua25vd25GaWVsZHMoR1BCRmlsZVN5bnRheCBzeW50YXgpIHsKLSAgcmV0dXJuIHN5bnRheCAhPSBHUEJGaWxlU3ludGF4UHJvdG8zOwotfQotCi1HUEJfSU5MSU5FIEJPT0wgR1BCSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKEdQQkZpbGVTeW50YXggc3ludGF4KSB7Ci0gIHJldHVybiBzeW50YXggPT0gR1BCRmlsZVN5bnRheFByb3RvMzsKLX0KLQotR1BCX0lOTElORSBCT09MIEdQQkV4dGVuc2lvbklzUmVwZWF0ZWQoR1BCRXh0ZW5zaW9uRGVzY3JpcHRpb24gKmRlc2NyaXB0aW9uKSB7Ci0gIHJldHVybiAoZGVzY3JpcHRpb24tPm9wdGlvbnMgJiBHUEJFeHRlbnNpb25SZXBlYXRlZCkgIT0gMDsKLX0KLQotR1BCX0lOTElORSBCT09MIEdQQkV4dGVuc2lvbklzUGFja2VkKEdQQkV4dGVuc2lvbkRlc2NyaXB0aW9uICpkZXNjcmlwdGlvbikgewotICByZXR1cm4gKGRlc2NyaXB0aW9uLT5vcHRpb25zICYgR1BCRXh0ZW5zaW9uUGFja2VkKSAhPSAwOwotfQotCi1HUEJfSU5MSU5FIEJPT0wgR1BCRXh0ZW5zaW9uSXNXaXJlRm9ybWF0KEdQQkV4dGVuc2lvbkRlc2NyaXB0aW9uICpkZXNjcmlwdGlvbikgewotICByZXR1cm4gKGRlc2NyaXB0aW9uLT5vcHRpb25zICYgR1BCRXh0ZW5zaW9uU2V0V2lyZUZvcm1hdCkgIT0gMDsKLX0KLQotLy8gSGVscGVyIGZvciBjb21waWxlIHRpbWUgYXNzZXRzLgotI2lmbmRlZiBfR1BCQ29tcGlsZUFzc2VydAotICAjaWYgX19oYXNfZmVhdHVyZShjX3N0YXRpY19hc3NlcnQpIHx8IF9faGFzX2V4dGVuc2lvbihjX3N0YXRpY19hc3NlcnQpCi0gICAgI2RlZmluZSBfR1BCQ29tcGlsZUFzc2VydCh0ZXN0LCBtc2cpIF9TdGF0aWNfYXNzZXJ0KCh0ZXN0KSwgI21zZykKLSAgI2Vsc2UKLSAgICAvLyBQcmUtWGNvZGUgNyBzdXBwb3J0LgotICAgICNkZWZpbmUgX0dQQkNvbXBpbGVBc3NlcnRTeW1ib2xJbm5lcihsaW5lLCBtc2cpIF9HUEJDb21waWxlQXNzZXJ0ICMjIGxpbmUgIyMgX18gIyMgbXNnCi0gICAgI2RlZmluZSBfR1BCQ29tcGlsZUFzc2VydFN5bWJvbChsaW5lLCBtc2cpIF9HUEJDb21waWxlQXNzZXJ0U3ltYm9sSW5uZXIobGluZSwgbXNnKQotICAgICNkZWZpbmUgX0dQQkNvbXBpbGVBc3NlcnQodGVzdCwgbXNnKSBcCi0gICAgICAgIHR5cGVkZWYgY2hhciBfR1BCQ29tcGlsZUFzc2VydFN5bWJvbChfX0xJTkVfXywgbXNnKSBbICgodGVzdCkgPyAxIDogLTEpIF0KLSAgI2VuZGlmICAvLyBfX2hhc19mZWF0dXJlKGNfc3RhdGljX2Fzc2VydCkgfHwgX19oYXNfZXh0ZW5zaW9uKGNfc3RhdGljX2Fzc2VydCkKLSNlbmRpZiAvLyBfR1BCQ29tcGlsZUFzc2VydAotCi0vLyBTYW5pdHkgY2hlY2sgdGhhdCB0aGVyZSBpc24ndCBwYWRkaW5nIGJldHdlZW4gdGhlIGZpZWxkIGRlc2NyaXB0aW9uCi0vLyBzdHJ1Y3R1cmVzIHdpdGggYW5kIHdpdGhvdXQgYSBkZWZhdWx0LgotX0dQQkNvbXBpbGVBc3NlcnQoc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uV2l0aERlZmF1bHQpID09Ci0gICAgICAgICAgICAgICAgICAoc2l6ZW9mKEdQQkdlbmVyaWNWYWx1ZSkgKwotICAgICAgICAgICAgICAgICAgIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpLAotICAgICAgICAgICAgICAgICAgRGVzY3JpcHRpb25zV2l0aERlZmF1bHRfZGlmZmVyZW50X3NpemVfdGhhbl9leHBlY3RlZCk7Ci0KLUNGX0VYVEVSTl9DX0VORApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJEaWN0aW9uYXJ5LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkRpY3Rpb25hcnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzEyMDgxNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkRpY3Rpb25hcnkuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNDMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJHUEJSdW50aW1lVHlwZXMuaCIKLQotLy8gVGhlc2UgY2xhc3NlcyBhcmUgdXNlZCBmb3IgbWFwIGZpZWxkcyBvZiBiYXNpYyBkYXRhIHR5cGVzLiBUaGV5IGFyZSB1c2VkIGJlY2F1c2UKLS8vIHRoZXkgcGVyZm9ybSBiZXR0ZXIgdGhhbiBib3hpbmcgaW50byBOU051bWJlcnMgaW4gTlNEaWN0aW9uYXJpZXMuCi0KLS8vIE5vdGU6IFRoZXNlIGFyZSBub3QgbWVhbnQgdG8gYmUgc3ViY2xhc3NlZC4KLQotTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KLQotLy8lUERETS1FWFBBTkQgREVDTEFSRV9ESUNUSU9OQVJJRVMoKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMiAtPiBVSW50MzIKLQotQGludGVyZmFjZSBHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KHVpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDMyX3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50MzJfdClrZXkgdmFsdWU6KG51bGxhYmxlIHVpbnQzMl90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgdWludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZToodWludDMyX3QpdmFsdWUgZm9yS2V5Oih1aW50MzJfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gSW50MzIKLQotQGludGVyZmFjZSBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50MzJfdClrZXkgdmFsdWU6KG51bGxhYmxlIGludDMyX3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDMyX3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMiAtPiBVSW50NjQKLQotQGludGVyZmFjZSBHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KHVpbnQ2NF90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDMyX3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50MzJfdClrZXkgdmFsdWU6KG51bGxhYmxlIHVpbnQ2NF90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgdWludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZToodWludDY0X3QpdmFsdWUgZm9yS2V5Oih1aW50MzJfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gSW50NjQKLQotQGludGVyZmFjZSBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50NjRfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50MzJfdClrZXkgdmFsdWU6KG51bGxhYmxlIGludDY0X3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooaW50NjRfdCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDMyX3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMiAtPiBCb29sCi0KLUBpbnRlcmZhY2UgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooQk9PTCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDMyX3Qpa2V5IHZhbHVlOihudWxsYWJsZSBCT09MICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgQk9PTCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50MzJCb29sRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooQk9PTCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDMyX3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMiAtPiBGbG9hdAotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihmbG9hdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBmbG9hdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQzMl90KWtleSB2YWx1ZToobnVsbGFibGUgZmxvYXQgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGZsb2F0KXZhbHVlIGZvcktleToodWludDMyX3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50MzJfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDMyIC0+IERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooZG91YmxlKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDMyX3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQzMl90KWtleSB2YWx1ZToobnVsbGFibGUgZG91YmxlICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGRvdWJsZSl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDMyX3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMiAtPiBFbnVtCi0KLUBpbnRlcmZhY2UgR1BCVUludDMyRW51bURpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgdmFsaWRhdGlvbkZ1bmM7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYzsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTooaW50MzJfdClyYXdWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50MzJfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYzsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS8vIFRoZXNlIHdpbGwgcmV0dXJuIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUgaWYgdGhlIHZhbHVlIGZvciB0aGUga2V5Ci0vLyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMuIElmIHRoZSBhY3R1YWwgdmFsdWUgaXMKLS8vIGRlc2lyZWQsIHVzZSAicmF3IiB2ZXJzaW9uIG9mIHRoZSBtZXRob2QuCi0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQzMl90KWtleSB2YWx1ZToobnVsbGFibGUgaW50MzJfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0vLyBUaGVzZSBtZXRob2RzIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbkZ1bmMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gdmFsdWVzIHRoYXQgd2VyZSBub3QKLS8vIGtub3duIGF0IHRoZSB0aW1lIHRoZSBiaW5hcnkgd2FzIGNvbXBpbGVkLgotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50MzJfdClrZXkgcmF3VmFsdWU6KG51bGxhYmxlIGludDMyX3QgKilyYXdWYWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDMyX3Qga2V5LCBpbnQzMl90IHJhd1ZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0vLyBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMsIHRoZXNlCi0vLyBtZXRob2RzIHdpbGwgYXNzZXJ0IGluIGRlYnVnLCBhbmQgd2lsbCBsb2cgaW4gcmVsZWFzZSBhbmQgYXNzaWduIHRoZSB2YWx1ZQotLy8gdG8gdGhlIGRlZmF1bHQgdmFsdWUuIFVzZSB0aGUgcmF3VmFsdWUgbWV0aG9kcyBiZWxvdyB0byBhc3NpZ24gbm9uIGVudW1lcmF0b3IKLS8vIHZhbHVlcy4KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleTsKLQotLy8gVGhpcyBtZXRob2QgYnlwYXNzIHRoZSB2YWxpZGF0aW9uRnVuYyB0byBwcm92aWRlIHNldHRpbmcgb2YgdmFsdWVzIHRoYXQgd2VyZSBub3QKLS8vIGtub3duIGF0IHRoZSB0aW1lIHRoZSBiaW5hcnkgd2FzIGNvbXBpbGVkLgotLSAodm9pZClzZXRSYXdWYWx1ZTooaW50MzJfdClyYXdWYWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleTsKLQotLy8gTm8gdmFsaWRhdGlvbiBhcHBsaWVzIHRvIHRoZXNlIG1ldGhvZHMuCi0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gT2JqZWN0Ci0KLUBpbnRlcmZhY2UgR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeTxfX2NvdmFyaWFudCBPYmplY3RUeXBlPiA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aE9iamVjdDooT2JqZWN0VHlwZSlvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDMyX3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0czooY29uc3QgT2JqZWN0VHlwZSBHUEJfVU5TQUZFX1VOUkVUQUlORUQgW10pb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aE9iamVjdHM6KGNvbnN0IE9iamVjdFR5cGUgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKW9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKE9iamVjdFR5cGUpb2JqZWN0Rm9yS2V5Oih1aW50MzJfdClrZXk7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50MzJfdCBrZXksIE9iamVjdFR5cGUgb2JqZWN0LCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0T2JqZWN0OihPYmplY3RUeXBlKW9iamVjdCBmb3JLZXk6KHVpbnQzMl90KWtleTsKLQotLSAodm9pZClyZW1vdmVPYmplY3RGb3JLZXk6KHVpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBVSW50MzIKLQotQGludGVyZmFjZSBHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZToobnVsbGFibGUgdWludDMyX3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIHVpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZToodWludDMyX3QpdmFsdWUgZm9yS2V5OihpbnQzMl90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50MzJfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gSW50MzIKLQotQGludGVyZmFjZSBHUEJJbnQzMkludDMyRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50MzJfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZToobnVsbGFibGUgaW50MzJfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDMyX3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBVSW50NjQKLQotQGludGVyZmFjZSBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZToobnVsbGFibGUgdWludDY0X3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIHVpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZToodWludDY0X3QpdmFsdWUgZm9yS2V5OihpbnQzMl90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50MzJfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gSW50NjQKLQotQGludGVyZmFjZSBHUEJJbnQzMkludDY0RGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQ2NF90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50MzJfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDMySW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZToobnVsbGFibGUgaW50NjRfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooaW50NjRfdCl2YWx1ZSBmb3JLZXk6KGludDMyX3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBCb29sCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJCb29sRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihCT09MKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50MzJfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IEJPT0wgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50MzJfdClrZXkgdmFsdWU6KG51bGxhYmxlIEJPT0wgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIEJPT0wgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJCb29sRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooQk9PTCl2YWx1ZSBmb3JLZXk6KGludDMyX3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBGbG9hdAotCi1AaW50ZXJmYWNlIEdQQkludDMyRmxvYXREaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGZsb2F0KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50MzJfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDMyRmxvYXREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDMyX3Qpa2V5IHZhbHVlOihudWxsYWJsZSBmbG9hdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGZsb2F0KXZhbHVlIGZvcktleTooaW50MzJfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDMyX3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDMyIC0+IERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihkb3VibGUpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDMyX3Qpa2V5IHZhbHVlOihudWxsYWJsZSBkb3VibGUgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIGRvdWJsZSB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGRvdWJsZSl2YWx1ZSBmb3JLZXk6KGludDMyX3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQzMl90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBFbnVtCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJFbnVtRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIEdQQkVudW1WYWxpZGF0aW9uRnVuYyB2YWxpZGF0aW9uRnVuYzsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jOwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDMyX3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDMyRW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS8vIFRoZXNlIHdpbGwgcmV0dXJuIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUgaWYgdGhlIHZhbHVlIGZvciB0aGUga2V5Ci0vLyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMuIElmIHRoZSBhY3R1YWwgdmFsdWUgaXMKLS8vIGRlc2lyZWQsIHVzZSAicmF3IiB2ZXJzaW9uIG9mIHRoZSBtZXRob2QuCi0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDMyX3Qpa2V5IHZhbHVlOihudWxsYWJsZSBpbnQzMl90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLy8gVGhlc2UgbWV0aG9kcyBieXBhc3MgdGhlIHZhbGlkYXRpb25GdW5jIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHZhbHVlcyB0aGF0IHdlcmUgbm90Ci0vLyBrbm93biBhdCB0aGUgdGltZSB0aGUgYmluYXJ5IHdhcyBjb21waWxlZC4KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50MzJfdClrZXkgcmF3VmFsdWU6KG51bGxhYmxlIGludDMyX3QgKilyYXdWYWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIGludDMyX3QgcmF3VmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLy8gSWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBhcyBkZWZpbmVkIGJ5IHZhbGlkYXRpb25GdW5jLCB0aGVzZQotLy8gbWV0aG9kcyB3aWxsIGFzc2VydCBpbiBkZWJ1ZywgYW5kIHdpbGwgbG9nIGluIHJlbGVhc2UgYW5kIGFzc2lnbiB0aGUgdmFsdWUKLS8vIHRvIHRoZSBkZWZhdWx0IHZhbHVlLiBVc2UgdGhlIHJhd1ZhbHVlIG1ldGhvZHMgYmVsb3cgdG8gYXNzaWduIG5vbiBlbnVtZXJhdG9yCi0vLyB2YWx1ZXMuCi0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5OihpbnQzMl90KWtleTsKLQotLy8gVGhpcyBtZXRob2QgYnlwYXNzIHRoZSB2YWxpZGF0aW9uRnVuYyB0byBwcm92aWRlIHNldHRpbmcgb2YgdmFsdWVzIHRoYXQgd2VyZSBub3QKLS8vIGtub3duIGF0IHRoZSB0aW1lIHRoZSBiaW5hcnkgd2FzIGNvbXBpbGVkLgotLSAodm9pZClzZXRSYXdWYWx1ZTooaW50MzJfdClyYXdWYWx1ZSBmb3JLZXk6KGludDMyX3Qpa2V5OwotCi0vLyBObyB2YWxpZGF0aW9uIGFwcGxpZXMgdG8gdGhlc2UgbWV0aG9kcy4KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50MzJfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gT2JqZWN0Ci0KLUBpbnRlcmZhY2UgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PF9fY292YXJpYW50IE9iamVjdFR5cGU+IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0OihPYmplY3RUeXBlKW9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aE9iamVjdHM6KGNvbnN0IE9iamVjdFR5cGUgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKW9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDMyT2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoT2JqZWN0czooY29uc3QgT2JqZWN0VHlwZSBHUEJfVU5TQUZFX1VOUkVUQUlORUQgW10pb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKE9iamVjdFR5cGUpb2JqZWN0Rm9yS2V5OihpbnQzMl90KWtleTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDMyX3Qga2V5LCBPYmplY3RUeXBlIG9iamVjdCwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0T2JqZWN0OihPYmplY3RUeXBlKW9iamVjdCBmb3JLZXk6KGludDMyX3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZU9iamVjdEZvcktleTooaW50MzJfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IFVJbnQzMgotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQ2NF90KWtleSB2YWx1ZToobnVsbGFibGUgdWludDMyX3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCB1aW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOih1aW50MzJfdCl2YWx1ZSBmb3JLZXk6KHVpbnQ2NF90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NCAtPiBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQ2NF90KWtleSB2YWx1ZToobnVsbGFibGUgaW50MzJfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50NjRfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQ2NF90KWtleSB2YWx1ZToobnVsbGFibGUgdWludDY0X3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCB1aW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOih1aW50NjRfdCl2YWx1ZSBmb3JLZXk6KHVpbnQ2NF90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NCAtPiBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEludDY0RGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQ2NF90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQ2NF90KWtleSB2YWx1ZToobnVsbGFibGUgaW50NjRfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50NjRfdCBrZXksIGludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihpbnQ2NF90KXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IEJvb2wKLQotQGludGVyZmFjZSBHUEJVSW50NjRCb29sRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihCT09MKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50NjRfdClrZXkgdmFsdWU6KG51bGxhYmxlIEJPT0wgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCBCT09MIHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihCT09MKXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IEZsb2F0Ci0KLUBpbnRlcmZhY2UgR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGZsb2F0KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBmbG9hdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOihudWxsYWJsZSBmbG9hdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50NjRfdCBrZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooZmxvYXQpdmFsdWUgZm9yS2V5Oih1aW50NjRfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQ2NF90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gRG91YmxlCi0KLUBpbnRlcmZhY2UgR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihkb3VibGUpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOihudWxsYWJsZSBkb3VibGUgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCBkb3VibGUgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooZG91YmxlKXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IEVudW0KLQotQGludGVyZmFjZSBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIEdQQkVudW1WYWxpZGF0aW9uRnVuYyB2YWxpZGF0aW9uRnVuYzsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jOwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQ2NF90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDY0RW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLy8gVGhlc2Ugd2lsbCByZXR1cm4ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSBpZiB0aGUgdmFsdWUgZm9yIHRoZSBrZXkKLS8vIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3IgYXMgZGVmaW5lZCBieSB2YWxpZGF0aW9uRnVuYy4gSWYgdGhlIGFjdHVhbCB2YWx1ZSBpcwotLy8gZGVzaXJlZCwgdXNlICJyYXciIHZlcnNpb24gb2YgdGhlIG1ldGhvZC4KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOihudWxsYWJsZSBpbnQzMl90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQ2NF90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS8vIFRoZXNlIG1ldGhvZHMgYnlwYXNzIHRoZSB2YWxpZGF0aW9uRnVuYyB0byBwcm92aWRlIGFjY2VzcyB0byB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAotLy8ga25vd24gYXQgdGhlIHRpbWUgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQuCi0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQ2NF90KWtleSByYXdWYWx1ZToobnVsbGFibGUgaW50MzJfdCAqKXJhd1ZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRSYXdWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50NjRfdCBrZXksIGludDMyX3QgcmF3VmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0RW51bURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS8vIElmIHZhbHVlIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3IgYXMgZGVmaW5lZCBieSB2YWxpZGF0aW9uRnVuYywgdGhlc2UKLS8vIG1ldGhvZHMgd2lsbCBhc3NlcnQgaW4gZGVidWcsIGFuZCB3aWxsIGxvZyBpbiByZWxlYXNlIGFuZCBhc3NpZ24gdGhlIHZhbHVlCi0vLyB0byB0aGUgZGVmYXVsdCB2YWx1ZS4gVXNlIHRoZSByYXdWYWx1ZSBtZXRob2RzIGJlbG93IHRvIGFzc2lnbiBub24gZW51bWVyYXRvcgotLy8gdmFsdWVzLgotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5OwotCi0vLyBUaGlzIG1ldGhvZCBieXBhc3MgdGhlIHZhbGlkYXRpb25GdW5jIHRvIHByb3ZpZGUgc2V0dGluZyBvZiB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAotLy8ga25vd24gYXQgdGhlIHRpbWUgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQuCi0tICh2b2lkKXNldFJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlIGZvcktleToodWludDY0X3Qpa2V5OwotCi0vLyBObyB2YWxpZGF0aW9uIGFwcGxpZXMgdG8gdGhlc2UgbWV0aG9kcy4KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NCAtPiBPYmplY3QKLQotQGludGVyZmFjZSBHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5PF9fY292YXJpYW50IE9iamVjdFR5cGU+IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0OihPYmplY3RUeXBlKW9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhPYmplY3RzOihjb25zdCBPYmplY3RUeXBlIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoT2JqZWN0czooY29uc3QgT2JqZWN0VHlwZSBHUEJfVU5TQUZFX1VOUkVUQUlORUQgW10pb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoT2JqZWN0VHlwZSlvYmplY3RGb3JLZXk6KHVpbnQ2NF90KWtleTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQ2NF90IGtleSwgT2JqZWN0VHlwZSBvYmplY3QsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRPYmplY3Q6KE9iamVjdFR5cGUpb2JqZWN0IGZvcktleToodWludDY0X3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZU9iamVjdEZvcktleToodWludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IFVJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkludDY0VUludDMyRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOih1aW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDY0X3Qpa2V5IHZhbHVlOihudWxsYWJsZSB1aW50MzJfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQ2NF90IGtleSwgdWludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOih1aW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQ2NF90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NCAtPiBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkludDY0SW50MzJEaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDY0X3Qpa2V5IHZhbHVlOihudWxsYWJsZSBpbnQzMl90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooaW50NjRfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkludDY0VUludDY0RGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOih1aW50NjRfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDY0X3Qpa2V5IHZhbHVlOihudWxsYWJsZSB1aW50NjRfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQ2NF90IGtleSwgdWludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOih1aW50NjRfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQ2NF90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NCAtPiBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkludDY0SW50NjREaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDY0X3Qpa2V5IHZhbHVlOihudWxsYWJsZSBpbnQ2NF90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCBpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihpbnQ2NF90KXZhbHVlIGZvcktleTooaW50NjRfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IEJvb2wKLQotQGludGVyZmFjZSBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KEJPT0wpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IEJPT0wgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQ2NF90KWtleSB2YWx1ZToobnVsbGFibGUgQk9PTCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQ2NF90IGtleSwgQk9PTCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihCT09MKXZhbHVlIGZvcktleTooaW50NjRfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IEZsb2F0Ci0KLUBpbnRlcmZhY2UgR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooZmxvYXQpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50NjRfdClrZXkgdmFsdWU6KG51bGxhYmxlIGZsb2F0ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCBmbG9hdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooZmxvYXQpdmFsdWUgZm9yS2V5OihpbnQ2NF90KWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50NjRfdClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gRG91YmxlCi0KLUBpbnRlcmZhY2UgR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGRvdWJsZSl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50NjRfdClrZXkgdmFsdWU6KG51bGxhYmxlIGRvdWJsZSAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQ2NF90IGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZTooZG91YmxlKXZhbHVlIGZvcktleTooaW50NjRfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDY0X3QpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IEVudW0KLQotQGludGVyZmFjZSBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgR1BCRW51bVZhbGlkYXRpb25GdW5jIHZhbGlkYXRpb25GdW5jOwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmM7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWU6KGludDMyX3QpcmF3VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50NjRfdClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmM7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLy8gVGhlc2Ugd2lsbCByZXR1cm4ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSBpZiB0aGUgdmFsdWUgZm9yIHRoZSBrZXkKLS8vIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3IgYXMgZGVmaW5lZCBieSB2YWxpZGF0aW9uRnVuYy4gSWYgdGhlIGFjdHVhbCB2YWx1ZSBpcwotLy8gZGVzaXJlZCwgdXNlICJyYXciIHZlcnNpb24gb2YgdGhlIG1ldGhvZC4KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50NjRfdClrZXkgdmFsdWU6KG51bGxhYmxlIGludDMyX3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50NjRfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0vLyBUaGVzZSBtZXRob2RzIGJ5cGFzcyB0aGUgdmFsaWRhdGlvbkZ1bmMgdG8gcHJvdmlkZSBhY2Nlc3MgdG8gdmFsdWVzIHRoYXQgd2VyZSBub3QKLS8vIGtub3duIGF0IHRoZSB0aW1lIHRoZSBiaW5hcnkgd2FzIGNvbXBpbGVkLgotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQ2NF90KWtleSByYXdWYWx1ZToobnVsbGFibGUgaW50MzJfdCAqKXJhd1ZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRSYXdWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQ2NF90IGtleSwgaW50MzJfdCByYXdWYWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkUmF3RW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0vLyBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMsIHRoZXNlCi0vLyBtZXRob2RzIHdpbGwgYXNzZXJ0IGluIGRlYnVnLCBhbmQgd2lsbCBsb2cgaW4gcmVsZWFzZSBhbmQgYXNzaWduIHRoZSB2YWx1ZQotLy8gdG8gdGhlIGRlZmF1bHQgdmFsdWUuIFVzZSB0aGUgcmF3VmFsdWUgbWV0aG9kcyBiZWxvdyB0byBhc3NpZ24gbm9uIGVudW1lcmF0b3IKLS8vIHZhbHVlcy4KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5OwotCi0vLyBUaGlzIG1ldGhvZCBieXBhc3MgdGhlIHZhbGlkYXRpb25GdW5jIHRvIHByb3ZpZGUgc2V0dGluZyBvZiB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAotLy8ga25vd24gYXQgdGhlIHRpbWUgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQuCi0tICh2b2lkKXNldFJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlIGZvcktleTooaW50NjRfdClrZXk7Ci0KLS8vIE5vIHZhbGlkYXRpb24gYXBwbGllcyB0byB0aGVzZSBtZXRob2RzLgotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQ2NF90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NCAtPiBPYmplY3QKLQotQGludGVyZmFjZSBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8X19jb3ZhcmlhbnQgT2JqZWN0VHlwZT4gOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhPYmplY3Q6KE9iamVjdFR5cGUpb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDY0X3Qpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0czooY29uc3QgT2JqZWN0VHlwZSBHUEJfVU5TQUZFX1VOUkVUQUlORUQgW10pb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPYmplY3RzOihjb25zdCBPYmplY3RUeXBlIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDY0T2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoT2JqZWN0VHlwZSlvYmplY3RGb3JLZXk6KGludDY0X3Qpa2V5OwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50NjRfdCBrZXksIE9iamVjdFR5cGUgb2JqZWN0LCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDY0T2JqZWN0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRPYmplY3Q6KE9iamVjdFR5cGUpb2JqZWN0IGZvcktleTooaW50NjRfdClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlT2JqZWN0Rm9yS2V5OihpbnQ2NF90KWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBCb29sIC0+IFVJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KHVpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KEJPT0wpa2V5IHZhbHVlOihudWxsYWJsZSB1aW50MzJfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShCT09MIGtleSwgdWludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KHVpbnQzMl90KXZhbHVlIGZvcktleTooQk9PTClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KEJPT0wpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gSW50MzIKLQotQGludGVyZmFjZSBHUEJCb29sSW50MzJEaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihCT09MKWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihCT09MKWtleSB2YWx1ZToobnVsbGFibGUgaW50MzJfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShCT09MIGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooQk9PTClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KEJPT0wpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gVUludDY0Ci0KLUBpbnRlcmZhY2UgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihCT09MKWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJCb29sVUludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KG51bGxhYmxlIHVpbnQ2NF90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKEJPT0wga2V5LCB1aW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJCb29sVUludDY0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLSAodm9pZClzZXRWYWx1ZToodWludDY0X3QpdmFsdWUgZm9yS2V5OihCT09MKWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50NjRfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEJPT0wpa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KEJPT0wpa2V5IHZhbHVlOihudWxsYWJsZSBpbnQ2NF90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKEJPT0wga2V5LCBpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDY0X3QpdmFsdWUgZm9yS2V5OihCT09MKWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBCb29sCi0KLUBpbnRlcmZhY2UgR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KEJPT0wpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihCT09MKWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJCb29sQm9vbERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KG51bGxhYmxlIEJPT0wgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoQk9PTCBrZXksIEJPT0wgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbEJvb2xEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihCT09MKXZhbHVlIGZvcktleTooQk9PTClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KEJPT0wpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gRmxvYXQKLQotQGludGVyZmFjZSBHUEJCb29sRmxvYXREaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGZsb2F0KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihCT09MKWtleSB2YWx1ZToobnVsbGFibGUgZmxvYXQgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoQk9PTCBrZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGZsb2F0KXZhbHVlIGZvcktleTooQk9PTClrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KEJPT0wpYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gRG91YmxlCi0KLUBpbnRlcmZhY2UgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooZG91YmxlKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KG51bGxhYmxlIGRvdWJsZSAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShCT09MIGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihkb3VibGUpdmFsdWUgZm9yS2V5OihCT09MKWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBFbnVtCi0KLUBpbnRlcmZhY2UgR1BCQm9vbEVudW1EaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgR1BCRW51bVZhbGlkYXRpb25GdW5jIHZhbGlkYXRpb25GdW5jOwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmM7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWU6KGludDMyX3QpcmF3VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCQm9vbEVudW1EaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYzsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS8vIFRoZXNlIHdpbGwgcmV0dXJuIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUgaWYgdGhlIHZhbHVlIGZvciB0aGUga2V5Ci0vLyBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMuIElmIHRoZSBhY3R1YWwgdmFsdWUgaXMKLS8vIGRlc2lyZWQsIHVzZSAicmF3IiB2ZXJzaW9uIG9mIHRoZSBtZXRob2QuCi0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KEJPT0wpa2V5IHZhbHVlOihudWxsYWJsZSBpbnQzMl90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKEJPT0wga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLy8gVGhlc2UgbWV0aG9kcyBieXBhc3MgdGhlIHZhbGlkYXRpb25GdW5jIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHZhbHVlcyB0aGF0IHdlcmUgbm90Ci0vLyBrbm93biBhdCB0aGUgdGltZSB0aGUgYmluYXJ5IHdhcyBjb21waWxlZC4KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgcmF3VmFsdWU6KG51bGxhYmxlIGludDMyX3QgKilyYXdWYWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoQk9PTCBrZXksIGludDMyX3QgcmF3VmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbEVudW1EaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0vLyBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMsIHRoZXNlCi0vLyBtZXRob2RzIHdpbGwgYXNzZXJ0IGluIGRlYnVnLCBhbmQgd2lsbCBsb2cgaW4gcmVsZWFzZSBhbmQgYXNzaWduIHRoZSB2YWx1ZQotLy8gdG8gdGhlIGRlZmF1bHQgdmFsdWUuIFVzZSB0aGUgcmF3VmFsdWUgbWV0aG9kcyBiZWxvdyB0byBhc3NpZ24gbm9uIGVudW1lcmF0b3IKLS8vIHZhbHVlcy4KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KEJPT0wpa2V5OwotCi0vLyBUaGlzIG1ldGhvZCBieXBhc3MgdGhlIHZhbGlkYXRpb25GdW5jIHRvIHByb3ZpZGUgc2V0dGluZyBvZiB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAotLy8ga25vd24gYXQgdGhlIHRpbWUgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQuCi0tICh2b2lkKXNldFJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlIGZvcktleTooQk9PTClrZXk7Ci0KLS8vIE5vIHZhbGlkYXRpb24gYXBwbGllcyB0byB0aGVzZSBtZXRob2RzLgotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihCT09MKWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBCb29sIC0+IE9iamVjdAotCi1AaW50ZXJmYWNlIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5PF9fY292YXJpYW50IE9iamVjdFR5cGU+IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0OihPYmplY3RUeXBlKW9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihCT09MKWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aE9iamVjdHM6KGNvbnN0IE9iamVjdFR5cGUgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKW9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPYmplY3RzOihjb25zdCBPYmplY3RUeXBlIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChPYmplY3RUeXBlKW9iamVjdEZvcktleTooQk9PTClrZXk7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShCT09MIGtleSwgT2JqZWN0VHlwZSBvYmplY3QsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbE9iamVjdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0T2JqZWN0OihPYmplY3RUeXBlKW9iamVjdCBmb3JLZXk6KEJPT0wpa2V5OwotCi0tICh2b2lkKXJlbW92ZU9iamVjdEZvcktleTooQk9PTClhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IFVJbnQzMgotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgdmFsdWU6KG51bGxhYmxlIHVpbnQzMl90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIHVpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KHVpbnQzMl90KXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KE5TU3RyaW5nICopYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFN0cmluZyAtPiBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooTlNTdHJpbmcgKilrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgdmFsdWU6KG51bGxhYmxlIGludDMyX3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoTlNTdHJpbmcgKmtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgdmFsdWU6KG51bGxhYmxlIHVpbnQ2NF90ICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIHVpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KHVpbnQ2NF90KXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilrZXk7Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KE5TU3RyaW5nICopYUtleTsKLS0gKHZvaWQpcmVtb3ZlQWxsOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFN0cmluZyAtPiBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQ2NF90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooTlNTdHJpbmcgKilrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgdmFsdWU6KG51bGxhYmxlIGludDY0X3QgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoTlNTdHJpbmcgKmtleSwgaW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDY0X3QpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEJvb2wKLQotQGludGVyZmFjZSBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihCT09MKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooTlNTdHJpbmcgKilrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IEJPT0wgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IEJPT0wgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KE5TU3RyaW5nICopa2V5IHZhbHVlOihudWxsYWJsZSBCT09MICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIEJPT0wgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnk7Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KEJPT0wpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEZsb2F0Ci0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5IDogTlNPYmplY3QgPE5TQ29weWluZz4KLQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgY291bnQ7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGZsb2F0KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooTlNTdHJpbmcgKilrZXk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWtleSB2YWx1ZToobnVsbGFibGUgZmxvYXQgKil2YWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoTlNTdHJpbmcgKmtleSwgZmxvYXQgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihmbG9hdCl2YWx1ZSBmb3JLZXk6KE5TU3RyaW5nICopa2V5OwotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWFLZXk7Ci0tICh2b2lkKXJlbW92ZUFsbDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBTdHJpbmcgLT4gRG91YmxlCi0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihkb3VibGUpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgTlNTdHJpbmcgKiBHUEJfVU5TQUZFX1VOUkVUQUlORUQgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0tIChCT09MKXZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWtleSB2YWx1ZToobnVsbGFibGUgZG91YmxlICopdmFsdWU7Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIGRvdWJsZSB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotCi0tICh2b2lkKXNldFZhbHVlOihkb3VibGUpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEVudW0KLQotQGludGVyZmFjZSBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIEdQQkVudW1WYWxpZGF0aW9uRnVuYyB2YWxpZGF0aW9uRnVuYzsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jOwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KE5TU3RyaW5nICopa2V5OwotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnk7Ci0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmM7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogR1BCX1VOU0FGRV9VTlJFVEFJTkVEIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCBOU19ERVNJR05BVEVEX0lOSVRJQUxJWkVSOwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotCi0vLyBUaGVzZSB3aWxsIHJldHVybiBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlIGlmIHRoZSB2YWx1ZSBmb3IgdGhlIGtleQotLy8gaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBhcyBkZWZpbmVkIGJ5IHZhbGlkYXRpb25GdW5jLiBJZiB0aGUgYWN0dWFsIHZhbHVlIGlzCi0vLyBkZXNpcmVkLCB1c2UgInJhdyIgdmVyc2lvbiBvZiB0aGUgbWV0aG9kLgotCi0tIChCT09MKXZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWtleSB2YWx1ZToobnVsbGFibGUgaW50MzJfdCAqKXZhbHVlOwotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShOU1N0cmluZyAqa2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jazsKLQotLy8gVGhlc2UgbWV0aG9kcyBieXBhc3MgdGhlIHZhbGlkYXRpb25GdW5jIHRvIHByb3ZpZGUgYWNjZXNzIHRvIHZhbHVlcyB0aGF0IHdlcmUgbm90Ci0vLyBrbm93biBhdCB0aGUgdGltZSB0aGUgYmluYXJ5IHdhcyBjb21waWxlZC4KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgcmF3VmFsdWU6KG51bGxhYmxlIGludDMyX3QgKilyYXdWYWx1ZTsKLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoTlNTdHJpbmcgKmtleSwgaW50MzJfdCByYXdWYWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0KLS0gKHZvaWQpYWRkUmF3RW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLQotLy8gSWYgdmFsdWUgaXMgbm90IGEgdmFsaWQgZW51bWVyYXRvciBhcyBkZWZpbmVkIGJ5IHZhbGlkYXRpb25GdW5jLCB0aGVzZQotLy8gbWV0aG9kcyB3aWxsIGFzc2VydCBpbiBkZWJ1ZywgYW5kIHdpbGwgbG9nIGluIHJlbGVhc2UgYW5kIGFzc2lnbiB0aGUgdmFsdWUKLS8vIHRvIHRoZSBkZWZhdWx0IHZhbHVlLiBVc2UgdGhlIHJhd1ZhbHVlIG1ldGhvZHMgYmVsb3cgdG8gYXNzaWduIG5vbiBlbnVtZXJhdG9yCi0vLyB2YWx1ZXMuCi0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleTsKLQotLy8gVGhpcyBtZXRob2QgYnlwYXNzIHRoZSB2YWxpZGF0aW9uRnVuYyB0byBwcm92aWRlIHNldHRpbmcgb2YgdmFsdWVzIHRoYXQgd2VyZSBub3QKLS8vIGtub3duIGF0IHRoZSB0aW1lIHRoZSBiaW5hcnkgd2FzIGNvbXBpbGVkLgotLSAodm9pZClzZXRSYXdWYWx1ZTooaW50MzJfdClyYXdWYWx1ZSBmb3JLZXk6KE5TU3RyaW5nICopa2V5OwotCi0vLyBObyB2YWxpZGF0aW9uIGFwcGxpZXMgdG8gdGhlc2UgbWV0aG9kcy4KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5OwotLSAodm9pZClyZW1vdmVBbGw7Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQtRU5EIERFQ0xBUkVfRElDVElPTkFSSUVTKCkKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECi0KLS8vJVBERE0tREVGSU5FIERFQ0xBUkVfRElDVElPTkFSSUVTKCkKLS8vJURJQ1RJT05BUllfSU5URVJGQUNFU19GT1JfUE9EX0tFWShVSW50MzIsIHVpbnQzMl90KQotLy8lRElDVElPTkFSWV9JTlRFUkZBQ0VTX0ZPUl9QT0RfS0VZKEludDMyLCBpbnQzMl90KQotLy8lRElDVElPTkFSWV9JTlRFUkZBQ0VTX0ZPUl9QT0RfS0VZKFVJbnQ2NCwgdWludDY0X3QpCi0vLyVESUNUSU9OQVJZX0lOVEVSRkFDRVNfRk9SX1BPRF9LRVkoSW50NjQsIGludDY0X3QpCi0vLyVESUNUSU9OQVJZX0lOVEVSRkFDRVNfRk9SX1BPRF9LRVkoQm9vbCwgQk9PTCkKLS8vJURJQ1RJT05BUllfUE9EX0lOVEVSRkFDRVNfRk9SX0tFWShTdHJpbmcsIE5TU3RyaW5nLCAqLCBPQkpFQ1QpCi0vLyVQRERNLURFRklORSBESUNUSU9OQVJZX0lOVEVSRkFDRVNfRk9SX1BPRF9LRVkoS0VZX05BTUUsIEtFWV9UWVBFKQotLy8lRElDVElPTkFSWV9QT0RfSU5URVJGQUNFU19GT1JfS0VZKEtFWV9OQU1FLCBLRVlfVFlQRSwgLCBQT0QpCi0vLyVESUNUSU9OQVJZX1BPRF9LRVlfVE9fT0JKRUNUX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIE9iamVjdCwgT2JqZWN0VHlwZSkKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfUE9EX0lOVEVSRkFDRVNfRk9SX0tFWShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtIRUxQRVIpCi0vLyVESUNUSU9OQVJZX0tFWV9UT19QT0RfSU5URVJGQUNFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS0hFTFBFUiwgVUludDMyLCB1aW50MzJfdCkKLS8vJURJQ1RJT05BUllfS0VZX1RPX1BPRF9JTlRFUkZBQ0UoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLSEVMUEVSLCBJbnQzMiwgaW50MzJfdCkKLS8vJURJQ1RJT05BUllfS0VZX1RPX1BPRF9JTlRFUkZBQ0UoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLSEVMUEVSLCBVSW50NjQsIHVpbnQ2NF90KQotLy8lRElDVElPTkFSWV9LRVlfVE9fUE9EX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtIRUxQRVIsIEludDY0LCBpbnQ2NF90KQotLy8lRElDVElPTkFSWV9LRVlfVE9fUE9EX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtIRUxQRVIsIEJvb2wsIEJPT0wpCi0vLyVESUNUSU9OQVJZX0tFWV9UT19QT0RfSU5URVJGQUNFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS0hFTFBFUiwgRmxvYXQsIGZsb2F0KQotLy8lRElDVElPTkFSWV9LRVlfVE9fUE9EX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtIRUxQRVIsIERvdWJsZSwgZG91YmxlKQotLy8lRElDVElPTkFSWV9LRVlfVE9fRU5VTV9JTlRFUkZBQ0UoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLSEVMUEVSLCBFbnVtLCBpbnQzMl90KQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9LRVlfVE9fUE9EX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtIRUxQRVIsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpCi0vLyVESUNUSU9OQVJZX0NPTU1PTl9JTlRFUkZBQ0UoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLSEVMUEVSLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBQT0QsIHZhbHVlKQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9QT0RfS0VZX1RPX09CSkVDVF9JTlRFUkZBQ0UoS0VZX05BTUUsIEtFWV9UWVBFLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lRElDVElPTkFSWV9DT01NT05fSU5URVJGQUNFKEtFWV9OQU1FLCBLRVlfVFlQRSwgLCBQT0QsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIE9CSkVDVCwgb2JqZWN0KQotLy8lUERETS1ERUZJTkUgVkFMVUVfRk9SX0tFWV9QT0QoS0VZX1RZUEUsIFZBTFVFX1RZUEUpCi0vLyUtIChCT09MKXZhbHVlRm9yS2V5OihLRVlfVFlQRSlrZXkgdmFsdWU6KG51bGxhYmxlIFZBTFVFX1RZUEUgKil2YWx1ZTsKLS8vJVBERE0tREVGSU5FIFZBTFVFX0ZPUl9LRVlfT0JKRUNUKEtFWV9UWVBFLCBWQUxVRV9UWVBFKQotLy8lLSAoVkFMVUVfVFlQRSlvYmplY3RGb3JLZXk6KEtFWV9UWVBFKWtleTsKLS8vJVBERE0tREVGSU5FIFZBTFVFX0ZPUl9LRVlfRW51bShLRVlfVFlQRSwgVkFMVUVfVFlQRSkKLS8vJVZBTFVFX0ZPUl9LRVlfUE9EKEtFWV9UWVBFLCBWQUxVRV9UWVBFKQotLy8lUERETS1ERUZJTkUgQVJSQVlfQVJHX01PRElGSUVSUE9EKCkKLS8vIE5vdGhpbmcKLS8vJVBERE0tREVGSU5FIEFSUkFZX0FSR19NT0RJRklFUkVudW0oKQotLy8gTm90aGluZwotLy8lUERETS1ERUZJTkUgQVJSQVlfQVJHX01PRElGSUVST0JKRUNUKCkKLS8vJUdQQl9VTlNBRkVfVU5SRVRBSU5FRCAjIwotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9DTEFTU19ERUNMUE9EKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9DTEFTU19ERUNMRW51bShLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkKLS8vJUdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfQ0xBU1NfREVDTE9CSkVDVChLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkKLS8vJUdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnk8X19jb3ZhcmlhbnQgVkFMVUVfVFlQRT4KLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfQ09NTU9OX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtIRUxQRVIsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZIRUxQRVIsIFZOQU1FKQotLy8lI3ByYWdtYSBtYXJrIC0gS0VZX05BTUUgLT4gVkFMVUVfTkFNRQotLy8lCi0vLyVAaW50ZXJmYWNlIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgOiBOU09iamVjdCA8TlNDb3B5aW5nPgotLy8lCi0vLyVAcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBjb3VudDsKLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGgjI1ZOQU1FJHUjIzooVkFMVUVfVFlQRSkjI1ZOQU1FCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjIGZvcktleTooS0VZX1RZUEUjI0tpc1AkUyMjS2lzUClrZXk7Ci0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGgjI1ZOQU1FJHUjI3M6KGNvbnN0IFZBTFVFX1RZUEUgQVJSQVlfQVJHX01PRElGSUVSIyNWSEVMUEVSKClbXSkjI1ZOQU1FIyNzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6KGNvbnN0IEtFWV9UWVBFIyNLaXNQJFMjI0tpc1AgQVJSQVlfQVJHX01PRElGSUVSIyNLSEVMUEVSKClbXSlrZXlzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zOwotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGgjI1ZOQU1FJHUjI3M6KGNvbnN0IFZBTFVFX1RZUEUgQVJSQVlfQVJHX01PRElGSUVSIyNWSEVMUEVSKClbXSkjI1ZOQU1FIyNzCi0vLyUgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6KGNvbnN0IEtFWV9UWVBFIyNLaXNQJFMjI0tpc1AgQVJSQVlfQVJHX01PRElGSUVSIyNLSEVMUEVSKClbXSlrZXlzCi0vLyUgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgTlNfREVTSUdOQVRFRF9JTklUSUFMSVpFUjsKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilkaWN0aW9uYXJ5OwotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXM7Ci0vLyUKLS8vJURJQ1RJT05BUllfSU1NVVRBQkxFX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZIRUxQRVIsIFZOQU1FKQotLy8lCi0vLyUtICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeTsKLS8vJQotLy8lRElDVElPTkFSWV9NVVRBQkxFX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZIRUxQRVIsIFZOQU1FKQotLy8lCi0vLyVAZW5kCi0vLyUKLQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9LRVlfVE9fRU5VTV9JTlRFUkZBQ0UoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLSEVMUEVSLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lRElDVElPTkFSWV9LRVlfVE9fRU5VTV9JTlRFUkZBQ0UyKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS0hFTFBFUiwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgRW51bSkKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfS0VZX1RPX0VOVU1fSU5URVJGQUNFMihLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtIRUxQRVIsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZIRUxQRVIpCi0vLyUjcHJhZ21hIG1hcmsgLSBLRVlfTkFNRSAtPiBWQUxVRV9OQU1FCi0vLyUKLS8vJUBpbnRlcmZhY2UgR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSA6IE5TT2JqZWN0IDxOU0NvcHlpbmc+Ci0vLyUKLS8vJUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGNvdW50OwotLy8lQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIEdQQkVudW1WYWxpZGF0aW9uRnVuYyB2YWxpZGF0aW9uRnVuYzsKLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnk7Ci0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KG51bGxhYmxlIEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jOwotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOihWQUxVRV9UWVBFKXJhd1ZhbHVlCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEtFWV9UWVBFIyNLaXNQJFMjI0tpc1Apa2V5OwotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBWQUxVRV9UWVBFIEFSUkFZX0FSR19NT0RJRklFUiMjVkhFTFBFUigpW10pdmFsdWVzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEtFWV9UWVBFIyNLaXNQJFMjI0tpc1AgQVJSQVlfQVJHX01PRElGSUVSIyNLSEVMUEVSKClbXSlrZXlzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihudWxsYWJsZSBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYzsKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczooY29uc3QgVkFMVUVfVFlQRSBBUlJBWV9BUkdfTU9ESUZJRVIjI1ZIRUxQRVIoKVtdKXZhbHVlcwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBLRVlfVFlQRSMjS2lzUCRTIyNLaXNQIEFSUkFZX0FSR19NT0RJRklFUiMjS0hFTFBFUigpW10pa2V5cwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IE5TX0RFU0lHTkFURURfSU5JVElBTElaRVI7Ci0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5ICopZGljdGlvbmFyeTsKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjoobnVsbGFibGUgR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtczsKLS8vJQotLy8lLy8gVGhlc2Ugd2lsbCByZXR1cm4ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSBpZiB0aGUgdmFsdWUgZm9yIHRoZSBrZXkKLS8vJS8vIGlzIG5vdCBhIHZhbGlkIGVudW1lcmF0b3IgYXMgZGVmaW5lZCBieSB2YWxpZGF0aW9uRnVuYy4gSWYgdGhlIGFjdHVhbCB2YWx1ZSBpcwotLy8lLy8gZGVzaXJlZCwgdXNlICJyYXciIHZlcnNpb24gb2YgdGhlIG1ldGhvZC4KLS8vJQotLy8lRElDVElPTkFSWV9JTU1VVEFCTEVfSU5URVJGQUNFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgVkhFTFBFUiwgdmFsdWUpCi0vLyUKLS8vJS8vIFRoZXNlIG1ldGhvZHMgYnlwYXNzIHRoZSB2YWxpZGF0aW9uRnVuYyB0byBwcm92aWRlIGFjY2VzcyB0byB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAotLy8lLy8ga25vd24gYXQgdGhlIHRpbWUgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQuCi0vLyUKLS8vJS0gKEJPT0wpdmFsdWVGb3JLZXk6KEtFWV9UWVBFIyNLaXNQJFMjI0tpc1Apa2V5IHJhd1ZhbHVlOihudWxsYWJsZSBWQUxVRV9UWVBFICopcmF3VmFsdWU7Ci0vLyUKLS8vJS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Ci0vLyUgICAgKHZvaWQgKF4pKEtFWV9UWVBFIEtpc1AjI2tleSwgVkFMVUVfVFlQRSByYXdWYWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2s7Ci0vLyUKLS8vJS0gKHZvaWQpYWRkUmF3RW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5OwotLy8lCi0vLyUvLyBJZiB2YWx1ZSBpcyBub3QgYSB2YWxpZCBlbnVtZXJhdG9yIGFzIGRlZmluZWQgYnkgdmFsaWRhdGlvbkZ1bmMsIHRoZXNlCi0vLyUvLyBtZXRob2RzIHdpbGwgYXNzZXJ0IGluIGRlYnVnLCBhbmQgd2lsbCBsb2cgaW4gcmVsZWFzZSBhbmQgYXNzaWduIHRoZSB2YWx1ZQotLy8lLy8gdG8gdGhlIGRlZmF1bHQgdmFsdWUuIFVzZSB0aGUgcmF3VmFsdWUgbWV0aG9kcyBiZWxvdyB0byBhc3NpZ24gbm9uIGVudW1lcmF0b3IKLS8vJS8vIHZhbHVlcy4KLS8vJQotLy8lRElDVElPTkFSWV9NVVRBQkxFX0lOVEVSRkFDRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZIRUxQRVIsIHZhbHVlKQotLy8lCi0vLyVAZW5kCi0vLyUKLQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9JTU1VVEFCTEVfSU5URVJGQUNFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgVkhFTFBFUiwgVk5BTUUpCi0vLyVWQUxVRV9GT1JfS0VZXyMjVkhFTFBFUihLRVlfVFlQRSMjS2lzUCRTIyNLaXNQLCBWQUxVRV9UWVBFKQotLy8lCi0vLyUtICh2b2lkKWVudW1lcmF0ZUtleXNBbmQjI1ZOQU1FJHUjI3NVc2luZ0Jsb2NrOgotLy8lICAgICh2b2lkICheKShLRVlfVFlQRSBLaXNQIyNrZXksIFZBTFVFX1RZUEUgVk5BTUUsIEJPT0wgKnN0b3ApKWJsb2NrOwotCi0vLyVQRERNLURFRklORSBESUNUSU9OQVJZX01VVEFCTEVfSU5URVJGQUNFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgVkhFTFBFUiwgVk5BTUUpCi0vLyUtICh2b2lkKXNldCMjVk5BTUUkdSMjOihWQUxVRV9UWVBFKSMjVk5BTUUgZm9yS2V5OihLRVlfVFlQRSMjS2lzUCRTIyNLaXNQKWtleTsKLS8vJURJQ1RJT05BUllfRVhUUkFfTVVUQUJMRV9NRVRIT0RTXyMjVkhFTFBFUihLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpCi0vLyUtICh2b2lkKXJlbW92ZSMjVk5BTUUkdSMjRm9yS2V5OihLRVlfVFlQRSMjS2lzUCRTIyNLaXNQKWFLZXk7Ci0vLyUtICh2b2lkKXJlbW92ZUFsbDsKLQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9FWFRSQV9NVVRBQkxFX01FVEhPRFNfUE9EKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkKLS8vIEVtcHR5Ci0vLyVQRERNLURFRklORSBESUNUSU9OQVJZX0VYVFJBX01VVEFCTEVfTUVUSE9EU19PQkpFQ1QoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfRVhUUkFfTVVUQUJMRV9NRVRIT0RTX0VudW0oS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lCi0vLyUvLyBUaGlzIG1ldGhvZCBieXBhc3MgdGhlIHZhbGlkYXRpb25GdW5jIHRvIHByb3ZpZGUgc2V0dGluZyBvZiB2YWx1ZXMgdGhhdCB3ZXJlIG5vdAotLy8lLy8ga25vd24gYXQgdGhlIHRpbWUgdGhlIGJpbmFyeSB3YXMgY29tcGlsZWQuCi0vLyUtICh2b2lkKXNldFJhd1ZhbHVlOihWQUxVRV9UWVBFKXJhd1ZhbHVlIGZvcktleTooS0VZX1RZUEUjI0tpc1AkUyMjS2lzUClrZXk7Ci0vLyUKLS8vJS8vIE5vIHZhbGlkYXRpb24gYXBwbGllcyB0byB0aGVzZSBtZXRob2RzLgotLy8lCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkRpY3Rpb25hcnkubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRGljdGlvbmFyeS5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYmQxNDZlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRGljdGlvbmFyeS5tCisrKyAvZGV2L251bGwKQEAgLTEsMTM1NTUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQkRpY3Rpb25hcnlfUGFja2FnZVByaXZhdGUuaCIKLQotI2ltcG9ydCAiR1BCQ29kZWRJbnB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCQ29kZWRPdXRwdXRTdHJlYW1fUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3JfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQk1lc3NhZ2VfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gTk9URSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEF0IHRoZSBtb21lbnQsIHRoaXMgaXMgYWxsIHVzaW5nIE5TTnVtYmVycyBpbiBOU0RpY3Rpb25hcmllcyB1bmRlcgotLy8gdGhlIGhvb2QsIGJ1dCBpdCBpcyBhbGwgaGlkZGVuIHNvIHdlIGNhbiBjb21lIGJhY2sgYW5kIG9wdGltaXplCi0vLyB3aXRoIGRpcmVjdCBDRkRpY3Rpb25hcnkgdXNhZ2UgbGF0ZXIuICBUaGUgcmVhc29uIHRoYXQgd2Fzbid0Ci0vLyBkb25lIHlldCBpcyBuZWVkaW5nIHRvIHN1cHBvcnQgMzJiaXQgaU9TIGJ1aWxkcy4gIE90aGVyd2lzZQotLy8gaXQgd291bGQgYmUgcHJldHR5IHNpbXBsZSB0byBzdG9yZSBhbGwgdGhpcyBkYXRhIGluIENGRGljdGlvbmFyaWVzCi0vLyBkaXJlY3RseS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBVc2VkIHRvIGluY2x1ZGUgY29kZSBvbmx5IHZpc2libGUgdG8gc3BlY2lmaWMgdmVyc2lvbnMgb2YgdGhlIHN0YXRpYwotLy8gYW5hbHl6ZXIuIFVzZWZ1bCBmb3Igd3JhcHBpbmcgY29kZSB0aGF0IG9ubHkgZXhpc3RzIHRvIHNpbGVuY2UgdGhlIGFuYWx5emVyLgotLy8gRGV0ZXJtaW5lIHRoZSB2YWx1ZXMgeW91IHdhbnQgdG8gdXNlIGZvciBCRUdJTl9BUFBMRV9CVUlMRF9WRVJTSU9OLAotLy8gRU5EX0FQUExFX0JVSUxEX1ZFUlNJT04gdXNpbmc6Ci0vLyAgIHhjcnVuIGNsYW5nIC1kTSAtRSAteCBjIC9kZXYvbnVsbCB8IGdyZXAgX19hcHBsZV9idWlsZF92ZXJzaW9uX18KLS8vIEV4YW1wbGUgdXNhZ2U6Ci0vLyAgI2lmIEdQQl9TVEFUSUNfQU5BTFlaRVJfT05MWSg1NjIxLCA1NjIzKSAuLi4gI2VuZGlmCi0jZGVmaW5lIEdQQl9TVEFUSUNfQU5BTFlaRVJfT05MWShCRUdJTl9BUFBMRV9CVUlMRF9WRVJTSU9OLCBFTkRfQVBQTEVfQlVJTERfVkVSU0lPTikgXAotICAgIChkZWZpbmVkKF9fY2xhbmdfYW5hbHl6ZXJfXykgJiYgXAotICAgICAoX19hcHBsZV9idWlsZF92ZXJzaW9uX18gPj0gQkVHSU5fQVBQTEVfQlVJTERfVkVSU0lPTiAmJiBcCi0gICAgICBfX2FwcGxlX2J1aWxkX3ZlcnNpb25fXyA8PSBFTkRfQVBQTEVfQlVJTERfVkVSU0lPTikpCi0KLWVudW0gewotICBrTWFwS2V5RmllbGROdW1iZXIgPSAxLAotICBrTWFwVmFsdWVGaWVsZE51bWJlciA9IDIsCi19OwotCi1zdGF0aWMgQk9PTCBEaWN0RGVmYXVsdF9Jc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSkgewotICAvLyBBbnl0aGluZyBidXQgdGhlIGJhZCB2YWx1ZSBtYXJrZXIgaXMgYWxsb3dlZC4KLSAgcmV0dXJuICh2YWx1ZSAhPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLX0KLQotLy8lUERETS1ERUZJTkUgU0VSSUFMSVpFX1NVUFBPUlRfMl9UWVBFKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIEdQQkRBVEFUWVBFX05BTUUxLCBHUEJEQVRBVFlQRV9OQU1FMikKLS8vJXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3QjI1ZBTFVFX05BTUUjI0ZpZWxkU2l6ZShWQUxVRV9UWVBFIHZhbHVlLCB1aW50MzJfdCBmaWVsZE51bSwgR1BCRGF0YVR5cGUgZGF0YVR5cGUpIHsKLS8vJSAgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlIyNHUEJEQVRBVFlQRV9OQU1FMSkgewotLy8lICAgIHJldHVybiBHUEJDb21wdXRlIyNHUEJEQVRBVFlQRV9OQU1FMSMjU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotLy8lICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlIyNHUEJEQVRBVFlQRV9OQU1FMikgewotLy8lICAgIHJldHVybiBHUEJDb21wdXRlIyNHUEJEQVRBVFlQRV9OQU1FMiMjU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotLy8lICB9IGVsc2UgewotLy8lICAgIE5TQ0Fzc2VydChOTywgQCJVbmV4cGVjdGVkIHR5cGUgJWQiLCBkYXRhVHlwZSk7Ci0vLyUgICAgcmV0dXJuIDA7Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lc3RhdGljIHZvaWQgV3JpdGVEaWN0IyNWQUxVRV9OQU1FIyNGaWVsZChHUEJDb2RlZE91dHB1dFN0cmVhbSAqc3RyZWFtLCBWQUxVRV9UWVBFIHZhbHVlLCB1aW50MzJfdCBmaWVsZE51bSwgR1BCRGF0YVR5cGUgZGF0YVR5cGUpIHsKLS8vJSAgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlIyNHUEJEQVRBVFlQRV9OQU1FMSkgewotLy8lICAgIFtzdHJlYW0gd3JpdGUjI0dQQkRBVEFUWVBFX05BTUUxIyM6ZmllbGROdW0gdmFsdWU6dmFsdWVdOwotLy8lICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlIyNHUEJEQVRBVFlQRV9OQU1FMikgewotLy8lICAgIFtzdHJlYW0gd3JpdGUjI0dQQkRBVEFUWVBFX05BTUUyIyM6ZmllbGROdW0gdmFsdWU6dmFsdWVdOwotLy8lICB9IGVsc2UgewotLy8lICAgIE5TQ0Fzc2VydChOTywgQCJVbmV4cGVjdGVkIHR5cGUgJWQiLCBkYXRhVHlwZSk7Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lUERETS1ERUZJTkUgU0VSSUFMSVpFX1NVUFBPUlRfM19UWVBFKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIEdQQkRBVEFUWVBFX05BTUUxLCBHUEJEQVRBVFlQRV9OQU1FMiwgR1BCREFUQVRZUEVfTkFNRTMpCi0vLyVzdGF0aWMgc2l6ZV90IENvbXB1dGVEaWN0IyNWQUxVRV9OQU1FIyNGaWVsZFNpemUoVkFMVUVfVFlQRSB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0vLyUgIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZSMjR1BCREFUQVRZUEVfTkFNRTEpIHsKLS8vJSAgICByZXR1cm4gR1BCQ29tcHV0ZSMjR1BCREFUQVRZUEVfTkFNRTEjI1NpemUoZmllbGROdW0sIHZhbHVlKTsKLS8vJSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZSMjR1BCREFUQVRZUEVfTkFNRTIpIHsKLS8vJSAgICByZXR1cm4gR1BCQ29tcHV0ZSMjR1BCREFUQVRZUEVfTkFNRTIjI1NpemUoZmllbGROdW0sIHZhbHVlKTsKLS8vJSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZSMjR1BCREFUQVRZUEVfTkFNRTMpIHsKLS8vJSAgICByZXR1cm4gR1BCQ29tcHV0ZSMjR1BCREFUQVRZUEVfTkFNRTMjI1NpemUoZmllbGROdW0sIHZhbHVlKTsKLS8vJSAgfSBlbHNlIHsKLS8vJSAgICBOU0NBc3NlcnQoTk8sIEAiVW5leHBlY3RlZCB0eXBlICVkIiwgZGF0YVR5cGUpOwotLy8lICAgIHJldHVybiAwOwotLy8lICB9Ci0vLyV9Ci0vLyUKLS8vJXN0YXRpYyB2b2lkIFdyaXRlRGljdCMjVkFMVUVfTkFNRSMjRmllbGQoR1BCQ29kZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSwgVkFMVUVfVFlQRSB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0vLyUgIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZSMjR1BCREFUQVRZUEVfTkFNRTEpIHsKLS8vJSAgICBbc3RyZWFtIHdyaXRlIyNHUEJEQVRBVFlQRV9OQU1FMSMjOmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLS8vJSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZSMjR1BCREFUQVRZUEVfTkFNRTIpIHsKLS8vJSAgICBbc3RyZWFtIHdyaXRlIyNHUEJEQVRBVFlQRV9OQU1FMiMjOmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLS8vJSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZSMjR1BCREFUQVRZUEVfTkFNRTMpIHsKLS8vJSAgICBbc3RyZWFtIHdyaXRlIyNHUEJEQVRBVFlQRV9OQU1FMyMjOmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLS8vJSAgfSBlbHNlIHsKLS8vJSAgICBOU0NBc3NlcnQoTk8sIEAiVW5leHBlY3RlZCB0eXBlICVkIiwgZGF0YVR5cGUpOwotLy8lICB9Ci0vLyV9Ci0vLyUKLS8vJVBERE0tREVGSU5FIFNJTVBMRV9TRVJJQUxJWkVfU1VQUE9SVChWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBWaXNQKQotLy8lc3RhdGljIHNpemVfdCBDb21wdXRlRGljdCMjVkFMVUVfTkFNRSMjRmllbGRTaXplKFZBTFVFX1RZUEUgVmlzUCMjdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotLy8lICBOU0NBc3NlcnQoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGUjI1ZBTFVFX05BTUUsIEAiYmFkIHR5cGU6ICVkIiwgZGF0YVR5cGUpOwotLy8lICAjcHJhZ21hIHVudXNlZChkYXRhVHlwZSkgIC8vIEZvciB3aGVuIGFzc2VydHMgYXJlIG9mZiBpbiByZWxlYXNlLgotLy8lICByZXR1cm4gR1BCQ29tcHV0ZSMjVkFMVUVfTkFNRSMjU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotLy8lfQotLy8lCi0vLyVzdGF0aWMgdm9pZCBXcml0ZURpY3QjI1ZBTFVFX05BTUUjI0ZpZWxkKEdQQkNvZGVkT3V0cHV0U3RyZWFtICpzdHJlYW0sIFZBTFVFX1RZUEUgVmlzUCMjdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotLy8lICBOU0NBc3NlcnQoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGUjI1ZBTFVFX05BTUUsIEAiYmFkIHR5cGU6ICVkIiwgZGF0YVR5cGUpOwotLy8lICAjcHJhZ21hIHVudXNlZChkYXRhVHlwZSkgIC8vIEZvciB3aGVuIGFzc2VydHMgYXJlIG9mZiBpbiByZWxlYXNlLgotLy8lICBbc3RyZWFtIHdyaXRlIyNWQUxVRV9OQU1FIyM6ZmllbGROdW0gdmFsdWU6dmFsdWVdOwotLy8lfQotLy8lCi0vLyVQRERNLURFRklORSBTRVJJQUxJWkVfU1VQUE9SVF9IRUxQRVJTKCkKLS8vJVNFUklBTElaRV9TVVBQT1JUXzNfVFlQRShJbnQzMiwgaW50MzJfdCwgSW50MzIsIFNJbnQzMiwgU0ZpeGVkMzIpCi0vLyVTRVJJQUxJWkVfU1VQUE9SVF8yX1RZUEUoVUludDMyLCB1aW50MzJfdCwgVUludDMyLCBGaXhlZDMyKQotLy8lU0VSSUFMSVpFX1NVUFBPUlRfM19UWVBFKEludDY0LCBpbnQ2NF90LCBJbnQ2NCwgU0ludDY0LCBTRml4ZWQ2NCkKLS8vJVNFUklBTElaRV9TVVBQT1JUXzJfVFlQRShVSW50NjQsIHVpbnQ2NF90LCBVSW50NjQsIEZpeGVkNjQpCi0vLyVTSU1QTEVfU0VSSUFMSVpFX1NVUFBPUlQoQm9vbCwgQk9PTCwgKQotLy8lU0lNUExFX1NFUklBTElaRV9TVVBQT1JUKEVudW0sIGludDMyX3QsICkKLS8vJVNJTVBMRV9TRVJJQUxJWkVfU1VQUE9SVChGbG9hdCwgZmxvYXQsICkKLS8vJVNJTVBMRV9TRVJJQUxJWkVfU1VQUE9SVChEb3VibGUsIGRvdWJsZSwgKQotLy8lU0lNUExFX1NFUklBTElaRV9TVVBQT1JUKFN0cmluZywgTlNTdHJpbmcsICopCi0vLyVTRVJJQUxJWkVfU1VQUE9SVF8zX1RZUEUoT2JqZWN0LCBpZCwgTWVzc2FnZSwgU3RyaW5nLCBCeXRlcykKLS8vJVBERE0tRVhQQU5EIFNFUklBTElaRV9TVVBQT1JUX0hFTFBFUlMoKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShpbnQzMl90IHZhbHVlLCB1aW50MzJfdCBmaWVsZE51bSwgR1BCRGF0YVR5cGUgZGF0YVR5cGUpIHsKLSAgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlSW50MzIpIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZUludDMyU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlU0ludDMyKSB7Ci0gICAgcmV0dXJuIEdQQkNvbXB1dGVTSW50MzJTaXplKGZpZWxkTnVtLCB2YWx1ZSk7Ci0gIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTRml4ZWQzMikgewotICAgIHJldHVybiBHUEJDb21wdXRlU0ZpeGVkMzJTaXplKGZpZWxkTnVtLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgTlNDQXNzZXJ0KE5PLCBAIlVuZXhwZWN0ZWQgdHlwZSAlZCIsIGRhdGFUeXBlKTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBXcml0ZURpY3RJbnQzMkZpZWxkKEdQQkNvZGVkT3V0cHV0U3RyZWFtICpzdHJlYW0sIGludDMyX3QgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVJbnQzMikgewotICAgIFtzdHJlYW0gd3JpdGVJbnQzMjpmaWVsZE51bSB2YWx1ZTp2YWx1ZV07Ci0gIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTSW50MzIpIHsKLSAgICBbc3RyZWFtIHdyaXRlU0ludDMyOmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVNGaXhlZDMyKSB7Ci0gICAgW3N0cmVhbSB3cml0ZVNGaXhlZDMyOmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLSAgfSBlbHNlIHsKLSAgICBOU0NBc3NlcnQoTk8sIEAiVW5leHBlY3RlZCB0eXBlICVkIiwgZGF0YVR5cGUpOwotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUodWludDMyX3QgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVVSW50MzIpIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZVVJbnQzMlNpemUoZmllbGROdW0sIHZhbHVlKTsKLSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUZpeGVkMzIpIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZUZpeGVkMzJTaXplKGZpZWxkTnVtLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgTlNDQXNzZXJ0KE5PLCBAIlVuZXhwZWN0ZWQgdHlwZSAlZCIsIGRhdGFUeXBlKTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBXcml0ZURpY3RVSW50MzJGaWVsZChHUEJDb2RlZE91dHB1dFN0cmVhbSAqc3RyZWFtLCB1aW50MzJfdCB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVVJbnQzMikgewotICAgIFtzdHJlYW0gd3JpdGVVSW50MzI6ZmllbGROdW0gdmFsdWU6dmFsdWVdOwotICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlRml4ZWQzMikgewotICAgIFtzdHJlYW0gd3JpdGVGaXhlZDMyOmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLSAgfSBlbHNlIHsKLSAgICBOU0NBc3NlcnQoTk8sIEAiVW5leHBlY3RlZCB0eXBlICVkIiwgZGF0YVR5cGUpOwotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShpbnQ2NF90IHZhbHVlLCB1aW50MzJfdCBmaWVsZE51bSwgR1BCRGF0YVR5cGUgZGF0YVR5cGUpIHsKLSAgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlSW50NjQpIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZUludDY0U2l6ZShmaWVsZE51bSwgdmFsdWUpOwotICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlU0ludDY0KSB7Ci0gICAgcmV0dXJuIEdQQkNvbXB1dGVTSW50NjRTaXplKGZpZWxkTnVtLCB2YWx1ZSk7Ci0gIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTRml4ZWQ2NCkgewotICAgIHJldHVybiBHUEJDb21wdXRlU0ZpeGVkNjRTaXplKGZpZWxkTnVtLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgTlNDQXNzZXJ0KE5PLCBAIlVuZXhwZWN0ZWQgdHlwZSAlZCIsIGRhdGFUeXBlKTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBXcml0ZURpY3RJbnQ2NEZpZWxkKEdQQkNvZGVkT3V0cHV0U3RyZWFtICpzdHJlYW0sIGludDY0X3QgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVJbnQ2NCkgewotICAgIFtzdHJlYW0gd3JpdGVJbnQ2NDpmaWVsZE51bSB2YWx1ZTp2YWx1ZV07Ci0gIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTSW50NjQpIHsKLSAgICBbc3RyZWFtIHdyaXRlU0ludDY0OmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVNGaXhlZDY0KSB7Ci0gICAgW3N0cmVhbSB3cml0ZVNGaXhlZDY0OmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLSAgfSBlbHNlIHsKLSAgICBOU0NBc3NlcnQoTk8sIEAiVW5leHBlY3RlZCB0eXBlICVkIiwgZGF0YVR5cGUpOwotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUodWludDY0X3QgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVVSW50NjQpIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZVVJbnQ2NFNpemUoZmllbGROdW0sIHZhbHVlKTsKLSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUZpeGVkNjQpIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZUZpeGVkNjRTaXplKGZpZWxkTnVtLCB2YWx1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgTlNDQXNzZXJ0KE5PLCBAIlVuZXhwZWN0ZWQgdHlwZSAlZCIsIGRhdGFUeXBlKTsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBXcml0ZURpY3RVSW50NjRGaWVsZChHUEJDb2RlZE91dHB1dFN0cmVhbSAqc3RyZWFtLCB1aW50NjRfdCB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVVJbnQ2NCkgewotICAgIFtzdHJlYW0gd3JpdGVVSW50NjQ6ZmllbGROdW0gdmFsdWU6dmFsdWVdOwotICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlRml4ZWQ2NCkgewotICAgIFtzdHJlYW0gd3JpdGVGaXhlZDY0OmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLSAgfSBlbHNlIHsKLSAgICBOU0NBc3NlcnQoTk8sIEAiVW5leHBlY3RlZCB0eXBlICVkIiwgZGF0YVR5cGUpOwotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKEJPT0wgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBOU0NBc3NlcnQoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVCb29sLCBAImJhZCB0eXBlOiAlZCIsIGRhdGFUeXBlKTsKLSAgI3ByYWdtYSB1bnVzZWQoZGF0YVR5cGUpICAvLyBGb3Igd2hlbiBhc3NlcnRzIGFyZSBvZmYgaW4gcmVsZWFzZS4KLSAgcmV0dXJuIEdQQkNvbXB1dGVCb29sU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBXcml0ZURpY3RCb29sRmllbGQoR1BCQ29kZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSwgQk9PTCB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIE5TQ0Fzc2VydChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUJvb2wsIEAiYmFkIHR5cGU6ICVkIiwgZGF0YVR5cGUpOwotICAjcHJhZ21hIHVudXNlZChkYXRhVHlwZSkgIC8vIEZvciB3aGVuIGFzc2VydHMgYXJlIG9mZiBpbiByZWxlYXNlLgotICBbc3RyZWFtIHdyaXRlQm9vbDpmaWVsZE51bSB2YWx1ZTp2YWx1ZV07Ci19Ci0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RFbnVtRmllbGRTaXplKGludDMyX3QgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBOU0NBc3NlcnQoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVFbnVtLCBAImJhZCB0eXBlOiAlZCIsIGRhdGFUeXBlKTsKLSAgI3ByYWdtYSB1bnVzZWQoZGF0YVR5cGUpICAvLyBGb3Igd2hlbiBhc3NlcnRzIGFyZSBvZmYgaW4gcmVsZWFzZS4KLSAgcmV0dXJuIEdQQkNvbXB1dGVFbnVtU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotfQotCi1zdGF0aWMgdm9pZCBXcml0ZURpY3RFbnVtRmllbGQoR1BCQ29kZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSwgaW50MzJfdCB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIE5TQ0Fzc2VydChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUVudW0sIEAiYmFkIHR5cGU6ICVkIiwgZGF0YVR5cGUpOwotICAjcHJhZ21hIHVudXNlZChkYXRhVHlwZSkgIC8vIEZvciB3aGVuIGFzc2VydHMgYXJlIG9mZiBpbiByZWxlYXNlLgotICBbc3RyZWFtIHdyaXRlRW51bTpmaWVsZE51bSB2YWx1ZTp2YWx1ZV07Ci19Ci0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RGbG9hdEZpZWxkU2l6ZShmbG9hdCB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIE5TQ0Fzc2VydChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUZsb2F0LCBAImJhZCB0eXBlOiAlZCIsIGRhdGFUeXBlKTsKLSAgI3ByYWdtYSB1bnVzZWQoZGF0YVR5cGUpICAvLyBGb3Igd2hlbiBhc3NlcnRzIGFyZSBvZmYgaW4gcmVsZWFzZS4KLSAgcmV0dXJuIEdQQkNvbXB1dGVGbG9hdFNpemUoZmllbGROdW0sIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgV3JpdGVEaWN0RmxvYXRGaWVsZChHUEJDb2RlZE91dHB1dFN0cmVhbSAqc3RyZWFtLCBmbG9hdCB2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIE5TQ0Fzc2VydChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUZsb2F0LCBAImJhZCB0eXBlOiAlZCIsIGRhdGFUeXBlKTsKLSAgI3ByYWdtYSB1bnVzZWQoZGF0YVR5cGUpICAvLyBGb3Igd2hlbiBhc3NlcnRzIGFyZSBvZmYgaW4gcmVsZWFzZS4KLSAgW3N0cmVhbSB3cml0ZUZsb2F0OmZpZWxkTnVtIHZhbHVlOnZhbHVlXTsKLX0KLQotc3RhdGljIHNpemVfdCBDb21wdXRlRGljdERvdWJsZUZpZWxkU2l6ZShkb3VibGUgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBOU0NBc3NlcnQoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVEb3VibGUsIEAiYmFkIHR5cGU6ICVkIiwgZGF0YVR5cGUpOwotICAjcHJhZ21hIHVudXNlZChkYXRhVHlwZSkgIC8vIEZvciB3aGVuIGFzc2VydHMgYXJlIG9mZiBpbiByZWxlYXNlLgotICByZXR1cm4gR1BCQ29tcHV0ZURvdWJsZVNpemUoZmllbGROdW0sIHZhbHVlKTsKLX0KLQotc3RhdGljIHZvaWQgV3JpdGVEaWN0RG91YmxlRmllbGQoR1BCQ29kZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSwgZG91YmxlIHZhbHVlLCB1aW50MzJfdCBmaWVsZE51bSwgR1BCRGF0YVR5cGUgZGF0YVR5cGUpIHsKLSAgTlNDQXNzZXJ0KGRhdGFUeXBlID09IEdQQkRhdGFUeXBlRG91YmxlLCBAImJhZCB0eXBlOiAlZCIsIGRhdGFUeXBlKTsKLSAgI3ByYWdtYSB1bnVzZWQoZGF0YVR5cGUpICAvLyBGb3Igd2hlbiBhc3NlcnRzIGFyZSBvZmYgaW4gcmVsZWFzZS4KLSAgW3N0cmVhbSB3cml0ZURvdWJsZTpmaWVsZE51bSB2YWx1ZTp2YWx1ZV07Ci19Ci0KLXN0YXRpYyBzaXplX3QgQ29tcHV0ZURpY3RTdHJpbmdGaWVsZFNpemUoTlNTdHJpbmcgKnZhbHVlLCB1aW50MzJfdCBmaWVsZE51bSwgR1BCRGF0YVR5cGUgZGF0YVR5cGUpIHsKLSAgTlNDQXNzZXJ0KGRhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nLCBAImJhZCB0eXBlOiAlZCIsIGRhdGFUeXBlKTsKLSAgI3ByYWdtYSB1bnVzZWQoZGF0YVR5cGUpICAvLyBGb3Igd2hlbiBhc3NlcnRzIGFyZSBvZmYgaW4gcmVsZWFzZS4KLSAgcmV0dXJuIEdQQkNvbXB1dGVTdHJpbmdTaXplKGZpZWxkTnVtLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyB2b2lkIFdyaXRlRGljdFN0cmluZ0ZpZWxkKEdQQkNvZGVkT3V0cHV0U3RyZWFtICpzdHJlYW0sIE5TU3RyaW5nICp2YWx1ZSwgdWludDMyX3QgZmllbGROdW0sIEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIE5TQ0Fzc2VydChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZywgQCJiYWQgdHlwZTogJWQiLCBkYXRhVHlwZSk7Ci0gICNwcmFnbWEgdW51c2VkKGRhdGFUeXBlKSAgLy8gRm9yIHdoZW4gYXNzZXJ0cyBhcmUgb2ZmIGluIHJlbGVhc2UuCi0gIFtzdHJlYW0gd3JpdGVTdHJpbmc6ZmllbGROdW0gdmFsdWU6dmFsdWVdOwotfQotCi1zdGF0aWMgc2l6ZV90IENvbXB1dGVEaWN0T2JqZWN0RmllbGRTaXplKGlkIHZhbHVlLCB1aW50MzJfdCBmaWVsZE51bSwgR1BCRGF0YVR5cGUgZGF0YVR5cGUpIHsKLSAgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlTWVzc2FnZSkgewotICAgIHJldHVybiBHUEJDb21wdXRlTWVzc2FnZVNpemUoZmllbGROdW0sIHZhbHVlKTsKLSAgfSBlbHNlIGlmIChkYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgewotICAgIHJldHVybiBHUEJDb21wdXRlU3RyaW5nU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlQnl0ZXMpIHsKLSAgICByZXR1cm4gR1BCQ29tcHV0ZUJ5dGVzU2l6ZShmaWVsZE51bSwgdmFsdWUpOwotICB9IGVsc2UgewotICAgIE5TQ0Fzc2VydChOTywgQCJVbmV4cGVjdGVkIHR5cGUgJWQiLCBkYXRhVHlwZSk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgV3JpdGVEaWN0T2JqZWN0RmllbGQoR1BCQ29kZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSwgaWQgdmFsdWUsIHVpbnQzMl90IGZpZWxkTnVtLCBHUEJEYXRhVHlwZSBkYXRhVHlwZSkgewotICBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVNZXNzYWdlKSB7Ci0gICAgW3N0cmVhbSB3cml0ZU1lc3NhZ2U6ZmllbGROdW0gdmFsdWU6dmFsdWVdOwotICB9IGVsc2UgaWYgKGRhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nKSB7Ci0gICAgW3N0cmVhbSB3cml0ZVN0cmluZzpmaWVsZE51bSB2YWx1ZTp2YWx1ZV07Ci0gIH0gZWxzZSBpZiAoZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVCeXRlcykgewotICAgIFtzdHJlYW0gd3JpdGVCeXRlczpmaWVsZE51bSB2YWx1ZTp2YWx1ZV07Ci0gIH0gZWxzZSB7Ci0gICAgTlNDQXNzZXJ0KE5PLCBAIlVuZXhwZWN0ZWQgdHlwZSAlZCIsIGRhdGFUeXBlKTsKLSAgfQotfQotCi0vLyVQRERNLUVYUEFORC1FTkQgU0VSSUFMSVpFX1NVUFBPUlRfSEVMUEVSUygpCi0KLXNpemVfdCBHUEJEaWN0aW9uYXJ5Q29tcHV0ZVNpemVJbnRlcm5hbEhlbHBlcihOU0RpY3Rpb25hcnkgKmRpY3QsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgR1BCRGF0YVR5cGUgbWFwVmFsdWVUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICprZXksIGlkIG9iaiwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBHUEJDb21wdXRlU3RyaW5nU2l6ZShrTWFwS2V5RmllbGROdW1iZXIsIGtleSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdE9iamVjdEZpZWxkU2l6ZShvYmosIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBtYXBWYWx1ZVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogZGljdC5jb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBHUEJEaWN0aW9uYXJ5V3JpdGVUb1N0cmVhbUludGVybmFsSGVscGVyKEdQQkNvZGVkT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNEaWN0aW9uYXJ5ICpkaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgTlNDQXNzZXJ0KGZpZWxkLm1hcEtleURhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nLCBAIlVuZXhwZWN0ZWQga2V5IHR5cGUiKTsKLSAgR1BCRGF0YVR5cGUgbWFwVmFsdWVUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICprZXksIGlkIG9iaiwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gR1BCQ29tcHV0ZVN0cmluZ1NpemUoa01hcEtleUZpZWxkTnVtYmVyLCBrZXkpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RPYmplY3RGaWVsZFNpemUob2JqLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgbWFwVmFsdWVUeXBlKTsKLQotICAgIC8vIFdyaXRlIHRoZSBzaXplIGFuZCBmaWVsZHMuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZVN0cmluZzprTWFwS2V5RmllbGROdW1iZXIgdmFsdWU6a2V5XTsKLSAgICBXcml0ZURpY3RPYmplY3RGaWVsZChvdXRwdXRTdHJlYW0sIG9iaiwga01hcFZhbHVlRmllbGROdW1iZXIsIG1hcFZhbHVlVHlwZSk7Ci0gIH1dOwotfQotCi1CT09MIEdQQkRpY3Rpb25hcnlJc0luaXRpYWxpemVkSW50ZXJuYWxIZWxwZXIoTlNEaWN0aW9uYXJ5ICpkaWN0LCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIE5TQ0Fzc2VydChmaWVsZC5tYXBLZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZywgQCJVbmV4cGVjdGVkIGtleSB0eXBlIik7Ci0gIE5TQ0Fzc2VydChHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKSA9PSBHUEJEYXRhVHlwZU1lc3NhZ2UsIEAiVW5leHBlY3RlZCB2YWx1ZSB0eXBlIik7Ci0gICNwcmFnbWEgdW51c2VkKGZpZWxkKSAgLy8gRm9yIHdoZW4gYXNzZXJ0cyBhcmUgb2ZmIGluIHJlbGVhc2UuCi0gIGZvciAoR1BCTWVzc2FnZSAqbXNnIGluIFtkaWN0IG9iamVjdEVudW1lcmF0b3JdKSB7Ci0gICAgaWYgKCFtc2cuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHJldHVybiBOTzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFlFUzsKLX0KLQotLy8gTm90ZTogaWYgdGhlIHR5cGUgaXMgYW4gb2JqZWN0LCBpdCB0aGUgcmV0YWluIHBhc3MgYmFjayB0byB0aGUgY2FsbGVyLgotc3RhdGljIHZvaWQgUmVhZFZhbHVlKEdQQkNvZGVkSW5wdXRTdHJlYW0gKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICBHUEJHZW5lcmljVmFsdWUgKnZhbHVlVG9GaWxsLAotICAgICAgICAgICAgICAgICAgICAgIEdQQkRhdGFUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKnJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUJvb2w6Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVCb29sID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRCb29sKCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICAgIHZhbHVlVG9GaWxsLT52YWx1ZVVJbnQzMiA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRml4ZWQzMigmc3RyZWFtLT5zdGF0ZV8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDMyOgotICAgICAgdmFsdWVUb0ZpbGwtPnZhbHVlSW50MzIgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNGaXhlZDMyKCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRmxvYXQ6Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVGbG9hdCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRmxvYXQoJnN0cmVhbS0+c3RhdGVfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDY0OgotICAgICAgdmFsdWVUb0ZpbGwtPnZhbHVlVUludDY0ID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRGaXhlZDY0KCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVJbnQ2NCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ZpeGVkNjQoJnN0cmVhbS0+c3RhdGVfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVEb3VibGUgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZERvdWJsZSgmc3RyZWFtLT5zdGF0ZV8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUludDMyOgotICAgICAgdmFsdWVUb0ZpbGwtPnZhbHVlSW50MzIgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEludDMyKCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlSW50NjQ6Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVJbnQ2NCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkSW50MzIoJnN0cmVhbS0+c3RhdGVfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVJbnQzMiA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ludDMyKCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDY0OgotICAgICAgdmFsdWVUb0ZpbGwtPnZhbHVlSW50NjQgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNJbnQ2NCgmc3RyZWFtLT5zdGF0ZV8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQzMjoKLSAgICAgIHZhbHVlVG9GaWxsLT52YWx1ZVVJbnQzMiA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkVUludDMyKCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlVUludDY0OgotICAgICAgdmFsdWVUb0ZpbGwtPnZhbHVlVUludDY0ID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRVSW50NjQoJnN0cmVhbS0+c3RhdGVfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICAgIFt2YWx1ZVRvRmlsbC0+dmFsdWVEYXRhIHJlbGVhc2VdOwotICAgICAgdmFsdWVUb0ZpbGwtPnZhbHVlRGF0YSA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWRCeXRlcygmc3RyZWFtLT5zdGF0ZV8pOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVN0cmluZzoKLSAgICAgIFt2YWx1ZVRvRmlsbC0+dmFsdWVTdHJpbmcgcmVsZWFzZV07Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVTdHJpbmcgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFJldGFpbmVkU3RyaW5nKCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZTogewotICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9IFtbZmllbGQubXNnQ2xhc3MgYWxsb2NdIGluaXRdOwotICAgICAgW3N0cmVhbSByZWFkTWVzc2FnZTptZXNzYWdlIGV4dGVuc2lvblJlZ2lzdHJ5OnJlZ2lzdHJ5XTsKLSAgICAgIFt2YWx1ZVRvRmlsbC0+dmFsdWVNZXNzYWdlIHJlbGVhc2VdOwotICAgICAgdmFsdWVUb0ZpbGwtPnZhbHVlTWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgTlNDQXNzZXJ0KE5PLCBAIkNhbid0IGhhcHBlbiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUVudW06Ci0gICAgICB2YWx1ZVRvRmlsbC0+dmFsdWVFbnVtID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRFbnVtKCZzdHJlYW0tPnN0YXRlXyk7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIEdQQkRpY3Rpb25hcnlSZWFkRW50cnkoaWQgbWFwRGljdGlvbmFyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJDb2RlZElucHV0U3RyZWFtICpzdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKnJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCTWVzc2FnZSAqcGFyZW50TWVzc2FnZSkgewotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0KLSAgR1BCR2VuZXJpY1ZhbHVlIGtleTsKLSAgR1BCR2VuZXJpY1ZhbHVlIHZhbHVlOwotICAvLyBaZXJvIHRoZW0gKGJ1dCBwaWNrIHVwIGFueSBlbnVtIGRlZmF1bHQgZm9yIHByb3RvMikuCi0gIGtleS52YWx1ZVN0cmluZyA9IHZhbHVlLnZhbHVlU3RyaW5nID0gbmlsOwotICBpZiAodmFsdWVEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUVudW0pIHsKLSAgICB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUgPSAmc3RyZWFtLT5zdGF0ZV87Ci0gIHVpbnQzMl90IGtleVRhZyA9Ci0gICAgICBHUEJXaXJlRm9ybWF0TWFrZVRhZyhrTWFwS2V5RmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXRGb3JUeXBlKGtleURhdGFUeXBlLCBOTykpOwotICB1aW50MzJfdCB2YWx1ZVRhZyA9Ci0gICAgICBHUEJXaXJlRm9ybWF0TWFrZVRhZyhrTWFwVmFsdWVGaWVsZE51bWJlciwgR1BCV2lyZUZvcm1hdEZvclR5cGUodmFsdWVEYXRhVHlwZSwgTk8pKTsKLQotICBCT09MIGhpdEVycm9yID0gTk87Ci0gIHdoaWxlIChZRVMpIHsKLSAgICB1aW50MzJfdCB0YWcgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFRhZyhzdGF0ZSk7Ci0gICAgaWYgKHRhZyA9PSBrZXlUYWcpIHsKLSAgICAgIFJlYWRWYWx1ZShzdHJlYW0sICZrZXksIGtleURhdGFUeXBlLCByZWdpc3RyeSwgZmllbGQpOwotICAgIH0gZWxzZSBpZiAodGFnID09IHZhbHVlVGFnKSB7Ci0gICAgICBSZWFkVmFsdWUoc3RyZWFtLCAmdmFsdWUsIHZhbHVlRGF0YVR5cGUsIHJlZ2lzdHJ5LCBmaWVsZCk7Ci0gICAgfSBlbHNlIGlmICh0YWcgPT0gMCkgewotICAgICAgLy8gemVybyBzaWduYWxzIEVPRiAvIGxpbWl0IHJlYWNoZWQKLSAgICAgIGJyZWFrOwotICAgIH0gZWxzZSB7ICAvLyBVbmtub3duCi0gICAgICBpZiAoIVtzdHJlYW0gc2tpcEZpZWxkOnRhZ10pewotICAgICAgICBoaXRFcnJvciA9IFlFUzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFoaXRFcnJvcikgewotICAgIC8vIEhhbmRsZSB0aGUgc3BlY2lhbCBkZWZhdWx0cyBhbmQvb3IgbWlzc2luZyBrZXkvdmFsdWUuCi0gICAgaWYgKChrZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgJiYgKGtleS52YWx1ZVN0cmluZyA9PSBuaWwpKSB7Ci0gICAgICBrZXkudmFsdWVTdHJpbmcgPSBbQCIiIHJldGFpbl07Ci0gICAgfQotICAgIGlmIChHUEJEYXRhVHlwZUlzT2JqZWN0KHZhbHVlRGF0YVR5cGUpICYmIHZhbHVlLnZhbHVlU3RyaW5nID09IG5pbCkgewotICAgICAgc3dpdGNoICh2YWx1ZURhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6Ci0gICAgICAgICAgdmFsdWUudmFsdWVTdHJpbmcgPSBbQCIiIHJldGFpbl07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICAgICAgICB2YWx1ZS52YWx1ZURhdGEgPSBbR1BCRW1wdHlOU0RhdGEoKSByZXRhaW5dOwotICAgICAgICAgIGJyZWFrOwotI2lmIGRlZmluZWQoX19jbGFuZ19hbmFseXplcl9fKQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlR3JvdXA6Ci0gICAgICAgICAgLy8gTWFwcyBjYW4ndCByZWFsbHkgaGF2ZSBHcm91cHMgYXMgdGhlIHZhbHVlIHR5cGUsIGJ1dCB0aGlzIGNhc2UgaXMgbmVlZGVkCi0gICAgICAgICAgLy8gc28gdGhlIGFuYWx5emVyIHdvbid0IHJlcG9ydCB0aGUgcG9zaWJpbGl0eSBvZiBzZW5kIG5pbCBpbiBmb3IgdGhlIHZhbHVlCi0gICAgICAgICAgLy8gaW4gdGhlIE5TTXV0YWJsZURpY3Rpb25hcnkgY2FzZSBiZWxvdy4KLSNlbmRpZgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZTogewotICAgICAgICAgIHZhbHVlLnZhbHVlTWVzc2FnZSA9IFtbZmllbGQubXNnQ2xhc3MgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLy8gTm90aGluZwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICgoa2V5RGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTdHJpbmcpICYmIEdQQkRhdGFUeXBlSXNPYmplY3QodmFsdWVEYXRhVHlwZSkpIHsKLSNpZiBHUEJfU1RBVElDX0FOQUxZWkVSX09OTFkoNjAyMDA1MywgNzAwMDE4MSkKLSAgICAgLy8gTGltaXRlZCB0byBYY29kZSA2LjQgLSA3LjIsIGFyZSBrbm93biB0byBmYWlsIGhlcmUuIFRoZSB1cHBlciBlbmQgY2FuCi0gICAgIC8vIGJlIHJhaXNlZCBhcyBuZWVkZWQgZm9yIG5ldyBYY29kZXMuCi0gICAgIC8vCi0gICAgIC8vIFRoaXMgaXMgb25seSBuZWVkZWQgb24gYSAic2hhbGxvdyIgYW5hbHl6ZTsgb24gYSAiZGVlcCIgYW5hbHl6ZSwgdGhlCi0gICAgIC8vIGV4aXN0aW5nIGNvZGUgcGF0aCBnZXRzIHRoaXMgY29ycmVjdC4gSW4gc2hhbGxvdywgdGhlIGFuYWx5emVyIGRlY2lkZXMKLSAgICAgLy8gR1BCRGF0YVR5cGVJc09iamVjdCh2YWx1ZURhdGFUeXBlKSBpcyBib3RoIGZhbHNlIGFuZCB0cnVlIG9uIGEgc2luZ2xlCi0gICAgIC8vIHBhdGggdGhyb3VnaCB0aGlzIGZ1bmN0aW9uLCBhbGxvd2luZyBuaWwgdG8gYmUgdXNlZCBmb3IgdGhlCi0gICAgIC8vIHNldE9iamVjdDpmb3JLZXk6LgotICAgICBpZiAodmFsdWUudmFsdWVTdHJpbmcgPT0gbmlsKSB7Ci0gICAgICAgdmFsdWUudmFsdWVTdHJpbmcgPSBbQCIiIHJldGFpbl07Ci0gICAgIH0KLSNlbmRpZgotICAgICAgLy8gbWFwRGljdGlvbmFyeSBpcyBhbiBOU011dGFibGVEaWN0aW9uYXJ5Ci0gICAgICBbKE5TTXV0YWJsZURpY3Rpb25hcnkgKiltYXBEaWN0aW9uYXJ5IHNldE9iamVjdDp2YWx1ZS52YWx1ZVN0cmluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6a2V5LnZhbHVlU3RyaW5nXTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHZhbHVlRGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVFbnVtKSB7Ci0gICAgICAgIGlmIChHUEJIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoW3BhcmVudE1lc3NhZ2UgZGVzY3JpcHRvcl0uZmlsZS5zeW50YXgpIHx8Ci0gICAgICAgICAgICBbZmllbGQgaXNWYWxpZEVudW1WYWx1ZTp2YWx1ZS52YWx1ZUVudW1dKSB7Ci0gICAgICAgICAgW21hcERpY3Rpb25hcnkgc2V0R1BCR2VuZXJpY1ZhbHVlOiZ2YWx1ZSBmb3JHUEJHZW5lcmljVmFsdWVLZXk6JmtleV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTlNEYXRhICpkYXRhID0gW21hcERpY3Rpb25hcnkgc2VyaWFsaXplZERhdGFGb3JVbmtub3duVmFsdWU6dmFsdWUudmFsdWVFbnVtCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleURhdGFUeXBlOmtleURhdGFUeXBlXTsKLSAgICAgICAgICBbcGFyZW50TWVzc2FnZSBhZGRVbmtub3duTWFwRW50cnk6R1BCRmllbGROdW1iZXIoZmllbGQpIHZhbHVlOmRhdGFdOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbbWFwRGljdGlvbmFyeSBzZXRHUEJHZW5lcmljVmFsdWU6JnZhbHVlIGZvckdQQkdlbmVyaWNWYWx1ZUtleToma2V5XTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoR1BCRGF0YVR5cGVJc09iamVjdChrZXlEYXRhVHlwZSkpIHsKLSAgICBba2V5LnZhbHVlU3RyaW5nIHJlbGVhc2VdOwotICB9Ci0gIGlmIChHUEJEYXRhVHlwZUlzT2JqZWN0KHZhbHVlRGF0YVR5cGUpKSB7Ci0gICAgW3ZhbHVlLnZhbHVlU3RyaW5nIHJlbGVhc2VdOwotICB9Ci19Ci0KLS8vCi0vLyBNYWNyb3MgZm9yIHRoZSBjb21tb24gYmFzaWMgY2FzZXMuCi0vLwotCi0vLyVQRERNLURFRklORSBESUNUSU9OQVJZX0lNUExfRk9SX1BPRF9LRVkoS0VZX05BTUUsIEtFWV9UWVBFKQotLy8lRElDVElPTkFSWV9QT0RfSU1QTF9GT1JfS0VZKEtFWV9OQU1FLCBLRVlfVFlQRSwgLCBQT0QpCi0vLyVESUNUSU9OQVJZX1BPRF9LRVlfVE9fT0JKRUNUX0lNUEwoS0VZX05BTUUsIEtFWV9UWVBFLCBPYmplY3QsIGlkKQotCi0vLyVQRERNLURFRklORSBESUNUSU9OQVJZX1BPRF9JTVBMX0ZPUl9LRVkoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLSEVMUEVSKQotLy8lRElDVElPTkFSWV9LRVlfVE9fUE9EX0lNUEwoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBVSW50MzIsIHVpbnQzMl90LCBLSEVMUEVSKQotLy8lRElDVElPTkFSWV9LRVlfVE9fUE9EX0lNUEwoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBJbnQzMiwgaW50MzJfdCwgS0hFTFBFUikKLS8vJURJQ1RJT05BUllfS0VZX1RPX1BPRF9JTVBMKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVUludDY0LCB1aW50NjRfdCwgS0hFTFBFUikKLS8vJURJQ1RJT05BUllfS0VZX1RPX1BPRF9JTVBMKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgSW50NjQsIGludDY0X3QsIEtIRUxQRVIpCi0vLyVESUNUSU9OQVJZX0tFWV9UT19QT0RfSU1QTChLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEJvb2wsIEJPT0wsIEtIRUxQRVIpCi0vLyVESUNUSU9OQVJZX0tFWV9UT19QT0RfSU1QTChLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEZsb2F0LCBmbG9hdCwgS0hFTFBFUikKLS8vJURJQ1RJT05BUllfS0VZX1RPX1BPRF9JTVBMKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgRG91YmxlLCBkb3VibGUsIEtIRUxQRVIpCi0vLyVESUNUSU9OQVJZX0tFWV9UT19FTlVNX0lNUEwoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBFbnVtLCBpbnQzMl90LCBLSEVMUEVSKQotCi0vLyVQRERNLURFRklORSBESUNUSU9OQVJZX0tFWV9UT19QT0RfSU1QTChLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIEtIRUxQRVIpCi0vLyVESUNUSU9OQVJZX0NPTU1PTl9JTVBMKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgS0hFTFBFUiwgUE9ELCB2YWx1ZSkKLQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9QT0RfS0VZX1RPX09CSkVDVF9JTVBMKEtFWV9OQU1FLCBLRVlfVFlQRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkKLS8vJURJQ1RJT05BUllfQ09NTU9OX0lNUEwoS0VZX05BTUUsIEtFWV9UWVBFLCAsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFBPRCwgT0JKRUNULCBvYmplY3QpCi0KLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfQ09NTU9OX0lNUEwoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBLSEVMUEVSLCBWSEVMUEVSLCBWTkFNRSkKLS8vJSNwcmFnbWEgbWFyayAtIEtFWV9OQU1FIC0+IFZBTFVFX05BTUUKLS8vJQotLy8lQGltcGxlbWVudGF0aW9uIEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgewotLy8lIEBwYWNrYWdlCi0vLyUgIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotLy8lfQotLy8lCi0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0vLyUgIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aCMjVk5BTUUkdSMjOihWQUxVRV9UWVBFKSMjVk5BTUUKLS8vJSAgICAgICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5OihLRVlfVFlQRSMjS2lzUCRTIyNLaXNQKWtleSB7Ci0vLyUgIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aCMjVk5BTUUkdSMjczpmb3JLZXlzOmNvdW50OgotLy8lICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLS8vJSAgcmV0dXJuIFtbKEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczomIyNWTkFNRQotLy8lICAgICAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czoma2V5Ci0vLyUgICAgICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoIyNWTkFNRSR1IyNzOihjb25zdCBWQUxVRV9UWVBFIFtdKSMjVk5BTUUjI3MKLS8vJSAgICAgICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czooY29uc3QgS0VZX1RZUEUjI0tpc1AkUyMjS2lzUCBbXSlrZXlzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotLy8lICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGgjI1ZOQU1FJHUjI3M6Zm9yS2V5czpjb3VudDoKLS8vJSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0vLyUgIHJldHVybiBbWyhHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6IyNWTkFNRSMjcwotLy8lICAgICAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0vLyUgICAgICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLS8vJSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLS8vJSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0vLyUgIHJldHVybiBbWyhHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotLy8lICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0vLyUgIHJldHVybiBbc2VsZiBpbml0V2l0aCMjVk5BTUUkdSMjczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLS8vJX0KLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoIyNWTkFNRSR1IyNzOihjb25zdCBWQUxVRV9UWVBFIFtdKSMjVk5BTUUjI3MKLS8vJSAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czooY29uc3QgS0VZX1RZUEUjI0tpc1AkUyMjS2lzUCBbXSlrZXlzCi0vLyUgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotLy8lICBzZWxmID0gW3N1cGVyIGluaXRdOwotLy8lICBpZiAoc2VsZikgewotLy8lICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLS8vJSAgICBpZiAoY291bnQgJiYgVk5BTUUjI3MgJiYga2V5cykgewotLy8lICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotLy8lRElDVElPTkFSWV9WQUxJREFURV9WQUxVRV8jI1ZIRUxQRVIoVk5BTUUjI3NbaV0sIF9fX19fXykjI0RJQ1RJT05BUllfVkFMSURBVEVfS0VZXyMjS0hFTFBFUihrZXlzW2ldLCBfX19fX18pICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OldSQVBQRUQjI1ZIRUxQRVIoVk5BTUUjI3NbaV0pIGZvcktleTpXUkFQUEVEIyNLSEVMUEVSKGtleXNbaV0pXTsKLS8vJSAgICAgIH0KLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIHNlbGY7Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLS8vJSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoIyNWTkFNRSR1IyNzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotLy8lICBpZiAoc2VsZikgewotLy8lICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0vLyUgICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIHNlbGY7Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLS8vJSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0vLyUgIHJldHVybiBbc2VsZiBpbml0V2l0aCMjVk5BTUUkdSMjczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLS8vJX0KLS8vJQotLy8lRElDVElPTkFSWV9JTU1VVEFCTEVfQ09SRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIEtIRUxQRVIsIFZIRUxQRVIsIFZOQU1FLCApCi0vLyUKLS8vJVZBTFVFX0ZPUl9LRVlfIyNWSEVMUEVSKEtFWV9UWVBFIyNLaXNQJFMjI0tpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIEtIRUxQRVIpCi0vLyUKLS8vJURJQ1RJT05BUllfTVVUQUJMRV9DT1JFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgS0hFTFBFUiwgVkhFTFBFUiwgVk5BTUUsICkKLS8vJQotLy8lQGVuZAotLy8lCi0KLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfS0VZX1RPX0VOVU1fSU1QTChLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIEtIRUxQRVIpCi0vLyVESUNUSU9OQVJZX0tFWV9UT19FTlVNX0lNUEwyKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgS0hFTFBFUiwgUE9EKQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9LRVlfVE9fRU5VTV9JTVBMMihLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIEtIRUxQRVIsIFZIRUxQRVIpCi0vLyUjcHJhZ21hIG1hcmsgLSBLRVlfTkFNRSAtPiBWQUxVRV9OQU1FCi0vLyUKLS8vJUBpbXBsZW1lbnRhdGlvbiBHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IHsKLS8vJSBAcGFja2FnZQotLy8lICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLS8vJSAgR1BCRW51bVZhbGlkYXRpb25GdW5jIF92YWxpZGF0aW9uRnVuYzsKLS8vJX0KLS8vJQotLy8lQHN5bnRoZXNpemUgdmFsaWRhdGlvbkZ1bmMgPSBfdmFsaWRhdGlvbkZ1bmM7Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLS8vJSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOk5VTEwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYyB7Ci0vLyUgIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTooVkFMVUVfVFlQRSlyYXdWYWx1ZQotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihLRVlfVFlQRSMjS2lzUCRTIyNLaXNQKWtleSB7Ci0vLyUgIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotLy8lICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLS8vJSAgcmV0dXJuIFtbKEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0vLyUgICAgICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZyYXdWYWx1ZQotLy8lICAgICAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0vLyUgICAgICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBWQUxVRV9UWVBFIFtdKXJhd1ZhbHVlcwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBLRVlfVFlQRSMjS2lzUCRTIyNLaXNQIFtdKWtleXMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0vLyUgIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotLy8lICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLS8vJSAgcmV0dXJuIFtbKEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0vLyUgICAgICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOnJhd1ZhbHVlcwotLy8lICAgICAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0vLyUgICAgICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLS8vJSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0vLyUgIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotLy8lICByZXR1cm4gW1soR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0vLyUgIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jIGNhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0IHsKLS8vJSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOk5VTEwgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotLy8lfQotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jIHsKLS8vJSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotLy8lfQotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IFZBTFVFX1RZUEUgW10pcmF3VmFsdWVzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEtFWV9UWVBFIyNLaXNQJFMjI0tpc1AgW10pa2V5cwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLS8vJSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLS8vJSAgaWYgKHNlbGYpIHsKLS8vJSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0vLyUgICAgX3ZhbGlkYXRpb25GdW5jID0gKGZ1bmMgIT0gTlVMTCA/IGZ1bmMgOiBEaWN0RGVmYXVsdF9Jc1ZhbGlkVmFsdWUpOwotLy8lICAgIGlmIChjb3VudCAmJiByYXdWYWx1ZXMgJiYga2V5cykgewotLy8lICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotLy8lRElDVElPTkFSWV9WQUxJREFURV9LRVlfIyNLSEVMUEVSKGtleXNbaV0sIF9fX19fXykgICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6V1JBUFBFRCMjVkhFTFBFUihyYXdWYWx1ZXNbaV0pIGZvcktleTpXUkFQUEVEIyNLSEVMUEVSKGtleXNbaV0pXTsKLS8vJSAgICAgIH0KLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIHNlbGY7Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLS8vJSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmRpY3Rpb25hcnkudmFsaWRhdGlvbkZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdOwotLy8lICBpZiAoc2VsZikgewotLy8lICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0vLyUgICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIHNlbGY7Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0vLyUgICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotLy8lICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYyByYXdWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0vLyV9Ci0vLyUKLS8vJURJQ1RJT05BUllfSU1NVVRBQkxFX0NPUkUoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBLSEVMUEVSLCBWSEVMUEVSLCB2YWx1ZSwgUmF3KQotLy8lCi0vLyUtIChCT09MKXZhbHVlRm9yS2V5OihLRVlfVFlQRSMjS2lzUCRTIyNLaXNQKWtleSB2YWx1ZTooVkFMVUVfVFlQRSAqKXZhbHVlIHsKLS8vJSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OldSQVBQRUQjI0tIRUxQRVIoa2V5KV07Ci0vLyUgIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0vLyUgICAgVkFMVUVfVFlQRSByZXN1bHQgPSBVTldSQVAjI1ZBTFVFX05BTUUod3JhcHBlZCk7Ci0vLyUgICAgaWYgKCFfdmFsaWRhdGlvbkZ1bmMocmVzdWx0KSkgewotLy8lICAgICAgcmVzdWx0ID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLS8vJSAgICB9Ci0vLyUgICAgKnZhbHVlID0gcmVzdWx0OwotLy8lICB9Ci0vLyUgIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLS8vJX0KLS8vJQotLy8lLSAoQk9PTCl2YWx1ZUZvcktleTooS0VZX1RZUEUjI0tpc1AkUyMjS2lzUClrZXkgcmF3VmFsdWU6KFZBTFVFX1RZUEUgKilyYXdWYWx1ZSB7Ci0vLyUgIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpXUkFQUEVEIyNLSEVMUEVSKGtleSldOwotLy8lICBpZiAod3JhcHBlZCAmJiByYXdWYWx1ZSkgewotLy8lICAgICpyYXdWYWx1ZSA9IFVOV1JBUCMjVkFMVUVfTkFNRSh3cmFwcGVkKTsKLS8vJSAgfQotLy8lICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0vLyUgICAgKHZvaWQgKF4pKEtFWV9UWVBFIEtpc1AjI2tleSwgVkFMVUVfVFlQRSB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotLy8lICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZnVuYyA9IF92YWxpZGF0aW9uRnVuYzsKLS8vJSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKEVOVU1fVFlQRSMjS0hFTFBFUihLRVlfVFlQRSkjI2FLZXksCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlVNX1RZUEUjI1ZIRUxQRVIoVkFMVUVfVFlQRSkjI2FWYWx1ZSwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAgIFZBTFVFX1RZUEUgdW53cmFwcGVkID0gVU5XUkFQIyNWQUxVRV9OQU1FKGFWYWx1ZSk7Ci0vLyUgICAgICBpZiAoIWZ1bmModW53cmFwcGVkKSkgewotLy8lICAgICAgICB1bndyYXBwZWQgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotLy8lICAgICAgfQotLy8lICAgICAgYmxvY2soVU5XUkFQIyNLRVlfTkFNRShhS2V5KSwgdW53cmFwcGVkLCBzdG9wKTsKLS8vJSAgfV07Ci0vLyV9Ci0vLyUKLS8vJURJQ1RJT05BUllfTVVUQUJMRV9DT1JFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgS0hFTFBFUiwgVkhFTFBFUiwgdmFsdWUsIFJhdykKLS8vJQotLy8lLSAodm9pZClzZXRWYWx1ZTooVkFMVUVfVFlQRSl2YWx1ZSBmb3JLZXk6KEtFWV9UWVBFIyNLaXNQJFMjI0tpc1Apa2V5IHsKLS8vJURJQ1RJT05BUllfVkFMSURBVEVfS0VZXyMjS0hFTFBFUihrZXksICkgIGlmICghX3ZhbGlkYXRpb25GdW5jKHZhbHVlKSkgewotLy8lICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotLy8lICAgICAgICAgICAgICAgIGZvcm1hdDpAIkdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnk6IEF0dGVtcHQgdG8gc2V0IGFuIHVua25vd24gZW51bSB2YWx1ZSAoJWQpIiwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVdOwotLy8lICB9Ci0vLyUKLS8vJSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpXUkFQUEVEIyNWSEVMUEVSKHZhbHVlKSBmb3JLZXk6V1JBUFBFRCMjS0hFTFBFUihrZXkpXTsKLS8vJSAgaWYgKF9hdXRvY3JlYXRvcikgewotLy8lICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lQGVuZAotLy8lCi0KLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfSU1NVVRBQkxFX0NPUkUoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBLSEVMUEVSLCBWSEVMUEVSLCBWTkFNRSwgQUNDRVNTT1JfTkFNRSkKLS8vJS0gKHZvaWQpZGVhbGxvYyB7Ci0vLyUgIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0vLyUgICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLS8vJSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotLy8lICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0vLyUgIFtzdXBlciBkZWFsbG9jXTsKLS8vJX0KLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0vLyUgIHJldHVybiBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci0vLyV9Ci0vLyUKLS8vJS0gKEJPT0wpaXNFcXVhbDooR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSAqKW90aGVyIHsKLS8vJSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLS8vJSAgICByZXR1cm4gWUVTOwotLy8lICB9Ci0vLyUgIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgY2xhc3NdXSkgewotLy8lICAgIHJldHVybiBOTzsKLS8vJSAgfQotLy8lICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLS8vJX0KLS8vJQotLy8lLSAoTlNVSW50ZWdlciloYXNoIHsKLS8vJSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotLy8lfQotLy8lCi0vLyUtIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLS8vJSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLS8vJX0KLS8vJQotLy8lLSAoTlNVSW50ZWdlciljb3VudCB7Ci0vLyUgIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kIyNBQ0NFU1NPUl9OQU1FIyNWTkFNRSR1IyNzVXNpbmdCbG9jazoKLS8vJSAgICAodm9pZCAoXikoS0VZX1RZUEUgS2lzUCMja2V5LCBWQUxVRV9UWVBFIFZOQU1FLCBCT09MICpzdG9wKSlibG9jayB7Ci0vLyUgIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihFTlVNX1RZUEUjI0tIRUxQRVIoS0VZX1RZUEUpIyNhS2V5LAotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRU5VTV9UWVBFIyNWSEVMUEVSKFZBTFVFX1RZUEUpIyNhIyNWTkFNRSR1LAotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotLy8lICAgICAgYmxvY2soVU5XUkFQIyNLRVlfTkFNRShhS2V5KSwgVU5XUkFQIyNWQUxVRV9OQU1FKGEjI1ZOQU1FJHUpLCBzdG9wKTsKLS8vJSAgfV07Ci0vLyV9Ci0vLyUKLS8vJUVYVFJBX01FVEhPRFNfIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FKS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0vLyUgIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLS8vJSAgaWYgKGNvdW50ID09IDApIHsKLS8vJSAgICByZXR1cm4gMDsKLS8vJSAgfQotLy8lCi0vLyUgIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLS8vJSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLS8vJSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLS8vJSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKEVOVU1fVFlQRSMjS0hFTFBFUihLRVlfVFlQRSkjI2FLZXksCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFTlVNX1RZUEUjI1ZIRUxQRVIoVkFMVUVfVFlQRSkjI2EjI1ZOQU1FJHUjIywKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotLy8lICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3QjI0tFWV9OQU1FIyNGaWVsZFNpemUoVU5XUkFQIyNLRVlfTkFNRShhS2V5KSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0vLyUgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdCMjVkFMVUVfTkFNRSMjRmllbGRTaXplKFVOV1JBUCMjVkFMVUVfTkFNRShhIyNWTkFNRSR1KSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotLy8lICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0vLyUgIH1dOwotLy8lICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0vLyUgIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0vLyUgIHJldHVybiByZXN1bHQ7Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotLy8lICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLS8vJSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotLy8lICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotLy8lICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotLy8lICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oRU5VTV9UWVBFIyNLSEVMUEVSKEtFWV9UWVBFKSMjYUtleSwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVOVU1fVFlQRSMjVkhFTFBFUihWQUxVRV9UWVBFKSMjYSMjVk5BTUUkdSwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotLy8lICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0vLyUgICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLS8vJSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLS8vJSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0IyNLRVlfTkFNRSMjRmllbGRTaXplKFVOV1JBUCMjS0VZX05BTUUoYUtleSksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotLy8lICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3QjI1ZBTFVFX05BTUUjI0ZpZWxkU2l6ZShVTldSQVAjI1ZBTFVFX05BTUUoYSMjVk5BTUUkdSksIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLS8vJSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLS8vJSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotLy8lICAgIFdyaXRlRGljdCMjS0VZX05BTUUjI0ZpZWxkKG91dHB1dFN0cmVhbSwgVU5XUkFQIyNLRVlfTkFNRShhS2V5KSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0vLyUgICAgV3JpdGVEaWN0IyNWQUxVRV9OQU1FIyNGaWVsZChvdXRwdXRTdHJlYW0sIFVOV1JBUCMjVkFMVUVfTkFNRShhIyNWTkFNRSR1KSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotLy8lICB9XTsKLS8vJX0KLS8vJQotLy8lU0VSSUFMX0RBVEFfRk9SX0VOVFJZXyMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSktICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLS8vJSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotLy8lICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OldSQVBQRUQjI1ZIRUxQRVIodmFsdWUtPiMjR1BCVkFMVUVfIyNWSEVMUEVSKFZBTFVFX05BTUUpIyMpIGZvcktleTpXUkFQUEVEIyNLSEVMUEVSKGtleS0+dmFsdWUjI0tFWV9OQU1FKV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotLy8lICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kIyNBQ0NFU1NPUl9OQU1FIyNWTkFNRSR1IyNzVXNpbmdCbG9jazpeKEtFWV9UWVBFIEtpc1AjI2tleSwgVkFMVUVfVFlQRSBWTkFNRSwgQk9PTCAqc3RvcCkgewotLy8lICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLS8vJSAgICAgIGJsb2NrKFRFWFRfRk9STUFUX09CSiMjS0VZX05BTUUoa2V5KSwgVEVYVF9GT1JNQVRfT0JKIyNWQUxVRV9OQU1FKFZOQU1FKSk7Ci0vLyUgIH1dOwotLy8lfQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9NVVRBQkxFX0NPUkUoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBLSEVMUEVSLCBWSEVMUEVSLCBWTkFNRSwgQUNDRVNTT1JfTkFNRSkKLS8vJS0gKHZvaWQpYWRkIyNBQ0NFU1NPUl9OQU1FIyNFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotLy8lICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0vLyUgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLS8vJSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0vLyUgICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotLy8lICAgIH0KLS8vJSAgfQotLy8lfQotLy8lCi0vLyUtICh2b2lkKXNldCMjQUNDRVNTT1JfTkFNRSMjVk5BTUUkdSMjOihWQUxVRV9UWVBFKVZOQU1FIGZvcktleTooS0VZX1RZUEUjI0tpc1AkUyMjS2lzUClrZXkgewotLy8lRElDVElPTkFSWV9WQUxJREFURV9WQUxVRV8jI1ZIRUxQRVIoVk5BTUUsICkjI0RJQ1RJT05BUllfVkFMSURBVEVfS0VZXyMjS0hFTFBFUihrZXksICkgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6V1JBUFBFRCMjVkhFTFBFUihWTkFNRSkgZm9yS2V5OldSQVBQRUQjI0tIRUxQRVIoa2V5KV07Ci0vLyUgIGlmIChfYXV0b2NyZWF0b3IpIHsKLS8vJSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotLy8lICB9Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpcmVtb3ZlIyNWTkFNRSR1IyNGb3JLZXk6KEtFWV9UWVBFIyNLaXNQJFMjI0tpc1ApYUtleSB7Ci0vLyUgIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6V1JBUFBFRCMjS0hFTFBFUihhS2V5KV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpcmVtb3ZlQWxsIHsKLS8vJSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotLy8lfQotCi0vLwotLy8gQ3VzdG9tIEdlbmVyYXRpb24gZm9yIEJvb2wga2V5cwotLy8KLQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9CT09MX0tFWV9UT19QT0RfSU1QTChWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lRElDVElPTkFSWV9CT09MX0tFWV9UT19WQUxVRV9JTVBMKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFBPRCwgdmFsdWUpCi0vLyVQRERNLURFRklORSBESUNUSU9OQVJZX0JPT0xfS0VZX1RPX09CSkVDVF9JTVBMKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpCi0vLyVESUNUSU9OQVJZX0JPT0xfS0VZX1RPX1ZBTFVFX0lNUEwoVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgT0JKRUNULCBvYmplY3QpCi0KLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfQk9PTF9LRVlfVE9fVkFMVUVfSU1QTChWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBIRUxQRVIsIFZOQU1FKQotLy8lI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBWQUxVRV9OQU1FCi0vLyUKLS8vJUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IHsKLS8vJSBAcGFja2FnZQotLy8lICBWQUxVRV9UWVBFIF92YWx1ZXNbMl07Ci0vLyVCT09MX0RJQ1RfSEFTX1NUT1JBR0VfIyNIRUxQRVIoKX0KLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotLy8lICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGgjI1ZOQU1FJHUjIzooVkFMVUVfVFlQRSlWTkFNRQotLy8lICAgICAgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXk6KEJPT0wpa2V5IHsKLS8vJSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoIyNWTkFNRSR1IyNzOmZvcktleXM6Y291bnQ6Ci0vLyUgIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotLy8lICByZXR1cm4gW1soR1BCQm9vbCMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOiYjI1ZOQU1FCi0vLyUgICAgICAgICAgICAgICAgICAgIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOiZrZXkKLS8vJSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGgjI1ZOQU1FJHUjI3M6KGNvbnN0IFZBTFVFX1RZUEUgW10pIyNWTkFNRSMjcwotLy8lICAgICAgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0vLyUgIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aCMjVk5BTUUkdSMjczpmb3JLZXlzOmNvdW50OgotLy8lICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLS8vJSAgcmV0dXJuIFtbKEdQQkJvb2wjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczojI1ZOQU1FIyNzCi0vLyUgICAgICAgICAgICAgICAgICAgIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOmtleXMKLS8vJSAgICAgICAgICAgICAgICAgICAgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCQm9vbCMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotLy8lICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotLy8lICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLS8vJSAgcmV0dXJuIFtbKEdQQkJvb2wjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0vLyUgIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0IHsKLS8vJSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoIyNWTkFNRSR1IyNzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotLy8lfQotLy8lCi0vLyVCT09MX0RJQ1RfSU5JVFNfIyNIRUxQRVIoVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkKLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotLy8lICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLS8vJSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoIyNWTkFNRSR1IyNzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotLy8lfQotLy8lCi0vLyVCT09MX0RJQ1RfREVBTExPQyMjSEVMUEVSKCkKLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0vLyUgIHJldHVybiBbW0dQQkJvb2wjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci0vLyV9Ci0vLyUKLS8vJS0gKEJPT0wpaXNFcXVhbDooR1BCQm9vbCMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSAqKW90aGVyIHsKLS8vJSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLS8vJSAgICByZXR1cm4gWUVTOwotLy8lICB9Ci0vLyUgIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkJvb2wjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgY2xhc3NdXSkgewotLy8lICAgIHJldHVybiBOTzsKLS8vJSAgfQotLy8lICBpZiAoKEJPT0xfRElDVF9XX0hBUyMjSEVMUEVSKDAsICkgIT0gQk9PTF9ESUNUX1dfSEFTIyNIRUxQRVIoMCwgb3RoZXItPikpIHx8Ci0vLyUgICAgICAoQk9PTF9ESUNUX1dfSEFTIyNIRUxQRVIoMSwgKSAhPSBCT09MX0RJQ1RfV19IQVMjI0hFTFBFUigxLCBvdGhlci0+KSkpIHsKLS8vJSAgICByZXR1cm4gTk87Ci0vLyUgIH0KLS8vJSAgaWYgKChCT09MX0RJQ1RfV19IQVMjI0hFTFBFUigwLCApICYmIChORVFfIyNIRUxQRVIoX3ZhbHVlc1swXSwgb3RoZXItPl92YWx1ZXNbMF0pKSkgfHwKLS8vJSAgICAgIChCT09MX0RJQ1RfV19IQVMjI0hFTFBFUigxLCApICYmIChORVFfIyNIRUxQRVIoX3ZhbHVlc1sxXSwgb3RoZXItPl92YWx1ZXNbMV0pKSkpIHsKLS8vJSAgICByZXR1cm4gTk87Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIFlFUzsKLS8vJX0KLS8vJQotLy8lLSAoTlNVSW50ZWdlciloYXNoIHsKLS8vJSAgcmV0dXJuIChCT09MX0RJQ1RfV19IQVMjI0hFTFBFUigwLCApID8gMSA6IDApICsgKEJPT0xfRElDVF9XX0hBUyMjSEVMUEVSKDEsICkgPyAxIDogMCk7Ci0vLyV9Ci0vLyUKLS8vJS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotLy8lICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyIsIFtzZWxmIGNsYXNzXSwgc2VsZl07Ci0vLyUgIGlmIChCT09MX0RJQ1RfV19IQVMjI0hFTFBFUigwLCApKSB7Ci0vLyUgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCJOTzogU1RSX0ZPUk1BVF8jI0hFTFBFUihWQUxVRV9OQU1FKSIsIF92YWx1ZXNbMF1dOwotLy8lICB9Ci0vLyUgIGlmIChCT09MX0RJQ1RfV19IQVMjI0hFTFBFUigxLCApKSB7Ci0vLyUgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCJZRVM6IFNUUl9GT1JNQVRfIyNIRUxQRVIoVkFMVUVfTkFNRSkiLCBfdmFsdWVzWzFdXTsKLS8vJSAgfQotLy8lICBbcmVzdWx0IGFwcGVuZFN0cmluZzpAIiB9Il07Ci0vLyUgIHJldHVybiByZXN1bHQ7Ci0vLyV9Ci0vLyUKLS8vJS0gKE5TVUludGVnZXIpY291bnQgewotLy8lICByZXR1cm4gKEJPT0xfRElDVF9XX0hBUyMjSEVMUEVSKDAsICkgPyAxIDogMCkgKyAoQk9PTF9ESUNUX1dfSEFTIyNIRUxQRVIoMSwgKSA/IDEgOiAwKTsKLS8vJX0KLS8vJQotLy8lQk9PTF9WQUxVRV9GT1JfS0VZXyMjSEVMUEVSKFZBTFVFX1RZUEUpCi0vLyUKLS8vJUJPT0xfU0VUX0dQQlZBTFVFX0ZPUl9LRVlfIyNIRUxQRVIoVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgVmlzUCkKLS8vJQotLy8lLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0vLyUgIGlmIChCT09MX0RJQ1RfSEFTIyNIRUxQRVIoMCwgKSkgewotLy8lICAgIGJsb2NrKEAiZmFsc2UiLCBURVhUX0ZPUk1BVF9PQkojI1ZBTFVFX05BTUUoX3ZhbHVlc1swXSkpOwotLy8lICB9Ci0vLyUgIGlmIChCT09MX0RJQ1RfV19IQVMjI0hFTFBFUigxLCApKSB7Ci0vLyUgICAgYmxvY2soQCJ0cnVlIiwgVEVYVF9GT1JNQVRfT0JKIyNWQUxVRV9OQU1FKF92YWx1ZXNbMV0pKTsKLS8vJSAgfQotLy8lfQotLy8lCi0vLyUtICh2b2lkKWVudW1lcmF0ZUtleXNBbmQjI1ZOQU1FJHUjI3NVc2luZ0Jsb2NrOgotLy8lICAgICh2b2lkICheKShCT09MIGtleSwgVkFMVUVfVFlQRSBWTkFNRSwgQk9PTCAqc3RvcCkpYmxvY2sgewotLy8lICBCT09MIHN0b3AgPSBOTzsKLS8vJSAgaWYgKEJPT0xfRElDVF9IQVMjI0hFTFBFUigwLCApKSB7Ci0vLyUgICAgYmxvY2soTk8sIF92YWx1ZXNbMF0sICZzdG9wKTsKLS8vJSAgfQotLy8lICBpZiAoIXN0b3AgJiYgQk9PTF9ESUNUX1dfSEFTIyNIRUxQRVIoMSwgKSkgewotLy8lICAgIGJsb2NrKFlFUywgX3ZhbHVlc1sxXSwgJnN0b3ApOwotLy8lICB9Ci0vLyV9Ci0vLyUKLS8vJUJPT0xfRVhUUkFfTUVUSE9EU18jI0hFTFBFUihCb29sLCBWQUxVRV9OQU1FKS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0vLyUgIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLS8vJSAgTlNVSW50ZWdlciBjb3VudCA9IDA7Ci0vLyUgIHNpemVfdCByZXN1bHQgPSAwOwotLy8lICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotLy8lICAgIGlmIChCT09MX0RJQ1RfSEFTIyNIRUxQRVIoaSwgKSkgewotLy8lICAgICAgKytjb3VudDsKLS8vJSAgICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0vLyUgICAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0IyNWQUxVRV9OQU1FIyNGaWVsZFNpemUoX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotLy8lICAgICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotLy8lICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotLy8lICByZXR1cm4gcmVzdWx0OwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0vLyUgIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLS8vJSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLS8vJSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLS8vJSAgICBpZiAoQk9PTF9ESUNUX0hBUyMjSEVMUEVSKGksICkpIHsKLS8vJSAgICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0vLyUgICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotLy8lICAgICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0vLyUgICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotLy8lICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdCMjVkFMVUVfTkFNRSMjRmllbGRTaXplKF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLS8vJSAgICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotLy8lICAgICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLS8vJSAgICAgIFdyaXRlRGljdEJvb2xGaWVsZChvdXRwdXRTdHJlYW0sIChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0vLyUgICAgICBXcml0ZURpY3QjI1ZBTFVFX05BTUUjI0ZpZWxkKG91dHB1dFN0cmVhbSwgX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotLy8lICAgIH0KLS8vJSAgfQotLy8lfQotLy8lCi0vLyVCT09MX0RJQ1RfTVVUQVRJT05TXyMjSEVMUEVSKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpCi0vLyUKLS8vJUBlbmQKLS8vJQotCi0KLS8vCi0vLyBIZWxwZXJzIGZvciBQT0RzCi0vLwotCi0vLyVQRERNLURFRklORSBWQUxVRV9GT1JfS0VZX1BPRChLRVlfVFlQRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgS0hFTFBFUikKLS8vJS0gKEJPT0wpdmFsdWVGb3JLZXk6KEtFWV9UWVBFKWtleSB2YWx1ZTooVkFMVUVfVFlQRSAqKXZhbHVlIHsKLS8vJSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OldSQVBQRUQjI0tIRUxQRVIoa2V5KV07Ci0vLyUgIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0vLyUgICAgKnZhbHVlID0gVU5XUkFQIyNWQUxVRV9OQU1FKHdyYXBwZWQpOwotLy8lICB9Ci0vLyUgIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLS8vJX0KLS8vJVBERE0tREVGSU5FIFdSQVBQRURQT0QoVkFMVUUpCi0vLyVAKFZBTFVFKQotLy8lUERETS1ERUZJTkUgVU5XUkFQVUludDMyKFZBTFVFKQotLy8lW1ZBTFVFIHVuc2lnbmVkSW50VmFsdWVdCi0vLyVQRERNLURFRklORSBVTldSQVBJbnQzMihWQUxVRSkKLS8vJVtWQUxVRSBpbnRWYWx1ZV0KLS8vJVBERE0tREVGSU5FIFVOV1JBUFVJbnQ2NChWQUxVRSkKLS8vJVtWQUxVRSB1bnNpZ25lZExvbmdMb25nVmFsdWVdCi0vLyVQRERNLURFRklORSBVTldSQVBJbnQ2NChWQUxVRSkKLS8vJVtWQUxVRSBsb25nTG9uZ1ZhbHVlXQotLy8lUERETS1ERUZJTkUgVU5XUkFQQm9vbChWQUxVRSkKLS8vJVtWQUxVRSBib29sVmFsdWVdCi0vLyVQRERNLURFRklORSBVTldSQVBGbG9hdChWQUxVRSkKLS8vJVtWQUxVRSBmbG9hdFZhbHVlXQotLy8lUERETS1ERUZJTkUgVU5XUkFQRG91YmxlKFZBTFVFKQotLy8lW1ZBTFVFIGRvdWJsZVZhbHVlXQotLy8lUERETS1ERUZJTkUgVU5XUkFQRW51bShWQUxVRSkKLS8vJVtWQUxVRSBpbnRWYWx1ZV0KLS8vJVBERE0tREVGSU5FIFRFWFRfRk9STUFUX09CSlVJbnQzMihWQUxVRSkKLS8vJVtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXUiLCBWQUxVRV0KLS8vJVBERE0tREVGSU5FIFRFWFRfRk9STUFUX09CSkludDMyKFZBTFVFKQotLy8lW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlZCIsIFZBTFVFXQotLy8lUERETS1ERUZJTkUgVEVYVF9GT1JNQVRfT0JKVUludDY0KFZBTFVFKQotLy8lW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGx1IiwgVkFMVUVdCi0vLyVQRERNLURFRklORSBURVhUX0ZPUk1BVF9PQkpJbnQ2NChWQUxVRSkKLS8vJVtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsZCIsIFZBTFVFXQotLy8lUERETS1ERUZJTkUgVEVYVF9GT1JNQVRfT0JKQm9vbChWQUxVRSkKLS8vJShWQUxVRSA/IEAidHJ1ZSIgOiBAImZhbHNlIikKLS8vJVBERE0tREVGSU5FIFRFWFRfRk9STUFUX09CSkZsb2F0KFZBTFVFKQotLy8lW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlLipnIiwgRkxUX0RJRywgVkFMVUVdCi0vLyVQRERNLURFRklORSBURVhUX0ZPUk1BVF9PQkpEb3VibGUoVkFMVUUpCi0vLyVbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiUuKmxnIiwgREJMX0RJRywgVkFMVUVdCi0vLyVQRERNLURFRklORSBURVhUX0ZPUk1BVF9PQkpFbnVtKFZBTFVFKQotLy8lQChWQUxVRSkKLS8vJVBERE0tREVGSU5FIEVOVU1fVFlQRVBPRChUWVBFKQotLy8lTlNOdW1iZXIgKgotLy8lUERETS1ERUZJTkUgTkVRX1BPRChWQUwxLCBWQUwyKQotLy8lVkFMMSAhPSBWQUwyCi0vLyVQRERNLURFRklORSBFWFRSQV9NRVRIT0RTX1BPRChLRVlfTkFNRSwgVkFMVUVfTkFNRSkKLS8vIEVtcHR5Ci0vLyVQRERNLURFRklORSBCT09MX0VYVFJBX01FVEhPRFNfUE9EKEtFWV9OQU1FLCBWQUxVRV9OQU1FKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIFNFUklBTF9EQVRBX0ZPUl9FTlRSWV9QT0QoS0VZX05BTUUsIFZBTFVFX05BTUUpCi0vLyVTRVJJQUxfREFUQV9GT1JfRU5UUllfUE9EXyMjVkFMVUVfTkFNRShLRVlfTkFNRSkKLS8vJVBERE0tREVGSU5FIFNFUklBTF9EQVRBX0ZPUl9FTlRSWV9QT0RfVUludDMyKEtFWV9OQU1FKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIFNFUklBTF9EQVRBX0ZPUl9FTlRSWV9QT0RfSW50MzIoS0VZX05BTUUpCi0vLyBFbXB0eQotLy8lUERETS1ERUZJTkUgU0VSSUFMX0RBVEFfRk9SX0VOVFJZX1BPRF9VSW50NjQoS0VZX05BTUUpCi0vLyBFbXB0eQotLy8lUERETS1ERUZJTkUgU0VSSUFMX0RBVEFfRk9SX0VOVFJZX1BPRF9JbnQ2NChLRVlfTkFNRSkKLS8vIEVtcHR5Ci0vLyVQRERNLURFRklORSBTRVJJQUxfREFUQV9GT1JfRU5UUllfUE9EX0Jvb2woS0VZX05BTUUpCi0vLyBFbXB0eQotLy8lUERETS1ERUZJTkUgU0VSSUFMX0RBVEFfRk9SX0VOVFJZX1BPRF9GbG9hdChLRVlfTkFNRSkKLS8vIEVtcHR5Ci0vLyVQRERNLURFRklORSBTRVJJQUxfREFUQV9GT1JfRU5UUllfUE9EX0RvdWJsZShLRVlfTkFNRSkKLS8vIEVtcHR5Ci0vLyVQRERNLURFRklORSBTRVJJQUxfREFUQV9GT1JfRU5UUllfUE9EX0VudW0oS0VZX05BTUUpCi0vLyUtIChOU0RhdGEgKilzZXJpYWxpemVkRGF0YUZvclVua25vd25WYWx1ZTooaW50MzJfdCl2YWx1ZQotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleQotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RGF0YVR5cGU6KEdQQkRhdGFUeXBlKWtleURhdGFUeXBlIHsKLS8vJSAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdCMjS0VZX05BTUUjI0ZpZWxkU2l6ZShrZXktPnZhbHVlIyNLRVlfTkFNRSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0vLyUgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RFbnVtRmllbGRTaXplKHZhbHVlLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVFbnVtKTsKLS8vJSAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOm1zZ1NpemVdOwotLy8lICBHUEJDb2RlZE91dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtID0gW1tHUEJDb2RlZE91dHB1dFN0cmVhbSBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGFdOwotLy8lICBXcml0ZURpY3QjI0tFWV9OQU1FIyNGaWVsZChvdXRwdXRTdHJlYW0sIGtleS0+dmFsdWUjI0tFWV9OQU1FLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLS8vJSAgV3JpdGVEaWN0RW51bUZpZWxkKG91dHB1dFN0cmVhbSwgdmFsdWUsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUVudW0pOwotLy8lICBbb3V0cHV0U3RyZWFtIHJlbGVhc2VdOwotLy8lICByZXR1cm4gZGF0YTsKLS8vJX0KLS8vJQotLy8lUERETS1ERUZJTkUgR1BCVkFMVUVfUE9EKFZBTFVFX05BTUUpCi0vLyV2YWx1ZSMjVkFMVUVfTkFNRQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9WQUxJREFURV9WQUxVRV9QT0QoVkFMVUVfTkFNRSwgRVhUUkFfSU5ERU5UKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfVkFMSURBVEVfS0VZX1BPRChLRVlfTkFNRSwgRVhUUkFfSU5ERU5UKQotLy8gRW1wdHkKLQotLy8lUERETS1ERUZJTkUgQk9PTF9ESUNUX0hBU19TVE9SQUdFX1BPRCgpCi0vLyUgIEJPT0wgX3ZhbHVlU2V0WzJdOwotLy8lCi0vLyVQRERNLURFRklORSBCT09MX0RJQ1RfSU5JVFNfUE9EKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IFZBTFVFX1RZUEUgW10pdmFsdWVzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLS8vJSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLS8vJSAgaWYgKHNlbGYpIHsKLS8vJSAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0vLyUgICAgICBpbnQgaWR4ID0ga2V5c1tpXSA/IDEgOiAwOwotLy8lICAgICAgX3ZhbHVlc1tpZHhdID0gdmFsdWVzW2ldOwotLy8lICAgICAgX3ZhbHVlU2V0W2lkeF0gPSBZRVM7Ci0vLyUgICAgfQotLy8lICB9Ci0vLyUgIHJldHVybiBzZWxmOwotLy8lfQotLy8lCi0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJCb29sIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0vLyUgIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLS8vJSAgaWYgKHNlbGYpIHsKLS8vJSAgICBpZiAoZGljdGlvbmFyeSkgewotLy8lICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLS8vJSAgICAgICAgaWYgKGRpY3Rpb25hcnktPl92YWx1ZVNldFtpXSkgewotLy8lICAgICAgICAgIF92YWx1ZXNbaV0gPSBkaWN0aW9uYXJ5LT5fdmFsdWVzW2ldOwotLy8lICAgICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLS8vJSAgICAgICAgfQotLy8lICAgICAgfQotLy8lICAgIH0KLS8vJSAgfQotLy8lICByZXR1cm4gc2VsZjsKLS8vJX0KLS8vJVBERE0tREVGSU5FIEJPT0xfRElDVF9ERUFMTE9DUE9EKCkKLS8vJSNpZiAhZGVmaW5lZChOU19CTE9DS19BU1NFUlRJT05TKQotLy8lLSAodm9pZClkZWFsbG9jIHsKLS8vJSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLS8vJSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotLy8lICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0vLyUgIFtzdXBlciBkZWFsbG9jXTsKLS8vJX0KLS8vJSNlbmRpZiAgLy8gIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLS8vJVBERE0tREVGSU5FIEJPT0xfRElDVF9XX0hBU1BPRChJRFgsIFJFRikKLS8vJUJPT0xfRElDVF9IQVNQT0QoSURYLCBSRUYpCi0vLyVQRERNLURFRklORSBCT09MX0RJQ1RfSEFTUE9EKElEWCwgUkVGKQotLy8lUkVGIyNfdmFsdWVTZXRbSURYXQotLy8lUERETS1ERUZJTkUgQk9PTF9WQUxVRV9GT1JfS0VZX1BPRChWQUxVRV9UWVBFKQotLy8lLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KFZBTFVFX1RZUEUgKil2YWx1ZSB7Ci0vLyUgIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotLy8lICBpZiAoX3ZhbHVlU2V0W2lkeF0pIHsKLS8vJSAgICBpZiAodmFsdWUpIHsKLS8vJSAgICAgICp2YWx1ZSA9IF92YWx1ZXNbaWR4XTsKLS8vJSAgICB9Ci0vLyUgICAgcmV0dXJuIFlFUzsKLS8vJSAgfQotLy8lICByZXR1cm4gTk87Ci0vLyV9Ci0vLyVQRERNLURFRklORSBCT09MX1NFVF9HUEJWQUxVRV9GT1JfS0VZX1BPRChWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBWaXNQKQotLy8lLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0vLyUgICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLS8vJSAgaW50IGlkeCA9IChrZXktPnZhbHVlQm9vbCA/IDEgOiAwKTsKLS8vJSAgX3ZhbHVlc1tpZHhdID0gdmFsdWUtPnZhbHVlIyNWQUxVRV9OQU1FOwotLy8lICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLS8vJX0KLS8vJVBERE0tREVGSU5FIEJPT0xfRElDVF9NVVRBVElPTlNfUE9EKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpCi0vLyUtICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbCMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0vLyUgIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLS8vJSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotLy8lICAgICAgaWYgKG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0vLyUgICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLS8vJSAgICAgICAgX3ZhbHVlc1tpXSA9IG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlc1tpXTsKLS8vJSAgICAgIH0KLS8vJSAgICB9Ci0vLyUgICAgaWYgKF9hdXRvY3JlYXRvcikgewotLy8lICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lLSAodm9pZClzZXRWYWx1ZTooVkFMVUVfVFlQRSl2YWx1ZSBmb3JLZXk6KEJPT0wpa2V5IHsKLS8vJSAgaW50IGlkeCA9IChrZXkgPyAxIDogMCk7Ci0vLyUgIF92YWx1ZXNbaWR4XSA9IHZhbHVlOwotLy8lICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLS8vJSAgaWYgKF9hdXRvY3JlYXRvcikgewotLy8lICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5IHsKLS8vJSAgX3ZhbHVlU2V0W2FLZXkgPyAxIDogMF0gPSBOTzsKLS8vJX0KLS8vJQotLy8lLSAodm9pZClyZW1vdmVBbGwgewotLy8lICBfdmFsdWVTZXRbMF0gPSBOTzsKLS8vJSAgX3ZhbHVlU2V0WzFdID0gTk87Ci0vLyV9Ci0vLyVQRERNLURFRklORSBTVFJfRk9STUFUX1BPRChWQUxVRV9OQU1FKQotLy8lU1RSX0ZPUk1BVF8jI1ZBTFVFX05BTUUoKQotLy8lUERETS1ERUZJTkUgU1RSX0ZPUk1BVF9VSW50MzIoKQotLy8lJXUKLS8vJVBERE0tREVGSU5FIFNUUl9GT1JNQVRfSW50MzIoKQotLy8lJWQKLS8vJVBERE0tREVGSU5FIFNUUl9GT1JNQVRfVUludDY0KCkKLS8vJSVsbHUKLS8vJVBERE0tREVGSU5FIFNUUl9GT1JNQVRfSW50NjQoKQotLy8lJWxsZAotLy8lUERETS1ERUZJTkUgU1RSX0ZPUk1BVF9Cb29sKCkKLS8vJSVkCi0vLyVQRERNLURFRklORSBTVFJfRk9STUFUX0Zsb2F0KCkKLS8vJSVmCi0vLyVQRERNLURFRklORSBTVFJfRk9STUFUX0RvdWJsZSgpCi0vLyUlbGYKLQotLy8KLS8vIEhlbHBlcnMgZm9yIE9iamVjdHMKLS8vCi0KLS8vJVBERE0tREVGSU5FIFZBTFVFX0ZPUl9LRVlfT0JKRUNUKEtFWV9UWVBFLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBLSEVMUEVSKQotLy8lLSAoVkFMVUVfVFlQRSlvYmplY3RGb3JLZXk6KEtFWV9UWVBFKWtleSB7Ci0vLyUgIFZBTFVFX1RZUEUgcmVzdWx0ID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpXUkFQUEVEIyNLSEVMUEVSKGtleSldOwotLy8lICByZXR1cm4gcmVzdWx0OwotLy8lfQotLy8lUERETS1ERUZJTkUgV1JBUFBFRE9CSkVDVChWQUxVRSkKLS8vJVZBTFVFCi0vLyVQRERNLURFRklORSBVTldSQVBTdHJpbmcoVkFMVUUpCi0vLyVWQUxVRQotLy8lUERETS1ERUZJTkUgVU5XUkFQT2JqZWN0KFZBTFVFKQotLy8lVkFMVUUKLS8vJVBERE0tREVGSU5FIFRFWFRfRk9STUFUX09CSlN0cmluZyhWQUxVRSkKLS8vJVZBTFVFCi0vLyVQRERNLURFRklORSBURVhUX0ZPUk1BVF9PQkpPYmplY3QoVkFMVUUpCi0vLyVWQUxVRQotLy8lUERETS1ERUZJTkUgRU5VTV9UWVBFT0JKRUNUKFRZUEUpCi0vLyVFTlVNX1RZUEVPQkpFQ1RfIyNUWVBFKCkKLS8vJVBERE0tREVGSU5FIEVOVU1fVFlQRU9CSkVDVF9OU1N0cmluZygpCi0vLyVOU1N0cmluZyAqCi0vLyVQRERNLURFRklORSBFTlVNX1RZUEVPQkpFQ1RfaWQoKQotLy8laWQgIyMKLS8vJVBERE0tREVGSU5FIE5FUV9PQkpFQ1QoVkFMMSwgVkFMMikKLS8vJSFbVkFMMSBpc0VxdWFsOlZBTDJdCi0vLyVQRERNLURFRklORSBFWFRSQV9NRVRIT0RTX09CSkVDVChLRVlfTkFNRSwgVkFMVUVfTkFNRSkKLS8vJS0gKEJPT0wpaXNJbml0aWFsaXplZCB7Ci0vLyUgIGZvciAoR1BCTWVzc2FnZSAqbXNnIGluIFtfZGljdGlvbmFyeSBvYmplY3RFbnVtZXJhdG9yXSkgewotLy8lICAgIGlmICghbXNnLmluaXRpYWxpemVkKSB7Ci0vLyUgICAgICByZXR1cm4gTk87Ci0vLyUgICAgfQotLy8lICB9Ci0vLyUgIHJldHVybiBZRVM7Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlkZWVwQ29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLS8vJSAgR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSAqbmV3RGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotLy8lICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oaWQgYUtleSwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKm1zZywKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotLy8lICAgIEdQQk1lc3NhZ2UgKmNvcGllZE1zZyA9IFttc2cgY29weVdpdGhab25lOnpvbmVdOwotLy8lICAgIFtuZXdEaWN0LT5fZGljdGlvbmFyeSBzZXRPYmplY3Q6Y29waWVkTXNnIGZvcktleTphS2V5XTsKLS8vJSAgICBbY29waWVkTXNnIHJlbGVhc2VdOwotLy8lICB9XTsKLS8vJSAgcmV0dXJuIG5ld0RpY3Q7Ci0vLyV9Ci0vLyUKLS8vJQotLy8lUERETS1ERUZJTkUgQk9PTF9FWFRSQV9NRVRIT0RTX09CSkVDVChLRVlfTkFNRSwgVkFMVUVfTkFNRSkKLS8vJS0gKEJPT0wpaXNJbml0aWFsaXplZCB7Ci0vLyUgIGlmIChfdmFsdWVzWzBdICYmICFbX3ZhbHVlc1swXSBpc0luaXRpYWxpemVkXSkgewotLy8lICAgIHJldHVybiBOTzsKLS8vJSAgfQotLy8lICBpZiAoX3ZhbHVlc1sxXSAmJiAhW192YWx1ZXNbMV0gaXNJbml0aWFsaXplZF0pIHsKLS8vJSAgICByZXR1cm4gTk87Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIFlFUzsKLS8vJX0KLS8vJQotLy8lLSAoaW5zdGFuY2V0eXBlKWRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotLy8lICBHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5ICpuZXdEaWN0ID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0vLyUgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0vLyUgICAgaWYgKF92YWx1ZXNbaV0gIT0gbmlsKSB7Ci0vLyUgICAgICBuZXdEaWN0LT5fdmFsdWVzW2ldID0gW192YWx1ZXNbaV0gY29weVdpdGhab25lOnpvbmVdOwotLy8lICAgIH0KLS8vJSAgfQotLy8lICByZXR1cm4gbmV3RGljdDsKLS8vJX0KLS8vJQotLy8lCi0vLyVQRERNLURFRklORSBTRVJJQUxfREFUQV9GT1JfRU5UUllfT0JKRUNUKEtFWV9OQU1FLCBWQUxVRV9OQU1FKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIEdQQlZBTFVFX09CSkVDVChWQUxVRV9OQU1FKQotLy8ldmFsdWVTdHJpbmcKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfVkFMSURBVEVfVkFMVUVfT0JKRUNUKFZBTFVFX05BTUUsIEVYVFJBX0lOREVOVCkKLS8vJSMjRVhUUkFfSU5ERU5UJFMjIyAgaWYgKCEjI1ZBTFVFX05BTUUpIHsKLS8vJSMjRVhUUkFfSU5ERU5UJFMjIyAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLS8vJSMjRVhUUkFfSU5ERU5UJFMjIyAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwgb2JqZWN0IHRvIGEgRGljdGlvbmFyeSJdOwotLy8lIyNFWFRSQV9JTkRFTlQkUyMjICB9Ci0vLyUKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfVkFMSURBVEVfS0VZX09CSkVDVChLRVlfTkFNRSwgRVhUUkFfSU5ERU5UKQotLy8lIyNFWFRSQV9JTkRFTlQkUyMjICBpZiAoISMjS0VZX05BTUUpIHsKLS8vJSMjRVhUUkFfSU5ERU5UJFMjIyAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLS8vJSMjRVhUUkFfSU5ERU5UJFMjIyAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwga2V5IHRvIGEgRGljdGlvbmFyeSJdOwotLy8lIyNFWFRSQV9JTkRFTlQkUyMjICB9Ci0vLyUKLQotLy8lUERETS1ERUZJTkUgQk9PTF9ESUNUX0hBU19TVE9SQUdFX09CSkVDVCgpCi0vLyBFbXB0eQotLy8lUERETS1ERUZJTkUgQk9PTF9ESUNUX0lOSVRTX09CSkVDVChWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoT2JqZWN0czooY29uc3QgVkFMVUVfVFlQRSBbXSlvYmplY3RzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotLy8lICBzZWxmID0gW3N1cGVyIGluaXRdOwotLy8lICBpZiAoc2VsZikgewotLy8lICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLS8vJSAgICAgIGlmICghb2JqZWN0c1tpXSkgewotLy8lICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLS8vJSAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIG9iamVjdCB0byBhIERpY3Rpb25hcnkiXTsKLS8vJSAgICAgIH0KLS8vJSAgICAgIGludCBpZHggPSBrZXlzW2ldID8gMSA6IDA7Ci0vLyUgICAgICBbX3ZhbHVlc1tpZHhdIHJlbGVhc2VdOwotLy8lICAgICAgX3ZhbHVlc1tpZHhdID0gKFZBTFVFX1RZUEUpW29iamVjdHNbaV0gcmV0YWluXTsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIHNlbGY7Ci0vLyV9Ci0vLyUKLS8vJS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2wjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLS8vJSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoT2JqZWN0czpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLS8vJSAgaWYgKHNlbGYpIHsKLS8vJSAgICBpZiAoZGljdGlvbmFyeSkgewotLy8lICAgICAgX3ZhbHVlc1swXSA9IFtkaWN0aW9uYXJ5LT5fdmFsdWVzWzBdIHJldGFpbl07Ci0vLyUgICAgICBfdmFsdWVzWzFdID0gW2RpY3Rpb25hcnktPl92YWx1ZXNbMV0gcmV0YWluXTsKLS8vJSAgICB9Ci0vLyUgIH0KLS8vJSAgcmV0dXJuIHNlbGY7Ci0vLyV9Ci0vLyVQRERNLURFRklORSBCT09MX0RJQ1RfREVBTExPQ09CSkVDVCgpCi0vLyUtICh2b2lkKWRlYWxsb2MgewotLy8lICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotLy8lICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0vLyUgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLS8vJSAgW192YWx1ZXNbMF0gcmVsZWFzZV07Ci0vLyUgIFtfdmFsdWVzWzFdIHJlbGVhc2VdOwotLy8lICBbc3VwZXIgZGVhbGxvY107Ci0vLyV9Ci0vLyVQRERNLURFRklORSBCT09MX0RJQ1RfV19IQVNPQkpFQ1QoSURYLCBSRUYpCi0vLyUoQk9PTF9ESUNUX0hBU09CSkVDVChJRFgsIFJFRikpCi0vLyVQRERNLURFRklORSBCT09MX0RJQ1RfSEFTT0JKRUNUKElEWCwgUkVGKQotLy8lUkVGIyNfdmFsdWVzW0lEWF0gIT0gbmlsCi0vLyVQRERNLURFRklORSBCT09MX1ZBTFVFX0ZPUl9LRVlfT0JKRUNUKFZBTFVFX1RZUEUpCi0vLyUtIChWQUxVRV9UWVBFKW9iamVjdEZvcktleTooQk9PTClrZXkgewotLy8lICByZXR1cm4gX3ZhbHVlc1trZXkgPyAxIDogMF07Ci0vLyV9Ci0vLyVQRERNLURFRklORSBCT09MX1NFVF9HUEJWQUxVRV9GT1JfS0VZX09CSkVDVChWQUxVRV9OQU1FLCBWQUxVRV9UWVBFLCBWaXNQKQotLy8lLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0vLyUgICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLS8vJSAgaW50IGlkeCA9IChrZXktPnZhbHVlQm9vbCA/IDEgOiAwKTsKLS8vJSAgW192YWx1ZXNbaWR4XSByZWxlYXNlXTsKLS8vJSAgX3ZhbHVlc1tpZHhdID0gW3ZhbHVlLT52YWx1ZVN0cmluZyByZXRhaW5dOwotLy8lfQotCi0vLyVQRERNLURFRklORSBCT09MX0RJQ1RfTVVUQVRJT05TX09CSkVDVChWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkJvb2wjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotLy8lICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0vLyUgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLS8vJSAgICAgIGlmIChvdGhlckRpY3Rpb25hcnktPl92YWx1ZXNbaV0gIT0gbmlsKSB7Ci0vLyUgICAgICAgIFtfdmFsdWVzW2ldIHJlbGVhc2VdOwotLy8lICAgICAgICBfdmFsdWVzW2ldID0gW290aGVyRGljdGlvbmFyeS0+X3ZhbHVlc1tpXSByZXRhaW5dOwotLy8lICAgICAgfQotLy8lICAgIH0KLS8vJSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0vLyUgICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotLy8lICAgIH0KLS8vJSAgfQotLy8lfQotLy8lCi0vLyUtICh2b2lkKXNldE9iamVjdDooVkFMVUVfVFlQRSlvYmplY3QgZm9yS2V5OihCT09MKWtleSB7Ci0vLyUgIGlmICghb2JqZWN0KSB7Ci0vLyUgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0vLyUgICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIG9iamVjdCB0byBhIERpY3Rpb25hcnkiXTsKLS8vJSAgfQotLy8lICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLS8vJSAgW192YWx1ZXNbaWR4XSByZWxlYXNlXTsKLS8vJSAgX3ZhbHVlc1tpZHhdID0gW29iamVjdCByZXRhaW5dOwotLy8lICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0vLyUgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLS8vJSAgfQotLy8lfQotLy8lCi0vLyUtICh2b2lkKXJlbW92ZU9iamVjdEZvcktleTooQk9PTClhS2V5IHsKLS8vJSAgaW50IGlkeCA9IChhS2V5ID8gMSA6IDApOwotLy8lICBbX3ZhbHVlc1tpZHhdIHJlbGVhc2VdOwotLy8lICBfdmFsdWVzW2lkeF0gPSBuaWw7Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpcmVtb3ZlQWxsIHsKLS8vJSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLS8vJSAgICBbX3ZhbHVlc1tpXSByZWxlYXNlXTsKLS8vJSAgICBfdmFsdWVzW2ldID0gbmlsOwotLy8lICB9Ci0vLyV9Ci0vLyVQRERNLURFRklORSBTVFJfRk9STUFUX09CSkVDVChWQUxVRV9OQU1FKQotLy8lJUAKLQotCi0vLyVQRERNLUVYUEFORCBESUNUSU9OQVJZX0lNUExfRk9SX1BPRF9LRVkoVUludDMyLCB1aW50MzJfdCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gVUludDMyCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyVUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyVUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDMyX3Qga2V5LCB1aW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVVSW50MzIpIGZvcktleTpAKGtleS0+dmFsdWVVSW50MzIpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3Qga2V5LCB1aW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXUiLCBrZXldLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1IiwgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQzMl90KWtleSB2YWx1ZToodWludDMyX3QgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIHVuc2lnbmVkSW50VmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOih1aW50MzJfdCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQzMl90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gSW50MzIKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDMySW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIFthVmFsdWUgaW50VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0VUludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0SW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlSW50MzIpIGZvcktleTpAKGtleS0+dmFsdWVVSW50MzIpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIldSIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWQiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDMyX3Qpa2V5IHZhbHVlOihpbnQzMl90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCBpbnRWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQzMl90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gVUludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyVUludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyVUludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDMyX3Qga2V5LCB1aW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIFthVmFsdWUgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthVmFsdWUgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RVSW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZVVJbnQ2NCkgZm9yS2V5OkAoa2V5LT52YWx1ZVVJbnQzMildOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBrZXksIHVpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIldSIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsdSIsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50MzJfdClrZXkgdmFsdWU6KHVpbnQ2NF90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCB1bnNpZ25lZExvbmdMb25nVmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOih1aW50NjRfdCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQzMl90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gSW50NjQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDMySW50NjREaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgaW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FWYWx1ZSBsb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0VUludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0SW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVJbnQ2NCkgZm9yS2V5OkAoa2V5LT52YWx1ZVVJbnQzMildOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBrZXksIGludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1Iiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQzMl90KWtleSB2YWx1ZTooaW50NjRfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgbG9uZ0xvbmdWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50NjRfdCl2YWx1ZSBmb3JLZXk6KHVpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQzMl90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gQm9vbAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDMyQm9vbERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihCT09MKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyQm9vbERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyQm9vbERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCVUludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJVSW50MzJCb29sRGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50MzJfdCBrZXksIEJPT0wgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBbYVZhbHVlIGJvb2xWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoW2FWYWx1ZSBib29sVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoW2FWYWx1ZSBib29sVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RCb29sRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGJvb2xWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVCb29sKSBmb3JLZXk6QChrZXktPnZhbHVlVUludDMyKV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGtleSwgQk9PTCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXUiLCBrZXldLCAodmFsdWUgPyBAInRydWUiIDogQCJmYWxzZSIpKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQzMl90KWtleSB2YWx1ZTooQk9PTCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgYm9vbFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50MzJCb29sRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KEJPT0wpdmFsdWUgZm9yS2V5Oih1aW50MzJfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50MzJfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDMyIC0+IEZsb2F0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihmbG9hdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQzMl90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50MzJfdCBrZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSB1bnNpZ25lZEludFZhbHVlXSwgW2FWYWx1ZSBmbG9hdFZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RmxvYXRGaWVsZFNpemUoW2FWYWx1ZSBmbG9hdFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RGbG9hdEZpZWxkU2l6ZShbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RGbG9hdEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBmbG9hdFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUZsb2F0KSBmb3JLZXk6QChrZXktPnZhbHVlVUludDMyKV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1Iiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlLipnIiwgRkxUX0RJRywgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQzMl90KWtleSB2YWx1ZTooZmxvYXQgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIGZsb2F0VmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGZsb2F0KXZhbHVlIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDMyX3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMiAtPiBEb3VibGUKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihkb3VibGUpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50MzJfdCBrZXksIGRvdWJsZSB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIFthVmFsdWUgZG91YmxlVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3REb3VibGVGaWVsZFNpemUoW2FWYWx1ZSBkb3VibGVWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RG91YmxlRmllbGRTaXplKFthVmFsdWUgZG91YmxlVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3REb3VibGVGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgZG91YmxlVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRG91YmxlKSBmb3JLZXk6QChrZXktPnZhbHVlVUludDMyKV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIldSIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJS4qbGciLCBEQkxfRElHLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDMyX3Qpa2V5IHZhbHVlOihkb3VibGUgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIGRvdWJsZVZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooZG91YmxlKXZhbHVlIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDMyX3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQzMiAtPiBFbnVtCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci0gIEdQQkVudW1WYWxpZGF0aW9uRnVuYyBfdmFsaWRhdGlvbkZ1bmM7Ci19Ci0KLUBzeW50aGVzaXplIHZhbGlkYXRpb25GdW5jID0gX3ZhbGlkYXRpb25GdW5jOwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWU6KGludDMyX3QpcmF3VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyRW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZyYXdWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXJhd1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6cmF3VmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMyRW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyRW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYyBjYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpOVUxMIHJhd1ZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYyB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jIHJhd1ZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXJhd1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBfdmFsaWRhdGlvbkZ1bmMgPSAoZnVuYyAhPSBOVUxMID8gZnVuYyA6IERpY3REZWZhdWx0X0lzVmFsaWRWYWx1ZSk7Ci0gICAgaWYgKGNvdW50ICYmIHJhd1ZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QChyYXdWYWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpkaWN0aW9uYXJ5LnZhbGlkYXRpb25GdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIFthVmFsdWUgaW50VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RFbnVtRmllbGRTaXplKFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZEludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUoW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdFVJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEVudW1GaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tIChOU0RhdGEgKilzZXJpYWxpemVkRGF0YUZvclVua25vd25WYWx1ZTooaW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RGF0YVR5cGU6KEdQQkRhdGFUeXBlKWtleURhdGFUeXBlIHsKLSAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShrZXktPnZhbHVlVUludDMyLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUodmFsdWUsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUVudW0pOwotICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6bXNnU2l6ZV07Ci0gIEdQQkNvZGVkT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0gPSBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIFdyaXRlRGljdFVJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwga2V5LT52YWx1ZVVJbnQzMiwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gIFdyaXRlRGljdEVudW1GaWVsZChvdXRwdXRTdHJlYW0sIHZhbHVlLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVFbnVtKTsKLSAgW291dHB1dFN0cmVhbSByZWxlYXNlXTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRW51bSkgZm9yS2V5OkAoa2V5LT52YWx1ZVVJbnQzMildOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1Iiwga2V5XSwgQCh2YWx1ZSkpOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDMyX3Qpa2V5IHZhbHVlOihpbnQzMl90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICBpbnQzMl90IHJlc3VsdCA9IFt3cmFwcGVkIGludFZhbHVlXTsKLSAgICBpZiAoIV92YWxpZGF0aW9uRnVuYyhyZXN1bHQpKSB7Ci0gICAgICByZXN1bHQgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotICAgIH0KLSAgICAqdmFsdWUgPSByZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50MzJfdClrZXkgcmF3VmFsdWU6KGludDMyX3QgKilyYXdWYWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiByYXdWYWx1ZSkgewotICAgICpyYXdWYWx1ZSA9IFt3cmFwcGVkIGludFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZnVuYyA9IF92YWxpZGF0aW9uRnVuYzsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGludDMyX3QgdW53cmFwcGVkID0gW2FWYWx1ZSBpbnRWYWx1ZV07Ci0gICAgICBpZiAoIWZ1bmModW53cmFwcGVkKSkgewotICAgICAgICB1bndyYXBwZWQgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotICAgICAgfQotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIHVud3JhcHBlZCwgc3RvcCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKWFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDMyRW51bURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFJhd1ZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDMyX3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgaWYgKCFfdmFsaWRhdGlvbkZ1bmModmFsdWUpKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiR1BCVUludDMyRW51bURpY3Rpb25hcnk6IEF0dGVtcHQgdG8gc2V0IGFuIHVua25vd24gZW51bSB2YWx1ZSAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVdOwotICB9Ci0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gT2JqZWN0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0OihpZClvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoT2JqZWN0czpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6Jm9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0czooY29uc3QgaWQgW10pb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aE9iamVjdHM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhPYmplY3RzOm9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoT2JqZWN0czpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoT2JqZWN0czooY29uc3QgaWQgW10pb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiBvYmplY3RzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKCFvYmplY3RzW2ldKSB7Ci0gICAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIG9iamVjdCB0byBhIERpY3Rpb25hcnkiXTsKLSAgICAgICAgfQotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0Om9iamVjdHNbaV0gZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aE9iamVjdHM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQzMl90IGtleSwgaWQgb2JqZWN0LCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIGFPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSB1bnNpZ25lZEludFZhbHVlXSwgYU9iamVjdCwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChCT09MKWlzSW5pdGlhbGl6ZWQgewotICBmb3IgKEdQQk1lc3NhZ2UgKm1zZyBpbiBbX2RpY3Rpb25hcnkgb2JqZWN0RW51bWVyYXRvcl0pIHsKLSAgICBpZiAoIW1zZy5pbml0aWFsaXplZCkgewotICAgICAgcmV0dXJuIE5POwotICAgIH0KLSAgfQotICByZXR1cm4gWUVTOwotfQotCi0tIChpbnN0YW5jZXR5cGUpZGVlcENvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgKm5ld0RpY3QgPQotICAgICAgW1tHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKGlkIGFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICptc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBHUEJNZXNzYWdlICpjb3BpZWRNc2cgPSBbbXNnIGNvcHlXaXRoWm9uZTp6b25lXTsKLSAgICBbbmV3RGljdC0+X2RpY3Rpb25hcnkgc2V0T2JqZWN0OmNvcGllZE1zZyBmb3JLZXk6YUtleV07Ci0gICAgW2NvcGllZE1zZyByZWxlYXNlXTsKLSAgfV07Ci0gIHJldHVybiBuZXdEaWN0OwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIGFPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0T2JqZWN0RmllbGRTaXplKGFPYmplY3QsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgYU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthS2V5IHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0T2JqZWN0RmllbGRTaXplKGFPYmplY3QsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdFVJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdE9iamVjdEZpZWxkKG91dHB1dFN0cmVhbSwgYU9iamVjdCwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDp2YWx1ZS0+dmFsdWVTdHJpbmcgZm9yS2V5OkAoa2V5LT52YWx1ZVVJbnQzMildOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4odWludDMyX3Qga2V5LCBpZCBvYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1Iiwga2V5XSwgb2JqZWN0KTsKLSAgfV07Ci19Ci0KLS0gKGlkKW9iamVjdEZvcktleToodWludDMyX3Qpa2V5IHsKLSAgaWQgcmVzdWx0ID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0T2JqZWN0OihpZClvYmplY3QgZm9yS2V5Oih1aW50MzJfdClrZXkgewotICBpZiAoIW9iamVjdCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBvYmplY3QgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpvYmplY3QgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlT2JqZWN0Rm9yS2V5Oih1aW50MzJfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9JTVBMX0ZPUl9QT0RfS0VZKEludDMyLCBpbnQzMl90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEludDMyIC0+IFVJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDMyVUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDMyVUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIHVpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBpbnRWYWx1ZV0sIFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVVSW50MzIpIGZvcktleTpAKGtleS0+dmFsdWVJbnQzMildOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGtleSwgdWludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVkIiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIldSIsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZToodWludDMyX3QgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIHVuc2lnbmVkSW50VmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KHVpbnQzMl90KXZhbHVlIGZvcktleTooaW50MzJfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQzMl90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDMySW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJJbnQzMkludDMyRGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgaW50VmFsdWVdLCBbYVZhbHVlIGludFZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUludDMyKSBmb3JLZXk6QChrZXktPnZhbHVlSW50MzIpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVkIiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlZCIsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZTooaW50MzJfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgaW50VmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDMyX3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50MzJfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gVUludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOih1aW50NjRfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDMyX3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyVUludDY0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQzMl90IGtleSwgdWludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IGludFZhbHVlXSwgW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdFVJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlVUludDY0KSBmb3JLZXk6QChrZXktPnZhbHVlSW50MzIpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBrZXksIHVpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlZCIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsdSIsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZToodWludDY0X3QgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZToodWludDY0X3QpdmFsdWUgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDMyX3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDMyIC0+IEludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMkludDY0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDMySW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDMySW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMySW50NjREaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBpbnRWYWx1ZV0sIFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FWYWx1ZSBsb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0SW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0SW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVJbnQ2NCkgZm9yS2V5OkAoa2V5LT52YWx1ZUludDMyKV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3Qga2V5LCBpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlZCIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsZCIsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZTooaW50NjRfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgbG9uZ0xvbmdWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihpbnQ2NF90KXZhbHVlIGZvcktleTooaW50MzJfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQzMl90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBCb29sCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooQk9PTCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDMyX3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJCb29sRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDMyQm9vbERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCSW50MzJCb29sRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyQm9vbERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIEJPT0wgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IGludFZhbHVlXSwgW2FWYWx1ZSBib29sVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKFthVmFsdWUgYm9vbFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKFthVmFsdWUgYm9vbFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0SW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0Qm9vbEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBib29sVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlQm9vbCkgZm9yS2V5OkAoa2V5LT52YWx1ZUludDMyKV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3Qga2V5LCBCT09MIHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlZCIsIGtleV0sICh2YWx1ZSA/IEAidHJ1ZSIgOiBAImZhbHNlIikpOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50MzJfdClrZXkgdmFsdWU6KEJPT0wgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIGJvb2xWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJCb29sRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KEJPT0wpdmFsdWUgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDMyX3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDMyIC0+IEZsb2F0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGZsb2F0KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBmbG9hdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDMyRmxvYXREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJGbG9hdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyRmxvYXREaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDMyX3Qga2V5LCBmbG9hdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgaW50VmFsdWVdLCBbYVZhbHVlIGZsb2F0VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RGbG9hdEZpZWxkU2l6ZShbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEZsb2F0RmllbGRTaXplKFthVmFsdWUgZmxvYXRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEZsb2F0RmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRmxvYXQpIGZvcktleTpAKGtleS0+dmFsdWVJbnQzMildOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGtleSwgZmxvYXQgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVkIiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlLipnIiwgRkxUX0RJRywgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDMyX3Qpa2V5IHZhbHVlOihmbG9hdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgZmxvYXRWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihmbG9hdCl2YWx1ZSBmb3JLZXk6KGludDMyX3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50MzJfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gRG91YmxlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihkb3VibGUpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDMyRG91YmxlRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDMyRG91YmxlRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQzMl90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyRG91YmxlRGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQzMl90IGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBpbnRWYWx1ZV0sIFthVmFsdWUgZG91YmxlVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3REb3VibGVGaWVsZFNpemUoW2FWYWx1ZSBkb3VibGVWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RG91YmxlRmllbGRTaXplKFthVmFsdWUgZG91YmxlVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3REb3VibGVGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgZG91YmxlVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRG91YmxlKSBmb3JLZXk6QChrZXktPnZhbHVlSW50MzIpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBrZXksIGRvdWJsZSB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWQiLCBrZXldLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiUuKmxnIiwgREJMX0RJRywgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDMyX3Qpa2V5IHZhbHVlOihkb3VibGUgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIGRvdWJsZVZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihkb3VibGUpdmFsdWUgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDMyX3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDMyIC0+IEVudW0KLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyRW51bURpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgX3ZhbGlkYXRpb25GdW5jOwotfQotCi1Ac3ludGhlc2l6ZSB2YWxpZGF0aW9uRnVuYyA9IF92YWxpZGF0aW9uRnVuYzsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDMyX3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczomcmF3VmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pcmF3VmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpyYXdWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkVudW1EaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgY2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246TlVMTCByYXdWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYyByYXdWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczooY29uc3QgaW50MzJfdCBbXSlyYXdWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBfdmFsaWRhdGlvbkZ1bmMgPSAoZnVuYyAhPSBOVUxMID8gZnVuYyA6IERpY3REZWZhdWx0X0lzVmFsaWRWYWx1ZSk7Ci0gICAgaWYgKGNvdW50ICYmIHJhd1ZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QChyYXdWYWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDMyRW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmRpY3Rpb25hcnkudmFsaWRhdGlvbkZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYyByYXdWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyRW51bURpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IGludFZhbHVlXSwgW2FWYWx1ZSBpbnRWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUoW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RW51bUZpZWxkU2l6ZShbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0SW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IGludFZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0RW51bUZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKE5TRGF0YSAqKXNlcmlhbGl6ZWREYXRhRm9yVW5rbm93blZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlEYXRhVHlwZTooR1BCRGF0YVR5cGUpa2V5RGF0YVR5cGUgewotICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoa2V5LT52YWx1ZUludDMyLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUodmFsdWUsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUVudW0pOwotICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6bXNnU2l6ZV07Ci0gIEdQQkNvZGVkT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0gPSBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBrZXktPnZhbHVlSW50MzIsIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICBXcml0ZURpY3RFbnVtRmllbGQob3V0cHV0U3RyZWFtLCB2YWx1ZSwga01hcFZhbHVlRmllbGROdW1iZXIsIEdQQkRhdGFUeXBlRW51bSk7Ci0gIFtvdXRwdXRTdHJlYW0gcmVsZWFzZV07Ci0gIHJldHVybiBkYXRhOwotfQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUVudW0pIGZvcktleTpAKGtleS0+dmFsdWVJbnQzMildOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWQiLCBrZXldLCBAKHZhbHVlKSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQzMl90KWtleSB2YWx1ZTooaW50MzJfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgaW50MzJfdCByZXN1bHQgPSBbd3JhcHBlZCBpbnRWYWx1ZV07Ci0gICAgaWYgKCFfdmFsaWRhdGlvbkZ1bmMocmVzdWx0KSkgewotICAgICAgcmVzdWx0ID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLSAgICB9Ci0gICAgKnZhbHVlID0gcmVzdWx0OwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50MzJfdClrZXkgcmF3VmFsdWU6KGludDMyX3QgKilyYXdWYWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiByYXdWYWx1ZSkgewotICAgICpyYXdWYWx1ZSA9IFt3cmFwcGVkIGludFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDMyX3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIEdQQkVudW1WYWxpZGF0aW9uRnVuYyBmdW5jID0gX3ZhbGlkYXRpb25GdW5jOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgaW50MzJfdCB1bndyYXBwZWQgPSBbYVZhbHVlIGludFZhbHVlXTsKLSAgICAgIGlmICghZnVuYyh1bndyYXBwZWQpKSB7Ci0gICAgICAgIHVud3JhcHBlZCA9IGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWU7Ci0gICAgICB9Ci0gICAgICBibG9jayhbYUtleSBpbnRWYWx1ZV0sIHVud3JhcHBlZCwgc3RvcCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKWFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0UmF3VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDMyX3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooaW50MzJfdClrZXkgewotICBpZiAoIV92YWxpZGF0aW9uRnVuYyh2YWx1ZSkpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJHUEJJbnQzMkVudW1EaWN0aW9uYXJ5OiBBdHRlbXB0IHRvIHNldCBhbiB1bmtub3duIGVudW0gdmFsdWUgKCVkKSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlXTsKLSAgfQotCi0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gT2JqZWN0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhPYmplY3Q6KGlkKW9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQzMl90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aE9iamVjdHM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6Jm9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aE9iamVjdHM6KGNvbnN0IGlkIFtdKW9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aE9iamVjdHM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6b2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aE9iamVjdHM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aE9iamVjdHM6KGNvbnN0IGlkIFtdKW9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiBvYmplY3RzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKCFvYmplY3RzW2ldKSB7Ci0gICAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIG9iamVjdCB0byBhIERpY3Rpb25hcnkiXTsKLSAgICAgICAgfQotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0Om9iamVjdHNbaV0gZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aE9iamVjdHM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoT2JqZWN0czpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDMyT2JqZWN0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyT2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50MzJfdCBrZXksIGlkIG9iamVjdCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBhT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgaW50VmFsdWVdLCBhT2JqZWN0LCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpaXNJbml0aWFsaXplZCB7Ci0gIGZvciAoR1BCTWVzc2FnZSAqbXNnIGluIFtfZGljdGlvbmFyeSBvYmplY3RFbnVtZXJhdG9yXSkgewotICAgIGlmICghbXNnLmluaXRpYWxpemVkKSB7Ci0gICAgICByZXR1cm4gTk87Ci0gICAgfQotICB9Ci0gIHJldHVybiBZRVM7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlkZWVwQ29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5ICpuZXdEaWN0ID0KLSAgICAgIFtbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKGlkIGFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICptc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBHUEJNZXNzYWdlICpjb3BpZWRNc2cgPSBbbXNnIGNvcHlXaXRoWm9uZTp6b25lXTsKLSAgICBbbmV3RGljdC0+X2RpY3Rpb25hcnkgc2V0T2JqZWN0OmNvcGllZE1zZyBmb3JLZXk6YUtleV07Ci0gICAgW2NvcGllZE1zZyByZWxlYXNlXTsKLSAgfV07Ci0gIHJldHVybiBuZXdEaWN0OwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIGFPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0T2JqZWN0RmllbGRTaXplKGFPYmplY3QsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgYU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FLZXkgaW50VmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0T2JqZWN0RmllbGRTaXplKGFPYmplY3QsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSBpbnRWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdE9iamVjdEZpZWxkKG91dHB1dFN0cmVhbSwgYU9iamVjdCwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDp2YWx1ZS0+dmFsdWVTdHJpbmcgZm9yS2V5OkAoa2V5LT52YWx1ZUludDMyKV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihpbnQzMl90IGtleSwgaWQgb2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlZCIsIGtleV0sIG9iamVjdCk7Ci0gIH1dOwotfQotCi0tIChpZClvYmplY3RGb3JLZXk6KGludDMyX3Qpa2V5IHsKLSAgaWQgcmVzdWx0ID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRPYmplY3Q6KGlkKW9iamVjdCBmb3JLZXk6KGludDMyX3Qpa2V5IHsKLSAgaWYgKCFvYmplY3QpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwgb2JqZWN0IHRvIGEgRGljdGlvbmFyeSJdOwotICB9Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6b2JqZWN0IGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZU9iamVjdEZvcktleTooaW50MzJfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9JTVBMX0ZPUl9QT0RfS0VZKFVJbnQ2NCwgdWludDY0X3QpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IFVJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDY0VUludDMyRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KHVpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDY0X3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0VUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQ2NF90IGtleSwgdWludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FWYWx1ZSB1bnNpZ25lZEludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0VUludDY0RmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RVSW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVVSW50MzIpIGZvcktleTpAKGtleS0+dmFsdWVVSW50NjQpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3Qga2V5LCB1aW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsdSIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXUiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOih1aW50MzJfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgdW5zaWduZWRJbnRWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KHVpbnQzMl90KXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDY0X3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NCAtPiBJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBbYVZhbHVlIGludFZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUludDMyKSBmb3JLZXk6QChrZXktPnZhbHVlVUludDY0KV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsdSIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWQiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOihpbnQzMl90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCBpbnRWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KHVpbnQ2NF90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQ2NF90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gVUludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0VUludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0VUludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCB1aW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdFVJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlVUludDY0KSBmb3JLZXk6QChrZXktPnZhbHVlVUludDY0KV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGtleSwgdWludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbHUiLCBrZXldLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbHUiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOih1aW50NjRfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZToodWludDY0X3QpdmFsdWUgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IEludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQ2NF90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDY0X3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0SW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgdWludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0SW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCVUludDY0SW50NjREaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQlVJbnQ2NEludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50NjRfdCBrZXksIGludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FWYWx1ZSBsb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdFVJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0SW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVJbnQ2NCkgZm9yS2V5OkAoa2V5LT52YWx1ZVVJbnQ2NCldOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBrZXksIGludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbHUiLCBrZXldLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbGQiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOihpbnQ2NF90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCBsb25nTG9uZ1ZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihpbnQ2NF90KXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleToodWludDY0X3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NCAtPiBCb29sCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRCb29sRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KEJPT0wpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjRCb29sRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjRCb29sRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0Qm9vbERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IEJPT0wgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJVSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJVSW50NjRCb29sRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQ2NF90IGtleSwgQk9PTCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSBib29sVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoW2FWYWx1ZSBib29sVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZShbYVZhbHVlIGJvb2xWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdFVJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0Qm9vbEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBib29sVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlQm9vbCkgZm9yS2V5OkAoa2V5LT52YWx1ZVVJbnQ2NCldOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBrZXksIEJPT0wgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbHUiLCBrZXldLCAodmFsdWUgPyBAInRydWUiIDogQCJmYWxzZSIpKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KHVpbnQ2NF90KWtleSB2YWx1ZTooQk9PTCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgYm9vbFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50NjRCb29sRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KEJPT0wpdmFsdWUgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IEZsb2F0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihmbG9hdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KHVpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKSh1aW50NjRfdCBrZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBbYVZhbHVlIGZsb2F0VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEZsb2F0RmllbGRTaXplKFthVmFsdWUgZmxvYXRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RGbG9hdEZpZWxkU2l6ZShbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RVSW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEZsb2F0RmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRmxvYXQpIGZvcktleTpAKGtleS0+dmFsdWVVSW50NjQpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3Qga2V5LCBmbG9hdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsdSIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJS4qZyIsIEZMVF9ESUcsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50NjRfdClrZXkgdmFsdWU6KGZsb2F0ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCBmbG9hdFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihmbG9hdCl2YWx1ZSBmb3JLZXk6KHVpbnQ2NF90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KHVpbnQ2NF90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gRG91YmxlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooZG91YmxlKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleToodWludDY0X3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBkb3VibGUgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCBkb3VibGUgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIFthVmFsdWUgZG91YmxlVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdERvdWJsZUZpZWxkU2l6ZShbYVZhbHVlIGRvdWJsZVZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdERvdWJsZUZpZWxkU2l6ZShbYVZhbHVlIGRvdWJsZVZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0VUludDY0RmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3REb3VibGVGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgZG91YmxlVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRG91YmxlKSBmb3JLZXk6QChrZXktPnZhbHVlVUludDY0KV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGx1Iiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlLipsZyIsIERCTF9ESUcsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50NjRfdClrZXkgdmFsdWU6KGRvdWJsZSAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgZG91YmxlVmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihkb3VibGUpdmFsdWUgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IEVudW0KLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLSAgR1BCRW51bVZhbGlkYXRpb25GdW5jIF92YWxpZGF0aW9uRnVuYzsKLX0KLQotQHN5bnRoZXNpemUgdmFsaWRhdGlvbkZ1bmMgPSBfdmFsaWRhdGlvbkZ1bmM7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTooaW50MzJfdClyYXdWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjRFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6JnJhd1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pcmF3VmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpyYXdWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJVSW50NjRFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jIGNhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOk5VTEwgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pcmF3VmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IHVpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIF92YWxpZGF0aW9uRnVuYyA9IChmdW5jICE9IE5VTEwgPyBmdW5jIDogRGljdERlZmF1bHRfSXNWYWxpZFZhbHVlKTsKLSAgICBpZiAoY291bnQgJiYgcmF3VmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHJhd1ZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCVUludDY0RW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmRpY3Rpb25hcnkudmFsaWRhdGlvbkZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYyByYXdWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDY0RW51bURpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBbYVZhbHVlIGludFZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RFbnVtRmllbGRTaXplKFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RW51bUZpZWxkU2l6ZShbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0VUludDY0RmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RFbnVtRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAoTlNEYXRhICopc2VyaWFsaXplZERhdGFGb3JVbmtub3duVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleURhdGFUeXBlOihHUEJEYXRhVHlwZSlrZXlEYXRhVHlwZSB7Ci0gIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoa2V5LT52YWx1ZVVJbnQ2NCwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RFbnVtRmllbGRTaXplKHZhbHVlLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVFbnVtKTsKLSAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOm1zZ1NpemVdOwotICBHUEJDb2RlZE91dHB1dFN0cmVhbSAqb3V0cHV0U3RyZWFtID0gW1tHUEJDb2RlZE91dHB1dFN0cmVhbSBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGFdOwotICBXcml0ZURpY3RVSW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIGtleS0+dmFsdWVVSW50NjQsIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICBXcml0ZURpY3RFbnVtRmllbGQob3V0cHV0U3RyZWFtLCB2YWx1ZSwga01hcFZhbHVlRmllbGROdW1iZXIsIEdQQkRhdGFUeXBlRW51bSk7Ci0gIFtvdXRwdXRTdHJlYW0gcmVsZWFzZV07Ci0gIHJldHVybiBkYXRhOwotfQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUVudW0pIGZvcktleTpAKGtleS0+dmFsdWVVSW50NjQpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRSYXdWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGx1Iiwga2V5XSwgQCh2YWx1ZSkpOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleToodWludDY0X3Qpa2V5IHZhbHVlOihpbnQzMl90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICBpbnQzMl90IHJlc3VsdCA9IFt3cmFwcGVkIGludFZhbHVlXTsKLSAgICBpZiAoIV92YWxpZGF0aW9uRnVuYyhyZXN1bHQpKSB7Ci0gICAgICByZXN1bHQgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotICAgIH0KLSAgICAqdmFsdWUgPSByZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5Oih1aW50NjRfdClrZXkgcmF3VmFsdWU6KGludDMyX3QgKilyYXdWYWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiByYXdWYWx1ZSkgewotICAgICpyYXdWYWx1ZSA9IFt3cmFwcGVkIGludFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKHVpbnQ2NF90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZnVuYyA9IF92YWxpZGF0aW9uRnVuYzsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGludDMyX3QgdW53cmFwcGVkID0gW2FWYWx1ZSBpbnRWYWx1ZV07Ci0gICAgICBpZiAoIWZ1bmModW53cmFwcGVkKSkgewotICAgICAgICB1bndyYXBwZWQgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotICAgICAgfQotICAgICAgYmxvY2soW2FLZXkgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwgdW53cmFwcGVkLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpYWRkUmF3RW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0UmF3VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5Oih1aW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICBpZiAoIV92YWxpZGF0aW9uRnVuYyh2YWx1ZSkpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJHUEJVSW50NjRFbnVtRGljdGlvbmFyeTogQXR0ZW1wdCB0byBzZXQgYW4gdW5rbm93biBlbnVtIHZhbHVlICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV07Ci0gIH0KLQotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NCAtPiBPYmplY3QKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhPYmplY3Q6KGlkKW9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhPYmplY3RzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoT2JqZWN0czomb2JqZWN0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhPYmplY3RzOihjb25zdCBpZCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoT2JqZWN0czpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6b2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPYmplY3RzOihjb25zdCBpZCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIG9iamVjdHMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBpZiAoIW9iamVjdHNbaV0pIHsKLSAgICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwgb2JqZWN0IHRvIGEgRGljdGlvbmFyeSJdOwotICAgICAgICB9Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6b2JqZWN0c1tpXSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aE9iamVjdHM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoT2JqZWN0czpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikodWludDY0X3Qga2V5LCBpZCBvYmplY3QsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgYU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGFPYmplY3QsIHN0b3ApOwotICB9XTsKLX0KLQotLSAoQk9PTClpc0luaXRpYWxpemVkIHsKLSAgZm9yIChHUEJNZXNzYWdlICptc2cgaW4gW19kaWN0aW9uYXJ5IG9iamVjdEVudW1lcmF0b3JdKSB7Ci0gICAgaWYgKCFtc2cuaW5pdGlhbGl6ZWQpIHsKLSAgICAgIHJldHVybiBOTzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIFlFUzsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICBHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5ICpuZXdEaWN0ID0KLSAgICAgIFtbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihpZCBhS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCTWVzc2FnZSAqbXNnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgR1BCTWVzc2FnZSAqY29waWVkTXNnID0gW21zZyBjb3B5V2l0aFpvbmU6em9uZV07Ci0gICAgW25ld0RpY3QtPl9kaWN0aW9uYXJ5IHNldE9iamVjdDpjb3BpZWRNc2cgZm9yS2V5OmFLZXldOwotICAgIFtjb3BpZWRNc2cgcmVsZWFzZV07Ci0gIH1dOwotICByZXR1cm4gbmV3RGljdDsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBhT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0T2JqZWN0RmllbGRTaXplKGFPYmplY3QsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgYU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthS2V5IHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RPYmplY3RGaWVsZFNpemUoYU9iamVjdCwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0VUludDY0RmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RPYmplY3RGaWVsZChvdXRwdXRTdHJlYW0sIGFPYmplY3QsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6dmFsdWUtPnZhbHVlU3RyaW5nIGZvcktleTpAKGtleS0+dmFsdWVVSW50NjQpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGtleSwgaWQgb2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGx1Iiwga2V5XSwgb2JqZWN0KTsKLSAgfV07Ci19Ci0KLS0gKGlkKW9iamVjdEZvcktleToodWludDY0X3Qpa2V5IHsKLSAgaWQgcmVzdWx0ID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0T2JqZWN0OihpZClvYmplY3QgZm9yS2V5Oih1aW50NjRfdClrZXkgewotICBpZiAoIW9iamVjdCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBvYmplY3QgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpvYmplY3QgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlT2JqZWN0Rm9yS2V5Oih1aW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9JTVBMX0ZPUl9QT0RfS0VZKEludDY0LCBpbnQ2NF90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IFVJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0VUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0VUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50NjRfdCBrZXksIHVpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBsb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSB1bnNpZ25lZEludFZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50MzJGaWVsZFNpemUoW2FWYWx1ZSB1bnNpZ25lZEludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShbYUtleSBsb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdFVJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSB1bnNpZ25lZEludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZVVJbnQzMikgZm9yS2V5OkAoa2V5LT52YWx1ZUludDY0KV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3Qga2V5LCB1aW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsZCIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJXUiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50NjRfdClrZXkgdmFsdWU6KHVpbnQzMl90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCB1bnNpZ25lZEludFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOih1aW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gSW50MzIKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDY0SW50MzJEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KGludDY0X3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQ2NEludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50NjRfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IGxvbmdMb25nVmFsdWVdLCBbYVZhbHVlIGludFZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShbYUtleSBsb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUludDMyKSBmb3JLZXk6QChrZXktPnZhbHVlSW50NjQpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbGQiLCBrZXldLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVkIiwgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDY0X3Qpa2V5IHZhbHVlOihpbnQzMl90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCBpbnRWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooaW50NjRfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQ2NF90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NCAtPiBVSW50NjQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDY0VUludDY0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KHVpbnQ2NF90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50NjRfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDY0VUludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0VUludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDY0VUludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCB1aW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIFthVmFsdWUgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0VUludDY0RmllbGRTaXplKFthVmFsdWUgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0SW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RVSW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZVVJbnQ2NCkgZm9yS2V5OkAoa2V5LT52YWx1ZUludDY0KV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3Qga2V5LCB1aW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsZCIsIGtleV0sIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsdSIsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQ2NF90KWtleSB2YWx1ZToodWludDY0X3QgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZToodWludDY0X3QpdmFsdWUgZm9yS2V5OihpbnQ2NF90KWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KGludDY0X3QpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6QChhS2V5KV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IEludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQ2NEludDY0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0SW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0SW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0SW50NjREaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCBpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBsb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSBsb25nTG9uZ1ZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShbYVZhbHVlIGxvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FWYWx1ZSBsb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0SW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBsb25nTG9uZ1ZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUludDY0KSBmb3JLZXk6QChrZXktPnZhbHVlSW50NjQpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBrZXksIGludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbGQiLCBrZXldLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbGQiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooaW50NjRfdClrZXkgdmFsdWU6KGludDY0X3QgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTpAKGtleSldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIGxvbmdMb25nVmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50NjRfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gQm9vbAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRCb29sRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KEJPT0wpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0Qm9vbERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IEJPT0wgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRCb29sRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRCb29sRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OkAoa2V5c1tpXSldOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCSW50NjRCb29sRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDY0Qm9vbERpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCBCT09MIHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBsb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSBib29sVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShbYUtleSBsb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoW2FWYWx1ZSBib29sVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZShbYVZhbHVlIGJvb2xWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdEludDY0RmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSBsb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0Qm9vbEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBib29sVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlQm9vbCkgZm9yS2V5OkAoa2V5LT52YWx1ZUludDY0KV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3Qga2V5LCBCT09MIHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwga2V5XSwgKHZhbHVlID8gQCJ0cnVlIiA6IEAiZmFsc2UiKSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQ2NF90KWtleSB2YWx1ZTooQk9PTCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgYm9vbFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooQk9PTCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gRmxvYXQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooZmxvYXQpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0RmxvYXREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0RmxvYXREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50NjRfdCBrZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBsb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSBmbG9hdFZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RGbG9hdEZpZWxkU2l6ZShbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RmxvYXRGaWVsZFNpemUoW2FWYWx1ZSBmbG9hdFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0SW50NjRGaWVsZChvdXRwdXRTdHJlYW0sIFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RGbG9hdEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBmbG9hdFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUZsb2F0KSBmb3JLZXk6QChrZXktPnZhbHVlSW50NjQpXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBrZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlLipnIiwgRkxUX0RJRywgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDY0X3Qpa2V5IHZhbHVlOihmbG9hdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgZmxvYXRWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihmbG9hdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6QChrZXkpXTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooaW50NjRfdClhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTpAKGFLZXkpXTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gRG91YmxlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihkb3VibGUpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0RG91YmxlRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0RG91YmxlRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShpbnQ2NF90IGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBsb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSBkb3VibGVWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RG91YmxlRmllbGRTaXplKFthVmFsdWUgZG91YmxlVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RG91YmxlRmllbGRTaXplKFthVmFsdWUgZG91YmxlVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdERvdWJsZUZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBkb3VibGVWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVEb3VibGUpIGZvcktleTpAKGtleS0+dmFsdWVJbnQ2NCldOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwga2V5XSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlLipsZyIsIERCTF9ESUcsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQ2NF90KWtleSB2YWx1ZTooZG91YmxlICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCBkb3VibGVWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooZG91YmxlKXZhbHVlIGZvcktleTooaW50NjRfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQ2NF90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NCAtPiBFbnVtCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLSAgR1BCRW51bVZhbGlkYXRpb25GdW5jIF92YWxpZGF0aW9uRnVuYzsKLX0KLQotQHN5bnRoZXNpemUgdmFsaWRhdGlvbkZ1bmMgPSBfdmFsaWRhdGlvbkZ1bmM7Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTooaW50MzJfdClyYXdWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihpbnQ2NF90KWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0RW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6JnJhd1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXJhd1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0RW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6cmF3VmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDY0RW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jIGNhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOk5VTEwgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pcmF3VmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgX3ZhbGlkYXRpb25GdW5jID0gKGZ1bmMgIT0gTlVMTCA/IGZ1bmMgOiBEaWN0RGVmYXVsdF9Jc1ZhbGlkVmFsdWUpOwotICAgIGlmIChjb3VudCAmJiByYXdWYWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAocmF3VmFsdWVzW2ldKSBmb3JLZXk6QChrZXlzW2ldKV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpkaWN0aW9uYXJ5LnZhbGlkYXRpb25GdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkludDY0RW51bURpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhbYUtleSBsb25nTG9uZ1ZhbHVlXSwgW2FWYWx1ZSBpbnRWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthS2V5IGxvbmdMb25nVmFsdWVdLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RW51bUZpZWxkU2l6ZShbYVZhbHVlIGludFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShbYUtleSBsb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUoW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdEludDY0RmllbGQob3V0cHV0U3RyZWFtLCBbYUtleSBsb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0RW51bUZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKE5TRGF0YSAqKXNlcmlhbGl6ZWREYXRhRm9yVW5rbm93blZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlEYXRhVHlwZTooR1BCRGF0YVR5cGUpa2V5RGF0YVR5cGUgewotICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoa2V5LT52YWx1ZUludDY0LCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUodmFsdWUsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUVudW0pOwotICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6bXNnU2l6ZV07Ci0gIEdQQkNvZGVkT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0gPSBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIFdyaXRlRGljdEludDY0RmllbGQob3V0cHV0U3RyZWFtLCBrZXktPnZhbHVlSW50NjQsIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICBXcml0ZURpY3RFbnVtRmllbGQob3V0cHV0U3RyZWFtLCB2YWx1ZSwga01hcFZhbHVlRmllbGROdW1iZXIsIEdQQkRhdGFUeXBlRW51bSk7Ci0gIFtvdXRwdXRTdHJlYW0gcmVsZWFzZV07Ci0gIHJldHVybiBkYXRhOwotfQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZUVudW0pIGZvcktleTpAKGtleS0+dmFsdWVJbnQ2NCldOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsZCIsIGtleV0sIEAodmFsdWUpKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KGludDY0X3Qpa2V5IHZhbHVlOihpbnQzMl90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6QChrZXkpXTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICBpbnQzMl90IHJlc3VsdCA9IFt3cmFwcGVkIGludFZhbHVlXTsKLSAgICBpZiAoIV92YWxpZGF0aW9uRnVuYyhyZXN1bHQpKSB7Ci0gICAgICByZXN1bHQgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotICAgIH0KLSAgICAqdmFsdWUgPSByZXN1bHQ7Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihpbnQ2NF90KWtleSByYXdWYWx1ZTooaW50MzJfdCAqKXJhd1ZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIGlmICh3cmFwcGVkICYmIHJhd1ZhbHVlKSB7Ci0gICAgKnJhd1ZhbHVlID0gW3dyYXBwZWQgaW50VmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoaW50NjRfdCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgR1BCRW51bVZhbGlkYXRpb25GdW5jIGZ1bmMgPSBfdmFsaWRhdGlvbkZ1bmM7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBpbnQzMl90IHVud3JhcHBlZCA9IFthVmFsdWUgaW50VmFsdWVdOwotICAgICAgaWYgKCFmdW5jKHVud3JhcHBlZCkpIHsKLSAgICAgICAgdW53cmFwcGVkID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLSAgICAgIH0KLSAgICAgIGJsb2NrKFthS2V5IGxvbmdMb25nVmFsdWVdLCB1bndyYXBwZWQsIHN0b3ApOwotICB9XTsKLX0KLQotLSAodm9pZClhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkludDY0RW51bURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFJhd1ZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooaW50NjRfdClrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihpbnQ2NF90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5IHsKLSAgaWYgKCFfdmFsaWRhdGlvbkZ1bmModmFsdWUpKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiR1BCSW50NjRFbnVtRGljdGlvbmFyeTogQXR0ZW1wdCB0byBzZXQgYW4gdW5rbm93biBlbnVtIHZhbHVlICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV07Ci0gIH0KLQotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTpAKGtleSldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IE9iamVjdAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0OihpZClvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaW50NjRfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhPYmplY3RzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiZvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhPYmplY3RzOihjb25zdCBpZCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhPYmplY3RzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhPYmplY3RzOm9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkludDY0T2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkludDY0T2JqZWN0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPYmplY3RzOihjb25zdCBpZCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgb2JqZWN0cyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIGlmICghb2JqZWN0c1tpXSkgewotICAgICAgICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBvYmplY3QgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gICAgICAgIH0KLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpvYmplY3RzW2ldIGZvcktleTpAKGtleXNbaV0pXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkludDY0T2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aE9iamVjdHM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKGludDY0X3Qga2V5LCBpZCBvYmplY3QsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TTnVtYmVyICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgYU9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKFthS2V5IGxvbmdMb25nVmFsdWVdLCBhT2JqZWN0LCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpaXNJbml0aWFsaXplZCB7Ci0gIGZvciAoR1BCTWVzc2FnZSAqbXNnIGluIFtfZGljdGlvbmFyeSBvYmplY3RFbnVtZXJhdG9yXSkgewotICAgIGlmICghbXNnLmluaXRpYWxpemVkKSB7Ci0gICAgICByZXR1cm4gTk87Ci0gICAgfQotICB9Ci0gIHJldHVybiBZRVM7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlkZWVwQ29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5ICpuZXdEaWN0ID0KLSAgICAgIFtbR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKGlkIGFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICptc2csCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBHUEJNZXNzYWdlICpjb3BpZWRNc2cgPSBbbXNnIGNvcHlXaXRoWm9uZTp6b25lXTsKLSAgICBbbmV3RGljdC0+X2RpY3Rpb25hcnkgc2V0T2JqZWN0OmNvcGllZE1zZyBmb3JLZXk6YUtleV07Ci0gICAgW2NvcGllZE1zZyByZWxlYXNlXTsKLSAgfV07Ci0gIHJldHVybiBuZXdEaWN0OwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU051bWJlciAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIGFPYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0SW50NjRGaWVsZFNpemUoW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RPYmplY3RGaWVsZFNpemUoYU9iamVjdCwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlUmF3VmFyaW50MzJTaXplRm9ySW50ZWdlcihtc2dTaXplKSArIG1zZ1NpemU7Ci0gIH1dOwotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNOdW1iZXIgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCBhT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShbYUtleSBsb25nTG9uZ1ZhbHVlXSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdE9iamVjdEZpZWxkU2l6ZShhT2JqZWN0LCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FLZXkgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdE9iamVjdEZpZWxkKG91dHB1dFN0cmVhbSwgYU9iamVjdCwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDp2YWx1ZS0+dmFsdWVTdHJpbmcgZm9yS2V5OkAoa2V5LT52YWx1ZUludDY0KV07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihpbnQ2NF90IGtleSwgaWQgb2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwga2V5XSwgb2JqZWN0KTsKLSAgfV07Ci19Ci0KLS0gKGlkKW9iamVjdEZvcktleTooaW50NjRfdClrZXkgewotICBpZCByZXN1bHQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OkAoa2V5KV07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldE9iamVjdDooaWQpb2JqZWN0IGZvcktleTooaW50NjRfdClrZXkgewotICBpZiAoIW9iamVjdCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBvYmplY3QgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpvYmplY3QgZm9yS2V5OkAoa2V5KV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlT2JqZWN0Rm9yS2V5OihpbnQ2NF90KWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OkAoYUtleSldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBESUNUSU9OQVJZX1BPRF9JTVBMX0ZPUl9LRVkoU3RyaW5nLCBOU1N0cmluZywgKiwgT0JKRUNUKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIFN0cmluZyAtPiBVSW50MzIKLQotQGltcGxlbWVudGF0aW9uIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOih1aW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KE5TU3RyaW5nICopa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIGlmICgha2V5c1tpXSkgewotICAgICAgICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBrZXkgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gICAgICAgIH0KLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OmtleXNbaV1dOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIHVpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhhS2V5LCBbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RTdHJpbmdGaWVsZFNpemUoYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFN0cmluZ0ZpZWxkU2l6ZShhS2V5LCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0VUludDMyRmllbGRTaXplKFthVmFsdWUgdW5zaWduZWRJbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdFN0cmluZ0ZpZWxkKG91dHB1dFN0cmVhbSwgYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0VUludDMyRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIHVuc2lnbmVkSW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlVUludDMyKSBmb3JLZXk6a2V5LT52YWx1ZVN0cmluZ107Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICprZXksIHVpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soa2V5LCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1IiwgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KE5TU3RyaW5nICopa2V5IHZhbHVlOih1aW50MzJfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OmtleV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgdW5zaWduZWRJbnRWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KHVpbnQzMl90KXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilrZXkgewotICBpZiAoIWtleSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBrZXkgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6a2V5XTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTphS2V5XTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEludDMyCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooTlNTdHJpbmcgKilrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBpZiAoIWtleXNbaV0pIHsKLSAgICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwga2V5IHRvIGEgRGljdGlvbmFyeSJdOwotICAgICAgICB9Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTprZXlzW2ldXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKGFLZXksIFthVmFsdWUgaW50VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RTdHJpbmdGaWVsZFNpemUoYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgfV07Ci0gIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVdpcmVGb3JtYXRUYWdTaXplKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCRGF0YVR5cGVNZXNzYWdlKTsKLSAgcmVzdWx0ICs9IHRhZ1NpemUgKiBjb3VudDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0U3RyZWFtCi0gICAgICAgICAgICAgICAgICAgICAgICAgYXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIHVpbnQzMl90IHRhZyA9IEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQkZpZWxkTnVtYmVyKGZpZWxkKSwgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCk7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFN0cmluZ0ZpZWxkU2l6ZShhS2V5LCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0SW50MzJGaWVsZFNpemUoW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdFN0cmluZ0ZpZWxkKG91dHB1dFN0cmVhbSwgYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0SW50MzJGaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlSW50MzIpIGZvcktleTprZXktPnZhbHVlU3RyaW5nXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKGtleSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlZCIsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWtleSB2YWx1ZTooaW50MzJfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OmtleV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgaW50VmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleSB7Ci0gIGlmICgha2V5KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIGtleSB0byBhIERpY3Rpb25hcnkiXTsKLSAgfQotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTprZXldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OmFLZXldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBTdHJpbmcgLT4gVUludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZToodWludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihOU1N0cmluZyAqKWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBpZiAoIWtleXNbaV0pIHsKLSAgICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwga2V5IHRvIGEgRGljdGlvbmFyeSJdOwotICAgICAgICB9Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTprZXlzW2ldXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShOU1N0cmluZyAqa2V5LCB1aW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICAgYmxvY2soYUtleSwgW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RTdHJpbmdGaWVsZFNpemUoYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQ2NEZpZWxkU2l6ZShbYVZhbHVlIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0U3RyaW5nRmllbGRTaXplKGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RTdHJpbmdGaWVsZChvdXRwdXRTdHJlYW0sIGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdFVJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgW2FWYWx1ZSB1bnNpZ25lZExvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlVUludDY0KSBmb3JLZXk6a2V5LT52YWx1ZVN0cmluZ107Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICprZXksIHVpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soa2V5LCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbHUiLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgdmFsdWU6KHVpbnQ2NF90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6a2V5XTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCB1bnNpZ25lZExvbmdMb25nVmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOih1aW50NjRfdCl2YWx1ZSBmb3JLZXk6KE5TU3RyaW5nICopa2V5IHsKLSAgaWYgKCFrZXkpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwga2V5IHRvIGEgRGljdGlvbmFyeSJdOwotICB9Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZSkgZm9yS2V5OmtleV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KE5TU3RyaW5nICopYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6YUtleV07Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZUFsbE9iamVjdHNdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFN0cmluZyAtPiBJbnQ2NAotCi1AaW1wbGVtZW50YXRpb24gR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50NjRfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KE5TU3RyaW5nICopa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgTlNTdHJpbmcgKiBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgTlNTdHJpbmcgKiBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKCFrZXlzW2ldKSB7Ci0gICAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIGtleSB0byBhIERpY3Rpb25hcnkiXTsKLSAgICAgICAgfQotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6a2V5c1tpXV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlN0cmluZ0ludDY0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShOU1N0cmluZyAqa2V5LCBpbnQ2NF90IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhhS2V5LCBbYVZhbHVlIGxvbmdMb25nVmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RTdHJpbmdGaWVsZFNpemUoYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKFthVmFsdWUgbG9uZ0xvbmdWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0U3RyaW5nRmllbGRTaXplKGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShbYVZhbHVlIGxvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RTdHJpbmdGaWVsZChvdXRwdXRTdHJlYW0sIGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEludDY0RmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGxvbmdMb25nVmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlSW50NjQpIGZvcktleTprZXktPnZhbHVlU3RyaW5nXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmtleSwgaW50NjRfdCB2YWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICAgIGJsb2NrKGtleSwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwgdmFsdWVdKTsKLSAgfV07Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KE5TU3RyaW5nICopa2V5IHZhbHVlOihpbnQ2NF90ICopdmFsdWUgewotICBOU051bWJlciAqd3JhcHBlZCA9IFtfZGljdGlvbmFyeSBvYmplY3RGb3JLZXk6a2V5XTsKLSAgaWYgKHdyYXBwZWQgJiYgdmFsdWUpIHsKLSAgICAqdmFsdWUgPSBbd3JhcHBlZCBsb25nTG9uZ1ZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihpbnQ2NF90KXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilrZXkgewotICBpZiAoIWtleSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBrZXkgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6a2V5XTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTphS2V5XTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEJvb2wKLQotQGltcGxlbWVudGF0aW9uIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBOU011dGFibGVEaWN0aW9uYXJ5ICpfZGljdGlvbmFyeTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooQk9PTCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KE5TU3RyaW5nICopa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgQk9PTCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgTlNTdHJpbmcgKiBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJTdHJpbmdCb29sRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IEJPT0wgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgaWYgKGNvdW50ICYmIHZhbHVlcyAmJiBrZXlzKSB7Ci0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICAgIGlmICgha2V5c1tpXSkgewotICAgICAgICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBrZXkgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gICAgICAgIH0KLSAgICAgICAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlc1tpXSkgZm9yS2V5OmtleXNbaV1dOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfZGljdGlvbmFyeSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgaXNFcXVhbDpvdGhlci0+X2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICByZXR1cm4gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsgJUAgfSIsIFtzZWxmIGNsYXNzXSwgc2VsZiwgX2RpY3Rpb25hcnldOwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShOU1N0cmluZyAqa2V5LCBCT09MIHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhhS2V5LCBbYVZhbHVlIGJvb2xWYWx1ZV0sIHN0b3ApOwotICB9XTsKLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgTlNVSW50ZWdlciBjb3VudCA9IF9kaWN0aW9uYXJ5LmNvdW50OwotICBpZiAoY291bnQgPT0gMCkgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU051bWJlciAqYVZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFN0cmluZ0ZpZWxkU2l6ZShhS2V5LCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZShbYVZhbHVlIGJvb2xWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0U3RyaW5nRmllbGRTaXplKGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKFthVmFsdWUgYm9vbFZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgV3JpdGVEaWN0U3RyaW5nRmllbGQob3V0cHV0U3RyZWFtLCBhS2V5LCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgICBXcml0ZURpY3RCb29sRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGJvb2xWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZS0+dmFsdWVCb29sKSBmb3JLZXk6a2V5LT52YWx1ZVN0cmluZ107Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBbc2VsZiBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICprZXksIEJPT0wgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhrZXksICh2YWx1ZSA/IEAidHJ1ZSIgOiBAImZhbHNlIikpOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgdmFsdWU6KEJPT0wgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTprZXldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIGJvb2xWYWx1ZV07Ci0gIH0KLSAgcmV0dXJuICh3cmFwcGVkICE9IE5VTEwpOwotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihCT09MKXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilrZXkgewotICBpZiAoIWtleSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBrZXkgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6a2V5XTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTphS2V5XTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEZsb2F0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihmbG9hdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KE5TU3RyaW5nICopa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgZmxvYXQgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGZsb2F0IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgIGlmIChjb3VudCAmJiB2YWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBpZiAoIWtleXNbaV0pIHsKLSAgICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwga2V5IHRvIGEgRGljdGlvbmFyeSJdOwotICAgICAgICB9Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QCh2YWx1ZXNbaV0pIGZvcktleTprZXlzW2ldXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIFtfZGljdGlvbmFyeSBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhhS2V5LCBbYVZhbHVlIGZsb2F0VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RTdHJpbmdGaWVsZFNpemUoYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEZsb2F0RmllbGRTaXplKFthVmFsdWUgZmxvYXRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0U3RyaW5nRmllbGRTaXplKGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RGbG9hdEZpZWxkU2l6ZShbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RTdHJpbmdGaWVsZChvdXRwdXRTdHJlYW0sIGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEZsb2F0RmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGZsb2F0VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRmxvYXQpIGZvcktleTprZXktPnZhbHVlU3RyaW5nXTsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIFtzZWxmIGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmtleSwgZmxvYXQgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhrZXksIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJS4qZyIsIEZMVF9ESUcsIHZhbHVlXSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWtleSB2YWx1ZTooZmxvYXQgKil2YWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTprZXldOwotICBpZiAod3JhcHBlZCAmJiB2YWx1ZSkgewotICAgICp2YWx1ZSA9IFt3cmFwcGVkIGZsb2F0VmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBbX2RpY3Rpb25hcnkgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdGlvbmFyeS0+X2RpY3Rpb25hcnldOwotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGZsb2F0KXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilrZXkgewotICBpZiAoIWtleSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBrZXkgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6a2V5XTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTphS2V5XTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IERvdWJsZQotCi1AaW1wbGVtZW50YXRpb24gR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGRvdWJsZSl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KE5TU3RyaW5nICopa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgZG91YmxlIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgTlNTdHJpbmcgKiBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIF9kaWN0aW9uYXJ5ID0gW1tOU011dGFibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICBpZiAoY291bnQgJiYgdmFsdWVzICYmIGtleXMpIHsKLSAgICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgICAgaWYgKCFrZXlzW2ldKSB7Ci0gICAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIGtleSB0byBhIERpY3Rpb25hcnkiXTsKLSAgICAgICAgfQotICAgICAgICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWVzW2ldKSBmb3JLZXk6a2V5c1tpXV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gW19kaWN0aW9uYXJ5IGlzRXF1YWw6b3RoZXItPl9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIF9kaWN0aW9uYXJ5LmNvdW50OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgcmV0dXJuIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7ICVAIH0iLCBbc2VsZiBjbGFzc10sIHNlbGYsIF9kaWN0aW9uYXJ5XTsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoTlNTdHJpbmcgKmtleSwgZG91YmxlIHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBibG9jayhhS2V5LCBbYVZhbHVlIGRvdWJsZVZhbHVlXSwgc3RvcCk7Ci0gIH1dOwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gX2RpY3Rpb25hcnkuY291bnQ7Ci0gIGlmIChjb3VudCA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkRhdGFUeXBlIGtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gIF9fYmxvY2sgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoc3RvcCkKLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0U3RyaW5nRmllbGRTaXplKGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3REb3VibGVGaWVsZFNpemUoW2FWYWx1ZSBkb3VibGVWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0U3RyaW5nRmllbGRTaXplKGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3REb3VibGVGaWVsZFNpemUoW2FWYWx1ZSBkb3VibGVWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgIFdyaXRlRGljdFN0cmluZ0ZpZWxkKG91dHB1dFN0cmVhbSwgYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgV3JpdGVEaWN0RG91YmxlRmllbGQob3V0cHV0U3RyZWFtLCBbYVZhbHVlIGRvdWJsZVZhbHVlXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICB9XTsKLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlLT52YWx1ZURvdWJsZSkgZm9yS2V5OmtleS0+dmFsdWVTdHJpbmddOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqa2V5LCBkb3VibGUgdmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAgICNwcmFnbWEgdW51c2VkKHN0b3ApCi0gICAgICBibG9jayhrZXksIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJS4qbGciLCBEQkxfRElHLCB2YWx1ZV0pOwotICB9XTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgdmFsdWU6KGRvdWJsZSAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OmtleV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgKnZhbHVlID0gW3dyYXBwZWQgZG91YmxlVmFsdWVdOwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihkb3VibGUpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleSB7Ci0gIGlmICgha2V5KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIGtleSB0byBhIERpY3Rpb25hcnkiXTsKLSAgfQotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTprZXldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWFLZXkgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlT2JqZWN0Rm9yS2V5OmFLZXldOwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVBbGxPYmplY3RzXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBTdHJpbmcgLT4gRW51bQotCi1AaW1wbGVtZW50YXRpb24gR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKl9kaWN0aW9uYXJ5OwotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgX3ZhbGlkYXRpb25GdW5jOwotfQotCi1Ac3ludGhlc2l6ZSB2YWxpZGF0aW9uRnVuYyA9IF92YWxpZGF0aW9uRnVuYzsKLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOihpbnQzMl90KXJhd1ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KE5TU3RyaW5nICopa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCU3RyaW5nRW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZyYXdWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXJhd1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpyYXdWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmdW5jIGNhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOk5VTEwgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pcmF3VmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IE5TU3RyaW5nICogW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgX3ZhbGlkYXRpb25GdW5jID0gKGZ1bmMgIT0gTlVMTCA/IGZ1bmMgOiBEaWN0RGVmYXVsdF9Jc1ZhbGlkVmFsdWUpOwotICAgIGlmIChjb3VudCAmJiByYXdWYWx1ZXMgJiYga2V5cykgewotICAgICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgICBpZiAoIWtleXNbaV0pIHsKLSAgICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwga2V5IHRvIGEgRGljdGlvbmFyeSJdOwotICAgICAgICB9Ci0gICAgICAgIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6QChyYXdWYWx1ZXNbaV0pIGZvcktleTprZXlzW2ldXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpkaWN0aW9uYXJ5LnZhbGlkYXRpb25GdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0aW9uYXJ5LT5fZGljdGlvbmFyeV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW19kaWN0aW9uYXJ5IHJlbGVhc2VdOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBpc0VxdWFsOm90aGVyLT5fZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiBfZGljdGlvbmFyeS5jb3VudDsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIHJldHVybiBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyAlQCB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBfZGljdGlvbmFyeV07Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gX2RpY3Rpb25hcnkuY291bnQ7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgIGJsb2NrKGFLZXksIFthVmFsdWUgaW50VmFsdWVdLCBzdG9wKTsKLSAgfV07Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIE5TVUludGVnZXIgY291bnQgPSBfZGljdGlvbmFyeS5jb3VudDsKLSAgaWYgKGNvdW50ID09IDApIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgX19ibG9jayBzaXplX3QgcmVzdWx0ID0gMDsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RTdHJpbmdGaWVsZFNpemUoYUtleSwga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUoW2FWYWx1ZSBpbnRWYWx1ZV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICB9XTsKLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNOdW1iZXIgKmFWYWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0U3RyaW5nRmllbGRTaXplKGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RFbnVtRmllbGRTaXplKFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICBXcml0ZURpY3RTdHJpbmdGaWVsZChvdXRwdXRTdHJlYW0sIGFLZXksIGtNYXBLZXlGaWVsZE51bWJlciwga2V5RGF0YVR5cGUpOwotICAgIFdyaXRlRGljdEVudW1GaWVsZChvdXRwdXRTdHJlYW0sIFthVmFsdWUgaW50VmFsdWVdLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gIH1dOwotfQotCi0tIChOU0RhdGEgKilzZXJpYWxpemVkRGF0YUZvclVua25vd25WYWx1ZTooaW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RGF0YVR5cGU6KEdQQkRhdGFUeXBlKWtleURhdGFUeXBlIHsKLSAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdFN0cmluZ0ZpZWxkU2l6ZShrZXktPnZhbHVlU3RyaW5nLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUodmFsdWUsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUVudW0pOwotICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6bXNnU2l6ZV07Ci0gIEdQQkNvZGVkT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0gPSBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIFdyaXRlRGljdFN0cmluZ0ZpZWxkKG91dHB1dFN0cmVhbSwga2V5LT52YWx1ZVN0cmluZywga01hcEtleUZpZWxkTnVtYmVyLCBrZXlEYXRhVHlwZSk7Ci0gIFdyaXRlRGljdEVudW1GaWVsZChvdXRwdXRTdHJlYW0sIHZhbHVlLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVFbnVtKTsKLSAgW291dHB1dFN0cmVhbSByZWxlYXNlXTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUtPnZhbHVlRW51bSkgZm9yS2V5OmtleS0+dmFsdWVTdHJpbmddOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgW3NlbGYgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqa2V5LCBpbnQzMl90IHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgYmxvY2soa2V5LCBAKHZhbHVlKSk7Ci0gIH1dOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihOU1N0cmluZyAqKWtleSB2YWx1ZTooaW50MzJfdCAqKXZhbHVlIHsKLSAgTlNOdW1iZXIgKndyYXBwZWQgPSBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5OmtleV07Ci0gIGlmICh3cmFwcGVkICYmIHZhbHVlKSB7Ci0gICAgaW50MzJfdCByZXN1bHQgPSBbd3JhcHBlZCBpbnRWYWx1ZV07Ci0gICAgaWYgKCFfdmFsaWRhdGlvbkZ1bmMocmVzdWx0KSkgewotICAgICAgcmVzdWx0ID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLSAgICB9Ci0gICAgKnZhbHVlID0gcmVzdWx0OwotICB9Ci0gIHJldHVybiAod3JhcHBlZCAhPSBOVUxMKTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooTlNTdHJpbmcgKilrZXkgcmF3VmFsdWU6KGludDMyX3QgKilyYXdWYWx1ZSB7Ci0gIE5TTnVtYmVyICp3cmFwcGVkID0gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTprZXldOwotICBpZiAod3JhcHBlZCAmJiByYXdWYWx1ZSkgewotICAgICpyYXdWYWx1ZSA9IFt3cmFwcGVkIGludFZhbHVlXTsKLSAgfQotICByZXR1cm4gKHdyYXBwZWQgIT0gTlVMTCk7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKE5TU3RyaW5nICprZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgR1BCRW51bVZhbGlkYXRpb25GdW5jIGZ1bmMgPSBfdmFsaWRhdGlvbkZ1bmM7Ci0gIFtfZGljdGlvbmFyeSBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTnVtYmVyICphVmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0gICAgICBpbnQzMl90IHVud3JhcHBlZCA9IFthVmFsdWUgaW50VmFsdWVdOwotICAgICAgaWYgKCFmdW5jKHVud3JhcHBlZCkpIHsKLSAgICAgICAgdW53cmFwcGVkID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLSAgICAgIH0KLSAgICAgIGJsb2NrKGFLZXksIHVud3JhcHBlZCwgc3RvcCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKWFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgW19kaWN0aW9uYXJ5IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3Rpb25hcnktPl9kaWN0aW9uYXJ5XTsKLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFJhd1ZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooTlNTdHJpbmcgKilrZXkgewotICBpZiAoIWtleSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIkF0dGVtcHRpbmcgdG8gYWRkIG5pbCBrZXkgdG8gYSBEaWN0aW9uYXJ5Il07Ci0gIH0KLSAgW19kaWN0aW9uYXJ5IHNldE9iamVjdDpAKHZhbHVlKSBmb3JLZXk6a2V5XTsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooTlNTdHJpbmcgKilhS2V5IHsKLSAgW19kaWN0aW9uYXJ5IHJlbW92ZU9iamVjdEZvcktleTphS2V5XTsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBbX2RpY3Rpb25hcnkgcmVtb3ZlQWxsT2JqZWN0c107Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleSB7Ci0gIGlmICgha2V5KSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIGtleSB0byBhIERpY3Rpb25hcnkiXTsKLSAgfQotICBpZiAoIV92YWxpZGF0aW9uRnVuYyh2YWx1ZSkpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJHUEJTdHJpbmdFbnVtRGljdGlvbmFyeTogQXR0ZW1wdCB0byBzZXQgYW4gdW5rbm93biBlbnVtIHZhbHVlICglZCkiLAotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV07Ci0gIH0KLQotICBbX2RpY3Rpb25hcnkgc2V0T2JqZWN0OkAodmFsdWUpIGZvcktleTprZXldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5ELUVORCAoNSBleHBhbnNpb25zKQotCi0KLS8vJVBERE0tRVhQQU5EIERJQ1RJT05BUllfQk9PTF9LRVlfVE9fUE9EX0lNUEwoVUludDMyLCB1aW50MzJfdCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBCb29sIC0+IFVJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIHVpbnQzMl90IF92YWx1ZXNbMl07Ci0gIEJPT0wgX3ZhbHVlU2V0WzJdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOih1aW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEJPT0wpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgdWludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJCb29sVUludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhEaWN0aW9uYXJ5OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCB1aW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGludCBpZHggPSBrZXlzW2ldID8gMSA6IDA7Ci0gICAgICBfdmFsdWVzW2lkeF0gPSB2YWx1ZXNbaV07Ci0gICAgICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgICAgaWYgKGRpY3Rpb25hcnktPl92YWx1ZVNldFtpXSkgewotICAgICAgICAgIF92YWx1ZXNbaV0gPSBkaWN0aW9uYXJ5LT5fdmFsdWVzW2ldOwotICAgICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0jaWYgIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0jZW5kaWYgIC8vICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJCb29sVUludDMyRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJCb29sVUludDMyRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gIT0gb3RoZXItPl92YWx1ZVNldFswXSkgfHwKLSAgICAgIChfdmFsdWVTZXRbMV0gIT0gb3RoZXItPl92YWx1ZVNldFsxXSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gJiYgKF92YWx1ZXNbMF0gIT0gb3RoZXItPl92YWx1ZXNbMF0pKSB8fAotICAgICAgKF92YWx1ZVNldFsxXSAmJiAoX3ZhbHVlc1sxXSAhPSBvdGhlci0+X3ZhbHVlc1sxXSkpKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBZRVM7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIE5TTXV0YWJsZVN0cmluZyAqcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7IiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiTk86ICV1IiwgX3ZhbHVlc1swXV07Ci0gIH0KLSAgaWYgKF92YWx1ZVNldFsxXSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiWUVTOiAldSIsIF92YWx1ZXNbMV1dOwotICB9Ci0gIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KHVpbnQzMl90ICopdmFsdWUgewotICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLSAgaWYgKF92YWx1ZVNldFtpZHhdKSB7Ci0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICAqdmFsdWUgPSBfdmFsdWVzW2lkeF07Ci0gICAgfQotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgcmV0dXJuIE5POwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBpbnQgaWR4ID0gKGtleS0+dmFsdWVCb29sID8gMSA6IDApOwotICBfdmFsdWVzW2lkeF0gPSB2YWx1ZS0+dmFsdWVVSW50MzI7Ci0gIF92YWx1ZVNldFtpZHhdID0gWUVTOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIGJsb2NrKEAiZmFsc2UiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1IiwgX3ZhbHVlc1swXV0pOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhAInRydWUiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1IiwgX3ZhbHVlc1sxXV0pOwotICB9Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKEJPT0wga2V5LCB1aW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBCT09MIHN0b3AgPSBOTzsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIGJsb2NrKE5PLCBfdmFsdWVzWzBdLCAmc3RvcCk7Ci0gIH0KLSAgaWYgKCFzdG9wICYmIF92YWx1ZVNldFsxXSkgewotICAgIGJsb2NrKFlFUywgX3ZhbHVlc1sxXSwgJnN0b3ApOwotICB9Ci19Ci0KLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgTlNVSW50ZWdlciBjb3VudCA9IDA7Ci0gIHNpemVfdCByZXN1bHQgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIGlmIChfdmFsdWVTZXRbaV0pIHsKLSAgICAgICsrY291bnQ7Ci0gICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICAgIH0KLSAgfQotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIGlmIChfdmFsdWVTZXRbaV0pIHsKLSAgICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdFVJbnQzMkZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgICBXcml0ZURpY3RCb29sRmllbGQob3V0cHV0U3RyZWFtLCAoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgV3JpdGVEaWN0VUludDMyRmllbGQob3V0cHV0U3RyZWFtLCBfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OihHUEJCb29sVUludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgaWYgKG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLSAgICAgICAgX3ZhbHVlc1tpXSA9IG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZToodWludDMyX3QpdmFsdWUgZm9yS2V5OihCT09MKWtleSB7Ci0gIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotICBfdmFsdWVzW2lkeF0gPSB2YWx1ZTsKLSAgX3ZhbHVlU2V0W2lkeF0gPSBZRVM7Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KEJPT0wpYUtleSB7Ci0gIF92YWx1ZVNldFthS2V5ID8gMSA6IDBdID0gTk87Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgX3ZhbHVlU2V0WzBdID0gTk87Ci0gIF92YWx1ZVNldFsxXSA9IE5POwotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIERJQ1RJT05BUllfQk9PTF9LRVlfVE9fUE9EX0lNUEwoSW50MzIsIGludDMyX3QpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBJbnQzMgotCi1AaW1wbGVtZW50YXRpb24gR1BCQm9vbEludDMyRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgaW50MzJfdCBfdmFsdWVzWzJdOwotICBCT09MIF92YWx1ZVNldFsyXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEJPT0wpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbEludDMyRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sSW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xJbnQzMkRpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sSW50MzJEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgaW50IGlkeCA9IGtleXNbaV0gPyAxIDogMDsKLSAgICAgIF92YWx1ZXNbaWR4XSA9IHZhbHVlc1tpXTsKLSAgICAgIF92YWx1ZVNldFtpZHhdID0gWUVTOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCQm9vbEludDMyRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICAgIGlmIChkaWN0aW9uYXJ5LT5fdmFsdWVTZXRbaV0pIHsKLSAgICAgICAgICBfdmFsdWVzW2ldID0gZGljdGlvbmFyeS0+X3ZhbHVlc1tpXTsKLSAgICAgICAgICBfdmFsdWVTZXRbaV0gPSBZRVM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgI3ByYWdtYSB1bnVzZWQobnVtSXRlbXMpCi0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotI2lmICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0tICh2b2lkKWRlYWxsb2MgewotICBOU0Fzc2VydCghX2F1dG9jcmVhdG9yLAotICAgICAgICAgICBAIiVAOiBBdXRvY3JlYXRvciBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHJlbGVhc2UsIGF1dG9jcmVhdG9yOiAlQCIsCi0gICAgICAgICAgIFtzZWxmIGNsYXNzXSwgX2F1dG9jcmVhdG9yKTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotI2VuZGlmICAvLyAhZGVmaW5lZChOU19CTE9DS19BU1NFUlRJT05TKQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCQm9vbEludDMyRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbEludDMyRGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIGlmICgoX3ZhbHVlU2V0WzBdICE9IG90aGVyLT5fdmFsdWVTZXRbMF0pIHx8Ci0gICAgICAoX3ZhbHVlU2V0WzFdICE9IG90aGVyLT5fdmFsdWVTZXRbMV0pKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIGlmICgoX3ZhbHVlU2V0WzBdICYmIChfdmFsdWVzWzBdICE9IG90aGVyLT5fdmFsdWVzWzBdKSkgfHwKLSAgICAgIChfdmFsdWVTZXRbMV0gJiYgKF92YWx1ZXNbMV0gIT0gb3RoZXItPl92YWx1ZXNbMV0pKSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICByZXR1cm4gWUVTOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICByZXR1cm4gKF92YWx1ZVNldFswXSA/IDEgOiAwKSArIChfdmFsdWVTZXRbMV0gPyAxIDogMCk7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyIsIFtzZWxmIGNsYXNzXSwgc2VsZl07Ci0gIGlmIChfdmFsdWVTZXRbMF0pIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIk5POiAlZCIsIF92YWx1ZXNbMF1dOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIllFUzogJWQiLCBfdmFsdWVzWzFdXTsKLSAgfQotICBbcmVzdWx0IGFwcGVuZFN0cmluZzpAIiB9Il07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gKF92YWx1ZVNldFswXSA/IDEgOiAwKSArIChfdmFsdWVTZXRbMV0gPyAxIDogMCk7Ci19Ci0KLS0gKEJPT0wpdmFsdWVGb3JLZXk6KEJPT0wpa2V5IHZhbHVlOihpbnQzMl90ICopdmFsdWUgewotICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLSAgaWYgKF92YWx1ZVNldFtpZHhdKSB7Ci0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICAqdmFsdWUgPSBfdmFsdWVzW2lkeF07Ci0gICAgfQotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgcmV0dXJuIE5POwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBpbnQgaWR4ID0gKGtleS0+dmFsdWVCb29sID8gMSA6IDApOwotICBfdmFsdWVzW2lkeF0gPSB2YWx1ZS0+dmFsdWVJbnQzMjsKLSAgX3ZhbHVlU2V0W2lkeF0gPSBZRVM7Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBpZiAoX3ZhbHVlU2V0WzBdKSB7Ci0gICAgYmxvY2soQCJmYWxzZSIsIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWQiLCBfdmFsdWVzWzBdXSk7Ci0gIH0KLSAgaWYgKF92YWx1ZVNldFsxXSkgewotICAgIGJsb2NrKEAidHJ1ZSIsIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWQiLCBfdmFsdWVzWzFdXSk7Ci0gIH0KLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoQk9PTCBrZXksIGludDMyX3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgQk9PTCBzdG9wID0gTk87Ci0gIGlmIChfdmFsdWVTZXRbMF0pIHsKLSAgICBibG9jayhOTywgX3ZhbHVlc1swXSwgJnN0b3ApOwotICB9Ci0gIGlmICghc3RvcCAmJiBfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhZRVMsIF92YWx1ZXNbMV0sICZzdG9wKTsKLSAgfQotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIE5TVUludGVnZXIgY291bnQgPSAwOwotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICArK2NvdW50OwotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICAgIH0KLSAgfQotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIGlmIChfdmFsdWVTZXRbaV0pIHsKLSAgICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICAgIFdyaXRlRGljdEJvb2xGaWVsZChvdXRwdXRTdHJlYW0sIChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0gICAgICBXcml0ZURpY3RJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwgX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbEludDMyRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgaWYgKG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLSAgICAgICAgX3ZhbHVlc1tpXSA9IG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KEJPT0wpa2V5IHsKLSAgaW50IGlkeCA9IChrZXkgPyAxIDogMCk7Ci0gIF92YWx1ZXNbaWR4XSA9IHZhbHVlOwotICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5IHsKLSAgX3ZhbHVlU2V0W2FLZXkgPyAxIDogMF0gPSBOTzsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBfdmFsdWVTZXRbMF0gPSBOTzsKLSAgX3ZhbHVlU2V0WzFdID0gTk87Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9CT09MX0tFWV9UT19QT0RfSU1QTChVSW50NjQsIHVpbnQ2NF90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gVUludDY0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sVUludDY0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgdWludDY0X3QgX3ZhbHVlc1syXTsKLSAgQk9PTCBfdmFsdWVTZXRbMl07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KHVpbnQ2NF90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sVUludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCB1aW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sVUludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IHVpbnQ2NF90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgaW50IGlkeCA9IGtleXNbaV0gPyAxIDogMDsKLSAgICAgIF92YWx1ZXNbaWR4XSA9IHZhbHVlc1tpXTsKLSAgICAgIF92YWx1ZVNldFtpZHhdID0gWUVTOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgICBpZiAoZGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAgICAgX3ZhbHVlc1tpXSA9IGRpY3Rpb25hcnktPl92YWx1ZXNbaV07Ci0gICAgICAgICAgX3ZhbHVlU2V0W2ldID0gWUVTOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLSNpZiAhZGVmaW5lZChOU19CTE9DS19BU1NFUlRJT05TKQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLSNlbmRpZiAgLy8gIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkJvb2xVSW50NjREaWN0aW9uYXJ5IGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdFdpdGhEaWN0aW9uYXJ5OnNlbGZdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoKF92YWx1ZVNldFswXSAhPSBvdGhlci0+X3ZhbHVlU2V0WzBdKSB8fAotICAgICAgKF92YWx1ZVNldFsxXSAhPSBvdGhlci0+X3ZhbHVlU2V0WzFdKSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoKF92YWx1ZVNldFswXSAmJiAoX3ZhbHVlc1swXSAhPSBvdGhlci0+X3ZhbHVlc1swXSkpIHx8Ci0gICAgICAoX3ZhbHVlU2V0WzFdICYmIChfdmFsdWVzWzFdICE9IG90aGVyLT5fdmFsdWVzWzFdKSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFlFUzsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIChfdmFsdWVTZXRbMF0gPyAxIDogMCkgKyAoX3ZhbHVlU2V0WzFdID8gMSA6IDApOwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgTlNNdXRhYmxlU3RyaW5nICpyZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBpZiAoX3ZhbHVlU2V0WzBdKSB7Ci0gICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCJOTzogJWxsdSIsIF92YWx1ZXNbMF1dOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIllFUzogJWxsdSIsIF92YWx1ZXNbMV1dOwotICB9Ci0gIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KHVpbnQ2NF90ICopdmFsdWUgewotICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLSAgaWYgKF92YWx1ZVNldFtpZHhdKSB7Ci0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICAqdmFsdWUgPSBfdmFsdWVzW2lkeF07Ci0gICAgfQotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgcmV0dXJuIE5POwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBpbnQgaWR4ID0gKGtleS0+dmFsdWVCb29sID8gMSA6IDApOwotICBfdmFsdWVzW2lkeF0gPSB2YWx1ZS0+dmFsdWVVSW50NjQ7Ci0gIF92YWx1ZVNldFtpZHhdID0gWUVTOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIGJsb2NrKEAiZmFsc2UiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbHUiLCBfdmFsdWVzWzBdXSk7Ci0gIH0KLSAgaWYgKF92YWx1ZVNldFsxXSkgewotICAgIGJsb2NrKEAidHJ1ZSIsIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiJWxsdSIsIF92YWx1ZXNbMV1dKTsKLSAgfQotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShCT09MIGtleSwgdWludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgQk9PTCBzdG9wID0gTk87Ci0gIGlmIChfdmFsdWVTZXRbMF0pIHsKLSAgICBibG9jayhOTywgX3ZhbHVlc1swXSwgJnN0b3ApOwotICB9Ci0gIGlmICghc3RvcCAmJiBfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhZRVMsIF92YWx1ZXNbMV0sICZzdG9wKTsKLSAgfQotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIE5TVUludGVnZXIgY291bnQgPSAwOwotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICArK2NvdW50OwotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgICB9Ci0gIH0KLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RVSW50NjRGaWVsZFNpemUoX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgICAgV3JpdGVEaWN0Qm9vbEZpZWxkKG91dHB1dFN0cmVhbSwgKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIFdyaXRlRGljdFVJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgIGlmIChvdGhlckRpY3Rpb25hcnktPl92YWx1ZVNldFtpXSkgewotICAgICAgICBfdmFsdWVTZXRbaV0gPSBZRVM7Ci0gICAgICAgIF92YWx1ZXNbaV0gPSBvdGhlckRpY3Rpb25hcnktPl92YWx1ZXNbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KHVpbnQ2NF90KXZhbHVlIGZvcktleTooQk9PTClrZXkgewotICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLSAgX3ZhbHVlc1tpZHhdID0gdmFsdWU7Ci0gIF92YWx1ZVNldFtpZHhdID0gWUVTOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihCT09MKWFLZXkgewotICBfdmFsdWVTZXRbYUtleSA/IDEgOiAwXSA9IE5POwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIF92YWx1ZVNldFswXSA9IE5POwotICBfdmFsdWVTZXRbMV0gPSBOTzsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBESUNUSU9OQVJZX0JPT0xfS0VZX1RPX1BPRF9JTVBMKEludDY0LCBpbnQ2NF90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gSW50NjQKLQotQGltcGxlbWVudGF0aW9uIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIGludDY0X3QgX3ZhbHVlc1syXTsKLSAgQk9PTCBfdmFsdWVTZXRbMl07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDY0X3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihCT09MKWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGludDY0X3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbEludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJCb29sSW50NjREaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbEludDY0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50NjRfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGludCBpZHggPSBrZXlzW2ldID8gMSA6IDA7Ci0gICAgICBfdmFsdWVzW2lkeF0gPSB2YWx1ZXNbaV07Ci0gICAgICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgICBpZiAoZGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAgICAgX3ZhbHVlc1tpXSA9IGRpY3Rpb25hcnktPl92YWx1ZXNbaV07Ci0gICAgICAgICAgX3ZhbHVlU2V0W2ldID0gWUVTOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLSNpZiAhZGVmaW5lZChOU19CTE9DS19BU1NFUlRJT05TKQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLSNlbmRpZiAgLy8gIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkJvb2xJbnQ2NERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCQm9vbEludDY0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkJvb2xJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoKF92YWx1ZVNldFswXSAhPSBvdGhlci0+X3ZhbHVlU2V0WzBdKSB8fAotICAgICAgKF92YWx1ZVNldFsxXSAhPSBvdGhlci0+X3ZhbHVlU2V0WzFdKSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoKF92YWx1ZVNldFswXSAmJiAoX3ZhbHVlc1swXSAhPSBvdGhlci0+X3ZhbHVlc1swXSkpIHx8Ci0gICAgICAoX3ZhbHVlU2V0WzFdICYmIChfdmFsdWVzWzFdICE9IG90aGVyLT5fdmFsdWVzWzFdKSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFlFUzsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIChfdmFsdWVTZXRbMF0gPyAxIDogMCkgKyAoX3ZhbHVlU2V0WzFdID8gMSA6IDApOwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgTlNNdXRhYmxlU3RyaW5nICpyZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBpZiAoX3ZhbHVlU2V0WzBdKSB7Ci0gICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCJOTzogJWxsZCIsIF92YWx1ZXNbMF1dOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIllFUzogJWxsZCIsIF92YWx1ZXNbMV1dOwotICB9Ci0gIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KGludDY0X3QgKil2YWx1ZSB7Ci0gIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotICBpZiAoX3ZhbHVlU2V0W2lkeF0pIHsKLSAgICBpZiAodmFsdWUpIHsKLSAgICAgICp2YWx1ZSA9IF92YWx1ZXNbaWR4XTsKLSAgICB9Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICByZXR1cm4gTk87Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIGludCBpZHggPSAoa2V5LT52YWx1ZUJvb2wgPyAxIDogMCk7Ci0gIF92YWx1ZXNbaWR4XSA9IHZhbHVlLT52YWx1ZUludDY0OwotICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIGlmIChfdmFsdWVTZXRbMF0pIHsKLSAgICBibG9jayhAImZhbHNlIiwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlbGxkIiwgX3ZhbHVlc1swXV0pOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhAInRydWUiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVsbGQiLCBfdmFsdWVzWzFdXSk7Ci0gIH0KLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoQk9PTCBrZXksIGludDY0X3QgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgQk9PTCBzdG9wID0gTk87Ci0gIGlmIChfdmFsdWVTZXRbMF0pIHsKLSAgICBibG9jayhOTywgX3ZhbHVlc1swXSwgJnN0b3ApOwotICB9Ci0gIGlmICghc3RvcCAmJiBfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhZRVMsIF92YWx1ZXNbMV0sICZzdG9wKTsKLSAgfQotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIE5TVUludGVnZXIgY291bnQgPSAwOwotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICArK2NvdW50OwotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQ2NEZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICAgIH0KLSAgfQotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIGlmIChfdmFsdWVTZXRbaV0pIHsKLSAgICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDY0RmllbGRTaXplKF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICAgIFdyaXRlRGljdEJvb2xGaWVsZChvdXRwdXRTdHJlYW0sIChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0gICAgICBXcml0ZURpY3RJbnQ2NEZpZWxkKG91dHB1dFN0cmVhbSwgX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbEludDY0RGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgaWYgKG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLSAgICAgICAgX3ZhbHVlc1tpXSA9IG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooaW50NjRfdCl2YWx1ZSBmb3JLZXk6KEJPT0wpa2V5IHsKLSAgaW50IGlkeCA9IChrZXkgPyAxIDogMCk7Ci0gIF92YWx1ZXNbaWR4XSA9IHZhbHVlOwotICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5IHsKLSAgX3ZhbHVlU2V0W2FLZXkgPyAxIDogMF0gPSBOTzsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBfdmFsdWVTZXRbMF0gPSBOTzsKLSAgX3ZhbHVlU2V0WzFdID0gTk87Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9CT09MX0tFWV9UT19QT0RfSU1QTChCb29sLCBCT09MKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gQm9vbAotCi1AaW1wbGVtZW50YXRpb24gR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IHsKLSBAcGFja2FnZQotICBCT09MIF92YWx1ZXNbMl07Ci0gIEJPT0wgX3ZhbHVlU2V0WzJdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihCT09MKXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sQm9vbERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkJvb2xCb29sRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCQm9vbEJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbEJvb2xEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBCT09MIFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgaW50IGlkeCA9IGtleXNbaV0gPyAxIDogMDsKLSAgICAgIF92YWx1ZXNbaWR4XSA9IHZhbHVlc1tpXTsKLSAgICAgIF92YWx1ZVNldFtpZHhdID0gWUVTOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGljdGlvbmFyeTooR1BCQm9vbEJvb2xEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgICAgaWYgKGRpY3Rpb25hcnktPl92YWx1ZVNldFtpXSkgewotICAgICAgICAgIF92YWx1ZXNbaV0gPSBkaWN0aW9uYXJ5LT5fdmFsdWVzW2ldOwotICAgICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0jaWYgIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0jZW5kaWYgIC8vICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJCb29sQm9vbERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCQm9vbEJvb2xEaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gIT0gb3RoZXItPl92YWx1ZVNldFswXSkgfHwKLSAgICAgIChfdmFsdWVTZXRbMV0gIT0gb3RoZXItPl92YWx1ZVNldFsxXSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gJiYgKF92YWx1ZXNbMF0gIT0gb3RoZXItPl92YWx1ZXNbMF0pKSB8fAotICAgICAgKF92YWx1ZVNldFsxXSAmJiAoX3ZhbHVlc1sxXSAhPSBvdGhlci0+X3ZhbHVlc1sxXSkpKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBZRVM7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIE5TTXV0YWJsZVN0cmluZyAqcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7IiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiTk86ICVkIiwgX3ZhbHVlc1swXV07Ci0gIH0KLSAgaWYgKF92YWx1ZVNldFsxXSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiWUVTOiAlZCIsIF92YWx1ZXNbMV1dOwotICB9Ci0gIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KEJPT0wgKil2YWx1ZSB7Ci0gIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotICBpZiAoX3ZhbHVlU2V0W2lkeF0pIHsKLSAgICBpZiAodmFsdWUpIHsKLSAgICAgICp2YWx1ZSA9IF92YWx1ZXNbaWR4XTsKLSAgICB9Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICByZXR1cm4gTk87Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIGludCBpZHggPSAoa2V5LT52YWx1ZUJvb2wgPyAxIDogMCk7Ci0gIF92YWx1ZXNbaWR4XSA9IHZhbHVlLT52YWx1ZUJvb2w7Ci0gIF92YWx1ZVNldFtpZHhdID0gWUVTOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIGJsb2NrKEAiZmFsc2UiLCAoX3ZhbHVlc1swXSA/IEAidHJ1ZSIgOiBAImZhbHNlIikpOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhAInRydWUiLCAoX3ZhbHVlc1sxXSA/IEAidHJ1ZSIgOiBAImZhbHNlIikpOwotICB9Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKEJPT0wga2V5LCBCT09MIHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIEJPT0wgc3RvcCA9IE5POwotICBpZiAoX3ZhbHVlU2V0WzBdKSB7Ci0gICAgYmxvY2soTk8sIF92YWx1ZXNbMF0sICZzdG9wKTsKLSAgfQotICBpZiAoIXN0b3AgJiYgX3ZhbHVlU2V0WzFdKSB7Ci0gICAgYmxvY2soWUVTLCBfdmFsdWVzWzFdLCAmc3RvcCk7Ci0gIH0KLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBOU1VJbnRlZ2VyIGNvdW50ID0gMDsKLSAgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgaWYgKF92YWx1ZVNldFtpXSkgewotICAgICAgKytjb3VudDsKLSAgICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0gICAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICAgIH0KLSAgfQotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIGlmIChfdmFsdWVTZXRbaV0pIHsKLSAgICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgICAgV3JpdGVEaWN0Qm9vbEZpZWxkKG91dHB1dFN0cmVhbSwgKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIFdyaXRlRGljdEJvb2xGaWVsZChvdXRwdXRTdHJlYW0sIF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkJvb2xCb29sRGljdGlvbmFyeSAqKW90aGVyRGljdGlvbmFyeSB7Ci0gIGlmIChvdGhlckRpY3Rpb25hcnkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgaWYgKG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLSAgICAgICAgX3ZhbHVlc1tpXSA9IG90aGVyRGljdGlvbmFyeS0+X3ZhbHVlc1tpXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRWYWx1ZTooQk9PTCl2YWx1ZSBmb3JLZXk6KEJPT0wpa2V5IHsKLSAgaW50IGlkeCA9IChrZXkgPyAxIDogMCk7Ci0gIF92YWx1ZXNbaWR4XSA9IHZhbHVlOwotICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5IHsKLSAgX3ZhbHVlU2V0W2FLZXkgPyAxIDogMF0gPSBOTzsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBfdmFsdWVTZXRbMF0gPSBOTzsKLSAgX3ZhbHVlU2V0WzFdID0gTk87Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9CT09MX0tFWV9UT19QT0RfSU1QTChGbG9hdCwgZmxvYXQpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBGbG9hdAotCi1AaW1wbGVtZW50YXRpb24gR1BCQm9vbEZsb2F0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgZmxvYXQgX3ZhbHVlc1syXTsKLSAgQk9PTCBfdmFsdWVTZXRbMl07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5IHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGZsb2F0KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sRmxvYXREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWVzOihjb25zdCBmbG9hdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sRmxvYXREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sRmxvYXREaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpudW1JdGVtc10gYXV0b3JlbGVhc2VdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdCB7Ci0gIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBmbG9hdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGludCBpZHggPSBrZXlzW2ldID8gMSA6IDA7Ci0gICAgICBfdmFsdWVzW2lkeF0gPSB2YWx1ZXNbaV07Ci0gICAgICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgc2VsZiA9IFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgICAgICBpZiAoZGljdGlvbmFyeS0+X3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAgICAgX3ZhbHVlc1tpXSA9IGRpY3Rpb25hcnktPl92YWx1ZXNbaV07Ci0gICAgICAgICAgX3ZhbHVlU2V0W2ldID0gWUVTOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gICNwcmFnbWEgdW51c2VkKG51bUl0ZW1zKQotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLSNpZiAhZGVmaW5lZChOU19CTE9DS19BU1NFUlRJT05TKQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLSNlbmRpZiAgLy8gIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLQotLSAoaW5zdGFuY2V0eXBlKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIHJldHVybiBbW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCQm9vbEZsb2F0RGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgY2xhc3NdXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoKF92YWx1ZVNldFswXSAhPSBvdGhlci0+X3ZhbHVlU2V0WzBdKSB8fAotICAgICAgKF92YWx1ZVNldFsxXSAhPSBvdGhlci0+X3ZhbHVlU2V0WzFdKSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoKF92YWx1ZVNldFswXSAmJiAoX3ZhbHVlc1swXSAhPSBvdGhlci0+X3ZhbHVlc1swXSkpIHx8Ci0gICAgICAoX3ZhbHVlU2V0WzFdICYmIChfdmFsdWVzWzFdICE9IG90aGVyLT5fdmFsdWVzWzFdKSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFlFUzsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuIChfdmFsdWVTZXRbMF0gPyAxIDogMCkgKyAoX3ZhbHVlU2V0WzFdID8gMSA6IDApOwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgTlNNdXRhYmxlU3RyaW5nICpyZXN1bHQgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+IHsiLCBbc2VsZiBjbGFzc10sIHNlbGZdOwotICBpZiAoX3ZhbHVlU2V0WzBdKSB7Ci0gICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCJOTzogJWYiLCBfdmFsdWVzWzBdXTsKLSAgfQotICBpZiAoX3ZhbHVlU2V0WzFdKSB7Ci0gICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCJZRVM6ICVmIiwgX3ZhbHVlc1sxXV07Ci0gIH0KLSAgW3Jlc3VsdCBhcHBlbmRTdHJpbmc6QCIgfSJdOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIChfdmFsdWVTZXRbMF0gPyAxIDogMCkgKyAoX3ZhbHVlU2V0WzFdID8gMSA6IDApOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihCT09MKWtleSB2YWx1ZTooZmxvYXQgKil2YWx1ZSB7Ci0gIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotICBpZiAoX3ZhbHVlU2V0W2lkeF0pIHsKLSAgICBpZiAodmFsdWUpIHsKLSAgICAgICp2YWx1ZSA9IF92YWx1ZXNbaWR4XTsKLSAgICB9Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICByZXR1cm4gTk87Ci19Ci0KLS0gKHZvaWQpc2V0R1BCR2VuZXJpY1ZhbHVlOihHUEJHZW5lcmljVmFsdWUgKil2YWx1ZQotICAgICBmb3JHUEJHZW5lcmljVmFsdWVLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleSB7Ci0gIGludCBpZHggPSAoa2V5LT52YWx1ZUJvb2wgPyAxIDogMCk7Ci0gIF92YWx1ZXNbaWR4XSA9IHZhbHVlLT52YWx1ZUZsb2F0OwotICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLX0KLQotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jayB7Ci0gIGlmIChfdmFsdWVTZXRbMF0pIHsKLSAgICBibG9jayhAImZhbHNlIiwgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlLipnIiwgRkxUX0RJRywgX3ZhbHVlc1swXV0pOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhAInRydWUiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiUuKmciLCBGTFRfRElHLCBfdmFsdWVzWzFdXSk7Ci0gIH0KLX0KLQotLSAodm9pZCllbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoQk9PTCBrZXksIGZsb2F0IHZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIEJPT0wgc3RvcCA9IE5POwotICBpZiAoX3ZhbHVlU2V0WzBdKSB7Ci0gICAgYmxvY2soTk8sIF92YWx1ZXNbMF0sICZzdG9wKTsKLSAgfQotICBpZiAoIXN0b3AgJiYgX3ZhbHVlU2V0WzFdKSB7Ci0gICAgYmxvY2soWUVTLCBfdmFsdWVzWzFdLCAmc3RvcCk7Ci0gIH0KLX0KLQotLSAoc2l6ZV90KWNvbXB1dGVTZXJpYWxpemVkU2l6ZUFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBOU1VJbnRlZ2VyIGNvdW50ID0gMDsKLSAgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgaWYgKF92YWx1ZVNldFtpXSkgewotICAgICAgKytjb3VudDsKLSAgICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0gICAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0RmxvYXRGaWVsZFNpemUoX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgICB9Ci0gIH0KLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RGbG9hdEZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzooaW50MzJfdCltc2dTaXplXTsKLSAgICAgIC8vIFdyaXRlIHRoZSBmaWVsZHMuCi0gICAgICBXcml0ZURpY3RCb29sRmllbGQob3V0cHV0U3RyZWFtLCAoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgV3JpdGVEaWN0RmxvYXRGaWVsZChvdXRwdXRTdHJlYW0sIF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgIGlmIChvdGhlckRpY3Rpb25hcnktPl92YWx1ZVNldFtpXSkgewotICAgICAgICBfdmFsdWVTZXRbaV0gPSBZRVM7Ci0gICAgICAgIF92YWx1ZXNbaV0gPSBvdGhlckRpY3Rpb25hcnktPl92YWx1ZXNbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGZsb2F0KXZhbHVlIGZvcktleTooQk9PTClrZXkgewotICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLSAgX3ZhbHVlc1tpZHhdID0gdmFsdWU7Ci0gIF92YWx1ZVNldFtpZHhdID0gWUVTOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZVZhbHVlRm9yS2V5OihCT09MKWFLZXkgewotICBfdmFsdWVTZXRbYUtleSA/IDEgOiAwXSA9IE5POwotfQotCi0tICh2b2lkKXJlbW92ZUFsbCB7Ci0gIF92YWx1ZVNldFswXSA9IE5POwotICBfdmFsdWVTZXRbMV0gPSBOTzsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBESUNUSU9OQVJZX0JPT0xfS0VZX1RPX1BPRF9JTVBMKERvdWJsZSwgZG91YmxlKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gRG91YmxlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sRG91YmxlRGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgZG91YmxlIF92YWx1ZXNbMl07Ci0gIEJPT0wgX3ZhbHVlU2V0WzJdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihkb3VibGUpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihCT09MKWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6Zm9yS2V5czpjb3VudDoKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sRG91YmxlRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aERpY3Rpb25hcnk6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbERvdWJsZURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aERpY3Rpb25hcnk6ZGljdGlvbmFyeV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhDYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aENhcGFjaXR5Om51bUl0ZW1zXSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGRvdWJsZSBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgQk9PTCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGludCBpZHggPSBrZXlzW2ldID8gMSA6IDA7Ci0gICAgICBfdmFsdWVzW2lkeF0gPSB2YWx1ZXNbaV07Ci0gICAgICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5ICopZGljdGlvbmFyeSB7Ci0gIHNlbGYgPSBbc2VsZiBpbml0V2l0aFZhbHVlczpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLSAgaWYgKHNlbGYpIHsKLSAgICBpZiAoZGljdGlvbmFyeSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgICAgaWYgKGRpY3Rpb25hcnktPl92YWx1ZVNldFtpXSkgewotICAgICAgICAgIF92YWx1ZXNbaV0gPSBkaWN0aW9uYXJ5LT5fdmFsdWVzW2ldOwotICAgICAgICAgIF92YWx1ZVNldFtpXSA9IFlFUzsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0jaWYgIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0jZW5kaWYgIC8vICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJCb29sRG91YmxlRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdIGluaXRXaXRoRGljdGlvbmFyeTpzZWxmXTsKLX0KLQotLSAoQk9PTClpc0VxdWFsOihHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqKW90aGVyIHsKLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W0dQQkJvb2xEb3VibGVEaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gIT0gb3RoZXItPl92YWx1ZVNldFswXSkgfHwKLSAgICAgIChfdmFsdWVTZXRbMV0gIT0gb3RoZXItPl92YWx1ZVNldFsxXSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gJiYgKF92YWx1ZXNbMF0gIT0gb3RoZXItPl92YWx1ZXNbMF0pKSB8fAotICAgICAgKF92YWx1ZVNldFsxXSAmJiAoX3ZhbHVlc1sxXSAhPSBvdGhlci0+X3ZhbHVlc1sxXSkpKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBZRVM7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIE5TTXV0YWJsZVN0cmluZyAqcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7IiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiTk86ICVsZiIsIF92YWx1ZXNbMF1dOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIllFUzogJWxmIiwgX3ZhbHVlc1sxXV07Ci0gIH0KLSAgW3Jlc3VsdCBhcHBlbmRTdHJpbmc6QCIgfSJdOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tIChOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIChfdmFsdWVTZXRbMF0gPyAxIDogMCkgKyAoX3ZhbHVlU2V0WzFdID8gMSA6IDApOwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihCT09MKWtleSB2YWx1ZTooZG91YmxlICopdmFsdWUgewotICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLSAgaWYgKF92YWx1ZVNldFtpZHhdKSB7Ci0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICAqdmFsdWUgPSBfdmFsdWVzW2lkeF07Ci0gICAgfQotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgcmV0dXJuIE5POwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBpbnQgaWR4ID0gKGtleS0+dmFsdWVCb29sID8gMSA6IDApOwotICBfdmFsdWVzW2lkeF0gPSB2YWx1ZS0+dmFsdWVEb3VibGU7Ci0gIF92YWx1ZVNldFtpZHhdID0gWUVTOwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIGJsb2NrKEAiZmFsc2UiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiUuKmxnIiwgREJMX0RJRywgX3ZhbHVlc1swXV0pOwotICB9Ci0gIGlmIChfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhAInRydWUiLCBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiUuKmxnIiwgREJMX0RJRywgX3ZhbHVlc1sxXV0pOwotICB9Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKEJPT0wga2V5LCBkb3VibGUgdmFsdWUsIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgQk9PTCBzdG9wID0gTk87Ci0gIGlmIChfdmFsdWVTZXRbMF0pIHsKLSAgICBibG9jayhOTywgX3ZhbHVlc1swXSwgJnN0b3ApOwotICB9Ci0gIGlmICghc3RvcCAmJiBfdmFsdWVTZXRbMV0pIHsKLSAgICBibG9jayhZRVMsIF92YWx1ZXNbMV0sICZzdG9wKTsKLSAgfQotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIE5TVUludGVnZXIgY291bnQgPSAwOwotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICArK2NvdW50OwotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3REb3VibGVGaWVsZFNpemUoX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKG1zZ1NpemUpICsgbXNnU2l6ZTsKLSAgICB9Ci0gIH0KLSAgc2l6ZV90IHRhZ1NpemUgPSBHUEJDb21wdXRlV2lyZUZvcm1hdFRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJEYXRhVHlwZU1lc3NhZ2UpOwotICByZXN1bHQgKz0gdGFnU2l6ZSAqIGNvdW50OwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXRTdHJlYW0KLSAgICAgICAgICAgICAgICAgICAgICAgICBhc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZCB7Ci0gIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgdWludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCRmllbGROdW1iZXIoZmllbGQpLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICAvLyBXcml0ZSB0aGUgdGFnLgotICAgICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6dGFnXTsKLSAgICAgIC8vIFdyaXRlIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3REb3VibGVGaWVsZFNpemUoX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgICAgW291dHB1dFN0cmVhbSB3cml0ZUludDMyTm9UYWc6KGludDMyX3QpbXNnU2l6ZV07Ci0gICAgICAvLyBXcml0ZSB0aGUgZmllbGRzLgotICAgICAgV3JpdGVEaWN0Qm9vbEZpZWxkKG91dHB1dFN0cmVhbSwgKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIFdyaXRlRGljdERvdWJsZUZpZWxkKG91dHB1dFN0cmVhbSwgX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKilvdGhlckRpY3Rpb25hcnkgewotICBpZiAob3RoZXJEaWN0aW9uYXJ5KSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAgIGlmIChvdGhlckRpY3Rpb25hcnktPl92YWx1ZVNldFtpXSkgewotICAgICAgICBfdmFsdWVTZXRbaV0gPSBZRVM7Ci0gICAgICAgIF92YWx1ZXNbaV0gPSBvdGhlckRpY3Rpb25hcnktPl92YWx1ZXNbaV07Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VmFsdWU6KGRvdWJsZSl2YWx1ZSBmb3JLZXk6KEJPT0wpa2V5IHsKLSAgaW50IGlkeCA9IChrZXkgPyAxIDogMCk7Ci0gIF92YWx1ZXNbaWR4XSA9IHZhbHVlOwotICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKF9hdXRvY3JlYXRvciwgc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClyZW1vdmVWYWx1ZUZvcktleTooQk9PTClhS2V5IHsKLSAgX3ZhbHVlU2V0W2FLZXkgPyAxIDogMF0gPSBOTzsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBfdmFsdWVTZXRbMF0gPSBOTzsKLSAgX3ZhbHVlU2V0WzFdID0gTk87Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9CT09MX0tFWV9UT19PQkpFQ1RfSU1QTChPYmplY3QsIGlkKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gT2JqZWN0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sT2JqZWN0RGljdGlvbmFyeSB7Ci0gQHBhY2thZ2UKLSAgaWQgX3ZhbHVlc1syXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnkgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoT2JqZWN0OihpZClvYmplY3QKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooQk9PTClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhPYmplY3RzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbE9iamVjdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6Jm9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhPYmplY3RzOihjb25zdCBpZCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICAvLyBDYXN0IGlzIG5lZWRlZCBzbyB0aGUgY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhPYmplY3RzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbE9iamVjdERpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aE9iamVjdHM6b2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTooR1BCQm9vbE9iamVjdERpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoRGljdGlvbmFyeToKLSAgLy8gb24gdG8gZ2V0IHRoZSB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJCb29sT2JqZWN0RGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoRGljdGlvbmFyeTpkaWN0aW9uYXJ5XSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aENhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhPYmplY3RzOihjb25zdCBpZCBbXSlvYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICBzZWxmID0gW3N1cGVyIGluaXRdOwotICBpZiAoc2VsZikgewotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGlmICghb2JqZWN0c1tpXSkgewotICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgZm9ybWF0OkAiQXR0ZW1wdGluZyB0byBhZGQgbmlsIG9iamVjdCB0byBhIERpY3Rpb25hcnkiXTsKLSAgICAgIH0KLSAgICAgIGludCBpZHggPSBrZXlzW2ldID8gMSA6IDA7Ci0gICAgICBbX3ZhbHVlc1tpZHhdIHJlbGVhc2VdOwotICAgICAgX3ZhbHVlc1tpZHhdID0gKGlkKVtvYmplY3RzW2ldIHJldGFpbl07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEaWN0aW9uYXJ5OihHUEJCb29sT2JqZWN0RGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhPYmplY3RzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotICBpZiAoc2VsZikgewotICAgIGlmIChkaWN0aW9uYXJ5KSB7Ci0gICAgICBfdmFsdWVzWzBdID0gW2RpY3Rpb25hcnktPl92YWx1ZXNbMF0gcmV0YWluXTsKLSAgICAgIF92YWx1ZXNbMV0gPSBbZGljdGlvbmFyeS0+X3ZhbHVlc1sxXSByZXRhaW5dOwotICAgIH0KLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ2FwYWNpdHk6KE5TVUludGVnZXIpbnVtSXRlbXMgewotICAjcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoT2JqZWN0czpOVUxMIGZvcktleXM6TlVMTCBjb3VudDowXTsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgTlNBc3NlcnQoIV9hdXRvY3JlYXRvciwKLSAgICAgICAgICAgQCIlQDogQXV0b2NyZWF0b3IgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSByZWxlYXNlLCBhdXRvY3JlYXRvcjogJUAiLAotICAgICAgICAgICBbc2VsZiBjbGFzc10sIF9hdXRvY3JlYXRvcik7Ci0gIFtfdmFsdWVzWzBdIHJlbGVhc2VdOwotICBbX3ZhbHVlc1sxXSByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgcmV0dXJuIFtbR1BCQm9vbE9iamVjdERpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCQm9vbE9iamVjdERpY3Rpb25hcnkgKilvdGhlciB7Ci0gIGlmIChzZWxmID09IG90aGVyKSB7Ci0gICAgcmV0dXJuIFlFUzsKLSAgfQotICBpZiAoIVtvdGhlciBpc0tpbmRPZkNsYXNzOltHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIGlmICgoKF92YWx1ZXNbMF0gIT0gbmlsKSAhPSAob3RoZXItPl92YWx1ZXNbMF0gIT0gbmlsKSkgfHwKLSAgICAgICgoX3ZhbHVlc1sxXSAhPSBuaWwpICE9IChvdGhlci0+X3ZhbHVlc1sxXSAhPSBuaWwpKSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoKChfdmFsdWVzWzBdICE9IG5pbCkgJiYgKCFbX3ZhbHVlc1swXSBpc0VxdWFsOm90aGVyLT5fdmFsdWVzWzBdXSkpIHx8Ci0gICAgICAoKF92YWx1ZXNbMV0gIT0gbmlsKSAmJiAoIVtfdmFsdWVzWzFdIGlzRXF1YWw6b3RoZXItPl92YWx1ZXNbMV1dKSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFlFUzsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgcmV0dXJuICgoX3ZhbHVlc1swXSAhPSBuaWwpID8gMSA6IDApICsgKChfdmFsdWVzWzFdICE9IG5pbCkgPyAxIDogMCk7Ci19Ci0KLS0gKE5TU3RyaW5nICopZGVzY3JpcHRpb24gewotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIjwlQCAlcD4geyIsIFtzZWxmIGNsYXNzXSwgc2VsZl07Ci0gIGlmICgoX3ZhbHVlc1swXSAhPSBuaWwpKSB7Ci0gICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCJOTzogJUAiLCBfdmFsdWVzWzBdXTsKLSAgfQotICBpZiAoKF92YWx1ZXNbMV0gIT0gbmlsKSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiWUVTOiAlQCIsIF92YWx1ZXNbMV1dOwotICB9Ci0gIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiAoKF92YWx1ZXNbMF0gIT0gbmlsKSA/IDEgOiAwKSArICgoX3ZhbHVlc1sxXSAhPSBuaWwpID8gMSA6IDApOwotfQotCi0tIChpZClvYmplY3RGb3JLZXk6KEJPT0wpa2V5IHsKLSAgcmV0dXJuIF92YWx1ZXNba2V5ID8gMSA6IDBdOwotfQotCi0tICh2b2lkKXNldEdQQkdlbmVyaWNWYWx1ZTooR1BCR2VuZXJpY1ZhbHVlICopdmFsdWUKLSAgICAgZm9yR1BCR2VuZXJpY1ZhbHVlS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkgewotICBpbnQgaWR4ID0gKGtleS0+dmFsdWVCb29sID8gMSA6IDApOwotICBbX3ZhbHVlc1tpZHhdIHJlbGVhc2VdOwotICBfdmFsdWVzW2lkeF0gPSBbdmFsdWUtPnZhbHVlU3RyaW5nIHJldGFpbl07Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlRm9yVGV4dEZvcm1hdDoodm9pZCAoXikoaWQga2V5T2JqLCBpZCB2YWx1ZU9iaikpYmxvY2sgewotICBpZiAoX3ZhbHVlc1swXSAhPSBuaWwpIHsKLSAgICBibG9jayhAImZhbHNlIiwgX3ZhbHVlc1swXSk7Ci0gIH0KLSAgaWYgKChfdmFsdWVzWzFdICE9IG5pbCkpIHsKLSAgICBibG9jayhAInRydWUiLCBfdmFsdWVzWzFdKTsKLSAgfQotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazoKLSAgICAodm9pZCAoXikoQk9PTCBrZXksIGlkIG9iamVjdCwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBCT09MIHN0b3AgPSBOTzsKLSAgaWYgKF92YWx1ZXNbMF0gIT0gbmlsKSB7Ci0gICAgYmxvY2soTk8sIF92YWx1ZXNbMF0sICZzdG9wKTsKLSAgfQotICBpZiAoIXN0b3AgJiYgKF92YWx1ZXNbMV0gIT0gbmlsKSkgewotICAgIGJsb2NrKFlFUywgX3ZhbHVlc1sxXSwgJnN0b3ApOwotICB9Ci19Ci0KLS0gKEJPT0wpaXNJbml0aWFsaXplZCB7Ci0gIGlmIChfdmFsdWVzWzBdICYmICFbX3ZhbHVlc1swXSBpc0luaXRpYWxpemVkXSkgewotICAgIHJldHVybiBOTzsKLSAgfQotICBpZiAoX3ZhbHVlc1sxXSAmJiAhW192YWx1ZXNbMV0gaXNJbml0aWFsaXplZF0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgcmV0dXJuIFlFUzsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICBHUEJCb29sT2JqZWN0RGljdGlvbmFyeSAqbmV3RGljdCA9Ci0gICAgICBbW0dQQkJvb2xPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlc1tpXSAhPSBuaWwpIHsKLSAgICAgIG5ld0RpY3QtPl92YWx1ZXNbaV0gPSBbX3ZhbHVlc1tpXSBjb3B5V2l0aFpvbmU6em9uZV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXdEaWN0OwotfQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIE5TVUludGVnZXIgY291bnQgPSAwOwotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlc1tpXSAhPSBuaWwpIHsKLSAgICAgICsrY291bnQ7Ci0gICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdE9iamVjdEZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICAgIH0KLSAgfQotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIGlmIChfdmFsdWVzW2ldICE9IG5pbCkgewotICAgICAgLy8gV3JpdGUgdGhlIHRhZy4KLSAgICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOnRhZ107Ci0gICAgICAvLyBXcml0ZSB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgICAgIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0gICAgICBtc2dTaXplICs9IENvbXB1dGVEaWN0T2JqZWN0RmllbGRTaXplKF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICAgIFdyaXRlRGljdEJvb2xGaWVsZChvdXRwdXRTdHJlYW0sIChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0gICAgICBXcml0ZURpY3RPYmplY3RGaWVsZChvdXRwdXRTdHJlYW0sIF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6KEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICBpZiAob3RoZXJEaWN0aW9uYXJ5LT5fdmFsdWVzW2ldICE9IG5pbCkgewotICAgICAgICBbX3ZhbHVlc1tpXSByZWxlYXNlXTsKLSAgICAgICAgX3ZhbHVlc1tpXSA9IFtvdGhlckRpY3Rpb25hcnktPl92YWx1ZXNbaV0gcmV0YWluXTsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKF9hdXRvY3JlYXRvcikgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClzZXRPYmplY3Q6KGlkKW9iamVjdCBmb3JLZXk6KEJPT0wpa2V5IHsKLSAgaWYgKCFvYmplY3QpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJBdHRlbXB0aW5nIHRvIGFkZCBuaWwgb2JqZWN0IHRvIGEgRGljdGlvbmFyeSJdOwotICB9Ci0gIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotICBbX3ZhbHVlc1tpZHhdIHJlbGVhc2VdOwotICBfdmFsdWVzW2lkeF0gPSBbb2JqZWN0IHJldGFpbl07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlT2JqZWN0Rm9yS2V5OihCT09MKWFLZXkgewotICBpbnQgaWR4ID0gKGFLZXkgPyAxIDogMCk7Ci0gIFtfdmFsdWVzW2lkeF0gcmVsZWFzZV07Ci0gIF92YWx1ZXNbaWR4XSA9IG5pbDsKLX0KLQotLSAodm9pZClyZW1vdmVBbGwgewotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIFtfdmFsdWVzW2ldIHJlbGVhc2VdOwotICAgIF92YWx1ZXNbaV0gPSBuaWw7Ci0gIH0KLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORC1FTkQgKDggZXhwYW5zaW9ucykKLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBFbnVtCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sRW51bURpY3Rpb25hcnkgewotIEBwYWNrYWdlCi0gIEdQQkVudW1WYWxpZGF0aW9uRnVuYyBfdmFsaWRhdGlvbkZ1bmM7Ci0gIGludDMyX3QgX3ZhbHVlc1syXTsKLSAgQk9PTCBfdmFsdWVTZXRbMl07Ci19Ci0KLUBzeW50aGVzaXplIHZhbGlkYXRpb25GdW5jID0gX3ZhbGlkYXRpb25GdW5jOwotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czpOVUxMCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDowXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTooaW50MzJfdClyYXdWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihCT09MKWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHNvIHRoZSBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczpmb3JLZXlzOmNvdW50OgotICAvLyBvbiB0byBnZXQgdGhlIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQkJvb2xFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZyYXdWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246KEdQQkVudW1WYWxpZGF0aW9uRnVuYylmdW5jCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEJPT0wgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbEVudW1EaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF0gYXV0b3JlbGVhc2VdOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OihHUEJCb29sRW51bURpY3Rpb25hcnkgKilkaWN0aW9uYXJ5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgc28gdGhlIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOmZvcktleXM6Y291bnQ6Ci0gIC8vIG9uIHRvIGdldCB0aGUgdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCQm9vbEVudW1EaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhEaWN0aW9uYXJ5OmRpY3Rpb25hcnldIGF1dG9yZWxlYXNlXTsKLX0KLQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOihHUEJFbnVtVmFsaWRhdGlvbkZ1bmMpZnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhcGFjaXR5OihOU1VJbnRlZ2VyKW51bUl0ZW1zIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgY2FwYWNpdHk6bnVtSXRlbXNdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246TlVMTCByYXdWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZnVuYyByYXdWYWx1ZXM6TlVMTCBmb3JLZXlzOk5VTEwgY291bnQ6MF07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXJhd1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBCT09MIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0gIHNlbGYgPSBbc3VwZXIgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgX3ZhbGlkYXRpb25GdW5jID0gKGZ1bmMgIT0gTlVMTCA/IGZ1bmMgOiBEaWN0RGVmYXVsdF9Jc1ZhbGlkVmFsdWUpOwotICAgIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIGludCBpZHggPSBrZXlzW2ldID8gMSA6IDA7Ci0gICAgICBfdmFsdWVzW2lkeF0gPSByYXdWYWx1ZXNbaV07Ci0gICAgICBfdmFsdWVTZXRbaWR4XSA9IFlFUzsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERpY3Rpb25hcnk6KEdQQkJvb2xFbnVtRGljdGlvbmFyeSAqKWRpY3Rpb25hcnkgewotICBzZWxmID0gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZGljdGlvbmFyeS52YWxpZGF0aW9uRnVuYwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6TlVMTAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICAgIGlmIChkaWN0aW9uYXJ5LT5fdmFsdWVTZXRbaV0pIHsKLSAgICAgICAgICBfdmFsdWVzW2ldID0gZGljdGlvbmFyeS0+X3ZhbHVlc1tpXTsKLSAgICAgICAgICBfdmFsdWVTZXRbaV0gPSBZRVM7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjooR1BCRW51bVZhbGlkYXRpb25GdW5jKWZ1bmMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXBhY2l0eTooTlNVSW50ZWdlciludW1JdGVtcyB7Ci0jcHJhZ21hIHVudXNlZChudW1JdGVtcykKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZ1bmMgcmF3VmFsdWVzOk5VTEwgZm9yS2V5czpOVUxMIGNvdW50OjBdOwotfQotCi0jaWYgIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbc3VwZXIgZGVhbGxvY107Ci19Ci0jZW5kaWYgIC8vICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0KLS0gKGluc3RhbmNldHlwZSljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICByZXR1cm4gW1tHUEJCb29sRW51bURpY3Rpb25hcnkgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aERpY3Rpb25hcnk6c2VsZl07Ci19Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCQm9vbEVudW1EaWN0aW9uYXJ5ICopb3RoZXIgewotICBpZiAoc2VsZiA9PSBvdGhlcikgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgaWYgKCFbb3RoZXIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbEVudW1EaWN0aW9uYXJ5IGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gIT0gb3RoZXItPl92YWx1ZVNldFswXSkgfHwKLSAgICAgIChfdmFsdWVTZXRbMV0gIT0gb3RoZXItPl92YWx1ZVNldFsxXSkpIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLSAgaWYgKChfdmFsdWVTZXRbMF0gJiYgKF92YWx1ZXNbMF0gIT0gb3RoZXItPl92YWx1ZXNbMF0pKSB8fAotICAgICAgKF92YWx1ZVNldFsxXSAmJiAoX3ZhbHVlc1sxXSAhPSBvdGhlci0+X3ZhbHVlc1sxXSkpKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0gIHJldHVybiBZRVM7Ci19Ci0KLS0gKE5TVUludGVnZXIpaGFzaCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIE5TTXV0YWJsZVN0cmluZyAqcmVzdWx0ID0gW05TTXV0YWJsZVN0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPiB7IiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiTk86ICVkIiwgX3ZhbHVlc1swXV07Ci0gIH0KLSAgaWYgKF92YWx1ZVNldFsxXSkgewotICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiWUVTOiAlZCIsIF92YWx1ZXNbMV1dOwotICB9Ci0gIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiIH0iXTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiAoX3ZhbHVlU2V0WzBdID8gMSA6IDApICsgKF92YWx1ZVNldFsxXSA/IDEgOiAwKTsKLX0KLQotLSAoQk9PTCl2YWx1ZUZvcktleTooQk9PTClrZXkgdmFsdWU6KGludDMyX3QqKXZhbHVlIHsKLSAgaW50IGlkeCA9IChrZXkgPyAxIDogMCk7Ci0gIGlmIChfdmFsdWVTZXRbaWR4XSkgewotICAgIGlmICh2YWx1ZSkgewotICAgICAgaW50MzJfdCByZXN1bHQgPSBfdmFsdWVzW2lkeF07Ci0gICAgICBpZiAoIV92YWxpZGF0aW9uRnVuYyhyZXN1bHQpKSB7Ci0gICAgICAgIHJlc3VsdCA9IGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWU7Ci0gICAgICB9Ci0gICAgICAqdmFsdWUgPSByZXN1bHQ7Ci0gICAgfQotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgcmV0dXJuIE5POwotfQotCi0tIChCT09MKXZhbHVlRm9yS2V5OihCT09MKWtleSByYXdWYWx1ZTooaW50MzJfdCopcmF3VmFsdWUgewotICBpbnQgaWR4ID0gKGtleSA/IDEgOiAwKTsKLSAgaWYgKF92YWx1ZVNldFtpZHhdKSB7Ci0gICAgaWYgKHJhd1ZhbHVlKSB7Ci0gICAgICAqcmF3VmFsdWUgPSBfdmFsdWVzW2lkeF07Ci0gICAgfQotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgcmV0dXJuIE5POwotfQotCi0tICh2b2lkKWVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOgotICAgICh2b2lkICheKShCT09MIGtleSwgaW50MzJfdCB2YWx1ZSwgQk9PTCAqc3RvcCkpYmxvY2sgewotICBCT09MIHN0b3AgPSBOTzsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIGJsb2NrKE5PLCBfdmFsdWVzWzBdLCAmc3RvcCk7Ci0gIH0KLSAgaWYgKCFzdG9wICYmIF92YWx1ZVNldFsxXSkgewotICAgIGJsb2NrKFlFUywgX3ZhbHVlc1sxXSwgJnN0b3ApOwotICB9Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Ci0gICAgKHZvaWQgKF4pKEJPT0wga2V5LCBpbnQzMl90IHJhd1ZhbHVlLCBCT09MICpzdG9wKSlibG9jayB7Ci0gIEJPT0wgc3RvcCA9IE5POwotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZnVuYyA9IF92YWxpZGF0aW9uRnVuYzsKLSAgaW50MzJfdCB2YWxpZGF0ZWRWYWx1ZTsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIHZhbGlkYXRlZFZhbHVlID0gX3ZhbHVlc1swXTsKLSAgICBpZiAoIWZ1bmModmFsaWRhdGVkVmFsdWUpKSB7Ci0gICAgICB2YWxpZGF0ZWRWYWx1ZSA9IGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWU7Ci0gICAgfQotICAgIGJsb2NrKE5PLCB2YWxpZGF0ZWRWYWx1ZSwgJnN0b3ApOwotICB9Ci0gIGlmICghc3RvcCAmJiBfdmFsdWVTZXRbMV0pIHsKLSAgICB2YWxpZGF0ZWRWYWx1ZSA9IF92YWx1ZXNbMV07Ci0gICAgaWYgKCFmdW5jKHZhbGlkYXRlZFZhbHVlKSkgewotICAgICAgdmFsaWRhdGVkVmFsdWUgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlOwotICAgIH0KLSAgICBibG9jayhZRVMsIHZhbGlkYXRlZFZhbHVlLCAmc3RvcCk7Ci0gIH0KLX0KLQotLy8lUERETS1FWFBBTkQgU0VSSUFMX0RBVEFfRk9SX0VOVFJZX1BPRF9FbnVtKEJvb2wpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAoTlNEYXRhICopc2VyaWFsaXplZERhdGFGb3JVbmtub3duVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleURhdGFUeXBlOihHUEJEYXRhVHlwZSlrZXlEYXRhVHlwZSB7Ci0gIHNpemVfdCBtc2dTaXplID0gQ29tcHV0ZURpY3RCb29sRmllbGRTaXplKGtleS0+dmFsdWVCb29sLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEVudW1GaWVsZFNpemUodmFsdWUsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUVudW0pOwotICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6bXNnU2l6ZV07Ci0gIEdQQkNvZGVkT3V0cHV0U3RyZWFtICpvdXRwdXRTdHJlYW0gPSBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIFdyaXRlRGljdEJvb2xGaWVsZChvdXRwdXRTdHJlYW0sIGtleS0+dmFsdWVCb29sLCBrTWFwS2V5RmllbGROdW1iZXIsIGtleURhdGFUeXBlKTsKLSAgV3JpdGVEaWN0RW51bUZpZWxkKG91dHB1dFN0cmVhbSwgdmFsdWUsIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUVudW0pOwotICBbb3V0cHV0U3RyZWFtIHJlbGVhc2VdOwotICByZXR1cm4gZGF0YTsKLX0KLQotLy8lUERETS1FWFBBTkQtRU5EIFNFUklBTF9EQVRBX0ZPUl9FTlRSWV9QT0RfRW51bShCb29sKQotCi0tIChzaXplX3QpY29tcHV0ZVNlcmlhbGl6ZWRTaXplQXNGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQgewotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIE5TVUludGVnZXIgY291bnQgPSAwOwotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBpZiAoX3ZhbHVlU2V0W2ldKSB7Ci0gICAgICArK2NvdW50OwotICAgICAgc2l6ZV90IG1zZ1NpemUgPSBDb21wdXRlRGljdEJvb2xGaWVsZFNpemUoKGkgPT0gMSksIGtNYXBLZXlGaWVsZE51bWJlciwgR1BCRGF0YVR5cGVCb29sKTsKLSAgICAgIG1zZ1NpemUgKz0gQ29tcHV0ZURpY3RJbnQzMkZpZWxkU2l6ZShfdmFsdWVzW2ldLCBrTWFwVmFsdWVGaWVsZE51bWJlciwgdmFsdWVEYXRhVHlwZSk7Ci0gICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIobXNnU2l6ZSkgKyBtc2dTaXplOwotICAgIH0KLSAgfQotICBzaXplX3QgdGFnU2l6ZSA9IEdQQkNvbXB1dGVXaXJlRm9ybWF0VGFnU2l6ZShHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQkRhdGFUeXBlTWVzc2FnZSk7Ci0gIHJlc3VsdCArPSB0YWdTaXplICogY291bnQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICB1aW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJGaWVsZE51bWJlcihmaWVsZCksIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIGlmIChfdmFsdWVTZXRbaV0pIHsKLSAgICAgIC8vIFdyaXRlIHRoZSB0YWcuCi0gICAgICBbb3V0cHV0U3RyZWFtIHdyaXRlSW50MzJOb1RhZzp0YWddOwotICAgICAgLy8gV3JpdGUgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICBzaXplX3QgbXNnU2l6ZSA9IENvbXB1dGVEaWN0Qm9vbEZpZWxkU2l6ZSgoaSA9PSAxKSwga01hcEtleUZpZWxkTnVtYmVyLCBHUEJEYXRhVHlwZUJvb2wpOwotICAgICAgbXNnU2l6ZSArPSBDb21wdXRlRGljdEludDMyRmllbGRTaXplKF92YWx1ZXNbaV0sIGtNYXBWYWx1ZUZpZWxkTnVtYmVyLCB2YWx1ZURhdGFUeXBlKTsKLSAgICAgIFtvdXRwdXRTdHJlYW0gd3JpdGVJbnQzMk5vVGFnOihpbnQzMl90KW1zZ1NpemVdOwotICAgICAgLy8gV3JpdGUgdGhlIGZpZWxkcy4KLSAgICAgIFdyaXRlRGljdEJvb2xGaWVsZChvdXRwdXRTdHJlYW0sIChpID09IDEpLCBrTWFwS2V5RmllbGROdW1iZXIsIEdQQkRhdGFUeXBlQm9vbCk7Ci0gICAgICBXcml0ZURpY3RJbnQzMkZpZWxkKG91dHB1dFN0cmVhbSwgX3ZhbHVlc1tpXSwga01hcFZhbHVlRmllbGROdW1iZXIsIHZhbHVlRGF0YVR5cGUpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKWVudW1lcmF0ZUZvclRleHRGb3JtYXQ6KHZvaWQgKF4pKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopKWJsb2NrIHsKLSAgaWYgKF92YWx1ZVNldFswXSkgewotICAgIGJsb2NrKEAiZmFsc2UiLCBAKF92YWx1ZXNbMF0pKTsKLSAgfQotICBpZiAoX3ZhbHVlU2V0WzFdKSB7Ci0gICAgYmxvY2soQCJ0cnVlIiwgQChfdmFsdWVzWzFdKSk7Ci0gIH0KLX0KLQotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5IHsKLSAgaW50IGlkeCA9IChrZXktPnZhbHVlQm9vbCA/IDEgOiAwKTsKLSAgX3ZhbHVlc1tpZHhdID0gdmFsdWUtPnZhbHVlSW50MzI7Ci0gIF92YWx1ZVNldFtpZHhdID0gWUVTOwotfQotCi0tICh2b2lkKWFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTooR1BCQm9vbEVudW1EaWN0aW9uYXJ5ICopb3RoZXJEaWN0aW9uYXJ5IHsKLSAgaWYgKG90aGVyRGljdGlvbmFyeSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgICBpZiAob3RoZXJEaWN0aW9uYXJ5LT5fdmFsdWVTZXRbaV0pIHsKLSAgICAgICAgX3ZhbHVlU2V0W2ldID0gWUVTOwotICAgICAgICBfdmFsdWVzW2ldID0gb3RoZXJEaWN0aW9uYXJ5LT5fdmFsdWVzW2ldOwotICAgICAgfQotICAgIH0KLSAgICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXNldFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooQk9PTClrZXkgewotICBpZiAoIV92YWxpZGF0aW9uRnVuYyh2YWx1ZSkpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJHUEJCb29sRW51bURpY3Rpb25hcnk6IEF0dGVtcHQgdG8gc2V0IGFuIHVua25vd24gZW51bSB2YWx1ZSAoJWQpIiwKLSAgICAgdmFsdWVdOwotICB9Ci0gIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotICBfdmFsdWVzW2lkeF0gPSB2YWx1ZTsKLSAgX3ZhbHVlU2V0W2lkeF0gPSBZRVM7Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpc2V0UmF3VmFsdWU6KGludDMyX3QpcmF3VmFsdWUgZm9yS2V5OihCT09MKWtleSB7Ci0gIGludCBpZHggPSAoa2V5ID8gMSA6IDApOwotICBfdmFsdWVzW2lkeF0gPSByYXdWYWx1ZTsKLSAgX3ZhbHVlU2V0W2lkeF0gPSBZRVM7Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlVmFsdWVGb3JLZXk6KEJPT0wpYUtleSB7Ci0gIF92YWx1ZVNldFthS2V5ID8gMSA6IDBdID0gTk87Ci19Ci0KLS0gKHZvaWQpcmVtb3ZlQWxsIHsKLSAgX3ZhbHVlU2V0WzBdID0gTk87Ci0gIF92YWx1ZVNldFsxXSA9IE5POwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIE5TRGljdGlvbmFyeSBTdWJjbGFzcwotCi1AaW1wbGVtZW50YXRpb24gR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5IHsKLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqX2RpY3Rpb25hcnk7Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIE5TQXNzZXJ0KCFfYXV0b2NyZWF0b3IsCi0gICAgICAgICAgIEAiJUA6IEF1dG9jcmVhdG9yIG11c3QgYmUgY2xlYXJlZCBiZWZvcmUgcmVsZWFzZSwgYXV0b2NyZWF0b3I6ICVAIiwKLSAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBfYXV0b2NyZWF0b3IpOwotICBbX2RpY3Rpb25hcnkgcmVsZWFzZV07Ci0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotI3ByYWdtYSBtYXJrIFJlcXVpcmVkIE5TRGljdGlvbmFyeSBvdmVycmlkZXMKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoT2JqZWN0czooY29uc3QgaWQgW10pb2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaWQ8TlNDb3B5aW5nPiBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgc2VsZiA9IFtzdXBlciBpbml0XTsKLSAgaWYgKHNlbGYpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOm9iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XTsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoTlNVSW50ZWdlciljb3VudCB7Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgY291bnRdOwotfQotCi0tIChpZClvYmplY3RGb3JLZXk6KGlkKWFLZXkgewotICByZXR1cm4gW19kaWN0aW9uYXJ5IG9iamVjdEZvcktleTphS2V5XTsKLX0KLQotLSAoTlNFbnVtZXJhdG9yICopa2V5RW51bWVyYXRvciB7Ci0gIGlmIChfZGljdGlvbmFyeSA9PSBuaWwpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBrZXlFbnVtZXJhdG9yXTsKLX0KLQotI3ByYWdtYSBtYXJrIFJlcXVpcmVkIE5TTXV0YWJsZURpY3Rpb25hcnkgb3ZlcnJpZGVzCi0KLS8vIE9ubHkgbmVlZCB0byBjYWxsIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeU1vZGlmaWVkKCkgd2hlbiBhZGRpbmcgdGhpbmdzCi0vLyBzaW5jZSB3ZSBvbmx5IGF1dG9jcmVhdGUgZW1wdHkgZGljdGlvbmFyaWVzLgotCi0tICh2b2lkKXNldE9iamVjdDooaWQpYW5PYmplY3QgZm9yS2V5OihpZDxOU0NvcHlpbmc+KWFLZXkgewotICBpZiAoX2RpY3Rpb25hcnkgPT0gbmlsKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICB9Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6YW5PYmplY3QgZm9yS2V5OmFLZXldOwotICBpZiAoX2F1dG9jcmVhdG9yKSB7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoX2F1dG9jcmVhdG9yLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKXJlbW92ZU9iamVjdEZvcktleTooaWQpYUtleSB7Ci0gIFtfZGljdGlvbmFyeSByZW1vdmVPYmplY3RGb3JLZXk6YUtleV07Ci19Ci0KLSNwcmFnbWEgbWFyayBFeHRyYSB0aGluZ3MgaG9va2VkCi0KLS0gKGlkKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIGlmIChfZGljdGlvbmFyeSA9PSBuaWwpIHsKLSAgICBfZGljdGlvbmFyeSA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIH0KLSAgcmV0dXJuIFtfZGljdGlvbmFyeSBjb3B5V2l0aFpvbmU6em9uZV07Ci19Ci0KLS0gKGlkKW11dGFibGVDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICBpZiAoX2RpY3Rpb25hcnkgPT0gbmlsKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICB9Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgbXV0YWJsZUNvcHlXaXRoWm9uZTp6b25lXTsKLX0KLQotLSAoaWQpb2JqZWN0Rm9yS2V5ZWRTdWJzY3JpcHQ6KGlkKWtleSB7Ci0gIHJldHVybiBbX2RpY3Rpb25hcnkgb2JqZWN0Rm9yS2V5ZWRTdWJzY3JpcHQ6a2V5XTsKLX0KLQotLSAodm9pZClzZXRPYmplY3Q6KGlkKW9iaiBmb3JLZXllZFN1YnNjcmlwdDooaWQ8TlNDb3B5aW5nPilrZXkgewotICBpZiAoX2RpY3Rpb25hcnkgPT0gbmlsKSB7Ci0gICAgX2RpY3Rpb25hcnkgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICB9Ci0gIFtfZGljdGlvbmFyeSBzZXRPYmplY3Q6b2JqIGZvcktleWVkU3Vic2NyaXB0OmtleV07Ci0gIGlmIChfYXV0b2NyZWF0b3IpIHsKLSAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChfYXV0b2NyZWF0b3IsIHNlbGYpOwotICB9Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOih2b2lkICheKShpZCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApKWJsb2NrIHsKLSAgW19kaWN0aW9uYXJ5IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpibG9ja107Ci19Ci0KLS0gKHZvaWQpZW51bWVyYXRlS2V5c0FuZE9iamVjdHNXaXRoT3B0aW9uczooTlNFbnVtZXJhdGlvbk9wdGlvbnMpb3B0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOih2b2lkICheKShpZCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCAqc3RvcCkpYmxvY2sgewotICBbX2RpY3Rpb25hcnkgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNXaXRoT3B0aW9uczpvcHRzIHVzaW5nQmxvY2s6YmxvY2tdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkRpY3Rpb25hcnlfUGFja2FnZVByaXZhdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRGljdGlvbmFyeV9QYWNrYWdlUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YjkyMWU4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRGljdGlvbmFyeV9QYWNrYWdlUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDg4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotI2ltcG9ydCAiR1BCRGljdGlvbmFyeS5oIgotCi1AY2xhc3MgR1BCQ29kZWRJbnB1dFN0cmVhbTsKLUBjbGFzcyBHUEJDb2RlZE91dHB1dFN0cmVhbTsKLUBjbGFzcyBHUEJFeHRlbnNpb25SZWdpc3RyeTsKLUBjbGFzcyBHUEJGaWVsZERlc2NyaXB0b3I7Ci0KLUBwcm90b2NvbCBHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2wKLS0gKHNpemVfdCljb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOihHUEJGaWVsZERlc2NyaXB0b3IgKilmaWVsZDsKLS0gKHZvaWQpd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dFN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgIGFzRmllbGQ6KEdQQkZpZWxkRGVzY3JpcHRvciAqKWZpZWxkOwotLSAodm9pZClzZXRHUEJHZW5lcmljVmFsdWU6KEdQQkdlbmVyaWNWYWx1ZSAqKXZhbHVlCi0gICAgIGZvckdQQkdlbmVyaWNWYWx1ZUtleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5OwotLSAodm9pZCllbnVtZXJhdGVGb3JUZXh0Rm9ybWF0Oih2b2lkICheKShpZCBrZXlPYmosIGlkIHZhbHVlT2JqKSlibG9jazsKLUBlbmQKLQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9QUklWX0lOVEVSRkFDRVNfRk9SX1BPRF9LRVkoS0VZX05BTUUpCi0vLyVESUNUSU9OQVJZX1BPRF9QUklWX0lOVEVSRkFDRVNfRk9SX0tFWShLRVlfTkFNRSkKLS8vJURJQ1RJT05BUllfUFJJVkFURV9JTlRFUkZBQ0VTKEtFWV9OQU1FLCBPYmplY3QsIE9iamVjdCkKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfUE9EX1BSSVZfSU5URVJGQUNFU19GT1JfS0VZKEtFWV9OQU1FKQotLy8lRElDVElPTkFSWV9QUklWQVRFX0lOVEVSRkFDRVMoS0VZX05BTUUsIFVJbnQzMiwgQmFzaWMpCi0vLyVESUNUSU9OQVJZX1BSSVZBVEVfSU5URVJGQUNFUyhLRVlfTkFNRSwgSW50MzIsIEJhc2ljKQotLy8lRElDVElPTkFSWV9QUklWQVRFX0lOVEVSRkFDRVMoS0VZX05BTUUsIFVJbnQ2NCwgQmFzaWMpCi0vLyVESUNUSU9OQVJZX1BSSVZBVEVfSU5URVJGQUNFUyhLRVlfTkFNRSwgSW50NjQsIEJhc2ljKQotLy8lRElDVElPTkFSWV9QUklWQVRFX0lOVEVSRkFDRVMoS0VZX05BTUUsIEJvb2wsIEJhc2ljKQotLy8lRElDVElPTkFSWV9QUklWQVRFX0lOVEVSRkFDRVMoS0VZX05BTUUsIEZsb2F0LCBCYXNpYykKLS8vJURJQ1RJT05BUllfUFJJVkFURV9JTlRFUkZBQ0VTKEtFWV9OQU1FLCBEb3VibGUsIEJhc2ljKQotLy8lRElDVElPTkFSWV9QUklWQVRFX0lOVEVSRkFDRVMoS0VZX05BTUUsIEVudW0sIEVudW0pCi0KLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfUFJJVkFURV9JTlRFUkZBQ0VTKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBIRUxQRVIpCi0vLyVAaW50ZXJmYWNlIEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotLy8lIEBwYWNrYWdlCi0vLyUgIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci0vLyV9Ci0vLyVFWFRSQV9ESUNUSU9OQVJZX1BSSVZBVEVfSU5URVJGQUNFU18jI0hFTFBFUigpQGVuZAotLy8lCi0KLS8vJVBERE0tREVGSU5FIEVYVFJBX0RJQ1RJT05BUllfUFJJVkFURV9JTlRFUkZBQ0VTX0Jhc2ljKCkKLS8vIEVtcHR5Ci0vLyVQRERNLURFRklORSBFWFRSQV9ESUNUSU9OQVJZX1BSSVZBVEVfSU5URVJGQUNFU19PYmplY3QoKQotLy8lLSAoQk9PTClpc0luaXRpYWxpemVkOwotLy8lLSAoaW5zdGFuY2V0eXBlKWRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUKLS8vJSAgICBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSk7Ci0vLyUKLS8vJVBERE0tREVGSU5FIEVYVFJBX0RJQ1RJT05BUllfUFJJVkFURV9JTlRFUkZBQ0VTX0VudW0oKQotLy8lLSAoTlNEYXRhICopc2VyaWFsaXplZERhdGFGb3JVbmtub3duVmFsdWU6KGludDMyX3QpdmFsdWUKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleURhdGFUeXBlOihHUEJEYXRhVHlwZSlrZXlEYXRhVHlwZTsKLS8vJQotCi0vLyVQRERNLUVYUEFORCBESUNUSU9OQVJZX1BSSVZfSU5URVJGQUNFU19GT1JfUE9EX0tFWShVSW50MzIpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotQGludGVyZmFjZSBHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJVSW50MzJCb29sRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLS0gKE5TRGF0YSAqKXNlcmlhbGl6ZWREYXRhRm9yVW5rbm93blZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlEYXRhVHlwZTooR1BCRGF0YVR5cGUpa2V5RGF0YVR5cGU7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLS0gKEJPT0wpaXNJbml0aWFsaXplZDsKLS0gKGluc3RhbmNldHlwZSlkZWVwQ29weVdpdGhab25lOihOU1pvbmUgKil6b25lCi0gICAgX19hdHRyaWJ1dGVfXygobnNfcmV0dXJuc19yZXRhaW5lZCkpOwotQGVuZAotCi0vLyVQRERNLUVYUEFORCBESUNUSU9OQVJZX1BSSVZfSU5URVJGQUNFU19GT1JfUE9EX0tFWShJbnQzMikKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi1AaW50ZXJmYWNlIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJCb29sRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLS0gKE5TRGF0YSAqKXNlcmlhbGl6ZWREYXRhRm9yVW5rbm93blZhbHVlOihpbnQzMl90KXZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooR1BCR2VuZXJpY1ZhbHVlICopa2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrZXlEYXRhVHlwZTooR1BCRGF0YVR5cGUpa2V5RGF0YVR5cGU7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotLSAoQk9PTClpc0luaXRpYWxpemVkOwotLSAoaW5zdGFuY2V0eXBlKWRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUKLSAgICBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSk7Ci1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIERJQ1RJT05BUllfUFJJVl9JTlRFUkZBQ0VTX0ZPUl9QT0RfS0VZKFVJbnQ2NCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotLSAoTlNEYXRhICopc2VyaWFsaXplZERhdGFGb3JVbmtub3duVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleURhdGFUeXBlOihHUEJEYXRhVHlwZSlrZXlEYXRhVHlwZTsKLUBlbmQKLQotQGludGVyZmFjZSBHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotLSAoQk9PTClpc0luaXRpYWxpemVkOwotLSAoaW5zdGFuY2V0eXBlKWRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUKLSAgICBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSk7Ci1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIERJQ1RJT05BUllfUFJJVl9JTlRFUkZBQ0VTX0ZPUl9QT0RfS0VZKEludDY0KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLUBpbnRlcmZhY2UgR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQkludDY0VUludDY0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotLSAoTlNEYXRhICopc2VyaWFsaXplZERhdGFGb3JVbmtub3duVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleURhdGFUeXBlOihHUEJEYXRhVHlwZSlrZXlEYXRhVHlwZTsKLUBlbmQKLQotQGludGVyZmFjZSBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci0tIChCT09MKWlzSW5pdGlhbGl6ZWQ7Ci0tIChpbnN0YW5jZXR5cGUpZGVlcENvcHlXaXRoWm9uZTooTlNab25lICopem9uZQotICAgIF9fYXR0cmlidXRlX18oKG5zX3JldHVybnNfcmV0YWluZWQpKTsKLUBlbmQKLQotLy8lUERETS1FWFBBTkQgRElDVElPTkFSWV9QUklWX0lOVEVSRkFDRVNfRk9SX1BPRF9LRVkoQm9vbCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi1AaW50ZXJmYWNlIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQkJvb2xJbnQzMkRpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCQm9vbEludDY0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJCb29sQm9vbERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCQm9vbEZsb2F0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJCb29sRG91YmxlRGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJCb29sRW51bURpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci0tIChOU0RhdGEgKilzZXJpYWxpemVkRGF0YUZvclVua25vd25WYWx1ZTooaW50MzJfdCl2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6KEdQQkdlbmVyaWNWYWx1ZSAqKWtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2V5RGF0YVR5cGU6KEdQQkRhdGFUeXBlKWtleURhdGFUeXBlOwotQGVuZAotCi1AaW50ZXJmYWNlIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotLSAoQk9PTClpc0luaXRpYWxpemVkOwotLSAoaW5zdGFuY2V0eXBlKWRlZXBDb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUKLSAgICBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSk7Ci1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIERJQ1RJT05BUllfUE9EX1BSSVZfSU5URVJGQUNFU19GT1JfS0VZKFN0cmluZykKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKCkgPEdQQkRpY3Rpb25hcnlJbnRlcm5hbHNQcm90b2NvbD4gewotIEBwYWNrYWdlCi0gIEdQQl9VTlNBRkVfVU5SRVRBSU5FRCBHUEJNZXNzYWdlICpfYXV0b2NyZWF0b3I7Ci19Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAoKSA8R1BCRGljdGlvbmFyeUludGVybmFsc1Byb3RvY29sPiB7Ci0gQHBhY2thZ2UKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIEdQQk1lc3NhZ2UgKl9hdXRvY3JlYXRvcjsKLX0KLUBlbmQKLQotQGludGVyZmFjZSBHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICgpIDxHUEJEaWN0aW9uYXJ5SW50ZXJuYWxzUHJvdG9jb2w+IHsKLSBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotLSAoTlNEYXRhICopc2VyaWFsaXplZERhdGFGb3JVbmtub3duVmFsdWU6KGludDMyX3QpdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5OihHUEJHZW5lcmljVmFsdWUgKilrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtleURhdGFUeXBlOihHUEJEYXRhVHlwZSlrZXlEYXRhVHlwZTsKLUBlbmQKLQotLy8lUERETS1FWFBBTkQtRU5EICg2IGV4cGFuc2lvbnMpCi0KLSNwcmFnbWEgbWFyayAtIE5TRGljdGlvbmFyeSBTdWJjbGFzcwotCi1AaW50ZXJmYWNlIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeSA6IE5TTXV0YWJsZURpY3Rpb25hcnkgewotICBAcGFja2FnZQotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqX2F1dG9jcmVhdG9yOwotfQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBIZWxwZXJzCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLS8vIEhlbHBlciB0byBjb21wdXRlIHNpemUgd2hlbiBhbiBOU0RpY3Rpb25hcnkgaXMgdXNlZCBmb3IgdGhlIG1hcCBpbnN0ZWFkCi0vLyBvZiBhIGN1c3RvbSB0eXBlLgotc2l6ZV90IEdQQkRpY3Rpb25hcnlDb21wdXRlU2l6ZUludGVybmFsSGVscGVyKE5TRGljdGlvbmFyeSAqZGljdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLQotLy8gSGVscGVyIHRvIHdyaXRlIG91dCB3aGVuIGFuIE5TRGljdGlvbmFyeSBpcyB1c2VkIGZvciB0aGUgbWFwIGluc3RlYWQKLS8vIG9mIGEgY3VzdG9tIHR5cGUuCi12b2lkIEdQQkRpY3Rpb25hcnlXcml0ZVRvU3RyZWFtSW50ZXJuYWxIZWxwZXIoCi0gICAgR1BCQ29kZWRPdXRwdXRTdHJlYW0gKm91dHB1dFN0cmVhbSwgTlNEaWN0aW9uYXJ5ICpkaWN0LAotICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotCi0vLyBIZWxwZXIgdG8gY2hlY2sgbWVzc2FnZSBpbml0aWFsaXphdGlvbiB3aGVuIGFuIE5TRGljdGlvbmFyeSBpcyB1c2VkIGZvcgotLy8gdGhlIG1hcCBpbnN0ZWFkIG9mIGEgY3VzdG9tIHR5cGUuCi1CT09MIEdQQkRpY3Rpb25hcnlJc0luaXRpYWxpemVkSW50ZXJuYWxIZWxwZXIoTlNEaWN0aW9uYXJ5ICpkaWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotCi0vLyBIZWxwZXIgdG8gcmVhZCBhIG1hcCBpbnN0ZWFkLgotdm9pZCBHUEJEaWN0aW9uYXJ5UmVhZEVudHJ5KGlkIG1hcERpY3Rpb25hcnksIEdQQkNvZGVkSW5wdXRTdHJlYW0gKnN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJFeHRlbnNpb25SZWdpc3RyeSAqcmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICpwYXJlbnRNZXNzYWdlKTsKLQotQ0ZfRVhURVJOX0NfRU5ECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkV4dGVuc2lvbkludGVybmFscy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJFeHRlbnNpb25JbnRlcm5hbHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5ODBhZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkV4dGVuc2lvbkludGVybmFscy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJHUEJEZXNjcmlwdG9yLmgiCi0KLUBjbGFzcyBHUEJDb2RlZElucHV0U3RyZWFtOwotQGNsYXNzIEdQQkNvZGVkT3V0cHV0U3RyZWFtOwotQGNsYXNzIEdQQkV4dGVuc2lvblJlZ2lzdHJ5OwotCi12b2lkIEdQQkV4dGVuc2lvbk1lcmdlRnJvbUlucHV0U3RyZWFtKEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQk9PTCBpc1BhY2tlZE9uU3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJDb2RlZElucHV0U3RyZWFtICppbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKmV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICptZXNzYWdlKTsKLQotc2l6ZV90IEdQQkNvbXB1dGVFeHRlbnNpb25TZXJpYWxpemVkU2l6ZUluY2x1ZGluZ1RhZygKLSAgICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24sIGlkIHZhbHVlKTsKLQotdm9pZCBHUEJXcml0ZUV4dGVuc2lvblZhbHVlVG9PdXRwdXRTdHJlYW0oR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJDb2RlZE91dHB1dFN0cmVhbSAqb3V0cHV0KTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRXh0ZW5zaW9uSW50ZXJuYWxzLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkV4dGVuc2lvbkludGVybmFscy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZDBkY2IyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRXh0ZW5zaW9uSW50ZXJuYWxzLm0KKysrIC9kZXYvbnVsbApAQCAtMSwzODAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQkV4dGVuc2lvbkludGVybmFscy5oIgotCi0jaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KLQotI2ltcG9ydCAiR1BCQ29kZWRJbnB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCQ29kZWRPdXRwdXRTdHJlYW1fUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3JfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQk1lc3NhZ2VfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIgotCi1zdGF0aWMgaWQgTmV3U2luZ2xlVmFsdWVGcm9tSW5wdXRTdHJlYW0oR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkNvZGVkSW5wdXRTdHJlYW0gKmlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICpleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICpleGlzdGluZ1ZhbHVlKQotICAgIF9fYXR0cmlidXRlX18oKG5zX3JldHVybnNfcmV0YWluZWQpKTsKLQotR1BCX0lOTElORSBzaXplX3QgRGF0YVR5cGVTaXplKEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICBjYXNlIEdQQkRhdGFUeXBlQm9vbDoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDMyOgotICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQzMjoKLSAgICBjYXNlIEdQQkRhdGFUeXBlRmxvYXQ6Ci0gICAgICByZXR1cm4gNDsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQ2NDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZURvdWJsZToKLSAgICAgIHJldHVybiA4OwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gMDsKLSAgfQotfQotCi1zdGF0aWMgc2l6ZV90IENvbXB1dGVQQlNlcmlhbGl6ZWRTaXplTm9UYWdPZk9iamVjdChHUEJEYXRhVHlwZSBkYXRhVHlwZSwgaWQgb2JqZWN0KSB7Ci0jZGVmaW5lIEZJRUxEX0NBU0UoVFlQRSwgQUNDRVNTT1IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2FzZSBHUEJEYXRhVHlwZSMjVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBHUEJDb21wdXRlIyNUWVBFIyNTaXplTm9UYWcoWyhOU051bWJlciAqKW9iamVjdCBBQ0NFU1NPUl0pOwotI2RlZmluZSBGSUVMRF9DQVNFMihUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgR1BCRGF0YVR5cGUjI1RZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gR1BCQ29tcHV0ZSMjVFlQRSMjU2l6ZU5vVGFnKG9iamVjdCk7Ci0gIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICBGSUVMRF9DQVNFKEJvb2wsIGJvb2xWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEZsb2F0LCBmbG9hdFZhbHVlKQotICAgIEZJRUxEX0NBU0UoRG91YmxlLCBkb3VibGVWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEludDMyLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNGaXhlZDMyLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNJbnQzMiwgaW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShFbnVtLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEludDY0LCBsb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoU0ludDY0LCBsb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoU0ZpeGVkNjQsIGxvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRShVSW50MzIsIHVuc2lnbmVkSW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShGaXhlZDMyLCB1bnNpZ25lZEludFZhbHVlKQotICAgIEZJRUxEX0NBU0UoVUludDY0LCB1bnNpZ25lZExvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRShGaXhlZDY0LCB1bnNpZ25lZExvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRTIoQnl0ZXMpCi0gICAgRklFTERfQ0FTRTIoU3RyaW5nKQotICAgIEZJRUxEX0NBU0UyKE1lc3NhZ2UpCi0gICAgRklFTERfQ0FTRTIoR3JvdXApCi0gIH0KLSN1bmRlZiBGSUVMRF9DQVNFCi0jdW5kZWYgRklFTERfQ0FTRTIKLX0KLQotc3RhdGljIHNpemVfdCBDb21wdXRlU2VyaWFsaXplZFNpemVJbmNsdWRpbmdUYWdPZk9iamVjdCgKLSAgICBHUEJFeHRlbnNpb25EZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24sIGlkIG9iamVjdCkgewotI2RlZmluZSBGSUVMRF9DQVNFKFRZUEUsIEFDQ0VTU09SKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjYXNlIEdQQkRhdGFUeXBlIyNUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBHUEJDb21wdXRlIyNUWVBFIyNTaXplKGRlc2NyaXB0aW9uLT5maWVsZE51bWJlciwgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFsoTlNOdW1iZXIgKilvYmplY3QgQUNDRVNTT1JdKTsKLSNkZWZpbmUgRklFTERfQ0FTRTIoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2FzZSBHUEJEYXRhVHlwZSMjVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gR1BCQ29tcHV0ZSMjVFlQRSMjU2l6ZShkZXNjcmlwdGlvbi0+ZmllbGROdW1iZXIsIG9iamVjdCk7Ci0gIHN3aXRjaCAoZGVzY3JpcHRpb24tPmRhdGFUeXBlKSB7Ci0gICAgRklFTERfQ0FTRShCb29sLCBib29sVmFsdWUpCi0gICAgRklFTERfQ0FTRShGbG9hdCwgZmxvYXRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKERvdWJsZSwgZG91YmxlVmFsdWUpCi0gICAgRklFTERfQ0FTRShJbnQzMiwgaW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShTRml4ZWQzMiwgaW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShTSW50MzIsIGludFZhbHVlKQotICAgIEZJRUxEX0NBU0UoRW51bSwgaW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShJbnQ2NCwgbG9uZ0xvbmdWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNJbnQ2NCwgbG9uZ0xvbmdWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNGaXhlZDY0LCBsb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoVUludDMyLCB1bnNpZ25lZEludFZhbHVlKQotICAgIEZJRUxEX0NBU0UoRml4ZWQzMiwgdW5zaWduZWRJbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFVJbnQ2NCwgdW5zaWduZWRMb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoRml4ZWQ2NCwgdW5zaWduZWRMb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UyKEJ5dGVzKQotICAgIEZJRUxEX0NBU0UyKFN0cmluZykKLSAgICBGSUVMRF9DQVNFMihHcm91cCkKLSAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgIGlmIChHUEJFeHRlbnNpb25Jc1dpcmVGb3JtYXQoZGVzY3JpcHRpb24pKSB7Ci0gICAgICAgIHJldHVybiBHUEJDb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoZGVzY3JpcHRpb24tPmZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gR1BCQ29tcHV0ZU1lc3NhZ2VTaXplKGRlc2NyaXB0aW9uLT5maWVsZE51bWJlciwgb2JqZWN0KTsKLSAgICAgIH0KLSAgfQotI3VuZGVmIEZJRUxEX0NBU0UKLSN1bmRlZiBGSUVMRF9DQVNFMgotfQotCi1zdGF0aWMgc2l6ZV90IENvbXB1dGVTZXJpYWxpemVkU2l6ZUluY2x1ZGluZ1RhZ09mQXJyYXkoCi0gICAgR1BCRXh0ZW5zaW9uRGVzY3JpcHRpb24gKmRlc2NyaXB0aW9uLCBOU0FycmF5ICp2YWx1ZXMpIHsKLSAgaWYgKEdQQkV4dGVuc2lvbklzUGFja2VkKGRlc2NyaXB0aW9uKSkgewotICAgIHNpemVfdCBzaXplID0gMDsKLSAgICBzaXplX3QgdHlwZVNpemUgPSBEYXRhVHlwZVNpemUoZGVzY3JpcHRpb24tPmRhdGFUeXBlKTsKLSAgICBpZiAodHlwZVNpemUgIT0gMCkgewotICAgICAgc2l6ZSA9IHZhbHVlcy5jb3VudCAqIHR5cGVTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGlkIHZhbHVlIGluIHZhbHVlcykgewotICAgICAgICBzaXplICs9Ci0gICAgICAgICAgICBDb21wdXRlUEJTZXJpYWxpemVkU2l6ZU5vVGFnT2ZPYmplY3QoZGVzY3JpcHRpb24tPmRhdGFUeXBlLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBzaXplICsgR1BCQ29tcHV0ZVRhZ1NpemUoZGVzY3JpcHRpb24tPmZpZWxkTnVtYmVyKSArCi0gICAgICAgICAgIEdQQkNvbXB1dGVSYXdWYXJpbnQzMlNpemVGb3JJbnRlZ2VyKHNpemUpOwotICB9IGVsc2UgewotICAgIHNpemVfdCBzaXplID0gMDsKLSAgICBmb3IgKGlkIHZhbHVlIGluIHZhbHVlcykgewotICAgICAgc2l6ZSArPSBDb21wdXRlU2VyaWFsaXplZFNpemVJbmNsdWRpbmdUYWdPZk9iamVjdChkZXNjcmlwdGlvbiwgdmFsdWUpOwotICAgIH0KLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBXcml0ZU9iamVjdEluY2x1ZGluZ1RhZ1RvQ29kZWRPdXRwdXRTdHJlYW0oCi0gICAgaWQgb2JqZWN0LCBHUEJFeHRlbnNpb25EZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24sCi0gICAgR1BCQ29kZWRPdXRwdXRTdHJlYW0gKm91dHB1dCkgewotI2RlZmluZSBGSUVMRF9DQVNFKFRZUEUsIEFDQ0VTU09SKSAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgR1BCRGF0YVR5cGUjI1RZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBbb3V0cHV0IHdyaXRlIyNUWVBFOmRlc2NyaXB0aW9uLT5maWVsZE51bWJlciAgICAgICAgXAotICAgICAgICAgICAgICAgICAgdmFsdWU6WyhOU051bWJlciAqKW9iamVjdCBBQ0NFU1NPUl1dOyBcCi0gICAgcmV0dXJuOwotI2RlZmluZSBGSUVMRF9DQVNFMihUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2FzZSBHUEJEYXRhVHlwZSMjVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgW291dHB1dCB3cml0ZSMjVFlQRTpkZXNjcmlwdGlvbi0+ZmllbGROdW1iZXIgdmFsdWU6b2JqZWN0XTsgXAotICAgIHJldHVybjsKLSAgc3dpdGNoIChkZXNjcmlwdGlvbi0+ZGF0YVR5cGUpIHsKLSAgICBGSUVMRF9DQVNFKEJvb2wsIGJvb2xWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEZsb2F0LCBmbG9hdFZhbHVlKQotICAgIEZJRUxEX0NBU0UoRG91YmxlLCBkb3VibGVWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEludDMyLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNGaXhlZDMyLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNJbnQzMiwgaW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShFbnVtLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEludDY0LCBsb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoU0ludDY0LCBsb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoU0ZpeGVkNjQsIGxvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRShVSW50MzIsIHVuc2lnbmVkSW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShGaXhlZDMyLCB1bnNpZ25lZEludFZhbHVlKQotICAgIEZJRUxEX0NBU0UoVUludDY0LCB1bnNpZ25lZExvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRShGaXhlZDY0LCB1bnNpZ25lZExvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRTIoQnl0ZXMpCi0gICAgRklFTERfQ0FTRTIoU3RyaW5nKQotICAgIEZJRUxEX0NBU0UyKEdyb3VwKQotICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgICAgaWYgKEdQQkV4dGVuc2lvbklzV2lyZUZvcm1hdChkZXNjcmlwdGlvbikpIHsKLSAgICAgICAgW291dHB1dCB3cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb246ZGVzY3JpcHRpb24tPmZpZWxkTnVtYmVyIHZhbHVlOm9iamVjdF07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbb3V0cHV0IHdyaXRlTWVzc2FnZTpkZXNjcmlwdGlvbi0+ZmllbGROdW1iZXIgdmFsdWU6b2JqZWN0XTsKLSAgICAgIH0KLSAgICAgIHJldHVybjsKLSAgfQotI3VuZGVmIEZJRUxEX0NBU0UKLSN1bmRlZiBGSUVMRF9DQVNFMgotfQotCi1zdGF0aWMgdm9pZCBXcml0ZU9iamVjdE5vVGFnVG9Db2RlZE91dHB1dFN0cmVhbSgKLSAgICBpZCBvYmplY3QsIEdQQkV4dGVuc2lvbkRlc2NyaXB0aW9uICpkZXNjcmlwdGlvbiwKLSAgICBHUEJDb2RlZE91dHB1dFN0cmVhbSAqb3V0cHV0KSB7Ci0jZGVmaW5lIEZJRUxEX0NBU0UoVFlQRSwgQUNDRVNTT1IpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgR1BCRGF0YVR5cGUjI1RZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgW291dHB1dCB3cml0ZSMjVFlQRSMjTm9UYWc6WyhOU051bWJlciAqKW9iamVjdCBBQ0NFU1NPUl1dOyBcCi0gICAgcmV0dXJuOwotI2RlZmluZSBGSUVMRF9DQVNFMihUWVBFKSAgICAgICAgICAgICAgIFwKLSAgY2FzZSBHUEJEYXRhVHlwZSMjVFlQRTogICAgICAgICAgICAgICBcCi0gICAgW291dHB1dCB3cml0ZSMjVFlQRSMjTm9UYWc6b2JqZWN0XTsgXAotICAgIHJldHVybjsKLSAgc3dpdGNoIChkZXNjcmlwdGlvbi0+ZGF0YVR5cGUpIHsKLSAgICBGSUVMRF9DQVNFKEJvb2wsIGJvb2xWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEZsb2F0LCBmbG9hdFZhbHVlKQotICAgIEZJRUxEX0NBU0UoRG91YmxlLCBkb3VibGVWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEludDMyLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNGaXhlZDMyLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKFNJbnQzMiwgaW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShFbnVtLCBpbnRWYWx1ZSkKLSAgICBGSUVMRF9DQVNFKEludDY0LCBsb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoU0ludDY0LCBsb25nTG9uZ1ZhbHVlKQotICAgIEZJRUxEX0NBU0UoU0ZpeGVkNjQsIGxvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRShVSW50MzIsIHVuc2lnbmVkSW50VmFsdWUpCi0gICAgRklFTERfQ0FTRShGaXhlZDMyLCB1bnNpZ25lZEludFZhbHVlKQotICAgIEZJRUxEX0NBU0UoVUludDY0LCB1bnNpZ25lZExvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRShGaXhlZDY0LCB1bnNpZ25lZExvbmdMb25nVmFsdWUpCi0gICAgRklFTERfQ0FTRTIoQnl0ZXMpCi0gICAgRklFTERfQ0FTRTIoU3RyaW5nKQotICAgIEZJRUxEX0NBU0UyKE1lc3NhZ2UpCi0gICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgW291dHB1dCB3cml0ZUdyb3VwTm9UYWc6ZGVzY3JpcHRpb24tPmZpZWxkTnVtYmVyIHZhbHVlOm9iamVjdF07Ci0gICAgICByZXR1cm47Ci0gIH0KLSN1bmRlZiBGSUVMRF9DQVNFCi0jdW5kZWYgRklFTERfQ0FTRTIKLX0KLQotc3RhdGljIHZvaWQgV3JpdGVBcnJheUluY2x1ZGluZ1RhZ3NUb0NvZGVkT3V0cHV0U3RyZWFtKAotICAgIE5TQXJyYXkgKnZhbHVlcywgR1BCRXh0ZW5zaW9uRGVzY3JpcHRpb24gKmRlc2NyaXB0aW9uLAotICAgIEdQQkNvZGVkT3V0cHV0U3RyZWFtICpvdXRwdXQpIHsKLSAgaWYgKEdQQkV4dGVuc2lvbklzUGFja2VkKGRlc2NyaXB0aW9uKSkgewotICAgIFtvdXRwdXQgd3JpdGVUYWc6ZGVzY3JpcHRpb24tPmZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgIGZvcm1hdDpHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkXTsKLSAgICBzaXplX3QgZGF0YVNpemUgPSAwOwotICAgIHNpemVfdCB0eXBlU2l6ZSA9IERhdGFUeXBlU2l6ZShkZXNjcmlwdGlvbi0+ZGF0YVR5cGUpOwotICAgIGlmICh0eXBlU2l6ZSAhPSAwKSB7Ci0gICAgICBkYXRhU2l6ZSA9IHZhbHVlcy5jb3VudCAqIHR5cGVTaXplOwotICAgIH0gZWxzZSB7Ci0gICAgICBmb3IgKGlkIHZhbHVlIGluIHZhbHVlcykgewotICAgICAgICBkYXRhU2l6ZSArPQotICAgICAgICAgICAgQ29tcHV0ZVBCU2VyaWFsaXplZFNpemVOb1RhZ09mT2JqZWN0KGRlc2NyaXB0aW9uLT5kYXRhVHlwZSwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBbb3V0cHV0IHdyaXRlUmF3VmFyaW50U2l6ZVRBczMyOmRhdGFTaXplXTsKLSAgICBmb3IgKGlkIHZhbHVlIGluIHZhbHVlcykgewotICAgICAgV3JpdGVPYmplY3ROb1RhZ1RvQ29kZWRPdXRwdXRTdHJlYW0odmFsdWUsIGRlc2NyaXB0aW9uLCBvdXRwdXQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKGlkIHZhbHVlIGluIHZhbHVlcykgewotICAgICAgV3JpdGVPYmplY3RJbmNsdWRpbmdUYWdUb0NvZGVkT3V0cHV0U3RyZWFtKHZhbHVlLCBkZXNjcmlwdGlvbiwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBHUEJFeHRlbnNpb25NZXJnZUZyb21JbnB1dFN0cmVhbShHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgaXNQYWNrZWRPblN0cmVhbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCQ29kZWRJbnB1dFN0cmVhbSAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICpleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZSkgewotICBHUEJFeHRlbnNpb25EZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24gPSBleHRlbnNpb24tPmRlc2NyaXB0aW9uXzsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSA9ICZpbnB1dC0+c3RhdGVfOwotICBpZiAoaXNQYWNrZWRPblN0cmVhbSkgewotICAgIE5TQ0Fzc2VydChHUEJFeHRlbnNpb25Jc1JlcGVhdGVkKGRlc2NyaXB0aW9uKSwKLSAgICAgICAgICAgICAgQCJIb3cgd2FzIGl0IHBhY2tlZCBpZiBpdCBpc24ndCByZXBlYXRlZD8iKTsKLSAgICBpbnQzMl90IGxlbmd0aCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkSW50MzIoc3RhdGUpOwotICAgIHNpemVfdCBsaW1pdCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1QdXNoTGltaXQoc3RhdGUsIGxlbmd0aCk7Ci0gICAgd2hpbGUgKEdQQkNvZGVkSW5wdXRTdHJlYW1CeXRlc1VudGlsTGltaXQoc3RhdGUpID4gMCkgewotICAgICAgaWQgdmFsdWUgPSBOZXdTaW5nbGVWYWx1ZUZyb21JbnB1dFN0cmVhbShleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmlsKTsKLSAgICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpleHRlbnNpb24gdmFsdWU6dmFsdWVdOwotICAgICAgW3ZhbHVlIHJlbGVhc2VdOwotICAgIH0KLSAgICBHUEJDb2RlZElucHV0U3RyZWFtUG9wTGltaXQoc3RhdGUsIGxpbWl0KTsKLSAgfSBlbHNlIHsKLSAgICBpZCBleGlzdGluZ1ZhbHVlID0gbmlsOwotICAgIEJPT0wgaXNSZXBlYXRlZCA9IEdQQkV4dGVuc2lvbklzUmVwZWF0ZWQoZGVzY3JpcHRpb24pOwotICAgIGlmICghaXNSZXBlYXRlZCAmJiBHUEJEYXRhVHlwZUlzTWVzc2FnZShkZXNjcmlwdGlvbi0+ZGF0YVR5cGUpKSB7Ci0gICAgICBleGlzdGluZ1ZhbHVlID0gW21lc3NhZ2UgZ2V0RXhpc3RpbmdFeHRlbnNpb246ZXh0ZW5zaW9uXTsKLSAgICB9Ci0gICAgaWQgdmFsdWUgPSBOZXdTaW5nbGVWYWx1ZUZyb21JbnB1dFN0cmVhbShleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhpc3RpbmdWYWx1ZSk7Ci0gICAgaWYgKGlzUmVwZWF0ZWQpIHsKLSAgICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpleHRlbnNpb24gdmFsdWU6dmFsdWVdOwotICAgIH0gZWxzZSB7Ci0gICAgICBbbWVzc2FnZSBzZXRFeHRlbnNpb246ZXh0ZW5zaW9uIHZhbHVlOnZhbHVlXTsKLSAgICB9Ci0gICAgW3ZhbHVlIHJlbGVhc2VdOwotICB9Ci19Ci0KLXZvaWQgR1BCV3JpdGVFeHRlbnNpb25WYWx1ZVRvT3V0cHV0U3RyZWFtKEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCQ29kZWRPdXRwdXRTdHJlYW0gKm91dHB1dCkgewotICBHUEJFeHRlbnNpb25EZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24gPSBleHRlbnNpb24tPmRlc2NyaXB0aW9uXzsKLSAgaWYgKEdQQkV4dGVuc2lvbklzUmVwZWF0ZWQoZGVzY3JpcHRpb24pKSB7Ci0gICAgV3JpdGVBcnJheUluY2x1ZGluZ1RhZ3NUb0NvZGVkT3V0cHV0U3RyZWFtKHZhbHVlLCBkZXNjcmlwdGlvbiwgb3V0cHV0KTsKLSAgfSBlbHNlIHsKLSAgICBXcml0ZU9iamVjdEluY2x1ZGluZ1RhZ1RvQ29kZWRPdXRwdXRTdHJlYW0odmFsdWUsIGRlc2NyaXB0aW9uLCBvdXRwdXQpOwotICB9Ci19Ci0KLXNpemVfdCBHUEJDb21wdXRlRXh0ZW5zaW9uU2VyaWFsaXplZFNpemVJbmNsdWRpbmdUYWcoCi0gICAgR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqZXh0ZW5zaW9uLCBpZCB2YWx1ZSkgewotICBHUEJFeHRlbnNpb25EZXNjcmlwdGlvbiAqZGVzY3JpcHRpb24gPSBleHRlbnNpb24tPmRlc2NyaXB0aW9uXzsKLSAgaWYgKEdQQkV4dGVuc2lvbklzUmVwZWF0ZWQoZGVzY3JpcHRpb24pKSB7Ci0gICAgcmV0dXJuIENvbXB1dGVTZXJpYWxpemVkU2l6ZUluY2x1ZGluZ1RhZ09mQXJyYXkoZGVzY3JpcHRpb24sIHZhbHVlKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gQ29tcHV0ZVNlcmlhbGl6ZWRTaXplSW5jbHVkaW5nVGFnT2ZPYmplY3QoZGVzY3JpcHRpb24sIHZhbHVlKTsKLSAgfQotfQotCi0vLyBOb3RlIHRoYXQgdGhpcyByZXR1cm5zIGEgcmV0YWluZWQgdmFsdWUgaW50ZW50aW9uYWxseS4KLXN0YXRpYyBpZCBOZXdTaW5nbGVWYWx1ZUZyb21JbnB1dFN0cmVhbShHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCQ29kZWRJbnB1dFN0cmVhbSAqaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKmV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmV4aXN0aW5nVmFsdWUpIHsKLSAgR1BCRXh0ZW5zaW9uRGVzY3JpcHRpb24gKmRlc2NyaXB0aW9uID0gZXh0ZW5zaW9uLT5kZXNjcmlwdGlvbl87Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUgPSAmaW5wdXQtPnN0YXRlXzsKLSAgc3dpdGNoIChkZXNjcmlwdGlvbi0+ZGF0YVR5cGUpIHsKLSAgICBjYXNlIEdQQkRhdGFUeXBlQm9vbDogICAgIHJldHVybiBbW05TTnVtYmVyIGFsbG9jXSBpbml0V2l0aEJvb2w6R1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRCb29sKHN0YXRlKV07Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkMzI6ICByZXR1cm4gW1tOU051bWJlciBhbGxvY10gaW5pdFdpdGhVbnNpZ25lZEludDpHUEJDb2RlZElucHV0U3RyZWFtUmVhZEZpeGVkMzIoc3RhdGUpXTsKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkMzI6IHJldHVybiBbW05TTnVtYmVyIGFsbG9jXSBpbml0V2l0aEludDpHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNGaXhlZDMyKHN0YXRlKV07Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUZsb2F0OiAgICByZXR1cm4gW1tOU051bWJlciBhbGxvY10gaW5pdFdpdGhGbG9hdDpHUEJDb2RlZElucHV0U3RyZWFtUmVhZEZsb2F0KHN0YXRlKV07Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6ICByZXR1cm4gW1tOU051bWJlciBhbGxvY10gaW5pdFdpdGhVbnNpZ25lZExvbmdMb25nOkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRml4ZWQ2NChzdGF0ZSldOwotICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQ2NDogcmV0dXJuIFtbTlNOdW1iZXIgYWxsb2NdIGluaXRXaXRoTG9uZ0xvbmc6R1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRTRml4ZWQ2NChzdGF0ZSldOwotICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6ICAgcmV0dXJuIFtbTlNOdW1iZXIgYWxsb2NdIGluaXRXaXRoRG91YmxlOkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRG91YmxlKHN0YXRlKV07Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUludDMyOiAgICByZXR1cm4gW1tOU051bWJlciBhbGxvY10gaW5pdFdpdGhJbnQ6R1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRJbnQzMihzdGF0ZSldOwotICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQ2NDogICAgcmV0dXJuIFtbTlNOdW1iZXIgYWxsb2NdIGluaXRXaXRoTG9uZ0xvbmc6R1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRJbnQ2NChzdGF0ZSldOwotICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6ICAgcmV0dXJuIFtbTlNOdW1iZXIgYWxsb2NdIGluaXRXaXRoSW50OkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkU0ludDMyKHN0YXRlKV07Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQ2NDogICByZXR1cm4gW1tOU051bWJlciBhbGxvY10gaW5pdFdpdGhMb25nTG9uZzpHUEJDb2RlZElucHV0U3RyZWFtUmVhZFNJbnQ2NChzdGF0ZSldOwotICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50MzI6ICAgcmV0dXJuIFtbTlNOdW1iZXIgYWxsb2NdIGluaXRXaXRoVW5zaWduZWRJbnQ6R1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRVSW50MzIoc3RhdGUpXTsKLSAgICBjYXNlIEdQQkRhdGFUeXBlVUludDY0OiAgIHJldHVybiBbW05TTnVtYmVyIGFsbG9jXSBpbml0V2l0aFVuc2lnbmVkTG9uZ0xvbmc6R1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRVSW50NjQoc3RhdGUpXTsKLSAgICBjYXNlIEdQQkRhdGFUeXBlQnl0ZXM6ICAgIHJldHVybiBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFJldGFpbmVkQnl0ZXMoc3RhdGUpOwotICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6ICAgcmV0dXJuIEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWRTdHJpbmcoc3RhdGUpOwotICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOiAgICAgcmV0dXJuIFtbTlNOdW1iZXIgYWxsb2NdIGluaXRXaXRoSW50OkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRW51bShzdGF0ZSldOwotICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZTogewotICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZTsKLSAgICAgIGlmIChleGlzdGluZ1ZhbHVlKSB7Ci0gICAgICAgIG1lc3NhZ2UgPSBbZXhpc3RpbmdWYWx1ZSByZXRhaW5dOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgR1BCRGVzY3JpcHRvciAqZGVjcmlwdG9yID0gW2V4dGVuc2lvbi5tc2dDbGFzcyBkZXNjcmlwdG9yXTsKLSAgICAgICAgbWVzc2FnZSA9IFtbZGVjcmlwdG9yLm1lc3NhZ2VDbGFzcyBhbGxvY10gaW5pdF07Ci0gICAgICB9Ci0KLSAgICAgIGlmIChkZXNjcmlwdGlvbi0+ZGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVHcm91cCkgewotICAgICAgICBbaW5wdXQgcmVhZEdyb3VwOmRlc2NyaXB0aW9uLT5maWVsZE51bWJlcgotICAgICAgICAgICAgICAgICBtZXNzYWdlOm1lc3NhZ2UKLSAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OmV4dGVuc2lvblJlZ2lzdHJ5XTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIGRlc2NyaXB0aW9uLT5kYXRhVHlwZSA9PSBHUEJEYXRhVHlwZU1lc3NhZ2UKLSAgICAgICAgaWYgKEdQQkV4dGVuc2lvbklzV2lyZUZvcm1hdChkZXNjcmlwdGlvbikpIHsKLSAgICAgICAgICAvLyBGb3IgTWVzc2FnZVNldCBmaWVsZHMgdGhlIG1lc3NhZ2UgbGVuZ3RoIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4KLSAgICAgICAgICAvLyByZWFkLgotICAgICAgICAgIFttZXNzYWdlIG1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06aW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OmV4dGVuc2lvblJlZ2lzdHJ5XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBbaW5wdXQgcmVhZE1lc3NhZ2U6bWVzc2FnZSBleHRlbnNpb25SZWdpc3RyeTpleHRlbnNpb25SZWdpc3RyeV07Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG1lc3NhZ2U7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIG5pbDsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRXh0ZW5zaW9uUmVnaXN0cnkuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRXh0ZW5zaW9uUmVnaXN0cnkuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDhhNjQ3Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkV4dGVuc2lvblJlZ2lzdHJ5LmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLUBjbGFzcyBHUEJEZXNjcmlwdG9yOwotQGNsYXNzIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3I7Ci0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLS8vLyBBIHRhYmxlIG9mIGtub3duIGV4dGVuc2lvbnMsIHNlYXJjaGFibGUgYnkgbmFtZSBvciBmaWVsZCBudW1iZXIuICBXaGVuCi0vLy8gcGFyc2luZyBhIHByb3RvY29sIG1lc3NhZ2UgdGhhdCBtaWdodCBoYXZlIGV4dGVuc2lvbnMsIHlvdSBtdXN0IHByb3ZpZGUgYQotLy8vIEBjIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IGluIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYW55IGV4dGVuc2lvbnMgdGhhdCB5b3UKLS8vLyB3YW50IHRvIGJlIGFibGUgdG8gcGFyc2UuIE90aGVyd2lzZSwgdGhvc2UgZXh0ZW5zaW9ucyB3aWxsIGp1c3QgYmUgdHJlYXRlZAotLy8vIGxpa2UgdW5rbm93biBmaWVsZHMuCi0vLy8KLS8vLyBUaGUgQGMgKlJvb3QgY2xhc3NlcyBwcm92aWRlIEBjICtleHRlbnNpb25SZWdpc3RyeSBmb3IgdGhlIGV4dGVuc2lvbnMgZGVmaW5lZAotLy8vIGluIGEgZ2l2ZW4gZmlsZSAqYW5kKiBhbGwgZmlsZXMgaXQgaW1wb3J0cy4gWW91IGNhbiBhbHNvIGNyZWF0ZSBhCi0vLy8gQGMgR1BCRXh0ZW5zaW9uUmVnaXN0cnksIGFuZCBtZXJnZSB0aG9zZSByZWdpc3RyaWVzIHRvIGhhbmRsZSBwYXJzaW5nCi0vLy8gZXh0ZW5zaW9ucyBkZWZpbmVkIGZyb20gbm9uIG92ZXJsYXBwaW5nIGZpbGVzLgotLy8vCi0vLy8gQGNvZGUKLS8vLyBHUEJFeHRlbnNpb25SZWdpc3RyeSAqcmVnaXN0cnkgPQotLy8vICAgICBbW1tNeVByb3RvRmlsZVJvb3QgZXh0ZW5zaW9uUmVnaXN0cnldIGNvcHldIGF1dG9yZWxlYXNlXTsKLS8vLyBbcmVnaXN0cnkgYWRkRXh0ZW5zaW9uOltPdGhlck1lc3NhZ2UgbmVlZGVkRXh0ZW5zaW9uXTsgIC8vIE5vdCBpbiBNeVByb3RvRmlsZQotLy8vIE5TRXJyb3IgKnBhcnNlRXJyb3IgPSBuaWw7Ci0vLy8gTXlNZXNzYWdlICptc2cgPSBbTXlNZXNzYWdlIHBhcnNlRGF0YTpkYXRhCi0vLy8gICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTpyZWdpc3RyeQotLy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6JnBhcnNlRXJyb3JdOwotLy8vIEBlbmRjb2RlCi1AaW50ZXJmYWNlIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IDogTlNPYmplY3Q8TlNDb3B5aW5nPgotCi0vLy8gQWRkIHRoZSBnaXZlbiBAYyBHUEJFeHRlbnNpb25EZXNjcmlwdG9yIHRvIHRoaXMgcmVnaXN0cnkuCi0vLy8KLS8vLyBAcGFyYW0gZXh0ZW5zaW9uIFRoZSBleHRlbnNpb24gZGVzY3JpcHRpb24gdG8gYWRkLgotLSAodm9pZClhZGRFeHRlbnNpb246KEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKilleHRlbnNpb247Ci0KLS8vLyBBZGRzIGFsbCB0aGUgZXh0ZW5zaW9ucyBmcm9tIGFub3RoZXIgcmVnaXN0cnkgdG8gdGhpcyByZWdpc3RyeS4KLS8vLwotLy8vIEBwYXJhbSByZWdpc3RyeSBUaGUgcmVnaXN0cnkgdG8gbWVyZ2UgaW50byB0aGlzIHJlZ2lzdHJ5LgotLSAodm9pZClhZGRFeHRlbnNpb25zOihHUEJFeHRlbnNpb25SZWdpc3RyeSAqKXJlZ2lzdHJ5OwotCi0vLy8gTG9va3MgZm9yIHRoZSBleHRlbnNpb24gcmVnaXN0ZXJlZCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlciBvbiBhIGdpdmVuCi0vLy8gQGMgR1BCRGVzY3JpcHRvci4KLS8vLwotLy8vIEBwYXJhbSBkZXNjcmlwdG9yICBUaGUgZGVzY3JpcHRvciB0byBsb29rIGZvciBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uIG9uLgotLy8vIEBwYXJhbSBmaWVsZE51bWJlciBUaGUgZmllbGQgbnVtYmVyIG9mIGFuIGV4dGVuc2lvbiB0byBsb29rIGZvci4KLS8vLwotLy8vIEByZXR1cm4gVGhlIHJlZ2lzdGVyZWQgQGMgR1BCRXh0ZW5zaW9uRGVzY3JpcHRvIG9yIG5pbCBpZiBub25lIHdhcyBmb3VuZC4KLS0gKG51bGxhYmxlIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKilleHRlbnNpb25Gb3JEZXNjcmlwdG9yOihHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROdW1iZXI6KE5TSW50ZWdlcilmaWVsZE51bWJlcjsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRXh0ZW5zaW9uUmVnaXN0cnkubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCRXh0ZW5zaW9uUmVnaXN0cnkubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGY2MWExNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQkV4dGVuc2lvblJlZ2lzdHJ5Lm0KKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQkV4dGVuc2lvblJlZ2lzdHJ5LmgiCi0KLSNpbXBvcnQgIkdQQkJvb3RzdHJhcC5oIgotI2ltcG9ydCAiR1BCRGVzY3JpcHRvci5oIgotCi1AaW1wbGVtZW50YXRpb24gR1BCRXh0ZW5zaW9uUmVnaXN0cnkgewotICAvLyBUT0RPKGRtYWNsYWNoKTogUmVpbXBsZW1lbnQgd2l0aCBDRkRpY3Rpb25hcmllcyB0aGF0IGRvbid0IHVzZQotICAvLyBvYmplY3RzIGFzIGtleXMuCi0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKm11dGFibGVDbGFzc01hcF87Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgewotICAgIG11dGFibGVDbGFzc01hcF8gPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tICh2b2lkKWRlYWxsb2MgewotICBbbXV0YWJsZUNsYXNzTWFwXyByZWxlYXNlXTsKLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChpbnN0YW5jZXR5cGUpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKnJlc3VsdCA9IFtbW3NlbGYgY2xhc3NdIGFsbG9jV2l0aFpvbmU6em9uZV0gaW5pdF07Ci0gIGlmIChyZXN1bHQgJiYgbXV0YWJsZUNsYXNzTWFwXy5jb3VudCkgewotICAgIFtyZXN1bHQtPm11dGFibGVDbGFzc01hcF8gYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om11dGFibGVDbGFzc01hcF9dOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKE5TTXV0YWJsZURpY3Rpb25hcnkgKilleHRlbnNpb25NYXBGb3JDb250YWluaW5nTWVzc2FnZUNsYXNzOgotICAgICAgICAoQ2xhc3MpY29udGFpbmluZ01lc3NhZ2VDbGFzcyB7Ci0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKmV4dGVuc2lvbk1hcCA9Ci0gICAgICBbbXV0YWJsZUNsYXNzTWFwXyBvYmplY3RGb3JLZXk6Y29udGFpbmluZ01lc3NhZ2VDbGFzc107Ci0gIGlmIChleHRlbnNpb25NYXAgPT0gbmlsKSB7Ci0gICAgZXh0ZW5zaW9uTWFwID0gW05TTXV0YWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gICAgW211dGFibGVDbGFzc01hcF8gc2V0T2JqZWN0OmV4dGVuc2lvbk1hcAotICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTooaWQ8TlNDb3B5aW5nPiljb250YWluaW5nTWVzc2FnZUNsYXNzXTsKLSAgfQotICByZXR1cm4gZXh0ZW5zaW9uTWFwOwotfQotCi0tICh2b2lkKWFkZEV4dGVuc2lvbjooR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqKWV4dGVuc2lvbiB7Ci0gIGlmIChleHRlbnNpb24gPT0gbmlsKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ2xhc3MgY29udGFpbmluZ01lc3NhZ2VDbGFzcyA9IGV4dGVuc2lvbi5jb250YWluaW5nTWVzc2FnZUNsYXNzOwotICBOU011dGFibGVEaWN0aW9uYXJ5ICpleHRlbnNpb25NYXAgPQotICAgICAgW3NlbGYgZXh0ZW5zaW9uTWFwRm9yQ29udGFpbmluZ01lc3NhZ2VDbGFzczpjb250YWluaW5nTWVzc2FnZUNsYXNzXTsKLSAgW2V4dGVuc2lvbk1hcCBzZXRPYmplY3Q6ZXh0ZW5zaW9uIGZvcktleTpAKGV4dGVuc2lvbi5maWVsZE51bWJlcildOwotfQotCi0tIChHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopZXh0ZW5zaW9uRm9yRGVzY3JpcHRvcjooR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkTnVtYmVyOihOU0ludGVnZXIpZmllbGROdW1iZXIgewotICBDbGFzcyBtZXNzYWdlQ2xhc3MgPSBkZXNjcmlwdG9yLm1lc3NhZ2VDbGFzczsKLSAgTlNEaWN0aW9uYXJ5ICpleHRlbnNpb25NYXAgPQotICAgICAgW211dGFibGVDbGFzc01hcF8gb2JqZWN0Rm9yS2V5Om1lc3NhZ2VDbGFzc107Ci0gIHJldHVybiBbZXh0ZW5zaW9uTWFwIG9iamVjdEZvcktleTpAKGZpZWxkTnVtYmVyKV07Ci19Ci0KLS0gKHZvaWQpYWRkRXh0ZW5zaW9uczooR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilyZWdpc3RyeSB7Ci0gIGlmIChyZWdpc3RyeSA9PSBuaWwpIHsKLSAgICAvLyBJbiB0aGUgY2FzZSB3aGVyZSB0aGVyZSBhcmUgbm8gZXh0ZW5zaW9ucyBqdXN0IGlnbm9yZS4KLSAgICByZXR1cm47Ci0gIH0KLSAgTlNNdXRhYmxlRGljdGlvbmFyeSAqb3RoZXJDbGFzc01hcCA9IHJlZ2lzdHJ5LT5tdXRhYmxlQ2xhc3NNYXBfOwotICBmb3IgKENsYXNzIGNvbnRhaW5pbmdNZXNzYWdlQ2xhc3MgaW4gb3RoZXJDbGFzc01hcCkgewotICAgIE5TTXV0YWJsZURpY3Rpb25hcnkgKmV4dGVuc2lvbk1hcCA9Ci0gICAgICAgIFtzZWxmIGV4dGVuc2lvbk1hcEZvckNvbnRhaW5pbmdNZXNzYWdlQ2xhc3M6Y29udGFpbmluZ01lc3NhZ2VDbGFzc107Ci0gICAgTlNNdXRhYmxlRGljdGlvbmFyeSAqb3RoZXJFeHRlbnNpb25NYXAgPQotICAgICAgICBbcmVnaXN0cnkgZXh0ZW5zaW9uTWFwRm9yQ29udGFpbmluZ01lc3NhZ2VDbGFzczpjb250YWluaW5nTWVzc2FnZUNsYXNzXTsKLSAgICBbZXh0ZW5zaW9uTWFwIGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckV4dGVuc2lvbk1hcF07Ci0gIH0KLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJNZXNzYWdlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQk1lc3NhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNThjNDJkMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQk1lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDMwOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0KLSNpbXBvcnQgIkdQQkJvb3RzdHJhcC5oIgotCi1AY2xhc3MgR1BCRGVzY3JpcHRvcjsKLUBjbGFzcyBHUEJDb2RlZElucHV0U3RyZWFtOwotQGNsYXNzIEdQQkNvZGVkT3V0cHV0U3RyZWFtOwotQGNsYXNzIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3I7Ci1AY2xhc3MgR1BCRXh0ZW5zaW9uUmVnaXN0cnk7Ci1AY2xhc3MgR1BCRmllbGREZXNjcmlwdG9yOwotQGNsYXNzIEdQQlVua25vd25GaWVsZFNldDsKLQotTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KLQotQ0ZfRVhURVJOX0NfQkVHSU4KLQotLy8vIE5TRXJyb3IgZG9tYWluIHVzZWQgZm9yIGVycm9ycy4KLWV4dGVybiBOU1N0cmluZyAqY29uc3QgR1BCTWVzc2FnZUVycm9yRG9tYWluOwotCi0vLy8gRXJyb3IgY29kZSBmb3IgTlNFcnJvciB3aXRoIEdQQk1lc3NhZ2VFcnJvckRvbWFpbi4KLXR5cGVkZWYgTlNfRU5VTShOU0ludGVnZXIsIEdQQk1lc3NhZ2VFcnJvckNvZGUpIHsKLSAgLy8vIFRoZSBkYXRhIGJlaW5nIHBhcnNlZCBpcyBiYWQgYW5kIGEgbWVzc2FnZSBjYW4gbm90IGJlIGNyZWF0ZWQgZnJvbSBpdC4KLSAgR1BCTWVzc2FnZUVycm9yQ29kZU1hbGZvcm1lZERhdGEgPSAtMTAwLAotICAvLy8gQSBtZXNzYWdlIGNhbid0IGJlIHNlcmlhbGl6ZWQgYmVjYXVzZSBpdCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KLSAgR1BCTWVzc2FnZUVycm9yQ29kZU1pc3NpbmdSZXF1aXJlZEZpZWxkID0gLTEwMSwKLX07Ci0KLSNpZmRlZiBERUJVRwotLy8vIEluIERFQlVHIE9OTFksIGFuIE5TRXhjZXB0aW9uIGlzIHRocm93biB3aGVuIGEgcGFyc2VkIG1lc3NhZ2UgZG9lc24ndAotLy8vIGNvbnRhaW4gcmVxdWlyZWQgZmllbGRzLiBUaGlzIGtleSBhbGxvd3MgeW91IHRvIHJldHJpZXZlIHRoZSBwYXJzZWQgbWVzc2FnZQotLy8vIGZyb20gdGhlIGV4Y2VwdGlvbidzIEBjIHVzZXJJbmZvIGRpY3Rpb25hcnkuCi1leHRlcm4gTlNTdHJpbmcgKmNvbnN0IEdQQkV4Y2VwdGlvbk1lc3NhZ2VLZXk7Ci0jZW5kaWYgIC8vIERFQlVHCi0KLUNGX0VYVEVSTl9DX0VORAotCi0vLy8gQmFzZSBjbGFzcyBmb3IgYWxsIG9mIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzLgotQGludGVyZmFjZSBHUEJNZXNzYWdlIDogTlNPYmplY3Q8TlNTZWN1cmVDb2RpbmcsIE5TQ29weWluZz4KLQotLy8gTk9URTogSWYgeW91IGFkZCBhIGluc3RhbmNlIG1ldGhvZC9wcm9wZXJ0eSB0byB0aGlzIGNsYXNzIHRoYXQgbWF5IGNvbmZsaWN0Ci0vLyB3aXRoIG1ldGhvZHMgZGVjbGFyZWQgaW4gcHJvdG9zLCB5b3UgbmVlZCB0byB1cGRhdGUgb2JqZWN0aXZlX2hlbHBlcnMuY2MuCi0vLyBUaGUgbWFpbiBjYXNlcyBhcmUgbWV0aG9kcyB0aGF0IHRha2Ugbm8gYXJndW1lbnRzLCBvciBzZXRGb286L2hhc0ZvbzogdHlwZQotLy8gbWV0aG9kcy4KLQotLy8vIFRoZSB1bmtub3duIGZpZWxkcyBmb3IgdGhpcyBtZXNzYWdlLgotLy8vCi0vLy8gT25seSBtZXNzYWdlcyBmcm9tIHByb3RvIGZpbGVzIGRlY2xhcmVkIHdpdGggInByb3RvMiIgc3ludGF4IHN1cHBvcnQgdW5rbm93bgotLy8vIGZpZWxkcy4gRm9yICJwcm90bzMiIHN5bnRheCwgYW55IHVua25vd24gZmllbGRzIGZvdW5kIHdoaWxlIHBhcnNpbmcgYXJlCi0vLy8gZHJvcHBlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIGNvcHksIG51bGxhYmxlKSBHUEJVbmtub3duRmllbGRTZXQgKnVua25vd25GaWVsZHM7Ci0KLS8vLyBBcmUgYWxsIHJlcXVpcmVkIGZpZWxkcyBzZXQgaW4gdGhlIG1lc3NhZ2UgYW5kIGFsbCBlbWJlZGRlZCBtZXNzYWdlcy4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5LCBnZXR0ZXI9aXNJbml0aWFsaXplZCkgQk9PTCBpbml0aWFsaXplZDsKLQotLy8vIFJldHVybnMgYW4gYXV0b3JlbGVhc2VkIGluc3RhbmNlLgotKyAoaW5zdGFuY2V0eXBlKW1lc3NhZ2U7Ci0KLS8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGJ5IHBhcnNpbmcgdGhlIGRhdGEuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzZW50IHRvCi0vLy8gdGhlIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlIGludGVycHJldGVkIGFzLiBJZgotLy8vIHRoZXJlIGlzIGFuIGVycm9yIHRoZSBtZXRob2QgcmV0dXJucyBuaWwgYW5kIHRoZSBlcnJvciBpcyByZXR1cm5lZCBpbgotLy8vIGVycm9yUHRyICh3aGVuIHByb3ZpZGVkKS4KLS8vLwotLy8vIEBub3RlIEluIERFQlVHIGJ1aWxkcywgdGhlIHBhcnNlZCBtZXNzYWdlIGlzIGNoZWNrZWQgdG8gYmUgc3VyZSBhbGwgcmVxdWlyZWQKLS8vLyAgICAgICBmaWVsZHMgd2VyZSBwcm92aWRlZCwgYW5kIHRoZSBwYXJzZSB3aWxsIGZhaWwgaWYgc29tZSBhcmUgbWlzc2luZy4KLS8vLwotLy8vIEBwYXJhbSBkYXRhICAgICBUaGUgZGF0YSB0byBwYXJzZS4KLS8vLyBAcGFyYW0gZXJyb3JQdHIgQW4gb3B0aW9uYWwgZXJyb3IgcG9pbnRlciB0byBmaWxsIGluIHdpdGggYSBmYWlsdXJlIHJlYXNvbiBpZgotLy8vICAgICAgICAgICAgICAgICB0aGUgZGF0YSBjYW4gbm90IGJlIHBhcnNlZC4KLS8vLwotLy8vIEByZXR1cm4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG1lc3NhZ2VkLgotKyAoaW5zdGFuY2V0eXBlKXBhcnNlRnJvbURhdGE6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3JQdHI7Ci0KLS8vLyBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIGJ5IHBhcnNpbmcgdGhlIGRhdGEuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzZW50IHRvCi0vLy8gdGhlIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlIGludGVycHJldGVkIGFzLiBJZgotLy8vIHRoZXJlIGlzIGFuIGVycm9yIHRoZSBtZXRob2QgcmV0dXJucyBuaWwgYW5kIHRoZSBlcnJvciBpcyByZXR1cm5lZCBpbgotLy8vIGVycm9yUHRyICh3aGVuIHByb3ZpZGVkKS4KLS8vLwotLy8vIEBub3RlIEluIERFQlVHIGJ1aWxkcywgdGhlIHBhcnNlZCBtZXNzYWdlIGlzIGNoZWNrZWQgdG8gYmUgc3VyZSBhbGwgcmVxdWlyZWQKLS8vLyAgICAgICBmaWVsZHMgd2VyZSBwcm92aWRlZCwgYW5kIHRoZSBwYXJzZSB3aWxsIGZhaWwgaWYgc29tZSBhcmUgbWlzc2luZy4KLS8vLwotLy8vIEBwYXJhbSBkYXRhICAgICAgICAgICAgICBUaGUgZGF0YSB0byBwYXJzZS4KLS8vLyBAcGFyYW0gZXh0ZW5zaW9uUmVnaXN0cnkgVGhlIGV4dGVuc2lvbiByZWdpc3RyeSB0byB1c2UgdG8gbG9vayB1cCBleHRlbnNpb25zLgotLy8vIEBwYXJhbSBlcnJvclB0ciAgICAgICAgICBBbiBvcHRpb25hbCBlcnJvciBwb2ludGVyIHRvIGZpbGwgaW4gd2l0aCBhIGZhaWx1cmUKLS8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uIGlmIHRoZSBkYXRhIGNhbiBub3QgYmUgcGFyc2VkLgotLy8vCi0vLy8gQHJldHVybiBBIG5ldyBpbnN0YW5jZSBvZiB0aGUgY2xhc3MgbWVzc2FnZWQuCi0rIChpbnN0YW5jZXR5cGUpcGFyc2VGcm9tRGF0YTooTlNEYXRhICopZGF0YQotICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6KG51bGxhYmxlIEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yUHRyOwotCi0vLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBieSBwYXJzaW5nIHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4gVGhpcwotLy8vIG1ldGhvZCBzaG91bGQgYmUgc2VudCB0byB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3MgdGhhdCB0aGUgZGF0YSBzaG91bGQKLS8vLyBiZSBpbnRlcnByZXRlZCBhcy4gSWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhlIG1ldGhvZCByZXR1cm5zIG5pbCBhbmQgdGhlIGVycm9yCi0vLy8gaXMgcmV0dXJuZWQgaW4gZXJyb3JQdHIgKHdoZW4gcHJvdmlkZWQpLgotLy8vCi0vLy8gQG5vdGUgSW4gREVCVUcgYnVpbGRzLCB0aGUgcGFyc2VkIG1lc3NhZ2UgaXMgY2hlY2tlZCB0byBiZSBzdXJlIGFsbCByZXF1aXJlZAotLy8vICAgICAgIGZpZWxkcyB3ZXJlIHByb3ZpZGVkLCBhbmQgdGhlIHBhcnNlIHdpbGwgZmFpbCBpZiBzb21lIGFyZSBtaXNzaW5nLgotLy8vCi0vLy8gQHBhcmFtIGlucHV0ICAgICAgICAgICAgIFRoZSBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCi0vLy8gQHBhcmFtIGV4dGVuc2lvblJlZ2lzdHJ5IFRoZSBleHRlbnNpb24gcmVnaXN0cnkgdG8gdXNlIHRvIGxvb2sgdXAgZXh0ZW5zaW9ucy4KLS8vLyBAcGFyYW0gZXJyb3JQdHIgICAgICAgICAgQW4gb3B0aW9uYWwgZXJyb3IgcG9pbnRlciB0byBmaWxsIGluIHdpdGggYSBmYWlsdXJlCi0vLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiBpZiB0aGUgZGF0YSBjYW4gbm90IGJlIHBhcnNlZC4KLS8vLwotLy8vIEByZXR1cm4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG1lc3NhZ2VkLgotKyAoaW5zdGFuY2V0eXBlKXBhcnNlRnJvbUNvZGVkSW5wdXRTdHJlYW06KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGxhYmxlIEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yUHRyOwotCi0vLy8gQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBieSBwYXJzaW5nIHRoZSBkYXRhIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4gVGhpcwotLy8vIG1ldGhvZCBzaG91bGQgYmUgc2VudCB0byB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3MgdGhhdCB0aGUgZGF0YSBzaG91bGQKLS8vLyBiZSBpbnRlcnByZXRlZCBhcy4gSWYgdGhlcmUgaXMgYW4gZXJyb3IgdGhlIG1ldGhvZCByZXR1cm5zIG5pbCBhbmQgdGhlIGVycm9yCi0vLy8gaXMgcmV0dXJuZWQgaW4gZXJyb3JQdHIgKHdoZW4gcHJvdmlkZWQpLgotLy8vCi0vLy8gQG5vdGUgVW5saWtlIHRoZSBwYXJzZUZyb20uLi4gbWV0aG9kcywgdGhpcyBuZXZlciBjaGVja3MgdG8gc2VlIGlmIGFsbCBvZgotLy8vICAgICAgIHRoZSByZXF1aXJlZCBmaWVsZHMgYXJlIHNldC4gU28gdGhpcyBtZXRob2QgY2FuIGJlIHVzZWQgdG8gcmVsb2FkCi0vLy8gICAgICAgbWVzc2FnZXMgdGhhdCBtYXkgbm90IGJlIGNvbXBsZXRlLgotLy8vCi0vLy8gQHBhcmFtIGlucHV0ICAgICAgICAgICAgIFRoZSBzdHJlYW0gdG8gcmVhZCBkYXRhIGZyb20uCi0vLy8gQHBhcmFtIGV4dGVuc2lvblJlZ2lzdHJ5IFRoZSBleHRlbnNpb24gcmVnaXN0cnkgdG8gdXNlIHRvIGxvb2sgdXAgZXh0ZW5zaW9ucy4KLS8vLyBAcGFyYW0gZXJyb3JQdHIgICAgICAgICAgQW4gb3B0aW9uYWwgZXJyb3IgcG9pbnRlciB0byBmaWxsIGluIHdpdGggYSBmYWlsdXJlCi0vLy8gICAgICAgICAgICAgICAgICAgICAgICAgIHJlYXNvbiBpZiB0aGUgZGF0YSBjYW4gbm90IGJlIHBhcnNlZC4KLS8vLwotLy8vIEByZXR1cm4gQSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGNsYXNzIG1lc3NhZ2VkLgotKyAoaW5zdGFuY2V0eXBlKXBhcnNlRGVsaW1pdGVkRnJvbUNvZGVkSW5wdXRTdHJlYW06KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGxhYmxlIEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yUHRyOwotCi0vLy8gSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2UgYnkgcGFyc2luZyB0aGUgZGF0YS4gVGhpcyBtZXRob2Qgc2hvdWxkIGJlIHNlbnQgdG8KLS8vLyB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UgY2xhc3MgdGhhdCB0aGUgZGF0YSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMuIElmCi0vLy8gdGhlcmUgaXMgYW4gZXJyb3IgdGhlIG1ldGhvZCByZXR1cm5zIG5pbCBhbmQgdGhlIGVycm9yIGlzIHJldHVybmVkIGluCi0vLy8gZXJyb3JQdHIgKHdoZW4gcHJvdmlkZWQpLgotLy8vCi0vLy8gQG5vdGUgSW4gREVCVUcgYnVpbGRzLCB0aGUgcGFyc2VkIG1lc3NhZ2UgaXMgY2hlY2tlZCB0byBiZSBzdXJlIGFsbCByZXF1aXJlZAotLy8vICAgICAgIGZpZWxkcyB3ZXJlIHByb3ZpZGVkLCBhbmQgdGhlIHBhcnNlIHdpbGwgZmFpbCBpZiBzb21lIGFyZSBtaXNzaW5nLgotLy8vCi0vLy8gQHBhcmFtIGRhdGEgICAgIFRoZSBkYXRhIHRvIHBhcnNlLgotLy8vIEBwYXJhbSBlcnJvclB0ciBBbiBvcHRpb25hbCBlcnJvciBwb2ludGVyIHRvIGZpbGwgaW4gd2l0aCBhIGZhaWx1cmUgcmVhc29uIGlmCi0vLy8gICAgICAgICAgICAgICAgIHRoZSBkYXRhIGNhbiBub3QgYmUgcGFyc2VkLgotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YSBlcnJvcjooTlNFcnJvciAqKillcnJvclB0cjsKLQotLy8vIEluaXRpYWxpemVzIGFuIGluc3RhbmNlIGJ5IHBhcnNpbmcgdGhlIGRhdGEuIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBzZW50IHRvCi0vLy8gdGhlIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzIHRoYXQgdGhlIGRhdGEgc2hvdWxkIGJlIGludGVycHJldGVkIGFzLiBJZgotLy8vIHRoZXJlIGlzIGFuIGVycm9yIHRoZSBtZXRob2QgcmV0dXJucyBuaWwgYW5kIHRoZSBlcnJvciBpcyByZXR1cm5lZCBpbgotLy8vIGVycm9yUHRyICh3aGVuIHByb3ZpZGVkKS4KLS8vLwotLy8vIEBub3RlIEluIERFQlVHIGJ1aWxkcywgdGhlIHBhcnNlZCBtZXNzYWdlIGlzIGNoZWNrZWQgdG8gYmUgc3VyZSBhbGwgcmVxdWlyZWQKLS8vLyAgICAgICBmaWVsZHMgd2VyZSBwcm92aWRlZCwgYW5kIHRoZSBwYXJzZSB3aWxsIGZhaWwgaWYgc29tZSBhcmUgbWlzc2luZy4KLS8vLwotLy8vIEBwYXJhbSBkYXRhICAgICAgICAgICAgICBUaGUgZGF0YSB0byBwYXJzZS4KLS8vLyBAcGFyYW0gZXh0ZW5zaW9uUmVnaXN0cnkgVGhlIGV4dGVuc2lvbiByZWdpc3RyeSB0byB1c2UgdG8gbG9vayB1cCBleHRlbnNpb25zLgotLy8vIEBwYXJhbSBlcnJvclB0ciAgICAgICAgICBBbiBvcHRpb25hbCBlcnJvciBwb2ludGVyIHRvIGZpbGwgaW4gd2l0aCBhIGZhaWx1cmUKLS8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uIGlmIHRoZSBkYXRhIGNhbiBub3QgYmUgcGFyc2VkLgotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoRGF0YTooTlNEYXRhICopZGF0YQotICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeToobnVsbGFibGUgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvclB0cjsKLQotLy8vIEluaXRpYWxpemVzIGFuIGluc3RhbmNlIGJ5IHBhcnNpbmcgdGhlIGRhdGEgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLiBUaGlzCi0vLy8gbWV0aG9kIHNob3VsZCBiZSBzZW50IHRvIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSBjbGFzcyB0aGF0IHRoZSBkYXRhIHNob3VsZAotLy8vIGJlIGludGVycHJldGVkIGFzLiBJZiB0aGVyZSBpcyBhbiBlcnJvciB0aGUgbWV0aG9kIHJldHVybnMgbmlsIGFuZCB0aGUgZXJyb3IKLS8vLyBpcyByZXR1cm5lZCBpbiBlcnJvclB0ciAod2hlbiBwcm92aWRlZCkuCi0vLy8KLS8vLyBAbm90ZSBVbmxpa2UgdGhlIHBhcnNlRnJvbS4uLiBtZXRob2RzLCB0aGlzIG5ldmVyIGNoZWNrcyB0byBzZWUgaWYgYWxsIG9mCi0vLy8gICAgICAgdGhlIHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0LiBTbyB0aGlzIG1ldGhvZCBjYW4gYmUgdXNlZCB0byByZWxvYWQKLS8vLyAgICAgICBtZXNzYWdlcyB0aGF0IG1heSBub3QgYmUgY29tcGxldGUuCi0vLy8KLS8vLyBAcGFyYW0gaW5wdXQgICAgICAgICAgICAgVGhlIHN0cmVhbSB0byByZWFkIGRhdGEgZnJvbS4KLS8vLyBAcGFyYW0gZXh0ZW5zaW9uUmVnaXN0cnkgVGhlIGV4dGVuc2lvbiByZWdpc3RyeSB0byB1c2UgdG8gbG9vayB1cCBleHRlbnNpb25zLgotLy8vIEBwYXJhbSBlcnJvclB0ciAgICAgICAgICBBbiBvcHRpb25hbCBlcnJvciBwb2ludGVyIHRvIGZpbGwgaW4gd2l0aCBhIGZhaWx1cmUKLS8vLyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVhc29uIGlmIHRoZSBkYXRhIGNhbiBub3QgYmUgcGFyc2VkLgotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ29kZWRJbnB1dFN0cmVhbTooR1BCQ29kZWRJbnB1dFN0cmVhbSAqKWlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKG51bGxhYmxlIEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3JQdHI7Ci0KLS8vLyBXcml0ZXMgb3V0IHRoZSBtZXNzYWdlIHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0OwotLy8vIFdyaXRlcyBvdXQgdGhlIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIG91dHB1dCBzdHJlYW0uCi0tICh2b2lkKXdyaXRlVG9PdXRwdXRTdHJlYW06KE5TT3V0cHV0U3RyZWFtICopb3V0cHV0OwotCi0vLy8gV3JpdGVzIG91dCBhIHZhcmludCBmb3IgdGhlIG1lc3NhZ2Ugc2l6ZSBmb2xsb3dlZCBieSB0aGUgdGhlIG1lc3NhZ2UgdG8KLS8vLyB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4KLS0gKHZvaWQpd3JpdGVEZWxpbWl0ZWRUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dDsKLS8vLyBXcml0ZXMgb3V0IGEgdmFyaW50IGZvciB0aGUgbWVzc2FnZSBzaXplIGZvbGxvd2VkIGJ5IHRoZSB0aGUgbWVzc2FnZSB0bwotLy8vIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLgotLSAodm9pZCl3cml0ZURlbGltaXRlZFRvT3V0cHV0U3RyZWFtOihOU091dHB1dFN0cmVhbSAqKW91dHB1dDsKLQotLy8vIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBAYyBOU0RhdGEuCi0vLy8KLS8vLyBJZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBnZW5lcmF0aW5nIHRoZSBkYXRhLCBuaWwgaXMgcmV0dXJuZWQuCi0vLy8KLS8vLyBAbm90ZSBUaGlzIHZhbHVlIGlzIG5vdCBjYWNoZWQsIHNvIGlmIHlvdSBhcmUgdXNpbmcgaXQgcmVwZWF0ZWRseSwgY2FjaGUKLS8vLyAgICAgICBpdCB5b3Vyc2VsZi4KLS8vLwotLy8vIEBub3RlIEluIERFQlVHIE9OTFksIHRoZSBtZXNzYWdlIGlzIGFsc28gY2hlY2tlZCBmb3IgYWxsIHJlcXVpcmVkIGZpZWxkLAotLy8vICAgICAgIGlmIG9uZSBpcyBtaXNzaW5nLCBuaWwgd2lsbCBiZSByZXR1cm5lZC4KLS0gKG51bGxhYmxlIE5TRGF0YSAqKWRhdGE7Ci0KLS8vLyBTZXJpYWxpemVzIGEgdmFyaW50IHdpdGggdGhlIG1lc3NhZ2Ugc2l6ZSBmb2xsb3dlZCBieSB0aGUgbWVzc2FnZSBkYXRhLAotLy8vIHJldHVybmluZyB0aGF0IGFzIGEgQGMgTlNEYXRhLgotLy8vCi0vLy8gQG5vdGUgVGhpcyB2YWx1ZSBpcyBub3QgY2FjaGVkLCBzbyBpZiB5b3UgYXJlIHVzaW5nIGl0IHJlcGVhdGVkbHksIGNhY2hlCi0vLy8gICAgICAgaXQgeW91cnNlbGYuCi0tIChOU0RhdGEgKilkZWxpbWl0ZWREYXRhOwotCi0vLy8gQ2FsY3VsYXRlcyB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0IGlmIGl0IHdlcmUgc2VyaWFsaXplZC4KLS8vLwotLy8vIFRoaXMgaXMgbm90IGEgY2FjaGVkIHZhbHVlLiBJZiB5b3UgYXJlIGZvbGxvd2luZyBhIHBhdHRlcm4gbGlrZSB0aGlzOgotLy8vIEBjb2RlCi0vLy8gICBzaXplX3Qgc2l6ZSA9IFthTXNnIHNlcmlhbGl6ZWRTaXplXTsKLS8vLyAgIE5TTXV0YWJsZURhdGEgKmZvbyA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoQ2FwYWNpdHk6c2l6ZSArIHNpemVvZihzaXplKV07Ci0vLy8gICBbZm9vIHdyaXRlU2l6ZTpzaXplXTsKLS8vLyAgIFtmb28gYXBwZW5kRGF0YTpbYU1zZyBkYXRhXV07Ci0vLy8gQGVuZGNvZGUKLS8vLyB5b3Ugd291bGQgYmUgYmV0dGVyIGRvaW5nOgotLy8vIEBjb2RlCi0vLy8gICBOU0RhdGEgKmRhdGEgPSBbYU1zZyBkYXRhXTsKLS8vLyAgIE5TVUludGVnZXIgc2l6ZSA9IFthTXNnIGxlbmd0aF07Ci0vLy8gICBOU011dGFibGVEYXRhICpmb28gPSBbTlNNdXRhYmxlRGF0YSBkYXRhV2l0aENhcGFjaXR5OnNpemUgKyBzaXplb2Yoc2l6ZSldOwotLy8vICAgW2ZvbyB3cml0ZVNpemU6c2l6ZV07Ci0vLy8gICBbZm9vIGFwcGVuZERhdGE6ZGF0YV07Ci0vLy8gQGVuZGNvZGUKLS0gKHNpemVfdClzZXJpYWxpemVkU2l6ZTsKLQotLy8vIFJldHVybiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIG1lc3NhZ2UgY2xhc3MuCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvcjsKLS8vLyBSZXR1cm4gdGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBtZXNzYWdlLgotLSAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3I7Ci0KLS8vLyBUZXN0IHRvIHNlZSBpZiB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGlzIHNldCBvbiB0aGUgbWVzc2FnZS4KLS0gKEJPT0wpaGFzRXh0ZW5zaW9uOihHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopZXh0ZW5zaW9uOwotCi0vLy8gRmV0Y2hlcyB0aGUgZ2l2ZW4gZXh0ZW5zaW9uJ3MgdmFsdWUgZm9yIHRoaXMgbWVzc2FnZS4KLS8vLwotLy8vIEV4dGVuc2lvbnMgdXNlIGJveGVkIHZhbHVlcyAoTlNOdW1iZXJzKSBmb3IgUE9EcyBhbmQgTlNNdXRhYmxlQXJyYXlzIGZvcgotLy8vIHJlcGVhdGVkIGZpZWxkcy4gSWYgdGhlIGV4dGVuc2lvbiBpcyBhIE1lc3NhZ2Ugb25lIHdpbGwgYmUgYXV0byBjcmVhdGVkIGZvciB5b3UKLS8vLyBhbmQgcmV0dXJuZWQgc2ltaWxhciB0byBmaWVsZHMuCi0tIChudWxsYWJsZSBpZClnZXRFeHRlbnNpb246KEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKilleHRlbnNpb247Ci0KLS8vLyBTZXRzIHRoZSBnaXZlbiBleHRlbnNpb24ncyB2YWx1ZSBmb3IgdGhpcyBtZXNzYWdlLiBUaGlzIGlzIG9ubHkgZm9yIHNpbmdsZQotLy8vIGZpZWxkIGV4dGVuc2lvbnMgKGkuZS4gLSBub3QgcmVwZWF0ZWQgZmllbGRzKS4KLS8vLwotLy8vIEV4dGVuc2lvbnMgdXNlIGJveGVkIHZhbHVlcyAoQGMgTlNOdW1iZXJzKS4KLS0gKHZvaWQpc2V0RXh0ZW5zaW9uOihHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopZXh0ZW5zaW9uIHZhbHVlOihudWxsYWJsZSBpZCl2YWx1ZTsKLQotLy8vIEFkZHMgdGhlIGdpdmVuIHZhbHVlIHRvIHRoZSBleHRlbnNpb24gZm9yIHRoaXMgbWVzc2FnZS4gVGhpcyBpcyBvbmx5IGZvcgotLy8vIHJlcGVhdGVkIGZpZWxkIGV4dGVuc2lvbnMuIElmIHRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIFBPRCB0eXBlIHRoZSBAYyB2YWx1ZQotLy8vIGlzIGEgQGMgTlNOdW1iZXIuCi0tICh2b2lkKWFkZEV4dGVuc2lvbjooR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqKWV4dGVuc2lvbiB2YWx1ZTooaWQpdmFsdWU7Ci0KLS8vLyBSZXBsYWNlcyB0aGUgZ2l2ZW4gdmFsdWUgYXQgYW4gaW5kZXggZm9yIHRoZSBleHRlbnNpb24gb24gdGhpcyBtZXNzYWdlLiBUaGlzCi0vLy8gaXMgb25seSBmb3IgcmVwZWF0ZWQgZmllbGQgZXh0ZW5zaW9ucy4gSWYgdGhlIGZpZWxkIGlzIGEgcmVwZWF0ZWQgUE9EIHR5cGUKLS8vLyB0aGUgQGMgdmFsdWUgaXMgYSBAYyBOU051bWJlci4KLS0gKHZvaWQpc2V0RXh0ZW5zaW9uOihHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICBpbmRleDooTlNVSW50ZWdlcilpbmRleAotICAgICAgICAgICAgICAgdmFsdWU6KGlkKXZhbHVlOwotCi0vLy8gQ2xlYXJzIHRoZSBnaXZlbiBleHRlbnNpb24gZm9yIHRoaXMgbWVzc2FnZS4KLS0gKHZvaWQpY2xlYXJFeHRlbnNpb246KEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKilleHRlbnNpb247Ci0KLS8vLyBSZXNldHMgYWxsIG9mIHRoZSBmaWVsZHMgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotLSAodm9pZCljbGVhcjsKLQotLy8vIFBhcnNlcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20gdGhlIGlucHV0IGFuZCBtZXJnZXMgaXQgd2l0aCB0aGlzCi0vLy8gbWVzc2FnZS4KLS8vLwotLy8vIEBub3RlIFRoaXMgd2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBhbiBlcnJvciBwYXJzaW5nIHRoZSBkYXRhLgotLSAodm9pZCltZXJnZUZyb21EYXRhOihOU0RhdGEgKilkYXRhCi0gICAgZXh0ZW5zaW9uUmVnaXN0cnk6KG51bGxhYmxlIEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLS8vLyBNZXJnZXMgdGhlIGZpZWxkcyBmcm9tIGFub3RoZXIgbWVzc2FnZSAob2YgdGhlIHNhbWUgdHlwZSkgaW50byB0aGlzCi0vLy8gbWVzc2FnZS4KLS0gKHZvaWQpbWVyZ2VGcm9tOihHUEJNZXNzYWdlICopb3RoZXI7Ci0KLUBlbmQKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQk1lc3NhZ2UubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCTWVzc2FnZS5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MTM0ZTI1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCTWVzc2FnZS5tCisrKyAvZGV2L251bGwKQEAgLTEsMzE4NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCTWVzc2FnZV9QYWNrYWdlUHJpdmF0ZS5oIgotCi0jaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KLSNpbXBvcnQgPG9iamMvbWVzc2FnZS5oPgotCi0jaW1wb3J0ICJHUEJBcnJheV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCQ29kZWRJbnB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCQ29kZWRPdXRwdXRTdHJlYW1fUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3JfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQkRpY3Rpb25hcnlfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQkV4dGVuc2lvbkludGVybmFscy5oIgotI2ltcG9ydCAiR1BCRXh0ZW5zaW9uUmVnaXN0cnkuaCIKLSNpbXBvcnQgIkdQQlJvb3RPYmplY3RfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQlVua25vd25GaWVsZFNldF9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCVXRpbGl0aWVzX1BhY2thZ2VQcml2YXRlLmgiCi0KLU5TU3RyaW5nICpjb25zdCBHUEJNZXNzYWdlRXJyb3JEb21haW4gPQotICAgIEdQQk5TU3RyaW5naWZ5U3ltYm9sKEdQQk1lc3NhZ2VFcnJvckRvbWFpbik7Ci0KLSNpZmRlZiBERUJVRwotTlNTdHJpbmcgKmNvbnN0IEdQQkV4Y2VwdGlvbk1lc3NhZ2VLZXkgPQotICAgIEdQQk5TU3RyaW5naWZ5U3ltYm9sKEdQQkV4Y2VwdGlvbk1lc3NhZ2UpOwotI2VuZGlmICAvLyBERUJVRwotCi1zdGF0aWMgTlNTdHJpbmcgKmNvbnN0IGtHUEJEYXRhQ29kZXJLZXkgPSBAIkdQQkRhdGEiOwotCi0vLwotLy8gUExFQVNFIFJFTUVNQkVSOgotLy8KLS8vIFRoaXMgaXMgdGhlIGJhc2UgY2xhc3MgZm9yICphbGwqIG1lc3NhZ2VzIGdlbmVyYXRlZCwgc28gYW55IHNlbGVjdG9yIGRlZmluZWQsCi0vLyAqcHVibGljKiBvciAqcHJpdmF0ZSogY291bGQgZW5kIHVwIGNvbGxpZGluZyB3aXRoIGEgcHJvdG8gbWVzc2FnZSBmaWVsZC4gU28KLS8vIGF2b2lkIHVzaW5nIHNlbGVjdG9ycyB0aGF0IGNvdWxkIG1hdGNoIGEgcHJvcGVydHksIHVzZSBDIGZ1bmN0aW9ucyB0byBoaWRlCi0vLyB0aGVtLCBldGMuCi0vLwotCi1AaW50ZXJmYWNlIEdQQk1lc3NhZ2UgKCkgewotIEBwYWNrYWdlCi0gIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bkZpZWxkc187Ci0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKmV4dGVuc2lvbk1hcF87Ci0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKmF1dG9jcmVhdGVkRXh0ZW5zaW9uTWFwXzsKLQotICAvLyBJZiB0aGUgb2JqZWN0IHdhcyBhdXRvY3JlYXRlZCwgd2UgcmVtZW1iZXIgdGhlIGNyZWF0b3Igc28gdGhhdCBpZiB3ZSBnZXQKLSAgLy8gbXV0YXRlZCwgd2UgY2FuIGluZm9ybSB0aGUgY3JlYXRvciB0byBtYWtlIG91ciBmaWVsZCB2aXNpYmxlLgotICBHUEJNZXNzYWdlICphdXRvY3JlYXRvcl87Ci0gIEdQQkZpZWxkRGVzY3JpcHRvciAqYXV0b2NyZWF0b3JGaWVsZF87Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmF1dG9jcmVhdG9yRXh0ZW5zaW9uXzsKLX0KLUBlbmQKLQotc3RhdGljIGlkIENyZWF0ZUFycmF5Rm9yRmllbGQoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmF1dG9jcmVhdG9yKQotICAgIF9fYXR0cmlidXRlX18oKG5zX3JldHVybnNfcmV0YWluZWQpKTsKLXN0YXRpYyBpZCBHZXRPckNyZWF0ZUFycmF5SXZhcldpdGhGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpOwotc3RhdGljIGlkIEdldEFycmF5SXZhcldpdGhGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLXN0YXRpYyBpZCBDcmVhdGVNYXBGb3JGaWVsZChHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmF1dG9jcmVhdG9yKQotICAgIF9fYXR0cmlidXRlX18oKG5zX3JldHVybnNfcmV0YWluZWQpKTsKLXN0YXRpYyBpZCBHZXRPckNyZWF0ZU1hcEl2YXJXaXRoRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpOwotc3RhdGljIGlkIEdldE1hcEl2YXJXaXRoRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci1zdGF0aWMgTlNNdXRhYmxlRGljdGlvbmFyeSAqQ2xvbmVFeHRlbnNpb25NYXAoTlNEaWN0aW9uYXJ5ICpleHRlbnNpb25NYXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNab25lICp6b25lKQotICAgIF9fYXR0cmlidXRlX18oKG5zX3JldHVybnNfcmV0YWluZWQpKTsKLQotc3RhdGljIE5TRXJyb3IgKk1lc3NhZ2VFcnJvcihOU0ludGVnZXIgY29kZSwgTlNEaWN0aW9uYXJ5ICp1c2VySW5mbykgewotICByZXR1cm4gW05TRXJyb3IgZXJyb3JXaXRoRG9tYWluOkdQQk1lc3NhZ2VFcnJvckRvbWFpbgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb2RlOmNvZGUKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2VySW5mbzp1c2VySW5mb107Ci19Ci0KLXN0YXRpYyBOU0Vycm9yICpNZXNzYWdlRXJyb3JXaXRoUmVhc29uKE5TSW50ZWdlciBjb2RlLCBOU1N0cmluZyAqcmVhc29uKSB7Ci0gIE5TRGljdGlvbmFyeSAqdXNlckluZm8gPSBuaWw7Ci0gIGlmIChbcmVhc29uIGxlbmd0aF0pIHsKLSAgICB1c2VySW5mbyA9IEB7IEAiUmVhc29uIiA6IHJlYXNvbiB9OwotICB9Ci0gIHJldHVybiBNZXNzYWdlRXJyb3IoY29kZSwgdXNlckluZm8pOwotfQotCi0KLXN0YXRpYyB2b2lkIENoZWNrRXh0ZW5zaW9uKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24pIHsKLSAgaWYgKFtzZWxmIGNsYXNzXSAhPSBleHRlbnNpb24uY29udGFpbmluZ01lc3NhZ2VDbGFzcykgewotICAgIFtOU0V4Y2VwdGlvbgotICAgICAgICAgcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgZm9ybWF0OkAiRXh0ZW5zaW9uICVAIHVzZWQgb24gd3JvbmcgY2xhc3MgKCVAIGluc3RlYWQgb2YgJUApIiwKLSAgICAgICAgICAgICAgIGV4dGVuc2lvbi5zaW5nbGV0b25OYW1lLAotICAgICAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBleHRlbnNpb24uY29udGFpbmluZ01lc3NhZ2VDbGFzc107Ci0gIH0KLX0KLQotc3RhdGljIE5TTXV0YWJsZURpY3Rpb25hcnkgKkNsb25lRXh0ZW5zaW9uTWFwKE5TRGljdGlvbmFyeSAqZXh0ZW5zaW9uTWFwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TWm9uZSAqem9uZSkgewotICBpZiAoZXh0ZW5zaW9uTWFwLmNvdW50ID09IDApIHsKLSAgICByZXR1cm4gbmlsOwotICB9Ci0gIE5TTXV0YWJsZURpY3Rpb25hcnkgKnJlc3VsdCA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY1dpdGhab25lOnpvbmVdCi0gICAgICBpbml0V2l0aENhcGFjaXR5OmV4dGVuc2lvbk1hcC5jb3VudF07Ci0KLSAgZm9yIChHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24gaW4gZXh0ZW5zaW9uTWFwKSB7Ci0gICAgaWQgdmFsdWUgPSBbZXh0ZW5zaW9uTWFwIG9iamVjdEZvcktleTpleHRlbnNpb25dOwotICAgIEJPT0wgaXNNZXNzYWdlRXh0ZW5zaW9uID0gR1BCRXh0ZW5zaW9uSXNNZXNzYWdlKGV4dGVuc2lvbik7Ci0KLSAgICBpZiAoZXh0ZW5zaW9uLnJlcGVhdGVkKSB7Ci0gICAgICBpZiAoaXNNZXNzYWdlRXh0ZW5zaW9uKSB7Ci0gICAgICAgIE5TTXV0YWJsZUFycmF5ICpsaXN0ID0KLSAgICAgICAgICAgIFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6W3ZhbHVlIGNvdW50XV07Ci0gICAgICAgIGZvciAoR1BCTWVzc2FnZSAqbGlzdFZhbHVlIGluIHZhbHVlKSB7Ci0gICAgICAgICAgR1BCTWVzc2FnZSAqY29waWVkVmFsdWUgPSBbbGlzdFZhbHVlIGNvcHlXaXRoWm9uZTp6b25lXTsKLSAgICAgICAgICBbbGlzdCBhZGRPYmplY3Q6Y29waWVkVmFsdWVdOwotICAgICAgICAgIFtjb3BpZWRWYWx1ZSByZWxlYXNlXTsKLSAgICAgICAgfQotICAgICAgICBbcmVzdWx0IHNldE9iamVjdDpsaXN0IGZvcktleTpleHRlbnNpb25dOwotICAgICAgICBbbGlzdCByZWxlYXNlXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIE5TTXV0YWJsZUFycmF5ICpjb3BpZWRWYWx1ZSA9IFt2YWx1ZSBtdXRhYmxlQ29weVdpdGhab25lOnpvbmVdOwotICAgICAgICBbcmVzdWx0IHNldE9iamVjdDpjb3BpZWRWYWx1ZSBmb3JLZXk6ZXh0ZW5zaW9uXTsKLSAgICAgICAgW2NvcGllZFZhbHVlIHJlbGVhc2VdOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoaXNNZXNzYWdlRXh0ZW5zaW9uKSB7Ci0gICAgICAgIEdQQk1lc3NhZ2UgKmNvcGllZFZhbHVlID0gW3ZhbHVlIGNvcHlXaXRoWm9uZTp6b25lXTsKLSAgICAgICAgW3Jlc3VsdCBzZXRPYmplY3Q6Y29waWVkVmFsdWUgZm9yS2V5OmV4dGVuc2lvbl07Ci0gICAgICAgIFtjb3BpZWRWYWx1ZSByZWxlYXNlXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFtyZXN1bHQgc2V0T2JqZWN0OnZhbHVlIGZvcktleTpleHRlbnNpb25dOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpZCBDcmVhdGVBcnJheUZvckZpZWxkKEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICphdXRvY3JlYXRvcikgewotICBpZCByZXN1bHQ7Ci0gIEdQQkRhdGFUeXBlIGZpZWxkRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgc3dpdGNoIChmaWVsZERhdGFUeXBlKSB7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUJvb2w6Ci0gICAgICByZXN1bHQgPSBbW0dQQkJvb2xBcnJheSBhbGxvY10gaW5pdF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICBjYXNlIEdQQkRhdGFUeXBlVUludDMyOgotICAgICAgcmVzdWx0ID0gW1tHUEJVSW50MzJBcnJheSBhbGxvY10gaW5pdF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlSW50MzI6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDMyOgotICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6Ci0gICAgICByZXN1bHQgPSBbW0dQQkludDMyQXJyYXkgYWxsb2NdIGluaXRdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQ2NDoKLSAgICAgIHJlc3VsdCA9IFtbR1BCVUludDY0QXJyYXkgYWxsb2NdIGluaXRdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUludDY0OgotICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQ2NDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDY0OgotICAgICAgcmVzdWx0ID0gW1tHUEJJbnQ2NEFycmF5IGFsbG9jXSBpbml0XTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVGbG9hdDoKLSAgICAgIHJlc3VsdCA9IFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdF07Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRG91YmxlOgotICAgICAgcmVzdWx0ID0gW1tHUEJEb3VibGVBcnJheSBhbGxvY10gaW5pdF07Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOgotICAgICAgcmVzdWx0ID0gW1tHUEJFbnVtQXJyYXkgYWxsb2NdCi0gICAgICAgICAgICAgICAgICBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmaWVsZC5lbnVtRGVzY3JpcHRvci5lbnVtVmVyaWZpZXJdOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEdQQkRhdGFUeXBlQnl0ZXM6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6Ci0gICAgICBpZiAoYXV0b2NyZWF0b3IpIHsKLSAgICAgICAgcmVzdWx0ID0gW1tHUEJBdXRvY3JlYXRlZEFycmF5IGFsbG9jXSBpbml0XTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoYXV0b2NyZWF0b3IpIHsKLSAgICBpZiAoR1BCRGF0YVR5cGVJc09iamVjdChmaWVsZERhdGFUeXBlKSkgewotICAgICAgR1BCQXV0b2NyZWF0ZWRBcnJheSAqYXV0b0FycmF5ID0gcmVzdWx0OwotICAgICAgYXV0b0FycmF5LT5fYXV0b2NyZWF0b3IgPSAgYXV0b2NyZWF0b3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdQQkludDMyQXJyYXkgKmdwYkFycmF5ID0gcmVzdWx0OwotICAgICAgZ3BiQXJyYXktPl9hdXRvY3JlYXRvciA9IGF1dG9jcmVhdG9yOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBpZCBDcmVhdGVNYXBGb3JGaWVsZChHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmF1dG9jcmVhdG9yKSB7Ci0gIGlkIHJlc3VsdDsKLSAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBzd2l0Y2ggKGtleURhdGFUeXBlKSB7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUJvb2w6Ci0gICAgICBzd2l0Y2ggKHZhbHVlRGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJvb2w6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJCb29sQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQzMjoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUludDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkMzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJCb29sSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50NjQ6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJCb29sVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDY0OgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCQm9vbEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGbG9hdDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRG91YmxlOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRW51bToKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkJvb2xFbnVtRGljdGlvbmFyeSBhbGxvY10KLSAgICAgICAgICAgICAgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZmllbGQuZW51bURlc2NyaXB0b3IuZW51bVZlcmlmaWVyXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVN0cmluZzoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkJvb2xPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgICAgIE5TQ0Fzc2VydChOTywgQCJzaG91bGRuJ3QgaGFwcGVuIik7Ci0gICAgICAgICAgcmV0dXJuIG5pbDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDMyOgotICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50MzI6Ci0gICAgICBzd2l0Y2ggKHZhbHVlRGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJvb2w6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50MzJCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlVUludDMyOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCVUludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDMyOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCVUludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50NjQ6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUludDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50NjQ6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRmxvYXQ6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRG91YmxlOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCVUludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdCi0gICAgICAgICAgICAgIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZpZWxkLmVudW1EZXNjcmlwdG9yLmVudW1WZXJpZmllcl07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZU1lc3NhZ2U6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgICAgIE5TQ0Fzc2VydChOTywgQCJzaG91bGRuJ3QgaGFwcGVuIik7Ci0gICAgICAgICAgcmV0dXJuIG5pbDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQzMjoKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkMzI6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQzMjoKLSAgICAgIHN3aXRjaCAodmFsdWVEYXRhVHlwZSkgewotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQm9vbDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQzMjoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDMyOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQ2NDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkludDMyVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDY0OgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRmxvYXQ6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRW51bToKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdCi0gICAgICAgICAgICAgIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOmZpZWxkLmVudW1EZXNjcmlwdG9yLmVudW1WZXJpZmllcl07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZU1lc3NhZ2U6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlR3JvdXA6Ci0gICAgICAgICAgTlNDQXNzZXJ0KE5PLCBAInNob3VsZG4ndCBoYXBwZW4iKTsKLSAgICAgICAgICByZXR1cm4gbmlsOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQ2NDoKLSAgICAgIHN3aXRjaCAodmFsdWVEYXRhVHlwZSkgewotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQm9vbDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkMzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50MzI6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUludDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkMzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQ2NDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlSW50NjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQ2NDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGbG9hdDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUVudW06Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10KLSAgICAgICAgICAgICAgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZmllbGQuZW51bURlc2NyaXB0b3IuZW51bVZlcmlmaWVyXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVN0cmluZzoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlR3JvdXA6Ci0gICAgICAgICAgTlNDQXNzZXJ0KE5PLCBAInNob3VsZG4ndCBoYXBwZW4iKTsKLSAgICAgICAgICByZXR1cm4gbmlsOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUludDY0OgotICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQ2NDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDY0OgotICAgICAgc3dpdGNoICh2YWx1ZURhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVCb29sOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlVUludDMyOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUludDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkMzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlVUludDY0OgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUludDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50NjQ6Ci0gICAgICAgICAgcmVzdWx0ID0gW1tHUEJJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGbG9hdDoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZURvdWJsZToKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10KLSAgICAgICAgICAgICAgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246ZmllbGQuZW51bURlc2NyaXB0b3IuZW51bVZlcmlmaWVyXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVN0cmluZzoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDoKLSAgICAgICAgICBOU0NBc3NlcnQoTk8sIEAic2hvdWxkbid0IGhhcHBlbiIpOwotICAgICAgICAgIHJldHVybiBuaWw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOgotICAgICAgc3dpdGNoICh2YWx1ZURhdGFUeXBlKSB7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVCb29sOgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQzMjoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlSW50MzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQzMjoKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlVUludDY0OgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDY0OgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZsb2F0OgotICAgICAgICAgIHJlc3VsdCA9IFtbR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZURvdWJsZToKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRW51bToKLSAgICAgICAgICByZXN1bHQgPSBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXQotICAgICAgICAgICAgICBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpmaWVsZC5lbnVtRGVzY3JpcHRvci5lbnVtVmVyaWZpZXJdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQnl0ZXM6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOgotICAgICAgICAgIGlmIChhdXRvY3JlYXRvcikgewotICAgICAgICAgICAgcmVzdWx0ID0gW1tHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgICAgIE5TQ0Fzc2VydChOTywgQCJzaG91bGRuJ3QgaGFwcGVuIik7Ci0gICAgICAgICAgcmV0dXJuIG5pbDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHUEJEYXRhVHlwZUZsb2F0OgotICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUVudW06Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgIE5TQ0Fzc2VydChOTywgQCJzaG91bGRuJ3QgaGFwcGVuIik7Ci0gICAgICByZXR1cm4gbmlsOwotICB9Ci0KLSAgaWYgKGF1dG9jcmVhdG9yKSB7Ci0gICAgaWYgKChrZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgJiYKLSAgICAgICAgR1BCRGF0YVR5cGVJc09iamVjdCh2YWx1ZURhdGFUeXBlKSkgewotICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5ICphdXRvRGljdCA9IHJlc3VsdDsKLSAgICAgIGF1dG9EaWN0LT5fYXV0b2NyZWF0b3IgPSAgYXV0b2NyZWF0b3I7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpncGJEaWN0ID0gcmVzdWx0OwotICAgICAgZ3BiRGljdC0+X2F1dG9jcmVhdG9yID0gYXV0b2NyZWF0b3I7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotI2lmICFkZWZpbmVkKF9fY2xhbmdfYW5hbHl6ZXJfXykKLS8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgYmxvY2tlZCBmcm9tIHRoZSBhbmFseXplciBiZWNhdXNlIHRoZSBhbmFseXplciBzZWVzIHRoZQotLy8gR1BCU2V0UmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwoKSBjYWxsIGFzIGNvbnN1bWluZyB0aGUgYXJyYXkvbWFwLAotLy8gc28gdXNlIG9mIHRoZSBhcnJheS9tYXAgYWZ0ZXIgdGhlIGNhbGwgcmV0dXJucyBpcyBmbGFnZ2VkIGFzIGEgdXNlIGFmdGVyCi0vLyBmcmVlLgotLy8gQnV0IEdQQlNldFJldGFpbmVkT2JqZWN0SXZhcldpdGhGaWVsZEludGVybmFsKCkgaXMgImNvbnN1bWluZyIgdGhlIHJldGFpbgotLy8gY291bnQgYmUgaG9sZGluZyBvbnRvIHRoZSBvYmplY3QgKGl0IGlzIHRyYW5zZmVyaW5nIGl0KSwgdGhlIG9iamVjdCBpcwotLy8gc3RpbGwgdmFsaWQgYWZ0ZXIgcmV0dXJuaW5nIGZyb20gdGhlIGNhbGwuICBUaGUgb3RoZXIgd2F5IHRvIGF2b2lkIHRoaXMKLS8vIHdvdWxkIGJlIHRvIGFkZCBhIC1yZXRhaW4vLWF1dG9yZWxlYXNlLCBidXQgdGhhdCB3b3VsZCBmb3JjZSBldmVyeQotLy8gcmVwZWF0ZWQvbWFwIGZpZWxkIHBhcnNlZCBpbnRvIHRoZSBhdXRvcmVsZWFzZSBwb29sIHdoaWNoIGlzIGJvdGggYSBtZW1vcnkKLS8vIGFuZCBwZXJmb3JtYW5jZSBoaXQuCi0KLXN0YXRpYyBpZCBHZXRPckNyZWF0ZUFycmF5SXZhcldpdGhGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpIHsKLSAgaWQgYXJyYXkgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgaWYgKCFhcnJheSkgewotICAgIC8vIE5vIGxvY2sgbmVlZGVkLCB0aGlzIGlzIGNhbGxlZCBmcm9tIHBsYWNlcyBleHBlY3RpbmcgdG8gbXV0YXRlCi0gICAgLy8gc28gbm8gdGhyZWFkaW5nIHByb3RlY3Rpb24gaXMgbmVlZGVkLgotICAgIGFycmF5ID0gQ3JlYXRlQXJyYXlGb3JGaWVsZChmaWVsZCwgbmlsKTsKLSAgICBHUEJTZXRSZXRhaW5lZE9iamVjdEl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgYXJyYXksIHN5bnRheCk7Ci0gIH0KLSAgcmV0dXJuIGFycmF5OwotfQotCi0vLyBUaGlzIGlzIGxpa2UgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZCgpLCBidXQgZm9yIGFycmF5cywgaXQgc2hvdWxkCi0vLyBvbmx5IGJlIHVzZWQgdG8gd2lyZSB0aGUgbWV0aG9kIGludG8gdGhlIGNsYXNzLgotc3RhdGljIGlkIEdldEFycmF5SXZhcldpdGhGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIGlkIGFycmF5ID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gIGlmICghYXJyYXkpIHsKLSAgICAvLyBDaGVjayBhZ2FpbiBhZnRlciBnZXR0aW5nIHRoZSBsb2NrLgotICAgIEdQQlByZXBhcmVSZWFkT25seVNlbWFwaG9yZShzZWxmKTsKLSAgICBkaXNwYXRjaF9zZW1hcGhvcmVfd2FpdChzZWxmLT5yZWFkT25seVNlbWFwaG9yZV8sIERJU1BBVENIX1RJTUVfRk9SRVZFUik7Ci0gICAgYXJyYXkgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICBpZiAoIWFycmF5KSB7Ci0gICAgICBhcnJheSA9IENyZWF0ZUFycmF5Rm9yRmllbGQoZmllbGQsIHNlbGYpOwotICAgICAgR1BCU2V0QXV0b2NyZWF0ZWRSZXRhaW5lZE9iamVjdEl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGQsIGFycmF5KTsKLSAgICB9Ci0gICAgZGlzcGF0Y2hfc2VtYXBob3JlX3NpZ25hbChzZWxmLT5yZWFkT25seVNlbWFwaG9yZV8pOwotICB9Ci0gIHJldHVybiBhcnJheTsKLX0KLQotc3RhdGljIGlkIEdldE9yQ3JlYXRlTWFwSXZhcldpdGhGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCkgewotICBpZCBkaWN0ID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gIGlmICghZGljdCkgewotICAgIC8vIE5vIGxvY2sgbmVlZGVkLCB0aGlzIGlzIGNhbGxlZCBmcm9tIHBsYWNlcyBleHBlY3RpbmcgdG8gbXV0YXRlCi0gICAgLy8gc28gbm8gdGhyZWFkaW5nIHByb3RlY3Rpb24gaXMgbmVlZGVkLgotICAgIGRpY3QgPSBDcmVhdGVNYXBGb3JGaWVsZChmaWVsZCwgbmlsKTsKLSAgICBHUEJTZXRSZXRhaW5lZE9iamVjdEl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgZGljdCwgc3ludGF4KTsKLSAgfQotICByZXR1cm4gZGljdDsKLX0KLQotLy8gVGhpcyBpcyBsaWtlIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGQoKSwgYnV0IGZvciBtYXBzLCBpdCBzaG91bGQKLS8vIG9ubHkgYmUgdXNlZCB0byB3aXJlIHRoZSBtZXRob2QgaW50byB0aGUgY2xhc3MuCi1zdGF0aWMgaWQgR2V0TWFwSXZhcldpdGhGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIGlkIGRpY3QgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgaWYgKCFkaWN0KSB7Ci0gICAgLy8gQ2hlY2sgYWdhaW4gYWZ0ZXIgZ2V0dGluZyB0aGUgbG9jay4KLSAgICBHUEJQcmVwYXJlUmVhZE9ubHlTZW1hcGhvcmUoc2VsZik7Ci0gICAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoc2VsZi0+cmVhZE9ubHlTZW1hcGhvcmVfLCBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOwotICAgIGRpY3QgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICBpZiAoIWRpY3QpIHsKLSAgICAgIGRpY3QgPSBDcmVhdGVNYXBGb3JGaWVsZChmaWVsZCwgc2VsZik7Ci0gICAgICBHUEJTZXRBdXRvY3JlYXRlZFJldGFpbmVkT2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgZGljdCk7Ci0gICAgfQotICAgIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwoc2VsZi0+cmVhZE9ubHlTZW1hcGhvcmVfKTsKLSAgfQotICByZXR1cm4gZGljdDsKLX0KLQotI2VuZGlmICAvLyAhZGVmaW5lZChfX2NsYW5nX2FuYWx5emVyX18pCi0KLUdQQk1lc3NhZ2UgKkdQQkNyZWF0ZU1lc3NhZ2VXaXRoQXV0b2NyZWF0b3IoQ2xhc3MgbXNnQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmF1dG9jcmVhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIEdQQk1lc3NhZ2UgKm1lc3NhZ2UgPSBbW21zZ0NsYXNzIGFsbG9jXSBpbml0XTsKLSAgbWVzc2FnZS0+YXV0b2NyZWF0b3JfID0gYXV0b2NyZWF0b3I7Ci0gIG1lc3NhZ2UtPmF1dG9jcmVhdG9yRmllbGRfID0gW2ZpZWxkIHJldGFpbl07Ci0gIHJldHVybiBtZXNzYWdlOwotfQotCi1zdGF0aWMgR1BCTWVzc2FnZSAqQ3JlYXRlTWVzc2FnZVdpdGhBdXRvY3JlYXRvckZvckV4dGVuc2lvbigKLSAgICBDbGFzcyBtc2dDbGFzcywgR1BCTWVzc2FnZSAqYXV0b2NyZWF0b3IsIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dGVuc2lvbikKLSAgICBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSk7Ci0KLXN0YXRpYyBHUEJNZXNzYWdlICpDcmVhdGVNZXNzYWdlV2l0aEF1dG9jcmVhdG9yRm9yRXh0ZW5zaW9uKAotICAgIENsYXNzIG1zZ0NsYXNzLCBHUEJNZXNzYWdlICphdXRvY3JlYXRvciwKLSAgICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24pIHsKLSAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9IFtbbXNnQ2xhc3MgYWxsb2NdIGluaXRdOwotICBtZXNzYWdlLT5hdXRvY3JlYXRvcl8gPSBhdXRvY3JlYXRvcjsKLSAgbWVzc2FnZS0+YXV0b2NyZWF0b3JFeHRlbnNpb25fID0gW2V4dGVuc2lvbiByZXRhaW5dOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotQk9PTCBHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeShHUEJNZXNzYWdlICptZXNzYWdlLCBHUEJNZXNzYWdlICpwYXJlbnQpIHsKLSAgcmV0dXJuIChtZXNzYWdlLT5hdXRvY3JlYXRvcl8gPT0gcGFyZW50KTsKLX0KLQotdm9pZCBHUEJCZWNvbWVWaXNpYmxlVG9BdXRvY3JlYXRvcihHUEJNZXNzYWdlICpzZWxmKSB7Ci0gIC8vIE1lc3NhZ2Ugb2JqZWN0cyB0aGF0IGFyZSBpbXBsaWNpdGx5IGNyZWF0ZWQgYnkgYWNjZXNzaW5nIGEgbWVzc2FnZSBmaWVsZAotICAvLyBhcmUgaW5pdGlhbGx5IG5vdCB2aXNpYmxlIHZpYSB0aGUgaGFzWCBzZWxlY3Rvci4gVGhpcyBtZXRob2QgbWFrZXMgdGhlbQotICAvLyB2aXNpYmxlLgotICBpZiAoc2VsZi0+YXV0b2NyZWF0b3JfKSB7Ci0gICAgLy8gVGhpcyB3aWxsIHJlY3Vyc2l2ZWx5IG1ha2UgYWxsIHBhcmVudCBtZXNzYWdlcyB2aXNpYmxlIHVudGlsIGl0IHJlYWNoZXMgYQotICAgIC8vIHN1cGVyLWNyZWF0b3IgdGhhdCdzIHZpc2libGUuCi0gICAgaWYgKHNlbGYtPmF1dG9jcmVhdG9yRmllbGRfKSB7Ci0gICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCA9IFtzZWxmLT5hdXRvY3JlYXRvcl8gZGVzY3JpcHRvcl0uZmlsZS5zeW50YXg7Ci0gICAgICBHUEJTZXRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZi0+YXV0b2NyZWF0b3JfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPmF1dG9jcmVhdG9yRmllbGRfLCBzZWxmLCBzeW50YXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBbc2VsZi0+YXV0b2NyZWF0b3JfIHNldEV4dGVuc2lvbjpzZWxmLT5hdXRvY3JlYXRvckV4dGVuc2lvbl8gdmFsdWU6c2VsZl07Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKEdQQk1lc3NhZ2UgKnNlbGYsIGlkIGFycmF5KSB7Ci0gIC8vIFdoZW4gb25lIG9mIG91ciBhdXRvY3JlYXRlZCBhcnJheXMgYWRkcyBlbGVtZW50cywgbWFrZSBpdCB2aXNpYmxlLgotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW1tzZWxmIGNsYXNzXSBkZXNjcmlwdG9yXTsKLSAgZm9yIChHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkIGluIGRlc2NyaXB0b3ItPmZpZWxkc18pIHsKLSAgICBpZiAoZmllbGQuZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICBpZCBjdXJBcnJheSA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgaWYgKGN1ckFycmF5ID09IGFycmF5KSB7Ci0gICAgICAgIGlmIChHUEJGaWVsZERhdGFUeXBlSXNPYmplY3QoZmllbGQpKSB7Ci0gICAgICAgICAgR1BCQXV0b2NyZWF0ZWRBcnJheSAqYXV0b0FycmF5ID0gYXJyYXk7Ci0gICAgICAgICAgYXV0b0FycmF5LT5fYXV0b2NyZWF0b3IgPSBuaWw7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgR1BCSW50MzJBcnJheSAqZ3BiQXJyYXkgPSBhcnJheTsKLSAgICAgICAgICBncGJBcnJheS0+X2F1dG9jcmVhdG9yID0gbmlsOwotICAgICAgICB9Ci0gICAgICAgIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKHNlbGYpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIE5TQ0Fzc2VydChOTywgQCJVbmtub3duIGF1dG9jcmVhdGVkICVAIGZvciAlQC4iLCBbYXJyYXkgY2xhc3NdLCBzZWxmKTsKLX0KLQotdm9pZCBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnlNb2RpZmllZChHUEJNZXNzYWdlICpzZWxmLCBpZCBkaWN0aW9uYXJ5KSB7Ci0gIC8vIFdoZW4gb25lIG9mIG91ciBhdXRvY3JlYXRlZCBkaWN0cyBhZGRzIGVsZW1lbnRzLCBtYWtlIGl0IHZpc2libGUuCi0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbW3NlbGYgY2xhc3NdIGRlc2NyaXB0b3JdOwotICBmb3IgKEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQgaW4gZGVzY3JpcHRvci0+ZmllbGRzXykgewotICAgIGlmIChmaWVsZC5maWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwKSB7Ci0gICAgICBpZCBjdXJEaWN0ID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICBpZiAoY3VyRGljdCA9PSBkaWN0aW9uYXJ5KSB7Ci0gICAgICAgIGlmICgoZmllbGQubWFwS2V5RGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTdHJpbmcpICYmCi0gICAgICAgICAgICBHUEJGaWVsZERhdGFUeXBlSXNPYmplY3QoZmllbGQpKSB7Ci0gICAgICAgICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5ICphdXRvRGljdCA9IGRpY3Rpb25hcnk7Ci0gICAgICAgICAgYXV0b0RpY3QtPl9hdXRvY3JlYXRvciA9IG5pbDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZ3BiRGljdCA9IGRpY3Rpb25hcnk7Ci0gICAgICAgICAgZ3BiRGljdC0+X2F1dG9jcmVhdG9yID0gbmlsOwotICAgICAgICB9Ci0gICAgICAgIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKHNlbGYpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIE5TQ0Fzc2VydChOTywgQCJVbmtub3duIGF1dG9jcmVhdGVkICVAIGZvciAlQC4iLCBbZGljdGlvbmFyeSBjbGFzc10sIHNlbGYpOwotfQotCi12b2lkIEdQQkNsZWFyTWVzc2FnZUF1dG9jcmVhdG9yKEdQQk1lc3NhZ2UgKnNlbGYpIHsKLSAgaWYgKChzZWxmID09IG5pbCkgfHwgIXNlbGYtPmF1dG9jcmVhdG9yXykgewotICAgIHJldHVybjsKLSAgfQotCi0jaWYgREVCVUcgJiYgIWRlZmluZWQoTlNfQkxPQ0tfQVNTRVJUSU9OUykKLSAgLy8gRWl0aGVyIHRoZSBhdXRvY3JlYXRvciBtdXN0IGhhdmUgaXRzICJoYXMiIGZsYWcgc2V0IHRvIFlFUywgb3IgaXQgbXVzdCBiZQotICAvLyBOTyBhbmQgbm90IGVxdWFsIHRvIG91cnNlbHZlcy4KLSAgQk9PTCBhdXRvY3JlYXRvckhhcyA9Ci0gICAgICAoc2VsZi0+YXV0b2NyZWF0b3JGaWVsZF8KLSAgICAgICAgICAgPyBHUEJHZXRIYXNJdmFyRmllbGQoc2VsZi0+YXV0b2NyZWF0b3JfLCBzZWxmLT5hdXRvY3JlYXRvckZpZWxkXykKLSAgICAgICAgICAgOiBbc2VsZi0+YXV0b2NyZWF0b3JfIGhhc0V4dGVuc2lvbjpzZWxmLT5hdXRvY3JlYXRvckV4dGVuc2lvbl9dKTsKLSAgR1BCTWVzc2FnZSAqYXV0b2NyZWF0b3JGaWVsZFZhbHVlID0KLSAgICAgIChzZWxmLT5hdXRvY3JlYXRvckZpZWxkXwotICAgICAgICAgICA/IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZi0+YXV0b2NyZWF0b3JfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+YXV0b2NyZWF0b3JGaWVsZF8pCi0gICAgICAgICAgIDogW3NlbGYtPmF1dG9jcmVhdG9yXy0+YXV0b2NyZWF0ZWRFeHRlbnNpb25NYXBfCi0gICAgICAgICAgICAgICAgIG9iamVjdEZvcktleTpzZWxmLT5hdXRvY3JlYXRvckV4dGVuc2lvbl9dKTsKLSAgTlNDQXNzZXJ0KGF1dG9jcmVhdG9ySGFzIHx8IGF1dG9jcmVhdG9yRmllbGRWYWx1ZSAhPSBzZWxmLAotICAgICAgICAgICAgQCJDYW5ub3QgY2xlYXIgYXV0b2NyZWF0b3IgYmVjYXVzZSBpdCBzdGlsbCByZWZlcnMgdG8gc2VsZiwgc2VsZjogJUAuIiwKLSAgICAgICAgICAgIHNlbGYpOwotCi0jZW5kaWYgIC8vIERFQlVHICYmICFkZWZpbmVkKE5TX0JMT0NLX0FTU0VSVElPTlMpCi0KLSAgc2VsZi0+YXV0b2NyZWF0b3JfID0gbmlsOwotICBbc2VsZi0+YXV0b2NyZWF0b3JGaWVsZF8gcmVsZWFzZV07Ci0gIHNlbGYtPmF1dG9jcmVhdG9yRmllbGRfID0gbmlsOwotICBbc2VsZi0+YXV0b2NyZWF0b3JFeHRlbnNpb25fIHJlbGVhc2VdOwotICBzZWxmLT5hdXRvY3JlYXRvckV4dGVuc2lvbl8gPSBuaWw7Ci19Ci0KLXN0YXRpYyBHUEJVbmtub3duRmllbGRTZXQgKkdldE9yTWFrZVVua25vd25GaWVsZHMoR1BCTWVzc2FnZSAqc2VsZikgewotICBpZiAoIXNlbGYtPnVua25vd25GaWVsZHNfKSB7Ci0gICAgc2VsZi0+dW5rbm93bkZpZWxkc18gPSBbW0dQQlVua25vd25GaWVsZFNldCBhbGxvY10gaW5pdF07Ci0gICAgR1BCQmVjb21lVmlzaWJsZVRvQXV0b2NyZWF0b3Ioc2VsZik7Ci0gIH0KLSAgcmV0dXJuIHNlbGYtPnVua25vd25GaWVsZHNfOwotfQotCi1AaW1wbGVtZW50YXRpb24gR1BCTWVzc2FnZQotCi0rICh2b2lkKWluaXRpYWxpemUgewotICBDbGFzcyBwYk1lc3NhZ2VDbGFzcyA9IFtHUEJNZXNzYWdlIGNsYXNzXTsKLSAgaWYgKFtzZWxmIGNsYXNzXSA9PSBwYk1lc3NhZ2VDbGFzcykgewotICAgIC8vIFRoaXMgaXMgaGVyZSB0byBzdGFydCB1cCB0aGUgImJhc2UiIGNsYXNzIGRlc2NyaXB0b3IuCi0gICAgW3NlbGYgZGVzY3JpcHRvcl07Ci0gICAgLy8gTWVzc2FnZSBzaGFyZXMgZXh0ZW5zaW9uIG1ldGhvZCByZXNvbHZpbmcgd2l0aCBHUEJSb290T2JqZWN0IHNvIGluc3VyZQotICAgIC8vIGl0IGlzIHN0YXJ0ZWQgdXAgYXQgdGhlIHNhbWUgdGltZS4KLSAgICAodm9pZClbR1BCUm9vdE9iamVjdCBjbGFzc107Ci0gIH0gZWxzZSBpZiAoW3NlbGYgc3VwZXJjbGFzc10gPT0gcGJNZXNzYWdlQ2xhc3MpIHsKLSAgICAvLyBUaGlzIGlzIGhlcmUgdG8gc3RhcnQgdXAgYWxsIHRoZSAibWVzc2FnZSIgc3ViY2xhc3Nlcy4gSnVzdCBuZWVkcyB0byBiZQotICAgIC8vIGRvbmUgZm9yIHRoZSBtZXNzYWdlcywgbm90IGFueSBvZiB0aGUgc3ViY2xhc3Nlcy4KLSAgICAvLyBUaGlzIG11c3QgYmUgZG9uZSBpbiBpbml0aWFsaXplIHRvIGVuZm9yY2UgdGhyZWFkIHNhZmV0eSBvZiBzdGFydCB1cCBvZgotICAgIC8vIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeS4KLSAgICAvLyBOb3RlOiBUaGUgZ2VuZXJhdGVkIGNvZGUgZm9yIC1kZXNjcmlwdG9yIGNhbGxzCi0gICAgLy8gK1tHUEJEZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvckNsYXNzOi4uLl0sIHBhc3NpbmcgdGhlIEdQQlJvb3RPYmplY3QKLSAgICAvLyBzdWJjbGFzcyBmb3IgdGhlIGZpbGUuICBUaGF0IGNhbGwgY2hhaW4gaXMgd2hhdCBlbnN1cmVzIHRoYXQgKlJvb3QgY2xhc3MKLSAgICAvLyBpcyBzdGFydGVkIHVwIHRvIHN1cHBvcnQgZXh0ZW5zaW9uIHJlc29sdXRpb24gb2ZmIHRoZSBtZXNzYWdlIGNsYXNzCi0gICAgLy8gKCtyZXNvbHZlQ2xhc3NNZXRob2Q6IGJlbG93KSBpbiBhIHRocmVhZCBzYWZlIG1hbm5lci4KLSAgICBbc2VsZiBkZXNjcmlwdG9yXTsKLSAgfQotfQotCi0rIChpbnN0YW5jZXR5cGUpYWxsb2NXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIC8vIE92ZXJyaWRlIGFsbG9jIHRvIGFsbG9jYXRlIG91ciBjbGFzc2VzIHdpdGggdGhlIGFkZGl0aW9uYWwgc3RvcmFnZQotICAvLyByZXF1aXJlZCBmb3IgdGhlIGluc3RhbmNlIHZhcmlhYmxlcy4KLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtzZWxmIGRlc2NyaXB0b3JdOwotICByZXR1cm4gTlNBbGxvY2F0ZU9iamVjdChzZWxmLCBkZXNjcmlwdG9yLT5zdG9yYWdlU2l6ZV8sIHpvbmUpOwotfQotCi0rIChpbnN0YW5jZXR5cGUpYWxsb2MgewotICByZXR1cm4gW3NlbGYgYWxsb2NXaXRoWm9uZTpuaWxdOwotfQotCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7Ci0gIC8vIFRoaXMgaXMgdGhyZWFkIHNhZmUgYmVjYXVzZSBpdCBpcyBjYWxsZWQgZnJvbSAraW5pdGlhbGl6ZS4KLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBOVUxMOwotICBzdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKmZpbGVEZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgLy8gVXNlIGEgZHVtbXkgZmlsZSB0aGF0IG1hcmtzIGl0IGFzIHByb3RvMiBzeW50YXggc28gd2hlbiB1c2VkIGdlbmVyaWNhbGx5Ci0gICAgLy8gaXQgc3VwcG9ydHMgdW5rbm93bnMvZXRjLgotICAgIGZpbGVEZXNjcmlwdG9yID0KLSAgICAgICAgW1tHUEJGaWxlRGVzY3JpcHRvciBhbGxvY10gaW5pdFdpdGhQYWNrYWdlOkAiaW50ZXJuYWwiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDpHUEJGaWxlU3ludGF4UHJvdG8yXTsKLQotICAgIGRlc2NyaXB0b3IgPSBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCTWVzc2FnZSBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6TmlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOmZpbGVEZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTowCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi0rIChpbnN0YW5jZXR5cGUpbWVzc2FnZSB7Ci0gIHJldHVybiBbW1tzZWxmIGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0IHsKLSAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgewotICAgIG1lc3NhZ2VTdG9yYWdlXyA9IChHUEJNZXNzYWdlX1N0b3JhZ2VQdHIpKAotICAgICAgICAoKHVpbnQ4X3QgKilzZWxmKSArIGNsYXNzX2dldEluc3RhbmNlU2l6ZShbc2VsZiBjbGFzc10pKTsKLSAgfQotCi0gIHJldHVybiBzZWxmOwotfQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEYXRhOihOU0RhdGEgKilkYXRhIGVycm9yOihOU0Vycm9yICoqKWVycm9yUHRyIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoRGF0YTpkYXRhIGV4dGVuc2lvblJlZ2lzdHJ5Om5pbCBlcnJvcjplcnJvclB0cl07Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERhdGE6KE5TRGF0YSAqKWRhdGEKLSAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6KEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3JQdHIgewotICBpZiAoKHNlbGYgPSBbc2VsZiBpbml0XSkpIHsKLSAgICBAdHJ5IHsKLSAgICAgIFtzZWxmIG1lcmdlRnJvbURhdGE6ZGF0YSBleHRlbnNpb25SZWdpc3RyeTpleHRlbnNpb25SZWdpc3RyeV07Ci0gICAgICBpZiAoZXJyb3JQdHIpIHsKLSAgICAgICAgKmVycm9yUHRyID0gbmlsOwotICAgICAgfQotICAgIH0KLSAgICBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKLSAgICAgIFtzZWxmIHJlbGVhc2VdOwotICAgICAgc2VsZiA9IG5pbDsKLSAgICAgIGlmIChlcnJvclB0cikgewotICAgICAgICAqZXJyb3JQdHIgPSBNZXNzYWdlRXJyb3JXaXRoUmVhc29uKEdQQk1lc3NhZ2VFcnJvckNvZGVNYWxmb3JtZWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4Y2VwdGlvbi5yZWFzb24pOwotICAgICAgfQotICAgIH0KLSNpZmRlZiBERUJVRwotICAgIGlmIChzZWxmICYmICFzZWxmLmluaXRpYWxpemVkKSB7Ci0gICAgICBbc2VsZiByZWxlYXNlXTsKLSAgICAgIHNlbGYgPSBuaWw7Ci0gICAgICBpZiAoZXJyb3JQdHIpIHsKLSAgICAgICAgKmVycm9yUHRyID0gTWVzc2FnZUVycm9yKEdQQk1lc3NhZ2VFcnJvckNvZGVNaXNzaW5nUmVxdWlyZWRGaWVsZCwgbmlsKTsKLSAgICAgIH0KLSAgICB9Ci0jZW5kaWYKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoQ29kZWRJbnB1dFN0cmVhbTooR1BCQ29kZWRJbnB1dFN0cmVhbSAqKWlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OgotICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3JQdHIgewotICBpZiAoKHNlbGYgPSBbc2VsZiBpbml0XSkpIHsKLSAgICBAdHJ5IHsKLSAgICAgIFtzZWxmIG1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06aW5wdXQgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnldOwotICAgICAgaWYgKGVycm9yUHRyKSB7Ci0gICAgICAgICplcnJvclB0ciA9IG5pbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgQGNhdGNoIChOU0V4Y2VwdGlvbiAqZXhjZXB0aW9uKSB7Ci0gICAgICBbc2VsZiByZWxlYXNlXTsKLSAgICAgIHNlbGYgPSBuaWw7Ci0gICAgICBpZiAoZXJyb3JQdHIpIHsKLSAgICAgICAgKmVycm9yUHRyID0gTWVzc2FnZUVycm9yV2l0aFJlYXNvbihHUEJNZXNzYWdlRXJyb3JDb2RlTWFsZm9ybWVkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGNlcHRpb24ucmVhc29uKTsKLSAgICAgIH0KLSAgICB9Ci0jaWZkZWYgREVCVUcKLSAgICBpZiAoc2VsZiAmJiAhc2VsZi5pbml0aWFsaXplZCkgewotICAgICAgW3NlbGYgcmVsZWFzZV07Ci0gICAgICBzZWxmID0gbmlsOwotICAgICAgaWYgKGVycm9yUHRyKSB7Ci0gICAgICAgICplcnJvclB0ciA9IE1lc3NhZ2VFcnJvcihHUEJNZXNzYWdlRXJyb3JDb2RlTWlzc2luZ1JlcXVpcmVkRmllbGQsIG5pbCk7Ci0gICAgICB9Ci0gICAgfQotI2VuZGlmCi0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIFtzZWxmIGludGVybmFsQ2xlYXI6Tk9dOwotICBOU0NBc3NlcnQoIWF1dG9jcmVhdG9yXywgQCJBdXRvY3JlYXRvciB3YXMgbm90IGNsZWFyZWQgYmVmb3JlIGRlYWxsb2MuIik7Ci0gIGlmIChyZWFkT25seVNlbWFwaG9yZV8pIHsKLSAgICBkaXNwYXRjaF9yZWxlYXNlKHJlYWRPbmx5U2VtYXBob3JlXyk7Ci0gIH0KLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tICh2b2lkKWNvcHlGaWVsZHNJbnRvOihHUEJNZXNzYWdlICopbWVzc2FnZQotICAgICAgICAgICAgICAgICAgem9uZTooTlNab25lICopem9uZQotICAgICAgICAgICAgZGVzY3JpcHRvcjooR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICAvLyBDb3B5IGFsbCB0aGUgc3RvcmFnZS4uLgotICBtZW1jcHkobWVzc2FnZS0+bWVzc2FnZVN0b3JhZ2VfLCBtZXNzYWdlU3RvcmFnZV8sIGRlc2NyaXB0b3ItPnN0b3JhZ2VTaXplXyk7Ci0KLSAgR1BCRmlsZVN5bnRheCBzeW50YXggPSBkZXNjcmlwdG9yLmZpbGUuc3ludGF4OwotCi0gIC8vIExvb3Agb3ZlciB0aGUgZmllbGRzIGRvaW5nIGZpeHVwLi4uCi0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKSB7Ci0gICAgaWYgKEdQQkZpZWxkSXNNYXBPckFycmF5KGZpZWxkKSkgewotICAgICAgaWQgdmFsdWUgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgIGlmICh2YWx1ZSkgewotICAgICAgICAvLyBXZSBuZWVkIHRvIGNvcHkgdGhlIGFycmF5L21hcCwgYnV0IHRoZSBjYXRjaCBpcyBmb3IgbWVzc2FnZSBmaWVsZHMsCi0gICAgICAgIC8vIHdlIGFsc28gbmVlZCB0byBlbnN1cmUgYWxsIHRoZSBtZXNzYWdlcyBhcyB0aG9zZSBuZWVkIGNvcHlpbmcgYWxzby4KLSAgICAgICAgaWQgbmV3VmFsdWU7Ci0gICAgICAgIGlmIChHUEJGaWVsZERhdGFUeXBlSXNNZXNzYWdlKGZpZWxkKSkgewotICAgICAgICAgIGlmIChmaWVsZC5maWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgICAgIE5TQXJyYXkgKmV4aXN0aW5nQXJyYXkgPSAoTlNBcnJheSAqKXZhbHVlOwotICAgICAgICAgICAgTlNNdXRhYmxlQXJyYXkgKm5ld0FycmF5ID0KLSAgICAgICAgICAgICAgICBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmV4aXN0aW5nQXJyYXkuY291bnRdOwotICAgICAgICAgICAgbmV3VmFsdWUgPSBuZXdBcnJheTsKLSAgICAgICAgICAgIGZvciAoR1BCTWVzc2FnZSAqbXNnIGluIGV4aXN0aW5nQXJyYXkpIHsKLSAgICAgICAgICAgICAgR1BCTWVzc2FnZSAqY29waWVkTXNnID0gW21zZyBjb3B5V2l0aFpvbmU6em9uZV07Ci0gICAgICAgICAgICAgIFtuZXdBcnJheSBhZGRPYmplY3Q6Y29waWVkTXNnXTsKLSAgICAgICAgICAgICAgW2NvcGllZE1zZyByZWxlYXNlXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGZpZWxkLm1hcEtleURhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nKSB7Ci0gICAgICAgICAgICAgIC8vIE1hcCBpcyBhbiBOU0RpY3Rpb25hcnkuCi0gICAgICAgICAgICAgIE5TRGljdGlvbmFyeSAqZXhpc3RpbmdEaWN0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgIE5TTXV0YWJsZURpY3Rpb25hcnkgKm5ld0RpY3QgPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdCi0gICAgICAgICAgICAgICAgICBpbml0V2l0aENhcGFjaXR5OmV4aXN0aW5nRGljdC5jb3VudF07Ci0gICAgICAgICAgICAgIG5ld1ZhbHVlID0gbmV3RGljdDsKLSAgICAgICAgICAgICAgW2V4aXN0aW5nRGljdCBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihOU1N0cmluZyAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKm1zZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmNvcGllZE1zZyA9IFttc2cgY29weVdpdGhab25lOnpvbmVdOwotICAgICAgICAgICAgICAgIFtuZXdEaWN0IHNldE9iamVjdDpjb3BpZWRNc2cgZm9yS2V5OmtleV07Ci0gICAgICAgICAgICAgICAgW2NvcGllZE1zZyByZWxlYXNlXTsKLSAgICAgICAgICAgICAgfV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAvLyBJcyBvbmUgb2YgdGhlIEdQQipPYmplY3REaWN0aW9uYXJ5IGNsYXNzZXMuICBUeXBlIGRvZXNuJ3QKLSAgICAgICAgICAgICAgLy8gbWF0dGVyLCBqdXN0IG5lZWQgb25lIHRvIGludm9rZSB0aGUgc2VsZWN0b3IuCi0gICAgICAgICAgICAgIEdQQkludDMyT2JqZWN0RGljdGlvbmFyeSAqZXhpc3RpbmdEaWN0ID0gdmFsdWU7Ci0gICAgICAgICAgICAgIG5ld1ZhbHVlID0gW2V4aXN0aW5nRGljdCBkZWVwQ29weVdpdGhab25lOnpvbmVdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBOb3QgbWVzc2FnZXMgKGJ1dCBpcyBhIG1hcC9hcnJheSkuLi4KLSAgICAgICAgICBpZiAoZmllbGQuZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICAgICAgICBpZiAoR1BCRmllbGREYXRhVHlwZUlzT2JqZWN0KGZpZWxkKSkgewotICAgICAgICAgICAgICAvLyBOU0FycmF5Ci0gICAgICAgICAgICAgIG5ld1ZhbHVlID0gW3ZhbHVlIG11dGFibGVDb3B5V2l0aFpvbmU6em9uZV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAvLyBHUEIqQXJyYXkKLSAgICAgICAgICAgICAgbmV3VmFsdWUgPSBbdmFsdWUgY29weVdpdGhab25lOnpvbmVdOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBpZiAoZmllbGQubWFwS2V5RGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTdHJpbmcpIHsKLSAgICAgICAgICAgICAgLy8gTlNEaWN0aW9uYXJ5Ci0gICAgICAgICAgICAgIG5ld1ZhbHVlID0gW3ZhbHVlIG11dGFibGVDb3B5V2l0aFpvbmU6em9uZV07Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAvLyBJcyBvbmUgb2YgdGhlIEdQQipEaWN0aW9uYXJ5IGNsYXNzZXMuICBUeXBlIGRvZXNuJ3QgbWF0dGVyLAotICAgICAgICAgICAgICAvLyBqdXN0IG5lZWQgb25lIHRvIGludm9rZSB0aGUgc2VsZWN0b3IuCi0gICAgICAgICAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpleGlzdGluZ0RpY3QgPSB2YWx1ZTsKLSAgICAgICAgICAgICAgbmV3VmFsdWUgPSBbZXhpc3RpbmdEaWN0IGNvcHlXaXRoWm9uZTp6b25lXTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLy8gV2UgcmV0YWluIGhlcmUgYmVjYXVzZSB0aGUgbWVtY3B5IHBpY2tlZCB1cCB0aGUgcG9pbnRlciB2YWx1ZSBhbmQKLSAgICAgICAgLy8gdGhlIG5leHQgY2FsbCB0byBTZXRSZXRhaW5lZE9iamVjdC4uLiB3aWxsIHJlbGVhc2UgdGhlIGN1cnJlbnQgdmFsdWUuCi0gICAgICAgIFt2YWx1ZSByZXRhaW5dOwotICAgICAgICBHUEJTZXRSZXRhaW5lZE9iamVjdEl2YXJXaXRoRmllbGRJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgbmV3VmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChHUEJGaWVsZERhdGFUeXBlSXNNZXNzYWdlKGZpZWxkKSkgewotICAgICAgLy8gRm9yIG9iamVjdCB0eXBlcywgaWYgd2UgaGF2ZSBhIHZhbHVlLCBjb3B5IGl0LiAgSWYgd2UgZG9uJ3QsCi0gICAgICAvLyB6ZXJvIGl0IHRvIHJlbW92ZSB0aGUgcG9pbnRlciB0byBzb21ldGhpbmcgdGhhdCB3YXMgYXV0b2NyZWF0ZWQKLSAgICAgIC8vIChhbmQgdGhlIHB0ciBqdXN0IGdvdCBtZW1jcHllZCkuCi0gICAgICBpZiAoR1BCR2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkKSkgewotICAgICAgICBHUEJNZXNzYWdlICp2YWx1ZSA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBHUEJNZXNzYWdlICpuZXdWYWx1ZSA9IFt2YWx1ZSBjb3B5V2l0aFpvbmU6em9uZV07Ci0gICAgICAgIC8vIFdlIHJldGFpbiBoZXJlIGJlY2F1c2UgdGhlIG1lbWNweSBwaWNrZWQgdXAgdGhlIHBvaW50ZXIgdmFsdWUgYW5kCi0gICAgICAgIC8vIHRoZSBuZXh0IGNhbGwgdG8gU2V0UmV0YWluZWRPYmplY3QuLi4gd2lsbCByZWxlYXNlIHRoZSBjdXJyZW50IHZhbHVlLgotICAgICAgICBbdmFsdWUgcmV0YWluXTsKLSAgICAgICAgR1BCU2V0UmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIG5ld1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopbWVzc2FnZS0+bWVzc2FnZVN0b3JhZ2VfOwotICAgICAgICBpZCAqdHlwZVB0ciA9IChpZCAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gICAgICAgICp0eXBlUHRyID0gTlVMTDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKEdQQkZpZWxkRGF0YVR5cGVJc09iamVjdChmaWVsZCkgJiYKLSAgICAgICAgICAgICAgIEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICAgIC8vIEEgc2V0IHN0cmluZy9kYXRhIHZhbHVlIChtZXNzYWdlIHBpY2tlZCBvZmYgYWJvdmUpLCBjb3B5IGl0LgotICAgICAgaWQgdmFsdWUgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgIGlkIG5ld1ZhbHVlID0gW3ZhbHVlIGNvcHlXaXRoWm9uZTp6b25lXTsKLSAgICAgIC8vIFdlIHJldGFpbiBoZXJlIGJlY2F1c2UgdGhlIG1lbWNweSBwaWNrZWQgdXAgdGhlIHBvaW50ZXIgdmFsdWUgYW5kCi0gICAgICAvLyB0aGUgbmV4dCBjYWxsIHRvIFNldFJldGFpbmVkT2JqZWN0Li4uIHdpbGwgcmVsZWFzZSB0aGUgY3VycmVudCB2YWx1ZS4KLSAgICAgIFt2YWx1ZSByZXRhaW5dOwotICAgICAgR1BCU2V0UmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIG5ld1ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4KTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gbWVtY3B5IHRvb2sgY2FyZSBvZiB0aGUgcmVzdCBvZiB0aGUgcHJpbWl0aXZlIGZpZWxkcyBpZiB0aGV5IHdlcmUgc2V0LgotICAgIH0KLSAgfSAgLy8gZm9yIChmaWVsZCBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKQotfQotCi0tIChpZCljb3B5V2l0aFpvbmU6KE5TWm9uZSAqKXpvbmUgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW3NlbGYgZGVzY3JpcHRvcl07Ci0gIEdQQk1lc3NhZ2UgKnJlc3VsdCA9IFtbZGVzY3JpcHRvci5tZXNzYWdlQ2xhc3MgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0XTsKLQotICBbc2VsZiBjb3B5RmllbGRzSW50bzpyZXN1bHQgem9uZTp6b25lIGRlc2NyaXB0b3I6ZGVzY3JpcHRvcl07Ci0gIC8vIE1ha2UgaW1tdXRhYmxlIGNvcGllcyBvZiB0aGUgZXh0cmEgYml0cy4KLSAgcmVzdWx0LT51bmtub3duRmllbGRzXyA9IFt1bmtub3duRmllbGRzXyBjb3B5V2l0aFpvbmU6em9uZV07Ci0gIHJlc3VsdC0+ZXh0ZW5zaW9uTWFwXyA9IENsb25lRXh0ZW5zaW9uTWFwKGV4dGVuc2lvbk1hcF8sIHpvbmUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKWNsZWFyIHsKLSAgW3NlbGYgaW50ZXJuYWxDbGVhcjpZRVNdOwotfQotCi0tICh2b2lkKWludGVybmFsQ2xlYXI6KEJPT0wpemVyb1N0b3JhZ2UgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW3NlbGYgZGVzY3JpcHRvcl07Ci0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKSB7Ci0gICAgaWYgKEdQQkZpZWxkSXNNYXBPckFycmF5KGZpZWxkKSkgewotICAgICAgaWQgYXJyYXlPck1hcCA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgaWYgKGFycmF5T3JNYXApIHsKLSAgICAgICAgaWYgKGZpZWxkLmZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICAgIGlmIChHUEJGaWVsZERhdGFUeXBlSXNPYmplY3QoZmllbGQpKSB7Ci0gICAgICAgICAgICBHUEJBdXRvY3JlYXRlZEFycmF5ICphdXRvQXJyYXkgPSBhcnJheU9yTWFwOwotICAgICAgICAgICAgaWYgKGF1dG9BcnJheS0+X2F1dG9jcmVhdG9yID09IHNlbGYpIHsKLSAgICAgICAgICAgICAgYXV0b0FycmF5LT5fYXV0b2NyZWF0b3IgPSBuaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFR5cGUgZG9lc24ndCBtYXR0ZXIsIGl0IGlzIGEgR1BCKkFycmF5LgotICAgICAgICAgICAgR1BCSW50MzJBcnJheSAqZ3BiQXJyYXkgPSBhcnJheU9yTWFwOwotICAgICAgICAgICAgaWYgKGdwYkFycmF5LT5fYXV0b2NyZWF0b3IgPT0gc2VsZikgewotICAgICAgICAgICAgICBncGJBcnJheS0+X2F1dG9jcmVhdG9yID0gbmlsOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoKGZpZWxkLm1hcEtleURhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nKSAmJgotICAgICAgICAgICAgICBHUEJGaWVsZERhdGFUeXBlSXNPYmplY3QoZmllbGQpKSB7Ci0gICAgICAgICAgICBHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnkgKmF1dG9EaWN0ID0gYXJyYXlPck1hcDsKLSAgICAgICAgICAgIGlmIChhdXRvRGljdC0+X2F1dG9jcmVhdG9yID09IHNlbGYpIHsKLSAgICAgICAgICAgICAgYXV0b0RpY3QtPl9hdXRvY3JlYXRvciA9IG5pbDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVHlwZSBkb2Vzbid0IG1hdHRlciwgaXQgaXMgYSBHUEIqRGljdGlvbmFyeS4KLSAgICAgICAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpncGJEaWN0ID0gYXJyYXlPck1hcDsKLSAgICAgICAgICAgIGlmIChncGJEaWN0LT5fYXV0b2NyZWF0b3IgPT0gc2VsZikgewotICAgICAgICAgICAgICBncGJEaWN0LT5fYXV0b2NyZWF0b3IgPSBuaWw7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIFthcnJheU9yTWFwIHJlbGVhc2VdOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoR1BCRmllbGREYXRhVHlwZUlzTWVzc2FnZShmaWVsZCkpIHsKLSAgICAgIEdQQkNsZWFyQXV0b2NyZWF0ZWRNZXNzYWdlSXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCk7Ci0gICAgICBHUEJNZXNzYWdlICp2YWx1ZSA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgW3ZhbHVlIHJlbGVhc2VdOwotICAgIH0gZWxzZSBpZiAoR1BCRmllbGREYXRhVHlwZUlzT2JqZWN0KGZpZWxkKSAmJgotICAgICAgICAgICAgICAgR1BCR2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkKSkgewotICAgICAgaWQgdmFsdWUgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkKTsKLSAgICAgIFt2YWx1ZSByZWxlYXNlXTsKLSAgICB9Ci0gIH0KLQotICAvLyBHUEJDbGVhck1lc3NhZ2VBdXRvY3JlYXRvcigpIGV4cGVjdHMgdGhhdCBpdHMgY2FsbGVyIGhhcyBhbHJlYWR5IGJlZW4KLSAgLy8gcmVtb3ZlZCBmcm9tIGF1dG9jcmVhdGVkRXh0ZW5zaW9uTWFwXyBzbyB3ZSBzZXQgdG8gbmlsIGZpcnN0LgotICBOU0FycmF5ICphdXRvY3JlYXRlZFZhbHVlcyA9IFthdXRvY3JlYXRlZEV4dGVuc2lvbk1hcF8gYWxsVmFsdWVzXTsKLSAgW2F1dG9jcmVhdGVkRXh0ZW5zaW9uTWFwXyByZWxlYXNlXTsKLSAgYXV0b2NyZWF0ZWRFeHRlbnNpb25NYXBfID0gbmlsOwotCi0gIC8vIFNpbmNlIHdlJ3JlIGNsZWFyaW5nIGFsbCBvZiBvdXIgZXh0ZW5zaW9ucywgbWFrZSBzdXJlIHRoYXQgd2UgY2xlYXIgdGhlCi0gIC8vIGF1dG9jcmVhdG9yIG9uIGFueSB0aGF0IHdlJ3ZlIGNyZWF0ZWQgc28gdGhleSBubyBsb25nZXIgcmVmZXIgdG8gdXMuCi0gIGZvciAoR1BCTWVzc2FnZSAqdmFsdWUgaW4gYXV0b2NyZWF0ZWRWYWx1ZXMpIHsKLSAgICBOU0NBc3NlcnQoR1BCV2FzTWVzc2FnZUF1dG9jcmVhdGVkQnkodmFsdWUsIHNlbGYpLAotICAgICAgICAgICAgICBAIkF1dG9jcmVhdGVkIGV4dGVuc2lvbiBkb2VzIG5vdCByZWZlciBiYWNrIHRvIHNlbGYuIik7Ci0gICAgR1BCQ2xlYXJNZXNzYWdlQXV0b2NyZWF0b3IodmFsdWUpOwotICB9Ci0KLSAgW2V4dGVuc2lvbk1hcF8gcmVsZWFzZV07Ci0gIGV4dGVuc2lvbk1hcF8gPSBuaWw7Ci0gIFt1bmtub3duRmllbGRzXyByZWxlYXNlXTsKLSAgdW5rbm93bkZpZWxkc18gPSBuaWw7Ci0KLSAgLy8gTm90ZSB0aGF0IGNsZWFyaW5nIGRvZXMgbm90IGFmZmVjdCBhdXRvY3JlYXRvcl8uIElmIHdlIGFyZSBiZWluZyBjbGVhcmVkCi0gIC8vIGJlY2F1c2Ugb2YgYSBkZWFsbG9jLCB0aGVuIGF1dG9jcmVhdG9yXyBzaG91bGQgYmUgbmlsIGFueXdheS4gSWYgd2UgYXJlCi0gIC8vIGJlaW5nIGNsZWFyZWQgYmVjYXVzZSBzb21lb25lIGV4cGxpY2l0bHkgY2xlYXJzIHVzLCB3ZSBkb24ndCB3YW50IHRvCi0gIC8vIHNldmVyIG91ciByZWxhdGlvbnNoaXAgd2l0aCBvdXIgYXV0b2NyZWF0b3IuCi0KLSAgaWYgKHplcm9TdG9yYWdlKSB7Ci0gICAgbWVtc2V0KG1lc3NhZ2VTdG9yYWdlXywgMCwgZGVzY3JpcHRvci0+c3RvcmFnZVNpemVfKTsKLSAgfQotfQotCi0tIChCT09MKWlzSW5pdGlhbGl6ZWQgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW3NlbGYgZGVzY3JpcHRvcl07Ci0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKSB7Ci0gICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQpIHsKLSAgICAgIGlmICghR1BCR2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkKSkgewotICAgICAgICByZXR1cm4gTk87Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChHUEJGaWVsZERhdGFUeXBlSXNNZXNzYWdlKGZpZWxkKSkgewotICAgICAgR1BCRmllbGRUeXBlIGZpZWxkVHlwZSA9IGZpZWxkLmZpZWxkVHlwZTsKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKSB7Ci0gICAgICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9IEdQQkdldE1lc3NhZ2VNZXNzYWdlRmllbGQoc2VsZiwgZmllbGQpOwotICAgICAgICAgIGlmICghbWVzc2FnZS5pbml0aWFsaXplZCkgewotICAgICAgICAgICAgcmV0dXJuIE5POwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBOU0Fzc2VydChmaWVsZC5pc09wdGlvbmFsLAotICAgICAgICAgICAgICAgICAgIEAiJUA6IFNpbmdsZSBtZXNzYWdlIGZpZWxkICVAIG5vdCByZXF1aXJlZCBvciBvcHRpb25hbD8iLAotICAgICAgICAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgZmllbGQubmFtZSk7Ci0gICAgICAgICAgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICAgICAgICAgIEdQQk1lc3NhZ2UgKm1lc3NhZ2UgPSBHUEJHZXRNZXNzYWdlTWVzc2FnZUZpZWxkKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgICAgIGlmICghbWVzc2FnZS5pbml0aWFsaXplZCkgewotICAgICAgICAgICAgICByZXR1cm4gTk87Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICBOU0FycmF5ICphcnJheSA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBmb3IgKEdQQk1lc3NhZ2UgKm1lc3NhZ2UgaW4gYXJyYXkpIHsKLSAgICAgICAgICBpZiAoIW1lc3NhZ2UuaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgIHJldHVybiBOTzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgIGlmIChmaWVsZC5tYXBLZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgewotICAgICAgICAgIE5TRGljdGlvbmFyeSAqbWFwID0KLSAgICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgICAgaWYgKG1hcCAmJiAhR1BCRGljdGlvbmFyeUlzSW5pdGlhbGl6ZWRJbnRlcm5hbEhlbHBlcihtYXAsIGZpZWxkKSkgewotICAgICAgICAgICAgcmV0dXJuIE5POwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBSZWFsIHR5cGUgaXMgR1BCKk9iamVjdERpY3Rpb25hcnksIGV4YWN0IHR5cGUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgICAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5ICptYXAgPQotICAgICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgICBpZiAobWFwICYmICFbbWFwIGlzSW5pdGlhbGl6ZWRdKSB7Ci0gICAgICAgICAgICByZXR1cm4gTk87Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgX19ibG9jayBCT09MIHJlc3VsdCA9IFlFUzsKLSAgW2V4dGVuc2lvbk1hcF8KLSAgICAgIGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgKnN0b3ApIHsKLSAgICAgICAgaWYgKEdQQkV4dGVuc2lvbklzTWVzc2FnZShleHRlbnNpb24pKSB7Ci0gICAgICAgICAgaWYgKGV4dGVuc2lvbi5pc1JlcGVhdGVkKSB7Ci0gICAgICAgICAgICBmb3IgKEdQQk1lc3NhZ2UgKm1zZyBpbiBvYmopIHsKLSAgICAgICAgICAgICAgaWYgKCFtc2cuaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBOTzsKLSAgICAgICAgICAgICAgICAqc3RvcCA9IFlFUzsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHUEJNZXNzYWdlICphc01zZyA9IG9iajsKLSAgICAgICAgICAgIGlmICghYXNNc2cuaW5pdGlhbGl6ZWQpIHsKLSAgICAgICAgICAgICAgcmVzdWx0ID0gTk87Ci0gICAgICAgICAgICAgICpzdG9wID0gWUVTOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfV07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgcmV0dXJuIFtbc2VsZiBjbGFzc10gZGVzY3JpcHRvcl07Ci19Ci0KLS0gKE5TRGF0YSAqKWRhdGEgewotI2lmZGVmIERFQlVHCi0gIGlmICghc2VsZi5pbml0aWFsaXplZCkgewotICAgIHJldHVybiBuaWw7Ci0gIH0KLSNlbmRpZgotICBOU011dGFibGVEYXRhICpkYXRhID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6W3NlbGYgc2VyaWFsaXplZFNpemVdXTsKLSAgR1BCQ29kZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSA9Ci0gICAgICBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIEB0cnkgewotICAgIFtzZWxmIHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpzdHJlYW1dOwotICB9Ci0gIEBjYXRjaCAoTlNFeGNlcHRpb24gKmV4Y2VwdGlvbikgewotICAgIC8vIFRoaXMgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4uIFRoZSBvbmx5IHdheSB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06Ci0gICAgLy8gY291bGQgdGhyb3cgaXMgaWYgc29tZXRoaW5nIGluIHRoZSBsaWJyYXJ5IGhhcyBhIGJ1ZyBhbmQgdGhlCi0gICAgLy8gc2VyaWFsaXplZFNpemUgd2FzIHdyb25nLgotI2lmZGVmIERFQlVHCi0gICAgTlNMb2coQCIlQDogSW50ZXJuYWwgZXhjZXB0aW9uIHdoaWxlIGJ1aWxkaW5nIG1lc3NhZ2UgZGF0YTogJUAiLAotICAgICAgICAgIFtzZWxmIGNsYXNzXSwgZXhjZXB0aW9uKTsKLSNlbmRpZgotICAgIGRhdGEgPSBuaWw7Ci0gIH0KLSAgW3N0cmVhbSByZWxlYXNlXTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLS0gKE5TRGF0YSAqKWRlbGltaXRlZERhdGEgewotICBzaXplX3Qgc2VyaWFsaXplZFNpemUgPSBbc2VsZiBzZXJpYWxpemVkU2l6ZV07Ci0gIHNpemVfdCB2YXJpbnRTaXplID0gR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZUZvckludGVnZXIoc2VyaWFsaXplZFNpemUpOwotICBOU011dGFibGVEYXRhICpkYXRhID0KLSAgICAgIFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOihzZXJpYWxpemVkU2l6ZSArIHZhcmludFNpemUpXTsKLSAgR1BCQ29kZWRPdXRwdXRTdHJlYW0gKnN0cmVhbSA9Ci0gICAgICBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIEB0cnkgewotICAgIFtzZWxmIHdyaXRlRGVsaW1pdGVkVG9Db2RlZE91dHB1dFN0cmVhbTpzdHJlYW1dOwotICB9Ci0gIEBjYXRjaCAoTlNFeGNlcHRpb24gKmV4Y2VwdGlvbikgewotICAgIC8vIFRoaXMgcmVhbGx5IHNob3VsZG4ndCBoYXBwZW4uICBUaGUgb25seSB3YXkgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOgotICAgIC8vIGNvdWxkIHRocm93IGlzIGlmIHNvbWV0aGluZyBpbiB0aGUgbGlicmFyeSBoYXMgYSBidWcgYW5kIHRoZQotICAgIC8vIHNlcmlhbGl6ZWRTaXplIHdhcyB3cm9uZy4KLSNpZmRlZiBERUJVRwotICAgIE5TTG9nKEAiJUA6IEludGVybmFsIGV4Y2VwdGlvbiB3aGlsZSBidWlsZGluZyBtZXNzYWdlIGRlbGltaXRlZERhdGE6ICVAIiwKLSAgICAgICAgICBbc2VsZiBjbGFzc10sIGV4Y2VwdGlvbik7Ci0jZW5kaWYKLSAgICAvLyBJZiBpdCBoYXBwZW5zLCB0cnVuY2F0ZS4KLSAgICBkYXRhLmxlbmd0aCA9IDA7Ci0gIH0KLSAgW3N0cmVhbSByZWxlYXNlXTsKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb091dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQgewotICBHUEJDb2RlZE91dHB1dFN0cmVhbSAqc3RyZWFtID0KLSAgICAgIFtbR1BCQ29kZWRPdXRwdXRTdHJlYW0gYWxsb2NdIGluaXRXaXRoT3V0cHV0U3RyZWFtOm91dHB1dF07Ci0gIFtzZWxmIHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpzdHJlYW1dOwotICBbc3RyZWFtIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXQgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW3NlbGYgZGVzY3JpcHRvcl07Ci0gIE5TQXJyYXkgKmZpZWxkc0FycmF5ID0gZGVzY3JpcHRvci0+ZmllbGRzXzsKLSAgTlNVSW50ZWdlciBmaWVsZENvdW50ID0gZmllbGRzQXJyYXkuY291bnQ7Ci0gIGNvbnN0IEdQQkV4dGVuc2lvblJhbmdlICpleHRlbnNpb25SYW5nZXMgPSBkZXNjcmlwdG9yLmV4dGVuc2lvblJhbmdlczsKLSAgTlNVSW50ZWdlciBleHRlbnNpb25SYW5nZXNDb3VudCA9IGRlc2NyaXB0b3IuZXh0ZW5zaW9uUmFuZ2VzQ291bnQ7Ci0gIGZvciAoTlNVSW50ZWdlciBpID0gMCwgaiA9IDA7IGkgPCBmaWVsZENvdW50IHx8IGogPCBleHRlbnNpb25SYW5nZXNDb3VudDspIHsKLSAgICBpZiAoaSA9PSBmaWVsZENvdW50KSB7Ci0gICAgICBbc2VsZiB3cml0ZUV4dGVuc2lvbnNUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTpleHRlbnNpb25SYW5nZXNbaisrXV07Ci0gICAgfSBlbHNlIGlmIChqID09IGV4dGVuc2lvblJhbmdlc0NvdW50IHx8Ci0gICAgICAgICAgICAgICBHUEJGaWVsZE51bWJlcihmaWVsZHNBcnJheVtpXSkgPCBleHRlbnNpb25SYW5nZXNbal0uc3RhcnQpIHsKLSAgICAgIFtzZWxmIHdyaXRlRmllbGQ6ZmllbGRzQXJyYXlbaSsrXSB0b0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dF07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFtzZWxmIHdyaXRlRXh0ZW5zaW9uc1RvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOmV4dGVuc2lvblJhbmdlc1tqKytdXTsKLSAgICB9Ci0gIH0KLSAgaWYgKGRlc2NyaXB0b3IuaXNXaXJlRm9ybWF0KSB7Ci0gICAgW3Vua25vd25GaWVsZHNfIHdyaXRlQXNNZXNzYWdlU2V0VG86b3V0cHV0XTsKLSAgfSBlbHNlIHsKLSAgICBbdW5rbm93bkZpZWxkc18gd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dF07Ci0gIH0KLX0KLQotLSAodm9pZCl3cml0ZURlbGltaXRlZFRvT3V0cHV0U3RyZWFtOihOU091dHB1dFN0cmVhbSAqKW91dHB1dCB7Ci0gIEdQQkNvZGVkT3V0cHV0U3RyZWFtICpjb2RlZE91dHB1dCA9Ci0gICAgICBbW0dQQkNvZGVkT3V0cHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aE91dHB1dFN0cmVhbTpvdXRwdXRdOwotICBbc2VsZiB3cml0ZURlbGltaXRlZFRvQ29kZWRPdXRwdXRTdHJlYW06Y29kZWRPdXRwdXRdOwotICBbY29kZWRPdXRwdXQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpd3JpdGVEZWxpbWl0ZWRUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dCB7Ci0gIFtvdXRwdXQgd3JpdGVSYXdWYXJpbnRTaXplVEFzMzI6W3NlbGYgc2VyaWFsaXplZFNpemVdXTsKLSAgW3NlbGYgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dF07Ci19Ci0KLS0gKHZvaWQpd3JpdGVGaWVsZDooR1BCRmllbGREZXNjcmlwdG9yICopZmllbGQKLSAgICB0b0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dCB7Ci0gIEdQQkZpZWxkVHlwZSBmaWVsZFR5cGUgPSBmaWVsZC5maWVsZFR5cGU7Ci0gIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgQk9PTCBoYXMgPSBHUEJHZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQpOwotICAgIGlmICghaGFzKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0gIHVpbnQzMl90IGZpZWxkTnVtYmVyID0gR1BCRmllbGROdW1iZXIoZmllbGQpOwotCi0vLyVQRERNLURFRklORSBGSUVMRF9DQVNFKFRZUEUsIFJFQUxfVFlQRSkKLS8vJUZJRUxEX0NBU0VfRlVMTChUWVBFLCBSRUFMX1RZUEUsIFJFQUxfVFlQRSkKLS8vJVBERE0tREVGSU5FIEZJRUxEX0NBU0VfRlVMTChUWVBFLCBSRUFMX1RZUEUsIEFSUkFZX1RZUEUpCi0vLyUgICAgY2FzZSBHUEJEYXRhVHlwZSMjVFlQRToKLS8vJSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLS8vJSAgICAgICAgdWludDMyX3QgdGFnID0gZmllbGQuaXNQYWNrYWJsZSA/IEdQQkZpZWxkVGFnKGZpZWxkKSA6IDA7Ci0vLyUgICAgICAgIEdQQiMjQVJSQVlfVFlQRSMjQXJyYXkgKmFycmF5ID0KLS8vJSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotLy8lICAgICAgICBbb3V0cHV0IHdyaXRlIyNUWVBFIyNBcnJheTpmaWVsZE51bWJlciB2YWx1ZXM6YXJyYXkgdGFnOnRhZ107Ci0vLyUgICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVTaW5nbGUpIHsKLS8vJSAgICAgICAgW291dHB1dCB3cml0ZSMjVFlQRTpmaWVsZE51bWJlcgotLy8lICAgICAgICAgICAgICBUWVBFJFMgIHZhbHVlOkdQQkdldE1lc3NhZ2UjI1JFQUxfVFlQRSMjRmllbGQoc2VsZiwgZmllbGQpXTsKLS8vJSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0vLyUgICAgICAgIC8vIEV4YWN0IHR5cGUgaGVyZSBkb2Vzbid0IG1hdHRlci4KLS8vJSAgICAgICAgR1BCSW50MzIjI0FSUkFZX1RZUEUjI0RpY3Rpb25hcnkgKmRpY3QgPQotLy8lICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0vLyUgICAgICAgIFtkaWN0IHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpvdXRwdXQgYXNGaWVsZDpmaWVsZF07Ci0vLyUgICAgICB9Ci0vLyUgICAgICBicmVhazsKLS8vJQotLy8lUERETS1ERUZJTkUgRklFTERfQ0FTRTIoVFlQRSkKLS8vJSAgICBjYXNlIEdQQkRhdGFUeXBlIyNUWVBFOgotLy8lICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotLy8lICAgICAgICBOU0FycmF5ICphcnJheSA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotLy8lICAgICAgICBbb3V0cHV0IHdyaXRlIyNUWVBFIyNBcnJheTpmaWVsZE51bWJlciB2YWx1ZXM6YXJyYXldOwotLy8lICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0vLyUgICAgICAgIC8vIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoKSBhdm9pZHMgZG9pbmcgdGhlIGhhcyBjaGVjawotLy8lICAgICAgICAvLyBhZ2Fpbi4KLS8vJSAgICAgICAgW291dHB1dCB3cml0ZSMjVFlQRTpmaWVsZE51bWJlcgotLy8lICAgICAgICAgICAgICBUWVBFJFMgIHZhbHVlOkdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpXTsKLS8vJSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0vLyUgICAgICAgIC8vIEV4YWN0IHR5cGUgaGVyZSBkb2Vzbid0IG1hdHRlci4KLS8vJSAgICAgICAgaWQgZGljdCA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotLy8lICAgICAgICBHUEJEYXRhVHlwZSBtYXBLZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotLy8lICAgICAgICBpZiAobWFwS2V5RGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVTdHJpbmcpIHsKLS8vJSAgICAgICAgICBHUEJEaWN0aW9uYXJ5V3JpdGVUb1N0cmVhbUludGVybmFsSGVscGVyKG91dHB1dCwgZGljdCwgZmllbGQpOwotLy8lICAgICAgICB9IGVsc2UgewotLy8lICAgICAgICAgIFtkaWN0IHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpvdXRwdXQgYXNGaWVsZDpmaWVsZF07Ci0vLyUgICAgICAgIH0KLS8vJSAgICAgIH0KLS8vJSAgICAgIGJyZWFrOwotLy8lCi0KLSAgc3dpdGNoIChHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKSkgewotCi0vLyVQRERNLUVYUEFORCBGSUVMRF9DQVNFKEJvb2wsIEJvb2wpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICAgIGNhc2UgR1BCRGF0YVR5cGVCb29sOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICB1aW50MzJfdCB0YWcgPSBmaWVsZC5pc1BhY2thYmxlID8gR1BCRmllbGRUYWcoZmllbGQpIDogMDsKLSAgICAgICAgR1BCQm9vbEFycmF5ICphcnJheSA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZUJvb2xBcnJheTpmaWVsZE51bWJlciB2YWx1ZXM6YXJyYXkgdGFnOnRhZ107Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVTaW5nbGUpIHsKLSAgICAgICAgW291dHB1dCB3cml0ZUJvb2w6ZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0TWVzc2FnZUJvb2xGaWVsZChzZWxmLCBmaWVsZCldOwotICAgICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVNYXAKLSAgICAgICAgLy8gRXhhY3QgdHlwZSBoZXJlIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbZGljdCB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0IGFzRmllbGQ6ZmllbGRdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UoRml4ZWQzMiwgVUludDMyKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgdWludDMyX3QgdGFnID0gZmllbGQuaXNQYWNrYWJsZSA/IEdQQkZpZWxkVGFnKGZpZWxkKSA6IDA7Ci0gICAgICAgIEdQQlVJbnQzMkFycmF5ICphcnJheSA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZUZpeGVkMzJBcnJheTpmaWVsZE51bWJlciB2YWx1ZXM6YXJyYXkgdGFnOnRhZ107Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVTaW5nbGUpIHsKLSAgICAgICAgW291dHB1dCB3cml0ZUZpeGVkMzI6ZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0TWVzc2FnZVVJbnQzMkZpZWxkKHNlbGYsIGZpZWxkKV07Ci0gICAgICB9IGVsc2UgeyAgLy8gZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcAotICAgICAgICAvLyBFeGFjdCB0eXBlIGhlcmUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW2RpY3Qgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dCBhc0ZpZWxkOmZpZWxkXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0vLyVQRERNLUVYUEFORCBGSUVMRF9DQVNFKFNGaXhlZDMyLCBJbnQzMikKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDMyOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICB1aW50MzJfdCB0YWcgPSBmaWVsZC5pc1BhY2thYmxlID8gR1BCRmllbGRUYWcoZmllbGQpIDogMDsKLSAgICAgICAgR1BCSW50MzJBcnJheSAqYXJyYXkgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVTRml4ZWQzMkFycmF5OmZpZWxkTnVtYmVyIHZhbHVlczphcnJheSB0YWc6dGFnXTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgICBbb3V0cHV0IHdyaXRlU0ZpeGVkMzI6ZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOkdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKHNlbGYsIGZpZWxkKV07Ci0gICAgICB9IGVsc2UgeyAgLy8gZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcAotICAgICAgICAvLyBFeGFjdCB0eXBlIGhlcmUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbZGljdCB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0IGFzRmllbGQ6ZmllbGRdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UoRmxvYXQsIEZsb2F0KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlRmxvYXQ6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICAgIHVpbnQzMl90IHRhZyA9IGZpZWxkLmlzUGFja2FibGUgPyBHUEJGaWVsZFRhZyhmaWVsZCkgOiAwOwotICAgICAgICBHUEJGbG9hdEFycmF5ICphcnJheSA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZUZsb2F0QXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5IHRhZzp0YWddOwotICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVGbG9hdDpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0TWVzc2FnZUZsb2F0RmllbGQoc2VsZiwgZmllbGQpXTsKLSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgIC8vIEV4YWN0IHR5cGUgaGVyZSBkb2Vzbid0IG1hdHRlci4KLSAgICAgICAgR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtkaWN0IHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpvdXRwdXQgYXNGaWVsZDpmaWVsZF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotLy8lUERETS1FWFBBTkQgRklFTERfQ0FTRShGaXhlZDY0LCBVSW50NjQpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDY0OgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICB1aW50MzJfdCB0YWcgPSBmaWVsZC5pc1BhY2thYmxlID8gR1BCRmllbGRUYWcoZmllbGQpIDogMDsKLSAgICAgICAgR1BCVUludDY0QXJyYXkgKmFycmF5ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbb3V0cHV0IHdyaXRlRml4ZWQ2NEFycmF5OmZpZWxkTnVtYmVyIHZhbHVlczphcnJheSB0YWc6dGFnXTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgICBbb3V0cHV0IHdyaXRlRml4ZWQ2NDpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpHUEJHZXRNZXNzYWdlVUludDY0RmllbGQoc2VsZiwgZmllbGQpXTsKLSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgIC8vIEV4YWN0IHR5cGUgaGVyZSBkb2Vzbid0IG1hdHRlci4KLSAgICAgICAgR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbZGljdCB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0IGFzRmllbGQ6ZmllbGRdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UoU0ZpeGVkNjQsIEludDY0KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICAgIHVpbnQzMl90IHRhZyA9IGZpZWxkLmlzUGFja2FibGUgPyBHUEJGaWVsZFRhZyhmaWVsZCkgOiAwOwotICAgICAgICBHUEJJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZVNGaXhlZDY0QXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5IHRhZzp0YWddOwotICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVTRml4ZWQ2NDpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0TWVzc2FnZUludDY0RmllbGQoc2VsZiwgZmllbGQpXTsKLSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgIC8vIEV4YWN0IHR5cGUgaGVyZSBkb2Vzbid0IG1hdHRlci4KLSAgICAgICAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtkaWN0IHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpvdXRwdXQgYXNGaWVsZDpmaWVsZF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotLy8lUERETS1FWFBBTkQgRklFTERfQ0FTRShEb3VibGUsIERvdWJsZSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gICAgY2FzZSBHUEJEYXRhVHlwZURvdWJsZToKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgdWludDMyX3QgdGFnID0gZmllbGQuaXNQYWNrYWJsZSA/IEdQQkZpZWxkVGFnKGZpZWxkKSA6IDA7Ci0gICAgICAgIEdQQkRvdWJsZUFycmF5ICphcnJheSA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZURvdWJsZUFycmF5OmZpZWxkTnVtYmVyIHZhbHVlczphcnJheSB0YWc6dGFnXTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgICBbb3V0cHV0IHdyaXRlRG91YmxlOmZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0TWVzc2FnZURvdWJsZUZpZWxkKHNlbGYsIGZpZWxkKV07Ci0gICAgICB9IGVsc2UgeyAgLy8gZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcAotICAgICAgICAvLyBFeGFjdCB0eXBlIGhlcmUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW2RpY3Qgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dCBhc0ZpZWxkOmZpZWxkXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0vLyVQRERNLUVYUEFORCBGSUVMRF9DQVNFKEludDMyLCBJbnQzMikKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gICAgY2FzZSBHUEJEYXRhVHlwZUludDMyOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICB1aW50MzJfdCB0YWcgPSBmaWVsZC5pc1BhY2thYmxlID8gR1BCRmllbGRUYWcoZmllbGQpIDogMDsKLSAgICAgICAgR1BCSW50MzJBcnJheSAqYXJyYXkgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVJbnQzMkFycmF5OmZpZWxkTnVtYmVyIHZhbHVlczphcnJheSB0YWc6dGFnXTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgICBbb3V0cHV0IHdyaXRlSW50MzI6ZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgIHZhbHVlOkdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKHNlbGYsIGZpZWxkKV07Ci0gICAgICB9IGVsc2UgeyAgLy8gZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcAotICAgICAgICAvLyBFeGFjdCB0eXBlIGhlcmUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbZGljdCB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0IGFzRmllbGQ6ZmllbGRdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UoSW50NjQsIEludDY0KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlSW50NjQ6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICAgIHVpbnQzMl90IHRhZyA9IGZpZWxkLmlzUGFja2FibGUgPyBHUEJGaWVsZFRhZyhmaWVsZCkgOiAwOwotICAgICAgICBHUEJJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZUludDY0QXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5IHRhZzp0YWddOwotICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVJbnQ2NDpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0TWVzc2FnZUludDY0RmllbGQoc2VsZiwgZmllbGQpXTsKLSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgIC8vIEV4YWN0IHR5cGUgaGVyZSBkb2Vzbid0IG1hdHRlci4KLSAgICAgICAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtkaWN0IHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpvdXRwdXQgYXNGaWVsZDpmaWVsZF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotLy8lUERETS1FWFBBTkQgRklFTERfQ0FTRShTSW50MzIsIEludDMyKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDMyOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICB1aW50MzJfdCB0YWcgPSBmaWVsZC5pc1BhY2thYmxlID8gR1BCRmllbGRUYWcoZmllbGQpIDogMDsKLSAgICAgICAgR1BCSW50MzJBcnJheSAqYXJyYXkgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVTSW50MzJBcnJheTpmaWVsZE51bWJlciB2YWx1ZXM6YXJyYXkgdGFnOnRhZ107Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVTaW5nbGUpIHsKLSAgICAgICAgW291dHB1dCB3cml0ZVNJbnQzMjpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOkdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKHNlbGYsIGZpZWxkKV07Ci0gICAgICB9IGVsc2UgeyAgLy8gZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcAotICAgICAgICAvLyBFeGFjdCB0eXBlIGhlcmUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbZGljdCB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0IGFzRmllbGQ6ZmllbGRdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UoU0ludDY0LCBJbnQ2NCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQ2NDoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgdWludDMyX3QgdGFnID0gZmllbGQuaXNQYWNrYWJsZSA/IEdQQkZpZWxkVGFnKGZpZWxkKSA6IDA7Ci0gICAgICAgIEdQQkludDY0QXJyYXkgKmFycmF5ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbb3V0cHV0IHdyaXRlU0ludDY0QXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5IHRhZzp0YWddOwotICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVTSW50NjQ6ZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpHUEJHZXRNZXNzYWdlSW50NjRGaWVsZChzZWxmLCBmaWVsZCldOwotICAgICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVNYXAKLSAgICAgICAgLy8gRXhhY3QgdHlwZSBoZXJlIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICBHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW2RpY3Qgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dCBhc0ZpZWxkOmZpZWxkXTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0vLyVQRERNLUVYUEFORCBGSUVMRF9DQVNFKFVJbnQzMiwgVUludDMyKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlVUludDMyOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICB1aW50MzJfdCB0YWcgPSBmaWVsZC5pc1BhY2thYmxlID8gR1BCRmllbGRUYWcoZmllbGQpIDogMDsKLSAgICAgICAgR1BCVUludDMyQXJyYXkgKmFycmF5ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbb3V0cHV0IHdyaXRlVUludDMyQXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5IHRhZzp0YWddOwotICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVVSW50MzI6ZmllbGROdW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpHUEJHZXRNZXNzYWdlVUludDMyRmllbGQoc2VsZiwgZmllbGQpXTsKLSAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgIC8vIEV4YWN0IHR5cGUgaGVyZSBkb2Vzbid0IG1hdHRlci4KLSAgICAgICAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbZGljdCB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0IGFzRmllbGQ6ZmllbGRdOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UoVUludDY0LCBVSW50NjQpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50NjQ6Ci0gICAgICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICAgIHVpbnQzMl90IHRhZyA9IGZpZWxkLmlzUGFja2FibGUgPyBHUEJGaWVsZFRhZyhmaWVsZCkgOiAwOwotICAgICAgICBHUEJVSW50NjRBcnJheSAqYXJyYXkgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVVSW50NjRBcnJheTpmaWVsZE51bWJlciB2YWx1ZXM6YXJyYXkgdGFnOnRhZ107Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVTaW5nbGUpIHsKLSAgICAgICAgW291dHB1dCB3cml0ZVVJbnQ2NDpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOkdQQkdldE1lc3NhZ2VVSW50NjRGaWVsZChzZWxmLCBmaWVsZCldOwotICAgICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVNYXAKLSAgICAgICAgLy8gRXhhY3QgdHlwZSBoZXJlIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtkaWN0IHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpvdXRwdXQgYXNGaWVsZDpmaWVsZF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotLy8lUERETS1FWFBBTkQgRklFTERfQ0FTRV9GVUxMKEVudW0sIEludDMyLCBFbnVtKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlRW51bToKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgdWludDMyX3QgdGFnID0gZmllbGQuaXNQYWNrYWJsZSA/IEdQQkZpZWxkVGFnKGZpZWxkKSA6IDA7Ci0gICAgICAgIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVFbnVtQXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5IHRhZzp0YWddOwotICAgICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlU2luZ2xlKSB7Ci0gICAgICAgIFtvdXRwdXQgd3JpdGVFbnVtOmZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKHNlbGYsIGZpZWxkKV07Ci0gICAgICB9IGVsc2UgeyAgLy8gZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcAotICAgICAgICAvLyBFeGFjdCB0eXBlIGhlcmUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIFtkaWN0IHdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTpvdXRwdXQgYXNGaWVsZDpmaWVsZF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotLy8lUERETS1FWFBBTkQgRklFTERfQ0FTRTIoQnl0ZXMpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgTlNBcnJheSAqYXJyYXkgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZUJ5dGVzQXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5XTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgICAvLyBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKCkgYXZvaWRzIGRvaW5nIHRoZSBoYXMgY2hlY2sKLSAgICAgICAgLy8gYWdhaW4uCi0gICAgICAgIFtvdXRwdXQgd3JpdGVCeXRlczpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCldOwotICAgICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVNYXAKLSAgICAgICAgLy8gRXhhY3QgdHlwZSBoZXJlIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICBpZCBkaWN0ID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIEdQQkRhdGFUeXBlIG1hcEtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gICAgICAgIGlmIChtYXBLZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgewotICAgICAgICAgIEdQQkRpY3Rpb25hcnlXcml0ZVRvU3RyZWFtSW50ZXJuYWxIZWxwZXIob3V0cHV0LCBkaWN0LCBmaWVsZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgW2RpY3Qgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dCBhc0ZpZWxkOmZpZWxkXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UyKFN0cmluZykKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gICAgY2FzZSBHUEJEYXRhVHlwZVN0cmluZzoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgTlNBcnJheSAqYXJyYXkgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZVN0cmluZ0FycmF5OmZpZWxkTnVtYmVyIHZhbHVlczphcnJheV07Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVTaW5nbGUpIHsKLSAgICAgICAgLy8gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZSgpIGF2b2lkcyBkb2luZyB0aGUgaGFzIGNoZWNrCi0gICAgICAgIC8vIGFnYWluLgotICAgICAgICBbb3V0cHV0IHdyaXRlU3RyaW5nOmZpZWxkTnVtYmVyCi0gICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCldOwotICAgICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVNYXAKLSAgICAgICAgLy8gRXhhY3QgdHlwZSBoZXJlIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICBpZCBkaWN0ID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIEdQQkRhdGFUeXBlIG1hcEtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gICAgICAgIGlmIChtYXBLZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgewotICAgICAgICAgIEdQQkRpY3Rpb25hcnlXcml0ZVRvU3RyZWFtSW50ZXJuYWxIZWxwZXIob3V0cHV0LCBkaWN0LCBmaWVsZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgW2RpY3Qgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dCBhc0ZpZWxkOmZpZWxkXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5EIEZJRUxEX0NBU0UyKE1lc3NhZ2UpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgICAgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICBOU0FycmF5ICphcnJheSA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbb3V0cHV0IHdyaXRlTWVzc2FnZUFycmF5OmZpZWxkTnVtYmVyIHZhbHVlczphcnJheV07Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVTaW5nbGUpIHsKLSAgICAgICAgLy8gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZSgpIGF2b2lkcyBkb2luZyB0aGUgaGFzIGNoZWNrCi0gICAgICAgIC8vIGFnYWluLgotICAgICAgICBbb3V0cHV0IHdyaXRlTWVzc2FnZTpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZTpHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKV07Ci0gICAgICB9IGVsc2UgeyAgLy8gZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcAotICAgICAgICAvLyBFeGFjdCB0eXBlIGhlcmUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIGlkIGRpY3QgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgR1BCRGF0YVR5cGUgbWFwS2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgICAgICAgaWYgKG1hcEtleURhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nKSB7Ci0gICAgICAgICAgR1BCRGljdGlvbmFyeVdyaXRlVG9TdHJlYW1JbnRlcm5hbEhlbHBlcihvdXRwdXQsIGRpY3QsIGZpZWxkKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBbZGljdCB3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06b3V0cHV0IGFzRmllbGQ6ZmllbGRdOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotLy8lUERETS1FWFBBTkQgRklFTERfQ0FTRTIoR3JvdXApCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDoKLSAgICAgIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgTlNBcnJheSAqYXJyYXkgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW291dHB1dCB3cml0ZUdyb3VwQXJyYXk6ZmllbGROdW1iZXIgdmFsdWVzOmFycmF5XTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgICAvLyBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKCkgYXZvaWRzIGRvaW5nIHRoZSBoYXMgY2hlY2sKLSAgICAgICAgLy8gYWdhaW4uCi0gICAgICAgIFtvdXRwdXQgd3JpdGVHcm91cDpmaWVsZE51bWJlcgotICAgICAgICAgICAgICAgICAgICAgdmFsdWU6R1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCldOwotICAgICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVNYXAKLSAgICAgICAgLy8gRXhhY3QgdHlwZSBoZXJlIGRvZXNuJ3QgbWF0dGVyLgotICAgICAgICBpZCBkaWN0ID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgIEdQQkRhdGFUeXBlIG1hcEtleURhdGFUeXBlID0gZmllbGQubWFwS2V5RGF0YVR5cGU7Ci0gICAgICAgIGlmIChtYXBLZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgewotICAgICAgICAgIEdQQkRpY3Rpb25hcnlXcml0ZVRvU3RyZWFtSW50ZXJuYWxIZWxwZXIob3V0cHV0LCBkaWN0LCBmaWVsZCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgW2RpY3Qgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dCBhc0ZpZWxkOmZpZWxkXTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLS8vJVBERE0tRVhQQU5ELUVORCAoMTggZXhwYW5zaW9ucykKLSAgfQotfQotCi0jcHJhZ21hIG1hcmsgLSBFeHRlbnNpb25zCi0KLS0gKGlkKWdldEV4dGVuc2lvbjooR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqKWV4dGVuc2lvbiB7Ci0gIENoZWNrRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik7Ci0gIGlkIHZhbHVlID0gW2V4dGVuc2lvbk1hcF8gb2JqZWN0Rm9yS2V5OmV4dGVuc2lvbl07Ci0gIGlmICh2YWx1ZSAhPSBuaWwpIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLQotICAvLyBObyBkZWZhdWx0IGZvciByZXBlYXRlZC4KLSAgaWYgKGV4dGVuc2lvbi5pc1JlcGVhdGVkKSB7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotICAvLyBOb24gbWVzc2FnZXMgZ2V0IHRoZWlyIGRlZmF1bHQuCi0gIGlmICghR1BCRXh0ZW5zaW9uSXNNZXNzYWdlKGV4dGVuc2lvbikpIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uLmRlZmF1bHRWYWx1ZTsKLSAgfQotCi0gIC8vIENoZWNrIGZvciBhbiBhdXRvY3JlYXRlZCB2YWx1ZS4KLSAgR1BCUHJlcGFyZVJlYWRPbmx5U2VtYXBob3JlKHNlbGYpOwotICBkaXNwYXRjaF9zZW1hcGhvcmVfd2FpdChyZWFkT25seVNlbWFwaG9yZV8sIERJU1BBVENIX1RJTUVfRk9SRVZFUik7Ci0gIHZhbHVlID0gW2F1dG9jcmVhdGVkRXh0ZW5zaW9uTWFwXyBvYmplY3RGb3JLZXk6ZXh0ZW5zaW9uXTsKLSAgaWYgKCF2YWx1ZSkgewotICAgIC8vIEF1dG8gY3JlYXRlIHRoZSBtZXNzYWdlIGV4dGVuc2lvbnMgdG8gbWF0Y2ggbm9ybWFsIGZpZWxkcy4KLSAgICB2YWx1ZSA9IENyZWF0ZU1lc3NhZ2VXaXRoQXV0b2NyZWF0b3JGb3JFeHRlbnNpb24oZXh0ZW5zaW9uLm1zZ0NsYXNzLCBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24pOwotCi0gICAgaWYgKGF1dG9jcmVhdGVkRXh0ZW5zaW9uTWFwXyA9PSBuaWwpIHsKLSAgICAgIGF1dG9jcmVhdGVkRXh0ZW5zaW9uTWFwXyA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gICAgfQotCi0gICAgLy8gV2UgY2FuJ3Qgc2ltcGx5IGNhbGwgc2V0RXh0ZW5zaW9uIGhlcmUgYmVjYXVzZSB0aGF0IHdvdWxkIGNsZWFyIHRoZSBuZXcKLSAgICAvLyB2YWx1ZSdzIGF1dG9jcmVhdG9yLgotICAgIFthdXRvY3JlYXRlZEV4dGVuc2lvbk1hcF8gc2V0T2JqZWN0OnZhbHVlIGZvcktleTpleHRlbnNpb25dOwotICAgIFt2YWx1ZSByZWxlYXNlXTsKLSAgfQotCi0gIGRpc3BhdGNoX3NlbWFwaG9yZV9zaWduYWwocmVhZE9ubHlTZW1hcGhvcmVfKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0tIChpZClnZXRFeGlzdGluZ0V4dGVuc2lvbjooR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqKWV4dGVuc2lvbiB7Ci0gIC8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgbWV0aG9kIHNvIHdlIGRvbid0IG5lZWQgdG8gY2FsbCBDaGVja0V4dGVuc2lvbigpLgotICByZXR1cm4gW2V4dGVuc2lvbk1hcF8gb2JqZWN0Rm9yS2V5OmV4dGVuc2lvbl07Ci19Ci0KLS0gKEJPT0wpaGFzRXh0ZW5zaW9uOihHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopZXh0ZW5zaW9uIHsKLSNpZiBERUJVRwotICBDaGVja0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb24pOwotI2VuZGlmICAvLyBERUJVRwotICByZXR1cm4gbmlsICE9IFtleHRlbnNpb25NYXBfIG9iamVjdEZvcktleTpleHRlbnNpb25dOwotfQotCi0tIChOU0FycmF5ICopZXh0ZW5zaW9uc0N1cnJlbnRseVNldCB7Ci0gIHJldHVybiBbZXh0ZW5zaW9uTWFwXyBhbGxLZXlzXTsKLX0KLQotLSAodm9pZCl3cml0ZUV4dGVuc2lvbnNUb0NvZGVkT3V0cHV0U3RyZWFtOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlOihHUEJFeHRlbnNpb25SYW5nZSlyYW5nZSB7Ci0gIE5TQXJyYXkgKnNvcnRlZEV4dGVuc2lvbnMgPSBbW2V4dGVuc2lvbk1hcF8gYWxsS2V5c10KLSAgICAgIHNvcnRlZEFycmF5VXNpbmdTZWxlY3RvcjpAc2VsZWN0b3IoY29tcGFyZUJ5RmllbGROdW1iZXI6KV07Ci0gIHVpbnQzMl90IHN0YXJ0ID0gcmFuZ2Uuc3RhcnQ7Ci0gIHVpbnQzMl90IGVuZCA9IHJhbmdlLmVuZDsKLSAgZm9yIChHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24gaW4gc29ydGVkRXh0ZW5zaW9ucykgewotICAgIHVpbnQzMl90IGZpZWxkTnVtYmVyID0gZXh0ZW5zaW9uLmZpZWxkTnVtYmVyOwotICAgIGlmIChmaWVsZE51bWJlciA+PSBzdGFydCAmJiBmaWVsZE51bWJlciA8IGVuZCkgewotICAgICAgaWQgdmFsdWUgPSBbZXh0ZW5zaW9uTWFwXyBvYmplY3RGb3JLZXk6ZXh0ZW5zaW9uXTsKLSAgICAgIEdQQldyaXRlRXh0ZW5zaW9uVmFsdWVUb091dHB1dFN0cmVhbShleHRlbnNpb24sIHZhbHVlLCBvdXRwdXQpOwotICAgIH0KLSAgfQotfQotCi0tIChOU0FycmF5ICopc29ydGVkRXh0ZW5zaW9uc0luVXNlIHsKLSAgcmV0dXJuIFtbZXh0ZW5zaW9uTWFwXyBhbGxLZXlzXQotICAgICAgc29ydGVkQXJyYXlVc2luZ1NlbGVjdG9yOkBzZWxlY3Rvcihjb21wYXJlQnlGaWVsZE51bWJlcjopXTsKLX0KLQotLSAodm9pZClzZXRFeHRlbnNpb246KEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKilleHRlbnNpb24gdmFsdWU6KGlkKXZhbHVlIHsKLSAgaWYgKCF2YWx1ZSkgewotICAgIFtzZWxmIGNsZWFyRXh0ZW5zaW9uOmV4dGVuc2lvbl07Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgQ2hlY2tFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uKTsKLQotICBpZiAoZXh0ZW5zaW9uLnJlcGVhdGVkKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiTXVzdCBjYWxsIGFkZEV4dGVuc2lvbigpIGZvciByZXBlYXRlZCB0eXBlcy4iXTsKLSAgfQotCi0gIGlmIChleHRlbnNpb25NYXBfID09IG5pbCkgewotICAgIGV4dGVuc2lvbk1hcF8gPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICB9Ci0KLSAgLy8gVGhpcyBwb2ludGxlc3MgY2FzdCBpcyBmb3IgQ0xBTkdfV0FSTl9OVUxMQUJMRV9UT19OT05OVUxMX0NPTlZFUlNJT04uCi0gIC8vIFdpdGhvdXQgaXQsIHRoZSBjb21waWxlciBjb21wbGFpbnMgd2UncmUgcGFzc2luZyBhbiBpZCBudWxsYWJsZSB3aGVuCi0gIC8vIHNldE9iamVjdDpmb3JLZXk6IHJlcXVpcmVzIGEgaWQgbm9ubnVsbCBmb3IgdGhlIHZhbHVlLiBUaGUgY2hlY2sgZm9yCi0gIC8vICF2YWx1ZSBhdCB0aGUgc3RhcnQgb2YgdGhlIG1ldGhvZCBlbnN1cmVzIGl0IGlzbid0IG5pbCwgYnV0IHRoZSBjaGVjawotICAvLyBpc24ndCBzbWFydCBlbm91Z2ggdG8gcmVhbGl6ZSB0aGF0LgotICBbZXh0ZW5zaW9uTWFwXyBzZXRPYmplY3Q6KGlkKXZhbHVlIGZvcktleTpleHRlbnNpb25dOwotCi0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBleHRlbnNpb247Ci0KLSAgaWYgKEdQQkV4dGVuc2lvbklzTWVzc2FnZShkZXNjcmlwdG9yKSAmJiAhZGVzY3JpcHRvci5pc1JlcGVhdGVkKSB7Ci0gICAgR1BCTWVzc2FnZSAqYXV0b2NyZWF0ZWRWYWx1ZSA9Ci0gICAgICAgIFtbYXV0b2NyZWF0ZWRFeHRlbnNpb25NYXBfIG9iamVjdEZvcktleTpleHRlbnNpb25dIHJldGFpbl07Ci0gICAgLy8gTXVzdCByZW1vdmUgZnJvbSB0aGUgbWFwIGJlZm9yZSBjYWxsaW5nIEdQQkNsZWFyTWVzc2FnZUF1dG9jcmVhdG9yKCkgc28KLSAgICAvLyB0aGF0IEdQQkNsZWFyTWVzc2FnZUF1dG9jcmVhdG9yKCkga25vd3MgaXRzIHNhZmUgdG8gY2xlYXIuCi0gICAgW2F1dG9jcmVhdGVkRXh0ZW5zaW9uTWFwXyByZW1vdmVPYmplY3RGb3JLZXk6ZXh0ZW5zaW9uXTsKLSAgICBHUEJDbGVhck1lc3NhZ2VBdXRvY3JlYXRvcihhdXRvY3JlYXRlZFZhbHVlKTsKLSAgICBbYXV0b2NyZWF0ZWRWYWx1ZSByZWxlYXNlXTsKLSAgfQotCi0gIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKHNlbGYpOwotfQotCi0tICh2b2lkKWFkZEV4dGVuc2lvbjooR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqKWV4dGVuc2lvbiB2YWx1ZTooaWQpdmFsdWUgewotICBDaGVja0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb24pOwotCi0gIGlmICghZXh0ZW5zaW9uLnJlcGVhdGVkKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiTXVzdCBjYWxsIHNldEV4dGVuc2lvbigpIGZvciBzaW5ndWxhciB0eXBlcy4iXTsKLSAgfQotCi0gIGlmIChleHRlbnNpb25NYXBfID09IG5pbCkgewotICAgIGV4dGVuc2lvbk1hcF8gPSBbW05TTXV0YWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICB9Ci0gIE5TTXV0YWJsZUFycmF5ICpsaXN0ID0gW2V4dGVuc2lvbk1hcF8gb2JqZWN0Rm9yS2V5OmV4dGVuc2lvbl07Ci0gIGlmIChsaXN0ID09IG5pbCkgewotICAgIGxpc3QgPSBbTlNNdXRhYmxlQXJyYXkgYXJyYXldOwotICAgIFtleHRlbnNpb25NYXBfIHNldE9iamVjdDpsaXN0IGZvcktleTpleHRlbnNpb25dOwotICB9Ci0KLSAgW2xpc3QgYWRkT2JqZWN0OnZhbHVlXTsKLSAgR1BCQmVjb21lVmlzaWJsZVRvQXV0b2NyZWF0b3Ioc2VsZik7Ci19Ci0KLS0gKHZvaWQpc2V0RXh0ZW5zaW9uOihHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopZXh0ZW5zaW9uCi0gICAgICAgICAgICAgICBpbmRleDooTlNVSW50ZWdlcilpZHgKLSAgICAgICAgICAgICAgIHZhbHVlOihpZCl2YWx1ZSB7Ci0gIENoZWNrRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik7Ci0KLSAgaWYgKCFleHRlbnNpb24ucmVwZWF0ZWQpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJNdXN0IGNhbGwgc2V0RXh0ZW5zaW9uKCkgZm9yIHNpbmd1bGFyIHR5cGVzLiJdOwotICB9Ci0KLSAgaWYgKGV4dGVuc2lvbk1hcF8gPT0gbmlsKSB7Ci0gICAgZXh0ZW5zaW9uTWFwXyA9IFtbTlNNdXRhYmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIH0KLQotICBOU011dGFibGVBcnJheSAqbGlzdCA9IFtleHRlbnNpb25NYXBfIG9iamVjdEZvcktleTpleHRlbnNpb25dOwotCi0gIFtsaXN0IHJlcGxhY2VPYmplY3RBdEluZGV4OmlkeCB3aXRoT2JqZWN0OnZhbHVlXTsKLSAgR1BCQmVjb21lVmlzaWJsZVRvQXV0b2NyZWF0b3Ioc2VsZik7Ci19Ci0KLS0gKHZvaWQpY2xlYXJFeHRlbnNpb246KEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKilleHRlbnNpb24gewotICBDaGVja0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb24pOwotCi0gIC8vIE9ubHkgYmVjb21lIHZpc2libGUgaWYgdGhlcmUgd2FzIGFjdHVhbGx5IGEgdmFsdWUgdG8gY2xlYXIuCi0gIGlmIChbZXh0ZW5zaW9uTWFwXyBvYmplY3RGb3JLZXk6ZXh0ZW5zaW9uXSkgewotICAgIFtleHRlbnNpb25NYXBfIHJlbW92ZU9iamVjdEZvcktleTpleHRlbnNpb25dOwotICAgIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKHNlbGYpOwotICB9Ci19Ci0KLSNwcmFnbWEgbWFyayAtIG1lcmdlRnJvbQotCi0tICh2b2lkKW1lcmdlRnJvbURhdGE6KE5TRGF0YSAqKWRhdGEKLSAgICBleHRlbnNpb25SZWdpc3RyeTooR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeSB7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW0gKmlucHV0ID0gW1tHUEJDb2RlZElucHV0U3RyZWFtIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YV07Ci0gIFtzZWxmIG1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06aW5wdXQgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnldOwotICBbaW5wdXQgY2hlY2tMYXN0VGFnV2FzOjBdOwotICBbaW5wdXQgcmVsZWFzZV07Ci19Ci0KLSNwcmFnbWEgbWFyayAtIG1lcmdlRGVsaW1pdGVkRnJvbQotCi0tICh2b2lkKW1lcmdlRGVsaW1pdGVkRnJvbUNvZGVkSW5wdXRTdHJlYW06KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OihHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5IHsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSA9ICZpbnB1dC0+c3RhdGVfOwotICBpZiAoR1BCQ29kZWRJbnB1dFN0cmVhbUlzQXRFbmQoc3RhdGUpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIE5TRGF0YSAqZGF0YSA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWRCeXRlc05vQ29weShzdGF0ZSk7Ci0gIGlmIChkYXRhID09IG5pbCkgewotICAgIHJldHVybjsKLSAgfQotICBbc2VsZiBtZXJnZUZyb21EYXRhOmRhdGEgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnldOwotICBbZGF0YSByZWxlYXNlXTsKLX0KLQotI3ByYWdtYSBtYXJrIC0gUGFyc2UgRnJvbSBEYXRhIFN1cHBvcnQKLQotKyAoaW5zdGFuY2V0eXBlKXBhcnNlRnJvbURhdGE6KE5TRGF0YSAqKWRhdGEgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3JQdHIgewotICByZXR1cm4gW3NlbGYgcGFyc2VGcm9tRGF0YTpkYXRhIGV4dGVuc2lvblJlZ2lzdHJ5Om5pbCBlcnJvcjplcnJvclB0cl07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlwYXJzZUZyb21EYXRhOihOU0RhdGEgKilkYXRhCi0gICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTooR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6KE5TRXJyb3IgKiopZXJyb3JQdHIgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEKLSAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTpleHRlbnNpb25SZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOmVycm9yUHRyXSBhdXRvcmVsZWFzZV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlwYXJzZUZyb21Db2RlZElucHV0U3RyZWFtOihHUEJDb2RlZElucHV0U3RyZWFtICopaW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OihHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjooTlNFcnJvciAqKillcnJvclB0ciB7Ci0gIHJldHVybgotICAgICAgW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhDb2RlZElucHV0U3RyZWFtOmlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjplcnJvclB0cl0gYXV0b3JlbGVhc2VdOwotfQotCi0jcHJhZ21hIG1hcmsgLSBQYXJzZSBEZWxpbWl0ZWQgRnJvbSBEYXRhIFN1cHBvcnQKLQotKyAoaW5zdGFuY2V0eXBlKXBhcnNlRGVsaW1pdGVkRnJvbUNvZGVkSW5wdXRTdHJlYW06KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOihOU0Vycm9yICoqKWVycm9yUHRyIHsKLSAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9IFtbW3NlbGYgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLSAgQHRyeSB7Ci0gICAgW21lc3NhZ2UgbWVyZ2VEZWxpbWl0ZWRGcm9tQ29kZWRJbnB1dFN0cmVhbTppbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnldOwotICAgIGlmIChlcnJvclB0cikgewotICAgICAgKmVycm9yUHRyID0gbmlsOwotICAgIH0KLSAgfQotICBAY2F0Y2ggKE5TRXhjZXB0aW9uICpleGNlcHRpb24pIHsKLSAgICBtZXNzYWdlID0gbmlsOwotICAgIGlmIChlcnJvclB0cikgewotICAgICAgKmVycm9yUHRyID0gTWVzc2FnZUVycm9yV2l0aFJlYXNvbihHUEJNZXNzYWdlRXJyb3JDb2RlTWFsZm9ybWVkRGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhjZXB0aW9uLnJlYXNvbik7Ci0gICAgfQotICB9Ci0jaWZkZWYgREVCVUcKLSAgaWYgKG1lc3NhZ2UgJiYgIW1lc3NhZ2UuaW5pdGlhbGl6ZWQpIHsKLSAgICBtZXNzYWdlID0gbmlsOwotICAgIGlmIChlcnJvclB0cikgewotICAgICAgKmVycm9yUHRyID0gTWVzc2FnZUVycm9yKEdQQk1lc3NhZ2VFcnJvckNvZGVNaXNzaW5nUmVxdWlyZWRGaWVsZCwgbmlsKTsKLSAgICB9Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotI3ByYWdtYSBtYXJrIC0gVW5rbm93biBGaWVsZCBTdXBwb3J0Ci0KLS0gKEdQQlVua25vd25GaWVsZFNldCAqKXVua25vd25GaWVsZHMgewotICByZXR1cm4gdW5rbm93bkZpZWxkc187Ci19Ci0KLS0gKHZvaWQpc2V0VW5rbm93bkZpZWxkczooR1BCVW5rbm93bkZpZWxkU2V0ICopdW5rbm93bkZpZWxkcyB7Ci0gIGlmICh1bmtub3duRmllbGRzICE9IHVua25vd25GaWVsZHNfKSB7Ci0gICAgW3Vua25vd25GaWVsZHNfIHJlbGVhc2VdOwotICAgIHVua25vd25GaWVsZHNfID0gW3Vua25vd25GaWVsZHMgY29weV07Ci0gICAgR1BCQmVjb21lVmlzaWJsZVRvQXV0b2NyZWF0b3Ioc2VsZik7Ci0gIH0KLX0KLQotLSAodm9pZClwYXJzZU1lc3NhZ2VTZXQ6KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dAotICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6KEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnkgewotICB1aW50MzJfdCB0eXBlSWQgPSAwOwotICBOU0RhdGEgKnJhd0J5dGVzID0gbmlsOwotICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24gPSBuaWw7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUgPSAmaW5wdXQtPnN0YXRlXzsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICB1aW50MzJfdCB0YWcgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFRhZyhzdGF0ZSk7Ci0gICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZiAodGFnID09IEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0VHlwZUlkVGFnKSB7Ci0gICAgICB0eXBlSWQgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZFVJbnQzMihzdGF0ZSk7Ci0gICAgICBpZiAodHlwZUlkICE9IDApIHsKLSAgICAgICAgZXh0ZW5zaW9uID0gW2V4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvbkZvckRlc2NyaXB0b3I6W3NlbGYgZGVzY3JpcHRvcl0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROdW1iZXI6dHlwZUlkXTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHRhZyA9PSBHUEJXaXJlRm9ybWF0TWVzc2FnZVNldE1lc3NhZ2VUYWcpIHsKLSAgICAgIHJhd0J5dGVzID0KLSAgICAgICAgICBbR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRSZXRhaW5lZEJ5dGVzTm9Db3B5KHN0YXRlKSBhdXRvcmVsZWFzZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghW2lucHV0IHNraXBGaWVsZDp0YWddKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIFtpbnB1dCBjaGVja0xhc3RUYWdXYXM6R1BCV2lyZUZvcm1hdE1lc3NhZ2VTZXRJdGVtRW5kVGFnXTsKLQotICBpZiAocmF3Qnl0ZXMgIT0gbmlsICYmIHR5cGVJZCAhPSAwKSB7Ci0gICAgaWYgKGV4dGVuc2lvbiAhPSBuaWwpIHsKLSAgICAgIEdQQkNvZGVkSW5wdXRTdHJlYW0gKm5ld0lucHV0ID0KLSAgICAgICAgICBbW0dQQkNvZGVkSW5wdXRTdHJlYW0gYWxsb2NdIGluaXRXaXRoRGF0YTpyYXdCeXRlc107Ci0gICAgICBHUEJFeHRlbnNpb25NZXJnZUZyb21JbnB1dFN0cmVhbShleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24ucGFja2FibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdJbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZik7Ci0gICAgICBbbmV3SW5wdXQgcmVsZWFzZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bkZpZWxkcyA9IEdldE9yTWFrZVVua25vd25GaWVsZHMoc2VsZik7Ci0gICAgICBbdW5rbm93bkZpZWxkcyBtZXJnZU1lc3NhZ2VTZXRNZXNzYWdlOnR5cGVJZCBkYXRhOnJhd0J5dGVzXTsKLSAgICB9Ci0gIH0KLX0KLQotLSAoQk9PTClwYXJzZVVua25vd25GaWVsZDooR1BCQ29kZWRJbnB1dFN0cmVhbSAqKWlucHV0Ci0gICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OihHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5Ci0gICAgICAgICAgICAgICAgICAgICAgdGFnOih1aW50MzJfdCl0YWcgewotICBHUEJXaXJlRm9ybWF0IHdpcmVUeXBlID0gR1BCV2lyZUZvcm1hdEdldFRhZ1dpcmVUeXBlKHRhZyk7Ci0gIGludDMyX3QgZmllbGROdW1iZXIgPSBHUEJXaXJlRm9ybWF0R2V0VGFnRmllbGROdW1iZXIodGFnKTsKLQotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW3NlbGYgZGVzY3JpcHRvcl07Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dGVuc2lvbiA9Ci0gICAgICBbZXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uRm9yRGVzY3JpcHRvcjpkZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZE51bWJlcjpmaWVsZE51bWJlcl07Ci0gIGlmIChleHRlbnNpb24gPT0gbmlsKSB7Ci0gICAgaWYgKGRlc2NyaXB0b3Iud2lyZUZvcm1hdCAmJiBHUEJXaXJlRm9ybWF0TWVzc2FnZVNldEl0ZW1UYWcgPT0gdGFnKSB7Ci0gICAgICBbc2VsZiBwYXJzZU1lc3NhZ2VTZXQ6aW5wdXQgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnldOwotICAgICAgcmV0dXJuIFlFUzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGV4dGVuc2lvbi53aXJlVHlwZSA9PSB3aXJlVHlwZSkgewotICAgICAgR1BCRXh0ZW5zaW9uTWVyZ2VGcm9tSW5wdXRTdHJlYW0oZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLnBhY2thYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYpOwotICAgICAgcmV0dXJuIFlFUzsKLSAgICB9Ci0gICAgLy8gUHJpbWl0aXZlLCByZXBlYXRlZCB0eXBlcyBjYW4gYmUgcGFja2VkIG9uIHVucGFja2VkIG9uIHRoZSB3aXJlLCBhbmQgYXJlCi0gICAgLy8gcGFyc2VkIGVpdGhlciB3YXkuCi0gICAgaWYgKFtleHRlbnNpb24gaXNSZXBlYXRlZF0gJiYKLSAgICAgICAgIUdQQkRhdGFUeXBlSXNPYmplY3QoZXh0ZW5zaW9uLT5kZXNjcmlwdGlvbl8tPmRhdGFUeXBlKSAmJgotICAgICAgICAoZXh0ZW5zaW9uLmFsdGVybmF0ZVdpcmVUeXBlID09IHdpcmVUeXBlKSkgewotICAgICAgR1BCRXh0ZW5zaW9uTWVyZ2VGcm9tSW5wdXRTdHJlYW0oZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWV4dGVuc2lvbi5wYWNrYWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmKTsKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgfQotICB9Ci0gIGlmIChbR1BCVW5rbm93bkZpZWxkU2V0IGlzRmllbGRUYWc6dGFnXSkgewotICAgIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bkZpZWxkcyA9IEdldE9yTWFrZVVua25vd25GaWVsZHMoc2VsZik7Ci0gICAgcmV0dXJuIFt1bmtub3duRmllbGRzIG1lcmdlRmllbGRGcm9tOnRhZyBpbnB1dDppbnB1dF07Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci19Ci0KLS0gKHZvaWQpYWRkVW5rbm93bk1hcEVudHJ5OihpbnQzMl90KWZpZWxkTnVtIHZhbHVlOihOU0RhdGEgKilkYXRhIHsKLSAgR1BCVW5rbm93bkZpZWxkU2V0ICp1bmtub3duRmllbGRzID0gR2V0T3JNYWtlVW5rbm93bkZpZWxkcyhzZWxmKTsKLSAgW3Vua25vd25GaWVsZHMgYWRkVW5rbm93bk1hcEVudHJ5OmZpZWxkTnVtIHZhbHVlOmRhdGFdOwotfQotCi0jcHJhZ21hIG1hcmsgLSBNZXJnZUZyb21Db2RlZElucHV0U3RyZWFtIFN1cHBvcnQKLQotc3RhdGljIHZvaWQgTWVyZ2VTaW5nbGVGaWVsZEZyb21Db2RlZElucHV0U3RyZWFtKAotICAgIEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIEdQQkZpbGVTeW50YXggc3ludGF4LAotICAgIEdQQkNvZGVkSW5wdXRTdHJlYW0gKmlucHV0LCBHUEJFeHRlbnNpb25SZWdpc3RyeSAqZXh0ZW5zaW9uUmVnaXN0cnkpIHsKLSAgR1BCRGF0YVR5cGUgZmllbGREYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGQpOwotICBzd2l0Y2ggKGZpZWxkRGF0YVR5cGUpIHsKLSNkZWZpbmUgQ0FTRV9TSU5HTEVfUE9EKE5BTUUsIFRZUEUsIEZVTkNfVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFRZUEUgdmFsID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWQjI05BTUUoJmlucHV0LT5zdGF0ZV8pOyAgICAgICAgICAgIFwKLSAgICAgIEdQQlNldCMjRlVOQ19UWVBFIyNJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIHZhbCwgc3ludGF4KTsgIFwKLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIH0KLSNkZWZpbmUgQ0FTRV9TSU5HTEVfT0JKRUNUKE5BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlkIHZhbCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWQjI05BTUUoJmlucHV0LT5zdGF0ZV8pOyAgICAgIFwKLSAgICAgIEdQQlNldFJldGFpbmVkT2JqZWN0SXZhcldpdGhGaWVsZEludGVybmFsKHNlbGYsIGZpZWxkLCB2YWwsIHN5bnRheCk7IFwKLSAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0gICAgICBDQVNFX1NJTkdMRV9QT0QoQm9vbCwgQk9PTCwgQm9vbCkKLSAgICAgIENBU0VfU0lOR0xFX1BPRChGaXhlZDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgQ0FTRV9TSU5HTEVfUE9EKFNGaXhlZDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgIENBU0VfU0lOR0xFX1BPRChGbG9hdCwgZmxvYXQsIEZsb2F0KQotICAgICAgQ0FTRV9TSU5HTEVfUE9EKEZpeGVkNjQsIHVpbnQ2NF90LCBVSW50NjQpCi0gICAgICBDQVNFX1NJTkdMRV9QT0QoU0ZpeGVkNjQsIGludDY0X3QsIEludDY0KQotICAgICAgQ0FTRV9TSU5HTEVfUE9EKERvdWJsZSwgZG91YmxlLCBEb3VibGUpCi0gICAgICBDQVNFX1NJTkdMRV9QT0QoSW50MzIsIGludDMyX3QsIEludDMyKQotICAgICAgQ0FTRV9TSU5HTEVfUE9EKEludDY0LCBpbnQ2NF90LCBJbnQ2NCkKLSAgICAgIENBU0VfU0lOR0xFX1BPRChTSW50MzIsIGludDMyX3QsIEludDMyKQotICAgICAgQ0FTRV9TSU5HTEVfUE9EKFNJbnQ2NCwgaW50NjRfdCwgSW50NjQpCi0gICAgICBDQVNFX1NJTkdMRV9QT0QoVUludDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgQ0FTRV9TSU5HTEVfUE9EKFVJbnQ2NCwgdWludDY0X3QsIFVJbnQ2NCkKLSAgICAgIENBU0VfU0lOR0xFX09CSkVDVChCeXRlcykKLSAgICAgIENBU0VfU0lOR0xFX09CSkVDVChTdHJpbmcpCi0jdW5kZWYgQ0FTRV9TSU5HTEVfUE9ECi0jdW5kZWYgQ0FTRV9TSU5HTEVfT0JKRUNUCi0KLSAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZTogewotICAgICAgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICAgICAgLy8gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZSgpIGF2b2lkcyBkb2luZyB0aGUgaGFzCi0gICAgICAgIC8vIGNoZWNrIGFnYWluLgotICAgICAgICBHUEJNZXNzYWdlICptZXNzYWdlID0KLSAgICAgICAgICAgIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgICBbaW5wdXQgcmVhZE1lc3NhZ2U6bWVzc2FnZSBleHRlbnNpb25SZWdpc3RyeTpleHRlbnNpb25SZWdpc3RyeV07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHUEJNZXNzYWdlICptZXNzYWdlID0gW1tmaWVsZC5tc2dDbGFzcyBhbGxvY10gaW5pdF07Ci0gICAgICAgIFtpbnB1dCByZWFkTWVzc2FnZTptZXNzYWdlIGV4dGVuc2lvblJlZ2lzdHJ5OmV4dGVuc2lvblJlZ2lzdHJ5XTsKLSAgICAgICAgR1BCU2V0UmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIG1lc3NhZ2UsIHN5bnRheCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEdQQkRhdGFUeXBlR3JvdXA6IHsKLSAgICAgIGlmIChHUEJHZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQpKSB7Ci0gICAgICAgIC8vIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoKSBhdm9pZHMgZG9pbmcgdGhlIGhhcwotICAgICAgICAvLyBjaGVjayBhZ2Fpbi4KLSAgICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9Ci0gICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgICAgW2lucHV0IHJlYWRHcm91cDpHUEJGaWVsZE51bWJlcihmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOm1lc3NhZ2UKLSAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OmV4dGVuc2lvblJlZ2lzdHJ5XTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEdQQk1lc3NhZ2UgKm1lc3NhZ2UgPSBbW2ZpZWxkLm1zZ0NsYXNzIGFsbG9jXSBpbml0XTsKLSAgICAgICAgW2lucHV0IHJlYWRHcm91cDpHUEJGaWVsZE51bWJlcihmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlOm1lc3NhZ2UKLSAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OmV4dGVuc2lvblJlZ2lzdHJ5XTsKLSAgICAgICAgR1BCU2V0UmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIG1lc3NhZ2UsIHN5bnRheCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEdQQkRhdGFUeXBlRW51bTogewotICAgICAgaW50MzJfdCB2YWwgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZEVudW0oJmlucHV0LT5zdGF0ZV8pOwotICAgICAgaWYgKEdQQkhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhzeW50YXgpIHx8Ci0gICAgICAgICAgW2ZpZWxkIGlzVmFsaWRFbnVtVmFsdWU6dmFsXSkgewotICAgICAgICBHUEJTZXRJbnQzMkl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgdmFsLCBzeW50YXgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgR1BCVW5rbm93bkZpZWxkU2V0ICp1bmtub3duRmllbGRzID0gR2V0T3JNYWtlVW5rbm93bkZpZWxkcyhzZWxmKTsKLSAgICAgICAgW3Vua25vd25GaWVsZHMgbWVyZ2VWYXJpbnRGaWVsZDpHUEJGaWVsZE51bWJlcihmaWVsZCkgdmFsdWU6dmFsXTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gIC8vIHN3aXRjaAotfQotCi1zdGF0aWMgdm9pZCBNZXJnZVJlcGVhdGVkUGFja2VkRmllbGRGcm9tQ29kZWRJbnB1dFN0cmVhbSgKLSAgICBHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBHUEJGaWxlU3ludGF4IHN5bnRheCwKLSAgICBHUEJDb2RlZElucHV0U3RyZWFtICppbnB1dCkgewotICBHUEJEYXRhVHlwZSBmaWVsZERhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUgPSAmaW5wdXQtPnN0YXRlXzsKLSAgaWQgZ2VuZXJpY0FycmF5ID0gR2V0T3JDcmVhdGVBcnJheUl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGQsIHN5bnRheCk7Ci0gIGludDMyX3QgbGVuZ3RoID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRJbnQzMihzdGF0ZSk7Ci0gIHNpemVfdCBsaW1pdCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1QdXNoTGltaXQoc3RhdGUsIGxlbmd0aCk7Ci0gIHdoaWxlIChHUEJDb2RlZElucHV0U3RyZWFtQnl0ZXNVbnRpbExpbWl0KHN0YXRlKSA+IDApIHsKLSAgICBzd2l0Y2ggKGZpZWxkRGF0YVR5cGUpIHsKLSNkZWZpbmUgQ0FTRV9SRVBFQVRFRF9QQUNLRURfUE9EKE5BTUUsIFRZUEUsIEFSUkFZX1RZUEUpICAgICAgXAotICAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgVFlQRSB2YWwgPSBHUEJDb2RlZElucHV0U3RyZWFtUmVhZCMjTkFNRShzdGF0ZSk7ICAgICAgIFwKLSAgICAgICBbKEdQQiMjQVJSQVlfVFlQRSMjQXJyYXkgKilnZW5lcmljQXJyYXkgYWRkVmFsdWU6dmFsXTsgXAotICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIH0KLSAgICAgICAgQ0FTRV9SRVBFQVRFRF9QQUNLRURfUE9EKEJvb2wsIEJPT0wsIEJvb2wpCi0gICAgICAgIENBU0VfUkVQRUFURURfUEFDS0VEX1BPRChGaXhlZDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgICBDQVNFX1JFUEVBVEVEX1BBQ0tFRF9QT0QoU0ZpeGVkMzIsIGludDMyX3QsIEludDMyKQotICAgICAgICBDQVNFX1JFUEVBVEVEX1BBQ0tFRF9QT0QoRmxvYXQsIGZsb2F0LCBGbG9hdCkKLSAgICAgICAgQ0FTRV9SRVBFQVRFRF9QQUNLRURfUE9EKEZpeGVkNjQsIHVpbnQ2NF90LCBVSW50NjQpCi0gICAgICAgIENBU0VfUkVQRUFURURfUEFDS0VEX1BPRChTRml4ZWQ2NCwgaW50NjRfdCwgSW50NjQpCi0gICAgICAgIENBU0VfUkVQRUFURURfUEFDS0VEX1BPRChEb3VibGUsIGRvdWJsZSwgRG91YmxlKQotICAgICAgICBDQVNFX1JFUEVBVEVEX1BBQ0tFRF9QT0QoSW50MzIsIGludDMyX3QsIEludDMyKQotICAgICAgICBDQVNFX1JFUEVBVEVEX1BBQ0tFRF9QT0QoSW50NjQsIGludDY0X3QsIEludDY0KQotICAgICAgICBDQVNFX1JFUEVBVEVEX1BBQ0tFRF9QT0QoU0ludDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgICAgQ0FTRV9SRVBFQVRFRF9QQUNLRURfUE9EKFNJbnQ2NCwgaW50NjRfdCwgSW50NjQpCi0gICAgICAgIENBU0VfUkVQRUFURURfUEFDS0VEX1BPRChVSW50MzIsIHVpbnQzMl90LCBVSW50MzIpCi0gICAgICAgIENBU0VfUkVQRUFURURfUEFDS0VEX1BPRChVSW50NjQsIHVpbnQ2NF90LCBVSW50NjQpCi0jdW5kZWYgQ0FTRV9SRVBFQVRFRF9QQUNLRURfUE9ECi0KLSAgICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6Ci0gICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDoKLSAgICAgICAgTlNDQXNzZXJ0KE5PLCBAIk5vbiBwcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkIik7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEdQQkRhdGFUeXBlRW51bTogewotICAgICAgICBpbnQzMl90IHZhbCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRW51bShzdGF0ZSk7Ci0gICAgICAgIGlmIChHUEJIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3Moc3ludGF4KSB8fAotICAgICAgICAgICAgW2ZpZWxkIGlzVmFsaWRFbnVtVmFsdWU6dmFsXSkgewotICAgICAgICAgIFsoR1BCRW51bUFycmF5KilnZW5lcmljQXJyYXkgYWRkUmF3VmFsdWU6dmFsXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBHUEJVbmtub3duRmllbGRTZXQgKnVua25vd25GaWVsZHMgPSBHZXRPck1ha2VVbmtub3duRmllbGRzKHNlbGYpOwotICAgICAgICAgIFt1bmtub3duRmllbGRzIG1lcmdlVmFyaW50RmllbGQ6R1BCRmllbGROdW1iZXIoZmllbGQpIHZhbHVlOnZhbF07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSAgLy8gc3dpdGNoCi0gIH0gIC8vIHdoaWxlKEJ5dGVzVW50aWxMaW1pdCgpID4gMCkKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbVBvcExpbWl0KHN0YXRlLCBsaW1pdCk7Ci19Ci0KLXN0YXRpYyB2b2lkIE1lcmdlUmVwZWF0ZWROb3RQYWNrZWRGaWVsZEZyb21Db2RlZElucHV0U3RyZWFtKAotICAgIEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIEdQQkZpbGVTeW50YXggc3ludGF4LAotICAgIEdQQkNvZGVkSW5wdXRTdHJlYW0gKmlucHV0LCBHUEJFeHRlbnNpb25SZWdpc3RyeSAqZXh0ZW5zaW9uUmVnaXN0cnkpIHsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbVN0YXRlICpzdGF0ZSA9ICZpbnB1dC0+c3RhdGVfOwotICBpZCBnZW5lcmljQXJyYXkgPSBHZXRPckNyZWF0ZUFycmF5SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgc3ludGF4KTsKLSAgc3dpdGNoIChHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKSkgewotI2RlZmluZSBDQVNFX1JFUEVBVEVEX05PVF9QQUNLRURfUE9EKE5BTUUsIFRZUEUsIEFSUkFZX1RZUEUpIFwKLSAgIGNhc2UgR1BCRGF0YVR5cGUjI05BTUU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgIFRZUEUgdmFsID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWQjI05BTUUoc3RhdGUpOyAgICAgICAgXAotICAgICBbKEdQQiMjQVJSQVlfVFlQRSMjQXJyYXkgKilnZW5lcmljQXJyYXkgYWRkVmFsdWU6dmFsXTsgIFwKLSAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB9Ci0jZGVmaW5lIENBU0VfUkVQRUFURURfTk9UX1BBQ0tFRF9PQkpFQ1QoTkFNRSkgICAgICAgICAgICAgICAgXAotICAgY2FzZSBHUEJEYXRhVHlwZSMjTkFNRTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgaWQgdmFsID0gR1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRSZXRhaW5lZCMjTkFNRShzdGF0ZSk7ICBcCi0gICAgIFsoTlNNdXRhYmxlQXJyYXkqKWdlbmVyaWNBcnJheSBhZGRPYmplY3Q6dmFsXTsgICAgICAgICAgXAotICAgICBbdmFsIHJlbGVhc2VdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICB9Ci0gICAgICBDQVNFX1JFUEVBVEVEX05PVF9QQUNLRURfUE9EKEJvb2wsIEJPT0wsIEJvb2wpCi0gICAgICBDQVNFX1JFUEVBVEVEX05PVF9QQUNLRURfUE9EKEZpeGVkMzIsIHVpbnQzMl90LCBVSW50MzIpCi0gICAgICBDQVNFX1JFUEVBVEVEX05PVF9QQUNLRURfUE9EKFNGaXhlZDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgIENBU0VfUkVQRUFURURfTk9UX1BBQ0tFRF9QT0QoRmxvYXQsIGZsb2F0LCBGbG9hdCkKLSAgICAgIENBU0VfUkVQRUFURURfTk9UX1BBQ0tFRF9QT0QoRml4ZWQ2NCwgdWludDY0X3QsIFVJbnQ2NCkKLSAgICAgIENBU0VfUkVQRUFURURfTk9UX1BBQ0tFRF9QT0QoU0ZpeGVkNjQsIGludDY0X3QsIEludDY0KQotICAgICAgQ0FTRV9SRVBFQVRFRF9OT1RfUEFDS0VEX1BPRChEb3VibGUsIGRvdWJsZSwgRG91YmxlKQotICAgICAgQ0FTRV9SRVBFQVRFRF9OT1RfUEFDS0VEX1BPRChJbnQzMiwgaW50MzJfdCwgSW50MzIpCi0gICAgICBDQVNFX1JFUEVBVEVEX05PVF9QQUNLRURfUE9EKEludDY0LCBpbnQ2NF90LCBJbnQ2NCkKLSAgICAgIENBU0VfUkVQRUFURURfTk9UX1BBQ0tFRF9QT0QoU0ludDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgIENBU0VfUkVQRUFURURfTk9UX1BBQ0tFRF9QT0QoU0ludDY0LCBpbnQ2NF90LCBJbnQ2NCkKLSAgICAgIENBU0VfUkVQRUFURURfTk9UX1BBQ0tFRF9QT0QoVUludDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgQ0FTRV9SRVBFQVRFRF9OT1RfUEFDS0VEX1BPRChVSW50NjQsIHVpbnQ2NF90LCBVSW50NjQpCi0gICAgICBDQVNFX1JFUEVBVEVEX05PVF9QQUNLRURfT0JKRUNUKEJ5dGVzKQotICAgICAgQ0FTRV9SRVBFQVRFRF9OT1RfUEFDS0VEX09CSkVDVChTdHJpbmcpCi0jdW5kZWYgQ0FTRV9SRVBFQVRFRF9OT1RfUEFDS0VEX1BPRAotI3VuZGVmIENBU0VfTk9UX1BBQ0tFRF9PQkpFQ1QKLSAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZTogewotICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9IFtbZmllbGQubXNnQ2xhc3MgYWxsb2NdIGluaXRdOwotICAgICAgW2lucHV0IHJlYWRNZXNzYWdlOm1lc3NhZ2UgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnldOwotICAgICAgWyhOU011dGFibGVBcnJheSopZ2VuZXJpY0FycmF5IGFkZE9iamVjdDptZXNzYWdlXTsKLSAgICAgIFttZXNzYWdlIHJlbGVhc2VdOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDogewotICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9IFtbZmllbGQubXNnQ2xhc3MgYWxsb2NdIGluaXRdOwotICAgICAgW2lucHV0IHJlYWRHcm91cDpHUEJGaWVsZE51bWJlcihmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTptZXNzYWdlCi0gICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6ZXh0ZW5zaW9uUmVnaXN0cnldOwotICAgICAgWyhOU011dGFibGVBcnJheSopZ2VuZXJpY0FycmF5IGFkZE9iamVjdDptZXNzYWdlXTsKLSAgICAgIFttZXNzYWdlIHJlbGVhc2VdOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOiB7Ci0gICAgICBpbnQzMl90IHZhbCA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkRW51bShzdGF0ZSk7Ci0gICAgICBpZiAoR1BCSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKHN5bnRheCkgfHwKLSAgICAgICAgICBbZmllbGQgaXNWYWxpZEVudW1WYWx1ZTp2YWxdKSB7Ci0gICAgICAgIFsoR1BCRW51bUFycmF5KilnZW5lcmljQXJyYXkgYWRkUmF3VmFsdWU6dmFsXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bkZpZWxkcyA9IEdldE9yTWFrZVVua25vd25GaWVsZHMoc2VsZik7Ci0gICAgICAgIFt1bmtub3duRmllbGRzIG1lcmdlVmFyaW50RmllbGQ6R1BCRmllbGROdW1iZXIoZmllbGQpIHZhbHVlOnZhbF07Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0gIC8vIHN3aXRjaAotfQotCi0tICh2b2lkKW1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dAotICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OihHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5IHsKLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtzZWxmIGRlc2NyaXB0b3JdOwotICBHUEJGaWxlU3ludGF4IHN5bnRheCA9IGRlc2NyaXB0b3IuZmlsZS5zeW50YXg7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUgPSAmaW5wdXQtPnN0YXRlXzsKLSAgdWludDMyX3QgdGFnID0gMDsKLSAgTlNVSW50ZWdlciBzdGFydGluZ0luZGV4ID0gMDsKLSAgTlNBcnJheSAqZmllbGRzID0gZGVzY3JpcHRvci0+ZmllbGRzXzsKLSAgTlNVSW50ZWdlciBudW1GaWVsZHMgPSBmaWVsZHMuY291bnQ7Ci0gIHdoaWxlIChZRVMpIHsKLSAgICBCT09MIG1lcmdlZCA9IE5POwotICAgIHRhZyA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkVGFnKHN0YXRlKTsKLSAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBudW1GaWVsZHM7ICsraSkgewotICAgICAgaWYgKHN0YXJ0aW5nSW5kZXggPj0gbnVtRmllbGRzKSBzdGFydGluZ0luZGV4ID0gMDsKLSAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGREZXNjcmlwdG9yID0gZmllbGRzW3N0YXJ0aW5nSW5kZXhdOwotICAgICAgaWYgKEdQQkZpZWxkVGFnKGZpZWxkRGVzY3JpcHRvcikgPT0gdGFnKSB7Ci0gICAgICAgIEdQQkZpZWxkVHlwZSBmaWVsZFR5cGUgPSBmaWVsZERlc2NyaXB0b3IuZmllbGRUeXBlOwotICAgICAgICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgICAgIE1lcmdlU2luZ2xlRmllbGRGcm9tQ29kZWRJbnB1dFN0cmVhbShzZWxmLCBmaWVsZERlc2NyaXB0b3IsIHN5bnRheCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAvLyBXZWxsIGZvcm1lZCBwcm90b3Mgd2lsbCBvbmx5IGhhdmUgYSBzaW5nbGUgZmllbGQgb25jZSwgYWR2YW5jZQotICAgICAgICAgIC8vIHRoZSBzdGFydGluZyBpbmRleCB0byB0aGUgbmV4dCBmaWVsZC4KLSAgICAgICAgICBzdGFydGluZ0luZGV4ICs9IDE7Ci0gICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICAgICAgaWYgKGZpZWxkRGVzY3JpcHRvci5pc1BhY2thYmxlKSB7Ci0gICAgICAgICAgICBNZXJnZVJlcGVhdGVkUGFja2VkRmllbGRGcm9tQ29kZWRJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBzZWxmLCBmaWVsZERlc2NyaXB0b3IsIHN5bnRheCwgaW5wdXQpOwotICAgICAgICAgICAgLy8gV2VsbCBmb3JtZWQgcHJvdG9zIHdpbGwgb25seSBoYXZlIGEgcmVwZWF0ZWQgZmllbGQgdGhhdCBpcwotICAgICAgICAgICAgLy8gcGFja2VkIG9uY2UsIGFkdmFuY2UgdGhlIHN0YXJ0aW5nIGluZGV4IHRvIHRoZSBuZXh0IGZpZWxkLgotICAgICAgICAgICAgc3RhcnRpbmdJbmRleCArPSAxOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBNZXJnZVJlcGVhdGVkTm90UGFja2VkRmllbGRGcm9tQ29kZWRJbnB1dFN0cmVhbSgKLSAgICAgICAgICAgICAgICBzZWxmLCBmaWVsZERlc2NyaXB0b3IsIHN5bnRheCwgaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7ICAvLyBmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgICAgLy8gR1BCKkRpY3Rpb25hcnkgb3IgTlNEaWN0aW9uYXJ5LCBleGFjdCB0eXBlIGRvZXNuJ3QgbWF0dGVyIGF0IHRoaXMKLSAgICAgICAgICAvLyBwb2ludC4KLSAgICAgICAgICBpZCBtYXAgPSBHZXRPckNyZWF0ZU1hcEl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGREZXNjcmlwdG9yLCBzeW50YXgpOwotICAgICAgICAgIFtpbnB1dCByZWFkTWFwRW50cnk6bWFwCi0gICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTpleHRlbnNpb25SZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQ6ZmllbGREZXNjcmlwdG9yCi0gICAgICAgICAgICAgICAgcGFyZW50TWVzc2FnZTpzZWxmXTsKLSAgICAgICAgfQotICAgICAgICBtZXJnZWQgPSBZRVM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RhcnRpbmdJbmRleCArPSAxOwotICAgICAgfQotICAgIH0gIC8vIGZvcihpIDwgbnVtRmllbGRzKQotCi0gICAgaWYgKCFtZXJnZWQpIHsKLSAgICAgIC8vIFByaW1pdGl2ZSwgcmVwZWF0ZWQgdHlwZXMgY2FuIGJlIHBhY2tlZCBvbiB1bnBhY2tlZCBvbiB0aGUgd2lyZSwgYW5kCi0gICAgICAvLyBhcmUgcGFyc2VkIGVpdGhlciB3YXkuICBUaGUgYWJvdmUgbG9vcCBjb3ZlcmVkIHRhZyBpbiB0aGUgcHJlZmVycmVkCi0gICAgICAvLyBmb3IsIHNvIHRoaXMgbmVlZCB0byBjaGVjayB0aGUgYWx0ZXJuYXRlIGZvcm0uCi0gICAgICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBudW1GaWVsZHM7ICsraSkgewotICAgICAgICBpZiAoc3RhcnRpbmdJbmRleCA+PSBudW1GaWVsZHMpIHN0YXJ0aW5nSW5kZXggPSAwOwotICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkRGVzY3JpcHRvciA9IGZpZWxkc1tzdGFydGluZ0luZGV4XTsKLSAgICAgICAgaWYgKChmaWVsZERlc2NyaXB0b3IuZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSAmJgotICAgICAgICAgICAgIUdQQkZpZWxkRGF0YVR5cGVJc09iamVjdChmaWVsZERlc2NyaXB0b3IpICYmCi0gICAgICAgICAgICAoR1BCRmllbGRBbHRlcm5hdGVUYWcoZmllbGREZXNjcmlwdG9yKSA9PSB0YWcpKSB7Ci0gICAgICAgICAgQk9PTCBhbHRlcm5hdGVJc1BhY2tlZCA9ICFmaWVsZERlc2NyaXB0b3IuaXNQYWNrYWJsZTsKLSAgICAgICAgICBpZiAoYWx0ZXJuYXRlSXNQYWNrZWQpIHsKLSAgICAgICAgICAgIE1lcmdlUmVwZWF0ZWRQYWNrZWRGaWVsZEZyb21Db2RlZElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgIHNlbGYsIGZpZWxkRGVzY3JpcHRvciwgc3ludGF4LCBpbnB1dCk7Ci0gICAgICAgICAgICAvLyBXZWxsIGZvcm1lZCBwcm90b3Mgd2lsbCBvbmx5IGhhdmUgYSByZXBlYXRlZCBmaWVsZCB0aGF0IGlzCi0gICAgICAgICAgICAvLyBwYWNrZWQgb25jZSwgYWR2YW5jZSB0aGUgc3RhcnRpbmcgaW5kZXggdG8gdGhlIG5leHQgZmllbGQuCi0gICAgICAgICAgICBzdGFydGluZ0luZGV4ICs9IDE7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIE1lcmdlUmVwZWF0ZWROb3RQYWNrZWRGaWVsZEZyb21Db2RlZElucHV0U3RyZWFtKAotICAgICAgICAgICAgICAgIHNlbGYsIGZpZWxkRGVzY3JpcHRvciwgc3ludGF4LCBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBtZXJnZWQgPSBZRVM7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RhcnRpbmdJbmRleCArPSAxOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFtZXJnZWQpIHsKLSAgICAgIGlmICh0YWcgPT0gMCkgewotICAgICAgICAvLyB6ZXJvIHNpZ25hbHMgRU9GIC8gbGltaXQgcmVhY2hlZAotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoR1BCUHJlc2VydmVVbmtub3duRmllbGRzKHN5bnRheCkpIHsKLSAgICAgICAgICBpZiAoIVtzZWxmIHBhcnNlVW5rbm93bkZpZWxkOmlucHV0Ci0gICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTpleHRlbnNpb25SZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWc6dGFnXSkgewotICAgICAgICAgICAgLy8gaXQncyBhbiBlbmRncm91cCB0YWcKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKCFbaW5wdXQgc2tpcEZpZWxkOnRhZ10pIHsKLSAgICAgICAgICAgIHJldHVybjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAvLyBpZighbWVyZ2VkKQotCi0gIH0gIC8vIHdoaWxlKFlFUykKLX0KLQotI3ByYWdtYSBtYXJrIC0gTWVyZ2VGcm9tIFN1cHBvcnQKLQotLSAodm9pZCltZXJnZUZyb206KEdQQk1lc3NhZ2UgKilvdGhlciB7Ci0gIENsYXNzIHNlbGZDbGFzcyA9IFtzZWxmIGNsYXNzXTsKLSAgQ2xhc3Mgb3RoZXJDbGFzcyA9IFtvdGhlciBjbGFzc107Ci0gIGlmICghKFtzZWxmQ2xhc3MgaXNTdWJjbGFzc09mQ2xhc3M6b3RoZXJDbGFzc10gfHwKLSAgICAgICAgW290aGVyQ2xhc3MgaXNTdWJjbGFzc09mQ2xhc3M6c2VsZkNsYXNzXSkpIHsKLSAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICBmb3JtYXQ6QCJDbGFzc2VzIG11c3QgbWF0Y2ggJUAgIT0gJUAiLCBzZWxmQ2xhc3MsIG90aGVyQ2xhc3NdOwotICB9Ci0KLSAgLy8gV2UgYXNzdW1lIHNvbWV0aGluZyB3aWxsIGJlIGRvbmUgYW5kIGJlY29tZSB2aXNpYmxlLgotICBHUEJCZWNvbWVWaXNpYmxlVG9BdXRvY3JlYXRvcihzZWxmKTsKLQotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW1tzZWxmIGNsYXNzXSBkZXNjcmlwdG9yXTsKLSAgR1BCRmlsZVN5bnRheCBzeW50YXggPSBkZXNjcmlwdG9yLmZpbGUuc3ludGF4OwotCi0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKSB7Ci0gICAgR1BCRmllbGRUeXBlIGZpZWxkVHlwZSA9IGZpZWxkLmZpZWxkVHlwZTsKLSAgICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgaW50MzJfdCBoYXNJbmRleCA9IEdQQkZpZWxkSGFzSW5kZXgoZmllbGQpOwotICAgICAgdWludDMyX3QgZmllbGROdW1iZXIgPSBHUEJGaWVsZE51bWJlcihmaWVsZCk7Ci0gICAgICBpZiAoIUdQQkdldEhhc0l2YXIob3RoZXIsIGhhc0luZGV4LCBmaWVsZE51bWJlcikpIHsKLSAgICAgICAgLy8gT3RoZXIgZG9lc24ndCBoYXZlIHRoZSBmaWVsZCBzZXQsIG9uIHRvIHRoZSBuZXh0LgotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIEdQQkRhdGFUeXBlIGZpZWxkRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgICAgIHN3aXRjaCAoZmllbGREYXRhVHlwZSkgewotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQm9vbDoKLSAgICAgICAgICBHUEJTZXRCb29sSXZhcldpdGhGaWVsZEludGVybmFsKAotICAgICAgICAgICAgICBzZWxmLCBmaWVsZCwgR1BCR2V0TWVzc2FnZUJvb2xGaWVsZChvdGhlciwgZmllbGQpLCBzeW50YXgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkMzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlSW50MzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6Ci0gICAgICAgICAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwoCi0gICAgICAgICAgICAgIHNlbGYsIGZpZWxkLCBHUEJHZXRNZXNzYWdlSW50MzJGaWVsZChvdGhlciwgZmllbGQpLCBzeW50YXgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQzMjoKLSAgICAgICAgICBHUEJTZXRVSW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwoCi0gICAgICAgICAgICAgIHNlbGYsIGZpZWxkLCBHUEJHZXRNZXNzYWdlVUludDMyRmllbGQob3RoZXIsIGZpZWxkKSwgc3ludGF4KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDY0OgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlSW50NjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50NjQ6Ci0gICAgICAgICAgR1BCU2V0SW50NjRJdmFyV2l0aEZpZWxkSW50ZXJuYWwoCi0gICAgICAgICAgICAgIHNlbGYsIGZpZWxkLCBHUEJHZXRNZXNzYWdlSW50NjRGaWVsZChvdGhlciwgZmllbGQpLCBzeW50YXgpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQ2NDoKLSAgICAgICAgICBHUEJTZXRVSW50NjRJdmFyV2l0aEZpZWxkSW50ZXJuYWwoCi0gICAgICAgICAgICAgIHNlbGYsIGZpZWxkLCBHUEJHZXRNZXNzYWdlVUludDY0RmllbGQob3RoZXIsIGZpZWxkKSwgc3ludGF4KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZsb2F0OgotICAgICAgICAgIEdQQlNldEZsb2F0SXZhcldpdGhGaWVsZEludGVybmFsKAotICAgICAgICAgICAgICBzZWxmLCBmaWVsZCwgR1BCR2V0TWVzc2FnZUZsb2F0RmllbGQob3RoZXIsIGZpZWxkKSwgc3ludGF4KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZURvdWJsZToKLSAgICAgICAgICBHUEJTZXREb3VibGVJdmFyV2l0aEZpZWxkSW50ZXJuYWwoCi0gICAgICAgICAgICAgIHNlbGYsIGZpZWxkLCBHUEJHZXRNZXNzYWdlRG91YmxlRmllbGQob3RoZXIsIGZpZWxkKSwgc3ludGF4KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOiB7Ci0gICAgICAgICAgaWQgb3RoZXJWYWwgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKG90aGVyLCBmaWVsZCk7Ci0gICAgICAgICAgR1BCU2V0T2JqZWN0SXZhcldpdGhGaWVsZEludGVybmFsKHNlbGYsIGZpZWxkLCBvdGhlclZhbCwgc3ludGF4KTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOiB7Ci0gICAgICAgICAgaWQgb3RoZXJWYWwgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKG90aGVyLCBmaWVsZCk7Ci0gICAgICAgICAgaWYgKEdQQkdldEhhc0l2YXIoc2VsZiwgaGFzSW5kZXgsIGZpZWxkTnVtYmVyKSkgewotICAgICAgICAgICAgR1BCTWVzc2FnZSAqbWVzc2FnZSA9Ci0gICAgICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgICAgICAgICBbbWVzc2FnZSBtZXJnZUZyb206b3RoZXJWYWxdOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBHUEJNZXNzYWdlICptZXNzYWdlID0gW290aGVyVmFsIGNvcHldOwotICAgICAgICAgICAgR1BCU2V0UmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW50YXgpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAvLyBzd2l0Y2goKQotICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgICAvLyBJbiB0aGUgY2FzZSBvZiBhIGxpc3QsIHRoZXkgbmVlZCB0byBiZSBhcHBlbmRlZCwgYW5kIHRoZXJlIGlzIG5vCi0gICAgICAvLyBfaGFzSXZhciB0byB3b3JyeSBhYm91dCBzZXR0aW5nLgotICAgICAgaWQgb3RoZXJBcnJheSA9Ci0gICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShvdGhlciwgZmllbGQpOwotICAgICAgaWYgKG90aGVyQXJyYXkpIHsKLSAgICAgICAgR1BCRGF0YVR5cGUgZmllbGREYXRhVHlwZSA9IGZpZWxkLT5kZXNjcmlwdGlvbl8tPmRhdGFUeXBlOwotICAgICAgICBpZiAoR1BCRGF0YVR5cGVJc09iamVjdChmaWVsZERhdGFUeXBlKSkgewotICAgICAgICAgIE5TTXV0YWJsZUFycmF5ICpyZXN1bHRBcnJheSA9Ci0gICAgICAgICAgICAgIEdldE9yQ3JlYXRlQXJyYXlJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkLCBzeW50YXgpOwotICAgICAgICAgIFtyZXN1bHRBcnJheSBhZGRPYmplY3RzRnJvbUFycmF5Om90aGVyQXJyYXldOwotICAgICAgICB9IGVsc2UgaWYgKGZpZWxkRGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVFbnVtKSB7Ci0gICAgICAgICAgR1BCRW51bUFycmF5ICpyZXN1bHRBcnJheSA9Ci0gICAgICAgICAgICAgIEdldE9yQ3JlYXRlQXJyYXlJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkLCBzeW50YXgpOwotICAgICAgICAgIFtyZXN1bHRBcnJheSBhZGRSYXdWYWx1ZXNGcm9tQXJyYXk6b3RoZXJBcnJheV07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhlIGFycmF5IHR5cGUgZG9lc24ndCBtYXR0ZXIsIHRoYXQgYWxsIGltcGxtZW50Ci0gICAgICAgICAgLy8gLWFkZFZhbHVlc0Zyb21BcnJheTouCi0gICAgICAgICAgR1BCSW50MzJBcnJheSAqcmVzdWx0QXJyYXkgPQotICAgICAgICAgICAgICBHZXRPckNyZWF0ZUFycmF5SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgc3ludGF4KTsKLSAgICAgICAgICBbcmVzdWx0QXJyYXkgYWRkVmFsdWVzRnJvbUFycmF5Om90aGVyQXJyYXldOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9IEdQQkZpZWxkVHlwZU1hcAotICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBtYXAsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQsIGFuZCB0aGVyZSBpcyBubwotICAgICAgLy8gX2hhc0l2YXIgdG8gd29ycnkgYWJvdXQgc2V0dGluZy4KLSAgICAgIGlkIG90aGVyRGljdCA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUob3RoZXIsIGZpZWxkKTsKLSAgICAgIGlmIChvdGhlckRpY3QpIHsKLSAgICAgICAgR1BCRGF0YVR5cGUga2V5RGF0YVR5cGUgPSBmaWVsZC5tYXBLZXlEYXRhVHlwZTsKLSAgICAgICAgR1BCRGF0YVR5cGUgdmFsdWVEYXRhVHlwZSA9IGZpZWxkLT5kZXNjcmlwdGlvbl8tPmRhdGFUeXBlOwotICAgICAgICBpZiAoR1BCRGF0YVR5cGVJc09iamVjdChrZXlEYXRhVHlwZSkgJiYKLSAgICAgICAgICAgIEdQQkRhdGFUeXBlSXNPYmplY3QodmFsdWVEYXRhVHlwZSkpIHsKLSAgICAgICAgICBOU011dGFibGVEaWN0aW9uYXJ5ICpyZXN1bHREaWN0ID0KLSAgICAgICAgICAgICAgR2V0T3JDcmVhdGVNYXBJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkLCBzeW50YXgpOwotICAgICAgICAgIFtyZXN1bHREaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpvdGhlckRpY3RdOwotICAgICAgICB9IGVsc2UgaWYgKHZhbHVlRGF0YVR5cGUgPT0gR1BCRGF0YVR5cGVFbnVtKSB7Ci0gICAgICAgICAgLy8gVGhlIGV4YWN0IHR5cGUgZG9lc24ndCBtYXR0ZXIsIGp1c3QgbmVlZCB0byBrbm93IGl0IGlzIGEKLSAgICAgICAgICAvLyBHUEIqRW51bURpY3Rpb25hcnkuCi0gICAgICAgICAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqcmVzdWx0RGljdCA9Ci0gICAgICAgICAgICAgIEdldE9yQ3JlYXRlTWFwSXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgc3ludGF4KTsKLSAgICAgICAgICBbcmVzdWx0RGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6b3RoZXJEaWN0XTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBUaGUgZXhhY3QgdHlwZSBkb2Vzbid0IG1hdHRlciwgdGhleSBhbGwgaW1wbGVtZW50Ci0gICAgICAgICAgLy8gLWFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTouCi0gICAgICAgICAgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKnJlc3VsdERpY3QgPQotICAgICAgICAgICAgICBHZXRPckNyZWF0ZU1hcEl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGQsIHN5bnRheCk7Ci0gICAgICAgICAgW3Jlc3VsdERpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5Om90aGVyRGljdF07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9ICAvLyBpZiAoZmllbGRUeXBlKS4uZWxzZSBpZi4uLmVsc2UKLSAgfSAgLy8gZm9yKGZpZWxkcykKLQotICAvLyBVbmtub3duIGZpZWxkcy4KLSAgaWYgKCF1bmtub3duRmllbGRzXykgewotICAgIFtzZWxmIHNldFVua25vd25GaWVsZHM6b3RoZXIudW5rbm93bkZpZWxkc107Ci0gIH0gZWxzZSB7Ci0gICAgW3Vua25vd25GaWVsZHNfIG1lcmdlVW5rbm93bkZpZWxkczpvdGhlci51bmtub3duRmllbGRzXTsKLSAgfQotCi0gIC8vIEV4dGVuc2lvbnMKLQotICBpZiAob3RoZXItPmV4dGVuc2lvbk1hcF8uY291bnQgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChleHRlbnNpb25NYXBfID09IG5pbCkgewotICAgIGV4dGVuc2lvbk1hcF8gPQotICAgICAgICBDbG9uZUV4dGVuc2lvbk1hcChvdGhlci0+ZXh0ZW5zaW9uTWFwXywgTlNab25lRnJvbVBvaW50ZXIoc2VsZikpOwotICB9IGVsc2UgewotICAgIGZvciAoR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqZXh0ZW5zaW9uIGluIG90aGVyLT5leHRlbnNpb25NYXBfKSB7Ci0gICAgICBpZCBvdGhlclZhbHVlID0gW290aGVyLT5leHRlbnNpb25NYXBfIG9iamVjdEZvcktleTpleHRlbnNpb25dOwotICAgICAgaWQgdmFsdWUgPSBbZXh0ZW5zaW9uTWFwXyBvYmplY3RGb3JLZXk6ZXh0ZW5zaW9uXTsKLSAgICAgIEJPT0wgaXNNZXNzYWdlRXh0ZW5zaW9uID0gR1BCRXh0ZW5zaW9uSXNNZXNzYWdlKGV4dGVuc2lvbik7Ci0KLSAgICAgIGlmIChleHRlbnNpb24ucmVwZWF0ZWQpIHsKLSAgICAgICAgTlNNdXRhYmxlQXJyYXkgKmxpc3QgPSB2YWx1ZTsKLSAgICAgICAgaWYgKGxpc3QgPT0gbmlsKSB7Ci0gICAgICAgICAgbGlzdCA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRdOwotICAgICAgICAgIFtleHRlbnNpb25NYXBfIHNldE9iamVjdDpsaXN0IGZvcktleTpleHRlbnNpb25dOwotICAgICAgICAgIFtsaXN0IHJlbGVhc2VdOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpc01lc3NhZ2VFeHRlbnNpb24pIHsKLSAgICAgICAgICBmb3IgKEdQQk1lc3NhZ2UgKm90aGVyTGlzdFZhbHVlIGluIG90aGVyVmFsdWUpIHsKLSAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmNvcGllZFZhbHVlID0gW290aGVyTGlzdFZhbHVlIGNvcHldOwotICAgICAgICAgICAgW2xpc3QgYWRkT2JqZWN0OmNvcGllZFZhbHVlXTsKLSAgICAgICAgICAgIFtjb3BpZWRWYWx1ZSByZWxlYXNlXTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgW2xpc3QgYWRkT2JqZWN0c0Zyb21BcnJheTpvdGhlclZhbHVlXTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGlzTWVzc2FnZUV4dGVuc2lvbikgewotICAgICAgICAgIGlmICh2YWx1ZSkgewotICAgICAgICAgICAgWyhHUEJNZXNzYWdlICopdmFsdWUgbWVyZ2VGcm9tOihHUEJNZXNzYWdlICopb3RoZXJWYWx1ZV07Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEdQQk1lc3NhZ2UgKmNvcGllZFZhbHVlID0gW290aGVyVmFsdWUgY29weV07Ci0gICAgICAgICAgICBbZXh0ZW5zaW9uTWFwXyBzZXRPYmplY3Q6Y29waWVkVmFsdWUgZm9yS2V5OmV4dGVuc2lvbl07Ci0gICAgICAgICAgICBbY29waWVkVmFsdWUgcmVsZWFzZV07Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFtleHRlbnNpb25NYXBfIHNldE9iamVjdDpvdGhlclZhbHVlIGZvcktleTpleHRlbnNpb25dOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChpc01lc3NhZ2VFeHRlbnNpb24gJiYgIWV4dGVuc2lvbi5pc1JlcGVhdGVkKSB7Ci0gICAgICAgIEdQQk1lc3NhZ2UgKmF1dG9jcmVhdGVkVmFsdWUgPQotICAgICAgICAgICAgW1thdXRvY3JlYXRlZEV4dGVuc2lvbk1hcF8gb2JqZWN0Rm9yS2V5OmV4dGVuc2lvbl0gcmV0YWluXTsKLSAgICAgICAgLy8gTXVzdCByZW1vdmUgZnJvbSB0aGUgbWFwIGJlZm9yZSBjYWxsaW5nIEdQQkNsZWFyTWVzc2FnZUF1dG9jcmVhdG9yKCkKLSAgICAgICAgLy8gc28gdGhhdCBHUEJDbGVhck1lc3NhZ2VBdXRvY3JlYXRvcigpIGtub3dzIGl0cyBzYWZlIHRvIGNsZWFyLgotICAgICAgICBbYXV0b2NyZWF0ZWRFeHRlbnNpb25NYXBfIHJlbW92ZU9iamVjdEZvcktleTpleHRlbnNpb25dOwotICAgICAgICBHUEJDbGVhck1lc3NhZ2VBdXRvY3JlYXRvcihhdXRvY3JlYXRlZFZhbHVlKTsKLSAgICAgICAgW2F1dG9jcmVhdGVkVmFsdWUgcmVsZWFzZV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLSNwcmFnbWEgbWFyayAtIGlzRXF1YWw6ICYgaGFzaCBTdXBwb3J0Ci0KLS0gKEJPT0wpaXNFcXVhbDooR1BCTWVzc2FnZSAqKW90aGVyIHsKLSAgaWYgKG90aGVyID09IHNlbGYpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIGlmICghW290aGVyIGlzS2luZE9mQ2xhc3M6W3NlbGYgY2xhc3NdXSAmJgotICAgICAgIVtzZWxmIGlzS2luZE9mQ2xhc3M6W290aGVyIGNsYXNzXV0pIHsKLSAgICByZXR1cm4gTk87Ci0gIH0KLQotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW1tzZWxmIGNsYXNzXSBkZXNjcmlwdG9yXTsKLSAgdWludDhfdCAqc2VsZlN0b3JhZ2UgPSAodWludDhfdCAqKW1lc3NhZ2VTdG9yYWdlXzsKLSAgdWludDhfdCAqb3RoZXJTdG9yYWdlID0gKHVpbnQ4X3QgKilvdGhlci0+bWVzc2FnZVN0b3JhZ2VfOwotCi0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKSB7Ci0gICAgaWYgKEdQQkZpZWxkSXNNYXBPckFycmF5KGZpZWxkKSkgewotICAgICAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBsaXN0IG9yIG1hcCwgdGhlcmUgaXMgbm8gX2hhc0l2YXIgdG8gd29ycnkgYWJvdXQuCi0gICAgICAvLyBOT1RFOiBUaGVzZSBhcmUgTlNBcnJheS9HUEIqQXJyYXkgb3IgTlNEaWN0aW9uYXJ5L0dQQipEaWN0aW9uYXJ5LCBidXQKLSAgICAgIC8vIHRoZSB0eXBlIGRvZXNuJ3QgcmVhbGx5IG1hdHRlciBhcyB0aGUgb2JqZWN0cyBhbGwgc3VwcG9ydCAtY291bnQgYW5kCi0gICAgICAvLyAtaXNFcXVhbDouCi0gICAgICBOU0FycmF5ICpyZXN1bHRNYXBPckFycmF5ID0KLSAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgICAgIE5TQXJyYXkgKm90aGVyTWFwT3JBcnJheSA9Ci0gICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShvdGhlciwgZmllbGQpOwotICAgICAgLy8gbmlsIGFuZCBlbXB0eSBhcmUgZXF1YWwKLSAgICAgIGlmIChyZXN1bHRNYXBPckFycmF5LmNvdW50ICE9IDAgfHwgb3RoZXJNYXBPckFycmF5LmNvdW50ICE9IDApIHsKLSAgICAgICAgaWYgKCFbcmVzdWx0TWFwT3JBcnJheSBpc0VxdWFsOm90aGVyTWFwT3JBcnJheV0pIHsKLSAgICAgICAgICByZXR1cm4gTk87Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgeyAgLy8gU2luZ2xlIGZpZWxkCi0gICAgICBpbnQzMl90IGhhc0luZGV4ID0gR1BCRmllbGRIYXNJbmRleChmaWVsZCk7Ci0gICAgICB1aW50MzJfdCBmaWVsZE51bSA9IEdQQkZpZWxkTnVtYmVyKGZpZWxkKTsKLSAgICAgIEJPT0wgc2VsZkhhcyA9IEdQQkdldEhhc0l2YXIoc2VsZiwgaGFzSW5kZXgsIGZpZWxkTnVtKTsKLSAgICAgIEJPT0wgb3RoZXJIYXMgPSBHUEJHZXRIYXNJdmFyKG90aGVyLCBoYXNJbmRleCwgZmllbGROdW0pOwotICAgICAgaWYgKHNlbGZIYXMgIT0gb3RoZXJIYXMpIHsKLSAgICAgICAgcmV0dXJuIE5POyAgLy8gRGlmZmVyaW5nIGhhcyB2YWx1ZXMsIG5vdCBlcXVhbC4KLSAgICAgIH0KLSAgICAgIGlmICghc2VsZkhhcykgewotICAgICAgICAvLyBTYW1lIGhhcyB2YWx1ZXMsIHdhcyBubywgbm90aGluZyBlbHNlIHRvIGNoZWNrIGZvciB0aGlzIGZpZWxkLgotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0KLSAgICAgIC8vIE5vdyBjb21wYXJlIHRoZSB2YWx1ZXMuCi0gICAgICBHUEJEYXRhVHlwZSBmaWVsZERhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gICAgICBzaXplX3QgZmllbGRPZmZzZXQgPSBmaWVsZC0+ZGVzY3JpcHRpb25fLT5vZmZzZXQ7Ci0gICAgICBzd2l0Y2ggKGZpZWxkRGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJvb2w6IHsKLSAgICAgICAgICAvLyBCb29scyBhcmUgc3RvcmVkIGluIGhhc19iaXRzIHRvIGF2b2lkIG5lZWRpbmcgZXhwbGljaXQgc3BhY2UgaW4KLSAgICAgICAgICAvLyB0aGUgc3RvcmFnZSBzdHJ1Y3R1cmUuCi0gICAgICAgICAgLy8gKHRoZSBmaWVsZCBudW1iZXIgcGFzc2VkIHRvIHRoZSBIYXNJdmFyIGhlbHBlciBkb2Vzbid0IHJlYWxseQotICAgICAgICAgIC8vIG1hdHRlciBzaW5jZSB0aGUgb2Zmc2V0IGlzIG5ldmVyIG5lZ2F0aXZlKQotICAgICAgICAgIEJPT0wgc2VsZlZhbHVlID0gR1BCR2V0SGFzSXZhcihzZWxmLCAoaW50MzJfdCkoZmllbGRPZmZzZXQpLCAwKTsKLSAgICAgICAgICBCT09MIG90aGVyVmFsdWUgPSBHUEJHZXRIYXNJdmFyKG90aGVyLCAoaW50MzJfdCkoZmllbGRPZmZzZXQpLCAwKTsKLSAgICAgICAgICBpZiAoc2VsZlZhbHVlICE9IG90aGVyVmFsdWUpIHsKLSAgICAgICAgICAgIHJldHVybiBOTzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlSW50MzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50MzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZsb2F0OiB7Ci0gICAgICAgICAgX0dQQkNvbXBpbGVBc3NlcnQoc2l6ZW9mKGZsb2F0KSA9PSBzaXplb2YodWludDMyX3QpLCBmbG9hdF9ub3RfMzJfYml0cyk7Ci0gICAgICAgICAgLy8gVGhlc2UgYXJlIGFsbCAzMmJpdCwgc2lnbmVkL3Vuc2lnbmVkIGRvZXNuJ3QgbWF0dGVyIGZvciBlcXVhbGl0eS4KLSAgICAgICAgICB1aW50MzJfdCAqc2VsZlZhbFB0ciA9ICh1aW50MzJfdCAqKSZzZWxmU3RvcmFnZVtmaWVsZE9mZnNldF07Ci0gICAgICAgICAgdWludDMyX3QgKm90aGVyVmFsUHRyID0gKHVpbnQzMl90ICopJm90aGVyU3RvcmFnZVtmaWVsZE9mZnNldF07Ci0gICAgICAgICAgaWYgKCpzZWxmVmFsUHRyICE9ICpvdGhlclZhbFB0cikgewotICAgICAgICAgICAgcmV0dXJuIE5POwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50NjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6IHsKLSAgICAgICAgICBfR1BCQ29tcGlsZUFzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCBkb3VibGVfbm90XzY0X2JpdHMpOwotICAgICAgICAgIC8vIFRoZXNlIGFyZSBhbGwgNjRiaXQsIHNpZ25lZC91bnNpZ25lZCBkb2Vzbid0IG1hdHRlciBmb3IgZXF1YWxpdHkuCi0gICAgICAgICAgdWludDY0X3QgKnNlbGZWYWxQdHIgPSAodWludDY0X3QgKikmc2VsZlN0b3JhZ2VbZmllbGRPZmZzZXRdOwotICAgICAgICAgIHVpbnQ2NF90ICpvdGhlclZhbFB0ciA9ICh1aW50NjRfdCAqKSZvdGhlclN0b3JhZ2VbZmllbGRPZmZzZXRdOwotICAgICAgICAgIGlmICgqc2VsZlZhbFB0ciAhPSAqb3RoZXJWYWxQdHIpIHsKLSAgICAgICAgICAgIHJldHVybiBOTzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOiB7Ci0gICAgICAgICAgLy8gVHlwZSBkb2Vzbid0IG1hdHRlciBoZXJlLCB0aGV5IGFsbCBpbXBsZW1lbnQgLWlzRXF1YWw6LgotICAgICAgICAgIGlkICpzZWxmVmFsUHRyID0gKGlkICopJnNlbGZTdG9yYWdlW2ZpZWxkT2Zmc2V0XTsKLSAgICAgICAgICBpZCAqb3RoZXJWYWxQdHIgPSAoaWQgKikmb3RoZXJTdG9yYWdlW2ZpZWxkT2Zmc2V0XTsKLSAgICAgICAgICBpZiAoIVsqc2VsZlZhbFB0ciBpc0VxdWFsOipvdGhlclZhbFB0cl0pIHsKLSAgICAgICAgICAgIHJldHVybiBOTzsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0gLy8gc3dpdGNoKCkKLSAgICB9ICAgLy8gaWYobWFwT3JBcnJheSkuLi5lbHNlCi0gIH0gIC8vIGZvcihmaWVsZHMpCi0KLSAgLy8gbmlsIGFuZCBlbXB0eSBhcmUgZXF1YWwKLSAgaWYgKGV4dGVuc2lvbk1hcF8uY291bnQgIT0gMCB8fCBvdGhlci0+ZXh0ZW5zaW9uTWFwXy5jb3VudCAhPSAwKSB7Ci0gICAgaWYgKCFbZXh0ZW5zaW9uTWFwXyBpc0VxdWFsOm90aGVyLT5leHRlbnNpb25NYXBfXSkgewotICAgICAgcmV0dXJuIE5POwotICAgIH0KLSAgfQotCi0gIC8vIG5pbCBhbmQgZW1wdHkgYXJlIGVxdWFsCi0gIEdQQlVua25vd25GaWVsZFNldCAqb3RoZXJVbmtub3ducyA9IG90aGVyLT51bmtub3duRmllbGRzXzsKLSAgaWYgKFt1bmtub3duRmllbGRzXyBjb3VudE9mRmllbGRzXSAhPSAwIHx8Ci0gICAgICBbb3RoZXJVbmtub3ducyBjb3VudE9mRmllbGRzXSAhPSAwKSB7Ci0gICAgaWYgKCFbdW5rbm93bkZpZWxkc18gaXNFcXVhbDpvdGhlclVua25vd25zXSkgewotICAgICAgcmV0dXJuIE5POwotICAgIH0KLSAgfQotCi0gIHJldHVybiBZRVM7Ci19Ci0KLS8vIEl0IGlzIHZlcnkgZGlmZmljdWx0IHRvIGltcGxlbWVudCBhIGdlbmVyaWMgaGFzaCBmb3IgUHJvdG9CdWYgbWVzc2FnZXMgdGhhdAotLy8gd2lsbCBwZXJmb3JtIHdlbGwuIElmIHlvdSBuZWVkIGhhc2hpbmcgb24geW91ciBQcm90b0J1ZnMgKGVnIHlvdSBhcmUgdXNpbmcKLS8vIHRoZW0gYXMgZGljdGlvbmFyeSBrZXlzKSB5b3Ugd2lsbCBwcm9iYWJseSB3YW50IHRvIGltcGxlbWVudCBhIFByb3RvQnVmCi0vLyBtZXNzYWdlIHNwZWNpZmljIGhhc2ggYXMgYSBjYXRlZ29yeSBvbiB5b3VyIHByb3RvYnVmIGNsYXNzLiBEbyBub3QgbWFrZSBpdCBhCi0vLyBjYXRlZ29yeSBvbiBHUEJNZXNzYWdlIGFzIHlvdSB3aWxsIGNvbmZsaWN0IHdpdGggdGhpcyBoYXNoLCBhbmQgd2lsbCBwb3NzaWJseQotLy8gb3ZlcnJpZGUgaGFzaCBmb3IgYWxsIGdlbmVyYXRlZCBwcm90b2J1ZnMuIEEgZ29vZCBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoIHdpbGwKLS8vIGJlIHJlYWxseSBmYXN0LCBzbyB3ZSB3b3VsZCByZWNvbW1lbmQgb25seSBoYXNoaW5nIHByb3RvYnVmcyB0aGF0IGhhdmUgYW4KLS8vIGlkZW50aWZpZXIgZmllbGQgb2Ygc29tZSBraW5kIHRoYXQgeW91IGNhbiBlYXNpbHkgaGFzaC4gSWYgeW91IGltcGxlbWVudAotLy8gaGFzaCwgd2Ugd291bGQgc3Ryb25nbHkgcmVjb21tZW5kIG92ZXJyaWRpbmcgaXNFcXVhbDogaW4geW91ciBjYXRlZ29yeSBhcwotLy8gd2VsbCwgYXMgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgaXNFcXVhbDogaXMgZXh0cmVtZWx5IHNsb3csIGFuZCBtYXkKLS8vIGRyYXN0aWNhbGx5IGFmZmVjdCBwZXJmb3JtYW5jZSBpbiBsYXJnZSBzZXRzLgotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtbc2VsZiBjbGFzc10gZGVzY3JpcHRvcl07Ci0gIGNvbnN0IE5TVUludGVnZXIgcHJpbWUgPSAxOTsKLSAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopbWVzc2FnZVN0b3JhZ2VfOwotCi0gIC8vIFN0YXJ0IHdpdGggdGhlIGRlc2NyaXB0b3IgYW5kIHRoZW4gbWl4IGl0IHdpdGggc29tZSBpbnN0YW5jZSBpbmZvLgotICAvLyBIb3BlZnVsbHkgdGhhdCB3aWxsIGdpdmUgYSBzcHJlYWQgYmFzZWQgb24gY2xhc3NlcyBhbmQgd2hhdCBmaWVsZHMgYXJlIHNldC4KLSAgTlNVSW50ZWdlciByZXN1bHQgPSAoTlNVSW50ZWdlcilkZXNjcmlwdG9yOwotCi0gIGZvciAoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKSB7Ci0gICAgaWYgKEdQQkZpZWxkSXNNYXBPckFycmF5KGZpZWxkKSkgewotICAgICAgLy8gRXhhY3QgdHlwZSBkb2Vzbid0IG1hdHRlciwganVzdCBjaGVjayBpZiB0aGVyZSBhcmUgYW55IGVsZW1lbnRzLgotICAgICAgTlNBcnJheSAqbWFwT3JBcnJheSA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoc2VsZiwgZmllbGQpOwotICAgICAgTlNVSW50ZWdlciBjb3VudCA9IG1hcE9yQXJyYXkuY291bnQ7Ci0gICAgICBpZiAoY291bnQpIHsKLSAgICAgICAgLy8gTlNBcnJheS9OU0RpY3Rpb25hcnkgdXNlIGNvdW50LCB1c2UgdGhlIGZpZWxkIG51bWJlciBhbmQgdGhlIGNvdW50LgotICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIEdQQkZpZWxkTnVtYmVyKGZpZWxkKTsKLSAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBjb3VudDsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICAgIC8vIEp1c3QgdXNpbmcgdGhlIGZpZWxkIG51bWJlciBzZWVtZWQgc2ltcGxlL2Zhc3QsIGJ1dCB0aGVuIGEgc21hbGwKLSAgICAgIC8vIG1lc3NhZ2UgY2xhc3Mgd2hlcmUgYWxsIHRoZSBzYW1lIGZpZWxkcyBhcmUgYWx3YXlzIHNldCAodG8gZGlmZmVyZW50Ci0gICAgICAvLyB0aGluZ3Mgd291bGQgZW5kIHVwIGFsbCB3aXRoIHRoZSBzYW1lIGhhc2gsIHNvIHB1bGwgaW4gc29tZSBkYXRhKS4KLSAgICAgIEdQQkRhdGFUeXBlIGZpZWxkRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgICAgIHNpemVfdCBmaWVsZE9mZnNldCA9IGZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldDsKLSAgICAgIHN3aXRjaCAoZmllbGREYXRhVHlwZSkgewotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQm9vbDogewotICAgICAgICAgIC8vIEJvb2xzIGFyZSBzdG9yZWQgaW4gaGFzX2JpdHMgdG8gYXZvaWQgbmVlZGluZyBleHBsaWNpdCBzcGFjZSBpbgotICAgICAgICAgIC8vIHRoZSBzdG9yYWdlIHN0cnVjdHVyZS4KLSAgICAgICAgICAvLyAodGhlIGZpZWxkIG51bWJlciBwYXNzZWQgdG8gdGhlIEhhc0l2YXIgaGVscGVyIGRvZXNuJ3QgcmVhbGx5Ci0gICAgICAgICAgLy8gbWF0dGVyIHNpbmNlIHRoZSBvZmZzZXQgaXMgbmV2ZXIgbmVnYXRpdmUpCi0gICAgICAgICAgQk9PTCB2YWx1ZSA9IEdQQkdldEhhc0l2YXIoc2VsZiwgKGludDMyX3QpKGZpZWxkT2Zmc2V0KSwgMCk7Ci0gICAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyB2YWx1ZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkMzI6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQzMjoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUVudW06Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlVUludDMyOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRmxvYXQ6IHsKLSAgICAgICAgICBfR1BCQ29tcGlsZUFzc2VydChzaXplb2YoZmxvYXQpID09IHNpemVvZih1aW50MzJfdCksIGZsb2F0X25vdF8zMl9iaXRzKTsKLSAgICAgICAgICAvLyBUaGVzZSBhcmUgYWxsIDMyYml0LCBqdXN0IG1peCBpdCBpbi4KLSAgICAgICAgICB1aW50MzJfdCAqdmFsUHRyID0gKHVpbnQzMl90ICopJnN0b3JhZ2VbZmllbGRPZmZzZXRdOwotICAgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKnZhbFB0cjsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQ2NDoKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50NjQ6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6IHsKLSAgICAgICAgICBfR1BCQ29tcGlsZUFzc2VydChzaXplb2YoZG91YmxlKSA9PSBzaXplb2YodWludDY0X3QpLCBkb3VibGVfbm90XzY0X2JpdHMpOwotICAgICAgICAgIC8vIFRoZXNlIGFyZSBhbGwgNjRiaXQsIGp1c3QgbWl4IHdoYXQgZml0cyBpbnRvIGFuIE5TVUludGVnZXIgaW4uCi0gICAgICAgICAgdWludDY0X3QgKnZhbFB0ciA9ICh1aW50NjRfdCAqKSZzdG9yYWdlW2ZpZWxkT2Zmc2V0XTsKLSAgICAgICAgICByZXN1bHQgPSBwcmltZSAqIHJlc3VsdCArIChOU1VJbnRlZ2VyKSgqdmFsUHRyKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQnl0ZXM6Ci0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6IHsKLSAgICAgICAgICAvLyBUeXBlIGRvZXNuJ3QgbWF0dGVyIGhlcmUsIHRoZXkgYm90aCBpbXBsZW1lbnQgLWhhc2g6LgotICAgICAgICAgIGlkICp2YWxQdHIgPSAoaWQgKikmc3RvcmFnZVtmaWVsZE9mZnNldF07Ci0gICAgICAgICAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBbKnZhbFB0ciBoYXNoXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlR3JvdXA6IHsKLSAgICAgICAgICBHUEJNZXNzYWdlICoqdmFsUHRyID0gKEdQQk1lc3NhZ2UgKiopJnN0b3JhZ2VbZmllbGRPZmZzZXRdOwotICAgICAgICAgIC8vIENvdWxkIGNhbGwgLWhhc2ggb24gdGhlIHN1YiBtZXNzYWdlLCBidXQgdGhhdCBjb3VsZCByZWN1cnNlIHByZXR0eQotICAgICAgICAgIC8vIGRlZXA7IGZvbGxvdyB0aGUgbGVhZCBvZiBOU0FycmF5L05TRGljdGlvbmFyeSBhbmQgZG9uJ3QgcmVhbGx5Ci0gICAgICAgICAgLy8gcmVjdXJzZSBmb3IgaGFzaCwgaW5zdGVhZCB1c2UgdGhlIGZpZWxkIG51bWJlciBhbmQgdGhlIGRlc2NyaXB0b3IKLSAgICAgICAgICAvLyBvZiB0aGUgc3ViIG1lc3NhZ2UuICBZZXMsIHRoaXMgY291bGQgc3VjayBmb3IgYSBidW5jaCBvZiBtZXNzYWdlcwotICAgICAgICAgIC8vIHdoZXJlIHRoZXkgYWxsIG9ubHkgZGlmZmVyIGluIHRoZSBzdWIgbWVzc2FnZXMsIGJ1dCBpZiB5b3UgYXJlCi0gICAgICAgICAgLy8gdXNpbmcgYSBtZXNzYWdlIHdpdGggc3ViIG1lc3NhZ2VzIGZvciBzb21ldGhpbmcgdGhhdCBuZWVkcyAtaGFzaCwKLSAgICAgICAgICAvLyBvZGRzIGFyZSB5b3UgYXJlIGFsc28gY29weWluZyB0aGVtIGFzIGtleXMsIGFuZCB0aGF0IGRlZXAgY29weQotICAgICAgICAgIC8vIHdpbGwgYWxzbyBzdWNrLgotICAgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgR1BCRmllbGROdW1iZXIoZmllbGQpOwotICAgICAgICAgIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgKE5TVUludGVnZXIpW1sqdmFsUHRyIGNsYXNzXSBkZXNjcmlwdG9yXTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfSAvLyBzd2l0Y2goKQotICAgIH0KLSAgfQotCi0gIC8vIFVua25vd25zIGFuZCBleHRlbnNpb25zIGFyZSBub3QgaW5jbHVkZWQuCi0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotI3ByYWdtYSBtYXJrIC0gRGVzY3JpcHRpb24gU3VwcG9ydAotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgTlNTdHJpbmcgKnRleHRGb3JtYXQgPSBHUEJUZXh0Rm9ybWF0Rm9yTWVzc2FnZShzZWxmLCBAIiAgICAiKTsKLSAgTlNTdHJpbmcgKmRlc2NyaXB0aW9uID0gW05TU3RyaW5nCi0gICAgICBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPjoge1xuJUB9IiwgW3NlbGYgY2xhc3NdLCBzZWxmLCB0ZXh0Rm9ybWF0XTsKLSAgcmV0dXJuIGRlc2NyaXB0aW9uOwotfQotCi0jaWYgREVCVUcKLQotLy8gWGNvZGUgNS4xIGFkZGVkIHN1cHBvcnQgZm9yIGN1c3RvbSBxdWljayBsb29rIGluZm8uCi0vLyBodHRwczovL2RldmVsb3Blci5hcHBsZS5jb20vbGlicmFyeS9pb3MvZG9jdW1lbnRhdGlvbi9JREVzL0NvbmNlcHR1YWwvQ3VzdG9tQ2xhc3NEaXNwbGF5X2luX1F1aWNrTG9vay9DSDAxLXF1aWNrX2xvb2tfZm9yX2N1c3RvbV9vYmplY3RzL0NIMDEtcXVpY2tfbG9va19mb3JfY3VzdG9tX29iamVjdHMuaHRtbCMvL2FwcGxlX3JlZi9kb2MvdWlkL1RQNDAwMTQwMDEtQ0gyLVNXMQotLSAoaWQpZGVidWdRdWlja0xvb2tPYmplY3QgewotICByZXR1cm4gR1BCVGV4dEZvcm1hdEZvck1lc3NhZ2Uoc2VsZiwgbmlsKTsKLX0KLQotI2VuZGlmICAvLyBERUJVRwotCi0jcHJhZ21hIG1hcmsgLSBTZXJpYWxpemVkU2l6ZQotCi0tIChzaXplX3Qpc2VyaWFsaXplZFNpemUgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW1tzZWxmIGNsYXNzXSBkZXNjcmlwdG9yXTsKLSAgc2l6ZV90IHJlc3VsdCA9IDA7Ci0KLSAgLy8gSGFzIGNoZWNrIGlzIGRvbmUgZXhwbGljaXRseSwgc28gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZSgpCi0gIC8vIGF2b2lkcyBkb2luZyB0aGUgaGFzIGNoZWNrIGFnYWluLgotCi0gIC8vIEZpZWxkcy4KLSAgZm9yIChHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkRGVzY3JpcHRvciBpbiBkZXNjcmlwdG9yLT5maWVsZHNfKSB7Ci0gICAgR1BCRmllbGRUeXBlIGZpZWxkVHlwZSA9IGZpZWxkRGVzY3JpcHRvci5maWVsZFR5cGU7Ci0gICAgR1BCRGF0YVR5cGUgZmllbGREYXRhVHlwZSA9IEdQQkdldEZpZWxkRGF0YVR5cGUoZmllbGREZXNjcmlwdG9yKTsKLQotICAgIC8vIFNpbmdsZSBGaWVsZHMKLSAgICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZVNpbmdsZSkgewotICAgICAgQk9PTCBzZWxmSGFzID0gR1BCR2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICBpZiAoIXNlbGZIYXMpIHsKLSAgICAgICAgY29udGludWU7ICAvLyBOb3RoaW5nIHRvIGRvLgotICAgICAgfQotCi0gICAgICB1aW50MzJfdCBmaWVsZE51bWJlciA9IEdQQkZpZWxkTnVtYmVyKGZpZWxkRGVzY3JpcHRvcik7Ci0KLSAgICAgIHN3aXRjaCAoZmllbGREYXRhVHlwZSkgewotI2RlZmluZSBDQVNFX1NJTkdMRV9QT0QoTkFNRSwgVFlQRSwgRlVOQ19UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFRZUEUgZmllbGRWYWwgPSBHUEJHZXRNZXNzYWdlIyNGVU5DX1RZUEUjI0ZpZWxkKHNlbGYsIGZpZWxkRGVzY3JpcHRvcik7IFwKLSAgICAgICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZSMjTkFNRSMjU2l6ZShmaWVsZE51bWJlciwgZmllbGRWYWwpOyAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfQotI2RlZmluZSBDQVNFX1NJTkdMRV9PQkpFQ1QoTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlkIGZpZWxkVmFsID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZERlc2NyaXB0b3IpOyBcCi0gICAgICAgICAgcmVzdWx0ICs9IEdQQkNvbXB1dGUjI05BTUUjI1NpemUoZmllbGROdW1iZXIsIGZpZWxkVmFsKTsgICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0KLSAgICAgICAgICBDQVNFX1NJTkdMRV9QT0QoQm9vbCwgQk9PTCwgQm9vbCkKLSAgICAgICAgICBDQVNFX1NJTkdMRV9QT0QoRml4ZWQzMiwgdWludDMyX3QsIFVJbnQzMikKLSAgICAgICAgICBDQVNFX1NJTkdMRV9QT0QoU0ZpeGVkMzIsIGludDMyX3QsIEludDMyKQotICAgICAgICAgIENBU0VfU0lOR0xFX1BPRChGbG9hdCwgZmxvYXQsIEZsb2F0KQotICAgICAgICAgIENBU0VfU0lOR0xFX1BPRChGaXhlZDY0LCB1aW50NjRfdCwgVUludDY0KQotICAgICAgICAgIENBU0VfU0lOR0xFX1BPRChTRml4ZWQ2NCwgaW50NjRfdCwgSW50NjQpCi0gICAgICAgICAgQ0FTRV9TSU5HTEVfUE9EKERvdWJsZSwgZG91YmxlLCBEb3VibGUpCi0gICAgICAgICAgQ0FTRV9TSU5HTEVfUE9EKEludDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgICAgICBDQVNFX1NJTkdMRV9QT0QoSW50NjQsIGludDY0X3QsIEludDY0KQotICAgICAgICAgIENBU0VfU0lOR0xFX1BPRChTSW50MzIsIGludDMyX3QsIEludDMyKQotICAgICAgICAgIENBU0VfU0lOR0xFX1BPRChTSW50NjQsIGludDY0X3QsIEludDY0KQotICAgICAgICAgIENBU0VfU0lOR0xFX1BPRChVSW50MzIsIHVpbnQzMl90LCBVSW50MzIpCi0gICAgICAgICAgQ0FTRV9TSU5HTEVfUE9EKFVJbnQ2NCwgdWludDY0X3QsIFVJbnQ2NCkKLSAgICAgICAgICBDQVNFX1NJTkdMRV9PQkpFQ1QoQnl0ZXMpCi0gICAgICAgICAgQ0FTRV9TSU5HTEVfT0JKRUNUKFN0cmluZykKLSAgICAgICAgICBDQVNFX1NJTkdMRV9PQkpFQ1QoTWVzc2FnZSkKLSAgICAgICAgICBDQVNFX1NJTkdMRV9PQkpFQ1QoR3JvdXApCi0gICAgICAgICAgQ0FTRV9TSU5HTEVfUE9EKEVudW0sIGludDMyX3QsIEludDMyKQotI3VuZGVmIENBU0VfU0lOR0xFX1BPRAotI3VuZGVmIENBU0VfU0lOR0xFX09CSkVDVAotICAgICAgfQotCi0gICAgLy8gUmVwZWF0ZWQgRmllbGRzCi0gICAgfSBlbHNlIGlmIChmaWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgIGlkIGdlbmVyaWNBcnJheSA9Ci0gICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgTlNVSW50ZWdlciBjb3VudCA9IFtnZW5lcmljQXJyYXkgY291bnRdOwotICAgICAgaWYgKGNvdW50ID09IDApIHsKLSAgICAgICAgY29udGludWU7ICAvLyBOb3RoaW5nIHRvIGFkZC4KLSAgICAgIH0KLSAgICAgIF9fYmxvY2sgc2l6ZV90IGRhdGFTaXplID0gMDsKLQotICAgICAgc3dpdGNoIChmaWVsZERhdGFUeXBlKSB7Ci0jZGVmaW5lIENBU0VfUkVQRUFURURfUE9EKE5BTUUsIFRZUEUsIEFSUkFZX1RZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0FTRV9SRVBFQVRFRF9QT0RfRVhUUkEoTkFNRSwgVFlQRSwgQVJSQVlfVFlQRSwgKQotI2RlZmluZSBDQVNFX1JFUEVBVEVEX1BPRF9FWFRSQShOQU1FLCBUWVBFLCBBUlJBWV9UWVBFLCBBUlJBWV9BQ0NFU1NPUl9OQU1FKSAgXAotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIEdQQiMjQVJSQVlfVFlQRSMjQXJyYXkgKmFycmF5ID0gZ2VuZXJpY0FycmF5OyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFthcnJheSBlbnVtZXJhdGUjI0FSUkFZX0FDQ0VTU09SX05BTUUjI1ZhbHVlc1dpdGhCbG9jazpeKFRZUEUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7IFwKLSAgICAgICAgICAgIF9QcmFnbWEoInVudXNlZChpZHgsIHN0b3ApIik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGRhdGFTaXplICs9IEdQQkNvbXB1dGUjI05BTUUjI1NpemVOb1RhZyh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9XTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfQotI2RlZmluZSBDQVNFX1JFUEVBVEVEX09CSkVDVChOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvciAoaWQgdmFsdWUgaW4gZ2VuZXJpY0FycmF5KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZGF0YVNpemUgKz0gR1BCQ29tcHV0ZSMjTkFNRSMjU2l6ZU5vVGFnKHZhbHVlKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB9Ci0gICAgICAgICAgQ0FTRV9SRVBFQVRFRF9QT0QoQm9vbCwgQk9PTCwgQm9vbCkKLSAgICAgICAgICBDQVNFX1JFUEVBVEVEX1BPRChGaXhlZDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgICAgIENBU0VfUkVQRUFURURfUE9EKFNGaXhlZDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgICAgICBDQVNFX1JFUEVBVEVEX1BPRChGbG9hdCwgZmxvYXQsIEZsb2F0KQotICAgICAgICAgIENBU0VfUkVQRUFURURfUE9EKEZpeGVkNjQsIHVpbnQ2NF90LCBVSW50NjQpCi0gICAgICAgICAgQ0FTRV9SRVBFQVRFRF9QT0QoU0ZpeGVkNjQsIGludDY0X3QsIEludDY0KQotICAgICAgICAgIENBU0VfUkVQRUFURURfUE9EKERvdWJsZSwgZG91YmxlLCBEb3VibGUpCi0gICAgICAgICAgQ0FTRV9SRVBFQVRFRF9QT0QoSW50MzIsIGludDMyX3QsIEludDMyKQotICAgICAgICAgIENBU0VfUkVQRUFURURfUE9EKEludDY0LCBpbnQ2NF90LCBJbnQ2NCkKLSAgICAgICAgICBDQVNFX1JFUEVBVEVEX1BPRChTSW50MzIsIGludDMyX3QsIEludDMyKQotICAgICAgICAgIENBU0VfUkVQRUFURURfUE9EKFNJbnQ2NCwgaW50NjRfdCwgSW50NjQpCi0gICAgICAgICAgQ0FTRV9SRVBFQVRFRF9QT0QoVUludDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgICAgIENBU0VfUkVQRUFURURfUE9EKFVJbnQ2NCwgdWludDY0X3QsIFVJbnQ2NCkKLSAgICAgICAgICBDQVNFX1JFUEVBVEVEX09CSkVDVChCeXRlcykKLSAgICAgICAgICBDQVNFX1JFUEVBVEVEX09CSkVDVChTdHJpbmcpCi0gICAgICAgICAgQ0FTRV9SRVBFQVRFRF9PQkpFQ1QoTWVzc2FnZSkKLSAgICAgICAgICBDQVNFX1JFUEVBVEVEX09CSkVDVChHcm91cCkKLSAgICAgICAgICBDQVNFX1JFUEVBVEVEX1BPRF9FWFRSQShFbnVtLCBpbnQzMl90LCBFbnVtLCBSYXcpCi0jdW5kZWYgQ0FTRV9SRVBFQVRFRF9QT0QKLSN1bmRlZiBDQVNFX1JFUEVBVEVEX1BPRF9FWFRSQQotI3VuZGVmIENBU0VfUkVQRUFURURfT0JKRUNUCi0gICAgICB9ICAvLyBzd2l0Y2gKLSAgICAgIHJlc3VsdCArPSBkYXRhU2l6ZTsKLSAgICAgIHNpemVfdCB0YWdTaXplID0gR1BCQ29tcHV0ZVRhZ1NpemUoR1BCRmllbGROdW1iZXIoZmllbGREZXNjcmlwdG9yKSk7Ci0gICAgICBpZiAoZmllbGREYXRhVHlwZSA9PSBHUEJEYXRhVHlwZUdyb3VwKSB7Ci0gICAgICAgIC8vIEdyb3VwcyBoYXZlIGJvdGggYSBzdGFydCBhbmQgYW4gZW5kIHRhZy4KLSAgICAgICAgdGFnU2l6ZSAqPSAyOwotICAgICAgfQotICAgICAgaWYgKGZpZWxkRGVzY3JpcHRvci5pc1BhY2thYmxlKSB7Ci0gICAgICAgIHJlc3VsdCArPSB0YWdTaXplOwotICAgICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVNpemVUU2l6ZUFzSW50MzJOb1RhZyhkYXRhU2l6ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gY291bnQgKiB0YWdTaXplOwotICAgICAgfQotCi0gICAgLy8gTWFwPD4gRmllbGRzCi0gICAgfSBlbHNlIHsgIC8vIGZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVNYXAKLSAgICAgIGlmIChHUEJEYXRhVHlwZUlzT2JqZWN0KGZpZWxkRGF0YVR5cGUpICYmCi0gICAgICAgICAgKGZpZWxkRGVzY3JpcHRvci5tYXBLZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykpIHsKLSAgICAgICAgLy8gSWYga2V5IHR5cGUgd2FzIHN0cmluZywgdGhlbiB0aGUgbWFwIGlzIGFuIE5TRGljdGlvbmFyeS4KLSAgICAgICAgTlNEaWN0aW9uYXJ5ICptYXAgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICBpZiAobWFwKSB7Ci0gICAgICAgICAgcmVzdWx0ICs9IEdQQkRpY3Rpb25hcnlDb21wdXRlU2l6ZUludGVybmFsSGVscGVyKG1hcCwgZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVHlwZSB3aWxsIGJlIEdQQipHcm91cERpY3Rpb25hcnksIGV4YWN0IHR5cGUgZG9lc24ndCBtYXR0ZXIuCi0gICAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICptYXAgPQotICAgICAgICAgICAgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICByZXN1bHQgKz0gW21hcCBjb21wdXRlU2VyaWFsaXplZFNpemVBc0ZpZWxkOmZpZWxkRGVzY3JpcHRvcl07Ci0gICAgICB9Ci0gICAgfQotICB9ICAvLyBmb3IoZmllbGRzKQotCi0gIC8vIEFkZCBhbnkgdW5rbm93biBmaWVsZHMuCi0gIGlmIChkZXNjcmlwdG9yLndpcmVGb3JtYXQpIHsKLSAgICByZXN1bHQgKz0gW3Vua25vd25GaWVsZHNfIHNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0XTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgKz0gW3Vua25vd25GaWVsZHNfIHNlcmlhbGl6ZWRTaXplXTsKLSAgfQotCi0gIC8vIEFkZCBhbnkgZXh0ZW5zaW9ucy4KLSAgZm9yIChHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpleHRlbnNpb24gaW4gZXh0ZW5zaW9uTWFwXykgewotICAgIGlkIHZhbHVlID0gW2V4dGVuc2lvbk1hcF8gb2JqZWN0Rm9yS2V5OmV4dGVuc2lvbl07Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVFeHRlbnNpb25TZXJpYWxpemVkU2l6ZUluY2x1ZGluZ1RhZyhleHRlbnNpb24sIHZhbHVlKTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNwcmFnbWEgbWFyayAtIFJlc29sdmUgTWV0aG9kcyBTdXBwb3J0Ci0KLXR5cGVkZWYgc3RydWN0IFJlc29sdmVJdmFyQWNjZXNzb3JNZXRob2RSZXN1bHQgewotICBJTVAgaW1wVG9BZGQ7Ci0gIFNFTCBlbmNvZGluZ1NlbGVjdG9yOwotfSBSZXNvbHZlSXZhckFjY2Vzc29yTWV0aG9kUmVzdWx0OwotCi1zdGF0aWMgdm9pZCBSZXNvbHZlSXZhckdldChHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZUl2YXJBY2Nlc3Nvck1ldGhvZFJlc3VsdCAqcmVzdWx0KSB7Ci0gIEdQQkRhdGFUeXBlIGZpZWxkRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgc3dpdGNoIChmaWVsZERhdGFUeXBlKSB7Ci0jZGVmaW5lIENBU0VfR0VUKE5BTUUsIFRZUEUsIFRSVUVfTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVzdWx0LT5pbXBUb0FkZCA9IGltcF9pbXBsZW1lbnRhdGlvbldpdGhCbG9jayheKGlkIG9iaikgeyBcCi0gICAgICAgIHJldHVybiBHUEJHZXRNZXNzYWdlIyNUUlVFX05BTUUjI0ZpZWxkKG9iaiwgZmllbGQpOyAgICAgIFwKLSAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVzdWx0LT5lbmNvZGluZ1NlbGVjdG9yID0gQHNlbGVjdG9yKGdldCMjTkFNRSk7ICAgICAgICAgICBcCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0jZGVmaW5lIENBU0VfR0VUX09CSkVDVChOQU1FLCBUWVBFLCBUUlVFX05BTUUpICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIEdQQkRhdGFUeXBlIyNOQU1FOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVzdWx0LT5pbXBUb0FkZCA9IGltcF9pbXBsZW1lbnRhdGlvbldpdGhCbG9jayheKGlkIG9iaikgeyBcCi0gICAgICAgIHJldHVybiBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkKG9iaiwgZmllbGQpOyAgICAgICAgICAgIFwKLSAgICAgICB9KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVzdWx0LT5lbmNvZGluZ1NlbGVjdG9yID0gQHNlbGVjdG9yKGdldCMjTkFNRSk7ICAgICAgICAgICBcCi0gICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0gICAgICBDQVNFX0dFVChCb29sLCBCT09MLCBCb29sKQotICAgICAgQ0FTRV9HRVQoRml4ZWQzMiwgdWludDMyX3QsIFVJbnQzMikKLSAgICAgIENBU0VfR0VUKFNGaXhlZDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgIENBU0VfR0VUKEZsb2F0LCBmbG9hdCwgRmxvYXQpCi0gICAgICBDQVNFX0dFVChGaXhlZDY0LCB1aW50NjRfdCwgVUludDY0KQotICAgICAgQ0FTRV9HRVQoU0ZpeGVkNjQsIGludDY0X3QsIEludDY0KQotICAgICAgQ0FTRV9HRVQoRG91YmxlLCBkb3VibGUsIERvdWJsZSkKLSAgICAgIENBU0VfR0VUKEludDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgIENBU0VfR0VUKEludDY0LCBpbnQ2NF90LCBJbnQ2NCkKLSAgICAgIENBU0VfR0VUKFNJbnQzMiwgaW50MzJfdCwgSW50MzIpCi0gICAgICBDQVNFX0dFVChTSW50NjQsIGludDY0X3QsIEludDY0KQotICAgICAgQ0FTRV9HRVQoVUludDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgQ0FTRV9HRVQoVUludDY0LCB1aW50NjRfdCwgVUludDY0KQotICAgICAgQ0FTRV9HRVRfT0JKRUNUKEJ5dGVzLCBpZCwgT2JqZWN0KQotICAgICAgQ0FTRV9HRVRfT0JKRUNUKFN0cmluZywgaWQsIE9iamVjdCkKLSAgICAgIENBU0VfR0VUX09CSkVDVChNZXNzYWdlLCBpZCwgT2JqZWN0KQotICAgICAgQ0FTRV9HRVRfT0JKRUNUKEdyb3VwLCBpZCwgT2JqZWN0KQotICAgICAgQ0FTRV9HRVQoRW51bSwgaW50MzJfdCwgRW51bSkKLSN1bmRlZiBDQVNFX0dFVAotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIFJlc29sdmVJdmFyU2V0KEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVJdmFyQWNjZXNzb3JNZXRob2RSZXN1bHQgKnJlc3VsdCkgewotICBHUEJEYXRhVHlwZSBmaWVsZERhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIHN3aXRjaCAoZmllbGREYXRhVHlwZSkgewotI2RlZmluZSBDQVNFX1NFVChOQU1FLCBUWVBFLCBUUlVFX05BTUUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgR1BCRGF0YVR5cGUjI05BTUU6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVzdWx0LT5pbXBUb0FkZCA9IGltcF9pbXBsZW1lbnRhdGlvbldpdGhCbG9jayheKGlkIG9iaiwgVFlQRSB2YWx1ZSkgeyAgXAotICAgICAgICByZXR1cm4gR1BCU2V0IyNUUlVFX05BTUUjI0l2YXJXaXRoRmllbGRJbnRlcm5hbChvYmosIGZpZWxkLCB2YWx1ZSwgc3ludGF4KTsgXAotICAgICAgfSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmVzdWx0LT5lbmNvZGluZ1NlbGVjdG9yID0gQHNlbGVjdG9yKHNldCMjTkFNRTopOyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLSAgICAgIENBU0VfU0VUKEJvb2wsIEJPT0wsIEJvb2wpCi0gICAgICBDQVNFX1NFVChGaXhlZDMyLCB1aW50MzJfdCwgVUludDMyKQotICAgICAgQ0FTRV9TRVQoU0ZpeGVkMzIsIGludDMyX3QsIEludDMyKQotICAgICAgQ0FTRV9TRVQoRmxvYXQsIGZsb2F0LCBGbG9hdCkKLSAgICAgIENBU0VfU0VUKEZpeGVkNjQsIHVpbnQ2NF90LCBVSW50NjQpCi0gICAgICBDQVNFX1NFVChTRml4ZWQ2NCwgaW50NjRfdCwgSW50NjQpCi0gICAgICBDQVNFX1NFVChEb3VibGUsIGRvdWJsZSwgRG91YmxlKQotICAgICAgQ0FTRV9TRVQoSW50MzIsIGludDMyX3QsIEludDMyKQotICAgICAgQ0FTRV9TRVQoSW50NjQsIGludDY0X3QsIEludDY0KQotICAgICAgQ0FTRV9TRVQoU0ludDMyLCBpbnQzMl90LCBJbnQzMikKLSAgICAgIENBU0VfU0VUKFNJbnQ2NCwgaW50NjRfdCwgSW50NjQpCi0gICAgICBDQVNFX1NFVChVSW50MzIsIHVpbnQzMl90LCBVSW50MzIpCi0gICAgICBDQVNFX1NFVChVSW50NjQsIHVpbnQ2NF90LCBVSW50NjQpCi0gICAgICBDQVNFX1NFVChCeXRlcywgaWQsIE9iamVjdCkKLSAgICAgIENBU0VfU0VUKFN0cmluZywgaWQsIE9iamVjdCkKLSAgICAgIENBU0VfU0VUKE1lc3NhZ2UsIGlkLCBPYmplY3QpCi0gICAgICBDQVNFX1NFVChHcm91cCwgaWQsIE9iamVjdCkKLSAgICAgIENBU0VfU0VUKEVudW0sIGludDMyX3QsIEVudW0pCi0jdW5kZWYgQ0FTRV9TRVQKLSAgfQotfQotCi0rIChCT09MKXJlc29sdmVJbnN0YW5jZU1ldGhvZDooU0VMKXNlbCB7Ci0gIGNvbnN0IEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbc2VsZiBkZXNjcmlwdG9yXTsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuIE5POwotICB9Ci0KLSAgLy8gTk9URTogaGFzT3JDb3VudFNlbF8vc2V0SGFzU2VsXyB3aWxsIGJlIE5VTEwgaWYgdGhlIGZpZWxkIGZvciB0aGUgZ2l2ZW4KLSAgLy8gbWVzc2FnZSBzaG91bGQgbm90IGhhdmUgaGFzIHN1cHBvcnQgKGRvbmUgaW4gR1BCRGVzY3JpcHRvci5tKSwgc28gdGhlcmUgaXMKLSAgLy8gbm8gbmVlZCBmb3IgY2hlY2tzIGhlcmUgdG8gc2VlIGlmIGhhcyovc2V0SGFzKiBhcmUgYWxsb3dlZC4KLQotICBSZXNvbHZlSXZhckFjY2Vzc29yTWV0aG9kUmVzdWx0IHJlc3VsdCA9IHtOVUxMLCBOVUxMfTsKLSAgZm9yIChHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkIGluIGRlc2NyaXB0b3ItPmZpZWxkc18pIHsKLSAgICBCT09MIGlzTWFwT3JBcnJheSA9IEdQQkZpZWxkSXNNYXBPckFycmF5KGZpZWxkKTsKLSAgICBpZiAoIWlzTWFwT3JBcnJheSkgewotICAgICAgLy8gU2luZ2xlIGZpZWxkcy4KLSAgICAgIGlmIChzZWwgPT0gZmllbGQtPmdldFNlbF8pIHsKLSAgICAgICAgUmVzb2x2ZUl2YXJHZXQoZmllbGQsICZyZXN1bHQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAoc2VsID09IGZpZWxkLT5zZXRTZWxfKSB7Ci0gICAgICAgIFJlc29sdmVJdmFyU2V0KGZpZWxkLCBkZXNjcmlwdG9yLmZpbGUuc3ludGF4LCAmcmVzdWx0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9IGVsc2UgaWYgKHNlbCA9PSBmaWVsZC0+aGFzT3JDb3VudFNlbF8pIHsKLSAgICAgICAgaW50MzJfdCBpbmRleCA9IEdQQkZpZWxkSGFzSW5kZXgoZmllbGQpOwotICAgICAgICB1aW50MzJfdCBmaWVsZE51bSA9IEdQQkZpZWxkTnVtYmVyKGZpZWxkKTsKLSAgICAgICAgcmVzdWx0LmltcFRvQWRkID0gaW1wX2ltcGxlbWVudGF0aW9uV2l0aEJsb2NrKF4oaWQgb2JqKSB7Ci0gICAgICAgICAgcmV0dXJuIEdQQkdldEhhc0l2YXIob2JqLCBpbmRleCwgZmllbGROdW0pOwotICAgICAgICB9KTsKLSAgICAgICAgcmVzdWx0LmVuY29kaW5nU2VsZWN0b3IgPSBAc2VsZWN0b3IoZ2V0Qm9vbCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIGlmIChzZWwgPT0gZmllbGQtPnNldEhhc1NlbF8pIHsKLSAgICAgICAgcmVzdWx0LmltcFRvQWRkID0gaW1wX2ltcGxlbWVudGF0aW9uV2l0aEJsb2NrKF4oaWQgb2JqLCBCT09MIHZhbHVlKSB7Ci0gICAgICAgICAgaWYgKHZhbHVlKSB7Ci0gICAgICAgICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIiVAOiAlQCBjYW4gb25seSBiZSBzZXQgdG8gTk8gKHRvIGNsZWFyIGZpZWxkKS4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFtvYmogY2xhc3NdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nRnJvbVNlbGVjdG9yKGZpZWxkLT5zZXRIYXNTZWxfKV07Ci0gICAgICAgICAgfQotICAgICAgICAgIEdQQkNsZWFyTWVzc2FnZUZpZWxkKG9iaiwgZmllbGQpOwotICAgICAgICB9KTsKLSAgICAgICAgcmVzdWx0LmVuY29kaW5nU2VsZWN0b3IgPSBAc2VsZWN0b3Ioc2V0Qm9vbDopOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEdQQk9uZW9mRGVzY3JpcHRvciAqb25lb2YgPSBmaWVsZC0+Y29udGFpbmluZ09uZW9mXzsKLSAgICAgICAgaWYgKG9uZW9mICYmIChzZWwgPT0gb25lb2YtPmNhc2VTZWxfKSkgewotICAgICAgICAgIGludDMyX3QgaW5kZXggPSBHUEJGaWVsZEhhc0luZGV4KGZpZWxkKTsKLSAgICAgICAgICByZXN1bHQuaW1wVG9BZGQgPSBpbXBfaW1wbGVtZW50YXRpb25XaXRoQmxvY2soXihpZCBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiBHUEJHZXRIYXNPbmVvZihvYmosIGluZGV4KTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgICByZXN1bHQuZW5jb2RpbmdTZWxlY3RvciA9IEBzZWxlY3RvcihnZXRFbnVtKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBtYXA8Pi9yZXBlYXRlZCBmaWVsZHMuCi0gICAgICBpZiAoc2VsID09IGZpZWxkLT5nZXRTZWxfKSB7Ci0gICAgICAgIGlmIChmaWVsZC5maWVsZFR5cGUgPT0gR1BCRmllbGRUeXBlUmVwZWF0ZWQpIHsKLSAgICAgICAgICByZXN1bHQuaW1wVG9BZGQgPSBpbXBfaW1wbGVtZW50YXRpb25XaXRoQmxvY2soXihpZCBvYmopIHsKLSAgICAgICAgICAgIHJldHVybiBHZXRBcnJheUl2YXJXaXRoRmllbGQob2JqLCBmaWVsZCk7Ci0gICAgICAgICAgfSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LmltcFRvQWRkID0gaW1wX2ltcGxlbWVudGF0aW9uV2l0aEJsb2NrKF4oaWQgb2JqKSB7Ci0gICAgICAgICAgICByZXR1cm4gR2V0TWFwSXZhcldpdGhGaWVsZChvYmosIGZpZWxkKTsKLSAgICAgICAgICB9KTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuZW5jb2RpbmdTZWxlY3RvciA9IEBzZWxlY3RvcihnZXRBcnJheSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfSBlbHNlIGlmIChzZWwgPT0gZmllbGQtPnNldFNlbF8pIHsKLSAgICAgICAgLy8gTG9jYWwgZm9yIHN5bnRheCBzbyB0aGUgYmxvY2sgY2FuIGRpcmVjdGx5IGNhcHR1cmUgaXQgYW5kIG5vdCB0aGUKLSAgICAgICAgLy8gZnVsbCBsb29rdXAuCi0gICAgICAgIGNvbnN0IEdQQkZpbGVTeW50YXggc3ludGF4ID0gZGVzY3JpcHRvci5maWxlLnN5bnRheDsKLSAgICAgICAgcmVzdWx0LmltcFRvQWRkID0gaW1wX2ltcGxlbWVudGF0aW9uV2l0aEJsb2NrKF4oaWQgb2JqLCBpZCB2YWx1ZSkgewotICAgICAgICAgIHJldHVybiBHUEJTZXRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwob2JqLCBmaWVsZCwgdmFsdWUsIHN5bnRheCk7Ci0gICAgICAgIH0pOwotICAgICAgICByZXN1bHQuZW5jb2RpbmdTZWxlY3RvciA9IEBzZWxlY3RvcihzZXRBcnJheTopOwotICAgICAgICBicmVhazsKLSAgICAgIH0gZWxzZSBpZiAoc2VsID09IGZpZWxkLT5oYXNPckNvdW50U2VsXykgewotICAgICAgICByZXN1bHQuaW1wVG9BZGQgPSBpbXBfaW1wbGVtZW50YXRpb25XaXRoQmxvY2soXihpZCBvYmopIHsKLSAgICAgICAgICAvLyBUeXBlIGRvZXNuJ3QgbWF0dGVyLCBhbGwgKkFycmF5IGFuZCAqRGljdGlvbmFyeSB0eXBlcyBzdXBwb3J0Ci0gICAgICAgICAgLy8gLWNvdW50LgotICAgICAgICAgIE5TQXJyYXkgKmFycmF5T3JNYXAgPQotICAgICAgICAgICAgICBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKG9iaiwgZmllbGQpOwotICAgICAgICAgIHJldHVybiBbYXJyYXlPck1hcCBjb3VudF07Ci0gICAgICAgIH0pOwotICAgICAgICByZXN1bHQuZW5jb2RpbmdTZWxlY3RvciA9IEBzZWxlY3RvcihnZXRBcnJheUNvdW50KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChyZXN1bHQuaW1wVG9BZGQpIHsKLSAgICBjb25zdCBjaGFyICplbmNvZGluZyA9Ci0gICAgICAgIEdQQk1lc3NhZ2VFbmNvZGluZ0ZvclNlbGVjdG9yKHJlc3VsdC5lbmNvZGluZ1NlbGVjdG9yLCBZRVMpOwotICAgIEJPT0wgbWV0aG9kQWRkZWQgPSBjbGFzc19hZGRNZXRob2QoZGVzY3JpcHRvci5tZXNzYWdlQ2xhc3MsIHNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5pbXBUb0FkZCwgZW5jb2RpbmcpOwotICAgIHJldHVybiBtZXRob2RBZGRlZDsKLSAgfQotICByZXR1cm4gW3N1cGVyIHJlc29sdmVJbnN0YW5jZU1ldGhvZDpzZWxdOwotfQotCi0rIChCT09MKXJlc29sdmVDbGFzc01ldGhvZDooU0VMKXNlbCB7Ci0gIC8vIEV4dGVuc2lvbnMgc2NvcGVkIHRvIGEgTWVzc2FnZSBhbmQgbG9va2VkIHVwIHZpYSBjbGFzcyBtZXRob2RzLgotICBpZiAoR1BCUmVzb2x2ZUV4dGVuc2lvbkNsYXNzTWV0aG9kKHNlbGYsIHNlbCkpIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIHJldHVybiBbc3VwZXIgcmVzb2x2ZUNsYXNzTWV0aG9kOnNlbF07Ci19Ci0KLSNwcmFnbWEgbWFyayAtIE5TQ29kaW5nIFN1cHBvcnQKLQotKyAoQk9PTClzdXBwb3J0c1NlY3VyZUNvZGluZyB7Ci0gIHJldHVybiBZRVM7Ci19Ci0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aENvZGVyOihOU0NvZGVyICopYURlY29kZXIgewotICBzZWxmID0gW3NlbGYgaW5pdF07Ci0gIGlmIChzZWxmKSB7Ci0gICAgTlNEYXRhICpkYXRhID0KLSAgICAgICAgW2FEZWNvZGVyIGRlY29kZU9iamVjdE9mQ2xhc3M6W05TRGF0YSBjbGFzc10gZm9yS2V5OmtHUEJEYXRhQ29kZXJLZXldOwotICAgIGlmIChkYXRhLmxlbmd0aCkgewotICAgICAgW3NlbGYgbWVyZ2VGcm9tRGF0YTpkYXRhIGV4dGVuc2lvblJlZ2lzdHJ5Om5pbF07Ci0gICAgfQotICB9Ci0gIHJldHVybiBzZWxmOwotfQotCi0tICh2b2lkKWVuY29kZVdpdGhDb2RlcjooTlNDb2RlciAqKWFDb2RlciB7Ci0gIE5TRGF0YSAqZGF0YSA9IFtzZWxmIGRhdGFdOwotICBpZiAoZGF0YS5sZW5ndGgpIHsKLSAgICBbYUNvZGVyIGVuY29kZU9iamVjdDpkYXRhIGZvcktleTprR1BCRGF0YUNvZGVyS2V5XTsKLSAgfQotfQotCi0jcHJhZ21hIG1hcmsgLSBLVkMgU3VwcG9ydAotCi0rIChCT09MKWFjY2Vzc0luc3RhbmNlVmFyaWFibGVzRGlyZWN0bHkgewotICAvLyBNYWtlIHN1cmUgS1ZDIGRvZXNuJ3QgdXNlIGluc3RhbmNlIHZhcmlhYmxlcy4KLSAgcmV0dXJuIE5POwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQk1lc3NhZ2VfUGFja2FnZVByaXZhdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCTWVzc2FnZV9QYWNrYWdlUHJpdmF0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NzhkYjJjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCTWVzc2FnZV9QYWNrYWdlUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGhlYWRlciBpcyBwcml2YXRlIHRvIHRoZSBQcm90b2JvbEJ1ZmZlcnMgbGlicmFyeSBhbmQgbXVzdCBOT1QgYmUKLS8vIGluY2x1ZGVkIGJ5IGFueSBzb3VyY2VzIG91dHNpZGUgdGhpcyBsaWJyYXJ5LiBUaGUgY29udGVudHMgb2YgdGhpcyBmaWxlIGFyZQotLy8gc3ViamVjdCB0byBjaGFuZ2UgYXQgYW55IHRpbWUgd2l0aG91dCBub3RpY2UuCi0KLSNpbXBvcnQgIkdQQk1lc3NhZ2UuaCIKLQotI2ltcG9ydCA8bGlia2Vybi9PU0F0b21pYy5oPgotCi0jaW1wb3J0ICJHUEJCb290c3RyYXAuaCIKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCTWVzc2FnZV9TdG9yYWdlIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1swXTsKLX0gR1BCTWVzc2FnZV9TdG9yYWdlOwotCi10eXBlZGVmIHN0cnVjdCBHUEJNZXNzYWdlX1N0b3JhZ2UgKkdQQk1lc3NhZ2VfU3RvcmFnZVB0cjsKLQotQGludGVyZmFjZSBHUEJNZXNzYWdlICgpIHsKLSBAcGFja2FnZQotICAvLyBOT1RFOiBCZWNhdXNlIG9mIHRoZSArYWxsb2NXaXRoWm9uZSBjb2RlIHVzaW5nIE5TQWxsb2NhdGVPYmplY3QoKSwKLSAgLy8gdGhpcyBzdHJ1Y3R1cmUgc2hvdWxkIGlkZWFsbHkgYWx3YXlzIGJlIGtlcHQgcG9pbnRlciBhbGlnbmVkIHdoZXJlIHRoZQotICAvLyByZWFsIHN0b3JhZ2Ugc3RhcnRzIGlzIGFsc28gcG9pbnRlciBhbGlnbmVkLiBUaGUgY29tcGlsZXIvcnVudGltZSBhbHJlYWR5Ci0gIC8vIGRvIHRoaXMsIGJ1dCBpdCBtYXkgbm90IGJlIGRvY3VtZW50ZWQuCi0KLSAgLy8gQSBwb2ludGVyIHRvIHRoZSBhY3R1YWwgZmllbGRzIG9mIHRoZSBzdWJjbGFzc2VzLiBUaGUgYWN0dWFsIHN0cnVjdHVyZQotICAvLyBwb2ludGVkIHRvIGJ5IHRoaXMgcG9pbnRlciB3aWxsIGRlcGVuZCBvbiB0aGUgc3ViY2xhc3MuCi0gIC8vIEFsbCBvZiB0aGUgYWN0dWFsIHN0cnVjdHVyZXMgd2lsbCBzdGFydCB0aGUgc2FtZSBhcwotICAvLyBHUEJNZXNzYWdlX1N0b3JhZ2Ugd2l0aCBfaGFzX3N0b3JhZ2VfXyBhcyB0aGUgZmlyc3QgZmllbGQuCi0gIC8vIEtlcHQgcHVibGljIGJlY2F1c2Ugc3RhdGljIGZ1bmN0aW9ucyBuZWVkIHRvIGFjY2VzcyBpdC4KLSAgR1BCTWVzc2FnZV9TdG9yYWdlUHRyIG1lc3NhZ2VTdG9yYWdlXzsKLQotICAvLyBBIGxvY2sgdG8gcHJvdmlkZSBtdXR1YWwgZXhjbHVzaW9uIGZyb20gaW50ZXJuYWwgZGF0YSB0aGF0IGNhbiBiZSBtb2RpZmllZAotICAvLyBieSAqcmVhZCogb3BlcmF0aW9ucyBzdWNoIGFzIGdldHRlcnMgKGF1dG9jcmVhdGlvbiBvZiBtZXNzYWdlIGZpZWxkcyBhbmQKLSAgLy8gbWVzc2FnZSBleHRlbnNpb25zLCBub3Qgc2V0dGluZyBvZiB2YWx1ZXMpLiBVc2VkIHRvIGd1YXJhbnRlZSB0aHJlYWQgc2FmZXR5Ci0gIC8vIGZvciBjb25jdXJyZW50IHJlYWRzIG9uIHRoZSBtZXNzYWdlLgotICAvLyBOT1RFOiBPU1NwaW5Mb2NrIG1heSBzZWVtIGxpa2UgYSBnb29kIGZpdCBoZXJlIGJ1dCBBcHBsZSBlbmdpbmVlcnMgaGF2ZQotICAvLyBwb2ludGVkIG91dCB0aGF0IHRoZXkgYXJlIHZ1bG5lcmFibGUgdG8gbGl2ZSBsb2NraW5nIG9uIGlPUyBpbiBjYXNlcyBvZgotICAvLyBwcmlvcml0eSBpbnZlcnNpb246Ci0gIC8vICAgaHR0cDovL21qdHNhaS5jb20vYmxvZy8yMDE1LzEyLzE2L29zc3BpbmxvY2staXMtdW5zYWZlLwotICAvLyAgIGh0dHBzOi8vbGlzdHMuc3dpZnQub3JnL3BpcGVybWFpbC9zd2lmdC1kZXYvV2Vlay1vZi1Nb24tMjAxNTEyMTQvMDAwMzcyLmh0bWwKLSAgLy8gVXNlIG9mIHJlYWRPbmx5U2VtYXBob3JlXyBtdXN0IGJlIHByZWZhY2VkIGJ5IGEgY2FsbCB0bwotICAvLyBHUEJQcmVwYXJlUmVhZE9ubHlTZW1hcGhvcmUgdG8gZW5zdXJlIGl0IGhhcyBiZWVuIGNyZWF0ZWQuIFRoaXMgYWxsb3dzCi0gIC8vIHJlYWRPbmx5U2VtYXBob3JlXyB0byBiZSBvbmx5IGNyZWF0ZWQgd2hlbiBhY3R1YWxseSBuZWVkZWQuCi0gIGRpc3BhdGNoX29uY2VfdCByZWFkT25seVNlbWFwaG9yZUNyZWF0aW9uT25jZV87Ci0gIGRpc3BhdGNoX3NlbWFwaG9yZV90IHJlYWRPbmx5U2VtYXBob3JlXzsKLX0KLQotLy8gR2V0cyBhbiBleHRlbnNpb24gdmFsdWUgd2l0aG91dCBhdXRvY3JlYXRpbmcgdGhlIHJlc3VsdCBpZiBub3QgZm91bmQuIChpLmUuCi0vLyByZXR1cm5zIG5pbCBpZiB0aGUgZXh0ZW5zaW9uIGlzIG5vdCBzZXQpCi0tIChpZClnZXRFeGlzdGluZ0V4dGVuc2lvbjooR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqKWV4dGVuc2lvbjsKLQotLy8gUmV0dXJucyBhbiBhcnJheSBvZiBHUEJFeHRlbnNpb25EZXNjcmlwdG9yKiBmb3IgYWxsIHRoZSBleHRlbnNpb25zIGN1cnJlbnRseQotLy8gaW4gdXNlIG9uIHRoZSBtZXNzYWdlLiAgVGhleSBhcmUgc29ydGVkIGJ5IGZpZWxkIG51bWJlci4KLS0gKE5TQXJyYXkgKilzb3J0ZWRFeHRlbnNpb25zSW5Vc2U7Ci0KLS8vIFBhcnNlcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGZyb20gdGhlIGlucHV0IGFuZCBtZXJnZXMgaXQgd2l0aCB0aGlzCi0vLyBtZXNzYWdlLgotLy8KLS8vIFdhcm5pbmc6ICBUaGlzIGRvZXMgbm90IHZlcmlmeSB0aGF0IGFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQgaW4KLS8vIHRoZSBpbnB1dCBtZXNzYWdlLgotLy8gTm90ZTogIFRoZSBjYWxsZXIgc2hvdWxkIGNhbGwKLS8vIC1bQ29kZWRJbnB1dFN0cmVhbSBjaGVja0xhc3RUYWdXYXM6XSBhZnRlciBjYWxsaW5nIHRoaXMgdG8KLS8vIHZlcmlmeSB0aGF0IHRoZSBsYXN0IHRhZyBzZWVuIHdhcyB0aGUgYXBwcm9wcmlhdGUgZW5kLWdyb3VwIHRhZywKLS8vIG9yIHplcm8gZm9yIEVPRi4KLS8vIE5PVEU6IFRoaXMgd2lsbCB0aHJvdyBpZiB0aGVyZSBpcyBhbiBlcnJvciB3aGlsZSBwYXJzaW5nLgotLSAodm9pZCltZXJnZUZyb21Db2RlZElucHV0U3RyZWFtOihHUEJDb2RlZElucHV0U3RyZWFtICopaW5wdXQKLSAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTooR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeTsKLQotLy8gUGFyc2VzIHRoZSBuZXh0IGRlbGltaXRlZCBtZXNzYWdlIG9mIHRoaXMgdHlwZSBmcm9tIHRoZSBpbnB1dCBhbmQgbWVyZ2VzIGl0Ci0vLyB3aXRoIHRoaXMgbWVzc2FnZS4KLS0gKHZvaWQpbWVyZ2VEZWxpbWl0ZWRGcm9tQ29kZWRJbnB1dFN0cmVhbTooR1BCQ29kZWRJbnB1dFN0cmVhbSAqKWlucHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIChHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5OwotCi0tICh2b2lkKWFkZFVua25vd25NYXBFbnRyeTooaW50MzJfdClmaWVsZE51bSB2YWx1ZTooTlNEYXRhICopZGF0YTsKLQotQGVuZAotCi1DRl9FWFRFUk5fQ19CRUdJTgotCi0KLS8vIENhbGwgdGhpcyBiZWZvcmUgdXNpbmcgdGhlIHJlYWRPbmx5U2VtYXBob3JlXy4gVGhpcyBlbnN1cmVzIGl0IGlzIGNyZWF0ZWQgb25seSBvbmNlLgotTlNfSU5MSU5FIHZvaWQgR1BCUHJlcGFyZVJlYWRPbmx5U2VtYXBob3JlKEdQQk1lc3NhZ2UgKnNlbGYpIHsKLSAgZGlzcGF0Y2hfb25jZSgmc2VsZi0+cmVhZE9ubHlTZW1hcGhvcmVDcmVhdGlvbk9uY2VfLCBeewotICAgIHNlbGYtPnJlYWRPbmx5U2VtYXBob3JlXyA9IGRpc3BhdGNoX3NlbWFwaG9yZV9jcmVhdGUoMSk7Ci0gIH0pOwotfQotCi0vLyBSZXR1cm5zIGEgbmV3IGluc3RhbmNlIHRoYXQgd2FzIGF1dG9tYXRpY2FsbHkgY3JlYXRlZCBieSB8YXV0b2NyZWF0b3J8IGZvcgotLy8gaXRzIGZpZWxkIHxmaWVsZHwuCi1HUEJNZXNzYWdlICpHUEJDcmVhdGVNZXNzYWdlV2l0aEF1dG9jcmVhdG9yKENsYXNzIG1zZ0NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJNZXNzYWdlICphdXRvY3JlYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkKLSAgICBfX2F0dHJpYnV0ZV9fKChuc19yZXR1cm5zX3JldGFpbmVkKSk7Ci0KLS8vIFJldHVybnMgd2hldGhlciB8bWVzc2FnZXwgYXV0b2NyZWF0ZWQgdGhpcyBtZXNzYWdlLiBUaGlzIGlzIE5PIGlmIHRoZSBtZXNzYWdlCi0vLyB3YXMgbm90IGF1dG9jcmVhdGVkIGJ5IHxtZXNzYWdlfCBvciBpZiBpdCBoYXMgYmVlbiBtdXRhdGVkIHNpbmNlCi0vLyBhdXRvY3JlYXRpb24uCi1CT09MIEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KEdQQk1lc3NhZ2UgKm1lc3NhZ2UsIEdQQk1lc3NhZ2UgKnBhcmVudCk7Ci0KLS8vIENhbGwgdGhpcyB3aGVuIHlvdSBtdXRhdGUgYSBtZXNzYWdlLiBJdCB3aWxsIGNhdXNlIHRoZSBtZXNzYWdlIHRvIGJlY29tZQotLy8gdmlzaWJsZSB0byBpdHMgYXV0b2NyZWF0b3IuCi12b2lkIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKEdQQk1lc3NhZ2UgKnNlbGYpOwotCi0vLyBDYWxsIHRoaXMgd2hlbiBhbiBhcnJheS9kaWN0aW9uYXJ5IGlzIG11dGF0ZWQgc28gdGhlIHBhcmVudCBtZXNzYWdlIHRoYXQKLS8vIGF1dG9jcmVhdGVkIGl0IGNhbiByZWFjdC4KLXZvaWQgR1BCQXV0b2NyZWF0ZWRBcnJheU1vZGlmaWVkKEdQQk1lc3NhZ2UgKnNlbGYsIGlkIGFycmF5KTsKLXZvaWQgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5TW9kaWZpZWQoR1BCTWVzc2FnZSAqc2VsZiwgaWQgZGljdGlvbmFyeSk7Ci0KLS8vIENsZWFyIHRoZSBhdXRvY3JlYXRvciwgaWYgYW55LiBBc3NlcnRzIGlmIHRoZSBhdXRvY3JlYXRvciBzdGlsbCBoYXMgYW4KLS8vIGF1dG9jcmVhdGVkIHJlZmVyZW5jZSB0byB0aGlzIG1lc3NhZ2UuCi12b2lkIEdQQkNsZWFyTWVzc2FnZUF1dG9jcmVhdG9yKEdQQk1lc3NhZ2UgKnNlbGYpOwotCi1DRl9FWFRFUk5fQ19FTkQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCUHJvdG9jb2xCdWZmZXJzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlByb3RvY29sQnVmZmVycy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2Nzc5MDNlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCUHJvdG9jb2xCdWZmZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCQm9vdHN0cmFwLmgiCi0KLSNpbXBvcnQgIkdQQkFycmF5LmgiCi0jaW1wb3J0ICJHUEJDb2RlZElucHV0U3RyZWFtLmgiCi0jaW1wb3J0ICJHUEJDb2RlZE91dHB1dFN0cmVhbS5oIgotI2ltcG9ydCAiR1BCRGVzY3JpcHRvci5oIgotI2ltcG9ydCAiR1BCRGljdGlvbmFyeS5oIgotI2ltcG9ydCAiR1BCRXh0ZW5zaW9uUmVnaXN0cnkuaCIKLSNpbXBvcnQgIkdQQk1lc3NhZ2UuaCIKLSNpbXBvcnQgIkdQQlJvb3RPYmplY3QuaCIKLSNpbXBvcnQgIkdQQlVua25vd25GaWVsZC5oIgotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkU2V0LmgiCi0jaW1wb3J0ICJHUEJVdGlsaXRpZXMuaCIKLSNpbXBvcnQgIkdQQldlbGxLbm93blR5cGVzLmgiCi0jaW1wb3J0ICJHUEJXaXJlRm9ybWF0LmgiCi0KLS8vIFdlbGwta25vd24gcHJvdG8gdHlwZXMKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9BbnkucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvQXBpLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0R1cmF0aW9uLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0VtcHR5LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkTWFzay5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Tb3VyY2VDb250ZXh0LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1N0cnVjdC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9UaW1lc3RhbXAucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVHlwZS5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9XcmFwcGVycy5wYm9iamMuaCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCUHJvdG9jb2xCdWZmZXJzLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlByb3RvY29sQnVmZmVycy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4NTEyYWY3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCUHJvdG9jb2xCdWZmZXJzLm0KKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gSWYgeW91IHdhbnQgdG8gYnVpbGQgcHJvdG9jb2wgYnVmZmVycyBpbiB5b3VyIG93biBwcm9qZWN0IHdpdGhvdXQgYWRkaW5nIHRoZQotLy8gcHJvamVjdCBkZXBlbmRlbmN5LCB5b3UgY2FuIGp1c3QgYWRkIHRoaXMgZmlsZS4KLQotI2ltcG9ydCAiR1BCQXJyYXkubSIKLSNpbXBvcnQgIkdQQkNvZGVkSW5wdXRTdHJlYW0ubSIKLSNpbXBvcnQgIkdQQkNvZGVkT3V0cHV0U3RyZWFtLm0iCi0jaW1wb3J0ICJHUEJEZXNjcmlwdG9yLm0iCi0jaW1wb3J0ICJHUEJEaWN0aW9uYXJ5Lm0iCi0jaW1wb3J0ICJHUEJFeHRlbnNpb25JbnRlcm5hbHMubSIKLSNpbXBvcnQgIkdQQkV4dGVuc2lvblJlZ2lzdHJ5Lm0iCi0jaW1wb3J0ICJHUEJNZXNzYWdlLm0iCi0jaW1wb3J0ICJHUEJSb290T2JqZWN0Lm0iCi0jaW1wb3J0ICJHUEJVbmtub3duRmllbGQubSIKLSNpbXBvcnQgIkdQQlVua25vd25GaWVsZFNldC5tIgotI2ltcG9ydCAiR1BCVXRpbGl0aWVzLm0iCi0jaW1wb3J0ICJHUEJXZWxsS25vd25UeXBlcy5tIgotI2ltcG9ydCAiR1BCV2lyZUZvcm1hdC5tIgotCi0vLyBEdXJhdGlvbiBhbmQgVGltZXN0YW1wIGFyZSAjaW1wb3J0ZWQgaW50byBHUEJXZWxsS25vd25UeXBlcy5tIHRvIHRoZQotLy8gT2JqZWN0aXZlIEMgY2F0ZWdvcmllcyBhZGRlZCB3aWxsIGFsd2F5cyBiZSBsaW5rZWQgaW4gd2l0aCB0aGUgY2xhc3Nlcy4KLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9BbnkucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvQXBpLnBib2JqYy5tIgotLy8gI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0R1cmF0aW9uLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0VtcHR5LnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkTWFzay5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Tb3VyY2VDb250ZXh0LnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1N0cnVjdC5wYm9iamMubSIKLS8vICNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9UaW1lc3RhbXAucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVHlwZS5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9XcmFwcGVycy5wYm9iamMubSIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCUHJvdG9jb2xCdWZmZXJzX1J1bnRpbWVTdXBwb3J0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlByb3RvY29sQnVmZmVyc19SdW50aW1lU3VwcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZWE3NWI5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCUHJvdG9jb2xCdWZmZXJzX1J1bnRpbWVTdXBwb3J0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVGhpcyBoZWFkZXIgaXMgbWVhbnQgdG8gb25seSBiZSB1c2VkIGJ5IHRoZSBnZW5lcmF0ZWQgc291cmNlLCBpdCBzaG91bGQgbm90Ci0vLyBiZSBpbmNsdWRlZCBpbiBjb2RlIHVzaW5nIHByb3RvY29sIGJ1ZmZlcnMuCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVycy5oIgotCi0jaW1wb3J0ICJHUEJEZXNjcmlwdG9yX1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJHUEJFeHRlbnNpb25JbnRlcm5hbHMuaCIKLSNpbXBvcnQgIkdQQk1lc3NhZ2VfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQlJvb3RPYmplY3RfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJSb290T2JqZWN0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlJvb3RPYmplY3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzA1YjVjNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlJvb3RPYmplY3QuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotQGNsYXNzIEdQQkV4dGVuc2lvblJlZ2lzdHJ5OwotCi1OU19BU1NVTUVfTk9OTlVMTF9CRUdJTgotCi0vLy8gRXZlcnkgZ2VuZXJhdGVkIHByb3RvIGZpbGUgZGVmaW5lcyBhIGxvY2FsICJSb290IiBjbGFzcyB0aGF0IGV4cG9zZXMgYQotLy8vIEBjIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IGZvciBhbGwgdGhlIGV4dGVuc2lvbnMgZGVmaW5lZCBieSB0aGF0IGZpbGUgYW5kCi0vLy8gdGhlIGZpbGVzIGl0IGRlcGVuZHMgb24uCi1AaW50ZXJmYWNlIEdQQlJvb3RPYmplY3QgOiBOU09iamVjdAotCi0vLy8gQW4gZXh0ZW5zaW9uIHJlZ2lzdHJ5IGZvciB0aGUgZ2l2ZW4gZmlsZSBhbmQgYWxsIHRoZSBmaWxlcyBpdCBkZXBlbmRzIG9uLgotKyAoR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeTsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCUm9vdE9iamVjdC5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJSb290T2JqZWN0Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NzA3MTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJSb290T2JqZWN0Lm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMzAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQlJvb3RPYmplY3RfUGFja2FnZVByaXZhdGUuaCIKLQotI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+Ci0KLSNpbXBvcnQgPENvcmVGb3VuZGF0aW9uL0NvcmVGb3VuZGF0aW9uLmg+Ci0KLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3IuaCIKLSNpbXBvcnQgIkdQQkV4dGVuc2lvblJlZ2lzdHJ5LmgiCi0jaW1wb3J0ICJHUEJVdGlsaXRpZXNfUGFja2FnZVByaXZhdGUuaCIKLQotQGludGVyZmFjZSBHUEJFeHRlbnNpb25EZXNjcmlwdG9yIChHUEJSb290T2JqZWN0KQotLy8gR2V0IHNpbmdsZXRvbk5hbWUgYXMgYSBjIHN0cmluZy4KLS0gKGNvbnN0IGNoYXIgKilzaW5nbGV0b25OYW1lQzsKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlJvb3RPYmplY3QKLQotLy8gVGFrZW4gZnJvbSBodHRwOi8vd3d3LmJ1cnRsZWJ1cnRsZS5uZXQvYm9iL2hhc2gvZG9vYnMuaHRtbAotLy8gUHVibGljIERvbWFpbgotc3RhdGljIHVpbnQzMl90IGplbmtpbnNfb25lX2F0X2FfdGltZV9oYXNoKGNvbnN0IGNoYXIgKmtleSkgewotICB1aW50MzJfdCBoYXNoID0gMDsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsga2V5W2ldICE9ICdcMCc7ICsraSkgewotICAgIGhhc2ggKz0ga2V5W2ldOwotICAgIGhhc2ggKz0gKGhhc2ggPDwgMTApOwotICAgIGhhc2ggXj0gKGhhc2ggPj4gNik7Ci0gIH0KLSAgaGFzaCArPSAoaGFzaCA8PCAzKTsKLSAgaGFzaCBePSAoaGFzaCA+PiAxMSk7Ci0gIGhhc2ggKz0gKGhhc2ggPDwgMTUpOwotICByZXR1cm4gaGFzaDsKLX0KLQotLy8gS2V5IG1ldGhvZHMgZm9yIG91ciBjdXN0b20gQ0ZEaWN0aW9uYXJ5LgotLy8gTm90ZSB0aGF0IHRoZSBkaWN0aW9uYXJ5IGxhc3RzIGZvciB0aGUgbGlmZXRpbWUgb2Ygb3VyIGFwcCwgc28gbm8gbmVlZAotLy8gdG8gd29ycnkgYWJvdXQgZGVhbGxvY2F0aW9uLiBBbGwgb2YgdGhlIGl0ZW1zIGFyZSBhZGRlZCB0byBpdCBhdAotLy8gc3RhcnR1cCwgYW5kIHNvIHRoZSBrZXlzIGRvbid0IG5lZWQgdG8gYmUgcmV0YWluZWQvcmVsZWFzZWQuCi0vLyBLZXlzIGFyZSBOVUxMIHRlcm1pbmF0ZWQgY2hhciAqLgotc3RhdGljIGNvbnN0IHZvaWQgKkdQQlJvb3RFeHRlbnNpb25LZXlSZXRhaW4oQ0ZBbGxvY2F0b3JSZWYgYWxsb2NhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUpIHsKLSNwcmFnbWEgdW51c2VkKGFsbG9jYXRvcikKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCBHUEJSb290RXh0ZW5zaW9uS2V5UmVsZWFzZShDRkFsbG9jYXRvclJlZiBhbGxvY2F0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWx1ZSkgewotI3ByYWdtYSB1bnVzZWQoYWxsb2NhdG9yKQotI3ByYWdtYSB1bnVzZWQodmFsdWUpCi19Ci0KLXN0YXRpYyBDRlN0cmluZ1JlZiBHUEJSb290RXh0ZW5zaW9uQ29weUtleURlc2NyaXB0aW9uKGNvbnN0IHZvaWQgKnZhbHVlKSB7Ci0gIGNvbnN0IGNoYXIgKmtleSA9IChjb25zdCBjaGFyICopdmFsdWU7Ci0gIHJldHVybiBDRlN0cmluZ0NyZWF0ZVdpdGhDU3RyaW5nKGtDRkFsbG9jYXRvckRlZmF1bHQsIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0NGU3RyaW5nRW5jb2RpbmdVVEY4KTsKLX0KLQotc3RhdGljIEJvb2xlYW4gR1BCUm9vdEV4dGVuc2lvbktleUVxdWFsKGNvbnN0IHZvaWQgKnZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp2YWx1ZTIpIHsKLSAgY29uc3QgY2hhciAqa2V5MSA9IChjb25zdCBjaGFyICopdmFsdWUxOwotICBjb25zdCBjaGFyICprZXkyID0gKGNvbnN0IGNoYXIgKil2YWx1ZTI7Ci0gIHJldHVybiBzdHJjbXAoa2V5MSwga2V5MikgPT0gMDsKLX0KLQotc3RhdGljIENGSGFzaENvZGUgR1BCUm9vdEV4dGVuc2lvbktleUhhc2goY29uc3Qgdm9pZCAqdmFsdWUpIHsKLSAgY29uc3QgY2hhciAqa2V5ID0gKGNvbnN0IGNoYXIgKil2YWx1ZTsKLSAgcmV0dXJuIGplbmtpbnNfb25lX2F0X2FfdGltZV9oYXNoKGtleSk7Ci19Ci0KLS8vIE5PVEU6IE9TU3BpbkxvY2sgbWF5IHNlZW0gbGlrZSBhIGdvb2QgZml0IGhlcmUgYnV0IEFwcGxlIGVuZ2luZWVycyBoYXZlCi0vLyBwb2ludGVkIG91dCB0aGF0IHRoZXkgYXJlIHZ1bG5lcmFibGUgdG8gbGl2ZSBsb2NraW5nIG9uIGlPUyBpbiBjYXNlcyBvZgotLy8gcHJpb3JpdHkgaW52ZXJzaW9uOgotLy8gICBodHRwOi8vbWp0c2FpLmNvbS9ibG9nLzIwMTUvMTIvMTYvb3NzcGlubG9jay1pcy11bnNhZmUvCi0vLyAgIGh0dHBzOi8vbGlzdHMuc3dpZnQub3JnL3BpcGVybWFpbC9zd2lmdC1kZXYvV2Vlay1vZi1Nb24tMjAxNTEyMTQvMDAwMzcyLmh0bWwKLXN0YXRpYyBkaXNwYXRjaF9zZW1hcGhvcmVfdCBnRXh0ZW5zaW9uU2luZ2xldG9uRGljdGlvbmFyeVNlbWFwaG9yZTsKLXN0YXRpYyBDRk11dGFibGVEaWN0aW9uYXJ5UmVmIGdFeHRlbnNpb25TaW5nbGV0b25EaWN0aW9uYXJ5ID0gTlVMTDsKLXN0YXRpYyBHUEJFeHRlbnNpb25SZWdpc3RyeSAqZ0RlZmF1bHRFeHRlbnNpb25SZWdpc3RyeSA9IE5VTEw7Ci0KLSsgKHZvaWQpaW5pdGlhbGl6ZSB7Ci0gIC8vIEVuc3VyZSB0aGUgZ2xvYmFsIGlzIHN0YXJ0ZWQgdXAuCi0gIGlmICghZ0V4dGVuc2lvblNpbmdsZXRvbkRpY3Rpb25hcnkpIHsKLSAgICBnRXh0ZW5zaW9uU2luZ2xldG9uRGljdGlvbmFyeVNlbWFwaG9yZSA9IGRpc3BhdGNoX3NlbWFwaG9yZV9jcmVhdGUoMSk7Ci0gICAgQ0ZEaWN0aW9uYXJ5S2V5Q2FsbEJhY2tzIGtleUNhbGxCYWNrcyA9IHsKLSAgICAgIC8vIFNlZSBkZXNjcmlwdGlvbiBhYm92ZSBmb3IgcmVhc29uIGZvciB1c2luZyBjdXN0b20gZGljdGlvbmFyeS4KLSAgICAgIDAsCi0gICAgICBHUEJSb290RXh0ZW5zaW9uS2V5UmV0YWluLAotICAgICAgR1BCUm9vdEV4dGVuc2lvbktleVJlbGVhc2UsCi0gICAgICBHUEJSb290RXh0ZW5zaW9uQ29weUtleURlc2NyaXB0aW9uLAotICAgICAgR1BCUm9vdEV4dGVuc2lvbktleUVxdWFsLAotICAgICAgR1BCUm9vdEV4dGVuc2lvbktleUhhc2gsCi0gICAgfTsKLSAgICBnRXh0ZW5zaW9uU2luZ2xldG9uRGljdGlvbmFyeSA9Ci0gICAgICAgIENGRGljdGlvbmFyeUNyZWF0ZU11dGFibGUoa0NGQWxsb2NhdG9yRGVmYXVsdCwgMCwgJmtleUNhbGxCYWNrcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAma0NGVHlwZURpY3Rpb25hcnlWYWx1ZUNhbGxCYWNrcyk7Ci0gICAgZ0RlZmF1bHRFeHRlbnNpb25SZWdpc3RyeSA9IFtbR1BCRXh0ZW5zaW9uUmVnaXN0cnkgYWxsb2NdIGluaXRdOwotICB9Ci0KLSAgaWYgKFtzZWxmIHN1cGVyY2xhc3NdID09IFtHUEJSb290T2JqZWN0IGNsYXNzXSkgewotICAgIC8vIFRoaXMgaXMgaGVyZSB0byBzdGFydCB1cCBhbGwgdGhlIHBlciBmaWxlICJSb290IiBzdWJjbGFzc2VzLgotICAgIC8vIFRoaXMgbXVzdCBiZSBkb25lIGluIGluaXRpYWxpemUgdG8gZW5mb3JjZSB0aHJlYWQgc2FmZXR5IG9mIHN0YXJ0IHVwIG9mCi0gICAgLy8gdGhlIHByb3RvY29sIGJ1ZmZlciBsaWJyYXJ5LgotICAgIFtzZWxmIGV4dGVuc2lvblJlZ2lzdHJ5XTsKLSAgfQotfQotCi0rIChHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5IHsKLSAgLy8gSXMgb3ZlcnJpZGRlbiBpbiBhbGwgdGhlIHN1YmNsYXNzZXMgdGhhdCBwcm92aWRlIGV4dGVuc2lvbnMgdG8gcHJvdmlkZSB0aGUKLSAgLy8gcGVyIGNsYXNzIG9uZS4KLSAgcmV0dXJuIGdEZWZhdWx0RXh0ZW5zaW9uUmVnaXN0cnk7Ci19Ci0KLSsgKHZvaWQpZ2xvYmFsbHlSZWdpc3RlckV4dGVuc2lvbjooR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqKWZpZWxkIHsKLSAgY29uc3QgY2hhciAqa2V5ID0gW2ZpZWxkIHNpbmdsZXRvbk5hbWVDXTsKLSAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoZ0V4dGVuc2lvblNpbmdsZXRvbkRpY3Rpb25hcnlTZW1hcGhvcmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIERJU1BBVENIX1RJTUVfRk9SRVZFUik7Ci0gIENGRGljdGlvbmFyeVNldFZhbHVlKGdFeHRlbnNpb25TaW5nbGV0b25EaWN0aW9uYXJ5LCBrZXksIGZpZWxkKTsKLSAgZGlzcGF0Y2hfc2VtYXBob3JlX3NpZ25hbChnRXh0ZW5zaW9uU2luZ2xldG9uRGljdGlvbmFyeVNlbWFwaG9yZSk7Ci19Ci0KLXN0YXRpYyBpZCBFeHRlbnNpb25Gb3JOYW1lKGlkIHNlbGYsIFNFTCBfY21kKSB7Ci0gIC8vIFJlYWxseSBmYXN0IHdheSBvZiBkb2luZyAiY2xhc3NuYW1lX3NlbE5hbWUiLgotICAvLyBUaGlzIGNhbWUgdXAgYXMgYSBob3RzcG90IChjcmVhdGlvbiBvZiBOU1N0cmluZyAqKSB3aGVuIGFjY2Vzc2luZyBhCi0gIC8vIGxvdCBvZiBleHRlbnNpb25zLgotICBjb25zdCBjaGFyICpzZWxOYW1lID0gc2VsX2dldE5hbWUoX2NtZCk7Ci0gIGlmIChzZWxOYW1lWzBdID09ICdfJykgewotICAgIHJldHVybiBuaWw7ICAvLyBBcHBsZSBpbnRlcm5hbCBzZWxlY3Rvci4KLSAgfQotICBzaXplX3Qgc2VsTmFtZUxlbiA9IDA7Ci0gIHdoaWxlICgxKSB7Ci0gICAgY2hhciBjID0gc2VsTmFtZVtzZWxOYW1lTGVuXTsKLSAgICBpZiAoYyA9PSAnXDAnKSB7ICAvLyBTdHJpbmcgZW5kLgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChjID09ICc6JykgewotICAgICAgcmV0dXJuIG5pbDsgIC8vIFNlbGVjdG9yIHRvb2sgYW4gYXJnLCBub3Qgb25lIG9mIHRoZSBydW50aW1lIG1ldGhvZHMuCi0gICAgfQotICAgICsrc2VsTmFtZUxlbjsKLSAgfQotCi0gIGNvbnN0IGNoYXIgKmNsYXNzTmFtZSA9IGNsYXNzX2dldE5hbWUoc2VsZik7Ci0gIHNpemVfdCBjbGFzc05hbWVMZW4gPSBzdHJsZW4oY2xhc3NOYW1lKTsKLSAgY2hhciBrZXlbY2xhc3NOYW1lTGVuICsgc2VsTmFtZUxlbiArIDJdOwotICBtZW1jcHkoa2V5LCBjbGFzc05hbWUsIGNsYXNzTmFtZUxlbik7Ci0gIGtleVtjbGFzc05hbWVMZW5dID0gJ18nOwotICBtZW1jcHkoJmtleVtjbGFzc05hbWVMZW4gKyAxXSwgc2VsTmFtZSwgc2VsTmFtZUxlbik7Ci0gIGtleVtjbGFzc05hbWVMZW4gKyAxICsgc2VsTmFtZUxlbl0gPSAnXDAnOwotCi0gIC8vIE5PVEU6IEV2ZW4gdGhvdWdoIHRoaXMgbWV0aG9kIGlzIGNhbGxlZCBmcm9tIGFub3RoZXIgQyBmdW5jdGlvbiwKLSAgLy8gZ0V4dGVuc2lvblNpbmdsZXRvbkRpY3Rpb25hcnlTZW1hcGhvcmUgYW5kIGdFeHRlbnNpb25TaW5nbGV0b25EaWN0aW9uYXJ5Ci0gIC8vIHdpbGwgYWx3YXlzIGJlIGluaXRpYWxpemVkLiBUaGlzIGlzIGJlY2F1c2UgdGhpcyBjYWxsIGZsb3cgaXMganVzdCB0bwotICAvLyBsb29rdXAgdGhlIEV4dGVuc2lvbiwgbWVhbmluZyB0aGUgY29kZSBpcyBjYWxsaW5nIGFuIEV4dGVuc2lvbiBjbGFzcwotICAvLyBtZXNzYWdlIG9uIGEgTWVzc2FnZSBvciBSb290IGNsYXNzLiBUaGlzIGd1YXJhbnRlZXMgdGhhdCB0aGUgY2xhc3Mgd2FzCi0gIC8vIGluaXRpYWxpemVkIGFuZCBNZXNzYWdlIGNsYXNzZXMgZW5zdXJlIHRoZWlyIFJvb3Qgd2FzIGFsc28gaW5pdGlhbGl6ZWQuCi0gIE5TQXNzZXJ0KGdFeHRlbnNpb25TaW5nbGV0b25EaWN0aW9uYXJ5LCBAIlN0YXJ0dXAgb3JkZXIgYnJva2VuISIpOwotCi0gIGRpc3BhdGNoX3NlbWFwaG9yZV93YWl0KGdFeHRlbnNpb25TaW5nbGV0b25EaWN0aW9uYXJ5U2VtYXBob3JlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOwotICBpZCBleHRlbnNpb24gPSAoaWQpQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoZ0V4dGVuc2lvblNpbmdsZXRvbkRpY3Rpb25hcnksIGtleSk7Ci0gIGlmIChleHRlbnNpb24pIHsKLSAgICAvLyBUaGUgbWV0aG9kIGlzIGdldHRpbmcgd2lyZWQgaW4gdG8gdGhlIGNsYXNzLCBzbyBubyBuZWVkIHRvIGtlZXAgaXQgaW4KLSAgICAvLyB0aGUgZGljdGlvbmFyeS4KLSAgICBDRkRpY3Rpb25hcnlSZW1vdmVWYWx1ZShnRXh0ZW5zaW9uU2luZ2xldG9uRGljdGlvbmFyeSwga2V5KTsKLSAgfQotICBkaXNwYXRjaF9zZW1hcGhvcmVfc2lnbmFsKGdFeHRlbnNpb25TaW5nbGV0b25EaWN0aW9uYXJ5U2VtYXBob3JlKTsKLSAgcmV0dXJuIGV4dGVuc2lvbjsKLX0KLQotQk9PTCBHUEJSZXNvbHZlRXh0ZW5zaW9uQ2xhc3NNZXRob2QoQ2xhc3Mgc2VsZiwgU0VMIHNlbCkgewotICAvLyBBbm90aGVyIG9wdGlvbiB3b3VsZCBiZSB0byByZWdpc3RlciB0aGUgZXh0ZW5zaW9ucyB3aXRoIHRoZSBjbGFzcyBhdAotICAvLyBnbG9iYWxseVJlZ2lzdGVyRXh0ZW5zaW9uOgotICAvLyBUaW1pbmcgdGhlIHR3byBzb2x1dGlvbnMsIHRoaXMgc29sdXRpb24gdHVybmVkIG91dCB0byBiZSBtdWNoIGZhc3RlcgotICAvLyBhbmQgcmVkdWNlZCBzdGFydHVwIHRpbWUsIGFuZCBydW50aW1lIG1lbW9yeS4KLSAgLy8gVGhlIGFkdmFudGFnZSB0byBnbG9iYWxseVJlZ2lzdGVyRXh0ZW5zaW9uIGlzIHRoYXQgaXQgd291bGQgcmVkdWNlIHRoZQotICAvLyBzaXplIG9mIHRoZSBwcm90b3Mgc29tZXdoYXQgYmVjYXVzZSB0aGUgc2luZ2xldG9uTmFtZUMgd291bGRuJ3QgbmVlZAotICAvLyB0byBpbmNsdWRlIHRoZSBjbGFzcyBuYW1lLiBGb3IgYSBjbGFzcyB3aXRoIGEgbG90IG9mIGV4dGVuc2lvbnMgaXQKLSAgLy8gY2FuIGFkZCB1cC4gWW91IGNvdWxkIGFsc28gc2lnbmlmaWNhbnRseSByZWR1Y2UgdGhlIGNvZGUgY29tcGxleGl0eSBvZiB0aGlzCi0gIC8vIGZpbGUuCi0gIGlkIGV4dGVuc2lvbiA9IEV4dGVuc2lvbkZvck5hbWUoc2VsZiwgc2VsKTsKLSAgaWYgKGV4dGVuc2lvbiAhPSBuaWwpIHsKLSAgICBjb25zdCBjaGFyICplbmNvZGluZyA9Ci0gICAgICAgIEdQQk1lc3NhZ2VFbmNvZGluZ0ZvclNlbGVjdG9yKEBzZWxlY3RvcihnZXRDbGFzc1ZhbHVlKSwgTk8pOwotICAgIENsYXNzIG1ldGFDbGFzcyA9IG9iamNfZ2V0TWV0YUNsYXNzKGNsYXNzX2dldE5hbWUoc2VsZikpOwotICAgIElNUCBpbXAgPSBpbXBfaW1wbGVtZW50YXRpb25XaXRoQmxvY2soXihpZCBvYmopIHsKLSNwcmFnbWEgdW51c2VkKG9iaikKLSAgICAgIHJldHVybiBleHRlbnNpb247Ci0gICAgfSk7Ci0gICAgaWYgKGNsYXNzX2FkZE1ldGhvZChtZXRhQ2xhc3MsIHNlbCwgaW1wLCBlbmNvZGluZykpIHsKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgfQotICB9Ci0gIHJldHVybiBOTzsKLX0KLQotCi0rIChCT09MKXJlc29sdmVDbGFzc01ldGhvZDooU0VMKXNlbCB7Ci0gIGlmIChHUEJSZXNvbHZlRXh0ZW5zaW9uQ2xhc3NNZXRob2Qoc2VsZiwgc2VsKSkgewotICAgIHJldHVybiBZRVM7Ci0gIH0KLSAgcmV0dXJuIFtzdXBlciByZXNvbHZlQ2xhc3NNZXRob2Q6c2VsXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJSb290T2JqZWN0X1BhY2thZ2VQcml2YXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlJvb3RPYmplY3RfUGFja2FnZVByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M4ZjA5Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlJvb3RPYmplY3RfUGFja2FnZVByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotI2ltcG9ydCAiR1BCUm9vdE9iamVjdC5oIgotCi1AY2xhc3MgR1BCRXh0ZW5zaW9uRGVzY3JpcHRvcjsKLQotQGludGVyZmFjZSBHUEJSb290T2JqZWN0ICgpCi0KLS8vIEdsb2JhbGx5IHJlZ2lzdGVyLgotKyAodm9pZClnbG9iYWxseVJlZ2lzdGVyRXh0ZW5zaW9uOihHUEJFeHRlbnNpb25EZXNjcmlwdG9yICopZmllbGQ7Ci0KLUBlbmQKLQotLy8gUmV0dXJucyBZRVMgaWYgdGhlIHNlbGVjdG9yIHdhcyByZXNvbHZlZCBhbmQgYWRkZWQgdG8gdGhlIGNsYXNzLAotLy8gTk8gb3RoZXJ3aXNlLgotQk9PTCBHUEJSZXNvbHZlRXh0ZW5zaW9uQ2xhc3NNZXRob2QoQ2xhc3Mgc2VsZiwgU0VMIHNlbCk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlJ1bnRpbWVUeXBlcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJSdW50aW1lVHlwZXMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGEzOGIxMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlJ1bnRpbWVUeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotI2ltcG9ydCAiR1BCQm9vdHN0cmFwLmgiCi0KLUBjbGFzcyBHUEJFbnVtRGVzY3JpcHRvcjsKLUBjbGFzcyBHUEJNZXNzYWdlOwotQGNsYXNzIEdQQkludDMyQXJyYXk7Ci0KLS8vIEZ1bmN0aW9uIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBnaXZlbiB2YWx1ZSBjYW4gYmUgcmVwcmVzZW50ZWQgYnkgYW4KLS8vIGVudW0gdHlwZS4KLXR5cGVkZWYgQk9PTCAoKkdQQkVudW1WYWxpZGF0aW9uRnVuYykoaW50MzJfdCk7Ci0KLS8vIEZ1bmN0aW9uIHVzZWQgdG8gZmV0Y2ggYW4gRW51bURlc2NyaXB0b3IuCi10eXBlZGVmIEdQQkVudW1EZXNjcmlwdG9yICooKkdQQkVudW1EZXNjcmlwdG9yRnVuYykodm9pZCk7Ci0KLS8vIE1hZ2ljIHZhbHVlcyB1c2VkIGZvciB3aGVuIGFuIHRoZSBhdCBydW50aW1lIHRvIGluZGljYXRlIGFuIGVudW0gdmFsdWUKLS8vIHRoYXQgd2Fzbid0IGtub3cgYXQgY29tcGlsZSB0aW1lLgotZW51bSB7Ci0gIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUgPSAoaW50MzJfdCkweEZCQURCRUVGLAotfTsKLQotLy8gQSB1bmlvbiBmb3Igc3RvcmluZyBhbGwgcG9zc2libGUgUHJvdG9idWYgdmFsdWVzLgotLy8gTm90ZSB0aGF0IG93bmVyIGlzIHJlc3BvbnNpYmxlIGZvciBtZW1vcnkgbWFuYWdlbWVudCBvZiBvYmplY3QgdHlwZXMuCi10eXBlZGVmIHVuaW9uIHsKLSAgQk9PTCB2YWx1ZUJvb2w7Ci0gIGludDMyX3QgdmFsdWVJbnQzMjsKLSAgaW50NjRfdCB2YWx1ZUludDY0OwotICB1aW50MzJfdCB2YWx1ZVVJbnQzMjsKLSAgdWludDY0X3QgdmFsdWVVSW50NjQ7Ci0gIGZsb2F0IHZhbHVlRmxvYXQ7Ci0gIGRvdWJsZSB2YWx1ZURvdWJsZTsKLSAgR1BCX1VOU0FGRV9VTlJFVEFJTkVEIE5TRGF0YSAqdmFsdWVEYXRhOwotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgTlNTdHJpbmcgKnZhbHVlU3RyaW5nOwotICBHUEJfVU5TQUZFX1VOUkVUQUlORUQgR1BCTWVzc2FnZSAqdmFsdWVNZXNzYWdlOwotICBpbnQzMl90IHZhbHVlRW51bTsKLX0gR1BCR2VuZXJpY1ZhbHVlOwotCi0vLyBEbyBub3QgY2hhbmdlIHRoZSBvcmRlciBvZiB0aGlzIGVudW0gKG9yIGFkZCB0aGluZ3MgdG8gaXQpIHdpdGhvdXQgdGhpbmtpbmcKLS8vIGFib3V0IGl0IHZlcnkgY2FyZWZ1bGx5LiBUaGVyZSBhcmUgc2V2ZXJhbCB0aGluZ3MgdGhhdCBkZXBlbmQgb24gdGhlIG9yZGVyLgotdHlwZWRlZiBOU19FTlVNKHVpbnQ4X3QsIEdQQkRhdGFUeXBlKSB7Ci0gIEdQQkRhdGFUeXBlQm9vbCA9IDAsCi0gIEdQQkRhdGFUeXBlRml4ZWQzMiwKLSAgR1BCRGF0YVR5cGVTRml4ZWQzMiwKLSAgR1BCRGF0YVR5cGVGbG9hdCwKLSAgR1BCRGF0YVR5cGVGaXhlZDY0LAotICBHUEJEYXRhVHlwZVNGaXhlZDY0LAotICBHUEJEYXRhVHlwZURvdWJsZSwKLSAgR1BCRGF0YVR5cGVJbnQzMiwKLSAgR1BCRGF0YVR5cGVJbnQ2NCwKLSAgR1BCRGF0YVR5cGVTSW50MzIsCi0gIEdQQkRhdGFUeXBlU0ludDY0LAotICBHUEJEYXRhVHlwZVVJbnQzMiwKLSAgR1BCRGF0YVR5cGVVSW50NjQsCi0gIEdQQkRhdGFUeXBlQnl0ZXMsCi0gIEdQQkRhdGFUeXBlU3RyaW5nLAotICBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gIEdQQkRhdGFUeXBlR3JvdXAsCi0gIEdQQkRhdGFUeXBlRW51bSwKLX07Ci0KLWVudW0gewotICAvLyBBIGNvdW50IG9mIHRoZSBudW1iZXIgb2YgdHlwZXMgaW4gR1BCRGF0YVR5cGUuIFNlcGFyYXRlZCBvdXQgZnJvbSB0aGUKLSAgLy8gR1BCRGF0YVR5cGUgZW51bSB0byBhdm9pZCB3YXJuaW5ncyByZWdhcmRpbmcgbm90IGhhbmRsaW5nCi0gIC8vIEdQQkRhdGFUeXBlX0NvdW50IGluIHN3aXRjaCBzdGF0ZW1lbnRzLgotICBHUEJEYXRhVHlwZV9Db3VudCA9IEdQQkRhdGFUeXBlRW51bSArIDEKLX07Ci0KLS8vIEFuIGV4dGVuc2lvbiByYW5nZS4KLXR5cGVkZWYgc3RydWN0IEdQQkV4dGVuc2lvblJhbmdlIHsKLSAgdWludDMyX3Qgc3RhcnQ7ICAvLyBpbmNsdXNpdmUKLSAgdWludDMyX3QgZW5kOyAgICAvLyBleGNsdXNpdmUKLX0gR1BCRXh0ZW5zaW9uUmFuZ2U7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlVua25vd25GaWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVbmtub3duRmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGYzMDFlNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlVua25vd25GaWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi1AY2xhc3MgR1BCQ29kZWRPdXRwdXRTdHJlYW07Ci1AY2xhc3MgR1BCVUludDMyQXJyYXk7Ci1AY2xhc3MgR1BCVUludDY0QXJyYXk7Ci1AY2xhc3MgR1BCVW5rbm93bkZpZWxkU2V0OwotCi1OU19BU1NVTUVfTk9OTlVMTF9CRUdJTgotCi0vLy8gU3RvcmUgYW4gdW5rbm93biBmaWVsZC4gVGhlc2UgYXJlIHVzZWQgaW4gY29uanVuY3Rpb24gd2l0aCBAYyBHUEJVbmtub3duRmllbGRTZXQKLUBpbnRlcmZhY2UgR1BCVW5rbm93bkZpZWxkIDogTlNPYmplY3Q8TlNDb3B5aW5nPgotCi0vLy8gVGhlIGZpZWxkIG51bWJlciB0aGUgZGF0YSBpcyBzdG9yZWQgdW5kZXIuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgYXNzaWduKSBpbnQzMl90IG51bWJlcjsKLQotLy8vIEFuIGFycmF5IG9mIHZhcmludCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgc3Ryb25nKSBHUEJVSW50NjRBcnJheSAqdmFyaW50TGlzdDsKLQotLy8vIEFuIGFycmF5IG9mIGZpeGVkMzIgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIHN0cm9uZykgR1BCVUludDMyQXJyYXkgKmZpeGVkMzJMaXN0OwotCi0vLy8gQW4gYXJyYXkgb2YgZml4ZWQ2NCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSwgc3Ryb25nKSBHUEJVSW50NjRBcnJheSAqZml4ZWQ2NExpc3Q7Ci0KLS8vLyBBbiBhcnJheSBvZiBkYXRhIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5LCBzdHJvbmcpIE5TQXJyYXk8TlNEYXRhKj4gKmxlbmd0aERlbGltaXRlZExpc3Q7Ci0KLS8vLyBBbiBhcnJheSBvZiBncm91cHMgb2YgdmFsdWVzIGZvciB0aGlzIGZpZWxkLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHksIHN0cm9uZykgTlNBcnJheTxHUEJVbmtub3duRmllbGRTZXQqPiAqZ3JvdXBMaXN0OwotCi0KLS8vLyBBZGQgYSB2YWx1ZSB0byB0aGUgdmFyaW50TGlzdC4KLS8vLwotLy8vIEBwYXJhbSB2YWx1ZSBUaGUgdmFsdWUgdG8gYWRkLgotLSAodm9pZClhZGRWYXJpbnQ6KHVpbnQ2NF90KXZhbHVlOwotCi0vLy8gQWRkIGEgdmFsdWUgdG8gdGhlIGZpeGVkMzJMaXN0LgotLy8vCi0vLy8gQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQuCi0tICh2b2lkKWFkZEZpeGVkMzI6KHVpbnQzMl90KXZhbHVlOwotCi0vLy8gQWRkIGEgdmFsdWUgdG8gdGhlIGZpeGVkNjRMaXN0LgotLy8vCi0vLy8gQHBhcmFtIHZhbHVlIFRoZSB2YWx1ZSB0byBhZGQuCi0tICh2b2lkKWFkZEZpeGVkNjQ6KHVpbnQ2NF90KXZhbHVlOwotCi0vLy8gQWRkIGEgdmFsdWUgdG8gdGhlIGxlbmd0aERlbGltaXRlZExpc3QuCi0vLy8KLS8vLyBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZC4KLS0gKHZvaWQpYWRkTGVuZ3RoRGVsaW1pdGVkOihOU0RhdGEgKil2YWx1ZTsKLQotLy8vIEFkZCBhIHZhbHVlIHRvIHRoZSBncm91cExpc3QuCi0vLy8KLS8vLyBAcGFyYW0gdmFsdWUgVGhlIHZhbHVlIHRvIGFkZC4KLS0gKHZvaWQpYWRkR3JvdXA6KEdQQlVua25vd25GaWVsZFNldCAqKXZhbHVlOwotCi1AZW5kCi0KLU5TX0FTU1VNRV9OT05OVUxMX0VORApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVbmtub3duRmllbGQubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCVW5rbm93bkZpZWxkLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBlMjliZGUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVbmtub3duRmllbGQubQorKysgL2Rldi9udWxsCkBAIC0xLDMyNiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkX1BhY2thZ2VQcml2YXRlLmgiCi0KLSNpbXBvcnQgIkdQQkFycmF5LmgiCi0jaW1wb3J0ICJHUEJDb2RlZE91dHB1dFN0cmVhbV9QYWNrYWdlUHJpdmF0ZS5oIgotCi1AaW1wbGVtZW50YXRpb24gR1BCVW5rbm93bkZpZWxkIHsKLSBAcHJvdGVjdGVkCi0gIGludDMyX3QgbnVtYmVyXzsKLSAgR1BCVUludDY0QXJyYXkgKm11dGFibGVWYXJpbnRMaXN0XzsKLSAgR1BCVUludDMyQXJyYXkgKm11dGFibGVGaXhlZDMyTGlzdF87Ci0gIEdQQlVJbnQ2NEFycmF5ICptdXRhYmxlRml4ZWQ2NExpc3RfOwotICBOU011dGFibGVBcnJheTxOU0RhdGEqPiAqbXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfOwotICBOU011dGFibGVBcnJheTxHUEJVbmtub3duRmllbGRTZXQqPiAqbXV0YWJsZUdyb3VwTGlzdF87Ci19Ci0KLUBzeW50aGVzaXplIG51bWJlciA9IG51bWJlcl87Ci1Ac3ludGhlc2l6ZSB2YXJpbnRMaXN0ID0gbXV0YWJsZVZhcmludExpc3RfOwotQHN5bnRoZXNpemUgZml4ZWQzMkxpc3QgPSBtdXRhYmxlRml4ZWQzMkxpc3RfOwotQHN5bnRoZXNpemUgZml4ZWQ2NExpc3QgPSBtdXRhYmxlRml4ZWQ2NExpc3RfOwotQHN5bnRoZXNpemUgbGVuZ3RoRGVsaW1pdGVkTGlzdCA9IG11dGFibGVMZW5ndGhEZWxpbWl0ZWRMaXN0XzsKLUBzeW50aGVzaXplIGdyb3VwTGlzdCA9IG11dGFibGVHcm91cExpc3RfOwotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhOdW1iZXI6KGludDMyX3QpbnVtYmVyIHsKLSAgaWYgKChzZWxmID0gW3N1cGVyIGluaXRdKSkgewotICAgIG51bWJlcl8gPSBudW1iZXI7Ci0gIH0KLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLS0gKHZvaWQpZGVhbGxvYyB7Ci0gIFttdXRhYmxlVmFyaW50TGlzdF8gcmVsZWFzZV07Ci0gIFttdXRhYmxlRml4ZWQzMkxpc3RfIHJlbGVhc2VdOwotICBbbXV0YWJsZUZpeGVkNjRMaXN0XyByZWxlYXNlXTsKLSAgW211dGFibGVMZW5ndGhEZWxpbWl0ZWRMaXN0XyByZWxlYXNlXTsKLSAgW211dGFibGVHcm91cExpc3RfIHJlbGVhc2VdOwotCi0gIFtzdXBlciBkZWFsbG9jXTsKLX0KLQotLSAoaWQpY29weVdpdGhab25lOihOU1pvbmUgKil6b25lIHsKLSAgR1BCVW5rbm93bkZpZWxkICpyZXN1bHQgPQotICAgICAgW1tHUEJVbmtub3duRmllbGQgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0V2l0aE51bWJlcjpudW1iZXJfXTsKLSAgcmVzdWx0LT5tdXRhYmxlRml4ZWQzMkxpc3RfID0gW211dGFibGVGaXhlZDMyTGlzdF8gY29weVdpdGhab25lOnpvbmVdOwotICByZXN1bHQtPm11dGFibGVGaXhlZDY0TGlzdF8gPSBbbXV0YWJsZUZpeGVkNjRMaXN0XyBjb3B5V2l0aFpvbmU6em9uZV07Ci0gIHJlc3VsdC0+bXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfID0KLSAgICAgIFttdXRhYmxlTGVuZ3RoRGVsaW1pdGVkTGlzdF8gY29weVdpdGhab25lOnpvbmVdOwotICByZXN1bHQtPm11dGFibGVWYXJpbnRMaXN0XyA9IFttdXRhYmxlVmFyaW50TGlzdF8gY29weVdpdGhab25lOnpvbmVdOwotICBpZiAobXV0YWJsZUdyb3VwTGlzdF8uY291bnQpIHsKLSAgICByZXN1bHQtPm11dGFibGVHcm91cExpc3RfID0gW1tOU011dGFibGVBcnJheSBhbGxvY1dpdGhab25lOnpvbmVdCi0gICAgICAgIGluaXRXaXRoQ2FwYWNpdHk6bXV0YWJsZUdyb3VwTGlzdF8uY291bnRdOwotICAgIGZvciAoR1BCVW5rbm93bkZpZWxkU2V0ICpncm91cCBpbiBtdXRhYmxlR3JvdXBMaXN0XykgewotICAgICAgR1BCVW5rbm93bkZpZWxkU2V0ICpjb3BpZWQgPSBbZ3JvdXAgY29weVdpdGhab25lOnpvbmVdOwotICAgICAgW3Jlc3VsdC0+bXV0YWJsZUdyb3VwTGlzdF8gYWRkT2JqZWN0OmNvcGllZF07Ci0gICAgICBbY29waWVkIHJlbGVhc2VdOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0tIChCT09MKWlzRXF1YWw6KGlkKW9iamVjdCB7Ci0gIGlmIChzZWxmID09IG9iamVjdCkgcmV0dXJuIFlFUzsKLSAgaWYgKCFbb2JqZWN0IGlzS2luZE9mQ2xhc3M6W0dQQlVua25vd25GaWVsZCBjbGFzc11dKSByZXR1cm4gTk87Ci0gIEdQQlVua25vd25GaWVsZCAqZmllbGQgPSAoR1BCVW5rbm93bkZpZWxkICopb2JqZWN0OwotICBCT09MIGVxdWFsVmFyaW50ID0KLSAgICAgIChtdXRhYmxlVmFyaW50TGlzdF8uY291bnQgPT0gMCAmJiBmaWVsZC0+bXV0YWJsZVZhcmludExpc3RfLmNvdW50ID09IDApIHx8Ci0gICAgICBbbXV0YWJsZVZhcmludExpc3RfIGlzRXF1YWw6ZmllbGQtPm11dGFibGVWYXJpbnRMaXN0X107Ci0gIGlmICghZXF1YWxWYXJpbnQpIHJldHVybiBOTzsKLSAgQk9PTCBlcXVhbEZpeGVkMzIgPSAobXV0YWJsZUZpeGVkMzJMaXN0Xy5jb3VudCA9PSAwICYmCi0gICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5tdXRhYmxlRml4ZWQzMkxpc3RfLmNvdW50ID09IDApIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgW211dGFibGVGaXhlZDMyTGlzdF8gaXNFcXVhbDpmaWVsZC0+bXV0YWJsZUZpeGVkMzJMaXN0X107Ci0gIGlmICghZXF1YWxGaXhlZDMyKSByZXR1cm4gTk87Ci0gIEJPT0wgZXF1YWxGaXhlZDY0ID0gKG11dGFibGVGaXhlZDY0TGlzdF8uY291bnQgPT0gMCAmJgotICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bXV0YWJsZUZpeGVkNjRMaXN0Xy5jb3VudCA9PSAwKSB8fAotICAgICAgICAgICAgICAgICAgICAgIFttdXRhYmxlRml4ZWQ2NExpc3RfIGlzRXF1YWw6ZmllbGQtPm11dGFibGVGaXhlZDY0TGlzdF9dOwotICBpZiAoIWVxdWFsRml4ZWQ2NCkgcmV0dXJuIE5POwotICBCT09MIGVxdWFsTERMaXN0ID0KLSAgICAgIChtdXRhYmxlTGVuZ3RoRGVsaW1pdGVkTGlzdF8uY291bnQgPT0gMCAmJgotICAgICAgIGZpZWxkLT5tdXRhYmxlTGVuZ3RoRGVsaW1pdGVkTGlzdF8uY291bnQgPT0gMCkgfHwKLSAgICAgIFttdXRhYmxlTGVuZ3RoRGVsaW1pdGVkTGlzdF8gaXNFcXVhbDpmaWVsZC0+bXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfXTsKLSAgaWYgKCFlcXVhbExETGlzdCkgcmV0dXJuIE5POwotICBCT09MIGVxdWFsR3JvdXBMaXN0ID0KLSAgICAgIChtdXRhYmxlR3JvdXBMaXN0Xy5jb3VudCA9PSAwICYmIGZpZWxkLT5tdXRhYmxlR3JvdXBMaXN0Xy5jb3VudCA9PSAwKSB8fAotICAgICAgW211dGFibGVHcm91cExpc3RfIGlzRXF1YWw6ZmllbGQtPm11dGFibGVHcm91cExpc3RfXTsKLSAgaWYgKCFlcXVhbEdyb3VwTGlzdCkgcmV0dXJuIE5POwotICByZXR1cm4gWUVTOwotfQotCi0tIChOU1VJbnRlZ2VyKWhhc2ggewotICAvLyBKdXN0IG1peCB0aGUgaGFzaGVzIG9mIHRoZSBwb3NzaWJsZSBzdWIgYXJyYXlzLgotICBjb25zdCBpbnQgcHJpbWUgPSAzMTsKLSAgTlNVSW50ZWdlciByZXN1bHQgPSBwcmltZSArIFttdXRhYmxlVmFyaW50TGlzdF8gaGFzaF07Ci0gIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgW211dGFibGVGaXhlZDMyTGlzdF8gaGFzaF07Ci0gIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgW211dGFibGVGaXhlZDY0TGlzdF8gaGFzaF07Ci0gIHJlc3VsdCA9IHByaW1lICogcmVzdWx0ICsgW211dGFibGVMZW5ndGhEZWxpbWl0ZWRMaXN0XyBoYXNoXTsKLSAgcmVzdWx0ID0gcHJpbWUgKiByZXN1bHQgKyBbbXV0YWJsZUdyb3VwTGlzdF8gaGFzaF07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKHZvaWQpd3JpdGVUb091dHB1dDooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXQgewotICBOU1VJbnRlZ2VyIGNvdW50ID0gbXV0YWJsZVZhcmludExpc3RfLmNvdW50OwotICBpZiAoY291bnQgPiAwKSB7Ci0gICAgW291dHB1dCB3cml0ZVVJbnQ2NEFycmF5Om51bWJlcl8gdmFsdWVzOm11dGFibGVWYXJpbnRMaXN0XyB0YWc6MF07Ci0gIH0KLSAgY291bnQgPSBtdXRhYmxlRml4ZWQzMkxpc3RfLmNvdW50OwotICBpZiAoY291bnQgPiAwKSB7Ci0gICAgW291dHB1dCB3cml0ZUZpeGVkMzJBcnJheTpudW1iZXJfIHZhbHVlczptdXRhYmxlRml4ZWQzMkxpc3RfIHRhZzowXTsKLSAgfQotICBjb3VudCA9IG11dGFibGVGaXhlZDY0TGlzdF8uY291bnQ7Ci0gIGlmIChjb3VudCA+IDApIHsKLSAgICBbb3V0cHV0IHdyaXRlRml4ZWQ2NEFycmF5Om51bWJlcl8gdmFsdWVzOm11dGFibGVGaXhlZDY0TGlzdF8gdGFnOjBdOwotICB9Ci0gIGNvdW50ID0gbXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfLmNvdW50OwotICBpZiAoY291bnQgPiAwKSB7Ci0gICAgW291dHB1dCB3cml0ZUJ5dGVzQXJyYXk6bnVtYmVyXyB2YWx1ZXM6bXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfXTsKLSAgfQotICBjb3VudCA9IG11dGFibGVHcm91cExpc3RfLmNvdW50OwotICBpZiAoY291bnQgPiAwKSB7Ci0gICAgW291dHB1dCB3cml0ZVVua25vd25Hcm91cEFycmF5Om51bWJlcl8gdmFsdWVzOm11dGFibGVHcm91cExpc3RfXTsKLSAgfQotfQotCi0tIChzaXplX3Qpc2VyaWFsaXplZFNpemUgewotICBfX2Jsb2NrIHNpemVfdCByZXN1bHQgPSAwOwotICBpbnQzMl90IG51bWJlciA9IG51bWJlcl87Ci0gIFttdXRhYmxlVmFyaW50TGlzdF8KLSAgICAgIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotI3ByYWdtYSB1bnVzZWQoaWR4LCBzdG9wKQotICAgICAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZVVJbnQ2NFNpemUobnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9XTsKLQotICBbbXV0YWJsZUZpeGVkMzJMaXN0XwotICAgICAgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICAgIHJlc3VsdCArPSBHUEJDb21wdXRlRml4ZWQzMlNpemUobnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9XTsKLQotICBbbXV0YWJsZUZpeGVkNjRMaXN0XwotICAgICAgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICAgIHJlc3VsdCArPSBHUEJDb21wdXRlRml4ZWQ2NFNpemUobnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9XTsKLQotICBmb3IgKE5TRGF0YSAqZGF0YSBpbiBtdXRhYmxlTGVuZ3RoRGVsaW1pdGVkTGlzdF8pIHsKLSAgICByZXN1bHQgKz0gR1BCQ29tcHV0ZUJ5dGVzU2l6ZShudW1iZXIsIGRhdGEpOwotICB9Ci0KLSAgZm9yIChHUEJVbmtub3duRmllbGRTZXQgKnNldCBpbiBtdXRhYmxlR3JvdXBMaXN0XykgewotICAgIHJlc3VsdCArPSBHUEJDb21wdXRlVW5rbm93bkdyb3VwU2l6ZShudW1iZXIsIHNldCk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0tICh2b2lkKXdyaXRlQXNNZXNzYWdlU2V0RXh0ZW5zaW9uVG9PdXRwdXQ6KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0IHsKLSAgZm9yIChOU0RhdGEgKmRhdGEgaW4gbXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfKSB7Ci0gICAgW291dHB1dCB3cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb246bnVtYmVyXyB2YWx1ZTpkYXRhXTsKLSAgfQotfQotCi0tIChzaXplX3Qpc2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXRFeHRlbnNpb24gewotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgZm9yIChOU0RhdGEgKmRhdGEgaW4gbXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfKSB7Ci0gICAgcmVzdWx0ICs9IEdQQkNvbXB1dGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZShudW1iZXJfLCBkYXRhKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0tIChOU1N0cmluZyAqKWRlc2NyaXB0aW9uIHsKLSAgTlNNdXRhYmxlU3RyaW5nICpkZXNjcmlwdGlvbiA9IFtOU011dGFibGVTdHJpbmcKLSAgICAgIHN0cmluZ1dpdGhGb3JtYXQ6QCI8JUAgJXA+OiBGaWVsZDogJWQge1xuIiwgW3NlbGYgY2xhc3NdLCBzZWxmLCBudW1iZXJfXTsKLSAgW211dGFibGVWYXJpbnRMaXN0XwotICAgICAgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChpZHgsIHN0b3ApCi0gICAgICAgIFtkZXNjcmlwdGlvbiBhcHBlbmRGb3JtYXQ6QCJcdCVsbHVcbiIsIHZhbHVlXTsKLSAgICAgIH1dOwotCi0gIFttdXRhYmxlRml4ZWQzMkxpc3RfCi0gICAgICBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xih1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgICAgW2Rlc2NyaXB0aW9uIGFwcGVuZEZvcm1hdDpAIlx0JXVcbiIsIHZhbHVlXTsKLSAgICAgIH1dOwotCi0gIFttdXRhYmxlRml4ZWQ2NExpc3RfCi0gICAgICBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xih1aW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSNwcmFnbWEgdW51c2VkKGlkeCwgc3RvcCkKLSAgICAgICAgW2Rlc2NyaXB0aW9uIGFwcGVuZEZvcm1hdDpAIlx0JWxsdVxuIiwgdmFsdWVdOwotICAgICAgfV07Ci0KLSAgZm9yIChOU0RhdGEgKmRhdGEgaW4gbXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfKSB7Ci0gICAgW2Rlc2NyaXB0aW9uIGFwcGVuZEZvcm1hdDpAIlx0JUBcbiIsIGRhdGFdOwotICB9Ci0KLSAgZm9yIChHUEJVbmtub3duRmllbGRTZXQgKnNldCBpbiBtdXRhYmxlR3JvdXBMaXN0XykgewotICAgIFtkZXNjcmlwdGlvbiBhcHBlbmRGb3JtYXQ6QCJcdCVAXG4iLCBzZXRdOwotICB9Ci0gIFtkZXNjcmlwdGlvbiBhcHBlbmRTdHJpbmc6QCJ9Il07Ci0gIHJldHVybiBkZXNjcmlwdGlvbjsKLX0KLQotLSAodm9pZCltZXJnZUZyb21GaWVsZDooR1BCVW5rbm93bkZpZWxkICopb3RoZXIgewotICBHUEJVSW50NjRBcnJheSAqb3RoZXJWYXJpbnRMaXN0ID0gb3RoZXIudmFyaW50TGlzdDsKLSAgaWYgKG90aGVyVmFyaW50TGlzdC5jb3VudCA+IDApIHsKLSAgICBpZiAobXV0YWJsZVZhcmludExpc3RfID09IG5pbCkgewotICAgICAgbXV0YWJsZVZhcmludExpc3RfID0gW290aGVyVmFyaW50TGlzdCBjb3B5XTsKLSAgICB9IGVsc2UgewotICAgICAgW211dGFibGVWYXJpbnRMaXN0XyBhZGRWYWx1ZXNGcm9tQXJyYXk6b3RoZXJWYXJpbnRMaXN0XTsKLSAgICB9Ci0gIH0KLQotICBHUEJVSW50MzJBcnJheSAqb3RoZXJGaXhlZDMyTGlzdCA9IG90aGVyLmZpeGVkMzJMaXN0OwotICBpZiAob3RoZXJGaXhlZDMyTGlzdC5jb3VudCA+IDApIHsKLSAgICBpZiAobXV0YWJsZUZpeGVkMzJMaXN0XyA9PSBuaWwpIHsKLSAgICAgIG11dGFibGVGaXhlZDMyTGlzdF8gPSBbb3RoZXJGaXhlZDMyTGlzdCBjb3B5XTsKLSAgICB9IGVsc2UgewotICAgICAgW211dGFibGVGaXhlZDMyTGlzdF8gYWRkVmFsdWVzRnJvbUFycmF5Om90aGVyRml4ZWQzMkxpc3RdOwotICAgIH0KLSAgfQotCi0gIEdQQlVJbnQ2NEFycmF5ICpvdGhlckZpeGVkNjRMaXN0ID0gb3RoZXIuZml4ZWQ2NExpc3Q7Ci0gIGlmIChvdGhlckZpeGVkNjRMaXN0LmNvdW50ID4gMCkgewotICAgIGlmIChtdXRhYmxlRml4ZWQ2NExpc3RfID09IG5pbCkgewotICAgICAgbXV0YWJsZUZpeGVkNjRMaXN0XyA9IFtvdGhlckZpeGVkNjRMaXN0IGNvcHldOwotICAgIH0gZWxzZSB7Ci0gICAgICBbbXV0YWJsZUZpeGVkNjRMaXN0XyBhZGRWYWx1ZXNGcm9tQXJyYXk6b3RoZXJGaXhlZDY0TGlzdF07Ci0gICAgfQotICB9Ci0KLSAgTlNBcnJheSAqb3RoZXJMZW5ndGhEZWxpbWl0ZWRMaXN0ID0gb3RoZXIubGVuZ3RoRGVsaW1pdGVkTGlzdDsKLSAgaWYgKG90aGVyTGVuZ3RoRGVsaW1pdGVkTGlzdC5jb3VudCA+IDApIHsKLSAgICBpZiAobXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfID09IG5pbCkgewotICAgICAgbXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfID0gW290aGVyTGVuZ3RoRGVsaW1pdGVkTGlzdCBtdXRhYmxlQ29weV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFttdXRhYmxlTGVuZ3RoRGVsaW1pdGVkTGlzdF8KLSAgICAgICAgICBhZGRPYmplY3RzRnJvbUFycmF5Om90aGVyTGVuZ3RoRGVsaW1pdGVkTGlzdF07Ci0gICAgfQotICB9Ci0KLSAgTlNBcnJheSAqb3RoZXJHcm91cExpc3QgPSBvdGhlci5ncm91cExpc3Q7Ci0gIGlmIChvdGhlckdyb3VwTGlzdC5jb3VudCA+IDApIHsKLSAgICBpZiAobXV0YWJsZUdyb3VwTGlzdF8gPT0gbmlsKSB7Ci0gICAgICBtdXRhYmxlR3JvdXBMaXN0XyA9Ci0gICAgICAgICAgW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpvdGhlckdyb3VwTGlzdC5jb3VudF07Ci0gICAgfQotICAgIC8vIE1ha2Ugb3VyIG93biBtdXRhYmxlIGNvcGllcy4KLSAgICBmb3IgKEdQQlVua25vd25GaWVsZFNldCAqZ3JvdXAgaW4gb3RoZXJHcm91cExpc3QpIHsKLSAgICAgIEdQQlVua25vd25GaWVsZFNldCAqY29waWVkID0gW2dyb3VwIGNvcHldOwotICAgICAgW211dGFibGVHcm91cExpc3RfIGFkZE9iamVjdDpjb3BpZWRdOwotICAgICAgW2NvcGllZCByZWxlYXNlXTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZClhZGRWYXJpbnQ6KHVpbnQ2NF90KXZhbHVlIHsKLSAgaWYgKG11dGFibGVWYXJpbnRMaXN0XyA9PSBuaWwpIHsKLSAgICBtdXRhYmxlVmFyaW50TGlzdF8gPSBbW0dQQlVJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUgY291bnQ6MV07Ci0gIH0gZWxzZSB7Ci0gICAgW211dGFibGVWYXJpbnRMaXN0XyBhZGRWYWx1ZTp2YWx1ZV07Ci0gIH0KLX0KLQotLSAodm9pZClhZGRGaXhlZDMyOih1aW50MzJfdCl2YWx1ZSB7Ci0gIGlmIChtdXRhYmxlRml4ZWQzMkxpc3RfID09IG5pbCkgewotICAgIG11dGFibGVGaXhlZDMyTGlzdF8gPQotICAgICAgICBbW0dQQlVJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczomdmFsdWUgY291bnQ6MV07Ci0gIH0gZWxzZSB7Ci0gICAgW211dGFibGVGaXhlZDMyTGlzdF8gYWRkVmFsdWU6dmFsdWVdOwotICB9Ci19Ci0KLS0gKHZvaWQpYWRkRml4ZWQ2NDoodWludDY0X3QpdmFsdWUgewotICBpZiAobXV0YWJsZUZpeGVkNjRMaXN0XyA9PSBuaWwpIHsKLSAgICBtdXRhYmxlRml4ZWQ2NExpc3RfID0KLSAgICAgICAgW1tHUEJVSW50NjRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6JnZhbHVlIGNvdW50OjFdOwotICB9IGVsc2UgewotICAgIFttdXRhYmxlRml4ZWQ2NExpc3RfIGFkZFZhbHVlOnZhbHVlXTsKLSAgfQotfQotCi0tICh2b2lkKWFkZExlbmd0aERlbGltaXRlZDooTlNEYXRhICopdmFsdWUgewotICBpZiAobXV0YWJsZUxlbmd0aERlbGltaXRlZExpc3RfID09IG5pbCkgewotICAgIG11dGFibGVMZW5ndGhEZWxpbWl0ZWRMaXN0XyA9Ci0gICAgICAgIFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czomdmFsdWUgY291bnQ6MV07Ci0gIH0gZWxzZSB7Ci0gICAgW211dGFibGVMZW5ndGhEZWxpbWl0ZWRMaXN0XyBhZGRPYmplY3Q6dmFsdWVdOwotICB9Ci19Ci0KLS0gKHZvaWQpYWRkR3JvdXA6KEdQQlVua25vd25GaWVsZFNldCAqKXZhbHVlIHsKLSAgaWYgKG11dGFibGVHcm91cExpc3RfID09IG5pbCkgewotICAgIG11dGFibGVHcm91cExpc3RfID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOiZ2YWx1ZSBjb3VudDoxXTsKLSAgfSBlbHNlIHsKLSAgICBbbXV0YWJsZUdyb3VwTGlzdF8gYWRkT2JqZWN0OnZhbHVlXTsKLSAgfQotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlVua25vd25GaWVsZFNldC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVbmtub3duRmllbGRTZXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y2MTI5OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlVua25vd25GaWVsZFNldC5oCisrKyAvZGV2L251bGwKQEAgLTEsNjUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi1AY2xhc3MgR1BCVW5rbm93bkZpZWxkOwotCi1OU19BU1NVTUVfTk9OTlVMTF9CRUdJTgotCi0vLy8gQSBjb2xsZWN0aW9uIG9mIHVua25vd24gZmllbGRzLgotQGludGVyZmFjZSBHUEJVbmtub3duRmllbGRTZXQgOiBOU09iamVjdDxOU0NvcHlpbmc+Ci0KLS8vLyBUZXN0cyB0byBzZWUgaWYgdGhlIGdpdmVuIGZpZWxkIG51bWJlciBoYXMgYSB2YWx1ZS4KLS8vLwotLy8vIEBwYXJhbSBudW1iZXIgVGhlIGZpZWxkIG51bWJlciB0byBjaGVjay4KLS8vLwotLy8vIEByZXR1cm4gWUVTIGlmIHRoZXJlIGlzIGFuIHVua25vd24gZmllbGQgZm9yIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuCi0tIChCT09MKWhhc0ZpZWxkOihpbnQzMl90KW51bWJlcjsKLQotLy8vIEZldGNoZXMgdGhlIEBjIEdQQlVua25vd25GaWVsZCBmb3IgdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS8vLwotLy8vIEBwYXJhbSBudW1iZXIgVGhlIGZpZWxkIG51bWJlciB0byBsb29rIHVwLgotLy8vCi0vLy8gQHJldHVybiBUaGUgQGMgR1BCVW5rbm93bkZpZWxkIG9yIG5pbC4KLS0gKG51bGxhYmxlIEdQQlVua25vd25GaWVsZCAqKWdldEZpZWxkOihpbnQzMl90KW51bWJlcjsKLQotLy8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgaW4gdGhpcyBzZXQuCi0tIChOU1VJbnRlZ2VyKWNvdW50T2ZGaWVsZHM7Ci0KLS8vLyBBZGRzIHRoZSBnaXZlbiBmaWVsZCB0byB0aGUgc2V0LgotLSAodm9pZClhZGRGaWVsZDooR1BCVW5rbm93bkZpZWxkICopZmllbGQ7Ci0KLS8vLyBSZXR1cm5zIGFuIE5TQXJyYXkgb2YgdGhlIEBjIEdQQlVua25vd25GaWVsZHMgc29ydGVkIGJ5IHRoZSBmaWVsZCBudW1iZXJzLgotLSAoTlNBcnJheTxHUEJVbmtub3duRmllbGQqPiAqKXNvcnRlZEZpZWxkczsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCVW5rbm93bkZpZWxkU2V0Lm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlVua25vd25GaWVsZFNldC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZGRjMGQyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCVW5rbm93bkZpZWxkU2V0Lm0KKysrIC9kZXYvbnVsbApAQCAtMSw0MjMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQlVua25vd25GaWVsZFNldF9QYWNrYWdlUHJpdmF0ZS5oIgotCi0jaW1wb3J0ICJHUEJDb2RlZElucHV0U3RyZWFtX1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJHUEJDb2RlZE91dHB1dFN0cmVhbS5oIgotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkX1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJHUEJVdGlsaXRpZXMuaCIKLSNpbXBvcnQgIkdQQldpcmVGb3JtYXQuaCIKLQotI3ByYWdtYSBtYXJrIENGRGljdGlvbmFyeUtleUNhbGxCYWNrcwotCi0vLyBXZSB1c2UgYSBjdXN0b20gZGljdGlvbmFyeSBoZXJlIGJlY2F1c2Ugb3VyIGtleXMgYXJlIG51bWJlcnMgYW5kCi0vLyBjb252ZXJzaW9uIGJhY2sgYW5kIGZvcnRoIGZyb20gTlNOdW1iZXIgd2FzIGNvc3RpbmcgdXMgcGVyZm9ybWFuY2UuCi0vLyBJZi93aGVuIHdlIG1vdmUgdG8gQysrIHRoaXMgY291bGQgYmUgZG9uZSB1c2luZyBhIHN0ZDo6bWFwIGFuZCBzb21lCi0vLyBjYXJlZnVsIHJldGFpbi9yZWxlYXNlIGNhbGxzLgotCi1zdGF0aWMgY29uc3Qgdm9pZCAqR1BCVW5rbm93bkZpZWxkU2V0S2V5UmV0YWluKENGQWxsb2NhdG9yUmVmIGFsbG9jYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUpIHsKLSNwcmFnbWEgdW51c2VkKGFsbG9jYXRvcikKLSAgcmV0dXJuIHZhbHVlOwotfQotCi1zdGF0aWMgdm9pZCBHUEJVbmtub3duRmllbGRTZXRLZXlSZWxlYXNlKENGQWxsb2NhdG9yUmVmIGFsbG9jYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUpIHsKLSNwcmFnbWEgdW51c2VkKGFsbG9jYXRvcikKLSNwcmFnbWEgdW51c2VkKHZhbHVlKQotfQotCi1zdGF0aWMgQ0ZTdHJpbmdSZWYgR1BCVW5rbm93bkZpZWxkU2V0Q29weUtleURlc2NyaXB0aW9uKGNvbnN0IHZvaWQgKnZhbHVlKSB7Ci0gIHJldHVybiBDRlN0cmluZ0NyZWF0ZVdpdGhGb3JtYXQoa0NGQWxsb2NhdG9yRGVmYXVsdCwgTlVMTCwgQ0ZTVFIoIiVkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludCl2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBCb29sZWFuIEdQQlVua25vd25GaWVsZFNldEtleUVxdWFsKGNvbnN0IHZvaWQgKnZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlMikgewotICByZXR1cm4gdmFsdWUxID09IHZhbHVlMjsKLX0KLQotc3RhdGljIENGSGFzaENvZGUgR1BCVW5rbm93bkZpZWxkU2V0S2V5SGFzaChjb25zdCB2b2lkICp2YWx1ZSkgewotICByZXR1cm4gKENGSGFzaENvZGUpdmFsdWU7Ci19Ci0KLSNwcmFnbWEgbWFyayBIZWxwZXJzCi0KLXN0YXRpYyB2b2lkIGNoZWNrTnVtYmVyKGludDMyX3QgbnVtYmVyKSB7Ci0gIGlmIChudW1iZXIgPT0gMCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiJdOwotICB9Ci19Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVbmtub3duRmllbGRTZXQgewotIEBwYWNrYWdlCi0gIENGTXV0YWJsZURpY3Rpb25hcnlSZWYgZmllbGRzXzsKLX0KLQotc3RhdGljIHZvaWQgQ29weVdvcmtlcihjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKnZhbHVlLCB2b2lkICpjb250ZXh0KSB7Ci0jcHJhZ21hIHVudXNlZChrZXkpCi0gIEdQQlVua25vd25GaWVsZCAqZmllbGQgPSB2YWx1ZTsKLSAgR1BCVW5rbm93bkZpZWxkU2V0ICpyZXN1bHQgPSBjb250ZXh0OwotCi0gIEdQQlVua25vd25GaWVsZCAqY29waWVkID0gW2ZpZWxkIGNvcHldOwotICBbcmVzdWx0IGFkZEZpZWxkOmNvcGllZF07Ci0gIFtjb3BpZWQgcmVsZWFzZV07Ci19Ci0KLS0gKGlkKWNvcHlXaXRoWm9uZTooTlNab25lICopem9uZSB7Ci0gIEdQQlVua25vd25GaWVsZFNldCAqcmVzdWx0ID0gW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NXaXRoWm9uZTp6b25lXSBpbml0XTsKLSAgaWYgKGZpZWxkc18pIHsKLSAgICBDRkRpY3Rpb25hcnlBcHBseUZ1bmN0aW9uKGZpZWxkc18sIENvcHlXb3JrZXIsIHJlc3VsdCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLSAodm9pZClkZWFsbG9jIHsKLSAgaWYgKGZpZWxkc18pIHsKLSAgICBDRlJlbGVhc2UoZmllbGRzXyk7Ci0gIH0KLSAgW3N1cGVyIGRlYWxsb2NdOwotfQotCi0tIChCT09MKWlzRXF1YWw6KGlkKW9iamVjdCB7Ci0gIEJPT0wgZXF1YWwgPSBOTzsKLSAgaWYgKFtvYmplY3QgaXNLaW5kT2ZDbGFzczpbR1BCVW5rbm93bkZpZWxkU2V0IGNsYXNzXV0pIHsKLSAgICBHUEJVbmtub3duRmllbGRTZXQgKnNldCA9IChHUEJVbmtub3duRmllbGRTZXQgKilvYmplY3Q7Ci0gICAgaWYgKChmaWVsZHNfID09IE5VTEwpICYmIChzZXQtPmZpZWxkc18gPT0gTlVMTCkpIHsKLSAgICAgIGVxdWFsID0gWUVTOwotICAgIH0gZWxzZSBpZiAoKGZpZWxkc18gIT0gTlVMTCkgJiYgKHNldC0+ZmllbGRzXyAhPSBOVUxMKSkgewotICAgICAgZXF1YWwgPSBDRkVxdWFsKGZpZWxkc18sIHNldC0+ZmllbGRzXyk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBlcXVhbDsKLX0KLQotLSAoTlNVSW50ZWdlciloYXNoIHsKLSAgLy8gUmV0dXJuIHRoZSBoYXNoIG9mIHRoZSBmaWVsZHMgZGljdGlvbmFyeSAob3IganVzdCBzb21lIHZhbHVlKS4KLSAgaWYgKGZpZWxkc18pIHsKLSAgICByZXR1cm4gQ0ZIYXNoKGZpZWxkc18pOwotICB9Ci0gIHJldHVybiAoTlNVSW50ZWdlcilbR1BCVW5rbm93bkZpZWxkU2V0IGNsYXNzXTsKLX0KLQotI3ByYWdtYSBtYXJrIC0gUHVibGljIE1ldGhvZHMKLQotLSAoQk9PTCloYXNGaWVsZDooaW50MzJfdCludW1iZXIgewotICBzc2l6ZV90IGtleSA9IG51bWJlcjsKLSAgcmV0dXJuIGZpZWxkc18gPyAoQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoZmllbGRzXywgKHZvaWQgKilrZXkpICE9IG5pbCkgOiBOTzsKLX0KLQotLSAoR1BCVW5rbm93bkZpZWxkICopZ2V0RmllbGQ6KGludDMyX3QpbnVtYmVyIHsKLSAgc3NpemVfdCBrZXkgPSBudW1iZXI7Ci0gIEdQQlVua25vd25GaWVsZCAqcmVzdWx0ID0KLSAgICAgIGZpZWxkc18gPyBDRkRpY3Rpb25hcnlHZXRWYWx1ZShmaWVsZHNfLCAodm9pZCAqKWtleSkgOiBuaWw7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS0gKE5TVUludGVnZXIpY291bnRPZkZpZWxkcyB7Ci0gIHJldHVybiBmaWVsZHNfID8gQ0ZEaWN0aW9uYXJ5R2V0Q291bnQoZmllbGRzXykgOiAwOwotfQotCi0tIChOU0FycmF5ICopc29ydGVkRmllbGRzIHsKLSAgaWYgKCFmaWVsZHNfKSByZXR1cm4gbmlsOwotICBzaXplX3QgY291bnQgPSBDRkRpY3Rpb25hcnlHZXRDb3VudChmaWVsZHNfKTsKLSAgc3NpemVfdCBrZXlzW2NvdW50XTsKLSAgR1BCVW5rbm93bkZpZWxkICp2YWx1ZXNbY291bnRdOwotICBDRkRpY3Rpb25hcnlHZXRLZXlzQW5kVmFsdWVzKGZpZWxkc18sIChjb25zdCB2b2lkICoqKWtleXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNvbnN0IHZvaWQgKiopdmFsdWVzKTsKLSAgc3RydWN0IEdQQkZpZWxkUGFpciB7Ci0gICAgc3NpemVfdCBrZXk7Ci0gICAgR1BCVW5rbm93bkZpZWxkICp2YWx1ZTsKLSAgfSBwYWlyc1tjb3VudF07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIHBhaXJzW2ldLmtleSA9IGtleXNbaV07Ci0gICAgcGFpcnNbaV0udmFsdWUgPSB2YWx1ZXNbaV07Ci0gIH07Ci0gIHFzb3J0X2IocGFpcnMsIGNvdW50LCBzaXplb2Yoc3RydWN0IEdQQkZpZWxkUGFpciksCi0gICAgICAgICAgXihjb25zdCB2b2lkICpmaXJzdCwgY29uc3Qgdm9pZCAqc2Vjb25kKSB7Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgR1BCRmllbGRQYWlyICphID0gZmlyc3Q7Ci0gICAgICAgICAgICBjb25zdCBzdHJ1Y3QgR1BCRmllbGRQYWlyICpiID0gc2Vjb25kOwotICAgICAgICAgICAgcmV0dXJuIChhLT5rZXkgPiBiLT5rZXkpID8gMSA6ICgoYS0+a2V5ID09IGItPmtleSkgPyAwIDogLTEpOwotICAgICAgICAgIH0pOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICB2YWx1ZXNbaV0gPSBwYWlyc1tpXS52YWx1ZTsKLSAgfTsKLSAgcmV0dXJuIFtOU0FycmF5IGFycmF5V2l0aE9iamVjdHM6dmFsdWVzIGNvdW50OmNvdW50XTsKLX0KLQotI3ByYWdtYSBtYXJrIC0gSW50ZXJuYWwgTWV0aG9kcwotCi0tICh2b2lkKXdyaXRlVG9Db2RlZE91dHB1dFN0cmVhbTooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXQgewotICBpZiAoIWZpZWxkc18pIHJldHVybjsKLSAgc2l6ZV90IGNvdW50ID0gQ0ZEaWN0aW9uYXJ5R2V0Q291bnQoZmllbGRzXyk7Ci0gIHNzaXplX3Qga2V5c1tjb3VudF07Ci0gIEdQQlVua25vd25GaWVsZCAqdmFsdWVzW2NvdW50XTsKLSAgQ0ZEaWN0aW9uYXJ5R2V0S2V5c0FuZFZhbHVlcyhmaWVsZHNfLCAoY29uc3Qgdm9pZCAqKilrZXlzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjb25zdCB2b2lkICoqKXZhbHVlcyk7Ci0gIGlmIChjb3VudCA+IDEpIHsKLSAgICBzdHJ1Y3QgR1BCRmllbGRQYWlyIHsKLSAgICAgIHNzaXplX3Qga2V5OwotICAgICAgR1BCVW5rbm93bkZpZWxkICp2YWx1ZTsKLSAgICB9IHBhaXJzW2NvdW50XTsKLQotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgcGFpcnNbaV0ua2V5ID0ga2V5c1tpXTsKLSAgICAgIHBhaXJzW2ldLnZhbHVlID0gdmFsdWVzW2ldOwotICAgIH07Ci0gICAgcXNvcnRfYihwYWlycywgY291bnQsIHNpemVvZihzdHJ1Y3QgR1BCRmllbGRQYWlyKSwKLSAgICAgICAgICAgIF4oY29uc3Qgdm9pZCAqZmlyc3QsIGNvbnN0IHZvaWQgKnNlY29uZCkgewotICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgR1BCRmllbGRQYWlyICphID0gZmlyc3Q7Ci0gICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCBHUEJGaWVsZFBhaXIgKmIgPSBzZWNvbmQ7Ci0gICAgICAgICAgICAgIHJldHVybiAoYS0+a2V5ID4gYi0+a2V5KSA/IDEgOiAoKGEtPmtleSA9PSBiLT5rZXkpID8gMCA6IC0xKTsKLSAgICAgICAgICAgIH0pOwotICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgR1BCVW5rbm93bkZpZWxkICp2YWx1ZSA9IHBhaXJzW2ldLnZhbHVlOwotICAgICAgW3ZhbHVlIHdyaXRlVG9PdXRwdXQ6b3V0cHV0XTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgW3ZhbHVlc1swXSB3cml0ZVRvT3V0cHV0Om91dHB1dF07Ci0gIH0KLX0KLQotLSAoTlNTdHJpbmcgKilkZXNjcmlwdGlvbiB7Ci0gIE5TTXV0YWJsZVN0cmluZyAqZGVzY3JpcHRpb24gPSBbTlNNdXRhYmxlU3RyaW5nCi0gICAgICBzdHJpbmdXaXRoRm9ybWF0OkAiPCVAICVwPjogVGV4dEZvcm1hdDoge1xuIiwgW3NlbGYgY2xhc3NdLCBzZWxmXTsKLSAgTlNTdHJpbmcgKnRleHRGb3JtYXQgPSBHUEJUZXh0Rm9ybWF0Rm9yVW5rbm93bkZpZWxkU2V0KHNlbGYsIEAiICAiKTsKLSAgW2Rlc2NyaXB0aW9uIGFwcGVuZFN0cmluZzp0ZXh0Rm9ybWF0XTsKLSAgW2Rlc2NyaXB0aW9uIGFwcGVuZFN0cmluZzpAIn0iXTsKLSAgcmV0dXJuIGRlc2NyaXB0aW9uOwotfQotCi1zdGF0aWMgdm9pZCBHUEJVbmtub3duRmllbGRTZXRTZXJpYWxpemVkU2l6ZShjb25zdCB2b2lkICprZXksIGNvbnN0IHZvaWQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY29udGV4dCkgewotI3ByYWdtYSB1bnVzZWQoa2V5KQotICBHUEJVbmtub3duRmllbGQgKmZpZWxkID0gdmFsdWU7Ci0gIHNpemVfdCAqcmVzdWx0ID0gY29udGV4dDsKLSAgKnJlc3VsdCArPSBbZmllbGQgc2VyaWFsaXplZFNpemVdOwotfQotCi0tIChzaXplX3Qpc2VyaWFsaXplZFNpemUgewotICBzaXplX3QgcmVzdWx0ID0gMDsKLSAgaWYgKGZpZWxkc18pIHsKLSAgICBDRkRpY3Rpb25hcnlBcHBseUZ1bmN0aW9uKGZpZWxkc18sIEdQQlVua25vd25GaWVsZFNldFNlcmlhbGl6ZWRTaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnJlc3VsdCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIHZvaWQgR1BCVW5rbm93bkZpZWxkU2V0V3JpdGVBc01lc3NhZ2VTZXRUbyhjb25zdCB2b2lkICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KSB7Ci0jcHJhZ21hIHVudXNlZChrZXkpCi0gIEdQQlVua25vd25GaWVsZCAqZmllbGQgPSB2YWx1ZTsKLSAgR1BCQ29kZWRPdXRwdXRTdHJlYW0gKm91dHB1dCA9IGNvbnRleHQ7Ci0gIFtmaWVsZCB3cml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvT3V0cHV0Om91dHB1dF07Ci19Ci0KLS0gKHZvaWQpd3JpdGVBc01lc3NhZ2VTZXRUbzooR1BCQ29kZWRPdXRwdXRTdHJlYW0gKilvdXRwdXQgewotICBpZiAoZmllbGRzXykgewotICAgIENGRGljdGlvbmFyeUFwcGx5RnVuY3Rpb24oZmllbGRzXywgR1BCVW5rbm93bkZpZWxkU2V0V3JpdGVBc01lc3NhZ2VTZXRUbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgR1BCVW5rbm93bkZpZWxkU2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoY29uc3Qgdm9pZCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjb250ZXh0KSB7Ci0jcHJhZ21hIHVudXNlZChrZXkpCi0gIEdQQlVua25vd25GaWVsZCAqZmllbGQgPSB2YWx1ZTsKLSAgc2l6ZV90ICpyZXN1bHQgPSBjb250ZXh0OwotICAqcmVzdWx0ICs9IFtmaWVsZCBzZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldEV4dGVuc2lvbl07Ci19Ci0KLS0gKHNpemVfdClzZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldCB7Ci0gIHNpemVfdCByZXN1bHQgPSAwOwotICBpZiAoZmllbGRzXykgewotICAgIENGRGljdGlvbmFyeUFwcGx5RnVuY3Rpb24oCi0gICAgICAgIGZpZWxkc18sIEdQQlVua25vd25GaWVsZFNldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0LCAmcmVzdWx0KTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0tIChOU0RhdGEgKilkYXRhIHsKLSAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOnNlbGYuc2VyaWFsaXplZFNpemVdOwotICBHUEJDb2RlZE91dHB1dFN0cmVhbSAqb3V0cHV0ID0KLSAgICAgIFtbR1BCQ29kZWRPdXRwdXRTdHJlYW0gYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhXTsKLSAgW3NlbGYgd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dF07Ci0gIFtvdXRwdXQgcmVsZWFzZV07Ci0gIHJldHVybiBkYXRhOwotfQotCi0rIChCT09MKWlzRmllbGRUYWc6KGludDMyX3QpdGFnIHsKLSAgcmV0dXJuIEdQQldpcmVGb3JtYXRHZXRUYWdXaXJlVHlwZSh0YWcpICE9IEdQQldpcmVGb3JtYXRFbmRHcm91cDsKLX0KLQotLSAodm9pZClhZGRGaWVsZDooR1BCVW5rbm93bkZpZWxkICopZmllbGQgewotICBpbnQzMl90IG51bWJlciA9IFtmaWVsZCBudW1iZXJdOwotICBjaGVja051bWJlcihudW1iZXIpOwotICBpZiAoIWZpZWxkc18pIHsKLSAgICBDRkRpY3Rpb25hcnlLZXlDYWxsQmFja3Mga2V5Q2FsbEJhY2tzID0gewotICAgICAgICAvLyBTZWUgZGVzY3JpcHRpb24gYWJvdmUgZm9yIHJlYXNvbiBmb3IgdXNpbmcgY3VzdG9tIGRpY3Rpb25hcnkuCi0gICAgICAgIDAsIEdQQlVua25vd25GaWVsZFNldEtleVJldGFpbiwgR1BCVW5rbm93bkZpZWxkU2V0S2V5UmVsZWFzZSwKLSAgICAgICAgR1BCVW5rbm93bkZpZWxkU2V0Q29weUtleURlc2NyaXB0aW9uLCBHUEJVbmtub3duRmllbGRTZXRLZXlFcXVhbCwKLSAgICAgICAgR1BCVW5rbm93bkZpZWxkU2V0S2V5SGFzaCwKLSAgICB9OwotICAgIGZpZWxkc18gPSBDRkRpY3Rpb25hcnlDcmVhdGVNdXRhYmxlKGtDRkFsbG9jYXRvckRlZmF1bHQsIDAsICZrZXlDYWxsQmFja3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmtDRlR5cGVEaWN0aW9uYXJ5VmFsdWVDYWxsQmFja3MpOwotICB9Ci0gIHNzaXplX3Qga2V5ID0gbnVtYmVyOwotICBDRkRpY3Rpb25hcnlTZXRWYWx1ZShmaWVsZHNfLCAoY29uc3Qgdm9pZCAqKWtleSwgZmllbGQpOwotfQotCi0tIChHUEJVbmtub3duRmllbGQgKiltdXRhYmxlRmllbGRGb3JOdW1iZXI6KGludDMyX3QpbnVtYmVyIGNyZWF0ZTooQk9PTCljcmVhdGUgewotICBzc2l6ZV90IGtleSA9IG51bWJlcjsKLSAgR1BCVW5rbm93bkZpZWxkICpleGlzdGluZyA9Ci0gICAgICBmaWVsZHNfID8gQ0ZEaWN0aW9uYXJ5R2V0VmFsdWUoZmllbGRzXywgKGNvbnN0IHZvaWQgKilrZXkpIDogbmlsOwotICBpZiAoIWV4aXN0aW5nICYmIGNyZWF0ZSkgewotICAgIGV4aXN0aW5nID0gW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOm51bWJlcl07Ci0gICAgLy8gVGhpcyByZXRhaW5zIGV4aXN0aW5nLgotICAgIFtzZWxmIGFkZEZpZWxkOmV4aXN0aW5nXTsKLSAgICBbZXhpc3RpbmcgcmVsZWFzZV07Ci0gIH0KLSAgcmV0dXJuIGV4aXN0aW5nOwotfQotCi1zdGF0aWMgdm9pZCBHUEJVbmtub3duRmllbGRTZXRNZXJnZVVua25vd25GaWVsZHMoY29uc3Qgdm9pZCAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNvbnRleHQpIHsKLSNwcmFnbWEgdW51c2VkKGtleSkKLSAgR1BCVW5rbm93bkZpZWxkICpmaWVsZCA9IHZhbHVlOwotICBHUEJVbmtub3duRmllbGRTZXQgKnNlbGYgPSBjb250ZXh0OwotCi0gIGludDMyX3QgbnVtYmVyID0gW2ZpZWxkIG51bWJlcl07Ci0gIGNoZWNrTnVtYmVyKG51bWJlcik7Ci0gIEdQQlVua25vd25GaWVsZCAqb2xkRmllbGQgPSBbc2VsZiBtdXRhYmxlRmllbGRGb3JOdW1iZXI6bnVtYmVyIGNyZWF0ZTpOT107Ci0gIGlmIChvbGRGaWVsZCkgewotICAgIFtvbGRGaWVsZCBtZXJnZUZyb21GaWVsZDpmaWVsZF07Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTWVyZ2Ugb25seSBjb21lcyBmcm9tIEdQQk1lc3NhZ2UncyBtZXJnZUZyb206LCBzbyBpdCBtZWFucyB3ZSBhcmUgb24KLSAgICAvLyBtdXRhYmxlIG1lc3NhZ2UgYW5kIGFyZSBhbiBtdXRhYmxlIGluc3RhbmNlLCBzbyBtYWtlIHN1cmUgd2UgbmVlZAotICAgIC8vIG11dGFibGUgZmllbGRzLgotICAgIEdQQlVua25vd25GaWVsZCAqZmllbGRDb3B5ID0gW2ZpZWxkIGNvcHldOwotICAgIFtzZWxmIGFkZEZpZWxkOmZpZWxkQ29weV07Ci0gICAgW2ZpZWxkQ29weSByZWxlYXNlXTsKLSAgfQotfQotCi0tICh2b2lkKW1lcmdlVW5rbm93bkZpZWxkczooR1BCVW5rbm93bkZpZWxkU2V0ICopb3RoZXIgewotICBpZiAob3RoZXIgJiYgb3RoZXItPmZpZWxkc18pIHsKLSAgICBDRkRpY3Rpb25hcnlBcHBseUZ1bmN0aW9uKG90aGVyLT5maWVsZHNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCVW5rbm93bkZpZWxkU2V0TWVyZ2VVbmtub3duRmllbGRzLCBzZWxmKTsKLSAgfQotfQotCi0tICh2b2lkKW1lcmdlRnJvbURhdGE6KE5TRGF0YSAqKWRhdGEgewotICBHUEJDb2RlZElucHV0U3RyZWFtICppbnB1dCA9IFtbR1BCQ29kZWRJbnB1dFN0cmVhbSBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGFdOwotICBbc2VsZiBtZXJnZUZyb21Db2RlZElucHV0U3RyZWFtOmlucHV0XTsKLSAgW2lucHV0IGNoZWNrTGFzdFRhZ1dhczowXTsKLSAgW2lucHV0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKW1lcmdlVmFyaW50RmllbGQ6KGludDMyX3QpbnVtYmVyIHZhbHVlOihpbnQzMl90KXZhbHVlIHsKLSAgY2hlY2tOdW1iZXIobnVtYmVyKTsKLSAgW1tzZWxmIG11dGFibGVGaWVsZEZvck51bWJlcjpudW1iZXIgY3JlYXRlOllFU10gYWRkVmFyaW50OnZhbHVlXTsKLX0KLQotLSAoQk9PTCltZXJnZUZpZWxkRnJvbTooaW50MzJfdCl0YWcgaW5wdXQ6KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dCB7Ci0gIGludDMyX3QgbnVtYmVyID0gR1BCV2lyZUZvcm1hdEdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW1TdGF0ZSAqc3RhdGUgPSAmaW5wdXQtPnN0YXRlXzsKLSAgc3dpdGNoIChHUEJXaXJlRm9ybWF0R2V0VGFnV2lyZVR5cGUodGFnKSkgewotICAgIGNhc2UgR1BCV2lyZUZvcm1hdFZhcmludDogewotICAgICAgR1BCVW5rbm93bkZpZWxkICpmaWVsZCA9IFtzZWxmIG11dGFibGVGaWVsZEZvck51bWJlcjpudW1iZXIgY3JlYXRlOllFU107Ci0gICAgICBbZmllbGQgYWRkVmFyaW50OkdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkSW50NjQoc3RhdGUpXTsKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgfQotICAgIGNhc2UgR1BCV2lyZUZvcm1hdEZpeGVkNjQ6IHsKLSAgICAgIEdQQlVua25vd25GaWVsZCAqZmllbGQgPSBbc2VsZiBtdXRhYmxlRmllbGRGb3JOdW1iZXI6bnVtYmVyIGNyZWF0ZTpZRVNdOwotICAgICAgW2ZpZWxkIGFkZEZpeGVkNjQ6R1BCQ29kZWRJbnB1dFN0cmVhbVJlYWRGaXhlZDY0KHN0YXRlKV07Ci0gICAgICByZXR1cm4gWUVTOwotICAgIH0KLSAgICBjYXNlIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQ6IHsKLSAgICAgIE5TRGF0YSAqZGF0YSA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkUmV0YWluZWRCeXRlcyhzdGF0ZSk7Ci0gICAgICBHUEJVbmtub3duRmllbGQgKmZpZWxkID0gW3NlbGYgbXV0YWJsZUZpZWxkRm9yTnVtYmVyOm51bWJlciBjcmVhdGU6WUVTXTsKLSAgICAgIFtmaWVsZCBhZGRMZW5ndGhEZWxpbWl0ZWQ6ZGF0YV07Ci0gICAgICBbZGF0YSByZWxlYXNlXTsKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgfQotICAgIGNhc2UgR1BCV2lyZUZvcm1hdFN0YXJ0R3JvdXA6IHsKLSAgICAgIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bkZpZWxkU2V0ID0gW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NdIGluaXRdOwotICAgICAgW2lucHV0IHJlYWRVbmtub3duR3JvdXA6bnVtYmVyIG1lc3NhZ2U6dW5rbm93bkZpZWxkU2V0XTsKLSAgICAgIEdQQlVua25vd25GaWVsZCAqZmllbGQgPSBbc2VsZiBtdXRhYmxlRmllbGRGb3JOdW1iZXI6bnVtYmVyIGNyZWF0ZTpZRVNdOwotICAgICAgW2ZpZWxkIGFkZEdyb3VwOnVua25vd25GaWVsZFNldF07Ci0gICAgICBbdW5rbm93bkZpZWxkU2V0IHJlbGVhc2VdOwotICAgICAgcmV0dXJuIFlFUzsKLSAgICB9Ci0gICAgY2FzZSBHUEJXaXJlRm9ybWF0RW5kR3JvdXA6Ci0gICAgICByZXR1cm4gTk87Ci0gICAgY2FzZSBHUEJXaXJlRm9ybWF0Rml4ZWQzMjogewotICAgICAgR1BCVW5rbm93bkZpZWxkICpmaWVsZCA9IFtzZWxmIG11dGFibGVGaWVsZEZvck51bWJlcjpudW1iZXIgY3JlYXRlOllFU107Ci0gICAgICBbZmllbGQgYWRkRml4ZWQzMjpHUEJDb2RlZElucHV0U3RyZWFtUmVhZEZpeGVkMzIoc3RhdGUpXTsKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpbWVyZ2VNZXNzYWdlU2V0TWVzc2FnZTooaW50MzJfdCludW1iZXIgZGF0YTooTlNEYXRhICopbWVzc2FnZURhdGEgewotICBbW3NlbGYgbXV0YWJsZUZpZWxkRm9yTnVtYmVyOm51bWJlciBjcmVhdGU6WUVTXQotICAgICAgYWRkTGVuZ3RoRGVsaW1pdGVkOm1lc3NhZ2VEYXRhXTsKLX0KLQotLSAodm9pZClhZGRVbmtub3duTWFwRW50cnk6KGludDMyX3QpZmllbGROdW0gdmFsdWU6KE5TRGF0YSAqKWRhdGEgewotICBHUEJVbmtub3duRmllbGQgKmZpZWxkID0gW3NlbGYgbXV0YWJsZUZpZWxkRm9yTnVtYmVyOmZpZWxkTnVtIGNyZWF0ZTpZRVNdOwotICBbZmllbGQgYWRkTGVuZ3RoRGVsaW1pdGVkOmRhdGFdOwotfQotCi0tICh2b2lkKW1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dCB7Ci0gIHdoaWxlIChZRVMpIHsKLSAgICBpbnQzMl90IHRhZyA9IEdQQkNvZGVkSW5wdXRTdHJlYW1SZWFkVGFnKCZpbnB1dC0+c3RhdGVfKTsKLSAgICBpZiAodGFnID09IDAgfHwgIVtzZWxmIG1lcmdlRmllbGRGcm9tOnRhZyBpbnB1dDppbnB1dF0pIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKWdldFRhZ3M6KGludDMyX3QgKil0YWdzIHsKLSAgaWYgKCFmaWVsZHNfKSByZXR1cm47Ci0gIHNpemVfdCBjb3VudCA9IENGRGljdGlvbmFyeUdldENvdW50KGZpZWxkc18pOwotICBzc2l6ZV90IGtleXNbY291bnRdOwotICBDRkRpY3Rpb25hcnlHZXRLZXlzQW5kVmFsdWVzKGZpZWxkc18sIChjb25zdCB2b2lkICoqKWtleXMsIE5VTEwpOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICB0YWdzW2ldID0gKGludDMyX3Qpa2V5c1tpXTsKLSAgfQotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlVua25vd25GaWVsZFNldF9QYWNrYWdlUHJpdmF0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVbmtub3duRmllbGRTZXRfUGFja2FnZVByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTI3MTI3YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlVua25vd25GaWVsZFNldF9QYWNrYWdlUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJHUEJVbmtub3duRmllbGRTZXQuaCIKLQotQGNsYXNzIEdQQkNvZGVkT3V0cHV0U3RyZWFtOwotQGNsYXNzIEdQQkNvZGVkSW5wdXRTdHJlYW07Ci0KLUBpbnRlcmZhY2UgR1BCVW5rbm93bkZpZWxkU2V0ICgpCi0KLSsgKEJPT0wpaXNGaWVsZFRhZzooaW50MzJfdCl0YWc7Ci0KLS0gKE5TRGF0YSAqKWRhdGE7Ci0KLS0gKHNpemVfdClzZXJpYWxpemVkU2l6ZTsKLS0gKHNpemVfdClzZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldDsKLQotLSAodm9pZCl3cml0ZVRvQ29kZWRPdXRwdXRTdHJlYW06KEdQQkNvZGVkT3V0cHV0U3RyZWFtICopb3V0cHV0OwotLSAodm9pZCl3cml0ZUFzTWVzc2FnZVNldFRvOihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dDsKLQotLSAodm9pZCltZXJnZVVua25vd25GaWVsZHM6KEdQQlVua25vd25GaWVsZFNldCAqKW90aGVyOwotCi0tICh2b2lkKW1lcmdlRnJvbUNvZGVkSW5wdXRTdHJlYW06KEdQQkNvZGVkSW5wdXRTdHJlYW0gKilpbnB1dDsKLS0gKHZvaWQpbWVyZ2VGcm9tRGF0YTooTlNEYXRhICopZGF0YTsKLQotLSAodm9pZCltZXJnZVZhcmludEZpZWxkOihpbnQzMl90KW51bWJlciB2YWx1ZTooaW50MzJfdCl2YWx1ZTsKLS0gKEJPT0wpbWVyZ2VGaWVsZEZyb206KGludDMyX3QpdGFnIGlucHV0OihHUEJDb2RlZElucHV0U3RyZWFtICopaW5wdXQ7Ci0tICh2b2lkKW1lcmdlTWVzc2FnZVNldE1lc3NhZ2U6KGludDMyX3QpbnVtYmVyIGRhdGE6KE5TRGF0YSAqKW1lc3NhZ2VEYXRhOwotCi0tICh2b2lkKWFkZFVua25vd25NYXBFbnRyeTooaW50MzJfdClmaWVsZE51bSB2YWx1ZTooTlNEYXRhICopZGF0YTsKLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVbmtub3duRmllbGRfUGFja2FnZVByaXZhdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCVW5rbm93bkZpZWxkX1BhY2thZ2VQcml2YXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFmYmNlMGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVbmtub3duRmllbGRfUGFja2FnZVByaXZhdGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDQ5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkLmgiCi0KLUBjbGFzcyBHUEJDb2RlZE91dHB1dFN0cmVhbTsKLQotQGludGVyZmFjZSBHUEJVbmtub3duRmllbGQgKCkKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoTnVtYmVyOihpbnQzMl90KW51bWJlcjsKLQotLSAodm9pZCl3cml0ZVRvT3V0cHV0OihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dDsKLS0gKHNpemVfdClzZXJpYWxpemVkU2l6ZTsKLQotLSAodm9pZCl3cml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvT3V0cHV0OihHUEJDb2RlZE91dHB1dFN0cmVhbSAqKW91dHB1dDsKLS0gKHNpemVfdClzZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldEV4dGVuc2lvbjsKLQotLSAodm9pZCltZXJnZUZyb21GaWVsZDooR1BCVW5rbm93bkZpZWxkICopb3RoZXI7Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCVXRpbGl0aWVzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlV0aWxpdGllcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNzIwOTMyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCVXRpbGl0aWVzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyNTcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJHUEJBcnJheS5oIgotI2ltcG9ydCAiR1BCTWVzc2FnZS5oIgotI2ltcG9ydCAiR1BCUnVudGltZVR5cGVzLmgiCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLS8vLyBHZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgYmUgYSB2YWxpZCAiVGV4dCBGb3JtYXQiIGZvciB0aGUgQysrIHZlcnNpb24KLS8vLyBvZiBQcm90b2NvbCBCdWZmZXJzLgotLy8vCi0vLy8gIEBwYXJhbSBtZXNzYWdlICAgIFRoZSBtZXNzYWdlIHRvIGdlbmVyYXRlIGZyb20uCi0vLy8gIEBwYXJhbSBsaW5lSW5kZW50IEEgc3RyaW5nIHRvIHVzZSBhcyB0aGUgcHJlZml4IGZvciBhbGwgbGluZXMgZ2VuZXJhdGVkLiBDYW4KLS8vLyAgICAgICAgICAgICAgICAgICAgYmUgbmlsIGlmIG5vIGV4dHJhIGluZGVudCBpcyBuZWVkZWQuCi0vLy8KLS8vLyBAcmV0dXJuIEEgQGMgTlNTdHJpbmcgd2l0aCB0aGUgVGV4dCBGb3JtYXQgb2YgdGhlIG1lc3NhZ2UuCi1OU1N0cmluZyAqR1BCVGV4dEZvcm1hdEZvck1lc3NhZ2UoR1BCTWVzc2FnZSAqbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1N0cmluZyAqIF9fbnVsbGFibGUgbGluZUluZGVudCk7Ci0KLS8vLyBHZW5lcmF0ZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgYmUgYSB2YWxpZCAiVGV4dCBGb3JtYXQiIGZvciB0aGUgQysrIHZlcnNpb24KLS8vLyBvZiBQcm90b2NvbCBCdWZmZXJzLgotLy8vCi0vLy8gIEBwYXJhbSB1bmtub3duU2V0IFRoZSB1bmtub3duIGZpZWxkIHNldCB0byBnZW5lcmF0ZSBmcm9tLgotLy8vICBAcGFyYW0gbGluZUluZGVudCBBIHN0cmluZyB0byB1c2UgYXMgdGhlIHByZWZpeCBmb3IgYWxsIGxpbmVzIGdlbmVyYXRlZC4gQ2FuCi0vLy8gICAgICAgICAgICAgICAgICAgIGJlIG5pbCBpZiBubyBleHRyYSBpbmRlbnQgaXMgbmVlZGVkLgotLy8vCi0vLy8gQHJldHVybiBBIEBjIE5TU3RyaW5nIHdpdGggdGhlIFRleHQgRm9ybWF0IG9mIHRoZSB1bmtub3duIGZpZWxkIHNldC4KLU5TU3RyaW5nICpHUEJUZXh0Rm9ybWF0Rm9yVW5rbm93bkZpZWxkU2V0KEdQQlVua25vd25GaWVsZFNldCAqIF9fbnVsbGFibGUgdW5rbm93blNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nICogX19udWxsYWJsZSBsaW5lSW5kZW50KTsKLQotLy8vIFRlc3QgaWYgdGhlIGdpdmVuIGZpZWxkIGlzIHNldCBvbiBhIG1lc3NhZ2UuCi1CT09MIEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChHUEJNZXNzYWdlICpzZWxmLCB1aW50MzJfdCBmaWVsZE51bWJlcik7Ci0vLy8gVGVzdCBpZiB0aGUgZ2l2ZW4gZmllbGQgaXMgc2V0IG9uIGEgbWVzc2FnZS4KLUJPT0wgR1BCTWVzc2FnZUhhc0ZpZWxkU2V0KEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotCi0vLy8gQ2xlYXIgdGhlIGdpdmVuIGZpZWxkIG9mIGEgbWVzc2FnZS4KLXZvaWQgR1BCQ2xlYXJNZXNzYWdlRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0KLS8vJVBERE0tRVhQQU5EIEdQQl9BQ0NFU1NPUlMoKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLQotLy8KLS8vIEdldC9TZXQgdGhlIGdpdmVuIGZpZWxkIG9mIGEgbWVzc2FnZS4KLS8vCi0KLS8vIFNpbmdsZSBGaWVsZHMKLQotLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgYnl0ZXMgZmllbGQuCi1OU0RhdGEgKkdQQkdldE1lc3NhZ2VCeXRlc0ZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotLy8vIFNldHMgdGhlIHZhbHVlIG9mIGEgYnl0ZXMgZmllbGQuCi12b2lkIEdQQlNldE1lc3NhZ2VCeXRlc0ZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIE5TRGF0YSAqdmFsdWUpOwotCi0vLy8gR2V0cyB0aGUgdmFsdWUgb2YgYSBzdHJpbmcgZmllbGQuCi1OU1N0cmluZyAqR1BCR2V0TWVzc2FnZVN0cmluZ0ZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotLy8vIFNldHMgdGhlIHZhbHVlIG9mIGEgc3RyaW5nIGZpZWxkLgotdm9pZCBHUEJTZXRNZXNzYWdlU3RyaW5nRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwgTlNTdHJpbmcgKnZhbHVlKTsKLQotLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgbWVzc2FnZSBmaWVsZC4KLUdQQk1lc3NhZ2UgKkdQQkdldE1lc3NhZ2VNZXNzYWdlRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0vLy8gU2V0cyB0aGUgdmFsdWUgb2YgYSBtZXNzYWdlIGZpZWxkLgotdm9pZCBHUEJTZXRNZXNzYWdlTWVzc2FnZUZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIEdQQk1lc3NhZ2UgKnZhbHVlKTsKLQotLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgZ3JvdXAgZmllbGQuCi1HUEJNZXNzYWdlICpHUEJHZXRNZXNzYWdlR3JvdXBGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhIGdyb3VwIGZpZWxkLgotdm9pZCBHUEJTZXRNZXNzYWdlR3JvdXBGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBHUEJNZXNzYWdlICp2YWx1ZSk7Ci0KLS8vLyBHZXRzIHRoZSB2YWx1ZSBvZiBhIGJvb2wgZmllbGQuCi1CT09MIEdQQkdldE1lc3NhZ2VCb29sRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0vLy8gU2V0cyB0aGUgdmFsdWUgb2YgYSBib29sIGZpZWxkLgotdm9pZCBHUEJTZXRNZXNzYWdlQm9vbEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIEJPT0wgdmFsdWUpOwotCi0vLy8gR2V0cyB0aGUgdmFsdWUgb2YgYW4gaW50MzIgZmllbGQuCi1pbnQzMl90IEdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotLy8vIFNldHMgdGhlIHZhbHVlIG9mIGFuIGludDMyIGZpZWxkLgotdm9pZCBHUEJTZXRNZXNzYWdlSW50MzJGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpbnQzMl90IHZhbHVlKTsKLQotLy8vIEdldHMgdGhlIHZhbHVlIG9mIGFuIHVpbnQzMiBmaWVsZC4KLXVpbnQzMl90IEdQQkdldE1lc3NhZ2VVSW50MzJGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhbiB1aW50MzIgZmllbGQuCi12b2lkIEdQQlNldE1lc3NhZ2VVSW50MzJGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCB1aW50MzJfdCB2YWx1ZSk7Ci0KLS8vLyBHZXRzIHRoZSB2YWx1ZSBvZiBhbiBpbnQ2NCBmaWVsZC4KLWludDY0X3QgR1BCR2V0TWVzc2FnZUludDY0RmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0vLy8gU2V0cyB0aGUgdmFsdWUgb2YgYW4gaW50NjQgZmllbGQuCi12b2lkIEdQQlNldE1lc3NhZ2VJbnQ2NEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIGludDY0X3QgdmFsdWUpOwotCi0vLy8gR2V0cyB0aGUgdmFsdWUgb2YgYW4gdWludDY0IGZpZWxkLgotdWludDY0X3QgR1BCR2V0TWVzc2FnZVVJbnQ2NEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotLy8vIFNldHMgdGhlIHZhbHVlIG9mIGFuIHVpbnQ2NCBmaWVsZC4KLXZvaWQgR1BCU2V0TWVzc2FnZVVJbnQ2NEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIHVpbnQ2NF90IHZhbHVlKTsKLQotLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgZmxvYXQgZmllbGQuCi1mbG9hdCBHUEJHZXRNZXNzYWdlRmxvYXRGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhIGZsb2F0IGZpZWxkLgotdm9pZCBHUEJTZXRNZXNzYWdlRmxvYXRGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBmbG9hdCB2YWx1ZSk7Ci0KLS8vLyBHZXRzIHRoZSB2YWx1ZSBvZiBhIGRvdWJsZSBmaWVsZC4KLWRvdWJsZSBHUEJHZXRNZXNzYWdlRG91YmxlRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0vLy8gU2V0cyB0aGUgdmFsdWUgb2YgYSBkb3VibGUgZmllbGQuCi12b2lkIEdQQlNldE1lc3NhZ2VEb3VibGVGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBkb3VibGUgdmFsdWUpOwotCi0vLy8gR2V0IHRoZSBnaXZlbiBlbnVtIGZpZWxkIG9mIGEgbWVzc2FnZS4gRm9yIHByb3RvMywgaWYgdGhlIHZhbHVlIGlzbid0IGEKLS8vLyBtZW1iZXIgb2YgdGhlIGVudW0sIEBjIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUgd2lsbCBiZSByZXR1cm5lZC4KLS8vLyBHUEJHZXRNZXNzYWdlUmF3RW51bUZpZWxkIHdpbGwgYnlwYXNzIHRoZSBjaGVjayBhbmQgcmV0dXJuIHdoYXRldmVyIHZhbHVlCi0vLy8gd2FzIHNldC4KLWludDMyX3QgR1BCR2V0TWVzc2FnZUVudW1GaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vLyBTZXQgdGhlIGdpdmVuIGVudW0gZmllbGQgb2YgYSBtZXNzYWdlLiBZb3UgY2FuIG9ubHkgc2V0IHZhbHVlcyB0aGF0IGFyZQotLy8vIG1lbWJlcnMgb2YgdGhlIGVudW0uCi12b2lkIEdQQlNldE1lc3NhZ2VFbnVtRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwgaW50MzJfdCB2YWx1ZSk7Ci0vLy8gR2V0IHRoZSBnaXZlbiBlbnVtIGZpZWxkIG9mIGEgbWVzc2FnZS4gTm8gY2hlY2sgaXMgZG9uZSB0byBlbnN1cmUgdGhlIHZhbHVlCi0vLy8gd2FzIGRlZmluZWQgaW4gdGhlIGVudW0uCi1pbnQzMl90IEdQQkdldE1lc3NhZ2VSYXdFbnVtRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0vLy8gU2V0IHRoZSBnaXZlbiBlbnVtIGZpZWxkIG9mIGEgbWVzc2FnZS4gWW91IGNhbiBzZXQgdGhlIHZhbHVlIHRvIGFueXRoaW5nLAotLy8vIGV2ZW4gYSB2YWx1ZSB0aGF0IGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgZW51bS4KLXZvaWQgR1BCU2V0TWVzc2FnZVJhd0VudW1GaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpbnQzMl90IHZhbHVlKTsKLQotLy8gUmVwZWF0ZWQgRmllbGRzCi0KLS8vLyBHZXRzIHRoZSB2YWx1ZSBvZiBhIHJlcGVhdGVkIGZpZWxkLgotLy8vCi0vLy8gVGhlIHJlc3VsdCB3aWxsIGJlIEBjIEdQQipBcnJheSBvciBAYyBOU011dGFibGVBcnJheSBiYXNlZCBvbiB0aGUKLS8vLyBmaWVsZCdzIHR5cGUuCi1pZCBHUEJHZXRNZXNzYWdlUmVwZWF0ZWRGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhIHJlcGVhdGVkIGZpZWxkLgotLy8vCi0vLy8gVGhlIHZhbHVlIHNob3VsZCBiZSBAYyBHUEIqQXJyYXkgb3IgQGMgTlNNdXRhYmxlQXJyYXkgYmFzZWQgb24gdGhlCi0vLy8gZmllbGQncyB0eXBlLgotdm9pZCBHUEJTZXRNZXNzYWdlUmVwZWF0ZWRGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpZCBhcnJheSk7Ci0KLS8vIE1hcCBGaWVsZHMKLQotLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgbWFwPD4gZmllbGQuCi0vLy8KLS8vLyBUaGUgcmVzdWx0IHdpbGwgYmUgQGMgR1BCKkRpY3Rpb25hcnkgb3IgQGMgTlNNdXRhYmxlRGljdGlvbmFyeSBiYXNlZCBvbgotLy8vIHRoZSBmaWVsZCdzIHR5cGUuCi1pZCBHUEJHZXRNZXNzYWdlTWFwRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0vLy8gU2V0cyB0aGUgdmFsdWUgb2YgYSBtYXA8PiBmaWVsZC4KLS8vLwotLy8vIFRoZSBvYmplY3Qgc2hvdWxkIGJlIEBjIEdQQipEaWN0aW9uYXJ5IG9yIEBjIE5TTXV0YWJsZURpY3Rpb25hcnkgYmFzZWQKLS8vLyBvbiB0aGUgZmllbGQncyB0eXBlLgotdm9pZCBHUEJTZXRNZXNzYWdlTWFwRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwgaWQgZGljdGlvbmFyeSk7Ci0KLS8vJVBERE0tRVhQQU5ELUVORCBHUEJfQUNDRVNTT1JTKCkKLQotLy8gUmV0dXJucyBhbiBlbXB0eSBOU0RhdGEgdG8gYXNzaWduIHRvIGJ5dGUgZmllbGRzIHdoZW4geW91IHdpc2gKLS8vIHRvIGFzc2lnbiB0aGVtIHRvIGVtcHR5LiBQcmV2ZW50cyBhbGxvY2F0aW5nIGEgbG90IG9mIGxpdHRsZSBbTlNEYXRhIGRhdGFdCi0vLyBvYmplY3RzLgotTlNEYXRhICpHUEJFbXB0eU5TRGF0YSh2b2lkKSBfX2F0dHJpYnV0ZV9fKChwdXJlKSk7Ci0KLU5TX0FTU1VNRV9OT05OVUxMX0VORAotCi1DRl9FWFRFUk5fQ19FTkQKLQotCi0vLyVQRERNLURFRklORSBHUEJfQUNDRVNTT1JTKCkKLS8vJQotLy8lLy8KLS8vJS8vIEdldC9TZXQgdGhlIGdpdmVuIGZpZWxkIG9mIGEgbWVzc2FnZS4KLS8vJS8vCi0vLyUKLS8vJS8vIFNpbmdsZSBGaWVsZHMKLS8vJQotLy8lR1BCX0FDQ0VTU09SX1NJTkdMRV9GVUxMKEJ5dGVzLCBOU0RhdGEsICwgKikKLS8vJUdQQl9BQ0NFU1NPUl9TSU5HTEVfRlVMTChTdHJpbmcsIE5TU3RyaW5nLCAsICopCi0vLyVHUEJfQUNDRVNTT1JfU0lOR0xFX0ZVTEwoTWVzc2FnZSwgR1BCTWVzc2FnZSwgLCAqKQotLy8lR1BCX0FDQ0VTU09SX1NJTkdMRV9GVUxMKEdyb3VwLCBHUEJNZXNzYWdlLCAsICopCi0vLyVHUEJfQUNDRVNTT1JfU0lOR0xFKEJvb2wsIEJPT0wsICkKLS8vJUdQQl9BQ0NFU1NPUl9TSU5HTEUoSW50MzIsIGludDMyX3QsIG4pCi0vLyVHUEJfQUNDRVNTT1JfU0lOR0xFKFVJbnQzMiwgdWludDMyX3QsIG4pCi0vLyVHUEJfQUNDRVNTT1JfU0lOR0xFKEludDY0LCBpbnQ2NF90LCBuKQotLy8lR1BCX0FDQ0VTU09SX1NJTkdMRShVSW50NjQsIHVpbnQ2NF90LCBuKQotLy8lR1BCX0FDQ0VTU09SX1NJTkdMRShGbG9hdCwgZmxvYXQsICkKLS8vJUdQQl9BQ0NFU1NPUl9TSU5HTEUoRG91YmxlLCBkb3VibGUsICkKLS8vJS8vLyBHZXQgdGhlIGdpdmVuIGVudW0gZmllbGQgb2YgYSBtZXNzYWdlLiBGb3IgcHJvdG8zLCBpZiB0aGUgdmFsdWUgaXNuJ3QgYQotLy8lLy8vIG1lbWJlciBvZiB0aGUgZW51bSwgQGMga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSB3aWxsIGJlIHJldHVybmVkLgotLy8lLy8vIEdQQkdldE1lc3NhZ2VSYXdFbnVtRmllbGQgd2lsbCBieXBhc3MgdGhlIGNoZWNrIGFuZCByZXR1cm4gd2hhdGV2ZXIgdmFsdWUKLS8vJS8vLyB3YXMgc2V0LgotLy8laW50MzJfdCBHUEJHZXRNZXNzYWdlRW51bUZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotLy8lLy8vIFNldCB0aGUgZ2l2ZW4gZW51bSBmaWVsZCBvZiBhIG1lc3NhZ2UuIFlvdSBjYW4gb25seSBzZXQgdmFsdWVzIHRoYXQgYXJlCi0vLyUvLy8gbWVtYmVycyBvZiB0aGUgZW51bS4KLS8vJXZvaWQgR1BCU2V0TWVzc2FnZUVudW1GaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpbnQzMl90IHZhbHVlKTsKLS8vJS8vLyBHZXQgdGhlIGdpdmVuIGVudW0gZmllbGQgb2YgYSBtZXNzYWdlLiBObyBjaGVjayBpcyBkb25lIHRvIGVuc3VyZSB0aGUgdmFsdWUKLS8vJS8vLyB3YXMgZGVmaW5lZCBpbiB0aGUgZW51bS4KLS8vJWludDMyX3QgR1BCR2V0TWVzc2FnZVJhd0VudW1GaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vJS8vLyBTZXQgdGhlIGdpdmVuIGVudW0gZmllbGQgb2YgYSBtZXNzYWdlLiBZb3UgY2FuIHNldCB0aGUgdmFsdWUgdG8gYW55dGhpbmcsCi0vLyUvLy8gZXZlbiBhIHZhbHVlIHRoYXQgaXMgbm90IGEgbWVtYmVyIG9mIHRoZSBlbnVtLgotLy8ldm9pZCBHUEJTZXRNZXNzYWdlUmF3RW51bUZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIGludDMyX3QgdmFsdWUpOwotLy8lCi0vLyUvLyBSZXBlYXRlZCBGaWVsZHMKLS8vJQotLy8lLy8vIEdldHMgdGhlIHZhbHVlIG9mIGEgcmVwZWF0ZWQgZmllbGQuCi0vLyUvLy8KLS8vJS8vLyBUaGUgcmVzdWx0IHdpbGwgYmUgQGMgR1BCKkFycmF5IG9yIEBjIE5TTXV0YWJsZUFycmF5IGJhc2VkIG9uIHRoZQotLy8lLy8vIGZpZWxkJ3MgdHlwZS4KLS8vJWlkIEdQQkdldE1lc3NhZ2VSZXBlYXRlZEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotLy8lLy8vIFNldHMgdGhlIHZhbHVlIG9mIGEgcmVwZWF0ZWQgZmllbGQuCi0vLyUvLy8KLS8vJS8vLyBUaGUgdmFsdWUgc2hvdWxkIGJlIEBjIEdQQipBcnJheSBvciBAYyBOU011dGFibGVBcnJheSBiYXNlZCBvbiB0aGUKLS8vJS8vLyBmaWVsZCdzIHR5cGUuCi0vLyV2b2lkIEdQQlNldE1lc3NhZ2VSZXBlYXRlZEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIGlkIGFycmF5KTsKLS8vJQotLy8lLy8gTWFwIEZpZWxkcwotLy8lCi0vLyUvLy8gR2V0cyB0aGUgdmFsdWUgb2YgYSBtYXA8PiBmaWVsZC4KLS8vJS8vLwotLy8lLy8vIFRoZSByZXN1bHQgd2lsbCBiZSBAYyBHUEIqRGljdGlvbmFyeSBvciBAYyBOU011dGFibGVEaWN0aW9uYXJ5IGJhc2VkIG9uCi0vLyUvLy8gdGhlIGZpZWxkJ3MgdHlwZS4KLS8vJWlkIEdQQkdldE1lc3NhZ2VNYXBGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vJS8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhIG1hcDw+IGZpZWxkLgotLy8lLy8vCi0vLyUvLy8gVGhlIG9iamVjdCBzaG91bGQgYmUgQGMgR1BCKkRpY3Rpb25hcnkgb3IgQGMgTlNNdXRhYmxlRGljdGlvbmFyeSBiYXNlZAotLy8lLy8vIG9uIHRoZSBmaWVsZCdzIHR5cGUuCi0vLyV2b2lkIEdQQlNldE1lc3NhZ2VNYXBGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpZCBkaWN0aW9uYXJ5KTsKLS8vJQotCi0vLyVQRERNLURFRklORSBHUEJfQUNDRVNTT1JfU0lOR0xFKE5BTUUsIFRZUEUsIEFOKQotLy8lR1BCX0FDQ0VTU09SX1NJTkdMRV9GVUxMKE5BTUUsIFRZUEUsIEFOLCApCi0vLyVQRERNLURFRklORSBHUEJfQUNDRVNTT1JfU0lOR0xFX0ZVTEwoTkFNRSwgVFlQRSwgQU4sIFRpc1ApCi0vLyUvLy8gR2V0cyB0aGUgdmFsdWUgb2YgYSMjQU4gTkFNRSRMIGZpZWxkLgotLy8lVFlQRSBUaXNQIyNHUEJHZXRNZXNzYWdlIyNOQU1FIyNGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKLS8vJS8vLyBTZXRzIHRoZSB2YWx1ZSBvZiBhIyNBTiBOQU1FJEwgZmllbGQuCi0vLyV2b2lkIEdQQlNldE1lc3NhZ2UjI05BTUUjI0ZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIFRZUEUgVGlzUCMjdmFsdWUpOwotLy8lCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlV0aWxpdGllcy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVdGlsaXRpZXMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDQ3Yzc0OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlV0aWxpdGllcy5tCisrKyAvZGV2L251bGwKQEAgLTEsMTcxNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVXRpbGl0aWVzX1BhY2thZ2VQcml2YXRlLmgiCi0KLSNpbXBvcnQgPG9iamMvcnVudGltZS5oPgotCi0jaW1wb3J0ICJHUEJBcnJheV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCRGVzY3JpcHRvcl9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCRGljdGlvbmFyeV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCTWVzc2FnZV9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkLmgiCi0jaW1wb3J0ICJHUEJVbmtub3duRmllbGRTZXQuaCIKLQotc3RhdGljIHZvaWQgQXBwZW5kVGV4dEZvcm1hdEZvck1lc3NhZ2UoR1BCTWVzc2FnZSAqbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTXV0YWJsZVN0cmluZyAqdG9TdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1N0cmluZyAqbGluZUluZGVudCk7Ci0KLU5TRGF0YSAqR1BCRW1wdHlOU0RhdGEodm9pZCkgewotICBzdGF0aWMgZGlzcGF0Y2hfb25jZV90IG9uY2VUb2tlbjsKLSAgc3RhdGljIE5TRGF0YSAqZGVmYXVsdE5TRGF0YSA9IG5pbDsKLSAgZGlzcGF0Y2hfb25jZSgmb25jZVRva2VuLCBeewotICAgIGRlZmF1bHROU0RhdGEgPSBbW05TRGF0YSBhbGxvY10gaW5pdF07Ci0gIH0pOwotICByZXR1cm4gZGVmYXVsdE5TRGF0YTsKLX0KLQotdm9pZCBHUEJDaGVja1J1bnRpbWVWZXJzaW9uSW50ZXJuYWwoaW50MzJfdCB2ZXJzaW9uKSB7Ci0gIGlmICh2ZXJzaW9uICE9IEdPT0dMRV9QUk9UT0JVRl9PQkpDX0dFTl9WRVJTSU9OKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW50ZXJuYWxJbmNvbnNpc3RlbmN5RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiTGlua2VkIHRvIFByb3RvY29sQnVmZmVyIHJ1bnRpbWUgdmVyc2lvbiAlZCwiCi0gICAgICAgICAgICAgICAgICAgICAgIEAiIGJ1dCBjb2RlIGNvbXBpbGVkIHdpdGggdmVyc2lvbiAlZCEiLAotICAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfUFJPVE9CVUZfT0JKQ19HRU5fVkVSU0lPTiwgdmVyc2lvbl07Ci0gIH0KLX0KLQotQk9PTCBHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQoR1BCTWVzc2FnZSAqc2VsZiwgdWludDMyX3QgZmllbGROdW1iZXIpIHsKLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtzZWxmIGRlc2NyaXB0b3JdOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOmZpZWxkTnVtYmVyXTsKLSAgcmV0dXJuIEdQQk1lc3NhZ2VIYXNGaWVsZFNldChzZWxmLCBmaWVsZCk7Ci19Ci0KLUJPT0wgR1BCTWVzc2FnZUhhc0ZpZWxkU2V0KEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgaWYgKHNlbGYgPT0gbmlsIHx8IGZpZWxkID09IG5pbCkgcmV0dXJuIE5POwotCi0gIC8vIFJlcGVhdGVkL01hcCBkb24ndCB1c2UgdGhlIGJpdCwgdGhleSBjaGVjayB0aGUgY291bnQuCi0gIGlmIChHUEJGaWVsZElzTWFwT3JBcnJheShmaWVsZCkpIHsKLSAgICAvLyBBcnJheS9tYXAgdHlwZSBkb2Vzbid0IG1hdHRlciwgc2luY2UgR1BCKkFycmF5L05TQXJyYXkgYW5kCi0gICAgLy8gR1BCKkRpY3Rpb25hcnkvTlNEaWN0aW9uYXJ5IGFsbCBzdXBwb3J0IC1jb3VudDsKLSAgICBOU0FycmF5ICphcnJheU9yTWFwID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShzZWxmLCBmaWVsZCk7Ci0gICAgcmV0dXJuIChhcnJheU9yTWFwLmNvdW50ID4gMCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCk7Ci0gIH0KLX0KLQotdm9pZCBHUEJDbGVhck1lc3NhZ2VGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIC8vIElmIG5vdCBzZXQsIG5vdGhpbmcgdG8gZG8uCi0gIGlmICghR1BCR2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkKSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChHUEJGaWVsZFN0b3Jlc09iamVjdChmaWVsZCkpIHsKLSAgICAvLyBPYmplY3QgdHlwZXMgYXJlIGhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHksIHRoZXkgbmVlZCB0byBiZSByZWxlYXNlZC4KLSAgICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gICAgaWQgKnR5cGVQdHIgPSAoaWQgKikmc3RvcmFnZVtmaWVsZC0+ZGVzY3JpcHRpb25fLT5vZmZzZXRdOwotICAgIFsqdHlwZVB0ciByZWxlYXNlXTsKLSAgICAqdHlwZVB0ciA9IG5pbDsKLSAgfSBlbHNlIHsKLSAgICAvLyBQT0QgdHlwZXMganVzdCBuZWVkIHRvIGNsZWFyIHRoZSBoYXMgYml0IGFzIHRoZSBHZXQqIG1ldGhvZCB3aWxsCi0gICAgLy8gZmV0Y2ggdGhlIGRlZmF1bHQgd2hlbiBuZWVkZWQuCi0gIH0KLSAgR1BCU2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkLCBOTyk7Ci19Ci0KLUJPT0wgR1BCR2V0SGFzSXZhcihHUEJNZXNzYWdlICpzZWxmLCBpbnQzMl90IGlkeCwgdWludDMyX3QgZmllbGROdW1iZXIpIHsKLSAgTlNDQXNzZXJ0KHNlbGYtPm1lc3NhZ2VTdG9yYWdlXyAhPSBOVUxMLAotICAgICAgICAgICAgQCIlQDogQWxsIG1lc3NhZ2VzIHNob3VsZCBoYXZlIHN0b3JhZ2UgKGZyb20gaW5pdCkiLAotICAgICAgICAgICAgW3NlbGYgY2xhc3NdKTsKLSAgaWYgKGlkeCA8IDApIHsKLSAgICBOU0NBc3NlcnQoZmllbGROdW1iZXIgIT0gMCwgQCJJbnZhbGlkIGZpZWxkIG51bWJlci4iKTsKLSAgICBCT09MIGhhc0l2YXIgPSAoc2VsZi0+bWVzc2FnZVN0b3JhZ2VfLT5faGFzX3N0b3JhZ2VfWy1pZHhdID09IGZpZWxkTnVtYmVyKTsKLSAgICByZXR1cm4gaGFzSXZhcjsKLSAgfSBlbHNlIHsKLSAgICBOU0NBc3NlcnQoaWR4ICE9IEdQQk5vSGFzQml0LCBAIkludmFsaWQgaGFzIGJpdC4iKTsKLSAgICB1aW50MzJfdCBieXRlSW5kZXggPSBpZHggLyAzMjsKLSAgICB1aW50MzJfdCBiaXRNYXNrID0gKDEgPDwgKGlkeCAlIDMyKSk7Ci0gICAgQk9PTCBoYXNJdmFyID0KLSAgICAgICAgKHNlbGYtPm1lc3NhZ2VTdG9yYWdlXy0+X2hhc19zdG9yYWdlX1tieXRlSW5kZXhdICYgYml0TWFzaykgPyBZRVMgOiBOTzsKLSAgICByZXR1cm4gaGFzSXZhcjsKLSAgfQotfQotCi11aW50MzJfdCBHUEJHZXRIYXNPbmVvZihHUEJNZXNzYWdlICpzZWxmLCBpbnQzMl90IGlkeCkgewotICBOU0NBc3NlcnQoaWR4IDwgMCwgQCIlQDogaW52YWxpZCBpbmRleCAoJWQpIGZvciBvbmVvZi4iLAotICAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBpZHgpOwotICB1aW50MzJfdCByZXN1bHQgPSBzZWxmLT5tZXNzYWdlU3RvcmFnZV8tPl9oYXNfc3RvcmFnZV9bLWlkeF07Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgR1BCU2V0SGFzSXZhcihHUEJNZXNzYWdlICpzZWxmLCBpbnQzMl90IGlkeCwgdWludDMyX3QgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgQk9PTCB2YWx1ZSkgewotICBpZiAoaWR4IDwgMCkgewotICAgIE5TQ0Fzc2VydChmaWVsZE51bWJlciAhPSAwLCBAIkludmFsaWQgZmllbGQgbnVtYmVyLiIpOwotICAgIHVpbnQzMl90ICpoYXNfc3RvcmFnZSA9IHNlbGYtPm1lc3NhZ2VTdG9yYWdlXy0+X2hhc19zdG9yYWdlXzsKLSAgICBoYXNfc3RvcmFnZVstaWR4XSA9ICh2YWx1ZSA/IGZpZWxkTnVtYmVyIDogMCk7Ci0gIH0gZWxzZSB7Ci0gICAgTlNDQXNzZXJ0KGlkeCAhPSBHUEJOb0hhc0JpdCwgQCJJbnZhbGlkIGhhcyBiaXQuIik7Ci0gICAgdWludDMyX3QgKmhhc19zdG9yYWdlID0gc2VsZi0+bWVzc2FnZVN0b3JhZ2VfLT5faGFzX3N0b3JhZ2VfOwotICAgIHVpbnQzMl90IGJ5dGUgPSBpZHggLyAzMjsKLSAgICB1aW50MzJfdCBiaXRNYXNrID0gKDEgPDwgKGlkeCAlIDMyKSk7Ci0gICAgaWYgKHZhbHVlKSB7Ci0gICAgICBoYXNfc3RvcmFnZVtieXRlXSB8PSBiaXRNYXNrOwotICAgIH0gZWxzZSB7Ci0gICAgICBoYXNfc3RvcmFnZVtieXRlXSAmPSB+Yml0TWFzazsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBHUEJNYXliZUNsZWFyT25lb2YoR1BCTWVzc2FnZSAqc2VsZiwgR1BCT25lb2ZEZXNjcmlwdG9yICpvbmVvZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3Qgb25lb2ZIYXNJbmRleCwgdWludDMyX3QgZmllbGROdW1iZXJOb3RUb0NsZWFyKSB7Ci0gIHVpbnQzMl90IGZpZWxkTnVtYmVyU2V0ID0gR1BCR2V0SGFzT25lb2Yoc2VsZiwgb25lb2ZIYXNJbmRleCk7Ci0gIGlmICgoZmllbGROdW1iZXJTZXQgPT0gZmllbGROdW1iZXJOb3RUb0NsZWFyKSB8fCAoZmllbGROdW1iZXJTZXQgPT0gMCkpIHsKLSAgICAvLyBEbyBub3RoaW5nL25vdGhpbmcgc2V0IGluIHRoZSBvbmVvZi4KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBMaWtlIEdQQkNsZWFyTWVzc2FnZUZpZWxkKCksIGZyZWUgdGhlIG1lbW9yeSBpZiBhbiBvYmplY3R0eXBlIGlzIHNldCwKLSAgLy8gcG9kIHR5cGVzIGRvbid0IG5lZWQgdG8gZG8gYW55dGhpbmcuCi0gIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGRTZXQgPSBbb25lb2YgZmllbGRXaXRoTnVtYmVyOmZpZWxkTnVtYmVyU2V0XTsKLSAgTlNDQXNzZXJ0KGZpZWxkU2V0LAotICAgICAgICAgICAgQCIlQDogb25lb2Ygc2V0IHRvIHNvbWV0aGluZyAoJXUpIG5vdCBpbiB0aGUgb25lb2Y/IiwKLSAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgZmllbGROdW1iZXJTZXQpOwotICBpZiAoZmllbGRTZXQgJiYgR1BCRmllbGRTdG9yZXNPYmplY3QoZmllbGRTZXQpKSB7Ci0gICAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotICAgIGlkICp0eXBlUHRyID0gKGlkICopJnN0b3JhZ2VbZmllbGRTZXQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLSAgICBbKnR5cGVQdHIgcmVsZWFzZV07Ci0gICAgKnR5cGVQdHIgPSBuaWw7Ci0gIH0KLQotICAvLyBTZXQgdG8gbm90aGluZyBzdG9yZWQgaW4gdGhlIG9uZW9mLgotICAvLyAoZmllbGQgbnVtYmVyIGRvZXNuJ3QgbWF0dGVyIHNpbmNlIHNldHRpbmcgdG8gbm90aGluZykuCi0gIEdQQlNldEhhc0l2YXIoc2VsZiwgb25lb2ZIYXNJbmRleCwgMSwgTk8pOwotfQotCi0jcHJhZ21hIG1hcmsgLSBJVmFyIGFjY2Vzc29ycwotCi0vLyVQRERNLURFRklORSBJVkFSX1BPRF9BQ0NFU1NPUlNfREVGTihOQU1FLCBUWVBFKQotLy8lVFlQRSBHUEJHZXRNZXNzYWdlIyNOQU1FIyNGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotLy8lIFRZUEUkUyAgICAgICAgICAgIE5BTUUkUyAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0vLyUgIGlmIChHUEJHZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQpKSB7Ci0vLyUgICAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotLy8lICAgIFRZUEUgKnR5cGVQdHIgPSAoVFlQRSAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0vLyUgICAgcmV0dXJuICp0eXBlUHRyOwotLy8lICB9IGVsc2UgewotLy8lICAgIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWUudmFsdWUjI05BTUU7Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi0vLyV2b2lkIEdQQlNldE1lc3NhZ2UjI05BTUUjI0ZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsCi0vLyUgICAgICAgICAgICAgICAgICAgTkFNRSRTICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotLy8lICAgICAgICAgICAgICAgICAgIE5BTUUkUyAgICAgVFlQRSB2YWx1ZSkgewotLy8lICBpZiAoc2VsZiA9PSBuaWwgfHwgZmllbGQgPT0gbmlsKSByZXR1cm47Ci0vLyUgIEdQQkZpbGVTeW50YXggc3ludGF4ID0gW3NlbGYgZGVzY3JpcHRvcl0uZmlsZS5zeW50YXg7Ci0vLyUgIEdQQlNldCMjTkFNRSMjSXZhcldpdGhGaWVsZEludGVybmFsKHNlbGYsIGZpZWxkLCB2YWx1ZSwgc3ludGF4KTsKLS8vJX0KLS8vJQotLy8ldm9pZCBHUEJTZXQjI05BTUUjI0l2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotLy8lICAgICAgICAgICAgTkFNRSRTICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLS8vJSAgICAgICAgICAgIE5BTUUkUyAgICAgICAgICAgICAgICAgICAgIFRZUEUgdmFsdWUsCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCkgewotLy8lICBHUEJPbmVvZkRlc2NyaXB0b3IgKm9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdPbmVvZl87Ci0vLyUgIGlmIChvbmVvZikgewotLy8lICAgIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uICpmaWVsZERlc2MgPSBmaWVsZC0+ZGVzY3JpcHRpb25fOwotLy8lICAgIEdQQk1heWJlQ2xlYXJPbmVvZihzZWxmLCBvbmVvZiwgZmllbGREZXNjLT5oYXNJbmRleCwgZmllbGREZXNjLT5udW1iZXIpOwotLy8lICB9Ci0vLyUgIE5TQ0Fzc2VydChzZWxmLT5tZXNzYWdlU3RvcmFnZV8gIT0gTlVMTCwKLS8vJSAgICAgICAgICAgIEAiJUA6IEFsbCBtZXNzYWdlcyBzaG91bGQgaGF2ZSBzdG9yYWdlIChmcm9tIGluaXQpIiwKLS8vJSAgICAgICAgICAgIFtzZWxmIGNsYXNzXSk7Ci0vLyUjaWYgZGVmaW5lZChfX2NsYW5nX2FuYWx5emVyX18pCi0vLyUgIGlmIChzZWxmLT5tZXNzYWdlU3RvcmFnZV8gPT0gTlVMTCkgcmV0dXJuOwotLy8lI2VuZGlmCi0vLyUgIHVpbnQ4X3QgKnN0b3JhZ2UgPSAodWludDhfdCAqKXNlbGYtPm1lc3NhZ2VTdG9yYWdlXzsKLS8vJSAgVFlQRSAqdHlwZVB0ciA9IChUWVBFICopJnN0b3JhZ2VbZmllbGQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLS8vJSAgKnR5cGVQdHIgPSB2YWx1ZTsKLS8vJSAgLy8gcHJvdG8yOiBhbnkgdmFsdWUgY291bnRzIGFzIGhhdmluZyBiZWVuIHNldDsgcHJvdG8zLCBpdAotLy8lICAvLyBoYXMgdG8gYmUgYSBub24gemVybyB2YWx1ZS4KLS8vJSAgQk9PTCBoYXNWYWx1ZSA9Ci0vLyUgICAgKHN5bnRheCA9PSBHUEJGaWxlU3ludGF4UHJvdG8yKSB8fCAodmFsdWUgIT0gKFRZUEUpMCk7Ci0vLyUgIEdQQlNldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCwgaGFzVmFsdWUpOwotLy8lICBHUEJCZWNvbWVWaXNpYmxlVG9BdXRvY3JlYXRvcihzZWxmKTsKLS8vJX0KLS8vJQotLy8lUERETS1ERUZJTkUgSVZBUl9BTElBU19ERUZOX09CSkVDVChOQU1FLCBUWVBFKQotLy8lLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi0vLyVUWVBFICpHUEJHZXRNZXNzYWdlIyNOQU1FIyNGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotLy8lIFRZUEUkUyAgICAgICAgICAgICBOQU1FJFMgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotLy8lICByZXR1cm4gKFRZUEUgKilHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkKTsKLS8vJX0KLS8vJQotLy8lLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi0vLyV2b2lkIEdQQlNldE1lc3NhZ2UjI05BTUUjI0ZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsCi0vLyUgICAgICAgICAgICAgICAgICAgTkFNRSRTICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotLy8lICAgICAgICAgICAgICAgICAgIE5BTUUkUyAgICAgVFlQRSAqdmFsdWUpIHsKLS8vJSAgR1BCU2V0T2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgKGlkKXZhbHVlKTsKLS8vJX0KLS8vJQotCi0vLyBPYmplY3QgdHlwZXMgYXJlIGhhbmRsZWQgc2xpZ2h0bHkgZGlmZmVyZW50bHksIHRoZXkgbmVlZCB0byBiZSByZWxlYXNlZAotLy8gYW5kIHJldGFpbmVkLgotCi12b2lkIEdQQlNldEF1dG9jcmVhdGVkUmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkKAotICAgIEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgaWQgX19hdHRyaWJ1dGVfXygobnNfY29uc3VtZWQpKSB2YWx1ZSkgewotICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gIGlkICp0eXBlUHRyID0gKGlkICopJnN0b3JhZ2VbZmllbGQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLSAgTlNDQXNzZXJ0KCp0eXBlUHRyID09IE5VTEwsIEAiQ2FuJ3Qgc2V0IGF1dG9jcmVhdGVkIG9iamVjdCBtb3JlIHRoYW4gb25jZS4iKTsKLSAgKnR5cGVQdHIgPSB2YWx1ZTsKLX0KLQotdm9pZCBHUEJDbGVhckF1dG9jcmVhdGVkTWVzc2FnZUl2YXJXaXRoRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotICBpZCAqdHlwZVB0ciA9IChpZCAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gIEdQQk1lc3NhZ2UgKm9sZFZhbHVlID0gKnR5cGVQdHI7Ci0gICp0eXBlUHRyID0gTlVMTDsKLSAgR1BCQ2xlYXJNZXNzYWdlQXV0b2NyZWF0b3Iob2xkVmFsdWUpOwotICBbb2xkVmFsdWUgcmVsZWFzZV07Ci19Ci0KLS8vIFRoaXMgZXhpc3RzIG9ubHkgZm9yIGJyaWdpbmcgc29tZSBhbGlhc2VkIHR5cGVzLCBub3RoaW5nIGVsc2Ugc2hvdWxkIHVzZSBpdC4KLXN0YXRpYyB2b2lkIEdQQlNldE9iamVjdEl2YXJXaXRoRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwgaWQgdmFsdWUpIHsKLSAgaWYgKHNlbGYgPT0gbmlsIHx8IGZpZWxkID09IG5pbCkgcmV0dXJuOwotICBHUEJGaWxlU3ludGF4IHN5bnRheCA9IFtzZWxmIGRlc2NyaXB0b3JdLmZpbGUuc3ludGF4OwotICBHUEJTZXRSZXRhaW5lZE9iamVjdEl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgW3ZhbHVlIHJldGFpbl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheCk7Ci19Ci0KLXZvaWQgR1BCU2V0T2JqZWN0SXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpZCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KSB7Ci0gIEdQQlNldFJldGFpbmVkT2JqZWN0SXZhcldpdGhGaWVsZEludGVybmFsKHNlbGYsIGZpZWxkLCBbdmFsdWUgcmV0YWluXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4KTsKLX0KLQotdm9pZCBHUEJTZXRSZXRhaW5lZE9iamVjdEl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZCB2YWx1ZSwgR1BCRmlsZVN5bnRheCBzeW50YXgpIHsKLSAgTlNDQXNzZXJ0KHNlbGYtPm1lc3NhZ2VTdG9yYWdlXyAhPSBOVUxMLAotICAgICAgICAgICAgQCIlQDogQWxsIG1lc3NhZ2VzIHNob3VsZCBoYXZlIHN0b3JhZ2UgKGZyb20gaW5pdCkiLAotICAgICAgICAgICAgW3NlbGYgY2xhc3NdKTsKLSNpZiBkZWZpbmVkKF9fY2xhbmdfYW5hbHl6ZXJfXykKLSAgaWYgKHNlbGYtPm1lc3NhZ2VTdG9yYWdlXyA9PSBOVUxMKSByZXR1cm47Ci0jZW5kaWYKLSAgR1BCRGF0YVR5cGUgZmllbGRUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEJPT0wgaXNNYXBPckFycmF5ID0gR1BCRmllbGRJc01hcE9yQXJyYXkoZmllbGQpOwotICBCT09MIGZpZWxkSXNNZXNzYWdlID0gR1BCRGF0YVR5cGVJc01lc3NhZ2UoZmllbGRUeXBlKTsKLSNpZmRlZiBERUJVRwotICBpZiAodmFsdWUgPT0gbmlsICYmICFpc01hcE9yQXJyYXkgJiYgIWZpZWxkSXNNZXNzYWdlICYmCi0gICAgICBmaWVsZC5oYXNEZWZhdWx0VmFsdWUpIHsKLSAgICAvLyBTZXR0aW5nIGEgbWVzc2FnZSB0byBuaWwgaXMgYW4gb2J2aW91cyB3YXkgdG8gImNsZWFyIiB0aGUgdmFsdWUKLSAgICAvLyBhcyB0aGVyZSBpcyBubyB3YXkgdG8gc2V0IGEgbm9uLWVtcHR5IGRlZmF1bHQgdmFsdWUgZm9yIG1lc3NhZ2VzLgotICAgIC8vCi0gICAgLy8gRm9yIFN0cmluZ3MgYW5kIEJ5dGVzIHRoYXQgaGF2ZSBkZWZhdWx0IHZhbHVlcyBzZXQgaXQgaXMgbm90IGNsZWFyIHdoYXQKLSAgICAvLyBzaG91bGQgYmUgZG9uZSB3aGVuIHRoZWlyIHZhbHVlIGlzIHNldCB0byBuaWwuIElzIHRoZSBpbnRlbnRpb24ganVzdCB0bwotICAgIC8vIGNsZWFyIHRoZSBzZXQgdmFsdWUgYW5kIHJlc2V0IHRvIGRlZmF1bHQsIG9yIGlzIHRoZSBpbnRlbnRpb24gdG8gc2V0IHRoZQotICAgIC8vIHZhbHVlIHRvIHRoZSBlbXB0eSBzdHJpbmcvZGF0YT8gQXJndW1lbnRzIGNhbiBiZSBtYWRlIGZvciBib3RoIGNhc2VzLgotICAgIC8vICduaWwnIGhhcyBiZWVuIGFidXNlZCBhcyBhIHJlcGxhY2VtZW50IGZvciBhbiBlbXB0eSBzdHJpbmcvZGF0YSBpbiBPYmpDLgotICAgIC8vIFdlIGRlY2lkZWQgdG8gYmUgY29uc2lzdGVudCB3aXRoIGFsbCAib2JqZWN0IiB0eXBlcyBhbmQgY2xlYXIgdGhlIGhhcwotICAgIC8vIGZpZWxkLCBhbmQgZmFsbCBiYWNrIG9uIHRoZSBkZWZhdWx0IHZhbHVlLiBUaGUgd2FybmluZyBiZWxvdyB3aWxsIG9ubHkKLSAgICAvLyBhcHBlYXIgaW4gZGVidWcsIGJ1dCB0aGUgY291bGQgc2hvdWxkIGJlIGNoYW5nZWQgc28gdGhlIGludGVudGlvbiBpcwotICAgIC8vIGNsZWFyLgotICAgIE5TU3RyaW5nICpoYXNTZWwgPSBOU1N0cmluZ0Zyb21TZWxlY3RvcihmaWVsZC0+aGFzT3JDb3VudFNlbF8pOwotICAgIE5TU3RyaW5nICpwcm9wTmFtZSA9IGZpZWxkLm5hbWU7Ci0gICAgTlNTdHJpbmcgKmNsYXNzTmFtZSA9IHNlbGYuZGVzY3JpcHRvci5uYW1lOwotICAgIE5TTG9nKEAid2FybmluZzogJyVALiVAID0gbmlsOycgaXMgbm90IGNsZWFybHkgZGVmaW5lZCBmb3IgZmllbGRzIHdpdGggIgotICAgICAgICAgIEAiZGVmYXVsdCB2YWx1ZXMuIFBsZWFzZSB1c2UgJyVALiVAID0gJUAnIGlmIHlvdSB3YW50IHRvIHNldCBpdCB0byAiCi0gICAgICAgICAgQCJlbXB0eSwgb3IgY2FsbCAnJUAuJUAgPSBOTycgdG8gcmVzZXQgaXQgdG8gaXQncyBkZWZhdWx0IHZhbHVlIG9mICIKLSAgICAgICAgICBAIiclQCcuIERlZmF1bHRpbmcgdG8gcmVzZXR0aW5nIGRlZmF1bHQgdmFsdWUuIiwKLSAgICAgICAgICBjbGFzc05hbWUsIHByb3BOYW1lLCBjbGFzc05hbWUsIHByb3BOYW1lLAotICAgICAgICAgIChmaWVsZFR5cGUgPT0gR1BCRGF0YVR5cGVTdHJpbmcpID8gQCJAXCJcIiIgOiBAIkdQQkVtcHR5TlNEYXRhKCkiLAotICAgICAgICAgIGNsYXNzTmFtZSwgaGFzU2VsLCBmaWVsZC5kZWZhdWx0VmFsdWUudmFsdWVTdHJpbmcpOwotICAgIC8vIE5vdGU6IHZhbHVlU3RyaW5nLCBkZXBlbmRpbmcgb24gdGhlIHR5cGUsIGl0IGNvdWxkIGVhc2lseSBiZQotICAgIC8vIHZhbHVlRGF0YS92YWx1ZU1lc3NhZ2UuCi0gIH0KLSNlbmRpZiAgLy8gREVCVUcKLSAgaWYgKCFpc01hcE9yQXJyYXkpIHsKLSAgICAvLyBOb24gcmVwZWF0ZWQvbWFwIGNhbiBiZSBpbiBhbiBvbmVvZiwgY2xlYXIgYW55IGV4aXN0aW5nIHZhbHVlIGZyb20gdGhlCi0gICAgLy8gb25lb2YuCi0gICAgR1BCT25lb2ZEZXNjcmlwdG9yICpvbmVvZiA9IGZpZWxkLT5jb250YWluaW5nT25lb2ZfOwotICAgIGlmIChvbmVvZikgewotICAgICAgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gKmZpZWxkRGVzYyA9IGZpZWxkLT5kZXNjcmlwdGlvbl87Ci0gICAgICBHUEJNYXliZUNsZWFyT25lb2Yoc2VsZiwgb25lb2YsIGZpZWxkRGVzYy0+aGFzSW5kZXgsIGZpZWxkRGVzYy0+bnVtYmVyKTsKLSAgICB9Ci0gICAgLy8gQ2xlYXIgImhhcyIgaWYgdGhleSBhcmUgYmVpbmcgc2V0IHRvIG5pbC4KLSAgICBCT09MIHNldEhhc1ZhbHVlID0gKHZhbHVlICE9IG5pbCk7Ci0gICAgLy8gVW5kZXIgcHJvdG8zLCBCeXRlcyAmIFN0cmluZyBmaWVsZHMgZ2V0IGNsZWFyZWQgYnkgcmVzZXR0aW5nIHRoZW0gdG8KLSAgICAvLyB0aGVpciBkZWZhdWx0IChlbXB0eSkgdmFsdWVzLCBzbyBpZiB0aGV5IGFyZSBzZXQgdG8gc29tZXRoaW5nIG9mIGxlbmd0aAotICAgIC8vIHplcm8sIHRoZXkgYXJlIGJlaW5nIGNsZWFyZWQuCi0gICAgaWYgKChzeW50YXggPT0gR1BCRmlsZVN5bnRheFByb3RvMykgJiYgIWZpZWxkSXNNZXNzYWdlICYmCi0gICAgICAgIChbdmFsdWUgbGVuZ3RoXSA9PSAwKSkgewotICAgICAgc2V0SGFzVmFsdWUgPSBOTzsKLSAgICAgIHZhbHVlID0gbmlsOwotICAgIH0KLSAgICBHUEJTZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQsIHNldEhhc1ZhbHVlKTsKLSAgfQotICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gIGlkICp0eXBlUHRyID0gKGlkICopJnN0b3JhZ2VbZmllbGQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLQotICBpZCBvbGRWYWx1ZSA9ICp0eXBlUHRyOwotCi0gICp0eXBlUHRyID0gdmFsdWU7Ci0KLSAgaWYgKG9sZFZhbHVlKSB7Ci0gICAgaWYgKGlzTWFwT3JBcnJheSkgewotICAgICAgaWYgKGZpZWxkLmZpZWxkVHlwZSA9PSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgICAgICAvLyBJZiB0aGUgb2xkIGFycmF5IHdhcyBhdXRvY3JlYXRlZCBieSB1cywgdGhlbiBjbGVhciBpdC4KLSAgICAgICAgaWYgKEdQQkRhdGFUeXBlSXNPYmplY3QoZmllbGRUeXBlKSkgewotICAgICAgICAgIEdQQkF1dG9jcmVhdGVkQXJyYXkgKmF1dG9BcnJheSA9IG9sZFZhbHVlOwotICAgICAgICAgIGlmIChhdXRvQXJyYXktPl9hdXRvY3JlYXRvciA9PSBzZWxmKSB7Ci0gICAgICAgICAgICBhdXRvQXJyYXktPl9hdXRvY3JlYXRvciA9IG5pbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVHlwZSBkb2Vzbid0IG1hdHRlciwgaXQgaXMgYSBHUEIqQXJyYXkuCi0gICAgICAgICAgR1BCSW50MzJBcnJheSAqZ3BiQXJyYXkgPSBvbGRWYWx1ZTsKLSAgICAgICAgICBpZiAoZ3BiQXJyYXktPl9hdXRvY3JlYXRvciA9PSBzZWxmKSB7Ci0gICAgICAgICAgICBncGJBcnJheS0+X2F1dG9jcmVhdG9yID0gbmlsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsgLy8gR1BCRmllbGRUeXBlTWFwCi0gICAgICAgIC8vIElmIHRoZSBvbGQgbWFwIHdhcyBhdXRvY3JlYXRlZCBieSB1cywgdGhlbiBjbGVhciBpdC4KLSAgICAgICAgaWYgKChmaWVsZC5tYXBLZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgJiYKLSAgICAgICAgICAgIEdQQkRhdGFUeXBlSXNPYmplY3QoZmllbGRUeXBlKSkgewotICAgICAgICAgIEdQQkF1dG9jcmVhdGVkRGljdGlvbmFyeSAqYXV0b0RpY3QgPSBvbGRWYWx1ZTsKLSAgICAgICAgICBpZiAoYXV0b0RpY3QtPl9hdXRvY3JlYXRvciA9PSBzZWxmKSB7Ci0gICAgICAgICAgICBhdXRvRGljdC0+X2F1dG9jcmVhdG9yID0gbmlsOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBUeXBlIGRvZXNuJ3QgbWF0dGVyLCBpdCBpcyBhIEdQQipEaWN0aW9uYXJ5LgotICAgICAgICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpncGJEaWN0ID0gb2xkVmFsdWU7Ci0gICAgICAgICAgaWYgKGdwYkRpY3QtPl9hdXRvY3JlYXRvciA9PSBzZWxmKSB7Ci0gICAgICAgICAgICBncGJEaWN0LT5fYXV0b2NyZWF0b3IgPSBuaWw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChmaWVsZElzTWVzc2FnZSkgewotICAgICAgLy8gSWYgdGhlIG9sZCBtZXNzYWdlIHZhbHVlIHdhcyBhdXRvY3JlYXRlZCBieSB1cywgdGhlbiBjbGVhciBpdC4KLSAgICAgIEdQQk1lc3NhZ2UgKm9sZE1lc3NhZ2VWYWx1ZSA9IG9sZFZhbHVlOwotICAgICAgaWYgKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG9sZE1lc3NhZ2VWYWx1ZSwgc2VsZikpIHsKLSAgICAgICAgR1BCQ2xlYXJNZXNzYWdlQXV0b2NyZWF0b3Iob2xkTWVzc2FnZVZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgW29sZFZhbHVlIHJlbGVhc2VdOwotICB9Ci0KLSAgR1BCQmVjb21lVmlzaWJsZVRvQXV0b2NyZWF0b3Ioc2VsZik7Ci19Ci0KLWlkIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICBpZiAoc2VsZi0+bWVzc2FnZVN0b3JhZ2VfID09IG5pbCkgewotICAgIHJldHVybiBuaWw7Ci0gIH0KLSAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotICBpZCAqdHlwZVB0ciA9IChpZCAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gIHJldHVybiAqdHlwZVB0cjsKLX0KLQotaWQgR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIE5TQ0Fzc2VydCghR1BCRmllbGRJc01hcE9yQXJyYXkoZmllbGQpLCBAIlNob3VsZG4ndCBnZXQgaGVyZSIpOwotICBpZiAoR1BCR2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkKSkgewotICAgIHVpbnQ4X3QgKnN0b3JhZ2UgPSAodWludDhfdCAqKXNlbGYtPm1lc3NhZ2VTdG9yYWdlXzsKLSAgICBpZCAqdHlwZVB0ciA9IChpZCAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gICAgcmV0dXJuICp0eXBlUHRyOwotICB9Ci0gIC8vIE5vdCBzZXQuLi4KLQotICAvLyBOb24gbWVzc2FnZXMgKHN0cmluZy9kYXRhKSwgZ2V0IHRoZWlyIGRlZmF1bHQuCi0gIGlmICghR1BCRmllbGREYXRhVHlwZUlzTWVzc2FnZShmaWVsZCkpIHsKLSAgICByZXR1cm4gZmllbGQuZGVmYXVsdFZhbHVlLnZhbHVlTWVzc2FnZTsKLSAgfQotCi0gIEdQQlByZXBhcmVSZWFkT25seVNlbWFwaG9yZShzZWxmKTsKLSAgZGlzcGF0Y2hfc2VtYXBob3JlX3dhaXQoc2VsZi0+cmVhZE9ubHlTZW1hcGhvcmVfLCBESVNQQVRDSF9USU1FX0ZPUkVWRVIpOwotICBHUEJNZXNzYWdlICpyZXN1bHQgPSBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKHNlbGYsIGZpZWxkKTsKLSAgaWYgKCFyZXN1bHQpIHsKLSAgICAvLyBGb3Igbm9uIHJlcGVhdGVkIG1lc3NhZ2VzLCBjcmVhdGUgdGhlIG9iamVjdCwgc2V0IGl0IGFuZCByZXR1cm4gaXQuCi0gICAgLy8gVGhpcyBvYmplY3Qgd2lsbCBub3QgaW5pdGlhbGx5IGJlIHZpc2libGUgdmlhIEdQQkdldEhhc0l2YXIsIHNvCi0gICAgLy8gd2Ugc2F2ZSBpdHMgY3JlYXRvciBzbyBpdCBjYW4gYmVjb21lIHZpc2libGUgaWYgaXQncyBtdXRhdGVkIGxhdGVyLgotICAgIHJlc3VsdCA9IEdQQkNyZWF0ZU1lc3NhZ2VXaXRoQXV0b2NyZWF0b3IoZmllbGQubXNnQ2xhc3MsIHNlbGYsIGZpZWxkKTsKLSAgICBHUEJTZXRBdXRvY3JlYXRlZFJldGFpbmVkT2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgcmVzdWx0KTsKLSAgfQotICBkaXNwYXRjaF9zZW1hcGhvcmVfc2lnbmFsKHNlbGYtPnJlYWRPbmx5U2VtYXBob3JlXyk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotaW50MzJfdCBHUEJHZXRNZXNzYWdlRW51bUZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgR1BCRmlsZVN5bnRheCBzeW50YXggPSBbc2VsZiBkZXNjcmlwdG9yXS5maWxlLnN5bnRheDsKLSAgcmV0dXJuIEdQQkdldEVudW1JdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIHN5bnRheCk7Ci19Ci0KLWludDMyX3QgR1BCR2V0RW51bUl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpIHsKLSAgaW50MzJfdCByZXN1bHQgPSBHUEJHZXRNZXNzYWdlSW50MzJGaWVsZChzZWxmLCBmaWVsZCk7Ci0gIC8vIElmIHRoaXMgaXMgcHJlc2V2ZXJpbmcgdW5rbm93biBlbnVtcywgbWFrZSBzdXJlIHRoZSB2YWx1ZSBpcyB2YWxpZCBiZWZvcmUKLSAgLy8gcmV0dXJuaW5nIGl0LgotICBpZiAoR1BCSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKHN5bnRheCkgJiYKLSAgICAgICFbZmllbGQgaXNWYWxpZEVudW1WYWx1ZTpyZXN1bHRdKSB7Ci0gICAgcmVzdWx0ID0ga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLXZvaWQgR1BCU2V0TWVzc2FnZUVudW1GaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUpIHsKLSAgR1BCRmlsZVN5bnRheCBzeW50YXggPSBbc2VsZiBkZXNjcmlwdG9yXS5maWxlLnN5bnRheDsKLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIHZhbHVlLCBzeW50YXgpOwotfQotCi12b2lkIEdQQlNldEVudW1JdmFyV2l0aEZpZWxkSW50ZXJuYWwoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpbnQzMl90IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KSB7Ci0gIC8vIERvbid0IGFsbG93IGluIHVua25vd24gdmFsdWVzLiAgUHJvdG8zIGNhbiB1c2UgdGhlIFJhdyBtZXRob2QuCi0gIGlmICghW2ZpZWxkIGlzVmFsaWRFbnVtVmFsdWU6dmFsdWVdKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiJUAuJUA6IEF0dGVtcHQgdG8gc2V0IGFuIHVua25vd24gZW51bSB2YWx1ZSAoJWQpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBmaWVsZC5uYW1lLCB2YWx1ZV07Ci0gIH0KLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIHZhbHVlLCBzeW50YXgpOwotfQotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLWludDMyX3QgR1BCR2V0TWVzc2FnZVJhd0VudW1GaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgaW50MzJfdCByZXN1bHQgPSBHUEJHZXRNZXNzYWdlSW50MzJGaWVsZChzZWxmLCBmaWVsZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotdm9pZCBHUEJTZXRNZXNzYWdlUmF3RW51bUZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSkgewotICBHUEJGaWxlU3ludGF4IHN5bnRheCA9IFtzZWxmIGRlc2NyaXB0b3JdLmZpbGUuc3ludGF4OwotICBHUEJTZXRJbnQzMkl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgdmFsdWUsIHN5bnRheCk7Ci19Ci0KLUJPT0wgR1BCR2V0TWVzc2FnZUJvb2xGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICAvLyBCb29scyBhcmUgc3RvcmVkIGluIHRoZSBoYXMgYml0cyB0byBhdm9pZCBuZWVkaW5nIGV4cGxpY2l0IHNwYWNlIGluIHRoZQotICAgIC8vIHN0b3JhZ2Ugc3RydWN0dXJlLgotICAgIC8vICh0aGUgZmllbGQgbnVtYmVyIHBhc3NlZCB0byB0aGUgSGFzSXZhciBoZWxwZXIgZG9lc24ndCByZWFsbHkgbWF0dGVyCi0gICAgLy8gc2luY2UgdGhlIG9mZnNldCBpcyBuZXZlciBuZWdhdGl2ZSkKLSAgICBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiAqZmllbGREZXNjID0gZmllbGQtPmRlc2NyaXB0aW9uXzsKLSAgICByZXR1cm4gR1BCR2V0SGFzSXZhcihzZWxmLCAoaW50MzJfdCkoZmllbGREZXNjLT5vZmZzZXQpLCBmaWVsZERlc2MtPm51bWJlcik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRWYWx1ZS52YWx1ZUJvb2w7Ci0gIH0KLX0KLQotLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi12b2lkIEdQQlNldE1lc3NhZ2VCb29sRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJPT0wgdmFsdWUpIHsKLSAgaWYgKHNlbGYgPT0gbmlsIHx8IGZpZWxkID09IG5pbCkgcmV0dXJuOwotICBHUEJGaWxlU3ludGF4IHN5bnRheCA9IFtzZWxmIGRlc2NyaXB0b3JdLmZpbGUuc3ludGF4OwotICBHUEJTZXRCb29sSXZhcldpdGhGaWVsZEludGVybmFsKHNlbGYsIGZpZWxkLCB2YWx1ZSwgc3ludGF4KTsKLX0KLQotdm9pZCBHUEJTZXRCb29sSXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KSB7Ci0gIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uICpmaWVsZERlc2MgPSBmaWVsZC0+ZGVzY3JpcHRpb25fOwotICBHUEJPbmVvZkRlc2NyaXB0b3IgKm9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdPbmVvZl87Ci0gIGlmIChvbmVvZikgewotICAgIEdQQk1heWJlQ2xlYXJPbmVvZihzZWxmLCBvbmVvZiwgZmllbGREZXNjLT5oYXNJbmRleCwgZmllbGREZXNjLT5udW1iZXIpOwotICB9Ci0KLSAgLy8gQm9vbHMgYXJlIHN0b3JlZCBpbiB0aGUgaGFzIGJpdHMgdG8gYXZvaWQgbmVlZGluZyBleHBsaWNpdCBzcGFjZSBpbiB0aGUKLSAgLy8gc3RvcmFnZSBzdHJ1Y3R1cmUuCi0gIC8vICh0aGUgZmllbGQgbnVtYmVyIHBhc3NlZCB0byB0aGUgSGFzSXZhciBoZWxwZXIgZG9lc24ndCByZWFsbHkgbWF0dGVyIHNpbmNlCi0gIC8vIHRoZSBvZmZzZXQgaXMgbmV2ZXIgbmVnYXRpdmUpCi0gIEdQQlNldEhhc0l2YXIoc2VsZiwgKGludDMyX3QpKGZpZWxkRGVzYy0+b2Zmc2V0KSwgZmllbGREZXNjLT5udW1iZXIsIHZhbHVlKTsKLQotICAvLyBwcm90bzI6IGFueSB2YWx1ZSBjb3VudHMgYXMgaGF2aW5nIGJlZW4gc2V0OyBwcm90bzMsIGl0Ci0gIC8vIGhhcyB0byBiZSBhIG5vbiB6ZXJvIHZhbHVlLgotICBCT09MIGhhc1ZhbHVlID0KLSAgICAoc3ludGF4ID09IEdQQkZpbGVTeW50YXhQcm90bzIpIHx8ICh2YWx1ZSAhPSAoQk9PTCkwKTsKLSAgR1BCU2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkLCBoYXNWYWx1ZSk7Ci0gIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKHNlbGYpOwotfQotCi0vLyVQRERNLUVYUEFORCBJVkFSX1BPRF9BQ0NFU1NPUlNfREVGTihJbnQzMiwgaW50MzJfdCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi1pbnQzMl90IEdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gICAgaW50MzJfdCAqdHlwZVB0ciA9IChpbnQzMl90ICopJnN0b3JhZ2VbZmllbGQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLSAgICByZXR1cm4gKnR5cGVQdHI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRWYWx1ZS52YWx1ZUludDMyOwotICB9Ci19Ci0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotdm9pZCBHUEJTZXRNZXNzYWdlSW50MzJGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbHVlKSB7Ci0gIGlmIChzZWxmID09IG5pbCB8fCBmaWVsZCA9PSBuaWwpIHJldHVybjsKLSAgR1BCRmlsZVN5bnRheCBzeW50YXggPSBbc2VsZiBkZXNjcmlwdG9yXS5maWxlLnN5bnRheDsKLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIHZhbHVlLCBzeW50YXgpOwotfQotCi12b2lkIEdQQlNldEludDMySXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KSB7Ci0gIEdQQk9uZW9mRGVzY3JpcHRvciAqb25lb2YgPSBmaWVsZC0+Y29udGFpbmluZ09uZW9mXzsKLSAgaWYgKG9uZW9mKSB7Ci0gICAgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gKmZpZWxkRGVzYyA9IGZpZWxkLT5kZXNjcmlwdGlvbl87Ci0gICAgR1BCTWF5YmVDbGVhck9uZW9mKHNlbGYsIG9uZW9mLCBmaWVsZERlc2MtPmhhc0luZGV4LCBmaWVsZERlc2MtPm51bWJlcik7Ci0gIH0KLSAgTlNDQXNzZXJ0KHNlbGYtPm1lc3NhZ2VTdG9yYWdlXyAhPSBOVUxMLAotICAgICAgICAgICAgQCIlQDogQWxsIG1lc3NhZ2VzIHNob3VsZCBoYXZlIHN0b3JhZ2UgKGZyb20gaW5pdCkiLAotICAgICAgICAgICAgW3NlbGYgY2xhc3NdKTsKLSNpZiBkZWZpbmVkKF9fY2xhbmdfYW5hbHl6ZXJfXykKLSAgaWYgKHNlbGYtPm1lc3NhZ2VTdG9yYWdlXyA9PSBOVUxMKSByZXR1cm47Ci0jZW5kaWYKLSAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotICBpbnQzMl90ICp0eXBlUHRyID0gKGludDMyX3QgKikmc3RvcmFnZVtmaWVsZC0+ZGVzY3JpcHRpb25fLT5vZmZzZXRdOwotICAqdHlwZVB0ciA9IHZhbHVlOwotICAvLyBwcm90bzI6IGFueSB2YWx1ZSBjb3VudHMgYXMgaGF2aW5nIGJlZW4gc2V0OyBwcm90bzMsIGl0Ci0gIC8vIGhhcyB0byBiZSBhIG5vbiB6ZXJvIHZhbHVlLgotICBCT09MIGhhc1ZhbHVlID0KLSAgICAoc3ludGF4ID09IEdQQkZpbGVTeW50YXhQcm90bzIpIHx8ICh2YWx1ZSAhPSAoaW50MzJfdCkwKTsKLSAgR1BCU2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkLCBoYXNWYWx1ZSk7Ci0gIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKHNlbGYpOwotfQotCi0vLyVQRERNLUVYUEFORCBJVkFSX1BPRF9BQ0NFU1NPUlNfREVGTihVSW50MzIsIHVpbnQzMl90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLXVpbnQzMl90IEdQQkdldE1lc3NhZ2VVSW50MzJGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gICAgdWludDMyX3QgKnR5cGVQdHIgPSAodWludDMyX3QgKikmc3RvcmFnZVtmaWVsZC0+ZGVzY3JpcHRpb25fLT5vZmZzZXRdOwotICAgIHJldHVybiAqdHlwZVB0cjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmllbGQuZGVmYXVsdFZhbHVlLnZhbHVlVUludDMyOwotICB9Ci19Ci0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotdm9pZCBHUEJTZXRNZXNzYWdlVUludDMyRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCB2YWx1ZSkgewotICBpZiAoc2VsZiA9PSBuaWwgfHwgZmllbGQgPT0gbmlsKSByZXR1cm47Ci0gIEdQQkZpbGVTeW50YXggc3ludGF4ID0gW3NlbGYgZGVzY3JpcHRvcl0uZmlsZS5zeW50YXg7Ci0gIEdQQlNldFVJbnQzMkl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgdmFsdWUsIHN5bnRheCk7Ci19Ci0KLXZvaWQgR1BCU2V0VUludDMySXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCkgewotICBHUEJPbmVvZkRlc2NyaXB0b3IgKm9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdPbmVvZl87Ci0gIGlmIChvbmVvZikgewotICAgIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uICpmaWVsZERlc2MgPSBmaWVsZC0+ZGVzY3JpcHRpb25fOwotICAgIEdQQk1heWJlQ2xlYXJPbmVvZihzZWxmLCBvbmVvZiwgZmllbGREZXNjLT5oYXNJbmRleCwgZmllbGREZXNjLT5udW1iZXIpOwotICB9Ci0gIE5TQ0Fzc2VydChzZWxmLT5tZXNzYWdlU3RvcmFnZV8gIT0gTlVMTCwKLSAgICAgICAgICAgIEAiJUA6IEFsbCBtZXNzYWdlcyBzaG91bGQgaGF2ZSBzdG9yYWdlIChmcm9tIGluaXQpIiwKLSAgICAgICAgICAgIFtzZWxmIGNsYXNzXSk7Ci0jaWYgZGVmaW5lZChfX2NsYW5nX2FuYWx5emVyX18pCi0gIGlmIChzZWxmLT5tZXNzYWdlU3RvcmFnZV8gPT0gTlVMTCkgcmV0dXJuOwotI2VuZGlmCi0gIHVpbnQ4X3QgKnN0b3JhZ2UgPSAodWludDhfdCAqKXNlbGYtPm1lc3NhZ2VTdG9yYWdlXzsKLSAgdWludDMyX3QgKnR5cGVQdHIgPSAodWludDMyX3QgKikmc3RvcmFnZVtmaWVsZC0+ZGVzY3JpcHRpb25fLT5vZmZzZXRdOwotICAqdHlwZVB0ciA9IHZhbHVlOwotICAvLyBwcm90bzI6IGFueSB2YWx1ZSBjb3VudHMgYXMgaGF2aW5nIGJlZW4gc2V0OyBwcm90bzMsIGl0Ci0gIC8vIGhhcyB0byBiZSBhIG5vbiB6ZXJvIHZhbHVlLgotICBCT09MIGhhc1ZhbHVlID0KLSAgICAoc3ludGF4ID09IEdQQkZpbGVTeW50YXhQcm90bzIpIHx8ICh2YWx1ZSAhPSAodWludDMyX3QpMCk7Ci0gIEdQQlNldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCwgaGFzVmFsdWUpOwotICBHUEJCZWNvbWVWaXNpYmxlVG9BdXRvY3JlYXRvcihzZWxmKTsKLX0KLQotLy8lUERETS1FWFBBTkQgSVZBUl9QT0RfQUNDRVNTT1JTX0RFRk4oSW50NjQsIGludDY0X3QpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotaW50NjRfdCBHUEJHZXRNZXNzYWdlSW50NjRGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIGlmIChHUEJHZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQpKSB7Ci0gICAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotICAgIGludDY0X3QgKnR5cGVQdHIgPSAoaW50NjRfdCAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gICAgcmV0dXJuICp0eXBlUHRyOwotICB9IGVsc2UgewotICAgIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWUudmFsdWVJbnQ2NDsKLSAgfQotfQotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLXZvaWQgR1BCU2V0TWVzc2FnZUludDY0RmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCB2YWx1ZSkgewotICBpZiAoc2VsZiA9PSBuaWwgfHwgZmllbGQgPT0gbmlsKSByZXR1cm47Ci0gIEdQQkZpbGVTeW50YXggc3ludGF4ID0gW3NlbGYgZGVzY3JpcHRvcl0uZmlsZS5zeW50YXg7Ci0gIEdQQlNldEludDY0SXZhcldpdGhGaWVsZEludGVybmFsKHNlbGYsIGZpZWxkLCB2YWx1ZSwgc3ludGF4KTsKLX0KLQotdm9pZCBHUEJTZXRJbnQ2NEl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCkgewotICBHUEJPbmVvZkRlc2NyaXB0b3IgKm9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdPbmVvZl87Ci0gIGlmIChvbmVvZikgewotICAgIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uICpmaWVsZERlc2MgPSBmaWVsZC0+ZGVzY3JpcHRpb25fOwotICAgIEdQQk1heWJlQ2xlYXJPbmVvZihzZWxmLCBvbmVvZiwgZmllbGREZXNjLT5oYXNJbmRleCwgZmllbGREZXNjLT5udW1iZXIpOwotICB9Ci0gIE5TQ0Fzc2VydChzZWxmLT5tZXNzYWdlU3RvcmFnZV8gIT0gTlVMTCwKLSAgICAgICAgICAgIEAiJUA6IEFsbCBtZXNzYWdlcyBzaG91bGQgaGF2ZSBzdG9yYWdlIChmcm9tIGluaXQpIiwKLSAgICAgICAgICAgIFtzZWxmIGNsYXNzXSk7Ci0jaWYgZGVmaW5lZChfX2NsYW5nX2FuYWx5emVyX18pCi0gIGlmIChzZWxmLT5tZXNzYWdlU3RvcmFnZV8gPT0gTlVMTCkgcmV0dXJuOwotI2VuZGlmCi0gIHVpbnQ4X3QgKnN0b3JhZ2UgPSAodWludDhfdCAqKXNlbGYtPm1lc3NhZ2VTdG9yYWdlXzsKLSAgaW50NjRfdCAqdHlwZVB0ciA9IChpbnQ2NF90ICopJnN0b3JhZ2VbZmllbGQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLSAgKnR5cGVQdHIgPSB2YWx1ZTsKLSAgLy8gcHJvdG8yOiBhbnkgdmFsdWUgY291bnRzIGFzIGhhdmluZyBiZWVuIHNldDsgcHJvdG8zLCBpdAotICAvLyBoYXMgdG8gYmUgYSBub24gemVybyB2YWx1ZS4KLSAgQk9PTCBoYXNWYWx1ZSA9Ci0gICAgKHN5bnRheCA9PSBHUEJGaWxlU3ludGF4UHJvdG8yKSB8fCAodmFsdWUgIT0gKGludDY0X3QpMCk7Ci0gIEdQQlNldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCwgaGFzVmFsdWUpOwotICBHUEJCZWNvbWVWaXNpYmxlVG9BdXRvY3JlYXRvcihzZWxmKTsKLX0KLQotLy8lUERETS1FWFBBTkQgSVZBUl9QT0RfQUNDRVNTT1JTX0RFRk4oVUludDY0LCB1aW50NjRfdCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi11aW50NjRfdCBHUEJHZXRNZXNzYWdlVUludDY0RmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIGlmIChHUEJHZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQpKSB7Ci0gICAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotICAgIHVpbnQ2NF90ICp0eXBlUHRyID0gKHVpbnQ2NF90ICopJnN0b3JhZ2VbZmllbGQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLSAgICByZXR1cm4gKnR5cGVQdHI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRWYWx1ZS52YWx1ZVVJbnQ2NDsKLSAgfQotfQotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLXZvaWQgR1BCU2V0TWVzc2FnZVVJbnQ2NEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUpIHsKLSAgaWYgKHNlbGYgPT0gbmlsIHx8IGZpZWxkID09IG5pbCkgcmV0dXJuOwotICBHUEJGaWxlU3ludGF4IHN5bnRheCA9IFtzZWxmIGRlc2NyaXB0b3JdLmZpbGUuc3ludGF4OwotICBHUEJTZXRVSW50NjRJdmFyV2l0aEZpZWxkSW50ZXJuYWwoc2VsZiwgZmllbGQsIHZhbHVlLCBzeW50YXgpOwotfQotCi12b2lkIEdQQlNldFVJbnQ2NEl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpIHsKLSAgR1BCT25lb2ZEZXNjcmlwdG9yICpvbmVvZiA9IGZpZWxkLT5jb250YWluaW5nT25lb2ZfOwotICBpZiAob25lb2YpIHsKLSAgICBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiAqZmllbGREZXNjID0gZmllbGQtPmRlc2NyaXB0aW9uXzsKLSAgICBHUEJNYXliZUNsZWFyT25lb2Yoc2VsZiwgb25lb2YsIGZpZWxkRGVzYy0+aGFzSW5kZXgsIGZpZWxkRGVzYy0+bnVtYmVyKTsKLSAgfQotICBOU0NBc3NlcnQoc2VsZi0+bWVzc2FnZVN0b3JhZ2VfICE9IE5VTEwsCi0gICAgICAgICAgICBAIiVAOiBBbGwgbWVzc2FnZXMgc2hvdWxkIGhhdmUgc3RvcmFnZSAoZnJvbSBpbml0KSIsCi0gICAgICAgICAgICBbc2VsZiBjbGFzc10pOwotI2lmIGRlZmluZWQoX19jbGFuZ19hbmFseXplcl9fKQotICBpZiAoc2VsZi0+bWVzc2FnZVN0b3JhZ2VfID09IE5VTEwpIHJldHVybjsKLSNlbmRpZgotICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gIHVpbnQ2NF90ICp0eXBlUHRyID0gKHVpbnQ2NF90ICopJnN0b3JhZ2VbZmllbGQtPmRlc2NyaXB0aW9uXy0+b2Zmc2V0XTsKLSAgKnR5cGVQdHIgPSB2YWx1ZTsKLSAgLy8gcHJvdG8yOiBhbnkgdmFsdWUgY291bnRzIGFzIGhhdmluZyBiZWVuIHNldDsgcHJvdG8zLCBpdAotICAvLyBoYXMgdG8gYmUgYSBub24gemVybyB2YWx1ZS4KLSAgQk9PTCBoYXNWYWx1ZSA9Ci0gICAgKHN5bnRheCA9PSBHUEJGaWxlU3ludGF4UHJvdG8yKSB8fCAodmFsdWUgIT0gKHVpbnQ2NF90KTApOwotICBHUEJTZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQsIGhhc1ZhbHVlKTsKLSAgR1BCQmVjb21lVmlzaWJsZVRvQXV0b2NyZWF0b3Ioc2VsZik7Ci19Ci0KLS8vJVBERE0tRVhQQU5EIElWQVJfUE9EX0FDQ0VTU09SU19ERUZOKEZsb2F0LCBmbG9hdCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi1mbG9hdCBHUEJHZXRNZXNzYWdlRmxvYXRGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICBpZiAoR1BCR2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkKSkgewotICAgIHVpbnQ4X3QgKnN0b3JhZ2UgPSAodWludDhfdCAqKXNlbGYtPm1lc3NhZ2VTdG9yYWdlXzsKLSAgICBmbG9hdCAqdHlwZVB0ciA9IChmbG9hdCAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gICAgcmV0dXJuICp0eXBlUHRyOwotICB9IGVsc2UgewotICAgIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWUudmFsdWVGbG9hdDsKLSAgfQotfQotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLXZvaWQgR1BCU2V0TWVzc2FnZUZsb2F0RmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUpIHsKLSAgaWYgKHNlbGYgPT0gbmlsIHx8IGZpZWxkID09IG5pbCkgcmV0dXJuOwotICBHUEJGaWxlU3ludGF4IHN5bnRheCA9IFtzZWxmIGRlc2NyaXB0b3JdLmZpbGUuc3ludGF4OwotICBHUEJTZXRGbG9hdEl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgdmFsdWUsIHN5bnRheCk7Ci19Ci0KLXZvaWQgR1BCU2V0RmxvYXRJdmFyV2l0aEZpZWxkSW50ZXJuYWwoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KSB7Ci0gIEdQQk9uZW9mRGVzY3JpcHRvciAqb25lb2YgPSBmaWVsZC0+Y29udGFpbmluZ09uZW9mXzsKLSAgaWYgKG9uZW9mKSB7Ci0gICAgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gKmZpZWxkRGVzYyA9IGZpZWxkLT5kZXNjcmlwdGlvbl87Ci0gICAgR1BCTWF5YmVDbGVhck9uZW9mKHNlbGYsIG9uZW9mLCBmaWVsZERlc2MtPmhhc0luZGV4LCBmaWVsZERlc2MtPm51bWJlcik7Ci0gIH0KLSAgTlNDQXNzZXJ0KHNlbGYtPm1lc3NhZ2VTdG9yYWdlXyAhPSBOVUxMLAotICAgICAgICAgICAgQCIlQDogQWxsIG1lc3NhZ2VzIHNob3VsZCBoYXZlIHN0b3JhZ2UgKGZyb20gaW5pdCkiLAotICAgICAgICAgICAgW3NlbGYgY2xhc3NdKTsKLSNpZiBkZWZpbmVkKF9fY2xhbmdfYW5hbHl6ZXJfXykKLSAgaWYgKHNlbGYtPm1lc3NhZ2VTdG9yYWdlXyA9PSBOVUxMKSByZXR1cm47Ci0jZW5kaWYKLSAgdWludDhfdCAqc3RvcmFnZSA9ICh1aW50OF90ICopc2VsZi0+bWVzc2FnZVN0b3JhZ2VfOwotICBmbG9hdCAqdHlwZVB0ciA9IChmbG9hdCAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gICp0eXBlUHRyID0gdmFsdWU7Ci0gIC8vIHByb3RvMjogYW55IHZhbHVlIGNvdW50cyBhcyBoYXZpbmcgYmVlbiBzZXQ7IHByb3RvMywgaXQKLSAgLy8gaGFzIHRvIGJlIGEgbm9uIHplcm8gdmFsdWUuCi0gIEJPT0wgaGFzVmFsdWUgPQotICAgIChzeW50YXggPT0gR1BCRmlsZVN5bnRheFByb3RvMikgfHwgKHZhbHVlICE9IChmbG9hdCkwKTsKLSAgR1BCU2V0SGFzSXZhckZpZWxkKHNlbGYsIGZpZWxkLCBoYXNWYWx1ZSk7Ci0gIEdQQkJlY29tZVZpc2libGVUb0F1dG9jcmVhdG9yKHNlbGYpOwotfQotCi0vLyVQRERNLUVYUEFORCBJVkFSX1BPRF9BQ0NFU1NPUlNfREVGTihEb3VibGUsIGRvdWJsZSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi1kb3VibGUgR1BCR2V0TWVzc2FnZURvdWJsZUZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgaWYgKEdQQkdldEhhc0l2YXJGaWVsZChzZWxmLCBmaWVsZCkpIHsKLSAgICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gICAgZG91YmxlICp0eXBlUHRyID0gKGRvdWJsZSAqKSZzdG9yYWdlW2ZpZWxkLT5kZXNjcmlwdGlvbl8tPm9mZnNldF07Ci0gICAgcmV0dXJuICp0eXBlUHRyOwotICB9IGVsc2UgewotICAgIHJldHVybiBmaWVsZC5kZWZhdWx0VmFsdWUudmFsdWVEb3VibGU7Ci0gIH0KLX0KLQotLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi12b2lkIEdQQlNldE1lc3NhZ2VEb3VibGVGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvdWJsZSB2YWx1ZSkgewotICBpZiAoc2VsZiA9PSBuaWwgfHwgZmllbGQgPT0gbmlsKSByZXR1cm47Ci0gIEdQQkZpbGVTeW50YXggc3ludGF4ID0gW3NlbGYgZGVzY3JpcHRvcl0uZmlsZS5zeW50YXg7Ci0gIEdQQlNldERvdWJsZUl2YXJXaXRoRmllbGRJbnRlcm5hbChzZWxmLCBmaWVsZCwgdmFsdWUsIHN5bnRheCk7Ci19Ci0KLXZvaWQgR1BCU2V0RG91YmxlSXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpIHsKLSAgR1BCT25lb2ZEZXNjcmlwdG9yICpvbmVvZiA9IGZpZWxkLT5jb250YWluaW5nT25lb2ZfOwotICBpZiAob25lb2YpIHsKLSAgICBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiAqZmllbGREZXNjID0gZmllbGQtPmRlc2NyaXB0aW9uXzsKLSAgICBHUEJNYXliZUNsZWFyT25lb2Yoc2VsZiwgb25lb2YsIGZpZWxkRGVzYy0+aGFzSW5kZXgsIGZpZWxkRGVzYy0+bnVtYmVyKTsKLSAgfQotICBOU0NBc3NlcnQoc2VsZi0+bWVzc2FnZVN0b3JhZ2VfICE9IE5VTEwsCi0gICAgICAgICAgICBAIiVAOiBBbGwgbWVzc2FnZXMgc2hvdWxkIGhhdmUgc3RvcmFnZSAoZnJvbSBpbml0KSIsCi0gICAgICAgICAgICBbc2VsZiBjbGFzc10pOwotI2lmIGRlZmluZWQoX19jbGFuZ19hbmFseXplcl9fKQotICBpZiAoc2VsZi0+bWVzc2FnZVN0b3JhZ2VfID09IE5VTEwpIHJldHVybjsKLSNlbmRpZgotICB1aW50OF90ICpzdG9yYWdlID0gKHVpbnQ4X3QgKilzZWxmLT5tZXNzYWdlU3RvcmFnZV87Ci0gIGRvdWJsZSAqdHlwZVB0ciA9IChkb3VibGUgKikmc3RvcmFnZVtmaWVsZC0+ZGVzY3JpcHRpb25fLT5vZmZzZXRdOwotICAqdHlwZVB0ciA9IHZhbHVlOwotICAvLyBwcm90bzI6IGFueSB2YWx1ZSBjb3VudHMgYXMgaGF2aW5nIGJlZW4gc2V0OyBwcm90bzMsIGl0Ci0gIC8vIGhhcyB0byBiZSBhIG5vbiB6ZXJvIHZhbHVlLgotICBCT09MIGhhc1ZhbHVlID0KLSAgICAoc3ludGF4ID09IEdQQkZpbGVTeW50YXhQcm90bzIpIHx8ICh2YWx1ZSAhPSAoZG91YmxlKTApOwotICBHUEJTZXRIYXNJdmFyRmllbGQoc2VsZiwgZmllbGQsIGhhc1ZhbHVlKTsKLSAgR1BCQmVjb21lVmlzaWJsZVRvQXV0b2NyZWF0b3Ioc2VsZik7Ci19Ci0KLS8vJVBERE0tRVhQQU5ELUVORCAoNiBleHBhbnNpb25zKQotCi0vLyBBbGlhc2VzIGFyZSBmdW5jdGlvbiBjYWxscyB0aGF0IGFyZSB2aXJ0dWFsbHkgdGhlIHNhbWUuCi0KLS8vJVBERE0tRVhQQU5EIElWQVJfQUxJQVNfREVGTl9PQkpFQ1QoU3RyaW5nLCBOU1N0cmluZykKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLU5TU3RyaW5nICpHUEJHZXRNZXNzYWdlU3RyaW5nRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICByZXR1cm4gKE5TU3RyaW5nICopR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCk7Ci19Ci0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotdm9pZCBHUEJTZXRNZXNzYWdlU3RyaW5nRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1N0cmluZyAqdmFsdWUpIHsKLSAgR1BCU2V0T2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgKGlkKXZhbHVlKTsKLX0KLQotLy8lUERETS1FWFBBTkQgSVZBUl9BTElBU19ERUZOX09CSkVDVChCeXRlcywgTlNEYXRhKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotTlNEYXRhICpHUEJHZXRNZXNzYWdlQnl0ZXNGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIHJldHVybiAoTlNEYXRhICopR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCk7Ci19Ci0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotdm9pZCBHUEJTZXRNZXNzYWdlQnl0ZXNGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0RhdGEgKnZhbHVlKSB7Ci0gIEdQQlNldE9iamVjdEl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGQsIChpZCl2YWx1ZSk7Ci19Ci0KLS8vJVBERE0tRVhQQU5EIElWQVJfQUxJQVNfREVGTl9PQkpFQ1QoTWVzc2FnZSwgR1BCTWVzc2FnZSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLUdQQk1lc3NhZ2UgKkdQQkdldE1lc3NhZ2VNZXNzYWdlRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICByZXR1cm4gKEdQQk1lc3NhZ2UgKilHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkKTsKLX0KLQotLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi12b2lkIEdQQlNldE1lc3NhZ2VNZXNzYWdlRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKnZhbHVlKSB7Ci0gIEdQQlNldE9iamVjdEl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGQsIChpZCl2YWx1ZSk7Ci19Ci0KLS8vJVBERE0tRVhQQU5EIElWQVJfQUxJQVNfREVGTl9PQkpFQ1QoR3JvdXAsIEdQQk1lc3NhZ2UpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi1HUEJNZXNzYWdlICpHUEJHZXRNZXNzYWdlR3JvdXBGaWVsZChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICByZXR1cm4gKEdQQk1lc3NhZ2UgKilHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkKTsKLX0KLQotLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi12b2lkIEdQQlNldE1lc3NhZ2VHcm91cEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQk1lc3NhZ2UgKnZhbHVlKSB7Ci0gIEdQQlNldE9iamVjdEl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGQsIChpZCl2YWx1ZSk7Ci19Ci0KLS8vJVBERE0tRVhQQU5ELUVORCAoNCBleHBhbnNpb25zKQotCi0vLyBPbmx5IGV4aXN0cyBmb3IgcHVibGljIGFwaSwgbm8gY29yZSBjb2RlIHNob3VsZCB1c2UgdGhpcy4KLWlkIEdQQkdldE1lc3NhZ2VSZXBlYXRlZEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSNpZiBERUJVRwotICBpZiAoZmllbGQuZmllbGRUeXBlICE9IEdQQkZpZWxkVHlwZVJlcGVhdGVkKSB7Ci0gICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uCi0gICAgICAgICAgICAgICAgZm9ybWF0OkAiJUAuJUAgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgW3NlbGYgY2xhc3NdLCBmaWVsZC5uYW1lXTsKLSAgfQotI2VuZGlmCi0gIHJldHVybiBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkKHNlbGYsIGZpZWxkKTsKLX0KLQotLy8gT25seSBleGlzdHMgZm9yIHB1YmxpYyBhcGksIG5vIGNvcmUgY29kZSBzaG91bGQgdXNlIHRoaXMuCi12b2lkIEdQQlNldE1lc3NhZ2VSZXBlYXRlZEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsIGlkIGFycmF5KSB7Ci0jaWYgREVCVUcKLSAgaWYgKGZpZWxkLmZpZWxkVHlwZSAhPSBHUEJGaWVsZFR5cGVSZXBlYXRlZCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIiVALiVAIGlzIG5vdCBhIHJlcGVhdGVkIGZpZWxkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgZmllbGQubmFtZV07Ci0gIH0KLSAgQ2xhc3MgZXhwZWN0ZWRDbGFzcyA9IE5pbDsKLSAgc3dpdGNoIChHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKSkgewotICAgIGNhc2UgR1BCRGF0YVR5cGVCb29sOgotICAgICAgZXhwZWN0ZWRDbGFzcyA9IFtHUEJCb29sQXJyYXkgY2xhc3NdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNGaXhlZDMyOgotICAgIGNhc2UgR1BCRGF0YVR5cGVJbnQzMjoKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ludDMyOgotICAgICAgZXhwZWN0ZWRDbGFzcyA9IFtHUEJJbnQzMkFycmF5IGNsYXNzXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVGaXhlZDMyOgotICAgIGNhc2UgR1BCRGF0YVR5cGVVSW50MzI6Ci0gICAgICBleHBlY3RlZENsYXNzID0gW0dQQlVJbnQzMkFycmF5IGNsYXNzXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQ2NDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlSW50NjQ6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQ2NDoKLSAgICAgIGV4cGVjdGVkQ2xhc3MgPSBbR1BCSW50NjRBcnJheSBjbGFzc107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQ2NDoKLSAgICBjYXNlIEdQQkRhdGFUeXBlVUludDY0OgotICAgICAgZXhwZWN0ZWRDbGFzcyA9IFtHUEJVSW50NjRBcnJheSBjbGFzc107Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRmxvYXQ6Ci0gICAgICBleHBlY3RlZENsYXNzID0gW0dQQkZsb2F0QXJyYXkgY2xhc3NdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZURvdWJsZToKLSAgICAgIGV4cGVjdGVkQ2xhc3MgPSBbR1BCRG91YmxlQXJyYXkgY2xhc3NdOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZU1lc3NhZ2U6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgZXhwZWN0ZWRDbGFzcyA9IFtOU011dGFibGVEaWN0aW9uYXJ5IGNsYXNzXTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgR1BCRGF0YVR5cGVFbnVtOgotICAgICAgZXhwZWN0ZWRDbGFzcyA9IFtHUEJCb29sQXJyYXkgY2xhc3NdOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgaWYgKGFycmF5ICYmICFbYXJyYXkgaXNLaW5kT2ZDbGFzczpleHBlY3RlZENsYXNzXSkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIiVALiVAOiBFeHBlY3RlZCAlQCBvYmplY3QsIGdvdCAlQC4iLAotICAgICAgICAgICAgICAgICAgICAgICBbc2VsZiBjbGFzc10sIGZpZWxkLm5hbWUsIGV4cGVjdGVkQ2xhc3MsIFthcnJheSBjbGFzc11dOwotICB9Ci0jZW5kaWYKLSAgR1BCU2V0T2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCwgYXJyYXkpOwotfQotCi0jaWYgREVCVUcKLXN0YXRpYyBOU1N0cmluZyAqVHlwZVRvU3RyKEdQQkRhdGFUeXBlIGRhdGFUeXBlKSB7Ci0gIHN3aXRjaCAoZGF0YVR5cGUpIHsKLSAgICBjYXNlIEdQQkRhdGFUeXBlQm9vbDoKLSAgICAgIHJldHVybiBAIkJvb2wiOwotICAgIGNhc2UgR1BCRGF0YVR5cGVTRml4ZWQzMjoKLSAgICBjYXNlIEdQQkRhdGFUeXBlSW50MzI6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVNJbnQzMjoKLSAgICAgIHJldHVybiBAIkludDMyIjsKLSAgICBjYXNlIEdQQkRhdGFUeXBlRml4ZWQzMjoKLSAgICBjYXNlIEdQQkRhdGFUeXBlVUludDMyOgotICAgICAgcmV0dXJuIEAiVUludDMyIjsKLSAgICBjYXNlIEdQQkRhdGFUeXBlU0ZpeGVkNjQ6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUludDY0OgotICAgIGNhc2UgR1BCRGF0YVR5cGVTSW50NjQ6Ci0gICAgICByZXR1cm4gQCJJbnQ2NCI7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUZpeGVkNjQ6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZVVJbnQ2NDoKLSAgICAgIHJldHVybiBAIlVJbnQ2NCI7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUZsb2F0OgotICAgICAgcmV0dXJuIEAiRmxvYXQiOwotICAgIGNhc2UgR1BCRGF0YVR5cGVEb3VibGU6Ci0gICAgICByZXR1cm4gQCJEb3VibGUiOwotICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczoKLSAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOgotICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDoKLSAgICAgIHJldHVybiBAIk9iamVjdCI7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUVudW06Ci0gICAgICByZXR1cm4gQCJCb29sIjsKLSAgfQotfQotI2VuZGlmCi0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotaWQgR1BCR2V0TWVzc2FnZU1hcEZpZWxkKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSNpZiBERUJVRwotICBpZiAoZmllbGQuZmllbGRUeXBlICE9IEdQQkZpZWxkVHlwZU1hcCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIiVALiVAIGlzIG5vdCBhIG1hcDw+IGZpZWxkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgZmllbGQubmFtZV07Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZChzZWxmLCBmaWVsZCk7Ci19Ci0KLS8vIE9ubHkgZXhpc3RzIGZvciBwdWJsaWMgYXBpLCBubyBjb3JlIGNvZGUgc2hvdWxkIHVzZSB0aGlzLgotdm9pZCBHUEJTZXRNZXNzYWdlTWFwRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkIGRpY3Rpb25hcnkpIHsKLSNpZiBERUJVRwotICBpZiAoZmllbGQuZmllbGRUeXBlICE9IEdQQkZpZWxkVHlwZU1hcCkgewotICAgIFtOU0V4Y2VwdGlvbiByYWlzZTpOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbgotICAgICAgICAgICAgICAgIGZvcm1hdDpAIiVALiVAIGlzIG5vdCBhIG1hcDw+IGZpZWxkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgZmllbGQubmFtZV07Ci0gIH0KLSAgaWYgKGRpY3Rpb25hcnkpIHsKLSAgICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICAgIEdQQkRhdGFUeXBlIHZhbHVlRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgICBOU1N0cmluZyAqa2V5U3RyID0gVHlwZVRvU3RyKGtleURhdGFUeXBlKTsKLSAgICBOU1N0cmluZyAqdmFsdWVTdHIgPSBUeXBlVG9TdHIodmFsdWVEYXRhVHlwZSk7Ci0gICAgaWYgKGtleURhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nKSB7Ci0gICAgICBrZXlTdHIgPSBAIlN0cmluZyI7Ci0gICAgfQotICAgIENsYXNzIGV4cGVjdGVkQ2xhc3MgPSBOaWw7Ci0gICAgaWYgKChrZXlEYXRhVHlwZSA9PSBHUEJEYXRhVHlwZVN0cmluZykgJiYKLSAgICAgICAgR1BCRGF0YVR5cGVJc09iamVjdCh2YWx1ZURhdGFUeXBlKSkgewotICAgICAgZXhwZWN0ZWRDbGFzcyA9IFtOU011dGFibGVEaWN0aW9uYXJ5IGNsYXNzXTsKLSAgICB9IGVsc2UgewotICAgICAgTlNTdHJpbmcgKmNsYXNzTmFtZSA9Ci0gICAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJHUEIlQCVARGljdGlvbmFyeSIsIGtleVN0ciwgdmFsdWVTdHJdOwotICAgICAgZXhwZWN0ZWRDbGFzcyA9IE5TQ2xhc3NGcm9tU3RyaW5nKGNsYXNzTmFtZSk7Ci0gICAgICBOU0NBc3NlcnQoZXhwZWN0ZWRDbGFzcywgQCJNaXNzaW5nIGEgY2xhc3MgKCVAKT8iLCBleHBlY3RlZENsYXNzKTsKLSAgICB9Ci0gICAgaWYgKCFbZGljdGlvbmFyeSBpc0tpbmRPZkNsYXNzOmV4cGVjdGVkQ2xhc3NdKSB7Ci0gICAgICBbTlNFeGNlcHRpb24gcmFpc2U6TlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24KLSAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIiVALiVAOiBFeHBlY3RlZCAlQCBvYmplY3QsIGdvdCAlQC4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIFtzZWxmIGNsYXNzXSwgZmllbGQubmFtZSwgZXhwZWN0ZWRDbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBbZGljdGlvbmFyeSBjbGFzc11dOwotICAgIH0KLSAgfQotI2VuZGlmCi0gIEdQQlNldE9iamVjdEl2YXJXaXRoRmllbGQoc2VsZiwgZmllbGQsIGRpY3Rpb25hcnkpOwotfQotCi0jcHJhZ21hIG1hcmsgLSBNaXNjIER5bmFtaWMgUnVudGltZSBVdGlscwotCi1jb25zdCBjaGFyICpHUEJNZXNzYWdlRW5jb2RpbmdGb3JTZWxlY3RvcihTRUwgc2VsZWN0b3IsIEJPT0wgaW5zdGFuY2VTZWwpIHsKLSAgUHJvdG9jb2wgKnByb3RvY29sID0KLSAgICAgIG9iamNfZ2V0UHJvdG9jb2woR1BCU3RyaW5naWZ5U3ltYm9sKEdQQk1lc3NhZ2VTaWduYXR1cmVQcm90b2NvbCkpOwotICBzdHJ1Y3Qgb2JqY19tZXRob2RfZGVzY3JpcHRpb24gZGVzY3JpcHRpb24gPQotICAgICAgcHJvdG9jb2xfZ2V0TWV0aG9kRGVzY3JpcHRpb24ocHJvdG9jb2wsIHNlbGVjdG9yLCBOTywgaW5zdGFuY2VTZWwpOwotICByZXR1cm4gZGVzY3JpcHRpb24udHlwZXM7Ci19Ci0KLSNwcmFnbWEgbWFyayAtIFRleHQgRm9ybWF0IFN1cHBvcnQKLQotc3RhdGljIHZvaWQgQXBwZW5kU3RyaW5nRXNjYXBlZChOU1N0cmluZyAqdG9QcmludCwgTlNNdXRhYmxlU3RyaW5nICpkZXN0U3RyKSB7Ci0gIFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlwiIl07Ci0gIE5TVUludGVnZXIgbGVuID0gW3RvUHJpbnQgbGVuZ3RoXTsKLSAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgbGVuOyArK2kpIHsKLSAgICB1bmljaGFyIGFDaGFyID0gW3RvUHJpbnQgY2hhcmFjdGVyQXRJbmRleDppXTsKLSAgICBzd2l0Y2ggKGFDaGFyKSB7Ci0gICAgICBjYXNlICdcbic6IFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlxcbiJdOyAgYnJlYWs7Ci0gICAgICBjYXNlICdccic6IFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlxcciJdOyAgYnJlYWs7Ci0gICAgICBjYXNlICdcdCc6IFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlxcdCJdOyAgYnJlYWs7Ci0gICAgICBjYXNlICdcIic6IFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlxcXCIiXTsgYnJlYWs7Ci0gICAgICBjYXNlICdcJyc6IFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlxcXCciXTsgYnJlYWs7Ci0gICAgICBjYXNlICdcXCc6IFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlxcXFwiXTsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBbZGVzdFN0ciBhcHBlbmRGb3JtYXQ6QCIlQyIsIGFDaGFyXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlwiIl07Ci19Ci0KLXN0YXRpYyB2b2lkIEFwcGVuZEJ1ZmZlckFzU3RyaW5nKE5TRGF0YSAqYnVmZmVyLCBOU011dGFibGVTdHJpbmcgKmRlc3RTdHIpIHsKLSAgY29uc3QgY2hhciAqc3JjID0gKGNvbnN0IGNoYXIgKilbYnVmZmVyIGJ5dGVzXTsKLSAgc2l6ZV90IHNyY0xlbiA9IFtidWZmZXIgbGVuZ3RoXTsKLSAgW2Rlc3RTdHIgYXBwZW5kU3RyaW5nOkAiXCIiXTsKLSAgZm9yIChjb25zdCBjaGFyICpzcmNFbmQgPSBzcmMgKyBzcmNMZW47IHNyYyA8IHNyY0VuZDsgc3JjKyspIHsKLSAgICBzd2l0Y2ggKCpzcmMpIHsKLSAgICAgIGNhc2UgJ1xuJzogW2Rlc3RTdHIgYXBwZW5kU3RyaW5nOkAiXFxuIl07ICBicmVhazsKLSAgICAgIGNhc2UgJ1xyJzogW2Rlc3RTdHIgYXBwZW5kU3RyaW5nOkAiXFxyIl07ICBicmVhazsKLSAgICAgIGNhc2UgJ1x0JzogW2Rlc3RTdHIgYXBwZW5kU3RyaW5nOkAiXFx0Il07ICBicmVhazsKLSAgICAgIGNhc2UgJ1wiJzogW2Rlc3RTdHIgYXBwZW5kU3RyaW5nOkAiXFxcIiJdOyBicmVhazsKLSAgICAgIGNhc2UgJ1wnJzogW2Rlc3RTdHIgYXBwZW5kU3RyaW5nOkAiXFxcJyJdOyBicmVhazsKLSAgICAgIGNhc2UgJ1xcJzogW2Rlc3RTdHIgYXBwZW5kU3RyaW5nOkAiXFxcXCJdOyBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmIChpc3ByaW50KCpzcmMpKSB7Ci0gICAgICAgICAgW2Rlc3RTdHIgYXBwZW5kRm9ybWF0OkAiJWMiLCAqc3JjXTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBOT1RFOiBkb2luZyBoZXggbWVhbnMgeW91IGhhdmUgdG8gd29ycnkgYWJvdXQgdGhlIGxldHRlciBhZnRlcgotICAgICAgICAgIC8vIHRoZSBoZXggYmVpbmcgYW5vdGhlciBoZXggY2hhciBhbmQgZm9yY2luZyB0aGF0IHRvIGJlIGVzY2FwZWQsIHNvCi0gICAgICAgICAgLy8gdXNlIG9jdGFsIHRvIGtlZXAgaXQgc2ltcGxlLgotICAgICAgICAgIFtkZXN0U3RyIGFwcGVuZEZvcm1hdDpAIlxcJTAzbyIsICh1aW50OF90KSgqc3JjKV07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIFtkZXN0U3RyIGFwcGVuZFN0cmluZzpAIlwiIl07Ci19Ci0KLXN0YXRpYyB2b2lkIEFwcGVuZFRleHRGb3JtYXRGb3JNYXBNZXNzYWdlRmllbGQoCi0gICAgaWQgbWFwLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBOU011dGFibGVTdHJpbmcgKnRvU3RyLAotICAgIE5TU3RyaW5nICpsaW5lSW5kZW50LCBOU1N0cmluZyAqZmllbGROYW1lLCBOU1N0cmluZyAqbGluZUVuZGluZykgewotICBHUEJEYXRhVHlwZSBrZXlEYXRhVHlwZSA9IGZpZWxkLm1hcEtleURhdGFUeXBlOwotICBHUEJEYXRhVHlwZSB2YWx1ZURhdGFUeXBlID0gR1BCR2V0RmllbGREYXRhVHlwZShmaWVsZCk7Ci0gIEJPT0wgaXNNZXNzYWdlVmFsdWUgPSBHUEJEYXRhVHlwZUlzTWVzc2FnZSh2YWx1ZURhdGFUeXBlKTsKLQotICBOU1N0cmluZyAqbXNnU3RhcnRGaXJzdCA9Ci0gICAgICBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVAJUAgeyVAXG4iLCBsaW5lSW5kZW50LCBmaWVsZE5hbWUsIGxpbmVFbmRpbmddOwotICBOU1N0cmluZyAqbXNnU3RhcnQgPQotICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlQCVAIHtcbiIsIGxpbmVJbmRlbnQsIGZpZWxkTmFtZV07Ci0gIE5TU3RyaW5nICptc2dFbmQgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVAfVxuIiwgbGluZUluZGVudF07Ci0KLSAgTlNTdHJpbmcgKmtleUxpbmUgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiVAICBrZXk6ICIsIGxpbmVJbmRlbnRdOwotICBOU1N0cmluZyAqdmFsdWVMaW5lID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIlQCAgdmFsdWUlcyAiLCBsaW5lSW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGlzTWVzc2FnZVZhbHVlID8gIiIgOiAiOiIpXTsKLQotICBfX2Jsb2NrIEJPT0wgaXNGaXJzdCA9IFlFUzsKLQotICBpZiAoKGtleURhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nKSAmJgotICAgICAgR1BCRGF0YVR5cGVJc09iamVjdCh2YWx1ZURhdGFUeXBlKSkgewotICAgIC8vIG1hcCBpcyBhbiBOU0RpY3Rpb25hcnkuCi0gICAgTlNEaWN0aW9uYXJ5ICpkaWN0ID0gbWFwOwotICAgIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKE5TU3RyaW5nICprZXksIGlkIHZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgICAjcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgW3RvU3RyIGFwcGVuZFN0cmluZzooaXNGaXJzdCA/IG1zZ1N0YXJ0Rmlyc3QgOiBtc2dTdGFydCldOwotICAgICAgaXNGaXJzdCA9IE5POwotCi0gICAgICBbdG9TdHIgYXBwZW5kU3RyaW5nOmtleUxpbmVdOwotICAgICAgQXBwZW5kU3RyaW5nRXNjYXBlZChrZXksIHRvU3RyKTsKLSAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6QCJcbiJdOwotCi0gICAgICBbdG9TdHIgYXBwZW5kU3RyaW5nOnZhbHVlTGluZV07Ci0gICAgICBzd2l0Y2ggKHZhbHVlRGF0YVR5cGUpIHsKLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZVN0cmluZzoKLSAgICAgICAgICBBcHBlbmRTdHJpbmdFc2NhcGVkKHZhbHVlLCB0b1N0cik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgICAgICAgIEFwcGVuZEJ1ZmZlckFzU3RyaW5nKHZhbHVlLCB0b1N0cik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZU1lc3NhZ2U6Ci0gICAgICAgICAgW3RvU3RyIGFwcGVuZFN0cmluZzpAIntcbiJdOwotICAgICAgICAgIE5TU3RyaW5nICpzdWJJbmRlbnQgPSBbbGluZUluZGVudCBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzpAIiAgICAiXTsKLSAgICAgICAgICBBcHBlbmRUZXh0Rm9ybWF0Rm9yTWVzc2FnZSh2YWx1ZSwgdG9TdHIsIHN1YkluZGVudCk7Ci0gICAgICAgICAgW3RvU3RyIGFwcGVuZEZvcm1hdDpAIiVAICB9IiwgbGluZUluZGVudF07Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBOU0NBc3NlcnQoTk8sIEAiQ2FuJ3QgaGFwcGVuIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBbdG9TdHIgYXBwZW5kU3RyaW5nOkAiXG4iXTsKLQotICAgICAgW3RvU3RyIGFwcGVuZFN0cmluZzptc2dFbmRdOwotICAgIH1dOwotICB9IGVsc2UgewotICAgIC8vIG1hcCBpcyBvbmUgb2YgdGhlIEdQQipEaWN0aW9uYXJ5IGNsYXNzZXMsIHR5cGUgZG9lc24ndCBtYXR0ZXIuCi0gICAgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBtYXA7Ci0gICAgW2RpY3QgZW51bWVyYXRlRm9yVGV4dEZvcm1hdDpeKGlkIGtleU9iaiwgaWQgdmFsdWVPYmopIHsKLSAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6KGlzRmlyc3QgPyBtc2dTdGFydEZpcnN0IDogbXNnU3RhcnQpXTsKLSAgICAgIGlzRmlyc3QgPSBOTzsKLQotICAgICAgLy8gS2V5IGFsd2F5cyBpcyBhIE5TU3RyaW5nLgotICAgICAgaWYgKGtleURhdGFUeXBlID09IEdQQkRhdGFUeXBlU3RyaW5nKSB7Ci0gICAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6a2V5TGluZV07Ci0gICAgICAgIEFwcGVuZFN0cmluZ0VzY2FwZWQoa2V5T2JqLCB0b1N0cik7Ci0gICAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6QCJcbiJdOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgW3RvU3RyIGFwcGVuZEZvcm1hdDpAIiVAJUBcbiIsIGtleUxpbmUsIGtleU9ial07Ci0gICAgICB9Ci0KLSAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6dmFsdWVMaW5lXTsKLSAgICAgIHN3aXRjaCAodmFsdWVEYXRhVHlwZSkgewotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOgotICAgICAgICAgIEFwcGVuZFN0cmluZ0VzY2FwZWQodmFsdWVPYmosIHRvU3RyKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQnl0ZXM6Ci0gICAgICAgICAgQXBwZW5kQnVmZmVyQXNTdHJpbmcodmFsdWVPYmosIHRvU3RyKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZToKLSAgICAgICAgICBbdG9TdHIgYXBwZW5kU3RyaW5nOkAie1xuIl07Ci0gICAgICAgICAgTlNTdHJpbmcgKnN1YkluZGVudCA9IFtsaW5lSW5kZW50IHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOkAiICAgICJdOwotICAgICAgICAgIEFwcGVuZFRleHRGb3JtYXRGb3JNZXNzYWdlKHZhbHVlT2JqLCB0b1N0ciwgc3ViSW5kZW50KTsKLSAgICAgICAgICBbdG9TdHIgYXBwZW5kRm9ybWF0OkAiJUAgIH0iLCBsaW5lSW5kZW50XTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlRW51bTogewotICAgICAgICAgIGludDMyX3QgZW51bVZhbHVlID0gW3ZhbHVlT2JqIGludFZhbHVlXTsKLSAgICAgICAgICBOU1N0cmluZyAqdmFsdWVTdHIgPSBuaWw7Ci0gICAgICAgICAgR1BCRW51bURlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBmaWVsZC5lbnVtRGVzY3JpcHRvcjsKLSAgICAgICAgICBpZiAoZGVzY3JpcHRvcikgewotICAgICAgICAgICAgdmFsdWVTdHIgPSBbZGVzY3JpcHRvciB0ZXh0Rm9ybWF0TmFtZUZvclZhbHVlOmVudW1WYWx1ZV07Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmICh2YWx1ZVN0cikgewotICAgICAgICAgICAgW3RvU3RyIGFwcGVuZFN0cmluZzp2YWx1ZVN0cl07Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCIlZCIsIGVudW1WYWx1ZV07Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBOU0NBc3NlcnQodmFsdWVEYXRhVHlwZSAhPSBHUEJEYXRhVHlwZUdyb3VwLCBAIkNhbid0IGhhcHBlbiIpOwotICAgICAgICAgIC8vIEV2ZXJ5dGhpbmcgZWxzZSBpcyBhIE5TU3RyaW5nLgotICAgICAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6dmFsdWVPYmpdOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgW3RvU3RyIGFwcGVuZFN0cmluZzpAIlxuIl07Ci0KLSAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6bXNnRW5kXTsKLSAgICB9XTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBBcHBlbmRUZXh0Rm9ybWF0Rm9yTWVzc2FnZUZpZWxkKEdQQk1lc3NhZ2UgKm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TTXV0YWJsZVN0cmluZyAqdG9TdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nICpsaW5lSW5kZW50KSB7Ci0gIGlkIGFycmF5T3JNYXA7Ci0gIE5TVUludGVnZXIgY291bnQ7Ci0gIEdQQkZpZWxkVHlwZSBmaWVsZFR5cGUgPSBmaWVsZC5maWVsZFR5cGU7Ci0gIHN3aXRjaCAoZmllbGRUeXBlKSB7Ci0gICAgY2FzZSBHUEJGaWVsZFR5cGVTaW5nbGU6Ci0gICAgICBhcnJheU9yTWFwID0gbmlsOwotICAgICAgY291bnQgPSAoR1BCR2V0SGFzSXZhckZpZWxkKG1lc3NhZ2UsIGZpZWxkKSA/IDEgOiAwKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHUEJGaWVsZFR5cGVSZXBlYXRlZDoKLSAgICAgIC8vIFdpbGwgYmUgTlNBcnJheSBvciBHUEIqQXJyYXksIHR5cGUgZG9lc24ndCBtYXR0ZXIsIHRoZXkgYm90aAotICAgICAgLy8gaW1wbGVtZW50IGNvdW50LgotICAgICAgYXJyYXlPck1hcCA9IEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGROb0F1dG9jcmVhdGUobWVzc2FnZSwgZmllbGQpOwotICAgICAgY291bnQgPSBbKE5TQXJyYXkgKilhcnJheU9yTWFwIGNvdW50XTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBHUEJGaWVsZFR5cGVNYXA6IHsKLSAgICAgIC8vIFdpbGwgYmUgR1BCKkRpY3Rpb25hcnkgb3IgTlNNdXRhYmxlRGljdGlvbmFyeSwgdHlwZSBkb2Vzbid0IG1hdHRlciwKLSAgICAgIC8vIHRoZXkgYm90aCBpbXBsZW1lbnQgY291bnQuCi0gICAgICBhcnJheU9yTWFwID0gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZShtZXNzYWdlLCBmaWVsZCk7Ci0gICAgICBjb3VudCA9IFsoTlNEaWN0aW9uYXJ5ICopYXJyYXlPck1hcCBjb3VudF07Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAoY291bnQgPT0gMCkgewotICAgIC8vIE5vdGhpbmcgdG8gcHJpbnQsIG91dCBvZiBoZXJlLgotICAgIHJldHVybjsKLSAgfQotCi0gIE5TU3RyaW5nICpsaW5lRW5kaW5nID0gQCIiOwotCi0gIC8vIElmIHRoZSBuYW1lIGNhbid0IGJlIHJldmVyc2VkIG9yIHN1cHBvcnQgZm9yIGV4dHJhIGluZm8gd2FzIHR1cm5lZCBvZmYsCi0gIC8vIHRoaXMgY2FuIHJldHVybiBuaWwuCi0gIE5TU3RyaW5nICpmaWVsZE5hbWUgPSBbZmllbGQgdGV4dEZvcm1hdE5hbWVdOwotICBpZiAoW2ZpZWxkTmFtZSBsZW5ndGhdID09IDApIHsKLSAgICBmaWVsZE5hbWUgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiV1IiwgR1BCRmllbGROdW1iZXIoZmllbGQpXTsKLSAgICAvLyBJZiB0aGVyZSBpcyBvbmx5IG9uZSBlbnRyeSwgcHV0IHRoZSBvYmpjIG5hbWUgYXMgYSBjb21tZW50LCBvdGhlciB3aXNlCi0gICAgLy8gYWRkIGl0IGJlZm9yZSB0aGUgcmVwZWF0ZWQgdmFsdWVzLgotICAgIGlmIChjb3VudCA+IDEpIHsKLSAgICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCIlQCMgJUBcbiIsIGxpbmVJbmRlbnQsIGZpZWxkLm5hbWVdOwotICAgIH0gZWxzZSB7Ci0gICAgICBsaW5lRW5kaW5nID0gW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCIgICMgJUAiLCBmaWVsZC5uYW1lXTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmllbGRUeXBlID09IEdQQkZpZWxkVHlwZU1hcCkgewotICAgIEFwcGVuZFRleHRGb3JtYXRGb3JNYXBNZXNzYWdlRmllbGQoYXJyYXlPck1hcCwgZmllbGQsIHRvU3RyLCBsaW5lSW5kZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGROYW1lLCBsaW5lRW5kaW5nKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZCBhcnJheSA9IGFycmF5T3JNYXA7Ci0gIGNvbnN0IEJPT0wgaXNSZXBlYXRlZCA9IChhcnJheSAhPSBuaWwpOwotCi0gIEdQQkRhdGFUeXBlIGZpZWxkRGF0YVR5cGUgPSBHUEJHZXRGaWVsZERhdGFUeXBlKGZpZWxkKTsKLSAgQk9PTCBpc01lc3NhZ2VGaWVsZCA9IEdQQkRhdGFUeXBlSXNNZXNzYWdlKGZpZWxkRGF0YVR5cGUpOwotICBmb3IgKE5TVUludGVnZXIgaiA9IDA7IGogPCBjb3VudDsgKytqKSB7Ci0gICAgLy8gU3RhcnQgdGhlIGxpbmUuCi0gICAgW3RvU3RyIGFwcGVuZEZvcm1hdDpAIiVAJUAlcyAiLCBsaW5lSW5kZW50LCBmaWVsZE5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAoaXNNZXNzYWdlRmllbGQgPyAiIiA6ICI6IildOwotCi0gICAgLy8gVGhlIHZhbHVlLgotICAgIHN3aXRjaCAoZmllbGREYXRhVHlwZSkgewotI2RlZmluZSBGSUVMRF9DQVNFKEdQQkRBVEFUWVBFLCBDVFlQRSwgUkVBTF9UWVBFLCAuLi4pICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjYXNlIEdQQkRhdGFUeXBlIyNHUEJEQVRBVFlQRTogeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENUWVBFIHYgPSAoaXNSZXBlYXRlZCA/IFsoR1BCIyNSRUFMX1RZUEUjI0FycmF5ICopYXJyYXkgdmFsdWVBdEluZGV4OmpdICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdQQkdldE1lc3NhZ2UjI1JFQUxfVFlQRSMjRmllbGQobWVzc2FnZSwgZmllbGQpKTsgXAotICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6X19WQV9BUkdTX18sIHZdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgICAgIEZJRUxEX0NBU0UoSW50MzIsIGludDMyX3QsIEludDMyLCBAIiVkIikKLSAgICAgIEZJRUxEX0NBU0UoU0ludDMyLCBpbnQzMl90LCBJbnQzMiwgQCIlZCIpCi0gICAgICBGSUVMRF9DQVNFKFNGaXhlZDMyLCBpbnQzMl90LCBJbnQzMiwgQCIlZCIpCi0gICAgICBGSUVMRF9DQVNFKFVJbnQzMiwgdWludDMyX3QsIFVJbnQzMiwgQCIldSIpCi0gICAgICBGSUVMRF9DQVNFKEZpeGVkMzIsIHVpbnQzMl90LCBVSW50MzIsIEAiJXUiKQotICAgICAgRklFTERfQ0FTRShJbnQ2NCwgaW50NjRfdCwgSW50NjQsIEAiJWxsZCIpCi0gICAgICBGSUVMRF9DQVNFKFNJbnQ2NCwgaW50NjRfdCwgSW50NjQsIEAiJWxsZCIpCi0gICAgICBGSUVMRF9DQVNFKFNGaXhlZDY0LCBpbnQ2NF90LCBJbnQ2NCwgQCIlbGxkIikKLSAgICAgIEZJRUxEX0NBU0UoVUludDY0LCB1aW50NjRfdCwgVUludDY0LCBAIiVsbHUiKQotICAgICAgRklFTERfQ0FTRShGaXhlZDY0LCB1aW50NjRfdCwgVUludDY0LCBAIiVsbHUiKQotICAgICAgRklFTERfQ0FTRShGbG9hdCwgZmxvYXQsIEZsb2F0LCBAIiUuKmciLCBGTFRfRElHKQotICAgICAgRklFTERfQ0FTRShEb3VibGUsIGRvdWJsZSwgRG91YmxlLCBAIiUuKmxnIiwgREJMX0RJRykKLQotI3VuZGVmIEZJRUxEX0NBU0UKLQotICAgICAgY2FzZSBHUEJEYXRhVHlwZUVudW06IHsKLSAgICAgICAgaW50MzJfdCB2ID0gKGlzUmVwZWF0ZWQgPyBbKEdQQkVudW1BcnJheSAqKWFycmF5IHJhd1ZhbHVlQXRJbmRleDpqXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKG1lc3NhZ2UsIGZpZWxkKSk7Ci0gICAgICAgIE5TU3RyaW5nICp2YWx1ZVN0ciA9IG5pbDsKLSAgICAgICAgR1BCRW51bURlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBmaWVsZC5lbnVtRGVzY3JpcHRvcjsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IpIHsKLSAgICAgICAgICB2YWx1ZVN0ciA9IFtkZXNjcmlwdG9yIHRleHRGb3JtYXROYW1lRm9yVmFsdWU6dl07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHZhbHVlU3RyKSB7Ci0gICAgICAgICAgW3RvU3RyIGFwcGVuZFN0cmluZzp2YWx1ZVN0cl07Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgW3RvU3RyIGFwcGVuZEZvcm1hdDpAIiVkIiwgdl07Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgR1BCRGF0YVR5cGVCb29sOiB7Ci0gICAgICAgIEJPT0wgdiA9IChpc1JlcGVhdGVkID8gWyhHUEJCb29sQXJyYXkgKilhcnJheSB2YWx1ZUF0SW5kZXg6al0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHUEJHZXRNZXNzYWdlQm9vbEZpZWxkKG1lc3NhZ2UsIGZpZWxkKSk7Ci0gICAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6KHYgPyBAInRydWUiIDogQCJmYWxzZSIpXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6IHsKLSAgICAgICAgTlNTdHJpbmcgKnYgPSAoaXNSZXBlYXRlZCA/IFsoTlNBcnJheSAqKWFycmF5IG9iamVjdEF0SW5kZXg6al0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEdQQkdldE1lc3NhZ2VTdHJpbmdGaWVsZChtZXNzYWdlLCBmaWVsZCkpOwotICAgICAgICBBcHBlbmRTdHJpbmdFc2NhcGVkKHYsIHRvU3RyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgR1BCRGF0YVR5cGVCeXRlczogewotICAgICAgICBOU0RhdGEgKnYgPSAoaXNSZXBlYXRlZCA/IFsoTlNBcnJheSAqKWFycmF5IG9iamVjdEF0SW5kZXg6al0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBHUEJHZXRNZXNzYWdlQnl0ZXNGaWVsZChtZXNzYWdlLCBmaWVsZCkpOwotICAgICAgICBBcHBlbmRCdWZmZXJBc1N0cmluZyh2LCB0b1N0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEdQQkRhdGFUeXBlR3JvdXA6Ci0gICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZTogewotICAgICAgICBHUEJNZXNzYWdlICp2ID0KLSAgICAgICAgICAgIChpc1JlcGVhdGVkID8gWyhOU0FycmF5ICopYXJyYXkgb2JqZWN0QXRJbmRleDpqXQotICAgICAgICAgICAgICAgICAgICAgICAgOiBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkKG1lc3NhZ2UsIGZpZWxkKSk7Ci0gICAgICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCJ7JUBcbiIsIGxpbmVFbmRpbmddOwotICAgICAgICBOU1N0cmluZyAqc3ViSW5kZW50ID0gW2xpbmVJbmRlbnQgc3RyaW5nQnlBcHBlbmRpbmdTdHJpbmc6QCIgICJdOwotICAgICAgICBBcHBlbmRUZXh0Rm9ybWF0Rm9yTWVzc2FnZSh2LCB0b1N0ciwgc3ViSW5kZW50KTsKLSAgICAgICAgW3RvU3RyIGFwcGVuZEZvcm1hdDpAIiVAfSIsIGxpbmVJbmRlbnRdOwotICAgICAgICBsaW5lRW5kaW5nID0gQCIiOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgIH0gIC8vIHN3aXRjaChmaWVsZERhdGFUeXBlKQotCi0gICAgLy8gRW5kIHRoZSBsaW5lLgotICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCIlQFxuIiwgbGluZUVuZGluZ107Ci0KLSAgfSAgLy8gZm9yKGNvdW50KQotfQotCi1zdGF0aWMgdm9pZCBBcHBlbmRUZXh0Rm9ybWF0Rm9yTWVzc2FnZUV4dGVuc2lvblJhbmdlKEdQQk1lc3NhZ2UgKm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TQXJyYXkgKmFjdGl2ZUV4dGVuc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkV4dGVuc2lvblJhbmdlIHJhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU011dGFibGVTdHJpbmcgKnRvU3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1N0cmluZyAqbGluZUluZGVudCkgewotICB1aW50MzJfdCBzdGFydCA9IHJhbmdlLnN0YXJ0OwotICB1aW50MzJfdCBlbmQgPSByYW5nZS5lbmQ7Ci0gIGZvciAoR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqZXh0ZW5zaW9uIGluIGFjdGl2ZUV4dGVuc2lvbnMpIHsKLSAgICB1aW50MzJfdCBmaWVsZE51bWJlciA9IGV4dGVuc2lvbi5maWVsZE51bWJlcjsKLSAgICBpZiAoZmllbGROdW1iZXIgPCBzdGFydCkgewotICAgICAgLy8gTm90IHRoZXJlIHlldC4KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoZmllbGROdW1iZXIgPiBlbmQpIHsKLSAgICAgIC8vIERvbmUuCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpZCByYXdFeHRWYWx1ZSA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpleHRlbnNpb25dOwotICAgIEJPT0wgaXNSZXBlYXRlZCA9IGV4dGVuc2lvbi5pc1JlcGVhdGVkOwotCi0gICAgTlNVSW50ZWdlciBudW1WYWx1ZXMgPSAxOwotICAgIE5TU3RyaW5nICpsaW5lRW5kaW5nID0gQCIiOwotICAgIGlmIChpc1JlcGVhdGVkKSB7Ci0gICAgICBudW1WYWx1ZXMgPSBbKE5TQXJyYXkgKilyYXdFeHRWYWx1ZSBjb3VudF07Ci0gICAgfQotCi0gICAgTlNTdHJpbmcgKnNpbmdsZXRvbk5hbWUgPSBleHRlbnNpb24uc2luZ2xldG9uTmFtZTsKLSAgICBpZiAobnVtVmFsdWVzID09IDEpIHsKLSAgICAgIGxpbmVFbmRpbmcgPSBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAIiAgIyBbJUBdIiwgc2luZ2xldG9uTmFtZV07Ci0gICAgfSBlbHNlIHsKLSAgICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCIlQCMgWyVAXVxuIiwgbGluZUluZGVudCwgc2luZ2xldG9uTmFtZV07Ci0gICAgfQotCi0gICAgR1BCRGF0YVR5cGUgZXh0RGF0YVR5cGUgPSBleHRlbnNpb24uZGF0YVR5cGU7Ci0gICAgZm9yIChOU1VJbnRlZ2VyIGogPSAwOyBqIDwgbnVtVmFsdWVzOyArK2opIHsKLSAgICAgIGlkIGN1clZhbHVlID0gKGlzUmVwZWF0ZWQgPyBbcmF3RXh0VmFsdWUgb2JqZWN0QXRJbmRleDpqXSA6IHJhd0V4dFZhbHVlKTsKLQotICAgICAgLy8gU3RhcnQgdGhlIGxpbmUuCi0gICAgICBbdG9TdHIgYXBwZW5kRm9ybWF0OkAiJUAldSVzICIsIGxpbmVJbmRlbnQsIGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAoR1BCRGF0YVR5cGVJc01lc3NhZ2UoZXh0RGF0YVR5cGUpID8gIiIgOiAiOiIpXTsKLQotICAgICAgLy8gVGhlIHZhbHVlLgotICAgICAgc3dpdGNoIChleHREYXRhVHlwZSkgewotI2RlZmluZSBGSUVMRF9DQVNFKEdQQkRBVEFUWVBFLCBDVFlQRSwgTlVNU0VMRUNUT1IsIC4uLikgXAotICBjYXNlIEdQQkRhdGFUeXBlIyNHUEJEQVRBVFlQRTogeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENUWVBFIHYgPSBbKE5TTnVtYmVyICopY3VyVmFsdWUgTlVNU0VMRUNUT1JdOyAgICAgICAgXAotICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6X19WQV9BUkdTX18sIHZdOyAgICAgICAgICAgICAgICAgXAotICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgICAgICAgRklFTERfQ0FTRShJbnQzMiwgaW50MzJfdCwgaW50VmFsdWUsIEAiJWQiKQotICAgICAgICBGSUVMRF9DQVNFKFNJbnQzMiwgaW50MzJfdCwgaW50VmFsdWUsIEAiJWQiKQotICAgICAgICBGSUVMRF9DQVNFKFNGaXhlZDMyLCBpbnQzMl90LCB1bnNpZ25lZEludFZhbHVlLCBAIiVkIikKLSAgICAgICAgRklFTERfQ0FTRShVSW50MzIsIHVpbnQzMl90LCB1bnNpZ25lZEludFZhbHVlLCBAIiV1IikKLSAgICAgICAgRklFTERfQ0FTRShGaXhlZDMyLCB1aW50MzJfdCwgdW5zaWduZWRJbnRWYWx1ZSwgQCIldSIpCi0gICAgICAgIEZJRUxEX0NBU0UoSW50NjQsIGludDY0X3QsIGxvbmdMb25nVmFsdWUsIEAiJWxsZCIpCi0gICAgICAgIEZJRUxEX0NBU0UoU0ludDY0LCBpbnQ2NF90LCBsb25nTG9uZ1ZhbHVlLCBAIiVsbGQiKQotICAgICAgICBGSUVMRF9DQVNFKFNGaXhlZDY0LCBpbnQ2NF90LCBsb25nTG9uZ1ZhbHVlLCBAIiVsbGQiKQotICAgICAgICBGSUVMRF9DQVNFKFVJbnQ2NCwgdWludDY0X3QsIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZSwgQCIlbGx1IikKLSAgICAgICAgRklFTERfQ0FTRShGaXhlZDY0LCB1aW50NjRfdCwgdW5zaWduZWRMb25nTG9uZ1ZhbHVlLCBAIiVsbHUiKQotICAgICAgICBGSUVMRF9DQVNFKEZsb2F0LCBmbG9hdCwgZmxvYXRWYWx1ZSwgQCIlLipnIiwgRkxUX0RJRykKLSAgICAgICAgRklFTERfQ0FTRShEb3VibGUsIGRvdWJsZSwgZG91YmxlVmFsdWUsIEAiJS4qbGciLCBEQkxfRElHKQotICAgICAgICAvLyBUT0RPOiBBZGQgYSBjb21tZW50IHdpdGggdGhlIGVudW0gbmFtZSBmcm9tIGVudW0gZGVzY3JpcHRvcnMKLSAgICAgICAgLy8gKG1pZ2h0IG5vdCBiZSByZWFsIHZhbHVlLCBzbyBsZWF2ZSBpdCBhcyBhIGNvbW1lbnQsIE9iakMgY29tcGlsZXIKLSAgICAgICAgLy8gbmFtZSBtYW5nbGVzIGRpZmZlcmVudGx5KS4gIERvZXNuJ3QgbG9vayBsaWtlIHdlIGFjdHVhbGx5IGdlbmVyYXRlCi0gICAgICAgIC8vIGFuIGVudW0gZGVzY3JpcHRvciByZWZlcmVuY2UgbGlrZSB3ZSBkbyBmb3Igbm9ybWFsIGZpZWxkcywgc28gdGhpcwotICAgICAgICAvLyB3aWxsIHRha2UgYSBjb21waWxlciBjaGFuZ2UuCi0gICAgICAgIEZJRUxEX0NBU0UoRW51bSwgaW50MzJfdCwgaW50VmFsdWUsIEAiJWQiKQotCi0jdW5kZWYgRklFTERfQ0FTRQotCi0gICAgICAgIGNhc2UgR1BCRGF0YVR5cGVCb29sOgotICAgICAgICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6KFsoTlNOdW1iZXIgKiljdXJWYWx1ZSBib29sVmFsdWVdID8gQCJ0cnVlIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogQCJmYWxzZSIpXTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlU3RyaW5nOgotICAgICAgICAgIEFwcGVuZFN0cmluZ0VzY2FwZWQoY3VyVmFsdWUsIHRvU3RyKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlQnl0ZXM6Ci0gICAgICAgICAgQXBwZW5kQnVmZmVyQXNTdHJpbmcoKE5TRGF0YSAqKWN1clZhbHVlLCB0b1N0cik7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgICBjYXNlIEdQQkRhdGFUeXBlTWVzc2FnZTogewotICAgICAgICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCJ7JUBcbiIsIGxpbmVFbmRpbmddOwotICAgICAgICAgIE5TU3RyaW5nICpzdWJJbmRlbnQgPSBbbGluZUluZGVudCBzdHJpbmdCeUFwcGVuZGluZ1N0cmluZzpAIiAgIl07Ci0gICAgICAgICAgQXBwZW5kVGV4dEZvcm1hdEZvck1lc3NhZ2UoY3VyVmFsdWUsIHRvU3RyLCBzdWJJbmRlbnQpOwotICAgICAgICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCIlQH0iLCBsaW5lSW5kZW50XTsKLSAgICAgICAgICBsaW5lRW5kaW5nID0gQCIiOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgIH0gIC8vIHN3aXRjaChleHREYXRhVHlwZSkKLQotICAgIH0gIC8vICBmb3IobnVtVmFsdWVzKQotCi0gICAgLy8gRW5kIHRoZSBsaW5lLgotICAgIFt0b1N0ciBhcHBlbmRGb3JtYXQ6QCIlQFxuIiwgbGluZUVuZGluZ107Ci0KLSAgfSAgLy8gZm9yLi5pbihhY3RpdmVFeHRlbnNpb25zKQotfQotCi1zdGF0aWMgdm9pZCBBcHBlbmRUZXh0Rm9ybWF0Rm9yTWVzc2FnZShHUEJNZXNzYWdlICptZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNNdXRhYmxlU3RyaW5nICp0b1N0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nICpsaW5lSW5kZW50KSB7Ci0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbbWVzc2FnZSBkZXNjcmlwdG9yXTsKLSAgTlNBcnJheSAqZmllbGRzQXJyYXkgPSBkZXNjcmlwdG9yLT5maWVsZHNfOwotICBOU1VJbnRlZ2VyIGZpZWxkQ291bnQgPSBmaWVsZHNBcnJheS5jb3VudDsKLSAgY29uc3QgR1BCRXh0ZW5zaW9uUmFuZ2UgKmV4dGVuc2lvblJhbmdlcyA9IGRlc2NyaXB0b3IuZXh0ZW5zaW9uUmFuZ2VzOwotICBOU1VJbnRlZ2VyIGV4dGVuc2lvblJhbmdlc0NvdW50ID0gZGVzY3JpcHRvci5leHRlbnNpb25SYW5nZXNDb3VudDsKLSAgTlNBcnJheSAqYWN0aXZlRXh0ZW5zaW9ucyA9IFttZXNzYWdlIHNvcnRlZEV4dGVuc2lvbnNJblVzZV07Ci0gIGZvciAoTlNVSW50ZWdlciBpID0gMCwgaiA9IDA7IGkgPCBmaWVsZENvdW50IHx8IGogPCBleHRlbnNpb25SYW5nZXNDb3VudDspIHsKLSAgICBpZiAoaSA9PSBmaWVsZENvdW50KSB7Ci0gICAgICBBcHBlbmRUZXh0Rm9ybWF0Rm9yTWVzc2FnZUV4dGVuc2lvblJhbmdlKAotICAgICAgICAgIG1lc3NhZ2UsIGFjdGl2ZUV4dGVuc2lvbnMsIGV4dGVuc2lvblJhbmdlc1tqKytdLCB0b1N0ciwgbGluZUluZGVudCk7Ci0gICAgfSBlbHNlIGlmIChqID09IGV4dGVuc2lvblJhbmdlc0NvdW50IHx8Ci0gICAgICAgICAgICAgICBHUEJGaWVsZE51bWJlcihmaWVsZHNBcnJheVtpXSkgPCBleHRlbnNpb25SYW5nZXNbal0uc3RhcnQpIHsKLSAgICAgIEFwcGVuZFRleHRGb3JtYXRGb3JNZXNzYWdlRmllbGQobWVzc2FnZSwgZmllbGRzQXJyYXlbaSsrXSwgdG9TdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbmVJbmRlbnQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBcHBlbmRUZXh0Rm9ybWF0Rm9yTWVzc2FnZUV4dGVuc2lvblJhbmdlKAotICAgICAgICAgIG1lc3NhZ2UsIGFjdGl2ZUV4dGVuc2lvbnMsIGV4dGVuc2lvblJhbmdlc1tqKytdLCB0b1N0ciwgbGluZUluZGVudCk7Ci0gICAgfQotICB9Ci0KLSAgTlNTdHJpbmcgKnVua25vd25GaWVsZHNTdHIgPQotICAgICAgR1BCVGV4dEZvcm1hdEZvclVua25vd25GaWVsZFNldChtZXNzYWdlLnVua25vd25GaWVsZHMsIGxpbmVJbmRlbnQpOwotICBpZiAoW3Vua25vd25GaWVsZHNTdHIgbGVuZ3RoXSA+IDApIHsKLSAgICBbdG9TdHIgYXBwZW5kRm9ybWF0OkAiJUAjIC0tLSBVbmtub3duIGZpZWxkcyAtLS1cbiIsIGxpbmVJbmRlbnRdOwotICAgIFt0b1N0ciBhcHBlbmRTdHJpbmc6dW5rbm93bkZpZWxkc1N0cl07Ci0gIH0KLX0KLQotTlNTdHJpbmcgKkdQQlRleHRGb3JtYXRGb3JNZXNzYWdlKEdQQk1lc3NhZ2UgKm1lc3NhZ2UsIE5TU3RyaW5nICpsaW5lSW5kZW50KSB7Ci0gIGlmIChtZXNzYWdlID09IG5pbCkgcmV0dXJuIEAiIjsKLSAgaWYgKGxpbmVJbmRlbnQgPT0gbmlsKSBsaW5lSW5kZW50ID0gQCIiOwotCi0gIE5TTXV0YWJsZVN0cmluZyAqYnVpbGRTdHJpbmcgPSBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ107Ci0gIEFwcGVuZFRleHRGb3JtYXRGb3JNZXNzYWdlKG1lc3NhZ2UsIGJ1aWxkU3RyaW5nLCBsaW5lSW5kZW50KTsKLSAgcmV0dXJuIGJ1aWxkU3RyaW5nOwotfQotCi1OU1N0cmluZyAqR1BCVGV4dEZvcm1hdEZvclVua25vd25GaWVsZFNldChHUEJVbmtub3duRmllbGRTZXQgKnVua25vd25TZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU1N0cmluZyAqbGluZUluZGVudCkgewotICBpZiAodW5rbm93blNldCA9PSBuaWwpIHJldHVybiBAIiI7Ci0gIGlmIChsaW5lSW5kZW50ID09IG5pbCkgbGluZUluZGVudCA9IEAiIjsKLQotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9IFtOU011dGFibGVTdHJpbmcgc3RyaW5nXTsKLSAgZm9yIChHUEJVbmtub3duRmllbGQgKmZpZWxkIGluIFt1bmtub3duU2V0IHNvcnRlZEZpZWxkc10pIHsKLSAgICBpbnQzMl90IGZpZWxkTnVtYmVyID0gW2ZpZWxkIG51bWJlcl07Ci0KLSNkZWZpbmUgUFJJTlRfTE9PUChQUk9QTkFNRSwgQ1RZUEUsIEZPUk1BVCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgW2ZpZWxkLlBST1BOQU1FICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKENUWVBFIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqIHN0b3ApIHsgIFwKLSAgICBfUHJhZ21hKCJ1bnVzZWQoaWR4LCBzdG9wKSIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBbcmVzdWx0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYXBwZW5kRm9ybWF0OkAiJUAlZDogIiAjRk9STUFUICJcbiIsIGxpbmVJbmRlbnQsIGZpZWxkTnVtYmVyLCB2YWx1ZV07IFwKLSAgICAgIH1dOwotCi0gICAgUFJJTlRfTE9PUCh2YXJpbnRMaXN0LCB1aW50NjRfdCwgJWxsdSk7Ci0gICAgUFJJTlRfTE9PUChmaXhlZDMyTGlzdCwgdWludDMyX3QsIDB4JVgpOwotICAgIFBSSU5UX0xPT1AoZml4ZWQ2NExpc3QsIHVpbnQ2NF90LCAweCVsbFgpOwotCi0jdW5kZWYgUFJJTlRfTE9PUAotCi0gICAgLy8gTk9URTogQysrIHZlcnNpb24gb2YgVGV4dEZvcm1hdCB0cmllcyB0byBwYXJzZSB0aGlzIGFzIGEgbWVzc2FnZQotICAgIC8vIGFuZCBwcmludCB0aGF0IGlmIGl0IHN1Y2NlZWRzLgotICAgIGZvciAoTlNEYXRhICpkYXRhIGluIGZpZWxkLmxlbmd0aERlbGltaXRlZExpc3QpIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJUAlZDogIiwgbGluZUluZGVudCwgZmllbGROdW1iZXJdOwotICAgICAgQXBwZW5kQnVmZmVyQXNTdHJpbmcoZGF0YSwgcmVzdWx0KTsKLSAgICAgIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiXG4iXTsKLSAgICB9Ci0KLSAgICBmb3IgKEdQQlVua25vd25GaWVsZFNldCAqc3ViVW5rbm93blNldCBpbiBmaWVsZC5ncm91cExpc3QpIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJUAlZDoge1xuIiwgbGluZUluZGVudCwgZmllbGROdW1iZXJdOwotICAgICAgTlNTdHJpbmcgKnN1YkluZGVudCA9IFtsaW5lSW5kZW50IHN0cmluZ0J5QXBwZW5kaW5nU3RyaW5nOkAiICAiXTsKLSAgICAgIE5TU3RyaW5nICpzdWJVbmtud29uU2V0U3RyID0KLSAgICAgICAgICBHUEJUZXh0Rm9ybWF0Rm9yVW5rbm93bkZpZWxkU2V0KHN1YlVua25vd25TZXQsIHN1YkluZGVudCk7Ci0gICAgICBbcmVzdWx0IGFwcGVuZFN0cmluZzpzdWJVbmtud29uU2V0U3RyXTsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJUB9XG4iLCBsaW5lSW5kZW50XTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gSGVscGVycyB0byBkZWNvZGUgYSB2YXJpbnQuIE5vdCB1c2luZyBHUEJDb2RlZElucHV0U3RyZWFtIHZlcnNpb24gYmVjYXVzZQotLy8gdGhhdCBuZWVkcyBhIHN0YXRlIG9iamVjdCwgYW5kIHdlIGRvbid0IHdhbnQgdG8gY3JlYXRlIGFuIGlucHV0IHN0cmVhbSBvdXQKLS8vIG9mIHRoZSBkYXRhLgotR1BCX0lOTElORSBpbnQ4X3QgUmVhZFJhd0J5dGVGcm9tRGF0YShjb25zdCB1aW50OF90ICoqZGF0YSkgewotICBpbnQ4X3QgcmVzdWx0ID0gKigoaW50OF90ICopKCpkYXRhKSk7Ci0gICsrKCpkYXRhKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGludDMyX3QgUmVhZFJhd1ZhcmludDMyRnJvbURhdGEoY29uc3QgdWludDhfdCAqKmRhdGEpIHsKLSAgaW50OF90IHRtcCA9IFJlYWRSYXdCeXRlRnJvbURhdGEoZGF0YSk7Ci0gIGlmICh0bXAgPj0gMCkgewotICAgIHJldHVybiB0bXA7Ci0gIH0KLSAgaW50MzJfdCByZXN1bHQgPSB0bXAgJiAweDdmOwotICBpZiAoKHRtcCA9IFJlYWRSYXdCeXRlRnJvbURhdGEoZGF0YSkpID49IDApIHsKLSAgICByZXN1bHQgfD0gdG1wIDw8IDc7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCA3OwotICAgIGlmICgodG1wID0gUmVhZFJhd0J5dGVGcm9tRGF0YShkYXRhKSkgPj0gMCkgewotICAgICAgcmVzdWx0IHw9IHRtcCA8PCAxNDsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCAxNDsKLSAgICAgIGlmICgodG1wID0gUmVhZFJhd0J5dGVGcm9tRGF0YShkYXRhKSkgPj0gMCkgewotICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDIxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCAyMTsKLSAgICAgICAgcmVzdWx0IHw9ICh0bXAgPSBSZWFkUmF3Qnl0ZUZyb21EYXRhKGRhdGEpKSA8PCAyODsKLSAgICAgICAgaWYgKHRtcCA8IDApIHsKLSAgICAgICAgICAvLyBEaXNjYXJkIHVwcGVyIDMyIGJpdHMuCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgIGlmIChSZWFkUmF3Qnl0ZUZyb21EYXRhKGRhdGEpID49IDApIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgW05TRXhjZXB0aW9uIHJhaXNlOk5TUGFyc2VFcnJvckV4Y2VwdGlvbgotICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdDpAIlVuYWJsZSB0byByZWFkIHZhcmludDMyIl07Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotTlNTdHJpbmcgKkdQQkRlY29kZVRleHRGb3JtYXROYW1lKGNvbnN0IHVpbnQ4X3QgKmRlY29kZURhdGEsIGludDMyX3Qga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nICppbnB1dFN0cikgewotICAvLyBkZWNvZERhdGEgZm9ybToKLSAgLy8gIHZhcmludDMyOiBudW0gZW50cmllcwotICAvLyAgZm9yIGVhY2ggZW50cnk6Ci0gIC8vICAgIHZhcmludDMyOiBrZXkKLSAgLy8gICAgYnl0ZXMqOiBkZWNvZGUgZGF0YQotICAvLwotICAvLyBkZWNvZGUgZGF0YSBvbmUgb2YgdHdvIGZvcm1zOgotICAvLyAgMTogYSBcMCBmb2xsb3dlZCBieSB0aGUgc3RyaW5nIGZvbGxvd2VkIGJ5IGFuIFwwCi0gIC8vICAyOiBieXRlY29kZXMgdG8gdHJhbnNmb3JtIGFuIGlucHV0IGludG8gdGhlIHJpZ2h0IHRoaW5nLCBlbmRpbmcgd2l0aCBcMAotICAvLwotICAvLyB0aGUgYnl0ZXMgY29kZXMgYXJlIG9mIHRoZSBmb3JtOgotICAvLyAgMHhhYmJjY2NjYwotICAvLyAgMHgwIChhbGwgemVyb3MpLCBlbmQuCi0gIC8vICBhIC0gaWYgc2V0LCBhZGQgYW4gdW5kZXJzY29yZQotICAvLyAgYmIgLSAwMCBjY2NjYyBieXRlcyBhcyBpcwotICAvLyAgYmIgLSAxMCBjY2NjYyB1cHBlciBmaXJzdCwgYXMgaXMgb24gcmVzdCwgY2NjY2MgYnl0ZSB0b3RhbAotICAvLyAgYmIgLSAwMSBjY2NjYyBsb3dlciBmaXJzdCwgYXMgaXMgb24gcmVzdCwgY2NjY2MgYnl0ZSB0b3RhbAotICAvLyAgYmIgLSAxMSBjY2NjYyBhbGwgdXBwZXIsIGNjY2NjIGJ5dGUgdG90YWwKLQotICBpZiAoIWRlY29kZURhdGEgfHwgIWlucHV0U3RyKSB7Ci0gICAgcmV0dXJuIG5pbDsKLSAgfQotCi0gIC8vIEZpbmQga2V5Ci0gIGNvbnN0IHVpbnQ4X3QgKnNjYW4gPSBkZWNvZGVEYXRhOwotICBpbnQzMl90IG51bUVudHJpZXMgPSBSZWFkUmF3VmFyaW50MzJGcm9tRGF0YSgmc2Nhbik7Ci0gIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgd2hpbGUgKCFmb3VuZEtleSAmJiAobnVtRW50cmllcyA+IDApKSB7Ci0gICAgLS1udW1FbnRyaWVzOwotICAgIGludDMyX3QgZGF0YUtleSA9IFJlYWRSYXdWYXJpbnQzMkZyb21EYXRhKCZzY2FuKTsKLSAgICBpZiAoZGF0YUtleSA9PSBrZXkpIHsKLSAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBJZiBpdCBpcyBhIGlubGluZWQgc3RyaW5nLCBpdCB3aWxsIHN0YXJ0IHdpdGggXDA7IGlmIGl0IGlzIGJ5dGVjb2RlIGl0Ci0gICAgICAvLyB3aWxsIHN0YXJ0IHdpdGggYSBjb2RlLiBTbyBhZHZhbmNlIG9uZSAoc2tpcHBpbmcgdGhlIGlubGluZSBzdHJpbmcKLSAgICAgIC8vIG1hcmtlciksIGFuZCB0aGVuIGxvb3AgdW50aWwgcmVhY2hpbmcgdGhlIGVuZCBtYXJrZXIgKFwwKS4KLSAgICAgICsrc2NhbjsKLSAgICAgIHdoaWxlICgqc2NhbiAhPSAwKSArK3NjYW47Ci0gICAgICAvLyBOb3cgbW92ZSBwYXN0IHRoZSBlbmQgbWFya2VyLgotICAgICAgKytzY2FuOwotICAgIH0KLSAgfQotCi0gIGlmICghZm91bmRLZXkpIHsKLSAgICByZXR1cm4gbmlsOwotICB9Ci0KLSAgLy8gRGVjb2RlCi0KLSAgaWYgKCpzY2FuID09IDApIHsKLSAgICAvLyBJbmxpbmUgc3RyaW5nLiBNb3ZlIG92ZXIgdGhlIG1hcmtlciwgYW5kIE5TU3RyaW5nIGNhbiB0YWtlIGl0IGFzCi0gICAgLy8gVVRGOC4KLSAgICArK3NjYW47Ci0gICAgTlNTdHJpbmcgKnJlc3VsdCA9IFtOU1N0cmluZyBzdHJpbmdXaXRoVVRGOFN0cmluZzooY29uc3QgY2hhciAqKXNjYW5dOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBOU011dGFibGVTdHJpbmcgKnJlc3VsdCA9Ci0gICAgICBbTlNNdXRhYmxlU3RyaW5nIHN0cmluZ1dpdGhDYXBhY2l0eTpbaW5wdXRTdHIgbGVuZ3RoXV07Ci0KLSAgY29uc3QgdWludDhfdCBrQWRkVW5kZXJzY29yZSAgPSAwYjEwMDAwMDAwOwotICBjb25zdCB1aW50OF90IGtPcE1hc2sgICAgICAgICA9IDBiMDExMDAwMDA7Ci0gIC8vIGNvbnN0IHVpbnQ4X3Qga09wQXNJcyAgICAgICAgPSAwYjAwMDAwMDAwOwotICBjb25zdCB1aW50OF90IGtPcEZpcnN0VXBwZXIgICAgID0gMGIwMTAwMDAwMDsKLSAgY29uc3QgdWludDhfdCBrT3BGaXJzdExvd2VyICAgICA9IDBiMDAxMDAwMDA7Ci0gIGNvbnN0IHVpbnQ4X3Qga09wQWxsVXBwZXIgICAgICAgPSAwYjAxMTAwMDAwOwotICBjb25zdCB1aW50OF90IGtTZWdtZW50TGVuTWFzayA9IDBiMDAwMTExMTE7Ci0KLSAgTlNJbnRlZ2VyIGkgPSAwOwotICBmb3IgKDsgKnNjYW4gIT0gMDsgKytzY2FuKSB7Ci0gICAgaWYgKCpzY2FuICYga0FkZFVuZGVyc2NvcmUpIHsKLSAgICAgIFtyZXN1bHQgYXBwZW5kU3RyaW5nOkAiXyJdOwotICAgIH0KLSAgICBpbnQgc2VnbWVudExlbiA9ICpzY2FuICYga1NlZ21lbnRMZW5NYXNrOwotICAgIHVpbnQ4X3QgZGVjb2RlT3AgPSAqc2NhbiAmIGtPcE1hc2s7Ci0KLSAgICAvLyBEbyBvcCBzcGVjaWZpYyBoYW5kbGluZyBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyLgotICAgIGlmIChkZWNvZGVPcCA9PSBrT3BGaXJzdFVwcGVyKSB7Ci0gICAgICB1bmljaGFyIGMgPSBbaW5wdXRTdHIgY2hhcmFjdGVyQXRJbmRleDppXTsKLSAgICAgIFtyZXN1bHQgYXBwZW5kRm9ybWF0OkAiJWMiLCB0b3VwcGVyKChjaGFyKWMpXTsKLSAgICAgICsraTsKLSAgICAgIC0tc2VnbWVudExlbjsKLSAgICB9IGVsc2UgaWYgKGRlY29kZU9wID09IGtPcEZpcnN0TG93ZXIpIHsKLSAgICAgIHVuaWNoYXIgYyA9IFtpbnB1dFN0ciBjaGFyYWN0ZXJBdEluZGV4OmldOwotICAgICAgW3Jlc3VsdCBhcHBlbmRGb3JtYXQ6QCIlYyIsIHRvbG93ZXIoKGNoYXIpYyldOwotICAgICAgKytpOwotICAgICAgLS1zZWdtZW50TGVuOwotICAgIH0KLSAgICAvLyBlbHNlIG9wID09IGtPcEFzSXMgfHwgb3AgPT0ga09wQWxsVXBwZXIKLQotICAgIC8vIE5vdyBwdWxsIG92ZXIgdGhlIHJlc3Qgb2YgdGhlIGxlbmd0aCBmb3IgdGhpcyBzZWdtZW50LgotICAgIGZvciAoaW50IHggPSAwOyB4IDwgc2VnbWVudExlbjsgKyt4KSB7Ci0gICAgICB1bmljaGFyIGMgPSBbaW5wdXRTdHIgY2hhcmFjdGVyQXRJbmRleDooaSArIHgpXTsKLSAgICAgIGlmIChkZWNvZGVPcCA9PSBrT3BBbGxVcHBlcikgewotICAgICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiVjIiwgdG91cHBlcigoY2hhciljKV07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBbcmVzdWx0IGFwcGVuZEZvcm1hdDpAIiVDIiwgY107Ci0gICAgICB9Ci0gICAgfQotICAgIGkgKz0gc2VnbWVudExlbjsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLSNwcmFnbWEgbWFyayAtIEdQQk1lc3NhZ2VTaWduYXR1cmVQcm90b2NvbAotCi0vLyBBIHNlcmllcyBvZiBzZWxlY3RvcnMgdGhhdCBhcmUgdXNlZCBzb2xlbHkgdG8gZ2V0IEBlbmNvZGluZyB2YWx1ZXMKLS8vIGZvciB0aGVtIGJ5IHRoZSBkeW5hbWljIHByb3RvYnVmIHJ1bnRpbWUgY29kZS4gQW4gb2JqZWN0IHVzaW5nIHRoZSBwcm90b2NvbAotLy8gbmVlZHMgdG8gYmUgZGVjbGFyZWQgZm9yIHRoZSBwcm90b2NvbCB0byBiZSB2YWxpZCBhdCBydW50aW1lLgotQGludGVyZmFjZSBHUEJNZXNzYWdlU2lnbmF0dXJlUHJvdG9jb2wgOiBOU09iamVjdDxHUEJNZXNzYWdlU2lnbmF0dXJlUHJvdG9jb2w+Ci1AZW5kCi1AaW1wbGVtZW50YXRpb24gR1BCTWVzc2FnZVNpZ25hdHVyZVByb3RvY29sCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJVdGlsaXRpZXNfUGFja2FnZVByaXZhdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTZiNmM4NC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLQotI2ltcG9ydCAiR1BCVXRpbGl0aWVzLmgiCi0KLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3JfUGFja2FnZVByaXZhdGUuaCIKLQotLy8gTWFjcm9zIGZvciBzdHJpbmdpZnlpbmcgbGlicmFyeSBzeW1ib2xzLiBUaGVzZSBhcmUgdXNlZCBpbiB0aGUgZ2VuZXJhdGVkCi0vLyBQQiBkZXNjcmlwdG9yIGNsYXNzZXMgd2hlcmV2ZXIgYSBsaWJyYXJ5IHN5bWJvbCBuYW1lIGlzIHJlcHJlc2VudGVkIGFzIGEKLS8vIHN0cmluZy4gU2VlIFJFQURNRS5nb29nbGUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0jZGVmaW5lIEdQQlN0cmluZ2lmeShTKSAjUwotI2RlZmluZSBHUEJTdHJpbmdpZnlTeW1ib2woUykgR1BCU3RyaW5naWZ5KFMpCi0KLSNkZWZpbmUgR1BCTlNTdHJpbmdpZnkoUykgQCNTCi0jZGVmaW5lIEdQQk5TU3RyaW5naWZ5U3ltYm9sKFMpIEdQQk5TU3RyaW5naWZ5KFMpCi0KLS8vIENvbnN0YW50IHRvIGludGVybmFsbHkgbWFyayB3aGVuIHRoZXJlIGlzIG5vIGhhcyBiaXQuCi0jZGVmaW5lIEdQQk5vSGFzQml0IElOVDMyX01BWAotCi1DRl9FWFRFUk5fQ19CRUdJTgotCi0vLyBUaGVzZSB0d28gYXJlIHVzZWQgdG8gaW5qZWN0IGEgcnVudGltZSBjaGVjayBmb3IgdmVyc2lvbiBtaXNtYXRjaCBpbnRvIHRoZQotLy8gZ2VuZXJhdGVkIHNvdXJjZXMgdG8gbWFrZSBzdXJlIHRoZXkgYXJlIGxpbmtlZCB3aXRoIGEgc3VwcG9ydGluZyBydW50aW1lLgotdm9pZCBHUEJDaGVja1J1bnRpbWVWZXJzaW9uSW50ZXJuYWwoaW50MzJfdCB2ZXJzaW9uKTsKLUdQQl9JTkxJTkUgdm9pZCBHUEJEZWJ1Z0NoZWNrUnVudGltZVZlcnNpb24oKSB7Ci0jaWYgREVCVUcKLSAgR1BCQ2hlY2tSdW50aW1lVmVyc2lvbkludGVybmFsKEdPT0dMRV9QUk9UT0JVRl9PQkpDX0dFTl9WRVJTSU9OKTsKLSNlbmRpZgotfQotCi0vLyBDb252ZXJzaW9uIGZ1bmN0aW9ucyBmb3IgZGUvc2VyaWFsaXppbmcgZmxvYXRpbmcgcG9pbnQgdHlwZXMuCi0KLUdQQl9JTkxJTkUgaW50NjRfdCBHUEJDb252ZXJ0RG91YmxlVG9JbnQ2NChkb3VibGUgdikgewotICB1bmlvbiB7IGRvdWJsZSBmOyBpbnQ2NF90IGk7IH0gdTsKLSAgdS5mID0gdjsKLSAgcmV0dXJuIHUuaTsKLX0KLQotR1BCX0lOTElORSBpbnQzMl90IEdQQkNvbnZlcnRGbG9hdFRvSW50MzIoZmxvYXQgdikgewotICB1bmlvbiB7IGZsb2F0IGY7IGludDMyX3QgaTsgfSB1OwotICB1LmYgPSB2OwotICByZXR1cm4gdS5pOwotfQotCi1HUEJfSU5MSU5FIGRvdWJsZSBHUEJDb252ZXJ0SW50NjRUb0RvdWJsZShpbnQ2NF90IHYpIHsKLSAgdW5pb24geyBkb3VibGUgZjsgaW50NjRfdCBpOyB9IHU7Ci0gIHUuaSA9IHY7Ci0gIHJldHVybiB1LmY7Ci19Ci0KLUdQQl9JTkxJTkUgZmxvYXQgR1BCQ29udmVydEludDMyVG9GbG9hdChpbnQzMl90IHYpIHsKLSAgdW5pb24geyBmbG9hdCBmOyBpbnQzMl90IGk7IH0gdTsKLSAgdS5pID0gdjsKLSAgcmV0dXJuIHUuZjsKLX0KLQotR1BCX0lOTElORSBpbnQzMl90IEdQQkxvZ2ljYWxSaWdodFNoaWZ0MzIoaW50MzJfdCB2YWx1ZSwgaW50MzJfdCBzcGFjZXMpIHsKLSAgcmV0dXJuIChpbnQzMl90KSgodWludDMyX3QpKHZhbHVlKSA+PiBzcGFjZXMpOwotfQotCi1HUEJfSU5MSU5FIGludDY0X3QgR1BCTG9naWNhbFJpZ2h0U2hpZnQ2NChpbnQ2NF90IHZhbHVlLCBpbnQzMl90IHNwYWNlcykgewotICByZXR1cm4gKGludDY0X3QpKCh1aW50NjRfdCkodmFsdWUpID4+IHNwYWNlcyk7Ci19Ci0KLS8vIERlY29kZSBhIFppZ1phZy1lbmNvZGVkIDMyLWJpdCB2YWx1ZS4gIFppZ1phZyBlbmNvZGVzIHNpZ25lZCBpbnRlZ2VycwotLy8gaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCi0vLyBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsCi0vLyB0aHVzIGFsd2F5cyB0YWtpbmcgMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQotR1BCX0lOTElORSBpbnQzMl90IEdQQkRlY29kZVppZ1phZzMyKHVpbnQzMl90IG4pIHsKLSAgcmV0dXJuIEdQQkxvZ2ljYWxSaWdodFNoaWZ0MzIobiwgMSkgXiAtKG4gJiAxKTsKLX0KLQotLy8gRGVjb2RlIGEgWmlnWmFnLWVuY29kZWQgNjQtYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCi0vLyBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwKLS8vIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLS8vIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCi1HUEJfSU5MSU5FIGludDY0X3QgR1BCRGVjb2RlWmlnWmFnNjQodWludDY0X3QgbikgewotICByZXR1cm4gR1BCTG9naWNhbFJpZ2h0U2hpZnQ2NChuLCAxKSBeIC0obiAmIDEpOwotfQotCi0vLyBFbmNvZGUgYSBaaWdaYWctZW5jb2RlZCAzMi1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKLS8vIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLAotLy8gbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLAotLy8gdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLUdQQl9JTkxJTkUgdWludDMyX3QgR1BCRW5jb2RlWmlnWmFnMzIoaW50MzJfdCBuKSB7Ci0gIC8vIE5vdGU6ICB0aGUgcmlnaHQtc2hpZnQgbXVzdCBiZSBhcml0aG1ldGljCi0gIHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsKLX0KLQotLy8gRW5jb2RlIGEgWmlnWmFnLWVuY29kZWQgNjQtYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCi0vLyBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwKLS8vIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLS8vIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCi1HUEJfSU5MSU5FIHVpbnQ2NF90IEdQQkVuY29kZVppZ1phZzY0KGludDY0X3QgbikgewotICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYwotICByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiA2Myk7Ci19Ci0KLUdQQl9JTkxJTkUgQk9PTCBHUEJEYXRhVHlwZUlzT2JqZWN0KEdQQkRhdGFUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUJ5dGVzOgotICAgIGNhc2UgR1BCRGF0YVR5cGVTdHJpbmc6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZU1lc3NhZ2U6Ci0gICAgY2FzZSBHUEJEYXRhVHlwZUdyb3VwOgotICAgICAgcmV0dXJuIFlFUzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5POwotICB9Ci19Ci0KLUdQQl9JTkxJTkUgQk9PTCBHUEJEYXRhVHlwZUlzTWVzc2FnZShHUEJEYXRhVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgR1BCRGF0YVR5cGVNZXNzYWdlOgotICAgIGNhc2UgR1BCRGF0YVR5cGVHcm91cDoKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOTzsKLSAgfQotfQotCi1HUEJfSU5MSU5FIEJPT0wgR1BCRmllbGREYXRhVHlwZUlzTWVzc2FnZShHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkKSB7Ci0gIHJldHVybiBHUEJEYXRhVHlwZUlzTWVzc2FnZShmaWVsZC0+ZGVzY3JpcHRpb25fLT5kYXRhVHlwZSk7Ci19Ci0KLUdQQl9JTkxJTkUgQk9PTCBHUEJGaWVsZERhdGFUeXBlSXNPYmplY3QoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICByZXR1cm4gR1BCRGF0YVR5cGVJc09iamVjdChmaWVsZC0+ZGVzY3JpcHRpb25fLT5kYXRhVHlwZSk7Ci19Ci0KLUdQQl9JTkxJTkUgQk9PTCBHUEJFeHRlbnNpb25Jc01lc3NhZ2UoR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqZXh0KSB7Ci0gIHJldHVybiBHUEJEYXRhVHlwZUlzTWVzc2FnZShleHQtPmRlc2NyaXB0aW9uXy0+ZGF0YVR5cGUpOwotfQotCi0vLyBUaGUgZmllbGQgaXMgYW4gYXJyYXkvbWFwIG9yIGl0IGhhcyBhbiBvYmplY3QgdmFsdWUuCi1HUEJfSU5MSU5FIEJPT0wgR1BCRmllbGRTdG9yZXNPYmplY3QoR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiAqZGVzYyA9IGZpZWxkLT5kZXNjcmlwdGlvbl87Ci0gIGlmICgoZGVzYy0+ZmxhZ3MgJiAoR1BCRmllbGRSZXBlYXRlZCB8IEdQQkZpZWxkTWFwS2V5TWFzaykpICE9IDApIHsKLSAgICByZXR1cm4gWUVTOwotICB9Ci0gIHJldHVybiBHUEJEYXRhVHlwZUlzT2JqZWN0KGRlc2MtPmRhdGFUeXBlKTsKLX0KLQotQk9PTCBHUEJHZXRIYXNJdmFyKEdQQk1lc3NhZ2UgKnNlbGYsIGludDMyX3QgaW5kZXgsIHVpbnQzMl90IGZpZWxkTnVtYmVyKTsKLXZvaWQgR1BCU2V0SGFzSXZhcihHUEJNZXNzYWdlICpzZWxmLCBpbnQzMl90IGlkeCwgdWludDMyX3QgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgQk9PTCB2YWx1ZSk7Ci11aW50MzJfdCBHUEJHZXRIYXNPbmVvZihHUEJNZXNzYWdlICpzZWxmLCBpbnQzMl90IGluZGV4KTsKLQotR1BCX0lOTElORSBCT09MCi1HUEJHZXRIYXNJdmFyRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiAqZmllbGREZXNjID0gZmllbGQtPmRlc2NyaXB0aW9uXzsKLSAgcmV0dXJuIEdQQkdldEhhc0l2YXIoc2VsZiwgZmllbGREZXNjLT5oYXNJbmRleCwgZmllbGREZXNjLT5udW1iZXIpOwotfQotR1BCX0lOTElORSB2b2lkIEdQQlNldEhhc0l2YXJGaWVsZChHUEJNZXNzYWdlICpzZWxmLCBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIHZhbHVlKSB7Ci0gIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uICpmaWVsZERlc2MgPSBmaWVsZC0+ZGVzY3JpcHRpb25fOwotICBHUEJTZXRIYXNJdmFyKHNlbGYsIGZpZWxkRGVzYy0+aGFzSW5kZXgsIGZpZWxkRGVzYy0+bnVtYmVyLCB2YWx1ZSk7Ci19Ci0KLXZvaWQgR1BCTWF5YmVDbGVhck9uZW9mKEdQQk1lc3NhZ2UgKnNlbGYsIEdQQk9uZW9mRGVzY3JpcHRvciAqb25lb2YsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IG9uZW9mSGFzSW5kZXgsIHVpbnQzMl90IGZpZWxkTnVtYmVyTm90VG9DbGVhcik7Ci0KLS8vJVBERE0tREVGSU5FIEdQQl9JVkFSX1NFVF9ERUNMKE5BTUUsIFRZUEUpCi0vLyV2b2lkIEdQQlNldCMjTkFNRSMjSXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotLy8lICAgICAgICAgICAgTkFNRSRTICAgICAgICAgICAgICAgICAgICAgVFlQRSB2YWx1ZSwKLS8vJSAgICAgICAgICAgIE5BTUUkUyAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KTsKLS8vJVBERE0tRVhQQU5EIEdQQl9JVkFSX1NFVF9ERUNMKEJvb2wsIEJPT0wpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotdm9pZCBHUEJTZXRCb29sSXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCT09MIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KTsKLS8vJVBERE0tRVhQQU5EIEdQQl9JVkFSX1NFVF9ERUNMKEludDMyLCBpbnQzMl90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLXZvaWQgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpOwotLy8lUERETS1FWFBBTkQgR1BCX0lWQVJfU0VUX0RFQ0woVUludDMyLCB1aW50MzJfdCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi12b2lkIEdQQlNldFVJbnQzMkl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpOwotLy8lUERETS1FWFBBTkQgR1BCX0lWQVJfU0VUX0RFQ0woSW50NjQsIGludDY0X3QpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotdm9pZCBHUEJTZXRJbnQ2NEl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCk7Ci0vLyVQRERNLUVYUEFORCBHUEJfSVZBUl9TRVRfREVDTChVSW50NjQsIHVpbnQ2NF90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLXZvaWQgR1BCU2V0VUludDY0SXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCk7Ci0vLyVQRERNLUVYUEFORCBHUEJfSVZBUl9TRVRfREVDTChGbG9hdCwgZmxvYXQpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotdm9pZCBHUEJTZXRGbG9hdEl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbG9hdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpOwotLy8lUERETS1FWFBBTkQgR1BCX0lWQVJfU0VUX0RFQ0woRG91YmxlLCBkb3VibGUpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotdm9pZCBHUEJTZXREb3VibGVJdmFyV2l0aEZpZWxkSW50ZXJuYWwoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCk7Ci0vLyVQRERNLUVYUEFORCBHUEJfSVZBUl9TRVRfREVDTChFbnVtLCBpbnQzMl90KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLXZvaWQgR1BCU2V0RW51bUl2YXJXaXRoRmllbGRJbnRlcm5hbChHUEJNZXNzYWdlICpzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCk7Ci0vLyVQRERNLUVYUEFORC1FTkQgKDggZXhwYW5zaW9ucykKLQotaW50MzJfdCBHUEJHZXRFbnVtSXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWxlU3ludGF4IHN5bnRheCk7Ci0KLWlkIEdQQkdldE9iamVjdEl2YXJXaXRoRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0KLXZvaWQgR1BCU2V0T2JqZWN0SXZhcldpdGhGaWVsZEludGVybmFsKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkLCBpZCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpbGVTeW50YXggc3ludGF4KTsKLXZvaWQgR1BCU2V0UmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkSW50ZXJuYWwoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQgX19hdHRyaWJ1dGVfXygobnNfY29uc3VtZWQpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR1BCRmlsZVN5bnRheCBzeW50YXgpOwotCi0vLyBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkIHdpbGwgYXV0b21hdGljYWxseSBjcmVhdGUgdGhlIGZpZWxkIChtZXNzYWdlKSBpZgotLy8gaXQgZG9lc24ndCBleGlzdC4gR1BCR2V0T2JqZWN0SXZhcldpdGhGaWVsZE5vQXV0b2NyZWF0ZSB3aWxsIHJldHVybiBuaWwuCi1pZCBHUEJHZXRPYmplY3RJdmFyV2l0aEZpZWxkTm9BdXRvY3JlYXRlKEdQQk1lc3NhZ2UgKnNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotCi12b2lkIEdQQlNldEF1dG9jcmVhdGVkUmV0YWluZWRPYmplY3RJdmFyV2l0aEZpZWxkKAotICAgIEdQQk1lc3NhZ2UgKnNlbGYsIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQsCi0gICAgaWQgX19hdHRyaWJ1dGVfXygobnNfY29uc3VtZWQpKSB2YWx1ZSk7Ci0KLS8vIENsZWFycyBhbmQgcmVsZWFzZXMgdGhlIGF1dG9jcmVhdGVkIG1lc3NhZ2UgaXZhciwgaWYgaXQncyBhdXRvY3JlYXRlZC4gSWYKLS8vIGl0J3Mgbm90IHNldCBhcyBhdXRvY3JlYXRlZCwgdGhpcyBtZXRob2QgZG9lcyBub3RoaW5nLgotdm9pZCBHUEJDbGVhckF1dG9jcmVhdGVkTWVzc2FnZUl2YXJXaXRoRmllbGQoR1BCTWVzc2FnZSAqc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQpOwotCi0vLyBSZXR1cm5zIGFuIE9iamVjdGl2ZSBDIGVuY29kaW5nIGZvciB8c2VsZWN0b3J8LiB8aW5zdGFuY2VTZWx8IHNob3VsZCBiZQotLy8gWUVTIGlmIGl0J3MgYW4gaW5zdGFuY2Ugc2VsZWN0b3IgKGFzIG9wcG9zZWQgdG8gYSBjbGFzcyBzZWxlY3RvcikuCi0vLyB8c2VsZWN0b3J8IG11c3QgYmUgYSBzZWxlY3RvciBmcm9tIE1lc3NhZ2VTaWduYXR1cmVQcm90b2NvbC4KLWNvbnN0IGNoYXIgKkdQQk1lc3NhZ2VFbmNvZGluZ0ZvclNlbGVjdG9yKFNFTCBzZWxlY3RvciwgQk9PTCBpbnN0YW5jZVNlbCk7Ci0KLS8vIEhlbHBlciBmb3IgdGV4dCBmb3JtYXQgbmFtZSBlbmNvZGluZy4KLS8vIGRlY29kZURhdGEgaXMgdGhlIGRhdGEgZGVzY3JpYmluZyB0aGUgc2VwZWNpYWwgZGVjb2Rlcy4KLS8vIGtleSBhbmQgaW5wdXRTdHJpbmcgYXJlIHRoZSBpbnB1dCB0aGF0IG5lZWRzIGRlY29kaW5nLgotTlNTdHJpbmcgKkdQQkRlY29kZVRleHRGb3JtYXROYW1lKGNvbnN0IHVpbnQ4X3QgKmRlY29kZURhdGEsIGludDMyX3Qga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TU3RyaW5nICppbnB1dFN0cmluZyk7Ci0KLS8vIEEgc2VyaWVzIG9mIHNlbGVjdG9ycyB0aGF0IGFyZSB1c2VkIHNvbGVseSB0byBnZXQgQGVuY29kaW5nIHZhbHVlcwotLy8gZm9yIHRoZW0gYnkgdGhlIGR5bmFtaWMgcHJvdG9idWYgcnVudGltZSBjb2RlLiBTZWUKLS8vIEdQQk1lc3NhZ2VFbmNvZGluZ0ZvclNlbGVjdG9yIGZvciBkZXRhaWxzLgotQHByb3RvY29sIEdQQk1lc3NhZ2VTaWduYXR1cmVQcm90b2NvbAotQG9wdGlvbmFsCi0KLSNkZWZpbmUgR1BCX01FU1NBR0VfU0lHTkFUVVJFX0VOVFJZKFRZUEUsIE5BTUUpIFwKLSAgLShUWVBFKWdldCMjTkFNRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLSh2b2lkKXNldCMjTkFNRSA6IChUWVBFKXZhbHVlOyAgICAgICAgICAgICAgIFwKLSAgLShUWVBFKWdldCMjTkFNRSMjQXRJbmRleCA6IChOU1VJbnRlZ2VyKWluZGV4OwotCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoQk9PTCwgQm9vbCkKLUdQQl9NRVNTQUdFX1NJR05BVFVSRV9FTlRSWSh1aW50MzJfdCwgRml4ZWQzMikKLUdQQl9NRVNTQUdFX1NJR05BVFVSRV9FTlRSWShpbnQzMl90LCBTRml4ZWQzMikKLUdQQl9NRVNTQUdFX1NJR05BVFVSRV9FTlRSWShmbG9hdCwgRmxvYXQpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkodWludDY0X3QsIEZpeGVkNjQpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoaW50NjRfdCwgU0ZpeGVkNjQpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoZG91YmxlLCBEb3VibGUpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoaW50MzJfdCwgSW50MzIpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoaW50NjRfdCwgSW50NjQpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoaW50MzJfdCwgU0ludDMyKQotR1BCX01FU1NBR0VfU0lHTkFUVVJFX0VOVFJZKGludDY0X3QsIFNJbnQ2NCkKLUdQQl9NRVNTQUdFX1NJR05BVFVSRV9FTlRSWSh1aW50MzJfdCwgVUludDMyKQotR1BCX01FU1NBR0VfU0lHTkFUVVJFX0VOVFJZKHVpbnQ2NF90LCBVSW50NjQpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoTlNEYXRhICosIEJ5dGVzKQotR1BCX01FU1NBR0VfU0lHTkFUVVJFX0VOVFJZKE5TU3RyaW5nICosIFN0cmluZykKLUdQQl9NRVNTQUdFX1NJR05BVFVSRV9FTlRSWShHUEJNZXNzYWdlICosIE1lc3NhZ2UpCi1HUEJfTUVTU0FHRV9TSUdOQVRVUkVfRU5UUlkoR1BCTWVzc2FnZSAqLCBHcm91cCkKLUdQQl9NRVNTQUdFX1NJR05BVFVSRV9FTlRSWShpbnQzMl90LCBFbnVtKQotCi0jdW5kZWYgR1BCX01FU1NBR0VfU0lHTkFUVVJFX0VOVFJZCi0KLS0gKGlkKWdldEFycmF5OwotLSAoTlNVSW50ZWdlcilnZXRBcnJheUNvdW50OwotLSAodm9pZClzZXRBcnJheTooTlNBcnJheSAqKWFycmF5OwotKyAoaWQpZ2V0Q2xhc3NWYWx1ZTsKLUBlbmQKLQotQ0ZfRVhURVJOX0NfRU5ECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQldlbGxLbm93blR5cGVzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQldlbGxLbm93blR5cGVzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4NDQyZmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJXZWxsS25vd25UeXBlcy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvRHVyYXRpb24ucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVGltZXN0YW1wLnBib2JqYy5oIgotCi1OU19BU1NVTUVfTk9OTlVMTF9CRUdJTgotCi0vLyBFeHRlbnNpb24gdG8gR1BCVGltZXN0YW1wIHRvIHdvcmsgd2l0aCBzdGFuZGFyZCBGb3VuZGF0aW9uIHRpbWUvZGF0ZSB0eXBlcy4KLUBpbnRlcmZhY2UgR1BCVGltZXN0YW1wIChHQlBXZWxsS25vd25UeXBlcykKLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nKSBOU0RhdGUgKmRhdGU7Ci1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIE5TVGltZUludGVydmFsIHRpbWVJbnRlcnZhbFNpbmNlMTk3MDsKLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aERhdGU6KE5TRGF0ZSAqKWRhdGU7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhUaW1lSW50ZXJ2YWxTaW5jZTE5NzA6KE5TVGltZUludGVydmFsKXRpbWVJbnRlcnZhbFNpbmNlMTk3MDsKLUBlbmQKLQotLy8gRXh0ZW5zaW9uIHRvIEdQQkR1cmF0aW9uIHRvIHdvcmsgd2l0aCBzdGFuZGFyZCBGb3VuZGF0aW9uIHRpbWUgdHlwZS4KLUBpbnRlcmZhY2UgR1BCRHVyYXRpb24gKEdCUFdlbGxLbm93blR5cGVzKQotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBOU1RpbWVJbnRlcnZhbCB0aW1lSW50ZXJ2YWxTaW5jZTE5NzA7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhUaW1lSW50ZXJ2YWxTaW5jZTE5NzA6KE5TVGltZUludGVydmFsKXRpbWVJbnRlcnZhbFNpbmNlMTk3MDsKLUBlbmQKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQldlbGxLbm93blR5cGVzLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQldlbGxLbm93blR5cGVzLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZlMDJmNWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJXZWxsS25vd25UeXBlcy5tCisrKyAvZGV2L251bGwKQEAgLTEsMTE3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBJbXBvcnRpbmcgc291cmNlcyBoZXJlIHRvIGZvcmNlIHRoZSBsaW5rZXIgdG8gaW5jbHVkZSBvdXIgY2F0ZWdvcnkgbWV0aG9kcyBpbgotLy8gdGhlIHN0YXRpYyBsaWJyYXJ5LiBJZiB0aGVzZSB3ZXJlIGNvbXBpbGVkIHNlcGFyYXRlbHksIHRoZSBjYXRlZ29yeSBtZXRob2RzCi0vLyBiZWxvdyB3b3VsZCBiZSBzdHJpcHBlZCBieSB0aGUgbGlua2VyLgotCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVGltZXN0YW1wLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0R1cmF0aW9uLnBib2JqYy5tIgotI2ltcG9ydCAiR1BCV2VsbEtub3duVHlwZXMuaCIKLQotc3RhdGljIE5TVGltZUludGVydmFsIFRpbWVJbnRlcnZhbFNpbmNlMTk3MEZyb21TZWNvbmRzQW5kTmFub3MoaW50NjRfdCBzZWNvbmRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBuYW5vcykgewotICByZXR1cm4gc2Vjb25kcyArIChOU1RpbWVJbnRlcnZhbCluYW5vcyAvIDFlOTsKLX0KLQotc3RhdGljIGludDMyX3QgU2Vjb25kc0FuZE5hbm9zRnJvbVRpbWVJbnRlcnZhbFNpbmNlMTk3MChOU1RpbWVJbnRlcnZhbCB0aW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICpvdXRTZWNvbmRzKSB7Ci0gIE5TVGltZUludGVydmFsIHNlY29uZHM7Ci0gIE5TVGltZUludGVydmFsIG5hbm9zID0gbW9kZih0aW1lLCAmc2Vjb25kcyk7Ci0gIG5hbm9zICo9IDFlOTsKLSAgKm91dFNlY29uZHMgPSAoaW50NjRfdClzZWNvbmRzOwotICByZXR1cm4gKGludDMyX3QpbmFub3M7Ci19Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJUaW1lc3RhbXAgKEdCUFdlbGxLbm93blR5cGVzKQotCi0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhEYXRlOihOU0RhdGUgKilkYXRlIHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVGltZUludGVydmFsU2luY2UxOTcwOmRhdGUudGltZUludGVydmFsU2luY2UxOTcwXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVGltZUludGVydmFsU2luY2UxOTcwOihOU1RpbWVJbnRlcnZhbCl0aW1lSW50ZXJ2YWxTaW5jZTE5NzAgewotICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7Ci0gICAgaW50NjRfdCBzZWNvbmRzOwotICAgIGludDMyX3QgbmFub3MgPSBTZWNvbmRzQW5kTmFub3NGcm9tVGltZUludGVydmFsU2luY2UxOTcwKAotICAgICAgICB0aW1lSW50ZXJ2YWxTaW5jZTE5NzAsICZzZWNvbmRzKTsKLSAgICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzOwotICAgIHNlbGYubmFub3MgPSBuYW5vczsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoTlNEYXRlICopZGF0ZSB7Ci0gIHJldHVybiBbTlNEYXRlIGRhdGVXaXRoVGltZUludGVydmFsU2luY2UxOTcwOnNlbGYudGltZUludGVydmFsU2luY2UxOTcwXTsKLX0KLQotLSAodm9pZClzZXREYXRlOihOU0RhdGUgKilkYXRlIHsKLSAgc2VsZi50aW1lSW50ZXJ2YWxTaW5jZTE5NzAgPSBkYXRlLnRpbWVJbnRlcnZhbFNpbmNlMTk3MDsKLX0KLQotLSAoTlNUaW1lSW50ZXJ2YWwpdGltZUludGVydmFsU2luY2UxOTcwIHsKLSAgcmV0dXJuIFRpbWVJbnRlcnZhbFNpbmNlMTk3MEZyb21TZWNvbmRzQW5kTmFub3Moc2VsZi5zZWNvbmRzLCBzZWxmLm5hbm9zKTsKLX0KLQotLSAodm9pZClzZXRUaW1lSW50ZXJ2YWxTaW5jZTE5NzA6KE5TVGltZUludGVydmFsKXRpbWVJbnRlcnZhbFNpbmNlMTk3MCB7Ci0gIGludDY0X3Qgc2Vjb25kczsKLSAgaW50MzJfdCBuYW5vcyA9Ci0gICAgICBTZWNvbmRzQW5kTmFub3NGcm9tVGltZUludGVydmFsU2luY2UxOTcwKHRpbWVJbnRlcnZhbFNpbmNlMTk3MCwgJnNlY29uZHMpOwotICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzOwotICBzZWxmLm5hbm9zID0gbmFub3M7Ci19Ci0KLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkR1cmF0aW9uIChHQlBXZWxsS25vd25UeXBlcykKLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVGltZUludGVydmFsU2luY2UxOTcwOihOU1RpbWVJbnRlcnZhbCl0aW1lSW50ZXJ2YWxTaW5jZTE5NzAgewotICBpZiAoKHNlbGYgPSBbc3VwZXIgaW5pdF0pKSB7Ci0gICAgaW50NjRfdCBzZWNvbmRzOwotICAgIGludDMyX3QgbmFub3MgPSBTZWNvbmRzQW5kTmFub3NGcm9tVGltZUludGVydmFsU2luY2UxOTcwKAotICAgICAgICB0aW1lSW50ZXJ2YWxTaW5jZTE5NzAsICZzZWNvbmRzKTsKLSAgICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzOwotICAgIHNlbGYubmFub3MgPSBuYW5vczsKLSAgfQotICByZXR1cm4gc2VsZjsKLX0KLQotLSAoTlNUaW1lSW50ZXJ2YWwpdGltZUludGVydmFsU2luY2UxOTcwIHsKLSAgcmV0dXJuIFRpbWVJbnRlcnZhbFNpbmNlMTk3MEZyb21TZWNvbmRzQW5kTmFub3Moc2VsZi5zZWNvbmRzLCBzZWxmLm5hbm9zKTsKLX0KLQotLSAodm9pZClzZXRUaW1lSW50ZXJ2YWxTaW5jZTE5NzA6KE5TVGltZUludGVydmFsKXRpbWVJbnRlcnZhbFNpbmNlMTk3MCB7Ci0gIGludDY0X3Qgc2Vjb25kczsKLSAgaW50MzJfdCBuYW5vcyA9Ci0gICAgICBTZWNvbmRzQW5kTmFub3NGcm9tVGltZUludGVydmFsU2luY2UxOTcwKHRpbWVJbnRlcnZhbFNpbmNlMTk3MCwgJnNlY29uZHMpOwotICBzZWxmLnNlY29uZHMgPSBzZWNvbmRzOwotICBzZWxmLm5hbm9zID0gbmFub3M7Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvR1BCV2lyZUZvcm1hdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJXaXJlRm9ybWF0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI5Y2YyZjAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJXaXJlRm9ybWF0LmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCUnVudGltZVR5cGVzLmgiCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLXR5cGVkZWYgZW51bSB7Ci0gIEdQQldpcmVGb3JtYXRWYXJpbnQgPSAwLAotICBHUEJXaXJlRm9ybWF0Rml4ZWQ2NCA9IDEsCi0gIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQgPSAyLAotICBHUEJXaXJlRm9ybWF0U3RhcnRHcm91cCA9IDMsCi0gIEdQQldpcmVGb3JtYXRFbmRHcm91cCA9IDQsCi0gIEdQQldpcmVGb3JtYXRGaXhlZDMyID0gNSwKLX0gR1BCV2lyZUZvcm1hdDsKLQotZW51bSB7Ci0gIEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0SXRlbSA9IDEsCi0gIEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0VHlwZUlkID0gMiwKLSAgR1BCV2lyZUZvcm1hdE1lc3NhZ2VTZXRNZXNzYWdlID0gMwotfTsKLQotdWludDMyX3QgR1BCV2lyZUZvcm1hdE1ha2VUYWcodWludDMyX3QgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXQgd2lyZVR5cGUpCi0gICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLUdQQldpcmVGb3JtYXQgR1BCV2lyZUZvcm1hdEdldFRhZ1dpcmVUeXBlKHVpbnQzMl90IHRhZykgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLXVpbnQzMl90IEdQQldpcmVGb3JtYXRHZXRUYWdGaWVsZE51bWJlcih1aW50MzJfdCB0YWcpIF9fYXR0cmlidXRlX18oKGNvbnN0KSk7Ci0KLUdQQldpcmVGb3JtYXQgR1BCV2lyZUZvcm1hdEZvclR5cGUoR1BCRGF0YVR5cGUgZGF0YVR5cGUsIEJPT0wgaXNQYWNrZWQpCi0gICAgX19hdHRyaWJ1dGVfXygoY29uc3QpKTsKLQotI2RlZmluZSBHUEJXaXJlRm9ybWF0TWVzc2FnZVNldEl0ZW1UYWcgXAotICAoR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCV2lyZUZvcm1hdE1lc3NhZ2VTZXRJdGVtLCBHUEJXaXJlRm9ybWF0U3RhcnRHcm91cCkpCi0jZGVmaW5lIEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0SXRlbUVuZFRhZyBcCi0gIChHUEJXaXJlRm9ybWF0TWFrZVRhZyhHUEJXaXJlRm9ybWF0TWVzc2FnZVNldEl0ZW0sIEdQQldpcmVGb3JtYXRFbmRHcm91cCkpCi0jZGVmaW5lIEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0VHlwZUlkVGFnIFwKLSAgKEdQQldpcmVGb3JtYXRNYWtlVGFnKEdQQldpcmVGb3JtYXRNZXNzYWdlU2V0VHlwZUlkLCBHUEJXaXJlRm9ybWF0VmFyaW50KSkKLSNkZWZpbmUgR1BCV2lyZUZvcm1hdE1lc3NhZ2VTZXRNZXNzYWdlVGFnICAgICAgICAgICAgICAgXAotICAoR1BCV2lyZUZvcm1hdE1ha2VUYWcoR1BCV2lyZUZvcm1hdE1lc3NhZ2VTZXRNZXNzYWdlLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKSkKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECi0KLUNGX0VYVEVSTl9DX0VORApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9HUEJXaXJlRm9ybWF0Lm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQldpcmVGb3JtYXQubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTkzMjM1ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL0dQQldpcmVGb3JtYXQubQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0ICJHUEJXaXJlRm9ybWF0LmgiCi0KLSNpbXBvcnQgIkdQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIgotCi1lbnVtIHsKLSAgR1BCV2lyZUZvcm1hdFRhZ1R5cGVCaXRzID0gMywKLSAgR1BCV2lyZUZvcm1hdFRhZ1R5cGVNYXNrID0gNyAvKiA9ICgxIDw8IEdQQldpcmVGb3JtYXRUYWdUeXBlQml0cykgLSAxICovLAotfTsKLQotdWludDMyX3QgR1BCV2lyZUZvcm1hdE1ha2VUYWcodWludDMyX3QgZmllbGROdW1iZXIsIEdQQldpcmVGb3JtYXQgd2lyZVR5cGUpIHsKLSAgcmV0dXJuIChmaWVsZE51bWJlciA8PCBHUEJXaXJlRm9ybWF0VGFnVHlwZUJpdHMpIHwgd2lyZVR5cGU7Ci19Ci0KLUdQQldpcmVGb3JtYXQgR1BCV2lyZUZvcm1hdEdldFRhZ1dpcmVUeXBlKHVpbnQzMl90IHRhZykgewotICByZXR1cm4gKEdQQldpcmVGb3JtYXQpKHRhZyAmIEdQQldpcmVGb3JtYXRUYWdUeXBlTWFzayk7Ci19Ci0KLXVpbnQzMl90IEdQQldpcmVGb3JtYXRHZXRUYWdGaWVsZE51bWJlcih1aW50MzJfdCB0YWcpIHsKLSAgcmV0dXJuIEdQQkxvZ2ljYWxSaWdodFNoaWZ0MzIodGFnLCBHUEJXaXJlRm9ybWF0VGFnVHlwZUJpdHMpOwotfQotCi1HUEJXaXJlRm9ybWF0IEdQQldpcmVGb3JtYXRGb3JUeXBlKEdQQkRhdGFUeXBlIHR5cGUsIEJPT0wgaXNQYWNrZWQpIHsKLSAgaWYgKGlzUGFja2VkKSB7Ci0gICAgcmV0dXJuIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQ7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgR1BCV2lyZUZvcm1hdCBmb3JtYXRbR1BCRGF0YVR5cGVfQ291bnRdID0gewotICAgICAgR1BCV2lyZUZvcm1hdFZhcmludCwgICAgICAgICAgIC8vIEdQQkRhdGFUeXBlQm9vbAotICAgICAgR1BCV2lyZUZvcm1hdEZpeGVkMzIsICAgICAgICAgIC8vIEdQQkRhdGFUeXBlRml4ZWQzMgotICAgICAgR1BCV2lyZUZvcm1hdEZpeGVkMzIsICAgICAgICAgIC8vIEdQQkRhdGFUeXBlU0ZpeGVkMzIKLSAgICAgIEdQQldpcmVGb3JtYXRGaXhlZDMyLCAgICAgICAgICAvLyBHUEJEYXRhVHlwZUZsb2F0Ci0gICAgICBHUEJXaXJlRm9ybWF0Rml4ZWQ2NCwgICAgICAgICAgLy8gR1BCRGF0YVR5cGVGaXhlZDY0Ci0gICAgICBHUEJXaXJlRm9ybWF0Rml4ZWQ2NCwgICAgICAgICAgLy8gR1BCRGF0YVR5cGVTRml4ZWQ2NAotICAgICAgR1BCV2lyZUZvcm1hdEZpeGVkNjQsICAgICAgICAgIC8vIEdQQkRhdGFUeXBlRG91YmxlCi0gICAgICBHUEJXaXJlRm9ybWF0VmFyaW50LCAgICAgICAgICAgLy8gR1BCRGF0YVR5cGVJbnQzMgotICAgICAgR1BCV2lyZUZvcm1hdFZhcmludCwgICAgICAgICAgIC8vIEdQQkRhdGFUeXBlSW50NjQKLSAgICAgIEdQQldpcmVGb3JtYXRWYXJpbnQsICAgICAgICAgICAvLyBHUEJEYXRhVHlwZVNJbnQzMgotICAgICAgR1BCV2lyZUZvcm1hdFZhcmludCwgICAgICAgICAgIC8vIEdQQkRhdGFUeXBlU0ludDY0Ci0gICAgICBHUEJXaXJlRm9ybWF0VmFyaW50LCAgICAgICAgICAgLy8gR1BCRGF0YVR5cGVVSW50MzIKLSAgICAgIEdQQldpcmVGb3JtYXRWYXJpbnQsICAgICAgICAgICAvLyBHUEJEYXRhVHlwZVVJbnQ2NAotICAgICAgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCwgIC8vIEdQQkRhdGFUeXBlQnl0ZXMKLSAgICAgIEdQQldpcmVGb3JtYXRMZW5ndGhEZWxpbWl0ZWQsICAvLyBHUEJEYXRhVHlwZVN0cmluZwotICAgICAgR1BCV2lyZUZvcm1hdExlbmd0aERlbGltaXRlZCwgIC8vIEdQQkRhdGFUeXBlTWVzc2FnZQotICAgICAgR1BCV2lyZUZvcm1hdFN0YXJ0R3JvdXAsICAgICAgIC8vIEdQQkRhdGFUeXBlR3JvdXAKLSAgICAgIEdQQldpcmVGb3JtYXRWYXJpbnQgICAgICAgICAgICAvLyBHUEJEYXRhVHlwZUVudW0KLSAgfTsKLSAgcmV0dXJuIGZvcm1hdFt0eXBlXTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9SRUFETUUubWQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM3MzEzZTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvZ29vZ2xlL3Byb3RvYnVmLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9wcm90b2J1ZikKLQotQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIE9iamVjdGl2ZSBDIFByb3RvY29sIEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5LgotCi1SZXF1aXJlbWVudHMKLS0tLS0tLS0tLS0tLQotCi1UaGUgT2JqZWN0aXZlIEMgaW1wbGVtZW50YXRpb24gcmVxdWlyZXM6Ci0KLS0gT2JqZWN0aXZlIEMgMi4wIFJ1bnRpbWUgKDMyYml0ICYgNjRiaXQgaU9TLCA2NGJpdCBPUyBYKS4KLS0gWGNvZGUgNy4wIChvciBsYXRlcikuCi0tIFRoZSBsaWJyYXJ5IGNvZGUgZG9lcyAqbm90KiB1c2UgQVJDIChmb3IgcGVyZm9ybWFuY2UgcmVhc29ucyksIGJ1dCBpdCBhbGwgY2FuCi0gIGJlIGNhbGxlZCBmcm9tIEFSQyBjb2RlLgotCi1JbnN0YWxsYXRpb24KLS0tLS0tLS0tLS0tLQotCi1UaGUgZnVsbCBkaXN0cmlidXRpb24gcHVsbGVkIGZyb20gZ2l0aHViIGluY2x1ZGVzIHRoZSBzb3VyY2VzIGZvciBib3RoIHRoZQotY29tcGlsZXIgKHByb3RvYykgYW5kIHRoZSBydW50aW1lICh0aGlzIGRpcmVjdG9yeSkuIFRvIGJ1aWxkIHRoZSBjb21waWxlcgotYW5kIHJ1biB0aGUgcnVudGltZSB0ZXN0cywgeW91IGNhbiB1c2U6Ci0KLSAgICAgJCBvYmplY3RpdmVjL0RldlRvb2xzL2Z1bGxfbWFjX2J1aWxkLnNoCi0KLVRoaXMgd2lsbCBnZW5lcmF0ZSB0aGUgYHNyYy9wcm90b2NgIGJpbmFyeS4KLQotQnVpbGRpbmcKLS0tLS0tLS0tCi0KLVRoZXJlIGFyZSB0d28gd2F5cyB0byBpbmNsdWRlIHRoZSBSdW50aW1lIHNvdXJjZXMgaW4geW91ciBwcm9qZWN0OgotCi1BZGQgYG9iamVjdGl2ZWMvXCouaGAgJiBgb2JqZWN0aXZlYy9HUEJQcm90b2NvbEJ1ZmZlcnMubWAgdG8geW91ciBwcm9qZWN0LgotCi0qb3IqCi0KLUFkZCBgb2JqZWN0aXZlYy9cKi5oYCAmIGBvYmplY3RpdmVjL1wqLm1gIGV4Y2VwdCBmb3IKLWBvYmplY3RpdmVjL0dQQlByb3RvY29sQnVmZmVycy5tYCB0byB5b3VyIHByb2plY3QuCi0KLQotSWYgdGhlIHRhcmdldCBpcyB1c2luZyBBUkMsIHJlbWVtYmVyIHRvIHR1cm4gb2ZmIEFSQyAoYC1mbm8tb2JqYy1hcmNgKSBmb3IgdGhlCi1gLm1gIGZpbGVzLgotCi1UaGUgZmlsZXMgZ2VuZXJhdGVkIGJ5IGBwcm90b2NgIGZvciB0aGUgYCoucHJvdG9gIGZpbGVzIChgXCoucGJvYmpjLmgnIGFuZAotYFwqLnBib2JqYy5tYCkgYXJlIHRoZW4gYWxzbyBhZGRlZCB0byB0aGUgdGFyZ2V0LgotCi1Vc2FnZQotLS0tLS0KLQotVGhlIG9iamVjdHMgZ2VuZXJhdGVkIGZvciBtZXNzYWdlcyBzaG91bGQgd29yayBsaWtlIGFueSBvdGhlciBPYmplY3RpdmUgQwotb2JqZWN0LiBUaGV5IGFyZSBtdXRhYmxlIG9iamVjdHMsIGJ1dCBpZiB5b3UgZG9uJ3QgY2hhbmdlIHRoZW0sIHRoZXkgYXJlIHNhZmUKLXRvIHNoYXJlIGJldHdlZW4gdGhyZWFkcyAoc2ltaWxhciB0byBwYXNzaW5nIGFuIE5TTXV0YWJsZURpY3Rpb25hcnkgYmV0d2VlbgotdGhyZWFkcy9xdWV1ZXM7IGFzIGxvbmcgYXMgbm8gb25lIG11dGF0ZXMgaXQsIHRoaW5ncyBhcmUgZmluZSkuCi0KLVRoZXJlIGFyZSBhIGZldyBiZWhhdmlvcnMgd29ydGggY2FsbGluZyBvdXQ6Ci0KLUEgcHJvcGVydHkgdGhhdCBpcyB0eXBlIE5TU3RyaW5nXCogd2lsbCBuZXZlciByZXR1cm4gbmlsLiBJZiB0aGUgdmFsdWUgaXMKLXVuc2V0LCBpdCB3aWxsIHJldHVybiBhbiBlbXB0eSBzdHJpbmcgKEAiIikuIFRoaXMgaXMgaW5wYXJ0IHRvIGFsaWduIHRoaW5ncwotd2l0aCB0aGUgUHJvdG9jb2wgQnVmZmVycyBzcGVjIHdoaWNoIHNheXMgdGhlIGRlZmF1bHQgZm9yIHN0cmluZ3MgaXMgYW4gZW1wdHkKLXN0cmluZywgYnV0IGFsc28gc28geW91IGNhbiBhbHdheXMgc2FmZWx5IHBhc3MgdGhlbSB0byBpc0VxdWFsOi9jb21wYXJlOiwgZXRjLgotYW5kIGhhdmUgZGV0ZXJtaW5pc3RpYyByZXN1bHRzLgotCi1BIHByb3BlcnR5IHRoYXQgaXMgdHlwZSBOU0RhdGFcKiBhbHNvIHdvbid0IHJldHVybiBuaWwsIGl0IHdpbGwgcmV0dXJuIGFuIGVtcHR5Ci1kYXRhIChbTlNEYXRhIGRhdGFdKS4gVGhlIHJlYXNvbmluZyBpcyB0aGUgc2FtZSBhcyBmb3IgTlNTdHJpbmcgbm90IHJldHVybmluZwotbmlsLgotCi1BIHByb3BlcnR5IHRoYXQgaXMgYW5vdGhlciBHUEJNZXNzYWdlIGNsYXNzIGFsc28gd2lsbCBub3QgcmV0dXJuIG5pbC4gSWYgdGhlCi1maWVsZCB3YXNuJ3QgYWxyZWFkeSBzZXQsIHlvdSB3aWxsIGdldCBhIGluc3RhbmNlIG9mIHRoZSBjb3JyZWN0IGNsYXNzLiBUaGlzCi1pbnN0YW5jZSB3aWxsIGJlIGEgdGVtcG9yYXJ5IGluc3RhbmNlIHVubGVzcyB5b3UgbXV0YXRlIGl0LCBhdCB3aGljaCBwb2ludCBpdAotd2lsbCBiZSBhdHRhY2hlZCB0byBpdHMgcGFyZW50IG9iamVjdC4gV2UgY2FsbCB0aGlzIHBhdHRlcm4gKmF1dG9jcmVhdG9ycyouCi1TaW1pbGFyIHRvIE5TU3RyaW5nIGFuZCBOU0RhdGEgcHJvcGVydGllcyBpdCBtYWtlcyB0aGluZ3MgYSBsaXR0bGUgc2FmZXIgd2hlbgotdXNpbmcgdGhlbSB3aXRoIGlzRXF1YWw6L2V0Yy47IGJ1dCBtb3JlIGltcG9ydGFudGx5LCB0aGlzIGFsbG93cyB5b3UgdG8gd3JpdGUKLWNvZGUgdGhhdCB1c2VzIE9iamVjdGl2ZSBDJ3MgcHJvcGVydHkgZG90IG5vdGF0aW9uIHRvIHdhbGsgaW50byBuZXN0ZWQgb2JqZWN0cwotYW5kIGFjY2VzcyBhbmQvb3IgYXNzaWduIHRoaW5ncyB3aXRob3V0IGhhdmluZyB0byBjaGVjayB0aGF0IHRoZXkgYXJlIG5vdCBuaWwKLWFuZCBjcmVhdGUgdGhlbSBlYWNoIHN0ZXAgYWxvbmcgdGhlIHdheS4gWW91IGNhbiB3cml0ZSB0aGlzOgotCi1gYGAKLS0gKHZvaWQpdXBkYXRlUmVjb3JkOihNeU1lc3NhZ2UgKiltc2cgewotICAuLi4KLSAgLy8gTm90ZTogWW91IGRvbid0IGhhdmUgdG8gY2hlY2sgc3ViTWVzc2FnZSBhbmQgb3RoZXJNZXNzYWdlIGZvciBuaWwgYW5kCi0gIC8vIGFsbG9jL2luaXQvYXNzaWduIHRoZW0gYmFjayBhbG9uZyB0aGUgd2F5LgotICBtc2cuc3ViTWVzc2FnZS5vdGhlck1lc3NhZ2UubGFzdE5hbWUgPSBAIlNtaXRoIjsKLSAgLi4uCi19Ci1gYGAKLQotSWYgeW91IHdhbnQgdG8gY2hlY2sgaWYgYSBHUEJNZXNzYWdlIHByb3BlcnR5IGlzIHByZXNlbnQsIHRoZXJlIGlzIGFsd2F5cyBhcwotYGhhc1xbTkFNRVxdYCBwcm9wZXJ0eSB0byBnbyB3aXRoIHRoZSBtYWluIHByb3BlcnR5IHRvIGNoZWNrIGlmIGl0IGlzIHNldC4KLQotQSBwcm9wZXJ0eSB0aGF0IGlzIG9mIGFuIEFycmF5IG9yIERpY3Rpb25hcnkgdHlwZSBhbHNvIHByb3ZpZGVzICphdXRvY3JlYXRvcioKLWJlaGF2aW9yIGFuZCB3aWxsIG5ldmVyIHJldHVybiBuaWwuIFRoaXMgcHJvdmlkZXMgYWxsIHRoZSBzYW1lIGJlbmVmaXRzIHlvdQotc2VlIGZvciB0aGUgbWVzc2FnZSBwcm9wZXJ0aWVzLiBBZ2FpbiwgeW91IGNhbiB3cml0ZToKLQotYGBgCi0tICh2b2lkKXVwZGF0ZVJlY29yZDooTXlNZXNzYWdlICopbXNnIHsKLSAgLi4uCi0gIC8vIE5vdGU6IEp1c3QgbGlrZSBhYm92ZSwgeW91IGRvbid0IGhhdmUgdG8gY2hlY2sgc3ViTWVzc2FnZSBhbmQgb3RoZXJNZXNzYWdlCi0gIC8vIGZvciBuaWwgYW5kIGFsbG9jL2luaXQvYXNzaWduIHRoZW0gYmFjayBhbG9uZyB0aGUgd2F5LiBZb3UgYWxzbyBkb24ndCBoYXZlCi0gIC8vIHRvIGNyZWF0ZSB0aGUgc2libGluZ3NBcnJheSwgeW91IGNhbiBzYWZlbHkganVzdCBhcHBlbmQgdG8gaXQuCi0gIFttc2cuc3ViTWVzc2FnZS5vdGhlck1lc3NhZ2Uuc2libGluZ3NBcnJheSBhZGRPYmplY3Q6QCJQYXQiXTsKLSAgLi4uCi19Ci1gYGAKLQotSWYgeW91IGFyZSBpbnNwZWN0aW5nIGEgbWVzc2FnZSB5b3UgZ290IGZyb20gc29tZSBvdGhlciBwbGFjZSAoc2VydmVyLCBkaXNrLAotZXRjKSwgeW91IG1heSB3YW50IHRvIGNoZWNrIGlmIHRoZSBBcnJheSBvciBEaWN0aW9uYXJ5IGhhcyBlbnRyaWVzIHdpdGhvdXQKLWNhdXNpbmcgaXQgdG8gYmUgY3JlYXRlZCBmb3IgeW91LiBGb3IgdGhpcywgdGhlcmUgaXMgYWx3YXlzIGEgYFxbTkFNRVxdX0NvdW50YAotcHJvcGVydHkgYWxzbyBwcm92aWRlZCB0aGF0IGNhbiByZXR1cm4gemVybyBvciB0aGUgcmVhbCBjb3VudCwgYnV0IHdvbid0IHRyaWdnZXIKLXRoZSBjcmVhdGlvbi4KLQotRm9yIHByaW1pdGl2ZSB0eXBlIGZpZWxkcyAoaW50cywgZmxvYXRzLCBib29scywgZW51bSkgaW4gbWVzc2FnZXMgZGVmaW5lZCBpbiBhCi1gLnByb3RvYCBmaWxlIHRoYXQgdXNlICpwcm90bzIqIHN5bnRheCB0aGVyZSBhcmUgY29uY2VwdHVhbCBkaWZmZXJlbmNlcyBiZXR3ZWVuCi1oYXZpbmcgYW4gKmV4cGxpY2l0KiBhbmQgKmRlZmF1bHQqIHZhbHVlLiBZb3UgY2FuIGFsd2F5cyBnZXQgdGhlIHZhbHVlIG9mIHRoZQotcHJvcGVydHkuIEluIHRoZSBjYXNlIHRoYXQgaXQgaGFzbid0IGJlZW4gc2V0IHlvdSB3aWxsIGdldCB0aGUgZGVmYXVsdC4gSW4KLWNhc2VzIHdoZXJlIHlvdSBuZWVkIHRvIGtub3cgd2hldGhlciBpdCB3YXMgc2V0IGV4cGxpY2l0bHkgb3IgeW91IGFyZSBqdXN0Ci1nZXR0aW5nIHRoZSBkZWZhdWx0LCB5b3UgY2FuIHVzZSB0aGUgYGhhc1xbTkFNRVxdYCBwcm9wZXJ0eS4gSWYgdGhlIHZhbHVlIGhhcwotYmVlbiBzZXQsIGFuZCB5b3Ugd2FudCB0byBjbGVhciBpdCwgeW91IGNhbiBzZXQgdGhlIGBoYXNcW05BTUVcXWAgdG8gYE5PYC4KLSpwcm90bzMqIHN5bnRheCBtZXNzYWdlcyBkbyBhd2F5IHdpdGggdGhpcyBjb25jZXB0LCB0aHVzIHRoZSBkZWZhdWx0IHZhbHVlcyBhcmUKLW5ldmVyIGluY2x1ZGVkIHdoZW4gdGhlIG1lc3NhZ2UgaXMgZW5jb2RlZC4KLQotVGhlIE9iamVjdGl2ZSBDIGNsYXNzZXMvZW51bXMgY2FuIGJlIHVzZWQgZnJvbSBTd2lmdCBjb2RlLgotCi1PYmplY3RpdmUgQyBHZW5lcmF0b3IgT3B0aW9ucwotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotKipvYmpjX2NsYXNzX3ByZWZpeD1cPHByZWZpeFw+KiogKG5vIGRlZmF1bHQpCi0KLVNpbmNlIE9iamVjdGl2ZSBDIHVzZXMgYSBnbG9iYWwgbmFtZXNwYWNlIGZvciBhbGwgb2YgaXRzIGNsYXNzZXMsIHRoZXJlIGNhbgotYmUgY29sbGlzaW9ucy4gVGhpcyBvcHRpb24gcHJvdmlkZXMgYSBwcmVmaXggdGhhdCB3aWxsIGJlIGFkZGVkIHRvIHRoZSBFbnVtcwotYW5kIE9iamVjdHMgKGZvciBtZXNzYWdlcykgZ2VuZXJhdGVkIGZyb20gdGhlIHByb3RvLiBDb252ZW50aW9uIGlzIHRvIGJhc2UKLXRoZSBwcmVmaXggb24gdGhlIHBhY2thZ2UgdGhlIHByb3RvIGlzIGluLgotCi1Db250cmlidXRpbmcKLS0tLS0tLS0tLS0tLQotCi1QbGVhc2UgbWFrZSB1cGRhdGVzIHRvIHRoZSB0ZXN0cyBhbG9uZyB3aXRoIGNoYW5nZXMuIElmIGp1c3QgY2hhbmdpbmcgdGhlCi1ydW50aW1lLCB0aGUgWGNvZGUgcHJvamVjdHMgY2FuIGJlIHVzZWQgdG8gYnVpbGQgYW5kIHJ1biB0ZXN0cy4gSWYgeW91ciBjaGFuZ2UKLWFsc28gcmVxdWlyZXMgY2hhbmdlcyB0byB0aGUgZ2VuZXJhdGVkIGNvZGUsCi1gb2JqZWN0aXZlYy9EZXZUb29scy9mdWxsX21hY19idWlsZC5zaGAgY2FuIGJlIHVzZWQgdG8gZWFzaWx5IHJlYnVpbGQgYW5kIHRlc3QKLWNoYW5nZXMuIFBhc3NpbmcgYC1oYCB0byB0aGUgc2NyaXB0IHdpbGwgc2hvdyB0aGUgYWRkaXRpb24gb3B0aW9ucyB0aGF0IGNvdWxkCi1iZSB1c2VmdWwuCi0KLURvY3VtZW50YXRpb24KLS0tLS0tLS0tLS0tLS0KLQotVGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gZm9yIFByb3RvY29sIEJ1ZmZlcnMgaXMgYXZhaWxhYmxlIHZpYSB0aGUKLXdlYiBhdDoKLQotICAgIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkFSQ1VuaXR0ZXN0UHJvdG9zLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkFSQ1VuaXR0ZXN0UHJvdG9zLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ZDIzOTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJBUkNVbml0dGVzdFByb3Rvcy5tCisrKyAvZGV2L251bGwKQEAgLTEsNjEgKzAsMCBAQAotI2lmICFkZWZpbmVkKF9faGFzX2ZlYXR1cmUpIHx8ICFfX2hhc19mZWF0dXJlKG9iamNfYXJjKQotI2Vycm9yICJUaGlzIGZpbGUgcmVxdWlyZXMgQVJDIHN1cHBvcnQuIgotI2VuZGlmCi0KLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBNYWtlcyBzdXJlIGFsbCB0aGUgZ2VuZXJhdGVkIGhlYWRlcnMgY29tcGlsZSB3aXRoIEFSQyBvbi4KLQotLy8gVGhlIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIGV4dGVuZHMgdGhlIG1lc3NhZ2VzIGluIGRlc2NyaXB0b3IucHJvdG8KLS8vIHNvIHdlIGJ1aWxkIGl0IGluIHRvIHRlc3QgZXh0ZW5kaW5nIGluIGdlbmVyYWwuIFRoZSBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZQotLy8gYSBkZXNjcmlwdG9yIGFzIGl0IGRvZXNuJ3QgdXNlIHRoZSBjbGFzc2VzL2VudW1zLgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3IucGJvYmpjLmgiCi0KLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdEN1c3RvbU9wdGlvbnMucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RDeWNsZS5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdERyb3BVbmtub3duRmllbGRzLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0RW1iZWRPcHRpbWl6ZUZvci5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdEVtcHR5LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0RW5vcm1vdXNEZXNjcmlwdG9yLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0SW1wb3J0LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0SW1wb3J0TGl0ZS5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdEltcG9ydFB1YmxpYy5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdEltcG9ydFB1YmxpY0xpdGUucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RMaXRlLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0TXNldC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0T2JqYy5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdE9iamNTdGFydHVwLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0T3B0aW1pemVGb3IucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RQcmVzZXJ2ZVVua25vd25FbnVtLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UnVudGltZVByb3RvMi5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdFJ1bnRpbWVQcm90bzMucGJvYmpjLmgiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkFycmF5VGVzdHMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCQXJyYXlUZXN0cy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwZmIxNWU0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCQXJyYXlUZXN0cy5tCisrKyAvZGV2L251bGwKQEAgLTEsMzQzOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0IDxYQ1Rlc3QvWENUZXN0Lmg+Ci0KLSNpbXBvcnQgIkdQQkFycmF5LmgiCi0KLSNpbXBvcnQgIkdQQlRlc3RVdGlsaXRpZXMuaCIKLQotLy8gVG8gbGV0IHRoZSB0ZXN0aW5nIG1hY3JvcyB3b3JrLCBhZGQgc29tZSBleHRyYSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoaW5ncy4KLUBpbnRlcmZhY2UgR1BCRW51bUFycmF5IChUZXN0aW5nVHdlYWspCi0rIChpbnN0YW5jZXR5cGUpYXJyYXlXaXRoVmFsdWU6KGludDMyX3QpdmFsdWU7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci1AZW5kCi0KLXN0YXRpYyBCT09MIFRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlKSB7Ci0gIHN3aXRjaCAodmFsdWUpIHsKLSAgICBjYXNlIDcxOgotICAgIGNhc2UgNzI6Ci0gICAgY2FzZSA3MzoKLSAgICBjYXNlIDc0OgotICAgICAgcmV0dXJuIFlFUzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5POwotICB9Ci19Ci0KLXN0YXRpYyBCT09MIFRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZTIoaW50MzJfdCB2YWx1ZSkgewotICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgY2FzZSA3MToKLSAgICBjYXNlIDcyOgotICAgIGNhc2UgNzM6Ci0gICAgICByZXR1cm4gWUVTOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTk87Ci0gIH0KLX0KLQotQGltcGxlbWVudGF0aW9uIEdQQkVudW1BcnJheSAoVGVzdGluZ1R3ZWFrKQotKyAoaW5zdGFuY2V0eXBlKWFycmF5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIHsKLSAgcmV0dXJuIFtbW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XTsKLX0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gUERETSBNYWNyb3MKLQotLy8lUERETS1ERUZJTkUgQVJSQVlfVEVTVFMoTkFNRSwgVFlQRSwgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCkKLS8vJUFSUkFZX1RFU1RTMihOQU1FLCBUWVBFLCBWQUwxLCBWQUwyLCBWQUwzLCBWQUw0LCApCi0vLyVQRERNLURFRklORSBBUlJBWV9URVNUUzIoTkFNRSwgVFlQRSwgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCwgSEVMUEVSKQotLy8lI3ByYWdtYSBtYXJrIC0gTkFNRQotLy8lCi0vLyVAaW50ZXJmYWNlIEdQQiMjTkFNRSMjQXJyYXlUZXN0cyA6IFhDVGVzdENhc2UKLS8vJUBlbmQKLS8vJQotLy8lQGltcGxlbWVudGF0aW9uIEdQQiMjTkFNRSMjQXJyYXlUZXN0cwotLy8lCi0vLyUtICh2b2lkKXRlc3RFbXB0eSB7Ci0vLyUgIEdQQiMjTkFNRSMjQXJyYXkgKmFycmF5ID0gW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLS8vJSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0vLyUgIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihUWVBFIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotLy8lICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0vLyUgICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLS8vJSAgfV07Ci0vLyUgIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotLy8lICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihUWVBFIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotLy8lICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0vLyUgICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLS8vJSAgfV07Ci0vLyUgIFthcnJheSByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0T25lIHsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkgPSBbR1BCIyNOQU1FIyNBcnJheSBhcnJheVdpdGhWYWx1ZTpWQUwxXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgVkFMMSk7Ci0vLyUgIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotLy8lICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oVFlQRSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgVkFMMSk7Ci0vLyUgICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0vLyUgIH1dOwotLy8lICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oVFlQRSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgVkFMMSk7Ci0vLyUgICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0vLyUgIH1dOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RCYXNpY3MgewotLy8lICBzdGF0aWMgY29uc3QgVFlQRSBrVmFsdWVzW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQgfTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkgPQotLy8lICAgICAgW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBWQUwxKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgVkFMMik7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIFZBTDMpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCBWQUw0KTsKLS8vJSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0vLyUgIF9fYmxvY2sgTlNVSW50ZWdlciBpZHgyID0gMDsKLS8vJSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKFRZUEUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0vLyUgICAgWENUQXNzZXJ0RXF1YWwoaWR4LCBpZHgyKTsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLS8vJSAgICArK2lkeDI7Ci0vLyUgIH1dOwotLy8lICBpZHgyID0gMDsKLS8vJSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKFRZUEUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0vLyUgICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAoMyAtIGlkeDIpKTsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLS8vJSAgICArK2lkeDI7Ci0vLyUgIH1dOwotLy8lICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0vLyUgIGlkeDIgPSAwOwotLy8lICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oVFlQRSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotLy8lICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotLy8lICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotLy8lICAgIGlmIChpZHgyID09IDEpICpzdG9wID0gWUVTOwotLy8lICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotLy8lICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgM1UpOwotLy8lICAgICsraWR4MjsKLS8vJSAgfV07Ci0vLyUgIGlkeDIgPSAwOwotLy8lICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oVFlQRSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsICgzIC0gaWR4MikpOwotLy8lICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotLy8lICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotLy8lICAgIGlmIChpZHgyID09IDEpICpzdG9wID0gWUVTOwotLy8lICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMVUpOwotLy8lICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMFUpOwotLy8lICAgICsraWR4MjsKLS8vJSAgfV07Ci0vLyUgIFthcnJheSByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotLy8lICBjb25zdCBUWVBFIGtWYWx1ZXMxW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMgfTsKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzMltdID0geyBWQUwxLCBWQUw0LCBWQUwzIH07Ci0vLyUgIGNvbnN0IFRZUEUga1ZhbHVlczNbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCB9OwotLy8lICBHUEIjI05BTUUjI0FycmF5ICphcnJheTEgPQotLy8lICAgICAgW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotLy8lICAgICAgICAgICAgTkFNRSRTICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChhcnJheTEpOwotLy8lICBHUEIjI05BTUUjI0FycmF5ICphcnJheTFwcmltZSA9Ci0vLyUgICAgICBbW0dQQiMjTkFNRSMjQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MXByaW1lKTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkyID0KLS8vJSAgICAgIFtbR1BCIyNOQU1FIyNBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLS8vJSAgICAgICAgICAgIE5BTUUkUyAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkzID0KLS8vJSAgICAgIFtbR1BCIyNOQU1FIyNBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLS8vJSAgICAgICAgICAgIE5BTUUkUyAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkzKTsKLS8vJQotLy8lICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXkxLCBhcnJheTFwcmltZSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5MXByaW1lKTsKLS8vJSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5MSBoYXNoXSwgW2FycmF5MXByaW1lIGhhc2hdKTsKLS8vJQotLy8lICAvLyAxLzIvMyBzaG91bGRuJ3QgYmUgZXF1YWwuCi0vLyUgIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5Mik7Ci0vLyUgIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5Myk7Ci0vLyUgIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTIsIGFycmF5Myk7Ci0vLyUKLS8vJSAgW2FycmF5MSByZWxlYXNlXTsKLS8vJSAgW2FycmF5MXByaW1lIHJlbGVhc2VdOwotLy8lICBbYXJyYXkyIHJlbGVhc2VdOwotLy8lICBbYXJyYXkzIHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RDb3B5IHsKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQgfTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkgPQotLy8lICAgICAgW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotLy8lCi0vLyUgIEdQQiMjTkFNRSMjQXJyYXkgKmFycmF5MiA9IFthcnJheSBjb3B5XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0vLyUKLS8vJSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotLy8lICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotLy8lICBbYXJyYXkyIHJlbGVhc2VdOwotLy8lICBbYXJyYXkgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdEFycmF5RnJvbUFycmF5IHsKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQgfTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkgPQotLy8lICAgICAgW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotLy8lCi0vLyUgIEdQQiMjTkFNRSMjQXJyYXkgKmFycmF5MiA9IFtHUEIjI05BTUUjI0FycmF5IGFycmF5V2l0aFZhbHVlQXJyYXk6YXJyYXldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLS8vJQotLy8lICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotLy8lICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotLy8lICBbYXJyYXkgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdEFkZHMgewotLy8lICBHUEIjI05BTUUjI0FycmF5ICphcnJheSA9IFtHUEIjI05BTUUjI0FycmF5IGFycmF5XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLS8vJQotLy8lICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotLy8lICBbYXJyYXkgYWRkVmFsdWU6VkFMMV07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAxVSk7Ci0vLyUKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzMVtdID0geyBWQUwyLCBWQUwzIH07Ci0vLyUgIFthcnJheSBhZGRWYWx1ZXM6a1ZhbHVlczEgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0vLyUKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzMltdID0geyBWQUw0LCBWQUwxIH07Ci0vLyUgIEdQQiMjTkFNRSMjQXJyYXkgKmFycmF5MiA9Ci0vLyUgICAgICBbW0dQQiMjTkFNRSMjQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0vLyUgIFthcnJheSBhZGQjI0hFTFBFUiMjVmFsdWVzRnJvbUFycmF5OmFycmF5Ml07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0vLyUKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgVkFMMSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIFZBTDIpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBWQUwzKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgVkFMNCk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIFZBTDEpOwotLy8lICBbYXJyYXkyIHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RJbnNlcnQgewotLy8lICBjb25zdCBUWVBFIGtWYWx1ZXNbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMyB9OwotLy8lICBHUEIjI05BTUUjI0FycmF5ICphcnJheSA9Ci0vLyUgICAgICBbW0dQQiMjTkFNRSMjQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLS8vJSAgICAgICAgICAgIE5BTUUkUyAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0vLyUKLS8vJSAgLy8gRmlyc3QKLS8vJSAgW2FycmF5IGluc2VydFZhbHVlOlZBTDQgYXRJbmRleDowXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLS8vJQotLy8lICAvLyBNaWRkbGUKLS8vJSAgW2FycmF5IGluc2VydFZhbHVlOlZBTDQgYXRJbmRleDoyXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLS8vJQotLy8lICAvLyBFbmQKLS8vJSAgW2FycmF5IGluc2VydFZhbHVlOlZBTDQgYXRJbmRleDo1XTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLS8vJQotLy8lICAvLyBUb28gZmFyLgotLy8lICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBpbnNlcnRWYWx1ZTpWQUw0IGF0SW5kZXg6N10sCi0vLyUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotLy8lCi0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIFZBTDQpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBWQUwxKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgVkFMNCk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIFZBTDIpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCBWQUwzKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDo1XSwgVkFMNCk7Ci0vLyUgIFthcnJheSByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzW10gPSB7IFZBTDQsIFZBTDEsIFZBTDIsIFZBTDQsIFZBTDMsIFZBTDQgfTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkgPQotLy8lICAgICAgW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNlUpOwotLy8lCi0vLyUgIC8vIEZpcnN0Ci0vLyUgIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6MF07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIFZBTDEpOwotLy8lCi0vLyUgIC8vIE1pZGRsZQotLy8lICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBWQUwzKTsKLS8vJQotLy8lICAvLyBFbmQKLS8vJSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLS8vJQotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBWQUwxKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgVkFMMik7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIFZBTDMpOwotLy8lCi0vLyUgIC8vIFRvbyBmYXIuCi0vLyUgIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXSwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0vLyUKLS8vJSAgW2FycmF5IHJlbW92ZUFsbF07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0vLyUgIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDowXSwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0vLyUgIFthcnJheSByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzW10gPSB7IFZBTDEsIFZBTDEsIFZBTDMsIFZBTDMgfTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkgPQotLy8lICAgICAgW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotLy8lCi0vLyUgIFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOlZBTDJdOwotLy8lICBbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDozIHdpdGhWYWx1ZTpWQUw0XTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgVkFMMSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIFZBTDIpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBWQUwzKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgVkFMNCk7Ci0vLyUKLS8vJSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZTpWQUw0XSwKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0vLyUKLS8vJSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlQXRJbmRleDozXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgVkFMMSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIFZBTDQpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBWQUwzKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgVkFMMik7Ci0vLyUKLS8vJSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjIgd2l0aFZhbHVlQXRJbmRleDowXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgVkFMMyk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIFZBTDQpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBWQUwxKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgVkFMMik7Ci0vLyUKLS8vJSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6NCB3aXRoVmFsdWVBdEluZGV4OjFdLAotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLS8vJSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWVBdEluZGV4OjRdLAotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLS8vJSAgW2FycmF5IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RJbnRlcm5hbFJlc2l6aW5nIHsKLS8vJSAgY29uc3QgVFlQRSBrVmFsdWVzW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQgfTsKLS8vJSAgR1BCIyNOQU1FIyNBcnJheSAqYXJyYXkgPQotLy8lICAgICAgW1tHUEIjI05BTUUjI0FycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0vLyUgICAgICAgICAgICBOQU1FJFMgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotLy8lCi0vLyUgIC8vIEFkZC9yZW1vdmUgdG8gdHJpZ2dlciB0aGUgaW50bmVyYWwgYnVmZmVyIHRvIGdyb3cvc2hyaW5rLgotLy8lICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0vLyUgICAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0vLyUgIH0KLS8vJSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotLy8lICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0vLyUgICAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDooaSAqIDIpXTsKLS8vJSAgfQotLy8lICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMzA0VSk7Ci0vLyUgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLS8vJSAgICBbYXJyYXkgaW5zZXJ0VmFsdWU6VkFMNCBhdEluZGV4OihpICogMyldOwotLy8lICB9Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0MDRVKTsKLS8vJSAgW2FycmF5IHJlbW92ZUFsbF07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0vLyUgIFthcnJheSByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lQGVuZAotLy8lCi0vLyVQRERNLUVYUEFORCBBUlJBWV9URVNUUyhJbnQzMiwgaW50MzJfdCwgMSwgMiwgMywgNCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkludDMyQXJyYXlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyQXJyYXlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDMyQXJyYXkgKmFycmF5ID0gW1tHUEJJbnQzMkFycmF5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50MzJBcnJheSAqYXJyYXkgPSBbR1BCSW50MzJBcnJheSBhcnJheVdpdGhWYWx1ZToxXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBzdGF0aWMgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDEsIDIsIDMsIDQgfTsKLSAgR1BCSW50MzJBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDEpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCAyKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMyk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDQpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsICgzIC0gaWR4MikpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgaWR4Mik7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAzVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAxVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAwVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgMSwgMiwgMyB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDEsIDQsIDMgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyAxLCAyLCAzLCA0IH07Ci0gIEdQQkludDMyQXJyYXkgKmFycmF5MSA9Ci0gICAgICBbW0dQQkludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkxKTsKLSAgR1BCSW50MzJBcnJheSAqYXJyYXkxcHJpbWUgPQotICAgICAgW1tHUEJJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MXByaW1lKTsKLSAgR1BCSW50MzJBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCSW50MzJBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBHUEJJbnQzMkFycmF5ICphcnJheTMgPQotICAgICAgW1tHUEJJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Myk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5MSwgYXJyYXkxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheTEgaGFzaF0sIFthcnJheTFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMS8yLzMgc2hvdWxkbid0IGJlIGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTIpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTMpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkyLCBhcnJheTMpOwotCi0gIFthcnJheTEgcmVsZWFzZV07Ci0gIFthcnJheTFwcmltZSByZWxlYXNlXTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLSAgW2FycmF5MyByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAxLCAyLCAzLCA0IH07Ci0gIEdQQkludDMyQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCSW50MzJBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQkludDMyQXJyYXkgKmFycmF5MiA9IFthcnJheSBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotICBbYXJyYXkyIHJlbGVhc2VdOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFycmF5RnJvbUFycmF5IHsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDEsIDIsIDMsIDQgfTsKLSAgR1BCSW50MzJBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgR1BCSW50MzJBcnJheSAqYXJyYXkyID0gW0dQQkludDMyQXJyYXkgYXJyYXlXaXRoVmFsdWVBcnJheTphcnJheV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5LCBhcnJheTIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXksIGFycmF5Mik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDMyQXJyYXkgKmFycmF5ID0gW0dQQkludDMyQXJyYXkgYXJyYXldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFthcnJheSBhZGRWYWx1ZToxXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLQotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMxW10gPSB7IDIsIDMgfTsKLSAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzMSBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDQsIDEgfTsKLSAgR1BCSW50MzJBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCSW50MzJBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBbYXJyYXkgYWRkVmFsdWVzRnJvbUFycmF5OmFycmF5Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDIpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIDEpOwotICBbYXJyYXkyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnNlcnQgewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMSwgMiwgMyB9OwotICBHUEJJbnQzMkFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICAvLyBGaXJzdAotICBbYXJyYXkgaW5zZXJ0VmFsdWU6NCBhdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgaW5zZXJ0VmFsdWU6NCBhdEluZGV4OjJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotCi0gIC8vIEVuZAotICBbYXJyYXkgaW5zZXJ0VmFsdWU6NCBhdEluZGV4OjVdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNlUpOwotCi0gIC8vIFRvbyBmYXIuCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IGluc2VydFZhbHVlOjQgYXRJbmRleDo3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDEpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA0KTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIDMpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjVdLCA0KTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNCwgMSwgMiwgNCwgMywgNCB9OwotICBHUEJJbnQzMkFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLQotICAvLyBGaXJzdAotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCAxKTsKLQotICAvLyBNaWRkbGUKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDoyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMyk7Ci0KLSAgLy8gRW5kCi0gIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDIpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzKTsKLQotICAvLyBUb28gZmFyLgotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6M10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFthcnJheSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAxLCAxLCAzLCAzIH07Ci0gIEdQQkludDMyQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCSW50MzJBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjJdOwotICBbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDozIHdpdGhWYWx1ZTo0XTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDIpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNCk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZTo0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlQXRJbmRleDozXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMik7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjIgd2l0aFZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMyk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAxKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMik7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6NCB3aXRoVmFsdWVBdEluZGV4OjFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWVBdEluZGV4OjRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnRlcm5hbFJlc2l6aW5nIHsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDEsIDIsIDMsIDQgfTsKLSAgR1BCSW50MzJBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgLy8gQWRkL3JlbW92ZSB0byB0cmlnZ2VyIHRoZSBpbnRuZXJhbCBidWZmZXIgdG8gZ3Jvdy9zaHJpbmsuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgYWRkVmFsdWVzOmtWYWx1ZXMgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNDA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OihpICogMildOwotICB9Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzMDRVKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIFthcnJheSBpbnNlcnRWYWx1ZTo0IGF0SW5kZXg6KGkgKiAzKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBbYXJyYXkgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIEFSUkFZX1RFU1RTKFVJbnQzMiwgdWludDMyX3QsIDExVSwgMTJVLCAxM1UsIDE0VSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIKLQotQGludGVyZmFjZSBHUEJVSW50MzJBcnJheVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDMyQXJyYXlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlVJbnQzMkFycmF5ICphcnJheSA9IFtbR1BCVUludDMyQXJyYXkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6Xih1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZCh2YWx1ZSwgaWR4LCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlVJbnQzMkFycmF5ICphcnJheSA9IFtHUEJVSW50MzJBcnJheSBhcnJheVdpdGhWYWx1ZToxMVVdOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCAxMVUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgMFUpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMVUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgMFUpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMVUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgc3RhdGljIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTFVLCAxMlUsIDEzVSwgMTRVIH07Ci0gIEdQQlVJbnQzMkFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQlVJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCAxMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCAxMlUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAxM1UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCAxNFUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCBpZHgyKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDI7Ci0gIH1dOwotICBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgaWR4Mik7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAzVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6Xih1aW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsICgzIC0gaWR4MikpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgIGlmIChpZHgyID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMVUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMFUpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMVtdID0geyAxMVUsIDEyVSwgMTNVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDExVSwgMTRVLCAxM1UgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczNbXSA9IHsgMTFVLCAxMlUsIDEzVSwgMTRVIH07Ci0gIEdQQlVJbnQzMkFycmF5ICphcnJheTEgPQotICAgICAgW1tHUEJVSW50MzJBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkxKTsKLSAgR1BCVUludDMyQXJyYXkgKmFycmF5MXByaW1lID0KLSAgICAgIFtbR1BCVUludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MXByaW1lKTsKLSAgR1BCVUludDMyQXJyYXkgKmFycmF5MiA9Ci0gICAgICBbW0dQQlVJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBHUEJVSW50MzJBcnJheSAqYXJyYXkzID0KLSAgICAgIFtbR1BCVUludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Myk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5MSwgYXJyYXkxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheTEgaGFzaF0sIFthcnJheTFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMS8yLzMgc2hvdWxkbid0IGJlIGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTIpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTMpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkyLCBhcnJheTMpOwotCi0gIFthcnJheTEgcmVsZWFzZV07Ci0gIFthcnJheTFwcmltZSByZWxlYXNlXTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLSAgW2FycmF5MyByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTFVLCAxMlUsIDEzVSwgMTRVIH07Ci0gIEdQQlVJbnQzMkFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQlVJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQlVJbnQzMkFycmF5ICphcnJheTIgPSBbYXJyYXkgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXksIGFycmF5Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheSwgYXJyYXkyKTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBcnJheUZyb21BcnJheSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTFVLCAxMlUsIDEzVSwgMTRVIH07Ci0gIEdQQlVJbnQzMkFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQlVJbnQzMkFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQlVJbnQzMkFycmF5ICphcnJheTIgPSBbR1BCVUludDMyQXJyYXkgYXJyYXlXaXRoVmFsdWVBcnJheTphcnJheV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5LCBhcnJheTIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXksIGFycmF5Mik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMkFycmF5ICphcnJheSA9IFtHUEJVSW50MzJBcnJheSBhcnJheV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgW2FycmF5IGFkZFZhbHVlOjExVV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczFbXSA9IHsgMTJVLCAxM1UgfTsKLSAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzMSBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxNFUsIDExVSB9OwotICBHUEJVSW50MzJBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCVUludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0gIFthcnJheSBhZGRWYWx1ZXNGcm9tQXJyYXk6YXJyYXkyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCAxMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCAxMlUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAxM1UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCAxNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCAxMVUpOwotICBbYXJyYXkyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnNlcnQgewotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDExVSwgMTJVLCAxM1UgfTsKLSAgR1BCVUludDMyQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCVUludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgLy8gRmlyc3QKLSAgW2FycmF5IGluc2VydFZhbHVlOjE0VSBhdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgaW5zZXJ0VmFsdWU6MTRVIGF0SW5kZXg6Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0KLSAgLy8gRW5kCi0gIFthcnJheSBpbnNlcnRWYWx1ZToxNFUgYXRJbmRleDo1XTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLQotICAvLyBUb28gZmFyLgotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBpbnNlcnRWYWx1ZToxNFUgYXRJbmRleDo3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMTRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgMTFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMTRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMTJVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDo0XSwgMTNVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDo1XSwgMTRVKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDE0VSwgMTFVLCAxMlUsIDE0VSwgMTNVLCAxNFUgfTsKLSAgR1BCVUludDMyQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCVUludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA2VSk7Ci0KLSAgLy8gRmlyc3QKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMTFVKTsKLQotICAvLyBNaWRkbGUKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDoyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMTNVKTsKLQotICAvLyBFbmQKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCAxMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCAxMlUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAxM1UpOwotCi0gIC8vIFRvbyBmYXIuCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgW2FycmF5IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDowXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMVUsIDExVSwgMTNVLCAxM1UgfTsKLSAgR1BCVUludDMyQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCVUludDMyQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6MTJVXTsKLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MyB3aXRoVmFsdWU6MTRVXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMTFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgMTJVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMTNVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMTRVKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjQgd2l0aFZhbHVlOjE0VV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDExVSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDE0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDEzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDEyVSk7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjIgd2l0aFZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMTNVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgMTRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMTFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMTJVKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZUF0SW5kZXg6MV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6NF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEludGVybmFsUmVzaXppbmcgewotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDExVSwgMTJVLCAxM1UsIDE0VSB9OwotICBHUEJVSW50MzJBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJVSW50MzJBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLQotICAvLyBBZGQvcmVtb3ZlIHRvIHRyaWdnZXIgdGhlIGludG5lcmFsIGJ1ZmZlciB0byBncm93L3Nocmluay4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIFthcnJheSBhZGRWYWx1ZXM6a1ZhbHVlcyBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICB9Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0MDRVKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6KGkgKiAyKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDMwNFUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IGluc2VydFZhbHVlOjE0VSBhdEluZGV4OihpICogMyldOwotICB9Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0MDRVKTsKLSAgW2FycmF5IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBBUlJBWV9URVNUUyhJbnQ2NCwgaW50NjRfdCwgMzFMTCwgMzJMTCwgMzNMTCwgMzRMTCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkludDY0QXJyYXlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDY0QXJyYXlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDY0QXJyYXkgKmFycmF5ID0gW1tHUEJJbnQ2NEFycmF5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50NjRBcnJheSAqYXJyYXkgPSBbR1BCSW50NjRBcnJheSBhcnJheVdpdGhWYWx1ZTozMUxMXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMzFMTCk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzFMTCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oaW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzFMTCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBzdGF0aWMgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDMxTEwsIDMyTEwsIDMzTEwsIDM0TEwgfTsKLSAgR1BCSW50NjRBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDMxTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCAzMkxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMzNMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDM0TEwpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oaW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsICgzIC0gaWR4MikpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgaWR4Mik7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAzVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAxVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAwVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczFbXSA9IHsgMzFMTCwgMzJMTCwgMzNMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDMxTEwsIDM0TEwsIDMzTEwgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzM1tdID0geyAzMUxMLCAzMkxMLCAzM0xMLCAzNExMIH07Ci0gIEdQQkludDY0QXJyYXkgKmFycmF5MSA9Ci0gICAgICBbW0dQQkludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkxKTsKLSAgR1BCSW50NjRBcnJheSAqYXJyYXkxcHJpbWUgPQotICAgICAgW1tHUEJJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MXByaW1lKTsKLSAgR1BCSW50NjRBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCSW50NjRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBHUEJJbnQ2NEFycmF5ICphcnJheTMgPQotICAgICAgW1tHUEJJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Myk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5MSwgYXJyYXkxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheTEgaGFzaF0sIFthcnJheTFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMS8yLzMgc2hvdWxkbid0IGJlIGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTIpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTMpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoYXJyYXkyLCBhcnJheTMpOwotCi0gIFthcnJheTEgcmVsZWFzZV07Ci0gIFthcnJheTFwcmltZSByZWxlYXNlXTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLSAgW2FycmF5MyByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyAzMUxMLCAzMkxMLCAzM0xMLCAzNExMIH07Ci0gIEdQQkludDY0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCSW50NjRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQkludDY0QXJyYXkgKmFycmF5MiA9IFthcnJheSBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotICBbYXJyYXkyIHJlbGVhc2VdOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFycmF5RnJvbUFycmF5IHsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDMxTEwsIDMyTEwsIDMzTEwsIDM0TEwgfTsKLSAgR1BCSW50NjRBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgR1BCSW50NjRBcnJheSAqYXJyYXkyID0gW0dQQkludDY0QXJyYXkgYXJyYXlXaXRoVmFsdWVBcnJheTphcnJheV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5LCBhcnJheTIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXksIGFycmF5Mik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDY0QXJyYXkgKmFycmF5ID0gW0dQQkludDY0QXJyYXkgYXJyYXldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFthcnJheSBhZGRWYWx1ZTozMUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLQotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMxW10gPSB7IDMyTEwsIDMzTEwgfTsKLSAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzMSBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDM0TEwsIDMxTEwgfTsKLSAgR1BCSW50NjRBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCSW50NjRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBbYXJyYXkgYWRkVmFsdWVzRnJvbUFycmF5OmFycmF5Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMzFMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDMyTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzM0xMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMzRMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIDMxTEwpOwotICBbYXJyYXkyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnNlcnQgewotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzFMTCwgMzJMTCwgMzNMTCB9OwotICBHUEJJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICAvLyBGaXJzdAotICBbYXJyYXkgaW5zZXJ0VmFsdWU6MzRMTCBhdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgaW5zZXJ0VmFsdWU6MzRMTCBhdEluZGV4OjJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotCi0gIC8vIEVuZAotICBbYXJyYXkgaW5zZXJ0VmFsdWU6MzRMTCBhdEluZGV4OjVdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNlUpOwotCi0gIC8vIFRvbyBmYXIuCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IGluc2VydFZhbHVlOjM0TEwgYXRJbmRleDo3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMzRMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDMxTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzNExMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMzJMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIDMzTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjVdLCAzNExMKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzRMTCwgMzFMTCwgMzJMTCwgMzRMTCwgMzNMTCwgMzRMTCB9OwotICBHUEJJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLQotICAvLyBGaXJzdAotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCAzMUxMKTsKLQotICAvLyBNaWRkbGUKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDoyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgMzNMTCk7Ci0KLSAgLy8gRW5kCi0gIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMzFMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDMyTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzM0xMKTsKLQotICAvLyBUb28gZmFyLgotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6M10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFthcnJheSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyAzMUxMLCAzMUxMLCAzM0xMLCAzM0xMIH07Ci0gIEdQQkludDY0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCSW50NjRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjMyTExdOwotICBbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDozIHdpdGhWYWx1ZTozNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMzFMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDMyTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzM0xMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMzRMTCk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZTozNExMXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlQXRJbmRleDozXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMzFMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDM0TEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzM0xMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMzJMTCk7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjIgd2l0aFZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgMzNMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDM0TEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCAzMUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgMzJMTCk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6NCB3aXRoVmFsdWVBdEluZGV4OjFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWVBdEluZGV4OjRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnRlcm5hbFJlc2l6aW5nIHsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDMxTEwsIDMyTEwsIDMzTEwsIDM0TEwgfTsKLSAgR1BCSW50NjRBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgLy8gQWRkL3JlbW92ZSB0byB0cmlnZ2VyIHRoZSBpbnRuZXJhbCBidWZmZXIgdG8gZ3Jvdy9zaHJpbmsuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgYWRkVmFsdWVzOmtWYWx1ZXMgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNDA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OihpICogMildOwotICB9Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzMDRVKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIFthcnJheSBpbnNlcnRWYWx1ZTozNExMIGF0SW5kZXg6KGkgKiAzKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBbYXJyYXkgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIEFSUkFZX1RFU1RTKFVJbnQ2NCwgdWludDY0X3QsIDQxVUxMLCA0MlVMTCwgNDNVTEwsIDQ0VUxMKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEFycmF5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRBcnJheVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDY0QXJyYXkgKmFycmF5ID0gW1tHUEJVSW50NjRBcnJheSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQodmFsdWUsIGlkeCwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDY0QXJyYXkgKmFycmF5ID0gW0dQQlVJbnQ2NEFycmF5IGFycmF5V2l0aFZhbHVlOjQxVUxMXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNDFVTEwpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgMFUpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MVVMTCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAwVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQxVUxMKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIHN0YXRpYyBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDQxVUxMLCA0MlVMTCwgNDNVTEwsIDQ0VUxMIH07Ci0gIEdQQlVJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQlVJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA0MVVMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDQyVUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNDNVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCA0NFVMTCk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHZhbHVlQXRJbmRleDo0XSwgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xih1aW50NjRfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAoMyAtIGlkeDIpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDI7Ci0gIH1dOwotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4odWludDY0X3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCBpZHgyKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICBpZiAoaWR4MiA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDNVKTsKLSAgICArK2lkeDI7Ci0gIH1dOwotICBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKHVpbnQ2NF90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAxVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAwVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMxW10gPSB7IDQxVUxMLCA0MlVMTCwgNDNVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDFVTEwsIDQ0VUxMLCA0M1VMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzM1tdID0geyA0MVVMTCwgNDJVTEwsIDQzVUxMLCA0NFVMTCB9OwotICBHUEJVSW50NjRBcnJheSAqYXJyYXkxID0KLSAgICAgIFtbR1BCVUludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MSk7Ci0gIEdQQlVJbnQ2NEFycmF5ICphcnJheTFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTFwcmltZSk7Ci0gIEdQQlVJbnQ2NEFycmF5ICphcnJheTIgPQotICAgICAgW1tHUEJVSW50NjRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLSAgR1BCVUludDY0QXJyYXkgKmFycmF5MyA9Ci0gICAgICBbW0dQQlVJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTMpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheTEsIGFycmF5MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkxIGhhc2hdLCBbYXJyYXkxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDEvMi8zIHNob3VsZG4ndCBiZSBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkzKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MiwgYXJyYXkzKTsKLQotICBbYXJyYXkxIHJlbGVhc2VdOwotICBbYXJyYXkxcHJpbWUgcmVsZWFzZV07Ci0gIFthcnJheTIgcmVsZWFzZV07Ci0gIFthcnJheTMgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDQxVUxMLCA0MlVMTCwgNDNVTEwsIDQ0VUxMIH07Ci0gIEdQQlVJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQlVJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQlVJbnQ2NEFycmF5ICphcnJheTIgPSBbYXJyYXkgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXksIGFycmF5Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheSwgYXJyYXkyKTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBcnJheUZyb21BcnJheSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDFVTEwsIDQyVUxMLCA0M1VMTCwgNDRVTEwgfTsKLSAgR1BCVUludDY0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCVUludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgR1BCVUludDY0QXJyYXkgKmFycmF5MiA9IFtHUEJVSW50NjRBcnJheSBhcnJheVdpdGhWYWx1ZUFycmF5OmFycmF5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXksIGFycmF5Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheSwgYXJyYXkyKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCVUludDY0QXJyYXkgKmFycmF5ID0gW0dQQlVJbnQ2NEFycmF5IGFycmF5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBbYXJyYXkgYWRkVmFsdWU6NDFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMVUpOwotCi0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMxW10gPSB7IDQyVUxMLCA0M1VMTCB9OwotICBbYXJyYXkgYWRkVmFsdWVzOmtWYWx1ZXMxIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDQ0VUxMLCA0MVVMTCB9OwotICBHUEJVSW50NjRBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCVUludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0gIFthcnJheSBhZGRWYWx1ZXNGcm9tQXJyYXk6YXJyYXkyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA0MVVMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDQyVUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNDNVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCA0NFVMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIDQxVUxMKTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5zZXJ0IHsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyA0MVVMTCwgNDJVTEwsIDQzVUxMIH07Ci0gIEdQQlVJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQlVJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIC8vIEZpcnN0Ci0gIFthcnJheSBpbnNlcnRWYWx1ZTo0NFVMTCBhdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgaW5zZXJ0VmFsdWU6NDRVTEwgYXRJbmRleDoyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICAvLyBFbmQKLSAgW2FycmF5IGluc2VydFZhbHVlOjQ0VUxMIGF0SW5kZXg6NV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA2VSk7Ci0KLSAgLy8gVG9vIGZhci4KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgaW5zZXJ0VmFsdWU6NDRVTEwgYXRJbmRleDo3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNDRVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA0MVVMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDQ0VUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNDJVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCA0M1VMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NV0sIDQ0VUxMKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDQ0VUxMLCA0MVVMTCwgNDJVTEwsIDQ0VUxMLCA0M1VMTCwgNDRVTEwgfTsKLSAgR1BCVUludDY0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCVUludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA2VSk7Ci0KLSAgLy8gRmlyc3QKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNDFVTEwpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA0M1VMTCk7Ci0KLSAgLy8gRW5kCi0gIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNDFVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA0MlVMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDQzVUxMKTsKLQotICAvLyBUb28gZmFyLgotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6M10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFthcnJheSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDFVTEwsIDQxVUxMLCA0M1VMTCwgNDNVTEwgfTsKLSAgR1BCVUludDY0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCVUludDY0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6NDJVTExdOwotICBbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDozIHdpdGhWYWx1ZTo0NFVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDQxVUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNDJVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA0M1VMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDQ0VUxMKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjQgd2l0aFZhbHVlOjQ0VUxMXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlQXRJbmRleDozXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNDFVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA0NFVMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDQzVUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNDJVTEwpOwotCi0gIFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoyIHdpdGhWYWx1ZUF0SW5kZXg6MF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDQzVUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNDRVTEwpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA0MVVMTCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDQyVUxMKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZUF0SW5kZXg6MV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6NF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEludGVybmFsUmVzaXppbmcgewotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDQxVUxMLCA0MlVMTCwgNDNVTEwsIDQ0VUxMIH07Ci0gIEdQQlVJbnQ2NEFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQlVJbnQ2NEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIC8vIEFkZC9yZW1vdmUgdG8gdHJpZ2dlciB0aGUgaW50bmVyYWwgYnVmZmVyIHRvIGdyb3cvc2hyaW5rLgotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDooaSAqIDIpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMzA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgaW5zZXJ0VmFsdWU6NDRVTEwgYXRJbmRleDooaSAqIDMpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNDA0VSk7Ci0gIFthcnJheSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQVJSQVlfVEVTVFMoRmxvYXQsIGZsb2F0LCA1MS5mLCA1Mi5mLCA1My5mLCA1NC5mKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEZsb2F0Ci0KLUBpbnRlcmZhY2UgR1BCRmxvYXRBcnJheVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCRmxvYXRBcnJheVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCRmxvYXRBcnJheSAqYXJyYXkgPSBbW0dQQkZsb2F0QXJyYXkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGZsb2F0IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihmbG9hdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZCh2YWx1ZSwgaWR4LCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5ID0gW0dQQkZsb2F0QXJyYXkgYXJyYXlXaXRoVmFsdWU6NTEuZl07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDUxLmYpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGZsb2F0IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgMFUpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MS5mKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihmbG9hdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTEuZik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBzdGF0aWMgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MS5mLCA1Mi5mLCA1My5mLCA1NC5mIH07Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA1MS5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNTIuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDUzLmYpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCA1NC5mKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGZsb2F0IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgaWR4Mik7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihmbG9hdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsICgzIC0gaWR4MikpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihmbG9hdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgIGlmIChpZHgyID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgM1UpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oZmxvYXQgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAoMyAtIGlkeDIpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICBpZiAoaWR4MiA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDFVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDBVKTsKLSAgICArK2lkeDI7Ci0gIH1dOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgZmxvYXQga1ZhbHVlczFbXSA9IHsgNTEuZiwgNTIuZiwgNTMuZiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMltdID0geyA1MS5mLCA1NC5mLCA1My5mIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMzW10gPSB7IDUxLmYsIDUyLmYsIDUzLmYsIDU0LmYgfTsKLSAgR1BCRmxvYXRBcnJheSAqYXJyYXkxID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTEpOwotICBHUEJGbG9hdEFycmF5ICphcnJheTFwcmltZSA9Ci0gICAgICBbW0dQQkZsb2F0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkxcHJpbWUpOwotICBHUEJGbG9hdEFycmF5ICphcnJheTIgPQotICAgICAgW1tHUEJGbG9hdEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5MyA9Ci0gICAgICBbW0dQQkZsb2F0QXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkzKTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXkxLCBhcnJheTFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5MSBoYXNoXSwgW2FycmF5MXByaW1lIGhhc2hdKTsKLQotICAvLyAxLzIvMyBzaG91bGRuJ3QgYmUgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5Mik7Ci0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5Myk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTIsIGFycmF5Myk7Ci0KLSAgW2FycmF5MSByZWxlYXNlXTsKLSAgW2FycmF5MXByaW1lIHJlbGVhc2VdOwotICBbYXJyYXkyIHJlbGVhc2VdOwotICBbYXJyYXkzIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MS5mLCA1Mi5mLCA1My5mLCA1NC5mIH07Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQkZsb2F0QXJyYXkgKmFycmF5MiA9IFthcnJheSBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotICBbYXJyYXkyIHJlbGVhc2VdOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFycmF5RnJvbUFycmF5IHsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MS5mLCA1Mi5mLCA1My5mLCA1NC5mIH07Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQkZsb2F0QXJyYXkgKmFycmF5MiA9IFtHUEJGbG9hdEFycmF5IGFycmF5V2l0aFZhbHVlQXJyYXk6YXJyYXldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJGbG9hdEFycmF5ICphcnJheSA9IFtHUEJGbG9hdEFycmF5IGFycmF5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBbYXJyYXkgYWRkVmFsdWU6NTEuZl07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgZmxvYXQga1ZhbHVlczFbXSA9IHsgNTIuZiwgNTMuZiB9OwotICBbYXJyYXkgYWRkVmFsdWVzOmtWYWx1ZXMxIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMyW10gPSB7IDU0LmYsIDUxLmYgfTsKLSAgR1BCRmxvYXRBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBbYXJyYXkgYWRkVmFsdWVzRnJvbUFycmF5OmFycmF5Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNTEuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDUyLmYpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA1My5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNTQuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIDUxLmYpOwotICBbYXJyYXkyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnNlcnQgewotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUxLmYsIDUyLmYsIDUzLmYgfTsKLSAgR1BCRmxvYXRBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJGbG9hdEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgLy8gRmlyc3QKLSAgW2FycmF5IGluc2VydFZhbHVlOjU0LmYgYXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLQotICAvLyBNaWRkbGUKLSAgW2FycmF5IGluc2VydFZhbHVlOjU0LmYgYXRJbmRleDoyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICAvLyBFbmQKLSAgW2FycmF5IGluc2VydFZhbHVlOjU0LmYgYXRJbmRleDo1XTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLQotICAvLyBUb28gZmFyLgotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBpbnNlcnRWYWx1ZTo1NC5mIGF0SW5kZXg6N10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDU0LmYpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA1MS5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNTQuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDUyLmYpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCA1My5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDo1XSwgNTQuZik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1NC5mLCA1MS5mLCA1Mi5mLCA1NC5mLCA1My5mLCA1NC5mIH07Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNlUpOwotCi0gIC8vIEZpcnN0Ci0gIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6MF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDUxLmYpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA1My5mKTsKLQotICAvLyBFbmQKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA1MS5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNTIuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDUzLmYpOwotCi0gIC8vIFRvbyBmYXIuCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgW2FycmF5IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDowXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MS5mLCA1MS5mLCA1My5mLCA1My5mIH07Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjUyLmZdOwotICBbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDozIHdpdGhWYWx1ZTo1NC5mXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNTEuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDUyLmYpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA1My5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNTQuZik7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZTo1NC5mXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlQXRJbmRleDozXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNTEuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDU0LmYpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA1My5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNTIuZik7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjIgd2l0aFZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNTMuZik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDU0LmYpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA1MS5mKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNTIuZik7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6NCB3aXRoVmFsdWVBdEluZGV4OjFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWVBdEluZGV4OjRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnRlcm5hbFJlc2l6aW5nIHsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MS5mLCA1Mi5mLCA1My5mLCA1NC5mIH07Ci0gIEdQQkZsb2F0QXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRmxvYXRBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIC8vIEFkZC9yZW1vdmUgdG8gdHJpZ2dlciB0aGUgaW50bmVyYWwgYnVmZmVyIHRvIGdyb3cvc2hyaW5rLgotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDooaSAqIDIpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMzA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgaW5zZXJ0VmFsdWU6NTQuZiBhdEluZGV4OihpICogMyldOwotICB9Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0MDRVKTsKLSAgW2FycmF5IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBBUlJBWV9URVNUUyhEb3VibGUsIGRvdWJsZSwgNjEuLCA2Mi4sIDYzLiwgNjQuKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQkRvdWJsZUFycmF5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJEb3VibGVBcnJheVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCRG91YmxlQXJyYXkgKmFycmF5ID0gW1tHUEJEb3VibGVBcnJheSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oZG91YmxlIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6Xihkb3VibGUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQodmFsdWUsIGlkeCwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJEb3VibGVBcnJheSAqYXJyYXkgPSBbR1BCRG91YmxlQXJyYXkgYXJyYXlXaXRoVmFsdWU6NjEuXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNjEuKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6Xihkb3VibGUgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAwVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYxLik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oZG91YmxlIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgMFUpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MS4pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgc3RhdGljIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYxLiwgNjIuLCA2My4sIDY0LiB9OwotICBHUEJEb3VibGVBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJEb3VibGVBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNjEuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNjIuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNjMuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNjQuKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGRvdWJsZSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oZG91YmxlIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGRvdWJsZSB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgIGlmIChpZHgyID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgM1UpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oZG91YmxlIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAxVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAwVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMVtdID0geyA2MS4sIDYyLiwgNjMuIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMltdID0geyA2MS4sIDY0LiwgNjMuIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzM1tdID0geyA2MS4sIDYyLiwgNjMuLCA2NC4gfTsKLSAgR1BCRG91YmxlQXJyYXkgKmFycmF5MSA9Ci0gICAgICBbW0dQQkRvdWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTEpOwotICBHUEJEb3VibGVBcnJheSAqYXJyYXkxcHJpbWUgPQotICAgICAgW1tHUEJEb3VibGVBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkxcHJpbWUpOwotICBHUEJEb3VibGVBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCRG91YmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0gIEdQQkRvdWJsZUFycmF5ICphcnJheTMgPQotICAgICAgW1tHUEJEb3VibGVBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkzKTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXkxLCBhcnJheTFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5MSBoYXNoXSwgW2FycmF5MXByaW1lIGhhc2hdKTsKLQotICAvLyAxLzIvMyBzaG91bGRuJ3QgYmUgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5Mik7Ci0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTEsIGFycmF5Myk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhhcnJheTIsIGFycmF5Myk7Ci0KLSAgW2FycmF5MSByZWxlYXNlXTsKLSAgW2FycmF5MXByaW1lIHJlbGVhc2VdOwotICBbYXJyYXkyIHJlbGVhc2VdOwotICBbYXJyYXkzIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjEuLCA2Mi4sIDYzLiwgNjQuIH07Ci0gIEdQQkRvdWJsZUFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkRvdWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQkRvdWJsZUFycmF5ICphcnJheTIgPSBbYXJyYXkgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXksIGFycmF5Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheSwgYXJyYXkyKTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBcnJheUZyb21BcnJheSB7Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYxLiwgNjIuLCA2My4sIDY0LiB9OwotICBHUEJEb3VibGVBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJEb3VibGVBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLQotICBHUEJEb3VibGVBcnJheSAqYXJyYXkyID0gW0dQQkRvdWJsZUFycmF5IGFycmF5V2l0aFZhbHVlQXJyYXk6YXJyYXldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJEb3VibGVBcnJheSAqYXJyYXkgPSBbR1BCRG91YmxlQXJyYXkgYXJyYXldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFthcnJheSBhZGRWYWx1ZTo2MS5dOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMVtdID0geyA2Mi4sIDYzLiB9OwotICBbYXJyYXkgYWRkVmFsdWVzOmtWYWx1ZXMxIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMltdID0geyA2NC4sIDYxLiB9OwotICBHUEJEb3VibGVBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCRG91YmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0gIFthcnJheSBhZGRWYWx1ZXNGcm9tQXJyYXk6YXJyYXkyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA2MS4pOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA2Mi4pOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA2My4pOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCA2NC4pOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCA2MS4pOwotICBbYXJyYXkyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnNlcnQgewotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MS4sIDYyLiwgNjMuIH07Ci0gIEdQQkRvdWJsZUFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkRvdWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIC8vIEZpcnN0Ci0gIFthcnJheSBpbnNlcnRWYWx1ZTo2NC4gYXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLQotICAvLyBNaWRkbGUKLSAgW2FycmF5IGluc2VydFZhbHVlOjY0LiBhdEluZGV4OjJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotCi0gIC8vIEVuZAotICBbYXJyYXkgaW5zZXJ0VmFsdWU6NjQuIGF0SW5kZXg6NV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA2VSk7Ci0KLSAgLy8gVG9vIGZhci4KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgaW5zZXJ0VmFsdWU6NjQuIGF0SW5kZXg6N10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDY0Lik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDYxLik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDY0Lik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDYyLik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIDYzLik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NV0sIDY0Lik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjQuLCA2MS4sIDYyLiwgNjQuLCA2My4sIDY0LiB9OwotICBHUEJEb3VibGVBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJEb3VibGVBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLQotICAvLyBGaXJzdAotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA2MS4pOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA2My4pOwotCi0gIC8vIEVuZAotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjNdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDYxLik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDYyLik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDYzLik7Ci0KLSAgLy8gVG9vIGZhci4KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLQotICBbYXJyYXkgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MS4sIDYxLiwgNjMuLCA2My4gfTsKLSAgR1BCRG91YmxlQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRG91YmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6NjIuXTsKLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MyB3aXRoVmFsdWU6NjQuXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNjEuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNjIuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNjMuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNjQuKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjQgd2l0aFZhbHVlOjY0Ll0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDYxLik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDY0Lik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDYzLik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDYyLik7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjIgd2l0aFZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNjMuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNjQuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNjEuKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNjIuKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZUF0SW5kZXg6MV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6NF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEludGVybmFsUmVzaXppbmcgewotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MS4sIDYyLiwgNjMuLCA2NC4gfTsKLSAgR1BCRG91YmxlQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRG91YmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgLy8gQWRkL3JlbW92ZSB0byB0cmlnZ2VyIHRoZSBpbnRuZXJhbCBidWZmZXIgdG8gZ3Jvdy9zaHJpbmsuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgYWRkVmFsdWVzOmtWYWx1ZXMgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNDA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OihpICogMildOwotICB9Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzMDRVKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIFthcnJheSBpbnNlcnRWYWx1ZTo2NC4gYXRJbmRleDooaSAqIDMpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNDA0VSk7Ci0gIFthcnJheSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQVJSQVlfVEVTVFMoQm9vbCwgQk9PTCwgVFJVRSwgVFJVRSwgRkFMU0UsIEZBTFNFKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wKLQotQGludGVyZmFjZSBHUEJCb29sQXJyYXlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkJvb2xBcnJheVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCQm9vbEFycmF5ICphcnJheSA9IFtbR1BCQm9vbEFycmF5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKHZhbHVlLCBpZHgsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCQm9vbEFycmF5ICphcnJheSA9IFtHUEJCb29sQXJyYXkgYXJyYXlXaXRoVmFsdWU6VFJVRV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIFRSVUUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKEJPT0wgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAwVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFRSVUUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKEJPT0wgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAwVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFRSVUUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgc3RhdGljIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBUUlVFLCBUUlVFLCBGQUxTRSwgRkFMU0UgfTsKLSAgR1BCQm9vbEFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkJvb2xBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIFRSVUUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBUUlVFKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgRkFMU0UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCBGQUxTRSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHZhbHVlQXRJbmRleDo0XSwgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgaWR4Mik7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihCT09MIHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKEJPT0wgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCBpZHgyKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICBpZiAoaWR4MiA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDNVKTsKLSAgICArK2lkeDI7Ci0gIH1dOwotICBpZHgyID0gMDsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKEJPT0wgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoaWR4LCAoMyAtIGlkeDIpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga1ZhbHVlc1tpZHhdKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICBpZiAoaWR4MiA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDFVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDBVKTsKLSAgICArK2lkeDI7Ci0gIH1dOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgQk9PTCBrVmFsdWVzMVtdID0geyBUUlVFLCBUUlVFLCBGQUxTRSB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMyW10gPSB7IFRSVUUsIEZBTFNFLCBGQUxTRSB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMzW10gPSB7IFRSVUUsIFRSVUUsIEZBTFNFLCBGQUxTRSB9OwotICBHUEJCb29sQXJyYXkgKmFycmF5MSA9Ci0gICAgICBbW0dQQkJvb2xBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MSk7Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkxcHJpbWUgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTFwcmltZSk7Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCQm9vbEFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLSAgR1BCQm9vbEFycmF5ICphcnJheTMgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTMpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheTEsIGFycmF5MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkxIGhhc2hdLCBbYXJyYXkxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDEvMi8zIHNob3VsZG4ndCBiZSBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkzKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MiwgYXJyYXkzKTsKLQotICBbYXJyYXkxIHJlbGVhc2VdOwotICBbYXJyYXkxcHJpbWUgcmVsZWFzZV07Ci0gIFthcnJheTIgcmVsZWFzZV07Ci0gIFthcnJheTMgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgVFJVRSwgVFJVRSwgRkFMU0UsIEZBTFNFIH07Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQkJvb2xBcnJheSAqYXJyYXkyID0gW2FycmF5IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5LCBhcnJheTIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXksIGFycmF5Mik7Ci0gIFthcnJheTIgcmVsZWFzZV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QXJyYXlGcm9tQXJyYXkgewotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgVFJVRSwgVFJVRSwgRkFMU0UsIEZBTFNFIH07Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIEdQQkJvb2xBcnJheSAqYXJyYXkyID0gW0dQQkJvb2xBcnJheSBhcnJheVdpdGhWYWx1ZUFycmF5OmFycmF5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXksIGFycmF5Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheSwgYXJyYXkyKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCQm9vbEFycmF5ICphcnJheSA9IFtHUEJCb29sQXJyYXkgYXJyYXldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFthcnJheSBhZGRWYWx1ZTpUUlVFXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDFVKTsKLQotICBjb25zdCBCT09MIGtWYWx1ZXMxW10gPSB7IFRSVUUsIEZBTFNFIH07Ci0gIFthcnJheSBhZGRWYWx1ZXM6a1ZhbHVlczEgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgY29uc3QgQk9PTCBrVmFsdWVzMltdID0geyBGQUxTRSwgVFJVRSB9OwotICBHUEJCb29sQXJyYXkgKmFycmF5MiA9Ci0gICAgICBbW0dQQkJvb2xBcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Mik7Ci0gIFthcnJheSBhZGRWYWx1ZXNGcm9tQXJyYXk6YXJyYXkyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBUUlVFKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgVFJVRSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIEZBTFNFKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgRkFMU0UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCBUUlVFKTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5zZXJ0IHsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFRSVUUsIFRSVUUsIEZBTFNFIH07Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIC8vIEZpcnN0Ci0gIFthcnJheSBpbnNlcnRWYWx1ZTpGQUxTRSBhdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgaW5zZXJ0VmFsdWU6RkFMU0UgYXRJbmRleDoyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICAvLyBFbmQKLSAgW2FycmF5IGluc2VydFZhbHVlOkZBTFNFIGF0SW5kZXg6NV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA2VSk7Ci0KLSAgLy8gVG9vIGZhci4KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgaW5zZXJ0VmFsdWU6RkFMU0UgYXRJbmRleDo3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgRkFMU0UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBUUlVFKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgRkFMU0UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCBUUlVFKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDo0XSwgRkFMU0UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjVdLCBGQUxTRSk7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IEZBTFNFLCBUUlVFLCBUUlVFLCBGQUxTRSwgRkFMU0UsIEZBTFNFIH07Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNlUpOwotCi0gIC8vIEZpcnN0Ci0gIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6MF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIFRSVUUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBGQUxTRSk7Ci0KLSAgLy8gRW5kCi0gIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgVFJVRSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIFRSVUUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBGQUxTRSk7Ci0KLSAgLy8gVG9vIGZhci4KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLQotICBbYXJyYXkgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgVFJVRSwgVFJVRSwgRkFMU0UsIEZBTFNFIH07Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOlRSVUVdOwotICBbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDozIHdpdGhWYWx1ZTpGQUxTRV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIFRSVUUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBUUlVFKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgRkFMU0UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCBGQUxTRSk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZTpGQUxTRV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIFRSVUUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBGQUxTRSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIEZBTFNFKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgVFJVRSk7Ci0KLSAgW2FycmF5IGV4Y2hhbmdlVmFsdWVBdEluZGV4OjIgd2l0aFZhbHVlQXRJbmRleDowXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgRkFMU0UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBGQUxTRSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIFRSVUUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCBUUlVFKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZUF0SW5kZXg6MV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6NF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEludGVybmFsUmVzaXppbmcgewotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgVFJVRSwgVFJVRSwgRkFMU0UsIEZBTFNFIH07Ci0gIEdQQkJvb2xBcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJCb29sQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIC8vIEFkZC9yZW1vdmUgdG8gdHJpZ2dlciB0aGUgaW50bmVyYWwgYnVmZmVyIHRvIGdyb3cvc2hyaW5rLgotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDooaSAqIDIpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMzA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgaW5zZXJ0VmFsdWU6RkFMU0UgYXRJbmRleDooaSAqIDMpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNDA0VSk7Ci0gIFthcnJheSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQVJSQVlfVEVTVFMyKEVudW0sIGludDMyX3QsIDcxLCA3MiwgNzMsIDc0LCBSYXcpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gRW51bQotCi1AaW50ZXJmYWNlIEdQQkVudW1BcnJheVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCRW51bUFycmF5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJFbnVtQXJyYXkgKmFycmF5ID0gW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhCbG9jazpeKGludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQodmFsdWUsIGlkeCwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2FycmF5IGVudW1lcmF0ZVZhbHVlc1dpdGhPcHRpb25zOk5TRW51bWVyYXRpb25SZXZlcnNlCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXNpbmdCbG9jazpeKGludDMyX3QgdmFsdWUsIE5TVUludGVnZXIgaWR4LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQodmFsdWUsIGlkeCwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJFbnVtQXJyYXkgKmFycmF5ID0gW0dQQkVudW1BcnJheSBhcnJheVdpdGhWYWx1ZTo3MV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDcxKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgMFUpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIDBVKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzEpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgc3RhdGljIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MSwgNzIsIDczLCA3NCB9OwotICBHUEJFbnVtQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRW51bUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNzEpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA3Mik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDczKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNzQpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSB2YWx1ZUF0SW5kZXg6NF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsICgzIC0gaWR4MikpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgaWR4Mik7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAzVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgaWYgKGlkeDIgPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAxVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAwVSk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzEsIDcyLCA3MyB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcxLCA3NCwgNzMgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyA3MSwgNzIsIDczLCA3NCB9OwotICBHUEJFbnVtQXJyYXkgKmFycmF5MSA9Ci0gICAgICBbW0dQQkVudW1BcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MSk7Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkxcHJpbWUgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTFwcmltZSk7Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCRW51bUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLSAgR1BCRW51bUFycmF5ICphcnJheTMgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTMpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheTEsIGFycmF5MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkxIGhhc2hdLCBbYXJyYXkxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDEvMi8zIHNob3VsZG4ndCBiZSBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkzKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MiwgYXJyYXkzKTsKLQotICBbYXJyYXkxIHJlbGVhc2VdOwotICBbYXJyYXkxcHJpbWUgcmVsZWFzZV07Ci0gIFthcnJheTIgcmVsZWFzZV07Ci0gIFthcnJheTMgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzEsIDcyLCA3MywgNzQgfTsKLSAgR1BCRW51bUFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkVudW1BcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgR1BCRW51bUFycmF5ICphcnJheTIgPSBbYXJyYXkgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoYXJyYXksIGFycmF5Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhcnJheSwgYXJyYXkyKTsKLSAgW2FycmF5MiByZWxlYXNlXTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBcnJheUZyb21BcnJheSB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MSwgNzIsIDczLCA3NCB9OwotICBHUEJFbnVtQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRW51bUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLQotICBHUEJFbnVtQXJyYXkgKmFycmF5MiA9IFtHUEJFbnVtQXJyYXkgYXJyYXlXaXRoVmFsdWVBcnJheTphcnJheV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5LCBhcnJheTIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXksIGFycmF5Mik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPSBbR1BCRW51bUFycmF5IGFycmF5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBbYXJyYXkgYWRkVmFsdWU6NzFdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzIsIDczIH07Ci0gIFthcnJheSBhZGRWYWx1ZXM6a1ZhbHVlczEgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyA3NCwgNzEgfTsKLSAgR1BCRW51bUFycmF5ICphcnJheTIgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBbYXJyYXkgYWRkUmF3VmFsdWVzRnJvbUFycmF5OmFycmF5Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNzEpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA3Mik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDczKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNzQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCA3MSk7Ci0gIFthcnJheTIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEluc2VydCB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MSwgNzIsIDczIH07Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIC8vIEZpcnN0Ci0gIFthcnJheSBpbnNlcnRWYWx1ZTo3NCBhdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgaW5zZXJ0VmFsdWU6NzQgYXRJbmRleDoyXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDVVKTsKLQotICAvLyBFbmQKLSAgW2FycmF5IGluc2VydFZhbHVlOjc0IGF0SW5kZXg6NV07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA2VSk7Ci0KLSAgLy8gVG9vIGZhci4KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgaW5zZXJ0VmFsdWU6NzQgYXRJbmRleDo3XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDowXSwgNzQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCA3MSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDc0KTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDozXSwgNzIpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjRdLCA3Myk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NV0sIDc0KTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzQsIDcxLCA3MiwgNzQsIDczLCA3NCB9OwotICBHUEJFbnVtQXJyYXkgKmFycmF5ID0KLSAgICAgIFtbR1BCRW51bUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLQotICAvLyBGaXJzdAotICBbYXJyYXkgcmVtb3ZlVmFsdWVBdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA3MSk7Ci0KLSAgLy8gTWlkZGxlCi0gIFthcnJheSByZW1vdmVWYWx1ZUF0SW5kZXg6Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIDczKTsKLQotICAvLyBFbmQKLSAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDNVKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA3MSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDcyKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNzMpOwotCi0gIC8vIFRvbyBmYXIuCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDozXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0KLSAgW2FycmF5IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDowXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcxLCA3MSwgNzMsIDczIH07Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjcyXTsKLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MyB3aXRoVmFsdWU6NzRdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA3MSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDcyKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNzMpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCA3NCk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDo0IHdpdGhWYWx1ZTo3NF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TUmFuZ2VFeGNlcHRpb24pOwotCi0gIFthcnJheSBleGNoYW5nZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZUF0SW5kZXg6M107Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDcxKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwgNzQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCA3Myk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIDcyKTsKLQotICBbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6MiB3aXRoVmFsdWVBdEluZGV4OjBdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA3Myk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDc0KTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNzEpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCA3Mik7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6NCB3aXRoVmFsdWVBdEluZGV4OjFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgZXhjaGFuZ2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWVBdEluZGV4OjRdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnRlcm5hbFJlc2l6aW5nIHsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcxLCA3MiwgNzMsIDc0IH07Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIC8vIEFkZC9yZW1vdmUgdG8gdHJpZ2dlciB0aGUgaW50bmVyYWwgYnVmZmVyIHRvIGdyb3cvc2hyaW5rLgotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IGFkZFZhbHVlczprVmFsdWVzIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDooaSAqIDIpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMzA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgaW5zZXJ0VmFsdWU6NzQgYXRJbmRleDooaSAqIDMpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNDA0VSk7Ci0gIFthcnJheSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQtRU5EICg4IGV4cGFuc2lvbnMpCi0KLSNwcmFnbWEgbWFyayAtIE5vbiBtYWNyby1iYXNlZCBFbnVtIHRlc3RzCi0KLS8vIFRoZXNlIGFyZSBoYW5kIHdyaXR0ZW4gdGVzdHMgdG8gY292ZXIgdGhlIHZlcmlmaWNhdGlvbiBhbmQgcmF3IG1ldGhvZHMuCi0KLUBpbnRlcmZhY2UgR1BCRW51bUFycmF5Q3VzdG9tVGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJFbnVtQXJyYXlDdXN0b21UZXN0cwotCi0tICh2b2lkKXRlc3RSYXdCYXNpY3MgewotICBzdGF0aWMgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcxLCAyNzIsIDczLCAzNzQgfTsKLSAgc3RhdGljIGNvbnN0IGludDMyX3Qga1ZhbHVlc0ZpbHRlcmVkW10gPSB7Ci0gICAgICA3MSwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSwgNzMsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUKLSAgfTsKLSAgWENUQXNzZXJ0RXF1YWwoR1BCQVJSQVlTSVpFKGtWYWx1ZXMpLCBHUEJBUlJBWVNJWkUoa1ZhbHVlc0ZpbHRlcmVkKSk7Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBHUEJFbnVtVmFsaWRhdGlvbkZ1bmMgZnVuYyA9IFRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkudmFsaWRhdGlvbkZ1bmMsIGZ1bmMpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjBdLCA3MSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6MV0sIDI3Mik7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjJdLCA3Myk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6M10sIDM3NCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6M10sIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6NF0sIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlUmF3VmFsdWVzV2l0aEJsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlVmFsdWVzV2l0aEJsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzRmlsdGVyZWRbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVSYXdWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNbaWR4XSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHgyOwotICB9XTsKLSAgaWR4MiA9IDA7Ci0gIFthcnJheSBlbnVtZXJhdGVWYWx1ZXNXaXRoT3B0aW9uczpOU0VudW1lcmF0aW9uUmV2ZXJzZQotICAgICAgICAgICAgICAgICAgICAgICAgIHVzaW5nQmxvY2s6XihpbnQzMl90IHZhbHVlLCBOU1VJbnRlZ2VyIGlkeCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGlkeCwgKDMgLSBpZHgyKSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtWYWx1ZXNGaWx0ZXJlZFtpZHhdKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDI7Ci0gIH1dOwotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlUmF3VmFsdWVzV2l0aEJsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsIGlkeDIpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgIGlmIChpZHgyID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgM1UpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIGlkeDIgPSAwOwotICBbYXJyYXkgZW51bWVyYXRlUmF3VmFsdWVzV2l0aE9wdGlvbnM6TlNFbnVtZXJhdGlvblJldmVyc2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1c2luZ0Jsb2NrOl4oaW50MzJfdCB2YWx1ZSwgTlNVSW50ZWdlciBpZHgsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChpZHgsICgzIC0gaWR4MikpOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrVmFsdWVzW2lkeF0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgIGlmIChpZHgyID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMVUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMFUpOwotICAgICsraWR4MjsKLSAgfV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMxW10gPSB7IDcxLCA3MiwgMTczIH07ICAvLyBXaXRoIHVua25vd24gdmFsdWUKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyA3MSwgNzQsIDE3MyB9OyAgLy8gV2l0aCB1bmtub3duIHZhbHVlCi0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczNbXSA9IHsgNzEsIDcyLCAxNzMsIDc0IH07ICAvLyBXaXRoIHVua25vd24gdmFsdWUKLSAgR1BCRW51bUFycmF5ICphcnJheTEgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTEpOwotICBHUEJFbnVtQXJyYXkgKmFycmF5MXByaW1lID0KLSAgICAgIFtbR1BCRW51bUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5MXByaW1lKTsKLSAgR1BCRW51bUFycmF5ICphcnJheTIgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheTIpOwotICBHUEJFbnVtQXJyYXkgKmFycmF5MyA9Ci0gICAgICBbW0dQQkVudW1BcnJheSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGFycmF5Myk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5MSwgYXJyYXkxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXkxLCBhcnJheTFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheTEgaGFzaF0sIFthcnJheTFwcmltZSBoYXNoXSk7Ci0gIC8vIEJ1dCBkaWZmZXJlbnQgdmFsaWRhdGlvbiBmdW5jdGlvbnMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5MS52YWxpZGF0aW9uRnVuYywgYXJyYXkxcHJpbWUudmFsaWRhdGlvbkZ1bmMpOwotCi0gIC8vIDEvMi8zIHNob3VsZG4ndCBiZSBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MSwgYXJyYXkzKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGFycmF5MiwgYXJyYXkzKTsKLQotICBbYXJyYXkxIHJlbGVhc2VdOwotICBbYXJyYXkxcHJpbWUgcmVsZWFzZV07Ci0gIFthcnJheTIgcmVsZWFzZV07Ci0gIFthcnJheTMgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzEsIDcyIH07Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIFthcnJheSBhZGRSYXdWYWx1ZToxMDAwXTsgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjBdLCA3MSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6MV0sIDcyKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHJhd1ZhbHVlQXRJbmRleDoyXSwgMTAwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotCi0gIEdQQkVudW1BcnJheSAqYXJyYXkyID0gW2FycmF5IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGFycmF5LCBhcnJheTIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYXJyYXksIGFycmF5Mik7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LnZhbGlkYXRpb25GdW5jLCBhcnJheTIudmFsaWRhdGlvbkZ1bmMpOwotICBYQ1RBc3NlcnRUcnVlKFthcnJheTIgaXNLaW5kT2ZDbGFzczpbR1BCRW51bUFycmF5IGNsYXNzXV0pOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheTIuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5MiByYXdWYWx1ZUF0SW5kZXg6MF0sIDcxKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5MiByYXdWYWx1ZUF0SW5kZXg6MV0sIDcyKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5MiByYXdWYWx1ZUF0SW5kZXg6Ml0sIDEwMDApOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkyIHZhbHVlQXRJbmRleDoyXSwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFthcnJheTIgcmVsZWFzZV07Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QXJyYXlGcm9tQXJyYXkgewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzEsIDE3MiwgMTczLCA3NCB9OyAgLy8gVW5rbm93bnMKLSAgR1BCRW51bUFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkVudW1BcnJheSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgR1BCRW51bUFycmF5ICphcnJheTIgPSBbR1BCRW51bUFycmF5IGFycmF5V2l0aFZhbHVlQXJyYXk6YXJyYXldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChhcnJheSwgYXJyYXkyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFycmF5LCBhcnJheTIpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS52YWxpZGF0aW9uRnVuYywgYXJyYXkyLnZhbGlkYXRpb25GdW5jKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RVbmtub3duQWRkcyB7Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgYWRkVmFsdWU6MTcyXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMFUpOwotCi0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgMTcyLCAxNzMgfTsgIC8vIFVua25vd24KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgYWRkVmFsdWVzOmtWYWx1ZXMxIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAwVSk7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmF3QWRkcyB7Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgW2FycmF5IGFkZFJhd1ZhbHVlOjcxXTsgIC8vIFZhbGlkCi0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMVtdID0geyAxNzIsIDE3MyB9OyAgLy8gVW5rbm93bgotICBbYXJyYXkgYWRkUmF3VmFsdWVzOmtWYWx1ZXMxIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgNzQsIDcxIH07Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkyID0KLSAgICAgIFtbR1BCRW51bUFycmF5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkyKTsKLSAgW2FycmF5IGFkZFJhd1ZhbHVlc0Zyb21BcnJheTphcnJheTJdOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNVUpOwotCi0gIFhDVEFzc2VydEVxdWFsKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6MF0sIDcxKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHJhd1ZhbHVlQXRJbmRleDoxXSwgMTcyKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoxXSwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6Ml0sIDE3Myk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjNdLCA3NCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6NF0sIDcxKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RVbmtub3duSW5zZXJ0cyB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MSwgNzIsIDczIH07Ci0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgM1UpOwotCi0gIC8vIEZpcnN0Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IGluc2VydFZhbHVlOjE3NCBhdEluZGV4OjBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgLy8gTWlkZGxlCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IGluc2VydFZhbHVlOjI3NCBhdEluZGV4OjFdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgLy8gRW5kCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IGluc2VydFZhbHVlOjM3NCBhdEluZGV4OjNdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmF3SW5zZXJ0IHsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcxLCA3MiwgNzMgfTsKLSAgR1BCRW51bUFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkVudW1BcnJheSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCAzVSk7Ci0KLSAgLy8gRmlyc3QKLSAgW2FycmF5IGluc2VydFJhd1ZhbHVlOjE3NCBhdEluZGV4OjBdOyAgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotCi0gIC8vIE1pZGRsZQotICBbYXJyYXkgaW5zZXJ0UmF3VmFsdWU6Mjc0IGF0SW5kZXg6Ml07ICAvLyBVbmtub3duCi0gIFhDVEFzc2VydEVxdWFsKGFycmF5LmNvdW50LCA1VSk7Ci0KLSAgLy8gRW5kCi0gIFthcnJheSBpbnNlcnRSYXdWYWx1ZTozNzQgYXRJbmRleDo1XTsgIC8vIFVua25vd24KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDZVKTsKLQotICAvLyBUb28gZmFyLgotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSBpbnNlcnRSYXdWYWx1ZTo3NCBhdEluZGV4OjddLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU1JhbmdlRXhjZXB0aW9uKTsKLQotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjBdLCAxNzQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHJhd1ZhbHVlQXRJbmRleDoxXSwgNzEpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjJdLCAyNzQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjJdLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHJhd1ZhbHVlQXRJbmRleDozXSwgNzIpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjRdLCA3Myk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSByYXdWYWx1ZUF0SW5kZXg6NV0sIDM3NCk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6NV0sIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBbYXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFVua25vd25JbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzEsIDcyLCA3MywgNzQgfTsKLSAgR1BCRW51bUFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkVudW1BcnJheSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbYXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZToxNzJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MyB3aXRoVmFsdWU6Mjc0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjBdLCA3MSk7Ci0gIFhDVEFzc2VydEVxdWFsKFthcnJheSB2YWx1ZUF0SW5kZXg6MV0sIDcyKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHZhbHVlQXRJbmRleDoyXSwgNzMpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCA3NCk7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotCi0tICh2b2lkKXRlc3RSYXdJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzEsIDcyLCA3MywgNzQgfTsKLSAgR1BCRW51bUFycmF5ICphcnJheSA9Ci0gICAgICBbW0dQQkVudW1BcnJheSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChhcnJheSk7Ci0KLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoUmF3VmFsdWU6MTcyXTsgIC8vIFVua25vd24KLSAgW2FycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MyB3aXRoUmF3VmFsdWU6Mjc0XTsgIC8vIFVua25vd24KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHJhd1ZhbHVlQXRJbmRleDowXSwgNzEpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjFdLCAxNzIpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjFdLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2FycmF5IHJhd1ZhbHVlQXRJbmRleDoyXSwgNzMpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgcmF3VmFsdWVBdEluZGV4OjNdLCAyNzQpOwotICBYQ1RBc3NlcnRFcXVhbChbYXJyYXkgdmFsdWVBdEluZGV4OjNdLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFthcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjQgd2l0aFJhd1ZhbHVlOjc0XSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNSYW5nZUV4Y2VwdGlvbik7Ci0gIFthcnJheSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmF3SW50ZXJuYWxSZXNpemluZyB7Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MSwgMTcyLCAxNzMsIDc0IH07ICAvLyBVbmtub3duCi0gIEdQQkVudW1BcnJheSAqYXJyYXkgPQotICAgICAgW1tHUEJFbnVtQXJyYXkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoYXJyYXkpOwotCi0gIC8vIEFkZC9yZW1vdmUgdG8gdHJpZ2dlciB0aGUgaW50bmVyYWwgYnVmZmVyIHRvIGdyb3cvc2hyaW5rLgotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IGFkZFJhd1ZhbHVlczprVmFsdWVzIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDsgKytpKSB7Ci0gICAgW2FycmF5IHJlbW92ZVZhbHVlQXRJbmRleDooaSAqIDIpXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChhcnJheS5jb3VudCwgMzA0VSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwOyArK2kpIHsKLSAgICBbYXJyYXkgaW5zZXJ0UmF3VmFsdWU6Mjc0IGF0SW5kZXg6KGkgKiAzKV07ICAvLyBVbmtub3duCi0gIH0KLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDQwNFUpOwotICBbYXJyYXkgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoYXJyYXkuY291bnQsIDBVKTsKLSAgW2FycmF5IHJlbGVhc2VdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkNvZGVkSW5wdXRTdHJlYW1UZXN0cy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJDb2RlZElucHV0U3RyZWFtVGVzdHMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M0MDIxNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkNvZGVkSW5wdXRTdHJlYW1UZXN0cy5tCisrKyAvZGV2L251bGwKQEAgLTEsMzM1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0ICJHUEJUZXN0VXRpbGl0aWVzLmgiCi0KLSNpbXBvcnQgIkdQQkNvZGVkSW5wdXRTdHJlYW0uaCIKLSNpbXBvcnQgIkdQQkNvZGVkT3V0cHV0U3RyZWFtLmgiCi0jaW1wb3J0ICJHUEJVbmtub3duRmllbGRTZXRfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0LnBib2JqYy5oIgotCi1AaW50ZXJmYWNlIENvZGVkSW5wdXRTdHJlYW1UZXN0cyA6IEdQQlRlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBDb2RlZElucHV0U3RyZWFtVGVzdHMKLQotLSAoTlNEYXRhKilieXRlc193aXRoX3NlbnRpbmVsOihpbnQzMl90KXVudXNlZCwgLi4uIHsKLSAgdmFfbGlzdCBsaXN0OwotICB2YV9zdGFydChsaXN0LCB1bnVzZWQpOwotCi0gIE5TTXV0YWJsZURhdGEqIHZhbHVlcyA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoQ2FwYWNpdHk6MF07Ci0gIGludDMyX3QgaTsKLQotICB3aGlsZSAoKGkgPSB2YV9hcmcobGlzdCwgaW50MzJfdCkpICE9IDI1NikgewotICAgIE5TQXNzZXJ0KGkgPj0gMCAmJiBpIDwgMjU2LCBAIiIpOwotICAgIHVpbnQ4X3QgdSA9ICh1aW50OF90KWk7Ci0gICAgW3ZhbHVlcyBhcHBlbmRCeXRlczomdSBsZW5ndGg6MV07Ci0gIH0KLQotICB2YV9lbmQobGlzdCk7Ci0KLSAgcmV0dXJuIHZhbHVlczsKLX0KLQotI2RlZmluZSBieXRlcyguLi4pIFtzZWxmIGJ5dGVzX3dpdGhfc2VudGluZWw6MCwgX19WQV9BUkdTX18sIDI1Nl0KLQotLSAodm9pZCl0ZXN0RGVjb2RlWmlnWmFnIHsKLSAgWENUQXNzZXJ0RXF1YWwoMCwgR1BCRGVjb2RlWmlnWmFnMzIoMCkpOwotICBYQ1RBc3NlcnRFcXVhbCgtMSwgR1BCRGVjb2RlWmlnWmFnMzIoMSkpOwotICBYQ1RBc3NlcnRFcXVhbCgxLCBHUEJEZWNvZGVaaWdaYWczMigyKSk7Ci0gIFhDVEFzc2VydEVxdWFsKC0yLCBHUEJEZWNvZGVaaWdaYWczMigzKSk7Ci0gIFhDVEFzc2VydEVxdWFsKChpbnQzMl90KTB4M0ZGRkZGRkYsIEdQQkRlY29kZVppZ1phZzMyKDB4N0ZGRkZGRkUpKTsKLSAgWENUQXNzZXJ0RXF1YWwoKGludDMyX3QpMHhDMDAwMDAwMCwgR1BCRGVjb2RlWmlnWmFnMzIoMHg3RkZGRkZGRikpOwotICBYQ1RBc3NlcnRFcXVhbCgoaW50MzJfdCkweDdGRkZGRkZGLCBHUEJEZWNvZGVaaWdaYWczMigweEZGRkZGRkZFKSk7Ci0gIFhDVEFzc2VydEVxdWFsKChpbnQzMl90KTB4ODAwMDAwMDAsIEdQQkRlY29kZVppZ1phZzMyKDB4RkZGRkZGRkYpKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgoaW50NjRfdCkwLCBHUEJEZWNvZGVaaWdaYWc2NCgwKSk7Ci0gIFhDVEFzc2VydEVxdWFsKChpbnQ2NF90KS0xLCBHUEJEZWNvZGVaaWdaYWc2NCgxKSk7Ci0gIFhDVEFzc2VydEVxdWFsKChpbnQ2NF90KTEsIEdQQkRlY29kZVppZ1phZzY0KDIpKTsKLSAgWENUQXNzZXJ0RXF1YWwoKGludDY0X3QpLTIsIEdQQkRlY29kZVppZ1phZzY0KDMpKTsKLSAgWENUQXNzZXJ0RXF1YWwoKGludDY0X3QpMHgwMDAwMDAwMDNGRkZGRkZGTCwKLSAgICAgICAgICAgICAgICAgR1BCRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZFTCkpOwotICBYQ1RBc3NlcnRFcXVhbCgoaW50NjRfdCkweEZGRkZGRkZGQzAwMDAwMDBMLAotICAgICAgICAgICAgICAgICBHUEJEZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwN0ZGRkZGRkZMKSk7Ci0gIFhDVEFzc2VydEVxdWFsKChpbnQ2NF90KTB4MDAwMDAwMDA3RkZGRkZGRkwsCi0gICAgICAgICAgICAgICAgIEdQQkRlY29kZVppZ1phZzY0KDB4MDAwMDAwMDBGRkZGRkZGRUwpKTsKLSAgWENUQXNzZXJ0RXF1YWwoKGludDY0X3QpMHhGRkZGRkZGRjgwMDAwMDAwTCwKLSAgICAgICAgICAgICAgICAgR1BCRGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMEZGRkZGRkZGTCkpOwotICBYQ1RBc3NlcnRFcXVhbCgoaW50NjRfdCkweDdGRkZGRkZGRkZGRkZGRkZMLAotICAgICAgICAgICAgICAgICBHUEJEZWNvZGVaaWdaYWc2NCgweEZGRkZGRkZGRkZGRkZGRkVMKSk7Ci0gIFhDVEFzc2VydEVxdWFsKChpbnQ2NF90KTB4ODAwMDAwMDAwMDAwMDAwMEwsCi0gICAgICAgICAgICAgICAgIEdQQkRlY29kZVppZ1phZzY0KDB4RkZGRkZGRkZGRkZGRkZGRkwpKTsKLX0KLQotLSAodm9pZClhc3NlcnRSZWFkVmFyaW50OihOU0RhdGEqKWRhdGEgdmFsdWU6KGludDY0X3QpdmFsdWUgewotICB7Ci0gICAgR1BCQ29kZWRJbnB1dFN0cmVhbSogaW5wdXQgPSBbR1BCQ29kZWRJbnB1dFN0cmVhbSBzdHJlYW1XaXRoRGF0YTpkYXRhXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCgoaW50MzJfdCl2YWx1ZSwgW2lucHV0IHJlYWRJbnQzMl0pOwotICB9Ci0gIHsKLSAgICBHUEJDb2RlZElucHV0U3RyZWFtKiBpbnB1dCA9IFtHUEJDb2RlZElucHV0U3RyZWFtIHN0cmVhbVdpdGhEYXRhOmRhdGFdOwotICAgIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBbaW5wdXQgcmVhZEludDY0XSk7Ci0gIH0KLX0KLQotLSAodm9pZClhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzI6KE5TRGF0YSopZGF0YSB2YWx1ZTooaW50MzJfdCl2YWx1ZSB7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0ID0gW0dQQkNvZGVkSW5wdXRTdHJlYW0gc3RyZWFtV2l0aERhdGE6ZGF0YV07Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBbaW5wdXQgcmVhZFNGaXhlZDMyXSk7Ci19Ci0KLS0gKHZvaWQpYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjY0OihOU0RhdGEqKWRhdGEgdmFsdWU6KGludDY0X3QpdmFsdWUgewotICBHUEJDb2RlZElucHV0U3RyZWFtKiBpbnB1dCA9IFtHUEJDb2RlZElucHV0U3RyZWFtIHN0cmVhbVdpdGhEYXRhOmRhdGFdOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgW2lucHV0IHJlYWRTRml4ZWQ2NF0pOwotfQotCi0tICh2b2lkKWFzc2VydFJlYWRWYXJpbnRGYWlsdXJlOihOU0RhdGEqKWRhdGEgewotICB7Ci0gICAgR1BCQ29kZWRJbnB1dFN0cmVhbSogaW5wdXQgPSBbR1BCQ29kZWRJbnB1dFN0cmVhbSBzdHJlYW1XaXRoRGF0YTpkYXRhXTsKLSAgICBYQ1RBc3NlcnRUaHJvd3MoW2lucHV0IHJlYWRJbnQzMl0pOwotICB9Ci0gIHsKLSAgICBHUEJDb2RlZElucHV0U3RyZWFtKiBpbnB1dCA9IFtHUEJDb2RlZElucHV0U3RyZWFtIHN0cmVhbVdpdGhEYXRhOmRhdGFdOwotICAgIFhDVEFzc2VydFRocm93cyhbaW5wdXQgcmVhZEludDY0XSk7Ci0gIH0KLX0KLQotLSAodm9pZCl0ZXN0Qnl0ZXMgewotICBOU0RhdGEqIGRhdGEgPSBieXRlcygweGEyLCAweDc0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGF0YS5sZW5ndGgsIChOU1VJbnRlZ2VyKTIpOwotICBYQ1RBc3NlcnRFcXVhbCgoKHVpbnQ4X3QqKWRhdGEuYnl0ZXMpWzBdLCAodWludDhfdCkweGEyKTsKLSAgWENUQXNzZXJ0RXF1YWwoKCh1aW50OF90KilkYXRhLmJ5dGVzKVsxXSwgKHVpbnQ4X3QpMHg3NCk7Ci19Ci0KLS0gKHZvaWQpdGVzdFJlYWRWYXJpbnQgewotICBbc2VsZiBhc3NlcnRSZWFkVmFyaW50OmJ5dGVzKDB4MDApIHZhbHVlOjBdOwotICBbc2VsZiBhc3NlcnRSZWFkVmFyaW50OmJ5dGVzKDB4MDEpIHZhbHVlOjFdOwotICBbc2VsZiBhc3NlcnRSZWFkVmFyaW50OmJ5dGVzKDB4N2YpIHZhbHVlOjEyN107Ci0gIC8vIDE0ODgyCi0gIFtzZWxmIGFzc2VydFJlYWRWYXJpbnQ6Ynl0ZXMoMHhhMiwgMHg3NCkgdmFsdWU6KDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KV07Ci0gIC8vIDI5NjE0ODg4MzAKLSAgW3NlbGYgYXNzZXJ0UmVhZFZhcmludDpieXRlcygweGJlLCAweGY3LCAweDkyLCAweDg0LCAweDBiKQotICAgICAgICAgICAgICAgICAgIHZhbHVlOigweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICgweDA0IDw8IDIxKSB8ICgweDBiTEwgPDwgMjgpXTsKLQotICAvLyA2NC1iaXQKLSAgLy8gNzI1NjQ1NjEyNgotICBbc2VsZiBhc3NlcnRSZWFkVmFyaW50OmJ5dGVzKDB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MWIpCi0gICAgICAgICAgICAgICAgICAgdmFsdWU6KDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKDB4MDQgPDwgMjEpIHwgKDB4MWJMTCA8PCAyOCldOwotICAvLyA0MTI1NjIwMjU4MDcxODMzNgotICBbc2VsZiBhc3NlcnRSZWFkVmFyaW50OmJ5dGVzKDB4ODAsIDB4ZTYsIDB4ZWIsIDB4OWMsIDB4YzMsIDB4YzksIDB4YTQsIDB4NDkpCi0gICAgICAgICAgICAgICAgICAgdmFsdWU6KDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKDB4MWMgPDwgMjEpIHwgKDB4NDNMTCA8PCAyOCkgfCAoMHg0OUxMIDw8IDM1KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgKDB4MjRMTCA8PCA0MikgfCAoMHg0OUxMIDw8IDQ5KV07Ci0gIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxCi0gIFtzZWxmCi0gICAgICBhc3NlcnRSZWFkVmFyaW50OmJ5dGVzKDB4OWIsIDB4YTgsIDB4ZjksIDB4YzIsIDB4YmIsIDB4ZDYsIDB4ODAsIDB4ODUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4YTYsIDB4MDEpCi0gICAgICAgICAgICAgICAgIHZhbHVlOigweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAotICAgICAgICAgICAgICAgICAgICAgICAoMHgzYkxMIDw8IDI4KSB8ICgweDU2TEwgPDwgMzUpIHwgKDB4MDBMTCA8PCA0MikgfAotICAgICAgICAgICAgICAgICAgICAgICAoMHgwNUxMIDw8IDQ5KSB8ICgweDI2TEwgPDwgNTYpIHwgKDB4MDFMTCA8PCA2MyldOwotCi0gIC8vIEZhaWx1cmVzCi0gIFtzZWxmIGFzc2VydFJlYWRWYXJpbnRGYWlsdXJlOmJ5dGVzKDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsIDB4ODAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4ODAsIDB4ODAsIDB4ODAsIDB4MDApXTsKLSAgW3NlbGYgYXNzZXJ0UmVhZFZhcmludEZhaWx1cmU6Ynl0ZXMoMHg4MCldOwotfQotCi0tICh2b2lkKXRlc3RSZWFkTGl0dGxlRW5kaWFuIHsKLSAgW3NlbGYgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjMyOmJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToweDEyMzQ1Njc4XTsKLSAgW3NlbGYgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjMyOmJ5dGVzKDB4ZjAsIDB4ZGUsIDB4YmMsIDB4OWEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToweDlhYmNkZWYwXTsKLQotICBbc2VsZiBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQ6Ynl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToweDEyMzQ1Njc4OWFiY2RlZjBMTF07Ci0gIFtzZWxmIGFzc2VydFJlYWRMaXR0bGVFbmRpYW42NDpieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyLCAweGYwLCAweGRlLCAweGJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHg5YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOjB4OWFiY2RlZjAxMjM0NTY3OExMXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVhZFdob2xlTWVzc2FnZSB7Ci0gIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IFtzZWxmIGFsbFNldFJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0KLSAgTlNEYXRhKiByYXdCeXRlcyA9IG1lc3NhZ2UuZGF0YTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5zZXJpYWxpemVkU2l6ZSwgKHNpemVfdClyYXdCeXRlcy5sZW5ndGgpOwotCi0gIFRlc3RBbGxUeXBlcyogbWVzc2FnZTIgPQotICAgICAgW1Rlc3RBbGxUeXBlcyBwYXJzZUZyb21EYXRhOnJhd0J5dGVzIGV4dGVuc2lvblJlZ2lzdHJ5Om5pbCBlcnJvcjpOVUxMXTsKLSAgW3NlbGYgYXNzZXJ0QWxsRmllbGRzU2V0Om1lc3NhZ2UyIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci19Ci0KLS0gKHZvaWQpdGVzdFNraXBXaG9sZU1lc3NhZ2UgewotICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UgPSBbc2VsZiBhbGxTZXRSZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBOU0RhdGEqIHJhd0J5dGVzID0gbWVzc2FnZS5kYXRhOwotCi0gIC8vIENyZWF0ZSB0d28gcGFyYWxsZWwgaW5wdXRzLiAgUGFyc2Ugb25lIGFzIHVua25vd24gZmllbGRzIHdoaWxlIHVzaW5nCi0gIC8vIHNraXBGaWVsZCgpIHRvIHNraXAgZWFjaCBmaWVsZCBvbiB0aGUgb3RoZXIuICBFeHBlY3QgdGhlIHNhbWUgdGFncy4KLSAgR1BCQ29kZWRJbnB1dFN0cmVhbSogaW5wdXQxID0gW0dQQkNvZGVkSW5wdXRTdHJlYW0gc3RyZWFtV2l0aERhdGE6cmF3Qnl0ZXNdOwotICBHUEJDb2RlZElucHV0U3RyZWFtKiBpbnB1dDIgPSBbR1BCQ29kZWRJbnB1dFN0cmVhbSBzdHJlYW1XaXRoRGF0YTpyYXdCeXRlc107Ci0gIEdQQlVua25vd25GaWVsZFNldCogdW5rbm93bkZpZWxkcyA9Ci0gICAgICBbW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLQotICB3aGlsZSAoWUVTKSB7Ci0gICAgaW50MzJfdCB0YWcgPSBbaW5wdXQxIHJlYWRUYWddOwotICAgIFhDVEFzc2VydEVxdWFsKHRhZywgW2lucHV0MiByZWFkVGFnXSk7Ci0gICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgW3Vua25vd25GaWVsZHMgbWVyZ2VGaWVsZEZyb206dGFnIGlucHV0OmlucHV0MV07Ci0gICAgW2lucHV0MiBza2lwRmllbGQ6dGFnXTsKLSAgfQotfQotCi0tICh2b2lkKXRlc3RSZWFkSHVnZUJsb2IgewotICAvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBhIDFNQiBibG9iLgotICBOU011dGFibGVEYXRhKiBibG9iID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhMZW5ndGg6MSA8PCAyMF07Ci0gIGZvciAoTlNVSW50ZWdlciBpID0gMDsgaSA8IGJsb2IubGVuZ3RoOyBpKyspIHsKLSAgICAoKHVpbnQ4X3QqKWJsb2IubXV0YWJsZUJ5dGVzKVtpXSA9ICh1aW50OF90KWk7Ci0gIH0KLQotICAvLyBNYWtlIGEgbWVzc2FnZSBjb250YWluaW5nIGl0LgotICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRBbGxGaWVsZHM6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEJ5dGVzOmJsb2JdOwotCi0gIC8vIFNlcmlhbGl6ZSBhbmQgcGFyc2UgaXQuICBNYWtlIHN1cmUgdG8gcGFyc2UgZnJvbSBhbiBJbnB1dFN0cmVhbSwgbm90Ci0gIC8vIGRpcmVjdGx5IGZyb20gYSBCeXRlU3RyaW5nLCBzbyB0aGF0IENvZGVkSW5wdXRTdHJlYW0gdXNlcyBidWZmZXJlZAotICAvLyByZWFkaW5nLgotICBOU0RhdGEgKm1lc3NhZ2VEYXRhID0gbWVzc2FnZS5kYXRhOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZURhdGEpOwotICBHUEJDb2RlZElucHV0U3RyZWFtKiBzdHJlYW0gPQotICAgICAgW0dQQkNvZGVkSW5wdXRTdHJlYW0gc3RyZWFtV2l0aERhdGE6bWVzc2FnZURhdGFdOwotICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UyID0gW1Rlc3RBbGxUeXBlcyBwYXJzZUZyb21Db2RlZElucHV0U3RyZWFtOnN0cmVhbQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5Om5pbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOk5VTExdOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLm9wdGlvbmFsQnl0ZXMsIG1lc3NhZ2UyLm9wdGlvbmFsQnl0ZXMpOwotCi0gIC8vIE1ha2Ugc3VyZSBhbGwgdGhlIG90aGVyIGZpZWxkcyB3ZXJlIHBhcnNlZCBjb3JyZWN0bHkuCi0gIFRlc3RBbGxUeXBlcyogbWVzc2FnZTMgPSBbW21lc3NhZ2UyIGNvcHldIGF1dG9yZWxlYXNlXTsKLSAgVGVzdEFsbFR5cGVzKiB0eXBlcyA9IFtzZWxmIGFsbFNldFJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0gIE5TRGF0YSogZGF0YSA9IFt0eXBlcyBvcHRpb25hbEJ5dGVzXTsKLSAgW21lc3NhZ2UzIHNldE9wdGlvbmFsQnl0ZXM6ZGF0YV07Ci0KLSAgW3NlbGYgYXNzZXJ0QWxsRmllbGRzU2V0Om1lc3NhZ2UzIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlYWRNYWxpY2lvdXNseUxhcmdlQmxvYiB7Ci0gIE5TT3V0cHV0U3RyZWFtKiByYXdPdXRwdXQgPSBbTlNPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtVG9NZW1vcnldOwotICBHUEJDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0ID0KLSAgICAgIFtHUEJDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOnJhd091dHB1dF07Ci0KLSAgaW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZygxLCBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW291dHB1dCB3cml0ZVJhd1ZhcmludDMyOnRhZ107Ci0gIFtvdXRwdXQgd3JpdGVSYXdWYXJpbnQzMjoweDdGRkZGRkZGXTsKLSAgdWludDhfdCBieXRlc1szMl0gPSB7MH07Ci0gIFtvdXRwdXQgd3JpdGVSYXdEYXRhOltOU0RhdGEgZGF0YVdpdGhCeXRlczpieXRlcyBsZW5ndGg6MzJdXTsKLSAgW291dHB1dCBmbHVzaF07Ci0KLSAgTlNEYXRhKiBkYXRhID0KLSAgICAgIFtyYXdPdXRwdXQgcHJvcGVydHlGb3JLZXk6TlNTdHJlYW1EYXRhV3JpdHRlblRvTWVtb3J5U3RyZWFtS2V5XTsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbSogaW5wdXQgPQotICAgICAgW0dQQkNvZGVkSW5wdXRTdHJlYW0gc3RyZWFtV2l0aERhdGE6W05TTXV0YWJsZURhdGEgZGF0YVdpdGhEYXRhOmRhdGFdXTsKLSAgWENUQXNzZXJ0RXF1YWwodGFnLCBbaW5wdXQgcmVhZFRhZ10pOwotCi0gIFhDVEFzc2VydFRocm93cyhbaW5wdXQgcmVhZEJ5dGVzXSk7Ci19Ci0KLS8vIFZlcmlmaWVzIGZpeCBmb3IgYi8xMDMxNTMzNi4KLS8vIE5vdGU6IE5vdyB0aGF0IHRoZXJlIGlzbid0IGEgY3VzdG9tIHN0cmluZyBjbGFzcyB1bmRlciB0aGUgaG9vZCwgdGhpcyB0ZXN0Ci0vLyBpc24ndCBhcyBjcml0aWNhbCwgYnV0IGl0IGRvZXMgY292ZXIgYmFkIGlucHV0IGFuZCBpZiBhIGN1c3RvbSBjbGFzcyBpcyBhZGRlZAotLy8gYWdhaW4sIGl0IHdpbGwgaGVscCB2YWxpZGF0ZSB0aGF0IGNsYXNzJyBoYW5kaW5nIG9mIGJhZCB1dGY4LgotLSAodm9pZCl0ZXN0UmVhZE1hbGZvcm1lZFN0cmluZyB7Ci0gIE5TT3V0cHV0U3RyZWFtKiByYXdPdXRwdXQgPSBbTlNPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtVG9NZW1vcnldOwotICBHUEJDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0ID0KLSAgICAgIFtHUEJDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOnJhd091dHB1dF07Ci0KLSAgaW50MzJfdCB0YWcgPSBHUEJXaXJlRm9ybWF0TWFrZVRhZyhUZXN0QWxsVHlwZXNfRmllbGROdW1iZXJfRGVmYXVsdFN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgW291dHB1dCB3cml0ZVJhd1ZhcmludDMyOnRhZ107Ci0gIFtvdXRwdXQgd3JpdGVSYXdWYXJpbnQzMjo1XTsKLSAgLy8gQ3JlYXRlIGFuIGludmFsaWQgdXRmLTggYnl0ZSBhcnJheS4KLSAgdWludDhfdCBieXRlc1tdID0gezB4YzIsIDB4ZjIsIDB4MCwgMHgwLCAweDB9OwotICBbb3V0cHV0IHdyaXRlUmF3RGF0YTpbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6Ynl0ZXMgbGVuZ3RoOnNpemVvZihieXRlcyldXTsKLSAgW291dHB1dCBmbHVzaF07Ci0KLSAgTlNEYXRhICpkYXRhID0KLSAgICAgIFtyYXdPdXRwdXQgcHJvcGVydHlGb3JLZXk6TlNTdHJlYW1EYXRhV3JpdHRlblRvTWVtb3J5U3RyZWFtS2V5XTsKLSAgR1BCQ29kZWRJbnB1dFN0cmVhbSogaW5wdXQgPSBbR1BCQ29kZWRJbnB1dFN0cmVhbSBzdHJlYW1XaXRoRGF0YTpkYXRhXTsKLSAgTlNFcnJvciAqZXJyb3IgPSBuaWw7Ci0gIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgcGFyc2VGcm9tQ29kZWRJbnB1dFN0cmVhbTppbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6bmlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjomZXJyb3JdOwotICBYQ1RBc3NlcnROb3ROaWwoZXJyb3IpOwotICBYQ1RBc3NlcnROaWwobWVzc2FnZSk7Ci19Ci0KLS0gKHZvaWQpdGVzdEJPTVdpdGhpblN0cmluZ3MgewotICAvLyBXZSd2ZSBzZWVuIHNlcnZlcnMgdGhhdCBlbmQgdXAgd2l0aCBCT01zIHdpdGhpbiBzdHJpbmdzIChub3QgYWx3YXlzIGF0IHRoZQotICAvLyBzdGFydCwgYW5kIHNvbWV0aW1lcyBpbiBtdWx0aXBsZSBwbGFjZXMpLCBtYWtlIHN1cmUgdGhleSBhbHdheXMgcGFyc2UKLSAgLy8gY29ycmVjdGx5LiAoQWdhaW4sIHRoaXMgaXMgaW5wYXJ0IGluY2FzZSBhIGN1c3RvbSBzdHJpbmcgY2xhc3MgaXMgZXZlcgotICAvLyB1c2VkIGFnYWluLikKLSAgY29uc3QgY2hhciogc3Ryc1tdID0gewotICAgICJceEVGXHhCQlx4QkYgU3RyaW5nIHdpdGggQk9NIiwKLSAgICAiU3RyaW5nIHdpdGggXHhFRlx4QkJceEJGIGluIG1pZGRsZSIsCi0gICAgIlN0cmluZyB3aXRoIGVuZCBib20gXHhFRlx4QkJceEJGIiwKLSAgICAiXHhFRlx4QkJceEJGXHhlMlx4OTlceGExIiwgIC8vIEJPTSBXaGl0ZSBIZWFydAotICAgICJceEVGXHhCQlx4QkZceEVGXHhCQlx4QkYgU3RyaW5nIHdpdGggVHdvIEJPTSIsCi0gIH07Ci0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR1BCQVJSQVlTSVpFKHN0cnMpOyArK2kpIHsKLSAgICBOU091dHB1dFN0cmVhbSogcmF3T3V0cHV0ID0gW05TT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbVRvTWVtb3J5XTsKLSAgICBHUEJDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0ID0KLSAgICAgICAgW0dQQkNvZGVkT3V0cHV0U3RyZWFtIHN0cmVhbVdpdGhPdXRwdXRTdHJlYW06cmF3T3V0cHV0XTsKLQotICAgIGludDMyX3QgdGFnID0gR1BCV2lyZUZvcm1hdE1ha2VUYWcoVGVzdEFsbFR5cGVzX0ZpZWxkTnVtYmVyX0RlZmF1bHRTdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHUEJXaXJlRm9ybWF0TGVuZ3RoRGVsaW1pdGVkKTsKLSAgICBbb3V0cHV0IHdyaXRlUmF3VmFyaW50MzI6dGFnXTsKLSAgICBzaXplX3QgbGVuZ3RoID0gc3RybGVuKHN0cnNbaV0pOwotICAgIFtvdXRwdXQgd3JpdGVSYXdWYXJpbnQzMjooaW50MzJfdClsZW5ndGhdOwotICAgIFtvdXRwdXQgd3JpdGVSYXdEYXRhOltOU0RhdGEgZGF0YVdpdGhCeXRlczpzdHJzW2ldIGxlbmd0aDpsZW5ndGhdXTsKLSAgICBbb3V0cHV0IGZsdXNoXTsKLQotICAgIE5TRGF0YSogZGF0YSA9Ci0gICAgICAgIFtyYXdPdXRwdXQgcHJvcGVydHlGb3JLZXk6TlNTdHJlYW1EYXRhV3JpdHRlblRvTWVtb3J5U3RyZWFtS2V5XTsKLSAgICBHUEJDb2RlZElucHV0U3RyZWFtKiBpbnB1dCA9IFtHUEJDb2RlZElucHV0U3RyZWFtIHN0cmVhbVdpdGhEYXRhOmRhdGFdOwotICAgIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgcGFyc2VGcm9tQ29kZWRJbnB1dFN0cmVhbTppbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTpuaWwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2UsIEAiTG9vcCAlemQiLCBpKTsKLSAgICAvLyBFbnN1cmUgdGhlIHN0cmluZyBpcyB0aGVyZS4gTlNTdHJpbmcgY2FuIGNvbnN1bWUgdGhlIEJPTSBpbiBzb21lCi0gICAgLy8gY2FzZXMsIHNvIGRvbid0IGFjdHVhbGx5IGNoZWNrIHRoZSBzdHJpbmcgZm9yIGV4YWN0IGVxdWFsaXR5LgotICAgIFhDVEFzc2VydFRydWUobWVzc2FnZS5kZWZhdWx0U3RyaW5nLmxlbmd0aCA+IDAsIEAiTG9vcCAlemQiLCBpKTsKLSAgfQotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkNvZGVkT3VwdXRTdHJlYW1UZXN0cy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJDb2RlZE91cHV0U3RyZWFtVGVzdHMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDcyM2I2NC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkNvZGVkT3VwdXRTdHJlYW1UZXN0cy5tCisrKyAvZGV2L251bGwKQEAgLTEsMzQwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0ICJHUEJUZXN0VXRpbGl0aWVzLmgiCi0KLSNpbXBvcnQgIkdQQkNvZGVkT3V0cHV0U3RyZWFtX1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJHUEJDb2RlZElucHV0U3RyZWFtLmgiCi0jaW1wb3J0ICJHUEJVdGlsaXRpZXNfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMuaCIKLQotQGludGVyZmFjZSBHUEJDb2RlZE91dHB1dFN0cmVhbSAoSW50ZXJuYWxNZXRob2RzKQotLy8gRGVjbGFyZWQgaW4gdGhlIC5tIGZpbGUsIGV4cG9zZSBmb3IgdGVzdGluZy4KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aE91dHB1dFN0cmVhbTooTlNPdXRwdXRTdHJlYW0gKilvdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YTooTlNNdXRhYmxlRGF0YSAqKWRhdGE7Ci1AZW5kCi0KLUBpbnRlcmZhY2UgR1BCQ29kZWRPdXRwdXRTdHJlYW0gKEhlbHBlcikKLSsgKGluc3RhbmNldHlwZSlzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOihOU091dHB1dFN0cmVhbSAqKW91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemU6KHNpemVfdClidWZmZXJTaXplOwotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCQ29kZWRPdXRwdXRTdHJlYW0gKEhlbHBlcikKLSsgKGluc3RhbmNldHlwZSlzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOihOU091dHB1dFN0cmVhbSAqKW91dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemU6KHNpemVfdClidWZmZXJTaXplIHsKLSAgTlNNdXRhYmxlRGF0YSAqZGF0YSA9IFtOU011dGFibGVEYXRhIGRhdGFXaXRoTGVuZ3RoOmJ1ZmZlclNpemVdOwotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhPdXRwdXRTdHJlYW06b3V0cHV0IGRhdGE6ZGF0YV0gYXV0b3JlbGVhc2VdOwotfQotQGVuZAotCi1AaW50ZXJmYWNlIENvZGVkT3V0cHV0U3RyZWFtVGVzdHMgOiBHUEJUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gQ29kZWRPdXRwdXRTdHJlYW1UZXN0cwotCi0tIChOU0RhdGEqKWJ5dGVzX3dpdGhfc2VudGluZWw6KGludDMyX3QpdW51c2VkLCAuLi4gewotICB2YV9saXN0IGxpc3Q7Ci0gIHZhX3N0YXJ0KGxpc3QsIHVudXNlZCk7Ci0KLSAgTlNNdXRhYmxlRGF0YSogdmFsdWVzID0gW05TTXV0YWJsZURhdGEgZGF0YVdpdGhDYXBhY2l0eTowXTsKLSAgaW50MzJfdCBpOwotCi0gIHdoaWxlICgoaSA9IHZhX2FyZyhsaXN0LCBpbnQzMl90KSkgIT0gMjU2KSB7Ci0gICAgTlNBc3NlcnQoaSA+PSAwICYmIGkgPCAyNTYsIEAiIik7Ci0gICAgdWludDhfdCB1ID0gKHVpbnQ4X3QpaTsKLSAgICBbdmFsdWVzIGFwcGVuZEJ5dGVzOiZ1IGxlbmd0aDoxXTsKLSAgfQotCi0gIHZhX2VuZChsaXN0KTsKLQotICByZXR1cm4gdmFsdWVzOwotfQotCi0jZGVmaW5lIGJ5dGVzKC4uLikgW3NlbGYgYnl0ZXNfd2l0aF9zZW50aW5lbDowLCBfX1ZBX0FSR1NfXywgMjU2XQotCi0tICh2b2lkKWFzc2VydFdyaXRlTGl0dGxlRW5kaWFuMzI6KE5TRGF0YSopZGF0YSB2YWx1ZTooaW50MzJfdCl2YWx1ZSB7Ci0gIE5TT3V0cHV0U3RyZWFtKiByYXdPdXRwdXQgPSBbTlNPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtVG9NZW1vcnldOwotICBHUEJDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0ID0KLSAgICAgIFtHUEJDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOnJhd091dHB1dF07Ci0gIFtvdXRwdXQgd3JpdGVSYXdMaXR0bGVFbmRpYW4zMjooaW50MzJfdCl2YWx1ZV07Ci0gIFtvdXRwdXQgZmx1c2hdOwotCi0gIE5TRGF0YSogYWN0dWFsID0KLSAgICAgIFtyYXdPdXRwdXQgcHJvcGVydHlGb3JLZXk6TlNTdHJlYW1EYXRhV3JpdHRlblRvTWVtb3J5U3RyZWFtS2V5XTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRhdGEsIGFjdHVhbCk7Ci0KLSAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikgewotICAgIHJhd091dHB1dCA9IFtOU091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW1Ub01lbW9yeV07Ci0gICAgb3V0cHV0ID0gW0dQQkNvZGVkT3V0cHV0U3RyZWFtIHN0cmVhbVdpdGhPdXRwdXRTdHJlYW06cmF3T3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemU6YmxvY2tTaXplXTsKLSAgICBbb3V0cHV0IHdyaXRlUmF3TGl0dGxlRW5kaWFuMzI6KGludDMyX3QpdmFsdWVdOwotICAgIFtvdXRwdXQgZmx1c2hdOwotCi0gICAgYWN0dWFsID0gW3Jhd091dHB1dCBwcm9wZXJ0eUZvcktleTpOU1N0cmVhbURhdGFXcml0dGVuVG9NZW1vcnlTdHJlYW1LZXldOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkYXRhLCBhY3R1YWwpOwotICB9Ci19Ci0KLS0gKHZvaWQpYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW42NDooTlNEYXRhKilkYXRhIHZhbHVlOihpbnQ2NF90KXZhbHVlIHsKLSAgTlNPdXRwdXRTdHJlYW0qIHJhd091dHB1dCA9IFtOU091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW1Ub01lbW9yeV07Ci0gIEdQQkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQgPQotICAgICAgW0dQQkNvZGVkT3V0cHV0U3RyZWFtIHN0cmVhbVdpdGhPdXRwdXRTdHJlYW06cmF3T3V0cHV0XTsKLSAgW291dHB1dCB3cml0ZVJhd0xpdHRsZUVuZGlhbjY0OnZhbHVlXTsKLSAgW291dHB1dCBmbHVzaF07Ci0KLSAgTlNEYXRhKiBhY3R1YWwgPQotICAgICAgW3Jhd091dHB1dCBwcm9wZXJ0eUZvcktleTpOU1N0cmVhbURhdGFXcml0dGVuVG9NZW1vcnlTdHJlYW1LZXldOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGF0YSwgYWN0dWFsKTsKLQotICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKSB7Ci0gICAgcmF3T3V0cHV0ID0gW05TT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbVRvTWVtb3J5XTsKLSAgICBvdXRwdXQgPSBbR1BCQ29kZWRPdXRwdXRTdHJlYW0gc3RyZWFtV2l0aE91dHB1dFN0cmVhbTpyYXdPdXRwdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyU2l6ZTpibG9ja1NpemVdOwotICAgIFtvdXRwdXQgd3JpdGVSYXdMaXR0bGVFbmRpYW42NDp2YWx1ZV07Ci0gICAgW291dHB1dCBmbHVzaF07Ci0KLSAgICBhY3R1YWwgPSBbcmF3T3V0cHV0IHByb3BlcnR5Rm9yS2V5Ok5TU3RyZWFtRGF0YVdyaXR0ZW5Ub01lbW9yeVN0cmVhbUtleV07Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRhdGEsIGFjdHVhbCk7Ci0gIH0KLX0KLQotLSAodm9pZClhc3NlcnRXcml0ZVZhcmludDooTlNEYXRhKilkYXRhIHZhbHVlOihpbnQ2NF90KXZhbHVlIHsKLSAgLy8gT25seSBkbyAzMi1iaXQgd3JpdGUgaWYgdGhlIHZhbHVlIGZpdHMgaW4gMzIgYml0cy4KLSAgaWYgKEdQQkxvZ2ljYWxSaWdodFNoaWZ0NjQodmFsdWUsIDMyKSA9PSAwKSB7Ci0gICAgTlNPdXRwdXRTdHJlYW0qIHJhd091dHB1dCA9IFtOU091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW1Ub01lbW9yeV07Ci0gICAgR1BCQ29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCA9Ci0gICAgICAgIFtHUEJDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOnJhd091dHB1dF07Ci0gICAgW291dHB1dCB3cml0ZVJhd1ZhcmludDMyOihpbnQzMl90KXZhbHVlXTsKLSAgICBbb3V0cHV0IGZsdXNoXTsKLQotICAgIE5TRGF0YSogYWN0dWFsID0KLSAgICAgICAgW3Jhd091dHB1dCBwcm9wZXJ0eUZvcktleTpOU1N0cmVhbURhdGFXcml0dGVuVG9NZW1vcnlTdHJlYW1LZXldOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkYXRhLCBhY3R1YWwpOwotCi0gICAgLy8gQWxzbyB0cnkgY29tcHV0aW5nIHNpemUuCi0gICAgWENUQXNzZXJ0RXF1YWwoR1BCQ29tcHV0ZVJhd1ZhcmludDMyU2l6ZSgoaW50MzJfdCl2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgKHNpemVfdClkYXRhLmxlbmd0aCk7Ci0gIH0KLQotICB7Ci0gICAgTlNPdXRwdXRTdHJlYW0qIHJhd091dHB1dCA9IFtOU091dHB1dFN0cmVhbSBvdXRwdXRTdHJlYW1Ub01lbW9yeV07Ci0gICAgR1BCQ29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCA9Ci0gICAgICAgIFtHUEJDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOnJhd091dHB1dF07Ci0gICAgW291dHB1dCB3cml0ZVJhd1ZhcmludDY0OnZhbHVlXTsKLSAgICBbb3V0cHV0IGZsdXNoXTsKLQotICAgIE5TRGF0YSogYWN0dWFsID0KLSAgICAgICAgW3Jhd091dHB1dCBwcm9wZXJ0eUZvcktleTpOU1N0cmVhbURhdGFXcml0dGVuVG9NZW1vcnlTdHJlYW1LZXldOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkYXRhLCBhY3R1YWwpOwotCi0gICAgLy8gQWxzbyB0cnkgY29tcHV0aW5nIHNpemUuCi0gICAgWENUQXNzZXJ0RXF1YWwoR1BCQ29tcHV0ZVJhd1ZhcmludDY0U2l6ZSh2YWx1ZSksIChzaXplX3QpZGF0YS5sZW5ndGgpOwotICB9Ci0KLSAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikgewotICAgIC8vIE9ubHkgZG8gMzItYml0IHdyaXRlIGlmIHRoZSB2YWx1ZSBmaXRzIGluIDMyIGJpdHMuCi0gICAgaWYgKEdQQkxvZ2ljYWxSaWdodFNoaWZ0NjQodmFsdWUsIDMyKSA9PSAwKSB7Ci0gICAgICBOU091dHB1dFN0cmVhbSogcmF3T3V0cHV0ID0gW05TT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbVRvTWVtb3J5XTsKLSAgICAgIEdQQkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQgPQotICAgICAgICAgIFtHUEJDb2RlZE91dHB1dFN0cmVhbSBzdHJlYW1XaXRoT3V0cHV0U3RyZWFtOnJhd091dHB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplOmJsb2NrU2l6ZV07Ci0KLSAgICAgIFtvdXRwdXQgd3JpdGVSYXdWYXJpbnQzMjooaW50MzJfdCl2YWx1ZV07Ci0gICAgICBbb3V0cHV0IGZsdXNoXTsKLQotICAgICAgTlNEYXRhKiBhY3R1YWwgPQotICAgICAgICAgIFtyYXdPdXRwdXQgcHJvcGVydHlGb3JLZXk6TlNTdHJlYW1EYXRhV3JpdHRlblRvTWVtb3J5U3RyZWFtS2V5XTsKLSAgICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkYXRhLCBhY3R1YWwpOwotICAgIH0KLQotICAgIHsKLSAgICAgIE5TT3V0cHV0U3RyZWFtKiByYXdPdXRwdXQgPSBbTlNPdXRwdXRTdHJlYW0gb3V0cHV0U3RyZWFtVG9NZW1vcnldOwotICAgICAgR1BCQ29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCA9Ci0gICAgICAgICAgW0dQQkNvZGVkT3V0cHV0U3RyZWFtIHN0cmVhbVdpdGhPdXRwdXRTdHJlYW06cmF3T3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmZlclNpemU6YmxvY2tTaXplXTsKLQotICAgICAgW291dHB1dCB3cml0ZVJhd1ZhcmludDY0OnZhbHVlXTsKLSAgICAgIFtvdXRwdXQgZmx1c2hdOwotCi0gICAgICBOU0RhdGEqIGFjdHVhbCA9Ci0gICAgICAgICAgW3Jhd091dHB1dCBwcm9wZXJ0eUZvcktleTpOU1N0cmVhbURhdGFXcml0dGVuVG9NZW1vcnlTdHJlYW1LZXldOwotICAgICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRhdGEsIGFjdHVhbCk7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpdGVzdFdyaXRlVmFyaW50MSB7Ci0gIFtzZWxmIGFzc2VydFdyaXRlVmFyaW50OmJ5dGVzKDB4MDApIHZhbHVlOjBdOwotfQotCi0tICh2b2lkKXRlc3RXcml0ZVZhcmludDIgewotICBbc2VsZiBhc3NlcnRXcml0ZVZhcmludDpieXRlcygweDAxKSB2YWx1ZToxXTsKLX0KLQotLSAodm9pZCl0ZXN0V3JpdGVWYXJpbnQzIHsKLSAgW3NlbGYgYXNzZXJ0V3JpdGVWYXJpbnQ6Ynl0ZXMoMHg3ZikgdmFsdWU6MTI3XTsKLX0KLQotLSAodm9pZCl0ZXN0V3JpdGVWYXJpbnQ0IHsKLSAgLy8gMTQ4ODIKLSAgW3NlbGYgYXNzZXJ0V3JpdGVWYXJpbnQ6Ynl0ZXMoMHhhMiwgMHg3NCkgdmFsdWU6KDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KV07Ci19Ci0KLS0gKHZvaWQpdGVzdFdyaXRlVmFyaW50NSB7Ci0gIC8vIDI5NjE0ODg4MzAKLSAgW3NlbGYgYXNzZXJ0V3JpdGVWYXJpbnQ6Ynl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYikKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6KDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICgweDA0IDw8IDIxKSB8ICgweDBiTEwgPDwgMjgpXTsKLX0KLQotLSAodm9pZCl0ZXN0V3JpdGVWYXJpbnQ2IHsKLSAgLy8gNjQtYml0Ci0gIC8vIDcyNTY0NTYxMjYKLSAgW3NlbGYgYXNzZXJ0V3JpdGVWYXJpbnQ6Ynl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYikKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6KDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICgweDA0IDw8IDIxKSB8ICgweDFiTEwgPDwgMjgpXTsKLX0KLQotLSAodm9pZCl0ZXN0V3JpdGVWYXJpbnQ3IHsKLSAgLy8gNDEyNTYyMDI1ODA3MTgzMzYKLSAgW3NlbGYgYXNzZXJ0V3JpdGVWYXJpbnQ6Ynl0ZXMoMHg4MCwgMHhlNiwgMHhlYiwgMHg5YywgMHhjMywgMHhjOSwgMHhhNCwgMHg0OSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6KDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICgweDFjIDw8IDIxKSB8ICgweDQzTEwgPDwgMjgpIHwgKDB4NDlMTCA8PCAzNSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgyNExMIDw8IDQyKSB8ICgweDQ5TEwgPDwgNDkpXTsKLX0KLQotLSAodm9pZCl0ZXN0V3JpdGVWYXJpbnQ4IHsKLSAgLy8gMTE5NjQzNzgzMzA5Nzg3MzUxMzEKLSAgW3NlbGYgYXNzZXJ0V3JpdGVWYXJpbnQ6Ynl0ZXMoMHg5YiwgMHhhOCwgMHhmOSwgMHhjMiwgMHhiYiwgMHhkNiwgMHg4MCwgMHg4NSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhhNiwgMHgwMSkKLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6KDB4MWIgPDwgMCkgfCAoMHgyOCA8PCA3KSB8ICgweDc5IDw8IDE0KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICgweDQyIDw8IDIxKSB8ICgweDNiTEwgPDwgMjgpIHwgKDB4NTZMTCA8PCAzNSkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMExMIDw8IDQyKSB8ICgweDA1TEwgPDwgNDkpIHwgKDB4MjZMTCA8PCA1NikgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAoMHgwMUxMIDw8IDYzKV07Ci19Ci0KLS0gKHZvaWQpdGVzdFdyaXRlTGl0dGxlRW5kaWFuIHsKLSAgW3NlbGYgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMjpieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOjB4MTIzNDU2NzhdOwotICBbc2VsZiBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjMyOmJ5dGVzKDB4ZjAsIDB4ZGUsIDB4YmMsIDB4OWEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6MHg5YWJjZGVmMF07Ci0KLSAgW3NlbGYgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW42NDpieXRlcygweGYwLCAweGRlLCAweGJjLCAweDlhLCAweDc4LCAweDU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDB4MzQsIDB4MTIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWU6MHgxMjM0NTY3ODlhYmNkZWYwTExdOwotICBbc2VsZiBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0OmJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIsIDB4ZjAsIDB4ZGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMHhiYywgMHg5YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZToweDlhYmNkZWYwMTIzNDU2NzhMTF07Ci19Ci0KLS0gKHZvaWQpdGVzdEVuY29kZVppZ1phZyB7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBHUEJFbmNvZGVaaWdaYWczMigwKSk7Ci0gIFhDVEFzc2VydEVxdWFsKDFVLCBHUEJFbmNvZGVaaWdaYWczMigtMSkpOwotICBYQ1RBc3NlcnRFcXVhbCgyVSwgR1BCRW5jb2RlWmlnWmFnMzIoMSkpOwotICBYQ1RBc3NlcnRFcXVhbCgzVSwgR1BCRW5jb2RlWmlnWmFnMzIoLTIpKTsKLSAgWENUQXNzZXJ0RXF1YWwoMHg3RkZGRkZGRVUsIEdQQkVuY29kZVppZ1phZzMyKDB4M0ZGRkZGRkYpKTsKLSAgWENUQXNzZXJ0RXF1YWwoMHg3RkZGRkZGRlUsIEdQQkVuY29kZVppZ1phZzMyKDB4QzAwMDAwMDApKTsKLSAgWENUQXNzZXJ0RXF1YWwoMHhGRkZGRkZGRVUsIEdQQkVuY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKLSAgWENUQXNzZXJ0RXF1YWwoMHhGRkZGRkZGRlUsIEdQQkVuY29kZVppZ1phZzMyKDB4ODAwMDAwMDApKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgwVUxMLCBHUEJFbmNvZGVaaWdaYWc2NCgwKSk7Ci0gIFhDVEFzc2VydEVxdWFsKDFVTEwsIEdQQkVuY29kZVppZ1phZzY0KC0xKSk7Ci0gIFhDVEFzc2VydEVxdWFsKDJVTEwsIEdQQkVuY29kZVppZ1phZzY0KDEpKTsKLSAgWENUQXNzZXJ0RXF1YWwoM1VMTCwgR1BCRW5jb2RlWmlnWmFnNjQoLTIpKTsKLSAgWENUQXNzZXJ0RXF1YWwoMHgwMDAwMDAwMDdGRkZGRkZFVUxMLAotICAgICAgICAgICAgICAgICBHUEJFbmNvZGVaaWdaYWc2NCgweDAwMDAwMDAwM0ZGRkZGRkZMTCkpOwotICBYQ1RBc3NlcnRFcXVhbCgweDAwMDAwMDAwN0ZGRkZGRkZVTEwsCi0gICAgICAgICAgICAgICAgIEdQQkVuY29kZVppZ1phZzY0KDB4RkZGRkZGRkZDMDAwMDAwMExMKSk7Ci0gIFhDVEFzc2VydEVxdWFsKDB4MDAwMDAwMDBGRkZGRkZGRVVMTCwKLSAgICAgICAgICAgICAgICAgR1BCRW5jb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZGTEwpKTsKLSAgWENUQXNzZXJ0RXF1YWwoMHgwMDAwMDAwMEZGRkZGRkZGVUxMLAotICAgICAgICAgICAgICAgICBHUEJFbmNvZGVaaWdaYWc2NCgweEZGRkZGRkZGODAwMDAwMDBMTCkpOwotICBYQ1RBc3NlcnRFcXVhbCgweEZGRkZGRkZGRkZGRkZGRkVVTEwsCi0gICAgICAgICAgICAgICAgIEdQQkVuY29kZVppZ1phZzY0KDB4N0ZGRkZGRkZGRkZGRkZGRkxMKSk7Ci0gIFhDVEFzc2VydEVxdWFsKDB4RkZGRkZGRkZGRkZGRkZGRlVMTCwKLSAgICAgICAgICAgICAgICAgR1BCRW5jb2RlWmlnWmFnNjQoMHg4MDAwMDAwMDAwMDAwMDAwTEwpKTsKLQotICAvLyBTb21lIGVhc2llci10by12ZXJpZnkgcm91bmQtdHJpcCB0ZXN0cy4gIFRoZSBpbnB1dHMgKG90aGVyIHRoYW4gMCwgMSwgLTEpCi0gIC8vIHdlcmUgY2hvc2VuIHNlbWktcmFuZG9tbHkgdmlhIGtleWJvYXJkIGJhc2hpbmcuCi0gIFhDVEFzc2VydEVxdWFsKDBVLCBHUEJFbmNvZGVaaWdaYWczMihHUEJEZWNvZGVaaWdaYWczMigwKSkpOwotICBYQ1RBc3NlcnRFcXVhbCgxVSwgR1BCRW5jb2RlWmlnWmFnMzIoR1BCRGVjb2RlWmlnWmFnMzIoMSkpKTsKLSAgWENUQXNzZXJ0RXF1YWwoLTFVLCBHUEJFbmNvZGVaaWdaYWczMihHUEJEZWNvZGVaaWdaYWczMigtMSkpKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTQ5MjdVLCBHUEJFbmNvZGVaaWdaYWczMihHUEJEZWNvZGVaaWdaYWczMigxNDkyNykpKTsKLSAgWENUQXNzZXJ0RXF1YWwoLTM2MTJVLCBHUEJFbmNvZGVaaWdaYWczMihHUEJEZWNvZGVaaWdaYWczMigtMzYxMikpKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgwVUxMLCBHUEJFbmNvZGVaaWdaYWc2NChHUEJEZWNvZGVaaWdaYWc2NCgwKSkpOwotICBYQ1RBc3NlcnRFcXVhbCgxVUxMLCBHUEJFbmNvZGVaaWdaYWc2NChHUEJEZWNvZGVaaWdaYWc2NCgxKSkpOwotICBYQ1RBc3NlcnRFcXVhbCgtMVVMTCwgR1BCRW5jb2RlWmlnWmFnNjQoR1BCRGVjb2RlWmlnWmFnNjQoLTEpKSk7Ci0gIFhDVEFzc2VydEVxdWFsKDE0OTI3VUxMLCBHUEJFbmNvZGVaaWdaYWc2NChHUEJEZWNvZGVaaWdaYWc2NCgxNDkyNykpKTsKLSAgWENUQXNzZXJ0RXF1YWwoLTM2MTJVTEwsIEdQQkVuY29kZVppZ1phZzY0KEdQQkRlY29kZVppZ1phZzY0KC0zNjEyKSkpOwotCi0gIFhDVEFzc2VydEVxdWFsKDg1NjkxMjMwNDgwMTQxNlVMTCwKLSAgICAgICAgICAgICAgICAgR1BCRW5jb2RlWmlnWmFnNjQoR1BCRGVjb2RlWmlnWmFnNjQoODU2OTEyMzA0ODAxNDE2TEwpKSk7Ci0gIFhDVEFzc2VydEVxdWFsKC03NTEyMzkwNTQzOTU3MTI1NlVMTCwKLSAgICAgICAgICAgICAgICAgR1BCRW5jb2RlWmlnWmFnNjQoR1BCRGVjb2RlWmlnWmFnNjQoLTc1MTIzOTA1NDM5NTcxMjU2TEwpKSk7Ci19Ci0KLS0gKHZvaWQpdGVzdFdyaXRlV2hvbGVNZXNzYWdlIHsKLSAgLy8gTm90IGtHUEJEZWZhdWx0UmVwZWF0Q291bnQgYmVjYXVzZSB3ZSBhcmUgY29tcGFyaW5nIHRvIGEgZ29sZGVuIG1hc3RlciBmaWxlCi0gIC8vIHRoYXQgd2FzIGdlbmVyYXRlZCB3aXRoIDIuCi0gIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IFtzZWxmIGFsbFNldFJlcGVhdGVkQ291bnQ6Ml07Ci0KLSAgTlNEYXRhKiByYXdCeXRlcyA9IG1lc3NhZ2UuZGF0YTsKLSAgTlNEYXRhKiBnb2xkZW5EYXRhID0KLSAgICAgIFtzZWxmIGdldERhdGFGaWxlTmFtZWQ6QCJnb2xkZW5fbWVzc2FnZSIgZGF0YVRvV3JpdGU6cmF3Qnl0ZXNdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmF3Qnl0ZXMsIGdvbGRlbkRhdGEpOwotCi0gIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCi0gIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8IDI1NjsgYmxvY2tTaXplICo9IDIpIHsKLSAgICBOU091dHB1dFN0cmVhbSogcmF3T3V0cHV0ID0gW05TT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbVRvTWVtb3J5XTsKLSAgICBHUEJDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0ID0KLSAgICAgICAgW0dQQkNvZGVkT3V0cHV0U3RyZWFtIHN0cmVhbVdpdGhPdXRwdXRTdHJlYW06cmF3T3V0cHV0Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJTaXplOmJsb2NrU2l6ZV07Ci0gICAgW21lc3NhZ2Ugd3JpdGVUb0NvZGVkT3V0cHV0U3RyZWFtOm91dHB1dF07Ci0gICAgW291dHB1dCBmbHVzaF07Ci0KLSAgICBOU0RhdGEqIGFjdHVhbCA9Ci0gICAgICAgIFtyYXdPdXRwdXQgcHJvcGVydHlGb3JLZXk6TlNTdHJlYW1EYXRhV3JpdHRlblRvTWVtb3J5U3RyZWFtS2V5XTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmF3Qnl0ZXMsIGFjdHVhbCk7Ci0gIH0KLQotICAvLyBOb3Qga0dQQkRlZmF1bHRSZXBlYXRDb3VudCBiZWNhdXNlIHdlIGFyZSBjb21wYXJpbmcgdG8gYSBnb2xkZW4gbWFzdGVyIGZpbGUKLSAgLy8gdGhhdCB3YXMgZ2VuZXJhdGVkIHdpdGggMi4KLSAgVGVzdEFsbEV4dGVuc2lvbnMqIGV4dGVuc2lvbnMgPSBbc2VsZiBhbGxFeHRlbnNpb25zU2V0UmVwZWF0ZWRDb3VudDoyXTsKLSAgcmF3Qnl0ZXMgPSBleHRlbnNpb25zLmRhdGE7Ci0gIGdvbGRlbkRhdGEgPSBbc2VsZiBnZXREYXRhRmlsZU5hbWVkOkAiZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YVRvV3JpdGU6cmF3Qnl0ZXNdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmF3Qnl0ZXMsIGdvbGRlbkRhdGEpOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkNvbmN1cnJlbmN5VGVzdHMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCQ29uY3VycmVuY3lUZXN0cy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYWY3NWU3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCQ29uY3VycmVuY3lUZXN0cy5tCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0ICJHUEJUZXN0VXRpbGl0aWVzLmgiCi0KLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdE9iamMucGJvYmpjLmgiCi0KLXN0YXRpYyBjb25zdCBpbnQga051bVRocmVhZHMgPSAxMDA7Ci1zdGF0aWMgY29uc3QgaW50IGtOdW1NZXNzYWdlcyA9IDEwMDsKLQotLy8gTk9URTogTW9zdCBvZiB0aGVzZSB0ZXN0cyBkb24ndCAiZmFpbCIgaW4gdGhlIHNlbnNlIHRoYXQgdGhlIFhDVEFzc2VydHMKLS8vIHRyaXAuICBSYXRoZXIsIHRoZSBhc3NlcnRzIHNpbXBseSBleGVyY2lzZSB0aGUgYXBpcywgYW5kIGlmIHRoZXJlIGlzCi0vLyBhIGNvbmN1cmFuY3kgaXNzdWUsIHRoZSBOU0Fzc2VydHMgaW4gdGhlIHJ1bnRpbWUgY29kZSBmaXJlIGFuZC9vciB0aGUKLS8vIGNvZGUganVzdCBjcmFzaGVzIG91dHJpZ2h0LgotCi1AaW50ZXJmYWNlIENvbmN1cnJlbmN5VGVzdHMgOiBHUEJUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gQ29uY3VycmVuY3lUZXN0cwotCi0tIChOU0FycmF5ICopY3JlYXRlVGhyZWFkc1dpdGhTZWxlY3RvcjooU0VMKXNlbGVjdG9yIG9iamVjdDooaWQpb2JqZWN0IHsKLSAgTlNNdXRhYmxlQXJyYXkgKmFycmF5ID0gW05TTXV0YWJsZUFycmF5IGFycmF5XTsKLSAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwga051bVRocmVhZHM7IGkrKykgewotICAgIE5TVGhyZWFkICp0aHJlYWQgPQotICAgICAgICBbW05TVGhyZWFkIGFsbG9jXSBpbml0V2l0aFRhcmdldDpzZWxmIHNlbGVjdG9yOnNlbGVjdG9yIG9iamVjdDpvYmplY3RdOwotICAgIFthcnJheSBhZGRPYmplY3Q6dGhyZWFkXTsKLSAgICBbdGhyZWFkIHJlbGVhc2VdOwotICB9Ci0gIHJldHVybiBhcnJheTsKLX0KLQotLSAoTlNBcnJheSAqKWNyZWF0ZU1lc3NhZ2VzV2l0aFR5cGU6KENsYXNzKW1zZ1R5cGUgewotICBOU011dGFibGVBcnJheSAqYXJyYXkgPSBbTlNNdXRhYmxlQXJyYXkgYXJyYXldOwotICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCBrTnVtTWVzc2FnZXM7IGkrKykgewotICAgIFthcnJheSBhZGRPYmplY3Q6W21zZ1R5cGUgbWVzc2FnZV1dOwotICB9Ci0gIHJldHVybiBhcnJheTsKLX0KLQotLSAodm9pZClzdGFydFRocmVhZHM6KE5TQXJyYXkgKil0aHJlYWRzIHsKLSAgZm9yIChOU1RocmVhZCAqdGhyZWFkIGluIHRocmVhZHMpIHsKLSAgICBbdGhyZWFkIHN0YXJ0XTsKLSAgfQotfQotCi0tICh2b2lkKWpvaW5UaHJlYWRzOihOU0FycmF5ICopdGhyZWFkcyB7Ci0gIGZvciAoTlNUaHJlYWQgKnRocmVhZCBpbiB0aHJlYWRzKSB7Ci0gICAgd2hpbGUgKCFbdGhyZWFkIGlzRmluaXNoZWRdKQotICAgICAgOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVhZEZvcmVpZ25NZXNzYWdlOihOU0FycmF5ICopbWVzc2FnZXMgewotICBmb3IgKE5TVUludGVnZXIgaSA9IDA7IGkgPCAxMDsgaSsrKSB7Ci0gICAgZm9yIChUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgaW4gbWVzc2FnZXMpIHsKLSAgICAgIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxGb3JlaWduTWVzc2FnZS5jLCAwKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZCl0ZXN0Q29uY3VycmVudFJlYWRPZlVuc2V0TWVzc2FnZUZpZWxkIHsKLSAgTlNBcnJheSAqbWVzc2FnZXMgPSBbc2VsZiBjcmVhdGVNZXNzYWdlc1dpdGhUeXBlOltUZXN0QWxsVHlwZXMgY2xhc3NdXTsKLSAgTlNBcnJheSAqdGhyZWFkcyA9Ci0gICAgICBbc2VsZiBjcmVhdGVUaHJlYWRzV2l0aFNlbGVjdG9yOkBzZWxlY3RvcihyZWFkRm9yZWlnbk1lc3NhZ2U6KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDptZXNzYWdlc107Ci0gIFtzZWxmIHN0YXJ0VGhyZWFkczp0aHJlYWRzXTsKLSAgW3NlbGYgam9pblRocmVhZHM6dGhyZWFkc107Ci0gIGZvciAoVGVzdEFsbFR5cGVzICptZXNzYWdlIGluIG1lc3NhZ2VzKSB7Ci0gICAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgfQotfQotCi0tICh2b2lkKXJlYWRSZXBlYXRlZEludDMyOihOU0FycmF5ICopbWVzc2FnZXMgewotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBmb3IgKFRlc3RBbGxUeXBlcyAqbWVzc2FnZSBpbiBtZXNzYWdlcykgewotICAgICAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5IGNvdW50XSwgKE5TVUludGVnZXIpMCk7Ci0gICAgfQotICB9Ci19Ci0KLS0gKHZvaWQpdGVzdENvbmN1cnJlbnRSZWFkT2ZVbnNldFJlcGVhdGVkSW50RmllbGQgewotICBOU0FycmF5ICptZXNzYWdlcyA9IFtzZWxmIGNyZWF0ZU1lc3NhZ2VzV2l0aFR5cGU6W1Rlc3RBbGxUeXBlcyBjbGFzc11dOwotICBOU0FycmF5ICp0aHJlYWRzID0KLSAgICAgIFtzZWxmIGNyZWF0ZVRocmVhZHNXaXRoU2VsZWN0b3I6QHNlbGVjdG9yKHJlYWRSZXBlYXRlZEludDMyOikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Q6bWVzc2FnZXNdOwotICBbc2VsZiBzdGFydFRocmVhZHM6dGhyZWFkc107Ci0gIFtzZWxmIGpvaW5UaHJlYWRzOnRocmVhZHNdOwotICBmb3IgKFRlc3RBbGxUeXBlcyAqbWVzc2FnZSBpbiBtZXNzYWdlcykgewotICAgIFhDVEFzc2VydEVxdWFsKFttZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheSBjb3VudF0sIChOU1VJbnRlZ2VyKTApOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVhZFJlcGVhdGVkU3RyaW5nOihOU0FycmF5ICopbWVzc2FnZXMgewotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBmb3IgKFRlc3RBbGxUeXBlcyAqbWVzc2FnZSBpbiBtZXNzYWdlcykgewotICAgICAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheSBjb3VudF0sIChOU1VJbnRlZ2VyKTApOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXRlc3RDb25jdXJyZW50UmVhZE9mVW5zZXRSZXBlYXRlZFN0cmluZ0ZpZWxkIHsKLSAgTlNBcnJheSAqbWVzc2FnZXMgPSBbc2VsZiBjcmVhdGVNZXNzYWdlc1dpdGhUeXBlOltUZXN0QWxsVHlwZXMgY2xhc3NdXTsKLSAgTlNBcnJheSAqdGhyZWFkcyA9Ci0gICAgICBbc2VsZiBjcmVhdGVUaHJlYWRzV2l0aFNlbGVjdG9yOkBzZWxlY3RvcihyZWFkUmVwZWF0ZWRTdHJpbmc6KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDptZXNzYWdlc107Ci0gIFtzZWxmIHN0YXJ0VGhyZWFkczp0aHJlYWRzXTsKLSAgW3NlbGYgam9pblRocmVhZHM6dGhyZWFkc107Ci0gIGZvciAoVGVzdEFsbFR5cGVzICptZXNzYWdlIGluIG1lc3NhZ2VzKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheSBjb3VudF0sIChOU1VJbnRlZ2VyKTApOwotICB9Ci19Ci0KLS0gKHZvaWQpcmVhZEludDMySW50MzJNYXA6KE5TQXJyYXkgKiltZXNzYWdlcyB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgIGZvciAoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSBpbiBtZXNzYWdlcykgewotICAgICAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2UuaVRvSSBjb3VudF0sIChOU1VJbnRlZ2VyKTApOwotICAgIH0KLSAgfQotfQotCi0tICh2b2lkKXRlc3RDb25jdXJyZW50UmVhZE9mVW5zZXRJbnQzMkludDMyTWFwRmllbGQgewotICBOU0FycmF5ICptZXNzYWdlcyA9Ci0gICAgICBbc2VsZiBjcmVhdGVNZXNzYWdlc1dpdGhUeXBlOltUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIGNsYXNzXV07Ci0gIE5TQXJyYXkgKnRocmVhZHMgPQotICAgICAgW3NlbGYgY3JlYXRlVGhyZWFkc1dpdGhTZWxlY3RvcjpAc2VsZWN0b3IocmVhZEludDMySW50MzJNYXA6KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdDptZXNzYWdlc107Ci0gIFtzZWxmIHN0YXJ0VGhyZWFkczp0aHJlYWRzXTsKLSAgW3NlbGYgam9pblRocmVhZHM6dGhyZWFkc107Ci0gIGZvciAoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSBpbiBtZXNzYWdlcykgewotICAgIFhDVEFzc2VydEVxdWFsKFttZXNzYWdlLmlUb0kgY291bnRdLCAoTlNVSW50ZWdlcikwKTsKLSAgfQotfQotCi0tICh2b2lkKXJlYWRTdHJpbmdTdHJpbmdNYXA6KE5TQXJyYXkgKiltZXNzYWdlcyB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7IGkrKykgewotICAgIGZvciAoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSBpbiBtZXNzYWdlcykgewotICAgICAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2Uuc3RyVG9TdHIgY291bnRdLCAoTlNVSW50ZWdlcikwKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZCl0ZXN0Q29uY3VycmVudFJlYWRPZlVuc2V0U3RyaW5nU3RyaW5nTWFwRmllbGQgewotICBOU0FycmF5ICptZXNzYWdlcyA9Ci0gICAgICBbc2VsZiBjcmVhdGVNZXNzYWdlc1dpdGhUeXBlOltUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIGNsYXNzXV07Ci0gIE5TQXJyYXkgKnRocmVhZHMgPQotICAgICAgW3NlbGYgY3JlYXRlVGhyZWFkc1dpdGhTZWxlY3RvcjpAc2VsZWN0b3IocmVhZFN0cmluZ1N0cmluZ01hcDopCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0Om1lc3NhZ2VzXTsKLSAgW3NlbGYgc3RhcnRUaHJlYWRzOnRocmVhZHNdOwotICBbc2VsZiBqb2luVGhyZWFkczp0aHJlYWRzXTsKLSAgZm9yIChUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkICptZXNzYWdlIGluIG1lc3NhZ2VzKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2Uuc3RyVG9TdHIgY291bnRdLCAoTlNVSW50ZWdlcikwKTsKLSAgfQotfQotCi0tICh2b2lkKXJlYWRPcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uOihOU0FycmF5ICopbWVzc2FnZXMgewotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyBpKyspIHsKLSAgICBmb3IgKFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlIGluIG1lc3NhZ2VzKSB7Ci0gICAgICBGb3JlaWduTWVzc2FnZSAqZm9yZWlnbiA9Ci0gICAgICAgICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbl1dOwotICAgICAgWENUQXNzZXJ0RXF1YWwoZm9yZWlnbi5jLCAwKTsKLSAgICB9Ci0gIH0KLX0KLQotLSAodm9pZCl0ZXN0Q29uY3VycmVudFJlYWRPZlVuc2V0RXh0ZW5zaW9uRmllbGQgewotICBOU0FycmF5ICptZXNzYWdlcyA9IFtzZWxmIGNyZWF0ZU1lc3NhZ2VzV2l0aFR5cGU6W1Rlc3RBbGxFeHRlbnNpb25zIGNsYXNzXV07Ci0gIFNFTCBzZWwgPSBAc2VsZWN0b3IocmVhZE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb246KTsKLSAgTlNBcnJheSAqdGhyZWFkcyA9IFtzZWxmIGNyZWF0ZVRocmVhZHNXaXRoU2VsZWN0b3I6c2VsIG9iamVjdDptZXNzYWdlc107Ci0gIFtzZWxmIHN0YXJ0VGhyZWFkczp0aHJlYWRzXTsKLSAgW3NlbGYgam9pblRocmVhZHM6dGhyZWFkc107Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dGVuc2lvbiA9Ci0gICAgICBbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dOwotICBmb3IgKFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlIGluIG1lc3NhZ2VzKSB7Ci0gICAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOmV4dGVuc2lvbl0pOwotICB9Ci19Ci0KLUBlbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGVzY3JpcHRvclRlc3RzLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkRlc2NyaXB0b3JUZXN0cy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTkyM2M5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGVzY3JpcHRvclRlc3RzLm0KKysrIC9kZXYvbnVsbApAQCAtMSwyMTkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQlRlc3RVdGlsaXRpZXMuaCIKLQotI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+Ci0KLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3IuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMuaCIKLQotQGludGVyZmFjZSBEZXNjcmlwdG9yVGVzdHMgOiBHUEJUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gRGVzY3JpcHRvclRlc3RzCi0KLS0gKHZvaWQpdGVzdEZpZWxkRGVzY3JpcHRvciB7Ci0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbVGVzdEFsbFR5cGVzIGRlc2NyaXB0b3JdOwotCi0gIC8vIE5lc3RlZCBFbnVtCi0gIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGREZXNjcmlwdG9yV2l0aE5hbWUgPQotICAgICAgW2Rlc2NyaXB0b3IgZmllbGRXaXRoTmFtZTpAIm9wdGlvbmFsTmVzdGVkRW51bSJdOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGREZXNjcmlwdG9yV2l0aE5hbWUpOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIgPQotICAgICAgW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOjIxXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIpOwotICBYQ1RBc3NlcnRFcXVhbChmaWVsZERlc2NyaXB0b3JXaXRoTmFtZSwgZmllbGREZXNjcmlwdG9yV2l0aE51bWJlcik7Ci0gIFhDVEFzc2VydE5vdE5pbChmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyLmVudW1EZXNjcmlwdG9yKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIuZW51bURlc2NyaXB0b3IubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAiVGVzdEFsbFR5cGVzX05lc3RlZEVudW0iKTsKLQotICAvLyBGb3JlaWduIEVudW0KLSAgZmllbGREZXNjcmlwdG9yV2l0aE5hbWUgPSBbZGVzY3JpcHRvciBmaWVsZFdpdGhOYW1lOkAib3B0aW9uYWxGb3JlaWduRW51bSJdOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGREZXNjcmlwdG9yV2l0aE5hbWUpOwotICBmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOjIyXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIpOwotICBYQ1RBc3NlcnRFcXVhbChmaWVsZERlc2NyaXB0b3JXaXRoTmFtZSwgZmllbGREZXNjcmlwdG9yV2l0aE51bWJlcik7Ci0gIFhDVEFzc2VydE5vdE5pbChmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyLmVudW1EZXNjcmlwdG9yKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIuZW51bURlc2NyaXB0b3IubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAiRm9yZWlnbkVudW0iKTsKLQotICAvLyBJbXBvcnQgRW51bQotICBmaWVsZERlc2NyaXB0b3JXaXRoTmFtZSA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE5hbWU6QCJvcHRpb25hbEltcG9ydEVudW0iXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzY3JpcHRvcldpdGhOYW1lKTsKLSAgZmllbGREZXNjcmlwdG9yV2l0aE51bWJlciA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjoyM107Ci0gIFhDVEFzc2VydE5vdE5pbChmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZmllbGREZXNjcmlwdG9yV2l0aE5hbWUsIGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIpOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGREZXNjcmlwdG9yV2l0aE51bWJlci5lbnVtRGVzY3JpcHRvcik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyLmVudW1EZXNjcmlwdG9yLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBAIkltcG9ydEVudW0iKTsKLQotICAvLyBOZXN0ZWQgTWVzc2FnZQotICBmaWVsZERlc2NyaXB0b3JXaXRoTmFtZSA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE5hbWU6QCJvcHRpb25hbE5lc3RlZE1lc3NhZ2UiXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzY3JpcHRvcldpdGhOYW1lKTsKLSAgZmllbGREZXNjcmlwdG9yV2l0aE51bWJlciA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjoxOF07Ci0gIFhDVEFzc2VydE5vdE5pbChmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZmllbGREZXNjcmlwdG9yV2l0aE5hbWUsIGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIpOwotICBYQ1RBc3NlcnROaWwoZmllbGREZXNjcmlwdG9yV2l0aE51bWJlci5lbnVtRGVzY3JpcHRvcik7Ci0KLSAgLy8gRm9yZWlnbiBNZXNzYWdlCi0gIGZpZWxkRGVzY3JpcHRvcldpdGhOYW1lID0KLSAgICAgIFtkZXNjcmlwdG9yIGZpZWxkV2l0aE5hbWU6QCJvcHRpb25hbEZvcmVpZ25NZXNzYWdlIl07Ci0gIFhDVEFzc2VydE5vdE5pbChmaWVsZERlc2NyaXB0b3JXaXRoTmFtZSk7Ci0gIGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIgPSBbZGVzY3JpcHRvciBmaWVsZFdpdGhOdW1iZXI6MTldOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGREZXNjcmlwdG9yV2l0aE51bWJlcik7Ci0gIFhDVEFzc2VydEVxdWFsKGZpZWxkRGVzY3JpcHRvcldpdGhOYW1lLCBmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyKTsKLSAgWENUQXNzZXJ0TmlsKGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIuZW51bURlc2NyaXB0b3IpOwotCi0gIC8vIEltcG9ydCBNZXNzYWdlCi0gIGZpZWxkRGVzY3JpcHRvcldpdGhOYW1lID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTmFtZTpAIm9wdGlvbmFsSW1wb3J0TWVzc2FnZSJdOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGREZXNjcmlwdG9yV2l0aE5hbWUpOwotICBmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOjIwXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzY3JpcHRvcldpdGhOdW1iZXIpOwotICBYQ1RBc3NlcnRFcXVhbChmaWVsZERlc2NyaXB0b3JXaXRoTmFtZSwgZmllbGREZXNjcmlwdG9yV2l0aE51bWJlcik7Ci0gIFhDVEFzc2VydE5pbChmaWVsZERlc2NyaXB0b3JXaXRoTnVtYmVyLmVudW1EZXNjcmlwdG9yKTsKLX0KLQotLSAodm9pZCl0ZXN0RW51bURlc2NyaXB0b3IgewotICBHUEJFbnVtRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0VudW1EZXNjcmlwdG9yKCk7Ci0KLSAgTlNTdHJpbmcgKmVudW1OYW1lID0gW2Rlc2NyaXB0b3IgZW51bU5hbWVGb3JWYWx1ZToxXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGVudW1OYW1lKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZSgKLSAgICAgIFtkZXNjcmlwdG9yIGdldFZhbHVlOiZ2YWx1ZSBmb3JFbnVtTmFtZTpAIlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZvbyJdKTsKLSAgWENUQXNzZXJ0VHJ1ZSgKLSAgICAgIFtkZXNjcmlwdG9yIGdldFZhbHVlOk5VTEwgZm9yRW51bU5hbWU6QCJUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9Gb28iXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9Gb28pOwotCi0gIGVudW1OYW1lID0gW2Rlc2NyaXB0b3IgZW51bU5hbWVGb3JWYWx1ZToyXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGVudW1OYW1lKTsKLSAgWENUQXNzZXJ0VHJ1ZSgKLSAgICAgIFtkZXNjcmlwdG9yIGdldFZhbHVlOiZ2YWx1ZSBmb3JFbnVtTmFtZTpAIlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0JhciJdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0Jhcik7Ci0KLSAgZW51bU5hbWUgPSBbZGVzY3JpcHRvciBlbnVtTmFtZUZvclZhbHVlOjNdOwotICBYQ1RBc3NlcnROb3ROaWwoZW51bU5hbWUpOwotICBYQ1RBc3NlcnRUcnVlKAotICAgICAgW2Rlc2NyaXB0b3IgZ2V0VmFsdWU6JnZhbHVlIGZvckVudW1OYW1lOkAiVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fQmF6Il0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fQmF6KTsKLQotICAvLyBCYWQgdmFsdWVzCi0gIGVudW1OYW1lID0gW2Rlc2NyaXB0b3IgZW51bU5hbWVGb3JWYWx1ZTowXTsKLSAgWENUQXNzZXJ0TmlsKGVudW1OYW1lKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2Rlc2NyaXB0b3IgZ2V0VmFsdWU6JnZhbHVlIGZvckVudW1OYW1lOkAiVW5rbm93biJdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2Rlc2NyaXB0b3IgZ2V0VmFsdWU6TlVMTCBmb3JFbnVtTmFtZTpAIlVua25vd24iXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkZXNjcmlwdG9yIGdldFZhbHVlOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JFbnVtTmFtZTpAIlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX1Vua25vd24iXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkZXNjcmlwdG9yIGdldFZhbHVlOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yRW51bU5hbWU6QCJUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9Vbmtub3duIl0pOwotfQotCi0tICh2b2lkKXRlc3RFbnVtVmFsdWVWYWxpZGF0b3IgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW1Rlc3RBbGxUeXBlcyBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZERlc2NyaXB0b3IgPQotICAgICAgW2Rlc2NyaXB0b3IgZmllbGRXaXRoTmFtZTpAIm9wdGlvbmFsTmVzdGVkRW51bSJdOwotCi0gIC8vIFZhbGlkIHZhbHVlcwotICBYQ1RBc3NlcnRUcnVlKFtmaWVsZERlc2NyaXB0b3IgaXNWYWxpZEVudW1WYWx1ZToxXSk7Ci0gIFhDVEFzc2VydFRydWUoW2ZpZWxkRGVzY3JpcHRvciBpc1ZhbGlkRW51bVZhbHVlOjJdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZmllbGREZXNjcmlwdG9yIGlzVmFsaWRFbnVtVmFsdWU6M10pOwotICBYQ1RBc3NlcnRUcnVlKFtmaWVsZERlc2NyaXB0b3IgaXNWYWxpZEVudW1WYWx1ZTotMV0pOwotCi0gIC8vIEludmFsaWQgdmFsdWVzCi0gIFhDVEFzc2VydEZhbHNlKFtmaWVsZERlc2NyaXB0b3IgaXNWYWxpZEVudW1WYWx1ZTo0XSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtmaWVsZERlc2NyaXB0b3IgaXNWYWxpZEVudW1WYWx1ZTowXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtmaWVsZERlc2NyaXB0b3IgaXNWYWxpZEVudW1WYWx1ZTotMl0pOwotfQotCi0tICh2b2lkKXRlc3RPbmVvZkRlc2NyaXB0b3IgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW1Rlc3RPbmVvZjIgZGVzY3JpcHRvcl07Ci0KLSAgLy8gQWxsIGZpZWxkcyBzaG91bGQgYmUgbGlzdGVkLgotICBYQ1RBc3NlcnRFcXVhbChkZXNjcmlwdG9yLmZpZWxkcy5jb3VudCwgMTdVKTsKLQotICAvLyBUaGVyZSBhcmUgdHdvIG9uZW9mcyBpbiB0aGVyZS4KLSAgWENUQXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5vbmVvZnMuY291bnQsIDJVKTsKLQotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZvb1N0cmluZ0ZpZWxkID0KLSAgICAgIFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpUZXN0T25lb2YyX0ZpZWxkTnVtYmVyX0Zvb1N0cmluZ107Ci0gIFhDVEFzc2VydE5vdE5pbChmb29TdHJpbmdGaWVsZCk7Ci0gIEdQQkZpZWxkRGVzY3JpcHRvciAqYmFyU3RyaW5nRmllbGQgPQotICAgICAgW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOlRlc3RPbmVvZjJfRmllbGROdW1iZXJfQmFyU3RyaW5nXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGJhclN0cmluZ0ZpZWxkKTsKLQotICAvLyBDaGVjayB0aGUgb25lb2ZzIHRvIGhhdmUgd2hhdCBpcyBleHBlY3RlZC4KLQotICBHUEJPbmVvZkRlc2NyaXB0b3IgKm9uZW9mRm9vID0gW2Rlc2NyaXB0b3Igb25lb2ZXaXRoTmFtZTpAImZvbyJdOwotICBYQ1RBc3NlcnROb3ROaWwob25lb2ZGb28pOwotICBYQ1RBc3NlcnRFcXVhbChvbmVvZkZvby5maWVsZHMuY291bnQsIDlVKTsKLQotICAvLyBQb2ludGVyIGNvbXBhcmlzb25zLgotICBYQ1RBc3NlcnRFcXVhbChbb25lb2ZGb28gZmllbGRXaXRoTnVtYmVyOlRlc3RPbmVvZjJfRmllbGROdW1iZXJfRm9vU3RyaW5nXSwKLSAgICAgICAgICAgICAgICAgZm9vU3RyaW5nRmllbGQpOwotICBYQ1RBc3NlcnRFcXVhbChbb25lb2ZGb28gZmllbGRXaXRoTmFtZTpAImZvb1N0cmluZyJdLCBmb29TdHJpbmdGaWVsZCk7Ci0KLSAgR1BCT25lb2ZEZXNjcmlwdG9yICpvbmVvZkJhciA9IFtkZXNjcmlwdG9yIG9uZW9mV2l0aE5hbWU6QCJiYXIiXTsKLSAgWENUQXNzZXJ0Tm90TmlsKG9uZW9mQmFyKTsKLSAgWENUQXNzZXJ0RXF1YWwob25lb2ZCYXIuZmllbGRzLmNvdW50LCA2VSk7Ci0KLSAgLy8gUG9pbnRlciBjb21wYXJpc29ucy4KLSAgWENUQXNzZXJ0RXF1YWwoW29uZW9mQmFyIGZpZWxkV2l0aE51bWJlcjpUZXN0T25lb2YyX0ZpZWxkTnVtYmVyX0JhclN0cmluZ10sCi0gICAgICAgICAgICAgICAgIGJhclN0cmluZ0ZpZWxkKTsKLSAgWENUQXNzZXJ0RXF1YWwoW29uZW9mQmFyIGZpZWxkV2l0aE5hbWU6QCJiYXJTdHJpbmciXSwgYmFyU3RyaW5nRmllbGQpOwotCi0gIC8vIFVua25vd24gb25lb2Ygbm90IGZvdW5kLgotCi0gIFhDVEFzc2VydE5pbChbZGVzY3JpcHRvciBvbmVvZldpdGhOYW1lOkAibXVtYmxlIl0pOwotICBYQ1RBc3NlcnROaWwoW2Rlc2NyaXB0b3Igb25lb2ZXaXRoTmFtZTpAIkZvbyJdKTsKLQotICAvLyBVbmtub3duIG9uZW9mIGl0ZW0uCi0KLSAgWENUQXNzZXJ0TmlsKFtvbmVvZkZvbyBmaWVsZFdpdGhOYW1lOkAibXVtYmxlIl0pOwotICBYQ1RBc3NlcnROaWwoW29uZW9mRm9vIGZpZWxkV2l0aE51bWJlcjo2NjZdKTsKLQotICAvLyBGaWVsZCBleGlzdHMsIGJ1dCBub3QgaW4gdGhpcyBvbmVvZi4KLQotICBYQ1RBc3NlcnROaWwoW29uZW9mRm9vIGZpZWxkV2l0aE5hbWU6QCJiYXJTdHJpbmciXSk7Ci0gIFhDVEFzc2VydE5pbChbb25lb2ZGb28gZmllbGRXaXRoTnVtYmVyOlRlc3RPbmVvZjJfRmllbGROdW1iZXJfQmFyU3RyaW5nXSk7Ci0gIFhDVEFzc2VydE5pbChbb25lb2ZCYXIgZmllbGRXaXRoTmFtZTpAImZvb1N0cmluZyJdKTsKLSAgWENUQXNzZXJ0TmlsKFtvbmVvZkJhciBmaWVsZFdpdGhOdW1iZXI6VGVzdE9uZW9mMl9GaWVsZE51bWJlcl9Gb29TdHJpbmddKTsKLQotICAvLyBDaGVjayBwb2ludGVycyBiYWNrIHRvIHRoZSBlbmNsb3Npbmcgb25lb2ZzLgotICAvLyAocG9pbnRlciBjb21wYXJpc2lvbnMpCi0gIFhDVEFzc2VydEVxdWFsKGZvb1N0cmluZ0ZpZWxkLmNvbnRhaW5pbmdPbmVvZiwgb25lb2ZGb28pOwotICBYQ1RBc3NlcnRFcXVhbChiYXJTdHJpbmdGaWVsZC5jb250YWluaW5nT25lb2YsIG9uZW9mQmFyKTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpiYXpTdHJpbmcgPQotICAgICAgW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOlRlc3RPbmVvZjJfRmllbGROdW1iZXJfQmF6U3RyaW5nXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGJhelN0cmluZyk7Ci0gIFhDVEFzc2VydE5pbChiYXpTdHJpbmcuY29udGFpbmluZ09uZW9mKTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJEaWN0aW9uYXJ5VGVzdHMrQm9vbC5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJEaWN0aW9uYXJ5VGVzdHMrQm9vbC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZmEzZDExLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK0Jvb2wubQorKysgL2Rldi9udWxsCkBAIC0xLDI0MTggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgPEZvdW5kYXRpb24vRm91bmRhdGlvbi5oPgotI2ltcG9ydCA8WENUZXN0L1hDVGVzdC5oPgotCi0jaW1wb3J0ICJHUEJEaWN0aW9uYXJ5LmgiCi0KLSNpbXBvcnQgIkdQQlRlc3RVdGlsaXRpZXMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdFJ1bnRpbWVQcm90bzIucGJvYmpjLmgiCi0KLS8vIFB1bGwgaW4gdGhlIG1hY3JvcyAodXNpbmcgYW4gZXh0ZXJuYWwgZmlsZSBiZWNhdXNlIGV4cGFuZGluZyBhbGwgdGVzdHMKLS8vIGluIGEgc2luZ2xlIGZpbGUgbWFrZXMgYSBmaWxlIHRoYXQgaXMgZmFpbGluZyB0byB3b3JrIHdpdGggd2l0aGluIFhjb2RlLgotLy8lUERETS1JTVBPUlQtREVGSU5FUyBHUEJEaWN0aW9uYXJ5VGVzdHMucGRkbQotCi0vLyVQRERNLUVYUEFORCBCT09MX1RFU1RTX0ZPUl9QT0RfVkFMVUUoVUludDMyLCB1aW50MzJfdCwgMTAwVSwgMTAxVSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0jcHJhZ21hIG1hcmsgLSBCb29sIC0+IFVJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sVUludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJCb29sVUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJCb29sVUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjEwMFUgZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCBZRVMpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgMTAwVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVIH07Ci0gIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgQk9PTCAqc2VlbktleXMgPSBtYWxsb2MoMiAqIHNpemVvZihCT09MKSk7Ci0gIHVpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDIgKiBzaXplb2YodWludDMyX3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIHVpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgMlUpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDIpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAwKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IEJPT0wga0tleXMxW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgQk9PTCBrS2V5czJbXSA9IHsgTk8sIFlFUyB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMVtdID0geyAxMDBVLCAxMDFVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDEwMVUsIDEwMFUgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczNbXSA9IHsgMTAxVSB9OwotICBHUEJCb29sVUludDMyRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJCb29sVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJCb29sVUludDMyRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJCb29sVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBGZXdlciBwYWlyczsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVIH07Ci0gIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUgfTsKLSAgR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sVUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCQm9vbFVJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjEwMFUgZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IE5PIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAxVSB9OwotICBHUEJCb29sVUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJCb29sVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLQotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOT307Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAwVSwgMTAxVSB9OwotICBHUEJCb29sVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6Tk9dOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAwVSwgMTAxVSB9OwotICBHUEJCb29sVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotCi0gIFtkaWN0IHNldFZhbHVlOjEwMVUgZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotCi0gIFtkaWN0IHNldFZhbHVlOjEwMFUgZm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0KLSAgY29uc3QgQk9PTCBrS2V5czJbXSA9IHsgTk8sIFlFUyB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDFVLCAxMDBVIH07Ci0gIEdQQkJvb2xVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkJvb2xVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBCT09MX1RFU1RTX0ZPUl9QT0RfVkFMVUUoSW50MzIsIGludDMyX3QsIDIwMCwgMjAxKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gSW50MzIKLQotQGludGVyZmFjZSBHUEJCb29sSW50MzJEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sSW50MzJEaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJCb29sSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkJvb2xJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCQm9vbEludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjIwMCBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIFlFUyk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAyMDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSB9OwotICBHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgQk9PTCAqc2VlbktleXMgPSBtYWxsb2MoMiAqIHNpemVvZihCT09MKSk7Ci0gIGludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMiAqIHNpemVvZihpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgMlUpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDIpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDApICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgQk9PTCBrS2V5czFbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtLZXlzMltdID0geyBOTywgWUVTIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgMjAwLCAyMDEgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyAyMDEsIDIwMCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMzW10gPSB7IDIwMSB9OwotICBHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkJvb2xJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCQm9vbEludDMyRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkJvb2xJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkJvb2xJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCQm9vbEludDMyRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJCb29sSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkJvb2xJbnQzMkRpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCQm9vbEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgRmV3ZXIgcGFpcnM7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSB9OwotICBHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCQm9vbEludDMyRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbEludDMyRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxIH07Ci0gIEdQQkJvb2xJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCQm9vbEludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkJvb2xJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCQm9vbEludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6MjAwIGZvcktleTpZRVNdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBOTyB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAxIH07Ci0gIEdQQkJvb2xJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk99OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEgfTsKLSAgR1BCQm9vbEludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSB9OwotICBHUEJCb29sSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MjAxIGZvcktleTpZRVNdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MjAwIGZvcktleTpOT107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLQotICBjb25zdCBCT09MIGtLZXlzMltdID0geyBOTywgWUVTIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgMjAxLCAyMDAgfTsKLSAgR1BCQm9vbEludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJCb29sSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIEJPT0xfVEVTVFNfRk9SX1BPRF9WQUxVRShVSW50NjQsIHVpbnQ2NF90LCAzMDBVLCAzMDFVKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gVUludDY0Ci0KLUBpbnRlcmZhY2UgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJCb29sVUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIHVpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkJvb2xVSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6MzAwVSBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIHVpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIFlFUyk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAzMDBVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUgfTsKLSAgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMVUpOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBCT09MICpzZWVuS2V5cyA9IG1hbGxvYygyICogc2l6ZW9mKEJPT0wpKTsKLSAgdWludDY0X3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMiAqIHNpemVvZih1aW50NjRfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAyVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMikgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIHVpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDApICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgQk9PTCBrS2V5czFbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtLZXlzMltdID0geyBOTywgWUVTIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMxW10gPSB7IDMwMFUsIDMwMVUgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczJbXSA9IHsgMzAxVSwgMzAwVSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzM1tdID0geyAzMDFVIH07Ci0gIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkJvb2xVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJCb29sVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJCb29sVUludDY0RGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJCb29sVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQkJvb2xVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IEZld2VyIHBhaXJzOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUgfTsKLSAgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sVUludDY0RGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAwVSwgMzAxVSB9OwotICBHUEJCb29sVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJCb29sVUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJCb29sVUludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6MzAwVSBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgTk8gfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDFVIH07Ci0gIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkJvb2xVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotCi0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVIH07Ci0gIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6Tk9dOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpOT107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVIH07Ci0gIEdQQkJvb2xVSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MzAxVSBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MzAwVSBmb3JLZXk6Tk9dOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLQotICBjb25zdCBCT09MIGtLZXlzMltdID0geyBOTywgWUVTIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDMwMVUsIDMwMFUgfTsKLSAgR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5EIEJPT0xfVEVTVFNfRk9SX1BPRF9WQUxVRShJbnQ2NCwgaW50NjRfdCwgNDAwLCA0MDEpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQkJvb2xJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCQm9vbEludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJCb29sSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6NDAwIGZvcktleTpZRVNdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgWUVTKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDQwMCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxIH07Ci0gIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBCT09MICpzZWVuS2V5cyA9IG1hbGxvYygyICogc2l6ZW9mKEJPT0wpKTsKLSAgaW50NjRfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygyICogc2l6ZW9mKGludDY0X3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAyVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMikgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMCkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBCT09MIGtLZXlzMVtdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IEJPT0wga0tleXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzMVtdID0geyA0MDAsIDQwMSB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDQwMSwgNDAwIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczNbXSA9IHsgNDAxIH07Ci0gIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCQm9vbEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJCb29sSW50NjREaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCQm9vbEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJCb29sSW50NjREaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkJvb2xJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCQm9vbEludDY0RGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJCb29sSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBGZXdlciBwYWlyczsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxIH07Ci0gIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJCb29sSW50NjREaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEgfTsKLSAgR1BCQm9vbEludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJCb29sSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCQm9vbEludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJCb29sSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo0MDAgZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IE5PIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDEgfTsKLSAgR1BCQm9vbEludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJCb29sSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLQotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOT307Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSB9OwotICBHUEJCb29sSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6Tk9dOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6Tk9dOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxIH07Ci0gIEdQQkJvb2xJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBbZGljdCBzZXRWYWx1ZTo0MDEgZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBbZGljdCBzZXRWYWx1ZTo0MDAgZm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotCi0gIGNvbnN0IEJPT0wga0tleXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzMltdID0geyA0MDEsIDQwMCB9OwotICBHUEJCb29sSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkJvb2xJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQk9PTF9URVNUU19GT1JfUE9EX1ZBTFVFKEJvb2wsIEJPT0wsIE5PLCBZRVMpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBCb29sCi0KLUBpbnRlcmZhY2UgR1BCQm9vbEJvb2xEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sQm9vbERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdCA9IFtHUEJCb29sQm9vbERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTpOTyBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIEJPT0wgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihCT09MIGFLZXksIEJPT0wgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgWUVTKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIE5PKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgTk8sIFlFUyB9OwotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIEJPT0wgKnNlZW5LZXlzID0gbWFsbG9jKDIgKiBzaXplb2YoQk9PTCkpOwotICBCT09MICpzZWVuVmFsdWVzID0gbWFsbG9jKDIgKiBzaXplb2YoQk9PTCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDJVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAyKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAwKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IEJPT0wga0tleXMxW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgQk9PTCBrS2V5czJbXSA9IHsgTk8sIFlFUyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMxW10gPSB7IE5PLCBZRVMgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzMltdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczNbXSA9IHsgWUVTIH07Ci0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJCb29sQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkJvb2xCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgRmV3ZXIgcGFpcnM7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBOTywgWUVTIH07Ci0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgTk8sIFlFUyB9OwotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJCb29sQm9vbERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTpOTyBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgTk8gfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUyB9OwotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0KLSAgQk9PTCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOT307Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBOTywgWUVTIH07Ci0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6Tk9dOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgTk8sIFlFUyB9OwotICBHUEJCb29sQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgQk9PTCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotCi0gIFtkaWN0IHNldFZhbHVlOllFUyBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotCi0gIFtkaWN0IHNldFZhbHVlOk5PIGZvcktleTpOT107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIGNvbnN0IEJPT0wga0tleXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzMltdID0geyBZRVMsIE5PIH07Ci0gIEdQQkJvb2xCb29sRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJCb29sQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgQk9PTF9URVNUU19GT1JfUE9EX1ZBTFVFKEZsb2F0LCBmbG9hdCwgNTAwLmYsIDUwMS5mKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSNwcmFnbWEgbWFyayAtIEJvb2wgLT4gRmxvYXQKLQotQGludGVyZmFjZSBHUEJCb29sRmxvYXREaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCb29sRmxvYXREaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBmbG9hdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo1MDAuZiBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIGZsb2F0IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBmbG9hdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCBZRVMpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNTAwLmYpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mIH07Ci0gIEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIEJPT0wgKnNlZW5LZXlzID0gbWFsbG9jKDIgKiBzaXplb2YoQk9PTCkpOwotICBmbG9hdCAqc2VlblZhbHVlcyA9IG1hbGxvYygyICogc2l6ZW9mKGZsb2F0KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBmbG9hdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDJVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDI7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAyKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMCkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBCT09MIGtLZXlzMVtdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IEJPT0wga0tleXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlczFbXSA9IHsgNTAwLmYsIDUwMS5mIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMyW10gPSB7IDUwMS5mLCA1MDAuZiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzM1tdID0geyA1MDEuZiB9OwotICBHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCQm9vbEZsb2F0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCQm9vbEZsb2F0RGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCQm9vbEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgRmV3ZXIgcGFpcnM7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mIH07Ci0gIEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiB9OwotICBHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCQm9vbEZsb2F0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJCb29sRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkJvb2xGbG9hdERpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjUwMC5mIGZvcktleTpZRVNdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBOTyB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMS5mIH07Ci0gIEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0KLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOT307Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mIH07Ci0gIEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpOT107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpOT107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mIH07Ci0gIEdQQkJvb2xGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotCi0gIFtkaWN0IHNldFZhbHVlOjUwMS5mIGZvcktleTpZRVNdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotCi0gIFtkaWN0IHNldFZhbHVlOjUwMC5mIGZvcktleTpOT107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0KLSAgY29uc3QgQk9PTCBrS2V5czJbXSA9IHsgTk8sIFlFUyB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMltdID0geyA1MDEuZiwgNTAwLmYgfTsKLSAgR1BCQm9vbEZsb2F0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJCb29sRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORCBCT09MX1RFU1RTX0ZPUl9QT0RfVkFMVUUoRG91YmxlLCBkb3VibGUsIDYwMC4sIDYwMS4pCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBEb3VibGUKLQotQGludGVyZmFjZSBHUEJCb29sRG91YmxlRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCQm9vbERvdWJsZURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJCb29sRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgZG91YmxlIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkJvb2xEb3VibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6NjAwLiBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgWUVTKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDYwMC4pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4gfTsKLSAgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDEuKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgQk9PTCAqc2VlbktleXMgPSBtYWxsb2MoMiAqIHNpemVvZihCT09MKSk7Ci0gIGRvdWJsZSAqc2VlblZhbHVlcyA9IG1hbGxvYygyICogc2l6ZW9mKGRvdWJsZSkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgZG91YmxlIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgMlUpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDIpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMCkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBCT09MIGtLZXlzMVtdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IEJPT0wga0tleXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMxW10gPSB7IDYwMC4sIDYwMS4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMyW10gPSB7IDYwMS4sIDYwMC4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMzW10gPSB7IDYwMS4gfTsKLSAgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkJvb2xEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJCb29sRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkJvb2xEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgRmV3ZXIgcGFpcnM7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4gfTsKLSAgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4gfTsKLSAgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJCb29sRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkJvb2xEb3VibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjYwMC4gZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IE5PIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMS4gfTsKLSAgR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0KLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAwLiwgNjAxLiB9OwotICBHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuIH07Ci0gIEdQQkJvb2xEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotCi0gIFtkaWN0IHNldFZhbHVlOjYwMS4gZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotCi0gIFtkaWN0IHNldFZhbHVlOjYwMC4gZm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6WUVTIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6Tk8gdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0KLSAgY29uc3QgQk9PTCBrS2V5czJbXSA9IHsgTk8sIFlFUyB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlczJbXSA9IHsgNjAxLiwgNjAwLiB9OwotICBHUEJCb29sRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJCb29sRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpZRVMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OllFUyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5Ok5PIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpOTyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQgVEVTVFNfRk9SX0JPT0xfS0VZX09CSkVDVF9WQUxVRShPYmplY3QsIE5TU3RyaW5nKiwgQCJhYmMiLCBAImRlZiIpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotI3ByYWdtYSBtYXJrIC0gQm9vbCAtPiBPYmplY3QKLQotQGludGVyZmFjZSBHUEJCb29sT2JqZWN0RGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCQm9vbE9iamVjdERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPSBbW0dQQkJvb2xPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6WUVTXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhT2JqZWN0LCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCQm9vbE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDpAImFiYyIgZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OllFU10sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6Tk9dKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oQk9PTCBhS2V5LCBOU1N0cmluZyogYU9iamVjdCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIFlFUyk7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFPYmplY3QsIEAiYWJjIik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiIH07Ci0gIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPQotICAgICAgW1tHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6WUVTXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTpOT10sIEAiZGVmIik7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIEJPT0wgKnNlZW5LZXlzID0gbWFsbG9jKDIgKiBzaXplb2YoQk9PTCkpOwotICBOU1N0cmluZyogKnNlZW5PYmplY3RzID0gbWFsbG9jKDIgKiBzaXplb2YoTlNTdHJpbmcqKSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKEJPT0wgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDJVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuT2JqZWN0c1tpZHhdID0gYU9iamVjdDsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDIpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhrT2JqZWN0c1tpXSwgc2Vlbk9iamVjdHNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuT2JqZWN0cyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihCT09MIGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYU9iamVjdCkKLSAgICBpZiAoaWR4ID09IDApICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgQk9PTCBrS2V5czFbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtLZXlzMltdID0geyBOTywgWUVTIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0czFbXSA9IHsgQCJhYmMiLCBAImRlZiIgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzMltdID0geyBAImRlZiIsIEAiYWJjIiB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHMzW10gPSB7IEAiZGVmIiB9OwotICBHUEJCb29sT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MSA9Ci0gICAgICBbW0dQQkJvb2xPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJCb29sT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCQm9vbE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCQm9vbE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCQm9vbE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDMgPQotICAgICAgW1tHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCQm9vbE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDQgPQotICAgICAgW1tHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IG9iamVjdHM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSBvYmplY3RzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgRmV3ZXIgcGFpcnM7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImFiYyIsIEAiZGVmIiB9OwotICBHUEJCb29sT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0ID0KLSAgICAgIFtbR1BCQm9vbE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJCb29sT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IFlFUywgTk8gfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiIH07Ci0gIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPQotICAgICAgW1tHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QyID0KLSAgICAgIFtHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPSBbR1BCQm9vbE9iamVjdERpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldE9iamVjdDpAImFiYyIgZm9yS2V5OllFU107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBCT09MIGtLZXlzW10gPSB7IE5PIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImRlZiIgfTsKLSAgR1BCQm9vbE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6WUVTXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTpOT10sIEAiZGVmIik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgQk9PTCBrS2V5c1tdID0geyBZRVMsIE5PfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiIH07Ci0gIEdQQkJvb2xPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPQotICAgICAgW1tHUEJCb29sT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotCi0gIFtkaWN0IHJlbW92ZU9iamVjdEZvcktleTpOT107Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTpZRVNdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5Ok5PXSk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlT2JqZWN0Rm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OllFU10sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6Tk9dKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6WUVTXSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6Tk9dKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IEJPT0wga0tleXNbXSA9IHsgWUVTLCBOTyB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHNbXSA9IHsgQCJhYmMiLCBAImRlZiIgfTsKLSAgR1BCQm9vbE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkJvb2xPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6WUVTXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTpOT10sIEAiZGVmIik7Ci0KLSAgW2RpY3Qgc2V0T2JqZWN0OkAiZGVmIiBmb3JLZXk6WUVTXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OllFU10sIEAiZGVmIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6Tk9dLCBAImRlZiIpOwotCi0gIFtkaWN0IHNldE9iamVjdDpAImFiYyIgZm9yS2V5Ok5PXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OllFU10sIEAiZGVmIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6Tk9dLCBAImFiYyIpOwotCi0gIGNvbnN0IEJPT0wga0tleXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzMltdID0geyBAImRlZiIsIEAiYWJjIiB9OwotICBHUEJCb29sT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MiA9Ci0gICAgICBbW0dQQkJvb2xPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6WUVTXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTpOT10sIEAiZGVmIik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORC1FTkQgKDggZXhwYW5zaW9ucykKLQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkRpY3Rpb25hcnlUZXN0cytJbnQzMi5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJEaWN0aW9uYXJ5VGVzdHMrSW50MzIubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkZDJlZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkRpY3Rpb25hcnlUZXN0cytJbnQzMi5tCisrKyAvZGV2L251bGwKQEAgLTEsMzY0NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0IDxYQ1Rlc3QvWENUZXN0Lmg+Ci0KLSNpbXBvcnQgIkdQQkRpY3Rpb25hcnkuaCIKLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UnVudGltZVByb3RvMi5wYm9iamMuaCIKLQotLy8gUHVsbCBpbiB0aGUgbWFjcm9zICh1c2luZyBhbiBleHRlcm5hbCBmaWxlIGJlY2F1c2UgZXhwYW5kaW5nIGFsbCB0ZXN0cwotLy8gaW4gYSBzaW5nbGUgZmlsZSBtYWtlcyBhIGZpbGUgdGhhdCBpcyBmYWlsaW5nIHRvIHdvcmsgd2l0aCB3aXRoaW4gWGNvZGUuCi0vLyVQRERNLUlNUE9SVC1ERUZJTkVTIEdQQkRpY3Rpb25hcnlUZXN0cy5wZGRtCi0KLS8vJVBERE0tRVhQQU5EIFRFU1RfRk9SX1BPRF9LRVkoSW50MzIsIGludDMyX3QsIDExLCAxMiwgMTMsIDE0KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS8vIFRvIGxldCB0aGUgdGVzdGluZyBtYWNyb3Mgd29yaywgYWRkIHNvbWUgZXh0cmEgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGluZ3MuCi1AaW50ZXJmYWNlIEdQQkludDMyRW51bURpY3Rpb25hcnkgKFRlc3RpbmdUd2VhaykKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooaW50MzJfdClrZXk7Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDMyX3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotQGVuZAotCi1zdGF0aWMgQk9PTCBUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSkgewotICBzd2l0Y2ggKHZhbHVlKSB7Ci0gICAgY2FzZSA3MDA6Ci0gICAgY2FzZSA3MDE6Ci0gICAgY2FzZSA3MDI6Ci0gICAgY2FzZSA3MDM6Ci0gICAgICByZXR1cm4gWUVTOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTk87Ci0gIH0KLX0KLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyRW51bURpY3Rpb25hcnkgKFRlc3RpbmdUd2VhaykKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooaW50MzJfdClrZXkgewotICAvLyBDYXN0IGlzIG5lZWRlZCB0byBjb21waWxlciBrbm93cyB3aGF0IGNsYXNzIHdlIGFyZSBpbnZva2luZyBpbml0V2l0aFZhbHVlczogb24gdG8gZ2V0IHRoZQotICAvLyB0eXBlIGNvcnJlY3QuCi0gIHJldHVybiBbWyhHUEJJbnQzMkVudW1EaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgaW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XTsKLX0KLUBlbmQKLQotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBVSW50MzIKLQotQGludGVyZmFjZSBHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyVUludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjEwMFUgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIHVpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxMSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAxMDBVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMyB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUgfTsKLSAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIHVpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDMyX3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIHVpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXMxW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga0tleXMyW10gPSB7IDEyLCAxMSwgMTQgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczFbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDBVLCAxMDNVLCAxMDJVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXMzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjEwMFUgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTIsIDEzLCAxNCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIHVpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MTRdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIHVpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotCi0gIFtkaWN0IHNldFZhbHVlOjEwM1UgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotCi0gIFtkaWN0IHNldFZhbHVlOjEwMVUgZm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXMyW10gPSB7IDEyLCAxMyB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDJVLCAxMDBVIH07Ci0gIEdQQkludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDMyIC0+IEludDMyCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMySW50MzJEaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMkludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjIwMCBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDExKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDIwMCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxLCAyMDIgfTsKLSAgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIGludDMyX3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50MzJfdCkpOwotICBpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50MzJfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXMxW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga0tleXMyW10gPSB7IDEyLCAxMSwgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMVtdID0geyAyMDAsIDIwMSwgMjAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgMjAwLCAyMDMsIDIwMiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJJbnQzMkludDMyRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkludDMySW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjIwMCBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MTRdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MjAzIGZvcktleToxMV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjIwMSBmb3JLZXk6MTRdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLQotICBjb25zdCBpbnQzMl90IGtLZXlzMltdID0geyAxMiwgMTMgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyAyMDIsIDIwMCB9OwotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gVUludDY0Ci0KLUBpbnRlcmZhY2UgR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtbR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIHVpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTozMDBVIGZvcktleToxMV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMTEpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgMzAwVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVIH07Ci0gIEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIGludDMyX3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50MzJfdCkpOwotICB1aW50NjRfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCB1aW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzMVtdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtLZXlzMltdID0geyAxMiwgMTEsIDE0IH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMxW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczJbXSA9IHsgMzAwVSwgMzAzVSwgMzAyVSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzM1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkludDMyVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyVUludDY0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTozMDBVIGZvcktleToxMV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDEyLCAxMywgMTQgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQkludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLQotICBbZGljdCBzZXRWYWx1ZTozMDNVIGZvcktleToxMV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLQotICBbZGljdCBzZXRWYWx1ZTozMDFVIGZvcktleToxNF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLQotICBjb25zdCBpbnQzMl90IGtLZXlzMltdID0geyAxMiwgMTMgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczJbXSA9IHsgMzAyVSwgMzAwVSB9OwotICBHUEJJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkludDMySW50NjREaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMkludDY0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQkludDMySW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo0MDAgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgaW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxMSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA0MDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSwgNDAyIH07Ci0gIEdQQkludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBpbnQzMl90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKGludDMyX3QpKTsKLSAgaW50NjRfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGludDY0X3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzMVtdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtLZXlzMltdID0geyAxMiwgMTEsIDE0IH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczFbXSA9IHsgNDAwLCA0MDEsIDQwMiB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDQwMCwgNDAzLCA0MDIgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzM1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkludDMySW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDMySW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQkludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQzMkludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkludDMySW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo0MDAgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQkludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MTJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjQwMyBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLQotICBbZGljdCBzZXRWYWx1ZTo0MDEgZm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDEzIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAyLCA0MDAgfTsKLSAgR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDMyIC0+IEJvb2wKLQotQGludGVyZmFjZSBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIEJPT0wgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6WUVTIGZvcktleToxMV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIEJPT0wgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMTEpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgWUVTKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBZRVMsIE5PIH07Ci0gIEdQQkludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIEJPT0wgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihCT09MKSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgaW50MzJfdCBrS2V5czFbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDExLCAxNCB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMxW10gPSB7IFlFUywgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMyW10gPSB7IFlFUywgTk8sIE5PIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDMyQm9vbERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCSW50MzJCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQkludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTywgTk8gfTsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTpZRVMgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTIsIDEzLCAxNCB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBOTywgTk8gfTsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTywgTk8gfTsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTywgTk8gfTsKLSAgR1BCSW50MzJCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHNldFZhbHVlOk5PIGZvcktleToxMV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHNldFZhbHVlOllFUyBmb3JLZXk6MTRdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDEzIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczJbXSA9IHsgTk8sIFlFUyB9OwotICBHUEJJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gRmxvYXQKLQotQGludGVyZmFjZSBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50MzJGbG9hdERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBmbG9hdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjUwMC5mIGZvcktleToxMV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDExKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDUwMC5mKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMyB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYgfTsKLSAgR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBpbnQzMl90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKGludDMyX3QpKTsKLSAgZmxvYXQgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihmbG9hdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgaW50MzJfdCBrS2V5czFbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDExLCAxNCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMVtdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMyW10gPSB7IDUwMC5mLCA1MDMuZiwgNTAyLmYgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlczNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQkludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkludDMyRmxvYXREaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo1MDAuZiBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQkludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MTJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGZsb2F0IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MTJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxNF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NTAzLmYgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLQotICBbZGljdCBzZXRWYWx1ZTo1MDEuZiBmb3JLZXk6MTRdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXMyW10gPSB7IDEyLCAxMyB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMltdID0geyA1MDIuZiwgNTAwLmYgfTsKLSAgR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gRG91YmxlCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGRvdWJsZSBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6NjAwLiBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMTEpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNjAwLik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAwLiwgNjAxLiwgNjAyLiB9OwotICBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIGRvdWJsZSAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGRvdWJsZSkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgZG91YmxlIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzMVtdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtLZXlzMltdID0geyAxMiwgMTEsIDE0IH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMVtdID0geyA2MDAuLCA2MDEuLCA2MDIuIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMltdID0geyA2MDAuLCA2MDMuLCA2MDIuIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzM1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkludDMyRG91YmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjYwMC4gZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTIsIDEzLCAxNCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQkludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDMuKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAwLiwgNjAxLiwgNjAyLiwgNjAzLiB9OwotICBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotCi0gIFtkaWN0IHNldFZhbHVlOjYwMy4gZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotCi0gIFtkaWN0IHNldFZhbHVlOjYwMS4gZm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXMyW10gPSB7IDEyLCAxMyB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlczJbXSA9IHsgNjAyLiwgNjAwLiB9OwotICBHUEJJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBFbnVtCi0KLUBpbnRlcmZhY2UgR1BCSW50MzJFbnVtRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50MzJFbnVtRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjcwMCBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDExKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDcwMCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAxLCA3MDIgfTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIGludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgaW50MzJfdCBrS2V5czFbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDExLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMxW10gPSB7IDcwMCwgNzAxLCA3MDIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyA3MDAsIDcwMywgNzAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAxLCA3MDIsIDcwMyB9OwotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo3MDAgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAxLCA3MDIsIDcwMyB9OwotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkUmF3RW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MTJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxNF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjcwMyBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLQotICBbZGljdCBzZXRWYWx1ZTo3MDEgZm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDEzIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgNzAyLCA3MDAgfTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50MzIgLT4gRW51bSAoVW5rbm93biBFbnVtcykKLQotQGludGVyZmFjZSBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5VW5rbm93bkVudW1UZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyRW51bURpY3Rpb25hcnlVbmtub3duRW51bVRlc3RzCi0KLS0gKHZvaWQpdGVzdFJhd0Jhc2ljcyB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMyB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OwotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoZGljdC52YWxpZGF0aW9uRnVuYyA9PSBUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHJhd1ZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIGludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIGlmIChpID09IDEpIHsKLSAgICAgICAgICBYQ1RBc3NlcnRFcXVhbChrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHlXaXRoVW5rbm93bnMgewotICBjb25zdCBpbnQzMl90IGtLZXlzMVtdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtLZXlzMltdID0geyAxMiwgMTEsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OyAgLy8gVW5rbm93bgotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMCwgODAzLCA3MDIgfTsgIC8vIFVua25vd24KLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5V2l0aFVua25vd25zIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiwgODAzIH07ICAvLyBVbmtub3duCi0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QudmFsaWRhdGlvbkZ1bmMsIGRpY3QyLnZhbGlkYXRpb25GdW5jKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNvbgotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgODAxLCA3MDIsIDgwMyB9OyAgLy8gVW5rbm93bnMKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LnZhbGlkYXRpb25GdW5jLCBkaWN0Mi52YWxpZGF0aW9uRnVuYyk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFVua25vd25BZGRzIHsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgW0dQQkludDMyRW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbZGljdCBzZXRWYWx1ZTo4MDEgZm9yS2V5OjEyXSwgIC8vIFVua25vd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFJhd1ZhbHVlOjgwMSBmb3JLZXk6MTJdOyAgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMiwgODAzIH07ICAvLyBVbmtub3duCi0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFVua25vd25SZW1vdmUgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQkludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjEyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MTRdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvblVua25vd25zIHsKLSAgY29uc3QgaW50MzJfdCBrS2V5c1tdID0geyAxMSwgMTIsIDEzLCAxNCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiwgODAzIH07ICAvLyBVbmtub3ducwotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFtkaWN0IHNldFZhbHVlOjgwMyBmb3JLZXk6MTFdLCAgLy8gVW5rbm93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotCi0gIFtkaWN0IHNldFJhd1ZhbHVlOjgwMyBmb3JLZXk6MTFdOyAgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICBbZGljdCBzZXRSYXdWYWx1ZTo3MDAgZm9yS2V5OjE0XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMSByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEyIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTMgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxNCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDEzIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgNzAyLCA4MDEgfTsgIC8vIFVua25vd24KLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTEgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjExIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjEzIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxMyByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MTQgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjE0IHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5VW5rbm93bnMgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsKLSAgR1BCSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyRW51bURpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQzMiAtPiBPYmplY3QKLQotQGludGVyZmFjZSBHUEJJbnQzMk9iamVjdERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyT2JqZWN0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPSBbW0dQQkludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjExXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKGludDMyX3QgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhT2JqZWN0LCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPSBbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OkAiYWJjIiBmb3JLZXk6MTFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMV0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MTJdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBOU1N0cmluZyogYU9iamVjdCwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDExKTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYU9iamVjdCwgQCJhYmMiKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMyB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHNbXSA9IHsgQCJhYmMiLCBAImRlZiIsIEAiZ2hpIiB9OwotICBHUEJJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMV0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTJdLCBAImRlZiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjEzXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleToxNF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBpbnQzMl90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKGludDMyX3QpKTsKLSAgTlNTdHJpbmcqICpzZWVuT2JqZWN0cyA9IG1hbGxvYygzICogc2l6ZW9mKE5TU3RyaW5nKikpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihpbnQzMl90IGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2Vlbk9iamVjdHNbaWR4XSA9IGFPYmplY3Q7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoa09iamVjdHNbaV0sIHNlZW5PYmplY3RzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2Vlbk9iamVjdHMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oaW50MzJfdCBhS2V5LCBOU1N0cmluZyogYU9iamVjdCwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFPYmplY3QpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXMxW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IGludDMyX3Qga0tleXMyW10gPSB7IDEyLCAxMSwgMTQgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzMVtdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0czJbXSA9IHsgQCJhYmMiLCBAImprbCIsIEAiZ2hpIiB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHMzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDEgPQotICAgICAgW1tHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QzID0KLSAgICAgIFtbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDMyT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0NCA9Ci0gICAgICBbW0dQQkludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgb2JqZWN0czsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIG9iamVjdHM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDMyT2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiLCBAImprbCIgfTsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDMyT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MiA9Ci0gICAgICBbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPSBbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRPYmplY3Q6QCJhYmMiIGZvcktleToxMV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDEyLCAxMywgMTQgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiZGVmIiwgQCJnaGkiLCBAImprbCIgfTsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjExXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMl0sIEAiZGVmIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTNdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjE0XSwgQCJqa2wiKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQzMl90IGtLZXlzW10gPSB7IDExLCAxMiwgMTMsIDE0IH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiLCBAImprbCIgfTsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPQotICAgICAgW1tHUEJJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZU9iamVjdEZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMV0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MTJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxM10sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTRdLCBAImprbCIpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZU9iamVjdEZvcktleToxMl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMV0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MTJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxM10sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTRdLCBAImprbCIpOwotCi0gIFtkaWN0IHJlbW92ZU9iamVjdEZvcktleToxNF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMV0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MTJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxM10sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MTRdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MTFdKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleToxMl0pOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjEzXSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MTRdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDMyX3Qga0tleXNbXSA9IHsgMTEsIDEyLCAxMywgMTQgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTFdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjEyXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxM10sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTRdLCBAImprbCIpOwotCi0gIFtkaWN0IHNldE9iamVjdDpAImprbCIgZm9yS2V5OjExXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjExXSwgQCJqa2wiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMl0sIEAiZGVmIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTNdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjE0XSwgQCJqa2wiKTsKLQotICBbZGljdCBzZXRPYmplY3Q6QCJkZWYiIGZvcktleToxNF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMV0sIEAiamtsIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTJdLCBAImRlZiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjEzXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxNF0sIEAiZGVmIik7Ci0KLSAgY29uc3QgaW50MzJfdCBrS2V5czJbXSA9IHsgMTIsIDEzIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0czJbXSA9IHsgQCJnaGkiLCBAImFiYyIgfTsKLSAgR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QyID0KLSAgICAgIFtbR1BCSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxMV0sIEAiamtsIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MTJdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjEzXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxNF0sIEAiZGVmIik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORC1FTkQgVEVTVF9GT1JfUE9EX0tFWShJbnQzMiwgaW50MzJfdCwgMTEsIDEyLCAxMywgMTQpCi0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK0ludDY0Lm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkRpY3Rpb25hcnlUZXN0cytJbnQ2NC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmJjNjQ4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK0ludDY0Lm0KKysrIC9kZXYvbnVsbApAQCAtMSwzNjQ3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgPFhDVGVzdC9YQ1Rlc3QuaD4KLQotI2ltcG9ydCAiR1BCRGljdGlvbmFyeS5oIgotCi0jaW1wb3J0ICJHUEJUZXN0VXRpbGl0aWVzLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RSdW50aW1lUHJvdG8yLnBib2JqYy5oIgotCi0vLyBQdWxsIGluIHRoZSBtYWNyb3MgKHVzaW5nIGFuIGV4dGVybmFsIGZpbGUgYmVjYXVzZSBleHBhbmRpbmcgYWxsIHRlc3RzCi0vLyBpbiBhIHNpbmdsZSBmaWxlIG1ha2VzIGEgZmlsZSB0aGF0IGlzIGZhaWxpbmcgdG8gd29yayB3aXRoIHdpdGhpbiBYY29kZS4KLS8vJVBERE0tSU1QT1JULURFRklORVMgR1BCRGljdGlvbmFyeVRlc3RzLnBkZG0KLQotLy8lUERETS1FWFBBTkQgVEVTVF9GT1JfUE9EX0tFWShJbnQ2NCwgaW50NjRfdCwgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0vLyBUbyBsZXQgdGhlIHRlc3RpbmcgbWFjcm9zIHdvcmssIGFkZCBzb21lIGV4dHJhIG1ldGhvZHMgdG8gc2ltcGxpZnkgdGhpbmdzLgotQGludGVyZmFjZSBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IChUZXN0aW5nVHdlYWspCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBpbnQ2NF90IFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLUBlbmQKLQotc3RhdGljIEJPT0wgVGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpIHsKLSAgc3dpdGNoICh2YWx1ZSkgewotICAgIGNhc2UgNzAwOgotICAgIGNhc2UgNzAxOgotICAgIGNhc2UgNzAyOgotICAgIGNhc2UgNzAzOgotICAgICAgcmV0dXJuIFlFUzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5POwotICB9Ci19Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IChUZXN0aW5nVHdlYWspCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KGludDY0X3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgdG8gY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6IG9uIHRvIGdldCB0aGUKLSAgLy8gdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCSW50NjRFbnVtRGljdGlvbmFyeSopW3NlbGYgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoxXSBhdXRvcmVsZWFzZV07Ci19Ci0tIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IGludDY0X3QgW10pa2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50IHsKLSAgcmV0dXJuIFtzZWxmIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpjb3VudF07Ci19Ci1AZW5kCi0KLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gVUludDMyCi0KLUBpbnRlcmZhY2UgR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjEwMFUgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIHVpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDIxTEwpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgMTAwVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVIH07Ci0gIEdQQkludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIHVpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQ2NF90KSk7Ci0gIHVpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDMyX3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIHVpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXMxW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50NjRfdCBrS2V5czJbXSA9IHsgMjJMTCwgMjFMTCwgMjRMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMVtdID0geyAxMDBVLCAxMDFVLCAxMDJVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDEwMFUsIDEwM1UsIDEwMlUgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczNbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSwgMTAzVSB9OwotICBHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSwgMTAzVSB9OwotICBHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0VUludDMyRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQkludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDY0VUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjEwMFUgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAxVSwgMTAyVSwgMTAzVSB9OwotICBHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjIyTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjI0TExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQkludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAzVSBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAxVSBmb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5czJbXSA9IHsgMjJMTCwgMjNMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDJVLCAxMDBVIH07Ci0gIEdQQkludDY0VUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NCAtPiBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQkludDY0SW50MzJEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQ2NEludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQkludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjIwMCBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMjFMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAyMDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyIH07Ci0gIEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIGludDY0X3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50NjRfdCkpOwotICBpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50MzJfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXMxW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50NjRfdCBrS2V5czJbXSA9IHsgMjJMTCwgMjFMTCwgMjRMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMxW10gPSB7IDIwMCwgMjAxLCAyMDIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyAyMDAsIDIwMywgMjAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQkludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkludDY0SW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjIwMCBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjIyTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjIyTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjI0TExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLQotICBbZGljdCBzZXRWYWx1ZToyMDMgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MjAxIGZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotCi0gIGNvbnN0IGludDY0X3Qga0tleXMyW10gPSB7IDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyAyMDIsIDIwMCB9OwotICBHUEJJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQkludDY0VUludDY0RGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQkludDY0VUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIHVpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkludDY0VUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTozMDBVIGZvcktleToyMUxMXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCB1aW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAyMUxMKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDMwMFUpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSB9OwotICBHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIGludDY0X3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50NjRfdCkpOwotICB1aW50NjRfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCB1aW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBpbnQ2NF90IGtLZXlzMVtdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDY0X3Qga0tleXMyW10gPSB7IDIyTEwsIDIxTEwsIDI0TEwgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczFbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzMltdID0geyAzMDBVLCAzMDNVLCAzMDJVIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkludDY0VUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDY0VUludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkludDY0VUludDY0RGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDY0VUludDY0RGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTozMDBVIGZvcktleToyMUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0VUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQkludDY0VUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0VUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjIyTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyMkxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIFtkaWN0IHNldFZhbHVlOjMwM1UgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIFtkaWN0IHNldFZhbHVlOjMwMVUgZm9yS2V5OjI0TExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMVUpOwotCi0gIGNvbnN0IGludDY0X3Qga0tleXMyW10gPSB7IDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczJbXSA9IHsgMzAyVSwgMzAwVSB9OwotICBHUEJJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMVUpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gSW50NjQKLQotQGludGVyZmFjZSBHUEJJbnQ2NEludDY0RGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRJbnQ2NERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo0MDAgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDIxTEwpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNDAwKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiB9OwotICBHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0SW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBpbnQ2NF90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKGludDY0X3QpKTsKLSAgaW50NjRfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGludDY0X3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBpbnQ2NF90IGtLZXlzMVtdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDY0X3Qga0tleXMyW10gPSB7IDIyTEwsIDIxTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzMVtdID0geyA0MDAsIDQwMSwgNDAyIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAwLCA0MDMsIDQwMiB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0SW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJJbnQ2NEludDY0RGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0SW50NjREaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQ2NEludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkludDY0SW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo0MDAgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0SW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyMkxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyMkxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQkludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NDAzIGZvcktleToyMUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjQwMSBmb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyM0xMIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAyLCA0MDAgfTsKLSAgR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBJbnQ2NCAtPiBCb29sCi0KLUBpbnRlcmZhY2UgR1BCSW50NjRCb29sRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRCb29sRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCSW50NjRCb29sRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIEJPT0wgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCSW50NjRCb29sRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6WUVTIGZvcktleToyMUxMXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIEJPT0wgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAyMUxMKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIFlFUyk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTyB9OwotICBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgQk9PTCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQ2NF90KSk7Ci0gIEJPT0wgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihCT09MKSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5czFbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyMUxMLCAyNExMIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczFbXSA9IHsgWUVTLCBZRVMsIE5PIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczJbXSA9IHsgWUVTLCBOTywgTk8gfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzM1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQkludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCSW50NjRCb29sRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRCb29sRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50NjRCb29sRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTywgTk8gfTsKLSAgR1BCSW50NjRCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCSW50NjRCb29sRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTpZRVMgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIE5PLCBOTyB9OwotICBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIEJPT0wgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgQk9PTCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjIyTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQkludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgQk9PTCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6Tk8gZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6WUVTIGZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLQotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyM0xMIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczJbXSA9IHsgTk8sIFlFUyB9OwotICBHUEJJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IEZsb2F0Ci0KLUBpbnRlcmZhY2UgR1BCSW50NjRGbG9hdERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdCA9IFtbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBmbG9hdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjUwMC5mIGZvcktleToyMUxMXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIGZsb2F0IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMjFMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA1MDAuZik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mIH07Ci0gIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBpbnQ2NF90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKGludDY0X3QpKTsKLSAgZmxvYXQgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihmbG9hdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5czFbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyMUxMLCAyNExMIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMxW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlczJbXSA9IHsgNTAwLmYsIDUwMy5mLCA1MDIuZiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzM1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0RmxvYXREaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQkludDY0RmxvYXREaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo1MDAuZiBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQkludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGZsb2F0IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyMkxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLQotICBbZGljdCBzZXRWYWx1ZTo1MDMuZiBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotCi0gIFtkaWN0IHNldFZhbHVlOjUwMS5mIGZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5czJbXSA9IHsgMjJMTCwgMjNMTCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMltdID0geyA1MDIuZiwgNTAwLmYgfTsKLSAgR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQkludDY0RG91YmxlRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGRvdWJsZSBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6NjAwLiBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGRvdWJsZSBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAyMUxMKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDYwMC4pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4gfTsKLSAgR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQ2NF90KSk7Ci0gIGRvdWJsZSAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGRvdWJsZSkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgZG91YmxlIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBpbnQ2NF90IGtLZXlzMVtdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDY0X3Qga0tleXMyW10gPSB7IDIyTEwsIDIxTEwsIDI0TEwgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMxW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMyW10gPSB7IDYwMC4sIDYwMy4sIDYwMi4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQkludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjYwMC4gZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGRvdWJsZSB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDMuKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyMkxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDMuKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAzLiBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAxLiBmb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5czJbXSA9IHsgMjJMTCwgMjNMTCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlczJbXSA9IHsgNjAyLiwgNjAwLiB9OwotICBHUEJJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gSW50NjQgLT4gRW51bQotCi1AaW50ZXJmYWNlIEdQQkludDY0RW51bURpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDY0RW51bURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjcwMCBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMjFMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA3MDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyIH07Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgaW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQ2NF90KSk7Ci0gIGludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5czFbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyMUxMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzAwLCA3MDEsIDcwMiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMCwgNzAzLCA3MDIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0RW51bURpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9IFtHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo3MDAgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAxLCA3MDIsIDcwMyB9OwotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAxLCA3MDIsIDcwMyB9OwotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NzAzIGZvcktleToyMUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjcwMSBmb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLQotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyM0xMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgNzAyLCA3MDAgfTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IEVudW0gKFVua25vd24gRW51bXMpCi0KLUBpbnRlcmZhY2UgR1BCSW50NjRFbnVtRGljdGlvbmFyeVVua25vd25FbnVtVGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5VW5rbm93bkVudW1UZXN0cwotCi0tICh2b2lkKXRlc3RSYXdCYXNpY3MgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgODAxLCA3MDIgfTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKGRpY3QudmFsaWRhdGlvbkZ1bmMgPT0gVGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNvbgotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIGludDY0X3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50NjRfdCkpOwotICBpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50MzJfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBpZiAoaSA9PSAxKSB7Ci0gICAgICAgICAgWENUQXNzZXJ0RXF1YWwoa0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRSYXdWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRSYXdWYWx1ZXNVc2luZ0Jsb2NrOl4oaW50NjRfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5V2l0aFVua25vd25zIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5czFbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyMUxMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OyAgLy8gVW5rbm93bgotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMCwgODAzLCA3MDIgfTsgIC8vIFVua25vd24KLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5V2l0aFVua25vd25zIHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd24KLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMUxMLCAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQkludDY0RW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RVbmtub3duQWRkcyB7Ci0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgIFtHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2RpY3Qgc2V0VmFsdWU6ODAxIGZvcktleToyMkxMXSwgIC8vIFVua25vd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFJhd1ZhbHVlOjgwMSBmb3JLZXk6MjJMTF07ICAvLyBVbmtub3duCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAyLCA4MDMgfTsgIC8vIFVua25vd24KLSAgR1BCSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0VW5rbm93blJlbW92ZSB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiwgODAzIH07ICAvLyBVbmtub3ducwotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjJMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb25Vbmtub3ducyB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiwgODAzIH07ICAvLyBVbmtub3ducwotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbZGljdCBzZXRWYWx1ZTo4MDMgZm9yS2V5OjIxTExdLCAgLy8gVW5rbm93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICBbZGljdCBzZXRSYXdWYWx1ZTo4MDMgZm9yS2V5OjIxTExdOyAgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjFMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjJMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjNMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MjRMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgW2RpY3Qgc2V0UmF3VmFsdWU6NzAwIGZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIxTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIyTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjIzTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjI0TEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotCi0gIGNvbnN0IGludDY0X3Qga0tleXMyW10gPSB7IDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyA3MDIsIDgwMSB9OyAgLy8gVW5rbm93bgotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMUxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyMkxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyM0xMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyNExMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5VW5rbm93bnMgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgODAxLCA3MDIsIDgwMyB9OwotICBHUEJJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQkludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LnZhbGlkYXRpb25GdW5jLCBkaWN0Mi52YWxpZGF0aW9uRnVuYyk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCSW50NjRFbnVtRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEludDY0IC0+IE9iamVjdAotCi1AaW50ZXJmYWNlIEdQQkludDY0T2JqZWN0RGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtbR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MjFMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYU9iamVjdCwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQkludDY0T2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0ID0gW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDpAImFiYyIgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMUxMXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleToyMkxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAyMUxMKTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYU9iamVjdCwgQCJhYmMiKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IGludDY0X3Qga0tleXNbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHNbXSA9IHsgQCJhYmMiLCBAImRlZiIsIEAiZ2hpIiB9OwotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMUxMXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMkxMXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyM0xMXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleToyNExMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIGludDY0X3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50NjRfdCkpOwotICBOU1N0cmluZyogKnNlZW5PYmplY3RzID0gbWFsbG9jKDMgKiBzaXplb2YoTlNTdHJpbmcqKSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKGludDY0X3QgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuT2JqZWN0c1tpZHhdID0gYU9iamVjdDsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhrT2JqZWN0c1tpXSwgc2Vlbk9iamVjdHNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuT2JqZWN0cyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kT2JqZWN0c1VzaW5nQmxvY2s6XihpbnQ2NF90IGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYU9iamVjdCkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgaW50NjRfdCBrS2V5czFbXSA9IHsgMjFMTCwgMjJMTCwgMjNMTCwgMjRMTCB9OwotICBjb25zdCBpbnQ2NF90IGtLZXlzMltdID0geyAyMkxMLCAyMUxMLCAyNExMIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0czFbXSA9IHsgQCJhYmMiLCBAImRlZiIsIEAiZ2hpIiB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHMyW10gPSB7IEAiYWJjIiwgQCJqa2wiLCBAImdoaSIgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzM1tdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiLCBAImprbCIgfTsKLSAgR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QxID0KLSAgICAgIFtbR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQkludDY0T2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QyID0KLSAgICAgIFtbR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQkludDY0T2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MyA9Ci0gICAgICBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDQgPQotICAgICAgW1tHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IG9iamVjdHM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSBvYmplY3RzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCSW50NjRPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QyID0KLSAgICAgIFtHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldE9iamVjdDpAImFiYyIgZm9yS2V5OjIxTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgaW50NjRfdCBrS2V5c1tdID0geyAyMkxMLCAyM0xMLCAyNExMIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImRlZiIsIEAiZ2hpIiwgQCJqa2wiIH07Ci0gIEdQQkludDY0T2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MiA9Ci0gICAgICBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMUxMXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMkxMXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyM0xMXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyNExMXSwgQCJqa2wiKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlT2JqZWN0Rm9yS2V5OjIyTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MjFMTF0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MjJMTF0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIzTExdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjI0TExdLCBAImprbCIpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZU9iamVjdEZvcktleToyMkxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIxTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIyTExdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyM0xMXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyNExMXSwgQCJqa2wiKTsKLQotICBbZGljdCByZW1vdmVPYmplY3RGb3JLZXk6MjRMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMUxMXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleToyMkxMXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MjNMTF0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MjRMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleToyMUxMXSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MjJMTF0pOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIzTExdKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleToyNExMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBpbnQ2NF90IGtLZXlzW10gPSB7IDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQkludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MjFMTF0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MjJMTF0sIEAiZGVmIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MjNMTF0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MjRMTF0sIEAiamtsIik7Ci0KLSAgW2RpY3Qgc2V0T2JqZWN0OkAiamtsIiBmb3JLZXk6MjFMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMUxMXSwgQCJqa2wiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyMkxMXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyM0xMXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyNExMXSwgQCJqa2wiKTsKLQotICBbZGljdCBzZXRPYmplY3Q6QCJkZWYiIGZvcktleToyNExMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIxTExdLCBAImprbCIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIyTExdLCBAImRlZiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIzTExdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjI0TExdLCBAImRlZiIpOwotCi0gIGNvbnN0IGludDY0X3Qga0tleXMyW10gPSB7IDIyTEwsIDIzTEwgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzMltdID0geyBAImdoaSIsIEAiYWJjIiB9OwotICBHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIxTExdLCBAImprbCIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIyTExdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjIzTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjI0TExdLCBAImRlZiIpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotLy8lUERETS1FWFBBTkQtRU5EIFRFU1RfRk9SX1BPRF9LRVkoSW50NjQsIGludDY0X3QsIDIxTEwsIDIyTEwsIDIzTEwsIDI0TEwpCi0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK1N0cmluZy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJEaWN0aW9uYXJ5VGVzdHMrU3RyaW5nLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmYTEwYjEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJEaWN0aW9uYXJ5VGVzdHMrU3RyaW5nLm0KKysrIC9kZXYvbnVsbApAQCAtMSwzMzU5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxGb3VuZGF0aW9uL0ZvdW5kYXRpb24uaD4KLSNpbXBvcnQgPFhDVGVzdC9YQ1Rlc3QuaD4KLQotI2ltcG9ydCAiR1BCRGljdGlvbmFyeS5oIgotCi0jaW1wb3J0ICJHUEJUZXN0VXRpbGl0aWVzLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RSdW50aW1lUHJvdG8yLnBib2JqYy5oIgotCi0vLyBQdWxsIGluIHRoZSBtYWNyb3MgKHVzaW5nIGFuIGV4dGVybmFsIGZpbGUgYmVjYXVzZSBleHBhbmRpbmcgYWxsIHRlc3RzCi0vLyBpbiBhIHNpbmdsZSBmaWxlIG1ha2VzIGEgZmlsZSB0aGF0IGlzIGZhaWxpbmcgdG8gd29yayB3aXRoIHdpdGhpbiBYY29kZS4KLS8vJVBERE0tSU1QT1JULURFRklORVMgR1BCRGljdGlvbmFyeVRlc3RzLnBkZG0KLQotLy8lUERETS1FWFBBTkQgVEVTVFNfRk9SX1BPRF9WQUxVRVMoU3RyaW5nLCBOU1N0cmluZywgKiwgT2JqZWN0cywgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLS8vIFRvIGxldCB0aGUgdGVzdGluZyBtYWNyb3Mgd29yaywgYWRkIHNvbWUgZXh0cmEgbWV0aG9kcyB0byBzaW1wbGlmeSB0aGluZ3MuCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IChUZXN0aW5nVHdlYWspCi0rIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KE5TU3RyaW5nICopa2V5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBOU1N0cmluZyAqIFtdKWtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudDsKLUBlbmQKLQotc3RhdGljIEJPT0wgVGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpIHsKLSAgc3dpdGNoICh2YWx1ZSkgewotICAgIGNhc2UgNzAwOgotICAgIGNhc2UgNzAxOgotICAgIGNhc2UgNzAyOgotICAgIGNhc2UgNzAzOgotICAgICAgcmV0dXJuIFlFUzsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIE5POwotICB9Ci19Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAoVGVzdGluZ1R3ZWFrKQotKyAoaW5zdGFuY2V0eXBlKWRpY3Rpb25hcnlXaXRoVmFsdWU6KGludDMyX3QpdmFsdWUgZm9yS2V5OihOU1N0cmluZyAqKWtleSB7Ci0gIC8vIENhc3QgaXMgbmVlZGVkIHRvIGNvbXBpbGVyIGtub3dzIHdoYXQgY2xhc3Mgd2UgYXJlIGludm9raW5nIGluaXRXaXRoVmFsdWVzOiBvbiB0byBnZXQgdGhlCi0gIC8vIHR5cGUgY29ycmVjdC4KLSAgcmV0dXJuIFtbKEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5Kilbc2VsZiBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZ2YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czoma2V5Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OjFdIGF1dG9yZWxlYXNlXTsKLX0KLS0gKGluc3RhbmNldHlwZSlpbml0V2l0aFZhbHVlczooY29uc3QgaW50MzJfdCBbXSl2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czooY29uc3QgTlNTdHJpbmcgKiBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XTsKLX0KLUBlbmQKLQotCi0jcHJhZ21hIG1hcmsgLSBTdHJpbmcgLT4gVUludDMyCi0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZToxMDBVIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFLZXksIEAiZm9vIik7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAxMDBVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSB9OwotICBHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIE5TU3RyaW5nICoqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihOU1N0cmluZyopKTsKLSAgdWludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50MzJfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKFtrS2V5c1tpXSBpc0VxdWFsOnNlZW5LZXlzW2pdXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBOU1N0cmluZyAqa0tleXMxW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBOU1N0cmluZyAqa0tleXMyW10gPSB7IEAiYmFyIiwgQCJmb28iLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczFbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDBVLCAxMDNVLCAxMDJVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXMzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZToxMDBVIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMVUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDNVKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSwgMTAzVSB9OwotICBHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJiYXIiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDNVKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAImJhciJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJtdW1ibGUiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSwgMTAzVSB9OwotICBHUEJTdHJpbmdVSW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIHVpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAzVSBmb3JLZXk6QCJmb28iXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAxVSBmb3JLZXk6QCJtdW1ibGUiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDJVLCAxMDBVIH07Ci0gIEdQQlN0cmluZ1VJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFN0cmluZyAtPiBJbnQzMgotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZToyMDAgZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYUtleSwgQCJmb28iKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDIwMCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiB9OwotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBOU1N0cmluZyAqKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoTlNTdHJpbmcqKSk7Ci0gIGludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChba0tleXNbaV0gaXNFcXVhbDpzZWVuS2V5c1tqXV0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCBOU1N0cmluZyAqa0tleXMxW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBOU1N0cmluZyAqa0tleXMyW10gPSB7IEAiYmFyIiwgQCJmb28iLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMVtdID0geyAyMDAsIDIwMSwgMjAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgMjAwLCAyMDMsIDIwMiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZToyMDAgZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAiYmFyIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAImJhciJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJtdW1ibGUiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQlN0cmluZ0ludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLQotICBbZGljdCBzZXRWYWx1ZToyMDMgZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MjAxIGZvcktleTpAIm11bWJsZSJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotCi0gIGNvbnN0IE5TU3RyaW5nICprS2V5czJbXSA9IHsgQCJiYXIiLCBAImJheiIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyAyMDIsIDIwMCB9OwotICBHUEJTdHJpbmdJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IFVJbnQ2NAotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6MzAwVSBmb3JLZXk6QCJmb28iXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIHVpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhS2V5LCBAImZvbyIpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgMzAwVSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUgfTsKLSAgR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICBOU1N0cmluZyAqKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoTlNTdHJpbmcqKSk7Ci0gIHVpbnQ2NF90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDY0X3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChba0tleXNbaV0gaXNFcXVhbDpzZWVuS2V5c1tqXV0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIHVpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMVtdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiZm9vIiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMxW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczJbXSA9IHsgMzAwVSwgMzAzVSwgMzAyVSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzM1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6MzAwVSBmb3JLZXk6QCJmb28iXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIHVpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAiYmFyIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJiYXIiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAibXVtYmxlIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCU3RyaW5nVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIFtkaWN0IHNldFZhbHVlOjMwM1UgZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIFtkaWN0IHNldFZhbHVlOjMwMVUgZm9yS2V5OkAibXVtYmxlIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMVUpOwotCi0gIGNvbnN0IE5TU3RyaW5nICprS2V5czJbXSA9IHsgQCJiYXIiLCBAImJheiIgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczJbXSA9IHsgMzAyVSwgMzAwVSB9OwotICBHUEJTdHJpbmdVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ1VJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBTdHJpbmcgLT4gSW50NjQKLQotQGludGVyZmFjZSBHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgaW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6NDAwIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFLZXksIEAiZm9vIik7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA0MDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxLCA0MDIgfTsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgTlNTdHJpbmcgKipzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKE5TU3RyaW5nKikpOwotICBpbnQ2NF90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50NjRfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoW2tLZXlzW2ldIGlzRXF1YWw6c2VlbktleXNbal1dKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBpbnQ2NF90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMVtdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiZm9vIiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczFbXSA9IHsgNDAwLCA0MDEsIDQwMiB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDQwMCwgNDAzLCA0MDIgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzM1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlN0cmluZ0ludDY0RGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlN0cmluZ0ludDY0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlN0cmluZ0ludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6NDAwIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAImJhciJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJiYXIiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAibXVtYmxlIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NDAzIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjQwMSBmb3JLZXk6QCJtdW1ibGUiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBjb25zdCBOU1N0cmluZyAqa0tleXMyW10gPSB7IEAiYmFyIiwgQCJiYXoiIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAyLCA0MDAgfTsKLSAgR1BCU3RyaW5nSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0ludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIFN0cmluZyAtPiBCb29sCi0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nQm9vbERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5VGVzdHMKLQotLSAodm9pZCl0ZXN0RW1wdHkgewotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOllFUyBmb3JLZXk6QCJmb28iXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIEJPT0wgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhS2V5LCBAImZvbyIpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgWUVTKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8gfTsKLSAgR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIE5TU3RyaW5nICoqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihOU1N0cmluZyopKTsKLSAgQk9PTCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKEJPT0wpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKFtrS2V5c1tpXSBpc0VxdWFsOnNlZW5LZXlzW2pdXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5czFbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5czJbXSA9IHsgQCJiYXIiLCBAImZvbyIsIEAibXVtYmxlIiB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMxW10gPSB7IFlFUywgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMyW10gPSB7IFlFUywgTk8sIE5PIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTywgTk8gfTsKLSAgR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6WUVTIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgTk8sIE5PIH07Ci0gIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIEJPT0wgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJiYXIiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAImJhciJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAibXVtYmxlIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0Jvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6Tk8gZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6WUVTIGZvcktleTpAIm11bWJsZSJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLQotICBjb25zdCBOU1N0cmluZyAqa0tleXMyW10gPSB7IEAiYmFyIiwgQCJiYXoiIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczJbXSA9IHsgTk8sIFlFUyB9OwotICBHUEJTdHJpbmdCb29sRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJTdHJpbmdCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEZsb2F0Ci0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqZGljdCA9IFtbR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo1MDAuZiBmb3JLZXk6QCJmb28iXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0gIGZsb2F0IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBmbG9hdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYUtleSwgQCJmb28iKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDUwMC5mKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiB9OwotICBHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgTlNTdHJpbmcgKipzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKE5TU3RyaW5nKikpOwotICBmbG9hdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGZsb2F0KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoW2tLZXlzW2ldIGlzRXF1YWw6c2VlbktleXNbal1dKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBmbG9hdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5czFbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5czJbXSA9IHsgQCJiYXIiLCBAImZvbyIsIEAibXVtYmxlIiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMVtdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMyW10gPSB7IDUwMC5mLCA1MDMuZiwgNTAyLmYgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlczNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6NTAwLmYgZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGZsb2F0IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAImJhciJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGZsb2F0IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAiYmFyIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAIm11bWJsZSJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLQotICBbZGljdCBzZXRWYWx1ZTo1MDMuZiBmb3JLZXk6QCJmb28iXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotCi0gIFtkaWN0IHNldFZhbHVlOjUwMS5mIGZvcktleTpAIm11bWJsZSJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMltdID0geyA1MDIuZiwgNTAwLmYgfTsKLSAgR1BCU3RyaW5nRmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0Zsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgZG91YmxlIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjYwMC4gZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgZG91YmxlIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhhS2V5LCBAImZvbyIpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNjAwLik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuIH07Ci0gIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIE5TU3RyaW5nICoqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihOU1N0cmluZyopKTsKLSAgZG91YmxlICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YoZG91YmxlKSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIGRvdWJsZSBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKFtrS2V5c1tpXSBpc0VxdWFsOnNlZW5LZXlzW2pdXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgZG91YmxlIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMVtdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiZm9vIiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMVtdID0geyA2MDAuLCA2MDEuLCA2MDIuIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzMltdID0geyA2MDAuLCA2MDMuLCA2MDIuIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzM1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAwLiwgNjAxLiwgNjAyLiwgNjAzLiB9OwotICBHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo2MDAuIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAxLiwgNjAyLiwgNjAzLiB9OwotICBHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIGRvdWJsZSB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAwLiwgNjAxLiwgNjAyLiwgNjAzLiB9OwotICBHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJiYXIiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJiYXIiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAibXVtYmxlIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDEuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAzLiBmb3JLZXk6QCJmb28iXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDEuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAxLiBmb3JLZXk6QCJtdW1ibGUiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDEuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlczJbXSA9IHsgNjAyLiwgNjAwLiB9OwotICBHUEJTdHJpbmdEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0RvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBTdHJpbmcgLT4gRW51bQotCi1AaW50ZXJmYWNlIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4oTlNTdHJpbmcgKmFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo3MDAgZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoYUtleSwgQCJmb28iKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIDcwMCk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiB9OwotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIE5TU3RyaW5nICoqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihOU1N0cmluZyopKTsKLSAgaW50MzJfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGludDMyX3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKFtrS2V5c1tpXSBpc0VxdWFsOnNlZW5LZXlzW2pdXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5czFbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5czJbXSA9IHsgQCJiYXIiLCBAImZvbyIsIEAibXVtYmxlIiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMxW10gPSB7IDcwMCwgNzAxLCA3MDIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyA3MDAsIDcwMywgNzAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAxLCA3MDIsIDcwMyB9OwotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEFkZHMgewotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdCA9IFtHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6NzAwIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXIiLCBAImJheiIsIEAibXVtYmxlIiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJiYXIiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAiYmFyIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAIm11bWJsZSJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NzAzIGZvcktleTpAImZvbyJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjcwMSBmb3JLZXk6QCJtdW1ibGUiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLQotICBjb25zdCBOU1N0cmluZyAqa0tleXMyW10gPSB7IEAiYmFyIiwgQCJiYXoiIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgNzAyLCA3MDAgfTsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gU3RyaW5nIC0+IEVudW0gKFVua25vd24gRW51bXMpCi0KLUBpbnRlcmZhY2UgR1BCU3RyaW5nRW51bURpY3Rpb25hcnlVbmtub3duRW51bVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCU3RyaW5nRW51bURpY3Rpb25hcnlVbmtub3duRW51bVRlc3RzCi0KLS0gKHZvaWQpdGVzdFJhd0Jhc2ljcyB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyIH07Ci0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKGRpY3QudmFsaWRhdGlvbkZ1bmMgPT0gVGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNvbgotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiByYXdWYWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIE5TU3RyaW5nICoqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZihOU1N0cmluZyopKTsKLSAgaW50MzJfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGludDMyX3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihOU1N0cmluZyAqYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKFtrS2V5c1tpXSBpc0VxdWFsOnNlZW5LZXlzW2pdXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgIFhDVEFzc2VydEVxdWFsKGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUsIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoW2tLZXlzW2ldIGlzRXF1YWw6c2VlbktleXNbal1dKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazpeKE5TU3RyaW5nICphS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5V2l0aFVua25vd25zIHsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMVtdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiZm9vIiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OyAgLy8gVW5rbm93bgotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMCwgODAzLCA3MDIgfTsgIC8vIFVua25vd24KLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weVdpdGhVbmtub3ducyB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgODAxLCA3MDIsIDgwMyB9OyAgLy8gVW5rbm93bgotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LnZhbGlkYXRpb25GdW5jLCBkaWN0Mi52YWxpZGF0aW9uRnVuYyk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QudmFsaWRhdGlvbkZ1bmMsIGRpY3QyLnZhbGlkYXRpb25GdW5jKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNvbgotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0VW5rbm93bkFkZHMgewotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2RpY3Qgc2V0VmFsdWU6ODAxIGZvcktleTpAImJhciJdLCAgLy8gVW5rbm93bgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0UmF3VmFsdWU6ODAxIGZvcktleTpAImJhciJdOyAgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzW10gPSB7IEAiZm9vIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAyLCA4MDMgfTsgIC8vIFVua25vd24KLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFVua25vd25SZW1vdmUgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OkAiYmFyIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTpAImJhciJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6QCJtdW1ibGUiXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uVW5rbm93bnMgewotICBjb25zdCBOU1N0cmluZyAqa0tleXNbXSA9IHsgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFtkaWN0IHNldFZhbHVlOjgwMyBmb3JLZXk6QCJmb28iXSwgIC8vIFVua25vd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotCi0gIFtkaWN0IHNldFJhd1ZhbHVlOjgwMyBmb3JLZXk6QCJmb28iXTsgIC8vIFVua25vd24KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICBbZGljdCBzZXRSYXdWYWx1ZTo3MDAgZm9yS2V5OkAibXVtYmxlIl07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiZm9vIiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJhciIgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXoiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAibXVtYmxlIiB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0KLSAgY29uc3QgTlNTdHJpbmcgKmtLZXlzMltdID0geyBAImJhciIsIEAiYmF6IiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMiwgODAxIH07ICAvLyBVbmtub3duCi0gIEdQQlN0cmluZ0VudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJmb28iIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImZvbyIgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmFyIiB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJiYXIiIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAImJheiIgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OkAiYmF6IiByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6QCJtdW1ibGUiIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTpAIm11bWJsZSIgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHlVbmtub3ducyB7Ci0gIGNvbnN0IE5TU3RyaW5nICprS2V5c1tdID0geyBAImZvbyIsIEAiYmFyIiwgQCJiYXoiLCBAIm11bWJsZSIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgODAxLCA3MDIsIDgwMyB9OwotICBHUEJTdHJpbmdFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlN0cmluZ0VudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LnZhbGlkYXRpb25GdW5jLCBkaWN0Mi52YWxpZGF0aW9uRnVuYyk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCU3RyaW5nRW51bURpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0vLyVQRERNLUVYUEFORC1FTkQgVEVTVFNfRk9SX1BPRF9WQUxVRVMoU3RyaW5nLCBOU1N0cmluZywgKiwgT2JqZWN0cywgQCJmb28iLCBAImJhciIsIEAiYmF6IiwgQCJtdW1ibGUiKQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkRpY3Rpb25hcnlUZXN0cytVSW50MzIubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK1VJbnQzMi5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OTlmMmFkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK1VJbnQzMi5tCisrKyAvZGV2L251bGwKQEAgLTEsMzY0NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0IDxYQ1Rlc3QvWENUZXN0Lmg+Ci0KLSNpbXBvcnQgIkdQQkRpY3Rpb25hcnkuaCIKLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UnVudGltZVByb3RvMi5wYm9iamMuaCIKLQotLy8gUHVsbCBpbiB0aGUgbWFjcm9zICh1c2luZyBhbiBleHRlcm5hbCBmaWxlIGJlY2F1c2UgZXhwYW5kaW5nIGFsbCB0ZXN0cwotLy8gaW4gYSBzaW5nbGUgZmlsZSBtYWtlcyBhIGZpbGUgdGhhdCBpcyBmYWlsaW5nIHRvIHdvcmsgd2l0aCB3aXRoaW4gWGNvZGUuCi0vLyVQRERNLUlNUE9SVC1ERUZJTkVTIEdQQkRpY3Rpb25hcnlUZXN0cy5wZGRtCi0KLS8vJVBERE0tRVhQQU5EIFRFU1RfRk9SX1BPRF9LRVkoVUludDMyLCB1aW50MzJfdCwgMVUsIDJVLCAzVSwgNFUpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLy8gVG8gbGV0IHRoZSB0ZXN0aW5nIG1hY3JvcyB3b3JrLCBhZGQgc29tZSBleHRyYSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoaW5ncy4KLUBpbnRlcmZhY2UgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKFRlc3RpbmdUd2VhaykKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDMyX3Qpa2V5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci1AZW5kCi0KLXN0YXRpYyBCT09MIFRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlKSB7Ci0gIHN3aXRjaCAodmFsdWUpIHsKLSAgICBjYXNlIDcwMDoKLSAgICBjYXNlIDcwMToKLSAgICBjYXNlIDcwMjoKLSAgICBjYXNlIDcwMzoKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOTzsKLSAgfQotfQotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDMyRW51bURpY3Rpb25hcnkgKFRlc3RpbmdUd2VhaykKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDMyX3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgdG8gY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6IG9uIHRvIGdldCB0aGUKLSAgLy8gdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDMyRW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50MzJfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XTsKLX0KLUBlbmQKLQotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gVUludDMyCi0KLUBpbnRlcmZhY2UgR1BCVUludDMyVUludDMyRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDMyVUludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCVUludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6MTAwVSBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAxMDBVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVIH07Ci0gIEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50MzJfdCkpOwotICB1aW50MzJfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzMVtdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDFVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMVtdID0geyAxMDBVLCAxMDFVLCAxMDJVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDEwMFUsIDEwM1UsIDEwMlUgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczNbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSwgMTAzVSB9OwotICBHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDMyVUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCVUludDMyVUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6MTAwVSBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDNVKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCVUludDMyVUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjJVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjJVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAzVSBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAxVSBmb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAzVSB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDJVLCAxMDBVIH07Ci0gIEdQQlVJbnQzMlVJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyVUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gSW50MzIKLQotQGludGVyZmFjZSBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMkludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjIwMCBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAyMDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiB9OwotICBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIHVpbnQzMl90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIGludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5czFbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAxVSwgNFUgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMVtdID0geyAyMDAsIDIwMSwgMjAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgMjAwLCAyMDMsIDIwMiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCVUludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjIwMCBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJVSW50MzJJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMySW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MlVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjRVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQlVJbnQzMkludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MjAzIGZvcktleToxVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjIwMSBmb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLQotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDNVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgMjAyLCAyMDAgfTsKLSAgR1BCVUludDMySW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gVUludDY0Ci0KLUBpbnRlcmZhY2UgR1BCVUludDMyVUludDY0RGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDMyVUludDY0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtbR1BCVUludDMyVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6MzAwVSBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCB1aW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAzMDBVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVIH07Ci0gIEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50MzJfdCkpOwotICB1aW50NjRfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCB1aW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzMVtdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDFVLCA0VSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzMVtdID0geyAzMDBVLCAzMDFVLCAzMDJVIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDMwMFUsIDMwM1UsIDMwMlUgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDMyVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDMyVUludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCVUludDMyVUludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6MzAwVSBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCVUludDMyVUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjJVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjJVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MzAzVSBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MzAxVSBmb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAzVSB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzMltdID0geyAzMDJVLCAzMDBVIH07Ci0gIEdQQlVJbnQzMlVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyVUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gSW50NjQKLQotQGludGVyZmFjZSBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMkludDY0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjQwMCBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgaW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA0MDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiB9OwotICBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIHVpbnQzMl90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIGludDY0X3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQ2NF90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgaW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5czFbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAxVSwgNFUgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzMVtdID0geyA0MDAsIDQwMSwgNDAyIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAwLCA0MDMsIDQwMiB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCVUludDMySW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjQwMCBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJVSW50MzJJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMySW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMySW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MlVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjRVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQlVJbnQzMkludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NDAzIGZvcktleToxVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjQwMSBmb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDNVIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAyLCA0MDAgfTsKLSAgR1BCVUludDMySW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gQm9vbAotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJCb29sRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6WUVTIGZvcktleToxVV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDFVKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIFlFUyk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8gfTsKLSAgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgdWludDMyX3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDMyX3QpKTsKLSAgQk9PTCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKEJPT0wpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzMVtdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDFVLCA0VSB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMxW10gPSB7IFlFUywgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMyW10gPSB7IFlFUywgTk8sIE5PIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJVSW50MzJCb29sRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJVSW50MzJCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCVUludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCVUludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50MzJCb29sRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJVSW50MzJCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJVSW50MzJCb29sRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTpZRVMgZm9yS2V5OjFVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgTk8sIE5PIH07Ci0gIEdQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIEJPT0wgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTywgTk8gfTsKLSAgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgQk9PTCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTo0VV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJVSW50MzJCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHNldFZhbHVlOk5PIGZvcktleToxVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHNldFZhbHVlOllFUyBmb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAzVSB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgR1BCVUludDMyQm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyQm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gRmxvYXQKLQotQGludGVyZmFjZSBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo1MDAuZiBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMVUpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNTAwLmYpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYgfTsKLSAgR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgdWludDMyX3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDMyX3QpKTsKLSAgZmxvYXQgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihmbG9hdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5czFbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAxVSwgNFUgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlczFbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMltdID0geyA1MDAuZiwgNTAzLmYsIDUwMi5mIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6NTAwLmYgZm9yS2V5OjFVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQlVJbnQzMkZsb2F0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjRVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotCi0gIFtkaWN0IHNldFZhbHVlOjUwMy5mIGZvcktleToxVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NTAxLmYgZm9yS2V5OjRVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLQotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDNVIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMyW10gPSB7IDUwMi5mLCA1MDAuZiB9OwotICBHUEJVSW50MzJGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyRmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDMyIC0+IERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGRvdWJsZSBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo2MDAuIGZvcktleToxVV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMVUpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNjAwLik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4gfTsKLSAgR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDEuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50MzJfdCkpOwotICBkb3VibGUgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihkb3VibGUpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5czFbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAxVSwgNFUgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMxW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMyW10gPSB7IDYwMC4sIDYwMy4sIDYwMi4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAwLiwgNjAxLiwgNjAyLiwgNjAzLiB9OwotICBHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6NjAwLiBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMlUsIDNVLCA0VSB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjJVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDMuKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjRVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCVUludDMyRG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAzLiBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAxLiBmb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAzVSB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlczJbXSA9IHsgNjAyLiwgNjAwLiB9OwotICBHUEJVSW50MzJEb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkRvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDMyIC0+IEVudW0KLQotQGludGVyZmFjZSBHUEJVSW50MzJFbnVtRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDMyRW51bURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjcwMCBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA3MDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiB9OwotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgdWludDMyX3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDMyX3QpKTsKLSAgaW50MzJfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGludDMyX3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzMVtdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDFVLCA0VSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMxW10gPSB7IDcwMCwgNzAxLCA3MDIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyA3MDAsIDcwMywgNzAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAxLCA3MDIsIDcwMyB9OwotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo3MDAgZm9yS2V5OjFVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleToyVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjJVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjcwMyBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLQotICBbZGljdCBzZXRWYWx1ZTo3MDEgZm9yS2V5OjRVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAzVSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMiwgNzAwIH07Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkUmF3RW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50MzIgLT4gRW51bSAoVW5rbm93biBFbnVtcykKLQotQGludGVyZmFjZSBHUEJVSW50MzJFbnVtRGljdGlvbmFyeVVua25vd25FbnVtVGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJFbnVtRGljdGlvbmFyeVVua25vd25FbnVtVGVzdHMKLQotLSAodm9pZCl0ZXN0UmF3QmFzaWNzIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OwotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShkaWN0LnZhbGlkYXRpb25GdW5jID09IFRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZSk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgcmF3VmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50MzJfdCkpOwotICBpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50MzJfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgIFhDVEFzc2VydEVxdWFsKGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUsIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Xih1aW50MzJfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5V2l0aFVua25vd25zIHsKLSAgY29uc3QgdWludDMyX3Qga0tleXMxW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzMltdID0geyAyVSwgMVUsIDRVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OyAgLy8gVW5rbm93bgotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMCwgODAzLCA3MDIgfTsgIC8vIFVua25vd24KLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weVdpdGhVbmtub3ducyB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd24KLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgODAxLCA3MDIsIDgwMyB9OyAgLy8gVW5rbm93bnMKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDMyRW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RVbmtub3duQWRkcyB7Ci0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICBbR1BCVUludDMyRW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbZGljdCBzZXRWYWx1ZTo4MDEgZm9yS2V5OjJVXSwgIC8vIFVua25vd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFJhd1ZhbHVlOjgwMSBmb3JLZXk6MlVdOyAgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDIsIDgwMyB9OyAgLy8gVW5rbm93bgotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0VW5rbm93blJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjJVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MlVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MlUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTo0VV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uVW5rbm93bnMgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiwgODAzIH07ICAvLyBVbmtub3ducwotICBHUEJVSW50MzJFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2RpY3Qgc2V0VmFsdWU6ODAzIGZvcktleToxVV0sICAvLyBVbmtub3duCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgW2RpY3Qgc2V0UmF3VmFsdWU6ODAzIGZvcktleToxVV07ICAvLyBVbmtub3duCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotCi0gIFtkaWN0IHNldFJhd1ZhbHVlOjcwMCBmb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjFVIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MlUgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjRVIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLQotICBjb25zdCB1aW50MzJfdCBrS2V5czJbXSA9IHsgMlUsIDNVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgNzAyLCA4MDEgfTsgIC8vIFVua25vd24KLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDMyRW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToxVSByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MVUgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjJVIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleToyVSB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6M1UgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjNVIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTo0VSB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6NFUgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHlVbmtub3ducyB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsKLSAgR1BCVUludDMyRW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMkVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQzMkVudW1EaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDMyIC0+IE9iamVjdAotCi1AaW50ZXJmYWNlIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtbR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjFVXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYU9iamVjdCwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OkAiYWJjIiBmb3JLZXk6MVVdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxVV0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MlVdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAxVSk7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFPYmplY3QsIEAiYWJjIik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiIH07Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxVV0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MlVdLCBAImRlZiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjNVXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleTo0VV0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50MzJfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50MzJfdCkpOwotICBOU1N0cmluZyogKnNlZW5PYmplY3RzID0gbWFsbG9jKDMgKiBzaXplb2YoTlNTdHJpbmcqKSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKHVpbnQzMl90IGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2Vlbk9iamVjdHNbaWR4XSA9IGFPYmplY3Q7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoa09iamVjdHNbaV0sIHNlZW5PYmplY3RzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2Vlbk9iamVjdHMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4odWludDMyX3QgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhT2JqZWN0KQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50MzJfdCBrS2V5czFbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAxVSwgNFUgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzMVtdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0czJbXSA9IHsgQCJhYmMiLCBAImprbCIsIEAiZ2hpIiB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHMzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QxID0KLSAgICAgIFtbR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MyA9Ci0gICAgICBbW0dQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCBvYmplY3RzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgb2JqZWN0czsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDMyX3Qga0tleXNbXSA9IHsgMVUsIDJVLCAzVSwgNFUgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPQotICAgICAgW1tHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHNbXSA9IHsgQCJhYmMiLCBAImRlZiIsIEAiZ2hpIiwgQCJqa2wiIH07Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRPYmplY3Q6QCJhYmMiIGZvcktleToxVV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImRlZiIsIEAiZ2hpIiwgQCJqa2wiIH07Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MVVdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjJVXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozVV0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6NFVdLCBAImprbCIpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQzMl90IGtLZXlzW10gPSB7IDFVLCAyVSwgM1UsIDRVIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiLCBAImprbCIgfTsKLSAgR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDMyT2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVPYmplY3RGb3JLZXk6MlVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MVVdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjJVXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6M1VdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjRVXSwgQCJqa2wiKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVPYmplY3RGb3JLZXk6MlVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MVVdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjJVXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6M1VdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjRVXSwgQCJqa2wiKTsKLQotICBbZGljdCByZW1vdmVPYmplY3RGb3JLZXk6NFVdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MVVdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjJVXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6M1VdLCBAImdoaSIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjRVXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjFVXSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MlVdKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleTozVV0pOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjRVXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50MzJfdCBrS2V5c1tdID0geyAxVSwgMlUsIDNVLCA0VSB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHNbXSA9IHsgQCJhYmMiLCBAImRlZiIsIEAiZ2hpIiwgQCJqa2wiIH07Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQzMk9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MVVdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjJVXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozVV0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6NFVdLCBAImprbCIpOwotCi0gIFtkaWN0IHNldE9iamVjdDpAImprbCIgZm9yS2V5OjFVXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjFVXSwgQCJqa2wiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyVV0sIEAiZGVmIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6M1VdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjRVXSwgQCJqa2wiKTsKLQotICBbZGljdCBzZXRPYmplY3Q6QCJkZWYiIGZvcktleTo0VV07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToxVV0sIEAiamtsIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MlVdLCBAImRlZiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjNVXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTo0VV0sIEAiZGVmIik7Ci0KLSAgY29uc3QgdWludDMyX3Qga0tleXMyW10gPSB7IDJVLCAzVSB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHMyW10gPSB7IEAiZ2hpIiwgQCJhYmMiIH07Ci0gIEdQQlVJbnQzMk9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJVSW50MzJPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjFVXSwgQCJqa2wiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleToyVV0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6M1VdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjRVXSwgQCJkZWYiKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5ELUVORCBURVNUX0ZPUl9QT0RfS0VZKFVJbnQzMiwgdWludDMyX3QsIDFVLCAyVSwgM1UsIDRVKQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQkRpY3Rpb25hcnlUZXN0cytVSW50NjQubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK1VJbnQ2NC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMjdlMTU0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzK1VJbnQ2NC5tCisrKyAvZGV2L251bGwKQEAgLTEsMzY0NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCA8Rm91bmRhdGlvbi9Gb3VuZGF0aW9uLmg+Ci0jaW1wb3J0IDxYQ1Rlc3QvWENUZXN0Lmg+Ci0KLSNpbXBvcnQgIkdQQkRpY3Rpb25hcnkuaCIKLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UnVudGltZVByb3RvMi5wYm9iamMuaCIKLQotLy8gUHVsbCBpbiB0aGUgbWFjcm9zICh1c2luZyBhbiBleHRlcm5hbCBmaWxlIGJlY2F1c2UgZXhwYW5kaW5nIGFsbCB0ZXN0cwotLy8gaW4gYSBzaW5nbGUgZmlsZSBtYWtlcyBhIGZpbGUgdGhhdCBpcyBmYWlsaW5nIHRvIHdvcmsgd2l0aCB3aXRoaW4gWGNvZGUuCi0vLyVQRERNLUlNUE9SVC1ERUZJTkVTIEdQQkRpY3Rpb25hcnlUZXN0cy5wZGRtCi0KLS8vJVBERE0tRVhQQU5EIFRFU1RfRk9SX1BPRF9LRVkoVUludDY0LCB1aW50NjRfdCwgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLy8gVG8gbGV0IHRoZSB0ZXN0aW5nIG1hY3JvcyB3b3JrLCBhZGQgc29tZSBleHRyYSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoaW5ncy4KLUBpbnRlcmZhY2UgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKFRlc3RpbmdUd2VhaykKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5OwotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQ7Ci1AZW5kCi0KLXN0YXRpYyBCT09MIFRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlKSB7Ci0gIHN3aXRjaCAodmFsdWUpIHsKLSAgICBjYXNlIDcwMDoKLSAgICBjYXNlIDcwMToKLSAgICBjYXNlIDcwMjoKLSAgICBjYXNlIDcwMzoKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOTzsKLSAgfQotfQotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDY0RW51bURpY3Rpb25hcnkgKFRlc3RpbmdUd2VhaykKLSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleToodWludDY0X3Qpa2V5IHsKLSAgLy8gQ2FzdCBpcyBuZWVkZWQgdG8gY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6IG9uIHRvIGdldCB0aGUKLSAgLy8gdHlwZSBjb3JyZWN0LgotICByZXR1cm4gW1soR1BCVUludDY0RW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6JnZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOiZrZXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotfQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCB1aW50NjRfdCBbXSlrZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6KE5TVUludGVnZXIpY291bnQgewotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczp2YWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OmNvdW50XTsKLX0KLUBlbmQKLQotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gVUludDMyCi0KLUBpbnRlcmZhY2UgR1BCVUludDY0VUludDMyRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDY0VUludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtbR1BCVUludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6MTAwVSBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAzMVVMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAxMDBVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVIH07Ci0gIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50NjRfdCkpOwotICB1aW50MzJfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgdWludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCB1aW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzMVtdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMxVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMVtdID0geyAxMDBVLCAxMDFVLCAxMDJVIH07Ci0gIGNvbnN0IHVpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDEwMFUsIDEwM1UsIDEwMlUgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlczNbXSA9IHsgMTAwVSwgMTAxVSwgMTAyVSwgMTAzVSB9OwotICBHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDY0VUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPSBbR1BCVUludDY0VUludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6MTAwVSBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDNVKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzW10gPSB7IDEwMFUsIDEwMVUsIDEwMlUsIDEwM1UgfTsKLSAgR1BCVUludDY0VUludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjMyVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwM1UpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjMyVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDEwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAxMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDMyX3Qga1ZhbHVlc1tdID0geyAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVIH07Ci0gIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRVSW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgdWludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAzVSBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MTAxVSBmb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCB1aW50MzJfdCBrVmFsdWVzMltdID0geyAxMDJVLCAxMDBVIH07Ci0gIEdQQlVJbnQ2NFVJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0VUludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMTAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gSW50MzIKLQotQGludGVyZmFjZSBHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjIwMCBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAzMVVMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAyMDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiB9OwotICBHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIHVpbnQ2NF90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIGludDMyX3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQzMl90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5czFbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzMVVMTCwgMzRVTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMVtdID0geyAyMDAsIDIwMSwgMjAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgMjAwLCAyMDMsIDIwMiB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDIwMCwgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjIwMCBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAxLCAyMDIsIDIwMyB9OwotICBHUEJVSW50NjRJbnQzMkRpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyAyMDAsIDIwMSwgMjAyLCAyMDMgfTsKLSAgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MzJVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjM0VUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgMjAwLCAyMDEsIDIwMiwgMjAzIH07Ci0gIEdQQlVJbnQ2NEludDMyRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MjAzIGZvcktleTozMVVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjIwMSBmb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAxKTsKLQotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMzVUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgMjAyLCAyMDAgfTsKLSAgR1BCVUludDY0SW50MzJEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDMyRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMjAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAyMDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDIwMSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gVUludDY0Ci0KLUBpbnRlcmZhY2UgR1BCVUludDY0VUludDY0RGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDY0VUludDY0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtbR1BCVUludDY0VUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6MzAwVSBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCB1aW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAzMVVMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCAzMDBVKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVIH07Ci0gIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50NjRfdCkpOwotICB1aW50NjRfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgdWludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCB1aW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzMVtdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMxVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzMVtdID0geyAzMDBVLCAzMDFVLCAzMDJVIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtWYWx1ZXMyW10gPSB7IDMwMFUsIDMwM1UsIDMwMlUgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlczNbXSA9IHsgMzAwVSwgMzAxVSwgMzAyVSwgMzAzVSB9OwotICBHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDY0VUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDY0VUludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPSBbR1BCVUludDY0VUludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6MzAwVSBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDFVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDNVKTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZW1vdmUgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzW10gPSB7IDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UgfTsKLSAgR1BCVUludDY0VUludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjMyVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICB1aW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwM1UpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjMyVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDMwMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCAzMDJVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga1ZhbHVlc1tdID0geyAzMDBVLCAzMDFVLCAzMDJVLCAzMDNVIH07Ci0gIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRVSW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgdWludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MzAzVSBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6MzAxVSBmb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCB1aW50NjRfdCBrVmFsdWVzMltdID0geyAzMDJVLCAzMDBVIH07Ci0gIEdQQlVJbnQ2NFVJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0VUludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAwVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgMzAxVSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gSW50NjQKLQotQGludGVyZmFjZSBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NEludDY0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlLCBzdG9wKQotICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0T25lIHsKLSAgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjQwMCBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgaW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAzMVVMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA0MDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiB9OwotICBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgX19ibG9jayBOU1VJbnRlZ2VyIGlkeCA9IDA7Ci0gIHVpbnQ2NF90ICpzZWVuS2V5cyA9IG1hbGxvYygzICogc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIGludDY0X3QgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihpbnQ2NF90KSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgaW50NjRfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLSAgICBzZWVuVmFsdWVzW2lkeF0gPSBhVmFsdWU7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2VlblZhbHVlcyk7Ci0KLSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGludDY0X3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5czFbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzMVVMTCwgMzRVTEwgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzMVtdID0geyA0MDAsIDQwMSwgNDAyIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAwLCA0MDMsIDQwMiB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXMzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QxID0KLSAgICAgIFtbR1BCVUludDY0SW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0MyA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgaW50NjRfdCBrVmFsdWVzW10gPSB7IDQwMCwgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQlVJbnQ2NEludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NEludDY0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NEludDY0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFZhbHVlOjQwMCBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAxLCA0MDIsIDQwMyB9OwotICBHUEJVSW50NjRJbnQ2NERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0SW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50NjRfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlc1tdID0geyA0MDAsIDQwMSwgNDAyLCA0MDMgfTsKLSAgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0SW50NjREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MzJVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDY0X3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjM0VUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQ2NF90IGtWYWx1ZXNbXSA9IHsgNDAwLCA0MDEsIDQwMiwgNDAzIH07Ci0gIEdQQlVJbnQ2NEludDY0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBpbnQ2NF90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NDAzIGZvcktleTozMVVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjQwMSBmb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAxKTsKLQotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMzVUxMIH07Ci0gIGNvbnN0IGludDY0X3Qga1ZhbHVlczJbXSA9IHsgNDAyLCA0MDAgfTsKLSAgR1BCVUludDY0SW50NjREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEludDY0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNDAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA0MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDQwMSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gQm9vbAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRCb29sRGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6WUVTIGZvcktleTozMVVMTF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydEVxdWFsKGFLZXksIDMxVUxMKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChhVmFsdWUsIFlFUyk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8gfTsKLSAgR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgdWludDY0X3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDY0X3QpKTsKLSAgQk9PTCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKEJPT0wpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBCT09MIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgQk9PTCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzMVtdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMxVUxMLCAzNFVMTCB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMxW10gPSB7IFlFUywgWUVTLCBOTyB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMyW10gPSB7IFlFUywgTk8sIE5PIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlczNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJVSW50NjRCb29sRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJVSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0MXByaW1lID0KLSAgICAgIFtbR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50NjRCb29sRGljdGlvbmFyeSAqZGljdDQgPQotICAgICAgW1tHUEJVSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QyID0gW2RpY3QgY29weV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBvYmplY3QgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IEJPT0wga1ZhbHVlc1tdID0geyBZRVMsIFlFUywgTk8sIE5PIH07Ci0gIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJVSW50NjRCb29sRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTpZRVMgZm9yS2V5OjMxVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgTk8sIE5PIH07Ci0gIEdQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIEJPT0wgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgQk9PTCBrVmFsdWVzW10gPSB7IFlFUywgWUVTLCBOTywgTk8gfTsKLSAgR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRCb29sRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgQk9PTCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozNFVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBCT09MIGtWYWx1ZXNbXSA9IHsgWUVTLCBZRVMsIE5PLCBOTyB9OwotICBHUEJVSW50NjRCb29sRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEJvb2xEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBCT09MIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHNldFZhbHVlOk5PIGZvcktleTozMVVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgWUVTKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBOTyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotCi0gIFtkaWN0IHNldFZhbHVlOllFUyBmb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBCT09MIGtWYWx1ZXMyW10gPSB7IE5PLCBZRVMgfTsKLSAgR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0Qm9vbERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgTk8pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIE5PKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCBZRVMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIFlFUyk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gRmxvYXQKLQotQGludGVyZmFjZSBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeVRlc3RzCi0KLS0gKHZvaWQpdGVzdEVtcHR5IHsKLSAgR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo1MDAuZiBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMzFVTEwpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNTAwLmYpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYgfTsKLSAgR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgdWludDY0X3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDY0X3QpKTsKLSAgZmxvYXQgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihmbG9hdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGZsb2F0IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgZmxvYXQgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5czFbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzMVVMTCwgMzRVTEwgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlczFbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzMltdID0geyA1MDAuZiwgNTAzLmYsIDUwMi5mIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotICBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotCi0gIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0gIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0gIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotCi0gIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgdmFsdWVzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotCi0gIC8vIDQgZXh0cmEgcGFpcjsgbm90IGVxdWFsCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDQpOwotCi0gIFtkaWN0MSByZWxlYXNlXTsKLSAgW2RpY3QxcHJpbWUgcmVsZWFzZV07Ci0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QzIHJlbGVhc2VdOwotICBbZGljdDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBmbG9hdCBrVmFsdWVzW10gPSB7IDUwMC5mLCA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXNbXSA9IHsgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYgfTsKLSAgR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBZGRzIHsKLSAgR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6NTAwLmYgZm9yS2V5OjMxVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDEuZiwgNTAyLmYsIDUwMy5mIH07Ci0gIEdQQlVJbnQ2NEZsb2F0RGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZEVudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBmbG9hdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjM0VUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMC5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgZmxvYXQga1ZhbHVlc1tdID0geyA1MDAuZiwgNTAxLmYsIDUwMi5mLCA1MDMuZiB9OwotICBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgZmxvYXQgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAwLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDIuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotCi0gIFtkaWN0IHNldFZhbHVlOjUwMy5mIGZvcktleTozMVVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDMuZik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NTAxLmYgZm9yS2V5OjM0VUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMy5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDEuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAyLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMS5mKTsKLQotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMzVUxMIH07Ci0gIGNvbnN0IGZsb2F0IGtWYWx1ZXMyW10gPSB7IDUwMi5mLCA1MDAuZiB9OwotICBHUEJVSW50NjRGbG9hdERpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0RmxvYXREaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAzLmYpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDUwMi5mKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA1MDAuZik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNTAxLmYpOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IERvdWJsZQotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGRvdWJsZSBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZTo2MDAuIGZvcktleTozMVVMTF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYUtleSwgMzFVTEwpOwotICAgIFhDVEFzc2VydEVxdWFsKGFWYWx1ZSwgNjAwLik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4gfTsKLSAgR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGRvdWJsZSB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDEuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50NjRfdCkpOwotICBkb3VibGUgKnNlZW5WYWx1ZXMgPSBtYWxsb2MoMyAqIHNpemVvZihkb3VibGUpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBkb3VibGUgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYVZhbHVlKQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5czFbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzMVVMTCwgMzRVTEwgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMxW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMyW10gPSB7IDYwMC4sIDYwMy4sIDYwMi4gfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXMzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDEgPQotICAgICAgW1tHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QzID0KLSAgICAgIFtbR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgZG91YmxlIGtWYWx1ZXNbXSA9IHsgNjAwLiwgNjAxLiwgNjAyLiwgNjAzLiB9OwotICBHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDAuLCA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLQotICBHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QgPSBbR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgW2RpY3Qgc2V0VmFsdWU6NjAwLiBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlc1tdID0geyA2MDEuLCA2MDIuLCA2MDMuIH07Ci0gIEdQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgZG91YmxlIHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjMyVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDIuKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDMuKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA2MDAuKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjM0VUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGRvdWJsZSBrVmFsdWVzW10gPSB7IDYwMC4sIDYwMS4sIDYwMi4sIDYwMy4gfTsKLSAgR1BCVUludDY0RG91YmxlRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBkb3VibGUgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAwLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAzLiBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0KLSAgW2RpY3Qgc2V0VmFsdWU6NjAxLiBmb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAzLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAyLik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNjAxLik7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBkb3VibGUga1ZhbHVlczJbXSA9IHsgNjAyLiwgNjAwLiB9OwotICBHUEJVSW50NjREb3VibGVEaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NERvdWJsZURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMy4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMi4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMC4pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDYwMS4pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IEVudW0KLQotQGludGVyZmFjZSBHUEJVSW50NjRFbnVtRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gR1BCVUludDY0RW51bURpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0gW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUsIHN0b3ApCi0gICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RPbmUgewotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9IFtHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aFZhbHVlOjcwMCBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAzMVVMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoYVZhbHVlLCA3MDApOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0QmFzaWNzIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiB9OwotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIGludDMyX3QgdmFsdWU7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLQotICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLSAgdWludDY0X3QgKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YodWludDY0X3QpKTsKLSAgaW50MzJfdCAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKGludDMyX3QpKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgQk9PTCBmb3VuZEtleSA9IE5POwotICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0gICAgICBpZiAoa0tleXNbaV0gPT0gc2VlbktleXNbal0pIHsKLSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0gICAgICAgIFhDVEFzc2VydEVxdWFsKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBmcmVlKHNlZW5LZXlzKTsKLSAgZnJlZShzZWVuVmFsdWVzKTsKLQotICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0gIGlkeCA9IDA7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRWYWx1ZXNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgaW50MzJfdCBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0gICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLSAgICArK2lkeDsKLSAgfV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzMVtdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMxVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMxW10gPSB7IDcwMCwgNzAxLCA3MDIgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzMltdID0geyA3MDAsIDcwMywgNzAyIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxKTsKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QxcHJpbWUgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlczEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Myk7Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0NCA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLQotICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLQotICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50IHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLQotICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lIHZhbHVlczsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgNzAxLCA3MDIsIDcwMyB9OwotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDEsIDcwMiwgNzAzIH07Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0gW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRWYWx1ZTo3MDAgZm9yS2V5OjMxVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotCi0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozMlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjMyVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLQotICBbZGljdCByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDcwMSwgNzAyLCA3MDMgfTsKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDMpOwotCi0gIFtkaWN0IHNldFZhbHVlOjcwMyBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAzKTsKLQotICBbZGljdCBzZXRWYWx1ZTo3MDEgZm9yS2V5OjM0VUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMiwgNzAwIH07Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbHVlczprVmFsdWVzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkUmF3RW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMyk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMSk7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBVSW50NjQgLT4gRW51bSAoVW5rbm93biBFbnVtcykKLQotQGludGVyZmFjZSBHUEJVSW50NjRFbnVtRGljdGlvbmFyeVVua25vd25FbnVtVGVzdHMgOiBYQ1Rlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50NjRFbnVtRGljdGlvbmFyeVVua25vd25FbnVtVGVzdHMKLQotLSAodm9pZCl0ZXN0UmF3QmFzaWNzIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OwotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0VHJ1ZShkaWN0LnZhbGlkYXRpb25GdW5jID09IFRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZSk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgcmF3VmFsdWU6TlVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50NjRfdCkpOwotICBpbnQzMl90ICpzZWVuVmFsdWVzID0gbWFsbG9jKDMgKiBzaXplb2YoaW50MzJfdCkpOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kVmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgaWYgKGkgPT0gMSkgewotICAgICAgICAgIFhDVEFzc2VydEVxdWFsKGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUsIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBYQ1RBc3NlcnRFcXVhbChrVmFsdWVzW2ldLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLSAgfQotICBpZHggPSAwOwotICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kUmF3VmFsdWVzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIGludDMyX3QgYVZhbHVlLCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2VlblZhbHVlc1tpZHhdID0gYVZhbHVlOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotICAgICsraWR4OwotICB9XTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyArK2kpIHsKLSAgICBCT09MIGZvdW5kS2V5ID0gTk87Ci0gICAgZm9yIChpbnQgaiA9IDA7IChqIDwgMykgJiYgIWZvdW5kS2V5OyArK2opIHsKLSAgICAgIGlmIChrS2V5c1tpXSA9PSBzZWVuS2V5c1tqXSkgewotICAgICAgICBmb3VuZEtleSA9IFlFUzsKLSAgICAgICAgWENUQXNzZXJ0RXF1YWwoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotICAgICAgfQotICAgIH0KLSAgICBYQ1RBc3NlcnRUcnVlKGZvdW5kS2V5LCBAImkgPSAlZCIsIGkpOwotICB9Ci0gIGZyZWUoc2VlbktleXMpOwotICBmcmVlKHNlZW5WYWx1ZXMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6Xih1aW50NjRfdCBhS2V5LCBpbnQzMl90IGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGFWYWx1ZSkKLSAgICBpZiAoaWR4ID09IDEpICpzdG9wID0gWUVTOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKGlkeCwgMlUpOwotICAgICsraWR4OwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEVxdWFsaXR5V2l0aFVua25vd25zIHsKLSAgY29uc3QgdWludDY0X3Qga0tleXMxW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzMltdID0geyAzMlVMTCwgMzFVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczFbXSA9IHsgNzAwLCA4MDEsIDcwMiB9OyAgLy8gVW5rbm93bgotICBjb25zdCBpbnQzMl90IGtWYWx1ZXMyW10gPSB7IDcwMCwgODAzLCA3MDIgfTsgIC8vIFVua25vd24KLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzM1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MSA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMildOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDMgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczEpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0KLSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0KLSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0KLSAgW2RpY3QxIHJlbGVhc2VdOwotICBbZGljdDFwcmltZSByZWxlYXNlXTsKLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdDMgcmVsZWFzZV07Ci0gIFtkaWN0NCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weVdpdGhVbmtub3ducyB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd24KLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0KLSAgW2RpY3QyIHJlbGVhc2VdOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgaW50MzJfdCBrVmFsdWVzW10gPSB7IDcwMCwgODAxLCA3MDIsIDgwMyB9OyAgLy8gVW5rbm93bnMKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDY0RW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RVbmtub3duQWRkcyB7Ci0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICBbR1BCVUludDY0RW51bURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbZGljdCBzZXRWYWx1ZTo4MDEgZm9yS2V5OjMyVUxMXSwgIC8vIFVua25vd24KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0gIFtkaWN0IHNldFJhd1ZhbHVlOjgwMSBmb3JLZXk6MzJVTExdOyAgLy8gVW5rbm93bgotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA3MDIsIDgwMyB9OyAgLy8gVW5rbm93bgotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0gIFtkaWN0MiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0VW5rbm93blJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsgIC8vIFVua25vd25zCi0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OjMyVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotICBpbnQzMl90IHZhbHVlOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgLy8gUmVtb3ZlIGFnYWluIGRvZXMgbm90aGluZy4KLSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6MzJVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLQotICBbZGljdCByZW1vdmVWYWx1ZUZvcktleTozNFVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotCi0gIFtkaWN0IHJlbW92ZUFsbF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRGYWxzZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uVW5rbm93bnMgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBpbnQzMl90IGtWYWx1ZXNbXSA9IHsgNzAwLCA4MDEsIDcwMiwgODAzIH07ICAvLyBVbmtub3ducwotICBHUEJVSW50NjRFbnVtRGljdGlvbmFyeSAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgaW50MzJfdCB2YWx1ZTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotCi0gIFhDVEFzc2VydFRocm93c1NwZWNpZmljTmFtZWQoW2RpY3Qgc2V0VmFsdWU6ODAzIGZvcktleTozMVVMTF0sICAvLyBVbmtub3duCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlNFeGNlcHRpb24sIE5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMCk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDIpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMyk7Ci0KLSAgW2RpY3Qgc2V0UmF3VmFsdWU6ODAzIGZvcktleTozMVVMTF07ICAvLyBVbmtub3duCi0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHJhd1ZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCByYXdWYWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDgwMSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotCi0gIFtkaWN0IHNldFJhd1ZhbHVlOjcwMCBmb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMxVUxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAzKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzJVTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDEpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozM1VMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjM0VUxMIHZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgNzAwKTsKLQotICBjb25zdCB1aW50NjRfdCBrS2V5czJbXSA9IHsgMzJVTEwsIDMzVUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlczJbXSA9IHsgNzAyLCA4MDEgfTsgIC8vIFVua25vd24KLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QyID0KLSAgICAgIFtbR1BCVUludDY0RW51bURpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0gIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMVVMTCByYXdWYWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzFVTEwgcmF3VmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA4MDMpOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMyVUxMIHZhbHVlOk5VTExdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozMlVMTCB2YWx1ZTomdmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsdWUsIDcwMik7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzNVTEwgcmF3VmFsdWU6TlVMTF0pOwotICBYQ1RBc3NlcnRUcnVlKFtkaWN0IHZhbHVlRm9yS2V5OjMzVUxMIHJhd1ZhbHVlOiZ2YWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWx1ZSwgODAxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdCB2YWx1ZUZvcktleTozNFVMTCB2YWx1ZTpOVUxMXSk7Ci0gIFhDVEFzc2VydFRydWUoW2RpY3QgdmFsdWVGb3JLZXk6MzRVTEwgdmFsdWU6JnZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbHVlLCA3MDApOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdENvcHlVbmtub3ducyB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IGludDMyX3Qga1ZhbHVlc1tdID0geyA3MDAsIDgwMSwgNzAyLCA4MDMgfTsKLSAgR1BCVUludDY0RW51bURpY3Rpb25hcnkgKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRFbnVtRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5ICpkaWN0MiA9IFtkaWN0IGNvcHldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotCi0gIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0gIFhDVEFzc2VydFRydWUoW2RpY3QyIGlzS2luZE9mQ2xhc3M6W0dQQlVJbnQ2NEVudW1EaWN0aW9uYXJ5IGNsYXNzXV0pOwotCi0gIFtkaWN0MiByZWxlYXNlXTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gVUludDY0IC0+IE9iamVjdAotCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnlUZXN0cyA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnlUZXN0cwotCi0tICh2b2lkKXRlc3RFbXB0eSB7Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMxVUxMXSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgI3ByYWdtYSB1bnVzZWQoYUtleSwgYU9iamVjdCwgc3RvcCkKLSAgICBYQ1RGYWlsKEAiU2hvdWxkbid0IGdldCBoZXJlISIpOwotICB9XTsKLSAgW2RpY3QgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdE9uZSB7Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoT2JqZWN0OkAiYWJjIiBmb3JLZXk6MzFVTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozMVVMTF0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MzJVTExdKTsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICBYQ1RBc3NlcnRFcXVhbChhS2V5LCAzMVVMTCk7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFPYmplY3QsIEAiYWJjIik7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gIH1dOwotfQotCi0tICh2b2lkKXRlc3RCYXNpY3MgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiIH07Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozMVVMTF0sIEAiYWJjIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzJVTExdLCBAImRlZiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMzVUxMXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleTozNFVMTF0pOwotCi0gIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotICB1aW50NjRfdCAqc2VlbktleXMgPSBtYWxsb2MoMyAqIHNpemVvZih1aW50NjRfdCkpOwotICBOU1N0cmluZyogKnNlZW5PYmplY3RzID0gbWFsbG9jKDMgKiBzaXplb2YoTlNTdHJpbmcqKSk7Ci0gIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRPYmplY3RzVXNpbmdCbG9jazpeKHVpbnQ2NF90IGFLZXksIE5TU3RyaW5nKiBhT2JqZWN0LCBCT09MICpzdG9wKSB7Ci0gICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAzVSk7Ci0gICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0gICAgc2Vlbk9iamVjdHNbaWR4XSA9IGFPYmplY3Q7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotICAgICAgaWYgKGtLZXlzW2ldID09IHNlZW5LZXlzW2pdKSB7Ci0gICAgICAgIGZvdW5kS2V5ID0gWUVTOwotICAgICAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoa09iamVjdHNbaV0sIHNlZW5PYmplY3RzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0gICAgICB9Ci0gICAgfQotICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0gIH0KLSAgZnJlZShzZWVuS2V5cyk7Ci0gIGZyZWUoc2Vlbk9iamVjdHMpOwotCi0gIC8vIFN0b3BwaW5nIHRoZSBlbnVtZXJhdGlvbi4KLSAgaWR4ID0gMDsKLSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4odWludDY0X3QgYUtleSwgTlNTdHJpbmcqIGFPYmplY3QsIEJPT0wgKnN0b3ApIHsKLSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhT2JqZWN0KQotICAgIGlmIChpZHggPT0gMSkgKnN0b3AgPSBZRVM7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0gICAgKytpZHg7Ci0gIH1dOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotICBjb25zdCB1aW50NjRfdCBrS2V5czFbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzMVVMTCwgMzRVTEwgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzMVtdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0czJbXSA9IHsgQCJhYmMiLCBAImprbCIsIEAiZ2hpIiB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHMzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QxID0KLSAgICAgIFtbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMxKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDFwcmltZSA9Ci0gICAgICBbW0dQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MyA9Ci0gICAgICBbW0dQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0czEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtPYmplY3RzMSldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotICBHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3Q0ID0KLSAgICAgIFtbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzMwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMzKV07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0KLSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0KLSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCBvYmplY3RzOyBub3QgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDIpOwotCi0gIC8vIDMgaXMgZGlmZmVyZW50IGtleXMsIHNhbWUgb2JqZWN0czsgbm90IGVxdWFsLgotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QzKTsKLQotICAvLyA0IGV4dHJhIHBhaXI7IG5vdCBlcXVhbAotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLQotICBbZGljdDEgcmVsZWFzZV07Ci0gIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0MyByZWxlYXNlXTsKLSAgW2RpY3Q0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5IHsKLSAgY29uc3QgdWludDY0X3Qga0tleXNbXSA9IHsgMzFVTEwsIDMyVUxMLCAzM1VMTCwgMzRVTEwgfTsKLSAgY29uc3QgTlNTdHJpbmcqIGtPYmplY3RzW10gPSB7IEAiYWJjIiwgQCJkZWYiLCBAImdoaSIsIEAiamtsIiB9OwotICBHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5PE5TU3RyaW5nKj4gKmRpY3QgPQotICAgICAgW1tHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotCi0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPSBbZGljdCBjb3B5XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLQotICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0gIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBjbGFzc11dKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHNbXSA9IHsgQCJhYmMiLCBAImRlZiIsIEAiZ2hpIiwgQCJqa2wiIH07Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0MiA9Ci0gICAgICBbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0gIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0KLSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotICBbZGljdCByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QWRkcyB7Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9IFtHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBbZGljdCBzZXRPYmplY3Q6QCJhYmMiIGZvcktleTozMVVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDFVKTsKLQotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImRlZiIsIEAiZ2hpIiwgQCJqa2wiIH07Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzFVTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMyVUxMXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozM1VMTF0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzRVTExdLCBAImprbCIpOwotICBbZGljdDIgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlbW92ZSB7Ci0gIGNvbnN0IHVpbnQ2NF90IGtLZXlzW10gPSB7IDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMIH07Ci0gIGNvbnN0IE5TU3RyaW5nKiBrT2JqZWN0c1tdID0geyBAImFiYyIsIEAiZGVmIiwgQCJnaGkiLCBAImprbCIgfTsKLSAgR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeTxOU1N0cmluZyo+ICpkaWN0ID0KLSAgICAgIFtbR1BCVUludDY0T2JqZWN0RGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhPYmplY3RzOmtPYmplY3RzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0cyldOwotICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLQotICBbZGljdCByZW1vdmVPYmplY3RGb3JLZXk6MzJVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzFVTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMyVUxMXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzNVTExdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjM0VUxMXSwgQCJqa2wiKTsKLQotICAvLyBSZW1vdmUgYWdhaW4gZG9lcyBub3RoaW5nLgotICBbZGljdCByZW1vdmVPYmplY3RGb3JLZXk6MzJVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzFVTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMyVUxMXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzNVTExdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjM0VUxMXSwgQCJqa2wiKTsKLQotICBbZGljdCByZW1vdmVPYmplY3RGb3JLZXk6MzRVTExdOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzFVTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMyVUxMXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzNVTExdLCBAImdoaSIpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjM0VUxMXSk7Ci0KLSAgW2RpY3QgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMxVUxMXSk7Ci0gIFhDVEFzc2VydE5pbChbZGljdCBvYmplY3RGb3JLZXk6MzJVTExdKTsKLSAgWENUQXNzZXJ0TmlsKFtkaWN0IG9iamVjdEZvcktleTozM1VMTF0pOwotICBYQ1RBc3NlcnROaWwoW2RpY3Qgb2JqZWN0Rm9yS2V5OjM0VUxMXSk7Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RJbnBsYWNlTXV0YXRpb24gewotICBjb25zdCB1aW50NjRfdCBrS2V5c1tdID0geyAzMVVMTCwgMzJVTEwsIDMzVUxMLCAzNFVMTCB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHNbXSA9IHsgQCJhYmMiLCBAImRlZiIsIEAiZ2hpIiwgQCJqa2wiIH07Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdCA9Ci0gICAgICBbW0dQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoT2JqZWN0czprT2JqZWN0cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa09iamVjdHMpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzFVTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMyVUxMXSwgQCJkZWYiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozM1VMTF0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzRVTExdLCBAImprbCIpOwotCi0gIFtkaWN0IHNldE9iamVjdDpAImprbCIgZm9yS2V5OjMxVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMxVUxMXSwgQCJqa2wiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozMlVMTF0sIEAiZGVmIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzNVTExdLCBAImdoaSIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjM0VUxMXSwgQCJqa2wiKTsKLQotICBbZGljdCBzZXRPYmplY3Q6QCJkZWYiIGZvcktleTozNFVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozMVVMTF0sIEAiamtsIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzJVTExdLCBAImRlZiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMzVUxMXSwgQCJnaGkiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozNFVMTF0sIEAiZGVmIik7Ci0KLSAgY29uc3QgdWludDY0X3Qga0tleXMyW10gPSB7IDMyVUxMLCAzM1VMTCB9OwotICBjb25zdCBOU1N0cmluZyoga09iamVjdHMyW10gPSB7IEAiZ2hpIiwgQCJhYmMiIH07Ci0gIEdQQlVJbnQ2NE9iamVjdERpY3Rpb25hcnk8TlNTdHJpbmcqPiAqZGljdDIgPQotICAgICAgW1tHUEJVSW50NjRPYmplY3REaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aE9iamVjdHM6a09iamVjdHMyCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrT2JqZWN0czIpXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjMxVUxMXSwgQCJqa2wiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtkaWN0IG9iamVjdEZvcktleTozMlVMTF0sIEAiZ2hpIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbZGljdCBvYmplY3RGb3JLZXk6MzNVTExdLCBAImFiYyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW2RpY3Qgb2JqZWN0Rm9yS2V5OjM0VUxMXSwgQCJkZWYiKTsKLQotICBbZGljdDIgcmVsZWFzZV07Ci0gIFtkaWN0IHJlbGVhc2VdOwotfQotCi1AZW5kCi0KLS8vJVBERE0tRVhQQU5ELUVORCBURVNUX0ZPUl9QT0RfS0VZKFVJbnQ2NCwgdWludDY0X3QsIDMxVUxMLCAzMlVMTCwgMzNVTEwsIDM0VUxMKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJEaWN0aW9uYXJ5VGVzdHMucGRkbSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCRGljdGlvbmFyeVRlc3RzLnBkZG0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA5NTEyOTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJEaWN0aW9uYXJ5VGVzdHMucGRkbQorKysgL2Rldi9udWxsCkBAIC0xLDEwNDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vJVBERE0tREVGSU5FIFRFU1RfRk9SX1BPRF9LRVkoS0VZX05BTUUsIEtFWV9UWVBFLCBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0KQotLy8lVEVTVFNfRk9SX1BPRF9WQUxVRVMoS0VZX05BTUUsIEtFWV9UWVBFLCAsICwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCkKLS8vJVRFU1RTX0ZPUl9QT0RfS0VZX09CSkVDVF9WQUxVRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQsIE9iamVjdCwgTlNTdHJpbmcqLCBAImFiYyIsIEAiZGVmIiwgQCJnaGkiLCBAImprbCIpCi0KLS8vJVBERE0tREVGSU5FIFRFU1RTX0ZPUl9QT0RfVkFMVUVTKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCkKLS8vJVRFU1RfSEVMUEVSUyhLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1ApCi0vLyVURVNUU19GT1JfUE9EX1ZBTFVFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCwgVUludDMyLCB1aW50MzJfdCwgLCAxMDBVLCAxMDFVLCAxMDJVLCAxMDNVKQotLy8lVEVTVFNfRk9SX1BPRF9WQUxVRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtTVUZGSVgsIEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQsIEludDMyLCBpbnQzMl90LCAsIDIwMCwgMjAxLCAyMDIsIDIwMykKLS8vJVRFU1RTX0ZPUl9QT0RfVkFMVUUoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLU1VGRklYLCBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0LCBVSW50NjQsIHVpbnQ2NF90LCAsIDMwMFUsIDMwMVUsIDMwMlUsIDMwM1UpCi0vLyVURVNUU19GT1JfUE9EX1ZBTFVFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCwgSW50NjQsIGludDY0X3QsICwgNDAwLCA0MDEsIDQwMiwgNDAzKQotLy8lVEVTVFNfRk9SX1BPRF9WQUxVRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtTVUZGSVgsIEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQsIEJvb2wsIEJPT0wsICwgWUVTLCBZRVMsIE5PLCBOTykKLS8vJVRFU1RTX0ZPUl9QT0RfVkFMVUUoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLU1VGRklYLCBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0LCBGbG9hdCwgZmxvYXQsICwgNTAwLmYsIDUwMS5mLCA1MDIuZiwgNTAzLmYpCi0vLyVURVNUU19GT1JfUE9EX1ZBTFVFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCwgRG91YmxlLCBkb3VibGUsICwgNjAwLiwgNjAxLiwgNjAyLiwgNjAzLikKLS8vJVRFU1RTX0ZPUl9QT0RfVkFMVUUoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLU1VGRklYLCBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0LCBFbnVtLCBpbnQzMl90LCBSYXcsIDcwMCwgNzAxLCA3MDIsIDcwMykKLS8vJVRFU1RTX0ZPUl9FTlVNX1ZBTFVFX1JBV19BRERJVElPTlMoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQLCBLU1VGRklYLCBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0KQotCi0vLyVQRERNLURFRklORSBURVNUU19GT1JfUE9EX1ZBTFVFKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgVkFDQ0VTU09SLCBWQUwxLCBWQUwyLCBWQUwzLCBWQUw0KQotLy8lVEVTVFNfQ09NTU9OKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgLCB2YWx1ZSwgUE9ELCBWQUNDRVNTT1IsIFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQpCi0KLS8vJVBERE0tREVGSU5FIFRFU1RTX0ZPUl9QT0RfS0VZX09CSkVDVF9WQUxVRShLRVlfTkFNRSwgS0VZX1RZUEUsIEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQpCi0vLyVURVNUU19DT01NT04oS0VZX05BTUUsIEtFWV9UWVBFLCAsICwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgT2JqZWN0cywgb2JqZWN0LCBPQkpFQ1QsICwgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCkKLQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9DTEFTU19ERUNMUE9EKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKQotLy8lR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeQotLy8lUERETS1ERUZJTkUgRElDVElPTkFSWV9DTEFTU19ERUNMRW51bShLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkKLS8vJUdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkKLS8vJVBERE0tREVGSU5FIERJQ1RJT05BUllfQ0xBU1NfREVDTE9CSkVDVChLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkKLS8vJUdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnk8VkFMVUVfVFlQRT4KLQotLy8lUERETS1ERUZJTkUgVEVTVFNfQ09NTU9OKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgVlNVRkZJWCwgVk5BTUUsIFZIRUxQRVIsIFZBQ0NFU1NPUiwgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCkKLS8vJSNwcmFnbWEgbWFyayAtIEtFWV9OQU1FIC0+IFZBTFVFX05BTUUKLS8vJQotLy8lQGludGVyZmFjZSBHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5VGVzdHMgOiBYQ1Rlc3RDYXNlCi0vLyVAZW5kCi0vLyUKLS8vJUBpbXBsZW1lbnRhdGlvbiBHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5VGVzdHMKLS8vJQotLy8lLSAodm9pZCl0ZXN0RW1wdHkgewotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0gW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZMSkKLS8vJSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZCMjVk5BTUUkdSMjc1VzaW5nQmxvY2s6XihLRVlfVFlQRSBLaXNQIyNhS2V5LCBWQUxVRV9UWVBFIGEjI1ZOQU1FJHUsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhIyNWTkFNRSR1LCBzdG9wKQotLy8lICAgIFhDVEZhaWwoQCJTaG91bGRuJ3QgZ2V0IGhlcmUhIik7Ci0vLyUgIH1dOwotLy8lICBbZGljdCByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0T25lIHsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9IFtHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoIyNWTkFNRSR1IyM6VkFMMSBmb3JLZXk6S0VZMV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotLy8lREVDTEFSRV9WQUxVRV9TVE9SQUdFIyNWSEVMUEVSKFZBTFVFX1RZUEUsIFZOQU1FKVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTEsIFZBTDEpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZMikKLS8vJSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZCMjVk5BTUUkdSMjc1VzaW5nQmxvY2s6XihLRVlfVFlQRSBLaXNQIyNhS2V5LCBWQUxVRV9UWVBFIGEjI1ZOQU1FJHUsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbCMjS1NVRkZJWChhS2V5LCBLRVkxKTsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbCMjVlNVRkZJWChhIyNWTkFNRSR1LCBWQUwxKTsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLS8vJSAgfV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdEJhc2ljcyB7Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzW10gPSB7IEtFWTEsIEtFWTIsIEtFWTMgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMgfTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOmtLZXlzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDNVKTsKLS8vJURFQ0xBUkVfVkFMVUVfU1RPUkFHRSMjVkhFTFBFUihWQUxVRV9UWVBFLCBWTkFNRSlURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkxLCBWQUwxKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTMsIFZBTDMpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZNCkKLS8vJQotLy8lICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLS8vJSAgS0VZX1RZUEUgS2lzUCMjKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoS0VZX1RZUEUjI0tpc1ApKTsKLS8vJSAgVkFMVUVfVFlQRSAqc2VlbiMjVk5BTUUkdSMjcyA9IG1hbGxvYygzICogc2l6ZW9mKFZBTFVFX1RZUEUpKTsKLS8vJSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZCMjVk5BTUUkdSMjc1VzaW5nQmxvY2s6XihLRVlfVFlQRSBLaXNQIyNhS2V5LCBWQUxVRV9UWVBFIGEjI1ZOQU1FJHUsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICBYQ1RBc3NlcnRMZXNzVGhhbihpZHgsIDNVKTsKLS8vJSAgICBzZWVuS2V5c1tpZHhdID0gYUtleTsKLS8vJSAgICBzZWVuIyNWTkFNRSR1IyNzW2lkeF0gPSBhIyNWTkFNRSR1IyM7Ci0vLyUgICAgWENUQXNzZXJ0Tm90RXF1YWwoc3RvcCwgTlVMTCk7Ci0vLyUgICAgKytpZHg7Ci0vLyUgIH1dOwotLy8lICBmb3IgKGludCBpID0gMDsgaSA8IDM7ICsraSkgewotLy8lICAgIEJPT0wgZm91bmRLZXkgPSBOTzsKLS8vJSAgICBmb3IgKGludCBqID0gMDsgKGogPCAzKSAmJiAhZm91bmRLZXk7ICsraikgewotLy8lICAgICAgaWYgKENPTVBBUkVfS0VZUyMjS1NVRkZJWChrS2V5c1tpXSwgc2VlbktleXNbal0pKSB7Ci0vLyUgICAgICAgIGZvdW5kS2V5ID0gWUVTOwotLy8lICAgICAgICBYQ1RBc3NlcnRFcXVhbCMjVlNVRkZJWChrIyNWTkFNRSR1IyNzW2ldLCBzZWVuIyNWTkFNRSR1IyNzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0vLyUgICAgICB9Ci0vLyUgICAgfQotLy8lICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0vLyUgIH0KLS8vJSAgZnJlZShzZWVuS2V5cyk7Ci0vLyUgIGZyZWUoc2VlbiMjVk5BTUUkdSMjcyk7Ci0vLyUKLS8vJSAgLy8gU3RvcHBpbmcgdGhlIGVudW1lcmF0aW9uLgotLy8lICBpZHggPSAwOwotLy8lICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kIyNWTkFNRSR1IyNzVXNpbmdCbG9jazpeKEtFWV9UWVBFIEtpc1AjI2FLZXksIFZBTFVFX1RZUEUgYSMjVk5BTUUkdSwgQk9PTCAqc3RvcCkgewotLy8lICAgICNwcmFnbWEgdW51c2VkKGFLZXksIGEjI1ZOQU1FJHUpCi0vLyUgICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLS8vJSAgICArK2lkeDsKLS8vJSAgfV07Ci0vLyUgIFtkaWN0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RFcXVhbGl0eSB7Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzMVtdID0geyBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0IH07Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzMltdID0geyBLRVkyLCBLRVkxLCBLRVk0IH07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUgayMjVk5BTUUkdSMjczFbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMyB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGsjI1ZOQU1FJHUjI3MyW10gPSB7IFZBTDEsIFZBTDQsIFZBTDMgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzM1tdID0geyBWQUwxLCBWQUwyLCBWQUwzLCBWQUw0IH07Ci0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QxID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6ayMjVk5BTUUkdSMjczEKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOmtLZXlzMQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6R1BCQVJSQVlTSVpFKGsjI1ZOQU1FJHUjI3MxKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QxcHJpbWUgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzMQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjczEpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QxcHJpbWUpOwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MiA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MyCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5czEKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzMildOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MyA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5czIKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzMSldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0NCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5czEKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzMyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDQpOwotLy8lCi0vLyUgIC8vIDEvMVByaW1lIHNob3VsZCBiZSBkaWZmZXJlbnQgb2JqZWN0cywgYnV0IGVxdWFsLgotLy8lICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0MSwgZGljdDFwcmltZSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDFwcmltZSk7Ci0vLyUgIC8vIEVxdWFsLCBzbyB0aGV5IG11c3QgaGF2ZSBzYW1lIGhhc2guCi0vLyUgIFhDVEFzc2VydEVxdWFsKFtkaWN0MSBoYXNoXSwgW2RpY3QxcHJpbWUgaGFzaF0pOwotLy8lCi0vLyUgIC8vIDIgaXMgc2FtZSBrZXlzLCBkaWZmZXJlbnQgIyNWTkFNRSMjczsgbm90IGVxdWFsLgotLy8lICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QyKTsKLS8vJQotLy8lICAvLyAzIGlzIGRpZmZlcmVudCBrZXlzLCBzYW1lICMjVk5BTUUjI3M7IG5vdCBlcXVhbC4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0vLyUKLS8vJSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0vLyUKLS8vJSAgW2RpY3QxIHJlbGVhc2VdOwotLy8lICBbZGljdDFwcmltZSByZWxlYXNlXTsKLS8vJSAgW2RpY3QyIHJlbGVhc2VdOwotLy8lICBbZGljdDMgcmVsZWFzZV07Ci0vLyUgIFtkaWN0NCByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0Q29weSB7Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzW10gPSB7IEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQgfTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOmtLZXlzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0vLyUKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJQotLy8lICAvLyBTaG91bGQgYmUgbmV3IG9iamVjdCBidXQgZXF1YWwuCi0vLyUgIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLS8vJSAgWENUQXNzZXJ0VHJ1ZShbZGljdDIgaXNLaW5kT2ZDbGFzczpbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBjbGFzc11dKTsKLS8vJQotLy8lICBbZGljdDIgcmVsZWFzZV07Ci0vLyUgIFtkaWN0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3REaWN0aW9uYXJ5RnJvbURpY3Rpb25hcnkgewotLy8lICBjb25zdCBLRVlfVFlQRSBLaXNQIyNrS2V5c1tdID0geyBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0IH07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUgayMjVk5BTUUkdSMjc1tdID0geyBWQUwxLCBWQUwyLCBWQUwzLCBWQUw0IH07Ci0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5cwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6R1BCQVJSQVlTSVpFKGsjI1ZOQU1FJHUjI3MpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotLy8lCi0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QyID0KLS8vJSAgICAgIFtHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoRGljdGlvbmFyeTpkaWN0XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJQotLy8lICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotLy8lICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0vLyUgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0vLyUgIFtkaWN0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RBZGRzIHsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9IFtHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGRpY3Rpb25hcnldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0vLyUKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotLy8lICBbZGljdCBzZXQjI1ZOQU1FJHUjIzpWQUwxIGZvcktleTpLRVkxXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotLy8lCi0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzW10gPSB7IEtFWTIsIEtFWTMsIEtFWTQgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzW10gPSB7IFZBTDIsIFZBTDMsIFZBTDQgfTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDIgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5cwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6R1BCQVJSQVlTSVpFKGsjI1ZOQU1FJHUjI3MpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJSAgW2RpY3QgYWRkIyNWQUNDRVNTT1IjI0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLS8vJQotLy8lREVDTEFSRV9WQUxVRV9TVE9SQUdFIyNWSEVMUEVSKFZBTFVFX1RZUEUsIFZOQU1FKVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTEsIFZBTDEpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkyLCBWQUwyKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMywgVkFMMykKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTQsIFZBTDQpCi0vLyUgIFtkaWN0MiByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGsjI1ZOQU1FJHUjI3NbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCB9OwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6ayMjVk5BTUUkdSMjcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5cwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLS8vJQotLy8lICBbZGljdCByZW1vdmUjI1ZOQU1FJHUjI0ZvcktleTpLRVkyXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgM1UpOwotLy8lREVDTEFSRV9WQUxVRV9TVE9SQUdFIyNWSEVMUEVSKFZBTFVFX1RZUEUsIFZOQU1FKVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTEsIFZBTDEpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVk0LCBWQUw0KQotLy8lCi0vLyUgIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0vLyUgIFtkaWN0IHJlbW92ZSMjVk5BTUUkdSMjRm9yS2V5OktFWTJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkxLCBWQUwxKQotLy8lVkFMVUVfTk9UX0ZPVU5EIyNWSEVMUEVSKGRpY3QsIEtFWTIpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkzLCBWQUwzKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZNCwgVkFMNCkKLS8vJQotLy8lICBbZGljdCByZW1vdmUjI1ZOQU1FJHUjI0ZvcktleTpLRVk0XTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMSwgVkFMMSkKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVkyKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMywgVkFMMykKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVk0KQotLy8lCi0vLyUgIFtkaWN0IHJlbW92ZUFsbF07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVkxKQotLy8lVkFMVUVfTk9UX0ZPVU5EIyNWSEVMUEVSKGRpY3QsIEtFWTIpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZMykKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVk0KQotLy8lICBbZGljdCByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0SW5wbGFjZU11dGF0aW9uIHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGsjI1ZOQU1FJHUjI3NbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCB9OwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6ayMjVk5BTUUkdSMjcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5cwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLS8vJURFQ0xBUkVfVkFMVUVfU1RPUkFHRSMjVkhFTFBFUihWQUxVRV9UWVBFLCBWTkFNRSlURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkxLCBWQUwxKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVk0LCBWQUw0KQotLy8lCi0vLyUgIFtkaWN0IHNldCMjVk5BTUUkdSMjOlZBTDQgZm9yS2V5OktFWTFdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkxLCBWQUw0KQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVk0LCBWQUw0KQotLy8lCi0vLyUgIFtkaWN0IHNldCMjVk5BTUUkdSMjOlZBTDIgZm9yS2V5OktFWTRdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkxLCBWQUw0KQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVk0LCBWQUwyKQotLy8lCi0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzMltdID0geyBLRVkyLCBLRVkzIH07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUgayMjVk5BTUUkdSMjczJbXSA9IHsgVkFMMywgVkFMMSB9OwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MiA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MyCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5czIKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzMildOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotLy8lICBbZGljdCBhZGQjI1ZBQ0NFU1NPUiMjRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMSwgVkFMNCkKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTIsIFZBTDMpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkzLCBWQUwxKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZNCwgVkFMMikKLS8vJQotLy8lICBbZGljdDIgcmVsZWFzZV07Ci0vLyUgIFtkaWN0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyVAZW5kCi0vLyUKLQotLy8lUERETS1ERUZJTkUgVEVTVFNfRk9SX0VOVU1fVkFMVUVfUkFXX0FERElUSU9OUyhLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtTVUZGSVgsIEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQpCi0vLyVURVNUU19GT1JfRU5VTV9WQUxVRV9SQVdfQURESVRJT05TMihLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtTVUZGSVgsIEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQsIEVudW0sIGludDMyX3QsICwgUE9ELCA3MDAsIDgwMSwgNzAyLCA4MDMpCi0vLyVQRERNLURFRklORSBURVNUU19GT1JfRU5VTV9WQUxVRV9SQVdfQURESVRJT05TMihLRVlfTkFNRSwgS0VZX1RZUEUsIEtpc1AsIEtTVUZGSVgsIEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZTVUZGSVgsIFZIRUxQRVIsIFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQpCi0vLyUjcHJhZ21hIG1hcmsgLSBLRVlfTkFNRSAtPiBWQUxVRV9OQU1FIChVbmtub3duIEVudW1zKQotLy8lCi0vLyVAaW50ZXJmYWNlIEdQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnlVbmtub3duRW51bVRlc3RzIDogWENUZXN0Q2FzZQotLy8lQGVuZAotLy8lCi0vLyVAaW1wbGVtZW50YXRpb24gR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeVVua25vd25FbnVtVGVzdHMKLS8vJQotLy8lLSAodm9pZCl0ZXN0UmF3QmFzaWNzIHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiwgS0VZMyB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGtWYWx1ZXNbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMyB9OwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5cwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0vLyUgIFhDVEFzc2VydFRydWUoZGljdC52YWxpZGF0aW9uRnVuYyA9PSBUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0vLyVERUNMQVJFX1ZBTFVFX1NUT1JBR0UjI1ZIRUxQRVIoVkFMVUVfVFlQRSwgdmFsdWUpVEVTVF9SQVdfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTEsIFZBTDEpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVkyLCBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKQotLy8lVEVTVF9SQVdfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTIsIFZBTDIpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMywgVkFMMykKLS8vJVJBV19WQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZNCkKLS8vJQotLy8lICBfX2Jsb2NrIE5TVUludGVnZXIgaWR4ID0gMDsKLS8vJSAgS0VZX1RZUEUgS2lzUCMjKnNlZW5LZXlzID0gbWFsbG9jKDMgKiBzaXplb2YoS0VZX1RZUEUjI0tpc1ApKTsKLS8vJSAgVkFMVUVfVFlQRSAqc2VlblZhbHVlcyA9IG1hbGxvYygzICogc2l6ZW9mKFZBTFVFX1RZUEUpKTsKLS8vJSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFZhbHVlc1VzaW5nQmxvY2s6XihLRVlfVFlQRSBLaXNQIyNhS2V5LCBWQUxVRV9UWVBFIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotLy8lICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotLy8lICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotLy8lICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLS8vJSAgICArK2lkeDsKLS8vJSAgfV07Ci0vLyUgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0vLyUgICAgQk9PTCBmb3VuZEtleSA9IE5POwotLy8lICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0vLyUgICAgICBpZiAoQ09NUEFSRV9LRVlTIyNLU1VGRklYKGtLZXlzW2ldLCBzZWVuS2V5c1tqXSkpIHsKLS8vJSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0vLyUgICAgICAgIGlmIChpID09IDEpIHsKLS8vJSAgICAgICAgICBYQ1RBc3NlcnRFcXVhbCMjVlNVRkZJWChrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlLCBzZWVuVmFsdWVzW2pdLCBAImkgPSAlZCwgaiA9ICVkIiwgaSwgaik7Ci0vLyUgICAgICAgIH0gZWxzZSB7Ci0vLyUgICAgICAgICAgWENUQXNzZXJ0RXF1YWwjI1ZTVUZGSVgoa1ZhbHVlc1tpXSwgc2VlblZhbHVlc1tqXSwgQCJpID0gJWQsIGogPSAlZCIsIGksIGopOwotLy8lICAgICAgICB9Ci0vLyUgICAgICB9Ci0vLyUgICAgfQotLy8lICAgIFhDVEFzc2VydFRydWUoZm91bmRLZXksIEAiaSA9ICVkIiwgaSk7Ci0vLyUgIH0KLS8vJSAgaWR4ID0gMDsKLS8vJSAgW2RpY3QgZW51bWVyYXRlS2V5c0FuZFJhd1ZhbHVlc1VzaW5nQmxvY2s6XihLRVlfVFlQRSBLaXNQIyNhS2V5LCBWQUxVRV9UWVBFIGFWYWx1ZSwgQk9PTCAqc3RvcCkgewotLy8lICAgIFhDVEFzc2VydExlc3NUaGFuKGlkeCwgM1UpOwotLy8lICAgIHNlZW5LZXlzW2lkeF0gPSBhS2V5OwotLy8lICAgIHNlZW5WYWx1ZXNbaWR4XSA9IGFWYWx1ZTsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLS8vJSAgICArK2lkeDsKLS8vJSAgfV07Ci0vLyUgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0vLyUgICAgQk9PTCBmb3VuZEtleSA9IE5POwotLy8lICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDMpICYmICFmb3VuZEtleTsgKytqKSB7Ci0vLyUgICAgICBpZiAoQ09NUEFSRV9LRVlTIyNLU1VGRklYKGtLZXlzW2ldLCBzZWVuS2V5c1tqXSkpIHsKLS8vJSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0vLyUgICAgICAgIFhDVEFzc2VydEVxdWFsIyNWU1VGRklYKGtWYWx1ZXNbaV0sIHNlZW5WYWx1ZXNbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLS8vJSAgICAgIH0KLS8vJSAgICB9Ci0vLyUgICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLS8vJSAgfQotLy8lICBmcmVlKHNlZW5LZXlzKTsKLS8vJSAgZnJlZShzZWVuVmFsdWVzKTsKLS8vJQotLy8lICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0vLyUgIGlkeCA9IDA7Ci0vLyUgIFtkaWN0IGVudW1lcmF0ZUtleXNBbmRSYXdWYWx1ZXNVc2luZ0Jsb2NrOl4oS0VZX1RZUEUgS2lzUCMjYUtleSwgVkFMVUVfVFlQRSBhVmFsdWUsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhVmFsdWUpCi0vLyUgICAgaWYgKGlkeCA9PSAxKSAqc3RvcCA9IFlFUzsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChpZHgsIDJVKTsKLS8vJSAgICArK2lkeDsKLS8vJSAgfV07Ci0vLyUgIFtkaWN0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RFcXVhbGl0eVdpdGhVbmtub3ducyB7Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzMVtdID0geyBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0IH07Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzMltdID0geyBLRVkyLCBLRVkxLCBLRVk0IH07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUga1ZhbHVlczFbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMyB9OyAgLy8gVW5rbm93bgotLy8lICBjb25zdCBWQUxVRV9UWVBFIGtWYWx1ZXMyW10gPSB7IFZBTDEsIFZBTDQsIFZBTDMgfTsgIC8vIFVua25vd24KLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrVmFsdWVzM1tdID0geyBWQUwxLCBWQUwyLCBWQUwzLCBWQUw0IH07ICAvLyBVbmtub3ducwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MSA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczEKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMxKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0MSk7Ci0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QxcHJpbWUgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czEKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDFwcmltZSk7Ci0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QyID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlczprVmFsdWVzMgotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlczIpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDMgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yS2V5czprS2V5czIKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzMSldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDMpOwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0NCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0NCk7Ci0vLyUKLS8vJSAgLy8gMS8xUHJpbWUgc2hvdWxkIGJlIGRpZmZlcmVudCBvYmplY3RzLCBidXQgZXF1YWwuCi0vLyUgIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QxLCBkaWN0MXByaW1lKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0MXByaW1lKTsKLS8vJSAgLy8gRXF1YWwsIHNvIHRoZXkgbXVzdCBoYXZlIHNhbWUgaGFzaC4KLS8vJSAgWENUQXNzZXJ0RXF1YWwoW2RpY3QxIGhhc2hdLCBbZGljdDFwcmltZSBoYXNoXSk7Ci0vLyUKLS8vJSAgLy8gMiBpcyBzYW1lIGtleXMsIGRpZmZlcmVudCB2YWx1ZXM7IG5vdCBlcXVhbC4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0vLyUKLS8vJSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSB2YWx1ZXM7IG5vdCBlcXVhbC4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Myk7Ci0vLyUKLS8vJSAgLy8gNCBleHRyYSBwYWlyOyBub3QgZXF1YWwKLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0NCk7Ci0vLyUKLS8vJSAgW2RpY3QxIHJlbGVhc2VdOwotLy8lICBbZGljdDFwcmltZSByZWxlYXNlXTsKLS8vJSAgW2RpY3QyIHJlbGVhc2VdOwotLy8lICBbZGljdDMgcmVsZWFzZV07Ci0vLyUgIFtkaWN0NCByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0Q29weVdpdGhVbmtub3ducyB7Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzW10gPSB7IEtFWTEsIEtFWTIsIEtFWTMsIEtFWTQgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrVmFsdWVzW10gPSB7IFZBTDEsIFZBTDIsIFZBTDMsIFZBTDQgfTsgIC8vIFVua25vd24KLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJQotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MiA9IFtkaWN0IGNvcHldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotLy8lCi0vLyUgIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0vLyUgIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC52YWxpZGF0aW9uRnVuYywgZGljdDIudmFsaWRhdGlvbkZ1bmMpOyAgLy8gUG9pbnRlciBjb21wYXJpc29uCi0vLyUgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0vLyUKLS8vJSAgW2RpY3QyIHJlbGVhc2VdOwotLy8lICBbZGljdCByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0RGljdGlvbmFyeUZyb21EaWN0aW9uYXJ5IHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGtWYWx1ZXNbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCB9OyAgLy8gVW5rbm93bnMKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJQotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MiA9Ci0vLyUgICAgICBbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aERpY3Rpb25hcnk6ZGljdF07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0vLyUKLS8vJSAgLy8gU2hvdWxkIGJlIG5ldyBwb2ludGVyLCBidXQgZXF1YWwgb2JqZWN0cy4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotLy8lICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LnZhbGlkYXRpb25GdW5jLCBkaWN0Mi52YWxpZGF0aW9uRnVuYyk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLS8vJSAgW2RpY3QgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdFVua25vd25BZGRzIHsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdGluZ0VudW1fSXNWYWxpZFZhbHVlXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotLy8lCi0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDBVKTsKLS8vJSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChbZGljdCBzZXRWYWx1ZTpWQUwyIGZvcktleTpLRVkyXSwgIC8vIFVua25vd24KLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0V4Y2VwdGlvbiwgTlNJbnZhbGlkQXJndW1lbnRFeGNlcHRpb24pOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0vLyUgIFtkaWN0IHNldFJhd1ZhbHVlOlZBTDIgZm9yS2V5OktFWTJdOyAgLy8gVW5rbm93bgotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0vLyUKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMywgS0VZNCB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGtWYWx1ZXNbXSA9IHsgVkFMMSwgVkFMMywgVkFMNCB9OyAgLy8gVW5rbm93bgotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MiA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsdWVzOmtWYWx1ZXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotLy8lICBbZGljdCBhZGRSYXdFbnRyaWVzRnJvbURpY3Rpb25hcnk6ZGljdDJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCA0VSk7Ci0vLyUKLS8vJURFQ0xBUkVfVkFMVUVfU1RPUkFHRSMjVkhFTFBFUihWQUxVRV9UWVBFLCB2YWx1ZSlURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVkxLCBWQUwxKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMiwga0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSkKLS8vJVRFU1RfUkFXX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVkyLCBWQUwyKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMywgVkFMMykKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTQsIGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZNCwgVkFMNCkKLS8vJSAgW2RpY3QyIHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RVbmtub3duUmVtb3ZlIHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGtWYWx1ZXNbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCB9OyAgLy8gVW5rbm93bnMKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotLy8lCi0vLyUgIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OktFWTJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0vLyVERUNMQVJFX1ZBTFVFX1NUT1JBR0UjI1ZIRUxQRVIoVkFMVUVfVFlQRSwgdmFsdWUpVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMSwgVkFMMSkKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVkyKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMywgVkFMMykKLS8vJVRFU1RfUkFXX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVk0LCBWQUw0KQotLy8lCi0vLyUgIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0vLyUgIFtkaWN0IHJlbW92ZVZhbHVlRm9yS2V5OktFWTJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAzVSk7Ci0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVkxLCBWQUwxKQotLy8lVkFMVUVfTk9UX0ZPVU5EIyNWSEVMUEVSKGRpY3QsIEtFWTIpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVkzLCBWQUwzKQotLy8lVEVTVF9SQVdfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTQsIFZBTDQpCi0vLyUKLS8vJSAgW2RpY3QgcmVtb3ZlVmFsdWVGb3JLZXk6S0VZNF07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTEsIFZBTDEpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTMsIFZBTDMpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZNCkKLS8vJQotLy8lICBbZGljdCByZW1vdmVBbGxdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZMSkKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVkyKQotLy8lVkFMVUVfTk9UX0ZPVU5EIyNWSEVMUEVSKGRpY3QsIEtFWTMpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZNCkKLS8vJSAgW2RpY3QgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvblVua25vd25zIHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiwgS0VZMywgS0VZNCB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGtWYWx1ZXNbXSA9IHsgVkFMMSwgVkFMMiwgVkFMMywgVkFMNCB9OyAgLy8gVW5rbm93bnMKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a0tleXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OkdQQkFSUkFZU0laRShrVmFsdWVzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotLy8lREVDTEFSRV9WQUxVRV9TVE9SQUdFIyNWSEVMUEVSKFZBTFVFX1RZUEUsIHZhbHVlKVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTEsIFZBTDEpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZNCwgVkFMNCkKLS8vJQotLy8lICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKFtkaWN0IHNldFZhbHVlOlZBTDQgZm9yS2V5OktFWTFdLCAgLy8gVW5rbm93bgotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TRXhjZXB0aW9uLCBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTEsIFZBTDEpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZNCwgVkFMNCkKLS8vJQotLy8lICBbZGljdCBzZXRSYXdWYWx1ZTpWQUw0IGZvcktleTpLRVkxXTsgIC8vIFVua25vd24KLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotLy8lVEVTVF9SQVdfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTEsIFZBTDQpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZNCwgVkFMNCkKLS8vJQotLy8lICBbZGljdCBzZXRSYXdWYWx1ZTpWQUwxIGZvcktleTpLRVk0XTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgNFUpOwotLy8lVEVTVF9SQVdfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTEsIFZBTDQpCi0vLyVURVNUX1JBV19WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMiwgVkFMMikKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgdmFsdWUsIEtFWTMsIFZBTDMpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVk0LCBWQUwxKQotLy8lCi0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzMltdID0geyBLRVkyLCBLRVkzIH07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUga1ZhbHVlczJbXSA9IHsgVkFMMywgVkFMMiB9OyAgLy8gVW5rbm93bgotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MiA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlRlc3RpbmdFbnVtX0lzVmFsaWRWYWx1ZQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZXM6a1ZhbHVlczIKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzMgotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6R1BCQVJSQVlTSVpFKGtWYWx1ZXMyKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0Mik7Ci0vLyUgIFtkaWN0IGFkZFJhd0VudHJpZXNGcm9tRGljdGlvbmFyeTpkaWN0Ml07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDRVKTsKLS8vJVRFU1RfUkFXX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVkxLCBWQUw0KQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZMiwgVkFMMykKLS8vJVRFU1RfUkFXX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIHZhbHVlLCBLRVkzLCBWQUwyKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCB2YWx1ZSwgS0VZNCwgVkFMMSkKLS8vJQotLy8lICBbZGljdDIgcmVsZWFzZV07Ci0vLyUgIFtkaWN0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RDb3B5VW5rbm93bnMgewotLy8lICBjb25zdCBLRVlfVFlQRSBLaXNQIyNrS2V5c1tdID0geyBLRVkxLCBLRVkyLCBLRVkzLCBLRVk0IH07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUga1ZhbHVlc1tdID0geyBWQUwxLCBWQUwyLCBWQUwzLCBWQUw0IH07Ci0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOmtWYWx1ZXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOmtLZXlzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDpHUEJBUlJBWVNJWkUoa1ZhbHVlcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0vLyUKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDIgPSBbZGljdCBjb3B5XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJQotLy8lICAvLyBTaG91bGQgYmUgbmV3IHBvaW50ZXIsIGJ1dCBlcXVhbCBvYmplY3RzLgotLy8lICBYQ1RBc3NlcnROb3RFcXVhbChkaWN0LCBkaWN0Mik7Ci0vLyUgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkaWN0LCBkaWN0Mik7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QudmFsaWRhdGlvbkZ1bmMsIGRpY3QyLnZhbGlkYXRpb25GdW5jKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNvbgotLy8lICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGNsYXNzXV0pOwotLy8lCi0vLyUgIFtkaWN0MiByZWxlYXNlXTsKLS8vJSAgW2RpY3QgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJUBlbmQKLS8vJQotCi0vLwotLy8gSGVscGVycyBmb3IgUE9EcwotLy8KLQotLy8lUERETS1ERUZJTkUgREVDTEFSRV9WQUxVRV9TVE9SQUdFUE9EKFZBTFVFX1RZUEUsIE5BTUUpCi0vLyUgIFZBTFVFX1RZUEUgTkFNRTsKLS8vJQotLy8lUERETS1ERUZJTkUgVkFMVUVfTk9UX0ZPVU5EUE9EKERJQ1QsIEtFWSkKLS8vJSAgWENUQXNzZXJ0RmFsc2UoW0RJQ1QgdmFsdWVGb3JLZXk6S0VZIHZhbHVlOk5VTExdKTsKLS8vJVBERE0tREVGSU5FIFRFU1RfVkFMVUVQT0QoRElDVCwgU1RPUkFHRSwgS0VZLCBWQUxVRSkKLS8vJSAgWENUQXNzZXJ0VHJ1ZShbRElDVCB2YWx1ZUZvcktleTpLRVkgdmFsdWU6TlVMTF0pOwotLy8lICBYQ1RBc3NlcnRUcnVlKFtESUNUIHZhbHVlRm9yS2V5OktFWSB2YWx1ZTomU1RPUkFHRV0pOwotLy8lICBYQ1RBc3NlcnRFcXVhbChTVE9SQUdFLCBWQUxVRSk7Ci0vLyVQRERNLURFRklORSBDT01QQVJFX0tFWVMoS0VZMSwgS0VZMikKLS8vJUtFWTEgPT0gS0VZMgotLy8lUERETS1ERUZJTkUgUkFXX1ZBTFVFX05PVF9GT1VORFBPRChESUNULCBLRVkpCi0vLyUgIFhDVEFzc2VydEZhbHNlKFtESUNUIHZhbHVlRm9yS2V5OktFWSByYXdWYWx1ZTpOVUxMXSk7Ci0vLyVQRERNLURFRklORSBURVNUX1JBV19WQUxVRVBPRChESUNULCBTVE9SQUdFLCBLRVksIFZBTFVFKQotLy8lICBYQ1RBc3NlcnRUcnVlKFtESUNUIHZhbHVlRm9yS2V5OktFWSByYXdWYWx1ZTpOVUxMXSk7Ci0vLyUgIFhDVEFzc2VydFRydWUoW0RJQ1QgdmFsdWVGb3JLZXk6S0VZIHJhd1ZhbHVlOiZTVE9SQUdFXSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKFNUT1JBR0UsIFZBTFVFKTsKLQotLy8KLS8vIEhlbHBlcnMgZm9yIE9iamVjdHMKLS8vCi0KLS8vJVBERE0tREVGSU5FIERFQ0xBUkVfVkFMVUVfU1RPUkFHRU9CSkVDVChWQUxVRV9UWVBFLCBOQU1FKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIFZBTFVFX05PVF9GT1VORE9CSkVDVChESUNULCBLRVkpCi0vLyUgIFhDVEFzc2VydE5pbChbRElDVCBvYmplY3RGb3JLZXk6S0VZXSk7Ci0vLyVQRERNLURFRklORSBURVNUX1ZBTFVFT0JKRUNUKERJQ1QsIFNUT1JBR0UsIEtFWSwgVkFMVUUpCi0vLyUgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbRElDVCBvYmplY3RGb3JLZXk6S0VZXSwgVkFMVUUpOwotLy8lUERETS1ERUZJTkUgQ09NUEFSRV9LRVlTT2JqZWN0cyhLRVkxLCBLRVkyKQotLy8lW0tFWTEgaXNFcXVhbDpLRVkyXQotCi0vLwotLy8gSGVscGVycyBmb3IgdGVzdHMuCi0vLwotCi0vLyVQRERNLURFRklORSBURVNUX0hFTFBFUlMoS0VZX05BTUUsIEtFWV9UWVBFLCBLaXNQKQotLy8lLy8gVG8gbGV0IHRoZSB0ZXN0aW5nIG1hY3JvcyB3b3JrLCBhZGQgc29tZSBleHRyYSBtZXRob2RzIHRvIHNpbXBsaWZ5IHRoaW5ncy4KLS8vJUBpbnRlcmZhY2UgR1BCIyNLRVlfTkFNRSMjRW51bURpY3Rpb25hcnkgKFRlc3RpbmdUd2VhaykKLS8vJSsgKGluc3RhbmNldHlwZSlkaWN0aW9uYXJ5V2l0aFZhbHVlOihpbnQzMl90KXZhbHVlIGZvcktleTooS0VZX1RZUEUjI0tpc1AkUyMjS2lzUClrZXk7Ci0vLyUtIChpbnN0YW5jZXR5cGUpaW5pdFdpdGhWYWx1ZXM6KGNvbnN0IGludDMyX3QgW10pdmFsdWVzCi0vLyUgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6KGNvbnN0IEtFWV9UWVBFIyNLaXNQJFMjI0tpc1AgW10pa2V5cwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50OihOU1VJbnRlZ2VyKWNvdW50OwotLy8lQGVuZAotLy8lCi0vLyVzdGF0aWMgQk9PTCBUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSkgewotLy8lICBzd2l0Y2ggKHZhbHVlKSB7Ci0vLyUgICAgY2FzZSA3MDA6Ci0vLyUgICAgY2FzZSA3MDE6Ci0vLyUgICAgY2FzZSA3MDI6Ci0vLyUgICAgY2FzZSA3MDM6Ci0vLyUgICAgICByZXR1cm4gWUVTOwotLy8lICAgIGRlZmF1bHQ6Ci0vLyUgICAgICByZXR1cm4gTk87Ci0vLyUgIH0KLS8vJX0KLS8vJQotLy8lQGltcGxlbWVudGF0aW9uIEdQQiMjS0VZX05BTUUjI0VudW1EaWN0aW9uYXJ5IChUZXN0aW5nVHdlYWspCi0vLyUrIChpbnN0YW5jZXR5cGUpZGljdGlvbmFyeVdpdGhWYWx1ZTooaW50MzJfdCl2YWx1ZSBmb3JLZXk6KEtFWV9UWVBFIyNLaXNQJFMjI0tpc1Apa2V5IHsKLS8vJSAgLy8gQ2FzdCBpcyBuZWVkZWQgdG8gY29tcGlsZXIga25vd3Mgd2hhdCBjbGFzcyB3ZSBhcmUgaW52b2tpbmcgaW5pdFdpdGhWYWx1ZXM6IG9uIHRvIGdldCB0aGUKLS8vJSAgLy8gdHlwZSBjb3JyZWN0LgotLy8lICByZXR1cm4gW1soR1BCIyNLRVlfTkFNRSMjRW51bURpY3Rpb25hcnkqKVtzZWxmIGFsbG9jXSBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLS8vJSAgICAgICAgICAgICAgICBLRVlfTkFNRSRTICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOiZ2YWx1ZQotLy8lICAgICAgICAgICAgICAgIEtFWV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6JmtleQotLy8lICAgICAgICAgICAgICAgIEtFWV9OQU1FJFMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6MV0gYXV0b3JlbGVhc2VdOwotLy8lfQotLy8lLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVmFsdWVzOihjb25zdCBpbnQzMl90IFtdKXZhbHVlcwotLy8lICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXlzOihjb25zdCBLRVlfVFlQRSMjS2lzUCRTIyNLaXNQIFtdKWtleXMKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDooTlNVSW50ZWdlciljb3VudCB7Ci0vLyUgIHJldHVybiBbc2VsZiBpbml0V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpUZXN0aW5nRW51bV9Jc1ZhbGlkVmFsdWUKLS8vJSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWVzOnZhbHVlcwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleXM6a2V5cwotLy8lICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY291bnQ6Y291bnRdOwotLy8lfQotLy8lQGVuZAotLy8lCi0vLyUKLQotCi0vLwotLy8gQk9PTCB0ZXN0IG1hY3JvcwotLy8KLS8vVE9ETyh0aG9tYXN2bCk6IGVudW0gdGVzdHMKLQotLy8lUERETS1ERUZJTkUgQk9PTF9URVNUU19GT1JfUE9EX1ZBTFVFKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZBTDEsIFZBTDIpCi0vLyVCT09MX1RFU1RTX0NPTU1PTihCb29sLCBCT09MLCAsICwgWUVTLCBOTywgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgLCB2YWx1ZSwgUE9ELCBWQUwxLCBWQUwyKQotCi0vLyVQRERNLURFRklORSBURVNUU19GT1JfQk9PTF9LRVlfT0JKRUNUX1ZBTFVFKFZBTFVFX05BTUUsIFZBTFVFX1RZUEUsIFZBTDEsIFZBTDIpCi0vLyVCT09MX1RFU1RTX0NPTU1PTihCb29sLCBCT09MLCAsICwgWUVTLCBOTywgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgT2JqZWN0cywgb2JqZWN0LCBPQkpFQ1QsIFZBTDEsIFZBTDIpCi0KLS8vJVBERE0tREVGSU5FIEJPT0xfVEVTVFNfQ09NTU9OKEtFWV9OQU1FLCBLRVlfVFlQRSwgS2lzUCwgS1NVRkZJWCwgS0VZMSwgS0VZMiwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSwgVlNVRkZJWCwgVk5BTUUsIFZIRUxQRVIsIFZBTDEsIFZBTDIpCi0vLyUjcHJhZ21hIG1hcmsgLSBLRVlfTkFNRSAtPiBWQUxVRV9OQU1FCi0vLyUKLS8vJUBpbnRlcmZhY2UgR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeVRlc3RzIDogWENUZXN0Q2FzZQotLy8lQGVuZAotLy8lCi0vLyVAaW1wbGVtZW50YXRpb24gR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeVRlc3RzCi0vLyUKLS8vJS0gKHZvaWQpdGVzdEVtcHR5IHsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9IFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdF07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotLy8lVkFMVUVfTk9UX0ZPVU5EIyNWSEVMUEVSKGRpY3QsIEtFWTEpCi0vLyUgIFtkaWN0IGVudW1lcmF0ZUtleXNBbmQjI1ZOQU1FJHUjI3NVc2luZ0Jsb2NrOl4oS0VZX1RZUEUgS2lzUCMjYUtleSwgVkFMVUVfVFlQRSBhIyNWTkFNRSR1IyMsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhIyNWTkFNRSR1IyMsIHN0b3ApCi0vLyUgICAgWENURmFpbChAIlNob3VsZG4ndCBnZXQgaGVyZSEiKTsKLS8vJSAgfV07Ci0vLyUgIFtkaWN0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RPbmUgewotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0gW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGgjI1ZOQU1FJHUjIzpWQUwxIGZvcktleTpLRVkxXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0vLyVERUNMQVJFX1ZBTFVFX1NUT1JBR0UjI1ZIRUxQRVIoVkFMVUVfVFlQRSwgVk5BTUUpVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMSwgVkFMMSkKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVkyKQotLy8lICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kIyNWTkFNRSR1IyNzVXNpbmdCbG9jazpeKEtFWV9UWVBFIEtpc1AjI2FLZXksIFZBTFVFX1RZUEUgYSMjVk5BTUUkdSwgQk9PTCAqc3RvcCkgewotLy8lICAgIFhDVEFzc2VydEVxdWFsIyNLU1VGRklYKGFLZXksIEtFWTEpOwotLy8lICAgIFhDVEFzc2VydEVxdWFsIyNWU1VGRklYKGEjI1ZOQU1FJHUsIFZBTDEpOwotLy8lICAgIFhDVEFzc2VydE5vdEVxdWFsKHN0b3AsIE5VTEwpOwotLy8lICB9XTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0QmFzaWNzIHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGsjI1ZOQU1FJHUjI3NbXSA9IHsgVkFMMSwgVkFMMiB9OwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6ayMjVk5BTUUkdSMjcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotLy8lREVDTEFSRV9WQUxVRV9TVE9SQUdFIyNWSEVMUEVSKFZBTFVFX1RZUEUsIFZOQU1FKVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTEsIFZBTDEpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkyLCBWQUwyKQotLy8lCi0vLyUgIF9fYmxvY2sgTlNVSW50ZWdlciBpZHggPSAwOwotLy8lICBLRVlfVFlQRSBLaXNQIyMqc2VlbktleXMgPSBtYWxsb2MoMiAqIHNpemVvZihLRVlfVFlQRSMjS2lzUCkpOwotLy8lICBWQUxVRV9UWVBFICpzZWVuIyNWTkFNRSR1IyNzID0gbWFsbG9jKDIgKiBzaXplb2YoVkFMVUVfVFlQRSkpOwotLy8lICBbZGljdCBlbnVtZXJhdGVLZXlzQW5kIyNWTkFNRSR1IyNzVXNpbmdCbG9jazpeKEtFWV9UWVBFIEtpc1AjI2FLZXksIFZBTFVFX1RZUEUgYSMjVk5BTUUkdSMjLCBCT09MICpzdG9wKSB7Ci0vLyUgICAgWENUQXNzZXJ0TGVzc1RoYW4oaWR4LCAyVSk7Ci0vLyUgICAgc2VlbktleXNbaWR4XSA9IGFLZXk7Ci0vLyUgICAgc2VlbiMjVk5BTUUkdSMjc1tpZHhdID0gYSMjVk5BTUUkdTsKLS8vJSAgICBYQ1RBc3NlcnROb3RFcXVhbChzdG9wLCBOVUxMKTsKLS8vJSAgICArK2lkeDsKLS8vJSAgfV07Ci0vLyUgIGZvciAoaW50IGkgPSAwOyBpIDwgMjsgKytpKSB7Ci0vLyUgICAgQk9PTCBmb3VuZEtleSA9IE5POwotLy8lICAgIGZvciAoaW50IGogPSAwOyAoaiA8IDIpICYmICFmb3VuZEtleTsgKytqKSB7Ci0vLyUgICAgICBpZiAoQ09NUEFSRV9LRVlTIyNLU1VGRklYKGtLZXlzW2ldLCBzZWVuS2V5c1tqXSkpIHsKLS8vJSAgICAgICAgZm91bmRLZXkgPSBZRVM7Ci0vLyUgICAgICAgIFhDVEFzc2VydEVxdWFsIyNWU1VGRklYKGsjI1ZOQU1FJHUjI3NbaV0sIHNlZW4jI1ZOQU1FJHUjI3Nbal0sIEAiaSA9ICVkLCBqID0gJWQiLCBpLCBqKTsKLS8vJSAgICAgIH0KLS8vJSAgICB9Ci0vLyUgICAgWENUQXNzZXJ0VHJ1ZShmb3VuZEtleSwgQCJpID0gJWQiLCBpKTsKLS8vJSAgfQotLy8lICBmcmVlKHNlZW5LZXlzKTsKLS8vJSAgZnJlZShzZWVuIyNWTkFNRSR1IyNzKTsKLS8vJQotLy8lICAvLyBTdG9wcGluZyB0aGUgZW51bWVyYXRpb24uCi0vLyUgIGlkeCA9IDA7Ci0vLyUgIFtkaWN0IGVudW1lcmF0ZUtleXNBbmQjI1ZOQU1FJHUjI3NVc2luZ0Jsb2NrOl4oS0VZX1RZUEUgS2lzUCMjYUtleSwgVkFMVUVfVFlQRSBhIyNWTkFNRSR1IyMsIEJPT0wgKnN0b3ApIHsKLS8vJSAgICAjcHJhZ21hIHVudXNlZChhS2V5LCBhIyNWTkFNRSR1KQotLy8lICAgIGlmIChpZHggPT0gMCkgKnN0b3AgPSBZRVM7Ci0vLyUgICAgWENUQXNzZXJ0Tm90RXF1YWwoaWR4LCAyVSk7Ci0vLyUgICAgKytpZHg7Ci0vLyUgIH1dOwotLy8lICBbZGljdCByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0RXF1YWxpdHkgewotLy8lICBjb25zdCBLRVlfVFlQRSBLaXNQIyNrS2V5czFbXSA9IHsgS0VZMSwgS0VZMiB9OwotLy8lICBjb25zdCBLRVlfVFlQRSBLaXNQIyNrS2V5czJbXSA9IHsgS0VZMiwgS0VZMSB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGsjI1ZOQU1FJHUjI3MxW10gPSB7IFZBTDEsIFZBTDIgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzMltdID0geyBWQUwyLCBWQUwxIH07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUgayMjVk5BTUUkdSMjczNbXSA9IHsgVkFMMiB9OwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MSA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5czEKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzMSldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDEpOwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MXByaW1lID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6ayMjVk5BTUUkdSMjczEKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOmtLZXlzMQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6R1BCQVJSQVlTSVpFKGsjI1ZOQU1FJHUjI3MxKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0MXByaW1lKTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDIgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzMgotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjczIpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDMgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzMQotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMyCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjczEpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QzKTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDQgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzMwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMxCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjczMpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3Q0KTsKLS8vJQotLy8lICAvLyAxLzFQcmltZSBzaG91bGQgYmUgZGlmZmVyZW50IG9iamVjdHMsIGJ1dCBlcXVhbC4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdDEsIGRpY3QxcHJpbWUpOwotLy8lICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdDEsIGRpY3QxcHJpbWUpOwotLy8lICAvLyBFcXVhbCwgc28gdGhleSBtdXN0IGhhdmUgc2FtZSBoYXNoLgotLy8lICBYQ1RBc3NlcnRFcXVhbChbZGljdDEgaGFzaF0sIFtkaWN0MXByaW1lIGhhc2hdKTsKLS8vJQotLy8lICAvLyAyIGlzIHNhbWUga2V5cywgZGlmZmVyZW50ICMjVk5BTUUjI3M7IG5vdCBlcXVhbC4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKGRpY3QxLCBkaWN0Mik7Ci0vLyUKLS8vJSAgLy8gMyBpcyBkaWZmZXJlbnQga2V5cywgc2FtZSAjI1ZOQU1FIyNzOyBub3QgZXF1YWwuCi0vLyUgIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhkaWN0MSwgZGljdDMpOwotLy8lCi0vLyUgIC8vIDQgRmV3ZXIgcGFpcnM7IG5vdCBlcXVhbAotLy8lICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMoZGljdDEsIGRpY3Q0KTsKLS8vJQotLy8lICBbZGljdDEgcmVsZWFzZV07Ci0vLyUgIFtkaWN0MXByaW1lIHJlbGVhc2VdOwotLy8lICBbZGljdDIgcmVsZWFzZV07Ci0vLyUgIFtkaWN0MyByZWxlYXNlXTsKLS8vJSAgW2RpY3Q0IHJlbGVhc2VdOwotLy8lfQotLy8lCi0vLyUtICh2b2lkKXRlc3RDb3B5IHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMiB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGsjI1ZOQU1FJHUjI3NbXSA9IHsgVkFMMSwgVkFMMiB9OwotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0KLS8vJSAgICAgIFtbR1BCIyNLRVlfTkFNRSMjVkFMVUVfTkFNRSMjRGljdGlvbmFyeSBhbGxvY10gaW5pdFdpdGgjI1ZOQU1FJHUjI3M6ayMjVk5BTUUkdSMjcwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJQotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0MiA9IFtkaWN0IGNvcHldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotLy8lCi0vLyUgIC8vIFNob3VsZCBiZSBuZXcgb2JqZWN0IGJ1dCBlcXVhbC4KLS8vJSAgWENUQXNzZXJ0Tm90RXF1YWwoZGljdCwgZGljdDIpOwotLy8lICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGljdCwgZGljdDIpOwotLy8lICBYQ1RBc3NlcnRUcnVlKFtkaWN0MiBpc0tpbmRPZkNsYXNzOltHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGNsYXNzXV0pOwotLy8lCi0vLyUgIFtkaWN0MiByZWxlYXNlXTsKLS8vJSAgW2RpY3QgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdERpY3Rpb25hcnlGcm9tRGljdGlvbmFyeSB7Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzW10gPSB7IEtFWTEsIEtFWTIgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzW10gPSB7IFZBTDEsIFZBTDIgfTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOmtLZXlzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjcyldOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdCk7Ci0vLyUKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDIgPQotLy8lICAgICAgW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhEaWN0aW9uYXJ5OmRpY3RdOwotLy8lICBYQ1RBc3NlcnROb3ROaWwoZGljdDIpOwotLy8lCi0vLyUgIC8vIFNob3VsZCBiZSBuZXcgcG9pbnRlciwgYnV0IGVxdWFsIG9iamVjdHMuCi0vLyUgIFhDVEFzc2VydE5vdEVxdWFsKGRpY3QsIGRpY3QyKTsKLS8vJSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRpY3QsIGRpY3QyKTsKLS8vJSAgW2RpY3QgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdEFkZHMgewotLy8lICBESUNUSU9OQVJZX0NMQVNTX0RFQ0wjI1ZIRUxQRVIoS0VZX05BTUUsIFZBTFVFX05BTUUsIFZBTFVFX1RZUEUpICpkaWN0ID0gW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgZGljdGlvbmFyeV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJQotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAwVSk7Ci0vLyUgIFtkaWN0IHNldCMjVk5BTUUkdTpWQUwxIGZvcktleTpLRVkxXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMVUpOwotLy8lCi0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzW10gPSB7IEtFWTIgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzW10gPSB7IFZBTDIgfTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDIgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgZm9yS2V5czprS2V5cwotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6R1BCQVJSQVlTSVpFKGsjI1ZOQU1FJHUjI3MpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotLy8lCi0vLyVERUNMQVJFX1ZBTFVFX1NUT1JBR0UjI1ZIRUxQRVIoVkFMVUVfVFlQRSwgVk5BTUUpVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMSwgVkFMMSkKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTIsIFZBTDIpCi0vLyUgIFtkaWN0MiByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lLSAodm9pZCl0ZXN0UmVtb3ZlIHsKLS8vJSAgY29uc3QgS0VZX1RZUEUgS2lzUCMja0tleXNbXSA9IHsgS0VZMSwgS0VZMn07Ci0vLyUgIGNvbnN0IFZBTFVFX1RZUEUgayMjVk5BTUUkdSMjc1tdID0geyBWQUwxLCBWQUwyIH07Ci0vLyUgIERJQ1RJT05BUllfQ0xBU1NfREVDTCMjVkhFTFBFUihLRVlfTkFNRSwgVkFMVUVfTkFNRSwgVkFMVUVfVFlQRSkgKmRpY3QgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICMjVk5BTUUkUyMjICBmb3JLZXlzOmtLZXlzCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICMjVk5BTUUkUyMjICAgIGNvdW50OkdQQkFSUkFZU0laRShrIyNWTkFNRSR1IyNzKV07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChkaWN0KTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotLy8lCi0vLyUgIFtkaWN0IHJlbW92ZSMjVk5BTUUkdSMjRm9yS2V5OktFWTJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0vLyVERUNMQVJFX1ZBTFVFX1NUT1JBR0UjI1ZIRUxQRVIoVkFMVUVfVFlQRSwgVk5BTUUpVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMSwgVkFMMSkKLS8vJVZBTFVFX05PVF9GT1VORCMjVkhFTFBFUihkaWN0LCBLRVkyKQotLy8lCi0vLyUgIC8vIFJlbW92ZSBhZ2FpbiBkb2VzIG5vdGhpbmcuCi0vLyUgIFtkaWN0IHJlbW92ZSMjVk5BTUUkdSMjRm9yS2V5OktFWTJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAxVSk7Ci0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkxLCBWQUwxKQotLy8lVkFMVUVfTk9UX0ZPVU5EIyNWSEVMUEVSKGRpY3QsIEtFWTIpCi0vLyUKLS8vJSAgW2RpY3QgcmVtb3ZlQWxsXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMFUpOwotLy8lVkFMVUVfTk9UX0ZPVU5EIyNWSEVMUEVSKGRpY3QsIEtFWTEpCi0vLyVWQUxVRV9OT1RfRk9VTkQjI1ZIRUxQRVIoZGljdCwgS0VZMikKLS8vJSAgW2RpY3QgcmVsZWFzZV07Ci0vLyV9Ci0vLyUKLS8vJS0gKHZvaWQpdGVzdElucGxhY2VNdXRhdGlvbiB7Ci0vLyUgIGNvbnN0IEtFWV9UWVBFIEtpc1AjI2tLZXlzW10gPSB7IEtFWTEsIEtFWTIgfTsKLS8vJSAgY29uc3QgVkFMVUVfVFlQRSBrIyNWTkFNRSR1IyNzW10gPSB7IFZBTDEsIFZBTDIgfTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdCA9Ci0vLyUgICAgICBbW0dQQiMjS0VZX05BTUUjI1ZBTFVFX05BTUUjI0RpY3Rpb25hcnkgYWxsb2NdIGluaXRXaXRoIyNWTkFNRSR1IyNzOmsjI1ZOQU1FJHUjI3MKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMKLS8vJSAgICAgICAgICAgS0VZX05BTUUkUyBWQUxVRV9OQU1FJFMgICAgICAgICAgIyNWTkFNRSRTIyMgICAgY291bnQ6R1BCQVJSQVlTSVpFKGsjI1ZOQU1FJHUjI3MpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0vLyVERUNMQVJFX1ZBTFVFX1NUT1JBR0UjI1ZIRUxQRVIoVkFMVUVfVFlQRSwgVk5BTUUpVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMSwgVkFMMSkKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTIsIFZBTDIpCi0vLyUKLS8vJSAgW2RpY3Qgc2V0IyNWTkFNRSR1IyM6VkFMMiBmb3JLZXk6S0VZMV07Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRpY3QuY291bnQsIDJVKTsKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTEsIFZBTDIpCi0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkyLCBWQUwyKQotLy8lCi0vLyUgIFtkaWN0IHNldCMjVk5BTUUkdSMjOlZBTDEgZm9yS2V5OktFWTJdOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkaWN0LmNvdW50LCAyVSk7Ci0vLyVURVNUX1ZBTFVFIyNWSEVMUEVSKGRpY3QsIFZOQU1FLCBLRVkxLCBWQUwyKQotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMiwgVkFMMSkKLS8vJQotLy8lICBjb25zdCBLRVlfVFlQRSBLaXNQIyNrS2V5czJbXSA9IHsgS0VZMiwgS0VZMSB9OwotLy8lICBjb25zdCBWQUxVRV9UWVBFIGsjI1ZOQU1FJHUjI3MyW10gPSB7IFZBTDIsIFZBTDEgfTsKLS8vJSAgRElDVElPTkFSWV9DTEFTU19ERUNMIyNWSEVMUEVSKEtFWV9OQU1FLCBWQUxVRV9OQU1FLCBWQUxVRV9UWVBFKSAqZGljdDIgPQotLy8lICAgICAgW1tHUEIjI0tFWV9OQU1FIyNWQUxVRV9OQU1FIyNEaWN0aW9uYXJ5IGFsbG9jXSBpbml0V2l0aCMjVk5BTUUkdSMjczprIyNWTkFNRSR1IyNzMgotLy8lICAgICAgICAgICBLRVlfTkFNRSRTIFZBTFVFX05BTUUkUyAgICAgICAgICAgICAgICAgIyNWTkFNRSRTIyMgIGZvcktleXM6a0tleXMyCi0vLyUgICAgICAgICAgIEtFWV9OQU1FJFMgVkFMVUVfTkFNRSRTICAgICAgICAgICAgICAgICAjI1ZOQU1FJFMjIyAgICBjb3VudDpHUEJBUlJBWVNJWkUoayMjVk5BTUUkdSMjczIpXTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKGRpY3QyKTsKLS8vJSAgW2RpY3QgYWRkRW50cmllc0Zyb21EaWN0aW9uYXJ5OmRpY3QyXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZGljdC5jb3VudCwgMlUpOwotLy8lVEVTVF9WQUxVRSMjVkhFTFBFUihkaWN0LCBWTkFNRSwgS0VZMSwgVkFMMSkKLS8vJVRFU1RfVkFMVUUjI1ZIRUxQRVIoZGljdCwgVk5BTUUsIEtFWTIsIFZBTDIpCi0vLyUKLS8vJSAgW2RpY3QyIHJlbGVhc2VdOwotLy8lICBbZGljdCByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lQGVuZAotLy8lCi0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCTWVzc2FnZVRlc3RzK01lcmdlLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQk1lc3NhZ2VUZXN0cytNZXJnZS5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGJkNTg5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCTWVzc2FnZVRlc3RzK01lcmdlLm0KKysrIC9kZXYvbnVsbApAQCAtMSw3MDAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbXBvcnQgIkdQQlRlc3RVdGlsaXRpZXMuaCIKLQotI2ltcG9ydCA8b2JqYy9ydW50aW1lLmg+Ci0KLSNpbXBvcnQgIkdQQk1lc3NhZ2UuaCIKLQotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL01hcFVuaXR0ZXN0LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UHJlc2VydmVVbmtub3duRW51bS5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdFJ1bnRpbWVQcm90bzIucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RSdW50aW1lUHJvdG8zLnBib2JqYy5oIgotCi1AaW50ZXJmYWNlIE1lc3NhZ2VNZXJnZVRlc3RzIDogR1BCVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIE1lc3NhZ2VNZXJnZVRlc3RzCi0KLS8vIFRPRE8odGhvbWFzdmwpOiBQdWxsIHRlc3RzIG92ZXIgZnJvbSBHUEJNZXNzYWdlVGVzdHMgdGhhdCBhcmUgbWVyZ2Ugc3BlY2lmaWMuCi0KLS0gKHZvaWQpdGVzdFByb3RvM01lcmdpbmdBbmRaZXJvVmFsdWVzIHsKLSAgLy8gUHJvdG8yIGNvdmVyZWQgaW4gb3RoZXIgdGVzdHMuCi0KLSAgTWVzc2FnZTMgKnNyYyA9IFtbTWVzc2FnZTMgYWxsb2NdIGluaXRdOwotICBNZXNzYWdlMyAqZHN0ID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gIE5TRGF0YSAqdGVzdERhdGExID0gW0AiYWJjIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gIE5TRGF0YSAqdGVzdERhdGEyID0gW0AiZGVmIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0KLSAgZHN0Lm9wdGlvbmFsSW50MzIgPSAxOwotICBkc3Qub3B0aW9uYWxJbnQ2NCA9IDE7Ci0gIGRzdC5vcHRpb25hbFVpbnQzMiA9IDE7Ci0gIGRzdC5vcHRpb25hbFVpbnQ2NCA9IDE7Ci0gIGRzdC5vcHRpb25hbFNpbnQzMiA9IDE7Ci0gIGRzdC5vcHRpb25hbFNpbnQ2NCA9IDE7Ci0gIGRzdC5vcHRpb25hbEZpeGVkMzIgPSAxOwotICBkc3Qub3B0aW9uYWxGaXhlZDY0ID0gMTsKLSAgZHN0Lm9wdGlvbmFsU2ZpeGVkMzIgPSAxOwotICBkc3Qub3B0aW9uYWxTZml4ZWQ2NCA9IDE7Ci0gIGRzdC5vcHRpb25hbEZsb2F0ID0gMS4wZjsKLSAgZHN0Lm9wdGlvbmFsRG91YmxlID0gMS4wOwotICBkc3Qub3B0aW9uYWxCb29sID0gWUVTOwotICBkc3Qub3B0aW9uYWxTdHJpbmcgPSBAImJhciI7Ci0gIGRzdC5vcHRpb25hbEJ5dGVzID0gdGVzdERhdGExOwotICBkc3Qub3B0aW9uYWxFbnVtID0gTWVzc2FnZTNfRW51bV9CYXI7Ci0KLSAgLy8gQWxsIHplcm9zLCBub3RoaW5nIHNob3VsZCBvdmVycmlnaHQuCi0KLSAgc3JjLm9wdGlvbmFsSW50MzIgPSAwOwotICBzcmMub3B0aW9uYWxJbnQ2NCA9IDA7Ci0gIHNyYy5vcHRpb25hbFVpbnQzMiA9IDA7Ci0gIHNyYy5vcHRpb25hbFVpbnQ2NCA9IDA7Ci0gIHNyYy5vcHRpb25hbFNpbnQzMiA9IDA7Ci0gIHNyYy5vcHRpb25hbFNpbnQ2NCA9IDA7Ci0gIHNyYy5vcHRpb25hbEZpeGVkMzIgPSAwOwotICBzcmMub3B0aW9uYWxGaXhlZDY0ID0gMDsKLSAgc3JjLm9wdGlvbmFsU2ZpeGVkMzIgPSAwOwotICBzcmMub3B0aW9uYWxTZml4ZWQ2NCA9IDA7Ci0gIHNyYy5vcHRpb25hbEZsb2F0ID0gMC4wZjsKLSAgc3JjLm9wdGlvbmFsRG91YmxlID0gMC4wOwotICBzcmMub3B0aW9uYWxCb29sID0gTk87Ci0gIHNyYy5vcHRpb25hbFN0cmluZyA9IEAiIjsKLSAgc3JjLm9wdGlvbmFsQnl0ZXMgPSBbTlNEYXRhIGRhdGFdOwotICBzcmMub3B0aW9uYWxFbnVtID0gTWVzc2FnZTNfRW51bV9Gb287ICAvLyBmaXJzdCB2YWx1ZQotCi0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0KLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsSW50MzIsIDEpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxJbnQ2NCwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbFVpbnQzMiwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxVaW50NjQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsU2ludDMyLCAxKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsU2ludDY0LCAxKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsRml4ZWQzMiwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxGaXhlZDY0LCAxVSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbFNmaXhlZDMyLCAxKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsU2ZpeGVkNjQsIDEpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxGbG9hdCwgMS4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbERvdWJsZSwgMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRzdC5vcHRpb25hbFN0cmluZywgQCJiYXIiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRzdC5vcHRpb25hbEJ5dGVzLCB0ZXN0RGF0YTEpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxFbnVtLCBNZXNzYWdlM19FbnVtX0Jhcik7Ci0KLSAgLy8gSGFsZiB0aGUgdmFsdWVzIHRoYXQgd2lsbCByZXBsYWNlLgotCi0gIHNyYy5vcHRpb25hbEludDMyID0gMDsKLSAgc3JjLm9wdGlvbmFsSW50NjQgPSAyOwotICBzcmMub3B0aW9uYWxVaW50MzIgPSAwOwotICBzcmMub3B0aW9uYWxVaW50NjQgPSAyOwotICBzcmMub3B0aW9uYWxTaW50MzIgPSAwOwotICBzcmMub3B0aW9uYWxTaW50NjQgPSAyOwotICBzcmMub3B0aW9uYWxGaXhlZDMyID0gMDsKLSAgc3JjLm9wdGlvbmFsRml4ZWQ2NCA9IDI7Ci0gIHNyYy5vcHRpb25hbFNmaXhlZDMyID0gMDsKLSAgc3JjLm9wdGlvbmFsU2ZpeGVkNjQgPSAyOwotICBzcmMub3B0aW9uYWxGbG9hdCA9IDAuMGY7Ci0gIHNyYy5vcHRpb25hbERvdWJsZSA9IDIuMDsKLSAgc3JjLm9wdGlvbmFsQm9vbCA9IFlFUzsgIC8vIE5vIG90aGVyIHZhbHVlIHRvIHVzZS4gIDooCi0gIHNyYy5vcHRpb25hbFN0cmluZyA9IEAiYmF6IjsKLSAgc3JjLm9wdGlvbmFsQnl0ZXMgPSBuaWw7Ci0gIHNyYy5vcHRpb25hbEVudW0gPSBNZXNzYWdlM19FbnVtX0JhejsKLQotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbEludDMyLCAxKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsSW50NjQsIDIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxVaW50MzIsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsVWludDY0LCAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbFNpbnQzMiwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbFNpbnQ2NCwgMik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbEZpeGVkMzIsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsRml4ZWQ2NCwgMlUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxTZml4ZWQzMiwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbFNmaXhlZDY0LCAyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsRmxvYXQsIDEuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxEb3VibGUsIDIuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbEJvb2wsIFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkc3Qub3B0aW9uYWxTdHJpbmcsIEAiYmF6Iik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkc3Qub3B0aW9uYWxCeXRlcywgdGVzdERhdGExKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsRW51bSwgTWVzc2FnZTNfRW51bV9CYXopOwotCi0gIC8vIE90aGVyIGhhbGYgdGhlIHZhbHVlcyB0aGF0IHdpbGwgcmVwbGFjZS4KLQotICBzcmMub3B0aW9uYWxJbnQzMiA9IDM7Ci0gIHNyYy5vcHRpb25hbEludDY0ID0gMDsKLSAgc3JjLm9wdGlvbmFsVWludDMyID0gMzsKLSAgc3JjLm9wdGlvbmFsVWludDY0ID0gMDsKLSAgc3JjLm9wdGlvbmFsU2ludDMyID0gMzsKLSAgc3JjLm9wdGlvbmFsU2ludDY0ID0gMDsKLSAgc3JjLm9wdGlvbmFsRml4ZWQzMiA9IDM7Ci0gIHNyYy5vcHRpb25hbEZpeGVkNjQgPSAwOwotICBzcmMub3B0aW9uYWxTZml4ZWQzMiA9IDM7Ci0gIHNyYy5vcHRpb25hbFNmaXhlZDY0ID0gMDsKLSAgc3JjLm9wdGlvbmFsRmxvYXQgPSAzLjBmOwotICBzcmMub3B0aW9uYWxEb3VibGUgPSAwLjA7Ci0gIHNyYy5vcHRpb25hbEJvb2wgPSBZRVM7ICAvLyBObyBvdGhlciB2YWx1ZSB0byB1c2UuICA6KAotICBzcmMub3B0aW9uYWxTdHJpbmcgPSBuaWw7Ci0gIHNyYy5vcHRpb25hbEJ5dGVzID0gdGVzdERhdGEyOwotICBzcmMub3B0aW9uYWxFbnVtID0gTWVzc2FnZTNfRW51bV9Gb287Ci0KLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLQotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxJbnQzMiwgMyk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbEludDY0LCAyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsVWludDMyLCAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbFVpbnQ2NCwgMlUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxTaW50MzIsIDMpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxTaW50NjQsIDIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxGaXhlZDMyLCAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbEZpeGVkNjQsIDJVKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsU2ZpeGVkMzIsIDMpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxTZml4ZWQ2NCwgMik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbEZsb2F0LCAzLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9wdGlvbmFsRG91YmxlLCAyLjApOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub3B0aW9uYWxCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZHN0Lm9wdGlvbmFsU3RyaW5nLCBAImJheiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZHN0Lm9wdGlvbmFsQnl0ZXMsIHRlc3REYXRhMik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vcHRpb25hbEVudW0sIE1lc3NhZ2UzX0VudW1fQmF6KTsKLQotICBbc3JjIHJlbGVhc2VdOwotICBbZHN0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RQcm90bzNNZXJnaW5nRW51bXMgewotICBVbmtub3duRW51bXNNeU1lc3NhZ2UgKnNyYyA9IFtVbmtub3duRW51bXNNeU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFVua25vd25FbnVtc015TWVzc2FnZSAqZHN0ID0gW1Vua25vd25FbnVtc015TWVzc2FnZSBtZXNzYWdlXTsKLQotICAvLyBLbm93biB2YWx1ZS4KLQotICBzcmMuZSA9IFVua25vd25FbnVtc015RW51bV9CYXI7Ci0gIHNyYy5yZXBlYXRlZEVBcnJheSA9Ci0gICAgICBbR1BCRW51bUFycmF5IGFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpVbmtub3duRW51bXNNeUVudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTpVbmtub3duRW51bXNNeUVudW1fQmFyXTsKLSAgc3JjLnJlcGVhdGVkUGFja2VkRUFycmF5ID0KLSAgICAgIFtHUEJFbnVtQXJyYXkgYXJyYXlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlVua25vd25FbnVtc015RW51bV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOlVua25vd25FbnVtc015RW51bV9CYXJdOwotICBzcmMub25lb2ZFMSA9IFVua25vd25FbnVtc015RW51bV9CYXI7Ci0KLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLQotICBYQ1RBc3NlcnRFcXVhbChkc3QuZSwgVW5rbm93bkVudW1zTXlFbnVtX0Jhcik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5yZXBlYXRlZEVBcnJheS5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbZHN0LnJlcGVhdGVkRUFycmF5IHZhbHVlQXRJbmRleDowXSwgVW5rbm93bkVudW1zTXlFbnVtX0Jhcik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5yZXBlYXRlZFBhY2tlZEVBcnJheS5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbZHN0LnJlcGVhdGVkUGFja2VkRUFycmF5IHZhbHVlQXRJbmRleDowXSwKLSAgICAgICAgICAgICAgICAgVW5rbm93bkVudW1zTXlFbnVtX0Jhcik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkUxLCBVbmtub3duRW51bXNNeUVudW1fQmFyKTsKLQotICAvLyBVbmtub3duIHZhbHVlLgotCi0gIGNvbnN0IGludDMyX3Qga1Vua25vd25WYWx1ZSA9IDY2NjsKLQotICBTZXRVbmtub3duRW51bXNNeU1lc3NhZ2VfRV9SYXdWYWx1ZShzcmMsIGtVbmtub3duVmFsdWUpOwotICBzcmMucmVwZWF0ZWRFQXJyYXkgPQotICAgICAgW0dQQkVudW1BcnJheSBhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VW5rbm93bkVudW1zTXlFbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWU6a1Vua25vd25WYWx1ZV07Ci0gIHNyYy5yZXBlYXRlZFBhY2tlZEVBcnJheSA9Ci0gICAgICBbR1BCRW51bUFycmF5IGFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpVbmtub3duRW51bXNNeUVudW1fSXNWYWxpZFZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTprVW5rbm93blZhbHVlXTsKLSAgU2V0VW5rbm93bkVudW1zTXlNZXNzYWdlX09uZW9mRTFfUmF3VmFsdWUoc3JjLCBrVW5rbm93blZhbHVlKTsKLQotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5lLCBVbmtub3duRW51bXNNeUVudW1fR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoVW5rbm93bkVudW1zTXlNZXNzYWdlX0VfUmF3VmFsdWUoZHN0KSwga1Vua25vd25WYWx1ZSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5yZXBlYXRlZEVBcnJheS5jb3VudCwgMlUpOwotICBYQ1RBc3NlcnRFcXVhbChbZHN0LnJlcGVhdGVkRUFycmF5IHZhbHVlQXRJbmRleDowXSwgVW5rbm93bkVudW1zTXlFbnVtX0Jhcik7Ci0gIFhDVEFzc2VydEVxdWFsKFtkc3QucmVwZWF0ZWRFQXJyYXkgdmFsdWVBdEluZGV4OjFdLAotICAgICAgICAgICAgICAgICBVbmtub3duRW51bXNNeUVudW1fR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2RzdC5yZXBlYXRlZEVBcnJheSByYXdWYWx1ZUF0SW5kZXg6MV0sIGtVbmtub3duVmFsdWUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3QucmVwZWF0ZWRQYWNrZWRFQXJyYXkuY291bnQsIDJVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2RzdC5yZXBlYXRlZFBhY2tlZEVBcnJheSB2YWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgIFVua25vd25FbnVtc015RW51bV9CYXIpOwotICBYQ1RBc3NlcnRFcXVhbChbZHN0LnJlcGVhdGVkUGFja2VkRUFycmF5IHZhbHVlQXRJbmRleDoxXSwKLSAgICAgICAgICAgICAgICAgVW5rbm93bkVudW1zTXlFbnVtX0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydEVxdWFsKFtkc3QucmVwZWF0ZWRQYWNrZWRFQXJyYXkgcmF3VmFsdWVBdEluZGV4OjFdLCBrVW5rbm93blZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mRTEsCi0gICAgICAgICAgICAgICAgIFVua25vd25FbnVtc015RW51bV9HUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRFcXVhbChVbmtub3duRW51bXNNeU1lc3NhZ2VfT25lb2ZFMV9SYXdWYWx1ZShkc3QpLCBrVW5rbm93blZhbHVlKTsKLX0KLQotLSAodm9pZCl0ZXN0UHJvdG8yTWVyZ2VPbmVvZiB7Ci0gIE1lc3NhZ2UyICpzcmMgPSBbTWVzc2FnZTIgbWVzc2FnZV07Ci0gIE1lc3NhZ2UyICpkc3QgPSBbTWVzc2FnZTIgbWVzc2FnZV07Ci0KLSAgLy8KLSAgLy8gTWFrZSBzdXJlIHdoYXRldmVyIGlzIGluIGRzdCBnZXRzIGNsZWFyZWQgb3V0IGJlIG1lcmdpbmcgaW4gc29tZXRoaW5nIGVsc2UuCi0gIC8vCi0KLSAgZHN0Lm9uZW9mRW51bSA9IE1lc3NhZ2UyX0VudW1fQmFyOwotCi0vLyVQRERNLURFRklORSBNRVJHRTJfVEVTVChTRVRfTkFNRSwgU0VUX1ZBTFVFLCBDTEVBUkVEX05BTUUsIENMRUFSRURfREVGQVVMVCkKLS8vJSAgc3JjLm9uZW9mIyNTRVRfTkFNRSA9IFNFVF9WQUxVRTsKLS8vJSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLS8vJSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mIyNTRVRfTkFNRSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZiMjU0VUX05BTUUsIFNFVF9WQUxVRSk7Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZiMjQ0xFQVJFRF9OQU1FLCBDTEVBUkVEX0RFRkFVTFQpOwotLy8lCi0vLyVQRERNLUVYUEFORCBNRVJHRTJfVEVTVChJbnQzMiwgMTAsIEVudW0sIE1lc3NhZ2UyX0VudW1fQmF6KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mSW50MzIgPSAxMDsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mSW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZJbnQzMiwgMTApOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFMl9URVNUKEludDY0LCAxMSwgSW50MzIsIDEwMCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkludDY0ID0gMTE7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mSW50NjQsIDExKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mSW50MzIsIDEwMCk7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFMl9URVNUKFVpbnQzMiwgMTJVLCBJbnQ2NCwgMTAxKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mVWludDMyID0gMTJVOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZVaW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZVaW50MzIsIDEyVSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkludDY0LCAxMDEpOwotCi0vLyVQRERNLUVYUEFORCBNRVJHRTJfVEVTVChVaW50NjQsIDEzVSwgVWludDMyLCAxMDJVKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mVWludDY0ID0gMTNVOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZVaW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZVaW50NjQsIDEzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZlVpbnQzMiwgMTAyVSk7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFMl9URVNUKFNpbnQzMiwgMTQsIFVpbnQ2NCwgMTAzVSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZlNpbnQzMiA9IDE0OwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTaW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTaW50MzIsIDE0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mVWludDY0LCAxMDNVKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UyX1RFU1QoU2ludDY0LCAxNSwgU2ludDMyLCAxMDQpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICBzcmMub25lb2ZTaW50NjQgPSAxNTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mU2ludDY0LCAxNSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZlNpbnQzMiwgMTA0KTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UyX1RFU1QoRml4ZWQzMiwgMTZVLCBTaW50NjQsIDEwNSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkZpeGVkMzIgPSAxNlU7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkZpeGVkMzIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZGaXhlZDMyLCAxNlUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTaW50NjQsIDEwNSk7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFMl9URVNUKEZpeGVkNjQsIDE3VSwgRml4ZWQzMiwgMTA2VSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkZpeGVkNjQgPSAxN1U7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZGaXhlZDY0LCAxN1UpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZGaXhlZDMyLCAxMDZVKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UyX1RFU1QoU2ZpeGVkMzIsIDE4LCBGaXhlZDY0LCAxMDdVKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mU2ZpeGVkMzIgPSAxODsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkMzIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTZml4ZWQzMiwgMTgpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZGaXhlZDY0LCAxMDdVKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UyX1RFU1QoU2ZpeGVkNjQsIDE5LCBTZml4ZWQzMiwgMTA4KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mU2ZpeGVkNjQgPSAxOTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTZml4ZWQ2NCwgMTkpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTZml4ZWQzMiwgMTA4KTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UyX1RFU1QoRmxvYXQsIDIwLjBmLCBTZml4ZWQ2NCwgMTA5KQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mRmxvYXQgPSAyMC4wZjsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRmxvYXQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZGbG9hdCwgMjAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTZml4ZWQ2NCwgMTA5KTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UyX1RFU1QoRG91YmxlLCAyMS4wLCBGbG9hdCwgMTEwLjBmKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mRG91YmxlID0gMjEuMDsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRG91YmxlKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mRG91YmxlLCAyMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mRmxvYXQsIDExMC4wZik7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFMl9URVNUKEJvb2wsIE5PLCBEb3VibGUsIDExMS4wKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mQm9vbCA9IE5POwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZCb29sKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZEb3VibGUsIDExMS4wKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UyX1RFU1QoRW51bSwgTWVzc2FnZTJfRW51bV9CYXIsIEJvb2wsIFlFUykKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkVudW0gPSBNZXNzYWdlMl9FbnVtX0JhcjsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRW51bSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW1fQmFyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mQm9vbCwgWUVTKTsKLQotLy8lUERETS1FWFBBTkQtRU5EICgxNCBleHBhbnNpb25zKQotCi0gIE5TU3RyaW5nICpvbmVvZlN0cmluZ0RlZmF1bHQgPSBAInN0cmluZyI7Ci0gIE5TRGF0YSAqb25lb2ZCeXRlc0RlZmF1bHQgPSBbQCJkYXRhIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0KLSAgc3JjLm9uZW9mU3RyaW5nID0gQCJmb28iOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTdHJpbmcpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZHN0Lm9uZW9mU3RyaW5nLCBAImZvbyIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0KLSAgc3JjLm9uZW9mQnl0ZXMgPSBbQCJiYXIiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mQnl0ZXMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZHN0Lm9uZW9mQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBbQCJiYXIiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkc3Qub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0KLSAgTWVzc2FnZTJfT25lb2ZHcm91cCAqZ3JvdXAgPSBbTWVzc2FnZTJfT25lb2ZHcm91cCBtZXNzYWdlXTsKLSAgZ3JvdXAuYSA9IDY2NjsKLSAgc3JjLm9uZW9mR3JvdXAgPSBncm91cDsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mR3JvdXApOwotICBNZXNzYWdlMl9PbmVvZkdyb3VwICptZXJnZWRHcm91cCA9IFtbZHN0Lm9uZW9mR3JvdXAgcmV0YWluXSBhdXRvcmVsZWFzZV07Ci0gIFhDVEFzc2VydE5vdE5pbChtZXJnZWRHcm91cCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lcmdlZEdyb3VwLCBncm91cCk7ICAvLyBQb2ludGVyIGNvbXBhcmlzaW9uLgotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVyZ2VkR3JvdXAsIGdyb3VwKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGRzdC5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0KLSAgTWVzc2FnZTIgKnN1Yk1lc3NhZ2UgPSBbTWVzc2FnZTIgbWVzc2FnZV07Ci0gIHN1Yk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiA9IDc3NzsKLSAgc3JjLm9uZW9mTWVzc2FnZSA9IHN1Yk1lc3NhZ2U7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZk1lc3NhZ2UpOwotICBNZXNzYWdlMiAqbWVyZ2VkU3ViTWVzc2FnZSA9IFtbZHN0Lm9uZW9mTWVzc2FnZSByZXRhaW5dIGF1dG9yZWxlYXNlXTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lcmdlZFN1Yk1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXJnZWRTdWJNZXNzYWdlLCBzdWJNZXNzYWdlKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXJnZWRTdWJNZXNzYWdlLCBzdWJNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRzdC5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwoZHN0Lm9uZW9mR3JvdXAsIG1lcmdlZEdyb3VwKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0KLSAgLy8gQmFjayB0byBzb21ldGhpbmcgZWxzZSB0byBtYWtlIHN1cmUgbWVzc2FnZSBjbGVhcnMgb3V0IG9rLgotCi0gIHNyYy5vbmVvZkludDMyID0gMTA7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkludDMyKTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRzdC5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbChkc3Qub25lb2ZNZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICBtZXJnZWRTdWJNZXNzYWdlKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0KLSAgLy8KLSAgLy8gVGVzdCBtZXJnaW5nIGluIHRvIG1lc3NhZ2UvZ3JvdXAgd2hlbiB0aGV5IGFscmVhZHkgaGFkIHNvbWV0aGluZy4KLSAgLy8KLQotICBzcmMub25lb2ZHcm91cCA9IGdyb3VwOwotICBtZXJnZWRHcm91cCA9IFtNZXNzYWdlMl9PbmVvZkdyb3VwIG1lc3NhZ2VdOwotICBtZXJnZWRHcm91cC5iID0gODg4OwotICBkc3Qub25lb2ZHcm91cCA9IG1lcmdlZEdyb3VwOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZHcm91cCk7Ci0gIC8vIFNob3VsZG4ndCBoYXZlIGJlZW4gYSBuZXcgb2JqZWN0LgotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZHcm91cCwgbWVyZ2VkR3JvdXApOyAgLy8gUG9pbnRlciBjb21wYXJpc2lvbi4KLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mR3JvdXAuYSwgNjY2KTsgICAgICAgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkdyb3VwLmIsIDg4OCk7ICAgICAgICAvLyBQb2ludGVyIGNvbXBhcmlzaW9uLgotCi0gIHNyYy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICBtZXJnZWRTdWJNZXNzYWdlID0gW01lc3NhZ2UyIG1lc3NhZ2VdOwotICBtZXJnZWRTdWJNZXNzYWdlLm9wdGlvbmFsSW50NjQgPSA5OTk7Ci0gIGRzdC5vbmVvZk1lc3NhZ2UgPSBtZXJnZWRTdWJNZXNzYWdlOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZNZXNzYWdlKTsKLSAgLy8gU2hvdWxkbid0IGhhdmUgYmVlbiBhIG5ldyBvYmplY3QuCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZk1lc3NhZ2UsIG1lcmdlZFN1Yk1lc3NhZ2UpOyAgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgNzc3KTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQ2NCwgOTk5KTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi19Ci0KLS0gKHZvaWQpdGVzdFByb3RvM01lcmdlT25lb2YgewotICBNZXNzYWdlMyAqc3JjID0gW01lc3NhZ2UzIG1lc3NhZ2VdOwotICBNZXNzYWdlMyAqZHN0ID0gW01lc3NhZ2UzIG1lc3NhZ2VdOwotCi0gIC8vCi0gIC8vIE1ha2Ugc3VyZSB3aGF0ZXZlciBpcyBpbiBkc3QgZ2V0cyBjbGVhcmVkIG91dCBiZSBtZXJnaW5nIGluIHNvbWV0aGluZyBlbHNlLgotICAvLwotCi0gIGRzdC5vbmVvZkVudW0gPSBNZXNzYWdlM19FbnVtX0JhcjsKLQotLy8lUERETS1ERUZJTkUgTUVSR0UzX1RFU1QoU0VUX05BTUUsIFNFVF9WQUxVRSwgQ0xFQVJFRF9OQU1FLCBDTEVBUkVEX0RFRkFVTFQpCi0vLyUgIHNyYy5vbmVvZiMjU0VUX05BTUUgPSBTRVRfVkFMVUU7Ci0vLyUgIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0vLyUgIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZiMjU0VUX05BTUUpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2YjI1NFVF9OQU1FLCBTRVRfVkFMVUUpOwotLy8lICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2YjI0NMRUFSRURfTkFNRSwgQ0xFQVJFRF9ERUZBVUxUKTsKLS8vJQotLy8lUERETS1FWFBBTkQgTUVSR0UzX1RFU1QoSW50MzIsIDEwLCBFbnVtLCBNZXNzYWdlM19FbnVtX0ZvbykKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkludDMyID0gMTA7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mSW50MzIsIDEwKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9Gb28pOwotCi0vLyVQRERNLUVYUEFORCBNRVJHRTNfVEVTVChJbnQ2NCwgMTEsIEludDMyLCAwKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mSW50NjQgPSAxMTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mSW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZJbnQ2NCwgMTEpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZJbnQzMiwgMCk7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFM19URVNUKFVpbnQzMiwgMTJVLCBJbnQ2NCwgMCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZlVpbnQzMiA9IDEyVTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mVWludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mVWludDMyLCAxMlUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZJbnQ2NCwgMCk7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFM19URVNUKFVpbnQ2NCwgMTNVLCBVaW50MzIsIDBVKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mVWludDY0ID0gMTNVOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZVaW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZVaW50NjQsIDEzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZlVpbnQzMiwgMFUpOwotCi0vLyVQRERNLUVYUEFORCBNRVJHRTNfVEVTVChTaW50MzIsIDE0LCBVaW50NjQsIDBVKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mU2ludDMyID0gMTQ7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNpbnQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZlNpbnQzMiwgMTQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZVaW50NjQsIDBVKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UzX1RFU1QoU2ludDY0LCAxNSwgU2ludDMyLCAwKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mU2ludDY0ID0gMTU7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNpbnQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZlNpbnQ2NCwgMTUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTaW50MzIsIDApOwotCi0vLyVQRERNLUVYUEFORCBNRVJHRTNfVEVTVChGaXhlZDMyLCAxNlUsIFNpbnQ2NCwgMCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkZpeGVkMzIgPSAxNlU7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkZpeGVkMzIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZGaXhlZDMyLCAxNlUpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTaW50NjQsIDApOwotCi0vLyVQRERNLUVYUEFORCBNRVJHRTNfVEVTVChGaXhlZDY0LCAxN1UsIEZpeGVkMzIsIDBVKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mRml4ZWQ2NCA9IDE3VTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRml4ZWQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkZpeGVkNjQsIDE3VSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkZpeGVkMzIsIDBVKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UzX1RFU1QoU2ZpeGVkMzIsIDE4LCBGaXhlZDY0LCAwVSkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZlNmaXhlZDMyID0gMTg7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mU2ZpeGVkMzIsIDE4KTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mRml4ZWQ2NCwgMFUpOwotCi0vLyVQRERNLUVYUEFORCBNRVJHRTNfVEVTVChTZml4ZWQ2NCwgMTksIFNmaXhlZDMyLCAwKQotLy8gVGhpcyBibG9jayBvZiBjb2RlIGlzIGdlbmVyYXRlZCwgZG8gbm90IGVkaXQgaXQgZGlyZWN0bHkuCi0KLSAgc3JjLm9uZW9mU2ZpeGVkNjQgPSAxOTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTZml4ZWQ2NCwgMTkpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZTZml4ZWQzMiwgMCk7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFM19URVNUKEZsb2F0LCAyMC4wZiwgU2ZpeGVkNjQsIDApCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICBzcmMub25lb2ZGbG9hdCA9IDIwLjBmOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkZsb2F0LCAyMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZlNmaXhlZDY0LCAwKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UzX1RFU1QoRG91YmxlLCAyMS4wLCBGbG9hdCwgMC4wZikKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkRvdWJsZSA9IDIxLjA7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkRvdWJsZSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkRvdWJsZSwgMjEuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkZsb2F0LCAwLjBmKTsKLQotLy8lUERETS1FWFBBTkQgTUVSR0UzX1RFU1QoQm9vbCwgWUVTLCBEb3VibGUsIDAuMCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkJvb2wgPSBZRVM7Ci0gIFtkc3QgbWVyZ2VGcm9tOnNyY107Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkJvb2wpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZEb3VibGUsIDAuMCk7Ci0KLS8vJVBERE0tRVhQQU5EIE1FUkdFM19URVNUKEVudW0sIE1lc3NhZ2UzX0VudW1fQmFyLCBCb29sLCBOTykKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHNyYy5vbmVvZkVudW0gPSBNZXNzYWdlM19FbnVtX0JhcjsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRW51bSk7Ci0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fQmFyKTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9uZW9mQm9vbCwgTk8pOwotCi0vLyVQRERNLUVYUEFORC1FTkQgKDE0IGV4cGFuc2lvbnMpCi0KLSAgTlNTdHJpbmcgKm9uZW9mU3RyaW5nRGVmYXVsdCA9IEAiIjsKLSAgTlNEYXRhICpvbmVvZkJ5dGVzRGVmYXVsdCA9IFtOU0RhdGEgZGF0YV07Ci0KLSAgc3JjLm9uZW9mU3RyaW5nID0gQCJmb28iOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTdHJpbmcpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZHN0Lm9uZW9mU3RyaW5nLCBAImZvbyIpOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtX0Zvbyk7Ci0KLSAgc3JjLm9uZW9mQnl0ZXMgPSBbQCJiYXIiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mQnl0ZXMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZHN0Lm9uZW9mQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBbQCJiYXIiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkc3Qub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0KLQotICBNZXNzYWdlMyAqc3ViTWVzc2FnZSA9IFtNZXNzYWdlMyBtZXNzYWdlXTsKLSAgc3ViTWVzc2FnZS5vcHRpb25hbEludDMyID0gNzc3OwotICBzcmMub25lb2ZNZXNzYWdlID0gc3ViTWVzc2FnZTsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mTWVzc2FnZSk7Ci0gIE1lc3NhZ2UzICptZXJnZWRTdWJNZXNzYWdlID0gW1tkc3Qub25lb2ZNZXNzYWdlIHJldGFpbl0gYXV0b3JlbGVhc2VdOwotICBYQ1RBc3NlcnROb3ROaWwobWVyZ2VkU3ViTWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lcmdlZFN1Yk1lc3NhZ2UsIHN1Yk1lc3NhZ2UpOyAgLy8gUG9pbnRlciBjb21wYXJpc2lvbi4KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lcmdlZFN1Yk1lc3NhZ2UsIHN1Yk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZHN0Lm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLQotICAvLyBCYWNrIHRvIHNvbWV0aGluZyBlbHNlIHRvIG1ha2Ugc3VyZSBtZXNzYWdlIGNsZWFycyBvdXQgb2suCi0KLSAgc3JjLm9uZW9mSW50MzIgPSAxMDsKLSAgW2RzdCBtZXJnZUZyb206c3JjXTsKLSAgWENUQXNzZXJ0RXF1YWwoZHN0Lm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mSW50MzIpOwotICBYQ1RBc3NlcnROb3ROaWwoZHN0Lm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKGRzdC5vbmVvZk1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIG1lcmdlZFN1Yk1lc3NhZ2UpOyAgLy8gUG9pbnRlciBjb21wYXJpc2lvbi4KLQotICAvLwotICAvLyBUZXN0IG1lcmdpbmcgaW4gdG8gbWVzc2FnZSB3aGVuIHRoZXkgYWxyZWFkeSBoYWQgc29tZXRoaW5nLgotICAvLwotCi0gIHNyYy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICBtZXJnZWRTdWJNZXNzYWdlID0gW01lc3NhZ2UzIG1lc3NhZ2VdOwotICBtZXJnZWRTdWJNZXNzYWdlLm9wdGlvbmFsSW50NjQgPSA5OTk7Ci0gIGRzdC5vbmVvZk1lc3NhZ2UgPSBtZXJnZWRTdWJNZXNzYWdlOwotICBbZHN0IG1lcmdlRnJvbTpzcmNdOwotICBYQ1RBc3NlcnRFcXVhbChkc3Qub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZNZXNzYWdlKTsKLSAgLy8gU2hvdWxkbid0IGhhdmUgYmVlbiBhIG5ldyBvYmplY3QuCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZk1lc3NhZ2UsIG1lcmdlZFN1Yk1lc3NhZ2UpOyAgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgNzc3KTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi0gIFhDVEFzc2VydEVxdWFsKGRzdC5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQ2NCwgOTk5KTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24uCi19Ci0KLSNwcmFnbWEgbWFyayAtIFN1YnNldCBmcm9tIGZyb20gbWFwX3Rlc3RzLmNjCi0KLS8vIFRFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBDb3B5RnJvbU1lc3NhZ2VNYXApCi0tICh2b2lkKXRlc3RNYXBfQ29weUZyb21NZXNzYWdlTWFwIHsKLSAgVGVzdE1lc3NhZ2VNYXAgKm1zZzEgPSBbW1Rlc3RNZXNzYWdlTWFwIGFsbG9jXSBpbml0XTsKLSAgVGVzdE1lc3NhZ2VNYXAgKm1zZzIgPSBbW1Rlc3RNZXNzYWdlTWFwIGFsbG9jXSBpbml0XTsKLQotICBUZXN0QWxsVHlwZXMgKnN1Yk1zZyA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIHN1Yk1zZy5yZXBlYXRlZEludDMyQXJyYXkgPSBbR1BCSW50MzJBcnJheSBhcnJheVdpdGhWYWx1ZToxMDBdOwotICBbbXNnMS5tYXBJbnQzMk1lc3NhZ2Ugc2V0T2JqZWN0OnN1Yk1zZyBmb3JLZXk6MF07Ci0gIHN1Yk1zZyA9IG5pbDsKLQotICBzdWJNc2cgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBzdWJNc2cucmVwZWF0ZWRJbnQzMkFycmF5ID0gW0dQQkludDMyQXJyYXkgYXJyYXlXaXRoVmFsdWU6MTAxXTsKLQotICBbbXNnMi5tYXBJbnQzMk1lc3NhZ2Ugc2V0T2JqZWN0OnN1Yk1zZyBmb3JLZXk6MF07Ci0gIHN1Yk1zZyA9IG5pbDsKLQotICBbbXNnMSBtZXJnZUZyb206bXNnMl07Ci0KLSAgLy8gQ2hlY2tzIHJlcGVhdGVkIGZpZWxkIGlzIG92ZXJ3cml0dGVuLgotICBYQ1RBc3NlcnRFcXVhbChtc2cxLm1hcEludDMyTWVzc2FnZS5jb3VudCwgMVUpOwotICBzdWJNc2cgPSBbbXNnMS5tYXBJbnQzMk1lc3NhZ2Ugb2JqZWN0Rm9yS2V5OjBdOwotICBYQ1RBc3NlcnROb3ROaWwoc3ViTXNnKTsKLSAgWENUQXNzZXJ0RXF1YWwoc3ViTXNnLnJlcGVhdGVkSW50MzJBcnJheS5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbc3ViTXNnLnJlcGVhdGVkSW50MzJBcnJheSB2YWx1ZUF0SW5kZXg6MF0sIDEwMSk7Ci0KLSAgW21zZzIgcmVsZWFzZV07Ci0gIFttc2cxIHJlbGVhc2VdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQk1lc3NhZ2VUZXN0cytSdW50aW1lLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQk1lc3NhZ2VUZXN0cytSdW50aW1lLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVlMTk3NzEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJNZXNzYWdlVGVzdHMrUnVudGltZS5tCisrKyAvZGV2L251bGwKQEAgLTEsMjA5MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotCi0jaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KLQotI2ltcG9ydCAiR1BCTWVzc2FnZS5oIgotCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvTWFwVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RPYmpjU3RhcnR1cC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdFJ1bnRpbWVQcm90bzIucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RSdW50aW1lUHJvdG8zLnBib2JqYy5oIgotCi1AaW50ZXJmYWNlIE1lc3NhZ2VSdW50aW1lVGVzdHMgOiBHUEJUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gTWVzc2FnZVJ1bnRpbWVUZXN0cwotCi0vLyBUT0RPKHRob21hc3ZsKTogUHVsbCB0ZXN0cyBvdmVyIGZyb20gR1BCTWVzc2FnZVRlc3RzIHRoYXQgYXJlIHJ1bnRpbWUKLS8vIHNwZWNpZmljLgotCi0tICh2b2lkKXRlc3RTdGFydHVwT3JkZXJpbmcgewotICAvLyBKdXN0IGhhdmUgdG8gY3JlYXRlIGEgbWVzc2FnZS4gIE5vdGhpbmcgZWxzZSB1c2VzIHRoZSBjbGFzc2VzIGZyb20KLSAgLy8gdGhpcyBmaWxlLCBzbyB0aGUgZmlyc3Qgc2VsZWN0b3IgaW52b2tlZCBvbiB0aGUgY2xhc3Mgd2lsbCBpbml0aWFsaXplCi0gIC8vIGl0LCB3aGljaCBhbHNvIGluaXRpYWxpemVzIHRoZSByb290LgotICBUZXN0T2JqQ1N0YXJ0dXBNZXNzYWdlICptZXNzYWdlID0gW1Rlc3RPYmpDU3RhcnR1cE1lc3NhZ2UgbWVzc2FnZV07Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlKTsKLX0KLQotLSAodm9pZCl0ZXN0UHJvdG8ySGFzTWV0aG9kU3VwcG9ydCB7Ci0gIE5TQXJyYXkgKm5hbWVzID0gQFsKLSAgICBAIkludDMyIiwKLSAgICBAIkludDY0IiwKLSAgICBAIlVpbnQzMiIsCi0gICAgQCJVaW50NjQiLAotICAgIEAiU2ludDMyIiwKLSAgICBAIlNpbnQ2NCIsCi0gICAgQCJGaXhlZDMyIiwKLSAgICBAIkZpeGVkNjQiLAotICAgIEAiU2ZpeGVkMzIiLAotICAgIEAiU2ZpeGVkNjQiLAotICAgIEAiRmxvYXQiLAotICAgIEAiRG91YmxlIiwKLSAgICBAIkJvb2wiLAotICAgIEAiU3RyaW5nIiwKLSAgICBAIkJ5dGVzIiwKLSAgICBAIkdyb3VwIiwKLSAgICBAIk1lc3NhZ2UiLAotICAgIEAiRW51bSIsCi0gIF07Ci0KLSAgLy8gUHJvdG8yIGdldHM6Ci0KLSAgLy8gU2luZ2xlIGZpZWxkcyAtIGhhcyovc2V0SGFzKiBpcyB2YWxpZC4KLQotICBmb3IgKE5TU3RyaW5nICpuYW1lIGluIG5hbWVzKSB7Ci0gICAgLy8gYnVpbGQgdGhlIHNlbGVjdG9yLCBpLmUuIC0gaGFzT3B0aW9uYWxJbnQzMi9zZXRIYXNPcHRpb25hbEludDMyOgotICAgIFNFTCBoYXNTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJoYXNPcHRpb25hbCVAIiwgbmFtZV0pOwotICAgIFNFTCBzZXRIYXNTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJzZXRIYXNPcHRpb25hbCVAOiIsIG5hbWVdKTsKLSAgICBYQ1RBc3NlcnRUcnVlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpoYXNTZWxdLCBAImZpZWxkOiAlQCIsCi0gICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICBYQ1RBc3NlcnRUcnVlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpzZXRIYXNTZWxdLCBAImZpZWxkOiAlQCIsCi0gICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfQotCi0gIC8vIFJlcGVhdGVkIGZpZWxkcwotICAvLyAgLSBubyBoYXMqL3NldEhhcyoKLSAgLy8gIC0gKkNvdW50Ci0KLSAgZm9yIChOU1N0cmluZyAqbmFtZSBpbiBuYW1lcykgewotICAgIC8vIGJ1aWxkIHRoZSBzZWxlY3RvciwgaS5lLiAtIGhhc1JlcGVhdGVkSW50MzJBcnJheS9zZXRIYXNSZXBlYXRlZEludDMyQXJyYXk6Ci0gICAgU0VMIGhhc1NlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKAotICAgICAgICBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImhhc1JlcGVhdGVkJUBBcnJheSIsIG5hbWVdKTsKLSAgICBTRUwgc2V0SGFzU2VsID0gTlNTZWxlY3RvckZyb21TdHJpbmcoCi0gICAgICAgIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAic2V0SGFzUmVwZWF0ZWQlQEFycmF5OiIsIG5hbWVdKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbTWVzc2FnZTIgaW5zdGFuY2VzUmVzcG9uZFRvU2VsZWN0b3I6aGFzU2VsXSwgQCJmaWVsZDogJUAiLAotICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgIFhDVEFzc2VydEZhbHNlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpzZXRIYXNTZWxdLAotICAgICAgICAgICAgICAgICAgIEAiZmllbGQ6ICVAIiwgbmFtZSk7Ci0gICAgLy8gYnVpbGQgdGhlIHNlbGVjdG9yLCBpLmUuIC0gcmVwZWF0ZWRJbnQzMkFycmF5X0NvdW50Ci0gICAgU0VMIGNvdW50U2VsID0gTlNTZWxlY3RvckZyb21TdHJpbmcoCi0gICAgICAgIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAicmVwZWF0ZWQlQEFycmF5X0NvdW50IiwgbmFtZV0pOwotICAgIFhDVEFzc2VydFRydWUoW01lc3NhZ2UyIGluc3RhbmNlc1Jlc3BvbmRUb1NlbGVjdG9yOmNvdW50U2VsXSwgQCJmaWVsZDogJUAiLAotICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9Ci0KLSAgLy8gT25lT2YgZmllbGRzIC0gbm8gaGFzKi9zZXRIYXMqCi0KLSAgZm9yIChOU1N0cmluZyAqbmFtZSBpbiBuYW1lcykgewotICAgIC8vIGJ1aWxkIHRoZSBzZWxlY3RvciwgaS5lLiAtIGhhc09uZW9mSW50MzIvc2V0SGFzT25lb2ZJbnQzMjoKLSAgICBTRUwgaGFzU2VsID0KLSAgICAgICAgTlNTZWxlY3RvckZyb21TdHJpbmcoW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJoYXNPbmVvZiVAIiwgbmFtZV0pOwotICAgIFNFTCBzZXRIYXNTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJzZXRIYXNPbmVvZiVAOiIsIG5hbWVdKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbTWVzc2FnZTIgaW5zdGFuY2VzUmVzcG9uZFRvU2VsZWN0b3I6aGFzU2VsXSwgQCJmaWVsZDogJUAiLAotICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgIFhDVEFzc2VydEZhbHNlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpzZXRIYXNTZWxdLAotICAgICAgICAgICAgICAgICAgIEAiZmllbGQ6ICVAIiwgbmFtZSk7Ci0gIH0KLQotICAvLyBtYXA8PiBmaWVsZHMKLSAgLy8gIC0gbm8gaGFzKi9zZXRIYXMqCi0gIC8vICAtICpDb3VudAotCi0gIE5TQXJyYXkgKm1hcE5hbWVzID0gQFsKLSAgICBAIkludDMySW50MzIiLAotICAgIEAiSW50NjRJbnQ2NCIsCi0gICAgQCJVaW50MzJVaW50MzIiLAotICAgIEAiVWludDY0VWludDY0IiwKLSAgICBAIlNpbnQzMlNpbnQzMiIsCi0gICAgQCJTaW50NjRTaW50NjQiLAotICAgIEAiRml4ZWQzMkZpeGVkMzIiLAotICAgIEAiRml4ZWQ2NEZpeGVkNjQiLAotICAgIEAiU2ZpeGVkMzJTZml4ZWQzMiIsCi0gICAgQCJTZml4ZWQ2NFNmaXhlZDY0IiwKLSAgICBAIkludDMyRmxvYXQiLAotICAgIEAiSW50MzJEb3VibGUiLAotICAgIEAiQm9vbEJvb2wiLAotICAgIEAiU3RyaW5nU3RyaW5nIiwKLSAgICBAIlN0cmluZ0J5dGVzIiwKLSAgICBAIlN0cmluZ01lc3NhZ2UiLAotICAgIEAiSW50MzJCeXRlcyIsCi0gICAgQCJJbnQzMkVudW0iLAotICAgIEAiSW50MzJNZXNzYWdlIiwKLSAgXTsKLQotICBmb3IgKE5TU3RyaW5nICpuYW1lIGluIG1hcE5hbWVzKSB7Ci0gICAgLy8gYnVpbGQgdGhlIHNlbGVjdG9yLCBpLmUuIC0gaGFzTWFwSW50MzJJbnQzMi9zZXRIYXNNYXBJbnQzMkludDMyOgotICAgIFNFTCBoYXNTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJoYXNNYXAlQCIsIG5hbWVdKTsKLSAgICBTRUwgc2V0SGFzU2VsID0gTlNTZWxlY3RvckZyb21TdHJpbmcoCi0gICAgICAgIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAic2V0SGFzTWFwJUA6IiwgbmFtZV0pOwotICAgIFhDVEFzc2VydEZhbHNlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpoYXNTZWxdLCBAImZpZWxkOiAlQCIsCi0gICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoW01lc3NhZ2UyIGluc3RhbmNlc1Jlc3BvbmRUb1NlbGVjdG9yOnNldEhhc1NlbF0sCi0gICAgICAgICAgICAgICAgICAgQCJmaWVsZDogJUAiLCBuYW1lKTsKLSAgICAvLyBidWlsZCB0aGUgc2VsZWN0b3IsIGkuZS4gLSBtYXBJbnQzMkludDMyQ291bnQKLSAgICBTRUwgY291bnRTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJtYXAlQF9Db3VudCIsIG5hbWVdKTsKLSAgICBYQ1RBc3NlcnRUcnVlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3Rvcjpjb3VudFNlbF0sIEAiZmllbGQ6ICVAIiwKLSAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfQotCi19Ci0KLS0gKHZvaWQpdGVzdFByb3RvM0hhc01ldGhvZFN1cHBvcnQgewotICBOU0FycmF5ICpuYW1lcyA9IEBbCi0gICAgQCJJbnQzMiIsCi0gICAgQCJJbnQ2NCIsCi0gICAgQCJVaW50MzIiLAotICAgIEAiVWludDY0IiwKLSAgICBAIlNpbnQzMiIsCi0gICAgQCJTaW50NjQiLAotICAgIEAiRml4ZWQzMiIsCi0gICAgQCJGaXhlZDY0IiwKLSAgICBAIlNmaXhlZDMyIiwKLSAgICBAIlNmaXhlZDY0IiwKLSAgICBAIkZsb2F0IiwKLSAgICBAIkRvdWJsZSIsCi0gICAgQCJCb29sIiwKLSAgICBAIlN0cmluZyIsCi0gICAgQCJCeXRlcyIsCi0gICAgQCJNZXNzYWdlIiwKLSAgICBAIkVudW0iLAotICBdOwotCi0gIC8vIFByb3RvMyBnZXRzOgotCi0gIC8vIFNpbmdsZSBmaWVsZHMKLSAgLy8gIC0gaGFzKi9zZXRIYXMqIGludmFsaWQgZm9yIHByaW1hdGl2ZSB0eXBlcy4KLSAgLy8gIC0gaGFzKi9zZXRIYXMqIHZhbGlkIGZvciBNZXNzYWdlLgotCi0gIGZvciAoTlNTdHJpbmcgKm5hbWUgaW4gbmFtZXMpIHsKLSAgICAvLyBidWlsZCB0aGUgc2VsZWN0b3IsIGkuZS4gLSBoYXNPcHRpb25hbEludDMyL3NldEhhc09wdGlvbmFsSW50MzI6Ci0gICAgU0VMIGhhc1NlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKAotICAgICAgICBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAImhhc09wdGlvbmFsJUAiLCBuYW1lXSk7Ci0gICAgU0VMIHNldEhhc1NlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKAotICAgICAgICBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAInNldEhhc09wdGlvbmFsJUA6IiwgbmFtZV0pOwotICAgIGlmIChbbmFtZSBpc0VxdWFsOkAiTWVzc2FnZSJdKSB7Ci0gICAgICAvLyBTdWIgbWVzc2FnZXMvZ3JvdXBzIGFyZSB0aGUgZXhjZXB0aW9uLgotICAgICAgWENUQXNzZXJ0VHJ1ZShbTWVzc2FnZTMgaW5zdGFuY2VzUmVzcG9uZFRvU2VsZWN0b3I6aGFzU2VsXSwgQCJmaWVsZDogJUAiLAotICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgIFhDVEFzc2VydFRydWUoW01lc3NhZ2UzIGluc3RhbmNlc1Jlc3BvbmRUb1NlbGVjdG9yOnNldEhhc1NlbF0sCi0gICAgICAgICAgICAgICAgICAgIEAiZmllbGQ6ICVAIiwgbmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFhDVEFzc2VydEZhbHNlKFtNZXNzYWdlMyBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpoYXNTZWxdLCBAImZpZWxkOiAlQCIsCi0gICAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICAgIFhDVEFzc2VydEZhbHNlKFtNZXNzYWdlMyBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpzZXRIYXNTZWxdLAotICAgICAgICAgICAgICAgICAgICAgQCJmaWVsZDogJUAiLCBuYW1lKTsKLSAgICB9Ci0gIH0KLQotICAvLyBSZXBlYXRlZCBmaWVsZHMKLSAgLy8gIC0gbm8gaGFzKi9zZXRIYXMqCi0gIC8vICAtICpDb3VudAotCi0gIGZvciAoTlNTdHJpbmcgKm5hbWUgaW4gbmFtZXMpIHsKLSAgICAvLyBidWlsZCB0aGUgc2VsZWN0b3IsIGkuZS4gLSBoYXNSZXBlYXRlZEludDMyQXJyYXkvc2V0SGFzUmVwZWF0ZWRJbnQzMkFycmF5OgotICAgIFNFTCBoYXNTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJoYXNSZXBlYXRlZCVAQXJyYXkiLCBuYW1lXSk7Ci0gICAgU0VMIHNldEhhc1NlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKAotICAgICAgICBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAInNldEhhc1JlcGVhdGVkJUBBcnJheToiLCBuYW1lXSk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoW01lc3NhZ2UzIGluc3RhbmNlc1Jlc3BvbmRUb1NlbGVjdG9yOmhhc1NlbF0sIEAiZmllbGQ6ICVAIiwKLSAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbTWVzc2FnZTMgaW5zdGFuY2VzUmVzcG9uZFRvU2VsZWN0b3I6c2V0SGFzU2VsXSwKLSAgICAgICAgICAgICAgICAgICBAImZpZWxkOiAlQCIsIG5hbWUpOwotICAgIC8vIGJ1aWxkIHRoZSBzZWxlY3RvciwgaS5lLiAtIHJlcGVhdGVkSW50MzJBcnJheV9Db3VudAotICAgIFNFTCBjb3VudFNlbCA9IE5TU2VsZWN0b3JGcm9tU3RyaW5nKAotICAgICAgICBbTlNTdHJpbmcgc3RyaW5nV2l0aEZvcm1hdDpAInJlcGVhdGVkJUBBcnJheV9Db3VudCIsIG5hbWVdKTsKLSAgICBYQ1RBc3NlcnRUcnVlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3Rvcjpjb3VudFNlbF0sIEAiZmllbGQ6ICVAIiwKLSAgICAgICAgICAgICAgICAgIG5hbWUpOwotICB9Ci0KLSAgLy8gT25lT2YgZmllbGRzIC0gbm8gaGFzKi9zZXRIYXMqCi0KLSAgZm9yIChOU1N0cmluZyAqbmFtZSBpbiBuYW1lcykgewotICAgIC8vIGJ1aWxkIHRoZSBzZWxlY3RvciwgaS5lLiAtIGhhc09uZW9mSW50MzIvc2V0SGFzT25lb2ZJbnQzMjoKLSAgICBTRUwgaGFzU2VsID0KLSAgICAgICAgTlNTZWxlY3RvckZyb21TdHJpbmcoW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJoYXNPbmVvZiVAIiwgbmFtZV0pOwotICAgIFNFTCBzZXRIYXNTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJzZXRIYXNPbmVvZiVAOiIsIG5hbWVdKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbTWVzc2FnZTIgaW5zdGFuY2VzUmVzcG9uZFRvU2VsZWN0b3I6aGFzU2VsXSwgQCJmaWVsZDogJUAiLAotICAgICAgICAgICAgICAgICAgIG5hbWUpOwotICAgIFhDVEFzc2VydEZhbHNlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpzZXRIYXNTZWxdLAotICAgICAgICAgICAgICAgICAgIEAiZmllbGQ6ICVAIiwgbmFtZSk7Ci0gIH0KLQotICAvLyBtYXA8PiBmaWVsZHMKLSAgLy8gIC0gbm8gaGFzKi9zZXRIYXMqCi0gIC8vICAtICpDb3VudAotCi0gIE5TQXJyYXkgKm1hcE5hbWVzID0gQFsKLSAgICBAIkludDMySW50MzIiLAotICAgIEAiSW50NjRJbnQ2NCIsCi0gICAgQCJVaW50MzJVaW50MzIiLAotICAgIEAiVWludDY0VWludDY0IiwKLSAgICBAIlNpbnQzMlNpbnQzMiIsCi0gICAgQCJTaW50NjRTaW50NjQiLAotICAgIEAiRml4ZWQzMkZpeGVkMzIiLAotICAgIEAiRml4ZWQ2NEZpeGVkNjQiLAotICAgIEAiU2ZpeGVkMzJTZml4ZWQzMiIsCi0gICAgQCJTZml4ZWQ2NFNmaXhlZDY0IiwKLSAgICBAIkludDMyRmxvYXQiLAotICAgIEAiSW50MzJEb3VibGUiLAotICAgIEAiQm9vbEJvb2wiLAotICAgIEAiU3RyaW5nU3RyaW5nIiwKLSAgICBAIlN0cmluZ0J5dGVzIiwKLSAgICBAIlN0cmluZ01lc3NhZ2UiLAotICAgIEAiSW50MzJCeXRlcyIsCi0gICAgQCJJbnQzMkVudW0iLAotICAgIEAiSW50MzJNZXNzYWdlIiwKLSAgXTsKLQotICBmb3IgKE5TU3RyaW5nICpuYW1lIGluIG1hcE5hbWVzKSB7Ci0gICAgLy8gYnVpbGQgdGhlIHNlbGVjdG9yLCBpLmUuIC0gaGFzTWFwSW50MzJJbnQzMi9zZXRIYXNNYXBJbnQzMkludDMyOgotICAgIFNFTCBoYXNTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJoYXNNYXAlQCIsIG5hbWVdKTsKLSAgICBTRUwgc2V0SGFzU2VsID0gTlNTZWxlY3RvckZyb21TdHJpbmcoCi0gICAgICAgIFtOU1N0cmluZyBzdHJpbmdXaXRoRm9ybWF0OkAic2V0SGFzTWFwJUA6IiwgbmFtZV0pOwotICAgIFhDVEFzc2VydEZhbHNlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3RvcjpoYXNTZWxdLCBAImZpZWxkOiAlQCIsCi0gICAgICAgICAgICAgICAgICAgbmFtZSk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoW01lc3NhZ2UyIGluc3RhbmNlc1Jlc3BvbmRUb1NlbGVjdG9yOnNldEhhc1NlbF0sCi0gICAgICAgICAgICAgICAgICAgQCJmaWVsZDogJUAiLCBuYW1lKTsKLSAgICAvLyBidWlsZCB0aGUgc2VsZWN0b3IsIGkuZS4gLSBtYXBJbnQzMkludDMyQ291bnQKLSAgICBTRUwgY291bnRTZWwgPSBOU1NlbGVjdG9yRnJvbVN0cmluZygKLSAgICAgICAgW05TU3RyaW5nIHN0cmluZ1dpdGhGb3JtYXQ6QCJtYXAlQF9Db3VudCIsIG5hbWVdKTsKLSAgICBYQ1RBc3NlcnRUcnVlKFtNZXNzYWdlMiBpbnN0YW5jZXNSZXNwb25kVG9TZWxlY3Rvcjpjb3VudFNlbF0sIEAiZmllbGQ6ICVAIiwKLSAgICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgfQotfQotCi0tICh2b2lkKXRlc3RQcm90bzJTaW5nbGVGaWVsZEhhc0JlaGF2aW9yIHsKLSAgLy8KLSAgLy8gU2V0dGluZyB0byBhbnkgdmFsdWUgaW5jbHVkaW5nIHRoZSBkZWZhdWx0IHZhbHVlICgwKSBzaG91bGQgcmVzdWx0IGhhcyoKLSAgLy8gYmVpbmcgdHJ1ZS4KLSAgLy8KLQotLy8lUERETS1ERUZJTkUgUFJPVE8yX1RFU1RfSEFTX0ZJRUxEKEZJRUxELCBOT05fWkVST19WQUxVRSwgWkVST19WQUxVRSkKLS8vJSAgeyAgLy8gb3B0aW9uYWwjI0ZJRUxEIDo6IE5PTl9aRVJPX1ZBTFVFCi0vLyUgICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotLy8lICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbCMjRklFTEQpOwotLy8lICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsIyNGSUVMRCkpOwotLy8lICAgIG1zZy5vcHRpb25hbCMjRklFTEQgPSBOT05fWkVST19WQUxVRTsKLS8vJSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbCMjRklFTEQpOwotLy8lICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWwjI0ZJRUxEKSk7Ci0vLyUgICAgW21zZyByZWxlYXNlXTsKLS8vJSAgfQotLy8lICB7ICAvLyBvcHRpb25hbCMjRklFTEQgOjogWkVST19WQUxVRQotLy8lICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLS8vJSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWwjI0ZJRUxEKTsKLS8vJSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbCMjRklFTEQpKTsKLS8vJSAgICBtc2cub3B0aW9uYWwjI0ZJRUxEID0gWkVST19WQUxVRTsKLS8vJSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbCMjRklFTEQpOwotLy8lICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWwjI0ZJRUxEKSk7Ci0vLyUgICAgW21zZyByZWxlYXNlXTsKLS8vJSAgfQotLy8lCi0vLyVQRERNLURFRklORSBQUk9UTzJfVEVTVF9IQVNfRklFTERTKCkKLS8vJVBST1RPMl9URVNUX0hBU19GSUVMRChJbnQzMiwgMSwgMCkKLS8vJVBST1RPMl9URVNUX0hBU19GSUVMRChJbnQ2NCwgMSwgMCkKLS8vJVBST1RPMl9URVNUX0hBU19GSUVMRChVaW50MzIsIDEsIDApCi0vLyVQUk9UTzJfVEVTVF9IQVNfRklFTEQoVWludDY0LCAxLCAwKQotLy8lUFJPVE8yX1RFU1RfSEFTX0ZJRUxEKFNpbnQzMiwgMSwgMCkKLS8vJVBST1RPMl9URVNUX0hBU19GSUVMRChTaW50NjQsIDEsIDApCi0vLyVQUk9UTzJfVEVTVF9IQVNfRklFTEQoRml4ZWQzMiwgMSwgMCkKLS8vJVBST1RPMl9URVNUX0hBU19GSUVMRChGaXhlZDY0LCAxLCAwKQotLy8lUFJPVE8yX1RFU1RfSEFTX0ZJRUxEKFNmaXhlZDMyLCAxLCAwKQotLy8lUFJPVE8yX1RFU1RfSEFTX0ZJRUxEKFNmaXhlZDY0LCAxLCAwKQotLy8lUFJPVE8yX1RFU1RfSEFTX0ZJRUxEKEZsb2F0LCAxLjBmLCAwLjBmKQotLy8lUFJPVE8yX1RFU1RfSEFTX0ZJRUxEKERvdWJsZSwgMS4wLCAwLjApCi0vLyVQUk9UTzJfVEVTVF9IQVNfRklFTEQoQm9vbCwgWUVTLCBOTykKLS8vJVBST1RPMl9URVNUX0hBU19GSUVMRChTdHJpbmcsIEAiZm9vIiwgQCIiKQotLy8lUFJPVE8yX1RFU1RfSEFTX0ZJRUxEKEJ5dGVzLCBbQCJmb28iIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXSwgW05TRGF0YSBkYXRhXSkKLS8vJSAgLy8KLS8vJSAgLy8gVGVzdCBkb2Vzbid0IGFwcGx5IHRvIG9wdGlvbmFsR3JvdXAvb3B0aW9uYWxNZXNzYWdlLgotLy8lICAvLwotLy8lCi0vLyVQUk9UTzJfVEVTVF9IQVNfRklFTEQoRW51bSwgTWVzc2FnZTJfRW51bV9CYXIsIE1lc3NhZ2UyX0VudW1fRm9vKQotLy8lUERETS1FWFBBTkQgUFJPVE8yX1RFU1RfSEFTX0ZJRUxEUygpCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotICB7ICAvLyBvcHRpb25hbEludDMyIDo6IDEKLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsSW50MzIpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsSW50MzIpKTsKLSAgICBtc2cub3B0aW9uYWxJbnQzMiA9IDE7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxJbnQzMik7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEludDMyKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotICB7ICAvLyBvcHRpb25hbEludDMyIDo6IDAKLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsSW50MzIpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsSW50MzIpKTsKLSAgICBtc2cub3B0aW9uYWxJbnQzMiA9IDA7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxJbnQzMik7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEludDMyKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsSW50NjQgOjogMQotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxJbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxJbnQ2NCkpOwotICAgIG1zZy5vcHRpb25hbEludDY0ID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEludDY0KTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsSW50NjQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0gIHsgIC8vIG9wdGlvbmFsSW50NjQgOjogMAotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxJbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxJbnQ2NCkpOwotICAgIG1zZy5vcHRpb25hbEludDY0ID0gMDsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEludDY0KTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsSW50NjQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxVaW50MzIgOjogMQotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxVaW50MzIpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsVWludDMyKSk7Ci0gICAgbXNnLm9wdGlvbmFsVWludDMyID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbFVpbnQzMik7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFVpbnQzMikpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLSAgeyAgLy8gb3B0aW9uYWxVaW50MzIgOjogMAotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxVaW50MzIpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsVWludDMyKSk7Ci0gICAgbXNnLm9wdGlvbmFsVWludDMyID0gMDsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbFVpbnQzMik7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFVpbnQzMikpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbFVpbnQ2NCA6OiAxCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbFVpbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxVaW50NjQpKTsKLSAgICBtc2cub3B0aW9uYWxVaW50NjQgPSAxOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsVWludDY0KTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsVWludDY0KSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotICB7ICAvLyBvcHRpb25hbFVpbnQ2NCA6OiAwCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbFVpbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxVaW50NjQpKTsKLSAgICBtc2cub3B0aW9uYWxVaW50NjQgPSAwOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsVWludDY0KTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsVWludDY0KSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsU2ludDMyIDo6IDEKLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsU2ludDMyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNpbnQzMikpOwotICAgIG1zZy5vcHRpb25hbFNpbnQzMiA9IDE7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxTaW50MzIpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxTaW50MzIpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0gIHsgIC8vIG9wdGlvbmFsU2ludDMyIDo6IDAKLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsU2ludDMyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNpbnQzMikpOwotICAgIG1zZy5vcHRpb25hbFNpbnQzMiA9IDA7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxTaW50MzIpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxTaW50MzIpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxTaW50NjQgOjogMQotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxTaW50NjQpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsU2ludDY0KSk7Ci0gICAgbXNnLm9wdGlvbmFsU2ludDY0ID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbFNpbnQ2NCk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNpbnQ2NCkpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLSAgeyAgLy8gb3B0aW9uYWxTaW50NjQgOjogMAotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxTaW50NjQpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsU2ludDY0KSk7Ci0gICAgbXNnLm9wdGlvbmFsU2ludDY0ID0gMDsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbFNpbnQ2NCk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNpbnQ2NCkpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbEZpeGVkMzIgOjogMQotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxGaXhlZDMyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEZpeGVkMzIpKTsKLSAgICBtc2cub3B0aW9uYWxGaXhlZDMyID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEZpeGVkMzIpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxGaXhlZDMyKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotICB7ICAvLyBvcHRpb25hbEZpeGVkMzIgOjogMAotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxGaXhlZDMyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEZpeGVkMzIpKTsKLSAgICBtc2cub3B0aW9uYWxGaXhlZDMyID0gMDsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEZpeGVkMzIpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxGaXhlZDMyKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsRml4ZWQ2NCA6OiAxCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEZpeGVkNjQpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsRml4ZWQ2NCkpOwotICAgIG1zZy5vcHRpb25hbEZpeGVkNjQgPSAxOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsRml4ZWQ2NCk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEZpeGVkNjQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0gIHsgIC8vIG9wdGlvbmFsRml4ZWQ2NCA6OiAwCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEZpeGVkNjQpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsRml4ZWQ2NCkpOwotICAgIG1zZy5vcHRpb25hbEZpeGVkNjQgPSAwOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsRml4ZWQ2NCk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEZpeGVkNjQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxTZml4ZWQzMiA6OiAxCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbFNmaXhlZDMyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNmaXhlZDMyKSk7Ci0gICAgbXNnLm9wdGlvbmFsU2ZpeGVkMzIgPSAxOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsU2ZpeGVkMzIpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxTZml4ZWQzMikpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLSAgeyAgLy8gb3B0aW9uYWxTZml4ZWQzMiA6OiAwCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbFNmaXhlZDMyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNmaXhlZDMyKSk7Ci0gICAgbXNnLm9wdGlvbmFsU2ZpeGVkMzIgPSAwOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsU2ZpeGVkMzIpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxTZml4ZWQzMikpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbFNmaXhlZDY0IDo6IDEKLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsU2ZpeGVkNjQpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsU2ZpeGVkNjQpKTsKLSAgICBtc2cub3B0aW9uYWxTZml4ZWQ2NCA9IDE7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxTZml4ZWQ2NCk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNmaXhlZDY0KSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotICB7ICAvLyBvcHRpb25hbFNmaXhlZDY0IDo6IDAKLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsU2ZpeGVkNjQpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsU2ZpeGVkNjQpKTsKLSAgICBtc2cub3B0aW9uYWxTZml4ZWQ2NCA9IDA7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxTZml4ZWQ2NCk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbFNmaXhlZDY0KSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsRmxvYXQgOjogMS4wZgotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxGbG9hdCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxGbG9hdCkpOwotICAgIG1zZy5vcHRpb25hbEZsb2F0ID0gMS4wZjsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEZsb2F0KTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsRmxvYXQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0gIHsgIC8vIG9wdGlvbmFsRmxvYXQgOjogMC4wZgotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxGbG9hdCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxGbG9hdCkpOwotICAgIG1zZy5vcHRpb25hbEZsb2F0ID0gMC4wZjsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEZsb2F0KTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsRmxvYXQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxEb3VibGUgOjogMS4wCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbERvdWJsZSk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxEb3VibGUpKTsKLSAgICBtc2cub3B0aW9uYWxEb3VibGUgPSAxLjA7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxEb3VibGUpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxEb3VibGUpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0gIHsgIC8vIG9wdGlvbmFsRG91YmxlIDo6IDAuMAotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxEb3VibGUpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsRG91YmxlKSk7Ci0gICAgbXNnLm9wdGlvbmFsRG91YmxlID0gMC4wOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsRG91YmxlKTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsRG91YmxlKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsQm9vbCA6OiBZRVMKLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsQm9vbCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxCb29sKSk7Ci0gICAgbXNnLm9wdGlvbmFsQm9vbCA9IFlFUzsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEJvb2wpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxCb29sKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotICB7ICAvLyBvcHRpb25hbEJvb2wgOjogTk8KLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsQm9vbCk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxCb29sKSk7Ci0gICAgbXNnLm9wdGlvbmFsQm9vbCA9IE5POwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsQm9vbCk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEJvb2wpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxTdHJpbmcgOjogQCJmb28iCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbFN0cmluZyk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxTdHJpbmcpKTsKLSAgICBtc2cub3B0aW9uYWxTdHJpbmcgPSBAImZvbyI7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxTdHJpbmcpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxTdHJpbmcpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0gIHsgIC8vIG9wdGlvbmFsU3RyaW5nIDo6IEAiIgotICAgIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxTdHJpbmcpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsU3RyaW5nKSk7Ci0gICAgbXNnLm9wdGlvbmFsU3RyaW5nID0gQCIiOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsU3RyaW5nKTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsU3RyaW5nKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsQnl0ZXMgOjogW0AiZm9vIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ10KLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsQnl0ZXMpOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsQnl0ZXMpKTsKLSAgICBtc2cub3B0aW9uYWxCeXRlcyA9IFtAImZvbyIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsQnl0ZXMpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxCeXRlcykpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLSAgeyAgLy8gb3B0aW9uYWxCeXRlcyA6OiBbTlNEYXRhIGRhdGFdCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEJ5dGVzKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEJ5dGVzKSk7Ci0gICAgbXNnLm9wdGlvbmFsQnl0ZXMgPSBbTlNEYXRhIGRhdGFdOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsQnl0ZXMpOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxCeXRlcykpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICAvLwotICAvLyBUZXN0IGRvZXNuJ3QgYXBwbHkgdG8gb3B0aW9uYWxHcm91cC9vcHRpb25hbE1lc3NhZ2UuCi0gIC8vCi0KLSAgeyAgLy8gb3B0aW9uYWxFbnVtIDo6IE1lc3NhZ2UyX0VudW1fQmFyCi0gICAgTWVzc2FnZTIgKm1zZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEVudW0pOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09wdGlvbmFsRW51bSkpOwotICAgIG1zZy5vcHRpb25hbEVudW0gPSBNZXNzYWdlMl9FbnVtX0JhcjsKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEVudW0pOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxFbnVtKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotICB7ICAvLyBvcHRpb25hbEVudW0gOjogTWVzc2FnZTJfRW51bV9Gb28KLSAgICBNZXNzYWdlMiAqbXNnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsRW51bSk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxFbnVtKSk7Ci0gICAgbXNnLm9wdGlvbmFsRW51bSA9IE1lc3NhZ2UyX0VudW1fRm9vOwotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsRW51bSk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlMl9GaWVsZE51bWJlcl9PcHRpb25hbEVudW0pKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLS8vJVBERE0tRVhQQU5ELUVORCBQUk9UTzJfVEVTVF9IQVNfRklFTERTKCkKLX0KLQotLSAodm9pZCl0ZXN0UHJvdG8zU2luZ2xlRmllbGRIYXNCZWhhdmlvciB7Ci0gIC8vCi0gIC8vIFNldHRpbmcgdG8gYW55IHZhbHVlIGluY2x1ZGluZyB0aGUgZGVmYXVsdCB2YWx1ZSAoMCkgc2hvdWxkIHJlc3VsdCBoYXMqCi0gIC8vIGJlaW5nIHRydWUuCi0gIC8vCi0KLS8vJVBERE0tREVGSU5FIFBST1RPM19URVNUX0hBU19GSUVMRChGSUVMRCwgTk9OX1pFUk9fVkFMVUUsIFpFUk9fVkFMVUUpCi0vLyUgIHsgIC8vIG9wdGlvbmFsIyNGSUVMRAotLy8lICAgIE1lc3NhZ2UzICptc2cgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLS8vJSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbCMjRklFTEQpKTsKLS8vJSAgICBtc2cub3B0aW9uYWwjI0ZJRUxEID0gTk9OX1pFUk9fVkFMVUU7Ci0vLyUgICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbCMjRklFTEQpKTsKLS8vJSAgICBtc2cub3B0aW9uYWwjI0ZJRUxEID0gWkVST19WQUxVRTsKLS8vJSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbCMjRklFTEQpKTsKLS8vJSAgICBbbXNnIHJlbGVhc2VdOwotLy8lICB9Ci0vLyUKLS8vJVBERE0tREVGSU5FIFBST1RPM19URVNUX0hBU19GSUVMRFMoKQotLy8lUFJPVE8zX1RFU1RfSEFTX0ZJRUxEKEludDMyLCAxLCAwKQotLy8lUFJPVE8zX1RFU1RfSEFTX0ZJRUxEKEludDY0LCAxLCAwKQotLy8lUFJPVE8zX1RFU1RfSEFTX0ZJRUxEKFVpbnQzMiwgMSwgMCkKLS8vJVBST1RPM19URVNUX0hBU19GSUVMRChVaW50NjQsIDEsIDApCi0vLyVQUk9UTzNfVEVTVF9IQVNfRklFTEQoU2ludDMyLCAxLCAwKQotLy8lUFJPVE8zX1RFU1RfSEFTX0ZJRUxEKFNpbnQ2NCwgMSwgMCkKLS8vJVBST1RPM19URVNUX0hBU19GSUVMRChGaXhlZDMyLCAxLCAwKQotLy8lUFJPVE8zX1RFU1RfSEFTX0ZJRUxEKEZpeGVkNjQsIDEsIDApCi0vLyVQUk9UTzNfVEVTVF9IQVNfRklFTEQoU2ZpeGVkMzIsIDEsIDApCi0vLyVQUk9UTzNfVEVTVF9IQVNfRklFTEQoU2ZpeGVkNjQsIDEsIDApCi0vLyVQUk9UTzNfVEVTVF9IQVNfRklFTEQoRmxvYXQsIDEuMGYsIDAuMGYpCi0vLyVQUk9UTzNfVEVTVF9IQVNfRklFTEQoRG91YmxlLCAxLjAsIDAuMCkKLS8vJVBST1RPM19URVNUX0hBU19GSUVMRChCb29sLCBZRVMsIE5PKQotLy8lUFJPVE8zX1RFU1RfSEFTX0ZJRUxEKFN0cmluZywgQCJmb28iLCBAIiIpCi0vLyVQUk9UTzNfVEVTVF9IQVNfRklFTEQoQnl0ZXMsIFtAImZvbyIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddLCBbTlNEYXRhIGRhdGFdKQotLy8lICAvLwotLy8lICAvLyBUZXN0IGRvZXNuJ3QgYXBwbHkgdG8gb3B0aW9uYWxHcm91cC9vcHRpb25hbE1lc3NhZ2UuCi0vLyUgIC8vCi0vLyUKLS8vJVBST1RPM19URVNUX0hBU19GSUVMRChFbnVtLCBNZXNzYWdlM19FbnVtX0JhciwgTWVzc2FnZTNfRW51bV9Gb28pCi0vLyVQRERNLUVYUEFORCBQUk9UTzNfVEVTVF9IQVNfRklFTERTKCkKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0gIHsgIC8vIG9wdGlvbmFsSW50MzIKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxJbnQzMikpOwotICAgIG1zZy5vcHRpb25hbEludDMyID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsSW50MzIpKTsKLSAgICBtc2cub3B0aW9uYWxJbnQzMiA9IDA7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxJbnQzMikpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbEludDY0Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtbTWVzc2FnZTMgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsSW50NjQpKTsKLSAgICBtc2cub3B0aW9uYWxJbnQ2NCA9IDE7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbEludDY0KSk7Ci0gICAgbXNnLm9wdGlvbmFsSW50NjQgPSAwOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsSW50NjQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxVaW50MzIKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxVaW50MzIpKTsKLSAgICBtc2cub3B0aW9uYWxVaW50MzIgPSAxOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxVaW50MzIpKTsKLSAgICBtc2cub3B0aW9uYWxVaW50MzIgPSAwOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsVWludDMyKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsVWludDY0Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtbTWVzc2FnZTMgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsVWludDY0KSk7Ci0gICAgbXNnLm9wdGlvbmFsVWludDY0ID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsVWludDY0KSk7Ci0gICAgbXNnLm9wdGlvbmFsVWludDY0ID0gMDsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbFVpbnQ2NCkpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbFNpbnQzMgotICAgIE1lc3NhZ2UzICptc2cgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbFNpbnQzMikpOwotICAgIG1zZy5vcHRpb25hbFNpbnQzMiA9IDE7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbFNpbnQzMikpOwotICAgIG1zZy5vcHRpb25hbFNpbnQzMiA9IDA7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxTaW50MzIpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxTaW50NjQKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxTaW50NjQpKTsKLSAgICBtc2cub3B0aW9uYWxTaW50NjQgPSAxOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxTaW50NjQpKTsKLSAgICBtc2cub3B0aW9uYWxTaW50NjQgPSAwOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsU2ludDY0KSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsRml4ZWQzMgotICAgIE1lc3NhZ2UzICptc2cgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbEZpeGVkMzIpKTsKLSAgICBtc2cub3B0aW9uYWxGaXhlZDMyID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsRml4ZWQzMikpOwotICAgIG1zZy5vcHRpb25hbEZpeGVkMzIgPSAwOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsRml4ZWQzMikpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbEZpeGVkNjQKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxGaXhlZDY0KSk7Ci0gICAgbXNnLm9wdGlvbmFsRml4ZWQ2NCA9IDE7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbEZpeGVkNjQpKTsKLSAgICBtc2cub3B0aW9uYWxGaXhlZDY0ID0gMDsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbEZpeGVkNjQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxTZml4ZWQzMgotICAgIE1lc3NhZ2UzICptc2cgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbFNmaXhlZDMyKSk7Ci0gICAgbXNnLm9wdGlvbmFsU2ZpeGVkMzIgPSAxOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxTZml4ZWQzMikpOwotICAgIG1zZy5vcHRpb25hbFNmaXhlZDMyID0gMDsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbFNmaXhlZDMyKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9wdGlvbmFsU2ZpeGVkNjQKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxTZml4ZWQ2NCkpOwotICAgIG1zZy5vcHRpb25hbFNmaXhlZDY0ID0gMTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsU2ZpeGVkNjQpKTsKLSAgICBtc2cub3B0aW9uYWxTZml4ZWQ2NCA9IDA7Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxTZml4ZWQ2NCkpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbEZsb2F0Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtbTWVzc2FnZTMgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsRmxvYXQpKTsKLSAgICBtc2cub3B0aW9uYWxGbG9hdCA9IDEuMGY7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbEZsb2F0KSk7Ci0gICAgbXNnLm9wdGlvbmFsRmxvYXQgPSAwLjBmOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsRmxvYXQpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxEb3VibGUKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxEb3VibGUpKTsKLSAgICBtc2cub3B0aW9uYWxEb3VibGUgPSAxLjA7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbERvdWJsZSkpOwotICAgIG1zZy5vcHRpb25hbERvdWJsZSA9IDAuMDsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbERvdWJsZSkpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbEJvb2wKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxCb29sKSk7Ci0gICAgbXNnLm9wdGlvbmFsQm9vbCA9IFlFUzsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsQm9vbCkpOwotICAgIG1zZy5vcHRpb25hbEJvb2wgPSBOTzsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbEJvb2wpKTsKLSAgICBbbXNnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb3B0aW9uYWxTdHJpbmcKLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxTdHJpbmcpKTsKLSAgICBtc2cub3B0aW9uYWxTdHJpbmcgPSBAImZvbyI7Ci0gICAgWENUQXNzZXJ0VHJ1ZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbFN0cmluZykpOwotICAgIG1zZy5vcHRpb25hbFN0cmluZyA9IEAiIjsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbFN0cmluZykpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvcHRpb25hbEJ5dGVzCi0gICAgTWVzc2FnZTMgKm1zZyA9IFtbTWVzc2FnZTMgYWxsb2NdIGluaXRdOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsQnl0ZXMpKTsKLSAgICBtc2cub3B0aW9uYWxCeXRlcyA9IFtAImZvbyIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxCeXRlcykpOwotICAgIG1zZy5vcHRpb25hbEJ5dGVzID0gW05TRGF0YSBkYXRhXTsKLSAgICBYQ1RBc3NlcnRGYWxzZShHUEJNZXNzYWdlSGFzRmllbGROdW1iZXJTZXQobXNnLCBNZXNzYWdlM19GaWVsZE51bWJlcl9PcHRpb25hbEJ5dGVzKSk7Ci0gICAgW21zZyByZWxlYXNlXTsKLSAgfQotCi0gIC8vCi0gIC8vIFRlc3QgZG9lc24ndCBhcHBseSB0byBvcHRpb25hbEdyb3VwL29wdGlvbmFsTWVzc2FnZS4KLSAgLy8KLQotICB7ICAvLyBvcHRpb25hbEVudW0KLSAgICBNZXNzYWdlMyAqbXNnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgWENUQXNzZXJ0RmFsc2UoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxFbnVtKSk7Ci0gICAgbXNnLm9wdGlvbmFsRW51bSA9IE1lc3NhZ2UzX0VudW1fQmFyOwotICAgIFhDVEFzc2VydFRydWUoR1BCTWVzc2FnZUhhc0ZpZWxkTnVtYmVyU2V0KG1zZywgTWVzc2FnZTNfRmllbGROdW1iZXJfT3B0aW9uYWxFbnVtKSk7Ci0gICAgbXNnLm9wdGlvbmFsRW51bSA9IE1lc3NhZ2UzX0VudW1fRm9vOwotICAgIFhDVEFzc2VydEZhbHNlKEdQQk1lc3NhZ2VIYXNGaWVsZE51bWJlclNldChtc2csIE1lc3NhZ2UzX0ZpZWxkTnVtYmVyX09wdGlvbmFsRW51bSkpOwotICAgIFttc2cgcmVsZWFzZV07Ci0gIH0KLQotLy8lUERETS1FWFBBTkQtRU5EIFBST1RPM19URVNUX0hBU19GSUVMRFMoKQotfQotCi0tICh2b2lkKXRlc3RBY2Nlc3NpbmdQcm90bzJVbmtub3duRW51bVZhbHVlcyB7Ci0gIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLQotICAvLyBTZXQgaXQgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0cnkgYW5kIGNvbmZpcm0gaXQgZG9lc24ndCBjaGFuZ2UuCi0KLSAgbXNnLm9wdGlvbmFsRW51bSA9IE1lc3NhZ2UyX0VudW1fQmFyOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKG1zZy5vcHRpb25hbEVudW0gPSA2NjYsIE5TRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsRW51bSwgTWVzc2FnZTJfRW51bV9CYXIpOwotCi0gIG1zZy5vbmVvZkVudW0gPSBNZXNzYWdlMl9FbnVtX0JhcjsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChtc2cub25lb2ZFbnVtID0gNjY2LCBOU0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW1fQmFyKTsKLQotICBbbXNnIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RBY2Nlc3NpbmdQcm90bzNVbmtub3duRW51bVZhbHVlcyB7Ci0gIE1lc3NhZ2UzICptc2cgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLQotICAvLyBTZXQgaXQgdG8gc29tZXRoaW5nIG5vbiB6ZXJvLCB0cnkgYW5kIGNvbmZpcm0gaXQgZG9lc24ndCBjaGFuZ2UuCi0KLSAgbXNnLm9wdGlvbmFsRW51bSA9IE1lc3NhZ2UzX0VudW1fQmFyOwotICBYQ1RBc3NlcnRUaHJvd3NTcGVjaWZpY05hbWVkKG1zZy5vcHRpb25hbEVudW0gPSA2NjYsIE5TRXhjZXB0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5TSW52YWxpZEFyZ3VtZW50RXhjZXB0aW9uKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsRW51bSwgTWVzc2FnZTNfRW51bV9CYXIpOwotCi0gIG1zZy5vbmVvZkVudW0gPSBNZXNzYWdlM19FbnVtX0JhcjsKLSAgWENUQXNzZXJ0VGhyb3dzU3BlY2lmaWNOYW1lZChtc2cub25lb2ZFbnVtID0gNjY2LCBOU0V4Y2VwdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOU0ludmFsaWRBcmd1bWVudEV4Y2VwdGlvbik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fQmFyKTsKLQotICAvLyBTZXQgdmlhIHJhdyBhcGkgdG8gY29uZmlybSBpdCB3b3Jrcy4KLQotICBTZXRNZXNzYWdlM19PcHRpb25hbEVudW1fUmF3VmFsdWUobXNnLCA2NjYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxFbnVtLAotICAgICAgICAgICAgICAgICBNZXNzYWdlM19FbnVtX0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydEVxdWFsKE1lc3NhZ2UzX09wdGlvbmFsRW51bV9SYXdWYWx1ZShtc2cpLCA2NjYpOwotCi0gIFNldE1lc3NhZ2UzX09uZW9mRW51bV9SYXdWYWx1ZShtc2csIDY2Nik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoTWVzc2FnZTNfT25lb2ZFbnVtX1Jhd1ZhbHVlKG1zZyksIDY2Nik7Ci0KLSAgW21zZyByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UHJvdG8yT25lb2ZCYXNpY0JlaGF2aW9ycyB7Ci0gIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLQotICBOU1N0cmluZyAqb25lb2ZTdHJpbmdEZWZhdWx0ID0gQCJzdHJpbmciOwotICBOU0RhdGEgKm9uZW9mQnl0ZXNEZWZhdWx0ID0gW0AiZGF0YSIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotCi0gIC8vIE5vdGhpbmcgc2V0LgotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfR1BCVW5zZXRPbmVPZkNhc2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMTAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDEwMSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMTAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMTAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMTA0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAxMDUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAxMDZVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMTA3VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAxMDgpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMTA5KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMTExLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0KLSAgLy8gU2V0LCBjaGVjayB0aGUgY2FzZSwgY2hlY2sgZXZlcnlvbmUgaGFzIGRlZmF1bHQgYnV0IHRoZSBvbmUsIGNvbmZpcm0gY2FzZQotICAvLyBkaWRuJ3QgY2hhbmdlLgotCi0gIG1zZy5vbmVvZkludDMyID0gMTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mSW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZHcm91cCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZJbnQzMik7Ci0KLSAgbXNnLm9uZW9mSW50NjQgPSAyOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZJbnQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAxMDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMTAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMTAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMTA0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAxMDUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAxMDZVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMTA3VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAxMDgpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMTA5KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMTExLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkludDY0KTsKLQotICBtc2cub25lb2ZVaW50MzIgPSAzOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZVaW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMTAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDEwMSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZHcm91cCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZVaW50MzIpOwotCi0gIG1zZy5vbmVvZlVpbnQ2NCA9IDQ7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAxMDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMTAxKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDMyLCAxMDJVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCA0VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMTA0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAxMDUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAxMDZVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMTA3VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAxMDgpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMTA5KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMTExLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NCk7Ci0KLSAgbXNnLm9uZW9mU2ludDMyID0gNTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDEwNSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDEwNlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAxMDdVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDEwOCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAxMDkpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMTEwLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAxMTEuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mR3JvdXApOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW1fQmF6KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ludDMyKTsKLQotICBtc2cub25lb2ZTaW50NjQgPSA2OwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTaW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMTAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDEwMSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMTAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMTAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMTA0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCA2KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZHcm91cCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTaW50NjQpOwotCi0gIG1zZy5vbmVvZkZpeGVkMzIgPSA3OwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAxMDdVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDEwOCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAxMDkpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMTEwLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAxMTEuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mR3JvdXApOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW1fQmF6KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRml4ZWQzMik7Ci0KLSAgbXNnLm9uZW9mRml4ZWQ2NCA9IDg7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMTAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDEwMSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMTAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMTAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMTA0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAxMDUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAxMDZVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgOFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZHcm91cCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDY0KTsKLQotICBtc2cub25lb2ZTZml4ZWQzMiA9IDk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAxMDkpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMTEwLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAxMTEuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mR3JvdXApOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW1fQmF6KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkMzIpOwotCi0gIG1zZy5vbmVvZlNmaXhlZDY0ID0gMTA7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMTExLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDY0KTsKLQotICBtc2cub25lb2ZGbG9hdCA9IDExLjBmOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAxMDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMTAxKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDMyLCAxMDJVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCAxMDNVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAxMDQpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDEwNSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDEwNlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAxMDdVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDEwOCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAxMDkpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMTEuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZHcm91cCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCk7Ci0KLSAgbXNnLm9uZW9mRG91YmxlID0gMTIuMDsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRG91YmxlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDEyLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkRvdWJsZSk7Ci0KLSAgbXNnLm9uZW9mQm9vbCA9IE5POwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZCb29sKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtX0Jheik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkJvb2wpOwotCi0gIG1zZy5vbmVvZlN0cmluZyA9IEAiZm9vIjsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU3RyaW5nKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgQCJmb28iKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZHcm91cCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTdHJpbmcpOwotCi0gIG1zZy5vbmVvZkJ5dGVzID0gW0AiYmFyIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkJ5dGVzKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgW0AiYmFyIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ10pOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mR3JvdXApOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW1fQmF6KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mQnl0ZXMpOwotCi0gIE1lc3NhZ2UyX09uZW9mR3JvdXAgKmdyb3VwID0gW01lc3NhZ2UyX09uZW9mR3JvdXAgbWVzc2FnZV07Ci0gIG1zZy5vbmVvZkdyb3VwID0gZ3JvdXA7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkdyb3VwLCBncm91cCk7ICAvLyBQb2ludGVyIGNvbXBhcmUuCi0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZHcm91cCk7Ci0KLSAgTWVzc2FnZTIgKnN1Yk1lc3NhZ2UgPSBbTWVzc2FnZTIgbWVzc2FnZV07Ci0gIG1zZy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEwMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAxMDEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDEwMlUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDEwM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDEwNCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMTA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMTA2VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDEwN1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMTA4KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDEwOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAxMTAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDExMS4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZHcm91cCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZy5vbmVvZkdyb3VwLCBncm91cCk7ICAgICAgLy8gUG9pbnRlciBjb21wYXJlLgotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZNZXNzYWdlLCBzdWJNZXNzYWdlKTsgIC8vIFBvaW50ZXIgY29tcGFyZS4KLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXopOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZNZXNzYWdlKTsKLQotICBtc2cub25lb2ZFbnVtID0gTWVzc2FnZTJfRW51bV9CYXI7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkVudW0pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMTAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDEwMSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMTAyVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMTAzVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMTA0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAxMDUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAxMDZVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMTA3VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAxMDgpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMTA5KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMTExLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnLm9uZW9mR3JvdXAsIGdyb3VwKTsgIC8vIFBvaW50ZXIgY29tcGFyZS4KLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cub25lb2ZNZXNzYWdlLCBzdWJNZXNzYWdlKTsgIC8vIFBvaW50ZXIgY29tcGFyZS4KLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXIpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZFbnVtKTsKLQotICAvLyBUZXN0IHNldHRpbmcvY2FsbGluZyBjbGVhciBjbGVhcmluZy4KLQotICBbbXNnIHJlbGVhc2VdOwotICBtc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLQotICB1aW50MzJfdCB2YWx1ZXNbXSA9IHsKLSAgICBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkludDMyLAotICAgIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mSW50NjQsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZVaW50MzIsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZVaW50NjQsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTaW50MzIsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTaW50NjQsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDMyLAotICAgIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRml4ZWQ2NCwKLSAgICBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDMyLAotICAgIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCwKLSAgICBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkRvdWJsZSwKLSAgICBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkJvb2wsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTdHJpbmcsCi0gICAgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZCeXRlcywKLSAgICBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkdyb3VwLAotICAgIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mTWVzc2FnZSwKLSAgICBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkVudW0sCi0gIH07Ci0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBHUEJBUlJBWVNJWkUodmFsdWVzKTsgKytpKSB7Ci0gICAgc3dpdGNoICh2YWx1ZXNbaV0pIHsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZJbnQzMjoKLSAgICAgICAgbXNnLm9uZW9mSW50MzIgPSAxOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZJbnQ2NDoKLSAgICAgICAgbXNnLm9uZW9mSW50NjQgPSAyOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZVaW50MzI6Ci0gICAgICAgIG1zZy5vbmVvZlVpbnQzMiA9IDM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NDoKLSAgICAgICAgbXNnLm9uZW9mVWludDY0ID0gNDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ludDMyOgotICAgICAgICBtc2cub25lb2ZTaW50MzIgPSA1OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTaW50NjQ6Ci0gICAgICAgIG1zZy5vbmVvZlNpbnQ2NCA9IDY7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkZpeGVkMzI6Ci0gICAgICAgIG1zZy5vbmVvZkZpeGVkMzIgPSA3OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDY0OgotICAgICAgICBtc2cub25lb2ZGaXhlZDY0ID0gODsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkMzI6Ci0gICAgICAgIG1zZy5vbmVvZlNmaXhlZDMyID0gOTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQ6Ci0gICAgICAgIG1zZy5vbmVvZlNmaXhlZDY0ID0gMTA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkZsb2F0OgotICAgICAgICBtc2cub25lb2ZGbG9hdCA9IDExLjBmOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZEb3VibGU6Ci0gICAgICAgIG1zZy5vbmVvZkRvdWJsZSA9IDEyLjA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkJvb2w6Ci0gICAgICAgIG1zZy5vbmVvZkJvb2wgPSBZRVM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlN0cmluZzoKLSAgICAgICAgbXNnLm9uZW9mU3RyaW5nID0gQCJmb28iOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZCeXRlczoKLSAgICAgICAgbXNnLm9uZW9mQnl0ZXMgPSBbQCJiYXIiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mR3JvdXA6Ci0gICAgICAgIG1zZy5vbmVvZkdyb3VwID0gZ3JvdXA7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZk1lc3NhZ2U6Ci0gICAgICAgIG1zZy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZFbnVtOgotICAgICAgICBtc2cub25lb2ZFbnVtID0gTWVzc2FnZTJfRW51bV9CYXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgWENURmFpbChAInNob3VsZG4ndCBoYXBwZW4sIGxvb3A6ICV6ZCwgdmFsdWU6ICVkIiwgaSwgdmFsdWVzW2ldKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIHZhbHVlc1tpXSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlIHdhcyBzZXQsIHRoZSBhYm92ZSB0ZXN0cyBkaWQgdGhhdC4KLSAgICBNZXNzYWdlMl9DbGVhck9PbmVPZkNhc2UobXNnKTsKLSAgICAvLyBOb3RoaW5nIGluIHRoZSBjYXNlLgotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9HUEJVbnNldE9uZU9mQ2FzZSwKLSAgICAgICAgICAgICAgICAgICAiTG9vcDogJXpkIiwgaSk7Ci0gICAgLy8gQ29uZmlybSBldmVyeXRoaW5nIGlzIGJhY2sgdG8gZGVmYXVsdHMgYWZ0ZXIgYSBjbGVhci4KLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMTAwLCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDEwMSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMTAyVSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMTAzVSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMTA0LCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAxMDUsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAxMDZVLCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMTA3VSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAxMDgsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMTA5LCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExMC4wZiwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMTExLjAsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBZRVMsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0LCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZkdyb3VwLCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwobXNnLm9uZW9mR3JvdXAsIGdyb3VwLCAiTG9vcDogJXpkIiwKLSAgICAgICAgICAgICAgICAgICAgICBpKTsgIC8vIFBvaW50ZXIgY29tcGFyZS4KLSAgICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2UsIHN1Yk1lc3NhZ2UsICJMb29wOiAlemQiLAotICAgICAgICAgICAgICAgICAgICAgIGkpOyAgLy8gUG9pbnRlciBjb21wYXJlLgotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW1fQmF6LCAiTG9vcDogJXpkIiwgaSk7Ci0gIH0KLQotICBbbXNnIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RQcm90bzNPbmVvZkJhc2ljQmVoYXZpb3JzIHsKLSAgTWVzc2FnZTMgKm1zZyA9IFtbTWVzc2FnZTMgYWxsb2NdIGluaXRdOwotCi0gIE5TU3RyaW5nICpvbmVvZlN0cmluZ0RlZmF1bHQgPSBAIiI7Ci0gIE5TRGF0YSAqb25lb2ZCeXRlc0RlZmF1bHQgPSBbTlNEYXRhIGRhdGFdOwotCi0gIC8vIE5vdGhpbmcgc2V0LgotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfR1BCVW5zZXRPbmVPZkNhc2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDMyLCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAwLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAwLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fRm9vKTsKLQotICAvLyBTZXQsIGNoZWNrIHRoZSBjYXNlLCBjaGVjayBldmVyeW9uZSBoYXMgZGVmYXVsdCBidXQgdGhlIG9uZSwgY29uZmlybSBjYXNlCi0gIC8vIGRpZG4ndCBjaGFuZ2UuCi0KLSAgbXNnLm9uZW9mSW50MzIgPSAxOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZJbnQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAxKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDAuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9Gb28pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZJbnQzMik7Ci0KLSAgbXNnLm9uZW9mSW50NjQgPSAyOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZJbnQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDIpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDAuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9Gb28pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZJbnQ2NCk7Ci0KLSAgbXNnLm9uZW9mVWludDMyID0gMzsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mVWludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgM1UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtX0Zvbyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlVpbnQzMik7Ci0KLSAgbXNnLm9uZW9mVWludDY0ID0gNDsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mVWludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDRVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtX0Zvbyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NCk7Ci0KLSAgbXNnLm9uZW9mU2ludDMyID0gNTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCA1KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtX0Zvbyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNpbnQzMik7Ci0KLSAgbXNnLm9uZW9mU2ludDY0ID0gNjsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCA2KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtX0Zvbyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNpbnQ2NCk7Ci0KLSAgbXNnLm9uZW9mRml4ZWQzMiA9IDc7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkZpeGVkMzIpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDMyLCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCA3VSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAwLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAwLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fRm9vKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRml4ZWQzMik7Ci0KLSAgbXNnLm9uZW9mRml4ZWQ2NCA9IDg7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDMyLCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDhVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAwLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAwLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fRm9vKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRml4ZWQ2NCk7Ci0KLSAgbXNnLm9uZW9mU2ZpeGVkMzIgPSA5OwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTZml4ZWQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgOSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDAuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9Gb28pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTZml4ZWQzMik7Ci0KLSAgbXNnLm9uZW9mU2ZpeGVkNjQgPSAxMDsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDMyLCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMTApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtX0Zvbyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDY0KTsKLQotICBtc2cub25lb2ZGbG9hdCA9IDExLjBmOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExLjBmKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAwLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fRm9vKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRmxvYXQpOwotCi0gIG1zZy5vbmVvZkRvdWJsZSA9IDEyLjA7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkRvdWJsZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDEyLjApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQpOwotICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fRm9vKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRG91YmxlKTsKLQotICBtc2cub25lb2ZCb29sID0gWUVTOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZCb29sKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgb25lb2ZTdHJpbmdEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9Gb28pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZCb29sKTsKLQotICBtc2cub25lb2ZTdHJpbmcgPSBAImZvbyI7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlN0cmluZyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNpbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkMzIsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQzMiwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDAuMGYpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDAuMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgQCJmb28iKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZkJ5dGVzLCBvbmVvZkJ5dGVzRGVmYXVsdCk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9Gb28pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTdHJpbmcpOwotCi0gIG1zZy5vbmVvZkJ5dGVzID0gW0AiYmFyIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkJ5dGVzKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBbQCJiYXIiIGRhdGFVc2luZ0VuY29kaW5nOk5TVVRGOFN0cmluZ0VuY29kaW5nXSk7Ci0gIFhDVEFzc2VydE5vdE5pbChtc2cub25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9Gb28pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZCeXRlcyk7Ci0KLSAgTWVzc2FnZTMgKnN1Yk1lc3NhZ2UgPSBbTWVzc2FnZTMgbWVzc2FnZV07Ci0gIG1zZy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mTWVzc2FnZSwgc3ViTWVzc2FnZSk7ICAvLyBQb2ludGVyIGNvbXBhcmUuCi0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fRm9vKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mTWVzc2FnZSk7Ci0KLSAgbXNnLm9uZW9mRW51bSA9IE1lc3NhZ2UzX0VudW1fQmFyOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZFbnVtKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQ2NCwgMCk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50NjQsIDBVKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDY0LCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgMFUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDY0LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDMyLCAwKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkNjQsIDApOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgMC4wZik7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkRvdWJsZSwgMC4wKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBvbmVvZlN0cmluZ0RlZmF1bHQpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIG9uZW9mQnl0ZXNEZWZhdWx0KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1zZy5vbmVvZk1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cub25lb2ZNZXNzYWdlLCBzdWJNZXNzYWdlKTsgIC8vIFBvaW50ZXIgY29tcGFyZS4KLSAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTNfRW51bV9CYXIpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZFbnVtKTsKLQotICAvLyBUZXN0IHNldHRpbmcvY2FsbGluZyBjbGVhciBjbGVhcmluZy4KLQotICBbbXNnIHJlbGVhc2VdOwotICBtc2cgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLQotICB1aW50MzJfdCB2YWx1ZXNbXSA9IHsKLSAgICBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkludDMyLAotICAgIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mSW50NjQsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZVaW50MzIsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZVaW50NjQsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTaW50MzIsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTaW50NjQsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDMyLAotICAgIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRml4ZWQ2NCwKLSAgICBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDMyLAotICAgIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCwKLSAgICBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkRvdWJsZSwKLSAgICBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkJvb2wsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTdHJpbmcsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZCeXRlcywKLSAgICBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZk1lc3NhZ2UsCi0gICAgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZFbnVtLAotICB9OwotCi0gIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgR1BCQVJSQVlTSVpFKHZhbHVlcyk7ICsraSkgewotICAgIHN3aXRjaCAodmFsdWVzW2ldKSB7Ci0gICAgICBjYXNlIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mSW50MzI6Ci0gICAgICAgIG1zZy5vbmVvZkludDMyID0gMTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mSW50NjQ6Ci0gICAgICAgIG1zZy5vbmVvZkludDY0ID0gMjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mVWludDMyOgotICAgICAgICBtc2cub25lb2ZVaW50MzIgPSAzOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZVaW50NjQ6Ci0gICAgICAgIG1zZy5vbmVvZlVpbnQ2NCA9IDQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNpbnQzMjoKLSAgICAgICAgbXNnLm9uZW9mU2ludDMyID0gNTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ludDY0OgotICAgICAgICBtc2cub25lb2ZTaW50NjQgPSA2OwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDMyOgotICAgICAgICBtc2cub25lb2ZGaXhlZDMyID0gNzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRml4ZWQ2NDoKLSAgICAgICAgbXNnLm9uZW9mRml4ZWQ2NCA9IDg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDMyOgotICAgICAgICBtc2cub25lb2ZTZml4ZWQzMiA9IDk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDY0OgotICAgICAgICBtc2cub25lb2ZTZml4ZWQ2NCA9IDEwOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGbG9hdDoKLSAgICAgICAgbXNnLm9uZW9mRmxvYXQgPSAxMS4wZjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRG91YmxlOgotICAgICAgICBtc2cub25lb2ZEb3VibGUgPSAxMi4wOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZCb29sOgotICAgICAgICBtc2cub25lb2ZCb29sID0gWUVTOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTdHJpbmc6Ci0gICAgICAgIG1zZy5vbmVvZlN0cmluZyA9IEAiZm9vIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mQnl0ZXM6Ci0gICAgICAgIG1zZy5vbmVvZkJ5dGVzID0gW0AiYmFyIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZk1lc3NhZ2U6Ci0gICAgICAgIG1zZy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZFbnVtOgotICAgICAgICBtc2cub25lb2ZFbnVtID0gTWVzc2FnZTNfRW51bV9CYXo7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgWENURmFpbChAInNob3VsZG4ndCBoYXBwZW4sIGxvb3A6ICV6ZCwgdmFsdWU6ICVkIiwgaSwgdmFsdWVzW2ldKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIHZhbHVlc1tpXSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgdGhlIHZhbHVlIHdhcyBzZXQsIHRoZSBhYm92ZSB0ZXN0cyBkaWQgdGhhdC4KLSAgICBNZXNzYWdlM19DbGVhck9PbmVPZkNhc2UobXNnKTsKLSAgICAvLyBOb3RoaW5nIGluIHRoZSBjYXNlLgotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9HUEJVbnNldE9uZU9mQ2FzZSwKLSAgICAgICAgICAgICAgICAgICAiTG9vcDogJXpkIiwgaSk7Ci0gICAgLy8gQ29uZmlybSBldmVyeXRoaW5nIGlzIGJhY2sgdG8gZGVmYXVsdHMgYWZ0ZXIgYSBjbGVhci4KLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgMCwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDY0LCAwLCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDMyLCAwVSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlVpbnQ2NCwgMFUsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50MzIsIDAsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDAsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGaXhlZDMyLCAwVSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZpeGVkNjQsIDBVLCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDAsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTZml4ZWQ2NCwgMCwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCAwLjBmLCAiTG9vcDogJXpkIiwgaSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRG91YmxlLCAwLjAsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZCb29sLCBOTywgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZTdHJpbmcsIG9uZW9mU3RyaW5nRGVmYXVsdCwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgb25lb2ZCeXRlc0RlZmF1bHQsICJMb29wOiAlemQiLCBpKTsKLSAgICBYQ1RBc3NlcnROb3ROaWwobXNnLm9uZW9mTWVzc2FnZSwgIkxvb3A6ICV6ZCIsIGkpOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2UsIHN1Yk1lc3NhZ2UsICJMb29wOiAlemQiLAotICAgICAgICAgICAgICAgICAgICAgIGkpOyAgLy8gUG9pbnRlciBjb21wYXJlLgotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW1fRm9vLCAiTG9vcDogJXpkIiwgaSk7Ci0gIH0KLQotICBbbXNnIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RDb3B5aW5nTWFrZXNVbmlxdWVPYmplY3RzIHsKLSAgY29uc3QgaW50IHJlcGVhdENvdW50ID0gNTsKLSAgVGVzdEFsbFR5cGVzICptc2cxID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0QWxsRmllbGRzOm1zZzEgcmVwZWF0ZWRDb3VudDpyZXBlYXRDb3VudF07Ci0KLSAgVGVzdEFsbFR5cGVzICptc2cyID0gW1ttc2cxIGNvcHldIGF1dG9yZWxlYXNlXTsKLQotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLCBtc2cyKTsgICAgICAvLyBQdHIgY29tcGFyZSwgbmV3IG9iamVjdC4KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZzEsIG1zZzIpOyAgLy8gRXF1YWwgdmFsdWVzLgotCi0gIC8vIFBvaW50ZXIgY29tcGFyaXNpb25zLCBkaWZmZXJlbnQgb2JqZWN0cy4KLQotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLm9wdGlvbmFsR3JvdXAsIG1zZzIub3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLCBtc2cyLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEub3B0aW9uYWxGb3JlaWduTWVzc2FnZSwgbXNnMi5vcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5vcHRpb25hbEltcG9ydE1lc3NhZ2UsIG1zZzIub3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsKLQotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkSW50MzJBcnJheSwgbXNnMi5yZXBlYXRlZEludDMyQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkSW50NjRBcnJheSwgbXNnMi5yZXBlYXRlZEludDY0QXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkVWludDMyQXJyYXksIG1zZzIucmVwZWF0ZWRVaW50MzJBcnJheSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEucmVwZWF0ZWRVaW50NjRBcnJheSwgbXNnMi5yZXBlYXRlZFVpbnQ2NEFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZFNpbnQzMkFycmF5LCBtc2cyLnJlcGVhdGVkU2ludDMyQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkU2ludDY0QXJyYXksIG1zZzIucmVwZWF0ZWRTaW50NjRBcnJheSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEucmVwZWF0ZWRGaXhlZDMyQXJyYXksIG1zZzIucmVwZWF0ZWRGaXhlZDMyQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkRml4ZWQ2NEFycmF5LCBtc2cyLnJlcGVhdGVkRml4ZWQ2NEFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZFNmaXhlZDMyQXJyYXksIG1zZzIucmVwZWF0ZWRTZml4ZWQzMkFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZFNmaXhlZDY0QXJyYXksIG1zZzIucmVwZWF0ZWRTZml4ZWQ2NEFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZEZsb2F0QXJyYXksIG1zZzIucmVwZWF0ZWRGbG9hdEFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZERvdWJsZUFycmF5LCBtc2cyLnJlcGVhdGVkRG91YmxlQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkQm9vbEFycmF5LCBtc2cyLnJlcGVhdGVkQm9vbEFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZFN0cmluZ0FycmF5LCBtc2cyLnJlcGVhdGVkU3RyaW5nQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkQnl0ZXNBcnJheSwgbXNnMi5yZXBlYXRlZEJ5dGVzQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkR3JvdXBBcnJheSwgbXNnMi5yZXBlYXRlZEdyb3VwQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUFycmF5LAotICAgICAgICAgICAgICAgICAgICBtc2cyLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgIG1zZzIucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheSwKLSAgICAgICAgICAgICAgICAgICAgbXNnMi5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEucmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXksIG1zZzIucmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkRm9yZWlnbkVudW1BcnJheSwKLSAgICAgICAgICAgICAgICAgICAgbXNnMi5yZXBlYXRlZEZvcmVpZ25FbnVtQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5LCBtc2cyLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZFN0cmluZ1BpZWNlQXJyYXksCi0gICAgICAgICAgICAgICAgICAgIG1zZzIucmVwZWF0ZWRTdHJpbmdQaWVjZUFycmF5KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZENvcmRBcnJheSwgbXNnMi5yZXBlYXRlZENvcmRBcnJheSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRDb3VudDsgaSsrKSB7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICBtc2cyLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUFycmF5W2ldKTsKLSAgICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VBcnJheVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICBtc2cyLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VBcnJheVtpXSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheVtpXSwKLSAgICAgICAgICAgICAgICAgICAgICBtc2cyLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5W2ldKTsKLSAgfQotfQotCi0tICh2b2lkKXRlc3RDb3B5aW5nTWFwc01ha2VzVW5pcXVlT2JqZWN0cyB7Ci0gIFRlc3RNYXAgKm1zZzEgPSBbVGVzdE1hcCBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0QWxsTWFwRmllbGRzOm1zZzEgbnVtRW50cmllczo1XTsKLQotICBUZXN0TWFwICptc2cyID0gW1ttc2cxIGNvcHldIGF1dG9yZWxlYXNlXTsKLQotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLCBtc2cyKTsgICAgICAvLyBQdHIgY29tcGFyZSwgbmV3IG9iamVjdC4KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZzEsIG1zZzIpOyAgLy8gRXF1YWwgdmFsdWVzLgotCi0gIC8vIFBvaW50ZXIgY29tcGFyaXNpb25zLCBkaWZmZXJlbnQgb2JqZWN0cy4KLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5tYXBJbnQzMkludDMyLCBtc2cyLm1hcEludDMySW50MzIpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLm1hcEludDY0SW50NjQsIG1zZzIubWFwSW50NjRJbnQ2NCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwVWludDMyVWludDMyLCBtc2cyLm1hcFVpbnQzMlVpbnQzMik7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwVWludDY0VWludDY0LCBtc2cyLm1hcFVpbnQ2NFVpbnQ2NCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwU2ludDMyU2ludDMyLCBtc2cyLm1hcFNpbnQzMlNpbnQzMik7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwU2ludDY0U2ludDY0LCBtc2cyLm1hcFNpbnQ2NFNpbnQ2NCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwRml4ZWQzMkZpeGVkMzIsIG1zZzIubWFwRml4ZWQzMkZpeGVkMzIpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLm1hcEZpeGVkNjRGaXhlZDY0LCBtc2cyLm1hcEZpeGVkNjRGaXhlZDY0KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5tYXBTZml4ZWQzMlNmaXhlZDMyLCBtc2cyLm1hcFNmaXhlZDMyU2ZpeGVkMzIpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLm1hcFNmaXhlZDY0U2ZpeGVkNjQsIG1zZzIubWFwU2ZpeGVkNjRTZml4ZWQ2NCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwSW50MzJGbG9hdCwgbXNnMi5tYXBJbnQzMkZsb2F0KTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobXNnMS5tYXBJbnQzMkRvdWJsZSwgbXNnMi5tYXBJbnQzMkRvdWJsZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwQm9vbEJvb2wsIG1zZzIubWFwQm9vbEJvb2wpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLm1hcFN0cmluZ1N0cmluZywgbXNnMi5tYXBTdHJpbmdTdHJpbmcpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtc2cxLm1hcEludDMyQnl0ZXMsIG1zZzIubWFwSW50MzJCeXRlcyk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwSW50MzJFbnVtLCBtc2cyLm1hcEludDMyRW51bSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzEubWFwSW50MzJGb3JlaWduTWVzc2FnZSwgbXNnMi5tYXBJbnQzMkZvcmVpZ25NZXNzYWdlKTsKLQotICAvLyBFbnN1cmUgdGhlIG1lc3NhZ2VzIGFyZSB1bmlxdWUgcGVyIG1hcC4KLSAgW21zZzEubWFwSW50MzJGb3JlaWduTWVzc2FnZQotICAgICAgZW51bWVyYXRlS2V5c0FuZE9iamVjdHNVc2luZ0Jsb2NrOl4oaW50MzJfdCBrZXksIGlkIHZhbHVlLCBCT09MICpzdG9wKSB7Ci0jcHJhZ21hIHVudXNlZChzdG9wKQotICAgICAgICBGb3JlaWduTWVzc2FnZSAqc3ViTXNnMiA9IFttc2cyLm1hcEludDMyRm9yZWlnbk1lc3NhZ2Ugb2JqZWN0Rm9yS2V5OmtleV07Ci0gICAgICAgIFhDVEFzc2VydE5vdEVxdWFsKHZhbHVlLCBzdWJNc2cyKTsgIC8vIFB0ciBjb21wYXJlLCBuZXcgb2JqZWN0LgotICAgICAgfV07Ci19Ci0KLSNwcmFnbWEgbWFyayAtIFN1YnNldCBmcm9tIGZyb20gbWFwX3Rlc3RzLmNjCi0KLS8vIFRFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBJc0luaXRpYWxpemVkKQotLSAodm9pZCl0ZXN0TWFwX0lzSW5pdGlhbGl6ZWQgewotICBUZXN0UmVxdWlyZWRNZXNzYWdlTWFwICptc2cgPSBbW1Rlc3RSZXF1aXJlZE1lc3NhZ2VNYXAgYWxsb2NdIGluaXRdOwotCi0gIC8vIEFkZCBhbiB1bmluaXRpYWxpemVkIG1lc3NhZ2UuCi0gIFRlc3RSZXF1aXJlZCAqc3ViTXNnID0gW1tUZXN0UmVxdWlyZWQgYWxsb2NdIGluaXRdOwotICBbbXNnLm1hcEZpZWxkIHNldE9iamVjdDpzdWJNc2cgZm9yS2V5OjBdOwotICBYQ1RBc3NlcnRGYWxzZShtc2cuaW5pdGlhbGl6ZWQpOwotCi0gIC8vIEluaXRpYWxpemUgdW5pbml0aWFsaXplZCBtZXNzYWdlCi0gIHN1Yk1zZy5hID0gMDsKLSAgc3ViTXNnLmIgPSAwOwotICBzdWJNc2cuYyA9IDA7Ci0gIFhDVEFzc2VydFRydWUobXNnLmluaXRpYWxpemVkKTsKLQotICBbc3ViTXNnIHJlbGVhc2VdOwotICBbbXNnIHJlbGVhc2VdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQk1lc3NhZ2VUZXN0cytTZXJpYWxpemF0aW9uLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQk1lc3NhZ2VUZXN0cytTZXJpYWxpemF0aW9uLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkODExYTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJNZXNzYWdlVGVzdHMrU2VyaWFsaXphdGlvbi5tCisrKyAvZGV2L251bGwKQEAgLTEsMTEwNSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotCi0jaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KLQotI2ltcG9ydCAiR1BCTWVzc2FnZS5oIgotCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvTWFwUHJvdG8yVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvTWFwVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3REcm9wVW5rbm93bkZpZWxkcy5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdFByZXNlcnZlVW5rbm93bkVudW0ucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RSdW50aW1lUHJvdG8yLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UnVudGltZVByb3RvMy5wYm9iamMuaCIKLQotc3RhdGljIE5TRGF0YSAqRGF0YUZyb21DU3RyKGNvbnN0IGNoYXIgKnN0cikgewotICByZXR1cm4gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOnN0ciBsZW5ndGg6c3RybGVuKHN0cildOwotfQotCi1AaW50ZXJmYWNlIE1lc3NhZ2VTZXJpYWxpemF0aW9uVGVzdHMgOiBHUEJUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gTWVzc2FnZVNlcmlhbGl6YXRpb25UZXN0cwotCi0vLyBUT0RPKHRob21hc3ZsKTogUHVsbCB0ZXN0cyBvdmVyIGZyb20gR1BCTWVzc2FnZVRlc3RzIHRoYXQgYXJlIHNlcmlhbGl6YXRpb24KLS8vIHNwZWNpZmljLgotCi0tICh2b2lkKXRlc3RQcm90bzNTZXJpYWxpemF0aW9uSGFuZGxpbmdEZWZhdWx0cyB7Ci0gIC8vIFByb3RvMiBjb3ZlcmVkIGluIG90aGVyIHRlc3RzLgotCi0gIE1lc3NhZ2UzICptc2cgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLQotICAvLyBBZGQgZGVmYXVsdHMsIG5vIG91dHB1dC4KLQotICBOU0RhdGEgKmRhdGEgPSBbbXNnIGRhdGFdOwotICBYQ1RBc3NlcnRFcXVhbChbZGF0YSBsZW5ndGhdLCAwVSk7Ci0KLSAgLy8gQWxsIHplcm9zLCBzdGlsbCBub3RoaW5nLgotCi0gIG1zZy5vcHRpb25hbEludDMyID0gMDsKLSAgbXNnLm9wdGlvbmFsSW50NjQgPSAwOwotICBtc2cub3B0aW9uYWxVaW50MzIgPSAwOwotICBtc2cub3B0aW9uYWxVaW50NjQgPSAwOwotICBtc2cub3B0aW9uYWxTaW50MzIgPSAwOwotICBtc2cub3B0aW9uYWxTaW50NjQgPSAwOwotICBtc2cub3B0aW9uYWxGaXhlZDMyID0gMDsKLSAgbXNnLm9wdGlvbmFsRml4ZWQ2NCA9IDA7Ci0gIG1zZy5vcHRpb25hbFNmaXhlZDMyID0gMDsKLSAgbXNnLm9wdGlvbmFsU2ZpeGVkNjQgPSAwOwotICBtc2cub3B0aW9uYWxGbG9hdCA9IDAuMGY7Ci0gIG1zZy5vcHRpb25hbERvdWJsZSA9IDAuMDsKLSAgbXNnLm9wdGlvbmFsQm9vbCA9IE5POwotICBtc2cub3B0aW9uYWxTdHJpbmcgPSBAIiI7Ci0gIG1zZy5vcHRpb25hbEJ5dGVzID0gW05TRGF0YSBkYXRhXTsKLSAgbXNnLm9wdGlvbmFsRW51bSA9IE1lc3NhZ2UzX0VudW1fRm9vOyAgLy8gZmlyc3QgdmFsdWUKLQotICBkYXRhID0gW21zZyBkYXRhXTsKLSAgWENUQXNzZXJ0RXF1YWwoW2RhdGEgbGVuZ3RoXSwgMFUpOwotCi0gIC8vIFRoZSB0d28gdGhhdCBhbHNvIHRha2UgbmlsIGFzIG5vdGhpbmcuCi0KLSAgbXNnLm9wdGlvbmFsU3RyaW5nID0gbmlsOwotICBtc2cub3B0aW9uYWxCeXRlcyA9IG5pbDsKLQotICBkYXRhID0gW21zZyBkYXRhXTsKLSAgWENUQXNzZXJ0RXF1YWwoW2RhdGEgbGVuZ3RoXSwgMFUpOwotCi0gIC8vIFNldCBvbmUgZmllbGQuLi4KLQotICBtc2cub3B0aW9uYWxJbnQzMiA9IDE7Ci0KLSAgZGF0YSA9IFttc2cgZGF0YV07Ci0gIGNvbnN0IHVpbnQ4X3QgZXhwZWN0ZWRCeXRlc1tdID0gezB4MDgsIDB4MDF9OwotICBOU0RhdGEgKmV4cGVjdGVkID0gW05TRGF0YSBkYXRhV2l0aEJ5dGVzOmV4cGVjdGVkQnl0ZXMgbGVuZ3RoOjJdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGF0YSwgZXhwZWN0ZWQpOwotCi0gIC8vIEJhY2sgdG8gemVyby4uLgotCi0gIG1zZy5vcHRpb25hbEludDMyID0gMDsKLQotICBkYXRhID0gW21zZyBkYXRhXTsKLSAgWENUQXNzZXJ0RXF1YWwoW2RhdGEgbGVuZ3RoXSwgMFUpOwotCi0gIFttc2cgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFByb3RvM0Ryb3BwaW5nVW5rbm93bkZpZWxkcyB7Ci0gIERyb3BVbmtub3duc0Zvb1dpdGhFeHRyYUZpZWxkcyAqZm9vV2l0aEV4dHJhcyA9Ci0gICAgICBbW0Ryb3BVbmtub3duc0Zvb1dpdGhFeHRyYUZpZWxkcyBhbGxvY10gaW5pdF07Ci0KLSAgZm9vV2l0aEV4dHJhcy5pbnQzMlZhbHVlID0gMTsKLSAgZm9vV2l0aEV4dHJhcy5lbnVtVmFsdWUgPSBEcm9wVW5rbm93bnNGb29XaXRoRXh0cmFGaWVsZHNfTmVzdGVkRW51bV9CYXo7Ci0gIGZvb1dpdGhFeHRyYXMuZXh0cmFJbnQzMlZhbHVlID0gMjsKLQotICBOU0RhdGEgKmRhdGEgPSBbZm9vV2l0aEV4dHJhcyBkYXRhXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICBEcm9wVW5rbm93bnNGb28gKmZvbyA9IFtEcm9wVW5rbm93bnNGb28gcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotCi0gIFhDVEFzc2VydEVxdWFsKGZvby5pbnQzMlZhbHVlLCAxKTsKLSAgWENUQXNzZXJ0RXF1YWwoZm9vLmVudW1WYWx1ZSwgRHJvcFVua25vd25zRm9vX05lc3RlZEVudW1fQmF6KTsKLSAgLy8gTm90aGluZyBzaG91bGQgZW5kIHVwIGluIHRoZSB1bmtub3ducy4KLSAgWENUQXNzZXJ0RXF1YWwoW2Zvby51bmtub3duRmllbGRzIGNvdW50T2ZGaWVsZHNdLCAwVSk7Ci0KLSAgW2Zvb1dpdGhFeHRyYXMgcmVsZWFzZV07Ci0gIGRhdGEgPSBbZm9vIGRhdGFdOwotICBmb29XaXRoRXh0cmFzID0KLSAgICAgIFtEcm9wVW5rbm93bnNGb29XaXRoRXh0cmFGaWVsZHMgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbChmb29XaXRoRXh0cmFzLmludDMyVmFsdWUsIDEpOwotICBYQ1RBc3NlcnRFcXVhbChmb29XaXRoRXh0cmFzLmVudW1WYWx1ZSwKLSAgICAgICAgICAgICAgICAgRHJvcFVua25vd25zRm9vV2l0aEV4dHJhRmllbGRzX05lc3RlZEVudW1fQmF6KTsKLSAgLy8gQW5kIHRoZSBleHRyYSB2YWx1ZSBpcyBnb25lIChiYWNrIHRvIHRoZSBkZWZhdWx0KS4KLSAgWENUQXNzZXJ0RXF1YWwoZm9vV2l0aEV4dHJhcy5leHRyYUludDMyVmFsdWUsIDApOwotICBYQ1RBc3NlcnRFcXVhbChbZm9vLnVua25vd25GaWVsZHMgY291bnRPZkZpZWxkc10sIDBVKTsKLX0KLQotLSAodm9pZCl0ZXN0UHJvdG8yVW5rbm93bkVudW1Ub1Vua25vd25GaWVsZCB7Ci0gIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0KLSAgb3JpZy5vcHRpb25hbEVudW0gPSBNZXNzYWdlM19FbnVtX0V4dHJhMzsKLSAgb3JpZy5yZXBlYXRlZEVudW1BcnJheSA9Ci0gICAgICBbR1BCRW51bUFycmF5IGFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpNZXNzYWdlM19FbnVtX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmF3VmFsdWU6TWVzc2FnZTNfRW51bV9FeHRyYTNdOwotICBvcmlnLm9uZW9mRW51bSA9IE1lc3NhZ2UzX0VudW1fRXh0cmEzOwotCi0gIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLQotICAvLyBOb25lIG9mIHRoZSBmaWVsZHMgc2hvdWxkIGJlIHNldC4KLQotICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxFbnVtKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkRW51bUFycmF5LmNvdW50LCAwVSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9HUEJVbnNldE9uZU9mQ2FzZSk7Ci0KLSAgLy8gQWxsIHRoZSB2YWx1ZXMgc2hvdWxkIGJlIGluIHVua25vd24gZmllbGRzLgotCi0gIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bkZpZWxkcyA9IG1zZy51bmtub3duRmllbGRzOwotCi0gIFhDVEFzc2VydEVxdWFsKFt1bmtub3duRmllbGRzIGNvdW50T2ZGaWVsZHNdLCAzVSk7Ci0gIFhDVEFzc2VydFRydWUoW3Vua25vd25GaWVsZHMgaGFzRmllbGQ6TWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxFbnVtXSk7Ci0gIFhDVEFzc2VydFRydWUoCi0gICAgICBbdW5rbm93bkZpZWxkcyBoYXNGaWVsZDpNZXNzYWdlMl9GaWVsZE51bWJlcl9SZXBlYXRlZEVudW1BcnJheV0pOwotICBYQ1RBc3NlcnRUcnVlKFt1bmtub3duRmllbGRzIGhhc0ZpZWxkOk1lc3NhZ2UyX0ZpZWxkTnVtYmVyX09uZW9mRW51bV0pOwotCi0gIEdQQlVua25vd25GaWVsZCAqZmllbGQgPQotICAgICAgW3Vua25vd25GaWVsZHMgZ2V0RmllbGQ6TWVzc2FnZTJfRmllbGROdW1iZXJfT3B0aW9uYWxFbnVtXTsKLSAgWENUQXNzZXJ0RXF1YWwoZmllbGQudmFyaW50TGlzdC5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbZmllbGQudmFyaW50TGlzdCB2YWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgICh1aW50NjRfdClNZXNzYWdlM19FbnVtX0V4dHJhMyk7Ci0KLSAgZmllbGQgPSBbdW5rbm93bkZpZWxkcyBnZXRGaWVsZDpNZXNzYWdlMl9GaWVsZE51bWJlcl9SZXBlYXRlZEVudW1BcnJheV07Ci0gIFhDVEFzc2VydEVxdWFsKGZpZWxkLnZhcmludExpc3QuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW2ZpZWxkLnZhcmludExpc3QgdmFsdWVBdEluZGV4OjBdLCAodWludDY0X3QpTWVzc2FnZTNfRW51bV9FeHRyYTMpOwotCi0gIGZpZWxkID0gW3Vua25vd25GaWVsZHMgZ2V0RmllbGQ6TWVzc2FnZTJfRmllbGROdW1iZXJfT25lb2ZFbnVtXTsKLSAgWENUQXNzZXJ0RXF1YWwoZmllbGQudmFyaW50TGlzdC5jb3VudCwgMVUpOwotICBYQ1RBc3NlcnRFcXVhbChbZmllbGQudmFyaW50TGlzdCB2YWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgICh1aW50NjRfdClNZXNzYWdlM19FbnVtX0V4dHJhMyk7Ci0KLSAgW21zZyByZWxlYXNlXTsKLSAgW29yaWcgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFByb3RvM1Vua25vd25FbnVtUHJlc2VydmluZyB7Ci0gIFVua25vd25FbnVtc015TWVzc2FnZVBsdXNFeHRyYSAqb3JpZyA9Ci0gICAgICBbVW5rbm93bkVudW1zTXlNZXNzYWdlUGx1c0V4dHJhIG1lc3NhZ2VdOwotCi0gIG9yaWcuZSA9IFVua25vd25FbnVtc015RW51bVBsdXNFeHRyYV9FRXh0cmE7Ci0gIG9yaWcucmVwZWF0ZWRFQXJyYXkgPSBbR1BCRW51bUFycmF5Ci0gICAgICBhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VW5rbm93bkVudW1zTXlFbnVtUGx1c0V4dHJhX0lzVmFsaWRWYWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAgIHJhd1ZhbHVlOlVua25vd25FbnVtc015RW51bVBsdXNFeHRyYV9FRXh0cmFdOwotICBvcmlnLnJlcGVhdGVkUGFja2VkRUFycmF5ID0gW0dQQkVudW1BcnJheQotICAgICAgYXJyYXlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlVua25vd25FbnVtc015RW51bVBsdXNFeHRyYV9Jc1ZhbGlkVmFsdWUKLSAgICAgICAgICAgICAgICAgICAgICAgICByYXdWYWx1ZTpVbmtub3duRW51bXNNeUVudW1QbHVzRXh0cmFfRUV4dHJhXTsKLSAgb3JpZy5vbmVvZkUxID0gVW5rbm93bkVudW1zTXlFbnVtUGx1c0V4dHJhX0VFeHRyYTsKLQotICAvLyBFdmVyeXRoaW5nIHNob3VsZCBiZSB0aGVyZSB2aWEgcmF3IHZhbHVlcy4KLQotICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICBVbmtub3duRW51bXNNeU1lc3NhZ2UgKm1zZyA9Ci0gICAgICBbVW5rbm93bkVudW1zTXlNZXNzYWdlIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLQotICBYQ1RBc3NlcnRFcXVhbChtc2cuZSwgVW5rbm93bkVudW1zTXlFbnVtX0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSk7Ci0gIFhDVEFzc2VydEVxdWFsKFVua25vd25FbnVtc015TWVzc2FnZV9FX1Jhd1ZhbHVlKG1zZyksCi0gICAgICAgICAgICAgICAgIFVua25vd25FbnVtc015RW51bVBsdXNFeHRyYV9FRXh0cmEpOwotICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRFQXJyYXkuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW21zZy5yZXBlYXRlZEVBcnJheSB2YWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgIFVua25vd25FbnVtc015RW51bV9HUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUpOwotICBYQ1RBc3NlcnRFcXVhbChbbXNnLnJlcGVhdGVkRUFycmF5IHJhd1ZhbHVlQXRJbmRleDowXSwKLSAgICAgICAgICAgICAgICAgKFVua25vd25FbnVtc015RW51bSlVbmtub3duRW51bXNNeUVudW1QbHVzRXh0cmFfRUV4dHJhKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkUGFja2VkRUFycmF5LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydEVxdWFsKFttc2cucmVwZWF0ZWRQYWNrZWRFQXJyYXkgdmFsdWVBdEluZGV4OjBdLAotICAgICAgICAgICAgICAgICBVbmtub3duRW51bXNNeUVudW1fR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoW21zZy5yZXBlYXRlZFBhY2tlZEVBcnJheSByYXdWYWx1ZUF0SW5kZXg6MF0sCi0gICAgICAgICAgICAgICAgIChVbmtub3duRW51bXNNeUVudW0pVW5rbm93bkVudW1zTXlFbnVtUGx1c0V4dHJhX0VFeHRyYSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkUxLAotICAgICAgICAgICAgICAgICBVbmtub3duRW51bXNNeUVudW1fR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlKTsKLSAgWENUQXNzZXJ0RXF1YWwoVW5rbm93bkVudW1zTXlNZXNzYWdlX09uZW9mRTFfUmF3VmFsdWUobXNnKSwKLSAgICAgICAgICAgICAgICAgVW5rbm93bkVudW1zTXlFbnVtUGx1c0V4dHJhX0VFeHRyYSk7Ci0KLSAgLy8gRXZlcnl0aGluZyBzaG91bGQgZ28gb3V0IGFuZCBjb21lIGJhY2suCi0KLSAgZGF0YSA9IFttc2cgZGF0YV07Ci0gIG9yaWcgPSBbVW5rbm93bkVudW1zTXlNZXNzYWdlUGx1c0V4dHJhIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLQotICBYQ1RBc3NlcnRFcXVhbChvcmlnLmUsIFVua25vd25FbnVtc015RW51bVBsdXNFeHRyYV9FRXh0cmEpOwotICBYQ1RBc3NlcnRFcXVhbChvcmlnLnJlcGVhdGVkRUFycmF5LmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydEVxdWFsKFtvcmlnLnJlcGVhdGVkRUFycmF5IHZhbHVlQXRJbmRleDowXSwKLSAgICAgICAgICAgICAgICAgVW5rbm93bkVudW1zTXlFbnVtUGx1c0V4dHJhX0VFeHRyYSk7Ci0gIFhDVEFzc2VydEVxdWFsKG9yaWcucmVwZWF0ZWRQYWNrZWRFQXJyYXkuY291bnQsIDFVKTsKLSAgWENUQXNzZXJ0RXF1YWwoW29yaWcucmVwZWF0ZWRQYWNrZWRFQXJyYXkgdmFsdWVBdEluZGV4OjBdLAotICAgICAgICAgICAgICAgICBVbmtub3duRW51bXNNeUVudW1QbHVzRXh0cmFfRUV4dHJhKTsKLSAgWENUQXNzZXJ0RXF1YWwob3JpZy5vbmVvZkUxLCBVbmtub3duRW51bXNNeUVudW1QbHVzRXh0cmFfRUV4dHJhKTsKLX0KLQotLy8lUERETS1ERUZJTkUgVEVTVF9ST1VORFRSSVBfT05FT0YoTUVTU0FHRSwgRklFTEQsIFZBTFVFKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0ZfQURWKE1FU1NBR0UsIEZJRUxELCBWQUxVRSwgKQotLy8lUERETS1ERUZJTkUgVEVTVF9ST1VORFRSSVBfT05FT0ZfQURWKE1FU1NBR0UsIEZJRUxELCBWQUxVRSwgRVFfU1VGRklYKQotLy8lICB7ICAvLyBvbmVvZiMjRklFTEQKLS8vJSAgICBNRVNTQUdFICpvcmlnID0gW1tNRVNTQUdFIGFsbG9jXSBpbml0XTsKLS8vJSAgICBvcmlnLm9uZW9mIyNGSUVMRCA9IFZBTFVFOwotLy8lICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTUVTU0FHRSMjX09fT25lT2ZDYXNlX09uZW9mIyNGSUVMRCk7Ci0vLyUgICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0vLyUgICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotLy8lICAgIE1FU1NBR0UgKm1zZyA9IFtNRVNTQUdFIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLS8vJSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTUVTU0FHRSMjX09fT25lT2ZDYXNlX09uZW9mIyNGSUVMRCk7Ci0vLyUgICAgWENUQXNzZXJ0RXF1YWwjI0VRX1NVRkZJWChtc2cub25lb2YjI0ZJRUxELCBWQUxVRSk7Ci0vLyUgICAgW29yaWcgcmVsZWFzZV07Ci0vLyUgIH0KLS8vJQotLy8lUERETS1ERUZJTkUgVEVTVF9ST1VORFRSSVBfT05FT0ZTKFNZTlRBWCwgQk9PTF9OT05fREVGQVVMVCkKLS8vJS0gKHZvaWQpdGVzdFByb3RvIyNTWU5UQVgjI1JvdW5kVHJpcE9uZW9mIHsKLS8vJQotLy8lR1JPVVBfSU5JVCMjU1lOVEFYKCkgIE1lc3NhZ2UjI1NZTlRBWCAqc3ViTWVzc2FnZSA9IFtbTWVzc2FnZSMjU1lOVEFYIGFsbG9jXSBpbml0XTsKLS8vJSAgWENUQXNzZXJ0Tm90TmlsKHN1Yk1lc3NhZ2UpOwotLy8lICBzdWJNZXNzYWdlLm9wdGlvbmFsSW50MzIgPSA2NjY7Ci0vLyUKLS8vJVRFU1RfUk9VTkRUUklQX09ORU9GKE1lc3NhZ2UjI1NZTlRBWCwgSW50MzIsIDEpCi0vLyVURVNUX1JPVU5EVFJJUF9PTkVPRihNZXNzYWdlIyNTWU5UQVgsIEludDY0LCAyKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0YoTWVzc2FnZSMjU1lOVEFYLCBVaW50MzIsIDNVKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0YoTWVzc2FnZSMjU1lOVEFYLCBVaW50NjQsIDRVKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0YoTWVzc2FnZSMjU1lOVEFYLCBTaW50MzIsIDUpCi0vLyVURVNUX1JPVU5EVFJJUF9PTkVPRihNZXNzYWdlIyNTWU5UQVgsIFNpbnQ2NCwgNikKLS8vJVRFU1RfUk9VTkRUUklQX09ORU9GKE1lc3NhZ2UjI1NZTlRBWCwgRml4ZWQzMiwgN1UpCi0vLyVURVNUX1JPVU5EVFJJUF9PTkVPRihNZXNzYWdlIyNTWU5UQVgsIEZpeGVkNjQsIDhVKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0YoTWVzc2FnZSMjU1lOVEFYLCBTZml4ZWQzMiwgOSkKLS8vJVRFU1RfUk9VTkRUUklQX09ORU9GKE1lc3NhZ2UjI1NZTlRBWCwgU2ZpeGVkNjQsIDEwKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0YoTWVzc2FnZSMjU1lOVEFYLCBGbG9hdCwgMTEuMGYpCi0vLyVURVNUX1JPVU5EVFJJUF9PTkVPRihNZXNzYWdlIyNTWU5UQVgsIERvdWJsZSwgMTIuMCkKLS8vJVRFU1RfUk9VTkRUUklQX09ORU9GKE1lc3NhZ2UjI1NZTlRBWCwgQm9vbCwgQk9PTF9OT05fREVGQVVMVCkKLS8vJVRFU1RfUk9VTkRUUklQX09ORU9GX0FEVihNZXNzYWdlIyNTWU5UQVgsIFN0cmluZywgQCJmb28iLCBPYmplY3RzKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0ZfQURWKE1lc3NhZ2UjI1NZTlRBWCwgQnl0ZXMsIFtAImJhciIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddLCBPYmplY3RzKQotLy8lR1JPVVBfVEVTVCMjU1lOVEFYKClURVNUX1JPVU5EVFJJUF9PTkVPRl9BRFYoTWVzc2FnZSMjU1lOVEFYLCBNZXNzYWdlLCBzdWJNZXNzYWdlLCBPYmplY3RzKQotLy8lVEVTVF9ST1VORFRSSVBfT05FT0YoTWVzc2FnZSMjU1lOVEFYLCBFbnVtLCBNZXNzYWdlMl9FbnVtX0JhcikKLS8vJUdST1VQX0NMRUFOVVAjI1NZTlRBWCgpICBbc3ViTWVzc2FnZSByZWxlYXNlXTsKLS8vJX0KLS8vJQotLy8lUERETS1ERUZJTkUgR1JPVVBfSU5JVDIoKQotLy8lICBNZXNzYWdlMl9PbmVvZkdyb3VwICpncm91cCA9IFtbTWVzc2FnZTJfT25lb2ZHcm91cCBhbGxvY10gaW5pdF07Ci0vLyUgIFhDVEFzc2VydE5vdE5pbChncm91cCk7Ci0vLyUgIGdyb3VwLmEgPSA3Nzc7Ci0vLyUKLS8vJVBERE0tREVGSU5FIEdST1VQX0NMRUFOVVAyKCkKLS8vJSAgW2dyb3VwIHJlbGVhc2VdOwotLy8lCi0vLyVQRERNLURFRklORSBHUk9VUF9URVNUMigpCi0vLyVURVNUX1JPVU5EVFJJUF9PTkVPRl9BRFYoTWVzc2FnZTIsIEdyb3VwLCBncm91cCwgT2JqZWN0cykKLS8vJQotLy8lUERETS1ERUZJTkUgR1JPVVBfSU5JVDMoKQotLy8gRW1wdHkKLS8vJVBERE0tREVGSU5FIEdST1VQX0NMRUFOVVAzKCkKLS8vIEVtcHR5Ci0vLyVQRERNLURFRklORSBHUk9VUF9URVNUMygpCi0vLyUgIC8vIE5vdCAiZ3JvdXAiIGluIHByb3RvMy4KLS8vJQotLy8lCi0vLyVQRERNLUVYUEFORCBURVNUX1JPVU5EVFJJUF9PTkVPRlMoMiwgTk8pCi0vLyBUaGlzIGJsb2NrIG9mIGNvZGUgaXMgZ2VuZXJhdGVkLCBkbyBub3QgZWRpdCBpdCBkaXJlY3RseS4KLQotLSAodm9pZCl0ZXN0UHJvdG8yUm91bmRUcmlwT25lb2YgewotCi0gIE1lc3NhZ2UyX09uZW9mR3JvdXAgKmdyb3VwID0gW1tNZXNzYWdlMl9PbmVvZkdyb3VwIGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKGdyb3VwKTsKLSAgZ3JvdXAuYSA9IDc3NzsKLSAgTWVzc2FnZTIgKnN1Yk1lc3NhZ2UgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKHN1Yk1lc3NhZ2UpOwotICBzdWJNZXNzYWdlLm9wdGlvbmFsSW50MzIgPSA2NjY7Ci0KLSAgeyAgLy8gb25lb2ZJbnQzMgotICAgIE1lc3NhZ2UyICpvcmlnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZkludDMyID0gMTsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mSW50MzIpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMiAqbXNnID0gW01lc3NhZ2UyIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZJbnQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZJbnQ2NAotICAgIE1lc3NhZ2UyICpvcmlnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZkludDY0ID0gMjsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mSW50NjQpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMiAqbXNnID0gW01lc3NhZ2UyIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZJbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDIpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZVaW50MzIKLSAgICBNZXNzYWdlMiAqb3JpZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIG9yaWcub25lb2ZVaW50MzIgPSAzVTsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mVWludDMyKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mVWludDMyKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDNVKTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mVWludDY0Ci0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mVWludDY0ID0gNFU7Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NCk7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UyICptc2cgPSBbTWVzc2FnZTIgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCA0VSk7Ci0gICAgW29yaWcgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvbmVvZlNpbnQzMgotICAgIE1lc3NhZ2UyICpvcmlnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZlNpbnQzMiA9IDU7Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlNpbnQzMik7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UyICptc2cgPSBbTWVzc2FnZTIgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlNpbnQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCA1KTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mU2ludDY0Ci0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mU2ludDY0ID0gNjsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ludDY0KTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ludDY0KTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDYpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZGaXhlZDMyCi0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRml4ZWQzMiA9IDdVOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDMyKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRml4ZWQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgN1UpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZGaXhlZDY0Ci0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRml4ZWQ2NCA9IDhVOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDY0KTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRml4ZWQ2NCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgOFUpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZTZml4ZWQzMgotICAgIE1lc3NhZ2UyICpvcmlnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZlNmaXhlZDMyID0gOTsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkMzIpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMiAqbXNnID0gW01lc3NhZ2UyIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZTZml4ZWQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDkpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZTZml4ZWQ2NAotICAgIE1lc3NhZ2UyICpvcmlnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZlNmaXhlZDY0ID0gMTA7Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDY0KTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAxMCk7Ci0gICAgW29yaWcgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvbmVvZkZsb2F0Ci0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRmxvYXQgPSAxMS4wZjsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRmxvYXQpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMiAqbXNnID0gW01lc3NhZ2UyIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExLjBmKTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mRG91YmxlCi0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRG91YmxlID0gMTIuMDsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRG91YmxlKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRG91YmxlKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDEyLjApOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZCb29sCi0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mQm9vbCA9IE5POwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZCb29sKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mQm9vbCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mQm9vbCwgTk8pOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZTdHJpbmcKLSAgICBNZXNzYWdlMiAqb3JpZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIG9yaWcub25lb2ZTdHJpbmcgPSBAImZvbyI7Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlN0cmluZyk7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UyICptc2cgPSBbTWVzc2FnZTIgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZlN0cmluZyk7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZlN0cmluZywgQCJmb28iKTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mQnl0ZXMKLSAgICBNZXNzYWdlMiAqb3JpZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIG9yaWcub25lb2ZCeXRlcyA9IFtAImJhciIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZCeXRlcyk7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UyICptc2cgPSBbTWVzc2FnZTIgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkJ5dGVzKTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mQnl0ZXMsIFtAImJhciIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddKTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mR3JvdXAKLSAgICBNZXNzYWdlMiAqb3JpZyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICAgIG9yaWcub25lb2ZHcm91cCA9IGdyb3VwOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZHcm91cCk7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UyICptc2cgPSBbTWVzc2FnZTIgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZV9PbmVvZkdyb3VwKTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mR3JvdXAsIGdyb3VwKTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mTWVzc2FnZQotICAgIE1lc3NhZ2UyICpvcmlnID0gW1tNZXNzYWdlMiBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZNZXNzYWdlKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mTWVzc2FnZSk7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZk1lc3NhZ2UsIHN1Yk1lc3NhZ2UpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZFbnVtCi0gICAgTWVzc2FnZTIgKm9yaWcgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRW51bSA9IE1lc3NhZ2UyX0VudW1fQmFyOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2VfT25lb2ZFbnVtKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTIgKm1zZyA9IFtNZXNzYWdlMiBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlX09uZW9mRW51bSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXIpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgW2dyb3VwIHJlbGVhc2VdOwotICBbc3ViTWVzc2FnZSByZWxlYXNlXTsKLX0KLQotLy8lUERETS1FWFBBTkQgVEVTVF9ST1VORFRSSVBfT05FT0ZTKDMsIFlFUykKLS8vIFRoaXMgYmxvY2sgb2YgY29kZSBpcyBnZW5lcmF0ZWQsIGRvIG5vdCBlZGl0IGl0IGRpcmVjdGx5LgotCi0tICh2b2lkKXRlc3RQcm90bzNSb3VuZFRyaXBPbmVvZiB7Ci0KLSAgTWVzc2FnZTMgKnN1Yk1lc3NhZ2UgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgWENUQXNzZXJ0Tm90TmlsKHN1Yk1lc3NhZ2UpOwotICBzdWJNZXNzYWdlLm9wdGlvbmFsSW50MzIgPSA2NjY7Ci0KLSAgeyAgLy8gb25lb2ZJbnQzMgotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZkludDMyID0gMTsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mSW50MzIpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMyAqbXNnID0gW01lc3NhZ2UzIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZJbnQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIDEpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZJbnQ2NAotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZkludDY0ID0gMjsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mSW50NjQpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMyAqbXNnID0gW01lc3NhZ2UzIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZJbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50NjQsIDIpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZVaW50MzIKLSAgICBNZXNzYWdlMyAqb3JpZyA9IFtbTWVzc2FnZTMgYWxsb2NdIGluaXRdOwotICAgIG9yaWcub25lb2ZVaW50MzIgPSAzVTsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mVWludDMyKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mVWludDMyKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZVaW50MzIsIDNVKTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mVWludDY0Ci0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mVWludDY0ID0gNFU7Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NCk7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UzICptc2cgPSBbTWVzc2FnZTMgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlVpbnQ2NCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mVWludDY0LCA0VSk7Ci0gICAgW29yaWcgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvbmVvZlNpbnQzMgotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZlNpbnQzMiA9IDU7Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNpbnQzMik7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UzICptc2cgPSBbTWVzc2FnZTMgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNpbnQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ludDMyLCA1KTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mU2ludDY0Ci0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mU2ludDY0ID0gNjsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ludDY0KTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ludDY0KTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZTaW50NjQsIDYpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZGaXhlZDMyCi0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRml4ZWQzMiA9IDdVOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDMyKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRml4ZWQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQzMiwgN1UpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZGaXhlZDY0Ci0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRml4ZWQ2NCA9IDhVOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGaXhlZDY0KTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRml4ZWQ2NCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRml4ZWQ2NCwgOFUpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZTZml4ZWQzMgotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZlNmaXhlZDMyID0gOTsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkMzIpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMyAqbXNnID0gW01lc3NhZ2UzIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZTZml4ZWQzMik7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mU2ZpeGVkMzIsIDkpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZTZml4ZWQ2NAotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZlNmaXhlZDY0ID0gMTA7Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZlNmaXhlZDY0KTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU2ZpeGVkNjQpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZlNmaXhlZDY0LCAxMCk7Ci0gICAgW29yaWcgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvbmVvZkZsb2F0Ci0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRmxvYXQgPSAxMS4wZjsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRmxvYXQpOwotICAgIE5TRGF0YSAqZGF0YSA9IFtvcmlnIGRhdGFdOwotICAgIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgICBNZXNzYWdlMyAqbXNnID0gW01lc3NhZ2UzIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZGbG9hdCk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIDExLjBmKTsKLSAgICBbb3JpZyByZWxlYXNlXTsKLSAgfQotCi0gIHsgIC8vIG9uZW9mRG91YmxlCi0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRG91YmxlID0gMTIuMDsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRG91YmxlKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRG91YmxlKTsKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZEb3VibGUsIDEyLjApOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZCb29sCi0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mQm9vbCA9IFlFUzsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mQm9vbCk7Ci0gICAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gICAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICAgIE1lc3NhZ2UzICptc2cgPSBbTWVzc2FnZTMgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkJvb2wpOwotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkJvb2wsIFlFUyk7Ci0gICAgW29yaWcgcmVsZWFzZV07Ci0gIH0KLQotICB7ICAvLyBvbmVvZlN0cmluZwotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZlN0cmluZyA9IEAiZm9vIjsKLSAgICBYQ1RBc3NlcnRFcXVhbChvcmlnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU3RyaW5nKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mU3RyaW5nKTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnLm9uZW9mU3RyaW5nLCBAImZvbyIpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZCeXRlcwotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZkJ5dGVzID0gW0AiYmFyIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gICAgWENUQXNzZXJ0RXF1YWwob3JpZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZV9PbmVvZkJ5dGVzKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mQnl0ZXMpOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtc2cub25lb2ZCeXRlcywgW0AiYmFyIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ10pOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgLy8gTm90ICJncm91cCIgaW4gcHJvdG8zLgotCi0gIHsgIC8vIG9uZW9mTWVzc2FnZQotICAgIE1lc3NhZ2UzICpvcmlnID0gW1tNZXNzYWdlMyBhbGxvY10gaW5pdF07Ci0gICAgb3JpZy5vbmVvZk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZNZXNzYWdlKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mTWVzc2FnZSk7Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZy5vbmVvZk1lc3NhZ2UsIHN1Yk1lc3NhZ2UpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgeyAgLy8gb25lb2ZFbnVtCi0gICAgTWVzc2FnZTMgKm9yaWcgPSBbW01lc3NhZ2UzIGFsbG9jXSBpbml0XTsKLSAgICBvcmlnLm9uZW9mRW51bSA9IE1lc3NhZ2UyX0VudW1fQmFyOwotICAgIFhDVEFzc2VydEVxdWFsKG9yaWcub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2VfT25lb2ZFbnVtKTsKLSAgICBOU0RhdGEgKmRhdGEgPSBbb3JpZyBkYXRhXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gICAgTWVzc2FnZTMgKm1zZyA9IFtNZXNzYWdlMyBwYXJzZUZyb21EYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlX09uZW9mRW51bSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bV9CYXIpOwotICAgIFtvcmlnIHJlbGVhc2VdOwotICB9Ci0KLSAgW3N1Yk1lc3NhZ2UgcmVsZWFzZV07Ci19Ci0KLS8vJVBERE0tRVhQQU5ELUVORCAoMiBleHBhbnNpb25zKQotCi0tICh2b2lkKXRlc3RQYWNrZWRVbnBhY2tlZE1lc3NhZ2VQYXJzaW5nIHsKLSAgLy8gcGFja2VkIGlzIG9wdGlvbmFsLCBhIHJlcGVhdGVkIGZpZWxkIHNob3VsZCBwYXJzZSB3aGVuIHBhY2tlZCBvciB1bnBhY2tlZC4KLQotICBUZXN0UGFja2VkVHlwZXMgKnBhY2tlZE9yaWcgPSBbVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2VdOwotICBUZXN0VW5wYWNrZWRUeXBlcyAqdW5wYWNrZWRPcmlnID0gW1Rlc3RVbnBhY2tlZFR5cGVzIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRQYWNrZWRGaWVsZHM6cGFja2VkT3JpZyByZXBlYXRlZENvdW50OjRdOwotICBbc2VsZiBzZXRVbnBhY2tlZEZpZWxkczp1bnBhY2tlZE9yaWcgcmVwZWF0ZWRDb3VudDo0XTsKLQotICBOU0RhdGEgKnBhY2tlZERhdGEgPSBbcGFja2VkT3JpZyBkYXRhXTsKLSAgTlNEYXRhICp1bnBhY2tlZERhdGEgPSBbdW5wYWNrZWRPcmlnIGRhdGFdOwotICBYQ1RBc3NlcnROb3ROaWwocGFja2VkRGF0YSk7Ci0gIFhDVEFzc2VydE5vdE5pbCh1bnBhY2tlZERhdGEpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMocGFja2VkRGF0YSwgdW5wYWNrZWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJEYXRhIHNob3VsZCBkaWZmZXIgKHBhY2tlZCB2cyB1bnBhY2tlZCkgdXNlIik7Ci0KLSAgTlNFcnJvciAqZXJyb3IgPSBuaWw7Ci0gIFRlc3RQYWNrZWRUeXBlcyAqcGFja2VkUGFyc2UgPQotICAgICAgW1Rlc3RQYWNrZWRUeXBlcyBwYXJzZUZyb21EYXRhOnVucGFja2VkRGF0YSBlcnJvcjomZXJyb3JdOwotICBYQ1RBc3NlcnROb3ROaWwocGFja2VkUGFyc2UpOwotICBYQ1RBc3NlcnROaWwoZXJyb3IpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocGFja2VkUGFyc2UsIHBhY2tlZE9yaWcpOwotCi0gIGVycm9yID0gbmlsOwotICBUZXN0VW5wYWNrZWRUeXBlcyAqdW5wYWNrZWRQYXJzZWQgPQotICAgICAgW1Rlc3RVbnBhY2tlZFR5cGVzIHBhcnNlRnJvbURhdGE6cGFja2VkRGF0YSBlcnJvcjomZXJyb3JdOwotICBYQ1RBc3NlcnROb3ROaWwodW5wYWNrZWRQYXJzZWQpOwotICBYQ1RBc3NlcnROaWwoZXJyb3IpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHModW5wYWNrZWRQYXJzZWQsIHVucGFja2VkT3JpZyk7Ci19Ci0KLS0gKHZvaWQpdGVzdFBhY2tlZFVucGFja2VkRXh0ZW5zaW9uUGFyc2luZyB7Ci0gIC8vIHBhY2tlZCBpcyBvcHRpb25hbCwgYSByZXBlYXRlZCBleHRlbnNpb24gc2hvdWxkIHBhcnNlIHdoZW4gcGFja2VkIG9yCi0gIC8vIHVucGFja2VkLgotCi0gIFRlc3RQYWNrZWRFeHRlbnNpb25zICpwYWNrZWRPcmlnID0gW1Rlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBUZXN0VW5wYWNrZWRFeHRlbnNpb25zICp1bnBhY2tlZE9yaWcgPSBbVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0UGFja2VkRXh0ZW5zaW9uczpwYWNrZWRPcmlnIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0gIFtzZWxmIHNldFVucGFja2VkRXh0ZW5zaW9uczp1bnBhY2tlZE9yaWcgcmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLQotICBOU0RhdGEgKnBhY2tlZERhdGEgPSBbcGFja2VkT3JpZyBkYXRhXTsKLSAgTlNEYXRhICp1bnBhY2tlZERhdGEgPSBbdW5wYWNrZWRPcmlnIGRhdGFdOwotICBYQ1RBc3NlcnROb3ROaWwocGFja2VkRGF0YSk7Ci0gIFhDVEFzc2VydE5vdE5pbCh1bnBhY2tlZERhdGEpOwotICBYQ1RBc3NlcnROb3RFcXVhbE9iamVjdHMocGFja2VkRGF0YSwgdW5wYWNrZWREYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQCJEYXRhIHNob3VsZCBkaWZmZXIgKHBhY2tlZCB2cyB1bnBhY2tlZCkgdXNlIik7Ci0KLSAgTlNFcnJvciAqZXJyb3IgPSBuaWw7Ci0gIFRlc3RQYWNrZWRFeHRlbnNpb25zICpwYWNrZWRQYXJzZSA9Ci0gICAgICBbVGVzdFBhY2tlZEV4dGVuc2lvbnMgcGFyc2VGcm9tRGF0YTp1bnBhY2tlZERhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OltVbml0dGVzdFJvb3QgZXh0ZW5zaW9uUmVnaXN0cnldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjomZXJyb3JdOwotICBYQ1RBc3NlcnROb3ROaWwocGFja2VkUGFyc2UpOwotICBYQ1RBc3NlcnROaWwoZXJyb3IpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocGFja2VkUGFyc2UsIHBhY2tlZE9yaWcpOwotCi0gIGVycm9yID0gbmlsOwotICBUZXN0VW5wYWNrZWRFeHRlbnNpb25zICp1bnBhY2tlZFBhcnNlZCA9Ci0gICAgICBbVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBwYXJzZUZyb21EYXRhOnBhY2tlZERhdGEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6W1VuaXR0ZXN0Um9vdCBleHRlbnNpb25SZWdpc3RyeV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6JmVycm9yXTsKLSAgWENUQXNzZXJ0Tm90TmlsKHVucGFja2VkUGFyc2VkKTsKLSAgWENUQXNzZXJ0TmlsKGVycm9yKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHVucGFja2VkUGFyc2VkLCB1bnBhY2tlZE9yaWcpOwotfQotCi0tICh2b2lkKXRlc3RQYWNrZWRFeHRlbnNpb25Wc0ZpZWxkUGFyc2luZyB7Ci0gIC8vIEV4dGVuc2lvbnMgYW5kIGZpZWxkcyBlbmQgdXAgb24gdGhlIHdpcmUgdGhlIHNhbWUgd2F5LCBzbyB0aGV5IGNhbiBwYXJzZQotICAvLyBlYWNoIG90aGVyLgotCi0gIFRlc3RQYWNrZWRUeXBlcyAqZmllbGRzT3JpZyA9IFtUZXN0UGFja2VkVHlwZXMgbWVzc2FnZV07Ci0gIFRlc3RQYWNrZWRFeHRlbnNpb25zICpleHRzT3JpZyA9IFtUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0UGFja2VkRmllbGRzOmZpZWxkc09yaWcgcmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgW3NlbGYgc2V0UGFja2VkRXh0ZW5zaW9uczpleHRzT3JpZyByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotCi0gIE5TRGF0YSAqZmllbGRzRGF0YSA9IFtmaWVsZHNPcmlnIGRhdGFdOwotICBOU0RhdGEgKmV4dHNEYXRhID0gW2V4dHNPcmlnIGRhdGFdOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGRzRGF0YSk7Ci0gIFhDVEFzc2VydE5vdE5pbChleHRzRGF0YSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhmaWVsZHNEYXRhLCBleHRzRGF0YSk7Ci0KLSAgTlNFcnJvciAqZXJyb3IgPSBuaWw7Ci0gIFRlc3RQYWNrZWRUeXBlcyAqZmllbGRzUGFyc2UgPQotICAgICAgW1Rlc3RQYWNrZWRUeXBlcyBwYXJzZUZyb21EYXRhOmV4dHNEYXRhIGVycm9yOiZlcnJvcl07Ci0gIFhDVEFzc2VydE5vdE5pbChmaWVsZHNQYXJzZSk7Ci0gIFhDVEFzc2VydE5pbChlcnJvcik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhmaWVsZHNQYXJzZSwgZmllbGRzT3JpZyk7Ci0KLSAgZXJyb3IgPSBuaWw7Ci0gIFRlc3RQYWNrZWRFeHRlbnNpb25zICpleHRzUGFyc2UgPQotICAgICAgW1Rlc3RQYWNrZWRFeHRlbnNpb25zIHBhcnNlRnJvbURhdGE6ZmllbGRzRGF0YQotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6W1VuaXR0ZXN0Um9vdCBleHRlbnNpb25SZWdpc3RyeV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOiZlcnJvcl07Ci0gIFhDVEFzc2VydE5vdE5pbChleHRzUGFyc2UpOwotICBYQ1RBc3NlcnROaWwoZXJyb3IpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZXh0c1BhcnNlLCBleHRzT3JpZyk7Ci19Ci0KLS0gKHZvaWQpdGVzdFVucGFja2VkRXh0ZW5zaW9uVnNGaWVsZFBhcnNpbmcgewotICAvLyBFeHRlbnNpb25zIGFuZCBmaWVsZHMgZW5kIHVwIG9uIHRoZSB3aXJlIHRoZSBzYW1lIHdheSwgc28gdGhleSBjYW4gcGFyc2UKLSAgLy8gZWFjaCBvdGhlci4KLQotICBUZXN0VW5wYWNrZWRUeXBlcyAqZmllbGRzT3JpZyA9IFtUZXN0VW5wYWNrZWRUeXBlcyBtZXNzYWdlXTsKLSAgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyAqZXh0c09yaWcgPSBbVGVzdFVucGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0VW5wYWNrZWRGaWVsZHM6ZmllbGRzT3JpZyByZXBlYXRlZENvdW50OjNdOwotICBbc2VsZiBzZXRVbnBhY2tlZEV4dGVuc2lvbnM6ZXh0c09yaWcgcmVwZWF0ZWRDb3VudDozXTsKLQotICBOU0RhdGEgKmZpZWxkc0RhdGEgPSBbZmllbGRzT3JpZyBkYXRhXTsKLSAgTlNEYXRhICpleHRzRGF0YSA9IFtleHRzT3JpZyBkYXRhXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkc0RhdGEpOwotICBYQ1RBc3NlcnROb3ROaWwoZXh0c0RhdGEpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZmllbGRzRGF0YSwgZXh0c0RhdGEpOwotCi0gIFRlc3RVbnBhY2tlZFR5cGVzICpmaWVsZHNQYXJzZSA9Ci0gICAgICBbVGVzdFVucGFja2VkVHlwZXMgcGFyc2VGcm9tRGF0YTpleHRzRGF0YSBlcnJvcjpOVUxMXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkc1BhcnNlKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGZpZWxkc1BhcnNlLCBmaWVsZHNPcmlnKTsKLQotICBUZXN0VW5wYWNrZWRFeHRlbnNpb25zICpleHRzUGFyc2UgPQotICAgICAgW1Rlc3RVbnBhY2tlZEV4dGVuc2lvbnMgcGFyc2VGcm9tRGF0YTpmaWVsZHNEYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OltVbml0dGVzdFJvb3QgZXh0ZW5zaW9uUmVnaXN0cnldCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnROb3ROaWwoZXh0c1BhcnNlKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGV4dHNQYXJzZSwgZXh0c09yaWcpOwotfQotCi0jcHJhZ21hIG1hcmsgLSBTdWJzZXQgZnJvbSBmcm9tIG1hcF90ZXN0cy5jYwotCi0vLyBURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgU3RhbmRhcmRXaXJlRm9ybWF0KQotLSAodm9pZCl0ZXN0TWFwX1N0YW5kYXJkV2lyZUZvcm1hdCB7Ci0gIE5TRGF0YSAqZGF0YSA9IERhdGFGcm9tQ1N0cigiXHgwQVx4MDRceDA4XHgwMVx4MTBceDAxIik7Ci0KLSAgVGVzdE1hcCAqbXNnID0gW1tUZXN0TWFwIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcEludDMySW50MzIuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWwgPSA2NjY7Ci0gIFhDVEFzc2VydFRydWUoW21zZy5tYXBJbnQzMkludDMyIHZhbHVlRm9yS2V5OjEgdmFsdWU6JnZhbF0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWwsIDEpOwotCi0gIFttc2cgcmVsZWFzZV07Ci19Ci0KLS8vIFRFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBVbm9yZGVyZWRXaXJlRm9ybWF0KQotLSAodm9pZCl0ZXN0TWFwX1Vub3JkZXJlZFdpcmVGb3JtYXQgewotICAvLyBwdXQgdmFsdWUgYmVmb3JlIGtleSBpbiB3aXJlIGZvcm1hdAotICBOU0RhdGEgKmRhdGEgPSBEYXRhRnJvbUNTdHIoIlx4MEFceDA0XHgxMFx4MDFceDA4XHgwMiIpOwotCi0gIFRlc3RNYXAgKm1zZyA9IFtbVGVzdE1hcCBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBJbnQzMkludDMyLmNvdW50LCAxVSk7Ci0gIGludDMyX3QgdmFsID0gNjY2OwotICBYQ1RBc3NlcnRUcnVlKFttc2cubWFwSW50MzJJbnQzMiB2YWx1ZUZvcktleToyIHZhbHVlOiZ2YWxdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsLCAxKTsKLQotICBbbXNnIHJlbGVhc2VdOwotfQotCi0vLyBURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgRHVwbGljYXRlZEtleVdpcmVGb3JtYXQpCi0tICh2b2lkKXRlc3RNYXBfRHVwbGljYXRlZEtleVdpcmVGb3JtYXQgewotICAvLyBUd28ga2V5IGZpZWxkcyBpbiB3aXJlIGZvcm1hdAotICBOU0RhdGEgKmRhdGEgPSBEYXRhRnJvbUNTdHIoIlx4MEFceDA2XHgwOFx4MDFceDA4XHgwMlx4MTBceDAxIik7Ci0KLSAgVGVzdE1hcCAqbXNnID0gW1tUZXN0TWFwIGFsbG9jXSBpbml0V2l0aERhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcEludDMySW50MzIuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWwgPSA2NjY7Ci0gIFhDVEFzc2VydFRydWUoW21zZy5tYXBJbnQzMkludDMyIHZhbHVlRm9yS2V5OjIgdmFsdWU6JnZhbF0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWwsIDEpOwotCi0gIFttc2cgcmVsZWFzZV07Ci19Ci0KLS8vIFRFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBEdXBsaWNhdGVkVmFsdWVXaXJlRm9ybWF0KQotLSAodm9pZCl0ZXN0TWFwX0R1cGxpY2F0ZWRWYWx1ZVdpcmVGb3JtYXQgewotICAvLyBUd28gdmFsdWUgZmllbGRzIGluIHdpcmUgZm9ybWF0Ci0gIE5TRGF0YSAqZGF0YSA9IERhdGFGcm9tQ1N0cigiXHgwQVx4MDZceDA4XHgwMVx4MTBceDAxXHgxMFx4MDIiKTsKLQotICBUZXN0TWFwICptc2cgPSBbW1Rlc3RNYXAgYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwSW50MzJJbnQzMi5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbCA9IDY2NjsKLSAgWENUQXNzZXJ0VHJ1ZShbbXNnLm1hcEludDMySW50MzIgdmFsdWVGb3JLZXk6MSB2YWx1ZTomdmFsXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbCwgMik7Ci0KLSAgW21zZyByZWxlYXNlXTsKLX0KLQotLy8gVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIE1pc3NlZEtleVdpcmVGb3JtYXQpCi0tICh2b2lkKXRlc3RNYXBfTWlzc2VkS2V5V2lyZUZvcm1hdCB7Ci0gIC8vIE5vIGtleSBmaWVsZCBpbiB3aXJlIGZvcm1hdAotICBOU0RhdGEgKmRhdGEgPSBEYXRhRnJvbUNTdHIoIlx4MEFceDAyXHgxMFx4MDEiKTsKLQotICBUZXN0TWFwICptc2cgPSBbW1Rlc3RNYXAgYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwSW50MzJJbnQzMi5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbCA9IDY2NjsKLSAgWENUQXNzZXJ0VHJ1ZShbbXNnLm1hcEludDMySW50MzIgdmFsdWVGb3JLZXk6MCB2YWx1ZTomdmFsXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbCwgMSk7Ci0KLSAgW21zZyByZWxlYXNlXTsKLX0KLQotLy8gVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIE1pc3NlZFZhbHVlV2lyZUZvcm1hdCkKLS0gKHZvaWQpdGVzdE1hcF9NaXNzZWRWYWx1ZVdpcmVGb3JtYXQgewotICAvLyBObyB2YWx1ZSBmaWVsZCBpbiB3aXJlIGZvcm1hdAotICBOU0RhdGEgKmRhdGEgPSBEYXRhRnJvbUNTdHIoIlx4MEFceDAyXHgwOFx4MDEiKTsKLQotICBUZXN0TWFwICptc2cgPSBbW1Rlc3RNYXAgYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwSW50MzJJbnQzMi5jb3VudCwgMVUpOwotICBpbnQzMl90IHZhbCA9IDY2NjsKLSAgWENUQXNzZXJ0VHJ1ZShbbXNnLm1hcEludDMySW50MzIgdmFsdWVGb3JLZXk6MSB2YWx1ZTomdmFsXSk7Ci0gIFhDVEFzc2VydEVxdWFsKHZhbCwgMCk7Ci0KLSAgW21zZyByZWxlYXNlXTsKLX0KLQotLy8gVEVTVChHZW5lcmF0ZWRNYXBGaWVsZFRlc3QsIFVua25vd25GaWVsZFdpcmVGb3JtYXQpCi0tICh2b2lkKXRlc3RNYXBfVW5rbm93bkZpZWxkV2lyZUZvcm1hdCB7Ci0gIC8vIFVua25vd24gZmllbGQgaW4gd2lyZSBmb3JtYXQKLSAgTlNEYXRhICpkYXRhID0gRGF0YUZyb21DU3RyKCJceDBBXHgwNlx4MDhceDAyXHgxMFx4MDNceDE4XHgwMSIpOwotCi0gIFRlc3RNYXAgKm1zZyA9IFtbVGVzdE1hcCBhbGxvY10gaW5pdFdpdGhEYXRhOmRhdGEgZXJyb3I6TlVMTF07Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBJbnQzMkludDMyLmNvdW50LCAxVSk7Ci0gIGludDMyX3QgdmFsID0gNjY2OwotICBYQ1RBc3NlcnRUcnVlKFttc2cubWFwSW50MzJJbnQzMiB2YWx1ZUZvcktleToyIHZhbHVlOiZ2YWxdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsLCAzKTsKLQotICBbbXNnIHJlbGVhc2VdOwotfQotCi0vLyBURVNUKEdlbmVyYXRlZE1hcEZpZWxkVGVzdCwgQ29ycnVwdGVkV2lyZUZvcm1hdCkKLS0gKHZvaWQpdGVzdE1hcF9Db3JydXB0ZWRXaXJlRm9ybWF0IHsKLSAgLy8gY29ycnVwdGVkIGRhdGEgaW4gd2lyZSBmb3JtYXQKLSAgTlNEYXRhICpkYXRhID0gRGF0YUZyb21DU3RyKCJceDBBXHgwNlx4MDhceDAyXHgxMVx4MDMiKTsKLQotICBOU0Vycm9yICplcnJvciA9IG5pbDsKLSAgVGVzdE1hcCAqbXNnID0gW1Rlc3RNYXAgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOiZlcnJvcl07Ci0gIFhDVEFzc2VydE5pbChtc2cpOwotICBYQ1RBc3NlcnROb3ROaWwoZXJyb3IpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZXJyb3IuZG9tYWluLCBHUEJNZXNzYWdlRXJyb3JEb21haW4pOwotICBYQ1RBc3NlcnRFcXVhbChlcnJvci5jb2RlLCBHUEJNZXNzYWdlRXJyb3JDb2RlTWFsZm9ybWVkRGF0YSk7Ci19Ci0KLS8vIFRFU1QoR2VuZXJhdGVkTWFwRmllbGRUZXN0LCBQcm90bzJVbmtub3duRW51bSkKLS0gKHZvaWQpdGVzdE1hcF9Qcm90bzJVbmtub3duRW51bSB7Ci0gIFRlc3RFbnVtTWFwUGx1c0V4dHJhICpvcmlnID0gW1tUZXN0RW51bU1hcFBsdXNFeHRyYSBhbGxvY10gaW5pdF07Ci0KLSAgb3JpZy5rbm93bk1hcEZpZWxkID0gW0dQQkludDMyRW51bURpY3Rpb25hcnkKLSAgICAgIGRpY3Rpb25hcnlXaXRoVmFsaWRhdGlvbkZ1bmN0aW9uOlByb3RvMk1hcEVudW1QbHVzRXh0cmFfSXNWYWxpZFZhbHVlXTsKLSAgb3JpZy51bmtub3duTWFwRmllbGQgPSBbR1BCSW50MzJFbnVtRGljdGlvbmFyeQotICAgICAgZGljdGlvbmFyeVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246UHJvdG8yTWFwRW51bVBsdXNFeHRyYV9Jc1ZhbGlkVmFsdWVdOwotICBbb3JpZy5rbm93bk1hcEZpZWxkIHNldFZhbHVlOlByb3RvMk1hcEVudW1QbHVzRXh0cmFfRVByb3RvMk1hcEVudW1Gb28KLSAgICAgICAgICAgICAgICAgICAgICAgIGZvcktleTowXTsKLSAgW29yaWcudW5rbm93bk1hcEZpZWxkIHNldFZhbHVlOlByb3RvMk1hcEVudW1QbHVzRXh0cmFfRVByb3RvMk1hcEVudW1FeHRyYQotICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JLZXk6MF07Ci0KLSAgTlNEYXRhICpkYXRhID0gW29yaWcgZGF0YV07Ci0gIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgVGVzdEVudW1NYXAgKm1zZzEgPSBbVGVzdEVudW1NYXAgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbChtc2cxLmtub3duTWFwRmllbGQuY291bnQsIDFVKTsKLSAgaW50MzJfdCB2YWwgPSAtMTsKLSAgWENUQXNzZXJ0VHJ1ZShbbXNnMS5rbm93bk1hcEZpZWxkIHZhbHVlRm9yS2V5OjAgdmFsdWU6JnZhbF0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWwsIFByb3RvMk1hcEVudW1fUHJvdG8yTWFwRW51bUZvbyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZzEudW5rbm93bkZpZWxkcy5jb3VudE9mRmllbGRzLCAxVSk7Ci0KLSAgZGF0YSA9IFttc2cxIGRhdGFdOwotICBUZXN0RW51bU1hcFBsdXNFeHRyYSAqbXNnMiA9Ci0gICAgICBbVGVzdEVudW1NYXBQbHVzRXh0cmEgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICB2YWwgPSAtMTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnMi5rbm93bk1hcEZpZWxkLmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW21zZzIua25vd25NYXBGaWVsZCB2YWx1ZUZvcktleTowIHZhbHVlOiZ2YWxdKTsKLSAgWENUQXNzZXJ0RXF1YWwodmFsLCBQcm90bzJNYXBFbnVtUGx1c0V4dHJhX0VQcm90bzJNYXBFbnVtRm9vKTsKLSAgdmFsID0gLTE7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZzIudW5rbm93bk1hcEZpZWxkLmNvdW50LCAxVSk7Ci0gIFhDVEFzc2VydFRydWUoW21zZzIudW5rbm93bk1hcEZpZWxkIHZhbHVlRm9yS2V5OjAgdmFsdWU6JnZhbF0pOwotICBYQ1RBc3NlcnRFcXVhbCh2YWwsIFByb3RvMk1hcEVudW1QbHVzRXh0cmFfRVByb3RvMk1hcEVudW1FeHRyYSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZzIudW5rbm93bkZpZWxkcy5jb3VudE9mRmllbGRzLCAwVSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG9yaWcsIG1zZzIpOwotCi0gIFtvcmlnIHJlbGVhc2VdOwotfQotCi0jcHJhZ21hIG1hcmsgLSBNYXAgUm91bmQgVHJpcHBpbmcKLQotLSAodm9pZCl0ZXN0UHJvdG8yTWFwUm91bmRUcmlwcGluZyB7Ci0gIE1lc3NhZ2UyICptc2cgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLQotICAvLyBLZXkvVmFsdWUgZGF0YSBzaG91bGQgcmVzdWx0IGluIGRpZmZlcmVudCBieXRlIGxlbmd0aHMgb24gd2lyZSB0byBlbnN1cmUKLSAgLy8gZXZlcnl0aGluZyBpcyByaWdodC4KLSAgW21zZy5tYXBJbnQzMkludDMyIHNldFZhbHVlOjEwMDAgZm9yS2V5OjIwMF07Ci0gIFttc2cubWFwSW50MzJJbnQzMiBzZXRWYWx1ZToxMDEgZm9yS2V5OjIwMDFdOwotICBbbXNnLm1hcEludDY0SW50NjQgc2V0VmFsdWU6MTAwMiBmb3JLZXk6MjAyXTsKLSAgW21zZy5tYXBJbnQ2NEludDY0IHNldFZhbHVlOjEwMyBmb3JLZXk6MjAwM107Ci0gIFttc2cubWFwVWludDMyVWludDMyIHNldFZhbHVlOjEwMDQgZm9yS2V5OjIwNF07Ci0gIFttc2cubWFwVWludDMyVWludDMyIHNldFZhbHVlOjEwNSBmb3JLZXk6MjAwNV07Ci0gIFttc2cubWFwVWludDY0VWludDY0IHNldFZhbHVlOjEwMDYgZm9yS2V5OjIwNl07Ci0gIFttc2cubWFwVWludDY0VWludDY0IHNldFZhbHVlOjEwNyBmb3JLZXk6MjAwN107Ci0gIFttc2cubWFwU2ludDMyU2ludDMyIHNldFZhbHVlOjEwMDggZm9yS2V5OjIwOF07Ci0gIFttc2cubWFwU2ludDMyU2ludDMyIHNldFZhbHVlOjEwOSBmb3JLZXk6MjAwOV07Ci0gIFttc2cubWFwU2ludDY0U2ludDY0IHNldFZhbHVlOjEwMTAgZm9yS2V5OjIxMF07Ci0gIFttc2cubWFwU2ludDY0U2ludDY0IHNldFZhbHVlOjExMSBmb3JLZXk6MjAxMV07Ci0gIFttc2cubWFwRml4ZWQzMkZpeGVkMzIgc2V0VmFsdWU6MTAxMiBmb3JLZXk6MjEyXTsKLSAgW21zZy5tYXBGaXhlZDMyRml4ZWQzMiBzZXRWYWx1ZToxMTMgZm9yS2V5OjIwMTNdOwotICBbbXNnLm1hcEZpeGVkNjRGaXhlZDY0IHNldFZhbHVlOjEwMTQgZm9yS2V5OjIxNF07Ci0gIFttc2cubWFwRml4ZWQ2NEZpeGVkNjQgc2V0VmFsdWU6MTE1IGZvcktleToyMDE1XTsKLSAgW21zZy5tYXBTZml4ZWQzMlNmaXhlZDMyIHNldFZhbHVlOjEwMTYgZm9yS2V5OjIxNl07Ci0gIFttc2cubWFwU2ZpeGVkMzJTZml4ZWQzMiBzZXRWYWx1ZToxMTcgZm9yS2V5OjIwMTddOwotICBbbXNnLm1hcFNmaXhlZDY0U2ZpeGVkNjQgc2V0VmFsdWU6MTAxOCBmb3JLZXk6MjE4XTsKLSAgW21zZy5tYXBTZml4ZWQ2NFNmaXhlZDY0IHNldFZhbHVlOjExOSBmb3JLZXk6MjAxOV07Ci0gIFttc2cubWFwSW50MzJGbG9hdCBzZXRWYWx1ZToxMDIwLmYgZm9yS2V5OjIyMF07Ci0gIFttc2cubWFwSW50MzJGbG9hdCBzZXRWYWx1ZToxMjEuZiBmb3JLZXk6MjAyMV07Ci0gIFttc2cubWFwSW50MzJEb3VibGUgc2V0VmFsdWU6MTAyMi4gZm9yS2V5OjIyMl07Ci0gIFttc2cubWFwSW50MzJEb3VibGUgc2V0VmFsdWU6MTIzLiBmb3JLZXk6MjAyM107Ci0gIFttc2cubWFwQm9vbEJvb2wgc2V0VmFsdWU6ZmFsc2UgZm9yS2V5OnRydWVdOwotICBbbXNnLm1hcEJvb2xCb29sIHNldFZhbHVlOnRydWUgZm9yS2V5OmZhbHNlXTsKLSAgbXNnLm1hcFN0cmluZ1N0cmluZ1tAIjIyNCJdID0gQCIxMDI0IjsKLSAgbXNnLm1hcFN0cmluZ1N0cmluZ1tAIjIwMjUiXSA9IEAiMTI1IjsKLSAgbXNnLm1hcFN0cmluZ0J5dGVzW0AiMjI2Il0gPSBEYXRhRnJvbUNTdHIoIjEwMjYiKTsKLSAgbXNnLm1hcFN0cmluZ0J5dGVzW0AiMjAyNyJdID0gRGF0YUZyb21DU3RyKCIxMjciKTsKLSAgTWVzc2FnZTIgKnZhbDEgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgdmFsMS5vcHRpb25hbEludDMyID0gMTAyODsKLSAgTWVzc2FnZTIgKnZhbDIgPSBbW01lc3NhZ2UyIGFsbG9jXSBpbml0XTsKLSAgdmFsMi5vcHRpb25hbEludDMyID0gMTI5OwotICBbbXNnLm1hcFN0cmluZ01lc3NhZ2Ugc2V0VmFsdWU6dmFsMSBmb3JLZXk6QCIyMjgiXTsKLSAgW21zZy5tYXBTdHJpbmdNZXNzYWdlIHNldFZhbHVlOnZhbDIgZm9yS2V5OkAiMjAyOSJdOwotICBbbXNnLm1hcEludDMyQnl0ZXMgc2V0T2JqZWN0OkRhdGFGcm9tQ1N0cigiMTAzMCBieXRlcyIpIGZvcktleToyMzBdOwotICBbbXNnLm1hcEludDMyQnl0ZXMgc2V0T2JqZWN0OkRhdGFGcm9tQ1N0cigiMTMxIikgZm9yS2V5OjIwMzFdOwotICBbbXNnLm1hcEludDMyRW51bSBzZXRWYWx1ZTpNZXNzYWdlMl9FbnVtX0JhciBmb3JLZXk6MjMyXTsKLSAgW21zZy5tYXBJbnQzMkVudW0gc2V0VmFsdWU6TWVzc2FnZTJfRW51bV9CYXogZm9yS2V5OjIwMzNdOwotICBNZXNzYWdlMiAqdmFsMyA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICB2YWwzLm9wdGlvbmFsSW50MzIgPSAxMDM0OwotICBNZXNzYWdlMiAqdmFsNCA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRdOwotICB2YWw0Lm9wdGlvbmFsSW50MzIgPSAxMzU7Ci0gIFttc2cubWFwSW50MzJNZXNzYWdlIHNldE9iamVjdDp2YWwzIGZvcktleToyMzRdOwotICBbbXNnLm1hcEludDMyTWVzc2FnZSBzZXRPYmplY3Q6dmFsNCBmb3JLZXk6MjAzNV07Ci0KLSAgTlNEYXRhICpkYXRhID0gW21zZyBkYXRhXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICBNZXNzYWdlMiAqbXNnMiA9IFtbTWVzc2FnZTIgYWxsb2NdIGluaXRXaXRoRGF0YTpkYXRhIGVycm9yOk5VTExdOwotCi0gIFhDVEFzc2VydE5vdEVxdWFsKG1zZzIsIG1zZyk7ICAvLyBQb2ludGVyIGNvbXBhcmlzb24KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZzIsIG1zZyk7Ci0KLSAgW3ZhbDQgcmVsZWFzZV07Ci0gIFt2YWwzIHJlbGVhc2VdOwotICBbdmFsMiByZWxlYXNlXTsKLSAgW3ZhbDEgcmVsZWFzZV07Ci0gIFttc2cyIHJlbGVhc2VdOwotICBbbXNnIHJlbGVhc2VdOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQk1lc3NhZ2VUZXN0cy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJNZXNzYWdlVGVzdHMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODlkMWZjZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQk1lc3NhZ2VUZXN0cy5tCisrKyAvZGV2L251bGwKQEAgLTEsMjAyMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotCi0jaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KLQotI2ltcG9ydCAiR1BCQXJyYXlfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQkRlc2NyaXB0b3IuaCIKLSNpbXBvcnQgIkdQQkRpY3Rpb25hcnlfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQk1lc3NhZ2VfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgIkdQQlVua25vd25GaWVsZF9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkU2V0X1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RPYmpjLnBib2JqYy5oIgotCi1AaW50ZXJmYWNlIE1lc3NhZ2VUZXN0cyA6IEdQQlRlc3RDYXNlCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBNZXNzYWdlVGVzdHMKLQotLy8gVE9ETyh0aG9tYXN2bCk6IHRoaXMgc2hvdWxkIGdldCBzcGxpdCBpbnRvIGEgZmV3IGZpbGVzIG9mIGxvZ2ljIGp1bmtzLCBpdCBpcwotLy8gYSBqdW1ibGUgb2YgdGhpbmdzIGF0IHRoZSBtb21lbnQgKGFuZCB0aGUgdGVzdHV0aWxzIGhhdmUgYSBidW5jaCBvZiB0aGUgcmVhbAotLy8gYXNzZXJ0aW9ucykuCi0KLS0gKFRlc3RBbGxUeXBlcyAqKW1lcmdlU291cmNlIHsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxJbnQzMjoxXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxTdHJpbmc6QCJmb28iXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZTpbRm9yZWlnbk1lc3NhZ2UgbWVzc2FnZV1dOwotICBbbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5IGFkZE9iamVjdDpAImJhciJdOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotLSAoVGVzdEFsbFR5cGVzICopbWVyZ2VEZXN0aW5hdGlvbiB7Ci0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsSW50NjQ6Ml07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsU3RyaW5nOkAiYmF6Il07Ci0gIEZvcmVpZ25NZXNzYWdlICpmb3JlaWduTWVzc2FnZSA9IFtGb3JlaWduTWVzc2FnZSBtZXNzYWdlXTsKLSAgW2ZvcmVpZ25NZXNzYWdlIHNldEM6M107Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2U6Zm9yZWlnbk1lc3NhZ2VdOwotICBbbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5IGFkZE9iamVjdDpAInF1eCJdOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotLSAoVGVzdEFsbFR5cGVzICopbWVyZ2VEZXN0aW5hdGlvbldpdGhvdXRGb3JlaWduTWVzc2FnZUl2YXIgewotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEludDY0OjJdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbFN0cmluZzpAImJheiJdOwotICBbbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5IGFkZE9iamVjdDpAInF1eCJdOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotLSAoVGVzdEFsbFR5cGVzICopbWVyZ2VSZXN1bHQgewotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEludDMyOjFdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEludDY0OjJdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbFN0cmluZzpAImZvbyJdOwotICBGb3JlaWduTWVzc2FnZSAqZm9yZWlnbk1lc3NhZ2UgPSBbRm9yZWlnbk1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtmb3JlaWduTWVzc2FnZSBzZXRDOjNdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlOmZvcmVpZ25NZXNzYWdlXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheSBhZGRPYmplY3Q6QCJxdXgiXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheSBhZGRPYmplY3Q6QCJiYXIiXTsKLSAgcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLS0gKFRlc3RBbGxUeXBlcyAqKW1lcmdlUmVzdWx0Rm9yRGVzdGluYXRpb25XaXRob3V0Rm9yZWlnbk1lc3NhZ2VJdmFyIHsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxJbnQzMjoxXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxJbnQ2NDoyXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxTdHJpbmc6QCJmb28iXTsKLSAgRm9yZWlnbk1lc3NhZ2UgKmZvcmVpZ25NZXNzYWdlID0gW0ZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlOmZvcmVpZ25NZXNzYWdlXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheSBhZGRPYmplY3Q6QCJxdXgiXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheSBhZGRPYmplY3Q6QCJiYXIiXTsKLSAgcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLS0gKFRlc3RBbGxFeHRlbnNpb25zICopbWVyZ2VFeHRlbnNpb25zRGVzdGluYXRpb24gewotICBUZXN0QWxsRXh0ZW5zaW9ucyAqbWVzc2FnZSA9IFtUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbnQzMkV4dGVuc2lvbl0gdmFsdWU6QDVdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFN0cmluZ0V4dGVuc2lvbl0gdmFsdWU6QCJmb28iXTsKLSAgRm9yZWlnbk1lc3NhZ2UgKmZvcmVpZ25NZXNzYWdlID0gW0ZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VdOwotICBmb3JlaWduTWVzc2FnZS5jID0gNDsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIHZhbHVlOmZvcmVpZ25NZXNzYWdlXTsKLSAgVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgKm5lc3RlZE1lc3NhZ2UgPQotICAgICAgW1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlIG1lc3NhZ2VdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpuZXN0ZWRNZXNzYWdlXTsKLSAgcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLS0gKFRlc3RBbGxFeHRlbnNpb25zICopbWVyZ2VFeHRlbnNpb25zU291cmNlIHsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50NjRFeHRlbnNpb25dIHZhbHVlOkA2XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdFeHRlbnNpb25dIHZhbHVlOkAiYmFyIl07Ci0gIEZvcmVpZ25NZXNzYWdlICpmb3JlaWduTWVzc2FnZSA9IFtGb3JlaWduTWVzc2FnZSBtZXNzYWdlXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIHZhbHVlOmZvcmVpZ25NZXNzYWdlXTsKLSAgVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgKm5lc3RlZE1lc3NhZ2UgPQotICAgICAgW1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlIG1lc3NhZ2VdOwotICBuZXN0ZWRNZXNzYWdlLmJiID0gNzsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6bmVzdGVkTWVzc2FnZV07Ci0gIHJldHVybiBtZXNzYWdlOwotfQotCi0tIChUZXN0QWxsRXh0ZW5zaW9ucyAqKW1lcmdlRXh0ZW5zaW9uc1Jlc3VsdCB7Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEludDMyRXh0ZW5zaW9uXSB2YWx1ZTpANV07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50NjRFeHRlbnNpb25dIHZhbHVlOkA2XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdFeHRlbnNpb25dIHZhbHVlOkAiYmFyIl07Ci0gIEZvcmVpZ25NZXNzYWdlICpmb3JlaWduTWVzc2FnZSA9IFtGb3JlaWduTWVzc2FnZSBtZXNzYWdlXTsKLSAgZm9yZWlnbk1lc3NhZ2UuYyA9IDQ7Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpmb3JlaWduTWVzc2FnZV07Ci0gIFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlICpuZXN0ZWRNZXNzYWdlID0KLSAgICAgIFtUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZSBtZXNzYWdlXTsKLSAgbmVzdGVkTWVzc2FnZS5iYiA9IDc7Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIHZhbHVlOm5lc3RlZE1lc3NhZ2VdOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotLSAodm9pZCl0ZXN0TWVyZ2VGcm9tIHsKLSAgVGVzdEFsbFR5cGVzICpyZXN1bHQgPSBbW3NlbGYubWVyZ2VEZXN0aW5hdGlvbiBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIFtyZXN1bHQgbWVyZ2VGcm9tOnNlbGYubWVyZ2VTb3VyY2VdOwotICBOU0RhdGEgKnJlc3VsdERhdGEgPSBbcmVzdWx0IGRhdGFdOwotICBOU0RhdGEgKm1lcmdlUmVzdWx0RGF0YSA9IFtzZWxmLm1lcmdlUmVzdWx0IGRhdGFdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmVzdWx0RGF0YSwgbWVyZ2VSZXN1bHREYXRhKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHJlc3VsdCwgc2VsZi5tZXJnZVJlc3VsdCk7Ci0KLSAgLy8gVGVzdCB3aGVuIGRlc3RpbmF0aW9uIGRvZXMgbm90IGhhdmUgYW4gSXZhciAodHlwZSBpcyBhbiBvYmplY3QpIGJ1dCBzb3VyY2UKLSAgLy8gaGFzIHN1Y2ggSXZhci4KLSAgLy8gVGhlIHJlc3VsdCBtdXN0IGhhcyB0aGUgSXZhciB3aGljaCBpcyBzYW1lIGFzIHRoZSBvbmUgaW4gc291cmNlLgotICByZXN1bHQgPSBbW3NlbGYubWVyZ2VEZXN0aW5hdGlvbldpdGhvdXRGb3JlaWduTWVzc2FnZUl2YXIgY29weV0gYXV0b3JlbGVhc2VdOwotICBbcmVzdWx0IG1lcmdlRnJvbTpzZWxmLm1lcmdlU291cmNlXTsKLSAgcmVzdWx0RGF0YSA9IFtyZXN1bHQgZGF0YV07Ci0gIG1lcmdlUmVzdWx0RGF0YSA9Ci0gICAgICBbc2VsZi5tZXJnZVJlc3VsdEZvckRlc3RpbmF0aW9uV2l0aG91dEZvcmVpZ25NZXNzYWdlSXZhciBkYXRhXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHJlc3VsdERhdGEsIG1lcmdlUmVzdWx0RGF0YSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cygKLSAgICAgIHJlc3VsdCwgc2VsZi5tZXJnZVJlc3VsdEZvckRlc3RpbmF0aW9uV2l0aG91dEZvcmVpZ25NZXNzYWdlSXZhcik7Ci0KLSAgLy8gVGVzdCB3aGVuIGRlc3RpbmF0aW9uIGlzIGVtcHR5LgotICAvLyBUaGUgcmVzdWx0IG11c3QgaXMgc2FtZSBhcyB0aGUgc291cmNlLgotICByZXN1bHQgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBbcmVzdWx0IG1lcmdlRnJvbTpzZWxmLm1lcmdlU291cmNlXTsKLSAgcmVzdWx0RGF0YSA9IFtyZXN1bHQgZGF0YV07Ci0gIG1lcmdlUmVzdWx0RGF0YSA9IFtzZWxmLm1lcmdlU291cmNlIGRhdGFdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmVzdWx0RGF0YSwgbWVyZ2VSZXN1bHREYXRhKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHJlc3VsdCwgc2VsZi5tZXJnZVNvdXJjZSk7Ci19Ci0KLS0gKHZvaWQpdGVzdE1lcmdlRnJvbVdpdGhFeHRlbnNpb25zIHsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKnJlc3VsdCA9IFtzZWxmIG1lcmdlRXh0ZW5zaW9uc0Rlc3RpbmF0aW9uXTsKLSAgW3Jlc3VsdCBtZXJnZUZyb206W3NlbGYgbWVyZ2VFeHRlbnNpb25zU291cmNlXV07Ci0gIE5TRGF0YSAqcmVzdWx0RGF0YSA9IFtyZXN1bHQgZGF0YV07Ci0gIE5TRGF0YSAqbWVyZ2VSZXN1bHREYXRhID0gW1tzZWxmIG1lcmdlRXh0ZW5zaW9uc1Jlc3VsdF0gZGF0YV07Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhyZXN1bHREYXRhLCBtZXJnZVJlc3VsdERhdGEpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmVzdWx0LCBbc2VsZiBtZXJnZUV4dGVuc2lvbnNSZXN1bHRdKTsKLQotICAvLyBUZXN0IG1lcmdpbmcgZnJvbSBkYXRhLgotICByZXN1bHQgPSBbc2VsZiBtZXJnZUV4dGVuc2lvbnNEZXN0aW5hdGlvbl07Ci0gIE5TRGF0YSAqZGF0YSA9IFtbc2VsZiBtZXJnZUV4dGVuc2lvbnNTb3VyY2VdIGRhdGFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gIFtyZXN1bHQgbWVyZ2VGcm9tRGF0YTpkYXRhCi0gICAgICBleHRlbnNpb25SZWdpc3RyeTpbVW5pdHRlc3RSb290IGV4dGVuc2lvblJlZ2lzdHJ5XV07Ci0gIHJlc3VsdERhdGEgPSBbcmVzdWx0IGRhdGFdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmVzdWx0RGF0YSwgbWVyZ2VSZXN1bHREYXRhKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHJlc3VsdCwgW3NlbGYgbWVyZ2VFeHRlbnNpb25zUmVzdWx0XSk7Ci19Ci0KLS0gKHZvaWQpdGVzdElzRXF1YWxzIHsKLSAgVGVzdEFsbFR5cGVzICpyZXN1bHQgPSBbW3NlbGYubWVyZ2VEZXN0aW5hdGlvbiBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIFtyZXN1bHQgbWVyZ2VGcm9tOnNlbGYubWVyZ2VTb3VyY2VdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMocmVzdWx0LmRhdGEsIHNlbGYubWVyZ2VSZXN1bHQuZGF0YSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhyZXN1bHQsIHNlbGYubWVyZ2VSZXN1bHQpOwotICBUZXN0QWxsVHlwZXMgKnJlc3VsdDIgPSBbW3NlbGYubWVyZ2VEZXN0aW5hdGlvbiBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhyZXN1bHQyLmRhdGEsIHNlbGYubWVyZ2VSZXN1bHQuZGF0YSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhyZXN1bHQyLCBzZWxmLm1lcmdlUmVzdWx0KTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFJlcXVpcmVkLWZpZWxkLXJlbGF0ZWQgdGVzdHMuCi0KLS0gKFRlc3RSZXF1aXJlZCAqKXRlc3RSZXF1aXJlZEluaXRpYWxpemVkIHsKLSAgVGVzdFJlcXVpcmVkICptZXNzYWdlID0gW1Rlc3RSZXF1aXJlZCBtZXNzYWdlXTsKLSAgW21lc3NhZ2Ugc2V0QToxXTsKLSAgW21lc3NhZ2Ugc2V0QjoyXTsKLSAgW21lc3NhZ2Ugc2V0QzozXTsKLSAgcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLS0gKHZvaWQpdGVzdFJlcXVpcmVkIHsKLSAgVGVzdFJlcXVpcmVkICptZXNzYWdlID0gW1Rlc3RSZXF1aXJlZCBtZXNzYWdlXTsKLQotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmluaXRpYWxpemVkKTsKLSAgW21lc3NhZ2Ugc2V0QToxXTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5pbml0aWFsaXplZCk7Ci0gIFttZXNzYWdlIHNldEI6MV07Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaW5pdGlhbGl6ZWQpOwotICBbbWVzc2FnZSBzZXRDOjFdOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaW5pdGlhbGl6ZWQpOwotfQotCi0tICh2b2lkKXRlc3RSZXF1aXJlZEZvcmVpZ24gewotICBUZXN0UmVxdWlyZWRGb3JlaWduICptZXNzYWdlID0gW1Rlc3RSZXF1aXJlZEZvcmVpZ24gbWVzc2FnZV07Ci0KLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmluaXRpYWxpemVkKTsKLQotICBbbWVzc2FnZSBzZXRPcHRpb25hbE1lc3NhZ2U6W1Rlc3RSZXF1aXJlZCBtZXNzYWdlXV07Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaW5pdGlhbGl6ZWQpOwotCi0gIFttZXNzYWdlIHNldE9wdGlvbmFsTWVzc2FnZTpzZWxmLnRlc3RSZXF1aXJlZEluaXRpYWxpemVkXTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmluaXRpYWxpemVkKTsKLQotICBbbWVzc2FnZS5yZXBlYXRlZE1lc3NhZ2VBcnJheSBhZGRPYmplY3Q6W1Rlc3RSZXF1aXJlZCBtZXNzYWdlXV07Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaW5pdGlhbGl6ZWQpOwotCi0gIFttZXNzYWdlLnJlcGVhdGVkTWVzc2FnZUFycmF5IHJlbW92ZUFsbE9iamVjdHNdOwotICBbbWVzc2FnZS5yZXBlYXRlZE1lc3NhZ2VBcnJheSBhZGRPYmplY3Q6c2VsZi50ZXN0UmVxdWlyZWRJbml0aWFsaXplZF07Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5pbml0aWFsaXplZCk7Ci19Ci0KLS0gKHZvaWQpdGVzdFJlcXVpcmVkRXh0ZW5zaW9uIHsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0KLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmluaXRpYWxpemVkKTsKLQotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1Rlc3RSZXF1aXJlZCBzaW5nbGVdIHZhbHVlOltUZXN0UmVxdWlyZWQgbWVzc2FnZV1dOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmluaXRpYWxpemVkKTsKLQotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1Rlc3RSZXF1aXJlZCBzaW5nbGVdCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpzZWxmLnRlc3RSZXF1aXJlZEluaXRpYWxpemVkXTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmluaXRpYWxpemVkKTsKLQotICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1Rlc3RSZXF1aXJlZCBtdWx0aV0gdmFsdWU6W1Rlc3RSZXF1aXJlZCBtZXNzYWdlXV07Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaW5pdGlhbGl6ZWQpOwotCi0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVGVzdFJlcXVpcmVkIG11bHRpXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MAotICAgICAgICAgICAgICAgICAgdmFsdWU6c2VsZi50ZXN0UmVxdWlyZWRJbml0aWFsaXplZF07Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5pbml0aWFsaXplZCk7Ci19Ci0KLS0gKHZvaWQpdGVzdERhdGFGcm9tVW5pbml0aWFsaXplZCB7Ci0gIFRlc3RSZXF1aXJlZCAqbWVzc2FnZSA9IFtUZXN0UmVxdWlyZWQgbWVzc2FnZV07Ci0gIE5TRGF0YSAqZGF0YSA9IFttZXNzYWdlIGRhdGFdOwotICAvLyBJbiBERUJVRywgdGhlIGRhdGEgZ2VuZXJhdGlvbiB3aWxsIGZhaWwsIGJ1dCBpbiBub24gREVCVUcsIGl0IHBhc3NlcwotICAvLyBiZWNhdXNlIHRoZSBjaGVjayBpc24ndCBkb25lIChmb3Igc3BlZWQpLgotI2lmZGVmIERFQlVHCi0gIFhDVEFzc2VydE5pbChkYXRhKTsKLSNlbHNlCi0gIFhDVEFzc2VydE5vdE5pbChkYXRhKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5pbml0aWFsaXplZCk7Ci0jZW5kaWYgIC8vIERFQlVHCi19Ci0KLS0gKHZvaWQpdGVzdEluaXRpYWxpemVkIHsKLSAgLy8gV2UncmUgbW9zdGx5IHRlc3RpbmcgdGhhdCBubyBleGNlcHRpb24gaXMgdGhyb3duLgotICBUZXN0UmVxdWlyZWQgKm1lc3NhZ2UgPSBbVGVzdFJlcXVpcmVkIG1lc3NhZ2VdOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmluaXRpYWxpemVkKTsKLX0KLQotLSAodm9pZCl0ZXN0RGF0YUZyb21OZXN0ZWRVbmluaXRpYWxpemVkIHsKLSAgVGVzdFJlcXVpcmVkRm9yZWlnbiAqbWVzc2FnZSA9IFtUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2VdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbE1lc3NhZ2U6W1Rlc3RSZXF1aXJlZCBtZXNzYWdlXV07Ci0gIFttZXNzYWdlLnJlcGVhdGVkTWVzc2FnZUFycmF5IGFkZE9iamVjdDpbVGVzdFJlcXVpcmVkIG1lc3NhZ2VdXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRNZXNzYWdlQXJyYXkgYWRkT2JqZWN0OltUZXN0UmVxdWlyZWQgbWVzc2FnZV1dOwotICBOU0RhdGEgKmRhdGEgPSBbbWVzc2FnZSBkYXRhXTsKLSAgLy8gSW4gREVCVUcsIHRoZSBkYXRhIGdlbmVyYXRpb24gd2lsbCBmYWlsLCBidXQgaW4gbm9uIERFQlVHLCBpdCBwYXNzZXMKLSAgLy8gYmVjYXVzZSB0aGUgY2hlY2sgaXNuJ3QgZG9uZSAoZm9yIHNwZWVkKS4KLSNpZmRlZiBERUJVRwotICBYQ1RBc3NlcnROaWwoZGF0YSk7Ci0jZWxzZQotICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaW5pdGlhbGl6ZWQpOwotI2VuZGlmICAvLyBERUJVRwotfQotCi0tICh2b2lkKXRlc3ROZXN0ZWRJbml0aWFsaXplZCB7Ci0gIC8vIFdlJ3JlIG1vc3RseSB0ZXN0aW5nIHRoYXQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KLQotICBUZXN0UmVxdWlyZWRGb3JlaWduICptZXNzYWdlID0gW1Rlc3RSZXF1aXJlZEZvcmVpZ24gbWVzc2FnZV07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsTWVzc2FnZTpbVGVzdFJlcXVpcmVkIG1lc3NhZ2VdXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRNZXNzYWdlQXJyYXkgYWRkT2JqZWN0OltUZXN0UmVxdWlyZWQgbWVzc2FnZV1dOwotICBbbWVzc2FnZS5yZXBlYXRlZE1lc3NhZ2VBcnJheSBhZGRPYmplY3Q6W1Rlc3RSZXF1aXJlZCBtZXNzYWdlXV07Ci0KLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5pbml0aWFsaXplZCk7Ci19Ci0KLS0gKHZvaWQpdGVzdFBhcnNlVW5pbml0aWFsaXplZCB7Ci0gIE5TRXJyb3IgKmVycm9yID0gbmlsOwotICBUZXN0UmVxdWlyZWQgKm1zZyA9Ci0gICAgICBbVGVzdFJlcXVpcmVkIHBhcnNlRnJvbURhdGE6R1BCRW1wdHlOU0RhdGEoKSBlcnJvcjomZXJyb3JdOwotICAvLyBJbiBERUJVRywgdGhlIHBhcnNlIHdpbGwgZmFpbCwgYnV0IGluIG5vbiBERUJVRywgaXQgcGFzc2VzIGJlY2F1c2UKLSAgLy8gdGhlIGNoZWNrIGlzbid0IGRvbmUgKGZvciBzcGVlZCkuCi0jaWZkZWYgREVCVUcKLSAgWENUQXNzZXJ0TmlsKG1zZyk7Ci0gIFhDVEFzc2VydE5vdE5pbChlcnJvcik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhlcnJvci5kb21haW4sIEdQQk1lc3NhZ2VFcnJvckRvbWFpbik7Ci0gIFhDVEFzc2VydEVxdWFsKGVycm9yLmNvZGUsIEdQQk1lc3NhZ2VFcnJvckNvZGVNaXNzaW5nUmVxdWlyZWRGaWVsZCk7Ci0jZWxzZQotICBYQ1RBc3NlcnROb3ROaWwobXNnKTsKLSAgWENUQXNzZXJ0TmlsKGVycm9yKTsKLSAgWENUQXNzZXJ0RmFsc2UobXNnLmluaXRpYWxpemVkKTsKLSNlbmRpZiAgLy8gREVCVUcKLX0KLQotLSAodm9pZCl0ZXN0Q29kaW5nIHsKLSAgTlNEYXRhICpkYXRhID0KLSAgICAgIFtOU0tleWVkQXJjaGl2ZXIgYXJjaGl2ZWREYXRhV2l0aFJvb3RPYmplY3Q6W3NlbGYgbWVyZ2VSZXN1bHRdXTsKLSAgaWQgdW5hcmNoaXZlZE9iamVjdCA9IFtOU0tleWVkVW5hcmNoaXZlciB1bmFyY2hpdmVPYmplY3RXaXRoRGF0YTpkYXRhXTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHModW5hcmNoaXZlZE9iamVjdCwgW3NlbGYgbWVyZ2VSZXN1bHRdKTsKLQotICAvLyBJbnRlbnRpb25hbGx5IGRvaW5nIGEgcG9pbnRlciBjb21wYXJpc29uLgotICBYQ1RBc3NlcnROb3RFcXVhbCh1bmFyY2hpdmVkT2JqZWN0LCBbc2VsZiBtZXJnZVJlc3VsdF0pOwotfQotCi0tICh2b2lkKXRlc3RPYmplY3RSZXNldCB7Ci0gIC8vIFRlc3RzIGEgZmFpbHVyZSB3aGVyZSBjbGVhcmluZyBvdXQgZGVmYXVsdHMgdmFsdWVzIGNhdXNlZCBhbiBvdmVyIHJlbGVhc2UuCi0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gTk87Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZTpbVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgbWVzc2FnZV1dOwotICBtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IE5POwotICBbbWVzc2FnZSBzZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2U6W1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlIG1lc3NhZ2VdXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlOm5pbF07Ci0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gTk87Ci19Ci0KLS0gKHZvaWQpdGVzdFNldHRpbmdIYXNUb1llcyB7Ci0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIFhDVEFzc2VydFRocm93cyhbbWVzc2FnZSBzZXRIYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2U6WUVTXSk7Ci19Ci0KLS0gKHZvaWQpdGVzdFJvb3QgewotICBYQ1RBc3NlcnROb3ROaWwoW1VuaXR0ZXN0Um9vdCBleHRlbnNpb25SZWdpc3RyeV0pOwotfQotCi0tICh2b2lkKXRlc3RHUEJNZXNzYWdlU2l6ZSB7Ci0gIC8vIFNlZSB0aGUgbm90ZSBpbiBHUEJNZXNzYWdlX1BhY2thZ2VQcml2YXRlLmggYWJvdXQgd2h5IHdlIHdhbnQgdG8ga2VlcCB0aGUKLSAgLy8gYmFzZSBpbnN0YW5jZSBzaXplIHBvaW50ZXIgc2l6ZSBhbGlnbmVkLgotICBzaXplX3QgbWVzc2FnZVNpemUgPSBjbGFzc19nZXRJbnN0YW5jZVNpemUoW0dQQk1lc3NhZ2UgY2xhc3NdKTsKLSAgWENUQXNzZXJ0RXF1YWwoKG1lc3NhZ2VTaXplICUgc2l6ZW9mKHZvaWQgKikpLCAoc2l6ZV90KTAsCi0gICAgICAgICAgICAgICAgIEAiQmFzZSBzaXplIGlzbid0IHBvaW50ZXIgc2l6ZSBhbGlnbmVkIik7Ci0KLSAgLy8gU2luY2Ugd2UgYWRkIHN0b3JhZ2Ugb3Vyc2VsdmVzIChzZWUgK2FsbG9jV2l0aFpvbmU6IGluIEdQQk1lc3NhZ2UpLCBjb25maXJtCi0gIC8vIHRoYXQgdGhlIHNpemUgb2Ygc29tZSBnZW5lcmF0ZWQgY2xhc3NlcyBpcyBzdGlsbCB0aGUgc2FtZSBhcyB0aGUgYmFzZSBmb3IKLSAgLy8gdGhhdCBsb2dpYyB0byB3b3JrIGFzIGRlc2lyZWQuCi0gIHNpemVfdCB0ZXN0TWVzc2FnZVNpemUgPSBjbGFzc19nZXRJbnN0YW5jZVNpemUoW1Rlc3RBbGxUeXBlcyBjbGFzc10pOwotICBYQ1RBc3NlcnRFcXVhbCh0ZXN0TWVzc2FnZVNpemUsIG1lc3NhZ2VTaXplKTsKLX0KLQotLSAodm9pZCl0ZXN0SW5pdCB7Ci0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIFtzZWxmIGFzc2VydENsZWFyOm1lc3NhZ2VdOwotfQotCi0tICh2b2lkKXRlc3RBY2Nlc3NvcnMgewotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRBbGxGaWVsZHM6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBbc2VsZiBhc3NlcnRBbGxGaWVsZHNTZXQ6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotfQotCi0tICh2b2lkKXRlc3RLVkNfVmFsdWVGb3JLZXkgewotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRBbGxGaWVsZHM6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBbc2VsZiBhc3NlcnRBbGxGaWVsZHNLVkNNYXRjaDptZXNzYWdlXTsKLX0KLQotLSAodm9pZCl0ZXN0S1ZDX1NldFZhbHVlX0ZvcktleSB7Ci0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIFtzZWxmIHNldEFsbEZpZWxkc1ZpYUtWQzptZXNzYWdlIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0gIFtzZWxmIGFzc2VydEFsbEZpZWxkc0tWQ01hdGNoOm1lc3NhZ2VdOwotICBbc2VsZiBhc3NlcnRBbGxGaWVsZHNTZXQ6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBbc2VsZiBhc3NlcnRBbGxGaWVsZHNLVkNNYXRjaDptZXNzYWdlXTsKLX0KLQotLSAodm9pZCl0ZXN0RGVzY3JpcHRpb24gewotICAvLyBObyByZWFsIHRlc3QsIGp1c3QgZXhlcmNpc2UgY29kZQotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRBbGxGaWVsZHM6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotCi0gIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bkZpZWxkcyA9Ci0gICAgICBbW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLSAgR1BCVW5rbm93bkZpZWxkICpmaWVsZCA9Ci0gICAgICBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOjJdIGF1dG9yZWxlYXNlXTsKLSAgW2ZpZWxkIGFkZFZhcmludDoyXTsKLSAgW3Vua25vd25GaWVsZHMgYWRkRmllbGQ6ZmllbGRdOwotICBmaWVsZCA9IFtbW0dQQlVua25vd25GaWVsZCBhbGxvY10gaW5pdFdpdGhOdW1iZXI6M10gYXV0b3JlbGVhc2VdOwotICBbZmllbGQgYWRkVmFyaW50OjRdOwotICBbdW5rbm93bkZpZWxkcyBhZGRGaWVsZDpmaWVsZF07Ci0KLSAgW21lc3NhZ2Ugc2V0VW5rbm93bkZpZWxkczp1bmtub3duRmllbGRzXTsKLQotICBOU1N0cmluZyAqZGVzY3JpcHRpb24gPSBbbWVzc2FnZSBkZXNjcmlwdGlvbl07Ci0gIFhDVEFzc2VydEdyZWF0ZXJUaGFuKFtkZXNjcmlwdGlvbiBsZW5ndGhdLCAwVSk7Ci0KLSAgR1BCTWVzc2FnZSAqbWVzc2FnZTIgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIFttZXNzYWdlMiBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEludDMyRXh0ZW5zaW9uXSB2YWx1ZTpAMV07Ci0KLSAgW21lc3NhZ2UyIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dIHZhbHVlOkAyXTsKLQotICBkZXNjcmlwdGlvbiA9IFttZXNzYWdlMiBkZXNjcmlwdGlvbl07Ci0gIFhDVEFzc2VydEdyZWF0ZXJUaGFuKFtkZXNjcmlwdGlvbiBsZW5ndGhdLCAwVSk7Ci19Ci0KLS0gKHZvaWQpdGVzdFNldHRlciB7Ci0gIC8vIFRlc3QgdG8gbWFrZSBzdXJlIHRoYXQgaWYgd2Ugc2V0IGEgdmFsdWUgdGhhdCBoYXMgYSBkZWZhdWx0IHZhbHVlCi0gIC8vIHdpdGggdGhlIGRlZmF1bHQsIHRoYXQgdGhlIGhhcyBpcyBzZXQsIGFuZCB0aGUgdmFsdWUgZ2V0cyBwdXQgaW50byB0aGUKLSAgLy8gbWVzc2FnZSBjb3JyZWN0bHkuCi0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbW21lc3NhZ2UgY2xhc3NdIGRlc2NyaXB0b3JdOwotICBYQ1RBc3NlcnROb3ROaWwoZGVzY3JpcHRvcik7Ci0gIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGREZXNjcmlwdG9yID0KLSAgICAgIFtkZXNjcmlwdG9yIGZpZWxkV2l0aE5hbWU6QCJkZWZhdWx0SW50MzIiXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzY3JpcHRvcik7Ci0gIEdQQkdlbmVyaWNWYWx1ZSBkZWZhdWx0VmFsdWUgPSBbZmllbGREZXNjcmlwdG9yIGRlZmF1bHRWYWx1ZV07Ci0gIFttZXNzYWdlIHNldERlZmF1bHRJbnQzMjpkZWZhdWx0VmFsdWUudmFsdWVJbnQzMl07Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0SW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLmRlZmF1bHRJbnQzMiwgZGVmYXVsdFZhbHVlLnZhbHVlSW50MzIpOwotCi0gIC8vIERvIHRoZSBzYW1lIHRoaW5nIHdpdGggYW4gb2JqZWN0IHR5cGUuCi0gIG1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBmaWVsZERlc2NyaXB0b3IgPSBbZGVzY3JpcHRvciBmaWVsZFdpdGhOYW1lOkAiZGVmYXVsdFN0cmluZyJdOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGREZXNjcmlwdG9yKTsKLSAgZGVmYXVsdFZhbHVlID0gW2ZpZWxkRGVzY3JpcHRvciBkZWZhdWx0VmFsdWVdOwotICBbbWVzc2FnZSBzZXREZWZhdWx0U3RyaW5nOmRlZmF1bHRWYWx1ZS52YWx1ZVN0cmluZ107Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UuZGVmYXVsdFN0cmluZywgZGVmYXVsdFZhbHVlLnZhbHVlU3RyaW5nKTsKLQotICAvLyBUZXN0IGRlZmF1bHQgc3RyaW5nIHR5cGUuCi0gIG1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5kZWZhdWx0U3RyaW5nLCBAImhlbGxvIik7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZyk7Ci0gIGZpZWxkRGVzY3JpcHRvciA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE5hbWU6QCJkZWZhdWx0U3RyaW5nIl07Ci0gIFhDVEFzc2VydE5vdE5pbChmaWVsZERlc2NyaXB0b3IpOwotICBkZWZhdWx0VmFsdWUgPSBbZmllbGREZXNjcmlwdG9yIGRlZmF1bHRWYWx1ZV07Ci0gIFttZXNzYWdlIHNldERlZmF1bHRTdHJpbmc6ZGVmYXVsdFZhbHVlLnZhbHVlU3RyaW5nXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UuZGVmYXVsdFN0cmluZywgQCJoZWxsbyIpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZyk7Ci0gIFttZXNzYWdlIHNldERlZmF1bHRTdHJpbmc6bmlsXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UuZGVmYXVsdFN0cmluZywgQCJoZWxsbyIpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmcpOwotICBtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmcgPSBOTzsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UuZGVmYXVsdFN0cmluZywgQCJoZWxsbyIpOwotCi0gIC8vIFRlc3QgZGVmYXVsdCBieXRlcyB0eXBlLgotICBOU0RhdGEgKmRlZmF1bHRCeXRlcyA9IFtAIndvcmxkIiBkYXRhVXNpbmdFbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLmRlZmF1bHRCeXRlcywgZGVmYXVsdEJ5dGVzKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nKTsKLSAgZmllbGREZXNjcmlwdG9yID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTmFtZTpAImRlZmF1bHRCeXRlcyJdOwotICBYQ1RBc3NlcnROb3ROaWwoZmllbGREZXNjcmlwdG9yKTsKLSAgZGVmYXVsdFZhbHVlID0gW2ZpZWxkRGVzY3JpcHRvciBkZWZhdWx0VmFsdWVdOwotICBbbWVzc2FnZSBzZXREZWZhdWx0Qnl0ZXM6ZGVmYXVsdFZhbHVlLnZhbHVlRGF0YV07Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLmRlZmF1bHRCeXRlcywgZGVmYXVsdEJ5dGVzKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRCeXRlcyk7Ci0gIFttZXNzYWdlIHNldERlZmF1bHRCeXRlczpuaWxdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5kZWZhdWx0Qnl0ZXMsIGRlZmF1bHRCeXRlcyk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEJ5dGVzKTsKLSAgbWVzc2FnZS5oYXNEZWZhdWx0Qnl0ZXMgPSBOTzsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Qnl0ZXMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5kZWZhdWx0Qnl0ZXMsIGRlZmF1bHRCeXRlcyk7Ci0KLSAgLy8gVGVzdCBvcHRpb25hbCBzdHJpbmcuCi0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmcpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5vcHRpb25hbFN0cmluZywgQCIiKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZyk7Ci0gIG1lc3NhZ2Uub3B0aW9uYWxTdHJpbmcgPSBuaWw7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmcpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5vcHRpb25hbFN0cmluZywgQCIiKTsKLSAgTlNTdHJpbmcgKnN0cmluZyA9IEAic3RyaW5nIjsKLSAgbWVzc2FnZS5vcHRpb25hbFN0cmluZyA9IHN0cmluZzsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2Uub3B0aW9uYWxTdHJpbmcsIHN0cmluZyk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZyk7Ci0gIG1lc3NhZ2Uub3B0aW9uYWxTdHJpbmcgPSBuaWw7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmcpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5vcHRpb25hbFN0cmluZywgQCIiKTsKLQotICAvLyBUZXN0IG9wdGlvbmFsIGRhdGEuCi0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLm9wdGlvbmFsQnl0ZXMsIEdQQkVtcHR5TlNEYXRhKCkpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsQnl0ZXMpOwotICBtZXNzYWdlLm9wdGlvbmFsQnl0ZXMgPSBuaWw7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLm9wdGlvbmFsQnl0ZXMsIEdQQkVtcHR5TlNEYXRhKCkpOwotICBOU0RhdGEgKmRhdGEgPSBbQCJieXRlcyIgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotICBtZXNzYWdlLm9wdGlvbmFsQnl0ZXMgPSBkYXRhOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5vcHRpb25hbEJ5dGVzLCBkYXRhKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsQnl0ZXMpOwotICBtZXNzYWdlLm9wdGlvbmFsQnl0ZXMgPSBuaWw7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLm9wdGlvbmFsQnl0ZXMsIEdQQkVtcHR5TlNEYXRhKCkpOwotCi0gIC8vIFRlc3QgbGF6eSBtZXNzYWdlIHNldHRpbmcKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbExhenlNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxMYXp5TWVzc2FnZSA9IE5POwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTGF6eU1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5vcHRpb25hbExhenlNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbExhenlNZXNzYWdlKTsKLSAgbWVzc2FnZS5vcHRpb25hbExhenlNZXNzYWdlID0gbmlsOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTGF6eU1lc3NhZ2UpOwotCi0gIC8vIFRlc3QgbmVzdGVkIG1lc3NhZ2VzCi0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0gIG1lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZS5iYiA9IDE7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbExhenlNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5vcHRpb25hbExhenlNZXNzYWdlLmJiLCAxKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0gIG1lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZSA9IG5pbDsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbExhenlNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5vcHRpb25hbExhenlNZXNzYWdlLmJiLCAwKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbExhenlNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0KLSAgLy8gLXRlc3REZWZhdWx0U3ViTWVzc2FnZXMgdGVzdHMgdGhlICJkZWZhdWx0aW5nIiBoYW5kbGluZyBvZiBmaWVsZHMKLSAgLy8gY29udGFpbmluZyBtZXNzYWdlcy4KLX0KLQotLSAodm9pZCl0ZXN0UmVwZWF0ZWRTZXR0ZXJzIHsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0QWxsRmllbGRzOm1lc3NhZ2UgcmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgW3NlbGYgbW9kaWZ5UmVwZWF0ZWRGaWVsZHM6bWVzc2FnZV07Ci0gIFtzZWxmIGFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQ6bWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotfQotCi0tICh2b2lkKXRlc3RDbGVhciB7Ci0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIFtzZWxmIHNldEFsbEZpZWxkczptZXNzYWdlIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0gIFtzZWxmIGNsZWFyQWxsRmllbGRzOm1lc3NhZ2VdOwotICBbc2VsZiBhc3NlcnRDbGVhcjptZXNzYWdlXTsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlMiA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLCBtZXNzYWdlMik7Ci19Ci0KLS0gKHZvaWQpdGVzdENsZWFyS1ZDIHsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0QWxsRmllbGRzOm1lc3NhZ2UgcmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgW3NlbGYgY2xlYXJBbGxGaWVsZHM6bWVzc2FnZV07Ci0gIFtzZWxmIGFzc2VydENsZWFyOm1lc3NhZ2VdOwotICBbc2VsZiBhc3NlcnRDbGVhcktWQzptZXNzYWdlXTsKLX0KLQotLSAodm9pZCl0ZXN0Q2xlYXJFeHRlbnNpb24gewotICAvLyBjbGVhckV4dGVuc2lvbigpIGlzIG5vdCBhY3R1YWxseSB1c2VkIGluIFRlc3RVdGlsLCBzbyB0cnkgaXQgbWFudWFsbHkuCi0gIEdQQk1lc3NhZ2UgKm1lc3NhZ2UxID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBbbWVzc2FnZTEgc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbnQzMkV4dGVuc2lvbl0gdmFsdWU6QDFdOwotCi0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UxIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50MzJFeHRlbnNpb25dXSk7Ci0gIFttZXNzYWdlMSBjbGVhckV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50MzJFeHRlbnNpb25dXTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UxIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50MzJFeHRlbnNpb25dXSk7Ci0KLSAgR1BCTWVzc2FnZSAqbWVzc2FnZTIgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIFttZXNzYWdlMiBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEludDMyRXh0ZW5zaW9uXSB2YWx1ZTpAMV07Ci0KLSAgWENUQXNzZXJ0RXF1YWwoCi0gICAgICBbW21lc3NhZ2UyIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dXSBjb3VudF0sCi0gICAgICAoTlNVSW50ZWdlcikxKTsKLSAgW21lc3NhZ2UyIGNsZWFyRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbnQzMkV4dGVuc2lvbl1dOwotICBYQ1RBc3NlcnRFcXVhbCgKLSAgICAgIFtbbWVzc2FnZTIgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbnQzMkV4dGVuc2lvbl1dIGNvdW50XSwKLSAgICAgIChOU1VJbnRlZ2VyKTApOwotCi0gIC8vIENsZWFyaW5nIGFuIHVuc2V0IGV4dGVuc2lvbiBmaWVsZCBzaG91bGRuJ3QgbWFrZSB0aGUgdGFyZ2V0IG1lc3NhZ2UKLSAgLy8gdmlzaWJsZS4KLSAgR1BCTWVzc2FnZSAqbWVzc2FnZTMgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIEdQQk1lc3NhZ2UgKmV4dGVuc2lvbl9tc2cgPQotICAgICAgW21lc3NhZ2UzIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RPYmpjUm9vdCByZWN1cnNpdmVFeHRlbnNpb25dXTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UzIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RPYmpjUm9vdCByZWN1cnNpdmVFeHRlbnNpb25dXSk7Ci0gIFtleHRlbnNpb25fbXNnIGNsZWFyRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbnQzMkV4dGVuc2lvbl1dOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZTMgaGFzRXh0ZW5zaW9uOltVbml0dGVzdE9iamNSb290IHJlY3Vyc2l2ZUV4dGVuc2lvbl1dKTsKLX0KLQotLSAodm9pZCl0ZXN0RGVmYXVsdGluZ1N1Yk1lc3NhZ2VzIHsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLQotICAvLyBJbml0aWFsbHkgdGhleSBzaG91bGQgYWxsIG5vdCBoYXZlIHZhbHVlcy4KLQotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsR3JvdXApOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTGF6eU1lc3NhZ2UpOwotCi0gIC8vIFRoZXkgc2hvdWxkIGF1dG8gY3JlYXRlIHNvbWV0aGluZyB3aGVuIGZldGNoZWQuCi0KLSAgVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAgKm9wdGlvbmFsR3JvdXAgPSBbbWVzc2FnZS5vcHRpb25hbEdyb3VwIHJldGFpbl07Ci0gIFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlICpvcHRpb25hbE5lc3RlZE1lc3NhZ2UgPQotICAgICAgW21lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHJldGFpbl07Ci0gIEZvcmVpZ25NZXNzYWdlICpvcHRpb25hbEZvcmVpZ25NZXNzYWdlID0KLSAgICAgIFttZXNzYWdlLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgcmV0YWluXTsKLSAgSW1wb3J0TWVzc2FnZSAqb3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gW21lc3NhZ2Uub3B0aW9uYWxJbXBvcnRNZXNzYWdlIHJldGFpbl07Ci0gIFB1YmxpY0ltcG9ydE1lc3NhZ2UgKm9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSA9Ci0gICAgICBbbWVzc2FnZS5vcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UgcmV0YWluXTsKLSAgVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgKm9wdGlvbmFsTGF6eU1lc3NhZ2UgPQotICAgICAgW21lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZSByZXRhaW5dOwotCi0gIFhDVEFzc2VydE5vdE5pbChvcHRpb25hbEdyb3VwKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdE5pbChvcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdE5pbChvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3ROaWwob3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0KLSAgLy8gQWx0aG91Z2ggdGhleSB3ZXJlIGNyZWF0ZWQsIHRoZXkgc2hvdWxkIG5vdCByZXNwb25kIHRvIGhhc1ZhbHVlIHVudGlsIHRoYXQKLSAgLy8gc3VibWVzc2FnZSBpcyBtdXRhdGVkLgotCi0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0KLSAgLy8gQW5kIHRoZXkgc2V0IHRoYXQgdmFsdWUgYmFjayBpbiB0byB0aGUgbWVzc2FnZSBzaW5jZSB0aGUgdmFsdWUgY3JlYXRlZCB3YXMKLSAgLy8gbXV0YWJsZSAoc28gYSBzZWNvbmQgZmV0Y2ggc2hvdWxkIGdpdmUgdGhlIHNhbWUgb2JqZWN0KS4KLQotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLm9wdGlvbmFsR3JvdXAsIG9wdGlvbmFsR3JvdXApOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSwgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlLCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5vcHRpb25hbEltcG9ydE1lc3NhZ2UsIG9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlLAotICAgICAgICAgICAgICAgICBvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLm9wdGlvbmFsTGF6eU1lc3NhZ2UsIG9wdGlvbmFsTGF6eU1lc3NhZ2UpOwotCi0gIC8vIEFuZCB0aGUgZGVmYXVsdCBvYmplY3RzIGZvciBhIHNlY29uZCBtZXNzYWdlIHNob3VsZCBiZSBkaXN0aW5jdCAoYWdhaW4sCi0gIC8vIHNpbmNlIHRoZXkgYXJlIG11dGFibGUsIGVhY2ggbmVlZHMgdGhlaXIgb3duIGNvcHkpLgotCi0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZTIgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotCi0gIC8vIEludGVudGlvbmFsbHkgZG9pbmcgYSBwb2ludGVyIGNvbXBhcmlzb24uCi0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UyLm9wdGlvbmFsR3JvdXAsIG9wdGlvbmFsR3JvdXApOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlMi5vcHRpb25hbE5lc3RlZE1lc3NhZ2UsIG9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UyLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UsIG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlMi5vcHRpb25hbEltcG9ydE1lc3NhZ2UsIG9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UyLm9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobWVzc2FnZTIub3B0aW9uYWxMYXp5TWVzc2FnZSwgb3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0KLSAgLy8gU2V0dGluZyB0aGUgdmFsdWVzIHRvIG5pbCB3aWxsIGNsZWFyIHRoZSBoYXMgZmxhZywgYW5kIG9uIG5leHQgYWNjZXNzIHlvdQotICAvLyBnZXQgYmFjayBuZXcgc3VibWVzc2FnZXMuCi0KLSAgbWVzc2FnZS5vcHRpb25hbEdyb3VwID0gbmlsOwotICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IG5pbDsKLSAgbWVzc2FnZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gbmlsOwotICBtZXNzYWdlLm9wdGlvbmFsSW1wb3J0TWVzc2FnZSA9IG5pbDsKLSAgbWVzc2FnZS5vcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UgPSBuaWw7Ci0gIG1lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZSA9IG5pbDsKLQotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsR3JvdXApOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTGF6eU1lc3NhZ2UpOwotCi0gIC8vIEludGVudGlvbmFsbHkgZG9pbmcgYSBwb2ludGVyIGNvbXBhcmlzb24uCi0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxHcm91cCwgb3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLCBvcHRpb25hbE5lc3RlZE1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UsIG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlLm9wdGlvbmFsSW1wb3J0TWVzc2FnZSwgb3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwobWVzc2FnZS5vcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxMYXp5TWVzc2FnZSwgb3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0KLSAgW29wdGlvbmFsR3JvdXAgcmVsZWFzZV07Ci0gIFtvcHRpb25hbE5lc3RlZE1lc3NhZ2UgcmVsZWFzZV07Ci0gIFtvcHRpb25hbEZvcmVpZ25NZXNzYWdlIHJlbGVhc2VdOwotICBbb3B0aW9uYWxJbXBvcnRNZXNzYWdlIHJlbGVhc2VdOwotICBbb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlIHJlbGVhc2VdOwotICBbb3B0aW9uYWxMYXp5TWVzc2FnZSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0TXVsdGlwbGVQb2ludGVyc1RvQXV0b2NyZWF0ZWRNZXNzYWdlIHsKLSAgLy8gTXVsdGlwbGUgb2JqZWN0cyBwb2ludGluZyB0byB0aGUgc2FtZSBhdXRvY3JlYXRlZCBtZXNzYWdlLgotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UyID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgbWVzc2FnZTIub3B0aW9uYWxHcm91cCA9IG1lc3NhZ2Uub3B0aW9uYWxHcm91cDsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZTIgaGFzT3B0aW9uYWxHcm91cF0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNPcHRpb25hbEdyb3VwXSk7Ci0gIG1lc3NhZ2UyLm9wdGlvbmFsR3JvdXAuYSA9IDQyOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc09wdGlvbmFsR3JvdXBdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZTIgaGFzT3B0aW9uYWxHcm91cF0pOwotfQotCi0tICh2b2lkKXRlc3RDb3B5V2l0aEF1dG9jcmVhdGVkTWVzc2FnZSB7Ci0gIC8vIE11dGFibGUgY29weSBzaG91bGQgbm90IGNvcHkgYXV0b2NyZWF0ZWQgbWVzc2FnZXMuCi0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIG1lc3NhZ2Uub3B0aW9uYWxHcm91cC5hID0gNDI7Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZTIgPSBbW21lc3NhZ2UgY29weV0gYXV0b3JlbGVhc2VdOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlMiBoYXNPcHRpb25hbEdyb3VwXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlMiBoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2VdKTsKLQotICAvLyBJbnRlbnRpb25hbGx5IGRvaW5nIGEgcG9pbnRlciBjb21wYXJpc29uLgotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTIub3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLX0KLQotLSAodm9pZCl0ZXN0Q2xlYXJBdXRvY3JlYXRlZFN1Ym1lc3NhZ2UgewotICAvLyBDYWxsIGNsZWFyIG9uIGFuIGludGVybWVkaWF0ZSBzdWJtZXNzYWdlIHNob3VsZCBjYXVzZSBpdCB0byBnZXQgcmVjcmVhdGVkCi0gIC8vIG9uIHRoZSBuZXh0IGNhbGwuCi0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlID0gW1Rlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2VdOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZV9pbm5lciA9IFttZXNzYWdlLmEuYS5hIHJldGFpbl07Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlX2lubmVyKTsKLSAgWENUQXNzZXJ0VHJ1ZShHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeShtZXNzYWdlX2lubmVyLCBtZXNzYWdlLmEuYSkpOwotICBbbWVzc2FnZS5hLmEgY2xlYXJdOwotICBYQ1RBc3NlcnRGYWxzZShHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeShtZXNzYWdlX2lubmVyLCBtZXNzYWdlLmEuYSkpOwotCi0gIC8vIEludGVudGlvbmFsbHkgZG9pbmcgYSBwb2ludGVyIGNvbXBhcmlzb24uCi0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UuYS5hLmEsIG1lc3NhZ2VfaW5uZXIpOwotICBbbWVzc2FnZV9pbm5lciByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmV0YWluQXV0b2NyZWF0ZWRTdWJtZXNzYWdlIHsKLSAgLy8gU2hvdWxkIGJlIGFibGUgdG8gcmV0YWluIGF1dG9jcmVhdGVkIHN1Ym1lc3NhZ2Ugd2hpbGUgdGhlIGNyZWF0b3IgaXMKLSAgLy8gZGVhbGxvY2VkLgotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotCi0gIEZvcmVpZ25NZXNzYWdlICpzdWJNZXNzYWdlOwotICBAYXV0b3JlbGVhc2Vwb29sIHsKLSAgICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UyID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgICBzdWJNZXNzYWdlID0gbWVzc2FnZTIub3B0aW9uYWxGb3JlaWduTWVzc2FnZTsgLy8gQXV0b2NyZWF0ZWQKLSAgICBtZXNzYWdlLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSBzdWJNZXNzYWdlOwotICAgIFhDVEFzc2VydFRydWUoR1BCV2FzTWVzc2FnZUF1dG9jcmVhdGVkQnkobWVzc2FnZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZTIpKTsKLSAgfQotCi0gIC8vIFNob3VsZCBiZSB0aGUgc2FtZSBvYmplY3QsIGFuZCBzaG91bGQgc3RpbGwgYmUgbGl2ZS4KLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlLCBzdWJNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90TmlsKFtzdWJNZXNzYWdlIGRlc2NyaXB0aW9uXSk7Ci19Ci0KLS0gKHZvaWQpdGVzdFNldE5pbEF1dG9jcmVhdGVkU3VibWVzc2FnZSB7Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlID0gW1Rlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2VdOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZV9pbm5lciA9IFttZXNzYWdlLmEuYSByZXRhaW5dOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNBXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlLmEgaGFzQV0pOwotICBtZXNzYWdlLmEuYSA9IG5pbDsKLQotICAvLyB8bWVzc2FnZS5hfCBoYXMgdG8gYmUgbWFkZSB2aXNpYmxlLCBidXQgfG1lc3NhZ2UuYS5hfCB3YXMgc2V0IHRvIG5pbCBzbwotICAvLyBzaG91bGRuJ3QgYmUuCi0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzQV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZS5hIGhhc0FdKTsKLQotICAvLyBTZXR0aW5nIHN1Ym1lc3NhZ2UgdG8gbmlsIHNob3VsZCBjYXVzZSBpdCB0byBsb3NlIGl0cyBjcmVhdG9yLgotICBYQ1RBc3NlcnRGYWxzZShHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeShtZXNzYWdlX2lubmVyLCBtZXNzYWdlLmEpKTsKLQotICAvLyBBZnRlciBzZXR0aW5nIHRvIG5pbCwgZ2V0dGluZyBpdCBhZ2FpbiBzaG91bGQgY3JlYXRlIGEgbmV3IGF1dG9jcmVhdGVkCi0gIC8vIG1lc3NhZ2UuCi0gIC8vIEludGVudGlvbmFsbHkgZG9pbmcgYSBwb2ludGVyIGNvbXBhcmlzb24uCi0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UuYS5hLCBtZXNzYWdlX2lubmVyKTsKLQotICBbbWVzc2FnZV9pbm5lciByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0U2V0RG9lc250SGF2ZUF1dG9jcmVhdGVkU3VibWVzc2FnZSB7Ci0gIC8vIENsZWFyaW5nIHN1Ym1lc3NhZ2UgKHNldCBoYXMgPT0gTk8pIHNob3VsZCBOT1QgY2F1c2UgaXQgdG8gbG9zZSBpdHMKLSAgLy8gY3JlYXRvci4KLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgKm5lc3RlZE1lc3NhZ2UgPSBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlXSk7Ci0gIFttZXNzYWdlIHNldEhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZTpOT107Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZV0pOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSwgbmVzdGVkTWVzc2FnZSk7Ci19Ci0KLS0gKHZvaWQpdGVzdFNldEF1dG9jcmVhdGVkTWVzc2FnZUJlY29tZXNWaXNpYmxlIHsKLSAgLy8gU2V0dGluZyBhIHZhbHVlIHNob3VsZCBjYXVzZSB0aGUgc3VibWVzc2FnZSB0byBhcHBlYXIgdG8gaXRzIGNyZWF0b3IuCi0gIC8vIFRlc3QgdGhpcyBzZXZlcmFsIGxldmVscyBkZWVwLgotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZSA9IFtUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlXTsKLSAgbWVzc2FnZS5hLmEuYS5hLmkgPSA0MjsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UuYSBoYXNBXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UuYS5hIGhhc0FdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZS5hLmEuYSBoYXNBXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlLmEuYS5hLmEgaGFzQV0pOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLmEuYS5hLmEuaSwgNDIpOwotfQotCi0tICh2b2lkKXRlc3RDbGVhclVuc2V0RmllbGRPZkF1dG9jcmVhdGVkTWVzc2FnZSB7Ci0gIC8vIENsZWFyaW5nIGFuIHVuc2V0IGZpZWxkIHNob3VsZCBub3QgY2F1c2UgdGhlIHN1Ym1lc3NhZ2UgdG8gYXBwZWFyIHRvIGl0cwotICAvLyBjcmVhdG9yLgotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZSA9IFtUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlXTsKLSAgbWVzc2FnZS5hLmEuYS5hLmhhc0kgPSBOTzsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzQV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZS5hIGhhc0FdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UuYS5hIGhhc0FdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UuYS5hLmEgaGFzQV0pOwotfQotCi0tICh2b2lkKXRlc3RBdXRvY3JlYXRlZFN1Ym1lc3NhZ2VBc3NpZ25Ta2lwIHsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgKm1lc3NhZ2UgPSBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlTGV2ZWwxID0gW21lc3NhZ2UuYSByZXRhaW5dOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZUxldmVsMiA9IFttZXNzYWdlLmEuYSByZXRhaW5dOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZUxldmVsMyA9IFttZXNzYWdlLmEuYS5hIHJldGFpbl07Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlTGV2ZWw0ID0gW21lc3NhZ2UuYS5hLmEuYSByZXRhaW5dOwotICBYQ1RBc3NlcnRUcnVlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VMZXZlbDEsIG1lc3NhZ2UpKTsKLSAgWENUQXNzZXJ0VHJ1ZShHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeShtZXNzYWdlTGV2ZWwyLCBtZXNzYWdlTGV2ZWwxKSk7Ci0gIFhDVEFzc2VydFRydWUoR1BCV2FzTWVzc2FnZUF1dG9jcmVhdGVkQnkobWVzc2FnZUxldmVsMywgbWVzc2FnZUxldmVsMikpOwotICBYQ1RBc3NlcnRUcnVlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VMZXZlbDQsIG1lc3NhZ2VMZXZlbDMpKTsKLQotICAvLyBUZXN0IHNraXBwaW5nIG92ZXIgYW4gYXV0b2NyZWF0ZWQgc3VibWVzc2FnZSBhbmQgZW5zdXJlIGl0IGdldHMgdW5zZXQuCi0gIG1lc3NhZ2UuYSA9IG1lc3NhZ2UuYS5hOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLmEsIG1lc3NhZ2VMZXZlbDIpOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0FdKTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5hLmEsIG1lc3NhZ2VMZXZlbDMpOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZS5hIGhhc0FdKTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5hLmEuYSwgbWVzc2FnZUxldmVsNCk7Ci0gIFhDVEFzc2VydEZhbHNlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VMZXZlbDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UpKTsgIC8vIEJlY2F1c2UgaXQgd2FzIG9ycGhhbmVkLgotICBYQ1RBc3NlcnRUcnVlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VMZXZlbDIsIG1lc3NhZ2VMZXZlbDEpKTsKLSAgWENUQXNzZXJ0VHJ1ZShHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeShtZXNzYWdlTGV2ZWwzLCBtZXNzYWdlTGV2ZWwyKSk7Ci0KLSAgW21lc3NhZ2VMZXZlbDEgcmVsZWFzZV07Ci0gIFttZXNzYWdlTGV2ZWwyIHJlbGVhc2VdOwotICBbbWVzc2FnZUxldmVsMyByZWxlYXNlXTsKLSAgW21lc3NhZ2VMZXZlbDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdEF1dG9jcmVhdGVkU3VibWVzc2FnZUFzc2lnbkxvb3AgewotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZSA9IFtUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlXTsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgKm1lc3NhZ2VMZXZlbDEgPSBbbWVzc2FnZS5hIHJldGFpbl07Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlTGV2ZWwyID0gW21lc3NhZ2UuYS5hIHJldGFpbl07Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlTGV2ZWwzID0gW21lc3NhZ2UuYS5hLmEgcmV0YWluXTsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgKm1lc3NhZ2VMZXZlbDQgPSBbbWVzc2FnZS5hLmEuYS5hIHJldGFpbl07Ci0gIFhDVEFzc2VydFRydWUoR1BCV2FzTWVzc2FnZUF1dG9jcmVhdGVkQnkobWVzc2FnZUxldmVsMSwgbWVzc2FnZSkpOwotICBYQ1RBc3NlcnRUcnVlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VMZXZlbDIsIG1lc3NhZ2VMZXZlbDEpKTsKLSAgWENUQXNzZXJ0VHJ1ZShHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeShtZXNzYWdlTGV2ZWwzLCBtZXNzYWdlTGV2ZWwyKSk7Ci0gIFhDVEFzc2VydFRydWUoR1BCV2FzTWVzc2FnZUF1dG9jcmVhdGVkQnkobWVzc2FnZUxldmVsNCwgbWVzc2FnZUxldmVsMykpOwotCi0gIC8vIFRlc3QgYSBwcm9wZXJ0eSB3aXRoIGEgbG9vcC4gWW91J2QgbmV2ZXIgZG8gdGhpcyBidXQgYXQgbGVhc3QgZW5zdXJlIHRoZQotICAvLyBhdXRvY3JlYXRlZCBzdWJtZXNzYWdlcyBiZWhhdmUgc2FuZWx5LgotICBtZXNzYWdlLmEuYSA9IG1lc3NhZ2UuYTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2UuYSwgbWVzc2FnZUxldmVsMSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UuYSBoYXNBXSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2UuYS5hLCBtZXNzYWdlTGV2ZWwxKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZS5hLmEgaGFzQV0pOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLmEuYS5hLCBtZXNzYWdlTGV2ZWwxKTsKLSAgWENUQXNzZXJ0RmFsc2UoR1BCV2FzTWVzc2FnZUF1dG9jcmVhdGVkQnkobWVzc2FnZUxldmVsMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSkpOyAgLy8gQmVjYXVzZSBpdCB3YXMgYXNzaWduZWQuCi0gIFhDVEFzc2VydEZhbHNlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VMZXZlbDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VMZXZlbDEpKTsgIC8vIEJlY2F1c2UgaXQgd2FzIG9ycGhhbmVkLgotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZUxldmVsMiBoYXNBXSk7Ci0KLSAgLy8gQnJlYWsgdGhlIHJldGFpbiBsb29wLgotICBtZXNzYWdlLmEuYSA9IG5pbDsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlLmEgaGFzQV0pOwotCi0gIFttZXNzYWdlTGV2ZWwxIHJlbGVhc2VdOwotICBbbWVzc2FnZUxldmVsMiByZWxlYXNlXTsKLSAgW21lc3NhZ2VMZXZlbDMgcmVsZWFzZV07Ci0gIFttZXNzYWdlTGV2ZWw0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RTZXRBdXRvY3JlYXRlZFN1Ym1lc3NhZ2UgewotICAvLyBTZXR0aW5nIGF1dG9jcmVhdGVkIHN1Ym1lc3NhZ2UgdG8gYW5vdGhlciB2YWx1ZSBzaG91bGQgY2F1c2UgdGhlIG9sZCBvbmUgdG8KLSAgLy8gbG9zZSBpdHMgY3JlYXRvci4KLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgKm5lc3RlZE1lc3NhZ2UgPQotICAgICAgW21lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlIHJldGFpbl07Ci0KLSAgbWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgbWVzc2FnZV07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlXSk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2UgIT0gbmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEZhbHNlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG5lc3RlZE1lc3NhZ2UsIG1lc3NhZ2UpKTsKLQotICBbbmVzdGVkTWVzc2FnZSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0QXV0b2NyZWF0ZWRVbmtub3duRmllbGRzIHsKLSAgLy8gRG9pbmcgYW55dGhpbmcgd2l0aCAoZXhjZXB0IHJlYWRpbmcpIHVua25vd24gZmllbGRzIHNob3VsZCBjYXVzZSB0aGUKLSAgLy8gc3VibWVzc2FnZSB0byBiZWNvbWUgdmlzaWJsZS4KLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlXSk7Ci0gIFhDVEFzc2VydE5pbChtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS51bmtub3duRmllbGRzKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlXSk7Ci0KLSAgR1BCVW5rbm93bkZpZWxkU2V0ICp1bmtub3duRmllbGRzID0KLSAgICAgIFtbW0dQQlVua25vd25GaWVsZFNldCBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS51bmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkczsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2VdKTsKLQotICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IG5pbDsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlXSk7Ci0gIFttZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSBzZXRVbmtub3duRmllbGRzOnVua25vd25GaWVsZHNdOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZV0pOwotfQotCi0tICh2b2lkKXRlc3RTZXRBdXRvY3JlYXRlZFN1Ym1lc3NhZ2VUb1NlbGYgewotICAvLyBTZXR0aW5nIHN1Ym1lc3NhZ2UgdG8gaXRzZWxmIHNob3VsZCBjYXVzZSBpdCB0byBiZWNvbWUgdmlzaWJsZS4KLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlXSk7Ci0gIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlID0gbWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2U7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlXSk7Ci19Ci0KLS0gKHZvaWQpdGVzdEF1dG9jcmVhdGVkU3VibWVzc2FnZU1lbW9yeUxlYWtzIHsKLSAgLy8gVGVzdCBmb3IgbWVtb3J5IGxlYWtzIHdpdGggYXV0b2NyZWF0ZWQgc3VibWVzc2FnZXMuCi0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZUxldmVsMTsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgKm1lc3NhZ2VMZXZlbDI7Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlICptZXNzYWdlTGV2ZWwzOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZSAqbWVzc2FnZUxldmVsNDsKLSAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gICAgbWVzc2FnZSA9IFtbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYWxsb2NdIGluaXRdOwotICAgIG1lc3NhZ2VMZXZlbDEgPSBbbWVzc2FnZS5hIHJldGFpbl07Ci0gICAgbWVzc2FnZUxldmVsMiA9IFttZXNzYWdlLmEuYSByZXRhaW5dOwotICAgIG1lc3NhZ2VMZXZlbDMgPSBbbWVzc2FnZS5hLmEuYSByZXRhaW5dOwotICAgIG1lc3NhZ2VMZXZlbDQgPSBbbWVzc2FnZS5hLmEuYS5hIHJldGFpbl07Ci0gICAgbWVzc2FnZS5hLmkgPSAxOwotICB9Ci0KLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5yZXRhaW5Db3VudCwgKE5TVUludGVnZXIpMSk7Ci0gIFttZXNzYWdlIHJlbGVhc2VdOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlTGV2ZWwxLnJldGFpbkNvdW50LCAoTlNVSW50ZWdlcikxKTsKLSAgW21lc3NhZ2VMZXZlbDEgcmVsZWFzZV07Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2VMZXZlbDIucmV0YWluQ291bnQsIChOU1VJbnRlZ2VyKTEpOwotICBbbWVzc2FnZUxldmVsMiByZWxlYXNlXTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZUxldmVsMy5yZXRhaW5Db3VudCwgKE5TVUludGVnZXIpMSk7Ci0gIFttZXNzYWdlTGV2ZWwzIHJlbGVhc2VdOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlTGV2ZWw0LnJldGFpbkNvdW50LCAoTlNVSW50ZWdlcikxKTsKLSAgW21lc3NhZ2VMZXZlbDQgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdERlZmF1bHRpbmdBcnJheXMgewotICAvLyBCYXNpYyB0ZXN0cyBmb3IgZGVmYXVsdCBjcmVhdGlvbiBvZiBhcnJheXMgaW4gYSBtZXNzYWdlLgotICBUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkICptZXNzYWdlID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkICptZXNzYWdlMiA9Ci0gICAgICBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCBtZXNzYWdlXTsKLQotICAvLyBTaW1wbHkgYWNjZXNzaW5nIHRoZSBhcnJheSBzaG91bGQgbm90IG1ha2UgYW55IGZpZWxkcyB2aXNpYmxlLgotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5hLmEuaUFycmF5KTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzQV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZS5hIGhhc0FdKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2UyLmEuYS5zdHJBcnJheSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlMiBoYXNBXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlMi5hIGhhc0FdKTsKLQotICAvLyBCdXQgYWRkaW5nIGFuIGVsZW1lbnQgdG8gdGhlIGFycmF5IHNob3VsZC4KLSAgW21lc3NhZ2UuYS5hLmlBcnJheSBhZGRWYWx1ZTo0Ml07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzQV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlLmEgaGFzQV0pOwotICBYQ1RBc3NlcnRFcXVhbChbbWVzc2FnZS5hLmEuaUFycmF5IGNvdW50XSwgKE5TVUludGVnZXIpMSk7Ci0gIFttZXNzYWdlMi5hLmEuc3RyQXJyYXkgYWRkT2JqZWN0OkAiZm9vIl07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UyIGhhc0FdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZTIuYSBoYXNBXSk7Ci0gIFhDVEFzc2VydEVxdWFsKFttZXNzYWdlMi5hLmEuc3RyQXJyYXkgY291bnRdLCAoTlNVSW50ZWdlcikxKTsKLX0KLQotLSAodm9pZCl0ZXN0QXV0b2NyZWF0ZWRBcnJheVNoYXJlZCB7Ci0gIC8vIE11bHRpcGxlIG9iamVjdHMgcG9pbnRpbmcgdG8gdGhlIHNhbWUgYXJyYXkuCi0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UxYSA9Ci0gICAgICBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCBtZXNzYWdlXTsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZTFiID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICBtZXNzYWdlMWEuYS5pQXJyYXkgPSBtZXNzYWdlMWIuYS5pQXJyYXk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UxYSBoYXNBXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlMWIgaGFzQV0pOwotICBbbWVzc2FnZTFhLmEuaUFycmF5IGFkZFZhbHVlOjFdOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlMWEgaGFzQV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlMWIgaGFzQV0pOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlMWEuYS5pQXJyYXksIG1lc3NhZ2UxYi5hLmlBcnJheSk7Ci0KLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZTJhID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkICptZXNzYWdlMmIgPQotICAgICAgW1Rlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgbWVzc2FnZV07Ci0gIG1lc3NhZ2UyYS5hLnN0ckFycmF5ID0gbWVzc2FnZTJiLmEuc3RyQXJyYXk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UyYSBoYXNBXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlMmIgaGFzQV0pOwotICBbbWVzc2FnZTJhLmEuc3RyQXJyYXkgYWRkT2JqZWN0OkAiYmFyIl07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UyYSBoYXNBXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UyYiBoYXNBXSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2UyYS5hLnN0ckFycmF5LCBtZXNzYWdlMmIuYS5zdHJBcnJheSk7Ci19Ci0KLS0gKHZvaWQpdGVzdEF1dG9jcmVhdGVkQXJyYXlDb3B5IHsKLSAgLy8gQ29weSBzaG91bGQgbm90IGNvcHkgYXV0b2NyZWF0ZWQgYXJyYXlzLgotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5KTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5KTsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlMiA9IFtbbWVzc2FnZSBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIC8vIFBvaW50ZXIgY29ucGFyaXNpb25zLgotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXksIG1lc3NhZ2UyLnJlcGVhdGVkU3RyaW5nQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheSwgbWVzc2FnZTIucmVwZWF0ZWRJbnQzMkFycmF5KTsKLQotICAvLyBNdXRhYmxlIGNvcHkgc2hvdWxkIGNvcHkgZW1wdHkgYXJyYXlzIHRoYXQgd2VyZSBleHBsaWNpdGx5IHNldCAoZW5kIHVwCi0gIC8vIHdpdGggZGlmZmVyZW50IG9iamVjdHMgdGhhdCBhcmUgZXF1YWwpLgotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UzID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgbWVzc2FnZTMucmVwZWF0ZWRJbnQzMkFycmF5ID0gW0dQQkludDMyQXJyYXkgYXJyYXlXaXRoVmFsdWU6NDJdOwotICBtZXNzYWdlMy5yZXBlYXRlZFN0cmluZ0FycmF5ID0gW05TTXV0YWJsZUFycmF5IGFycmF5V2l0aE9iamVjdDpAIndlZSJdOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5yZXBlYXRlZEludDMyQXJyYXkpOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5KTsKLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlNCA9IFtbbWVzc2FnZTMgY29weV0gYXV0b3JlbGVhc2VdOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlMy5yZXBlYXRlZEludDMyQXJyYXksIG1lc3NhZ2U0LnJlcGVhdGVkSW50MzJBcnJheSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlMy5yZXBlYXRlZEludDMyQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlNC5yZXBlYXRlZEludDMyQXJyYXkpOwotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlMy5yZXBlYXRlZFN0cmluZ0FycmF5LCBtZXNzYWdlNC5yZXBlYXRlZFN0cmluZ0FycmF5KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UzLnJlcGVhdGVkU3RyaW5nQXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlNC5yZXBlYXRlZFN0cmluZ0FycmF5KTsKLX0KLQotLSAodm9pZCl0ZXN0QXV0b2NyZWF0ZWRBcnJheVJldGFpbiB7Ci0gIC8vIFNob3VsZCBiZSBhYmxlIHRvIHJldGFpbiBhdXRvY3JlYXRlZCBhcnJheSB3aGlsZSB0aGUgY3JlYXRvciBpcyBkZWFsbG9jZWQuCi0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0KLSAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gICAgVGVzdEFsbFR5cGVzICptZXNzYWdlMiA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gICAgbWVzc2FnZS5yZXBlYXRlZEludDMyQXJyYXkgPSBtZXNzYWdlMi5yZXBlYXRlZEludDMyQXJyYXk7Ci0gICAgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5ID0gbWVzc2FnZTIucmVwZWF0ZWRTdHJpbmdBcnJheTsKLSAgICAvLyBQb2ludGVyIGNvbnBhcmlzaW9uCi0gICAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZEludDMyQXJyYXktPl9hdXRvY3JlYXRvciwgbWVzc2FnZTIpOwotICAgIFhDVEFzc2VydFRydWUoW21lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheQotICAgICAgICBpc0tpbmRPZkNsYXNzOltHUEJBdXRvY3JlYXRlZEFycmF5IGNsYXNzXV0pOwotICAgIFhDVEFzc2VydEVxdWFsKAotICAgICAgICAoKEdQQkF1dG9jcmVhdGVkQXJyYXkgKiltZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXkpLT5fYXV0b2NyZWF0b3IsCi0gICAgICAgIG1lc3NhZ2UyKTsKLSAgfQotCi0gIFhDVEFzc2VydE5pbChtZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheS0+X2F1dG9jcmVhdG9yKTsKLSAgWENUQXNzZXJ0VHJ1ZSgKLSAgICAgIFttZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXkgaXNLaW5kT2ZDbGFzczpbR1BCQXV0b2NyZWF0ZWRBcnJheSBjbGFzc11dKTsKLSAgWENUQXNzZXJ0TmlsKAotICAgICAgKChHUEJBdXRvY3JlYXRlZEFycmF5ICopbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5KS0+X2F1dG9jcmVhdG9yKTsKLX0KLQotLSAodm9pZCl0ZXN0U2V0TmlsQXV0b2NyZWF0ZWRBcnJheSB7Ci0gIC8vIFNldHRpbmcgYXJyYXkgdG8gbmlsIHNob3VsZCBjYXVzZSBpdCB0byBsb3NlIGl0cyBkZWxlZ2F0ZS4KLSAgVGVzdEFsbFR5cGVzICptZXNzYWdlID0gW1Rlc3RBbGxUeXBlcyBtZXNzYWdlXTsKLSAgR1BCSW50MzJBcnJheSAqcmVwZWF0ZWRJbnQzMkFycmF5ID0gW21lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5IHJldGFpbl07Ci0gIEdQQkF1dG9jcmVhdGVkQXJyYXkgKnJlcGVhdGVkU3RyaW5nQXJyYXkgPQotICAgICAgKEdQQkF1dG9jcmVhdGVkQXJyYXkgKilbbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5IHJldGFpbl07Ci0gIFhDVEFzc2VydFRydWUoW3JlcGVhdGVkU3RyaW5nQXJyYXkgaXNLaW5kT2ZDbGFzczpbR1BCQXV0b2NyZWF0ZWRBcnJheSBjbGFzc11dKTsKLSAgWENUQXNzZXJ0RXF1YWwocmVwZWF0ZWRJbnQzMkFycmF5LT5fYXV0b2NyZWF0b3IsIG1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChyZXBlYXRlZFN0cmluZ0FycmF5LT5fYXV0b2NyZWF0b3IsIG1lc3NhZ2UpOwotICBtZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheSA9IG5pbDsKLSAgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5ID0gbmlsOwotICBYQ1RBc3NlcnROaWwocmVwZWF0ZWRJbnQzMkFycmF5LT5fYXV0b2NyZWF0b3IpOwotICBYQ1RBc3NlcnROaWwocmVwZWF0ZWRTdHJpbmdBcnJheS0+X2F1dG9jcmVhdG9yKTsKLSAgW3JlcGVhdGVkSW50MzJBcnJheSByZWxlYXNlXTsKLSAgW3JlcGVhdGVkU3RyaW5nQXJyYXkgcmVsZWFzZV07Ci19Ci0KLS0gKHZvaWQpdGVzdFJlcGxhY2VBdXRvY3JlYXRlZEFycmF5IHsKLSAgLy8gUmVwbGFjaW5nIGFycmF5IHNob3VsZCBvcnBoYW4gdGhlIG9sZCBvbmUgYW5kIGNhdXNlIGl0cyBjcmVhdG9yIHRvIGJlY29tZQotICAvLyB2aXNpYmxlLgotICB7Ci0gICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSA9Ci0gICAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEpOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEuaUFycmF5KTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgR1BCSW50MzJBcnJheSAqaUFycmF5ID0gW21lc3NhZ2UuYS5pQXJyYXkgcmV0YWluXTsKLSAgICBYQ1RBc3NlcnRFcXVhbChpQXJyYXktPl9hdXRvY3JlYXRvciwgbWVzc2FnZS5hKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24KLSAgICBtZXNzYWdlLmEuaUFycmF5ID0gW0dQQkludDMyQXJyYXkgYXJyYXlXaXRoVmFsdWU6MV07Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwobWVzc2FnZS5hLmlBcnJheSwgaUFycmF5KTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24KLSAgICBYQ1RBc3NlcnROaWwoaUFycmF5LT5fYXV0b2NyZWF0b3IpOwotICAgIFtpQXJyYXkgcmVsZWFzZV07Ci0gIH0KLQotICB7Ci0gICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSA9Ci0gICAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEpOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEuc3RyQXJyYXkpOwotICAgIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0FdKTsKLSAgICBHUEJBdXRvY3JlYXRlZEFycmF5ICpzdHJBcnJheSA9Ci0gICAgICAgIChHUEJBdXRvY3JlYXRlZEFycmF5ICopW21lc3NhZ2UuYS5zdHJBcnJheSByZXRhaW5dOwotICAgIFhDVEFzc2VydFRydWUoW3N0ckFycmF5IGlzS2luZE9mQ2xhc3M6W0dQQkF1dG9jcmVhdGVkQXJyYXkgY2xhc3NdXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoc3RyQXJyYXktPl9hdXRvY3JlYXRvciwgbWVzc2FnZS5hKTsgIC8vIFBvaW50ZXIgY29tcGFyaXNpb24KLSAgICBtZXNzYWdlLmEuc3RyQXJyYXkgPSBbTlNNdXRhYmxlQXJyYXkgYXJyYXlXaXRoT2JqZWN0OkAiZm9vIl07Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwobWVzc2FnZS5hLnN0ckFycmF5LCBzdHJBcnJheSk7ICAvLyBQb2ludGVyIGNvbXBhcmlzaW9uCi0gICAgWENUQXNzZXJ0TmlsKHN0ckFycmF5LT5fYXV0b2NyZWF0b3IpOwotICAgIFtzdHJBcnJheSByZWxlYXNlXTsKLSAgfQotfQotCi0tICh2b2lkKXRlc3RTZXRBdXRvY3JlYXRlZEFycmF5VG9TZWxmIHsKLSAgLy8gU2V0dGluZyBhcnJheSB0byBpdHNlbGYgc2hvdWxkIGNhdXNlIGl0IHRvIGJlY29tZSB2aXNpYmxlLgotICB7Ci0gICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSA9Ci0gICAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEpOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEuaUFycmF5KTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgbWVzc2FnZS5hLmlBcnJheSA9IG1lc3NhZ2UuYS5pQXJyYXk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgWENUQXNzZXJ0TmlsKG1lc3NhZ2UuYS5pQXJyYXktPl9hdXRvY3JlYXRvcik7Ci0gIH0KLQotICB7Ci0gICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSA9Ci0gICAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEpOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEuc3RyQXJyYXkpOwotICAgIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0FdKTsKLSAgICBtZXNzYWdlLmEuc3RyQXJyYXkgPSBtZXNzYWdlLmEuc3RyQXJyYXk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZS5hLnN0ckFycmF5IGlzS2luZE9mQ2xhc3M6W0dQQkF1dG9jcmVhdGVkQXJyYXkgY2xhc3NdXSk7Ci0gICAgWENUQXNzZXJ0TmlsKCgoR1BCQXV0b2NyZWF0ZWRBcnJheSAqKW1lc3NhZ2UuYS5zdHJBcnJheSktPl9hdXRvY3JlYXRvcik7Ci0gIH0KLX0KLQotLSAodm9pZCl0ZXN0QXV0b2NyZWF0ZWRBcnJheVJlbW92ZUFsbFZhbHVlcyB7Ci0gIC8vIENhbGxpbmcgcmVtb3ZlQWxsVmFsdWVzIG9uIGF1dG9jcmVhdGVkIGFycmF5IHNob3VsZCBub3QgY2F1c2UgaXQgdG8gYmUKLSAgLy8gdmlzaWJsZS4KLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSA9Ci0gICAgICBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCBtZXNzYWdlXTsKLSAgW21lc3NhZ2UuYS5pQXJyYXkgcmVtb3ZlQWxsXTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzQV0pOwotICBbbWVzc2FnZS5hLnN0ckFycmF5IHJlbW92ZUFsbE9iamVjdHNdOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNBXSk7Ci19Ci0KLS0gKHZvaWQpdGVzdERlZmF1bHRpbmdNYXBzIHsKLSAgLy8gQmFzaWMgdGVzdHMgZm9yIGRlZmF1bHQgY3JlYXRpb24gb2YgbWFwcyBpbiBhIG1lc3NhZ2UuCi0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UgPQotICAgICAgW1Rlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgbWVzc2FnZV07Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UyID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotCi0gIC8vIFNpbXBseSBhY2Nlc3NpbmcgdGhlIG1hcCBzaG91bGQgbm90IG1ha2UgYW55IGZpZWxkcyB2aXNpYmxlLgotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5hLmEuaVRvSSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0FdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UuYSBoYXNBXSk7Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlMi5hLmEuc3RyVG9TdHIpOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZTIgaGFzQV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZTIuYSBoYXNBXSk7Ci0KLSAgLy8gQnV0IGFkZGluZyBhbiBlbGVtZW50IHRvIHRoZSBtYXAgc2hvdWxkLgotICBbbWVzc2FnZS5hLmEuaVRvSSBzZXRWYWx1ZToxMDAgZm9yS2V5OjIwMF07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzQV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlLmEgaGFzQV0pOwotICBYQ1RBc3NlcnRFcXVhbChbbWVzc2FnZS5hLmEuaVRvSSBjb3VudF0sIChOU1VJbnRlZ2VyKTEpOwotICBbbWVzc2FnZTIuYS5hLnN0clRvU3RyIHNldE9iamVjdDpAImZvbyIgZm9yS2V5OkAiYmFyIl07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UyIGhhc0FdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZTIuYSBoYXNBXSk7Ci0gIFhDVEFzc2VydEVxdWFsKFttZXNzYWdlMi5hLmEuc3RyVG9TdHIgY291bnRdLCAoTlNVSW50ZWdlcikxKTsKLX0KLQotLSAodm9pZCl0ZXN0QXV0b2NyZWF0ZWRNYXBTaGFyZWQgewotICAvLyBNdWx0aXBsZSBvYmplY3RzIHBvaW50aW5nIHRvIHRoZSBzYW1lIG1hcC4KLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZTFhID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICBUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkICptZXNzYWdlMWIgPQotICAgICAgW1Rlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgbWVzc2FnZV07Ci0gIG1lc3NhZ2UxYS5hLmlUb0kgPSBtZXNzYWdlMWIuYS5pVG9JOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlMWEgaGFzQV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZTFiIGhhc0FdKTsKLSAgW21lc3NhZ2UxYS5hLmlUb0kgc2V0VmFsdWU6MSBmb3JLZXk6Ml07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UxYSBoYXNBXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UxYiBoYXNBXSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2UxYS5hLmlUb0ksIG1lc3NhZ2UxYi5hLmlUb0kpOwotCi0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UyYSA9Ci0gICAgICBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCBtZXNzYWdlXTsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZTJiID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICBtZXNzYWdlMmEuYS5zdHJUb1N0ciA9IG1lc3NhZ2UyYi5hLnN0clRvU3RyOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlMmEgaGFzQV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZTJiIGhhc0FdKTsKLSAgW21lc3NhZ2UyYS5hLnN0clRvU3RyIHNldE9iamVjdDpAImJhciIgZm9yS2V5OkAiZm9vIl07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UyYSBoYXNBXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UyYiBoYXNBXSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2UyYS5hLnN0clRvU3RyLCBtZXNzYWdlMmIuYS5zdHJUb1N0cik7Ci19Ci0KLS0gKHZvaWQpdGVzdEF1dG9jcmVhdGVkTWFwQ29weSB7Ci0gIC8vIENvcHkgc2hvdWxkIG5vdCBjb3B5IGF1dG9jcmVhdGVkIG1hcHMuCi0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UgPQotICAgICAgW1Rlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgbWVzc2FnZV07Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLnN0clRvU3RyKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2UuaVRvSSk7Ci0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UyID0KLSAgICAgIFtbbWVzc2FnZSBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIC8vIFBvaW50ZXIgY29ucGFyaXNpb25zLgotICBYQ1RBc3NlcnROb3RFcXVhbChtZXNzYWdlLnN0clRvU3RyLCBtZXNzYWdlMi5zdHJUb1N0cik7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UuaVRvSSwgbWVzc2FnZTIuaVRvSSk7Ci0KLSAgLy8gTXV0YWJsZSBjb3B5IHNob3VsZCBjb3B5IGVtcHR5IGFycmF5cyB0aGF0IHdlcmUgZXhwbGljaXRseSBzZXQgKGVuZCB1cAotICAvLyB3aXRoIGRpZmZlcmVudCBvYmplY3RzIHRoYXQgYXJlIGVxdWFsKS4KLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZTMgPQotICAgICAgW1Rlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgbWVzc2FnZV07Ci0gIG1lc3NhZ2UzLmlUb0kgPSBbR1BCSW50MzJJbnQzMkRpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhWYWx1ZToxMCBmb3JLZXk6MjBdOwotICBtZXNzYWdlMy5zdHJUb1N0ciA9Ci0gICAgICBbTlNNdXRhYmxlRGljdGlvbmFyeSBkaWN0aW9uYXJ5V2l0aE9iamVjdDpAImFiYyIgZm9yS2V5OkAiMTIzIl07Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmlUb0kpOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5pVG9JKTsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZTQgPQotICAgICAgW1ttZXNzYWdlMyBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UzLmlUb0ksIG1lc3NhZ2U0LmlUb0kpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZTMuaVRvSSwgbWVzc2FnZTQuaVRvSSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UzLnN0clRvU3RyLCBtZXNzYWdlNC5zdHJUb1N0cik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlMy5zdHJUb1N0ciwgbWVzc2FnZTQuc3RyVG9TdHIpOwotfQotCi0tICh2b2lkKXRlc3RBdXRvY3JlYXRlZE1hcFJldGFpbiB7Ci0gIC8vIFNob3VsZCBiZSBhYmxlIHRvIHJldGFpbiBhdXRvY3JlYXRlZCBtYXAgd2hpbGUgdGhlIGNyZWF0b3IgaXMgZGVhbGxvY2VkLgotICBUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkICptZXNzYWdlID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotCi0gIEBhdXRvcmVsZWFzZXBvb2wgewotICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UyID0KLSAgICAgICAgW1Rlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgbWVzc2FnZV07Ci0gICAgbWVzc2FnZS5pVG9JID0gbWVzc2FnZTIuaVRvSTsKLSAgICBtZXNzYWdlLnN0clRvU3RyID0gbWVzc2FnZTIuc3RyVG9TdHI7Ci0gICAgLy8gUG9pbnRlciBjb25wYXJpc2lvbgotICAgIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2UuaVRvSS0+X2F1dG9jcmVhdG9yLCBtZXNzYWdlMik7Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZS5zdHJUb1N0cgotICAgICAgICBpc0tpbmRPZkNsYXNzOltHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoCi0gICAgICAgICgoR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5ICopbWVzc2FnZS5zdHJUb1N0ciktPl9hdXRvY3JlYXRvciwKLSAgICAgICAgbWVzc2FnZTIpOwotICB9Ci0KLSAgWENUQXNzZXJ0TmlsKG1lc3NhZ2UuaVRvSS0+X2F1dG9jcmVhdG9yKTsKLSAgWENUQXNzZXJ0VHJ1ZSgKLSAgICAgIFttZXNzYWdlLnN0clRvU3RyIGlzS2luZE9mQ2xhc3M6W0dQQkF1dG9jcmVhdGVkRGljdGlvbmFyeSBjbGFzc11dKTsKLSAgWENUQXNzZXJ0TmlsKAotICAgICAgKChHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnkgKiltZXNzYWdlLnN0clRvU3RyKS0+X2F1dG9jcmVhdG9yKTsKLX0KLQotLSAodm9pZCl0ZXN0U2V0TmlsQXV0b2NyZWF0ZWRNYXAgewotICAvLyBTZXR0aW5nIG1hcCB0byBuaWwgc2hvdWxkIGNhdXNlIGl0IHRvIGxvc2UgaXRzIGRlbGVnYXRlLgotICBUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkICptZXNzYWdlID0KLSAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICBHUEJJbnQzMkludDMyRGljdGlvbmFyeSAqaVRvSSA9IFttZXNzYWdlLmlUb0kgcmV0YWluXTsKLSAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5ICpzdHJUb1N0ciA9Ci0gICAgICAoR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5ICopW21lc3NhZ2Uuc3RyVG9TdHIgcmV0YWluXTsKLSAgWENUQXNzZXJ0VHJ1ZShbc3RyVG9TdHIgaXNLaW5kT2ZDbGFzczpbR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5IGNsYXNzXV0pOwotICBYQ1RBc3NlcnRFcXVhbChpVG9JLT5fYXV0b2NyZWF0b3IsIG1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbChzdHJUb1N0ci0+X2F1dG9jcmVhdG9yLCBtZXNzYWdlKTsKLSAgbWVzc2FnZS5pVG9JID0gbmlsOwotICBtZXNzYWdlLnN0clRvU3RyID0gbmlsOwotICBYQ1RBc3NlcnROaWwoaVRvSS0+X2F1dG9jcmVhdG9yKTsKLSAgWENUQXNzZXJ0TmlsKHN0clRvU3RyLT5fYXV0b2NyZWF0b3IpOwotICBbaVRvSSByZWxlYXNlXTsKLSAgW3N0clRvU3RyIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZXBsYWNlQXV0b2NyZWF0ZWRNYXAgewotICAvLyBSZXBsYWNpbmcgbWFwIHNob3VsZCBvcnBoYW4gdGhlIG9sZCBvbmUgYW5kIGNhdXNlIGl0cyBjcmVhdG9yIHRvIGJlY29tZQotICAvLyB2aXNpYmxlLgotICB7Ci0gICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSA9Ci0gICAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEpOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEuaVRvSSk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzQV0pOwotICAgIEdQQkludDMySW50MzJEaWN0aW9uYXJ5ICppVG9JID0gW21lc3NhZ2UuYS5pVG9JIHJldGFpbl07Ci0gICAgWENUQXNzZXJ0RXF1YWwoaVRvSS0+X2F1dG9jcmVhdG9yLCBtZXNzYWdlLmEpOyAgLy8gUG9pbnRlciBjb21wYXJpc2lvbgotICAgIG1lc3NhZ2UuYS5pVG9JID0gW0dQQkludDMySW50MzJEaWN0aW9uYXJ5IGRpY3Rpb25hcnlXaXRoVmFsdWU6NiBmb3JLZXk6N107Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgWENUQXNzZXJ0Tm90RXF1YWwobWVzc2FnZS5hLmlUb0ksIGlUb0kpOyAgLy8gUG9pbnRlciBjb21wYXJpc2lvbgotICAgIFhDVEFzc2VydE5pbChpVG9JLT5fYXV0b2NyZWF0b3IpOwotICAgIFtpVG9JIHJlbGVhc2VdOwotICB9Ci0KLSAgewotICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UgPQotICAgICAgICBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCBtZXNzYWdlXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5hKTsKLSAgICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5hLnN0clRvU3RyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5ICpzdHJUb1N0ciA9Ci0gICAgICAgIChHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnkgKilbbWVzc2FnZS5hLnN0clRvU3RyIHJldGFpbl07Ci0gICAgWENUQXNzZXJ0VHJ1ZShbc3RyVG9TdHIgaXNLaW5kT2ZDbGFzczpbR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5IGNsYXNzXV0pOwotICAgIFhDVEFzc2VydEVxdWFsKHN0clRvU3RyLT5fYXV0b2NyZWF0b3IsIG1lc3NhZ2UuYSk7ICAvLyBQb2ludGVyIGNvbXBhcmlzaW9uCi0gICAgbWVzc2FnZS5hLnN0clRvU3RyID0KLSAgICAgICAgW05TTXV0YWJsZURpY3Rpb25hcnkgZGljdGlvbmFyeVdpdGhPYmplY3Q6QCJhYmMiIGZvcktleTpAImRlZiJdOwotICAgIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzQV0pOwotICAgIFhDVEFzc2VydE5vdEVxdWFsKG1lc3NhZ2UuYS5zdHJUb1N0ciwgc3RyVG9TdHIpOyAgLy8gUG9pbnRlciBjb21wYXJpc2lvbgotICAgIFhDVEFzc2VydE5pbChzdHJUb1N0ci0+X2F1dG9jcmVhdG9yKTsKLSAgICBbc3RyVG9TdHIgcmVsZWFzZV07Ci0gIH0KLX0KLQotLSAodm9pZCl0ZXN0U2V0QXV0b2NyZWF0ZWRNYXBUb1NlbGYgewotICAvLyBTZXR0aW5nIG1hcCB0byBpdHNlbGYgc2hvdWxkIGNhdXNlIGl0IHRvIGJlY29tZSB2aXNpYmxlLgotICB7Ci0gICAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCAqbWVzc2FnZSA9Ci0gICAgICAgIFtUZXN0UmVjdXJzaXZlTWVzc2FnZVdpdGhSZXBlYXRlZEZpZWxkIG1lc3NhZ2VdOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEpOwotICAgIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEuaVRvSSk7Ci0gICAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzQV0pOwotICAgIG1lc3NhZ2UuYS5pVG9JID0gbWVzc2FnZS5hLmlUb0k7Ci0gICAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgWENUQXNzZXJ0TmlsKG1lc3NhZ2UuYS5pVG9JLT5fYXV0b2NyZWF0b3IpOwotICB9Ci0KLSAgewotICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UgPQotICAgICAgICBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCBtZXNzYWdlXTsKLSAgICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5hKTsKLSAgICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5hLnN0clRvU3RyKTsKLSAgICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNBXSk7Ci0gICAgbWVzc2FnZS5hLnN0clRvU3RyID0gbWVzc2FnZS5hLnN0clRvU3RyOwotICAgIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzQV0pOwotICAgIFhDVEFzc2VydFRydWUoW21lc3NhZ2UuYS5zdHJUb1N0ciBpc0tpbmRPZkNsYXNzOltHUEJBdXRvY3JlYXRlZERpY3Rpb25hcnkgY2xhc3NdXSk7Ci0gICAgWENUQXNzZXJ0TmlsKCgoR1BCQXV0b2NyZWF0ZWREaWN0aW9uYXJ5ICopbWVzc2FnZS5hLnN0clRvU3RyKS0+X2F1dG9jcmVhdG9yKTsKLSAgfQotfQotCi0tICh2b2lkKXRlc3RBdXRvY3JlYXRlZE1hcFJlbW92ZUFsbFZhbHVlcyB7Ci0gIC8vIENhbGxpbmcgcmVtb3ZlQWxsIG9uIGF1dG9jcmVhdGVkIG1hcCBzaG91bGQgbm90IGNhdXNlIGl0IHRvIGJlIHZpc2libGUuCi0gIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgKm1lc3NhZ2UgPQotICAgICAgW1Rlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgbWVzc2FnZV07Ci0gIFttZXNzYWdlLmEuaVRvSSByZW1vdmVBbGxdOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNBXSk7Ci0gIFttZXNzYWdlLmEuc3RyVG9TdHIgcmVtb3ZlQWxsT2JqZWN0c107Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0FdKTsKLX0KLQotLSAodm9pZCl0ZXN0RXh0ZW5zaW9uQWNjZXNzb3JzIHsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIFtzZWxmIHNldEFsbEV4dGVuc2lvbnM6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBbc2VsZiBhc3NlcnRBbGxFeHRlbnNpb25zU2V0Om1lc3NhZ2UgcmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLX0KLQotLSAodm9pZCl0ZXN0RXh0ZW5zaW9uUmVwZWF0ZWRTZXR0ZXJzIHsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIFtzZWxmIHNldEFsbEV4dGVuc2lvbnM6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBbc2VsZiBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnM6bWVzc2FnZV07Ci0gIFtzZWxmIGFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkOm1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci19Ci0KLS0gKHZvaWQpdGVzdEV4dGVuc2lvbkRlZmF1bHRzIHsKLSAgW3NlbGYgYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyOltUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlXV07Ci19Ci0KLS0gKHZvaWQpdGVzdEV4dGVuc2lvbklzRXF1YWxzIHsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIFtzZWxmIHNldEFsbEV4dGVuc2lvbnM6bWVzc2FnZSByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBbc2VsZiBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnM6bWVzc2FnZV07Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlMiA9IFtUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0QWxsRXh0ZW5zaW9uczptZXNzYWdlMiByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBpc0VxdWFsOm1lc3NhZ2UyXSk7Ci0gIG1lc3NhZ2UyID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRBbGxFeHRlbnNpb25zOm1lc3NhZ2UyIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0gIFtzZWxmIG1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9uczptZXNzYWdlMl07Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLCBtZXNzYWdlMik7Ci19Ci0KLS0gKHZvaWQpdGVzdEV4dGVuc2lvbnNNZXJnZUZyb20gewotICBUZXN0QWxsRXh0ZW5zaW9ucyAqbWVzc2FnZSA9IFtUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0QWxsRXh0ZW5zaW9uczptZXNzYWdlIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0gIFtzZWxmIG1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9uczptZXNzYWdlXTsKLQotICBtZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRBbGxFeHRlbnNpb25zOm1lc3NhZ2UgcmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UyID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBbc2VsZiBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnM6bWVzc2FnZTJdOwotICBbbWVzc2FnZTIgbWVyZ2VGcm9tOm1lc3NhZ2VdOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLCBtZXNzYWdlMik7Ci19Ci0KLS0gKHZvaWQpdGVzdERlZmF1bHRpbmdFeHRlbnNpb25NZXNzYWdlcyB7Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotCi0gIC8vIEluaXRpYWxseSB0aGV5IHNob3VsZCBhbGwgbm90IGhhdmUgdmFsdWVzLgotCi0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKAotICAgICAgW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZSgKLSAgICAgIFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKAotICAgICAgW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZQotICAgICAgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZSgKLSAgICAgIFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsTGF6eU1lc3NhZ2VFeHRlbnNpb25dXSk7Ci0KLSAgLy8gVGhleSBzaG91bGQgYXV0byBjcmVhdGUgc29tZXRoaW5nIHdoZW4gZmV0Y2hlZC4KLQotICBUZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cCAqb3B0aW9uYWxHcm91cCA9Ci0gICAgICBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXV07Ci0gIFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlICpvcHRpb25hbE5lc3RlZE1lc3NhZ2UgPQotICAgICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV07Ci0gIEZvcmVpZ25NZXNzYWdlICpvcHRpb25hbEZvcmVpZ25NZXNzYWdlID0KLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXTsKLSAgSW1wb3J0TWVzc2FnZSAqb3B0aW9uYWxJbXBvcnRNZXNzYWdlID0KLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dOwotICBQdWJsaWNJbXBvcnRNZXNzYWdlICpvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2UgPSBbbWVzc2FnZQotICAgICAgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXV07Ci0gIFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlICpvcHRpb25hbExhenlNZXNzYWdlID0KLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsTGF6eU1lc3NhZ2VFeHRlbnNpb25dXTsKLQotICBYQ1RBc3NlcnROb3ROaWwob3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydE5vdE5pbChvcHRpb25hbE5lc3RlZE1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3ROaWwob3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdE5pbChvcHRpb25hbEltcG9ydE1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3ROaWwob3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG9wdGlvbmFsTGF6eU1lc3NhZ2UpOwotCi0gIC8vIEFsdGhvdWdoIGl0IGF1dG8tY3JlYXRlZCBlbXB0eSBtZXNzYWdlcywgaXQgc2hvdWxkIG5vdCBzaG93IHRoYXQgaXQgaGFzCi0gIC8vIHRoZW0uCi0KLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbl1dKTsKLQotICAvLyBBbmQgdGhleSBzZXQgdGhhdCB2YWx1ZSBiYWNrIGluIHRvIHRoZSBtZXNzYWdlIHNpbmNlIHRoZSB2YWx1ZSBjcmVhdGVkIHdhcwotICAvLyBtdXRhYmxlIChzbyBhIHNlY29uZCBmZXRjaCBzaG91bGQgZ2l2ZSB0aGUgc2FtZSBvYmplY3QpLgotCi0gIFhDVEFzc2VydEVxdWFsKFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXSwKLSAgICAgICAgICAgICAgICAgb3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydEVxdWFsKAotICAgICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0sCi0gICAgICBvcHRpb25hbE5lc3RlZE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbCgKLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXSwKLSAgICAgIG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbCgKLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dLAotICAgICAgb3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwoCi0gICAgICBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFB1YmxpY0ltcG9ydE1lc3NhZ2VFeHRlbnNpb25dXSwKLSAgICAgIG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsKAotICAgICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbl1dLAotICAgICAgb3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0KLSAgLy8gQW5kIHRoZSBkZWZhdWx0IG9iamVjdHMgZm9yIGEgc2Vjb25kIG1lc3NhZ2Ugc2hvdWxkIGJlIGRpc3RpbmN0IChhZ2FpbiwKLSAgLy8gc2luY2UgdGhleSBhcmUgbXV0YWJsZSwgZWFjaCBuZWVkcyB0aGVpciBvd24gY29weSkuCi0KLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UyID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotCi0gIC8vIEludGVudGlvbmFsbHkgZG9pbmcgYSBwb2ludGVyIGNvbXBhcmlzb24uCi0gIFhDVEFzc2VydE5vdEVxdWFsKAotICAgICAgW21lc3NhZ2UyIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXSwKLSAgICAgIG9wdGlvbmFsR3JvdXApOwotICBYQ1RBc3NlcnROb3RFcXVhbCgKLSAgICAgIFttZXNzYWdlMiBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25dXSwKLSAgICAgIG9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKAotICAgICAgW21lc3NhZ2UyIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXSwKLSAgICAgIG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICBYQ1RBc3NlcnROb3RFcXVhbCgKLSAgICAgIFttZXNzYWdlMiBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25dXSwKLSAgICAgIG9wdGlvbmFsSW1wb3J0TWVzc2FnZSk7Ci0gIFhDVEFzc2VydE5vdEVxdWFsKAotICAgICAgW21lc3NhZ2UyIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dLAotICAgICAgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0Tm90RXF1YWwoCi0gICAgICBbbWVzc2FnZTIgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbl1dLAotICAgICAgb3B0aW9uYWxMYXp5TWVzc2FnZSk7Ci0KLSAgLy8gQ2xlYXIgdmFsdWVzLCBhbmQgb24gbmV4dCBhY2Nlc3MgeW91IGdldCBiYWNrIG5ldyBzdWJtZXNzYWdlcy4KLQotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXSB2YWx1ZTpuaWxdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXSB2YWx1ZTpuaWxdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpuaWxdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6bmlsXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6bmlsXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6bmlsXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxMYXp5TWVzc2FnZUV4dGVuc2lvbl0gdmFsdWU6bmlsXTsKLQotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZSgKLSAgICAgIFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoCi0gICAgICBbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZSgKLSAgICAgIFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UKLSAgICAgIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoCi0gICAgICBbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uXV0pOwotCi0gIFhDVEFzc2VydEVxdWFsKFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXSwKLSAgICAgICAgICAgICAgICAgb3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydEVxdWFsKAotICAgICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0sCi0gICAgICBvcHRpb25hbE5lc3RlZE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbCgKLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXSwKLSAgICAgIG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRFcXVhbCgKLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dLAotICAgICAgb3B0aW9uYWxJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwoCi0gICAgICBbbWVzc2FnZQotICAgICAgICAgIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsUHVibGljSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dLAotICAgICAgb3B0aW9uYWxQdWJsaWNJbXBvcnRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWwoCi0gICAgICBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbExhenlNZXNzYWdlRXh0ZW5zaW9uXV0sCi0gICAgICBvcHRpb25hbExhenlNZXNzYWdlKTsKLX0KLQotLSAodm9pZCl0ZXN0TXVsdGlwbGVQb2ludGVyc1RvQXV0b2NyZWF0ZWRFeHRlbnNpb24gewotICAvLyAyIG9iamVjdHMgcG9pbnQgdG8gdGhlIHNhbWUgYXV0by1jcmVhdGVkIGV4dGVuc2lvbi4gT25lIHNob3VsZCAiaGFzIiBpdC4KLSAgLy8gVGhlIG90aGVyIHNob3VsZCBub3QuCi0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBUZXN0QWxsRXh0ZW5zaW9ucyAqbWVzc2FnZTIgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dGVuc2lvbiA9IFtVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpleHRlbnNpb24gdmFsdWU6W21lc3NhZ2UyIGdldEV4dGVuc2lvbjpleHRlbnNpb25dXTsKLSAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOmV4dGVuc2lvbl0sCi0gICAgICAgICAgICAgICAgIFttZXNzYWdlMiBnZXRFeHRlbnNpb246ZXh0ZW5zaW9uXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlMiBoYXNFeHRlbnNpb246ZXh0ZW5zaW9uXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOmV4dGVuc2lvbl0pOwotCi0gIFRlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwICpleHRlbnNpb25WYWx1ZSA9Ci0gICAgICBbbWVzc2FnZTIgZ2V0RXh0ZW5zaW9uOmV4dGVuc2lvbl07Ci0gIGV4dGVuc2lvblZhbHVlLmEgPSAxOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlMiBoYXNFeHRlbnNpb246ZXh0ZW5zaW9uXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOmV4dGVuc2lvbl0pOwotfQotCi0tICh2b2lkKXRlc3RDb3B5V2l0aEF1dG9jcmVhdGVkRXh0ZW5zaW9uIHsKLSAgLy8gTXV0YWJsZSBjb3B5IHNob3VsZG4ndCBjb3B5IGF1dG9jcmVhdGVkIGV4dGVuc2lvbnMuCi0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpvcHRpb25hbEdyb3VwRXh0ZW5zaW9uID0KLSAgICAgIFtVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl07Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVzaW9uID0KLSAgICAgIFtVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXTsKLSAgVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAgKm9wdGlvbmFsR3JvdXAgPQotICAgICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOm9wdGlvbmFsR3JvdXBFeHRlbnNpb25dOwotICBvcHRpb25hbEdyb3VwLmEgPSA0MjsKLSAgWENUQXNzZXJ0Tm90TmlsKG9wdGlvbmFsR3JvdXApOwotICBYQ1RBc3NlcnROb3ROaWwoW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVzaW9uXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOm9wdGlvbmFsR3JvdXBFeHRlbnNpb25dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVzaW9uXSk7Ci0KLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UyID0gW1ttZXNzYWdlIGNvcHldIGF1dG9yZWxlYXNlXTsKLQotICAvLyBtZXNzYWdlMiBzaG91bGQgZW5kIHVwIHdpdGggaXRzIG93biBjb3B5IG9mIHRoZSBvcHRpb25hbCBncm91cC4KLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZTIgaGFzRXh0ZW5zaW9uOm9wdGlvbmFsR3JvdXBFeHRlbnNpb25dKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIGdldEV4dGVuc2lvbjpvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFttZXNzYWdlMiBnZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0pOwotICAvLyBJbnRlbnRpb25hbGx5IGRvaW5nIGEgcG9pbnRlciBjb21wYXJpc29uLgotICBYQ1RBc3NlcnROb3RFcXVhbChbbWVzc2FnZSBnZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0sCi0gICAgICAgICAgICAgICAgICAgIFttZXNzYWdlMiBnZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0pOwotCi0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlMiBoYXNFeHRlbnNpb246b3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZXNpb25dKTsKLSAgLy8gSW50ZW50aW9uYWxseSBkb2luZyBhIHBvaW50ZXIgY29tcGFyaXNvbiAoYXV0byBjcmVhdGlvbiBzaG91bGQgYmUKLSAgLy8gZGlmZmVyZW50KQotICBYQ1RBc3NlcnROb3RFcXVhbChbbWVzc2FnZSBnZXRFeHRlbnNpb246b3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZXNpb25dLAotICAgICAgICAgICAgICAgICAgICBbbWVzc2FnZTIgZ2V0RXh0ZW5zaW9uOm9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVzaW9uXSk7Ci19Ci0KLS0gKHZvaWQpdGVzdENsZWFyTWVzc2FnZUF1dG9jcmVhdGVkRXh0ZW5zaW9uIHsKLSAgLy8gQ2FsbCBjbGVhciBzaG91bGQgY2F1c2UgaXQgdG8gcmVjcmVhdGUgaXRzIGF1dG9jcmVhdGVkIGV4dGVuc2lvbnMuCi0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpvcHRpb25hbEdyb3VwRXh0ZW5zaW9uID0KLSAgICAgIFtVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl07Ci0gIFRlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwICpvcHRpb25hbEdyb3VwID0KLSAgICAgIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0gcmV0YWluXTsKLSAgW21lc3NhZ2UgY2xlYXJdOwotICBUZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cCAqb3B0aW9uYWxHcm91cE5ldyA9Ci0gICAgICBbbWVzc2FnZSBnZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl07Ci0KLSAgLy8gSW50ZW50aW9uYWxseSBkb2luZyBhIHBvaW50ZXIgY29tcGFyaXNvbi4KLSAgWENUQXNzZXJ0Tm90RXF1YWwob3B0aW9uYWxHcm91cCwgb3B0aW9uYWxHcm91cE5ldyk7Ci0gIFtvcHRpb25hbEdyb3VwIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RSZXRhaW5BdXRvY3JlYXRlZEV4dGVuc2lvbiB7Ci0gIC8vIFNob3VsZCBiZSBhYmxlIHRvIHJldGFpbiBhdXRvY3JlYXRlZCBleHRlbnNpb24gd2hpbGUgdGhlIGNyZWF0b3IgaXMKLSAgLy8gZGVhbGxvY2VkLgotICBUZXN0QWxsRXh0ZW5zaW9ucyAqbWVzc2FnZSA9IFtUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqb3B0aW9uYWxHcm91cEV4dGVuc2lvbiA9Ci0gICAgICBbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dOwotCi0gIEBhdXRvcmVsZWFzZXBvb2wgewotICAgIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlMiA9IFtUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgICBbbWVzc2FnZSBzZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpbbWVzc2FnZTIgZ2V0RXh0ZW5zaW9uOm9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRUcnVlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KAotICAgICAgICBbbWVzc2FnZSBnZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0sIG1lc3NhZ2UyKSk7Ci0gIH0KLQotICBYQ1RBc3NlcnRGYWxzZShHUEJXYXNNZXNzYWdlQXV0b2NyZWF0ZWRCeSgKLSAgICAgIFttZXNzYWdlIGdldEV4dGVuc2lvbjpvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXSwgbWVzc2FnZSkpOwotfQotCi0tICh2b2lkKXRlc3RDbGVhckF1dG9jcmVhdGVkRXh0ZW5zaW9uIHsKLSAgLy8gQ2xlYXJpbmcgYXV0b2NyZWF0ZWQgZXh0ZW5zaW9uIHNob3VsZCBOT1QgY2F1c2UgaXQgdG8gbG9zZSBpdHMgY3JlYXRvci4KLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2UgPSBbVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKm9wdGlvbmFsR3JvdXBFeHRlbnNpb24gPQotICAgICAgW1VuaXR0ZXN0Um9vdCBvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXTsKLSAgVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAgKm9wdGlvbmFsR3JvdXAgPQotICAgICAgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXSByZXRhaW5dOwotICBbbWVzc2FnZSBjbGVhckV4dGVuc2lvbjpvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXTsKLSAgVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAgKm9wdGlvbmFsR3JvdXBOZXcgPQotICAgICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOm9wdGlvbmFsR3JvdXBFeHRlbnNpb25dOwotICBYQ1RBc3NlcnRFcXVhbChvcHRpb25hbEdyb3VwLCBvcHRpb25hbEdyb3VwTmV3KTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOm9wdGlvbmFsR3JvdXBFeHRlbnNpb25dKTsKLSAgW29wdGlvbmFsR3JvdXAgcmVsZWFzZV07Ci0KLSAgLy8gQ2xlYXJpbmcgYXV0b2NyZWF0ZWQgZXh0ZW5zaW9uIHNob3VsZCBub3QgY2F1c2UgaXRzIGNyZWF0b3IgdG8gYmVjb21lCi0gIC8vIHZpc2libGUKLSAgR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqcmVjdXJzaXZlRXh0ZW5zaW9uID0KLSAgICAgIFtVbml0dGVzdE9iamNSb290IHJlY3Vyc2l2ZUV4dGVuc2lvbl07Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlX2x2bDIgPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246cmVjdXJzaXZlRXh0ZW5zaW9uXTsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2VfbHZsMyA9Ci0gICAgICBbbWVzc2FnZV9sdmwyIGdldEV4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dOwotICBbbWVzc2FnZV9sdmwzIGNsZWFyRXh0ZW5zaW9uOnJlY3Vyc2l2ZUV4dGVuc2lvbl07Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dKTsKLX0KLQotLSAodm9pZCl0ZXN0U2V0QXV0b2NyZWF0ZWRFeHRlbnNpb25CZWNvbWVzVmlzaWJsZSB7Ci0gIC8vIFNldHRpbmcgYW4gZXh0ZW5zaW9uIHNob3VsZCBjYXVzZSB0aGUgZXh0ZW5zaW9uIHRvIGFwcGVhciB0byBpdHMgY3JlYXRvci4KLSAgLy8gVGVzdCB0aGlzIHNldmVyYWwgbGV2ZWxzIGRlZXAuCi0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpyZWN1cnNpdmVFeHRlbnNpb24gPQotICAgICAgW1VuaXR0ZXN0T2JqY1Jvb3QgcmVjdXJzaXZlRXh0ZW5zaW9uXTsKLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2VfbHZsMiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dOwotICBUZXN0QWxsRXh0ZW5zaW9ucyAqbWVzc2FnZV9sdmwzID0KLSAgICAgIFttZXNzYWdlX2x2bDIgZ2V0RXh0ZW5zaW9uOnJlY3Vyc2l2ZUV4dGVuc2lvbl07Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlX2x2bDQgPQotICAgICAgW21lc3NhZ2VfbHZsMyBnZXRFeHRlbnNpb246cmVjdXJzaXZlRXh0ZW5zaW9uXTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOnJlY3Vyc2l2ZUV4dGVuc2lvbl0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZV9sdmwyIGhhc0V4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2VfbHZsMyBoYXNFeHRlbnNpb246cmVjdXJzaXZlRXh0ZW5zaW9uXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlX2x2bDQgaGFzRXh0ZW5zaW9uOnJlY3Vyc2l2ZUV4dGVuc2lvbl0pOwotICBbbWVzc2FnZV9sdmw0IHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50MzJFeHRlbnNpb25dIHZhbHVlOkAoMSldOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZV9sdmwyIGhhc0V4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZV9sdmwzIGhhc0V4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2VfbHZsNCBoYXNFeHRlbnNpb246cmVjdXJzaXZlRXh0ZW5zaW9uXSk7Ci0gIFhDVEFzc2VydEZhbHNlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VfbHZsNCwgbWVzc2FnZV9sdmwzKSk7Ci0gIFhDVEFzc2VydEZhbHNlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VfbHZsMywgbWVzc2FnZV9sdmwyKSk7Ci0gIFhDVEFzc2VydEZhbHNlKEdQQldhc01lc3NhZ2VBdXRvY3JlYXRlZEJ5KG1lc3NhZ2VfbHZsMiwgbWVzc2FnZSkpOwotfQotCi0tICh2b2lkKXRlc3RTZXRBdXRvY3JlYXRlZEV4dGVuc2lvblRvU2VsZiB7Ci0gIC8vIFNldHRpbmcgZXh0ZW5zaW9uIHRvIGl0c2VsZiBzaG91bGQgY2F1c2UgaXQgdG8gYmVjb21lIHZpc2libGUuCi0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlID0gW1Rlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2VdOwotICBHUEJFeHRlbnNpb25EZXNjcmlwdG9yICpvcHRpb25hbEdyb3VwRXh0ZW5zaW9uID0KLSAgICAgIFtVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl07Ci0gIFhDVEFzc2VydE5vdE5pbChbbWVzc2FnZSBnZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0pOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbgotICAgICAgICAgICAgICAgICAgdmFsdWU6W21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOm9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246b3B0aW9uYWxHcm91cEV4dGVuc2lvbl0pOwotfQotCi0tICh2b2lkKXRlc3RBdXRvY3JlYXRlZEV4dGVuc2lvbk1lbW9yeUxlYWtzIHsKLSAgR1BCRXh0ZW5zaW9uRGVzY3JpcHRvciAqcmVjdXJzaXZlRXh0ZW5zaW9uID0KLSAgICAgIFtVbml0dGVzdE9iamNSb290IHJlY3Vyc2l2ZUV4dGVuc2lvbl07Ci0KLSAgLy8gVGVzdCBmb3IgbWVtb3J5IGxlYWtzIHdpdGggYXV0b2NyZWF0ZWQgZXh0ZW5zaW9ucy4KLSAgVGVzdEFsbEV4dGVuc2lvbnMgKm1lc3NhZ2U7Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlX2x2bDI7Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlX2x2bDM7Ci0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlX2x2bDQ7Ci0gIEBhdXRvcmVsZWFzZXBvb2wgewotICAgIG1lc3NhZ2UgPSBbW1Rlc3RBbGxFeHRlbnNpb25zIGFsbG9jXSBpbml0XTsKLSAgICBtZXNzYWdlX2x2bDIgPSBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOnJlY3Vyc2l2ZUV4dGVuc2lvbl0gcmV0YWluXTsKLSAgICBtZXNzYWdlX2x2bDMgPSBbW21lc3NhZ2VfbHZsMiBnZXRFeHRlbnNpb246cmVjdXJzaXZlRXh0ZW5zaW9uXSByZXRhaW5dOwotICAgIG1lc3NhZ2VfbHZsNCA9IFtbbWVzc2FnZV9sdmwzIGdldEV4dGVuc2lvbjpyZWN1cnNpdmVFeHRlbnNpb25dIHJldGFpbl07Ci0gICAgW21lc3NhZ2VfbHZsMiBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEludDMyRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoMSldOwotICB9Ci0KLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5yZXRhaW5Db3VudCwgKE5TVUludGVnZXIpMSk7Ci0gIEBhdXRvcmVsZWFzZXBvb2wgewotICAgIFttZXNzYWdlIHJlbGVhc2VdOwotICB9Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2VfbHZsMi5yZXRhaW5Db3VudCwgKE5TVUludGVnZXIpMSk7Ci0gIEBhdXRvcmVsZWFzZXBvb2wgewotICAgIFttZXNzYWdlX2x2bDIgcmVsZWFzZV07Ci0gIH0KLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZV9sdmwzLnJldGFpbkNvdW50LCAoTlNVSW50ZWdlcikxKTsKLSAgQGF1dG9yZWxlYXNlcG9vbCB7Ci0gICAgW21lc3NhZ2VfbHZsMyByZWxlYXNlXTsKLSAgfQotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlX2x2bDQucmV0YWluQ291bnQsIChOU1VJbnRlZ2VyKTEpOwotICBbbWVzc2FnZV9sdmw0IHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RTZXRFeHRlbnNpb25XaXRoQXV0b2NyZWF0ZWRWYWx1ZSB7Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKnJlY3Vyc2l2ZUV4dGVuc2lvbiA9Ci0gICAgICBbVW5pdHRlc3RPYmpjUm9vdCByZWN1cnNpdmVFeHRlbnNpb25dOwotCi0gIFRlc3RBbGxFeHRlbnNpb25zICptZXNzYWdlOwotICBAYXV0b3JlbGVhc2Vwb29sIHsKLSAgICBtZXNzYWdlID0gW1tUZXN0QWxsRXh0ZW5zaW9ucyBhbGxvY10gaW5pdF07Ci0gICAgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOnJlY3Vyc2l2ZUV4dGVuc2lvbl07Ci0gIH0KLQotICAvLyBUaGlzIHN0YXRlbWVudHMgY2hlY2tzIHRoYXQgdGhlIGV4dGVuc2lvbiB2YWx1ZSBpc24ndCBhY2NpZGVudGFsbHkKLSAgLy8gZGVhbGxvY2VkIHdoZW4gcmVtb3ZpbmcgaXQgZnJvbSB0aGUgYXV0b2NyZWF0ZWQgbWFwLgotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246cmVjdXJzaXZlRXh0ZW5zaW9uCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpbbWVzc2FnZSBnZXRFeHRlbnNpb246cmVjdXJzaXZlRXh0ZW5zaW9uXV07Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOnJlY3Vyc2l2ZUV4dGVuc2lvbl0pOwotICBbbWVzc2FnZSByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0UmVjdXJzaW9uIHsKLSAgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgKm1lc3NhZ2UgPSBbVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLmEpOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5hLmEpOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLmEuYS5pLCAwKTsKLX0KLQotLSAodm9pZCl0ZXN0R2VuZXJhdGVBbmRQYXJzZVVua25vd25NZXNzYWdlIHsKLSAgR1BCVW5rbm93bkZpZWxkU2V0ICp1bmtub3ducyA9Ci0gICAgICBbW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLSAgW3Vua25vd25zIG1lcmdlVmFyaW50RmllbGQ6MTIzIHZhbHVlOjQ1Nl07Ci0gIEdQQk1lc3NhZ2UgKm1lc3NhZ2UgPSBbR1BCTWVzc2FnZSBtZXNzYWdlXTsKLSAgW21lc3NhZ2Ugc2V0VW5rbm93bkZpZWxkczp1bmtub3duc107Ci0gIE5TRGF0YSAqZGF0YSA9IFttZXNzYWdlIGRhdGFdOwotICBHUEJNZXNzYWdlICptZXNzYWdlMiA9Ci0gICAgICBbR1BCTWVzc2FnZSBwYXJzZUZyb21EYXRhOmRhdGEgZXh0ZW5zaW9uUmVnaXN0cnk6bmlsIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZSwgbWVzc2FnZTIpOwotfQotCi0tICh2b2lkKXRlc3REZWxpbWl0ZWRXcml0ZUFuZFBhcnNlTXVsdGlwbGVNZXNzYWdlcyB7Ci0gIEdQQlVua25vd25GaWVsZFNldCAqdW5rbm93bnMxID0KLSAgICAgIFtbW0dQQlVua25vd25GaWVsZFNldCBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotICBbdW5rbm93bnMxIG1lcmdlVmFyaW50RmllbGQ6MTIzIHZhbHVlOjQ1Nl07Ci0gIEdQQk1lc3NhZ2UgKm1lc3NhZ2UxID0gW0dQQk1lc3NhZ2UgbWVzc2FnZV07Ci0gIFttZXNzYWdlMSBzZXRVbmtub3duRmllbGRzOnVua25vd25zMV07Ci0KLSAgR1BCVW5rbm93bkZpZWxkU2V0ICp1bmtub3duczIgPQotICAgICAgW1tbR1BCVW5rbm93bkZpZWxkU2V0IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Ci0gIFt1bmtub3duczIgbWVyZ2VWYXJpbnRGaWVsZDo3ODkgdmFsdWU6OTg3XTsKLSAgW3Vua25vd25zMiBtZXJnZVZhcmludEZpZWxkOjY1NCB2YWx1ZTozMjFdOwotICBHUEJNZXNzYWdlICptZXNzYWdlMiA9IFtHUEJNZXNzYWdlIG1lc3NhZ2VdOwotICBbbWVzc2FnZTIgc2V0VW5rbm93bkZpZWxkczp1bmtub3duczJdOwotCi0gIE5TTXV0YWJsZURhdGEgKmRlbGltaXRlZERhdGEgPSBbTlNNdXRhYmxlRGF0YSBkYXRhXTsKLSAgW2RlbGltaXRlZERhdGEgYXBwZW5kRGF0YTpbbWVzc2FnZTEgZGVsaW1pdGVkRGF0YV1dOwotICBbZGVsaW1pdGVkRGF0YSBhcHBlbmREYXRhOlttZXNzYWdlMiBkZWxpbWl0ZWREYXRhXV07Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW0gKmlucHV0ID0KLSAgICAgIFtHUEJDb2RlZElucHV0U3RyZWFtIHN0cmVhbVdpdGhEYXRhOmRlbGltaXRlZERhdGFdOwotICBHUEJNZXNzYWdlICptZXNzYWdlMyA9IFtHUEJNZXNzYWdlIHBhcnNlRGVsaW1pdGVkRnJvbUNvZGVkSW5wdXRTdHJlYW06aW5wdXQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5Om5pbAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6TlVMTF07Ci0gIEdQQk1lc3NhZ2UgKm1lc3NhZ2U0ID0gW0dQQk1lc3NhZ2UgcGFyc2VEZWxpbWl0ZWRGcm9tQ29kZWRJbnB1dFN0cmVhbTppbnB1dAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6bmlsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpOVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UxLCBtZXNzYWdlMyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlMiwgbWVzc2FnZTQpOwotfQotCi0tICh2b2lkKXRlc3REdXBsaWNhdGVFbnVtcyB7Ci0gIFhDVEFzc2VydEVxdWFsKFRlc3RFbnVtV2l0aER1cFZhbHVlX0ZvbzEsIFRlc3RFbnVtV2l0aER1cFZhbHVlX0ZvbzIpOwotfQotCi0tICh2b2lkKXRlc3RXZWlyZERlZmF1bHRzIHsKLSAgT2JqY1dlaXJkRGVmYXVsdHMgKm1lc3NhZ2UgPSBbT2JqY1dlaXJkRGVmYXVsdHMgbWVzc2FnZV07Ci0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbW21lc3NhZ2UgY2xhc3NdIGRlc2NyaXB0b3JdOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkRGVzYyA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE5hbWU6QCJmb28iXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzYyk7Ci0gIFhDVEFzc2VydFRydWUoZmllbGREZXNjLmhhc0RlZmF1bHRWYWx1ZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRm9vKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UuZm9vLCBAIiIpOwotCi0gIGZpZWxkRGVzYyA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE5hbWU6QCJiYXIiXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGZpZWxkRGVzYyk7Ci0gIFhDVEFzc2VydFRydWUoZmllbGREZXNjLmhhc0RlZmF1bHRWYWx1ZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzQmFyKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UuYmFyLCBHUEJFbXB0eU5TRGF0YSgpKTsKLX0KLQotLSAodm9pZCl0ZXN0RW51bURlc2NyaXB0b3JGcm9tRXh0ZW5zaW9uRGVzY3JpcHRvciB7Ci0gIEdQQkV4dGVuc2lvbkRlc2NyaXB0b3IgKmV4dERlc2NyaXB0b3IgPQotICAgICAgW1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uXTsKLSAgWENUQXNzZXJ0RXF1YWwoZXh0RGVzY3JpcHRvci5kYXRhVHlwZSwgR1BCRGF0YVR5cGVFbnVtKTsKLSAgR1BCRW51bURlc2NyaXB0b3IgKmVudW1EZXNjcmlwdG9yID0gZXh0RGVzY3JpcHRvci5lbnVtRGVzY3JpcHRvcjsKLSAgR1BCRW51bURlc2NyaXB0b3IgKmV4cGVjdGVkRGVzY3JpcHRvciA9IEZvcmVpZ25FbnVtX0VudW1EZXNjcmlwdG9yKCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhlbnVtRGVzY3JpcHRvciwgZXhwZWN0ZWREZXNjcmlwdG9yKTsKLX0KLQotLSAodm9pZCl0ZXN0UHJvcGVydHlOYW1pbmcgewotICAvLyBvYmplY3RpdmVjX2hlbHBlcnMuY2MgaGFzIHNvbWUgc3BlY2lhbCBoYW5kaW5nIHRvIGdldCBwcm9wZXIgYWxsIGNhcHMKLSAgLy8gZm9yIGEgZmV3IGNhc2VzIHRvIG1lZXQgb2JqYyBkZXZlbG9wZXIgZXhwZWN0YXRpb25zLgotICAvLwotICAvLyBUaGlzICJ0ZXN0IiBjb25maXJtcyB0aGF0IHRoZSBleHBlY3RlZCBuYW1lcyBhcmUgZ2VuZXJhdGVkLCBvdGhlcndpc2UgdGhlCi0gIC8vIHRlc3QgaXRzZWxmIHdpbGwgZmFpbCB0byBjb21waWxlLgotICBPYmpDUHJvcGVydHlOYW1pbmcgKm1zZyA9IFtPYmpDUHJvcGVydHlOYW1pbmcgbWVzc2FnZV07Ci0gIC8vIE9uIHRoZWlyIG93biwgYXQgdGhlIGVuZCwgaW4gdGhlIG1pZGRsZS4KLSAgbXNnLlVSTCA9IEAiZ29vZCI7Ci0gIG1zZy50aHVtYm5haWxVUkwgPSBAImdvb2QiOwotICBtc2cuVVJMRm9vID0gQCJnb29kIjsKLSAgbXNnLnNvbWVVUkxCbGFoID0gQCJnb29kIjsKLSAgbXNnLkhUVFAgPSBAImdvb2QiOwotICBtc2cuSFRUUFMgPSBAImdvb2QiOwotICAvLyBObyBjYXBzIHNpbmNlIGl0IHdhcyAidXJscyIuCi0gIFttc2cudXJsc0FycmF5IGFkZE9iamVjdDpAImdvb2QiXTsKLX0KLQotLSAodm9pZCl0ZXN0RW51bU5hbWluZyB7Ci0gIC8vIG9iamVjdGl2ZWNfaGVscGVycy5jYyBoYXMgc29tZSBpbnRlcmVzdGluZyBjYXNlcyB0byBkZWFsIHdpdGggaW4KLSAgLy8gRW51bVZhbHVlTmFtZS9FbnVtVmFsdWVTaG9ydE5hbWUuICBDb25maXJtIHRoYXQgdGhpbmdzIGdlbmVyYXRlZCBhcwotICAvLyBleHBlY3RlZC4KLQotICAvLyBUaGlzIGJsb2NrIGp1c3QgaGFzIHRvIGNvbXBpbGUgdG8gY29uZmlybSB3ZSBnb3QgdGhlIGV4cGVjdGVkIHR5cGVzL25hbWVzLgotICAvLyBUaGUgKl9Jc1ZhbGlkVmFsdWUoKSBjYWxscyBhcmUganVzdCB0aGVyZSB0byBrZWVwIHRoZSBwcm9qZWN0cyB3YXJuaW5ncwotICAvLyBmbGFncyBoYXBweSBieSBwcm92aWRpbmcgdXNlIG9mIHRoZSB2YXJpYWJsZXMvdmFsdWVzLgotCi0gIEZvbyBhRm9vID0gRm9vX1NlcmlhbGl6ZWRTaXplOwotICBGb29fSXNWYWxpZFZhbHVlKGFGb28pOwotICBhRm9vID0gRm9vX1NpemU7Ci0gIEZvb19Jc1ZhbGlkVmFsdWUoYUZvbyk7Ci0KLSAgQ2F0ZWdvcnlfRW51bSBhQ2F0ID0gQ2F0ZWdvcnlfRW51bV9SZWQ7Ci0gIENhdGVnb3J5X0VudW1fSXNWYWxpZFZhbHVlKGFDYXQpOwotCi0gIFRpbWUgYVRpbWUgPSBUaW1lX0Jhc2U7Ci0gIFRpbWVfSXNWYWxpZFZhbHVlKGFUaW1lKTsKLSAgYVRpbWUgPSBUaW1lX1NvbWV0aGluZ0Vsc2U7Ci0gIFRpbWVfSXNWYWxpZFZhbHVlKGFUaW1lKTsKLQotICAvLyBUaGlzIGJsb2NrIGNvbmZpcm1zIHRoZSBuYW1lcyBpbiB0aGUgZGVjcmlwdG9ycyBpcyB3aGF0IHdlIHdhbnRlZC4KLQotICBHUEJFbnVtRGVzY3JpcHRvciAqZGVzY3JpcHRvcjsKLSAgTlNTdHJpbmcgKnZhbHVlTmFtZTsKLQotICBkZXNjcmlwdG9yID0gRm9vX0VudW1EZXNjcmlwdG9yKCk7Ci0gIFhDVEFzc2VydE5vdE5pbChkZXNjcmlwdG9yKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiRm9vIiwgZGVzY3JpcHRvci5uYW1lKTsKLSAgdmFsdWVOYW1lID0gW2Rlc2NyaXB0b3IgZW51bU5hbWVGb3JWYWx1ZTpGb29fU2VyaWFsaXplZFNpemVdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCJGb29fU2VyaWFsaXplZFNpemUiLCB2YWx1ZU5hbWUpOwotICB2YWx1ZU5hbWUgPSBbZGVzY3JpcHRvciBlbnVtTmFtZUZvclZhbHVlOkZvb19TaXplXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiRm9vX1NpemUiLCB2YWx1ZU5hbWUpOwotCi0gIGRlc2NyaXB0b3IgPSBDYXRlZ29yeV9FbnVtX0VudW1EZXNjcmlwdG9yKCk7Ci0gIFhDVEFzc2VydE5vdE5pbChkZXNjcmlwdG9yKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiQ2F0ZWdvcnlfRW51bSIsIGRlc2NyaXB0b3IubmFtZSk7Ci0gIHZhbHVlTmFtZSA9IFtkZXNjcmlwdG9yIGVudW1OYW1lRm9yVmFsdWU6Q2F0ZWdvcnlfRW51bV9SZWRdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCJDYXRlZ29yeV9FbnVtX1JlZCIsIHZhbHVlTmFtZSk7Ci0KLSAgZGVzY3JpcHRvciA9IFRpbWVfRW51bURlc2NyaXB0b3IoKTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRlc2NyaXB0b3IpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCJUaW1lIiwgZGVzY3JpcHRvci5uYW1lKTsKLSAgdmFsdWVOYW1lID0gW2Rlc2NyaXB0b3IgZW51bU5hbWVGb3JWYWx1ZTpUaW1lX0Jhc2VdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCJUaW1lX0Jhc2UiLCB2YWx1ZU5hbWUpOwotICB2YWx1ZU5hbWUgPSBbZGVzY3JpcHRvciBlbnVtTmFtZUZvclZhbHVlOlRpbWVfU29tZXRoaW5nRWxzZV07Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIlRpbWVfU29tZXRoaW5nRWxzZSIsIHZhbHVlTmFtZSk7Ci19Ci0KLS0gKHZvaWQpdGVzdE5lZ2F0aXZlRW51bXMgewotICBFbnVtVGVzdE1zZyAqbXNnID0gW0VudW1UZXN0TXNnIG1lc3NhZ2VdOwotCi0gIC8vIERlZmF1bHRzCi0gIFhDVEFzc2VydEVxdWFsKG1zZy5mb28sIEVudW1UZXN0TXNnX015RW51bV9aZXJvKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnLmJhciwgRW51bVRlc3RNc2dfTXlFbnVtX09uZSk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5iYXosIEVudW1UZXN0TXNnX015RW51bV9OZWdPbmUpOwotICAvLyBCb3VuY2UgdG8gd2lyZSBhbmQgYmFjay4KLSAgTlNEYXRhICpkYXRhID0gW21zZyBkYXRhXTsKLSAgWENUQXNzZXJ0Tm90TmlsKGRhdGEpOwotICBFbnVtVGVzdE1zZyAqbXNnUHJpbWUgPSBbRW51bVRlc3RNc2cgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnUHJpbWUsIG1zZyk7Ci0gIFhDVEFzc2VydEVxdWFsKG1zZ1ByaW1lLmZvbywgRW51bVRlc3RNc2dfTXlFbnVtX1plcm8pOwotICBYQ1RBc3NlcnRFcXVhbChtc2dQcmltZS5iYXIsIEVudW1UZXN0TXNnX015RW51bV9PbmUpOwotICBYQ1RBc3NlcnRFcXVhbChtc2dQcmltZS5iYXosIEVudW1UZXN0TXNnX015RW51bV9OZWdPbmUpOwotCi0gIC8vIE90aGVyIHZhbHVlcwotICBtc2cuYmFyID0gRW51bVRlc3RNc2dfTXlFbnVtX1R3bzsKLSAgbXNnLmJheiA9IEVudW1UZXN0TXNnX015RW51bV9OZWdUd287Ci0gIFhDVEFzc2VydEVxdWFsKG1zZy5iYXIsIEVudW1UZXN0TXNnX015RW51bV9Ud28pOwotICBYQ1RBc3NlcnRFcXVhbChtc2cuYmF6LCBFbnVtVGVzdE1zZ19NeUVudW1fTmVnVHdvKTsKLSAgLy8gQm91bmNlIHRvIHdpcmUgYW5kIGJhY2suCi0gIGRhdGEgPSBbbXNnIGRhdGFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gIG1zZ1ByaW1lID0gW0VudW1UZXN0TXNnIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZ1ByaW1lLCBtc2cpOwotICBYQ1RBc3NlcnRFcXVhbChtc2dQcmltZS5mb28sIEVudW1UZXN0TXNnX015RW51bV9aZXJvKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnUHJpbWUuYmFyLCBFbnVtVGVzdE1zZ19NeUVudW1fVHdvKTsKLSAgWENUQXNzZXJ0RXF1YWwobXNnUHJpbWUuYmF6LCBFbnVtVGVzdE1zZ19NeUVudW1fTmVnVHdvKTsKLQotICAvLyBSZXBlYXRlZCBmaWVsZCAoc2hvdWxkbid0IGV2ZXIgYmUgYW4gaXNzdWUgc2luY2UgZGV2ZWxvcGVyIGhhcyB0byB1c2UgdGhlCi0gIC8vIHJpZ2h0IEdQQkFycmF5IG1ldGhvZHMgdGhlbXNlbHZlcykuCi0gIG1zZy5tdW1ibGVBcnJheSA9IFtHUEJFbnVtQXJyYXkKLSAgICAgIGFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpFbnVtVGVzdE1zZ19NeUVudW1fSXNWYWxpZFZhbHVlXTsKLSAgW21zZy5tdW1ibGVBcnJheSBhZGRWYWx1ZTpFbnVtVGVzdE1zZ19NeUVudW1fWmVyb107Ci0gIFttc2cubXVtYmxlQXJyYXkgYWRkVmFsdWU6RW51bVRlc3RNc2dfTXlFbnVtX09uZV07Ci0gIFttc2cubXVtYmxlQXJyYXkgYWRkVmFsdWU6RW51bVRlc3RNc2dfTXlFbnVtX1R3b107Ci0gIFttc2cubXVtYmxlQXJyYXkgYWRkVmFsdWU6RW51bVRlc3RNc2dfTXlFbnVtX05lZ09uZV07Ci0gIFttc2cubXVtYmxlQXJyYXkgYWRkVmFsdWU6RW51bVRlc3RNc2dfTXlFbnVtX05lZ1R3b107Ci0gIFhDVEFzc2VydEVxdWFsKFttc2cubXVtYmxlQXJyYXkgdmFsdWVBdEluZGV4OjBdLCBFbnVtVGVzdE1zZ19NeUVudW1fWmVybyk7Ci0gIFhDVEFzc2VydEVxdWFsKFttc2cubXVtYmxlQXJyYXkgdmFsdWVBdEluZGV4OjFdLCBFbnVtVGVzdE1zZ19NeUVudW1fT25lKTsKLSAgWENUQXNzZXJ0RXF1YWwoW21zZy5tdW1ibGVBcnJheSB2YWx1ZUF0SW5kZXg6Ml0sIEVudW1UZXN0TXNnX015RW51bV9Ud28pOwotICBYQ1RBc3NlcnRFcXVhbChbbXNnLm11bWJsZUFycmF5IHZhbHVlQXRJbmRleDozXSwgRW51bVRlc3RNc2dfTXlFbnVtX05lZ09uZSk7Ci0gIFhDVEFzc2VydEVxdWFsKFttc2cubXVtYmxlQXJyYXkgdmFsdWVBdEluZGV4OjRdLCBFbnVtVGVzdE1zZ19NeUVudW1fTmVnVHdvKTsKLSAgLy8gQm91bmNlIHRvIHdpcmUgYW5kIGJhY2suCi0gIGRhdGEgPSBbbXNnIGRhdGFdOwotICBYQ1RBc3NlcnROb3ROaWwoZGF0YSk7Ci0gIG1zZ1ByaW1lID0gW0VudW1UZXN0TXNnIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZ1ByaW1lLCBtc2cpOwotICBYQ1RBc3NlcnRFcXVhbChbbXNnUHJpbWUubXVtYmxlQXJyYXkgdmFsdWVBdEluZGV4OjBdLAotICAgICAgICAgICAgICAgICBFbnVtVGVzdE1zZ19NeUVudW1fWmVybyk7Ci0gIFhDVEFzc2VydEVxdWFsKFttc2dQcmltZS5tdW1ibGVBcnJheSB2YWx1ZUF0SW5kZXg6MV0sIEVudW1UZXN0TXNnX015RW51bV9PbmUpOwotICBYQ1RBc3NlcnRFcXVhbChbbXNnUHJpbWUubXVtYmxlQXJyYXkgdmFsdWVBdEluZGV4OjJdLCBFbnVtVGVzdE1zZ19NeUVudW1fVHdvKTsKLSAgWENUQXNzZXJ0RXF1YWwoW21zZ1ByaW1lLm11bWJsZUFycmF5IHZhbHVlQXRJbmRleDozXSwKLSAgICAgICAgICAgICAgICAgRW51bVRlc3RNc2dfTXlFbnVtX05lZ09uZSk7Ci0gIFhDVEFzc2VydEVxdWFsKFttc2dQcmltZS5tdW1ibGVBcnJheSB2YWx1ZUF0SW5kZXg6NF0sCi0gICAgICAgICAgICAgICAgIEVudW1UZXN0TXNnX015RW51bV9OZWdUd28pOwotfQotCi0tICh2b2lkKXRlc3RPbmVCYXNlZEVudW1Ib2xkZXIgewotICAvLyBUZXN0IGNhc2UgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvaXNzdWVzLzE0NTMKLSAgLy8gTWVzc2FnZSB3aXRoIG5vIGV4cGxpY2l0IGRlZmF1bHRzLCBidXQgYSBub24gemVybyBkZWZhdWx0IGZvciBhbiBlbnVtLgotICBNZXNzYWdlV2l0aE9uZUJhc2VkRW51bSAqZW51bU1zZyA9IFtNZXNzYWdlV2l0aE9uZUJhc2VkRW51bSBtZXNzYWdlXTsKLSAgWENUQXNzZXJ0RXF1YWwoZW51bU1zZy5lbnVtRmllbGQsIE1lc3NhZ2VXaXRoT25lQmFzZWRFbnVtX09uZUJhc2VkRW51bV9PbmUpOwotfQotCi0tICh2b2lkKXRlc3RCb29sT2Zmc2V0VXNhZ2UgewotICAvLyBCb29scyB1c2Ugc3RvcmFnZSB3aXRoaW4gaGFzX2JpdHM7IHRoaXMgdGVzdCBlbnN1cmVzIHRoYXQgdGhpcyBpcyBob25vcmVkCi0gIC8vIGluIGFsbCBwbGFjZXMgd2hlcmUgdGhpbmdzIHNob3VsZCBjcmFzaCBvciBmYWlsIGJhc2VkIG9uIHJlYWRpbmcgb3V0IG9mCi0gIC8vIGZpZWxkIHN0b3JhZ2UgaW5zdGVhZC4KLSAgQm9vbE9ubHlNZXNzYWdlICptc2cxID0gW0Jvb2xPbmx5TWVzc2FnZSBtZXNzYWdlXTsKLSAgQm9vbE9ubHlNZXNzYWdlICptc2cyID0gW0Jvb2xPbmx5TWVzc2FnZSBtZXNzYWdlXTsKLQotICBtc2cxLmJvb2xGaWVsZDEgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMSA9IFlFUzsKLSAgbXNnMS5ib29sRmllbGQzID0gWUVTOwotICBtc2cyLmJvb2xGaWVsZDMgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkNSA9IFlFUzsKLSAgbXNnMi5ib29sRmllbGQ1ID0gWUVTOwotICBtc2cxLmJvb2xGaWVsZDcgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkNyA9IFlFUzsKLSAgbXNnMS5ib29sRmllbGQ5ID0gWUVTOwotICBtc2cyLmJvb2xGaWVsZDkgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMTEgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMTEgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMTMgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMTMgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMTUgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMTUgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMTcgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMTcgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMTkgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMTkgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMjEgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMjEgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMjMgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMjMgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMjUgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMjUgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMjcgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMjcgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMjkgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMjkgPSBZRVM7Ci0gIG1zZzEuYm9vbEZpZWxkMzEgPSBZRVM7Ci0gIG1zZzIuYm9vbEZpZWxkMzEgPSBZRVM7Ci0KLSAgbXNnMS5ib29sRmllbGQzMiA9IFlFUzsKLSAgbXNnMi5ib29sRmllbGQzMiA9IFlFUzsKLQotICBYQ1RBc3NlcnRUcnVlKG1zZzEgIT0gbXNnMik7IC8vIERpZmZlcmVudCBwb2ludGVycy4KLSAgWENUQXNzZXJ0RXF1YWwoW21zZzEgaGFzaF0sIFttc2cyIGhhc2hdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZzEsIG1zZzIpOwotCi0gIEJvb2xPbmx5TWVzc2FnZSAqbXNnMVByaW1lID0gW1ttc2cxIGNvcHldIGF1dG9yZWxlYXNlXTsKLSAgWENUQXNzZXJ0VHJ1ZShtc2cxUHJpbWUgIT0gbXNnMSk7IC8vIERpZmZlcmVudCBwb2ludGVycy4KLSAgWENUQXNzZXJ0RXF1YWwoW21zZzEgaGFzaF0sIFttc2cxUHJpbWUgaGFzaF0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobXNnMSwgbXNnMVByaW1lKTsKLQotICAvLyBGaWVsZCBzZXQgaW4gb25lLCBidXQgbm90IHRoZSBvdGhlciBtZWFucyB0aGV5IGRvbid0IG1hdGNoIChldmVuIGlmCi0gIC8vIHNldCB0byBkZWZhdWx0IHZhbHVlKS4KLSAgbXNnMVByaW1lLmJvb2xGaWVsZDIgPSBOTzsKLSAgWENUQXNzZXJ0Tm90RXF1YWxPYmplY3RzKG1zZzFQcmltZSwgbXNnMSk7Ci0gIC8vIEFuZCB3aGVuIHNldCB0byBkaWZmZXJlbnQgdmFsdWVzLgotICBtc2cxLmJvb2xGaWVsZDIgPSBZRVM7Ci0gIFhDVEFzc2VydE5vdEVxdWFsT2JqZWN0cyhtc2cxUHJpbWUsIG1zZzEpOwotICAvLyBBbmQgdGhlbiB0aGV5IG1hdGNoIGFnYWluLgotICBtc2cxLmJvb2xGaWVsZDIgPSBOTzsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1zZzFQcmltZSwgbXNnMSk7Ci0gIFhDVEFzc2VydEVxdWFsKFttc2cxIGhhc2hdLCBbbXNnMVByaW1lIGhhc2hdKTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJPYmplY3RpdmVDUGx1c1BsdXNUZXN0Lm1tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJPYmplY3RpdmVDUGx1c1BsdXNUZXN0Lm1tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YmE4ZmQwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCT2JqZWN0aXZlQ1BsdXNQbHVzVGVzdC5tbQorKysgL2Rldi9udWxsCkBAIC0xLDY5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTMgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0KLSNpbXBvcnQgIkdQQlRlc3RVdGlsaXRpZXMuaCIKLQotCi0vLwotLy8gVGhpcyBpcyBqdXN0IGEgY29tcGlsZSB0ZXN0IChoZXJlIHRvIG1ha2Ugc3VyZSB0aGluZ3MgbmV2ZXIgcmVncmVzcykuCi0vLwotLy8gT2JqZWN0aXZlIEMrKyBjYW4gcnVuIGludG8gaXNzdWVzIHdpdGggaG93IHRoZSBOU19FTlVNL0NGX0VOVU0gZGVjbGFydGlvbgotLy8gd29ya3MgYmVjYXVzZSBvZiB0aGUgQysrIHNwZWMgYmVpbmcgdXNlZCBmb3IgdGhhdCBjb21waWxhdGlvbiB1bml0LiBTbwotLy8gdGhlIGZhY3QgdGhhdCB0aGVzZSBpbXBvcnRzIGFsbCB3b3JrIHdpdGhvdXQgZXJyb3JzL3dhcm5pbmcgbWVhbnMgdGhpbmdzCi0vLyBhcmUgc3RpbGwgZ29vZC4KLS8vCi0vLyBUaGUgIndlbGwga25vdyB0eXBlcyIgc2hvdWxkIGhhdmUgY3Jvc3MgZmlsZSBlbnVtcyBuZWVkaW5nIGltcG9ydHMuCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnMuaCIKLS8vIFNvbWUgb2YgdGhlIHRlc3RzIGV4cGxpY2l0bHkgdXNlIGNyb3NzIGZpbGUgZW51bXMgYWxzby4KLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdEltcG9ydC5wYm9iamMuaCIKLQotLy8gU2FuaXR5IGNoZWNrIHRoZSBjb25kaXRpb25zIG9mIHRoZSB0ZXN0IHdpdGhpbiB0aGUgWGNvZGUgcHJvamVjdC4KLSNpZiAhX19jcGx1c3BsdXMKLSAgI2Vycm9yIFRoaXMgaXNuJ3QgY29tcGlsZWQgYXMgT2JqZWN0aXZlIEMrKz8KLSNlbGlmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKLSAgLy8gSWYgdGhpcyB0cmlwcywgaXQgbWVhbnMgdGhlIFhjb2RlIGRlZmF1bHQgbWlnaHQgaGF2ZSBjaGFuZ2UgKG9yIHNvbWVvbmUKLSAgLy8gZWRpdGVkIHRoZSB0ZXN0aW5nIHByb2plY3QpIGFuZCBpdCBtaWdodCBiZSB0aW1lIHRvIHJldmlzaXQgdGhlIEdQQl9FTlVNCi0gIC8vIGRlZmluZSBpbiBHUEJCb290c3RyYXAuaC4KLSAgI3dhcm5pbmcgRGlkIHRoZSBYY29kZSBkZWZhdWx0IGZvciBDKysgc3BlYyBjaGFuZ2U/Ci0jZW5kaWYKLQotCi0vLyBEdW1teSBYQ1Rlc3QuCi1AaW50ZXJmYWNlIEdQQk9iamVjdGl2ZUNQbHVzUGx1c1Rlc3RzIDogR1BCVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIEdQQk9iamVjdGl2ZUNQbHVzUGx1c1Rlc3RzCi0tICh2b2lkKXRlc3RDUGx1c1BsdXMgewotICAvLyBOb3RoaW5nLCBUaGlzIHdhcyBhIGNvbXBpbGUgdGVzdC4KLSAgWENUQXNzZXJ0VHJ1ZShZRVMpOwotfQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJQZXJmVGVzdHMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCUGVyZlRlc3RzLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDEyNTlkMTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJQZXJmVGVzdHMubQorKysgL2Rldi9udWxsCkBAIC0xLDMwNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDEzIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0SW1wb3J0LnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0T2JqYy5wYm9iamMuaCIKLQotLy8KLS8vIFRoaXMgZmlsZSByZWFsbHkganVzdCB1c2VzIHRoZSB1bml0dGVzdHMgZnJhbWV3b3JrIGFzIGEgdGVzdGJlZCB0bwotLy8gcnVuIHNvbWUgc2ltcGxlIHBlcmZvcm1hbmNlIHRlc3RzLiBUaGUgZGF0YSBjYW4gdGhlbiBiZSB1c2VkIHRvIGhlbHAKLS8vIGV2YWx1YXRlIGNoYW5nZXMgdG8gdGhlIHJ1bnRpbWUuCi0vLwotCi1zdGF0aWMgY29uc3QgdWludDMyX3Qga1JlcGVhdGVkQ291bnQgPSAxMDA7Ci0KLUBpbnRlcmZhY2UgUGVyZlRlc3RzIDogR1BCVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIFBlcmZUZXN0cwotCi0tICh2b2lkKXNldFVwIHsKLSAgLy8gQSBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCBhIGJyZWFrIHBvaW50IGlmIHlvdSB3YW50IHRvIGNvbm5lY3QgaW5zdHJ1bWVudHMuCi0gIFtzdXBlciBzZXRVcF07Ci19Ci0KLS0gKHZvaWQpdGVzdE1lc3NhZ2VQZXJmb3JtYW5jZSB7Ci0gIFtzZWxmIG1lYXN1cmVCbG9jazpeewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyArK2kpIHsKLSAgICAgIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IFtbVGVzdEFsbFR5cGVzIGFsbG9jXSBpbml0XTsKLSAgICAgIFtzZWxmIHNldEFsbEZpZWxkczptZXNzYWdlIHJlcGVhdGVkQ291bnQ6a1JlcGVhdGVkQ291bnRdOwotICAgICAgTlNEYXRhKiByYXdCeXRlcyA9IFttZXNzYWdlIGRhdGFdOwotICAgICAgW21lc3NhZ2UgcmVsZWFzZV07Ci0gICAgICBtZXNzYWdlID0gW1tUZXN0QWxsVHlwZXMgYWxsb2NdIGluaXRXaXRoRGF0YTpyYXdCeXRlcyBlcnJvcjpOVUxMXTsKLSAgICAgIFttZXNzYWdlIHJlbGVhc2VdOwotICAgIH0KLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEV4dGVuc2lvbnNQZXJmb3JtYW5jZSB7Ci0gIFtzZWxmIG1lYXN1cmVCbG9jazpeewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMjAwOyArK2kpIHsKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlID0gW1tUZXN0QWxsRXh0ZW5zaW9ucyBhbGxvY10gaW5pdF07Ci0gICAgICBbc2VsZiBzZXRBbGxFeHRlbnNpb25zOm1lc3NhZ2UgcmVwZWF0ZWRDb3VudDprUmVwZWF0ZWRDb3VudF07Ci0gICAgICBOU0RhdGEqIHJhd0J5dGVzID0gW21lc3NhZ2UgZGF0YV07Ci0gICAgICBbbWVzc2FnZSByZWxlYXNlXTsKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMiA9Ci0gICAgICAgICAgW1tUZXN0QWxsRXh0ZW5zaW9ucyBhbGxvY10gaW5pdFdpdGhEYXRhOnJhd0J5dGVzIGVycm9yOk5VTExdOwotICAgICAgW21lc3NhZ2UyIHJlbGVhc2VdOwotICAgIH0KLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdFBhY2tlZFR5cGVzUGVyZm9ybWFuY2UgewotICBbc2VsZiBtZWFzdXJlQmxvY2s6XnsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7ICsraSkgewotICAgICAgVGVzdFBhY2tlZFR5cGVzKiBtZXNzYWdlID0gW1tUZXN0UGFja2VkVHlwZXMgYWxsb2NdIGluaXRdOwotICAgICAgW3NlbGYgc2V0UGFja2VkRmllbGRzOm1lc3NhZ2UgcmVwZWF0ZWRDb3VudDprUmVwZWF0ZWRDb3VudF07Ci0gICAgICBOU0RhdGEqIHJhd0J5dGVzID0gW21lc3NhZ2UgZGF0YV07Ci0gICAgICBbbWVzc2FnZSByZWxlYXNlXTsKLSAgICAgIG1lc3NhZ2UgPSBbW1Rlc3RQYWNrZWRUeXBlcyBhbGxvY10gaW5pdFdpdGhEYXRhOnJhd0J5dGVzIGVycm9yOk5VTExdOwotICAgICAgW21lc3NhZ2UgcmVsZWFzZV07Ci0gICAgfQotICB9XTsKLX0KLQotLSAodm9pZCl0ZXN0UGFja2VkRXh0ZW5zaW9uc1BlcmZvcm1hbmNlIHsKLSAgW3NlbGYgbWVhc3VyZUJsb2NrOl57Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDAwOyArK2kpIHsKLSAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlID0gW1tUZXN0UGFja2VkRXh0ZW5zaW9ucyBhbGxvY10gaW5pdF07Ci0gICAgICBbc2VsZiBzZXRQYWNrZWRFeHRlbnNpb25zOm1lc3NhZ2UgcmVwZWF0ZWRDb3VudDprUmVwZWF0ZWRDb3VudF07Ci0gICAgICBOU0RhdGEqIHJhd0J5dGVzID0gW21lc3NhZ2UgZGF0YV07Ci0gICAgICBbbWVzc2FnZSByZWxlYXNlXTsKLSAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlMiA9Ci0gICAgICAgICAgW1tUZXN0UGFja2VkRXh0ZW5zaW9ucyBhbGxvY10gaW5pdFdpdGhEYXRhOnJhd0J5dGVzIGVycm9yOk5VTExdOwotICAgICAgW21lc3NhZ2UyIHJlbGVhc2VdOwotICAgIH0KLSAgfV07Ci19Ci0KLS0gKHZvaWQpdGVzdEhhcyB7Ci0gIFRlc3RBbGxUeXBlcyogbWVzc2FnZSA9IFtzZWxmIGFsbFNldFJlcGVhdGVkQ291bnQ6MV07Ci0gIFtzZWxmIG1lYXN1cmVCbG9jazpeewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTAwMDA7ICsraSkgewotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxJbnQzMl07Ci0gICAgICBtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsSW50MzJdOwotCi0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEludDY0XTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxJbnQ2NCA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxJbnQ2NF07Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsVWludDMyXTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50MzIgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsVWludDMyXTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxVaW50NjRdOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbFVpbnQ2NCA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxVaW50NjRdOwotCi0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbFNpbnQzMl07Ci0gICAgICBtZXNzYWdlLmhhc09wdGlvbmFsU2ludDMyID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbFNpbnQzMl07Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsU2ludDY0XTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50NjQgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsU2ludDY0XTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxGaXhlZDMyXTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxGaXhlZDMyID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEZpeGVkMzJdOwotCi0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEZpeGVkNjRdOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkNjQgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsRml4ZWQ2NF07Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsU2ZpeGVkMzJdOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbFNmaXhlZDMyID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbFNmaXhlZDMyXTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxTZml4ZWQ2NF07Ci0gICAgICBtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkNjQgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsU2ZpeGVkNjRdOwotCi0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEZsb2F0XTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxGbG9hdCA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxGbG9hdF07Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsRG91YmxlXTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxEb3VibGUgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsRG91YmxlXTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxCb29sXTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxCb29sID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEJvb2xdOwotCi0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbFN0cmluZ107Ci0gICAgICBtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbFN0cmluZ107Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsQnl0ZXNdOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbEJ5dGVzID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEJ5dGVzXTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxHcm91cF07Ci0gICAgICBtZXNzYWdlLmhhc09wdGlvbmFsR3JvdXAgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsR3JvdXBdOwotCi0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2VdOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZV07Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2VdOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlXTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlXTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEltcG9ydE1lc3NhZ2VdOwotCi0gICAgICBbbWVzc2FnZS5vcHRpb25hbEdyb3VwIGhhc0FdOwotICAgICAgbWVzc2FnZS5vcHRpb25hbEdyb3VwLmhhc0EgPSBOTzsKLSAgICAgIFttZXNzYWdlLm9wdGlvbmFsR3JvdXAgaGFzQV07Ci0KLSAgICAgIFttZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSBoYXNCYl07Ci0gICAgICBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZS5oYXNCYiA9IE5POwotICAgICAgW21lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlIGhhc0JiXTsKLQotICAgICAgW21lc3NhZ2Uub3B0aW9uYWxGb3JlaWduTWVzc2FnZSBoYXNDXTsKLSAgICAgIG1lc3NhZ2Uub3B0aW9uYWxGb3JlaWduTWVzc2FnZS5oYXNDID0gTk87Ci0gICAgICBbbWVzc2FnZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlIGhhc0NdOwotCi0gICAgICBbbWVzc2FnZS5vcHRpb25hbEltcG9ydE1lc3NhZ2UgaGFzRF07Ci0gICAgICBtZXNzYWdlLm9wdGlvbmFsSW1wb3J0TWVzc2FnZS5oYXNEID0gTk87Ci0gICAgICBbbWVzc2FnZS5vcHRpb25hbEltcG9ydE1lc3NhZ2UgaGFzRF07Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsTmVzdGVkRW51bV07Ci0gICAgICBtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkRW51bSA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxOZXN0ZWRFbnVtXTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxGb3JlaWduRW51bV07Ci0gICAgICBtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbkVudW0gPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsRm9yZWlnbkVudW1dOwotCi0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbEltcG9ydEVudW1dOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydEVudW0gPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsSW1wb3J0RW51bV07Ci0KLSAgICAgIFttZXNzYWdlIGhhc09wdGlvbmFsU3RyaW5nUGllY2VdOwotICAgICAgbWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZ1BpZWNlID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbFN0cmluZ1BpZWNlXTsKLQotICAgICAgW21lc3NhZ2UgaGFzT3B0aW9uYWxDb3JkXTsKLSAgICAgIG1lc3NhZ2UuaGFzT3B0aW9uYWxDb3JkID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNPcHRpb25hbENvcmRdOwotCi0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0SW50MzJdOwotICAgICAgbWVzc2FnZS5oYXNEZWZhdWx0SW50MzIgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRJbnQzMl07Ci0KLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRJbnQ2NF07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHRJbnQ2NCA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdEludDY0XTsKLQotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdFVpbnQzMl07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHRVaW50MzIgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRVaW50MzJdOwotCi0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0VWludDY0XTsKLSAgICAgIG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQ2NCA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdFVpbnQ2NF07Ci0KLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRTaW50MzJdOwotICAgICAgbWVzc2FnZS5oYXNEZWZhdWx0U2ludDMyID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0U2ludDMyXTsKLQotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdFNpbnQ2NF07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHRTaW50NjQgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRTaW50NjRdOwotCi0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0Rml4ZWQzMl07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDMyID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0Rml4ZWQzMl07Ci0KLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRGaXhlZDY0XTsKLSAgICAgIG1lc3NhZ2UuaGFzRGVmYXVsdEZpeGVkNjQgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRGaXhlZDY0XTsKLQotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdFNmaXhlZDMyXTsKLSAgICAgIG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDMyID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0U2ZpeGVkMzJdOwotCi0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0U2ZpeGVkNjRdOwotICAgICAgbWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkNjQgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRTZml4ZWQ2NF07Ci0KLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRGbG9hdF07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHRGbG9hdCA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdEZsb2F0XTsKLQotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdERvdWJsZV07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHREb3VibGUgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHREb3VibGVdOwotCi0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0Qm9vbF07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHRCb29sID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0Qm9vbF07Ci0KLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRTdHJpbmddOwotICAgICAgbWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0U3RyaW5nXTsKLQotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdEJ5dGVzXTsKLSAgICAgIG1lc3NhZ2UuaGFzRGVmYXVsdEJ5dGVzID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0Qnl0ZXNdOwotCi0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0TmVzdGVkRW51bV07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHROZXN0ZWRFbnVtID0gTk87Ci0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0TmVzdGVkRW51bV07Ci0KLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRGb3JlaWduRW51bV07Ci0gICAgICBtZXNzYWdlLmhhc0RlZmF1bHRGb3JlaWduRW51bSA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdEZvcmVpZ25FbnVtXTsKLQotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdEltcG9ydEVudW1dOwotICAgICAgbWVzc2FnZS5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IE5POwotICAgICAgW21lc3NhZ2UgaGFzRGVmYXVsdEltcG9ydEVudW1dOwotCi0gICAgICBbbWVzc2FnZSBoYXNEZWZhdWx0U3RyaW5nUGllY2VdOwotICAgICAgbWVzc2FnZS5oYXNEZWZhdWx0U3RyaW5nUGllY2UgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRTdHJpbmdQaWVjZV07Ci0KLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRDb3JkXTsKLSAgICAgIG1lc3NhZ2UuaGFzRGVmYXVsdENvcmQgPSBOTzsKLSAgICAgIFttZXNzYWdlIGhhc0RlZmF1bHRDb3JkXTsKLSAgICB9Ci0gIH1dOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQlN3aWZ0VGVzdHMuc3dpZnQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQlN3aWZ0VGVzdHMuc3dpZnQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZWQyYTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJTd2lmdFRlc3RzLnN3aWZ0CisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1pbXBvcnQgRm91bmRhdGlvbgotaW1wb3J0IFhDVGVzdAotCi0vLyBUZXN0IHNvbWUgdXNhZ2Ugb2YgdGhlIE9iakMgbGlicmFyeSBmcm9tIFN3aWZ0LgotCi1jbGFzcyBHUEJCcmlkZ2VUZXN0czogWENUZXN0Q2FzZSB7Ci0KLSAgZnVuYyB0ZXN0UHJvdG8yQmFzaWNzKCkgewotICAgIGxldCBtc2cgPSBNZXNzYWdlMigpCi0gICAgbGV0IG1zZzIgPSBNZXNzYWdlMigpCi0gICAgbGV0IG1zZzMgPSBNZXNzYWdlMl9PcHRpb25hbEdyb3VwKCkKLQotICAgIG1zZy5vcHRpb25hbEludDMyID0gMTAwCi0gICAgbXNnLm9wdGlvbmFsU3RyaW5nID0gImFiYyIKLSAgICBtc2cub3B0aW9uYWxFbnVtID0gLkJhcgotICAgIG1zZzIub3B0aW9uYWxTdHJpbmcgPSAib3RoZXIiCi0gICAgbXNnLm9wdGlvbmFsTWVzc2FnZSA9IG1zZzIKLSAgICBtc2czLmEgPSAyMDAKLSAgICBtc2cub3B0aW9uYWxHcm91cCA9IG1zZzMKLSAgICBtc2cucmVwZWF0ZWRJbnQzMkFycmF5LmFkZFZhbHVlKDMwMCkKLSAgICBtc2cucmVwZWF0ZWRJbnQzMkFycmF5LmFkZFZhbHVlKDMwMSkKLSAgICBtc2cucmVwZWF0ZWRTdHJpbmdBcnJheS5hZGRPYmplY3QoIm1ubyIpCi0gICAgbXNnLnJlcGVhdGVkU3RyaW5nQXJyYXkuYWRkT2JqZWN0KCJwcXIiKQotICAgIG1zZy5yZXBlYXRlZEVudW1BcnJheS5hZGRWYWx1ZShNZXNzYWdlMl9FbnVtLkJhci5yYXdWYWx1ZSkKLSAgICBtc2cucmVwZWF0ZWRFbnVtQXJyYXkuYWRkVmFsdWUoTWVzc2FnZTJfRW51bS5CYXoucmF3VmFsdWUpCi0gICAgbXNnLm1hcEludDMySW50MzIuc2V0VmFsdWUoNDAwLCBmb3JLZXk6NTAwKQotICAgIG1zZy5tYXBJbnQzMkludDMyLnNldFZhbHVlKDQwMSwgZm9yS2V5OjUwMSkKLSAgICBtc2cubWFwU3RyaW5nU3RyaW5nLnNldE9iamVjdCgiZm9vIiwgZm9yS2V5OiJiYXIiKQotICAgIG1zZy5tYXBTdHJpbmdTdHJpbmcuc2V0T2JqZWN0KCJhYmMiLCBmb3JLZXk6Inh5eiIpCi0gICAgbXNnLm1hcEludDMyRW51bS5zZXRWYWx1ZShNZXNzYWdlMl9FbnVtLkJhci5yYXdWYWx1ZSwgZm9yS2V5OjYwMCkKLSAgICBtc2cubWFwSW50MzJFbnVtLnNldFZhbHVlKE1lc3NhZ2UyX0VudW0uQmF6LnJhd1ZhbHVlLCBmb3JLZXk6NjAxKQotCi0gICAgLy8gQ2hlY2sgaGFzKi4KLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEludDMyKQotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsU3RyaW5nKQotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsRW51bSkKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZzIuaGFzT3B0aW9uYWxTdHJpbmcpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxNZXNzYWdlKQotICAgIFhDVEFzc2VydFRydWUobXNnMy5oYXNBKQotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsR3JvdXApCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsSW50NjQpCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsRmxvYXQpCi0KLSAgICAvLyBDaGVjayB2YWx1ZXMuCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsSW50MzIsIEludDMyKDEwMCkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsU3RyaW5nLCAiYWJjIikKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cyLm9wdGlvbmFsU3RyaW5nLCAib3RoZXIiKQotICAgIFhDVEFzc2VydFRydWUobXNnLm9wdGlvbmFsTWVzc2FnZSA9PT0gbXNnMikKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxFbnVtLCBNZXNzYWdlMl9FbnVtLkJhcikKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2czLmEsIEludDMyKDIwMCkpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxHcm91cCA9PT0gbXNnMykKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRJbnQzMkFycmF5LmNvdW50LCBVSW50KDIpKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZEludDMyQXJyYXkudmFsdWVBdEluZGV4KDApLCBJbnQzMigzMDApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZEludDMyQXJyYXkudmFsdWVBdEluZGV4KDEpLCBJbnQzMigzMDEpKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZFN0cmluZ0FycmF5LmNvdW50LCBJbnQoMikpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkU3RyaW5nQXJyYXkub2JqZWN0QXRJbmRleCgwKSBhcz8gU3RyaW5nLCAibW5vIikKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRTdHJpbmdBcnJheS5vYmplY3RBdEluZGV4KDEpIGFzPyBTdHJpbmcsICJwcXIiKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZEVudW1BcnJheS5jb3VudCwgVUludCgyKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRFbnVtQXJyYXkudmFsdWVBdEluZGV4KDApLCBNZXNzYWdlMl9FbnVtLkJhci5yYXdWYWx1ZSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRFbnVtQXJyYXkudmFsdWVBdEluZGV4KDEpLCBNZXNzYWdlMl9FbnVtLkJhei5yYXdWYWx1ZSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRJbnQ2NEFycmF5LmNvdW50LCBVSW50KDApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBJbnQzMkludDMyLmNvdW50LCBVSW50KDIpKQotICAgIHZhciBpbnRWYWx1ZTogSW50MzIgPSAwOwotICAgIFhDVEFzc2VydFRydWUobXNnLm1hcEludDMySW50MzIudmFsdWVGb3JLZXkoNTAwLCB2YWx1ZTomaW50VmFsdWUpKQotICAgIFhDVEFzc2VydEVxdWFsKGludFZhbHVlLCBJbnQzMig0MDApKQotICAgIFhDVEFzc2VydFRydWUobXNnLm1hcEludDMySW50MzIudmFsdWVGb3JLZXkoNTAxLCB2YWx1ZTomaW50VmFsdWUpKQotICAgIFhDVEFzc2VydEVxdWFsKGludFZhbHVlLCBJbnQzMig0MDEpKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBTdHJpbmdTdHJpbmcuY291bnQsIEludCgyKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwU3RyaW5nU3RyaW5nLm9iamVjdEZvcktleSgiYmFyIikgYXM/IFN0cmluZywgImZvbyIpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcFN0cmluZ1N0cmluZy5vYmplY3RGb3JLZXkoInh5eiIpIGFzPyBTdHJpbmcsICJhYmMiKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBJbnQzMkVudW0uY291bnQsIFVJbnQoMikpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cubWFwSW50MzJFbnVtLnZhbHVlRm9yS2V5KDYwMCwgdmFsdWU6JmludFZhbHVlKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChpbnRWYWx1ZSwgTWVzc2FnZTJfRW51bS5CYXIucmF3VmFsdWUpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cubWFwSW50MzJFbnVtLnZhbHVlRm9yS2V5KDYwMSwgdmFsdWU6JmludFZhbHVlKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChpbnRWYWx1ZSwgTWVzc2FnZTJfRW51bS5CYXoucmF3VmFsdWUpCi0KLSAgICAvLyBDbGVhcmluZyBhIHN0cmluZyB3aXRoIG5pbC4KLSAgICBtc2cyLm9wdGlvbmFsU3RyaW5nID0gbmlsCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnMi5oYXNPcHRpb25hbFN0cmluZykKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cyLm9wdGlvbmFsU3RyaW5nLCAiIikKLQotICAgIC8vIENsZWFyaW5nIGEgbWVzc2FnZSB3aXRoIG5pbC4KLSAgICBtc2cub3B0aW9uYWxHcm91cCA9IG5pbAotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEdyb3VwKQotICAgIFhDVEFzc2VydFRydWUobXNnLm9wdGlvbmFsR3JvdXAgIT09IG1zZzMpICAvLyBOZXcgaW5zdGFuY2UKLQotICAgIC8vIENsZWFyLgotICAgIG1zZy5jbGVhcigpCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsSW50MzIpCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsU3RyaW5nKQotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEVudW0pCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsTWVzc2FnZSkKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxJbnQ2NCkKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxGbG9hdCkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxJbnQzMiwgSW50MzIoMCkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsU3RyaW5nLCAiIikKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5vcHRpb25hbE1lc3NhZ2UgIT09IG1zZzIpICAvLyBOZXcgaW5zdGFuY2UKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxFbnVtLCBNZXNzYWdlMl9FbnVtLkZvbykgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRJbnQzMkFycmF5LmNvdW50LCBVSW50KDApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZFN0cmluZ0FycmF5LmNvdW50LCBJbnQoMCkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkRW51bUFycmF5LmNvdW50LCBVSW50KDApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBJbnQzMkludDMyLmNvdW50LCBVSW50KDApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBTdHJpbmdTdHJpbmcuY291bnQsIEludCgwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwSW50MzJFbnVtLmNvdW50LCBVSW50KDApKQotICB9Ci0KLSAgZnVuYyB0ZXN0UHJvdG8zQmFzaWNzKCkgewotICAgIGxldCBtc2cgPSBNZXNzYWdlMygpCi0gICAgbGV0IG1zZzIgPSBNZXNzYWdlMygpCi0KLSAgICBtc2cub3B0aW9uYWxJbnQzMiA9IDEwMAotICAgIG1zZy5vcHRpb25hbFN0cmluZyA9ICJhYmMiCi0gICAgbXNnLm9wdGlvbmFsRW51bSA9IC5CYXIKLSAgICBtc2cyLm9wdGlvbmFsU3RyaW5nID0gIm90aGVyIgotICAgIG1zZy5vcHRpb25hbE1lc3NhZ2UgPSBtc2cyCi0gICAgbXNnLnJlcGVhdGVkSW50MzJBcnJheS5hZGRWYWx1ZSgzMDApCi0gICAgbXNnLnJlcGVhdGVkSW50MzJBcnJheS5hZGRWYWx1ZSgzMDEpCi0gICAgbXNnLnJlcGVhdGVkU3RyaW5nQXJyYXkuYWRkT2JqZWN0KCJtbm8iKQotICAgIG1zZy5yZXBlYXRlZFN0cmluZ0FycmF5LmFkZE9iamVjdCgicHFyIikKLSAgICAvLyAicHJvdG8zIiBzeW50YXggbGV0cyBlbnVtIGdldCB1bmtub3duIHZhbHVlcy4KLSAgICBtc2cucmVwZWF0ZWRFbnVtQXJyYXkuYWRkVmFsdWUoTWVzc2FnZTNfRW51bS5CYXIucmF3VmFsdWUpCi0gICAgbXNnLnJlcGVhdGVkRW51bUFycmF5LmFkZFJhd1ZhbHVlKDY2NikKLSAgICBTZXRNZXNzYWdlM19PcHRpb25hbEVudW1fUmF3VmFsdWUobXNnMiwgNjY2KQotICAgIG1zZy5tYXBJbnQzMkludDMyLnNldFZhbHVlKDQwMCwgZm9yS2V5OjUwMCkKLSAgICBtc2cubWFwSW50MzJJbnQzMi5zZXRWYWx1ZSg0MDEsIGZvcktleTo1MDEpCi0gICAgbXNnLm1hcFN0cmluZ1N0cmluZy5zZXRPYmplY3QoImZvbyIsIGZvcktleToiYmFyIikKLSAgICBtc2cubWFwU3RyaW5nU3RyaW5nLnNldE9iamVjdCgiYWJjIiwgZm9yS2V5OiJ4eXoiKQotICAgIG1zZy5tYXBJbnQzMkVudW0uc2V0VmFsdWUoTWVzc2FnZTJfRW51bS5CYXIucmF3VmFsdWUsIGZvcktleTo2MDApCi0gICAgLy8gInByb3RvMyIgc3ludGF4IGxldHMgZW51bSBnZXQgdW5rbm93biB2YWx1ZXMuCi0gICAgbXNnLm1hcEludDMyRW51bS5zZXRSYXdWYWx1ZSg2NjYsIGZvcktleTo2MDEpCi0KLSAgICAvLyBIYXMgb25seSBleGlzdHMgb24gZm9yIG1lc3NhZ2UgZmllbGRzLgotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsTWVzc2FnZSkKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cyLmhhc09wdGlvbmFsTWVzc2FnZSkKLQotICAgIC8vIENoZWNrIHZhbHVlcy4KLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxJbnQzMiwgSW50MzIoMTAwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxTdHJpbmcsICJhYmMiKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZzIub3B0aW9uYWxTdHJpbmcsICJvdGhlciIpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxNZXNzYWdlID09PSBtc2cyKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vcHRpb25hbEVudW0sIE1lc3NhZ2UzX0VudW0uQmFyKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZEludDMyQXJyYXkuY291bnQsIFVJbnQoMikpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkSW50MzJBcnJheS52YWx1ZUF0SW5kZXgoMCksIEludDMyKDMwMCkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkSW50MzJBcnJheS52YWx1ZUF0SW5kZXgoMSksIEludDMyKDMwMSkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkU3RyaW5nQXJyYXkuY291bnQsIEludCgyKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRTdHJpbmdBcnJheS5vYmplY3RBdEluZGV4KDApIGFzPyBTdHJpbmcsICJtbm8iKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZFN0cmluZ0FycmF5Lm9iamVjdEF0SW5kZXgoMSkgYXM/IFN0cmluZywgInBxciIpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkSW50NjRBcnJheS5jb3VudCwgVUludCgwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRFbnVtQXJyYXkuY291bnQsIFVJbnQoMikpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkRW51bUFycmF5LnZhbHVlQXRJbmRleCgwKSwgTWVzc2FnZTNfRW51bS5CYXIucmF3VmFsdWUpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkRW51bUFycmF5LnZhbHVlQXRJbmRleCgxKSwgTWVzc2FnZTNfRW51bS5HUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUucmF3VmFsdWUpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkRW51bUFycmF5LnJhd1ZhbHVlQXRJbmRleCgxKSwgNjY2KQotICAgIFhDVEFzc2VydEVxdWFsKG1zZzIub3B0aW9uYWxFbnVtLCBNZXNzYWdlM19FbnVtLkdQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSkKLSAgICBYQ1RBc3NlcnRFcXVhbChNZXNzYWdlM19PcHRpb25hbEVudW1fUmF3VmFsdWUobXNnMiksIEludDMyKDY2NikpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcEludDMySW50MzIuY291bnQsIFVJbnQoMikpCi0gICAgdmFyIGludFZhbHVlOiBJbnQzMiA9IDA7Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cubWFwSW50MzJJbnQzMi52YWx1ZUZvcktleSg1MDAsIHZhbHVlOiZpbnRWYWx1ZSkpCi0gICAgWENUQXNzZXJ0RXF1YWwoaW50VmFsdWUsIEludDMyKDQwMCkpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cubWFwSW50MzJJbnQzMi52YWx1ZUZvcktleSg1MDEsIHZhbHVlOiZpbnRWYWx1ZSkpCi0gICAgWENUQXNzZXJ0RXF1YWwoaW50VmFsdWUsIEludDMyKDQwMSkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcFN0cmluZ1N0cmluZy5jb3VudCwgSW50KDIpKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5tYXBTdHJpbmdTdHJpbmcub2JqZWN0Rm9yS2V5KCJiYXIiKSBhcz8gU3RyaW5nLCAiZm9vIikKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwU3RyaW5nU3RyaW5nLm9iamVjdEZvcktleSgieHl6IikgYXM/IFN0cmluZywgImFiYyIpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcEludDMyRW51bS5jb3VudCwgVUludCgyKSkKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5tYXBJbnQzMkVudW0udmFsdWVGb3JLZXkoNjAwLCB2YWx1ZTomaW50VmFsdWUpKQotICAgIFhDVEFzc2VydEVxdWFsKGludFZhbHVlLCBNZXNzYWdlMl9FbnVtLkJhci5yYXdWYWx1ZSkKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5tYXBJbnQzMkVudW0udmFsdWVGb3JLZXkoNjAxLCB2YWx1ZTomaW50VmFsdWUpKQotICAgIFhDVEFzc2VydEVxdWFsKGludFZhbHVlLCBNZXNzYWdlM19FbnVtLkdQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZS5yYXdWYWx1ZSkKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5tYXBJbnQzMkVudW0udmFsdWVGb3JLZXkoNjAxLCByYXdWYWx1ZTomaW50VmFsdWUpKQotICAgIFhDVEFzc2VydEVxdWFsKGludFZhbHVlLCA2NjYpCi0KLSAgICAvLyBDbGVhcmluZyBhIHN0cmluZyB3aXRoIG5pbC4KLSAgICBtc2cyLm9wdGlvbmFsU3RyaW5nID0gbmlsCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnMi5vcHRpb25hbFN0cmluZywgIiIpCi0KLSAgICAvLyBDbGVhcmluZyBhIG1lc3NhZ2Ugd2l0aCBuaWwuCi0gICAgbXNnLm9wdGlvbmFsTWVzc2FnZSA9IG5pbAotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbE1lc3NhZ2UpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxNZXNzYWdlICE9PSBtc2cyKSAgLy8gTmV3IGluc3RhbmNlCi0KLSAgICAvLyBDbGVhci4KLSAgICBtc2cuY2xlYXIoKQotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbE1lc3NhZ2UpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsSW50MzIsIEludDMyKDApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vcHRpb25hbFN0cmluZywgIiIpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cub3B0aW9uYWxNZXNzYWdlICE9PSBtc2cyKSAgLy8gTmV3IGluc3RhbmNlCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsRW51bSwgTWVzc2FnZTNfRW51bS5Gb28pICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLnJlcGVhdGVkSW50MzJBcnJheS5jb3VudCwgVUludCgwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cucmVwZWF0ZWRTdHJpbmdBcnJheS5jb3VudCwgSW50KDApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZEVudW1BcnJheS5jb3VudCwgVUludCgwKSkKLSAgICBtc2cyLmNsZWFyKCkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cyLm9wdGlvbmFsRW51bSwgTWVzc2FnZTNfRW51bS5Gb28pICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwoTWVzc2FnZTNfT3B0aW9uYWxFbnVtX1Jhd1ZhbHVlKG1zZzIpLCBNZXNzYWdlM19FbnVtLkZvby5yYXdWYWx1ZSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwSW50MzJJbnQzMi5jb3VudCwgVUludCgwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cubWFwU3RyaW5nU3RyaW5nLmNvdW50LCBJbnQoMCkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcEludDMyRW51bS5jb3VudCwgVUludCgwKSkKLSAgfQotCi0gIGZ1bmMgdGVzdEF1dG9DcmVhdGlvbigpIHsKLSAgICBsZXQgbXNnID0gTWVzc2FnZTIoKQotCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsR3JvdXApCi0gICAgWENUQXNzZXJ0RmFsc2UobXNnLmhhc09wdGlvbmFsTWVzc2FnZSkKLQotICAgIC8vIEFjY2VzcyBzaG91bGRuJ3QgcmVzdWx0IGluIGhhcyogYnV0IHNob3VsZCByZXR1cm4gb2JqZWN0cy4KLSAgICBsZXQgbXNnMiA9IG1zZy5vcHRpb25hbEdyb3VwCi0gICAgbGV0IG1zZzMgPSBtc2cub3B0aW9uYWxNZXNzYWdlLm9wdGlvbmFsTWVzc2FnZQotICAgIGxldCBtc2c0ID0gbXNnLm9wdGlvbmFsTWVzc2FnZQotICAgIFhDVEFzc2VydE5vdE5pbChtc2cyKQotICAgIFhDVEFzc2VydE5vdE5pbChtc2czKQotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbEdyb3VwKQotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5vcHRpb25hbE1lc3NhZ2UuaGFzT3B0aW9uYWxNZXNzYWdlKQotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbE1lc3NhZ2UpCi0KLSAgICAvLyBTZXR0aW5nIHRoaW5ncyBzaG91bGQgdHJpZ2dlciBoYXMqIGdldHRpbmcgc2V0LgotICAgIG1zZy5vcHRpb25hbEdyb3VwLmEgPSAxMAotICAgIG1zZy5vcHRpb25hbE1lc3NhZ2Uub3B0aW9uYWxNZXNzYWdlLm9wdGlvbmFsSW50MzIgPSAxMDAKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEdyb3VwKQotICAgIFhDVEFzc2VydFRydWUobXNnLm9wdGlvbmFsTWVzc2FnZS5oYXNPcHRpb25hbE1lc3NhZ2UpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxNZXNzYWdlKQotCi0gICAgLy8gQW5kIHRoZXkgc2hvdWxkIGJlIHRoZSBzYW1lIHBvaW50ZXIgYXMgYmVmb3JlLgotICAgIFhDVEFzc2VydFRydWUobXNnMiA9PT0gbXNnLm9wdGlvbmFsR3JvdXApCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2czID09PSBtc2cub3B0aW9uYWxNZXNzYWdlLm9wdGlvbmFsTWVzc2FnZSkKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZzQgPT09IG1zZy5vcHRpb25hbE1lc3NhZ2UpCi0KLSAgICAvLyBDbGVhciBnZXRzIHVzIG5ldyBvYmplY3RzIG5leHQgdGltZSBhcm91bmQuCi0gICAgbXNnLmNsZWFyKCkKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxHcm91cCkKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cub3B0aW9uYWxNZXNzYWdlLmhhc09wdGlvbmFsTWVzc2FnZSkKLSAgICBYQ1RBc3NlcnRGYWxzZShtc2cuaGFzT3B0aW9uYWxNZXNzYWdlKQotICAgIG1zZy5vcHRpb25hbEdyb3VwLmEgPSAyMAotICAgIG1zZy5vcHRpb25hbE1lc3NhZ2Uub3B0aW9uYWxNZXNzYWdlLm9wdGlvbmFsSW50MzIgPSAyMDAKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbEdyb3VwKQotICAgIFhDVEFzc2VydFRydWUobXNnLm9wdGlvbmFsTWVzc2FnZS5oYXNPcHRpb25hbE1lc3NhZ2UpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cuaGFzT3B0aW9uYWxNZXNzYWdlKQotICAgIFhDVEFzc2VydFRydWUobXNnMiAhPT0gbXNnLm9wdGlvbmFsR3JvdXApCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2czICE9PSBtc2cub3B0aW9uYWxNZXNzYWdlLm9wdGlvbmFsTWVzc2FnZSkKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZzQgIT09IG1zZy5vcHRpb25hbE1lc3NhZ2UpCi0KLSAgICAvLyBFeHBsaWNpdCBzZXQgb2YgYSBtZXNzYWdlLCBtZWFucyBhdXRvY3JlYXRlZCBvYmplY3QgZG9lc24ndCBiaW5kLgotICAgIG1zZy5jbGVhcigpCi0gICAgbGV0IGF1dG9DcmVhdGVkID0gbXNnLm9wdGlvbmFsTWVzc2FnZQotICAgIFhDVEFzc2VydEZhbHNlKG1zZy5oYXNPcHRpb25hbE1lc3NhZ2UpCi0gICAgbGV0IG1zZzUgPSBNZXNzYWdlMigpCi0gICAgbXNnNS5vcHRpb25hbEludDMyID0gMTIzCi0gICAgbXNnLm9wdGlvbmFsTWVzc2FnZSA9IG1zZzUKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5oYXNPcHRpb25hbE1lc3NhZ2UpCi0gICAgLy8gTW9kaWZpbmcgdGhlIGF1dG9jcmVhdGVkIGRvZXNuJ3QgcmVwbGFjZWQgdGhlIGV4cGxpY2l0IHNldCBvbmUuCi0gICAgYXV0b0NyZWF0ZWQub3B0aW9uYWxJbnQzMiA9IDQ1NgotICAgIFhDVEFzc2VydFRydWUobXNnLmhhc09wdGlvbmFsTWVzc2FnZSkKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5vcHRpb25hbE1lc3NhZ2UgPT09IG1zZzUpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9wdGlvbmFsTWVzc2FnZS5vcHRpb25hbEludDMyLCBJbnQzMigxMjMpKQotICB9Ci0KLSAgZnVuYyB0ZXN0UHJvdG8yT25lT2ZTdXBwb3J0KCkgewotICAgIGxldCBtc2cgPSBNZXNzYWdlMigpCi0KLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2UuR1BCVW5zZXRPbmVPZkNhc2UpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIEludDMyKDEwMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIEZsb2F0KDExMC4wKSkgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtLkJheikgIC8vIERlZmF1bHQKLSAgICBsZXQgYXV0b0NyZWF0ZWQgPSBtc2cub25lb2ZNZXNzYWdlICAvLyBEZWZhdWx0IGNyZWF0ZSBvbmUuCi0gICAgWENUQXNzZXJ0Tm90TmlsKGF1dG9DcmVhdGVkKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZS5HUEJVbnNldE9uZU9mQ2FzZSkKLQotICAgIG1zZy5vbmVvZkludDMyID0gMTAKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgSW50MzIoMTApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCBGbG9hdCgxMTAuMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bS5CYXopICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cub25lb2ZNZXNzYWdlID09PSBhdXRvQ3JlYXRlZCkgIC8vIFN0aWxsIHRoZSBzYW1lCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlLk9uZW9mSW50MzIpCi0KLSAgICBtc2cub25lb2ZGbG9hdCA9IDIwLjAKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgSW50MzIoMTAwKSkgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgRmxvYXQoMjAuMCkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bS5CYXopICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0VHJ1ZShtc2cub25lb2ZNZXNzYWdlID09PSBhdXRvQ3JlYXRlZCkgIC8vIFN0aWxsIHRoZSBzYW1lCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlLk9uZW9mRmxvYXQpCi0KLSAgICBtc2cub25lb2ZFbnVtID0gLkJhcgotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCBJbnQzMigxMDApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCBGbG9hdCgxMTAuMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRW51bSwgTWVzc2FnZTJfRW51bS5CYXIpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cub25lb2ZNZXNzYWdlID09PSBhdXRvQ3JlYXRlZCkgIC8vIFN0aWxsIHRoZSBzYW1lCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlLk9uZW9mRW51bSkKLQotICAgIC8vIFNldHMgdmlhIHRoZSBhdXRvY3JlYXRlZCBpbnN0YW5jZS4KLSAgICBtc2cub25lb2ZNZXNzYWdlLm9wdGlvbmFsSW50MzIgPSAyMDAKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgSW50MzIoMTAwKSkgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgRmxvYXQoMTEwLjApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UyX0VudW0uQmF6KSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydFRydWUobXNnLm9uZW9mTWVzc2FnZSA9PT0gYXV0b0NyZWF0ZWQpICAvLyBTdGlsbCB0aGUgc2FtZQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgSW50MzIoMjAwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2UuT25lb2ZNZXNzYWdlKQotCi0gICAgLy8gQ2xlYXIgdGhlIG9uZW9mLgotICAgIE1lc3NhZ2UyX0NsZWFyT09uZU9mQ2FzZShtc2cpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIEludDMyKDEwMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mRmxvYXQsIEZsb2F0KDExMC4wKSkgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlMl9FbnVtLkJheikgIC8vIERlZmF1bHQKLSAgICBsZXQgYXV0b0NyZWF0ZWQyID0gbXNnLm9uZW9mTWVzc2FnZSAgLy8gRGVmYXVsdCBjcmVhdGUgb25lCi0gICAgWENUQXNzZXJ0Tm90TmlsKGF1dG9DcmVhdGVkMikKLSAgICBYQ1RBc3NlcnRUcnVlKGF1dG9DcmVhdGVkMiAhPT0gYXV0b0NyZWF0ZWQpICAvLyBOZXcgaW5zdGFuY2UKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZNZXNzYWdlLm9wdGlvbmFsSW50MzIsIEludDMyKDApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZS5HUEJVbnNldE9uZU9mQ2FzZSkKLQotICAgIG1zZy5vbmVvZkludDMyID0gMTAKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgSW50MzIoMTApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlMl9PX09uZU9mQ2FzZS5PbmVvZkludDMyKQotCi0gICAgLy8gQ29uZmlybSBNZXNzYWdlLmNsZWFyKCkgaGFuZGxlcyB0aGUgb25lb2YgY29ycmVjdGx5LgotICAgIG1zZy5jbGVhcigpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIEludDMyKDEwMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlLkdQQlVuc2V0T25lT2ZDYXNlKQotCi0gICAgLy8gU2V0cyB2aWEgdGhlIGF1dG9jcmVhdGVkIGluc3RhbmNlLgotICAgIG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiA9IDMwMAotICAgIFhDVEFzc2VydFRydWUobXNnLm9uZW9mTWVzc2FnZSAhPT0gYXV0b0NyZWF0ZWQpICAvLyBOZXcgaW5zdGFuY2UKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5vbmVvZk1lc3NhZ2UgIT09IGF1dG9DcmVhdGVkMikgIC8vIE5ldyBpbnN0YW5jZQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgSW50MzIoMzAwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTJfT19PbmVPZkNhc2UuT25lb2ZNZXNzYWdlKQotCi0gICAgLy8gU2V0IG1lc3NhZ2UgdG8gbmlsIGNsZWFycyB0aGUgb25lb2YuCi0gICAgbXNnLm9uZW9mTWVzc2FnZSA9IG5pbAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgSW50MzIoMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UyX09fT25lT2ZDYXNlLkdQQlVuc2V0T25lT2ZDYXNlKQotfQotCi0gIGZ1bmMgdGVzdFByb3RvM09uZU9mU3VwcG9ydCgpIHsKLSAgICBsZXQgbXNnID0gTWVzc2FnZTMoKQotCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlLkdQQlVuc2V0T25lT2ZDYXNlKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCBJbnQzMigwKSkgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZGbG9hdCwgRmxvYXQoMC4wKSkgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtLkZvbykgIC8vIERlZmF1bHQKLSAgICBsZXQgYXV0b0NyZWF0ZWQgPSBtc2cub25lb2ZNZXNzYWdlICAvLyBEZWZhdWx0IGNyZWF0ZSBvbmUuCi0gICAgWENUQXNzZXJ0Tm90TmlsKGF1dG9DcmVhdGVkKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZS5HUEJVbnNldE9uZU9mQ2FzZSkKLQotICAgIG1zZy5vbmVvZkludDMyID0gMTAKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgSW50MzIoMTApKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCBGbG9hdCgwLjApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW0uRm9vKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydFRydWUobXNnLm9uZW9mTWVzc2FnZSA9PT0gYXV0b0NyZWF0ZWQpICAvLyBTdGlsbCB0aGUgc2FtZQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZS5PbmVvZkludDMyKQotCi0gICAgbXNnLm9uZW9mRmxvYXQgPSAyMC4wCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIEludDMyKDApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCBGbG9hdCgyMC4wKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZFbnVtLCBNZXNzYWdlM19FbnVtLkZvbykgIC8vIERlZmF1bHQKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5vbmVvZk1lc3NhZ2UgPT09IGF1dG9DcmVhdGVkKSAgLy8gU3RpbGwgdGhlIHNhbWUKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2UuT25lb2ZGbG9hdCkKLQotICAgIG1zZy5vbmVvZkVudW0gPSAuQmFyCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIEludDMyKDApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCBGbG9hdCgwLjApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW0uQmFyKQotICAgIFhDVEFzc2VydFRydWUobXNnLm9uZW9mTWVzc2FnZSA9PT0gYXV0b0NyZWF0ZWQpICAvLyBTdGlsbCB0aGUgc2FtZQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vT25lT2ZDYXNlLCBNZXNzYWdlM19PX09uZU9mQ2FzZS5PbmVvZkVudW0pCi0KLSAgICAvLyBTZXRzIHZpYSB0aGUgYXV0b2NyZWF0ZWQgaW5zdGFuY2UuCi0gICAgbXNnLm9uZW9mTWVzc2FnZS5vcHRpb25hbEludDMyID0gMjAwCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIEludDMyKDApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCBGbG9hdCgwLjApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW0uRm9vKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydFRydWUobXNnLm9uZW9mTWVzc2FnZSA9PT0gYXV0b0NyZWF0ZWQpICAvLyBTdGlsbCB0aGUgc2FtZQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgSW50MzIoMjAwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2UuT25lb2ZNZXNzYWdlKQotCi0gICAgLy8gQ2xlYXIgdGhlIG9uZW9mLgotICAgIE1lc3NhZ2UzX0NsZWFyT09uZU9mQ2FzZShtc2cpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9uZW9mSW50MzIsIEludDMyKDApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkZsb2F0LCBGbG9hdCgwLjApKSAgLy8gRGVmYXVsdAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkVudW0sIE1lc3NhZ2UzX0VudW0uRm9vKSAgLy8gRGVmYXVsdAotICAgIGxldCBhdXRvQ3JlYXRlZDIgPSBtc2cub25lb2ZNZXNzYWdlICAvLyBEZWZhdWx0IGNyZWF0ZSBvbmUKLSAgICBYQ1RBc3NlcnROb3ROaWwoYXV0b0NyZWF0ZWQyKQotICAgIFhDVEFzc2VydFRydWUoYXV0b0NyZWF0ZWQyICE9PSBhdXRvQ3JlYXRlZCkgIC8vIE5ldyBpbnN0YW5jZQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgSW50MzIoMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlLkdQQlVuc2V0T25lT2ZDYXNlKQotCi0gICAgbXNnLm9uZW9mSW50MzIgPSAxMAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZkludDMyLCBJbnQzMigxMCkpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlLk9uZW9mSW50MzIpCi0KLSAgICAvLyBDb25maXJtIE1lc3NhZ2UuY2xlYXIoKSBoYW5kbGVzIHRoZSBvbmVvZiBjb3JyZWN0bHkuCi0gICAgbXNnLmNsZWFyKCkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub25lb2ZJbnQzMiwgSW50MzIoMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlLkdQQlVuc2V0T25lT2ZDYXNlKQotCi0gICAgLy8gU2V0cyB2aWEgdGhlIGF1dG9jcmVhdGVkIGluc3RhbmNlLgotICAgIG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiA9IDMwMAotICAgIFhDVEFzc2VydFRydWUobXNnLm9uZW9mTWVzc2FnZSAhPT0gYXV0b0NyZWF0ZWQpICAvLyBOZXcgaW5zdGFuY2UKLSAgICBYQ1RBc3NlcnRUcnVlKG1zZy5vbmVvZk1lc3NhZ2UgIT09IGF1dG9DcmVhdGVkMikgIC8vIE5ldyBpbnN0YW5jZQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgSW50MzIoMzAwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub09uZU9mQ2FzZSwgTWVzc2FnZTNfT19PbmVPZkNhc2UuT25lb2ZNZXNzYWdlKQotCi0gICAgLy8gU2V0IG1lc3NhZ2UgdG8gbmlsIGNsZWFycyB0aGUgb25lb2YuCi0gICAgbXNnLm9uZW9mTWVzc2FnZSA9IG5pbAotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5vbmVvZk1lc3NhZ2Uub3B0aW9uYWxJbnQzMiwgSW50MzIoMCkpICAvLyBEZWZhdWx0Ci0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm9PbmVPZkNhc2UsIE1lc3NhZ2UzX09fT25lT2ZDYXNlLkdQQlVuc2V0T25lT2ZDYXNlKQotICB9Ci0KLSAgZnVuYyB0ZXN0U2VyaWFsaXphdGlvbigpIHsKLSAgICBsZXQgbXNnID0gTWVzc2FnZTIoKQotCi0gICAgbXNnLm9wdGlvbmFsSW50MzIgPSAxMDAKLSAgICBtc2cub3B0aW9uYWxJbnQ2NCA9IDEwMQotICAgIG1zZy5vcHRpb25hbEdyb3VwLmEgPSAxMDIKLSAgICBtc2cucmVwZWF0ZWRTdHJpbmdBcnJheS5hZGRPYmplY3QoImFiYyIpCi0gICAgbXNnLnJlcGVhdGVkU3RyaW5nQXJyYXkuYWRkT2JqZWN0KCJkZWYiKQotICAgIG1zZy5tYXBJbnQzMkludDMyLnNldFZhbHVlKDIwMCwgZm9yS2V5OjMwMCkKLSAgICBtc2cubWFwSW50MzJJbnQzMi5zZXRWYWx1ZSgyMDEsIGZvcktleToyMDEpCi0gICAgbXNnLm1hcFN0cmluZ1N0cmluZy5zZXRPYmplY3QoImZvbyIsIGZvcktleToiYmFyIikKLSAgICBtc2cubWFwU3RyaW5nU3RyaW5nLnNldE9iamVjdCgiYWJjIiwgZm9yS2V5OiJ4eXoiKQotCi0gICAgbGV0IGRhdGEgPSBtc2cuZGF0YSgpCi0KLSAgICBsZXQgbXNnMiA9IE1lc3NhZ2UyKGRhdGE6IGRhdGEhLCBlcnJvcjpuaWwpCi0gICAgWENUQXNzZXJ0VHJ1ZShtc2cyICE9PSBtc2cpICAvLyBOZXcgaW5zdGFuY2UKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxJbnQzMiwgSW50MzIoMTAwKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxJbnQ2NCwgSW50NjQoMTAxKSkKLSAgICBYQ1RBc3NlcnRFcXVhbChtc2cub3B0aW9uYWxHcm91cC5hLCBJbnQzMigxMDIpKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZy5yZXBlYXRlZFN0cmluZ0FycmF5LmNvdW50LCBJbnQoMikpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcEludDMySW50MzIuY291bnQsIFVJbnQoMikpCi0gICAgWENUQXNzZXJ0RXF1YWwobXNnLm1hcFN0cmluZ1N0cmluZy5jb3VudCwgSW50KDIpKQotICAgIFhDVEFzc2VydEVxdWFsKG1zZzIsIG1zZykKLSAgfQotCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQlRlc3RVdGlsaXRpZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCVGVzdFV0aWxpdGllcy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NGM4MDg0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCVGVzdFV0aWxpdGllcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxYQ1Rlc3QvWENUZXN0Lmg+Ci0KLUBjbGFzcyBUZXN0QWxsRXh0ZW5zaW9uczsKLUBjbGFzcyBUZXN0QWxsVHlwZXM7Ci1AY2xhc3MgVGVzdE1hcDsKLUBjbGFzcyBUZXN0UGFja2VkVHlwZXM7Ci1AY2xhc3MgVGVzdFBhY2tlZEV4dGVuc2lvbnM7Ci1AY2xhc3MgVGVzdFVucGFja2VkVHlwZXM7Ci1AY2xhc3MgVGVzdFVucGFja2VkRXh0ZW5zaW9uczsKLUBjbGFzcyBHUEJFeHRlbnNpb25SZWdpc3RyeTsKLQotCi0vLyBIZWxwZXIgZm9yIHVzZXMgb2YgQyBhcnJheXMgaW4gdGVzdHMgY2FzZXMuCi0jaWZuZGVmIEdQQkFSUkFZU0laRQotI2RlZmluZSBHUEJBUlJBWVNJWkUoYSkgKChzaXplb2YoYSkgLyBzaXplb2YoKGFbMF0pKSkpCi0jZW5kaWYgIC8vIEdQQkFSUkFZU0laRQotCi0KLS8vIFRoZSBudW1iZXIgb2YgcmVwZXRpdGlvbnMgb2YgYW55IHJlcGVhdGVkIG9iamVjdHMgaW5zaWRlIG9mIHRlc3QgbWVzc2FnZXMuCi1leHRlcm4gY29uc3QgdWludDMyX3Qga0dQQkRlZmF1bHRSZXBlYXRDb3VudDsKLQotQGludGVyZmFjZSBHUEJUZXN0Q2FzZSA6IFhDVGVzdENhc2UKLQotLSAodm9pZClzZXRBbGxGaWVsZHM6KFRlc3RBbGxUeXBlcyAqKW1lc3NhZ2UgcmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQ7Ci0tICh2b2lkKWNsZWFyQWxsRmllbGRzOihUZXN0QWxsVHlwZXMgKiltZXNzYWdlOwotLSAodm9pZClzZXRBbGxFeHRlbnNpb25zOihUZXN0QWxsRXh0ZW5zaW9ucyAqKW1lc3NhZ2UKLSAgICAgICAgICAgcmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQ7Ci0tICh2b2lkKXNldFBhY2tlZEZpZWxkczooVGVzdFBhY2tlZFR5cGVzICopbWVzc2FnZQotICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50OwotLSAodm9pZClzZXRVbnBhY2tlZEZpZWxkczooVGVzdFVucGFja2VkVHlwZXMgKiltZXNzYWdlCi0gICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudDsKLS0gKHZvaWQpc2V0UGFja2VkRXh0ZW5zaW9uczooVGVzdFBhY2tlZEV4dGVuc2lvbnMgKiltZXNzYWdlCi0gICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50OwotLSAodm9pZClzZXRVbnBhY2tlZEV4dGVuc2lvbnM6KFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgKiltZXNzYWdlCi0gICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50OwotLSAodm9pZClzZXRBbGxNYXBGaWVsZHM6KFRlc3RNYXAgKiltZXNzYWdlIG51bUVudHJpZXM6KHVpbnQzMl90KWNvdW50OwotCi0tIChUZXN0QWxsVHlwZXMgKilhbGxTZXRSZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudDsKLS0gKFRlc3RBbGxFeHRlbnNpb25zICopYWxsRXh0ZW5zaW9uc1NldFJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50OwotLSAoVGVzdFBhY2tlZFR5cGVzICopcGFja2VkU2V0UmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQ7Ci0tIChUZXN0UGFja2VkRXh0ZW5zaW9ucyAqKXBhY2tlZEV4dGVuc2lvbnNTZXRSZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudDsKLQotLSAodm9pZClhc3NlcnRBbGxGaWVsZHNTZXQ6KFRlc3RBbGxUeXBlcyAqKW1lc3NhZ2UKLSAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudDsKLS0gKHZvaWQpYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldDooVGVzdEFsbEV4dGVuc2lvbnMgKiltZXNzYWdlCi0gICAgICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50OwotLSAodm9pZClhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkOihUZXN0QWxsVHlwZXMgKiltZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50OwotLSAodm9pZClhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZDooVGVzdEFsbEV4dGVuc2lvbnMgKiltZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudDsKLS0gKHZvaWQpYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyOihUZXN0QWxsRXh0ZW5zaW9ucyAqKW1lc3NhZ2U7Ci0tICh2b2lkKWFzc2VydENsZWFyOihUZXN0QWxsVHlwZXMgKiltZXNzYWdlOwotLSAodm9pZClhc3NlcnRQYWNrZWRGaWVsZHNTZXQ6KFRlc3RQYWNrZWRUeXBlcyAqKW1lc3NhZ2UKLSAgICAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudDsKLS0gKHZvaWQpYXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldDooVGVzdFBhY2tlZEV4dGVuc2lvbnMgKiltZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50OwotCi0tICh2b2lkKW1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9uczooVGVzdEFsbEV4dGVuc2lvbnMgKiltZXNzYWdlOwotLSAodm9pZCltb2RpZnlSZXBlYXRlZEZpZWxkczooVGVzdEFsbFR5cGVzICopbWVzc2FnZTsKLQotLSAoR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeTsKLQotLSAoTlNEYXRhICopZ2V0RGF0YUZpbGVOYW1lZDooTlNTdHJpbmcgKiluYW1lIGRhdGFUb1dyaXRlOihOU0RhdGEgKilkYXRhVG9Xcml0ZTsKLQotLSAodm9pZClhc3NlcnRBbGxGaWVsZHNLVkNNYXRjaDooVGVzdEFsbFR5cGVzICopbWVzc2FnZTsKLS0gKHZvaWQpc2V0QWxsRmllbGRzVmlhS1ZDOihUZXN0QWxsVHlwZXMgKiltZXNzYWdlCi0gICAgICAgICAgICAgcmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQ7Ci0tICh2b2lkKWFzc2VydENsZWFyS1ZDOihUZXN0QWxsVHlwZXMgKiltZXNzYWdlOwotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQlRlc3RVdGlsaXRpZXMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCVGVzdFV0aWxpdGllcy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MjY3NjFhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCVGVzdFV0aWxpdGllcy5tCisrKyAvZGV2L251bGwKQEAgLTEsMjU0NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvTWFwVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3QucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RJbXBvcnQucGJvYmpjLmgiCi0KLWNvbnN0IHVpbnQzMl90IGtHUEJEZWZhdWx0UmVwZWF0Q291bnQgPSAyOwotCi0vLyBTbWFsbCBjYXRlZ29yeSB0byBlYXNpbHkgdHVybiBhIENTdHJpbmcgaW50byBhbiBOU0RhdGEuCi1AaW50ZXJmYWNlIE5TRGF0YSAoR1BCVGVzdENhc2UpCi0rIChOU0RhdGEgKilncGJ0dV9kYXRhV2l0aENTdHJpbmc6KGNoYXIgKilidWZmZXI7Ci0rIChpbnN0YW5jZXR5cGUpZ3BidHVfZGF0YVdpdGhFbWJlZGRlZE51bGxzOwotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gTlNEYXRhIChHUEJUZXN0Q2FzZSkKLSsgKE5TRGF0YSAqKWdwYnR1X2RhdGFXaXRoQ1N0cmluZzooY2hhciAqKWJ1ZmZlciB7Ci0gIHJldHVybiBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6YnVmZmVyIGxlbmd0aDpzdHJsZW4oYnVmZmVyKV07Ci19Ci0KLSsgKGluc3RhbmNldHlwZSlncGJ0dV9kYXRhV2l0aFVpbnQzMjoodWludDMyX3QpdmFsdWUgewotICByZXR1cm4gW1tbc2VsZiBhbGxvY10gaW5pdFdpdGhVaW50MzJfZ3BidHU6dmFsdWVdIGF1dG9yZWxlYXNlXTsKLX0KLQotLSAoaW5zdGFuY2V0eXBlKWluaXRXaXRoVWludDMyX2dwYnR1Oih1aW50MzJfdCl2YWx1ZSB7Ci0gIHZhbHVlID0gQ0ZTd2FwSW50MzJIb3N0VG9MaXR0bGUodmFsdWUpOwotICByZXR1cm4gW3NlbGYgaW5pdFdpdGhCeXRlczomdmFsdWUgbGVuZ3RoOnNpemVvZih2YWx1ZSldOwotfQotCi0rIChpbnN0YW5jZXR5cGUpZ3BidHVfZGF0YVdpdGhFbWJlZGRlZE51bGxzIHsKLSAgY2hhciBieXRlc1s2XSA9ICJcMVwwXDJcM1wwXDUiOwotICByZXR1cm4gW3NlbGYgZGF0YVdpdGhCeXRlczpieXRlcyBsZW5ndGg6c2l6ZW9mKGJ5dGVzKV07Ci19Ci1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJUZXN0Q2FzZQotCi0vLyBSZXR1cm4gZGF0YSBmb3IgbmFtZS4gT3B0aW9uYWxseSAoYmFzZWQgb24gI2lmIHNldHRpbmcpIHdyaXRlIG91dCBkYXRhVG9Xcml0ZQotLy8gdG8gcmVwbGFjZSB0aGF0IGRhdGEuIFVzZWZ1bCBmb3Igc2V0dGluZyBnb2xkZW4gbWFzdGVycy4KLS0gKE5TRGF0YSAqKWdldERhdGFGaWxlTmFtZWQ6KE5TU3RyaW5nICopbmFtZQotICAgICAgICAgICAgICAgICBkYXRhVG9Xcml0ZTooTlNEYXRhICopZGF0YVRvV3JpdGUgewotICBOU0J1bmRsZSAqYnVuZGxlID0gW05TQnVuZGxlIGJ1bmRsZUZvckNsYXNzOltzZWxmIGNsYXNzXV07Ci0gIE5TU3RyaW5nICpwYXRoID0gW2J1bmRsZSBwYXRoRm9yUmVzb3VyY2U6W25hbWUgc3RyaW5nQnlEZWxldGluZ1BhdGhFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZlR5cGU6W25hbWUgcGF0aEV4dGVuc2lvbl1dOwotICBYQ1RBc3NlcnROb3ROaWwocGF0aCwgQCJVbmFibGUgdG8gZmluZCAlQCIsIG5hbWUpOwotICBOU0RhdGEgKmRhdGEgPSBbTlNEYXRhIGRhdGFXaXRoQ29udGVudHNPZkZpbGU6cGF0aF07Ci0gIFhDVEFzc2VydE5vdE5pbChkYXRhLCBAIlVuYWJsZSB0byBsb2FkIGZyb20gJUAiLCBwYXRoKTsKLSNpZiAwCi0gIC8vIEVuYWJsZSB0byB3cml0ZSBvdXQgZ29sZGVuIG1hc3RlciBmaWxlcy4KLSAgaWYgKCFwYXRoKSB7Ci0gICAgcGF0aCA9IFtbYnVuZGxlIHJlc291cmNlUGF0aF0gc3RyaW5nQnlBcHBlbmRpbmdQYXRoQ29tcG9uZW50Om5hbWVdOwotICB9Ci0gIE5TRXJyb3IgKmVycm9yID0gbmlsOwotICBCT09MIHdyb3RlID0gW2RhdGFUb1dyaXRlIHdyaXRlVG9GaWxlOnBhdGggb3B0aW9uczpOU0RhdGFXcml0aW5nQXRvbWljIGVycm9yOiZlcnJvcl07Ci0gIFhDVEFzc2VydFRydWUod3JvdGUsIEAiVW5hYmxlIHRvIHdyaXRlICVAICglQCkiLCBwYXRoLCBlcnJvcik7Ci0gIE5TTG9nKEAiV3JvdGUgZGF0YSBmaWxlIHRvICVAIiwgcGF0aCk7Ci0jZWxzZQotICAvLyBLaWxsIG9mZiB0aGUgdW51c2VkIHZhcmlhYmxlIHdhcm5pbmcuCi0gIGRhdGFUb1dyaXRlID0gZGF0YVRvV3JpdGU7Ci0jZW5kaWYKLSAgcmV0dXJuIGRhdGE7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLSAodm9pZCltb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnM6KFRlc3RBbGxFeHRlbnNpb25zICopbWVzc2FnZSB7Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICBpbmRleDoxCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpANTAxXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOkA1MDJdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQzMkV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOkA1MDNdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOkA1MDRdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFNpbnQzMkV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOkA1MDVdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOkA1MDZdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICBpbmRleDoxCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpANTA3XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QDUwOF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICBpbmRleDoxCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpANTA5XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOkA1MTBdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZsb2F0RXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QDUxMS4wZl07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QDUxMi4wXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRCb29sRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QFlFU107Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QCI1MTUiXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRCeXRlc0V4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOltOU0RhdGEgZ3BidHVfZGF0YVdpdGhVaW50MzI6NTE2XV07Ci0KLSAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gKnJlcGVhdGVkR3JvdXAgPSBbUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gbWVzc2FnZV07Ci0gIFtyZXBlYXRlZEdyb3VwIHNldEE6NTE3XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRHcm91cEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOnJlcGVhdGVkR3JvdXBdOwotICBUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZSAqbmVzdGVkTWVzc2FnZSA9Ci0gICAgICBbVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtuZXN0ZWRNZXNzYWdlIHNldEJiOjUxOF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOm5lc3RlZE1lc3NhZ2VdOwotICBGb3JlaWduTWVzc2FnZSAqZm9yZWlnbk1lc3NhZ2UgPSBbRm9yZWlnbk1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtmb3JlaWduTWVzc2FnZSBzZXRDOjUxOV07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICBpbmRleDoxCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpmb3JlaWduTWVzc2FnZV07Ci0gIEltcG9ydE1lc3NhZ2UgKmltcG9ydE1lc3NhZ2UgPSBbSW1wb3J0TWVzc2FnZSBtZXNzYWdlXTsKLSAgW2ltcG9ydE1lc3NhZ2Ugc2V0RDo1MjBdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICBpbmRleDoxCi0gICAgICAgICAgICAgICAgICB2YWx1ZTppbXBvcnRNZXNzYWdlXTsKLQotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICBpbmRleDoxCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpAKFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZvbyldOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QChGb3JlaWduRW51bV9Gb3JlaWduRm9vKV07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIGluZGV4OjEKLSAgICAgICAgICAgICAgICAgIHZhbHVlOkAoSW1wb3J0RW51bV9JbXBvcnRGb28pXTsKLQotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QCI1MjQiXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRDb3JkRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgaW5kZXg6MQotICAgICAgICAgICAgICAgICAgdmFsdWU6QCI1MjUiXTsKLX0KLQotLSAodm9pZClhc3NlcnRBbGxFeHRlbnNpb25zU2V0OihUZXN0QWxsRXh0ZW5zaW9ucyAqKW1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgcmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQgewotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50MzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbnQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFVpbnQzMkV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFNpbnQzMkV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZsb2F0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsQm9vbEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFN0cmluZ0V4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uXV0pOwotCi0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0VHJ1ZShbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl1dIGhhc0FdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0gaGFzQmJdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbl1dIGhhc0NdKTsKLSAgWENUQXNzZXJ0VHJ1ZShbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXV0gaGFzRF0pOwotCi0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uXV0pOwotCi0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbENvcmRFeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0SW50MzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEludDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRVaW50MzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U2ludDMyRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTaW50NjRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0RmxvYXRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdERvdWJsZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Qm9vbEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRCeXRlc0V4dGVuc2lvbl1dKTsKLQotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbl1dKTsKLQotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Q29yZEV4dGVuc2lvbl1dKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgxMDEsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEludDMyRXh0ZW5zaW9uXV0gaW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTAyTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEludDY0RXh0ZW5zaW9uXV0gbG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgxMDNVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxVaW50MzJFeHRlbnNpb25dXSB1bnNpZ25lZEludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDEwNFVMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uXV0gdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDEwNSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uXV0gaW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTA2TEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbl1dIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTA3VSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbl1dIHVuc2lnbmVkSW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTA4VUxMLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uXV0gdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDEwOSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgxMTBMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb25dXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDExMS4wZiwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRmxvYXRFeHRlbnNpb25dXSBmbG9hdFZhbHVlXSwgMC4wMSk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDExMi4wLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxEb3VibGVFeHRlbnNpb25dXSBkb3VibGVWYWx1ZV0sIDAuMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEJvb2xFeHRlbnNpb25dXSBib29sVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiMTE1IiwgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbTlNEYXRhIGdwYnR1X2RhdGFXaXRoRW1iZWRkZWROdWxsc10sIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoMTE3LCBbKFRlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwKilbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEdyb3VwRXh0ZW5zaW9uXV0gYV0pOwotICBYQ1RBc3NlcnRFcXVhbCgxMTgsIFsoVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UqKVttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl1dIGJiXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDExOSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXSBjXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDEyMCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dIGRdKTsKLQotICBYQ1RBc3NlcnRFcXVhbChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXosIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbChGb3JlaWduRW51bV9Gb3JlaWduQmF6LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbl1dIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKEltcG9ydEVudW1fSW1wb3J0QmF6LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uXV0gaW50VmFsdWVdKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIxMjQiLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIxMjUiLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbENvcmRFeHRlbnNpb25dXSk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50NjRFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTaW50MzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGbG9hdEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWREb3VibGVFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQm9vbEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25dXSBjb3VudF0pOwotCi0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRHcm91cEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uXV0gY291bnRdKTsKLQotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQ29yZEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBpZCBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEludDMyRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoMjAxICsgaSAqIDEwMCksIFtleHRlbnNpb25baV0gaW50VmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEludDY0RXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjAyICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRVaW50MzJFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCgyMDMgKyBpICogMTAwLCBbZXh0ZW5zaW9uW2ldIHVuc2lnbmVkSW50VmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKDIwNCArIGkgKiAxMDAsIFtleHRlbnNpb25baV0gdW5zaWduZWRMb25nTG9uZ1ZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTaW50MzJFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCgoaW50KSgyMDUgKyBpICogMTAwKSwgW2V4dGVuc2lvbltpXSBpbnRWYWx1ZV0pOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjA2ICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjA3ICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSB1bnNpZ25lZEludFZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjA4ICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoMjA5ICsgaSAqIDEwMCksIFtleHRlbnNpb25baV0gaW50VmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjEwICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGbG9hdEV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDIxMSArIGkgKiAxMDAsIFtleHRlbnNpb25baV0gZmxvYXRWYWx1ZV0sIDAuMDEpOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koMjEyICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSBkb3VibGVWYWx1ZV0sIDAuMDEpOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQm9vbEV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpICUgMikgPyBZRVMgOiBOTywgW2V4dGVuc2lvbltpXSBib29sVmFsdWVdKTsKLQotICAgIE5TU3RyaW5nICpzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIiVkIiwgMjE1ICsgaSAqIDEwMF07Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoc3RyaW5nLCBleHRlbnNpb25baV0pOwotICAgIFtzdHJpbmcgcmVsZWFzZV07Ci0KLSAgICBOU0RhdGEgKmRhdGEgPSBbW05TRGF0YSBhbGxvY10gaW5pdFdpdGhVaW50MzJfZ3BidHU6MjE2ICsgaSAqIDEwMF07Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRCeXRlc0V4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkYXRhLCBleHRlbnNpb25baV0pOwotICAgIFtkYXRhIHJlbGVhc2VdOwotCi0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRHcm91cEV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpbnQpKDIxNyArIGkgKiAxMDApLCBbKFRlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwKilleHRlbnNpb25baV0gYV0pOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpbnQpKDIxOCArIGkgKiAxMDApLCBbKFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlKilleHRlbnNpb25baV0gYmJdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoMjE5ICsgaSAqIDEwMCksIFtleHRlbnNpb25baV0gY10pOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpbnQpKDIyMCArIGkgKiAxMDApLCBbZXh0ZW5zaW9uW2ldIGRdKTsKLQotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpICUgMikgPyBUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXIgOiBUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXosIFtleHRlbnNpb25baV0gaW50VmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGkgJSAyKSA/IEZvcmVpZ25FbnVtX0ZvcmVpZ25CYXIgOiBGb3JlaWduRW51bV9Gb3JlaWduQmF6LCBbZXh0ZW5zaW9uW2ldIGludFZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGkgJSAyKSA/IEltcG9ydEVudW1fSW1wb3J0QmFyIDogSW1wb3J0RW51bV9JbXBvcnRCYXosIFtleHRlbnNpb25baV0gaW50VmFsdWVdKTsKLQotICAgIHN0cmluZyA9IFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRm9ybWF0OkAiJWQiLCAyMjQgKyBpICogMTAwXTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHN0cmluZywgZXh0ZW5zaW9uW2ldKTsKLSAgICBbc3RyaW5nIHJlbGVhc2VdOwotCi0gICAgc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIyNSArIGkgKiAxMDBdOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQ29yZEV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhzdHJpbmcsIGV4dGVuc2lvbltpXSk7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0SW50MzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEludDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRVaW50MzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U2ludDMyRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTaW50NjRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0RmxvYXRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdERvdWJsZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Qm9vbEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRCeXRlc0V4dGVuc2lvbl1dKTsKLQotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbl1dKTsKLQotICBYQ1RBc3NlcnRUcnVlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0VHJ1ZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Q29yZEV4dGVuc2lvbl1dKTsKLQotICBYQ1RBc3NlcnRFcXVhbCg0MDEsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0SW50MzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg0MDJMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRJbnQ2NEV4dGVuc2lvbl1dIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNDAzVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRVaW50MzJFeHRlbnNpb25dXSB1bnNpZ25lZEludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDQwNFVMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRVaW50NjRFeHRlbnNpb25dXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNDA1LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNpbnQzMkV4dGVuc2lvbl1dIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDQwNkxMLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbl1dIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNDA3VSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uXV0gdW5zaWduZWRJbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg0MDhVTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbl1dIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg0MDksIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg0MTBMTCxbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uXV0gbG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeSg0MTEuMGYsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0RmxvYXRFeHRlbnNpb25dXSBmbG9hdFZhbHVlXSwgMC4wMSk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDQxMi4wLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdERvdWJsZUV4dGVuc2lvbl1dIGRvdWJsZVZhbHVlXSwgMC4wMSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Qm9vbEV4dGVuc2lvbl1dIGJvb2xWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCI0MTUiLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW05TRGF0YSBncGJ0dV9kYXRhV2l0aFVpbnQzMjo0MTZdLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Qnl0ZXNFeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fRm9vLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbChGb3JlaWduRW51bV9Gb3JlaWduRm9vLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uXV0gaW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoSW1wb3J0RW51bV9JbXBvcnRGb28sIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbl1dIGludFZhbHVlXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiNDI0IiwgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCI0MjUiLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Q29yZEV4dGVuc2lvbl1dKTsKLX0KLQotLSAodm9pZClhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZDooVGVzdEFsbEV4dGVuc2lvbnMgKiltZXNzYWdlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudCB7Ci0gIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAotICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAotICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbnQzMkV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRVaW50MzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFNpbnQzMkV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTaW50NjRFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZsb2F0RXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZERvdWJsZUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRCb29sRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFN0cmluZ0V4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRCeXRlc0V4dGVuc2lvbl1dIGNvdW50XSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEdyb3VwRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25dXSBjb3VudF0pOwotCi0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRDb3JkRXh0ZW5zaW9uXV0gY291bnRdKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgyMDEsW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dXVswXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDJMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50NjRFeHRlbnNpb25dXVswXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIwM1UsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQzMkV4dGVuc2lvbl1dWzBdIHVuc2lnbmVkSW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMjA0VUxMLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRVaW50NjRFeHRlbnNpb25dXVswXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMjA1LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTaW50MzJFeHRlbnNpb25dXVswXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDZMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uXV1bMF0gbG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDdVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uXV1bMF0gdW5zaWduZWRJbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDhVTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25dXVswXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMjA5LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbl1dWzBdIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIxMExMLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbl1dWzBdIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koMjExLjBmLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGbG9hdEV4dGVuc2lvbl1dWzBdIGZsb2F0VmFsdWVdLCAwLjAxKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koMjEyLjAsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZERvdWJsZUV4dGVuc2lvbl1dWzBdIGRvdWJsZVZhbHVlXSwgMC4wMSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEJvb2xFeHRlbnNpb25dXVswXSBib29sVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiMjE1IiwgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25dXVswXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbTlNEYXRhIGdwYnR1X2RhdGFXaXRoVWludDMyOjIxNl0sIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25dXVswXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoMjE3LCBbKFRlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwKilbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEdyb3VwRXh0ZW5zaW9uXV1bMF0gYV0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMTgsIFsoVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UqKVttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl1dWzBdIGJiXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIxOSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25dXVswXSBjXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIyMCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl1dWzBdIGRdKTsKLQotICBYQ1RBc3NlcnRFcXVhbChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXosCi0gICAgICAgICAgICAgICAgIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25dXVswXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbChGb3JlaWduRW51bV9Gb3JlaWduQmF6LAotICAgICAgICAgICAgICAgICBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbl1dWzBdIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKEltcG9ydEVudW1fSW1wb3J0QmF6LAotICAgICAgICAgICAgICAgICBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uXV1bMF0gaW50VmFsdWVdKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIyMjQiLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uXV1bMF0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIyMjUiLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZENvcmRFeHRlbnNpb25dXVswXSk7Ci0KLSAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCi0gIFhDVEFzc2VydEVxdWFsKDUwMSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dXVsxXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MDJMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50NjRFeHRlbnNpb25dXVsxXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDUwM1UsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQzMkV4dGVuc2lvbl1dWzFdIHVuc2lnbmVkSW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTA0VUxMLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRVaW50NjRFeHRlbnNpb25dXVsxXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTA1LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTaW50MzJFeHRlbnNpb25dXVsxXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MDZMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uXV1bMV0gbG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MDdVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uXV1bMV0gdW5zaWduZWRJbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MDhVTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25dXVsxXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTA5LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbl1dWzFdIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDUxMExMLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbl1dWzFdIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koNTExLjBmLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGbG9hdEV4dGVuc2lvbl1dWzFdIGZsb2F0VmFsdWVdLCAwLjAxKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koNTEyLjAsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZERvdWJsZUV4dGVuc2lvbl1dWzFdIGRvdWJsZVZhbHVlXSwgMC4wMSk7Ci0gIFhDVEFzc2VydFRydWUoW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQm9vbEV4dGVuc2lvbl1dWzFdIGJvb2xWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCI1MTUiLCBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFN0cmluZ0V4dGVuc2lvbl1dWzFdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtOU0RhdGEgZ3BidHVfZGF0YVdpdGhVaW50MzI6NTE2XSwgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRCeXRlc0V4dGVuc2lvbl1dWzFdKTsKLQotICBYQ1RBc3NlcnRFcXVhbCg1MTcsIFsoVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAqKVttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkR3JvdXBFeHRlbnNpb25dXVsxXSBhXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDUxOCwgWyhUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZSopW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV1bMV0gYmJdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTE5LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbl1dWzFdIGNdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTIwLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXV1bMV0gZF0pOwotCi0gIFhDVEFzc2VydEVxdWFsKFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZvbywKLSAgICAgICAgICAgICAgICAgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbl1dWzFdIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKEZvcmVpZ25FbnVtX0ZvcmVpZ25Gb28sCi0gICAgICAgICAgICAgICAgIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uXV1bMV0gaW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoSW1wb3J0RW51bV9JbXBvcnRGb28sCi0gICAgICAgICAgICAgICAgIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25dXVsxXSBpbnRWYWx1ZV0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIjUyNCIsIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25dXVsxXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIjUyNSIsIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQ29yZEV4dGVuc2lvbl1dWzFdKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0tICh2b2lkKWFzc2VydEFsbEZpZWxkc1NldDooVGVzdEFsbFR5cGVzICopbWVzc2FnZQotICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50IHsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbnQ2NCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFVpbnQzMik7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFVpbnQ2NCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQzMik7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQ2NCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkMzIpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGaXhlZDY0KTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkMzIpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQ2NCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZsb2F0KTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsRG91YmxlKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFN0cmluZyk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEJ5dGVzKTsKLQotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpOwotCi0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbEdyb3VwLmhhc0EpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmhhc0JiKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuaGFzQyk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbEltcG9ydE1lc3NhZ2UuaGFzRCk7Ci0KLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkRW51bSk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25FbnVtKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW1wb3J0RW51bSk7Ci0KLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nUGllY2UpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxDb3JkKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgxMDEsIG1lc3NhZ2Uub3B0aW9uYWxJbnQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDEwMkxMLCBtZXNzYWdlLm9wdGlvbmFsSW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbCgxMDNVLCBtZXNzYWdlLm9wdGlvbmFsVWludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTA0VUxMLCBtZXNzYWdlLm9wdGlvbmFsVWludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoMTA1LCBtZXNzYWdlLm9wdGlvbmFsU2ludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTA2TEwsIG1lc3NhZ2Uub3B0aW9uYWxTaW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbCgxMDdVLCBtZXNzYWdlLm9wdGlvbmFsRml4ZWQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDEwOFVMTCwgbWVzc2FnZS5vcHRpb25hbEZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbCgxMDksIG1lc3NhZ2Uub3B0aW9uYWxTZml4ZWQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDExMExMLCBtZXNzYWdlLm9wdGlvbmFsU2ZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeSgxMTEuMGYsIG1lc3NhZ2Uub3B0aW9uYWxGbG9hdCwgMC4xKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koMTEyLjAsIG1lc3NhZ2Uub3B0aW9uYWxEb3VibGUsIDAuMSk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbEJvb2wpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIxMTUiLCBtZXNzYWdlLm9wdGlvbmFsU3RyaW5nKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtOU0RhdGEgZ3BidHVfZGF0YVdpdGhFbWJlZGRlZE51bGxzXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxCeXRlcyk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoMTE3LCBtZXNzYWdlLm9wdGlvbmFsR3JvdXAuYSk7Ci0gIFhDVEFzc2VydEVxdWFsKDExOCwgbWVzc2FnZS5vcHRpb25hbE5lc3RlZE1lc3NhZ2UuYmIpOwotICBYQ1RBc3NlcnRFcXVhbCgxMTksIG1lc3NhZ2Uub3B0aW9uYWxGb3JlaWduTWVzc2FnZS5jKTsKLSAgWENUQXNzZXJ0RXF1YWwoMTIwLCBtZXNzYWdlLm9wdGlvbmFsSW1wb3J0TWVzc2FnZS5kKTsKLQotICBYQ1RBc3NlcnRFcXVhbChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXosIG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRFbnVtKTsKLSAgWENUQXNzZXJ0RXF1YWwoRm9yZWlnbkVudW1fRm9yZWlnbkJheiwgbWVzc2FnZS5vcHRpb25hbEZvcmVpZ25FbnVtKTsKLSAgWENUQXNzZXJ0RXF1YWwoSW1wb3J0RW51bV9JbXBvcnRCYXosIG1lc3NhZ2Uub3B0aW9uYWxJbXBvcnRFbnVtKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIxMjQiLCBtZXNzYWdlLm9wdGlvbmFsU3RyaW5nUGllY2UpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIxMjUiLCBtZXNzYWdlLm9wdGlvbmFsQ29yZCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEludDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEludDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFVpbnQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRVaW50NjRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkU2ludDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFNpbnQ2NEFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRGaXhlZDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEZpeGVkNjRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkU2ZpeGVkMzJBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkU2ZpeGVkNjRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRmxvYXRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRG91YmxlQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEJvb2xBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEJ5dGVzQXJyYXkuY291bnQpOwotCi0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkR3JvdXBBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRJbXBvcnRNZXNzYWdlQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZE5lc3RlZEVudW1BcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRm9yZWlnbkVudW1BcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5LmNvdW50KTsKLQotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ1BpZWNlQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZENvcmRBcnJheS5jb3VudCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRVaW50MzJBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkVWludDY0QXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFNpbnQzMkFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRml4ZWQzMkFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRGaXhlZDY0QXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDMyQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDY0QXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEZsb2F0QXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZERvdWJsZUFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRCb29sQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRCeXRlc0FycmF5X0NvdW50KTsKLQotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEdyb3VwQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25FbnVtQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEltcG9ydEVudW1BcnJheV9Db3VudCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTdHJpbmdQaWVjZUFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRDb3JkQXJyYXlfQ291bnQpOwotCi0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoMjAxICsgaSAqIDEwMCksCi0gICAgICAgICAgICAgICAgICAgW21lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjAyICsgaSAqIDEwMCwgW21lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjAzICsgaSAqIDEwMCwgW21lc3NhZ2UucmVwZWF0ZWRVaW50MzJBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKDIwNCArIGkgKiAxMDAsIFttZXNzYWdlLnJlcGVhdGVkVWludDY0QXJyYXkgdmFsdWVBdEluZGV4OmldKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCgoaW50KSgyMDUgKyBpICogMTAwKSwKLSAgICAgICAgICAgICAgICAgICBbbWVzc2FnZS5yZXBlYXRlZFNpbnQzMkFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjA2ICsgaSAqIDEwMCwgW21lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKDIwNyArIGkgKiAxMDAsCi0gICAgICAgICAgICAgICAgICAgW21lc3NhZ2UucmVwZWF0ZWRGaXhlZDMyQXJyYXkgdmFsdWVBdEluZGV4OmldKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCgyMDggKyBpICogMTAwLAotICAgICAgICAgICAgICAgICAgIFttZXNzYWdlLnJlcGVhdGVkRml4ZWQ2NEFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoMjA5ICsgaSAqIDEwMCksCi0gICAgICAgICAgICAgICAgICAgW21lc3NhZ2UucmVwZWF0ZWRTZml4ZWQzMkFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoMjEwICsgaSAqIDEwMCwKLSAgICAgICAgICAgICAgICAgICBbbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDY0QXJyYXkgdmFsdWVBdEluZGV4OmldKTsKLSAgICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeSgKLSAgICAgICAgMjExICsgaSAqIDEwMCwgW21lc3NhZ2UucmVwZWF0ZWRGbG9hdEFycmF5IHZhbHVlQXRJbmRleDppXSwgMC4xKTsKLSAgICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeSgKLSAgICAgICAgMjEyICsgaSAqIDEwMCwgW21lc3NhZ2UucmVwZWF0ZWREb3VibGVBcnJheSB2YWx1ZUF0SW5kZXg6aV0sIDAuMSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGkgJSAyKSA/IFlFUyA6IE5PLAotICAgICAgICAgICAgICAgICAgIFttZXNzYWdlLnJlcGVhdGVkQm9vbEFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0KLSAgICBOU1N0cmluZyAqc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIxNSArIGkgKiAxMDBdOwotICAgIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhzdHJpbmcsIG1lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheVtpXSk7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLQotICAgIE5TRGF0YSAqZGF0YSA9IFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aFVpbnQzMl9ncGJ0dToyMTYgKyBpICogMTAwXTsKLSAgICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZGF0YSwgbWVzc2FnZS5yZXBlYXRlZEJ5dGVzQXJyYXlbaV0pOwotICAgIFtkYXRhIHJlbGVhc2VdOwotCi0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoMjE3ICsgaSAqIDEwMCksICgoVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXAqKW1lc3NhZ2UucmVwZWF0ZWRHcm91cEFycmF5W2ldKS5hKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCgoaW50KSgyMTggKyBpICogMTAwKSwgKChUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZSopbWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheVtpXSkuYmIpOwotICAgIFhDVEFzc2VydEVxdWFsKChpbnQpKDIxOSArIGkgKiAxMDApLCAoKEZvcmVpZ25NZXNzYWdlKiltZXNzYWdlLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VBcnJheVtpXSkuYyk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoMjIwICsgaSAqIDEwMCksICgoSW1wb3J0TWVzc2FnZSopbWVzc2FnZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheVtpXSkuZCk7Ci0KLSAgICBYQ1RBc3NlcnRFcXVhbCgoaSAlIDIpID8gVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fQmFyIDogVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fQmF6LCBbbWVzc2FnZS5yZXBlYXRlZE5lc3RlZEVudW1BcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKChpICUgMikgPyBGb3JlaWduRW51bV9Gb3JlaWduQmFyIDogRm9yZWlnbkVudW1fRm9yZWlnbkJheiwgW21lc3NhZ2UucmVwZWF0ZWRGb3JlaWduRW51bUFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGkgJSAyKSA/IEltcG9ydEVudW1fSW1wb3J0QmFyIDogSW1wb3J0RW51bV9JbXBvcnRCYXosIFttZXNzYWdlLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0KLSAgICBzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIiVkIiwgMjI0ICsgaSAqIDEwMF07Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHN0cmluZywgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ1BpZWNlQXJyYXlbaV0pOwotICAgIFtzdHJpbmcgcmVsZWFzZV07Ci0KLSAgICBzdHJpbmcgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIiVkIiwgMjI1ICsgaSAqIDEwMF07Ci0gICAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKHN0cmluZywgbWVzc2FnZS5yZXBlYXRlZENvcmRBcnJheVtpXSk7Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRJbnQzMik7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0SW50NjQpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQzMik7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0VWludDY0KTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTaW50MzIpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQ2NCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQzMik7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQ2NCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkMzIpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDY0KTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRGbG9hdCk7Ci0gIFhDVEFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0RG91YmxlKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRCb29sKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmcpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEJ5dGVzKTsKLQotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdE5lc3RlZEVudW0pOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEZvcmVpZ25FbnVtKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRJbXBvcnRFbnVtKTsKLQotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZ1BpZWNlKTsKLSAgWENUQXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRDb3JkKTsKLQotICBYQ1RBc3NlcnRFcXVhbCg0MDEsIG1lc3NhZ2UuZGVmYXVsdEludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoNDAyTEwsIG1lc3NhZ2UuZGVmYXVsdEludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoNDAzVSwgbWVzc2FnZS5kZWZhdWx0VWludDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoNDA0VUxMLCBtZXNzYWdlLmRlZmF1bHRVaW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbCg0MDUsIG1lc3NhZ2UuZGVmYXVsdFNpbnQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDQwNkxMLCBtZXNzYWdlLmRlZmF1bHRTaW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbCg0MDdVLCBtZXNzYWdlLmRlZmF1bHRGaXhlZDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoNDA4VUxMLCBtZXNzYWdlLmRlZmF1bHRGaXhlZDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoNDA5LCBtZXNzYWdlLmRlZmF1bHRTZml4ZWQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDQxMExMLCBtZXNzYWdlLmRlZmF1bHRTZml4ZWQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDQxMS4wZiwgbWVzc2FnZS5kZWZhdWx0RmxvYXQsIDAuMSk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDQxMi4wLCBtZXNzYWdlLmRlZmF1bHREb3VibGUsIDAuMSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuZGVmYXVsdEJvb2wpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCI0MTUiLCBtZXNzYWdlLmRlZmF1bHRTdHJpbmcpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW05TRGF0YSBncGJ0dV9kYXRhV2l0aFVpbnQzMjo0MTZdLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5kZWZhdWx0Qnl0ZXMpOwotCi0gIFhDVEFzc2VydEVxdWFsKFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZvbywgbWVzc2FnZS5kZWZhdWx0TmVzdGVkRW51bSk7Ci0gIFhDVEFzc2VydEVxdWFsKEZvcmVpZ25FbnVtX0ZvcmVpZ25Gb28sIG1lc3NhZ2UuZGVmYXVsdEZvcmVpZ25FbnVtKTsKLSAgWENUQXNzZXJ0RXF1YWwoSW1wb3J0RW51bV9JbXBvcnRGb28sIG1lc3NhZ2UuZGVmYXVsdEltcG9ydEVudW0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIjQyNCIsIG1lc3NhZ2UuZGVmYXVsdFN0cmluZ1BpZWNlKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiNDI1IiwgbWVzc2FnZS5kZWZhdWx0Q29yZCk7Ci19Ci0KLS0gKHZvaWQpc2V0QWxsRmllbGRzOihUZXN0QWxsVHlwZXMgKiltZXNzYWdlIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50IHsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxJbnQzMjoxMDFdOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEludDY0OjEwMl07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsVWludDMyOjEwM107Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsVWludDY0OjEwNF07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsU2ludDMyOjEwNV07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsU2ludDY0OjEwNl07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsRml4ZWQzMjoxMDddOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEZpeGVkNjQ6MTA4XTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxTZml4ZWQzMjoxMDldOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbFNmaXhlZDY0OjExMF07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsRmxvYXQ6MTExXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxEb3VibGU6MTEyXTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxCb29sOllFU107Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsU3RyaW5nOkAiMTE1Il07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsQnl0ZXM6W05TRGF0YSBncGJ0dV9kYXRhV2l0aEVtYmVkZGVkTnVsbHNdXTsKLQotICBUZXN0QWxsVHlwZXNfT3B0aW9uYWxHcm91cCAqYWxsVHlwZXMgPSBbVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAgbWVzc2FnZV07Ci0gIFthbGxUeXBlcyBzZXRBOjExN107Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsR3JvdXA6YWxsVHlwZXNdOwotICBUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZSAqbmVzdGVkTWVzc2FnZSA9Ci0gICAgICBbVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtuZXN0ZWRNZXNzYWdlIHNldEJiOjExOF07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZTpuZXN0ZWRNZXNzYWdlXTsKLSAgRm9yZWlnbk1lc3NhZ2UgKmZvcmVpZ25NZXNzYWdlID0gW0ZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VdOwotICBbZm9yZWlnbk1lc3NhZ2Ugc2V0QzoxMTldOwotICBbbWVzc2FnZSBzZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlOmZvcmVpZ25NZXNzYWdlXTsKLSAgSW1wb3J0TWVzc2FnZSAqaW1wb3J0TWVzc2FnZSA9IFtJbXBvcnRNZXNzYWdlIG1lc3NhZ2VdOwotICBbaW1wb3J0TWVzc2FnZSBzZXREOjEyMF07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsSW1wb3J0TWVzc2FnZTppbXBvcnRNZXNzYWdlXTsKLQotICBbbWVzc2FnZSBzZXRPcHRpb25hbE5lc3RlZEVudW06VGVzdEFsbFR5cGVzX05lc3RlZEVudW1fQmF6XTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxGb3JlaWduRW51bTpGb3JlaWduRW51bV9Gb3JlaWduQmF6XTsKLSAgW21lc3NhZ2Ugc2V0T3B0aW9uYWxJbXBvcnRFbnVtOkltcG9ydEVudW1fSW1wb3J0QmF6XTsKLQotICBbbWVzc2FnZSBzZXRPcHRpb25hbFN0cmluZ1BpZWNlOkAiMTI0Il07Ci0gIFttZXNzYWdlIHNldE9wdGlvbmFsQ29yZDpAIjEyNSJdOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBbbWVzc2FnZS5yZXBlYXRlZEludDMyQXJyYXkgYWRkVmFsdWU6MjAxICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5IGFkZFZhbHVlOjIwMiArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkVWludDMyQXJyYXkgYWRkVmFsdWU6MjAzICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWRVaW50NjRBcnJheSBhZGRWYWx1ZToyMDQgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5yZXBlYXRlZFNpbnQzMkFycmF5IGFkZFZhbHVlOjIwNSArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkU2ludDY0QXJyYXkgYWRkVmFsdWU6MjA2ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWRGaXhlZDMyQXJyYXkgYWRkVmFsdWU6MjA3ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWRGaXhlZDY0QXJyYXkgYWRkVmFsdWU6MjA4ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWRTZml4ZWQzMkFycmF5IGFkZFZhbHVlOjIwOSArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkU2ZpeGVkNjRBcnJheSBhZGRWYWx1ZToyMTAgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5yZXBlYXRlZEZsb2F0QXJyYXkgYWRkVmFsdWU6MjExICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWREb3VibGVBcnJheSBhZGRWYWx1ZToyMTIgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5yZXBlYXRlZEJvb2xBcnJheSBhZGRWYWx1ZTooaSAlIDIpXTsKLSAgICBOU1N0cmluZyAqc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIxNSArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXkgYWRkT2JqZWN0OnN0cmluZ107Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLQotICAgIE5TRGF0YSAqZGF0YSA9IFtbTlNEYXRhIGFsbG9jXSBpbml0V2l0aFVpbnQzMl9ncGJ0dToyMTYgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5yZXBlYXRlZEJ5dGVzQXJyYXkgYWRkT2JqZWN0OmRhdGFdOwotICAgIFtkYXRhIHJlbGVhc2VdOwotCi0gICAgVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXAgKnRlc3RBbGwgPQotICAgICAgICBbW1Rlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwIGFsbG9jXSBpbml0XTsKLSAgICBbdGVzdEFsbCBzZXRBOjIxNyArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkR3JvdXBBcnJheSBhZGRPYmplY3Q6dGVzdEFsbF07Ci0gICAgW3Rlc3RBbGwgcmVsZWFzZV07Ci0KLSAgICBuZXN0ZWRNZXNzYWdlID0gW1tUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZSBhbGxvY10gaW5pdF07Ci0gICAgW25lc3RlZE1lc3NhZ2Ugc2V0QmI6MjE4ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWROZXN0ZWRNZXNzYWdlQXJyYXkgYWRkT2JqZWN0Om5lc3RlZE1lc3NhZ2VdOwotICAgIFtuZXN0ZWRNZXNzYWdlIHJlbGVhc2VdOwotCi0gICAgZm9yZWlnbk1lc3NhZ2UgPSBbW0ZvcmVpZ25NZXNzYWdlIGFsbG9jXSBpbml0XTsKLSAgICBbZm9yZWlnbk1lc3NhZ2Ugc2V0QzoyMTkgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXkgYWRkT2JqZWN0OmZvcmVpZ25NZXNzYWdlXTsKLSAgICBbZm9yZWlnbk1lc3NhZ2UgcmVsZWFzZV07Ci0KLSAgICBpbXBvcnRNZXNzYWdlID0gW1tJbXBvcnRNZXNzYWdlIGFsbG9jXSBpbml0XTsKLSAgICBbaW1wb3J0TWVzc2FnZSBzZXREOjIyMCArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5IGFkZE9iamVjdDppbXBvcnRNZXNzYWdlXTsKLSAgICBbaW1wb3J0TWVzc2FnZSByZWxlYXNlXTsKLQotICAgIFttZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bUFycmF5IGFkZFZhbHVlOihpICUgMikgPyBUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXIgOiBUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXpdOwotCi0gICAgW21lc3NhZ2UucmVwZWF0ZWRGb3JlaWduRW51bUFycmF5IGFkZFZhbHVlOihpICUgMikgPyBGb3JlaWduRW51bV9Gb3JlaWduQmFyIDogRm9yZWlnbkVudW1fRm9yZWlnbkJhel07Ci0gICAgW21lc3NhZ2UucmVwZWF0ZWRJbXBvcnRFbnVtQXJyYXkgYWRkVmFsdWU6KGkgJSAyKSA/IEltcG9ydEVudW1fSW1wb3J0QmFyIDogSW1wb3J0RW51bV9JbXBvcnRCYXpdOwotCi0gICAgc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIyNCArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkU3RyaW5nUGllY2VBcnJheSBhZGRPYmplY3Q6c3RyaW5nXTsKLSAgICBbc3RyaW5nIHJlbGVhc2VdOwotCi0gICAgc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIyNSArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLnJlcGVhdGVkQ29yZEFycmF5IGFkZE9iamVjdDpzdHJpbmddOwotICAgIFtzdHJpbmcgcmVsZWFzZV07Ci0gIH0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBtZXNzYWdlLmRlZmF1bHRJbnQzMiA9IDQwMTsKLSAgbWVzc2FnZS5kZWZhdWx0SW50NjQgPSA0MDI7Ci0gIG1lc3NhZ2UuZGVmYXVsdFVpbnQzMiA9IDQwMzsKLSAgbWVzc2FnZS5kZWZhdWx0VWludDY0ID0gNDA0OwotICBtZXNzYWdlLmRlZmF1bHRTaW50MzIgPSA0MDU7Ci0gIG1lc3NhZ2UuZGVmYXVsdFNpbnQ2NCA9IDQwNjsKLSAgbWVzc2FnZS5kZWZhdWx0Rml4ZWQzMiA9IDQwNzsKLSAgbWVzc2FnZS5kZWZhdWx0Rml4ZWQ2NCA9IDQwODsKLSAgbWVzc2FnZS5kZWZhdWx0U2ZpeGVkMzIgPSA0MDk7Ci0gIG1lc3NhZ2UuZGVmYXVsdFNmaXhlZDY0ID0gNDEwOwotICBtZXNzYWdlLmRlZmF1bHRGbG9hdCA9IDQxMTsKLSAgbWVzc2FnZS5kZWZhdWx0RG91YmxlID0gNDEyOwotICBtZXNzYWdlLmRlZmF1bHRCb29sID0gTk87Ci0gIG1lc3NhZ2UuZGVmYXVsdFN0cmluZyA9IEAiNDE1IjsKLSAgbWVzc2FnZS5kZWZhdWx0Qnl0ZXMgPSBbTlNEYXRhIGdwYnR1X2RhdGFXaXRoVWludDMyOjQxNl07Ci0KLSAgbWVzc2FnZS5kZWZhdWx0TmVzdGVkRW51bSA9IFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZvbzsKLSAgbWVzc2FnZS5kZWZhdWx0Rm9yZWlnbkVudW0gPSBGb3JlaWduRW51bV9Gb3JlaWduRm9vOwotICBtZXNzYWdlLmRlZmF1bHRJbXBvcnRFbnVtID0gSW1wb3J0RW51bV9JbXBvcnRGb287Ci0KLSAgbWVzc2FnZS5kZWZhdWx0U3RyaW5nUGllY2UgPSBAIjQyNCI7Ci0gIG1lc3NhZ2UuZGVmYXVsdENvcmQgPSBAIjQyNSI7Ci19Ci0KLS0gKHZvaWQpY2xlYXJBbGxGaWVsZHM6KFRlc3RBbGxUeXBlcyAqKW1lc3NhZ2UgewotICBtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbEludDY0ID0gTk87Ci0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50MzIgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbFVpbnQ2NCA9IE5POwotICBtZXNzYWdlLmhhc09wdGlvbmFsU2ludDMyID0gTk87Ci0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50NjQgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkMzIgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkNjQgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbFNmaXhlZDMyID0gTk87Ci0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQ2NCA9IE5POwotICBtZXNzYWdlLmhhc09wdGlvbmFsRmxvYXQgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbERvdWJsZSA9IE5POwotICBtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCA9IE5POwotICBtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nID0gTk87Ci0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxCeXRlcyA9IE5POwotCi0gIG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCA9IE5POwotICBtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkTWVzc2FnZSA9IE5POwotICBtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgPSBOTzsKLQotICBtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkRW51bSA9IE5POwotICBtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbkVudW0gPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydEVudW0gPSBOTzsKLQotICBtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nUGllY2UgPSBOTzsKLSAgbWVzc2FnZS5oYXNPcHRpb25hbENvcmQgPSBOTzsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFttZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheSByZW1vdmVBbGxdOwotICBbbWVzc2FnZS5yZXBlYXRlZEludDY0QXJyYXkgcmVtb3ZlQWxsXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRVaW50MzJBcnJheSByZW1vdmVBbGxdOwotICBbbWVzc2FnZS5yZXBlYXRlZFVpbnQ2NEFycmF5IHJlbW92ZUFsbF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkU2ludDMyQXJyYXkgcmVtb3ZlQWxsXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheSByZW1vdmVBbGxdOwotICBbbWVzc2FnZS5yZXBlYXRlZEZpeGVkMzJBcnJheSByZW1vdmVBbGxdOwotICBbbWVzc2FnZS5yZXBlYXRlZEZpeGVkNjRBcnJheSByZW1vdmVBbGxdOwotICBbbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDMyQXJyYXkgcmVtb3ZlQWxsXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRTZml4ZWQ2NEFycmF5IHJlbW92ZUFsbF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkRmxvYXRBcnJheSByZW1vdmVBbGxdOwotICBbbWVzc2FnZS5yZXBlYXRlZERvdWJsZUFycmF5IHJlbW92ZUFsbF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkQm9vbEFycmF5IHJlbW92ZUFsbF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXkgcmVtb3ZlQWxsT2JqZWN0c107Ci0gIFttZXNzYWdlLnJlcGVhdGVkQnl0ZXNBcnJheSByZW1vdmVBbGxPYmplY3RzXTsKLQotICBbbWVzc2FnZS5yZXBlYXRlZEdyb3VwQXJyYXkgcmVtb3ZlQWxsT2JqZWN0c107Ci0gIFttZXNzYWdlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUFycmF5IHJlbW92ZUFsbE9iamVjdHNdOwotICBbbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXkgcmVtb3ZlQWxsT2JqZWN0c107Ci0gIFttZXNzYWdlLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5IHJlbW92ZUFsbE9iamVjdHNdOwotCi0gIFttZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bUFycmF5IHJlbW92ZUFsbF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkRm9yZWlnbkVudW1BcnJheSByZW1vdmVBbGxdOwotICBbbWVzc2FnZS5yZXBlYXRlZEltcG9ydEVudW1BcnJheSByZW1vdmVBbGxdOwotCi0gIFttZXNzYWdlLnJlcGVhdGVkU3RyaW5nUGllY2VBcnJheSByZW1vdmVBbGxPYmplY3RzXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRDb3JkQXJyYXkgcmVtb3ZlQWxsT2JqZWN0c107Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBtZXNzYWdlLmhhc0RlZmF1bHRJbnQzMiA9IE5POwotICBtZXNzYWdlLmhhc0RlZmF1bHRJbnQ2NCA9IE5POwotICBtZXNzYWdlLmhhc0RlZmF1bHRVaW50MzIgPSBOTzsKLSAgbWVzc2FnZS5oYXNEZWZhdWx0VWludDY0ID0gTk87Ci0gIG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQzMiA9IE5POwotICBtZXNzYWdlLmhhc0RlZmF1bHRTaW50NjQgPSBOTzsKLSAgbWVzc2FnZS5oYXNEZWZhdWx0Rml4ZWQzMiA9IE5POwotICBtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDY0ID0gTk87Ci0gIG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDMyID0gTk87Ci0gIG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDY0ID0gTk87Ci0gIG1lc3NhZ2UuaGFzRGVmYXVsdEZsb2F0ID0gTk87Ci0gIG1lc3NhZ2UuaGFzRGVmYXVsdERvdWJsZSA9IE5POwotICBtZXNzYWdlLmhhc0RlZmF1bHRCb29sID0gTk87Ci0gIG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZyA9IE5POwotICBtZXNzYWdlLmhhc0RlZmF1bHRCeXRlcyA9IE5POwotCi0gIG1lc3NhZ2UuaGFzRGVmYXVsdE5lc3RlZEVudW0gPSBOTzsKLSAgbWVzc2FnZS5oYXNEZWZhdWx0Rm9yZWlnbkVudW0gPSBOTzsKLSAgbWVzc2FnZS5oYXNEZWZhdWx0SW1wb3J0RW51bSA9IE5POwotCi0gIG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZ1BpZWNlID0gTk87Ci0gIG1lc3NhZ2UuaGFzRGVmYXVsdENvcmQgPSBOTzsKLX0KLQotLSAodm9pZClzZXRBbGxFeHRlbnNpb25zOihUZXN0QWxsRXh0ZW5zaW9ucyAqKW1lc3NhZ2UKLSAgICAgICAgICAgcmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQgewotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEludDMyRXh0ZW5zaW9uXSB2YWx1ZTpAMTAxXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbnQ2NEV4dGVuc2lvbl0gdmFsdWU6QDEwMkxdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFVpbnQzMkV4dGVuc2lvbl0gdmFsdWU6QDEwM107Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsVWludDY0RXh0ZW5zaW9uXSB2YWx1ZTpAMTA0TF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uXSB2YWx1ZTpAMTA1XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTaW50NjRFeHRlbnNpb25dIHZhbHVlOkAxMDZMXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uXSB2YWx1ZTpAMTA3XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uXSB2YWx1ZTpAMTA4TF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25dIHZhbHVlOkAxMDldOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uXSB2YWx1ZTpAMTEwTF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRmxvYXRFeHRlbnNpb25dIHZhbHVlOkAxMTEuMGZdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbERvdWJsZUV4dGVuc2lvbl0gdmFsdWU6QDExMi4wXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxCb29sRXh0ZW5zaW9uXSB2YWx1ZTpAWUVTXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdFeHRlbnNpb25dIHZhbHVlOkAiMTE1Il07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpbTlNEYXRhIGdwYnR1X2RhdGFXaXRoRW1iZWRkZWROdWxsc11dOwotCi0gIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uICpvcHRpb25hbEdyb3VwID0gW09wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uIG1lc3NhZ2VdOwotICBbb3B0aW9uYWxHcm91cCBzZXRBOjExN107Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpvcHRpb25hbEdyb3VwXTsKLSAgVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgKm5lc3RlZE1lc3NhZ2UgPQotICAgICAgW1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlIG1lc3NhZ2VdOwotICBbbmVzdGVkTWVzc2FnZSBzZXRCYjoxMThdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpuZXN0ZWRNZXNzYWdlXTsKLSAgRm9yZWlnbk1lc3NhZ2UgKmZvcmVpZ25NZXNzYWdlID0gW0ZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VdOwotICBbZm9yZWlnbk1lc3NhZ2Ugc2V0QzoxMTldOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6Zm9yZWlnbk1lc3NhZ2VdOwotICBJbXBvcnRNZXNzYWdlICppbXBvcnRNZXNzYWdlID0gW0ltcG9ydE1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtpbXBvcnRNZXNzYWdlIHNldEQ6MTIwXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6aW1wb3J0TWVzc2FnZV07Ci0KLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6QChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXopXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIHZhbHVlOkAoRm9yZWlnbkVudW1fRm9yZWlnbkJheildOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpAKEltcG9ydEVudW1fSW1wb3J0QmF6KV07Ci0KLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIHZhbHVlOkAiMTI0Il07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsQ29yZEV4dGVuc2lvbl0gdmFsdWU6QCIxMjUiXTsKLQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoMjAxICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50NjRFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoMjAyICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDIwMyArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCgyMDQgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTaW50MzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoMjA1ICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDIwNiArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoMjA3ICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCgyMDggKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCgyMDkgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCgyMTAgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGbG9hdEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCgyMTEgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWREb3VibGVFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoMjEyICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQm9vbEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCgoaSAlIDIpID8gWUVTIDogTk8pXTsKLSAgICBOU1N0cmluZyAqc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIxNSArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uXSB2YWx1ZTpzdHJpbmddOwotICAgIFtzdHJpbmcgcmVsZWFzZV07Ci0gICAgTlNEYXRhICpkYXRhID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoVWludDMyX2dwYnR1OjIxNiArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25dIHZhbHVlOmRhdGFdOwotICAgIFtkYXRhIHJlbGVhc2VdOwotCi0gICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gKnJlcGVhdGVkR3JvdXAgPQotICAgICAgICBbW1JlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uIGFsbG9jXSBpbml0XTsKLSAgICBbcmVwZWF0ZWRHcm91cCBzZXRBOjIxNyArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkR3JvdXBFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOnJlcGVhdGVkR3JvdXBdOwotICAgIFtyZXBlYXRlZEdyb3VwIHJlbGVhc2VdOwotICAgIG5lc3RlZE1lc3NhZ2UgPSBbW1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlIGFsbG9jXSBpbml0XTsKLSAgICBbbmVzdGVkTWVzc2FnZSBzZXRCYjoyMTggKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOm5lc3RlZE1lc3NhZ2VdOwotICAgIFtuZXN0ZWRNZXNzYWdlIHJlbGVhc2VdOwotICAgIGZvcmVpZ25NZXNzYWdlID0gW1tGb3JlaWduTWVzc2FnZSBhbGxvY10gaW5pdF07Ci0gICAgW2ZvcmVpZ25NZXNzYWdlIHNldEM6MjE5ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6Zm9yZWlnbk1lc3NhZ2VdOwotICAgIFtmb3JlaWduTWVzc2FnZSByZWxlYXNlXTsKLSAgICBpbXBvcnRNZXNzYWdlID0gW1tJbXBvcnRNZXNzYWdlIGFsbG9jXSBpbml0XTsKLSAgICBbaW1wb3J0TWVzc2FnZSBzZXREOjIyMCArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6aW1wb3J0TWVzc2FnZV07Ci0gICAgW2ltcG9ydE1lc3NhZ2UgcmVsZWFzZV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKChpICUgMikgPyBUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fQmF6KV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCgoaSAlIDIpID8gRm9yZWlnbkVudW1fRm9yZWlnbkJhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBGb3JlaWduRW51bV9Gb3JlaWduQmF6KV07Ci0gICAgW21lc3NhZ2UKLSAgICAgICAgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgdmFsdWU6QCgoaSAlIDIpID8gSW1wb3J0RW51bV9JbXBvcnRCYXIgOiBJbXBvcnRFbnVtX0ltcG9ydEJheildOwotCi0gICAgc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIyNCArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOnN0cmluZ107Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLQotICAgIHN0cmluZyA9IFtbTlNTdHJpbmcgYWxsb2NdIGluaXRXaXRoRm9ybWF0OkAiJWQiLCAyMjUgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZENvcmRFeHRlbnNpb25dIHZhbHVlOnN0cmluZ107Ci0gICAgW3N0cmluZyByZWxlYXNlXTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEludDMyRXh0ZW5zaW9uXSB2YWx1ZTpANDAxXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEludDY0RXh0ZW5zaW9uXSB2YWx1ZTpANDAyTF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRVaW50MzJFeHRlbnNpb25dIHZhbHVlOkA0MDNdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0VWludDY0RXh0ZW5zaW9uXSB2YWx1ZTpANDA0TF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTaW50MzJFeHRlbnNpb25dIHZhbHVlOkA0MDVdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U2ludDY0RXh0ZW5zaW9uXSB2YWx1ZTpANDA2TF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uXSB2YWx1ZTpANDA3XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25dIHZhbHVlOkA0MDhMXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uXSB2YWx1ZTpANDA5XTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uXSB2YWx1ZTpANDEwTF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRGbG9hdEV4dGVuc2lvbl0gdmFsdWU6QDQxMS4wZl07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHREb3VibGVFeHRlbnNpb25dIHZhbHVlOkA0MTIuMF07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRCb29sRXh0ZW5zaW9uXSB2YWx1ZTpATk9dOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uXSB2YWx1ZTpAIjQxNSJdOwotICBbbWVzc2FnZSBzZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Qnl0ZXNFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICB2YWx1ZTpbTlNEYXRhIGdwYnR1X2RhdGFXaXRoVWludDMyOjQxNl1dOwotCi0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6QChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9Gb28pXTsKLSAgW21lc3NhZ2Ugc2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6QChGb3JlaWduRW51bV9Gb3JlaWduRm9vKV07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgdmFsdWU6QChJbXBvcnRFbnVtX0ltcG9ydEZvbyldOwotCi0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgIHZhbHVlOkAiNDI0Il07Ci0gIFttZXNzYWdlIHNldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRDb3JkRXh0ZW5zaW9uXSB2YWx1ZTpAIjQyNSJdOwotfQotCi0tICh2b2lkKXNldEFsbE1hcEZpZWxkczooVGVzdE1hcCAqKW1lc3NhZ2UgbnVtRW50cmllczoodWludDMyX3QpY291bnQgewotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7IGkrKykgewotICAgIFttZXNzYWdlLm1hcEludDMySW50MzIgc2V0VmFsdWU6KGkgKyAxKSBmb3JLZXk6MTAwICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UubWFwSW50NjRJbnQ2NCBzZXRWYWx1ZTooaSArIDEpIGZvcktleToxMDEgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5tYXBVaW50MzJVaW50MzIgc2V0VmFsdWU6KGkgKyAxKSBmb3JLZXk6MTAyICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UubWFwVWludDY0VWludDY0IHNldFZhbHVlOihpICsgMSkgZm9yS2V5OjEwMyArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLm1hcFNpbnQzMlNpbnQzMiBzZXRWYWx1ZTooaSArIDEpIGZvcktleToxMDQgKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5tYXBTaW50NjRTaW50NjQgc2V0VmFsdWU6KGkgKyAxKSBmb3JLZXk6MTA1ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UubWFwRml4ZWQzMkZpeGVkMzIgc2V0VmFsdWU6KGkgKyAxKSBmb3JLZXk6MTA2ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UubWFwRml4ZWQ2NEZpeGVkNjQgc2V0VmFsdWU6KGkgKyAxKSBmb3JLZXk6MTA3ICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UubWFwU2ZpeGVkMzJTZml4ZWQzMiBzZXRWYWx1ZTooaSArIDEpIGZvcktleToxMDggKyBpICogMTAwXTsKLSAgICBbbWVzc2FnZS5tYXBTZml4ZWQ2NFNmaXhlZDY0IHNldFZhbHVlOihpICsgMSkgZm9yS2V5OjEwOSArIGkgKiAxMDBdOwotICAgIFttZXNzYWdlLm1hcEludDMyRmxvYXQgc2V0VmFsdWU6KGkgKyAxKSBmb3JLZXk6MTEwICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UubWFwSW50MzJEb3VibGUgc2V0VmFsdWU6KGkgKyAxKSBmb3JLZXk6MTExICsgaSAqIDEwMF07Ci0gICAgW21lc3NhZ2UubWFwQm9vbEJvb2wgc2V0VmFsdWU6KChpICUgMikgPT0gMSkgZm9yS2V5OigoaSAlIDIpID09IDApXTsKLQotICAgIE5TU3RyaW5nICprZXlTdHIgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIiVkIiwgMTEyICsgaSAqIDEwMF07Ci0gICAgTlNTdHJpbmcgKmRhdGFTdHIgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aEZvcm1hdDpAIiVkIiwgaSArIDFdOwotICAgIFttZXNzYWdlLm1hcFN0cmluZ1N0cmluZyBzZXRPYmplY3Q6ZGF0YVN0ciBmb3JLZXk6a2V5U3RyXTsKLSAgICBba2V5U3RyIHJlbGVhc2VdOwotICAgIFtkYXRhU3RyIHJlbGVhc2VdOwotCi0gICAgTlNEYXRhICpkYXRhID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoVWludDMyX2dwYnR1OmkgKyAxXTsKLSAgICBbbWVzc2FnZS5tYXBJbnQzMkJ5dGVzIHNldE9iamVjdDpkYXRhIGZvcktleToxMTMgKyBpICogMTAwXTsKLSAgICBbZGF0YSByZWxlYXNlXTsKLQotICAgIFttZXNzYWdlLm1hcEludDMyRW51bQotICAgICAgICBzZXRWYWx1ZTooaSAlIDIpID8gTWFwRW51bV9NYXBFbnVtQmFyIDogTWFwRW51bV9NYXBFbnVtQmF6Ci0gICAgICAgICAgZm9yS2V5OjExNCArIGkgKiAxMDBdOwotCi0gICAgRm9yZWlnbk1lc3NhZ2UgKnN1Yk1zZyA9IFtbRm9yZWlnbk1lc3NhZ2UgYWxsb2NdIGluaXRdOwotICAgIHN1Yk1zZy5jID0gaSArIDE7Ci0gICAgW21lc3NhZ2UubWFwSW50MzJGb3JlaWduTWVzc2FnZSBzZXRPYmplY3Q6c3ViTXNnIGZvcktleToxMTUgKyBpICogMTAwXTsKLSAgICBbc3ViTXNnIHJlbGVhc2VdOwotICB9Ci19Ci0KLS0gKHZvaWQpc2V0QWxsVGVzdFBhY2tlZEZpZWxkczooVGVzdFBhY2tlZFR5cGVzICopbWVzc2FnZSB7Ci0gIC8vIE11c3QgbWF0Y2ggLXNldEFsbFRlc3RVbnBhY2tlZEZpZWxkczoKLSAgW21lc3NhZ2UucGFja2VkSW50MzJBcnJheSBhZGRWYWx1ZToxMDFdOwotICBbbWVzc2FnZS5wYWNrZWRJbnQ2NEFycmF5IGFkZFZhbHVlOjEwMl07Ci0gIFttZXNzYWdlLnBhY2tlZFVpbnQzMkFycmF5IGFkZFZhbHVlOjEwM107Ci0gIFttZXNzYWdlLnBhY2tlZFVpbnQ2NEFycmF5IGFkZFZhbHVlOjEwNF07Ci0gIFttZXNzYWdlLnBhY2tlZFNpbnQzMkFycmF5IGFkZFZhbHVlOjEwNV07Ci0gIFttZXNzYWdlLnBhY2tlZFNpbnQ2NEFycmF5IGFkZFZhbHVlOjEwNl07Ci0gIFttZXNzYWdlLnBhY2tlZEZpeGVkMzJBcnJheSBhZGRWYWx1ZToxMDddOwotICBbbWVzc2FnZS5wYWNrZWRGaXhlZDY0QXJyYXkgYWRkVmFsdWU6MTA4XTsKLSAgW21lc3NhZ2UucGFja2VkU2ZpeGVkMzJBcnJheSBhZGRWYWx1ZToxMDldOwotICBbbWVzc2FnZS5wYWNrZWRTZml4ZWQ2NEFycmF5IGFkZFZhbHVlOjExMF07Ci0gIFttZXNzYWdlLnBhY2tlZEZsb2F0QXJyYXkgYWRkVmFsdWU6MTExLmZdOwotICBbbWVzc2FnZS5wYWNrZWREb3VibGVBcnJheSBhZGRWYWx1ZToxMTIuXTsKLSAgW21lc3NhZ2UucGFja2VkQm9vbEFycmF5IGFkZFZhbHVlOllFU107Ci0gIFttZXNzYWdlLnBhY2tlZEVudW1BcnJheSBhZGRWYWx1ZTpGb3JlaWduRW51bV9Gb3JlaWduQmFyXTsKLQotICBbbWVzc2FnZS5wYWNrZWRJbnQzMkFycmF5IGFkZFZhbHVlOjIwMV07Ci0gIFttZXNzYWdlLnBhY2tlZEludDY0QXJyYXkgYWRkVmFsdWU6MzAyXTsKLSAgW21lc3NhZ2UucGFja2VkVWludDMyQXJyYXkgYWRkVmFsdWU6MjAzXTsKLSAgW21lc3NhZ2UucGFja2VkVWludDY0QXJyYXkgYWRkVmFsdWU6MjA0XTsKLSAgW21lc3NhZ2UucGFja2VkU2ludDMyQXJyYXkgYWRkVmFsdWU6MjA1XTsKLSAgW21lc3NhZ2UucGFja2VkU2ludDY0QXJyYXkgYWRkVmFsdWU6MjA2XTsKLSAgW21lc3NhZ2UucGFja2VkRml4ZWQzMkFycmF5IGFkZFZhbHVlOjIwN107Ci0gIFttZXNzYWdlLnBhY2tlZEZpeGVkNjRBcnJheSBhZGRWYWx1ZToyMDhdOwotICBbbWVzc2FnZS5wYWNrZWRTZml4ZWQzMkFycmF5IGFkZFZhbHVlOjIwOV07Ci0gIFttZXNzYWdlLnBhY2tlZFNmaXhlZDY0QXJyYXkgYWRkVmFsdWU6MjEwXTsKLSAgW21lc3NhZ2UucGFja2VkRmxvYXRBcnJheSBhZGRWYWx1ZToyMTEuZl07Ci0gIFttZXNzYWdlLnBhY2tlZERvdWJsZUFycmF5IGFkZFZhbHVlOjIxMi5dOwotICBbbWVzc2FnZS5wYWNrZWRCb29sQXJyYXkgYWRkVmFsdWU6Tk9dOwotICBbbWVzc2FnZS5wYWNrZWRFbnVtQXJyYXkgYWRkVmFsdWU6Rm9yZWlnbkVudW1fRm9yZWlnbkJhel07Ci19Ci0KLS0gKHZvaWQpc2V0QWxsVGVzdFVucGFja2VkRmllbGRzOihUZXN0VW5wYWNrZWRUeXBlcyAqKW1lc3NhZ2UgewotICAvLyBNdXN0IG1hdGNoIC1zZXRBbGxUZXN0UGFja2VkRmllbGRzOgotICBbbWVzc2FnZS51bnBhY2tlZEludDMyQXJyYXkgYWRkVmFsdWU6MTAxXTsKLSAgW21lc3NhZ2UudW5wYWNrZWRJbnQ2NEFycmF5IGFkZFZhbHVlOjEwMl07Ci0gIFttZXNzYWdlLnVucGFja2VkVWludDMyQXJyYXkgYWRkVmFsdWU6MTAzXTsKLSAgW21lc3NhZ2UudW5wYWNrZWRVaW50NjRBcnJheSBhZGRWYWx1ZToxMDRdOwotICBbbWVzc2FnZS51bnBhY2tlZFNpbnQzMkFycmF5IGFkZFZhbHVlOjEwNV07Ci0gIFttZXNzYWdlLnVucGFja2VkU2ludDY0QXJyYXkgYWRkVmFsdWU6MTA2XTsKLSAgW21lc3NhZ2UudW5wYWNrZWRGaXhlZDMyQXJyYXkgYWRkVmFsdWU6MTA3XTsKLSAgW21lc3NhZ2UudW5wYWNrZWRGaXhlZDY0QXJyYXkgYWRkVmFsdWU6MTA4XTsKLSAgW21lc3NhZ2UudW5wYWNrZWRTZml4ZWQzMkFycmF5IGFkZFZhbHVlOjEwOV07Ci0gIFttZXNzYWdlLnVucGFja2VkU2ZpeGVkNjRBcnJheSBhZGRWYWx1ZToxMTBdOwotICBbbWVzc2FnZS51bnBhY2tlZEZsb2F0QXJyYXkgYWRkVmFsdWU6MTExLmZdOwotICBbbWVzc2FnZS51bnBhY2tlZERvdWJsZUFycmF5IGFkZFZhbHVlOjExMi5dOwotICBbbWVzc2FnZS51bnBhY2tlZEJvb2xBcnJheSBhZGRWYWx1ZTpZRVNdOwotICBbbWVzc2FnZS51bnBhY2tlZEVudW1BcnJheSBhZGRWYWx1ZTpGb3JlaWduRW51bV9Gb3JlaWduQmFyXTsKLQotICBbbWVzc2FnZS51bnBhY2tlZEludDMyQXJyYXkgYWRkVmFsdWU6MjAxXTsKLSAgW21lc3NhZ2UudW5wYWNrZWRJbnQ2NEFycmF5IGFkZFZhbHVlOjMwMl07Ci0gIFttZXNzYWdlLnVucGFja2VkVWludDMyQXJyYXkgYWRkVmFsdWU6MjAzXTsKLSAgW21lc3NhZ2UudW5wYWNrZWRVaW50NjRBcnJheSBhZGRWYWx1ZToyMDRdOwotICBbbWVzc2FnZS51bnBhY2tlZFNpbnQzMkFycmF5IGFkZFZhbHVlOjIwNV07Ci0gIFttZXNzYWdlLnVucGFja2VkU2ludDY0QXJyYXkgYWRkVmFsdWU6MjA2XTsKLSAgW21lc3NhZ2UudW5wYWNrZWRGaXhlZDMyQXJyYXkgYWRkVmFsdWU6MjA3XTsKLSAgW21lc3NhZ2UudW5wYWNrZWRGaXhlZDY0QXJyYXkgYWRkVmFsdWU6MjA4XTsKLSAgW21lc3NhZ2UudW5wYWNrZWRTZml4ZWQzMkFycmF5IGFkZFZhbHVlOjIwOV07Ci0gIFttZXNzYWdlLnVucGFja2VkU2ZpeGVkNjRBcnJheSBhZGRWYWx1ZToyMTBdOwotICBbbWVzc2FnZS51bnBhY2tlZEZsb2F0QXJyYXkgYWRkVmFsdWU6MjExLmZdOwotICBbbWVzc2FnZS51bnBhY2tlZERvdWJsZUFycmF5IGFkZFZhbHVlOjIxMi5dOwotICBbbWVzc2FnZS51bnBhY2tlZEJvb2xBcnJheSBhZGRWYWx1ZTpOT107Ci0gIFttZXNzYWdlLnVucGFja2VkRW51bUFycmF5IGFkZFZhbHVlOkZvcmVpZ25FbnVtX0ZvcmVpZ25CYXpdOwotfQotCi0tIChHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5IHsKLSAgcmV0dXJuIFtVbml0dGVzdFJvb3QgZXh0ZW5zaW9uUmVnaXN0cnldOwotfQotCi0tIChUZXN0QWxsVHlwZXMgKilhbGxTZXRSZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudCB7Ci0gIFRlc3RBbGxUeXBlcyAqbWVzc2FnZSA9IFtUZXN0QWxsVHlwZXMgbWVzc2FnZV07Ci0gIFtzZWxmIHNldEFsbEZpZWxkczptZXNzYWdlIHJlcGVhdGVkQ291bnQ6Y291bnRdOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotLSAoVGVzdEFsbEV4dGVuc2lvbnMgKilhbGxFeHRlbnNpb25zU2V0UmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQgewotICBUZXN0QWxsRXh0ZW5zaW9ucyAqbWVzc2FnZSA9IFtUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlXTsKLSAgW3NlbGYgc2V0QWxsRXh0ZW5zaW9uczptZXNzYWdlIHJlcGVhdGVkQ291bnQ6Y291bnRdOwotICByZXR1cm4gbWVzc2FnZTsKLX0KLQotLSAoVGVzdFBhY2tlZFR5cGVzICopcGFja2VkU2V0UmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnQgewotICBUZXN0UGFja2VkVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2VdOwotICBbc2VsZiBzZXRQYWNrZWRGaWVsZHM6bWVzc2FnZSByZXBlYXRlZENvdW50OmNvdW50XTsKLSAgcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLS0gKFRlc3RQYWNrZWRFeHRlbnNpb25zICopcGFja2VkRXh0ZW5zaW9uc1NldFJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50IHsKLSAgVGVzdFBhY2tlZEV4dGVuc2lvbnMgKm1lc3NhZ2UgPSBbVGVzdFBhY2tlZEV4dGVuc2lvbnMgbWVzc2FnZV07Ci0gIFtzZWxmIHNldFBhY2tlZEV4dGVuc2lvbnM6bWVzc2FnZSByZXBlYXRlZENvdW50OmNvdW50XTsKLSAgcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLSAodm9pZClhc3NlcnRDbGVhcjooVGVzdEFsbFR5cGVzICopbWVzc2FnZSB7Ci0gIC8vIGhhc0JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIE5PIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW50NjQpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsVWludDMyKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFVpbnQ2NCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50MzIpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU2ludDY0KTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZpeGVkMzIpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQ2NCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQzMik7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQ2NCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGbG9hdCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxEb3VibGUpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmcpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsQnl0ZXMpOwotCi0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UpOwotCi0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRFbnVtKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25FbnVtKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydEVudW0pOwotCi0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxDb3JkKTsKLQotICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCi0gIFhDVEFzc2VydEVxdWFsKDAsIG1lc3NhZ2Uub3B0aW9uYWxJbnQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDBMTCwgbWVzc2FnZS5vcHRpb25hbEludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2Uub3B0aW9uYWxVaW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbCgwVUxMLCBtZXNzYWdlLm9wdGlvbmFsVWludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbFNpbnQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDBMTCwgbWVzc2FnZS5vcHRpb25hbFNpbnQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLm9wdGlvbmFsRml4ZWQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDBVTEwsIG1lc3NhZ2Uub3B0aW9uYWxGaXhlZDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbFNmaXhlZDMyKTsKLSAgWENUQXNzZXJ0RXF1YWwoMExMLCBtZXNzYWdlLm9wdGlvbmFsU2ZpeGVkNjQpOwotICBYQ1RBc3NlcnRFcXVhbCgwLjBmLCBtZXNzYWdlLm9wdGlvbmFsRmxvYXQpOwotICBYQ1RBc3NlcnRFcXVhbCgwLjAsIG1lc3NhZ2Uub3B0aW9uYWxEb3VibGUpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLm9wdGlvbmFsQm9vbCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLm9wdGlvbmFsU3RyaW5nLCBAIiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5vcHRpb25hbEJ5dGVzLCBHUEJFbXB0eU5TRGF0YSgpKTsKLQotICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEdyb3VwKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSk7Ci0KLSAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KLSAgWENUQXNzZXJ0RXF1YWwoVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fRm9vLCBtZXNzYWdlLm9wdGlvbmFsTmVzdGVkRW51bSk7Ci0gIFhDVEFzc2VydEVxdWFsKEZvcmVpZ25FbnVtX0ZvcmVpZ25Gb28sIG1lc3NhZ2Uub3B0aW9uYWxGb3JlaWduRW51bSk7Ci0gIFhDVEFzc2VydEVxdWFsKEltcG9ydEVudW1fSW1wb3J0Rm9vLCBtZXNzYWdlLm9wdGlvbmFsSW1wb3J0RW51bSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2Uub3B0aW9uYWxTdHJpbmdQaWVjZSwgQCIiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2Uub3B0aW9uYWxDb3JkLCBAIiIpOwotCi0gIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCi0KLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRVaW50MzJBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkVWludDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZFNpbnQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkRml4ZWQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRGaXhlZDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZEZsb2F0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZERvdWJsZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRCb29sQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRCeXRlc0FycmF5LmNvdW50KTsKLQotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZEdyb3VwQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25FbnVtQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZEltcG9ydEVudW1BcnJheS5jb3VudCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRTdHJpbmdQaWVjZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRDb3JkQXJyYXkuY291bnQpOwotCi0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkSW50NjRBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkVWludDMyQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZFVpbnQ2NEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRTaW50MzJBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkU2ludDY0QXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZEZpeGVkMzJBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkRml4ZWQ2NEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRTZml4ZWQzMkFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRTZml4ZWQ2NEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRGbG9hdEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWREb3VibGVBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkQm9vbEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkQnl0ZXNBcnJheV9Db3VudCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRHcm91cEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRNZXNzYWdlQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgbWVzc2FnZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bUFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRGb3JlaWduRW51bUFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIG1lc3NhZ2UucmVwZWF0ZWRJbXBvcnRFbnVtQXJyYXlfQ291bnQpOwotCi0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkU3RyaW5nUGllY2VBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBtZXNzYWdlLnJlcGVhdGVkQ29yZEFycmF5X0NvdW50KTsKLQotICAvLyBoYXNCbGFoKCkgc2hvdWxkIGFsc28gYmUgTk8gZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0SW50MzIpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRJbnQ2NCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQzMik7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQ2NCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQzMik7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQ2NCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZpeGVkMzIpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDY0KTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkMzIpOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTZml4ZWQ2NCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZsb2F0KTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0RG91YmxlKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Qm9vbCk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZyk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEJ5dGVzKTsKLQotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHROZXN0ZWRFbnVtKTsKLSAgWENUQXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Rm9yZWlnbkVudW0pOwotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRJbXBvcnRFbnVtKTsKLQotICBYQ1RBc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmdQaWVjZSk7Ci0gIFhDVEFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdENvcmQpOwotCi0gIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gIFhDVEFzc2VydEVxdWFsKDQxLCBtZXNzYWdlLmRlZmF1bHRJbnQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKDQyTEwsIG1lc3NhZ2UuZGVmYXVsdEludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoNDNVLCBtZXNzYWdlLmRlZmF1bHRVaW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbCg0NFVMTCwgbWVzc2FnZS5kZWZhdWx0VWludDY0KTsKLSAgWENUQXNzZXJ0RXF1YWwoLTQ1LCBtZXNzYWdlLmRlZmF1bHRTaW50MzIpOwotICBYQ1RBc3NlcnRFcXVhbCg0NkxMLCBtZXNzYWdlLmRlZmF1bHRTaW50NjQpOwotICBYQ1RBc3NlcnRFcXVhbCg0N1UsIG1lc3NhZ2UuZGVmYXVsdEZpeGVkMzIpOwotICBYQ1RBc3NlcnRFcXVhbCg0OFVMTCwgbWVzc2FnZS5kZWZhdWx0Rml4ZWQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsKDQ5LCBtZXNzYWdlLmRlZmF1bHRTZml4ZWQzMik7Ci0gIFhDVEFzc2VydEVxdWFsKC01MExMLCBtZXNzYWdlLmRlZmF1bHRTZml4ZWQ2NCk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDUxLjVmLCBtZXNzYWdlLmRlZmF1bHRGbG9hdCwgMC4xKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koNTJlMywgbWVzc2FnZS5kZWZhdWx0RG91YmxlLCAwLjEpOwotICBYQ1RBc3NlcnRUcnVlKG1lc3NhZ2UuZGVmYXVsdEJvb2wpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCJoZWxsbyIsIG1lc3NhZ2UuZGVmYXVsdFN0cmluZyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbTlNEYXRhIGdwYnR1X2RhdGFXaXRoQ1N0cmluZzoid29ybGQiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdEJ5dGVzKTsKLQotICBYQ1RBc3NlcnRFcXVhbChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXIsIG1lc3NhZ2UuZGVmYXVsdE5lc3RlZEVudW0pOwotICBYQ1RBc3NlcnRFcXVhbChGb3JlaWduRW51bV9Gb3JlaWduQmFyLCBtZXNzYWdlLmRlZmF1bHRGb3JlaWduRW51bSk7Ci0gIFhDVEFzc2VydEVxdWFsKEltcG9ydEVudW1fSW1wb3J0QmFyLCBtZXNzYWdlLmRlZmF1bHRJbXBvcnRFbnVtKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCJhYmMiLCBtZXNzYWdlLmRlZmF1bHRTdHJpbmdQaWVjZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIjEyMyIsIG1lc3NhZ2UuZGVmYXVsdENvcmQpOwotfQotCi0tICh2b2lkKWFzc2VydEV4dGVuc2lvbnNDbGVhcjooVGVzdEFsbEV4dGVuc2lvbnMgKiltZXNzYWdlIHsKLSAgLy8gaGFzQmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgTk8gZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCi0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50MzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50NjRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTaW50MzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGbG9hdEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxEb3VibGVFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsQm9vbEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxDb3JkRXh0ZW5zaW9uXV0pOwotCi0gIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KLSAgWENUQXNzZXJ0RXF1YWwoMCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50MzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgwTEwsW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsSW50NjRFeHRlbnNpb25dXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxVaW50MzJFeHRlbnNpb25dXSB1bnNpZ25lZEludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbl1dIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgwLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxTaW50MzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgwTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbl1dIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25dXSB1bnNpZ25lZEludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZpeGVkNjRFeHRlbnNpb25dXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgwTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uXV0gbG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeSgwLjBmLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxGbG9hdEV4dGVuc2lvbl1dIGZsb2F0VmFsdWVdLCAwLjAxKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koMC4wLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxEb3VibGVFeHRlbnNpb25dXSBkb3VibGVWYWx1ZV0sIDAuMDEpOwotICBYQ1RBc3NlcnRGYWxzZShbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxCb29sRXh0ZW5zaW9uXV0gYm9vbFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIiIsIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoR1BCRW1wdHlOU0RhdGEoKSwgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxCeXRlc0V4dGVuc2lvbl1dKTsKLQotICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLQotICBYQ1RBc3NlcnRGYWxzZShbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxHcm91cEV4dGVuc2lvbl1dIGhhc0FdKTsKLSAgWENUQXNzZXJ0RmFsc2UoW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl1dIGhhc0JiXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV0gaGFzQ10pOwotICBYQ1RBc3NlcnRGYWxzZShbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXV0gaGFzRF0pOwotCi0gIFhDVEFzc2VydEVxdWFsKDAsIFsoVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAqKVttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsR3JvdXBFeHRlbnNpb25dXSBhXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDAsIFsoVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UqKVttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbl1dIGJiXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDAsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV0gY10pOwotICBYQ1RBc3NlcnRFcXVhbCgwLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3Qgb3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uXV0gZF0pOwotCi0gIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCi0gIFhDVEFzc2VydEVxdWFsKFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZvbywKLSAgICAgICAgICAgICAgIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbChGb3JlaWduRW51bV9Gb3JlaWduRm9vLAotICAgICAgICAgICAgICAgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbChJbXBvcnRFbnVtX0ltcG9ydEZvbywKLSAgICAgICAgICAgICAgIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIiIsIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAIiIsIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IG9wdGlvbmFsQ29yZEV4dGVuc2lvbl1dKTsKLQotICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50MzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkSW50NjRFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTaW50MzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGbG9hdEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWREb3VibGVFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQm9vbEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25dXSBjb3VudF0pOwotCi0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRHcm91cEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMFUsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCByZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKDBVLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uXV0gY291bnRdKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbCgwVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHJlcGVhdGVkQ29yZEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0KLSAgLy8gaGFzQmxhaCgpIHNob3VsZCBhbHNvIGJlIE5PIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCi0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRJbnQzMkV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEludDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0VWludDMyRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0VWludDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U2ludDMyRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U2ludDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0RmxvYXRFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHREb3VibGVFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRCb29sRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Qnl0ZXNFeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEZhbHNlKFttZXNzYWdlIGhhc0V4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25dXSk7Ci0KLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UgaGFzRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uXV0pOwotICBYQ1RBc3NlcnRGYWxzZShbbWVzc2FnZSBoYXNFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Q29yZEV4dGVuc2lvbl1dKTsKLQotICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgotICBYQ1RBc3NlcnRFcXVhbCggNDEsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0SW50MzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCggNDJMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRJbnQ2NEV4dGVuc2lvbl1dIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoIDQzVSwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRVaW50MzJFeHRlbnNpb25dXSB1bnNpZ25lZEludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKCA0NFVMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRVaW50NjRFeHRlbnNpb25dXSB1bnNpZ25lZExvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoLTQ1LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNpbnQzMkV4dGVuc2lvbl1dIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKCA0NkxMLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbl1dIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoIDQ3LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCggNDhVTEwsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbl1dIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCggNDksIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbCgtNTBMTCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbl1dIGxvbmdMb25nVmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koIDUxLjVmLCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZsb2F0RXh0ZW5zaW9uXV0gZmxvYXRWYWx1ZV0sIDAuMDEpOwotICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeSggNTJlMywgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHREb3VibGVFeHRlbnNpb25dXSBkb3VibGVWYWx1ZV0sIDAuMDEpOwotICBYQ1RBc3NlcnRUcnVlKFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0Qm9vbEV4dGVuc2lvbl1dIGJvb2xWYWx1ZV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCJoZWxsbyIsIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTdHJpbmdFeHRlbnNpb25dXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbTlNEYXRhIGdwYnR1X2RhdGFXaXRoQ1N0cmluZzoid29ybGQiXSwgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uXV0pOwotCi0gIFhDVEFzc2VydEVxdWFsKFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0JhciwKLSAgICAgICAgICAgICAgIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbl1dIGludFZhbHVlXSk7Ci0gIFhDVEFzc2VydEVxdWFsKEZvcmVpZ25FbnVtX0ZvcmVpZ25CYXIsCi0gICAgICAgICAgICAgICBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uXV0gaW50VmFsdWVdKTsKLSAgWENUQXNzZXJ0RXF1YWwoSW1wb3J0RW51bV9JbXBvcnRCYXIsCi0gICAgICAgICAgICAgICBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25dXSBpbnRWYWx1ZV0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAImFiYyIsIFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbl1dKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiMTIzIiwgW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgZGVmYXVsdENvcmRFeHRlbnNpb25dXSk7Ci19Ci0KLS0gKHZvaWQpbW9kaWZ5UmVwZWF0ZWRGaWVsZHM6KFRlc3RBbGxUeXBlcyAqKW1lc3NhZ2UgewotICBbbWVzc2FnZS5yZXBlYXRlZEludDMyQXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZTo1MDFdOwotICBbbWVzc2FnZS5yZXBlYXRlZEludDY0QXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZTo1MDJdOwotICBbbWVzc2FnZS5yZXBlYXRlZFVpbnQzMkFycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6NTAzXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRVaW50NjRBcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjUwNF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkU2ludDMyQXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZTo1MDVdOwotICBbbWVzc2FnZS5yZXBlYXRlZFNpbnQ2NEFycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6NTA2XTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRGaXhlZDMyQXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZTo1MDddOwotICBbbWVzc2FnZS5yZXBlYXRlZEZpeGVkNjRBcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjUwOF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkU2ZpeGVkMzJBcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjUwOV07Ci0gIFttZXNzYWdlLnJlcGVhdGVkU2ZpeGVkNjRBcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjUxMF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkRmxvYXRBcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOjUxMV07Ci0gIFttZXNzYWdlLnJlcGVhdGVkRG91YmxlQXJyYXkgcmVwbGFjZVZhbHVlQXRJbmRleDoxIHdpdGhWYWx1ZTo1MTJdOwotICBbbWVzc2FnZS5yZXBlYXRlZEJvb2xBcnJheSByZXBsYWNlVmFsdWVBdEluZGV4OjEgd2l0aFZhbHVlOllFU107Ci0gIFttZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXkgcmVwbGFjZU9iamVjdEF0SW5kZXg6MSB3aXRoT2JqZWN0OkAiNTE1Il07Ci0KLSAgTlNEYXRhICpkYXRhID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoVWludDMyX2dwYnR1OjUxNl07Ci0gIFttZXNzYWdlLnJlcGVhdGVkQnl0ZXNBcnJheSByZXBsYWNlT2JqZWN0QXRJbmRleDoxIHdpdGhPYmplY3Q6ZGF0YV07Ci0gIFtkYXRhIHJlbGVhc2VdOwotCi0gIFRlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwICp0ZXN0QWxsID0KLSAgICAgIFtbVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXAgYWxsb2NdIGluaXRdOwotICBbdGVzdEFsbCBzZXRBOjUxN107Ci0gIFttZXNzYWdlLnJlcGVhdGVkR3JvdXBBcnJheSByZXBsYWNlT2JqZWN0QXRJbmRleDoxIHdpdGhPYmplY3Q6dGVzdEFsbF07Ci0gIFt0ZXN0QWxsIHJlbGVhc2VdOwotCi0gIFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlICpuZXN0ZWRNZXNzYWdlID0KLSAgICAgIFtbVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgYWxsb2NdIGluaXRdOwotICBbbmVzdGVkTWVzc2FnZSBzZXRCYjo1MThdOwotICBbbWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheSByZXBsYWNlT2JqZWN0QXRJbmRleDoxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoT2JqZWN0Om5lc3RlZE1lc3NhZ2VdOwotICBbbmVzdGVkTWVzc2FnZSByZWxlYXNlXTsKLQotICBGb3JlaWduTWVzc2FnZSAqZm9yZWlnbk1lc3NhZ2UgPSBbW0ZvcmVpZ25NZXNzYWdlIGFsbG9jXSBpbml0XTsKLSAgW2ZvcmVpZ25NZXNzYWdlIHNldEM6NTE5XTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUFycmF5IHJlcGxhY2VPYmplY3RBdEluZGV4OjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXRoT2JqZWN0OmZvcmVpZ25NZXNzYWdlXTsKLSAgW2ZvcmVpZ25NZXNzYWdlIHJlbGVhc2VdOwotCi0gIEltcG9ydE1lc3NhZ2UgKmltcG9ydE1lc3NhZ2UgPSBbW0ltcG9ydE1lc3NhZ2UgYWxsb2NdIGluaXRdOwotICBbaW1wb3J0TWVzc2FnZSBzZXREOjUyMF07Ci0gIFttZXNzYWdlLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5IHJlcGxhY2VPYmplY3RBdEluZGV4OjEKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpdGhPYmplY3Q6aW1wb3J0TWVzc2FnZV07Ci0gIFtpbXBvcnRNZXNzYWdlIHJlbGVhc2VdOwotCi0gIFttZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bUFycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6VGVzdEFsbFR5cGVzX05lc3RlZEVudW1fRm9vXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRGb3JlaWduRW51bUFycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6Rm9yZWlnbkVudW1fRm9yZWlnbkZvb107Ci0gIFttZXNzYWdlLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5IHJlcGxhY2VWYWx1ZUF0SW5kZXg6MSB3aXRoVmFsdWU6SW1wb3J0RW51bV9JbXBvcnRGb29dOwotCi0gIFttZXNzYWdlLnJlcGVhdGVkU3RyaW5nUGllY2VBcnJheSByZXBsYWNlT2JqZWN0QXRJbmRleDoxIHdpdGhPYmplY3Q6QCI1MjQiXTsKLSAgW21lc3NhZ2UucmVwZWF0ZWRDb3JkQXJyYXkgcmVwbGFjZU9iamVjdEF0SW5kZXg6MSB3aXRoT2JqZWN0OkAiNTI1Il07Ci19Ci0KLS0gKHZvaWQpYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZDooVGVzdEFsbFR5cGVzICopbWVzc2FnZQotICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudCB7Ci0gIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAotICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAotICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0KLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRVaW50MzJBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkVWludDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFNpbnQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRml4ZWQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRGaXhlZDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEZsb2F0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZERvdWJsZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRCb29sQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRCeXRlc0FycmF5LmNvdW50KTsKLQotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEdyb3VwQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25FbnVtQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEltcG9ydEVudW1BcnJheS5jb3VudCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTdHJpbmdQaWVjZUFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRDb3JkQXJyYXkuY291bnQpOwotCi0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkSW50NjRBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkVWludDMyQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZFVpbnQ2NEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTaW50MzJBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkU2ludDY0QXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEZpeGVkMzJBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkRml4ZWQ2NEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTZml4ZWQzMkFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTZml4ZWQ2NEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRGbG9hdEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWREb3VibGVBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkQm9vbEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRTdHJpbmdBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkQnl0ZXNBcnJheV9Db3VudCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRHcm91cEFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRNZXNzYWdlQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXlfQ291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkTmVzdGVkRW51bUFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRGb3JlaWduRW51bUFycmF5X0NvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucmVwZWF0ZWRJbXBvcnRFbnVtQXJyYXlfQ291bnQpOwotCi0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkU3RyaW5nUGllY2VBcnJheV9Db3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnJlcGVhdGVkQ29yZEFycmF5X0NvdW50KTsKLQotICBYQ1RBc3NlcnRFcXVhbCgyMDEsIFttZXNzYWdlLnJlcGVhdGVkSW50MzJBcnJheSB2YWx1ZUF0SW5kZXg6MF0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDJMTCwgW21lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5IHZhbHVlQXRJbmRleDowXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIwM1UsIFttZXNzYWdlLnJlcGVhdGVkVWludDMyQXJyYXkgdmFsdWVBdEluZGV4OjBdKTsKLSAgWENUQXNzZXJ0RXF1YWwoMjA0VUxMLCBbbWVzc2FnZS5yZXBlYXRlZFVpbnQ2NEFycmF5IHZhbHVlQXRJbmRleDowXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIwNSwgW21lc3NhZ2UucmVwZWF0ZWRTaW50MzJBcnJheSB2YWx1ZUF0SW5kZXg6MF0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDZMTCwgW21lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheSB2YWx1ZUF0SW5kZXg6MF0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDdVLCBbbWVzc2FnZS5yZXBlYXRlZEZpeGVkMzJBcnJheSB2YWx1ZUF0SW5kZXg6MF0pOwotICBYQ1RBc3NlcnRFcXVhbCgyMDhVTEwsIFttZXNzYWdlLnJlcGVhdGVkRml4ZWQ2NEFycmF5IHZhbHVlQXRJbmRleDowXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIwOSwgW21lc3NhZ2UucmVwZWF0ZWRTZml4ZWQzMkFycmF5IHZhbHVlQXRJbmRleDowXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDIxMExMLCBbbWVzc2FnZS5yZXBlYXRlZFNmaXhlZDY0QXJyYXkgdmFsdWVBdEluZGV4OjBdKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koMjExLjBmLCBbbWVzc2FnZS5yZXBlYXRlZEZsb2F0QXJyYXkgdmFsdWVBdEluZGV4OjBdLCAwLjAxKTsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koMjEyLjAsIFttZXNzYWdlLnJlcGVhdGVkRG91YmxlQXJyYXkgdmFsdWVBdEluZGV4OjBdLCAwLjAxKTsKLSAgWENUQXNzZXJ0RmFsc2UoW21lc3NhZ2UucmVwZWF0ZWRCb29sQXJyYXkgdmFsdWVBdEluZGV4OjBdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiMjE1IiwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5WzBdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtOU0RhdGEgZ3BidHVfZGF0YVdpdGhVaW50MzI6MjE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRCeXRlc0FycmF5WzBdKTsKLQotICBYQ1RBc3NlcnRFcXVhbCgyMTcsICgoVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXAqKW1lc3NhZ2UucmVwZWF0ZWRHcm91cEFycmF5WzBdKS5hKTsKLSAgWENUQXNzZXJ0RXF1YWwoMjE4LCAoKFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlKiltZXNzYWdlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUFycmF5WzBdKS5iYik7Ci0gIFhDVEFzc2VydEVxdWFsKDIxOSwgKChGb3JlaWduTWVzc2FnZSopbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXlbMF0pLmMpOwotICBYQ1RBc3NlcnRFcXVhbCgyMjAsICgoSW1wb3J0TWVzc2FnZSopbWVzc2FnZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheVswXSkuZCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fQmF6LCBbbWVzc2FnZS5yZXBlYXRlZE5lc3RlZEVudW1BcnJheSB2YWx1ZUF0SW5kZXg6MF0pOwotICBYQ1RBc3NlcnRFcXVhbChGb3JlaWduRW51bV9Gb3JlaWduQmF6LCBbbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25FbnVtQXJyYXkgdmFsdWVBdEluZGV4OjBdKTsKLSAgWENUQXNzZXJ0RXF1YWwoSW1wb3J0RW51bV9JbXBvcnRCYXosIFttZXNzYWdlLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5IHZhbHVlQXRJbmRleDowXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiMjI0IiwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ1BpZWNlQXJyYXlbMF0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCIyMjUiLCBtZXNzYWdlLnJlcGVhdGVkQ29yZEFycmF5WzBdKTsKLQotICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KLSAgWENUQXNzZXJ0RXF1YWwoNTAxLCBbbWVzc2FnZS5yZXBlYXRlZEludDMyQXJyYXkgdmFsdWVBdEluZGV4OjFdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTAyTEwsIFttZXNzYWdlLnJlcGVhdGVkSW50NjRBcnJheSB2YWx1ZUF0SW5kZXg6MV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MDNVLCBbbWVzc2FnZS5yZXBlYXRlZFVpbnQzMkFycmF5IHZhbHVlQXRJbmRleDoxXSk7Ci0gIFhDVEFzc2VydEVxdWFsKDUwNFVMTCwgW21lc3NhZ2UucmVwZWF0ZWRVaW50NjRBcnJheSB2YWx1ZUF0SW5kZXg6MV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MDUsIFttZXNzYWdlLnJlcGVhdGVkU2ludDMyQXJyYXkgdmFsdWVBdEluZGV4OjFdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTA2TEwsIFttZXNzYWdlLnJlcGVhdGVkU2ludDY0QXJyYXkgdmFsdWVBdEluZGV4OjFdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTA3VSwgW21lc3NhZ2UucmVwZWF0ZWRGaXhlZDMyQXJyYXkgdmFsdWVBdEluZGV4OjFdKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTA4VUxMLCBbbWVzc2FnZS5yZXBlYXRlZEZpeGVkNjRBcnJheSB2YWx1ZUF0SW5kZXg6MV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MDksIFttZXNzYWdlLnJlcGVhdGVkU2ZpeGVkMzJBcnJheSB2YWx1ZUF0SW5kZXg6MV0pOwotICBYQ1RBc3NlcnRFcXVhbCg1MTBMTCwgW21lc3NhZ2UucmVwZWF0ZWRTZml4ZWQ2NEFycmF5IHZhbHVlQXRJbmRleDoxXSk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDUxMS4wZiwgW21lc3NhZ2UucmVwZWF0ZWRGbG9hdEFycmF5IHZhbHVlQXRJbmRleDoxXSwgMC4wMSk7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KDUxMi4wLCBbbWVzc2FnZS5yZXBlYXRlZERvdWJsZUFycmF5IHZhbHVlQXRJbmRleDoxXSwgMC4wMSk7Ci0gIFhDVEFzc2VydFRydWUoW21lc3NhZ2UucmVwZWF0ZWRCb29sQXJyYXkgdmFsdWVBdEluZGV4OjFdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiNTE1IiwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ0FycmF5WzFdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFtOU0RhdGEgZ3BidHVfZGF0YVdpdGhVaW50MzI6NTE2XSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRCeXRlc0FycmF5WzFdKTsKLQotICBYQ1RBc3NlcnRFcXVhbCg1MTcsICgoVGVzdEFsbFR5cGVzX1JlcGVhdGVkR3JvdXAqKW1lc3NhZ2UucmVwZWF0ZWRHcm91cEFycmF5WzFdKS5hKTsKLSAgWENUQXNzZXJ0RXF1YWwoNTE4LCAoKFRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlKiltZXNzYWdlLnJlcGVhdGVkTmVzdGVkTWVzc2FnZUFycmF5WzFdKS5iYik7Ci0gIFhDVEFzc2VydEVxdWFsKDUxOSwgKChGb3JlaWduTWVzc2FnZSopbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXlbMV0pLmMpOwotICBYQ1RBc3NlcnRFcXVhbCg1MjAsICgoSW1wb3J0TWVzc2FnZSopbWVzc2FnZS5yZXBlYXRlZEltcG9ydE1lc3NhZ2VBcnJheVsxXSkuZCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fRm9vLCBbbWVzc2FnZS5yZXBlYXRlZE5lc3RlZEVudW1BcnJheSB2YWx1ZUF0SW5kZXg6MV0pOwotICBYQ1RBc3NlcnRFcXVhbChGb3JlaWduRW51bV9Gb3JlaWduRm9vLCBbbWVzc2FnZS5yZXBlYXRlZEZvcmVpZ25FbnVtQXJyYXkgdmFsdWVBdEluZGV4OjFdKTsKLSAgWENUQXNzZXJ0RXF1YWwoSW1wb3J0RW51bV9JbXBvcnRGb28sIFttZXNzYWdlLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5IHZhbHVlQXRJbmRleDoxXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAiNTI0IiwgbWVzc2FnZS5yZXBlYXRlZFN0cmluZ1BpZWNlQXJyYXlbMV0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQCI1MjUiLCBtZXNzYWdlLnJlcGVhdGVkQ29yZEFycmF5WzFdKTsKLX0KLQotLSAodm9pZClzZXRQYWNrZWRGaWVsZHM6KFRlc3RQYWNrZWRUeXBlcyAqKW1lc3NhZ2UKLSAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudCB7Ci0gIC8vIE11c3QgbWF0Y2ggLXNldFVucGFja2VkRmllbGRzOnJlcGVhdGVkQ291bnQ6Ci0gIC8vIE11c3QgbWF0Y2ggLXNldFBhY2tlZEV4dGVuc2lvbnM6cmVwZWF0ZWRDb3VudDoKLSAgLy8gTXVzdCBtYXRjaCAtc2V0VW5wYWNrZWRFeHRlbnNpb25zOnJlcGVhdGVkQ291bnQ6Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UucGFja2VkSW50MzJBcnJheSBhZGRWYWx1ZTo2MDEgKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnBhY2tlZEludDY0QXJyYXkgYWRkVmFsdWU6NjAyICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS5wYWNrZWRVaW50MzJBcnJheSBhZGRWYWx1ZTo2MDMgKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnBhY2tlZFVpbnQ2NEFycmF5IGFkZFZhbHVlOjYwNCArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UucGFja2VkU2ludDMyQXJyYXkgYWRkVmFsdWU6NjA1ICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS5wYWNrZWRTaW50NjRBcnJheSBhZGRWYWx1ZTo2MDYgKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnBhY2tlZEZpeGVkMzJBcnJheSBhZGRWYWx1ZTo2MDcgKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnBhY2tlZEZpeGVkNjRBcnJheSBhZGRWYWx1ZTo2MDggKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnBhY2tlZFNmaXhlZDMyQXJyYXkgYWRkVmFsdWU6NjA5ICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS5wYWNrZWRTZml4ZWQ2NEFycmF5IGFkZFZhbHVlOjYxMCArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UucGFja2VkRmxvYXRBcnJheSBhZGRWYWx1ZTo2MTEgKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnBhY2tlZERvdWJsZUFycmF5IGFkZFZhbHVlOjYxMiArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UucGFja2VkQm9vbEFycmF5IGFkZFZhbHVlOihpICUgMikgPyBZRVMgOiBOT107Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS5wYWNrZWRFbnVtQXJyYXkKLSAgICAgICAgYWRkVmFsdWU6KGkgJSAyKSA/IEZvcmVpZ25FbnVtX0ZvcmVpZ25CYXIgOiBGb3JlaWduRW51bV9Gb3JlaWduQmF6XTsKLSAgfQotfQotCi0tICh2b2lkKXNldFVucGFja2VkRmllbGRzOihUZXN0VW5wYWNrZWRUeXBlcyAqKW1lc3NhZ2UKLSAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50IHsKLSAgLy8gTXVzdCBtYXRjaCAtc2V0UGFja2VkRmllbGRzOnJlcGVhdGVkQ291bnQ6Ci0gIC8vIE11c3QgbWF0Y2ggLXNldFBhY2tlZEV4dGVuc2lvbnM6cmVwZWF0ZWRDb3VudDoKLSAgLy8gTXVzdCBtYXRjaCAtc2V0VW5wYWNrZWRFeHRlbnNpb25zOnJlcGVhdGVkQ291bnQ6Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UudW5wYWNrZWRJbnQzMkFycmF5IGFkZFZhbHVlOjYwMSArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UudW5wYWNrZWRJbnQ2NEFycmF5IGFkZFZhbHVlOjYwMiArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UudW5wYWNrZWRVaW50MzJBcnJheSBhZGRWYWx1ZTo2MDMgKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnVucGFja2VkVWludDY0QXJyYXkgYWRkVmFsdWU6NjA0ICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS51bnBhY2tlZFNpbnQzMkFycmF5IGFkZFZhbHVlOjYwNSArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UudW5wYWNrZWRTaW50NjRBcnJheSBhZGRWYWx1ZTo2MDYgKyBpICogMTAwXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnVucGFja2VkRml4ZWQzMkFycmF5IGFkZFZhbHVlOjYwNyArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UudW5wYWNrZWRGaXhlZDY0QXJyYXkgYWRkVmFsdWU6NjA4ICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS51bnBhY2tlZFNmaXhlZDMyQXJyYXkgYWRkVmFsdWU6NjA5ICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS51bnBhY2tlZFNmaXhlZDY0QXJyYXkgYWRkVmFsdWU6NjEwICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS51bnBhY2tlZEZsb2F0QXJyYXkgYWRkVmFsdWU6NjExICsgaSAqIDEwMF07Ci0gIH0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBbbWVzc2FnZS51bnBhY2tlZERvdWJsZUFycmF5IGFkZFZhbHVlOjYxMiArIGkgKiAxMDBdOwotICB9Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgW21lc3NhZ2UudW5wYWNrZWRCb29sQXJyYXkgYWRkVmFsdWU6KGkgJSAyKSA/IFlFUyA6IE5PXTsKLSAgfQotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFttZXNzYWdlLnVucGFja2VkRW51bUFycmF5Ci0gICAgICAgIGFkZFZhbHVlOihpICUgMikgPyBGb3JlaWduRW51bV9Gb3JlaWduQmFyIDogRm9yZWlnbkVudW1fRm9yZWlnbkJhel07Ci0gIH0KLX0KLQotLSAodm9pZClhc3NlcnRQYWNrZWRGaWVsZHNTZXQ6KFRlc3RQYWNrZWRUeXBlcyAqKW1lc3NhZ2UKLSAgICAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudCB7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnBhY2tlZEludDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5wYWNrZWRJbnQ2NEFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucGFja2VkVWludDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5wYWNrZWRVaW50NjRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnBhY2tlZFNpbnQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucGFja2VkU2ludDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5wYWNrZWRGaXhlZDMyQXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5wYWNrZWRGaXhlZDY0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5wYWNrZWRTZml4ZWQzMkFycmF5LmNvdW50KTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIG1lc3NhZ2UucGFja2VkU2ZpeGVkNjRBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnBhY2tlZEZsb2F0QXJyYXkuY291bnQpOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgbWVzc2FnZS5wYWNrZWREb3VibGVBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnBhY2tlZEJvb2xBcnJheS5jb3VudCk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBtZXNzYWdlLnBhY2tlZEVudW1BcnJheS5jb3VudCk7Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoNjAxICsgaSAqIDEwMCksCi0gICAgICAgICAgICAgICAgICAgW21lc3NhZ2UucGFja2VkSW50MzJBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKDYwMiArIGkgKiAxMDAsIFttZXNzYWdlLnBhY2tlZEludDY0QXJyYXkgdmFsdWVBdEluZGV4OmldKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCg2MDMgKyBpICogMTAwLCBbbWVzc2FnZS5wYWNrZWRVaW50MzJBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKDYwNCArIGkgKiAxMDAsIFttZXNzYWdlLnBhY2tlZFVpbnQ2NEFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoNjA1ICsgaSAqIDEwMCksCi0gICAgICAgICAgICAgICAgICAgW21lc3NhZ2UucGFja2VkU2ludDMyQXJyYXkgdmFsdWVBdEluZGV4OmldKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCg2MDYgKyBpICogMTAwLCBbbWVzc2FnZS5wYWNrZWRTaW50NjRBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKDYwNyArIGkgKiAxMDAsIFttZXNzYWdlLnBhY2tlZEZpeGVkMzJBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKDYwOCArIGkgKiAxMDAsIFttZXNzYWdlLnBhY2tlZEZpeGVkNjRBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKChpbnQpKDYwOSArIGkgKiAxMDApLAotICAgICAgICAgICAgICAgICAgIFttZXNzYWdlLnBhY2tlZFNmaXhlZDMyQXJyYXkgdmFsdWVBdEluZGV4OmldKTsKLSAgICBYQ1RBc3NlcnRFcXVhbCg2MTAgKyBpICogMTAwLCBbbWVzc2FnZS5wYWNrZWRTZml4ZWQ2NEFycmF5IHZhbHVlQXRJbmRleDppXSk7Ci0gICAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koNjExICsgaSAqIDEwMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbbWVzc2FnZS5wYWNrZWRGbG9hdEFycmF5IHZhbHVlQXRJbmRleDppXSwgMC4wMSk7Ci0gICAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koCi0gICAgICAgIDYxMiArIGkgKiAxMDAsIFttZXNzYWdlLnBhY2tlZERvdWJsZUFycmF5IHZhbHVlQXRJbmRleDppXSwgMC4wMSk7Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGkgJSAyKSA/IFlFUyA6IE5PLAotICAgICAgICAgICAgICAgICAgIFttZXNzYWdlLnBhY2tlZEJvb2xBcnJheSB2YWx1ZUF0SW5kZXg6aV0pOwotICAgIFhDVEFzc2VydEVxdWFsKChpICUgMikgPyBGb3JlaWduRW51bV9Gb3JlaWduQmFyIDogRm9yZWlnbkVudW1fRm9yZWlnbkJheiwKLSAgICAgICAgICAgICAgICAgICBbbWVzc2FnZS5wYWNrZWRFbnVtQXJyYXkgdmFsdWVBdEluZGV4OmldKTsKLSAgfQotfQotCi0tICh2b2lkKXNldFBhY2tlZEV4dGVuc2lvbnM6KFRlc3RQYWNrZWRFeHRlbnNpb25zICopbWVzc2FnZQotICAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudCB7Ci0gIC8vIE11c3QgbWF0Y2ggLXNldFBhY2tlZEZpZWxkczpyZXBlYXRlZENvdW50OgotICAvLyBNdXN0IG1hdGNoIC1zZXRVbnBhY2tlZEZpZWxkczpyZXBlYXRlZENvdW50OgotICAvLyBNdXN0IG1hdGNoIC1zZXRVbnBhY2tlZEV4dGVuc2lvbnM6cmVwZWF0ZWRDb3VudDoKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRJbnQzMkV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MDEgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkSW50NjRFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjAyICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZFVpbnQzMkV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MDMgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkVWludDY0RXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYwNCArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRTaW50MzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjA1ICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZFNpbnQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MDYgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRml4ZWQzMkV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MDcgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRml4ZWQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MDggKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkU2ZpeGVkMzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjA5ICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYxMCArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRGbG9hdEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MTEgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRG91YmxlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYxMiArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRCb29sRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKChpICUgMikgPyBZRVMgOiBOTyldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZEVudW1FeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoKGkgJSAyKSA/IEZvcmVpZ25FbnVtX0ZvcmVpZ25CYXIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogRm9yZWlnbkVudW1fRm9yZWlnbkJheildOwotICB9Ci19Ci0KLS0gKHZvaWQpc2V0VW5wYWNrZWRFeHRlbnNpb25zOihUZXN0VW5wYWNrZWRFeHRlbnNpb25zICopbWVzc2FnZQotICAgICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6KHVpbnQzMl90KWNvdW50IHsKLSAgLy8gTXVzdCBtYXRjaCAtc2V0UGFja2VkRmllbGRzOnJlcGVhdGVkQ291bnQ6Ci0gIC8vIE11c3QgbWF0Y2ggLXNldFVucGFja2VkRmllbGRzOnJlcGVhdGVkQ291bnQ6Ci0gIC8vIE11c3QgbWF0Y2ggLXNldFBhY2tlZEV4dGVuc2lvbnM6cmVwZWF0ZWRDb3VudDoKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCB1bnBhY2tlZEludDMyRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYwMSArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCB1bnBhY2tlZEludDY0RXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYwMiArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCB1bnBhY2tlZFVpbnQzMkV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MDMgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgdW5wYWNrZWRVaW50NjRFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjA0ICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHVucGFja2VkU2ludDMyRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYwNSArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCB1bnBhY2tlZFNpbnQ2NEV4dGVuc2lvbl0KLSAgICAgICAgICAgICAgICAgICAgdmFsdWU6QCg2MDYgKyBpICogMTAwKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgdW5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYwNyArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCB1bnBhY2tlZEZpeGVkNjRFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjA4ICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHVucGFja2VkU2ZpeGVkMzJFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjA5ICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHVucGFja2VkU2ZpeGVkNjRFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjEwICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHVucGFja2VkRmxvYXRFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoNjExICsgaSAqIDEwMCldOwotICAgIFttZXNzYWdlIGFkZEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHVucGFja2VkRG91YmxlRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKDYxMiArIGkgKiAxMDApXTsKLSAgICBbbWVzc2FnZSBhZGRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCB1bnBhY2tlZEJvb2xFeHRlbnNpb25dCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlOkAoKGkgJSAyKSA/IFlFUyA6IE5PKV07Ci0gICAgW21lc3NhZ2UgYWRkRXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgdW5wYWNrZWRFbnVtRXh0ZW5zaW9uXQotICAgICAgICAgICAgICAgICAgICB2YWx1ZTpAKChpICUgMikgPyBGb3JlaWduRW51bV9Gb3JlaWduQmFyCi0gICAgICAgICAgICAgICAgICAgICAgICAgOiBGb3JlaWduRW51bV9Gb3JlaWduQmF6KV07Ci0gIH0KLX0KLQotLSAodm9pZClhc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0OihUZXN0UGFja2VkRXh0ZW5zaW9ucyAqKW1lc3NhZ2UKLSAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRDb3VudDoodWludDMyX3QpY291bnR7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkSW50MzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZEludDY0RXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRVaW50MzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZFVpbnQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkU2ludDMyRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRTaW50NjRFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZEZpeGVkMzJFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZEZpeGVkNjRFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uXV0gY291bnRdKTsKLSAgWENUQXNzZXJ0RXF1YWwoY291bnQsIFtbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRmxvYXRFeHRlbnNpb25dXSBjb3VudF0pOwotICBYQ1RBc3NlcnRFcXVhbChjb3VudCwgW1ttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZERvdWJsZUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkQm9vbEV4dGVuc2lvbl1dIGNvdW50XSk7Ci0gIFhDVEFzc2VydEVxdWFsKGNvdW50LCBbW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRW51bUV4dGVuc2lvbl1dIGNvdW50XSk7Ci0KLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBpZCBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRJbnQzMkV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpbnQpKDYwMSArIGkgKiAxMDApLCBbZXh0ZW5zaW9uW2ldIGludFZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkSW50NjRFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCg2MDIgKyBpICogMTAwLCBbZXh0ZW5zaW9uW2ldIGxvbmdMb25nVmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRVaW50MzJFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCg2MDMgKyBpICogMTAwLCBbZXh0ZW5zaW9uW2ldIHVuc2lnbmVkSW50VmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRVaW50NjRFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCg2MDQgKyBpICogMTAwLCBbZXh0ZW5zaW9uW2ldIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0pOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZFNpbnQzMkV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpbnQpKDYwNSArIGkgKiAxMDApLCBbZXh0ZW5zaW9uW2ldIGludFZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkU2ludDY0RXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoNjA2ICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSBsb25nTG9uZ1ZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRml4ZWQzMkV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKDYwNyArIGkgKiAxMDAsIFtleHRlbnNpb25baV0gdW5zaWduZWRJbnRWYWx1ZV0pOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZEZpeGVkNjRFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCg2MDggKyBpICogMTAwLCBbZXh0ZW5zaW9uW2ldIHVuc2lnbmVkTG9uZ0xvbmdWYWx1ZV0pOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWwoKGludCkoNjA5ICsgaSAqIDEwMCksIFtleHRlbnNpb25baV0gaW50VmFsdWVdKTsKLSAgICBleHRlbnNpb24gPSBbbWVzc2FnZSBnZXRFeHRlbnNpb246W1VuaXR0ZXN0Um9vdCBwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKDYxMCArIGkgKiAxMDAsIFtleHRlbnNpb25baV0gbG9uZ0xvbmdWYWx1ZV0pOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZEZsb2F0RXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koNjExICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSBmbG9hdFZhbHVlXSwgMC4wMSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRG91YmxlRXh0ZW5zaW9uXV07Ci0gICAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3koNjEyICsgaSAqIDEwMCwgW2V4dGVuc2lvbltpXSBkb3VibGVWYWx1ZV0sIDAuMDEpOwotICAgIGV4dGVuc2lvbiA9IFttZXNzYWdlIGdldEV4dGVuc2lvbjpbVW5pdHRlc3RSb290IHBhY2tlZEJvb2xFeHRlbnNpb25dXTsKLSAgICBYQ1RBc3NlcnRFcXVhbCgoaSAlIDIpID8gWUVTIDogTk8sIFtleHRlbnNpb25baV0gYm9vbFZhbHVlXSk7Ci0gICAgZXh0ZW5zaW9uID0gW21lc3NhZ2UgZ2V0RXh0ZW5zaW9uOltVbml0dGVzdFJvb3QgcGFja2VkRW51bUV4dGVuc2lvbl1dOwotICAgIFhDVEFzc2VydEVxdWFsKChpICUgMikgPyBGb3JlaWduRW51bV9Gb3JlaWduQmFyIDogRm9yZWlnbkVudW1fRm9yZWlnbkJheiwKLSAgICAgICAgICAgICAgICAgICBbZXh0ZW5zaW9uW2ldIGludFZhbHVlXSk7Ci0gIH0KLX0KLQotLSAodm9pZClhc3NlcnRBbGxGaWVsZHNLVkNNYXRjaDooVGVzdEFsbFR5cGVzICopbWVzc2FnZSB7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsSW50MzIiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2Uub3B0aW9uYWxJbnQzMiksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxJbnQzMiJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxJbnQ2NCJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbEludDY0KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEludDY0Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFVpbnQzMiJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbFVpbnQzMiksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxVaW50MzIiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsVWludDY0Il0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLm9wdGlvbmFsVWludDY0KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbFVpbnQ2NCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxTaW50MzIiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2Uub3B0aW9uYWxTaW50MzIpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsU2ludDMyIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFNpbnQ2NCJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbFNpbnQ2NCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxTaW50NjQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsRml4ZWQzMiJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbEZpeGVkMzIpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsRml4ZWQzMiJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxGaXhlZDY0Il0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLm9wdGlvbmFsRml4ZWQ2NCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxGaXhlZDY0Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFNmaXhlZDMyIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLm9wdGlvbmFsU2ZpeGVkMzIpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsU2ZpeGVkMzIiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsU2ZpeGVkNjQiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2Uub3B0aW9uYWxTZml4ZWQ2NCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxTZml4ZWQ2NCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxGbG9hdCJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbEZsb2F0KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEZsb2F0Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbERvdWJsZSJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbERvdWJsZSksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxEb3VibGUiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsQm9vbCJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbEJvb2wpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsQm9vbCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxTdHJpbmciXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLm9wdGlvbmFsU3RyaW5nLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsU3RyaW5nIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbEJ5dGVzIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5vcHRpb25hbEJ5dGVzLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsQnl0ZXMiXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxHcm91cCJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2Uub3B0aW9uYWxHcm91cCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleVBhdGg6QCJvcHRpb25hbEdyb3VwLmhhc0EiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2Uub3B0aW9uYWxHcm91cC5hKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXlQYXRoOkAib3B0aW9uYWxHcm91cC5hIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydE5vdE5pbChtZXNzYWdlLm9wdGlvbmFsTmVzdGVkTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleVBhdGg6QCJvcHRpb25hbE5lc3RlZE1lc3NhZ2UuaGFzQmIiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2Uub3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmJiKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXlQYXRoOkAib3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmJiIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbEZvcmVpZ25NZXNzYWdlIl0sIEBZRVMpOwotICBYQ1RBc3NlcnROb3ROaWwobWVzc2FnZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5UGF0aDpAIm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuaGFzQyJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbEZvcmVpZ25NZXNzYWdlLmMpLCBbbWVzc2FnZSB2YWx1ZUZvcktleVBhdGg6QCJvcHRpb25hbEZvcmVpZ25NZXNzYWdlLmMiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsSW1wb3J0TWVzc2FnZSJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0Tm90TmlsKG1lc3NhZ2Uub3B0aW9uYWxGb3JlaWduTWVzc2FnZSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleVBhdGg6QCJvcHRpb25hbEltcG9ydE1lc3NhZ2UuaGFzRCJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbEltcG9ydE1lc3NhZ2UuZCksIFttZXNzYWdlIHZhbHVlRm9yS2V5UGF0aDpAIm9wdGlvbmFsSW1wb3J0TWVzc2FnZS5kIl0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsTmVzdGVkRW51bSJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbE5lc3RlZEVudW0pLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsTmVzdGVkRW51bSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxGb3JlaWduRW51bSJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5vcHRpb25hbEZvcmVpZ25FbnVtKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEZvcmVpZ25FbnVtIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbEltcG9ydEVudW0iXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2Uub3B0aW9uYWxJbXBvcnRFbnVtKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEltcG9ydEVudW0iXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2Uub3B0aW9uYWxTdHJpbmdQaWVjZSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbFN0cmluZ1BpZWNlIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbENvcmQiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLm9wdGlvbmFsQ29yZCwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbENvcmQiXSk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBHUEJBcnJheSBpbnRlcmZhY2UgZm9yIHJlcGVhdGVkCi0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5LCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkSW50MzJBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5LCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkSW50NjRBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRVaW50MzJBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZFVpbnQzMkFycmF5Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5yZXBlYXRlZFVpbnQ2NEFycmF5LCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkVWludDY0QXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkU2ludDMyQXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRTaW50MzJBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZFNpbnQ2NEFycmF5Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5yZXBlYXRlZEZpeGVkMzJBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEZpeGVkMzJBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRGaXhlZDY0QXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRGaXhlZDY0QXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkU2ZpeGVkMzJBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZFNmaXhlZDMyQXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkU2ZpeGVkNjRBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZFNmaXhlZDY0QXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkRmxvYXRBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEZsb2F0QXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkRG91YmxlQXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWREb3VibGVBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRCb29sQXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRCb29sQXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRTdHJpbmdBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRCeXRlc0FycmF5LCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkQnl0ZXNBcnJheSJdKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5yZXBlYXRlZEdyb3VwQXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRHcm91cEFycmF5Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUFycmF5LCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VBcnJheSJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWRJbXBvcnRNZXNzYWdlQXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRJbXBvcnRNZXNzYWdlQXJyYXkiXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkRm9yZWlnbkVudW1BcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEZvcmVpZ25FbnVtQXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5LCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkSW1wb3J0RW51bUFycmF5Il0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkU3RyaW5nUGllY2VBcnJheSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZFN0cmluZ1BpZWNlQXJyYXkiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLnJlcGVhdGVkQ29yZEFycmF5LCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkQ29yZEFycmF5Il0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRJbnQzMkFycmF5X0NvdW50KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEludDMyQXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRJbnQ2NEFycmF5X0NvdW50KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEludDY0QXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRVaW50MzJBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRVaW50MzJBcnJheV9Db3VudCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5yZXBlYXRlZFVpbnQ2NEFycmF5X0NvdW50KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZFVpbnQ2NEFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkU2ludDMyQXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkU2ludDMyQXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRTaW50NjRBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRTaW50NjRBcnJheV9Db3VudCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5yZXBlYXRlZEZpeGVkMzJBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRGaXhlZDMyQXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRGaXhlZDY0QXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkRml4ZWQ2NEFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkU2ZpeGVkMzJBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRTZml4ZWQzMkFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkU2ZpeGVkNjRBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRTZml4ZWQ2NEFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkRmxvYXRBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRGbG9hdEFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkRG91YmxlQXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkRG91YmxlQXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRCb29sQXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkQm9vbEFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkU3RyaW5nQXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkU3RyaW5nQXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRCeXRlc0FycmF5X0NvdW50KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEJ5dGVzQXJyYXlfQ291bnQiXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5yZXBlYXRlZEdyb3VwQXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkR3JvdXBBcnJheV9Db3VudCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWROZXN0ZWRNZXNzYWdlQXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUFycmF5X0NvdW50KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXlfQ291bnQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWRJbXBvcnRNZXNzYWdlQXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5X0NvdW50Il0pOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UucmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXlfQ291bnQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAInJlcGVhdGVkTmVzdGVkRW51bUFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkRm9yZWlnbkVudW1BcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRGb3JlaWduRW51bUFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkSW1wb3J0RW51bUFycmF5X0NvdW50KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZEltcG9ydEVudW1BcnJheV9Db3VudCJdKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkU3RyaW5nUGllY2VBcnJheV9Db3VudCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAicmVwZWF0ZWRTdHJpbmdQaWVjZUFycmF5X0NvdW50Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLnJlcGVhdGVkQ29yZEFycmF5X0NvdW50KSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJyZXBlYXRlZENvcmRBcnJheV9Db3VudCJdKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRJbnQzMiJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5kZWZhdWx0SW50MzIpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRJbnQzMiJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdEludDY0Il0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHRJbnQ2NCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdEludDY0Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0VWludDMyIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHRVaW50MzIpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRVaW50MzIiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRVaW50NjQiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UuZGVmYXVsdFVpbnQ2NCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdFVpbnQ2NCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdFNpbnQzMiJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5kZWZhdWx0U2ludDMyKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0U2ludDMyIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0U2ludDY0Il0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHRTaW50NjQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRTaW50NjQiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRGaXhlZDMyIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHRGaXhlZDMyKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Rml4ZWQzMiJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdEZpeGVkNjQiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UuZGVmYXVsdEZpeGVkNjQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRGaXhlZDY0Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0U2ZpeGVkMzIiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UuZGVmYXVsdFNmaXhlZDMyKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0U2ZpeGVkMzIiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRTZml4ZWQ2NCJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEAobWVzc2FnZS5kZWZhdWx0U2ZpeGVkNjQpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRTZml4ZWQ2NCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdEZsb2F0Il0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHRGbG9hdCksIFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdEZsb2F0Il0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0RG91YmxlIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHREb3VibGUpLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHREb3VibGUiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRCb29sIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHRCb29sKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Qm9vbCJdKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdFN0cmluZyJdLCBAWUVTKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UuZGVmYXVsdFN0cmluZywgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0U3RyaW5nIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0Qnl0ZXMiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLmRlZmF1bHRCeXRlcywgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Qnl0ZXMiXSk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdE5lc3RlZEVudW0iXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UuZGVmYXVsdE5lc3RlZEVudW0pLCBbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHROZXN0ZWRFbnVtIl0pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0Rm9yZWlnbkVudW0iXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhAKG1lc3NhZ2UuZGVmYXVsdEZvcmVpZ25FbnVtKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Rm9yZWlnbkVudW0iXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRJbXBvcnRFbnVtIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoQChtZXNzYWdlLmRlZmF1bHRJbXBvcnRFbnVtKSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0SW1wb3J0RW51bSJdKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0U3RyaW5nUGllY2UiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhtZXNzYWdlLmRlZmF1bHRTdHJpbmdQaWVjZSwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0U3RyaW5nUGllY2UiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRDb3JkIl0sIEBZRVMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMobWVzc2FnZS5kZWZhdWx0Q29yZCwgW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Q29yZCJdKTsKLX0KLQotLSAodm9pZClzZXRBbGxGaWVsZHNWaWFLVkM6KFRlc3RBbGxUeXBlcyAqKW1lc3NhZ2UKLSAgICAgICAgICAgICByZXBlYXRlZENvdW50Oih1aW50MzJfdCljb3VudCB7Ci0gIFttZXNzYWdlIHNldFZhbHVlOkAxMDEgZm9yS2V5OkAib3B0aW9uYWxJbnQzMiJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAMTAyIGZvcktleTpAIm9wdGlvbmFsSW50NjQiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDEwMyBmb3JLZXk6QCJvcHRpb25hbFVpbnQzMiJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAMTA0IGZvcktleTpAIm9wdGlvbmFsVWludDY0Il07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkAxMDUgZm9yS2V5OkAib3B0aW9uYWxTaW50MzIiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDEwNiBmb3JLZXk6QCJvcHRpb25hbFNpbnQ2NCJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAMTA3IGZvcktleTpAIm9wdGlvbmFsRml4ZWQzMiJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAMTA4IGZvcktleTpAIm9wdGlvbmFsRml4ZWQ2NCJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAMTA5IGZvcktleTpAIm9wdGlvbmFsU2ZpeGVkMzIiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDExMCBmb3JLZXk6QCJvcHRpb25hbFNmaXhlZDY0Il07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkAxMTEgZm9yS2V5OkAib3B0aW9uYWxGbG9hdCJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAMTEyIGZvcktleTpAIm9wdGlvbmFsRG91YmxlIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkBZRVMgZm9yS2V5OkAib3B0aW9uYWxCb29sIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkAiMTE1IiBmb3JLZXk6QCJvcHRpb25hbFN0cmluZyJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpbTlNEYXRhIGdwYnR1X2RhdGFXaXRoRW1iZWRkZWROdWxsc10KLSAgICAgICAgICAgICBmb3JLZXk6QCJvcHRpb25hbEJ5dGVzIl07Ci0KLSAgVGVzdEFsbFR5cGVzX09wdGlvbmFsR3JvdXAgKmFsbFR5cGVzID0gW1Rlc3RBbGxUeXBlc19PcHRpb25hbEdyb3VwIG1lc3NhZ2VdOwotICBbYWxsVHlwZXMgc2V0VmFsdWU6QDExNyBmb3JLZXk6QCJhIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOmFsbFR5cGVzIGZvcktleTpAIm9wdGlvbmFsR3JvdXAiXTsKLSAgVGVzdEFsbFR5cGVzX05lc3RlZE1lc3NhZ2UgKm5lc3RlZE1lc3NhZ2UgPQotICAgICAgW1Rlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlIG1lc3NhZ2VdOwotICBbbmVzdGVkTWVzc2FnZSBzZXRWYWx1ZTpAMTE4IGZvcktleTpAImJiIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOm5lc3RlZE1lc3NhZ2UgZm9yS2V5OkAib3B0aW9uYWxOZXN0ZWRNZXNzYWdlIl07Ci0gIEZvcmVpZ25NZXNzYWdlICpmb3JlaWduTWVzc2FnZSA9IFtGb3JlaWduTWVzc2FnZSBtZXNzYWdlXTsKLSAgW2ZvcmVpZ25NZXNzYWdlIHNldFZhbHVlOkAxMTkgZm9yS2V5OkAiYyJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpmb3JlaWduTWVzc2FnZSBmb3JLZXk6QCJvcHRpb25hbEZvcmVpZ25NZXNzYWdlIl07Ci0gIEltcG9ydE1lc3NhZ2UgKmltcG9ydE1lc3NhZ2UgPSBbSW1wb3J0TWVzc2FnZSBtZXNzYWdlXTsKLSAgW2ltcG9ydE1lc3NhZ2Ugc2V0VmFsdWU6QDEyMCBmb3JLZXk6QCJkIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOmltcG9ydE1lc3NhZ2UgZm9yS2V5OkAib3B0aW9uYWxJbXBvcnRNZXNzYWdlIl07Ci0KLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXopCi0gICAgICAgICAgICAgZm9yS2V5OkAib3B0aW9uYWxOZXN0ZWRFbnVtIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkAoRm9yZWlnbkVudW1fRm9yZWlnbkJheikgZm9yS2V5OkAib3B0aW9uYWxGb3JlaWduRW51bSJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAKEltcG9ydEVudW1fSW1wb3J0QmF6KSBmb3JLZXk6QCJvcHRpb25hbEltcG9ydEVudW0iXTsKLQotICBbbWVzc2FnZSBzZXRWYWx1ZTpAIjEyNCIgZm9yS2V5OkAib3B0aW9uYWxTdHJpbmdQaWVjZSJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAIjEyNSIgZm9yS2V5OkAib3B0aW9uYWxDb3JkIl07Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB7Ci0gICAgR1BCSW50MzJBcnJheSAqc2NyYXRjaCA9IFtHUEJJbnQzMkFycmF5IGFycmF5XTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgW3NjcmF0Y2ggYWRkVmFsdWU6MjAxICsgaSAqIDEwMF07Ci0gICAgfQotICAgIFttZXNzYWdlIHNldFZhbHVlOnNjcmF0Y2ggZm9yS2V5OkAicmVwZWF0ZWRJbnQzMkFycmF5Il07Ci0gIH0KLSAgewotICAgIEdQQkludDY0QXJyYXkgKnNjcmF0Y2ggPSBbR1BCSW50NjRBcnJheSBhcnJheV07Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIFtzY3JhdGNoIGFkZFZhbHVlOjIwMiArIGkgKiAxMDBdOwotICAgIH0KLSAgICBbbWVzc2FnZSBzZXRWYWx1ZTpzY3JhdGNoIGZvcktleTpAInJlcGVhdGVkSW50NjRBcnJheSJdOwotICB9Ci0gIHsKLSAgICBHUEJVSW50MzJBcnJheSAqc2NyYXRjaCA9IFtHUEJVSW50MzJBcnJheSBhcnJheV07Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIFtzY3JhdGNoIGFkZFZhbHVlOjIwMyArIGkgKiAxMDBdOwotICAgIH0KLSAgICBbbWVzc2FnZSBzZXRWYWx1ZTpzY3JhdGNoIGZvcktleTpAInJlcGVhdGVkVWludDMyQXJyYXkiXTsKLSAgfQotICB7Ci0gICAgR1BCVUludDY0QXJyYXkgKnNjcmF0Y2ggPSBbR1BCVUludDY0QXJyYXkgYXJyYXldOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBbc2NyYXRjaCBhZGRWYWx1ZToyMDQgKyBpICogMTAwXTsKLSAgICB9Ci0gICAgW21lc3NhZ2Ugc2V0VmFsdWU6c2NyYXRjaCBmb3JLZXk6QCJyZXBlYXRlZFVpbnQ2NEFycmF5Il07Ci0gIH0KLSAgewotICAgIEdQQkludDMyQXJyYXkgKnNjcmF0Y2ggPSBbR1BCSW50MzJBcnJheSBhcnJheV07Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIFtzY3JhdGNoIGFkZFZhbHVlOjIwNSArIGkgKiAxMDBdOwotICAgIH0KLSAgICBbbWVzc2FnZSBzZXRWYWx1ZTpzY3JhdGNoIGZvcktleTpAInJlcGVhdGVkU2ludDMyQXJyYXkiXTsKLSAgfQotICB7Ci0gICAgR1BCSW50NjRBcnJheSAqc2NyYXRjaCA9IFtHUEJJbnQ2NEFycmF5IGFycmF5XTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgW3NjcmF0Y2ggYWRkVmFsdWU6MjA2ICsgaSAqIDEwMF07Ci0gICAgfQotICAgIFttZXNzYWdlIHNldFZhbHVlOnNjcmF0Y2ggZm9yS2V5OkAicmVwZWF0ZWRTaW50NjRBcnJheSJdOwotICB9Ci0gIHsKLSAgICBHUEJVSW50MzJBcnJheSAqc2NyYXRjaCA9IFtHUEJVSW50MzJBcnJheSBhcnJheV07Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIFtzY3JhdGNoIGFkZFZhbHVlOjIwNyArIGkgKiAxMDBdOwotICAgIH0KLSAgICBbbWVzc2FnZSBzZXRWYWx1ZTpzY3JhdGNoIGZvcktleTpAInJlcGVhdGVkRml4ZWQzMkFycmF5Il07Ci0gIH0KLSAgewotICAgIEdQQlVJbnQ2NEFycmF5ICpzY3JhdGNoID0gW0dQQlVJbnQ2NEFycmF5IGFycmF5XTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgW3NjcmF0Y2ggYWRkVmFsdWU6MjA4ICsgaSAqIDEwMF07Ci0gICAgfQotICAgIFttZXNzYWdlIHNldFZhbHVlOnNjcmF0Y2ggZm9yS2V5OkAicmVwZWF0ZWRGaXhlZDY0QXJyYXkiXTsKLSAgfQotICB7Ci0gICAgR1BCSW50MzJBcnJheSAqc2NyYXRjaCA9IFtHUEJJbnQzMkFycmF5IGFycmF5XTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgW3NjcmF0Y2ggYWRkVmFsdWU6MjA5ICsgaSAqIDEwMF07Ci0gICAgfQotICAgIFttZXNzYWdlIHNldFZhbHVlOnNjcmF0Y2ggZm9yS2V5OkAicmVwZWF0ZWRTZml4ZWQzMkFycmF5Il07Ci0gIH0KLSAgewotICAgIEdQQkludDY0QXJyYXkgKnNjcmF0Y2ggPSBbR1BCSW50NjRBcnJheSBhcnJheV07Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIFtzY3JhdGNoIGFkZFZhbHVlOjIxMCArIGkgKiAxMDBdOwotICAgIH0KLSAgICBbbWVzc2FnZSBzZXRWYWx1ZTpzY3JhdGNoIGZvcktleTpAInJlcGVhdGVkU2ZpeGVkNjRBcnJheSJdOwotICB9Ci0gIHsKLSAgICBHUEJGbG9hdEFycmF5ICpzY3JhdGNoID0gW0dQQkZsb2F0QXJyYXkgYXJyYXldOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBbc2NyYXRjaCBhZGRWYWx1ZToyMTEgKyBpICogMTAwXTsKLSAgICB9Ci0gICAgW21lc3NhZ2Ugc2V0VmFsdWU6c2NyYXRjaCBmb3JLZXk6QCJyZXBlYXRlZEZsb2F0QXJyYXkiXTsKLSAgfQotICB7Ci0gICAgR1BCRG91YmxlQXJyYXkgKnNjcmF0Y2ggPSBbR1BCRG91YmxlQXJyYXkgYXJyYXldOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBbc2NyYXRjaCBhZGRWYWx1ZToyMTIgKyBpICogMTAwXTsKLSAgICB9Ci0gICAgW21lc3NhZ2Ugc2V0VmFsdWU6c2NyYXRjaCBmb3JLZXk6QCJyZXBlYXRlZERvdWJsZUFycmF5Il07Ci0gIH0KLSAgewotICAgIEdQQkJvb2xBcnJheSAqc2NyYXRjaCA9IFtHUEJCb29sQXJyYXkgYXJyYXldOwotICAgIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgICBbc2NyYXRjaCBhZGRWYWx1ZTooaSAlIDIpID8gWUVTIDogTk9dOwotICAgIH0KLSAgICBbbWVzc2FnZSBzZXRWYWx1ZTpzY3JhdGNoIGZvcktleTpAInJlcGVhdGVkQm9vbEFycmF5Il07Ci0gIH0KLQotICBOU011dGFibGVBcnJheSAqYXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBOU1N0cmluZyAqc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIxNSArIGkgKiAxMDBdOwotICAgIFthcnJheSBhZGRPYmplY3Q6c3RyaW5nXTsKLSAgICBbc3RyaW5nIHJlbGVhc2VdOwotICB9Ci0gIFttZXNzYWdlIHNldFZhbHVlOmFycmF5IGZvcktleTpAInJlcGVhdGVkU3RyaW5nQXJyYXkiXTsKLSAgW2FycmF5IHJlbGVhc2VdOwotCi0gIGFycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpjb3VudF07Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgTlNEYXRhICpkYXRhID0gW1tOU0RhdGEgYWxsb2NdIGluaXRXaXRoVWludDMyX2dwYnR1OjIxNiArIGkgKiAxMDBdOwotICAgIFthcnJheSBhZGRPYmplY3Q6ZGF0YV07Ci0gICAgW2RhdGEgcmVsZWFzZV07Ci0gIH0KLSAgW21lc3NhZ2Ugc2V0VmFsdWU6YXJyYXkgZm9yS2V5OkAicmVwZWF0ZWRCeXRlc0FycmF5Il07Ci0gIFthcnJheSByZWxlYXNlXTsKLQotICBhcnJheSA9IFtbTlNNdXRhYmxlQXJyYXkgYWxsb2NdIGluaXRXaXRoQ2FwYWNpdHk6Y291bnRdOwotICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIFRlc3RBbGxUeXBlc19SZXBlYXRlZEdyb3VwICp0ZXN0QWxsID0KLSAgICAgICAgW1tUZXN0QWxsVHlwZXNfUmVwZWF0ZWRHcm91cCBhbGxvY10gaW5pdF07Ci0gICAgW3Rlc3RBbGwgc2V0QToyMTcgKyBpICogMTAwXTsKLSAgICBbYXJyYXkgYWRkT2JqZWN0OnRlc3RBbGxdOwotICAgIFt0ZXN0QWxsIHJlbGVhc2VdOwotICB9Ci0gIFttZXNzYWdlIHNldFZhbHVlOmFycmF5IGZvcktleTpAInJlcGVhdGVkR3JvdXBBcnJheSJdOwotICBbYXJyYXkgcmVsZWFzZV07Ci0KLSAgYXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBuZXN0ZWRNZXNzYWdlID0gW1tUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZSBhbGxvY10gaW5pdF07Ci0gICAgW25lc3RlZE1lc3NhZ2Ugc2V0QmI6MjE4ICsgaSAqIDEwMF07Ci0gICAgW2FycmF5IGFkZE9iamVjdDpuZXN0ZWRNZXNzYWdlXTsKLSAgICBbbmVzdGVkTWVzc2FnZSByZWxlYXNlXTsKLSAgfQotICBbbWVzc2FnZSBzZXRWYWx1ZTphcnJheSBmb3JLZXk6QCJyZXBlYXRlZE5lc3RlZE1lc3NhZ2VBcnJheSJdOwotICBbYXJyYXkgcmVsZWFzZV07Ci0KLSAgYXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBmb3JlaWduTWVzc2FnZSA9IFtbRm9yZWlnbk1lc3NhZ2UgYWxsb2NdIGluaXRdOwotICAgIFtmb3JlaWduTWVzc2FnZSBzZXRDOjIxOSArIGkgKiAxMDBdOwotICAgIFthcnJheSBhZGRPYmplY3Q6Zm9yZWlnbk1lc3NhZ2VdOwotICAgIFtmb3JlaWduTWVzc2FnZSByZWxlYXNlXTsKLSAgfQotICBbbWVzc2FnZSBzZXRWYWx1ZTphcnJheSBmb3JLZXk6QCJyZXBlYXRlZEZvcmVpZ25NZXNzYWdlQXJyYXkiXTsKLSAgW2FycmF5IHJlbGVhc2VdOwotCi0gIGFycmF5ID0gW1tOU011dGFibGVBcnJheSBhbGxvY10gaW5pdFdpdGhDYXBhY2l0eTpjb3VudF07Ci0gIGZvciAodWludDMyX3QgaSA9IDA7IGkgPCBjb3VudDsgKytpKSB7Ci0gICAgaW1wb3J0TWVzc2FnZSA9IFtbSW1wb3J0TWVzc2FnZSBhbGxvY10gaW5pdF07Ci0gICAgW2ltcG9ydE1lc3NhZ2Ugc2V0RDoyMjAgKyBpICogMTAwXTsKLSAgICBbYXJyYXkgYWRkT2JqZWN0OmltcG9ydE1lc3NhZ2VdOwotICAgIFtpbXBvcnRNZXNzYWdlIHJlbGVhc2VdOwotICB9Ci0gIFttZXNzYWdlIHNldFZhbHVlOmFycmF5IGZvcktleTpAInJlcGVhdGVkSW1wb3J0TWVzc2FnZUFycmF5Il07Ci0gIFthcnJheSByZWxlYXNlXTsKLQotICB7Ci0gICAgR1BCRW51bUFycmF5ICpzY3JhdGNoID0gW0dQQkVudW1BcnJheQotICAgICAgICBhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246VGVzdEFsbFR5cGVzX05lc3RlZEVudW1fSXNWYWxpZFZhbHVlXTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgW3NjcmF0Y2ggYWRkVmFsdWU6KGkgJSAyKSA/IFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0JhcgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IFRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0Jhel07Ci0gICAgfQotICAgIFttZXNzYWdlIHNldFZhbHVlOnNjcmF0Y2ggZm9yS2V5OkAicmVwZWF0ZWROZXN0ZWRFbnVtQXJyYXkiXTsKLSAgfQotICB7Ci0gICAgR1BCRW51bUFycmF5ICpzY3JhdGNoID0KLSAgICAgICAgW0dQQkVudW1BcnJheSBhcnJheVdpdGhWYWxpZGF0aW9uRnVuY3Rpb246Rm9yZWlnbkVudW1fSXNWYWxpZFZhbHVlXTsKLSAgICBmb3IgKHVpbnQzMl90IGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgICAgW3NjcmF0Y2gKLSAgICAgICAgICBhZGRWYWx1ZTooaSAlIDIpID8gRm9yZWlnbkVudW1fRm9yZWlnbkJhciA6IEZvcmVpZ25FbnVtX0ZvcmVpZ25CYXpdOwotICAgIH0KLSAgICBbbWVzc2FnZSBzZXRWYWx1ZTpzY3JhdGNoIGZvcktleTpAInJlcGVhdGVkRm9yZWlnbkVudW1BcnJheSJdOwotICB9Ci0gIHsKLSAgICBHUEJFbnVtQXJyYXkgKnNjcmF0Y2ggPQotICAgICAgICBbR1BCRW51bUFycmF5IGFycmF5V2l0aFZhbGlkYXRpb25GdW5jdGlvbjpJbXBvcnRFbnVtX0lzVmFsaWRWYWx1ZV07Ci0gICAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICAgIFtzY3JhdGNoIGFkZFZhbHVlOihpICUgMikgPyBJbXBvcnRFbnVtX0ltcG9ydEJhciA6IEltcG9ydEVudW1fSW1wb3J0QmF6XTsKLSAgICB9Ci0gICAgW21lc3NhZ2Ugc2V0VmFsdWU6c2NyYXRjaCBmb3JLZXk6QCJyZXBlYXRlZEltcG9ydEVudW1BcnJheSJdOwotICB9Ci0KLSAgYXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBOU1N0cmluZyAqc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIyNCArIGkgKiAxMDBdOwotICAgIFthcnJheSBhZGRPYmplY3Q6c3RyaW5nXTsKLSAgICBbc3RyaW5nIHJlbGVhc2VdOwotICB9Ci0gIFttZXNzYWdlIHNldFZhbHVlOmFycmF5IGZvcktleTpAInJlcGVhdGVkU3RyaW5nUGllY2VBcnJheSJdOwotICBbYXJyYXkgcmVsZWFzZV07Ci0KLSAgYXJyYXkgPSBbW05TTXV0YWJsZUFycmF5IGFsbG9jXSBpbml0V2l0aENhcGFjaXR5OmNvdW50XTsKLSAgZm9yICh1aW50MzJfdCBpID0gMDsgaSA8IGNvdW50OyArK2kpIHsKLSAgICBOU1N0cmluZyAqc3RyaW5nID0gW1tOU1N0cmluZyBhbGxvY10gaW5pdFdpdGhGb3JtYXQ6QCIlZCIsIDIyNSArIGkgKiAxMDBdOwotICAgIFthcnJheSBhZGRPYmplY3Q6c3RyaW5nXTsKLSAgICBbc3RyaW5nIHJlbGVhc2VdOwotICB9Ci0gIFttZXNzYWdlIHNldFZhbHVlOmFycmF5IGZvcktleTpAInJlcGVhdGVkQ29yZEFycmF5Il07Ci0gIFthcnJheSByZWxlYXNlXTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIFttZXNzYWdlIHNldFZhbHVlOkA0MDEgZm9yS2V5OkAiZGVmYXVsdEludDMyIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkA0MDIgZm9yS2V5OkAiZGVmYXVsdEludDY0Il07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkA0MDMgZm9yS2V5OkAiZGVmYXVsdFVpbnQzMiJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpANDA0IGZvcktleTpAImRlZmF1bHRVaW50NjQiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDQwNSBmb3JLZXk6QCJkZWZhdWx0U2ludDMyIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkA0MDYgZm9yS2V5OkAiZGVmYXVsdFNpbnQ2NCJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpANDA3IGZvcktleTpAImRlZmF1bHRGaXhlZDMyIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkA0MDggZm9yS2V5OkAiZGVmYXVsdEZpeGVkNjQiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDQwOSBmb3JLZXk6QCJkZWZhdWx0U2ZpeGVkMzIiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDQxMCBmb3JLZXk6QCJkZWZhdWx0U2ZpeGVkNjQiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDQxMSBmb3JLZXk6QCJkZWZhdWx0RmxvYXQiXTsKLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QDQxMiBmb3JLZXk6QCJkZWZhdWx0RG91YmxlIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkBOTyBmb3JLZXk6QCJkZWZhdWx0Qm9vbCJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAIjQxNSIgZm9yS2V5OkAiZGVmYXVsdFN0cmluZyJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpbTlNEYXRhIGdwYnR1X2RhdGFXaXRoVWludDMyOjQxNl0gZm9yS2V5OkAiZGVmYXVsdEJ5dGVzIl07Ci0KLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9Gb28pIGZvcktleTpAImRlZmF1bHROZXN0ZWRFbnVtIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkAoRm9yZWlnbkVudW1fRm9yZWlnbkZvbykgZm9yS2V5OkAiZGVmYXVsdEZvcmVpZ25FbnVtIl07Ci0gIFttZXNzYWdlIHNldFZhbHVlOkAoSW1wb3J0RW51bV9JbXBvcnRGb28pIGZvcktleTpAImRlZmF1bHRJbXBvcnRFbnVtIl07Ci0KLSAgW21lc3NhZ2Ugc2V0VmFsdWU6QCI0MjQiIGZvcktleTpAImRlZmF1bHRTdHJpbmdQaWVjZSJdOwotICBbbWVzc2FnZSBzZXRWYWx1ZTpAIjQyNSIgZm9yS2V5OkAiZGVmYXVsdENvcmQiXTsKLX0KLQotLSAodm9pZClhc3NlcnRDbGVhcktWQzooVGVzdEFsbFR5cGVzICopbWVzc2FnZSB7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsSW50MzIiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxJbnQ2NCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFVpbnQzMiJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFVpbnQ2NCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFNpbnQzMiJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFNpbnQ2NCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbEZpeGVkMzIiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxGaXhlZDY0Il0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsU2ZpeGVkMzIiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxTZml4ZWQ2NCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbEZsb2F0Il0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsRG91YmxlIl0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsQm9vbCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbFN0cmluZyJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbEJ5dGVzIl0sIEBOTyk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxHcm91cCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxGb3JlaWduTWVzc2FnZSJdLAotICAgICAgICAgICAgICAgICAgICAgICAgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlIl0sIEBOTyk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxOZXN0ZWRFbnVtIl0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc09wdGlvbmFsRm9yZWlnbkVudW0iXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxJbXBvcnRFbnVtIl0sIEBOTyk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNPcHRpb25hbENvcmQiXSwgQE5PKTsKLQotICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsSW50MzIiXSwgQDApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEludDY0Il0sIEAwKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxVaW50MzIiXSwgQDApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbFVpbnQ2NCJdLCBAMCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsU2ludDMyIl0sIEAwKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxTaW50NjQiXSwgQDApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEZpeGVkMzIiXSwgQDApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEZpeGVkNjQiXSwgQDApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbFNmaXhlZDMyIl0sIEAwKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAib3B0aW9uYWxTZml4ZWQ2NCJdLCBAMCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsRmxvYXQiXSwgQDApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbERvdWJsZSJdLCBAMCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsQm9vbCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbFN0cmluZyJdLCBAIiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEJ5dGVzIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBHUEJFbXB0eU5TRGF0YSgpKTsKLQotICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBleGlzdCwgYnV0IGJlIGNsZWFyLgotICBYQ1RBc3NlcnROb3ROaWwoW21lc3NhZ2UgdmFsdWVGb3JLZXlQYXRoOkAib3B0aW9uYWxHcm91cCJdKTsKLSAgWENUQXNzZXJ0Tm90TmlsKFttZXNzYWdlIHZhbHVlRm9yS2V5UGF0aDpAIm9wdGlvbmFsTmVzdGVkTWVzc2FnZSJdKTsKLSAgWENUQXNzZXJ0Tm90TmlsKFttZXNzYWdlIHZhbHVlRm9yS2V5UGF0aDpAIm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UiXSk7Ci0gIFhDVEFzc2VydE5vdE5pbChbbWVzc2FnZSB2YWx1ZUZvcktleVBhdGg6QCJvcHRpb25hbEltcG9ydE1lc3NhZ2UiXSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleVBhdGg6QCJvcHRpb25hbEdyb3VwLmhhc0EiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKAotICAgICAgW21lc3NhZ2UgdmFsdWVGb3JLZXlQYXRoOkAib3B0aW9uYWxOZXN0ZWRNZXNzYWdlLmhhc0JiIl0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cygKLSAgICAgIFttZXNzYWdlIHZhbHVlRm9yS2V5UGF0aDpAIm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuaGFzQyJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXlQYXRoOkAib3B0aW9uYWxJbXBvcnRNZXNzYWdlLmhhc0QiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEBOTyk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5UGF0aDpAIm9wdGlvbmFsR3JvdXAuYSJdLCBAMCk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleVBhdGg6QCJvcHRpb25hbE5lc3RlZE1lc3NhZ2UuYmIiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAwKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5UGF0aDpAIm9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UuYyJdLAotICAgICAgICAgICAgICAgICAgICAgICAgQDApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXlQYXRoOkAib3B0aW9uYWxJbXBvcnRNZXNzYWdlLmQiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAwKTsKLQotICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbE5lc3RlZEVudW0iXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAoVGVzdEFsbFR5cGVzX05lc3RlZEVudW1fRm9vKSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsRm9yZWlnbkVudW0iXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAoRm9yZWlnbkVudW1fRm9yZWlnbkZvbykpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbEltcG9ydEVudW0iXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAoSW1wb3J0RW51bV9JbXBvcnRGb28pKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJvcHRpb25hbFN0cmluZ1BpZWNlIl0sIEAiIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAIm9wdGlvbmFsQ29yZCJdLCBAIiIpOwotCi0gIC8vIE5TQXJyYXkgaW50ZXJmYWNlIGZvciByZXBlYXRlZCBkb2Vzbid0IGhhdmUgaGFzKiwgbmlsIG1lYW5zIG5vIHZhbHVlLgotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRJbnQzMiJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0SW50NjQiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdFVpbnQzMiJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0VWludDY0Il0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRTaW50MzIiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdFNpbnQ2NCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0Rml4ZWQzMiJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0Rml4ZWQ2NCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0U2ZpeGVkMzIiXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdFNmaXhlZDY0Il0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRGbG9hdCJdLCBATk8pOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJoYXNEZWZhdWx0RG91YmxlIl0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRCb29sIl0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRTdHJpbmciXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdEJ5dGVzIl0sIEBOTyk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdE5lc3RlZEVudW0iXSwgQE5PKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdEZvcmVpZ25FbnVtIl0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRJbXBvcnRFbnVtIl0sIEBOTyk7Ci0KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiaGFzRGVmYXVsdFN0cmluZ1BpZWNlIl0sIEBOTyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImhhc0RlZmF1bHRDb3JkIl0sIEBOTyk7Ci0KLSAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdEludDMyIl0sIEA0MSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRJbnQ2NCJdLCBANDIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0VWludDMyIl0sIEA0Myk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRVaW50NjQiXSwgQDQ0KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdFNpbnQzMiJdLCBALTQ1KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdFNpbnQ2NCJdLCBANDYpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Rml4ZWQzMiJdLCBANDcpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Rml4ZWQ2NCJdLCBANDgpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0U2ZpeGVkMzIiXSwgQDQ5KTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdFNmaXhlZDY0Il0sIEAtNTApOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0RmxvYXQiXSwgQDUxLjUpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0RG91YmxlIl0sIEA1MmUzKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdEJvb2wiXSwgQFlFUyk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhbbWVzc2FnZSB2YWx1ZUZvcktleTpAImRlZmF1bHRTdHJpbmciXSwgQCJoZWxsbyIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0Qnl0ZXMiXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtOU0RhdGEgZ3BidHVfZGF0YVdpdGhDU3RyaW5nOiJ3b3JsZCJdKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0TmVzdGVkRW51bSJdLAotICAgICAgICAgICAgICAgICAgICAgICAgQChUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9CYXIpKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdEZvcmVpZ25FbnVtIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICBAKEZvcmVpZ25FbnVtX0ZvcmVpZ25CYXIpKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdEltcG9ydEVudW0iXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEAoSW1wb3J0RW51bV9JbXBvcnRCYXIpKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW21lc3NhZ2UgdmFsdWVGb3JLZXk6QCJkZWZhdWx0U3RyaW5nUGllY2UiXSwgQCJhYmMiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKFttZXNzYWdlIHZhbHVlRm9yS2V5OkAiZGVmYXVsdENvcmQiXSwgQCIxMjMiKTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJVbml0dGVzdFByb3Rvcy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJVbml0dGVzdFByb3Rvcy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTliZWVlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCVW5pdHRlc3RQcm90b3MubQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBDb2xsZWN0cyBhbGwgdGhlIGNvbXBpbGVkIHByb3RvcyBpbnRvIG9uZSBmaWxlIGFuZCBjb21waWxlcyB0aGVtIHRvIG1ha2Ugc3VyZQotLy8gdGhlIGNvbXBpbGVyIGlzIGdlbmVyYXRpbmcgdmFsaWQgY29kZS4KLQotLy8gVGhlIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIGV4dGVuZHMgdGhlIG1lc3NhZ2VzIGluIGRlc2NyaXB0b3IucHJvdG8KLS8vIHNvIHdlIGJ1aWxkIGl0IGluIHRvIHRlc3QgZXh0ZW5kaW5nIGluIGdlbmVyYWwuIFRoZSBsaWJyYXJ5IGRvZXNuJ3QgcHJvdmlkZQotLy8gYSBkZXNjcmlwdG9yIGFzIGl0IGRvZXNuJ3QgdXNlIHRoZSBjbGFzc2VzL2VudW1zLgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3IucGJvYmpjLm0iCi0KLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9NYXBQcm90bzJVbml0dGVzdC5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9NYXBVbml0dGVzdC5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdEFyZW5hLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdEN5Y2xlLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0RHJvcFVua25vd25GaWVsZHMucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RFbWJlZE9wdGltaXplRm9yLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0RW1wdHkucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RFbm9ybW91c0Rlc2NyaXB0b3IucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RJbXBvcnQucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RJbXBvcnRMaXRlLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0SW1wb3J0UHVibGljLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0SW1wb3J0UHVibGljTGl0ZS5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdExpdGUucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RNc2V0LnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0TXNldFdpcmVGb3JtYXQucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3ROb0FyZW5hLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0Tm9BcmVuYUltcG9ydC5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0T2JqYy5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdE9iamNTdGFydHVwLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0T3B0aW1pemVGb3IucGJvYmpjLm0iCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RQcmVzZXJ2ZVVua25vd25FbnVtLnBib2JqYy5tIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UnVudGltZVByb3RvMi5wYm9iamMubSIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdFJ1bnRpbWVQcm90bzMucGJvYmpjLm0iCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQlVua25vd25GaWVsZFNldFRlc3QubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCVW5rbm93bkZpZWxkU2V0VGVzdC5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMTIxN2NhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCVW5rbm93bkZpZWxkU2V0VGVzdC5tCisrKyAvZGV2L251bGwKQEAgLTEsMjU5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0ICJHUEJUZXN0VXRpbGl0aWVzLmgiCi0KLSNpbXBvcnQgIkdQQlVua25vd25GaWVsZF9QYWNrYWdlUHJpdmF0ZS5oIgotI2ltcG9ydCAiR1BCVW5rbm93bkZpZWxkU2V0X1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3QucGJvYmpjLmgiCi0KLUBpbnRlcmZhY2UgR1BCVW5rbm93bkZpZWxkU2V0IChHUEJVbmtub3duRmllbGRTZXRUZXN0KQotLSAodm9pZClnZXRUYWdzOihpbnQzMl90Kil0YWdzOwotQGVuZAotCi1AaW50ZXJmYWNlIFVua25vd25GaWVsZFNldFRlc3QgOiBHUEJUZXN0Q2FzZSB7Ci0gQHByaXZhdGUKLSAgVGVzdEFsbFR5cGVzKiBhbGxGaWVsZHNfOwotICBOU0RhdGEqIGFsbEZpZWxkc0RhdGFfOwotCi0gIC8vIEFuIGVtcHR5IG1lc3NhZ2UgdGhhdCBoYXMgYmVlbiBwYXJzZWQgZnJvbSBhbGxGaWVsZHNEYXRhLiAgU28sIGl0IGhhcwotICAvLyB1bmtub3duIGZpZWxkcyBvZiBldmVyeSB0eXBlLgotICBUZXN0RW1wdHlNZXNzYWdlKiBlbXB0eU1lc3NhZ2VfOwotICBHUEJVbmtub3duRmllbGRTZXQqIHVua25vd25GaWVsZHNfOwotfQotCi1AZW5kCi0KLUBpbXBsZW1lbnRhdGlvbiBVbmtub3duRmllbGRTZXRUZXN0Ci0KLS0gKHZvaWQpc2V0VXAgewotICBhbGxGaWVsZHNfID0gW3NlbGYgYWxsU2V0UmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgYWxsRmllbGRzRGF0YV8gPSBbYWxsRmllbGRzXyBkYXRhXTsKLSAgZW1wdHlNZXNzYWdlXyA9IFtUZXN0RW1wdHlNZXNzYWdlIHBhcnNlRnJvbURhdGE6YWxsRmllbGRzRGF0YV8gZXJyb3I6TlVMTF07Ci0gIHVua25vd25GaWVsZHNfID0gZW1wdHlNZXNzYWdlXy51bmtub3duRmllbGRzOwotfQotCi0tIChHUEJVbmtub3duRmllbGQgKilnZXRGaWVsZDooaW50MzJfdCludW1iZXIgewotICByZXR1cm4gW3Vua25vd25GaWVsZHNfIGdldEZpZWxkOm51bWJlcl07Ci19Ci0KLS8vIENvbnN0cnVjdHMgYSBwcm90b2NvbCBidWZmZXIgd2hpY2ggY29udGFpbnMgZmllbGRzIHdpdGggYWxsIHRoZSBzYW1lCi0vLyBudW1iZXJzIGFzIGFsbEZpZWxkc0RhdGEgZXhjZXB0IHRoYXQgZWFjaCBmaWVsZCBpcyBzb21lIG90aGVyIHdpcmUKLS8vIHR5cGUuCi0tIChOU0RhdGEqKWdldEJpemFycm9EYXRhIHsKLSAgR1BCVW5rbm93bkZpZWxkU2V0KiBiaXphcnJvRmllbGRzID0KLSAgICAgIFtbW0dQQlVua25vd25GaWVsZFNldCBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotICBOU1VJbnRlZ2VyIGNvdW50ID0gW3Vua25vd25GaWVsZHNfIGNvdW50T2ZGaWVsZHNdOwotICBpbnQzMl90IHRhZ3NbY291bnRdOwotICBbdW5rbm93bkZpZWxkc18gZ2V0VGFnczp0YWdzXTsKLSAgZm9yIChOU1VJbnRlZ2VyIGkgPSAwOyBpIDwgY291bnQ7ICsraSkgewotICAgIGludDMyX3QgdGFnID0gdGFnc1tpXTsKLSAgICBHUEJVbmtub3duRmllbGQqIGZpZWxkID0gW3Vua25vd25GaWVsZHNfIGdldEZpZWxkOnRhZ107Ci0gICAgaWYgKGZpZWxkLnZhcmludExpc3QuY291bnQgPT0gMCkgewotICAgICAgLy8gT3JpZ2luYWwgZmllbGQgaXMgbm90IGEgdmFyaW50LCBzbyB1c2UgYSB2YXJpbnQuCi0gICAgICBHUEJVbmtub3duRmllbGQqIHZhcmludEZpZWxkID0KLSAgICAgICAgICBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOnRhZ10gYXV0b3JlbGVhc2VdOwotICAgICAgW3ZhcmludEZpZWxkIGFkZFZhcmludDoxXTsKLSAgICAgIFtiaXphcnJvRmllbGRzIGFkZEZpZWxkOnZhcmludEZpZWxkXTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gT3JpZ2luYWwgZmllbGQgKmlzKiBhIHZhcmludCwgc28gdXNlIHNvbWV0aGluZyBlbHNlLgotICAgICAgR1BCVW5rbm93bkZpZWxkKiBmaXhlZDMyRmllbGQgPQotICAgICAgICAgIFtbW0dQQlVua25vd25GaWVsZCBhbGxvY10gaW5pdFdpdGhOdW1iZXI6dGFnXSBhdXRvcmVsZWFzZV07Ci0gICAgICBbZml4ZWQzMkZpZWxkIGFkZEZpeGVkMzI6MV07Ci0gICAgICBbYml6YXJyb0ZpZWxkcyBhZGRGaWVsZDpmaXhlZDMyRmllbGRdOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBbYml6YXJyb0ZpZWxkcyBkYXRhXTsKLX0KLQotLSAodm9pZCl0ZXN0U2VyaWFsaXplIHsKLSAgLy8gQ2hlY2sgdGhhdCBzZXJpYWxpemluZyB0aGUgVW5rbm93bkZpZWxkU2V0IHByb2R1Y2VzIHRoZSBvcmlnaW5hbCBkYXRhCi0gIC8vIGFnYWluLgotICBOU0RhdGEqIGRhdGEgPSBbZW1wdHlNZXNzYWdlXyBkYXRhXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFsbEZpZWxkc0RhdGFfLCBkYXRhKTsKLX0KLQotLSAodm9pZCl0ZXN0Q29weUZyb20gewotICBUZXN0RW1wdHlNZXNzYWdlKiBtZXNzYWdlID0gW1Rlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFttZXNzYWdlIG1lcmdlRnJvbTplbXB0eU1lc3NhZ2VfXTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZW1wdHlNZXNzYWdlXy5kYXRhLCBtZXNzYWdlLmRhdGEpOwotfQotCi0tICh2b2lkKXRlc3RNZXJnZUZyb20gewotICBHUEJVbmtub3duRmllbGRTZXQqIHNldDEgPSBbW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLSAgR1BCVW5rbm93bkZpZWxkKiBmaWVsZCA9IFtbW0dQQlVua25vd25GaWVsZCBhbGxvY10gaW5pdFdpdGhOdW1iZXI6Ml0gYXV0b3JlbGVhc2VdOwotICBbZmllbGQgYWRkVmFyaW50OjJdOwotICBbc2V0MSBhZGRGaWVsZDpmaWVsZF07Ci0gIGZpZWxkID0gW1tbR1BCVW5rbm93bkZpZWxkIGFsbG9jXSBpbml0V2l0aE51bWJlcjozXSBhdXRvcmVsZWFzZV07Ci0gIFtmaWVsZCBhZGRWYXJpbnQ6NF07Ci0gIFtzZXQxIGFkZEZpZWxkOmZpZWxkXTsKLQotICBHUEJVbmtub3duRmllbGRTZXQqIHNldDIgPSBbW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLSAgZmllbGQgPSBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOjFdIGF1dG9yZWxlYXNlXTsKLSAgW2ZpZWxkIGFkZFZhcmludDoxXTsKLSAgW3NldDIgYWRkRmllbGQ6ZmllbGRdOwotICBmaWVsZCA9IFtbW0dQQlVua25vd25GaWVsZCBhbGxvY10gaW5pdFdpdGhOdW1iZXI6M10gYXV0b3JlbGVhc2VdOwotICBbZmllbGQgYWRkVmFyaW50OjNdOwotICBbc2V0MiBhZGRGaWVsZDpmaWVsZF07Ci0KLSAgR1BCVW5rbm93bkZpZWxkU2V0KiBzZXQzID0gW1tbR1BCVW5rbm93bkZpZWxkU2V0IGFsbG9jXSBpbml0XSBhdXRvcmVsZWFzZV07Ci0gIGZpZWxkID0gW1tbR1BCVW5rbm93bkZpZWxkIGFsbG9jXSBpbml0V2l0aE51bWJlcjoxXSBhdXRvcmVsZWFzZV07Ci0gIFtmaWVsZCBhZGRWYXJpbnQ6MV07Ci0gIFtzZXQzIGFkZEZpZWxkOmZpZWxkXTsKLSAgZmllbGQgPSBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOjNdIGF1dG9yZWxlYXNlXTsKLSAgW2ZpZWxkIGFkZFZhcmludDo0XTsKLSAgW3NldDMgYWRkRmllbGQ6ZmllbGRdOwotCi0gIEdQQlVua25vd25GaWVsZFNldCogc2V0NCA9IFtbW0dQQlVua25vd25GaWVsZFNldCBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotICBmaWVsZCA9IFtbW0dQQlVua25vd25GaWVsZCBhbGxvY10gaW5pdFdpdGhOdW1iZXI6Ml0gYXV0b3JlbGVhc2VdOwotICBbZmllbGQgYWRkVmFyaW50OjJdOwotICBbc2V0NCBhZGRGaWVsZDpmaWVsZF07Ci0gIGZpZWxkID0gW1tbR1BCVW5rbm93bkZpZWxkIGFsbG9jXSBpbml0V2l0aE51bWJlcjozXSBhdXRvcmVsZWFzZV07Ci0gIFtmaWVsZCBhZGRWYXJpbnQ6M107Ci0gIFtzZXQ0IGFkZEZpZWxkOmZpZWxkXTsKLQotICBUZXN0RW1wdHlNZXNzYWdlKiBzb3VyY2UxID0gW1Rlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtzb3VyY2UxIHNldFVua25vd25GaWVsZHM6c2V0MV07Ci0gIFRlc3RFbXB0eU1lc3NhZ2UqIHNvdXJjZTIgPSBbVGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlXTsKLSAgW3NvdXJjZTIgc2V0VW5rbm93bkZpZWxkczpzZXQyXTsKLSAgVGVzdEVtcHR5TWVzc2FnZSogc291cmNlMyA9IFtUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2VdOwotICBbc291cmNlMyBzZXRVbmtub3duRmllbGRzOnNldDNdOwotICBUZXN0RW1wdHlNZXNzYWdlKiBzb3VyY2U0ID0gW1Rlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtzb3VyY2U0IHNldFVua25vd25GaWVsZHM6c2V0NF07Ci0KLSAgVGVzdEVtcHR5TWVzc2FnZSogZGVzdGluYXRpb24xID0gW1Rlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFtkZXN0aW5hdGlvbjEgbWVyZ2VGcm9tOnNvdXJjZTFdOwotICBbZGVzdGluYXRpb24xIG1lcmdlRnJvbTpzb3VyY2UyXTsKLQotICBUZXN0RW1wdHlNZXNzYWdlKiBkZXN0aW5hdGlvbjIgPSBbVGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlXTsKLSAgW2Rlc3RpbmF0aW9uMiBtZXJnZUZyb206c291cmNlM107Ci0gIFtkZXN0aW5hdGlvbjIgbWVyZ2VGcm9tOnNvdXJjZTRdOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhkZXN0aW5hdGlvbjEuZGF0YSwgZGVzdGluYXRpb24yLmRhdGEpOwotfQotCi0tICh2b2lkKXRlc3RDbGVhck1lc3NhZ2UgewotICBUZXN0RW1wdHlNZXNzYWdlICptZXNzYWdlID0gW1Rlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZV07Ci0gIFttZXNzYWdlIG1lcmdlRnJvbTplbXB0eU1lc3NhZ2VfXTsKLSAgW21lc3NhZ2UgY2xlYXJdOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlLnNlcmlhbGl6ZWRTaXplLCAoc2l6ZV90KTApOwotfQotCi0tICh2b2lkKXRlc3RQYXJzZUtub3duQW5kVW5rbm93biB7Ci0gIC8vIFRlc3QgbWl4aW5nIGtub3duIGFuZCB1bmtub3duIGZpZWxkcyB3aGVuIHBhcnNpbmcuCi0gIEdQQlVua25vd25GaWVsZFNldCAqZmllbGRzID0gW1t1bmtub3duRmllbGRzXyBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIEdQQlVua25vd25GaWVsZCAqZmllbGQgPQotICAgIFtbW0dQQlVua25vd25GaWVsZCBhbGxvY10gaW5pdFdpdGhOdW1iZXI6MTIzNDU2XSBhdXRvcmVsZWFzZV07Ci0gIFtmaWVsZCBhZGRWYXJpbnQ6NjU0MzIxXTsKLSAgW2ZpZWxkcyBhZGRGaWVsZDpmaWVsZF07Ci0KLSAgTlNEYXRhKiBkYXRhID0gZmllbGRzLmRhdGE7Ci0gIFRlc3RBbGxUeXBlcyogZGVzdGluYXRpb24gPSBbVGVzdEFsbFR5cGVzIHBhcnNlRnJvbURhdGE6ZGF0YSBlcnJvcjpOVUxMXTsKLQotICBbc2VsZiBhc3NlcnRBbGxGaWVsZHNTZXQ6ZGVzdGluYXRpb24gcmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgWENUQXNzZXJ0RXF1YWwoZGVzdGluYXRpb24udW5rbm93bkZpZWxkcy5jb3VudE9mRmllbGRzLCAoTlNVSW50ZWdlcikxKTsKLQotICBHUEJVbmtub3duRmllbGQqIGZpZWxkMiA9IFtkZXN0aW5hdGlvbi51bmtub3duRmllbGRzIGdldEZpZWxkOjEyMzQ1Nl07Ci0gIFhDVEFzc2VydEVxdWFsKGZpZWxkMi52YXJpbnRMaXN0LmNvdW50LCAoTlNVSW50ZWdlcikxKTsKLSAgWENUQXNzZXJ0RXF1YWwoNjU0MzIxVUxMLCBbZmllbGQyLnZhcmludExpc3QgdmFsdWVBdEluZGV4OjBdKTsKLX0KLQotLSAodm9pZCl0ZXN0V3JvbmdUeXBlVHJlYXRlZEFzVW5rbm93biB7Ci0gIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCi0gIC8vIHdoZW4gcGFyc2luZy4KLQotICBOU0RhdGEqIGJpemFycm9EYXRhID0gW3NlbGYgZ2V0Qml6YXJyb0RhdGFdOwotICBUZXN0QWxsVHlwZXMqIGFsbFR5cGVzTWVzc2FnZSA9Ci0gICAgICBbVGVzdEFsbFR5cGVzIHBhcnNlRnJvbURhdGE6Yml6YXJyb0RhdGEgZXJyb3I6TlVMTF07Ci0gIFRlc3RFbXB0eU1lc3NhZ2UqIGVtcHR5TWVzc2FnZSA9Ci0gICAgICBbVGVzdEVtcHR5TWVzc2FnZSBwYXJzZUZyb21EYXRhOmJpemFycm9EYXRhIGVycm9yOk5VTExdOwotCi0gIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncwotICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhlbXB0eU1lc3NhZ2UuZGF0YSwgYWxsVHlwZXNNZXNzYWdlLmRhdGEpOwotfQotCi0tICh2b2lkKXRlc3RVbmtub3duRXh0ZW5zaW9ucyB7Ci0gIC8vIE1ha2Ugc3VyZSBmaWVsZHMgYXJlIHByb3Blcmx5IHBhcnNlZCB0byB0aGUgVW5rbm93bkZpZWxkU2V0IGV2ZW4gd2hlbgotICAvLyB0aGV5IGFyZSBkZWNsYXJlZCBhcyBleHRlbnNpb24gbnVtYmVycy4KLQotICBUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMqIG1lc3NhZ2UgPQotICAgICAgW1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBwYXJzZUZyb21EYXRhOmFsbEZpZWxkc0RhdGFfIGVycm9yOk5VTExdOwotCi0gIFhDVEFzc2VydEVxdWFsKHVua25vd25GaWVsZHNfLmNvdW50T2ZGaWVsZHMsCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2UudW5rbm93bkZpZWxkcy5jb3VudE9mRmllbGRzKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGFsbEZpZWxkc0RhdGFfLCBtZXNzYWdlLmRhdGEpOwotfQotCi0tICh2b2lkKXRlc3RXcm9uZ0V4dGVuc2lvblR5cGVUcmVhdGVkQXNVbmtub3duIHsKLSAgLy8gVGVzdCB0aGF0IGZpZWxkcyBvZiB0aGUgd3Jvbmcgd2lyZSB0eXBlIGFyZSB0cmVhdGVkIGxpa2UgdW5rbm93biBmaWVsZHMKLSAgLy8gd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMuCi0KLSAgTlNEYXRhKiBiaXphcnJvRGF0YSA9IFtzZWxmIGdldEJpemFycm9EYXRhXTsKLSAgVGVzdEFsbEV4dGVuc2lvbnMqIGFsbEV4dGVuc2lvbnNNZXNzYWdlID0KLSAgICAgIFtUZXN0QWxsRXh0ZW5zaW9ucyBwYXJzZUZyb21EYXRhOmJpemFycm9EYXRhIGVycm9yOk5VTExdOwotICBUZXN0RW1wdHlNZXNzYWdlKiBlbXB0eU1lc3NhZ2UgPQotICAgICAgW1Rlc3RFbXB0eU1lc3NhZ2UgcGFyc2VGcm9tRGF0YTpiaXphcnJvRGF0YSBlcnJvcjpOVUxMXTsKLQotICAvLyBBbGwgZmllbGRzIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQgYXMgdW5rbm93biwgc28gdGhlIGRlYnVnIHN0cmluZ3MKLSAgLy8gc2hvdWxkIGJlIHRoZSBzYW1lLgotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZW1wdHlNZXNzYWdlLmRhdGEsIGFsbEV4dGVuc2lvbnNNZXNzYWdlLmRhdGEpOwotfQotCi0tICh2b2lkKXRlc3RMYXJnZVZhcmludCB7Ci0gIEdQQlVua25vd25GaWVsZFNldCogZmllbGRzID0gW1t1bmtub3duRmllbGRzXyBjb3B5XSBhdXRvcmVsZWFzZV07Ci0gIEdQQlVua25vd25GaWVsZCogZmllbGQgPSBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOjFdIGF1dG9yZWxlYXNlXTsKLSAgW2ZpZWxkIGFkZFZhcmludDoweDdGRkZGRkZGRkZGRkZGRkZMXTsKLSAgW2ZpZWxkcyBhZGRGaWVsZDpmaWVsZF07Ci0KLSAgTlNEYXRhKiBkYXRhID0gW2ZpZWxkcyBkYXRhXTsKLQotICBHUEJVbmtub3duRmllbGRTZXQqIHBhcnNlZCA9IFtbW0dQQlVua25vd25GaWVsZFNldCBhbGxvY10gaW5pdF0gYXV0b3JlbGVhc2VdOwotICBbcGFyc2VkIG1lcmdlRnJvbURhdGE6ZGF0YV07Ci0gIEdQQlVua25vd25GaWVsZCogZmllbGQyID0gW3BhcnNlZCBnZXRGaWVsZDoxXTsKLSAgWENUQXNzZXJ0RXF1YWwoZmllbGQyLnZhcmludExpc3QuY291bnQsIChOU1VJbnRlZ2VyKTEpOwotICBYQ1RBc3NlcnRFcXVhbCgweDdGRkZGRkZGRkZGRkZGRkZVTEwsIFtmaWVsZDIudmFyaW50TGlzdCB2YWx1ZUF0SW5kZXg6MF0pOwotfQotCi0tICh2b2lkKXRlc3RNZXJnaW5nRmllbGRzIHsKLSAgR1BCVW5rbm93bkZpZWxkKiBmaWVsZDEgPSBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOjFdIGF1dG9yZWxlYXNlXTsKLSAgW2ZpZWxkMSBhZGRWYXJpbnQ6MV07Ci0gIFtmaWVsZDEgYWRkRml4ZWQzMjoyXTsKLSAgW2ZpZWxkMSBhZGRGaXhlZDY0OjNdOwotICBbZmllbGQxIGFkZExlbmd0aERlbGltaXRlZDpbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6ImhlbGxvIiBsZW5ndGg6NV1dOwotICBbZmllbGQxIGFkZEdyb3VwOltbdW5rbm93bkZpZWxkc18gY29weV0gYXV0b3JlbGVhc2VdXTsKLSAgR1BCVW5rbm93bkZpZWxkKiBmaWVsZDIgPSBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOjJdIGF1dG9yZWxlYXNlXTsKLSAgW2ZpZWxkMiBtZXJnZUZyb21GaWVsZDpmaWVsZDFdOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoZmllbGQxLCBmaWVsZDIpOwotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQlV0aWxpdGllc1Rlc3RzLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL0dQQlV0aWxpdGllc1Rlc3RzLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMWZjMjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJVdGlsaXRpZXNUZXN0cy5tCisrKyAvZGV2L251bGwKQEAgLTEsMTczICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW1wb3J0IDxYQ1Rlc3QvWENUZXN0Lmg+Ci0KLSNpbXBvcnQgIkdQQlV0aWxpdGllc19QYWNrYWdlUHJpdmF0ZS5oIgotCi0jaW1wb3J0IDxvYmpjL3J1bnRpbWUuaD4KLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotCi0jaW1wb3J0ICJHUEJEZXNjcmlwdG9yLmgiCi0jaW1wb3J0ICJHUEJEZXNjcmlwdG9yX1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJHUEJNZXNzYWdlLmgiCi0KLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9NYXBVbml0dGVzdC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdE9iamMucGJvYmpjLmgiCi0KLUBpbnRlcmZhY2UgVXRpbGl0aWVzVGVzdHMgOiBHUEJUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gVXRpbGl0aWVzVGVzdHMKLQotLSAodm9pZCl0ZXN0UmlnaHRTaGlmdEZ1bmN0aW9ucyB7Ci0gIFhDVEFzc2VydEVxdWFsKCgxVUwgPDwgMzEpID4+IDMxLCAxVUwpOwotICBYQ1RBc3NlcnRFcXVhbCgoMSA8PCAzMSkgPj4gMzEsIC0xKTsKLSAgWENUQXNzZXJ0RXF1YWwoKDFVTEwgPDwgNjMpID4+IDYzLCAxVUxMKTsKLSAgWENUQXNzZXJ0RXF1YWwoKDFMTCA8PCA2MykgPj4gNjMsIC0xTEwpOwotCi0gIFhDVEFzc2VydEVxdWFsKEdQQkxvZ2ljYWxSaWdodFNoaWZ0MzIoKDEgPDwgMzEpLCAzMSksIDEpOwotICBYQ1RBc3NlcnRFcXVhbChHUEJMb2dpY2FsUmlnaHRTaGlmdDY0KCgxTEwgPDwgNjMpLCA2MyksIDFMTCk7Ci19Ci0KLS0gKHZvaWQpdGVzdEdQQkRlY29kZVRleHRGb3JtYXROYW1lIHsKLSAgdWludDhfdCBkZWNvZGVEYXRhW10gPSB7Ci0gICAgMHg2LAotICAgIC8vIEFuIGlubGluZWQgc3RyaW5nIChmaXJzdCB0byBtYWtlIHN1cmUgdGhlIGxlYWRpbmcgbnVsbCBpcyBoYW5kbGVkCi0gICAgLy8gY29ycmVjdGx5LCBhbmQgd2l0aCBhIGtleSBvZiB6ZXJvIHRvIGNoZWNrIHRoYXQpLgotICAgIDB4MCwgMHgwLCAneicsICdiJywgJ2MnLCAnZCcsICdlJywgJ2YnLCAnZycsICdoJywgJ0knLCAnSicsIDB4MCwKLSAgICAvLyBBbGwgYXMgaXMgKDAwIG9wKQotICAgIDB4MSwgMHgwQSwgMHgwLAotICAgIC8vIFVuZGVyc2NvcmUsIHVwcGVyICsgOSAoMTAgb3ApCi0gICAgMHgzLCAweENBLCAweDAsCi0gICAgLy8gIFVwcGVyICsgMyAoMTAgb3ApLCB1bmRlcnNjb3JlLCB1cHBlciArIDUgKDEwIG9wKQotICAgIDB4MiwgMHg0NCwgMHhDNiwgMHgwLAotICAgIC8vIEFsbCBVcHBlciBmb3IgNCAoMTEgb3ApLCB1bmRlcnNjb3JlLCB1bmRlcnNjb3JlLCB1cHBlciArIDUgKDEwIG9wKSwKLSAgICAvLyB1bmRlcnNjb3JlLCBsb3dlciArIDAgKDAxIG9wKQotICAgIDB4NCwgMHg2NCwgMHg4MCwgMHhDNSwgMHhBMSwgMHgwLAotICAgIC8vIDIgYnl0ZSBrZXk6IGFzIGlzICsgMyAoMDAgb3ApLCB1bmRlcnNjb3JlLCBsb3dlciArIDQgKDAxIG9wKSwKLSAgICAvLyAgIHVuZGVyc2NvcmUsIGxvd2VyICsgMyAoMDEgb3ApLCB1bmRlcnNjb3JlLCBsb3dlciArIDEgKDAxIG9wKSwKLSAgICAvLyAgIHVuZGVyc2NvcmUsIGxvd2VyICsgMzAgKDAxIG9wKSwgYXMgaXMgKyAzMCAoMDAgb3ApLCBhcyBpcyArIDEzICgwMCBvcCksCi0gICAgLy8gICB1bmRlcnNjb3JlLCBhcyBpcyArIDMgKDAwIG9wKQotICAgIDB4RTgsIDB4MDcsIDB4MDQsIDB4QTUsIDB4QTQsIDB4QTIsIDB4QkYsIDB4MUYsIDB4MEUsIDB4ODQsIDB4MCwKLSAgfTsKLSAgTlNTdHJpbmcgKmlucHV0U3RyID0gQCJhYmNkZWZnaElKIjsKLQotICAvLyBFbXB0eSBpbnB1dHMKLQotICBYQ1RBc3NlcnROaWwoR1BCRGVjb2RlVGV4dEZvcm1hdE5hbWUobmlsLCAxLCBOVUxMKSk7Ci0gIFhDVEFzc2VydE5pbChHUEJEZWNvZGVUZXh0Rm9ybWF0TmFtZShkZWNvZGVEYXRhLCAxLCBOVUxMKSk7Ci0gIFhDVEFzc2VydE5pbChHUEJEZWNvZGVUZXh0Rm9ybWF0TmFtZShuaWwsIDEsIGlucHV0U3RyKSk7Ci0KLSAgLy8gS2V5cyBub3QgZm91bmQuCi0KLSAgWENUQXNzZXJ0TmlsKEdQQkRlY29kZVRleHRGb3JtYXROYW1lKGRlY29kZURhdGEsIDUsIGlucHV0U3RyKSk7Ci0gIFhDVEFzc2VydE5pbChHUEJEZWNvZGVUZXh0Rm9ybWF0TmFtZShkZWNvZGVEYXRhLCAtMSwgaW5wdXRTdHIpKTsKLQotICAvLyBTb21lIG5hbWUgZGVjb2Rlcy4KLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoR1BCRGVjb2RlVGV4dEZvcm1hdE5hbWUoZGVjb2RlRGF0YSwgMSwgaW5wdXRTdHIpLCBAImFiY2RlZmdoSUoiKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKEdQQkRlY29kZVRleHRGb3JtYXROYW1lKGRlY29kZURhdGEsIDIsIGlucHV0U3RyKSwgQCJBYmNkX0VmZ2hJSiIpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoR1BCRGVjb2RlVGV4dEZvcm1hdE5hbWUoZGVjb2RlRGF0YSwgMywgaW5wdXRTdHIpLCBAIl9BYmNkZWZnaElKIik7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhHUEJEZWNvZGVUZXh0Rm9ybWF0TmFtZShkZWNvZGVEYXRhLCA0LCBpbnB1dFN0ciksIEAiQUJDRF9fRWZnaElfaiIpOwotCi0gIC8vIEFuIGlubGluZWQgc3RyaW5nIChhbmQga2V5IG9mIHplcm8pLgotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoR1BCRGVjb2RlVGV4dEZvcm1hdE5hbWUoZGVjb2RlRGF0YSwgMCwgaW5wdXRTdHIpLCBAInpiY2RlZmdoSUoiKTsKLQotICAvLyBMb25nIG5hbWUgc28gbXVsdGlwbGUgZGVjb2RlIG9wcyBhcmUgbmVlZGVkLgotICBpbnB1dFN0ciA9IEAibG9uZ0ZpZWxkTmFtZUlzTG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZzEwMDAiOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoR1BCRGVjb2RlVGV4dEZvcm1hdE5hbWUoZGVjb2RlRGF0YSwgMTAwMCwgaW5wdXRTdHIpLAotICAgICAgICAgICAgICAgICAgICAgICAgQCJsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDAwIik7Ci19Ci0KLS0gKHZvaWQpdGVzdFRleHRGb3JtYXQgewotICBUZXN0QWxsVHlwZXMgKm1lc3NhZ2UgPSBbVGVzdEFsbFR5cGVzIG1lc3NhZ2VdOwotCi0gIC8vIE5vdCBrR1BCRGVmYXVsdFJlcGVhdENvdW50IGJlY2F1c2Ugd2UgYXJlIGNvbXBhcmluZyB0byBnb2xkZW4gbWFzdGVyIGZpbGUKLSAgLy8gd2hpY2ggd2FzIGdlbmVyYXRlZCB3aXRoIDIuCi0gIFtzZWxmIHNldEFsbEZpZWxkczptZXNzYWdlIHJlcGVhdGVkQ291bnQ6Ml07Ci0KLSAgTlNTdHJpbmcgKnJlc3VsdCA9IEdQQlRleHRGb3JtYXRGb3JNZXNzYWdlKG1lc3NhZ2UsIG5pbCk7Ci0KLSAgTlNTdHJpbmcgKmZpbGVOYW1lID0gQCJ0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCI7Ci0gIE5TRGF0YSAqcmVzdWx0RGF0YSA9IFtyZXN1bHQgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotICBOU0RhdGEgKmV4cGVjdGVkRGF0YSA9Ci0gICAgICBbc2VsZiBnZXREYXRhRmlsZU5hbWVkOmZpbGVOYW1lIGRhdGFUb1dyaXRlOnJlc3VsdERhdGFdOwotICBOU1N0cmluZyAqZXhwZWN0ZWQgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZXhwZWN0ZWREYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhleHBlY3RlZCwgcmVzdWx0KTsKLSAgW2V4cGVjdGVkIHJlbGVhc2VdOwotfQotCi0tICh2b2lkKXRlc3RUZXh0Rm9ybWF0RXh0cmEgewotICAvLyAtdGVzdFRleHRGb3JtYXQgdXNlcyBhbGwgcHJvdG9zIHdpdGggZmllbGRzIHRoYXQgZG9uJ3QgcmVxdWlyZSBzcGVjaWFsCi0gIC8vIGhhbmRpbmcgZm9yIGZpZ3VyaW5nIG91dCB0aGUgbmFtZXMuICBUaGUgT2JqQyBwcm90byBoYXMgYSBidW5jaCBvZiBvZGRiYWxsCi0gIC8vIGZpZWxkIGFuZCBlbnVtIG5hbWVzIHRoYXQgcmVxdWlyZSB0aGUgZGVjb2RlIGluZm8gdG8gZ2V0IHJpZ2h0LCBzbyB0aGlzCi0gIC8vIGNvbmZpcm1zIHRoZXkgZ2VuZXJhdGVkIGFuZCBkZWNvZGVkIGNvcnJlY3RseS4KLQotICBzZWxmX0NsYXNzICptZXNzYWdlID0gW3NlbGZfQ2xhc3MgbWVzc2FnZV07Ci0gIG1lc3NhZ2UuY21kID0gWUVTOwotICBtZXNzYWdlLmlzUHJveHlfcCA9IFlFUzsKLSAgbWVzc2FnZS5zdWJFbnVtID0gc2VsZl9hdXRvcmVsZWFzZV9SZXRhaW5Db3VudDsKLSAgbWVzc2FnZS5uZXdfcC5jb3B5X3AgPSBAImZvbyI7Ci0KLSAgTlNTdHJpbmcgKmV4cGVjdGVkID0gQCJfY21kOiB0cnVlXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIEAiaXNQcm94eTogdHJ1ZVxuIgotICAgICAgICAgICAgICAgICAgICAgICBAIlN1YkVudW06IHJldGFpbkNvdW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIEAiTmV3IHtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgQCIgIGNvcHk6IFwiZm9vXCJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgQCJ9XG4iOwotICBOU1N0cmluZyAqcmVzdWx0ID0gR1BCVGV4dEZvcm1hdEZvck1lc3NhZ2UobWVzc2FnZSwgbmlsKTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKGV4cGVjdGVkLCByZXN1bHQpOwotfQotCi0tICh2b2lkKXRlc3RUZXh0Rm9ybWF0TWFwcyB7Ci0gIFRlc3RNYXAgKm1lc3NhZ2UgPSBbVGVzdE1hcCBtZXNzYWdlXTsKLQotICAvLyBNYXAgaXRlcmF0aW9uIG9yZGVyIGRvZXNuJ3QgaGF2ZSB0byBiZSBzdGFibGUsIHNvIHVzZSBvbmx5IG9uZSBlbnRyeS4KLSAgW3NlbGYgc2V0QWxsTWFwRmllbGRzOm1lc3NhZ2UgbnVtRW50cmllczoxXTsKLQotICBOU1N0cmluZyAqcmVzdWx0ID0gR1BCVGV4dEZvcm1hdEZvck1lc3NhZ2UobWVzc2FnZSwgbmlsKTsKLQotICBOU1N0cmluZyAqZmlsZU5hbWUgPSBAInRleHRfZm9ybWF0X21hcF91bml0dGVzdF9kYXRhLnR4dCI7Ci0gIE5TRGF0YSAqcmVzdWx0RGF0YSA9IFtyZXN1bHQgZGF0YVVzaW5nRW5jb2Rpbmc6TlNVVEY4U3RyaW5nRW5jb2RpbmddOwotICBOU0RhdGEgKmV4cGVjdGVkRGF0YSA9Ci0gICAgICBbc2VsZiBnZXREYXRhRmlsZU5hbWVkOmZpbGVOYW1lIGRhdGFUb1dyaXRlOnJlc3VsdERhdGFdOwotICBOU1N0cmluZyAqZXhwZWN0ZWQgPSBbW05TU3RyaW5nIGFsbG9jXSBpbml0V2l0aERhdGE6ZXhwZWN0ZWREYXRhCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGluZzpOU1VURjhTdHJpbmdFbmNvZGluZ107Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhleHBlY3RlZCwgcmVzdWx0KTsKLSAgW2V4cGVjdGVkIHJlbGVhc2VdOwotfQotCi0vLyBUT0RPKHRob21hc3ZsKTogYWRkIHRlc3Qgd2l0aCBleHRlbnNpb25zIG9uY2UgdGhvc2UgZm9ybWF0IHdpdGggY29ycmVjdCBuYW1lcy4KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJXZWxsS25vd25UeXBlc1Rlc3QubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCV2VsbEtub3duVHlwZXNUZXN0Lm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc4ZjRlNjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJXZWxsS25vd25UeXBlc1Rlc3QubQorKysgL2Rldi9udWxsCkBAIC0xLDEwMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCV2VsbEtub3duVHlwZXMuaCIKLQotI2ltcG9ydCA8WENUZXN0L1hDVGVzdC5oPgotCi0vLyBBIGJhc2ljYWxseSByYW5kb20gaW50ZXJ2YWwgaW50byB0aGUgZnV0dXJlIGZvciB0ZXN0aW5nIHdpdGguCi1zdGF0aWMgY29uc3QgTlNUaW1lSW50ZXJ2YWwga0Z1dHVyZU9mZnNldEludGVydmFsID0gMTUwMDA7Ci0KLS8vIE5hbm9zZWNvbmQgdGltZSBhY2N1cmFjeQotc3RhdGljIGNvbnN0IE5TVGltZUludGVydmFsIGtUaW1lQWNjdXJhY3kgPSAxZS05OwotCi1AaW50ZXJmYWNlIFdlbGxLbm93blR5cGVzVGVzdCA6IFhDVGVzdENhc2UKLUBlbmQKLQotQGltcGxlbWVudGF0aW9uIFdlbGxLbm93blR5cGVzVGVzdAotCi0tICh2b2lkKXRlc3RUaW1lU3RhbXAgewotICAvLyBUZXN0IENyZWF0aW9uLgotICBOU0RhdGUgKmRhdGUgPSBbTlNEYXRlIGRhdGVdOwotICBHUEJUaW1lc3RhbXAgKnRpbWVTdGFtcCA9IFtbR1BCVGltZXN0YW1wIGFsbG9jXSBpbml0V2l0aERhdGU6ZGF0ZV07Ci0gIE5TRGF0ZSAqdGltZVN0YW1wRGF0ZSA9IHRpbWVTdGFtcC5kYXRlOwotCi0gIC8vIENvbXBhcmluZyB0aW1lSW50ZXJ2YWxzIGluc3RlYWQgb2YgZGlyZWN0bHkgY29tcGFyaW5nIGRhdGVzIGJlY2F1c2UgZGF0ZQotICAvLyBlcXVhbGl0eSByZXF1aXJlcyB0aGUgdGltZSBpbnRlcnZhbHMgdG8gYmUgZXhhY3RseSB0aGUgc2FtZSwgYW5kIHRoZQotICAvLyB0aW1laW50ZXJ2YWxzIGdvIHRocm91Z2ggYSBiaXQgb2YgZmxvYXRpbmcgcG9pbnQgZXJyb3IgYXMgdGhleSBhcmUKLSAgLy8gY29udmVydGVkIGJhY2sgYW5kIGZvcnRoIGZyb20gdGhlIGludGVybmFsIHJlcHJlc2VudGF0aW9uLgotICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeShkYXRlLnRpbWVJbnRlcnZhbFNpbmNlMTk3MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZVN0YW1wRGF0ZS50aW1lSW50ZXJ2YWxTaW5jZTE5NzAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtUaW1lQWNjdXJhY3kpOwotCi0gIE5TVGltZUludGVydmFsIHRpbWUgPSBbZGF0ZSB0aW1lSW50ZXJ2YWxTaW5jZTE5NzBdOwotICBHUEJUaW1lc3RhbXAgKnRpbWVTdGFtcDIgPQotICAgICAgW1tHUEJUaW1lc3RhbXAgYWxsb2NdIGluaXRXaXRoVGltZUludGVydmFsU2luY2UxOTcwOnRpbWVdOwotICBOU1RpbWVJbnRlcnZhbCBkdXJhdGlvblRpbWUgPSB0aW1lU3RhbXAyLnRpbWVJbnRlcnZhbFNpbmNlMTk3MDsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3kodGltZSwgZHVyYXRpb25UaW1lLCBrVGltZUFjY3VyYWN5KTsKLSAgW3RpbWVTdGFtcCByZWxlYXNlXTsKLQotICAvLyBUZXN0IE11dGF0aW9uLgotICBkYXRlID0gW05TRGF0ZSBkYXRlV2l0aFRpbWVJbnRlcnZhbFNpbmNlTm93OmtGdXR1cmVPZmZzZXRJbnRlcnZhbF07Ci0gIHRpbWVTdGFtcDIuZGF0ZSA9IGRhdGU7Ci0gIHRpbWVTdGFtcERhdGUgPSB0aW1lU3RhbXAyLmRhdGU7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KGRhdGUudGltZUludGVydmFsU2luY2UxOTcwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lU3RhbXBEYXRlLnRpbWVJbnRlcnZhbFNpbmNlMTk3MCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1RpbWVBY2N1cmFjeSk7Ci0KLSAgdGltZSA9IGRhdGUudGltZUludGVydmFsU2luY2UxOTcwOwotICB0aW1lU3RhbXAyLnRpbWVJbnRlcnZhbFNpbmNlMTk3MCA9IHRpbWU7Ci0gIGR1cmF0aW9uVGltZSA9IHRpbWVTdGFtcDIudGltZUludGVydmFsU2luY2UxOTcwOwotICBYQ1RBc3NlcnRFcXVhbFdpdGhBY2N1cmFjeSh0aW1lLCBkdXJhdGlvblRpbWUsIGtUaW1lQWNjdXJhY3kpOwotICBbdGltZVN0YW1wMiByZWxlYXNlXTsKLX0KLQotLSAodm9pZCl0ZXN0RHVyYXRpb24gewotICAvLyBUZXN0IENyZWF0aW9uLgotICBOU1RpbWVJbnRlcnZhbCB0aW1lID0gW1tOU0RhdGUgZGF0ZV0gdGltZUludGVydmFsU2luY2UxOTcwXTsKLSAgR1BCRHVyYXRpb24gKmR1cmF0aW9uID0KLSAgICAgIFtbR1BCRHVyYXRpb24gYWxsb2NdIGluaXRXaXRoVGltZUludGVydmFsU2luY2UxOTcwOnRpbWVdOwotICBOU1RpbWVJbnRlcnZhbCBkdXJhdGlvblRpbWUgPSBkdXJhdGlvbi50aW1lSW50ZXJ2YWxTaW5jZTE5NzA7Ci0gIFhDVEFzc2VydEVxdWFsV2l0aEFjY3VyYWN5KHRpbWUsIGR1cmF0aW9uVGltZSwga1RpbWVBY2N1cmFjeSk7Ci0gIFtkdXJhdGlvbiByZWxlYXNlXTsKLQotICAvLyBUZXN0IE11dGF0aW9uLgotICBHUEJEdXJhdGlvbiAqZHVyYXRpb24yID0KLSAgICAgIFtbR1BCRHVyYXRpb24gYWxsb2NdIGluaXRXaXRoVGltZUludGVydmFsU2luY2UxOTcwOnRpbWVdOwotICBOU0RhdGUgKmRhdGUgPSBbTlNEYXRlIGRhdGVXaXRoVGltZUludGVydmFsU2luY2VOb3c6a0Z1dHVyZU9mZnNldEludGVydmFsXTsKLSAgdGltZSA9IGRhdGUudGltZUludGVydmFsU2luY2UxOTcwOwotICBkdXJhdGlvbjIudGltZUludGVydmFsU2luY2UxOTcwID0gdGltZTsKLSAgZHVyYXRpb25UaW1lID0gZHVyYXRpb24yLnRpbWVJbnRlcnZhbFNpbmNlMTk3MDsKLSAgWENUQXNzZXJ0RXF1YWxXaXRoQWNjdXJhY3kodGltZSwgZHVyYXRpb25UaW1lLCBrVGltZUFjY3VyYWN5KTsKLSAgW2R1cmF0aW9uMiByZWxlYXNlXTsKLX0KLQotQGVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJXaXJlRm9ybWF0VGVzdHMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvR1BCV2lyZUZvcm1hdFRlc3RzLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhNDA2ZjEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9HUEJXaXJlRm9ybWF0VGVzdHMubQorKysgL2Rldi9udWxsCkBAIC0xLDI1MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2ltcG9ydCAiR1BCVGVzdFV0aWxpdGllcy5oIgotCi0jaW1wb3J0ICJHUEJDb2RlZElucHV0U3RyZWFtLmgiCi0jaW1wb3J0ICJHUEJNZXNzYWdlX1BhY2thZ2VQcml2YXRlLmgiCi0jaW1wb3J0ICJHUEJVbmtub3duRmllbGRfUGFja2FnZVByaXZhdGUuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9Vbml0dGVzdE1zZXQucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RNc2V0V2lyZUZvcm1hdC5wYm9iamMuaCIKLQotQGludGVyZmFjZSBXaXJlRm9ybWF0VGVzdHMgOiBHUEJUZXN0Q2FzZQotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gV2lyZUZvcm1hdFRlc3RzCi0KLS0gKHZvaWQpdGVzdFNlcmlhbGl6YXRpb24gewotICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UgPSBbc2VsZiBhbGxTZXRSZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotCi0gIE5TRGF0YSogcmF3Qnl0ZXMgPSBtZXNzYWdlLmRhdGE7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2Uuc2VyaWFsaXplZFNpemUsIChzaXplX3QpcmF3Qnl0ZXMubGVuZ3RoKTsKLQotICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UyID0gW1Rlc3RBbGxUeXBlcyBwYXJzZUZyb21EYXRhOnJhd0J5dGVzIGVycm9yOk5VTExdOwotCi0gIFtzZWxmIGFzc2VydEFsbEZpZWxkc1NldDptZXNzYWdlMiByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotfQotCi0tICh2b2lkKXRlc3RTZXJpYWxpemF0aW9uUGFja2VkIHsKLSAgVGVzdFBhY2tlZFR5cGVzKiBtZXNzYWdlID0KLSAgICAgIFtzZWxmIHBhY2tlZFNldFJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0KLSAgTlNEYXRhKiByYXdCeXRlcyA9IG1lc3NhZ2UuZGF0YTsKLSAgWENUQXNzZXJ0RXF1YWwobWVzc2FnZS5zZXJpYWxpemVkU2l6ZSwgKHNpemVfdClyYXdCeXRlcy5sZW5ndGgpOwotCi0gIFRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZTIgPQotICAgICAgW1Rlc3RQYWNrZWRUeXBlcyBwYXJzZUZyb21EYXRhOnJhd0J5dGVzIGVycm9yOk5VTExdOwotCi0gIFtzZWxmIGFzc2VydFBhY2tlZEZpZWxkc1NldDptZXNzYWdlMiByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotfQotCi0tICh2b2lkKXRlc3RTZXJpYWxpemVFeHRlbnNpb25zIHsKLSAgLy8gVGVzdEFsbFR5cGVzIGFuZCBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUgZm9ybWF0cywKLSAgLy8gc28gaWYgd2Ugc2VyZWFsaXplIGEgVGVzdEFsbEV4dGVuc2lvbnMgdGhlbiBwYXJzZSBpdCBhcyBUZXN0QWxsVHlwZXMKLSAgLy8gaXQgc2hvdWxkIHdvcmsuCi0KLSAgVGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UgPQotICAgICAgW3NlbGYgYWxsRXh0ZW5zaW9uc1NldFJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci0gIE5TRGF0YSogcmF3Qnl0ZXMgPSBtZXNzYWdlLmRhdGE7Ci0gIFhDVEFzc2VydEVxdWFsKG1lc3NhZ2Uuc2VyaWFsaXplZFNpemUsIChzaXplX3QpcmF3Qnl0ZXMubGVuZ3RoKTsKLQotICBUZXN0QWxsVHlwZXMqIG1lc3NhZ2UyID0gW1Rlc3RBbGxUeXBlcyBwYXJzZUZyb21EYXRhOnJhd0J5dGVzIGVycm9yOk5VTExdOwotCi0gIFtzZWxmIGFzc2VydEFsbEZpZWxkc1NldDptZXNzYWdlMiByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotfQotCi0tICh2b2lkKXRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zIHsKLSAgLy8gVGVzdFBhY2tlZFR5cGVzIGFuZCBUZXN0UGFja2VkRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUKLSAgLy8gZm9ybWF0czsgY2hlY2sgdGhhdCB0aGV5IHNlcmlhbGl6ZSB0byB0aGUgc2FtZSBzdHJpbmcuCi0gIFRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlID0KLSAgICAgIFtzZWxmIHBhY2tlZEV4dGVuc2lvbnNTZXRSZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBOU0RhdGEqIHJhd0J5dGVzID0gbWVzc2FnZS5kYXRhOwotCi0gIFRlc3RQYWNrZWRUeXBlcyogbWVzc2FnZTIgPQotICAgICAgW3NlbGYgcGFja2VkU2V0UmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgTlNEYXRhKiByYXdCeXRlczIgPSBtZXNzYWdlMi5kYXRhOwotCi0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKLX0KLQotLSAodm9pZCl0ZXN0UGFyc2VFeHRlbnNpb25zIHsKLSAgLy8gVGVzdEFsbFR5cGVzIGFuZCBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUgZm9ybWF0cywKLSAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbFR5cGVzIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbEV4dGVuc2lvbnMKLSAgLy8gaXQgc2hvdWxkIHdvcmsuCi0KLSAgVGVzdEFsbFR5cGVzKiBtZXNzYWdlID0gW3NlbGYgYWxsU2V0UmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XTsKLSAgTlNEYXRhKiByYXdCeXRlcyA9IG1lc3NhZ2UuZGF0YTsKLQotICBHUEJFeHRlbnNpb25SZWdpc3RyeSogcmVnaXN0cnkgPSBbc2VsZiBleHRlbnNpb25SZWdpc3RyeV07Ci0KLSAgVGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UyID0gW1Rlc3RBbGxFeHRlbnNpb25zIHBhcnNlRnJvbURhdGE6cmF3Qnl0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnk6cmVnaXN0cnkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6TlVMTF07Ci0KLSAgW3NlbGYgYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldDptZXNzYWdlMiByZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotfQotCi0KLS0gKHZvaWQpIHRlc3RFeHRlbnNpb25zU2VyaWFsaXplZFNpemUgewotICBzaXplX3QgYWxsU2V0ID0gW3NlbGYgYWxsU2V0UmVwZWF0ZWRDb3VudDprR1BCRGVmYXVsdFJlcGVhdENvdW50XS5zZXJpYWxpemVkU2l6ZTsKLSAgc2l6ZV90IGV4dGVuc2lvblNldCA9IFtzZWxmIGFsbEV4dGVuc2lvbnNTZXRSZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdLnNlcmlhbGl6ZWRTaXplOwotICBYQ1RBc3NlcnRFcXVhbChhbGxTZXQsIGV4dGVuc2lvblNldCk7Ci19Ci0KLS0gKHZvaWQpdGVzdFBhcnNlUGFja2VkRXh0ZW5zaW9ucyB7Ci0gIC8vIEVuc3VyZSB0aGF0IHBhY2tlZCBleHRlbnNpb25zIGNhbiBiZSBwcm9wZXJseSBwYXJzZWQuCi0gIFRlc3RQYWNrZWRFeHRlbnNpb25zKiBtZXNzYWdlID0KLSAgICAgIFtzZWxmIHBhY2tlZEV4dGVuc2lvbnNTZXRSZXBlYXRlZENvdW50OmtHUEJEZWZhdWx0UmVwZWF0Q291bnRdOwotICBOU0RhdGEqIHJhd0J5dGVzID0gbWVzc2FnZS5kYXRhOwotCi0gIEdQQkV4dGVuc2lvblJlZ2lzdHJ5KiByZWdpc3RyeSA9IFtzZWxmIGV4dGVuc2lvblJlZ2lzdHJ5XTsKLQotICBUZXN0UGFja2VkRXh0ZW5zaW9ucyogbWVzc2FnZTIgPSBbVGVzdFBhY2tlZEV4dGVuc2lvbnMgcGFyc2VGcm9tRGF0YTpyYXdCeXRlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeTpyZWdpc3RyeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpOVUxMXTsKLQotICBbc2VsZiBhc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0Om1lc3NhZ2UyCi0gICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkQ291bnQ6a0dQQkRlZmF1bHRSZXBlYXRDb3VudF07Ci19Ci0KLWNvbnN0IGludCBrVW5rbm93blR5cGVJZCA9IDE1NTAwNTU7Ci0KLS0gKHZvaWQpdGVzdFNlcmlhbGl6ZU1lc3NhZ2VTZXQgewotICAvLyBTZXQgdXAgYSBUZXN0TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCi0gIFRlc3RNZXNzYWdlU2V0KiBtZXNzYWdlX3NldCA9IFtUZXN0TWVzc2FnZVNldCBtZXNzYWdlXTsKLSAgW1ttZXNzYWdlX3NldCBnZXRFeHRlbnNpb246W1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlU2V0RXh0ZW5zaW9uXV0KLSAgICAgIHNldEk6MTIzXTsKLSAgW1ttZXNzYWdlX3NldCBnZXRFeHRlbnNpb246W1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlU2V0RXh0ZW5zaW9uXV0KLSAgICAgIHNldFN0cjpAImZvbyJdOwotICBHUEJVbmtub3duRmllbGQqIHVua25vd25GaWVsZCA9Ci0gICAgICBbW1tHUEJVbmtub3duRmllbGQgYWxsb2NdIGluaXRXaXRoTnVtYmVyOmtVbmtub3duVHlwZUlkXSBhdXRvcmVsZWFzZV07Ci0gIFt1bmtub3duRmllbGQgYWRkTGVuZ3RoRGVsaW1pdGVkOltOU0RhdGEgZGF0YVdpdGhCeXRlczoiYmFyIiBsZW5ndGg6M11dOwotICBHUEJVbmtub3duRmllbGRTZXQqIHVua25vd25GaWVsZFNldCA9Ci0gICAgICBbW1tHUEJVbmtub3duRmllbGRTZXQgYWxsb2NdIGluaXRdIGF1dG9yZWxlYXNlXTsKLSAgW3Vua25vd25GaWVsZFNldCBhZGRGaWVsZDp1bmtub3duRmllbGRdOwotICBbbWVzc2FnZV9zZXQgc2V0VW5rbm93bkZpZWxkczp1bmtub3duRmllbGRTZXRdOwotCi0gIE5TRGF0YSogZGF0YSA9IFttZXNzYWdlX3NldCBkYXRhXTsKLQotICAvLyBQYXJzZSBiYWNrIHVzaW5nIFJhd01lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KLSAgUmF3TWVzc2FnZVNldCogcmF3ID0gW1Jhd01lc3NhZ2VTZXQgcGFyc2VGcm9tRGF0YTpkYXRhIGVycm9yOk5VTExdOwotCi0gIFhDVEFzc2VydEVxdWFsKFtyYXcudW5rbm93bkZpZWxkcyBjb3VudE9mRmllbGRzXSwgKE5TVUludGVnZXIpMCk7Ci0KLSAgWENUQXNzZXJ0RXF1YWwocmF3Lml0ZW1BcnJheS5jb3VudCwgKE5TVUludGVnZXIpMyk7Ci0gIFhDVEFzc2VydEVxdWFsKCh1aW50MzJfdClbcmF3Lml0ZW1BcnJheVswXSB0eXBlSWRdLAotICAgICAgICAgICAgICAgICBbVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2VTZXRFeHRlbnNpb25dLmZpZWxkTnVtYmVyKTsKLSAgWENUQXNzZXJ0RXF1YWwoKHVpbnQzMl90KVtyYXcuaXRlbUFycmF5WzFdIHR5cGVJZF0sCi0gICAgICAgICAgICAgICAgIFtUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgbWVzc2FnZVNldEV4dGVuc2lvbl0uZmllbGROdW1iZXIpOwotICBYQ1RBc3NlcnRFcXVhbChbcmF3Lml0ZW1BcnJheVsyXSB0eXBlSWRdLCBrVW5rbm93blR5cGVJZCk7Ci0KLSAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKiBtZXNzYWdlMSA9Ci0gICAgICBbVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIHBhcnNlRnJvbURhdGE6WygoUmF3TWVzc2FnZVNldF9JdGVtKilyYXcuaXRlbUFycmF5WzBdKSBtZXNzYWdlXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yOk5VTExdOwotICBYQ1RBc3NlcnRFcXVhbChtZXNzYWdlMS5pLCAxMjMpOwotCi0gIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiogbWVzc2FnZTIgPQotICAgICAgW1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBwYXJzZUZyb21EYXRhOlsoKFJhd01lc3NhZ2VTZXRfSXRlbSopcmF3Lml0ZW1BcnJheVsxXSkgbWVzc2FnZV0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcjpOVUxMXTsKLSAgWENUQXNzZXJ0RXF1YWxPYmplY3RzKG1lc3NhZ2UyLnN0ciwgQCJmb28iKTsKLQotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoW3Jhdy5pdGVtQXJyYXlbMl0gbWVzc2FnZV0sCi0gICAgICAgICAgICAgICAgICAgICAgICBbTlNEYXRhIGRhdGFXaXRoQnl0ZXM6ImJhciIgbGVuZ3RoOjNdKTsKLX0KLQotLSAodm9pZCl0ZXN0UGFyc2VNZXNzYWdlU2V0IHsKLSAgLy8gU2V0IHVwIGEgUmF3TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCi0gIFJhd01lc3NhZ2VTZXQqIHJhdyA9IFtSYXdNZXNzYWdlU2V0IG1lc3NhZ2VdOwotCi0gIHsKLSAgICBSYXdNZXNzYWdlU2V0X0l0ZW0qIGl0ZW0gPSBbUmF3TWVzc2FnZVNldF9JdGVtIG1lc3NhZ2VdOwotICAgIGl0ZW0udHlwZUlkID0gW1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlU2V0RXh0ZW5zaW9uXS5maWVsZE51bWJlcjsKLSAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIG1lc3NhZ2UgPSBbVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2VdOwotICAgIG1lc3NhZ2UuaSA9IDEyMzsKLSAgICBpdGVtLm1lc3NhZ2UgPSBbbWVzc2FnZSBkYXRhXTsKLSAgICBbcmF3Lml0ZW1BcnJheSBhZGRPYmplY3Q6aXRlbV07Ci0gIH0KLQotICB7Ci0gICAgUmF3TWVzc2FnZVNldF9JdGVtKiBpdGVtID0gW1Jhd01lc3NhZ2VTZXRfSXRlbSBtZXNzYWdlXTsKLSAgICBpdGVtLnR5cGVJZCA9IFtUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgbWVzc2FnZVNldEV4dGVuc2lvbl0uZmllbGROdW1iZXI7Ci0gICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKiBtZXNzYWdlID0gW1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlXTsKLSAgICBtZXNzYWdlLnN0ciA9IEAiZm9vIjsKLSAgICBpdGVtLm1lc3NhZ2UgPSBbbWVzc2FnZSBkYXRhXTsKLSAgICBbcmF3Lml0ZW1BcnJheSBhZGRPYmplY3Q6aXRlbV07Ci0gIH0KLQotICB7Ci0gICAgUmF3TWVzc2FnZVNldF9JdGVtKiBpdGVtID0gW1Jhd01lc3NhZ2VTZXRfSXRlbSBtZXNzYWdlXTsKLSAgICBpdGVtLnR5cGVJZCA9IGtVbmtub3duVHlwZUlkOwotICAgIGl0ZW0ubWVzc2FnZSA9IFtOU0RhdGEgZGF0YVdpdGhCeXRlczoiYmFyIiBsZW5ndGg6M107Ci0gICAgW3Jhdy5pdGVtQXJyYXkgYWRkT2JqZWN0Oml0ZW1dOwotICB9Ci0KLSAgTlNEYXRhKiBkYXRhID0gW3JhdyBkYXRhXTsKLQotICAvLyBQYXJzZSBhcyBhIFRlc3RNZXNzYWdlU2V0IGFuZCBjaGVjayB0aGUgY29udGVudHMuCi0gIFRlc3RNZXNzYWdlU2V0KiBtZXNzYWdlU2V0ID0KLSAgICAgIFtUZXN0TWVzc2FnZVNldCBwYXJzZUZyb21EYXRhOmRhdGEKLSAgICAgICAgICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5OltVbml0dGVzdE1zZXRSb290IGV4dGVuc2lvblJlZ2lzdHJ5XQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3I6TlVMTF07Ci0KLSAgWENUQXNzZXJ0RXF1YWwoCi0gICAgICBbW21lc3NhZ2VTZXQKLSAgICAgICAgICBnZXRFeHRlbnNpb246W1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlU2V0RXh0ZW5zaW9uXV0gaV0sCi0gICAgICAxMjMpOwotICBYQ1RBc3NlcnRFcXVhbE9iamVjdHMoCi0gICAgICBbW21lc3NhZ2VTZXQKLSAgICAgICAgICBnZXRFeHRlbnNpb246W1Rlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlU2V0RXh0ZW5zaW9uXV0gc3RyXSwKLSAgICAgIEAiZm9vIik7Ci0KLSAgWENUQXNzZXJ0RXF1YWwoW21lc3NhZ2VTZXQudW5rbm93bkZpZWxkcyBjb3VudE9mRmllbGRzXSwgKE5TVUludGVnZXIpMSk7Ci0gIEdQQlVua25vd25GaWVsZCogdW5rbm93bkZpZWxkID0gW21lc3NhZ2VTZXQudW5rbm93bkZpZWxkcyBnZXRGaWVsZDprVW5rbm93blR5cGVJZF07Ci0gIFhDVEFzc2VydE5vdE5pbCh1bmtub3duRmllbGQpOwotICBYQ1RBc3NlcnRFcXVhbCh1bmtub3duRmllbGQubGVuZ3RoRGVsaW1pdGVkTGlzdC5jb3VudCwgKE5TVUludGVnZXIpMSk7Ci0gIFhDVEFzc2VydEVxdWFsT2JqZWN0cyh1bmtub3duRmllbGQubGVuZ3RoRGVsaW1pdGVkTGlzdFswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgIFtOU0RhdGEgZGF0YVdpdGhCeXRlczoiYmFyIiBsZW5ndGg6M10pOwotfQotCi0tICh2b2lkKWFzc2VydEZpZWxkc0luT3JkZXI6KE5TRGF0YSopZGF0YSB7Ci0gIEdQQkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0ID0gW0dQQkNvZGVkSW5wdXRTdHJlYW0gc3RyZWFtV2l0aERhdGE6ZGF0YV07Ci0gIGludDMyX3QgcHJldmlvdXNUYWcgPSAwOwotCi0gIHdoaWxlIChZRVMpIHsKLSAgICBpbnQzMl90IHRhZyA9IFtpbnB1dCByZWFkVGFnXTsKLSAgICBpZiAodGFnID09IDApIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIFhDVEFzc2VydEdyZWF0ZXJUaGFuKHRhZywgcHJldmlvdXNUYWcpOwotICAgIFtpbnB1dCBza2lwRmllbGQ6dGFnXTsKLSAgfQotfQotCi1AZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL1VuaXRUZXN0cy1CcmlkZ2luZy1IZWFkZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvVW5pdFRlc3RzLUJyaWRnaW5nLUhlYWRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjI5MmZjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvVW5pdFRlc3RzLUJyaWRnaW5nLUhlYWRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsNiArMCwwIEBACi0vLwotLy8gIFVzZSB0aGlzIGZpbGUgdG8gaW1wb3J0IHlvdXIgdGFyZ2V0J3MgcHVibGljIGhlYWRlcnMgdGhhdCB5b3Ugd291bGQgbGlrZSB0byBleHBvc2UgdG8gU3dpZnQuCi0vLwotCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVW5pdHRlc3RSdW50aW1lUHJvdG8yLnBib2JqYy5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1VuaXR0ZXN0UnVudGltZVByb3RvMy5wYm9iamMuaCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvVW5pdFRlc3RzLUluZm8ucGxpc3QgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL1VuaXRUZXN0cy1JbmZvLnBsaXN0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjBhN2Q5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvVW5pdFRlc3RzLUluZm8ucGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Ci08cGxpc3QgdmVyc2lvbj0iMS4wIj4KLTxkaWN0PgotCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgotCTxzdHJpbmc+RW5nbGlzaDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+Ci0JPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgotCTxzdHJpbmc+JChQUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSKTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KLQk8c3RyaW5nPjYuMDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVQYWNrYWdlVHlwZTwva2V5PgotCTxzdHJpbmc+Qk5ETDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVTaWduYXR1cmU8L2tleT4KLQk8c3RyaW5nPj8/Pz88L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlVmVyc2lvbjwva2V5PgotCTxzdHJpbmc+MS4wPC9zdHJpbmc+Ci08L2RpY3Q+Ci08L3BsaXN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9nb2xkZW5fbWVzc2FnZSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvZ29sZGVuX21lc3NhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiY2VhYjQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9nb2xkZW5fbWVzc2FnZQorKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2JjZWFiNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0FwcERlbGVnYXRlLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0FwcERlbGVnYXRlLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhjNGE1ODYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9BcHBEZWxlZ2F0ZS5tCisrKyAvZGV2L251bGwKQEAgLTEsMzUgKzAsMCBAQAotI2ltcG9ydCA8VUlLaXQvVUlLaXQuaD4KLQotQGludGVyZmFjZSBBcHBEZWxlZ2F0ZSA6IFVJUmVzcG9uZGVyIDxVSUFwcGxpY2F0aW9uRGVsZWdhdGU+Ci1AcHJvcGVydHkgKHN0cm9uZywgbm9uYXRvbWljKSBVSVdpbmRvdyAqd2luZG93OwotQGVuZAotCi1AaW1wbGVtZW50YXRpb24gQXBwRGVsZWdhdGUKLQotQHN5bnRoZXNpemUgd2luZG93OwotCi0tIChCT09MKWFwcGxpY2F0aW9uOihVSUFwcGxpY2F0aW9uICopYXBwbGljYXRpb24KLSAgICBkaWRGaW5pc2hMYXVuY2hpbmdXaXRoT3B0aW9uczooTlNEaWN0aW9uYXJ5ICopbGF1bmNoT3B0aW9ucyB7Ci0gICNwcmFnbWEgdW51c2VkIChhcHBsaWNhdGlvbiwgbGF1bmNoT3B0aW9ucykKLQotICBzZWxmLndpbmRvdyA9IFtbVUlXaW5kb3cgYWxsb2NdIGluaXRXaXRoRnJhbWU6W1tVSVNjcmVlbiBtYWluU2NyZWVuXSBib3VuZHNdXTsKLSAgc2VsZi53aW5kb3cuYmFja2dyb3VuZENvbG9yID0gW1VJQ29sb3Igd2hpdGVDb2xvcl07Ci0gIFtzZWxmLndpbmRvdyBtYWtlS2V5QW5kVmlzaWJsZV07Ci0gIHNlbGYud2luZG93LnJvb3RWaWV3Q29udHJvbGxlciA9IFtbVUlWaWV3Q29udHJvbGxlciBhbGxvY10gaW5pdF07Ci0KLSAgVUlMYWJlbCAqbGFiZWwgPQotICAgICAgW1tVSUxhYmVsIGFsbG9jXSBpbml0V2l0aEZyYW1lOkNHUmVjdE1ha2UoMCwgMjAwLCBDR1JlY3RHZXRXaWR0aChzZWxmLndpbmRvdy5mcmFtZSksIDQwKV07Ci0gIGxhYmVsLnRleHQgPSBAIlByb3RvY29sIEJ1ZmZlciBUZXN0IEhhcm5lc3MiOwotICBsYWJlbC50ZXh0QWxpZ25tZW50ID0gTlNUZXh0QWxpZ25tZW50Q2VudGVyOwotICBbc2VsZi53aW5kb3cgYWRkU3VidmlldzpsYWJlbF07Ci0KLSAgcmV0dXJuIFlFUzsKLX0KLQotQGVuZAotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciAqIGFyZ3ZbXSkgewotICBAYXV0b3JlbGVhc2Vwb29sIHsKLSAgICByZXR1cm4gVUlBcHBsaWNhdGlvbk1haW4oYXJnYywgYXJndiwgbmlsLCBOU1N0cmluZ0Zyb21DbGFzcyhbQXBwRGVsZWdhdGUgY2xhc3NdKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9Db250ZW50cy5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L0NvbnRlbnRzLmpzb24KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBjYmY5YWMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L0NvbnRlbnRzLmpzb24KKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotewotICAiaW1hZ2VzIiA6IFsKLSAgICB7Ci0gICAgICAiaWRpb20iIDogImlwaG9uZSIsCi0gICAgICAic2l6ZSIgOiAiMjl4MjkiLAotICAgICAgInNjYWxlIiA6ICIxeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBob25lIiwKLSAgICAgICJzaXplIiA6ICIyOXgyOSIsCi0gICAgICAic2NhbGUiIDogIjJ4IgotICAgIH0sCi0gICAgewotICAgICAgImlkaW9tIiA6ICJpcGhvbmUiLAotICAgICAgInNpemUiIDogIjI5eDI5IiwKLSAgICAgICJzY2FsZSIgOiAiM3giCi0gICAgfSwKLSAgICB7Ci0gICAgICAiaWRpb20iIDogImlwaG9uZSIsCi0gICAgICAic2l6ZSIgOiAiNDB4NDAiLAotICAgICAgInNjYWxlIiA6ICIyeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBob25lIiwKLSAgICAgICJzaXplIiA6ICI0MHg0MCIsCi0gICAgICAic2NhbGUiIDogIjN4IgotICAgIH0sCi0gICAgewotICAgICAgInNpemUiIDogIjU3eDU3IiwKLSAgICAgICJpZGlvbSIgOiAiaXBob25lIiwKLSAgICAgICJmaWxlbmFtZSIgOiAiaVBob25lNi5wbmciLAotICAgICAgInNjYWxlIiA6ICIxeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJzaXplIiA6ICI1N3g1NyIsCi0gICAgICAiaWRpb20iIDogImlwaG9uZSIsCi0gICAgICAiZmlsZW5hbWUiIDogImlQaG9uZTZfMngucG5nIiwKLSAgICAgICJzY2FsZSIgOiAiMngiCi0gICAgfSwKLSAgICB7Ci0gICAgICAic2l6ZSIgOiAiNjB4NjAiLAotICAgICAgImlkaW9tIiA6ICJpcGhvbmUiLAotICAgICAgImZpbGVuYW1lIiA6ICJpUGhvbmU3XzJ4LnBuZyIsCi0gICAgICAic2NhbGUiIDogIjJ4IgotICAgIH0sCi0gICAgewotICAgICAgInNpemUiIDogIjYweDYwIiwKLSAgICAgICJpZGlvbSIgOiAiaXBob25lIiwKLSAgICAgICJmaWxlbmFtZSIgOiAiaVBob25lN18zeC5wbmciLAotICAgICAgInNjYWxlIiA6ICIzeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAic2l6ZSIgOiAiMjl4MjkiLAotICAgICAgInNjYWxlIiA6ICIxeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAic2l6ZSIgOiAiMjl4MjkiLAotICAgICAgInNjYWxlIiA6ICIyeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAic2l6ZSIgOiAiNDB4NDAiLAotICAgICAgInNjYWxlIiA6ICIxeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAic2l6ZSIgOiAiNDB4NDAiLAotICAgICAgInNjYWxlIiA6ICIyeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAic2l6ZSIgOiAiNTB4NTAiLAotICAgICAgInNjYWxlIiA6ICIxeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAic2l6ZSIgOiAiNTB4NTAiLAotICAgICAgInNjYWxlIiA6ICIyeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJzaXplIiA6ICI3Mng3MiIsCi0gICAgICAiaWRpb20iIDogImlwYWQiLAotICAgICAgImZpbGVuYW1lIiA6ICJpUGFkNi5wbmciLAotICAgICAgInNjYWxlIiA6ICIxeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJzaXplIiA6ICI3Mng3MiIsCi0gICAgICAiaWRpb20iIDogImlwYWQiLAotICAgICAgImZpbGVuYW1lIiA6ICJpUGFkNl8yeC5wbmciLAotICAgICAgInNjYWxlIiA6ICIyeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJzaXplIiA6ICI3Nng3NiIsCi0gICAgICAiaWRpb20iIDogImlwYWQiLAotICAgICAgImZpbGVuYW1lIiA6ICJpUGFkNy5wbmciLAotICAgICAgInNjYWxlIiA6ICIxeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJzaXplIiA6ICI3Nng3NiIsCi0gICAgICAiaWRpb20iIDogImlwYWQiLAotICAgICAgImZpbGVuYW1lIiA6ICJpUGFkN18yeC5wbmciLAotICAgICAgInNjYWxlIiA6ICIyeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJpZGlvbSIgOiAiY2FyIiwKLSAgICAgICJzaXplIiA6ICIxMjB4MTIwIiwKLSAgICAgICJzY2FsZSIgOiAiMXgiCi0gICAgfQotICBdLAotICAiaW5mbyIgOiB7Ci0gICAgInZlcnNpb24iIDogMSwKLSAgICAiYXV0aG9yIiA6ICJ4Y29kZSIKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQYWQ2LnBuZyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGFkNi5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQzZGEyZWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQYWQ2LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGFkNl8yeC5wbmcgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9BcHBJY29uLmFwcGljb25zZXQvaVBhZDZfMngucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyZWM5MzcwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGFkNl8yeC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9BcHBJY29uLmFwcGljb25zZXQvaVBhZDcucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQYWQ3LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWVjOGJjMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9BcHBJY29uLmFwcGljb25zZXQvaVBhZDcucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQYWQ3XzJ4LnBuZyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGFkN18yeC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUzOWNjM2UuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQYWQ3XzJ4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGhvbmU2LnBuZyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGhvbmU2LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTU3MmQ3OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9BcHBJY29uLmFwcGljb25zZXQvaVBob25lNi5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9BcHBJY29uLmFwcGljb25zZXQvaVBob25lNl8yeC5wbmcgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9BcHBJY29uLmFwcGljb25zZXQvaVBob25lNl8yeC5wbmcKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0MjQ5OTcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQaG9uZTZfMngucG5nCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQaG9uZTdfMngucG5nIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvQXBwSWNvbi5hcHBpY29uc2V0L2lQaG9uZTdfMngucG5nCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMGJmYzNjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGhvbmU3XzJ4LnBuZworKysgL2Rldi9udWxsCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGhvbmU3XzN4LnBuZyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW1hZ2VzLnhjYXNzZXRzL0FwcEljb24uYXBwaWNvbnNldC9pUGhvbmU3XzN4LnBuZwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGQxNmYxNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9BcHBJY29uLmFwcGljb25zZXQvaVBob25lN18zeC5wbmcKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9MYXVuY2hJbWFnZS5sYXVuY2hpbWFnZS9Db250ZW50cy5qc29uIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9JbWFnZXMueGNhc3NldHMvTGF1bmNoSW1hZ2UubGF1bmNoaW1hZ2UvQ29udGVudHMuanNvbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWEyOTY2Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0ltYWdlcy54Y2Fzc2V0cy9MYXVuY2hJbWFnZS5sYXVuY2hpbWFnZS9Db250ZW50cy5qc29uCisrKyAvZGV2L251bGwKQEAgLTEsNDkgKzAsMCBAQAotewotICAiaW1hZ2VzIiA6IFsKLSAgICB7Ci0gICAgICAib3JpZW50YXRpb24iIDogInBvcnRyYWl0IiwKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAibWluaW11bS1zeXN0ZW0tdmVyc2lvbiIgOiAiNy4wIiwKLSAgICAgICJleHRlbnQiIDogImZ1bGwtc2NyZWVuIiwKLSAgICAgICJzY2FsZSIgOiAiMngiCi0gICAgfSwKLSAgICB7Ci0gICAgICAib3JpZW50YXRpb24iIDogImxhbmRzY2FwZSIsCi0gICAgICAiaWRpb20iIDogImlwYWQiLAotICAgICAgIm1pbmltdW0tc3lzdGVtLXZlcnNpb24iIDogIjcuMCIsCi0gICAgICAiZXh0ZW50IiA6ICJmdWxsLXNjcmVlbiIsCi0gICAgICAic2NhbGUiIDogIjF4IgotICAgIH0sCi0gICAgewotICAgICAgIm9yaWVudGF0aW9uIiA6ICJsYW5kc2NhcGUiLAotICAgICAgImlkaW9tIiA6ICJpcGFkIiwKLSAgICAgICJtaW5pbXVtLXN5c3RlbS12ZXJzaW9uIiA6ICI3LjAiLAotICAgICAgImV4dGVudCIgOiAiZnVsbC1zY3JlZW4iLAotICAgICAgInNjYWxlIiA6ICIyeCIKLSAgICB9LAotICAgIHsKLSAgICAgICJvcmllbnRhdGlvbiIgOiAicG9ydHJhaXQiLAotICAgICAgImlkaW9tIiA6ICJpcGhvbmUiLAotICAgICAgIm1pbmltdW0tc3lzdGVtLXZlcnNpb24iIDogIjcuMCIsCi0gICAgICAic2NhbGUiIDogIjJ4IgotICAgIH0sCi0gICAgewotICAgICAgIm9yaWVudGF0aW9uIiA6ICJwb3J0cmFpdCIsCi0gICAgICAiaWRpb20iIDogImlwaG9uZSIsCi0gICAgICAibWluaW11bS1zeXN0ZW0tdmVyc2lvbiIgOiAiNy4wIiwKLSAgICAgICJzdWJ0eXBlIiA6ICJyZXRpbmE0IiwKLSAgICAgICJzY2FsZSIgOiAiMngiCi0gICAgfSwKLSAgICB7Ci0gICAgICAib3JpZW50YXRpb24iIDogInBvcnRyYWl0IiwKLSAgICAgICJpZGlvbSIgOiAiaXBhZCIsCi0gICAgICAibWluaW11bS1zeXN0ZW0tdmVyc2lvbiIgOiAiNy4wIiwKLSAgICAgICJleHRlbnQiIDogImZ1bGwtc2NyZWVuIiwKLSAgICAgICJzY2FsZSIgOiAiMXgiCi0gICAgfQotICBdLAotICAiaW5mbyIgOiB7Ci0gICAgInZlcnNpb24iIDogMSwKLSAgICAiYXV0aG9yIiA6ICJ4Y29kZSIKLSAgfQotfQpcIE5vIG5ld2xpbmUgYXQgZW5kIG9mIGZpbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW5mby5wbGlzdCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvSW5mby5wbGlzdApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjRiZDMzMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL2lPU1Rlc3RIYXJuZXNzL0luZm8ucGxpc3QKKysrIC9kZXYvbnVsbApAQCAtMSw0MyArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPCFET0NUWVBFIHBsaXN0IFBVQkxJQyAiLS8vQXBwbGUvL0RURCBQTElTVCAxLjAvL0VOIiAiaHR0cDovL3d3dy5hcHBsZS5jb20vRFREcy9Qcm9wZXJ0eUxpc3QtMS4wLmR0ZCI+Ci08cGxpc3QgdmVyc2lvbj0iMS4wIj4KLTxkaWN0PgotCTxrZXk+Q0ZCdW5kbGVEZXZlbG9wbWVudFJlZ2lvbjwva2V5PgotCTxzdHJpbmc+ZW48L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlRGlzcGxheU5hbWU8L2tleT4KLQk8c3RyaW5nPiR7UFJPRFVDVF9OQU1FfTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVFeGVjdXRhYmxlPC9rZXk+Ci0JPHN0cmluZz4ke0VYRUNVVEFCTEVfTkFNRX08L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlSWRlbnRpZmllcjwva2V5PgotCTxzdHJpbmc+JChQUk9EVUNUX0JVTkRMRV9JREVOVElGSUVSKTwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVJbmZvRGljdGlvbmFyeVZlcnNpb248L2tleT4KLQk8c3RyaW5nPjYuMDwvc3RyaW5nPgotCTxrZXk+Q0ZCdW5kbGVOYW1lPC9rZXk+Ci0JPHN0cmluZz4ke1BST0RVQ1RfTkFNRX08L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlUGFja2FnZVR5cGU8L2tleT4KLQk8c3RyaW5nPkFQUEw8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2hvcnRWZXJzaW9uU3RyaW5nPC9rZXk+Ci0JPHN0cmluZz4xLjA8L3N0cmluZz4KLQk8a2V5PkNGQnVuZGxlU2lnbmF0dXJlPC9rZXk+Ci0JPHN0cmluZz4/Pz8/PC9zdHJpbmc+Ci0JPGtleT5DRkJ1bmRsZVZlcnNpb248L2tleT4KLQk8c3RyaW5nPjEuMDwvc3RyaW5nPgotCTxrZXk+TFNSZXF1aXJlc0lQaG9uZU9TPC9rZXk+Ci0JPHRydWUvPgotCTxrZXk+VUlMYXVuY2hTdG9yeWJvYXJkTmFtZTwva2V5PgotCTxzdHJpbmc+TGF1bmNoU2NyZWVuPC9zdHJpbmc+Ci0JPGtleT5VSVN1cHBvcnRlZEludGVyZmFjZU9yaWVudGF0aW9uczwva2V5PgotCTxhcnJheT4KLQkJPHN0cmluZz5VSUludGVyZmFjZU9yaWVudGF0aW9uUG9ydHJhaXQ8L3N0cmluZz4KLQkJPHN0cmluZz5VSUludGVyZmFjZU9yaWVudGF0aW9uTGFuZHNjYXBlTGVmdDwvc3RyaW5nPgotCQk8c3RyaW5nPlVJSW50ZXJmYWNlT3JpZW50YXRpb25MYW5kc2NhcGVSaWdodDwvc3RyaW5nPgotCTwvYXJyYXk+Ci0JPGtleT5VSVN1cHBvcnRlZEludGVyZmFjZU9yaWVudGF0aW9uc35pcGFkPC9rZXk+Ci0JPGFycmF5PgotCQk8c3RyaW5nPlVJSW50ZXJmYWNlT3JpZW50YXRpb25Qb3J0cmFpdDwvc3RyaW5nPgotCQk8c3RyaW5nPlVJSW50ZXJmYWNlT3JpZW50YXRpb25MYW5kc2NhcGVMZWZ0PC9zdHJpbmc+Ci0JCTxzdHJpbmc+VUlJbnRlcmZhY2VPcmllbnRhdGlvbkxhbmRzY2FwZVJpZ2h0PC9zdHJpbmc+Ci0JCTxzdHJpbmc+VUlJbnRlcmZhY2VPcmllbnRhdGlvblBvcnRyYWl0VXBzaWRlRG93bjwvc3RyaW5nPgotCTwvYXJyYXk+Ci08L2RpY3Q+Ci08L3BsaXN0PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9MYXVuY2hTY3JlZW4ueGliIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9MYXVuY2hTY3JlZW4ueGliCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMjIwNGJmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvTGF1bmNoU2NyZWVuLnhpYgorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLTw/eG1sIHZlcnNpb249IjEuMCIgZW5jb2Rpbmc9IlVURi04IiBzdGFuZGFsb25lPSJubyI/PgotPGRvY3VtZW50IHR5cGU9ImNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyMy5Db2NvYVRvdWNoLlhJQiIgdmVyc2lvbj0iMy4wIiB0b29sc1ZlcnNpb249IjYyNTQiIHN5c3RlbVZlcnNpb249IjEzRjM0IiB0YXJnZXRSdW50aW1lPSJpT1MuQ29jb2FUb3VjaCIgcHJvcGVydHlBY2Nlc3NDb250cm9sPSJub25lIiB1c2VBdXRvbGF5b3V0PSJZRVMiIGxhdW5jaFNjcmVlbj0iWUVTIiB1c2VUcmFpdENvbGxlY3Rpb25zPSJZRVMiPgotICAgIDxkZXBlbmRlbmNpZXM+Ci0gICAgICAgIDxkZXBsb3ltZW50IGlkZW50aWZpZXI9ImlPUyIvPgotICAgICAgICA8cGx1Z0luIGlkZW50aWZpZXI9ImNvbS5hcHBsZS5JbnRlcmZhY2VCdWlsZGVyLklCQ29jb2FUb3VjaFBsdWdpbiIgdmVyc2lvbj0iNjI0NyIvPgotICAgICAgICA8Y2FwYWJpbGl0eSBuYW1lPSJDb25zdHJhaW50cyB3aXRoIG5vbi0xLjAgbXVsdGlwbGllcnMiIG1pblRvb2xzVmVyc2lvbj0iNS4xIi8+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci0gICAgPG9iamVjdHM+Ci0gICAgICAgIDxwbGFjZWhvbGRlciBwbGFjZWhvbGRlcklkZW50aWZpZXI9IklCRmlsZXNPd25lciIgaWQ9Ii0xIiB1c2VyTGFiZWw9IkZpbGUncyBPd25lciIvPgotICAgICAgICA8cGxhY2Vob2xkZXIgcGxhY2Vob2xkZXJJZGVudGlmaWVyPSJJQkZpcnN0UmVzcG9uZGVyIiBpZD0iLTIiIGN1c3RvbUNsYXNzPSJVSVJlc3BvbmRlciIvPgotICAgICAgICA8dmlldyBjb250ZW50TW9kZT0ic2NhbGVUb0ZpbGwiIGlkPSJpTjAtbDMtZXBCIj4KLSAgICAgICAgICAgIDxyZWN0IGtleT0iZnJhbWUiIHg9IjAuMCIgeT0iMC4wIiB3aWR0aD0iNjMwIiBoZWlnaHQ9IjUwMyIvPgotICAgICAgICAgICAgPGF1dG9yZXNpemluZ01hc2sga2V5PSJhdXRvcmVzaXppbmdNYXNrIiB3aWR0aFNpemFibGU9IllFUyIgaGVpZ2h0U2l6YWJsZT0iWUVTIi8+Ci0gICAgICAgICAgICA8c3Vidmlld3M+Ci0gICAgICAgICAgICAgICAgPGxhYmVsIG9wYXF1ZT0iTk8iIGNsaXBzU3Vidmlld3M9IllFUyIgdXNlckludGVyYWN0aW9uRW5hYmxlZD0iTk8iIGNvbnRlbnRNb2RlPSJsZWZ0IiBob3Jpem9udGFsSHVnZ2luZ1ByaW9yaXR5PSIyNTEiIHZlcnRpY2FsSHVnZ2luZ1ByaW9yaXR5PSIyNTEiIHRleHQ9IlByb3RvY29sIEJ1ZmZlciBUZXN0IEhhcm5lc3MiIHRleHRBbGlnbm1lbnQ9ImNlbnRlciIgbGluZUJyZWFrTW9kZT0ibWlkZGxlVHJ1bmNhdGlvbiIgYmFzZWxpbmVBZGp1c3RtZW50PSJhbGlnbkJhc2VsaW5lcyIgbWluaW11bUZvbnRTaXplPSIxOCIgdHJhbnNsYXRlc0F1dG9yZXNpemluZ01hc2tJbnRvQ29uc3RyYWludHM9Ik5PIiBpZD0ia0lkLWMyLXJDWCI+Ci0gICAgICAgICAgICAgICAgICAgIDxyZWN0IGtleT0iZnJhbWUiIHg9IjIwIiB5PSIxNDciIHdpZHRoPSI1OTEiIGhlaWdodD0iNDMiLz4KLSAgICAgICAgICAgICAgICAgICAgPGZvbnREZXNjcmlwdGlvbiBrZXk9ImZvbnREZXNjcmlwdGlvbiIgdHlwZT0iYm9sZFN5c3RlbSIgcG9pbnRTaXplPSIzNiIvPgotICAgICAgICAgICAgICAgICAgICA8Y29sb3Iga2V5PSJ0ZXh0Q29sb3IiIGNvY29hVG91Y2hTeXN0ZW1Db2xvcj0iZGFya1RleHRDb2xvciIvPgotICAgICAgICAgICAgICAgICAgICA8bmlsIGtleT0iaGlnaGxpZ2h0ZWRDb2xvciIvPgotICAgICAgICAgICAgICAgIDwvbGFiZWw+Ci0gICAgICAgICAgICA8L3N1YnZpZXdzPgotICAgICAgICAgICAgPGNvbG9yIGtleT0iYmFja2dyb3VuZENvbG9yIiB3aGl0ZT0iMSIgYWxwaGE9IjEiIGNvbG9yU3BhY2U9ImN1c3RvbSIgY3VzdG9tQ29sb3JTcGFjZT0iY2FsaWJyYXRlZFdoaXRlIi8+Ci0gICAgICAgICAgICA8Y29uc3RyYWludHM+Ci0gICAgICAgICAgICAgICAgPGNvbnN0cmFpbnQgZmlyc3RJdGVtPSJrSWQtYzItckNYIiBmaXJzdEF0dHJpYnV0ZT0iY2VudGVyWSIgc2Vjb25kSXRlbT0iaU4wLWwzLWVwQiIgc2Vjb25kQXR0cmlidXRlPSJib3R0b20iIG11bHRpcGxpZXI9IjEvMyIgY29uc3RhbnQ9IjEiIGlkPSJLaWQta24tMnJGIi8+Ci0gICAgICAgICAgICAgICAgPGNvbnN0cmFpbnQgZmlyc3RBdHRyaWJ1dGU9ImNlbnRlclgiIHNlY29uZEl0ZW09ImtJZC1jMi1yQ1giIHNlY29uZEF0dHJpYnV0ZT0iY2VudGVyWCIgaWQ9IktvYS1qei1od2siLz4KLSAgICAgICAgICAgICAgICA8Y29uc3RyYWludCBmaXJzdEl0ZW09ImtJZC1jMi1yQ1giIGZpcnN0QXR0cmlidXRlPSJsZWFkaW5nIiBzZWNvbmRJdGVtPSJpTjAtbDMtZXBCIiBzZWNvbmRBdHRyaWJ1dGU9ImxlYWRpbmciIGNvbnN0YW50PSIyMCIgc3ltYm9saWM9IllFUyIgaWQ9ImZ2Yi1EZi0zNmciLz4KLSAgICAgICAgICAgIDwvY29uc3RyYWludHM+Ci0gICAgICAgICAgICA8bmlsIGtleT0ic2ltdWxhdGVkU3RhdHVzQmFyTWV0cmljcyIvPgotICAgICAgICAgICAgPGZyZWVmb3JtU2ltdWxhdGVkU2l6ZU1ldHJpY3Mga2V5PSJzaW11bGF0ZWREZXN0aW5hdGlvbk1ldHJpY3MiLz4KLSAgICAgICAgICAgIDxwb2ludCBrZXk9ImNhbnZhc0xvY2F0aW9uIiB4PSI0NzkiIHk9IjQ1Ni41Ii8+Ci0gICAgICAgIDwvdmlldz4KLSAgICA8L29iamVjdHM+Ci08L2RvY3VtZW50PgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9lbi5scHJvai9JbmZvUGxpc3Quc3RyaW5ncyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvaU9TVGVzdEhhcm5lc3MvZW4ubHByb2ovSW5mb1BsaXN0LnN0cmluZ3MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3N2IyOGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy9pT1NUZXN0SGFybmVzcy9lbi5scHJvai9JbmZvUGxpc3Quc3RyaW5ncworKysgL2Rldi9udWxsCkBAIC0xLDIgKzAsMCBAQAotLyogTG9jYWxpemVkIHZlcnNpb25zIG9mIEluZm8ucGxpc3Qga2V5cyAqLwotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3RleHRfZm9ybWF0X21hcF91bml0dGVzdF9kYXRhLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdGV4dF9mb3JtYXRfbWFwX3VuaXR0ZXN0X2RhdGEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDExOTVlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdGV4dF9mb3JtYXRfbWFwX3VuaXR0ZXN0X2RhdGEudHh0CisrKyAvZGV2L251bGwKQEAgLTEsNzAgKzAsMCBAQAotbWFwX2ludDMyX2ludDMyIHsKLSAga2V5OiAxMDAKLSAgdmFsdWU6IDEKLX0KLW1hcF9pbnQ2NF9pbnQ2NCB7Ci0gIGtleTogMTAxCi0gIHZhbHVlOiAxCi19Ci1tYXBfdWludDMyX3VpbnQzMiB7Ci0gIGtleTogMTAyCi0gIHZhbHVlOiAxCi19Ci1tYXBfdWludDY0X3VpbnQ2NCB7Ci0gIGtleTogMTAzCi0gIHZhbHVlOiAxCi19Ci1tYXBfc2ludDMyX3NpbnQzMiB7Ci0gIGtleTogMTA0Ci0gIHZhbHVlOiAxCi19Ci1tYXBfc2ludDY0X3NpbnQ2NCB7Ci0gIGtleTogMTA1Ci0gIHZhbHVlOiAxCi19Ci1tYXBfZml4ZWQzMl9maXhlZDMyIHsKLSAga2V5OiAxMDYKLSAgdmFsdWU6IDEKLX0KLW1hcF9maXhlZDY0X2ZpeGVkNjQgewotICBrZXk6IDEwNwotICB2YWx1ZTogMQotfQotbWFwX3NmaXhlZDMyX3NmaXhlZDMyIHsKLSAga2V5OiAxMDgKLSAgdmFsdWU6IDEKLX0KLW1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCB7Ci0gIGtleTogMTA5Ci0gIHZhbHVlOiAxCi19Ci1tYXBfaW50MzJfZmxvYXQgewotICBrZXk6IDExMAotICB2YWx1ZTogMQotfQotbWFwX2ludDMyX2RvdWJsZSB7Ci0gIGtleTogMTExCi0gIHZhbHVlOiAxCi19Ci1tYXBfYm9vbF9ib29sIHsKLSAga2V5OiB0cnVlCi0gIHZhbHVlOiBmYWxzZQotfQotbWFwX3N0cmluZ19zdHJpbmcgewotICBrZXk6ICIxMTIiCi0gIHZhbHVlOiAiMSIKLX0KLW1hcF9pbnQzMl9ieXRlcyB7Ci0gIGtleTogMTEzCi0gIHZhbHVlOiAiXDAwMVwwMDBcMDAwXDAwMCIKLX0KLW1hcF9pbnQzMl9lbnVtIHsKLSAga2V5OiAxMTQKLSAgdmFsdWU6IE1BUF9FTlVNX0JBWgotfQotbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSB7Ci0gIGtleTogMTE1Ci0gIHZhbHVlIHsKLSAgICBjOiAxCi0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkMTBmMTAwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTYgKzAsMCBAQAotb3B0aW9uYWxfaW50MzI6IDEwMQotb3B0aW9uYWxfaW50NjQ6IDEwMgotb3B0aW9uYWxfdWludDMyOiAxMDMKLW9wdGlvbmFsX3VpbnQ2NDogMTA0Ci1vcHRpb25hbF9zaW50MzI6IDEwNQotb3B0aW9uYWxfc2ludDY0OiAxMDYKLW9wdGlvbmFsX2ZpeGVkMzI6IDEwNwotb3B0aW9uYWxfZml4ZWQ2NDogMTA4Ci1vcHRpb25hbF9zZml4ZWQzMjogMTA5Ci1vcHRpb25hbF9zZml4ZWQ2NDogMTEwCi1vcHRpb25hbF9mbG9hdDogMTExCi1vcHRpb25hbF9kb3VibGU6IDExMgotb3B0aW9uYWxfYm9vbDogdHJ1ZQotb3B0aW9uYWxfc3RyaW5nOiAiMTE1Igotb3B0aW9uYWxfYnl0ZXM6ICJcMDAxXDAwMFwwMDJcMDAzXDAwMFwwMDUiCi1PcHRpb25hbEdyb3VwIHsKLSAgYTogMTE3Ci19Ci1vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7Ci0gIGJiOiAxMTgKLX0KLW9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSB7Ci0gIGM6IDExOQotfQotb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgewotICBkOiAxMjAKLX0KLW9wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVoKLW9wdGlvbmFsX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVoKLW9wdGlvbmFsX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFaCi1vcHRpb25hbF9zdHJpbmdfcGllY2U6ICIxMjQiCi1vcHRpb25hbF9jb3JkOiAiMTI1IgotcmVwZWF0ZWRfaW50MzI6IDIwMQotcmVwZWF0ZWRfaW50MzI6IDMwMQotcmVwZWF0ZWRfaW50NjQ6IDIwMgotcmVwZWF0ZWRfaW50NjQ6IDMwMgotcmVwZWF0ZWRfdWludDMyOiAyMDMKLXJlcGVhdGVkX3VpbnQzMjogMzAzCi1yZXBlYXRlZF91aW50NjQ6IDIwNAotcmVwZWF0ZWRfdWludDY0OiAzMDQKLXJlcGVhdGVkX3NpbnQzMjogMjA1Ci1yZXBlYXRlZF9zaW50MzI6IDMwNQotcmVwZWF0ZWRfc2ludDY0OiAyMDYKLXJlcGVhdGVkX3NpbnQ2NDogMzA2Ci1yZXBlYXRlZF9maXhlZDMyOiAyMDcKLXJlcGVhdGVkX2ZpeGVkMzI6IDMwNwotcmVwZWF0ZWRfZml4ZWQ2NDogMjA4Ci1yZXBlYXRlZF9maXhlZDY0OiAzMDgKLXJlcGVhdGVkX3NmaXhlZDMyOiAyMDkKLXJlcGVhdGVkX3NmaXhlZDMyOiAzMDkKLXJlcGVhdGVkX3NmaXhlZDY0OiAyMTAKLXJlcGVhdGVkX3NmaXhlZDY0OiAzMTAKLXJlcGVhdGVkX2Zsb2F0OiAyMTEKLXJlcGVhdGVkX2Zsb2F0OiAzMTEKLXJlcGVhdGVkX2RvdWJsZTogMjEyCi1yZXBlYXRlZF9kb3VibGU6IDMxMgotcmVwZWF0ZWRfYm9vbDogZmFsc2UKLXJlcGVhdGVkX2Jvb2w6IHRydWUKLXJlcGVhdGVkX3N0cmluZzogIjIxNSIKLXJlcGVhdGVkX3N0cmluZzogIjMxNSIKLXJlcGVhdGVkX2J5dGVzOiAiXDMzMFwwMDBcMDAwXDAwMCIKLXJlcGVhdGVkX2J5dGVzOiAiPFwwMDFcMDAwXDAwMCIKLVJlcGVhdGVkR3JvdXAgewotICBhOiAyMTcKLX0KLVJlcGVhdGVkR3JvdXAgewotICBhOiAzMTcKLX0KLXJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsKLSAgYmI6IDIxOAotfQotcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgewotICBiYjogMzE4Ci19Ci1yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UgewotICBjOiAyMTkKLX0KLXJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSB7Ci0gIGM6IDMxOQotfQotcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgewotICBkOiAyMjAKLX0KLXJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsKLSAgZDogMzIwCi19Ci1yZXBlYXRlZF9uZXN0ZWRfZW51bTogQkFaCi1yZXBlYXRlZF9uZXN0ZWRfZW51bTogQkFSCi1yZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFaCi1yZXBlYXRlZF9mb3JlaWduX2VudW06IEZPUkVJR05fQkFSCi1yZXBlYXRlZF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWgotcmVwZWF0ZWRfaW1wb3J0X2VudW06IElNUE9SVF9CQVIKLXJlcGVhdGVkX3N0cmluZ19waWVjZTogIjIyNCIKLXJlcGVhdGVkX3N0cmluZ19waWVjZTogIjMyNCIKLXJlcGVhdGVkX2NvcmQ6ICIyMjUiCi1yZXBlYXRlZF9jb3JkOiAiMzI1IgotZGVmYXVsdF9pbnQzMjogNDAxCi1kZWZhdWx0X2ludDY0OiA0MDIKLWRlZmF1bHRfdWludDMyOiA0MDMKLWRlZmF1bHRfdWludDY0OiA0MDQKLWRlZmF1bHRfc2ludDMyOiA0MDUKLWRlZmF1bHRfc2ludDY0OiA0MDYKLWRlZmF1bHRfZml4ZWQzMjogNDA3Ci1kZWZhdWx0X2ZpeGVkNjQ6IDQwOAotZGVmYXVsdF9zZml4ZWQzMjogNDA5Ci1kZWZhdWx0X3NmaXhlZDY0OiA0MTAKLWRlZmF1bHRfZmxvYXQ6IDQxMQotZGVmYXVsdF9kb3VibGU6IDQxMgotZGVmYXVsdF9ib29sOiBmYWxzZQotZGVmYXVsdF9zdHJpbmc6ICI0MTUiCi1kZWZhdWx0X2J5dGVzOiAiXDI0MFwwMDFcMDAwXDAwMCIKLWRlZmF1bHRfbmVzdGVkX2VudW06IEZPTwotZGVmYXVsdF9mb3JlaWduX2VudW06IEZPUkVJR05fRk9PCi1kZWZhdWx0X2ltcG9ydF9lbnVtOiBJTVBPUlRfRk9PCi1kZWZhdWx0X3N0cmluZ19waWVjZTogIjQyNCIKLWRlZmF1bHRfY29yZDogIjQyNSIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3RfY3ljbGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X2N5Y2xlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZjZmNTZhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3RfY3ljbGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE1IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotLy8gQ3ljbGVzIGluIHRoZSBNZXNzYWdlIGdyYXBoIGNhbiBjYXVzZSBwcm9ibGVtcyBmb3IgdGhlIG11dGFibGUgY2xhc3NlcwotLy8gc2luY2UgdGhlIHByb3BlcnRpZXMgb24gdGhlIG11dGFibGUgY2xhc3MgY2hhbmdlIHR5cGVzLiBUaGlzIGZpbGUganVzdAotLy8gbmVlZHMgdG8gZ2VuZXJhdGUgc291cmNlLCBhbmQgdGhhdCBzb3VyY2UgbXVzdCBjb21waWxlLCB0byBlbnN1cmUgdGhlCi0vLyBnZW5lcmF0ZWQgc291cmNlIHdvcmtzIGZvciB0aGlzIHNvcnQgb2YgY2FzZS4KLQotLy8gWW91IGNhbid0IG1ha2UgYSBvYmplY3QgZ3JhcGggdGhhdCBzcGFucyBmaWxlcywgc28gdGhpcyBjYW4gb25seSBiZSBkb25lCi0vLyB3aXRoaW4gYSBzaW5nbGUgcHJvdG8gZmlsZS4KLQotbWVzc2FnZSBDeWNsZUZvbyB7Ci0gIG9wdGlvbmFsIEN5Y2xlRm9vIGFfZm9vID0gMTsKLSAgb3B0aW9uYWwgQ3ljbGVCYXIgYV9iYXIgPSAyOwotICBvcHRpb25hbCBDeWNsZUJheiBhX2JheiA9IDM7Ci19Ci0KLW1lc3NhZ2UgQ3ljbGVCYXIgewotICBvcHRpb25hbCBDeWNsZUJhciBhX2JhciA9IDE7Ci0gIG9wdGlvbmFsIEN5Y2xlQmF6IGFfYmF6ID0gMjsKLSAgb3B0aW9uYWwgQ3ljbGVGb28gYV9mb28gPSAzOwotfQotCi1tZXNzYWdlIEN5Y2xlQmF6IHsKLSAgb3B0aW9uYWwgQ3ljbGVCYXogYV9iYXogPSAxOwotICBvcHRpb25hbCBDeWNsZUZvbyBhX2ZvbyA9IDI7Ci0gIG9wdGlvbmFsIEN5Y2xlQmFyIGFfYmFyID0gMzsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3Rfb2JqYy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3Rfb2JqYy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjZhYjZhMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X29iamMucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0NDkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotLy8gVXNpbmcgdGhlIG1lc3NhZ2VzIGluIHVuaXR0ZXN0LnByb3RvLCBzZXR1cCBmb3IgcmVjdXJzaXZlIGNhc2VzIGZvciB0ZXN0aW5nCi0vLyBleHRlbnNpb25zIGF0IHZhcmlvdXMgZGVwdGhzLgotZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKLSAgb3B0aW9uYWwgVGVzdEFsbEV4dGVuc2lvbnMgcmVjdXJzaXZlX2V4dGVuc2lvbiA9IDg2OwotfQotCi0vLyBSZWN1cnNpdmUgbWVzc2FnZSB0byBmb3IgdGVzdGluZyBhdXRvY3JlYXRvcnMgYXQgZGlmZmVyZW50IGRlcHRocy4KLW1lc3NhZ2UgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2VXaXRoUmVwZWF0ZWRGaWVsZCB7Ci0gIG9wdGlvbmFsIFRlc3RSZWN1cnNpdmVNZXNzYWdlV2l0aFJlcGVhdGVkRmllbGQgYSA9IDE7Ci0gIHJlcGVhdGVkIGludDMyIGkgPSAyOwotICByZXBlYXRlZCBzdHJpbmcgc3RyID0gMzsKLSAgbWFwPGludDMyLCBpbnQzMj4gaV90b19pID0gNDsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiBzdHJfdG9fc3RyID0gNTsKLX0KLQotLy8gUmVjdXJzaXZlIG1lc3NhZ2UgYW5kIGV4dGVuc2lvbiB0byBmb3IgdGVzdGluZyBhdXRvY3JlYXRvcnMgYXQgZGlmZmVyZW50Ci0vLyBkZXB0aHMuCi1tZXNzYWdlIFRlc3RSZWN1cnNpdmVFeHRlbnNpb24gewotICBvcHRpb25hbCBUZXN0UmVjdXJzaXZlRXh0ZW5zaW9uIHJlY3Vyc2l2ZV9zdWJfbWVzc2FnZSA9IDE7Ci0gIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX3ZhbHVlID0gMjsKLSAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKLX0KLQotZXh0ZW5kIFRlc3RSZWN1cnNpdmVFeHRlbnNpb24gewotICBvcHRpb25hbCBUZXN0UmVjdXJzaXZlRXh0ZW5zaW9uIHJlY3Vyc2l2ZV9tZXNzYWdlX2V4dGVuc2lvbiA9IDEwMDA7Ci19Ci0KLW1lc3NhZ2Ugc2VsZiB7Ci0gIG1lc3NhZ2Ugc3VwZXIgewotICAgIG9wdGlvbmFsIGludDMyIGRlc2NyaXB0aW9uID0gMTsKLSAgfQotCi0gIGVudW0gYXV0b3JlbGVhc2UgewotICAgIHJldGFpbiAgICAgID0gMTsKLSAgICByZWxlYXNlICAgICA9IDI7Ci0gICAgcmV0YWluQ291bnQgPSAzOwotICB9Ci0KLSAgLy8gU2luZ3VsYXIKLSAgb3B0aW9uYWwgICBib29sIGlkICAgICAgICAgICAgICAgID0gIDE7Ci0gIG9wdGlvbmFsICAgYm9vbCBfY21kICAgICAgICAgICAgICA9ICAyOwotICBvcHRpb25hbCAgIGJvb2wgaW4gICAgICAgICAgICAgICAgPSAgMzsKLSAgb3B0aW9uYWwgICBib29sIG91dCAgICAgICAgICAgICAgID0gIDQ7Ci0gIG9wdGlvbmFsICAgYm9vbCBpbm91dCAgICAgICAgICAgICA9ICA1OwotICBvcHRpb25hbCAgIGJvb2wgYnljb3B5ICAgICAgICAgICAgPSAgNjsKLSAgb3B0aW9uYWwgICBib29sIGJ5cmVmICAgICAgICAgICAgID0gIDc7Ci0gIG9wdGlvbmFsICAgYm9vbCBvbmV3YXkgICAgICAgICAgICA9ICA4OwotICBvcHRpb25hbCAgIGJvb2wgZGVhbGxvYyAgICAgICAgICAgPSAgOTsKLSAgb3B0aW9uYWwgICBib29sIHpvbmUgICAgICAgICAgICAgID0gMTA7Ci0gIG9wdGlvbmFsICAgYm9vbCBpc1Byb3h5ICAgICAgICAgICA9IDExOwotICBvcHRpb25hbCAgIGJvb2wgY29weSAgICAgICAgICAgICAgPSAxMjsKLSAgb3B0aW9uYWwgICBib29sIHJlYWRvbmx5ICAgICAgICAgID0gMTM7Ci0gIG9wdGlvbmFsICAgYm9vbCBkZWZhdWx0ICAgICAgICAgICA9IDE0OwotICBvcHRpb25hbCAgIGJvb2wgYXNzaWduICAgICAgICAgICAgPSAxNTsKLSAgb3B0aW9uYWwgICBib29sIGdldHRlciAgICAgICAgICAgID0gMTY7Ci0gIG9wdGlvbmFsICAgYm9vbCBzZXR0ZXIgICAgICAgICAgICA9IDE3OwotICBvcHRpb25hbCAgIGJvb2wgd2VhayAgICAgICAgICAgICAgPSAxODsKLSAgb3B0aW9uYWwgICBib29sIHB1YmxpYyAgICAgICAgICAgID0gMTk7Ci0gIG9wdGlvbmFsICAgYm9vbCBjYXNlICAgICAgICAgICAgICA9IDIwOwotCi0gIG9wdGlvbmFsICAgYXV0b3JlbGVhc2UgU3ViRW51bSAgICA9IDI1OwotCi0gb3B0aW9uYWwgZ3JvdXAgTmV3ID0gNTAgewotICAgb3B0aW9uYWwgc3RyaW5nIGNvcHkgPSA1MTsKLSB9Ci0gIG9wdGlvbmFsIGdyb3VwIE11dGFibGVDb3B5ID0gNjAgewotICAgIG9wdGlvbmFsIGludDMyIGV4dGVuc2lvblJlZ2lzdHJ5ID0gNjE7Ci0gIH0KLQotICBleHRlbnNpb25zIDkwIHRvIDk0OwotCi19Ci0KLWVudW0gcmV0YWluIHsKLSAgY291bnQgICAgICAgICAgPSA0OwotICBpbml0aWFsaXplZCAgICA9IDU7Ci0gIHNlcmlhbGl6ZWRTaXplID0gNjsKLX0KLQotbWVzc2FnZSBPYmpDUHJvcGVydHlOYW1pbmcgewotICAvLyBUZXN0IHRoYXQgdGhlIHByb3BlcnRpZXMgcHJvcGVybHkgZ2V0IHRoaW5ncyBhbGwgY2Fwcy4KLSAgb3B0aW9uYWwgc3RyaW5nIHVybCAgICAgICAgICAgPSAxOwotICBvcHRpb25hbCBzdHJpbmcgdGh1bWJuYWlsX3VybCA9IDI7Ci0gIG9wdGlvbmFsIHN0cmluZyB1cmxfZm9vICAgICAgID0gMzsKLSAgb3B0aW9uYWwgc3RyaW5nIHNvbWVfdXJsX2JsYWggPSA0OwotICBvcHRpb25hbCBzdHJpbmcgaHR0cCAgICAgICAgICA9IDU7Ci0gIG9wdGlvbmFsIHN0cmluZyBodHRwcyAgICAgICAgID0gNjsKLSAgLy8gVGhpcyBvbmUgZG9lc24ndC4KLSAgcmVwZWF0ZWQgc3RyaW5nIHVybHMgICAgICAgICAgPSA3OwotfQotCi0vLyBFbnVtVmFsdWVTaG9ydE5hbWU6IFRoZSBzaG9ydCBuYW1lcyBzaG91bGRuJ3QgZ2V0IHN1ZmZpeGVzL3ByZWZpeGVzLgotZW51bSBGb28gewotICBTRVJJQUxJWkVEX1NJWkUgPSAxOwotICBTSVpFICAgICAgICAgICAgPSAyOwotICBPVEhFUiAgICAgICAgICAgPSAzOwotfQotCi0vLyBFbnVtVmFsdWVTaG9ydE5hbWU6IFRoZSBlbnVtIG5hbWUgZ2V0cyBhIHByZWZpeC4KLWVudW0gQ2F0ZWdvcnkgewotICBSRUQgID0gMTsKLSAgQkxVRSA9IDI7Ci19Ci0KLS8vIEVudW1WYWx1ZVNob3J0TmFtZTogVHdpc3QgY2FzZSwgZnVsbCBuYW1lIGdldHMgUEIsIGJ1dCB0aGUgc2hvcnQgbmFtZXMKLS8vIHNob3VsZCBzdGlsbCBlbmQgdXAgY29ycmVjdC4KLWVudW0gVGltZSB7Ci0gIEJBU0UgICAgICAgICAgICA9IDE7Ci0gIFJFQ09SRCAgICAgICAgICA9IDI7Ci0gIFNPTUVUSElOR19FTFNFICA9IDM7Ci19Ci0KLWV4dGVuZCBzZWxmIHsKLSAgcmVwZWF0ZWQgICAgaW50MzIgZGVidWdEZXNjcmlwdGlvbiAgICA9ICA5MCBbcGFja2VkID0gdHJ1ZV07Ci0gIHJlcGVhdGVkICAgIGludDY0IGZpbmFsaXplICAgICAgICAgICAgPSAgOTEgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIHVpbnQzMiBoYXNoICAgICAgICAgICAgICAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICB1aW50NjQgY2xhc3NGb3JDb2RlciAgICAgICA9ICA5MyBbcGFja2VkID0gdHJ1ZV07Ci0gIHJlcGVhdGVkICAgc2ludDMyIGJ5cmVmICAgICAgICAgICAgICAgPSAgOTQgW3BhY2tlZCA9IHRydWVdOwotfQotCi0vLyBUZXN0IGhhbmRpbmcgb2YgZmllbGRzIHRoYXQgc3RhcnQgd2l0aCBpbml0KiBzaW5jZSBYY29kZSA1J3MgQVJDIHN1cHBvcnQKLS8vIGRvZXNuJ3QgbGlrZSBtZXNzYWdlcyB0aGF0IGxvb2sgbGlrZSBpbml0aWFsaXplcnMgYnV0IGFyZW4ndC4KLW1lc3NhZ2UgT2JqQ0luaXRGb28gewotICBvcHRpb25hbCBzdHJpbmcgaW5pdF92YWwgPSAxMTsKLSAgb3B0aW9uYWwgaW50MzIgaW5pdF9zaXplID0gMTI7Ci0gIG9wdGlvbmFsIHNlbGYgaW5pdF9zZWxmID0gMTM7Ci0KLSAgcmVwZWF0ZWQgc3RyaW5nIGluaXRfdmFscyA9IDIxOwotICByZXBlYXRlZCBpbnQzMiBpbml0X3NpemVzID0gMjI7Ci0gIHJlcGVhdGVkIHNlbGYgaW5pdF9zZWxmcyA9IDIzOwotfQotCi0vLyBUZXN0IGhhbmRsaW5nIG9mIGZpZWxkcyB0aGF0IHN0YXJ0IHdpdGggcmV0YWluZWQgbmFtZXMuCi1tZXNzYWdlIE9iakNSZXRhaW5lZEZvbyB7Ci0gIG9wdGlvbmFsIHN0cmluZyBuZXdfdmFsX2xvd2VyX2NvbXBsZXggPSAxMTsKLSAgb3B0aW9uYWwgc3RyaW5nIG5ld19WYWxfdXBwZXJfY29tcGxleCA9IDEyOwotICBvcHRpb25hbCBzdHJpbmcgbmV3dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9jb21wbGV4ID0gMTM7Ci0gIG9wdGlvbmFsIHN0cmluZyBuZXdWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX2NvbXBsZXggPSAxNDsKLQotICBvcHRpb25hbCBpbnQzMiBuZXdfdmFsX2xvd2VyX3ByaW1pdGl2ZSA9IDE1OwotICBvcHRpb25hbCBpbnQzMiBuZXdfVmFsX3VwcGVyX3ByaW1pdGl2ZSA9IDE2OwotICBvcHRpb25hbCBpbnQzMiBuZXd2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZSA9IDE3OwotICBvcHRpb25hbCBpbnQzMiBuZXdWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZSA9IDE4OwotCi0gIG9wdGlvbmFsIHNlbGYgbmV3X3ZhbF9sb3dlcl9tZXNzYWdlID0gMTk7Ci0gIG9wdGlvbmFsIHNlbGYgbmV3X1ZhbF91cHBlcl9tZXNzYWdlID0gMjA7Ci0gIG9wdGlvbmFsIHNlbGYgbmV3dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlID0gMjE7Ci0gIG9wdGlvbmFsIHNlbGYgbmV3VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlID0gMjI7Ci0KLSAgb3B0aW9uYWwgRm9vIG5ld192YWxfbG93ZXJfZW51bSA9IDIzOwotICBvcHRpb25hbCBGb28gbmV3X1ZhbF91cHBlcl9lbnVtID0gMjQ7Ci0gIG9wdGlvbmFsIEZvbyBuZXd2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX2VudW0gPSAyNTsKLSAgb3B0aW9uYWwgRm9vIG5ld1ZhbHVlX3VwcGVyX25vX3VuZGVyc2NvcmVfZW51bSA9IDI2OwotCi0gIHJlcGVhdGVkIHN0cmluZyBuZXdfdmFsX2xvd2VyX2NvbXBsZXhfcmVwZWF0ZWQgPSAxMTE7Ci0gIHJlcGVhdGVkIHN0cmluZyBuZXdfVmFsX3VwcGVyX2NvbXBsZXhfcmVwZWF0ZWQgPSAxMTI7Ci0gIHJlcGVhdGVkIHN0cmluZyBuZXd2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX2NvbXBsZXhfcmVwZWF0ZWQgPSAxMTM7Ci0gIHJlcGVhdGVkIHN0cmluZyBuZXdWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX2NvbXBsZXhfcmVwZWF0ZWQgPSAxMTQ7Ci0KLSAgcmVwZWF0ZWQgaW50MzIgbmV3X3ZhbF9sb3dlcl9wcmltaXRpdmVfcmVwZWF0ZWQgPSAxMTU7Ci0gIHJlcGVhdGVkIGludDMyIG5ld19WYWxfdXBwZXJfcHJpbWl0aXZlX3JlcGVhdGVkID0gMTE2OwotICByZXBlYXRlZCBpbnQzMiBuZXd2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZV9yZXBlYXRlZCA9IDExNzsKLSAgcmVwZWF0ZWQgaW50MzIgbmV3VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9wcmltaXRpdmVfcmVwZWF0ZWQgPSAxMTg7Ci0KLSAgcmVwZWF0ZWQgc2VsZiBuZXdfdmFsX2xvd2VyX21lc3NhZ2VfcmVwZWF0ZWQgPSAxMTk7Ci0gIHJlcGVhdGVkIHNlbGYgbmV3X1ZhbF91cHBlcl9tZXNzYWdlX3JlcGVhdGVkID0gMTIwOwotICByZXBlYXRlZCBzZWxmIG5ld3ZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfbWVzc2FnZV9yZXBlYXRlZCA9IDEyMTsKLSAgcmVwZWF0ZWQgc2VsZiBuZXdWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX21lc3NhZ2VfcmVwZWF0ZWQgPSAxMjI7Ci0KLSAgcmVwZWF0ZWQgRm9vIG5ld192YWxfbG93ZXJfZW51bV9yZXBlYXRlZCA9IDEyMzsKLSAgcmVwZWF0ZWQgRm9vIG5ld19WYWxfdXBwZXJfZW51bV9yZXBlYXRlZCA9IDEyNDsKLSAgcmVwZWF0ZWQgRm9vIG5ld3ZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfZW51bV9yZXBlYXRlZCA9IDEyNTsKLSAgcmVwZWF0ZWQgRm9vIG5ld1ZhbHVlX3VwcGVyX25vX3VuZGVyc2NvcmVfZW51bV9yZXBlYXRlZCA9IDEyNjsKLQotICBvcHRpb25hbCBzdHJpbmcgYWxsb2NfdmFsX2xvd2VyX2NvbXBsZXggPSAyMTE7Ci0gIG9wdGlvbmFsIHN0cmluZyBhbGxvY19WYWxfdXBwZXJfY29tcGxleCA9IDIxMjsKLSAgb3B0aW9uYWwgc3RyaW5nIGFsbG9jdmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9jb21wbGV4ID0gMjEzOwotICBvcHRpb25hbCBzdHJpbmcgYWxsb2NWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX2NvbXBsZXggPSAyMTQ7Ci0KLSAgb3B0aW9uYWwgaW50MzIgYWxsb2NfdmFsX2xvd2VyX3ByaW1pdGl2ZSA9IDIxNTsKLSAgb3B0aW9uYWwgaW50MzIgYWxsb2NfVmFsX3VwcGVyX3ByaW1pdGl2ZSA9IDIxNjsKLSAgb3B0aW9uYWwgaW50MzIgYWxsb2N2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZSA9IDIxNzsKLSAgb3B0aW9uYWwgaW50MzIgYWxsb2NWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZSA9IDIxODsKLQotICBvcHRpb25hbCBzZWxmIGFsbG9jX3ZhbF9sb3dlcl9tZXNzYWdlID0gMjE5OwotICBvcHRpb25hbCBzZWxmIGFsbG9jX1ZhbF91cHBlcl9tZXNzYWdlID0gMjIwOwotICBvcHRpb25hbCBzZWxmIGFsbG9jdmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlID0gMjIxOwotICBvcHRpb25hbCBzZWxmIGFsbG9jVmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlID0gMjIyOwotCi0gIG9wdGlvbmFsIEZvbyBhbGxvY192YWxfbG93ZXJfZW51bSA9IDIyMzsKLSAgb3B0aW9uYWwgRm9vIGFsbG9jX1ZhbF91cHBlcl9lbnVtID0gMjI0OwotICBvcHRpb25hbCBGb28gYWxsb2N2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX2VudW0gPSAyMjU7Ci0gIG9wdGlvbmFsIEZvbyBhbGxvY1ZhbHVlX3VwcGVyX25vX3VuZGVyc2NvcmVfZW51bSA9IDIyNjsKLQotICByZXBlYXRlZCBzdHJpbmcgYWxsb2NfdmFsX2xvd2VyX2NvbXBsZXhfcmVwZWF0ZWQgPSAzMTE7Ci0gIHJlcGVhdGVkIHN0cmluZyBhbGxvY19WYWxfdXBwZXJfY29tcGxleF9yZXBlYXRlZCA9IDMxMjsKLSAgcmVwZWF0ZWQgc3RyaW5nIGFsbG9jdmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9jb21wbGV4X3JlcGVhdGVkID0gMzEzOwotICByZXBlYXRlZCBzdHJpbmcgYWxsb2NWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX2NvbXBsZXhfcmVwZWF0ZWQgPSAzMTQ7Ci0KLSAgcmVwZWF0ZWQgaW50MzIgYWxsb2NfdmFsX2xvd2VyX3ByaW1pdGl2ZV9yZXBlYXRlZCA9IDMxNTsKLSAgcmVwZWF0ZWQgaW50MzIgYWxsb2NfVmFsX3VwcGVyX3ByaW1pdGl2ZV9yZXBlYXRlZCA9IDMxNjsKLSAgcmVwZWF0ZWQgaW50MzIgYWxsb2N2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZV9yZXBlYXRlZCA9IDMxNzsKLSAgcmVwZWF0ZWQgaW50MzIgYWxsb2NWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZV9yZXBlYXRlZCA9IDMxODsKLQotICByZXBlYXRlZCBzZWxmIGFsbG9jX3ZhbF9sb3dlcl9tZXNzYWdlX3JlcGVhdGVkID0gMzE5OwotICByZXBlYXRlZCBzZWxmIGFsbG9jX1ZhbF91cHBlcl9tZXNzYWdlX3JlcGVhdGVkID0gMzIwOwotICByZXBlYXRlZCBzZWxmIGFsbG9jdmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlX3JlcGVhdGVkID0gMzIxOwotICByZXBlYXRlZCBzZWxmIGFsbG9jVmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlX3JlcGVhdGVkID0gMzIyOwotCi0gIHJlcGVhdGVkIEZvbyBhbGxvY192YWxfbG93ZXJfZW51bV9yZXBlYXRlZCA9IDMyMzsKLSAgcmVwZWF0ZWQgRm9vIGFsbG9jX1ZhbF91cHBlcl9lbnVtX3JlcGVhdGVkID0gMzI0OwotICByZXBlYXRlZCBGb28gYWxsb2N2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX2VudW1fcmVwZWF0ZWQgPSAzMjU7Ci0gIHJlcGVhdGVkIEZvbyBhbGxvY1ZhbHVlX3VwcGVyX25vX3VuZGVyc2NvcmVfZW51bV9yZXBlYXRlZCA9IDMyNjsKLQotICBvcHRpb25hbCBzdHJpbmcgY29weV92YWxfbG93ZXJfY29tcGxleCA9IDQxMTsKLSAgb3B0aW9uYWwgc3RyaW5nIGNvcHlfVmFsX3VwcGVyX2NvbXBsZXggPSA0MTI7Ci0gIG9wdGlvbmFsIHN0cmluZyBjb3B5dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9jb21wbGV4ID0gNDEzOwotICBvcHRpb25hbCBzdHJpbmcgY29weVZhbHVlX3VwcGVyX25vX3VuZGVyc2NvcmVfY29tcGxleCA9IDQxNDsKLQotICBvcHRpb25hbCBpbnQzMiBjb3B5X3ZhbF9sb3dlcl9wcmltaXRpdmUgPSA0MTU7Ci0gIG9wdGlvbmFsIGludDMyIGNvcHlfVmFsX3VwcGVyX3ByaW1pdGl2ZSA9IDQxNjsKLSAgb3B0aW9uYWwgaW50MzIgY29weXZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfcHJpbWl0aXZlID0gNDE3OwotICBvcHRpb25hbCBpbnQzMiBjb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9wcmltaXRpdmUgPSA0MTg7Ci0KLSAgb3B0aW9uYWwgc2VsZiBjb3B5X3ZhbF9sb3dlcl9tZXNzYWdlID0gNDE5OwotICBvcHRpb25hbCBzZWxmIGNvcHlfVmFsX3VwcGVyX21lc3NhZ2UgPSA0MjA7Ci0gIG9wdGlvbmFsIHNlbGYgY29weXZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfbWVzc2FnZSA9IDQyMTsKLSAgb3B0aW9uYWwgc2VsZiBjb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlID0gNDIyOwotCi0gIG9wdGlvbmFsIEZvbyBjb3B5X3ZhbF9sb3dlcl9lbnVtID0gNDIzOwotICBvcHRpb25hbCBGb28gY29weV9WYWxfdXBwZXJfZW51bSA9IDQyNDsKLSAgb3B0aW9uYWwgRm9vIGNvcHl2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX2VudW0gPSA0MjU7Ci0gIG9wdGlvbmFsIEZvbyBjb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9lbnVtID0gNDI2OwotCi0gIHJlcGVhdGVkIHN0cmluZyBjb3B5X3ZhbF9sb3dlcl9jb21wbGV4X3JlcGVhdGVkID0gNTExOwotICByZXBlYXRlZCBzdHJpbmcgY29weV9WYWxfdXBwZXJfY29tcGxleF9yZXBlYXRlZCA9IDUxMjsKLSAgcmVwZWF0ZWQgc3RyaW5nIGNvcHl2YWx1ZV9sb3dlcl9ub191bmRlcnNjb3JlX2NvbXBsZXhfcmVwZWF0ZWQgPSA1MTM7Ci0gIHJlcGVhdGVkIHN0cmluZyBjb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9jb21wbGV4X3JlcGVhdGVkID0gNTE0OwotCi0gIHJlcGVhdGVkIGludDMyIGNvcHlfdmFsX2xvd2VyX3ByaW1pdGl2ZV9yZXBlYXRlZCA9IDUxNTsKLSAgcmVwZWF0ZWQgaW50MzIgY29weV9WYWxfdXBwZXJfcHJpbWl0aXZlX3JlcGVhdGVkID0gNTE2OwotICByZXBlYXRlZCBpbnQzMiBjb3B5dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9wcmltaXRpdmVfcmVwZWF0ZWQgPSA1MTc7Ci0gIHJlcGVhdGVkIGludDMyIGNvcHlWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX3ByaW1pdGl2ZV9yZXBlYXRlZCA9IDUxODsKLQotICByZXBlYXRlZCBzZWxmIGNvcHlfdmFsX2xvd2VyX21lc3NhZ2VfcmVwZWF0ZWQgPSA1MTk7Ci0gIHJlcGVhdGVkIHNlbGYgY29weV9WYWxfdXBwZXJfbWVzc2FnZV9yZXBlYXRlZCA9IDUyMDsKLSAgcmVwZWF0ZWQgc2VsZiBjb3B5dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9tZXNzYWdlX3JlcGVhdGVkID0gNTIxOwotICByZXBlYXRlZCBzZWxmIGNvcHlWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX21lc3NhZ2VfcmVwZWF0ZWQgPSA1MjI7Ci0KLSAgcmVwZWF0ZWQgRm9vIGNvcHlfdmFsX2xvd2VyX2VudW1fcmVwZWF0ZWQgPSA1MjM7Ci0gIHJlcGVhdGVkIEZvbyBjb3B5X1ZhbF91cHBlcl9lbnVtX3JlcGVhdGVkID0gNTI0OwotICByZXBlYXRlZCBGb28gY29weXZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfZW51bV9yZXBlYXRlZCA9IDUyNTsKLSAgcmVwZWF0ZWQgRm9vIGNvcHlWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX2VudW1fcmVwZWF0ZWQgPSA1MjY7Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIG11dGFibGVDb3B5X3ZhbF9sb3dlcl9jb21wbGV4ID0gNjExOwotICBvcHRpb25hbCBzdHJpbmcgbXV0YWJsZUNvcHlfVmFsX3VwcGVyX2NvbXBsZXggPSA2MTI7Ci0gIG9wdGlvbmFsIHN0cmluZyBtdXRhYmxlQ29weXZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfY29tcGxleCA9IDYxMzsKLSAgb3B0aW9uYWwgc3RyaW5nIG11dGFibGVDb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9jb21wbGV4ID0gNjE0OwotCi0gIG9wdGlvbmFsIGludDMyIG11dGFibGVDb3B5X3ZhbF9sb3dlcl9wcmltaXRpdmUgPSA2MTU7Ci0gIG9wdGlvbmFsIGludDMyIG11dGFibGVDb3B5X1ZhbF91cHBlcl9wcmltaXRpdmUgPSA2MTY7Ci0gIG9wdGlvbmFsIGludDMyIG11dGFibGVDb3B5dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9wcmltaXRpdmUgPSA2MTc7Ci0gIG9wdGlvbmFsIGludDMyIG11dGFibGVDb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9wcmltaXRpdmUgPSA2MTg7Ci0KLSAgb3B0aW9uYWwgc2VsZiBtdXRhYmxlQ29weV92YWxfbG93ZXJfbWVzc2FnZSA9IDYxOTsKLSAgb3B0aW9uYWwgc2VsZiBtdXRhYmxlQ29weV9WYWxfdXBwZXJfbWVzc2FnZSA9IDYyMDsKLSAgb3B0aW9uYWwgc2VsZiBtdXRhYmxlQ29weXZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfbWVzc2FnZSA9IDYyMTsKLSAgb3B0aW9uYWwgc2VsZiBtdXRhYmxlQ29weVZhbHVlX3VwcGVyX25vX3VuZGVyc2NvcmVfbWVzc2FnZSA9IDYyMjsKLQotICBvcHRpb25hbCBGb28gbXV0YWJsZUNvcHlfdmFsX2xvd2VyX2VudW0gPSA2MjM7Ci0gIG9wdGlvbmFsIEZvbyBtdXRhYmxlQ29weV9WYWxfdXBwZXJfZW51bSA9IDYyNDsKLSAgb3B0aW9uYWwgRm9vIG11dGFibGVDb3B5dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9lbnVtID0gNjI1OwotICBvcHRpb25hbCBGb28gbXV0YWJsZUNvcHlWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX2VudW0gPSA2MjY7Ci0KLSAgcmVwZWF0ZWQgc3RyaW5nIG11dGFibGVDb3B5X3ZhbF9sb3dlcl9jb21wbGV4X3JlcGVhdGVkID0gNzExOwotICByZXBlYXRlZCBzdHJpbmcgbXV0YWJsZUNvcHlfVmFsX3VwcGVyX2NvbXBsZXhfcmVwZWF0ZWQgPSA3MTI7Ci0gIHJlcGVhdGVkIHN0cmluZyBtdXRhYmxlQ29weXZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfY29tcGxleF9yZXBlYXRlZCA9IDcxMzsKLSAgcmVwZWF0ZWQgc3RyaW5nIG11dGFibGVDb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9jb21wbGV4X3JlcGVhdGVkID0gNzE0OwotCi0gIHJlcGVhdGVkIGludDMyIG11dGFibGVDb3B5X3ZhbF9sb3dlcl9wcmltaXRpdmVfcmVwZWF0ZWQgPSA3MTU7Ci0gIHJlcGVhdGVkIGludDMyIG11dGFibGVDb3B5X1ZhbF91cHBlcl9wcmltaXRpdmVfcmVwZWF0ZWQgPSA3MTY7Ci0gIHJlcGVhdGVkIGludDMyIG11dGFibGVDb3B5dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9wcmltaXRpdmVfcmVwZWF0ZWQgPSA3MTc7Ci0gIHJlcGVhdGVkIGludDMyIG11dGFibGVDb3B5VmFsdWVfdXBwZXJfbm9fdW5kZXJzY29yZV9wcmltaXRpdmVfcmVwZWF0ZWQgPSA3MTg7Ci0KLSAgcmVwZWF0ZWQgc2VsZiBtdXRhYmxlQ29weV92YWxfbG93ZXJfbWVzc2FnZV9yZXBlYXRlZCA9IDcxOTsKLSAgcmVwZWF0ZWQgc2VsZiBtdXRhYmxlQ29weV9WYWxfdXBwZXJfbWVzc2FnZV9yZXBlYXRlZCA9IDcyMDsKLSAgcmVwZWF0ZWQgc2VsZiBtdXRhYmxlQ29weXZhbHVlX2xvd2VyX25vX3VuZGVyc2NvcmVfbWVzc2FnZV9yZXBlYXRlZCA9IDcyMTsKLSAgcmVwZWF0ZWQgc2VsZiBtdXRhYmxlQ29weVZhbHVlX3VwcGVyX25vX3VuZGVyc2NvcmVfbWVzc2FnZV9yZXBlYXRlZCA9IDcyMjsKLQotICByZXBlYXRlZCBGb28gbXV0YWJsZUNvcHlfdmFsX2xvd2VyX2VudW1fcmVwZWF0ZWQgPSA3MjM7Ci0gIHJlcGVhdGVkIEZvbyBtdXRhYmxlQ29weV9WYWxfdXBwZXJfZW51bV9yZXBlYXRlZCA9IDcyNDsKLSAgcmVwZWF0ZWQgRm9vIG11dGFibGVDb3B5dmFsdWVfbG93ZXJfbm9fdW5kZXJzY29yZV9lbnVtX3JlcGVhdGVkID0gNzI1OwotICByZXBlYXRlZCBGb28gbXV0YWJsZUNvcHlWYWx1ZV91cHBlcl9ub191bmRlcnNjb3JlX2VudW1fcmVwZWF0ZWQgPSA3MjY7Ci19Ci0KLS8vIFRlc3QgaGFuZGxpbmcgb2YgZmllbGRzIHRoYXQgYXJlIHRoZSByZXRhaW5lZCBuYW1lcy4KLW1lc3NhZ2UgT2JqQ1JldGFpbmVkQ29tcGxleCB7Ci0gIG9wdGlvbmFsIHN0cmluZyBuZXcgPSAxOwotICBvcHRpb25hbCBzdHJpbmcgYWxsb2MgPSAyOwotICBvcHRpb25hbCBzdHJpbmcgY29weSA9IDM7Ci0gIG9wdGlvbmFsIHN0cmluZyBtdXRhYmxlQ29weSA9IDQ7Ci19Ci0KLW1lc3NhZ2UgT2JqQ1JldGFpbmVkQ29tcGxleFJlcGVhdGVkIHsKLSAgcmVwZWF0ZWQgc3RyaW5nIG5ldyA9IDE7Ci0gIHJlcGVhdGVkIHN0cmluZyBhbGxvYyA9IDI7Ci0gIHJlcGVhdGVkIHN0cmluZyBjb3B5ID0gMzsKLSAgcmVwZWF0ZWQgc3RyaW5nIG11dGFibGVDb3B5ID0gNDsKLX0KLQotbWVzc2FnZSBPYmpDUmV0YWluZWRQcmltaXRpdmUgewotICBvcHRpb25hbCBpbnQzMiBuZXcgPSAxOwotICBvcHRpb25hbCBpbnQzMiBhbGxvYyA9IDI7Ci0gIG9wdGlvbmFsIGludDMyIGNvcHkgPSAzOwotICBvcHRpb25hbCBpbnQzMiBtdXRhYmxlQ29weSA9IDQ7Ci19Ci0KLW1lc3NhZ2UgT2JqQ1JldGFpbmVkUHJpbWl0aXZlUmVwZWF0ZWQgewotICByZXBlYXRlZCBpbnQzMiBuZXcgPSAxOwotICByZXBlYXRlZCBpbnQzMiBhbGxvYyA9IDI7Ci0gIHJlcGVhdGVkIGludDMyIGNvcHkgPSAzOwotICByZXBlYXRlZCBpbnQzMiBtdXRhYmxlQ29weSA9IDQ7Ci19Ci0KLW1lc3NhZ2UgT2JqQ1JldGFpbmVkTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIHNlbGYgbmV3ID0gMTsKLSAgb3B0aW9uYWwgc2VsZiBhbGxvYyA9IDI7Ci0gIG9wdGlvbmFsIHNlbGYgY29weSA9IDM7Ci0gIG9wdGlvbmFsIHNlbGYgbXV0YWJsZUNvcHkgPSA0OwotfQotCi1tZXNzYWdlIE9iakNSZXRhaW5lZE1lc3NhZ2VSZXBlYXRlZCB7Ci0gIHJlcGVhdGVkIHNlbGYgbmV3ID0gMTsKLSAgcmVwZWF0ZWQgc2VsZiBhbGxvYyA9IDI7Ci0gIHJlcGVhdGVkIHNlbGYgY29weSA9IDM7Ci0gIHJlcGVhdGVkIHNlbGYgbXV0YWJsZUNvcHkgPSA0OwotfQotCi0vLyBUZXN0IEhhbmRsaW5nIHNvbWUgTWFjVHlwZXMKLW1lc3NhZ2UgUG9pbnQgewotICBtZXNzYWdlIFJlY3QgewotICAgIG9wdGlvbmFsIGludDMyIFRpbWVWYWx1ZSA9IDE7Ci0gIH0KLX0KLQotLy8gVGVzdCBzb21lIHdlaXJkIGRlZmF1bHRzIHRoYXQgd2Ugc2VlIGluIHByb3Rvcy4KLW1lc3NhZ2UgT2JqY1dlaXJkRGVmYXVsdHMgewotICAvLyBTZXQgZGVmYXVsdCB2YWx1ZXMgdGhhdCBtYXRjaCB0aGUgcHJvdG9jb2wgYnVmZmVyIGRlZmluZWQgZGVmYXVsdHMgdG8KLSAgLy8gY29uZmlybSBoYXNEZWZhdWx0IGFuZCB0aGUgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCBjb3JyZWN0bHkuCi0gIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtkZWZhdWx0ID0gIiJdOwotICBvcHRpb25hbCBieXRlcyBiYXIgPSAyIFtkZWZhdWx0ID0gIiJdOwotfQotCi0vLyBVc2VkIHRvIGNvbmZpcm0gbmVnYXRpdmUgZW51bSB2YWx1ZXMgd29yayBhcyBleHBlY3RlZC4KLW1lc3NhZ2UgRW51bVRlc3RNc2cgewotICBlbnVtIE15RW51bSB7Ci0gICAgWkVSTyAgICA9IDA7Ci0gICAgT05FICAgICA9IDE7Ci0gICAgVFdPICAgICA9IDI7Ci0gICAgTkVHX09ORSA9IC0xOwotICAgIE5FR19UV08gPSAtMjsKLSAgfQotICBvcHRpb25hbCBNeUVudW0gZm9vID0gMTsKLSAgb3B0aW9uYWwgTXlFbnVtIGJhciA9IDIgW2RlZmF1bHQgPSBPTkVdOwotICBvcHRpb25hbCBNeUVudW0gYmF6ID0gMyBbZGVmYXVsdCA9IE5FR19PTkVdOwotCi0gIHJlcGVhdGVkIE15RW51bSBtdW1ibGUgPSA0OwotfQotCi0vLyBUZXN0IGNhc2UgZm9yIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvaXNzdWVzLzE0NTMKLS8vIE1lc3NhZ2Ugd2l0aCBubyBleHBsaWNpdCBkZWZhdWx0cywgYnV0IGEgbm9uIHplcm8gZGVmYXVsdCBmb3IgYW4gZW51bS4KLW1lc3NhZ2UgTWVzc2FnZVdpdGhPbmVCYXNlZEVudW0gewotICBlbnVtIE9uZUJhc2VkRW51bSB7Ci0gICAgT05FID0gMTsKLSAgICBUV08gPSAyOwotICB9Ci0gIG9wdGlvbmFsIE9uZUJhc2VkRW51bSBlbnVtX2ZpZWxkID0gMTsKLX0KLQotLy8gTWVzc2FnZSB3aXRoIGFsbCBib29scyBmb3IgdGVzdGluZyB0aGluZ3MgcmVsYXRlZCB0byBib29sIHN0b3JhZ2UuCi1tZXNzYWdlIEJvb2xPbmx5TWVzc2FnZSB7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8xID0gMTsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzIgPSAyOwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMyA9IDM7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF80ID0gNDsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzUgPSA1OwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfNiA9IDY7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF83ID0gNzsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzggPSA4OwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfOSA9IDk7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8xMCA9IDEwOwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMTEgPSAxMTsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzEyID0gMTI7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8xMyA9IDEzOwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMTQgPSAxNDsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzE1ID0gMTU7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8xNiA9IDE2OwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMTcgPSAxNzsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzE4ID0gMTg7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8xOSA9IDE5OwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMjAgPSAyMDsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzIxID0gMjE7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8yMiA9IDIyOwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMjMgPSAyMzsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzI0ID0gMjQ7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8yNSA9IDI1OwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMjYgPSAyNjsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzI3ID0gMjc7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8yOCA9IDI4OwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMjkgPSAyOTsKLSAgb3B0aW9uYWwgYm9vbCBib29sX2ZpZWxkXzMwID0gMzA7Ci0gIG9wdGlvbmFsIGJvb2wgYm9vbF9maWVsZF8zMSA9IDMxOwotICBvcHRpb25hbCBib29sIGJvb2xfZmllbGRfMzIgPSAzMjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3Rfb2JqY19zdGFydHVwLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy91bml0dGVzdF9vYmpjX3N0YXJ0dXAucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFlZTdiZDUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy91bml0dGVzdF9vYmpjX3N0YXJ0dXAucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfb2JqY191bml0dGVzdDsKLQotbWVzc2FnZSBUZXN0T2JqQ1N0YXJ0dXBNZXNzYWdlIHsKLSAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKLX0KLQotZXh0ZW5kIFRlc3RPYmpDU3RhcnR1cE1lc3NhZ2UgewotICAvLyBTaW5ndWxhcgotICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMl9leHRlbnNpb24gICAgPSAxOwotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAgPSAyOwotfQotCi1tZXNzYWdlIFRlc3RPYmpDU3RhcnR1cE5lc3RlZCB7Ci0gIGV4dGVuZCBUZXN0T2JqQ1N0YXJ0dXBNZXNzYWdlIHsKLSAgICBvcHRpb25hbCBzdHJpbmcgbmVzdGVkX3N0cmluZ19leHRlbnNpb24gPSAzOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X3J1bnRpbWVfcHJvdG8yLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9UZXN0cy91bml0dGVzdF9ydW50aW1lX3Byb3RvMi5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ4MzUwMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X3J1bnRpbWVfcHJvdG8yLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTI4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1tZXNzYWdlIE1lc3NhZ2UyIHsKLSAgZW51bSBFbnVtIHsKLSAgICBGT08gPSAwOwotICAgIEJBUiA9IDE7Ci0gICAgQkFaID0gMjsKLSAgICBFWFRSQV8yID0gMjA7Ci0gIH0KLQotICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOwotICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOwotICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOwotICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OwotICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgICA9ICA1OwotICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgICA9ICA2OwotICBvcHRpb25hbCAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyICA9ICA3OwotICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ICA9ICA4OwotICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9ICA5OwotICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOwotICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdCAgICA9IDExOwotICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgICA9IDEyOwotICBvcHRpb25hbCAgICAgYm9vbCBvcHRpb25hbF9ib29sICAgICA9IDEzOwotICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgICA9IDE0OwotICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlcyAgICA9IDE1OwotICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgewotICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKLSAgfQotICBvcHRpb25hbCBNZXNzYWdlMiAgb3B0aW9uYWxfbWVzc2FnZSA9IDE4OwotICBvcHRpb25hbCBFbnVtICAgICAgICAgb3B0aW9uYWxfZW51bSA9IDE5OwotCi0gIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyICAgID0gMzE7Ci0gIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0ICAgID0gMzI7Ci0gIHJlcGVhdGVkICAgdWludDMyIHJlcGVhdGVkX3VpbnQzMiAgID0gMzM7Ci0gIHJlcGVhdGVkICAgdWludDY0IHJlcGVhdGVkX3VpbnQ2NCAgID0gMzQ7Ci0gIHJlcGVhdGVkICAgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiAgID0gMzU7Ci0gIHJlcGVhdGVkICAgc2ludDY0IHJlcGVhdGVkX3NpbnQ2NCAgID0gMzY7Ci0gIHJlcGVhdGVkICBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzIgID0gMzc7Ci0gIHJlcGVhdGVkICBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgID0gMzg7Ci0gIHJlcGVhdGVkIHNmaXhlZDMyIHJlcGVhdGVkX3NmaXhlZDMyID0gMzk7Ci0gIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0ID0gNDA7Ci0gIHJlcGVhdGVkICAgIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ICAgID0gNDE7Ci0gIHJlcGVhdGVkICAgZG91YmxlIHJlcGVhdGVkX2RvdWJsZSAgID0gNDI7Ci0gIHJlcGVhdGVkICAgICBib29sIHJlcGVhdGVkX2Jvb2wgICAgID0gNDM7Ci0gIHJlcGVhdGVkICAgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyAgID0gNDQ7Ci0gIHJlcGVhdGVkICAgIGJ5dGVzIHJlcGVhdGVkX2J5dGVzICAgID0gNDU7Ci0gIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OwotICB9Ci0gIHJlcGVhdGVkIE1lc3NhZ2UyIHJlcGVhdGVkX21lc3NhZ2UgID0gNDg7Ci0gIHJlcGVhdGVkIEVudW0gICAgIHJlcGVhdGVkX2VudW0gICAgID0gNDk7Ci0KLSAgb25lb2YgbyB7Ci0gICAgICAgaW50MzIgb25lb2ZfaW50MzIgICAgPSA1MSBbZGVmYXVsdCA9IDEwMF07Ci0gICAgICAgaW50NjQgb25lb2ZfaW50NjQgICAgPSA1MiBbZGVmYXVsdCA9IDEwMV07Ci0gICAgICB1aW50MzIgb25lb2ZfdWludDMyICAgPSA1MyBbZGVmYXVsdCA9IDEwMl07Ci0gICAgICB1aW50NjQgb25lb2ZfdWludDY0ICAgPSA1NCBbZGVmYXVsdCA9IDEwM107Ci0gICAgICBzaW50MzIgb25lb2Zfc2ludDMyICAgPSA1NSBbZGVmYXVsdCA9IDEwNF07Ci0gICAgICBzaW50NjQgb25lb2Zfc2ludDY0ICAgPSA1NiBbZGVmYXVsdCA9IDEwNV07Ci0gICAgIGZpeGVkMzIgb25lb2ZfZml4ZWQzMiAgPSA1NyBbZGVmYXVsdCA9IDEwNl07Ci0gICAgIGZpeGVkNjQgb25lb2ZfZml4ZWQ2NCAgPSA1OCBbZGVmYXVsdCA9IDEwN107Ci0gICAgc2ZpeGVkMzIgb25lb2Zfc2ZpeGVkMzIgPSA1OSBbZGVmYXVsdCA9IDEwOF07Ci0gICAgc2ZpeGVkNjQgb25lb2Zfc2ZpeGVkNjQgPSA2MCBbZGVmYXVsdCA9IDEwOV07Ci0gICAgICAgZmxvYXQgb25lb2ZfZmxvYXQgICAgPSA2MSBbZGVmYXVsdCA9IDExMF07Ci0gICAgICBkb3VibGUgb25lb2ZfZG91YmxlICAgPSA2MiBbZGVmYXVsdCA9IDExMV07Ci0gICAgICAgIGJvb2wgb25lb2ZfYm9vbCAgICAgPSA2MyBbZGVmYXVsdCA9IHRydWVdOwotICAgICAgc3RyaW5nIG9uZW9mX3N0cmluZyAgID0gNjQgW2RlZmF1bHQgPSAic3RyaW5nIl07Ci0gICAgICAgYnl0ZXMgb25lb2ZfYnl0ZXMgICAgPSA2NSBbZGVmYXVsdCA9ICJkYXRhIl07Ci0gICAgICAgZ3JvdXAgT25lb2ZHcm91cCAgICAgPSA2NiB7Ci0gICAgICAgICBvcHRpb25hbCBpbnQzMiBhID0gNjc7Ci0gICAgICAgICBvcHRpb25hbCBpbnQzMiBiID0gMTY3OwotICAgICAgIH0KLSAgICAgTWVzc2FnZTIgb25lb2ZfbWVzc2FnZSA9IDY4OwotICAgICBFbnVtICAgICAgICBvbmVvZl9lbnVtID0gNjkgW2RlZmF1bHQgPSBCQVpdOwotICB9Ci0KLSAgLy8gU29tZSB0b2tlbiBtYXAgY2FzZXMsIHRvbyBtYW55IGNvbWJpbmF0aW9ucyB0byBsaXN0IHRoZW0gYWxsLgotICBtYXA8aW50MzIgICAsIGludDMyICAgPiBtYXBfaW50MzJfaW50MzIgICAgICAgPSA3MDsKLSAgbWFwPGludDY0ICAgLCBpbnQ2NCAgID4gbWFwX2ludDY0X2ludDY0ICAgICAgID0gNzE7Ci0gIG1hcDx1aW50MzIgICwgdWludDMyICA+IG1hcF91aW50MzJfdWludDMyICAgICA9IDcyOwotICBtYXA8dWludDY0ICAsIHVpbnQ2NCAgPiBtYXBfdWludDY0X3VpbnQ2NCAgICAgPSA3MzsKLSAgbWFwPHNpbnQzMiAgLCBzaW50MzIgID4gbWFwX3NpbnQzMl9zaW50MzIgICAgID0gNzQ7Ci0gIG1hcDxzaW50NjQgICwgc2ludDY0ICA+IG1hcF9zaW50NjRfc2ludDY0ICAgICA9IDc1OwotICBtYXA8Zml4ZWQzMiAsIGZpeGVkMzIgPiBtYXBfZml4ZWQzMl9maXhlZDMyICAgPSA3NjsKLSAgbWFwPGZpeGVkNjQgLCBmaXhlZDY0ID4gbWFwX2ZpeGVkNjRfZml4ZWQ2NCAgID0gNzc7Ci0gIG1hcDxzZml4ZWQzMiwgc2ZpeGVkMzI+IG1hcF9zZml4ZWQzMl9zZml4ZWQzMiA9IDc4OwotICBtYXA8c2ZpeGVkNjQsIHNmaXhlZDY0PiBtYXBfc2ZpeGVkNjRfc2ZpeGVkNjQgPSA3OTsKLSAgbWFwPGludDMyICAgLCBmbG9hdCAgID4gbWFwX2ludDMyX2Zsb2F0ICAgICAgID0gODA7Ci0gIG1hcDxpbnQzMiAgICwgZG91YmxlICA+IG1hcF9pbnQzMl9kb3VibGUgICAgICA9IDgxOwotICBtYXA8Ym9vbCAgICAsIGJvb2wgICAgPiBtYXBfYm9vbF9ib29sICAgICAgICAgPSA4MjsKLSAgbWFwPHN0cmluZyAgLCBzdHJpbmcgID4gbWFwX3N0cmluZ19zdHJpbmcgICAgID0gODM7Ci0gIG1hcDxzdHJpbmcgICwgYnl0ZXMgICA+IG1hcF9zdHJpbmdfYnl0ZXMgICAgICA9IDg0OwotICBtYXA8c3RyaW5nICAsIE1lc3NhZ2UyPiBtYXBfc3RyaW5nX21lc3NhZ2UgICAgPSA4NTsKLSAgbWFwPGludDMyICAgLCBieXRlcyAgID4gbWFwX2ludDMyX2J5dGVzICAgICAgID0gODY7Ci0gIG1hcDxpbnQzMiAgICwgRW51bSAgICA+IG1hcF9pbnQzMl9lbnVtICAgICAgICA9IDg3OwotICBtYXA8aW50MzIgICAsIE1lc3NhZ2UyPiBtYXBfaW50MzJfbWVzc2FnZSAgICAgPSA4ODsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvVGVzdHMvdW5pdHRlc3RfcnVudGltZV9wcm90bzMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X3J1bnRpbWVfcHJvdG8zLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDJlMzYyMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL1Rlc3RzL3VuaXR0ZXN0X3J1bnRpbWVfcHJvdG8zLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTIxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTUgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1tZXNzYWdlIE1lc3NhZ2UzIHsKLSAgZW51bSBFbnVtIHsKLSAgICBGT08gPSAwOwotICAgIEJBUiA9IDE7Ci0gICAgQkFaID0gMjsKLSAgICBFWFRSQV8zID0gMzA7Ci0gIH0KLQotICAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOwotICAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOwotICAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOwotICAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OwotICAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgICA9ICA1OwotICAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgICA9ICA2OwotICAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyICA9ICA3OwotICAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ICA9ICA4OwotICBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9ICA5OwotICBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOwotICAgICBmbG9hdCBvcHRpb25hbF9mbG9hdCAgICA9IDExOwotICAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgICA9IDEyOwotICAgICAgYm9vbCBvcHRpb25hbF9ib29sICAgICA9IDEzOwotICAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgICA9IDE0OwotICAgICBieXRlcyBvcHRpb25hbF9ieXRlcyAgICA9IDE1OwotICAvLyBObyAnZ3JvdXAnIGluIHByb3RvMy4KLSAgTWVzc2FnZTMgb3B0aW9uYWxfbWVzc2FnZSAgPSAxODsKLSAgICAgIEVudW0gb3B0aW9uYWxfZW51bSAgICAgPSAxOTsKLQotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOwotICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOwotICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOwotICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OwotICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OwotICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OwotICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OwotICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OwotICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOwotICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOwotICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOwotICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOwotICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OwotICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OwotICAvLyBObyAnZ3JvdXAnIGluIHByb3RvMy4KLSAgcmVwZWF0ZWQgTWVzc2FnZTMgcmVwZWF0ZWRfbWVzc2FnZSAgPSA0ODsKLSAgcmVwZWF0ZWQgICAgIEVudW0gcmVwZWF0ZWRfZW51bSAgICAgPSA0OTsKLQotICBvbmVvZiBvIHsKLSAgICAgICBpbnQzMiBvbmVvZl9pbnQzMiAgICA9IDUxOwotICAgICAgIGludDY0IG9uZW9mX2ludDY0ICAgID0gNTI7Ci0gICAgICB1aW50MzIgb25lb2ZfdWludDMyICAgPSA1MzsKLSAgICAgIHVpbnQ2NCBvbmVvZl91aW50NjQgICA9IDU0OwotICAgICAgc2ludDMyIG9uZW9mX3NpbnQzMiAgID0gNTU7Ci0gICAgICBzaW50NjQgb25lb2Zfc2ludDY0ICAgPSA1NjsKLSAgICAgZml4ZWQzMiBvbmVvZl9maXhlZDMyICA9IDU3OwotICAgICBmaXhlZDY0IG9uZW9mX2ZpeGVkNjQgID0gNTg7Ci0gICAgc2ZpeGVkMzIgb25lb2Zfc2ZpeGVkMzIgPSA1OTsKLSAgICBzZml4ZWQ2NCBvbmVvZl9zZml4ZWQ2NCA9IDYwOwotICAgICAgIGZsb2F0IG9uZW9mX2Zsb2F0ICAgID0gNjE7Ci0gICAgICBkb3VibGUgb25lb2ZfZG91YmxlICAgPSA2MjsKLSAgICAgICAgYm9vbCBvbmVvZl9ib29sICAgICA9IDYzOwotICAgICAgc3RyaW5nIG9uZW9mX3N0cmluZyAgID0gNjQ7Ci0gICAgICAgYnl0ZXMgb25lb2ZfYnl0ZXMgICAgPSA2NTsKLSAgICAvLyBObyAnZ3JvdXAnIGluIHByb3RvMy4KLSAgICBNZXNzYWdlMyBvbmVvZl9tZXNzYWdlICA9IDY4OwotICAgICAgICBFbnVtIG9uZW9mX2VudW0gICAgID0gNjk7Ci0gIH0KLQotICAvLyBTb21lIHRva2VuIG1hcCBjYXNlcywgdG9vIG1hbnkgY29tYmluYXRpb25zIHRvIGxpc3QgdGhlbSBhbGwuCi0gIG1hcDxpbnQzMiAgICwgaW50MzIgICA+IG1hcF9pbnQzMl9pbnQzMiAgICAgICA9IDcwOwotICBtYXA8aW50NjQgICAsIGludDY0ICAgPiBtYXBfaW50NjRfaW50NjQgICAgICAgPSA3MTsKLSAgbWFwPHVpbnQzMiAgLCB1aW50MzIgID4gbWFwX3VpbnQzMl91aW50MzIgICAgID0gNzI7Ci0gIG1hcDx1aW50NjQgICwgdWludDY0ICA+IG1hcF91aW50NjRfdWludDY0ICAgICA9IDczOwotICBtYXA8c2ludDMyICAsIHNpbnQzMiAgPiBtYXBfc2ludDMyX3NpbnQzMiAgICAgPSA3NDsKLSAgbWFwPHNpbnQ2NCAgLCBzaW50NjQgID4gbWFwX3NpbnQ2NF9zaW50NjQgICAgID0gNzU7Ci0gIG1hcDxmaXhlZDMyICwgZml4ZWQzMiA+IG1hcF9maXhlZDMyX2ZpeGVkMzIgICA9IDc2OwotICBtYXA8Zml4ZWQ2NCAsIGZpeGVkNjQgPiBtYXBfZml4ZWQ2NF9maXhlZDY0ICAgPSA3NzsKLSAgbWFwPHNmaXhlZDMyLCBzZml4ZWQzMj4gbWFwX3NmaXhlZDMyX3NmaXhlZDMyID0gNzg7Ci0gIG1hcDxzZml4ZWQ2NCwgc2ZpeGVkNjQ+IG1hcF9zZml4ZWQ2NF9zZml4ZWQ2NCA9IDc5OwotICBtYXA8aW50MzIgICAsIGZsb2F0ICAgPiBtYXBfaW50MzJfZmxvYXQgICAgICAgPSA4MDsKLSAgbWFwPGludDMyICAgLCBkb3VibGUgID4gbWFwX2ludDMyX2RvdWJsZSAgICAgID0gODE7Ci0gIG1hcDxib29sICAgICwgYm9vbCAgICA+IG1hcF9ib29sX2Jvb2wgICAgICAgICA9IDgyOwotICBtYXA8c3RyaW5nICAsIHN0cmluZyAgPiBtYXBfc3RyaW5nX3N0cmluZyAgICAgPSA4MzsKLSAgbWFwPHN0cmluZyAgLCBieXRlcyAgID4gbWFwX3N0cmluZ19ieXRlcyAgICAgID0gODQ7Ci0gIG1hcDxzdHJpbmcgICwgTWVzc2FnZTM+IG1hcF9zdHJpbmdfbWVzc2FnZSAgICA9IDg1OwotICBtYXA8aW50MzIgICAsIGJ5dGVzICAgPiBtYXBfaW50MzJfYnl0ZXMgICAgICAgPSA4NjsKLSAgbWFwPGludDMyICAgLCBFbnVtICAgID4gbWFwX2ludDMyX2VudW0gICAgICAgID0gODc7Ci0gIG1hcDxpbnQzMiAgICwgTWVzc2FnZTM+IG1hcF9pbnQzMl9tZXNzYWdlICAgICA9IDg4OwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nZW5lcmF0ZV93ZWxsX2tub3duX3R5cGVzLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nZW5lcmF0ZV93ZWxsX2tub3duX3R5cGVzLnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzNmMzNDYwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ2VuZXJhdGVfd2VsbF9rbm93bl90eXBlcy5zaAorKysgL2Rldi9udWxsCkBAIC0xLDc2ICswLDAgQEAKLSMhL2Jpbi9iYXNoCi0KLSMgUnVuIHRoaXMgc2NyaXB0IHRvIHJlZ2VuZXJhdGUgKi5wYm9iamMue2gsbX0gZm9yIHRoZSB3ZWxsIGtub3duIHR5cGVzIGFmdGVyCi0jIHRoZSBwcm90b2NvbCBjb21waWxlciBjaGFuZ2VzLgotCi0jIEhJTlQ6ICBGbGFncyBwYXNzZWQgdG8gZ2VuZXJhdGVfd2VsbF9rbm93bl90eXBlcy5zaCB3aWxsIGJlIHBhc3NlZCBkaXJlY3RseQotIyAgIHRvIG1ha2Ugd2hlbiBidWlsZGluZyBwcm90b2MuICBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgZm9yIHBhc3NpbmcKLSMgICAtajQgdG8gcnVuIDQgam9icyBzaW11bHRhbmVvdXNseS4KLQotc2V0IC1ldQotCi1yZWFkb25seSBTY3JpcHREaXI9JChkaXJuYW1lICIkKGVjaG8gJDAgfCBzZWQgLWUgInMsXlwoW14vXVwpLCQocHdkKS9cMSwiKSIpCi1yZWFkb25seSBQcm90b1Jvb3REaXI9IiR7U2NyaXB0RGlyfS8uLiIKLQotIyBGbGFnIGZvciBjb250aW51b3VzIGludGVncmF0aW9uIHRvIGNoZWNrIHRoYXQgZXZlcnl0aGluZyBpcyBjdXJyZW50LgotQ0hFQ0tfT05MWT0wCi1pZiBbWyAkIyAtZ2UgMSAmJiAoICIkMSIgPT0gIi0tY2hlY2stb25seSIgKSBdXSA7IHRoZW4KLSAgQ0hFQ0tfT05MWT0xCi0gIHNoaWZ0Ci1maQotCi1wdXNoZCAiJHtQcm90b1Jvb3REaXJ9IiA+IC9kZXYvbnVsbAotCi1pZiB0ZXN0ICEgLWUgc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaDsgdGhlbgotICBjYXQgPiYyIDw8IF9fRU9GX18KLUNvdWxkIG5vdCBmaW5kIHNvdXJjZSBjb2RlLiAgTWFrZSBzdXJlIHlvdSBhcmUgcnVubmluZyB0aGlzIHNjcmlwdCBmcm9tIHRoZQotcm9vdCBvZiB0aGUgZGlzdHJpYnV0aW9uIHRyZWUuCi1fX0VPRl9fCi0gIGV4aXQgMQotZmkKLQotaWYgdGVzdCAhIC1lIHNyYy9NYWtlZmlsZTsgdGhlbgotICBjYXQgPiYyIDw8IF9fRU9GX18KLUNvdWxkIG5vdCBmaW5kIHNyYy9NYWtlZmlsZS4gIFlvdSBtdXN0IHJ1biAuL2NvbmZpZ3VyZSAoYW5kIHBlcmhhcHMKLS4vYXV0b2dlbi5zaCkgZmlyc3QuCi1fX0VPRl9fCi0gIGV4aXQgMQotZmkKLQotIyBNYWtlIHN1cmUgdGhlIGNvbXBpbGVyIGlzIGN1cnJlbnQuCi1jZCBzcmMKLW1ha2UgJEAgcHJvdG9jCi0KLWRlY2xhcmUgLWEgUlVOVElNRV9QUk9UT19GSUxFUz0oIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byBcCi0gIGdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8gXAotICBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8gXAotICBnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8gXAotICBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90byBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90byBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8gXAotICBnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8gXAotICBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8pCi0KLSMgR2VuZXJhdGUgdG8gYSB0ZW1wIGRpcmVjdG9yeSB0byBzZWUgaWYgdGhleSBtYXRjaC4KLVRNUF9ESVI9JChta3RlbXAgLWQpCi10cmFwICJybSAtcmYgJHtUTVBfRElSfSIgRVhJVAotLi9wcm90b2MgLS1vYmpjX291dD0iJHtUTVBfRElSfSIgJHtSVU5USU1FX1BST1RPX0ZJTEVTW0BdfQotc2V0ICtlCi1kaWZmIC1yICIke1RNUF9ESVJ9L2dvb2dsZSIgIiR7UHJvdG9Sb290RGlyfS9vYmplY3RpdmVjL2dvb2dsZSIgPiAvZGV2L251bGwKLWlmIFtbICQ/IC1lcSAwIF1dIDsgdGhlbgotICBlY2hvICJHZW5lcmF0ZWQgc291cmNlIGZvciBXZWxsS25vd25UeXBlcyBpcyBjdXJyZW50LiIKLSAgZXhpdCAwCi1maQotc2V0IC1lCi0KLSMgSWYgY2hlY2sgb25seSBtb2RlLCBlcnJvciBvdXQuCi1pZiBbWyAiJHtDSEVDS19PTkxZfSIgPT0gMSBdXSA7IHRoZW4KLSAgZWNobyAiRVJST1I6IFRoZSBXS1RzIG5lZWQgdG8gYmUgcmVnZW5lcmF0ZWQhIFJ1biAkMCIKLSAgZXhpdCAxCi1maQotCi0jIENvcHkgdGhlbSBvdmVyLgotZWNobyAiQ29weWluZyBvdmVyIHVwZGF0ZWQgV2VsbEtub3duVHlwZSBzb3VyY2VzLiIKLWNwIC1yICIke1RNUF9ESVJ9L2dvb2dsZS8uIiAiJHtQcm90b1Jvb3REaXJ9L29iamVjdGl2ZWMvZ29vZ2xlLyIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0FueS5wYm9iamMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0FueS5wYm9iamMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDAwMmE5OC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9BbnkucGJvYmpjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnMuaCIKLQotI2lmIEdPT0dMRV9QUk9UT0JVRl9PQkpDX0dFTl9WRVJTSU9OICE9IDMwMDAxCi0jZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBzb3VyY2VzLgotI2VuZGlmCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLSNwcmFnbWEgbWFyayAtIEdQQkFueVJvb3QKLQotLy8vIEV4cG9zZXMgdGhlIGV4dGVuc2lvbiByZWdpc3RyeSBmb3IgdGhpcyBmaWxlLgotLy8vCi0vLy8gVGhlIGJhc2UgY2xhc3MgcHJvdmlkZXM6Ci0vLy8gQGNvZGUKLS8vLyAgICsgKEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnk7Ci0vLy8gQGVuZGNvZGUKLS8vLyB3aGljaCBpcyBhIEBjIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBleHRlbnNpb25zIGRlZmluZWQgYnkKLS8vLyB0aGlzIGZpbGUgYW5kIGFsbCBmaWxlcyB0aGF0IGl0IGRlcGVuZHMgb24uCi1AaW50ZXJmYWNlIEdQQkFueVJvb3QgOiBHUEJSb290T2JqZWN0Ci1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQkFueQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQkFueV9GaWVsZE51bWJlcikgewotICBHUEJBbnlfRmllbGROdW1iZXJfVHlwZVVSTCA9IDEsCi0gIEdQQkFueV9GaWVsZE51bWJlcl9WYWx1ZSA9IDIsCi19OwotCi0vLy8gYEFueWAgY29udGFpbnMgYW4gYXJiaXRyYXJ5IHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UgYWxvbmcgd2l0aCBhCi0vLy8gVVJMIHRoYXQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIHRoZSBzZXJpYWxpemVkIG1lc3NhZ2UuCi0vLy8KLS8vLyBQcm90b2J1ZiBsaWJyYXJ5IHByb3ZpZGVzIHN1cHBvcnQgdG8gcGFjay91bnBhY2sgQW55IHZhbHVlcyBpbiB0aGUgZm9ybQotLy8vIG9mIHV0aWxpdHkgZnVuY3Rpb25zIG9yIGFkZGl0aW9uYWwgZ2VuZXJhdGVkIG1ldGhvZHMgb2YgdGhlIEFueSB0eXBlLgotLy8vCi0vLy8gRXhhbXBsZSAxOiBQYWNrIGFuZCB1bnBhY2sgYSBtZXNzYWdlIGluIEMrKy4KLS8vLwotLy8vICAgICBGb28gZm9vID0gLi4uOwotLy8vICAgICBBbnkgYW55OwotLy8vICAgICBhbnkuUGFja0Zyb20oZm9vKTsKLS8vLyAgICAgLi4uCi0vLy8gICAgIGlmIChhbnkuVW5wYWNrVG8oJmZvbykpIHsKLS8vLyAgICAgICAuLi4KLS8vLyAgICAgfQotLy8vCi0vLy8gRXhhbXBsZSAyOiBQYWNrIGFuZCB1bnBhY2sgYSBtZXNzYWdlIGluIEphdmEuCi0vLy8KLS8vLyAgICAgRm9vIGZvbyA9IC4uLjsKLS8vLyAgICAgQW55IGFueSA9IEFueS5wYWNrKGZvbyk7Ci0vLy8gICAgIC4uLgotLy8vICAgICBpZiAoYW55LmlzKEZvby5jbGFzcykpIHsKLS8vLyAgICAgICBmb28gPSBhbnkudW5wYWNrKEZvby5jbGFzcyk7Ci0vLy8gICAgIH0KLS8vLwotLy8vIFRoZSBwYWNrIG1ldGhvZHMgcHJvdmlkZWQgYnkgcHJvdG9idWYgbGlicmFyeSB3aWxsIGJ5IGRlZmF1bHQgdXNlCi0vLy8gJ3R5cGUuZ29vZ2xlYXBpcy5jb20vZnVsbC50eXBlLm5hbWUnIGFzIHRoZSB0eXBlIFVSTCBhbmQgdGhlIHVucGFjawotLy8vIG1ldGhvZHMgb25seSB1c2UgdGhlIGZ1bGx5IHF1YWxpZmllZCB0eXBlIG5hbWUgYWZ0ZXIgdGhlIGxhc3QgJy8nCi0vLy8gaW4gdGhlIHR5cGUgVVJMLCBmb3IgZXhhbXBsZSAiZm9vLmJhci5jb20veC95LnoiIHdpbGwgeWllbGQgdHlwZQotLy8vIG5hbWUgInkueiIuCi0vLy8KLS8vLwotLy8vIEpTT04KLS8vLyA9PT09Ci0vLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYW4gYEFueWAgdmFsdWUgdXNlcyB0aGUgcmVndWxhcgotLy8vIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBkZXNlcmlhbGl6ZWQsIGVtYmVkZGVkIG1lc3NhZ2UsIHdpdGggYW4KLS8vLyBhZGRpdGlvbmFsIGZpZWxkIGBcQHR5cGVgIHdoaWNoIGNvbnRhaW5zIHRoZSB0eXBlIFVSTC4gRXhhbXBsZToKLS8vLwotLy8vICAgICBwYWNrYWdlIGdvb2dsZS5wcm9maWxlOwotLy8vICAgICBtZXNzYWdlIFBlcnNvbiB7Ci0vLy8gICAgICAgc3RyaW5nIGZpcnN0X25hbWUgPSAxOwotLy8vICAgICAgIHN0cmluZyBsYXN0X25hbWUgPSAyOwotLy8vICAgICB9Ci0vLy8KLS8vLyAgICAgewotLy8vICAgICAgICJcQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvZmlsZS5QZXJzb24iLAotLy8vICAgICAgICJmaXJzdE5hbWUiOiA8c3RyaW5nPiwKLS8vLyAgICAgICAibGFzdE5hbWUiOiA8c3RyaW5nPgotLy8vICAgICB9Ci0vLy8KLS8vLyBJZiB0aGUgZW1iZWRkZWQgbWVzc2FnZSB0eXBlIGlzIHdlbGwta25vd24gYW5kIGhhcyBhIGN1c3RvbSBKU09OCi0vLy8gcmVwcmVzZW50YXRpb24sIHRoYXQgcmVwcmVzZW50YXRpb24gd2lsbCBiZSBlbWJlZGRlZCBhZGRpbmcgYSBmaWVsZAotLy8vIGB2YWx1ZWAgd2hpY2ggaG9sZHMgdGhlIGN1c3RvbSBKU09OIGluIGFkZGl0aW9uIHRvIHRoZSBgXEB0eXBlYAotLy8vIGZpZWxkLiBFeGFtcGxlIChmb3IgbWVzc2FnZSBbZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uXVtdKToKLS8vLwotLy8vICAgICB7Ci0vLy8gICAgICAgIlxAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbiIsCi0vLy8gICAgICAgInZhbHVlIjogIjEuMjEycyIKLS8vLyAgICAgfQotQGludGVyZmFjZSBHUEJBbnkgOiBHUEJNZXNzYWdlCi0KLS8vLyBBIFVSTC9yZXNvdXJjZSBuYW1lIHdob3NlIGNvbnRlbnQgZGVzY3JpYmVzIHRoZSB0eXBlIG9mIHRoZQotLy8vIHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UuCi0vLy8KLS8vLyBGb3IgVVJMcyB3aGljaCB1c2UgdGhlIHNjaGVtYSBgaHR0cGAsIGBodHRwc2AsIG9yIG5vIHNjaGVtYSwgdGhlCi0vLy8gZm9sbG93aW5nIHJlc3RyaWN0aW9ucyBhbmQgaW50ZXJwcmV0YXRpb25zIGFwcGx5OgotLy8vCi0vLy8gKiBJZiBubyBzY2hlbWEgaXMgcHJvdmlkZWQsIGBodHRwc2AgaXMgYXNzdW1lZC4KLS8vLyAqIFRoZSBsYXN0IHNlZ21lbnQgb2YgdGhlIFVSTCdzIHBhdGggbXVzdCByZXByZXNlbnQgdGhlIGZ1bGx5Ci0vLy8gICBxdWFsaWZpZWQgbmFtZSBvZiB0aGUgdHlwZSAoYXMgaW4gYHBhdGgvZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uYCkuCi0vLy8gICBUaGUgbmFtZSBzaG91bGQgYmUgaW4gYSBjYW5vbmljYWwgZm9ybSAoZS5nLiwgbGVhZGluZyAiLiIgaXMKLS8vLyAgIG5vdCBhY2NlcHRlZCkuCi0vLy8gKiBBbiBIVFRQIEdFVCBvbiB0aGUgVVJMIG11c3QgeWllbGQgYSBbZ29vZ2xlLnByb3RvYnVmLlR5cGVdW10KLS8vLyAgIHZhbHVlIGluIGJpbmFyeSBmb3JtYXQsIG9yIHByb2R1Y2UgYW4gZXJyb3IuCi0vLy8gKiBBcHBsaWNhdGlvbnMgYXJlIGFsbG93ZWQgdG8gY2FjaGUgbG9va3VwIHJlc3VsdHMgYmFzZWQgb24gdGhlCi0vLy8gICBVUkwsIG9yIGhhdmUgdGhlbSBwcmVjb21waWxlZCBpbnRvIGEgYmluYXJ5IHRvIGF2b2lkIGFueQotLy8vICAgbG9va3VwLiBUaGVyZWZvcmUsIGJpbmFyeSBjb21wYXRpYmlsaXR5IG5lZWRzIHRvIGJlIHByZXNlcnZlZAotLy8vICAgb24gY2hhbmdlcyB0byB0eXBlcy4gKFVzZSB2ZXJzaW9uZWQgdHlwZSBuYW1lcyB0byBtYW5hZ2UKLS8vLyAgIGJyZWFraW5nIGNoYW5nZXMuKQotLy8vCi0vLy8gU2NoZW1hcyBvdGhlciB0aGFuIGBodHRwYCwgYGh0dHBzYCAob3IgdGhlIGVtcHR5IHNjaGVtYSkgbWlnaHQgYmUKLS8vLyB1c2VkIHdpdGggaW1wbGVtZW50YXRpb24gc3BlY2lmaWMgc2VtYW50aWNzLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICp0eXBlVVJMOwotCi0vLy8gTXVzdCBiZSBhIHZhbGlkIHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIG9mIHRoZSBhYm92ZSBzcGVjaWZpZWQgdHlwZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU0RhdGEgKnZhbHVlOwotCi1AZW5kCi0KLU5TX0FTU1VNRV9OT05OVUxMX0VORAotCi1DRl9FWFRFUk5fQ19FTkQKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvQW55LnBib2JqYy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvQW55LnBib2JqYy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2YTFiZjg5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0FueS5wYm9iamMubQorKysgL2Rldi9udWxsCkBAIC0xLDkzICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8KLQotI2ltcG9ydCAiR1BCUHJvdG9jb2xCdWZmZXJzX1J1bnRpbWVTdXBwb3J0LmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvQW55LnBib2JqYy5oIgotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotI3ByYWdtYSBtYXJrIC0gR1BCQW55Um9vdAotCi1AaW1wbGVtZW50YXRpb24gR1BCQW55Um9vdAotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQkFueVJvb3RfRmlsZURlc2NyaXB0b3IKLQotc3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICpHUEJBbnlSb290X0ZpbGVEZXNjcmlwdG9yKHZvaWQpIHsKLSAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgK2luaXRpYWxpemUgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeQotICAvLyBhYm91dCB0aHJlYWQgc2FmZXR5IG9mIHRoZSBzaW5nbGV0b24uCi0gIHN0YXRpYyBHUEJGaWxlRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IE5VTEw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIEdQQkRlYnVnQ2hlY2tSdW50aW1lVmVyc2lvbigpOwotICAgIGRlc2NyaXB0b3IgPSBbW0dQQkZpbGVEZXNjcmlwdG9yIGFsbG9jXSBpbml0V2l0aFBhY2thZ2U6QCJnb29nbGUucHJvdG9idWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDpHUEJGaWxlU3ludGF4UHJvdG8zXTsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCQW55Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJBbnkKLQotQGR5bmFtaWMgdHlwZVVSTDsKLUBkeW5hbWljIHZhbHVlOwotCi10eXBlZGVmIHN0cnVjdCBHUEJBbnlfX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLSAgTlNTdHJpbmcgKnR5cGVVUkw7Ci0gIE5TRGF0YSAqdmFsdWU7Ci19IEdQQkFueV9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAidHlwZVVSTCIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJBbnlfRmllbGROdW1iZXJfVHlwZVVSTCwKLSAgICAgICAgLmhhc0luZGV4ID0gMCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJBbnlfX3N0b3JhZ2VfLCB0eXBlVVJMKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCB8IEdQQkZpZWxkVGV4dEZvcm1hdE5hbWVDdXN0b20sCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlU3RyaW5nLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAidmFsdWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCQW55X0ZpZWxkTnVtYmVyX1ZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSAxLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkFueV9fc3RvcmFnZV8sIHZhbHVlKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVCeXRlcywKLSAgICAgIH0sCi0gICAgfTsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCQW55IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCQW55Um9vdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6R1BCQW55Um9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQkFueV9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotI2lmICFHUEJPQkpDX1NLSVBfTUVTU0FHRV9URVhURk9STUFUX0VYVFJBUwotICAgIHN0YXRpYyBjb25zdCBjaGFyICpleHRyYVRleHRGb3JtYXRJbmZvID0KLSAgICAgICAgIlwwMDFcMDAxXDAwNFwyNDEhIVwwMDAiOwotICAgIFtsb2NhbERlc2NyaXB0b3Igc2V0dXBFeHRyYVRleHRJbmZvOmV4dHJhVGV4dEZvcm1hdEluZm9dOwotI2VuZGlmICAvLyAhR1BCT0JKQ19TS0lQX01FU1NBR0VfVEVYVEZPUk1BVF9FWFRSQVMKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9BcGkucGJvYmpjLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9BcGkucGJvYmpjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ2NmRmNjIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvQXBpLnBib2JqYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjYyICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8KLQotI2ltcG9ydCAiR1BCUHJvdG9jb2xCdWZmZXJzLmgiCi0KLSNpZiBHT09HTEVfUFJPVE9CVUZfT0JKQ19HRU5fVkVSU0lPTiAhPSAzMDAwMQotI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgZGlmZmVyZW50IHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkgc291cmNlcy4KLSNlbmRpZgotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgotCi1DRl9FWFRFUk5fQ19CRUdJTgotCi1AY2xhc3MgR1BCTWV0aG9kOwotQGNsYXNzIEdQQk1peGluOwotQGNsYXNzIEdQQk9wdGlvbjsKLUBjbGFzcyBHUEJTb3VyY2VDb250ZXh0OwotR1BCX0VOVU1fRldEX0RFQ0xBUkUoR1BCU3ludGF4KTsKLQotTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KLQotI3ByYWdtYSBtYXJrIC0gR1BCQXBpUm9vdAotCi0vLy8gRXhwb3NlcyB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGZvciB0aGlzIGZpbGUuCi0vLy8KLS8vLyBUaGUgYmFzZSBjbGFzcyBwcm92aWRlczoKLS8vLyBAY29kZQotLy8vICAgKyAoR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeTsKLS8vLyBAZW5kY29kZQotLy8vIHdoaWNoIGlzIGEgQGMgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgdGhhdCBpbmNsdWRlcyBhbGwgdGhlIGV4dGVuc2lvbnMgZGVmaW5lZCBieQotLy8vIHRoaXMgZmlsZSBhbmQgYWxsIGZpbGVzIHRoYXQgaXQgZGVwZW5kcyBvbi4KLUBpbnRlcmZhY2UgR1BCQXBpUm9vdCA6IEdQQlJvb3RPYmplY3QKLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCQXBpCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCQXBpX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQkFwaV9GaWVsZE51bWJlcl9OYW1lID0gMSwKLSAgR1BCQXBpX0ZpZWxkTnVtYmVyX01ldGhvZHNBcnJheSA9IDIsCi0gIEdQQkFwaV9GaWVsZE51bWJlcl9PcHRpb25zQXJyYXkgPSAzLAotICBHUEJBcGlfRmllbGROdW1iZXJfVmVyc2lvbiA9IDQsCi0gIEdQQkFwaV9GaWVsZE51bWJlcl9Tb3VyY2VDb250ZXh0ID0gNSwKLSAgR1BCQXBpX0ZpZWxkTnVtYmVyX01peGluc0FycmF5ID0gNiwKLSAgR1BCQXBpX0ZpZWxkTnVtYmVyX1N5bnRheCA9IDcsCi19OwotCi0vLy8gQXBpIGlzIGEgbGlnaHQtd2VpZ2h0IGRlc2NyaXB0b3IgZm9yIGEgcHJvdG9jb2wgYnVmZmVyIHNlcnZpY2UuCi1AaW50ZXJmYWNlIEdQQkFwaSA6IEdQQk1lc3NhZ2UKLQotLy8vIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBvZiB0aGlzIGFwaSwgaW5jbHVkaW5nIHBhY2thZ2UgbmFtZQotLy8vIGZvbGxvd2VkIGJ5IHRoZSBhcGkncyBzaW1wbGUgbmFtZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqbmFtZTsKLQotLy8vIFRoZSBtZXRob2RzIG9mIHRoaXMgYXBpLCBpbiB1bnNwZWNpZmllZCBvcmRlci4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nLCBudWxsX3Jlc2V0dGFibGUpIE5TTXV0YWJsZUFycmF5PEdQQk1ldGhvZCo+ICptZXRob2RzQXJyYXk7Ci0vLy8gVGhlIG51bWJlciBvZiBpdGVtcyBpbiBAYyBtZXRob2RzQXJyYXkgd2l0aG91dCBjYXVzaW5nIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgbWV0aG9kc0FycmF5X0NvdW50OwotCi0vLy8gQW55IG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZSBBUEkuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBOU011dGFibGVBcnJheTxHUEJPcHRpb24qPiAqb3B0aW9uc0FycmF5OwotLy8vIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gQGMgb3B0aW9uc0FycmF5IHdpdGhvdXQgY2F1c2luZyB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIG9wdGlvbnNBcnJheV9Db3VudDsKLQotLy8vIEEgdmVyc2lvbiBzdHJpbmcgZm9yIHRoaXMgYXBpLiBJZiBzcGVjaWZpZWQsIG11c3QgaGF2ZSB0aGUgZm9ybQotLy8vIGBtYWpvci12ZXJzaW9uLm1pbm9yLXZlcnNpb25gLCBhcyBpbiBgMS4xMGAuIElmIHRoZSBtaW5vciB2ZXJzaW9uCi0vLy8gaXMgb21pdHRlZCwgaXQgZGVmYXVsdHMgdG8gemVyby4gSWYgdGhlIGVudGlyZSB2ZXJzaW9uIGZpZWxkIGlzCi0vLy8gZW1wdHksIHRoZSBtYWpvciB2ZXJzaW9uIGlzIGRlcml2ZWQgZnJvbSB0aGUgcGFja2FnZSBuYW1lLCBhcwotLy8vIG91dGxpbmVkIGJlbG93LiBJZiB0aGUgZmllbGQgaXMgbm90IGVtcHR5LCB0aGUgdmVyc2lvbiBpbiB0aGUKLS8vLyBwYWNrYWdlIG5hbWUgd2lsbCBiZSB2ZXJpZmllZCB0byBiZSBjb25zaXN0ZW50IHdpdGggd2hhdCBpcwotLy8vIHByb3ZpZGVkIGhlcmUuCi0vLy8KLS8vLyBUaGUgdmVyc2lvbmluZyBzY2hlbWEgdXNlcyBbc2VtYW50aWMKLS8vLyB2ZXJzaW9uaW5nXShodHRwOi8vc2VtdmVyLm9yZykgd2hlcmUgdGhlIG1ham9yIHZlcnNpb24gbnVtYmVyCi0vLy8gaW5kaWNhdGVzIGEgYnJlYWtpbmcgY2hhbmdlIGFuZCB0aGUgbWlub3IgdmVyc2lvbiBhbiBhZGRpdGl2ZSwKLS8vLyBub24tYnJlYWtpbmcgY2hhbmdlLiBCb3RoIHZlcnNpb24gbnVtYmVycyBhcmUgc2lnbmFscyB0byB1c2VycwotLy8vIHdoYXQgdG8gZXhwZWN0IGZyb20gZGlmZmVyZW50IHZlcnNpb25zLCBhbmQgc2hvdWxkIGJlIGNhcmVmdWxseQotLy8vIGNob3NlbiBiYXNlZCBvbiB0aGUgcHJvZHVjdCBwbGFuLgotLy8vCi0vLy8gVGhlIG1ham9yIHZlcnNpb24gaXMgYWxzbyByZWZsZWN0ZWQgaW4gdGhlIHBhY2thZ2UgbmFtZSBvZiB0aGUKLS8vLyBBUEksIHdoaWNoIG11c3QgZW5kIGluIGB2PG1ham9yLXZlcnNpb24+YCwgYXMgaW4KLS8vLyBgZ29vZ2xlLmZlYXR1cmUudjFgLiBGb3IgbWFqb3IgdmVyc2lvbnMgMCBhbmQgMSwgdGhlIHN1ZmZpeCBjYW4KLS8vLyBiZSBvbWl0dGVkLiBaZXJvIG1ham9yIHZlcnNpb25zIG11c3Qgb25seSBiZSB1c2VkIGZvcgotLy8vIGV4cGVyaW1lbnRhbCwgbm9uZS1HQSBhcGlzLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICp2ZXJzaW9uOwotCi0vLy8gU291cmNlIGNvbnRleHQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgc2VydmljZSByZXByZXNlbnRlZCBieSB0aGlzCi0vLy8gbWVzc2FnZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nLCBudWxsX3Jlc2V0dGFibGUpIEdQQlNvdXJjZUNvbnRleHQgKnNvdXJjZUNvbnRleHQ7Ci0vLy8gVGVzdCB0byBzZWUgaWYgQGMgc291cmNlQ29udGV4dCBoYXMgYmVlbiBzZXQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIEJPT0wgaGFzU291cmNlQ29udGV4dDsKLQotLy8vIEluY2x1ZGVkIEFQSXMuIFNlZSBbTWl4aW5dW10uCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBOU011dGFibGVBcnJheTxHUEJNaXhpbio+ICptaXhpbnNBcnJheTsKLS8vLyBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIEBjIG1peGluc0FycmF5IHdpdGhvdXQgY2F1c2luZyB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIG1peGluc0FycmF5X0NvdW50OwotCi0vLy8gVGhlIHNvdXJjZSBzeW50YXggb2YgdGhlIHNlcnZpY2UuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIGVudW0gR1BCU3ludGF4IHN5bnRheDsKLQotQGVuZAotCi0vLy8gRmV0Y2hlcyB0aGUgcmF3IHZhbHVlIG9mIGEgQGMgR1BCQXBpJ3MgQGMgc3ludGF4IHByb3BlcnR5LCBldmVuCi0vLy8gaWYgdGhlIHZhbHVlIHdhcyBub3QgZGVmaW5lZCBieSB0aGUgZW51bSBhdCB0aGUgdGltZSB0aGUgY29kZSB3YXMgZ2VuZXJhdGVkLgotaW50MzJfdCBHUEJBcGlfU3ludGF4X1Jhd1ZhbHVlKEdQQkFwaSAqbWVzc2FnZSk7Ci0vLy8gU2V0cyB0aGUgcmF3IHZhbHVlIG9mIGFuIEBjIEdQQkFwaSdzIEBjIHN5bnRheCBwcm9wZXJ0eSwgYWxsb3dpbmcKLS8vLyBpdCB0byBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IHdhcyBub3QgZGVmaW5lZCBieSB0aGUgZW51bSBhdCB0aGUgdGltZSB0aGUgY29kZQotLy8vIHdhcyBnZW5lcmF0ZWQuCi12b2lkIFNldEdQQkFwaV9TeW50YXhfUmF3VmFsdWUoR1BCQXBpICptZXNzYWdlLCBpbnQzMl90IHZhbHVlKTsKLQotI3ByYWdtYSBtYXJrIC0gR1BCTWV0aG9kCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCTWV0aG9kX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQk1ldGhvZF9GaWVsZE51bWJlcl9OYW1lID0gMSwKLSAgR1BCTWV0aG9kX0ZpZWxkTnVtYmVyX1JlcXVlc3RUeXBlVVJMID0gMiwKLSAgR1BCTWV0aG9kX0ZpZWxkTnVtYmVyX1JlcXVlc3RTdHJlYW1pbmcgPSAzLAotICBHUEJNZXRob2RfRmllbGROdW1iZXJfUmVzcG9uc2VUeXBlVVJMID0gNCwKLSAgR1BCTWV0aG9kX0ZpZWxkTnVtYmVyX1Jlc3BvbnNlU3RyZWFtaW5nID0gNSwKLSAgR1BCTWV0aG9kX0ZpZWxkTnVtYmVyX09wdGlvbnNBcnJheSA9IDYsCi0gIEdQQk1ldGhvZF9GaWVsZE51bWJlcl9TeW50YXggPSA3LAotfTsKLQotLy8vIE1ldGhvZCByZXByZXNlbnRzIGEgbWV0aG9kIG9mIGFuIGFwaS4KLUBpbnRlcmZhY2UgR1BCTWV0aG9kIDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIHNpbXBsZSBuYW1lIG9mIHRoaXMgbWV0aG9kLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICpuYW1lOwotCi0vLy8gQSBVUkwgb2YgdGhlIGlucHV0IG1lc3NhZ2UgdHlwZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqcmVxdWVzdFR5cGVVUkw7Ci0KLS8vLyBJZiB0cnVlLCB0aGUgcmVxdWVzdCBpcyBzdHJlYW1lZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgQk9PTCByZXF1ZXN0U3RyZWFtaW5nOwotCi0vLy8gVGhlIFVSTCBvZiB0aGUgb3V0cHV0IG1lc3NhZ2UgdHlwZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqcmVzcG9uc2VUeXBlVVJMOwotCi0vLy8gSWYgdHJ1ZSwgdGhlIHJlc3BvbnNlIGlzIHN0cmVhbWVkLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBCT09MIHJlc3BvbnNlU3RyZWFtaW5nOwotCi0vLy8gQW55IG1ldGFkYXRhIGF0dGFjaGVkIHRvIHRoZSBtZXRob2QuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBOU011dGFibGVBcnJheTxHUEJPcHRpb24qPiAqb3B0aW9uc0FycmF5OwotLy8vIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gQGMgb3B0aW9uc0FycmF5IHdpdGhvdXQgY2F1c2luZyB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIG9wdGlvbnNBcnJheV9Db3VudDsKLQotLy8vIFRoZSBzb3VyY2Ugc3ludGF4IG9mIHRoaXMgbWV0aG9kLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBlbnVtIEdQQlN5bnRheCBzeW50YXg7Ci0KLUBlbmQKLQotLy8vIEZldGNoZXMgdGhlIHJhdyB2YWx1ZSBvZiBhIEBjIEdQQk1ldGhvZCdzIEBjIHN5bnRheCBwcm9wZXJ0eSwgZXZlbgotLy8vIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUgd2FzIGdlbmVyYXRlZC4KLWludDMyX3QgR1BCTWV0aG9kX1N5bnRheF9SYXdWYWx1ZShHUEJNZXRob2QgKm1lc3NhZ2UpOwotLy8vIFNldHMgdGhlIHJhdyB2YWx1ZSBvZiBhbiBAYyBHUEJNZXRob2QncyBAYyBzeW50YXggcHJvcGVydHksIGFsbG93aW5nCi0vLy8gaXQgdG8gYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUKLS8vLyB3YXMgZ2VuZXJhdGVkLgotdm9pZCBTZXRHUEJNZXRob2RfU3ludGF4X1Jhd1ZhbHVlKEdQQk1ldGhvZCAqbWVzc2FnZSwgaW50MzJfdCB2YWx1ZSk7Ci0KLSNwcmFnbWEgbWFyayAtIEdQQk1peGluCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCTWl4aW5fRmllbGROdW1iZXIpIHsKLSAgR1BCTWl4aW5fRmllbGROdW1iZXJfTmFtZSA9IDEsCi0gIEdQQk1peGluX0ZpZWxkTnVtYmVyX1Jvb3QgPSAyLAotfTsKLQotLy8vIERlY2xhcmVzIGFuIEFQSSB0byBiZSBpbmNsdWRlZCBpbiB0aGlzIEFQSS4gVGhlIGluY2x1ZGluZyBBUEkgbXVzdAotLy8vIHJlZGVjbGFyZSBhbGwgdGhlIG1ldGhvZHMgZnJvbSB0aGUgaW5jbHVkZWQgQVBJLCBidXQgZG9jdW1lbnRhdGlvbgotLy8vIGFuZCBvcHRpb25zIGFyZSBpbmhlcml0ZWQgYXMgZm9sbG93czoKLS8vLwotLy8vIC0gSWYgYWZ0ZXIgY29tbWVudCBhbmQgd2hpdGVzcGFjZSBzdHJpcHBpbmcsIHRoZSBkb2N1bWVudGF0aW9uCi0vLy8gICBzdHJpbmcgb2YgdGhlIHJlZGVjbGFyZWQgbWV0aG9kIGlzIGVtcHR5LCBpdCB3aWxsIGJlIGluaGVyaXRlZAotLy8vICAgZnJvbSB0aGUgb3JpZ2luYWwgbWV0aG9kLgotLy8vCi0vLy8gLSBFYWNoIGFubm90YXRpb24gYmVsb25naW5nIHRvIHRoZSBzZXJ2aWNlIGNvbmZpZyAoaHR0cCwKLS8vLyAgIHZpc2liaWxpdHkpIHdoaWNoIGlzIG5vdCBzZXQgaW4gdGhlIHJlZGVjbGFyZWQgbWV0aG9kIHdpbGwgYmUKLS8vLyAgIGluaGVyaXRlZC4KLS8vLwotLy8vIC0gSWYgYW4gaHR0cCBhbm5vdGF0aW9uIGlzIGluaGVyaXRlZCwgdGhlIHBhdGggcGF0dGVybiB3aWxsIGJlCi0vLy8gICBtb2RpZmllZCBhcyBmb2xsb3dzLiBBbnkgdmVyc2lvbiBwcmVmaXggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUKLS8vLyAgIHZlcnNpb24gb2YgdGhlIGluY2x1ZGluZyBBUEkgcGx1cyB0aGUgW3Jvb3RdW10gcGF0aCBpZiBzcGVjaWZpZWQuCi0vLy8KLS8vLyBFeGFtcGxlIG9mIGEgc2ltcGxlIG1peGluOgotLy8vCi0vLy8gICAgIHBhY2thZ2UgZ29vZ2xlLmFjbC52MTsKLS8vLyAgICAgc2VydmljZSBBY2Nlc3NDb250cm9sIHsKLS8vLyAgICAgICAvLyBHZXQgdGhlIHVuZGVybHlpbmcgQUNMIG9iamVjdC4KLS8vLyAgICAgICBycGMgR2V0QWNsKEdldEFjbFJlcXVlc3QpIHJldHVybnMgKEFjbCkgewotLy8vICAgICAgICAgb3B0aW9uIChnb29nbGUuYXBpLmh0dHApLmdldCA9ICIvdjEve3Jlc291cmNlPSoqfTpnZXRBY2wiOwotLy8vICAgICAgIH0KLS8vLyAgICAgfQotLy8vCi0vLy8gICAgIHBhY2thZ2UgZ29vZ2xlLnN0b3JhZ2UudjI7Ci0vLy8gICAgIHNlcnZpY2UgU3RvcmFnZSB7Ci0vLy8gICAgICAgcnBjIEdldEFjbChHZXRBY2xSZXF1ZXN0KSByZXR1cm5zIChBY2wpOwotLy8vCi0vLy8gICAgICAgLy8gR2V0IGEgZGF0YSByZWNvcmQuCi0vLy8gICAgICAgcnBjIEdldERhdGEoR2V0RGF0YVJlcXVlc3QpIHJldHVybnMgKERhdGEpIHsKLS8vLyAgICAgICAgIG9wdGlvbiAoZ29vZ2xlLmFwaS5odHRwKS5nZXQgPSAiL3YyL3tyZXNvdXJjZT0qKn0iOwotLy8vICAgICAgIH0KLS8vLyAgICAgfQotLy8vCi0vLy8gRXhhbXBsZSBvZiBhIG1peGluIGNvbmZpZ3VyYXRpb246Ci0vLy8KLS8vLyAgICAgYXBpczoKLS8vLyAgICAgLSBuYW1lOiBnb29nbGUuc3RvcmFnZS52Mi5TdG9yYWdlCi0vLy8gICAgICAgbWl4aW5zOgotLy8vICAgICAgIC0gbmFtZTogZ29vZ2xlLmFjbC52MS5BY2Nlc3NDb250cm9sCi0vLy8KLS8vLyBUaGUgbWl4aW4gY29uc3RydWN0IGltcGxpZXMgdGhhdCBhbGwgbWV0aG9kcyBpbiBgQWNjZXNzQ29udHJvbGAgYXJlCi0vLy8gYWxzbyBkZWNsYXJlZCB3aXRoIHNhbWUgbmFtZSBhbmQgcmVxdWVzdC9yZXNwb25zZSB0eXBlcyBpbgotLy8vIGBTdG9yYWdlYC4gQSBkb2N1bWVudGF0aW9uIGdlbmVyYXRvciBvciBhbm5vdGF0aW9uIHByb2Nlc3NvciB3aWxsCi0vLy8gc2VlIHRoZSBlZmZlY3RpdmUgYFN0b3JhZ2UuR2V0QWNsYCBtZXRob2QgYWZ0ZXIgaW5oZXJ0aW5nCi0vLy8gZG9jdW1lbnRhdGlvbiBhbmQgYW5ub3RhdGlvbnMgYXMgZm9sbG93czoKLS8vLwotLy8vICAgICBzZXJ2aWNlIFN0b3JhZ2UgewotLy8vICAgICAgIC8vIEdldCB0aGUgdW5kZXJseWluZyBBQ0wgb2JqZWN0LgotLy8vICAgICAgIHJwYyBHZXRBY2woR2V0QWNsUmVxdWVzdCkgcmV0dXJucyAoQWNsKSB7Ci0vLy8gICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92Mi97cmVzb3VyY2U9Kip9OmdldEFjbCI7Ci0vLy8gICAgICAgfQotLy8vICAgICAgIC4uLgotLy8vICAgICB9Ci0vLy8KLS8vLyBOb3RlIGhvdyB0aGUgdmVyc2lvbiBpbiB0aGUgcGF0aCBwYXR0ZXJuIGNoYW5nZWQgZnJvbSBgdjFgIHRvIGB2MmAuCi0vLy8KLS8vLyBJZiB0aGUgYHJvb3RgIGZpZWxkIGluIHRoZSBtaXhpbiBpcyBzcGVjaWZpZWQsIGl0IHNob3VsZCBiZSBhCi0vLy8gcmVsYXRpdmUgcGF0aCB1bmRlciB3aGljaCBpbmhlcml0ZWQgSFRUUCBwYXRocyBhcmUgcGxhY2VkLiBFeGFtcGxlOgotLy8vCi0vLy8gICAgIGFwaXM6Ci0vLy8gICAgIC0gbmFtZTogZ29vZ2xlLnN0b3JhZ2UudjIuU3RvcmFnZQotLy8vICAgICAgIG1peGluczoKLS8vLyAgICAgICAtIG5hbWU6IGdvb2dsZS5hY2wudjEuQWNjZXNzQ29udHJvbAotLy8vICAgICAgICAgcm9vdDogYWNscwotLy8vCi0vLy8gVGhpcyBpbXBsaWVzIHRoZSBmb2xsb3dpbmcgaW5oZXJpdGVkIEhUVFAgYW5ub3RhdGlvbjoKLS8vLwotLy8vICAgICBzZXJ2aWNlIFN0b3JhZ2UgewotLy8vICAgICAgIC8vIEdldCB0aGUgdW5kZXJseWluZyBBQ0wgb2JqZWN0LgotLy8vICAgICAgIHJwYyBHZXRBY2woR2V0QWNsUmVxdWVzdCkgcmV0dXJucyAoQWNsKSB7Ci0vLy8gICAgICAgICBvcHRpb24gKGdvb2dsZS5hcGkuaHR0cCkuZ2V0ID0gIi92Mi9hY2xzL3tyZXNvdXJjZT0qKn06Z2V0QWNsIjsKLS8vLyAgICAgICB9Ci0vLy8gICAgICAgLi4uCi0vLy8gICAgIH0KLUBpbnRlcmZhY2UgR1BCTWl4aW4gOiBHUEJNZXNzYWdlCi0KLS8vLyBUaGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIEFQSSB3aGljaCBpcyBpbmNsdWRlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqbmFtZTsKLQotLy8vIElmIG5vbi1lbXB0eSBzcGVjaWZpZXMgYSBwYXRoIHVuZGVyIHdoaWNoIGluaGVyaXRlZCBIVFRQIHBhdGhzCi0vLy8gYXJlIHJvb3RlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqcm9vdDsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKLQotQ0ZfRVhURVJOX0NfRU5ECi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0FwaS5wYm9iamMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0FwaS5wYm9iamMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDVhMDZlNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9BcGkucGJvYmpjLm0KKysrIC9kZXYvbnVsbApAQCAtMSwzNDggKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnNfUnVudGltZVN1cHBvcnQuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9BcGkucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvU291cmNlQ29udGV4dC5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9UeXBlLnBib2JqYy5oIgotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotI3ByYWdtYSBtYXJrIC0gR1BCQXBpUm9vdAotCi1AaW1wbGVtZW50YXRpb24gR1BCQXBpUm9vdAotCi0rIChHUEJFeHRlbnNpb25SZWdpc3RyeSopZXh0ZW5zaW9uUmVnaXN0cnkgewotICAvLyBUaGlzIGlzIGNhbGxlZCBieSAraW5pdGlhbGl6ZSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IHRocmVhZCBzYWZldHkgYW5kIGluaXRpYWxpemF0aW9uIG9mIHJlZ2lzdHJ5LgotICBzdGF0aWMgR1BCRXh0ZW5zaW9uUmVnaXN0cnkqIHJlZ2lzdHJ5ID0gbmlsOwotICBpZiAoIXJlZ2lzdHJ5KSB7Ci0gICAgR1BCRGVidWdDaGVja1J1bnRpbWVWZXJzaW9uKCk7Ci0gICAgcmVnaXN0cnkgPSBbW0dQQkV4dGVuc2lvblJlZ2lzdHJ5IGFsbG9jXSBpbml0XTsKLSAgICBbcmVnaXN0cnkgYWRkRXh0ZW5zaW9uczpbR1BCU291cmNlQ29udGV4dFJvb3QgZXh0ZW5zaW9uUmVnaXN0cnldXTsKLSAgICBbcmVnaXN0cnkgYWRkRXh0ZW5zaW9uczpbR1BCVHlwZVJvb3QgZXh0ZW5zaW9uUmVnaXN0cnldXTsKLSAgfQotICByZXR1cm4gcmVnaXN0cnk7Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCQXBpUm9vdF9GaWxlRGVzY3JpcHRvcgotCi1zdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKkdQQkFwaVJvb3RfRmlsZURlc2NyaXB0b3Iodm9pZCkgewotICAvLyBUaGlzIGlzIGNhbGxlZCBieSAraW5pdGlhbGl6ZSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IHRocmVhZCBzYWZldHkgb2YgdGhlIHNpbmdsZXRvbi4KLSAgc3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgR1BCRGVidWdDaGVja1J1bnRpbWVWZXJzaW9uKCk7Ci0gICAgZGVzY3JpcHRvciA9IFtbR1BCRmlsZURlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoUGFja2FnZTpAImdvb2dsZS5wcm90b2J1ZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OkdQQkZpbGVTeW50YXhQcm90bzNdOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi0jcHJhZ21hIG1hcmsgLSBHUEJBcGkKLQotQGltcGxlbWVudGF0aW9uIEdQQkFwaQotCi1AZHluYW1pYyBuYW1lOwotQGR5bmFtaWMgbWV0aG9kc0FycmF5LCBtZXRob2RzQXJyYXlfQ291bnQ7Ci1AZHluYW1pYyBvcHRpb25zQXJyYXksIG9wdGlvbnNBcnJheV9Db3VudDsKLUBkeW5hbWljIHZlcnNpb247Ci1AZHluYW1pYyBoYXNTb3VyY2VDb250ZXh0LCBzb3VyY2VDb250ZXh0OwotQGR5bmFtaWMgbWl4aW5zQXJyYXksIG1peGluc0FycmF5X0NvdW50OwotQGR5bmFtaWMgc3ludGF4OwotCi10eXBlZGVmIHN0cnVjdCBHUEJBcGlfX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLSAgR1BCU3ludGF4IHN5bnRheDsKLSAgTlNTdHJpbmcgKm5hbWU7Ci0gIE5TTXV0YWJsZUFycmF5ICptZXRob2RzQXJyYXk7Ci0gIE5TTXV0YWJsZUFycmF5ICpvcHRpb25zQXJyYXk7Ci0gIE5TU3RyaW5nICp2ZXJzaW9uOwotICBHUEJTb3VyY2VDb250ZXh0ICpzb3VyY2VDb250ZXh0OwotICBOU011dGFibGVBcnJheSAqbWl4aW5zQXJyYXk7Ci19IEdQQkFwaV9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAibmFtZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJBcGlfRmllbGROdW1iZXJfTmFtZSwKLSAgICAgICAgLmhhc0luZGV4ID0gMCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJBcGlfX3N0b3JhZ2VfLCBuYW1lKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJtZXRob2RzQXJyYXkiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBHUEJTdHJpbmdpZnlTeW1ib2woR1BCTWV0aG9kKSwKLSAgICAgICAgLm51bWJlciA9IEdQQkFwaV9GaWVsZE51bWJlcl9NZXRob2RzQXJyYXksCi0gICAgICAgIC5oYXNJbmRleCA9IEdQQk5vSGFzQml0LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkFwaV9fc3RvcmFnZV8sIG1ldGhvZHNBcnJheSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkUmVwZWF0ZWQsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlTWVzc2FnZSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm9wdGlvbnNBcnJheSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IEdQQlN0cmluZ2lmeVN5bWJvbChHUEJPcHRpb24pLAotICAgICAgICAubnVtYmVyID0gR1BCQXBpX0ZpZWxkTnVtYmVyX09wdGlvbnNBcnJheSwKLSAgICAgICAgLmhhc0luZGV4ID0gR1BCTm9IYXNCaXQsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCQXBpX19zdG9yYWdlXywgb3B0aW9uc0FycmF5KSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRSZXBlYXRlZCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVNZXNzYWdlLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAidmVyc2lvbiIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJBcGlfRmllbGROdW1iZXJfVmVyc2lvbiwKLSAgICAgICAgLmhhc0luZGV4ID0gMSwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJBcGlfX3N0b3JhZ2VfLCB2ZXJzaW9uKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJzb3VyY2VDb250ZXh0IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQlNvdXJjZUNvbnRleHQpLAotICAgICAgICAubnVtYmVyID0gR1BCQXBpX0ZpZWxkTnVtYmVyX1NvdXJjZUNvbnRleHQsCi0gICAgICAgIC5oYXNJbmRleCA9IDIsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCQXBpX19zdG9yYWdlXywgc291cmNlQ29udGV4dCksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlTWVzc2FnZSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm1peGluc0FycmF5IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQk1peGluKSwKLSAgICAgICAgLm51bWJlciA9IEdQQkFwaV9GaWVsZE51bWJlcl9NaXhpbnNBcnJheSwKLSAgICAgICAgLmhhc0luZGV4ID0gR1BCTm9IYXNCaXQsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCQXBpX19zdG9yYWdlXywgbWl4aW5zQXJyYXkpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZFJlcGVhdGVkLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJzeW50YXgiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5lbnVtRGVzY0Z1bmMgPSBHUEJTeW50YXhfRW51bURlc2NyaXB0b3IsCi0gICAgICAgIC5udW1iZXIgPSBHUEJBcGlfRmllbGROdW1iZXJfU3ludGF4LAotICAgICAgICAuaGFzSW5kZXggPSAzLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkFwaV9fc3RvcmFnZV8sIHN5bnRheCksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwgfCBHUEJGaWVsZEhhc0VudW1EZXNjcmlwdG9yLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUVudW0sCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQkFwaSBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQkFwaVJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQkFwaVJvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJBcGlfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotaW50MzJfdCBHUEJBcGlfU3ludGF4X1Jhd1ZhbHVlKEdQQkFwaSAqbWVzc2FnZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQkFwaSBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpHUEJBcGlfRmllbGROdW1iZXJfU3ludGF4XTsKLSAgcmV0dXJuIEdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKLX0KLQotdm9pZCBTZXRHUEJBcGlfU3ludGF4X1Jhd1ZhbHVlKEdQQkFwaSAqbWVzc2FnZSwgaW50MzJfdCB2YWx1ZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQkFwaSBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpHUEJBcGlfRmllbGROdW1iZXJfU3ludGF4XTsKLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLCBkZXNjcmlwdG9yLmZpbGUuc3ludGF4KTsKLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCTWV0aG9kCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJNZXRob2QKLQotQGR5bmFtaWMgbmFtZTsKLUBkeW5hbWljIHJlcXVlc3RUeXBlVVJMOwotQGR5bmFtaWMgcmVxdWVzdFN0cmVhbWluZzsKLUBkeW5hbWljIHJlc3BvbnNlVHlwZVVSTDsKLUBkeW5hbWljIHJlc3BvbnNlU3RyZWFtaW5nOwotQGR5bmFtaWMgb3B0aW9uc0FycmF5LCBvcHRpb25zQXJyYXlfQ291bnQ7Ci1AZHluYW1pYyBzeW50YXg7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQk1ldGhvZF9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBHUEJTeW50YXggc3ludGF4OwotICBOU1N0cmluZyAqbmFtZTsKLSAgTlNTdHJpbmcgKnJlcXVlc3RUeXBlVVJMOwotICBOU1N0cmluZyAqcmVzcG9uc2VUeXBlVVJMOwotICBOU011dGFibGVBcnJheSAqb3B0aW9uc0FycmF5OwotfSBHUEJNZXRob2RfX3N0b3JhZ2VfOwotCi0vLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWRzYWZlIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGx5IGNhbGxlZAotLy8gaW4gK2luaXRpYWxpemUgZm9yIGVhY2ggc3ViY2xhc3MuCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7Ci0gIHN0YXRpYyBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gbmlsOwotICBpZiAoIWRlc2NyaXB0b3IpIHsKLSAgICBzdGF0aWMgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gZmllbGRzW10gPSB7Ci0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm5hbWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCTWV0aG9kX0ZpZWxkTnVtYmVyX05hbWUsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCTWV0aG9kX19zdG9yYWdlXywgbmFtZSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlU3RyaW5nLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAicmVxdWVzdFR5cGVVUkwiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCTWV0aG9kX0ZpZWxkTnVtYmVyX1JlcXVlc3RUeXBlVVJMLAotICAgICAgICAuaGFzSW5kZXggPSAxLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQk1ldGhvZF9fc3RvcmFnZV8sIHJlcXVlc3RUeXBlVVJMKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCB8IEdQQkZpZWxkVGV4dEZvcm1hdE5hbWVDdXN0b20sCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlU3RyaW5nLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAicmVxdWVzdFN0cmVhbWluZyIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJNZXRob2RfRmllbGROdW1iZXJfUmVxdWVzdFN0cmVhbWluZywKLSAgICAgICAgLmhhc0luZGV4ID0gMiwKLSAgICAgICAgLm9mZnNldCA9IDMsICAvLyBTdG9yZWQgaW4gX2hhc19zdG9yYWdlXyB0byBzYXZlIHNwYWNlLgotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUJvb2wsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJyZXNwb25zZVR5cGVVUkwiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCTWV0aG9kX0ZpZWxkTnVtYmVyX1Jlc3BvbnNlVHlwZVVSTCwKLSAgICAgICAgLmhhc0luZGV4ID0gNCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJNZXRob2RfX3N0b3JhZ2VfLCByZXNwb25zZVR5cGVVUkwpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsIHwgR1BCRmllbGRUZXh0Rm9ybWF0TmFtZUN1c3RvbSwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJyZXNwb25zZVN0cmVhbWluZyIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJNZXRob2RfRmllbGROdW1iZXJfUmVzcG9uc2VTdHJlYW1pbmcsCi0gICAgICAgIC5oYXNJbmRleCA9IDUsCi0gICAgICAgIC5vZmZzZXQgPSA2LCAgLy8gU3RvcmVkIGluIF9oYXNfc3RvcmFnZV8gdG8gc2F2ZSBzcGFjZS4KLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVCb29sLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAib3B0aW9uc0FycmF5IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQk9wdGlvbiksCi0gICAgICAgIC5udW1iZXIgPSBHUEJNZXRob2RfRmllbGROdW1iZXJfT3B0aW9uc0FycmF5LAotICAgICAgICAuaGFzSW5kZXggPSBHUEJOb0hhc0JpdCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJNZXRob2RfX3N0b3JhZ2VfLCBvcHRpb25zQXJyYXkpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZFJlcGVhdGVkLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJzeW50YXgiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5lbnVtRGVzY0Z1bmMgPSBHUEJTeW50YXhfRW51bURlc2NyaXB0b3IsCi0gICAgICAgIC5udW1iZXIgPSBHUEJNZXRob2RfRmllbGROdW1iZXJfU3ludGF4LAotICAgICAgICAuaGFzSW5kZXggPSA3LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQk1ldGhvZF9fc3RvcmFnZV8sIHN5bnRheCksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwgfCBHUEJGaWVsZEhhc0VudW1EZXNjcmlwdG9yLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUVudW0sCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQk1ldGhvZCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQkFwaVJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQkFwaVJvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJNZXRob2RfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSNpZiAhR1BCT0JKQ19TS0lQX01FU1NBR0VfVEVYVEZPUk1BVF9FWFRSQVMKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqZXh0cmFUZXh0Rm9ybWF0SW5mbyA9Ci0gICAgICAgICJcMDAyXDAwMlwwMDdcMjQ0XDI0MSEhXDAwMFwwMDRcMDEwXDI0NFwyNDEhIVwwMDAiOwotICAgIFtsb2NhbERlc2NyaXB0b3Igc2V0dXBFeHRyYVRleHRJbmZvOmV4dHJhVGV4dEZvcm1hdEluZm9dOwotI2VuZGlmICAvLyAhR1BCT0JKQ19TS0lQX01FU1NBR0VfVEVYVEZPUk1BVF9FWFRSQVMKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotaW50MzJfdCBHUEJNZXRob2RfU3ludGF4X1Jhd1ZhbHVlKEdQQk1ldGhvZCAqbWVzc2FnZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQk1ldGhvZCBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpHUEJNZXRob2RfRmllbGROdW1iZXJfU3ludGF4XTsKLSAgcmV0dXJuIEdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKLX0KLQotdm9pZCBTZXRHUEJNZXRob2RfU3ludGF4X1Jhd1ZhbHVlKEdQQk1ldGhvZCAqbWVzc2FnZSwgaW50MzJfdCB2YWx1ZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQk1ldGhvZCBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpHUEJNZXRob2RfRmllbGROdW1iZXJfU3ludGF4XTsKLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLCBkZXNjcmlwdG9yLmZpbGUuc3ludGF4KTsKLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCTWl4aW4KLQotQGltcGxlbWVudGF0aW9uIEdQQk1peGluCi0KLUBkeW5hbWljIG5hbWU7Ci1AZHluYW1pYyByb290OwotCi10eXBlZGVmIHN0cnVjdCBHUEJNaXhpbl9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBOU1N0cmluZyAqbmFtZTsKLSAgTlNTdHJpbmcgKnJvb3Q7Ci19IEdQQk1peGluX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJuYW1lIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQk1peGluX0ZpZWxkTnVtYmVyX05hbWUsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCTWl4aW5fX3N0b3JhZ2VfLCBuYW1lKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJyb290IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQk1peGluX0ZpZWxkTnVtYmVyX1Jvb3QsCi0gICAgICAgIC5oYXNJbmRleCA9IDEsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCTWl4aW5fX3N0b3JhZ2VfLCByb290KSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQk1peGluIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCQXBpUm9vdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6R1BCQXBpUm9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQk1peGluX19zdG9yYWdlXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6MF07Ci0gICAgTlNBc3NlcnQoZGVzY3JpcHRvciA9PSBuaWwsIEAiU3RhcnR1cCByZWN1cnNlZCEiKTsKLSAgICBkZXNjcmlwdG9yID0gbG9jYWxEZXNjcmlwdG9yOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1AZW5kCi0KLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvRHVyYXRpb24ucGJvYmpjLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9EdXJhdGlvbi5wYm9iamMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjk4ODhkNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9EdXJhdGlvbi5wYm9iamMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KLQotI2ltcG9ydCAiR1BCUHJvdG9jb2xCdWZmZXJzLmgiCi0KLSNpZiBHT09HTEVfUFJPVE9CVUZfT0JKQ19HRU5fVkVSU0lPTiAhPSAzMDAwMQotI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgZGlmZmVyZW50IHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkgc291cmNlcy4KLSNlbmRpZgotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgotCi1DRl9FWFRFUk5fQ19CRUdJTgotCi1OU19BU1NVTUVfTk9OTlVMTF9CRUdJTgotCi0jcHJhZ21hIG1hcmsgLSBHUEJEdXJhdGlvblJvb3QKLQotLy8vIEV4cG9zZXMgdGhlIGV4dGVuc2lvbiByZWdpc3RyeSBmb3IgdGhpcyBmaWxlLgotLy8vCi0vLy8gVGhlIGJhc2UgY2xhc3MgcHJvdmlkZXM6Ci0vLy8gQGNvZGUKLS8vLyAgICsgKEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnk7Ci0vLy8gQGVuZGNvZGUKLS8vLyB3aGljaCBpcyBhIEBjIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBleHRlbnNpb25zIGRlZmluZWQgYnkKLS8vLyB0aGlzIGZpbGUgYW5kIGFsbCBmaWxlcyB0aGF0IGl0IGRlcGVuZHMgb24uCi1AaW50ZXJmYWNlIEdQQkR1cmF0aW9uUm9vdCA6IEdQQlJvb3RPYmplY3QKLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCRHVyYXRpb24KLQotdHlwZWRlZiBHUEJfRU5VTShHUEJEdXJhdGlvbl9GaWVsZE51bWJlcikgewotICBHUEJEdXJhdGlvbl9GaWVsZE51bWJlcl9TZWNvbmRzID0gMSwKLSAgR1BCRHVyYXRpb25fRmllbGROdW1iZXJfTmFub3MgPSAyLAotfTsKLQotLy8vIEEgRHVyYXRpb24gcmVwcmVzZW50cyBhIHNpZ25lZCwgZml4ZWQtbGVuZ3RoIHNwYW4gb2YgdGltZSByZXByZXNlbnRlZAotLy8vIGFzIGEgY291bnQgb2Ygc2Vjb25kcyBhbmQgZnJhY3Rpb25zIG9mIHNlY29uZHMgYXQgbmFub3NlY29uZAotLy8vIHJlc29sdXRpb24uIEl0IGlzIGluZGVwZW5kZW50IG9mIGFueSBjYWxlbmRhciBhbmQgY29uY2VwdHMgbGlrZSAiZGF5IgotLy8vIG9yICJtb250aCIuIEl0IGlzIHJlbGF0ZWQgdG8gVGltZXN0YW1wIGluIHRoYXQgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbgotLy8vIHR3byBUaW1lc3RhbXAgdmFsdWVzIGlzIGEgRHVyYXRpb24gYW5kIGl0IGNhbiBiZSBhZGRlZCBvciBzdWJ0cmFjdGVkCi0vLy8gZnJvbSBhIFRpbWVzdGFtcC4gUmFuZ2UgaXMgYXBwcm94aW1hdGVseSArLTEwLDAwMCB5ZWFycy4KLS8vLwotLy8vIEV4YW1wbGUgMTogQ29tcHV0ZSBEdXJhdGlvbiBmcm9tIHR3byBUaW1lc3RhbXBzIGluIHBzZXVkbyBjb2RlLgotLy8vCi0vLy8gICAgIFRpbWVzdGFtcCBzdGFydCA9IC4uLjsKLS8vLyAgICAgVGltZXN0YW1wIGVuZCA9IC4uLjsKLS8vLyAgICAgRHVyYXRpb24gZHVyYXRpb24gPSAuLi47Ci0vLy8KLS8vLyAgICAgZHVyYXRpb24uc2Vjb25kcyA9IGVuZC5zZWNvbmRzIC0gc3RhcnQuc2Vjb25kczsKLS8vLyAgICAgZHVyYXRpb24ubmFub3MgPSBlbmQubmFub3MgLSBzdGFydC5uYW5vczsKLS8vLwotLy8vICAgICBpZiAoZHVyYXRpb24uc2Vjb25kcyA8IDAgJiYgZHVyYXRpb24ubmFub3MgPiAwKSB7Ci0vLy8gICAgICAgZHVyYXRpb24uc2Vjb25kcyArPSAxOwotLy8vICAgICAgIGR1cmF0aW9uLm5hbm9zIC09IDEwMDAwMDAwMDA7Ci0vLy8gICAgIH0gZWxzZSBpZiAoZHVyYXRpb25zLnNlY29uZHMgPiAwICYmIGR1cmF0aW9uLm5hbm9zIDwgMCkgewotLy8vICAgICAgIGR1cmF0aW9uLnNlY29uZHMgLT0gMTsKLS8vLyAgICAgICBkdXJhdGlvbi5uYW5vcyArPSAxMDAwMDAwMDAwOwotLy8vICAgICB9Ci0vLy8KLS8vLyBFeGFtcGxlIDI6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gVGltZXN0YW1wICsgRHVyYXRpb24gaW4gcHNldWRvIGNvZGUuCi0vLy8KLS8vLyAgICAgVGltZXN0YW1wIHN0YXJ0ID0gLi4uOwotLy8vICAgICBEdXJhdGlvbiBkdXJhdGlvbiA9IC4uLjsKLS8vLyAgICAgVGltZXN0YW1wIGVuZCA9IC4uLjsKLS8vLwotLy8vICAgICBlbmQuc2Vjb25kcyA9IHN0YXJ0LnNlY29uZHMgKyBkdXJhdGlvbi5zZWNvbmRzOwotLy8vICAgICBlbmQubmFub3MgPSBzdGFydC5uYW5vcyArIGR1cmF0aW9uLm5hbm9zOwotLy8vCi0vLy8gICAgIGlmIChlbmQubmFub3MgPCAwKSB7Ci0vLy8gICAgICAgZW5kLnNlY29uZHMgLT0gMTsKLS8vLyAgICAgICBlbmQubmFub3MgKz0gMTAwMDAwMDAwMDsKLS8vLyAgICAgfSBlbHNlIGlmIChlbmQubmFub3MgPj0gMTAwMDAwMDAwMCkgewotLy8vICAgICAgIGVuZC5zZWNvbmRzICs9IDE7Ci0vLy8gICAgICAgZW5kLm5hbm9zIC09IDEwMDAwMDAwMDA7Ci0vLy8gICAgIH0KLUBpbnRlcmZhY2UgR1BCRHVyYXRpb24gOiBHUEJNZXNzYWdlCi0KLS8vLyBTaWduZWQgc2Vjb25kcyBvZiB0aGUgc3BhbiBvZiB0aW1lLiBNdXN0IGJlIGZyb20gLTMxNSw1NzYsMDAwLDAwMAotLy8vIHRvICszMTUsNTc2LDAwMCwwMDAgaW5jbHVzaXZlLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBpbnQ2NF90IHNlY29uZHM7Ci0KLS8vLyBTaWduZWQgZnJhY3Rpb25zIG9mIGEgc2Vjb25kIGF0IG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBvZiB0aGUgc3BhbgotLy8vIG9mIHRpbWUuIER1cmF0aW9ucyBsZXNzIHRoYW4gb25lIHNlY29uZCBhcmUgcmVwcmVzZW50ZWQgd2l0aCBhIDAKLS8vLyBgc2Vjb25kc2AgZmllbGQgYW5kIGEgcG9zaXRpdmUgb3IgbmVnYXRpdmUgYG5hbm9zYCBmaWVsZC4gRm9yIGR1cmF0aW9ucwotLy8vIG9mIG9uZSBzZWNvbmQgb3IgbW9yZSwgYSBub24temVybyB2YWx1ZSBmb3IgdGhlIGBuYW5vc2AgZmllbGQgbXVzdCBiZQotLy8vIG9mIHRoZSBzYW1lIHNpZ24gYXMgdGhlIGBzZWNvbmRzYCBmaWVsZC4gTXVzdCBiZSBmcm9tIC05OTksOTk5LDk5OQotLy8vIHRvICs5OTksOTk5LDk5OSBpbmNsdXNpdmUuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIGludDMyX3QgbmFub3M7Ci0KLUBlbmQKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECi0KLUNGX0VYVEVSTl9DX0VORAotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9EdXJhdGlvbi5wYm9iamMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0R1cmF0aW9uLnBib2JqYy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGQ2YjY0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0R1cmF0aW9uLnBib2JqYy5tCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVyc19SdW50aW1lU3VwcG9ydC5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL0R1cmF0aW9uLnBib2JqYy5oIgotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotI3ByYWdtYSBtYXJrIC0gR1BCRHVyYXRpb25Sb290Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJEdXJhdGlvblJvb3QKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJEdXJhdGlvblJvb3RfRmlsZURlc2NyaXB0b3IKLQotc3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICpHUEJEdXJhdGlvblJvb3RfRmlsZURlc2NyaXB0b3Iodm9pZCkgewotICAvLyBUaGlzIGlzIGNhbGxlZCBieSAraW5pdGlhbGl6ZSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IHRocmVhZCBzYWZldHkgb2YgdGhlIHNpbmdsZXRvbi4KLSAgc3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgR1BCRGVidWdDaGVja1J1bnRpbWVWZXJzaW9uKCk7Ci0gICAgZGVzY3JpcHRvciA9IFtbR1BCRmlsZURlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoUGFja2FnZTpAImdvb2dsZS5wcm90b2J1ZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OkdQQkZpbGVTeW50YXhQcm90bzNdOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi0jcHJhZ21hIG1hcmsgLSBHUEJEdXJhdGlvbgotCi1AaW1wbGVtZW50YXRpb24gR1BCRHVyYXRpb24KLQotQGR5bmFtaWMgc2Vjb25kczsKLUBkeW5hbWljIG5hbm9zOwotCi10eXBlZGVmIHN0cnVjdCBHUEJEdXJhdGlvbl9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBpbnQzMl90IG5hbm9zOwotICBpbnQ2NF90IHNlY29uZHM7Ci19IEdQQkR1cmF0aW9uX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJzZWNvbmRzIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQkR1cmF0aW9uX0ZpZWxkTnVtYmVyX1NlY29uZHMsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCRHVyYXRpb25fX3N0b3JhZ2VfLCBzZWNvbmRzKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVJbnQ2NCwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm5hbm9zIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQkR1cmF0aW9uX0ZpZWxkTnVtYmVyX05hbm9zLAotICAgICAgICAuaGFzSW5kZXggPSAxLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkR1cmF0aW9uX19zdG9yYWdlXywgbmFub3MpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUludDMyLAotICAgICAgfSwKLSAgICB9OwotICAgIEdQQkRlc2NyaXB0b3IgKmxvY2FsRGVzY3JpcHRvciA9Ci0gICAgICAgIFtHUEJEZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvckNsYXNzOltHUEJEdXJhdGlvbiBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQkR1cmF0aW9uUm9vdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6R1BCRHVyYXRpb25Sb290X0ZpbGVEZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvdW50Oih1aW50MzJfdCkoc2l6ZW9mKGZpZWxkcykgLyBzaXplb2YoR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTpzaXplb2YoR1BCRHVyYXRpb25fX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9FbXB0eS5wYm9iamMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0VtcHR5LnBib2JqYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMzNkYjAxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0VtcHR5LnBib2JqYy5oCisrKyAvZGV2L251bGwKQEAgLTEsNTMgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVycy5oIgotCi0jaWYgR09PR0xFX1BST1RPQlVGX09CSkNfR0VOX1ZFUlNJT04gIT0gMzAwMDEKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5IHNvdXJjZXMuCi0jZW5kaWYKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotQ0ZfRVhURVJOX0NfQkVHSU4KLQotTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KLQotI3ByYWdtYSBtYXJrIC0gR1BCRW1wdHlSb290Ci0KLS8vLyBFeHBvc2VzIHRoZSBleHRlbnNpb24gcmVnaXN0cnkgZm9yIHRoaXMgZmlsZS4KLS8vLwotLy8vIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzOgotLy8vIEBjb2RlCi0vLy8gICArIChHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5OwotLy8vIEBlbmRjb2RlCi0vLy8gd2hpY2ggaXMgYSBAYyBHUEJFeHRlbnNpb25SZWdpc3RyeSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgZXh0ZW5zaW9ucyBkZWZpbmVkIGJ5Ci0vLy8gdGhpcyBmaWxlIGFuZCBhbGwgZmlsZXMgdGhhdCBpdCBkZXBlbmRzIG9uLgotQGludGVyZmFjZSBHUEJFbXB0eVJvb3QgOiBHUEJSb290T2JqZWN0Ci1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQkVtcHR5Ci0KLS8vLyBBIGdlbmVyaWMgZW1wdHkgbWVzc2FnZSB0aGF0IHlvdSBjYW4gcmUtdXNlIHRvIGF2b2lkIGRlZmluaW5nIGR1cGxpY2F0ZWQKLS8vLyBlbXB0eSBtZXNzYWdlcyBpbiB5b3VyIEFQSXMuIEEgdHlwaWNhbCBleGFtcGxlIGlzIHRvIHVzZSBpdCBhcyB0aGUgcmVxdWVzdAotLy8vIG9yIHRoZSByZXNwb25zZSB0eXBlIG9mIGFuIEFQSSBtZXRob2QuIEZvciBpbnN0YW5jZToKLS8vLwotLy8vICAgICBzZXJ2aWNlIEZvbyB7Ci0vLy8gICAgICAgcnBjIEJhcihnb29nbGUucHJvdG9idWYuRW1wdHkpIHJldHVybnMgKGdvb2dsZS5wcm90b2J1Zi5FbXB0eSk7Ci0vLy8gICAgIH0KLS8vLwotLy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgRW1wdHlgIGlzIGVtcHR5IEpTT04gb2JqZWN0IGB7fWAuCi1AaW50ZXJmYWNlIEdQQkVtcHR5IDogR1BCTWVzc2FnZQotCi1AZW5kCi0KLU5TX0FTU1VNRV9OT05OVUxMX0VORAotCi1DRl9FWFRFUk5fQ19FTkQKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvRW1wdHkucGJvYmpjLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9FbXB0eS5wYm9iamMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg3NTNhYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9FbXB0eS5wYm9iamMubQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnNfUnVudGltZVN1cHBvcnQuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9FbXB0eS5wYm9iamMuaCIKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0KLSNwcmFnbWEgbWFyayAtIEdQQkVtcHR5Um9vdAotCi1AaW1wbGVtZW50YXRpb24gR1BCRW1wdHlSb290Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCRW1wdHlSb290X0ZpbGVEZXNjcmlwdG9yCi0KLXN0YXRpYyBHUEJGaWxlRGVzY3JpcHRvciAqR1BCRW1wdHlSb290X0ZpbGVEZXNjcmlwdG9yKHZvaWQpIHsKLSAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgK2luaXRpYWxpemUgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeQotICAvLyBhYm91dCB0aHJlYWQgc2FmZXR5IG9mIHRoZSBzaW5nbGV0b24uCi0gIHN0YXRpYyBHUEJGaWxlRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IE5VTEw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIEdQQkRlYnVnQ2hlY2tSdW50aW1lVmVyc2lvbigpOwotICAgIGRlc2NyaXB0b3IgPSBbW0dQQkZpbGVEZXNjcmlwdG9yIGFsbG9jXSBpbml0V2l0aFBhY2thZ2U6QCJnb29nbGUucHJvdG9idWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDpHUEJGaWxlU3ludGF4UHJvdG8zXTsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCRW1wdHkKLQotQGltcGxlbWVudGF0aW9uIEdQQkVtcHR5Ci0KLQotdHlwZWRlZiBzdHJ1Y3QgR1BCRW1wdHlfX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLX0gR1BCRW1wdHlfX3N0b3JhZ2VfOwotCi0vLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWRzYWZlIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGx5IGNhbGxlZAotLy8gaW4gK2luaXRpYWxpemUgZm9yIGVhY2ggc3ViY2xhc3MuCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7Ci0gIHN0YXRpYyBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gbmlsOwotICBpZiAoIWRlc2NyaXB0b3IpIHsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCRW1wdHkgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENsYXNzOltHUEJFbXB0eVJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQkVtcHR5Um9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOk5VTEwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6MAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTpzaXplb2YoR1BCRW1wdHlfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9GaWVsZE1hc2sucGJvYmpjLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9GaWVsZE1hc2sucGJvYmpjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDczY2JkOGEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvRmllbGRNYXNrLnBib2JqYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjAyICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVycy5oIgotCi0jaWYgR09PR0xFX1BST1RPQlVGX09CSkNfR0VOX1ZFUlNJT04gIT0gMzAwMDEKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5IHNvdXJjZXMuCi0jZW5kaWYKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotQ0ZfRVhURVJOX0NfQkVHSU4KLQotTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KLQotI3ByYWdtYSBtYXJrIC0gR1BCRmllbGRNYXNrUm9vdAotCi0vLy8gRXhwb3NlcyB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGZvciB0aGlzIGZpbGUuCi0vLy8KLS8vLyBUaGUgYmFzZSBjbGFzcyBwcm92aWRlczoKLS8vLyBAY29kZQotLy8vICAgKyAoR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeTsKLS8vLyBAZW5kY29kZQotLy8vIHdoaWNoIGlzIGEgQGMgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgdGhhdCBpbmNsdWRlcyBhbGwgdGhlIGV4dGVuc2lvbnMgZGVmaW5lZCBieQotLy8vIHRoaXMgZmlsZSBhbmQgYWxsIGZpbGVzIHRoYXQgaXQgZGVwZW5kcyBvbi4KLUBpbnRlcmZhY2UgR1BCRmllbGRNYXNrUm9vdCA6IEdQQlJvb3RPYmplY3QKLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCRmllbGRNYXNrCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCRmllbGRNYXNrX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQkZpZWxkTWFza19GaWVsZE51bWJlcl9QYXRoc0FycmF5ID0gMSwKLX07Ci0KLS8vLyBgRmllbGRNYXNrYCByZXByZXNlbnRzIGEgc2V0IG9mIHN5bWJvbGljIGZpZWxkIHBhdGhzLCBmb3IgZXhhbXBsZToKLS8vLwotLy8vICAgICBwYXRoczogImYuYSIKLS8vLyAgICAgcGF0aHM6ICJmLmIuZCIKLS8vLwotLy8vIEhlcmUgYGZgIHJlcHJlc2VudHMgYSBmaWVsZCBpbiBzb21lIHJvb3QgbWVzc2FnZSwgYGFgIGFuZCBgYmAKLS8vLyBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgZm91bmQgaW4gYGZgLCBhbmQgYGRgIGEgZmllbGQgZm91bmQgaW4gdGhlCi0vLy8gbWVzc2FnZSBpbiBgZi5iYC4KLS8vLwotLy8vIEZpZWxkIG1hc2tzIGFyZSB1c2VkIHRvIHNwZWNpZnkgYSBzdWJzZXQgb2YgZmllbGRzIHRoYXQgc2hvdWxkIGJlCi0vLy8gcmV0dXJuZWQgYnkgYSBnZXQgb3BlcmF0aW9uIG9yIG1vZGlmaWVkIGJ5IGFuIHVwZGF0ZSBvcGVyYXRpb24uCi0vLy8gRmllbGQgbWFza3MgYWxzbyBoYXZlIGEgY3VzdG9tIEpTT04gZW5jb2RpbmcgKHNlZSBiZWxvdykuCi0vLy8KLS8vLyAjIEZpZWxkIE1hc2tzIGluIFByb2plY3Rpb25zCi0vLy8KLS8vLyBXaGVuIHVzZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBwcm9qZWN0aW9uLCBhIHJlc3BvbnNlIG1lc3NhZ2Ugb3IKLS8vLyBzdWItbWVzc2FnZSBpcyBmaWx0ZXJlZCBieSB0aGUgQVBJIHRvIG9ubHkgY29udGFpbiB0aG9zZSBmaWVsZHMgYXMKLS8vLyBzcGVjaWZpZWQgaW4gdGhlIG1hc2suIEZvciBleGFtcGxlLCBpZiB0aGUgbWFzayBpbiB0aGUgcHJldmlvdXMKLS8vLyBleGFtcGxlIGlzIGFwcGxpZWQgdG8gYSByZXNwb25zZSBtZXNzYWdlIGFzIGZvbGxvd3M6Ci0vLy8KLS8vLyAgICAgZiB7Ci0vLy8gICAgICAgYSA6IDIyCi0vLy8gICAgICAgYiB7Ci0vLy8gICAgICAgICBkIDogMQotLy8vICAgICAgICAgeCA6IDIKLS8vLyAgICAgICB9Ci0vLy8gICAgICAgeSA6IDEzCi0vLy8gICAgIH0KLS8vLyAgICAgejogOAotLy8vCi0vLy8gVGhlIHJlc3VsdCB3aWxsIG5vdCBjb250YWluIHNwZWNpZmljIHZhbHVlcyBmb3IgZmllbGRzIHgseSBhbmQgegotLy8vICh0aGVpciB2YWx1ZSB3aWxsIGJlIHNldCB0byB0aGUgZGVmYXVsdCwgYW5kIG9taXR0ZWQgaW4gcHJvdG8gdGV4dAotLy8vIG91dHB1dCk6Ci0vLy8KLS8vLwotLy8vICAgICBmIHsKLS8vLyAgICAgICBhIDogMjIKLS8vLyAgICAgICBiIHsKLS8vLyAgICAgICAgIGQgOiAxCi0vLy8gICAgICAgfQotLy8vICAgICB9Ci0vLy8KLS8vLyBBIHJlcGVhdGVkIGZpZWxkIGlzIG5vdCBhbGxvd2VkIGV4Y2VwdCBhdCB0aGUgbGFzdCBwb3NpdGlvbiBvZiBhCi0vLy8gZmllbGQgbWFzay4KLS8vLwotLy8vIElmIGEgRmllbGRNYXNrIG9iamVjdCBpcyBub3QgcHJlc2VudCBpbiBhIGdldCBvcGVyYXRpb24sIHRoZQotLy8vIG9wZXJhdGlvbiBhcHBsaWVzIHRvIGFsbCBmaWVsZHMgKGFzIGlmIGEgRmllbGRNYXNrIG9mIGFsbCBmaWVsZHMKLS8vLyBoYWQgYmVlbiBzcGVjaWZpZWQpLgotLy8vCi0vLy8gTm90ZSB0aGF0IGEgZmllbGQgbWFzayBkb2VzIG5vdCBuZWNlc3NhcmlseSBhcHBseSB0byB0aGUKLS8vLyB0b3AtbGV2ZWwgcmVzcG9uc2UgbWVzc2FnZS4gSW4gY2FzZSBvZiBhIFJFU1QgZ2V0IG9wZXJhdGlvbiwgdGhlCi0vLy8gZmllbGQgbWFzayBhcHBsaWVzIGRpcmVjdGx5IHRvIHRoZSByZXNwb25zZSwgYnV0IGluIGNhc2Ugb2YgYSBSRVNUCi0vLy8gbGlzdCBvcGVyYXRpb24sIHRoZSBtYXNrIGluc3RlYWQgYXBwbGllcyB0byBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZQotLy8vIGluIHRoZSByZXR1cm5lZCByZXNvdXJjZSBsaXN0LiBJbiBjYXNlIG9mIGEgUkVTVCBjdXN0b20gbWV0aG9kLAotLy8vIG90aGVyIGRlZmluaXRpb25zIG1heSBiZSB1c2VkLiBXaGVyZSB0aGUgbWFzayBhcHBsaWVzIHdpbGwgYmUKLS8vLyBjbGVhcmx5IGRvY3VtZW50ZWQgdG9nZXRoZXIgd2l0aCBpdHMgZGVjbGFyYXRpb24gaW4gdGhlIEFQSS4gIEluCi0vLy8gYW55IGNhc2UsIHRoZSBlZmZlY3Qgb24gdGhlIHJldHVybmVkIHJlc291cmNlL3Jlc291cmNlcyBpcyByZXF1aXJlZAotLy8vIGJlaGF2aW9yIGZvciBBUElzLgotLy8vCi0vLy8gIyBGaWVsZCBNYXNrcyBpbiBVcGRhdGUgT3BlcmF0aW9ucwotLy8vCi0vLy8gQSBmaWVsZCBtYXNrIGluIHVwZGF0ZSBvcGVyYXRpb25zIHNwZWNpZmllcyB3aGljaCBmaWVsZHMgb2YgdGhlCi0vLy8gdGFyZ2V0ZWQgcmVzb3VyY2UgYXJlIGdvaW5nIHRvIGJlIHVwZGF0ZWQuIFRoZSBBUEkgaXMgcmVxdWlyZWQKLS8vLyB0byBvbmx5IGNoYW5nZSB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZHMgYXMgc3BlY2lmaWVkIGluIHRoZSBtYXNrCi0vLy8gYW5kIGxlYXZlIHRoZSBvdGhlcnMgdW50b3VjaGVkLiBJZiBhIHJlc291cmNlIGlzIHBhc3NlZCBpbiB0bwotLy8vIGRlc2NyaWJlIHRoZSB1cGRhdGVkIHZhbHVlcywgdGhlIEFQSSBpZ25vcmVzIHRoZSB2YWx1ZXMgb2YgYWxsCi0vLy8gZmllbGRzIG5vdCBjb3ZlcmVkIGJ5IHRoZSBtYXNrLgotLy8vCi0vLy8gSW4gb3JkZXIgdG8gcmVzZXQgYSBmaWVsZCdzIHZhbHVlIHRvIHRoZSBkZWZhdWx0LCB0aGUgZmllbGQgbXVzdAotLy8vIGJlIGluIHRoZSBtYXNrIGFuZCBzZXQgdG8gdGhlIGRlZmF1bHQgdmFsdWUgaW4gdGhlIHByb3ZpZGVkIHJlc291cmNlLgotLy8vIEhlbmNlLCBpbiBvcmRlciB0byByZXNldCBhbGwgZmllbGRzIG9mIGEgcmVzb3VyY2UsIHByb3ZpZGUgYSBkZWZhdWx0Ci0vLy8gaW5zdGFuY2Ugb2YgdGhlIHJlc291cmNlIGFuZCBzZXQgYWxsIGZpZWxkcyBpbiB0aGUgbWFzaywgb3IgZG8KLS8vLyBub3QgcHJvdmlkZSBhIG1hc2sgYXMgZGVzY3JpYmVkIGJlbG93LgotLy8vCi0vLy8gSWYgYSBmaWVsZCBtYXNrIGlzIG5vdCBwcmVzZW50IG9uIHVwZGF0ZSwgdGhlIG9wZXJhdGlvbiBhcHBsaWVzIHRvCi0vLy8gYWxsIGZpZWxkcyAoYXMgaWYgYSBmaWVsZCBtYXNrIG9mIGFsbCBmaWVsZHMgaGFzIGJlZW4gc3BlY2lmaWVkKS4KLS8vLyBOb3RlIHRoYXQgaW4gdGhlIHByZXNlbmNlIG9mIHNjaGVtYSBldm9sdXRpb24sIHRoaXMgbWF5IG1lYW4gdGhhdAotLy8vIGZpZWxkcyB0aGUgY2xpZW50IGRvZXMgbm90IGtub3cgYW5kIGhhcyB0aGVyZWZvcmUgbm90IGZpbGxlZCBpbnRvCi0vLy8gdGhlIHJlcXVlc3Qgd2lsbCBiZSByZXNldCB0byB0aGVpciBkZWZhdWx0LiBJZiB0aGlzIGlzIHVud2FudGVkCi0vLy8gYmVoYXZpb3IsIGEgc3BlY2lmaWMgc2VydmljZSBtYXkgcmVxdWlyZSBhIGNsaWVudCB0byBhbHdheXMgc3BlY2lmeQotLy8vIGEgZmllbGQgbWFzaywgcHJvZHVjaW5nIGFuIGVycm9yIGlmIG5vdC4KLS8vLwotLy8vIEFzIHdpdGggZ2V0IG9wZXJhdGlvbnMsIHRoZSBsb2NhdGlvbiBvZiB0aGUgcmVzb3VyY2Ugd2hpY2gKLS8vLyBkZXNjcmliZXMgdGhlIHVwZGF0ZWQgdmFsdWVzIGluIHRoZSByZXF1ZXN0IG1lc3NhZ2UgZGVwZW5kcyBvbiB0aGUKLS8vLyBvcGVyYXRpb24ga2luZC4gSW4gYW55IGNhc2UsIHRoZSBlZmZlY3Qgb2YgdGhlIGZpZWxkIG1hc2sgaXMKLS8vLyByZXF1aXJlZCB0byBiZSBob25vcmVkIGJ5IHRoZSBBUEkuCi0vLy8KLS8vLyAjIyBDb25zaWRlcmF0aW9ucyBmb3IgSFRUUCBSRVNUCi0vLy8KLS8vLyBUaGUgSFRUUCBraW5kIG9mIGFuIHVwZGF0ZSBvcGVyYXRpb24gd2hpY2ggdXNlcyBhIGZpZWxkIG1hc2sgbXVzdAotLy8vIGJlIHNldCB0byBQQVRDSCBpbnN0ZWFkIG9mIFBVVCBpbiBvcmRlciB0byBzYXRpc2Z5IEhUVFAgc2VtYW50aWNzCi0vLy8gKFBVVCBtdXN0IG9ubHkgYmUgdXNlZCBmb3IgZnVsbCB1cGRhdGVzKS4KLS8vLwotLy8vICMgSlNPTiBFbmNvZGluZyBvZiBGaWVsZCBNYXNrcwotLy8vCi0vLy8gSW4gSlNPTiwgYSBmaWVsZCBtYXNrIGlzIGVuY29kZWQgYXMgYSBzaW5nbGUgc3RyaW5nIHdoZXJlIHBhdGhzIGFyZQotLy8vIHNlcGFyYXRlZCBieSBhIGNvbW1hLiBGaWVsZHMgbmFtZSBpbiBlYWNoIHBhdGggYXJlIGNvbnZlcnRlZAotLy8vIHRvL2Zyb20gbG93ZXItY2FtZWwgbmFtaW5nIGNvbnZlbnRpb25zLgotLy8vCi0vLy8gQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGZvbGxvd2luZyBtZXNzYWdlIGRlY2xhcmF0aW9uczoKLS8vLwotLy8vICAgICBtZXNzYWdlIFByb2ZpbGUgewotLy8vICAgICAgIFVzZXIgdXNlciA9IDE7Ci0vLy8gICAgICAgUGhvdG8gcGhvdG8gPSAyOwotLy8vICAgICB9Ci0vLy8gICAgIG1lc3NhZ2UgVXNlciB7Ci0vLy8gICAgICAgc3RyaW5nIGRpc3BsYXlfbmFtZSA9IDE7Ci0vLy8gICAgICAgc3RyaW5nIGFkZHJlc3MgPSAyOwotLy8vICAgICB9Ci0vLy8KLS8vLyBJbiBwcm90byBhIGZpZWxkIG1hc2sgZm9yIGBQcm9maWxlYCBtYXkgbG9vayBhcyBzdWNoOgotLy8vCi0vLy8gICAgIG1hc2sgewotLy8vICAgICAgIHBhdGhzOiAidXNlci5kaXNwbGF5X25hbWUiCi0vLy8gICAgICAgcGF0aHM6ICJwaG90byIKLS8vLyAgICAgfQotLy8vCi0vLy8gSW4gSlNPTiwgdGhlIHNhbWUgbWFzayBpcyByZXByZXNlbnRlZCBhcyBiZWxvdzoKLS8vLwotLy8vICAgICB7Ci0vLy8gICAgICAgbWFzazogInVzZXIuZGlzcGxheU5hbWUscGhvdG8iCi0vLy8gICAgIH0KLS8vLwotLy8vICMgRmllbGQgTWFza3MgYW5kIE9uZW9mIEZpZWxkcwotLy8vCi0vLy8gRmllbGQgbWFza3MgdHJlYXQgZmllbGRzIGluIG9uZW9mcyBqdXN0IGFzIHJlZ3VsYXIgZmllbGRzLiBDb25zaWRlciB0aGUKLS8vLyBmb2xsb3dpbmcgbWVzc2FnZToKLS8vLwotLy8vICAgICBtZXNzYWdlIFNhbXBsZU1lc3NhZ2UgewotLy8vICAgICAgIG9uZW9mIHRlc3Rfb25lb2YgewotLy8vICAgICAgICAgc3RyaW5nIG5hbWUgPSA0OwotLy8vICAgICAgICAgU3ViTWVzc2FnZSBzdWJfbWVzc2FnZSA9IDk7Ci0vLy8gICAgICAgfQotLy8vICAgICB9Ci0vLy8KLS8vLyBUaGUgZmllbGQgbWFzayBjYW4gYmU6Ci0vLy8KLS8vLyAgICAgbWFzayB7Ci0vLy8gICAgICAgcGF0aHM6ICJuYW1lIgotLy8vICAgICB9Ci0vLy8KLS8vLyBPcjoKLS8vLwotLy8vICAgICBtYXNrIHsKLS8vLyAgICAgICBwYXRoczogInN1Yl9tZXNzYWdlIgotLy8vICAgICB9Ci0vLy8KLS8vLyBOb3RlIHRoYXQgb25lb2YgdHlwZSBuYW1lcyAoInRlc3Rfb25lb2YiIGluIHRoaXMgY2FzZSkgY2Fubm90IGJlIHVzZWQgaW4KLS8vLyBwYXRocy4KLUBpbnRlcmZhY2UgR1BCRmllbGRNYXNrIDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIHNldCBvZiBmaWVsZCBtYXNrIHBhdGhzLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBzdHJvbmcsIG51bGxfcmVzZXR0YWJsZSkgTlNNdXRhYmxlQXJyYXk8TlNTdHJpbmcqPiAqcGF0aHNBcnJheTsKLS8vLyBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIEBjIHBhdGhzQXJyYXkgd2l0aG91dCBjYXVzaW5nIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgcGF0aHNBcnJheV9Db3VudDsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKLQotQ0ZfRVhURVJOX0NfRU5ECi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkTWFzay5wYm9iamMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL0ZpZWxkTWFzay5wYm9iamMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGMyNDFhZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9GaWVsZE1hc2sucGJvYmpjLm0KKysrIC9kZXYvbnVsbApAQCAtMSw3NyArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnNfUnVudGltZVN1cHBvcnQuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9GaWVsZE1hc2sucGJvYmpjLmgiCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgotCi0jcHJhZ21hIG1hcmsgLSBHUEJGaWVsZE1hc2tSb290Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJGaWVsZE1hc2tSb290Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCRmllbGRNYXNrUm9vdF9GaWxlRGVzY3JpcHRvcgotCi1zdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKkdQQkZpZWxkTWFza1Jvb3RfRmlsZURlc2NyaXB0b3Iodm9pZCkgewotICAvLyBUaGlzIGlzIGNhbGxlZCBieSAraW5pdGlhbGl6ZSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IHRocmVhZCBzYWZldHkgb2YgdGhlIHNpbmdsZXRvbi4KLSAgc3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgR1BCRGVidWdDaGVja1J1bnRpbWVWZXJzaW9uKCk7Ci0gICAgZGVzY3JpcHRvciA9IFtbR1BCRmlsZURlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoUGFja2FnZTpAImdvb2dsZS5wcm90b2J1ZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OkdQQkZpbGVTeW50YXhQcm90bzNdOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi0jcHJhZ21hIG1hcmsgLSBHUEJGaWVsZE1hc2sKLQotQGltcGxlbWVudGF0aW9uIEdQQkZpZWxkTWFzawotCi1AZHluYW1pYyBwYXRoc0FycmF5LCBwYXRoc0FycmF5X0NvdW50OwotCi10eXBlZGVmIHN0cnVjdCBHUEJGaWVsZE1hc2tfX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLSAgTlNNdXRhYmxlQXJyYXkgKnBhdGhzQXJyYXk7Ci19IEdQQkZpZWxkTWFza19fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAicGF0aHNBcnJheSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJGaWVsZE1hc2tfRmllbGROdW1iZXJfUGF0aHNBcnJheSwKLSAgICAgICAgLmhhc0luZGV4ID0gR1BCTm9IYXNCaXQsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCRmllbGRNYXNrX19zdG9yYWdlXywgcGF0aHNBcnJheSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkUmVwZWF0ZWQsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlU3RyaW5nLAotICAgICAgfSwKLSAgICB9OwotICAgIEdQQkRlc2NyaXB0b3IgKmxvY2FsRGVzY3JpcHRvciA9Ci0gICAgICAgIFtHUEJEZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvckNsYXNzOltHUEJGaWVsZE1hc2sgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENsYXNzOltHUEJGaWVsZE1hc2tSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJGaWVsZE1hc2tSb290X0ZpbGVEZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvdW50Oih1aW50MzJfdCkoc2l6ZW9mKGZpZWxkcykgLyBzaXplb2YoR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTpzaXplb2YoR1BCRmllbGRNYXNrX19zdG9yYWdlXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6MF07Ci0gICAgTlNBc3NlcnQoZGVzY3JpcHRvciA9PSBuaWwsIEAiU3RhcnR1cCByZWN1cnNlZCEiKTsKLSAgICBkZXNjcmlwdG9yID0gbG9jYWxEZXNjcmlwdG9yOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1AZW5kCi0KLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvU291cmNlQ29udGV4dC5wYm9iamMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1NvdXJjZUNvbnRleHQucGJvYmpjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3NzUzNDguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvU291cmNlQ29udGV4dC5wYm9iamMuaAorKysgL2Rldi9udWxsCkBAIC0xLDU0ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnMuaCIKLQotI2lmIEdPT0dMRV9QUk9UT0JVRl9PQkpDX0dFTl9WRVJTSU9OICE9IDMwMDAxCi0jZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBzb3VyY2VzLgotI2VuZGlmCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLSNwcmFnbWEgbWFyayAtIEdQQlNvdXJjZUNvbnRleHRSb290Ci0KLS8vLyBFeHBvc2VzIHRoZSBleHRlbnNpb24gcmVnaXN0cnkgZm9yIHRoaXMgZmlsZS4KLS8vLwotLy8vIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzOgotLy8vIEBjb2RlCi0vLy8gICArIChHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5OwotLy8vIEBlbmRjb2RlCi0vLy8gd2hpY2ggaXMgYSBAYyBHUEJFeHRlbnNpb25SZWdpc3RyeSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgZXh0ZW5zaW9ucyBkZWZpbmVkIGJ5Ci0vLy8gdGhpcyBmaWxlIGFuZCBhbGwgZmlsZXMgdGhhdCBpdCBkZXBlbmRzIG9uLgotQGludGVyZmFjZSBHUEJTb3VyY2VDb250ZXh0Um9vdCA6IEdQQlJvb3RPYmplY3QKLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCU291cmNlQ29udGV4dAotCi10eXBlZGVmIEdQQl9FTlVNKEdQQlNvdXJjZUNvbnRleHRfRmllbGROdW1iZXIpIHsKLSAgR1BCU291cmNlQ29udGV4dF9GaWVsZE51bWJlcl9GaWxlTmFtZSA9IDEsCi19OwotCi0vLy8gYFNvdXJjZUNvbnRleHRgIHJlcHJlc2VudHMgaW5mb3JtYXRpb24gYWJvdXQgdGhlIHNvdXJjZSBvZiBhCi0vLy8gcHJvdG9idWYgZWxlbWVudCwgbGlrZSB0aGUgZmlsZSBpbiB3aGljaCBpdCBpcyBkZWZpbmVkLgotQGludGVyZmFjZSBHUEJTb3VyY2VDb250ZXh0IDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIHBhdGgtcXVhbGlmaWVkIG5hbWUgb2YgdGhlIC5wcm90byBmaWxlIHRoYXQgY29udGFpbmVkIHRoZSBhc3NvY2lhdGVkCi0vLy8gcHJvdG9idWYgZWxlbWVudC4gIEZvciBleGFtcGxlOiBgImdvb2dsZS9wcm90b2J1Zi9zb3VyY2UucHJvdG8iYC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqZmlsZU5hbWU7Ci0KLUBlbmQKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECi0KLUNGX0VYVEVSTl9DX0VORAotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9Tb3VyY2VDb250ZXh0LnBib2JqYy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvU291cmNlQ29udGV4dC5wYm9iamMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTUwMDcxMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9Tb3VyY2VDb250ZXh0LnBib2JqYy5tCisrKyAvZGV2L251bGwKQEAgLTEsNzcgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVyc19SdW50aW1lU3VwcG9ydC5oIgotI2ltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL1NvdXJjZUNvbnRleHQucGJvYmpjLmgiCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgotCi0jcHJhZ21hIG1hcmsgLSBHUEJTb3VyY2VDb250ZXh0Um9vdAotCi1AaW1wbGVtZW50YXRpb24gR1BCU291cmNlQ29udGV4dFJvb3QKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJTb3VyY2VDb250ZXh0Um9vdF9GaWxlRGVzY3JpcHRvcgotCi1zdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKkdQQlNvdXJjZUNvbnRleHRSb290X0ZpbGVEZXNjcmlwdG9yKHZvaWQpIHsKLSAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgK2luaXRpYWxpemUgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeQotICAvLyBhYm91dCB0aHJlYWQgc2FmZXR5IG9mIHRoZSBzaW5nbGV0b24uCi0gIHN0YXRpYyBHUEJGaWxlRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IE5VTEw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIEdQQkRlYnVnQ2hlY2tSdW50aW1lVmVyc2lvbigpOwotICAgIGRlc2NyaXB0b3IgPSBbW0dQQkZpbGVEZXNjcmlwdG9yIGFsbG9jXSBpbml0V2l0aFBhY2thZ2U6QCJnb29nbGUucHJvdG9idWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDpHUEJGaWxlU3ludGF4UHJvdG8zXTsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCU291cmNlQ29udGV4dAotCi1AaW1wbGVtZW50YXRpb24gR1BCU291cmNlQ29udGV4dAotCi1AZHluYW1pYyBmaWxlTmFtZTsKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCU291cmNlQ29udGV4dF9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBOU1N0cmluZyAqZmlsZU5hbWU7Ci19IEdQQlNvdXJjZUNvbnRleHRfX3N0b3JhZ2VfOwotCi0vLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWRzYWZlIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGx5IGNhbGxlZAotLy8gaW4gK2luaXRpYWxpemUgZm9yIGVhY2ggc3ViY2xhc3MuCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7Ci0gIHN0YXRpYyBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gbmlsOwotICBpZiAoIWRlc2NyaXB0b3IpIHsKLSAgICBzdGF0aWMgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gZmllbGRzW10gPSB7Ci0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gImZpbGVOYW1lIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQlNvdXJjZUNvbnRleHRfRmllbGROdW1iZXJfRmlsZU5hbWUsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCU291cmNlQ29udGV4dF9fc3RvcmFnZV8sIGZpbGVOYW1lKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQlNvdXJjZUNvbnRleHQgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENsYXNzOltHUEJTb3VyY2VDb250ZXh0Um9vdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6R1BCU291cmNlQ29udGV4dFJvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJTb3VyY2VDb250ZXh0X19zdG9yYWdlXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6MF07Ci0gICAgTlNBc3NlcnQoZGVzY3JpcHRvciA9PSBuaWwsIEAiU3RhcnR1cCByZWN1cnNlZCEiKTsKLSAgICBkZXNjcmlwdG9yID0gbG9jYWxEZXNjcmlwdG9yOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1AZW5kCi0KLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHBvcAotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvU3RydWN0LnBib2JqYy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvU3RydWN0LnBib2JqYy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTI0YjRiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1N0cnVjdC5wYm9iamMuaAorKysgL2Rldi9udWxsCkBAIC0xLDE2NyArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVycy5oIgotCi0jaWYgR09PR0xFX1BST1RPQlVGX09CSkNfR0VOX1ZFUlNJT04gIT0gMzAwMDEKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5IHNvdXJjZXMuCi0jZW5kaWYKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotQ0ZfRVhURVJOX0NfQkVHSU4KLQotQGNsYXNzIEdQQkxpc3RWYWx1ZTsKLUBjbGFzcyBHUEJTdHJ1Y3Q7Ci1AY2xhc3MgR1BCVmFsdWU7Ci0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLSNwcmFnbWEgbWFyayAtIEVudW0gR1BCTnVsbFZhbHVlCi0KLS8vLyBgTnVsbFZhbHVlYCBpcyBhIHNpbmdsZXRvbiBlbnVtZXJhdGlvbiB0byByZXByZXNlbnQgdGhlIG51bGwgdmFsdWUgZm9yIHRoZQotLy8vIGBWYWx1ZWAgdHlwZSB1bmlvbi4KLS8vLwotLy8vICBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYE51bGxWYWx1ZWAgaXMgSlNPTiBgbnVsbGAuCi10eXBlZGVmIEdQQl9FTlVNKEdQQk51bGxWYWx1ZSkgewotICAvLy8gVmFsdWUgdXNlZCBpZiBhbnkgbWVzc2FnZSdzIGZpZWxkIGVuY291bnRlcnMgYSB2YWx1ZSB0aGF0IGlzIG5vdCBkZWZpbmVkCi0gIC8vLyBieSB0aGlzIGVudW0uIFRoZSBtZXNzYWdlIHdpbGwgYWxzbyBoYXZlIEMgZnVuY3Rpb25zIHRvIGdldC9zZXQgdGhlIHJhd1ZhbHVlCi0gIC8vLyBvZiB0aGUgZmllbGQuCi0gIEdQQk51bGxWYWx1ZV9HUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlLAotICAvLy8gTnVsbCB2YWx1ZS4KLSAgR1BCTnVsbFZhbHVlX051bGxWYWx1ZSA9IDAsCi19OwotCi1HUEJFbnVtRGVzY3JpcHRvciAqR1BCTnVsbFZhbHVlX0VudW1EZXNjcmlwdG9yKHZvaWQpOwotCi0vLy8gQ2hlY2tzIHRvIHNlZSBpZiB0aGUgZ2l2ZW4gdmFsdWUgaXMgZGVmaW5lZCBieSB0aGUgZW51bSBvciB3YXMgbm90IGtub3duIGF0Ci0vLy8gdGhlIHRpbWUgdGhpcyBzb3VyY2Ugd2FzIGdlbmVyYXRlZC4KLUJPT0wgR1BCTnVsbFZhbHVlX0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlKTsKLQotI3ByYWdtYSBtYXJrIC0gR1BCU3RydWN0Um9vdAotCi0vLy8gRXhwb3NlcyB0aGUgZXh0ZW5zaW9uIHJlZ2lzdHJ5IGZvciB0aGlzIGZpbGUuCi0vLy8KLS8vLyBUaGUgYmFzZSBjbGFzcyBwcm92aWRlczoKLS8vLyBAY29kZQotLy8vICAgKyAoR1BCRXh0ZW5zaW9uUmVnaXN0cnkgKilleHRlbnNpb25SZWdpc3RyeTsKLS8vLyBAZW5kY29kZQotLy8vIHdoaWNoIGlzIGEgQGMgR1BCRXh0ZW5zaW9uUmVnaXN0cnkgdGhhdCBpbmNsdWRlcyBhbGwgdGhlIGV4dGVuc2lvbnMgZGVmaW5lZCBieQotLy8vIHRoaXMgZmlsZSBhbmQgYWxsIGZpbGVzIHRoYXQgaXQgZGVwZW5kcyBvbi4KLUBpbnRlcmZhY2UgR1BCU3RydWN0Um9vdCA6IEdQQlJvb3RPYmplY3QKLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCU3RydWN0Ci0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCU3RydWN0X0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQlN0cnVjdF9GaWVsZE51bWJlcl9GaWVsZHMgPSAxLAotfTsKLQotLy8vIGBTdHJ1Y3RgIHJlcHJlc2VudHMgYSBzdHJ1Y3R1cmVkIGRhdGEgdmFsdWUsIGNvbnNpc3Rpbmcgb2YgZmllbGRzCi0vLy8gd2hpY2ggbWFwIHRvIGR5bmFtaWNhbGx5IHR5cGVkIHZhbHVlcy4gSW4gc29tZSBsYW5ndWFnZXMsIGBTdHJ1Y3RgCi0vLy8gbWlnaHQgYmUgc3VwcG9ydGVkIGJ5IGEgbmF0aXZlIHJlcHJlc2VudGF0aW9uLiBGb3IgZXhhbXBsZSwgaW4KLS8vLyBzY3JpcHRpbmcgbGFuZ3VhZ2VzIGxpa2UgSlMgYSBzdHJ1Y3QgaXMgcmVwcmVzZW50ZWQgYXMgYW4KLS8vLyBvYmplY3QuIFRoZSBkZXRhaWxzIG9mIHRoYXQgcmVwcmVzZW50YXRpb24gYXJlIGRlc2NyaWJlZCB0b2dldGhlcgotLy8vIHdpdGggdGhlIHByb3RvIHN1cHBvcnQgZm9yIHRoZSBsYW5ndWFnZS4KLS8vLwotLy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgU3RydWN0YCBpcyBKU09OIG9iamVjdC4KLUBpbnRlcmZhY2UgR1BCU3RydWN0IDogR1BCTWVzc2FnZQotCi0vLy8gVW5vcmRlcmVkIG1hcCBvZiBkeW5hbWljYWxseSB0eXBlZCB2YWx1ZXMuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBOU011dGFibGVEaWN0aW9uYXJ5PE5TU3RyaW5nKiwgR1BCVmFsdWUqPiAqZmllbGRzOwotLy8vIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gQGMgZmllbGRzIHdpdGhvdXQgY2F1c2luZyB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIGZpZWxkc19Db3VudDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJWYWx1ZQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQlZhbHVlX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQlZhbHVlX0ZpZWxkTnVtYmVyX051bGxWYWx1ZSA9IDEsCi0gIEdQQlZhbHVlX0ZpZWxkTnVtYmVyX051bWJlclZhbHVlID0gMiwKLSAgR1BCVmFsdWVfRmllbGROdW1iZXJfU3RyaW5nVmFsdWUgPSAzLAotICBHUEJWYWx1ZV9GaWVsZE51bWJlcl9Cb29sVmFsdWUgPSA0LAotICBHUEJWYWx1ZV9GaWVsZE51bWJlcl9TdHJ1Y3RWYWx1ZSA9IDUsCi0gIEdQQlZhbHVlX0ZpZWxkTnVtYmVyX0xpc3RWYWx1ZSA9IDYsCi19OwotCi10eXBlZGVmIEdQQl9FTlVNKEdQQlZhbHVlX0tpbmRfT25lT2ZDYXNlKSB7Ci0gIEdQQlZhbHVlX0tpbmRfT25lT2ZDYXNlX0dQQlVuc2V0T25lT2ZDYXNlID0gMCwKLSAgR1BCVmFsdWVfS2luZF9PbmVPZkNhc2VfTnVsbFZhbHVlID0gMSwKLSAgR1BCVmFsdWVfS2luZF9PbmVPZkNhc2VfTnVtYmVyVmFsdWUgPSAyLAotICBHUEJWYWx1ZV9LaW5kX09uZU9mQ2FzZV9TdHJpbmdWYWx1ZSA9IDMsCi0gIEdQQlZhbHVlX0tpbmRfT25lT2ZDYXNlX0Jvb2xWYWx1ZSA9IDQsCi0gIEdQQlZhbHVlX0tpbmRfT25lT2ZDYXNlX1N0cnVjdFZhbHVlID0gNSwKLSAgR1BCVmFsdWVfS2luZF9PbmVPZkNhc2VfTGlzdFZhbHVlID0gNiwKLX07Ci0KLS8vLyBgVmFsdWVgIHJlcHJlc2VudHMgYSBkeW5hbWljYWxseSB0eXBlZCB2YWx1ZSB3aGljaCBjYW4gYmUgZWl0aGVyCi0vLy8gbnVsbCwgYSBudW1iZXIsIGEgc3RyaW5nLCBhIGJvb2xlYW4sIGEgcmVjdXJzaXZlIHN0cnVjdCB2YWx1ZSwgb3IgYQotLy8vIGxpc3Qgb2YgdmFsdWVzLiBBIHByb2R1Y2VyIG9mIHZhbHVlIGlzIGV4cGVjdGVkIHRvIHNldCBvbmUgb2YgdGhhdAotLy8vIHZhcmlhbnRzLCBhYnNlbmNlIG9mIGFueSB2YXJpYW50IGluZGljYXRlcyBhbiBlcnJvci4KLS8vLwotLy8vIFRoZSBKU09OIHJlcHJlc2VudGF0aW9uIGZvciBgVmFsdWVgIGlzIEpTT04gdmFsdWUuCi1AaW50ZXJmYWNlIEdQQlZhbHVlIDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIGtpbmQgb2YgdmFsdWUuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgR1BCVmFsdWVfS2luZF9PbmVPZkNhc2Uga2luZE9uZU9mQ2FzZTsKLQotLy8vIFJlcHJlc2VudHMgYSBudWxsIHZhbHVlLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBHUEJOdWxsVmFsdWUgbnVsbFZhbHVlOwotCi0vLy8gUmVwcmVzZW50cyBhIGRvdWJsZSB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgZG91YmxlIG51bWJlclZhbHVlOwotCi0vLy8gUmVwcmVzZW50cyBhIHN0cmluZyB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqc3RyaW5nVmFsdWU7Ci0KLS8vLyBSZXByZXNlbnRzIGEgYm9vbGVhbiB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgQk9PTCBib29sVmFsdWU7Ci0KLS8vLyBSZXByZXNlbnRzIGEgc3RydWN0dXJlZCB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nLCBudWxsX3Jlc2V0dGFibGUpIEdQQlN0cnVjdCAqc3RydWN0VmFsdWU7Ci0KLS8vLyBSZXByZXNlbnRzIGEgcmVwZWF0ZWQgYFZhbHVlYC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nLCBudWxsX3Jlc2V0dGFibGUpIEdQQkxpc3RWYWx1ZSAqbGlzdFZhbHVlOwotCi1AZW5kCi0KLS8vLyBGZXRjaGVzIHRoZSByYXcgdmFsdWUgb2YgYSBAYyBHUEJWYWx1ZSdzIEBjIG51bGxWYWx1ZSBwcm9wZXJ0eSwgZXZlbgotLy8vIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUgd2FzIGdlbmVyYXRlZC4KLWludDMyX3QgR1BCVmFsdWVfTnVsbFZhbHVlX1Jhd1ZhbHVlKEdQQlZhbHVlICptZXNzYWdlKTsKLS8vLyBTZXRzIHRoZSByYXcgdmFsdWUgb2YgYW4gQGMgR1BCVmFsdWUncyBAYyBudWxsVmFsdWUgcHJvcGVydHksIGFsbG93aW5nCi0vLy8gaXQgdG8gYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUKLS8vLyB3YXMgZ2VuZXJhdGVkLgotdm9pZCBTZXRHUEJWYWx1ZV9OdWxsVmFsdWVfUmF3VmFsdWUoR1BCVmFsdWUgKm1lc3NhZ2UsIGludDMyX3QgdmFsdWUpOwotCi0vLy8gQ2xlYXJzIHdoYXRldmVyIHZhbHVlIHdhcyBzZXQgZm9yIHRoZSBvbmVvZiAna2luZCcuCi12b2lkIEdQQlZhbHVlX0NsZWFyS2luZE9uZU9mQ2FzZShHUEJWYWx1ZSAqbWVzc2FnZSk7Ci0KLSNwcmFnbWEgbWFyayAtIEdQQkxpc3RWYWx1ZQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQkxpc3RWYWx1ZV9GaWVsZE51bWJlcikgewotICBHUEJMaXN0VmFsdWVfRmllbGROdW1iZXJfVmFsdWVzQXJyYXkgPSAxLAotfTsKLQotLy8vIGBMaXN0VmFsdWVgIGlzIGEgd3JhcHBlciBhcm91bmQgYSByZXBlYXRlZCBmaWVsZCBvZiB2YWx1ZXMuCi0vLy8KLS8vLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYExpc3RWYWx1ZWAgaXMgSlNPTiBhcnJheS4KLUBpbnRlcmZhY2UgR1BCTGlzdFZhbHVlIDogR1BCTWVzc2FnZQotCi0vLy8gUmVwZWF0ZWQgZmllbGQgb2YgZHluYW1pY2FsbHkgdHlwZWQgdmFsdWVzLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBzdHJvbmcsIG51bGxfcmVzZXR0YWJsZSkgTlNNdXRhYmxlQXJyYXk8R1BCVmFsdWUqPiAqdmFsdWVzQXJyYXk7Ci0vLy8gVGhlIG51bWJlciBvZiBpdGVtcyBpbiBAYyB2YWx1ZXNBcnJheSB3aXRob3V0IGNhdXNpbmcgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciB2YWx1ZXNBcnJheV9Db3VudDsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKLQotQ0ZfRVhURVJOX0NfRU5ECi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1N0cnVjdC5wYm9iamMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1N0cnVjdC5wYm9iamMubQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjA5NDAwMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9TdHJ1Y3QucGJvYmpjLm0KKysrIC9kZXYvbnVsbApAQCAtMSwyNzMgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnNfUnVudGltZVN1cHBvcnQuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9TdHJ1Y3QucGJvYmpjLmgiCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgotCi0jcHJhZ21hIG1hcmsgLSBHUEJTdHJ1Y3RSb290Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJ1Y3RSb290Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCU3RydWN0Um9vdF9GaWxlRGVzY3JpcHRvcgotCi1zdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKkdQQlN0cnVjdFJvb3RfRmlsZURlc2NyaXB0b3Iodm9pZCkgewotICAvLyBUaGlzIGlzIGNhbGxlZCBieSAraW5pdGlhbGl6ZSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IHRocmVhZCBzYWZldHkgb2YgdGhlIHNpbmdsZXRvbi4KLSAgc3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgR1BCRGVidWdDaGVja1J1bnRpbWVWZXJzaW9uKCk7Ci0gICAgZGVzY3JpcHRvciA9IFtbR1BCRmlsZURlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoUGFja2FnZTpAImdvb2dsZS5wcm90b2J1ZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OkdQQkZpbGVTeW50YXhQcm90bzNdOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi0jcHJhZ21hIG1hcmsgLSBFbnVtIEdQQk51bGxWYWx1ZQotCi1HUEJFbnVtRGVzY3JpcHRvciAqR1BCTnVsbFZhbHVlX0VudW1EZXNjcmlwdG9yKHZvaWQpIHsKLSAgc3RhdGljIEdQQkVudW1EZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnZhbHVlTmFtZXMgPQotICAgICAgICAiTnVsbFZhbHVlXDAwMCI7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgdmFsdWVzW10gPSB7Ci0gICAgICAgIEdQQk51bGxWYWx1ZV9OdWxsVmFsdWUsCi0gICAgfTsKLSAgICBHUEJFbnVtRGVzY3JpcHRvciAqd29ya2VyID0KLSAgICAgICAgW0dQQkVudW1EZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvck5hbWU6R1BCTlNTdHJpbmdpZnlTeW1ib2woR1BCTnVsbFZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVOYW1lczp2YWx1ZU5hbWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVzOnZhbHVlcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb3VudDoodWludDMyX3QpKHNpemVvZih2YWx1ZXMpIC8gc2l6ZW9mKGludDMyX3QpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1WZXJpZmllcjpHUEJOdWxsVmFsdWVfSXNWYWxpZFZhbHVlXTsKLSAgICBpZiAoIU9TQXRvbWljQ29tcGFyZUFuZFN3YXBQdHJCYXJyaWVyKG5pbCwgd29ya2VyLCAodm9pZCAqIHZvbGF0aWxlICopJmRlc2NyaXB0b3IpKSB7Ci0gICAgICBbd29ya2VyIHJlbGVhc2VdOwotICAgIH0KLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQk9PTCBHUEJOdWxsVmFsdWVfSXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWVfXykgewotICBzd2l0Y2ggKHZhbHVlX18pIHsKLSAgICBjYXNlIEdQQk51bGxWYWx1ZV9OdWxsVmFsdWU6Ci0gICAgICByZXR1cm4gWUVTOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTk87Ci0gIH0KLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCU3RydWN0Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJTdHJ1Y3QKLQotQGR5bmFtaWMgZmllbGRzLCBmaWVsZHNfQ291bnQ7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQlN0cnVjdF9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBOU011dGFibGVEaWN0aW9uYXJ5ICpmaWVsZHM7Ci19IEdQQlN0cnVjdF9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAiZmllbGRzIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQlZhbHVlKSwKLSAgICAgICAgLm51bWJlciA9IEdQQlN0cnVjdF9GaWVsZE51bWJlcl9GaWVsZHMsCi0gICAgICAgIC5oYXNJbmRleCA9IEdQQk5vSGFzQml0LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQlN0cnVjdF9fc3RvcmFnZV8sIGZpZWxkcyksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkTWFwS2V5U3RyaW5nLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQlN0cnVjdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQlN0cnVjdFJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQlN0cnVjdFJvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJTdHJ1Y3RfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCVmFsdWUKLQotQGltcGxlbWVudGF0aW9uIEdQQlZhbHVlCi0KLUBkeW5hbWljIGtpbmRPbmVPZkNhc2U7Ci1AZHluYW1pYyBudWxsVmFsdWU7Ci1AZHluYW1pYyBudW1iZXJWYWx1ZTsKLUBkeW5hbWljIHN0cmluZ1ZhbHVlOwotQGR5bmFtaWMgYm9vbFZhbHVlOwotQGR5bmFtaWMgc3RydWN0VmFsdWU7Ci1AZHluYW1pYyBsaXN0VmFsdWU7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQlZhbHVlX19zdG9yYWdlXyB7Ci0gIHVpbnQzMl90IF9oYXNfc3RvcmFnZV9bMl07Ci0gIEdQQk51bGxWYWx1ZSBudWxsVmFsdWU7Ci0gIE5TU3RyaW5nICpzdHJpbmdWYWx1ZTsKLSAgR1BCU3RydWN0ICpzdHJ1Y3RWYWx1ZTsKLSAgR1BCTGlzdFZhbHVlICpsaXN0VmFsdWU7Ci0gIGRvdWJsZSBudW1iZXJWYWx1ZTsKLX0gR1BCVmFsdWVfX3N0b3JhZ2VfOwotCi0vLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWRzYWZlIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGx5IGNhbGxlZAotLy8gaW4gK2luaXRpYWxpemUgZm9yIGVhY2ggc3ViY2xhc3MuCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7Ci0gIHN0YXRpYyBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gbmlsOwotICBpZiAoIWRlc2NyaXB0b3IpIHsKLSAgICBzdGF0aWMgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gZmllbGRzW10gPSB7Ci0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm51bGxWYWx1ZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmVudW1EZXNjRnVuYyA9IEdQQk51bGxWYWx1ZV9FbnVtRGVzY3JpcHRvciwKLSAgICAgICAgLm51bWJlciA9IEdQQlZhbHVlX0ZpZWxkTnVtYmVyX051bGxWYWx1ZSwKLSAgICAgICAgLmhhc0luZGV4ID0gLTEsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCVmFsdWVfX3N0b3JhZ2VfLCBudWxsVmFsdWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsIHwgR1BCRmllbGRIYXNFbnVtRGVzY3JpcHRvciwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVFbnVtLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAibnVtYmVyVmFsdWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCVmFsdWVfRmllbGROdW1iZXJfTnVtYmVyVmFsdWUsCi0gICAgICAgIC5oYXNJbmRleCA9IC0xLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQlZhbHVlX19zdG9yYWdlXywgbnVtYmVyVmFsdWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZURvdWJsZSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gInN0cmluZ1ZhbHVlIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQlZhbHVlX0ZpZWxkTnVtYmVyX1N0cmluZ1ZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSAtMSwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJWYWx1ZV9fc3RvcmFnZV8sIHN0cmluZ1ZhbHVlKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJib29sVmFsdWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCVmFsdWVfRmllbGROdW1iZXJfQm9vbFZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSAtMSwKLSAgICAgICAgLm9mZnNldCA9IDAsICAvLyBTdG9yZWQgaW4gX2hhc19zdG9yYWdlXyB0byBzYXZlIHNwYWNlLgotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUJvb2wsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJzdHJ1Y3RWYWx1ZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IEdQQlN0cmluZ2lmeVN5bWJvbChHUEJTdHJ1Y3QpLAotICAgICAgICAubnVtYmVyID0gR1BCVmFsdWVfRmllbGROdW1iZXJfU3RydWN0VmFsdWUsCi0gICAgICAgIC5oYXNJbmRleCA9IC0xLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQlZhbHVlX19zdG9yYWdlXywgc3RydWN0VmFsdWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJsaXN0VmFsdWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBHUEJTdHJpbmdpZnlTeW1ib2woR1BCTGlzdFZhbHVlKSwKLSAgICAgICAgLm51bWJlciA9IEdQQlZhbHVlX0ZpZWxkTnVtYmVyX0xpc3RWYWx1ZSwKLSAgICAgICAgLmhhc0luZGV4ID0gLTEsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCVmFsdWVfX3N0b3JhZ2VfLCBsaXN0VmFsdWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQlZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCU3RydWN0Um9vdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6R1BCU3RydWN0Um9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQlZhbHVlX19zdG9yYWdlXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6MF07Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKm9uZW9mc1tdID0gewotICAgICAgImtpbmQiLAotICAgIH07Ci0gICAgW2xvY2FsRGVzY3JpcHRvciBzZXR1cE9uZW9mczpvbmVvZnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oih1aW50MzJfdCkoc2l6ZW9mKG9uZW9mcykgLyBzaXplb2YoY2hhciopKQotICAgICAgICAgICAgICAgICAgIGZpcnN0SGFzSW5kZXg6LTFdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi1pbnQzMl90IEdQQlZhbHVlX051bGxWYWx1ZV9SYXdWYWx1ZShHUEJWYWx1ZSAqbWVzc2FnZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQlZhbHVlIGRlc2NyaXB0b3JdOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOkdQQlZhbHVlX0ZpZWxkTnVtYmVyX051bGxWYWx1ZV07Ci0gIHJldHVybiBHUEJHZXRNZXNzYWdlSW50MzJGaWVsZChtZXNzYWdlLCBmaWVsZCk7Ci19Ci0KLXZvaWQgU2V0R1BCVmFsdWVfTnVsbFZhbHVlX1Jhd1ZhbHVlKEdQQlZhbHVlICptZXNzYWdlLCBpbnQzMl90IHZhbHVlKSB7Ci0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbR1BCVmFsdWUgZGVzY3JpcHRvcl07Ci0gIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQgPSBbZGVzY3JpcHRvciBmaWVsZFdpdGhOdW1iZXI6R1BCVmFsdWVfRmllbGROdW1iZXJfTnVsbFZhbHVlXTsKLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLCBkZXNjcmlwdG9yLmZpbGUuc3ludGF4KTsKLX0KLQotdm9pZCBHUEJWYWx1ZV9DbGVhcktpbmRPbmVPZkNhc2UoR1BCVmFsdWUgKm1lc3NhZ2UpIHsKLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFttZXNzYWdlIGRlc2NyaXB0b3JdOwotICBHUEJPbmVvZkRlc2NyaXB0b3IgKm9uZW9mID0gZGVzY3JpcHRvci0+b25lb2ZzX1swXTsKLSAgR1BCTWF5YmVDbGVhck9uZW9mKG1lc3NhZ2UsIG9uZW9mLCAtMSwgMCk7Ci19Ci0jcHJhZ21hIG1hcmsgLSBHUEJMaXN0VmFsdWUKLQotQGltcGxlbWVudGF0aW9uIEdQQkxpc3RWYWx1ZQotCi1AZHluYW1pYyB2YWx1ZXNBcnJheSwgdmFsdWVzQXJyYXlfQ291bnQ7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQkxpc3RWYWx1ZV9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBOU011dGFibGVBcnJheSAqdmFsdWVzQXJyYXk7Ci19IEdQQkxpc3RWYWx1ZV9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAidmFsdWVzQXJyYXkiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBHUEJTdHJpbmdpZnlTeW1ib2woR1BCVmFsdWUpLAotICAgICAgICAubnVtYmVyID0gR1BCTGlzdFZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlc0FycmF5LAotICAgICAgICAuaGFzSW5kZXggPSBHUEJOb0hhc0JpdCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJMaXN0VmFsdWVfX3N0b3JhZ2VfLCB2YWx1ZXNBcnJheSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkUmVwZWF0ZWQsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlTWVzc2FnZSwKLSAgICAgIH0sCi0gICAgfTsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCTGlzdFZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCU3RydWN0Um9vdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6R1BCU3RydWN0Um9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQkxpc3RWYWx1ZV9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1RpbWVzdGFtcC5wYm9iamMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1RpbWVzdGFtcC5wYm9iamMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTI1ZGNhOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9UaW1lc3RhbXAucGJvYmpjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnMuaCIKLQotI2lmIEdPT0dMRV9QUk9UT0JVRl9PQkpDX0dFTl9WRVJTSU9OICE9IDMwMDAxCi0jZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBkaWZmZXJlbnQgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgbGlicmFyeSBzb3VyY2VzLgotI2VuZGlmCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0KLUNGX0VYVEVSTl9DX0JFR0lOCi0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLSNwcmFnbWEgbWFyayAtIEdQQlRpbWVzdGFtcFJvb3QKLQotLy8vIEV4cG9zZXMgdGhlIGV4dGVuc2lvbiByZWdpc3RyeSBmb3IgdGhpcyBmaWxlLgotLy8vCi0vLy8gVGhlIGJhc2UgY2xhc3MgcHJvdmlkZXM6Ci0vLy8gQGNvZGUKLS8vLyAgICsgKEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnk7Ci0vLy8gQGVuZGNvZGUKLS8vLyB3aGljaCBpcyBhIEBjIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBleHRlbnNpb25zIGRlZmluZWQgYnkKLS8vLyB0aGlzIGZpbGUgYW5kIGFsbCBmaWxlcyB0aGF0IGl0IGRlcGVuZHMgb24uCi1AaW50ZXJmYWNlIEdQQlRpbWVzdGFtcFJvb3QgOiBHUEJSb290T2JqZWN0Ci1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQlRpbWVzdGFtcAotCi10eXBlZGVmIEdQQl9FTlVNKEdQQlRpbWVzdGFtcF9GaWVsZE51bWJlcikgewotICBHUEJUaW1lc3RhbXBfRmllbGROdW1iZXJfU2Vjb25kcyA9IDEsCi0gIEdQQlRpbWVzdGFtcF9GaWVsZE51bWJlcl9OYW5vcyA9IDIsCi19OwotCi0vLy8gQSBUaW1lc3RhbXAgcmVwcmVzZW50cyBhIHBvaW50IGluIHRpbWUgaW5kZXBlbmRlbnQgb2YgYW55IHRpbWUgem9uZQotLy8vIG9yIGNhbGVuZGFyLCByZXByZXNlbnRlZCBhcyBzZWNvbmRzIGFuZCBmcmFjdGlvbnMgb2Ygc2Vjb25kcyBhdAotLy8vIG5hbm9zZWNvbmQgcmVzb2x1dGlvbiBpbiBVVEMgRXBvY2ggdGltZS4gSXQgaXMgZW5jb2RlZCB1c2luZyB0aGUKLS8vLyBQcm9sZXB0aWMgR3JlZ29yaWFuIENhbGVuZGFyIHdoaWNoIGV4dGVuZHMgdGhlIEdyZWdvcmlhbiBjYWxlbmRhcgotLy8vIGJhY2t3YXJkcyB0byB5ZWFyIG9uZS4gSXQgaXMgZW5jb2RlZCBhc3N1bWluZyBhbGwgbWludXRlcyBhcmUgNjAKLS8vLyBzZWNvbmRzIGxvbmcsIGkuZS4gbGVhcCBzZWNvbmRzIGFyZSAic21lYXJlZCIgc28gdGhhdCBubyBsZWFwIHNlY29uZAotLy8vIHRhYmxlIGlzIG5lZWRlZCBmb3IgaW50ZXJwcmV0YXRpb24uIFJhbmdlIGlzIGZyb20KLS8vLyAwMDAxLTAxLTAxVDAwOjAwOjAwWiB0byA5OTk5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVouCi0vLy8gQnkgcmVzdHJpY3RpbmcgdG8gdGhhdCByYW5nZSwgd2UgZW5zdXJlIHRoYXQgd2UgY2FuIGNvbnZlcnQgdG8KLS8vLyBhbmQgZnJvbSAgUkZDIDMzMzkgZGF0ZSBzdHJpbmdzLgotLy8vIFNlZSBbaHR0cHM6Ly93d3cuaWV0Zi5vcmcvcmZjL3JmYzMzMzkudHh0XShodHRwczovL3d3dy5pZXRmLm9yZy9yZmMvcmZjMzMzOS50eHQpLgotLy8vCi0vLy8gRXhhbXBsZSAxOiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIFBPU0lYIGB0aW1lKClgLgotLy8vCi0vLy8gICAgIFRpbWVzdGFtcCB0aW1lc3RhbXA7Ci0vLy8gICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcyh0aW1lKE5VTEwpKTsKLS8vLyAgICAgdGltZXN0YW1wLnNldF9uYW5vcygwKTsKLS8vLwotLy8vIEV4YW1wbGUgMjogQ29tcHV0ZSBUaW1lc3RhbXAgZnJvbSBQT1NJWCBgZ2V0dGltZW9mZGF5KClgLgotLy8vCi0vLy8gICAgIHN0cnVjdCB0aW1ldmFsIHR2OwotLy8vICAgICBnZXR0aW1lb2ZkYXkoJnR2LCBOVUxMKTsKLS8vLwotLy8vICAgICBUaW1lc3RhbXAgdGltZXN0YW1wOwotLy8vICAgICB0aW1lc3RhbXAuc2V0X3NlY29uZHModHYudHZfc2VjKTsKLS8vLyAgICAgdGltZXN0YW1wLnNldF9uYW5vcyh0di50dl91c2VjICogMTAwMCk7Ci0vLy8KLS8vLyBFeGFtcGxlIDM6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gV2luMzIgYEdldFN5c3RlbVRpbWVBc0ZpbGVUaW1lKClgLgotLy8vCi0vLy8gICAgIEZJTEVUSU1FIGZ0OwotLy8vICAgICBHZXRTeXN0ZW1UaW1lQXNGaWxlVGltZSgmZnQpOwotLy8vICAgICBVSU5UNjQgdGlja3MgPSAoKChVSU5UNjQpZnQuZHdIaWdoRGF0ZVRpbWUpIDw8IDMyKSB8IGZ0LmR3TG93RGF0ZVRpbWU7Ci0vLy8KLS8vLyAgICAgLy8gQSBXaW5kb3dzIHRpY2sgaXMgMTAwIG5hbm9zZWNvbmRzLiBXaW5kb3dzIGVwb2NoIDE2MDEtMDEtMDFUMDA6MDA6MDBaCi0vLy8gICAgIC8vIGlzIDExNjQ0NDczNjAwIHNlY29uZHMgYmVmb3JlIFVuaXggZXBvY2ggMTk3MC0wMS0wMVQwMDowMDowMFouCi0vLy8gICAgIFRpbWVzdGFtcCB0aW1lc3RhbXA7Ci0vLy8gICAgIHRpbWVzdGFtcC5zZXRfc2Vjb25kcygoSU5UNjQpICgodGlja3MgLyAxMDAwMDAwMCkgLSAxMTY0NDQ3MzYwMExMKSk7Ci0vLy8gICAgIHRpbWVzdGFtcC5zZXRfbmFub3MoKElOVDMyKSAoKHRpY2tzICUgMTAwMDAwMDApICogMTAwKSk7Ci0vLy8KLS8vLyBFeGFtcGxlIDQ6IENvbXB1dGUgVGltZXN0YW1wIGZyb20gSmF2YSBgU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKClgLgotLy8vCi0vLy8gICAgIGxvbmcgbWlsbGlzID0gU3lzdGVtLmN1cnJlbnRUaW1lTWlsbGlzKCk7Ci0vLy8KLS8vLyAgICAgVGltZXN0YW1wIHRpbWVzdGFtcCA9IFRpbWVzdGFtcC5uZXdCdWlsZGVyKCkuc2V0U2Vjb25kcyhtaWxsaXMgLyAxMDAwKQotLy8vICAgICAgICAgLnNldE5hbm9zKChpbnQpICgobWlsbGlzICUgMTAwMCkgKiAxMDAwMDAwKSkuYnVpbGQoKTsKLS8vLwotLy8vCi0vLy8gRXhhbXBsZSA1OiBDb21wdXRlIFRpbWVzdGFtcCBmcm9tIGN1cnJlbnQgdGltZSBpbiBQeXRob24uCi0vLy8KLS8vLyAgICAgbm93ID0gdGltZS50aW1lKCkKLS8vLyAgICAgc2Vjb25kcyA9IGludChub3cpCi0vLy8gICAgIG5hbm9zID0gaW50KChub3cgLSBzZWNvbmRzKSAqIDEwKio5KQotLy8vICAgICB0aW1lc3RhbXAgPSBUaW1lc3RhbXAoc2Vjb25kcz1zZWNvbmRzLCBuYW5vcz1uYW5vcykKLUBpbnRlcmZhY2UgR1BCVGltZXN0YW1wIDogR1BCTWVzc2FnZQotCi0vLy8gUmVwcmVzZW50cyBzZWNvbmRzIG9mIFVUQyB0aW1lIHNpbmNlIFVuaXggZXBvY2gKLS8vLyAxOTcwLTAxLTAxVDAwOjAwOjAwWi4gTXVzdCBiZSBmcm9tIGZyb20gMDAwMS0wMS0wMVQwMDowMDowMFogdG8KLS8vLyA5OTk5LTEyLTMxVDIzOjU5OjU5WiBpbmNsdXNpdmUuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIGludDY0X3Qgc2Vjb25kczsKLQotLy8vIE5vbi1uZWdhdGl2ZSBmcmFjdGlvbnMgb2YgYSBzZWNvbmQgYXQgbmFub3NlY29uZCByZXNvbHV0aW9uLiBOZWdhdGl2ZQotLy8vIHNlY29uZCB2YWx1ZXMgd2l0aCBmcmFjdGlvbnMgbXVzdCBzdGlsbCBoYXZlIG5vbi1uZWdhdGl2ZSBuYW5vcyB2YWx1ZXMKLS8vLyB0aGF0IGNvdW50IGZvcndhcmQgaW4gdGltZS4gTXVzdCBiZSBmcm9tIDAgdG8gOTk5LDk5OSw5OTkKLS8vLyBpbmNsdXNpdmUuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIGludDMyX3QgbmFub3M7Ci0KLUBlbmQKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECi0KLUNGX0VYVEVSTl9DX0VORAotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9UaW1lc3RhbXAucGJvYmpjLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9UaW1lc3RhbXAucGJvYmpjLm0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGYzNWU0MzUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvVGltZXN0YW1wLnBib2JqYy5tCisrKyAvZGV2L251bGwKQEAgLTEsODggKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnNfUnVudGltZVN1cHBvcnQuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9UaW1lc3RhbXAucGJvYmpjLmgiCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cykKLQotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIHB1c2gKLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkICItV2RlcHJlY2F0ZWQtZGVjbGFyYXRpb25zIgotCi0jcHJhZ21hIG1hcmsgLSBHUEJUaW1lc3RhbXBSb290Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJUaW1lc3RhbXBSb290Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCVGltZXN0YW1wUm9vdF9GaWxlRGVzY3JpcHRvcgotCi1zdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKkdQQlRpbWVzdGFtcFJvb3RfRmlsZURlc2NyaXB0b3Iodm9pZCkgewotICAvLyBUaGlzIGlzIGNhbGxlZCBieSAraW5pdGlhbGl6ZSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IHRocmVhZCBzYWZldHkgb2YgdGhlIHNpbmdsZXRvbi4KLSAgc3RhdGljIEdQQkZpbGVEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgR1BCRGVidWdDaGVja1J1bnRpbWVWZXJzaW9uKCk7Ci0gICAgZGVzY3JpcHRvciA9IFtbR1BCRmlsZURlc2NyaXB0b3IgYWxsb2NdIGluaXRXaXRoUGFja2FnZTpAImdvb2dsZS5wcm90b2J1ZiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ludGF4OkdQQkZpbGVTeW50YXhQcm90bzNdOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi0jcHJhZ21hIG1hcmsgLSBHUEJUaW1lc3RhbXAKLQotQGltcGxlbWVudGF0aW9uIEdQQlRpbWVzdGFtcAotCi1AZHluYW1pYyBzZWNvbmRzOwotQGR5bmFtaWMgbmFub3M7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQlRpbWVzdGFtcF9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBpbnQzMl90IG5hbm9zOwotICBpbnQ2NF90IHNlY29uZHM7Ci19IEdQQlRpbWVzdGFtcF9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAic2Vjb25kcyIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJUaW1lc3RhbXBfRmllbGROdW1iZXJfU2Vjb25kcywKLSAgICAgICAgLmhhc0luZGV4ID0gMCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJUaW1lc3RhbXBfX3N0b3JhZ2VfLCBzZWNvbmRzKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVJbnQ2NCwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm5hbm9zIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQlRpbWVzdGFtcF9GaWVsZE51bWJlcl9OYW5vcywKLSAgICAgICAgLmhhc0luZGV4ID0gMSwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJUaW1lc3RhbXBfX3N0b3JhZ2VfLCBuYW5vcyksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlSW50MzIsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQlRpbWVzdGFtcCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQlRpbWVzdGFtcFJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQlRpbWVzdGFtcFJvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJUaW1lc3RhbXBfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9UeXBlLnBib2JqYy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvVHlwZS5wYm9iamMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTkwZDk3MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9UeXBlLnBib2JqYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzczICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVycy5oIgotCi0jaWYgR09PR0xFX1BST1RPQlVGX09CSkNfR0VOX1ZFUlNJT04gIT0gMzAwMDEKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5IHNvdXJjZXMuCi0jZW5kaWYKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotQ0ZfRVhURVJOX0NfQkVHSU4KLQotQGNsYXNzIEdQQkFueTsKLUBjbGFzcyBHUEJFbnVtVmFsdWU7Ci1AY2xhc3MgR1BCRmllbGQ7Ci1AY2xhc3MgR1BCT3B0aW9uOwotQGNsYXNzIEdQQlNvdXJjZUNvbnRleHQ7Ci0KLU5TX0FTU1VNRV9OT05OVUxMX0JFR0lOCi0KLSNwcmFnbWEgbWFyayAtIEVudW0gR1BCU3ludGF4Ci0KLS8vLyBUaGUgc3ludGF4IGluIHdoaWNoIGEgcHJvdG9jb2wgYnVmZmVyIGVsZW1lbnQgaXMgZGVmaW5lZC4KLXR5cGVkZWYgR1BCX0VOVU0oR1BCU3ludGF4KSB7Ci0gIC8vLyBWYWx1ZSB1c2VkIGlmIGFueSBtZXNzYWdlJ3MgZmllbGQgZW5jb3VudGVycyBhIHZhbHVlIHRoYXQgaXMgbm90IGRlZmluZWQKLSAgLy8vIGJ5IHRoaXMgZW51bS4gVGhlIG1lc3NhZ2Ugd2lsbCBhbHNvIGhhdmUgQyBmdW5jdGlvbnMgdG8gZ2V0L3NldCB0aGUgcmF3VmFsdWUKLSAgLy8vIG9mIHRoZSBmaWVsZC4KLSAgR1BCU3ludGF4X0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSA9IGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUsCi0gIC8vLyBTeW50YXggYHByb3RvMmAuCi0gIEdQQlN5bnRheF9TeW50YXhQcm90bzIgPSAwLAotCi0gIC8vLyBTeW50YXggYHByb3RvM2AuCi0gIEdQQlN5bnRheF9TeW50YXhQcm90bzMgPSAxLAotfTsKLQotR1BCRW51bURlc2NyaXB0b3IgKkdQQlN5bnRheF9FbnVtRGVzY3JpcHRvcih2b2lkKTsKLQotLy8vIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGRlZmluZWQgYnkgdGhlIGVudW0gb3Igd2FzIG5vdCBrbm93biBhdAotLy8vIHRoZSB0aW1lIHRoaXMgc291cmNlIHdhcyBnZW5lcmF0ZWQuCi1CT09MIEdQQlN5bnRheF9Jc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZSk7Ci0KLSNwcmFnbWEgbWFyayAtIEVudW0gR1BCRmllbGRfS2luZAotCi0vLy8gQmFzaWMgZmllbGQgdHlwZXMuCi10eXBlZGVmIEdQQl9FTlVNKEdQQkZpZWxkX0tpbmQpIHsKLSAgLy8vIFZhbHVlIHVzZWQgaWYgYW55IG1lc3NhZ2UncyBmaWVsZCBlbmNvdW50ZXJzIGEgdmFsdWUgdGhhdCBpcyBub3QgZGVmaW5lZAotICAvLy8gYnkgdGhpcyBlbnVtLiBUaGUgbWVzc2FnZSB3aWxsIGFsc28gaGF2ZSBDIGZ1bmN0aW9ucyB0byBnZXQvc2V0IHRoZSByYXdWYWx1ZQotICAvLy8gb2YgdGhlIGZpZWxkLgotICBHUEJGaWVsZF9LaW5kX0dQQlVucmVjb2duaXplZEVudW1lcmF0b3JWYWx1ZSA9IGtHUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUsCi0gIC8vLyBGaWVsZCB0eXBlIHVua25vd24uCi0gIEdQQkZpZWxkX0tpbmRfVHlwZVVua25vd24gPSAwLAotCi0gIC8vLyBGaWVsZCB0eXBlIGRvdWJsZS4KLSAgR1BCRmllbGRfS2luZF9UeXBlRG91YmxlID0gMSwKLQotICAvLy8gRmllbGQgdHlwZSBmbG9hdC4KLSAgR1BCRmllbGRfS2luZF9UeXBlRmxvYXQgPSAyLAotCi0gIC8vLyBGaWVsZCB0eXBlIGludDY0LgotICBHUEJGaWVsZF9LaW5kX1R5cGVJbnQ2NCA9IDMsCi0KLSAgLy8vIEZpZWxkIHR5cGUgdWludDY0LgotICBHUEJGaWVsZF9LaW5kX1R5cGVVaW50NjQgPSA0LAotCi0gIC8vLyBGaWVsZCB0eXBlIGludDMyLgotICBHUEJGaWVsZF9LaW5kX1R5cGVJbnQzMiA9IDUsCi0KLSAgLy8vIEZpZWxkIHR5cGUgZml4ZWQ2NC4KLSAgR1BCRmllbGRfS2luZF9UeXBlRml4ZWQ2NCA9IDYsCi0KLSAgLy8vIEZpZWxkIHR5cGUgZml4ZWQzMi4KLSAgR1BCRmllbGRfS2luZF9UeXBlRml4ZWQzMiA9IDcsCi0KLSAgLy8vIEZpZWxkIHR5cGUgYm9vbC4KLSAgR1BCRmllbGRfS2luZF9UeXBlQm9vbCA9IDgsCi0KLSAgLy8vIEZpZWxkIHR5cGUgc3RyaW5nLgotICBHUEJGaWVsZF9LaW5kX1R5cGVTdHJpbmcgPSA5LAotCi0gIC8vLyBGaWVsZCB0eXBlIGdyb3VwLiBQcm90bzIgc3ludGF4IG9ubHksIGFuZCBkZXByZWNhdGVkLgotICBHUEJGaWVsZF9LaW5kX1R5cGVHcm91cCA9IDEwLAotCi0gIC8vLyBGaWVsZCB0eXBlIG1lc3NhZ2UuCi0gIEdQQkZpZWxkX0tpbmRfVHlwZU1lc3NhZ2UgPSAxMSwKLQotICAvLy8gRmllbGQgdHlwZSBieXRlcy4KLSAgR1BCRmllbGRfS2luZF9UeXBlQnl0ZXMgPSAxMiwKLQotICAvLy8gRmllbGQgdHlwZSB1aW50MzIuCi0gIEdQQkZpZWxkX0tpbmRfVHlwZVVpbnQzMiA9IDEzLAotCi0gIC8vLyBGaWVsZCB0eXBlIGVudW0uCi0gIEdQQkZpZWxkX0tpbmRfVHlwZUVudW0gPSAxNCwKLQotICAvLy8gRmllbGQgdHlwZSBzZml4ZWQzMi4KLSAgR1BCRmllbGRfS2luZF9UeXBlU2ZpeGVkMzIgPSAxNSwKLQotICAvLy8gRmllbGQgdHlwZSBzZml4ZWQ2NC4KLSAgR1BCRmllbGRfS2luZF9UeXBlU2ZpeGVkNjQgPSAxNiwKLQotICAvLy8gRmllbGQgdHlwZSBzaW50MzIuCi0gIEdQQkZpZWxkX0tpbmRfVHlwZVNpbnQzMiA9IDE3LAotCi0gIC8vLyBGaWVsZCB0eXBlIHNpbnQ2NC4KLSAgR1BCRmllbGRfS2luZF9UeXBlU2ludDY0ID0gMTgsCi19OwotCi1HUEJFbnVtRGVzY3JpcHRvciAqR1BCRmllbGRfS2luZF9FbnVtRGVzY3JpcHRvcih2b2lkKTsKLQotLy8vIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGRlZmluZWQgYnkgdGhlIGVudW0gb3Igd2FzIG5vdCBrbm93biBhdAotLy8vIHRoZSB0aW1lIHRoaXMgc291cmNlIHdhcyBnZW5lcmF0ZWQuCi1CT09MIEdQQkZpZWxkX0tpbmRfSXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWUpOwotCi0jcHJhZ21hIG1hcmsgLSBFbnVtIEdQQkZpZWxkX0NhcmRpbmFsaXR5Ci0KLS8vLyBXaGV0aGVyIGEgZmllbGQgaXMgb3B0aW9uYWwsIHJlcXVpcmVkLCBvciByZXBlYXRlZC4KLXR5cGVkZWYgR1BCX0VOVU0oR1BCRmllbGRfQ2FyZGluYWxpdHkpIHsKLSAgLy8vIFZhbHVlIHVzZWQgaWYgYW55IG1lc3NhZ2UncyBmaWVsZCBlbmNvdW50ZXJzIGEgdmFsdWUgdGhhdCBpcyBub3QgZGVmaW5lZAotICAvLy8gYnkgdGhpcyBlbnVtLiBUaGUgbWVzc2FnZSB3aWxsIGFsc28gaGF2ZSBDIGZ1bmN0aW9ucyB0byBnZXQvc2V0IHRoZSByYXdWYWx1ZQotICAvLy8gb2YgdGhlIGZpZWxkLgotICBHUEJGaWVsZF9DYXJkaW5hbGl0eV9HUEJVbnJlY29nbml6ZWRFbnVtZXJhdG9yVmFsdWUgPSBrR1BCVW5yZWNvZ25pemVkRW51bWVyYXRvclZhbHVlLAotICAvLy8gRm9yIGZpZWxkcyB3aXRoIHVua25vd24gY2FyZGluYWxpdHkuCi0gIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5VW5rbm93biA9IDAsCi0KLSAgLy8vIEZvciBvcHRpb25hbCBmaWVsZHMuCi0gIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5T3B0aW9uYWwgPSAxLAotCi0gIC8vLyBGb3IgcmVxdWlyZWQgZmllbGRzLiBQcm90bzIgc3ludGF4IG9ubHkuCi0gIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5UmVxdWlyZWQgPSAyLAotCi0gIC8vLyBGb3IgcmVwZWF0ZWQgZmllbGRzLgotICBHUEJGaWVsZF9DYXJkaW5hbGl0eV9DYXJkaW5hbGl0eVJlcGVhdGVkID0gMywKLX07Ci0KLUdQQkVudW1EZXNjcmlwdG9yICpHUEJGaWVsZF9DYXJkaW5hbGl0eV9FbnVtRGVzY3JpcHRvcih2b2lkKTsKLQotLy8vIENoZWNrcyB0byBzZWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGRlZmluZWQgYnkgdGhlIGVudW0gb3Igd2FzIG5vdCBrbm93biBhdAotLy8vIHRoZSB0aW1lIHRoaXMgc291cmNlIHdhcyBnZW5lcmF0ZWQuCi1CT09MIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlKTsKLQotI3ByYWdtYSBtYXJrIC0gR1BCVHlwZVJvb3QKLQotLy8vIEV4cG9zZXMgdGhlIGV4dGVuc2lvbiByZWdpc3RyeSBmb3IgdGhpcyBmaWxlLgotLy8vCi0vLy8gVGhlIGJhc2UgY2xhc3MgcHJvdmlkZXM6Ci0vLy8gQGNvZGUKLS8vLyAgICsgKEdQQkV4dGVuc2lvblJlZ2lzdHJ5ICopZXh0ZW5zaW9uUmVnaXN0cnk7Ci0vLy8gQGVuZGNvZGUKLS8vLyB3aGljaCBpcyBhIEBjIEdQQkV4dGVuc2lvblJlZ2lzdHJ5IHRoYXQgaW5jbHVkZXMgYWxsIHRoZSBleHRlbnNpb25zIGRlZmluZWQgYnkKLS8vLyB0aGlzIGZpbGUgYW5kIGFsbCBmaWxlcyB0aGF0IGl0IGRlcGVuZHMgb24uCi1AaW50ZXJmYWNlIEdQQlR5cGVSb290IDogR1BCUm9vdE9iamVjdAotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJUeXBlCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCVHlwZV9GaWVsZE51bWJlcikgewotICBHUEJUeXBlX0ZpZWxkTnVtYmVyX05hbWUgPSAxLAotICBHUEJUeXBlX0ZpZWxkTnVtYmVyX0ZpZWxkc0FycmF5ID0gMiwKLSAgR1BCVHlwZV9GaWVsZE51bWJlcl9PbmVvZnNBcnJheSA9IDMsCi0gIEdQQlR5cGVfRmllbGROdW1iZXJfT3B0aW9uc0FycmF5ID0gNCwKLSAgR1BCVHlwZV9GaWVsZE51bWJlcl9Tb3VyY2VDb250ZXh0ID0gNSwKLSAgR1BCVHlwZV9GaWVsZE51bWJlcl9TeW50YXggPSA2LAotfTsKLQotLy8vIEEgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UgdHlwZS4KLUBpbnRlcmZhY2UgR1BCVHlwZSA6IEdQQk1lc3NhZ2UKLQotLy8vIFRoZSBmdWxseSBxdWFsaWZpZWQgbWVzc2FnZSBuYW1lLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICpuYW1lOwotCi0vLy8gVGhlIGxpc3Qgb2YgZmllbGRzLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBzdHJvbmcsIG51bGxfcmVzZXR0YWJsZSkgTlNNdXRhYmxlQXJyYXk8R1BCRmllbGQqPiAqZmllbGRzQXJyYXk7Ci0vLy8gVGhlIG51bWJlciBvZiBpdGVtcyBpbiBAYyBmaWVsZHNBcnJheSB3aXRob3V0IGNhdXNpbmcgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBmaWVsZHNBcnJheV9Db3VudDsKLQotLy8vIFRoZSBsaXN0IG9mIHR5cGVzIGFwcGVhcmluZyBpbiBgb25lb2ZgIGRlZmluaXRpb25zIGluIHRoaXMgdHlwZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nLCBudWxsX3Jlc2V0dGFibGUpIE5TTXV0YWJsZUFycmF5PE5TU3RyaW5nKj4gKm9uZW9mc0FycmF5OwotLy8vIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gQGMgb25lb2ZzQXJyYXkgd2l0aG91dCBjYXVzaW5nIHRoZSBhcnJheSB0byBiZSBjcmVhdGVkLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZG9ubHkpIE5TVUludGVnZXIgb25lb2ZzQXJyYXlfQ291bnQ7Ci0KLS8vLyBUaGUgcHJvdG9jb2wgYnVmZmVyIG9wdGlvbnMuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBOU011dGFibGVBcnJheTxHUEJPcHRpb24qPiAqb3B0aW9uc0FycmF5OwotLy8vIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gQGMgb3B0aW9uc0FycmF5IHdpdGhvdXQgY2F1c2luZyB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIG9wdGlvbnNBcnJheV9Db3VudDsKLQotLy8vIFRoZSBzb3VyY2UgY29udGV4dC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgc3Ryb25nLCBudWxsX3Jlc2V0dGFibGUpIEdQQlNvdXJjZUNvbnRleHQgKnNvdXJjZUNvbnRleHQ7Ci0vLy8gVGVzdCB0byBzZWUgaWYgQGMgc291cmNlQ29udGV4dCBoYXMgYmVlbiBzZXQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIEJPT0wgaGFzU291cmNlQ29udGV4dDsKLQotLy8vIFRoZSBzb3VyY2Ugc3ludGF4LgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBHUEJTeW50YXggc3ludGF4OwotCi1AZW5kCi0KLS8vLyBGZXRjaGVzIHRoZSByYXcgdmFsdWUgb2YgYSBAYyBHUEJUeXBlJ3MgQGMgc3ludGF4IHByb3BlcnR5LCBldmVuCi0vLy8gaWYgdGhlIHZhbHVlIHdhcyBub3QgZGVmaW5lZCBieSB0aGUgZW51bSBhdCB0aGUgdGltZSB0aGUgY29kZSB3YXMgZ2VuZXJhdGVkLgotaW50MzJfdCBHUEJUeXBlX1N5bnRheF9SYXdWYWx1ZShHUEJUeXBlICptZXNzYWdlKTsKLS8vLyBTZXRzIHRoZSByYXcgdmFsdWUgb2YgYW4gQGMgR1BCVHlwZSdzIEBjIHN5bnRheCBwcm9wZXJ0eSwgYWxsb3dpbmcKLS8vLyBpdCB0byBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IHdhcyBub3QgZGVmaW5lZCBieSB0aGUgZW51bSBhdCB0aGUgdGltZSB0aGUgY29kZQotLy8vIHdhcyBnZW5lcmF0ZWQuCi12b2lkIFNldEdQQlR5cGVfU3ludGF4X1Jhd1ZhbHVlKEdQQlR5cGUgKm1lc3NhZ2UsIGludDMyX3QgdmFsdWUpOwotCi0jcHJhZ21hIG1hcmsgLSBHUEJGaWVsZAotCi10eXBlZGVmIEdQQl9FTlVNKEdQQkZpZWxkX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQkZpZWxkX0ZpZWxkTnVtYmVyX0tpbmQgPSAxLAotICBHUEJGaWVsZF9GaWVsZE51bWJlcl9DYXJkaW5hbGl0eSA9IDIsCi0gIEdQQkZpZWxkX0ZpZWxkTnVtYmVyX051bWJlciA9IDMsCi0gIEdQQkZpZWxkX0ZpZWxkTnVtYmVyX05hbWUgPSA0LAotICBHUEJGaWVsZF9GaWVsZE51bWJlcl9UeXBlVVJMID0gNiwKLSAgR1BCRmllbGRfRmllbGROdW1iZXJfT25lb2ZJbmRleCA9IDcsCi0gIEdQQkZpZWxkX0ZpZWxkTnVtYmVyX1BhY2tlZCA9IDgsCi0gIEdQQkZpZWxkX0ZpZWxkTnVtYmVyX09wdGlvbnNBcnJheSA9IDksCi0gIEdQQkZpZWxkX0ZpZWxkTnVtYmVyX0pzb25OYW1lID0gMTAsCi0gIEdQQkZpZWxkX0ZpZWxkTnVtYmVyX0RlZmF1bHRWYWx1ZSA9IDExLAotfTsKLQotLy8vIEEgc2luZ2xlIGZpZWxkIG9mIGEgbWVzc2FnZSB0eXBlLgotQGludGVyZmFjZSBHUEJGaWVsZCA6IEdQQk1lc3NhZ2UKLQotLy8vIFRoZSBmaWVsZCB0eXBlLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBHUEJGaWVsZF9LaW5kIGtpbmQ7Ci0KLS8vLyBUaGUgZmllbGQgY2FyZGluYWxpdHkuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIEdQQkZpZWxkX0NhcmRpbmFsaXR5IGNhcmRpbmFsaXR5OwotCi0vLy8gVGhlIGZpZWxkIG51bWJlci4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgaW50MzJfdCBudW1iZXI7Ci0KLS8vLyBUaGUgZmllbGQgbmFtZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqbmFtZTsKLQotLy8vIFRoZSBmaWVsZCB0eXBlIFVSTCwgd2l0aG91dCB0aGUgc2NoZW1lLCBmb3IgbWVzc2FnZSBvciBlbnVtZXJhdGlvbgotLy8vIHR5cGVzLiBFeGFtcGxlOiBgInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJgLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICp0eXBlVVJMOwotCi0vLy8gVGhlIGluZGV4IG9mIHRoZSBmaWVsZCB0eXBlIGluIGBUeXBlLm9uZW9mc2AsIGZvciBtZXNzYWdlIG9yIGVudW1lcmF0aW9uCi0vLy8gdHlwZXMuIFRoZSBmaXJzdCB0eXBlIGhhcyBpbmRleCAxOyB6ZXJvIG1lYW5zIHRoZSB0eXBlIGlzIG5vdCBpbiB0aGUgbGlzdC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgaW50MzJfdCBvbmVvZkluZGV4OwotCi0vLy8gV2hldGhlciB0byB1c2UgYWx0ZXJuYXRpdmUgcGFja2VkIHdpcmUgcmVwcmVzZW50YXRpb24uCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIEJPT0wgcGFja2VkOwotCi0vLy8gVGhlIHByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBzdHJvbmcsIG51bGxfcmVzZXR0YWJsZSkgTlNNdXRhYmxlQXJyYXk8R1BCT3B0aW9uKj4gKm9wdGlvbnNBcnJheTsKLS8vLyBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIEBjIG9wdGlvbnNBcnJheSB3aXRob3V0IGNhdXNpbmcgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBvcHRpb25zQXJyYXlfQ291bnQ7Ci0KLS8vLyBUaGUgZmllbGQgSlNPTiBuYW1lLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICpqc29uTmFtZTsKLQotLy8vIFRoZSBzdHJpbmcgdmFsdWUgb2YgdGhlIGRlZmF1bHQgdmFsdWUgb2YgdGhpcyBmaWVsZC4gUHJvdG8yIHN5bnRheCBvbmx5LgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICpkZWZhdWx0VmFsdWU7Ci0KLUBlbmQKLQotLy8vIEZldGNoZXMgdGhlIHJhdyB2YWx1ZSBvZiBhIEBjIEdQQkZpZWxkJ3MgQGMga2luZCBwcm9wZXJ0eSwgZXZlbgotLy8vIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUgd2FzIGdlbmVyYXRlZC4KLWludDMyX3QgR1BCRmllbGRfS2luZF9SYXdWYWx1ZShHUEJGaWVsZCAqbWVzc2FnZSk7Ci0vLy8gU2V0cyB0aGUgcmF3IHZhbHVlIG9mIGFuIEBjIEdQQkZpZWxkJ3MgQGMga2luZCBwcm9wZXJ0eSwgYWxsb3dpbmcKLS8vLyBpdCB0byBiZSBzZXQgdG8gYSB2YWx1ZSB0aGF0IHdhcyBub3QgZGVmaW5lZCBieSB0aGUgZW51bSBhdCB0aGUgdGltZSB0aGUgY29kZQotLy8vIHdhcyBnZW5lcmF0ZWQuCi12b2lkIFNldEdQQkZpZWxkX0tpbmRfUmF3VmFsdWUoR1BCRmllbGQgKm1lc3NhZ2UsIGludDMyX3QgdmFsdWUpOwotCi0vLy8gRmV0Y2hlcyB0aGUgcmF3IHZhbHVlIG9mIGEgQGMgR1BCRmllbGQncyBAYyBjYXJkaW5hbGl0eSBwcm9wZXJ0eSwgZXZlbgotLy8vIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUgd2FzIGdlbmVyYXRlZC4KLWludDMyX3QgR1BCRmllbGRfQ2FyZGluYWxpdHlfUmF3VmFsdWUoR1BCRmllbGQgKm1lc3NhZ2UpOwotLy8vIFNldHMgdGhlIHJhdyB2YWx1ZSBvZiBhbiBAYyBHUEJGaWVsZCdzIEBjIGNhcmRpbmFsaXR5IHByb3BlcnR5LCBhbGxvd2luZwotLy8vIGl0IHRvIGJlIHNldCB0byBhIHZhbHVlIHRoYXQgd2FzIG5vdCBkZWZpbmVkIGJ5IHRoZSBlbnVtIGF0IHRoZSB0aW1lIHRoZSBjb2RlCi0vLy8gd2FzIGdlbmVyYXRlZC4KLXZvaWQgU2V0R1BCRmllbGRfQ2FyZGluYWxpdHlfUmF3VmFsdWUoR1BCRmllbGQgKm1lc3NhZ2UsIGludDMyX3QgdmFsdWUpOwotCi0jcHJhZ21hIG1hcmsgLSBHUEJFbnVtCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCRW51bV9GaWVsZE51bWJlcikgewotICBHUEJFbnVtX0ZpZWxkTnVtYmVyX05hbWUgPSAxLAotICBHUEJFbnVtX0ZpZWxkTnVtYmVyX0VudW12YWx1ZUFycmF5ID0gMiwKLSAgR1BCRW51bV9GaWVsZE51bWJlcl9PcHRpb25zQXJyYXkgPSAzLAotICBHUEJFbnVtX0ZpZWxkTnVtYmVyX1NvdXJjZUNvbnRleHQgPSA0LAotICBHUEJFbnVtX0ZpZWxkTnVtYmVyX1N5bnRheCA9IDUsCi19OwotCi0vLy8gRW51bSB0eXBlIGRlZmluaXRpb24uCi1AaW50ZXJmYWNlIEdQQkVudW0gOiBHUEJNZXNzYWdlCi0KLS8vLyBFbnVtIHR5cGUgbmFtZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSwgY29weSwgbnVsbF9yZXNldHRhYmxlKSBOU1N0cmluZyAqbmFtZTsKLQotLy8vIEVudW0gdmFsdWUgZGVmaW5pdGlvbnMuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBOU011dGFibGVBcnJheTxHUEJFbnVtVmFsdWUqPiAqZW51bXZhbHVlQXJyYXk7Ci0vLy8gVGhlIG51bWJlciBvZiBpdGVtcyBpbiBAYyBlbnVtdmFsdWVBcnJheSB3aXRob3V0IGNhdXNpbmcgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBlbnVtdmFsdWVBcnJheV9Db3VudDsKLQotLy8vIFByb3RvY29sIGJ1ZmZlciBvcHRpb25zLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBzdHJvbmcsIG51bGxfcmVzZXR0YWJsZSkgTlNNdXRhYmxlQXJyYXk8R1BCT3B0aW9uKj4gKm9wdGlvbnNBcnJheTsKLS8vLyBUaGUgbnVtYmVyIG9mIGl0ZW1zIGluIEBjIG9wdGlvbnNBcnJheSB3aXRob3V0IGNhdXNpbmcgdGhlIGFycmF5IHRvIGJlIGNyZWF0ZWQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkb25seSkgTlNVSW50ZWdlciBvcHRpb25zQXJyYXlfQ291bnQ7Ci0KLS8vLyBUaGUgc291cmNlIGNvbnRleHQuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBHUEJTb3VyY2VDb250ZXh0ICpzb3VyY2VDb250ZXh0OwotLy8vIFRlc3QgdG8gc2VlIGlmIEBjIHNvdXJjZUNvbnRleHQgaGFzIGJlZW4gc2V0LgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBCT09MIGhhc1NvdXJjZUNvbnRleHQ7Ci0KLS8vLyBUaGUgc291cmNlIHN5bnRheC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgR1BCU3ludGF4IHN5bnRheDsKLQotQGVuZAotCi0vLy8gRmV0Y2hlcyB0aGUgcmF3IHZhbHVlIG9mIGEgQGMgR1BCRW51bSdzIEBjIHN5bnRheCBwcm9wZXJ0eSwgZXZlbgotLy8vIGlmIHRoZSB2YWx1ZSB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUgd2FzIGdlbmVyYXRlZC4KLWludDMyX3QgR1BCRW51bV9TeW50YXhfUmF3VmFsdWUoR1BCRW51bSAqbWVzc2FnZSk7Ci0vLy8gU2V0cyB0aGUgcmF3IHZhbHVlIG9mIGFuIEBjIEdQQkVudW0ncyBAYyBzeW50YXggcHJvcGVydHksIGFsbG93aW5nCi0vLy8gaXQgdG8gYmUgc2V0IHRvIGEgdmFsdWUgdGhhdCB3YXMgbm90IGRlZmluZWQgYnkgdGhlIGVudW0gYXQgdGhlIHRpbWUgdGhlIGNvZGUKLS8vLyB3YXMgZ2VuZXJhdGVkLgotdm9pZCBTZXRHUEJFbnVtX1N5bnRheF9SYXdWYWx1ZShHUEJFbnVtICptZXNzYWdlLCBpbnQzMl90IHZhbHVlKTsKLQotI3ByYWdtYSBtYXJrIC0gR1BCRW51bVZhbHVlCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCRW51bVZhbHVlX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQkVudW1WYWx1ZV9GaWVsZE51bWJlcl9OYW1lID0gMSwKLSAgR1BCRW51bVZhbHVlX0ZpZWxkTnVtYmVyX051bWJlciA9IDIsCi0gIEdQQkVudW1WYWx1ZV9GaWVsZE51bWJlcl9PcHRpb25zQXJyYXkgPSAzLAotfTsKLQotLy8vIEVudW0gdmFsdWUgZGVmaW5pdGlvbi4KLUBpbnRlcmZhY2UgR1BCRW51bVZhbHVlIDogR1BCTWVzc2FnZQotCi0vLy8gRW51bSB2YWx1ZSBuYW1lLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICpuYW1lOwotCi0vLy8gRW51bSB2YWx1ZSBudW1iZXIuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUpIGludDMyX3QgbnVtYmVyOwotCi0vLy8gUHJvdG9jb2wgYnVmZmVyIG9wdGlvbnMuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBOU011dGFibGVBcnJheTxHUEJPcHRpb24qPiAqb3B0aW9uc0FycmF5OwotLy8vIFRoZSBudW1iZXIgb2YgaXRlbXMgaW4gQGMgb3B0aW9uc0FycmF5IHdpdGhvdXQgY2F1c2luZyB0aGUgYXJyYXkgdG8gYmUgY3JlYXRlZC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWRvbmx5KSBOU1VJbnRlZ2VyIG9wdGlvbnNBcnJheV9Db3VudDsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJPcHRpb24KLQotdHlwZWRlZiBHUEJfRU5VTShHUEJPcHRpb25fRmllbGROdW1iZXIpIHsKLSAgR1BCT3B0aW9uX0ZpZWxkTnVtYmVyX05hbWUgPSAxLAotICBHUEJPcHRpb25fRmllbGROdW1iZXJfVmFsdWUgPSAyLAotfTsKLQotLy8vIEEgcHJvdG9jb2wgYnVmZmVyIG9wdGlvbiwgd2hpY2ggY2FuIGJlIGF0dGFjaGVkIHRvIGEgbWVzc2FnZSwgZmllbGQsCi0vLy8gZW51bWVyYXRpb24sIGV0Yy4KLUBpbnRlcmZhY2UgR1BCT3B0aW9uIDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIG9wdGlvbidzIG5hbWUuIEZvciBleGFtcGxlLCBgImphdmFfcGFja2FnZSJgLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICpuYW1lOwotCi0vLy8gVGhlIG9wdGlvbidzIHZhbHVlLiBGb3IgZXhhbXBsZSwgYCJjb20uZ29vZ2xlLnByb3RvYnVmImAuCi1AcHJvcGVydHkobm9uYXRvbWljLCByZWFkd3JpdGUsIHN0cm9uZywgbnVsbF9yZXNldHRhYmxlKSBHUEJBbnkgKnZhbHVlOwotLy8vIFRlc3QgdG8gc2VlIGlmIEBjIHZhbHVlIGhhcyBiZWVuIHNldC4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgQk9PTCBoYXNWYWx1ZTsKLQotQGVuZAotCi1OU19BU1NVTUVfTk9OTlVMTF9FTkQKLQotQ0ZfRVhURVJOX0NfRU5ECi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1R5cGUucGJvYmpjLm0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9UeXBlLnBib2JqYy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NTU0YTIyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1R5cGUucGJvYmpjLm0KKysrIC9kZXYvbnVsbApAQCAtMSw2OTMgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8KLQotI2ltcG9ydCAiR1BCUHJvdG9jb2xCdWZmZXJzX1J1bnRpbWVTdXBwb3J0LmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvVHlwZS5wYm9iamMuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9BbnkucGJvYmpjLmgiCi0jaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvU291cmNlQ29udGV4dC5wYm9iamMuaCIKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0KLSNwcmFnbWEgbWFyayAtIEdQQlR5cGVSb290Ci0KLUBpbXBsZW1lbnRhdGlvbiBHUEJUeXBlUm9vdAotCi0rIChHUEJFeHRlbnNpb25SZWdpc3RyeSopZXh0ZW5zaW9uUmVnaXN0cnkgewotICAvLyBUaGlzIGlzIGNhbGxlZCBieSAraW5pdGlhbGl6ZSBzbyB0aGVyZSBpcyBubyBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IHRocmVhZCBzYWZldHkgYW5kIGluaXRpYWxpemF0aW9uIG9mIHJlZ2lzdHJ5LgotICBzdGF0aWMgR1BCRXh0ZW5zaW9uUmVnaXN0cnkqIHJlZ2lzdHJ5ID0gbmlsOwotICBpZiAoIXJlZ2lzdHJ5KSB7Ci0gICAgR1BCRGVidWdDaGVja1J1bnRpbWVWZXJzaW9uKCk7Ci0gICAgcmVnaXN0cnkgPSBbW0dQQkV4dGVuc2lvblJlZ2lzdHJ5IGFsbG9jXSBpbml0XTsKLSAgICBbcmVnaXN0cnkgYWRkRXh0ZW5zaW9uczpbR1BCQW55Um9vdCBleHRlbnNpb25SZWdpc3RyeV1dOwotICAgIFtyZWdpc3RyeSBhZGRFeHRlbnNpb25zOltHUEJTb3VyY2VDb250ZXh0Um9vdCBleHRlbnNpb25SZWdpc3RyeV1dOwotICB9Ci0gIHJldHVybiByZWdpc3RyeTsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJUeXBlUm9vdF9GaWxlRGVzY3JpcHRvcgotCi1zdGF0aWMgR1BCRmlsZURlc2NyaXB0b3IgKkdQQlR5cGVSb290X0ZpbGVEZXNjcmlwdG9yKHZvaWQpIHsKLSAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgK2luaXRpYWxpemUgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeQotICAvLyBhYm91dCB0aHJlYWQgc2FmZXR5IG9mIHRoZSBzaW5nbGV0b24uCi0gIHN0YXRpYyBHUEJGaWxlRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IE5VTEw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIEdQQkRlYnVnQ2hlY2tSdW50aW1lVmVyc2lvbigpOwotICAgIGRlc2NyaXB0b3IgPSBbW0dQQkZpbGVEZXNjcmlwdG9yIGFsbG9jXSBpbml0V2l0aFBhY2thZ2U6QCJnb29nbGUucHJvdG9idWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDpHUEJGaWxlU3ludGF4UHJvdG8zXTsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotI3ByYWdtYSBtYXJrIC0gRW51bSBHUEJTeW50YXgKLQotR1BCRW51bURlc2NyaXB0b3IgKkdQQlN5bnRheF9FbnVtRGVzY3JpcHRvcih2b2lkKSB7Ci0gIHN0YXRpYyBHUEJFbnVtRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IE5VTEw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBjb25zdCBjaGFyICp2YWx1ZU5hbWVzID0KLSAgICAgICAgIlN5bnRheFByb3RvMlwwMDBTeW50YXhQcm90bzNcMDAwIjsKLSAgICBzdGF0aWMgY29uc3QgaW50MzJfdCB2YWx1ZXNbXSA9IHsKLSAgICAgICAgR1BCU3ludGF4X1N5bnRheFByb3RvMiwKLSAgICAgICAgR1BCU3ludGF4X1N5bnRheFByb3RvMywKLSAgICB9OwotICAgIEdQQkVudW1EZXNjcmlwdG9yICp3b3JrZXIgPQotICAgICAgICBbR1BCRW51bURlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yTmFtZTpHUEJOU1N0cmluZ2lmeVN5bWJvbChHUEJTeW50YXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZU5hbWVzOnZhbHVlTmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oih1aW50MzJfdCkoc2l6ZW9mKHZhbHVlcykgLyBzaXplb2YoaW50MzJfdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZlcmlmaWVyOkdQQlN5bnRheF9Jc1ZhbGlkVmFsdWVdOwotICAgIGlmICghT1NBdG9taWNDb21wYXJlQW5kU3dhcFB0ckJhcnJpZXIobmlsLCB3b3JrZXIsICh2b2lkICogdm9sYXRpbGUgKikmZGVzY3JpcHRvcikpIHsKLSAgICAgIFt3b3JrZXIgcmVsZWFzZV07Ci0gICAgfQotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1CT09MIEdQQlN5bnRheF9Jc1ZhbGlkVmFsdWUoaW50MzJfdCB2YWx1ZV9fKSB7Ci0gIHN3aXRjaCAodmFsdWVfXykgewotICAgIGNhc2UgR1BCU3ludGF4X1N5bnRheFByb3RvMjoKLSAgICBjYXNlIEdQQlN5bnRheF9TeW50YXhQcm90bzM6Ci0gICAgICByZXR1cm4gWUVTOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gTk87Ci0gIH0KLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCVHlwZQotCi1AaW1wbGVtZW50YXRpb24gR1BCVHlwZQotCi1AZHluYW1pYyBuYW1lOwotQGR5bmFtaWMgZmllbGRzQXJyYXksIGZpZWxkc0FycmF5X0NvdW50OwotQGR5bmFtaWMgb25lb2ZzQXJyYXksIG9uZW9mc0FycmF5X0NvdW50OwotQGR5bmFtaWMgb3B0aW9uc0FycmF5LCBvcHRpb25zQXJyYXlfQ291bnQ7Ci1AZHluYW1pYyBoYXNTb3VyY2VDb250ZXh0LCBzb3VyY2VDb250ZXh0OwotQGR5bmFtaWMgc3ludGF4OwotCi10eXBlZGVmIHN0cnVjdCBHUEJUeXBlX19zdG9yYWdlXyB7Ci0gIHVpbnQzMl90IF9oYXNfc3RvcmFnZV9bMV07Ci0gIEdQQlN5bnRheCBzeW50YXg7Ci0gIE5TU3RyaW5nICpuYW1lOwotICBOU011dGFibGVBcnJheSAqZmllbGRzQXJyYXk7Ci0gIE5TTXV0YWJsZUFycmF5ICpvbmVvZnNBcnJheTsKLSAgTlNNdXRhYmxlQXJyYXkgKm9wdGlvbnNBcnJheTsKLSAgR1BCU291cmNlQ29udGV4dCAqc291cmNlQ29udGV4dDsKLX0gR1BCVHlwZV9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAibmFtZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJUeXBlX0ZpZWxkTnVtYmVyX05hbWUsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCVHlwZV9fc3RvcmFnZV8sIG5hbWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZVN0cmluZywKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gImZpZWxkc0FycmF5IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQkZpZWxkKSwKLSAgICAgICAgLm51bWJlciA9IEdQQlR5cGVfRmllbGROdW1iZXJfRmllbGRzQXJyYXksCi0gICAgICAgIC5oYXNJbmRleCA9IEdQQk5vSGFzQml0LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQlR5cGVfX3N0b3JhZ2VfLCBmaWVsZHNBcnJheSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkUmVwZWF0ZWQsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlTWVzc2FnZSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm9uZW9mc0FycmF5IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQlR5cGVfRmllbGROdW1iZXJfT25lb2ZzQXJyYXksCi0gICAgICAgIC5oYXNJbmRleCA9IEdQQk5vSGFzQml0LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQlR5cGVfX3N0b3JhZ2VfLCBvbmVvZnNBcnJheSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkUmVwZWF0ZWQsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlU3RyaW5nLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAib3B0aW9uc0FycmF5IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQk9wdGlvbiksCi0gICAgICAgIC5udW1iZXIgPSBHUEJUeXBlX0ZpZWxkTnVtYmVyX09wdGlvbnNBcnJheSwKLSAgICAgICAgLmhhc0luZGV4ID0gR1BCTm9IYXNCaXQsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCVHlwZV9fc3RvcmFnZV8sIG9wdGlvbnNBcnJheSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkUmVwZWF0ZWQsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlTWVzc2FnZSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gInNvdXJjZUNvbnRleHQiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBHUEJTdHJpbmdpZnlTeW1ib2woR1BCU291cmNlQ29udGV4dCksCi0gICAgICAgIC5udW1iZXIgPSBHUEJUeXBlX0ZpZWxkTnVtYmVyX1NvdXJjZUNvbnRleHQsCi0gICAgICAgIC5oYXNJbmRleCA9IDEsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCVHlwZV9fc3RvcmFnZV8sIHNvdXJjZUNvbnRleHQpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJzeW50YXgiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5lbnVtRGVzY0Z1bmMgPSBHUEJTeW50YXhfRW51bURlc2NyaXB0b3IsCi0gICAgICAgIC5udW1iZXIgPSBHUEJUeXBlX0ZpZWxkTnVtYmVyX1N5bnRheCwKLSAgICAgICAgLmhhc0luZGV4ID0gMiwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJUeXBlX19zdG9yYWdlXywgc3ludGF4KSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCB8IEdQQkZpZWxkSGFzRW51bURlc2NyaXB0b3IsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlRW51bSwKLSAgICAgIH0sCi0gICAgfTsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCVHlwZSBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQlR5cGVSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJUeXBlUm9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQlR5cGVfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotaW50MzJfdCBHUEJUeXBlX1N5bnRheF9SYXdWYWx1ZShHUEJUeXBlICptZXNzYWdlKSB7Ci0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbR1BCVHlwZSBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpHUEJUeXBlX0ZpZWxkTnVtYmVyX1N5bnRheF07Ci0gIHJldHVybiBHUEJHZXRNZXNzYWdlSW50MzJGaWVsZChtZXNzYWdlLCBmaWVsZCk7Ci19Ci0KLXZvaWQgU2V0R1BCVHlwZV9TeW50YXhfUmF3VmFsdWUoR1BCVHlwZSAqbWVzc2FnZSwgaW50MzJfdCB2YWx1ZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQlR5cGUgZGVzY3JpcHRvcl07Ci0gIEdQQkZpZWxkRGVzY3JpcHRvciAqZmllbGQgPSBbZGVzY3JpcHRvciBmaWVsZFdpdGhOdW1iZXI6R1BCVHlwZV9GaWVsZE51bWJlcl9TeW50YXhdOwotICBHUEJTZXRJbnQzMkl2YXJXaXRoRmllbGRJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgdmFsdWUsIGRlc2NyaXB0b3IuZmlsZS5zeW50YXgpOwotfQotCi0jcHJhZ21hIG1hcmsgLSBHUEJGaWVsZAotCi1AaW1wbGVtZW50YXRpb24gR1BCRmllbGQKLQotQGR5bmFtaWMga2luZDsKLUBkeW5hbWljIGNhcmRpbmFsaXR5OwotQGR5bmFtaWMgbnVtYmVyOwotQGR5bmFtaWMgbmFtZTsKLUBkeW5hbWljIHR5cGVVUkw7Ci1AZHluYW1pYyBvbmVvZkluZGV4OwotQGR5bmFtaWMgcGFja2VkOwotQGR5bmFtaWMgb3B0aW9uc0FycmF5LCBvcHRpb25zQXJyYXlfQ291bnQ7Ci1AZHluYW1pYyBqc29uTmFtZTsKLUBkeW5hbWljIGRlZmF1bHRWYWx1ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCRmllbGRfX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLSAgR1BCRmllbGRfS2luZCBraW5kOwotICBHUEJGaWVsZF9DYXJkaW5hbGl0eSBjYXJkaW5hbGl0eTsKLSAgaW50MzJfdCBudW1iZXI7Ci0gIGludDMyX3Qgb25lb2ZJbmRleDsKLSAgTlNTdHJpbmcgKm5hbWU7Ci0gIE5TU3RyaW5nICp0eXBlVVJMOwotICBOU011dGFibGVBcnJheSAqb3B0aW9uc0FycmF5OwotICBOU1N0cmluZyAqanNvbk5hbWU7Ci0gIE5TU3RyaW5nICpkZWZhdWx0VmFsdWU7Ci19IEdQQkZpZWxkX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJraW5kIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuZW51bURlc2NGdW5jID0gR1BCRmllbGRfS2luZF9FbnVtRGVzY3JpcHRvciwKLSAgICAgICAgLm51bWJlciA9IEdQQkZpZWxkX0ZpZWxkTnVtYmVyX0tpbmQsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCRmllbGRfX3N0b3JhZ2VfLCBraW5kKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCB8IEdQQkZpZWxkSGFzRW51bURlc2NyaXB0b3IsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlRW51bSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gImNhcmRpbmFsaXR5IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuZW51bURlc2NGdW5jID0gR1BCRmllbGRfQ2FyZGluYWxpdHlfRW51bURlc2NyaXB0b3IsCi0gICAgICAgIC5udW1iZXIgPSBHUEJGaWVsZF9GaWVsZE51bWJlcl9DYXJkaW5hbGl0eSwKLSAgICAgICAgLmhhc0luZGV4ID0gMSwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJGaWVsZF9fc3RvcmFnZV8sIGNhcmRpbmFsaXR5KSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCB8IEdQQkZpZWxkSGFzRW51bURlc2NyaXB0b3IsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlRW51bSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm51bWJlciIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJGaWVsZF9GaWVsZE51bWJlcl9OdW1iZXIsCi0gICAgICAgIC5oYXNJbmRleCA9IDIsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCRmllbGRfX3N0b3JhZ2VfLCBudW1iZXIpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUludDMyLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAibmFtZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJGaWVsZF9GaWVsZE51bWJlcl9OYW1lLAotICAgICAgICAuaGFzSW5kZXggPSAzLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkZpZWxkX19zdG9yYWdlXywgbmFtZSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlU3RyaW5nLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAidHlwZVVSTCIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJGaWVsZF9GaWVsZE51bWJlcl9UeXBlVVJMLAotICAgICAgICAuaGFzSW5kZXggPSA0LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkZpZWxkX19zdG9yYWdlXywgdHlwZVVSTCksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwgfCBHUEJGaWVsZFRleHRGb3JtYXROYW1lQ3VzdG9tLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZVN0cmluZywKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm9uZW9mSW5kZXgiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCRmllbGRfRmllbGROdW1iZXJfT25lb2ZJbmRleCwKLSAgICAgICAgLmhhc0luZGV4ID0gNSwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJGaWVsZF9fc3RvcmFnZV8sIG9uZW9mSW5kZXgpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUludDMyLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAicGFja2VkIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQkZpZWxkX0ZpZWxkTnVtYmVyX1BhY2tlZCwKLSAgICAgICAgLmhhc0luZGV4ID0gNiwKLSAgICAgICAgLm9mZnNldCA9IDcsICAvLyBTdG9yZWQgaW4gX2hhc19zdG9yYWdlXyB0byBzYXZlIHNwYWNlLgotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUJvb2wsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJvcHRpb25zQXJyYXkiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBHUEJTdHJpbmdpZnlTeW1ib2woR1BCT3B0aW9uKSwKLSAgICAgICAgLm51bWJlciA9IEdQQkZpZWxkX0ZpZWxkTnVtYmVyX09wdGlvbnNBcnJheSwKLSAgICAgICAgLmhhc0luZGV4ID0gR1BCTm9IYXNCaXQsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCRmllbGRfX3N0b3JhZ2VfLCBvcHRpb25zQXJyYXkpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZFJlcGVhdGVkLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJqc29uTmFtZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJGaWVsZF9GaWVsZE51bWJlcl9Kc29uTmFtZSwKLSAgICAgICAgLmhhc0luZGV4ID0gOCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJGaWVsZF9fc3RvcmFnZV8sIGpzb25OYW1lKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJkZWZhdWx0VmFsdWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCRmllbGRfRmllbGROdW1iZXJfRGVmYXVsdFZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSA5LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkZpZWxkX19zdG9yYWdlXywgZGVmYXVsdFZhbHVlKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQkZpZWxkIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCVHlwZVJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQlR5cGVSb290X0ZpbGVEZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvdW50Oih1aW50MzJfdCkoc2l6ZW9mKGZpZWxkcykgLyBzaXplb2YoR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTpzaXplb2YoR1BCRmllbGRfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSNpZiAhR1BCT0JKQ19TS0lQX01FU1NBR0VfVEVYVEZPUk1BVF9FWFRSQVMKLSAgICBzdGF0aWMgY29uc3QgY2hhciAqZXh0cmFUZXh0Rm9ybWF0SW5mbyA9Ci0gICAgICAgICJcMDAxXDAwNlwwMDRcMjQxISFcMDAwIjsKLSAgICBbbG9jYWxEZXNjcmlwdG9yIHNldHVwRXh0cmFUZXh0SW5mbzpleHRyYVRleHRGb3JtYXRJbmZvXTsKLSNlbmRpZiAgLy8gIUdQQk9CSkNfU0tJUF9NRVNTQUdFX1RFWFRGT1JNQVRfRVhUUkFTCi0gICAgTlNBc3NlcnQoZGVzY3JpcHRvciA9PSBuaWwsIEAiU3RhcnR1cCByZWN1cnNlZCEiKTsKLSAgICBkZXNjcmlwdG9yID0gbG9jYWxEZXNjcmlwdG9yOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1AZW5kCi0KLWludDMyX3QgR1BCRmllbGRfS2luZF9SYXdWYWx1ZShHUEJGaWVsZCAqbWVzc2FnZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQkZpZWxkIGRlc2NyaXB0b3JdOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOkdQQkZpZWxkX0ZpZWxkTnVtYmVyX0tpbmRdOwotICByZXR1cm4gR1BCR2V0TWVzc2FnZUludDMyRmllbGQobWVzc2FnZSwgZmllbGQpOwotfQotCi12b2lkIFNldEdQQkZpZWxkX0tpbmRfUmF3VmFsdWUoR1BCRmllbGQgKm1lc3NhZ2UsIGludDMyX3QgdmFsdWUpIHsKLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtHUEJGaWVsZCBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpHUEJGaWVsZF9GaWVsZE51bWJlcl9LaW5kXTsKLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLCBkZXNjcmlwdG9yLmZpbGUuc3ludGF4KTsKLX0KLQotaW50MzJfdCBHUEJGaWVsZF9DYXJkaW5hbGl0eV9SYXdWYWx1ZShHUEJGaWVsZCAqbWVzc2FnZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQkZpZWxkIGRlc2NyaXB0b3JdOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOkdQQkZpZWxkX0ZpZWxkTnVtYmVyX0NhcmRpbmFsaXR5XTsKLSAgcmV0dXJuIEdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKLX0KLQotdm9pZCBTZXRHUEJGaWVsZF9DYXJkaW5hbGl0eV9SYXdWYWx1ZShHUEJGaWVsZCAqbWVzc2FnZSwgaW50MzJfdCB2YWx1ZSkgewotICBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gW0dQQkZpZWxkIGRlc2NyaXB0b3JdOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOkdQQkZpZWxkX0ZpZWxkTnVtYmVyX0NhcmRpbmFsaXR5XTsKLSAgR1BCU2V0SW50MzJJdmFyV2l0aEZpZWxkSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLCBkZXNjcmlwdG9yLmZpbGUuc3ludGF4KTsKLX0KLQotI3ByYWdtYSBtYXJrIC0gRW51bSBHUEJGaWVsZF9LaW5kCi0KLUdQQkVudW1EZXNjcmlwdG9yICpHUEJGaWVsZF9LaW5kX0VudW1EZXNjcmlwdG9yKHZvaWQpIHsKLSAgc3RhdGljIEdQQkVudW1EZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIGNvbnN0IGNoYXIgKnZhbHVlTmFtZXMgPQotICAgICAgICAiVHlwZVVua25vd25cMDAwVHlwZURvdWJsZVwwMDBUeXBlRmxvYXRcMDAwVHlwZUludCIKLSAgICAgICAgIjY0XDAwMFR5cGVVaW50NjRcMDAwVHlwZUludDMyXDAwMFR5cGVGaXhlZDY0XDAwMFR5cGUiCi0gICAgICAgICJGaXhlZDMyXDAwMFR5cGVCb29sXDAwMFR5cGVTdHJpbmdcMDAwVHlwZUdyb3VwXDAwMFR5IgotICAgICAgICAicGVNZXNzYWdlXDAwMFR5cGVCeXRlc1wwMDBUeXBlVWludDMyXDAwMFR5cGVFbnVtXDAwMCIKLSAgICAgICAgIlR5cGVTZml4ZWQzMlwwMDBUeXBlU2ZpeGVkNjRcMDAwVHlwZVNpbnQzMlwwMDBUeXAiCi0gICAgICAgICJlU2ludDY0XDAwMCI7Ci0gICAgc3RhdGljIGNvbnN0IGludDMyX3QgdmFsdWVzW10gPSB7Ci0gICAgICAgIEdQQkZpZWxkX0tpbmRfVHlwZVVua25vd24sCi0gICAgICAgIEdQQkZpZWxkX0tpbmRfVHlwZURvdWJsZSwKLSAgICAgICAgR1BCRmllbGRfS2luZF9UeXBlRmxvYXQsCi0gICAgICAgIEdQQkZpZWxkX0tpbmRfVHlwZUludDY0LAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVVaW50NjQsCi0gICAgICAgIEdQQkZpZWxkX0tpbmRfVHlwZUludDMyLAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVGaXhlZDY0LAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVGaXhlZDMyLAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVCb29sLAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVTdHJpbmcsCi0gICAgICAgIEdQQkZpZWxkX0tpbmRfVHlwZUdyb3VwLAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVNZXNzYWdlLAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVCeXRlcywKLSAgICAgICAgR1BCRmllbGRfS2luZF9UeXBlVWludDMyLAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVFbnVtLAotICAgICAgICBHUEJGaWVsZF9LaW5kX1R5cGVTZml4ZWQzMiwKLSAgICAgICAgR1BCRmllbGRfS2luZF9UeXBlU2ZpeGVkNjQsCi0gICAgICAgIEdQQkZpZWxkX0tpbmRfVHlwZVNpbnQzMiwKLSAgICAgICAgR1BCRmllbGRfS2luZF9UeXBlU2ludDY0LAotICAgIH07Ci0gICAgR1BCRW51bURlc2NyaXB0b3IgKndvcmtlciA9Ci0gICAgICAgIFtHUEJFbnVtRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JOYW1lOkdQQk5TU3RyaW5naWZ5U3ltYm9sKEdQQkZpZWxkX0tpbmQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZU5hbWVzOnZhbHVlTmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oih1aW50MzJfdCkoc2l6ZW9mKHZhbHVlcykgLyBzaXplb2YoaW50MzJfdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZlcmlmaWVyOkdQQkZpZWxkX0tpbmRfSXNWYWxpZFZhbHVlXTsKLSAgICBpZiAoIU9TQXRvbWljQ29tcGFyZUFuZFN3YXBQdHJCYXJyaWVyKG5pbCwgd29ya2VyLCAodm9pZCAqIHZvbGF0aWxlICopJmRlc2NyaXB0b3IpKSB7Ci0gICAgICBbd29ya2VyIHJlbGVhc2VdOwotICAgIH0KLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQk9PTCBHUEJGaWVsZF9LaW5kX0lzVmFsaWRWYWx1ZShpbnQzMl90IHZhbHVlX18pIHsKLSAgc3dpdGNoICh2YWx1ZV9fKSB7Ci0gICAgY2FzZSBHUEJGaWVsZF9LaW5kX1R5cGVVbmtub3duOgotICAgIGNhc2UgR1BCRmllbGRfS2luZF9UeXBlRG91YmxlOgotICAgIGNhc2UgR1BCRmllbGRfS2luZF9UeXBlRmxvYXQ6Ci0gICAgY2FzZSBHUEJGaWVsZF9LaW5kX1R5cGVJbnQ2NDoKLSAgICBjYXNlIEdQQkZpZWxkX0tpbmRfVHlwZVVpbnQ2NDoKLSAgICBjYXNlIEdQQkZpZWxkX0tpbmRfVHlwZUludDMyOgotICAgIGNhc2UgR1BCRmllbGRfS2luZF9UeXBlRml4ZWQ2NDoKLSAgICBjYXNlIEdQQkZpZWxkX0tpbmRfVHlwZUZpeGVkMzI6Ci0gICAgY2FzZSBHUEJGaWVsZF9LaW5kX1R5cGVCb29sOgotICAgIGNhc2UgR1BCRmllbGRfS2luZF9UeXBlU3RyaW5nOgotICAgIGNhc2UgR1BCRmllbGRfS2luZF9UeXBlR3JvdXA6Ci0gICAgY2FzZSBHUEJGaWVsZF9LaW5kX1R5cGVNZXNzYWdlOgotICAgIGNhc2UgR1BCRmllbGRfS2luZF9UeXBlQnl0ZXM6Ci0gICAgY2FzZSBHUEJGaWVsZF9LaW5kX1R5cGVVaW50MzI6Ci0gICAgY2FzZSBHUEJGaWVsZF9LaW5kX1R5cGVFbnVtOgotICAgIGNhc2UgR1BCRmllbGRfS2luZF9UeXBlU2ZpeGVkMzI6Ci0gICAgY2FzZSBHUEJGaWVsZF9LaW5kX1R5cGVTZml4ZWQ2NDoKLSAgICBjYXNlIEdQQkZpZWxkX0tpbmRfVHlwZVNpbnQzMjoKLSAgICBjYXNlIEdQQkZpZWxkX0tpbmRfVHlwZVNpbnQ2NDoKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOTzsKLSAgfQotfQotCi0jcHJhZ21hIG1hcmsgLSBFbnVtIEdQQkZpZWxkX0NhcmRpbmFsaXR5Ci0KLUdQQkVudW1EZXNjcmlwdG9yICpHUEJGaWVsZF9DYXJkaW5hbGl0eV9FbnVtRGVzY3JpcHRvcih2b2lkKSB7Ci0gIHN0YXRpYyBHUEJFbnVtRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IE5VTEw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBjb25zdCBjaGFyICp2YWx1ZU5hbWVzID0KLSAgICAgICAgIkNhcmRpbmFsaXR5VW5rbm93blwwMDBDYXJkaW5hbGl0eU9wdGlvbmFsXDAwMEMiCi0gICAgICAgICJhcmRpbmFsaXR5UmVxdWlyZWRcMDAwQ2FyZGluYWxpdHlSZXBlYXRlZFwwMDAiOwotICAgIHN0YXRpYyBjb25zdCBpbnQzMl90IHZhbHVlc1tdID0gewotICAgICAgICBHUEJGaWVsZF9DYXJkaW5hbGl0eV9DYXJkaW5hbGl0eVVua25vd24sCi0gICAgICAgIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5T3B0aW9uYWwsCi0gICAgICAgIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5UmVxdWlyZWQsCi0gICAgICAgIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5UmVwZWF0ZWQsCi0gICAgfTsKLSAgICBHUEJFbnVtRGVzY3JpcHRvciAqd29ya2VyID0KLSAgICAgICAgW0dQQkVudW1EZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvck5hbWU6R1BCTlNTdHJpbmdpZnlTeW1ib2woR1BCRmllbGRfQ2FyZGluYWxpdHkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZU5hbWVzOnZhbHVlTmFtZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM6dmFsdWVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50Oih1aW50MzJfdCkoc2l6ZW9mKHZhbHVlcykgLyBzaXplb2YoaW50MzJfdCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bVZlcmlmaWVyOkdQQkZpZWxkX0NhcmRpbmFsaXR5X0lzVmFsaWRWYWx1ZV07Ci0gICAgaWYgKCFPU0F0b21pY0NvbXBhcmVBbmRTd2FwUHRyQmFycmllcihuaWwsIHdvcmtlciwgKHZvaWQgKiB2b2xhdGlsZSAqKSZkZXNjcmlwdG9yKSkgewotICAgICAgW3dvcmtlciByZWxlYXNlXTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUJPT0wgR1BCRmllbGRfQ2FyZGluYWxpdHlfSXNWYWxpZFZhbHVlKGludDMyX3QgdmFsdWVfXykgewotICBzd2l0Y2ggKHZhbHVlX18pIHsKLSAgICBjYXNlIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5VW5rbm93bjoKLSAgICBjYXNlIEdQQkZpZWxkX0NhcmRpbmFsaXR5X0NhcmRpbmFsaXR5T3B0aW9uYWw6Ci0gICAgY2FzZSBHUEJGaWVsZF9DYXJkaW5hbGl0eV9DYXJkaW5hbGl0eVJlcXVpcmVkOgotICAgIGNhc2UgR1BCRmllbGRfQ2FyZGluYWxpdHlfQ2FyZGluYWxpdHlSZXBlYXRlZDoKLSAgICAgIHJldHVybiBZRVM7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBOTzsKLSAgfQotfQotCi0jcHJhZ21hIG1hcmsgLSBHUEJFbnVtCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJFbnVtCi0KLUBkeW5hbWljIG5hbWU7Ci1AZHluYW1pYyBlbnVtdmFsdWVBcnJheSwgZW51bXZhbHVlQXJyYXlfQ291bnQ7Ci1AZHluYW1pYyBvcHRpb25zQXJyYXksIG9wdGlvbnNBcnJheV9Db3VudDsKLUBkeW5hbWljIGhhc1NvdXJjZUNvbnRleHQsIHNvdXJjZUNvbnRleHQ7Ci1AZHluYW1pYyBzeW50YXg7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQkVudW1fX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLSAgR1BCU3ludGF4IHN5bnRheDsKLSAgTlNTdHJpbmcgKm5hbWU7Ci0gIE5TTXV0YWJsZUFycmF5ICplbnVtdmFsdWVBcnJheTsKLSAgTlNNdXRhYmxlQXJyYXkgKm9wdGlvbnNBcnJheTsKLSAgR1BCU291cmNlQ29udGV4dCAqc291cmNlQ29udGV4dDsKLX0gR1BCRW51bV9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAibmFtZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJFbnVtX0ZpZWxkTnVtYmVyX05hbWUsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCRW51bV9fc3RvcmFnZV8sIG5hbWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZVN0cmluZywKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gImVudW12YWx1ZUFycmF5IiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQkVudW1WYWx1ZSksCi0gICAgICAgIC5udW1iZXIgPSBHUEJFbnVtX0ZpZWxkTnVtYmVyX0VudW12YWx1ZUFycmF5LAotICAgICAgICAuaGFzSW5kZXggPSBHUEJOb0hhc0JpdCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJFbnVtX19zdG9yYWdlXywgZW51bXZhbHVlQXJyYXkpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZFJlcGVhdGVkLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJvcHRpb25zQXJyYXkiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBHUEJTdHJpbmdpZnlTeW1ib2woR1BCT3B0aW9uKSwKLSAgICAgICAgLm51bWJlciA9IEdQQkVudW1fRmllbGROdW1iZXJfT3B0aW9uc0FycmF5LAotICAgICAgICAuaGFzSW5kZXggPSBHUEJOb0hhc0JpdCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJFbnVtX19zdG9yYWdlXywgb3B0aW9uc0FycmF5KSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRSZXBlYXRlZCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVNZXNzYWdlLAotICAgICAgfSwKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAic291cmNlQ29udGV4dCIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IEdQQlN0cmluZ2lmeVN5bWJvbChHUEJTb3VyY2VDb250ZXh0KSwKLSAgICAgICAgLm51bWJlciA9IEdQQkVudW1fRmllbGROdW1iZXJfU291cmNlQ29udGV4dCwKLSAgICAgICAgLmhhc0luZGV4ID0gMSwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJFbnVtX19zdG9yYWdlXywgc291cmNlQ29udGV4dCksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlTWVzc2FnZSwKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gInN5bnRheCIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmVudW1EZXNjRnVuYyA9IEdQQlN5bnRheF9FbnVtRGVzY3JpcHRvciwKLSAgICAgICAgLm51bWJlciA9IEdQQkVudW1fRmllbGROdW1iZXJfU3ludGF4LAotICAgICAgICAuaGFzSW5kZXggPSAyLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkVudW1fX3N0b3JhZ2VfLCBzeW50YXgpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsIHwgR1BCRmllbGRIYXNFbnVtRGVzY3JpcHRvciwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVFbnVtLAotICAgICAgfSwKLSAgICB9OwotICAgIEdQQkRlc2NyaXB0b3IgKmxvY2FsRGVzY3JpcHRvciA9Ci0gICAgICAgIFtHUEJEZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvckNsYXNzOltHUEJFbnVtIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCVHlwZVJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQlR5cGVSb290X0ZpbGVEZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvdW50Oih1aW50MzJfdCkoc2l6ZW9mKGZpZWxkcykgLyBzaXplb2YoR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTpzaXplb2YoR1BCRW51bV9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi1pbnQzMl90IEdQQkVudW1fU3ludGF4X1Jhd1ZhbHVlKEdQQkVudW0gKm1lc3NhZ2UpIHsKLSAgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IFtHUEJFbnVtIGRlc2NyaXB0b3JdOwotICBHUEJGaWVsZERlc2NyaXB0b3IgKmZpZWxkID0gW2Rlc2NyaXB0b3IgZmllbGRXaXRoTnVtYmVyOkdQQkVudW1fRmllbGROdW1iZXJfU3ludGF4XTsKLSAgcmV0dXJuIEdQQkdldE1lc3NhZ2VJbnQzMkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKLX0KLQotdm9pZCBTZXRHUEJFbnVtX1N5bnRheF9SYXdWYWx1ZShHUEJFbnVtICptZXNzYWdlLCBpbnQzMl90IHZhbHVlKSB7Ci0gIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBbR1BCRW51bSBkZXNjcmlwdG9yXTsKLSAgR1BCRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IFtkZXNjcmlwdG9yIGZpZWxkV2l0aE51bWJlcjpHUEJFbnVtX0ZpZWxkTnVtYmVyX1N5bnRheF07Ci0gIEdQQlNldEludDMySXZhcldpdGhGaWVsZEludGVybmFsKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSwgZGVzY3JpcHRvci5maWxlLnN5bnRheCk7Ci19Ci0KLSNwcmFnbWEgbWFyayAtIEdQQkVudW1WYWx1ZQotCi1AaW1wbGVtZW50YXRpb24gR1BCRW51bVZhbHVlCi0KLUBkeW5hbWljIG5hbWU7Ci1AZHluYW1pYyBudW1iZXI7Ci1AZHluYW1pYyBvcHRpb25zQXJyYXksIG9wdGlvbnNBcnJheV9Db3VudDsKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCRW51bVZhbHVlX19zdG9yYWdlXyB7Ci0gIHVpbnQzMl90IF9oYXNfc3RvcmFnZV9bMV07Ci0gIGludDMyX3QgbnVtYmVyOwotICBOU1N0cmluZyAqbmFtZTsKLSAgTlNNdXRhYmxlQXJyYXkgKm9wdGlvbnNBcnJheTsKLX0gR1BCRW51bVZhbHVlX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJuYW1lIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQkVudW1WYWx1ZV9GaWVsZE51bWJlcl9OYW1lLAotICAgICAgICAuaGFzSW5kZXggPSAwLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkVudW1WYWx1ZV9fc3RvcmFnZV8sIG5hbWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZVN0cmluZywKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gIm51bWJlciIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJFbnVtVmFsdWVfRmllbGROdW1iZXJfTnVtYmVyLAotICAgICAgICAuaGFzSW5kZXggPSAxLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkVudW1WYWx1ZV9fc3RvcmFnZV8sIG51bWJlciksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlSW50MzIsCi0gICAgICB9LAotICAgICAgewotICAgICAgICAubmFtZSA9ICJvcHRpb25zQXJyYXkiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBHUEJTdHJpbmdpZnlTeW1ib2woR1BCT3B0aW9uKSwKLSAgICAgICAgLm51bWJlciA9IEdQQkVudW1WYWx1ZV9GaWVsZE51bWJlcl9PcHRpb25zQXJyYXksCi0gICAgICAgIC5oYXNJbmRleCA9IEdQQk5vSGFzQml0LAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkVudW1WYWx1ZV9fc3RvcmFnZV8sIG9wdGlvbnNBcnJheSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkUmVwZWF0ZWQsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlTWVzc2FnZSwKLSAgICAgIH0sCi0gICAgfTsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCRW51bVZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCVHlwZVJvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQlR5cGVSb290X0ZpbGVEZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvdW50Oih1aW50MzJfdCkoc2l6ZW9mKGZpZWxkcykgLyBzaXplb2YoR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTpzaXplb2YoR1BCRW51bVZhbHVlX19zdG9yYWdlXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6MF07Ci0gICAgTlNBc3NlcnQoZGVzY3JpcHRvciA9PSBuaWwsIEAiU3RhcnR1cCByZWN1cnNlZCEiKTsKLSAgICBkZXNjcmlwdG9yID0gbG9jYWxEZXNjcmlwdG9yOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQk9wdGlvbgotCi1AaW1wbGVtZW50YXRpb24gR1BCT3B0aW9uCi0KLUBkeW5hbWljIG5hbWU7Ci1AZHluYW1pYyBoYXNWYWx1ZSwgdmFsdWU7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQk9wdGlvbl9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBOU1N0cmluZyAqbmFtZTsKLSAgR1BCQW55ICp2YWx1ZTsKLX0gR1BCT3B0aW9uX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJuYW1lIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQk9wdGlvbl9GaWVsZE51bWJlcl9OYW1lLAotICAgICAgICAuaGFzSW5kZXggPSAwLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQk9wdGlvbl9fc3RvcmFnZV8sIG5hbWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZVN0cmluZywKLSAgICAgIH0sCi0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gInZhbHVlIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gR1BCU3RyaW5naWZ5U3ltYm9sKEdQQkFueSksCi0gICAgICAgIC5udW1iZXIgPSBHUEJPcHRpb25fRmllbGROdW1iZXJfVmFsdWUsCi0gICAgICAgIC5oYXNJbmRleCA9IDEsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCT3B0aW9uX19zdG9yYWdlXywgdmFsdWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZU1lc3NhZ2UsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQk9wdGlvbiBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQlR5cGVSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJUeXBlUm9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQk9wdGlvbl9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1dyYXBwZXJzLnBib2JqYy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvV3JhcHBlcnMucGJvYmpjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2NTEwNTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvb2JqZWN0aXZlYy9nb29nbGUvcHJvdG9idWYvV3JhcHBlcnMucGJvYmpjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxODIgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvCi0KLSNpbXBvcnQgIkdQQlByb3RvY29sQnVmZmVycy5oIgotCi0jaWYgR09PR0xFX1BST1RPQlVGX09CSkNfR0VOX1ZFUlNJT04gIT0gMzAwMDEKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIGRpZmZlcmVudCB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcyBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5IHNvdXJjZXMuCi0jZW5kaWYKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwdXNoCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCAiLVdkZXByZWNhdGVkLWRlY2xhcmF0aW9ucyIKLQotQ0ZfRVhURVJOX0NfQkVHSU4KLQotTlNfQVNTVU1FX05PTk5VTExfQkVHSU4KLQotI3ByYWdtYSBtYXJrIC0gR1BCV3JhcHBlcnNSb290Ci0KLS8vLyBFeHBvc2VzIHRoZSBleHRlbnNpb24gcmVnaXN0cnkgZm9yIHRoaXMgZmlsZS4KLS8vLwotLy8vIFRoZSBiYXNlIGNsYXNzIHByb3ZpZGVzOgotLy8vIEBjb2RlCi0vLy8gICArIChHUEJFeHRlbnNpb25SZWdpc3RyeSAqKWV4dGVuc2lvblJlZ2lzdHJ5OwotLy8vIEBlbmRjb2RlCi0vLy8gd2hpY2ggaXMgYSBAYyBHUEJFeHRlbnNpb25SZWdpc3RyeSB0aGF0IGluY2x1ZGVzIGFsbCB0aGUgZXh0ZW5zaW9ucyBkZWZpbmVkIGJ5Ci0vLy8gdGhpcyBmaWxlIGFuZCBhbGwgZmlsZXMgdGhhdCBpdCBkZXBlbmRzIG9uLgotQGludGVyZmFjZSBHUEJXcmFwcGVyc1Jvb3QgOiBHUEJSb290T2JqZWN0Ci1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQkRvdWJsZVZhbHVlCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCRG91YmxlVmFsdWVfRmllbGROdW1iZXIpIHsKLSAgR1BCRG91YmxlVmFsdWVfRmllbGROdW1iZXJfVmFsdWUgPSAxLAotfTsKLQotLy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYGRvdWJsZWAuCi0vLy8KLS8vLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYERvdWJsZVZhbHVlYCBpcyBKU09OIG51bWJlci4KLUBpbnRlcmZhY2UgR1BCRG91YmxlVmFsdWUgOiBHUEJNZXNzYWdlCi0KLS8vLyBUaGUgZG91YmxlIHZhbHVlLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBkb3VibGUgdmFsdWU7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCRmxvYXRWYWx1ZQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQkZsb2F0VmFsdWVfRmllbGROdW1iZXIpIHsKLSAgR1BCRmxvYXRWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSA9IDEsCi19OwotCi0vLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgZmxvYXRgLgotLy8vCi0vLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBGbG9hdFZhbHVlYCBpcyBKU09OIG51bWJlci4KLUBpbnRlcmZhY2UgR1BCRmxvYXRWYWx1ZSA6IEdQQk1lc3NhZ2UKLQotLy8vIFRoZSBmbG9hdCB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgZmxvYXQgdmFsdWU7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCSW50NjRWYWx1ZQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQkludDY0VmFsdWVfRmllbGROdW1iZXIpIHsKLSAgR1BCSW50NjRWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSA9IDEsCi19OwotCi0vLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgaW50NjRgLgotLy8vCi0vLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBJbnQ2NFZhbHVlYCBpcyBKU09OIHN0cmluZy4KLUBpbnRlcmZhY2UgR1BCSW50NjRWYWx1ZSA6IEdQQk1lc3NhZ2UKLQotLy8vIFRoZSBpbnQ2NCB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgaW50NjRfdCB2YWx1ZTsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJVSW50NjRWYWx1ZQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQlVJbnQ2NFZhbHVlX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQlVJbnQ2NFZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlID0gMSwKLX07Ci0KLS8vLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGB1aW50NjRgLgotLy8vCi0vLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBVSW50NjRWYWx1ZWAgaXMgSlNPTiBzdHJpbmcuCi1AaW50ZXJmYWNlIEdQQlVJbnQ2NFZhbHVlIDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIHVpbnQ2NCB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgdWludDY0X3QgdmFsdWU7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCSW50MzJWYWx1ZQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQkludDMyVmFsdWVfRmllbGROdW1iZXIpIHsKLSAgR1BCSW50MzJWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSA9IDEsCi19OwotCi0vLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgaW50MzJgLgotLy8vCi0vLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBJbnQzMlZhbHVlYCBpcyBKU09OIG51bWJlci4KLUBpbnRlcmZhY2UgR1BCSW50MzJWYWx1ZSA6IEdQQk1lc3NhZ2UKLQotLy8vIFRoZSBpbnQzMiB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgaW50MzJfdCB2YWx1ZTsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJVSW50MzJWYWx1ZQotCi10eXBlZGVmIEdQQl9FTlVNKEdQQlVJbnQzMlZhbHVlX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQlVJbnQzMlZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlID0gMSwKLX07Ci0KLS8vLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGB1aW50MzJgLgotLy8vCi0vLy8gVGhlIEpTT04gcmVwcmVzZW50YXRpb24gZm9yIGBVSW50MzJWYWx1ZWAgaXMgSlNPTiBudW1iZXIuCi1AaW50ZXJmYWNlIEdQQlVJbnQzMlZhbHVlIDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIHVpbnQzMiB2YWx1ZS4KLUBwcm9wZXJ0eShub25hdG9taWMsIHJlYWR3cml0ZSkgdWludDMyX3QgdmFsdWU7Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCQm9vbFZhbHVlCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCQm9vbFZhbHVlX0ZpZWxkTnVtYmVyKSB7Ci0gIEdQQkJvb2xWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSA9IDEsCi19OwotCi0vLy8gV3JhcHBlciBtZXNzYWdlIGZvciBgYm9vbGAuCi0vLy8KLS8vLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYEJvb2xWYWx1ZWAgaXMgSlNPTiBgdHJ1ZWAgYW5kIGBmYWxzZWAuCi1AaW50ZXJmYWNlIEdQQkJvb2xWYWx1ZSA6IEdQQk1lc3NhZ2UKLQotLy8vIFRoZSBib29sIHZhbHVlLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlKSBCT09MIHZhbHVlOwotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQlN0cmluZ1ZhbHVlCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCU3RyaW5nVmFsdWVfRmllbGROdW1iZXIpIHsKLSAgR1BCU3RyaW5nVmFsdWVfRmllbGROdW1iZXJfVmFsdWUgPSAxLAotfTsKLQotLy8vIFdyYXBwZXIgbWVzc2FnZSBmb3IgYHN0cmluZ2AuCi0vLy8KLS8vLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYFN0cmluZ1ZhbHVlYCBpcyBKU09OIHN0cmluZy4KLUBpbnRlcmZhY2UgR1BCU3RyaW5nVmFsdWUgOiBHUEJNZXNzYWdlCi0KLS8vLyBUaGUgc3RyaW5nIHZhbHVlLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TU3RyaW5nICp2YWx1ZTsKLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJCeXRlc1ZhbHVlCi0KLXR5cGVkZWYgR1BCX0VOVU0oR1BCQnl0ZXNWYWx1ZV9GaWVsZE51bWJlcikgewotICBHUEJCeXRlc1ZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlID0gMSwKLX07Ci0KLS8vLyBXcmFwcGVyIG1lc3NhZ2UgZm9yIGBieXRlc2AuCi0vLy8KLS8vLyBUaGUgSlNPTiByZXByZXNlbnRhdGlvbiBmb3IgYEJ5dGVzVmFsdWVgIGlzIEpTT04gc3RyaW5nLgotQGludGVyZmFjZSBHUEJCeXRlc1ZhbHVlIDogR1BCTWVzc2FnZQotCi0vLy8gVGhlIGJ5dGVzIHZhbHVlLgotQHByb3BlcnR5KG5vbmF0b21pYywgcmVhZHdyaXRlLCBjb3B5LCBudWxsX3Jlc2V0dGFibGUpIE5TRGF0YSAqdmFsdWU7Ci0KLUBlbmQKLQotTlNfQVNTVU1FX05PTk5VTExfRU5ECi0KLUNGX0VYVEVSTl9DX0VORAotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcG9wCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9vYmplY3RpdmVjL2dvb2dsZS9wcm90b2J1Zi9XcmFwcGVycy5wYm9iamMubSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1dyYXBwZXJzLnBib2JqYy5tCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1Y2M2YzJlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL29iamVjdGl2ZWMvZ29vZ2xlL3Byb3RvYnVmL1dyYXBwZXJzLnBib2JqYy5tCisrKyAvZGV2L251bGwKQEAgLTEsNDIwICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bwotCi0jaW1wb3J0ICJHUEJQcm90b2NvbEJ1ZmZlcnNfUnVudGltZVN1cHBvcnQuaCIKLSNpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9XcmFwcGVycy5wYm9iamMuaCIKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0jcHJhZ21hIGNsYW5nIGRpYWdub3N0aWMgcHVzaAotI3ByYWdtYSBjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgIi1XZGVwcmVjYXRlZC1kZWNsYXJhdGlvbnMiCi0KLSNwcmFnbWEgbWFyayAtIEdQQldyYXBwZXJzUm9vdAotCi1AaW1wbGVtZW50YXRpb24gR1BCV3JhcHBlcnNSb290Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCV3JhcHBlcnNSb290X0ZpbGVEZXNjcmlwdG9yCi0KLXN0YXRpYyBHUEJGaWxlRGVzY3JpcHRvciAqR1BCV3JhcHBlcnNSb290X0ZpbGVEZXNjcmlwdG9yKHZvaWQpIHsKLSAgLy8gVGhpcyBpcyBjYWxsZWQgYnkgK2luaXRpYWxpemUgc28gdGhlcmUgaXMgbm8gbmVlZCB0byB3b3JyeQotICAvLyBhYm91dCB0aHJlYWQgc2FmZXR5IG9mIHRoZSBzaW5nbGV0b24uCi0gIHN0YXRpYyBHUEJGaWxlRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IE5VTEw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIEdQQkRlYnVnQ2hlY2tSdW50aW1lVmVyc2lvbigpOwotICAgIGRlc2NyaXB0b3IgPSBbW0dQQkZpbGVEZXNjcmlwdG9yIGFsbG9jXSBpbml0V2l0aFBhY2thZ2U6QCJnb29nbGUucHJvdG9idWYiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheDpHUEJGaWxlU3ludGF4UHJvdG8zXTsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotI3ByYWdtYSBtYXJrIC0gR1BCRG91YmxlVmFsdWUKLQotQGltcGxlbWVudGF0aW9uIEdQQkRvdWJsZVZhbHVlCi0KLUBkeW5hbWljIHZhbHVlOwotCi10eXBlZGVmIHN0cnVjdCBHUEJEb3VibGVWYWx1ZV9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBkb3VibGUgdmFsdWU7Ci19IEdQQkRvdWJsZVZhbHVlX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJ2YWx1ZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJEb3VibGVWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSwKLSAgICAgICAgLmhhc0luZGV4ID0gMCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJEb3VibGVWYWx1ZV9fc3RvcmFnZV8sIHZhbHVlKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVEb3VibGUsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQkRvdWJsZVZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCV3JhcHBlcnNSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJXcmFwcGVyc1Jvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJEb3VibGVWYWx1ZV9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJGbG9hdFZhbHVlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJGbG9hdFZhbHVlCi0KLUBkeW5hbWljIHZhbHVlOwotCi10eXBlZGVmIHN0cnVjdCBHUEJGbG9hdFZhbHVlX19zdG9yYWdlXyB7Ci0gIHVpbnQzMl90IF9oYXNfc3RvcmFnZV9bMV07Ci0gIGZsb2F0IHZhbHVlOwotfSBHUEJGbG9hdFZhbHVlX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJ2YWx1ZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJGbG9hdFZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSAwLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkZsb2F0VmFsdWVfX3N0b3JhZ2VfLCB2YWx1ZSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlRmxvYXQsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQkZsb2F0VmFsdWUgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENsYXNzOltHUEJXcmFwcGVyc1Jvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQldyYXBwZXJzUm9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQkZsb2F0VmFsdWVfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCSW50NjRWYWx1ZQotCi1AaW1wbGVtZW50YXRpb24gR1BCSW50NjRWYWx1ZQotCi1AZHluYW1pYyB2YWx1ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCSW50NjRWYWx1ZV9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBpbnQ2NF90IHZhbHVlOwotfSBHUEJJbnQ2NFZhbHVlX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJ2YWx1ZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJJbnQ2NFZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSAwLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQkludDY0VmFsdWVfX3N0b3JhZ2VfLCB2YWx1ZSksCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlSW50NjQsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQkludDY0VmFsdWUgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENsYXNzOltHUEJXcmFwcGVyc1Jvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQldyYXBwZXJzUm9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQkludDY0VmFsdWVfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCVUludDY0VmFsdWUKLQotQGltcGxlbWVudGF0aW9uIEdQQlVJbnQ2NFZhbHVlCi0KLUBkeW5hbWljIHZhbHVlOwotCi10eXBlZGVmIHN0cnVjdCBHUEJVSW50NjRWYWx1ZV9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICB1aW50NjRfdCB2YWx1ZTsKLX0gR1BCVUludDY0VmFsdWVfX3N0b3JhZ2VfOwotCi0vLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWRzYWZlIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGx5IGNhbGxlZAotLy8gaW4gK2luaXRpYWxpemUgZm9yIGVhY2ggc3ViY2xhc3MuCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7Ci0gIHN0YXRpYyBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gbmlsOwotICBpZiAoIWRlc2NyaXB0b3IpIHsKLSAgICBzdGF0aWMgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gZmllbGRzW10gPSB7Ci0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gInZhbHVlIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQlVJbnQ2NFZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSAwLAotICAgICAgICAub2Zmc2V0ID0gKHVpbnQzMl90KW9mZnNldG9mKEdQQlVJbnQ2NFZhbHVlX19zdG9yYWdlXywgdmFsdWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZVVJbnQ2NCwKLSAgICAgIH0sCi0gICAgfTsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCVUludDY0VmFsdWUgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcm9vdENsYXNzOltHUEJXcmFwcGVyc1Jvb3QgY2xhc3NdCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlOkdQQldyYXBwZXJzUm9vdF9GaWxlRGVzY3JpcHRvcigpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRzOmZpZWxkcwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRDb3VudDoodWludDMyX3QpKHNpemVvZihmaWVsZHMpIC8gc2l6ZW9mKEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RvcmFnZVNpemU6c2l6ZW9mKEdQQlVJbnQ2NFZhbHVlX19zdG9yYWdlXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6MF07Ci0gICAgTlNBc3NlcnQoZGVzY3JpcHRvciA9PSBuaWwsIEAiU3RhcnR1cCByZWN1cnNlZCEiKTsKLSAgICBkZXNjcmlwdG9yID0gbG9jYWxEZXNjcmlwdG9yOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQkludDMyVmFsdWUKLQotQGltcGxlbWVudGF0aW9uIEdQQkludDMyVmFsdWUKLQotQGR5bmFtaWMgdmFsdWU7Ci0KLXR5cGVkZWYgc3RydWN0IEdQQkludDMyVmFsdWVfX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLSAgaW50MzJfdCB2YWx1ZTsKLX0gR1BCSW50MzJWYWx1ZV9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAidmFsdWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCSW50MzJWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSwKLSAgICAgICAgLmhhc0luZGV4ID0gMCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJJbnQzMlZhbHVlX19zdG9yYWdlXywgdmFsdWUpLAotICAgICAgICAuZmxhZ3MgPSBHUEJGaWVsZE9wdGlvbmFsLAotICAgICAgICAuZGF0YVR5cGUgPSBHUEJEYXRhVHlwZUludDMyLAotICAgICAgfSwKLSAgICB9OwotICAgIEdQQkRlc2NyaXB0b3IgKmxvY2FsRGVzY3JpcHRvciA9Ci0gICAgICAgIFtHUEJEZXNjcmlwdG9yIGFsbG9jRGVzY3JpcHRvckZvckNsYXNzOltHUEJJbnQzMlZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCV3JhcHBlcnNSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJXcmFwcGVyc1Jvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJJbnQzMlZhbHVlX19zdG9yYWdlXykKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZ3M6MF07Ci0gICAgTlNBc3NlcnQoZGVzY3JpcHRvciA9PSBuaWwsIEAiU3RhcnR1cCByZWN1cnNlZCEiKTsKLSAgICBkZXNjcmlwdG9yID0gbG9jYWxEZXNjcmlwdG9yOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotCi1AZW5kCi0KLSNwcmFnbWEgbWFyayAtIEdQQlVJbnQzMlZhbHVlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJVSW50MzJWYWx1ZQotCi1AZHluYW1pYyB2YWx1ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCVUludDMyVmFsdWVfX3N0b3JhZ2VfIHsKLSAgdWludDMyX3QgX2hhc19zdG9yYWdlX1sxXTsKLSAgdWludDMyX3QgdmFsdWU7Ci19IEdQQlVJbnQzMlZhbHVlX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJ2YWx1ZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJVSW50MzJWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSwKLSAgICAgICAgLmhhc0luZGV4ID0gMCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJVSW50MzJWYWx1ZV9fc3RvcmFnZV8sIHZhbHVlKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVVSW50MzIsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQlVJbnQzMlZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCV3JhcHBlcnNSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJXcmFwcGVyc1Jvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJVSW50MzJWYWx1ZV9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJCb29sVmFsdWUKLQotQGltcGxlbWVudGF0aW9uIEdQQkJvb2xWYWx1ZQotCi1AZHluYW1pYyB2YWx1ZTsKLQotdHlwZWRlZiBzdHJ1Y3QgR1BCQm9vbFZhbHVlX19zdG9yYWdlXyB7Ci0gIHVpbnQzMl90IF9oYXNfc3RvcmFnZV9bMV07Ci19IEdQQkJvb2xWYWx1ZV9fc3RvcmFnZV87Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHRocmVhZHNhZmUgYmVjYXVzZSBpdCBpcyBpbml0aWFsbHkgY2FsbGVkCi0vLyBpbiAraW5pdGlhbGl6ZSBmb3IgZWFjaCBzdWJjbGFzcy4KLSsgKEdQQkRlc2NyaXB0b3IgKilkZXNjcmlwdG9yIHsKLSAgc3RhdGljIEdQQkRlc2NyaXB0b3IgKmRlc2NyaXB0b3IgPSBuaWw7Ci0gIGlmICghZGVzY3JpcHRvcikgewotICAgIHN0YXRpYyBHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbiBmaWVsZHNbXSA9IHsKLSAgICAgIHsKLSAgICAgICAgLm5hbWUgPSAidmFsdWUiLAotICAgICAgICAuZGF0YVR5cGVTcGVjaWZpYy5jbGFzc05hbWUgPSBOVUxMLAotICAgICAgICAubnVtYmVyID0gR1BCQm9vbFZhbHVlX0ZpZWxkTnVtYmVyX1ZhbHVlLAotICAgICAgICAuaGFzSW5kZXggPSAwLAotICAgICAgICAub2Zmc2V0ID0gMSwgIC8vIFN0b3JlZCBpbiBfaGFzX3N0b3JhZ2VfIHRvIHNhdmUgc3BhY2UuCi0gICAgICAgIC5mbGFncyA9IEdQQkZpZWxkT3B0aW9uYWwsCi0gICAgICAgIC5kYXRhVHlwZSA9IEdQQkRhdGFUeXBlQm9vbCwKLSAgICAgIH0sCi0gICAgfTsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCQm9vbFZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCV3JhcHBlcnNSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJXcmFwcGVyc1Jvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJCb29sVmFsdWVfX3N0b3JhZ2VfKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmbGFnczowXTsKLSAgICBOU0Fzc2VydChkZXNjcmlwdG9yID09IG5pbCwgQCJTdGFydHVwIHJlY3Vyc2VkISIpOwotICAgIGRlc2NyaXB0b3IgPSBsb2NhbERlc2NyaXB0b3I7Ci0gIH0KLSAgcmV0dXJuIGRlc2NyaXB0b3I7Ci19Ci0KLUBlbmQKLQotI3ByYWdtYSBtYXJrIC0gR1BCU3RyaW5nVmFsdWUKLQotQGltcGxlbWVudGF0aW9uIEdQQlN0cmluZ1ZhbHVlCi0KLUBkeW5hbWljIHZhbHVlOwotCi10eXBlZGVmIHN0cnVjdCBHUEJTdHJpbmdWYWx1ZV9fc3RvcmFnZV8gewotICB1aW50MzJfdCBfaGFzX3N0b3JhZ2VfWzFdOwotICBOU1N0cmluZyAqdmFsdWU7Ci19IEdQQlN0cmluZ1ZhbHVlX19zdG9yYWdlXzsKLQotLy8gVGhpcyBtZXRob2QgaXMgdGhyZWFkc2FmZSBiZWNhdXNlIGl0IGlzIGluaXRpYWxseSBjYWxsZWQKLS8vIGluICtpbml0aWFsaXplIGZvciBlYWNoIHN1YmNsYXNzLgotKyAoR1BCRGVzY3JpcHRvciAqKWRlc2NyaXB0b3IgewotICBzdGF0aWMgR1BCRGVzY3JpcHRvciAqZGVzY3JpcHRvciA9IG5pbDsKLSAgaWYgKCFkZXNjcmlwdG9yKSB7Ci0gICAgc3RhdGljIEdQQk1lc3NhZ2VGaWVsZERlc2NyaXB0aW9uIGZpZWxkc1tdID0gewotICAgICAgewotICAgICAgICAubmFtZSA9ICJ2YWx1ZSIsCi0gICAgICAgIC5kYXRhVHlwZVNwZWNpZmljLmNsYXNzTmFtZSA9IE5VTEwsCi0gICAgICAgIC5udW1iZXIgPSBHUEJTdHJpbmdWYWx1ZV9GaWVsZE51bWJlcl9WYWx1ZSwKLSAgICAgICAgLmhhc0luZGV4ID0gMCwKLSAgICAgICAgLm9mZnNldCA9ICh1aW50MzJfdClvZmZzZXRvZihHUEJTdHJpbmdWYWx1ZV9fc3RvcmFnZV8sIHZhbHVlKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVTdHJpbmcsCi0gICAgICB9LAotICAgIH07Ci0gICAgR1BCRGVzY3JpcHRvciAqbG9jYWxEZXNjcmlwdG9yID0KLSAgICAgICAgW0dQQkRlc2NyaXB0b3IgYWxsb2NEZXNjcmlwdG9yRm9yQ2xhc3M6W0dQQlN0cmluZ1ZhbHVlIGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJvb3RDbGFzczpbR1BCV3JhcHBlcnNSb290IGNsYXNzXQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZTpHUEJXcmFwcGVyc1Jvb3RfRmlsZURlc2NyaXB0b3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkczpmaWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkQ291bnQ6KHVpbnQzMl90KShzaXplb2YoZmllbGRzKSAvIHNpemVvZihHUEJNZXNzYWdlRmllbGREZXNjcmlwdGlvbikpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0b3JhZ2VTaXplOnNpemVvZihHUEJTdHJpbmdWYWx1ZV9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi0jcHJhZ21hIG1hcmsgLSBHUEJCeXRlc1ZhbHVlCi0KLUBpbXBsZW1lbnRhdGlvbiBHUEJCeXRlc1ZhbHVlCi0KLUBkeW5hbWljIHZhbHVlOwotCi10eXBlZGVmIHN0cnVjdCBHUEJCeXRlc1ZhbHVlX19zdG9yYWdlXyB7Ci0gIHVpbnQzMl90IF9oYXNfc3RvcmFnZV9bMV07Ci0gIE5TRGF0YSAqdmFsdWU7Ci19IEdQQkJ5dGVzVmFsdWVfX3N0b3JhZ2VfOwotCi0vLyBUaGlzIG1ldGhvZCBpcyB0aHJlYWRzYWZlIGJlY2F1c2UgaXQgaXMgaW5pdGlhbGx5IGNhbGxlZAotLy8gaW4gK2luaXRpYWxpemUgZm9yIGVhY2ggc3ViY2xhc3MuCi0rIChHUEJEZXNjcmlwdG9yICopZGVzY3JpcHRvciB7Ci0gIHN0YXRpYyBHUEJEZXNjcmlwdG9yICpkZXNjcmlwdG9yID0gbmlsOwotICBpZiAoIWRlc2NyaXB0b3IpIHsKLSAgICBzdGF0aWMgR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24gZmllbGRzW10gPSB7Ci0gICAgICB7Ci0gICAgICAgIC5uYW1lID0gInZhbHVlIiwKLSAgICAgICAgLmRhdGFUeXBlU3BlY2lmaWMuY2xhc3NOYW1lID0gTlVMTCwKLSAgICAgICAgLm51bWJlciA9IEdQQkJ5dGVzVmFsdWVfRmllbGROdW1iZXJfVmFsdWUsCi0gICAgICAgIC5oYXNJbmRleCA9IDAsCi0gICAgICAgIC5vZmZzZXQgPSAodWludDMyX3Qpb2Zmc2V0b2YoR1BCQnl0ZXNWYWx1ZV9fc3RvcmFnZV8sIHZhbHVlKSwKLSAgICAgICAgLmZsYWdzID0gR1BCRmllbGRPcHRpb25hbCwKLSAgICAgICAgLmRhdGFUeXBlID0gR1BCRGF0YVR5cGVCeXRlcywKLSAgICAgIH0sCi0gICAgfTsKLSAgICBHUEJEZXNjcmlwdG9yICpsb2NhbERlc2NyaXB0b3IgPQotICAgICAgICBbR1BCRGVzY3JpcHRvciBhbGxvY0Rlc2NyaXB0b3JGb3JDbGFzczpbR1BCQnl0ZXNWYWx1ZSBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByb290Q2xhc3M6W0dQQldyYXBwZXJzUm9vdCBjbGFzc10KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGU6R1BCV3JhcHBlcnNSb290X0ZpbGVEZXNjcmlwdG9yKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZHM6ZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZENvdW50Oih1aW50MzJfdCkoc2l6ZW9mKGZpZWxkcykgLyBzaXplb2YoR1BCTWVzc2FnZUZpZWxkRGVzY3JpcHRpb24pKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdG9yYWdlU2l6ZTpzaXplb2YoR1BCQnl0ZXNWYWx1ZV9fc3RvcmFnZV8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZsYWdzOjBdOwotICAgIE5TQXNzZXJ0KGRlc2NyaXB0b3IgPT0gbmlsLCBAIlN0YXJ0dXAgcmVjdXJzZWQhIik7Ci0gICAgZGVzY3JpcHRvciA9IGxvY2FsRGVzY3JpcHRvcjsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcjsKLX0KLQotQGVuZAotCi0KLSNwcmFnbWEgY2xhbmcgZGlhZ25vc3RpYyBwb3AKLQotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL2NvbmZpZy5tNCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL2NvbmZpZy5tNApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjU5NDZmNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9waHAvZXh0L2dvb2dsZS9wcm90b2J1Zi9jb25maWcubTQKKysrIC9kZXYvbnVsbApAQCAtMSwxMCArMCwwIEBACi1kbmwgbGluZXMgc3RhcnRpbmcgd2l0aCAiZG5sIiBhcmUgY29tbWVudHMKLQotUEhQX0FSR19FTkFCTEUocHJvdG9idWYsIHdoZXRoZXIgdG8gZW5hYmxlIFByb3RvYnVmIGV4dGVuc2lvbiwgWyAgLS1lbmFibGUtcHJvdG9idWYgICBFbmFibGUgUHJvdG9idWYgZXh0ZW5zaW9uXSkKLQotaWYgdGVzdCAiJFBIUF9QUk9UT0JVRiIgIT0gIm5vIjsgdGhlbgotCi0gIGRubCB0aGlzIGRlZmluZXMgdGhlIGV4dGVuc2lvbgotICBQSFBfTkVXX0VYVEVOU0lPTihwcm90b2J1ZiwgdXBiLmMgcHJvdG9idWYuYyBkZWYuYyBtZXNzYWdlLmMgc3RvcmFnZS5jLCAkZXh0X3NoYXJlZCkKLQotZmkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL2RlZi5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvZGVmLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjMTg4MDYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvZGVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwzODEgKzAsMCBAQAotI2luY2x1ZGUgInByb3RvYnVmLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDb21tb24gVXRpbGl0aWVzCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIGNoZWNrX3VwYl9zdGF0dXMoY29uc3QgdXBiX3N0YXR1cyogc3RhdHVzLCBjb25zdCBjaGFyKiBtc2cpIHsKLSAgaWYgKCF1cGJfb2soc3RhdHVzKSkgewotICAgIHplbmRfZXJyb3IoIiVzOiAlc1xuIiwgbXNnLCB1cGJfc3RhdHVzX2Vycm1zZyhzdGF0dXMpKTsKLSAgfQotfQotCi0KLXN0YXRpYyB1cGJfZGVmICpjaGVja19ub3Rmcm96ZW4oY29uc3QgdXBiX2RlZiAqZGVmKSB7Ci0gIGlmICh1cGJfZGVmX2lzZnJvemVuKGRlZikpIHsKLSAgICB6ZW5kX2Vycm9yKEVfRVJST1IsCi0gICAgICAgICAgICAgICAiQXR0ZW1wdCB0byBtb2RpZnkgYSBmcm96ZW4gZGVzY3JpcHRvci4gT25jZSBkZXNjcmlwdG9ycyBhcmUgIgotICAgICAgICAgICAgICAgImFkZGVkIHRvIHRoZSBkZXNjcmlwdG9yIHBvb2wsIHRoZXkgbWF5IG5vdCBiZSBtb2RpZmllZC4iKTsKLSAgfQotICByZXR1cm4gKHVwYl9kZWYgKilkZWY7Ci19Ci0KLXN0YXRpYyB1cGJfbXNnZGVmICpjaGVja19tc2dkZWZfbm90ZnJvemVuKGNvbnN0IHVwYl9tc2dkZWYgKmRlZikgewotICByZXR1cm4gdXBiX2Rvd25jYXN0X21zZ2RlZl9tdXRhYmxlKGNoZWNrX25vdGZyb3plbigoY29uc3QgdXBiX2RlZiAqKWRlZikpOwotfQotCi1zdGF0aWMgdXBiX2ZpZWxkZGVmICpjaGVja19maWVsZGRlZl9ub3Rmcm96ZW4oY29uc3QgdXBiX2ZpZWxkZGVmICpkZWYpIHsKLSAgcmV0dXJuIHVwYl9kb3duY2FzdF9maWVsZGRlZl9tdXRhYmxlKGNoZWNrX25vdGZyb3plbigoY29uc3QgdXBiX2RlZiAqKWRlZikpOwotfQotCi0jZGVmaW5lIFBST1RPQlVGX1dSQVBfSU5URVJOKHdyYXBwZXIsIGludGVybiwgaW50ZXJuX2R0b3IpICAgICAgICAgICAgXAotICBaX1RZUEVfUCh3cmFwcGVyKSA9IElTX09CSkVDVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgWl9PQkpWQUxfUCh3cmFwcGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAuaGFuZGxlID0gemVuZF9vYmplY3RzX3N0b3JlX3B1dCggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaW50ZXJuLCAoemVuZF9vYmplY3RzX3N0b3JlX2R0b3JfdCl6ZW5kX29iamVjdHNfZGVzdHJveV9vYmplY3QsIFwKLSAgICAgIGludGVybl9kdG9yLCBOVUxMIFRTUk1MU19DQyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFpfT0JKVkFMX1Aod3JhcHBlcikuaGFuZGxlcnMgPSB6ZW5kX2dldF9zdGRfb2JqZWN0X2hhbmRsZXJzKCk7Ci0KLSNkZWZpbmUgUFJPVE9CVUZfU0VUVVBfWkVORF9XUkFQUEVSKGNsYXNzX25hbWUsIGNsYXNzX25hbWVfbG93ZXIsIHdyYXBwZXIsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgWl9UWVBFX1Aod3JhcHBlcikgPSBJU19PQkpFQ1Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3NfbmFtZSAqaW50ZXJuID0gQUxMT0MoY2xhc3NfbmFtZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbWVtc2V0KGludGVybiwgMCwgc2l6ZW9mKGNsYXNzX25hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3NfbmFtZV9sb3dlciMjX2luaXRfY19pbnN0YW5jZShpbnRlcm4gVFNSTUxTX0NDKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgWl9PQkpWQUxfUCh3cmFwcGVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIC5oYW5kbGUgPSB6ZW5kX29iamVjdHNfc3RvcmVfcHV0KGludGVybiwgTlVMTCwgY2xhc3NfbmFtZV9sb3dlciMjX2ZyZWUsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgVFNSTUxTX0NDKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgWl9PQkpWQUxfUCh3cmFwcGVyKS5oYW5kbGVycyA9IHplbmRfZ2V0X3N0ZF9vYmplY3RfaGFuZGxlcnMoKTsKLQotI2RlZmluZSBQUk9UT0JVRl9DUkVBVEVfWkVORF9XUkFQUEVSKGNsYXNzX25hbWUsIGNsYXNzX25hbWVfbG93ZXIsIHdyYXBwZXIsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm4pICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIE1BS0VfU1REX1pWQUwod3JhcHBlcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBQUk9UT0JVRl9TRVRVUF9aRU5EX1dSQVBQRVIoY2xhc3NfbmFtZSwgY2xhc3NfbmFtZV9sb3dlciwgd3JhcHBlciwgaW50ZXJuKTsKLQotI2RlZmluZSBERUZJTkVfQ0xBU1MobmFtZSwgbmFtZV9sb3dlciwgc3RyaW5nX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHplbmRfY2xhc3NfZW50cnkgKm5hbWVfbG93ZXIjI190eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBuYW1lX2xvd2VyIyNfaW5pdChUU1JNTFNfRCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHplbmRfY2xhc3NfZW50cnkgY2xhc3NfdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgSU5JVF9DTEFTU19FTlRSWShjbGFzc190eXBlLCBzdHJpbmdfbmFtZSwgbmFtZV9sb3dlciMjX21ldGhvZHMpOyAgICAgICAgIFwKLSAgICBuYW1lX2xvd2VyIyNfdHlwZSA9IHplbmRfcmVnaXN0ZXJfaW50ZXJuYWxfY2xhc3MoJmNsYXNzX3R5cGUgVFNSTUxTX0NDKTsgXAotICAgIG5hbWVfbG93ZXIjI190eXBlLT5jcmVhdGVfb2JqZWN0ID0gbmFtZV9sb3dlciMjX2NyZWF0ZTsgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbmFtZSAqcGhwX3RvXyMjbmFtZV9sb3dlcih6dmFsICp2YWwgVFNSTUxTX0RDKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiAobmFtZSAqKXplbmRfb2JqZWN0X3N0b3JlX2dldF9vYmplY3QodmFsIFRTUk1MU19DQyk7ICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdm9pZCBuYW1lX2xvd2VyIyNfZnJlZSh2b2lkICpvYmplY3QgVFNSTUxTX0RDKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG5hbWUgKmludGVybiA9IChuYW1lICopb2JqZWN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbmFtZV9sb3dlciMjX2ZyZWVfYyhpbnRlcm4gVFNSTUxTX0NDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBlZnJlZShvYmplY3QpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHplbmRfb2JqZWN0X3ZhbHVlIG5hbWVfbG93ZXIjI19jcmVhdGUoemVuZF9jbGFzc19lbnRyeSAqY2UgVFNSTUxTX0RDKSB7ICAgIFwKLSAgICB6ZW5kX29iamVjdF92YWx1ZSByZXR1cm5fdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG5hbWUgKmludGVybiA9IChuYW1lICopZW1hbGxvYyhzaXplb2YobmFtZSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbWVtc2V0KGludGVybiwgMCwgc2l6ZW9mKG5hbWUpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBuYW1lX2xvd2VyIyNfaW5pdF9jX2luc3RhbmNlKGludGVybiBUU1JNTFNfQ0MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybl92YWx1ZS5oYW5kbGUgPSB6ZW5kX29iamVjdHNfc3RvcmVfcHV0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGludGVybiwgKHplbmRfb2JqZWN0c19zdG9yZV9kdG9yX3QpemVuZF9vYmplY3RzX2Rlc3Ryb3lfb2JqZWN0LCAgICAgIFwKLSAgICAgICAgbmFtZV9sb3dlciMjX2ZyZWUsIE5VTEwgVFNSTUxTX0NDKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybl92YWx1ZS5oYW5kbGVycyA9IHplbmRfZ2V0X3N0ZF9vYmplY3RfaGFuZGxlcnMoKTsgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHJldHVybl92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRGVzY3JpcHRvclBvb2wKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB6ZW5kX2Z1bmN0aW9uX2VudHJ5IGRlc2NyaXB0b3JfcG9vbF9tZXRob2RzW10gPSB7Ci0gIFBIUF9NRShEZXNjcmlwdG9yUG9vbCwgYWRkTWVzc2FnZSwgTlVMTCwgWkVORF9BQ0NfUFVCTElDKQotICBQSFBfTUUoRGVzY3JpcHRvclBvb2wsIGZpbmFsaXplLCBOVUxMLCBaRU5EX0FDQ19QVUJMSUMpCi0gIFpFTkRfRkVfRU5ECi19OwotCi1ERUZJTkVfQ0xBU1MoRGVzY3JpcHRvclBvb2wsIGRlc2NyaXB0b3JfcG9vbCwKLSAgICAgICAgICAgICAiR29vZ2xlXFxQcm90b2J1ZlxcRGVzY3JpcHRvclBvb2wiKTsKLQotRGVzY3JpcHRvclBvb2wgKmdlbmVyYXRlZF9wb29sOyAgLy8gVGhlIGFjdHVhbCBnZW5lcmF0ZWQgcG9vbAotCi1aRU5EX0ZVTkNUSU9OKGdldF9nZW5lcmF0ZWRfcG9vbCkgewotICBpZiAoUFJPVE9CVUZfRyhnZW5lcmF0ZWRfcG9vbCkgPT0gTlVMTCkgewotICAgIE1BS0VfU1REX1pWQUwoUFJPVE9CVUZfRyhnZW5lcmF0ZWRfcG9vbCkpOwotICAgIFpfVFlQRV9QKFBST1RPQlVGX0coZ2VuZXJhdGVkX3Bvb2wpKSA9IElTX09CSkVDVDsKLSAgICBnZW5lcmF0ZWRfcG9vbCA9IEFMTE9DKERlc2NyaXB0b3JQb29sKTsKLSAgICBkZXNjcmlwdG9yX3Bvb2xfaW5pdF9jX2luc3RhbmNlKGdlbmVyYXRlZF9wb29sIFRTUk1MU19DQyk7Ci0gICAgWl9PQkpfSEFORExFX1AoUFJPVE9CVUZfRyhnZW5lcmF0ZWRfcG9vbCkpID0gemVuZF9vYmplY3RzX3N0b3JlX3B1dCgKLSAgICAgICAgZ2VuZXJhdGVkX3Bvb2wsIE5VTEwsCi0gICAgICAgICh6ZW5kX29iamVjdHNfZnJlZV9vYmplY3Rfc3RvcmFnZV90KWRlc2NyaXB0b3JfcG9vbF9mcmVlLCBOVUxMIFRTUk1MU19DQyk7Ci0gICAgWl9PQkpfSFRfUChQUk9UT0JVRl9HKGdlbmVyYXRlZF9wb29sKSkgPSB6ZW5kX2dldF9zdGRfb2JqZWN0X2hhbmRsZXJzKCk7Ci0gIH0KLSAgUkVUVVJOX1pWQUwoUFJPVE9CVUZfRyhnZW5lcmF0ZWRfcG9vbCksIDEsIDApOwotfQotCi12b2lkIGRlc2NyaXB0b3JfcG9vbF9pbml0X2NfaW5zdGFuY2UoRGVzY3JpcHRvclBvb2wqIHBvb2wgVFNSTUxTX0RDKSB7Ci0gIHplbmRfb2JqZWN0X3N0ZF9pbml0KCZwb29sLT5zdGQsIGRlc2NyaXB0b3JfcG9vbF90eXBlIFRTUk1MU19DQyk7Ci0gIHBvb2wtPnN5bXRhYiA9IHVwYl9zeW10YWJfbmV3KCZwb29sLT5zeW10YWIpOwotCi0gIEFMTE9DX0hBU0hUQUJMRShwb29sLT5wZW5kaW5nX2xpc3QpOwotICB6ZW5kX2hhc2hfaW5pdChwb29sLT5wZW5kaW5nX2xpc3QsIDEsIE5VTEwsIFpWQUxfUFRSX0RUT1IsIDApOwotfQotCi12b2lkIGRlc2NyaXB0b3JfcG9vbF9mcmVlX2MoRGVzY3JpcHRvclBvb2wgKnBvb2wgVFNSTUxTX0RDKSB7Ci0gIHVwYl9zeW10YWJfdW5yZWYocG9vbC0+c3ltdGFiLCAmcG9vbC0+c3ltdGFiKTsKLSAgemVuZF9oYXNoX2Rlc3Ryb3kocG9vbC0+cGVuZGluZ19saXN0KTsKLSAgRlJFRV9IQVNIVEFCTEUocG9vbC0+cGVuZGluZ19saXN0KTsKLX0KLQotUEhQX01FVEhPRChEZXNjcmlwdG9yUG9vbCwgYWRkTWVzc2FnZSkgewotICBjaGFyICpuYW1lID0gTlVMTDsKLSAgaW50IHN0cl9sZW47Ci0gIGlmICh6ZW5kX3BhcnNlX3BhcmFtZXRlcnMoWkVORF9OVU1fQVJHUygpIFRTUk1MU19DQywgInMiLCAmbmFtZSwgJnN0cl9sZW4pID09Ci0gICAgICBGQUlMVVJFKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgenZhbCogcmV0dmFsID0gTlVMTDsKLSAgUFJPVE9CVUZfQ1JFQVRFX1pFTkRfV1JBUFBFUihNZXNzYWdlQnVpbGRlckNvbnRleHQsIG1lc3NhZ2VfYnVpbGRlcl9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCwgY29udGV4dCk7Ci0KLSAgTUFLRV9TVERfWlZBTChjb250ZXh0LT5wb29sKTsKLSAgWlZBTF9aVkFMKGNvbnRleHQtPnBvb2wsIGdldFRoaXMoKSwgMSwgMCk7Ci0KLSAgRGVzY3JpcHRvciAqZGVzYyA9IHBocF90b19kZXNjcmlwdG9yKGNvbnRleHQtPmRlc2NyaXB0b3IgVFNSTUxTX0NDKTsKLSAgRGVzY3JpcHRvcl9uYW1lX3NldChkZXNjLCBuYW1lKTsKLQotICBSRVRVUk5fWlZBTChyZXR2YWwsIDAsIDEpOwotfQotCi1zdGF0aWMgdm9pZCB2YWxpZGF0ZV9tc2dkZWYoY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmKSB7Ci0gIC8vIFZlcmlmeSB0aGF0IG5vIHJlcXVpcmVkIGZpZWxkcyBleGlzdC4gcHJvdG8zIGRvZXMgbm90IHN1cHBvcnQgdGhlc2UuCi0gIHVwYl9tc2dfZmllbGRfaXRlciBpdDsKLSAgZm9yICh1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpdCwgbXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpdCk7Ci0gICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpdCkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdCk7Ci0gICAgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgPT0gVVBCX0xBQkVMX1JFUVVJUkVEKSB7Ci0gICAgICB6ZW5kX2Vycm9yKEVfRVJST1IsICJSZXF1aXJlZCBmaWVsZHMgYXJlIHVuc3VwcG9ydGVkIGluIHByb3RvMy4iKTsKLSAgICB9Ci0gIH0KLX0KLQotUEhQX01FVEhPRChEZXNjcmlwdG9yUG9vbCwgZmluYWxpemUpIHsKLSAgRGVzY3JpcHRvclBvb2wgKnNlbGYgPSBwaHBfdG9fZGVzY3JpcHRvcl9wb29sKGdldFRoaXMoKSBUU1JNTFNfQ0MpOwotICBCdWNrZXQgKnRlbXA7Ci0gIGludCBpLCBudW07Ci0KLSAgbnVtID0gemVuZF9oYXNoX251bV9lbGVtZW50cyhzZWxmLT5wZW5kaW5nX2xpc3QpOwotICB1cGJfZGVmICoqZGVmcyA9IGVtYWxsb2Moc2l6ZW9mKHVwYl9kZWYgKikgKiBudW0pOwotCi0gIGZvciAoaSA9IDAsIHRlbXAgPSBzZWxmLT5wZW5kaW5nX2xpc3QtPnBMaXN0SGVhZDsgdGVtcCAhPSBOVUxMOwotICAgICAgIHRlbXAgPSB0ZW1wLT5wTGlzdE5leHQpIHsKLSAgICB6dmFsICpkZWZfcGhwID0gKih6dmFsICoqKXRlbXAtPnBEYXRhOwotICAgIERlc2NyaXB0b3IqIGRlc2MgPSBwaHBfdG9fZGVzY3JpcHRvcihkZWZfcGhwIFRTUk1MU19DQyk7Ci0gICAgZGVmc1tpXSA9ICh1cGJfZGVmICopZGVzYy0+bXNnZGVmOwotICAgIHZhbGlkYXRlX21zZ2RlZigoY29uc3QgdXBiX21zZ2RlZiAqKWRlZnNbaSsrXSk7Ci0gIH0KLQotICBDSEVDS19VUEIodXBiX3N5bXRhYl9hZGQoc2VsZi0+c3ltdGFiLCAodXBiX2RlZiAqKilkZWZzLCBudW0sIE5VTEwsICZzdGF0dXMpLAotICAgICAgICAgICAgIlVuYWJsZSB0byBhZGQgZGVmcyB0byBEZXNjcmlwdG9yUG9vbCIpOwotCi0gIGZvciAodGVtcCA9IHNlbGYtPnBlbmRpbmdfbGlzdC0+cExpc3RIZWFkOyB0ZW1wICE9IE5VTEw7Ci0gICAgICAgdGVtcCA9IHRlbXAtPnBMaXN0TmV4dCkgewotICAgIC8vIHp2YWwgKmRlZl9waHAgPSAqKHp2YWwgKiopdGVtcC0+cERhdGE7Ci0gICAgLy8gRGVzY3JpcHRvciogZGVzYyA9IHBocF90b19kZXNjcmlwdG9yKGRlZl9waHAgVFNSTUxTX0NDKTsKLSAgICBidWlsZF9jbGFzc19mcm9tX2Rlc2NyaXB0b3IoKHp2YWwgKil0ZW1wLT5wRGF0YVB0ciBUU1JNTFNfQ0MpOwotICB9Ci0KLSAgRlJFRShkZWZzKTsKLSAgemVuZF9oYXNoX2Rlc3Ryb3koc2VsZi0+cGVuZGluZ19saXN0KTsKLSAgemVuZF9oYXNoX2luaXQoc2VsZi0+cGVuZGluZ19saXN0LCAxLCBOVUxMLCBaVkFMX1BUUl9EVE9SLCAwKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlc2NyaXB0b3IKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB6ZW5kX2Z1bmN0aW9uX2VudHJ5IGRlc2NyaXB0b3JfbWV0aG9kc1tdID0gewotICBaRU5EX0ZFX0VORAotfTsKLQotREVGSU5FX0NMQVNTKERlc2NyaXB0b3IsIGRlc2NyaXB0b3IsICJHb29nbGVcXFByb3RvYnVmXFxEZXNjcmlwdG9yIik7Ci0KLXZvaWQgZGVzY3JpcHRvcl9mcmVlX2MoRGVzY3JpcHRvciAqc2VsZiBUU1JNTFNfREMpIHsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGl0ZXI7Ci0gIHVwYl9tc2dfZmllbGRfYmVnaW4oJml0ZXIsIHNlbGYtPm1zZ2RlZik7Ci0gIHdoaWxlICghdXBiX21zZ19maWVsZF9kb25lKCZpdGVyKSkgewotICAgIHVwYl9maWVsZGRlZiAqZmllbGRkZWYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJml0ZXIpOwotICAgIHVwYl9maWVsZGRlZl91bnJlZihmaWVsZGRlZiwgJmZpZWxkZGVmKTsKLSAgICB1cGJfbXNnX2ZpZWxkX25leHQoJml0ZXIpOwotICB9Ci0gIHVwYl9tc2dkZWZfdW5yZWYoc2VsZi0+bXNnZGVmLCAmc2VsZi0+bXNnZGVmKTsKLSAgaWYgKHNlbGYtPmxheW91dCkgewotICAgIGZyZWVfbGF5b3V0KHNlbGYtPmxheW91dCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZGVzY3JpcHRvcl9hZGRfZmllbGQoRGVzY3JpcHRvciAqZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZmllbGRkZWYpIHsKLSAgdXBiX21zZ2RlZiAqbXV0X2RlZiA9IGNoZWNrX21zZ2RlZl9ub3Rmcm96ZW4oZGVzYy0+bXNnZGVmKTsKLSAgdXBiX2ZpZWxkZGVmICptdXRfZmllbGRfZGVmID0gY2hlY2tfZmllbGRkZWZfbm90ZnJvemVuKGZpZWxkZGVmKTsKLSAgQ0hFQ0tfVVBCKHVwYl9tc2dkZWZfYWRkZmllbGQobXV0X2RlZiwgbXV0X2ZpZWxkX2RlZiwgTlVMTCwgJnN0YXR1cyksCi0gICAgICAgICAgICAiQWRkaW5nIGZpZWxkIHRvIERlc2NyaXB0b3IgZmFpbGVkIik7Ci0gIC8vIGFkZF9kZWZfb2JqKGZpZWxkZGVmLCBvYmopOwotfQotCi12b2lkIGRlc2NyaXB0b3JfaW5pdF9jX2luc3RhbmNlKERlc2NyaXB0b3IqIGRlc2MgVFNSTUxTX0RDKSB7Ci0gIHplbmRfb2JqZWN0X3N0ZF9pbml0KCZkZXNjLT5zdGQsIGRlc2NyaXB0b3JfdHlwZSBUU1JNTFNfQ0MpOwotICBkZXNjLT5tc2dkZWYgPSB1cGJfbXNnZGVmX25ldygmZGVzYy0+bXNnZGVmKTsKLSAgZGVzYy0+bGF5b3V0ID0gTlVMTDsKLSAgLy8gTUFLRV9TVERfWlZBTChpbnRlcm4tPmtsYXNzKTsKLSAgLy8gWlZBTF9OVUxMKGludGVybi0+a2xhc3MpOwotICBkZXNjLT5wYl9zZXJpYWxpemVfaGFuZGxlcnMgPSBOVUxMOwotfQotCi12b2lkIERlc2NyaXB0b3JfbmFtZV9zZXQoRGVzY3JpcHRvciAqZGVzYywgY29uc3QgY2hhciAqbmFtZSkgewotICB1cGJfbXNnZGVmICptdXRfZGVmID0gY2hlY2tfbXNnZGVmX25vdGZyb3plbihkZXNjLT5tc2dkZWYpOwotICBDSEVDS19VUEIodXBiX21zZ2RlZl9zZXRmdWxsbmFtZShtdXRfZGVmLCBuYW1lLCAmc3RhdHVzKSwKLSAgICAgICAgICAgICJFcnJvciBzZXR0aW5nIERlc2NyaXB0b3IgbmFtZSIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmllbGREZXNjcmlwdG9yCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgdm9pZCBmaWVsZF9kZXNjcmlwdG9yX25hbWVfc2V0KGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGRkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgdXBiX2ZpZWxkZGVmICptdXRfZGVmID0gY2hlY2tfZmllbGRkZWZfbm90ZnJvemVuKGZpZWxkZGVmKTsKLSAgQ0hFQ0tfVVBCKHVwYl9maWVsZGRlZl9zZXRuYW1lKG11dF9kZWYsIG5hbWUsICZzdGF0dXMpLAotICAgICAgICAgICAgIkVycm9yIHNldHRpbmcgRmllbGREZXNjcmlwdG9yIG5hbWUiKTsKLX0KLQotc3RhdGljIHZvaWQgZmllbGRfZGVzY3JpcHRvcl9sYWJlbF9zZXQoY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZGRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9sYWJlbF90IHVwYl9sYWJlbCkgewotICB1cGJfZmllbGRkZWYgKm11dF9kZWYgPSBjaGVja19maWVsZGRlZl9ub3Rmcm96ZW4oZmllbGRkZWYpOwotICB1cGJfZmllbGRkZWZfc2V0bGFiZWwobXV0X2RlZiwgdXBiX2xhYmVsKTsKLX0KLQotdXBiX2ZpZWxkdHlwZV90IHN0cmluZ190b19kZXNjcmlwdG9ydHlwZShjb25zdCBjaGFyICp0eXBlKSB7Ci0jZGVmaW5lIENPTlZFUlQodXBiLCBzdHIpICAgXAotICBpZiAoIXN0cmNtcCh0eXBlLCBzdHIpKSB7IFwKLSAgICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV8jI3VwYjsgIFwKLSAgfQotCi0gIENPTlZFUlQoRkxPQVQsICJmbG9hdCIpOwotICBDT05WRVJUKERPVUJMRSwgImRvdWJsZSIpOwotICBDT05WRVJUKEJPT0wsICJib29sIik7Ci0gIENPTlZFUlQoU1RSSU5HLCAic3RyaW5nIik7Ci0gIENPTlZFUlQoQllURVMsICJieXRlcyIpOwotICBDT05WRVJUKE1FU1NBR0UsICJtZXNzYWdlIik7Ci0gIENPTlZFUlQoR1JPVVAsICJncm91cCIpOwotICBDT05WRVJUKEVOVU0sICJlbnVtIik7Ci0gIENPTlZFUlQoSU5UMzIsICJpbnQzMiIpOwotICBDT05WRVJUKElOVDY0LCAiaW50NjQiKTsKLSAgQ09OVkVSVChVSU5UMzIsICJ1aW50MzIiKTsKLSAgQ09OVkVSVChVSU5UNjQsICJ1aW50NjQiKTsKLSAgQ09OVkVSVChTSU5UMzIsICJzaW50MzIiKTsKLSAgQ09OVkVSVChTSU5UNjQsICJzaW50NjQiKTsKLSAgQ09OVkVSVChGSVhFRDMyLCAiZml4ZWQzMiIpOwotICBDT05WRVJUKEZJWEVENjQsICJmaXhlZDY0Iik7Ci0gIENPTlZFUlQoU0ZJWEVEMzIsICJzZml4ZWQzMiIpOwotICBDT05WRVJUKFNGSVhFRDY0LCAic2ZpeGVkNjQiKTsKLQotI3VuZGVmIENPTlZFUlQKLQotICB6ZW5kX2Vycm9yKEVfRVJST1IsICJVbmtub3duIGZpZWxkIHR5cGUuIik7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCBmaWVsZF9kZXNjcmlwdG9yX3R5cGVfc2V0KGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGRkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnR5cGUpIHsKLSAgdXBiX2ZpZWxkZGVmICptdXRfZGVmID0gY2hlY2tfZmllbGRkZWZfbm90ZnJvemVuKGZpZWxkZGVmKTsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlc2NyaXB0b3J0eXBlKG11dF9kZWYsIHN0cmluZ190b19kZXNjcmlwdG9ydHlwZSh0eXBlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGZpZWxkX2Rlc2NyaXB0b3JfbnVtYmVyX3NldChjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIpIHsKLSAgdXBiX2ZpZWxkZGVmICptdXRfZGVmID0gY2hlY2tfZmllbGRkZWZfbm90ZnJvemVuKGZpZWxkZGVmKTsKLSAgQ0hFQ0tfVVBCKHVwYl9maWVsZGRlZl9zZXRudW1iZXIobXV0X2RlZiwgbnVtYmVyLCAmc3RhdHVzKSwKLSAgICAgICAgICAgICJFcnJvciBzZXR0aW5nIGZpZWxkIG51bWJlciIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWVzc2FnZUJ1aWxkZXJDb250ZXh0Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgemVuZF9mdW5jdGlvbl9lbnRyeSBtZXNzYWdlX2J1aWxkZXJfY29udGV4dF9tZXRob2RzW10gPSB7Ci0gICAgUEhQX01FKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwgZmluYWxpemVUb1Bvb2wsIE5VTEwsIFpFTkRfQUNDX1BVQkxJQykKLSAgICBQSFBfTUUoTWVzc2FnZUJ1aWxkZXJDb250ZXh0LCBvcHRpb25hbCwgTlVMTCwgWkVORF9BQ0NfUFVCTElDKQotICAgIHtOVUxMLCBOVUxMLCBOVUxMfQotfTsKLQotREVGSU5FX0NMQVNTKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwgbWVzc2FnZV9idWlsZGVyX2NvbnRleHQsCi0gICAgICAgICAgICAgIkdvb2dsZVxcUHJvdG9idWZcXEludGVybmFsXFxNZXNzYWdlQnVpbGRlckNvbnRleHQiKTsKLQotdm9pZCBtZXNzYWdlX2J1aWxkZXJfY29udGV4dF9mcmVlX2MoTWVzc2FnZUJ1aWxkZXJDb250ZXh0ICpjb250ZXh0IFRTUk1MU19EQykgewotICB6dmFsX3B0cl9kdG9yKCZjb250ZXh0LT5kZXNjcmlwdG9yKTsKLSAgenZhbF9wdHJfZHRvcigmY29udGV4dC0+cG9vbCk7Ci19Ci0KLXZvaWQgbWVzc2FnZV9idWlsZGVyX2NvbnRleHRfaW5pdF9jX2luc3RhbmNlKAotICAgIE1lc3NhZ2VCdWlsZGVyQ29udGV4dCAqY29udGV4dCBUU1JNTFNfREMpIHsKLSAgemVuZF9vYmplY3Rfc3RkX2luaXQoJmNvbnRleHQtPnN0ZCwgbWVzc2FnZV9idWlsZGVyX2NvbnRleHRfdHlwZSBUU1JNTFNfQ0MpOwotICBQUk9UT0JVRl9DUkVBVEVfWkVORF9XUkFQUEVSKERlc2NyaXB0b3IsIGRlc2NyaXB0b3IsIGNvbnRleHQtPmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzYyk7Ci19Ci0KLXN0YXRpYyB2b2lkIG1zZ2RlZl9hZGRfZmllbGQoRGVzY3JpcHRvciAqZGVzYywgdXBiX2xhYmVsX3QgdXBiX2xhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp0eXBlLCBpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0eXBlX2NsYXNzKSB7Ci0gIHVwYl9maWVsZGRlZiAqZmllbGRkZWYgPSB1cGJfZmllbGRkZWZfbmV3KCZmaWVsZGRlZik7Ci0gIHVwYl9maWVsZGRlZl9zZXRwYWNrZWQoZmllbGRkZWYsIGZhbHNlKTsKLQotICBmaWVsZF9kZXNjcmlwdG9yX2xhYmVsX3NldChmaWVsZGRlZiwgdXBiX2xhYmVsKTsKLSAgZmllbGRfZGVzY3JpcHRvcl9uYW1lX3NldChmaWVsZGRlZiwgbmFtZSk7Ci0gIGZpZWxkX2Rlc2NyaXB0b3JfdHlwZV9zZXQoZmllbGRkZWYsIHR5cGUpOwotICBmaWVsZF9kZXNjcmlwdG9yX251bWJlcl9zZXQoZmllbGRkZWYsIG51bWJlcik7Ci0KLS8vIC8vICAgaWYgKHR5cGVfY2xhc3MgIT0gUW5pbCkgewotLy8gLy8gICAgIGlmIChUWVBFKHR5cGVfY2xhc3MpICE9IFRfU1RSSU5HKSB7Ci0vLyAvLyAgICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJFeHBlY3RlZCBzdHJpbmcgZm9yIHR5cGUgY2xhc3MiKTsKLS8vIC8vICAgICB9Ci0vLyAvLyAgICAgLy8gTWFrZSBpdCBhbiBhYnNvbHV0ZSB0eXBlIG5hbWUgYnkgcHJlcGVuZGluZyBhIGRvdC4KLS8vIC8vICAgICB0eXBlX2NsYXNzID0gcmJfc3RyX2FwcGVuZChyYl9zdHJfbmV3MigiLiIpLCB0eXBlX2NsYXNzKTsKLS8vIC8vICAgICByYl9mdW5jYWxsKGZpZWxkZGVmLCByYl9pbnRlcm4oInN1Ym1zZ19uYW1lPSIpLCAxLCB0eXBlX2NsYXNzKTsKLS8vIC8vICAgfQotICBkZXNjcmlwdG9yX2FkZF9maWVsZChkZXNjLCBmaWVsZGRlZik7Ci19Ci0KLVBIUF9NRVRIT0QoTWVzc2FnZUJ1aWxkZXJDb250ZXh0LCBvcHRpb25hbCkgewotICBNZXNzYWdlQnVpbGRlckNvbnRleHQgKnNlbGYgPSBwaHBfdG9fbWVzc2FnZV9idWlsZGVyX2NvbnRleHQoZ2V0VGhpcygpIFRTUk1MU19DQyk7Ci0gIERlc2NyaXB0b3IgKmRlc2MgPSBwaHBfdG9fZGVzY3JpcHRvcihzZWxmLT5kZXNjcmlwdG9yIFRTUk1MU19DQyk7Ci0gIC8vIFZBTFVFIG5hbWUsIHR5cGUsIG51bWJlciwgdHlwZV9jbGFzczsKLSAgY29uc3QgY2hhciAqbmFtZSwgKnR5cGUsICp0eXBlX2NsYXNzOwotICBpbnQgbnVtYmVyLCBuYW1lX3N0cl9sZW4sIHR5cGVfc3RyX2xlbiwgdHlwZV9jbGFzc19zdHJfbGVuOwotICBpZiAoWkVORF9OVU1fQVJHUygpID09IDMpIHsKLSAgICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKDMgVFNSTUxTX0NDLCAic3NsIiwgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmFtZV9zdHJfbGVuLCAmdHlwZSwgJnR5cGVfc3RyX2xlbiwgJm51bWJlcikgPT0gRkFJTFVSRSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoemVuZF9wYXJzZV9wYXJhbWV0ZXJzKDQgVFNSTUxTX0NDLCAic3NscyIsICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5hbWVfc3RyX2xlbiwgJnR5cGUsICZ0eXBlX3N0cl9sZW4sICZudW1iZXIsICZ0eXBlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnR5cGVfY2xhc3Nfc3RyX2xlbikgPT0gRkFJTFVSRSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfQotCi0gIG1zZ2RlZl9hZGRfZmllbGQoZGVzYywgVVBCX0xBQkVMX09QVElPTkFMLCBuYW1lLCB0eXBlLCBudW1iZXIsIHR5cGVfY2xhc3MpOwotCi0gIHp2YWxfY29weV9jdG9yKGdldFRoaXMoKSk7Ci0gIFJFVFVSTl9aVkFMKGdldFRoaXMoKSwgMSwgMCk7Ci19Ci0KLVBIUF9NRVRIT0QoTWVzc2FnZUJ1aWxkZXJDb250ZXh0LCBmaW5hbGl6ZVRvUG9vbCkgewotICBNZXNzYWdlQnVpbGRlckNvbnRleHQgKnNlbGYgPSBwaHBfdG9fbWVzc2FnZV9idWlsZGVyX2NvbnRleHQoZ2V0VGhpcygpIFRTUk1MU19DQyk7Ci0gIERlc2NyaXB0b3JQb29sICpwb29sID0gcGhwX3RvX2Rlc2NyaXB0b3JfcG9vbChzZWxmLT5wb29sIFRTUk1MU19DQyk7Ci0gIERlc2NyaXB0b3IqIGRlc2MgPSBwaHBfdG9fZGVzY3JpcHRvcihzZWxmLT5kZXNjcmlwdG9yIFRTUk1MU19DQyk7Ci0KLSAgWl9BRERSRUZfUChzZWxmLT5kZXNjcmlwdG9yKTsKLSAgemVuZF9oYXNoX25leHRfaW5kZXhfaW5zZXJ0KHBvb2wtPnBlbmRpbmdfbGlzdCwgJnNlbGYtPmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoenZhbCAqKSwgTlVMTCk7Ci0gIFJFVFVSTl9aVkFMKHNlbGYtPnBvb2wsIDEsIDApOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMDYyZDY2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDI3MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2luY2x1ZGUgPHBocC5oPgotCi0jaW5jbHVkZSAicHJvdG9idWYuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENsYXNzL21vZHVsZSBjcmVhdGlvbiBmcm9tIG1zZ2RlZnMgYW5kIGVudW1kZWZzLCByZXNwZWN0aXZlbHkuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkKiBtZXNzYWdlX2RhdGEodm9pZCogbXNnKSB7Ci0gIHJldHVybiAoKHVpbnQ4X3QgKiltc2cpICsgc2l6ZW9mKE1lc3NhZ2VIZWFkZXIpOwotfQotCi12b2lkIG1lc3NhZ2Vfc2V0X3Byb3BlcnR5KHp2YWwqIG9iamVjdCwgenZhbCogZmllbGRfbmFtZSwgenZhbCogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHplbmRfbGl0ZXJhbCoga2V5IFRTUk1MU19EQykgewotICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkOwotCi0gIE1lc3NhZ2VIZWFkZXIqIHNlbGYgPSB6ZW5kX29iamVjdF9zdG9yZV9nZXRfb2JqZWN0KG9iamVjdCBUU1JNTFNfQ0MpOwotCi0gIENIRUNLX1RZUEUoZmllbGRfbmFtZSwgSVNfU1RSSU5HKTsKLSAgZmllbGQgPSB1cGJfbXNnZGVmX250b2Z6KHNlbGYtPmRlc2NyaXB0b3ItPm1zZ2RlZiwgWl9TVFJWQUxfUChmaWVsZF9uYW1lKSk7Ci0gIGlmIChmaWVsZCA9PSBOVUxMKSB7Ci0gICAgemVuZF9lcnJvcihFX0VSUk9SLCAiVW5rbm93biBmaWVsZDogJXMiLCBaX1NUUlZBTF9QKGZpZWxkX25hbWUpKTsKLSAgfQotICBsYXlvdXRfc2V0KHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwgbWVzc2FnZV9kYXRhKHNlbGYpLCBmaWVsZCwgdmFsdWUpOwotfQotCi16dmFsKiBtZXNzYWdlX2dldF9wcm9wZXJ0eSh6dmFsKiBvYmplY3QsIHp2YWwqIG1lbWJlciwgaW50IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHplbmRfbGl0ZXJhbCoga2V5IFRTUk1MU19EQykgewotICBNZXNzYWdlSGVhZGVyKiBzZWxmID0KLSAgICAgIChNZXNzYWdlSGVhZGVyKil6ZW5kX29iamVjdF9zdG9yZV9nZXRfb2JqZWN0KG9iamVjdCBUU1JNTFNfQ0MpOwotICBDSEVDS19UWVBFKG1lbWJlciwgSVNfU1RSSU5HKTsKLQotICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkOwotICBmaWVsZCA9IHVwYl9tc2dkZWZfbnRvZnooc2VsZi0+ZGVzY3JpcHRvci0+bXNnZGVmLCBaX1NUUlZBTF9QKG1lbWJlcikpOwotICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgIHJldHVybiBFRyh1bmluaXRpYWxpemVkX3p2YWxfcHRyKTsKLSAgfQotICB6dmFsKiByZXR2YWwgPSBsYXlvdXRfZ2V0KHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwgbWVzc2FnZV9kYXRhKHNlbGYpLCBmaWVsZCBUU1JNTFNfQ0MpOwotICByZXR1cm4gcmV0dmFsOwotfQotCi1zdGF0aWMgIHplbmRfZnVuY3Rpb25fZW50cnkgbWVzc2FnZV9tZXRob2RzW10gPSB7Ci0gIFBIUF9NRShNZXNzYWdlLCBlbmNvZGUsIE5VTEwsIFpFTkRfQUNDX1BVQkxJQykKLSAge05VTEwsIE5VTEwsIE5VTEx9Ci19OwotCi0vKiBzdHJpbmdzaW5rICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vLyBUaGlzIHNob3VsZCBwcm9iYWJseSBiZSBmYWN0b3JlZCBpbnRvIGEgY29tbW9uIHVwYiBjb21wb25lbnQuCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdXBiX2J5dGVzaGFuZGxlciBoYW5kbGVyOwotICB1cGJfYnl0ZXNzaW5rIHNpbms7Ci0gIGNoYXIgKnB0cjsKLSAgc2l6ZV90IGxlbiwgc2l6ZTsKLX0gc3RyaW5nc2luazsKLQotc3RhdGljIHZvaWQgKnN0cmluZ3Npbmtfc3RhcnQodm9pZCAqX3NpbmssIGNvbnN0IHZvaWQgKmhkLCBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIHN0cmluZ3NpbmsgKnNpbmsgPSBfc2luazsKLSAgc2luay0+bGVuID0gMDsKLSAgcmV0dXJuIHNpbms7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgc3RyaW5nc2lua19zdHJpbmcodm9pZCAqX3NpbmssIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICBzdHJpbmdzaW5rICpzaW5rID0gX3Npbms7Ci0gIHNpemVfdCBuZXdfc2l6ZSA9IHNpbmstPnNpemU7Ci0KLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLQotICB3aGlsZSAoc2luay0+bGVuICsgbGVuID4gbmV3X3NpemUpIHsKLSAgICBuZXdfc2l6ZSAqPSAyOwotICB9Ci0KLSAgaWYgKG5ld19zaXplICE9IHNpbmstPnNpemUpIHsKLSAgICBzaW5rLT5wdHIgPSByZWFsbG9jKHNpbmstPnB0ciwgbmV3X3NpemUpOwotICAgIHNpbmstPnNpemUgPSBuZXdfc2l6ZTsKLSAgfQotCi0gIG1lbWNweShzaW5rLT5wdHIgKyBzaW5rLT5sZW4sIHB0ciwgbGVuKTsKLSAgc2luay0+bGVuICs9IGxlbjsKLQotICByZXR1cm4gbGVuOwotfQotCi12b2lkIHN0cmluZ3NpbmtfaW5pdChzdHJpbmdzaW5rICpzaW5rKSB7Ci0gIHVwYl9ieXRlc2hhbmRsZXJfaW5pdCgmc2luay0+aGFuZGxlcik7Ci0gIHVwYl9ieXRlc2hhbmRsZXJfc2V0c3RhcnRzdHIoJnNpbmstPmhhbmRsZXIsIHN0cmluZ3Npbmtfc3RhcnQsIE5VTEwpOwotICB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0cmluZygmc2luay0+aGFuZGxlciwgc3RyaW5nc2lua19zdHJpbmcsIE5VTEwpOwotCi0gIHVwYl9ieXRlc3NpbmtfcmVzZXQoJnNpbmstPnNpbmssICZzaW5rLT5oYW5kbGVyLCBzaW5rKTsKLQotICBzaW5rLT5zaXplID0gMzI7Ci0gIHNpbmstPnB0ciA9IG1hbGxvYyhzaW5rLT5zaXplKTsKLSAgc2luay0+bGVuID0gMDsKLX0KLQotdm9pZCBzdHJpbmdzaW5rX3VuaW5pdChzdHJpbmdzaW5rICpzaW5rKSB7IGZyZWUoc2luay0+cHRyKTsgfQotCi0vLyBTdGFjay1hbGxvY2F0ZWQgY29udGV4dCBkdXJpbmcgYW4gZW5jb2RlL2RlY29kZSBvcGVyYXRpb24uIENvbnRhaW5zIHRoZSB1cGIKLS8vIGVudmlyb25tZW50IGFuZCBpdHMgc3RhY2stYmFzZWQgYWxsb2NhdG9yLCBhbiBpbml0aWFsIGJ1ZmZlciBmb3IgYWxsb2NhdGlvbnMKLS8vIHRvIGF2b2lkIG1hbGxvYygpIHdoZW4gcG9zc2libGUsIGFuZCBhIHRlbXBsYXRlIGZvciBQSFAgZXhjZXB0aW9uIG1lc3NhZ2VzCi0vLyBpZiBhbnkgZXJyb3Igb2NjdXJzLgotI2RlZmluZSBTVEFDS19FTlZfU1RBQ0tCWVRFUyA0MDk2Ci10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9lbnYgZW52OwotICB1cGJfc2VlZGVkYWxsb2MgYWxsb2M7Ci0gIGNvbnN0IGNoYXIgKnBocF9lcnJvcl90ZW1wbGF0ZTsKLSAgY2hhciBhbGxvY2J1ZltTVEFDS19FTlZfU1RBQ0tCWVRFU107Ci19IHN0YWNrZW52OwotCi1zdGF0aWMgdm9pZCBzdGFja2Vudl9pbml0KHN0YWNrZW52KiBzZSwgY29uc3QgY2hhciogZXJybXNnKTsKLXN0YXRpYyB2b2lkIHN0YWNrZW52X3VuaW5pdChzdGFja2Vudiogc2UpOwotCi0vLyBDYWxsYmFjayBpbnZva2VkIGJ5IHVwYiBpZiBhbnkgZXJyb3Igb2NjdXJzIGR1cmluZyBwYXJzaW5nIG9yIHNlcmlhbGl6YXRpb24uCi1zdGF0aWMgYm9vbCBlbnZfZXJyb3JfZnVuYyh2b2lkKiB1ZCwgY29uc3QgdXBiX3N0YXR1cyogc3RhdHVzKSB7Ci0gICAgc3RhY2tlbnYqIHNlID0gdWQ7Ci0gICAgLy8gRnJlZSB0aGUgZW52IC0tIHJiX3JhaXNlIHdpbGwgbG9uZ2ptcCB1cCB0aGUgc3RhY2sgcGFzdCB0aGUgZW5jb2RlL2RlY29kZQotICAgIC8vIGZ1bmN0aW9uIHNvIGl0IHdvdWxkIG5vdCBvdGhlcndpc2UgaGF2ZSBiZWVuIGZyZWVkLgotICAgIHN0YWNrZW52X3VuaW5pdChzZSk7Ci0KLSAgICAvLyBUT0RPKHRlYm9yaW5nKTogaGF2ZSBhIHdheSB0byB2ZXJpZnkgdGhhdCB0aGlzIGlzIGFjdHVhbGx5IGEgcGFyc2UgZXJyb3IsCi0gICAgLy8gaW5zdGVhZCBvZiBqdXN0IHRocm93aW5nICJwYXJzZSBlcnJvciIgdW5jb25kaXRpb25hbGx5LgotICAgIHplbmRfZXJyb3IoRV9FUlJPUiwgc2UtPnBocF9lcnJvcl90ZW1wbGF0ZSk7Ci0gICAgLy8gTmV2ZXIgcmVhY2hlZC4KLSAgICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YWNrZW52X2luaXQoc3RhY2tlbnYqIHNlLCBjb25zdCBjaGFyKiBlcnJtc2cpIHsKLSAgc2UtPnBocF9lcnJvcl90ZW1wbGF0ZSA9IGVycm1zZzsKLSAgdXBiX2Vudl9pbml0KCZzZS0+ZW52KTsKLSAgdXBiX3NlZWRlZGFsbG9jX2luaXQoJnNlLT5hbGxvYywgJnNlLT5hbGxvY2J1ZiwgU1RBQ0tfRU5WX1NUQUNLQllURVMpOwotICB1cGJfZW52X3NldGFsbG9jZnVuYygmc2UtPmVudiwgdXBiX3NlZWRlZGFsbG9jX2dldGFsbG9jZnVuYygmc2UtPmFsbG9jKSwKLSAgICAgICAgICAgICAgICAgICAgICAgJnNlLT5hbGxvYyk7Ci0gIHVwYl9lbnZfc2V0ZXJyb3JmdW5jKCZzZS0+ZW52LCBlbnZfZXJyb3JfZnVuYywgc2UpOwotfQotCi1zdGF0aWMgdm9pZCBzdGFja2Vudl91bmluaXQoc3RhY2tlbnYqIHNlKSB7Ci0gIHVwYl9lbnZfdW5pbml0KCZzZS0+ZW52KTsKLSAgdXBiX3NlZWRlZGFsbG9jX3VuaW5pdCgmc2UtPmFsbG9jKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lc3NhZ2UKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjb25zdCB1cGJfaGFuZGxlcnMqIG1zZ2RlZl9wYl9zZXJpYWxpemVfaGFuZGxlcnMoRGVzY3JpcHRvciogZGVzYykgewotICBpZiAoZGVzYy0+cGJfc2VyaWFsaXplX2hhbmRsZXJzID09IE5VTEwpIHsKLSAgICBkZXNjLT5wYl9zZXJpYWxpemVfaGFuZGxlcnMgPQotICAgICAgICB1cGJfcGJfZW5jb2Rlcl9uZXdoYW5kbGVycyhkZXNjLT5tc2dkZWYsICZkZXNjLT5wYl9zZXJpYWxpemVfaGFuZGxlcnMpOwotICB9Ci0gIHJldHVybiBkZXNjLT5wYl9zZXJpYWxpemVfaGFuZGxlcnM7Ci19Ci0KLVBIUF9NRVRIT0QoTWVzc2FnZSwgZW5jb2RlKSB7Ci0gIERlc2NyaXB0b3IqIGRlc2MgPSAoRGVzY3JpcHRvciopemVuZF9vYmplY3Rfc3RvcmVfZ2V0X29iamVjdCgKLSAgICAgIENFX1NUQVRJQ19NRU1CRVJTKFpfT0JKQ0VfUChnZXRUaGlzKCkpKVswXSBUU1JNTFNfQ0MpOwotCi0gIHN0cmluZ3Npbmsgc2luazsKLSAgc3RyaW5nc2lua19pbml0KCZzaW5rKTsKLQotICB7Ci0gICAgY29uc3QgdXBiX2hhbmRsZXJzKiBzZXJpYWxpemVfaGFuZGxlcnMgPSBtc2dkZWZfcGJfc2VyaWFsaXplX2hhbmRsZXJzKGRlc2MpOwotCi0gICAgc3RhY2tlbnYgc2U7Ci0gICAgdXBiX3BiX2VuY29kZXIqIGVuY29kZXI7Ci0KLSAgICBzdGFja2Vudl9pbml0KCZzZSwgIkVycm9yIG9jY3VycmVkIGR1cmluZyBlbmNvZGluZzogJXMiKTsKLSAgICBlbmNvZGVyID0gdXBiX3BiX2VuY29kZXJfY3JlYXRlKCZzZS5lbnYsIHNlcmlhbGl6ZV9oYW5kbGVycywgJnNpbmsuc2luayk7Ci0KLSAgICBwdXRtc2coZ2V0VGhpcygpLCBkZXNjLCB1cGJfcGJfZW5jb2Rlcl9pbnB1dChlbmNvZGVyKSwgMCk7Ci0KLSAgICBSRVRWQUxfU1RSSU5HTChzaW5rLnB0ciwgc2luay5sZW4sIDEpOwotCi0gICAgc3RhY2tlbnZfdW5pbml0KCZzZSk7Ci0gICAgc3RyaW5nc2lua191bmluaXQoJnNpbmspOwotICB9Ci19Ci0KLXZvaWQgbWVzc2FnZV9mcmVlKHZvaWQgKiBvYmplY3QgVFNSTUxTX0RDKSB7Ci0gIEZSRUUob2JqZWN0KTsKLX0KLQotemVuZF9vYmplY3RfdmFsdWUgbWVzc2FnZV9jcmVhdGUoemVuZF9jbGFzc19lbnRyeSogY2UgVFNSTUxTX0RDKSB7Ci0gIHplbmRfb2JqZWN0X3ZhbHVlIHJldHVybl92YWx1ZTsKLQotICB6dmFsKiBwaHBfZGVzY3JpcHRvciA9IGdldF9kZWZfb2JqKGNlKTsKLQotICBEZXNjcmlwdG9yKiBkZXNjID0gemVuZF9vYmplY3Rfc3RvcmVfZ2V0X29iamVjdChwaHBfZGVzY3JpcHRvciBUU1JNTFNfQ0MpOwotICBNZXNzYWdlSGVhZGVyKiBtc2cgPSAoTWVzc2FnZUhlYWRlciopQUxMT0NfTigKLSAgICAgIHVpbnQ4X3QsIHNpemVvZihNZXNzYWdlSGVhZGVyKSArIGRlc2MtPmxheW91dC0+c2l6ZSk7Ci0gIG1lbXNldChtZXNzYWdlX2RhdGEobXNnKSwgMCwgZGVzYy0+bGF5b3V0LT5zaXplKTsKLQotICAvLyBXZSB3cmFwIGZpcnN0IHNvIHRoYXQgZXZlcnl0aGluZyBpbiB0aGUgbWVzc2FnZSBvYmplY3QgaXMgR0Mtcm9vdGVkIGluIGNhc2UKLSAgLy8gYSBjb2xsZWN0aW9uIGhhcHBlbnMgZHVyaW5nIG9iamVjdCBjcmVhdGlvbiBpbiBsYXlvdXRfaW5pdCgpLgotICBtc2ctPmRlc2NyaXB0b3IgPSBkZXNjOwotCi0gIGxheW91dF9pbml0KGRlc2MtPmxheW91dCwgbWVzc2FnZV9kYXRhKG1zZykpOwotICB6ZW5kX29iamVjdF9zdGRfaW5pdCgmbXNnLT5zdGQsIGNlIFRTUk1MU19DQyk7Ci0KLSAgcmV0dXJuX3ZhbHVlLmhhbmRsZSA9IHplbmRfb2JqZWN0c19zdG9yZV9wdXQoCi0gICAgICBtc2csICh6ZW5kX29iamVjdHNfc3RvcmVfZHRvcl90KXplbmRfb2JqZWN0c19kZXN0cm95X29iamVjdCwKLSAgICAgIG1lc3NhZ2VfZnJlZSwgTlVMTCBUU1JNTFNfQ0MpOwotCi0gIHJldHVybl92YWx1ZS5oYW5kbGVycyA9IFBST1RPQlVGX0cobWVzc2FnZV9oYW5kbGVycyk7Ci0gIHJldHVybiByZXR1cm5fdmFsdWU7Ci19Ci0KLWNvbnN0IHplbmRfY2xhc3NfZW50cnkqIGJ1aWxkX2NsYXNzX2Zyb21fZGVzY3JpcHRvcigKLSAgICB6dmFsKiBwaHBfZGVzY3JpcHRvciBUU1JNTFNfREMpIHsKLSAgRGVzY3JpcHRvciogZGVzYyA9IHBocF90b19kZXNjcmlwdG9yKHBocF9kZXNjcmlwdG9yKTsKLSAgaWYgKGRlc2MtPmxheW91dCA9PSBOVUxMKSB7Ci0gICAgTWVzc2FnZUxheW91dCogbGF5b3V0ID0gY3JlYXRlX2xheW91dChkZXNjLT5tc2dkZWYpOwotICAgIGRlc2MtPmxheW91dCA9IGxheW91dDsKLSAgfQotICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gIC8vIGlmIChkZXNjLT5maWxsX21ldGhvZCA9PSBOVUxMKSB7Ci0gIC8vICAgZGVzYy0+ZmlsbF9tZXRob2QgPSBuZXdfZmlsbG1zZ19kZWNvZGVybWV0aG9kKGRlc2MsICZkZXNjLT5maWxsX21ldGhvZCk7Ci0gIC8vIH0KLQotICBjb25zdCBjaGFyKiBuYW1lID0gdXBiX21zZ2RlZl9mdWxsbmFtZShkZXNjLT5tc2dkZWYpOwotICBpZiAobmFtZSA9PSBOVUxMKSB7Ci0gICAgemVuZF9lcnJvcihFX0VSUk9SLCAiRGVzY3JpcHRvciBkb2VzIG5vdCBoYXZlIGFzc2lnbmVkIG5hbWUuIik7Ci0gIH0KLQotICB6ZW5kX2NsYXNzX2VudHJ5IGNsYXNzX2VudHJ5OwotICBJTklUX0NMQVNTX0VOVFJZX0VYKGNsYXNzX2VudHJ5LCBuYW1lLCBzdHJsZW4obmFtZSksIG1lc3NhZ2VfbWV0aG9kcyk7Ci0gIHplbmRfY2xhc3NfZW50cnkqIHJlZ2lzdGVyZWRfY2UgPQotICAgICAgemVuZF9yZWdpc3Rlcl9pbnRlcm5hbF9jbGFzcygmY2xhc3NfZW50cnkgVFNSTUxTX0NDKTsKLQotICBhZGRfZGVmX29iaihyZWdpc3RlcmVkX2NlLCBwaHBfZGVzY3JpcHRvcik7Ci0KLSAgaWYgKFBST1RPQlVGX0cobWVzc2FnZV9oYW5kbGVycykgPT0gTlVMTCkgewotICAgIFBST1RPQlVGX0cobWVzc2FnZV9oYW5kbGVycykgPSBBTExPQyh6ZW5kX29iamVjdF9oYW5kbGVycyk7Ci0gICAgbWVtY3B5KFBST1RPQlVGX0cobWVzc2FnZV9oYW5kbGVycyksIHplbmRfZ2V0X3N0ZF9vYmplY3RfaGFuZGxlcnMoKSwKLSAgICAgICAgICAgc2l6ZW9mKHplbmRfb2JqZWN0X2hhbmRsZXJzKSk7Ci0gICAgUFJPVE9CVUZfRyhtZXNzYWdlX2hhbmRsZXJzKS0+d3JpdGVfcHJvcGVydHkgPSBtZXNzYWdlX3NldF9wcm9wZXJ0eTsKLSAgICBQUk9UT0JVRl9HKG1lc3NhZ2VfaGFuZGxlcnMpLT5yZWFkX3Byb3BlcnR5ID0gbWVzc2FnZV9nZXRfcHJvcGVydHk7Ci0gIH0KLQotICByZWdpc3RlcmVkX2NlLT5jcmVhdGVfb2JqZWN0ID0gbWVzc2FnZV9jcmVhdGU7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9waHAvZXh0L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvcHJvdG9idWYuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFhY2U4Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9waHAvZXh0L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi5jCisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotI2luY2x1ZGUgInByb3RvYnVmLmgiCi0KLSNpbmNsdWRlIDx6ZW5kX2hhc2guaD4KLQotWkVORF9ERUNMQVJFX01PRFVMRV9HTE9CQUxTKHByb3RvYnVmKQotc3RhdGljIFBIUF9HSU5JVF9GVU5DVElPTihwcm90b2J1Zik7Ci1zdGF0aWMgUEhQX0dTSFVURE9XTl9GVU5DVElPTihwcm90b2J1Zik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBHbG9iYWwgbWFwIGZyb20gdXBiIHttc2csZW51bX1kZWZzIHRvIHdyYXBwZXIgRGVzY3JpcHRvci9FbnVtRGVzY3JpcHRvcgotLy8gaW5zdGFuY2VzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBhZGRfZGVmX29iaihjb25zdCB2b2lkKiBkZWYsIHp2YWwqIHZhbHVlKSB7Ci0gIHVpbnQgbkluZGV4ID0gKHVsb25nKWRlZiAmIFBST1RPQlVGX0codXBiX2RlZl90b19waHBfb2JqX21hcCkublRhYmxlTWFzazsKLQotICB6dmFsKiBwRGVzdCA9IE5VTEw7Ci0gIFpfQUREUkVGX1AodmFsdWUpOwotICB6ZW5kX2hhc2hfaW5kZXhfdXBkYXRlKCZQUk9UT0JVRl9HKHVwYl9kZWZfdG9fcGhwX29ial9tYXApLCAoemVuZF91bG9uZylkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgJnZhbHVlLCBzaXplb2YoenZhbCopLCAmcERlc3QpOwotfQotCi16dmFsKiBnZXRfZGVmX29iaihjb25zdCB2b2lkKiBkZWYpIHsKLSAgenZhbCoqIHZhbHVlOwotICBpZiAoemVuZF9oYXNoX2luZGV4X2ZpbmQoJlBST1RPQlVGX0codXBiX2RlZl90b19waHBfb2JqX21hcCksICh6ZW5kX3Vsb25nKWRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZ2YWx1ZSkgPT0gRkFJTFVSRSkgewotICAgIHplbmRfZXJyb3IoRV9FUlJPUiwgIlBIUCBvYmplY3Qgbm90IGZvdW5kIGZvciBnaXZlbiBkZWZpbml0aW9uLlxuIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuICp2YWx1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFV0aWxpdGllcy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIGRlZmluZSB0aGUgZnVuY3Rpb24ocykgd2Ugd2FudCB0byBhZGQKLXplbmRfZnVuY3Rpb25fZW50cnkgcHJvdG9idWZfZnVuY3Rpb25zW10gPSB7Ci0gIFpFTkRfRkUoZ2V0X2dlbmVyYXRlZF9wb29sLCBOVUxMKQotICBaRU5EX0ZFX0VORAotfTsKLQotLy8gInByb3RvYnVmX2Z1bmN0aW9ucyIgcmVmZXJzIHRvIHRoZSBzdHJ1Y3QgZGVmaW5lZCBhYm92ZQotLy8gd2UnbGwgYmUgZmlsbGluZyBpbiBtb3JlIG9mIHRoaXMgbGF0ZXI6IHlvdSBjYW4gdXNlIHRoaXMgdG8gc3BlY2lmeQotLy8gZ2xvYmFscywgcGhwLmluaSBpbmZvLCBzdGFydHVwIGFuZCB0ZWFyZG93biBmdW5jdGlvbnMsIGV0Yy4KLXplbmRfbW9kdWxlX2VudHJ5IHByb3RvYnVmX21vZHVsZV9lbnRyeSA9IHsKLSAgU1RBTkRBUkRfTU9EVUxFX0hFQURFUiwKLSAgUEhQX1BST1RPQlVGX0VYVE5BTUUsIC8vIGV4dGVuc2lvbiBuYW1lCi0gIHByb3RvYnVmX2Z1bmN0aW9ucywgICAvLyBmdW5jdGlvbiBsaXN0Ci0gIFBIUF9NSU5JVChwcm90b2J1ZiksICAvLyBwcm9jZXNzIHN0YXJ0dXAKLSAgTlVMTCwgIC8vIHByb2Nlc3Mgc2h1dGRvd24KLSAgTlVMTCwgIC8vIHJlcXVlc3Qgc3RhcnR1cAotICBOVUxMLCAgLy8gcmVxdWVzdCBzaHV0ZG93bgotICBOVUxMLCAgLy8gZXh0ZW5zaW9uIGluZm8KLSAgUEhQX1BST1RPQlVGX1ZFUlNJT04sIC8vIGV4dGVuc2lvbiB2ZXJzaW9uCi0gIFBIUF9NT0RVTEVfR0xPQkFMUyhwcm90b2J1ZiksICAvLyBnbG9iYWxzIGRlc2NyaXB0b3IKLSAgUEhQX0dJTklUKHByb3RvYnVmKSwgLy8gZ2xvYmFscyBjdG9yCi0gIFBIUF9HU0hVVERPV04ocHJvdG9idWYpLCAgLy8gZ2xvYmFscyBkdG9yCi0gIE5VTEwsICAvLyBwb3N0IGRlYWN0aXZhdGUKLSAgU1RBTkRBUkRfTU9EVUxFX1BST1BFUlRJRVNfRVgKLX07Ci0KLS8vIGluc3RhbGwgbW9kdWxlCi1aRU5EX0dFVF9NT0RVTEUocHJvdG9idWYpCi0KLS8vIGdsb2JhbCB2YXJpYWJsZXMKLXN0YXRpYyBQSFBfR0lOSVRfRlVOQ1RJT04ocHJvdG9idWYpIHsKLSAgcHJvdG9idWZfZ2xvYmFscy0+Z2VuZXJhdGVkX3Bvb2wgPSBOVUxMOwotICBnZW5lcmF0ZWRfcG9vbCA9IE5VTEw7Ci0gIHByb3RvYnVmX2dsb2JhbHMtPm1lc3NhZ2VfaGFuZGxlcnMgPSBOVUxMOwotICB6ZW5kX2hhc2hfaW5pdCgmcHJvdG9idWZfZ2xvYmFscy0+dXBiX2RlZl90b19waHBfb2JqX21hcCwgMTYsIE5VTEwsCi0gICAgICAgICAgICAgICAgIFpWQUxfUFRSX0RUT1IsIDApOwotfQotCi1zdGF0aWMgUEhQX0dTSFVURE9XTl9GVU5DVElPTihwcm90b2J1ZikgewotICBpZiAocHJvdG9idWZfZ2xvYmFscy0+Z2VuZXJhdGVkX3Bvb2wgIT0gTlVMTCkgewotICAgIEZSRUVfWlZBTChwcm90b2J1Zl9nbG9iYWxzLT5nZW5lcmF0ZWRfcG9vbCk7Ci0gIH0KLSAgaWYgKHByb3RvYnVmX2dsb2JhbHMtPm1lc3NhZ2VfaGFuZGxlcnMgIT0gTlVMTCkgewotICAgIEZSRUUocHJvdG9idWZfZ2xvYmFscy0+bWVzc2FnZV9oYW5kbGVycyk7Ci0gIH0KLSAgemVuZF9oYXNoX2Rlc3Ryb3koJnByb3RvYnVmX2dsb2JhbHMtPnVwYl9kZWZfdG9fcGhwX29ial9tYXApOwotfQotCi1QSFBfTUlOSVRfRlVOQ1RJT04ocHJvdG9idWYpIHsKLSAgZGVzY3JpcHRvcl9wb29sX2luaXQoVFNSTUxTX0MpOwotICBkZXNjcmlwdG9yX2luaXQoVFNSTUxTX0MpOwotICBtZXNzYWdlX2J1aWxkZXJfY29udGV4dF9pbml0KFRTUk1MU19DKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9waHAvZXh0L2dvb2dsZS9wcm90b2J1Zi9wcm90b2J1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTAzODU1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSwyODEgKzAsMCBAQAotI2lmbmRlZiBfX0dPT0dMRV9QUk9UT0JVRl9QSFBfUFJPVE9CVUZfSF9fCi0jZGVmaW5lIF9fR09PR0xFX1BST1RPQlVGX1BIUF9QUk9UT0JVRl9IX18KLQotI2luY2x1ZGUgPHBocC5oPgotCi0jaW5jbHVkZSAidXBiLmgiCi0KLSNkZWZpbmUgUEhQX1BST1RPQlVGX0VYVE5BTUUgInByb3RvYnVmIgotI2RlZmluZSBQSFBfUFJPVE9CVUZfVkVSU0lPTiAiMC4wMSIKLQotLy8gRm9yd2FyZCBkZWNscy4KLXN0cnVjdCBEZXNjcmlwdG9yUG9vbDsKLXN0cnVjdCBEZXNjcmlwdG9yOwotc3RydWN0IEZpZWxkRGVzY3JpcHRvcjsKLXN0cnVjdCBFbnVtRGVzY3JpcHRvcjsKLXN0cnVjdCBNZXNzYWdlTGF5b3V0Owotc3RydWN0IE1lc3NhZ2VGaWVsZDsKLXN0cnVjdCBNZXNzYWdlSGVhZGVyOwotc3RydWN0IE1lc3NhZ2VCdWlsZGVyQ29udGV4dDsKLXN0cnVjdCBFbnVtQnVpbGRlckNvbnRleHQ7Ci0KLXR5cGVkZWYgc3RydWN0IERlc2NyaXB0b3JQb29sIERlc2NyaXB0b3JQb29sOwotdHlwZWRlZiBzdHJ1Y3QgRGVzY3JpcHRvciBEZXNjcmlwdG9yOwotdHlwZWRlZiBzdHJ1Y3QgRmllbGREZXNjcmlwdG9yIEZpZWxkRGVzY3JpcHRvcjsKLXR5cGVkZWYgc3RydWN0IE9uZW9mRGVzY3JpcHRvciBPbmVvZkRlc2NyaXB0b3I7Ci10eXBlZGVmIHN0cnVjdCBFbnVtRGVzY3JpcHRvciBFbnVtRGVzY3JpcHRvcjsKLXR5cGVkZWYgc3RydWN0IE1lc3NhZ2VMYXlvdXQgTWVzc2FnZUxheW91dDsKLXR5cGVkZWYgc3RydWN0IE1lc3NhZ2VGaWVsZCBNZXNzYWdlRmllbGQ7Ci10eXBlZGVmIHN0cnVjdCBNZXNzYWdlSGVhZGVyIE1lc3NhZ2VIZWFkZXI7Ci10eXBlZGVmIHN0cnVjdCBNZXNzYWdlQnVpbGRlckNvbnRleHQgTWVzc2FnZUJ1aWxkZXJDb250ZXh0OwotdHlwZWRlZiBzdHJ1Y3QgT25lb2ZCdWlsZGVyQ29udGV4dCBPbmVvZkJ1aWxkZXJDb250ZXh0OwotdHlwZWRlZiBzdHJ1Y3QgRW51bUJ1aWxkZXJDb250ZXh0IEVudW1CdWlsZGVyQ29udGV4dDsKLQotZXh0ZXJuIHplbmRfY2xhc3NfZW50cnkqIGJ1aWxkZXJfdHlwZTsKLWV4dGVybiB6ZW5kX2NsYXNzX2VudHJ5KiBkZXNjcmlwdG9yX3R5cGU7Ci1leHRlcm4gemVuZF9jbGFzc19lbnRyeSogbWVzc2FnZV9idWlsZGVyX2NvbnRleHRfdHlwZTsKLQotZXh0ZXJuIERlc2NyaXB0b3JQb29sKiBnZW5lcmF0ZWRfcG9vbDsgIC8vIFRoZSBhY3R1YWwgZ2VuZXJhdGVkIHBvb2wKLQotWkVORF9CRUdJTl9NT0RVTEVfR0xPQkFMUyhwcm90b2J1ZikKLSAgenZhbCogZ2VuZXJhdGVkX3Bvb2w7Ci0gIHplbmRfb2JqZWN0X2hhbmRsZXJzKiBtZXNzYWdlX2hhbmRsZXJzOwotICBIYXNoVGFibGUgdXBiX2RlZl90b19waHBfb2JqX21hcDsKLVpFTkRfRU5EX01PRFVMRV9HTE9CQUxTKHByb3RvYnVmKQotCi1aRU5EX0RFQ0xBUkVfTU9EVUxFX0dMT0JBTFMocHJvdG9idWYpCi0KLSNpZmRlZiBaVFMKLSNkZWZpbmUgUFJPVE9CVUZfRyh2KSBUU1JNRyhwcm90b2J1Zl9nbG9iYWxzX2lkLCB6ZW5kX3Byb3RvYnVmX2dsb2JhbHMqLCB2KQotI2Vsc2UKLSNkZWZpbmUgUFJPVE9CVUZfRyh2KSAocHJvdG9idWZfZ2xvYmFscy52KQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQSFAgZnVuY3Rpb25zIGFuZCBnbG9iYWwgdmFyaWFibGVzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotUEhQX01JTklUX0ZVTkNUSU9OKHByb3RvYnVmKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBIUCBjbGFzcyBzdHJ1Y3R1cmUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgRGVzY3JpcHRvclBvb2wgewotICB6ZW5kX29iamVjdCBzdGQ7Ci0gIHVwYl9zeW10YWIqIHN5bXRhYjsKLSAgSGFzaFRhYmxlKiBwZW5kaW5nX2xpc3Q7Ci19OwotCi1zdHJ1Y3QgRGVzY3JpcHRvciB7Ci0gIHplbmRfb2JqZWN0IHN0ZDsKLSAgY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmOwotICBNZXNzYWdlTGF5b3V0KiBsYXlvdXQ7Ci0gIC8vIHp2YWwqIGtsYXNzOyAgLy8gYmVnaW5zIGFzIE5VTEwKLSAgLy8gY29uc3QgdXBiX2hhbmRsZXJzKiBmaWxsX2hhbmRsZXJzOwotICAvLyBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kKiBmaWxsX21ldGhvZDsKLSAgY29uc3QgdXBiX2hhbmRsZXJzKiBwYl9zZXJpYWxpemVfaGFuZGxlcnM7Ci0gIC8vIGNvbnN0IHVwYl9oYW5kbGVycyoganNvbl9zZXJpYWxpemVfaGFuZGxlcnM7Ci0gIC8vIEhhbmRsZXJzIGhvbGQgdHlwZSBjbGFzcyByZWZlcmVuY2VzIGZvciBzdWItbWVzc2FnZSBmaWVsZHMgZGlyZWN0bHkgaW4gc29tZQotICAvLyBjYXNlcy4gV2UgbmVlZCB0byBrZWVwIHRoZXNlIHJvb3RlZCBiZWNhdXNlIHRoZXkgbWlnaHQgb3RoZXJ3aXNlIGJlCi0gIC8vIGNvbGxlY3RlZC4KLSAgLy8genZhbF9hcnJheSB0eXBlY2xhc3NfcmVmZXJlbmNlczsKLX07Ci0KLXN0cnVjdCBGaWVsZERlc2NyaXB0b3IgewotICB6ZW5kX29iamVjdCBzdGQ7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGRkZWY7Ci19OwotCi1zdHJ1Y3QgT25lb2ZEZXNjcmlwdG9yIHsKLSAgemVuZF9vYmplY3Qgc3RkOwotICBjb25zdCB1cGJfb25lb2ZkZWYqIG9uZW9mZGVmOwotfTsKLQotc3RydWN0IEVudW1EZXNjcmlwdG9yIHsKLSAgemVuZF9vYmplY3Qgc3RkOwotICBjb25zdCB1cGJfZW51bWRlZiogZW51bWRlZjsKLSAgLy8genZhbCogbW9kdWxlOyAgLy8gYmVnaW5zIGFzIE5VTEwKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBOYXRpdmUgc2xvdCBzdG9yYWdlIGFic3RyYWN0aW9uLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBOQVRJVkVfU0xPVF9NQVhfU0laRSBzaXplb2YodWludDY0X3QpCi0KLXNpemVfdCBuYXRpdmVfc2xvdF9zaXplKHVwYl9maWVsZHR5cGVfdCB0eXBlKTsKLQotI2RlZmluZSBNQVBfS0VZX0ZJRUxEIDEKLSNkZWZpbmUgTUFQX1ZBTFVFX0ZJRUxEIDIKLQotLy8gT25lb2YgY2FzZSBzbG90IHZhbHVlIHRvIGluZGljYXRlIHRoYXQgbm8gb25lb2YgY2FzZSBpcyBzZXQuIFRoZSB2YWx1ZSBgMGAgaXMKLS8vIHNhZmUgYmVjYXVzZSBmaWVsZCBudW1iZXJzIGFyZSB1c2VkIGFzIGNhc2UgaWRlbnRpZmllcnMsIGFuZCBubyBmaWVsZCBjYW4KLS8vIGhhdmUgYSBudW1iZXIgb2YgMC4KLSNkZWZpbmUgT05FT0ZfQ0FTRV9OT05FIDAKLQotLy8gVGhlc2Ugb3BlcmF0ZSBvbiBhIG1hcCBmaWVsZCAoaS5lLiwgYSByZXBlYXRlZCBmaWVsZCBvZiBzdWJtZXNzYWdlcyB3aG9zZQotLy8gc3VibWVzc2FnZSB0eXBlIGlzIGEgbWFwLWVudHJ5IG1zZ2RlZikuCi1ib29sIGlzX21hcF9maWVsZChjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKTsKLWNvbnN0IHVwYl9maWVsZGRlZiogbWFwX2ZpZWxkX2tleShjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKTsKLWNvbnN0IHVwYl9maWVsZGRlZiogbWFwX2ZpZWxkX3ZhbHVlKGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQpOwotCi0vLyBUaGVzZSBvcGVyYXRlIG9uIGEgbWFwLWVudHJ5IG1zZ2RlZi4KLWNvbnN0IHVwYl9maWVsZGRlZiogbWFwX2VudHJ5X2tleShjb25zdCB1cGJfbXNnZGVmKiBtc2dkZWYpOwotY29uc3QgdXBiX2ZpZWxkZGVmKiBtYXBfZW50cnlfdmFsdWUoY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lc3NhZ2UgbGF5b3V0IC8gc3RvcmFnZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgTUVTU0FHRV9GSUVMRF9OT19DQVNFICgoc2l6ZV90KS0xKQotCi1zdHJ1Y3QgTWVzc2FnZUZpZWxkIHsKLSAgc2l6ZV90IG9mZnNldDsKLSAgc2l6ZV90IGNhc2Vfb2Zmc2V0OyAgLy8gZm9yIG9uZW9mcywgYSB1aW50MzIuIEVsc2UsIE1FU1NBR0VfRklFTERfTk9fQ0FTRS4KLX07Ci0KLXN0cnVjdCBNZXNzYWdlTGF5b3V0IHsKLSAgY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmOwotICBNZXNzYWdlRmllbGQqIGZpZWxkczsKLSAgc2l6ZV90IHNpemU7Ci19OwotCi12b2lkIGxheW91dF9pbml0KE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgdm9pZCogc3RvcmFnZSk7Ci16dmFsKiBsYXlvdXRfZ2V0KE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgY29uc3Qgdm9pZCogc3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCBUU1JNTFNfREMpOwotTWVzc2FnZUxheW91dCogY3JlYXRlX2xheW91dChjb25zdCB1cGJfbXNnZGVmKiBtc2dkZWYpOwotdm9pZCBmcmVlX2xheW91dChNZXNzYWdlTGF5b3V0KiBsYXlvdXQpOwotenZhbCogbmF0aXZlX3Nsb3RfZ2V0KHVwYl9maWVsZHR5cGVfdCB0eXBlLCAvKlZBTFVFIHR5cGVfY2xhc3MsKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtZW1vcnkgVFNSTUxTX0RDKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lc3NhZ2UgY2xhc3MgY3JlYXRpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgTWVzc2FnZUhlYWRlciB7Ci0gIHplbmRfb2JqZWN0IHN0ZDsKLSAgRGVzY3JpcHRvciogZGVzY3JpcHRvcjsgIC8vIGtlcHQgYWxpdmUgYnkgc2VsZi5jbGFzcy5kZXNjcmlwdG9yIHJlZmVyZW5jZS4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIERhdGEgY29tZXMgYWZ0ZXIgdGhpcy4KLX07Ci0KLXN0cnVjdCBNZXNzYWdlQnVpbGRlckNvbnRleHQgewotICB6ZW5kX29iamVjdCBzdGQ7Ci0gIHp2YWwqIGRlc2NyaXB0b3I7Ci0gIHp2YWwqIHBvb2w7Ci19OwotCi1zdHJ1Y3QgT25lb2ZCdWlsZGVyQ29udGV4dCB7Ci0gIHplbmRfb2JqZWN0IHN0ZDsKLSAgLy8gVkFMVUUgZGVzY3JpcHRvcjsKLSAgLy8gVkFMVUUgYnVpbGRlcjsKLX07Ci0KLXN0cnVjdCBFbnVtQnVpbGRlckNvbnRleHQgewotICB6ZW5kX29iamVjdCBzdGQ7Ci0gIC8vIFZBTFVFIGVudW1kZXNjOwotfTsKLQotLy8gRm9yd2FyZC1kZWNsYXJlIGFsbCBvZiB0aGUgUEhQIG1ldGhvZCBpbXBsZW1lbnRhdGlvbnMuCi0KLURlc2NyaXB0b3JQb29sKiBwaHBfdG9fZGVzY3JpcHRvcl9wb29sKHp2YWwqIHZhbHVlIFRTUk1MU19EQyk7Ci16ZW5kX29iamVjdF92YWx1ZSBkZXNjcmlwdG9yX3Bvb2xfY3JlYXRlKHplbmRfY2xhc3NfZW50cnkgKmNlIFRTUk1MU19EQyk7Ci12b2lkIGRlc2NyaXB0b3JfcG9vbF9mcmVlX2MoRGVzY3JpcHRvclBvb2wqIG9iamVjdCBUU1JNTFNfREMpOwotdm9pZCBkZXNjcmlwdG9yX3Bvb2xfZnJlZSh2b2lkKiBvYmplY3QgVFNSTUxTX0RDKTsKLXZvaWQgZGVzY3JpcHRvcl9wb29sX2luaXRfY19pbnN0YW5jZShEZXNjcmlwdG9yUG9vbCogcG9vbCBUU1JNTFNfREMpOwotUEhQX01FVEhPRChEZXNjcmlwdG9yUG9vbCwgYWRkTWVzc2FnZSk7Ci1QSFBfTUVUSE9EKERlc2NyaXB0b3JQb29sLCBmaW5hbGl6ZSk7Ci0KLURlc2NyaXB0b3IqIHBocF90b19kZXNjcmlwdG9yKHp2YWwqIHZhbHVlIFRTUk1MU19EQyk7Ci16ZW5kX29iamVjdF92YWx1ZSBkZXNjcmlwdG9yX2NyZWF0ZSh6ZW5kX2NsYXNzX2VudHJ5ICpjZSBUU1JNTFNfREMpOwotdm9pZCBkZXNjcmlwdG9yX2luaXRfY19pbnN0YW5jZShEZXNjcmlwdG9yKiBpbnRlcm4gVFNSTUxTX0RDKTsKLXZvaWQgZGVzY3JpcHRvcl9mcmVlX2MoRGVzY3JpcHRvciogb2JqZWN0IFRTUk1MU19EQyk7Ci12b2lkIGRlc2NyaXB0b3JfZnJlZSh2b2lkKiBvYmplY3QgVFNSTUxTX0RDKTsKLXZvaWQgZGVzY3JpcHRvcl9uYW1lX3NldChEZXNjcmlwdG9yICpkZXNjLCBjb25zdCBjaGFyICpuYW1lKTsKLQotTWVzc2FnZUJ1aWxkZXJDb250ZXh0KiBwaHBfdG9fbWVzc2FnZV9idWlsZGVyX2NvbnRleHQoenZhbCogdmFsdWUgVFNSTUxTX0RDKTsKLXplbmRfb2JqZWN0X3ZhbHVlIG1lc3NhZ2VfYnVpbGRlcl9jb250ZXh0X2NyZWF0ZSgKLSAgICB6ZW5kX2NsYXNzX2VudHJ5KiBjZSBUU1JNTFNfREMpOwotdm9pZCBtZXNzYWdlX2J1aWxkZXJfY29udGV4dF9pbml0X2NfaW5zdGFuY2UoCi0gICAgTWVzc2FnZUJ1aWxkZXJDb250ZXh0KiBpbnRlcm4gVFNSTUxTX0RDKTsKLXZvaWQgbWVzc2FnZV9idWlsZGVyX2NvbnRleHRfZnJlZV9jKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCogb2JqZWN0IFRTUk1MU19EQyk7Ci12b2lkIG1lc3NhZ2VfYnVpbGRlcl9jb250ZXh0X2ZyZWUodm9pZCogb2JqZWN0IFRTUk1MU19EQyk7Ci1QSFBfTUVUSE9EKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwgb3B0aW9uYWwpOwotUEhQX01FVEhPRChNZXNzYWdlQnVpbGRlckNvbnRleHQsIGZpbmFsaXplVG9Qb29sKTsKLQotUEhQX01FVEhPRChNZXNzYWdlLCBlbmNvZGUpOwotY29uc3QgemVuZF9jbGFzc19lbnRyeSogYnVpbGRfY2xhc3NfZnJvbV9kZXNjcmlwdG9yKAotICAgIHp2YWwqIHBocF9kZXNjcmlwdG9yIFRTUk1MU19EQyk7Ci0KLVBIUF9GVU5DVElPTihnZXRfZ2VuZXJhdGVkX3Bvb2wpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gR2xvYmFsIG1hcCBmcm9tIHVwYiB7bXNnLGVudW19ZGVmcyB0byB3cmFwcGVyIERlc2NyaXB0b3IvRW51bURlc2NyaXB0b3IKLS8vIGluc3RhbmNlcy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBhZGRfZGVmX29iaihjb25zdCB2b2lkKiBkZWYsIHp2YWwqIHZhbHVlKTsKLXp2YWwqIGdldF9kZWZfb2JqKGNvbnN0IHZvaWQqIGRlZik7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBVdGlsaXRpZXMuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBQSFAgQXJyYXkgdXRpbHMuCi0jZGVmaW5lIFpfQVJSVkFMX1NJWkVfUCh6dmFsX3ApIHplbmRfaGFzaF9udW1fZWxlbWVudHMoWl9BUlJWQUxfUCh6dmFsX3ApKQotI2RlZmluZSBaX0FSUlZBTF9CRUdJTl9QKHp2YWxfcCkgWl9BUlJWQUxfUCh6dmFsX3ApLT5wTGlzdEhlYWQKLSNkZWZpbmUgWl9CVUNLRVRfTkVYVF9QUChidWNrZXRfcHApICpidWNrZXRfcHAgPSAoKmJ1Y2tldF9wcCktPnBMaXN0TmV4dAotCi0jZGVmaW5lIERFRklORV9QSFBfT0JKRUNUKGNsYXNzX25hbWUsIGNsYXNzX25hbWVfbG93ZXIsIG5hbWUpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHp2YWwqIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgTUFLRV9TVERfWlZBTChuYW1lKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBvYmplY3RfaW5pdF9leChuYW1lLCBjbGFzc19uYW1lX2xvd2VyIyNfdHlwZSk7ICAgICAgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0jZGVmaW5lIERFRklORV9QSFBfV1JBUFBFUihjbGFzc19uYW1lLCBjbGFzc19uYW1lX2xvd2VyLCBuYW1lLCBpbnRlcm4pIFwKLSAgenZhbCogbmFtZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBNQUtFX1NURF9aVkFMKG5hbWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG9iamVjdF9pbml0X2V4KG5hbWUsIGNsYXNzX25hbWVfbG93ZXIjI190eXBlKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgWl9PQkpWQUxfUChuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgLmhhbmRsZSA9IHplbmRfb2JqZWN0c19zdG9yZV9wdXQoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpbnRlcm4sICh6ZW5kX29iamVjdHNfc3RvcmVfZHRvcl90KXplbmRfb2JqZWN0c19kZXN0cm95X29iamVjdCwgIFwKLSAgICAgIGNsYXNzX25hbWVfbG93ZXIjI19mcmVlLCBOVUxMIFRTUk1MU19DQyk7Ci0KLSNkZWZpbmUgREVGSU5FX1BIUF9aVkFMKG5hbWUpIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB6dmFsKiBuYW1lOyAgICAgICAgICAgICAgIFwKLSAgICBNQUtFX1NURF9aVkFMKG5hbWUpOyAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotI2RlZmluZSBERUZJTkVfUEhQX1NUUklORyhuYW1lLCB2YWx1ZSkgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHp2YWwqIG5hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIE1BS0VfU1REX1pWQUwobmFtZSk7ICAgICAgICAgICAgICAgXAotICAgIFpWQUxfU1RSSU5HKG5hbWUsIHZhbHVlLCAxKTsgICAgICAgXAotICB9IHdoaWxlICgwKQotCi0vLyBVcGIgVXRpbGl0aWVzCi0KLXZvaWQgY2hlY2tfdXBiX3N0YXR1cyhjb25zdCB1cGJfc3RhdHVzKiBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7Ci0KLSNkZWZpbmUgQ0hFQ0tfVVBCKGNvZGUsIG1zZykgICAgICAgICAgICAgXAotICBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdXBiX3N0YXR1cyBzdGF0dXMgPSBVUEJfU1RBVFVTX0lOSVQ7IFwKLSAgICBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoZWNrX3VwYl9zdGF0dXMoJnN0YXR1cywgbXNnKTsgICAgICBcCi0gIH0gd2hpbGUgKDApCi0KLS8vIE1lbW9yeSBtYW5hZ2VtZW50Ci0KLSNkZWZpbmUgQUxMT0MoY2xhc3NfbmFtZSkgKGNsYXNzX25hbWUqKSBlbWFsbG9jKHNpemVvZihjbGFzc19uYW1lKSkKLSNkZWZpbmUgQUxMT0NfTihjbGFzc19uYW1lLCBuKSAoY2xhc3NfbmFtZSopIGVtYWxsb2Moc2l6ZW9mKGNsYXNzX25hbWUpICogbikKLSNkZWZpbmUgRlJFRShvYmplY3QpIGVmcmVlKG9iamVjdCkKLQotLy8gVHlwZSBDaGVja2luZwotI2RlZmluZSBDSEVDS19UWVBFKGZpZWxkLCB0eXBlKSAgICAgICAgICAgICBcCi0gIGlmIChaX1RZUEVfUChmaWVsZCkgIT0gdHlwZSkgeyAgICAgICAgICAgIFwKLSAgICB6ZW5kX2Vycm9yKEVfRVJST1IsICJVbmV4cGVjdGVkIHR5cGUiKTsgXAotICB9Ci0KLSNlbmRpZiAgLy8gX19HT09HTEVfUFJPVE9CVUZfUEhQX1BST1RPQlVGX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvc3RvcmFnZS5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvc3RvcmFnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNWEwOWMxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL3N0b3JhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDUzOSArMCwwIEBACi0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8cHJvdG9idWYuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBIUCA8LT4gbmF0aXZlIHNsb3QgbWFuYWdlbWVudC4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyB6dmFsKiBpbnQzMl90b196dmFsKGludDMyX3QgdmFsdWUpIHsKLSAgenZhbCogdG1wOwotICBNQUtFX1NURF9aVkFMKHRtcCk7Ci0gIFpWQUxfTE9ORyh0bXAsIHZhbHVlKTsKLSAgcGhwX3ByaW50ZigiaW50MzIgdG8genZhbFxuIik7Ci0gIC8vIFpWQUxfTE9ORyh0bXAsIDEpOwotICByZXR1cm4gdG1wOwotfQotCi0jZGVmaW5lIERFUkVGKG1lbW9yeSwgdHlwZSkgKih0eXBlKikobWVtb3J5KQotCi1zaXplX3QgbmF0aXZlX3Nsb3Rfc2l6ZSh1cGJfZmllbGR0eXBlX3QgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0ZMT0FUOiByZXR1cm4gNDsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogcmV0dXJuIDg7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOiByZXR1cm4gMTsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzogcmV0dXJuIHNpemVvZih6dmFsKik7Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzogcmV0dXJuIHNpemVvZih6dmFsKik7Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOiByZXR1cm4gc2l6ZW9mKHp2YWwqKTsKLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06IHJldHVybiA0OwotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6IHJldHVybiA0OwotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6IHJldHVybiA4OwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOiByZXR1cm4gNDsKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDogcmV0dXJuIDg7Ci0gICAgZGVmYXVsdDogcmV0dXJuIDA7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgaXNfcGhwX251bSh6dmFsKiB2YWx1ZSkgewotICAvLyBJcyBudW1lcmlhbCBzdHJpbmcgYWxzbyB2YWxpZD8KLSAgcmV0dXJuIChaX1RZUEVfUCh2YWx1ZSkgPT0gSVNfTE9ORyB8fAotICAgICAgICAgIFpfVFlQRV9QKHZhbHVlKSA9PSBJU19ET1VCTEUpOwotfQotCi12b2lkIG5hdGl2ZV9zbG90X2NoZWNrX2ludF9yYW5nZV9wcmVjaXNpb24odXBiX2ZpZWxkdHlwZV90IHR5cGUsIHp2YWwqIHZhbCkgewotICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gIC8vIGlmICghaXNfcGhwX251bSh2YWwpKSB7Ci0gIC8vICAgemVuZF9lcnJvcihFX0VSUk9SLCAiRXhwZWN0ZWQgbnVtYmVyIHR5cGUgZm9yIGludGVncmFsIGZpZWxkLiIpOwotICAvLyB9Ci0KLSAgLy8gaWYgKFpfVFlQRV9QKHZhbCkgPT0gSVNfRE9VQkxFKSB7Ci0gIC8vICAgZG91YmxlIGRibF92YWwgPSBOVU0yREJMKHZhbCk7Ci0gIC8vICAgaWYgKGZsb29yKGRibF92YWwpICE9IGRibF92YWwpIHsKLSAgLy8gICAgIHplbmRfZXJyb3IoRV9FUlJPUiwKLSAgLy8gICAgICAgICAgICAgICJOb24taW50ZWdyYWwgZmxvYXRpbmcgcG9pbnQgdmFsdWUgYXNzaWduZWQgdG8gaW50ZWdlciBmaWVsZC4iKTsKLSAgLy8gICB9Ci0gIC8vIH0KLSAgLy8gaWYgKHR5cGUgPT0gVVBCX1RZUEVfVUlOVDMyIHx8IHR5cGUgPT0gVVBCX1RZUEVfVUlOVDY0KSB7Ci0gIC8vICAgaWYgKE5VTTJEQkwodmFsKSA8IDApIHsKLSAgLy8gICAgIHplbmRfZXJyb3IoRV9FUlJPUiwKLSAgLy8gICAgICAgICAgICAgICJBc3NpZ25pbmcgbmVnYXRpdmUgdmFsdWUgdG8gdW5zaWduZWQgaW50ZWdlciBmaWVsZC4iKTsKLSAgLy8gICB9Ci0gIC8vIH0KLX0KLQotenZhbCogbmF0aXZlX3Nsb3RfZ2V0KHVwYl9maWVsZHR5cGVfdCB0eXBlLCAvKlZBTFVFIHR5cGVfY2xhc3MsKi8KLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtZW1vcnkgVFNSTUxTX0RDKSB7Ci0gIHp2YWwqIHJldHZhbCA9IE5VTEw7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIC8vIFRPRE8odGVib3JpbmcpOiBBZGQgaXQgYmFjay4KLSAgICAvLyBjYXNlIFVQQl9UWVBFX0ZMT0FUOgotICAgIC8vICAgcmV0dXJuIERCTDJOVU0oREVSRUYobWVtb3J5LCBmbG9hdCkpOwotICAgIC8vIGNhc2UgVVBCX1RZUEVfRE9VQkxFOgotICAgIC8vICAgcmV0dXJuIERCTDJOVU0oREVSRUYobWVtb3J5LCBkb3VibGUpKTsKLSAgICAvLyBjYXNlIFVQQl9UWVBFX0JPT0w6Ci0gICAgLy8gICByZXR1cm4gREVSRUYobWVtb3J5LCBpbnQ4X3QpID8gUXRydWUgOiBRZmFsc2U7Ci0gICAgLy8gY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgLy8gY2FzZSBVUEJfVFlQRV9CWVRFUzoKLSAgICAvLyBjYXNlIFVQQl9UWVBFX01FU1NBR0U6Ci0gICAgLy8gICByZXR1cm4gREVSRUYobWVtb3J5LCBWQUxVRSk7Ci0gICAgLy8gY2FzZSBVUEJfVFlQRV9FTlVNOiB7Ci0gICAgLy8gICBpbnQzMl90IHZhbCA9IERFUkVGKG1lbW9yeSwgaW50MzJfdCk7Ci0gICAgLy8gICBWQUxVRSBzeW1ib2wgPSBlbnVtX2xvb2t1cCh0eXBlX2NsYXNzLCBJTlQyTlVNKHZhbCkpOwotICAgIC8vICAgaWYgKHN5bWJvbCA9PSBRbmlsKSB7Ci0gICAgLy8gICAgIHJldHVybiBJTlQyTlVNKHZhbCk7Ci0gICAgLy8gICB9IGVsc2UgewotICAgIC8vICAgICByZXR1cm4gc3ltYm9sOwotICAgIC8vICAgfQotICAgIC8vIH0KLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOgotICAgICAgcmV0dXJuIGludDMyX3RvX3p2YWwoREVSRUYobWVtb3J5LCBpbnQzMl90KSk7Ci0gICAgLy8gVE9ETyh0ZWJvcmluZyk6IEFkZCBpdCBiYWNrLgotICAgIC8vIGNhc2UgVVBCX1RZUEVfSU5UNjQ6Ci0gICAgLy8gICByZXR1cm4gTEwyTlVNKERFUkVGKG1lbW9yeSwgaW50NjRfdCkpOwotICAgIC8vIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgIC8vICAgcmV0dXJuIFVJTlQyTlVNKERFUkVGKG1lbW9yeSwgdWludDMyX3QpKTsKLSAgICAvLyBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAvLyAgIHJldHVybiBVTEwyTlVNKERFUkVGKG1lbW9yeSwgdWludDY0X3QpKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIEVHKHVuaW5pdGlhbGl6ZWRfenZhbF9wdHIpOwotICB9Ci19Ci0KLXZvaWQgbmF0aXZlX3Nsb3RfaW5pdCh1cGJfZmllbGR0eXBlX3QgdHlwZSwgdm9pZCogbWVtb3J5KSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVVBCX1RZUEVfRkxPQVQ6Ci0gICAgICBERVJFRihtZW1vcnksIGZsb2F0KSA9IDAuMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfRE9VQkxFOgotICAgICAgREVSRUYobWVtb3J5LCBkb3VibGUpID0gMC4wOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOgotICAgICAgREVSRUYobWVtb3J5LCBpbnQ4X3QpID0gMDsKLSAgICAgIGJyZWFrOwotICAgIC8vIFRPRE8odGVib3JpbmcpOiBBZGQgaXQgYmFjay4KLSAgICAvLyBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICAvLyBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgIC8vICAgREVSRUYobWVtb3J5LCBWQUxVRSkgPSBwaHBfc3RyX25ldzIoIiIpOwotICAgIC8vICAgcGhwX2VuY19hc3NvY2lhdGUoREVSRUYobWVtb3J5LCBWQUxVRSksICh0eXBlID09IFVQQl9UWVBFX0JZVEVTKQotICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8ga1J1YnlTdHJpbmc4Yml0RW5jb2RpbmcKLSAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IGtSdWJ5U3RyaW5nVXRmOEVuY29kaW5nKTsKLSAgICAvLyAgIGJyZWFrOwotICAgIC8vIGNhc2UgVVBCX1RZUEVfTUVTU0FHRToKLSAgICAvLyAgIERFUkVGKG1lbW9yeSwgVkFMVUUpID0gUW5pbDsKLSAgICAvLyAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfRU5VTToKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOgotICAgICAgREVSRUYobWVtb3J5LCBpbnQzMl90KSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDY0OgotICAgICAgREVSRUYobWVtb3J5LCBpbnQ2NF90KSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjoKLSAgICAgIERFUkVGKG1lbW9yeSwgdWludDMyX3QpID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgREVSRUYobWVtb3J5LCB1aW50NjRfdCkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgbmF0aXZlX3Nsb3Rfc2V0KHVwYl9maWVsZHR5cGVfdCB0eXBlLCAvKlZBTFVFIHR5cGVfY2xhc3MsKi8gdm9pZCogbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgenZhbCogdmFsdWUpIHsKLSAgbmF0aXZlX3Nsb3Rfc2V0X3ZhbHVlX2FuZF9jYXNlKHR5cGUsIC8qdHlwZV9jbGFzcywqLyBtZW1vcnksIHZhbHVlLCBOVUxMLCAwKTsKLX0KLQotdm9pZCBuYXRpdmVfc2xvdF9zZXRfdmFsdWVfYW5kX2Nhc2UodXBiX2ZpZWxkdHlwZV90IHR5cGUsIC8qVkFMVUUgdHlwZV9jbGFzcywqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbWVtb3J5LCB6dmFsKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjYXNlX21lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhc2VfbnVtYmVyKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVVBCX1RZUEVfRkxPQVQ6Ci0gICAgICBpZiAoIVpfVFlQRV9QKHZhbHVlKSA9PSBJU19MT05HKSB7Ci0gICAgICAgIHplbmRfZXJyb3IoRV9FUlJPUiwgIkV4cGVjdGVkIG51bWJlciB0eXBlIGZvciBmbG9hdCBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIERFUkVGKG1lbW9yeSwgZmxvYXQpID0gWl9EVkFMX1AodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9ET1VCTEU6Ci0gICAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgICAvLyBpZiAoIWlzX3BocF9udW0odmFsdWUpKSB7Ci0gICAgICAvLyAgIHplbmRfZXJyb3IoRV9FUlJPUiwgIkV4cGVjdGVkIG51bWJlciB0eXBlIGZvciBkb3VibGUgZmllbGQuIik7Ci0gICAgICAvLyB9Ci0gICAgICAvLyBERVJFRihtZW1vcnksIGRvdWJsZSkgPSBaX0RWQUxfUCh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0JPT0w6IHsKLSAgICAgIGludDhfdCB2YWwgPSAtMTsKLSAgICAgIGlmICh6dmFsX2lzX3RydWUodmFsdWUpKSB7Ci0gICAgICAgIHZhbCA9IDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB2YWwgPSAwOwotICAgICAgfQotICAgICAgLy8gVE9ETyh0ZWJvcmluZyk6IEFkZCBpdCBiYWNrLgotICAgICAgLy8gZWxzZSBpZiAodmFsdWUgPT0gUWZhbHNlKSB7Ci0gICAgICAvLyAgIHZhbCA9IDA7Ci0gICAgICAvLyB9Ci0gICAgICAvLyBlbHNlIHsKLSAgICAgIC8vICAgcGhwX3JhaXNlKHBocF9lVHlwZUVycm9yLCAiSW52YWxpZCBhcmd1bWVudCBmb3IgYm9vbGVhbiBmaWVsZC4iKTsKLSAgICAgIC8vIH0KLSAgICAgIERFUkVGKG1lbW9yeSwgaW50OF90KSA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOiB7Ci0gICAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgICAvLyBpZiAoWl9UWVBFX1AodmFsdWUpICE9IElTX1NUUklORykgewotICAgICAgLy8gICB6ZW5kX2Vycm9yKEVfRVJST1IsICJJbnZhbGlkIGFyZ3VtZW50IGZvciBzdHJpbmcgZmllbGQuIik7Ci0gICAgICAvLyB9Ci0gICAgICAvLyBuYXRpdmVfc2xvdF92YWxpZGF0ZV9zdHJpbmdfZW5jb2RpbmcodHlwZSwgdmFsdWUpOwotICAgICAgLy8gREVSRUYobWVtb3J5LCB6dmFsKikgPSB2YWx1ZTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6IHsKLSAgICAgIC8vIFRPRE8odGVib3JpbmcpOiBBZGQgaXQgYmFjay4KLSAgICAgIC8vIGlmIChDTEFTU19PRih2YWx1ZSkgPT0gQ0xBU1NfT0YoUW5pbCkpIHsKLSAgICAgIC8vICAgdmFsdWUgPSBRbmlsOwotICAgICAgLy8gfSBlbHNlIGlmIChDTEFTU19PRih2YWx1ZSkgIT0gdHlwZV9jbGFzcykgewotICAgICAgLy8gICBwaHBfcmFpc2UocGhwX2VUeXBlRXJyb3IsCi0gICAgICAvLyAgICAgICAgICAgICJJbnZhbGlkIHR5cGUgJXMgdG8gYXNzaWduIHRvIHN1Ym1lc3NhZ2UgZmllbGQuIiwKLSAgICAgIC8vICAgICAgICAgICAgcGhwX2NsYXNzMm5hbWUoQ0xBU1NfT0YodmFsdWUpKSk7Ci0gICAgICAvLyB9Ci0gICAgICAvLyBERVJFRihtZW1vcnksIFZBTFVFKSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfRU5VTTogewotICAgICAgLy8gVE9ETyh0ZWJvcmluZyk6IEFkZCBpdCBiYWNrLgotICAgICAgLy8gaW50MzJfdCBpbnRfdmFsID0gMDsKLSAgICAgIC8vIGlmICghaXNfcGhwX251bSh2YWx1ZSkgJiYgVFlQRSh2YWx1ZSkgIT0gVF9TWU1CT0wpIHsKLSAgICAgIC8vICAgcGhwX3JhaXNlKHBocF9lVHlwZUVycm9yLAotICAgICAgLy8gICAgICAgICAgICAiRXhwZWN0ZWQgbnVtYmVyIG9yIHN5bWJvbCB0eXBlIGZvciBlbnVtIGZpZWxkLiIpOwotICAgICAgLy8gfQotICAgICAgLy8gaWYgKFRZUEUodmFsdWUpID09IFRfU1lNQk9MKSB7Ci0gICAgICAvLyAgIC8vIEVuc3VyZSB0aGF0IHRoZSBnaXZlbiBzeW1ib2wgZXhpc3RzIGluIHRoZSBlbnVtIG1vZHVsZS4KLSAgICAgIC8vICAgVkFMVUUgbG9va3VwID0gcGhwX2Z1bmNhbGwodHlwZV9jbGFzcywgcGhwX2ludGVybigicmVzb2x2ZSIpLCAxLCB2YWx1ZSk7Ci0gICAgICAvLyAgIGlmIChsb29rdXAgPT0gUW5pbCkgewotICAgICAgLy8gICAgIHBocF9yYWlzZShwaHBfZVJhbmdlRXJyb3IsICJVbmtub3duIHN5bWJvbCB2YWx1ZSBmb3IgZW51bSBmaWVsZC4iKTsKLSAgICAgIC8vICAgfSBlbHNlIHsKLSAgICAgIC8vICAgICBpbnRfdmFsID0gTlVNMklOVChsb29rdXApOwotICAgICAgLy8gICB9Ci0gICAgICAvLyB9IGVsc2UgewotICAgICAgLy8gICBuYXRpdmVfc2xvdF9jaGVja19pbnRfcmFuZ2VfcHJlY2lzaW9uKFVQQl9UWVBFX0lOVDMyLCB2YWx1ZSk7Ci0gICAgICAvLyAgIGludF92YWwgPSBOVU0ySU5UKHZhbHVlKTsKLSAgICAgIC8vIH0KLSAgICAgIC8vIERFUkVGKG1lbW9yeSwgaW50MzJfdCkgPSBpbnRfdmFsOwotICAgICAgLy8gYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjoKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAgIG5hdGl2ZV9zbG90X2NoZWNrX2ludF9yYW5nZV9wcmVjaXNpb24odHlwZSwgdmFsdWUpOwotICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgICAgICAgcGhwX3ByaW50ZigiU2V0dGluZyBJTlQzMiBmaWVsZFxuIik7Ci0gICAgICAgICAgREVSRUYobWVtb3J5LCBpbnQzMl90KSA9IFpfTFZBTF9QKHZhbHVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgICAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgICAgICAgLy8gREVSRUYobWVtb3J5LCBpbnQ2NF90KSA9IE5VTTJMTCh2YWx1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgICAgICAgIC8vIFRPRE8odGVib3JpbmcpOiBBZGQgaXQgYmFjay4KLSAgICAgICAgICAvLyBERVJFRihtZW1vcnksIHVpbnQzMl90KSA9IE5VTTJVSU5UKHZhbHVlKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgICAgICAgLy8gVE9ETyh0ZWJvcmluZyk6IEFkZCBpdCBiYWNrLgotICAgICAgICAgIC8vIERFUkVGKG1lbW9yeSwgdWludDY0X3QpID0gTlVNMlVMTCh2YWx1ZSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLQotICBpZiAoY2FzZV9tZW1vcnkgIT0gTlVMTCkgewotICAgICpjYXNlX21lbW9yeSA9IGNhc2VfbnVtYmVyOwotICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYXAgZmllbGQgdXRpbGl0aWVzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCB1cGJfbXNnZGVmKiB0cnlnZXRfbWFwX2VudHJ5X21zZ2RlZihjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYqIHN1YmRlZjsKLSAgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgIT0gVVBCX0xBQkVMX1JFUEVBVEVEIHx8Ci0gICAgICB1cGJfZmllbGRkZWZfdHlwZShmaWVsZCkgIT0gVVBCX1RZUEVfTUVTU0FHRSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHN1YmRlZiA9IHVwYl9maWVsZGRlZl9tc2dzdWJkZWYoZmllbGQpOwotICByZXR1cm4gdXBiX21zZ2RlZl9tYXBlbnRyeShzdWJkZWYpID8gc3ViZGVmIDogTlVMTDsKLX0KLQotY29uc3QgdXBiX21zZ2RlZiogbWFwX2VudHJ5X21zZ2RlZihjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYqIHN1YmRlZiA9IHRyeWdldF9tYXBfZW50cnlfbXNnZGVmKGZpZWxkKTsKLSAgYXNzZXJ0KHN1YmRlZik7Ci0gIHJldHVybiBzdWJkZWY7Ci19Ci0KLWJvb2wgaXNfbWFwX2ZpZWxkKGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQpIHsKLSAgcmV0dXJuIHRyeWdldF9tYXBfZW50cnlfbXNnZGVmKGZpZWxkKSAhPSBOVUxMOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWVtb3J5IGxheW91dCBtYW5hZ2VtZW50LgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIHNpemVfdCBhbGlnbl91cF90byhzaXplX3Qgb2Zmc2V0LCBzaXplX3QgZ3JhbnVsYXJpdHkpIHsKLSAgLy8gR3JhbnVsYXJpdHkgbXVzdCBiZSBhIHBvd2VyIG9mIHR3by4KLSAgcmV0dXJuIChvZmZzZXQgKyBncmFudWxhcml0eSAtIDEpICYgfihncmFudWxhcml0eSAtIDEpOwotfQotCi1NZXNzYWdlTGF5b3V0KiBjcmVhdGVfbGF5b3V0KGNvbnN0IHVwYl9tc2dkZWYqIG1zZ2RlZikgewotICBNZXNzYWdlTGF5b3V0KiBsYXlvdXQgPSBBTExPQyhNZXNzYWdlTGF5b3V0KTsKLSAgaW50IG5maWVsZHMgPSB1cGJfbXNnZGVmX251bWZpZWxkcyhtc2dkZWYpOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaXQ7Ci0gIHVwYl9tc2dfb25lb2ZfaXRlciBvaXQ7Ci0gIHNpemVfdCBvZmYgPSAwOwotCi0gIGxheW91dC0+ZmllbGRzID0gQUxMT0NfTihNZXNzYWdlRmllbGQsIG5maWVsZHMpOwotCi0gIGZvciAodXBiX21zZ19maWVsZF9iZWdpbigmaXQsIG1zZ2RlZik7ICF1cGJfbXNnX2ZpZWxkX2RvbmUoJml0KTsKLSAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJml0KSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJml0KTsKLSAgICBzaXplX3QgZmllbGRfc2l6ZTsKLQotICAgIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGZpZWxkKSkgewotICAgICAgLy8gT25lb2ZzIGFyZSBoYW5kbGVkIHNlcGFyYXRlbHkgYmVsb3cuCi0gICAgICBjb250aW51ZTsKLSAgICB9Ci0KLSAgICAvLyBBbGxvY2F0ZSB8ZmllbGRfc2l6ZXwgYnl0ZXMgZm9yIHRoaXMgZmllbGQgaW4gdGhlIGxheW91dC4KLSAgICBmaWVsZF9zaXplID0gMDsKLSAgICBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICAgIGZpZWxkX3NpemUgPSBzaXplb2YoenZhbCopOwotICAgIH0gZWxzZSB7Ci0gICAgICBmaWVsZF9zaXplID0gbmF0aXZlX3Nsb3Rfc2l6ZSh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCkpOwotICAgIH0KLQotICAgIC8vIEFsaWduIGN1cnJlbnQgb2Zmc2V0IHVwIHRvIHwgc2l6ZSB8IGdyYW51bGFyaXR5LgotICAgIG9mZiA9IGFsaWduX3VwX3RvKG9mZiwgZmllbGRfc2l6ZSk7Ci0gICAgbGF5b3V0LT5maWVsZHNbdXBiX2ZpZWxkZGVmX2luZGV4KGZpZWxkKV0ub2Zmc2V0ID0gb2ZmOwotICAgIGxheW91dC0+ZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmaWVsZCldLmNhc2Vfb2Zmc2V0ID0KLSAgICAgICAgTUVTU0FHRV9GSUVMRF9OT19DQVNFOwotICAgIG9mZiArPSBmaWVsZF9zaXplOwotICB9Ci0KLSAgLy8gSGFuZGxlIG9uZW9mcyBub3cgLS0gd2UgaXRlcmF0ZSBvdmVyIG9uZW9mcyBzcGVjaWZpY2FsbHkgYW5kIGFsbG9jYXRlIG9ubHkKLSAgLy8gb25lIHNsb3QgcGVyIG9uZW9mLgotICAvLwotICAvLyBXZSBhc3NpZ24gYWxsIHZhbHVlIHNsb3RzIGZpcnN0LCB0aGVuIHBhY2sgdGhlICdjYXNlJyBmaWVsZHMgYXQgdGhlIGVuZCwKLSAgLy8gc2luY2UgaW4gdGhlIGNvbW1vbiBjYXNlIChtb2Rlcm4gNjQtYml0IHBsYXRmb3JtKSB0aGVzZSBhcmUgOCBieXRlcyBhbmQgNAotICAvLyBieXRlcyByZXNwZWN0aXZlbHkgYW5kIHdlIHdhbnQgdG8gYXZvaWQgYWxpZ25tZW50IG92ZXJoZWFkLgotICAvLwotICAvLyBOb3RlIHRoYXQgd2UgcmVzZXJ2ZSA0IGJ5dGVzIChhIHVpbnQzMikgcGVyICdjYXNlJyBzbG90IGJlY2F1c2UgdGhlIHZhbHVlCi0gIC8vIHNwYWNlIGZvciBvbmVvZiBjYXNlcyBpcyBjb25jZXB0dWFsbHkgYXMgd2lkZSBhcyBmaWVsZCB0YWcgbnVtYmVycy4gIEluCi0gIC8vIHByYWN0aWNlLCBpdCdzIHVubGlrZWx5IHRoYXQgYSBvbmVvZiB3b3VsZCBoYXZlIG1vcmUgdGhhbiBlLmcuICAyNTYgb3IgNjRLCi0gIC8vIG1lbWJlcnMgKDggb3IgMTYgYml0cyByZXNwZWN0aXZlbHkpLCBzbyBjb25jZWl2YWJseSB3ZSBjb3VsZCBhc3NpZ24KLSAgLy8gY29uc2VjdXRpdmUgY2FzZSBudW1iZXJzIGFuZCB0aGVuIHBpY2sgYSBzbWFsbGVyIG9uZW9mIGNhc2Ugc2xvdCBzaXplLCBidXQKLSAgLy8gdGhlIGNvbXBsZXhpdHkgdG8gaW1wbGVtZW50IHRoaXMgaW5kaXJlY3Rpb24gaXMgcHJvYmFibHkgbm90IHdvcnRod2hpbGUuCi0gIGZvciAodXBiX21zZ19vbmVvZl9iZWdpbigmb2l0LCBtc2dkZWYpOyAhdXBiX21zZ19vbmVvZl9kb25lKCZvaXQpOwotICAgICAgIHVwYl9tc2dfb25lb2ZfbmV4dCgmb2l0KSkgewotICAgIGNvbnN0IHVwYl9vbmVvZmRlZiogb25lb2YgPSB1cGJfbXNnX2l0ZXJfb25lb2YoJm9pdCk7Ci0gICAgdXBiX29uZW9mX2l0ZXIgZml0OwotCi0gICAgLy8gQWx3YXlzIGFsbG9jYXRlIE5BVElWRV9TTE9UX01BWF9TSVpFIGJ5dGVzLCBidXQgc2hhcmUgdGhlIHNsb3QgYmV0d2VlbgotICAgIC8vIGFsbCBmaWVsZHMuCi0gICAgc2l6ZV90IGZpZWxkX3NpemUgPSBOQVRJVkVfU0xPVF9NQVhfU0laRTsKLSAgICAvLyBBbGlnbiB0aGUgb2Zmc2V0IC4KLSAgICBvZmYgPSBhbGlnbl91cF90byggb2ZmLCBmaWVsZF9zaXplKTsKLSAgICAvLyBBc3NpZ24gYWxsIGZpZWxkcyBpbiB0aGUgb25lb2YgdGhpcyBzYW1lIG9mZnNldC4KLSAgICBmb3IgKHVwYl9vbmVvZl9iZWdpbigmZml0LCBvbmVvZik7ICF1cGJfb25lb2ZfZG9uZSgmZml0KTsKLSAgICAgICAgIHVwYl9vbmVvZl9uZXh0KCZmaXQpKSB7Ci0gICAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX29uZW9mX2l0ZXJfZmllbGQoJmZpdCk7Ci0gICAgICBsYXlvdXQtPmZpZWxkc1t1cGJfZmllbGRkZWZfaW5kZXgoZmllbGQpXS5vZmZzZXQgPSBvZmY7Ci0gICAgfQotICAgIG9mZiArPSBmaWVsZF9zaXplOwotICB9Ci0KLSAgLy8gTm93IHRoZSBjYXNlIGZpZWxkcy4KLSAgZm9yICh1cGJfbXNnX29uZW9mX2JlZ2luKCZvaXQsIG1zZ2RlZik7ICF1cGJfbXNnX29uZW9mX2RvbmUoJm9pdCk7Ci0gICAgICAgdXBiX21zZ19vbmVvZl9uZXh0KCZvaXQpKSB7Ci0gICAgY29uc3QgdXBiX29uZW9mZGVmKiBvbmVvZiA9IHVwYl9tc2dfaXRlcl9vbmVvZigmb2l0KTsKLSAgICB1cGJfb25lb2ZfaXRlciBmaXQ7Ci0KLSAgICBzaXplX3QgZmllbGRfc2l6ZSA9IHNpemVvZih1aW50MzJfdCk7Ci0gICAgLy8gQWxpZ24gdGhlIG9mZnNldCAuCi0gICAgb2ZmID0gKG9mZiArIGZpZWxkX3NpemUgLSAxKSAmIH4oZmllbGRfc2l6ZSAtIDEpOwotICAgIC8vIEFzc2lnbiBhbGwgZmllbGRzIGluIHRoZSBvbmVvZiB0aGlzIHNhbWUgb2Zmc2V0LgotICAgIGZvciAodXBiX29uZW9mX2JlZ2luKCZmaXQsIG9uZW9mKTsgIXVwYl9vbmVvZl9kb25lKCZmaXQpOwotICAgICAgICAgdXBiX29uZW9mX25leHQoJmZpdCkpIHsKLSAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQgPSB1cGJfb25lb2ZfaXRlcl9maWVsZCgmZml0KTsKLSAgICAgIGxheW91dC0+ZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmaWVsZCldLmNhc2Vfb2Zmc2V0ID0gb2ZmOwotICAgIH0KLSAgICBvZmYgKz0gZmllbGRfc2l6ZTsKLSAgfQotCi0gIGxheW91dC0+c2l6ZSA9IG9mZjsKLQotICBsYXlvdXQtPm1zZ2RlZiA9IG1zZ2RlZjsKLSAgdXBiX21zZ2RlZl9yZWYobGF5b3V0LT5tc2dkZWYsICZsYXlvdXQtPm1zZ2RlZik7Ci0KLSAgcmV0dXJuIGxheW91dDsKLX0KLQotdm9pZCBmcmVlX2xheW91dChNZXNzYWdlTGF5b3V0KiBsYXlvdXQpIHsKLSAgRlJFRShsYXlvdXQtPmZpZWxkcyk7Ci0gIHVwYl9tc2dkZWZfdW5yZWYobGF5b3V0LT5tc2dkZWYsICZsYXlvdXQtPm1zZ2RlZik7Ci0gIEZSRUUobGF5b3V0KTsKLX0KLQotLy8gVE9ETyh0ZWJvcmluZyk6IEFkZCBpdCBiYWNrLgotLy8gVkFMVUUgZmllbGRfdHlwZV9jbGFzcyhjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0vLyAgIFZBTFVFIHR5cGVfY2xhc3MgPSBRbmlsOwotLy8gICBpZiAodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpID09IFVQQl9UWVBFX01FU1NBR0UpIHsKLS8vICAgICBWQUxVRSBzdWJtc2dkZXNjID0gZ2V0X2RlZl9vYmoodXBiX2ZpZWxkZGVmX3N1YmRlZihmaWVsZCkpOwotLy8gICAgIHR5cGVfY2xhc3MgPSBEZXNjcmlwdG9yX21zZ2NsYXNzKHN1Ym1zZ2Rlc2MpOwotLy8gICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSA9PSBVUEJfVFlQRV9FTlVNKSB7Ci0vLyAgICAgVkFMVUUgc3ViZW51bWRlc2MgPSBnZXRfZGVmX29iaih1cGJfZmllbGRkZWZfc3ViZGVmKGZpZWxkKSk7Ci0vLyAgICAgdHlwZV9jbGFzcyA9IEVudW1EZXNjcmlwdG9yX2VudW1tb2R1bGUoc3ViZW51bWRlc2MpOwotLy8gICB9Ci0vLyAgIHJldHVybiB0eXBlX2NsYXNzOwotLy8gfQotCi1zdGF0aWMgdm9pZCogc2xvdF9tZW1vcnkoTWVzc2FnZUxheW91dCogbGF5b3V0LCBjb25zdCB2b2lkKiBzdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQpIHsKLSAgcmV0dXJuICgodWludDhfdCopc3RvcmFnZSkgKyBsYXlvdXQtPmZpZWxkc1t1cGJfZmllbGRkZWZfaW5kZXgoZmllbGQpXS5vZmZzZXQ7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCogc2xvdF9vbmVvZl9jYXNlKE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgY29uc3Qgdm9pZCogc3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQpIHsKLSAgcmV0dXJuICh1aW50MzJfdCopKCgodWludDhfdCopc3RvcmFnZSkgKwotICAgICAgICAgICAgICAgICAgICAgbGF5b3V0LT5maWVsZHNbdXBiX2ZpZWxkZGVmX2luZGV4KGZpZWxkKV0uY2FzZV9vZmZzZXQpOwotfQotCi12b2lkIGxheW91dF9zZXQoTWVzc2FnZUxheW91dCogbGF5b3V0LCB2b2lkKiBzdG9yYWdlLCBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkLAotICAgICAgICAgICAgICAgIHp2YWwqIHZhbCkgewotICB2b2lkKiBtZW1vcnkgPSBzbG90X21lbW9yeShsYXlvdXQsIHN0b3JhZ2UsIGZpZWxkKTsKLSAgdWludDMyX3QqIG9uZW9mX2Nhc2UgPSBzbG90X29uZW9mX2Nhc2UobGF5b3V0LCBzdG9yYWdlLCBmaWVsZCk7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZmllbGQpKSB7Ci0gICAgaWYgKFpfVFlQRV9QKHZhbCkgPT0gSVNfTlVMTCkgewotICAgICAgLy8gQXNzaWduaW5nIG5pbCB0byBhIG9uZW9mIGZpZWxkIGNsZWFycyB0aGUgb25lb2YgY29tcGxldGVseS4KLSAgICAgICpvbmVvZl9jYXNlID0gT05FT0ZfQ0FTRV9OT05FOwotICAgICAgbWVtc2V0KG1lbW9yeSwgMCwgTkFUSVZFX1NMT1RfTUFYX1NJWkUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUaGUgdHJhbnNpdGlvbiBiZXR3ZWVuIGZpZWxkIHR5cGVzIGZvciBhIHNpbmdsZSBvbmVvZiAodW5pb24pIHNsb3QgaXMKLSAgICAgIC8vIHNvbWV3aGF0IGNvbXBsZXggYmVjYXVzZSB3ZSBuZWVkIHRvIGVuc3VyZSB0aGF0IGEgR0MgdHJpZ2dlcmVkIGF0IGFueQotICAgICAgLy8gcG9pbnQgYnkgYSBjYWxsIGludG8gdGhlIFJ1YnkgVk0gc2VlcyBhIHZhbGlkIHN0YXRlIGZvciB0aGlzIGZpZWxkIGFuZAotICAgICAgLy8gZG9lcyBub3QgZWl0aGVyIGdvIG9mZiBpbnRvIHRoZSB3ZWVkcyAoZm9sbG93aW5nIHdoYXQgaXQgdGhpbmtzIGlzIGEKLSAgICAgIC8vIFZBTFVFIGJ1dCBpcyBhY3R1YWxseSBhIGRpZmZlcmVudCBmaWVsZCB0eXBlKSBvciBtaXNzIGFuIG9iamVjdCAoc2VlaW5nCi0gICAgICAvLyB3aGF0IGl0IHRoaW5rcyBpcyBhIHByaW1pdGl2ZSBmaWVsZCBidXQgaXMgYWN0dWFsbHkgYSBWQUxVRSBmb3IgdGhlIG5ldwotICAgICAgLy8gZmllbGQgdHlwZSkuCi0gICAgICAvLwotICAgICAgLy8gSW4gb3JkZXIgZm9yIHRoZSB0cmFuc2l0aW9uIHRvIGJlIHNhZmUsIHRoZSBvbmVvZiBjYXNlIHNsb3QgbXVzdCBiZSBpbgotICAgICAgLy8gc3luYyB3aXRoIHRoZSB2YWx1ZSBzbG90IHdoZW5ldmVyIHRoZSBSdWJ5IFZNIGhhcyBiZWVuIGNhbGxlZC4gVGh1cywgd2UKLSAgICAgIC8vIHVzZSBuYXRpdmVfc2xvdF9zZXRfdmFsdWVfYW5kX2Nhc2UoKSwgd2hpY2ggZW5zdXJlcyB0aGF0IGJvdGggdGhlIHZhbHVlCi0gICAgICAvLyBhbmQgY2FzZSBudW1iZXIgYXJlIGFsdGVyZWQgYXRvbWljYWxseSAody5yLnQuIHRoZSBSdWJ5IFZNKS4KLSAgICAgIG5hdGl2ZV9zbG90X3NldF92YWx1ZV9hbmRfY2FzZSh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLypmaWVsZF90eXBlX2NsYXNzKGZpZWxkKSwqLyBtZW1vcnksIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVvZl9jYXNlLCB1cGJfZmllbGRkZWZfbnVtYmVyKGZpZWxkKSk7Ci0gICAgfQotICB9IGVsc2UgaWYgKGlzX21hcF9maWVsZChmaWVsZCkpIHsKLSAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgLy8gY2hlY2tfbWFwX2ZpZWxkX3R5cGUodmFsLCBmaWVsZCk7Ci0gICAgLy8gREVSRUYobWVtb3J5LCB6dmFsKikgPSB2YWw7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgLy8gY2hlY2tfcmVwZWF0ZWRfZmllbGRfdHlwZSh2YWwsIGZpZWxkKTsKLSAgICAvLyBERVJFRihtZW1vcnksIHp2YWwqKSA9IHZhbDsKLSAgfSBlbHNlIHsKLSAgICBuYXRpdmVfc2xvdF9zZXQodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpLCAvKmZpZWxkX3R5cGVfY2xhc3MoZmllbGQpLCovIG1lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgdmFsKTsKLSAgfQotfQotCi12b2lkIGxheW91dF9pbml0KE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgdm9pZCogc3RvcmFnZSkgewotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX21zZ19maWVsZF9iZWdpbigmaXQsIGxheW91dC0+bXNnZGVmKTsgIXVwYl9tc2dfZmllbGRfZG9uZSgmaXQpOwotICAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaXQpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaXQpOwotICAgIHZvaWQqIG1lbW9yeSA9IHNsb3RfbWVtb3J5KGxheW91dCwgc3RvcmFnZSwgZmllbGQpOwotICAgIHVpbnQzMl90KiBvbmVvZl9jYXNlID0gc2xvdF9vbmVvZl9jYXNlKGxheW91dCwgc3RvcmFnZSwgZmllbGQpOwotCi0gICAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZmllbGQpKSB7Ci0gICAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgICAvLyBtZW1zZXQobWVtb3J5LCAwLCBOQVRJVkVfU0xPVF9NQVhfU0laRSk7Ci0gICAgICAvLyAqb25lb2ZfY2FzZSA9IE9ORU9GX0NBU0VfTk9ORTsKLSAgICB9IGVsc2UgaWYgKGlzX21hcF9maWVsZChmaWVsZCkpIHsKLSAgICAgIC8vIFRPRE8odGVib3JpbmcpOiBBZGQgaXQgYmFjay4KLSAgICAgIC8vIFZBTFVFIG1hcCA9IFFuaWw7Ci0KLSAgICAgIC8vIGNvbnN0IHVwYl9maWVsZGRlZioga2V5X2ZpZWxkID0gbWFwX2ZpZWxkX2tleShmaWVsZCk7Ci0gICAgICAvLyBjb25zdCB1cGJfZmllbGRkZWYqIHZhbHVlX2ZpZWxkID0gbWFwX2ZpZWxkX3ZhbHVlKGZpZWxkKTsKLSAgICAgIC8vIFZBTFVFIHR5cGVfY2xhc3MgPSBmaWVsZF90eXBlX2NsYXNzKHZhbHVlX2ZpZWxkKTsKLQotICAgICAgLy8gaWYgKHR5cGVfY2xhc3MgIT0gUW5pbCkgewotICAgICAgLy8gICBWQUxVRSBhcmdzWzNdID0gewotICAgICAgLy8gICAgICAgZmllbGR0eXBlX3RvX3BocCh1cGJfZmllbGRkZWZfdHlwZShrZXlfZmllbGQpKSwKLSAgICAgIC8vICAgICAgIGZpZWxkdHlwZV90b19waHAodXBiX2ZpZWxkZGVmX3R5cGUodmFsdWVfZmllbGQpKSwgdHlwZV9jbGFzcywKLSAgICAgIC8vICAgfTsKLSAgICAgIC8vICAgbWFwID0gcGhwX2NsYXNzX25ld19pbnN0YW5jZSgzLCBhcmdzLCBjTWFwKTsKLSAgICAgIC8vIH0gZWxzZSB7Ci0gICAgICAvLyAgIFZBTFVFIGFyZ3NbMl0gPSB7Ci0gICAgICAvLyAgICAgICBmaWVsZHR5cGVfdG9fcGhwKHVwYl9maWVsZGRlZl90eXBlKGtleV9maWVsZCkpLAotICAgICAgLy8gICAgICAgZmllbGR0eXBlX3RvX3BocCh1cGJfZmllbGRkZWZfdHlwZSh2YWx1ZV9maWVsZCkpLAotICAgICAgLy8gICB9OwotICAgICAgLy8gICBtYXAgPSBwaHBfY2xhc3NfbmV3X2luc3RhbmNlKDIsIGFyZ3MsIGNNYXApOwotICAgICAgLy8gfQotCi0gICAgICAvLyBERVJFRihtZW1vcnksIFZBTFVFKSA9IG1hcDsKLSAgICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgPT0gVVBCX0xBQkVMX1JFUEVBVEVEKSB7Ci0gICAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgICAvLyBWQUxVRSBhcnkgPSBRbmlsOwotCi0gICAgICAvLyBWQUxVRSB0eXBlX2NsYXNzID0gZmllbGRfdHlwZV9jbGFzcyhmaWVsZCk7Ci0KLSAgICAgIC8vIGlmICh0eXBlX2NsYXNzICE9IFFuaWwpIHsKLSAgICAgIC8vICAgVkFMVUUgYXJnc1syXSA9IHsKLSAgICAgIC8vICAgICAgIGZpZWxkdHlwZV90b19waHAodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpKSwgdHlwZV9jbGFzcywKLSAgICAgIC8vICAgfTsKLSAgICAgIC8vICAgYXJ5ID0gcGhwX2NsYXNzX25ld19pbnN0YW5jZSgyLCBhcmdzLCBjUmVwZWF0ZWRGaWVsZCk7Ci0gICAgICAvLyB9IGVsc2UgewotICAgICAgLy8gICBWQUxVRSBhcmdzWzFdID0ge2ZpZWxkdHlwZV90b19waHAodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpKX07Ci0gICAgICAvLyAgIGFyeSA9IHBocF9jbGFzc19uZXdfaW5zdGFuY2UoMSwgYXJncywgY1JlcGVhdGVkRmllbGQpOwotICAgICAgLy8gfQotCi0gICAgICAvLyBERVJFRihtZW1vcnksIFZBTFVFKSA9IGFyeTsKLSAgICB9IGVsc2UgewotICAgICAgbmF0aXZlX3Nsb3RfaW5pdCh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksIG1lbW9yeSk7Ci0gICAgfQotICB9Ci19Ci0KLXp2YWwqIGxheW91dF9nZXQoTWVzc2FnZUxheW91dCogbGF5b3V0LCBjb25zdCB2b2lkKiBzdG9yYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkIFRTUk1MU19EQykgewotICB2b2lkKiBtZW1vcnkgPSBzbG90X21lbW9yeShsYXlvdXQsIHN0b3JhZ2UsIGZpZWxkKTsKLSAgdWludDMyX3QqIG9uZW9mX2Nhc2UgPSBzbG90X29uZW9mX2Nhc2UobGF5b3V0LCBzdG9yYWdlLCBmaWVsZCk7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZmllbGQpKSB7Ci0gICAgaWYgKCpvbmVvZl9jYXNlICE9IHVwYl9maWVsZGRlZl9udW1iZXIoZmllbGQpKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICAgIC8vIFRPRE8odGVib3JpbmcpOiBBZGQgaXQgYmFjay4KLSAgICAgIC8vIHJldHVybiBRbmlsOwotICAgIH0KLSAgICAgIHJldHVybiBOVUxMOwotICAgIC8vIFRPRE8odGVib3JpbmcpOiBBZGQgaXQgYmFjay4KLSAgICAvLyByZXR1cm4gbmF0aXZlX3Nsb3RfZ2V0KHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSwgZmllbGRfdHlwZV9jbGFzcyhmaWVsZCksCi0gICAgLy8gICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkpOwotICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgPT0gVVBCX0xBQkVMX1JFUEVBVEVEKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICAvLyBUT0RPKHRlYm9yaW5nKTogQWRkIGl0IGJhY2suCi0gICAgLy8gcmV0dXJuICooKFZBTFVFKiltZW1vcnkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBuYXRpdmVfc2xvdF9nZXQoCi0gICAgICAgIHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSwgLypmaWVsZF90eXBlX2NsYXNzKGZpZWxkKSwgKi8KLSAgICAgICAgbWVtb3J5IFRTUk1MU19DQyk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL3Rlc3QucGhwIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvdGVzdC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDZiYmFkZDQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvdGVzdC5waHAKKysrIC9kZXYvbnVsbApAQCAtMSwxNSArMCwwIEBACi08P3BocAotCi0KLW5hbWVzcGFjZSBHb29nbGVcUHJvdG9idWY7Ci0KLSRwb29sID0gZ2V0X2dlbmVyYXRlZF9wb29sKCk7Ci0kcG9vbC0+YWRkTWVzc2FnZSgiVGVzdE1lc3NhZ2UiKQotICAgIC0+b3B0aW9uYWwoIm9wdGlvbmFsX2ludDMyX2EiLCAiaW50MzIiLCAxKQotICAgIC0+b3B0aW9uYWwoIm9wdGlvbmFsX2ludDMyX2IiLCAiaW50MzIiLCAyKQotICAgIC0+ZmluYWxpemVUb1Bvb2woKQotICAgIC0+ZmluYWxpemUoKTsKLQotJHRlc3RfbWVzc2FnZSA9IG5ldyBcVGVzdE1lc3NhZ2UoKTsKLQotPz4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL3VwYi5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvdXBiLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA0OGExNjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL2V4dC9nb29nbGUvcHJvdG9idWYvdXBiLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTk5MCArMCwwIEBACi0vLyBBbWFsZ2FtYXRlZCBzb3VyY2UgZmlsZQotI2luY2x1ZGUgInVwYi5oIgotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3QgbGVuOwotICBjaGFyIHN0clsxXTsgIC8qIE51bGwtdGVybWluYXRlZCBzdHJpbmcgZGF0YSBmb2xsb3dzLiAqLwotfSBzdHJfdDsKLQotc3RhdGljIHN0cl90ICpuZXdzdHIoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikgewotICBzdHJfdCAqcmV0ID0gbWFsbG9jKHNpemVvZigqcmV0KSArIGxlbik7Ci0gIGlmICghcmV0KSByZXR1cm4gTlVMTDsKLSAgcmV0LT5sZW4gPSBsZW47Ci0gIG1lbWNweShyZXQtPnN0ciwgZGF0YSwgbGVuKTsKLSAgcmV0LT5zdHJbbGVuXSA9ICdcMCc7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVzdHIoc3RyX3QgKnMpIHsgZnJlZShzKTsgfQotCi0vKiBpc2FscGhhKCkgZXRjLiBmcm9tIDxjdHlwZS5oPiBhcmUgbG9jYWxlLWRlcGVuZGVudCwgd2hpY2ggd2UgZG9uJ3Qgd2FudC4gKi8KLXN0YXRpYyBib29sIHVwYl9pc2JldHdlZW4oY2hhciBjLCBjaGFyIGxvdywgY2hhciBoaWdoKSB7Ci0gIHJldHVybiBjID49IGxvdyAmJiBjIDw9IGhpZ2g7Ci19Ci0KLXN0YXRpYyBib29sIHVwYl9pc2xldHRlcihjaGFyIGMpIHsKLSAgcmV0dXJuIHVwYl9pc2JldHdlZW4oYywgJ0EnLCAnWicpIHx8IHVwYl9pc2JldHdlZW4oYywgJ2EnLCAneicpIHx8IGMgPT0gJ18nOwotfQotCi1zdGF0aWMgYm9vbCB1cGJfaXNhbHBoYW51bShjaGFyIGMpIHsKLSAgcmV0dXJuIHVwYl9pc2xldHRlcihjKSB8fCB1cGJfaXNiZXR3ZWVuKGMsICcwJywgJzknKTsKLX0KLQotc3RhdGljIGJvb2wgdXBiX2lzaWRlbnQoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLCBib29sIGZ1bGwsIHVwYl9zdGF0dXMgKnMpIHsKLSAgYm9vbCBzdGFydCA9IHRydWU7Ci0gIHNpemVfdCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBjaGFyIGMgPSBzdHJbaV07Ci0gICAgaWYgKGMgPT0gJy4nKSB7Ci0gICAgICBpZiAoc3RhcnQgfHwgIWZ1bGwpIHsKLSAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsICJpbnZhbGlkIG5hbWU6IHVuZXhwZWN0ZWQgJy4nICglcykiLCBzdHIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBzdGFydCA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChzdGFydCkgewotICAgICAgaWYgKCF1cGJfaXNsZXR0ZXIoYykpIHsKLSAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKAotICAgICAgICAgICAgcywgImludmFsaWQgbmFtZTogcGF0aCBjb21wb25lbnRzIG11c3Qgc3RhcnQgd2l0aCBhIGxldHRlciAoJXMpIiwKLSAgICAgICAgICAgIHN0cik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHN0YXJ0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghdXBiX2lzYWxwaGFudW0oYykpIHsKLSAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsICJpbnZhbGlkIG5hbWU6IG5vbi1hbHBoYW51bWVyaWMgY2hhcmFjdGVyICglcykiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gIXN0YXJ0OwotfQotCi0KLS8qIHVwYl9kZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVwYl9kZWZ0eXBlX3QgdXBiX2RlZl90eXBlKGNvbnN0IHVwYl9kZWYgKmQpIHsgcmV0dXJuIGQtPnR5cGU7IH0KLQotY29uc3QgY2hhciAqdXBiX2RlZl9mdWxsbmFtZShjb25zdCB1cGJfZGVmICpkKSB7IHJldHVybiBkLT5mdWxsbmFtZTsgfQotCi1ib29sIHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX2RlZiAqZGVmLCBjb25zdCBjaGFyICpmdWxsbmFtZSwgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoIXVwYl9kZWZfaXNmcm96ZW4oZGVmKSk7Ci0gIGlmICghdXBiX2lzaWRlbnQoZnVsbG5hbWUsIHN0cmxlbihmdWxsbmFtZSksIHRydWUsIHMpKSByZXR1cm4gZmFsc2U7Ci0gIGZyZWUoKHZvaWQqKWRlZi0+ZnVsbG5hbWUpOwotICBkZWYtPmZ1bGxuYW1lID0gdXBiX3N0cmR1cChmdWxsbmFtZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi11cGJfZGVmICp1cGJfZGVmX2R1cChjb25zdCB1cGJfZGVmICpkZWYsIGNvbnN0IHZvaWQgKm8pIHsKLSAgc3dpdGNoIChkZWYtPnR5cGUpIHsKLSAgICBjYXNlIFVQQl9ERUZfTVNHOgotICAgICAgcmV0dXJuIHVwYl9tc2dkZWZfdXBjYXN0X211dGFibGUoCi0gICAgICAgICAgdXBiX21zZ2RlZl9kdXAodXBiX2Rvd25jYXN0X21zZ2RlZihkZWYpLCBvKSk7Ci0gICAgY2FzZSBVUEJfREVGX0ZJRUxEOgotICAgICAgcmV0dXJuIHVwYl9maWVsZGRlZl91cGNhc3RfbXV0YWJsZSgKLSAgICAgICAgICB1cGJfZmllbGRkZWZfZHVwKHVwYl9kb3duY2FzdF9maWVsZGRlZihkZWYpLCBvKSk7Ci0gICAgY2FzZSBVUEJfREVGX0VOVU06Ci0gICAgICByZXR1cm4gdXBiX2VudW1kZWZfdXBjYXN0X211dGFibGUoCi0gICAgICAgICAgdXBiX2VudW1kZWZfZHVwKHVwYl9kb3duY2FzdF9lbnVtZGVmKGRlZiksIG8pKTsKLSAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UpOyByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCB1cGJfZGVmX2luaXQodXBiX2RlZiAqZGVmLCB1cGJfZGVmdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgKnZ0YmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgaWYgKCF1cGJfcmVmY291bnRlZF9pbml0KHVwYl9kZWZfdXBjYXN0X211dGFibGUoZGVmKSwgdnRibCwgb3duZXIpKSByZXR1cm4gZmFsc2U7Ci0gIGRlZi0+dHlwZSA9IHR5cGU7Ci0gIGRlZi0+ZnVsbG5hbWUgPSBOVUxMOwotICBkZWYtPmNhbWVfZnJvbV91c2VyID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCB1cGJfZGVmX3VuaW5pdCh1cGJfZGVmICpkZWYpIHsKLSAgZnJlZSgodm9pZCopZGVmLT5mdWxsbmFtZSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICptc2dkZWZfbmFtZShjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSB1cGJfZGVmX2Z1bGxuYW1lKHVwYl9tc2dkZWZfdXBjYXN0KG0pKTsKLSAgcmV0dXJuIG5hbWUgPyBuYW1lIDogIihhbm9ueW1vdXMpIjsKLX0KLQotc3RhdGljIGJvb2wgdXBiX3ZhbGlkYXRlX2ZpZWxkKHVwYl9maWVsZGRlZiAqZiwgdXBiX3N0YXR1cyAqcykgewotICBpZiAodXBiX2ZpZWxkZGVmX25hbWUoZikgPT0gTlVMTCB8fCB1cGJfZmllbGRkZWZfbnVtYmVyKGYpID09IDApIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGRkZWYgbXVzdCBoYXZlIG5hbWUgYW5kIG51bWJlciBzZXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIWYtPnR5cGVfaXNfc2V0XykgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZGRlZiB0eXBlIHdhcyBub3QgaW5pdGlhbGl6ZWQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAodXBiX2ZpZWxkZGVmX2xhenkoZikgJiYKLSAgICAgIHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShmKSAhPSBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0UpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJvbmx5IGxlbmd0aC1kZWxpbWl0ZWQgc3VibWVzc2FnZSBmaWVsZHMgbWF5IGJlIGxhenkiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAodXBiX2ZpZWxkZGVmX2hhc3N1YmRlZihmKSkgewotICAgIGNvbnN0IHVwYl9kZWYgKnN1YmRlZjsKLQotICAgIGlmIChmLT5zdWJkZWZfaXNfc3ltYm9saWMpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLCAiZmllbGQgJyVzLiVzJyBoYXMgbm90IGJlZW4gcmVzb2x2ZWQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2RlZl9uYW1lKGYtPm1zZy5kZWYpLCB1cGJfZmllbGRkZWZfbmFtZShmKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgc3ViZGVmID0gdXBiX2ZpZWxkZGVmX3N1YmRlZihmKTsKLSAgICBpZiAoc3ViZGVmID09IE5VTEwpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLCAiZmllbGQgJXMuJXMgaXMgbWlzc2luZyByZXF1aXJlZCBzdWJkZWYiLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2RlZl9uYW1lKGYtPm1zZy5kZWYpLCB1cGJfZmllbGRkZWZfbmFtZShmKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCF1cGJfZGVmX2lzZnJvemVuKHN1YmRlZikgJiYgIXN1YmRlZi0+Y2FtZV9mcm9tX3VzZXIpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJzdWJkZWYgb2YgZmllbGQgJXMuJXMgaXMgbm90IGZyb3plbiBvciBiZWluZyBmcm96ZW4iLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2RlZl9uYW1lKGYtPm1zZy5kZWYpLCB1cGJfZmllbGRkZWZfbmFtZShmKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICBib29sIGhhc19kZWZhdWx0X25hbWUgPSB1cGJfZmllbGRkZWZfZW51bWhhc2RlZmF1bHRzdHIoZik7Ci0gICAgYm9vbCBoYXNfZGVmYXVsdF9udW1iZXIgPSB1cGJfZmllbGRkZWZfZW51bWhhc2RlZmF1bHRpbnQzMihmKTsKLQotICAgIC8qIFByZXZpb3VzbHkgdmVyaWZpZWQgYnkgdXBiX3ZhbGlkYXRlX2VudW1kZWYoKS4gKi8KLSAgICBhc3NlcnQodXBiX2VudW1kZWZfbnVtdmFscyh1cGJfZmllbGRkZWZfZW51bXN1YmRlZihmKSkgPiAwKTsKLQotICAgIC8qIFdlJ3ZlIGFscmVhZHkgdmFsaWRhdGVkIHRoYXQgd2UgaGF2ZSBhbiBhc3NvY2lhdGVkIGVudW1kZWYgYW5kIHRoYXQgaXQKLSAgICAgKiBoYXMgYXQgbGVhc3Qgb25lIG1lbWJlciwgc28gYXQgbGVhc3Qgb25lIG9mIHRoZXNlIHNob3VsZCBiZSB0cnVlLgotICAgICAqIEJlY2F1c2UgaWYgdGhlIHVzZXIgZGlkbid0IHNldCBhbnl0aGluZywgd2UnbGwgcGljayB1cCB0aGUgZW51bSdzCi0gICAgICogZGVmYXVsdCwgYnV0IGlmIHRoZSB1c2VyICpkaWQqIHNldCBzb21ldGhpbmcgd2Ugc2hvdWxkIGF0IGxlYXN0IHBpY2sgdXAKLSAgICAgKiB0aGUgb25lIHRoZXkgc2V0IChpbnQzMiBvciBzdHJpbmcpLiAqLwotICAgIGFzc2VydChoYXNfZGVmYXVsdF9uYW1lIHx8IGhhc19kZWZhdWx0X251bWJlcik7Ci0KLSAgICBpZiAoIWhhc19kZWZhdWx0X25hbWUpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIGRlZmF1bHQgZm9yIGZpZWxkICVzLiVzICglZCkgaXMgbm90IGluIHRoZSBlbnVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtc2dkZWZfbmFtZShmLT5tc2cuZGVmKSwgdXBiX2ZpZWxkZGVmX25hbWUoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ZpZWxkZGVmX2RlZmF1bHRpbnQzMihmKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFoYXNfZGVmYXVsdF9udW1iZXIpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJlbnVtIGRlZmF1bHQgZm9yIGZpZWxkICVzLiVzICglcykgaXMgbm90IGluIHRoZSBlbnVtIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtc2dkZWZfbmFtZShmLT5tc2cuZGVmKSwgdXBiX2ZpZWxkZGVmX25hbWUoZiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ZpZWxkZGVmX2RlZmF1bHRzdHIoZiwgTlVMTCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIExpZnQgdGhlIGVmZmVjdGl2ZSBudW1lcmljIGRlZmF1bHQgaW50byB0aGUgZmllbGQncyBkZWZhdWx0IHNsb3QsIGluIGNhc2UKLSAgICAgKiB3ZSB3ZXJlIG9ubHkgZ2V0dGluZyBpdCAiYnkgcmVmZXJlbmNlIiBmcm9tIHRoZSBlbnVtZGVmLiAqLwotICAgIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0aW50MzIoZiwgdXBiX2ZpZWxkZGVmX2RlZmF1bHRpbnQzMihmKSk7Ci0gIH0KLQotICAvKiBFbnN1cmUgdGhhdCBNYXBFbnRyeSBzdWJtZXNzYWdlcyBvbmx5IGFwcGVhciBhcyByZXBlYXRlZCBmaWVsZHMsIG5vdAotICAgKiBvcHRpb25hbC9yZXF1aXJlZCAoc2luZ3VsYXIpIGZpZWxkcy4gKi8KLSAgaWYgKHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX01FU1NBR0UgJiYKLSAgICAgIHVwYl9maWVsZGRlZl9tc2dzdWJkZWYoZikgIT0gTlVMTCkgewotICAgIGNvbnN0IHVwYl9tc2dkZWYgKnN1YmRlZiA9IHVwYl9maWVsZGRlZl9tc2dzdWJkZWYoZik7Ci0gICAgaWYgKHVwYl9tc2dkZWZfbWFwZW50cnkoc3ViZGVmKSAmJiAhdXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycmYocywKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRmllbGQgJXMgcmVmZXJzIHRvIG1hcGVudHJ5IG1lc3NhZ2UgYnV0IGlzIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgImEgcmVwZWF0ZWQgZmllbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKGYpID8gdXBiX2ZpZWxkZGVmX25hbWUoZikgOgotICAgICAgICAgICAgICAgICAgICAgICAgICIodW5uYW1lZCkiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgdXBiX3ZhbGlkYXRlX2VudW1kZWYoY29uc3QgdXBiX2VudW1kZWYgKmUsIHVwYl9zdGF0dXMgKnMpIHsKLSAgaWYgKHVwYl9lbnVtZGVmX251bXZhbHMoZSkgPT0gMCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLCAiZW51bSAlcyBoYXMgbm8gbWVtYmVycyAobXVzdCBoYXZlIGF0IGxlYXN0IG9uZSkiLAotICAgICAgICAgICAgICAgICAgICAgICB1cGJfZW51bWRlZl9mdWxsbmFtZShlKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEFsbCBzdWJtZXNzYWdlIGZpZWxkcyBhcmUgbG93ZXIgdGhhbiBhbGwgb3RoZXIgZmllbGRzLgotICogU2Vjb25kbHksIGZpZWxkcyBhcmUgaW5jcmVhc2luZyBpbiBvcmRlci4gKi8KLXVpbnQzMl90IGZpZWxkX3JhbmsoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHVpbnQzMl90IHJldCA9IHVwYl9maWVsZGRlZl9udW1iZXIoZik7Ci0gIGNvbnN0IHVpbnQzMl90IGhpZ2hfYml0ID0gMSA8PCAzMDsKLSAgYXNzZXJ0KHJldCA8IGhpZ2hfYml0KTsKLSAgaWYgKCF1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpCi0gICAgcmV0IHw9IGhpZ2hfYml0OwotICByZXR1cm4gcmV0OwotfQotCi1pbnQgY21wX2ZpZWxkcyhjb25zdCB2b2lkICpwMSwgY29uc3Qgdm9pZCAqcDIpIHsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmICpmMSA9ICoodXBiX2ZpZWxkZGVmKmNvbnN0KilwMTsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmICpmMiA9ICoodXBiX2ZpZWxkZGVmKmNvbnN0KilwMjsKLSAgcmV0dXJuIGZpZWxkX3JhbmsoZjEpIC0gZmllbGRfcmFuayhmMik7Ci19Ci0KLXN0YXRpYyBib29sIGFzc2lnbl9tc2dfaW5kaWNlcyh1cGJfbXNnZGVmICptLCB1cGJfc3RhdHVzICpzKSB7Ci0gIC8qIFNvcnQgZmllbGRzLiAgdXBiIGludGVybmFsbHkgcmVsaWVzIG9uIFVQQl9UWVBFX01FU1NBR0UgZmllbGRzIGhhdmluZyB0aGUKLSAgICogbG93ZXN0IGluZGV4ZXMsIGJ1dCB3ZSBkbyBub3QgcHVibGljbHkgZ3VhcmFudGVlIHRoaXMuICovCi0gIHVwYl9tc2dfZmllbGRfaXRlciBqOwotICBpbnQgaTsKLSAgdWludDMyX3Qgc2VsZWN0b3I7Ci0gIGludCBuID0gdXBiX21zZ2RlZl9udW1maWVsZHMobSk7Ci0gIHVwYl9maWVsZGRlZiAqKmZpZWxkcyA9IG1hbGxvYyhuICogc2l6ZW9mKCpmaWVsZHMpKTsKLSAgaWYgKCFmaWVsZHMpIHJldHVybiBmYWxzZTsKLQotICBtLT5zdWJtc2dfZmllbGRfY291bnQgPSAwOwotICBmb3IoaSA9IDAsIHVwYl9tc2dfZmllbGRfYmVnaW4oJmosIG0pOwotICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaik7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmopLCBpKyspIHsKLSAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmopOwotICAgIGFzc2VydChmLT5tc2cuZGVmID09IG0pOwotICAgIGlmICghdXBiX3ZhbGlkYXRlX2ZpZWxkKGYsIHMpKSB7Ci0gICAgICBmcmVlKGZpZWxkcyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpIHsKLSAgICAgIG0tPnN1Ym1zZ19maWVsZF9jb3VudCsrOwotICAgIH0KLSAgICBmaWVsZHNbaV0gPSBmOwotICB9Ci0KLSAgcXNvcnQoZmllbGRzLCBuLCBzaXplb2YoKmZpZWxkcyksIGNtcF9maWVsZHMpOwotCi0gIHNlbGVjdG9yID0gVVBCX1NUQVRJQ19TRUxFQ1RPUl9DT1VOVCArIG0tPnN1Ym1zZ19maWVsZF9jb3VudDsKLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIHVwYl9maWVsZGRlZiAqZiA9IGZpZWxkc1tpXTsKLSAgICBmLT5pbmRleF8gPSBpOwotICAgIGYtPnNlbGVjdG9yX2Jhc2UgPSBzZWxlY3RvciArIHVwYl9oYW5kbGVyc19zZWxlY3RvcmJhc2VvZmZzZXQoZik7Ci0gICAgc2VsZWN0b3IgKz0gdXBiX2hhbmRsZXJzX3NlbGVjdG9yY291bnQoZik7Ci0gIH0KLSAgbS0+c2VsZWN0b3JfY291bnQgPSBzZWxlY3RvcjsKLQotI2lmbmRlZiBOREVCVUcKLSAgewotICAgIC8qIFZlcmlmeSB0aGF0IGFsbCBzZWxlY3RvcnMgZm9yIHRoZSBtZXNzYWdlIGFyZSBkaXN0aW5jdC4gKi8KLSNkZWZpbmUgVFJZKHR5cGUpIFwKLSAgICBpZiAodXBiX2hhbmRsZXJzX2dldHNlbGVjdG9yKGYsIHR5cGUsICZzZWwpKSB1cGJfaW50dGFibGVfaW5zZXJ0KCZ0LCBzZWwsIHYpOwotCi0gICAgdXBiX2ludHRhYmxlIHQ7Ci0gICAgdXBiX3ZhbHVlIHY7Ci0gICAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotCi0gICAgdXBiX2ludHRhYmxlX2luaXQoJnQsIFVQQl9DVFlQRV9CT09MKTsKLSAgICB2ID0gdXBiX3ZhbHVlX2Jvb2wodHJ1ZSk7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydCgmdCwgVVBCX1NUQVJUTVNHX1NFTEVDVE9SLCB2KTsKLSAgICB1cGJfaW50dGFibGVfaW5zZXJ0KCZ0LCBVUEJfRU5ETVNHX1NFTEVDVE9SLCB2KTsKLSAgICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaiwgbSk7Ci0gICAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmopOwotICAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmopKSB7Ci0gICAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmopOwotICAgICAgLyogVGhlc2UgY2FsbHMgd2lsbCBhc3NlcnQtZmFpbCBpbiB1cGJfdGFibGUgaWYgdGhlIHZhbHVlIGFscmVhZHkKLSAgICAgICAqIGV4aXN0cy4gKi8KLSAgICAgIFRSWShVUEJfSEFORExFUl9JTlQzMik7Ci0gICAgICBUUlkoVVBCX0hBTkRMRVJfSU5UNjQpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfVUlOVDMyKQotICAgICAgVFJZKFVQQl9IQU5ETEVSX1VJTlQ2NCkKLSAgICAgIFRSWShVUEJfSEFORExFUl9GTE9BVCkKLSAgICAgIFRSWShVUEJfSEFORExFUl9ET1VCTEUpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfQk9PTCkKLSAgICAgIFRSWShVUEJfSEFORExFUl9TVEFSVFNUUikKLSAgICAgIFRSWShVUEJfSEFORExFUl9TVFJJTkcpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfRU5EU1RSKQotICAgICAgVFJZKFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKQotICAgICAgVFJZKFVQQl9IQU5ETEVSX0VORFNVQk1TRykKLSAgICAgIFRSWShVUEJfSEFORExFUl9TVEFSVFNFUSkKLSAgICAgIFRSWShVUEJfSEFORExFUl9FTkRTRVEpCi0gICAgfQotICAgIHVwYl9pbnR0YWJsZV91bmluaXQoJnQpOwotICB9Ci0jdW5kZWYgVFJZCi0jZW5kaWYKLQotICBmcmVlKGZpZWxkcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9kZWZfZnJlZXplKHVwYl9kZWYgKmNvbnN0KiBkZWZzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcykgewotICBpbnQgaTsKLSAgaW50IG1heGRlcHRoOwotICBib29sIHJldDsKLSAgdXBiX3N0YXR1c19jbGVhcihzKTsKLQotICAvKiBGaXJzdCBwZXJmb3JtIHZhbGlkYXRpb24sIGluIHR3byBwYXNzZXMgc28gd2UgY2FuIGNoZWNrIHRoYXQgd2UgaGF2ZSBhCi0gICAqIHRyYW5zaXRpdmUgY2xvc3VyZSB3aXRob3V0IG5lZWRpbmcgdG8gc2VhcmNoLiAqLwotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgdXBiX2RlZiAqZGVmID0gZGVmc1tpXTsKLSAgICBpZiAodXBiX2RlZl9pc2Zyb3plbihkZWYpKSB7Ci0gICAgICAvKiBDb3VsZCByZWxheCB0aGlzIHJlcXVpcmVtZW50IGlmIGl0J3MgYW5ub3lpbmcuICovCi0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZGVmIGlzIGFscmVhZHkgZnJvemVuIik7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9IGVsc2UgaWYgKGRlZi0+dHlwZSA9PSBVUEJfREVGX0ZJRUxEKSB7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAic3RhbmRhbG9uZSBmaWVsZGRlZnMgY2FuIG5vdCBiZSBmcm96ZW4iKTsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0gZWxzZSBpZiAoZGVmLT50eXBlID09IFVQQl9ERUZfRU5VTSkgewotICAgICAgaWYgKCF1cGJfdmFsaWRhdGVfZW51bWRlZih1cGJfZHluY2FzdF9lbnVtZGVmKGRlZiksIHMpKSB7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBTZXQgbm93IHRvIGRldGVjdCB0cmFuc2l0aXZlIGNsb3N1cmUgaW4gdGhlIHNlY29uZCBwYXNzLiAqLwotICAgICAgZGVmLT5jYW1lX2Zyb21fdXNlciA9IHRydWU7Ci0gICAgfQotICB9Ci0KLSAgLyogU2Vjb25kIHBhc3Mgb2YgdmFsaWRhdGlvbi4gIEFsc28gYXNzaWduIHNlbGVjdG9yIGJhc2VzIGFuZCBpbmRleGVzLCBhbmQKLSAgICogY29tcGFjdCB0YWJsZXMuICovCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICB1cGJfbXNnZGVmICptID0gdXBiX2R5bmNhc3RfbXNnZGVmX211dGFibGUoZGVmc1tpXSk7Ci0gICAgdXBiX2VudW1kZWYgKmUgPSB1cGJfZHluY2FzdF9lbnVtZGVmX211dGFibGUoZGVmc1tpXSk7Ci0gICAgaWYgKG0pIHsKLSAgICAgIHVwYl9pbnR0YWJsZV9jb21wYWN0KCZtLT5pdG9mKTsKLSAgICAgIGlmICghYXNzaWduX21zZ19pbmRpY2VzKG0sIHMpKSB7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZSkgewotICAgICAgdXBiX2ludHRhYmxlX2NvbXBhY3QoJmUtPml0b24pOwotICAgIH0KLSAgfQotCi0gIC8qIERlZiBncmFwaCBjb250YWlucyBGaWVsZERlZnMgYmV0d2VlbiBlYWNoIE1lc3NhZ2VEZWYsIHNvIGRvdWJsZSB0aGUKLSAgICogbGltaXQuICovCi0gIG1heGRlcHRoID0gVVBCX01BWF9NRVNTQUdFX0RFUFRIICogMjsKLQotICAvKiBWYWxpZGF0aW9uIGFsbCBwYXNzZWQ7IGZyZWV6ZSB0aGUgZGVmcy4gKi8KLSAgcmV0ID0gdXBiX3JlZmNvdW50ZWRfZnJlZXplKCh1cGJfcmVmY291bnRlZCAqIGNvbnN0ICopZGVmcywgbiwgcywgbWF4ZGVwdGgpOwotICBhc3NlcnQoIShzICYmIHJldCAhPSB1cGJfb2socykpKTsKLSAgcmV0dXJuIHJldDsKLQotZXJyOgotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgZGVmc1tpXS0+Y2FtZV9mcm9tX3VzZXIgPSBmYWxzZTsKLSAgfQotICBhc3NlcnQoIShzICYmIHVwYl9vayhzKSkpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogdXBiX2VudW1kZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdXBiX2VudW1kZWZfZnJlZSh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfZW51bWRlZiAqZSA9ICh1cGJfZW51bWRlZiopcjsKLSAgdXBiX2ludHRhYmxlX2l0ZXIgaTsKLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCAmZS0+aXRvbik7Ci0gIGZvciggOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICAvKiBUbyBjbGVhbiB1cCB0aGUgdXBiX3N0cmR1cCgpIGZyb20gdXBiX2VudW1kZWZfYWRkdmFsKCkuICovCi0gICAgZnJlZSh1cGJfdmFsdWVfZ2V0Y3N0cih1cGJfaW50dGFibGVfaXRlcl92YWx1ZSgmaSkpKTsKLSAgfQotICB1cGJfc3RydGFibGVfdW5pbml0KCZlLT5udG9pKTsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmZS0+aXRvbik7Ci0gIHVwYl9kZWZfdW5pbml0KHVwYl9lbnVtZGVmX3VwY2FzdF9tdXRhYmxlKGUpKTsKLSAgZnJlZShlKTsKLX0KLQotdXBiX2VudW1kZWYgKnVwYl9lbnVtZGVmX25ldyhjb25zdCB2b2lkICpvd25lcikgewotICBzdGF0aWMgY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdnRibCA9IHtOVUxMLCAmdXBiX2VudW1kZWZfZnJlZX07Ci0gIHVwYl9lbnVtZGVmICplID0gbWFsbG9jKHNpemVvZigqZSkpOwotICBpZiAoIWUpIHJldHVybiBOVUxMOwotICBpZiAoIXVwYl9kZWZfaW5pdCh1cGJfZW51bWRlZl91cGNhc3RfbXV0YWJsZShlKSwgVVBCX0RFRl9FTlVNLCAmdnRibCwgb3duZXIpKQotICAgIGdvdG8gZXJyMjsKLSAgaWYgKCF1cGJfc3RydGFibGVfaW5pdCgmZS0+bnRvaSwgVVBCX0NUWVBFX0lOVDMyKSkgZ290byBlcnIyOwotICBpZiAoIXVwYl9pbnR0YWJsZV9pbml0KCZlLT5pdG9uLCBVUEJfQ1RZUEVfQ1NUUikpIGdvdG8gZXJyMTsKLSAgcmV0dXJuIGU7Ci0KLWVycjE6Ci0gIHVwYl9zdHJ0YWJsZV91bmluaXQoJmUtPm50b2kpOwotZXJyMjoKLSAgZnJlZShlKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXVwYl9lbnVtZGVmICp1cGJfZW51bWRlZl9kdXAoY29uc3QgdXBiX2VudW1kZWYgKmUsIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIHVwYl9lbnVtX2l0ZXIgaTsKLSAgdXBiX2VudW1kZWYgKm5ld19lID0gdXBiX2VudW1kZWZfbmV3KG93bmVyKTsKLSAgaWYgKCFuZXdfZSkgcmV0dXJuIE5VTEw7Ci0gIGZvcih1cGJfZW51bV9iZWdpbigmaSwgZSk7ICF1cGJfZW51bV9kb25lKCZpKTsgdXBiX2VudW1fbmV4dCgmaSkpIHsKLSAgICBib29sIHN1Y2Nlc3MgPSB1cGJfZW51bWRlZl9hZGR2YWwoCi0gICAgICAgIG5ld19lLCB1cGJfZW51bV9pdGVyX25hbWUoJmkpLHVwYl9lbnVtX2l0ZXJfbnVtYmVyKCZpKSwgTlVMTCk7Ci0gICAgaWYgKCFzdWNjZXNzKSB7Ci0gICAgICB1cGJfZW51bWRlZl91bnJlZihuZXdfZSwgb3duZXIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXdfZTsKLX0KLQotYm9vbCB1cGJfZW51bWRlZl9mcmVlemUodXBiX2VudW1kZWYgKmUsIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfZGVmICpkID0gdXBiX2VudW1kZWZfdXBjYXN0X211dGFibGUoZSk7Ci0gIHJldHVybiB1cGJfZGVmX2ZyZWV6ZSgmZCwgMSwgc3RhdHVzKTsKLX0KLQotY29uc3QgY2hhciAqdXBiX2VudW1kZWZfZnVsbG5hbWUoY29uc3QgdXBiX2VudW1kZWYgKmUpIHsKLSAgcmV0dXJuIHVwYl9kZWZfZnVsbG5hbWUodXBiX2VudW1kZWZfdXBjYXN0KGUpKTsKLX0KLQotYm9vbCB1cGJfZW51bWRlZl9zZXRmdWxsbmFtZSh1cGJfZW51bWRlZiAqZSwgY29uc3QgY2hhciAqZnVsbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpIHsKLSAgcmV0dXJuIHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX2VudW1kZWZfdXBjYXN0X211dGFibGUoZSksIGZ1bGxuYW1lLCBzKTsKLX0KLQotYm9vbCB1cGJfZW51bWRlZl9hZGR2YWwodXBiX2VudW1kZWYgKmUsIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIGlmICghdXBiX2lzaWRlbnQobmFtZSwgc3RybGVuKG5hbWUpLCBmYWxzZSwgc3RhdHVzKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAodXBiX2VudW1kZWZfbnRvaXooZSwgbmFtZSwgTlVMTCkpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYoc3RhdHVzLCAibmFtZSAnJXMnIGlzIGFscmVhZHkgZGVmaW5lZCIsIG5hbWUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbnNlcnQoJmUtPm50b2ksIG5hbWUsIHVwYl92YWx1ZV9pbnQzMihudW0pKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIm91dCBvZiBtZW1vcnkiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKCF1cGJfaW50dGFibGVfbG9va3VwKCZlLT5pdG9uLCBudW0sIE5VTEwpICYmCi0gICAgICAhdXBiX2ludHRhYmxlX2luc2VydCgmZS0+aXRvbiwgbnVtLCB1cGJfdmFsdWVfY3N0cih1cGJfc3RyZHVwKG5hbWUpKSkpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgdXBiX3N0cnRhYmxlX3JlbW92ZSgmZS0+bnRvaSwgbmFtZSwgTlVMTCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh1cGJfZW51bWRlZl9udW12YWxzKGUpID09IDEpIHsKLSAgICBib29sIG9rID0gdXBiX2VudW1kZWZfc2V0ZGVmYXVsdChlLCBudW0sIE5VTEwpOwotICAgIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludDMyX3QgdXBiX2VudW1kZWZfZGVmYXVsdChjb25zdCB1cGJfZW51bWRlZiAqZSkgewotICBhc3NlcnQodXBiX2VudW1kZWZfaXRvbihlLCBlLT5kZWZhdWx0dmFsKSk7Ci0gIHJldHVybiBlLT5kZWZhdWx0dmFsOwotfQotCi1ib29sIHVwYl9lbnVtZGVmX3NldGRlZmF1bHQodXBiX2VudW1kZWYgKmUsIGludDMyX3QgdmFsLCB1cGJfc3RhdHVzICpzKSB7Ci0gIGFzc2VydCghdXBiX2VudW1kZWZfaXNmcm96ZW4oZSkpOwotICBpZiAoIXVwYl9lbnVtZGVmX2l0b24oZSwgdmFsKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLCAibnVtYmVyICclZCcgaXMgbm90IGluIHRoZSBlbnVtLiIsIHZhbCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGUtPmRlZmF1bHR2YWwgPSB2YWw7Ci0gIHJldHVybiB0cnVlOwotfQotCi1pbnQgdXBiX2VudW1kZWZfbnVtdmFscyhjb25zdCB1cGJfZW51bWRlZiAqZSkgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2NvdW50KCZlLT5udG9pKTsKLX0KLQotdm9pZCB1cGJfZW51bV9iZWdpbih1cGJfZW51bV9pdGVyICppLCBjb25zdCB1cGJfZW51bWRlZiAqZSkgewotICAvKiBXZSBpdGVyYXRlIG92ZXIgdGhlIG50b2kgdGFibGUsIHRvIGFjY291bnQgZm9yIGR1cGxpY2F0ZSBudW1iZXJzLiAqLwotICB1cGJfc3RydGFibGVfYmVnaW4oaSwgJmUtPm50b2kpOwotfQotCi12b2lkIHVwYl9lbnVtX25leHQodXBiX2VudW1faXRlciAqaXRlcikgeyB1cGJfc3RydGFibGVfbmV4dChpdGVyKTsgfQotYm9vbCB1cGJfZW51bV9kb25lKHVwYl9lbnVtX2l0ZXIgKml0ZXIpIHsgcmV0dXJuIHVwYl9zdHJ0YWJsZV9kb25lKGl0ZXIpOyB9Ci0KLWJvb2wgdXBiX2VudW1kZWZfbnRvaShjb25zdCB1cGJfZW51bWRlZiAqZGVmLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGludDMyX3QgKm51bSkgewotICB1cGJfdmFsdWUgdjsKLSAgaWYgKCF1cGJfc3RydGFibGVfbG9va3VwMigmZGVmLT5udG9pLCBuYW1lLCBsZW4sICZ2KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAobnVtKSAqbnVtID0gdXBiX3ZhbHVlX2dldGludDMyKHYpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgY2hhciAqdXBiX2VudW1kZWZfaXRvbihjb25zdCB1cGJfZW51bWRlZiAqZGVmLCBpbnQzMl90IG51bSkgewotICB1cGJfdmFsdWUgdjsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9sb29rdXAzMigmZGVmLT5pdG9uLCBudW0sICZ2KSA/Ci0gICAgICB1cGJfdmFsdWVfZ2V0Y3N0cih2KSA6IE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9lbnVtX2l0ZXJfbmFtZSh1cGJfZW51bV9pdGVyICppdGVyKSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfaXRlcl9rZXkoaXRlcik7Ci19Ci0KLWludDMyX3QgdXBiX2VudW1faXRlcl9udW1iZXIodXBiX2VudW1faXRlciAqaXRlcikgewotICByZXR1cm4gdXBiX3ZhbHVlX2dldGludDMyKHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKGl0ZXIpKTsKLX0KLQotCi0vKiB1cGJfZmllbGRkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCB1cGJfZmllbGRkZWZfaW5pdF9kZWZhdWx0KHVwYl9maWVsZGRlZiAqZik7Ci0KLXN0YXRpYyB2b2lkIHVwYl9maWVsZGRlZl91bmluaXRfZGVmYXVsdCh1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKGYtPnR5cGVfaXNfc2V0XyAmJiBmLT5kZWZhdWx0X2lzX3N0cmluZyAmJiBmLT5kZWZhdWx0dmFsLmJ5dGVzKQotICAgIGZyZWVzdHIoZi0+ZGVmYXVsdHZhbC5ieXRlcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpc2l0ZmllbGQoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkX3Zpc2l0ICp2aXNpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSAoY29uc3QgdXBiX2ZpZWxkZGVmKilyOwotICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpKSB7Ci0gICAgdmlzaXQociwgdXBiX21zZ2RlZl91cGNhc3QyKHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKSksIGNsb3N1cmUpOwotICB9Ci0gIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGYpKSB7Ci0gICAgdmlzaXQociwgdXBiX29uZW9mZGVmX3VwY2FzdDIodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSksIGNsb3N1cmUpOwotICB9Ci0gIGlmICh1cGJfZmllbGRkZWZfc3ViZGVmKGYpKSB7Ci0gICAgdmlzaXQociwgdXBiX2RlZl91cGNhc3QodXBiX2ZpZWxkZGVmX3N1YmRlZihmKSksIGNsb3N1cmUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVmaWVsZCh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfZmllbGRkZWYgKmYgPSAodXBiX2ZpZWxkZGVmKilyOwotICB1cGJfZmllbGRkZWZfdW5pbml0X2RlZmF1bHQoZik7Ci0gIGlmIChmLT5zdWJkZWZfaXNfc3ltYm9saWMpCi0gICAgZnJlZShmLT5zdWIubmFtZSk7Ci0gIHVwYl9kZWZfdW5pbml0KHVwYl9maWVsZGRlZl91cGNhc3RfbXV0YWJsZShmKSk7Ci0gIGZyZWUoZik7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyICplbnVtZGVmYXVsdHN0cihjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY29uc3QgdXBiX2VudW1kZWYgKmU7Ci0gIGFzc2VydChmLT50eXBlX2lzX3NldF8gJiYgZi0+dHlwZV8gPT0gVVBCX1RZUEVfRU5VTSk7Ci0gIGUgPSB1cGJfZmllbGRkZWZfZW51bXN1YmRlZihmKTsKLSAgaWYgKGYtPmRlZmF1bHRfaXNfc3RyaW5nICYmIGYtPmRlZmF1bHR2YWwuYnl0ZXMpIHsKLSAgICAvKiBEZWZhdWx0IHdhcyBleHBsaWNpdGx5IHNldCBhcyBhIHN0cmluZy4gKi8KLSAgICBzdHJfdCAqcyA9IGYtPmRlZmF1bHR2YWwuYnl0ZXM7Ci0gICAgcmV0dXJuIHMtPnN0cjsKLSAgfSBlbHNlIGlmIChlKSB7Ci0gICAgaWYgKCFmLT5kZWZhdWx0X2lzX3N0cmluZykgewotICAgICAgLyogRGVmYXVsdCB3YXMgZXhwbGljaXRseSBzZXQgYXMgYW4gaW50ZWdlcjsgbG9vayBpdCB1cCBpbiBlbnVtZGVmLiAqLwotICAgICAgY29uc3QgY2hhciAqbmFtZSA9IHVwYl9lbnVtZGVmX2l0b24oZSwgZi0+ZGVmYXVsdHZhbC5zaW50KTsKLSAgICAgIGlmIChuYW1lKSB7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBEZWZhdWx0IGlzIGNvbXBsZXRlbHkgdW5zZXQ7IHB1bGwgZW51bWRlZiBkZWZhdWx0LiAqLwotICAgICAgaWYgKHVwYl9lbnVtZGVmX251bXZhbHMoZSkgPiAwKSB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB1cGJfZW51bWRlZl9pdG9uKGUsIHVwYl9lbnVtZGVmX2RlZmF1bHQoZSkpOwotICAgICAgICBhc3NlcnQobmFtZSk7Ci0gICAgICAgIHJldHVybiBuYW1lOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgZW51bWRlZmF1bHRpbnQzMihjb25zdCB1cGJfZmllbGRkZWYgKmYsIGludDMyX3QgKnZhbCkgewotICBjb25zdCB1cGJfZW51bWRlZiAqZTsKLSAgYXNzZXJ0KGYtPnR5cGVfaXNfc2V0XyAmJiBmLT50eXBlXyA9PSBVUEJfVFlQRV9FTlVNKTsKLSAgZSA9IHVwYl9maWVsZGRlZl9lbnVtc3ViZGVmKGYpOwotICBpZiAoIWYtPmRlZmF1bHRfaXNfc3RyaW5nKSB7Ci0gICAgLyogRGVmYXVsdCB3YXMgZXhwbGljaXRseSBzZXQgYXMgYW4gaW50ZWdlci4gKi8KLSAgICAqdmFsID0gZi0+ZGVmYXVsdHZhbC5zaW50OwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKGUpIHsKLSAgICBpZiAoZi0+ZGVmYXVsdHZhbC5ieXRlcykgewotICAgICAgLyogRGVmYXVsdCB3YXMgZXhwbGljaXRseSBzZXQgYXMgYSBzdHI7IHRyeSB0byBsb29rdXAgY29ycmVzcG9uZGluZyBpbnQuICovCi0gICAgICBzdHJfdCAqcyA9IGYtPmRlZmF1bHR2YWwuYnl0ZXM7Ci0gICAgICBpZiAodXBiX2VudW1kZWZfbnRvaXooZSwgcy0+c3RyLCB2YWwpKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBEZWZhdWx0IGlzIHVuc2V0OyB0cnkgdG8gcHVsbCBpbiBlbnVtZGVmIGRlZmF1bHQuICovCi0gICAgICBpZiAodXBiX2VudW1kZWZfbnVtdmFscyhlKSA+IDApIHsKLSAgICAgICAgKnZhbCA9IHVwYl9lbnVtZGVmX2RlZmF1bHQoZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXVwYl9maWVsZGRlZiAqdXBiX2ZpZWxkZGVmX25ldyhjb25zdCB2b2lkICpvKSB7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB2dGJsID0ge3Zpc2l0ZmllbGQsIGZyZWVmaWVsZH07Ci0gIHVwYl9maWVsZGRlZiAqZiA9IG1hbGxvYyhzaXplb2YoKmYpKTsKLSAgaWYgKCFmKSByZXR1cm4gTlVMTDsKLSAgaWYgKCF1cGJfZGVmX2luaXQodXBiX2ZpZWxkZGVmX3VwY2FzdF9tdXRhYmxlKGYpLCBVUEJfREVGX0ZJRUxELCAmdnRibCwgbykpIHsKLSAgICBmcmVlKGYpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGYtPm1zZy5kZWYgPSBOVUxMOwotICBmLT5zdWIuZGVmID0gTlVMTDsKLSAgZi0+b25lb2YgPSBOVUxMOwotICBmLT5zdWJkZWZfaXNfc3ltYm9saWMgPSBmYWxzZTsKLSAgZi0+bXNnX2lzX3N5bWJvbGljID0gZmFsc2U7Ci0gIGYtPmxhYmVsXyA9IFVQQl9MQUJFTF9PUFRJT05BTDsKLSAgZi0+dHlwZV8gPSBVUEJfVFlQRV9JTlQzMjsKLSAgZi0+bnVtYmVyXyA9IDA7Ci0gIGYtPnR5cGVfaXNfc2V0XyA9IGZhbHNlOwotICBmLT50YWdkZWxpbSA9IGZhbHNlOwotICBmLT5pc19leHRlbnNpb25fID0gZmFsc2U7Ci0gIGYtPmxhenlfID0gZmFsc2U7Ci0gIGYtPnBhY2tlZF8gPSB0cnVlOwotCi0gIC8qIEZvciB0aGUgbW9tZW50IHdlIGRlZmF1bHQgdGhpcyB0byBVUEJfSU5URk1UX1ZBUklBQkxFLCBzaW5jZSBpdCB3aWxsIHdvcmsKLSAgICogd2l0aCBhbGwgaW50ZWdlciB0eXBlcyBhbmQgaXMgaW4gc29tZSBzaW5jZSBtb3JlICJkZWZhdWx0IiBzaW5jZSB0aGUgbW9zdAotICAgKiBub3JtYWwtbG9va2luZyBwcm90bzIgdHlwZXMgaW50MzIvaW50NjQvdWludDMyL3VpbnQ2NCB1c2UgdmFyaWFibGUuCi0gICAqCi0gICAqIE90aGVyIG9wdGlvbnMgdG8gY29uc2lkZXI6Ci0gICAqIC0gdGhlcmUgaXMgbm8gZGVmYXVsdDsgdXNlcnMgbXVzdCBzZXQgdGhpcyBtYW51YWxseSAobGlrZSB0eXBlKS4KLSAgICogLSBkZWZhdWx0IHNpZ25lZCBpbnRlZ2VycyB0byBVUEJfSU5URk1UX1pJR1pBRywgc2luY2UgaXQncyBtb3JlIGxpa2VseSB0bwotICAgKiAgIGJlIGFuIG9wdGltYWwgZGVmYXVsdCBmb3Igc2lnbmVkIGludGVnZXJzLiAqLwotICBmLT5pbnRmbXQgPSBVUEJfSU5URk1UX1ZBUklBQkxFOwotICByZXR1cm4gZjsKLX0KLQotdXBiX2ZpZWxkZGVmICp1cGJfZmllbGRkZWZfZHVwKGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgY29uc3QgY2hhciAqc3JjbmFtZTsKLSAgdXBiX2ZpZWxkZGVmICpuZXdmID0gdXBiX2ZpZWxkZGVmX25ldyhvd25lcik7Ci0gIGlmICghbmV3ZikgcmV0dXJuIE5VTEw7Ci0gIHVwYl9maWVsZGRlZl9zZXR0eXBlKG5ld2YsIHVwYl9maWVsZGRlZl90eXBlKGYpKTsKLSAgdXBiX2ZpZWxkZGVmX3NldGxhYmVsKG5ld2YsIHVwYl9maWVsZGRlZl9sYWJlbChmKSk7Ci0gIHVwYl9maWVsZGRlZl9zZXRudW1iZXIobmV3ZiwgdXBiX2ZpZWxkZGVmX251bWJlcihmKSwgTlVMTCk7Ci0gIHVwYl9maWVsZGRlZl9zZXRuYW1lKG5ld2YsIHVwYl9maWVsZGRlZl9uYW1lKGYpLCBOVUxMKTsKLSAgaWYgKGYtPmRlZmF1bHRfaXNfc3RyaW5nICYmIGYtPmRlZmF1bHR2YWwuYnl0ZXMpIHsKLSAgICBzdHJfdCAqcyA9IGYtPmRlZmF1bHR2YWwuYnl0ZXM7Ci0gICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRzdHIobmV3Ziwgcy0+c3RyLCBzLT5sZW4sIE5VTEwpOwotICB9IGVsc2UgewotICAgIG5ld2YtPmRlZmF1bHRfaXNfc3RyaW5nID0gZi0+ZGVmYXVsdF9pc19zdHJpbmc7Ci0gICAgbmV3Zi0+ZGVmYXVsdHZhbCA9IGYtPmRlZmF1bHR2YWw7Ci0gIH0KLQotICBpZiAoZi0+c3ViZGVmX2lzX3N5bWJvbGljKSB7Ci0gICAgc3JjbmFtZSA9IGYtPnN1Yi5uYW1lOyAgLyogTWlnaHQgYmUgTlVMTC4gKi8KLSAgfSBlbHNlIHsKLSAgICBzcmNuYW1lID0gZi0+c3ViLmRlZiA/IHVwYl9kZWZfZnVsbG5hbWUoZi0+c3ViLmRlZikgOiBOVUxMOwotICB9Ci0gIGlmIChzcmNuYW1lKSB7Ci0gICAgY2hhciAqbmV3bmFtZSA9IG1hbGxvYyhzdHJsZW4oZi0+c3ViLmRlZi0+ZnVsbG5hbWUpICsgMik7Ci0gICAgaWYgKCFuZXduYW1lKSB7Ci0gICAgICB1cGJfZmllbGRkZWZfdW5yZWYobmV3Ziwgb3duZXIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHN0cmNweShuZXduYW1lLCAiLiIpOwotICAgIHN0cmNhdChuZXduYW1lLCBmLT5zdWIuZGVmLT5mdWxsbmFtZSk7Ci0gICAgdXBiX2ZpZWxkZGVmX3NldHN1YmRlZm5hbWUobmV3ZiwgbmV3bmFtZSwgTlVMTCk7Ci0gICAgZnJlZShuZXduYW1lKTsKLSAgfQotCi0gIHJldHVybiBuZXdmOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl90eXBlaXNzZXQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiBmLT50eXBlX2lzX3NldF87Ci19Ci0KLXVwYl9maWVsZHR5cGVfdCB1cGJfZmllbGRkZWZfdHlwZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgYXNzZXJ0KGYtPnR5cGVfaXNfc2V0Xyk7Ci0gIHJldHVybiBmLT50eXBlXzsKLX0KLQotdWludDMyX3QgdXBiX2ZpZWxkZGVmX2luZGV4KGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+aW5kZXhfOwotfQotCi11cGJfbGFiZWxfdCB1cGJfZmllbGRkZWZfbGFiZWwoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiBmLT5sYWJlbF87Ci19Ci0KLXVwYl9pbnRmbXRfdCB1cGJfZmllbGRkZWZfaW50Zm10KGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+aW50Zm10OwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9pc3RhZ2RlbGltKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+dGFnZGVsaW07Ci19Ci0KLXVpbnQzMl90IHVwYl9maWVsZGRlZl9udW1iZXIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiBmLT5udW1iZXJfOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9pc2V4dGVuc2lvbihjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIGYtPmlzX2V4dGVuc2lvbl87Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2xhenkoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiBmLT5sYXp5XzsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfcGFja2VkKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+cGFja2VkXzsKLX0KLQotY29uc3QgY2hhciAqdXBiX2ZpZWxkZGVmX25hbWUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiB1cGJfZGVmX2Z1bGxuYW1lKHVwYl9maWVsZGRlZl91cGNhc3QoZikpOwotfQotCi1jb25zdCB1cGJfbXNnZGVmICp1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiBmLT5tc2dfaXNfc3ltYm9saWMgPyBOVUxMIDogZi0+bXNnLmRlZjsKLX0KLQotY29uc3QgdXBiX29uZW9mZGVmICp1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+b25lb2Y7Ci19Ci0KLXVwYl9tc2dkZWYgKnVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZV9tdXRhYmxlKHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gKHVwYl9tc2dkZWYqKXVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKTsKLX0KLQotY29uc3QgY2hhciAqdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlbmFtZSh1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIGYtPm1zZ19pc19zeW1ib2xpYyA/IGYtPm1zZy5uYW1lIDogTlVMTDsKLX0KLQotc3RhdGljIHZvaWQgcmVsZWFzZV9jb250YWluaW5ndHlwZSh1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKGYtPm1zZ19pc19zeW1ib2xpYykgZnJlZShmLT5tc2cubmFtZSk7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX3NldGNvbnRhaW5pbmd0eXBlbmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoIXVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSk7Ci0gIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGQgaGFzIGFscmVhZHkgYmVlbiBhZGRlZCB0byBhIG1lc3NhZ2UuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8qIFRPRE86IHZhbGlkYXRlIG5hbWUgKHVwYl9pc2lkZW50KCkgZG9lc24ndCBxdWl0ZSB3b3JrIGF0bSBiZWNhdXNlIHRoaXMgbmFtZQotICAgKiBtYXkgaGF2ZSBhIGxlYWRpbmcgIi4iKS4gKi8KLSAgcmVsZWFzZV9jb250YWluaW5ndHlwZShmKTsKLSAgZi0+bXNnLm5hbWUgPSB1cGJfc3RyZHVwKG5hbWUpOwotICBmLT5tc2dfaXNfc3ltYm9saWMgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0bmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsIHVwYl9zdGF0dXMgKnMpIHsKLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKSB8fCB1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGYpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgIkFscmVhZHkgYWRkZWQgdG8gbWVzc2FnZSBvciBvbmVvZiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfZmllbGRkZWZfdXBjYXN0X211dGFibGUoZiksIG5hbWUsIHMpOwotfQotCi1zdGF0aWMgdm9pZCBjaGtkZWZhdWx0dHlwZShjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9maWVsZHR5cGVfdCB0eXBlKSB7Ci0gIFVQQl9VTlVTRUQoZik7Ci0gIFVQQl9VTlVTRUQodHlwZSk7Ci0gIGFzc2VydChmLT50eXBlX2lzX3NldF8gJiYgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gdHlwZSk7Ci19Ci0KLWludDY0X3QgdXBiX2ZpZWxkZGVmX2RlZmF1bHRpbnQ2NChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfSU5UNjQpOwotICByZXR1cm4gZi0+ZGVmYXVsdHZhbC5zaW50OwotfQotCi1pbnQzMl90IHVwYl9maWVsZGRlZl9kZWZhdWx0aW50MzIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGlmIChmLT50eXBlX2lzX3NldF8gJiYgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSkgewotICAgIGludDMyX3QgdmFsOwotICAgIGJvb2wgb2sgPSBlbnVtZGVmYXVsdGludDMyKGYsICZ2YWwpOwotICAgIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfSBlbHNlIHsKLSAgICBjaGtkZWZhdWx0dHlwZShmLCBVUEJfVFlQRV9JTlQzMik7Ci0gICAgcmV0dXJuIGYtPmRlZmF1bHR2YWwuc2ludDsKLSAgfQotfQotCi11aW50NjRfdCB1cGJfZmllbGRkZWZfZGVmYXVsdHVpbnQ2NChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfVUlOVDY0KTsKLSAgcmV0dXJuIGYtPmRlZmF1bHR2YWwudWludDsKLX0KLQotdWludDMyX3QgdXBiX2ZpZWxkZGVmX2RlZmF1bHR1aW50MzIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGNoa2RlZmF1bHR0eXBlKGYsIFVQQl9UWVBFX1VJTlQzMik7Ci0gIHJldHVybiBmLT5kZWZhdWx0dmFsLnVpbnQ7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2RlZmF1bHRib29sKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBjaGtkZWZhdWx0dHlwZShmLCBVUEJfVFlQRV9CT09MKTsKLSAgcmV0dXJuIGYtPmRlZmF1bHR2YWwudWludDsKLX0KLQotZmxvYXQgdXBiX2ZpZWxkZGVmX2RlZmF1bHRmbG9hdChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfRkxPQVQpOwotICByZXR1cm4gZi0+ZGVmYXVsdHZhbC5mbHQ7Ci19Ci0KLWRvdWJsZSB1cGJfZmllbGRkZWZfZGVmYXVsdGRvdWJsZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfRE9VQkxFKTsKLSAgcmV0dXJuIGYtPmRlZmF1bHR2YWwuZGJsOwotfQotCi1jb25zdCBjaGFyICp1cGJfZmllbGRkZWZfZGVmYXVsdHN0cihjb25zdCB1cGJfZmllbGRkZWYgKmYsIHNpemVfdCAqbGVuKSB7Ci0gIGFzc2VydChmLT50eXBlX2lzX3NldF8pOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfU1RSSU5HIHx8Ci0gICAgICAgICB1cGJfZmllbGRkZWZfdHlwZShmKSA9PSBVUEJfVFlQRV9CWVRFUyB8fAotICAgICAgICAgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSk7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICBjb25zdCBjaGFyICpyZXQgPSBlbnVtZGVmYXVsdHN0cihmKTsKLSAgICBhc3NlcnQocmV0KTsKLSAgICAvKiBFbnVtIGRlZmF1bHRzIGNhbid0IGhhdmUgZW1iZWRkZWQgTlVMTHMuICovCi0gICAgaWYgKGxlbikgKmxlbiA9IHN0cmxlbihyZXQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBpZiAoZi0+ZGVmYXVsdF9pc19zdHJpbmcpIHsKLSAgICBzdHJfdCAqc3RyID0gZi0+ZGVmYXVsdHZhbC5ieXRlczsKLSAgICBpZiAobGVuKSAqbGVuID0gc3RyLT5sZW47Ci0gICAgcmV0dXJuIHN0ci0+c3RyOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwYl9maWVsZGRlZl9pbml0X2RlZmF1bHQodXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGYtPmRlZmF1bHRfaXNfc3RyaW5nID0gZmFsc2U7Ci0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogZi0+ZGVmYXVsdHZhbC5kYmwgPSAwOyBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0ZMT0FUOiBmLT5kZWZhdWx0dmFsLmZsdCA9IDA7IGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDogZi0+ZGVmYXVsdHZhbC5zaW50ID0gMDsgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOiBmLT5kZWZhdWx0dmFsLnVpbnQgPSAwOyBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgZi0+ZGVmYXVsdHZhbC5ieXRlcyA9IG5ld3N0cigiIiwgMCk7Ci0gICAgICBmLT5kZWZhdWx0X2lzX3N0cmluZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6IGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfRU5VTToKLSAgICAgIC8qIFRoaXMgaXMgb3VyIHNwZWNpYWwgc2VudGluZWwgdGhhdCBpbmRpY2F0ZXMgIm5vdCBzZXQiIGZvciBhbiBlbnVtLiAqLwotICAgICAgZi0+ZGVmYXVsdF9pc19zdHJpbmcgPSB0cnVlOwotICAgICAgZi0+ZGVmYXVsdHZhbC5ieXRlcyA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1jb25zdCB1cGJfZGVmICp1cGJfZmllbGRkZWZfc3ViZGVmKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+c3ViZGVmX2lzX3N5bWJvbGljID8gTlVMTCA6IGYtPnN1Yi5kZWY7Ci19Ci0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYl9maWVsZGRlZl9tc2dzdWJkZWYoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGNvbnN0IHVwYl9kZWYgKmRlZiA9IHVwYl9maWVsZGRlZl9zdWJkZWYoZik7Ci0gIHJldHVybiBkZWYgPyB1cGJfZHluY2FzdF9tc2dkZWYoZGVmKSA6IE5VTEw7Ci19Ci0KLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJfZmllbGRkZWZfZW51bXN1YmRlZihjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY29uc3QgdXBiX2RlZiAqZGVmID0gdXBiX2ZpZWxkZGVmX3N1YmRlZihmKTsKLSAgcmV0dXJuIGRlZiA/IHVwYl9keW5jYXN0X2VudW1kZWYoZGVmKSA6IE5VTEw7Ci19Ci0KLXVwYl9kZWYgKnVwYl9maWVsZGRlZl9zdWJkZWZfbXV0YWJsZSh1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuICh1cGJfZGVmKil1cGJfZmllbGRkZWZfc3ViZGVmKGYpOwotfQotCi1jb25zdCBjaGFyICp1cGJfZmllbGRkZWZfc3ViZGVmbmFtZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKGYtPnN1YmRlZl9pc19zeW1ib2xpYykgewotICAgIHJldHVybiBmLT5zdWIubmFtZTsKLSAgfSBlbHNlIGlmIChmLT5zdWIuZGVmKSB7Ci0gICAgcmV0dXJuIHVwYl9kZWZfZnVsbG5hbWUoZi0+c3ViLmRlZik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0bnVtYmVyKHVwYl9maWVsZGRlZiAqZiwgdWludDMyX3QgbnVtYmVyLCB1cGJfc3RhdHVzICpzKSB7Ci0gIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZygKLSAgICAgICAgcywgImNhbm5vdCBjaGFuZ2UgZmllbGQgbnVtYmVyIGFmdGVyIGFkZGluZyB0byBhIG1lc3NhZ2UiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKG51bWJlciA9PSAwIHx8IG51bWJlciA+IFVQQl9NQVhfRklFTEROVU1CRVIpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYocywgImludmFsaWQgZmllbGQgbnVtYmVyICgldSkiLCBudW1iZXIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmLT5udW1iZXJfID0gbnVtYmVyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0dHlwZSh1cGJfZmllbGRkZWYgKmYsIHVwYl9maWVsZHR5cGVfdCB0eXBlKSB7Ci0gIGFzc2VydCghdXBiX2ZpZWxkZGVmX2lzZnJvemVuKGYpKTsKLSAgYXNzZXJ0KHVwYl9maWVsZGRlZl9jaGVja3R5cGUodHlwZSkpOwotICB1cGJfZmllbGRkZWZfdW5pbml0X2RlZmF1bHQoZik7Ci0gIGYtPnR5cGVfID0gdHlwZTsKLSAgZi0+dHlwZV9pc19zZXRfID0gdHJ1ZTsKLSAgdXBiX2ZpZWxkZGVmX2luaXRfZGVmYXVsdChmKTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVzY3JpcHRvcnR5cGUodXBiX2ZpZWxkZGVmICpmLCBpbnQgdHlwZSkgewotICBhc3NlcnQoIXVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSk7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9ET1VCTEU6Ci0gICAgICB1cGJfZmllbGRkZWZfc2V0dHlwZShmLCBVUEJfVFlQRV9ET1VCTEUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0ZMT0FUOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfRkxPQVQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0lOVDY0OgotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9TRklYRUQ2NDoKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfU0lOVDY0OgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfSU5UNjQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX1VJTlQ2NDoKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfRklYRUQ2NDoKLSAgICAgIHVwYl9maWVsZGRlZl9zZXR0eXBlKGYsIFVQQl9UWVBFX1VJTlQ2NCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX1NGSVhFRDMyOgotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzI6Ci0gICAgICB1cGJfZmllbGRkZWZfc2V0dHlwZShmLCBVUEJfVFlQRV9JTlQzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfVUlOVDMyOgotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDMyOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfVUlOVDMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9CT09MOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfQk9PTCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfU1RSSU5HOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfU1RSSU5HKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9CWVRFUzoKLSAgICAgIHVwYl9maWVsZGRlZl9zZXR0eXBlKGYsIFVQQl9UWVBFX0JZVEVTKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9HUk9VUDoKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfTUVTU0FHRToKLSAgICAgIHVwYl9maWVsZGRlZl9zZXR0eXBlKGYsIFVQQl9UWVBFX01FU1NBR0UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0VOVU06Ci0gICAgICB1cGJfZmllbGRkZWZfc2V0dHlwZShmLCBVUEJfVFlQRV9FTlVNKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7Ci0gIH0KLQotICBpZiAodHlwZSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX0ZJWEVENjQgfHwKLSAgICAgIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDMyIHx8Ci0gICAgICB0eXBlID09IFVQQl9ERVNDUklQVE9SX1RZUEVfU0ZJWEVENjQgfHwKLSAgICAgIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9TRklYRUQzMikgewotICAgIHVwYl9maWVsZGRlZl9zZXRpbnRmbXQoZiwgVVBCX0lOVEZNVF9GSVhFRCk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX1NJTlQ2NCB8fAotICAgICAgICAgICAgIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzIpIHsKLSAgICB1cGJfZmllbGRkZWZfc2V0aW50Zm10KGYsIFVQQl9JTlRGTVRfWklHWkFHKTsKLSAgfSBlbHNlIHsKLSAgICB1cGJfZmllbGRkZWZfc2V0aW50Zm10KGYsIFVQQl9JTlRGTVRfVkFSSUFCTEUpOwotICB9Ci0KLSAgdXBiX2ZpZWxkZGVmX3NldHRhZ2RlbGltKGYsIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9HUk9VUCk7Ci19Ci0KLXVwYl9kZXNjcmlwdG9ydHlwZV90IHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShmKSkgewotICAgIGNhc2UgVVBCX1RZUEVfRkxPQVQ6ICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9GTE9BVDsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogcmV0dXJuIFVQQl9ERVNDUklQVE9SX1RZUEVfRE9VQkxFOwotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDogICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9CT09MOwotICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOiByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9TVFJJTkc7Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzogIHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX0JZVEVTOwotICAgIGNhc2UgVVBCX1RZUEVfRU5VTTogICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9FTlVNOwotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgICBzd2l0Y2ggKHVwYl9maWVsZGRlZl9pbnRmbXQoZikpIHsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX1ZBUklBQkxFOiByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9JTlQzMjsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX0ZJWEVEOiAgICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9TRklYRUQzMjsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX1pJR1pBRzogICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzI7Ci0gICAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2ludGZtdChmKSkgewotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfVkFSSUFCTEU6IHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX0lOVDY0OwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfRklYRUQ6ICAgIHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1NGSVhFRDY0OwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfWklHWkFHOiAgIHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1NJTlQ2NDsKLSAgICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjoKLSAgICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2ludGZtdChmKSkgewotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfVkFSSUFCTEU6IHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1VJTlQzMjsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX0ZJWEVEOiAgICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDMyOwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfWklHWkFHOiAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2ludGZtdChmKSkgewotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfVkFSSUFCTEU6IHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1VJTlQ2NDsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX0ZJWEVEOiAgICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDY0OwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfWklHWkFHOiAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6Ci0gICAgICByZXR1cm4gdXBiX2ZpZWxkZGVmX2lzdGFnZGVsaW0oZikgPwotICAgICAgICAgIFVQQl9ERVNDUklQVE9SX1RZUEVfR1JPVVAgOiBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0U7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGlzZXh0ZW5zaW9uKHVwYl9maWVsZGRlZiAqZiwgYm9vbCBpc19leHRlbnNpb24pIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBmLT5pc19leHRlbnNpb25fID0gaXNfZXh0ZW5zaW9uOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRsYXp5KHVwYl9maWVsZGRlZiAqZiwgYm9vbCBsYXp5KSB7Ci0gIGFzc2VydCghdXBiX2ZpZWxkZGVmX2lzZnJvemVuKGYpKTsKLSAgZi0+bGF6eV8gPSBsYXp5OwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRwYWNrZWQodXBiX2ZpZWxkZGVmICpmLCBib29sIHBhY2tlZCkgewotICBhc3NlcnQoIXVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSk7Ci0gIGYtPnBhY2tlZF8gPSBwYWNrZWQ7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGxhYmVsKHVwYl9maWVsZGRlZiAqZiwgdXBiX2xhYmVsX3QgbGFiZWwpIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX2NoZWNrbGFiZWwobGFiZWwpKTsKLSAgZi0+bGFiZWxfID0gbGFiZWw7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGludGZtdCh1cGJfZmllbGRkZWYgKmYsIHVwYl9pbnRmbXRfdCBmbXQpIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX2NoZWNraW50Zm10KGZtdCkpOwotICBmLT5pbnRmbXQgPSBmbXQ7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldHRhZ2RlbGltKHVwYl9maWVsZGRlZiAqZiwgYm9vbCB0YWdfZGVsaW0pIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBmLT50YWdkZWxpbSA9IHRhZ19kZWxpbTsKLSAgZi0+dGFnZGVsaW0gPSB0YWdfZGVsaW07Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrc2V0ZGVmYXVsdCh1cGJfZmllbGRkZWYgKmYsIHVwYl9maWVsZHR5cGVfdCB0eXBlKSB7Ci0gIGlmICghZi0+dHlwZV9pc19zZXRfIHx8IHVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSB8fAotICAgICAgdXBiX2ZpZWxkZGVmX3R5cGUoZikgIT0gdHlwZSkgewotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChmLT5kZWZhdWx0X2lzX3N0cmluZykgewotICAgIHN0cl90ICpzID0gZi0+ZGVmYXVsdHZhbC5ieXRlczsKLSAgICBhc3NlcnQocyB8fCB0eXBlID09IFVQQl9UWVBFX0VOVU0pOwotICAgIGlmIChzKSBmcmVlc3RyKHMpOwotICB9Ci0gIGYtPmRlZmF1bHRfaXNfc3RyaW5nID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0aW50NjQodXBiX2ZpZWxkZGVmICpmLCBpbnQ2NF90IHZhbHVlKSB7Ci0gIGlmIChjaGVja3NldGRlZmF1bHQoZiwgVVBCX1RZUEVfSU5UNjQpKQotICAgIGYtPmRlZmF1bHR2YWwuc2ludCA9IHZhbHVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0aW50MzIodXBiX2ZpZWxkZGVmICpmLCBpbnQzMl90IHZhbHVlKSB7Ci0gIGlmICgodXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSAmJgotICAgICAgIGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9FTlVNKSkgfHwKLSAgICAgIGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9JTlQzMikpIHsKLSAgICBmLT5kZWZhdWx0dmFsLnNpbnQgPSB2YWx1ZTsKLSAgfQotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0dWludDY0KHVwYl9maWVsZGRlZiAqZiwgdWludDY0X3QgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9VSU5UNjQpKQotICAgIGYtPmRlZmF1bHR2YWwudWludCA9IHZhbHVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0dWludDMyKHVwYl9maWVsZGRlZiAqZiwgdWludDMyX3QgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9VSU5UMzIpKQotICAgIGYtPmRlZmF1bHR2YWwudWludCA9IHZhbHVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbCh1cGJfZmllbGRkZWYgKmYsIGJvb2wgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9CT09MKSkKLSAgICBmLT5kZWZhdWx0dmFsLnVpbnQgPSB2YWx1ZTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGZsb2F0KHVwYl9maWVsZGRlZiAqZiwgZmxvYXQgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9GTE9BVCkpCi0gICAgZi0+ZGVmYXVsdHZhbC5mbHQgPSB2YWx1ZTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGRvdWJsZSh1cGJfZmllbGRkZWYgKmYsIGRvdWJsZSB2YWx1ZSkgewotICBpZiAoY2hlY2tzZXRkZWZhdWx0KGYsIFVQQl9UWVBFX0RPVUJMRSkpCi0gICAgZi0+ZGVmYXVsdHZhbC5kYmwgPSB2YWx1ZTsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdHN0cih1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHZvaWQgKnN0ciwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBzdHJfdCAqc3RyMjsKLSAgYXNzZXJ0KHVwYl9maWVsZGRlZl9pc3N0cmluZyhmKSB8fCBmLT50eXBlXyA9PSBVUEJfVFlQRV9FTlVNKTsKLSAgaWYgKGYtPnR5cGVfID09IFVQQl9UWVBFX0VOVU0gJiYgIXVwYl9pc2lkZW50KHN0ciwgbGVuLCBmYWxzZSwgcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChmLT5kZWZhdWx0X2lzX3N0cmluZykgewotICAgIHN0cl90ICpzID0gZi0+ZGVmYXVsdHZhbC5ieXRlczsKLSAgICBhc3NlcnQocyB8fCBmLT50eXBlXyA9PSBVUEJfVFlQRV9FTlVNKTsKLSAgICBpZiAocykgZnJlZXN0cihzKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQoZi0+dHlwZV8gPT0gVVBCX1RZUEVfRU5VTSk7Ci0gIH0KLQotICBzdHIyID0gbmV3c3RyKHN0ciwgbGVuKTsKLSAgZi0+ZGVmYXVsdHZhbC5ieXRlcyA9IHN0cjI7Ci0gIGYtPmRlZmF1bHRfaXNfc3RyaW5nID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRjc3RyKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoZi0+dHlwZV9pc19zZXRfKTsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRzdHIoZiwgc3RyLCBzdHIgPyBzdHJsZW4oc3RyKSA6IDAsIHMpOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9lbnVtaGFzZGVmYXVsdGludDMyKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBpbnQzMl90IHZhbDsKLSAgYXNzZXJ0KGYtPnR5cGVfaXNfc2V0XyAmJiBmLT50eXBlXyA9PSBVUEJfVFlQRV9FTlVNKTsKLSAgcmV0dXJuIGVudW1kZWZhdWx0aW50MzIoZiwgJnZhbCk7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2VudW1oYXNkZWZhdWx0c3RyKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBhc3NlcnQoZi0+dHlwZV9pc19zZXRfICYmIGYtPnR5cGVfID09IFVQQl9UWVBFX0VOVU0pOwotICByZXR1cm4gZW51bWRlZmF1bHRzdHIoZikgIT0gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgdXBiX3N1YmRlZl90eXBlY2hlY2sodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIGlmIChmLT50eXBlXyA9PSBVUEJfVFlQRV9NRVNTQUdFKSB7Ci0gICAgaWYgKHVwYl9keW5jYXN0X21zZ2RlZihzdWJkZWYpKSByZXR1cm4gdHJ1ZTsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiaW52YWxpZCBzdWJkZWYgdHlwZSBmb3IgdGhpcyBzdWJtZXNzYWdlIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKGYtPnR5cGVfID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICBpZiAodXBiX2R5bmNhc3RfZW51bWRlZihzdWJkZWYpKSByZXR1cm4gdHJ1ZTsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiaW52YWxpZCBzdWJkZWYgdHlwZSBmb3IgdGhpcyBlbnVtIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJvbmx5IG1lc3NhZ2UgYW5kIGVudW0gZmllbGRzIGNhbiBoYXZlIGEgc3ViZGVmIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2Vfc3ViZGVmKHVwYl9maWVsZGRlZiAqZikgewotICBpZiAoZi0+c3ViZGVmX2lzX3N5bWJvbGljKSB7Ci0gICAgZnJlZShmLT5zdWIubmFtZSk7Ci0gIH0gZWxzZSBpZiAoZi0+c3ViLmRlZikgewotICAgIHVwYl91bnJlZjIoZi0+c3ViLmRlZiwgZik7Ci0gIH0KLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0c3ViZGVmKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgdXBiX2RlZiAqc3ViZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX2hhc3N1YmRlZihmKSk7Ci0gIGlmIChzdWJkZWYgJiYgIXVwYl9zdWJkZWZfdHlwZWNoZWNrKGYsIHN1YmRlZiwgcykpIHJldHVybiBmYWxzZTsKLSAgcmVsZWFzZV9zdWJkZWYoZik7Ci0gIGYtPnN1Yi5kZWYgPSBzdWJkZWY7Ci0gIGYtPnN1YmRlZl9pc19zeW1ib2xpYyA9IGZhbHNlOwotICBpZiAoZi0+c3ViLmRlZikgdXBiX3JlZjIoZi0+c3ViLmRlZiwgZik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9zZXRtc2dzdWJkZWYodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfbXNnZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldHN1YmRlZihmLCB1cGJfbXNnZGVmX3VwY2FzdChzdWJkZWYpLCBzKTsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0ZW51bXN1YmRlZih1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHVwYl9lbnVtZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRzdWJkZWYoZiwgdXBiX2VudW1kZWZfdXBjYXN0KHN1YmRlZiksIHMpOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoIXVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSk7Ci0gIGlmICghdXBiX2ZpZWxkZGVmX2hhc3N1YmRlZihmKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZCB0eXBlIGRvZXMgbm90IGFjY2VwdCBhIHN1YmRlZiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAvKiBUT0RPOiB2YWxpZGF0ZSBuYW1lICh1cGJfaXNpZGVudCgpIGRvZXNuJ3QgcXVpdGUgd29yayBhdG0gYmVjYXVzZSB0aGlzIG5hbWUKLSAgICogbWF5IGhhdmUgYSBsZWFkaW5nICIuIikuICovCi0gIHJlbGVhc2Vfc3ViZGVmKGYpOwotICBmLT5zdWIubmFtZSA9IHVwYl9zdHJkdXAobmFtZSk7Ci0gIGYtPnN1YmRlZl9pc19zeW1ib2xpYyA9IHRydWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX01FU1NBR0U7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2lzc3RyaW5nKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfU1RSSU5HIHx8Ci0gICAgICAgICB1cGJfZmllbGRkZWZfdHlwZShmKSA9PSBVUEJfVFlQRV9CWVRFUzsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfaXNzZXEoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfbGFiZWwoZikgPT0gVVBCX0xBQkVMX1JFUEVBVEVEOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9pc3ByaW1pdGl2ZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuICF1cGJfZmllbGRkZWZfaXNzdHJpbmcoZikgJiYgIXVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKTsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfaXNtYXAoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfaXNzZXEoZikgJiYgdXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpICYmCi0gICAgICAgICB1cGJfbXNnZGVmX21hcGVudHJ5KHVwYl9maWVsZGRlZl9tc2dzdWJkZWYoZikpOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9oYXNzdWJkZWYoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfaXNzdWJtc2coZikgfHwgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTTsKLX0KLQotc3RhdGljIGJvb2wgYmV0d2VlbihpbnQzMl90IHgsIGludDMyX3QgbG93LCBpbnQzMl90IGhpZ2gpIHsKLSAgcmV0dXJuIHggPj0gbG93ICYmIHggPD0gaGlnaDsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfY2hlY2tsYWJlbChpbnQzMl90IGxhYmVsKSB7IHJldHVybiBiZXR3ZWVuKGxhYmVsLCAxLCAzKTsgfQotYm9vbCB1cGJfZmllbGRkZWZfY2hlY2t0eXBlKGludDMyX3QgdHlwZSkgeyByZXR1cm4gYmV0d2Vlbih0eXBlLCAxLCAxMSk7IH0KLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNraW50Zm10KGludDMyX3QgZm10KSB7IHJldHVybiBiZXR3ZWVuKGZtdCwgMSwgMyk7IH0KLQotYm9vbCB1cGJfZmllbGRkZWZfY2hlY2tkZXNjcmlwdG9ydHlwZShpbnQzMl90IHR5cGUpIHsKLSAgcmV0dXJuIGJldHdlZW4odHlwZSwgMSwgMTgpOwotfQotCi0vKiB1cGJfbXNnZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCB2aXNpdG1zZyhjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWRfdmlzaXQgKnZpc2l0LAotICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICB1cGJfbXNnX29uZW9mX2l0ZXIgbzsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IChjb25zdCB1cGJfbXNnZGVmKilyOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLSAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmksIG0pOwotICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaSk7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpKTsKLSAgICB2aXNpdChyLCB1cGJfZmllbGRkZWZfdXBjYXN0MihmKSwgY2xvc3VyZSk7Ci0gIH0KLSAgZm9yKHVwYl9tc2dfb25lb2ZfYmVnaW4oJm8sIG0pOwotICAgICAgIXVwYl9tc2dfb25lb2ZfZG9uZSgmbyk7Ci0gICAgICB1cGJfbXNnX29uZW9mX25leHQoJm8pKSB7Ci0gICAgdXBiX29uZW9mZGVmICpmID0gdXBiX21zZ19pdGVyX29uZW9mKCZvKTsKLSAgICB2aXNpdChyLCB1cGJfb25lb2ZkZWZfdXBjYXN0MihmKSwgY2xvc3VyZSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZnJlZW1zZyh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfbXNnZGVmICptID0gKHVwYl9tc2dkZWYqKXI7Ci0gIHVwYl9zdHJ0YWJsZV91bmluaXQoJm0tPm50b28pOwotICB1cGJfc3RydGFibGVfdW5pbml0KCZtLT5udG9mKTsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmbS0+aXRvZik7Ci0gIHVwYl9kZWZfdW5pbml0KHVwYl9tc2dkZWZfdXBjYXN0X211dGFibGUobSkpOwotICBmcmVlKG0pOwotfQotCi11cGJfbXNnZGVmICp1cGJfbXNnZGVmX25ldyhjb25zdCB2b2lkICpvd25lcikgewotICBzdGF0aWMgY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdnRibCA9IHt2aXNpdG1zZywgZnJlZW1zZ307Ci0gIHVwYl9tc2dkZWYgKm0gPSBtYWxsb2Moc2l6ZW9mKCptKSk7Ci0gIGlmICghbSkgcmV0dXJuIE5VTEw7Ci0gIGlmICghdXBiX2RlZl9pbml0KHVwYl9tc2dkZWZfdXBjYXN0X211dGFibGUobSksIFVQQl9ERUZfTVNHLCAmdnRibCwgb3duZXIpKQotICAgIGdvdG8gZXJyMjsKLSAgaWYgKCF1cGJfaW50dGFibGVfaW5pdCgmbS0+aXRvZiwgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMzsKLSAgaWYgKCF1cGJfc3RydGFibGVfaW5pdCgmbS0+bnRvZiwgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMjsKLSAgaWYgKCF1cGJfc3RydGFibGVfaW5pdCgmbS0+bnRvbywgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMTsKLSAgbS0+bWFwX2VudHJ5ID0gZmFsc2U7Ci0gIHJldHVybiBtOwotCi1lcnIxOgotICB1cGJfc3RydGFibGVfdW5pbml0KCZtLT5udG9mKTsKLWVycjI6Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoJm0tPml0b2YpOwotZXJyMzoKLSAgZnJlZShtKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXVwYl9tc2dkZWYgKnVwYl9tc2dkZWZfZHVwKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIGJvb2wgb2s7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICB1cGJfbXNnX29uZW9mX2l0ZXIgbzsKLQotICB1cGJfbXNnZGVmICpuZXdtID0gdXBiX21zZ2RlZl9uZXcob3duZXIpOwotICBpZiAoIW5ld20pIHJldHVybiBOVUxMOwotICBvayA9IHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3RfbXV0YWJsZShuZXdtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9kZWZfZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3QobSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIG5ld20tPm1hcF9lbnRyeSA9IG0tPm1hcF9lbnRyeTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmksIG0pOwotICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaSk7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX2ZpZWxkZGVmX2R1cCh1cGJfbXNnX2l0ZXJfZmllbGQoJmkpLCAmZik7Ci0gICAgLyogRmllbGRzIGluIG9uZW9mcyBhcmUgZHVwJ2QgYmVsb3cuICovCi0gICAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZikpIGNvbnRpbnVlOwotICAgIGlmICghZiB8fCAhdXBiX21zZ2RlZl9hZGRmaWVsZChuZXdtLCBmLCAmZiwgTlVMTCkpIHsKLSAgICAgIHVwYl9tc2dkZWZfdW5yZWYobmV3bSwgb3duZXIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIGZvcih1cGJfbXNnX29uZW9mX2JlZ2luKCZvLCBtKTsKLSAgICAgICF1cGJfbXNnX29uZW9mX2RvbmUoJm8pOwotICAgICAgdXBiX21zZ19vbmVvZl9uZXh0KCZvKSkgewotICAgIHVwYl9vbmVvZmRlZiAqZiA9IHVwYl9vbmVvZmRlZl9kdXAodXBiX21zZ19pdGVyX29uZW9mKCZvKSwgJmYpOwotICAgIGlmICghZiB8fCAhdXBiX21zZ2RlZl9hZGRvbmVvZihuZXdtLCBmLCAmZiwgTlVMTCkpIHsKLSAgICAgIHVwYl9tc2dkZWZfdW5yZWYobmV3bSwgb3duZXIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIHJldHVybiBuZXdtOwotfQotCi1ib29sIHVwYl9tc2dkZWZfZnJlZXplKHVwYl9tc2dkZWYgKm0sIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfZGVmICpkID0gdXBiX21zZ2RlZl91cGNhc3RfbXV0YWJsZShtKTsKLSAgcmV0dXJuIHVwYl9kZWZfZnJlZXplKCZkLCAxLCBzdGF0dXMpOwotfQotCi1jb25zdCBjaGFyICp1cGJfbXNnZGVmX2Z1bGxuYW1lKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHVwYl9kZWZfZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3QobSkpOwotfQotCi1ib29sIHVwYl9tc2dkZWZfc2V0ZnVsbG5hbWUodXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqZnVsbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfbXNnZGVmX3VwY2FzdF9tdXRhYmxlKG0pLCBmdWxsbmFtZSwgcyk7Ci19Ci0KLS8qIEhlbHBlcjogY2hlY2sgdGhhdCB0aGUgZmllbGQgfGZ8IGlzIHNhZmUgdG8gYWRkIHRvIG1zZ2RlZiB8bXwuIFNldCBhbiBlcnJvcgotICogb24gc3RhdHVzIHxzfCBhbmQgcmV0dXJuIGZhbHNlIGlmIG5vdC4gKi8KLXN0YXRpYyBib29sIGNoZWNrX2ZpZWxkX2FkZChjb25zdCB1cGJfbXNnZGVmICptLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpICE9IE5VTEwpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGRkZWYgYWxyZWFkeSBiZWxvbmdzIHRvIGEgbWVzc2FnZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICh1cGJfZmllbGRkZWZfbmFtZShmKSA9PSBOVUxMIHx8IHVwYl9maWVsZGRlZl9udW1iZXIoZikgPT0gMCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZCBuYW1lIG9yIG51bWJlciB3ZXJlIG5vdCBzZXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodXBiX21zZ2RlZl9udG9meihtLCB1cGJfZmllbGRkZWZfbmFtZShmKSkgfHwKLSAgICAgICAgICAgICB1cGJfbXNnZGVmX2l0b2YobSwgdXBiX2ZpZWxkZGVmX251bWJlcihmKSkpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZHVwbGljYXRlIGZpZWxkIG5hbWUgb3IgbnVtYmVyIGZvciBmaWVsZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgYWRkX2ZpZWxkKHVwYl9tc2dkZWYgKm0sIHVwYl9maWVsZGRlZiAqZiwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yKSB7Ci0gIHJlbGVhc2VfY29udGFpbmluZ3R5cGUoZik7Ci0gIGYtPm1zZy5kZWYgPSBtOwotICBmLT5tc2dfaXNfc3ltYm9saWMgPSBmYWxzZTsKLSAgdXBiX2ludHRhYmxlX2luc2VydCgmbS0+aXRvZiwgdXBiX2ZpZWxkZGVmX251bWJlcihmKSwgdXBiX3ZhbHVlX3B0cihmKSk7Ci0gIHVwYl9zdHJ0YWJsZV9pbnNlcnQoJm0tPm50b2YsIHVwYl9maWVsZGRlZl9uYW1lKGYpLCB1cGJfdmFsdWVfcHRyKGYpKTsKLSAgdXBiX3JlZjIoZiwgbSk7Ci0gIHVwYl9yZWYyKG0sIGYpOwotICBpZiAocmVmX2Rvbm9yKSB1cGJfZmllbGRkZWZfdW5yZWYoZiwgcmVmX2Rvbm9yKTsKLX0KLQotYm9vbCB1cGJfbXNnZGVmX2FkZGZpZWxkKHVwYl9tc2dkZWYgKm0sIHVwYl9maWVsZGRlZiAqZiwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpIHsKLSAgLyogVE9ETzogZXh0ZW5zaW9ucyBuZWVkIHRvIGhhdmUgYSBzZXBhcmF0ZSBuYW1lc3BhY2UsIGJlY2F1c2UgcHJvdG8yIGFsbG93cyBhCi0gICAqIHRvcC1sZXZlbCBleHRlbnNpb24gKGllLiBvbmUgbm90IGluIGFueSBwYWNrYWdlKSB0byBoYXZlIHRoZSBzYW1lIG5hbWUgYXMgYQotICAgKiBmaWVsZCBmcm9tIHRoZSBtZXNzYWdlLgotICAgKgotICAgKiBUaGlzIGFsc28gaW1wbGllcyB0aGF0IHRoZXJlIG5lZWRzIHRvIGJlIGEgc2VwYXJhdGUgbG9va3VwLWJ5LW5hbWUgbWV0aG9kCi0gICAqIGZvciBleHRlbnNpb25zLiAgSXQgc2VlbXMgZGVzaXJhYmxlIGZvciBpdGVyYXRpb24gdG8gcmV0dXJuIGJvdGggZXh0ZW5zaW9ucwotICAgKiBhbmQgbm9uLWV4dGVuc2lvbnMgdGhvdWdoLgotICAgKgotICAgKiBXZSBhbHNvIG5lZWQgdG8gdmFsaWRhdGUgdGhhdCB0aGUgZmllbGQgbnVtYmVyIGlzIGluIGFuIGV4dGVuc2lvbiByYW5nZSBpZmYKLSAgICogaXQgaXMgYW4gZXh0ZW5zaW9uLgotICAgKgotICAgKiBUaGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiBDaGVjayBpZiB8ZnwgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoaXMgbXNnZGVmIGFuZAotICAgKiByZXR1cm4gaW1tZWRpYXRlbHkgaWYgc28uICovCi0gIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikgPT0gbSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLyogQ2hlY2sgY29uc3RyYWludHMgZm9yIGFsbCBmaWVsZHMgYmVmb3JlIHBlcmZvcm1pbmcgYW55IGFjdGlvbi4gKi8KLSAgaWYgKCFjaGVja19maWVsZF9hZGQobSwgZiwgcykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSAhPSBOVUxMKSB7Ci0gICAgLyogRmllbGRzIGluIGEgb25lb2YgY2FuIG9ubHkgYmUgYWRkZWQgYnkgYWRkaW5nIHRoZSBvbmVvZiB0byB0aGUgbXNnZGVmLiAqLwotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZGRlZiBpcyBwYXJ0IG9mIGEgb25lb2YiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBDb25zdHJhaW50IGNoZWNrcyBvaywgcGVyZm9ybSB0aGUgYWN0aW9uLiAqLwotICBhZGRfZmllbGQobSwgZiwgcmVmX2Rvbm9yKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdXBiX21zZ2RlZl9hZGRvbmVvZih1cGJfbXNnZGVmICptLCB1cGJfb25lb2ZkZWYgKm8sIGNvbnN0IHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIHVwYl9vbmVvZl9pdGVyIGl0OwotCi0gIC8qIENoZWNrIHZhcmlvdXMgY29uZGl0aW9ucyB0aGF0IHdvdWxkIHByZXZlbnQgdGhpcyBvbmVvZiBmcm9tIGJlaW5nIGFkZGVkLiAqLwotICBpZiAodXBiX29uZW9mZGVmX2NvbnRhaW5pbmd0eXBlKG8pKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgIm9uZW9mZGVmIGFscmVhZHkgYmVsb25ncyB0byBhIG1lc3NhZ2UiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodXBiX29uZW9mZGVmX25hbWUobykgPT0gTlVMTCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJvbmVvZmRlZiBuYW1lIHdhcyBub3Qgc2V0Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHVwYl9tc2dkZWZfbnRvb3oobSwgdXBiX29uZW9mZGVmX25hbWUobykpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgImR1cGxpY2F0ZSBvbmVvZiBuYW1lIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCBhbGwgb2YgdGhlIG9uZW9mJ3MgZmllbGRzIGRvIG5vdCBjb25mbGljdCB3aXRoIG5hbWVzIG9yIG51bWJlcnMKLSAgICogb2YgZmllbGRzIGFscmVhZHkgaW4gdGhlIG1lc3NhZ2UuICovCi0gIGZvciAodXBiX29uZW9mX2JlZ2luKCZpdCwgbyk7ICF1cGJfb25lb2ZfZG9uZSgmaXQpOyB1cGJfb25lb2ZfbmV4dCgmaXQpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gdXBiX29uZW9mX2l0ZXJfZmllbGQoJml0KTsKLSAgICBpZiAoIWNoZWNrX2ZpZWxkX2FkZChtLCBmLCBzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qIEV2ZXJ5dGhpbmcgY2hlY2tzIG91dCAtLSBjb21taXQgbm93LiAqLwotCi0gIC8qIEFkZCBvbmVvZiBpdHNlbGYgZmlyc3QuICovCi0gIG8tPnBhcmVudCA9IG07Ci0gIHVwYl9zdHJ0YWJsZV9pbnNlcnQoJm0tPm50b28sIHVwYl9vbmVvZmRlZl9uYW1lKG8pLCB1cGJfdmFsdWVfcHRyKG8pKTsKLSAgdXBiX3JlZjIobywgbSk7Ci0gIHVwYl9yZWYyKG0sIG8pOwotCi0gIC8qIEFkZCBlYWNoIGZpZWxkIG9mIHRoZSBvbmVvZiBkaXJlY3RseSB0byB0aGUgbXNnZGVmLiAqLwotICBmb3IgKHVwYl9vbmVvZl9iZWdpbigmaXQsIG8pOyAhdXBiX29uZW9mX2RvbmUoJml0KTsgdXBiX29uZW9mX25leHQoJml0KSkgewotICAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9vbmVvZl9pdGVyX2ZpZWxkKCZpdCk7Ci0gICAgYWRkX2ZpZWxkKG0sIGYsIE5VTEwpOwotICB9Ci0KLSAgaWYgKHJlZl9kb25vcikgdXBiX29uZW9mZGVmX3VucmVmKG8sIHJlZl9kb25vcik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX21zZ2RlZl9pdG9mKGNvbnN0IHVwYl9tc2dkZWYgKm0sIHVpbnQzMl90IGkpIHsKLSAgdXBiX3ZhbHVlIHZhbDsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9sb29rdXAzMigmbS0+aXRvZiwgaSwgJnZhbCkgPwotICAgICAgdXBiX3ZhbHVlX2dldHB0cih2YWwpIDogTlVMTDsKLX0KLQotY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJfbXNnZGVmX250b2YoY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pIHsKLSAgdXBiX3ZhbHVlIHZhbDsKLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9sb29rdXAyKCZtLT5udG9mLCBuYW1lLCBsZW4sICZ2YWwpID8KLSAgICAgIHVwYl92YWx1ZV9nZXRwdHIodmFsKSA6IE5VTEw7Ci19Ci0KLWNvbnN0IHVwYl9vbmVvZmRlZiAqdXBiX21zZ2RlZl9udG9vKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSB7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfbG9va3VwMigmbS0+bnRvbywgbmFtZSwgbGVuLCAmdmFsKSA/Ci0gICAgICB1cGJfdmFsdWVfZ2V0cHRyKHZhbCkgOiBOVUxMOwotfQotCi1pbnQgdXBiX21zZ2RlZl9udW1maWVsZHMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2NvdW50KCZtLT5udG9mKTsKLX0KLQotaW50IHVwYl9tc2dkZWZfbnVtb25lb2ZzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9jb3VudCgmbS0+bnRvbyk7Ci19Ci0KLXZvaWQgdXBiX21zZ2RlZl9zZXRtYXBlbnRyeSh1cGJfbXNnZGVmICptLCBib29sIG1hcF9lbnRyeSkgewotICBhc3NlcnQoIXVwYl9tc2dkZWZfaXNmcm96ZW4obSkpOwotICBtLT5tYXBfZW50cnkgPSBtYXBfZW50cnk7Ci19Ci0KLWJvb2wgdXBiX21zZ2RlZl9tYXBlbnRyeShjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBtLT5tYXBfZW50cnk7Ci19Ci0KLXZvaWQgdXBiX21zZ19maWVsZF9iZWdpbih1cGJfbXNnX2ZpZWxkX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgdXBiX2ludHRhYmxlX2JlZ2luKGl0ZXIsICZtLT5pdG9mKTsKLX0KLQotdm9pZCB1cGJfbXNnX2ZpZWxkX25leHQodXBiX21zZ19maWVsZF9pdGVyICppdGVyKSB7IHVwYl9pbnR0YWJsZV9uZXh0KGl0ZXIpOyB9Ci0KLWJvb2wgdXBiX21zZ19maWVsZF9kb25lKGNvbnN0IHVwYl9tc2dfZmllbGRfaXRlciAqaXRlcikgewotICByZXR1cm4gdXBiX2ludHRhYmxlX2RvbmUoaXRlcik7Ci19Ci0KLXVwYl9maWVsZGRlZiAqdXBiX21zZ19pdGVyX2ZpZWxkKGNvbnN0IHVwYl9tc2dfZmllbGRfaXRlciAqaXRlcikgewotICByZXR1cm4gKHVwYl9maWVsZGRlZiopdXBiX3ZhbHVlX2dldHB0cih1cGJfaW50dGFibGVfaXRlcl92YWx1ZShpdGVyKSk7Ci19Ci0KLXZvaWQgdXBiX21zZ19maWVsZF9pdGVyX3NldGRvbmUodXBiX21zZ19maWVsZF9pdGVyICppdGVyKSB7Ci0gIHVwYl9pbnR0YWJsZV9pdGVyX3NldGRvbmUoaXRlcik7Ci19Ci0KLXZvaWQgdXBiX21zZ19vbmVvZl9iZWdpbih1cGJfbXNnX29uZW9mX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgdXBiX3N0cnRhYmxlX2JlZ2luKGl0ZXIsICZtLT5udG9vKTsKLX0KLQotdm9pZCB1cGJfbXNnX29uZW9mX25leHQodXBiX21zZ19vbmVvZl9pdGVyICppdGVyKSB7IHVwYl9zdHJ0YWJsZV9uZXh0KGl0ZXIpOyB9Ci0KLWJvb2wgdXBiX21zZ19vbmVvZl9kb25lKGNvbnN0IHVwYl9tc2dfb25lb2ZfaXRlciAqaXRlcikgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2RvbmUoaXRlcik7Ci19Ci0KLXVwYl9vbmVvZmRlZiAqdXBiX21zZ19pdGVyX29uZW9mKGNvbnN0IHVwYl9tc2dfb25lb2ZfaXRlciAqaXRlcikgewotICByZXR1cm4gKHVwYl9vbmVvZmRlZiopdXBiX3ZhbHVlX2dldHB0cih1cGJfc3RydGFibGVfaXRlcl92YWx1ZShpdGVyKSk7Ci19Ci0KLXZvaWQgdXBiX21zZ19vbmVvZl9pdGVyX3NldGRvbmUodXBiX21zZ19vbmVvZl9pdGVyICppdGVyKSB7Ci0gIHVwYl9zdHJ0YWJsZV9pdGVyX3NldGRvbmUoaXRlcik7Ci19Ci0KLS8qIHVwYl9vbmVvZmRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHZpc2l0b25lb2YoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkX3Zpc2l0ICp2aXNpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCB1cGJfb25lb2ZkZWYgKm8gPSAoY29uc3QgdXBiX29uZW9mZGVmKilyOwotICB1cGJfb25lb2ZfaXRlciBpOwotICBmb3IgKHVwYl9vbmVvZl9iZWdpbigmaSwgbyk7ICF1cGJfb25lb2ZfZG9uZSgmaSk7IHVwYl9vbmVvZl9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9vbmVvZl9pdGVyX2ZpZWxkKCZpKTsKLSAgICB2aXNpdChyLCB1cGJfZmllbGRkZWZfdXBjYXN0MihmKSwgY2xvc3VyZSk7Ci0gIH0KLSAgaWYgKG8tPnBhcmVudCkgewotICAgIHZpc2l0KHIsIHVwYl9tc2dkZWZfdXBjYXN0MihvLT5wYXJlbnQpLCBjbG9zdXJlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBmcmVlb25lb2YodXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgdXBiX29uZW9mZGVmICpvID0gKHVwYl9vbmVvZmRlZiopcjsKLSAgdXBiX3N0cnRhYmxlX3VuaW5pdCgmby0+bnRvZik7Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoJm8tPml0b2YpOwotICB1cGJfZGVmX3VuaW5pdCh1cGJfb25lb2ZkZWZfdXBjYXN0X211dGFibGUobykpOwotICBmcmVlKG8pOwotfQotCi11cGJfb25lb2ZkZWYgKnVwYl9vbmVvZmRlZl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsIHZ0YmwgPSB7dmlzaXRvbmVvZiwgZnJlZW9uZW9mfTsKLSAgdXBiX29uZW9mZGVmICpvID0gbWFsbG9jKHNpemVvZigqbykpOwotICBvLT5wYXJlbnQgPSBOVUxMOwotICBpZiAoIW8pIHJldHVybiBOVUxMOwotICBpZiAoIXVwYl9kZWZfaW5pdCh1cGJfb25lb2ZkZWZfdXBjYXN0X211dGFibGUobyksIFVQQl9ERUZfT05FT0YsICZ2dGJsLAotICAgICAgICAgICAgICAgICAgICBvd25lcikpCi0gICAgZ290byBlcnIyOwotICBpZiAoIXVwYl9pbnR0YWJsZV9pbml0KCZvLT5pdG9mLCBVUEJfQ1RZUEVfUFRSKSkgZ290byBlcnIyOwotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbml0KCZvLT5udG9mLCBVUEJfQ1RZUEVfUFRSKSkgZ290byBlcnIxOwotICByZXR1cm4gbzsKLQotZXJyMToKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmby0+aXRvZik7Ci1lcnIyOgotICBmcmVlKG8pOwotICByZXR1cm4gTlVMTDsKLX0KLQotdXBiX29uZW9mZGVmICp1cGJfb25lb2ZkZWZfZHVwKGNvbnN0IHVwYl9vbmVvZmRlZiAqbywgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgYm9vbCBvazsKLSAgdXBiX29uZW9mX2l0ZXIgaTsKLSAgdXBiX29uZW9mZGVmICpuZXdvID0gdXBiX29uZW9mZGVmX25ldyhvd25lcik7Ci0gIGlmICghbmV3bykgcmV0dXJuIE5VTEw7Ci0gIG9rID0gdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfb25lb2ZkZWZfdXBjYXN0X211dGFibGUobmV3byksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZGVmX2Z1bGxuYW1lKHVwYl9vbmVvZmRlZl91cGNhc3QobykpLCBOVUxMKTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgZm9yICh1cGJfb25lb2ZfYmVnaW4oJmksIG8pOyAhdXBiX29uZW9mX2RvbmUoJmkpOyB1cGJfb25lb2ZfbmV4dCgmaSkpIHsKLSAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfZmllbGRkZWZfZHVwKHVwYl9vbmVvZl9pdGVyX2ZpZWxkKCZpKSwgJmYpOwotICAgIGlmICghZiB8fCAhdXBiX29uZW9mZGVmX2FkZGZpZWxkKG5ld28sIGYsICZmLCBOVUxMKSkgewotICAgICAgdXBiX29uZW9mZGVmX3VucmVmKG5ld28sIG93bmVyKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotICByZXR1cm4gbmV3bzsKLX0KLQotY29uc3QgY2hhciAqdXBiX29uZW9mZGVmX25hbWUoY29uc3QgdXBiX29uZW9mZGVmICpvKSB7Ci0gIHJldHVybiB1cGJfZGVmX2Z1bGxuYW1lKHVwYl9vbmVvZmRlZl91cGNhc3QobykpOwotfQotCi1ib29sIHVwYl9vbmVvZmRlZl9zZXRuYW1lKHVwYl9vbmVvZmRlZiAqbywgY29uc3QgY2hhciAqZnVsbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpIHsKLSAgaWYgKHVwYl9vbmVvZmRlZl9jb250YWluaW5ndHlwZShvKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJvbmVvZiBhbHJlYWR5IGFkZGVkIHRvIGEgbWVzc2FnZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfb25lb2ZkZWZfdXBjYXN0X211dGFibGUobyksIGZ1bGxuYW1lLCBzKTsKLX0KLQotY29uc3QgdXBiX21zZ2RlZiAqdXBiX29uZW9mZGVmX2NvbnRhaW5pbmd0eXBlKGNvbnN0IHVwYl9vbmVvZmRlZiAqbykgewotICByZXR1cm4gby0+cGFyZW50OwotfQotCi1pbnQgdXBiX29uZW9mZGVmX251bWZpZWxkcyhjb25zdCB1cGJfb25lb2ZkZWYgKm8pIHsKLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9jb3VudCgmby0+bnRvZik7Ci19Ci0KLWJvb2wgdXBiX29uZW9mZGVmX2FkZGZpZWxkKHVwYl9vbmVvZmRlZiAqbywgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoIXVwYl9vbmVvZmRlZl9pc2Zyb3plbihvKSk7Ci0gIGFzc2VydCghby0+cGFyZW50IHx8ICF1cGJfbXNnZGVmX2lzZnJvemVuKG8tPnBhcmVudCkpOwotCi0gIC8qIFRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuIENoZWNrIGlmIHxmfCBpcyBhbHJlYWR5IHBhcnQgb2YgdGhpcyBvbmVvZmRlZgotICAgKiBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHNvLiAqLwotICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSA9PSBvKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKiBUaGUgZmllbGQgbXVzdCBoYXZlIGFuIE9QVElPTkFMIGxhYmVsLiAqLwotICBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGYpICE9IFVQQl9MQUJFTF9PUFRJT05BTCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZHMgaW4gb25lb2YgbXVzdCBoYXZlIE9QVElPTkFMIGxhYmVsIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogQ2hlY2sgdGhhdCBubyBmaWVsZCB3aXRoIHRoaXMgbmFtZSBvciBudW1iZXIgZXhpc3RzIGFscmVhZHkgaW4gdGhlIG9uZW9mLgotICAgKiBBbHNvIGNoZWNrIHRoYXQgdGhlIGZpZWxkIGlzIG5vdCBhbHJlYWR5IHBhcnQgb2YgYSBvbmVvZi4gKi8KLSAgaWYgKHVwYl9maWVsZGRlZl9uYW1lKGYpID09IE5VTEwgfHwgdXBiX2ZpZWxkZGVmX251bWJlcihmKSA9PSAwKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgImZpZWxkIG5hbWUgb3IgbnVtYmVyIHdlcmUgbm90IHNldCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICh1cGJfb25lb2ZkZWZfaXRvZihvLCB1cGJfZmllbGRkZWZfbnVtYmVyKGYpKSB8fAotICAgICAgICAgICAgIHVwYl9vbmVvZmRlZl9udG9meihvLCB1cGJfZmllbGRkZWZfbmFtZShmKSkpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZHVwbGljYXRlIGZpZWxkIG5hbWUgb3IgbnVtYmVyIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZikgIT0gTlVMTCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZGRlZiBhbHJlYWR5IGJlbG9uZ3MgdG8gYSBvbmVvZiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIFdlIGFsbG93IGFkZGluZyBhIGZpZWxkIHRvIHRoZSBvbmVvZiBlaXRoZXIgaWYgdGhlIGZpZWxkIGlzIG5vdCBwYXJ0IG9mIGEKLSAgICogbXNnZGVmLCBvciBpZiBpdCBpcyBhbmQgd2UgYXJlIGFsc28gcGFydCBvZiB0aGUgc2FtZSBtc2dkZWYuICovCi0gIGlmIChvLT5wYXJlbnQgPT0gTlVMTCkgewotICAgIC8qIElmIHdlJ3JlIG5vdCBpbiBhIG1zZ2RlZiwgdGhlIGZpZWxkIGNhbm5vdCBiZSBlaXRoZXIuIE90aGVyd2lzZSB3ZSB3b3VsZAotICAgICAqIG5lZWQgdG8gbWFnaWNhbGx5IGFkZCB0aGlzIG9uZW9mIHRvIGEgbXNnZGVmIHRvIHJlbWFpbiBjb25zaXN0ZW50LCB3aGljaAotICAgICAqIGlzIHN1cnByaXNpbmcgYmVoYXZpb3IuICovCi0gICAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKSAhPSBOVUxMKSB7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGRkZWYgYWxyZWFkeSBiZWxvbmdzIHRvIGEgbWVzc2FnZSwgYnV0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvbmVvZiBkb2VzIG5vdCIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBJZiB3ZSdyZSBpbiBhIG1zZ2RlZiwgdGhlIHVzZXIgY2FuIGFkZCBmaWVsZHMgdGhhdCBlaXRoZXIgYXJlbid0IGluIGFueQotICAgICAqIG1zZ2RlZiAoaW4gd2hpY2ggY2FzZSB0aGV5J3JlIGFkZGVkIHRvIG91ciBtc2dkZWYpIG9yIGFscmVhZHkgYSBwYXJ0IG9mCi0gICAgICogb3VyIG1zZ2RlZi4gKi8KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpICE9IE5VTEwgJiYKLSAgICAgICAgdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpICE9IG8tPnBhcmVudCkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgImZpZWxkZGVmIGJlbG9uZ3MgdG8gYSBkaWZmZXJlbnQgbWVzc2FnZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhhbiBvbmVvZiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8qIENvbW1pdCBwaGFzZS4gRmlyc3QgYWRkIHRoZSBmaWVsZCB0byBvdXIgcGFyZW50IG1zZ2RlZiwgaWYgYW55LCBiZWNhdXNlCi0gICAqIHRoYXQgbWF5IGZhaWw7IHRoZW4gYWRkIHRoZSBmaWVsZCB0byBvdXIgb3duIHRhYmxlcy4gKi8KLQotICBpZiAoby0+cGFyZW50ICE9IE5VTEwgJiYgdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpID09IE5VTEwpIHsKLSAgICBpZiAoIXVwYl9tc2dkZWZfYWRkZmllbGQoKHVwYl9tc2dkZWYqKW8tPnBhcmVudCwgZiwgTlVMTCwgcykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZWxlYXNlX2NvbnRhaW5pbmd0eXBlKGYpOwotICBmLT5vbmVvZiA9IG87Ci0gIHVwYl9pbnR0YWJsZV9pbnNlcnQoJm8tPml0b2YsIHVwYl9maWVsZGRlZl9udW1iZXIoZiksIHVwYl92YWx1ZV9wdHIoZikpOwotICB1cGJfc3RydGFibGVfaW5zZXJ0KCZvLT5udG9mLCB1cGJfZmllbGRkZWZfbmFtZShmKSwgdXBiX3ZhbHVlX3B0cihmKSk7Ci0gIHVwYl9yZWYyKGYsIG8pOwotICB1cGJfcmVmMihvLCBmKTsKLSAgaWYgKHJlZl9kb25vcikgdXBiX2ZpZWxkZGVmX3VucmVmKGYsIHJlZl9kb25vcik7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX29uZW9mZGVmX250b2YoY29uc3QgdXBiX29uZW9mZGVmICpvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfbG9va3VwMigmby0+bnRvZiwgbmFtZSwgbGVuZ3RoLCAmdmFsKSA/Ci0gICAgICB1cGJfdmFsdWVfZ2V0cHRyKHZhbCkgOiBOVUxMOwotfQotCi1jb25zdCB1cGJfZmllbGRkZWYgKnVwYl9vbmVvZmRlZl9pdG9mKGNvbnN0IHVwYl9vbmVvZmRlZiAqbywgdWludDMyX3QgbnVtKSB7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfbG9va3VwMzIoJm8tPml0b2YsIG51bSwgJnZhbCkgPwotICAgICAgdXBiX3ZhbHVlX2dldHB0cih2YWwpIDogTlVMTDsKLX0KLQotdm9pZCB1cGJfb25lb2ZfYmVnaW4odXBiX29uZW9mX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9vbmVvZmRlZiAqbykgewotICB1cGJfaW50dGFibGVfYmVnaW4oaXRlciwgJm8tPml0b2YpOwotfQotCi12b2lkIHVwYl9vbmVvZl9uZXh0KHVwYl9vbmVvZl9pdGVyICppdGVyKSB7Ci0gIHVwYl9pbnR0YWJsZV9uZXh0KGl0ZXIpOwotfQotCi1ib29sIHVwYl9vbmVvZl9kb25lKHVwYl9vbmVvZl9pdGVyICppdGVyKSB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfZG9uZShpdGVyKTsKLX0KLQotdXBiX2ZpZWxkZGVmICp1cGJfb25lb2ZfaXRlcl9maWVsZChjb25zdCB1cGJfb25lb2ZfaXRlciAqaXRlcikgewotICByZXR1cm4gKHVwYl9maWVsZGRlZiopdXBiX3ZhbHVlX2dldHB0cih1cGJfaW50dGFibGVfaXRlcl92YWx1ZShpdGVyKSk7Ci19Ci0KLXZvaWQgdXBiX29uZW9mX2l0ZXJfc2V0ZG9uZSh1cGJfb25lb2ZfaXRlciAqaXRlcikgewotICB1cGJfaW50dGFibGVfaXRlcl9zZXRkb25lKGl0ZXIpOwotfQotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi10eXBlZGVmIHN0cnVjdCBjbGVhbnVwX2VudCB7Ci0gIHVwYl9jbGVhbnVwX2Z1bmMgKmNsZWFudXA7Ci0gIHZvaWQgKnVkOwotICBzdHJ1Y3QgY2xlYW51cF9lbnQgKm5leHQ7Ci19IGNsZWFudXBfZW50OwotCi1zdGF0aWMgdm9pZCAqc2VlZGVkX2FsbG9jKHZvaWQgKnVkLCB2b2lkICpwdHIsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSk7Ci0KLS8qIERlZmF1bHQgYWxsb2NhdG9yICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEp1c3QgdXNlIHJlYWxsb2MsIGtlZXBpbmcgYWxsIGFsbG9jYXRlZCBibG9ja3MgaW4gYSBsaW5rZWQgbGlzdCB0byBkZXN0cm95IGF0Ci0gKiB0aGUgZW5kLiAqLwotCi10eXBlZGVmIHN0cnVjdCBtZW1fYmxvY2sgewotICAvKiBMaXN0IGlzIGRvdWJseS1saW5rZWQsIGJlY2F1c2UgaW4gY2FzZXMgd2hlcmUgcmVhbGxvYygpIG1vdmVzIGFuIGV4aXN0aW5nCi0gICAqIGJsb2NrLCB3ZSBuZWVkIHRvIGJlIGFibGUgdG8gcmVtb3ZlIHRoZSBvbGQgcG9pbnRlciBmcm9tIHRoZSBsaXN0Ci0gICAqIGVmZmljaWVudGx5LiAqLwotICBzdHJ1Y3QgbWVtX2Jsb2NrICpwcmV2LCAqbmV4dDsKLSNpZm5kZWYgTkRFQlVHCi0gIHNpemVfdCBzaXplOyAgLyogRG9lc24ndCBpbmNsdWRlIG1lbV9ibG9jayBzdHJ1Y3R1cmUuICovCi0jZW5kaWYKLX0gbWVtX2Jsb2NrOwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIG1lbV9ibG9jayAqaGVhZDsKLX0gZGVmYXVsdF9hbGxvY191ZDsKLQotc3RhdGljIHZvaWQgKmRlZmF1bHRfYWxsb2Modm9pZCAqX3VkLCB2b2lkICpwdHIsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSkgewotICBkZWZhdWx0X2FsbG9jX3VkICp1ZCA9IF91ZDsKLSAgbWVtX2Jsb2NrICpmcm9tLCAqYmxvY2s7Ci0gIHZvaWQgKnJldDsKLSAgVVBCX1VOVVNFRChvbGRzaXplKTsKLQotICBmcm9tID0gcHRyID8gKHZvaWQqKSgoY2hhciopcHRyIC0gc2l6ZW9mKG1lbV9ibG9jaykpIDogTlVMTDsKLQotI2lmbmRlZiBOREVCVUcKLSAgaWYgKGZyb20pIHsKLSAgICBhc3NlcnQob2xkc2l6ZSA8PSBmcm9tLT5zaXplKTsKLSAgfQotI2VuZGlmCi0KLSAgLyogVE9ETyhoYWJlcm1hbik6IHdlIHByb2JhYmx5IG5lZWQgdG8gcHJvdmlkZSBldmVuIGJldHRlciBhbGlnbm1lbnQgaGVyZSwKLSAgICogbGlrZSAxNi1ieXRlIGFsaWdubWVudCBvZiB0aGUgcmV0dXJuZWQgZGF0YSBwb2ludGVyLiAqLwotICBibG9jayA9IHJlYWxsb2MoZnJvbSwgc2l6ZSArIHNpemVvZihtZW1fYmxvY2spKTsKLSAgaWYgKCFibG9jaykgcmV0dXJuIE5VTEw7Ci0gIHJldCA9IChjaGFyKilibG9jayArIHNpemVvZigqYmxvY2spOwotCi0jaWZuZGVmIE5ERUJVRwotICBibG9jay0+c2l6ZSA9IHNpemU7Ci0jZW5kaWYKLQotICBpZiAoZnJvbSkgewotICAgIGlmIChibG9jayAhPSBmcm9tKSB7Ci0gICAgICAvKiBUaGUgYmxvY2sgd2FzIG1vdmVkLCBzbyBwb2ludGVycyBpbiBuZXh0IGFuZCBwcmV2IGJsb2NrcyBtdXN0IGJlCi0gICAgICAgKiB1cGRhdGVkIHRvIGl0cyBuZXcgbG9jYXRpb24uICovCi0gICAgICBpZiAoYmxvY2stPm5leHQpIGJsb2NrLT5uZXh0LT5wcmV2ID0gYmxvY2s7Ci0gICAgICBpZiAoYmxvY2stPnByZXYpIGJsb2NrLT5wcmV2LT5uZXh0ID0gYmxvY2s7Ci0gICAgICBpZiAodWQtPmhlYWQgPT0gZnJvbSkgdWQtPmhlYWQgPSBibG9jazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogSW5zZXJ0IGF0IGhlYWQgb2YgbGlua2VkIGxpc3QuICovCi0gICAgYmxvY2stPnByZXYgPSBOVUxMOwotICAgIGJsb2NrLT5uZXh0ID0gdWQtPmhlYWQ7Ci0gICAgaWYgKGJsb2NrLT5uZXh0KSBibG9jay0+bmV4dC0+cHJldiA9IGJsb2NrOwotICAgIHVkLT5oZWFkID0gYmxvY2s7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBkZWZhdWx0X2FsbG9jX2NsZWFudXAodm9pZCAqX3VkKSB7Ci0gIGRlZmF1bHRfYWxsb2NfdWQgKnVkID0gX3VkOwotICBtZW1fYmxvY2sgKmJsb2NrID0gdWQtPmhlYWQ7Ci0KLSAgd2hpbGUgKGJsb2NrKSB7Ci0gICAgdm9pZCAqdG9fZnJlZSA9IGJsb2NrOwotICAgIGJsb2NrID0gYmxvY2stPm5leHQ7Ci0gICAgZnJlZSh0b19mcmVlKTsKLSAgfQotfQotCi0KLS8qIFN0YW5kYXJkIGVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIGRlZmF1bHRfZXJyKHZvaWQgKnVkLCBjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgVVBCX1VOVVNFRCh1ZCk7Ci0gIFVQQl9VTlVTRUQoc3RhdHVzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCB3cml0ZV9lcnJfdG8odm9pZCAqdWQsIGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfc3RhdHVzICpjb3B5X3RvID0gdWQ7Ci0gIHVwYl9zdGF0dXNfY29weShjb3B5X3RvLCBzdGF0dXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogdXBiX2VudiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCB1cGJfZW52X2luaXQodXBiX2VudiAqZSkgewotICBkZWZhdWx0X2FsbG9jX3VkICp1ZCA9IChkZWZhdWx0X2FsbG9jX3VkKikmZS0+ZGVmYXVsdF9hbGxvY191ZDsKLSAgZS0+b2tfID0gdHJ1ZTsKLSAgZS0+Ynl0ZXNfYWxsb2NhdGVkID0gMDsKLSAgZS0+Y2xlYW51cF9oZWFkID0gTlVMTDsKLQotICB1ZC0+aGVhZCA9IE5VTEw7Ci0KLSAgLyogU2V0IGRlZmF1bHQgZnVuY3Rpb25zLiAqLwotICB1cGJfZW52X3NldGFsbG9jZnVuYyhlLCBkZWZhdWx0X2FsbG9jLCB1ZCk7Ci0gIHVwYl9lbnZfc2V0ZXJyb3JmdW5jKGUsIGRlZmF1bHRfZXJyLCBOVUxMKTsKLX0KLQotdm9pZCB1cGJfZW52X3VuaW5pdCh1cGJfZW52ICplKSB7Ci0gIGNsZWFudXBfZW50ICplbnQgPSBlLT5jbGVhbnVwX2hlYWQ7Ci0KLSAgd2hpbGUgKGVudCkgewotICAgIGVudC0+Y2xlYW51cChlbnQtPnVkKTsKLSAgICBlbnQgPSBlbnQtPm5leHQ7Ci0gIH0KLQotICAvKiBNdXN0IGRvIHRoaXMgYWZ0ZXIgcnVubmluZyBjbGVhbnVwIGZ1bmN0aW9ucywgYmVjYXVzZSB0aGlzIHdpbGwgZGVsZXRlCi0gICAgIHRoZSBtZW1vcnkgd2Ugc3RvcmUgb3VyIGNsZWFudXAgZW50cmllcyBpbiEgKi8KLSAgaWYgKGUtPmFsbG9jID09IGRlZmF1bHRfYWxsb2MpIHsKLSAgICBkZWZhdWx0X2FsbG9jX2NsZWFudXAoZS0+YWxsb2NfdWQpOwotICB9Ci19Ci0KLVVQQl9GT1JDRUlOTElORSB2b2lkIHVwYl9lbnZfc2V0YWxsb2NmdW5jKHVwYl9lbnYgKmUsIHVwYl9hbGxvY19mdW5jICphbGxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVkKSB7Ci0gIGUtPmFsbG9jID0gYWxsb2M7Ci0gIGUtPmFsbG9jX3VkID0gdWQ7Ci19Ci0KLVVQQl9GT1JDRUlOTElORSB2b2lkIHVwYl9lbnZfc2V0ZXJyb3JmdW5jKHVwYl9lbnYgKmUsIHVwYl9lcnJvcl9mdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdWQpIHsKLSAgZS0+ZXJyID0gZnVuYzsKLSAgZS0+ZXJyX3VkID0gdWQ7Ci19Ci0KLXZvaWQgdXBiX2Vudl9yZXBvcnRlcnJvcnN0byh1cGJfZW52ICplLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgZS0+ZXJyID0gd3JpdGVfZXJyX3RvOwotICBlLT5lcnJfdWQgPSBzdGF0dXM7Ci19Ci0KLWJvb2wgdXBiX2Vudl9vayhjb25zdCB1cGJfZW52ICplKSB7Ci0gIHJldHVybiBlLT5va187Ci19Ci0KLWJvb2wgdXBiX2Vudl9yZXBvcnRlcnJvcih1cGJfZW52ICplLCBjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgZS0+b2tfID0gZmFsc2U7Ci0gIHJldHVybiBlLT5lcnIoZS0+ZXJyX3VkLCBzdGF0dXMpOwotfQotCi1ib29sIHVwYl9lbnZfYWRkY2xlYW51cCh1cGJfZW52ICplLCB1cGJfY2xlYW51cF9mdW5jICpmdW5jLCB2b2lkICp1ZCkgewotICBjbGVhbnVwX2VudCAqZW50ID0gdXBiX2Vudl9tYWxsb2MoZSwgc2l6ZW9mKGNsZWFudXBfZW50KSk7Ci0gIGlmICghZW50KSByZXR1cm4gZmFsc2U7Ci0KLSAgZW50LT5jbGVhbnVwID0gZnVuYzsKLSAgZW50LT51ZCA9IHVkOwotICBlbnQtPm5leHQgPSBlLT5jbGVhbnVwX2hlYWQ7Ci0gIGUtPmNsZWFudXBfaGVhZCA9IGVudDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCAqdXBiX2Vudl9tYWxsb2ModXBiX2VudiAqZSwgc2l6ZV90IHNpemUpIHsKLSAgZS0+Ynl0ZXNfYWxsb2NhdGVkICs9IHNpemU7Ci0gIGlmIChlLT5hbGxvYyA9PSBzZWVkZWRfYWxsb2MpIHsKLSAgICAvKiBUaGlzIGlzIGVxdWl2YWxlbnQgdG8gdGhlIG5leHQgYnJhbmNoLCBidXQgYWxsb3dzIGlubGluaW5nIGZvciBhCi0gICAgICogbWVhc3VyYWJsZSBwZXJmIGJlbmVmaXQuICovCi0gICAgcmV0dXJuIHNlZWRlZF9hbGxvYyhlLT5hbGxvY191ZCwgTlVMTCwgMCwgc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGUtPmFsbG9jKGUtPmFsbG9jX3VkLCBOVUxMLCAwLCBzaXplKTsKLSAgfQotfQotCi12b2lkICp1cGJfZW52X3JlYWxsb2ModXBiX2VudiAqZSwgdm9pZCAqcHRyLCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUpIHsKLSAgY2hhciAqcmV0OwotICBhc3NlcnQob2xkc2l6ZSA8PSBzaXplKTsKLSAgcmV0ID0gZS0+YWxsb2MoZS0+YWxsb2NfdWQsIHB0ciwgb2xkc2l6ZSwgc2l6ZSk7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gIC8qIE92ZXJ3cml0ZSBub24tcHJlc2VydmVkIG1lbW9yeSB0byBlbnN1cmUgY2FsbGVycyBhcmUgcGFzc2luZyB0aGUgb2xkc2l6ZQotICAgKiB0aGF0IHRoZXkgdHJ1bHkgcmVxdWlyZS4gKi8KLSAgbWVtc2V0KHJldCArIG9sZHNpemUsIDB4ZmYsIHNpemUgLSBvbGRzaXplKTsKLSNlbmRpZgotCi0gIHJldHVybiByZXQ7Ci19Ci0KLXNpemVfdCB1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGNvbnN0IHVwYl9lbnYgKmUpIHsKLSAgcmV0dXJuIGUtPmJ5dGVzX2FsbG9jYXRlZDsKLX0KLQotCi0vKiB1cGJfc2VlZGVkYWxsb2MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBCZSBjb25zZXJ2YXRpdmUgYW5kIGNob29zZSAxNiBpbiBjYXNlIGFueW9uZSBpcyB1c2luZyBTU0UuICovCi1zdGF0aWMgY29uc3Qgc2l6ZV90IG1heGFsaWduID0gMTY7Ci0KLXN0YXRpYyBzaXplX3QgYWxpZ25fdXAoc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuICgoc2l6ZSArIG1heGFsaWduIC0gMSkgLyBtYXhhbGlnbikgKiBtYXhhbGlnbjsKLX0KLQotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyB2b2lkICpzZWVkZWRfYWxsb2Modm9pZCAqdWQsIHZvaWQgKnB0ciwgc2l6ZV90IG9sZHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewotICB1cGJfc2VlZGVkYWxsb2MgKmEgPSB1ZDsKLQotICBzaXplID0gYWxpZ25fdXAoc2l6ZSk7Ci0KLSAgYXNzZXJ0KGEtPm1lbV9saW1pdCA+PSBhLT5tZW1fcHRyKTsKLQotICBpZiAob2xkc2l6ZSA9PSAwICYmIHNpemUgPD0gKHNpemVfdCkoYS0+bWVtX2xpbWl0IC0gYS0+bWVtX3B0cikpIHsKLSAgICAvKiBGYXN0IHBhdGg6IHdlIGNhbiBzYXRpc2Z5IGZyb20gdGhlIGluaXRpYWwgYWxsb2NhdGlvbi4gKi8KLSAgICB2b2lkICpyZXQgPSBhLT5tZW1fcHRyOwotICAgIGEtPm1lbV9wdHIgKz0gc2l6ZTsKLSAgICByZXR1cm4gcmV0OwotICB9IGVsc2UgewotICAgIGNoYXIgKmNocHRyID0gcHRyOwotICAgIC8qIFNsb3cgcGF0aDogZmFsbGJhY2sgdG8gb3RoZXIgYWxsb2NhdG9yLiAqLwotICAgIGEtPm5lZWRfY2xlYW51cCA9IHRydWU7Ci0gICAgLyogSXMgYHB0cmAgcGFydCBvZiB0aGUgdXNlci1wcm92aWRlZCBpbml0aWFsIGJsb2NrPyBEb24ndCBwYXNzIGl0IHRvIHRoZQotICAgICAqIGRlZmF1bHQgYWxsb2NhdG9yIGlmIHNvOyBvdGhlcndpc2UsIGl0IG1heSB0cnkgdG8gcmVhbGxvYygpIHRoZSBibG9jay4gKi8KLSAgICBpZiAoY2hwdHIgPj0gYS0+bWVtX2Jhc2UgJiYgY2hwdHIgPCBhLT5tZW1fbGltaXQpIHsKLSAgICAgIHZvaWQgKnJldDsKLSAgICAgIGFzc2VydChjaHB0ciArIG9sZHNpemUgPD0gYS0+bWVtX2xpbWl0KTsKLSAgICAgIHJldCA9IGEtPmFsbG9jKGEtPmFsbG9jX3VkLCBOVUxMLCAwLCBzaXplKTsKLSAgICAgIGlmIChyZXQpIG1lbWNweShyZXQsIHB0ciwgb2xkc2l6ZSk7Ci0gICAgICByZXR1cm4gcmV0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYS0+YWxsb2MoYS0+YWxsb2NfdWQsIHB0ciwgb2xkc2l6ZSwgc2l6ZSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgdXBiX3NlZWRlZGFsbG9jX2luaXQodXBiX3NlZWRlZGFsbG9jICphLCB2b2lkICptZW0sIHNpemVfdCBsZW4pIHsKLSAgZGVmYXVsdF9hbGxvY191ZCAqdWQgPSAoZGVmYXVsdF9hbGxvY191ZCopJmEtPmRlZmF1bHRfYWxsb2NfdWQ7Ci0gIGEtPm1lbV9iYXNlID0gbWVtOwotICBhLT5tZW1fcHRyID0gbWVtOwotICBhLT5tZW1fbGltaXQgPSAoY2hhciopbWVtICsgbGVuOwotICBhLT5uZWVkX2NsZWFudXAgPSBmYWxzZTsKLSAgYS0+cmV0dXJuZWRfYWxsb2NmdW5jID0gZmFsc2U7Ci0KLSAgdWQtPmhlYWQgPSBOVUxMOwotCi0gIHVwYl9zZWVkZWRhbGxvY19zZXRmYWxsYmFja2FsbG9jKGEsIGRlZmF1bHRfYWxsb2MsIHVkKTsKLX0KLQotdm9pZCB1cGJfc2VlZGVkYWxsb2NfdW5pbml0KHVwYl9zZWVkZWRhbGxvYyAqYSkgewotICBpZiAoYS0+YWxsb2MgPT0gZGVmYXVsdF9hbGxvYyAmJiBhLT5uZWVkX2NsZWFudXApIHsKLSAgICBkZWZhdWx0X2FsbG9jX2NsZWFudXAoYS0+YWxsb2NfdWQpOwotICB9Ci19Ci0KLVVQQl9GT1JDRUlOTElORSB2b2lkIHVwYl9zZWVkZWRhbGxvY19zZXRmYWxsYmFja2FsbG9jKHVwYl9zZWVkZWRhbGxvYyAqYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9hbGxvY19mdW5jICphbGxvYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnVkKSB7Ci0gIGFzc2VydCghYS0+cmV0dXJuZWRfYWxsb2NmdW5jKTsKLSAgYS0+YWxsb2MgPSBhbGxvYzsKLSAgYS0+YWxsb2NfdWQgPSB1ZDsKLX0KLQotdXBiX2FsbG9jX2Z1bmMgKnVwYl9zZWVkZWRhbGxvY19nZXRhbGxvY2Z1bmModXBiX3NlZWRlZGFsbG9jICphKSB7Ci0gIGEtPnJldHVybmVkX2FsbG9jZnVuYyA9IHRydWU7Ci0gIHJldHVybiBzZWVkZWRfYWxsb2M7Ci19Ci0vKgotKiogVE9ETyhoYWJlcm1hbik6IGl0J3MgdW5jbGVhciB3aGV0aGVyIGEgbG90IG9mIHRoZSBjb25zaXN0ZW5jeSBjaGVja3Mgc2hvdWxkCi0qKiBhc3NlcnQoKSBvciByZXR1cm4gZmFsc2UuCi0qLwotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi0KLS8qIERlZmluZWQgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgaGF2aW5nIGEgdW5pcXVlIHBvaW50ZXIgdmFsdWUgZm9yCi0gKiBVUEJfTk9fQ0xPU1VSRS4gKi8KLWNoYXIgX3VwYl9ub2Nsb3N1cmU7Ci0KLXN0YXRpYyB2b2lkIGZyZWVoYW5kbGVycyh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfaGFuZGxlcnMgKmggPSAodXBiX2hhbmRsZXJzKilyOwotCi0gIHVwYl9pbnR0YWJsZV9pdGVyIGk7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgJmgtPmNsZWFudXBfKTsKLSAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpKTsgdXBiX2ludHRhYmxlX25leHQoJmkpKSB7Ci0gICAgdm9pZCAqdmFsID0gKHZvaWQqKXVwYl9pbnR0YWJsZV9pdGVyX2tleSgmaSk7Ci0gICAgdXBiX3ZhbHVlIGZ1bmNfdmFsID0gdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpOwotICAgIHVwYl9oYW5kbGVyZnJlZSAqZnVuYyA9IHVwYl92YWx1ZV9nZXRmcHRyKGZ1bmNfdmFsKTsKLSAgICBmdW5jKHZhbCk7Ci0gIH0KLQotICB1cGJfaW50dGFibGVfdW5pbml0KCZoLT5jbGVhbnVwXyk7Ci0gIHVwYl9tc2dkZWZfdW5yZWYoaC0+bXNnLCBoKTsKLSAgZnJlZShoLT5zdWIpOwotICBmcmVlKGgpOwotfQotCi1zdGF0aWMgdm9pZCB2aXNpdGhhbmRsZXJzKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZF92aXNpdCAqdmlzaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgdXBiX2hhbmRsZXJzICpoID0gKGNvbnN0IHVwYl9oYW5kbGVycyopcjsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0gIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBoLT5tc2cpOwotICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaSk7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpKTsKLSAgICBjb25zdCB1cGJfaGFuZGxlcnMgKnN1YjsKLSAgICBpZiAoIXVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgY29udGludWU7Ci0gICAgc3ViID0gdXBiX2hhbmRsZXJzX2dldHN1YmhhbmRsZXJzKGgsIGYpOwotICAgIGlmIChzdWIpIHZpc2l0KHIsIHVwYl9oYW5kbGVyc191cGNhc3Qoc3ViKSwgY2xvc3VyZSk7Ci0gIH0KLX0KLQotc3RhdGljIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsIHZ0YmwgPSB7dmlzaXRoYW5kbGVycywgZnJlZWhhbmRsZXJzfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1cGJfaW50dGFibGUgdGFiOyAgLyogbWFwcyB1cGJfbXNnZGVmKiAtPiB1cGJfaGFuZGxlcnMqLiAqLwotICB1cGJfaGFuZGxlcnNfY2FsbGJhY2sgKmNhbGxiYWNrOwotICBjb25zdCB2b2lkICpjbG9zdXJlOwotfSBkZnNfc3RhdGU7Ci0KLS8qIFRPRE8oaGFiZXJtYW4pOiBkaXNjYXJkIHVwYl9oYW5kbGVycyogb2JqZWN0cyB0aGF0IGRvIG5vdCBhY3R1YWxseSBoYXZlIGFueQotICogaGFuZGxlcnMgc2V0IGFuZCBjYW5ub3QgcmVhY2ggYW55IHVwYl9oYW5kbGVycyogb2JqZWN0IHRoYXQgZG9lcy4gIFRoaXMgaXMKLSAqIHNsaWdodGx5IHRyaWNreSB0byBkbyBjb3JyZWN0bHkuICovCi1zdGF0aWMgdXBiX2hhbmRsZXJzICpuZXdmb3Jtc2coY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3Qgdm9pZCAqb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGZzX3N0YXRlICpzKSB7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICB1cGJfaGFuZGxlcnMgKmggPSB1cGJfaGFuZGxlcnNfbmV3KG0sIG93bmVyKTsKLSAgaWYgKCFoKSByZXR1cm4gTlVMTDsKLSAgaWYgKCF1cGJfaW50dGFibGVfaW5zZXJ0cHRyKCZzLT50YWIsIG0sIHVwYl92YWx1ZV9wdHIoaCkpKSBnb3RvIG9vbTsKLQotICBzLT5jYWxsYmFjayhzLT5jbG9zdXJlLCBoKTsKLQotICAvKiBGb3IgZWFjaCBzdWJtZXNzYWdlIGZpZWxkLCBnZXQgb3IgY3JlYXRlIGEgaGFuZGxlcnMgb2JqZWN0IGFuZCBzZXQgaXQgYXMKLSAgICogdGhlIHN1YmhhbmRsZXJzLiAqLwotICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaSwgbSk7Ci0gICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaSkpIHsKLSAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmkpOwotICAgIGNvbnN0IHVwYl9tc2dkZWYgKnN1YmRlZjsKLSAgICB1cGJfdmFsdWUgc3VibV9lbnQ7Ci0KLSAgICBpZiAoIXVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgY29udGludWU7Ci0KLSAgICBzdWJkZWYgPSB1cGJfZG93bmNhc3RfbXNnZGVmKHVwYl9maWVsZGRlZl9zdWJkZWYoZikpOwotICAgIGlmICh1cGJfaW50dGFibGVfbG9va3VwcHRyKCZzLT50YWIsIHN1YmRlZiwgJnN1Ym1fZW50KSkgewotICAgICAgdXBiX2hhbmRsZXJzX3NldHN1YmhhbmRsZXJzKGgsIGYsIHVwYl92YWx1ZV9nZXRwdHIoc3VibV9lbnQpKTsKLSAgICB9IGVsc2UgewotICAgICAgdXBiX2hhbmRsZXJzICpzdWJfbWggPSBuZXdmb3Jtc2coc3ViZGVmLCAmc3ViX21oLCBzKTsKLSAgICAgIGlmICghc3ViX21oKSBnb3RvIG9vbTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdWJoYW5kbGVycyhoLCBmLCBzdWJfbWgpOwotICAgICAgdXBiX2hhbmRsZXJzX3VucmVmKHN1Yl9taCwgJnN1Yl9taCk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBoOwotCi1vb206Ci0gIHVwYl9oYW5kbGVyc191bnJlZihoLCBvd25lcik7Ci0gIHJldHVybiBOVUxMOwotfQotCi0vKiBHaXZlbiBhIHNlbGVjdG9yIGZvciBhIFNUQVJUU1VCTVNHIGhhbmRsZXIsIHJlc29sdmVzIHRvIGEgcG9pbnRlciB0byB0aGUKLSAqIHN1YmhhbmRsZXJzIGZvciB0aGlzIHN1Ym1lc3NhZ2UgZmllbGQuICovCi0jZGVmaW5lIFNVQkgoaCwgc2VsZWN0b3IpIChoLT5zdWJbc2VsZWN0b3JdKQotCi0vKiBUaGUgc2VsZWN0b3IgZm9yIGEgc3VibWVzc2FnZSBmaWVsZCBpcyB0aGUgZmllbGQgaW5kZXguICovCi0jZGVmaW5lIFNVQkhfRihoLCBmKSBTVUJIKGgsIGYtPmluZGV4XykKLQotc3RhdGljIGludDMyX3QgdHJ5Z2V0c2VsKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVydHlwZV90IHR5cGUpIHsKLSAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotICBhc3NlcnQoIXVwYl9oYW5kbGVyc19pc2Zyb3plbihoKSk7Ci0gIGlmICh1cGJfaGFuZGxlcnNfbXNnZGVmKGgpICE9IHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigKLSAgICAgICAgJmgtPnN0YXR1c18sICJ0eXBlIG1pc21hdGNoOiBmaWVsZCAlcyBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSAlcyIsCi0gICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKGYpLCB1cGJfbXNnZGVmX2Z1bGxuYW1lKHVwYl9oYW5kbGVyc19tc2dkZWYoaCkpKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKCF1cGJfaGFuZGxlcnNfZ2V0c2VsZWN0b3IoZiwgdHlwZSwgJnNlbCkpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYoCi0gICAgICAgICZoLT5zdGF0dXNfLAotICAgICAgICAidHlwZSBtaXNtYXRjaDogY2Fubm90IHJlZ2lzdGVyIGhhbmRsZXIgdHlwZSAlZCBmb3IgZmllbGQgJXMiLAotICAgICAgICB0eXBlLCB1cGJfZmllbGRkZWZfbmFtZShmKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiBzZWw7Ci19Ci0KLXN0YXRpYyB1cGJfc2VsZWN0b3JfdCBoYW5kbGVyc19nZXRzZWwodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVydHlwZV90IHR5cGUpIHsKLSAgaW50MzJfdCBzZWwgPSB0cnlnZXRzZWwoaCwgZiwgdHlwZSk7Ci0gIGFzc2VydChzZWwgPj0gMCk7Ci0gIHJldHVybiBzZWw7Ci19Ci0KLXN0YXRpYyBjb25zdCB2b2lkICoqcmV0dXJudHlwZSh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnR5cGVfdCB0eXBlKSB7Ci0gIHJldHVybiAmaC0+dGFibGVbaGFuZGxlcnNfZ2V0c2VsKGgsIGYsIHR5cGUpXS5hdHRyLnJldHVybl9jbG9zdXJlX3R5cGVfOwotfQotCi1zdGF0aWMgYm9vbCBkb3NldCh1cGJfaGFuZGxlcnMgKmgsIGludDMyX3Qgc2VsLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnR5cGVfdCB0eXBlLCB1cGJfZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cikgewotICB1cGJfaGFuZGxlcmF0dHIgc2V0X2F0dHIgPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0gIGNvbnN0IHZvaWQgKmNsb3N1cmVfdHlwZTsKLSAgY29uc3Qgdm9pZCAqKmNvbnRleHRfY2xvc3VyZV90eXBlOwotCi0gIGFzc2VydCghdXBiX2hhbmRsZXJzX2lzZnJvemVuKGgpKTsKLQotICBpZiAoc2VsIDwgMCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZoLT5zdGF0dXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICJpbmNvcnJlY3QgaGFuZGxlciB0eXBlIGZvciB0aGlzIGZpZWxkLiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChoLT50YWJsZVtzZWxdLmZ1bmMpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZygmaC0+c3RhdHVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY2Fubm90IGNoYW5nZSBoYW5kbGVyIG9uY2UgaXQgaGFzIGJlZW4gc2V0LiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChhdHRyKSB7Ci0gICAgc2V0X2F0dHIgPSAqYXR0cjsKLSAgfQotCi0gIC8qIENoZWNrIHRoYXQgdGhlIGdpdmVuIGNsb3N1cmUgdHlwZSBtYXRjaGVzIHRoZSBjbG9zdXJlIHR5cGUgdGhhdCBoYXMgYmVlbgotICAgKiBlc3RhYmxpc2hlZCBmb3IgdGhpcyBjb250ZXh0IChpZiBhbnkpLiAqLwotICBjbG9zdXJlX3R5cGUgPSB1cGJfaGFuZGxlcmF0dHJfY2xvc3VyZXR5cGUoJnNldF9hdHRyKTsKLQotICBpZiAodHlwZSA9PSBVUEJfSEFORExFUl9TVFJJTkcpIHsKLSAgICBjb250ZXh0X2Nsb3N1cmVfdHlwZSA9IHJldHVybnR5cGUoaCwgZiwgVVBCX0hBTkRMRVJfU1RBUlRTVFIpOwotICB9IGVsc2UgaWYgKGYgJiYgdXBiX2ZpZWxkZGVmX2lzc2VxKGYpICYmCi0gICAgICAgICAgICAgdHlwZSAhPSBVUEJfSEFORExFUl9TVEFSVFNFUSAmJgotICAgICAgICAgICAgIHR5cGUgIT0gVVBCX0hBTkRMRVJfRU5EU0VRKSB7Ci0gICAgY29udGV4dF9jbG9zdXJlX3R5cGUgPSByZXR1cm50eXBlKGgsIGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRKTsKLSAgfSBlbHNlIHsKLSAgICBjb250ZXh0X2Nsb3N1cmVfdHlwZSA9ICZoLT50b3BfY2xvc3VyZV90eXBlOwotICB9Ci0KLSAgaWYgKGNsb3N1cmVfdHlwZSAmJiAqY29udGV4dF9jbG9zdXJlX3R5cGUgJiYKLSAgICAgIGNsb3N1cmVfdHlwZSAhPSAqY29udGV4dF9jbG9zdXJlX3R5cGUpIHsKLSAgICAvKiBUT0RPKGhhYmVybWFuKTogYmV0dGVyIG1lc3NhZ2UgZm9yIGRlYnVnZ2luZy4gKi8KLSAgICBpZiAoZikgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKCZoLT5zdGF0dXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICJjbG9zdXJlIHR5cGUgZG9lcyBub3QgbWF0Y2ggZm9yIGZpZWxkICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShmKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKAotICAgICAgICAgICZoLT5zdGF0dXNfLCAiY2xvc3VyZSB0eXBlIGRvZXMgbm90IG1hdGNoIGZvciBtZXNzYWdlLWxldmVsIGhhbmRsZXIiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGNsb3N1cmVfdHlwZSkKLSAgICAqY29udGV4dF9jbG9zdXJlX3R5cGUgPSBjbG9zdXJlX3R5cGU7Ci0KLSAgLyogSWYgdGhpcyBpcyBhIFNUQVJUU0VRIG9yIFNUQVJUU1RSIGhhbmRsZXIsIGNoZWNrIHRoYXQgdGhlIHJldHVybmVkIHBvaW50ZXIKLSAgICogbWF0Y2hlcyBhbnkgcHJlLWV4aXN0aW5nIGV4cGVjdGF0aW9ucyBhYm91dCB3aGF0IHR5cGUgaXMgZXhwZWN0ZWQuICovCi0gIGlmICh0eXBlID09IFVQQl9IQU5ETEVSX1NUQVJUU0VRIHx8IHR5cGUgPT0gVVBCX0hBTkRMRVJfU1RBUlRTVFIpIHsKLSAgICBjb25zdCB2b2lkICpyZXR1cm5fdHlwZSA9IHVwYl9oYW5kbGVyYXR0cl9yZXR1cm5jbG9zdXJldHlwZSgmc2V0X2F0dHIpOwotICAgIGNvbnN0IHZvaWQgKnRhYmxlX3JldHVybl90eXBlID0KLSAgICAgICAgdXBiX2hhbmRsZXJhdHRyX3JldHVybmNsb3N1cmV0eXBlKCZoLT50YWJsZVtzZWxdLmF0dHIpOwotICAgIGlmIChyZXR1cm5fdHlwZSAmJiB0YWJsZV9yZXR1cm5fdHlwZSAmJiByZXR1cm5fdHlwZSAhPSB0YWJsZV9yZXR1cm5fdHlwZSkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJtc2coJmgtPnN0YXR1c18sICJjbG9zdXJlIHJldHVybiB0eXBlIGRvZXMgbm90IG1hdGNoIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKHRhYmxlX3JldHVybl90eXBlICYmICFyZXR1cm5fdHlwZSkKLSAgICAgIHVwYl9oYW5kbGVyYXR0cl9zZXRyZXR1cm5jbG9zdXJldHlwZSgmc2V0X2F0dHIsIHRhYmxlX3JldHVybl90eXBlKTsKLSAgfQotCi0gIGgtPnRhYmxlW3NlbF0uZnVuYyA9ICh1cGJfZnVuYyopZnVuYzsKLSAgaC0+dGFibGVbc2VsXS5hdHRyID0gc2V0X2F0dHI7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBSZXR1cm5zIHRoZSBlZmZlY3RpdmUgY2xvc3VyZSB0eXBlIGZvciB0aGlzIGhhbmRsZXIgKHdoaWNoIHdpbGwgcHJvcGFnYXRlCi0gKiBmcm9tIG91dGVyIGZyYW1lcyBpZiB0aGlzIGZyYW1lIGhhcyBubyBTVEFSVCogaGFuZGxlcikuICBOb3QgaW1wbGVtZW50ZWQgZm9yCi0gKiBVUEJfSEFORExFUl9TVFJJTkcgYXQgdGhlIG1vbWVudCBzaW5jZSB0aGlzIGlzIG5vdCBuZWVkZWQuICBSZXR1cm5zIE5VTEwgaXMKLSAqIHRoZSBlZmZlY3RpdmUgY2xvc3VyZSB0eXBlIGlzIHVuc3BlY2lmaWVkIChlaXRoZXIgbm8gaGFuZGxlciB3YXMgcmVnaXN0ZXJlZAotICogdG8gc3BlY2lmeSBpdCBvciB0aGUgaGFuZGxlciB0aGF0IHdhcyByZWdpc3RlcmVkIGRpZCBub3Qgc3BlY2lmeSB0aGUgY2xvc3VyZQotICogdHlwZSkuICovCi1jb25zdCB2b2lkICplZmZlY3RpdmVfY2xvc3VyZV90eXBlKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnR5cGVfdCB0eXBlKSB7Ci0gIGNvbnN0IHZvaWQgKnJldDsKLSAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotCi0gIGFzc2VydCh0eXBlICE9IFVQQl9IQU5ETEVSX1NUUklORyk7Ci0gIHJldCA9IGgtPnRvcF9jbG9zdXJlX3R5cGU7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSAmJgotICAgICAgdHlwZSAhPSBVUEJfSEFORExFUl9TVEFSVFNFUSAmJgotICAgICAgdHlwZSAhPSBVUEJfSEFORExFUl9FTkRTRVEgJiYKLSAgICAgIGgtPnRhYmxlW3NlbCA9IGhhbmRsZXJzX2dldHNlbChoLCBmLCBVUEJfSEFORExFUl9TVEFSVFNFUSldLmZ1bmMpIHsKLSAgICByZXQgPSB1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUoJmgtPnRhYmxlW3NlbF0uYXR0cik7Ci0gIH0KLQotICBpZiAodHlwZSA9PSBVUEJfSEFORExFUl9TVFJJTkcgJiYKLSAgICAgIGgtPnRhYmxlW3NlbCA9IGhhbmRsZXJzX2dldHNlbChoLCBmLCBVUEJfSEFORExFUl9TVEFSVFNUUildLmZ1bmMpIHsKLSAgICByZXQgPSB1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUoJmgtPnRhYmxlW3NlbF0uYXR0cik7Ci0gIH0KLQotICAvKiBUaGUgZWZmZWN0aXZlIHR5cGUgb2YgdGhlIHN1Ym1lc3NhZ2U7IG5vdCB1c2VkIHlldC4KLSAgICogaWYgKHR5cGUgPT0gU1VCTUVTU0FHRSAmJgotICAgKiAgICAgaC0+dGFibGVbc2VsID0gaGFuZGxlcnNfZ2V0c2VsKGgsIGYsIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKV0uZnVuYykgewotICAgKiAgIHJldCA9IHVwYl9oYW5kbGVyYXR0cl9yZXR1cm5jbG9zdXJldHlwZSgmaC0+dGFibGVbc2VsXS5hdHRyKTsKLSAgICogfSAqLwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIENoZWNrcyB3aGV0aGVyIHRoZSBTVEFSVCogaGFuZGxlciBzcGVjaWZpZWQgYnkgZiAmIHR5cGUgaXMgbWlzc2luZyBldmVuCi0gKiB0aG91Z2ggaXQgaXMgcmVxdWlyZWQgdG8gY29udmVydCB0aGUgZXN0YWJsaXNoZWQgdHlwZSBvZiBhbiBvdXRlciBmcmFtZQotICogKCJjbG9zdXJlX3R5cGUiKSBpbnRvIHRoZSBlc3RhYmxpc2hlZCB0eXBlIG9mIGFuIGlubmVyIGZyYW1lIChyZXByZXNlbnRlZCBpbgotICogdGhlIHJldHVybiBjbG9zdXJlIHR5cGUgb2YgdGhpcyBoYW5kbGVyJ3MgYXR0ci4gKi8KLWJvb2wgY2hlY2tzdGFydCh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgdXBiX2hhbmRsZXJ0eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgY29uc3Qgdm9pZCAqY2xvc3VyZV90eXBlOwotICBjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHI7Ci0gIGNvbnN0IHZvaWQgKnJldHVybl9jbG9zdXJlX3R5cGU7Ci0KLSAgdXBiX3NlbGVjdG9yX3Qgc2VsID0gaGFuZGxlcnNfZ2V0c2VsKGgsIGYsIHR5cGUpOwotICBpZiAoaC0+dGFibGVbc2VsXS5mdW5jKSByZXR1cm4gdHJ1ZTsKLSAgY2xvc3VyZV90eXBlID0gZWZmZWN0aXZlX2Nsb3N1cmVfdHlwZShoLCBmLCB0eXBlKTsKLSAgYXR0ciA9ICZoLT50YWJsZVtzZWxdLmF0dHI7Ci0gIHJldHVybl9jbG9zdXJlX3R5cGUgPSB1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUoYXR0cik7Ci0gIGlmIChjbG9zdXJlX3R5cGUgJiYgcmV0dXJuX2Nsb3N1cmVfdHlwZSAmJgotICAgICAgY2xvc3VyZV90eXBlICE9IHJldHVybl9jbG9zdXJlX3R5cGUpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYoc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgc3RhcnQgaGFuZGxlciB0byByZXR1cm4gc3ViIHR5cGUgZm9yIGZpZWxkICVmIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ZpZWxkZGVmX25hbWUoZikpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUHVibGljIGludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdXBiX2hhbmRsZXJzICp1cGJfaGFuZGxlcnNfbmV3KGNvbnN0IHVwYl9tc2dkZWYgKm1kLCBjb25zdCB2b2lkICpvd25lcikgewotICBpbnQgZXh0cmE7Ci0gIHVwYl9oYW5kbGVycyAqaDsKLQotICBhc3NlcnQodXBiX21zZ2RlZl9pc2Zyb3plbihtZCkpOwotCi0gIGV4dHJhID0gc2l6ZW9mKHVwYl9oYW5kbGVyc190YWJlbnQpICogKG1kLT5zZWxlY3Rvcl9jb3VudCAtIDEpOwotICBoID0gY2FsbG9jKHNpemVvZigqaCkgKyBleHRyYSwgMSk7Ci0gIGlmICghaCkgcmV0dXJuIE5VTEw7Ci0KLSAgaC0+bXNnID0gbWQ7Ci0gIHVwYl9tc2dkZWZfcmVmKGgtPm1zZywgaCk7Ci0gIHVwYl9zdGF0dXNfY2xlYXIoJmgtPnN0YXR1c18pOwotICBoLT5zdWIgPSBjYWxsb2MobWQtPnN1Ym1zZ19maWVsZF9jb3VudCwgc2l6ZW9mKCpoLT5zdWIpKTsKLSAgaWYgKCFoLT5zdWIpIGdvdG8gb29tOwotICBpZiAoIXVwYl9yZWZjb3VudGVkX2luaXQodXBiX2hhbmRsZXJzX3VwY2FzdF9tdXRhYmxlKGgpLCAmdnRibCwgb3duZXIpKQotICAgIGdvdG8gb29tOwotICBpZiAoIXVwYl9pbnR0YWJsZV9pbml0KCZoLT5jbGVhbnVwXywgVVBCX0NUWVBFX0ZQVFIpKSBnb3RvIG9vbTsKLQotICAvKiBjYWxsb2MoKSBhYm92ZSBpbml0aWFsaXplZCBhbGwgaGFuZGxlcnMgdG8gTlVMTC4gKi8KLSAgcmV0dXJuIGg7Ci0KLW9vbToKLSAgZnJlZWhhbmRsZXJzKHVwYl9oYW5kbGVyc191cGNhc3RfbXV0YWJsZShoKSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9oYW5kbGVyc19uZXdmcm96ZW4oY29uc3QgdXBiX21zZ2RlZiAqbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnNfY2FsbGJhY2sgKmNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNsb3N1cmUpIHsKLSAgZGZzX3N0YXRlIHN0YXRlOwotICB1cGJfaGFuZGxlcnMgKnJldDsKLSAgYm9vbCBvazsKLSAgdXBiX3JlZmNvdW50ZWQgKnI7Ci0KLSAgc3RhdGUuY2FsbGJhY2sgPSBjYWxsYmFjazsKLSAgc3RhdGUuY2xvc3VyZSA9IGNsb3N1cmU7Ci0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoJnN0YXRlLnRhYiwgVVBCX0NUWVBFX1BUUikpIHJldHVybiBOVUxMOwotCi0gIHJldCA9IG5ld2Zvcm1zZyhtLCBvd25lciwgJnN0YXRlKTsKLQotICB1cGJfaW50dGFibGVfdW5pbml0KCZzdGF0ZS50YWIpOwotICBpZiAoIXJldCkgcmV0dXJuIE5VTEw7Ci0KLSAgciA9IHVwYl9oYW5kbGVyc191cGNhc3RfbXV0YWJsZShyZXQpOwotICBvayA9IHVwYl9yZWZjb3VudGVkX2ZyZWV6ZSgmciwgMSwgTlVMTCwgVVBCX01BWF9IQU5ETEVSX0RFUFRIKTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1jb25zdCB1cGJfc3RhdHVzICp1cGJfaGFuZGxlcnNfc3RhdHVzKHVwYl9oYW5kbGVycyAqaCkgewotICBhc3NlcnQoIXVwYl9oYW5kbGVyc19pc2Zyb3plbihoKSk7Ci0gIHJldHVybiAmaC0+c3RhdHVzXzsKLX0KLQotdm9pZCB1cGJfaGFuZGxlcnNfY2xlYXJlcnIodXBiX2hhbmRsZXJzICpoKSB7Ci0gIGFzc2VydCghdXBiX2hhbmRsZXJzX2lzZnJvemVuKGgpKTsKLSAgdXBiX3N0YXR1c19jbGVhcigmaC0+c3RhdHVzXyk7Ci19Ci0KLSNkZWZpbmUgU0VUVEVSKG5hbWUsIGhhbmRsZXJjdHlwZSwgaGFuZGxlcnR5cGUpIFwKLSAgYm9vbCB1cGJfaGFuZGxlcnNfc2V0ICMjIG5hbWUodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFuZGxlcmN0eXBlIGZ1bmMsIHVwYl9oYW5kbGVyYXR0ciAqYXR0cikgeyBcCi0gICAgaW50MzJfdCBzZWwgPSB0cnlnZXRzZWwoaCwgZiwgaGFuZGxlcnR5cGUpOyBcCi0gICAgcmV0dXJuIGRvc2V0KGgsIHNlbCwgZiwgaGFuZGxlcnR5cGUsICh1cGJfZnVuYyopZnVuYywgYXR0cik7IFwKLSAgfQotCi1TRVRURVIoaW50MzIsICAgICAgIHVwYl9pbnQzMl9oYW5kbGVyZnVuYyosICAgICAgIFVQQl9IQU5ETEVSX0lOVDMyKQotU0VUVEVSKGludDY0LCAgICAgICB1cGJfaW50NjRfaGFuZGxlcmZ1bmMqLCAgICAgICBVUEJfSEFORExFUl9JTlQ2NCkKLVNFVFRFUih1aW50MzIsICAgICAgdXBiX3VpbnQzMl9oYW5kbGVyZnVuYyosICAgICAgVVBCX0hBTkRMRVJfVUlOVDMyKQotU0VUVEVSKHVpbnQ2NCwgICAgICB1cGJfdWludDY0X2hhbmRsZXJmdW5jKiwgICAgICBVUEJfSEFORExFUl9VSU5UNjQpCi1TRVRURVIoZmxvYXQsICAgICAgIHVwYl9mbG9hdF9oYW5kbGVyZnVuYyosICAgICAgIFVQQl9IQU5ETEVSX0ZMT0FUKQotU0VUVEVSKGRvdWJsZSwgICAgICB1cGJfZG91YmxlX2hhbmRsZXJmdW5jKiwgICAgICBVUEJfSEFORExFUl9ET1VCTEUpCi1TRVRURVIoYm9vbCwgICAgICAgIHVwYl9ib29sX2hhbmRsZXJmdW5jKiwgICAgICAgIFVQQl9IQU5ETEVSX0JPT0wpCi1TRVRURVIoc3RhcnRzdHIsICAgIHVwYl9zdGFydHN0cl9oYW5kbGVyZnVuYyosICAgIFVQQl9IQU5ETEVSX1NUQVJUU1RSKQotU0VUVEVSKHN0cmluZywgICAgICB1cGJfc3RyaW5nX2hhbmRsZXJmdW5jKiwgICAgICBVUEJfSEFORExFUl9TVFJJTkcpCi1TRVRURVIoZW5kc3RyLCAgICAgIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyosICAgIFVQQl9IQU5ETEVSX0VORFNUUikKLVNFVFRFUihzdGFydHNlcSwgICAgdXBiX3N0YXJ0ZmllbGRfaGFuZGxlcmZ1bmMqLCAgVVBCX0hBTkRMRVJfU1RBUlRTRVEpCi1TRVRURVIoc3RhcnRzdWJtc2csIHVwYl9zdGFydGZpZWxkX2hhbmRsZXJmdW5jKiwgIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKQotU0VUVEVSKGVuZHN1Ym1zZywgICB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmMqLCAgICBVUEJfSEFORExFUl9FTkRTVUJNU0cpCi1TRVRURVIoZW5kc2VxLCAgICAgIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyosICAgIFVQQl9IQU5ETEVSX0VORFNFUSkKLQotI3VuZGVmIFNFVFRFUgotCi1ib29sIHVwYl9oYW5kbGVyc19zZXRzdGFydG1zZyh1cGJfaGFuZGxlcnMgKmgsIHVwYl9zdGFydG1zZ19oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cikgewotICByZXR1cm4gZG9zZXQoaCwgVVBCX1NUQVJUTVNHX1NFTEVDVE9SLCBOVUxMLCBVUEJfSEFORExFUl9JTlQzMiwKLSAgICAgICAgICAgICAgICh1cGJfZnVuYyAqKWZ1bmMsIGF0dHIpOwotfQotCi1ib29sIHVwYl9oYW5kbGVyc19zZXRlbmRtc2codXBiX2hhbmRsZXJzICpoLCB1cGJfZW5kbXNnX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cikgewotICBhc3NlcnQoIXVwYl9oYW5kbGVyc19pc2Zyb3plbihoKSk7Ci0gIHJldHVybiBkb3NldChoLCBVUEJfRU5ETVNHX1NFTEVDVE9SLCBOVUxMLCBVUEJfSEFORExFUl9JTlQzMiwKLSAgICAgICAgICAgICAgICh1cGJfZnVuYyAqKWZ1bmMsIGF0dHIpOwotfQotCi1ib29sIHVwYl9oYW5kbGVyc19zZXRzdWJoYW5kbGVycyh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9oYW5kbGVycyAqc3ViKSB7Ci0gIGFzc2VydChzdWIpOwotICBhc3NlcnQoIXVwYl9oYW5kbGVyc19pc2Zyb3plbihoKSk7Ci0gIGFzc2VydCh1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpOwotICBpZiAoU1VCSF9GKGgsIGYpKSByZXR1cm4gZmFsc2U7ICAvKiBDYW4ndCByZXNldC4gKi8KLSAgaWYgKHVwYl9tc2dkZWZfdXBjYXN0KHVwYl9oYW5kbGVyc19tc2dkZWYoc3ViKSkgIT0gdXBiX2ZpZWxkZGVmX3N1YmRlZihmKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBTVUJIX0YoaCwgZikgPSBzdWI7Ci0gIHVwYl9yZWYyKHN1YiwgaCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVycyhjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgYXNzZXJ0KHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSk7Ci0gIHJldHVybiBTVUJIX0YoaCwgZik7Ci19Ci0KLWJvb2wgdXBiX2hhbmRsZXJzX2dldGF0dHIoY29uc3QgdXBiX2hhbmRsZXJzICpoLCB1cGJfc2VsZWN0b3JfdCBzZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cikgewotICBpZiAoIXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKGgsIHNlbCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAqYXR0ciA9IGgtPnRhYmxlW3NlbF0uYXR0cjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX2hhbmRsZXJzX2dldHN1YmhhbmRsZXJzX3NlbChjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NlbGVjdG9yX3Qgc2VsKSB7Ci0gIC8qIFNUQVJUU1VCTVNHIHNlbGVjdG9yIGluIHNlbCBpcyB0aGUgZmllbGQncyBzZWxlY3RvciBiYXNlLiAqLwotICByZXR1cm4gU1VCSChoLCBzZWwgLSBVUEJfU1RBVElDX1NFTEVDVE9SX0NPVU5UKTsKLX0KLQotY29uc3QgdXBiX21zZ2RlZiAqdXBiX2hhbmRsZXJzX21zZ2RlZihjb25zdCB1cGJfaGFuZGxlcnMgKmgpIHsgcmV0dXJuIGgtPm1zZzsgfQotCi1ib29sIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKHVwYl9oYW5kbGVycyAqaCwgdm9pZCAqcCwgdXBiX2hhbmRsZXJmcmVlICpmdW5jKSB7Ci0gIGJvb2wgb2s7Ci0gIGlmICh1cGJfaW50dGFibGVfbG9va3VwcHRyKCZoLT5jbGVhbnVwXywgcCwgTlVMTCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgb2sgPSB1cGJfaW50dGFibGVfaW5zZXJ0cHRyKCZoLT5jbGVhbnVwXywgcCwgdXBiX3ZhbHVlX2ZwdHIoZnVuYykpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiAiU3RhdGljIiBtZXRob2RzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1ib29sIHVwYl9oYW5kbGVyc19mcmVlemUodXBiX2hhbmRsZXJzICpjb25zdCpoYW5kbGVycywgaW50IG4sIHVwYl9zdGF0dXMgKnMpIHsKLSAgLyogVE9ETzogdmVyaWZ5IHdlIGhhdmUgYSB0cmFuc2l0aXZlIGNsb3N1cmUuICovCi0gIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgdXBiX21zZ19maWVsZF9pdGVyIGo7Ci0gICAgdXBiX2hhbmRsZXJzICpoID0gaGFuZGxlcnNbaV07Ci0KLSAgICBpZiAoIXVwYl9vaygmaC0+c3RhdHVzXykpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLCAiaGFuZGxlcnMgZm9yIG1lc3NhZ2UgJXMgaGFkIGVycm9yIHN0YXR1czogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9tc2dkZWZfZnVsbG5hbWUodXBiX2hhbmRsZXJzX21zZ2RlZihoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1c19lcnJtc2coJmgtPnN0YXR1c18pKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKiBDaGVjayB0aGF0IHRoZXJlIGFyZSBubyBjbG9zdXJlIG1pc21hdGNoZXMgZHVlIHRvIG1pc3NpbmcgU3RhcnQqIGhhbmRsZXJzCi0gICAgICogb3Igc3ViaGFuZGxlcnMgd2l0aCBkaWZmZXJlbnQgdHlwZS1sZXZlbCB0eXBlcy4gKi8KLSAgICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaiwgaC0+bXNnKTsKLSAgICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaik7Ci0gICAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaikpIHsKLQotICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZqKTsKLSAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgICAgaWYgKCFjaGVja3N0YXJ0KGgsIGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRLCBzKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdHJpbmcoZikpIHsKLSAgICAgICAgaWYgKCFjaGVja3N0YXJ0KGgsIGYsIFVQQl9IQU5ETEVSX1NUQVJUU1RSLCBzKSkKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpIHsKLSAgICAgICAgYm9vbCBoYXNoYW5kbGVyID0gZmFsc2U7Ci0gICAgICAgIGlmICh1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcigKLSAgICAgICAgICAgICAgICBoLCBoYW5kbGVyc19nZXRzZWwoaCwgZiwgVVBCX0hBTkRMRVJfU1RBUlRTVUJNU0cpKSB8fAotICAgICAgICAgICAgdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoCi0gICAgICAgICAgICAgICAgaCwgaGFuZGxlcnNfZ2V0c2VsKGgsIGYsIFVQQl9IQU5ETEVSX0VORFNVQk1TRykpKSB7Ci0gICAgICAgICAgaGFzaGFuZGxlciA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpICYmCi0gICAgICAgICAgICAodXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoCi0gICAgICAgICAgICAgICAgIGgsIGhhbmRsZXJzX2dldHNlbChoLCBmLCBVUEJfSEFORExFUl9TVEFSVFNFUSkpIHx8Ci0gICAgICAgICAgICAgdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoCi0gICAgICAgICAgICAgICAgIGgsIGhhbmRsZXJzX2dldHNlbChoLCBmLCBVUEJfSEFORExFUl9FTkRTRVEpKSkpIHsKLSAgICAgICAgICBoYXNoYW5kbGVyID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChoYXNoYW5kbGVyICYmICF1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnMoaCwgZikpIHsKLSAgICAgICAgICAvKiBGb3Igbm93IHdlIGFkZCBhbiBlbXB0eSBzdWJoYW5kbGVycyBpbiB0aGlzIGNhc2UuICBJdCBtYWtlcyB0aGUKLSAgICAgICAgICAgKiBkZWNvZGVyIGNvZGUgZ2VuZXJhdG9yIHNpbXBsZXIsIGJlY2F1c2UgaXQgb25seSBoYXMgdG8gaGFuZGxlIHR3bwotICAgICAgICAgICAqIGNhc2VzIChzdWJtZXNzYWdlIGhhcyBoYW5kbGVycyBvciBub3QpIGFzIG9wcG9zZWQgdG8gdGhyZWUKLSAgICAgICAgICAgKiAoc3VibWVzc2FnZSBoYXMgaGFuZGxlcnMgaW4gZW5jbG9zaW5nIG1lc3NhZ2UgYnV0IG5vIHN1YmhhbmRsZXJzKS4KLSAgICAgICAgICAgKgotICAgICAgICAgICAqIFRoaXMgbWFrZXMgcGFyc2luZyBsZXNzIGVmZmljaWVudCBpbiB0aGUgY2FzZSB0aGF0IHdlIHdhbnQgdG8KLSAgICAgICAgICAgKiBub3RpY2UgYSBzdWJtZXNzYWdlIGJ1dCBza2lwIGl0cyBjb250ZW50cyAobGlrZSBpZiB3ZSdyZSB0ZXN0aW5nCi0gICAgICAgICAgICogZm9yIHN1Ym1lc3NhZ2UgcHJlc2VuY2Ugb3IgY291bnRpbmcgdGhlIG51bWJlciBvZiByZXBlYXRlZAotICAgICAgICAgICAqIHN1Ym1lc3NhZ2VzKS4gIEluIHRoaXMgY2FzZSB3ZSB3aWxsIGVuZCB1cCBwYXJzaW5nIHRoZSBzdWJtZXNzYWdlCi0gICAgICAgICAgICogZmllbGQgYnkgZmllbGQgYW5kIHRocm93aW5nIGF3YXkgdGhlIHJlc3VsdHMgZm9yIGVhY2gsIGluc3RlYWQgb2YKLSAgICAgICAgICAgKiBza2lwcGluZyB0aGUgd2hvbGUgZGVsaW1pdGVkIHRoaW5nIGF0IG9uY2UuICBJZiB0aGlzIGlzIGFuIGlzc3VlIHdlCi0gICAgICAgICAgICogY2FuIHJldmlzaXQgaXQsIGJ1dCBkbyByZW1lbWJlciB0aGF0IHRoaXMgb25seSBhcmlzZXMgd2hlbiB5b3UgaGF2ZQotICAgICAgICAgICAqIGhhbmRsZXJzIChzdGFydHNlcS9zdGFydHN1Ym1zZy9lbmRzdWJtc2cvZW5kc2VxKSBzZXQgZm9yIHRoZQotICAgICAgICAgICAqIHN1Ym1lc3NhZ2UgYnV0IG5vIHN1YmhhbmRsZXJzLiAgVGhlIHVzZXMgY2FzZXMgZm9yIHRoaXMgYXJlCi0gICAgICAgICAgICogbGltaXRlZC4gKi8KLSAgICAgICAgICB1cGJfaGFuZGxlcnMgKnN1YiA9IHVwYl9oYW5kbGVyc19uZXcodXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihmKSwgJnN1Yik7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN1YmhhbmRsZXJzKGgsIGYsIHN1Yik7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3VucmVmKHN1YiwgJnN1Yik7Ci0gICAgICAgIH0KLQotICAgICAgICAvKiBUT0RPKGhhYmVybWFuKTogY2hlY2sgdHlwZSBvZiBzdWJtZXNzYWdlLgotICAgICAgICAgKiBUaGlzIGlzIHNsaWdodGx5IHRyaWNreTsgYWxzbyBjb25zaWRlciB3aGV0aGVyIHdlIHNob3VsZCBjaGVjayB0aGF0Ci0gICAgICAgICAqIHRoZXkgbWF0Y2ggYXQgc2V0c3ViaGFuZGxlcnMgdGltZS4gKi8KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoIXVwYl9yZWZjb3VudGVkX2ZyZWV6ZSgodXBiX3JlZmNvdW50ZWQqY29uc3QqKWhhbmRsZXJzLCBuLCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUEJfTUFYX0hBTkRMRVJfREVQVEgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVwYl9oYW5kbGVydHlwZV90IHVwYl9oYW5kbGVyc19nZXRwcmltaXRpdmVoYW5kbGVydHlwZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShmKSkgewotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9FTlVNOiByZXR1cm4gVVBCX0hBTkRMRVJfSU5UMzI7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDogcmV0dXJuIFVQQl9IQU5ETEVSX0lOVDY0OwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOiByZXR1cm4gVVBCX0hBTkRMRVJfVUlOVDMyOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OiByZXR1cm4gVVBCX0hBTkRMRVJfVUlOVDY0OwotICAgIGNhc2UgVVBCX1RZUEVfRkxPQVQ6IHJldHVybiBVUEJfSEFORExFUl9GTE9BVDsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogcmV0dXJuIFVQQl9IQU5ETEVSX0RPVUJMRTsKLSAgICBjYXNlIFVQQl9UWVBFX0JPT0w6IHJldHVybiBVUEJfSEFORExFUl9CT09MOwotICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IHJldHVybiAtMTsgIC8qIEludmFsaWQgaW5wdXQuICovCi0gIH0KLX0KLQotYm9vbCB1cGJfaGFuZGxlcnNfZ2V0c2VsZWN0b3IoY29uc3QgdXBiX2ZpZWxkZGVmICpmLCB1cGJfaGFuZGxlcnR5cGVfdCB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NlbGVjdG9yX3QgKnMpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBVUEJfSEFORExFUl9JTlQzMjoKLSAgICBjYXNlIFVQQl9IQU5ETEVSX0lOVDY0OgotICAgIGNhc2UgVVBCX0hBTkRMRVJfVUlOVDMyOgotICAgIGNhc2UgVVBCX0hBTkRMRVJfVUlOVDY0OgotICAgIGNhc2UgVVBCX0hBTkRMRVJfRkxPQVQ6Ci0gICAgY2FzZSBVUEJfSEFORExFUl9ET1VCTEU6Ci0gICAgY2FzZSBVUEJfSEFORExFUl9CT09MOgotICAgICAgaWYgKCF1cGJfZmllbGRkZWZfaXNwcmltaXRpdmUoZikgfHwKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfZ2V0cHJpbWl0aXZlaGFuZGxlcnR5cGUoZikgIT0gdHlwZSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfSEFORExFUl9TVFJJTkc6Ci0gICAgICBpZiAodXBiX2ZpZWxkZGVmX2lzc3RyaW5nKGYpKSB7Ci0gICAgICAgICpzID0gZi0+c2VsZWN0b3JfYmFzZTsKLSAgICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhenkoZikpIHsKLSAgICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlICsgMzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0hBTkRMRVJfU1RBUlRTVFI6Ci0gICAgICBpZiAodXBiX2ZpZWxkZGVmX2lzc3RyaW5nKGYpIHx8IHVwYl9maWVsZGRlZl9sYXp5KGYpKSB7Ci0gICAgICAgICpzID0gZi0+c2VsZWN0b3JfYmFzZSArIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9IQU5ETEVSX0VORFNUUjoKLSAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdHJpbmcoZikgfHwgdXBiX2ZpZWxkZGVmX2xhenkoZikpIHsKLSAgICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlICsgMjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0hBTkRMRVJfU1RBUlRTRVE6Ci0gICAgICBpZiAoIXVwYl9maWVsZGRlZl9pc3NlcShmKSkgcmV0dXJuIGZhbHNlOwotICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlIC0gMjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0hBTkRMRVJfRU5EU0VROgotICAgICAgaWYgKCF1cGJfZmllbGRkZWZfaXNzZXEoZikpIHJldHVybiBmYWxzZTsKLSAgICAgICpzID0gZi0+c2VsZWN0b3JfYmFzZSAtIDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHOgotICAgICAgaWYgKCF1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpIHJldHVybiBmYWxzZTsKLSAgICAgIC8qIFNlbGVjdG9ycyBmb3IgU1RBUlRTVUJNU0cgYXJlIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIHRhYmxlIHNvIHRoYXQgdGhlCi0gICAgICAgKiBzZWxlY3RvciBjYW4gYWxzbyBiZSB1c2VkIGFzIGFuIGluZGV4IGludG8gdGhlICJzdWIiIGFycmF5IG9mCi0gICAgICAgKiBzdWJoYW5kbGVycy4gIFRoZSBpbmRleGVzIGZvciB0aGUgdHdvIGludG8gdGhlc2UgdHdvIHRhYmxlcyBhcmUgdGhlCi0gICAgICAgKiBzYW1lLCBleGNlcHQgdGhhdCBpbiB0aGUgaGFuZGxlciB0YWJsZSB0aGUgc3RhdGljIHNlbGVjdG9ycyBjb21lIGZpcnN0LiAqLwotICAgICAgKnMgPSBmLT5pbmRleF8gKyBVUEJfU1RBVElDX1NFTEVDVE9SX0NPVU5UOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfSEFORExFUl9FTkRTVUJNU0c6Ci0gICAgICBpZiAoIXVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgcmV0dXJuIGZhbHNlOwotICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgYXNzZXJ0KChzaXplX3QpKnMgPCB1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZiktPnNlbGVjdG9yX2NvdW50KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVpbnQzMl90IHVwYl9oYW5kbGVyc19zZWxlY3RvcmJhc2VvZmZzZXQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfaXNzZXEoZikgPyAyIDogMDsKLX0KLQotdWludDMyX3QgdXBiX2hhbmRsZXJzX3NlbGVjdG9yY291bnQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHVpbnQzMl90IHJldCA9IDE7Ci0gIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHJldCArPSAyOyAgICAvKiBTVEFSVFNFUS9FTkRTRVEgKi8KLSAgaWYgKHVwYl9maWVsZGRlZl9pc3N0cmluZyhmKSkgcmV0ICs9IDI7IC8qIFtTVFJJTkddL1NUQVJUU1RSL0VORFNUUiAqLwotICBpZiAodXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpKSB7Ci0gICAgLyogRU5EU1VCTVNHIChTVEFSVFNVQk1TRyBpcyBhdCB0YWJsZSBiZWdpbm5pbmcpICovCi0gICAgcmV0ICs9IDA7Ci0gICAgaWYgKHVwYl9maWVsZGRlZl9sYXp5KGYpKSB7Ci0gICAgICAvKiBTVEFSVFNUUi9FTkRTVFIvU1RSSU5HIChmb3IgbGF6eSkgKi8KLSAgICAgIHJldCArPSAzOwotICAgIH0KLSAgfQotICByZXR1cm4gcmV0OwotfQotCi0KLS8qIHVwYl9oYW5kbGVyYXR0ciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgdXBiX2hhbmRsZXJhdHRyX2luaXQodXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIHVwYl9oYW5kbGVyYXR0ciBmcm9tID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICBtZW1jcHkoYXR0ciwgJmZyb20sIHNpemVvZigqYXR0cikpOwotfQotCi12b2lkIHVwYl9oYW5kbGVyYXR0cl91bmluaXQodXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIFVQQl9VTlVTRUQoYXR0cik7Ci19Ci0KLWJvb2wgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKHVwYl9oYW5kbGVyYXR0ciAqYXR0ciwgY29uc3Qgdm9pZCAqaGQpIHsKLSAgYXR0ci0+aGFuZGxlcl9kYXRhXyA9IGhkOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0Y2xvc3VyZXR5cGUodXBiX2hhbmRsZXJhdHRyICphdHRyLCBjb25zdCB2b2lkICp0eXBlKSB7Ci0gIGF0dHItPmNsb3N1cmVfdHlwZV8gPSB0eXBlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3Qgdm9pZCAqdXBiX2hhbmRsZXJhdHRyX2Nsb3N1cmV0eXBlKGNvbnN0IHVwYl9oYW5kbGVyYXR0ciAqYXR0cikgewotICByZXR1cm4gYXR0ci0+Y2xvc3VyZV90eXBlXzsKLX0KLQotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0cmV0dXJuY2xvc3VyZXR5cGUodXBiX2hhbmRsZXJhdHRyICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdHlwZSkgewotICBhdHRyLT5yZXR1cm5fY2xvc3VyZV90eXBlXyA9IHR5cGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCB2b2lkICp1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUoY29uc3QgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIHJldHVybiBhdHRyLT5yZXR1cm5fY2xvc3VyZV90eXBlXzsKLX0KLQotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0YWx3YXlzb2sodXBiX2hhbmRsZXJhdHRyICphdHRyLCBib29sIGFsd2F5c29rKSB7Ci0gIGF0dHItPmFsd2F5c29rXyA9IGFsd2F5c29rOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfaGFuZGxlcmF0dHJfYWx3YXlzb2soY29uc3QgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIHJldHVybiBhdHRyLT5hbHdheXNva187Ci19Ci0KLS8qIHVwYl9idWZoYW5kbGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXNpemVfdCB1cGJfYnVmaGFuZGxlX29iam9mcyhjb25zdCB1cGJfYnVmaGFuZGxlICpoKSB7Ci0gIHJldHVybiBoLT5vYmpvZnNfOwotfQotCi0vKiB1cGJfYnl0ZXNoYW5kbGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHVwYl9ieXRlc2hhbmRsZXJfaW5pdCh1cGJfYnl0ZXNoYW5kbGVyKiBoKSB7Ci0gIG1lbXNldChoLCAwLCBzaXplb2YoKmgpKTsKLX0KLQotLyogRm9yIHdoZW4gd2Ugc3VwcG9ydCBoYW5kbGVyZnJlZSBjYWxsYmFja3MuICovCi12b2lkIHVwYl9ieXRlc2hhbmRsZXJfdW5pbml0KHVwYl9ieXRlc2hhbmRsZXIqIGgpIHsKLSAgVVBCX1VOVVNFRChoKTsKLX0KLQotYm9vbCB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0YXJ0c3RyKHVwYl9ieXRlc2hhbmRsZXIgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXJ0c3RyX2hhbmRsZXJmdW5jICpmdW5jLCB2b2lkICpkKSB7Ci0gIGgtPnRhYmxlW1VQQl9TVEFSVFNUUl9TRUxFQ1RPUl0uZnVuYyA9ICh1cGJfZnVuYyopZnVuYzsKLSAgaC0+dGFibGVbVVBCX1NUQVJUU1RSX1NFTEVDVE9SXS5hdHRyLmhhbmRsZXJfZGF0YV8gPSBkOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0cmluZyh1cGJfYnl0ZXNoYW5kbGVyICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RyaW5nX2hhbmRsZXJmdW5jICpmdW5jLCB2b2lkICpkKSB7Ci0gIGgtPnRhYmxlW1VQQl9TVFJJTkdfU0VMRUNUT1JdLmZ1bmMgPSAodXBiX2Z1bmMqKWZ1bmM7Ci0gIGgtPnRhYmxlW1VQQl9TVFJJTkdfU0VMRUNUT1JdLmF0dHIuaGFuZGxlcl9kYXRhXyA9IGQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9ieXRlc2hhbmRsZXJfc2V0ZW5kc3RyKHVwYl9ieXRlc2hhbmRsZXIgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyAqZnVuYywgdm9pZCAqZCkgewotICBoLT50YWJsZVtVUEJfRU5EU1RSX1NFTEVDVE9SXS5mdW5jID0gKHVwYl9mdW5jKilmdW5jOwotICBoLT50YWJsZVtVUEJfRU5EU1RSX1NFTEVDVE9SXS5hdHRyLmhhbmRsZXJfZGF0YV8gPSBkOwotICByZXR1cm4gdHJ1ZTsKLX0KLS8qCi0qKiB1cGI6OlJlZkNvdW50ZWQgSW1wbGVtZW50YXRpb24KLSoqCi0qKiBPdXIga2V5IGludmFyaWFudHMgYXJlOgotKiogMS4gcmVmZXJlbmNlIGN5Y2xlcyBuZXZlciBzcGFuIGdyb3VwcwotKiogMi4gZm9yIHJlZjIodG8sIGZyb20pLCB3ZSBpbmNyZW1lbnQgdG8ncyBjb3VudCBpZmYgZ3JvdXAoZnJvbSkgIT0gZ3JvdXAodG8pCi0qKgotKiogVGhlIHByZXZpb3VzIHR3byBhcmUgaG93IHdlIGF2b2lkIGxlYWtpbmcgY3ljbGVzLiAgT3RoZXIgaW1wb3J0YW50Ci0qKiBpbnZhcmlhbnRzIGFyZToKLSoqIDMuIGZvciBtdXRhYmxlIG9iamVjdHMgImZyb20iIGFuZCAidG8iLCBpZiB0aGVyZSBleGlzdHMgYSByZWYyKHRvLCBmcm9tKQotKiogICAgdGhpcyBpbXBsaWVzIGdyb3VwKGZyb20pID09IGdyb3VwKHRvKS4gIChJbiBwcmFjdGljZSwgd2hhdCB3ZSBpbXBsZW1lbnQKLSoqICAgIGlzIGV2ZW4gc3Ryb25nZXI7ICJmcm9tIiBhbmQgInRvIiB3aWxsIHNoYXJlIGEgZ3JvdXAgaWYgdGhlcmUgaGFzICpldmVyKgotKiogICAgYmVlbiBhIHJlZjIodG8sIGZyb20pLCBidXQgYWxsIHRoYXQgaXMgbmVjZXNzYXJ5IGZvciBjb3JyZWN0bmVzcyBpcyB0aGUKLSoqICAgIHdlYWtlciBvbmUpLgotKiogNC4gbXV0YWJsZSBhbmQgaW1tdXRhYmxlIG9iamVjdHMgYXJlIG5ldmVyIGluIHRoZSBzYW1lIGdyb3VwLgotKi8KLQotCi0jaW5jbHVkZSA8c2V0am1wLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLXN0YXRpYyB2b2lkIGZyZWVvYmoodXBiX3JlZmNvdW50ZWQgKm8pOwotCi1jb25zdCBjaGFyIHVudHJhY2tlZF92YWw7Ci1jb25zdCB2b2lkICpVUEJfVU5UUkFDS0VEX1JFRiA9ICZ1bnRyYWNrZWRfdmFsOwotCi0vKiBhcmNoLXNwZWNpZmljIGF0b21pYyBwcmltaXRpdmVzICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgVVBCX1RIUkVBRF9VTlNBRkUgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBhdG9taWNfaW5jKHVpbnQzMl90ICphKSB7ICgqYSkrKzsgfQotc3RhdGljIGJvb2wgYXRvbWljX2RlYyh1aW50MzJfdCAqYSkgeyByZXR1cm4gLS0oKmEpID09IDA7IH0KLQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykgfHwgZGVmaW5lZChfX2NsYW5nX18pIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgYXRvbWljX2luYyh1aW50MzJfdCAqYSkgeyBfX3N5bmNfZmV0Y2hfYW5kX2FkZChhLCAxKTsgfQotc3RhdGljIGJvb2wgYXRvbWljX2RlYyh1aW50MzJfdCAqYSkgeyByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2goYSwgMSkgPT0gMDsgfQotCi0jZWxpZiBkZWZpbmVkKFdJTjMyKSAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0jaW5jbHVkZSA8V2luZG93cy5oPgotCi1zdGF0aWMgdm9pZCBhdG9taWNfaW5jKHVwYl9hdG9taWNfdCAqYSkgeyBJbnRlcmxvY2tlZEluY3JlbWVudCgmYS0+dmFsKTsgfQotc3RhdGljIGJvb2wgYXRvbWljX2RlYyh1cGJfYXRvbWljX3QgKmEpIHsKLSAgcmV0dXJuIEludGVybG9ja2VkRGVjcmVtZW50KCZhLT52YWwpID09IDA7Ci19Ci0KLSNlbHNlCi0jZXJyb3IgQXRvbWljIHByaW1pdGl2ZXMgbm90IGRlZmluZWQgZm9yIHlvdXIgcGxhdGZvcm0vQ1BVLiAgXAotICAgICAgIEltcGxlbWVudCB0aGVtIG9yIGNvbXBpbGUgd2l0aCBVUEJfVEhSRUFEX1VOU0FGRS4KLSNlbmRpZgotCi0vKiBBbGwgc3RhdGljIG9iamVjdHMgcG9pbnQgdG8gdGhpcyByZWZjb3VudC4KLSAqIEl0IGlzIHNwZWNpYWwtY2FzZWQgaW4gcmVmL3VucmVmIGJlbG93LiAgKi8KLXVpbnQzMl90IHN0YXRpY19yZWZjb3VudCA9IC0xOwotCi0vKiBXZSBjYW4gYXZvaWQgYXRvbWljIG9wcyBmb3Igc3RhdGljYWxseS1kZWNsYXJlZCBvYmplY3RzLgotICogVGhpcyBpcyBhIG1pbm9yIG9wdGltaXphdGlvbiBidXQgbmljZSBzaW5jZSB3ZSBjYW4gYXZvaWQgZGVncmFkaW5nIHVuZGVyCi0gKiBjb250ZW50aW9uIGluIHRoaXMgY2FzZS4gKi8KLQotc3RhdGljIHZvaWQgcmVmZ3JvdXAodWludDMyX3QgKmdyb3VwKSB7Ci0gIGlmIChncm91cCAhPSAmc3RhdGljX3JlZmNvdW50KQotICAgIGF0b21pY19pbmMoZ3JvdXApOwotfQotCi1zdGF0aWMgYm9vbCB1bnJlZmdyb3VwKHVpbnQzMl90ICpncm91cCkgewotICBpZiAoZ3JvdXAgPT0gJnN0YXRpY19yZWZjb3VudCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gYXRvbWljX2RlYyhncm91cCk7Ci0gIH0KLX0KLQotCi0vKiBSZWZlcmVuY2UgdHJhY2tpbmcgKGRlYnVnIG9ubHkpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgVVBCX0RFQlVHX1JFRlMKLQotI2lmZGVmIFVQQl9USFJFQURfVU5TQUZFCi0KLXN0YXRpYyB2b2lkIHVwYl9sb2NrKCkge30KLXN0YXRpYyB2b2lkIHVwYl91bmxvY2soKSB7fQotCi0jZWxzZQotCi0vKiBVc2VyIG11c3QgZGVmaW5lIGZ1bmN0aW9ucyB0aGF0IGxvY2svdW5sb2NrIGEgZ2xvYmFsIG11dGV4IGFuZCBsaW5rIHRoaXMKLSAqIGZpbGUgYWdhaW5zdCB0aGVtLiAqLwotdm9pZCB1cGJfbG9jaygpOwotdm9pZCB1cGJfdW5sb2NrKCk7Ci0KLSNlbmRpZgotCi0vKiBVUEJfREVCVUdfUkVGUyBtb2RlIGNvdW50cyBvbiBiZWluZyBhYmxlIHRvIG1hbGxvYygpIG1lbW9yeSBpbiBzb21lCi0gKiBjb2RlLXBhdGhzIHRoYXQgY2FuIG5vcm1hbGx5IG5ldmVyIGZhaWwsIGxpa2UgdXBiX3JlZmNvdW50ZWRfcmVmKCkuICBTaW5jZQotICogd2UgaGF2ZSBubyB3YXkgdG8gcHJvcGFnYWdlIG91dC1vZi1tZW1vcnkgZXJyb3JzIGJhY2sgdG8gdGhlIHVzZXIsIGFuZCBzaW5jZQotICogdGhlc2UgZXJyb3JzIGNhbiBvbmx5IG9jY3VyIGluIFVQQl9ERUJVR19SRUZTIG1vZGUsIHdlIGltbWVkaWF0ZWx5IGZhaWwuICovCi0jZGVmaW5lIENIRUNLX09PTShwcmVkaWNhdGUpIGlmICghKHByZWRpY2F0ZSkpIHsgYXNzZXJ0KHByZWRpY2F0ZSk7IGV4aXQoMSk7IH0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgY291bnQ7ICAvKiBIb3cgbWFueSByZWZzIHRoZXJlIGFyZSAoZHVwbGljYXRlcyBvbmx5IGFsbG93ZWQgZm9yIHJlZjIpLiAqLwotICBib29sIGlzX3JlZjI7Ci19IHRyYWNrZWRyZWY7Ci0KLXN0YXRpYyB0cmFja2VkcmVmICp0cmFja2VkcmVmX25ldyhib29sIGlzX3JlZjIpIHsKLSAgdHJhY2tlZHJlZiAqcmV0ID0gbWFsbG9jKHNpemVvZigqcmV0KSk7Ci0gIENIRUNLX09PTShyZXQpOwotICByZXQtPmNvdW50ID0gMTsKLSAgcmV0LT5pc19yZWYyID0gaXNfcmVmMjsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgdHJhY2soY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyLCBib29sIHJlZjIpIHsKLSAgdXBiX3ZhbHVlIHY7Ci0KLSAgYXNzZXJ0KG93bmVyKTsKLSAgaWYgKG93bmVyID09IFVQQl9VTlRSQUNLRURfUkVGKSByZXR1cm47Ci0KLSAgdXBiX2xvY2soKTsKLSAgaWYgKHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoci0+cmVmcywgb3duZXIsICZ2KSkgewotICAgIHRyYWNrZWRyZWYgKnJlZiA9IHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gICAgLyogU2luY2Ugd2UgYWxsb3cgbXVsdGlwbGUgcmVmMidzIGZvciB0aGUgc2FtZSB0by9mcm9tIHBhaXIgd2l0aG91dAotICAgICAqIGFsbG9jYXRpbmcgc2VwYXJhdGUgbWVtb3J5IGZvciBlYWNoIG9uZSwgd2UgbG9zZSB0aGUgZmluZS1ncmFpbmVkCi0gICAgICogdHJhY2tpbmcgYmVoYXZpb3Igd2UgZ2V0IHdpdGggcmVndWxhciByZWZzLiAgU2luY2UgcmVmMnMgb25seSBoYXBwZW4KLSAgICAgKiBpbnNpZGUgdXBiLCB3ZSdsbCBhY2NlcHQgdGhpcyBsaW1pdGF0aW9uIHVudGlsL3VubGVzcyB0aGVyZSBpcyBhIHJlYWxseQotICAgICAqIGRpZmZpY3VsdCB1cGItaW50ZXJuYWwgYnVnIHRoYXQgY2FuJ3QgYmUgZmlndXJlZCBvdXQgd2l0aG91dCBpdC4gKi8KLSAgICBhc3NlcnQocmVmMik7Ci0gICAgYXNzZXJ0KHJlZi0+aXNfcmVmMik7Ci0gICAgcmVmLT5jb3VudCsrOwotICB9IGVsc2UgewotICAgIHRyYWNrZWRyZWYgKnJlZiA9IHRyYWNrZWRyZWZfbmV3KHJlZjIpOwotICAgIGJvb2wgb2sgPSB1cGJfaW50dGFibGVfaW5zZXJ0cHRyKHItPnJlZnMsIG93bmVyLCB1cGJfdmFsdWVfcHRyKHJlZikpOwotICAgIENIRUNLX09PTShvayk7Ci0gICAgaWYgKHJlZjIpIHsKLSAgICAgIC8qIFdlIGtub3cgdGhpcyBjYXN0IGlzIHNhZmUgd2hlbiBpdCBpcyBhIHJlZjIsIGJlY2F1c2UgaXQncyBjb21pbmcgZnJvbQotICAgICAgICogYW5vdGhlciByZWZjb3VudGVkIG9iamVjdC4gKi8KLSAgICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpmcm9tID0gb3duZXI7Ci0gICAgICBhc3NlcnQoIXVwYl9pbnR0YWJsZV9sb29rdXBwdHIoZnJvbS0+cmVmMnMsIHIsIE5VTEwpKTsKLSAgICAgIG9rID0gdXBiX2ludHRhYmxlX2luc2VydHB0cihmcm9tLT5yZWYycywgciwgdXBiX3ZhbHVlX3B0cihOVUxMKSk7Ci0gICAgICBDSEVDS19PT00ob2spOwotICAgIH0KLSAgfQotICB1cGJfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIHVudHJhY2soY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyLCBib29sIHJlZjIpIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIGJvb2wgZm91bmQ7Ci0gIHRyYWNrZWRyZWYgKnJlZjsKLQotICBhc3NlcnQob3duZXIpOwotICBpZiAob3duZXIgPT0gVVBCX1VOVFJBQ0tFRF9SRUYpIHJldHVybjsKLQotICB1cGJfbG9jaygpOwotICBmb3VuZCA9IHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoci0+cmVmcywgb3duZXIsICZ2KTsKLSAgLyogVGhpcyBhc3NlcnQgd2lsbCBmYWlsIGlmIGFuIG93bmVyIGF0dGVtcHRzIHRvIHJlbGVhc2UgYSByZWYgaXQgZGlkbid0IGhhdmUuICovCi0gIFVQQl9BU1NFUlRfVkFSKGZvdW5kLCBmb3VuZCk7Ci0gIHJlZiA9IHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gIGFzc2VydChyZWYtPmlzX3JlZjIgPT0gcmVmMik7Ci0gIGlmICgtLXJlZi0+Y291bnQgPT0gMCkgewotICAgIGZyZWUocmVmKTsKLSAgICB1cGJfaW50dGFibGVfcmVtb3ZlcHRyKHItPnJlZnMsIG93bmVyLCBOVUxMKTsKLSAgICBpZiAocmVmMikgewotICAgICAgLyogV2Uga25vdyB0aGlzIGNhc3QgaXMgc2FmZSB3aGVuIGl0IGlzIGEgcmVmMiwgYmVjYXVzZSBpdCdzIGNvbWluZyBmcm9tCi0gICAgICAgKiBhbm90aGVyIHJlZmNvdW50ZWQgb2JqZWN0LiAqLwotICAgICAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKmZyb20gPSBvd25lcjsKLSAgICAgIGJvb2wgcmVtb3ZlZCA9IHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIoZnJvbS0+cmVmMnMsIHIsIE5VTEwpOwotICAgICAgYXNzZXJ0KHJlbW92ZWQpOwotICAgIH0KLSAgfQotICB1cGJfdW5sb2NrKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrcmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lciwgYm9vbCByZWYyKSB7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIGZvdW5kOwotICB0cmFja2VkcmVmICpyZWY7Ci0KLSAgdXBiX2xvY2soKTsKLSAgZm91bmQgPSB1cGJfaW50dGFibGVfbG9va3VwcHRyKHItPnJlZnMsIG93bmVyLCAmdik7Ci0gIFVQQl9BU1NFUlRfVkFSKGZvdW5kLCBmb3VuZCk7Ci0gIHJlZiA9IHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gIGFzc2VydChyZWYtPmlzX3JlZjIgPT0gcmVmMik7Ci0gIHVwYl91bmxvY2soKTsKLX0KLQotLyogUG9wdWxhdGVzIHRoZSBnaXZlbiBVUEJfQ1RZUEVfSU5UMzIgaW50dGFibGUgd2l0aCBjb3VudHMgb2YgcmVmMidzIHRoYXQKLSAqIG9yaWdpbmF0ZSBmcm9tIHRoZSBnaXZlbiBvd25lci4gKi8KLXN0YXRpYyB2b2lkIGdldHJlZjJzKGNvbnN0IHVwYl9yZWZjb3VudGVkICpvd25lciwgdXBiX2ludHRhYmxlICp0YWIpIHsKLSAgdXBiX2ludHRhYmxlX2l0ZXIgaTsKLQotICB1cGJfbG9jaygpOwotICB1cGJfaW50dGFibGVfYmVnaW4oJmksIG93bmVyLT5yZWYycyk7Ci0gIGZvcig7ICF1cGJfaW50dGFibGVfZG9uZSgmaSk7IHVwYl9pbnR0YWJsZV9uZXh0KCZpKSkgewotICAgIHVwYl92YWx1ZSB2OwotICAgIHVwYl92YWx1ZSBjb3VudDsKLSAgICB0cmFja2VkcmVmICpyZWY7Ci0gICAgYm9vbCBvazsKLSAgICBib29sIGZvdW5kOwotCi0gICAgdXBiX3JlZmNvdW50ZWQgKnRvID0gKHVwYl9yZWZjb3VudGVkKil1cGJfaW50dGFibGVfaXRlcl9rZXkoJmkpOwotCi0gICAgLyogVG8gZ2V0IHRoZSBjb3VudCB3ZSBuZWVkIHRvIGxvb2sgaW4gdGhlIHRhcmdldCdzIHRhYmxlLiAqLwotICAgIGZvdW5kID0gdXBiX2ludHRhYmxlX2xvb2t1cHB0cih0by0+cmVmcywgb3duZXIsICZ2KTsKLSAgICBhc3NlcnQoZm91bmQpOwotICAgIHJlZiA9IHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gICAgY291bnQgPSB1cGJfdmFsdWVfaW50MzIocmVmLT5jb3VudCk7Ci0KLSAgICBvayA9IHVwYl9pbnR0YWJsZV9pbnNlcnRwdHIodGFiLCB0bywgY291bnQpOwotICAgIENIRUNLX09PTShvayk7Ci0gIH0KLSAgdXBiX3VubG9jaygpOwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9pbnR0YWJsZSByZWYyOwotICBjb25zdCB1cGJfcmVmY291bnRlZCAqb2JqOwotfSBjaGVja19zdGF0ZTsKLQotc3RhdGljIHZvaWQgdmlzaXRfY2hlY2soY29uc3QgdXBiX3JlZmNvdW50ZWQgKm9iaiwgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnN1Ym9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgY2hlY2tfc3RhdGUgKnMgPSBjbG9zdXJlOwotICB1cGJfaW50dGFibGUgKnJlZjIgPSAmcy0+cmVmMjsKLSAgdXBiX3ZhbHVlIHY7Ci0gIGJvb2wgcmVtb3ZlZDsKLSAgaW50MzJfdCBuZXdjb3VudDsKLQotICBhc3NlcnQob2JqID09IHMtPm9iaik7Ci0gIGFzc2VydChzdWJvYmopOwotICByZW1vdmVkID0gdXBiX2ludHRhYmxlX3JlbW92ZXB0cihyZWYyLCBzdWJvYmosICZ2KTsKLSAgLyogVGhlIGZvbGxvd2luZyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIHRoZSB2aXNpdCgpIGZ1bmN0aW9uIHZpc2l0cyBhIHN1Ym9iagotICAgKiB0aGF0IGl0IGRpZCBub3QgaGF2ZSBhIHJlZjIgb24sIG9yIHZpc2l0cyB0aGUgc2FtZSBzdWJvYmogdG9vIG1hbnkgdGltZXMuICovCi0gIGFzc2VydChyZW1vdmVkKTsKLSAgbmV3Y291bnQgPSB1cGJfdmFsdWVfZ2V0aW50MzIodikgLSAxOwotICBpZiAobmV3Y291bnQgPiAwKSB7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydChyZWYyLCAodWludHB0cl90KXN1Ym9iaiwgdXBiX3ZhbHVlX2ludDMyKG5ld2NvdW50KSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgdmlzaXQoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkX3Zpc2l0ICp2LAotICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICBib29sIG9rOwotCi0gIC8qIEluIERFQlVHX1JFRlMgbW9kZSB3ZSBrbm93IHdoYXQgZXhpc3RpbmcgcmVmMiByZWZzIHRoZXJlIGFyZSwgc28gd2Uga25vdwotICAgKiBleGFjdGx5IHRoZSBzZXQgb2Ygbm9kZXMgdGhhdCB2aXNpdCgpIHNob3VsZCB2aXNpdC4gIFNvIHdlIHZlcmlmeSB2aXNpdCgpJ3MKLSAgICogY29ycmVjdG5lc3MgaGVyZS4gKi8KLSAgY2hlY2tfc3RhdGUgc3RhdGU7Ci0gIHN0YXRlLm9iaiA9IHI7Ci0gIG9rID0gdXBiX2ludHRhYmxlX2luaXQoJnN0YXRlLnJlZjIsIFVQQl9DVFlQRV9JTlQzMik7Ci0gIENIRUNLX09PTShvayk7Ci0gIGdldHJlZjJzKHIsICZzdGF0ZS5yZWYyKTsKLQotICAvKiBUaGlzIHNob3VsZCB2aXNpdCBhbnkgY2hpbGRyZW4gaW4gdGhlIHJlZjIgdGFibGUuICovCi0gIGlmIChyLT52dGJsLT52aXNpdCkgci0+dnRibC0+dmlzaXQociwgdmlzaXRfY2hlY2ssICZzdGF0ZSk7Ci0KLSAgLyogVGhpcyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIHRoZSB2aXNpdCgpIGZ1bmN0aW9uIG1pc3NlZCBhbnkgY2hpbGRyZW4uICovCi0gIGFzc2VydCh1cGJfaW50dGFibGVfY291bnQoJnN0YXRlLnJlZjIpID09IDApOwotICB1cGJfaW50dGFibGVfdW5pbml0KCZzdGF0ZS5yZWYyKTsKLSAgaWYgKHItPnZ0YmwtPnZpc2l0KSByLT52dGJsLT52aXNpdChyLCB2LCBjbG9zdXJlKTsKLX0KLQotc3RhdGljIGJvb2wgdHJhY2tpbml0KHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHItPnJlZnMgPSBtYWxsb2Moc2l6ZW9mKCpyLT5yZWZzKSk7Ci0gIHItPnJlZjJzID0gbWFsbG9jKHNpemVvZigqci0+cmVmMnMpKTsKLSAgaWYgKCFyLT5yZWZzIHx8ICFyLT5yZWYycykgZ290byBlcnIxOwotCi0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoci0+cmVmcywgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMTsKLSAgaWYgKCF1cGJfaW50dGFibGVfaW5pdChyLT5yZWYycywgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMjsKLSAgcmV0dXJuIHRydWU7Ci0KLWVycjI6Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoci0+cmVmcyk7Ci1lcnIxOgotICBmcmVlKHItPnJlZnMpOwotICBmcmVlKHItPnJlZjJzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCB0cmFja2ZyZWUoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdChyLT5yZWZzKTsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdChyLT5yZWYycyk7Ci0gIGZyZWUoci0+cmVmcyk7Ci0gIGZyZWUoci0+cmVmMnMpOwotfQotCi0jZWxzZQotCi1zdGF0aWMgdm9pZCB0cmFjayhjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIsIGJvb2wgcmVmMikgewotICBVUEJfVU5VU0VEKHIpOwotICBVUEJfVU5VU0VEKG93bmVyKTsKLSAgVVBCX1VOVVNFRChyZWYyKTsKLX0KLQotc3RhdGljIHZvaWQgdW50cmFjayhjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIsIGJvb2wgcmVmMikgewotICBVUEJfVU5VU0VEKHIpOwotICBVUEJfVU5VU0VEKG93bmVyKTsKLSAgVVBCX1VOVVNFRChyZWYyKTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tyZWYoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyLCBib29sIHJlZjIpIHsKLSAgVVBCX1VOVVNFRChyKTsKLSAgVVBCX1VOVVNFRChvd25lcik7Ci0gIFVQQl9VTlVTRUQocmVmMik7Ci19Ci0KLXN0YXRpYyBib29sIHRyYWNraW5pdCh1cGJfcmVmY291bnRlZCAqcikgewotICBVUEJfVU5VU0VEKHIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgdHJhY2tmcmVlKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIFVQQl9VTlVTRUQocik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpc2l0KGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZF92aXNpdCAqdiwKLSAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgaWYgKHItPnZ0YmwtPnZpc2l0KSByLT52dGJsLT52aXNpdChyLCB2LCBjbG9zdXJlKTsKLX0KLQotI2VuZGlmICAvKiBVUEJfREVCVUdfUkVGUyAqLwotCi0KLS8qIGZyZWV6ZSgpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBmcmVlemUoKSBvcGVyYXRpb24gaXMgYnkgZmFyIHRoZSBtb3N0IGNvbXBsaWNhdGVkIHBhcnQgb2YgdGhpcyBzY2hlbWUuCi0gKiBXZSBjb21wdXRlIHN0cm9uZ2x5LWNvbm5lY3RlZCBjb21wb25lbnRzIGFuZCB0aGVuIG11dGF0ZSB0aGUgZ3JhcGggc3VjaCB0aGF0Ci0gKiB3ZSBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50cyBkb2N1bWVudGVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLiAgQW5kIHdlIG11c3QKLSAqIGhhbmRsZSBvdXQtb2YtbWVtb3J5IGVycm9ycyBncmFjZWZ1bGx5ICh3aXRob3V0IGxlYXZpbmcgdGhlIGdyYXBoCi0gKiBpbmNvbnNpc3RlbnQpLCB3aGljaCBhZGRzIHRvIHRoZSBmdW4uICovCi0KLS8qIFRoZSBzdGF0ZSB1c2VkIGJ5IHRoZSBmcmVlemUgb3BlcmF0aW9uIChzaGFyZWQgYWNyb3NzIG1hbnkgZnVuY3Rpb25zKS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGRlcHRoOwotICBpbnQgbWF4ZGVwdGg7Ci0gIHVpbnQ2NF90IGluZGV4OwotICAvKiBNYXBzIHVwYl9yZWZjb3VudGVkKiAtPiBhdHRyaWJ1dGVzIChjb2xvciwgZXRjKS4gIGF0dHIgbGF5b3V0IHZhcmllcyBieQotICAgKiBjb2xvci4gKi8KLSAgdXBiX2ludHRhYmxlIG9iamF0dHI7Ci0gIHVwYl9pbnR0YWJsZSBzdGFjazsgICAvKiBzdGFjayBvZiB1cGJfcmVmY291bnRlZCogZm9yIFRhcmphbidzIGFsZ29yaXRobS4gKi8KLSAgdXBiX2ludHRhYmxlIGdyb3VwczsgIC8qIGFycmF5IG9mIHVpbnQzMl90KiwgbWFsbG9jJ2QgcmVmY291bnRzIGZvciBuZXcgZ3JvdXBzICovCi0gIHVwYl9zdGF0dXMgKnN0YXR1czsKLSAgam1wX2J1ZiBlcnI7Ci19IHRhcmphbjsKLQotc3RhdGljIHZvaWQgcmVsZWFzZV9yZWYyKGNvbnN0IHVwYl9yZWZjb3VudGVkICpvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnN1Ym9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKTsKLQotLyogTm9kZSBhdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQWZ0ZXIgb3VyIGFuYWx5c2lzIHBoYXNlIGFsbCBub2RlcyB3aWxsIGJlIGVpdGhlciBHUkFZIG9yIFdISVRFLiAqLwotCi10eXBlZGVmIGVudW0gewotICBCTEFDSyA9IDAsICAvKiBPYmplY3QgaGFzIG5vdCBiZWVuIHNlZW4uICovCi0gIEdSQVksICAgLyogT2JqZWN0IGhhcyBiZWVuIGZvdW5kIHZpYSBhIHJlZmdyb3VwIGJ1dCBtYXkgbm90IGJlIHJlYWNoYWJsZS4gKi8KLSAgR1JFRU4sICAvKiBPYmplY3QgaXMgcmVhY2hhYmxlIGFuZCBpcyBjdXJyZW50bHkgb24gdGhlIFRhcmphbiBzdGFjay4gKi8KLSAgV0hJVEUgICAvKiBPYmplY3QgaXMgcmVhY2hhYmxlIGFuZCBoYXMgYmVlbiBhc3NpZ25lZCBhIGdyb3VwIChTQ0MpLiAqLwotfSBjb2xvcl90OwotCi1VUEJfTk9SRVRVUk4gc3RhdGljIHZvaWQgZXJyKHRhcmphbiAqdCkgeyBsb25nam1wKHQtPmVyciwgMSk7IH0KLVVQQl9OT1JFVFVSTiBzdGF0aWMgdm9pZCBvb20odGFyamFuICp0KSB7Ci0gIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHQtPnN0YXR1cywgIm91dCBvZiBtZW1vcnkiKTsKLSAgZXJyKHQpOwotfQotCi1zdGF0aWMgdWludDY0X3QgdHJ5Z2V0YXR0cihjb25zdCB0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHVwYl92YWx1ZSB2OwotICByZXR1cm4gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmdC0+b2JqYXR0ciwgciwgJnYpID8KLSAgICAgIHVwYl92YWx1ZV9nZXR1aW50NjQodikgOiAwOwotfQotCi1zdGF0aWMgdWludDY0X3QgZ2V0YXR0cihjb25zdCB0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIGZvdW5kID0gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmdC0+b2JqYXR0ciwgciwgJnYpOwotICBVUEJfQVNTRVJUX1ZBUihmb3VuZCwgZm91bmQpOwotICByZXR1cm4gdXBiX3ZhbHVlX2dldHVpbnQ2NCh2KTsKLX0KLQotc3RhdGljIHZvaWQgc2V0YXR0cih0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1aW50NjRfdCBhdHRyKSB7Ci0gIHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIoJnQtPm9iamF0dHIsIHIsIE5VTEwpOwotICB1cGJfaW50dGFibGVfaW5zZXJ0cHRyKCZ0LT5vYmphdHRyLCByLCB1cGJfdmFsdWVfdWludDY0KGF0dHIpKTsKLX0KLQotc3RhdGljIGNvbG9yX3QgY29sb3IodGFyamFuICp0LCBjb25zdCB1cGJfcmVmY291bnRlZCAqcikgewotICByZXR1cm4gdHJ5Z2V0YXR0cih0LCByKSAmIDB4MzsgIC8qIENvbG9yIGlzIGFsd2F5cyBzdG9yZWQgaW4gdGhlIGxvdyAyIGJpdHMuICovCi19Ci0KLXN0YXRpYyB2b2lkIHNldF9ncmF5KHRhcmphbiAqdCwgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IEJMQUNLKTsKLSAgc2V0YXR0cih0LCByLCBHUkFZKTsKLX0KLQotLyogUHVzaGVzIGFuIG9iaiBvbnRvIHRoZSBUYXJqYW4gc3RhY2sgYW5kIHNldHMgaXQgdG8gR1JFRU4uICovCi1zdGF0aWMgdm9pZCBwdXNoKHRhcmphbiAqdCwgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IEJMQUNLIHx8IGNvbG9yKHQsIHIpID09IEdSQVkpOwotICAvKiBUaGlzIGRlZmluZXMgdGhlIGF0dHIgbGF5b3V0IGZvciB0aGUgR1JFRU4gc3RhdGUuICAiaW5kZXgiIGFuZCAibG93bGluayIKLSAgICogZ2V0IDMxIGJpdHMsIHdoaWNoIGlzIHBsZW50eSAobGltaXQgb2YgMkIgb2JqZWN0cyBmcm96ZW4gYXQgYSB0aW1lKS4gKi8KLSAgc2V0YXR0cih0LCByLCBHUkVFTiB8ICh0LT5pbmRleCA8PCAyKSB8ICh0LT5pbmRleCA8PCAzMykpOwotICBpZiAoKyt0LT5pbmRleCA9PSAweDgwMDAwMDAwKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2codC0+c3RhdHVzLCAidG9vIG1hbnkgb2JqZWN0cyB0byBmcmVlemUiKTsKLSAgICBlcnIodCk7Ci0gIH0KLSAgdXBiX2ludHRhYmxlX3B1c2goJnQtPnN0YWNrLCB1cGJfdmFsdWVfcHRyKCh2b2lkKilyKSk7Ci19Ci0KLS8qIFBvcHMgYW4gb2JqIGZyb20gdGhlIFRhcmphbiBzdGFjayBhbmQgc2V0cyBpdCB0byBXSElURSwgd2l0aCBhIHB0ciB0byBpdHMKLSAqIFNDQyBncm91cC4gKi8KLXN0YXRpYyB1cGJfcmVmY291bnRlZCAqcG9wKHRhcmphbiAqdCkgewotICB1cGJfcmVmY291bnRlZCAqciA9IHVwYl92YWx1ZV9nZXRwdHIodXBiX2ludHRhYmxlX3BvcCgmdC0+c3RhY2spKTsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IEdSRUVOKTsKLSAgLyogVGhpcyBkZWZpbmVzIHRoZSBhdHRyIGxheW91dCBmb3Igbm9kZXMgaW4gdGhlIFdISVRFIHN0YXRlLgotICAgKiBUb3Agb2YgZ3JvdXAgc3RhY2sgaXMgW2dyb3VwLCBOVUxMXTsgd2UgcG9pbnQgYXQgZ3JvdXAuICovCi0gIHNldGF0dHIodCwgciwgV0hJVEUgfCAodXBiX2ludHRhYmxlX2NvdW50KCZ0LT5ncm91cHMpIC0gMikgPDwgOCk7Ci0gIHJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCB0YXJqYW5fbmV3Z3JvdXAodGFyamFuICp0KSB7Ci0gIHVpbnQzMl90ICpncm91cCA9IG1hbGxvYyhzaXplb2YoKmdyb3VwKSk7Ci0gIGlmICghZ3JvdXApIG9vbSh0KTsKLSAgLyogUHVzaCBncm91cCBhbmQgZW1wdHkgZ3JvdXAgbGVhZGVyICh3ZSdsbCBmaWxsIGluIGxlYWRlciBsYXRlcikuICovCi0gIGlmICghdXBiX2ludHRhYmxlX3B1c2goJnQtPmdyb3VwcywgdXBiX3ZhbHVlX3B0cihncm91cCkpIHx8Ci0gICAgICAhdXBiX2ludHRhYmxlX3B1c2goJnQtPmdyb3VwcywgdXBiX3ZhbHVlX3B0cihOVUxMKSkpIHsKLSAgICBmcmVlKGdyb3VwKTsKLSAgICBvb20odCk7Ci0gIH0KLSAgKmdyb3VwID0gMDsKLX0KLQotc3RhdGljIHVpbnQzMl90IGlkeCh0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIGFzc2VydChjb2xvcih0LCByKSA9PSBHUkVFTik7Ci0gIHJldHVybiAoZ2V0YXR0cih0LCByKSA+PiAyKSAmIDB4N0ZGRkZGRkY7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBsb3dsaW5rKHRhcmphbiAqdCwgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgaWYgKGNvbG9yKHQsIHIpID09IEdSRUVOKSB7Ci0gICAgcmV0dXJuIGdldGF0dHIodCwgcikgPj4gMzM7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFVJTlQzMl9NQVg7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgc2V0X2xvd2xpbmsodGFyamFuICp0LCBjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdWludDMyX3QgbG93bGluaykgewotICBhc3NlcnQoY29sb3IodCwgcikgPT0gR1JFRU4pOwotICBzZXRhdHRyKHQsIHIsICgodWludDY0X3QpbG93bGluayA8PCAzMykgfCAoZ2V0YXR0cih0LCByKSAmIDB4MUZGRkZGRkZGKSk7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCAqZ3JvdXAodGFyamFuICp0LCB1cGJfcmVmY291bnRlZCAqcikgewotICB1aW50NjRfdCBncm91cG51bTsKLSAgdXBiX3ZhbHVlIHY7Ci0gIGJvb2wgZm91bmQ7Ci0KLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IFdISVRFKTsKLSAgZ3JvdXBudW0gPSBnZXRhdHRyKHQsIHIpID4+IDg7Ci0gIGZvdW5kID0gdXBiX2ludHRhYmxlX2xvb2t1cCgmdC0+Z3JvdXBzLCBncm91cG51bSwgJnYpOwotICBVUEJfQVNTRVJUX1ZBUihmb3VuZCwgZm91bmQpOwotICByZXR1cm4gdXBiX3ZhbHVlX2dldHB0cih2KTsKLX0KLQotLyogSWYgdGhlIGdyb3VwIGxlYWRlciBmb3IgdGhpcyBvYmplY3QncyBncm91cCBoYXMgbm90IHByZXZpb3VzbHkgYmVlbiBzZXQsCi0gKiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGFzc2lnbmVkIHRvIGJlIGl0cyBsZWFkZXIuICovCi1zdGF0aWMgdXBiX3JlZmNvdW50ZWQgKmdyb3VwbGVhZGVyKHRhcmphbiAqdCwgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgdWludDY0X3QgbGVhZGVyX3Nsb3Q7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIGZvdW5kOwotCi0gIGFzc2VydChjb2xvcih0LCByKSA9PSBXSElURSk7Ci0gIGxlYWRlcl9zbG90ID0gKGdldGF0dHIodCwgcikgPj4gOCkgKyAxOwotICBmb3VuZCA9IHVwYl9pbnR0YWJsZV9sb29rdXAoJnQtPmdyb3VwcywgbGVhZGVyX3Nsb3QsICZ2KTsKLSAgVVBCX0FTU0VSVF9WQVIoZm91bmQsIGZvdW5kKTsKLSAgaWYgKHVwYl92YWx1ZV9nZXRwdHIodikpIHsKLSAgICByZXR1cm4gdXBiX3ZhbHVlX2dldHB0cih2KTsKLSAgfSBlbHNlIHsKLSAgICB1cGJfaW50dGFibGVfcmVtb3ZlKCZ0LT5ncm91cHMsIGxlYWRlcl9zbG90LCBOVUxMKTsKLSAgICB1cGJfaW50dGFibGVfaW5zZXJ0KCZ0LT5ncm91cHMsIGxlYWRlcl9zbG90LCB1cGJfdmFsdWVfcHRyKHIpKTsKLSAgICByZXR1cm4gcjsKLSAgfQotfQotCi0KLS8qIFRhcmphbidzIGFsZ29yaXRobSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLS8qIFNlZToKLSAqICAgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9UYXJqYW4lMjdzX3N0cm9uZ2x5X2Nvbm5lY3RlZF9jb21wb25lbnRzX2FsZ29yaXRobSAqLwotc3RhdGljIHZvaWQgZG9fdGFyamFuKGNvbnN0IHVwYl9yZWZjb3VudGVkICpvYmosIHRhcmphbiAqdCk7Ci0KLXN0YXRpYyB2b2lkIHRhcmphbl92aXNpdChjb25zdCB1cGJfcmVmY291bnRlZCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICB0YXJqYW4gKnQgPSBjbG9zdXJlOwotICBpZiAoKyt0LT5kZXB0aCA+IHQtPm1heGRlcHRoKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKHQtPnN0YXR1cywgImdyYXBoIHRvbyBkZWVwIHRvIGZyZWV6ZSAoJWQpIiwgdC0+bWF4ZGVwdGgpOwotICAgIGVycih0KTsKLSAgfSBlbHNlIGlmIChzdWJvYmotPmlzX2Zyb3plbiB8fCBjb2xvcih0LCBzdWJvYmopID09IFdISVRFKSB7Ci0gICAgLyogRG8gbm90aGluZzogd2UgZG9uJ3Qgd2FudCB0byB2aXNpdCBvciBjb2xvciBhbHJlYWR5LWZyb3plbiBub2RlcywKLSAgICAgKiBhbmQgV0hJVEUgbm9kZXMgaGF2ZSBhbHJlYWR5IGJlZW4gYXNzaWduZWQgYSBTQ0MuICovCi0gIH0gZWxzZSBpZiAoY29sb3IodCwgc3Vib2JqKSA8IEdSRUVOKSB7Ci0gICAgLyogU3ViZGVmIGhhcyBub3QgeWV0IGJlZW4gdmlzaXRlZDsgcmVjdXJzZSBvbiBpdC4gKi8KLSAgICBkb190YXJqYW4oc3Vib2JqLCB0KTsKLSAgICBzZXRfbG93bGluayh0LCBvYmosIFVQQl9NSU4obG93bGluayh0LCBvYmopLCBsb3dsaW5rKHQsIHN1Ym9iaikpKTsKLSAgfSBlbHNlIGlmIChjb2xvcih0LCBzdWJvYmopID09IEdSRUVOKSB7Ci0gICAgLyogU3ViZGVmIGlzIGluIHRoZSBzdGFjayBhbmQgaGVuY2UgaW4gdGhlIGN1cnJlbnQgU0NDLiAqLwotICAgIHNldF9sb3dsaW5rKHQsIG9iaiwgVVBCX01JTihsb3dsaW5rKHQsIG9iaiksIGlkeCh0LCBzdWJvYmopKSk7Ci0gIH0KLSAgLS10LT5kZXB0aDsKLX0KLQotc3RhdGljIHZvaWQgZG9fdGFyamFuKGNvbnN0IHVwYl9yZWZjb3VudGVkICpvYmosIHRhcmphbiAqdCkgewotICBpZiAoY29sb3IodCwgb2JqKSA9PSBCTEFDSykgewotICAgIC8qIFdlIGhhdmVuJ3Qgc2VlbiB0aGlzIG9iamVjdCdzIGdyb3VwOyBtYXJrIHRoZSB3aG9sZSBncm91cCBHUkFZLiAqLwotICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpvID0gb2JqOwotICAgIGRvIHsgc2V0X2dyYXkodCwgbyk7IH0gd2hpbGUgKChvID0gby0+bmV4dCkgIT0gb2JqKTsKLSAgfQotCi0gIHB1c2godCwgb2JqKTsKLSAgdmlzaXQob2JqLCB0YXJqYW5fdmlzaXQsIHQpOwotICBpZiAobG93bGluayh0LCBvYmopID09IGlkeCh0LCBvYmopKSB7Ci0gICAgdGFyamFuX25ld2dyb3VwKHQpOwotICAgIHdoaWxlIChwb3AodCkgIT0gb2JqKQotICAgICAgOwotICB9Ci19Ci0KLQotLyogZnJlZXplKCkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotc3RhdGljIHZvaWQgY3Jvc3NyZWYoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICB2b2lkICpfdCkgewotICB0YXJqYW4gKnQgPSBfdDsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID4gQkxBQ0spOwotICBpZiAoY29sb3IodCwgc3Vib2JqKSA+IEJMQUNLICYmIHItPmdyb3VwICE9IHN1Ym9iai0+Z3JvdXApIHsKLSAgICAvKiBQcmV2aW91c2x5IHRoaXMgcmVmIHdhcyBub3QgcmVmbGVjdGVkIGluIHN1Ym9iai0+Z3JvdXAgYmVjYXVzZSB0aGV5Ci0gICAgICogd2VyZSBpbiB0aGUgc2FtZSBncm91cDsgbm93IHRoYXQgdGhleSBhcmUgc3BsaXQgYSByZWYgbXVzdCBiZSB0YWtlbi4gKi8KLSAgICByZWZncm91cChzdWJvYmotPmdyb3VwKTsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBmcmVlemUodXBiX3JlZmNvdW50ZWQgKmNvbnN0KnJvb3RzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcywKLSAgICAgICAgICAgICAgICAgICBpbnQgbWF4ZGVwdGgpIHsKLSAgdm9sYXRpbGUgYm9vbCByZXQgPSBmYWxzZTsKLSAgaW50IGk7Ci0gIHVwYl9pbnR0YWJsZV9pdGVyIGl0ZXI7Ci0KLSAgLyogV2UgcnVuIGluIHR3byBwYXNzZXMgc28gdGhhdCB3ZSBjYW4gYWxsb2NhdGUgYWxsIG1lbW9yeSBiZWZvcmUgcGVyZm9ybWluZwotICAgKiBhbnkgbXV0YXRpb24gb2YgdGhlIGlucHV0IC0tIHRoaXMgYWxsb3dzIHVzIHRvIGxlYXZlIHRoZSBpbnB1dCB1bmNoYW5nZWQKLSAgICogaW4gdGhlIGNhc2Ugb2YgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZS4gKi8KLSAgdGFyamFuIHQ7Ci0gIHQuaW5kZXggPSAwOwotICB0LmRlcHRoID0gMDsKLSAgdC5tYXhkZXB0aCA9IG1heGRlcHRoOwotICB0LnN0YXR1cyA9IHM7Ci0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoJnQub2JqYXR0ciwgVVBCX0NUWVBFX1VJTlQ2NCkpIGdvdG8gZXJyMTsKLSAgaWYgKCF1cGJfaW50dGFibGVfaW5pdCgmdC5zdGFjaywgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMjsKLSAgaWYgKCF1cGJfaW50dGFibGVfaW5pdCgmdC5ncm91cHMsIFVQQl9DVFlQRV9QVFIpKSBnb3RvIGVycjM7Ci0gIGlmIChzZXRqbXAodC5lcnIpICE9IDApIGdvdG8gZXJyNDsKLQotCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICBpZiAoY29sb3IoJnQsIHJvb3RzW2ldKSA8IEdSRUVOKSB7Ci0gICAgICBkb190YXJqYW4ocm9vdHNbaV0sICZ0KTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiB3ZSd2ZSBtYWRlIGl0IHRoaXMgZmFyLCBubyBmdXJ0aGVyIGVycm9ycyBhcmUgcG9zc2libGUgc28gaXQncyBzYWZlIHRvCi0gICAqIG11dGF0ZSB0aGUgb2JqZWN0cyB3aXRob3V0IHJpc2sgb2YgbGVhdmluZyB0aGVtIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZS4gKi8KLSAgcmV0ID0gdHJ1ZTsKLQotICAvKiBUaGUgdHJhbnNmb3JtYXRpb24gdGhhdCBmb2xsb3dzIHJlcXVpcmVzIGNhcmUuICBUaGUgcHJlY29uZGl0aW9ucyBhcmU6Ci0gICAqIC0gYWxsIG9iamVjdHMgaW4gYXR0ciBtYXAgYXJlIFdISVRFIG9yIEdSQVksIGFuZCBhcmUgaW4gbXV0YWJsZSBncm91cHMKLSAgICogICAoZ3JvdXBzIG9mIGFsbCBtdXRhYmxlIG9ianMpCi0gICAqIC0gbm8gcmVmMih0bywgZnJvbSkgcmVmcyBoYXZlIGluY3JlbWVudGVkIGNvdW50KHRvKSBpZiBib3RoICJ0byIgYW5kCi0gICAqICAgImZyb20iIGFyZSBpbiBvdXIgYXR0ciBtYXAgKHRoaXMgZm9sbG93cyBmcm9tIGludmFyaWFudHMgKDIpIGFuZCAoMykpICovCi0KLSAgLyogUGFzcyAxOiB3ZSByZW1vdmUgV0hJVEUgb2JqZWN0cyBmcm9tIHRoZWlyIG11dGFibGUgZ3JvdXBzLCBhbmQgYWRkIHRoZW0gdG8KLSAgICogbmV3IGdyb3VwcyAgYWNjb3JkaW5nIHRvIHRoZSBTQ0MncyB3ZSBjb21wdXRlZC4gIFRoZXNlIG5ldyBncm91cHMgd2lsbAotICAgKiBjb25zaXN0IG9mIG9ubHkgZnJvemVuIG9iamVjdHMuICBOb25lIHdpbGwgYmUgaW1tZWRpYXRlbHkgY29sbGVjdGlibGUsCi0gICAqIGJlY2F1c2UgV0hJVEUgb2JqZWN0cyBhcmUgYnkgZGVmaW5pdGlvbiByZWFjaGFibGUgZnJvbSBvbmUgb2YgInJvb3RzIiwKLSAgICogd2hpY2ggdGhlIGNhbGxlciBtdXN0IG93biByZWZzIG9uLiAqLwotICB1cGJfaW50dGFibGVfYmVnaW4oJml0ZXIsICZ0Lm9iamF0dHIpOwotICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJml0ZXIpOyB1cGJfaW50dGFibGVfbmV4dCgmaXRlcikpIHsKLSAgICB1cGJfcmVmY291bnRlZCAqb2JqID0gKHVwYl9yZWZjb3VudGVkKil1cGJfaW50dGFibGVfaXRlcl9rZXkoJml0ZXIpOwotICAgIC8qIFNpbmNlIHJlbW92YWwgZnJvbSBhIHNpbmdseS1saW5rZWQgbGlzdCByZXF1aXJlcyBhY2Nlc3MgdG8gdGhlIG9iamVjdCdzCi0gICAgICogcHJlZGVjZXNzb3IsIHdlIGNvbnNpZGVyIG9iai0+bmV4dCBpbnN0ZWFkIG9mIG9iaiBmb3IgbW92aW5nLiAgV2l0aCB0aGUKLSAgICAgKiB3aGlsZSgpIGxvb3Agd2UgZ3VhcmFudGVlIHRoYXQgd2Ugd2lsbCB2aXNpdCBldmVyeSBub2RlJ3MgcHJlZGVjZXNzb3IuCi0gICAgICogUHJvb2Y6Ci0gICAgICogIDEuIGV2ZXJ5IG5vZGUncyBwcmVkZWNlc3NvciBpcyBpbiBvdXIgYXR0ciBtYXAuCi0gICAgICogIDIuIHRob3VnaCB0aGUgbG9vcCBib2R5IG1heSBjaGFuZ2UgYSBub2RlJ3MgcHJlZGVjZXNzb3IsIGl0IHdpbGwgb25seQotICAgICAqICAgICBjaGFuZ2UgaXQgdG8gYmUgdGhlIG5vZGUgd2UgYXJlIGN1cnJlbnRseSBvcGVyYXRpbmcgb24sIHNvIHdpdGggYQotICAgICAqICAgICB3aGlsZSgpIGxvb3Agd2UgZ3VhcmFudGVlIG91cnNlbHZlcyB0aGUgY2hhbmNlIHRvIHJlbW92ZSBlYWNoIG5vZGUuICovCi0gICAgd2hpbGUgKGNvbG9yKCZ0LCBvYmotPm5leHQpID09IFdISVRFICYmCi0gICAgICAgICAgIGdyb3VwKCZ0LCBvYmotPm5leHQpICE9IG9iai0+bmV4dC0+Z3JvdXApIHsKLSAgICAgIHVwYl9yZWZjb3VudGVkICpsZWFkZXI7Ci0KLSAgICAgIC8qIFJlbW92ZSBmcm9tIG9sZCBncm91cC4gKi8KLSAgICAgIHVwYl9yZWZjb3VudGVkICptb3ZlID0gb2JqLT5uZXh0OwotICAgICAgaWYgKG9iaiA9PSBtb3ZlKSB7Ci0gICAgICAgIC8qIFJlbW92aW5nIHRoZSBsYXN0IG9iamVjdCBmcm9tIGEgZ3JvdXAuICovCi0gICAgICAgIGFzc2VydCgqb2JqLT5ncm91cCA9PSBvYmotPmluZGl2aWR1YWxfY291bnQpOwotICAgICAgICBmcmVlKG9iai0+Z3JvdXApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2JqLT5uZXh0ID0gbW92ZS0+bmV4dDsKLSAgICAgICAgLyogVGhpcyBtYXkgZGVjcmVhc2UgdG8gemVybzsgd2UnbGwgY29sbGVjdCBHUkFZIG9iamVjdHMgKGlmIGFueSkgdGhhdAotICAgICAgICAgKiByZW1haW4gaW4gdGhlIGdyb3VwIGluIHRoZSB0aGlyZCBwYXNzLiAqLwotICAgICAgICBhc3NlcnQoKm1vdmUtPmdyb3VwID49IG1vdmUtPmluZGl2aWR1YWxfY291bnQpOwotICAgICAgICAqbW92ZS0+Z3JvdXAgLT0gbW92ZS0+aW5kaXZpZHVhbF9jb3VudDsKLSAgICAgIH0KLQotICAgICAgLyogQWRkIHRvIG5ldyBncm91cC4gKi8KLSAgICAgIGxlYWRlciA9IGdyb3VwbGVhZGVyKCZ0LCBtb3ZlKTsKLSAgICAgIGlmIChtb3ZlID09IGxlYWRlcikgewotICAgICAgICAvKiBGaXJzdCBvYmplY3QgYWRkZWQgdG8gbmV3IGdyb3VwIGlzIGl0cyBsZWFkZXIuICovCi0gICAgICAgIG1vdmUtPmdyb3VwID0gZ3JvdXAoJnQsIG1vdmUpOwotICAgICAgICBtb3ZlLT5uZXh0ID0gbW92ZTsKLSAgICAgICAgKm1vdmUtPmdyb3VwID0gbW92ZS0+aW5kaXZpZHVhbF9jb3VudDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIEdyb3VwIGFscmVhZHkgaGFzIGF0IGxlYXN0IG9uZSBvYmplY3QgaW4gaXQuICovCi0gICAgICAgIGFzc2VydChsZWFkZXItPmdyb3VwID09IGdyb3VwKCZ0LCBtb3ZlKSk7Ci0gICAgICAgIG1vdmUtPmdyb3VwID0gZ3JvdXAoJnQsIG1vdmUpOwotICAgICAgICBtb3ZlLT5uZXh0ID0gbGVhZGVyLT5uZXh0OwotICAgICAgICBsZWFkZXItPm5leHQgPSBtb3ZlOwotICAgICAgICAqbW92ZS0+Z3JvdXAgKz0gbW92ZS0+aW5kaXZpZHVhbF9jb3VudDsKLSAgICAgIH0KLQotICAgICAgbW92ZS0+aXNfZnJvemVuID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKiBQYXNzIDI6IEdSQVkgYW5kIFdISVRFIG9iamVjdHMgIm9iaiIgd2l0aCByZWYyKHRvLCBvYmopIHJlZmVyZW5jZXMgbXVzdAotICAgKiBpbmNyZW1lbnQgY291bnQodG8pIGlmIGdyb3VwKG9iaikgIT0gZ3JvdXAodG8pICh3aGljaCBjb3VsZCBub3cgYmUgdGhlCi0gICAqIGNhc2UgaWYgInRvIiB3YXMganVzdCBmcm96ZW4pLiAqLwotICB1cGJfaW50dGFibGVfYmVnaW4oJml0ZXIsICZ0Lm9iamF0dHIpOwotICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJml0ZXIpOyB1cGJfaW50dGFibGVfbmV4dCgmaXRlcikpIHsKLSAgICB1cGJfcmVmY291bnRlZCAqb2JqID0gKHVwYl9yZWZjb3VudGVkKil1cGJfaW50dGFibGVfaXRlcl9rZXkoJml0ZXIpOwotICAgIHZpc2l0KG9iaiwgY3Jvc3NyZWYsICZ0KTsKLSAgfQotCi0gIC8qIFBhc3MgMzogR1JBWSBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgaWYgdGhlaXIgZ3JvdXAncyByZWZjb3VudCBkcm9wcGVkIHRvCi0gICAqIHplcm8gd2hlbiB3ZSByZW1vdmVkIGl0cyB3aGl0ZSBub2Rlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGV5IGhhZCBvbmx5Ci0gICAqIGJlZW4ga2VwdCBhbGl2ZSBieSB2aXJ0dWUgb2Ygc2hhcmluZyBhIGdyb3VwIHdpdGggYW4gb2JqZWN0IHRoYXQgd2FzIGp1c3QKLSAgICogZnJvemVuLgotICAgKgotICAgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBkbyB0aGlzIGxhc3QsIHNpbmNlIHRoZSBHUkFZIG9iamVjdCdzIGZyZWUoKQotICAgKiBmdW5jdGlvbiBjb3VsZCBjYWxsIHVucmVmMigpIG9uIGp1c3QtZnJvemVuIG9iamVjdHMsIHdoaWNoIHdpbGwgZGVjcmVtZW50Ci0gICAqIHJlZnMgdGhhdCB3ZXJlIGFkZGVkIGluIHBhc3MgMi4gKi8KLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpdGVyLCAmdC5vYmphdHRyKTsKLSAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpdGVyKTsgdXBiX2ludHRhYmxlX25leHQoJml0ZXIpKSB7Ci0gICAgdXBiX3JlZmNvdW50ZWQgKm9iaiA9ICh1cGJfcmVmY291bnRlZCopdXBiX2ludHRhYmxlX2l0ZXJfa2V5KCZpdGVyKTsKLSAgICBpZiAob2JqLT5ncm91cCA9PSBOVUxMIHx8ICpvYmotPmdyb3VwID09IDApIHsKLSAgICAgIGlmIChvYmotPmdyb3VwKSB7Ci0gICAgICAgIHVwYl9yZWZjb3VudGVkICpvOwotCi0gICAgICAgIC8qIFdlIGVhZ2VybHkgZnJlZSgpIHRoZSBncm91cCdzIGNvdW50IChzaW5jZSB3ZSBjYW4ndCBlYXNpbHkgZGV0ZXJtaW5lCi0gICAgICAgICAqIHRoZSBncm91cCdzIHJlbWFpbmluZyBzaXplIGl0J3MgdGhlIGVhc2llc3Qgd2F5IHRvIGVuc3VyZSBpdCBnZXRzCi0gICAgICAgICAqIGRvbmUpLiAqLwotICAgICAgICBmcmVlKG9iai0+Z3JvdXApOwotCi0gICAgICAgIC8qIFZpc2l0IHRvIHJlbGVhc2UgcmVmMidzIChkb25lIGluIGEgc2VwYXJhdGUgcGFzcyBzaW5jZSByZWxlYXNlX3JlZjIKLSAgICAgICAgICogZGVwZW5kcyBvbiBvLT5ncm91cCBiZWluZyB1bm1vZGlmaWVkIHNvIGl0IGNhbiB0ZXN0IG1lcmdlZCgpKS4gKi8KLSAgICAgICAgbyA9IG9iajsKLSAgICAgICAgZG8geyB2aXNpdChvLCByZWxlYXNlX3JlZjIsIE5VTEwpOyB9IHdoaWxlICgobyA9IG8tPm5leHQpICE9IG9iaik7Ci0KLSAgICAgICAgLyogTWFyayAiZ3JvdXAiIGZpZWxkcyBhcyBOVUxMIHNvIHdlIGtub3cgdG8gZnJlZSB0aGUgb2JqZWN0cyBsYXRlciBpbgotICAgICAgICAgKiB0aGlzIGxvb3AsIGJ1dCBhbHNvIGRvbid0IHRyeSB0byBkZWxldGUgdGhlIGdyb3VwIHR3aWNlLiAqLwotICAgICAgICBvID0gb2JqOwotICAgICAgICBkbyB7IG8tPmdyb3VwID0gTlVMTDsgfSB3aGlsZSAoKG8gPSBvLT5uZXh0KSAhPSBvYmopOwotICAgICAgfQotICAgICAgZnJlZW9iaihvYmopOwotICAgIH0KLSAgfQotCi1lcnI0OgotICBpZiAoIXJldCkgewotICAgIHVwYl9pbnR0YWJsZV9iZWdpbigmaXRlciwgJnQuZ3JvdXBzKTsKLSAgICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJml0ZXIpOyB1cGJfaW50dGFibGVfbmV4dCgmaXRlcikpCi0gICAgICBmcmVlKHVwYl92YWx1ZV9nZXRwdHIodXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJml0ZXIpKSk7Ci0gIH0KLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmdC5ncm91cHMpOwotZXJyMzoKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmdC5zdGFjayk7Ci1lcnIyOgotICB1cGJfaW50dGFibGVfdW5pbml0KCZ0Lm9iamF0dHIpOwotZXJyMToKLSAgcmV0dXJuIHJldDsKLX0KLQotCi0vKiBNaXNjIGludGVybmFsIGZ1bmN0aW9ucyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYm9vbCBtZXJnZWQoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyMikgewotICByZXR1cm4gci0+Z3JvdXAgPT0gcjItPmdyb3VwOwotfQotCi1zdGF0aWMgdm9pZCBtZXJnZSh1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWQgKmZyb20pIHsKLSAgdXBiX3JlZmNvdW50ZWQgKmJhc2U7Ci0gIHVwYl9yZWZjb3VudGVkICp0bXA7Ci0KLSAgaWYgKG1lcmdlZChyLCBmcm9tKSkgcmV0dXJuOwotICAqci0+Z3JvdXAgKz0gKmZyb20tPmdyb3VwOwotICBmcmVlKGZyb20tPmdyb3VwKTsKLSAgYmFzZSA9IGZyb207Ci0KLSAgLyogU2V0IGFsbCByZWZjb3VudCBwb2ludGVycyBpbiB0aGUgImZyb20iIGNoYWluIHRvIHRoZSBtZXJnZWQgcmVmY291bnQuCi0gICAqCi0gICAqIFRPRE8oaGFiZXJtYW4pOiB0aGlzIGxpbmVhciBhbGdvcml0aG0gY2FuIHJlc3VsdCBpbiBhbiBvdmVyYWxsIE8obl4yKSBib3VuZAotICAgKiBpZiB0aGUgdXNlciBjb250aW51b3VzbHkgZXh0ZW5kcyBhIGdyb3VwIGJ5IG9uZSBvYmplY3QuICBQcmV2ZW50IHRoaXMgYnkKLSAgICogdXNpbmcgb25lIG9mIHRoZSB0ZWNobmlxdWVzIGluIHRoaXMgcGFwZXI6Ci0gICAqICAgICBmdHA6Ly93d3cubmNlZGMub3JnL291dGdvaW5nL2dlb21vcnBoL2Rpbm8vb3JhbHMvcDI0NS10YXJqYW4ucGRmICovCi0gIGRvIHsgZnJvbS0+Z3JvdXAgPSByLT5ncm91cDsgfSB3aGlsZSAoKGZyb20gPSBmcm9tLT5uZXh0KSAhPSBiYXNlKTsKLQotICAvKiBNZXJnZSB0aGUgdHdvIGNpcmN1bGFybHkgbGlua2VkIGxpc3RzIGJ5IHN3YXBwaW5nIHRoZWlyIG5leHQgcG9pbnRlcnMuICovCi0gIHRtcCA9IHItPm5leHQ7Ci0gIHItPm5leHQgPSBiYXNlLT5uZXh0OwotICBiYXNlLT5uZXh0ID0gdG1wOwotfQotCi1zdGF0aWMgdm9pZCB1bnJlZihjb25zdCB1cGJfcmVmY291bnRlZCAqcik7Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfcmVmMihjb25zdCB1cGJfcmVmY291bnRlZCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICBVUEJfVU5VU0VEKGNsb3N1cmUpOwotICB1bnRyYWNrKHN1Ym9iaiwgb2JqLCB0cnVlKTsKLSAgaWYgKCFtZXJnZWQob2JqLCBzdWJvYmopKSB7Ci0gICAgYXNzZXJ0KHN1Ym9iai0+aXNfZnJvemVuKTsKLSAgICB1bnJlZihzdWJvYmopOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHVucmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIGlmICh1bnJlZmdyb3VwKHItPmdyb3VwKSkgewotICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpvOwotCi0gICAgZnJlZShyLT5ncm91cCk7Ci0KLSAgICAvKiBJbiB0d28gcGFzc2VzLCBzaW5jZSByZWxlYXNlX3JlZjIgbmVlZHMgYSBndWFyYW50ZWUgdGhhdCBhbnkgc3Vib2JqcwotICAgICAqIGFyZSBhbGl2ZS4gKi8KLSAgICBvID0gcjsKLSAgICBkbyB7IHZpc2l0KG8sIHJlbGVhc2VfcmVmMiwgTlVMTCk7IH0gd2hpbGUoKG8gPSBvLT5uZXh0KSAhPSByKTsKLQotICAgIG8gPSByOwotICAgIGRvIHsKLSAgICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpuZXh0ID0gby0+bmV4dDsKLSAgICAgIGFzc2VydChvLT5pc19mcm96ZW4gfHwgby0+aW5kaXZpZHVhbF9jb3VudCA9PSAwKTsKLSAgICAgIGZyZWVvYmooKHVwYl9yZWZjb3VudGVkKilvKTsKLSAgICAgIG8gPSBuZXh0OwotICAgIH0gd2hpbGUobyAhPSByKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBmcmVlb2JqKHVwYl9yZWZjb3VudGVkICpvKSB7Ci0gIHRyYWNrZnJlZShvKTsKLSAgby0+dnRibC0+ZnJlZSgodXBiX3JlZmNvdW50ZWQqKW8pOwotfQotCi0KLS8qIFB1YmxpYyBpbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgdXBiX3JlZmNvdW50ZWRfaW5pdCh1cGJfcmVmY291bnRlZCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCAqdnRibCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcikgewotI2lmbmRlZiBOREVCVUcKLSAgLyogRW5kaWFubmVzcyBjaGVjay4gIFRoaXMgaXMgdW5yZWxhdGVkIHRvIHVwYl9yZWZjb3VudGVkLCBpdCdzIGp1c3QgYQotICAgKiBjb252ZW5pZW50IHBsYWNlIHRvIHB1dCB0aGUgY2hlY2sgdGhhdCB3ZSBjYW4gYmUgYXNzdXJlZCB3aWxsIHJ1biBmb3IKLSAgICogYmFzaWNhbGx5IGV2ZXJ5IHByb2dyYW0gdXNpbmcgdXBiLiAqLwotICBjb25zdCBpbnQgeCA9IDE7Ci0jaWZkZWYgVVBCX0JJR19FTkRJQU4KLSAgYXNzZXJ0KCooY2hhciopJnggIT0gMSk7Ci0jZWxzZQotICBhc3NlcnQoKihjaGFyKikmeCA9PSAxKTsKLSNlbmRpZgotI2VuZGlmCi0KLSAgci0+bmV4dCA9IHI7Ci0gIHItPnZ0YmwgPSB2dGJsOwotICByLT5pbmRpdmlkdWFsX2NvdW50ID0gMDsKLSAgci0+aXNfZnJvemVuID0gZmFsc2U7Ci0gIHItPmdyb3VwID0gbWFsbG9jKHNpemVvZigqci0+Z3JvdXApKTsKLSAgaWYgKCFyLT5ncm91cCkgcmV0dXJuIGZhbHNlOwotICAqci0+Z3JvdXAgPSAwOwotICBpZiAoIXRyYWNraW5pdChyKSkgewotICAgIGZyZWUoci0+Z3JvdXApOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1cGJfcmVmY291bnRlZF9yZWYociwgb3duZXIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfcmVmY291bnRlZF9pc2Zyb3plbihjb25zdCB1cGJfcmVmY291bnRlZCAqcikgewotICByZXR1cm4gci0+aXNfZnJvemVuOwotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3JlZihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgdHJhY2sociwgb3duZXIsIGZhbHNlKTsKLSAgaWYgKCFyLT5pc19mcm96ZW4pCi0gICAgKCh1cGJfcmVmY291bnRlZCopciktPmluZGl2aWR1YWxfY291bnQrKzsKLSAgcmVmZ3JvdXAoci0+Z3JvdXApOwotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3VucmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lcikgewotICB1bnRyYWNrKHIsIG93bmVyLCBmYWxzZSk7Ci0gIGlmICghci0+aXNfZnJvemVuKQotICAgICgodXBiX3JlZmNvdW50ZWQqKXIpLT5pbmRpdmlkdWFsX2NvdW50LS07Ci0gIHVucmVmKHIpOwotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3JlZjIoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkICpmcm9tKSB7Ci0gIGFzc2VydCghZnJvbS0+aXNfZnJvemVuKTsgIC8qIE5vbi1jb25zdCBwb2ludGVyIGltcGxpZXMgdGhpcy4gKi8KLSAgdHJhY2sociwgZnJvbSwgdHJ1ZSk7Ci0gIGlmIChyLT5pc19mcm96ZW4pIHsKLSAgICByZWZncm91cChyLT5ncm91cCk7Ci0gIH0gZWxzZSB7Ci0gICAgbWVyZ2UoKHVwYl9yZWZjb3VudGVkKilyLCBmcm9tKTsKLSAgfQotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3VucmVmMihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWQgKmZyb20pIHsKLSAgYXNzZXJ0KCFmcm9tLT5pc19mcm96ZW4pOyAgLyogTm9uLWNvbnN0IHBvaW50ZXIgaW1wbGllcyB0aGlzLiAqLwotICB1bnRyYWNrKHIsIGZyb20sIHRydWUpOwotICBpZiAoci0+aXNfZnJvemVuKSB7Ci0gICAgdW5yZWYocik7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KG1lcmdlZChyLCBmcm9tKSk7Ci0gIH0KLX0KLQotdm9pZCB1cGJfcmVmY291bnRlZF9kb25hdGVyZWYoCi0gICAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvKSB7Ci0gIGFzc2VydChmcm9tICE9IHRvKTsKLSAgaWYgKHRvICE9IE5VTEwpCi0gICAgdXBiX3JlZmNvdW50ZWRfcmVmKHIsIHRvKTsKLSAgaWYgKGZyb20gIT0gTlVMTCkKLSAgICB1cGJfcmVmY291bnRlZF91bnJlZihyLCBmcm9tKTsKLX0KLQotdm9pZCB1cGJfcmVmY291bnRlZF9jaGVja3JlZihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgY2hlY2tyZWYociwgb3duZXIsIGZhbHNlKTsKLX0KLQotYm9vbCB1cGJfcmVmY291bnRlZF9mcmVlemUodXBiX3JlZmNvdW50ZWQgKmNvbnN0KnJvb3RzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhkZXB0aCkgewotICBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIGFzc2VydCghcm9vdHNbaV0tPmlzX2Zyb3plbik7Ci0gIH0KLSAgcmV0dXJuIGZyZWV6ZShyb290cywgbiwgcywgbWF4ZGVwdGgpOwotfQotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLQotLyogRmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaWYgdGhlIHNoaW0gaXMgbm90IHNwZWNpYWxpemVkIGJ5IHRoZSBKSVQuICovCi0jZGVmaW5lIFNISU1fV1JJVEVSKHR5cGUsIGN0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJvb2wgdXBiX3NoaW1fc2V0ICMjIHR5cGUgKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCBjdHlwZSB2YWwpIHsgICAgICAgICAgICBcCi0gICAgdWludDhfdCAqbSA9IGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdXBiX3NoaW1fZGF0YSAqZCA9IGhkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGQtPmhhc2JpdCA+IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAqKHVpbnQ4X3QqKSZtW2QtPmhhc2JpdCAvIDhdIHw9IDEgPDwgKGQtPmhhc2JpdCAlIDgpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgKihjdHlwZSopJm1bZC0+b2Zmc2V0XSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLVNISU1fV1JJVEVSKGRvdWJsZSwgZG91YmxlKQotU0hJTV9XUklURVIoZmxvYXQsICBmbG9hdCkKLVNISU1fV1JJVEVSKGludDMyLCAgaW50MzJfdCkKLVNISU1fV1JJVEVSKGludDY0LCAgaW50NjRfdCkKLVNISU1fV1JJVEVSKHVpbnQzMiwgdWludDMyX3QpCi1TSElNX1dSSVRFUih1aW50NjQsIHVpbnQ2NF90KQotU0hJTV9XUklURVIoYm9vbCwgICBib29sKQotI3VuZGVmIFNISU1fV1JJVEVSCi0KLWJvb2wgdXBiX3NoaW1fc2V0KHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBzaXplX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYXNiaXQpIHsKLSAgdXBiX2hhbmRsZXJhdHRyIGF0dHIgPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0gIGJvb2wgb2s7Ci0KLSAgdXBiX3NoaW1fZGF0YSAqZCA9IG1hbGxvYyhzaXplb2YoKmQpKTsKLSAgaWYgKCFkKSByZXR1cm4gZmFsc2U7Ci0gIGQtPm9mZnNldCA9IG9mZnNldDsKLSAgZC0+aGFzYml0ID0gaGFzYml0OwotCi0gIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmYXR0ciwgZCk7Ci0gIHVwYl9oYW5kbGVyYXR0cl9zZXRhbHdheXNvaygmYXR0ciwgdHJ1ZSk7Ci0gIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKGgsIGQsIGZyZWUpOwotCi0jZGVmaW5lIFRZUEUodSwgbCkgXAotICBjYXNlIFVQQl9UWVBFXyMjdTogXAotICAgIG9rID0gdXBiX2hhbmRsZXJzX3NldCMjbChoLCBmLCB1cGJfc2hpbV9zZXQjI2wsICZhdHRyKTsgYnJlYWs7Ci0KLSAgb2sgPSBmYWxzZTsKLQotICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKGYpKSB7Ci0gICAgVFlQRShJTlQ2NCwgIGludDY0KTsKLSAgICBUWVBFKElOVDMyLCAgaW50MzIpOwotICAgIFRZUEUoRU5VTSwgICBpbnQzMik7Ci0gICAgVFlQRShVSU5UNjQsIHVpbnQ2NCk7Ci0gICAgVFlQRShVSU5UMzIsIHVpbnQzMik7Ci0gICAgVFlQRShET1VCTEUsIGRvdWJsZSk7Ci0gICAgVFlQRShGTE9BVCwgIGZsb2F0KTsKLSAgICBUWVBFKEJPT0wsICAgYm9vbCk7Ci0gICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlKTsgYnJlYWs7Ci0gIH0KLSN1bmRlZiBUWVBFCi0KLSAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmYXR0cik7Ci0gIHJldHVybiBvazsKLX0KLQotY29uc3QgdXBiX3NoaW1fZGF0YSAqdXBiX3NoaW1fZ2V0ZGF0YShjb25zdCB1cGJfaGFuZGxlcnMgKmgsIHVwYl9zZWxlY3Rvcl90IHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZHR5cGVfdCAqdHlwZSkgewotICB1cGJfZnVuYyAqZiA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKGgsIHMpOwotCi0gIGlmICgodXBiX2ludDY0X2hhbmRsZXJmdW5jKilmID09IHVwYl9zaGltX3NldGludDY0KSB7Ci0gICAgKnR5cGUgPSBVUEJfVFlQRV9JTlQ2NDsKLSAgfSBlbHNlIGlmICgodXBiX2ludDMyX2hhbmRsZXJmdW5jKilmID09IHVwYl9zaGltX3NldGludDMyKSB7Ci0gICAgKnR5cGUgPSBVUEJfVFlQRV9JTlQzMjsKLSAgfSBlbHNlIGlmICgodXBiX3VpbnQ2NF9oYW5kbGVyZnVuYyopZiA9PSB1cGJfc2hpbV9zZXR1aW50NjQpIHsKLSAgICAqdHlwZSA9IFVQQl9UWVBFX1VJTlQ2NDsKLSAgfSBlbHNlIGlmICgodXBiX3VpbnQzMl9oYW5kbGVyZnVuYyopZiA9PSB1cGJfc2hpbV9zZXR1aW50MzIpIHsKLSAgICAqdHlwZSA9IFVQQl9UWVBFX1VJTlQzMjsKLSAgfSBlbHNlIGlmICgodXBiX2RvdWJsZV9oYW5kbGVyZnVuYyopZiA9PSB1cGJfc2hpbV9zZXRkb3VibGUpIHsKLSAgICAqdHlwZSA9IFVQQl9UWVBFX0RPVUJMRTsKLSAgfSBlbHNlIGlmICgodXBiX2Zsb2F0X2hhbmRsZXJmdW5jKilmID09IHVwYl9zaGltX3NldGZsb2F0KSB7Ci0gICAgKnR5cGUgPSBVUEJfVFlQRV9GTE9BVDsKLSAgfSBlbHNlIGlmICgodXBiX2Jvb2xfaGFuZGxlcmZ1bmMqKWYgPT0gdXBiX3NoaW1fc2V0Ym9vbCkgewotICAgICp0eXBlID0gVVBCX1RZUEVfQk9PTDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiAoY29uc3QgdXBiX3NoaW1fZGF0YSopdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKGgsIHMpOwotfQotCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotc3RhdGljIHZvaWQgdXBiX3N5bXRhYl9mcmVlKHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHVwYl9zeW10YWIgKnMgPSAodXBiX3N5bXRhYiopcjsKLSAgdXBiX3N0cnRhYmxlX2l0ZXIgaTsKLSAgdXBiX3N0cnRhYmxlX2JlZ2luKCZpLCAmcy0+c3ltdGFiKTsKLSAgZm9yICg7ICF1cGJfc3RydGFibGVfZG9uZSgmaSk7IHVwYl9zdHJ0YWJsZV9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9kZWYgKmRlZiA9IHVwYl92YWx1ZV9nZXRwdHIodXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoJmkpKTsKLSAgICB1cGJfZGVmX3VucmVmKGRlZiwgcyk7Ci0gIH0KLSAgdXBiX3N0cnRhYmxlX3VuaW5pdCgmcy0+c3ltdGFiKTsKLSAgZnJlZShzKTsKLX0KLQotCi11cGJfc3ltdGFiICp1cGJfc3ltdGFiX25ldyhjb25zdCB2b2lkICpvd25lcikgewotICBzdGF0aWMgY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdnRibCA9IHtOVUxMLCAmdXBiX3N5bXRhYl9mcmVlfTsKLSAgdXBiX3N5bXRhYiAqcyA9IG1hbGxvYyhzaXplb2YoKnMpKTsKLSAgdXBiX3JlZmNvdW50ZWRfaW5pdCh1cGJfc3ltdGFiX3VwY2FzdF9tdXRhYmxlKHMpLCAmdnRibCwgb3duZXIpOwotICB1cGJfc3RydGFibGVfaW5pdCgmcy0+c3ltdGFiLCBVUEJfQ1RZUEVfUFRSKTsKLSAgcmV0dXJuIHM7Ci19Ci0KLXZvaWQgdXBiX3N5bXRhYl9mcmVlemUodXBiX3N5bXRhYiAqcykgewotICB1cGJfcmVmY291bnRlZCAqcjsKLSAgYm9vbCBvazsKLQotICBhc3NlcnQoIXVwYl9zeW10YWJfaXNmcm96ZW4ocykpOwotICByID0gdXBiX3N5bXRhYl91cGNhc3RfbXV0YWJsZShzKTsKLSAgLyogVGhlIHN5bXRhYiBkb2VzIG5vdCB0YWtlIHJlZjIncyAoc2VlIHJlZmNvdW50ZWQuaCkgb24gdGhlIGRlZnMsIGJlY2F1c2UKLSAgICogZGVmcyBjYW5ub3QgcmVmZXIgYmFjayB0byB0aGUgdGFibGUgYW5kIHRoZXJlZm9yZSBjYW5ub3QgY3JlYXRlIGN5Y2xlcy4gIFNvCi0gICAqIDAgd2lsbCBzdWZmaWNlIGZvciBtYXhkZXB0aCBoZXJlLiAqLwotICBvayA9IHVwYl9yZWZjb3VudGVkX2ZyZWV6ZSgmciwgMSwgTlVMTCwgMCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci19Ci0KLWNvbnN0IHVwYl9kZWYgKnVwYl9zeW10YWJfbG9va3VwKGNvbnN0IHVwYl9zeW10YWIgKnMsIGNvbnN0IGNoYXIgKnN5bSkgewotICB1cGJfdmFsdWUgdjsKLSAgdXBiX2RlZiAqcmV0ID0gdXBiX3N0cnRhYmxlX2xvb2t1cCgmcy0+c3ltdGFiLCBzeW0sICZ2KSA/Ci0gICAgICB1cGJfdmFsdWVfZ2V0cHRyKHYpIDogTlVMTDsKLSAgcmV0dXJuIHJldDsKLX0KLQotY29uc3QgdXBiX21zZ2RlZiAqdXBiX3N5bXRhYl9sb29rdXBtc2coY29uc3QgdXBiX3N5bXRhYiAqcywgY29uc3QgY2hhciAqc3ltKSB7Ci0gIHVwYl92YWx1ZSB2OwotICB1cGJfZGVmICpkZWYgPSB1cGJfc3RydGFibGVfbG9va3VwKCZzLT5zeW10YWIsIHN5bSwgJnYpID8KLSAgICAgIHVwYl92YWx1ZV9nZXRwdHIodikgOiBOVUxMOwotICByZXR1cm4gZGVmID8gdXBiX2R5bmNhc3RfbXNnZGVmKGRlZikgOiBOVUxMOwotfQotCi1jb25zdCB1cGJfZW51bWRlZiAqdXBiX3N5bXRhYl9sb29rdXBlbnVtKGNvbnN0IHVwYl9zeW10YWIgKnMsIGNvbnN0IGNoYXIgKnN5bSkgewotICB1cGJfdmFsdWUgdjsKLSAgdXBiX2RlZiAqZGVmID0gdXBiX3N0cnRhYmxlX2xvb2t1cCgmcy0+c3ltdGFiLCBzeW0sICZ2KSA/Ci0gICAgICB1cGJfdmFsdWVfZ2V0cHRyKHYpIDogTlVMTDsKLSAgcmV0dXJuIGRlZiA/IHVwYl9keW5jYXN0X2VudW1kZWYoZGVmKSA6IE5VTEw7Ci19Ci0KLS8qIEdpdmVuIGEgc3ltYm9sIGFuZCB0aGUgYmFzZSBzeW1ib2wgaW5zaWRlIHdoaWNoIGl0IGlzIGRlZmluZWQsIGZpbmQgdGhlCi0gKiBzeW1ib2wncyBkZWZpbml0aW9uIGluIHQuICovCi1zdGF0aWMgdXBiX2RlZiAqdXBiX3Jlc29sdmVuYW1lKGNvbnN0IHVwYl9zdHJ0YWJsZSAqdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqc3ltKSB7Ci0gIGlmKHN0cmxlbihzeW0pID09IDApIHJldHVybiBOVUxMOwotICBpZihzeW1bMF0gPT0gJy4nKSB7Ci0gICAgLyogU3ltYm9scyBzdGFydGluZyB3aXRoICcuJyBhcmUgYWJzb2x1dGUsIHNvIHdlIGRvIGEgc2luZ2xlIGxvb2t1cC4KLSAgICAgKiBTbGljZSB0byBvbWl0IHRoZSBsZWFkaW5nICcuJyAqLwotICAgIHVwYl92YWx1ZSB2OwotICAgIHJldHVybiB1cGJfc3RydGFibGVfbG9va3VwKHQsIHN5bSArIDEsICZ2KSA/IHVwYl92YWx1ZV9nZXRwdHIodikgOiBOVUxMOwotICB9IGVsc2UgewotICAgIC8qIFJlbW92ZSBjb21wb25lbnRzIGZyb20gYmFzZSB1bnRpbCB3ZSBmaW5kIGFuIGVudHJ5IG9yIHJ1biBvdXQuCi0gICAgICogVE9ETzogVGhpcyBicmFuY2ggaXMgdG90YWxseSBicm9rZW4sIGJ1dCBjdXJyZW50bHkgbm90IHVzZWQuICovCi0gICAgKHZvaWQpYmFzZTsKLSAgICBhc3NlcnQoZmFsc2UpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLWNvbnN0IHVwYl9kZWYgKnVwYl9zeW10YWJfcmVzb2x2ZShjb25zdCB1cGJfc3ltdGFiICpzLCBjb25zdCBjaGFyICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN5bSkgewotICB1cGJfZGVmICpyZXQgPSB1cGJfcmVzb2x2ZW5hbWUoJnMtPnN5bXRhYiwgYmFzZSwgc3ltKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogU3RhcnRzIGEgZGVwdGgtZmlyc3QgdHJhdmVyc2FsIGF0ICJkZWYiLCByZWN1cnNpbmcgaW50byBhbnkgc3ViZGVmcwotICogKGllLiBzdWJtZXNzYWdlIHR5cGVzKS4gIEFkZHMgZHVwbGljYXRlcyBvZiBleGlzdGluZyBkZWZzIHRvIGFkZHRhYgotICogd2hlcmV2ZXIgbmVjZXNzYXJ5LCBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc3ltdGFiIHdpbGwgYmUgY29uc2lzdGVudCBvbmNlCi0gKiBhZGR0YWIgaXMgYWRkZWQuCi0gKgotICogTW9yZSBzcGVjaWZpY2FsbHksIGlmIGFueSBkZWYgRCBpcyBmb3VuZCBpbiB0aGUgREZTIHRoYXQ6Ci0gKgotICogICAxLiBjYW4gcmVhY2ggYSBkZWYgdGhhdCBpcyBiZWluZyByZXBsYWNlZCBieSBzb21ldGhpbmcgaW4gYWRkdGFiLCBBTkQKLSAqCi0gKiAgIDIuIGlzIG5vdCBpdHNlbGYgYmVpbmcgcmVwbGFjZWQgYWxyZWFkeSAoaWUuIHRoaXMgbmFtZSBkb2Vzbid0IGFscmVhZHkKLSAqICAgICAgZXhpc3QgaW4gYWRkdGFiKQotICoKLSAqIC4uLnRoZW4gYSBkdXBsaWNhdGUgKG5ldyBjb3B5KSBvZiBEIHdpbGwgYmUgYWRkZWQgdG8gYWRkdGFiLgotICoKLSAqIFJldHVybnMgdHJ1ZSBpZiB0aGlzIGhhcHBlbmVkIGZvciBhbnkgZGVmIHJlYWNoYWJsZSBmcm9tICJkZWYuIgotICoKLSAqIEl0IGlzIHNsaWdodGx5IHRyaWNreSB0byBkbyB0aGlzIGNvcnJlY3RseSBpbiB0aGUgcHJlc2VuY2Ugb2YgY3ljbGVzLiAgSWYgd2UKLSAqIGRldGVjdCB0aGF0IG91ciBERlMgaGFzIGhpdCBhIGN5Y2xlLCB3ZSBtaWdodCBub3QgeWV0IGtub3cgaWYgYW55IFNDQ3Mgb24KLSAqIG91ciBzdGFjayBjYW4gcmVhY2ggYSBkZWYgaW4gYWRkdGFiIG9yIG5vdC4gIE9uY2Ugd2UgZmlndXJlIHRoaXMgb3V0LCB0aGF0Ci0gKiBhbnN3ZXIgbmVlZHMgdG8gYXBwbHkgdG8gKmFsbCogZGVmcyBpbiB0aGVzZSBTQ0NzLCBldmVuIGlmIHdlIHZpc2l0ZWQgdGhlbQotICogYWxyZWFkeS4gIFNvIGEgc3RyYWlnaHQgdXAgb25lLXBhc3MgY3ljbGUtZGV0ZWN0aW5nIERGUyB3b24ndCB3b3JrLgotICoKLSAqIFRvIHdvcmsgYXJvdW5kIHRoaXMgcHJvYmxlbSwgd2UgdHJhdmVyc2UgZWFjaCBTQ0MgKHdoaWNoIHdlIGFscmVhZHkKLSAqIGNvbXB1dGVkLCBzaW5jZSB0aGVzZSBkZWZzIGFyZSBmcm96ZW4pIGFzIGEgc2luZ2xlIG5vZGUuICBXZSBmaXJzdCBjb21wdXRlCi0gKiB3aGV0aGVyIHRoZSBTQ0MgYXMgYSB3aG9sZSBjYW4gcmVhY2ggYW55IGRlZiBpbiBhZGR0YWIsIHRoZW4gd2UgZHVwIChvciBub3QpCi0gKiB0aGUgZW50aXJlIFNDQy4gIFRoaXMgcmVxdWlyZXMgYnJlYWtpbmcgdGhlIGVuY2Fwc3VsYXRpb24gb2YgdXBiX3JlZmNvdW50ZWQsCi0gKiBzaW5jZSB0aGF0IGlzIHdoZXJlIHdlIGdldCB0aGUgZGF0YSBhYm91dCB3aGF0IFNDQyB3ZSBhcmUgaW4uICovCi1zdGF0aWMgYm9vbCB1cGJfcmVzb2x2ZV9kZnMoY29uc3QgdXBiX2RlZiAqZGVmLCB1cGJfc3RydGFibGUgKmFkZHRhYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpuZXdfb3duZXIsIHVwYl9pbnR0YWJsZSAqc2VlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIG5lZWRfZHVwOwotICBjb25zdCB1cGJfZGVmICpiYXNlOwotICBjb25zdCB2b2lkKiBtZW1vaXplX2tleTsKLQotICAvKiBNZW1vaXplIHJlc3VsdHMgb2YgdGhpcyBmdW5jdGlvbiBmb3IgZWZmaWNpZW5jeSAoc2luY2Ugd2UncmUgdHJhdmVyc2luZyBhCi0gICAqIERBRyB0aGlzIGlzIG5vdCBuZWVkZWQgdG8gbGltaXQgdGhlIGRlcHRoIG9mIHRoZSBzZWFyY2gpLgotICAgKgotICAgKiBXZSBtZW1vaXplIGJ5IFNDQyBpbnN0ZWFkIG9mIGJ5IGluZGl2aWR1YWwgZGVmLiAqLwotICBtZW1vaXplX2tleSA9IGRlZi0+YmFzZS5ncm91cDsKLQotICBpZiAodXBiX2ludHRhYmxlX2xvb2t1cHB0cihzZWVuLCBtZW1vaXplX2tleSwgJnYpKQotICAgIHJldHVybiB1cGJfdmFsdWVfZ2V0Ym9vbCh2KTsKLQotICAvKiBWaXNpdCBzdWJtZXNzYWdlcyBmb3IgYWxsIG1lc3NhZ2VzIGluIHRoZSBTQ0MuICovCi0gIG5lZWRfZHVwID0gZmFsc2U7Ci0gIGJhc2UgPSBkZWY7Ci0gIGRvIHsKLSAgICB1cGJfdmFsdWUgdjsKLSAgICBjb25zdCB1cGJfbXNnZGVmICptOwotCi0gICAgYXNzZXJ0KHVwYl9kZWZfaXNmcm96ZW4oZGVmKSk7Ci0gICAgaWYgKGRlZi0+dHlwZSA9PSBVUEJfREVGX0ZJRUxEKSBjb250aW51ZTsKLSAgICBpZiAodXBiX3N0cnRhYmxlX2xvb2t1cChhZGR0YWIsIHVwYl9kZWZfZnVsbG5hbWUoZGVmKSwgJnYpKSB7Ci0gICAgICBuZWVkX2R1cCA9IHRydWU7Ci0gICAgfQotCi0gICAgLyogRm9yIG1lc3NhZ2VzLCBjb250aW51ZSB0aGUgcmVjdXJzaW9uIGJ5IHZpc2l0aW5nIGFsbCBzdWJkZWZzLCBidXQgb25seQotICAgICAqIG9uZXMgaW4gZGlmZmVyZW50IFNDQ3MuICovCi0gICAgbSA9IHVwYl9keW5jYXN0X21zZ2RlZihkZWYpOwotICAgIGlmIChtKSB7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLSAgICAgIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBtKTsKLSAgICAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAgICAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgICAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0gICAgICAgIGNvbnN0IHVwYl9kZWYgKnN1YmRlZjsKLQotICAgICAgICBpZiAoIXVwYl9maWVsZGRlZl9oYXNzdWJkZWYoZikpIGNvbnRpbnVlOwotICAgICAgICBzdWJkZWYgPSB1cGJfZmllbGRkZWZfc3ViZGVmKGYpOwotCi0gICAgICAgIC8qIFNraXAgc3ViZGVmcyBpbiB0aGlzIFNDQy4gKi8KLSAgICAgICAgaWYgKGRlZi0+YmFzZS5ncm91cCA9PSBzdWJkZWYtPmJhc2UuZ3JvdXApIGNvbnRpbnVlOwotCi0gICAgICAgIC8qIHw9IHRvIGF2b2lkIHNob3J0LWNpcmN1aXQ7IHdlIG5lZWQgaXRzIHNpZGUtZWZmZWN0cy4gKi8KLSAgICAgICAgbmVlZF9kdXAgfD0gdXBiX3Jlc29sdmVfZGZzKHN1YmRlZiwgYWRkdGFiLCBuZXdfb3duZXIsIHNlZW4sIHMpOwotICAgICAgICBpZiAoIXVwYl9vayhzKSkgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfSB3aGlsZSAoKGRlZiA9ICh1cGJfZGVmKilkZWYtPmJhc2UubmV4dCkgIT0gYmFzZSk7Ci0KLSAgaWYgKG5lZWRfZHVwKSB7Ci0gICAgLyogRHVwIGFsbCBkZWZzIGluIHRoaXMgU0NDIHRoYXQgZG9uJ3QgYWxyZWFkeSBoYXZlIGVudHJpZXMgaW4gYWRkdGFiLiAqLwotICAgIGRlZiA9IGJhc2U7Ci0gICAgZG8gewotICAgICAgY29uc3QgY2hhciAqbmFtZTsKLQotICAgICAgaWYgKGRlZi0+dHlwZSA9PSBVUEJfREVGX0ZJRUxEKSBjb250aW51ZTsKLSAgICAgIG5hbWUgPSB1cGJfZGVmX2Z1bGxuYW1lKGRlZik7Ci0gICAgICBpZiAoIXVwYl9zdHJ0YWJsZV9sb29rdXAoYWRkdGFiLCBuYW1lLCBOVUxMKSkgewotICAgICAgICB1cGJfZGVmICpuZXdkZWYgPSB1cGJfZGVmX2R1cChkZWYsIG5ld19vd25lcik7Ci0gICAgICAgIGlmICghbmV3ZGVmKSBnb3RvIG9vbTsKLSAgICAgICAgbmV3ZGVmLT5jYW1lX2Zyb21fdXNlciA9IGZhbHNlOwotICAgICAgICBpZiAoIXVwYl9zdHJ0YWJsZV9pbnNlcnQoYWRkdGFiLCBuYW1lLCB1cGJfdmFsdWVfcHRyKG5ld2RlZikpKQotICAgICAgICAgIGdvdG8gb29tOwotICAgICAgfQotICAgIH0gd2hpbGUgKChkZWYgPSAodXBiX2RlZiopZGVmLT5iYXNlLm5leHQpICE9IGJhc2UpOwotICB9Ci0KLSAgdXBiX2ludHRhYmxlX2luc2VydHB0cihzZWVuLCBtZW1vaXplX2tleSwgdXBiX3ZhbHVlX2Jvb2wobmVlZF9kdXApKTsKLSAgcmV0dXJuIG5lZWRfZHVwOwotCi1vb206Ci0gIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJvdXQgb2YgbWVtb3J5Iik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogVE9ETyhoYWJlcm1hbik6IHdlIG5lZWQgYSBsb3QgbW9yZSB0ZXN0aW5nIG9mIGVycm9yIGNvbmRpdGlvbnMuCi0gKiBUaGUgY2FtZV9mcm9tX3VzZXIgc3R1ZmYgaW4gcGFydGljdWxhciBpcyBub3QgdGVzdGVkLiAqLwotYm9vbCB1cGJfc3ltdGFiX2FkZCh1cGJfc3ltdGFiICpzLCB1cGJfZGVmICpjb25zdCpkZWZzLCBpbnQgbiwgdm9pZCAqcmVmX2Rvbm9yLAotICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgaW50IGk7Ci0gIHVwYl9zdHJ0YWJsZV9pdGVyIGl0ZXI7Ci0gIHVwYl9kZWYgKiphZGRfZGVmcyA9IE5VTEw7Ci0gIHVwYl9zdHJ0YWJsZSBhZGR0YWI7Ci0gIHVwYl9pbnR0YWJsZSBzZWVuOwotCi0gIGFzc2VydCghdXBiX3N5bXRhYl9pc2Zyb3plbihzKSk7Ci0gIGlmICghdXBiX3N0cnRhYmxlX2luaXQoJmFkZHRhYiwgVVBCX0NUWVBFX1BUUikpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJvdXQgb2YgbWVtb3J5Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogQWRkIG5ldyBkZWZzIHRvIG91ciAiYWRkIiBzZXQuICovCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICB1cGJfZGVmICpkZWYgPSBkZWZzW2ldOwotICAgIGNvbnN0IGNoYXIgKmZ1bGxuYW1lOwotICAgIHVwYl9maWVsZGRlZiAqZjsKLQotICAgIGlmICh1cGJfZGVmX2lzZnJvemVuKGRlZikpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgImFkZGVkIGRlZnMgbXVzdCBiZSBtdXRhYmxlIik7Ci0gICAgICBnb3RvIGVycjsKLSAgICB9Ci0gICAgYXNzZXJ0KCF1cGJfZGVmX2lzZnJvemVuKGRlZikpOwotICAgIGZ1bGxuYW1lID0gdXBiX2RlZl9mdWxsbmFtZShkZWYpOwotICAgIGlmICghZnVsbG5hbWUpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKAotICAgICAgICAgIHN0YXR1cywgIkFub255bW91cyBkZWZzIGNhbm5vdCBiZSBhZGRlZCB0byBhIHN5bXRhYiIpOwotICAgICAgZ290byBlcnI7Ci0gICAgfQotCi0gICAgZiA9IHVwYl9keW5jYXN0X2ZpZWxkZGVmX211dGFibGUoZGVmKTsKLQotICAgIGlmIChmKSB7Ci0gICAgICBpZiAoIXVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZW5hbWUoZikpIHsKLSAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJtc2coc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiU3RhbmRhbG9uZSBmaWVsZGRlZnMgbXVzdCBoYXZlIGEgY29udGFpbmluZyB0eXBlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIihleHRlbmRlZSkgbmFtZSBzZXQiKTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICh1cGJfc3RydGFibGVfbG9va3VwKCZhZGR0YWIsIGZ1bGxuYW1lLCBOVUxMKSkgewotICAgICAgICB1cGJfc3RhdHVzX3NldGVycmYoc3RhdHVzLCAiQ29uZmxpY3RpbmcgZGVmcyBuYW1lZCAnJXMnIiwgZnVsbG5hbWUpOwotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLSAgICAgIC8qIFdlIG5lZWQgdGhpcyB0byBiYWNrIG91dCBwcm9wZXJseSwgYmVjYXVzZSBpZiB0aGVyZSBpcyBhIGZhaWx1cmUgd2UKLSAgICAgICAqIG5lZWQgdG8gZG9uYXRlIHRoZSByZWYgYmFjayB0byB0aGUgY2FsbGVyLiAqLwotICAgICAgZGVmLT5jYW1lX2Zyb21fdXNlciA9IHRydWU7Ci0gICAgICB1cGJfZGVmX2RvbmF0ZXJlZihkZWYsIHJlZl9kb25vciwgcyk7Ci0gICAgICBpZiAoIXVwYl9zdHJ0YWJsZV9pbnNlcnQoJmFkZHRhYiwgZnVsbG5hbWUsIHVwYl92YWx1ZV9wdHIoZGVmKSkpCi0gICAgICAgIGdvdG8gb29tX2VycjsKLSAgICB9Ci0gIH0KLQotICAvKiBBZGQgc3RhbmRhbG9uZSBmaWVsZGRlZnMgKGllLiBleHRlbnNpb25zKSB0byB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZXMuCi0gICAqIElmIHRoZSBhcHByb3ByaWF0ZSBtZXNzYWdlIG9ubHkgZXhpc3RzIGluIHRoZSBleGlzdGluZyBzeW10YWIsIGR1cGxpY2F0ZQotICAgKiBpdCBzbyB3ZSBoYXZlIGEgbXV0YWJsZSBjb3B5IHdlIGNhbiBhZGQgdGhlIGZpZWxkcyB0by4gKi8KLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIHVwYl9kZWYgKmRlZiA9IGRlZnNbaV07Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX2R5bmNhc3RfZmllbGRkZWZfbXV0YWJsZShkZWYpOwotICAgIGNvbnN0IGNoYXIgKm1zZ25hbWU7Ci0gICAgdXBiX3ZhbHVlIHY7Ci0gICAgdXBiX21zZ2RlZiAqbTsKLQotICAgIGlmICghZikgY29udGludWU7Ci0gICAgbXNnbmFtZSA9IHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZW5hbWUoZik7Ci0gICAgLyogV2UgdmFsaWRhdGVkIHRoaXMgZWFybGllciBpbiB0aGlzIGZ1bmN0aW9uLiAqLwotICAgIGFzc2VydChtc2duYW1lKTsKLQotICAgIC8qIElmIHRoZSBleHRlbmRlZSBuYW1lIGlzIGFic29sdXRlbHkgcXVhbGlmaWVkLCBtb3ZlIHBhc3QgdGhlIGluaXRpYWwgIi4iLgotICAgICAqIFRPRE8oaGFiZXJtYW4pOiBpdCBpcyBub3Qgb2J2aW91cyB3aGF0IGl0IHdvdWxkIG1lYW4gaWYgdGhpcyB3YXMgbm90Ci0gICAgICogYWJzb2x1dGVseSBxdWFsaWZpZWQuICovCi0gICAgaWYgKG1zZ25hbWVbMF0gPT0gJy4nKSB7Ci0gICAgICBtc2duYW1lKys7Ci0gICAgfQotCi0gICAgaWYgKHVwYl9zdHJ0YWJsZV9sb29rdXAoJmFkZHRhYiwgbXNnbmFtZSwgJnYpKSB7Ci0gICAgICAvKiBFeHRlbmRlZSBpcyBpbiB0aGUgc2V0IG9mIGRlZnMgdGhlIHVzZXIgYXNrZWQgdXMgdG8gYWRkLiAqLwotICAgICAgbSA9IHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIE5lZWQgdG8gZmluZCBhbmQgZHVwIHRoZSBleHRlbmRlZSBmcm9tIHRoZSBleGlzdGluZyBzeW10YWIuICovCi0gICAgICBjb25zdCB1cGJfbXNnZGVmICpmcm96ZW5fbSA9IHVwYl9zeW10YWJfbG9va3VwbXNnKHMsIG1zZ25hbWUpOwotICAgICAgaWYgKCFmcm96ZW5fbSkgewotICAgICAgICB1cGJfc3RhdHVzX3NldGVycmYoc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIlRyaWVkIHRvIGV4dGVuZCBtZXNzYWdlICVzIHRoYXQgZG9lcyBub3QgZXhpc3QgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIHRoaXMgU3ltYm9sVGFibGUuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ25hbWUpOwotICAgICAgICBnb3RvIGVycjsKLSAgICAgIH0KLSAgICAgIG0gPSB1cGJfbXNnZGVmX2R1cChmcm96ZW5fbSwgcyk7Ci0gICAgICBpZiAoIW0pIGdvdG8gb29tX2VycjsKLSAgICAgIGlmICghdXBiX3N0cnRhYmxlX2luc2VydCgmYWRkdGFiLCBtc2duYW1lLCB1cGJfdmFsdWVfcHRyKG0pKSkgewotICAgICAgICB1cGJfbXNnZGVmX3VucmVmKG0sIHMpOwotICAgICAgICBnb3RvIG9vbV9lcnI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCF1cGJfbXNnZGVmX2FkZGZpZWxkKG0sIGYsIHJlZl9kb25vciwgc3RhdHVzKSkgewotICAgICAgZ290byBlcnI7Ci0gICAgfQotICB9Ci0KLSAgLyogQWRkIGR1cHMgb2YgYW55IGV4aXN0aW5nIGRlZiB0aGF0IGNhbiByZWFjaCBhIGRlZiB3aXRoIHRoZSBzYW1lIG5hbWUgYXMKLSAgICogYW55dGhpbmcgaW4gb3VyICJhZGQiIHNldC4gKi8KLSAgaWYgKCF1cGJfaW50dGFibGVfaW5pdCgmc2VlbiwgVVBCX0NUWVBFX0JPT0wpKSBnb3RvIG9vbV9lcnI7Ci0gIHVwYl9zdHJ0YWJsZV9iZWdpbigmaXRlciwgJnMtPnN5bXRhYik7Ci0gIGZvciAoOyAhdXBiX3N0cnRhYmxlX2RvbmUoJml0ZXIpOyB1cGJfc3RydGFibGVfbmV4dCgmaXRlcikpIHsKLSAgICB1cGJfZGVmICpkZWYgPSB1cGJfdmFsdWVfZ2V0cHRyKHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKCZpdGVyKSk7Ci0gICAgdXBiX3Jlc29sdmVfZGZzKGRlZiwgJmFkZHRhYiwgcywgJnNlZW4sIHN0YXR1cyk7Ci0gICAgaWYgKCF1cGJfb2soc3RhdHVzKSkgZ290byBlcnI7Ci0gIH0KLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmc2Vlbik7Ci0KLSAgLyogTm93IHVzaW5nIHRoZSB0YWJsZSwgcmVzb2x2ZSBzeW1ib2xpYyByZWZlcmVuY2VzIGZvciBzdWJkZWZzLiAqLwotICB1cGJfc3RydGFibGVfYmVnaW4oJml0ZXIsICZhZGR0YWIpOwotICBmb3IgKDsgIXVwYl9zdHJ0YWJsZV9kb25lKCZpdGVyKTsgdXBiX3N0cnRhYmxlX25leHQoJml0ZXIpKSB7Ci0gICAgY29uc3QgY2hhciAqYmFzZTsKLSAgICB1cGJfZGVmICpkZWYgPSB1cGJfdmFsdWVfZ2V0cHRyKHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKCZpdGVyKSk7Ci0gICAgdXBiX21zZ2RlZiAqbSA9IHVwYl9keW5jYXN0X21zZ2RlZl9tdXRhYmxlKGRlZik7Ci0gICAgdXBiX21zZ19maWVsZF9pdGVyIGo7Ci0KLSAgICBpZiAoIW0pIGNvbnRpbnVlOwotICAgIC8qIFR5cGUgbmFtZXMgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIHRoZSBtZXNzYWdlIGluIHdoaWNoIHRoZXkgYXBwZWFyLiAqLwotICAgIGJhc2UgPSB1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pOwotCi0gICAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmosIG0pOwotICAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZqKTsKLSAgICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZqKSkgewotICAgICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZqKTsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB1cGJfZmllbGRkZWZfc3ViZGVmbmFtZShmKTsKLSAgICAgIGlmIChuYW1lICYmICF1cGJfZmllbGRkZWZfc3ViZGVmKGYpKSB7Ci0gICAgICAgIC8qIFRyeSB0aGUgbG9va3VwIGluIHRoZSBjdXJyZW50IHNldCBvZiB0by1iZS1hZGRlZCBkZWZzIGZpcnN0LiBJZiBub3QKLSAgICAgICAgICogdGhlcmUsIHRyeSBleGlzdGluZyBkZWZzLiAqLwotICAgICAgICB1cGJfZGVmICpzdWJkZWYgPSB1cGJfcmVzb2x2ZW5hbWUoJmFkZHRhYiwgYmFzZSwgbmFtZSk7Ci0gICAgICAgIGlmIChzdWJkZWYgPT0gTlVMTCkgewotICAgICAgICAgIHN1YmRlZiA9IHVwYl9yZXNvbHZlbmFtZSgmcy0+c3ltdGFiLCBiYXNlLCBuYW1lKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoc3ViZGVmID09IE5VTEwpIHsKLSAgICAgICAgICB1cGJfc3RhdHVzX3NldGVycmYoCi0gICAgICAgICAgICAgIHN0YXR1cywgImNvdWxkbid0IHJlc29sdmUgbmFtZSAnJXMnIGluIG1lc3NhZ2UgJyVzJyIsIG5hbWUsIGJhc2UpOwotICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9IGVsc2UgaWYgKCF1cGJfZmllbGRkZWZfc2V0c3ViZGVmKGYsIHN1YmRlZiwgc3RhdHVzKSkgewotICAgICAgICAgIGdvdG8gZXJyOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogV2UgbmVlZCBhbiBhcnJheSBvZiB0aGUgZGVmcyBpbiBhZGR0YWIsIGZvciBwYXNzaW5nIHRvIHVwYl9kZWZfZnJlZXplLiAqLwotICBhZGRfZGVmcyA9IG1hbGxvYyhzaXplb2Yodm9pZCopICogdXBiX3N0cnRhYmxlX2NvdW50KCZhZGR0YWIpKTsKLSAgaWYgKGFkZF9kZWZzID09IE5VTEwpIGdvdG8gb29tX2VycjsKLSAgdXBiX3N0cnRhYmxlX2JlZ2luKCZpdGVyLCAmYWRkdGFiKTsKLSAgZm9yIChuID0gMDsgIXVwYl9zdHJ0YWJsZV9kb25lKCZpdGVyKTsgdXBiX3N0cnRhYmxlX25leHQoJml0ZXIpKSB7Ci0gICAgYWRkX2RlZnNbbisrXSA9IHVwYl92YWx1ZV9nZXRwdHIodXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoJml0ZXIpKTsKLSAgfQotCi0gIGlmICghdXBiX2RlZl9mcmVlemUoYWRkX2RlZnMsIG4sIHN0YXR1cykpIGdvdG8gZXJyOwotCi0gIC8qIFRoaXMgbXVzdCBiZSBkZWxheWVkIHVudGlsIGFsbCBlcnJvcnMgaGF2ZSBiZWVuIGRldGVjdGVkLCBzaW5jZSBlcnJvcgotICAgKiByZWNvdmVyeSBjb2RlIHVzZXMgdGhpcyB0YWJsZSB0byBjbGVhbnVwIGRlZnMuICovCi0gIHVwYl9zdHJ0YWJsZV91bmluaXQoJmFkZHRhYik7Ci0KLSAgLyogVE9ETyhoYWJlcm1hbikgd2UgZG9uJ3QgcHJvcGVybHkgaGFuZGxlIGVycm9ycyBhZnRlciB0aGlzIHBvaW50IChsaWtlCi0gICAqIE9PTSBpbiB1cGJfc3RydGFibGVfaW5zZXJ0KCkgYmVsb3cpLiAqLwotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgdXBiX2RlZiAqZGVmID0gYWRkX2RlZnNbaV07Ci0gICAgY29uc3QgY2hhciAqbmFtZSA9IHVwYl9kZWZfZnVsbG5hbWUoZGVmKTsKLSAgICB1cGJfdmFsdWUgdjsKLSAgICBib29sIHN1Y2Nlc3M7Ci0KLSAgICBpZiAodXBiX3N0cnRhYmxlX3JlbW92ZSgmcy0+c3ltdGFiLCBuYW1lLCAmdikpIHsKLSAgICAgIGNvbnN0IHVwYl9kZWYgKmRlZiA9IHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gICAgICB1cGJfZGVmX3VucmVmKGRlZiwgcyk7Ci0gICAgfQotICAgIHN1Y2Nlc3MgPSB1cGJfc3RydGFibGVfaW5zZXJ0KCZzLT5zeW10YWIsIG5hbWUsIHVwYl92YWx1ZV9wdHIoZGVmKSk7Ci0gICAgVVBCX0FTU0VSVF9WQVIoc3VjY2Vzcywgc3VjY2VzcyA9PSB0cnVlKTsKLSAgfQotICBmcmVlKGFkZF9kZWZzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLW9vbV9lcnI6Ci0gIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIm91dCBvZiBtZW1vcnkiKTsKLWVycjogewotICAgIC8qIEZvciBkZWZzIHRoZSB1c2VyIHBhc3NlZCBpbiwgd2UgbmVlZCB0byBkb25hdGUgdGhlIHJlZnMgYmFjay4gIEZvciBkZWZzCi0gICAgICogd2UgZHVwJ2QsIHdlIG5lZWQgdG8ganVzdCB1bnJlZiB0aGVtLiAqLwotICAgIHVwYl9zdHJ0YWJsZV9iZWdpbigmaXRlciwgJmFkZHRhYik7Ci0gICAgZm9yICg7ICF1cGJfc3RydGFibGVfZG9uZSgmaXRlcik7IHVwYl9zdHJ0YWJsZV9uZXh0KCZpdGVyKSkgewotICAgICAgdXBiX2RlZiAqZGVmID0gdXBiX3ZhbHVlX2dldHB0cih1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXRlcikpOwotICAgICAgYm9vbCBjYW1lX2Zyb21fdXNlciA9IGRlZi0+Y2FtZV9mcm9tX3VzZXI7Ci0gICAgICBkZWYtPmNhbWVfZnJvbV91c2VyID0gZmFsc2U7Ci0gICAgICBpZiAoY2FtZV9mcm9tX3VzZXIpIHsKLSAgICAgICAgdXBiX2RlZl9kb25hdGVyZWYoZGVmLCBzLCByZWZfZG9ub3IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXBiX2RlZl91bnJlZihkZWYsIHMpOwotICAgICAgfQotICAgIH0KLSAgfQotICB1cGJfc3RydGFibGVfdW5pbml0KCZhZGR0YWIpOwotICBmcmVlKGFkZF9kZWZzKTsKLSAgYXNzZXJ0KCF1cGJfb2soc3RhdHVzKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogSXRlcmF0aW9uLiAqLwotCi1zdGF0aWMgdm9pZCBhZHZhbmNlX3RvX21hdGNoaW5nKHVwYl9zeW10YWJfaXRlciAqaXRlcikgewotICBpZiAoaXRlci0+dHlwZSA9PSBVUEJfREVGX0FOWSkKLSAgICByZXR1cm47Ci0KLSAgd2hpbGUgKCF1cGJfc3RydGFibGVfZG9uZSgmaXRlci0+aXRlcikgJiYKLSAgICAgICAgIGl0ZXItPnR5cGUgIT0gdXBiX3N5bXRhYl9pdGVyX2RlZihpdGVyKS0+dHlwZSkgewotICAgIHVwYl9zdHJ0YWJsZV9uZXh0KCZpdGVyLT5pdGVyKTsKLSAgfQotfQotCi12b2lkIHVwYl9zeW10YWJfYmVnaW4odXBiX3N5bXRhYl9pdGVyICppdGVyLCBjb25zdCB1cGJfc3ltdGFiICpzLAotICAgICAgICAgICAgICAgICAgICAgIHVwYl9kZWZ0eXBlX3QgdHlwZSkgewotICB1cGJfc3RydGFibGVfYmVnaW4oJml0ZXItPml0ZXIsICZzLT5zeW10YWIpOwotICBpdGVyLT50eXBlID0gdHlwZTsKLSAgYWR2YW5jZV90b19tYXRjaGluZyhpdGVyKTsKLX0KLQotdm9pZCB1cGJfc3ltdGFiX25leHQodXBiX3N5bXRhYl9pdGVyICppdGVyKSB7Ci0gIHVwYl9zdHJ0YWJsZV9uZXh0KCZpdGVyLT5pdGVyKTsKLSAgYWR2YW5jZV90b19tYXRjaGluZyhpdGVyKTsKLX0KLQotYm9vbCB1cGJfc3ltdGFiX2RvbmUoY29uc3QgdXBiX3N5bXRhYl9pdGVyICppdGVyKSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfZG9uZSgmaXRlci0+aXRlcik7Ci19Ci0KLWNvbnN0IHVwYl9kZWYgKnVwYl9zeW10YWJfaXRlcl9kZWYoY29uc3QgdXBiX3N5bXRhYl9pdGVyICppdGVyKSB7Ci0gIHJldHVybiB1cGJfdmFsdWVfZ2V0cHRyKHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKCZpdGVyLT5pdGVyKSk7Ci19Ci0vKgotKiogdXBiX3RhYmxlIEltcGxlbWVudGF0aW9uCi0qKgotKiogSW1wbGVtZW50YXRpb24gaXMgaGVhdmlseSBpbnNwaXJlZCBieSBMdWEncyBsdGFibGUuYy4KLSovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jZGVmaW5lIFVQQl9NQVhBUlJTSVpFIDE2ICAvKiA2NGsuICovCi0KLS8qIEZyb20gQ2hyb21pdW0uICovCi0jZGVmaW5lIEFSUkFZX1NJWkUoeCkgXAotICAgICgoc2l6ZW9mKHgpL3NpemVvZigwW3hdKSkgLyAoKHNpemVfdCkoIShzaXplb2YoeCkgJSBzaXplb2YoMFt4XSkpKSkpCi0KLXN0YXRpYyBjb25zdCBkb3VibGUgTUFYX0xPQUQgPSAwLjg1OwotCi0vKiBUaGUgbWluaW11bSB1dGlsaXphdGlvbiBvZiB0aGUgYXJyYXkgcGFydCBvZiBhIG1peGVkIGhhc2gvYXJyYXkgdGFibGUuICBUaGlzCi0gKiBpcyBhIHNwZWVkL21lbW9yeS11c2FnZSB0cmFkZW9mZiAodGhvdWdoIGl0J3Mgbm90IHN0cmFpZ2h0Zm9yd2FyZCBiZWNhdXNlIG9mCi0gKiBjYWNoZSBlZmZlY3RzKS4gIFRoZSBsb3dlciB0aGlzIGlzLCB0aGUgbW9yZSBtZW1vcnkgd2UnbGwgdXNlLiAqLwotc3RhdGljIGNvbnN0IGRvdWJsZSBNSU5fREVOU0lUWSA9IDAuMTsKLQotYm9vbCBpc19wb3cyKHVpbnQ2NF90IHYpIHsgcmV0dXJuIHYgPT0gMCB8fCAodiAmICh2IC0gMSkpID09IDA7IH0KLQotaW50IGxvZzJjZWlsKHVpbnQ2NF90IHYpIHsKLSAgaW50IHJldCA9IDA7Ci0gIGJvb2wgcG93MiA9IGlzX3BvdzIodik7Ci0gIHdoaWxlICh2ID4+PSAxKSByZXQrKzsKLSAgcmV0ID0gcG93MiA/IHJldCA6IHJldCArIDE7ICAvKiBDZWlsaW5nLiAqLwotICByZXR1cm4gVVBCX01JTihVUEJfTUFYQVJSU0laRSwgcmV0KTsKLX0KLQotY2hhciAqdXBiX3N0cmR1cChjb25zdCBjaGFyICpzKSB7Ci0gIHJldHVybiB1cGJfc3RyZHVwMihzLCBzdHJsZW4ocykpOwotfQotCi1jaGFyICp1cGJfc3RyZHVwMihjb25zdCBjaGFyICpzLCBzaXplX3QgbGVuKSB7Ci0gIHNpemVfdCBuOwotICBjaGFyICpwOwotCi0gIC8qIFByZXZlbnQgb3ZlcmZsb3cgZXJyb3JzLiAqLwotICBpZiAobGVuID09IFNJWkVfTUFYKSByZXR1cm4gTlVMTDsKLSAgLyogQWx3YXlzIG51bGwtdGVybWluYXRlLCBldmVuIGlmIGJpbmFyeSBkYXRhOyBidXQgZG9uJ3QgcmVseSBvbiB0aGUgaW5wdXQgdG8KLSAgICogaGF2ZSBhIG51bGwtdGVybWluYXRpbmcgYnl0ZSBzaW5jZSBpdCBtYXkgYmUgYSByYXcgYmluYXJ5IGJ1ZmZlci4gKi8KLSAgbiA9IGxlbiArIDE7Ci0gIHAgPSBtYWxsb2Mobik7Ci0gIGlmIChwKSB7Ci0gICAgbWVtY3B5KHAsIHMsIGxlbik7Ci0gICAgcFtsZW5dID0gMDsKLSAgfQotICByZXR1cm4gcDsKLX0KLQotLyogQSB0eXBlIHRvIHJlcHJlc2VudCB0aGUgbG9va3VwIGtleSBvZiBlaXRoZXIgYSBzdHJ0YWJsZSBvciBhbiBpbnR0YWJsZS4gKi8KLXR5cGVkZWYgdW5pb24gewotICB1aW50cHRyX3QgbnVtOwotICBzdHJ1Y3QgewotICAgIGNvbnN0IGNoYXIgKnN0cjsKLSAgICBzaXplX3QgbGVuOwotICB9IHN0cjsKLX0gbG9va3Vwa2V5X3Q7Ci0KLXN0YXRpYyBsb29rdXBrZXlfdCBzdHJrZXkyKGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikgewotICBsb29rdXBrZXlfdCBrOwotICBrLnN0ci5zdHIgPSBzdHI7Ci0gIGsuc3RyLmxlbiA9IGxlbjsKLSAgcmV0dXJuIGs7Ci19Ci0KLXN0YXRpYyBsb29rdXBrZXlfdCBpbnRrZXkodWludHB0cl90IGtleSkgewotICBsb29rdXBrZXlfdCBrOwotICBrLm51bSA9IGtleTsKLSAgcmV0dXJuIGs7Ci19Ci0KLXR5cGVkZWYgdWludDMyX3QgaGFzaGZ1bmNfdCh1cGJfdGFia2V5IGtleSk7Ci10eXBlZGVmIGJvb2wgZXFsZnVuY190KHVwYl90YWJrZXkgazEsIGxvb2t1cGtleV90IGsyKTsKLQotLyogQmFzZSB0YWJsZSAoc2hhcmVkIGNvZGUpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRm9yIHdoZW4gd2UgbmVlZCB0byBjYXN0IGF3YXkgY29uc3QuICovCi1zdGF0aWMgdXBiX3RhYmVudCAqbXV0YWJsZV9lbnRyaWVzKHVwYl90YWJsZSAqdCkgewotICByZXR1cm4gKHVwYl90YWJlbnQqKXQtPmVudHJpZXM7Ci19Ci0KLXN0YXRpYyBib29sIGlzZnVsbCh1cGJfdGFibGUgKnQpIHsKLSAgcmV0dXJuIChkb3VibGUpKHQtPmNvdW50ICsgMSkgLyB1cGJfdGFibGVfc2l6ZSh0KSA+IE1BWF9MT0FEOwotfQotCi1zdGF0aWMgYm9vbCBpbml0KHVwYl90YWJsZSAqdCwgdXBiX2N0eXBlX3QgY3R5cGUsIHVpbnQ4X3Qgc2l6ZV9sZzIpIHsKLSAgc2l6ZV90IGJ5dGVzOwotCi0gIHQtPmNvdW50ID0gMDsKLSAgdC0+Y3R5cGUgPSBjdHlwZTsKLSAgdC0+c2l6ZV9sZzIgPSBzaXplX2xnMjsKLSAgdC0+bWFzayA9IHVwYl90YWJsZV9zaXplKHQpID8gdXBiX3RhYmxlX3NpemUodCkgLSAxIDogMDsKLSAgYnl0ZXMgPSB1cGJfdGFibGVfc2l6ZSh0KSAqIHNpemVvZih1cGJfdGFiZW50KTsKLSAgaWYgKGJ5dGVzID4gMCkgewotICAgIHQtPmVudHJpZXMgPSBtYWxsb2MoYnl0ZXMpOwotICAgIGlmICghdC0+ZW50cmllcykgcmV0dXJuIGZhbHNlOwotICAgIG1lbXNldChtdXRhYmxlX2VudHJpZXModCksIDAsIGJ5dGVzKTsKLSAgfSBlbHNlIHsKLSAgICB0LT5lbnRyaWVzID0gTlVMTDsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgdW5pbml0KHVwYl90YWJsZSAqdCkgeyBmcmVlKG11dGFibGVfZW50cmllcyh0KSk7IH0KLQotc3RhdGljIHVwYl90YWJlbnQgKmVtcHR5ZW50KHVwYl90YWJsZSAqdCkgewotICB1cGJfdGFiZW50ICplID0gbXV0YWJsZV9lbnRyaWVzKHQpICsgdXBiX3RhYmxlX3NpemUodCk7Ci0gIHdoaWxlICgxKSB7IGlmICh1cGJfdGFiZW50X2lzZW1wdHkoLS1lKSkgcmV0dXJuIGU7IGFzc2VydChlID4gdC0+ZW50cmllcyk7IH0KLX0KLQotc3RhdGljIHVwYl90YWJlbnQgKmdldGVudHJ5X211dGFibGUodXBiX3RhYmxlICp0LCB1aW50MzJfdCBoYXNoKSB7Ci0gIHJldHVybiAodXBiX3RhYmVudCopdXBiX2dldGVudHJ5KHQsIGhhc2gpOwotfQotCi1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCAqZmluZGVudHJ5KGNvbnN0IHVwYl90YWJsZSAqdCwgbG9va3Vwa2V5X3Qga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNoLCBlcWxmdW5jX3QgKmVxbCkgewotICBjb25zdCB1cGJfdGFiZW50ICplOwotCi0gIGlmICh0LT5zaXplX2xnMiA9PSAwKSByZXR1cm4gTlVMTDsKLSAgZSA9IHVwYl9nZXRlbnRyeSh0LCBoYXNoKTsKLSAgaWYgKHVwYl90YWJlbnRfaXNlbXB0eShlKSkgcmV0dXJuIE5VTEw7Ci0gIHdoaWxlICgxKSB7Ci0gICAgaWYgKGVxbChlLT5rZXksIGtleSkpIHJldHVybiBlOwotICAgIGlmICgoZSA9IGUtPm5leHQpID09IE5VTEwpIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyB1cGJfdGFiZW50ICpmaW5kZW50cnlfbXV0YWJsZSh1cGJfdGFibGUgKnQsIGxvb2t1cGtleV90IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNoLCBlcWxmdW5jX3QgKmVxbCkgewotICByZXR1cm4gKHVwYl90YWJlbnQqKWZpbmRlbnRyeSh0LCBrZXksIGhhc2gsIGVxbCk7Ci19Ci0KLXN0YXRpYyBib29sIGxvb2t1cChjb25zdCB1cGJfdGFibGUgKnQsIGxvb2t1cGtleV90IGtleSwgdXBiX3ZhbHVlICp2LAotICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGhhc2gsIGVxbGZ1bmNfdCAqZXFsKSB7Ci0gIGNvbnN0IHVwYl90YWJlbnQgKmUgPSBmaW5kZW50cnkodCwga2V5LCBoYXNoLCBlcWwpOwotICBpZiAoZSkgewotICAgIGlmICh2KSB7Ci0gICAgICBfdXBiX3ZhbHVlX3NldHZhbCh2LCBlLT52YWwudmFsLCB0LT5jdHlwZSk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vKiBUaGUgZ2l2ZW4ga2V5IG11c3Qgbm90IGFscmVhZHkgZXhpc3QgaW4gdGhlIHRhYmxlLiAqLwotc3RhdGljIHZvaWQgaW5zZXJ0KHVwYl90YWJsZSAqdCwgbG9va3Vwa2V5X3Qga2V5LCB1cGJfdGFia2V5IHRhYmtleSwKLSAgICAgICAgICAgICAgICAgICB1cGJfdmFsdWUgdmFsLCB1aW50MzJfdCBoYXNoLAotICAgICAgICAgICAgICAgICAgIGhhc2hmdW5jX3QgKmhhc2hmdW5jLCBlcWxmdW5jX3QgKmVxbCkgewotICB1cGJfdGFiZW50ICptYWlucG9zX2U7Ci0gIHVwYl90YWJlbnQgKm91cl9lOwotCi0gIFVQQl9VTlVTRUQoZXFsKTsKLSAgVVBCX1VOVVNFRChrZXkpOwotICBhc3NlcnQoZmluZGVudHJ5KHQsIGtleSwgaGFzaCwgZXFsKSA9PSBOVUxMKTsKLSAgYXNzZXJ0KHZhbC5jdHlwZSA9PSB0LT5jdHlwZSk7Ci0KLSAgdC0+Y291bnQrKzsKLSAgbWFpbnBvc19lID0gZ2V0ZW50cnlfbXV0YWJsZSh0LCBoYXNoKTsKLSAgb3VyX2UgPSBtYWlucG9zX2U7Ci0KLSAgaWYgKHVwYl90YWJlbnRfaXNlbXB0eShtYWlucG9zX2UpKSB7Ci0gICAgLyogT3VyIG1haW4gcG9zaXRpb24gaXMgZW1wdHk7IHVzZSBpdC4gKi8KLSAgICBvdXJfZS0+bmV4dCA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgLyogQ29sbGlzaW9uLiAqLwotICAgIHVwYl90YWJlbnQgKm5ld19lID0gZW1wdHllbnQodCk7Ci0gICAgLyogSGVhZCBvZiBjb2xsaWRlcidzIGNoYWluLiAqLwotICAgIHVwYl90YWJlbnQgKmNoYWluID0gZ2V0ZW50cnlfbXV0YWJsZSh0LCBoYXNoZnVuYyhtYWlucG9zX2UtPmtleSkpOwotICAgIGlmIChjaGFpbiA9PSBtYWlucG9zX2UpIHsKLSAgICAgIC8qIEV4aXN0aW5nIGVudCBpcyBpbiBpdHMgbWFpbiBwb3Npc2l0b24gKGl0IGhhcyB0aGUgc2FtZSBoYXNoIGFzIHVzLCBhbmQKLSAgICAgICAqIGlzIHRoZSBoZWFkIG9mIG91ciBjaGFpbikuICBJbnNlcnQgdG8gbmV3IGVudCBhbmQgYXBwZW5kIHRvIHRoaXMgY2hhaW4uICovCi0gICAgICBuZXdfZS0+bmV4dCA9IG1haW5wb3NfZS0+bmV4dDsKLSAgICAgIG1haW5wb3NfZS0+bmV4dCA9IG5ld19lOwotICAgICAgb3VyX2UgPSBuZXdfZTsKLSAgICB9IGVsc2UgewotICAgICAgLyogRXhpc3RpbmcgZW50IGlzIG5vdCBpbiBpdHMgbWFpbiBwb3NpdGlvbiAoaXQgaXMgYSBub2RlIGluIHNvbWUgb3RoZXIKLSAgICAgICAqIGNoYWluKS4gIFRoaXMgaW1wbGllcyB0aGF0IG5vIGV4aXN0aW5nIGVudCBpbiB0aGUgdGFibGUgaGFzIG91ciBoYXNoLgotICAgICAgICogRXZpY3QgaXQgKHVwZGF0aW5nIGl0cyBjaGFpbikgYW5kIHVzZSBpdHMgZW50IGZvciBoZWFkIG9mIG91ciBjaGFpbi4gKi8KLSAgICAgICpuZXdfZSA9ICptYWlucG9zX2U7ICAvKiBjb3BpZXMgbmV4dC4gKi8KLSAgICAgIHdoaWxlIChjaGFpbi0+bmV4dCAhPSBtYWlucG9zX2UpIHsKLSAgICAgICAgY2hhaW4gPSAodXBiX3RhYmVudCopY2hhaW4tPm5leHQ7Ci0gICAgICAgIGFzc2VydChjaGFpbik7Ci0gICAgICB9Ci0gICAgICBjaGFpbi0+bmV4dCA9IG5ld19lOwotICAgICAgb3VyX2UgPSBtYWlucG9zX2U7Ci0gICAgICBvdXJfZS0+bmV4dCA9IE5VTEw7Ci0gICAgfQotICB9Ci0gIG91cl9lLT5rZXkgPSB0YWJrZXk7Ci0gIG91cl9lLT52YWwudmFsID0gdmFsLnZhbDsKLSAgYXNzZXJ0KGZpbmRlbnRyeSh0LCBrZXksIGhhc2gsIGVxbCkgPT0gb3VyX2UpOwotfQotCi1zdGF0aWMgYm9vbCBybSh1cGJfdGFibGUgKnQsIGxvb2t1cGtleV90IGtleSwgdXBiX3ZhbHVlICp2YWwsCi0gICAgICAgICAgICAgICB1cGJfdGFia2V5ICpyZW1vdmVkLCB1aW50MzJfdCBoYXNoLCBlcWxmdW5jX3QgKmVxbCkgewotICB1cGJfdGFiZW50ICpjaGFpbiA9IGdldGVudHJ5X211dGFibGUodCwgaGFzaCk7Ci0gIGlmICh1cGJfdGFiZW50X2lzZW1wdHkoY2hhaW4pKSByZXR1cm4gZmFsc2U7Ci0gIGlmIChlcWwoY2hhaW4tPmtleSwga2V5KSkgewotICAgIC8qIEVsZW1lbnQgdG8gcmVtb3ZlIGlzIGF0IHRoZSBoZWFkIG9mIGl0cyBjaGFpbi4gKi8KLSAgICB0LT5jb3VudC0tOwotICAgIGlmICh2YWwpIHsKLSAgICAgIF91cGJfdmFsdWVfc2V0dmFsKHZhbCwgY2hhaW4tPnZhbC52YWwsIHQtPmN0eXBlKTsKLSAgICB9Ci0gICAgaWYgKGNoYWluLT5uZXh0KSB7Ci0gICAgICB1cGJfdGFiZW50ICptb3ZlID0gKHVwYl90YWJlbnQqKWNoYWluLT5uZXh0OwotICAgICAgKmNoYWluID0gKm1vdmU7Ci0gICAgICBpZiAocmVtb3ZlZCkgKnJlbW92ZWQgPSBtb3ZlLT5rZXk7Ci0gICAgICBtb3ZlLT5rZXkgPSAwOyAgLyogTWFrZSB0aGUgc2xvdCBlbXB0eS4gKi8KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHJlbW92ZWQpICpyZW1vdmVkID0gY2hhaW4tPmtleTsKLSAgICAgIGNoYWluLT5rZXkgPSAwOyAgLyogTWFrZSB0aGUgc2xvdCBlbXB0eS4gKi8KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgLyogRWxlbWVudCB0byByZW1vdmUgaXMgZWl0aGVyIGluIGEgbm9uLWhlYWQgcG9zaXRpb24gb3Igbm90IGluIHRoZQotICAgICAqIHRhYmxlLiAqLwotICAgIHdoaWxlIChjaGFpbi0+bmV4dCAmJiAhZXFsKGNoYWluLT5uZXh0LT5rZXksIGtleSkpCi0gICAgICBjaGFpbiA9ICh1cGJfdGFiZW50KiljaGFpbi0+bmV4dDsKLSAgICBpZiAoY2hhaW4tPm5leHQpIHsKLSAgICAgIC8qIEZvdW5kIGVsZW1lbnQgdG8gcmVtb3ZlLiAqLwotICAgICAgdXBiX3RhYmVudCAqcm07Ci0KLSAgICAgIGlmICh2YWwpIHsKLSAgICAgICAgX3VwYl92YWx1ZV9zZXR2YWwodmFsLCBjaGFpbi0+bmV4dC0+dmFsLnZhbCwgdC0+Y3R5cGUpOwotICAgICAgfQotICAgICAgcm0gPSAodXBiX3RhYmVudCopY2hhaW4tPm5leHQ7Ci0gICAgICBpZiAocmVtb3ZlZCkgKnJlbW92ZWQgPSBybS0+a2V5OwotICAgICAgcm0tPmtleSA9IDA7Ci0gICAgICBjaGFpbi0+bmV4dCA9IHJtLT5uZXh0OwotICAgICAgdC0+Y291bnQtLTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3QgbmV4dChjb25zdCB1cGJfdGFibGUgKnQsIHNpemVfdCBpKSB7Ci0gIGRvIHsKLSAgICBpZiAoKytpID49IHVwYl90YWJsZV9zaXplKHQpKQotICAgICAgcmV0dXJuIFNJWkVfTUFYOwotICB9IHdoaWxlKHVwYl90YWJlbnRfaXNlbXB0eSgmdC0+ZW50cmllc1tpXSkpOwotCi0gIHJldHVybiBpOwotfQotCi1zdGF0aWMgc2l6ZV90IGJlZ2luKGNvbnN0IHVwYl90YWJsZSAqdCkgewotICByZXR1cm4gbmV4dCh0LCAtMSk7Ci19Ci0KLQotLyogdXBiX3N0cnRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQSBzaW1wbGUgInN1YmNsYXNzIiBvZiB1cGJfdGFibGUgdGhhdCBvbmx5IGFkZHMgYSBoYXNoIGZ1bmN0aW9uIGZvciBzdHJpbmdzLiAqLwotCi1zdGF0aWMgdXBiX3RhYmtleSBzdHJjb3B5KGxvb2t1cGtleV90IGsyKSB7Ci0gIGNoYXIgKnN0ciA9IG1hbGxvYyhrMi5zdHIubGVuICsgc2l6ZW9mKHVpbnQzMl90KSArIDEpOwotICBpZiAoc3RyID09IE5VTEwpIHJldHVybiAwOwotICBtZW1jcHkoc3RyLCAmazIuc3RyLmxlbiwgc2l6ZW9mKHVpbnQzMl90KSk7Ci0gIG1lbWNweShzdHIgKyBzaXplb2YodWludDMyX3QpLCBrMi5zdHIuc3RyLCBrMi5zdHIubGVuICsgMSk7Ci0gIHJldHVybiAodWludHB0cl90KXN0cjsKLX0KLQotc3RhdGljIHVpbnQzMl90IHN0cmhhc2godXBiX3RhYmtleSBrZXkpIHsKLSAgdWludDMyX3QgbGVuOwotICBjaGFyICpzdHIgPSB1cGJfdGFic3RyKGtleSwgJmxlbik7Ci0gIHJldHVybiBNdXJtdXJIYXNoMihzdHIsIGxlbiwgMCk7Ci19Ci0KLXN0YXRpYyBib29sIHN0cmVxbCh1cGJfdGFia2V5IGsxLCBsb29rdXBrZXlfdCBrMikgewotICB1aW50MzJfdCBsZW47Ci0gIGNoYXIgKnN0ciA9IHVwYl90YWJzdHIoazEsICZsZW4pOwotICByZXR1cm4gbGVuID09IGsyLnN0ci5sZW4gJiYgbWVtY21wKHN0ciwgazIuc3RyLnN0ciwgbGVuKSA9PSAwOwotfQotCi1ib29sIHVwYl9zdHJ0YWJsZV9pbml0KHVwYl9zdHJ0YWJsZSAqdCwgdXBiX2N0eXBlX3QgY3R5cGUpIHsKLSAgcmV0dXJuIGluaXQoJnQtPnQsIGN0eXBlLCAyKTsKLX0KLQotdm9pZCB1cGJfc3RydGFibGVfdW5pbml0KHVwYl9zdHJ0YWJsZSAqdCkgewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IHVwYl90YWJsZV9zaXplKCZ0LT50KTsgaSsrKQotICAgIGZyZWUoKHZvaWQqKXQtPnQuZW50cmllc1tpXS5rZXkpOwotICB1bmluaXQoJnQtPnQpOwotfQotCi1ib29sIHVwYl9zdHJ0YWJsZV9yZXNpemUodXBiX3N0cnRhYmxlICp0LCBzaXplX3Qgc2l6ZV9sZzIpIHsKLSAgdXBiX3N0cnRhYmxlIG5ld190YWJsZTsKLSAgdXBiX3N0cnRhYmxlX2l0ZXIgaTsKLQotICBpZiAoIWluaXQoJm5ld190YWJsZS50LCB0LT50LmN0eXBlLCBzaXplX2xnMikpCi0gICAgcmV0dXJuIGZhbHNlOwotICB1cGJfc3RydGFibGVfYmVnaW4oJmksIHQpOwotICBmb3IgKCA7ICF1cGJfc3RydGFibGVfZG9uZSgmaSk7IHVwYl9zdHJ0YWJsZV9uZXh0KCZpKSkgewotICAgIHVwYl9zdHJ0YWJsZV9pbnNlcnQyKAotICAgICAgICAmbmV3X3RhYmxlLAotICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXkoJmkpLAotICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJmkpLAotICAgICAgICB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaSkpOwotICB9Ci0gIHVwYl9zdHJ0YWJsZV91bmluaXQodCk7Ci0gICp0ID0gbmV3X3RhYmxlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfc3RydGFibGVfaW5zZXJ0Mih1cGJfc3RydGFibGUgKnQsIGNvbnN0IGNoYXIgKmssIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSB2KSB7Ci0gIGxvb2t1cGtleV90IGtleTsKLSAgdXBiX3RhYmtleSB0YWJrZXk7Ci0gIHVpbnQzMl90IGhhc2g7Ci0KLSAgaWYgKGlzZnVsbCgmdC0+dCkpIHsKLSAgICAvKiBOZWVkIHRvIHJlc2l6ZS4gIE5ldyB0YWJsZSBvZiBkb3VibGUgdGhlIHNpemUsIGFkZCBvbGQgZWxlbWVudHMgdG8gaXQuICovCi0gICAgaWYgKCF1cGJfc3RydGFibGVfcmVzaXplKHQsIHQtPnQuc2l6ZV9sZzIgKyAxKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGtleSA9IHN0cmtleTIoaywgbGVuKTsKLSAgdGFia2V5ID0gc3RyY29weShrZXkpOwotICBpZiAodGFia2V5ID09IDApIHJldHVybiBmYWxzZTsKLQotICBoYXNoID0gTXVybXVySGFzaDIoa2V5LnN0ci5zdHIsIGtleS5zdHIubGVuLCAwKTsKLSAgaW5zZXJ0KCZ0LT50LCBrZXksIHRhYmtleSwgdiwgaGFzaCwgJnN0cmhhc2gsICZzdHJlcWwpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfc3RydGFibGVfbG9va3VwMihjb25zdCB1cGJfc3RydGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlICp2KSB7Ci0gIHVpbnQzMl90IGhhc2ggPSBNdXJtdXJIYXNoMihrZXksIGxlbiwgMCk7Ci0gIHJldHVybiBsb29rdXAoJnQtPnQsIHN0cmtleTIoa2V5LCBsZW4pLCB2LCBoYXNoLCAmc3RyZXFsKTsKLX0KLQotYm9vbCB1cGJfc3RydGFibGVfcmVtb3ZlMih1cGJfc3RydGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfdmFsdWUgKnZhbCkgewotICB1aW50MzJfdCBoYXNoID0gTXVybXVySGFzaDIoa2V5LCBzdHJsZW4oa2V5KSwgMCk7Ci0gIHVwYl90YWJrZXkgdGFia2V5OwotICBpZiAocm0oJnQtPnQsIHN0cmtleTIoa2V5LCBsZW4pLCB2YWwsICZ0YWJrZXksIGhhc2gsICZzdHJlcWwpKSB7Ci0gICAgZnJlZSgodm9pZCopdGFia2V5KTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLyogSXRlcmF0aW9uICovCi0KLXN0YXRpYyBjb25zdCB1cGJfdGFiZW50ICpzdHJfdGFiZW50KGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKSB7Ci0gIHJldHVybiAmaS0+dC0+dC5lbnRyaWVzW2ktPmluZGV4XTsKLX0KLQotdm9pZCB1cGJfc3RydGFibGVfYmVnaW4odXBiX3N0cnRhYmxlX2l0ZXIgKmksIGNvbnN0IHVwYl9zdHJ0YWJsZSAqdCkgewotICBpLT50ID0gdDsKLSAgaS0+aW5kZXggPSBiZWdpbigmdC0+dCk7Ci19Ci0KLXZvaWQgdXBiX3N0cnRhYmxlX25leHQodXBiX3N0cnRhYmxlX2l0ZXIgKmkpIHsKLSAgaS0+aW5kZXggPSBuZXh0KCZpLT50LT50LCBpLT5pbmRleCk7Ci19Ci0KLWJvb2wgdXBiX3N0cnRhYmxlX2RvbmUoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkpIHsKLSAgcmV0dXJuIGktPmluZGV4ID49IHVwYl90YWJsZV9zaXplKCZpLT50LT50KSB8fAotICAgICAgICAgdXBiX3RhYmVudF9pc2VtcHR5KHN0cl90YWJlbnQoaSkpOwotfQotCi1jb25zdCBjaGFyICp1cGJfc3RydGFibGVfaXRlcl9rZXkodXBiX3N0cnRhYmxlX2l0ZXIgKmkpIHsKLSAgYXNzZXJ0KCF1cGJfc3RydGFibGVfZG9uZShpKSk7Ci0gIHJldHVybiB1cGJfdGFic3RyKHN0cl90YWJlbnQoaSktPmtleSwgTlVMTCk7Ci19Ci0KLXNpemVfdCB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgodXBiX3N0cnRhYmxlX2l0ZXIgKmkpIHsKLSAgdWludDMyX3QgbGVuOwotICBhc3NlcnQoIXVwYl9zdHJ0YWJsZV9kb25lKGkpKTsKLSAgdXBiX3RhYnN0cihzdHJfdGFiZW50KGkpLT5rZXksICZsZW4pOwotICByZXR1cm4gbGVuOwotfQotCi11cGJfdmFsdWUgdXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkpIHsKLSAgYXNzZXJ0KCF1cGJfc3RydGFibGVfZG9uZShpKSk7Ci0gIHJldHVybiBfdXBiX3ZhbHVlX3ZhbChzdHJfdGFiZW50KGkpLT52YWwudmFsLCBpLT50LT50LmN0eXBlKTsKLX0KLQotdm9pZCB1cGJfc3RydGFibGVfaXRlcl9zZXRkb25lKHVwYl9zdHJ0YWJsZV9pdGVyICppKSB7Ci0gIGktPmluZGV4ID0gU0laRV9NQVg7Ci19Ci0KLWJvb2wgdXBiX3N0cnRhYmxlX2l0ZXJfaXNlcXVhbChjb25zdCB1cGJfc3RydGFibGVfaXRlciAqaTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkyKSB7Ci0gIGlmICh1cGJfc3RydGFibGVfZG9uZShpMSkgJiYgdXBiX3N0cnRhYmxlX2RvbmUoaTIpKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gaTEtPnQgPT0gaTItPnQgJiYgaTEtPmluZGV4ID09IGkyLT5pbmRleDsKLX0KLQotCi0vKiB1cGJfaW50dGFibGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGb3IgaW50dGFibGVzIHdlIHVzZSBhIGh5YnJpZCBzdHJ1Y3R1cmUgd2hlcmUgc21hbGwga2V5cyBhcmUga2VwdCBpbiBhbgotICogYXJyYXkgYW5kIGxhcmdlIGtleXMgYXJlIHB1dCBpbiB0aGUgaGFzaCB0YWJsZS4gKi8KLQotc3RhdGljIHVpbnQzMl90IGludGhhc2godXBiX3RhYmtleSBrZXkpIHsgcmV0dXJuIHVwYl9pbnRoYXNoKGtleSk7IH0KLQotc3RhdGljIGJvb2wgaW50ZXFsKHVwYl90YWJrZXkgazEsIGxvb2t1cGtleV90IGsyKSB7Ci0gIHJldHVybiBrMSA9PSBrMi5udW07Ci19Ci0KLXN0YXRpYyB1cGJfdGFidmFsICptdXRhYmxlX2FycmF5KHVwYl9pbnR0YWJsZSAqdCkgewotICByZXR1cm4gKHVwYl90YWJ2YWwqKXQtPmFycmF5OwotfQotCi1zdGF0aWMgdXBiX3RhYnZhbCAqaW50dGFibGVfdmFsKHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSkgewotICBpZiAoa2V5IDwgdC0+YXJyYXlfc2l6ZSkgewotICAgIHJldHVybiB1cGJfYXJyaGFzKHQtPmFycmF5W2tleV0pID8gJihtdXRhYmxlX2FycmF5KHQpW2tleV0pIDogTlVMTDsKLSAgfSBlbHNlIHsKLSAgICB1cGJfdGFiZW50ICplID0KLSAgICAgICAgZmluZGVudHJ5X211dGFibGUoJnQtPnQsIGludGtleShrZXkpLCB1cGJfaW50aGFzaChrZXkpLCAmaW50ZXFsKTsKLSAgICByZXR1cm4gZSA/ICZlLT52YWwgOiBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCB1cGJfdGFidmFsICppbnR0YWJsZV92YWxfY29uc3QoY29uc3QgdXBiX2ludHRhYmxlICp0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50cHRyX3Qga2V5KSB7Ci0gIHJldHVybiBpbnR0YWJsZV92YWwoKHVwYl9pbnR0YWJsZSopdCwga2V5KTsKLX0KLQotc2l6ZV90IHVwYl9pbnR0YWJsZV9jb3VudChjb25zdCB1cGJfaW50dGFibGUgKnQpIHsKLSAgcmV0dXJuIHQtPnQuY291bnQgKyB0LT5hcnJheV9jb3VudDsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2sodXBiX2ludHRhYmxlICp0KSB7Ci0gIFVQQl9VTlVTRUQodCk7Ci0jaWYgZGVmaW5lZChVUEJfREVCVUdfVEFCTEUpICYmICFkZWZpbmVkKE5ERUJVRykKLSAgewotICAgIC8qIFRoaXMgY2hlY2sgaXMgdmVyeSBleHBlbnNpdmUgKG1ha2VzIGluc2VydHMvZGVsZXRlcyBPKE4pKS4gKi8KLSAgICBzaXplX3QgY291bnQgPSAwOwotICAgIHVwYl9pbnR0YWJsZV9pdGVyIGk7Ci0gICAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCB0KTsKLSAgICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSksIGNvdW50KyspIHsKLSAgICAgIGFzc2VydCh1cGJfaW50dGFibGVfbG9va3VwKHQsIHVwYl9pbnR0YWJsZV9pdGVyX2tleSgmaSksIE5VTEwpKTsKLSAgICB9Ci0gICAgYXNzZXJ0KGNvdW50ID09IHVwYl9pbnR0YWJsZV9jb3VudCh0KSk7Ci0gIH0KLSNlbmRpZgotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9zaXplZGluaXQodXBiX2ludHRhYmxlICp0LCB1cGJfY3R5cGVfdCBjdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYXNpemUsIGludCBoc2l6ZV9sZzIpIHsKLSAgc2l6ZV90IGFycmF5X2J5dGVzOwotCi0gIGlmICghaW5pdCgmdC0+dCwgY3R5cGUsIGhzaXplX2xnMikpIHJldHVybiBmYWxzZTsKLSAgLyogQWx3YXlzIG1ha2UgdGhlIGFycmF5IHBhcnQgYXQgbGVhc3QgMSBsb25nLCBzbyB0aGF0IHdlIGtub3cga2V5IDAKLSAgICogd29uJ3QgYmUgaW4gdGhlIGhhc2ggcGFydCwgd2hpY2ggc2ltcGxpZmllcyB0aGluZ3MuICovCi0gIHQtPmFycmF5X3NpemUgPSBVUEJfTUFYKDEsIGFzaXplKTsKLSAgdC0+YXJyYXlfY291bnQgPSAwOwotICBhcnJheV9ieXRlcyA9IHQtPmFycmF5X3NpemUgKiBzaXplb2YodXBiX3ZhbHVlKTsKLSAgdC0+YXJyYXkgPSBtYWxsb2MoYXJyYXlfYnl0ZXMpOwotICBpZiAoIXQtPmFycmF5KSB7Ci0gICAgdW5pbml0KCZ0LT50KTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgbWVtc2V0KG11dGFibGVfYXJyYXkodCksIDB4ZmYsIGFycmF5X2J5dGVzKTsKLSAgY2hlY2sodCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9pbml0KHVwYl9pbnR0YWJsZSAqdCwgdXBiX2N0eXBlX3QgY3R5cGUpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9zaXplZGluaXQodCwgY3R5cGUsIDAsIDQpOwotfQotCi12b2lkIHVwYl9pbnR0YWJsZV91bmluaXQodXBiX2ludHRhYmxlICp0KSB7Ci0gIHVuaW5pdCgmdC0+dCk7Ci0gIGZyZWUobXV0YWJsZV9hcnJheSh0KSk7Ci19Ci0KLWJvb2wgdXBiX2ludHRhYmxlX2luc2VydCh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSB2YWwpIHsKLSAgLyogWFhYOiBUYWJsZSBjYW4ndCBzdG9yZSB2YWx1ZSAodWludDY0X3QpLTEuICBOZWVkIHRvIHNvbWVob3cgc3RhdGljYWxseQotICAgKiBndWFyYW50ZWUgdGhhdCB0aGlzIGlzIG5vdCBuZWNlc3NhcnksIG9yIGZpeCB0aGUgbGltaXRhdGlvbi4gKi8KLSAgdXBiX3RhYnZhbCB0YWJ2YWw7Ci0gIHRhYnZhbC52YWwgPSB2YWwudmFsOwotICBVUEJfVU5VU0VEKHRhYnZhbCk7Ci0gIGFzc2VydCh1cGJfYXJyaGFzKHRhYnZhbCkpOwotCi0gIGlmIChrZXkgPCB0LT5hcnJheV9zaXplKSB7Ci0gICAgYXNzZXJ0KCF1cGJfYXJyaGFzKHQtPmFycmF5W2tleV0pKTsKLSAgICB0LT5hcnJheV9jb3VudCsrOwotICAgIG11dGFibGVfYXJyYXkodClba2V5XS52YWwgPSB2YWwudmFsOwotICB9IGVsc2UgewotICAgIGlmIChpc2Z1bGwoJnQtPnQpKSB7Ci0gICAgICAvKiBOZWVkIHRvIHJlc2l6ZSB0aGUgaGFzaCBwYXJ0LCBidXQgd2UgcmUtdXNlIHRoZSBhcnJheSBwYXJ0LiAqLwotICAgICAgc2l6ZV90IGk7Ci0gICAgICB1cGJfdGFibGUgbmV3X3RhYmxlOwotICAgICAgaWYgKCFpbml0KCZuZXdfdGFibGUsIHQtPnQuY3R5cGUsIHQtPnQuc2l6ZV9sZzIgKyAxKSkKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgZm9yIChpID0gYmVnaW4oJnQtPnQpOyBpIDwgdXBiX3RhYmxlX3NpemUoJnQtPnQpOyBpID0gbmV4dCgmdC0+dCwgaSkpIHsKLSAgICAgICAgY29uc3QgdXBiX3RhYmVudCAqZSA9ICZ0LT50LmVudHJpZXNbaV07Ci0gICAgICAgIHVpbnQzMl90IGhhc2g7Ci0gICAgICAgIHVwYl92YWx1ZSB2OwotCi0gICAgICAgIF91cGJfdmFsdWVfc2V0dmFsKCZ2LCBlLT52YWwudmFsLCB0LT50LmN0eXBlKTsKLSAgICAgICAgaGFzaCA9IHVwYl9pbnRoYXNoKGUtPmtleSk7Ci0gICAgICAgIGluc2VydCgmbmV3X3RhYmxlLCBpbnRrZXkoZS0+a2V5KSwgZS0+a2V5LCB2LCBoYXNoLCAmaW50aGFzaCwgJmludGVxbCk7Ci0gICAgICB9Ci0KLSAgICAgIGFzc2VydCh0LT50LmNvdW50ID09IG5ld190YWJsZS5jb3VudCk7Ci0KLSAgICAgIHVuaW5pdCgmdC0+dCk7Ci0gICAgICB0LT50ID0gbmV3X3RhYmxlOwotICAgIH0KLSAgICBpbnNlcnQoJnQtPnQsIGludGtleShrZXkpLCBrZXksIHZhbCwgdXBiX2ludGhhc2goa2V5KSwgJmludGhhc2gsICZpbnRlcWwpOwotICB9Ci0gIGNoZWNrKHQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfbG9va3VwKGNvbnN0IHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSwgdXBiX3ZhbHVlICp2KSB7Ci0gIGNvbnN0IHVwYl90YWJ2YWwgKnRhYmxlX3YgPSBpbnR0YWJsZV92YWxfY29uc3QodCwga2V5KTsKLSAgaWYgKCF0YWJsZV92KSByZXR1cm4gZmFsc2U7Ci0gIGlmICh2KSBfdXBiX3ZhbHVlX3NldHZhbCh2LCB0YWJsZV92LT52YWwsIHQtPnQuY3R5cGUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfcmVwbGFjZSh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSB2YWwpIHsKLSAgdXBiX3RhYnZhbCAqdGFibGVfdiA9IGludHRhYmxlX3ZhbCh0LCBrZXkpOwotICBpZiAoIXRhYmxlX3YpIHJldHVybiBmYWxzZTsKLSAgdGFibGVfdi0+dmFsID0gdmFsLnZhbDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdXBiX2ludHRhYmxlX3JlbW92ZSh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSAqdmFsKSB7Ci0gIGJvb2wgc3VjY2VzczsKLSAgaWYgKGtleSA8IHQtPmFycmF5X3NpemUpIHsKLSAgICBpZiAodXBiX2Fycmhhcyh0LT5hcnJheVtrZXldKSkgewotICAgICAgdXBiX3RhYnZhbCBlbXB0eSA9IFVQQl9UQUJWQUxVRV9FTVBUWV9JTklUOwotICAgICAgdC0+YXJyYXlfY291bnQtLTsKLSAgICAgIGlmICh2YWwpIHsKLSAgICAgICAgX3VwYl92YWx1ZV9zZXR2YWwodmFsLCB0LT5hcnJheVtrZXldLnZhbCwgdC0+dC5jdHlwZSk7Ci0gICAgICB9Ci0gICAgICBtdXRhYmxlX2FycmF5KHQpW2tleV0gPSBlbXB0eTsKLSAgICAgIHN1Y2Nlc3MgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHVwYl90YWJrZXkgcmVtb3ZlZDsKLSAgICB1aW50MzJfdCBoYXNoID0gdXBiX2ludGhhc2goa2V5KTsKLSAgICBzdWNjZXNzID0gcm0oJnQtPnQsIGludGtleShrZXkpLCB2YWwsICZyZW1vdmVkLCBoYXNoLCAmaW50ZXFsKTsKLSAgfQotICBjaGVjayh0KTsKLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLWJvb2wgdXBiX2ludHRhYmxlX3B1c2godXBiX2ludHRhYmxlICp0LCB1cGJfdmFsdWUgdmFsKSB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfaW5zZXJ0KHQsIHVwYl9pbnR0YWJsZV9jb3VudCh0KSwgdmFsKTsKLX0KLQotdXBiX3ZhbHVlIHVwYl9pbnR0YWJsZV9wb3AodXBiX2ludHRhYmxlICp0KSB7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0gIGJvb2wgb2sgPSB1cGJfaW50dGFibGVfcmVtb3ZlKHQsIHVwYl9pbnR0YWJsZV9jb3VudCh0KSAtIDEsICZ2YWwpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gdmFsOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9pbnNlcnRwdHIodXBiX2ludHRhYmxlICp0LCBjb25zdCB2b2lkICprZXksIHVwYl92YWx1ZSB2YWwpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9pbnNlcnQodCwgKHVpbnRwdHJfdClrZXksIHZhbCk7Ci19Ci0KLWJvb2wgdXBiX2ludHRhYmxlX2xvb2t1cHB0cihjb25zdCB1cGJfaW50dGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfdmFsdWUgKnYpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9sb29rdXAodCwgKHVpbnRwdHJfdClrZXksIHYpOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIodXBiX2ludHRhYmxlICp0LCBjb25zdCB2b2lkICprZXksIHVwYl92YWx1ZSAqdmFsKSB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfcmVtb3ZlKHQsICh1aW50cHRyX3Qpa2V5LCB2YWwpOwotfQotCi12b2lkIHVwYl9pbnR0YWJsZV9jb21wYWN0KHVwYl9pbnR0YWJsZSAqdCkgewotICAvKiBDcmVhdGUgYSBwb3dlci1vZi10d28gaGlzdG9ncmFtIG9mIHRoZSB0YWJsZSBrZXlzLiAqLwotICBpbnQgY291bnRzW1VQQl9NQVhBUlJTSVpFICsgMV0gPSB7MH07Ci0gIHVpbnRwdHJfdCBtYXhfa2V5ID0gMDsKLSAgdXBiX2ludHRhYmxlX2l0ZXIgaTsKLSAgc2l6ZV90IGFycl9zaXplOwotICBpbnQgYXJyX2NvdW50OwotICB1cGJfaW50dGFibGUgbmV3X3Q7Ci0KLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCB0KTsKLSAgZm9yICg7ICF1cGJfaW50dGFibGVfZG9uZSgmaSk7IHVwYl9pbnR0YWJsZV9uZXh0KCZpKSkgewotICAgIHVpbnRwdHJfdCBrZXkgPSB1cGJfaW50dGFibGVfaXRlcl9rZXkoJmkpOwotICAgIGlmIChrZXkgPiBtYXhfa2V5KSB7Ci0gICAgICBtYXhfa2V5ID0ga2V5OwotICAgIH0KLSAgICBjb3VudHNbbG9nMmNlaWwoa2V5KV0rKzsKLSAgfQotCi0gIGFycl9zaXplID0gMTsKLSAgYXJyX2NvdW50ID0gdXBiX2ludHRhYmxlX2NvdW50KHQpOwotCi0gIGlmICh1cGJfaW50dGFibGVfY291bnQodCkgPj0gbWF4X2tleSAqIE1JTl9ERU5TSVRZKSB7Ci0gICAgLyogV2UgY2FuIHB1dCAxMDAlIG9mIHRoZSBlbnRyaWVzIGluIHRoZSBhcnJheSBwYXJ0LiAqLwotICAgIGFycl9zaXplID0gbWF4X2tleSArIDE7Ci0gIH0gZWxzZSB7Ci0gICAgLyogRmluZCB0aGUgbGFyZ2VzdCBwb3dlciBvZiB0d28gdGhhdCBzYXRpc2ZpZXMgdGhlIE1JTl9ERU5TSVRZCi0gICAgICogZGVmaW5pdGlvbi4gKi8KLSAgICBpbnQgc2l6ZV9sZzI7Ci0gICAgZm9yIChzaXplX2xnMiA9IEFSUkFZX1NJWkUoY291bnRzKSAtIDE7IHNpemVfbGcyID4gMTsgc2l6ZV9sZzItLSkgewotICAgICAgYXJyX3NpemUgPSAxIDw8IHNpemVfbGcyOwotICAgICAgYXJyX2NvdW50IC09IGNvdW50c1tzaXplX2xnMl07Ci0gICAgICBpZiAoYXJyX2NvdW50ID49IGFycl9zaXplICogTUlOX0RFTlNJVFkpIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogQXJyYXkgcGFydCBtdXN0IGFsd2F5cyBiZSBhdCBsZWFzdCAxIGVudHJ5IGxhcmdlIHRvIGNhdGNoIGxvb2t1cHMgb2Yga2V5Ci0gICAqIDAuICBLZXkgMCBtdXN0IGFsd2F5cyBiZSBpbiB0aGUgYXJyYXkgcGFydCBiZWNhdXNlICIwIiBpbiB0aGUgaGFzaCBwYXJ0Ci0gICAqIGRlbm90ZXMgYW4gZW1wdHkgZW50cnkuICovCi0gIGFycl9zaXplID0gVVBCX01BWChhcnJfc2l6ZSwgMSk7Ci0KLSAgewotICAgIC8qIEluc2VydCBhbGwgZWxlbWVudHMgaW50byBuZXcsIHBlcmZlY3RseS1zaXplZCB0YWJsZS4gKi8KLSAgICBpbnQgaGFzaF9jb3VudCA9IHVwYl9pbnR0YWJsZV9jb3VudCh0KSAtIGFycl9jb3VudDsKLSAgICBpbnQgaGFzaF9zaXplID0gaGFzaF9jb3VudCA/IChoYXNoX2NvdW50IC8gTUFYX0xPQUQpICsgMSA6IDA7Ci0gICAgaW50IGhhc2hzaXplX2xnMiA9IGxvZzJjZWlsKGhhc2hfc2l6ZSk7Ci0KLSAgICBhc3NlcnQoaGFzaF9jb3VudCA+PSAwKTsKLSAgICB1cGJfaW50dGFibGVfc2l6ZWRpbml0KCZuZXdfdCwgdC0+dC5jdHlwZSwgYXJyX3NpemUsIGhhc2hzaXplX2xnMik7Ci0gICAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCB0KTsKLSAgICBmb3IgKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpKTsgdXBiX2ludHRhYmxlX25leHQoJmkpKSB7Ci0gICAgICB1aW50cHRyX3QgayA9IHVwYl9pbnR0YWJsZV9pdGVyX2tleSgmaSk7Ci0gICAgICB1cGJfaW50dGFibGVfaW5zZXJ0KCZuZXdfdCwgaywgdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpKTsKLSAgICB9Ci0gICAgYXNzZXJ0KG5ld190LmFycmF5X3NpemUgPT0gYXJyX3NpemUpOwotICAgIGFzc2VydChuZXdfdC50LnNpemVfbGcyID09IGhhc2hzaXplX2xnMik7Ci0gIH0KLSAgdXBiX2ludHRhYmxlX3VuaW5pdCh0KTsKLSAgKnQgPSBuZXdfdDsKLX0KLQotLyogSXRlcmF0aW9uLiAqLwotCi1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCAqaW50X3RhYmVudChjb25zdCB1cGJfaW50dGFibGVfaXRlciAqaSkgewotICBhc3NlcnQoIWktPmFycmF5X3BhcnQpOwotICByZXR1cm4gJmktPnQtPnQuZW50cmllc1tpLT5pbmRleF07Ci19Ci0KLXN0YXRpYyB1cGJfdGFidmFsIGludF9hcnJlbnQoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpIHsKLSAgYXNzZXJ0KGktPmFycmF5X3BhcnQpOwotICByZXR1cm4gaS0+dC0+YXJyYXlbaS0+aW5kZXhdOwotfQotCi12b2lkIHVwYl9pbnR0YWJsZV9iZWdpbih1cGJfaW50dGFibGVfaXRlciAqaSwgY29uc3QgdXBiX2ludHRhYmxlICp0KSB7Ci0gIGktPnQgPSB0OwotICBpLT5pbmRleCA9IC0xOwotICBpLT5hcnJheV9wYXJ0ID0gdHJ1ZTsKLSAgdXBiX2ludHRhYmxlX25leHQoaSk7Ci19Ci0KLXZvaWQgdXBiX2ludHRhYmxlX25leHQodXBiX2ludHRhYmxlX2l0ZXIgKml0ZXIpIHsKLSAgY29uc3QgdXBiX2ludHRhYmxlICp0ID0gaXRlci0+dDsKLSAgaWYgKGl0ZXItPmFycmF5X3BhcnQpIHsKLSAgICB3aGlsZSAoKytpdGVyLT5pbmRleCA8IHQtPmFycmF5X3NpemUpIHsKLSAgICAgIGlmICh1cGJfYXJyaGFzKGludF9hcnJlbnQoaXRlcikpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gICAgaXRlci0+YXJyYXlfcGFydCA9IGZhbHNlOwotICAgIGl0ZXItPmluZGV4ID0gYmVnaW4oJnQtPnQpOwotICB9IGVsc2UgewotICAgIGl0ZXItPmluZGV4ID0gbmV4dCgmdC0+dCwgaXRlci0+aW5kZXgpOwotICB9Ci19Ci0KLWJvb2wgdXBiX2ludHRhYmxlX2RvbmUoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpIHsKLSAgaWYgKGktPmFycmF5X3BhcnQpIHsKLSAgICByZXR1cm4gaS0+aW5kZXggPj0gaS0+dC0+YXJyYXlfc2l6ZSB8fAotICAgICAgICAgICAhdXBiX2FycmhhcyhpbnRfYXJyZW50KGkpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gaS0+aW5kZXggPj0gdXBiX3RhYmxlX3NpemUoJmktPnQtPnQpIHx8Ci0gICAgICAgICAgIHVwYl90YWJlbnRfaXNlbXB0eShpbnRfdGFiZW50KGkpKTsKLSAgfQotfQotCi11aW50cHRyX3QgdXBiX2ludHRhYmxlX2l0ZXJfa2V5KGNvbnN0IHVwYl9pbnR0YWJsZV9pdGVyICppKSB7Ci0gIGFzc2VydCghdXBiX2ludHRhYmxlX2RvbmUoaSkpOwotICByZXR1cm4gaS0+YXJyYXlfcGFydCA/IGktPmluZGV4IDogaW50X3RhYmVudChpKS0+a2V5OwotfQotCi11cGJfdmFsdWUgdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpIHsKLSAgYXNzZXJ0KCF1cGJfaW50dGFibGVfZG9uZShpKSk7Ci0gIHJldHVybiBfdXBiX3ZhbHVlX3ZhbCgKLSAgICAgIGktPmFycmF5X3BhcnQgPyBpLT50LT5hcnJheVtpLT5pbmRleF0udmFsIDogaW50X3RhYmVudChpKS0+dmFsLnZhbCwKLSAgICAgIGktPnQtPnQuY3R5cGUpOwotfQotCi12b2lkIHVwYl9pbnR0YWJsZV9pdGVyX3NldGRvbmUodXBiX2ludHRhYmxlX2l0ZXIgKmkpIHsKLSAgaS0+aW5kZXggPSBTSVpFX01BWDsKLSAgaS0+YXJyYXlfcGFydCA9IGZhbHNlOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9pdGVyX2lzZXF1YWwoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkyKSB7Ci0gIGlmICh1cGJfaW50dGFibGVfZG9uZShpMSkgJiYgdXBiX2ludHRhYmxlX2RvbmUoaTIpKQotICAgIHJldHVybiB0cnVlOwotICByZXR1cm4gaTEtPnQgPT0gaTItPnQgJiYgaTEtPmluZGV4ID09IGkyLT5pbmRleCAmJgotICAgICAgICAgaTEtPmFycmF5X3BhcnQgPT0gaTItPmFycmF5X3BhcnQ7Ci19Ci0KLSNpZmRlZiBVUEJfVU5BTElHTkVEX1JFQURTX09LCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTXVybXVySGFzaDIsIGJ5IEF1c3RpbiBBcHBsZWJ5IChyZWxlYXNlZCBhcyBwdWJsaWMgZG9tYWluKS4KLSAqIFJlZm9ybWF0dGVkIGFuZCBDOTktaWZpZWQgYnkgSm9zaHVhIEhhYmVybWFuLgotICogTm90ZSAtIFRoaXMgY29kZSBtYWtlcyBhIGZldyBhc3N1bXB0aW9ucyBhYm91dCBob3cgeW91ciBtYWNoaW5lIGJlaGF2ZXMgLQotICogICAxLiBXZSBjYW4gcmVhZCBhIDQtYnl0ZSB2YWx1ZSBmcm9tIGFueSBhZGRyZXNzIHdpdGhvdXQgY3Jhc2hpbmcKLSAqICAgMi4gc2l6ZW9mKGludCkgPT0gNCAoaW4gdXBiIHRoaXMgbGltaXRhdGlvbiBpcyByZW1vdmVkIGJ5IHVzaW5nIHVpbnQzMl90Ci0gKiBBbmQgaXQgaGFzIGEgZmV3IGxpbWl0YXRpb25zIC0KLSAqICAgMS4gSXQgd2lsbCBub3Qgd29yayBpbmNyZW1lbnRhbGx5LgotICogICAyLiBJdCB3aWxsIG5vdCBwcm9kdWNlIHRoZSBzYW1lIHJlc3VsdHMgb24gbGl0dGxlLWVuZGlhbiBhbmQgYmlnLWVuZGlhbgotICogICAgICBtYWNoaW5lcy4gKi8KLXVpbnQzMl90IE11cm11ckhhc2gyKGNvbnN0IHZvaWQgKmtleSwgc2l6ZV90IGxlbiwgdWludDMyX3Qgc2VlZCkgewotICAvKiAnbScgYW5kICdyJyBhcmUgbWl4aW5nIGNvbnN0YW50cyBnZW5lcmF0ZWQgb2ZmbGluZS4KLSAgICogVGhleSdyZSBub3QgcmVhbGx5ICdtYWdpYycsIHRoZXkganVzdCBoYXBwZW4gdG8gd29yayB3ZWxsLiAqLwotICBjb25zdCB1aW50MzJfdCBtID0gMHg1YmQxZTk5NTsKLSAgY29uc3QgaW50MzJfdCByID0gMjQ7Ci0KLSAgLyogSW5pdGlhbGl6ZSB0aGUgaGFzaCB0byBhICdyYW5kb20nIHZhbHVlICovCi0gIHVpbnQzMl90IGggPSBzZWVkIF4gbGVuOwotCi0gIC8qIE1peCA0IGJ5dGVzIGF0IGEgdGltZSBpbnRvIHRoZSBoYXNoICovCi0gIGNvbnN0IHVpbnQ4X3QgKiBkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilrZXk7Ci0gIHdoaWxlKGxlbiA+PSA0KSB7Ci0gICAgdWludDMyX3QgayA9ICoodWludDMyX3QgKilkYXRhOwotCi0gICAgayAqPSBtOwotICAgIGsgXj0gayA+PiByOwotICAgIGsgKj0gbTsKLQotICAgIGggKj0gbTsKLSAgICBoIF49IGs7Ci0KLSAgICBkYXRhICs9IDQ7Ci0gICAgbGVuIC09IDQ7Ci0gIH0KLQotICAvKiBIYW5kbGUgdGhlIGxhc3QgZmV3IGJ5dGVzIG9mIHRoZSBpbnB1dCBhcnJheSAqLwotICBzd2l0Y2gobGVuKSB7Ci0gICAgY2FzZSAzOiBoIF49IGRhdGFbMl0gPDwgMTY7Ci0gICAgY2FzZSAyOiBoIF49IGRhdGFbMV0gPDwgODsKLSAgICBjYXNlIDE6IGggXj0gZGF0YVswXTsgaCAqPSBtOwotICB9OwotCi0gIC8qIERvIGEgZmV3IGZpbmFsIG1peGVzIG9mIHRoZSBoYXNoIHRvIGVuc3VyZSB0aGUgbGFzdCBmZXcKLSAgICogYnl0ZXMgYXJlIHdlbGwtaW5jb3Jwb3JhdGVkLiAqLwotICBoIF49IGggPj4gMTM7Ci0gIGggKj0gbTsKLSAgaCBePSBoID4+IDE1OwotCi0gIHJldHVybiBoOwotfQotCi0jZWxzZSAvKiAhVVBCX1VOQUxJR05FRF9SRUFEU19PSyAqLwotCi0vKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogTXVybXVySGFzaEFsaWduZWQyLCBieSBBdXN0aW4gQXBwbGVieQotICogU2FtZSBhbGdvcml0aG0gYXMgTXVybXVySGFzaDIsIGJ1dCBvbmx5IGRvZXMgYWxpZ25lZCByZWFkcyAtIHNob3VsZCBiZSBzYWZlcgotICogb24gY2VydGFpbiBwbGF0Zm9ybXMuCi0gKiBQZXJmb3JtYW5jZSB3aWxsIGJlIGxvd2VyIHRoYW4gTXVybXVySGFzaDIgKi8KLQotI2RlZmluZSBNSVgoaCxrLG0pIHsgayAqPSBtOyBrIF49IGsgPj4gcjsgayAqPSBtOyBoICo9IG07IGggXj0gazsgfQotCi11aW50MzJfdCBNdXJtdXJIYXNoMihjb25zdCB2b2lkICoga2V5LCBzaXplX3QgbGVuLCB1aW50MzJfdCBzZWVkKSB7Ci0gIGNvbnN0IHVpbnQzMl90IG0gPSAweDViZDFlOTk1OwotICBjb25zdCBpbnQzMl90IHIgPSAyNDsKLSAgY29uc3QgdWludDhfdCAqIGRhdGEgPSAoY29uc3QgdWludDhfdCAqKWtleTsKLSAgdWludDMyX3QgaCA9IHNlZWQgXiBsZW47Ci0gIHVpbnQ4X3QgYWxpZ24gPSAodWludHB0cl90KWRhdGEgJiAzOwotCi0gIGlmKGFsaWduICYmIChsZW4gPj0gNCkpIHsKLSAgICAvKiBQcmUtbG9hZCB0aGUgdGVtcCByZWdpc3RlcnMgKi8KLSAgICB1aW50MzJfdCB0ID0gMCwgZCA9IDA7Ci0gICAgaW50MzJfdCBzbDsKLSAgICBpbnQzMl90IHNyOwotCi0gICAgc3dpdGNoKGFsaWduKSB7Ci0gICAgICBjYXNlIDE6IHQgfD0gZGF0YVsyXSA8PCAxNjsKLSAgICAgIGNhc2UgMjogdCB8PSBkYXRhWzFdIDw8IDg7Ci0gICAgICBjYXNlIDM6IHQgfD0gZGF0YVswXTsKLSAgICB9Ci0KLSAgICB0IDw8PSAoOCAqIGFsaWduKTsKLQotICAgIGRhdGEgKz0gNC1hbGlnbjsKLSAgICBsZW4gLT0gNC1hbGlnbjsKLQotICAgIHNsID0gOCAqICg0LWFsaWduKTsKLSAgICBzciA9IDggKiBhbGlnbjsKLQotICAgIC8qIE1peCAqLwotCi0gICAgd2hpbGUobGVuID49IDQpIHsKLSAgICAgIHVpbnQzMl90IGs7Ci0KLSAgICAgIGQgPSAqKHVpbnQzMl90ICopZGF0YTsKLSAgICAgIHQgPSAodCA+PiBzcikgfCAoZCA8PCBzbCk7Ci0KLSAgICAgIGsgPSB0OwotCi0gICAgICBNSVgoaCxrLG0pOwotCi0gICAgICB0ID0gZDsKLQotICAgICAgZGF0YSArPSA0OwotICAgICAgbGVuIC09IDQ7Ci0gICAgfQotCi0gICAgLyogSGFuZGxlIGxlZnRvdmVyIGRhdGEgaW4gdGVtcCByZWdpc3RlcnMgKi8KLQotICAgIGQgPSAwOwotCi0gICAgaWYobGVuID49IGFsaWduKSB7Ci0gICAgICB1aW50MzJfdCBrOwotCi0gICAgICBzd2l0Y2goYWxpZ24pIHsKLSAgICAgICAgY2FzZSAzOiBkIHw9IGRhdGFbMl0gPDwgMTY7Ci0gICAgICAgIGNhc2UgMjogZCB8PSBkYXRhWzFdIDw8IDg7Ci0gICAgICAgIGNhc2UgMTogZCB8PSBkYXRhWzBdOwotICAgICAgfQotCi0gICAgICBrID0gKHQgPj4gc3IpIHwgKGQgPDwgc2wpOwotICAgICAgTUlYKGgsayxtKTsKLQotICAgICAgZGF0YSArPSBhbGlnbjsKLSAgICAgIGxlbiAtPSBhbGlnbjsKLQotICAgICAgLyogLS0tLS0tLS0tLQotICAgICAgICogSGFuZGxlIHRhaWwgYnl0ZXMgKi8KLQotICAgICAgc3dpdGNoKGxlbikgewotICAgICAgICBjYXNlIDM6IGggXj0gZGF0YVsyXSA8PCAxNjsKLSAgICAgICAgY2FzZSAyOiBoIF49IGRhdGFbMV0gPDwgODsKLSAgICAgICAgY2FzZSAxOiBoIF49IGRhdGFbMF07IGggKj0gbTsKLSAgICAgIH07Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN3aXRjaChsZW4pIHsKLSAgICAgICAgY2FzZSAzOiBkIHw9IGRhdGFbMl0gPDwgMTY7Ci0gICAgICAgIGNhc2UgMjogZCB8PSBkYXRhWzFdIDw8IDg7Ci0gICAgICAgIGNhc2UgMTogZCB8PSBkYXRhWzBdOwotICAgICAgICBjYXNlIDA6IGggXj0gKHQgPj4gc3IpIHwgKGQgPDwgc2wpOyBoICo9IG07Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaCBePSBoID4+IDEzOwotICAgIGggKj0gbTsKLSAgICBoIF49IGggPj4gMTU7Ci0KLSAgICByZXR1cm4gaDsKLSAgfSBlbHNlIHsKLSAgICB3aGlsZShsZW4gPj0gNCkgewotICAgICAgdWludDMyX3QgayA9ICoodWludDMyX3QgKilkYXRhOwotCi0gICAgICBNSVgoaCxrLG0pOwotCi0gICAgICBkYXRhICs9IDQ7Ci0gICAgICBsZW4gLT0gNDsKLSAgICB9Ci0KLSAgICAvKiAtLS0tLS0tLS0tCi0gICAgICogSGFuZGxlIHRhaWwgYnl0ZXMgKi8KLQotICAgIHN3aXRjaChsZW4pIHsKLSAgICAgIGNhc2UgMzogaCBePSBkYXRhWzJdIDw8IDE2OwotICAgICAgY2FzZSAyOiBoIF49IGRhdGFbMV0gPDwgODsKLSAgICAgIGNhc2UgMTogaCBePSBkYXRhWzBdOyBoICo9IG07Ci0gICAgfTsKLQotICAgIGggXj0gaCA+PiAxMzsKLSAgICBoICo9IG07Ci0gICAgaCBePSBoID4+IDE1OwotCi0gICAgcmV0dXJuIGg7Ci0gIH0KLX0KLSN1bmRlZiBNSVgKLQotI2VuZGlmIC8qIFVQQl9VTkFMSUdORURfUkVBRFNfT0sgKi8KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotYm9vbCB1cGJfZHVtcHRvc3RkZXJyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHVwYl9zdGF0dXMqIHN0YXR1cykgewotICBVUEJfVU5VU0VEKGNsb3N1cmUpOwotICBmcHJpbnRmKHN0ZGVyciwgIiVzXG4iLCB1cGJfc3RhdHVzX2Vycm1zZyhzdGF0dXMpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vKiBHdWFyYW50ZWUgbnVsbC10ZXJtaW5hdGlvbiBhbmQgcHJvdmlkZSBlbGxpcHNpcyB0cnVuY2F0aW9uLgotICogSXQgbWF5IGJlIHRlbXB0aW5nIHRvICJvcHRpbWl6ZSIgdGhpcyBieSBpbml0aWFsaXppbmcgdGhlc2UgZmluYWwKLSAqIGZvdXIgYnl0ZXMgdXAtZnJvbnQgYW5kIHRoZW4gYmVpbmcgY2FyZWZ1bCBuZXZlciB0byBvdmVyd3JpdGUgdGhlbSwKLSAqIHRoaXMgaXMgc2FmZXIgYW5kIHNpbXBsZXIuICovCi1zdGF0aWMgdm9pZCBudWxseih1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgY29uc3QgY2hhciAqZWxsaXBzaXMgPSAiLi4uIjsKLSAgc2l6ZV90IGxlbiA9IHN0cmxlbihlbGxpcHNpcyk7Ci0gIGFzc2VydChzaXplb2Yoc3RhdHVzLT5tc2cpID4gbGVuKTsKLSAgbWVtY3B5KHN0YXR1cy0+bXNnICsgc2l6ZW9mKHN0YXR1cy0+bXNnKSAtIGxlbiwgZWxsaXBzaXMsIGxlbik7Ci19Ci0KLXZvaWQgdXBiX3N0YXR1c19jbGVhcih1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgaWYgKCFzdGF0dXMpIHJldHVybjsKLSAgc3RhdHVzLT5va18gPSB0cnVlOwotICBzdGF0dXMtPmNvZGVfID0gMDsKLSAgc3RhdHVzLT5tc2dbMF0gPSAnXDAnOwotfQotCi1ib29sIHVwYl9vayhjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpIHsgcmV0dXJuIHN0YXR1cy0+b2tfOyB9Ci0KLXVwYl9lcnJvcnNwYWNlICp1cGJfc3RhdHVzX2VycnNwYWNlKGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cykgewotICByZXR1cm4gc3RhdHVzLT5lcnJvcl9zcGFjZV87Ci19Ci0KLWludCB1cGJfc3RhdHVzX2VycmNvZGUoY29uc3QgdXBiX3N0YXR1cyAqc3RhdHVzKSB7IHJldHVybiBzdGF0dXMtPmNvZGVfOyB9Ci0KLWNvbnN0IGNoYXIgKnVwYl9zdGF0dXNfZXJybXNnKGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cykgeyByZXR1cm4gc3RhdHVzLT5tc2c7IH0KLQotdm9pZCB1cGJfc3RhdHVzX3NldGVycm1zZyh1cGJfc3RhdHVzICpzdGF0dXMsIGNvbnN0IGNoYXIgKm1zZykgewotICBpZiAoIXN0YXR1cykgcmV0dXJuOwotICBzdGF0dXMtPm9rXyA9IGZhbHNlOwotICBzdHJuY3B5KHN0YXR1cy0+bXNnLCBtc2csIHNpemVvZihzdGF0dXMtPm1zZykpOwotICBudWxseihzdGF0dXMpOwotfQotCi12b2lkIHVwYl9zdGF0dXNfc2V0ZXJyZih1cGJfc3RhdHVzICpzdGF0dXMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLSAgdXBiX3N0YXR1c192c2V0ZXJyZihzdGF0dXMsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLX0KLQotdm9pZCB1cGJfc3RhdHVzX3ZzZXRlcnJmKHVwYl9zdGF0dXMgKnN0YXR1cywgY29uc3QgY2hhciAqZm10LCB2YV9saXN0IGFyZ3MpIHsKLSAgaWYgKCFzdGF0dXMpIHJldHVybjsKLSAgc3RhdHVzLT5va18gPSBmYWxzZTsKLSAgX3VwYl92c25wcmludGYoc3RhdHVzLT5tc2csIHNpemVvZihzdGF0dXMtPm1zZyksIGZtdCwgYXJncyk7Ci0gIG51bGx6KHN0YXR1cyk7Ci19Ci0KLXZvaWQgdXBiX3N0YXR1c19zZXRlcnJjb2RlKHVwYl9zdGF0dXMgKnN0YXR1cywgdXBiX2Vycm9yc3BhY2UgKnNwYWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvZGUpIHsKLSAgaWYgKCFzdGF0dXMpIHJldHVybjsKLSAgc3RhdHVzLT5va18gPSBmYWxzZTsKLSAgc3RhdHVzLT5lcnJvcl9zcGFjZV8gPSBzcGFjZTsKLSAgc3RhdHVzLT5jb2RlXyA9IGNvZGU7Ci0gIHNwYWNlLT5zZXRfbWVzc2FnZShzdGF0dXMsIGNvZGUpOwotfQotCi12b2lkIHVwYl9zdGF0dXNfY29weSh1cGJfc3RhdHVzICp0bywgY29uc3QgdXBiX3N0YXR1cyAqZnJvbSkgewotICBpZiAoIXRvKSByZXR1cm47Ci0gICp0byA9ICpmcm9tOwotfQotLyogVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgdXBiYyAodGhlIHVwYiBjb21waWxlcikuCi0gKiBEbyBub3QgZWRpdCAtLSB5b3VyIGNoYW5nZXMgd2lsbCBiZSBkaXNjYXJkZWQgd2hlbiB0aGUgZmlsZSBpcwotICogcmVnZW5lcmF0ZWQuICovCi0KLQotc3RhdGljIGNvbnN0IHVwYl9tc2dkZWYgbXNnc1syMF07Ci1zdGF0aWMgY29uc3QgdXBiX2ZpZWxkZGVmIGZpZWxkc1s4MV07Ci1zdGF0aWMgY29uc3QgdXBiX2VudW1kZWYgZW51bXNbNF07Ci1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCBzdHJlbnRyaWVzWzIzNl07Ci1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCBpbnRlbnRyaWVzWzE0XTsKLXN0YXRpYyBjb25zdCB1cGJfdGFidmFsIGFycmF5c1syMzJdOwotCi0jaWZkZWYgVVBCX0RFQlVHX1JFRlMKLXN0YXRpYyB1cGJfaW50dGFibGUgcmVmdGFibGVzWzIxMl07Ci0jZW5kaWYKLQotc3RhdGljIGNvbnN0IHVwYl9tc2dkZWYgbXNnc1syMF0gPSB7Ci0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byIsIDI3LCA2LCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzBdLCA4LCA3KSwgVVBCX1NUUlRBQkxFX0lOSVQoNywgMTUsIFVQQl9DVFlQRV9QVFIsIDQsICZzdHJlbnRyaWVzWzBdKSwmcmVmdGFibGVzWzBdLCAmcmVmdGFibGVzWzFdKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIiwgNCwgMCwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1s4XSwgMywgMiksIFVQQl9TVFJUQUJMRV9JTklUKDIsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZzdHJlbnRyaWVzWzE2XSksJnJlZnRhYmxlc1syXSwgJnJlZnRhYmxlc1szXSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8iLCAxMSwgMiwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1sxMV0sIDQsIDMpLCBVUEJfU1RSVEFCTEVfSU5JVCgzLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1syMF0pLCZyZWZ0YWJsZXNbNF0sICZyZWZ0YWJsZXNbNV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyIsIDcsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDEsIDEsIFVQQl9DVFlQRV9QVFIsIDEsICZpbnRlbnRyaWVzWzBdLCAmYXJyYXlzWzE1XSwgOCwgMSksIFVQQl9TVFJUQUJMRV9JTklUKDIsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZzdHJlbnRyaWVzWzI0XSksJnJlZnRhYmxlc1s2XSwgJnJlZnRhYmxlc1s3XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byIsIDgsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbMjNdLCA0LCAzKSwgVVBCX1NUUlRBQkxFX0lOSVQoMywgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMjhdKSwmcmVmdGFibGVzWzhdLCAmcmVmdGFibGVzWzldKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyIsIDYsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDEsIDEsIFVQQl9DVFlQRV9QVFIsIDEsICZpbnRlbnRyaWVzWzJdLCAmYXJyYXlzWzI3XSwgNCwgMCksIFVQQl9TVFJUQUJMRV9JTklUKDEsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZzdHJlbnRyaWVzWzMyXSksJnJlZnRhYmxlc1sxMF0sICZyZWZ0YWJsZXNbMTFdKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8iLCAxOSwgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1szMV0sIDksIDgpLCBVUEJfU1RSVEFCTEVfSU5JVCg4LCAxNSwgVVBCX0NUWVBFX1BUUiwgNCwgJnN0cmVudHJpZXNbMzZdKSwmcmVmdGFibGVzWzEyXSwgJnJlZnRhYmxlc1sxM10pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMiLCAxNCwgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMSwgMSwgVVBCX0NUWVBFX1BUUiwgMSwgJmludGVudHJpZXNbNF0sICZhcnJheXNbNDBdLCAzMiwgNiksIFVQQl9TVFJUQUJMRV9JTklUKDcsIDE1LCBVUEJfQ1RZUEVfUFRSLCA0LCAmc3RyZW50cmllc1s1Ml0pLCZyZWZ0YWJsZXNbMTRdLCAmcmVmdGFibGVzWzE1XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8iLCAzOSwgNiwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1s3Ml0sIDEyLCAxMSksIFVQQl9TVFJUQUJMRV9JTklUKDExLCAxNSwgVVBCX0NUWVBFX1BUUiwgNCwgJnN0cmVudHJpZXNbNjhdKSwmcmVmdGFibGVzWzE2XSwgJnJlZnRhYmxlc1sxN10pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCIsIDYsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbODRdLCAyLCAxKSwgVVBCX1NUUlRBQkxFX0lOSVQoMSwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbODRdKSwmcmVmdGFibGVzWzE4XSwgJnJlZnRhYmxlc1sxOV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyIsIDIxLCAxLCBVUEJfSU5UVEFCTEVfSU5JVCgxLCAxLCBVUEJfQ1RZUEVfUFRSLCAxLCAmaW50ZW50cmllc1s2XSwgJmFycmF5c1s4Nl0sIDY0LCA5KSwgVVBCX1NUUlRBQkxFX0lOSVQoMTAsIDE1LCBVUEJfQ1RZUEVfUFRSLCA0LCAmc3RyZW50cmllc1s4OF0pLCZyZWZ0YWJsZXNbMjBdLCAmcmVmdGFibGVzWzIxXSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIiwgOCwgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMSwgMSwgVVBCX0NUWVBFX1BUUiwgMSwgJmludGVudHJpZXNbOF0sICZhcnJheXNbMTUwXSwgMTYsIDIpLCBVUEJfU1RSVEFCTEVfSU5JVCgzLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1sxMDRdKSwmcmVmdGFibGVzWzIyXSwgJnJlZnRhYmxlc1syM10pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8iLCAxMywgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1sxNjZdLCA1LCA0KSwgVVBCX1NUUlRBQkxFX0lOSVQoNCwgNywgVVBCX0NUWVBFX1BUUiwgMywgJnN0cmVudHJpZXNbMTA4XSksJnJlZnRhYmxlc1syNF0sICZyZWZ0YWJsZXNbMjVdKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyIsIDYsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDEsIDEsIFVQQl9DVFlQRV9QVFIsIDEsICZpbnRlbnRyaWVzWzEwXSwgJmFycmF5c1sxNzFdLCA0LCAwKSwgVVBCX1NUUlRBQkxFX0lOSVQoMSwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMTE2XSksJnJlZnRhYmxlc1syNl0sICZyZWZ0YWJsZXNbMjddKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byIsIDExLCAyLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzE3NV0sIDQsIDMpLCBVUEJfU1RSVEFCTEVfSU5JVCgzLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1sxMjBdKSwmcmVmdGFibGVzWzI4XSwgJnJlZnRhYmxlc1syOV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyIsIDYsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDEsIDEsIFVQQl9DVFlQRV9QVFIsIDEsICZpbnRlbnRyaWVzWzEyXSwgJmFycmF5c1sxNzldLCA0LCAwKSwgVVBCX1NUUlRBQkxFX0lOSVQoMSwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMTI0XSksJnJlZnRhYmxlc1szMF0sICZyZWZ0YWJsZXNbMzFdKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8iLCA2LCAxLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzE4M10sIDIsIDEpLCBVUEJfU1RSVEFCTEVfSU5JVCgxLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1sxMjhdKSwmcmVmdGFibGVzWzMyXSwgJnJlZnRhYmxlc1szM10pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiIsIDE0LCAwLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzE4NV0sIDUsIDQpLCBVUEJfU1RSVEFCTEVfSU5JVCg0LCA3LCBVUEJfQ1RZUEVfUFRSLCAzLCAmc3RyZW50cmllc1sxMzJdKSwmcmVmdGFibGVzWzM0XSwgJnJlZnRhYmxlc1szNV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIiwgMTgsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbMTkwXSwgOSwgNyksIFVQQl9TVFJUQUJMRV9JTklUKDcsIDE1LCBVUEJfQ1RZUEVfUFRSLCA0LCAmc3RyZW50cmllc1sxNDBdKSwmcmVmdGFibGVzWzM2XSwgJnJlZnRhYmxlc1szN10pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0IiwgNiwgMCwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1sxOTldLCAzLCAyKSwgVVBCX1NUUlRBQkxFX0lOSVQoMiwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMTU2XSksJnJlZnRhYmxlc1szOF0sICZyZWZ0YWJsZXNbMzldKSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1cGJfZmllbGRkZWYgZmllbGRzWzgxXSA9IHsKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiYWdncmVnYXRlX3ZhbHVlIiwgOCwgJm1zZ3NbMThdLCBOVUxMLCAxNSwgNiwgezB9LCZyZWZ0YWJsZXNbNDBdLCAmcmVmdGFibGVzWzQxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJhbGxvd19hbGlhcyIsIDIsICZtc2dzWzNdLCBOVUxMLCA2LCAxLCB7MH0sJnJlZnRhYmxlc1s0Ml0sICZyZWZ0YWJsZXNbNDNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImNjX2dlbmVyaWNfc2VydmljZXMiLCAxNiwgJm1zZ3NbMTBdLCBOVUxMLCAxNywgNiwgezB9LCZyZWZ0YWJsZXNbNDRdLCAmcmVmdGFibGVzWzQ1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfRU5VTSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJjdHlwZSIsIDEsICZtc2dzWzddLCAoY29uc3QgdXBiX2RlZiopKCZlbnVtc1syXSksIDYsIDEsIHswfSwmcmVmdGFibGVzWzQ2XSwgJnJlZnRhYmxlc1s0N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZWZhdWx0X3ZhbHVlIiwgNywgJm1zZ3NbNl0sIE5VTEwsIDE2LCA3LCB7MH0sJnJlZnRhYmxlc1s0OF0sICZyZWZ0YWJsZXNbNDldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZGVwZW5kZW5jeSIsIDMsICZtc2dzWzhdLCBOVUxMLCAzMCwgOCwgezB9LCZyZWZ0YWJsZXNbNTBdLCAmcmVmdGFibGVzWzUxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZXByZWNhdGVkIiwgMywgJm1zZ3NbN10sIE5VTEwsIDgsIDMsIHswfSwmcmVmdGFibGVzWzUyXSwgJnJlZnRhYmxlc1s1M10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0RPVUJMRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkb3VibGVfdmFsdWUiLCA2LCAmbXNnc1sxOF0sIE5VTEwsIDExLCA0LCB7MH0sJnJlZnRhYmxlc1s1NF0sICZyZWZ0YWJsZXNbNTVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9JTlQzMiwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJlbmQiLCAyLCAmbXNnc1sxXSwgTlVMTCwgMywgMSwgezB9LCZyZWZ0YWJsZXNbNTZdLCAmcmVmdGFibGVzWzU3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJlbnVtX3R5cGUiLCA0LCAmbXNnc1swXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1syXSksIDE2LCAyLCB7MH0sJnJlZnRhYmxlc1s1OF0sICZyZWZ0YWJsZXNbNTldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImVudW1fdHlwZSIsIDUsICZtc2dzWzhdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzJdKSwgMTMsIDEsIHswfSwmcmVmdGFibGVzWzYwXSwgJnJlZnRhYmxlc1s2MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJleHBlcmltZW50YWxfbWFwX2tleSIsIDksICZtc2dzWzddLCBOVUxMLCAxMCwgNSwgezB9LCZyZWZ0YWJsZXNbNjJdLCAmcmVmdGFibGVzWzYzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImV4dGVuZGVlIiwgMiwgJm1zZ3NbNl0sIE5VTEwsIDcsIDIsIHswfSwmcmVmdGFibGVzWzY0XSwgJnJlZnRhYmxlc1s2NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZXh0ZW5zaW9uIiwgNywgJm1zZ3NbOF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbNl0pLCAxOSwgMywgezB9LCZyZWZ0YWJsZXNbNjZdLCAmcmVmdGFibGVzWzY3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJleHRlbnNpb24iLCA2LCAmbXNnc1swXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s2XSksIDIyLCA0LCB7MH0sJnJlZnRhYmxlc1s2OF0sICZyZWZ0YWJsZXNbNjldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImV4dGVuc2lvbl9yYW5nZSIsIDUsICZtc2dzWzBdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzFdKSwgMTksIDMsIHswfSwmcmVmdGFibGVzWzcwXSwgJnJlZnRhYmxlc1s3MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZmllbGQiLCAyLCAmbXNnc1swXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s2XSksIDEwLCAwLCB7MH0sJnJlZnRhYmxlc1s3Ml0sICZyZWZ0YWJsZXNbNzNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImZpbGUiLCAxLCAmbXNnc1s5XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s4XSksIDUsIDAsIHswfSwmcmVmdGFibGVzWzc0XSwgJnJlZnRhYmxlc1s3NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJnb19wYWNrYWdlIiwgMTEsICZtc2dzWzEwXSwgTlVMTCwgMTQsIDUsIHswfSwmcmVmdGFibGVzWzc2XSwgJnJlZnRhYmxlc1s3N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJpZGVudGlmaWVyX3ZhbHVlIiwgMywgJm1zZ3NbMThdLCBOVUxMLCA2LCAxLCB7MH0sJnJlZnRhYmxlc1s3OF0sICZyZWZ0YWJsZXNbNzldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiaW5wdXRfdHlwZSIsIDIsICZtc2dzWzEyXSwgTlVMTCwgNywgMiwgezB9LCZyZWZ0YWJsZXNbODBdLCAmcmVmdGFibGVzWzgxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVFVSVJFRCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJpc19leHRlbnNpb24iLCAyLCAmbXNnc1sxOV0sIE5VTEwsIDUsIDEsIHswfSwmcmVmdGFibGVzWzgyXSwgJnJlZnRhYmxlc1s4M10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2giLCAyMCwgJm1zZ3NbMTBdLCBOVUxMLCAyMCwgOSwgezB9LCZyZWZ0YWJsZXNbODRdLCAmcmVmdGFibGVzWzg1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJqYXZhX2dlbmVyaWNfc2VydmljZXMiLCAxNywgJm1zZ3NbMTBdLCBOVUxMLCAxOCwgNywgezB9LCZyZWZ0YWJsZXNbODZdLCAmcmVmdGFibGVzWzg3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJqYXZhX211bHRpcGxlX2ZpbGVzIiwgMTAsICZtc2dzWzEwXSwgTlVMTCwgMTMsIDQsIHswfSwmcmVmdGFibGVzWzg4XSwgJnJlZnRhYmxlc1s4OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJqYXZhX291dGVyX2NsYXNzbmFtZSIsIDgsICZtc2dzWzEwXSwgTlVMTCwgOSwgMiwgezB9LCZyZWZ0YWJsZXNbOTBdLCAmcmVmdGFibGVzWzkxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImphdmFfcGFja2FnZSIsIDEsICZtc2dzWzEwXSwgTlVMTCwgNiwgMSwgezB9LCZyZWZ0YWJsZXNbOTJdLCAmcmVmdGFibGVzWzkzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfRU5VTSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJsYWJlbCIsIDQsICZtc2dzWzZdLCAoY29uc3QgdXBiX2RlZiopKCZlbnVtc1swXSksIDExLCA0LCB7MH0sJnJlZnRhYmxlc1s5NF0sICZyZWZ0YWJsZXNbOTVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImxhenkiLCA1LCAmbXNnc1s3XSwgTlVMTCwgOSwgNCwgezB9LCZyZWZ0YWJsZXNbOTZdLCAmcmVmdGFibGVzWzk3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImxlYWRpbmdfY29tbWVudHMiLCAzLCAmbXNnc1sxN10sIE5VTEwsIDgsIDIsIHswfSwmcmVmdGFibGVzWzk4XSwgJnJlZnRhYmxlc1s5OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibG9jYXRpb24iLCAxLCAmbXNnc1sxNl0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMTddKSwgNSwgMCwgezB9LCZyZWZ0YWJsZXNbMTAwXSwgJnJlZnRhYmxlc1sxMDFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IiwgMSwgJm1zZ3NbMTFdLCBOVUxMLCA2LCAxLCB7MH0sJnJlZnRhYmxlc1sxMDJdLCAmcmVmdGFibGVzWzEwM10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibWVzc2FnZV90eXBlIiwgNCwgJm1zZ3NbOF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMF0pLCAxMCwgMCwgezB9LCZyZWZ0YWJsZXNbMTA0XSwgJnJlZnRhYmxlc1sxMDVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm1ldGhvZCIsIDIsICZtc2dzWzE0XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxMl0pLCA2LCAwLCB7MH0sJnJlZnRhYmxlc1sxMDZdLCAmcmVmdGFibGVzWzEwN10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lIiwgMSwgJm1zZ3NbOF0sIE5VTEwsIDIyLCA2LCB7MH0sJnJlZnRhYmxlc1sxMDhdLCAmcmVmdGFibGVzWzEwOV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lIiwgMSwgJm1zZ3NbMTRdLCBOVUxMLCA4LCAyLCB7MH0sJnJlZnRhYmxlc1sxMTBdLCAmcmVmdGFibGVzWzExMV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibmFtZSIsIDIsICZtc2dzWzE4XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxOV0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1sxMTJdLCAmcmVmdGFibGVzWzExM10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lIiwgMSwgJm1zZ3NbNF0sIE5VTEwsIDQsIDEsIHswfSwmcmVmdGFibGVzWzExNF0sICZyZWZ0YWJsZXNbMTE1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5hbWUiLCAxLCAmbXNnc1swXSwgTlVMTCwgMjQsIDYsIHswfSwmcmVmdGFibGVzWzExNl0sICZyZWZ0YWJsZXNbMTE3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5hbWUiLCAxLCAmbXNnc1sxMl0sIE5VTEwsIDQsIDEsIHswfSwmcmVmdGFibGVzWzExOF0sICZyZWZ0YWJsZXNbMTE5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5hbWUiLCAxLCAmbXNnc1syXSwgTlVMTCwgOCwgMiwgezB9LCZyZWZ0YWJsZXNbMTIwXSwgJnJlZnRhYmxlc1sxMjFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibmFtZSIsIDEsICZtc2dzWzZdLCBOVUxMLCA0LCAxLCB7MH0sJnJlZnRhYmxlc1sxMjJdLCAmcmVmdGFibGVzWzEyM10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVRVUlSRUQsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lX3BhcnQiLCAxLCAmbXNnc1sxOV0sIE5VTEwsIDIsIDAsIHswfSwmcmVmdGFibGVzWzEyNF0sICZyZWZ0YWJsZXNbMTI1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfSU5UNjQsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibmVnYXRpdmVfaW50X3ZhbHVlIiwgNSwgJm1zZ3NbMThdLCBOVUxMLCAxMCwgMywgezB9LCZyZWZ0YWJsZXNbMTI2XSwgJnJlZnRhYmxlc1sxMjddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5lc3RlZF90eXBlIiwgMywgJm1zZ3NbMF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMF0pLCAxMywgMSwgezB9LCZyZWZ0YWJsZXNbMTI4XSwgJnJlZnRhYmxlc1sxMjldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IiLCAyLCAmbXNnc1sxMV0sIE5VTEwsIDcsIDIsIHswfSwmcmVmdGFibGVzWzEzMF0sICZyZWZ0YWJsZXNbMTMxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfSU5UMzIsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibnVtYmVyIiwgMywgJm1zZ3NbNl0sIE5VTEwsIDEwLCAzLCB7MH0sJnJlZnRhYmxlc1sxMzJdLCAmcmVmdGFibGVzWzEzM10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0lOVDMyLCBVUEJfSU5URk1UX1ZBUklBQkxFLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm51bWJlciIsIDIsICZtc2dzWzRdLCBOVUxMLCA3LCAyLCB7MH0sJnJlZnRhYmxlc1sxMzRdLCAmcmVmdGFibGVzWzEzNV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0VOVU0sIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3B0aW1pemVfZm9yIiwgOSwgJm1zZ3NbMTBdLCAoY29uc3QgdXBiX2RlZiopKCZlbnVtc1szXSksIDEyLCAzLCB7MH0sJnJlZnRhYmxlc1sxMzZdLCAmcmVmdGFibGVzWzEzN10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3B0aW9ucyIsIDcsICZtc2dzWzBdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzExXSksIDIzLCA1LCB7MH0sJnJlZnRhYmxlc1sxMzhdLCAmcmVmdGFibGVzWzEzOV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3B0aW9ucyIsIDMsICZtc2dzWzJdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzNdKSwgNywgMSwgezB9LCZyZWZ0YWJsZXNbMTQwXSwgJnJlZnRhYmxlc1sxNDFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm9wdGlvbnMiLCA4LCAmbXNnc1s2XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s3XSksIDMsIDAsIHswfSwmcmVmdGFibGVzWzE0Ml0sICZyZWZ0YWJsZXNbMTQzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJvcHRpb25zIiwgMywgJm1zZ3NbNF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbNV0pLCAzLCAwLCB7MH0sJnJlZnRhYmxlc1sxNDRdLCAmcmVmdGFibGVzWzE0NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3B0aW9ucyIsIDgsICZtc2dzWzhdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzEwXSksIDIwLCA0LCB7MH0sJnJlZnRhYmxlc1sxNDZdLCAmcmVmdGFibGVzWzE0N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3B0aW9ucyIsIDMsICZtc2dzWzE0XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxNV0pLCA3LCAxLCB7MH0sJnJlZnRhYmxlc1sxNDhdLCAmcmVmdGFibGVzWzE0OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3B0aW9ucyIsIDQsICZtc2dzWzEyXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxM10pLCAzLCAwLCB7MH0sJnJlZnRhYmxlc1sxNTBdLCAmcmVmdGFibGVzWzE1MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJvdXRwdXRfdHlwZSIsIDMsICZtc2dzWzEyXSwgTlVMTCwgMTAsIDMsIHswfSwmcmVmdGFibGVzWzE1Ml0sICZyZWZ0YWJsZXNbMTUzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInBhY2thZ2UiLCAyLCAmbXNnc1s4XSwgTlVMTCwgMjUsIDcsIHswfSwmcmVmdGFibGVzWzE1NF0sICZyZWZ0YWJsZXNbMTU1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJwYWNrZWQiLCAyLCAmbXNnc1s3XSwgTlVMTCwgNywgMiwgezB9LCZyZWZ0YWJsZXNbMTU2XSwgJnJlZnRhYmxlc1sxNTddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9JTlQzMiwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgdHJ1ZSwgInBhdGgiLCAxLCAmbXNnc1sxN10sIE5VTEwsIDQsIDAsIHswfSwmcmVmdGFibGVzWzE1OF0sICZyZWZ0YWJsZXNbMTU5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfVUlOVDY0LCBVUEJfSU5URk1UX1ZBUklBQkxFLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInBvc2l0aXZlX2ludF92YWx1ZSIsIDQsICZtc2dzWzE4XSwgTlVMTCwgOSwgMiwgezB9LCZyZWZ0YWJsZXNbMTYwXSwgJnJlZnRhYmxlc1sxNjFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9JTlQzMiwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJwdWJsaWNfZGVwZW5kZW5jeSIsIDEwLCAmbXNnc1s4XSwgTlVMTCwgMzUsIDksIHswfSwmcmVmdGFibGVzWzE2Ml0sICZyZWZ0YWJsZXNbMTYzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJweV9nZW5lcmljX3NlcnZpY2VzIiwgMTgsICZtc2dzWzEwXSwgTlVMTCwgMTksIDgsIHswfSwmcmVmdGFibGVzWzE2NF0sICZyZWZ0YWJsZXNbMTY1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJzZXJ2aWNlIiwgNiwgJm1zZ3NbOF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMTRdKSwgMTYsIDIsIHswfSwmcmVmdGFibGVzWzE2Nl0sICZyZWZ0YWJsZXNbMTY3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJzb3VyY2VfY29kZV9pbmZvIiwgOSwgJm1zZ3NbOF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMTZdKSwgMjEsIDUsIHswfSwmcmVmdGFibGVzWzE2OF0sICZyZWZ0YWJsZXNbMTY5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfSU5UMzIsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsICJzcGFuIiwgMiwgJm1zZ3NbMTddLCBOVUxMLCA3LCAxLCB7MH0sJnJlZnRhYmxlc1sxNzBdLCAmcmVmdGFibGVzWzE3MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0lOVDMyLCBVUEJfSU5URk1UX1ZBUklBQkxFLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInN0YXJ0IiwgMSwgJm1zZ3NbMV0sIE5VTEwsIDIsIDAsIHswfSwmcmVmdGFibGVzWzE3Ml0sICZyZWZ0YWJsZXNbMTczXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQllURVMsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAic3RyaW5nX3ZhbHVlIiwgNywgJm1zZ3NbMThdLCBOVUxMLCAxMiwgNSwgezB9LCZyZWZ0YWJsZXNbMTc0XSwgJnJlZnRhYmxlc1sxNzVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidHJhaWxpbmdfY29tbWVudHMiLCA0LCAmbXNnc1sxN10sIE5VTEwsIDExLCAzLCB7MH0sJnJlZnRhYmxlc1sxNzZdLCAmcmVmdGFibGVzWzE3N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0VOVU0sIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidHlwZSIsIDUsICZtc2dzWzZdLCAoY29uc3QgdXBiX2RlZiopKCZlbnVtc1sxXSksIDEyLCA1LCB7MH0sJnJlZnRhYmxlc1sxNzhdLCAmcmVmdGFibGVzWzE3OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJ0eXBlX25hbWUiLCA2LCAmbXNnc1s2XSwgTlVMTCwgMTMsIDYsIHswfSwmcmVmdGFibGVzWzE4MF0sICZyZWZ0YWJsZXNbMTgxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJ1bmludGVycHJldGVkX29wdGlvbiIsIDk5OSwgJm1zZ3NbNV0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMThdKSwgNSwgMCwgezB9LCZyZWZ0YWJsZXNbMTgyXSwgJnJlZnRhYmxlc1sxODNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiwgOTk5LCAmbXNnc1sxNV0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMThdKSwgNSwgMCwgezB9LCZyZWZ0YWJsZXNbMTg0XSwgJnJlZnRhYmxlc1sxODVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiwgOTk5LCAmbXNnc1szXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxOF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1sxODZdLCAmcmVmdGFibGVzWzE4N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzEzXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxOF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1sxODhdLCAmcmVmdGFibGVzWzE4OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzEwXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxOF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1sxOTBdLCAmcmVmdGFibGVzWzE5MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzExXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxOF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1sxOTJdLCAmcmVmdGFibGVzWzE5M10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzddLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzE4XSksIDUsIDAsIHswfSwmcmVmdGFibGVzWzE5NF0sICZyZWZ0YWJsZXNbMTk1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJ2YWx1ZSIsIDIsICZtc2dzWzJdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzRdKSwgNiwgMCwgezB9LCZyZWZ0YWJsZXNbMTk2XSwgJnJlZnRhYmxlc1sxOTddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIndlYWsiLCAxMCwgJm1zZ3NbN10sIE5VTEwsIDEzLCA2LCB7MH0sJnJlZnRhYmxlc1sxOThdLCAmcmVmdGFibGVzWzE5OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX0lOVDMyLCBVUEJfSU5URk1UX1ZBUklBQkxFLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIndlYWtfZGVwZW5kZW5jeSIsIDExLCAmbXNnc1s4XSwgTlVMTCwgMzgsIDEwLCB7MH0sJnJlZnRhYmxlc1syMDBdLCAmcmVmdGFibGVzWzIwMV0pLAotfTsKLQotc3RhdGljIGNvbnN0IHVwYl9lbnVtZGVmIGVudW1zWzRdID0gewotICBVUEJfRU5VTURFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwiLCBVUEJfU1RSVEFCTEVfSU5JVCgzLCAzLCBVUEJfQ1RZUEVfSU5UMzIsIDIsICZzdHJlbnRyaWVzWzE2MF0pLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfQ1NUUiwgMCwgTlVMTCwgJmFycmF5c1syMDJdLCA0LCAzKSwgMCwgJnJlZnRhYmxlc1syMDJdLCAmcmVmdGFibGVzWzIwM10pLAotICBVUEJfRU5VTURFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSIsIFVQQl9TVFJUQUJMRV9JTklUKDE4LCAzMSwgVVBCX0NUWVBFX0lOVDMyLCA1LCAmc3RyZW50cmllc1sxNjRdKSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX0NTVFIsIDAsIE5VTEwsICZhcnJheXNbMjA2XSwgMTksIDE4KSwgMCwgJnJlZnRhYmxlc1syMDRdLCAmcmVmdGFibGVzWzIwNV0pLAotICBVUEJfRU5VTURFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIiwgVVBCX1NUUlRBQkxFX0lOSVQoMywgMywgVVBCX0NUWVBFX0lOVDMyLCAyLCAmc3RyZW50cmllc1sxOTZdKSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX0NTVFIsIDAsIE5VTEwsICZhcnJheXNbMjI1XSwgMywgMyksIDAsICZyZWZ0YWJsZXNbMjA2XSwgJnJlZnRhYmxlc1syMDddKSwKLSAgVVBCX0VOVU1ERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSIsIFVQQl9TVFJUQUJMRV9JTklUKDMsIDMsIFVQQl9DVFlQRV9JTlQzMiwgMiwgJnN0cmVudHJpZXNbMjAwXSksIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9DU1RSLCAwLCBOVUxMLCAmYXJyYXlzWzIyOF0sIDQsIDMpLCAwLCAmcmVmdGFibGVzWzIwOF0sICZyZWZ0YWJsZXNbMjA5XSksCi19OwotCi1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCBzdHJlbnRyaWVzWzIzNl0gPSB7Ci0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJleHRlbnNpb24iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTRdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szOF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImZpZWxkIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE2XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZXh0ZW5zaW9uX3JhbmdlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE1XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJuZXN0ZWRfdHlwZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0NF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm9wdGlvbnMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDldKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJlbnVtX3R5cGUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOV0pLCAmc3RyZW50cmllc1sxNF19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAic3RhcnQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJlbmQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInZhbHVlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc4XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1MF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm5hbWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDBdKSwgJnN0cmVudHJpZXNbMjJdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDI0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzczXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJhbGxvd19hbGlhcyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJudW1iZXIiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDddKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm9wdGlvbnMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTJdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJuYW1lIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzM3XSksICZzdHJlbnRyaWVzWzMwXX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ1bmludGVycHJldGVkX29wdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3MV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibGFiZWwiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjddKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm5hbWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm51bWJlciIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0Nl0pLCAmc3RyZW50cmllc1s0OV19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInR5cGVfbmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3MF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImV4dGVuZGVlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEyXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAidHlwZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2OV0pLCAmc3RyZW50cmllc1s0OF19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZGVmYXVsdF92YWx1ZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1MV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDI0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImV4cGVyaW1lbnRhbF9tYXBfa2V5IiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzExXSksICZzdHJlbnRyaWVzWzY3XX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIndlYWsiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzldKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInBhY2tlZCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1OF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImxhenkiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjhdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImN0eXBlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzNdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZGVwcmVjYXRlZCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ1bmludGVycHJldGVkX29wdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3N10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImV4dGVuc2lvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxM10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIndlYWtfZGVwZW5kZW5jeSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s4MF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szNF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInNlcnZpY2UiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjNdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInNvdXJjZV9jb2RlX2luZm8iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjRdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJkZXBlbmRlbmN5IiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzVdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJtZXNzYWdlX3R5cGUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzJdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJwYWNrYWdlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU3XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1M10pLCAmc3RyZW50cmllc1s4Ml19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTEiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZW51bV90eXBlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEwXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjEiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAicHVibGljX2RlcGVuZGVuY3kiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjFdKSwgJnN0cmVudHJpZXNbODFdfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZmlsZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxN10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ1bmludGVycHJldGVkX29wdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3NV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjMiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiY2NfZ2VuZXJpY19zZXJ2aWNlcyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJqYXZhX211bHRpcGxlX2ZpbGVzIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzI0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJqYXZhX2dlbmVyaWNfc2VydmljZXMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjNdKSwgJnN0cmVudHJpZXNbMTAyXX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAzNSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syMl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvX3BhY2thZ2UiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMThdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJqYXZhX3BhY2thZ2UiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJvcHRpbWl6ZV9mb3IiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDhdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJweV9nZW5lcmljX3NlcnZpY2VzIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzYyXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiamF2YV9vdXRlcl9jbGFzc25hbWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjVdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szMV0pLCAmc3RyZW50cmllc1sxMDZdfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAidW5pbnRlcnByZXRlZF9vcHRpb24iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAzNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ1XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szOV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImlucHV0X3R5cGUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjBdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm91dHB1dF90eXBlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU2XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1NV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDI0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJvcHRpb25zIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU0XSksICZzdHJlbnRyaWVzWzEyMl19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDYiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibWV0aG9kIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzMzXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szNV0pLCAmc3RyZW50cmllc1sxMjFdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDI0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzcyXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImxvY2F0aW9uIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzMwXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJzcGFuIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY1XSksICZzdHJlbnRyaWVzWzEzOV19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ0cmFpbGluZ19jb21tZW50cyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2OF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImxlYWRpbmdfY29tbWVudHMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjldKSwgJnN0cmVudHJpZXNbMTM3XX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJwYXRoIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU5XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZG91YmxlX3ZhbHVlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzddKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szNl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm5lZ2F0aXZlX2ludF92YWx1ZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0M10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImFnZ3JlZ2F0ZV92YWx1ZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1swXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjBdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJpZGVudGlmaWVyX3ZhbHVlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE5XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAic3RyaW5nX3ZhbHVlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY3XSksICZzdHJlbnRyaWVzWzE1NF19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImlzX2V4dGVuc2lvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syMV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm5hbWVfcGFydCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0Ml0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIkxBQkVMX1JFUVVJUkVEIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgyKSwgJnN0cmVudHJpZXNbMTYyXX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIkxBQkVMX1JFUEVBVEVEIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgzKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJMQUJFTF9PUFRJT05BTCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9GSVhFRDY0IiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCg2KSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfU1RSSU5HIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCg5KSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX0ZMT0FUIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgyKSwgJnN0cmVudHJpZXNbMTkzXX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX0RPVUJMRSIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX0lOVDMyIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCg1KSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX1NGSVhFRDMyIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxNSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9GSVhFRDMyIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCg3KSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfTUVTU0FHRSIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTEpLCAmc3RyZW50cmllc1sxOTRdfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX0lOVDY0IiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgzKSwgJnN0cmVudHJpZXNbMTkxXX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfRU5VTSIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTQpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfVUlOVDMyIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxMyksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX1VJTlQ2NCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoNCksICZzdHJlbnRyaWVzWzE5MF19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX1NGSVhFRDY0IiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxNiksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9CWVRFUyIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTIpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfU0lOVDY0IiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxOCksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTEiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9CT09MIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCg4KSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX0dST1VQIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxMCksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTMiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9TSU5UMzIiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDE3KSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIkNPUkQiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDEpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlNUUklORyIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMCksICZzdHJlbnRyaWVzWzE5N119LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiU1RSSU5HX1BJRUNFIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgyKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJDT0RFX1NJWkUiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDIpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlNQRUVEIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxKSwgJnN0cmVudHJpZXNbMjAzXX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIkxJVEVfUlVOVElNRSIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMyksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDQ3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMTddKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA0MyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMThdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA0MyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbOF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDQ1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZtc2dzWzEyXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA0MCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbNV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDM3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZtc2dzWzBdKSwgJnN0cmVudHJpZXNbMjI4XX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDM2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMTZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA1MSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmVudW1zWzFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA1NiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmbXNnc1sxXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA1MCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmbXNnc1s0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMzQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbN10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDMzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMTBdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA0MyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMl0pLCAmc3RyZW50cmllc1syMzNdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDUyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmVudW1zWzBdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA0NiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMTRdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA0MiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZW51bXNbMl0pLCAmc3RyZW50cmllc1syMjldfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDQxIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbOV0pLCAmc3RyZW50cmllc1syMzVdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDMzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbM10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDQ0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbNl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDUwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZlbnVtc1szXSksICZzdHJlbnRyaWVzWzIyMV19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMzYiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmbXNnc1sxNV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDM2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMTFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAzNSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMTNdKSwgJnN0cmVudHJpZXNbMjI2XX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDA1NCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJm1zZ3NbMTldKSwgTlVMTH0sCi19OwotCi1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCBpbnRlbnRyaWVzWzE0XSA9IHsKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OVU0oOTk5KSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzNdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTlVNKDk5OSksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzcxXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05VTSg5OTkpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3N10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OVU0oOTk5KSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzVdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTlVNKDk5OSksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc2XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05VTSg5OTkpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3NF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OVU0oOTk5KSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzJdKSwgTlVMTH0sCi19OwotCi1zdGF0aWMgY29uc3QgdXBiX3RhYnZhbCBhcnJheXNbMjMyXSA9IHsKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzM4XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE2XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ0XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzldKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTVdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTRdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDldKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY2XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzhdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQwXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc4XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzUwXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMV0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szN10pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0N10pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1Ml0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQxXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEyXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ2XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzI3XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY5XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzcwXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzRdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTFdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzNdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNThdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNl0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjhdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTFdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzldKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzM0XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU3XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzVdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzJdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTBdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjNdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTNdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTNdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjRdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjFdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODBdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE3XSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syNl0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syNV0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0OF0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syNF0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxOF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMl0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syM10pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2Ml0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjJdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szMV0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0NV0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzM5XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzIwXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU2XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU1XSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzVdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzNdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTRdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szMF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTldKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjVdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjldKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjhdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szNl0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxOV0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2MF0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0M10pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY3XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzBdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQyXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzIxXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIkxBQkVMX09QVElPTkFMIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiTEFCRUxfUkVRVUlSRUQiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJMQUJFTF9SRVBFQVRFRCIpLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0RPVUJMRSIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfRkxPQVQiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0lOVDY0IiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9VSU5UNjQiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0lOVDMyIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9GSVhFRDY0IiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9GSVhFRDMyIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9CT09MIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9TVFJJTkciKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0dST1VQIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9NRVNTQUdFIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9CWVRFUyIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfVUlOVDMyIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9FTlVNIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9TRklYRUQzMiIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfU0ZJWEVENjQiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX1NJTlQzMiIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfU0lOVDY0IiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiU1RSSU5HIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiQ09SRCIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlNUUklOR19QSUVDRSIpLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJTUEVFRCIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIkNPREVfU0laRSIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIkxJVEVfUlVOVElNRSIpLAotfTsKLQotc3RhdGljIGNvbnN0IHVwYl9zeW10YWIgc3ltdGFiID0gVVBCX1NZTVRBQl9JTklUKFVQQl9TVFJUQUJMRV9JTklUKDI0LCAzMSwgVVBCX0NUWVBFX1BUUiwgNSwgJnN0cmVudHJpZXNbMjA0XSksICZyZWZ0YWJsZXNbMjEwXSwgJnJlZnRhYmxlc1syMTFdKTsKLQotY29uc3QgdXBiX3N5bXRhYiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfZGVzY3JpcHRvcihjb25zdCB2b2lkICpvd25lcikgewotICB1cGJfc3ltdGFiX3JlZigmc3ltdGFiLCBvd25lcik7Ci0gIHJldHVybiAmc3ltdGFiOwotfQotCi0jaWZkZWYgVVBCX0RFQlVHX1JFRlMKLXN0YXRpYyB1cGJfaW50dGFibGUgcmVmdGFibGVzWzIxMl0gPSB7Ci0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLX07Ci0jZW5kaWYKLQotLyoKLSoqIFhYWDogVGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB0aGF0IGNvbnN1bWUgYSBzdHJpbmcgZG8gbm90IGN1cnJlbnRseQotKiogc3VwcG9ydCBoYXZpbmcgdGhlIHN0cmluZyBzcGFuIGJ1ZmZlcnMuICBJbiB0aGUgZnV0dXJlLCBhcyB1cGJfc2luayBhbmQKLSoqIGl0cyBidWZmZXJpbmcvc2hhcmluZyBmdW5jdGlvbmFsaXR5IGV2b2x2ZSB0aGVyZSBzaG91bGQgYmUgYW4gZWFzeSBhbmQKLSoqIGlkaW9tYXRpYyB3YXkgb2YgY29ycmVjdGx5IGhhbmRsaW5nIHRoaXMgY2FzZS4gIEZvciBub3csIHdlIGFjY2VwdCB0aGlzCi0qKiBsaW1pdGF0aW9uIHNpbmNlIHdlIGN1cnJlbnRseSBvbmx5IHBhcnNlIGRlc2NyaXB0b3JzIGZyb20gc2luZ2xlIHN0cmluZ3MuCi0qLwotCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiB1cGJfZGVmbGlzdCBpcyBhbiBpbnRlcm5hbC1vbmx5IGR5bmFtaWMgYXJyYXkgZm9yIHN0b3JpbmcgYSBncm93aW5nIGxpc3Qgb2YKLSAqIHVwYl9kZWZzLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICB1cGJfZGVmICoqZGVmczsKLSAgc2l6ZV90IGxlbjsKLSAgc2l6ZV90IHNpemU7Ci0gIGJvb2wgb3duZWQ7Ci19IHVwYl9kZWZsaXN0OwotCi0vKiBXZSBrZWVwIGEgc3RhY2sgb2YgYWxsIHRoZSBtZXNzYWdlcyBzY29wZXMgd2UgYXJlIGN1cnJlbnRseSBpbiwgYXMgd2VsbCBhcwotICogdGhlIHRvcC1sZXZlbCBmaWxlIHNjb3BlLiAgVGhpcyBpcyBuZWNlc3NhcnkgdG8gY29ycmVjdGx5IHF1YWxpZnkgdGhlCi0gKiBkZWZpbml0aW9ucyB0aGF0IGFyZSBjb250YWluZWQgaW5zaWRlLiAgIm5hbWUiIHRyYWNrcyB0aGUgbmFtZSBvZiB0aGUKLSAqIG1lc3NhZ2Ugb3IgcGFja2FnZSAoYSBiYXJlIG5hbWUgLS0gbm90IHF1YWxpZmllZCBieSBhbnkgZW5jbG9zaW5nIHNjb3BlcykuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNoYXIgKm5hbWU7Ci0gIC8qIEluZGV4IG9mIHRoZSBmaXJzdCBkZWYgdGhhdCBpcyB1bmRlciB0aGlzIHNjb3BlLiAgRm9yIG1zZ2RlZnMsIHRoZQotICAgKiBtc2dkZWYgaXRzZWxmIGlzIGF0IHN0YXJ0LTEuICovCi0gIGludCBzdGFydDsKLX0gdXBiX2Rlc2NyZWFkZXJfZnJhbWU7Ci0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBuZXN0ZWQgZGVjbGFyYXRpb25zIHRoYXQgYXJlIGFsbG93ZWQsIGllLgotICogbWVzc2FnZSBGb28gewotICogICBtZXNzYWdlIEJhciB7Ci0gKiAgICAgbWVzc2FnZSBCYXogewotICogICAgIH0KLSAqICAgfQotICogfQotICoKLSAqIFRoaXMgaXMgYSByZXNvdXJjZSBsaW1pdCB0aGF0IGFmZmVjdHMgaG93IGJpZyBvdXIgcnVudGltZSBzdGFjayBjYW4gZ3Jvdy4KLSAqIFRPRE86IG1ha2UgdGhpcyBhIHJ1bnRpbWUtc2V0dGFibGUgcHJvcGVydHkgb2YgdGhlIFJlYWRlciBpbnN0YW5jZS4gKi8KLSNkZWZpbmUgVVBCX01BWF9NRVNTQUdFX05FU1RJTkcgNjQKLQotc3RydWN0IHVwYl9kZXNjcmVhZGVyIHsKLSAgdXBiX3Npbmsgc2luazsKLSAgdXBiX2RlZmxpc3QgZGVmczsKLSAgdXBiX2Rlc2NyZWFkZXJfZnJhbWUgc3RhY2tbVVBCX01BWF9NRVNTQUdFX05FU1RJTkddOwotICBpbnQgc3RhY2tfbGVuOwotCi0gIHVpbnQzMl90IG51bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgYm9vbCBzYXdfbnVtYmVyOwotICBib29sIHNhd19uYW1lOwotCi0gIGNoYXIgKmRlZmF1bHRfc3RyaW5nOwotCi0gIHVwYl9maWVsZGRlZiAqZjsKLX07Ci0KLXN0YXRpYyBjaGFyICp1cGJfc3RybmR1cChjb25zdCBjaGFyICpidWYsIHNpemVfdCBuKSB7Ci0gIGNoYXIgKnJldCA9IG1hbGxvYyhuICsgMSk7Ci0gIGlmICghcmV0KSByZXR1cm4gTlVMTDsKLSAgbWVtY3B5KHJldCwgYnVmLCBuKTsKLSAgcmV0W25dID0gJ1wwJzsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogUmV0dXJucyBhIG5ld2x5IGFsbG9jYXRlZCBzdHJpbmcgdGhhdCBqb2lucyBpbnB1dCBzdHJpbmdzIHRvZ2V0aGVyLCBmb3IKLSAqIGV4YW1wbGU6Ci0gKiAgIGpvaW4oIkZvby5CYXIiLCAiQmF6IikgLT4gIkZvby5CYXIuQmF6IgotICogICBqb2luKCIiLCAiQmF6IikgLT4gIkJheiIKLSAqIENhbGxlciBvd25zIGEgcmVmIG9uIHRoZSByZXR1cm5lZCBzdHJpbmcuICovCi1zdGF0aWMgY2hhciAqdXBiX2pvaW4oY29uc3QgY2hhciAqYmFzZSwgY29uc3QgY2hhciAqbmFtZSkgewotICBpZiAoIWJhc2UgfHwgc3RybGVuKGJhc2UpID09IDApIHsKLSAgICByZXR1cm4gdXBiX3N0cmR1cChuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBjaGFyICpyZXQgPSBtYWxsb2Moc3RybGVuKGJhc2UpICsgc3RybGVuKG5hbWUpICsgMik7Ci0gICAgcmV0WzBdID0gJ1wwJzsKLSAgICBzdHJjYXQocmV0LCBiYXNlKTsKLSAgICBzdHJjYXQocmV0LCAiLiIpOwotICAgIHN0cmNhdChyZXQsIG5hbWUpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLX0KLQotCi0vKiB1cGJfZGVmbGlzdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHVwYl9kZWZsaXN0X2luaXQodXBiX2RlZmxpc3QgKmwpIHsKLSAgbC0+c2l6ZSA9IDA7Ci0gIGwtPmRlZnMgPSBOVUxMOwotICBsLT5sZW4gPSAwOwotICBsLT5vd25lZCA9IHRydWU7Ci19Ci0KLXZvaWQgdXBiX2RlZmxpc3RfdW5pbml0KHVwYl9kZWZsaXN0ICpsKSB7Ci0gIHNpemVfdCBpOwotICBpZiAobC0+b3duZWQpCi0gICAgZm9yKGkgPSAwOyBpIDwgbC0+bGVuOyBpKyspCi0gICAgICB1cGJfZGVmX3VucmVmKGwtPmRlZnNbaV0sIGwpOwotICBmcmVlKGwtPmRlZnMpOwotfQotCi1ib29sIHVwYl9kZWZsaXN0X3B1c2godXBiX2RlZmxpc3QgKmwsIHVwYl9kZWYgKmQpIHsKLSAgaWYoKytsLT5sZW4gPj0gbC0+c2l6ZSkgewotICAgIHNpemVfdCBuZXdfc2l6ZSA9IFVQQl9NQVgobC0+c2l6ZSwgNCk7Ci0gICAgbmV3X3NpemUgKj0gMjsKLSAgICBsLT5kZWZzID0gcmVhbGxvYyhsLT5kZWZzLCBuZXdfc2l6ZSAqIHNpemVvZih2b2lkICopKTsKLSAgICBpZiAoIWwtPmRlZnMpIHJldHVybiBmYWxzZTsKLSAgICBsLT5zaXplID0gbmV3X3NpemU7Ci0gIH0KLSAgbC0+ZGVmc1tsLT5sZW4gLSAxXSA9IGQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIHVwYl9kZWZsaXN0X2RvbmF0ZXJlZnModXBiX2RlZmxpc3QgKmwsIHZvaWQgKm93bmVyKSB7Ci0gIHNpemVfdCBpOwotICBhc3NlcnQobC0+b3duZWQpOwotICBmb3IgKGkgPSAwOyBpIDwgbC0+bGVuOyBpKyspCi0gICAgdXBiX2RlZl9kb25hdGVyZWYobC0+ZGVmc1tpXSwgbCwgb3duZXIpOwotICBsLT5vd25lZCA9IGZhbHNlOwotfQotCi1zdGF0aWMgdXBiX2RlZiAqdXBiX2RlZmxpc3RfbGFzdCh1cGJfZGVmbGlzdCAqbCkgewotICByZXR1cm4gbC0+ZGVmc1tsLT5sZW4tMV07Ci19Ci0KLS8qIFF1YWxpZnkgdGhlIGRlZm5hbWUgZm9yIGFsbCBkZWZzIHN0YXJ0aW5nIHdpdGggb2Zmc2V0ICJzdGFydCIgd2l0aCAic3RyIi4gKi8KLXN0YXRpYyB2b2lkIHVwYl9kZWZsaXN0X3F1YWxpZnkodXBiX2RlZmxpc3QgKmwsIGNoYXIgKnN0ciwgaW50MzJfdCBzdGFydCkgewotICB1aW50MzJfdCBpOwotICBmb3IgKGkgPSBzdGFydDsgaSA8IGwtPmxlbjsgaSsrKSB7Ci0gICAgdXBiX2RlZiAqZGVmID0gbC0+ZGVmc1tpXTsKLSAgICBjaGFyICpuYW1lID0gdXBiX2pvaW4oc3RyLCB1cGJfZGVmX2Z1bGxuYW1lKGRlZikpOwotICAgIHVwYl9kZWZfc2V0ZnVsbG5hbWUoZGVmLCBuYW1lLCBOVUxMKTsKLSAgICBmcmVlKG5hbWUpOwotICB9Ci19Ci0KLQotLyogdXBiX2Rlc2NyZWFkZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVwYl9tc2dkZWYgKnVwYl9kZXNjcmVhZGVyX3RvcCh1cGJfZGVzY3JlYWRlciAqcikgewotICBpbnQgaW5kZXg7Ci0gIGFzc2VydChyLT5zdGFja19sZW4gPiAxKTsKLSAgaW5kZXggPSByLT5zdGFja1tyLT5zdGFja19sZW4tMV0uc3RhcnQgLSAxOwotICBhc3NlcnQoaW5kZXggPj0gMCk7Ci0gIHJldHVybiB1cGJfZG93bmNhc3RfbXNnZGVmX211dGFibGUoci0+ZGVmcy5kZWZzW2luZGV4XSk7Ci19Ci0KLXN0YXRpYyB1cGJfZGVmICp1cGJfZGVzY3JlYWRlcl9sYXN0KHVwYl9kZXNjcmVhZGVyICpyKSB7Ci0gIHJldHVybiB1cGJfZGVmbGlzdF9sYXN0KCZyLT5kZWZzKTsKLX0KLQotLyogU3RhcnQvZW5kIGhhbmRsZXJzIGZvciBGaWxlRGVzY3JpcHRvclByb3RvIGFuZCBEZXNjcmlwdG9yUHJvdG8gKHRoZSB0d28KLSAqIGVudGl0aWVzIHRoYXQgaGF2ZSBuYW1lcyBhbmQgY2FuIGNvbnRhaW4gc3ViLWRlZmluaXRpb25zLiAqLwotdm9pZCB1cGJfZGVzY3JlYWRlcl9zdGFydGNvbnRhaW5lcih1cGJfZGVzY3JlYWRlciAqcikgewotICB1cGJfZGVzY3JlYWRlcl9mcmFtZSAqZiA9ICZyLT5zdGFja1tyLT5zdGFja19sZW4rK107Ci0gIGYtPnN0YXJ0ID0gci0+ZGVmcy5sZW47Ci0gIGYtPm5hbWUgPSBOVUxMOwotfQotCi12b2lkIHVwYl9kZXNjcmVhZGVyX2VuZGNvbnRhaW5lcih1cGJfZGVzY3JlYWRlciAqcikgewotICB1cGJfZGVzY3JlYWRlcl9mcmFtZSAqZiA9ICZyLT5zdGFja1stLXItPnN0YWNrX2xlbl07Ci0gIHVwYl9kZWZsaXN0X3F1YWxpZnkoJnItPmRlZnMsIGYtPm5hbWUsIGYtPnN0YXJ0KTsKLSAgZnJlZShmLT5uYW1lKTsKLSAgZi0+bmFtZSA9IE5VTEw7Ci19Ci0KLXZvaWQgdXBiX2Rlc2NyZWFkZXJfc2V0c2NvcGVuYW1lKHVwYl9kZXNjcmVhZGVyICpyLCBjaGFyICpzdHIpIHsKLSAgdXBiX2Rlc2NyZWFkZXJfZnJhbWUgKmYgPSAmci0+c3RhY2tbci0+c3RhY2tfbGVuLTFdOwotICBmcmVlKGYtPm5hbWUpOwotICBmLT5uYW1lID0gc3RyOwotfQotCi0vKiBIYW5kbGVycyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uICovCi1zdGF0aWMgYm9vbCBmaWxlX3N0YXJ0bXNnKHZvaWQgKnIsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICB1cGJfZGVzY3JlYWRlcl9zdGFydGNvbnRhaW5lcihyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGZpbGVfZW5kbXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChzdGF0dXMpOwotICB1cGJfZGVzY3JlYWRlcl9lbmRjb250YWluZXIocik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc2l6ZV90IGZpbGVfb25wYWNrYWdlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotICAvKiBYWFg6IHNlZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICovCi0gIHVwYl9kZXNjcmVhZGVyX3NldHNjb3BlbmFtZShyLCB1cGJfc3RybmR1cChidWYsIG4pKTsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIEhhbmRsZXJzIGZvciBnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLiAqLwotc3RhdGljIGJvb2wgZW51bXZhbF9zdGFydG1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByLT5zYXdfbnVtYmVyID0gZmFsc2U7Ci0gIHItPnNhd19uYW1lID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc2l6ZV90IGVudW12YWxfb25uYW1lKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotICAvKiBYWFg6IHNlZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICovCi0gIGZyZWUoci0+bmFtZSk7Ci0gIHItPm5hbWUgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICByLT5zYXdfbmFtZSA9IHRydWU7Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgYm9vbCBlbnVtdmFsX29ubnVtYmVyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBpbnQzMl90IHZhbCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByLT5udW1iZXIgPSB2YWw7Ci0gIHItPnNhd19udW1iZXIgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZW51bXZhbF9lbmRtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIHVwYl9lbnVtZGVmICplOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICBpZighci0+c2F3X251bWJlciB8fCAhci0+c2F3X25hbWUpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJFbnVtIHZhbHVlIG1pc3NpbmcgbmFtZSBvciBudW1iZXIuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGUgPSB1cGJfZG93bmNhc3RfZW51bWRlZl9tdXRhYmxlKHVwYl9kZXNjcmVhZGVyX2xhc3QocikpOwotICB1cGJfZW51bWRlZl9hZGR2YWwoZSwgci0+bmFtZSwgci0+bnVtYmVyLCBzdGF0dXMpOwotICBmcmVlKHItPm5hbWUpOwotICByLT5uYW1lID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogSGFuZGxlcnMgZm9yIGdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLiAqLwotc3RhdGljIGJvb2wgZW51bV9zdGFydG1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICB1cGJfZGVmbGlzdF9wdXNoKCZyLT5kZWZzLAotICAgICAgICAgICAgICAgICAgIHVwYl9lbnVtZGVmX3VwY2FzdF9tdXRhYmxlKHVwYl9lbnVtZGVmX25ldygmci0+ZGVmcykpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIGVudW1fZW5kbXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICB1cGJfZW51bWRlZiAqZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgZSA9IHVwYl9kb3duY2FzdF9lbnVtZGVmX211dGFibGUodXBiX2Rlc2NyZWFkZXJfbGFzdChyKSk7Ci0gIGlmICh1cGJfZGVmX2Z1bGxuYW1lKHVwYl9kZXNjcmVhZGVyX2xhc3QocikpID09IE5VTEwpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJFbnVtIGhhZCBubyBuYW1lLiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAodXBiX2VudW1kZWZfbnVtdmFscyhlKSA9PSAwKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2coc3RhdHVzLCAiRW51bSBoYWQgbm8gdmFsdWVzLiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHNpemVfdCBlbnVtX29ubmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgY2hhciAqZnVsbG5hbWUgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotICAvKiBYWFg6IHNlZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICovCi0gIHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX2Rlc2NyZWFkZXJfbGFzdChyKSwgZnVsbG5hbWUsIE5VTEwpOwotICBmcmVlKGZ1bGxuYW1lKTsKLSAgcmV0dXJuIG47Ci19Ci0KLS8qIEhhbmRsZXJzIGZvciBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gKi8KLXN0YXRpYyBib29sIGZpZWxkX3N0YXJ0bXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIHItPmYgPSB1cGJfZmllbGRkZWZfbmV3KCZyLT5kZWZzKTsKLSAgZnJlZShyLT5kZWZhdWx0X3N0cmluZyk7Ci0gIHItPmRlZmF1bHRfc3RyaW5nID0gTlVMTDsKLQotICAvKiBmaWVsZGRlZnMgZGVmYXVsdCB0byBwYWNrZWQsIGJ1dCBkZXNjcmlwdG9ycyBkZWZhdWx0IHRvIG5vbi1wYWNrZWQuICovCi0gIHVwYl9maWVsZGRlZl9zZXRwYWNrZWQoci0+ZiwgZmFsc2UpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29udmVydHMgdGhlIGRlZmF1bHQgdmFsdWUgaW4gc3RyaW5nICJzdHIiIGludG8gImQiLiAgUGFzc2VzIGEgcmVmIG9uIHN0ci4KLSAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqLwotc3RhdGljIGJvb2wgcGFyc2VfZGVmYXVsdChjaGFyICpzdHIsIHVwYl9maWVsZGRlZiAqZikgewotICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotICBjaGFyICplbmQ7Ci0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOiB7Ci0gICAgICBsb25nIHZhbCA9IHN0cnRvbChzdHIsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4gfHwgZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQzMihmLCB2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6IHsKLSAgICAgIC8qIFhYWDogTmVlZCB0byB3cml0ZSBvdXIgb3duIHN0cnRvbGwsIHNpbmNlIGl0J3Mgbm90IGF2YWlsYWJsZSBpbiBjODkuICovCi0gICAgICBsb25nIGxvbmcgdmFsID0gc3RydG9sKHN0ciwgJmVuZCwgMCk7Ci0gICAgICBpZiAodmFsID4gSU5UNjRfTUFYIHx8IHZhbCA8IElOVDY0X01JTiB8fCBlcnJubyA9PSBFUkFOR0UgfHwgKmVuZCkKLSAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgZWxzZQotICAgICAgICB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGludDY0KGYsIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6IHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsID0gc3RydG91bChzdHIsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IFVJTlQzMl9NQVggfHwgZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50MzIoZiwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDogewotICAgICAgLyogWFhYOiBOZWVkIHRvIHdyaXRlIG91ciBvd24gc3RydG91bGwsIHNpbmNlIGl0J3Mgbm90IGF2YWlsYWJsZSBpbiBjODkuICovCi0gICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFsID0gc3RydG91bChzdHIsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IFVJTlQ2NF9NQVggfHwgZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50NjQoZiwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogewotICAgICAgZG91YmxlIHZhbCA9IHN0cnRvZChzdHIsICZlbmQpOwotICAgICAgaWYgKGVycm5vID09IEVSQU5HRSB8fCAqZW5kKQotICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0ZG91YmxlKGYsIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDogewotICAgICAgLyogWFhYOiBOZWVkIHRvIHdyaXRlIG91ciBvd24gc3RydG9mLCBzaW5jZSBpdCdzIG5vdCBhdmFpbGFibGUgaW4gYzg5LiAqLwotICAgICAgZmxvYXQgdmFsID0gc3RydG9kKHN0ciwgJmVuZCk7Ci0gICAgICBpZiAoZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRmbG9hdChmLCB2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDogewotICAgICAgaWYgKHN0cmNtcChzdHIsICJmYWxzZSIpID09IDApCi0gICAgICAgIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbChmLCBmYWxzZSk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoc3RyLCAidHJ1ZSIpID09IDApCi0gICAgICAgIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbChmLCB0cnVlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gIH0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXN0YXRpYyBib29sIGZpZWxkX2VuZG1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgdXBiX2ZpZWxkZGVmICpmID0gci0+ZjsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgLyogVE9ETzogdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyB3ZXJlIHByZXNlbnQuICovCi0gIGFzc2VydCh1cGJfZmllbGRkZWZfbnVtYmVyKGYpICE9IDApOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX25hbWUoZikgIT0gTlVMTCk7Ci0gIGFzc2VydCgodXBiX2ZpZWxkZGVmX3N1YmRlZm5hbWUoZikgIT0gTlVMTCkgPT0gdXBiX2ZpZWxkZGVmX2hhc3N1YmRlZihmKSk7Ci0KLSAgaWYgKHItPmRlZmF1bHRfc3RyaW5nKSB7Ci0gICAgaWYgKHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJtc2coc3RhdHVzLCAiU3VibWVzc2FnZXMgY2Fubm90IGhhdmUgZGVmYXVsdHMuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdHJpbmcoZikgfHwgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSkgewotICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRjc3RyKGYsIHItPmRlZmF1bHRfc3RyaW5nLCBOVUxMKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHItPmRlZmF1bHRfc3RyaW5nICYmICFwYXJzZV9kZWZhdWx0KHItPmRlZmF1bHRfc3RyaW5nLCBmKSkgewotICAgICAgICAvKiBXZSBkb24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCBnaXZpbmcgYSBncmVhdCBlcnJvciBtZXNzYWdlIHNpbmNlIHRoZQotICAgICAgICAgKiBjb21waWxlciBzaG91bGQgaGF2ZSBlbnN1cmVkIHRoaXMgd2FzIGNvcnJlY3QuICovCi0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIkVycm9yIGNvbnZlcnRpbmcgZGVmYXVsdCB2YWx1ZS4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZmllbGRfb25sYXp5KHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBib29sIHZhbCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotCi0gIHVwYl9maWVsZGRlZl9zZXRsYXp5KHItPmYsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBmaWVsZF9vbnBhY2tlZCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgYm9vbCB2YWwpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICB1cGJfZmllbGRkZWZfc2V0cGFja2VkKHItPmYsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBmaWVsZF9vbnR5cGUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGludDMyX3QgdmFsKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgdXBiX2ZpZWxkZGVmX3NldGRlc2NyaXB0b3J0eXBlKHItPmYsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBmaWVsZF9vbmxhYmVsKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBpbnQzMl90IHZhbCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotCi0gIHVwYl9maWVsZGRlZl9zZXRsYWJlbChyLT5mLCB2YWwpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZmllbGRfb25udW1iZXIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGludDMyX3QgdmFsKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgYm9vbCBvayA9IHVwYl9maWVsZGRlZl9zZXRudW1iZXIoci0+ZiwgdmFsLCBOVUxMKTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzaXplX3QgZmllbGRfb25uYW1lKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgY2hhciAqbmFtZSA9IHVwYl9zdHJuZHVwKGJ1Ziwgbik7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgLyogWFhYOiBzZWUgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAqLwotICB1cGJfZmllbGRkZWZfc2V0bmFtZShyLT5mLCBuYW1lLCBOVUxMKTsKLSAgZnJlZShuYW1lKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBzaXplX3QgZmllbGRfb250eXBlbmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBjaGFyICpuYW1lID0gdXBiX3N0cm5kdXAoYnVmLCBuKTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLQotICAvKiBYWFg6IHNlZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICovCi0gIHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKHItPmYsIG5hbWUsIE5VTEwpOwotICBmcmVlKG5hbWUpOwotICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHNpemVfdCBmaWVsZF9vbmV4dGVuZGVlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIGNoYXIgKm5hbWUgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotCi0gIC8qIFhYWDogc2VlIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gKi8KLSAgdXBiX2ZpZWxkZGVmX3NldGNvbnRhaW5pbmd0eXBlbmFtZShyLT5mLCBuYW1lLCBOVUxMKTsKLSAgZnJlZShuYW1lKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBzaXplX3QgZmllbGRfb25kZWZhdWx0dmFsKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLQotICAvKiBIYXZlIHRvIGNvbnZlcnQgZnJvbSBzdHJpbmcgdG8gdGhlIGNvcnJlY3QgdHlwZSwgYnV0IHdlIG1pZ2h0IG5vdCBrbm93IHRoZQotICAgKiB0eXBlIHlldCwgc28gd2Ugc2F2ZSBpdCBhcyBhIHN0cmluZyB1bnRpbCB0aGUgZW5kIG9mIHRoZSBmaWVsZC4KLSAgICogWFhYOiBzZWUgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAqLwotICBmcmVlKHItPmRlZmF1bHRfc3RyaW5nKTsKLSAgci0+ZGVmYXVsdF9zdHJpbmcgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICByZXR1cm4gbjsKLX0KLQotLyogSGFuZGxlcnMgZm9yIGdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gKHJlcHJlc2VudGluZyBhIG1lc3NhZ2UpLiAqLwotc3RhdGljIGJvb2wgbXNnX3N0YXJ0bXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgdXBiX2RlZmxpc3RfcHVzaCgmci0+ZGVmcywKLSAgICAgICAgICAgICAgICAgICB1cGJfbXNnZGVmX3VwY2FzdF9tdXRhYmxlKHVwYl9tc2dkZWZfbmV3KCZyLT5kZWZzKSkpOwotICB1cGJfZGVzY3JlYWRlcl9zdGFydGNvbnRhaW5lcihyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIG1zZ19lbmRtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIHVwYl9tc2dkZWYgKm0gPSB1cGJfZGVzY3JlYWRlcl90b3Aocik7Ci0gIFVQQl9VTlVTRUQoaGQpOwotCi0gIGlmKCF1cGJfZGVmX2Z1bGxuYW1lKHVwYl9tc2dkZWZfdXBjYXN0X211dGFibGUobSkpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2coc3RhdHVzLCAiRW5jb3VudGVyZWQgbWVzc2FnZSB3aXRoIG5vIG5hbWUuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVwYl9kZXNjcmVhZGVyX2VuZGNvbnRhaW5lcihyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzaXplX3QgbXNnX29ubmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICB1cGJfbXNnZGVmICptID0gdXBiX2Rlc2NyZWFkZXJfdG9wKHIpOwotICAvKiBYWFg6IHNlZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICovCi0gIGNoYXIgKm5hbWUgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotCi0gIHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3RfbXV0YWJsZShtKSwgbmFtZSwgTlVMTCk7Ci0gIHVwYl9kZXNjcmVhZGVyX3NldHNjb3BlbmFtZShyLCBuYW1lKTsgIC8qIFBhc3NlcyBvd25lcnNoaXAgb2YgbmFtZS4gKi8KLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBib29sIG1zZ19vbmVuZGZpZWxkKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgdXBiX21zZ2RlZiAqbSA9IHVwYl9kZXNjcmVhZGVyX3RvcChyKTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgdXBiX21zZ2RlZl9hZGRmaWVsZChtLCByLT5mLCAmci0+ZGVmcywgTlVMTCk7Ci0gIHItPmYgPSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgcHVzaGV4dGVuc2lvbih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotCi0gIGFzc2VydCh1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGVuYW1lKHItPmYpKTsKLSAgdXBiX2ZpZWxkZGVmX3NldGlzZXh0ZW5zaW9uKHItPmYsIHRydWUpOwotICB1cGJfZGVmbGlzdF9wdXNoKCZyLT5kZWZzLCB1cGJfZmllbGRkZWZfdXBjYXN0X211dGFibGUoci0+ZikpOwotICByLT5mID0gTlVMTDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLSNkZWZpbmUgRChuYW1lKSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl8gIyMgbmFtZShzKQotCi1zdGF0aWMgdm9pZCByZWdoYW5kbGVycyhjb25zdCB2b2lkICpjbG9zdXJlLCB1cGJfaGFuZGxlcnMgKmgpIHsKLSAgY29uc3QgdXBiX3N5bXRhYiAqcyA9IGNsb3N1cmU7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfaGFuZGxlcnNfbXNnZGVmKGgpOwotCi0gIGlmIChtID09IEQoRGVzY3JpcHRvclByb3RvKSkgewotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydG1zZyhoLCAmbXNnX3N0YXJ0bXNnLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0ZW5kbXNnKGgsICZtc2dfZW5kbXNnLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEQoRGVzY3JpcHRvclByb3RvX25hbWUpLCAmbXNnX29ubmFtZSwgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGVuZHN1Ym1zZyhoLCBEKERlc2NyaXB0b3JQcm90b19maWVsZCksICZtc2dfb25lbmRmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2coaCwgRChEZXNjcmlwdG9yUHJvdG9fZXh0ZW5zaW9uKSwgJnB1c2hleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfSBlbHNlIGlmIChtID09IEQoRmlsZURlc2NyaXB0b3JQcm90bykpIHsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRtc2coaCwgJmZpbGVfc3RhcnRtc2csIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRlbmRtc2coaCwgJmZpbGVfZW5kbXNnLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEQoRmlsZURlc2NyaXB0b3JQcm90b19wYWNrYWdlKSwgJmZpbGVfb25wYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGVuZHN1Ym1zZyhoLCBEKEZpbGVEZXNjcmlwdG9yUHJvdG9fZXh0ZW5zaW9uKSwgJnB1c2hleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfSBlbHNlIGlmIChtID09IEQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKSkgewotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydG1zZyhoLCAmZW51bXZhbF9zdGFydG1zZywgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGVuZG1zZyhoLCAmZW51bXZhbF9lbmRtc2csIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgRChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fbmFtZSksICZlbnVtdmFsX29ubmFtZSwgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIEQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX251bWJlciksICZlbnVtdmFsX29ubnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfSBlbHNlIGlmIChtID09IEQoRW51bURlc2NyaXB0b3JQcm90bykpIHsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRtc2coaCwgJmVudW1fc3RhcnRtc2csIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRlbmRtc2coaCwgJmVudW1fZW5kbXNnLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEQoRW51bURlc2NyaXB0b3JQcm90b19uYW1lKSwgJmVudW1fb25uYW1lLCBOVUxMKTsKLSAgfSBlbHNlIGlmIChtID09IEQoRmllbGREZXNjcmlwdG9yUHJvdG8pKSB7Ci0gICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKGgsICZmaWVsZF9zdGFydG1zZywgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGVuZG1zZyhoLCAmZmllbGRfZW5kbXNnLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwgRChGaWVsZERlc2NyaXB0b3JQcm90b190eXBlKSwgJmZpZWxkX29udHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIEQoRmllbGREZXNjcmlwdG9yUHJvdG9fbGFiZWwpLCAmZmllbGRfb25sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIEQoRmllbGREZXNjcmlwdG9yUHJvdG9fbnVtYmVyKSwgJmZpZWxkX29ubnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEQoRmllbGREZXNjcmlwdG9yUHJvdG9fbmFtZSksICZmaWVsZF9vbm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEQoRmllbGREZXNjcmlwdG9yUHJvdG9fdHlwZV9uYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9vbnR5cGVuYW1lLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEQoRmllbGREZXNjcmlwdG9yUHJvdG9fZXh0ZW5kZWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX29uZXh0ZW5kZWUsIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgRChGaWVsZERlc2NyaXB0b3JQcm90b19kZWZhdWx0X3ZhbHVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9vbmRlZmF1bHR2YWwsIE5VTEwpOwotICB9IGVsc2UgaWYgKG0gPT0gRChGaWVsZE9wdGlvbnMpKSB7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGJvb2woaCwgRChGaWVsZE9wdGlvbnNfbGF6eSksICZmaWVsZF9vbmxhenksIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRib29sKGgsIEQoRmllbGRPcHRpb25zX3BhY2tlZCksICZmaWVsZF9vbnBhY2tlZCwgTlVMTCk7Ci0gIH0KLX0KLQotI3VuZGVmIEQKLQotdm9pZCBkZXNjcmVhZGVyX2NsZWFudXAodm9pZCAqX3IpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBfcjsKLSAgZnJlZShyLT5uYW1lKTsKLSAgdXBiX2RlZmxpc3RfdW5pbml0KCZyLT5kZWZzKTsKLSAgZnJlZShyLT5kZWZhdWx0X3N0cmluZyk7Ci0gIHdoaWxlIChyLT5zdGFja19sZW4gPiAwKSB7Ci0gICAgdXBiX2Rlc2NyZWFkZXJfZnJhbWUgKmYgPSAmci0+c3RhY2tbLS1yLT5zdGFja19sZW5dOwotICAgIGZyZWUoZi0+bmFtZSk7Ci0gIH0KLX0KLQotCi0vKiBQdWJsaWMgQVBJICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11cGJfZGVzY3JlYWRlciAqdXBiX2Rlc2NyZWFkZXJfY3JlYXRlKHVwYl9lbnYgKmUsIGNvbnN0IHVwYl9oYW5kbGVycyAqaCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IHVwYl9lbnZfbWFsbG9jKGUsIHNpemVvZih1cGJfZGVzY3JlYWRlcikpOwotICBpZiAoIXIgfHwgIXVwYl9lbnZfYWRkY2xlYW51cChlLCBkZXNjcmVhZGVyX2NsZWFudXAsIHIpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB1cGJfZGVmbGlzdF9pbml0KCZyLT5kZWZzKTsKLSAgdXBiX3NpbmtfcmVzZXQodXBiX2Rlc2NyZWFkZXJfaW5wdXQociksIGgsIHIpOwotICByLT5zdGFja19sZW4gPSAwOwotICByLT5uYW1lID0gTlVMTDsKLSAgci0+ZGVmYXVsdF9zdHJpbmcgPSBOVUxMOwotCi0gIHJldHVybiByOwotfQotCi11cGJfZGVmICoqdXBiX2Rlc2NyZWFkZXJfZ2V0ZGVmcyh1cGJfZGVzY3JlYWRlciAqciwgdm9pZCAqb3duZXIsIGludCAqbikgewotICAqbiA9IHItPmRlZnMubGVuOwotICB1cGJfZGVmbGlzdF9kb25hdGVyZWZzKCZyLT5kZWZzLCBvd25lcik7Ci0gIHJldHVybiByLT5kZWZzLmRlZnM7Ci19Ci0KLXVwYl9zaW5rICp1cGJfZGVzY3JlYWRlcl9pbnB1dCh1cGJfZGVzY3JlYWRlciAqcikgewotICByZXR1cm4gJnItPnNpbms7Ci19Ci0KLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX2Rlc2NyZWFkZXJfbmV3aGFuZGxlcnMoY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgY29uc3QgdXBiX3N5bXRhYiAqcyA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX2Rlc2NyaXB0b3IoJnMpOwotICBjb25zdCB1cGJfaGFuZGxlcnMgKmggPSB1cGJfaGFuZGxlcnNfbmV3ZnJvemVuKAotICAgICAgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JTZXQocyksIG93bmVyLCByZWdoYW5kbGVycywgcyk7Ci0gIHVwYl9zeW10YWJfdW5yZWYocywgJnMpOwotICByZXR1cm4gaDsKLX0KLS8qCi0qKiBwcm90b2J1ZiBkZWNvZGVyIGJ5dGVjb2RlIGNvbXBpbGVyCi0qKgotKiogQ29kZSB0byBjb21waWxlIGEgdXBiOjpIYW5kbGVycyBpbnRvIGJ5dGVjb2RlIGZvciBkZWNvZGluZyBhIHByb3RvYnVmCi0qKiBhY2NvcmRpbmcgdG8gdGhhdCBzcGVjaWZpYyBzY2hlbWEgYW5kIGRlc3RpbmF0aW9uIGhhbmRsZXJzLgotKioKLSoqIENvbXBpbGluZyB0byBieXRlY29kZSBpcyBhbHdheXMgdGhlIGZpcnN0IHN0ZXAuICBJZiB3ZSBhcmUgdXNpbmcgdGhlCi0qKiBpbnRlcnByZXRlZCBkZWNvZGVyIHdlIGxlYXZlIGl0IGFzIGJ5dGVjb2RlIGFuZCBpbnRlcnByZXQgdGhhdC4gIElmIHdlIGFyZQotKiogdXNpbmcgYSBKSVQgZGVjb2RlciB3ZSB1c2UgYSBjb2RlIGdlbmVyYXRvciB0byB0dXJuIHRoZSBieXRlY29kZSBpbnRvIG5hdGl2ZQotKiogY29kZSwgTExWTSBJUiwgZXRjLgotKioKLSoqIEJ5dGVjb2RlIGRlZmluaXRpb24gaXMgaW4gZGVjb2Rlci5pbnQuaC4KLSovCi0KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLQotI2lmZGVmIFVQQl9EVU1QX0JZVEVDT0RFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jZGVmaW5lIE1BWExBQkVMIDUKLSNkZWZpbmUgRU1QVFlMQUJFTCAtMQotCi0vKiBtZ3JvdXAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBmcmVlZ3JvdXAodXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgbWdyb3VwICpnID0gKG1ncm91cCopcjsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmZy0+bWV0aG9kcyk7Ci0jaWZkZWYgVVBCX1VTRV9KSVRfWDY0Ci0gIHVwYl9wYmRlY29kZXJfZnJlZWppdChnKTsKLSNlbmRpZgotICBmcmVlKGctPmJ5dGVjb2RlKTsKLSAgZnJlZShnKTsKLX0KLQotc3RhdGljIHZvaWQgdmlzaXRncm91cChjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWRfdmlzaXQgKnZpc2l0LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IG1ncm91cCAqZyA9IChjb25zdCBtZ3JvdXAqKXI7Ci0gIHVwYl9pbnR0YWJsZV9pdGVyIGk7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgJmctPm1ldGhvZHMpOwotICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICB1cGJfcGJkZWNvZGVybWV0aG9kICptZXRob2QgPSB1cGJfdmFsdWVfZ2V0cHRyKHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKCZpKSk7Ci0gICAgdmlzaXQociwgdXBiX3BiZGVjb2Rlcm1ldGhvZF91cGNhc3QobWV0aG9kKSwgY2xvc3VyZSk7Ci0gIH0KLX0KLQotbWdyb3VwICpuZXdncm91cChjb25zdCB2b2lkICpvd25lcikgewotICBtZ3JvdXAgKmcgPSBtYWxsb2Moc2l6ZW9mKCpnKSk7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB2dGJsID0ge3Zpc2l0Z3JvdXAsIGZyZWVncm91cH07Ci0gIHVwYl9yZWZjb3VudGVkX2luaXQobWdyb3VwX3VwY2FzdF9tdXRhYmxlKGcpLCAmdnRibCwgb3duZXIpOwotICB1cGJfaW50dGFibGVfaW5pdCgmZy0+bWV0aG9kcywgVVBCX0NUWVBFX1BUUik7Ci0gIGctPmJ5dGVjb2RlID0gTlVMTDsKLSAgZy0+Ynl0ZWNvZGVfZW5kID0gTlVMTDsKLSAgcmV0dXJuIGc7Ci19Ci0KLQotLyogdXBiX3BiZGVjb2Rlcm1ldGhvZCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgZnJlZW1ldGhvZCh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfcGJkZWNvZGVybWV0aG9kICptZXRob2QgPSAodXBiX3BiZGVjb2Rlcm1ldGhvZCopcjsKLQotICBpZiAobWV0aG9kLT5kZXN0X2hhbmRsZXJzXykgewotICAgIHVwYl9oYW5kbGVyc191bnJlZihtZXRob2QtPmRlc3RfaGFuZGxlcnNfLCBtZXRob2QpOwotICB9Ci0KLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmbWV0aG9kLT5kaXNwYXRjaCk7Ci0gIGZyZWUobWV0aG9kKTsKLX0KLQotc3RhdGljIHZvaWQgdmlzaXRtZXRob2QoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkX3Zpc2l0ICp2aXNpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbSA9IChjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kKilyOwotICB2aXNpdChyLCBtLT5ncm91cCwgY2xvc3VyZSk7Ci19Ci0KLXN0YXRpYyB1cGJfcGJkZWNvZGVybWV0aG9kICpuZXdtZXRob2QoY29uc3QgdXBiX2hhbmRsZXJzICpkZXN0X2hhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ3JvdXAgKmdyb3VwKSB7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB2dGJsID0ge3Zpc2l0bWV0aG9kLCBmcmVlbWV0aG9kfTsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqcmV0ID0gbWFsbG9jKHNpemVvZigqcmV0KSk7Ci0gIHVwYl9yZWZjb3VudGVkX2luaXQodXBiX3BiZGVjb2Rlcm1ldGhvZF91cGNhc3RfbXV0YWJsZShyZXQpLCAmdnRibCwgJnJldCk7Ci0gIHVwYl9ieXRlc2hhbmRsZXJfaW5pdCgmcmV0LT5pbnB1dF9oYW5kbGVyXyk7Ci0KLSAgLyogVGhlIG1ldGhvZCByZWZlcmVuY2VzIHRoZSBncm91cCBhbmQgdmljZS12ZXJzYSwgaW4gYSBjaXJjdWxhciByZWZlcmVuY2UuICovCi0gIHVwYl9yZWYyKHJldCwgZ3JvdXApOwotICB1cGJfcmVmMihncm91cCwgcmV0KTsKLSAgdXBiX2ludHRhYmxlX2luc2VydHB0cigmZ3JvdXAtPm1ldGhvZHMsIGRlc3RfaGFuZGxlcnMsIHVwYl92YWx1ZV9wdHIocmV0KSk7Ci0gIHVwYl9wYmRlY29kZXJtZXRob2RfdW5yZWYocmV0LCAmcmV0KTsKLQotICByZXQtPmdyb3VwID0gbWdyb3VwX3VwY2FzdF9tdXRhYmxlKGdyb3VwKTsKLSAgcmV0LT5kZXN0X2hhbmRsZXJzXyA9IGRlc3RfaGFuZGxlcnM7Ci0gIHJldC0+aXNfbmF0aXZlXyA9IGZhbHNlOyAgLyogSWYgd2UgSklULCBpdCB3aWxsIHVwZGF0ZSB0aGlzIGxhdGVyLiAqLwotICB1cGJfaW50dGFibGVfaW5pdCgmcmV0LT5kaXNwYXRjaCwgVVBCX0NUWVBFX1VJTlQ2NCk7Ci0KLSAgaWYgKHJldC0+ZGVzdF9oYW5kbGVyc18pIHsKLSAgICB1cGJfaGFuZGxlcnNfcmVmKHJldC0+ZGVzdF9oYW5kbGVyc18sIHJldCk7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfcGJkZWNvZGVybWV0aG9kX2Rlc3RoYW5kbGVycygKLSAgICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptKSB7Ci0gIHJldHVybiBtLT5kZXN0X2hhbmRsZXJzXzsKLX0KLQotY29uc3QgdXBiX2J5dGVzaGFuZGxlciAqdXBiX3BiZGVjb2Rlcm1ldGhvZF9pbnB1dGhhbmRsZXIoCi0gICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbSkgewotICByZXR1cm4gJm0tPmlucHV0X2hhbmRsZXJfOwotfQotCi1ib29sIHVwYl9wYmRlY29kZXJtZXRob2RfaXNuYXRpdmUoY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbSkgewotICByZXR1cm4gbS0+aXNfbmF0aXZlXzsKLX0KLQotY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqdXBiX3BiZGVjb2Rlcm1ldGhvZF9uZXcoCi0gICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKm9wdHMsIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKnJldDsKLSAgdXBiX3BiY29kZWNhY2hlIGNhY2hlOwotCi0gIHVwYl9wYmNvZGVjYWNoZV9pbml0KCZjYWNoZSk7Ci0gIHJldCA9IHVwYl9wYmNvZGVjYWNoZV9nZXRkZWNvZGVybWV0aG9kKCZjYWNoZSwgb3B0cyk7Ci0gIHVwYl9wYmRlY29kZXJtZXRob2RfcmVmKHJldCwgb3duZXIpOwotICB1cGJfcGJjb2RlY2FjaGVfdW5pbml0KCZjYWNoZSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLQotLyogYnl0ZWNvZGUgY29tcGlsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRGF0YSB1c2VkIG9ubHkgYXQgY29tcGlsYXRpb24gdGltZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgbWdyb3VwICpncm91cDsKLQotICB1aW50MzJfdCAqcGM7Ci0gIGludCBmd2RfbGFiZWxzW01BWExBQkVMXTsKLSAgaW50IGJhY2tfbGFiZWxzW01BWExBQkVMXTsKLQotICAvKiBGb3IgZmllbGRzIG1hcmtlZCAibGF6eSIsIHBhcnNlIHRoZW0gbGF6aWx5IG9yIGVhZ2VybHk/ICovCi0gIGJvb2wgbGF6eTsKLX0gY29tcGlsZXI7Ci0KLXN0YXRpYyBjb21waWxlciAqbmV3Y29tcGlsZXIobWdyb3VwICpncm91cCwgYm9vbCBsYXp5KSB7Ci0gIGNvbXBpbGVyICpyZXQgPSBtYWxsb2Moc2l6ZW9mKCpyZXQpKTsKLSAgaW50IGk7Ci0KLSAgcmV0LT5ncm91cCA9IGdyb3VwOwotICByZXQtPmxhenkgPSBsYXp5OwotICBmb3IgKGkgPSAwOyBpIDwgTUFYTEFCRUw7IGkrKykgewotICAgIHJldC0+ZndkX2xhYmVsc1tpXSA9IEVNUFRZTEFCRUw7Ci0gICAgcmV0LT5iYWNrX2xhYmVsc1tpXSA9IEVNUFRZTEFCRUw7Ci0gIH0KLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZWNvbXBpbGVyKGNvbXBpbGVyICpjKSB7Ci0gIGZyZWUoYyk7Ci19Ci0KLWNvbnN0IHNpemVfdCBwdHJfd29yZHMgPSBzaXplb2Yodm9pZCopIC8gc2l6ZW9mKHVpbnQzMl90KTsKLQotLyogSG93IG1hbnkgd29yZHMgYW4gaW5zdHJ1Y3Rpb24gaXMuICovCi1zdGF0aWMgaW50IGluc3RydWN0aW9uX2xlbih1aW50MzJfdCBpbnN0cikgewotICBzd2l0Y2ggKGdldG9wKGluc3RyKSkgewotICAgIGNhc2UgT1BfU0VURElTUEFUQ0g6IHJldHVybiAxICsgcHRyX3dvcmRzOwotICAgIGNhc2UgT1BfVEFHTjogcmV0dXJuIDM7Ci0gICAgY2FzZSBPUF9TRVRCSUdHUk9VUE5VTTogcmV0dXJuIDI7Ci0gICAgZGVmYXVsdDogcmV0dXJuIDE7Ci0gIH0KLX0KLQotYm9vbCBvcF9oYXNfbG9uZ29mcyhpbnQzMl90IGluc3RydWN0aW9uKSB7Ci0gIHN3aXRjaCAoZ2V0b3AoaW5zdHJ1Y3Rpb24pKSB7Ci0gICAgY2FzZSBPUF9DQUxMOgotICAgIGNhc2UgT1BfQlJBTkNIOgotICAgIGNhc2UgT1BfQ0hFQ0tERUxJTToKLSAgICAgIHJldHVybiB0cnVlOwotICAgIC8qIFRoZSAidGFnIiBpbnN0cnVjdGlvbnMgb25seSBoYXZlIDggYnl0ZXMgYXZhaWxhYmxlIGZvciB0aGUganVtcCB0YXJnZXQsCi0gICAgICogYnV0IHRoYXQgaXMgb2sgYmVjYXVzZSB0aGVzZSBvcGNvZGVzIG9ubHkgcmVxdWlyZSBzaG9ydCBqdW1wcy4gKi8KLSAgICBjYXNlIE9QX1RBRzE6Ci0gICAgY2FzZSBPUF9UQUcyOgotICAgIGNhc2UgT1BfVEFHTjoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1zdGF0aWMgaW50MzJfdCBnZXRvZnModWludDMyX3QgaW5zdHJ1Y3Rpb24pIHsKLSAgaWYgKG9wX2hhc19sb25nb2ZzKGluc3RydWN0aW9uKSkgewotICAgIHJldHVybiAoaW50MzJfdClpbnN0cnVjdGlvbiA+PiA4OwotICB9IGVsc2UgewotICAgIHJldHVybiAoaW50OF90KShpbnN0cnVjdGlvbiA+PiA4KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXRvZnModWludDMyX3QgKmluc3RydWN0aW9uLCBpbnQzMl90IG9mcykgewotICBpZiAob3BfaGFzX2xvbmdvZnMoKmluc3RydWN0aW9uKSkgewotICAgICppbnN0cnVjdGlvbiA9IGdldG9wKCppbnN0cnVjdGlvbikgfCBvZnMgPDwgODsKLSAgfSBlbHNlIHsKLSAgICAqaW5zdHJ1Y3Rpb24gPSAoKmluc3RydWN0aW9uICYgfjB4ZmYwMCkgfCAoKG9mcyAmIDB4ZmYpIDw8IDgpOwotICB9Ci0gIGFzc2VydChnZXRvZnMoKmluc3RydWN0aW9uKSA9PSBvZnMpOyAgLyogV291bGQgZmFpbCBpbiBjYXNlcyBvZiBvdmVyZmxvdy4gKi8KLX0KLQotc3RhdGljIHVpbnQzMl90IHBjb2ZzKGNvbXBpbGVyICpjKSB7IHJldHVybiBjLT5wYyAtIGMtPmdyb3VwLT5ieXRlY29kZTsgfQotCi0vKiBEZWZpbmVzIGEgbG9jYWwgbGFiZWwgYXQgdGhlIGN1cnJlbnQgUEMgbG9jYXRpb24uICBBbGwgcHJldmlvdXMgZm9yd2FyZAotICogcmVmZXJlbmNlcyBhcmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGlzIGxvY2F0aW9uLiAgVGhlIGxvY2F0aW9uIGlzIG5vdGVkCi0gKiBmb3IgYW55IGZ1dHVyZSBiYWNrd2FyZCByZWZlcmVuY2VzLiAqLwotc3RhdGljIHZvaWQgbGFiZWwoY29tcGlsZXIgKmMsIHVuc2lnbmVkIGludCBsYWJlbCkgewotICBpbnQgdmFsOwotICB1aW50MzJfdCAqY29kZXA7Ci0KLSAgYXNzZXJ0KGxhYmVsIDwgTUFYTEFCRUwpOwotICB2YWwgPSBjLT5md2RfbGFiZWxzW2xhYmVsXTsKLSAgY29kZXAgPSAodmFsID09IEVNUFRZTEFCRUwpID8gTlVMTCA6IGMtPmdyb3VwLT5ieXRlY29kZSArIHZhbDsKLSAgd2hpbGUgKGNvZGVwKSB7Ci0gICAgaW50IG9mcyA9IGdldG9mcygqY29kZXApOwotICAgIHNldG9mcyhjb2RlcCwgYy0+cGMgLSBjb2RlcCAtIGluc3RydWN0aW9uX2xlbigqY29kZXApKTsKLSAgICBjb2RlcCA9IG9mcyA/IGNvZGVwICsgb2ZzIDogTlVMTDsKLSAgfQotICBjLT5md2RfbGFiZWxzW2xhYmVsXSA9IEVNUFRZTEFCRUw7Ci0gIGMtPmJhY2tfbGFiZWxzW2xhYmVsXSA9IHBjb2ZzKGMpOwotfQotCi0vKiBDcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGEgbnVtYmVyZWQgbGFiZWw7IGVpdGhlciBhIGZvcndhcmQgcmVmZXJlbmNlCi0gKiAocG9zaXRpdmUgYXJnKSBvciBiYWNrd2FyZCByZWZlcmVuY2UgKG5lZ2F0aXZlIGFyZykuICBGb3IgZm9yd2FyZCByZWZlcmVuY2VzCi0gKiB0aGUgdmFsdWUgcmV0dXJuZWQgbm93IGlzIGFjdHVhbGx5IGEgIm5leHQiIHBvaW50ZXIgaW50byBhIGxpbmtlZCBsaXN0IG9mIGFsbAotICogaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoaXMgbGFiZWwgYW5kIHdpbGwgYmUgcGF0Y2hlZCBsYXRlciB3aGVuIHRoZSBsYWJlbCBpcwotICogZGVmaW5lZCB3aXRoIGxhYmVsKCkuCi0gKgotICogVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBvZmZzZXQgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIHRoZSBpbnN0cnVjdGlvbi4KLSAqLwotc3RhdGljIGludDMyX3QgbGFiZWxyZWYoY29tcGlsZXIgKmMsIGludCBsYWJlbCkgewotICBhc3NlcnQobGFiZWwgPCBNQVhMQUJFTCk7Ci0gIGlmIChsYWJlbCA9PSBMQUJFTF9ESVNQQVRDSCkgewotICAgIC8qIE5vIHJlc29sdmluZyByZXF1aXJlZC4gKi8KLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIGlmIChsYWJlbCA8IDApIHsKLSAgICAvKiBCYWNrd2FyZCBsb2NhbCBsYWJlbC4gIFJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLiAqLwotICAgIHVpbnQzMl90IGZyb20gPSAoYy0+cGMgKyAxKSAtIGMtPmdyb3VwLT5ieXRlY29kZTsKLSAgICByZXR1cm4gYy0+YmFja19sYWJlbHNbLWxhYmVsXSAtIGZyb207Ci0gIH0gZWxzZSB7Ci0gICAgLyogRm9yd2FyZCBsb2NhbCBsYWJlbDogcHJlcGVuZCB0byAocG9zc2libHktZW1wdHkpIGxpbmtlZCBsaXN0LiAqLwotICAgIGludCAqbHB0ciA9ICZjLT5md2RfbGFiZWxzW2xhYmVsXTsKLSAgICBpbnQzMl90IHJldCA9ICgqbHB0ciA9PSBFTVBUWUxBQkVMKSA/IDAgOiAqbHB0ciAtIHBjb2ZzKGMpOwotICAgICpscHRyID0gcGNvZnMoYyk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXQzMihjb21waWxlciAqYywgdWludDMyX3QgdikgewotICBtZ3JvdXAgKmcgPSBjLT5ncm91cDsKLSAgaWYgKGMtPnBjID09IGctPmJ5dGVjb2RlX2VuZCkgewotICAgIGludCBvZnMgPSBwY29mcyhjKTsKLSAgICBzaXplX3Qgb2xkc2l6ZSA9IGctPmJ5dGVjb2RlX2VuZCAtIGctPmJ5dGVjb2RlOwotICAgIHNpemVfdCBuZXdzaXplID0gVVBCX01BWChvbGRzaXplICogMiwgNjQpOwotICAgIC8qIFRPRE8oaGFiZXJtYW4pOiBoYW5kbGUgT09NLiAqLwotICAgIGctPmJ5dGVjb2RlID0gcmVhbGxvYyhnLT5ieXRlY29kZSwgbmV3c2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOwotICAgIGctPmJ5dGVjb2RlX2VuZCA9IGctPmJ5dGVjb2RlICsgbmV3c2l6ZTsKLSAgICBjLT5wYyA9IGctPmJ5dGVjb2RlICsgb2ZzOwotICB9Ci0gICpjLT5wYysrID0gdjsKLX0KLQotc3RhdGljIHZvaWQgcHV0b3AoY29tcGlsZXIgKmMsIG9wY29kZSBvcCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBvcCk7Ci0KLSAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgT1BfU0VURElTUEFUQ0g6IHsKLSAgICAgIHVpbnRwdHJfdCBwdHIgPSAodWludHB0cl90KXZhX2FyZyhhcCwgdm9pZCopOwotICAgICAgcHV0MzIoYywgT1BfU0VURElTUEFUQ0gpOwotICAgICAgcHV0MzIoYywgcHRyKTsKLSAgICAgIGlmIChzaXplb2YodWludHB0cl90KSA+IHNpemVvZih1aW50MzJfdCkpCi0gICAgICAgIHB1dDMyKGMsICh1aW50NjRfdClwdHIgPj4gMzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1BfU1RBUlRNU0c6Ci0gICAgY2FzZSBPUF9FTkRNU0c6Ci0gICAgY2FzZSBPUF9QVVNITEVOREVMSU06Ci0gICAgY2FzZSBPUF9QT1A6Ci0gICAgY2FzZSBPUF9TRVRERUxJTToKLSAgICBjYXNlIE9QX0hBTFQ6Ci0gICAgY2FzZSBPUF9SRVQ6Ci0gICAgY2FzZSBPUF9ESVNQQVRDSDoKLSAgICAgIHB1dDMyKGMsIG9wKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BfUEFSU0VfRE9VQkxFOgotICAgIGNhc2UgT1BfUEFSU0VfRkxPQVQ6Ci0gICAgY2FzZSBPUF9QQVJTRV9JTlQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX1VJTlQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX0lOVDMyOgotICAgIGNhc2UgT1BfUEFSU0VfRklYRUQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX0ZJWEVEMzI6Ci0gICAgY2FzZSBPUF9QQVJTRV9CT09MOgotICAgIGNhc2UgT1BfUEFSU0VfVUlOVDMyOgotICAgIGNhc2UgT1BfUEFSU0VfU0ZJWEVEMzI6Ci0gICAgY2FzZSBPUF9QQVJTRV9TRklYRUQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX1NJTlQzMjoKLSAgICBjYXNlIE9QX1BBUlNFX1NJTlQ2NDoKLSAgICBjYXNlIE9QX1NUQVJUU0VROgotICAgIGNhc2UgT1BfRU5EU0VROgotICAgIGNhc2UgT1BfU1RBUlRTVUJNU0c6Ci0gICAgY2FzZSBPUF9FTkRTVUJNU0c6Ci0gICAgY2FzZSBPUF9TVEFSVFNUUjoKLSAgICBjYXNlIE9QX1NUUklORzoKLSAgICBjYXNlIE9QX0VORFNUUjoKLSAgICBjYXNlIE9QX1BVU0hUQUdERUxJTToKLSAgICAgIHB1dDMyKGMsIG9wIHwgdmFfYXJnKGFwLCB1cGJfc2VsZWN0b3JfdCkgPDwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QX1NFVEJJR0dST1VQTlVNOgotICAgICAgcHV0MzIoYywgb3ApOwotICAgICAgcHV0MzIoYywgdmFfYXJnKGFwLCBpbnQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BfQ0FMTDogewotICAgICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kID0gdmFfYXJnKGFwLCB1cGJfcGJkZWNvZGVybWV0aG9kICopOwotICAgICAgcHV0MzIoYywgb3AgfCAobWV0aG9kLT5jb2RlX2Jhc2Uub2ZzIC0gKHBjb2ZzKGMpICsgMSkpIDw8IDgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1BfQ0hFQ0tERUxJTToKLSAgICBjYXNlIE9QX0JSQU5DSDogewotICAgICAgdWludDMyX3QgaW5zdHJ1Y3Rpb24gPSBvcDsKLSAgICAgIGludCBsYWJlbCA9IHZhX2FyZyhhcCwgaW50KTsKLSAgICAgIHNldG9mcygmaW5zdHJ1Y3Rpb24sIGxhYmVscmVmKGMsIGxhYmVsKSk7Ci0gICAgICBwdXQzMihjLCBpbnN0cnVjdGlvbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPUF9UQUcxOgotICAgIGNhc2UgT1BfVEFHMjogewotICAgICAgaW50IGxhYmVsID0gdmFfYXJnKGFwLCBpbnQpOwotICAgICAgdWludDY0X3QgdGFnID0gdmFfYXJnKGFwLCB1aW50NjRfdCk7Ci0gICAgICB1aW50MzJfdCBpbnN0cnVjdGlvbiA9IG9wIHwgKHRhZyA8PCAxNik7Ci0gICAgICBhc3NlcnQodGFnIDw9IDB4ZmZmZik7Ci0gICAgICBzZXRvZnMoJmluc3RydWN0aW9uLCBsYWJlbHJlZihjLCBsYWJlbCkpOwotICAgICAgcHV0MzIoYywgaW5zdHJ1Y3Rpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1BfVEFHTjogewotICAgICAgaW50IGxhYmVsID0gdmFfYXJnKGFwLCBpbnQpOwotICAgICAgdWludDY0X3QgdGFnID0gdmFfYXJnKGFwLCB1aW50NjRfdCk7Ci0gICAgICB1aW50MzJfdCBpbnN0cnVjdGlvbiA9IG9wIHwgKHVwYl92YWx1ZV9zaXplKHRhZykgPDwgMTYpOwotICAgICAgc2V0b2ZzKCZpbnN0cnVjdGlvbiwgbGFiZWxyZWYoYywgbGFiZWwpKTsKLSAgICAgIHB1dDMyKGMsIGluc3RydWN0aW9uKTsKLSAgICAgIHB1dDMyKGMsIHRhZyk7Ci0gICAgICBwdXQzMihjLCB0YWcgPj4gMzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdmFfZW5kKGFwKTsKLX0KLQotI2lmIGRlZmluZWQoVVBCX1VTRV9KSVRfWDY0KSB8fCBkZWZpbmVkKFVQQl9EVU1QX0JZVEVDT0RFKQotCi1jb25zdCBjaGFyICp1cGJfcGJkZWNvZGVyX2dldG9wbmFtZSh1bnNpZ25lZCBpbnQgb3ApIHsKLSNkZWZpbmUgUVVPVEUoeCkgI3gKLSNkZWZpbmUgRVhQQU5EX0FORF9RVU9URSh4KSBRVU9URSh4KQotI2RlZmluZSBPUE5BTUUoeCkgT1BfIyN4Ci0jZGVmaW5lIE9QKHgpIGNhc2UgT1BOQU1FKHgpOiByZXR1cm4gRVhQQU5EX0FORF9RVU9URShPUE5BTUUoeCkpOwotI2RlZmluZSBUKHgpIE9QKFBBUlNFXyMjeCkKLSAgLyogS2VlcCBpbiBzeW5jIHdpdGggbGlzdCBpbiBkZWNvZGVyLmludC5oLiAqLwotICBzd2l0Y2ggKChvcGNvZGUpb3ApIHsKLSAgICBUKERPVUJMRSkgVChGTE9BVCkgVChJTlQ2NCkgVChVSU5UNjQpIFQoSU5UMzIpIFQoRklYRUQ2NCkgVChGSVhFRDMyKQotICAgIFQoQk9PTCkgVChVSU5UMzIpIFQoU0ZJWEVEMzIpIFQoU0ZJWEVENjQpIFQoU0lOVDMyKSBUKFNJTlQ2NCkKLSAgICBPUChTVEFSVE1TRykgT1AoRU5ETVNHKSBPUChTVEFSVFNFUSkgT1AoRU5EU0VRKSBPUChTVEFSVFNVQk1TRykKLSAgICBPUChFTkRTVUJNU0cpIE9QKFNUQVJUU1RSKSBPUChTVFJJTkcpIE9QKEVORFNUUikgT1AoQ0FMTCkgT1AoUkVUKQotICAgIE9QKFBVU0hMRU5ERUxJTSkgT1AoUFVTSFRBR0RFTElNKSBPUChTRVRERUxJTSkgT1AoQ0hFQ0tERUxJTSkKLSAgICBPUChCUkFOQ0gpIE9QKFRBRzEpIE9QKFRBRzIpIE9QKFRBR04pIE9QKFNFVERJU1BBVENIKSBPUChQT1ApCi0gICAgT1AoU0VUQklHR1JPVVBOVU0pIE9QKERJU1BBVENIKSBPUChIQUxUKQotICB9Ci0gIHJldHVybiAiPHVua25vd24gb3A+IjsKLSN1bmRlZiBPUAotI3VuZGVmIFQKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBVUEJfRFVNUF9CWVRFQ09ERQotCi1zdGF0aWMgdm9pZCBkdW1wYmModWludDMyX3QgKnAsIHVpbnQzMl90ICplbmQsIEZJTEUgKmYpIHsKLQotICB1aW50MzJfdCAqYmVnaW4gPSBwOwotCi0gIHdoaWxlIChwIDwgZW5kKSB7Ci0gICAgZnByaW50ZihmLCAiJXAgICU4dHgiLCBwLCBwIC0gYmVnaW4pOwotICAgIHVpbnQzMl90IGluc3RyID0gKnArKzsKLSAgICB1aW50OF90IG9wID0gZ2V0b3AoaW5zdHIpOwotICAgIGZwcmludGYoZiwgIiAlcyIsIHVwYl9wYmRlY29kZXJfZ2V0b3BuYW1lKG9wKSk7Ci0gICAgc3dpdGNoICgob3Bjb2RlKW9wKSB7Ci0gICAgICBjYXNlIE9QX1NFVERJU1BBVENIOiB7Ci0gICAgICAgIGNvbnN0IHVwYl9pbnR0YWJsZSAqZGlzcGF0Y2g7Ci0gICAgICAgIG1lbWNweSgmZGlzcGF0Y2gsIHAsIHNpemVvZih2b2lkKikpOwotICAgICAgICBwICs9IHB0cl93b3JkczsKLSAgICAgICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kID0KLSAgICAgICAgICAgICh2b2lkICopKChjaGFyICopZGlzcGF0Y2ggLQotICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YodXBiX3BiZGVjb2Rlcm1ldGhvZCwgZGlzcGF0Y2gpKTsKLSAgICAgICAgZnByaW50ZihmLCAiICVzIiwgdXBiX21zZ2RlZl9mdWxsbmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyc19tc2dkZWYobWV0aG9kLT5kZXN0X2hhbmRsZXJzXykpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9QX0RJU1BBVENIOgotICAgICAgY2FzZSBPUF9TVEFSVE1TRzoKLSAgICAgIGNhc2UgT1BfRU5ETVNHOgotICAgICAgY2FzZSBPUF9QVVNITEVOREVMSU06Ci0gICAgICBjYXNlIE9QX1BPUDoKLSAgICAgIGNhc2UgT1BfU0VUREVMSU06Ci0gICAgICBjYXNlIE9QX0hBTFQ6Ci0gICAgICBjYXNlIE9QX1JFVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX1BBUlNFX0RPVUJMRToKLSAgICAgIGNhc2UgT1BfUEFSU0VfRkxPQVQ6Ci0gICAgICBjYXNlIE9QX1BBUlNFX0lOVDY0OgotICAgICAgY2FzZSBPUF9QQVJTRV9VSU5UNjQ6Ci0gICAgICBjYXNlIE9QX1BBUlNFX0lOVDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9GSVhFRDY0OgotICAgICAgY2FzZSBPUF9QQVJTRV9GSVhFRDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9CT09MOgotICAgICAgY2FzZSBPUF9QQVJTRV9VSU5UMzI6Ci0gICAgICBjYXNlIE9QX1BBUlNFX1NGSVhFRDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9TRklYRUQ2NDoKLSAgICAgIGNhc2UgT1BfUEFSU0VfU0lOVDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9TSU5UNjQ6Ci0gICAgICBjYXNlIE9QX1NUQVJUU0VROgotICAgICAgY2FzZSBPUF9FTkRTRVE6Ci0gICAgICBjYXNlIE9QX1NUQVJUU1VCTVNHOgotICAgICAgY2FzZSBPUF9FTkRTVUJNU0c6Ci0gICAgICBjYXNlIE9QX1NUQVJUU1RSOgotICAgICAgY2FzZSBPUF9TVFJJTkc6Ci0gICAgICBjYXNlIE9QX0VORFNUUjoKLSAgICAgIGNhc2UgT1BfUFVTSFRBR0RFTElNOgotICAgICAgICBmcHJpbnRmKGYsICIgJWQiLCBpbnN0ciA+PiA4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX1NFVEJJR0dST1VQTlVNOgotICAgICAgICBmcHJpbnRmKGYsICIgJWQiLCAqcCsrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX0NIRUNLREVMSU06Ci0gICAgICBjYXNlIE9QX0NBTEw6Ci0gICAgICBjYXNlIE9QX0JSQU5DSDoKLSAgICAgICAgZnByaW50ZihmLCAiID0+MHgldHgiLCBwICsgZ2V0b2ZzKGluc3RyKSAtIGJlZ2luKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX1RBRzE6Ci0gICAgICBjYXNlIE9QX1RBRzI6IHsKLSAgICAgICAgZnByaW50ZihmLCAiIHRhZzoweCV4IiwgaW5zdHIgPj4gMTYpOwotICAgICAgICBpZiAoZ2V0b2ZzKGluc3RyKSkgewotICAgICAgICAgIGZwcmludGYoZiwgIiA9PjB4JXR4IiwgcCArIGdldG9mcyhpbnN0cikgLSBiZWdpbik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9QX1RBR046IHsKLSAgICAgICAgdWludDY0X3QgdGFnID0gKnArKzsKLSAgICAgICAgdGFnIHw9ICh1aW50NjRfdCkqcCsrIDw8IDMyOwotICAgICAgICBmcHJpbnRmKGYsICIgdGFnOjB4JWxseCIsIChsb25nIGxvbmcpdGFnKTsKLSAgICAgICAgZnByaW50ZihmLCAiIG46JWQiLCBpbnN0ciA+PiAxNik7Ci0gICAgICAgIGlmIChnZXRvZnMoaW5zdHIpKSB7Ci0gICAgICAgICAgZnByaW50ZihmLCAiID0+MHgldHgiLCBwICsgZ2V0b2ZzKGluc3RyKSAtIGJlZ2luKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnB1dHMoIlxuIiwgZik7Ci0gIH0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1aW50NjRfdCBnZXRfZW5jb2RlZF90YWcoY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBpbnQgd2lyZV90eXBlKSB7Ci0gIHVpbnQzMl90IHRhZyA9ICh1cGJfZmllbGRkZWZfbnVtYmVyKGYpIDw8IDMpIHwgd2lyZV90eXBlOwotICB1aW50NjRfdCBlbmNvZGVkX3RhZyA9IHVwYl92ZW5jb2RlMzIodGFnKTsKLSAgLyogTm8gdGFnIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gNSBieXRlcy4gKi8KLSAgYXNzZXJ0KGVuY29kZWRfdGFnIDw9IDB4ZmZmZmZmZmZmZik7Ci0gIHJldHVybiBlbmNvZGVkX3RhZzsKLX0KLQotc3RhdGljIHZvaWQgcHV0Y2hlY2t0YWcoY29tcGlsZXIgKmMsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aXJlX3R5cGUsIGludCBkZXN0KSB7Ci0gIHVpbnQ2NF90IHRhZyA9IGdldF9lbmNvZGVkX3RhZyhmLCB3aXJlX3R5cGUpOwotICBzd2l0Y2ggKHVwYl92YWx1ZV9zaXplKHRhZykpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBwdXRvcChjLCBPUF9UQUcxLCBkZXN0LCB0YWcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcHV0b3AoYywgT1BfVEFHMiwgZGVzdCwgdGFnKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwdXRvcChjLCBPUF9UQUdOLCBkZXN0LCB0YWcpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotc3RhdGljIHVwYl9zZWxlY3Rvcl90IGdldHNlbChjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUpIHsKLSAgdXBiX3NlbGVjdG9yX3Qgc2VsZWN0b3I7Ci0gIGJvb2wgb2sgPSB1cGJfaGFuZGxlcnNfZ2V0c2VsZWN0b3IoZiwgdHlwZSwgJnNlbGVjdG9yKTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIHNlbGVjdG9yOwotfQotCi0vKiBUYWtlcyBhbiBleGlzdGluZywgcHJpbWFyeSBkaXNwYXRjaCB0YWJsZSBlbnRyeSBhbmQgcmVwYWNrcyBpdCB3aXRoIGEKLSAqIGRpZmZlcmVudCBhbHRlcm5hdGUgd2lyZSB0eXBlLiAgQ2FsbGVkIHdoZW4gd2UgYXJlIGluc2VydGluZyBhIHNlY29uZGFyeQotICogZGlzcGF0Y2ggdGFibGUgZW50cnkgZm9yIGFuIGFsdGVybmF0ZSB3aXJlIHR5cGUuICovCi1zdGF0aWMgdWludDY0X3QgcmVwYWNrKHVpbnQ2NF90IGRpc3BhdGNoLCBpbnQgbmV3X3d0MikgewotICB1aW50NjRfdCBvZnM7Ci0gIHVpbnQ4X3Qgd3QxOwotICB1aW50OF90IG9sZF93dDI7Ci0gIHVwYl9wYmRlY29kZXJfdW5wYWNrZGlzcGF0Y2goZGlzcGF0Y2gsICZvZnMsICZ3dDEsICZvbGRfd3QyKTsKLSAgYXNzZXJ0KG9sZF93dDIgPT0gTk9fV0lSRV9UWVBFKTsgIC8qIHd0MiBzaG91bGQgbm90IGJlIHNldCB5ZXQuICovCi0gIHJldHVybiB1cGJfcGJkZWNvZGVyX3BhY2tkaXNwYXRjaChvZnMsIHd0MSwgbmV3X3d0Mik7Ci19Ci0KLS8qIE1hcmtzIHRoZSBjdXJyZW50IGJ5dGVjb2RlIHBvc2l0aW9uIGFzIHRoZSBkaXNwYXRjaCB0YXJnZXQgZm9yIHRoaXMgbWVzc2FnZSwKLSAqIGZpZWxkLCBhbmQgd2lyZSB0eXBlLiAqLwotc3RhdGljIHZvaWQgZGlzcGF0Y2h0YXJnZXQoY29tcGlsZXIgKmMsIHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgaW50IHdpcmVfdHlwZSkgewotICAvKiBPZmZzZXQgaXMgcmVsYXRpdmUgdG8gbXNnIGJhc2UuICovCi0gIHVpbnQ2NF90IG9mcyA9IHBjb2ZzKGMpIC0gbWV0aG9kLT5jb2RlX2Jhc2Uub2ZzOwotICB1aW50MzJfdCBmbiA9IHVwYl9maWVsZGRlZl9udW1iZXIoZik7Ci0gIHVwYl9pbnR0YWJsZSAqZCA9ICZtZXRob2QtPmRpc3BhdGNoOwotICB1cGJfdmFsdWUgdjsKLSAgaWYgKHVwYl9pbnR0YWJsZV9yZW1vdmUoZCwgZm4sICZ2KSkgewotICAgIC8qIFRPRE86IHByaW9yaXRpemUgYmFzZWQgb24gcGFja2VkIHNldHRpbmcgaW4gLnByb3RvIGZpbGUuICovCi0gICAgdWludDY0X3QgcmVwYWNrZWQgPSByZXBhY2sodXBiX3ZhbHVlX2dldHVpbnQ2NCh2KSwgd2lyZV90eXBlKTsKLSAgICB1cGJfaW50dGFibGVfaW5zZXJ0KGQsIGZuLCB1cGJfdmFsdWVfdWludDY0KHJlcGFja2VkKSk7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydChkLCBmbiArIFVQQl9NQVhfRklFTEROVU1CRVIsIHVwYl92YWx1ZV91aW50NjQob2ZzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDY0X3QgdmFsID0gdXBiX3BiZGVjb2Rlcl9wYWNrZGlzcGF0Y2gob2ZzLCB3aXJlX3R5cGUsIE5PX1dJUkVfVFlQRSk7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydChkLCBmbiwgdXBiX3ZhbHVlX3VpbnQ2NCh2YWwpKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXRwdXNoKGNvbXBpbGVyICpjLCBjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShmKSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0UpIHsKLSAgICBwdXRvcChjLCBPUF9QVVNITEVOREVMSU0pOwotICB9IGVsc2UgewotICAgIHVpbnQzMl90IGZuID0gdXBiX2ZpZWxkZGVmX251bWJlcihmKTsKLSAgICBpZiAoZm4gPj0gMSA8PCAyNCkgewotICAgICAgcHV0b3AoYywgT1BfUFVTSFRBR0RFTElNLCAwKTsKLSAgICAgIHB1dG9wKGMsIE9QX1NFVEJJR0dST1VQTlVNLCBmbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB1dG9wKGMsIE9QX1BVU0hUQUdERUxJTSwgZm4pOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqZmluZF9zdWJtZXRob2QoY29uc3QgY29tcGlsZXIgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBjb25zdCB1cGJfaGFuZGxlcnMgKnN1YiA9Ci0gICAgICB1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnMobWV0aG9kLT5kZXN0X2hhbmRsZXJzXywgZik7Ci0gIHVwYl92YWx1ZSB2OwotICByZXR1cm4gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmYy0+Z3JvdXAtPm1ldGhvZHMsIHN1YiwgJnYpCi0gICAgICAgICAgICAgPyB1cGJfdmFsdWVfZ2V0cHRyKHYpCi0gICAgICAgICAgICAgOiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBwdXRzZWwoY29tcGlsZXIgKmMsIG9wY29kZSBvcCwgdXBiX3NlbGVjdG9yX3Qgc2VsLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9oYW5kbGVycyAqaCkgewotICBpZiAodXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoaCwgc2VsKSkgewotICAgIHB1dG9wKGMsIG9wLCBzZWwpOwotICB9Ci19Ci0KLS8qIFB1dHMgYW4gb3Bjb2RlIHRvIGNhbGwgYSBjYWxsYmFjaywgYnV0IG9ubHkgaWYgYSBjYWxsYmFjayBhY3R1YWxseSBleGlzdHMgZm9yCi0gKiB0aGlzIGZpZWxkIGFuZCBoYW5kbGVyIHR5cGUuICovCi1zdGF0aWMgdm9pZCBtYXliZXB1dChjb21waWxlciAqYywgb3Bjb2RlIG9wLCBjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUpIHsKLSAgcHV0c2VsKGMsIG9wLCBnZXRzZWwoZiwgdHlwZSksIGgpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNsYXp5aGFuZGxlcnMoY29uc3QgdXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKCF1cGJfZmllbGRkZWZfbGF6eShmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKGgsIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNUUikpIHx8Ci0gICAgICAgICB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihoLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RSSU5HKSkgfHwKLSAgICAgICAgIHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKGgsIGdldHNlbChmLCBVUEJfSEFORExFUl9FTkRTVFIpKTsKLX0KLQotCi0vKiBieXRlY29kZSBjb21waWxlciBjb2RlIGdlbmVyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTeW1ib2xpYyBuYW1lcyBmb3Igb3VyIGxvY2FsIGxhYmVscy4gKi8KLSNkZWZpbmUgTEFCRUxfTE9PUFNUQVJUIDEgIC8qIFRvcCBvZiBhIHJlcGVhdGVkIGZpZWxkIGxvb3AuICovCi0jZGVmaW5lIExBQkVMX0xPT1BCUkVBSyAyICAvKiBUbyBqdW1wIG91dCBvZiBhIHJlcGVhdGVkIGxvb3AgKi8KLSNkZWZpbmUgTEFCRUxfRklFTEQgICAgIDMgIC8qIEp1bXAgYmFja3dhcmQgdG8gZmluZCB0aGUgbW9zdCByZWNlbnQgZmllbGQuICovCi0jZGVmaW5lIExBQkVMX0VORE1TRyAgICA0ICAvKiBUbyByZWFjaCB0aGUgT1BfRU5ETVNHIGluc3RyIGZvciB0aGlzIG1zZy4gKi8KLQotLyogR2VuZXJhdGVzIGJ5dGVjb2RlIHRvIHBhcnNlIGEgc2luZ2xlIG5vbi1sYXp5IG1lc3NhZ2UgZmllbGQuICovCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9tc2dmaWVsZChjb21waWxlciAqYywgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaCA9IHVwYl9wYmRlY29kZXJtZXRob2RfZGVzdGhhbmRsZXJzKG1ldGhvZCk7Ci0gIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKnN1Yl9tID0gZmluZF9zdWJtZXRob2QoYywgbWV0aG9kLCBmKTsKLSAgaW50IHdpcmVfdHlwZTsKLQotICBpZiAoIXN1Yl9tKSB7Ci0gICAgLyogRG9uJ3QgZW1pdCBhbnkgY29kZSBmb3IgdGhpcyBmaWVsZCBhdCBhbGw7IGl0IHdpbGwgYmUgcGFyc2VkIGFzIGFuCi0gICAgICogdW5rbm93biBmaWVsZC4gKi8KLSAgICByZXR1cm47Ci0gIH0KLQotICBsYWJlbChjLCBMQUJFTF9GSUVMRCk7Ci0KLSAgd2lyZV90eXBlID0KLSAgICAgICh1cGJfZmllbGRkZWZfZGVzY3JpcHRvcnR5cGUoZikgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9NRVNTQUdFKQotICAgICAgICAgID8gVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQKLSAgICAgICAgICA6IFVQQl9XSVJFX1RZUEVfU1RBUlRfR1JPVVA7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgewotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0VORE1TRyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgd2lyZV90eXBlLCBMQUJFTF9ESVNQQVRDSCk7Ci0gICBkaXNwYXRjaHRhcmdldChjLCBtZXRob2QsIGYsIHdpcmVfdHlwZSk7Ci0gICAgcHV0b3AoYywgT1BfUFVTSFRBR0RFTElNLCAwKTsKLSAgICBwdXRvcChjLCBPUF9TVEFSVFNFUSwgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRKSk7Ci0gICBsYWJlbChjLCBMQUJFTF9MT09QU1RBUlQpOwotICAgIHB1dHB1c2goYywgZik7Ci0gICAgcHV0b3AoYywgT1BfU1RBUlRTVUJNU0csIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNVQk1TRykpOwotICAgIHB1dG9wKGMsIE9QX0NBTEwsIHN1Yl9tKTsKLSAgICBwdXRvcChjLCBPUF9QT1ApOwotICAgIG1heWJlcHV0KGMsIE9QX0VORFNVQk1TRywgaCwgZiwgVVBCX0hBTkRMRVJfRU5EU1VCTVNHKTsKLSAgICBpZiAod2lyZV90eXBlID09IFVQQl9XSVJFX1RZUEVfREVMSU1JVEVEKSB7Ci0gICAgICBwdXRvcChjLCBPUF9TRVRERUxJTSk7Ci0gICAgfQotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgd2lyZV90eXBlLCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dG9wKGMsIE9QX0JSQU5DSCwgLUxBQkVMX0xPT1BTVEFSVCk7Ci0gICBsYWJlbChjLCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dG9wKGMsIE9QX1BPUCk7Ci0gICAgbWF5YmVwdXQoYywgT1BfRU5EU0VRLCBoLCBmLCBVUEJfSEFORExFUl9FTkRTRVEpOwotICB9IGVsc2UgewotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0VORE1TRyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgd2lyZV90eXBlLCBMQUJFTF9ESVNQQVRDSCk7Ci0gICBkaXNwYXRjaHRhcmdldChjLCBtZXRob2QsIGYsIHdpcmVfdHlwZSk7Ci0gICAgcHV0cHVzaChjLCBmKTsKLSAgICBwdXRvcChjLCBPUF9TVEFSVFNVQk1TRywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKSk7Ci0gICAgcHV0b3AoYywgT1BfQ0FMTCwgc3ViX20pOwotICAgIHB1dG9wKGMsIE9QX1BPUCk7Ci0gICAgbWF5YmVwdXQoYywgT1BfRU5EU1VCTVNHLCBoLCBmLCBVUEJfSEFORExFUl9FTkRTVUJNU0cpOwotICAgIGlmICh3aXJlX3R5cGUgPT0gVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQpIHsKLSAgICAgIHB1dG9wKGMsIE9QX1NFVERFTElNKTsKLSAgICB9Ci0gIH0KLX0KLQotLyogR2VuZXJhdGVzIGJ5dGVjb2RlIHRvIHBhcnNlIGEgc2luZ2xlIHN0cmluZyBvciBsYXp5IHN1Ym1lc3NhZ2UgZmllbGQuICovCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9kZWxpbWZpZWxkKGNvbXBpbGVyICpjLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZCkgewotICBjb25zdCB1cGJfaGFuZGxlcnMgKmggPSB1cGJfcGJkZWNvZGVybWV0aG9kX2Rlc3RoYW5kbGVycyhtZXRob2QpOwotCi0gIGxhYmVsKGMsIExBQkVMX0ZJRUxEKTsKLSAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgewotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0VORE1TRyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQsIExBQkVMX0RJU1BBVENIKTsKLSAgIGRpc3BhdGNodGFyZ2V0KGMsIG1ldGhvZCwgZiwgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQpOwotICAgIHB1dG9wKGMsIE9QX1BVU0hUQUdERUxJTSwgMCk7Ci0gICAgcHV0b3AoYywgT1BfU1RBUlRTRVEsIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNFUSkpOwotICAgbGFiZWwoYywgTEFCRUxfTE9PUFNUQVJUKTsKLSAgICBwdXRvcChjLCBPUF9QVVNITEVOREVMSU0pOwotICAgIHB1dG9wKGMsIE9QX1NUQVJUU1RSLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RBUlRTVFIpKTsKLSAgICAvKiBOZWVkIHRvIGVtaXQgZXZlbiBpZiBubyBoYW5kbGVyIHRvIHNraXAgcGFzdCB0aGUgc3RyaW5nLiAqLwotICAgIHB1dG9wKGMsIE9QX1NUUklORywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUUklORykpOwotICAgIHB1dG9wKGMsIE9QX1BPUCk7Ci0gICAgbWF5YmVwdXQoYywgT1BfRU5EU1RSLCBoLCBmLCBVUEJfSEFORExFUl9FTkRTVFIpOwotICAgIHB1dG9wKGMsIE9QX1NFVERFTElNKTsKLSAgICBwdXRvcChjLCBPUF9DSEVDS0RFTElNLCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dGNoZWNrdGFnKGMsIGYsIFVQQl9XSVJFX1RZUEVfREVMSU1JVEVELCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dG9wKGMsIE9QX0JSQU5DSCwgLUxBQkVMX0xPT1BTVEFSVCk7Ci0gICBsYWJlbChjLCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dG9wKGMsIE9QX1BPUCk7Ci0gICAgbWF5YmVwdXQoYywgT1BfRU5EU0VRLCBoLCBmLCBVUEJfSEFORExFUl9FTkRTRVEpOwotICB9IGVsc2UgewotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0VORE1TRyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQsIExBQkVMX0RJU1BBVENIKTsKLSAgIGRpc3BhdGNodGFyZ2V0KGMsIG1ldGhvZCwgZiwgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQpOwotICAgIHB1dG9wKGMsIE9QX1BVU0hMRU5ERUxJTSk7Ci0gICAgcHV0b3AoYywgT1BfU1RBUlRTVFIsIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNUUikpOwotICAgIHB1dG9wKGMsIE9QX1NUUklORywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUUklORykpOwotICAgIHB1dG9wKGMsIE9QX1BPUCk7Ci0gICAgbWF5YmVwdXQoYywgT1BfRU5EU1RSLCBoLCBmLCBVUEJfSEFORExFUl9FTkRTVFIpOwotICAgIHB1dG9wKGMsIE9QX1NFVERFTElNKTsKLSAgfQotfQotCi0vKiBHZW5lcmF0ZXMgYnl0ZWNvZGUgdG8gcGFyc2UgYSBzaW5nbGUgcHJpbWl0aXZlIGZpZWxkLiAqLwotc3RhdGljIHZvaWQgZ2VuZXJhdGVfcHJpbWl0aXZlZmllbGQoY29tcGlsZXIgKmMsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZCkgewotICBjb25zdCB1cGJfaGFuZGxlcnMgKmggPSB1cGJfcGJkZWNvZGVybWV0aG9kX2Rlc3RoYW5kbGVycyhtZXRob2QpOwotICB1cGJfZGVzY3JpcHRvcnR5cGVfdCBkZXNjcmlwdG9yX3R5cGUgPSB1cGJfZmllbGRkZWZfZGVzY3JpcHRvcnR5cGUoZik7Ci0gIG9wY29kZSBwYXJzZV90eXBlOwotICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0gIGludCB3aXJlX3R5cGU7Ci0KLSAgbGFiZWwoYywgTEFCRUxfRklFTEQpOwotCi0gIC8qIEZyb20gYSBkZWNvZGluZyBwZXJzcGVjdGl2ZSwgRU5VTSBpcyB0aGUgc2FtZSBhcyBJTlQzMi4gKi8KLSAgaWYgKGRlc2NyaXB0b3JfdHlwZSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX0VOVU0pCi0gICAgZGVzY3JpcHRvcl90eXBlID0gVVBCX0RFU0NSSVBUT1JfVFlQRV9JTlQzMjsKLQotICBwYXJzZV90eXBlID0gKG9wY29kZSlkZXNjcmlwdG9yX3R5cGU7Ci0KLSAgLyogVE9ETyhoYWJlcm1hbik6IGdlbmVyYXRlIHBhY2tlZCBvciBub24tcGFja2VkIGZpcnN0IGRlcGVuZGluZyBvbiAicGFja2VkIgotICAgKiBzZXR0aW5nIGluIHRoZSBmaWVsZGRlZi4gIFRoaXMgd2lsbCBmYXZvciAoaW4gc3BlZWQpIHdoaWNoZXZlciB3YXMKLSAgICogc3BlY2lmaWVkLiAqLwotCi0gIGFzc2VydCgoaW50KXBhcnNlX3R5cGUgPj0gMCAmJiBwYXJzZV90eXBlIDw9IE9QX01BWCk7Ci0gIHNlbCA9IGdldHNlbChmLCB1cGJfaGFuZGxlcnNfZ2V0cHJpbWl0aXZlaGFuZGxlcnR5cGUoZikpOwotICB3aXJlX3R5cGUgPSB1cGJfcGJfbmF0aXZlX3dpcmVfdHlwZXNbdXBiX2ZpZWxkZGVmX2Rlc2NyaXB0b3J0eXBlKGYpXTsKLSAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgewotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0VORE1TRyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQsIExBQkVMX0RJU1BBVENIKTsKLSAgIGRpc3BhdGNodGFyZ2V0KGMsIG1ldGhvZCwgZiwgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQpOwotICAgIHB1dG9wKGMsIE9QX1BVU0hMRU5ERUxJTSk7Ci0gICAgcHV0b3AoYywgT1BfU1RBUlRTRVEsIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNFUSkpOyAgLyogUGFja2VkICovCi0gICBsYWJlbChjLCBMQUJFTF9MT09QU1RBUlQpOwotICAgIHB1dG9wKGMsIHBhcnNlX3R5cGUsIHNlbCk7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfTE9PUEJSRUFLKTsKLSAgICBwdXRvcChjLCBPUF9CUkFOQ0gsIC1MQUJFTF9MT09QU1RBUlQpOwotICAgZGlzcGF0Y2h0YXJnZXQoYywgbWV0aG9kLCBmLCB3aXJlX3R5cGUpOwotICAgIHB1dG9wKGMsIE9QX1BVU0hUQUdERUxJTSwgMCk7Ci0gICAgcHV0b3AoYywgT1BfU1RBUlRTRVEsIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNFUSkpOyAgLyogTm9uLXBhY2tlZCAqLwotICAgbGFiZWwoYywgTEFCRUxfTE9PUFNUQVJUKTsKLSAgICBwdXRvcChjLCBwYXJzZV90eXBlLCBzZWwpOwotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgd2lyZV90eXBlLCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dG9wKGMsIE9QX0JSQU5DSCwgLUxBQkVMX0xPT1BTVEFSVCk7Ci0gICBsYWJlbChjLCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dG9wKGMsIE9QX1BPUCk7ICAvKiBQYWNrZWQgYW5kIG5vbi1wYWNrZWQgam9pbi4gKi8KLSAgICBtYXliZXB1dChjLCBPUF9FTkRTRVEsIGgsIGYsIFVQQl9IQU5ETEVSX0VORFNFUSk7Ci0gICAgcHV0b3AoYywgT1BfU0VUREVMSU0pOyAgLyogQ291bGQgcmVtb3ZlIGZvciBub24tcGFja2VkIGJ5IGR1cCBFTkRTRVEuICovCi0gIH0gZWxzZSB7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfRU5ETVNHKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCB3aXJlX3R5cGUsIExBQkVMX0RJU1BBVENIKTsKLSAgIGRpc3BhdGNodGFyZ2V0KGMsIG1ldGhvZCwgZiwgd2lyZV90eXBlKTsKLSAgICBwdXRvcChjLCBwYXJzZV90eXBlLCBzZWwpOwotICB9Ci19Ci0KLS8qIEFkZHMgYnl0ZWNvZGUgZm9yIHBhcnNpbmcgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIGRlY29kZXJwbGFuLAotICogd2hpbGUgYWRkaW5nIGFsbCBkaXNwYXRjaCB0YXJnZXRzIHRvIHRoaXMgbWVzc2FnZSdzIGRpc3BhdGNoIHRhYmxlLiAqLwotc3RhdGljIHZvaWQgY29tcGlsZV9tZXRob2QoY29tcGlsZXIgKmMsIHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZCkgewotICBjb25zdCB1cGJfaGFuZGxlcnMgKmg7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm1kOwotICB1aW50MzJfdCogc3RhcnRfcGM7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICB1cGJfdmFsdWUgdmFsOwotCi0gIGFzc2VydChtZXRob2QpOwotCi0gIC8qIENsZWFyIGFsbCBlbnRyaWVzIGluIHRoZSBkaXNwYXRjaCB0YWJsZS4gKi8KLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmbWV0aG9kLT5kaXNwYXRjaCk7Ci0gIHVwYl9pbnR0YWJsZV9pbml0KCZtZXRob2QtPmRpc3BhdGNoLCBVUEJfQ1RZUEVfVUlOVDY0KTsKLQotICBoID0gdXBiX3BiZGVjb2Rlcm1ldGhvZF9kZXN0aGFuZGxlcnMobWV0aG9kKTsKLSAgbWQgPSB1cGJfaGFuZGxlcnNfbXNnZGVmKGgpOwotCi0gbWV0aG9kLT5jb2RlX2Jhc2Uub2ZzID0gcGNvZnMoYyk7Ci0gIHB1dG9wKGMsIE9QX1NFVERJU1BBVENILCAmbWV0aG9kLT5kaXNwYXRjaCk7Ci0gIHB1dHNlbChjLCBPUF9TVEFSVE1TRywgVVBCX1NUQVJUTVNHX1NFTEVDVE9SLCBoKTsKLSBsYWJlbChjLCBMQUJFTF9GSUVMRCk7Ci0gIHN0YXJ0X3BjID0gYy0+cGM7Ci0gIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBtZCk7Ci0gICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaSkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmkpOwotICAgIHVwYl9maWVsZHR5cGVfdCB0eXBlID0gdXBiX2ZpZWxkZGVmX3R5cGUoZik7Ci0KLSAgICBpZiAodHlwZSA9PSBVUEJfVFlQRV9NRVNTQUdFICYmICEoaGFzbGF6eWhhbmRsZXJzKGgsIGYpICYmIGMtPmxhenkpKSB7Ci0gICAgICBnZW5lcmF0ZV9tc2dmaWVsZChjLCBmLCBtZXRob2QpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBVUEJfVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBVUEJfVFlQRV9CWVRFUyB8fAotICAgICAgICAgICAgICAgdHlwZSA9PSBVUEJfVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBnZW5lcmF0ZV9kZWxpbWZpZWxkKGMsIGYsIG1ldGhvZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRlX3ByaW1pdGl2ZWZpZWxkKGMsIGYsIG1ldGhvZCk7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgdGhlcmUgd2VyZSBubyBmaWVsZHMsIG9yIGlmIG5vIGhhbmRsZXJzIHdlcmUgZGVmaW5lZCwgd2UgbmVlZCB0bwotICAgKiBnZW5lcmF0ZSBhIG5vbi1lbXB0eSBsb29wIGJvZHkgc28gdGhhdCB3ZSBjYW4gYXQgbGVhc3QgZGlzcGF0Y2ggZm9yIHVua25vd24KLSAgICogZmllbGRzIGFuZCBjaGVjayBmb3IgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4gKi8KLSAgaWYgKGMtPnBjID09IHN0YXJ0X3BjKSB7Ci0gICAgLyogQ2hlY2sgZm9yIGVuZC1vZi1tZXNzYWdlLiAqLwotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0VORE1TRyk7Ci0gICAgLyogVW5jb25kaXRpb25hbGx5IGRpc3BhdGNoLiAqLwotICAgIHB1dG9wKGMsIE9QX0RJU1BBVENILCAwKTsKLSAgfQotCi0gIC8qIEZvciBub3cgd2UganVzdCBsb29wIGJhY2sgdG8gdGhlIGxhc3QgZmllbGQgb2YgdGhlIG1lc3NhZ2UgKG9yIGlmIG5vbmUsCi0gICAqIHRoZSBESVNQQVRDSCBvcGNvZGUgZm9yIHRoZSBtZXNzYWdlKS4gKi8KLSAgcHV0b3AoYywgT1BfQlJBTkNILCAtTEFCRUxfRklFTEQpOwotCi0gIC8qIEluc2VydCBib3RoIGEgbGFiZWwgYW5kIGEgZGlzcGF0Y2ggdGFibGUgZW50cnkgZm9yIHRoaXMgZW5kLW9mLW1zZy4gKi8KLSBsYWJlbChjLCBMQUJFTF9FTkRNU0cpOwotICB2YWwgPSB1cGJfdmFsdWVfdWludDY0KHBjb2ZzKGMpIC0gbWV0aG9kLT5jb2RlX2Jhc2Uub2ZzKTsKLSAgdXBiX2ludHRhYmxlX2luc2VydCgmbWV0aG9kLT5kaXNwYXRjaCwgRElTUEFUQ0hfRU5ETVNHLCB2YWwpOwotCi0gIHB1dHNlbChjLCBPUF9FTkRNU0csIFVQQl9FTkRNU0dfU0VMRUNUT1IsIGgpOwotICBwdXRvcChjLCBPUF9SRVQpOwotCi0gIHVwYl9pbnR0YWJsZV9jb21wYWN0KCZtZXRob2QtPmRpc3BhdGNoKTsKLX0KLQotLyogUG9wdWxhdGUgIm1ldGhvZHMiIHdpdGggbmV3IHVwYl9wYmRlY29kZXJtZXRob2Qgb2JqZWN0cyByZWFjaGFibGUgZnJvbSAiaCIuCi0gKiBSZXR1cm5zIHRoZSBtZXRob2QgZm9yIHRoZXNlIGhhbmRsZXJzLgotICoKLSAqIEdlbmVyYXRlcyBhIG5ldyBtZXRob2QgZm9yIGV2ZXJ5IGRlc3RpbmF0aW9uIGhhbmRsZXJzIHJlYWNoYWJsZSBmcm9tICJoIi4gKi8KLXN0YXRpYyB2b2lkIGZpbmRfbWV0aG9kcyhjb21waWxlciAqYywgY29uc3QgdXBiX2hhbmRsZXJzICpoKSB7Ci0gIHVwYl92YWx1ZSB2OwotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbWQ7Ci0KLSAgaWYgKHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoJmMtPmdyb3VwLT5tZXRob2RzLCBoLCAmdikpCi0gICAgcmV0dXJuOwotICBuZXdtZXRob2QoaCwgYy0+Z3JvdXApOwotCi0gIC8qIEZpbmQgc3VibWV0aG9kcy4gKi8KLSAgbWQgPSB1cGJfaGFuZGxlcnNfbXNnZGVmKGgpOwotICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaSwgbWQpOwotICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaSk7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpKTsKLSAgICBjb25zdCB1cGJfaGFuZGxlcnMgKnN1Yl9oOwotICAgIGlmICh1cGJfZmllbGRkZWZfdHlwZShmKSA9PSBVUEJfVFlQRV9NRVNTQUdFICYmCi0gICAgICAgIChzdWJfaCA9IHVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVycyhoLCBmKSkgIT0gTlVMTCkgewotICAgICAgLyogV2Ugb25seSBnZW5lcmF0ZSBhIGRlY29kZXIgbWV0aG9kIGZvciBzdWJtZXNzYWdlcyB3aXRoIGhhbmRsZXJzLgotICAgICAgICogT3RoZXJzIHdpbGwgYmUgcGFyc2VkIGFzIHVua25vd24gZmllbGRzLiAqLwotICAgICAgZmluZF9tZXRob2RzKGMsIHN1Yl9oKTsKLSAgICB9Ci0gIH0KLX0KLQotLyogKFJlLSljb21waWxlIGJ5dGVjb2RlIGZvciBhbGwgbWVzc2FnZXMgaW4gIm1zZ3MuIgotICogT3ZlcndyaXRlcyBhbnkgZXhpc3RpbmcgYnl0ZWNvZGUgaW4gImMiLiAqLwotc3RhdGljIHZvaWQgY29tcGlsZV9tZXRob2RzKGNvbXBpbGVyICpjKSB7Ci0gIHVwYl9pbnR0YWJsZV9pdGVyIGk7Ci0KLSAgLyogU3RhcnQgb3ZlciBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBieXRlY29kZS4gKi8KLSAgYy0+cGMgPSBjLT5ncm91cC0+Ynl0ZWNvZGU7Ci0KLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCAmYy0+Z3JvdXAtPm1ldGhvZHMpOwotICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICB1cGJfcGJkZWNvZGVybWV0aG9kICptZXRob2QgPSB1cGJfdmFsdWVfZ2V0cHRyKHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKCZpKSk7Ci0gICAgY29tcGlsZV9tZXRob2QoYywgbWV0aG9kKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXRfYnl0ZWNvZGVfaGFuZGxlcnMobWdyb3VwICpnKSB7Ci0gIHVwYl9pbnR0YWJsZV9pdGVyIGk7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgJmctPm1ldGhvZHMpOwotICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICB1cGJfcGJkZWNvZGVybWV0aG9kICptID0gdXBiX3ZhbHVlX2dldHB0cih1cGJfaW50dGFibGVfaXRlcl92YWx1ZSgmaSkpOwotICAgIHVwYl9ieXRlc2hhbmRsZXIgKmggPSAmbS0+aW5wdXRfaGFuZGxlcl87Ci0KLSAgICBtLT5jb2RlX2Jhc2UucHRyID0gZy0+Ynl0ZWNvZGUgKyBtLT5jb2RlX2Jhc2Uub2ZzOwotCi0gICAgdXBiX2J5dGVzaGFuZGxlcl9zZXRzdGFydHN0cihoLCB1cGJfcGJkZWNvZGVyX3N0YXJ0YmMsIG0tPmNvZGVfYmFzZS5wdHIpOwotICAgIHVwYl9ieXRlc2hhbmRsZXJfc2V0c3RyaW5nKGgsIHVwYl9wYmRlY29kZXJfZGVjb2RlLCBnKTsKLSAgICB1cGJfYnl0ZXNoYW5kbGVyX3NldGVuZHN0cihoLCB1cGJfcGJkZWNvZGVyX2VuZCwgbSk7Ci0gIH0KLX0KLQotCi0vKiBKSVQgc2V0dXAuICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgVVBCX1VTRV9KSVRfWDY0Ci0KLXN0YXRpYyB2b2lkIHNldGhhbmRsZXJzKG1ncm91cCAqZywgYm9vbCBhbGxvd2ppdCkgewotICBnLT5qaXRfY29kZSA9IE5VTEw7Ci0gIGlmIChhbGxvd2ppdCkgewotICAgIC8qIENvbXBpbGUgYnl0ZS1jb2RlIGludG8gbWFjaGluZSBjb2RlLCBjcmVhdGUgaGFuZGxlcnMuICovCi0gICAgdXBiX3BiZGVjb2Rlcl9qaXQoZyk7Ci0gIH0gZWxzZSB7Ci0gICAgc2V0X2J5dGVjb2RlX2hhbmRsZXJzKGcpOwotICB9Ci19Ci0KLSNlbHNlICAvKiBVUEJfVVNFX0pJVF9YNjQgKi8KLQotc3RhdGljIHZvaWQgc2V0aGFuZGxlcnMobWdyb3VwICpnLCBib29sIGFsbG93aml0KSB7Ci0gIC8qIE5vIEpJVCBjb21waWxlZCBpbjsgdXNlIGJ5dGVjb2RlIGhhbmRsZXJzIHVuY29uZGl0aW9uYWxseS4gKi8KLSAgVVBCX1VOVVNFRChhbGxvd2ppdCk7Ci0gIHNldF9ieXRlY29kZV9oYW5kbGVycyhnKTsKLX0KLQotI2VuZGlmICAvKiBVUEJfVVNFX0pJVF9YNjQgKi8KLQotCi0vKiBUT0RPKGhhYmVybWFuKTogYWxsb3cgdGhpcyB0byBiZSBjb25zdHJ1Y3RlZCBmb3IgYW4gYXJiaXRyYXJ5IHNldCBvZiBkZXN0Ci0gKiBoYW5kbGVycyBhbmQgb3RoZXIgbWdyb3VwcyAoYnV0IHZlcmlmeSB3ZSBoYXZlIGEgdHJhbnNpdGl2ZSBjbG9zdXJlKS4gKi8KLWNvbnN0IG1ncm91cCAqbWdyb3VwX25ldyhjb25zdCB1cGJfaGFuZGxlcnMgKmRlc3QsIGJvb2wgYWxsb3dqaXQsIGJvb2wgbGF6eSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcikgewotICBtZ3JvdXAgKmc7Ci0gIGNvbXBpbGVyICpjOwotCi0gIFVQQl9VTlVTRUQoYWxsb3dqaXQpOwotICBhc3NlcnQodXBiX2hhbmRsZXJzX2lzZnJvemVuKGRlc3QpKTsKLQotICBnID0gbmV3Z3JvdXAob3duZXIpOwotICBjID0gbmV3Y29tcGlsZXIoZywgbGF6eSk7Ci0gIGZpbmRfbWV0aG9kcyhjLCBkZXN0KTsKLQotICAvKiBXZSBjb21waWxlIGluIHR3byBwYXNzZXM6Ci0gICAqIDEuIGFsbCBtZXNzYWdlcyBhcmUgYXNzaWduZWQgcmVsYXRpdmUgb2Zmc2V0cyBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlCi0gICAqICAgIGJ5dGVjb2RlIChzYXZlZCBpbiBtZXRob2QtPmNvZGVfYmFzZSkuCi0gICAqIDIuIGZvcndhcmRzIE9QX0NBTEwgaW5zdHJ1Y3Rpb25zIGNhbiBiZSBjb3JyZWN0bHkgbGlua2VkIHNpbmNlIG1lc3NhZ2UKLSAgICogICAgb2Zmc2V0cyBoYXZlIGJlZW4gcHJldmlvdXNseSBhc3NpZ25lZC4KLSAgICoKLSAgICogQ291bGQgYXZvaWQgdGhlIHNlY29uZCBwYXNzIGJ5IGxpbmtpbmcgT1BfQ0FMTCBpbnN0cnVjdGlvbnMgc29tZWhvdy4gKi8KLSAgY29tcGlsZV9tZXRob2RzKGMpOwotICBjb21waWxlX21ldGhvZHMoYyk7Ci0gIGctPmJ5dGVjb2RlX2VuZCA9IGMtPnBjOwotICBmcmVlY29tcGlsZXIoYyk7Ci0KLSNpZmRlZiBVUEJfRFVNUF9CWVRFQ09ERQotICB7Ci0gICAgRklMRSAqZiA9IGZvcGVuKCIvdG1wL3VwYi1ieXRlY29kZSIsICJ3YiIpOwotICAgIGFzc2VydChmKTsKLSAgICBkdW1wYmMoZy0+Ynl0ZWNvZGUsIGctPmJ5dGVjb2RlX2VuZCwgc3RkZXJyKTsKLSAgICBkdW1wYmMoZy0+Ynl0ZWNvZGUsIGctPmJ5dGVjb2RlX2VuZCwgZik7Ci0gICAgZmNsb3NlKGYpOwotICB9Ci0jZW5kaWYKLQotICBzZXRoYW5kbGVycyhnLCBhbGxvd2ppdCk7Ci0gIHJldHVybiBnOwotfQotCi0KLS8qIHVwYl9wYmNvZGVjYWNoZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgdXBiX3BiY29kZWNhY2hlX2luaXQodXBiX3BiY29kZWNhY2hlICpjKSB7Ci0gIHVwYl9pbnR0YWJsZV9pbml0KCZjLT5ncm91cHMsIFVQQl9DVFlQRV9DT05TVFBUUik7Ci0gIGMtPmFsbG93X2ppdF8gPSB0cnVlOwotfQotCi12b2lkIHVwYl9wYmNvZGVjYWNoZV91bmluaXQodXBiX3BiY29kZWNhY2hlICpjKSB7Ci0gIHVwYl9pbnR0YWJsZV9pdGVyIGk7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgJmMtPmdyb3Vwcyk7Ci0gIGZvcig7ICF1cGJfaW50dGFibGVfZG9uZSgmaSk7IHVwYl9pbnR0YWJsZV9uZXh0KCZpKSkgewotICAgIGNvbnN0IG1ncm91cCAqZ3JvdXAgPSB1cGJfdmFsdWVfZ2V0Y29uc3RwdHIodXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpKTsKLSAgICBtZ3JvdXBfdW5yZWYoZ3JvdXAsIGMpOwotICB9Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoJmMtPmdyb3Vwcyk7Ci19Ci0KLWJvb2wgdXBiX3BiY29kZWNhY2hlX2FsbG93aml0KGNvbnN0IHVwYl9wYmNvZGVjYWNoZSAqYykgewotICByZXR1cm4gYy0+YWxsb3dfaml0XzsKLX0KLQotYm9vbCB1cGJfcGJjb2RlY2FjaGVfc2V0YWxsb3dqaXQodXBiX3BiY29kZWNhY2hlICpjLCBib29sIGFsbG93KSB7Ci0gIGlmICh1cGJfaW50dGFibGVfY291bnQoJmMtPmdyb3VwcykgPiAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgYy0+YWxsb3dfaml0XyA9IGFsbG93OwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqdXBiX3BiY29kZWNhY2hlX2dldGRlY29kZXJtZXRob2QoCi0gICAgdXBiX3BiY29kZWNhY2hlICpjLCBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyAqb3B0cykgewotICB1cGJfdmFsdWUgdjsKLSAgYm9vbCBvazsKLQotICAvKiBSaWdodCBub3cgd2UgYnVpbGQgYSBuZXcgRGVjb2Rlck1ldGhvZCBldmVyeSB0aW1lLgotICAgKiBUT0RPKGhhYmVybWFuKTogcHJvcGVybHkgY2FjaGUgbWV0aG9kcyBieSB0aGVpciB0cnVlIGtleS4gKi8KLSAgY29uc3QgbWdyb3VwICpnID0gbWdyb3VwX25ldyhvcHRzLT5oYW5kbGVycywgYy0+YWxsb3dfaml0Xywgb3B0cy0+bGF6eSwgYyk7Ci0gIHVwYl9pbnR0YWJsZV9wdXNoKCZjLT5ncm91cHMsIHVwYl92YWx1ZV9jb25zdHB0cihnKSk7Ci0KLSAgb2sgPSB1cGJfaW50dGFibGVfbG9va3VwcHRyKCZnLT5tZXRob2RzLCBvcHRzLT5oYW5kbGVycywgJnYpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gdXBiX3ZhbHVlX2dldHB0cih2KTsKLX0KLQotCi0vKiB1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHVwYl9wYmRlY29kZXJtZXRob2RvcHRzX2luaXQodXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKm9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2hhbmRsZXJzICpoKSB7Ci0gIG9wdHMtPmhhbmRsZXJzID0gaDsKLSAgb3B0cy0+bGF6eSA9IGZhbHNlOwotfQotCi12b2lkIHVwYl9wYmRlY29kZXJtZXRob2RvcHRzX3NldGxhenkodXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKm9wdHMsIGJvb2wgbGF6eSkgewotICBvcHRzLT5sYXp5ID0gbGF6eTsKLX0KLS8qCi0qKiB1cGI6OkRlY29kZXIgKEJ5dGVjb2RlIERlY29kZXIgVk0pCi0qKgotKiogQnl0ZWNvZGUgbXVzdCBwcmV2aW91c2x5IGhhdmUgYmVlbiBnZW5lcmF0ZWQgdXNpbmcgdGhlIGJ5dGVjb2RlIGNvbXBpbGVyIGluCi0qKiBjb21waWxlX2RlY29kZXIuYy4gIFRoaXMgZGVjb2RlciB0aGVuIHdhbGtzIHRocm91Z2ggdGhlIGJ5dGVjb2RlIG9wLWJ5LW9wIHRvCi0qKiBwYXJzZSB0aGUgaW5wdXQuCi0qKgotKiogRGVjb2RpbmcgaXMgZnVsbHkgcmVzdW1hYmxlOyB3ZSBqdXN0IGtlZXAgYSBwb2ludGVyIHRvIHRoZSBjdXJyZW50IGJ5dGVjb2RlCi0qKiBpbnN0cnVjdGlvbiBhbmQgcmVzdW1lIGZyb20gdGhlcmUuICBBIGZhaXIgYW1vdW50IG9mIHRoZSBsb2dpYyBoZXJlIGlzIHRvCi0qKiBoYW5kbGUgdGhlIGZhY3QgdGhhdCB2YWx1ZXMgY2FuIHNwYW4gYnVmZmVyIHNlYW1zIGFuZCB3ZSBoYXZlIHRvIGJlIGFibGUgdG8KLSoqIGJlIGNhcGFibGUgb2Ygc3VzcGVuZGluZy9yZXN1bWluZyBmcm9tIGFueSBieXRlIGluIHRoZSBzdHJlYW0uICBUaGlzCi0qKiBzb21ldGltZXMgcmVxdWlyZXMga2VlcGluZyBhIGZldyB0cmFpbGluZyBieXRlcyBmcm9tIHRoZSBsYXN0IGJ1ZmZlciBhcm91bmQKLSoqIGluIHRoZSAicmVzaWR1YWwiIGJ1ZmZlci4KLSovCi0KLSNpbmNsdWRlIDxpbnR0eXBlcy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0jaWZkZWYgVVBCX0RVTVBfQllURUNPREUKLSNpbmNsdWRlIDxzdGRpby5oPgotI2VuZGlmCi0KLSNkZWZpbmUgQ0hFQ0tfU1VTUEVORCh4KSBpZiAoISh4KSkgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLQotLyogRXJyb3IgbWVzc2FnZXMgdGhhdCBhcmUgc2hhcmVkIGJldHdlZW4gdGhlIGJ5dGVjb2RlIGFuZCBKSVQgZGVjb2RlcnMuICovCi1jb25zdCBjaGFyICprUGJEZWNvZGVyU3RhY2tPdmVyZmxvdyA9ICJOZXN0aW5nIHRvbyBkZWVwLiI7Ci1jb25zdCBjaGFyICprUGJEZWNvZGVyU3VibWVzc2FnZVRvb0xvbmcgPQotICAgICJTdWJtZXNzYWdlIGVuZCBleHRlbmRzIHBhc3QgZW5jbG9zaW5nIHN1Ym1lc3NhZ2UuIjsKLQotLyogRXJyb3IgbWVzc2FnZXMgc2hhcmVkIHdpdGhpbiB0aGlzIGZpbGUuICovCi1zdGF0aWMgY29uc3QgY2hhciAqa1VudGVybWluYXRlZFZhcmludCA9ICJVbnRlcm1pbmF0ZWQgdmFyaW50LiI7Ci0KLS8qIHVwYl9wYmRlY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBvcGNvZGUgaGFsdCA9IE9QX0hBTFQ7Ci0KLS8qIFdoZXRoZXIgYW4gb3AgY29uc3VtZXMgYW55IG9mIHRoZSBpbnB1dCBidWZmZXIuICovCi1zdGF0aWMgYm9vbCBjb25zdW1lc19pbnB1dChvcGNvZGUgb3ApIHsKLSAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgT1BfU0VURElTUEFUQ0g6Ci0gICAgY2FzZSBPUF9TVEFSVE1TRzoKLSAgICBjYXNlIE9QX0VORE1TRzoKLSAgICBjYXNlIE9QX1NUQVJUU0VROgotICAgIGNhc2UgT1BfRU5EU0VROgotICAgIGNhc2UgT1BfU1RBUlRTVUJNU0c6Ci0gICAgY2FzZSBPUF9FTkRTVUJNU0c6Ci0gICAgY2FzZSBPUF9TVEFSVFNUUjoKLSAgICBjYXNlIE9QX0VORFNUUjoKLSAgICBjYXNlIE9QX1BVU0hUQUdERUxJTToKLSAgICBjYXNlIE9QX1BPUDoKLSAgICBjYXNlIE9QX1NFVERFTElNOgotICAgIGNhc2UgT1BfU0VUQklHR1JPVVBOVU06Ci0gICAgY2FzZSBPUF9DSEVDS0RFTElNOgotICAgIGNhc2UgT1BfQ0FMTDoKLSAgICBjYXNlIE9QX1JFVDoKLSAgICBjYXNlIE9QX0JSQU5DSDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotc3RhdGljIHNpemVfdCBzdGFja3NpemUodXBiX3BiZGVjb2RlciAqZCwgc2l6ZV90IGVudHJpZXMpIHsKLSAgVVBCX1VOVVNFRChkKTsKLSAgcmV0dXJuIGVudHJpZXMgKiBzaXplb2YodXBiX3BiZGVjb2Rlcl9mcmFtZSk7Ci19Ci0KLXN0YXRpYyBzaXplX3QgY2FsbHN0YWNrc2l6ZSh1cGJfcGJkZWNvZGVyICpkLCBzaXplX3QgZW50cmllcykgewotICBVUEJfVU5VU0VEKGQpOwotCi0jaWZkZWYgVVBCX1VTRV9KSVRfWDY0Ci0gIGlmIChkLT5tZXRob2RfLT5pc19uYXRpdmVfKSB7Ci0gICAgLyogRWFjaCBuYXRpdmUgc3RhY2sgZnJhbWUgbmVlZHMgdHdvIHBvaW50ZXJzLCBwbHVzIHdlIG5lZWQgYSBmZXcgZnJhbWVzIGZvcgotICAgICAqIHRoZSBlbnRlci9leGl0IHRyYW1wb2xpbmVzLiAqLwotICAgIHNpemVfdCByZXQgPSBlbnRyaWVzICogc2l6ZW9mKHZvaWQqKSAqIDI7Ci0gICAgcmV0ICs9IHNpemVvZih2b2lkKikgKiAxMDsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0jZW5kaWYKLQotICByZXR1cm4gZW50cmllcyAqIHNpemVvZih1aW50MzJfdCopOwotfQotCi0KLXN0YXRpYyBib29sIGluX3Jlc2lkdWFsX2J1Zihjb25zdCB1cGJfcGJkZWNvZGVyICpkLCBjb25zdCBjaGFyICpwKTsKLQotLyogSXQncyB1bmZvcnR1bmF0ZSB0aGF0IHdlIGhhdmUgdG8gbWljcm8tbWFuYWdlIHRoZSBjb21waWxlciB3aXRoCi0gKiBVUEJfRk9SQ0VJTkxJTkUgYW5kIFVQQl9OT0lOTElORSwgZXNwZWNpYWxseSBzaW5jZSB0aGlzIHR1bmluZyBpcyBuZWNlc3NhcmlseQotICogc3BlY2lmaWMgdG8gb25lIGhhcmR3YXJlIGNvbmZpZ3VyYXRpb24uICBCdXQgZW1waXJpY2FsbHkgb24gYSBDb3JlIGk3LAotICogcGVyZm9ybWFuY2UgaW5jcmVhc2VzIDMwLTUwJSB3aXRoIHRoZXNlIGFubm90YXRpb25zLiAgRXZlcnkgaW5zdGFuY2Ugd2hlcmUKLSAqIHRoZXNlIGFwcGVhciwgZ2NjIDQuMi4xIG1hZGUgdGhlIHdyb25nIGRlY2lzaW9uIGFuZCBkZWdyYWRlZCBwZXJmb3JtYW5jZSBpbgotICogYmVuY2htYXJrcy4gKi8KLQotc3RhdGljIHZvaWQgc2V0ZXJyKHVwYl9wYmRlY29kZXIgKmQsIGNvbnN0IGNoYXIgKm1zZykgewotICB1cGJfc3RhdHVzIHN0YXR1cyA9IFVQQl9TVEFUVVNfSU5JVDsKLSAgdXBiX3N0YXR1c19zZXRlcnJtc2coJnN0YXR1cywgbXNnKTsKLSAgdXBiX2Vudl9yZXBvcnRlcnJvcihkLT5lbnYsICZzdGF0dXMpOwotfQotCi12b2lkIHVwYl9wYmRlY29kZXJfc2V0ZXJyKHVwYl9wYmRlY29kZXIgKmQsIGNvbnN0IGNoYXIgKm1zZykgewotICBzZXRlcnIoZCwgbXNnKTsKLX0KLQotCi0vKiBCdWZmZXJpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBXZSBvcGVyYXRlIG9uIG9uZSBidWZmZXIgYXQgYSB0aW1lLCB3aGljaCBpcyBlaXRoZXIgdGhlIHVzZXIncyBidWZmZXIgcGFzc2VkCi0gKiB0byBvdXIgImRlY29kZSIgY2FsbGJhY2sgb3Igc29tZSByZXNpZHVhbCBieXRlcyBmcm9tIHRoZSBwcmV2aW91cyBidWZmZXIuICovCi0KLS8qIEhvdyBtYW55IGJ5dGVzIGNhbiBiZSBzYWZlbHkgcmVhZCBmcm9tIGQtPnB0ciB3aXRob3V0IHJlYWRpbmcgcGFzdCBlbmQtb2YtYnVmCi0gKiBvciBwYXN0IHRoZSBjdXJyZW50IGRlbGltaXRlZCBlbmQuICovCi1zdGF0aWMgc2l6ZV90IGN1cmJ1ZmxlZnQoY29uc3QgdXBiX3BiZGVjb2RlciAqZCkgewotICBhc3NlcnQoZC0+ZGF0YV9lbmQgPj0gZC0+cHRyKTsKLSAgcmV0dXJuIGQtPmRhdGFfZW5kIC0gZC0+cHRyOwotfQotCi0vKiBIb3cgbWFueSBieXRlcyBhcmUgYXZhaWxhYmxlIGJlZm9yZSBlbmQtb2YtYnVmZmVyLiAqLwotc3RhdGljIHNpemVfdCBidWZsZWZ0KGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgcmV0dXJuIGQtPmVuZCAtIGQtPnB0cjsKLX0KLQotLyogT3ZlcmFsbCBzdHJlYW0gb2Zmc2V0IG9mIGQtPnB0ci4gKi8KLXVpbnQ2NF90IG9mZnNldChjb25zdCB1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHJldHVybiBkLT5idWZzdGFydF9vZnMgKyAoZC0+cHRyIC0gZC0+YnVmKTsKLX0KLQotLyogSG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBiZWZvcmUgdGhlIGVuZCBvZiB0aGlzIGRlbGltaXRlZCByZWdpb24uICovCi1zaXplX3QgZGVsaW1fcmVtYWluaW5nKGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgcmV0dXJuIGQtPnRvcC0+ZW5kX29mcyAtIG9mZnNldChkKTsKLX0KLQotLyogQWR2YW5jZXMgZC0+cHRyLiAqLwotc3RhdGljIHZvaWQgYWR2YW5jZSh1cGJfcGJkZWNvZGVyICpkLCBzaXplX3QgbGVuKSB7Ci0gIGFzc2VydChjdXJidWZsZWZ0KGQpID49IGxlbik7Ci0gIGQtPnB0ciArPSBsZW47Ci19Ci0KLXN0YXRpYyBib29sIGluX2J1Zihjb25zdCBjaGFyICpwLCBjb25zdCBjaGFyICpidWYsIGNvbnN0IGNoYXIgKmVuZCkgewotICByZXR1cm4gcCA+PSBidWYgJiYgcCA8PSBlbmQ7Ci19Ci0KLXN0YXRpYyBib29sIGluX3Jlc2lkdWFsX2J1Zihjb25zdCB1cGJfcGJkZWNvZGVyICpkLCBjb25zdCBjaGFyICpwKSB7Ci0gIHJldHVybiBpbl9idWYocCwgZC0+cmVzaWR1YWwsIGQtPnJlc2lkdWFsX2VuZCk7Ci19Ci0KLS8qIENhbGN1bGF0ZXMgdGhlIGRlbGltX2VuZCB2YWx1ZSwgd2hpY2ggaXMgYWZmZWN0ZWQgYnkgYm90aCB0aGUgY3VycmVudCBidWZmZXIKLSAqIGFuZCB0aGUgcGFyc2luZyBzdGFjaywgc28gbXVzdCBiZSBjYWxsZWQgd2hlbmV2ZXIgZWl0aGVyIGlzIHVwZGF0ZWQuICovCi1zdGF0aWMgdm9pZCBzZXRfZGVsaW1fZW5kKHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgc2l6ZV90IGRlbGltX29mcyA9IGQtPnRvcC0+ZW5kX29mcyAtIGQtPmJ1ZnN0YXJ0X29mczsKLSAgaWYgKGRlbGltX29mcyA8PSAoc2l6ZV90KShkLT5lbmQgLSBkLT5idWYpKSB7Ci0gICAgZC0+ZGVsaW1fZW5kID0gZC0+YnVmICsgZGVsaW1fb2ZzOwotICAgIGQtPmRhdGFfZW5kID0gZC0+ZGVsaW1fZW5kOwotICB9IGVsc2UgewotICAgIGQtPmRhdGFfZW5kID0gZC0+ZW5kOwotICAgIGQtPmRlbGltX2VuZCA9IE5VTEw7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgc3dpdGNodG9idWYodXBiX3BiZGVjb2RlciAqZCwgY29uc3QgY2hhciAqYnVmLCBjb25zdCBjaGFyICplbmQpIHsKLSAgZC0+cHRyID0gYnVmOwotICBkLT5idWYgPSBidWY7Ci0gIGQtPmVuZCA9IGVuZDsKLSAgc2V0X2RlbGltX2VuZChkKTsKLX0KLQotc3RhdGljIHZvaWQgYWR2YW5jZXRvYnVmKHVwYl9wYmRlY29kZXIgKmQsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgewotICBhc3NlcnQoY3VyYnVmbGVmdChkKSA9PSAwKTsKLSAgZC0+YnVmc3RhcnRfb2ZzICs9IChkLT5lbmQgLSBkLT5idWYpOwotICBzd2l0Y2h0b2J1ZihkLCBidWYsIGJ1ZiArIGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrcG9pbnQodXBiX3BiZGVjb2RlciAqZCkgewotICAvKiBUaGUgYXNzZXJ0aW9uIGhlcmUgaXMgaW4gdGhlIGludGVyZXN0cyBvZiBlZmZpY2llbmN5LCBub3QgY29ycmVjdG5lc3MuCi0gICAqIFdlIGFyZSB0cnlpbmcgdG8gZW5zdXJlIHRoYXQgd2UgZG9uJ3QgY2hlY2twb2ludCgpIG1vcmUgb2Z0ZW4gdGhhbgotICAgKiBuZWNlc3NhcnkuICovCi0gIGFzc2VydChkLT5jaGVja3BvaW50ICE9IGQtPnB0cik7Ci0gIGQtPmNoZWNrcG9pbnQgPSBkLT5wdHI7Ci19Ci0KLS8qIFNraXBzICJieXRlcyIgYnl0ZXMgaW4gdGhlIHN0cmVhbSwgd2hpY2ggbWF5IGJlIG1vcmUgdGhhbiBhdmFpbGFibGUuICBJZiB3ZQotICogc2tpcCBtb3JlIGJ5dGVzIHRoYW4gYXJlIGF2YWlsYWJsZSwgd2UgcmV0dXJuIGEgbG9uZyByZWFkIGNvdW50IHRvIHRoZSBjYWxsZXIKLSAqIGluZGljYXRpbmcgaG93IG1hbnkgYnl0ZXMgY2FuIGJlIHNraXBwZWQgb3ZlciBiZWZvcmUgcGFzc2luZyBhY3R1YWwgZGF0YQotICogYWdhaW4uICBTa2lwcGVkIGJ5dGVzIGNhbiBwYXNzIGEgTlVMTCBidWZmZXIgYW5kIHRoZSBkZWNvZGVyIGd1YXJhbnRlZXMgdGhleQotICogd29uJ3QgYWN0dWFsbHkgYmUgcmVhZC4KLSAqLwotc3RhdGljIGludDMyX3Qgc2tpcCh1cGJfcGJkZWNvZGVyICpkLCBzaXplX3QgYnl0ZXMpIHsKLSAgYXNzZXJ0KCFpbl9yZXNpZHVhbF9idWYoZCwgZC0+cHRyKSB8fCBkLT5zaXplX3BhcmFtID09IDApOwotICBhc3NlcnQoZC0+c2tpcCA9PSAwKTsKLSAgaWYgKGJ5dGVzID4gZGVsaW1fcmVtYWluaW5nKGQpKSB7Ci0gICAgc2V0ZXJyKGQsICJTa2lwcGVkIHZhbHVlIGV4dGVuZGVkIGJleW9uZCBlbmNsb3Npbmcgc3VibWVzc2FnZS4iKTsKLSAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICB9IGVsc2UgaWYgKGJ1ZmxlZnQoZCkgPiBieXRlcykgewotICAgIC8qIFNraXBwZWQgZGF0YSBpcyBhbGwgaW4gY3VycmVudCBidWZmZXIsIGFuZCBtb3JlIGlzIHN0aWxsIGF2YWlsYWJsZS4gKi8KLSAgICBhZHZhbmNlKGQsIGJ5dGVzKTsKLSAgICBkLT5za2lwID0gMDsKLSAgICByZXR1cm4gREVDT0RFX09LOwotICB9IGVsc2UgewotICAgIC8qIFNraXBwZWQgZGF0YSBleHRlbmRzIGJleW9uZCBjdXJyZW50bHkgYXZhaWxhYmxlIGJ1ZmZlcnMuICovCi0gICAgZC0+cGMgPSBkLT5sYXN0OwotICAgIGQtPnNraXAgPSBieXRlcyAtIGN1cmJ1ZmxlZnQoZCk7Ci0gICAgZC0+YnVmc3RhcnRfb2ZzICs9IChkLT5lbmQgLSBkLT5idWYpOwotICAgIGQtPnJlc2lkdWFsX2VuZCA9IGQtPnJlc2lkdWFsOwotICAgIHN3aXRjaHRvYnVmKGQsIGQtPnJlc2lkdWFsLCBkLT5yZXNpZHVhbF9lbmQpOwotICAgIHJldHVybiBkLT5zaXplX3BhcmFtICsgZC0+c2tpcDsKLSAgfQotfQotCi0KLS8qIFJlc3VtZXMgdGhlIGRlY29kZXIgZnJvbSBhbiBpbml0aWFsIHN0YXRlIG9yIGZyb20gYSBwcmV2aW91cyBzdXNwZW5kLiAqLwotaW50MzJfdCB1cGJfcGJkZWNvZGVyX3Jlc3VtZSh1cGJfcGJkZWNvZGVyICpkLCB2b2lkICpwLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgVVBCX1VOVVNFRChwKTsgIC8qIFVzZWxlc3M7IGp1c3QgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBKSVQuICovCi0KLSAgZC0+YnVmX3BhcmFtID0gYnVmOwotICBkLT5zaXplX3BhcmFtID0gc2l6ZTsKLSAgZC0+aGFuZGxlID0gaGFuZGxlOwotCi0gIGlmIChkLT5yZXNpZHVhbF9lbmQgPiBkLT5yZXNpZHVhbCkgewotICAgIC8qIFdlIGhhdmUgcmVzaWR1YWwgYnl0ZXMgZnJvbSB0aGUgbGFzdCBidWZmZXIuICovCi0gICAgYXNzZXJ0KGQtPnB0ciA9PSBkLT5yZXNpZHVhbCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNodG9idWYoZCwgYnVmLCBidWYgKyBzaXplKTsKLSAgfQotCi0gIGQtPmNoZWNrcG9pbnQgPSBkLT5wdHI7Ci0KLSAgaWYgKGQtPnNraXApIHsKLSAgICBzaXplX3Qgc2tpcF9ieXRlcyA9IGQtPnNraXA7Ci0gICAgZC0+c2tpcCA9IDA7Ci0gICAgQ0hFQ0tfUkVUVVJOKHNraXAoZCwgc2tpcF9ieXRlcykpOwotICAgIGQtPmNoZWNrcG9pbnQgPSBkLT5wdHI7Ci0gIH0KLQotICBpZiAoIWJ1ZikgewotICAgIC8qIE5VTEwgYnVmIGlzIG9rIGlmIGl0cyBlbnRpcmUgc3BhbiBpcyBjb3ZlcmVkIGJ5IHRoZSAic2tpcCIgYWJvdmUsIGJ1dAotICAgICAqIGJ5IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0ICJza2lwIiBkb2Vzbid0IGNvdmVyIHRoZSBidWZmZXIuICovCi0gICAgc2V0ZXJyKGQsICJQYXNzZWQgTlVMTCBidWZmZXIgb3ZlciBub24tc2tpcHBhYmxlIHJlZ2lvbi4iKTsKLSAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICB9Ci0KLSAgaWYgKGQtPnRvcC0+Z3JvdXBudW0gPCAwKSB7Ci0gICAgQ0hFQ0tfUkVUVVJOKHVwYl9wYmRlY29kZXJfc2tpcHVua25vd24oZCwgLTEsIDApKTsKLSAgICBkLT5jaGVja3BvaW50ID0gZC0+cHRyOwotICB9Ci0KLSAgcmV0dXJuIERFQ09ERV9PSzsKLX0KLQotLyogU3VzcGVuZHMgdGhlIGRlY29kZXIgYXQgdGhlIGxhc3QgY2hlY2twb2ludCwgd2l0aG91dCBzYXZpbmcgYW55IHJlc2lkdWFsCi0gKiBieXRlcy4gIElmIHRoZXJlIGFyZSBhbnkgdW5jb25zdW1lZCBieXRlcywgcmV0dXJucyBhIHNob3J0IGJ5dGUgY291bnQuICovCi1zaXplX3QgdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgZC0+cGMgPSBkLT5sYXN0OwotICBpZiAoZC0+Y2hlY2twb2ludCA9PSBkLT5yZXNpZHVhbCkgewotICAgIC8qIENoZWNrcG9pbnQgd2FzIGluIHJlc2lkdWFsIGJ1Zjsgbm8gdXNlciBieXRlcyB3ZXJlIGNvbnN1bWVkLiAqLwotICAgIGQtPnB0ciA9IGQtPnJlc2lkdWFsOwotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIHNpemVfdCBjb25zdW1lZDsKLSAgICBhc3NlcnQoIWluX3Jlc2lkdWFsX2J1ZihkLCBkLT5jaGVja3BvaW50KSk7Ci0gICAgYXNzZXJ0KGQtPmJ1ZiA9PSBkLT5idWZfcGFyYW0pOwotCi0gICAgY29uc3VtZWQgPSBkLT5jaGVja3BvaW50IC0gZC0+YnVmOwotICAgIGQtPmJ1ZnN0YXJ0X29mcyArPSBjb25zdW1lZDsKLSAgICBkLT5yZXNpZHVhbF9lbmQgPSBkLT5yZXNpZHVhbDsKLSAgICBzd2l0Y2h0b2J1ZihkLCBkLT5yZXNpZHVhbCwgZC0+cmVzaWR1YWxfZW5kKTsKLSAgICByZXR1cm4gY29uc3VtZWQ7Ci0gIH0KLX0KLQotLyogU3VzcGVuZHMgdGhlIGRlY29kZXIgYXQgdGhlIGxhc3QgY2hlY2twb2ludCwgYW5kIHNhdmVzIGFueSB1bmNvbnN1bWVkCi0gKiBieXRlcyBpbiBvdXIgcmVzaWR1YWwgYnVmZmVyLiAgVGhpcyBpcyBuZWNlc3NhcnkgaWYgd2UgbmVlZCBtb3JlIHVzZXIKLSAqIGJ5dGVzIHRvIGZvcm0gYSBjb21wbGV0ZSB2YWx1ZSwgd2hpY2ggbWlnaHQgbm90IGJlIGNvbnRpZ3VvdXMgaW4gdGhlCi0gKiB1c2VyJ3MgYnVmZmVycy4gIEFsd2F5cyBjb25zdW1lcyBhbGwgdXNlciBieXRlcy4gKi8KLXN0YXRpYyBzaXplX3Qgc3VzcGVuZF9zYXZlKHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgLyogV2UgaGl0IGVuZC1vZi1idWZmZXIgYmVmb3JlIHdlIGNvdWxkIHBhcnNlIGEgZnVsbCB2YWx1ZS4KLSAgICogU2F2ZSBhbnkgdW5jb25zdW1lZCBieXRlcyAoaWYgYW55KSB0byB0aGUgcmVzaWR1YWwgYnVmZmVyLiAqLwotICBkLT5wYyA9IGQtPmxhc3Q7Ci0KLSAgaWYgKGQtPmNoZWNrcG9pbnQgPT0gZC0+cmVzaWR1YWwpIHsKLSAgICAvKiBDaGVja3BvaW50IHdhcyBpbiByZXNpZHVhbCBidWY7IGFwcGVuZCB1c2VyIGJ5dGUocykgdG8gcmVzaWR1YWwgYnVmLiAqLwotICAgIGFzc2VydCgoZC0+cmVzaWR1YWxfZW5kIC0gZC0+cmVzaWR1YWwpICsgZC0+c2l6ZV9wYXJhbSA8PQotICAgICAgICAgICBzaXplb2YoZC0+cmVzaWR1YWwpKTsKLSAgICBpZiAoIWluX3Jlc2lkdWFsX2J1ZihkLCBkLT5wdHIpKSB7Ci0gICAgICBkLT5idWZzdGFydF9vZnMgLT0gKGQtPnJlc2lkdWFsX2VuZCAtIGQtPnJlc2lkdWFsKTsKLSAgICB9Ci0gICAgbWVtY3B5KGQtPnJlc2lkdWFsX2VuZCwgZC0+YnVmX3BhcmFtLCBkLT5zaXplX3BhcmFtKTsKLSAgICBkLT5yZXNpZHVhbF9lbmQgKz0gZC0+c2l6ZV9wYXJhbTsKLSAgfSBlbHNlIHsKLSAgICAvKiBDaGVja3BvaW50IHdhcyBpbiB1c2VyIGJ1Zjsgb2xkIHJlc2lkdWFsIGJ5dGVzIG5vdCBuZWVkZWQuICovCi0gICAgc2l6ZV90IHNhdmU7Ci0gICAgYXNzZXJ0KCFpbl9yZXNpZHVhbF9idWYoZCwgZC0+Y2hlY2twb2ludCkpOwotCi0gICAgZC0+cHRyID0gZC0+Y2hlY2twb2ludDsKLSAgICBzYXZlID0gY3VyYnVmbGVmdChkKTsKLSAgICBhc3NlcnQoc2F2ZSA8PSBzaXplb2YoZC0+cmVzaWR1YWwpKTsKLSAgICBtZW1jcHkoZC0+cmVzaWR1YWwsIGQtPnB0ciwgc2F2ZSk7Ci0gICAgZC0+cmVzaWR1YWxfZW5kID0gZC0+cmVzaWR1YWwgKyBzYXZlOwotICAgIGQtPmJ1ZnN0YXJ0X29mcyA9IG9mZnNldChkKTsKLSAgfQotCi0gIHN3aXRjaHRvYnVmKGQsIGQtPnJlc2lkdWFsLCBkLT5yZXNpZHVhbF9lbmQpOwotICByZXR1cm4gZC0+c2l6ZV9wYXJhbTsKLX0KLQotLyogQ29waWVzIHRoZSBuZXh0ICJieXRlcyIgYnl0ZXMgaW50byAiYnVmIiBhbmQgYWR2YW5jZXMgdGhlIHN0cmVhbS4KLSAqIFJlcXVpcmVzIHRoYXQgdGhpcyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAqLwotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyB2b2lkIGNvbnN1bWVieXRlcyh1cGJfcGJkZWNvZGVyICpkLCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcykgewotICBhc3NlcnQoYnl0ZXMgPD0gY3VyYnVmbGVmdChkKSk7Ci0gIG1lbWNweShidWYsIGQtPnB0ciwgYnl0ZXMpOwotICBhZHZhbmNlKGQsIGJ5dGVzKTsKLX0KLQotLyogU2xvdyBwYXRoIGZvciBnZXR0aW5nIHRoZSBuZXh0ICJieXRlcyIgYnl0ZXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZQotICogYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlciBvciBub3QuICBSZXR1cm5zIGEgc3RhdHVzIGNvZGUgYXMgZGVzY3JpYmVkCi0gKiBpbiBkZWNvZGVyLmludC5oLiAqLwotVVBCX05PSU5MSU5FIHN0YXRpYyBpbnQzMl90IGdldGJ5dGVzX3Nsb3codXBiX3BiZGVjb2RlciAqZCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIGNvbnN0IHNpemVfdCBhdmFpbCA9IGN1cmJ1ZmxlZnQoZCk7Ci0gIGNvbnN1bWVieXRlcyhkLCBidWYsIGF2YWlsKTsKLSAgYnl0ZXMgLT0gYXZhaWw7Ci0gIGFzc2VydChieXRlcyA+IDApOwotICBpZiAoaW5fcmVzaWR1YWxfYnVmKGQsIGQtPnB0cikpIHsKLSAgICBhZHZhbmNldG9idWYoZCwgZC0+YnVmX3BhcmFtLCBkLT5zaXplX3BhcmFtKTsKLSAgfQotICBpZiAoY3VyYnVmbGVmdChkKSA+PSBieXRlcykgewotICAgIGNvbnN1bWVieXRlcyhkLCAoY2hhciAqKWJ1ZiArIGF2YWlsLCBieXRlcyk7Ci0gICAgcmV0dXJuIERFQ09ERV9PSzsKLSAgfSBlbHNlIGlmIChkLT5kYXRhX2VuZCA9PSBkLT5kZWxpbV9lbmQpIHsKLSAgICBzZXRlcnIoZCwgIlN1Ym1lc3NhZ2UgZW5kZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHZhbHVlIG9yIGdyb3VwIik7Ci0gICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3VzcGVuZF9zYXZlKGQpOwotICB9Ci19Ci0KLS8qIEdldHMgdGhlIG5leHQgImJ5dGVzIiBieXRlcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0aGUKLSAqIGN1cnJlbnQgYnVmZmVyIG9yIG5vdC4gIFJldHVybnMgYSBzdGF0dXMgY29kZSBhcyBkZXNjcmliZWQgaW4gZGVjb2Rlci5pbnQuaC4KLSAqLwotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyBpbnQzMl90IGdldGJ5dGVzKHVwYl9wYmRlY29kZXIgKmQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpIHsKLSAgaWYgKGN1cmJ1ZmxlZnQoZCkgPj0gYnl0ZXMpIHsKLSAgICAvKiBCdWZmZXIgaGFzIGVub3VnaCBkYXRhIHRvIHNhdGlzZnkuICovCi0gICAgY29uc3VtZWJ5dGVzKGQsIGJ1ZiwgYnl0ZXMpOwotICAgIHJldHVybiBERUNPREVfT0s7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGdldGJ5dGVzX3Nsb3coZCwgYnVmLCBieXRlcyk7Ci0gIH0KLX0KLQotVVBCX05PSU5MSU5FIHN0YXRpYyBzaXplX3QgcGVla2J5dGVzX3Nsb3codXBiX3BiZGVjb2RlciAqZCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIHNpemVfdCByZXQgPSBjdXJidWZsZWZ0KGQpOwotICBtZW1jcHkoYnVmLCBkLT5wdHIsIHJldCk7Ci0gIGlmIChpbl9yZXNpZHVhbF9idWYoZCwgZC0+cHRyKSkgewotICAgIHNpemVfdCBjb3B5ID0gVVBCX01JTihieXRlcyAtIHJldCwgZC0+c2l6ZV9wYXJhbSk7Ci0gICAgbWVtY3B5KChjaGFyICopYnVmICsgcmV0LCBkLT5idWZfcGFyYW0sIGNvcHkpOwotICAgIHJldCArPSBjb3B5OwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLVVQQl9GT1JDRUlOTElORSBzdGF0aWMgc2l6ZV90IHBlZWtieXRlcyh1cGJfcGJkZWNvZGVyICpkLCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIGlmIChjdXJidWZsZWZ0KGQpID49IGJ5dGVzKSB7Ci0gICAgbWVtY3B5KGJ1ZiwgZC0+cHRyLCBieXRlcyk7Ci0gICAgcmV0dXJuIGJ5dGVzOwotICB9IGVsc2UgewotICAgIHJldHVybiBwZWVrYnl0ZXNfc2xvdyhkLCBidWYsIGJ5dGVzKTsKLSAgfQotfQotCi0KLS8qIERlY29kaW5nIG9mIHdpcmUgdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNsb3cgcGF0aCBmb3IgZGVjb2RpbmcgYSB2YXJpbnQgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgcG9zaXRpb24uCi0gKiBSZXR1cm5zIGEgc3RhdHVzIGNvZGUgYXMgZGVzY3JpYmVkIGluIGRlY29kZXIuaW50LmguICovCi1VUEJfTk9JTkxJTkUgaW50MzJfdCB1cGJfcGJkZWNvZGVyX2RlY29kZV92YXJpbnRfc2xvdyh1cGJfcGJkZWNvZGVyICpkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKnU2NCkgewotICB1aW50OF90IGJ5dGUgPSAweDgwOwotICBpbnQgYml0cG9zOwotICAqdTY0ID0gMDsKLSAgZm9yKGJpdHBvcyA9IDA7IGJpdHBvcyA8IDcwICYmIChieXRlICYgMHg4MCk7IGJpdHBvcyArPSA3KSB7Ci0gICAgaW50MzJfdCByZXQgPSBnZXRieXRlcyhkLCAmYnl0ZSwgMSk7Ci0gICAgaWYgKHJldCA+PSAwKSByZXR1cm4gcmV0OwotICAgICp1NjQgfD0gKHVpbnQ2NF90KShieXRlICYgMHg3RikgPDwgYml0cG9zOwotICB9Ci0gIGlmKGJpdHBvcyA9PSA3MCAmJiAoYnl0ZSAmIDB4ODApKSB7Ci0gICAgc2V0ZXJyKGQsIGtVbnRlcm1pbmF0ZWRWYXJpbnQpOwotICAgIHJldHVybiB1cGJfcGJkZWNvZGVyX3N1c3BlbmQoZCk7Ci0gIH0KLSAgcmV0dXJuIERFQ09ERV9PSzsKLX0KLQotLyogRGVjb2RlcyBhIHZhcmludCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4KLSAqIFJldHVybnMgYSBzdGF0dXMgY29kZSBhcyBkZXNjcmliZWQgaW4gZGVjb2Rlci5pbnQuaC4gKi8KLVVQQl9GT1JDRUlOTElORSBzdGF0aWMgaW50MzJfdCBkZWNvZGVfdmFyaW50KHVwYl9wYmRlY29kZXIgKmQsIHVpbnQ2NF90ICp1NjQpIHsKLSAgaWYgKGN1cmJ1ZmxlZnQoZCkgPiAwICYmICEoKmQtPnB0ciAmIDB4ODApKSB7Ci0gICAgKnU2NCA9ICpkLT5wdHI7Ci0gICAgYWR2YW5jZShkLCAxKTsKLSAgICByZXR1cm4gREVDT0RFX09LOwotICB9IGVsc2UgaWYgKGN1cmJ1ZmxlZnQoZCkgPj0gMTApIHsKLSAgICAvKiBGYXN0IGNhc2UuICovCi0gICAgdXBiX2RlY29kZXJldCByID0gdXBiX3ZkZWNvZGVfZmFzdChkLT5wdHIpOwotICAgIGlmIChyLnAgPT0gTlVMTCkgewotICAgICAgc2V0ZXJyKGQsIGtVbnRlcm1pbmF0ZWRWYXJpbnQpOwotICAgICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgICB9Ci0gICAgYWR2YW5jZShkLCByLnAgLSBkLT5wdHIpOwotICAgICp1NjQgPSByLnZhbDsKLSAgICByZXR1cm4gREVDT0RFX09LOwotICB9IGVsc2UgewotICAgIC8qIFNsb3cgY2FzZSAtLSB2YXJpbnQgc3BhbnMgYnVmZmVyIHNlYW0uICovCi0gICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfZGVjb2RlX3ZhcmludF9zbG93KGQsIHU2NCk7Ci0gIH0KLX0KLQotLyogRGVjb2RlcyBhIDMyLWJpdCB2YXJpbnQgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgcG9zaXRpb24uCi0gKiBSZXR1cm5zIGEgc3RhdHVzIGNvZGUgYXMgZGVzY3JpYmVkIGluIGRlY29kZXIuaW50LmguICovCi1VUEJfRk9SQ0VJTkxJTkUgc3RhdGljIGludDMyX3QgZGVjb2RlX3YzMih1cGJfcGJkZWNvZGVyICpkLCB1aW50MzJfdCAqdTMyKSB7Ci0gIHVpbnQ2NF90IHU2NDsKLSAgaW50MzJfdCByZXQgPSBkZWNvZGVfdmFyaW50KGQsICZ1NjQpOwotICBpZiAocmV0ID49IDApIHJldHVybiByZXQ7Ci0gIGlmICh1NjQgPiBVSU5UMzJfTUFYKSB7Ci0gICAgc2V0ZXJyKGQsICJVbnRlcm1pbmF0ZWQgMzItYml0IHZhcmludCIpOwotICAgIC8qIFRPRE8oaGFiZXJtYW4pIGd1YXJhbnRlZSB0aGF0IHRoaXMgZnVuY3Rpb24gcmV0dXJuIGlzID49IDAgc29tZWhvdywKLSAgICAgKiBzbyB3ZSBrbm93IHRoaXMgcGF0aCB3aWxsIGFsd2F5cyBiZSB0cmVhdGVkIGFzIGVycm9yIGJ5IG91ciBjYWxsZXIuCi0gICAgICogUmlnaHQgbm93IHRoZSBzaXplX3QgLT4gaW50MzJfdCBjYW4gb3ZlcmZsb3cgYW5kIHByb2R1Y2UgbmVnYXRpdmUgdmFsdWVzLgotICAgICAqLwotICAgICp1MzIgPSAwOwotICAgIHJldHVybiB1cGJfcGJkZWNvZGVyX3N1c3BlbmQoZCk7Ci0gIH0KLSAgKnUzMiA9IHU2NDsKLSAgcmV0dXJuIERFQ09ERV9PSzsKLX0KLQotLyogRGVjb2RlcyBhIGZpeGVkMzIgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgcG9zaXRpb24uCi0gKiBSZXR1cm5zIGEgc3RhdHVzIGNvZGUgYXMgZGVzY3JpYmVkIGluIGRlY29kZXIuaW50LmguCi0gKiBUT0RPOiBwcm9wZXIgYnl0ZSBzd2FwcGluZyBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcy4gKi8KLVVQQl9GT1JDRUlOTElORSBzdGF0aWMgaW50MzJfdCBkZWNvZGVfZml4ZWQzMih1cGJfcGJkZWNvZGVyICpkLCB1aW50MzJfdCAqdTMyKSB7Ci0gIHJldHVybiBnZXRieXRlcyhkLCB1MzIsIDQpOwotfQotCi0vKiBEZWNvZGVzIGEgZml4ZWQ2NCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4KLSAqIFJldHVybnMgYSBzdGF0dXMgY29kZSBhcyBkZXNjcmliZWQgaW4gZGVjb2Rlci5pbnQuaC4KLSAqIFRPRE86IHByb3BlciBieXRlIHN3YXBwaW5nIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzLiAqLwotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyBpbnQzMl90IGRlY29kZV9maXhlZDY0KHVwYl9wYmRlY29kZXIgKmQsIHVpbnQ2NF90ICp1NjQpIHsKLSAgcmV0dXJuIGdldGJ5dGVzKGQsIHU2NCwgOCk7Ci19Ci0KLS8qIE5vbi1zdGF0aWMgdmVyc2lvbnMgb2YgdGhlIGFib3ZlIGZ1bmN0aW9ucy4KLSAqIFRoZXNlIGFyZSBjYWxsZWQgYnkgdGhlIEpJVCBmb3IgZmFsbGJhY2sgcGF0aHMuICovCi1pbnQzMl90IHVwYl9wYmRlY29kZXJfZGVjb2RlX2YzMih1cGJfcGJkZWNvZGVyICpkLCB1aW50MzJfdCAqdTMyKSB7Ci0gIHJldHVybiBkZWNvZGVfZml4ZWQzMihkLCB1MzIpOwotfQotCi1pbnQzMl90IHVwYl9wYmRlY29kZXJfZGVjb2RlX2Y2NCh1cGJfcGJkZWNvZGVyICpkLCB1aW50NjRfdCAqdTY0KSB7Ci0gIHJldHVybiBkZWNvZGVfZml4ZWQ2NChkLCB1NjQpOwotfQotCi1zdGF0aWMgZG91YmxlIGFzX2RvdWJsZSh1aW50NjRfdCBuKSB7IGRvdWJsZSBkOyBtZW1jcHkoJmQsICZuLCA4KTsgcmV0dXJuIGQ7IH0KLXN0YXRpYyBmbG9hdCAgYXNfZmxvYXQodWludDMyX3QgbikgIHsgZmxvYXQgIGY7IG1lbWNweSgmZiwgJm4sIDQpOyByZXR1cm4gZjsgfQotCi0vKiBQdXNoZXMgYSBmcmFtZSBvbnRvIHRoZSBkZWNvZGVyIHN0YWNrLiAqLwotc3RhdGljIGJvb2wgZGVjb2Rlcl9wdXNoKHVwYl9wYmRlY29kZXIgKmQsIHVpbnQ2NF90IGVuZCkgewotICB1cGJfcGJkZWNvZGVyX2ZyYW1lICpmciA9IGQtPnRvcDsKLQotICBpZiAoZW5kID4gZnItPmVuZF9vZnMpIHsKLSAgICBzZXRlcnIoZCwga1BiRGVjb2RlclN1Ym1lc3NhZ2VUb29Mb25nKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAoZnIgPT0gZC0+bGltaXQpIHsKLSAgICBzZXRlcnIoZCwga1BiRGVjb2RlclN0YWNrT3ZlcmZsb3cpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGZyKys7Ci0gIGZyLT5lbmRfb2ZzID0gZW5kOwotICBmci0+ZGlzcGF0Y2ggPSBOVUxMOwotICBmci0+Z3JvdXBudW0gPSAwOwotICBkLT50b3AgPSBmcjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHB1c2h0YWdkZWxpbSh1cGJfcGJkZWNvZGVyICpkLCB1aW50MzJfdCBhcmcpIHsKLSAgLyogV2hpbGUgd2UgZXhwZWN0IHRvIHNlZSBhbiAiZW5kIiB0YWcgKGVpdGhlciBFTkRHUk9VUCBvciBhIG5vbi1zZXF1ZW5jZQotICAgKiBmaWVsZCBudW1iZXIpIHByaW9yIHRvIGhpdHRpbmcgYW55IGVuY2xvc2luZyBzdWJtZXNzYWdlIGVuZCwgcHVzaGluZyBvdXIKLSAgICogZXhpc3RpbmcgZGVsaW0gZW5kIHByZXZlbnRzIHVzIGZyb20gY29udGludWluZyB0byBwYXJzZSB2YWx1ZXMgZnJvbSBhCi0gICAqIGNvcnJ1cHQgcHJvdG8gdGhhdCBkb2Vzbid0IGdpdmUgdXMgYW4gRU5EIHRhZyBpbiB0aW1lLiAqLwotICBpZiAoIWRlY29kZXJfcHVzaChkLCBkLT50b3AtPmVuZF9vZnMpKQotICAgIHJldHVybiBmYWxzZTsKLSAgZC0+dG9wLT5ncm91cG51bSA9IGFyZzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFBvcHMgYSBmcmFtZSBmcm9tIHRoZSBkZWNvZGVyIHN0YWNrLiAqLwotc3RhdGljIHZvaWQgZGVjb2Rlcl9wb3AodXBiX3BiZGVjb2RlciAqZCkgeyBkLT50b3AtLTsgfQotCi1VUEJfTk9JTkxJTkUgaW50MzJfdCB1cGJfcGJkZWNvZGVyX2NoZWNrdGFnX3Nsb3codXBiX3BiZGVjb2RlciAqZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBleHBlY3RlZCkgewotICB1aW50NjRfdCBkYXRhID0gMDsKLSAgc2l6ZV90IGJ5dGVzID0gdXBiX3ZhbHVlX3NpemUoZXhwZWN0ZWQpOwotICBzaXplX3QgcmVhZCA9IHBlZWtieXRlcyhkLCAmZGF0YSwgYnl0ZXMpOwotICBpZiAocmVhZCA9PSBieXRlcyAmJiBkYXRhID09IGV4cGVjdGVkKSB7Ci0gICAgLyogQWR2YW5jZSBwYXN0IG1hdGNoZWQgYnl0ZXMuICovCi0gICAgaW50MzJfdCBvayA9IGdldGJ5dGVzKGQsICZkYXRhLCByZWFkKTsKLSAgICBVUEJfQVNTRVJUX1ZBUihvaywgb2sgPCAwKTsKLSAgICByZXR1cm4gREVDT0RFX09LOwotICB9IGVsc2UgaWYgKHJlYWQgPCBieXRlcyAmJiBtZW1jbXAoJmRhdGEsICZleHBlY3RlZCwgcmVhZCkgPT0gMCkgewotICAgIHJldHVybiBzdXNwZW5kX3NhdmUoZCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIERFQ09ERV9NSVNNQVRDSDsKLSAgfQotfQotCi1pbnQzMl90IHVwYl9wYmRlY29kZXJfc2tpcHVua25vd24odXBiX3BiZGVjb2RlciAqZCwgaW50MzJfdCBmaWVsZG51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHdpcmVfdHlwZSkgewotICBpZiAoZmllbGRudW0gPj0gMCkKLSAgICBnb3RvIGhhdmVfdGFnOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgdWludDMyX3QgdGFnOwotICAgIENIRUNLX1JFVFVSTihkZWNvZGVfdjMyKGQsICZ0YWcpKTsKLSAgICB3aXJlX3R5cGUgPSB0YWcgJiAweDc7Ci0gICAgZmllbGRudW0gPSB0YWcgPj4gMzsKLQotaGF2ZV90YWc6Ci0gICAgaWYgKGZpZWxkbnVtID09IDApIHsKLSAgICAgIHNldGVycihkLCAiU2F3IGludmFsaWQgZmllbGQgbnVtYmVyICgwKSIpOwotICAgICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgICB9Ci0KLSAgICAvKiBUT0RPOiBkZWxpdmVyIHRvIHVua25vd24gZmllbGQgY2FsbGJhY2suICovCi0gICAgc3dpdGNoICh3aXJlX3R5cGUpIHsKLSAgICAgIGNhc2UgVVBCX1dJUkVfVFlQRV8zMkJJVDoKLSAgICAgICAgQ0hFQ0tfUkVUVVJOKHNraXAoZCwgNCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1dJUkVfVFlQRV82NEJJVDoKLSAgICAgICAgQ0hFQ0tfUkVUVVJOKHNraXAoZCwgOCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1dJUkVfVFlQRV9WQVJJTlQ6IHsKLSAgICAgICAgdWludDY0X3QgdTY0OwotICAgICAgICBDSEVDS19SRVRVUk4oZGVjb2RlX3ZhcmludChkLCAmdTY0KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRDogewotICAgICAgICB1aW50MzJfdCBsZW47Ci0gICAgICAgIENIRUNLX1JFVFVSTihkZWNvZGVfdjMyKGQsICZsZW4pKTsKLSAgICAgICAgQ0hFQ0tfUkVUVVJOKHNraXAoZCwgbGVuKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBVUEJfV0lSRV9UWVBFX1NUQVJUX0dST1VQOgotICAgICAgICBDSEVDS19TVVNQRU5EKHB1c2h0YWdkZWxpbShkLCAtZmllbGRudW0pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVQQl9XSVJFX1RZUEVfRU5EX0dST1VQOgotICAgICAgICBpZiAoZmllbGRudW0gPT0gLWQtPnRvcC0+Z3JvdXBudW0pIHsKLSAgICAgICAgICBkZWNvZGVyX3BvcChkKTsKLSAgICAgICAgfSBlbHNlIGlmIChmaWVsZG51bSA9PSBkLT50b3AtPmdyb3VwbnVtKSB7Ci0gICAgICAgICAgcmV0dXJuIERFQ09ERV9FTkRHUk9VUDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzZXRlcnIoZCwgIlVubWF0Y2hlZCBFTkRHUk9VUCB0YWcuIik7Ci0gICAgICAgICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHNldGVycihkLCAiSW52YWxpZCB3aXJlIHR5cGUiKTsKLSAgICAgICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgICB9Ci0KLSAgICBpZiAoZC0+dG9wLT5ncm91cG51bSA+PSAwKSB7Ci0gICAgICByZXR1cm4gREVDT0RFX09LOwotICAgIH0KLQotICAgIC8qIFVua25vd24gZ3JvdXAgLS0gY29udGludWUgbG9vcGluZyBvdmVyIHVua25vd24gZmllbGRzLiAqLwotICAgIGNoZWNrcG9pbnQoZCk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZ290b19lbmRtc2codXBiX3BiZGVjb2RlciAqZCkgewotICB1cGJfdmFsdWUgdjsKLSAgYm9vbCBmb3VuZCA9IHVwYl9pbnR0YWJsZV9sb29rdXAzMihkLT50b3AtPmRpc3BhdGNoLCBESVNQQVRDSF9FTkRNU0csICZ2KTsKLSAgVVBCX0FTU0VSVF9WQVIoZm91bmQsIGZvdW5kKTsKLSAgZC0+cGMgPSBkLT50b3AtPmJhc2UgKyB1cGJfdmFsdWVfZ2V0dWludDY0KHYpOwotfQotCi0vKiBQYXJzZXMgYSB0YWcgYW5kIGp1bXBzIHRvIHRoZSBjb3JyZXNwb25kaW5nIGJ5dGVjb2RlIGluc3RydWN0aW9uIGZvciB0aGlzCi0gKiBmaWVsZC4KLSAqCi0gKiBJZiB0aGUgdGFnIGlzIHVua25vd24gKG9yIHRoZSB3aXJlIHR5cGUgZG9lc24ndCBtYXRjaCksIHBhcnNlcyB0aGUgZmllbGQgYXMKLSAqIHVua25vd24uICBJZiB0aGUgdGFnIGlzIGEgdmFsaWQgRU5ER1JPVVAgdGFnLCBqdW1wcyB0byB0aGUgYnl0ZWNvZGUKLSAqIGluc3RydWN0aW9uIGZvciB0aGUgZW5kIG9mIG1lc3NhZ2UuICovCi1zdGF0aWMgaW50MzJfdCBkaXNwYXRjaCh1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHVwYl9pbnR0YWJsZSAqZGlzcGF0Y2ggPSBkLT50b3AtPmRpc3BhdGNoOwotICB1aW50MzJfdCB0YWc7Ci0gIHVpbnQ4X3Qgd2lyZV90eXBlOwotICB1aW50MzJfdCBmaWVsZG51bTsKLSAgdXBiX3ZhbHVlIHZhbDsKLSAgaW50MzJfdCByZXR2YWw7Ci0KLSAgLyogRGVjb2RlIHRhZy4gKi8KLSAgQ0hFQ0tfUkVUVVJOKGRlY29kZV92MzIoZCwgJnRhZykpOwotICB3aXJlX3R5cGUgPSB0YWcgJiAweDc7Ci0gIGZpZWxkbnVtID0gdGFnID4+IDM7Ci0KLSAgLyogTG9va3VwIHRhZy4gIEJlY2F1c2Ugb2YgcGFja2VkL25vbi1wYWNrZWQgY29tcGF0aWJpbGl0eSwgd2UgaGF2ZSB0bwotICAgKiBjaGVjayB0aGUgd2lyZSB0eXBlIGFnYWluc3QgdHdvIHBvc3NpYmlsaXRpZXMuICovCi0gIGlmIChmaWVsZG51bSAhPSBESVNQQVRDSF9FTkRNU0cgJiYKLSAgICAgIHVwYl9pbnR0YWJsZV9sb29rdXAzMihkaXNwYXRjaCwgZmllbGRudW0sICZ2YWwpKSB7Ci0gICAgdWludDY0X3QgdiA9IHVwYl92YWx1ZV9nZXR1aW50NjQodmFsKTsKLSAgICBpZiAod2lyZV90eXBlID09ICh2ICYgMHhmZikpIHsKLSAgICAgIGQtPnBjID0gZC0+dG9wLT5iYXNlICsgKHYgPj4gMTYpOwotICAgICAgcmV0dXJuIERFQ09ERV9PSzsKLSAgICB9IGVsc2UgaWYgKHdpcmVfdHlwZSA9PSAoKHYgPj4gOCkgJiAweGZmKSkgewotICAgICAgYm9vbCBmb3VuZCA9Ci0gICAgICAgICAgdXBiX2ludHRhYmxlX2xvb2t1cChkaXNwYXRjaCwgZmllbGRudW0gKyBVUEJfTUFYX0ZJRUxETlVNQkVSLCAmdmFsKTsKLSAgICAgIFVQQl9BU1NFUlRfVkFSKGZvdW5kLCBmb3VuZCk7Ci0gICAgICBkLT5wYyA9IGQtPnRvcC0+YmFzZSArIHVwYl92YWx1ZV9nZXR1aW50NjQodmFsKTsKLSAgICAgIHJldHVybiBERUNPREVfT0s7Ci0gICAgfQotICB9Ci0KLSAgLyogV2UgaGF2ZSBzb21lIHVua25vd24gZmllbGRzIChvciBFTkRHUk9VUCkgdG8gcGFyc2UuICBUaGUgRElTUEFUQ0ggb3IgVEFHCi0gICAqIGJ5dGVjb2RlIHRoYXQgdHJpZ2dlcmVkIHRoaXMgaXMgcHJlY2VkZWQgYnkgYSBDSEVDS0RFTElNIGJ5dGVjb2RlIHdoaWNoCi0gICAqIHdlIG5lZWQgdG8gYmFjayB1cCB0bywgc28gdGhhdCB3aGVuIHdlJ3JlIGRvbmUgc2tpcHBpbmcgdW5rbm93biBkYXRhIHdlCi0gICAqIGNhbiByZS1jaGVjayB0aGUgZGVsaW1pdGVkIGVuZC4gKi8KLSAgZC0+bGFzdC0tOyAgLyogTmVjZXNzYXJ5IGlmIHdlIGdldCBzdXNwZW5kZWQgKi8KLSAgZC0+cGMgPSBkLT5sYXN0OwotICBhc3NlcnQoZ2V0b3AoKmQtPmxhc3QpID09IE9QX0NIRUNLREVMSU0pOwotCi0gIC8qIFVua25vd24gZmllbGQgb3IgRU5ER1JPVVAuICovCi0gIHJldHZhbCA9IHVwYl9wYmRlY29kZXJfc2tpcHVua25vd24oZCwgZmllbGRudW0sIHdpcmVfdHlwZSk7Ci0KLSAgQ0hFQ0tfUkVUVVJOKHJldHZhbCk7Ci0KLSAgaWYgKHJldHZhbCA9PSBERUNPREVfRU5ER1JPVVApIHsKLSAgICBnb3RvX2VuZG1zZyhkKTsKLSAgICByZXR1cm4gREVDT0RFX09LOwotICB9Ci0KLSAgcmV0dXJuIERFQ09ERV9PSzsKLX0KLQotLyogQ2FsbGVycyBrbm93IHRoYXQgdGhlIHN0YWNrIGlzIG1vcmUgdGhhbiBvbmUgZGVlcCBiZWNhdXNlIHRoZSBvcGNvZGVzIHRoYXQKLSAqIGNhbGwgdGhpcyBvbmx5IG9jY3VyIGFmdGVyIFBVU0ggb3BlcmF0aW9ucy4gKi8KLXVwYl9wYmRlY29kZXJfZnJhbWUgKm91dGVyX2ZyYW1lKHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgYXNzZXJ0KGQtPnRvcCAhPSBkLT5zdGFjayk7Ci0gIHJldHVybiBkLT50b3AgLSAxOwotfQotCi0KLS8qIFRoZSBtYWluIGRlY29kaW5nIGxvb3AgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBtYWluIGRlY29kZXIgVk0gZnVuY3Rpb24uICBVc2VzIHRyYWRpdGlvbmFsIGJ5dGVjb2RlIGRpc3BhdGNoIGxvb3Agd2l0aCBhCi0gKiBzd2l0Y2goKSBzdGF0ZW1lbnQuICovCi1zaXplX3QgcnVuX2RlY29kZXJfdm0odXBiX3BiZGVjb2RlciAqZCwgY29uc3QgbWdyb3VwICpncm91cCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfYnVmaGFuZGxlKiBoYW5kbGUpIHsKLQotI2RlZmluZSBWTUNBU0Uob3AsIGNvZGUpIFwKLSAgY2FzZSBvcDogeyBjb2RlOyBpZiAoY29uc3VtZXNfaW5wdXQob3ApKSBjaGVja3BvaW50KGQpOyBicmVhazsgfQotI2RlZmluZSBQUklNSVRJVkVfT1AodHlwZSwgd3QsIG5hbWUsIGNvbnZmdW5jLCBjdHlwZSkgXAotICBWTUNBU0UoT1BfUEFSU0VfICMjIHR5cGUsIHsgXAotICAgIGN0eXBlIHZhbDsgXAotICAgIENIRUNLX1JFVFVSTihkZWNvZGVfICMjIHd0KGQsICZ2YWwpKTsgXAotICAgIHVwYl9zaW5rX3B1dCAjIyBuYW1lKCZkLT50b3AtPnNpbmssIGFyZywgKGNvbnZmdW5jKSh2YWwpKTsgXAotICB9KQotCi0gIHdoaWxlKDEpIHsKLSAgICBpbnQzMl90IGluc3RydWN0aW9uOwotICAgIG9wY29kZSBvcDsKLSAgICB1aW50MzJfdCBhcmc7Ci0gICAgaW50MzJfdCBsb25nb2ZzOwotCi0gICAgZC0+bGFzdCA9IGQtPnBjOwotICAgIGluc3RydWN0aW9uID0gKmQtPnBjKys7Ci0gICAgb3AgPSBnZXRvcChpbnN0cnVjdGlvbik7Ci0gICAgYXJnID0gaW5zdHJ1Y3Rpb24gPj4gODsKLSAgICBsb25nb2ZzID0gYXJnOwotICAgIGFzc2VydChkLT5wdHIgIT0gZC0+cmVzaWR1YWxfZW5kKTsKLSAgICBVUEJfVU5VU0VEKGdyb3VwKTsKLSNpZmRlZiBVUEJfRFVNUF9CWVRFQ09ERQotICAgIGZwcmludGYoc3RkZXJyLCAic19vZnM9JWQgYnVmX29mcz0lZCBkYXRhX3JlbT0lZCBidWZfcmVtPSVkIGRlbGltX3JlbT0lZCAiCi0gICAgICAgICAgICAgICAgICAgICIleCAlcyAoJWQpXG4iLAotICAgICAgICAgICAgKGludClvZmZzZXQoZCksCi0gICAgICAgICAgICAoaW50KShkLT5wdHIgLSBkLT5idWYpLAotICAgICAgICAgICAgKGludCkoZC0+ZGF0YV9lbmQgLSBkLT5wdHIpLAotICAgICAgICAgICAgKGludCkoZC0+ZW5kIC0gZC0+cHRyKSwKLSAgICAgICAgICAgIChpbnQpKChkLT50b3AtPmVuZF9vZnMgLSBkLT5idWZzdGFydF9vZnMpIC0gKGQtPnB0ciAtIGQtPmJ1ZikpLAotICAgICAgICAgICAgKGludCkoZC0+cGMgLSAxIC0gZ3JvdXAtPmJ5dGVjb2RlKSwKLSAgICAgICAgICAgIHVwYl9wYmRlY29kZXJfZ2V0b3BuYW1lKG9wKSwKLSAgICAgICAgICAgIGFyZyk7Ci0jZW5kaWYKLSAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICAvKiBUZWNobmljYWxseSwgd2UgYXJlIGxvc2luZyBkYXRhIGlmIHdlIHNlZSBhIDMyLWJpdCB2YXJpbnQgdGhhdCBpcyBub3QKLSAgICAgICAqIHByb3Blcmx5IHNpZ24tZXh0ZW5kZWQuICBXZSBjb3VsZCBkZXRlY3QgdGhpcyBhbmQgZXJyb3IgYWJvdXQgdGhlIGRhdGEKLSAgICAgICAqIGxvc3MsIGJ1dCBwcm90bzIgZG9lcyBub3QgZG8gdGhpcywgc28gd2UgcGFzcy4gKi8KLSAgICAgIFBSSU1JVElWRV9PUChJTlQzMiwgICAgdmFyaW50LCAgaW50MzIsICBpbnQzMl90LCAgICAgIHVpbnQ2NF90KQotICAgICAgUFJJTUlUSVZFX09QKElOVDY0LCAgICB2YXJpbnQsICBpbnQ2NCwgIGludDY0X3QsICAgICAgdWludDY0X3QpCi0gICAgICBQUklNSVRJVkVfT1AoVUlOVDMyLCAgIHZhcmludCwgIHVpbnQzMiwgdWludDMyX3QsICAgICB1aW50NjRfdCkKLSAgICAgIFBSSU1JVElWRV9PUChVSU5UNjQsICAgdmFyaW50LCAgdWludDY0LCB1aW50NjRfdCwgICAgIHVpbnQ2NF90KQotICAgICAgUFJJTUlUSVZFX09QKEZJWEVEMzIsICBmaXhlZDMyLCB1aW50MzIsIHVpbnQzMl90LCAgICAgdWludDMyX3QpCi0gICAgICBQUklNSVRJVkVfT1AoRklYRUQ2NCwgIGZpeGVkNjQsIHVpbnQ2NCwgdWludDY0X3QsICAgICB1aW50NjRfdCkKLSAgICAgIFBSSU1JVElWRV9PUChTRklYRUQzMiwgZml4ZWQzMiwgaW50MzIsICBpbnQzMl90LCAgICAgIHVpbnQzMl90KQotICAgICAgUFJJTUlUSVZFX09QKFNGSVhFRDY0LCBmaXhlZDY0LCBpbnQ2NCwgIGludDY0X3QsICAgICAgdWludDY0X3QpCi0gICAgICBQUklNSVRJVkVfT1AoQk9PTCwgICAgIHZhcmludCwgIGJvb2wsICAgYm9vbCwgICAgICAgICB1aW50NjRfdCkKLSAgICAgIFBSSU1JVElWRV9PUChET1VCTEUsICAgZml4ZWQ2NCwgZG91YmxlLCBhc19kb3VibGUsICAgIHVpbnQ2NF90KQotICAgICAgUFJJTUlUSVZFX09QKEZMT0FULCAgICBmaXhlZDMyLCBmbG9hdCwgIGFzX2Zsb2F0LCAgICAgdWludDMyX3QpCi0gICAgICBQUklNSVRJVkVfT1AoU0lOVDMyLCAgIHZhcmludCwgIGludDMyLCAgdXBiX3p6ZGVjXzMyLCB1aW50NjRfdCkKLSAgICAgIFBSSU1JVElWRV9PUChTSU5UNjQsICAgdmFyaW50LCAgaW50NjQsICB1cGJfenpkZWNfNjQsIHVpbnQ2NF90KQotCi0gICAgICBWTUNBU0UoT1BfU0VURElTUEFUQ0gsCi0gICAgICAgIGQtPnRvcC0+YmFzZSA9IGQtPnBjIC0gMTsKLSAgICAgICAgbWVtY3B5KCZkLT50b3AtPmRpc3BhdGNoLCBkLT5wYywgc2l6ZW9mKHZvaWQqKSk7Ci0gICAgICAgIGQtPnBjICs9IHNpemVvZih2b2lkKikgLyBzaXplb2YodWludDMyX3QpOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX1NUQVJUTVNHLAotICAgICAgICBDSEVDS19TVVNQRU5EKHVwYl9zaW5rX3N0YXJ0bXNnKCZkLT50b3AtPnNpbmspKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9FTkRNU0csCi0gICAgICAgIENIRUNLX1NVU1BFTkQodXBiX3NpbmtfZW5kbXNnKCZkLT50b3AtPnNpbmssIGQtPnN0YXR1cykpOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX1NUQVJUU0VRLAotICAgICAgICB1cGJfcGJkZWNvZGVyX2ZyYW1lICpvdXRlciA9IG91dGVyX2ZyYW1lKGQpOwotICAgICAgICBDSEVDS19TVVNQRU5EKHVwYl9zaW5rX3N0YXJ0c2VxKCZvdXRlci0+c2luaywgYXJnLCAmZC0+dG9wLT5zaW5rKSk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfRU5EU0VRLAotICAgICAgICBDSEVDS19TVVNQRU5EKHVwYl9zaW5rX2VuZHNlcSgmZC0+dG9wLT5zaW5rLCBhcmcpKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9TVEFSVFNVQk1TRywKLSAgICAgICAgdXBiX3BiZGVjb2Rlcl9mcmFtZSAqb3V0ZXIgPSBvdXRlcl9mcmFtZShkKTsKLSAgICAgICAgQ0hFQ0tfU1VTUEVORCh1cGJfc2lua19zdGFydHN1Ym1zZygmb3V0ZXItPnNpbmssIGFyZywgJmQtPnRvcC0+c2luaykpOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX0VORFNVQk1TRywKLSAgICAgICAgQ0hFQ0tfU1VTUEVORCh1cGJfc2lua19lbmRzdWJtc2coJmQtPnRvcC0+c2luaywgYXJnKSk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfU1RBUlRTVFIsCi0gICAgICAgIHVpbnQzMl90IGxlbiA9IGRlbGltX3JlbWFpbmluZyhkKTsKLSAgICAgICAgdXBiX3BiZGVjb2Rlcl9mcmFtZSAqb3V0ZXIgPSBvdXRlcl9mcmFtZShkKTsKLSAgICAgICAgQ0hFQ0tfU1VTUEVORCh1cGJfc2lua19zdGFydHN0cigmb3V0ZXItPnNpbmssIGFyZywgbGVuLCAmZC0+dG9wLT5zaW5rKSk7Ci0gICAgICAgIGlmIChsZW4gPT0gMCkgewotICAgICAgICAgIGQtPnBjKys7ICAvKiBTa2lwIE9QX1NUUklORy4gKi8KLSAgICAgICAgfQotICAgICAgKQotICAgICAgVk1DQVNFKE9QX1NUUklORywKLSAgICAgICAgdWludDMyX3QgbGVuID0gY3VyYnVmbGVmdChkKTsKLSAgICAgICAgc2l6ZV90IG4gPSB1cGJfc2lua19wdXRzdHJpbmcoJmQtPnRvcC0+c2luaywgYXJnLCBkLT5wdHIsIGxlbiwgaGFuZGxlKTsKLSAgICAgICAgaWYgKG4gPiBsZW4pIHsKLSAgICAgICAgICBpZiAobiA+IGRlbGltX3JlbWFpbmluZyhkKSkgewotICAgICAgICAgICAgc2V0ZXJyKGQsICJUcmllZCB0byBza2lwIHBhc3QgZW5kIG9mIHN0cmluZy4iKTsKLSAgICAgICAgICAgIHJldHVybiB1cGJfcGJkZWNvZGVyX3N1c3BlbmQoZCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGludDMyX3QgcmV0ID0gc2tpcChkLCBuKTsKLSAgICAgICAgICAgIC8qIFRoaXMgc2hvdWxkbid0IHJldHVybiBERUNPREVfT0ssIGJlY2F1c2UgbiA+IGxlbi4gKi8KLSAgICAgICAgICAgIGFzc2VydChyZXQgPj0gMCk7Ci0gICAgICAgICAgICByZXR1cm4gcmV0OwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBhZHZhbmNlKGQsIG4pOwotICAgICAgICBpZiAobiA8IGxlbiB8fCBkLT5kZWxpbV9lbmQgPT0gTlVMTCkgewotICAgICAgICAgIC8qIFdlIGFyZW4ndCBmaW5pc2hlZCB3aXRoIHRoaXMgc3RyaW5nIHlldC4gKi8KLSAgICAgICAgICBkLT5wYy0tOyAgLyogUmVwZWF0IE9QX1NUUklORy4gKi8KLSAgICAgICAgICBpZiAobiA+IDApIGNoZWNrcG9pbnQoZCk7Ci0gICAgICAgICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgICAgICAgfQotICAgICAgKQotICAgICAgVk1DQVNFKE9QX0VORFNUUiwKLSAgICAgICAgQ0hFQ0tfU1VTUEVORCh1cGJfc2lua19lbmRzdHIoJmQtPnRvcC0+c2luaywgYXJnKSk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfUFVTSFRBR0RFTElNLAotICAgICAgICBDSEVDS19TVVNQRU5EKHB1c2h0YWdkZWxpbShkLCBhcmcpKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9TRVRCSUdHUk9VUE5VTSwKLSAgICAgICAgZC0+dG9wLT5ncm91cG51bSA9ICpkLT5wYysrOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX1BPUCwKLSAgICAgICAgYXNzZXJ0KGQtPnRvcCA+IGQtPnN0YWNrKTsKLSAgICAgICAgZGVjb2Rlcl9wb3AoZCk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfUFVTSExFTkRFTElNLAotICAgICAgICB1aW50MzJfdCBsZW47Ci0gICAgICAgIENIRUNLX1JFVFVSTihkZWNvZGVfdjMyKGQsICZsZW4pKTsKLSAgICAgICAgQ0hFQ0tfU1VTUEVORChkZWNvZGVyX3B1c2goZCwgb2Zmc2V0KGQpICsgbGVuKSk7Ci0gICAgICAgIHNldF9kZWxpbV9lbmQoZCk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfU0VUREVMSU0sCi0gICAgICAgIHNldF9kZWxpbV9lbmQoZCk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfQ0hFQ0tERUxJTSwKLSAgICAgICAgLyogV2UgYXJlIGd1YXJhbnRlZWQgb2YgdGhpcyBhc3NlcnQgYmVjYXVzZSB3ZSBuZXZlciBhbGxvdyBvdXJzZWx2ZXMgdG8KLSAgICAgICAgICogY29uc3VtZSBieXRlcyBiZXlvbmQgZGF0YV9lbmQsIHdoaWNoIGNvdmVycyBkZWxpbV9lbmQgd2hlbiBub24tTlVMTC4KLSAgICAgICAgICovCi0gICAgICAgIGFzc2VydCghKGQtPmRlbGltX2VuZCAmJiBkLT5wdHIgPiBkLT5kZWxpbV9lbmQpKTsKLSAgICAgICAgaWYgKGQtPnB0ciA9PSBkLT5kZWxpbV9lbmQpCi0gICAgICAgICAgZC0+cGMgKz0gbG9uZ29mczsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9DQUxMLAotICAgICAgICBkLT5jYWxsc3RhY2tbZC0+Y2FsbF9sZW4rK10gPSBkLT5wYzsKLSAgICAgICAgZC0+cGMgKz0gbG9uZ29mczsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9SRVQsCi0gICAgICAgIGFzc2VydChkLT5jYWxsX2xlbiA+IDApOwotICAgICAgICBkLT5wYyA9IGQtPmNhbGxzdGFja1stLWQtPmNhbGxfbGVuXTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9CUkFOQ0gsCi0gICAgICAgIGQtPnBjICs9IGxvbmdvZnM7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfVEFHMSwKLSAgICAgICAgdWludDhfdCBleHBlY3RlZDsKLSAgICAgICAgQ0hFQ0tfU1VTUEVORChjdXJidWZsZWZ0KGQpID4gMCk7Ci0gICAgICAgIGV4cGVjdGVkID0gKGFyZyA+PiA4KSAmIDB4ZmY7Ci0gICAgICAgIGlmICgqZC0+cHRyID09IGV4cGVjdGVkKSB7Ci0gICAgICAgICAgYWR2YW5jZShkLCAxKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnQ4X3Qgc2hvcnRvZnM7Ci0gICAgICAgICBiYWR0YWc6Ci0gICAgICAgICAgc2hvcnRvZnMgPSBhcmc7Ci0gICAgICAgICAgaWYgKHNob3J0b2ZzID09IExBQkVMX0RJU1BBVENIKSB7Ci0gICAgICAgICAgICBDSEVDS19SRVRVUk4oZGlzcGF0Y2goZCkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBkLT5wYyArPSBzaG9ydG9mczsKLSAgICAgICAgICAgIGJyZWFrOyAvKiBBdm9pZCBjaGVja3BvaW50KCkuICovCi0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfVEFHMiwKLSAgICAgICAgdWludDE2X3QgZXhwZWN0ZWQ7Ci0gICAgICAgIENIRUNLX1NVU1BFTkQoY3VyYnVmbGVmdChkKSA+IDApOwotICAgICAgICBleHBlY3RlZCA9IChhcmcgPj4gOCkgJiAweGZmZmY7Ci0gICAgICAgIGlmIChjdXJidWZsZWZ0KGQpID49IDIpIHsKLSAgICAgICAgICB1aW50MTZfdCBhY3R1YWw7Ci0gICAgICAgICAgbWVtY3B5KCZhY3R1YWwsIGQtPnB0ciwgMik7Ci0gICAgICAgICAgaWYgKGV4cGVjdGVkID09IGFjdHVhbCkgewotICAgICAgICAgICAgYWR2YW5jZShkLCAyKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ290byBiYWR0YWc7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGludDMyX3QgcmVzdWx0ID0gdXBiX3BiZGVjb2Rlcl9jaGVja3RhZ19zbG93KGQsIGV4cGVjdGVkKTsKLSAgICAgICAgICBpZiAocmVzdWx0ID09IERFQ09ERV9NSVNNQVRDSCkgZ290byBiYWR0YWc7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfVEFHTiwgewotICAgICAgICB1aW50NjRfdCBleHBlY3RlZDsKLSAgICAgICAgaW50MzJfdCByZXN1bHQ7Ci0gICAgICAgIG1lbWNweSgmZXhwZWN0ZWQsIGQtPnBjLCA4KTsKLSAgICAgICAgZC0+cGMgKz0gMjsKLSAgICAgICAgcmVzdWx0ID0gdXBiX3BiZGVjb2Rlcl9jaGVja3RhZ19zbG93KGQsIGV4cGVjdGVkKTsKLSAgICAgICAgaWYgKHJlc3VsdCA9PSBERUNPREVfTUlTTUFUQ0gpIGdvdG8gYmFkdGFnOwotICAgICAgICBpZiAocmVzdWx0ID49IDApIHJldHVybiByZXN1bHQ7Ci0gICAgICB9KQotICAgICAgVk1DQVNFKE9QX0RJU1BBVENILCB7Ci0gICAgICAgIENIRUNLX1JFVFVSTihkaXNwYXRjaChkKSk7Ci0gICAgICB9KQotICAgICAgVk1DQVNFKE9QX0hBTFQsIHsKLSAgICAgICAgcmV0dXJuIGQtPnNpemVfcGFyYW07Ci0gICAgICB9KQotICAgIH0KLSAgfQotfQotCi0KLS8qIEJ5dGVzSGFuZGxlciBoYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgKnVwYl9wYmRlY29kZXJfc3RhcnRiYyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpwYywgc2l6ZV90IHNpemVfaGludCkgewotICB1cGJfcGJkZWNvZGVyICpkID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChzaXplX2hpbnQpOwotICBkLT50b3AtPmVuZF9vZnMgPSBVSU5UNjRfTUFYOwotICBkLT5idWZzdGFydF9vZnMgPSAwOwotICBkLT5jYWxsX2xlbiA9IDE7Ci0gIGQtPmNhbGxzdGFja1swXSA9ICZoYWx0OwotICBkLT5wYyA9IHBjOwotICBkLT5za2lwID0gMDsKLSAgcmV0dXJuIGQ7Ci19Ci0KLXZvaWQgKnVwYl9wYmRlY29kZXJfc3RhcnRqaXQodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIHNpemVfdCBzaXplX2hpbnQpIHsKLSAgdXBiX3BiZGVjb2RlciAqZCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKHNpemVfaGludCk7Ci0gIGQtPnRvcC0+ZW5kX29mcyA9IFVJTlQ2NF9NQVg7Ci0gIGQtPmJ1ZnN0YXJ0X29mcyA9IDA7Ci0gIGQtPmNhbGxfbGVuID0gMDsKLSAgZC0+c2tpcCA9IDA7Ci0gIHJldHVybiBkOwotfQotCi1ib29sIHVwYl9wYmRlY29kZXJfZW5kKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfcGJkZWNvZGVyICpkID0gY2xvc3VyZTsKLSAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kID0gaGFuZGxlcl9kYXRhOwotICB1aW50NjRfdCBlbmQ7Ci0gIGNoYXIgZHVtbXk7Ci0KLSAgaWYgKGQtPnJlc2lkdWFsX2VuZCA+IGQtPnJlc2lkdWFsKSB7Ci0gICAgc2V0ZXJyKGQsICJVbmV4cGVjdGVkIEVPRjogZGVjb2RlciBzdGlsbCBoYXMgYnVmZmVyZWQgdW5wYXJzZWQgZGF0YSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChkLT5za2lwKSB7Ci0gICAgc2V0ZXJyKGQsICJVbmV4cGVjdGVkIEVPRiBpbnNpZGUgc2tpcHBlZCBkYXRhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGQtPnRvcC0+ZW5kX29mcyAhPSBVSU5UNjRfTUFYKSB7Ci0gICAgc2V0ZXJyKGQsICJVbmV4cGVjdGVkIEVPRiBpbnNpZGUgZGVsaW1pdGVkIHN0cmluZyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIFRoZSB1c2VyJ3MgZW5kKCkgY2FsbCBpbmRpY2F0ZXMgdGhhdCB0aGUgbWVzc2FnZSBlbmRzIGhlcmUuICovCi0gIGVuZCA9IG9mZnNldChkKTsKLSAgZC0+dG9wLT5lbmRfb2ZzID0gZW5kOwotCi0jaWZkZWYgVVBCX1VTRV9KSVRfWDY0Ci0gIGlmIChtZXRob2QtPmlzX25hdGl2ZV8pIHsKLSAgICBjb25zdCBtZ3JvdXAgKmdyb3VwID0gKGNvbnN0IG1ncm91cCopbWV0aG9kLT5ncm91cDsKLSAgICBpZiAoZC0+dG9wICE9IGQtPnN0YWNrKQotICAgICAgZC0+c3RhY2stPmVuZF9vZnMgPSAwOwotICAgIGdyb3VwLT5qaXRfY29kZShjbG9zdXJlLCBtZXRob2QtPmNvZGVfYmFzZS5wdHIsICZkdW1teSwgMCwgTlVMTCk7Ci0gIH0gZWxzZQotI2VuZGlmCi0gIHsKLSAgICBjb25zdCB1aW50MzJfdCAqcCA9IGQtPnBjOwotICAgIGQtPnN0YWNrLT5lbmRfb2ZzID0gZW5kOwotICAgIC8qIENoZWNrIHRoZSBwcmV2aW91cyBieXRlY29kZSwgYnV0IGd1YXJkIGFnYWluc3QgYmVnaW5uaW5nLiAqLwotICAgIGlmIChwICE9IG1ldGhvZC0+Y29kZV9iYXNlLnB0cikgcC0tOwotICAgIGlmIChnZXRvcCgqcCkgPT0gT1BfQ0hFQ0tERUxJTSkgewotICAgICAgLyogUmV3aW5kIGZyb20gT1BfVEFHKiB0byBPUF9DSEVDS0RFTElNLiAqLwotICAgICAgYXNzZXJ0KGdldG9wKCpkLT5wYykgPT0gT1BfVEFHMSB8fAotICAgICAgICAgICAgIGdldG9wKCpkLT5wYykgPT0gT1BfVEFHMiB8fAotICAgICAgICAgICAgIGdldG9wKCpkLT5wYykgPT0gT1BfVEFHTiB8fAotICAgICAgICAgICAgIGdldG9wKCpkLT5wYykgPT0gT1BfRElTUEFUQ0gpOwotICAgICAgZC0+cGMgPSBwOwotICAgIH0KLSAgICB1cGJfcGJkZWNvZGVyX2RlY29kZShjbG9zdXJlLCBoYW5kbGVyX2RhdGEsICZkdW1teSwgMCwgTlVMTCk7Ci0gIH0KLQotICBpZiAoZC0+Y2FsbF9sZW4gIT0gMCkgewotICAgIHNldGVycihkLCAiVW5leHBlY3RlZCBFT0YgaW5zaWRlIHN1Ym1lc3NhZ2Ugb3IgZ3JvdXAiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc2l6ZV90IHVwYl9wYmRlY29kZXJfZGVjb2RlKHZvaWQgKmRlY29kZXIsIGNvbnN0IHZvaWQgKmdyb3VwLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICBpbnQzMl90IHJlc3VsdCA9IHVwYl9wYmRlY29kZXJfcmVzdW1lKGRlY29kZXIsIE5VTEwsIGJ1Ziwgc2l6ZSwgaGFuZGxlKTsKLQotICBpZiAocmVzdWx0ID09IERFQ09ERV9FTkRHUk9VUCkgZ290b19lbmRtc2coZGVjb2Rlcik7Ci0gIENIRUNLX1JFVFVSTihyZXN1bHQpOwotCi0gIHJldHVybiBydW5fZGVjb2Rlcl92bShkZWNvZGVyLCBncm91cCwgaGFuZGxlKTsKLX0KLQotCi0vKiBQdWJsaWMgQVBJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHVwYl9wYmRlY29kZXJfcmVzZXQodXBiX3BiZGVjb2RlciAqZCkgewotICBkLT50b3AgPSBkLT5zdGFjazsKLSAgZC0+dG9wLT5ncm91cG51bSA9IDA7Ci0gIGQtPnB0ciA9IGQtPnJlc2lkdWFsOwotICBkLT5idWYgPSBkLT5yZXNpZHVhbDsKLSAgZC0+ZW5kID0gZC0+cmVzaWR1YWw7Ci0gIGQtPnJlc2lkdWFsX2VuZCA9IGQtPnJlc2lkdWFsOwotfQotCi11cGJfcGJkZWNvZGVyICp1cGJfcGJkZWNvZGVyX2NyZWF0ZSh1cGJfZW52ICplLCBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NpbmsgKnNpbmspIHsKLSAgY29uc3Qgc2l6ZV90IGRlZmF1bHRfbWF4X25lc3RpbmcgPSA2NDsKLSNpZm5kZWYgTkRFQlVHCi0gIHNpemVfdCBzaXplX2JlZm9yZSA9IHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQoZSk7Ci0jZW5kaWYKLQotICB1cGJfcGJkZWNvZGVyICpkID0gdXBiX2Vudl9tYWxsb2MoZSwgc2l6ZW9mKHVwYl9wYmRlY29kZXIpKTsKLSAgaWYgKCFkKSByZXR1cm4gTlVMTDsKLQotICBkLT5tZXRob2RfID0gbTsKLSAgZC0+Y2FsbHN0YWNrID0gdXBiX2Vudl9tYWxsb2MoZSwgY2FsbHN0YWNrc2l6ZShkLCBkZWZhdWx0X21heF9uZXN0aW5nKSk7Ci0gIGQtPnN0YWNrID0gdXBiX2Vudl9tYWxsb2MoZSwgc3RhY2tzaXplKGQsIGRlZmF1bHRfbWF4X25lc3RpbmcpKTsKLSAgaWYgKCFkLT5zdGFjayB8fCAhZC0+Y2FsbHN0YWNrKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBkLT5lbnYgPSBlOwotICBkLT5saW1pdCA9IGQtPnN0YWNrICsgZGVmYXVsdF9tYXhfbmVzdGluZyAtIDE7Ci0gIGQtPnN0YWNrX3NpemUgPSBkZWZhdWx0X21heF9uZXN0aW5nOwotCi0gIHVwYl9wYmRlY29kZXJfcmVzZXQoZCk7Ci0gIHVwYl9ieXRlc3NpbmtfcmVzZXQoJmQtPmlucHV0XywgJm0tPmlucHV0X2hhbmRsZXJfLCBkKTsKLQotICBhc3NlcnQoc2luayk7Ci0gIGlmIChkLT5tZXRob2RfLT5kZXN0X2hhbmRsZXJzXykgewotICAgIGlmIChzaW5rLT5oYW5kbGVycyAhPSBkLT5tZXRob2RfLT5kZXN0X2hhbmRsZXJzXykKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHVwYl9zaW5rX3Jlc2V0KCZkLT50b3AtPnNpbmssIHNpbmstPmhhbmRsZXJzLCBzaW5rLT5jbG9zdXJlKTsKLQotICAvKiBJZiB0aGlzIGZhaWxzLCBpbmNyZWFzZSB0aGUgdmFsdWUgaW4gZGVjb2Rlci5oLiAqLwotICBhc3NlcnQodXBiX2Vudl9ieXRlc2FsbG9jYXRlZChlKSAtIHNpemVfYmVmb3JlIDw9IFVQQl9QQl9ERUNPREVSX1NJWkUpOwotICByZXR1cm4gZDsKLX0KLQotdWludDY0X3QgdXBiX3BiZGVjb2Rlcl9ieXRlc3BhcnNlZChjb25zdCB1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHJldHVybiBvZmZzZXQoZCk7Ci19Ci0KLWNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKnVwYl9wYmRlY29kZXJfbWV0aG9kKGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgcmV0dXJuIGQtPm1ldGhvZF87Ci19Ci0KLXVwYl9ieXRlc3NpbmsgKnVwYl9wYmRlY29kZXJfaW5wdXQodXBiX3BiZGVjb2RlciAqZCkgewotICByZXR1cm4gJmQtPmlucHV0XzsKLX0KLQotc2l6ZV90IHVwYl9wYmRlY29kZXJfbWF4bmVzdGluZyhjb25zdCB1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHJldHVybiBkLT5zdGFja19zaXplOwotfQotCi1ib29sIHVwYl9wYmRlY29kZXJfc2V0bWF4bmVzdGluZyh1cGJfcGJkZWNvZGVyICpkLCBzaXplX3QgbWF4KSB7Ci0gIGFzc2VydChkLT50b3AgPj0gZC0+c3RhY2spOwotCi0gIGlmIChtYXggPCAoc2l6ZV90KShkLT50b3AgLSBkLT5zdGFjaykpIHsKLSAgICAvKiBDYW4ndCBzZXQgYSBsaW1pdCBzbWFsbGVyIHRoYW4gd2hhdCB3ZSBhcmUgY3VycmVudGx5IGF0LiAqLwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChtYXggPiBkLT5zdGFja19zaXplKSB7Ci0gICAgLyogTmVlZCB0byByZWFsbG9jYXRlIHN0YWNrIGFuZCBjYWxsc3RhY2sgdG8gYWNjb21tb2RhdGUuICovCi0gICAgc2l6ZV90IG9sZF9zaXplID0gc3RhY2tzaXplKGQsIGQtPnN0YWNrX3NpemUpOwotICAgIHNpemVfdCBuZXdfc2l6ZSA9IHN0YWNrc2l6ZShkLCBtYXgpOwotICAgIHZvaWQgKnAgPSB1cGJfZW52X3JlYWxsb2MoZC0+ZW52LCBkLT5zdGFjaywgb2xkX3NpemUsIG5ld19zaXplKTsKLSAgICBpZiAoIXApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZC0+c3RhY2sgPSBwOwotCi0gICAgb2xkX3NpemUgPSBjYWxsc3RhY2tzaXplKGQsIGQtPnN0YWNrX3NpemUpOwotICAgIG5ld19zaXplID0gY2FsbHN0YWNrc2l6ZShkLCBtYXgpOwotICAgIHAgPSB1cGJfZW52X3JlYWxsb2MoZC0+ZW52LCBkLT5jYWxsc3RhY2ssIG9sZF9zaXplLCBuZXdfc2l6ZSk7Ci0gICAgaWYgKCFwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGQtPmNhbGxzdGFjayA9IHA7Ci0KLSAgICBkLT5zdGFja19zaXplID0gbWF4OwotICB9Ci0KLSAgZC0+bGltaXQgPSBkLT5zdGFjayArIG1heCAtIDE7Ci0gIHJldHVybiB0cnVlOwotfQotLyoKLSoqIHVwYjo6RW5jb2RlcgotKioKLSoqIFNpbmNlIHdlIGFyZSBpbXBsZW1lbnRpbmcgcHVyZSBoYW5kbGVycyAoaWUuIHdpdGhvdXQgYW55IG91dC1vZi1iYW5kIGFjY2VzcwotKiogdG8gcHJlLWNvbXB1dGVkIGxlbmd0aHMpLCB3ZSBoYXZlIHRvIGJ1ZmZlciBhbGwgc3VibWVzc2FnZXMgYmVmb3JlIHdlIGNhbgotKiogZW1pdCBldmVuIHRoZWlyIGZpcnN0IGJ5dGUuCi0qKgotKiogTm90IGtub3dpbmcgdGhlIHNpemUgb2Ygc3VibWVzc2FnZXMgYWxzbyBtZWFucyB3ZSBjYW4ndCB3cml0ZSBhIHBlcmZlY3QKLSoqIHplcm8tY29weSBpbXBsZW1lbnRhdGlvbiwgZXZlbiB3aXRoIGJ1ZmZlcmluZy4gIExlbmd0aHMgYXJlIHN0b3JlZCBhcwotKiogdmFyaW50cywgd2hpY2ggbWVhbnMgdGhhdCB3ZSBkb24ndCBrbm93IGhvdyBtYW55IGJ5dGVzIHRvIHJlc2VydmUgZm9yIHRoZQotKiogbGVuZ3RoIHVudGlsIHdlIGtub3cgd2hhdCB0aGUgbGVuZ3RoIGlzLgotKioKLSoqIFRoaXMgbGVhdmVzIHVzIHdpdGggdGhyZWUgbWFpbiBjaG9pY2VzOgotKioKLSoqIDEuIGJ1ZmZlciBhbGwgc3VibWVzc2FnZSBkYXRhIGluIGEgdGVtcG9yYXJ5IGJ1ZmZlciwgdGhlbiBjb3B5IGl0IGV4YWN0bHkKLSoqICAgIG9uY2UgaW50byB0aGUgb3V0cHV0IGJ1ZmZlci4KLSoqCi0qKiAyLiBhdHRlbXB0IHRvIGJ1ZmZlciBkYXRhIGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCBidWZmZXIsIGVzdGltYXRpbmcgaG93Ci0qKiAgICBtYW55IGJ5dGVzIGVhY2ggbGVuZ3RoIHdpbGwgdGFrZS4gIFdoZW4gb3VyIGd1ZXNzZXMgYXJlIHdyb25nLCB1c2UKLSoqICAgIG1lbW1vdmUoKSB0byBncm93IG9yIHNocmluayB0aGUgYWxsb3R0ZWQgc3BhY2UuCi0qKgotKiogMy4gYnVmZmVyIGRpcmVjdGx5IGludG8gdGhlIG91dHB1dCBidWZmZXIsIGFsbG9jYXRpbmcgYSBtYXggbGVuZ3RoCi0qKiAgICBhaGVhZC1vZi10aW1lIGZvciBlYWNoIHN1Ym1lc3NhZ2UgbGVuZ3RoLiAgSWYgd2Ugb3ZlcmFsbG9jYXRlZCwgd2Ugd2FzdGUKLSoqICAgIHNwYWNlLCBidXQgbm8gbWVtY3B5KCkgb3IgbWVtbW92ZSgpIGlzIHJlcXVpcmVkLiAgVGhpcyBhcHByb2FjaCByZXF1aXJlcwotKiogICAgZGVmaW5pbmcgYSBtYXhpbXVtIHNpemUgZm9yIHN1Ym1lc3NhZ2VzIGFuZCByZWplY3Rpbmcgc3VibWVzc2FnZXMgdGhhdAotKiogICAgZXhjZWVkIHRoYXQgc2l6ZS4KLSoqCi0qKiAoMikgYW5kICgzKSBoYXZlIHRoZSBwb3RlbnRpYWwgdG8gaGF2ZSBiZXR0ZXIgcGVyZm9ybWFuY2UsIGJ1dCB0aGV5IGFyZSBtb3JlCi0qKiBjb21wbGljYXRlZCBhbmQgc3VidGxlIHRvIGltcGxlbWVudDoKLSoqCi0qKiAgICgzKSByZXF1aXJlcyBtYWtpbmcgYW4gYXJiaXRyYXJ5IGNob2ljZSBvZiB0aGUgbWF4aW11bSBtZXNzYWdlIHNpemU7IGl0Ci0qKiAgICAgICB3YXN0ZXMgc3BhY2Ugd2hlbiBzdWJtZXNzYWdlcyBhcmUgc2hvcnRlciB0aGFuIHRoaXMgYW5kIGZhaWxzCi0qKiAgICAgICBjb21wbGV0ZWx5IHdoZW4gdGhleSBhcmUgbG9uZ2VyLiAgVGhpcyBtYWtlcyBpdCBtb3JlIGZpbmlja3kgYW5kCi0qKiAgICAgICByZXF1aXJlcyBjb25maWd1cmF0aW9uIGJhc2VkIG9uIHRoZSBpbnB1dC4gIEl0IGFsc28gbWFrZXMgaXQgaW1wb3NzaWJsZQotKiogICAgICAgdG8gcGVyZmVjdGx5IG1hdGNoIHRoZSBvdXRwdXQgb2YgcmVmZXJlbmNlIGVuY29kZXJzIHRoYXQgYWx3YXlzIHVzZSB0aGUKLSoqICAgICAgIG9wdGltYWwgYW1vdW50IG9mIHNwYWNlIGZvciBlYWNoIGxlbmd0aC4KLSoqCi0qKiAgICgyKSByZXF1aXJlcyBndWVzc2luZyB0aGUgdGhlIHNpemUgdXBmcm9udCwgYW5kIGlmIG11bHRpcGxlIGxlbmd0aHMgYXJlCi0qKiAgICAgICBndWVzc2VkIHdyb25nIHRoZSBtaW5pbXVtIHJlcXVpcmVkIG51bWJlciBvZiBtZW1tb3ZlKCkgb3BlcmF0aW9ucyBtYXkKLSoqICAgICAgIGJlIGNvbXBsaWNhdGVkIHRvIGNvbXB1dGUgY29ycmVjdGx5LiAgSW1wbGVtZW50ZWQgcHJvcGVybHksIGl0IG1heSBoYXZlCi0qKiAgICAgICBhIHVzZWZ1bCBhbW9ydGl6ZWQgb3IgYXZlcmFnZSBjb3N0LCBidXQgbW9yZSBpbnZlc3RpZ2F0aW9uIGlzIHJlcXVpcmVkCi0qKiAgICAgICB0byBkZXRlcm1pbmUgdGhpcyBhbmQgd2hhdCB0aGUgb3B0aW1hbCBhbGdvcml0aG0gaXMgdG8gYWNoaWV2ZSBpdC4KLSoqCi0qKiAgICgxKSBtYWtlcyB5b3UgYWx3YXlzIHBheSBmb3IgZXhhY3RseSBvbmUgY29weSwgYnV0IGl0cyBpbXBsZW1lbnRhdGlvbiBpcwotKiogICAgICAgdGhlIHNpbXBsZXN0IGFuZCBpdHMgcGVyZm9ybWFuY2UgaXMgcHJlZGljdGFibGUuCi0qKgotKiogU28gZm9yIG5vdywgd2UgaW1wbGVtZW50ICgxKSBvbmx5LiAgSWYgd2Ugd2lzaCB0byBvcHRpbWl6ZSBsYXRlciwgd2Ugc2hvdWxkCi0qKiBiZSBhYmxlIHRvIGRvIGl0IHdpdGhvdXQgYWZmZWN0aW5nIHVzZXJzLgotKioKLSoqIFRoZSBzdHJhdGVneSBpcyB0byBidWZmZXIgdGhlIHNlZ21lbnRzIG9mIGRhdGEgdGhhdCBkbyAqbm90KiBkZXBlbmQgb24KLSoqIHVua25vd24gbGVuZ3RocyBpbiBvbmUgYnVmZmVyLCBhbmQga2VlcCBhIHNlcGFyYXRlIGJ1ZmZlciBvZiBzZWdtZW50IHBvaW50ZXJzCi0qKiBhbmQgbGVuZ3Rocy4gIFdoZW4gdGhlIHRvcC1sZXZlbCBzdWJtZXNzYWdlIGVuZHMsIHdlIGNhbiBnbyBiZWdpbm5pbmcgdG8gZW5kLAotKiogYWx0ZXJuYXRpbmcgdGhlIHdyaXRpbmcgb2YgbGVuZ3RocyB3aXRoIG1lbWNweSgpIG9mIHRoZSByZXN0IG9mIHRoZSBkYXRhLgotKiogQXQgdGhlIHRvcCBsZXZlbCB0aG91Z2gsIG5vIGJ1ZmZlcmluZyBpcyByZXF1aXJlZC4KLSovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotCi0vKiBUaGUgb3V0cHV0IGJ1ZmZlciBpcyBkaXZpZGVkIGludG8gc2VnbWVudHM7IGEgc2VnbWVudCBpcyBhIHN0cmluZyBvZiBkYXRhCi0gKiB0aGF0IGlzICJyZWFkeSB0byBnbyIgLS0gaXQgZG9lcyBub3QgbmVlZCBhbnkgdmFyaW50IGxlbmd0aHMgaW5zZXJ0ZWQgaW50bwotICogdGhlIG1pZGRsZS4gIFRoZSBzZWFtcyBiZXR3ZWVuIHNlZ21lbnRzIGFyZSB3aGVyZSB2YXJpbnRzIHdpbGwgYmUgaW5zZXJ0ZWQKLSAqIG9uY2UgdGhleSBhcmUga25vd24uCi0gKgotICogV2UgYWxzbyB1c2UgdGhlIGNvbmNlcHQgb2YgYSAicnVuIiwgd2hpY2ggaXMgYSByYW5nZSBvZiBlbmNvZGVkIGJ5dGVzIHRoYXQKLSAqIG9jY3VyIGF0IGEgc2luZ2xlIHN1Ym1lc3NhZ2UgbGV2ZWwuICBFdmVyeSBzZWdtZW50IGNvbnRhaW5zIG9uZSBvciBtb3JlIHJ1bnMuCi0gKgotICogQSBzZWdtZW50IGNhbiBzcGFuIG1lc3NhZ2VzLiAgQ29uc2lkZXI6Ci0gKgotICogICAgICAgICAgICAgICAgICAuLS1TdWJtZXNzYWdlIGxlbmd0aHMtLS0tLS0tLS0uCi0gKiAgICAgICAgICAgICAgICAgIHwgICAgICAgfCAgICAgICAgICAgICAgICAgICAgIHwKLSAqICAgICAgICAgICAgICAgICAgfCAgICAgICBWICAgICAgICAgICAgICAgICAgICAgVgotICogICAgICAgICAgICAgICAgICBWICAgICAgfCB8LS0tLS0tLS0tLS0tLS0tICAgIHwgfC0tLS0tLS0tLS0tLS0tLS0tCi0gKiBTdWJtZXNzYWdlczogICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIFRvcC1sZXZlbCBtc2c6IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICoKLSAqIFNlZ21lbnRzOiAgICAgICAgICAtLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tLS0gICAtLS0tLS0tLS0tLS0tLS0tLQotICogUnVuczogICAgICAgICAgICAgICotLS0tICAgKi0tLS0tLS0tLS0tLS0tKi0tLSAgICotLS0tLS0tLS0tLS0tLS0tCi0gKiAoKiBtYXJrcyB0aGUgc3RhcnQpCi0gKgotICogTm90ZSB0aGF0IHRoZSB0b3AtbGV2ZWwgbWVuc3NhZ2UgaXMgbm90IGluIGFueSBzZWdtZW50IGJlY2F1c2UgaXQgZG9lcyBub3QKLSAqIGhhdmUgYW55IGxlbmd0aCBwcmVjZWRpbmcgaXQuCi0gKgotICogQSBzZWdtZW50IGlzIG9ubHkgaW50ZXJydXB0ZWQgd2hlbiBhbm90aGVyIGxlbmd0aCBuZWVkcyB0byBiZSBpbnNlcnRlZC4gIFNvCi0gKiBvYnNlcnZlIGhvdyB0aGUgc2Vjb25kIHNlZ21lbnQgc3BhbnMgYm90aCB0aGUgaW5uZXIgc3VibWVzc2FnZSBhbmQgcGFydCBvZgotICogdGhlIG5leHQgZW5jbG9zaW5nIG1lc3NhZ2UuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQzMl90IG1zZ2xlbjsgIC8qIFRoZSBsZW5ndGggdG8gdmFyaW50LWVuY29kZSBiZWZvcmUgdGhpcyBzZWdtZW50LiAqLwotICB1aW50MzJfdCBzZWdsZW47ICAvKiBMZW5ndGggb2YgdGhlIHNlZ21lbnQuICovCi19IHVwYl9wYl9lbmNvZGVyX3NlZ21lbnQ7Ci0KLXN0cnVjdCB1cGJfcGJfZW5jb2RlciB7Ci0gIHVwYl9lbnYgKmVudjsKLQotICAvKiBPdXIgaW5wdXQgYW5kIG91dHB1dC4gKi8KLSAgdXBiX3NpbmsgaW5wdXRfOwotICB1cGJfYnl0ZXNzaW5rICpvdXRwdXRfOwotCi0gIC8qIFRoZSAic3ViY2xvc3VyZSIgLS0gdXNlZCBhcyB0aGUgaW5uZXIgY2xvc3VyZSBhcyBwYXJ0IG9mIHRoZSBieXRlc3NpbmsKLSAgICogcHJvdG9jb2wuICovCi0gIHZvaWQgKnN1YmM7Ci0KLSAgLyogVGhlIG91dHB1dCBidWZmZXIgYW5kIGxpbWl0LCBhbmQgb3VyIGN1cnJlbnQgd3JpdGUgcG9zaXRpb24uICAiYnVmIgotICAgKiBpbml0aWFsbHkgcG9pbnRzIHRvICJpbml0YnVmIiwgYnV0IGlzIGR5bmFtaWNhbGx5IGFsbG9jYXRlZCBpZiB3ZSBuZWVkIHRvCi0gICAqIGdyb3cgYmV5b25kIHRoZSBpbml0aWFsIHNpemUuICovCi0gIGNoYXIgKmJ1ZiwgKnB0ciwgKmxpbWl0OwotCi0gIC8qIFRoZSBiZWdpbm5pbmcgb2YgdGhlIGN1cnJlbnQgcnVuLCBvciB1bmRlZmluZWQgaWYgd2UgYXJlIGF0IHRoZSB0b3AKLSAgICogbGV2ZWwuICovCi0gIGNoYXIgKnJ1bmJlZ2luOwotCi0gIC8qIFRoZSBsaXN0IG9mIHNlZ21lbnRzIHdlIGFyZSBhY2N1bXVsYXRpbmcuICovCi0gIHVwYl9wYl9lbmNvZGVyX3NlZ21lbnQgKnNlZ2J1ZiwgKnNlZ3B0ciwgKnNlZ2xpbWl0OwotCi0gIC8qIFRoZSBzdGFjayBvZiBlbmNsb3Npbmcgc3VibWVzc2FnZXMuICBFYWNoIGVudHJ5IGluIHRoZSBzdGFjayBwb2ludHMgdG8gdGhlCi0gICAqIHNlZ21lbnQgd2hlcmUgdGhpcyBzdWJtZXNzYWdlJ3MgbGVuZ3RoIGlzIGJlaW5nIGFjY3VtdWxhdGVkLiAqLwotICBpbnQgKnN0YWNrLCAqdG9wLCAqc3RhY2tsaW1pdDsKLQotICAvKiBEZXB0aCBvZiBzdGFydG1zZy9lbmRtc2cgY2FsbHMuICovCi0gIGludCBkZXB0aDsKLX07Ci0KLS8qIGxvdy1sZXZlbCBidWZmZXJpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIExvdy1sZXZlbCBmdW5jdGlvbnMgZm9yIGludGVyYWN0aW5nIHdpdGggdGhlIG91dHB1dCBidWZmZXIuICovCi0KLS8qIFRPRE8oaGFiZXJtYW4pOiBoYW5kbGUgcHVzaGJhY2sgKi8KLXN0YXRpYyB2b2lkIHB1dGJ1Zih1cGJfcGJfZW5jb2RlciAqZSwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKSB7Ci0gIHNpemVfdCBuID0gdXBiX2J5dGVzc2lua19wdXRidWYoZS0+b3V0cHV0XywgZS0+c3ViYywgYnVmLCBsZW4sIE5VTEwpOwotICBVUEJfQVNTRVJUX1ZBUihuLCBuID09IGxlbik7Ci19Ci0KLXN0YXRpYyB1cGJfcGJfZW5jb2Rlcl9zZWdtZW50ICp0b3AodXBiX3BiX2VuY29kZXIgKmUpIHsKLSAgcmV0dXJuICZlLT5zZWdidWZbKmUtPnRvcF07Ci19Ci0KLS8qIENhbGwgdG8gZW5zdXJlIHRoYXQgYXQgbGVhc3QgImJ5dGVzIiBieXRlcyBhcmUgYXZhaWxhYmxlIGZvciB3cml0aW5nIGF0Ci0gKiBlLT5wdHIuICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBieXRlcyBjb3VsZCBub3QgYmUgYWxsb2NhdGVkLiAqLwotc3RhdGljIGJvb2wgcmVzZXJ2ZSh1cGJfcGJfZW5jb2RlciAqZSwgc2l6ZV90IGJ5dGVzKSB7Ci0gIGlmICgoc2l6ZV90KShlLT5saW1pdCAtIGUtPnB0cikgPCBieXRlcykgewotICAgIC8qIEdyb3cgYnVmZmVyLiAqLwotICAgIGNoYXIgKm5ld19idWY7Ci0gICAgc2l6ZV90IG5lZWRlZCA9IGJ5dGVzICsgKGUtPnB0ciAtIGUtPmJ1Zik7Ci0gICAgc2l6ZV90IG9sZF9zaXplID0gZS0+bGltaXQgLSBlLT5idWY7Ci0KLSAgICBzaXplX3QgbmV3X3NpemUgPSBvbGRfc2l6ZTsKLQotICAgIHdoaWxlIChuZXdfc2l6ZSA8IG5lZWRlZCkgewotICAgICAgbmV3X3NpemUgKj0gMjsKLSAgICB9Ci0KLSAgICBuZXdfYnVmID0gdXBiX2Vudl9yZWFsbG9jKGUtPmVudiwgZS0+YnVmLCBvbGRfc2l6ZSwgbmV3X3NpemUpOwotCi0gICAgaWYgKG5ld19idWYgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGUtPnB0ciA9IG5ld19idWYgKyAoZS0+cHRyIC0gZS0+YnVmKTsKLSAgICBlLT5ydW5iZWdpbiA9IG5ld19idWYgKyAoZS0+cnVuYmVnaW4gLSBlLT5idWYpOwotICAgIGUtPmxpbWl0ID0gbmV3X2J1ZiArIG5ld19zaXplOwotICAgIGUtPmJ1ZiA9IG5ld19idWY7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbCB3aGVuICJieXRlcyIgYnl0ZXMgaGF2ZSBiZWVuIHdyaXR0ZSBhdCBlLT5wdHIuICBUaGUgY2FsbGVyICptdXN0KiBoYXZlCi0gKiBwcmV2aW91c2x5IGNhbGxlZCByZXNlcnZlKCkgd2l0aCBhdCBsZWFzdCB0aGlzIG1hbnkgYnl0ZXMuICovCi1zdGF0aWMgdm9pZCBlbmNvZGVyX2FkdmFuY2UodXBiX3BiX2VuY29kZXIgKmUsIHNpemVfdCBieXRlcykgewotICBhc3NlcnQoKHNpemVfdCkoZS0+bGltaXQgLSBlLT5wdHIpID49IGJ5dGVzKTsKLSAgZS0+cHRyICs9IGJ5dGVzOwotfQotCi0vKiBDYWxsIHdoZW4gYWxsIG9mIHRoZSBieXRlcyBmb3IgYSBoYW5kbGVyIGhhdmUgYmVlbiB3cml0dGVuLiAgRmx1c2hlcyB0aGUKLSAqIGJ5dGVzIGlmIHBvc3NpYmxlIGFuZCBuZWNlc3NhcnksIHJldHVybmluZyBmYWxzZSBpZiB0aGlzIGZhaWxlZC4gKi8KLXN0YXRpYyBib29sIGNvbW1pdCh1cGJfcGJfZW5jb2RlciAqZSkgewotICBpZiAoIWUtPnRvcCkgewotICAgIC8qIFdlIGFyZW4ndCBpbnNpZGUgYSBkZWxpbWl0ZWQgcmVnaW9uLiAgRmx1c2ggb3VyIGFjY3VtdWxhdGVkIGJ5dGVzIHRvCi0gICAgICogdGhlIG91dHB1dC4KLSAgICAgKgotICAgICAqIFRPRE8oaGFiZXJtYW4pOiBpbiB0aGUgZnV0dXJlIHdlIG1heSB3YW50IHRvIGRlbGF5IGZsdXNoaW5nIGZvcgotICAgICAqIGVmZmljaWVuY3kgcmVhc29ucy4gKi8KLSAgICBwdXRidWYoZSwgZS0+YnVmLCBlLT5wdHIgLSBlLT5idWYpOwotICAgIGUtPnB0ciA9IGUtPmJ1ZjsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBXcml0ZXMgdGhlIGdpdmVuIGJ5dGVzIHRvIHRoZSBidWZmZXIsIGhhbmRsaW5nIHJlc2VydmUvYWR2YW5jZS4gKi8KLXN0YXRpYyBib29sIGVuY29kZV9ieXRlcyh1cGJfcGJfZW5jb2RlciAqZSwgY29uc3Qgdm9pZCAqZGF0YSwgc2l6ZV90IGxlbikgewotICBpZiAoIXJlc2VydmUoZSwgbGVuKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1lbWNweShlLT5wdHIsIGRhdGEsIGxlbik7Ci0gIGVuY29kZXJfYWR2YW5jZShlLCBsZW4pOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRmluaXNoIHRoZSBjdXJyZW50IHJ1biBieSBhZGRpbmcgdGhlIHJ1biB0b3RhbHMgdG8gdGhlIHNlZ21lbnQgYW5kIG1lc3NhZ2UKLSAqIGxlbmd0aC4gKi8KLXN0YXRpYyB2b2lkIGFjY3VtdWxhdGUodXBiX3BiX2VuY29kZXIgKmUpIHsKLSAgc2l6ZV90IHJ1bl9sZW47Ci0gIGFzc2VydChlLT5wdHIgPj0gZS0+cnVuYmVnaW4pOwotICBydW5fbGVuID0gZS0+cHRyIC0gZS0+cnVuYmVnaW47Ci0gIGUtPnNlZ3B0ci0+c2VnbGVuICs9IHJ1bl9sZW47Ci0gIHRvcChlKS0+bXNnbGVuICs9IHJ1bl9sZW47Ci0gIGUtPnJ1bmJlZ2luID0gZS0+cHRyOwotfQotCi0vKiBDYWxsIHRvIGluZGljYXRlIHRoZSBzdGFydCBvZiBkZWxpbWl0ZWQgcmVnaW9uIGZvciB3aGljaCB0aGUgZnVsbCBsZW5ndGggaXMKLSAqIG5vdCB5ZXQga25vd24uICBBbGwgZGF0YSB3aWxsIGJlIGJ1ZmZlcmVkIHVudGlsIHRoZSBsZW5ndGggaXMga25vd24uCi0gKiBEZWxpbWl0ZWQgcmVnaW9ucyBtYXkgYmUgbmVzdGVkOyB0aGVpciBsZW5ndGhzIHdpbGwgYWxsIGJlIHRyYWNrZWQgcHJvcGVybHkuICovCi1zdGF0aWMgYm9vbCBzdGFydF9kZWxpbSh1cGJfcGJfZW5jb2RlciAqZSkgewotICBpZiAoZS0+dG9wKSB7Ci0gICAgLyogV2UgYXJlIGFscmVhZHkgYnVmZmVyaW5nLCBhZHZhbmNlIHRvIHRoZSBuZXh0IHNlZ21lbnQgYW5kIHB1c2ggaXQgb24gdGhlCi0gICAgICogc3RhY2suICovCi0gICAgYWNjdW11bGF0ZShlKTsKLQotICAgIGlmICgrK2UtPnRvcCA9PSBlLT5zdGFja2xpbWl0KSB7Ci0gICAgICAvKiBUT0RPKGhhYmVybWFuKTogZ3JvdyBzdGFjaz8gKi8KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoKytlLT5zZWdwdHIgPT0gZS0+c2VnbGltaXQpIHsKLSAgICAgIC8qIEdyb3cgc2VnbWVudCBidWZmZXIuICovCi0gICAgICBzaXplX3Qgb2xkX3NpemUgPQotICAgICAgICAgIChlLT5zZWdsaW1pdCAtIGUtPnNlZ2J1ZikgKiBzaXplb2YodXBiX3BiX2VuY29kZXJfc2VnbWVudCk7Ci0gICAgICBzaXplX3QgbmV3X3NpemUgPSBvbGRfc2l6ZSAqIDI7Ci0gICAgICB1cGJfcGJfZW5jb2Rlcl9zZWdtZW50ICpuZXdfYnVmID0KLSAgICAgICAgICB1cGJfZW52X3JlYWxsb2MoZS0+ZW52LCBlLT5zZWdidWYsIG9sZF9zaXplLCBuZXdfc2l6ZSk7Ci0KLSAgICAgIGlmIChuZXdfYnVmID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBlLT5zZWdwdHIgPSBuZXdfYnVmICsgKGUtPnNlZ3B0ciAtIGUtPnNlZ2J1Zik7Ci0gICAgICBlLT5zZWdsaW1pdCA9IG5ld19idWYgKyAobmV3X3NpemUgLyBzaXplb2YodXBiX3BiX2VuY29kZXJfc2VnbWVudCkpOwotICAgICAgZS0+c2VnYnVmID0gbmV3X2J1ZjsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLyogV2Ugd2VyZSBwcmV2aW91c2x5IGF0IHRoZSB0b3AgbGV2ZWwsIHN0YXJ0IGJ1ZmZlcmluZy4gKi8KLSAgICBlLT5zZWdwdHIgPSBlLT5zZWdidWY7Ci0gICAgZS0+dG9wID0gZS0+c3RhY2s7Ci0gICAgZS0+cnVuYmVnaW4gPSBlLT5wdHI7Ci0gIH0KLQotICAqZS0+dG9wID0gZS0+c2VncHRyIC0gZS0+c2VnYnVmOwotICBlLT5zZWdwdHItPnNlZ2xlbiA9IDA7Ci0gIGUtPnNlZ3B0ci0+bXNnbGVuID0gMDsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ2FsbCB0byBpbmRpY2F0ZSB0aGUgZW5kIG9mIGEgZGVsaW1pdGVkIHJlZ2lvbi4gIFdlIG5vdyBrbm93IHRoZSBsZW5ndGggb2YKLSAqIHRoZSBkZWxpbWl0ZWQgcmVnaW9uLiAgSWYgd2UgYXJlIG5vdCBuZXN0ZWQgaW5zaWRlIGFueSBvdGhlciBkZWxpbWl0ZWQKLSAqIHJlZ2lvbnMsIHdlIGNhbiBub3cgZW1pdCBhbGwgb2YgdGhlIGJ1ZmZlcmVkIGRhdGEgd2UgYWNjdW11bGF0ZWQuICovCi1zdGF0aWMgYm9vbCBlbmRfZGVsaW0odXBiX3BiX2VuY29kZXIgKmUpIHsKLSAgc2l6ZV90IG1zZ2xlbjsKLSAgYWNjdW11bGF0ZShlKTsKLSAgbXNnbGVuID0gdG9wKGUpLT5tc2dsZW47Ci0KLSAgaWYgKGUtPnRvcCA9PSBlLT5zdGFjaykgewotICAgIC8qIEFsbCBsZW5ndGhzIGFyZSBub3cgYXZhaWxhYmxlLCBlbWl0IGFsbCBidWZmZXJlZCBkYXRhLiAqLwotICAgIGNoYXIgYnVmW1VQQl9QQl9WQVJJTlRfTUFYX0xFTl07Ci0gICAgdXBiX3BiX2VuY29kZXJfc2VnbWVudCAqczsKLSAgICBjb25zdCBjaGFyICpwdHIgPSBlLT5idWY7Ci0gICAgZm9yIChzID0gZS0+c2VnYnVmOyBzIDw9IGUtPnNlZ3B0cjsgcysrKSB7Ci0gICAgICBzaXplX3QgbGVuYnl0ZXMgPSB1cGJfdmVuY29kZTY0KHMtPm1zZ2xlbiwgYnVmKTsKLSAgICAgIHB1dGJ1ZihlLCBidWYsIGxlbmJ5dGVzKTsKLSAgICAgIHB1dGJ1ZihlLCBwdHIsIHMtPnNlZ2xlbik7Ci0gICAgICBwdHIgKz0gcy0+c2VnbGVuOwotICAgIH0KLQotICAgIGUtPnB0ciA9IGUtPmJ1ZjsKLSAgICBlLT50b3AgPSBOVUxMOwotICB9IGVsc2UgewotICAgIC8qIE5lZWQgdG8ga2VlcCBidWZmZXJpbmc7IHByb3BhZ2F0ZSBsZW5ndGggaW5mbyBpbnRvIGVuY2xvc2luZwotICAgICAqIHN1Ym1lc3NhZ2VzLiAqLwotICAgIC0tZS0+dG9wOwotICAgIHRvcChlKS0+bXNnbGVuICs9IG1zZ2xlbiArIHVwYl92YXJpbnRfc2l6ZShtc2dsZW4pOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogdGFnX3QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQSBwcmVjb21wdXRlZCAocHJlLWVuY29kZWQpIHRhZyBhbmQgbGVuZ3RoLiAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ4X3QgYnl0ZXM7Ci0gIGNoYXIgdGFnWzddOwotfSB0YWdfdDsKLQotLyogQWxsb2NhdGVzIGEgbmV3IHRhZyBmb3IgdGhpcyBmaWVsZCwgYW5kIHNldHMgaXQgaW4gdGhlc2UgaGFuZGxlcmF0dHIuICovCi1zdGF0aWMgdm9pZCBuZXdfdGFnKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLCB1cGJfd2lyZXR5cGVfdCB3dCwKLSAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIHVpbnQzMl90IG4gPSB1cGJfZmllbGRkZWZfbnVtYmVyKGYpOwotCi0gIHRhZ190ICp0YWcgPSBtYWxsb2Moc2l6ZW9mKHRhZ190KSk7Ci0gIHRhZy0+Ynl0ZXMgPSB1cGJfdmVuY29kZTY0KChuIDw8IDMpIHwgd3QsIHRhZy0+dGFnKTsKLQotICB1cGJfaGFuZGxlcmF0dHJfaW5pdChhdHRyKTsKLSAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKGF0dHIsIHRhZyk7Ci0gIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKGgsIHRhZywgZnJlZSk7Ci19Ci0KLXN0YXRpYyBib29sIGVuY29kZV90YWcodXBiX3BiX2VuY29kZXIgKmUsIGNvbnN0IHRhZ190ICp0YWcpIHsKLSAgcmV0dXJuIGVuY29kZV9ieXRlcyhlLCB0YWctPnRhZywgdGFnLT5ieXRlcyk7Ci19Ci0KLQotLyogZW5jb2Rpbmcgb2Ygd2lyZSB0eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgZW5jb2RlX2ZpeGVkNjQodXBiX3BiX2VuY29kZXIgKmUsIHVpbnQ2NF90IHZhbCkgewotICAvKiBUT0RPKGhhYmVybWFuKTogYnl0ZS1zd2FwIGZvciBiaWcgZW5kaWFuLiAqLwotICByZXR1cm4gZW5jb2RlX2J5dGVzKGUsICZ2YWwsIHNpemVvZih1aW50NjRfdCkpOwotfQotCi1zdGF0aWMgYm9vbCBlbmNvZGVfZml4ZWQzMih1cGJfcGJfZW5jb2RlciAqZSwgdWludDMyX3QgdmFsKSB7Ci0gIC8qIFRPRE8oaGFiZXJtYW4pOiBieXRlLXN3YXAgZm9yIGJpZyBlbmRpYW4uICovCi0gIHJldHVybiBlbmNvZGVfYnl0ZXMoZSwgJnZhbCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci19Ci0KLXN0YXRpYyBib29sIGVuY29kZV92YXJpbnQodXBiX3BiX2VuY29kZXIgKmUsIHVpbnQ2NF90IHZhbCkgewotICBpZiAoIXJlc2VydmUoZSwgVVBCX1BCX1ZBUklOVF9NQVhfTEVOKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGVuY29kZXJfYWR2YW5jZShlLCB1cGJfdmVuY29kZTY0KHZhbCwgZS0+cHRyKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdWludDY0X3QgZGJsMnVpbnQ2NChkb3VibGUgZCkgewotICB1aW50NjRfdCByZXQ7Ci0gIG1lbWNweSgmcmV0LCAmZCwgc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBmbHQydWludDMyKGZsb2F0IGQpIHsKLSAgdWludDMyX3QgcmV0OwotICBtZW1jcHkoJnJldCwgJmQsIHNpemVvZih1aW50MzJfdCkpOwotICByZXR1cm4gcmV0OwotfQotCi0KLS8qIGVuY29kaW5nIG9mIHByb3RvIHR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIHN0YXJ0bXNnKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9wYl9lbmNvZGVyICplID0gYzsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIGlmIChlLT5kZXB0aCsrID09IDApIHsKLSAgICB1cGJfYnl0ZXNzaW5rX3N0YXJ0KGUtPm91dHB1dF8sIDAsICZlLT5zdWJjKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZW5kbXNnKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgdXBiX3BiX2VuY29kZXIgKmUgPSBjOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChzdGF0dXMpOwotICBpZiAoLS1lLT5kZXB0aCA9PSAwKSB7Ci0gICAgdXBiX2J5dGVzc2lua19lbmQoZS0+b3V0cHV0Xyk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkICplbmNvZGVfc3RhcnRkZWxpbWZpZWxkKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIGJvb2wgb2sgPSBlbmNvZGVfdGFnKGMsIGhkKSAmJiBjb21taXQoYykgJiYgc3RhcnRfZGVsaW0oYyk7Ci0gIHJldHVybiBvayA/IGMgOiBVUEJfQlJFQUs7Ci19Ci0KLXN0YXRpYyBib29sIGVuY29kZV9lbmRkZWxpbWZpZWxkKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByZXR1cm4gZW5kX2RlbGltKGMpOwotfQotCi1zdGF0aWMgdm9pZCAqZW5jb2RlX3N0YXJ0Z3JvdXAodm9pZCAqYywgY29uc3Qgdm9pZCAqaGQpIHsKLSAgcmV0dXJuIChlbmNvZGVfdGFnKGMsIGhkKSAmJiBjb21taXQoYykpID8gYyA6IFVQQl9CUkVBSzsKLX0KLQotc3RhdGljIGJvb2wgZW5jb2RlX2VuZGdyb3VwKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHJldHVybiBlbmNvZGVfdGFnKGMsIGhkKSAmJiBjb21taXQoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkICplbmNvZGVfc3RhcnRzdHIodm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIHNpemVfdCBzaXplX2hpbnQpIHsKLSAgVVBCX1VOVVNFRChzaXplX2hpbnQpOwotICByZXR1cm4gZW5jb2RlX3N0YXJ0ZGVsaW1maWVsZChjLCBoZCk7Ci19Ci0KLXN0YXRpYyBzaXplX3QgZW5jb2RlX3N0cmJ1Zih2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGNvbnN0IHVwYl9idWZoYW5kbGUgKmgpIHsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaCk7Ci0gIHJldHVybiBlbmNvZGVfYnl0ZXMoYywgYnVmLCBsZW4pID8gbGVuIDogMDsKLX0KLQotI2RlZmluZSBUKHR5cGUsIGN0eXBlLCBjb252ZXJ0LCBlbmNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGJvb2wgZW5jb2RlX3NjYWxhcl8jI3R5cGUodm9pZCAqZSwgY29uc3Qgdm9pZCAqaGQsIGN0eXBlIHZhbCkgeyBcCi0gICAgcmV0dXJuIGVuY29kZV90YWcoZSwgaGQpICYmIGVuY29kZShlLCAoY29udmVydCkodmFsKSkgJiYgY29tbWl0KGUpOyAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGJvb2wgZW5jb2RlX3BhY2tlZF8jI3R5cGUodm9pZCAqZSwgY29uc3Qgdm9pZCAqaGQsIGN0eXBlIHZhbCkgeyBcCi0gICAgVVBCX1VOVVNFRChoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBlbmNvZGUoZSwgKGNvbnZlcnQpKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1UKGRvdWJsZSwgICBkb3VibGUsICAgZGJsMnVpbnQ2NCwgICBlbmNvZGVfZml4ZWQ2NCkKLVQoZmxvYXQsICAgIGZsb2F0LCAgICBmbHQydWludDMyLCAgIGVuY29kZV9maXhlZDMyKQotVChpbnQ2NCwgICAgaW50NjRfdCwgIHVpbnQ2NF90LCAgICAgZW5jb2RlX3ZhcmludCkKLVQoaW50MzIsICAgIGludDMyX3QsICB1aW50MzJfdCwgICAgIGVuY29kZV92YXJpbnQpCi1UKGZpeGVkNjQsICB1aW50NjRfdCwgdWludDY0X3QsICAgICBlbmNvZGVfZml4ZWQ2NCkKLVQoZml4ZWQzMiwgIHVpbnQzMl90LCB1aW50MzJfdCwgICAgIGVuY29kZV9maXhlZDMyKQotVChib29sLCAgICAgYm9vbCwgICAgIGJvb2wsICAgICAgICAgZW5jb2RlX3ZhcmludCkKLVQodWludDMyLCAgIHVpbnQzMl90LCB1aW50MzJfdCwgICAgIGVuY29kZV92YXJpbnQpCi1UKHVpbnQ2NCwgICB1aW50NjRfdCwgdWludDY0X3QsICAgICBlbmNvZGVfdmFyaW50KQotVChlbnVtLCAgICAgaW50MzJfdCwgIHVpbnQzMl90LCAgICAgZW5jb2RlX3ZhcmludCkKLVQoc2ZpeGVkMzIsIGludDMyX3QsICB1aW50MzJfdCwgICAgIGVuY29kZV9maXhlZDMyKQotVChzZml4ZWQ2NCwgaW50NjRfdCwgIHVpbnQ2NF90LCAgICAgZW5jb2RlX2ZpeGVkNjQpCi1UKHNpbnQzMiwgICBpbnQzMl90LCAgdXBiX3p6ZW5jXzMyLCBlbmNvZGVfdmFyaW50KQotVChzaW50NjQsICAgaW50NjRfdCwgIHVwYl96emVuY182NCwgZW5jb2RlX3ZhcmludCkKLQotI3VuZGVmIFQKLQotCi0vKiBjb2RlIHRvIGJ1aWxkIHRoZSBoYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBuZXdoYW5kbGVyc19jYWxsYmFjayhjb25zdCB2b2lkICpjbG9zdXJlLCB1cGJfaGFuZGxlcnMgKmgpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbTsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0KLSAgVVBCX1VOVVNFRChjbG9zdXJlKTsKLQotICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRtc2coaCwgc3RhcnRtc2csIE5VTEwpOwotICB1cGJfaGFuZGxlcnNfc2V0ZW5kbXNnKGgsIGVuZG1zZywgTlVMTCk7Ci0KLSAgbSA9IHVwYl9oYW5kbGVyc19tc2dkZWYoaCk7Ci0gIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBtKTsKLSAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0gICAgYm9vbCBwYWNrZWQgPSB1cGJfZmllbGRkZWZfaXNzZXEoZikgJiYgdXBiX2ZpZWxkZGVmX2lzcHJpbWl0aXZlKGYpICYmCi0gICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfcGFja2VkKGYpOwotICAgIHVwYl9oYW5kbGVyYXR0ciBhdHRyOwotICAgIHVwYl93aXJldHlwZV90IHd0ID0KLSAgICAgICAgcGFja2VkID8gVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQKLSAgICAgICAgICAgICAgIDogdXBiX3BiX25hdGl2ZV93aXJlX3R5cGVzW3VwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShmKV07Ci0KLSAgICAvKiBQcmUtZW5jb2RlIHRoZSB0YWcgZm9yIHRoaXMgZmllbGQuICovCi0gICAgbmV3X3RhZyhoLCBmLCB3dCwgJmF0dHIpOwotCi0gICAgaWYgKHBhY2tlZCkgewotICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c2VxKGgsIGYsIGVuY29kZV9zdGFydGRlbGltZmllbGQsICZhdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzZXEoaCwgZiwgZW5jb2RlX2VuZGRlbGltZmllbGQsICZhdHRyKTsKLSAgICB9Ci0KLSNkZWZpbmUgVCh1cHBlciwgbG93ZXIsIHVwYnR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFXyMjdXBwZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocGFja2VkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHVwYl9oYW5kbGVyc19zZXQjI3VwYnR5cGUoaCwgZiwgZW5jb2RlX3BhY2tlZF8jI2xvd2VyLCAmYXR0cik7IFwKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHVwYl9oYW5kbGVyc19zZXQjI3VwYnR5cGUoaCwgZiwgZW5jb2RlX3NjYWxhcl8jI2xvd2VyLCAmYXR0cik7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBicmVhazsKLQotICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2Rlc2NyaXB0b3J0eXBlKGYpKSB7Ci0gICAgICBUKERPVUJMRSwgICBkb3VibGUsICAgZG91YmxlKTsKLSAgICAgIFQoRkxPQVQsICAgIGZsb2F0LCAgICBmbG9hdCk7Ci0gICAgICBUKElOVDY0LCAgICBpbnQ2NCwgICAgaW50NjQpOwotICAgICAgVChJTlQzMiwgICAgaW50MzIsICAgIGludDMyKTsKLSAgICAgIFQoRklYRUQ2NCwgIGZpeGVkNjQsICB1aW50NjQpOwotICAgICAgVChGSVhFRDMyLCAgZml4ZWQzMiwgIHVpbnQzMik7Ci0gICAgICBUKEJPT0wsICAgICBib29sLCAgICAgYm9vbCk7Ci0gICAgICBUKFVJTlQzMiwgICB1aW50MzIsICAgdWludDMyKTsKLSAgICAgIFQoVUlOVDY0LCAgIHVpbnQ2NCwgICB1aW50NjQpOwotICAgICAgVChFTlVNLCAgICAgZW51bSwgICAgIGludDMyKTsKLSAgICAgIFQoU0ZJWEVEMzIsIHNmaXhlZDMyLCBpbnQzMik7Ci0gICAgICBUKFNGSVhFRDY0LCBzZml4ZWQ2NCwgaW50NjQpOwotICAgICAgVChTSU5UMzIsICAgc2ludDMyLCAgIGludDMyKTsKLSAgICAgIFQoU0lOVDY0LCAgIHNpbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfU1RSSU5HOgotICAgICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0JZVEVTOgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgZiwgZW5jb2RlX3N0YXJ0c3RyLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdHIoaCwgZiwgZW5jb2RlX2VuZGRlbGltZmllbGQsICZhdHRyKTsKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBmLCBlbmNvZGVfc3RyYnVmLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0U6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBmLCBlbmNvZGVfc3RhcnRkZWxpbWZpZWxkLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2coaCwgZiwgZW5jb2RlX2VuZGRlbGltZmllbGQsICZhdHRyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfR1JPVVA6IHsKLSAgICAgICAgLyogRW5kZ3JvdXAgdGFrZXMgYSBkaWZmZXJlbnQgdGFnICh3aXJlX3R5cGUgPSBFTkRfR1JPVVApLiAqLwotICAgICAgICB1cGJfaGFuZGxlcmF0dHIgYXR0cjI7Ci0gICAgICAgIG5ld190YWcoaCwgZiwgVVBCX1dJUkVfVFlQRV9FTkRfR1JPVVAsICZhdHRyMik7Ci0KLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3VibXNnKGgsIGYsIGVuY29kZV9zdGFydGdyb3VwLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2coaCwgZiwgZW5jb2RlX2VuZGdyb3VwLCAmYXR0cjIpOwotCi0gICAgICAgIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmF0dHIyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0jdW5kZWYgVAotCi0gICAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmYXR0cik7Ci0gIH0KLX0KLQotdm9pZCB1cGJfcGJfZW5jb2Rlcl9yZXNldCh1cGJfcGJfZW5jb2RlciAqZSkgewotICBlLT5zZWdwdHIgPSBOVUxMOwotICBlLT50b3AgPSBOVUxMOwotICBlLT5kZXB0aCA9IDA7Ci19Ci0KLQotLyogcHVibGljIEFQSSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfcGJfZW5jb2Rlcl9uZXdoYW5kbGVycyhjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcikgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX25ld2Zyb3plbihtLCBvd25lciwgbmV3aGFuZGxlcnNfY2FsbGJhY2ssIE5VTEwpOwotfQotCi11cGJfcGJfZW5jb2RlciAqdXBiX3BiX2VuY29kZXJfY3JlYXRlKHVwYl9lbnYgKmVudiwgY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfYnl0ZXNzaW5rICpvdXRwdXQpIHsKLSAgY29uc3Qgc2l6ZV90IGluaXRpYWxfYnVmc2l6ZSA9IDI1NjsKLSAgY29uc3Qgc2l6ZV90IGluaXRpYWxfc2VnYnVmc2l6ZSA9IDE2OwotICAvKiBUT0RPKGhhYmVybWFuKTogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS4gKi8KLSAgY29uc3Qgc2l6ZV90IHN0YWNrX3NpemUgPSA2NDsKLSNpZm5kZWYgTkRFQlVHCi0gIGNvbnN0IHNpemVfdCBzaXplX2JlZm9yZSA9IHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQoZW52KTsKLSNlbmRpZgotCi0gIHVwYl9wYl9lbmNvZGVyICplID0gdXBiX2Vudl9tYWxsb2MoZW52LCBzaXplb2YodXBiX3BiX2VuY29kZXIpKTsKLSAgaWYgKCFlKSByZXR1cm4gTlVMTDsKLQotICBlLT5idWYgPSB1cGJfZW52X21hbGxvYyhlbnYsIGluaXRpYWxfYnVmc2l6ZSk7Ci0gIGUtPnNlZ2J1ZiA9IHVwYl9lbnZfbWFsbG9jKGVudiwgaW5pdGlhbF9zZWdidWZzaXplICogc2l6ZW9mKCplLT5zZWdidWYpKTsKLSAgZS0+c3RhY2sgPSB1cGJfZW52X21hbGxvYyhlbnYsIHN0YWNrX3NpemUgKiBzaXplb2YoKmUtPnN0YWNrKSk7Ci0KLSAgaWYgKCFlLT5idWYgfHwgIWUtPnNlZ2J1ZiB8fCAhZS0+c3RhY2spIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGUtPmxpbWl0ID0gZS0+YnVmICsgaW5pdGlhbF9idWZzaXplOwotICBlLT5zZWdsaW1pdCA9IGUtPnNlZ2J1ZiArIGluaXRpYWxfc2VnYnVmc2l6ZTsKLSAgZS0+c3RhY2tsaW1pdCA9IGUtPnN0YWNrICsgc3RhY2tfc2l6ZTsKLQotICB1cGJfcGJfZW5jb2Rlcl9yZXNldChlKTsKLSAgdXBiX3NpbmtfcmVzZXQoJmUtPmlucHV0XywgaCwgZSk7Ci0KLSAgZS0+ZW52ID0gZW52OwotICBlLT5vdXRwdXRfID0gb3V0cHV0OwotICBlLT5zdWJjID0gb3V0cHV0LT5jbG9zdXJlOwotICBlLT5wdHIgPSBlLT5idWY7Ci0KLSAgLyogSWYgdGhpcyBmYWlscywgaW5jcmVhc2UgdGhlIHZhbHVlIGluIGVuY29kZXIuaC4gKi8KLSAgYXNzZXJ0KHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQoZW52KSAtIHNpemVfYmVmb3JlIDw9IFVQQl9QQl9FTkNPREVSX1NJWkUpOwotICByZXR1cm4gZTsKLX0KLQotdXBiX3NpbmsgKnVwYl9wYl9lbmNvZGVyX2lucHV0KHVwYl9wYl9lbmNvZGVyICplKSB7IHJldHVybiAmZS0+aW5wdXRfOyB9Ci0KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLXVwYl9kZWYgKip1cGJfbG9hZF9kZWZzX2Zyb21fZGVzY3JpcHRvcihjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCAqbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvd25lciwgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIC8qIENyZWF0ZSBoYW5kbGVycy4gKi8KLSAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqZGVjb2Rlcl9tOwotICBjb25zdCB1cGJfaGFuZGxlcnMgKnJlYWRlcl9oID0gdXBiX2Rlc2NyZWFkZXJfbmV3aGFuZGxlcnMoJnJlYWRlcl9oKTsKLSAgdXBiX2VudiBlbnY7Ci0gIHVwYl9wYmRlY29kZXJtZXRob2RvcHRzIG9wdHM7Ci0gIHVwYl9wYmRlY29kZXIgKmRlY29kZXI7Ci0gIHVwYl9kZXNjcmVhZGVyICpyZWFkZXI7Ci0gIGJvb2wgb2s7Ci0gIHVwYl9kZWYgKipyZXQgPSBOVUxMOwotICB1cGJfZGVmICoqZGVmczsKLQotICB1cGJfcGJkZWNvZGVybWV0aG9kb3B0c19pbml0KCZvcHRzLCByZWFkZXJfaCk7Ci0gIGRlY29kZXJfbSA9IHVwYl9wYmRlY29kZXJtZXRob2RfbmV3KCZvcHRzLCAmZGVjb2Rlcl9tKTsKLQotICB1cGJfZW52X2luaXQoJmVudik7Ci0gIHVwYl9lbnZfcmVwb3J0ZXJyb3JzdG8oJmVudiwgc3RhdHVzKTsKLQotICByZWFkZXIgPSB1cGJfZGVzY3JlYWRlcl9jcmVhdGUoJmVudiwgcmVhZGVyX2gpOwotICBkZWNvZGVyID0gdXBiX3BiZGVjb2Rlcl9jcmVhdGUoJmVudiwgZGVjb2Rlcl9tLCB1cGJfZGVzY3JlYWRlcl9pbnB1dChyZWFkZXIpKTsKLQotICAvKiBQdXNoIGlucHV0IGRhdGEuICovCi0gIG9rID0gdXBiX2J1ZnNyY19wdXRidWYoc3RyLCBsZW4sIHVwYl9wYmRlY29kZXJfaW5wdXQoZGVjb2RlcikpOwotCi0gIGlmICghb2spIGdvdG8gY2xlYW51cDsKLSAgZGVmcyA9IHVwYl9kZXNjcmVhZGVyX2dldGRlZnMocmVhZGVyLCBvd25lciwgbik7Ci0gIHJldCA9IG1hbGxvYyhzaXplb2YodXBiX2RlZiopICogKCpuKSk7Ci0gIG1lbWNweShyZXQsIGRlZnMsIHNpemVvZih1cGJfZGVmKikgKiAoKm4pKTsKLQotY2xlYW51cDoKLSAgdXBiX2Vudl91bmluaXQoJmVudik7Ci0gIHVwYl9oYW5kbGVyc191bnJlZihyZWFkZXJfaCwgJnJlYWRlcl9oKTsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZF91bnJlZihkZWNvZGVyX20sICZkZWNvZGVyX20pOwotICByZXR1cm4gcmV0OwotfQotCi1ib29sIHVwYl9sb2FkX2Rlc2NyaXB0b3JfaW50b19zeW10YWIodXBiX3N5bXRhYiAqcywgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICBpbnQgbjsKLSAgYm9vbCBzdWNjZXNzOwotICB1cGJfZGVmICoqZGVmcyA9IHVwYl9sb2FkX2RlZnNfZnJvbV9kZXNjcmlwdG9yKHN0ciwgbGVuLCAmbiwgJmRlZnMsIHN0YXR1cyk7Ci0gIGlmICghZGVmcykgcmV0dXJuIGZhbHNlOwotICBzdWNjZXNzID0gdXBiX3N5bXRhYl9hZGQocywgZGVmcywgbiwgJmRlZnMsIHN0YXR1cyk7Ci0gIGZyZWUoZGVmcyk7Ci0gIHJldHVybiBzdWNjZXNzOwotfQotCi1jaGFyICp1cGJfcmVhZGZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHNpemVfdCAqbGVuKSB7Ci0gIGxvbmcgc2l6ZTsKLSAgY2hhciAqYnVmOwotICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyYiIpOwotICBpZighZikgcmV0dXJuIE5VTEw7Ci0gIGlmKGZzZWVrKGYsIDAsIFNFRUtfRU5EKSAhPSAwKSBnb3RvIGVycm9yOwotICBzaXplID0gZnRlbGwoZik7Ci0gIGlmKHNpemUgPCAwKSBnb3RvIGVycm9yOwotICBpZihmc2VlayhmLCAwLCBTRUVLX1NFVCkgIT0gMCkgZ290byBlcnJvcjsKLSAgYnVmID0gbWFsbG9jKHNpemUgKyAxKTsKLSAgaWYoc2l6ZSAmJiBmcmVhZChidWYsIHNpemUsIDEsIGYpICE9IDEpIGdvdG8gZXJyb3I7Ci0gIGZjbG9zZShmKTsKLSAgaWYgKGxlbikgKmxlbiA9IHNpemU7Ci0gIHJldHVybiBidWY7Ci0KLWVycm9yOgotICBmY2xvc2UoZik7Ci0gIHJldHVybiBOVUxMOwotfQotCi1ib29sIHVwYl9sb2FkX2Rlc2NyaXB0b3JfZmlsZV9pbnRvX3N5bXRhYih1cGJfc3ltdGFiICpzeW10YWIsIGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIHNpemVfdCBsZW47Ci0gIGJvb2wgc3VjY2VzczsKLSAgY2hhciAqZGF0YSA9IHVwYl9yZWFkZmlsZShmbmFtZSwgJmxlbik7Ci0gIGlmICghZGF0YSkgewotICAgIGlmIChzdGF0dXMpIHVwYl9zdGF0dXNfc2V0ZXJyZihzdGF0dXMsICJDb3VsZG4ndCByZWFkIGZpbGU6ICVzIiwgZm5hbWUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzdWNjZXNzID0gdXBiX2xvYWRfZGVzY3JpcHRvcl9pbnRvX3N5bXRhYihzeW10YWIsIGRhdGEsIGxlbiwgc3RhdHVzKTsKLSAgZnJlZShkYXRhKTsKLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0vKgotICogdXBiOjpwYjo6VGV4dFByaW50ZXIKLSAqCi0gKiBPUFQ6IFRoaXMgaXMgbm90IG9wdGltaXplZCBhdCBhbGwuICBJdCB1c2VzIHByaW50ZigpIHdoaWNoIHBhcnNlcyB0aGUgZm9ybWF0Ci0gKiBzdHJpbmcgZXZlcnkgdGltZSwgYW5kIGl0IGFsbG9jYXRlcyBtZW1vcnkgZm9yIGV2ZXJ5IHB1dC4KLSAqLwotCi0KLSNpbmNsdWRlIDxjdHlwZS5oPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0KLXN0cnVjdCB1cGJfdGV4dHByaW50ZXIgewotICB1cGJfc2luayBpbnB1dF87Ci0gIHVwYl9ieXRlc3NpbmsgKm91dHB1dF87Ci0gIGludCBpbmRlbnRfZGVwdGhfOwotICBib29sIHNpbmdsZV9saW5lXzsKLSAgdm9pZCAqc3ViYzsKLX07Ci0KLSNkZWZpbmUgQ0hFQ0soeCkgaWYgKCh4KSA8IDApIGdvdG8gZXJyOwotCi1zdGF0aWMgY29uc3QgY2hhciAqc2hvcnRuYW1lKGNvbnN0IGNoYXIgKmxvbmduYW1lKSB7Ci0gIGNvbnN0IGNoYXIgKmxhc3QgPSBzdHJyY2hyKGxvbmduYW1lLCAnLicpOwotICByZXR1cm4gbGFzdCA/IGxhc3QgKyAxIDogbG9uZ25hbWU7Ci19Ci0KLXN0YXRpYyBpbnQgaW5kZW50KHVwYl90ZXh0cHJpbnRlciAqcCkgewotICBpbnQgaTsKLSAgaWYgKCFwLT5zaW5nbGVfbGluZV8pCi0gICAgZm9yIChpID0gMDsgaSA8IHAtPmluZGVudF9kZXB0aF87IGkrKykKLSAgICAgIHVwYl9ieXRlc3NpbmtfcHV0YnVmKHAtPm91dHB1dF8sIHAtPnN1YmMsICIgICIsIDIsIE5VTEwpOwotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIGludCBlbmRmaWVsZCh1cGJfdGV4dHByaW50ZXIgKnApIHsKLSAgY29uc3QgY2hhciBjaCA9IChwLT5zaW5nbGVfbGluZV8gPyAnICcgOiAnXG4nKTsKLSAgdXBiX2J5dGVzc2lua19wdXRidWYocC0+b3V0cHV0XywgcC0+c3ViYywgJmNoLCAxLCBOVUxMKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgcHV0ZXNjYXBlZCh1cGJfdGV4dHByaW50ZXIgKnAsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIHByZXNlcnZlX3V0ZjgpIHsKLSAgLyogQmFzZWQgb24gQ0VzY2FwZUludGVybmFsKCkgZnJvbSBHb29nbGUncyBwcm90b2J1ZiByZWxlYXNlLiAqLwotICBjaGFyIGRzdGJ1Zls0MDk2XSwgKmRzdCA9IGRzdGJ1ZiwgKmRzdGVuZCA9IGRzdGJ1ZiArIHNpemVvZihkc3RidWYpOwotICBjb25zdCBjaGFyICplbmQgPSBidWYgKyBsZW47Ci0KLSAgLyogSSB0aGluayBoZXggaXMgcHJldHRpZXIgYW5kIG1vcmUgdXNlZnVsLCBidXQgcHJvdG8yIHVzZXMgb2N0YWw7IHNob3VsZAotICAgKiBpbnZlc3RpZ2F0ZSB3aGV0aGVyIGl0IGNhbiBwYXJzZSBoZXggYWxzby4gKi8KLSAgY29uc3QgYm9vbCB1c2VfaGV4ID0gZmFsc2U7Ci0gIGJvb2wgbGFzdF9oZXhfZXNjYXBlID0gZmFsc2U7IC8qIHRydWUgaWYgbGFzdCBvdXRwdXQgY2hhciB3YXMgXHhOTiAqLwotCi0gIGZvciAoOyBidWYgPCBlbmQ7IGJ1ZisrKSB7Ci0gICAgYm9vbCBpc19oZXhfZXNjYXBlOwotCi0gICAgaWYgKGRzdGVuZCAtIGRzdCA8IDQpIHsKLSAgICAgIHVwYl9ieXRlc3NpbmtfcHV0YnVmKHAtPm91dHB1dF8sIHAtPnN1YmMsIGRzdGJ1ZiwgZHN0IC0gZHN0YnVmLCBOVUxMKTsKLSAgICAgIGRzdCA9IGRzdGJ1ZjsKLSAgICB9Ci0KLSAgICBpc19oZXhfZXNjYXBlID0gZmFsc2U7Ci0gICAgc3dpdGNoICgqYnVmKSB7Ci0gICAgICBjYXNlICdcbic6ICooZHN0KyspID0gJ1xcJzsgKihkc3QrKykgPSAnbic7ICBicmVhazsKLSAgICAgIGNhc2UgJ1xyJzogKihkc3QrKykgPSAnXFwnOyAqKGRzdCsrKSA9ICdyJzsgIGJyZWFrOwotICAgICAgY2FzZSAnXHQnOiAqKGRzdCsrKSA9ICdcXCc7ICooZHN0KyspID0gJ3QnOyAgYnJlYWs7Ci0gICAgICBjYXNlICdcIic6ICooZHN0KyspID0gJ1xcJzsgKihkc3QrKykgPSAnXCInOyBicmVhazsKLSAgICAgIGNhc2UgJ1wnJzogKihkc3QrKykgPSAnXFwnOyAqKGRzdCsrKSA9ICdcJyc7IGJyZWFrOwotICAgICAgY2FzZSAnXFwnOiAqKGRzdCsrKSA9ICdcXCc7ICooZHN0KyspID0gJ1xcJzsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvKiBOb3RlIHRoYXQgaWYgd2UgZW1pdCBceE5OIGFuZCB0aGUgYnVmIGNoYXJhY3RlciBhZnRlciB0aGF0IGlzIGEgaGV4Ci0gICAgICAgICAqIGRpZ2l0IHRoZW4gdGhhdCBkaWdpdCBtdXN0IGJlIGVzY2FwZWQgdG9vIHRvIHByZXZlbnQgaXQgYmVpbmcKLSAgICAgICAgICogaW50ZXJwcmV0ZWQgYXMgcGFydCBvZiB0aGUgY2hhcmFjdGVyIGNvZGUgYnkgQy4gKi8KLSAgICAgICAgaWYgKCghcHJlc2VydmVfdXRmOCB8fCAodWludDhfdCkqYnVmIDwgMHg4MCkgJiYKLSAgICAgICAgICAgICghaXNwcmludCgqYnVmKSB8fCAobGFzdF9oZXhfZXNjYXBlICYmIGlzeGRpZ2l0KCpidWYpKSkpIHsKLSAgICAgICAgICBzcHJpbnRmKGRzdCwgKHVzZV9oZXggPyAiXFx4JTAyeCIgOiAiXFwlMDNvIiksICh1aW50OF90KSpidWYpOwotICAgICAgICAgIGlzX2hleF9lc2NhcGUgPSB1c2VfaGV4OwotICAgICAgICAgIGRzdCArPSA0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICooZHN0KyspID0gKmJ1ZjsgYnJlYWs7Ci0gICAgICAgIH0KLSAgICB9Ci0gICAgbGFzdF9oZXhfZXNjYXBlID0gaXNfaGV4X2VzY2FwZTsKLSAgfQotICAvKiBGbHVzaCByZW1haW5pbmcgZGF0YS4gKi8KLSAgdXBiX2J5dGVzc2lua19wdXRidWYocC0+b3V0cHV0XywgcC0+c3ViYywgZHN0YnVmLCBkc3QgLSBkc3RidWYsIE5VTEwpOwotICByZXR1cm4gMDsKLX0KLQotYm9vbCBwdXRmKHVwYl90ZXh0cHJpbnRlciAqcCwgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICB2YV9saXN0IGFyZ3NfY29weTsKLSAgY2hhciAqc3RyOwotICBpbnQgd3JpdHRlbjsKLSAgaW50IGxlbjsKLSAgYm9vbCBvazsKLQotICB2YV9zdGFydChhcmdzLCBmbXQpOwotCi0gIC8qIFJ1biBvbmNlIHRvIGdldCB0aGUgbGVuZ3RoIG9mIHRoZSBzdHJpbmcuICovCi0gIF91cGJfdmFfY29weShhcmdzX2NvcHksIGFyZ3MpOwotICBsZW4gPSBfdXBiX3ZzbnByaW50ZihOVUxMLCAwLCBmbXQsIGFyZ3NfY29weSk7Ci0gIHZhX2VuZChhcmdzX2NvcHkpOwotCi0gIC8qICsgMSBmb3IgTlVMTCB0ZXJtaW5hdG9yICh2c3ByaW50ZigpIHJlcXVpcmVzIGl0IGV2ZW4gaWYgd2UgZG9uJ3QpLiAqLwotICBzdHIgPSBtYWxsb2MobGVuICsgMSk7Ci0gIGlmICghc3RyKSByZXR1cm4gZmFsc2U7Ci0gIHdyaXR0ZW4gPSB2c3ByaW50ZihzdHIsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgVVBCX0FTU0VSVF9WQVIod3JpdHRlbiwgd3JpdHRlbiA9PSBsZW4pOwotCi0gIG9rID0gdXBiX2J5dGVzc2lua19wdXRidWYocC0+b3V0cHV0XywgcC0+c3ViYywgc3RyLCBsZW4sIE5VTEwpOwotICBmcmVlKHN0cik7Ci0gIHJldHVybiBvazsKLX0KLQotCi0vKiBoYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYm9vbCB0ZXh0cHJpbnRlcl9zdGFydG1zZyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCkgewotICB1cGJfdGV4dHByaW50ZXIgKnAgPSBjOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgaWYgKHAtPmluZGVudF9kZXB0aF8gPT0gMCkgewotICAgIHVwYl9ieXRlc3Npbmtfc3RhcnQocC0+b3V0cHV0XywgMCwgJnAtPnN1YmMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCB0ZXh0cHJpbnRlcl9lbmRtc2codm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIHVwYl9zdGF0dXMgKnMpIHsKLSAgdXBiX3RleHRwcmludGVyICpwID0gYzsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQocyk7Ci0gIGlmIChwLT5pbmRlbnRfZGVwdGhfID09IDApIHsKLSAgICB1cGJfYnl0ZXNzaW5rX2VuZChwLT5vdXRwdXRfKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBUWVBFKG5hbWUsIGN0eXBlLCBmbXQpIFwKLSAgc3RhdGljIGJvb2wgdGV4dHByaW50ZXJfcHV0ICMjIG5hbWUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlIHZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSBoYW5kbGVyX2RhdGE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0hFQ0soaW5kZW50KHApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHB1dGYocCwgIiVzOiAiIGZtdCwgdXBiX2ZpZWxkZGVmX25hbWUoZiksIHZhbCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDSEVDSyhlbmRmaWVsZChwKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBlcnI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLXN0YXRpYyBib29sIHRleHRwcmludGVyX3B1dGJvb2wodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZhbCkgewotICB1cGJfdGV4dHByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSBoYW5kbGVyX2RhdGE7Ci0gIENIRUNLKGluZGVudChwKSk7Ci0gIHB1dGYocCwgIiVzOiAlcyIsIHVwYl9maWVsZGRlZl9uYW1lKGYpLCB2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKTsKLSAgQ0hFQ0soZW5kZmllbGQocCkpOwotICByZXR1cm4gdHJ1ZTsKLWVycjoKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0jZGVmaW5lIFNUUklOR0lGWV9IRUxQRVIoeCkgI3gKLSNkZWZpbmUgU1RSSU5HSUZZX01BQ1JPVkFMKHgpIFNUUklOR0lGWV9IRUxQRVIoeCkKLQotVFlQRShpbnQzMiwgIGludDMyX3QsICAiJSIgUFJJZDMyKQotVFlQRShpbnQ2NCwgIGludDY0X3QsICAiJSIgUFJJZDY0KQotVFlQRSh1aW50MzIsIHVpbnQzMl90LCAiJSIgUFJJdTMyKQotVFlQRSh1aW50NjQsIHVpbnQ2NF90LCAiJSIgUFJJdTY0KQotVFlQRShmbG9hdCwgIGZsb2F0LCAgICAiJS4iIFNUUklOR0lGWV9NQUNST1ZBTChGTFRfRElHKSAiZyIpCi1UWVBFKGRvdWJsZSwgZG91YmxlLCAgICIlLiIgU1RSSU5HSUZZX01BQ1JPVkFMKERCTF9ESUcpICJnIikKLQotI3VuZGVmIFRZUEUKLQotLyogT3V0cHV0IGEgc3ltYm9saWMgdmFsdWUgZnJvbSB0aGUgZW51bSBpZiBmb3VuZCwgZWxzZSBqdXN0IHByaW50IGFzIGludDMyLiAqLwotc3RhdGljIGJvb2wgdGV4dHByaW50ZXJfcHV0ZW51bSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsKSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IGhhbmRsZXJfZGF0YTsKLSAgY29uc3QgdXBiX2VudW1kZWYgKmVudW1fZGVmID0gdXBiX2Rvd25jYXN0X2VudW1kZWYodXBiX2ZpZWxkZGVmX3N1YmRlZihmKSk7Ci0gIGNvbnN0IGNoYXIgKmxhYmVsID0gdXBiX2VudW1kZWZfaXRvbihlbnVtX2RlZiwgdmFsKTsKLSAgaWYgKGxhYmVsKSB7Ci0gICAgaW5kZW50KHApOwotICAgIHB1dGYocCwgIiVzOiAlcyIsIHVwYl9maWVsZGRlZl9uYW1lKGYpLCBsYWJlbCk7Ci0gICAgZW5kZmllbGQocCk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCF0ZXh0cHJpbnRlcl9wdXRpbnQzMihjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHZhbCkpCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkICp0ZXh0cHJpbnRlcl9zdGFydHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCkgewotICB1cGJfdGV4dHByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSBoYW5kbGVyX2RhdGE7Ci0gIFVQQl9VTlVTRUQoc2l6ZV9oaW50KTsKLSAgaW5kZW50KHApOwotICBwdXRmKHAsICIlczogXCIiLCB1cGJfZmllbGRkZWZfbmFtZShmKSk7Ci0gIHJldHVybiBwOwotfQotCi1zdGF0aWMgYm9vbCB0ZXh0cHJpbnRlcl9lbmRzdHIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcHV0ZihwLCAiXCIiKTsKLSAgZW5kZmllbGQocCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc2l6ZV90IHRleHRwcmludGVyX3B1dHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IGhkOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0gIENIRUNLKHB1dGVzY2FwZWQocCwgYnVmLCBsZW4sIHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX1NUUklORykpOwotICByZXR1cm4gbGVuOwotZXJyOgotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIHZvaWQgKnRleHRwcmludGVyX3N0YXJ0c3VibXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfdGV4dHByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBjb25zdCBjaGFyICpuYW1lID0gaGFuZGxlcl9kYXRhOwotICBDSEVDSyhpbmRlbnQocCkpOwotICBwdXRmKHAsICIlcyB7JWMiLCBuYW1lLCBwLT5zaW5nbGVfbGluZV8gPyAnICcgOiAnXG4nKTsKLSAgcC0+aW5kZW50X2RlcHRoXysrOwotICByZXR1cm4gcDsKLWVycjoKLSAgcmV0dXJuIFVQQl9CUkVBSzsKLX0KLQotc3RhdGljIGJvb2wgdGV4dHByaW50ZXJfZW5kc3VibXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfdGV4dHByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIHAtPmluZGVudF9kZXB0aF8tLTsKLSAgQ0hFQ0soaW5kZW50KHApKTsKLSAgdXBiX2J5dGVzc2lua19wdXRidWYocC0+b3V0cHV0XywgcC0+c3ViYywgIn0iLCAxLCBOVUxMKTsKLSAgQ0hFQ0soZW5kZmllbGQocCkpOwotICByZXR1cm4gdHJ1ZTsKLWVycjoKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgdm9pZCBvbm1yZWcoY29uc3Qgdm9pZCAqYywgdXBiX2hhbmRsZXJzICpoKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfaGFuZGxlcnNfbXNnZGVmKGgpOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLSAgVVBCX1VOVVNFRChjKTsKLQotICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRtc2coaCwgdGV4dHByaW50ZXJfc3RhcnRtc2csIE5VTEwpOwotICB1cGJfaGFuZGxlcnNfc2V0ZW5kbXNnKGgsIHRleHRwcmludGVyX2VuZG1zZywgTlVMTCk7Ci0KLSAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmksIG0pOwotICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaSk7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpKTsKLSAgICB1cGJfaGFuZGxlcmF0dHIgYXR0ciA9IFVQQl9IQU5ETEVSQVRUUl9JTklUSUFMSVpFUjsKLSAgICB1cGJfaGFuZGxlcmF0dHJfc2V0aGFuZGxlcmRhdGEoJmF0dHIsIGYpOwotICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLSAgICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRpbnQzMihoLCBmLCB0ZXh0cHJpbnRlcl9wdXRpbnQzMiwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRpbnQ2NChoLCBmLCB0ZXh0cHJpbnRlcl9wdXRpbnQ2NCwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0dWludDMyKGgsIGYsIHRleHRwcmludGVyX3B1dHVpbnQzMiwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0dWludDY0KGgsIGYsIHRleHRwcmludGVyX3B1dHVpbnQ2NCwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfRkxPQVQ6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRmbG9hdChoLCBmLCB0ZXh0cHJpbnRlcl9wdXRmbG9hdCwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfRE9VQkxFOgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0ZG91YmxlKGgsIGYsIHRleHRwcmludGVyX3B1dGRvdWJsZSwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfQk9PTDoKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldGJvb2woaCwgZiwgdGV4dHByaW50ZXJfcHV0Ym9vbCwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOgotICAgICAgY2FzZSBVUEJfVFlQRV9CWVRFUzoKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3RyKGgsIGYsIHRleHRwcmludGVyX3N0YXJ0c3RyLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgZiwgdGV4dHByaW50ZXJfcHV0c3RyLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdHIoaCwgZiwgdGV4dHByaW50ZXJfZW5kc3RyLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPQotICAgICAgICAgICAgdXBiX2ZpZWxkZGVmX2lzdGFnZGVsaW0oZikKLSAgICAgICAgICAgICAgICA/IHNob3J0bmFtZSh1cGJfbXNnZGVmX2Z1bGxuYW1lKHVwYl9maWVsZGRlZl9tc2dzdWJkZWYoZikpKQotICAgICAgICAgICAgICAgIDogdXBiX2ZpZWxkZGVmX25hbWUoZik7Ci0gICAgICAgIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmYXR0ciwgbmFtZSk7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBmLCB0ZXh0cHJpbnRlcl9zdGFydHN1Ym1zZywgJmF0dHIpOwotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0ZW5kc3VibXNnKGgsIGYsIHRleHRwcmludGVyX2VuZHN1Ym1zZywgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgVVBCX1RZUEVfRU5VTToKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIGYsIHRleHRwcmludGVyX3B1dGVudW0sICZhdHRyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHRleHRwcmludGVyX3Jlc2V0KHVwYl90ZXh0cHJpbnRlciAqcCwgYm9vbCBzaW5nbGVfbGluZSkgewotICBwLT5zaW5nbGVfbGluZV8gPSBzaW5nbGVfbGluZTsKLSAgcC0+aW5kZW50X2RlcHRoXyA9IDA7Ci19Ci0KLQotLyogUHVibGljIEFQSSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdXBiX3RleHRwcmludGVyICp1cGJfdGV4dHByaW50ZXJfY3JlYXRlKHVwYl9lbnYgKmVudiwgY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ieXRlc3NpbmsgKm91dHB1dCkgewotICB1cGJfdGV4dHByaW50ZXIgKnAgPSB1cGJfZW52X21hbGxvYyhlbnYsIHNpemVvZih1cGJfdGV4dHByaW50ZXIpKTsKLSAgaWYgKCFwKSByZXR1cm4gTlVMTDsKLQotICBwLT5vdXRwdXRfID0gb3V0cHV0OwotICB1cGJfc2lua19yZXNldCgmcC0+aW5wdXRfLCBoLCBwKTsKLSAgdGV4dHByaW50ZXJfcmVzZXQocCwgZmFsc2UpOwotCi0gIHJldHVybiBwOwotfQotCi1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl90ZXh0cHJpbnRlcl9uZXdoYW5kbGVycyhjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19uZXdmcm96ZW4obSwgb3duZXIsICZvbm1yZWcsIE5VTEwpOwotfQotCi11cGJfc2luayAqdXBiX3RleHRwcmludGVyX2lucHV0KHVwYl90ZXh0cHJpbnRlciAqcCkgeyByZXR1cm4gJnAtPmlucHV0XzsgfQotCi12b2lkIHVwYl90ZXh0cHJpbnRlcl9zZXRzaW5nbGVsaW5lKHVwYl90ZXh0cHJpbnRlciAqcCwgYm9vbCBzaW5nbGVfbGluZSkgewotICBwLT5zaW5nbGVfbGluZV8gPSBzaW5nbGVfbGluZTsKLX0KLQotCi0vKiBJbmRleCBpcyBkZXNjcmlwdG9yIHR5cGUuICovCi1jb25zdCB1aW50OF90IHVwYl9wYl9uYXRpdmVfd2lyZV90eXBlc1tdID0gewotICBVUEJfV0lSRV9UWVBFX0VORF9HUk9VUCwgICAgIC8qIEVOREdST1VQICovCi0gIFVQQl9XSVJFX1RZUEVfNjRCSVQsICAgICAgICAgLyogRE9VQkxFICovCi0gIFVQQl9XSVJFX1RZUEVfMzJCSVQsICAgICAgICAgLyogRkxPQVQgKi8KLSAgVVBCX1dJUkVfVFlQRV9WQVJJTlQsICAgICAgICAvKiBJTlQ2NCAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIFVJTlQ2NCAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIElOVDMyICovCi0gIFVQQl9XSVJFX1RZUEVfNjRCSVQsICAgICAgICAgLyogRklYRUQ2NCAqLwotICBVUEJfV0lSRV9UWVBFXzMyQklULCAgICAgICAgIC8qIEZJWEVEMzIgKi8KLSAgVVBCX1dJUkVfVFlQRV9WQVJJTlQsICAgICAgICAvKiBCT09MICovCi0gIFVQQl9XSVJFX1RZUEVfREVMSU1JVEVELCAgICAgLyogU1RSSU5HICovCi0gIFVQQl9XSVJFX1RZUEVfU1RBUlRfR1JPVVAsICAgLyogR1JPVVAgKi8KLSAgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQsICAgICAvKiBNRVNTQUdFICovCi0gIFVQQl9XSVJFX1RZUEVfREVMSU1JVEVELCAgICAgLyogQllURVMgKi8KLSAgVVBCX1dJUkVfVFlQRV9WQVJJTlQsICAgICAgICAvKiBVSU5UMzIgKi8KLSAgVVBCX1dJUkVfVFlQRV9WQVJJTlQsICAgICAgICAvKiBFTlVNICovCi0gIFVQQl9XSVJFX1RZUEVfMzJCSVQsICAgICAgICAgLyogU0ZJWEVEMzIgKi8KLSAgVVBCX1dJUkVfVFlQRV82NEJJVCwgICAgICAgICAvKiBTRklYRUQ2NCAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIFNJTlQzMiAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIFNJTlQ2NCAqLwotfTsKLQotLyogQSBiYXNpYyBicmFuY2gtYmFzZWQgZGVjb2RlciwgdXNlcyAzMi1iaXQgdmFsdWVzIHRvIGdldCBnb29kIHBlcmZvcm1hbmNlCi0gKiBvbiAzMi1iaXQgYXJjaGl0ZWN0dXJlcyAoYnV0IHBlcmZvcm1zIHdlbGwgb24gNjQtYml0cyBhbHNvKS4KLSAqIFRoaXMgc2NoZW1lIGNvbWVzIGZyb20gdGhlIG9yaWdpbmFsIEdvb2dsZSBQcm90b2J1ZiBpbXBsZW1lbnRhdGlvbgotICogKHByb3RvMikuICovCi11cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX21heDhfYnJhbmNoMzIodXBiX2RlY29kZXJldCByKSB7Ci0gIHVwYl9kZWNvZGVyZXQgZXJyID0ge05VTEwsIDB9OwotICBjb25zdCBjaGFyICpwID0gci5wOwotICB1aW50MzJfdCBsb3cgPSAodWludDMyX3Qpci52YWw7Ci0gIHVpbnQzMl90IGhpZ2ggPSAwOwotICB1aW50MzJfdCBiOwotICBiID0gKihwKyspOyBsb3cgIHw9IChiICYgMHg3ZlUpIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgbG93ICB8PSAoYiAmIDB4N2ZVKSA8PCAyMTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IGxvdyAgfD0gKGIgJiAweDdmVSkgPDwgMjg7Ci0gICAgICAgICAgICAgIGhpZ2ggID0gKGIgJiAweDdmVSkgPj4gIDQ7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICBiID0gKihwKyspOyBoaWdoIHw9IChiICYgMHg3ZlUpIDw8ICAzOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgaGlnaCB8PSAoYiAmIDB4N2ZVKSA8PCAxMDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IGhpZ2ggfD0gKGIgJiAweDdmVSkgPDwgMTc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICBiID0gKihwKyspOyBoaWdoIHw9IChiICYgMHg3ZlUpIDw8IDI0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgaGlnaCB8PSAoYiAmIDB4N2ZVKSA8PCAzMTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIHJldHVybiBlcnI7Ci0KLWRvbmU6Ci0gIHIudmFsID0gKCh1aW50NjRfdCloaWdoIDw8IDMyKSB8IGxvdzsKLSAgci5wID0gcDsKLSAgcmV0dXJuIHI7Ci19Ci0KLS8qIExpa2UgdGhlIHByZXZpb3VzLCBidXQgdXNlcyA2NC1iaXQgdmFsdWVzLiAqLwotdXBiX2RlY29kZXJldCB1cGJfdmRlY29kZV9tYXg4X2JyYW5jaDY0KHVwYl9kZWNvZGVyZXQgcikgewotICBjb25zdCBjaGFyICpwID0gci5wOwotICB1aW50NjRfdCB2YWwgPSByLnZhbDsKLSAgdWludDY0X3QgYjsKLSAgdXBiX2RlY29kZXJldCBlcnIgPSB7TlVMTCwgMH07Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCAyMTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCAyODsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCAzNTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCA0MjsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCA0OTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCA1NjsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IHZhbCB8PSAoYiAmIDB4N2ZVKSA8PCA2MzsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIHJldHVybiBlcnI7Ci0KLWRvbmU6Ci0gIHIudmFsID0gdmFsOwotICByLnAgPSBwOwotICByZXR1cm4gcjsKLX0KLQotLyogR2l2ZW4gYW4gZW5jb2RlZCB2YXJpbnQgdiwgcmV0dXJucyBhbiBpbnRlZ2VyIHdpdGggYSBzaW5nbGUgYml0IHNldCB0aGF0Ci0gKiBpbmRpY2F0ZXMgdGhlIGVuZCBvZiB0aGUgdmFyaW50LiAgU3VidHJhY3Rpbmcgb25lIGZyb20gdGhpcyB2YWx1ZSB3aWxsCi0gKiB5aWVsZCBhIG1hc2sgdGhhdCBsZWF2ZXMgb25seSBiaXRzIHRoYXQgYXJlIHBhcnQgb2YgdGhlIHZhcmludC4gIFJldHVybnMKLSAqIDAgaWYgdGhlIHZhcmludCBpcyB1bnRlcm1pbmF0ZWQuICovCi1zdGF0aWMgdWludDY0X3QgdXBiX2dldF92c3RvcGJpdCh1aW50NjRfdCB2KSB7Ci0gIHVpbnQ2NF90IGNiaXRzID0gdiB8IDB4N2Y3ZjdmN2Y3ZjdmN2Y3ZlVMTDsKLSAgcmV0dXJuIH5jYml0cyAmIChjYml0cysxKTsKLX0KLQotLyogQSBicmFuY2hsZXNzIGRlY29kZXIuICBDcmVkaXQgdG8gUGFzY2FsIE1hc3NpbWlubyBmb3IgdGhlIGJpdC10d2lkZGxpbmcuICovCi11cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX21heDhfbWFzc2ltaW5vKHVwYl9kZWNvZGVyZXQgcikgewotICB1aW50NjRfdCBiOwotICB1aW50NjRfdCBzdG9wX2JpdDsKLSAgdXBiX2RlY29kZXJldCBteV9yOwotICBtZW1jcHkoJmIsIHIucCwgc2l6ZW9mKGIpKTsKLSAgc3RvcF9iaXQgPSB1cGJfZ2V0X3ZzdG9wYml0KGIpOwotICBiID0gIChiICYgMHg3ZjdmN2Y3ZjdmN2Y3ZjdmVUxMKSAmIChzdG9wX2JpdCAtIDEpOwotICBiICs9ICAgICAgIGIgJiAweDAwN2YwMDdmMDA3ZjAwN2ZVTEw7Ci0gIGIgKz0gIDMgKiAoYiAmIDB4MDAwMGZmZmYwMDAwZmZmZlVMTCk7Ci0gIGIgKz0gMTUgKiAoYiAmIDB4MDAwMDAwMDBmZmZmZmZmZlVMTCk7Ci0gIGlmIChzdG9wX2JpdCA9PSAwKSB7Ci0gICAgLyogRXJyb3I6IHVudGVybWluYXRlZCB2YXJpbnQuICovCi0gICAgdXBiX2RlY29kZXJldCBlcnJfciA9IHsodm9pZCopMCwgMH07Ci0gICAgcmV0dXJuIGVycl9yOwotICB9Ci0gIG15X3IgPSB1cGJfZGVjb2RlcmV0X21ha2Uoci5wICsgKChfX2J1aWx0aW5fY3R6bGwoc3RvcF9iaXQpICsgMSkgLyA4KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICByLnZhbCB8IChiIDw8IDcpKTsKLSAgcmV0dXJuIG15X3I7Ci19Ci0KLS8qIEEgYnJhbmNobGVzcyBkZWNvZGVyLiAgQ3JlZGl0IHRvIERhbmllbCBXcmlnaHQgZm9yIHRoZSBiaXQtdHdpZGRsaW5nLiAqLwotdXBiX2RlY29kZXJldCB1cGJfdmRlY29kZV9tYXg4X3dyaWdodCh1cGJfZGVjb2RlcmV0IHIpIHsKLSAgdWludDY0X3QgYjsKLSAgdWludDY0X3Qgc3RvcF9iaXQ7Ci0gIHVwYl9kZWNvZGVyZXQgbXlfcjsKLSAgbWVtY3B5KCZiLCByLnAsIHNpemVvZihiKSk7Ci0gIHN0b3BfYml0ID0gdXBiX2dldF92c3RvcGJpdChiKTsKLSAgYiAmPSAoc3RvcF9iaXQgLSAxKTsKLSAgYiA9ICgoYiAmIDB4N2YwMDdmMDA3ZjAwN2YwMFVMTCkgPj4gMSkgfCAoYiAmIDB4MDA3ZjAwN2YwMDdmMDA3ZlVMTCk7Ci0gIGIgPSAoKGIgJiAweGZmZmYwMDAwZmZmZjAwMDBVTEwpID4+IDIpIHwgKGIgJiAweDAwMDBmZmZmMDAwMGZmZmZVTEwpOwotICBiID0gKChiICYgMHhmZmZmZmZmZjAwMDAwMDAwVUxMKSA+PiA0KSB8IChiICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKTsKLSAgaWYgKHN0b3BfYml0ID09IDApIHsKLSAgICAvKiBFcnJvcjogdW50ZXJtaW5hdGVkIHZhcmludC4gKi8KLSAgICB1cGJfZGVjb2RlcmV0IGVycl9yID0geyh2b2lkKikwLCAwfTsKLSAgICByZXR1cm4gZXJyX3I7Ci0gIH0KLSAgbXlfciA9IHVwYl9kZWNvZGVyZXRfbWFrZShyLnAgKyAoKF9fYnVpbHRpbl9jdHpsbChzdG9wX2JpdCkgKyAxKSAvIDgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudmFsIHwgKGIgPDwgMTQpKTsKLSAgcmV0dXJuIG15X3I7Ci19Ci0KLSNsaW5lIDEgInVwYi9qc29uL3BhcnNlci5ybCIKLS8qCi0qKiB1cGI6Ompzb246OlBhcnNlciAodXBiX2pzb25fcGFyc2VyKQotKioKLSoqIEEgcGFyc2VyIHRoYXQgdXNlcyB0aGUgUmFnZWwgU3RhdGUgTWFjaGluZSBDb21waWxlciB0byBnZW5lcmF0ZQotKiogdGhlIGZpbml0ZSBhdXRvbWF0YS4KLSoqCi0qKiBSYWdlbCBvbmx5IG5hdGl2ZWx5IGhhbmRsZXMgcmVndWxhciBsYW5ndWFnZXMsIGJ1dCB3ZSBjYW4gbWFudWFsbHkKLSoqIHByb2dyYW0gaXQgYSBiaXQgdG8gaGFuZGxlIGNvbnRleHQtZnJlZSBsYW5ndWFnZXMgbGlrZSBKU09OLCBieSB1c2luZwotKiogdGhlICJmY2FsbCIgYW5kICJmcmV0IiBjb25zdHJ1Y3RzLgotKioKLSoqIFRoaXMgcGFyc2VyIGNhbiBoYW5kbGUgdGhlIGJhc2ljcywgYnV0IG5lZWRzIHNldmVyYWwgdGhpbmdzIHRvIGJlIGZsZXNoZWQKLSoqIG91dDoKLSoqCi0qKiAtIGhhbmRsaW5nIG9mIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlcyAoaW5jbHVkaW5nIGhpZ2ggc3Vycm9nYXRlIHBhaXJzKS4KLSoqIC0gcHJvcGVybHkgY2hlY2sgYW5kIHJlcG9ydCBlcnJvcnMgZm9yIHVua25vd24gZmllbGRzLCBzdGFjayBvdmVyZmxvdywKLSoqICAgaW1wcm9wZXIgYXJyYXkgbmVzdGluZyAob3IgbGFjayBvZiBuZXN0aW5nKS4KLSoqIC0gaGFuZGxpbmcgb2YgYmFzZTY0IHNlcXVlbmNlcyB3aXRoIHBhZGRpbmcgY2hhcmFjdGVycy4KLSoqIC0gaGFuZGxpbmcgb2YgcHVzaC1iYWNrIChub24tc3VjY2VzcyByZXR1cm5zIGZyb20gc2luayBmdW5jdGlvbnMpLgotKiogLSBoYW5kbGluZyBvZiBrZXlzL2VzY2FwZS1zZXF1ZW5jZXMvZXRjIHRoYXQgc3BhbiBpbnB1dCBidWZmZXJzLgotKi8KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotCi0jZGVmaW5lIFVQQl9KU09OX01BWF9ERVBUSCA2NAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9zaW5rIHNpbms7Ci0KLSAgLyogVGhlIGN1cnJlbnQgbWVzc2FnZSBpbiB3aGljaCB3ZSdyZSBwYXJzaW5nLCBhbmQgdGhlIGZpZWxkIHdob3NlIHZhbHVlIHdlJ3JlCi0gICAqIGV4cGVjdGluZyBuZXh0LiAqLwotICBjb25zdCB1cGJfbXNnZGVmICptOwotICBjb25zdCB1cGJfZmllbGRkZWYgKmY7Ci0KLSAgLyogV2UgYXJlIGluIGEgcmVwZWF0ZWQtZmllbGQgY29udGV4dCwgcmVhZHkgdG8gZW1pdCBtYXBlbnRyaWVzIGFzCi0gICAqIHN1Ym1lc3NhZ2VzLiBUaGlzIGZsYWcgYWx0ZXJzIHRoZSBzdGFydC1vZi1vYmplY3QgKG9wZW4tYnJhY2UpIGJlaGF2aW9yIHRvCi0gICAqIGJlZ2luIGEgc2VxdWVuY2Ugb2YgbWFwZW50cnkgbWVzc2FnZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgc3VibWVzc2FnZS4gKi8KLSAgYm9vbCBpc19tYXA7Ci0KLSAgLyogV2UgYXJlIGluIGEgbWFwLWVudHJ5IG1lc3NhZ2UgY29udGV4dC4gVGhpcyBmbGFnIGlzIHNldCB3aGVuIHBhcnNpbmcgdGhlCi0gICAqIHZhbHVlIGZpZWxkIG9mIGEgc2luZ2xlIG1hcCBlbnRyeSBhbmQgaW5kaWNhdGVzIHRvIGFsbCB2YWx1ZS1maWVsZCBwYXJzZXJzCi0gICAqIChzdWJvYmplY3RzLCBzdHJpbmdzLCBudW1iZXJzLCBhbmQgYm9vbHMpIHRoYXQgdGhlIG1hcC1lbnRyeSBzdWJtZXNzYWdlCi0gICAqIHNob3VsZCBlbmQgYXMgc29vbiBhcyB0aGUgdmFsdWUgaXMgcGFyc2VkLiAqLwotICBib29sIGlzX21hcGVudHJ5OwotCi0gIC8qIElmIHxpc19tYXB8IG9yIHxpc19tYXBlbnRyeXwgaXMgdHJ1ZSwgfG1hcGZpZWxkfCByZWZlcnMgdG8gdGhlIHBhcmVudAotICAgKiBtZXNzYWdlJ3MgbWFwIGZpZWxkIHRoYXQgd2UncmUgY3VycmVudGx5IHBhcnNpbmcuIFRoaXMgZGlmZmVycyBmcm9tIHxmfAotICAgKiBiZWNhdXNlIHxmfCBpcyB0aGUgZmllbGQgaW4gdGhlICpjdXJyZW50KiBtZXNzYWdlIChpLmUuLCB0aGUgbWFwLWVudHJ5Ci0gICAqIG1lc3NhZ2UgaXRzZWxmKSwgbm90IHRoZSBwYXJlbnQncyBmaWVsZCB0aGF0IGxlYWRzIHRvIHRoaXMgbWFwLiAqLwotICBjb25zdCB1cGJfZmllbGRkZWYgKm1hcGZpZWxkOwotfSB1cGJfanNvbnBhcnNlcl9mcmFtZTsKLQotc3RydWN0IHVwYl9qc29uX3BhcnNlciB7Ci0gIHVwYl9lbnYgKmVudjsKLSAgdXBiX2J5dGVzaGFuZGxlciBpbnB1dF9oYW5kbGVyXzsKLSAgdXBiX2J5dGVzc2luayBpbnB1dF87Ci0KLSAgLyogU3RhY2sgdG8gdHJhY2sgdGhlIEpTT04gc2NvcGVzIHdlIGFyZSBpbi4gKi8KLSAgdXBiX2pzb25wYXJzZXJfZnJhbWUgc3RhY2tbVVBCX0pTT05fTUFYX0RFUFRIXTsKLSAgdXBiX2pzb25wYXJzZXJfZnJhbWUgKnRvcDsKLSAgdXBiX2pzb25wYXJzZXJfZnJhbWUgKmxpbWl0OwotCi0gIHVwYl9zdGF0dXMgc3RhdHVzOwotCi0gIC8qIFJhZ2VsJ3MgaW50ZXJuYWwgcGFyc2luZyBzdGFjayBmb3IgdGhlIHBhcnNpbmcgc3RhdGUgbWFjaGluZS4gKi8KLSAgaW50IGN1cnJlbnRfc3RhdGU7Ci0gIGludCBwYXJzZXJfc3RhY2tbVVBCX0pTT05fTUFYX0RFUFRIXTsKLSAgaW50IHBhcnNlcl90b3A7Ci0KLSAgLyogVGhlIGhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLiAqLwotICBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGU7Ci0KLSAgLyogQWNjdW11bGF0ZSBidWZmZXIuICBTZWUgZGV0YWlscyBpbiBwYXJzZXIucmwuICovCi0gIGNvbnN0IGNoYXIgKmFjY3VtdWxhdGVkOwotICBzaXplX3QgYWNjdW11bGF0ZWRfbGVuOwotICBjaGFyICphY2N1bXVsYXRlX2J1ZjsKLSAgc2l6ZV90IGFjY3VtdWxhdGVfYnVmX3NpemU7Ci0KLSAgLyogTXVsdGktcGFydCB0ZXh0IGRhdGEuICBTZWUgZGV0YWlscyBpbiBwYXJzZXIucmwuICovCi0gIGludCBtdWx0aXBhcnRfc3RhdGU7Ci0gIHVwYl9zZWxlY3Rvcl90IHN0cmluZ19zZWxlY3RvcjsKLQotICAvKiBJbnB1dCBjYXB0dXJlLiAgU2VlIGRldGFpbHMgaW4gcGFyc2VyLnJsLiAqLwotICBjb25zdCBjaGFyICpjYXB0dXJlOwotCi0gIC8qIEludGVybWVkaWF0ZSByZXN1bHQgb2YgcGFyc2luZyBhIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLiAqLwotICB1aW50MzJfdCBkaWdpdDsKLX07Ci0KLSNkZWZpbmUgUEFSU0VSX0NIRUNLX1JFVFVSTih4KSBpZiAoISh4KSkgcmV0dXJuIGZhbHNlCi0KLS8qIFVzZWQgdG8gc2lnbmFsIHRoYXQgYSBjYXB0dXJlIGhhcyBiZWVuIHN1c3BlbmRlZC4gKi8KLXN0YXRpYyBjaGFyIHN1c3BlbmRfY2FwdHVyZTsKLQotc3RhdGljIHVwYl9zZWxlY3Rvcl90IGdldHNlbF9mb3JfaGFuZGxlcnR5cGUodXBiX2pzb25fcGFyc2VyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJ0eXBlX3QgdHlwZSkgewotICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0gIGJvb2wgb2sgPSB1cGJfaGFuZGxlcnNfZ2V0c2VsZWN0b3IocC0+dG9wLT5mLCB0eXBlLCAmc2VsKTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIHNlbDsKLX0KLQotc3RhdGljIHVwYl9zZWxlY3Rvcl90IHBhcnNlcl9nZXRzZWwodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIHJldHVybiBnZXRzZWxfZm9yX2hhbmRsZXJ0eXBlKAotICAgICAgcCwgdXBiX2hhbmRsZXJzX2dldHByaW1pdGl2ZWhhbmRsZXJ0eXBlKHAtPnRvcC0+ZikpOwotfQotCi1zdGF0aWMgYm9vbCBjaGVja19zdGFjayh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgaWYgKChwLT50b3AgKyAxKSA9PSBwLT5saW1pdCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJOZXN0aW5nIHRvbyBkZWVwIik7Ci0gICAgdXBiX2Vudl9yZXBvcnRlcnJvcihwLT5lbnYsICZwLT5zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBUaGVyZSBhcmUgR0NDL0NsYW5nIGJ1aWx0LWlucyBmb3Igb3ZlcmZsb3cgY2hlY2tpbmcgd2hpY2ggd2UgY291bGQgc3RhcnQKLSAqIHVzaW5nIGlmIHRoZXJlIHdhcyBhbnkgcGVyZm9ybWFuY2UgYmVuZWZpdCB0byBpdC4gKi8KLQotc3RhdGljIGJvb2wgY2hlY2tlZF9hZGQoc2l6ZV90IGEsIHNpemVfdCBiLCBzaXplX3QgKmMpIHsKLSAgaWYgKFNJWkVfTUFYIC0gYSA8IGIpIHJldHVybiBmYWxzZTsKLSAgKmMgPSBhICsgYjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgc2F0dXJhdGluZ19tdWx0aXBseShzaXplX3QgYSwgc2l6ZV90IGIpIHsKLSAgLyogc2l6ZV90IGlzIHVuc2lnbmVkLCBzbyB0aGlzIGlzIGRlZmluZWQgYmVoYXZpb3IgZXZlbiBvbiBvdmVyZmxvdy4gKi8KLSAgc2l6ZV90IHJldCA9IGEgKiBiOwotICBpZiAoYiAhPSAwICYmIHJldCAvIGIgIT0gYSkgewotICAgIHJldCA9IFNJWkVfTUFYOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLQotLyogQmFzZTY0IGRlY29kaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVE9ETyhoYWJlcm1hbik6IG1ha2UgdGhpcyBzdHJlYW1pbmcuICovCi0KLXN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBiNjR0YWJsZVtdID0gewotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDYyLyorKi8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDYzLyovICovLAotICA1Mi8qMCovLCA1My8qMSovLCA1NC8qMiovLCA1NS8qMyovLCA1Ni8qNCovLCA1Ny8qNSovLCA1OC8qNiovLCA1OS8qNyovLAotICA2MC8qOCovLCA2MS8qOSovLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgIDAvKkEqLywgIDEvKkIqLywgIDIvKkMqLywgIDMvKkQqLywgIDQvKkUqLywgIDUvKkYqLywgIDYvKkcqLywKLSAgMDcvKkgqLywgIDgvKkkqLywgIDkvKkoqLywgMTAvKksqLywgMTEvKkwqLywgMTIvKk0qLywgMTMvKk4qLywgMTQvKk8qLywKLSAgMTUvKlAqLywgMTYvKlEqLywgMTcvKlIqLywgMTgvKlMqLywgMTkvKlQqLywgMjAvKlUqLywgMjEvKlYqLywgMjIvKlcqLywKLSAgMjMvKlgqLywgMjQvKlkqLywgMjUvKloqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIDI2LyphKi8sIDI3LypiKi8sIDI4LypjKi8sIDI5LypkKi8sIDMwLyplKi8sIDMxLypmKi8sIDMyLypnKi8sCi0gIDMzLypoKi8sIDM0LyppKi8sIDM1LypqKi8sIDM2LyprKi8sIDM3LypsKi8sIDM4LyptKi8sIDM5LypuKi8sIDQwLypvKi8sCi0gIDQxLypwKi8sIDQyLypxKi8sIDQzLypyKi8sIDQ0LypzKi8sIDQ1Lyp0Ki8sIDQ2Lyp1Ki8sIDQ3Lyp2Ki8sIDQ4Lyp3Ki8sCi0gIDQ5Lyp4Ki8sIDUwLyp5Ki8sIDUxLyp6Ki8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMQotfTsKLQotLyogUmV0dXJucyB0aGUgdGFibGUgdmFsdWUgc2lnbi1leHRlbmRlZCB0byAzMiBiaXRzLiAgS25vd2luZyB0aGF0IHRoZSB1cHBlcgotICogYml0cyB3aWxsIGJlIDEgZm9yIHVucmVjb2duaXplZCBjaGFyYWN0ZXJzIG1ha2VzIGl0IGVhc2llciB0byBjaGVjayBmb3IKLSAqIHRoaXMgZXJyb3IgY29uZGl0aW9uIGxhdGVyIChzZWUgYmVsb3cpLiAqLwotaW50MzJfdCBiNjRsb29rdXAodW5zaWduZWQgY2hhciBjaCkgeyByZXR1cm4gYjY0dGFibGVbY2hdOyB9Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIG5vdCBhIHZhbGlkIGJhc2U2NCBjaGFyYWN0ZXIgb3IKLSAqIHBhZGRpbmcuICovCi1ib29sIG5vbmJhc2U2NCh1bnNpZ25lZCBjaGFyIGNoKSB7IHJldHVybiBiNjRsb29rdXAoY2gpID09IC0xICYmIGNoICE9ICc9JzsgfQotCi1zdGF0aWMgYm9vbCBiYXNlNjRfcHVzaCh1cGJfanNvbl9wYXJzZXIgKnAsIHVwYl9zZWxlY3Rvcl90IHNlbCwgY29uc3QgY2hhciAqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgewotICBjb25zdCBjaGFyICpsaW1pdCA9IHB0ciArIGxlbjsKLSAgZm9yICg7IHB0ciA8IGxpbWl0OyBwdHIgKz0gNCkgewotICAgIHVpbnQzMl90IHZhbDsKLSAgICBjaGFyIG91dHB1dFszXTsKLQotICAgIGlmIChsaW1pdCAtIHB0ciA8IDQpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlNjQgaW5wdXQgZm9yIGJ5dGVzIGZpZWxkIG5vdCBhIG11bHRpcGxlIG9mIDQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShwLT50b3AtPmYpKTsKLSAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2YWwgPSBiNjRsb29rdXAocHRyWzBdKSA8PCAxOCB8Ci0gICAgICAgICAgYjY0bG9va3VwKHB0clsxXSkgPDwgMTIgfAotICAgICAgICAgIGI2NGxvb2t1cChwdHJbMl0pIDw8IDYgIHwKLSAgICAgICAgICBiNjRsb29rdXAocHRyWzNdKTsKLQotICAgIC8qIFRlc3QgdGhlIHVwcGVyIGJpdDsgcmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgY2hhcmFjdGVycyByZXR1cm5lZCAtMS4gKi8KLSAgICBpZiAodmFsICYgMHg4MDAwMDAwMCkgewotICAgICAgZ290byBvdGhlcmNoYXI7Ci0gICAgfQotCi0gICAgb3V0cHV0WzBdID0gdmFsID4+IDE2OwotICAgIG91dHB1dFsxXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotICAgIG91dHB1dFsyXSA9IHZhbCAmIDB4ZmY7Ci0gICAgdXBiX3NpbmtfcHV0c3RyaW5nKCZwLT50b3AtPnNpbmssIHNlbCwgb3V0cHV0LCAzLCBOVUxMKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLQotb3RoZXJjaGFyOgotICBpZiAobm9uYmFzZTY0KHB0clswXSkgfHwgbm9uYmFzZTY0KHB0clsxXSkgfHwgbm9uYmFzZTY0KHB0clsyXSkgfHwKLSAgICAgIG5vbmJhc2U2NChwdHJbM10pICkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWJhc2U2NCBjaGFyYWN0ZXJzIGluIGJ5dGVzIGZpZWxkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKHAtPnRvcC0+ZikpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gaWYgKHB0clsyXSA9PSAnPScpIHsKLSAgICB1aW50MzJfdCB2YWw7Ci0gICAgY2hhciBvdXRwdXQ7Ci0KLSAgICAvKiBMYXN0IGdyb3VwIGNvbnRhaW5zIG9ubHkgdHdvIGlucHV0IGJ5dGVzLCBvbmUgb3V0cHV0IGJ5dGUuICovCi0gICAgaWYgKHB0clswXSA9PSAnPScgfHwgcHRyWzFdID09ICc9JyB8fCBwdHJbM10gIT0gJz0nKSB7Ci0gICAgICBnb3RvIGJhZHBhZGRpbmc7Ci0gICAgfQotCi0gICAgdmFsID0gYjY0bG9va3VwKHB0clswXSkgPDwgMTggfAotICAgICAgICAgIGI2NGxvb2t1cChwdHJbMV0pIDw8IDEyOwotCi0gICAgYXNzZXJ0KCEodmFsICYgMHg4MDAwMDAwMCkpOwotICAgIG91dHB1dCA9IHZhbCA+PiAxNjsKLSAgICB1cGJfc2lua19wdXRzdHJpbmcoJnAtPnRvcC0+c2luaywgc2VsLCAmb3V0cHV0LCAxLCBOVUxMKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICB1aW50MzJfdCB2YWw7Ci0gICAgY2hhciBvdXRwdXRbMl07Ci0KLSAgICAvKiBMYXN0IGdyb3VwIGNvbnRhaW5zIG9ubHkgdGhyZWUgaW5wdXQgYnl0ZXMsIHR3byBvdXRwdXQgYnl0ZXMuICovCi0gICAgaWYgKHB0clswXSA9PSAnPScgfHwgcHRyWzFdID09ICc9JyB8fCBwdHJbMl0gPT0gJz0nKSB7Ci0gICAgICBnb3RvIGJhZHBhZGRpbmc7Ci0gICAgfQotCi0gICAgdmFsID0gYjY0bG9va3VwKHB0clswXSkgPDwgMTggfAotICAgICAgICAgIGI2NGxvb2t1cChwdHJbMV0pIDw8IDEyIHwKLSAgICAgICAgICBiNjRsb29rdXAocHRyWzJdKSA8PCA2OwotCi0gICAgb3V0cHV0WzBdID0gdmFsID4+IDE2OwotICAgIG91dHB1dFsxXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotICAgIHVwYl9zaW5rX3B1dHN0cmluZygmcC0+dG9wLT5zaW5rLCBzZWwsIG91dHB1dCwgMiwgTlVMTCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotYmFkcGFkZGluZzoKLSAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGJhc2U2NCBwYWRkaW5nIGZvciBmaWVsZDogJXMgKCUuKnMpIiwKLSAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKHAtPnRvcC0+ZiksCi0gICAgICAgICAgICAgICAgICAgICA0LCBwdHIpOwotICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBBY2N1bXVsYXRlIGJ1ZmZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGdW5jdGlvbmFsaXR5IGZvciBhY2N1bXVsYXRpbmcgYSBidWZmZXIuCi0gKgotICogU29tZSBwYXJ0cyBvZiB0aGUgcGFyc2VyIG5lZWQgYW4gZW50aXJlIHZhbHVlIGFzIGEgY29udGlndW91cyBzdHJpbmcuICBGb3IKLSAqIGV4YW1wbGUsIHRvIGxvb2sgdXAgYSBtZW1iZXIgbmFtZSBpbiBhIGhhc2ggdGFibGUsIG9yIHRvIHR1cm4gYSBzdHJpbmcgaW50bwotICogYSBudW1iZXIsIHRoZSByZWxldmFudCBsaWJyYXJ5IHJvdXRpbmVzIG5lZWQgdGhlIGlucHV0IHN0cmluZyB0byBiZSBpbgotICogY29udGlndW91cyBtZW1vcnksIGV2ZW4gaWYgdGhlIHZhbHVlIHNwYW5uZWQgdHdvIG9yIG1vcmUgYnVmZmVycyBpbiB0aGUKLSAqIGlucHV0LiAgVGhlc2Ugcm91dGluZXMgaGFuZGxlIHRoYXQuCi0gKgotICogSW4gdGhlIGNvbW1vbiBjYXNlIHdlIGNhbiBqdXN0IHBvaW50IHRvIHRoZSBpbnB1dCBidWZmZXIgdG8gZ2V0IHRoaXMKLSAqIGNvbnRpZ3VvdXMgc3RyaW5nIGFuZCBhdm9pZCBhbnkgYWN0dWFsIGNvcHkuICBTbyB3ZSBvcHRpbWlzdGljYWxseSBiZWdpbgotICogdGhpcyB3YXkuICBCdXQgdGhlcmUgYXJlIGEgZmV3IGNhc2VzIHdoZXJlIHdlIG11c3QgaW5zdGVhZCBjb3B5IGludG8gYQotICogc2VwYXJhdGUgYnVmZmVyOgotICoKLSAqICAgMS4gVGhlIHN0cmluZyB3YXMgbm90IGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IChpdCBzcGFubmVkIGJ1ZmZlcnMpLgotICoKLSAqICAgMi4gVGhlIHN0cmluZyBpbmNsdWRlZCBlc2NhcGUgc2VxdWVuY2VzIHRoYXQgbmVlZCB0byBiZSBpbnRlcnByZXRlZCB0byBnZXQKLSAqICAgICAgdGhlIHRydWUgdmFsdWUgaW4gYSBjb250aWd1b3VzIGJ1ZmZlci4gKi8KLQotc3RhdGljIHZvaWQgYXNzZXJ0X2FjY3VtdWxhdGVfZW1wdHkodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIFVQQl9VTlVTRUQocCk7Ci0gIGFzc2VydChwLT5hY2N1bXVsYXRlZCA9PSBOVUxMKTsKLSAgYXNzZXJ0KHAtPmFjY3VtdWxhdGVkX2xlbiA9PSAwKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjdW11bGF0ZV9jbGVhcih1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgcC0+YWNjdW11bGF0ZWQgPSBOVUxMOwotICBwLT5hY2N1bXVsYXRlZF9sZW4gPSAwOwotfQotCi0vKiBVc2VkIGludGVybmFsbHkgYnkgYWNjdW11bGF0ZV9hcHBlbmQoKS4gKi8KLXN0YXRpYyBib29sIGFjY3VtdWxhdGVfcmVhbGxvYyh1cGJfanNvbl9wYXJzZXIgKnAsIHNpemVfdCBuZWVkKSB7Ci0gIHZvaWQgKm1lbTsKLSAgc2l6ZV90IG9sZF9zaXplID0gcC0+YWNjdW11bGF0ZV9idWZfc2l6ZTsKLSAgc2l6ZV90IG5ld19zaXplID0gVVBCX01BWChvbGRfc2l6ZSwgMTI4KTsKLSAgd2hpbGUgKG5ld19zaXplIDwgbmVlZCkgewotICAgIG5ld19zaXplID0gc2F0dXJhdGluZ19tdWx0aXBseShuZXdfc2l6ZSwgMik7Ci0gIH0KLQotICBtZW0gPSB1cGJfZW52X3JlYWxsb2MocC0+ZW52LCBwLT5hY2N1bXVsYXRlX2J1Ziwgb2xkX3NpemUsIG5ld19zaXplKTsKLSAgaWYgKCFtZW0pIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZygmcC0+c3RhdHVzLCAiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJ1ZmZlci4iKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcC0+YWNjdW11bGF0ZV9idWYgPSBtZW07Ci0gIHAtPmFjY3VtdWxhdGVfYnVmX3NpemUgPSBuZXdfc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvZ2ljYWxseSBhcHBlbmRzIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBhcHBlbmQgYnVmZmVyLgotICogSWYgImNhbl9hbGlhcyIgaXMgdHJ1ZSwgd2Ugd2lsbCB0cnkgdG8gYXZvaWQgYWN0dWFsbHkgY29weWluZywgYnV0IHRoZSBidWZmZXIKLSAqIG11c3QgYmUgdmFsaWQgdW50aWwgdGhlIG5leHQgYWNjdW11bGF0ZV9hcHBlbmQoKSBjYWxsIChpZiBhbnkpLiAqLwotc3RhdGljIGJvb2wgYWNjdW11bGF0ZV9hcHBlbmQodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhbl9hbGlhcykgewotICBzaXplX3QgbmVlZDsKLQotICBpZiAoIXAtPmFjY3VtdWxhdGVkICYmIGNhbl9hbGlhcykgewotICAgIHAtPmFjY3VtdWxhdGVkID0gYnVmOwotICAgIHAtPmFjY3VtdWxhdGVkX2xlbiA9IGxlbjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmICghY2hlY2tlZF9hZGQocC0+YWNjdW11bGF0ZWRfbGVuLCBsZW4sICZuZWVkKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJJbnRlZ2VyIG92ZXJmbG93LiIpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobmVlZCA+IHAtPmFjY3VtdWxhdGVfYnVmX3NpemUgJiYgIWFjY3VtdWxhdGVfcmVhbGxvYyhwLCBuZWVkKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChwLT5hY2N1bXVsYXRlZCAhPSBwLT5hY2N1bXVsYXRlX2J1ZikgewotICAgIG1lbWNweShwLT5hY2N1bXVsYXRlX2J1ZiwgcC0+YWNjdW11bGF0ZWQsIHAtPmFjY3VtdWxhdGVkX2xlbik7Ci0gICAgcC0+YWNjdW11bGF0ZWQgPSBwLT5hY2N1bXVsYXRlX2J1ZjsKLSAgfQotCi0gIG1lbWNweShwLT5hY2N1bXVsYXRlX2J1ZiArIHAtPmFjY3VtdWxhdGVkX2xlbiwgYnVmLCBsZW4pOwotICBwLT5hY2N1bXVsYXRlZF9sZW4gKz0gbGVuOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgYWNjdW11bGF0ZWQgc2luY2UgdGhlIGxhc3QgYWNjdW11bGF0ZV9jbGVhcigpCi0gKiBjYWxsLCBhbmQgd3JpdGVzIHRoZSBsZW5ndGggdG8gKmxlbi4gIFRoaXMgd2l0aCBwb2ludCBlaXRoZXIgdG8gdGhlIGlucHV0Ci0gKiBidWZmZXIgb3IgYSB0ZW1wb3JhcnkgYWNjdW11bGF0ZSBidWZmZXIuICovCi1zdGF0aWMgY29uc3QgY2hhciAqYWNjdW11bGF0ZV9nZXRwdHIodXBiX2pzb25fcGFyc2VyICpwLCBzaXplX3QgKmxlbikgewotICBhc3NlcnQocC0+YWNjdW11bGF0ZWQpOwotICAqbGVuID0gcC0+YWNjdW11bGF0ZWRfbGVuOwotICByZXR1cm4gcC0+YWNjdW11bGF0ZWQ7Ci19Ci0KLQotLyogTXVsdC1wYXJ0IHRleHQgZGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV2hlbiB3ZSBoYXZlIHRleHQgZGF0YSBpbiB0aGUgaW5wdXQsIGl0IGNhbiBvZnRlbiBjb21lIGluIG11bHRpcGxlIHNlZ21lbnRzLgotICogRm9yIGV4YW1wbGUsIHRoZXJlIG1heSBiZSBzb21lIHJhdyBzdHJpbmcgZGF0YSBmb2xsb3dlZCBieSBhbiBlc2NhcGUKLSAqIHNlcXVlbmNlLiAgVGhlIHR3byBzZWdtZW50cyBhcmUgcHJvY2Vzc2VkIHdpdGggZGlmZmVyZW50IGxvZ2ljLiAgQWxzbyBidWZmZXIKLSAqIHNlYW1zIGluIHRoZSBpbnB1dCBjYW4gY2F1c2UgbXVsdGlwbGUgc2VnbWVudHMuCi0gKgotICogQXMgd2Ugc2VlIHNlZ21lbnRzLCB0aGVyZSBhcmUgdHdvIG1haW4gY2FzZXMgZm9yIGhvdyB3ZSB3YW50IHRvIHByb2Nlc3MgdGhlbToKLSAqCi0gKiAgMS4gd2Ugd2FudCB0byBwdXNoIHRoZSBjYXB0dXJlZCBpbnB1dCBkaXJlY3RseSB0byBzdHJpbmcgaGFuZGxlcnMuCi0gKgotICogIDIuIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSBhbGwgdGhlIHBhcnRzIGludG8gYSBjb250aWd1b3VzIGJ1ZmZlciBmb3IgZnVydGhlcgotICogICAgIHByb2Nlc3NpbmcgKGZpZWxkIG5hbWUgbG9va3VwLCBzdHJpbmctPm51bWJlciBjb252ZXJzaW9uLCBldGMpLiAqLwotCi0vKiBUaGlzIGlzIHRoZSBzZXQgb2Ygc3RhdGVzIGZvciBwLT5tdWx0aXBhcnRfc3RhdGUuICovCi1lbnVtIHsKLSAgLyogV2UgYXJlIG5vdCBjdXJyZW50bHkgcHJvY2Vzc2luZyBtdWx0aXBhcnQgZGF0YS4gKi8KLSAgTVVMVElQQVJUX0lOQUNUSVZFID0gMCwKLQotICAvKiBXZSBhcmUgcHJvY2Vzc2luZyBtdWx0aXBhcnQgZGF0YSBieSBhY2N1bXVsYXRpbmcgaXQgaW50byBhIGNvbnRpZ3VvdXMKLSAgICogYnVmZmVyLiAqLwotICBNVUxUSVBBUlRfQUNDVU1VTEFURSA9IDEsCi0KLSAgLyogV2UgYXJlIHByb2Nlc3NpbmcgbXVsdGlwYXJ0IGRhdGEgYnkgcHVzaGluZyBlYWNoIHBhcnQgZGlyZWN0bHkgdG8gdGhlCi0gICAqIGN1cnJlbnQgc3RyaW5nIGhhbmRsZXJzLiAqLwotICBNVUxUSVBBUlRfUFVTSEVBR0VSTFkgPSAyCi19OwotCi0vKiBTdGFydCBhIG11bHRpLXBhcnQgdGV4dCB2YWx1ZSB3aGVyZSB3ZSBhY2N1bXVsYXRlIHRoZSBkYXRhIGZvciBwcm9jZXNzaW5nIGF0Ci0gKiB0aGUgZW5kLiAqLwotc3RhdGljIHZvaWQgbXVsdGlwYXJ0X3N0YXJ0YWNjdW0odXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGFzc2VydF9hY2N1bXVsYXRlX2VtcHR5KHApOwotICBhc3NlcnQocC0+bXVsdGlwYXJ0X3N0YXRlID09IE1VTFRJUEFSVF9JTkFDVElWRSk7Ci0gIHAtPm11bHRpcGFydF9zdGF0ZSA9IE1VTFRJUEFSVF9BQ0NVTVVMQVRFOwotfQotCi0vKiBTdGFydCBhIG11bHRpLXBhcnQgdGV4dCB2YWx1ZSB3aGVyZSB3ZSBpbW1lZGlhdGVseSBwdXNoIHRleHQgZGF0YSB0byBhIHN0cmluZwotICogdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0b3IuICovCi1zdGF0aWMgdm9pZCBtdWx0aXBhcnRfc3RhcnQodXBiX2pzb25fcGFyc2VyICpwLCB1cGJfc2VsZWN0b3JfdCBzZWwpIHsKLSAgYXNzZXJ0X2FjY3VtdWxhdGVfZW1wdHkocCk7Ci0gIGFzc2VydChwLT5tdWx0aXBhcnRfc3RhdGUgPT0gTVVMVElQQVJUX0lOQUNUSVZFKTsKLSAgcC0+bXVsdGlwYXJ0X3N0YXRlID0gTVVMVElQQVJUX1BVU0hFQUdFUkxZOwotICBwLT5zdHJpbmdfc2VsZWN0b3IgPSBzZWw7Ci19Ci0KLXN0YXRpYyBib29sIG11bHRpcGFydF90ZXh0KHVwYl9qc29uX3BhcnNlciAqcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYW5fYWxpYXMpIHsKLSAgc3dpdGNoIChwLT5tdWx0aXBhcnRfc3RhdGUpIHsKLSAgICBjYXNlIE1VTFRJUEFSVF9JTkFDVElWRToKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKAotICAgICAgICAgICZwLT5zdGF0dXMsICJJbnRlcm5hbCBlcnJvcjogdW5leHBlY3RlZCBzdGF0ZSBNVUxUSVBBUlRfSU5BQ1RJVkUiKTsKLSAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgTVVMVElQQVJUX0FDQ1VNVUxBVEU6Ci0gICAgICBpZiAoIWFjY3VtdWxhdGVfYXBwZW5kKHAsIGJ1ZiwgbGVuLCBjYW5fYWxpYXMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNVUxUSVBBUlRfUFVTSEVBR0VSTFk6IHsKLSAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSA9IGNhbl9hbGlhcyA/IHAtPmhhbmRsZSA6IE5VTEw7Ci0gICAgICB1cGJfc2lua19wdXRzdHJpbmcoJnAtPnRvcC0+c2luaywgcC0+c3RyaW5nX3NlbGVjdG9yLCBidWYsIGxlbiwgaGFuZGxlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBOb3RlOiB0aGlzIGludmFsaWRhdGVzIHRoZSBhY2N1bXVsYXRlIGJ1ZmZlciEgIENhbGwgb25seSBhZnRlciByZWFkaW5nIGl0cwotICogY29udGVudHMuICovCi1zdGF0aWMgdm9pZCBtdWx0aXBhcnRfZW5kKHVwYl9qc29uX3BhcnNlciAqcCkgewotICBhc3NlcnQocC0+bXVsdGlwYXJ0X3N0YXRlICE9IE1VTFRJUEFSVF9JTkFDVElWRSk7Ci0gIHAtPm11bHRpcGFydF9zdGF0ZSA9IE1VTFRJUEFSVF9JTkFDVElWRTsKLSAgYWNjdW11bGF0ZV9jbGVhcihwKTsKLX0KLQotCi0vKiBJbnB1dCBjYXB0dXJlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGdW5jdGlvbmFsaXR5IGZvciBjYXB0dXJpbmcgYSByZWdpb24gb2YgdGhlIGlucHV0IGFzIHRleHQuICBHcmFjZWZ1bGx5Ci0gKiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGEgYnVmZmVyIHNlYW0gb2NjdXJzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNhcHR1cmVkCi0gKiByZWdpb24uICovCi0KLXN0YXRpYyB2b2lkIGNhcHR1cmVfYmVnaW4odXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgYXNzZXJ0KHAtPm11bHRpcGFydF9zdGF0ZSAhPSBNVUxUSVBBUlRfSU5BQ1RJVkUpOwotICBhc3NlcnQocC0+Y2FwdHVyZSA9PSBOVUxMKTsKLSAgcC0+Y2FwdHVyZSA9IHB0cjsKLX0KLQotc3RhdGljIGJvb2wgY2FwdHVyZV9lbmQodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgYXNzZXJ0KHAtPmNhcHR1cmUpOwotICBpZiAobXVsdGlwYXJ0X3RleHQocCwgcC0+Y2FwdHVyZSwgcHRyIC0gcC0+Y2FwdHVyZSwgdHJ1ZSkpIHsKLSAgICBwLT5jYXB0dXJlID0gTlVMTDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGlucHV0IGJ1ZmZlciAoaWUuIHdoZW4gd2UgaGF2ZSBoaXQgYQotICogYnVmZmVyIHNlYW0pLiAgSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgY2FwdHVyaW5nIHRoZSBpbnB1dCwgdGhpcwotICogcHJvY2Vzc2VzIHRoZSB1bnByb2Nlc3NlZCBjYXB0dXJlIHJlZ2lvbi4gKi8KLXN0YXRpYyB2b2lkIGNhcHR1cmVfc3VzcGVuZCh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKipwdHIpIHsKLSAgaWYgKCFwLT5jYXB0dXJlKSByZXR1cm47Ci0KLSAgaWYgKG11bHRpcGFydF90ZXh0KHAsIHAtPmNhcHR1cmUsICpwdHIgLSBwLT5jYXB0dXJlLCBmYWxzZSkpIHsKLSAgICAvKiBXZSB1c2UgdGhpcyBhcyBhIHNpZ25hbCB0aGF0IHdlIHdlcmUgaW4gdGhlIG1pZGRsZSBvZiBjYXB0dXJpbmcsIGFuZAotICAgICAqIHRoYXQgY2FwdHVyaW5nIHNob3VsZCByZXN1bWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBidWZmZXIuCi0gICAgICogCi0gICAgICogV2UgY2FuJ3QgdXNlICpwdHIgaGVyZSwgYmVjYXVzZSB3ZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgcG9pbnRlcgotICAgICAqIHdpbGwgYmUgdmFsaWQgd2hlbiB3ZSByZXN1bWUgKGlmIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBpcyBmcmVlZCwgdGhlbgotICAgICAqIHVzaW5nIHRoZSBwb2ludGVyIGF0IGFsbCwgZXZlbiB0byBjb21wYXJlIHRvIE5VTEwsIGlzIGxpa2VseSB1bmRlZmluZWQKLSAgICAgKiBiZWhhdmlvcikuICovCi0gICAgcC0+Y2FwdHVyZSA9ICZzdXNwZW5kX2NhcHR1cmU7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTmVlZCB0byBiYWNrIHVwIHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNhcHR1cmUsIHNpbmNlCi0gICAgICogd2Ugd2VyZSBub3QgYWJsZSB0byBhY3R1YWxseSBwcmVzZXJ2ZSBpdC4gKi8KLSAgICAqcHRyID0gcC0+Y2FwdHVyZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBjYXB0dXJlX3Jlc3VtZSh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKnB0cikgewotICBpZiAocC0+Y2FwdHVyZSkgewotICAgIGFzc2VydChwLT5jYXB0dXJlID09ICZzdXNwZW5kX2NhcHR1cmUpOwotICAgIHAtPmNhcHR1cmUgPSBwdHI7Ci0gIH0KLX0KLQotCi0vKiBDYWxsYmFja3MgZnJvbSB0aGUgcGFyc2VyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgcGFyc2VyIGl0c2VsZi4KLSAqIFdlIGRlZmluZSB0aGVzZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVpciBkZWNsYXJhdGlvbnMgaW4gdGhlIHBhcnNlci4gKi8KLQotc3RhdGljIGNoYXIgZXNjYXBlX2NoYXIoY2hhciBpbikgewotICBzd2l0Y2ggKGluKSB7Ci0gICAgY2FzZSAncic6IHJldHVybiAnXHInOwotICAgIGNhc2UgJ3QnOiByZXR1cm4gJ1x0JzsKLSAgICBjYXNlICduJzogcmV0dXJuICdcbic7Ci0gICAgY2FzZSAnZic6IHJldHVybiAnXGYnOwotICAgIGNhc2UgJ2InOiByZXR1cm4gJ1xiJzsKLSAgICBjYXNlICcvJzogcmV0dXJuICcvJzsKLSAgICBjYXNlICciJzogcmV0dXJuICciJzsKLSAgICBjYXNlICdcXCc6IHJldHVybiAnXFwnOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoMCk7Ci0gICAgICByZXR1cm4gJ3gnOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGVzY2FwZSh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKnB0cikgewotICBjaGFyIGNoID0gZXNjYXBlX2NoYXIoKnB0cik7Ci0gIHJldHVybiBtdWx0aXBhcnRfdGV4dChwLCAmY2gsIDEsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfaGV4KHVwYl9qc29uX3BhcnNlciAqcCkgewotICBwLT5kaWdpdCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhleGRpZ2l0KHVwYl9qc29uX3BhcnNlciAqcCwgY29uc3QgY2hhciAqcHRyKSB7Ci0gIGNoYXIgY2ggPSAqcHRyOwotCi0gIHAtPmRpZ2l0IDw8PSA0OwotCi0gIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgcC0+ZGlnaXQgKz0gKGNoIC0gJzAnKTsKLSAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgcC0+ZGlnaXQgKz0gKChjaCAtICdhJykgKyAxMCk7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KGNoID49ICdBJyAmJiBjaCA8PSAnRicpOwotICAgIHAtPmRpZ2l0ICs9ICgoY2ggLSAnQScpICsgMTApOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGVuZF9oZXgodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIHVpbnQzMl90IGNvZGVwb2ludCA9IHAtPmRpZ2l0OwotCi0gIC8qIGVtaXQgdGhlIGNvZGVwb2ludCBhcyBVVEYtOC4gKi8KLSAgY2hhciB1dGY4WzNdOyAvKiBzdXBwb3J0IFx1MDAwMCAtLSBcdUZGRkYgLS0gbmVlZCBvbmx5IHRocmVlIGJ5dGVzLiAqLwotICBpbnQgbGVuZ3RoID0gMDsKLSAgaWYgKGNvZGVwb2ludCA8PSAweDdGKSB7Ci0gICAgdXRmOFswXSA9IGNvZGVwb2ludDsKLSAgICBsZW5ndGggPSAxOwotICB9IGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDA3RkYpIHsKLSAgICB1dGY4WzFdID0gKGNvZGVwb2ludCAmIDB4M0YpIHwgMHg4MDsKLSAgICBjb2RlcG9pbnQgPj49IDY7Ci0gICAgdXRmOFswXSA9IChjb2RlcG9pbnQgJiAweDFGKSB8IDB4QzA7Ci0gICAgbGVuZ3RoID0gMjsKLSAgfSBlbHNlIC8qIGNvZGVwb2ludCA8PSAweEZGRkYgKi8gewotICAgIHV0ZjhbMl0gPSAoY29kZXBvaW50ICYgMHgzRikgfCAweDgwOwotICAgIGNvZGVwb2ludCA+Pj0gNjsKLSAgICB1dGY4WzFdID0gKGNvZGVwb2ludCAmIDB4M0YpIHwgMHg4MDsKLSAgICBjb2RlcG9pbnQgPj49IDY7Ci0gICAgdXRmOFswXSA9IChjb2RlcG9pbnQgJiAweDBGKSB8IDB4RTA7Ci0gICAgbGVuZ3RoID0gMzsKLSAgfQotICAvKiBUT0RPKGhhYmVybWFuKTogSGFuZGxlIGhpZ2ggc3Vycm9nYXRlczogaWYgY29kZXBvaW50IGlzIGEgaGlnaCBzdXJyb2dhdGUKLSAgICogd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgbmV4dCBlc2NhcGUgdG8gZ2V0IHRoZSBmdWxsIGNvZGUgcG9pbnQpLiAqLwotCi0gIHJldHVybiBtdWx0aXBhcnRfdGV4dChwLCB1dGY4LCBsZW5ndGgsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfdGV4dCh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKnB0cikgewotICBjYXB0dXJlX2JlZ2luKHAsIHB0cik7Ci19Ci0KLXN0YXRpYyBib29sIGVuZF90ZXh0KHVwYl9qc29uX3BhcnNlciAqcCwgY29uc3QgY2hhciAqcHRyKSB7Ci0gIHJldHVybiBjYXB0dXJlX2VuZChwLCBwdHIpOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9udW1iZXIodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgbXVsdGlwYXJ0X3N0YXJ0YWNjdW0ocCk7Ci0gIGNhcHR1cmVfYmVnaW4ocCwgcHRyKTsKLX0KLQotc3RhdGljIGJvb2wgcGFyc2VfbnVtYmVyKHVwYl9qc29uX3BhcnNlciAqcCk7Ci0KLXN0YXRpYyBib29sIGVuZF9udW1iZXIodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgaWYgKCFjYXB0dXJlX2VuZChwLCBwdHIpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHBhcnNlX251bWJlcihwKTsKLX0KLQotc3RhdGljIGJvb2wgcGFyc2VfbnVtYmVyKHVwYl9qc29uX3BhcnNlciAqcCkgewotICBzaXplX3QgbGVuOwotICBjb25zdCBjaGFyICpidWY7Ci0gIGNvbnN0IGNoYXIgKm15ZW5kOwotICBjaGFyICplbmQ7Ci0KLSAgLyogc3RydG9sKCkgYW5kIGZyaWVuZHMgdW5mb3J0dW5hdGVseSBkbyBub3Qgc3VwcG9ydCBzcGVjaWZ5aW5nIHRoZSBsZW5ndGggb2YKLSAgICogdGhlIGlucHV0IHN0cmluZywgc28gd2UgbmVlZCB0byBmb3JjZSBhIGNvcHkgaW50byBhIE5VTEwtdGVybWluYXRlZCBidWZmZXIuICovCi0gIGlmICghbXVsdGlwYXJ0X3RleHQocCwgIlwwIiwgMSwgZmFsc2UpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYnVmID0gYWNjdW11bGF0ZV9nZXRwdHIocCwgJmxlbik7Ci0gIG15ZW5kID0gYnVmICsgbGVuIC0gMTsgIC8qIE9uZSBmb3IgTlVMTC4gKi8KLQotICAvKiBYWFg6IFdlIGFyZSB1c2luZyBzdHJ0b2wgdG8gcGFyc2UgaW50ZWdlcnMsIGJ1dCB0aGlzIGlzIHdyb25nIGFzIGV2ZW4KLSAgICogaW50ZWdlcnMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIDFlNiAoZm9yIGV4YW1wbGUpLCB3aGljaCBzdHJ0b2wgY2FuJ3QKLSAgICogaGFuZGxlIGNvcnJlY3RseS4KLSAgICoKLSAgICogWFhYOiBBbHNvLCB3ZSBjYW4ndCBoYW5kbGUgbGFyZ2UgaW50ZWdlcnMgcHJvcGVybHkgYmVjYXVzZSBzdHJ0b1t1XWxsCi0gICAqIGlzbid0IGluIEM4OS4KLSAgICoKLSAgICogWFhYOiBBbHNvLCB3ZSBkb24ndCBwcm9wZXJseSBjaGVjayBmbG9hdHMgZm9yIG92ZXJmbG93LCBzaW5jZSBzdHJ0b2YKLSAgICogaXNuJ3QgaW4gQzg5LiAqLwotICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKHAtPnRvcC0+ZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjogewotICAgICAgbG9uZyB2YWwgPSBzdHJ0b2wocC0+YWNjdW11bGF0ZWQsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4gfHwgZXJybm8gPT0gRVJBTkdFIHx8IGVuZCAhPSBteWVuZCkKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICBlbHNlCi0gICAgICAgIHVwYl9zaW5rX3B1dGludDMyKCZwLT50b3AtPnNpbmssIHBhcnNlcl9nZXRzZWwocCksIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDogewotICAgICAgbG9uZyBsb25nIHZhbCA9IHN0cnRvbChwLT5hY2N1bXVsYXRlZCwgJmVuZCwgMCk7Ci0gICAgICBpZiAodmFsID4gSU5UNjRfTUFYIHx8IHZhbCA8IElOVDY0X01JTiB8fCBlcnJubyA9PSBFUkFOR0UgfHwgZW5kICE9IG15ZW5kKQotICAgICAgICBnb3RvIGVycjsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX3NpbmtfcHV0aW50NjQoJnAtPnRvcC0+c2luaywgcGFyc2VyX2dldHNlbChwKSwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjogewotICAgICAgdW5zaWduZWQgbG9uZyB2YWwgPSBzdHJ0b3VsKHAtPmFjY3VtdWxhdGVkLCAmZW5kLCAwKTsKLSAgICAgIGlmICh2YWwgPiBVSU5UMzJfTUFYIHx8IGVycm5vID09IEVSQU5HRSB8fCBlbmQgIT0gbXllbmQpCi0gICAgICAgIGdvdG8gZXJyOwotICAgICAgZWxzZQotICAgICAgICB1cGJfc2lua19wdXR1aW50MzIoJnAtPnRvcC0+c2luaywgcGFyc2VyX2dldHNlbChwKSwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDogewotICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbCA9IHN0cnRvdWwocC0+YWNjdW11bGF0ZWQsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IFVJTlQ2NF9NQVggfHwgZXJybm8gPT0gRVJBTkdFIHx8IGVuZCAhPSBteWVuZCkKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICBlbHNlCi0gICAgICAgIHVwYl9zaW5rX3B1dHVpbnQ2NCgmcC0+dG9wLT5zaW5rLCBwYXJzZXJfZ2V0c2VsKHApLCB2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfRE9VQkxFOiB7Ci0gICAgICBkb3VibGUgdmFsID0gc3RydG9kKHAtPmFjY3VtdWxhdGVkLCAmZW5kKTsKLSAgICAgIGlmIChlcnJubyA9PSBFUkFOR0UgfHwgZW5kICE9IG15ZW5kKQotICAgICAgICBnb3RvIGVycjsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX3NpbmtfcHV0ZG91YmxlKCZwLT50b3AtPnNpbmssIHBhcnNlcl9nZXRzZWwocCksIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDogewotICAgICAgZmxvYXQgdmFsID0gc3RydG9kKHAtPmFjY3VtdWxhdGVkLCAmZW5kKTsKLSAgICAgIGlmIChlcnJubyA9PSBFUkFOR0UgfHwgZW5kICE9IG15ZW5kKQotICAgICAgICBnb3RvIGVycjsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX3NpbmtfcHV0ZmxvYXQoJnAtPnRvcC0+c2luaywgcGFyc2VyX2dldHNlbChwKSwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgfQotCi0gIG11bHRpcGFydF9lbmQocCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLWVycjoKLSAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsICJlcnJvciBwYXJzaW5nIG51bWJlcjogJXMiLCBidWYpOwotICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gIG11bHRpcGFydF9lbmQocCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcGFyc2VyX3B1dGJvb2wodXBiX2pzb25fcGFyc2VyICpwLCBib29sIHZhbCkgewotICBib29sIG9rOwotCi0gIGlmICh1cGJfZmllbGRkZWZfdHlwZShwLT50b3AtPmYpICE9IFVQQl9UWVBFX0JPT0wpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYoJnAtPnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIkJvb2xlYW4gdmFsdWUgc3BlY2lmaWVkIGZvciBub24tYm9vbCBmaWVsZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShwLT50b3AtPmYpKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb2sgPSB1cGJfc2lua19wdXRib29sKCZwLT50b3AtPnNpbmssIHBhcnNlcl9nZXRzZWwocCksIHZhbCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHN0YXJ0X3N0cmluZ3ZhbCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgYXNzZXJ0KHAtPnRvcC0+Zik7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9pc3N0cmluZyhwLT50b3AtPmYpKSB7Ci0gICAgdXBiX2pzb25wYXJzZXJfZnJhbWUgKmlubmVyOwotICAgIHVwYl9zZWxlY3Rvcl90IHNlbDsKLQotICAgIGlmICghY2hlY2tfc3RhY2socCkpIHJldHVybiBmYWxzZTsKLQotICAgIC8qIFN0YXJ0IGEgbmV3IHBhcnNlciBmcmFtZTogcGFyc2VyIGZyYW1lcyBjb3JyZXNwb25kIG9uZS10by1vbmUgd2l0aAotICAgICAqIGhhbmRsZXIgZnJhbWVzLCBhbmQgc3RyaW5nIGV2ZW50cyBvY2N1ciBpbiBhIHN1Yi1mcmFtZS4gKi8KLSAgICBpbm5lciA9IHAtPnRvcCArIDE7Ci0gICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNUUik7Ci0gICAgdXBiX3Npbmtfc3RhcnRzdHIoJnAtPnRvcC0+c2luaywgc2VsLCAwLCAmaW5uZXItPnNpbmspOwotICAgIGlubmVyLT5tID0gcC0+dG9wLT5tOwotICAgIGlubmVyLT5mID0gcC0+dG9wLT5mOwotICAgIGlubmVyLT5pc19tYXAgPSBmYWxzZTsKLSAgICBpbm5lci0+aXNfbWFwZW50cnkgPSBmYWxzZTsKLSAgICBwLT50b3AgPSBpbm5lcjsKLQotICAgIGlmICh1cGJfZmllbGRkZWZfdHlwZShwLT50b3AtPmYpID09IFVQQl9UWVBFX1NUUklORykgewotICAgICAgLyogRm9yIFNUUklORyBmaWVsZHMgd2UgcHVzaCBkYXRhIGRpcmVjdGx5IHRvIHRoZSBoYW5kbGVycyBhcyBpdCBpcwotICAgICAgICogcGFyc2VkLiAgV2UgZG9uJ3QgZG8gdGhpcyB5ZXQgZm9yIEJZVEVTIGZpZWxkcywgYmVjYXVzZSBvdXIgYmFzZTY0Ci0gICAgICAgKiBkZWNvZGVyIGlzIG5vdCBzdHJlYW1pbmcuCi0gICAgICAgKgotICAgICAgICogVE9ETyhoYWJlcm1hbik6IG1ha2UgYmFzZTY0IGRlY29kaW5nIHN0cmVhbWluZyBhbHNvLiAqLwotICAgICAgbXVsdGlwYXJ0X3N0YXJ0KHAsIGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfU1RSSU5HKSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgbXVsdGlwYXJ0X3N0YXJ0YWNjdW0ocCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX3R5cGUocC0+dG9wLT5mKSA9PSBVUEJfVFlQRV9FTlVNKSB7Ci0gICAgLyogTm8gbmVlZCB0byBwdXNoIGEgZnJhbWUgLS0gc3ltYm9saWMgZW51bSBuYW1lcyBpbiBxdW90ZXMgcmVtYWluIGluIHRoZQotICAgICAqIGN1cnJlbnQgcGFyc2VyIGZyYW1lLgotICAgICAqCi0gICAgICogRW51bSBzdHJpbmcgdmFsdWVzIG11c3QgYWNjdW11bGF0ZSBzbyB3ZSBjYW4gbG9vayB1cCB0aGUgdmFsdWUgaW4gYSB0YWJsZQotICAgICAqIG9uY2UgaXQgaXMgY29tcGxldGUuICovCi0gICAgbXVsdGlwYXJ0X3N0YXJ0YWNjdW0ocCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgc3BlY2lmaWVkIGZvciBub24tc3RyaW5nL25vbi1lbnVtIGZpZWxkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKHAtPnRvcC0+ZikpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgZW5kX3N0cmluZ3ZhbCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgYm9vbCBvayA9IHRydWU7Ci0KLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShwLT50b3AtPmYpKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzoKLSAgICAgIGlmICghYmFzZTY0X3B1c2gocCwgZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVFJJTkcpLAotICAgICAgICAgICAgICAgICAgICAgICBwLT5hY2N1bXVsYXRlZCwgcC0+YWNjdW11bGF0ZWRfbGVuKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvKiBGYWxsIHRocm91Z2guICovCi0KLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzogewotICAgICAgdXBiX3NlbGVjdG9yX3Qgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9FTkRTVFIpOwotICAgICAgdXBiX3NpbmtfZW5kc3RyKCZwLT50b3AtPnNpbmssIHNlbCk7Ci0gICAgICBwLT50b3AtLTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgVVBCX1RZUEVfRU5VTTogewotICAgICAgLyogUmVzb2x2ZSBlbnVtIHN5bWJvbGljIG5hbWUgdG8gaW50ZWdlciB2YWx1ZS4gKi8KLSAgICAgIGNvbnN0IHVwYl9lbnVtZGVmICplbnVtZGVmID0KLSAgICAgICAgICAoY29uc3QgdXBiX2VudW1kZWYqKXVwYl9maWVsZGRlZl9zdWJkZWYocC0+dG9wLT5mKTsKLQotICAgICAgc2l6ZV90IGxlbjsKLSAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IGFjY3VtdWxhdGVfZ2V0cHRyKHAsICZsZW4pOwotCi0gICAgICBpbnQzMl90IGludF92YWwgPSAwOwotICAgICAgb2sgPSB1cGJfZW51bWRlZl9udG9pKGVudW1kZWYsIGJ1ZiwgbGVuLCAmaW50X3ZhbCk7Ci0KLSAgICAgIGlmIChvaykgewotICAgICAgICB1cGJfc2VsZWN0b3JfdCBzZWwgPSBwYXJzZXJfZ2V0c2VsKHApOwotICAgICAgICB1cGJfc2lua19wdXRpbnQzMigmcC0+dG9wLT5zaW5rLCBzZWwsIGludF92YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsICJFbnVtIHZhbHVlIHVua25vd246ICclLipzJyIsIGxlbiwgYnVmKTsKLSAgICAgICAgdXBiX2Vudl9yZXBvcnRlcnJvcihwLT5lbnYsICZwLT5zdGF0dXMpOwotICAgICAgfQotCi0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJJbnRlcm5hbCBlcnJvciBpbiBKU09OIGRlY29kZXIiKTsKLSAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgIG9rID0gZmFsc2U7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIG11bHRpcGFydF9lbmQocCk7Ci0KLSAgcmV0dXJuIG9rOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9tZW1iZXIodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGFzc2VydCghcC0+dG9wLT5mKTsKLSAgbXVsdGlwYXJ0X3N0YXJ0YWNjdW0ocCk7Ci19Ci0KLS8qIEhlbHBlcjogaW52b2tlZCBkdXJpbmcgcGFyc2VfbWFwZW50cnkoKSB0byBlbWl0IHRoZSBtYXBlbnRyeSBtZXNzYWdlJ3Mga2V5Ci0gKiBmaWVsZCBiYXNlZCBvbiB0aGUgY3VycmVudCBjb250ZW50cyBvZiB0aGUgYWNjdW11bGF0ZSBidWZmZXIuICovCi1zdGF0aWMgYm9vbCBwYXJzZV9tYXBlbnRyeV9rZXkodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0KLSAgc2l6ZV90IGxlbjsKLSAgY29uc3QgY2hhciAqYnVmID0gYWNjdW11bGF0ZV9nZXRwdHIocCwgJmxlbik7Ci0KLSAgLyogRW1pdCB0aGUga2V5IGZpZWxkLiBXZSBkbyBhIGJpdCBvZiBhZC1ob2MgcGFyc2luZyBoZXJlIGJlY2F1c2UgdGhlCi0gICAqIHBhcnNlciBzdGF0ZSBtYWNoaW5lIGhhcyBhbHJlYWR5IGRlY2lkZWQgdGhhdCB0aGlzIGlzIGEgc3RyaW5nIGZpZWxkCi0gICAqIG5hbWUsIGFuZCB3ZSBhcmUgcmVpbnRlcnByZXRpbmcgaXQgYXMgc29tZSBhcmJpdHJhcnkga2V5IHR5cGUuIEluCi0gICAqIHBhcnRpY3VsYXIsIGludGVnZXIgYW5kIGJvb2wga2V5cyBhcmUgcXVvdGVkLCBzbyB3ZSBuZWVkIHRvIHBhcnNlIHRoZQotICAgKiBxdW90ZWQgc3RyaW5nIGNvbnRlbnRzIGhlcmUuICovCi0KLSAgcC0+dG9wLT5mID0gdXBiX21zZ2RlZl9pdG9mKHAtPnRvcC0+bSwgVVBCX01BUEVOVFJZX0tFWSk7Ci0gIGlmIChwLT50b3AtPmYgPT0gTlVMTCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJtYXBlbnRyeSBtZXNzYWdlIGhhcyBubyBrZXkiKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUocC0+dG9wLT5mKSkgewotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjoKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAgIC8qIEludm9rZSBlbmRfbnVtYmVyLiBUaGUgYWNjdW0gYnVmZmVyIGhhcyB0aGUgbnVtYmVyJ3MgdGV4dCBhbHJlYWR5LiAqLwotICAgICAgaWYgKCFwYXJzZV9udW1iZXIocCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOgotICAgICAgaWYgKGxlbiA9PSA0ICYmICFzdHJuY21wKGJ1ZiwgInRydWUiLCA0KSkgewotICAgICAgICBpZiAoIXBhcnNlcl9wdXRib29sKHAsIHRydWUpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGxlbiA9PSA1ICYmICFzdHJuY21wKGJ1ZiwgImZhbHNlIiwgNSkpIHsKLSAgICAgICAgaWYgKCFwYXJzZXJfcHV0Ym9vbChwLCBmYWxzZSkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNYXAgYm9vbCBrZXkgbm90ICd0cnVlJyBvciAnZmFsc2UnIik7Ci0gICAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgbXVsdGlwYXJ0X2VuZChwKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOgotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6IHsKLSAgICAgIHVwYl9zaW5rIHN1YnNpbms7Ci0gICAgICB1cGJfc2VsZWN0b3JfdCBzZWwgPSBnZXRzZWxfZm9yX2hhbmRsZXJ0eXBlKHAsIFVQQl9IQU5ETEVSX1NUQVJUU1RSKTsKLSAgICAgIHVwYl9zaW5rX3N0YXJ0c3RyKCZwLT50b3AtPnNpbmssIHNlbCwgbGVuLCAmc3Vic2luayk7Ci0gICAgICBzZWwgPSBnZXRzZWxfZm9yX2hhbmRsZXJ0eXBlKHAsIFVQQl9IQU5ETEVSX1NUUklORyk7Ci0gICAgICB1cGJfc2lua19wdXRzdHJpbmcoJnN1YnNpbmssIHNlbCwgYnVmLCBsZW4sIE5VTEwpOwotICAgICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9FTkRTVFIpOwotICAgICAgdXBiX3NpbmtfZW5kc3RyKCZzdWJzaW5rLCBzZWwpOwotICAgICAgbXVsdGlwYXJ0X2VuZChwKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgdXBiX3N0YXR1c19zZXRlcnJtc2coJnAtPnN0YXR1cywgIkludmFsaWQgZmllbGQgdHlwZSBmb3IgbWFwIGtleSIpOwotICAgICAgdXBiX2Vudl9yZXBvcnRlcnJvcihwLT5lbnYsICZwLT5zdGF0dXMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIEhlbHBlcjogZW1pdCBvbmUgbWFwIGVudHJ5IChhcyBhIHN1Ym1lc3NhZ2UgaW4gdGhlIG1hcCBmaWVsZCBzZXF1ZW5jZSkuIFRoaXMKLSAqIGlzIGludm9rZWQgZnJvbSBlbmRfbWVtYmVybmFtZSgpLCBhdCB0aGUgZW5kIG9mIHRoZSBtYXAgZW50cnkncyBrZXkgc3RyaW5nLAotICogd2l0aCB0aGUgbWFwIGtleSBpbiB0aGUgYWNjdW11bGF0ZSBidWZmZXIuIEl0IHBhcnNlcyB0aGUga2V5IGZyb20gdGhhdAotICogYnVmZmVyLCBlbWl0cyB0aGUgaGFuZGxlciBjYWxscyB0byBzdGFydCB0aGUgbWFwZW50cnkgc3VibWVzc2FnZSAoc2V0dGluZyB1cAotICogaXRzIHN1YmZyYW1lIGluIHRoZSBwcm9jZXNzKSwgYW5kIHNldHMgdXAgc3RhdGUgaW4gdGhlIHN1YmZyYW1lIHNvIHRoYXQgdGhlCi0gKiB2YWx1ZSBwYXJzZXIgKGludm9rZWQgbmV4dCkgd2lsbCBlbWl0IHRoZSBtYXBlbnRyeSdzIHZhbHVlIGZpZWxkIGFuZCB0aGVuCi0gKiBlbmQgdGhlIG1hcGVudHJ5IG1lc3NhZ2UuICovCi0KLXN0YXRpYyBib29sIGhhbmRsZV9tYXBlbnRyeSh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmICptYXBmaWVsZDsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbWFwZW50cnltc2c7Ci0gIHVwYl9qc29ucGFyc2VyX2ZyYW1lICppbm5lcjsKLSAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotCi0gIC8qIE1hcCBlbnRyeTogcC0+dG9wLT5zaW5rIGlzIHRoZSBzZXEgZnJhbWUsIHNvIHdlIG5lZWQgdG8gc3RhcnQgYSBmcmFtZQotICAgKiBmb3IgdGhlIG1hcGVudHJ5IGl0c2VsZiwgYW5kIHRoZW4gc2V0IHxmfCBpbiB0aGF0IGZyYW1lIHNvIHRoYXQgdGhlIG1hcAotICAgKiB2YWx1ZSBmaWVsZCBpcyBwYXJzZWQsIGFuZCBhbHNvIHNldCBhIGZsYWcgdG8gZW5kIHRoZSBmcmFtZSBhZnRlciB0aGUKLSAgICogbWFwLWVudHJ5IHZhbHVlIGlzIHBhcnNlZC4gKi8KLSAgaWYgKCFjaGVja19zdGFjayhwKSkgcmV0dXJuIGZhbHNlOwotCi0gIG1hcGZpZWxkID0gcC0+dG9wLT5tYXBmaWVsZDsKLSAgbWFwZW50cnltc2cgPSB1cGJfZmllbGRkZWZfbXNnc3ViZGVmKG1hcGZpZWxkKTsKLQotICBpbm5lciA9IHAtPnRvcCArIDE7Ci0gIHAtPnRvcC0+ZiA9IG1hcGZpZWxkOwotICBzZWwgPSBnZXRzZWxfZm9yX2hhbmRsZXJ0eXBlKHAsIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKTsKLSAgdXBiX3Npbmtfc3RhcnRzdWJtc2coJnAtPnRvcC0+c2luaywgc2VsLCAmaW5uZXItPnNpbmspOwotICBpbm5lci0+bSA9IG1hcGVudHJ5bXNnOwotICBpbm5lci0+bWFwZmllbGQgPSBtYXBmaWVsZDsKLSAgaW5uZXItPmlzX21hcCA9IGZhbHNlOwotCi0gIC8qIERvbid0IHNldCB0aGlzIHRvIHRydWUgKnlldCogLS0gd2UgcmV1c2UgcGFyc2luZyBoYW5kbGVycyBiZWxvdyB0byBwdXNoCi0gICAqIHRoZSBrZXkgZmllbGQgdmFsdWUgdG8gdGhlIHNpbmssIGFuZCB0aGVzZSBoYW5kbGVycyB3aWxsIHBvcCB0aGUgZnJhbWUKLSAgICogaWYgdGhleSBzZWUgaXNfbWFwZW50cnkgKHdoZW4gaW52b2tlZCBieSB0aGUgcGFyc2VyIHN0YXRlIG1hY2hpbmUsIHRoZXkKLSAgICogd291bGQgaGF2ZSBqdXN0IHNlZW4gdGhlIG1hcC1lbnRyeSB2YWx1ZSwgbm90IGtleSkuICovCi0gIGlubmVyLT5pc19tYXBlbnRyeSA9IGZhbHNlOwotICBwLT50b3AgPSBpbm5lcjsKLQotICAvKiBzZW5kIFNUQVJUTVNHIGluIHN1Ym1zZyBmcmFtZS4gKi8KLSAgdXBiX3Npbmtfc3RhcnRtc2coJnAtPnRvcC0+c2luayk7Ci0KLSAgcGFyc2VfbWFwZW50cnlfa2V5KHApOwotCi0gIC8qIFNldCB1cCB0aGUgdmFsdWUgZmllbGQgdG8gcmVjZWl2ZSB0aGUgbWFwLWVudHJ5IHZhbHVlLiAqLwotICBwLT50b3AtPmYgPSB1cGJfbXNnZGVmX2l0b2YocC0+dG9wLT5tLCBVUEJfTUFQRU5UUllfVkFMVUUpOwotICBwLT50b3AtPmlzX21hcGVudHJ5ID0gdHJ1ZTsgIC8qIHNldCB1cCB0byBwb3AgZnJhbWUgYWZ0ZXIgdmFsdWUgaXMgcGFyc2VkLiAqLwotICBwLT50b3AtPm1hcGZpZWxkID0gbWFwZmllbGQ7Ci0gIGlmIChwLT50b3AtPmYgPT0gTlVMTCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJtYXBlbnRyeSBtZXNzYWdlIGhhcyBubyB2YWx1ZSIpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZW5kX21lbWJlcm5hbWUodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGFzc2VydCghcC0+dG9wLT5mKTsKLQotICBpZiAocC0+dG9wLT5pc19tYXApIHsKLSAgICByZXR1cm4gaGFuZGxlX21hcGVudHJ5KHApOwotICB9IGVsc2UgewotICAgIHNpemVfdCBsZW47Ci0gICAgY29uc3QgY2hhciAqYnVmID0gYWNjdW11bGF0ZV9nZXRwdHIocCwgJmxlbik7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ2RlZl9udG9mKHAtPnRvcC0+bSwgYnVmLCBsZW4pOwotCi0gICAgaWYgKCFmKSB7Ci0gICAgICAvKiBUT0RPKGhhYmVybWFuKTogSWdub3JlIHVua25vd24gZmllbGRzIGlmIHJlcXVlc3RlZC9jb25maWd1cmVkIHRvIGRvCi0gICAgICAgKiBzby4gKi8KLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLCAiTm8gc3VjaCBmaWVsZDogJS4qc1xuIiwgKGludClsZW4sIGJ1Zik7Ci0gICAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgcC0+dG9wLT5mID0gZjsKLSAgICBtdWx0aXBhcnRfZW5kKHApOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZW5kX21lbWJlcih1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgLyogSWYgd2UganVzdCBwYXJzZWQgYSBtYXAtZW50cnkgdmFsdWUsIGVuZCB0aGF0IGZyYW1lIHRvby4gKi8KLSAgaWYgKHAtPnRvcC0+aXNfbWFwZW50cnkpIHsKLSAgICB1cGJfc3RhdHVzIHMgPSBVUEJfU1RBVFVTX0lOSVQ7Ci0gICAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotICAgIGJvb2wgb2s7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmICptYXBmaWVsZDsKLQotICAgIGFzc2VydChwLT50b3AgPiBwLT5zdGFjayk7Ci0gICAgLyogc2VuZCBFTkRNU0cgb24gc3VibXNnLiAqLwotICAgIHVwYl9zaW5rX2VuZG1zZygmcC0+dG9wLT5zaW5rLCAmcyk7Ci0gICAgbWFwZmllbGQgPSBwLT50b3AtPm1hcGZpZWxkOwotCi0gICAgLyogc2VuZCBFTkRTVUJNU0cgaW4gcmVwZWF0ZWQtZmllbGQtb2YtbWFwZW50cmllcyBmcmFtZS4gKi8KLSAgICBwLT50b3AtLTsKLSAgICBvayA9IHVwYl9oYW5kbGVyc19nZXRzZWxlY3RvcihtYXBmaWVsZCwgVVBCX0hBTkRMRVJfRU5EU1VCTVNHLCAmc2VsKTsKLSAgICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICAgIHVwYl9zaW5rX2VuZHN1Ym1zZygmcC0+dG9wLT5zaW5rLCBzZWwpOwotICB9Ci0KLSAgcC0+dG9wLT5mID0gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgc3RhcnRfc3Vib2JqZWN0KHVwYl9qc29uX3BhcnNlciAqcCkgewotICBhc3NlcnQocC0+dG9wLT5mKTsKLQotICBpZiAodXBiX2ZpZWxkZGVmX2lzbWFwKHAtPnRvcC0+ZikpIHsKLSAgICB1cGJfanNvbnBhcnNlcl9mcmFtZSAqaW5uZXI7Ci0gICAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotCi0gICAgLyogQmVnaW5uaW5nIG9mIGEgbWFwLiBTdGFydCBhIG5ldyBwYXJzZXIgZnJhbWUgaW4gYSByZXBlYXRlZC1maWVsZAotICAgICAqIGNvbnRleHQuICovCi0gICAgaWYgKCFjaGVja19zdGFjayhwKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgaW5uZXIgPSBwLT50b3AgKyAxOwotICAgIHNlbCA9IGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfU1RBUlRTRVEpOwotICAgIHVwYl9zaW5rX3N0YXJ0c2VxKCZwLT50b3AtPnNpbmssIHNlbCwgJmlubmVyLT5zaW5rKTsKLSAgICBpbm5lci0+bSA9IHVwYl9maWVsZGRlZl9tc2dzdWJkZWYocC0+dG9wLT5mKTsKLSAgICBpbm5lci0+bWFwZmllbGQgPSBwLT50b3AtPmY7Ci0gICAgaW5uZXItPmYgPSBOVUxMOwotICAgIGlubmVyLT5pc19tYXAgPSB0cnVlOwotICAgIGlubmVyLT5pc19tYXBlbnRyeSA9IGZhbHNlOwotICAgIHAtPnRvcCA9IGlubmVyOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2lzc3VibXNnKHAtPnRvcC0+ZikpIHsKLSAgICB1cGJfanNvbnBhcnNlcl9mcmFtZSAqaW5uZXI7Ci0gICAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotCi0gICAgLyogQmVnaW5uaW5nIG9mIGEgc3Vib2JqZWN0LiBTdGFydCBhIG5ldyBwYXJzZXIgZnJhbWUgaW4gdGhlIHN1Ym1zZwotICAgICAqIGNvbnRleHQuICovCi0gICAgaWYgKCFjaGVja19zdGFjayhwKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgaW5uZXIgPSBwLT50b3AgKyAxOwotCi0gICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNVQk1TRyk7Ci0gICAgdXBiX3Npbmtfc3RhcnRzdWJtc2coJnAtPnRvcC0+c2luaywgc2VsLCAmaW5uZXItPnNpbmspOwotICAgIGlubmVyLT5tID0gdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihwLT50b3AtPmYpOwotICAgIGlubmVyLT5mID0gTlVMTDsKLSAgICBpbm5lci0+aXNfbWFwID0gZmFsc2U7Ci0gICAgaW5uZXItPmlzX21hcGVudHJ5ID0gZmFsc2U7Ci0gICAgcC0+dG9wID0gaW5uZXI7Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYoJnAtPnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIk9iamVjdCBzcGVjaWZpZWQgZm9yIG5vbi1tZXNzYWdlL2dyb3VwIGZpZWxkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKHAtPnRvcC0+ZikpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZW5kX3N1Ym9iamVjdCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgaWYgKHAtPnRvcC0+aXNfbWFwKSB7Ci0gICAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotICAgIHAtPnRvcC0tOwotICAgIHNlbCA9IGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfRU5EU0VRKTsKLSAgICB1cGJfc2lua19lbmRzZXEoJnAtPnRvcC0+c2luaywgc2VsKTsKLSAgfSBlbHNlIHsKLSAgICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0gICAgcC0+dG9wLS07Ci0gICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9FTkRTVUJNU0cpOwotICAgIHVwYl9zaW5rX2VuZHN1Ym1zZygmcC0+dG9wLT5zaW5rLCBzZWwpOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIHN0YXJ0X2FycmF5KHVwYl9qc29uX3BhcnNlciAqcCkgewotICB1cGJfanNvbnBhcnNlcl9mcmFtZSAqaW5uZXI7Ci0gIHVwYl9zZWxlY3Rvcl90IHNlbDsKLQotICBhc3NlcnQocC0+dG9wLT5mKTsKLQotICBpZiAoIXVwYl9maWVsZGRlZl9pc3NlcShwLT50b3AtPmYpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJBcnJheSBzcGVjaWZpZWQgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShwLT50b3AtPmYpKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFjaGVja19zdGFjayhwKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlubmVyID0gcC0+dG9wICsgMTsKLSAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNFUSk7Ci0gIHVwYl9zaW5rX3N0YXJ0c2VxKCZwLT50b3AtPnNpbmssIHNlbCwgJmlubmVyLT5zaW5rKTsKLSAgaW5uZXItPm0gPSBwLT50b3AtPm07Ci0gIGlubmVyLT5mID0gcC0+dG9wLT5mOwotICBpbm5lci0+aXNfbWFwID0gZmFsc2U7Ci0gIGlubmVyLT5pc19tYXBlbnRyeSA9IGZhbHNlOwotICBwLT50b3AgPSBpbm5lcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgZW5kX2FycmF5KHVwYl9qc29uX3BhcnNlciAqcCkgewotICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0KLSAgYXNzZXJ0KHAtPnRvcCA+IHAtPnN0YWNrKTsKLQotICBwLT50b3AtLTsKLSAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9FTkRTRVEpOwotICB1cGJfc2lua19lbmRzZXEoJnAtPnRvcC0+c2luaywgc2VsKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfb2JqZWN0KHVwYl9qc29uX3BhcnNlciAqcCkgewotICBpZiAoIXAtPnRvcC0+aXNfbWFwKSB7Ci0gICAgdXBiX3Npbmtfc3RhcnRtc2coJnAtPnRvcC0+c2luayk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZW5kX29iamVjdCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgaWYgKCFwLT50b3AtPmlzX21hcCkgewotICAgIHVwYl9zdGF0dXMgc3RhdHVzOwotICAgIHVwYl9zdGF0dXNfY2xlYXIoJnN0YXR1cyk7Ci0gICAgdXBiX3NpbmtfZW5kbXNnKCZwLT50b3AtPnNpbmssICZzdGF0dXMpOwotICAgIGlmICghdXBiX29rKCZzdGF0dXMpKSB7Ci0gICAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnN0YXR1cyk7Ci0gICAgfQotICB9Ci19Ci0KLQotI2RlZmluZSBDSEVDS19SRVRVUk5fVE9QKHgpIGlmICghKHgpKSBnb3RvIGVycm9yCi0KLQotLyogVGhlIGFjdHVhbCBwYXJzZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV2hhdCBmb2xsb3dzIGlzIHRoZSBSYWdlbCBwYXJzZXIgaXRzZWxmLiAgVGhlIGxhbmd1YWdlIGlzIHNwZWNpZmllZCBpbiBSYWdlbAotICogYW5kIHRoZSBhY3Rpb25zIGNhbGwgb3VyIEMgZnVuY3Rpb25zIGFib3ZlLgotICoKLSAqIFJhZ2VsIGhhcyBhbiBleHRlbnNpdmUgc2V0IG9mIGZ1bmN0aW9uYWxpdHksIGFuZCB3ZSB1c2Ugb25seSBhIHNtYWxsIHBhcnQgb2YKLSAqIGl0LiAgVGhlcmUgYXJlIG1hbnkgYWN0aW9uIHR5cGVzIGJ1dCB3ZSBvbmx5IHVzZSBhIGZldzoKLSAqCi0gKiAgICI+IiAtLSB0cmFuc2l0aW9uIGludG8gYSBtYWNoaW5lCi0gKiAgICIlIiAtLSB0cmFuc2l0aW9uIG91dCBvZiBhIG1hY2hpbmUKLSAqICAgIkAiIC0tIHRyYW5zaXRpb24gaW50byBhIGZpbmFsIHN0YXRlIG9mIGEgbWFjaGluZS4KLSAqCi0gKiAiQCIgdHJhbnNpdGlvbnMgYXJlIHRyaWNreSBiZWNhdXNlIGEgbWFjaGluZSBjYW4gdHJhbnNpdGlvbiBpbnRvIGEgZmluYWwKLSAqIHN0YXRlIHJlcGVhdGVkbHkuICBCdXQgaW4gc29tZSBjYXNlcyB3ZSBrbm93IHRoaXMgY2FuJ3QgaGFwcGVuLCBmb3IgZXhhbXBsZQotICogYSBzdHJpbmcgd2hpY2ggaXMgZGVsaW1pdGVkIGJ5IGEgZmluYWwgJyInIGNhbiBvbmx5IHRyYW5zaXRpb24gaW50byBpdHMKLSAqIGZpbmFsIHN0YXRlIG9uY2UsIHdoZW4gdGhlIGNsb3NpbmcgJyInIGlzIHNlZW4uICovCi0KLQotI2xpbmUgMTIxOCAidXBiL2pzb24vcGFyc2VyLnJsIgotCi0KLQotI2xpbmUgMTEzMCAidXBiL2pzb24vcGFyc2VyLmMiCi1zdGF0aWMgY29uc3QgY2hhciBfanNvbl9hY3Rpb25zW10gPSB7Ci0JMCwgMSwgMCwgMSwgMiwgMSwgMywgMSwgCi0JNSwgMSwgNiwgMSwgNywgMSwgOCwgMSwgCi0JMTAsIDEsIDEyLCAxLCAxMywgMSwgMTQsIDEsIAotCTE1LCAxLCAxNiwgMSwgMTcsIDEsIDIxLCAxLCAKLQkyNSwgMSwgMjcsIDIsIDMsIDgsIDIsIDQsIAotCTUsIDIsIDYsIDIsIDIsIDYsIDgsIDIsIAotCTExLCA5LCAyLCAxMywgMTUsIDIsIDE0LCAxNSwgCi0JMiwgMTgsIDEsIDIsIDE5LCAyNywgMiwgMjAsIAotCTksIDIsIDIyLCAyNywgMiwgMjMsIDI3LCAyLCAKLQkyNCwgMjcsIDIsIDI2LCAyNywgMywgMTQsIDExLCAKLQk5Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfanNvbl9rZXlfb2Zmc2V0c1tdID0gewotCTAsIDAsIDQsIDksIDE0LCAxNSwgMTksIDI0LCAKLQkyOSwgMzQsIDM4LCA0MiwgNDUsIDQ4LCA1MCwgNTQsIAotCTU4LCA2MCwgNjIsIDY3LCA2OSwgNzEsIDgwLCA4NiwgCi0JOTIsIDk4LCAxMDQsIDEwNiwgMTE1LCAxMTYsIDExNiwgMTE2LCAKLQkxMjEsIDEyNiwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNSwgCi0JMTM2LCAxMzcsIDEzOCwgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDEsIAotCTE0NiwgMTUxLCAxNTIsIDE1NiwgMTYxLCAxNjYsIDE3MSwgMTc1LCAKLQkxNzUsIDE3OCwgMTc4LCAxNzgKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIF9qc29uX3RyYW5zX2tleXNbXSA9IHsKLQkzMiwgMTIzLCA5LCAxMywgMzIsIDM0LCAxMjUsIDksIAotCTEzLCAzMiwgMzQsIDEyNSwgOSwgMTMsIDM0LCAzMiwgCi0JNTgsIDksIDEzLCAzMiwgOTMsIDEyNSwgOSwgMTMsIAotCTMyLCA0NCwgMTI1LCA5LCAxMywgMzIsIDQ0LCAxMjUsIAotCTksIDEzLCAzMiwgMzQsIDksIDEzLCA0NSwgNDgsIAotCTQ5LCA1NywgNDgsIDQ5LCA1NywgNDYsIDY5LCAxMDEsIAotCTQ4LCA1NywgNjksIDEwMSwgNDgsIDU3LCA0MywgNDUsIAotCTQ4LCA1NywgNDgsIDU3LCA0OCwgNTcsIDQ2LCA2OSwgCi0JMTAxLCA0OCwgNTcsIDM0LCA5MiwgMzQsIDkyLCAzNCwgCi0JNDcsIDkyLCA5OCwgMTAyLCAxMTAsIDExNCwgMTE2LCAxMTcsIAotCTQ4LCA1NywgNjUsIDcwLCA5NywgMTAyLCA0OCwgNTcsIAotCTY1LCA3MCwgOTcsIDEwMiwgNDgsIDU3LCA2NSwgNzAsIAotCTk3LCAxMDIsIDQ4LCA1NywgNjUsIDcwLCA5NywgMTAyLCAKLQkzNCwgOTIsIDM0LCA0NSwgOTEsIDEwMiwgMTEwLCAxMTYsIAotCTEyMywgNDgsIDU3LCAzNCwgMzIsIDkzLCAxMjUsIDksIAotCTEzLCAzMiwgNDQsIDkzLCA5LCAxMywgMzIsIDkzLCAKLQkxMjUsIDksIDEzLCA5NywgMTA4LCAxMTUsIDEwMSwgMTE3LCAKLQkxMDgsIDEwOCwgMTE0LCAxMTcsIDEwMSwgMzIsIDM0LCAxMjUsIAotCTksIDEzLCAzMiwgMzQsIDEyNSwgOSwgMTMsIDM0LCAKLQkzMiwgNTgsIDksIDEzLCAzMiwgOTMsIDEyNSwgOSwgCi0JMTMsIDMyLCA0NCwgMTI1LCA5LCAxMywgMzIsIDQ0LCAKLQkxMjUsIDksIDEzLCAzMiwgMzQsIDksIDEzLCAzMiwgCi0JOSwgMTMsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIF9qc29uX3NpbmdsZV9sZW5ndGhzW10gPSB7Ci0JMCwgMiwgMywgMywgMSwgMiwgMywgMywgCi0JMywgMiwgMiwgMSwgMywgMCwgMiwgMiwgCi0JMCwgMCwgMywgMiwgMiwgOSwgMCwgMCwgCi0JMCwgMCwgMiwgNywgMSwgMCwgMCwgMywgCi0JMywgMywgMSwgMSwgMSwgMSwgMCwgMSwgCi0JMSwgMSwgMCwgMSwgMSwgMSwgMCwgMywgCi0JMywgMSwgMiwgMywgMywgMywgMiwgMCwgCi0JMSwgMCwgMCwgMAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2pzb25fcmFuZ2VfbGVuZ3Roc1tdID0gewotCTAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIAotCTEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIAotCTEsIDEsIDEsIDAsIDAsIDAsIDMsIDMsIAotCTMsIDMsIDAsIDEsIDAsIDAsIDAsIDEsIAotCTEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIAotCTEsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIAotCTEsIDAsIDAsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBfanNvbl9pbmRleF9vZmZzZXRzW10gPSB7Ci0JMCwgMCwgNCwgOSwgMTQsIDE2LCAyMCwgMjUsIAotCTMwLCAzNSwgMzksIDQzLCA0NiwgNTAsIDUyLCA1NiwgCi0JNjAsIDYyLCA2NCwgNjksIDcyLCA3NSwgODUsIDg5LCAKLQk5MywgOTcsIDEwMSwgMTA0LCAxMTMsIDExNSwgMTE2LCAxMTcsIAotCTEyMiwgMTI3LCAxMzIsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQxLCAKLQkxNDMsIDE0NSwgMTQ3LCAxNDgsIDE1MCwgMTUyLCAxNTQsIDE1NSwgCi0JMTYwLCAxNjUsIDE2NywgMTcxLCAxNzYsIDE4MSwgMTg2LCAxOTAsIAotCTE5MSwgMTk0LCAxOTUsIDE5NgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2pzb25faW5kaWNpZXNbXSA9IHsKLQkwLCAyLCAwLCAxLCAzLCA0LCA1LCAzLCAKLQkxLCA2LCA3LCA4LCA2LCAxLCA5LCAxLCAKLQkxMCwgMTEsIDEwLCAxLCAxMSwgMSwgMSwgMTEsIAotCTEyLCAxMywgMTQsIDE1LCAxMywgMSwgMTYsIDE3LCAKLQk4LCAxNiwgMSwgMTcsIDcsIDE3LCAxLCAxOCwgCi0JMTksIDIwLCAxLCAxOSwgMjAsIDEsIDIyLCAyMywgCi0JMjMsIDIxLCAyNCwgMSwgMjMsIDIzLCAyNCwgMjEsIAotCTI1LCAyNSwgMjYsIDEsIDI2LCAxLCAyNiwgMjEsIAotCTIyLCAyMywgMjMsIDIwLCAyMSwgMjgsIDI5LCAyNywgCi0JMzEsIDMyLCAzMCwgMzMsIDMzLCAzMywgMzMsIDMzLCAKLQkzMywgMzMsIDMzLCAzNCwgMSwgMzUsIDM1LCAzNSwgCi0JMSwgMzYsIDM2LCAzNiwgMSwgMzcsIDM3LCAzNywgCi0JMSwgMzgsIDM4LCAzOCwgMSwgNDAsIDQxLCAzOSwgCi0JNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQzLCAKLQkxLCA0OSwgMSwgNTAsIDUxLCA1MywgNTQsIDEsIAotCTUzLCA1MiwgNTUsIDU2LCA1NCwgNTUsIDEsIDU2LCAKLQkxLCAxLCA1NiwgNTIsIDU3LCAxLCA1OCwgMSwgCi0JNTksIDEsIDYwLCAxLCA2MSwgNjIsIDEsIDYzLCAKLQkxLCA2NCwgMSwgNjUsIDY2LCAxLCA2NywgMSwgCi0JNjgsIDEsIDY5LCA3MCwgNzEsIDcyLCA3MCwgMSwgCi0JNzMsIDc0LCA3NSwgNzMsIDEsIDc2LCAxLCA3NywgCi0JNzgsIDc3LCAxLCA3OCwgMSwgMSwgNzgsIDc5LCAKLQk4MCwgODEsIDgyLCA4MCwgMSwgODMsIDg0LCA3NSwgCi0JODMsIDEsIDg0LCA3NCwgODQsIDEsIDg1LCA4NiwgCi0JODYsIDEsIDEsIDEsIDEsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIF9qc29uX3RyYW5zX3RhcmdzW10gPSB7Ci0JMSwgMCwgMiwgMywgNCwgNTYsIDMsIDQsIAotCTU2LCA1LCA1LCA2LCA3LCA4LCA5LCA1NiwgCi0JOCwgOSwgMTEsIDEyLCAxOCwgNTcsIDEzLCAxNSwgCi0JMTQsIDE2LCAxNywgMjAsIDU4LCAyMSwgMjAsIDU4LCAKLQkyMSwgMTksIDIyLCAyMywgMjQsIDI1LCAyNiwgMjAsIAotCTU4LCAyMSwgMjgsIDMwLCAzMSwgMzQsIDM5LCA0MywgCi0JNDcsIDI5LCA1OSwgNTksIDMyLCAzMSwgMjksIDMyLCAKLQkzMywgMzUsIDM2LCAzNywgMzgsIDU5LCA0MCwgNDEsIAotCTQyLCA1OSwgNDQsIDQ1LCA0NiwgNTksIDQ4LCA0OSwgCi0JNTUsIDQ4LCA0OSwgNTUsIDUwLCA1MCwgNTEsIDUyLCAKLQk1MywgNTQsIDU1LCA1MywgNTQsIDU5LCA1NgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2pzb25fdHJhbnNfYWN0aW9uc1tdID0gewotCTAsIDAsIDAsIDIxLCA3NywgNTMsIDAsIDQ3LCAKLQkyMywgMTcsIDAsIDAsIDE1LCAxOSwgMTksIDUwLCAKLQkwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAKLQkwLCAwLCAwLCAzLCAxMywgMCwgMCwgMzUsIAotCTUsIDExLCAwLCAzOCwgNywgNywgNywgNDEsIAotCTQ0LCA5LCA2MiwgNTYsIDI1LCAwLCAwLCAwLCAKLQkzMSwgMjksIDMzLCA1OSwgMTUsIDAsIDI3LCAwLCAKLQkwLCAwLCAwLCAwLCAwLCA2OCwgMCwgMCwgCi0JMCwgNzEsIDAsIDAsIDAsIDY1LCAyMSwgNzcsIAotCTUzLCAwLCA0NywgMjMsIDE3LCAwLCAwLCAxNSwgCi0JMTksIDE5LCA1MCwgMCwgMCwgNzQsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQganNvbl9zdGFydCA9IDE7Ci0KLXN0YXRpYyBjb25zdCBpbnQganNvbl9lbl9udW1iZXJfbWFjaGluZSA9IDEwOwotc3RhdGljIGNvbnN0IGludCBqc29uX2VuX3N0cmluZ19tYWNoaW5lID0gMTk7Ci1zdGF0aWMgY29uc3QgaW50IGpzb25fZW5fdmFsdWVfbWFjaGluZSA9IDI3Owotc3RhdGljIGNvbnN0IGludCBqc29uX2VuX21haW4gPSAxOwotCi0KLSNsaW5lIDEyMjEgInVwYi9qc29uL3BhcnNlci5ybCIKLQotc2l6ZV90IHBhcnNlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB1cGJfanNvbl9wYXJzZXIgKnBhcnNlciA9IGNsb3N1cmU7Ci0KLSAgLyogVmFyaWFibGVzIHVzZWQgYnkgUmFnZWwncyBnZW5lcmF0ZWQgY29kZS4gKi8KLSAgaW50IGNzID0gcGFyc2VyLT5jdXJyZW50X3N0YXRlOwotICBpbnQgKnN0YWNrID0gcGFyc2VyLT5wYXJzZXJfc3RhY2s7Ci0gIGludCB0b3AgPSBwYXJzZXItPnBhcnNlcl90b3A7Ci0KLSAgY29uc3QgY2hhciAqcCA9IGJ1ZjsKLSAgY29uc3QgY2hhciAqcGUgPSBidWYgKyBzaXplOwotCi0gIHBhcnNlci0+aGFuZGxlID0gaGFuZGxlOwotCi0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgY2FwdHVyZV9yZXN1bWUocGFyc2VyLCBidWYpOwotCi0gIAotI2xpbmUgMTMwMSAidXBiL2pzb24vcGFyc2VyLmMiCi0JewotCWludCBfa2xlbjsKLQl1bnNpZ25lZCBpbnQgX3RyYW5zOwotCWNvbnN0IGNoYXIgKl9hY3RzOwotCXVuc2lnbmVkIGludCBfbmFjdHM7Ci0JY29uc3QgY2hhciAqX2tleXM7Ci0KLQlpZiAoIHAgPT0gcGUgKQotCQlnb3RvIF90ZXN0X2VvZjsKLQlpZiAoIGNzID09IDAgKQotCQlnb3RvIF9vdXQ7Ci1fcmVzdW1lOgotCV9rZXlzID0gX2pzb25fdHJhbnNfa2V5cyArIF9qc29uX2tleV9vZmZzZXRzW2NzXTsKLQlfdHJhbnMgPSBfanNvbl9pbmRleF9vZmZzZXRzW2NzXTsKLQotCV9rbGVuID0gX2pzb25fc2luZ2xlX2xlbmd0aHNbY3NdOwotCWlmICggX2tsZW4gPiAwICkgewotCQljb25zdCBjaGFyICpfbG93ZXIgPSBfa2V5czsKLQkJY29uc3QgY2hhciAqX21pZDsKLQkJY29uc3QgY2hhciAqX3VwcGVyID0gX2tleXMgKyBfa2xlbiAtIDE7Ci0JCXdoaWxlICgxKSB7Ci0JCQlpZiAoIF91cHBlciA8IF9sb3dlciApCi0JCQkJYnJlYWs7Ci0KLQkJCV9taWQgPSBfbG93ZXIgKyAoKF91cHBlci1fbG93ZXIpID4+IDEpOwotCQkJaWYgKCAoKnApIDwgKl9taWQgKQotCQkJCV91cHBlciA9IF9taWQgLSAxOwotCQkJZWxzZSBpZiAoICgqcCkgPiAqX21pZCApCi0JCQkJX2xvd2VyID0gX21pZCArIDE7Ci0JCQllbHNlIHsKLQkJCQlfdHJhbnMgKz0gKHVuc2lnbmVkIGludCkoX21pZCAtIF9rZXlzKTsKLQkJCQlnb3RvIF9tYXRjaDsKLQkJCX0KLQkJfQotCQlfa2V5cyArPSBfa2xlbjsKLQkJX3RyYW5zICs9IF9rbGVuOwotCX0KLQotCV9rbGVuID0gX2pzb25fcmFuZ2VfbGVuZ3Roc1tjc107Ci0JaWYgKCBfa2xlbiA+IDAgKSB7Ci0JCWNvbnN0IGNoYXIgKl9sb3dlciA9IF9rZXlzOwotCQljb25zdCBjaGFyICpfbWlkOwotCQljb25zdCBjaGFyICpfdXBwZXIgPSBfa2V5cyArIChfa2xlbjw8MSkgLSAyOwotCQl3aGlsZSAoMSkgewotCQkJaWYgKCBfdXBwZXIgPCBfbG93ZXIgKQotCQkJCWJyZWFrOwotCi0JCQlfbWlkID0gX2xvd2VyICsgKCgoX3VwcGVyLV9sb3dlcikgPj4gMSkgJiB+MSk7Ci0JCQlpZiAoICgqcCkgPCBfbWlkWzBdICkKLQkJCQlfdXBwZXIgPSBfbWlkIC0gMjsKLQkJCWVsc2UgaWYgKCAoKnApID4gX21pZFsxXSApCi0JCQkJX2xvd2VyID0gX21pZCArIDI7Ci0JCQllbHNlIHsKLQkJCQlfdHJhbnMgKz0gKHVuc2lnbmVkIGludCkoKF9taWQgLSBfa2V5cyk+PjEpOwotCQkJCWdvdG8gX21hdGNoOwotCQkJfQotCQl9Ci0JCV90cmFucyArPSBfa2xlbjsKLQl9Ci0KLV9tYXRjaDoKLQlfdHJhbnMgPSBfanNvbl9pbmRpY2llc1tfdHJhbnNdOwotCWNzID0gX2pzb25fdHJhbnNfdGFyZ3NbX3RyYW5zXTsKLQotCWlmICggX2pzb25fdHJhbnNfYWN0aW9uc1tfdHJhbnNdID09IDAgKQotCQlnb3RvIF9hZ2FpbjsKLQotCV9hY3RzID0gX2pzb25fYWN0aW9ucyArIF9qc29uX3RyYW5zX2FjdGlvbnNbX3RyYW5zXTsKLQlfbmFjdHMgPSAodW5zaWduZWQgaW50KSAqX2FjdHMrKzsKLQl3aGlsZSAoIF9uYWN0cy0tID4gMCApCi0JewotCQlzd2l0Y2ggKCAqX2FjdHMrKyApCi0JCXsKLQljYXNlIDA6Ci0jbGluZSAxMTMzICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBwLS07IHtjcyA9IHN0YWNrWy0tdG9wXTsgZ290byBfYWdhaW47fSB9Ci0JYnJlYWs7Ci0JY2FzZSAxOgotI2xpbmUgMTEzNCAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgcC0tOyB7c3RhY2tbdG9wKytdID0gY3M7IGNzID0gMTA7IGdvdG8gX2FnYWluO30gfQotCWJyZWFrOwotCWNhc2UgMjoKLSNsaW5lIDExMzggInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X3RleHQocGFyc2VyLCBwKTsgfQotCWJyZWFrOwotCWNhc2UgMzoKLSNsaW5lIDExMzkgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IENIRUNLX1JFVFVSTl9UT1AoZW5kX3RleHQocGFyc2VyLCBwKSk7IH0KLQlicmVhazsKLQljYXNlIDQ6Ci0jbGluZSAxMTQ1ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBzdGFydF9oZXgocGFyc2VyKTsgfQotCWJyZWFrOwotCWNhc2UgNToKLSNsaW5lIDExNDYgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IGhleGRpZ2l0KHBhcnNlciwgcCk7IH0KLQlicmVhazsKLQljYXNlIDY6Ci0jbGluZSAxMTQ3ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKGVuZF9oZXgocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDc6Ci0jbGluZSAxMTUzICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKGVzY2FwZShwYXJzZXIsIHApKTsgfQotCWJyZWFrOwotCWNhc2UgODoKLSNsaW5lIDExNTkgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHAtLTsge2NzID0gc3RhY2tbLS10b3BdOyBnb3RvIF9hZ2Fpbjt9IH0KLQlicmVhazsKLQljYXNlIDk6Ci0jbGluZSAxMTYyICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyB7c3RhY2tbdG9wKytdID0gY3M7IGNzID0gMTk7IGdvdG8gX2FnYWluO30gfQotCWJyZWFrOwotCWNhc2UgMTA6Ci0jbGluZSAxMTY0ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBwLS07IHtzdGFja1t0b3ArK10gPSBjczsgY3MgPSAyNzsgZ290byBfYWdhaW47fSB9Ci0JYnJlYWs7Ci0JY2FzZSAxMToKLSNsaW5lIDExNjkgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X21lbWJlcihwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxMjoKLSNsaW5lIDExNzAgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IENIRUNLX1JFVFVSTl9UT1AoZW5kX21lbWJlcm5hbWUocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDEzOgotI2xpbmUgMTE3MyAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgZW5kX21lbWJlcihwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxNDoKLSNsaW5lIDExNzkgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X29iamVjdChwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxNToKLSNsaW5lIDExODIgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IGVuZF9vYmplY3QocGFyc2VyKTsgfQotCWJyZWFrOwotCWNhc2UgMTY6Ci0jbGluZSAxMTg4ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKHN0YXJ0X2FycmF5KHBhcnNlcikpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxNzoKLSNsaW5lIDExOTIgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IGVuZF9hcnJheShwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxODoKLSNsaW5lIDExOTcgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X251bWJlcihwYXJzZXIsIHApOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxOToKLSNsaW5lIDExOTggInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IENIRUNLX1JFVFVSTl9UT1AoZW5kX251bWJlcihwYXJzZXIsIHApKTsgfQotCWJyZWFrOwotCWNhc2UgMjA6Ci0jbGluZSAxMjAwICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKHN0YXJ0X3N0cmluZ3ZhbChwYXJzZXIpKTsgfQotCWJyZWFrOwotCWNhc2UgMjE6Ci0jbGluZSAxMjAxICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKGVuZF9zdHJpbmd2YWwocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDIyOgotI2xpbmUgMTIwMyAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgQ0hFQ0tfUkVUVVJOX1RPUChwYXJzZXJfcHV0Ym9vbChwYXJzZXIsIHRydWUpKTsgfQotCWJyZWFrOwotCWNhc2UgMjM6Ci0jbGluZSAxMjA1ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKHBhcnNlcl9wdXRib29sKHBhcnNlciwgZmFsc2UpKTsgfQotCWJyZWFrOwotCWNhc2UgMjQ6Ci0jbGluZSAxMjA3ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyAvKiBudWxsIHZhbHVlICovIH0KLQlicmVhazsKLQljYXNlIDI1OgotI2xpbmUgMTIwOSAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgQ0hFQ0tfUkVUVVJOX1RPUChzdGFydF9zdWJvYmplY3QocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDI2OgotI2xpbmUgMTIxMCAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgZW5kX3N1Ym9iamVjdChwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAyNzoKLSNsaW5lIDEyMTUgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHAtLTsge2NzID0gc3RhY2tbLS10b3BdOyBnb3RvIF9hZ2Fpbjt9IH0KLQlicmVhazsKLSNsaW5lIDE0ODcgInVwYi9qc29uL3BhcnNlci5jIgotCQl9Ci0JfQotCi1fYWdhaW46Ci0JaWYgKCBjcyA9PSAwICkKLQkJZ290byBfb3V0OwotCWlmICggKytwICE9IHBlICkKLQkJZ290byBfcmVzdW1lOwotCV90ZXN0X2VvZjoge30KLQlfb3V0OiB7fQotCX0KLQotI2xpbmUgMTI0MiAidXBiL2pzb24vcGFyc2VyLnJsIgotCi0gIGlmIChwICE9IHBlKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKCZwYXJzZXItPnN0YXR1cywgIlBhcnNlIGVycm9yIGF0ICVzXG4iLCBwKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHBhcnNlci0+ZW52LCAmcGFyc2VyLT5zdGF0dXMpOwotICB9IGVsc2UgewotICAgIGNhcHR1cmVfc3VzcGVuZChwYXJzZXIsICZwKTsKLSAgfQotCi1lcnJvcjoKLSAgLyogU2F2ZSBwYXJzaW5nIHN0YXRlIGJhY2sgdG8gcGFyc2VyLiAqLwotICBwYXJzZXItPmN1cnJlbnRfc3RhdGUgPSBjczsKLSAgcGFyc2VyLT5wYXJzZXJfdG9wID0gdG9wOwotCi0gIHJldHVybiBwIC0gYnVmOwotfQotCi1ib29sIGVuZCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICBVUEJfVU5VU0VEKGNsb3N1cmUpOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICAvKiBQcmV2ZW50IGNvbXBpbGUgd2FybmluZyBvbiB1bnVzZWQgc3RhdGljIGNvbnN0YW50cy4gKi8KLSAgVVBCX1VOVVNFRChqc29uX3N0YXJ0KTsKLSAgVVBCX1VOVVNFRChqc29uX2VuX251bWJlcl9tYWNoaW5lKTsKLSAgVVBCX1VOVVNFRChqc29uX2VuX3N0cmluZ19tYWNoaW5lKTsKLSAgVVBCX1VOVVNFRChqc29uX2VuX3ZhbHVlX21hY2hpbmUpOwotICBVUEJfVU5VU0VEKGpzb25fZW5fbWFpbik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3BhcnNlcl9yZXNldCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgaW50IGNzOwotICBpbnQgdG9wOwotCi0gIHAtPnRvcCA9IHAtPnN0YWNrOwotICBwLT50b3AtPmYgPSBOVUxMOwotICBwLT50b3AtPmlzX21hcCA9IGZhbHNlOwotICBwLT50b3AtPmlzX21hcGVudHJ5ID0gZmFsc2U7Ci0KLSAgLyogRW1pdCBSYWdlbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFyc2VyLiAqLwotICAKLSNsaW5lIDE1NDEgInVwYi9qc29uL3BhcnNlci5jIgotCXsKLQljcyA9IGpzb25fc3RhcnQ7Ci0JdG9wID0gMDsKLQl9Ci0KLSNsaW5lIDEyODIgInVwYi9qc29uL3BhcnNlci5ybCIKLSAgcC0+Y3VycmVudF9zdGF0ZSA9IGNzOwotICBwLT5wYXJzZXJfdG9wID0gdG9wOwotICBhY2N1bXVsYXRlX2NsZWFyKHApOwotICBwLT5tdWx0aXBhcnRfc3RhdGUgPSBNVUxUSVBBUlRfSU5BQ1RJVkU7Ci0gIHAtPmNhcHR1cmUgPSBOVUxMOwotICBwLT5hY2N1bXVsYXRlZCA9IE5VTEw7Ci0gIHVwYl9zdGF0dXNfY2xlYXIoJnAtPnN0YXR1cyk7Ci19Ci0KLQotLyogUHVibGljIEFQSSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdXBiX2pzb25fcGFyc2VyICp1cGJfanNvbl9wYXJzZXJfY3JlYXRlKHVwYl9lbnYgKmVudiwgdXBiX3NpbmsgKm91dHB1dCkgewotI2lmbmRlZiBOREVCVUcKLSAgY29uc3Qgc2l6ZV90IHNpemVfYmVmb3JlID0gdXBiX2Vudl9ieXRlc2FsbG9jYXRlZChlbnYpOwotI2VuZGlmCi0gIHVwYl9qc29uX3BhcnNlciAqcCA9IHVwYl9lbnZfbWFsbG9jKGVudiwgc2l6ZW9mKHVwYl9qc29uX3BhcnNlcikpOwotICBpZiAoIXApIHJldHVybiBmYWxzZTsKLQotICBwLT5lbnYgPSBlbnY7Ci0gIHAtPmxpbWl0ID0gcC0+c3RhY2sgKyBVUEJfSlNPTl9NQVhfREVQVEg7Ci0gIHAtPmFjY3VtdWxhdGVfYnVmID0gTlVMTDsKLSAgcC0+YWNjdW11bGF0ZV9idWZfc2l6ZSA9IDA7Ci0gIHVwYl9ieXRlc2hhbmRsZXJfaW5pdCgmcC0+aW5wdXRfaGFuZGxlcl8pOwotICB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0cmluZygmcC0+aW5wdXRfaGFuZGxlcl8sIHBhcnNlLCBOVUxMKTsKLSAgdXBiX2J5dGVzaGFuZGxlcl9zZXRlbmRzdHIoJnAtPmlucHV0X2hhbmRsZXJfLCBlbmQsIE5VTEwpOwotICB1cGJfYnl0ZXNzaW5rX3Jlc2V0KCZwLT5pbnB1dF8sICZwLT5pbnB1dF9oYW5kbGVyXywgcCk7Ci0KLSAganNvbl9wYXJzZXJfcmVzZXQocCk7Ci0gIHVwYl9zaW5rX3Jlc2V0KCZwLT50b3AtPnNpbmssIG91dHB1dC0+aGFuZGxlcnMsIG91dHB1dC0+Y2xvc3VyZSk7Ci0gIHAtPnRvcC0+bSA9IHVwYl9oYW5kbGVyc19tc2dkZWYob3V0cHV0LT5oYW5kbGVycyk7Ci0KLSAgLyogSWYgdGhpcyBmYWlscywgdW5jb21tZW50IGFuZCBpbmNyZWFzZSB0aGUgdmFsdWUgaW4gcGFyc2VyLmguICovCi0gIC8qIGZwcmludGYoc3RkZXJyLCAiJXpkXG4iLCB1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGVudikgLSBzaXplX2JlZm9yZSk7ICovCi0gIGFzc2VydCh1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGVudikgLSBzaXplX2JlZm9yZSA8PSBVUEJfSlNPTl9QQVJTRVJfU0laRSk7Ci0gIHJldHVybiBwOwotfQotCi11cGJfYnl0ZXNzaW5rICp1cGJfanNvbl9wYXJzZXJfaW5wdXQodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIHJldHVybiAmcC0+aW5wdXRfOwotfQotLyoKLSoqIFRoaXMgY3VycmVudGx5IHVzZXMgc25wcmludGYoKSB0byBmb3JtYXQgcHJpbWl0aXZlcywgYW5kIGNvdWxkIGJlIG9wdGltaXplZAotKiogZnVydGhlci4KLSovCi0KLQotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0KLXN0cnVjdCB1cGJfanNvbl9wcmludGVyIHsKLSAgdXBiX3NpbmsgaW5wdXRfOwotICAvKiBCeXRlc1NpbmsgY2xvc3VyZS4gKi8KLSAgdm9pZCAqc3ViY187Ci0gIHVwYl9ieXRlc3NpbmsgKm91dHB1dF87Ci0KLSAgLyogV2UgdHJhY2sgdGhlIGRlcHRoIHNvIHRoYXQgd2Uga25vdyB3aGVuIHRvIGVtaXQgc3RhcnRzdHIvZW5kc3RyIG9uIHRoZQotICAgKiBvdXRwdXQuICovCi0gIGludCBkZXB0aF87Ci0KLSAgLyogSGF2ZSB3ZSBlbWl0dGVkIHRoZSBmaXJzdCBlbGVtZW50PyBUaGlzIHN0YXRlIGlzIG5lY2Vzc2FyeSB0byBlbWl0IGNvbW1hcwotICAgKiB3aXRob3V0IGxlYXZpbmcgYSB0cmFpbGluZyBjb21tYSBpbiBhcnJheXMvbWFwcy4gV2Uga2VlcCB0aGlzIHN0YXRlIHBlcgotICAgKiBmcmFtZSBkZXB0aC4KLSAgICoKLSAgICogV2h5IG1heF9kZXB0aCAqIDI/IFVQQl9NQVhfSEFORExFUl9ERVBUSCBjb3VudHMgZGVwdGggYXMgbmVzdGVkIG1lc3NhZ2VzLgotICAgKiBXZSBjb3VudCBmcmFtZXMgKGNvbnRleHRzIGluIHdoaWNoIHdlIHNlcGFyYXRlIGVsZW1lbnRzIGJ5IGNvbW1hcykgYXMgYm90aAotICAgKiByZXBlYXRlZCBmaWVsZHMgYW5kIG1lc3NhZ2VzIChtYXBzKSwgYW5kIHRoZSB3b3JzdCBjYXNlIGlzIGEKLSAgICogbWVzc2FnZS0+cmVwZWF0ZWQgZmllbGQtPnN1Ym1lc3NhZ2UtPnJlcGVhdGVkIGZpZWxkLT4uLi4gbmVzdGluZy4gKi8KLSAgYm9vbCBmaXJzdF9lbGVtX1tVUEJfTUFYX0hBTkRMRVJfREVQVEggKiAyXTsKLX07Ci0KLS8qIFN0cmluZ1BpZWNlOyBhIHBvaW50ZXIgcGx1cyBhIGxlbmd0aC4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqcHRyOwotICBzaXplX3QgbGVuOwotfSBzdHJwYzsKLQotc3RycGMgKm5ld3N0cnBjKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHN0cnBjICpyZXQgPSBtYWxsb2Moc2l6ZW9mKCpyZXQpKTsKLSAgcmV0LT5wdHIgPSB1cGJfZmllbGRkZWZfbmFtZShmKTsKLSAgcmV0LT5sZW4gPSBzdHJsZW4ocmV0LT5wdHIpOwotICB1cGJfaGFuZGxlcnNfYWRkY2xlYW51cChoLCByZXQsIGZyZWUpOwotICByZXR1cm4gcmV0OwotfQotCi0vKiAtLS0tLS0tLS0tLS0gSlNPTiBzdHJpbmcgcHJpbnRpbmc6IHZhbHVlcywgbWFwcywgYXJyYXlzIC0tLS0tLS0tLS0tLS0tLS0tLSAqLwotCi1zdGF0aWMgdm9pZCBwcmludF9kYXRhKAotICAgIHVwYl9qc29uX3ByaW50ZXIgKnAsIGNvbnN0IGNoYXIgKmJ1ZiwgdW5zaWduZWQgaW50IGxlbikgewotICAvKiBUT0RPOiBXaWxsIG5lZWQgdG8gY2hhbmdlIGlmIHdlIHN1cHBvcnQgcHVzaGJhY2sgZnJvbSB0aGUgc2luay4gKi8KLSAgc2l6ZV90IG4gPSB1cGJfYnl0ZXNzaW5rX3B1dGJ1ZihwLT5vdXRwdXRfLCBwLT5zdWJjXywgYnVmLCBsZW4sIE5VTEwpOwotICBVUEJfQVNTRVJUX1ZBUihuLCBuID09IGxlbik7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X2NvbW1hKHVwYl9qc29uX3ByaW50ZXIgKnApIHsKLSAgaWYgKCFwLT5maXJzdF9lbGVtX1twLT5kZXB0aF9dKSB7Ci0gICAgcHJpbnRfZGF0YShwLCAiLCIsIDEpOwotICB9Ci0gIHAtPmZpcnN0X2VsZW1fW3AtPmRlcHRoX10gPSBmYWxzZTsKLX0KLQotLyogSGVscGVycyB0aGF0IHByaW50IHByb3Blcmx5IGZvcm1hdHRlZCBlbGVtZW50cyB0byB0aGUgSlNPTiBvdXRwdXQgc3RyZWFtLiAqLwotCi0vKiBVc2VkIGZvciBlc2NhcGluZyBjb250cm9sIGNoYXJzIGluIHN0cmluZ3MuICovCi1zdGF0aWMgY29uc3QgY2hhciBrQ29udHJvbENoYXJMaW1pdCA9IDB4MjA7Ci0KLVVQQl9JTkxJTkUgYm9vbCBpc19qc29uX2VzY2FwZWQoY2hhciBjKSB7Ci0gIC8qIFNlZSBSRkMgNDYyNy4gKi8KLSAgdW5zaWduZWQgY2hhciB1YyA9ICh1bnNpZ25lZCBjaGFyKWM7Ci0gIHJldHVybiB1YyA8IGtDb250cm9sQ2hhckxpbWl0IHx8IHVjID09ICciJyB8fCB1YyA9PSAnXFwnOwotfQotCi1VUEJfSU5MSU5FIGNoYXIqIGpzb25fbmljZV9lc2NhcGUoY2hhciBjKSB7Ci0gIHN3aXRjaCAoYykgewotICAgIGNhc2UgJyInOiAgcmV0dXJuICJcXFwiIjsKLSAgICBjYXNlICdcXCc6IHJldHVybiAiXFxcXCI7Ci0gICAgY2FzZSAnXGInOiByZXR1cm4gIlxcYiI7Ci0gICAgY2FzZSAnXGYnOiByZXR1cm4gIlxcZiI7Ci0gICAgY2FzZSAnXG4nOiByZXR1cm4gIlxcbiI7Ci0gICAgY2FzZSAnXHInOiByZXR1cm4gIlxcciI7Ci0gICAgY2FzZSAnXHQnOiByZXR1cm4gIlxcdCI7Ci0gICAgZGVmYXVsdDogICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi0vKiBXcml0ZSBhIHByb3Blcmx5IGVzY2FwZWQgc3RyaW5nIGNodW5rLiBUaGUgc3Vycm91bmRpbmcgcXVvdGVzIGFyZSAqbm90KgotICogcHJpbnRlZDsgdGhpcyBpcyBzbyB0aGF0IHRoZSBjYWxsZXIgaGFzIHRoZSBvcHRpb24gb2YgZW1pdHRpbmcgdGhlIHN0cmluZwotICogY29udGVudCBpbiBjaHVua3MuICovCi1zdGF0aWMgdm9pZCBwdXRzdHJpbmcodXBiX2pzb25fcHJpbnRlciAqcCwgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKSB7Ci0gIGNvbnN0IGNoYXIqIHVuZXNjYXBlZF9ydW4gPSBOVUxMOwotICB1bnNpZ25lZCBpbnQgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgY2hhciBjID0gYnVmW2ldOwotICAgIC8qIEhhbmRsZSBlc2NhcGluZy4gKi8KLSAgICBpZiAoaXNfanNvbl9lc2NhcGVkKGMpKSB7Ci0gICAgICAvKiBVc2UgYSAibmljZSIgZXNjYXBlLCBsaWtlIFxuLCBpZiBvbmUgZXhpc3RzIGZvciB0aGlzIGNoYXJhY3Rlci4gKi8KLSAgICAgIGNvbnN0IGNoYXIqIGVzY2FwZSA9IGpzb25fbmljZV9lc2NhcGUoYyk7Ci0gICAgICAvKiBJZiB3ZSBkb24ndCBoYXZlIGEgc3BlY2lmaWMgJ25pY2UnIGVzY2FwZSBjb2RlLCB1c2UgYSBcdVhYWFgtc3R5bGUKLSAgICAgICAqIGVzY2FwZS4gKi8KLSAgICAgIGNoYXIgZXNjYXBlX2J1Zls4XTsKLSAgICAgIGlmICghZXNjYXBlKSB7Ci0gICAgICAgIHVuc2lnbmVkIGNoYXIgYnl0ZSA9ICh1bnNpZ25lZCBjaGFyKWM7Ci0gICAgICAgIF91cGJfc25wcmludGYoZXNjYXBlX2J1Ziwgc2l6ZW9mKGVzY2FwZV9idWYpLCAiXFx1JTA0eCIsIChpbnQpYnl0ZSk7Ci0gICAgICAgIGVzY2FwZSA9IGVzY2FwZV9idWY7Ci0gICAgICB9Ci0KLSAgICAgIC8qIE4uQi4gdGhhdCB3ZSBhc3N1bWUgdGhhdCB0aGUgaW5wdXQgZW5jb2RpbmcgaXMgZXF1YWwgdG8gdGhlIG91dHB1dAotICAgICAgICogZW5jb2RpbmcgKGJvdGggVVRGLTggZm9yICBub3cpLCBzbyBmb3IgY2hhcnMgPj0gMHgyMCBhbmQgIT0gXCwgIiwgd2UKLSAgICAgICAqIGNhbiBzaW1wbHkgcGFzcyB0aGUgYnl0ZXMgdGhyb3VnaC4gKi8KLQotICAgICAgLyogSWYgdGhlcmUncyBhIGN1cnJlbnQgcnVuIG9mIHVuZXNjYXBlZCBjaGFycywgcHJpbnQgdGhhdCBydW4gZmlyc3QuICovCi0gICAgICBpZiAodW5lc2NhcGVkX3J1bikgewotICAgICAgICBwcmludF9kYXRhKHAsIHVuZXNjYXBlZF9ydW4sICZidWZbaV0gLSB1bmVzY2FwZWRfcnVuKTsKLSAgICAgICAgdW5lc2NhcGVkX3J1biA9IE5VTEw7Ci0gICAgICB9Ci0gICAgICAvKiBUaGVuIHByaW50IHRoZSBlc2NhcGUgY29kZS4gKi8KLSAgICAgIHByaW50X2RhdGEocCwgZXNjYXBlLCBzdHJsZW4oZXNjYXBlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEFkZCB0byB0aGUgY3VycmVudCB1bmVzY2FwZWQgcnVuIG9mIGNoYXJhY3RlcnMuICovCi0gICAgICBpZiAodW5lc2NhcGVkX3J1biA9PSBOVUxMKSB7Ci0gICAgICAgIHVuZXNjYXBlZF9ydW4gPSAmYnVmW2ldOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIElmIHRoZSBzdHJpbmcgZW5kZWQgaW4gYSBydW4gb2YgdW5lc2NhcGVkIGNoYXJhY3RlcnMsIHByaW50IHRoYXQgbGFzdCBydW4uICovCi0gIGlmICh1bmVzY2FwZWRfcnVuKSB7Ci0gICAgcHJpbnRfZGF0YShwLCB1bmVzY2FwZWRfcnVuLCAmYnVmW2xlbl0gLSB1bmVzY2FwZWRfcnVuKTsKLSAgfQotfQotCi0jZGVmaW5lIENIS0xFTkdUSCh4KSBpZiAoISh4KSkgcmV0dXJuIC0xOwotCi0vKiBIZWxwZXJzIHRoYXQgZm9ybWF0IGZsb2F0aW5nIHBvaW50IHZhbHVlcyBhY2NvcmRpbmcgdG8gb3VyIGN1c3RvbSBmb3JtYXRzLgotICogUmlnaHQgbm93IHdlIHVzZSAlLjhnIGFuZCAlLjE3ZyBmb3IgZmxvYXQvZG91YmxlLCByZXNwZWN0aXZlbHksIHRvIG1hdGNoCi0gKiBwcm90bzI6OnV0aWw6Okpzb25Gb3JtYXQncyBkZWZhdWx0cy4gIE1heSB3YW50IHRvIGNoYW5nZSB0aGlzIGxhdGVyLiAqLwotCi1zdGF0aWMgc2l6ZV90IGZtdF9kb3VibGUoZG91YmxlIHZhbCwgY2hhciogYnVmLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIHNpemVfdCBuID0gX3VwYl9zbnByaW50ZihidWYsIGxlbmd0aCwgIiUuMTdnIiwgdmFsKTsKLSAgQ0hLTEVOR1RIKG4gPiAwICYmIG4gPCBsZW5ndGgpOwotICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHNpemVfdCBmbXRfZmxvYXQoZmxvYXQgdmFsLCBjaGFyKiBidWYsIHNpemVfdCBsZW5ndGgpIHsKLSAgc2l6ZV90IG4gPSBfdXBiX3NucHJpbnRmKGJ1ZiwgbGVuZ3RoLCAiJS44ZyIsIHZhbCk7Ci0gIENIS0xFTkdUSChuID4gMCAmJiBuIDwgbGVuZ3RoKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBzaXplX3QgZm10X2Jvb2woYm9vbCB2YWwsIGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbmd0aCkgewotICBzaXplX3QgbiA9IF91cGJfc25wcmludGYoYnVmLCBsZW5ndGgsICIlcyIsICh2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiKSk7Ci0gIENIS0xFTkdUSChuID4gMCAmJiBuIDwgbGVuZ3RoKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBzaXplX3QgZm10X2ludDY0KGxvbmcgdmFsLCBjaGFyKiBidWYsIHNpemVfdCBsZW5ndGgpIHsKLSAgc2l6ZV90IG4gPSBfdXBiX3NucHJpbnRmKGJ1ZiwgbGVuZ3RoLCAiJWxkIiwgdmFsKTsKLSAgQ0hLTEVOR1RIKG4gPiAwICYmIG4gPCBsZW5ndGgpOwotICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHNpemVfdCBmbXRfdWludDY0KHVuc2lnbmVkIGxvbmcgbG9uZyB2YWwsIGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbmd0aCkgewotICBzaXplX3QgbiA9IF91cGJfc25wcmludGYoYnVmLCBsZW5ndGgsICIlbGx1IiwgdmFsKTsKLSAgQ0hLTEVOR1RIKG4gPiAwICYmIG4gPCBsZW5ndGgpOwotICByZXR1cm4gbjsKLX0KLQotLyogUHJpbnQgYSBtYXAga2V5IGdpdmVuIGEgZmllbGQgbmFtZS4gQ2FsbGVkIGJ5IHNjYWxhciBmaWVsZCBoYW5kbGVycyBhbmQgYnkKLSAqIHN0YXJ0c2VxIGZvciByZXBlYXRlZCBmaWVsZHMuICovCi1zdGF0aWMgYm9vbCBwdXRrZXkodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBjb25zdCBzdHJwYyAqa2V5ID0gaGFuZGxlcl9kYXRhOwotICBwcmludF9jb21tYShwKTsKLSAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgcHV0c3RyaW5nKHAsIGtleS0+cHRyLCBrZXktPmxlbik7Ci0gIHByaW50X2RhdGEocCwgIlwiOiIsIDIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotI2RlZmluZSBDSEtGTVQodmFsKSBpZiAoKHZhbCkgPT0gKHNpemVfdCktMSkgcmV0dXJuIGZhbHNlOwotI2RlZmluZSBDSEsodmFsKSAgICBpZiAoISh2YWwpKSByZXR1cm4gZmFsc2U7Ci0KLSNkZWZpbmUgVFlQRV9IQU5ETEVSUyh0eXBlLCBmbXRfZnVuYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgYm9vbCBwdXQjI3R5cGUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLCB0eXBlIHZhbCkgeyBcCi0gICAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGFyIGRhdGFbNjRdOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHNpemVfdCBsZW5ndGggPSBmbXRfZnVuYyh2YWwsIGRhdGEsIHNpemVvZihkYXRhKSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDSEtGTVQobGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50X2RhdGEocCwgZGF0YSwgbGVuZ3RoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgYm9vbCBzY2FsYXJfIyN0eXBlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSB2YWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDSEsocHV0a2V5KGNsb3N1cmUsIGhhbmRsZXJfZGF0YSkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENISyhwdXQjI3R5cGUoY2xvc3VyZSwgaGFuZGxlcl9kYXRhLCB2YWwpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgYm9vbCByZXBlYXRlZF8jI3R5cGUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLCAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIHZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50X2NvbW1hKHApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0hLKHB1dCMjdHlwZShjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSNkZWZpbmUgVFlQRV9IQU5ETEVSU19NQVBLRVkodHlwZSwgZm10X2Z1bmMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzdGF0aWMgYm9vbCBwdXRtYXBrZXlfIyN0eXBlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSB2YWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50X2RhdGEocCwgIlwiIiwgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0hLKHB1dCMjdHlwZShjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBwcmludF9kYXRhKHAsICJcIjoiLCAyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotVFlQRV9IQU5ETEVSUyhkb3VibGUsICAgZm10X2RvdWJsZSkKLVRZUEVfSEFORExFUlMoZmxvYXQsICAgIGZtdF9mbG9hdCkKLVRZUEVfSEFORExFUlMoYm9vbCwgICAgIGZtdF9ib29sKQotVFlQRV9IQU5ETEVSUyhpbnQzMl90LCAgZm10X2ludDY0KQotVFlQRV9IQU5ETEVSUyh1aW50MzJfdCwgZm10X2ludDY0KQotVFlQRV9IQU5ETEVSUyhpbnQ2NF90LCAgZm10X2ludDY0KQotVFlQRV9IQU5ETEVSUyh1aW50NjRfdCwgZm10X3VpbnQ2NCkKLQotLyogZG91YmxlIGFuZCBmbG9hdCBhcmUgbm90IGFsbG93ZWQgdG8gYmUgbWFwIGtleXMuICovCi1UWVBFX0hBTkRMRVJTX01BUEtFWShib29sLCAgICAgZm10X2Jvb2wpCi1UWVBFX0hBTkRMRVJTX01BUEtFWShpbnQzMl90LCAgZm10X2ludDY0KQotVFlQRV9IQU5ETEVSU19NQVBLRVkodWludDMyX3QsIGZtdF9pbnQ2NCkKLVRZUEVfSEFORExFUlNfTUFQS0VZKGludDY0X3QsICBmbXRfaW50NjQpCi1UWVBFX0hBTkRMRVJTX01BUEtFWSh1aW50NjRfdCwgZm10X3VpbnQ2NCkKLQotI3VuZGVmIFRZUEVfSEFORExFUlMKLSN1bmRlZiBUWVBFX0hBTkRMRVJTX01BUEtFWQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHZvaWQgKmtleW5hbWU7Ci0gIGNvbnN0IHVwYl9lbnVtZGVmICplbnVtZGVmOwotfSBFbnVtSGFuZGxlckRhdGE7Ci0KLXN0YXRpYyBib29sIHNjYWxhcl9lbnVtKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsKSB7Ci0gIGNvbnN0IEVudW1IYW5kbGVyRGF0YSAqaGQgPSBoYW5kbGVyX2RhdGE7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBjb25zdCBjaGFyICpzeW1ib2xpY19uYW1lOwotCi0gIENISyhwdXRrZXkoY2xvc3VyZSwgaGQtPmtleW5hbWUpKTsKLQotICBzeW1ib2xpY19uYW1lID0gdXBiX2VudW1kZWZfaXRvbihoZC0+ZW51bWRlZiwgdmFsKTsKLSAgaWYgKHN5bWJvbGljX25hbWUpIHsKLSAgICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICAgIHB1dHN0cmluZyhwLCBzeW1ib2xpY19uYW1lLCBzdHJsZW4oc3ltYm9saWNfbmFtZSkpOwotICAgIHByaW50X2RhdGEocCwgIlwiIiwgMSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHV0aW50MzJfdChjbG9zdXJlLCBOVUxMLCB2YWwpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHByaW50X2VudW1fc3ltYm9saWNfbmFtZSh1cGJfanNvbl9wcmludGVyICpwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9lbnVtZGVmICpkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwpIHsKLSAgY29uc3QgY2hhciAqc3ltYm9saWNfbmFtZSA9IHVwYl9lbnVtZGVmX2l0b24oZGVmLCB2YWwpOwotICBpZiAoc3ltYm9saWNfbmFtZSkgewotICAgIHByaW50X2RhdGEocCwgIlwiIiwgMSk7Ci0gICAgcHV0c3RyaW5nKHAsIHN5bWJvbGljX25hbWUsIHN0cmxlbihzeW1ib2xpY19uYW1lKSk7Ci0gICAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgfSBlbHNlIHsKLSAgICBwdXRpbnQzMl90KHAsIE5VTEwsIHZhbCk7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgcmVwZWF0ZWRfZW51bSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsKSB7Ci0gIGNvbnN0IEVudW1IYW5kbGVyRGF0YSAqaGQgPSBoYW5kbGVyX2RhdGE7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBwcmludF9jb21tYShwKTsKLQotICBwcmludF9lbnVtX3N5bWJvbGljX25hbWUocCwgaGQtPmVudW1kZWYsIHZhbCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIG1hcHZhbHVlX2VudW0odm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbCkgewotICBjb25zdCBFbnVtSGFuZGxlckRhdGEgKmhkID0gaGFuZGxlcl9kYXRhOwotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLQotICBwcmludF9lbnVtX3N5bWJvbGljX25hbWUocCwgaGQtPmVudW1kZWYsIHZhbCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkICpzY2FsYXJfc3RhcnRzdWJtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHJldHVybiBwdXRrZXkoY2xvc3VyZSwgaGFuZGxlcl9kYXRhKSA/IGNsb3N1cmUgOiBVUEJfQlJFQUs7Ci19Ci0KLXN0YXRpYyB2b2lkICpyZXBlYXRlZF9zdGFydHN1Ym1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcHJpbnRfY29tbWEocCk7Ci0gIHJldHVybiBjbG9zdXJlOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9mcmFtZSh1cGJfanNvbl9wcmludGVyICpwKSB7Ci0gIHAtPmRlcHRoXysrOwotICBwLT5maXJzdF9lbGVtX1twLT5kZXB0aF9dID0gdHJ1ZTsKLSAgcHJpbnRfZGF0YShwLCAieyIsIDEpOwotfQotCi1zdGF0aWMgdm9pZCBlbmRfZnJhbWUodXBiX2pzb25fcHJpbnRlciAqcCkgewotICBwcmludF9kYXRhKHAsICJ9IiwgMSk7Ci0gIHAtPmRlcHRoXy0tOwotfQotCi1zdGF0aWMgYm9vbCBwcmludGVyX3N0YXJ0bXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBpZiAocC0+ZGVwdGhfID09IDApIHsKLSAgICB1cGJfYnl0ZXNzaW5rX3N0YXJ0KHAtPm91dHB1dF8sIDAsICZwLT5zdWJjXyk7Ci0gIH0KLSAgc3RhcnRfZnJhbWUocCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBwcmludGVyX2VuZG1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsIHVwYl9zdGF0dXMgKnMpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgVVBCX1VOVVNFRChzKTsKLSAgZW5kX2ZyYW1lKHApOwotICBpZiAocC0+ZGVwdGhfID09IDApIHsKLSAgICB1cGJfYnl0ZXNzaW5rX2VuZChwLT5vdXRwdXRfKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgKnN0YXJ0c2VxKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgQ0hLKHB1dGtleShjbG9zdXJlLCBoYW5kbGVyX2RhdGEpKTsKLSAgcC0+ZGVwdGhfKys7Ci0gIHAtPmZpcnN0X2VsZW1fW3AtPmRlcHRoX10gPSB0cnVlOwotICBwcmludF9kYXRhKHAsICJbIiwgMSk7Ci0gIHJldHVybiBjbG9zdXJlOwotfQotCi1zdGF0aWMgYm9vbCBlbmRzZXEodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIHByaW50X2RhdGEocCwgIl0iLCAxKTsKLSAgcC0+ZGVwdGhfLS07Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCAqc3RhcnRtYXAodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBDSEsocHV0a2V5KGNsb3N1cmUsIGhhbmRsZXJfZGF0YSkpOwotICBwLT5kZXB0aF8rKzsKLSAgcC0+Zmlyc3RfZWxlbV9bcC0+ZGVwdGhfXSA9IHRydWU7Ci0gIHByaW50X2RhdGEocCwgInsiLCAxKTsKLSAgcmV0dXJuIGNsb3N1cmU7Ci19Ci0KLXN0YXRpYyBib29sIGVuZG1hcCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcHJpbnRfZGF0YShwLCAifSIsIDEpOwotICBwLT5kZXB0aF8tLTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzaXplX3QgcHV0c3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwgY29uc3QgY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLSAgcHV0c3RyaW5nKHAsIHN0ciwgbGVuKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotLyogVGhpcyBoYXMgdG8gQmFzZTY0IGVuY29kZSB0aGUgYnl0ZXMsIGJlY2F1c2UgSlNPTiBoYXMgbm8gImJ5dGVzIiB0eXBlLiAqLwotc3RhdGljIHNpemVfdCBwdXRieXRlcyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsIGNvbnN0IGNoYXIgKnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotCi0gIC8qIFRoaXMgaXMgdGhlIHJlZ3VsYXIgYmFzZTY0LCBub3QgdGhlICJ3ZWItc2FmZSIgdmVyc2lvbi4gKi8KLSAgc3RhdGljIGNvbnN0IGNoYXIgYmFzZTY0W10gPQotICAgICAgIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOwotCi0gIC8qIEJhc2U2NC1lbmNvZGUuICovCi0gIGNoYXIgZGF0YVsxNjAwMF07Ci0gIGNvbnN0IGNoYXIgKmxpbWl0ID0gZGF0YSArIHNpemVvZihkYXRhKTsKLSAgY29uc3QgdW5zaWduZWQgY2hhciAqZnJvbSA9IChjb25zdCB1bnNpZ25lZCBjaGFyKilzdHI7Ci0gIGNoYXIgKnRvID0gZGF0YTsKLSAgc2l6ZV90IHJlbWFpbmluZyA9IGxlbjsKLSAgc2l6ZV90IGJ5dGVzOwotCi0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotCi0gIHdoaWxlIChyZW1haW5pbmcgPiAyKSB7Ci0gICAgLyogVE9ETyhoYWJlcm1hbik6IGhhbmRsZSBlbmNvZGVkIGxlbmd0aHMgPiBzaXplb2YoZGF0YSkgKi8KLSAgICBVUEJfQVNTRVJUX1ZBUihsaW1pdCwgKGxpbWl0IC0gdG8pID49IDQpOwotCi0gICAgdG9bMF0gPSBiYXNlNjRbZnJvbVswXSA+PiAyXTsKLSAgICB0b1sxXSA9IGJhc2U2NFsoKGZyb21bMF0gJiAweDMpIDw8IDQpIHwgKGZyb21bMV0gPj4gNCldOwotICAgIHRvWzJdID0gYmFzZTY0WygoZnJvbVsxXSAmIDB4ZikgPDwgMikgfCAoZnJvbVsyXSA+PiA2KV07Ci0gICAgdG9bM10gPSBiYXNlNjRbZnJvbVsyXSAmIDB4M2ZdOwotCi0gICAgcmVtYWluaW5nIC09IDM7Ci0gICAgdG8gKz0gNDsKLSAgICBmcm9tICs9IDM7Ci0gIH0KLQotICBzd2l0Y2ggKHJlbWFpbmluZykgewotICAgIGNhc2UgMjoKLSAgICAgIHRvWzBdID0gYmFzZTY0W2Zyb21bMF0gPj4gMl07Ci0gICAgICB0b1sxXSA9IGJhc2U2NFsoKGZyb21bMF0gJiAweDMpIDw8IDQpIHwgKGZyb21bMV0gPj4gNCldOwotICAgICAgdG9bMl0gPSBiYXNlNjRbKGZyb21bMV0gJiAweGYpIDw8IDJdOwotICAgICAgdG9bM10gPSAnPSc7Ci0gICAgICB0byArPSA0OwotICAgICAgZnJvbSArPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAxOgotICAgICAgdG9bMF0gPSBiYXNlNjRbZnJvbVswXSA+PiAyXTsKLSAgICAgIHRvWzFdID0gYmFzZTY0WygoZnJvbVswXSAmIDB4MykgPDwgNCldOwotICAgICAgdG9bMl0gPSAnPSc7Ci0gICAgICB0b1szXSA9ICc9JzsKLSAgICAgIHRvICs9IDQ7Ci0gICAgICBmcm9tICs9IDE7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIGJ5dGVzID0gdG8gLSBkYXRhOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICBwdXRzdHJpbmcocCwgZGF0YSwgYnl0ZXMpOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgdm9pZCAqc2NhbGFyX3N0YXJ0c3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBVUEJfVU5VU0VEKHNpemVfaGludCk7Ci0gIENISyhwdXRrZXkoY2xvc3VyZSwgaGFuZGxlcl9kYXRhKSk7Ci0gIHByaW50X2RhdGEocCwgIlwiIiwgMSk7Ci0gIHJldHVybiBwOwotfQotCi1zdGF0aWMgc2l6ZV90IHNjYWxhcl9zdHIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgQ0hLKHB1dHN0cihjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHN0ciwgbGVuLCBoYW5kbGUpKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGJvb2wgc2NhbGFyX2VuZHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkICpyZXBlYXRlZF9zdGFydHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBVUEJfVU5VU0VEKHNpemVfaGludCk7Ci0gIHByaW50X2NvbW1hKHApOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICByZXR1cm4gcDsKLX0KLQotc3RhdGljIHNpemVfdCByZXBlYXRlZF9zdHIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIENISyhwdXRzdHIoY2xvc3VyZSwgaGFuZGxlcl9kYXRhLCBzdHIsIGxlbiwgaGFuZGxlKSk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBib29sIHJlcGVhdGVkX2VuZHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkICptYXBrZXl2YWxfc3RhcnRzdHIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIFVQQl9VTlVTRUQoc2l6ZV9oaW50KTsKLSAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBzaXplX3QgbWFwa2V5X3N0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICBDSEsocHV0c3RyKGNsb3N1cmUsIGhhbmRsZXJfZGF0YSwgc3RyLCBsZW4sIGhhbmRsZSkpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgYm9vbCBtYXBrZXlfZW5kc3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBwcmludF9kYXRhKHAsICJcIjoiLCAyKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIG1hcHZhbHVlX2VuZHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgc2NhbGFyX2J5dGVzKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICBDSEsocHV0a2V5KGNsb3N1cmUsIGhhbmRsZXJfZGF0YSkpOwotICBDSEsocHV0Ynl0ZXMoY2xvc3VyZSwgaGFuZGxlcl9kYXRhLCBzdHIsIGxlbiwgaGFuZGxlKSk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBzaXplX3QgcmVwZWF0ZWRfYnl0ZXModm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgcHJpbnRfY29tbWEocCk7Ci0gIENISyhwdXRieXRlcyhjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHN0ciwgbGVuLCBoYW5kbGUpKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNpemVfdCBtYXBrZXlfYnl0ZXModm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBDSEsocHV0Ynl0ZXMoY2xvc3VyZSwgaGFuZGxlcl9kYXRhLCBzdHIsIGxlbiwgaGFuZGxlKSk7Ci0gIHByaW50X2RhdGEocCwgIjoiLCAxKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHZvaWQgc2V0X2VudW1faGQodXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIEVudW1IYW5kbGVyRGF0YSAqaGQgPSBtYWxsb2Moc2l6ZW9mKEVudW1IYW5kbGVyRGF0YSkpOwotICBoZC0+ZW51bWRlZiA9IChjb25zdCB1cGJfZW51bWRlZiAqKXVwYl9maWVsZGRlZl9zdWJkZWYoZik7Ci0gIGhkLT5rZXluYW1lID0gbmV3c3RycGMoaCwgZik7Ci0gIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKGgsIGhkLCBmcmVlKTsKLSAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKGF0dHIsIGhkKTsKLX0KLQotLyogU2V0IHVwIGhhbmRsZXJzIGZvciBhIG1hcGVudHJ5IHN1Ym1lc3NhZ2UgKGkuZS4sIGFuIGluZGl2aWR1YWwga2V5L3ZhbHVlIHBhaXIKLSAqIGluIGEgbWFwKS4KLSAqCi0gKiBUT0RPOiBIYW5kbGUgbWlzc2luZyBrZXksIG1pc3NpbmcgdmFsdWUsIG91dC1vZi1vcmRlciBrZXkvdmFsdWUsIG9yIHJlcGVhdGVkCi0gKiBrZXkgb3IgdmFsdWUgY2FzZXMgcHJvcGVybHkuIFRoZSByaWdodCB3YXkgdG8gZG8gdGhpcyBpcyB0byBhbGxvY2F0ZSBhCi0gKiB0ZW1wb3Jhcnkgc3RydWN0dXJlIGF0IHRoZSBzdGFydCBvZiBhIG1hcGVudHJ5IHN1Ym1lc3NhZ2UsIHN0b3JlIGtleSBhbmQKLSAqIHZhbHVlIGRhdGEgaW4gaXQgYXMga2V5IGFuZCB2YWx1ZSBoYW5kbGVycyBhcmUgY2FsbGVkLCBhbmQgdGhlbiBwcmludCB0aGUKLSAqIGtleS92YWx1ZSBwYWlyIG9uY2UgYXQgdGhlIGVuZCBvZiB0aGUgc3VibWVzc2FnZS4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UKLSAqIHNob3VsZCBhdCBsZWFzdCBkZXRlY3QgdGhlIGNhc2UgYW5kIHRocm93IGFuIGVycm9yLiBIb3dldmVyLCBzbyBmYXIgYWxsIG9mCi0gKiBvdXIgc291cmNlcyB0aGF0IGVtaXQgbWFwZW50cnkgbWVzc2FnZXMgZG8gc28gY2Fub25pY2FsbHkgKHdpdGggb25lIGtleQotICogZmllbGQsIGFuZCB0aGVuIG9uZSB2YWx1ZSBmaWVsZCksIHNvIHRoaXMgaXMgbm90IGEgcHJlc3NpbmcgY29uY2VybiBhdCB0aGUKLSAqIG1vbWVudC4gKi8KLXZvaWQgcHJpbnRlcl9zZXRoYW5kbGVyc19tYXBlbnRyeShjb25zdCB2b2lkICpjbG9zdXJlLCB1cGJfaGFuZGxlcnMgKmgpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbWQgPSB1cGJfaGFuZGxlcnNfbXNnZGVmKGgpOwotCi0gIC8qIEEgbWFwZW50cnkgbWVzc2FnZSBpcyBwcmludGVkIHNpbXBseSBhcyAnImtleSI6IHZhbHVlJy4gUmF0aGVyIHRoYW4KLSAgICogc3BlY2lhbC1jYXNlIGtleSBhbmQgdmFsdWUgZm9yIGV2ZXJ5IHR5cGUgYmVsb3csIHdlIGp1c3QgaGFuZGxlIGJvdGgKLSAgICogZmllbGRzIGV4cGxpY2l0bHkgaGVyZS4gKi8KLSAgY29uc3QgdXBiX2ZpZWxkZGVmKiBrZXlfZmllbGQgPSB1cGJfbXNnZGVmX2l0b2YobWQsIFVQQl9NQVBFTlRSWV9LRVkpOwotICBjb25zdCB1cGJfZmllbGRkZWYqIHZhbHVlX2ZpZWxkID0gdXBiX21zZ2RlZl9pdG9mKG1kLCBVUEJfTUFQRU5UUllfVkFMVUUpOwotCi0gIHVwYl9oYW5kbGVyYXR0ciBlbXB0eV9hdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotCi0gIFVQQl9VTlVTRUQoY2xvc3VyZSk7Ci0KLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShrZXlfZmllbGQpKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRpbnQzMihoLCBrZXlfZmllbGQsIHB1dG1hcGtleV9pbnQzMl90LCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDY0OgotICAgICAgdXBiX2hhbmRsZXJzX3NldGludDY0KGgsIGtleV9maWVsZCwgcHV0bWFwa2V5X2ludDY0X3QsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgICAgdXBiX2hhbmRsZXJzX3NldHVpbnQzMihoLCBrZXlfZmllbGQsIHB1dG1hcGtleV91aW50MzJfdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0dWludDY0KGgsIGtleV9maWVsZCwgcHV0bWFwa2V5X3VpbnQ2NF90LCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0JPT0w6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0Ym9vbChoLCBrZXlfZmllbGQsIHB1dG1hcGtleV9ib29sLCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN0cihoLCBrZXlfZmllbGQsIG1hcGtleXZhbF9zdGFydHN0ciwgJmVtcHR5X2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBrZXlfZmllbGQsIG1hcGtleV9zdHIsICZlbXB0eV9hdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdHIoaCwga2V5X2ZpZWxkLCBtYXBrZXlfZW5kc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBrZXlfZmllbGQsIG1hcGtleV9ieXRlcywgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICBicmVhazsKLSAgfQotCi0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUodmFsdWVfZmllbGQpKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRpbnQzMihoLCB2YWx1ZV9maWVsZCwgcHV0aW50MzJfdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRpbnQ2NChoLCB2YWx1ZV9maWVsZCwgcHV0aW50NjRfdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0dWludDMyKGgsIHZhbHVlX2ZpZWxkLCBwdXR1aW50MzJfdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0dWludDY0KGgsIHZhbHVlX2ZpZWxkLCBwdXR1aW50NjRfdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOgotICAgICAgdXBiX2hhbmRsZXJzX3NldGJvb2woaCwgdmFsdWVfZmllbGQsIHB1dGJvb2wsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfRkxPQVQ6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0ZmxvYXQoaCwgdmFsdWVfZmllbGQsIHB1dGZsb2F0LCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRToKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRkb3VibGUoaCwgdmFsdWVfZmllbGQsIHB1dGRvdWJsZSwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgdmFsdWVfZmllbGQsIG1hcGtleXZhbF9zdGFydHN0ciwgJmVtcHR5X2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCB2YWx1ZV9maWVsZCwgcHV0c3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0ZW5kc3RyKGgsIHZhbHVlX2ZpZWxkLCBtYXB2YWx1ZV9lbmRzdHIsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIHZhbHVlX2ZpZWxkLCBwdXRieXRlcywgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9FTlVNOiB7Ci0gICAgICB1cGJfaGFuZGxlcmF0dHIgZW51bV9hdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICAgICAgc2V0X2VudW1faGQoaCwgdmFsdWVfZmllbGQsICZlbnVtX2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIHZhbHVlX2ZpZWxkLCBtYXB2YWx1ZV9lbnVtLCAmZW51bV9hdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmVudW1fYXR0cik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOgotICAgICAgLyogTm8gaGFuZGxlciBuZWNlc3NhcnkgLS0gdGhlIHN1Ym1zZyBoYW5kbGVycyB3aWxsIHByaW50IHRoZSBtZXNzYWdlCi0gICAgICAgKiBhcyBhcHByb3ByaWF0ZS4gKi8KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmZW1wdHlfYXR0cik7Ci19Ci0KLXZvaWQgcHJpbnRlcl9zZXRoYW5kbGVycyhjb25zdCB2b2lkICpjbG9zdXJlLCB1cGJfaGFuZGxlcnMgKmgpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbWQgPSB1cGJfaGFuZGxlcnNfbXNnZGVmKGgpOwotICBib29sIGlzX21hcGVudHJ5ID0gdXBiX21zZ2RlZl9tYXBlbnRyeShtZCk7Ci0gIHVwYl9oYW5kbGVyYXR0ciBlbXB0eV9hdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLQotICBVUEJfVU5VU0VEKGNsb3N1cmUpOwotCi0gIGlmIChpc19tYXBlbnRyeSkgewotICAgIC8qIG1hcGVudHJ5IG1lc3NhZ2VzIGFyZSBzdWZmaWNpZW50bHkgZGlmZmVyZW50IHRoYXQgd2UgaGFuZGxlIHRoZW0KLSAgICAgKiBzZXBhcmF0ZWx5LiAqLwotICAgIHByaW50ZXJfc2V0aGFuZGxlcnNfbWFwZW50cnkoY2xvc3VyZSwgaCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKGgsIHByaW50ZXJfc3RhcnRtc2csICZlbXB0eV9hdHRyKTsKLSAgdXBiX2hhbmRsZXJzX3NldGVuZG1zZyhoLCBwcmludGVyX2VuZG1zZywgJmVtcHR5X2F0dHIpOwotCi0jZGVmaW5lIFRZUEUodHlwZSwgbmFtZSwgY3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgdHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB1cGJfaGFuZGxlcnNfc2V0IyNuYW1lKGgsIGYsIHJlcGVhdGVkXyMjY3R5cGUsICZlbXB0eV9hdHRyKTsgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB1cGJfaGFuZGxlcnNfc2V0IyNuYW1lKGgsIGYsIHNjYWxhcl8jI2N0eXBlLCAmbmFtZV9hdHRyKTsgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYnJlYWs7Ci0KLSAgdXBiX21zZ19maWVsZF9iZWdpbigmaSwgbWQpOwotICBmb3IoOyAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0KLSAgICB1cGJfaGFuZGxlcmF0dHIgbmFtZV9hdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICAgIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmbmFtZV9hdHRyLCBuZXdzdHJwYyhoLCBmKSk7Ci0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2lzbWFwKGYpKSB7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzZXEoaCwgZiwgc3RhcnRtYXAsICZuYW1lX2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHNlcShoLCBmLCBlbmRtYXAsICZuYW1lX2F0dHIpOwotICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzZXEoaCwgZiwgc3RhcnRzZXEsICZuYW1lX2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHNlcShoLCBmLCBlbmRzZXEsICZlbXB0eV9hdHRyKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKGYpKSB7Ci0gICAgICBUWVBFKFVQQl9UWVBFX0ZMT0FULCAgZmxvYXQsICBmbG9hdCk7Ci0gICAgICBUWVBFKFVQQl9UWVBFX0RPVUJMRSwgZG91YmxlLCBkb3VibGUpOwotICAgICAgVFlQRShVUEJfVFlQRV9CT09MLCAgIGJvb2wsICAgYm9vbCk7Ci0gICAgICBUWVBFKFVQQl9UWVBFX0lOVDMyLCAgaW50MzIsICBpbnQzMl90KTsKLSAgICAgIFRZUEUoVVBCX1RZUEVfVUlOVDMyLCB1aW50MzIsIHVpbnQzMl90KTsKLSAgICAgIFRZUEUoVVBCX1RZUEVfSU5UNjQsICBpbnQ2NCwgIGludDY0X3QpOwotICAgICAgVFlQRShVUEJfVFlQRV9VSU5UNjQsIHVpbnQ2NCwgdWludDY0X3QpOwotICAgICAgY2FzZSBVUEJfVFlQRV9FTlVNOiB7Ci0gICAgICAgIC8qIEZvciBub3csIHdlIGFsd2F5cyBlbWl0IHN5bWJvbGljIG5hbWVzIGZvciBlbnVtcy4gV2UgbWF5IHdhbnQgYW4KLSAgICAgICAgICogb3B0aW9uIGxhdGVyIHRvIGNvbnRyb2wgdGhpcyBiZWhhdmlvciwgYnV0IHdlIHdpbGwgd2FpdCBmb3IgYSByZWFsCi0gICAgICAgICAqIG5lZWQgZmlyc3QuICovCi0gICAgICAgIHVwYl9oYW5kbGVyYXR0ciBlbnVtX2F0dHIgPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0gICAgICAgIHNldF9lbnVtX2hkKGgsIGYsICZlbnVtX2F0dHIpOwotCi0gICAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwgZiwgcmVwZWF0ZWRfZW51bSwgJmVudW1fYXR0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIGYsIHNjYWxhcl9lbnVtLCAmZW51bV9hdHRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmVudW1fYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgZiwgcmVwZWF0ZWRfc3RhcnRzdHIsICZlbXB0eV9hdHRyKTsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIGYsIHJlcGVhdGVkX3N0ciwgJmVtcHR5X2F0dHIpOwotICAgICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdHIoaCwgZiwgcmVwZWF0ZWRfZW5kc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3RyKGgsIGYsIHNjYWxhcl9zdGFydHN0ciwgJm5hbWVfYXR0cik7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBmLCBzY2FsYXJfc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHN0cihoLCBmLCBzY2FsYXJfZW5kc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgICAvKiBYWFg6IHRoaXMgZG9lc24ndCBzdXBwb3J0IHN0cmluZ3MgdGhhdCBzcGFuIGJ1ZmZlcnMgeWV0LiBUaGUgYmFzZTY0Ci0gICAgICAgICAqIGVuY29kZXIgd2lsbCBuZWVkIHRvIGJlIG1hZGUgcmVzdW1hYmxlIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkuICovCi0gICAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIGYsIHJlcGVhdGVkX2J5dGVzLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBmLCBzY2FsYXJfYnl0ZXMsICZuYW1lX2F0dHIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3VibXNnKGgsIGYsIHJlcGVhdGVkX3N0YXJ0c3VibXNnLCAmbmFtZV9hdHRyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2coaCwgZiwgc2NhbGFyX3N0YXJ0c3VibXNnLCAmbmFtZV9hdHRyKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB1cGJfaGFuZGxlcmF0dHJfdW5pbml0KCZuYW1lX2F0dHIpOwotICB9Ci0KLSAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmZW1wdHlfYXR0cik7Ci0jdW5kZWYgVFlQRQotfQotCi1zdGF0aWMgdm9pZCBqc29uX3ByaW50ZXJfcmVzZXQodXBiX2pzb25fcHJpbnRlciAqcCkgewotICBwLT5kZXB0aF8gPSAwOwotfQotCi0KLS8qIFB1YmxpYyBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVwYl9qc29uX3ByaW50ZXIgKnVwYl9qc29uX3ByaW50ZXJfY3JlYXRlKHVwYl9lbnYgKmUsIGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ieXRlc3NpbmsgKm91dHB1dCkgewotI2lmbmRlZiBOREVCVUcKLSAgc2l6ZV90IHNpemVfYmVmb3JlID0gdXBiX2Vudl9ieXRlc2FsbG9jYXRlZChlKTsKLSNlbmRpZgotCi0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSB1cGJfZW52X21hbGxvYyhlLCBzaXplb2YodXBiX2pzb25fcHJpbnRlcikpOwotICBpZiAoIXApIHJldHVybiBOVUxMOwotCi0gIHAtPm91dHB1dF8gPSBvdXRwdXQ7Ci0gIGpzb25fcHJpbnRlcl9yZXNldChwKTsKLSAgdXBiX3NpbmtfcmVzZXQoJnAtPmlucHV0XywgaCwgcCk7Ci0KLSAgLyogSWYgdGhpcyBmYWlscywgaW5jcmVhc2UgdGhlIHZhbHVlIGluIHByaW50ZXIuaC4gKi8KLSAgYXNzZXJ0KHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQoZSkgLSBzaXplX2JlZm9yZSA8PSBVUEJfSlNPTl9QUklOVEVSX1NJWkUpOwotICByZXR1cm4gcDsKLX0KLQotdXBiX3NpbmsgKnVwYl9qc29uX3ByaW50ZXJfaW5wdXQodXBiX2pzb25fcHJpbnRlciAqcCkgewotICByZXR1cm4gJnAtPmlucHV0XzsKLX0KLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfanNvbl9wcmludGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm1kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfbmV3ZnJvemVuKG1kLCBvd25lciwgcHJpbnRlcl9zZXRoYW5kbGVycywgTlVMTCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9waHAvZXh0L2dvb2dsZS9wcm90b2J1Zi91cGIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL3VwYi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNzhlMmEyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC9leHQvZ29vZ2xlL3Byb3RvYnVmL3VwYi5oCisrKyAvZGV2L251bGwKQEAgLTEsODIxNyArMCwwIEBACi0vLyBBbWFsZ2FtYXRlZCBzb3VyY2UgZmlsZQotLyoKLSoqIERlZnMgYXJlIHVwYidzIGludGVybmFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBjb25zdHJ1Y3RzIHRoYXQgY2FuIGFwcGVhcgotKiogaW4gYSAucHJvdG8gZmlsZToKLSoqCi0qKiAtIHVwYjo6TWVzc2FnZURlZiAodXBiX21zZ2RlZik6IGRlc2NyaWJlcyBhICJtZXNzYWdlIiBjb25zdHJ1Y3QuCi0qKiAtIHVwYjo6RmllbGREZWYgKHVwYl9maWVsZGRlZik6IGRlc2NyaWJlcyBhIG1lc3NhZ2UgZmllbGQuCi0qKiAtIHVwYjo6RW51bURlZiAodXBiX2VudW1kZWYpOiBkZXNjcmliZXMgYW4gZW51bS4KLSoqIC0gdXBiOjpPbmVvZkRlZiAodXBiX29uZW9mZGVmKTogZGVzY3JpYmVzIGEgb25lb2YuCi0qKiAtIHVwYjo6RGVmICh1cGJfZGVmKTogYmFzZSBjbGFzcyBvZiBhbGwgdGhlIG90aGVycy4KLSoqCi0qKiBUT0RPOiBkZWZpbml0aW9ucyBvZiBzZXJ2aWNlcy4KLSoqCi0qKiBMaWtlIHVwYl9yZWZjb3VudGVkIG9iamVjdHMsIGRlZnMgYXJlIG11dGFibGUgb25seSB1bnRpbCBmcm96ZW4sIGFuZCBhcmUKLSoqIG9ubHkgdGhyZWFkLXNhZmUgb25jZSBmcm96ZW4uCi0qKgotKiogVGhpcyBpcyBhIG1peGVkIEMvQysrIGludGVyZmFjZSB0aGF0IG9mZmVycyBhIGZ1bGwgQVBJIHRvIGJvdGggbGFuZ3VhZ2VzLgotKiogU2VlIHRoZSB0b3AtbGV2ZWwgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uLgotKi8KLQotI2lmbmRlZiBVUEJfREVGX0hfCi0jZGVmaW5lIFVQQl9ERUZfSF8KLQotLyoKLSoqIHVwYjo6UmVmQ291bnRlZCAodXBiX3JlZmNvdW50ZWQpCi0qKgotKiogQSByZWZjb3VudGluZyBzY2hlbWUgdGhhdCBzdXBwb3J0cyBjaXJjdWxhciByZWZzLiAgSXQgYWNjb21wbGlzaGVzIHRoaXMgYnkKLSoqIHBhcnRpdGlvbmluZyB0aGUgc2V0IG9mIG9iamVjdHMgaW50byBncm91cHMgc3VjaCB0aGF0IG5vIGN5Y2xlIHNwYW5zIGdyb3VwczsKLSoqIHdlIGNhbiB0aGVuIHJlZmVyZW5jZS1jb3VudCB0aGUgZ3JvdXAgYXMgYSB3aG9sZSBhbmQgaWdub3JlIHJlZnMgd2l0aGluIHRoZQotKiogZ3JvdXAuICBXaGVuIG9iamVjdHMgYXJlIG11dGFibGUsIHRoZXNlIGdyb3VwcyBhcmUgY29tcHV0ZWQgdmVyeQotKiogY29uc2VydmF0aXZlbHk7IHdlIGdyb3VwIGFueSBvYmplY3RzIHRoYXQgaGF2ZSBldmVyIGhhZCBhIGxpbmsgYmV0d2VlbiB0aGVtLgotKiogV2hlbiBvYmplY3RzIGFyZSBmcm96ZW4sIHdlIGNvbXB1dGUgc3Ryb25nbHktY29ubmVjdGVkIGNvbXBvbmVudHMgd2hpY2gKLSoqIGFsbG93cyB1cyB0byBiZSBwcmVjaXNlIGFuZCBvbmx5IGdyb3VwIG9iamVjdHMgdGhhdCBhcmUgYWN0dWFsbHkgY3ljbGljLgotKioKLSoqIFRoaXMgaXMgYSBtaXhlZCBDL0MrKyBpbnRlcmZhY2UgdGhhdCBvZmZlcnMgYSBmdWxsIEFQSSB0byBib3RoIGxhbmd1YWdlcy4KLSoqIFNlZSB0aGUgdG9wLWxldmVsIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSovCi0KLSNpZm5kZWYgVVBCX1JFRkNPVU5URURfSF8KLSNkZWZpbmUgVVBCX1JFRkNPVU5URURfSF8KLQotLyoKLSoqIHVwYl90YWJsZQotKioKLSoqIFRoaXMgaGVhZGVyIGlzIElOVEVSTkFMLU9OTFkhICBJdHMgaW50ZXJmYWNlcyBhcmUgbm90IHB1YmxpYyBvciBzdGFibGUhCi0qKiBUaGlzIGZpbGUgZGVmaW5lcyB2ZXJ5IGZhc3QgaW50LT51cGJfdmFsdWUgKGludHRhYmxlKSBhbmQgc3RyaW5nLT51cGJfdmFsdWUKLSoqIChzdHJ0YWJsZSkgaGFzaCB0YWJsZXMuCi0qKgotKiogVGhlIHRhYmxlIHVzZXMgY2hhaW5lZCBzY2F0dGVyIHdpdGggQnJlbnQncyB2YXJpYXRpb24gKGluc3BpcmVkIGJ5IHRoZSBMdWEKLSoqIGltcGxlbWVudGF0aW9uIG9mIGhhc2ggdGFibGVzKS4gIFRoZSBoYXNoIGZ1bmN0aW9uIGZvciBzdHJpbmdzIGlzIEF1c3RpbgotKiogQXBwbGVieSdzICJNdXJtdXJIYXNoLiIKLSoqCi0qKiBUaGUgaW50dGFibGUgdXNlcyB1aW50cHRyX3QgYXMgaXRzIGtleSwgd2hpY2ggZ3VhcmFudGVlcyBpdCBjYW4gYmUgdXNlZCB0bwotKiogc3RvcmUgcG9pbnRlcnMgb3IgaW50ZWdlcnMgb2YgYXQgbGVhc3QgMzIgYml0cyAodXBiIGlzbid0IHJlYWxseSB1c2VmdWwgb24KLSoqIHN5c3RlbXMgd2hlcmUgc2l6ZW9mKHZvaWQqKSA8IDQpLgotKioKLSoqIFRoZSB0YWJsZSBtdXN0IGJlIGhvbW9nZW5vdXMgKGFsbCB2YWx1ZXMgb2YgdGhlIHNhbWUgdHlwZSkuICBJbiBkZWJ1ZwotKiogbW9kZSwgd2UgY2hlY2sgdGhpcyBvbiBpbnNlcnQgYW5kIGxvb2t1cC4KLSovCi0KLSNpZm5kZWYgVVBCX1RBQkxFX0hfCi0jZGVmaW5lIFVQQl9UQUJMRV9IXwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0vKgotKiogVGhpcyBmaWxlIGNvbnRhaW5zIHNoYXJlZCBkZWZpbml0aW9ucyB0aGF0IGFyZSB3aWRlbHkgdXNlZCBhY3Jvc3MgdXBiLgotKioKLSoqIFRoaXMgaXMgYSBtaXhlZCBDL0MrKyBpbnRlcmZhY2UgdGhhdCBvZmZlcnMgYSBmdWxsIEFQSSB0byBib3RoIGxhbmd1YWdlcy4KLSoqIFNlZSB0aGUgdG9wLWxldmVsIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSovCi0KLSNpZm5kZWYgVVBCX0hfCi0jZGVmaW5lIFVQQl9IXwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkYm9vbC5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotCi0vKiBVUEJfSU5MSU5FOiBpbmxpbmUgaWYgcG9zc2libGUsIGVtaXQgc3RhbmRhbG9uZSBjb2RlIGlmIHJlcXVpcmVkLiAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIFVQQl9JTkxJTkUgaW5saW5lCi0jZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKLSNkZWZpbmUgVVBCX0lOTElORSBzdGF0aWMgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgVVBCX0lOTElORSBzdGF0aWMKLSNlbmRpZgotCi0vKiBEZWZpbmUgVVBCX0JJR19FTkRJQU4gbWFudWFsbHkgaWYgeW91J3JlIG9uIGJpZyBlbmRpYW4gYW5kIHlvdXIgY29tcGlsZXIKLSAqIGRvZXNuJ3QgcHJvdmlkZSB0aGVzZSBwcmVwcm9jZXNzb3Igc3ltYm9scy4gKi8KLSNpZiBkZWZpbmVkKF9fQllURV9PUkRFUl9fKSAmJiAoX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9CSUdfRU5ESUFOX18pCi0jZGVmaW5lIFVQQl9CSUdfRU5ESUFOCi0jZW5kaWYKLQotLyogTWFjcm9zIGZvciBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgdGhlbS4gKi8KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBVUEJfRk9SQ0VJTkxJTkUgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKLSNkZWZpbmUgVVBCX05PSU5MSU5FIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLSNkZWZpbmUgVVBCX05PUkVUVVJOIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCi0jZWxzZSAgLyogIWRlZmluZWQoX19HTlVDX18pICovCi0jZGVmaW5lIFVQQl9GT1JDRUlOTElORQotI2RlZmluZSBVUEJfTk9JTkxJTkUKLSNkZWZpbmUgVVBCX05PUkVUVVJOCi0jZW5kaWYKLQotLyogQSBmZXcgaGFja3kgd29ya2Fyb3VuZHMgZm9yIGZ1bmN0aW9ucyBub3QgaW4gQzg5LgotICogRm9yIGludGVybmFsIHVzZSBvbmx5IQotICogVE9ETyhoYWJlcm1hbik6IGZpeCB0aGVzZSBieSBpbmNsdWRpbmcgb3VyIG93biBpbXBsZW1lbnRhdGlvbnMsIG9yIGZpbmRpbmcKLSAqIGFub3RoZXIgd29ya2Fyb3VuZC4KLSAqLwotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIF91cGJfc25wcmludGYgX19idWlsdGluX3NucHJpbnRmCi0jZGVmaW5lIF91cGJfdnNucHJpbnRmIF9fYnVpbHRpbl92c25wcmludGYKLSNkZWZpbmUgX3VwYl92YV9jb3B5KGEsIGIpIF9fdmFfY29weShhLCBiKQotI2VsaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0vKiBDOTkgdmVyc2lvbnMuICovCi0jZGVmaW5lIF91cGJfc25wcmludGYgc25wcmludGYKLSNkZWZpbmUgX3VwYl92c25wcmludGYgdnNucHJpbnRmCi0jZGVmaW5lIF91cGJfdmFfY29weShhLCBiKSB2YV9jb3B5KGEsIGIpCi0jZWxzZQotI2Vycm9yIE5lZWQgaW1wbGVtZW50YXRpb25zIG9mIFt2XXNucHJpbnRmIGFuZCB2YV9jb3B5Ci0jZW5kaWYKLQotCi0jaWYgKChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSB8fCBcCi0gICAgICBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSkgJiYgIWRlZmluZWQoVVBCX05PX0NYWDExKQotI2RlZmluZSBVUEJfQ1hYMTEKLSNlbmRpZgotCi0vKiBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKCkKLSAqIFVQQl9ESVNBTExPV19QT0RfT1BTKCkKLSAqCi0gKiBEZWNsYXJlIHRoZXNlIGluIHRoZSAicHJpdmF0ZSIgc2VjdGlvbiBvZiBhIEMrKyBjbGFzcyB0byBmb3JiaWQgY29weS9hc3NpZ24KLSAqIG9yIGFsbCBQT0Qgb3BzIChjb25zdHJ1Y3QsIGRlc3RydWN0LCBjb3B5LCBhc3NpZ24pIG9uIHRoYXQgY2xhc3MuICovCi0jaWZkZWYgVVBCX0NYWDExCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jZGVmaW5lIFVQQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oY2xhc3NfbmFtZSkgXAotICBjbGFzc19uYW1lKGNvbnN0IGNsYXNzX25hbWUmKSA9IGRlbGV0ZTsgXAotICB2b2lkIG9wZXJhdG9yPShjb25zdCBjbGFzc19uYW1lJikgPSBkZWxldGU7Ci0jZGVmaW5lIFVQQl9ESVNBTExPV19QT0RfT1BTKGNsYXNzX25hbWUsIGZ1bGxfY2xhc3NfbmFtZSkgXAotICBjbGFzc19uYW1lKCkgPSBkZWxldGU7IFwKLSAgfmNsYXNzX25hbWUoKSA9IGRlbGV0ZTsgXAotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKGNsYXNzX25hbWUpCi0jZGVmaW5lIFVQQl9BU1NFUlRfU1RETEFZT1VUKHR5cGUpIFwKLSAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDx0eXBlPjo6dmFsdWUsIFwKLSAgICAgICAgICAgICAgICAjdHlwZSAiIG11c3QgYmUgc3RhbmRhcmQgbGF5b3V0Iik7Ci0jZWxzZSAgLyogIWRlZmluZWQoVVBCX0NYWDExKSAqLwotI2RlZmluZSBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKGNsYXNzX25hbWUpIFwKLSAgY2xhc3NfbmFtZShjb25zdCBjbGFzc19uYW1lJik7IFwKLSAgdm9pZCBvcGVyYXRvcj0oY29uc3QgY2xhc3NfbmFtZSYpOwotI2RlZmluZSBVUEJfRElTQUxMT1dfUE9EX09QUyhjbGFzc19uYW1lLCBmdWxsX2NsYXNzX25hbWUpIFwKLSAgY2xhc3NfbmFtZSgpOyBcCi0gIH5jbGFzc19uYW1lKCk7IFwKLSAgVVBCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihjbGFzc19uYW1lKQotI2RlZmluZSBVUEJfQVNTRVJUX1NURExBWU9VVCh0eXBlKQotI2VuZGlmCi0KLS8qIFVQQl9ERUNMQVJFX1RZUEUoKQotICogVVBCX0RFQ0xBUkVfREVSSVZFRF9UWVBFKCkKLSAqIFVQQl9ERUNMQVJFX0RFUklWRURfVFlQRTIoKQotICoKLSAqIE1hY3JvcyBmb3IgZGVjbGFyaW5nIEMgYW5kIEMrKyB0eXBlcyBib3RoLCBpbmNsdWRpbmcgaW5oZXJpdGFuY2UuCi0gKiBUaGUgaW5oZXJpdGFuY2UgZG9lc24ndCB1c2UgcmVhbCBDKysgaW5oZXJpdGFuY2UsIHRvIHN0YXkgY29tcGF0aWJsZSB3aXRoIEMuCi0gKgotICogVGhlc2UgbWFjcm9zIGFsc28gcHJvdmlkZSB1cGNhc3RzOgotICogIC0gaW4gQzogdHlwZXMtc3BlY2lmaWMgZnVuY3Rpb25zIChpZS4gdXBiX2Zvb191cGNhc3QoZm9vKSkKLSAqICAtIGluIEMrKzogdXBiOjp1cGNhc3QoZm9vKSBhbG9uZyB3aXRoIGltcGxpY2l0IGNvbnZlcnNpb25zCi0gKgotICogRG93bmNhc3RzIGFyZSBub3QgcHJvdmlkZWQsIGJ1dCB1cGIvZGVmLmggZGVmaW5lcyBkb3duY2FzdHMgZm9yIHVwYjo6RGVmLiAqLwotCi0jZGVmaW5lIFVQQl9DX1VQQ0FTVFModHksIGJhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9JTkxJTkUgYmFzZSAqdHkgIyMgX3VwY2FzdF9tdXRhYmxlKHR5ICpwKSB7IHJldHVybiAoYmFzZSopcDsgfSBcCi0gIFVQQl9JTkxJTkUgY29uc3QgYmFzZSAqdHkgIyMgX3VwY2FzdChjb25zdCB0eSAqcCkgeyByZXR1cm4gKGNvbnN0IGJhc2UqKXA7IH0KLQotI2RlZmluZSBVUEJfQ19VUENBU1RTMih0eSwgYmFzZSwgYmFzZTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfQ19VUENBU1RTKHR5LCBiYXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfSU5MSU5FIGJhc2UyICp0eSAjIyBfdXBjYXN0Ml9tdXRhYmxlKHR5ICpwKSB7IHJldHVybiAoYmFzZTIqKXA7IH0gXAotICBVUEJfSU5MSU5FIGNvbnN0IGJhc2UyICp0eSAjIyBfdXBjYXN0Mihjb25zdCB0eSAqcCkgeyByZXR1cm4gKGNvbnN0IGJhc2UyKilwOyB9Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0jZGVmaW5lIFVQQl9CRUdJTl9FWFRFUk5fQyBleHRlcm4gIkMiIHsKLSNkZWZpbmUgVVBCX0VORF9FWFRFUk5fQyB9Ci0jZGVmaW5lIFVQQl9QUklWQVRFX0ZPUl9DUFAgcHJpdmF0ZToKLSNkZWZpbmUgVVBCX0RFQ0xBUkVfVFlQRShjcHBuYW1lLCBjbmFtZSkgdHlwZWRlZiBjcHBuYW1lIGNuYW1lOwotCi0jZGVmaW5lIFVQQl9ERUNMQVJFX0RFUklWRURfVFlQRShjcHBuYW1lLCBjcHBiYXNlLCBjbmFtZSwgY2Jhc2UpICBcCi0gIFVQQl9ERUNMQVJFX1RZUEUoY3BwbmFtZSwgY25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9DX1VQQ0FTVFMoY25hbWUsIGNiYXNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5hbWVzcGFjZSB1cGIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIFBvaW50ZXI8Y3BwbmFtZT4gOiBwdWJsaWMgUG9pbnRlckJhc2U8Y3BwbmFtZSwgY3BwYmFzZT4geyBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXhwbGljaXQgUG9pbnRlcihjcHBuYW1lKiBwdHIpIDogUG9pbnRlckJhc2UocHRyKSB7fSAgICAgICAgICBcCi0gIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIFBvaW50ZXI8Y29uc3QgY3BwbmFtZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICA6IHB1YmxpYyBQb2ludGVyQmFzZTxjb25zdCBjcHBuYW1lLCBjb25zdCBjcHBiYXNlPiB7ICAgICAgICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXhwbGljaXQgUG9pbnRlcihjb25zdCBjcHBuYW1lKiBwdHIpIDogUG9pbnRlckJhc2UocHRyKSB7fSAgICBcCi0gIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBVUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUyKGNwcG5hbWUsIGNwcGJhc2UsIGNwcGJhc2UyLCBjbmFtZSwgY2Jhc2UsICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2Jhc2UyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0RFQ0xBUkVfVFlQRShjcHBuYW1lLCBjbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfQ19VUENBU1RTMihjbmFtZSwgY2Jhc2UsIGNiYXNlMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5hbWVzcGFjZSB1cGIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjbGFzcyBQb2ludGVyPGNwcG5hbWU+IDogcHVibGljIFBvaW50ZXJCYXNlMjxjcHBuYW1lLCBjcHBiYXNlLCBjcHBiYXNlMj4geyBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBleHBsaWNpdCBQb2ludGVyKGNwcG5hbWUqIHB0cikgOiBQb2ludGVyQmFzZTIocHRyKSB7fSAgICAgICAgICAgICAgICAgICAgXAotICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgUG9pbnRlcjxjb25zdCBjcHBuYW1lPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgOiBwdWJsaWMgUG9pbnRlckJhc2UyPGNvbnN0IGNwcG5hbWUsIGNvbnN0IGNwcGJhc2UsIGNvbnN0IGNwcGJhc2UyPiB7ICBcCi0gICBwdWJsaWM6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBleHBsaWNpdCBQb2ludGVyKGNvbnN0IGNwcG5hbWUqIHB0cikgOiBQb2ludGVyQmFzZTIocHRyKSB7fSAgICAgICAgICAgICAgXAotICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2Vsc2UgIC8qICFkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLwotCi0jZGVmaW5lIFVQQl9CRUdJTl9FWFRFUk5fQwotI2RlZmluZSBVUEJfRU5EX0VYVEVSTl9DCi0jZGVmaW5lIFVQQl9QUklWQVRFX0ZPUl9DUFAKLSNkZWZpbmUgVVBCX0RFQ0xBUkVfVFlQRShjcHBuYW1lLCBjbmFtZSkgXAotICBzdHJ1Y3QgY25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgc3RydWN0IGNuYW1lIGNuYW1lOwotI2RlZmluZSBVUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUoY3BwbmFtZSwgY3BwYmFzZSwgY25hbWUsIGNiYXNlKSBcCi0gIFVQQl9ERUNMQVJFX1RZUEUoY3BwbmFtZSwgY25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0NfVVBDQVNUUyhjbmFtZSwgY2Jhc2UpCi0jZGVmaW5lIFVQQl9ERUNMQVJFX0RFUklWRURfVFlQRTIoY3BwbmFtZSwgY3BwYmFzZSwgY3BwYmFzZTIsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSwgY2Jhc2UsIGNiYXNlMikgICAgICAgICAgXAotICBVUEJfREVDTEFSRV9UWVBFKGNwcG5hbWUsIGNuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9DX1VQQ0FTVFMyKGNuYW1lLCBjYmFzZSwgY2Jhc2UyKQotCi0jZW5kaWYgIC8qIGRlZmluZWQoX19jcGx1c3BsdXMpICovCi0KLSNkZWZpbmUgVVBCX01BWCh4LCB5KSAoKHgpID4gKHkpID8gKHgpIDogKHkpKQotI2RlZmluZSBVUEJfTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCi0KLSNkZWZpbmUgVVBCX1VOVVNFRCh2YXIpICh2b2lkKXZhcgotCi0vKiBGb3IgYXNzZXJ0aW5nIHNvbWV0aGluZyBhYm91dCBhIHZhcmlhYmxlIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGZvcgotICogYW55dGhpbmcgZWxzZS4gIFRoaXMgcHJldmVudHMgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgaW4KLSAqIGRlYnVnIG1vZGUuICovCi0jZGVmaW5lIFVQQl9BU1NFUlRfVkFSKHZhciwgcHJlZGljYXRlKSBVUEJfVU5VU0VEKHZhcik7IGFzc2VydChwcmVkaWNhdGUpCi0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gdHlwZS4gKi8KLXR5cGVkZWYgdm9pZCB1cGJfZnVuYygpOwotCi0vKiBDKysgQ2FzdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYiB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBQb2ludGVyOwotCi0vKiBDYXN0cyB0byBhIHN1YmNsYXNzLiAgVGhlIGNhbGxlciBtdXN0IGtub3cgdGhhdCBjYXN0IGlzIGNvcnJlY3Q7IGFuCi0gKiBpbmNvcnJlY3QgY2FzdCB3aWxsIHRocm93IGFuIGFzc2VydGlvbiBmYWlsdXJlIGluIGRlYnVnIG1vZGUuCi0gKgotICogRXhhbXBsZToKLSAqICAgdXBiOjpEZWYqIGRlZiA9IEdldERlZigpOwotICogICAvLyBBc3NlcnQtZmFpbHMgaWYgdGhpcyB3YXMgbm90IGFjdHVhbGx5IGEgTWVzc2FnZURlZi4KLSAqICAgdXBiOjpNZXNzZ2VEZWYqIG1kID0gdXBiOjpkb3duX2Nhc3Q8dXBiOjpNZXNzYWdlRGVmPihkZWYpOwotICoKLSAqIE5vdGUgdGhhdCBkb3duY2FzdHMgYXJlIG9ubHkgZGVmaW5lZCBmb3Igc29tZSB0eXBlcyAoYXQgdGhlIG1vbWVudCB5b3UgY2FuCi0gKiBvbmx5IGRvd25jYXN0IGZyb20gYSB1cGI6OkRlZiB0byBhIHNwZWNpZmljIERlZiB0eXBlKS4gKi8KLXRlbXBsYXRlPGNsYXNzIFRvLCBjbGFzcyBGcm9tPiBUbyBkb3duX2Nhc3QoRnJvbSogZik7Ci0KLS8qIENhc3RzIHRvIGEgc3ViY2xhc3MuICBJZiB0aGUgY2xhc3MgZG9lcyBub3QgYWN0dWFsbHkgbWF0Y2ggdGhlIGdpdmVuIFRvIHR5cGUsCi0gKiByZXR1cm5zIE5VTEwuCi0gKgotICogRXhhbXBsZToKLSAqICAgdXBiOjpEZWYqIGRlZiA9IEdldERlZigpOwotICogICAvLyBtZCB3aWxsIGJlIE5VTEwgaWYgdGhpcyB3YXMgbm90IGFjdHVhbGx5IGEgTWVzc2FnZURlZi4KLSAqICAgdXBiOjpNZXNzZ2VEZWYqIG1kID0gdXBiOjpkb3duX2Nhc3Q8dXBiOjpNZXNzYWdlRGVmPihkZWYpOwotICoKLSAqIE5vdGUgdGhhdCBkeW5hbWljIGNhc3RzIGFyZSBvbmx5IGRlZmluZWQgZm9yIHNvbWUgdHlwZXMgKGF0IHRoZSBtb21lbnQgeW91Ci0gKiBjYW4gb25seSBkb3duY2FzdCBmcm9tIGEgdXBiOjpEZWYgdG8gYSBzcGVjaWZpYyBEZWYgdHlwZSkuLiAqLwotdGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IFRvIGR5bl9jYXN0KEZyb20qIGYpOwotCi0vKiBDYXN0cyB0byBhbnkgYmFzZSBjbGFzcywgb3IgdGhlIHR5cGUgaXRzZWxmIChpZS4gY2FuIGJlIGEgbm8tb3ApLgotICoKLSAqIEV4YW1wbGU6Ci0gKiAgIHVwYjo6TWVzc2FnZURlZiogbWQgPSBHZXREZWYoKTsKLSAqICAgLy8gVGhpcyB3aWxsIGZhaWwgdG8gY29tcGlsZSBpZiB0aGlzIHdhc24ndCBhY3R1YWxseSBhIGJhc2UgY2xhc3MuCi0gKiAgIHVwYjo6RGVmKiBkZWYgPSB1cGI6OnVwY2FzdChtZCk7Ci0gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPiBpbmxpbmUgUG9pbnRlcjxUPiB1cGNhc3QoVCAqZikgeyByZXR1cm4gUG9pbnRlcjxUPihmKTsgfQotCi0vKiBBdHRlbXB0IHVwY2FzdCB0byBzcGVjaWZpYyBiYXNlIGNsYXNzLgotICoKLSAqIEV4YW1wbGU6Ci0gKiAgIHVwYjo6TWVzc2FnZURlZiogbWQgPSBHZXREZWYoKTsKLSAqICAgdXBiOjp1cGNhc3RfdG88dXBiOjpEZWY+KG1kKS0+TWV0aG9kT25EZWYoKTsKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQsIGNsYXNzIEY+IGlubGluZSBUKiB1cGNhc3RfdG8oRiAqZikgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KHVwY2FzdChmKSk7Ci19Ci0KLS8qIFBvaW50ZXJCYXNlPFQ+OiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgb2YgdXBiOjp1cGNhc3QoKS4KLSAqIEl0IGlzIGltcGxpY2l0bHkgY29udmVydGFibGUgdG8gcG9pbnRlcnMgdG8gdGhlIEJhc2UgY2xhc3MoZXMpLgotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQmFzZT4KLWNsYXNzIFBvaW50ZXJCYXNlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFBvaW50ZXJCYXNlKFQqIHB0cikgOiBwdHJfKHB0cikge30KLSAgb3BlcmF0b3IgVCooKSB7IHJldHVybiBwdHJfOyB9Ci0gIG9wZXJhdG9yIEJhc2UqKCkgeyByZXR1cm4gKEJhc2UqKXB0cl87IH0KLQotIHByaXZhdGU6Ci0gIFQqIHB0cl87Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgQmFzZSwgY2xhc3MgQmFzZTI+Ci1jbGFzcyBQb2ludGVyQmFzZTIgOiBwdWJsaWMgUG9pbnRlckJhc2U8VCwgQmFzZT4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUG9pbnRlckJhc2UyKFQqIHB0cikgOiBQb2ludGVyQmFzZTxULCBCYXNlPihwdHIpIHt9Ci0gIG9wZXJhdG9yIEJhc2UyKigpIHsgcmV0dXJuIFBvaW50ZXI8QmFzZT4oKnRoaXMpOyB9Ci19OwotCi19Ci0KLSNlbmRpZgotCi0KLS8qIHVwYjo6cmVmZmVkX3B0ciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPiAgLyogRm9yIHN0ZDo6c3dhcCgpLiAqLwotCi1uYW1lc3BhY2UgdXBiIHsKLQotLyogUHJvdmlkZXMgUkFJSSBzZW1hbnRpY3MgZm9yIHVwYiByZWZjb3VudGVkIG9iamVjdHMuICBFYWNoIHJlZmZlZF9wdHIgb3ducyBhCi0gKiByZWYgb24gd2hhdGV2ZXIgb2JqZWN0IGl0IHBvaW50cyB0byAoaWYgYW55KS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyByZWZmZWRfcHRyIHsKLSBwdWJsaWM6Ci0gIHJlZmZlZF9wdHIoKSA6IHB0cl8oTlVMTCkge30KLQotICAvKiBJZiByZWZfZG9ub3IgaXMgTlVMTCwgdGFrZXMgYSBuZXcgcmVmLCBvdGhlcndpc2UgYWRvcHRzIGZyb20gcmVmX2Rvbm9yLiAqLwotICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KLSAgcmVmZmVkX3B0cihVKiB2YWwsIGNvbnN0IHZvaWQqIHJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHB0cl8odXBiOjp1cGNhc3QodmFsKSkgewotICAgIGlmIChyZWZfZG9ub3IpIHsKLSAgICAgIGFzc2VydChwdHJfKTsKLSAgICAgIHB0cl8tPkRvbmF0ZVJlZihyZWZfZG9ub3IsIHRoaXMpOwotICAgIH0gZWxzZSBpZiAocHRyXykgewotICAgICAgcHRyXy0+UmVmKHRoaXMpOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBVPgotICByZWZmZWRfcHRyKGNvbnN0IHJlZmZlZF9wdHI8VT4mIG90aGVyKQotICAgICAgOiBwdHJfKHVwYjo6dXBjYXN0KG90aGVyLmdldCgpKSkgewotICAgIGlmIChwdHJfKSBwdHJfLT5SZWYodGhpcyk7Ci0gIH0KLQotICB+cmVmZmVkX3B0cigpIHsgaWYgKHB0cl8pIHB0cl8tPlVucmVmKHRoaXMpOyB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIHJlZmZlZF9wdHImIG9wZXJhdG9yPShjb25zdCByZWZmZWRfcHRyPFU+JiBvdGhlcikgewotICAgIHJlc2V0KG90aGVyLmdldCgpKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICByZWZmZWRfcHRyJiBvcGVyYXRvcj0oY29uc3QgcmVmZmVkX3B0ciYgb3RoZXIpIHsKLSAgICByZXNldChvdGhlci5nZXQoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgLyogVE9ETyhoYWJlcm1hbik6IGFkZCBDKysxMSBtb3ZlIGNvbnN0cnVjdGlvbi9hc3NpZ25tZW50IGZvciBncmVhdGVyCi0gICAqIGVmZmljaWVuY3kuICovCi0KLSAgdm9pZCBzd2FwKHJlZmZlZF9wdHImIG90aGVyKSB7Ci0gICAgaWYgKHB0cl8gPT0gb3RoZXIucHRyXykgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmIChwdHJfKSBwdHJfLT5Eb25hdGVSZWYodGhpcywgJm90aGVyKTsKLSAgICBpZiAob3RoZXIucHRyXykgb3RoZXIucHRyXy0+RG9uYXRlUmVmKCZvdGhlciwgdGhpcyk7Ci0gICAgc3RkOjpzd2FwKHB0cl8sIG90aGVyLnB0cl8pOwotICB9Ci0KLSAgVCYgb3BlcmF0b3IqKCkgY29uc3QgewotICAgIGFzc2VydChwdHJfKTsKLSAgICByZXR1cm4gKnB0cl87Ci0gIH0KLQotICBUKiBvcGVyYXRvci0+KCkgY29uc3QgewotICAgIGFzc2VydChwdHJfKTsKLSAgICByZXR1cm4gcHRyXzsKLSAgfQotCi0gIFQqIGdldCgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KLQotICAvKiBJZiByZWZfZG9ub3IgaXMgTlVMTCwgdGFrZXMgYSBuZXcgcmVmLCBvdGhlcndpc2UgYWRvcHRzIGZyb20gcmVmX2Rvbm9yLiAqLwotICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KLSAgdm9pZCByZXNldChVKiBwdHIgPSBOVUxMLCBjb25zdCB2b2lkKiByZWZfZG9ub3IgPSBOVUxMKSB7Ci0gICAgcmVmZmVkX3B0cihwdHIsIHJlZl9kb25vcikuc3dhcCgqdGhpcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KLSAgcmVmZmVkX3B0cjxVPiBkb3duX2Nhc3QoKSB7Ci0gICAgcmV0dXJuIHJlZmZlZF9wdHI8VT4odXBiOjpkb3duX2Nhc3Q8VSo+KGdldCgpKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KLSAgcmVmZmVkX3B0cjxVPiBkeW5fY2FzdCgpIHsKLSAgICByZXR1cm4gcmVmZmVkX3B0cjxVPih1cGI6OmR5bl9jYXN0PFUqPihnZXQoKSkpOwotICB9Ci0KLSAgLyogUGxhaW4gcmVsZWFzZSgpIGlzIHVuc2FmZTsgaWYgd2Ugd2VyZSB0aGUgb25seSBvd25lciwgaXQgd291bGQgbGVhayB0aGUKLSAgICogb2JqZWN0LiAgSW5zdGVhZCB3ZSBwcm92aWRlIHRoaXM6ICovCi0gIFQqIFJlbGVhc2VUbyhjb25zdCB2b2lkKiBuZXdfb3duZXIpIHsKLSAgICBUKiByZXQgPSBOVUxMOwotICAgIHB0cl8tPkRvbmF0ZVJlZih0aGlzLCBuZXdfb3duZXIpOwotICAgIHN0ZDo6c3dhcChyZXQsIHB0cl8pOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFQqIHB0cl87Ci19OwotCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0KLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotCi0vKiB1cGI6OlN0YXR1cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB1cGIgewotY2xhc3MgRXJyb3JTcGFjZTsKLWNsYXNzIFN0YXR1czsKLX0KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6RXJyb3JTcGFjZSwgdXBiX2Vycm9yc3BhY2UpCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6U3RhdHVzLCB1cGJfc3RhdHVzKQotCi0vKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgYW4gZXJyb3IgbWVzc2FnZSBiZWZvcmUgaXQgd2lsbCBnZXQgdHJ1bmNhdGVkLiAqLwotI2RlZmluZSBVUEJfU1RBVFVTX01BWF9NRVNTQUdFIDEyOAotCi0vKiBBbiBlcnJvciBjYWxsYmFjayBmdW5jdGlvbiBpcyB1c2VkIHRvIHJlcG9ydCBlcnJvcnMgZnJvbSBzb21lIGNvbXBvbmVudC4KLSAqIFRoZSBmdW5jdGlvbiBjYW4gcmV0dXJuICJ0cnVlIiB0byBpbmRpY2F0ZSB0aGF0IHRoZSBjb21wb25lbnQgc2hvdWxkIHRyeQotICogdG8gcmVjb3ZlciBhbmQgcHJvY2VlZCwgYnV0IHRoaXMgaXMgbm90IGFsd2F5cyBwb3NzaWJsZS4gKi8KLXR5cGVkZWYgYm9vbCB1cGJfZXJyY2JfdCh2b2lkICpjbG9zdXJlLCBjb25zdCB1cGJfc3RhdHVzKiBzdGF0dXMpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWNsYXNzIHVwYjo6RXJyb3JTcGFjZSB7Ci0jZWxzZQotc3RydWN0IHVwYl9lcnJvcnNwYWNlIHsKLSNlbmRpZgotICBjb25zdCBjaGFyICpuYW1lOwotICAvKiBTaG91bGQgdGhlIGVycm9yIG1lc3NhZ2UgaW4gdGhlIHN0YXR1cyBvYmplY3QgYWNjb3JkaW5nIHRvIHRoaXMgY29kZS4gKi8KLSAgdm9pZCAoKnNldF9tZXNzYWdlKSh1cGJfc3RhdHVzKiBzdGF0dXMsIGludCBjb2RlKTsKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBPYmplY3QgcmVwcmVzZW50aW5nIGEgc3VjY2VzcyBvciBmYWlsdXJlIHN0YXR1cy4KLSAqIEl0IG93bnMgbm8gcmVzb3VyY2VzIGFuZCBhbGxvY2F0ZXMgbm8gbWVtb3J5LCBzbyBpdCBzaG91bGQgd29yawotICogZXZlbiBpbiBPT00gc2l0dWF0aW9ucy4gKi8KLQotY2xhc3MgdXBiOjpTdGF0dXMgewotIHB1YmxpYzoKLSAgU3RhdHVzKCk7Ci0KLSAgLyogUmV0dXJucyB0cnVlIGlmIHRoZXJlIGlzIG5vIGVycm9yLiAqLwotICBib29sIG9rKCkgY29uc3Q7Ci0KLSAgLyogT3B0aW9uYWwgZXJyb3Igc3BhY2UgYW5kIGNvZGUsIHVzZWZ1bCBpZiB0aGUgY2FsbGVyIHdhbnRzIHRvCi0gICAqIHByb2dyYW1tYXRpY2FsbHkgY2hlY2sgdGhlIHNwZWNpZmljIGtpbmQgb2YgZXJyb3IuICovCi0gIEVycm9yU3BhY2UqIGVycm9yX3NwYWNlKCk7Ci0gIGludCBjb2RlKCkgY29uc3Q7Ci0KLSAgY29uc3QgY2hhciAqZXJyb3JfbWVzc2FnZSgpIGNvbnN0OwotCi0gIC8qIFRoZSBlcnJvciBtZXNzYWdlIHdpbGwgYmUgdHJ1bmNhdGVkIGlmIGl0IGlzIGxvbmdlciB0aGFuCi0gICAqIFVQQl9TVEFUVVNfTUFYX01FU1NBR0UtNC4gKi8KLSAgdm9pZCBTZXRFcnJvck1lc3NhZ2UoY29uc3QgY2hhciogbXNnKTsKLSAgdm9pZCBTZXRGb3JtYXR0ZWRFcnJvck1lc3NhZ2UoY29uc3QgY2hhciogZm10LCAuLi4pOwotCi0gIC8qIElmIHRoZXJlIGlzIG5vIGVycm9yIG1lc3NhZ2UgYWxyZWFkeSwgdGhpcyB3aWxsIHVzZSB0aGUgRXJyb3JTcGFjZSB0bwotICAgKiBwb3B1bGF0ZSB0aGUgZXJyb3IgbWVzc2FnZSBmb3IgdGhpcyBjb2RlLiAgVGhlIGNhbGxlciBjYW4gc3RpbGwgY2FsbAotICAgKiBTZXRFcnJvck1lc3NhZ2UoKSB0byBnaXZlIGEgbW9yZSBzcGVjaWZpYyBtZXNzYWdlLiAqLwotICB2b2lkIFNldEVycm9yQ29kZShFcnJvclNwYWNlKiBzcGFjZSwgaW50IGNvZGUpOwotCi0gIC8qIFJlc2V0cyB0aGUgc3RhdHVzIHRvIGEgc3VjY2Vzc2Z1bCBzdGF0ZSB3aXRoIG5vIG1lc3NhZ2UuICovCi0gIHZvaWQgQ2xlYXIoKTsKLQotICB2b2lkIENvcHlGcm9tKGNvbnN0IFN0YXR1cyYgb3RoZXIpOwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihTdGF0dXMpCi0jZWxzZQotc3RydWN0IHVwYl9zdGF0dXMgewotI2VuZGlmCi0gIGJvb2wgb2tfOwotCi0gIC8qIFNwZWNpZmljIHN0YXR1cyBjb2RlIGRlZmluZWQgYnkgc29tZSBlcnJvciBzcGFjZSAob3B0aW9uYWwpLiAqLwotICBpbnQgY29kZV87Ci0gIHVwYl9lcnJvcnNwYWNlICplcnJvcl9zcGFjZV87Ci0KLSAgLyogRXJyb3IgbWVzc2FnZTsgTlVMTC10ZXJtaW5hdGVkLiAqLwotICBjaGFyIG1zZ1tVUEJfU1RBVFVTX01BWF9NRVNTQUdFXTsKLX07Ci0KLSNkZWZpbmUgVVBCX1NUQVRVU19JTklUIHt0cnVlLCAwLCBOVUxMLCB7MH19Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogVGhlIHJldHVybmVkIHN0cmluZyBpcyBpbnZhbGlkYXRlZCBieSBhbnkgb3RoZXIgY2FsbCBpbnRvIHRoZSBzdGF0dXMuICovCi1jb25zdCBjaGFyICp1cGJfc3RhdHVzX2Vycm1zZyhjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpOwotYm9vbCB1cGJfb2soY29uc3QgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLXVwYl9lcnJvcnNwYWNlICp1cGJfc3RhdHVzX2VycnNwYWNlKGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cyk7Ci1pbnQgdXBiX3N0YXR1c19lcnJjb2RlKGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cyk7Ci0KLS8qIEFueSBvZiB0aGUgZnVuY3Rpb25zIHRoYXQgd3JpdGUgdG8gYSBzdGF0dXMgb2JqZWN0IGFsbG93IHN0YXR1cyB0byBiZSBOVUxMLAotICogdG8gc3VwcG9ydCB1c2UgY2FzZXMgd2hlcmUgdGhlIGZ1bmN0aW9uJ3MgY2FsbGVyIGRvZXMgbm90IGNhcmUgYWJvdXQgdGhlCi0gKiBzdGF0dXMgbWVzc2FnZS4gKi8KLXZvaWQgdXBiX3N0YXR1c19jbGVhcih1cGJfc3RhdHVzICpzdGF0dXMpOwotdm9pZCB1cGJfc3RhdHVzX3NldGVycm1zZyh1cGJfc3RhdHVzICpzdGF0dXMsIGNvbnN0IGNoYXIgKm1zZyk7Ci12b2lkIHVwYl9zdGF0dXNfc2V0ZXJyZih1cGJfc3RhdHVzICpzdGF0dXMsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKTsKLXZvaWQgdXBiX3N0YXR1c192c2V0ZXJyZih1cGJfc3RhdHVzICpzdGF0dXMsIGNvbnN0IGNoYXIgKmZtdCwgdmFfbGlzdCBhcmdzKTsKLXZvaWQgdXBiX3N0YXR1c19zZXRlcnJjb2RlKHVwYl9zdGF0dXMgKnN0YXR1cywgdXBiX2Vycm9yc3BhY2UgKnNwYWNlLCBpbnQgY29kZSk7Ci12b2lkIHVwYl9zdGF0dXNfY29weSh1cGJfc3RhdHVzICp0bywgY29uc3QgdXBiX3N0YXR1cyAqZnJvbSk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotfSAgLyogZXh0ZXJuICJDIiAqLwotCi1uYW1lc3BhY2UgdXBiIHsKLQotLyogQysrIFdyYXBwZXJzICovCi1pbmxpbmUgU3RhdHVzOjpTdGF0dXMoKSB7IENsZWFyKCk7IH0KLWlubGluZSBib29sIFN0YXR1czo6b2soKSBjb25zdCB7IHJldHVybiB1cGJfb2sodGhpcyk7IH0KLWlubGluZSBjb25zdCBjaGFyKiBTdGF0dXM6OmVycm9yX21lc3NhZ2UoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfc3RhdHVzX2Vycm1zZyh0aGlzKTsKLX0KLWlubGluZSB2b2lkIFN0YXR1czo6U2V0RXJyb3JNZXNzYWdlKGNvbnN0IGNoYXIqIG1zZykgewotICB1cGJfc3RhdHVzX3NldGVycm1zZyh0aGlzLCBtc2cpOwotfQotaW5saW5lIHZvaWQgU3RhdHVzOjpTZXRGb3JtYXR0ZWRFcnJvck1lc3NhZ2UoY29uc3QgY2hhciogZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB1cGJfc3RhdHVzX3ZzZXRlcnJmKHRoaXMsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLX0KLWlubGluZSB2b2lkIFN0YXR1czo6U2V0RXJyb3JDb2RlKEVycm9yU3BhY2UqIHNwYWNlLCBpbnQgY29kZSkgewotICB1cGJfc3RhdHVzX3NldGVycmNvZGUodGhpcywgc3BhY2UsIGNvZGUpOwotfQotaW5saW5lIHZvaWQgU3RhdHVzOjpDbGVhcigpIHsgdXBiX3N0YXR1c19jbGVhcih0aGlzKTsgfQotaW5saW5lIHZvaWQgU3RhdHVzOjpDb3B5RnJvbShjb25zdCBTdGF0dXMmIG90aGVyKSB7Ci0gIHVwYl9zdGF0dXNfY29weSh0aGlzLCAmb3RoZXIpOwotfQotCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9IXyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLQotLyogdXBiX3ZhbHVlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQSB0YWdnZWQgdW5pb24gKHN0b3JlZCB1bnRhZ2dlZCBpbnNpZGUgdGhlIHRhYmxlKSBzbyB0aGF0IHdlIGNhbiBjaGVjayB0aGF0Ci0gKiBjbGllbnRzIGNhbGxpbmcgdGFibGUgYWNjZXNzb3JzIGFyZSBjb3JyZWN0bHkgdHlwZWQgd2l0aG91dCBoYXZpbmcgdG8gaGF2ZQotICogYW4gZXhwbG9zaW9uIG9mIGFjY2Vzc29ycy4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9DVFlQRV9JTlQzMiAgICA9IDEsCi0gIFVQQl9DVFlQRV9JTlQ2NCAgICA9IDIsCi0gIFVQQl9DVFlQRV9VSU5UMzIgICA9IDMsCi0gIFVQQl9DVFlQRV9VSU5UNjQgICA9IDQsCi0gIFVQQl9DVFlQRV9CT09MICAgICA9IDUsCi0gIFVQQl9DVFlQRV9DU1RSICAgICA9IDYsCi0gIFVQQl9DVFlQRV9QVFIgICAgICA9IDcsCi0gIFVQQl9DVFlQRV9DT05TVFBUUiA9IDgsCi0gIFVQQl9DVFlQRV9GUFRSICAgICA9IDkKLX0gdXBiX2N0eXBlX3Q7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDY0X3QgdmFsOwotI2lmbmRlZiBOREVCVUcKLSAgLyogSW4gZGVidWcgbW9kZSB3ZSBjYXJyeSB0aGUgdmFsdWUgdHlwZSBhcm91bmQgYWxzbyBzbyB3ZSBjYW4gY2hlY2sgYWNjZXNzZXMKLSAgICogdG8gYmUgc3VyZSB0aGUgcmlnaHQgbWVtYmVyIGlzIGJlaW5nIHJlYWQuICovCi0gIHVwYl9jdHlwZV90IGN0eXBlOwotI2VuZGlmCi19IHVwYl92YWx1ZTsKLQotI2lmZGVmIE5ERUJVRwotI2RlZmluZSBTRVRfVFlQRShkZXN0LCB2YWwpICAgICAgVVBCX1VOVVNFRCh2YWwpCi0jZWxzZQotI2RlZmluZSBTRVRfVFlQRShkZXN0LCB2YWwpIGRlc3QgPSB2YWwKLSNlbmRpZgotCi0vKiBMaWtlIHN0cmR1cCgpLCB3aGljaCBpc24ndCBhbHdheXMgYXZhaWxhYmxlIHNpbmNlIGl0J3Mgbm90IEFOU0kgQy4gKi8KLWNoYXIgKnVwYl9zdHJkdXAoY29uc3QgY2hhciAqcyk7Ci0vKiBWYXJpYW50IHRoYXQgd29ya3Mgd2l0aCBhIGxlbmd0aC1kZWxpbWl0ZWQgcmF0aGVyIHRoYW4gTlVMTC1kZWxpbWl0ZWQgc3RyaW5nLAotICogYXMgc3VwcG9ydGVkIGJ5IHN0cnRhYmxlLiAqLwotY2hhciAqdXBiX3N0cmR1cDIoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbik7Ci0KLVVQQl9JTkxJTkUgdm9pZCBfdXBiX3ZhbHVlX3NldHZhbCh1cGJfdmFsdWUgKnYsIHVpbnQ2NF90IHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfY3R5cGVfdCBjdHlwZSkgewotICB2LT52YWwgPSB2YWw7Ci0gIFNFVF9UWVBFKHYtPmN0eXBlLCBjdHlwZSk7Ci19Ci0KLVVQQl9JTkxJTkUgdXBiX3ZhbHVlIF91cGJfdmFsdWVfdmFsKHVpbnQ2NF90IHZhbCwgdXBiX2N0eXBlX3QgY3R5cGUpIHsKLSAgdXBiX3ZhbHVlIHJldDsKLSAgX3VwYl92YWx1ZV9zZXR2YWwoJnJldCwgdmFsLCBjdHlwZSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZvciBlYWNoIHZhbHVlIGN0eXBlLCBkZWZpbmUgdGhlIGZvbGxvd2luZyBzZXQgb2YgZnVuY3Rpb25zOgotICoKLSAqIC8vIEdldC9zZXQgYW4gaW50MzIgZnJvbSBhIHVwYl92YWx1ZS4KLSAqIGludDMyX3QgdXBiX3ZhbHVlX2dldGludDMyKHVwYl92YWx1ZSB2YWwpOwotICogdm9pZCB1cGJfdmFsdWVfc2V0aW50MzIodXBiX3ZhbHVlICp2YWwsIGludDMyX3QgY3ZhbCk7Ci0gKgotICogLy8gQ29uc3RydWN0IGEgbmV3IHVwYl92YWx1ZSBmcm9tIGFuIGludDMyLgotICogdXBiX3ZhbHVlIHVwYl92YWx1ZV9pbnQzMihpbnQzMl90IHZhbCk7ICovCi0jZGVmaW5lIEZVTkNTKG5hbWUsIG1lbWJlcm5hbWUsIHR5cGVfdCwgY29udmVydGVyLCBwcm90b190eXBlKSBcCi0gIFVQQl9JTkxJTkUgdm9pZCB1cGJfdmFsdWVfc2V0ICMjIG5hbWUodXBiX3ZhbHVlICp2YWwsIHR5cGVfdCBjdmFsKSB7IFwKLSAgICB2YWwtPnZhbCA9IChjb252ZXJ0ZXIpY3ZhbDsgXAotICAgIFNFVF9UWVBFKHZhbC0+Y3R5cGUsIHByb3RvX3R5cGUpOyBcCi0gIH0gXAotICBVUEJfSU5MSU5FIHVwYl92YWx1ZSB1cGJfdmFsdWVfICMjIG5hbWUodHlwZV90IHZhbCkgeyBcCi0gICAgdXBiX3ZhbHVlIHJldDsgXAotICAgIHVwYl92YWx1ZV9zZXQgIyMgbmFtZSgmcmV0LCB2YWwpOyBcCi0gICAgcmV0dXJuIHJldDsgXAotICB9IFwKLSAgVVBCX0lOTElORSB0eXBlX3QgdXBiX3ZhbHVlX2dldCAjIyBuYW1lKHVwYl92YWx1ZSB2YWwpIHsgXAotICAgIGFzc2VydCh2YWwuY3R5cGUgPT0gcHJvdG9fdHlwZSk7IFwKLSAgICByZXR1cm4gKHR5cGVfdCkoY29udmVydGVyKXZhbC52YWw7IFwKLSAgfQotCi1GVU5DUyhpbnQzMiwgICAgaW50MzIsICAgICAgICBpbnQzMl90LCAgICAgIGludDMyX3QsICAgIFVQQl9DVFlQRV9JTlQzMikKLUZVTkNTKGludDY0LCAgICBpbnQ2NCwgICAgICAgIGludDY0X3QsICAgICAgaW50NjRfdCwgICAgVVBCX0NUWVBFX0lOVDY0KQotRlVOQ1ModWludDMyLCAgIHVpbnQzMiwgICAgICAgdWludDMyX3QsICAgICB1aW50MzJfdCwgICBVUEJfQ1RZUEVfVUlOVDMyKQotRlVOQ1ModWludDY0LCAgIHVpbnQ2NCwgICAgICAgdWludDY0X3QsICAgICB1aW50NjRfdCwgICBVUEJfQ1RZUEVfVUlOVDY0KQotRlVOQ1MoYm9vbCwgICAgIF9ib29sLCAgICAgICAgYm9vbCwgICAgICAgICBib29sLCAgICAgICBVUEJfQ1RZUEVfQk9PTCkKLUZVTkNTKGNzdHIsICAgICBjc3RyLCAgICAgICAgIGNoYXIqLCAgICAgICAgdWludHB0cl90LCAgVVBCX0NUWVBFX0NTVFIpCi1GVU5DUyhwdHIsICAgICAgcHRyLCAgICAgICAgICB2b2lkKiwgICAgICAgIHVpbnRwdHJfdCwgIFVQQl9DVFlQRV9QVFIpCi1GVU5DUyhjb25zdHB0ciwgY29uc3RwdHIsICAgICBjb25zdCB2b2lkKiwgIHVpbnRwdHJfdCwgIFVQQl9DVFlQRV9DT05TVFBUUikKLUZVTkNTKGZwdHIsICAgICBmcHRyLCAgICAgICAgIHVwYl9mdW5jKiwgICAgdWludHB0cl90LCAgVVBCX0NUWVBFX0ZQVFIpCi0KLSN1bmRlZiBGVU5DUwotI3VuZGVmIFNFVF9UWVBFCi0KLQotLyogdXBiX3RhYmtleSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRWl0aGVyOgotICogICAxLiBhbiBhY3R1YWwgaW50ZWdlciBrZXksIG9yCi0gKiAgIDIuIGEgcG9pbnRlciB0byBhIHN0cmluZyBwcmVmaXhlZCBieSBpdHMgdWludDMyX3QgbGVuZ3RoLCBvd25lZCBieSB1cy4KLSAqCi0gKiAuLi5kZXBlbmRpbmcgb24gd2hldGhlciB0aGlzIGlzIGEgc3RyaW5nIHRhYmxlIG9yIGFuIGludCB0YWJsZS4gIFdlIHdvdWxkCi0gKiBtYWtlIHRoaXMgYSB1bmlvbiBvZiB0aG9zZSB0d28gdHlwZXMsIGJ1dCBDODkgZG9lc24ndCBzdXBwb3J0IHN0YXRpY2FsbHkKLSAqIGluaXRpYWxpemluZyBhIG5vbi1maXJzdCB1bmlvbiBtZW1iZXIuICovCi10eXBlZGVmIHVpbnRwdHJfdCB1cGJfdGFia2V5OwotCi0jZGVmaW5lIFVQQl9UQUJLRVlfTlVNKG4pIG4KLSNkZWZpbmUgVVBCX1RBQktFWV9OT05FIDAKLS8qIFRoZSBwcmVwcm9jZXNzb3IgaXNuJ3QgcXVpdGUgcG93ZXJmdWwgZW5vdWdoIHRvIHR1cm4gdGhlIGNvbXBpbGUtdGltZSBzdHJpbmcKLSAqIGxlbmd0aCBpbnRvIGEgYnl0ZS13aXNlIHN0cmluZyByZXByZXNlbnRhdGlvbiwgc28gY29kZSBnZW5lcmF0aW9uIG5lZWRzIHRvCi0gKiBoZWxwIGl0IGFsb25nLgotICoKLSAqICJsZW4xIiBpcyB0aGUgbG93IGJ5dGUgYW5kIGxlbjQgaXMgdGhlIGhpZ2ggYnl0ZS4gKi8KLSNpZmRlZiBVUEJfQklHX0VORElBTgotI2RlZmluZSBVUEJfVEFCS0VZX1NUUihsZW4xLCBsZW4yLCBsZW4zLCBsZW40LCBzdHJ2YWwpIFwKLSAgICAodWludHB0cl90KShsZW40IGxlbjMgbGVuMiBsZW4xIHN0cnZhbCkKLSNlbHNlCi0jZGVmaW5lIFVQQl9UQUJLRVlfU1RSKGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQsIHN0cnZhbCkgXAotICAgICh1aW50cHRyX3QpKGxlbjEgbGVuMiBsZW4zIGxlbjQgc3RydmFsKQotI2VuZGlmCi0KLVVQQl9JTkxJTkUgY2hhciAqdXBiX3RhYnN0cih1cGJfdGFia2V5IGtleSwgdWludDMyX3QgKmxlbikgewotICBjaGFyKiBtZW0gPSAoY2hhciopa2V5OwotICBpZiAobGVuKSBtZW1jcHkobGVuLCBtZW0sIHNpemVvZigqbGVuKSk7Ci0gIHJldHVybiBtZW0gKyBzaXplb2YoKmxlbik7Ci19Ci0KLQotLyogdXBiX3RhYnZhbCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFN0YXR1cyBpbml0aWFsaXphdGlvbiBub3Qgc3VwcG9ydGVkLgotICoKLSAqIFRoaXMgc2VwYXJhdGUgZGVmaW5pdGlvbiBpcyBuZWNlc3NhcnkgYmVjYXVzZSBpbiBDKyssIFVJTlRQVFJfTUFYIGlzbid0Ci0gKiByZWxpYWJseSBhdmFpbGFibGUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ2NF90IHZhbDsKLX0gdXBiX3RhYnZhbDsKLQotI2Vsc2UKLQotLyogQyAtLSBzdXBwb3J0cyBzdGF0aWMgaW5pdGlhbGl6YXRpb24sIGJ1dCB0byBzdXBwb3J0IHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZgotICogYm90aCBpbnRlZ2VycyBhbmQgcG9pbnRzIGZvciBib3RoIDMyIGFuZCA2NCBiaXQgdGFyZ2V0cywgaXQgdGFrZXMgYSBsaXR0bGUKLSAqIGJpdCBvZiBkb2luZy4gKi8KLQotI2lmIFVJTlRQVFJfTUFYID09IDB4ZmZmZmZmZmZmZmZmZmZmZlVMTAotI2RlZmluZSBVUEJfUFRSX0lTXzY0QklUUwotI2VsaWYgVUlOVFBUUl9NQVggIT0gMHhmZmZmZmZmZgotI2Vycm9yIENvdWxkIG5vdCBkZXRlcm1pbmUgaG93IG1hbnkgYml0cyBwb2ludGVycyBhcmUuCi0jZW5kaWYKLQotdHlwZWRlZiB1bmlvbiB7Ci0gIC8qIEZvciBzdGF0aWMgaW5pdGlhbGl6YXRpb24uCi0gICAqCi0gICAqIFVuZm9ydHVuYXRlbHkgdGhpcyB1Z2xpbmVzcyBpcyBuZWNlc3NhcnkgLS0gaXQgaXMgdGhlIG9ubHkgd2F5IHRoYXQgd2UgY2FuLAotICAgKiB3aXRoIC1zdGQ9Yzg5IC1wZWRhbnRpYywgc3RhdGljYWxseSBpbml0aWFsaXplIHRoaXMgdG8gZWl0aGVyIGEgcG9pbnRlciBvcgotICAgKiBhbiBpbnRlZ2VyIG9uIDMyLWJpdCBwbGF0Zm9ybXMuICovCi0gIHN0cnVjdCB7Ci0jaWZkZWYgVVBCX1BUUl9JU182NEJJVFMKLSAgICB1aW50cHRyX3QgdmFsOwotI2Vsc2UKLSAgICB1aW50cHRyX3QgdmFsMTsKLSAgICB1aW50cHRyX3QgdmFsMjsKLSNlbmRpZgotICB9IHN0YXRpY2luaXQ7Ci0KLSAgLyogVGhlIG5vcm1hbCBhY2Nlc3NvciB0aGF0IHdlIHVzZSBmb3IgZXZlcnl0aGluZyBhdCBydW50aW1lLiAqLwotICB1aW50NjRfdCB2YWw7Ci19IHVwYl90YWJ2YWw7Ci0KLSNpZmRlZiBVUEJfUFRSX0lTXzY0QklUUwotI2RlZmluZSBVUEJfVEFCVkFMVUVfSU5UX0lOSVQodikge3t2fX0KLSNkZWZpbmUgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQgIHt7LTF9fQotI2Vsc2UKLQotLyogMzItYml0IHBvaW50ZXJzICovCi0KLSNpZmRlZiBVUEJfQklHX0VORElBTgotI2RlZmluZSBVUEJfVEFCVkFMVUVfSU5UX0lOSVQodikge3swLCB2fX0KLSNkZWZpbmUgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQgIHt7LTEsIC0xfX0KLSNlbHNlCi0jZGVmaW5lIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCh2KSB7e3YsIDB9fQotI2RlZmluZSBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCAge3stMSwgLTF9fQotI2VuZGlmCi0KLSNlbmRpZgotCi0jZGVmaW5lIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCh2KSBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoKHVpbnRwdHJfdCl2KQotCi0jdW5kZWYgVVBCX1BUUl9JU182NEJJVFMKLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLS8qIHVwYl90YWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgc3RydWN0IF91cGJfdGFiZW50IHsKLSAgdXBiX3RhYmtleSBrZXk7Ci0gIHVwYl90YWJ2YWwgdmFsOwotCi0gIC8qIEludGVybmFsIGNoYWluaW5nLiAgVGhpcyBpcyBjb25zdCBzbyB3ZSBjYW4gY3JlYXRlIHN0YXRpYyBpbml0aWFsaXplcnMgZm9yCi0gICAqIHRhYmxlcy4gIFdlIGNhc3QgYXdheSBjb25zdCBzb21ldGltZXMsIGJ1dCAqb25seSogd2hlbiB0aGUgY29udGFpbmluZwotICAgKiB1cGJfdGFibGUgaXMga25vd24gdG8gYmUgbm9uLWNvbnN0LiAgVGhpcyByZXF1aXJlcyBhIGJpdCBvZiBjYXJlLCBidXQKLSAgICogdGhlIHN1YnRsZXR5IGlzIGNvbmZpbmVkIHRvIHRhYmxlLmMuICovCi0gIGNvbnN0IHN0cnVjdCBfdXBiX3RhYmVudCAqbmV4dDsKLX0gdXBiX3RhYmVudDsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3QgY291bnQ7ICAgICAgICAgIC8qIE51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBoYXNoIHBhcnQuICovCi0gIHNpemVfdCBtYXNrOyAgICAgICAgICAgLyogTWFzayB0byB0dXJuIGhhc2ggdmFsdWUgLT4gYnVja2V0LiAqLwotICB1cGJfY3R5cGVfdCBjdHlwZTsgICAgIC8qIFR5cGUgb2YgYWxsIHZhbHVlcy4gKi8KLSAgdWludDhfdCBzaXplX2xnMjsgICAgICAvKiBTaXplIG9mIHRoZSBoYXNodGFibGUgcGFydCBpcyAyXnNpemVfbGcyIGVudHJpZXMuICovCi0KLSAgLyogSGFzaCB0YWJsZSBlbnRyaWVzLgotICAgKiBNYWtpbmcgdGhpcyBjb25zdCBpc24ndCBlbnRpcmVseSBhY2N1cmF0ZTsgd2hhdCB3ZSByZWFsbHkgd2FudCBpcyBmb3IgaXQgdG8KLSAgICogaGF2ZSB0aGUgc2FtZSBjb25zdC1uZXNzIGFzIHRoZSB0YWJsZSBpdCdzIGluc2lkZS4gIEJ1dCB0aGVyZSdzIG5vIHdheSB0bwotICAgKiBkZWNsYXJlIHRoYXQgaW4gQy4gIFNvIHdlIGhhdmUgdG8gbWFrZSBpdCBjb25zdCBzbyB0aGF0IHdlIGNhbiBzdGF0aWNhbGx5Ci0gICAqIGluaXRpYWxpemUgY29uc3QgaGFzaCB0YWJsZXMuICBUaGVuIHdlIGNhc3QgYXdheSBjb25zdCB3aGVuIHdlIGhhdmUgdG8uCi0gICAqLwotICBjb25zdCB1cGJfdGFiZW50ICplbnRyaWVzOwotfSB1cGJfdGFibGU7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdXBiX3RhYmxlIHQ7Ci19IHVwYl9zdHJ0YWJsZTsKLQotI2RlZmluZSBVUEJfU1RSVEFCTEVfSU5JVChjb3VudCwgbWFzaywgY3R5cGUsIHNpemVfbGcyLCBlbnRyaWVzKSBcCi0gIHt7Y291bnQsIG1hc2ssIGN0eXBlLCBzaXplX2xnMiwgZW50cmllc319Ci0KLSNkZWZpbmUgVVBCX0VNUFRZX1NUUlRBQkxFX0lOSVQoY3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfU1RSVEFCTEVfSU5JVCgwLCAwLCBjdHlwZSwgMCwgTlVMTCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1cGJfdGFibGUgdDsgICAgICAgICAgICAgIC8qIEZvciBlbnRyaWVzIHRoYXQgZG9uJ3QgZml0IGluIHRoZSBhcnJheSBwYXJ0LiAqLwotICBjb25zdCB1cGJfdGFidmFsICphcnJheTsgIC8qIEFycmF5IHBhcnQgb2YgdGhlIHRhYmxlLiBTZWUgY29uc3Qgbm90ZSBhYm92ZS4gKi8KLSAgc2l6ZV90IGFycmF5X3NpemU7ICAgICAgICAvKiBBcnJheSBwYXJ0IHNpemUuICovCi0gIHNpemVfdCBhcnJheV9jb3VudDsgICAgICAgLyogQXJyYXkgcGFydCBudW1iZXIgb2YgZWxlbWVudHMuICovCi19IHVwYl9pbnR0YWJsZTsKLQotI2RlZmluZSBVUEJfSU5UVEFCTEVfSU5JVChjb3VudCwgbWFzaywgY3R5cGUsIHNpemVfbGcyLCBlbnQsIGEsIGFzaXplLCBhY291bnQpIFwKLSAge3tjb3VudCwgbWFzaywgY3R5cGUsIHNpemVfbGcyLCBlbnR9LCBhLCBhc2l6ZSwgYWNvdW50fQotCi0jZGVmaW5lIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKGN0eXBlKSBcCi0gIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIGN0eXBlLCAwLCBOVUxMLCBOVUxMLCAwLCAwKQotCi0jZGVmaW5lIFVQQl9BUlJBWV9FTVBUWUVOVCAtMQotCi1VUEJfSU5MSU5FIHNpemVfdCB1cGJfdGFibGVfc2l6ZShjb25zdCB1cGJfdGFibGUgKnQpIHsKLSAgaWYgKHQtPnNpemVfbGcyID09IDApCi0gICAgcmV0dXJuIDA7Ci0gIGVsc2UKLSAgICByZXR1cm4gMSA8PCB0LT5zaXplX2xnMjsKLX0KLQotLyogSW50ZXJuYWwtb25seSBmdW5jdGlvbnMsIGluIC5oIGZpbGUgb25seSBvdXQgb2YgbmVjZXNzaXR5LiAqLwotVVBCX0lOTElORSBib29sIHVwYl90YWJlbnRfaXNlbXB0eShjb25zdCB1cGJfdGFiZW50ICplKSB7Ci0gIHJldHVybiBlLT5rZXkgPT0gMDsKLX0KLQotLyogVXNlZCBieSBzb21lIG9mIHRoZSB1bml0IHRlc3RzIGZvciBnZW5lcmljIGhhc2hpbmcgZnVuY3Rpb25hbGl0eS4gKi8KLXVpbnQzMl90IE11cm11ckhhc2gyKGNvbnN0IHZvaWQgKiBrZXksIHNpemVfdCBsZW4sIHVpbnQzMl90IHNlZWQpOwotCi1VUEJfSU5MSU5FIHVpbnRwdHJfdCB1cGJfaW50a2V5KHVpbnRwdHJfdCBrZXkpIHsKLSAgcmV0dXJuIGtleTsKLX0KLQotVVBCX0lOTElORSB1aW50MzJfdCB1cGJfaW50aGFzaCh1aW50cHRyX3Qga2V5KSB7Ci0gIHJldHVybiAodWludDMyX3Qpa2V5OwotfQotCi1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCAqdXBiX2dldGVudHJ5KGNvbnN0IHVwYl90YWJsZSAqdCwgdWludDMyX3QgaGFzaCkgewotICByZXR1cm4gdC0+ZW50cmllcyArIChoYXNoICYgdC0+bWFzayk7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfYXJyaGFzKHVwYl90YWJ2YWwga2V5KSB7Ci0gIHJldHVybiBrZXkudmFsICE9ICh1aW50NjRfdCktMTsKLX0KLQotLyogSW5pdGlhbGl6ZSBhbmQgdW5pbml0aWFsaXplIGEgdGFibGUsIHJlc3BlY3RpdmVseS4gIElmIG1lbW9yeSBhbGxvY2F0aW9uCi0gKiBmYWlsZWQsIGZhbHNlIGlzIHJldHVybmVkIHRoYXQgdGhlIHRhYmxlIGlzIHVuaW5pdGlhbGl6ZWQuICovCi1ib29sIHVwYl9pbnR0YWJsZV9pbml0KHVwYl9pbnR0YWJsZSAqdGFibGUsIHVwYl9jdHlwZV90IGN0eXBlKTsKLWJvb2wgdXBiX3N0cnRhYmxlX2luaXQodXBiX3N0cnRhYmxlICp0YWJsZSwgdXBiX2N0eXBlX3QgY3R5cGUpOwotdm9pZCB1cGJfaW50dGFibGVfdW5pbml0KHVwYl9pbnR0YWJsZSAqdGFibGUpOwotdm9pZCB1cGJfc3RydGFibGVfdW5pbml0KHVwYl9zdHJ0YWJsZSAqdGFibGUpOwotCi0vKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSB0YWJsZS4gKi8KLXNpemVfdCB1cGJfaW50dGFibGVfY291bnQoY29uc3QgdXBiX2ludHRhYmxlICp0KTsKLVVQQl9JTkxJTkUgc2l6ZV90IHVwYl9zdHJ0YWJsZV9jb3VudChjb25zdCB1cGJfc3RydGFibGUgKnQpIHsKLSAgcmV0dXJuIHQtPnQuY291bnQ7Ci19Ci0KLS8qIEluc2VydHMgdGhlIGdpdmVuIGtleSBpbnRvIHRoZSBoYXNodGFibGUgd2l0aCB0aGUgZ2l2ZW4gdmFsdWUuICBUaGUga2V5IG11c3QKLSAqIG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSBoYXNoIHRhYmxlLiAgRm9yIHN0cmluZyB0YWJsZXMsIHRoZSBrZXkgbXVzdCBiZQotICogTlVMTC10ZXJtaW5hdGVkLCBhbmQgdGhlIHRhYmxlIHdpbGwgbWFrZSBhbiBpbnRlcm5hbCBjb3B5IG9mIHRoZSBrZXkuCi0gKiBJbnR0YWJsZXMgbXVzdCBub3QgaW5zZXJ0IGEgdmFsdWUgb2YgVUlOVFBUUl9NQVguCi0gKgotICogSWYgYSB0YWJsZSByZXNpemUgd2FzIHJlcXVpcmVkIGJ1dCBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQsIGZhbHNlIGlzCi0gKiByZXR1cm5lZCBhbmQgdGhlIHRhYmxlIGlzIHVuY2hhbmdlZC4gKi8KLWJvb2wgdXBiX2ludHRhYmxlX2luc2VydCh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSB2YWwpOwotYm9vbCB1cGJfc3RydGFibGVfaW5zZXJ0Mih1cGJfc3RydGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlIHZhbCk7Ci0KLS8qIEZvciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc3RydGFibGVfaW5zZXJ0KHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlIHZhbCkgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2luc2VydDIodCwga2V5LCBzdHJsZW4oa2V5KSwgdmFsKTsKLX0KLQotLyogTG9va3MgdXAga2V5IGluIHRoaXMgdGFibGUsIHJldHVybmluZyAidHJ1ZSIgaWYgdGhlIGtleSB3YXMgZm91bmQuCi0gKiBJZiB2IGlzIG5vbi1OVUxMLCBjb3BpZXMgdGhlIHZhbHVlIGZvciB0aGlzIGtleSBpbnRvICp2LiAqLwotYm9vbCB1cGJfaW50dGFibGVfbG9va3VwKGNvbnN0IHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSwgdXBiX3ZhbHVlICp2KTsKLWJvb2wgdXBiX3N0cnRhYmxlX2xvb2t1cDIoY29uc3QgdXBiX3N0cnRhYmxlICp0LCBjb25zdCBjaGFyICprZXksIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSAqdik7Ci0KLS8qIEZvciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc3RydGFibGVfbG9va3VwKGNvbnN0IHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlICp2KSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfbG9va3VwMih0LCBrZXksIHN0cmxlbihrZXkpLCB2KTsKLX0KLQotLyogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIHRhYmxlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZW1vdmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiBhbmQgc3RvcmVzIHRoZSByZW1vdmVkIGl0ZW0gaW4gKnZhbCBpZiBub24tTlVMTC4gKi8KLWJvb2wgdXBiX2ludHRhYmxlX3JlbW92ZSh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSAqdmFsKTsKLWJvb2wgdXBiX3N0cnRhYmxlX3JlbW92ZTIodXBiX3N0cnRhYmxlICp0LCBjb25zdCBjaGFyICprZXksIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSAqdmFsKTsKLQotLyogRm9yIE5VTEwtdGVybWluYXRlZCBzdHJpbmdzLiAqLwotVVBCX0lOTElORSBib29sIHVwYl9zdHJ0YWJsZV9yZW1vdmUodXBiX3N0cnRhYmxlICp0LCBjb25zdCBjaGFyICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfdmFsdWUgKnYpIHsKLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9yZW1vdmUyKHQsIGtleSwgc3RybGVuKGtleSksIHYpOwotfQotCi0vKiBVcGRhdGVzIGFuIGV4aXN0aW5nIGVudHJ5IGluIGFuIGludHRhYmxlLiAgSWYgdGhlIGVudHJ5IGRvZXMgbm90IGV4aXN0LAotICogcmV0dXJucyBmYWxzZSBhbmQgZG9lcyBub3RoaW5nLiAgVW5saWtlIGluc2VydC9yZW1vdmUsIHRoaXMgZG9lcyBub3QKLSAqIGludmFsaWRhdGUgaXRlcmF0b3JzLiAqLwotYm9vbCB1cGJfaW50dGFibGVfcmVwbGFjZSh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSB2YWwpOwotCi0vKiBIYW5keSByb3V0aW5lcyBmb3IgdHJlYXRpbmcgYW4gaW50dGFibGUgbGlrZSBhIHN0YWNrLiAgTWF5IG5vdCBiZSBtaXhlZCB3aXRoCi0gKiBvdGhlciBpbnNlcnQvcmVtb3ZlIGNhbGxzLiAqLwotYm9vbCB1cGJfaW50dGFibGVfcHVzaCh1cGJfaW50dGFibGUgKnQsIHVwYl92YWx1ZSB2YWwpOwotdXBiX3ZhbHVlIHVwYl9pbnR0YWJsZV9wb3AodXBiX2ludHRhYmxlICp0KTsKLQotLyogQ29udmVuaWVuY2Ugcm91dGluZXMgZm9yIGludHRhYmxlcyB3aXRoIHBvaW50ZXIga2V5cy4gKi8KLWJvb2wgdXBiX2ludHRhYmxlX2luc2VydHB0cih1cGJfaW50dGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwgdXBiX3ZhbHVlIHZhbCk7Ci1ib29sIHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIodXBiX2ludHRhYmxlICp0LCBjb25zdCB2b2lkICprZXksIHVwYl92YWx1ZSAqdmFsKTsKLWJvb2wgdXBiX2ludHRhYmxlX2xvb2t1cHB0cigKLSAgICBjb25zdCB1cGJfaW50dGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwgdXBiX3ZhbHVlICp2YWwpOwotCi0vKiBPcHRpbWl6ZXMgdGhlIHRhYmxlIGZvciB0aGUgY3VycmVudCBzZXQgb2YgZW50cmllcywgZm9yIGJvdGggbWVtb3J5IHVzZSBhbmQKLSAqIGxvb2t1cCB0aW1lLiAgQ2xpZW50IHNob3VsZCBjYWxsIHRoaXMgYWZ0ZXIgYWxsIGVudHJpZXMgaGF2ZSBiZWVuIGluc2VydGVkOwotICogaW5zZXJ0aW5nIG1vcmUgZW50cmllcyBpcyBsZWdhbCwgYnV0IHdpbGwgbGlrZWx5IHJlcXVpcmUgYSB0YWJsZSByZXNpemUuICovCi12b2lkIHVwYl9pbnR0YWJsZV9jb21wYWN0KHVwYl9pbnR0YWJsZSAqdCk7Ci0KLS8qIEEgc3BlY2lhbC1jYXNlIGlubGluYWJsZSB2ZXJzaW9uIG9mIHRoZSBsb29rdXAgcm91dGluZSBmb3IgMzItYml0Ci0gKiBpbnRlZ2Vycy4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJfaW50dGFibGVfbG9va3VwMzIoY29uc3QgdXBiX2ludHRhYmxlICp0LCB1aW50MzJfdCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSAqdikgewotICAqdiA9IHVwYl92YWx1ZV9pbnQzMigwKTsgIC8qIFNpbGVuY2UgY29tcGlsZXIgd2FybmluZ3MuICovCi0gIGlmIChrZXkgPCB0LT5hcnJheV9zaXplKSB7Ci0gICAgdXBiX3RhYnZhbCBhcnJ2YWwgPSB0LT5hcnJheVtrZXldOwotICAgIGlmICh1cGJfYXJyaGFzKGFycnZhbCkpIHsKLSAgICAgIF91cGJfdmFsdWVfc2V0dmFsKHYsIGFycnZhbC52YWwsIHQtPnQuY3R5cGUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3QgdXBiX3RhYmVudCAqZTsKLSAgICBpZiAodC0+dC5lbnRyaWVzID09IE5VTEwpIHJldHVybiBmYWxzZTsKLSAgICBmb3IgKGUgPSB1cGJfZ2V0ZW50cnkoJnQtPnQsIHVwYl9pbnRoYXNoKGtleSkpOyB0cnVlOyBlID0gZS0+bmV4dCkgewotICAgICAgaWYgKCh1aW50MzJfdCllLT5rZXkgPT0ga2V5KSB7Ci0gICAgICAgIF91cGJfdmFsdWVfc2V0dmFsKHYsIGUtPnZhbC52YWwsIHQtPnQuY3R5cGUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChlLT5uZXh0ID09IE5VTEwpIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotLyogRXhwb3NlZCBmb3IgdGVzdGluZyBvbmx5LiAqLwotYm9vbCB1cGJfc3RydGFibGVfcmVzaXplKHVwYl9zdHJ0YWJsZSAqdCwgc2l6ZV90IHNpemVfbGcyKTsKLQotLyogSXRlcmF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSXRlcmF0b3JzIGZvciBpbnQgYW5kIHN0cmluZyB0YWJsZXMuICBXZSBhcmUgc3ViamVjdCB0byBzb21lIGtpbmQgb2YgdW51c3VhbAotICogZGVzaWduIGNvbnN0cmFpbnRzOgotICoKLSAqIEZvciBoaWdoLWxldmVsIGxhbmd1YWdlczoKLSAqICAtIHdlIG11c3QgYmUgYWJsZSB0byBndWFyYW50ZWUgdGhhdCB3ZSBkb24ndCBjcmFzaCBvciBjb3JydXB0IG1lbW9yeSBldmVuIGlmCi0gKiAgICB0aGUgcHJvZ3JhbSBhY2Nlc3NlcyBhbiBpbnZhbGlkYXRlZCBpdGVyYXRvci4KLSAqCi0gKiBGb3IgQysrMTEgcmFuZ2UtYmFzZWQgZm9yOgotICogIC0gaXRlcmF0b3JzIG11c3QgYmUgY29weWFibGUKLSAqICAtIGl0ZXJhdG9ycyBtdXN0IGJlIGNvbXBhcmFibGUKLSAqICAtIGl0IG11c3QgYmUgcG9zc2libGUgdG8gY29uc3RydWN0IGFuICJlbmQiIHZhbHVlLgotICoKLSAqIEl0ZXJhdGlvbiBvcmRlciBpcyB1bmRlZmluZWQuCi0gKgotICogTW9kaWZ5aW5nIHRoZSB0YWJsZSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMuICB1cGJfe3N0cixpbnR9dGFibGVfZG9uZSgpIGlzCi0gKiBndWFyYW50ZWVkIHRvIHdvcmsgZXZlbiBvbiBhbiBpbnZhbGlkYXRlZCBpdGVyYXRvciwgYXMgbG9uZyBhcyB0aGUgdGFibGUgaXQKLSAqIGlzIGl0ZXJhdGluZyBvdmVyIGhhcyBub3QgYmVlbiBmcmVlZC4gIENhbGxpbmcgbmV4dCgpIG9yIGFjY2Vzc2luZyBkYXRhIGZyb20KLSAqIGFuIGludmFsaWRhdGVkIGl0ZXJhdG9yIHlpZWxkcyB1bnNwZWNpZmllZCBlbGVtZW50cyBmcm9tIHRoZSB0YWJsZSwgYnV0IGl0IGlzCi0gKiBndWFyYW50ZWVkIG5vdCB0byBjcmFzaCBhbmQgdG8gcmV0dXJuIHJlYWwgdGFibGUgZWxlbWVudHMgKGV4Y2VwdCB3aGVuIGRvbmUoKQotICogaXMgdHJ1ZSkuICovCi0KLQotLyogdXBiX3N0cnRhYmxlX2l0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICB1cGJfc3RydGFibGVfaXRlciBpOwotICogICB1cGJfc3RydGFibGVfYmVnaW4oJmksIHQpOwotICogICBmb3IoOyAhdXBiX3N0cnRhYmxlX2RvbmUoJmkpOyB1cGJfc3RydGFibGVfbmV4dCgmaSkpIHsKLSAqICAgICBjb25zdCBjaGFyICprZXkgPSB1cGJfc3RydGFibGVfaXRlcl9rZXkoJmkpOwotICogICAgIGNvbnN0IHVwYl92YWx1ZSB2YWwgPSB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaSk7Ci0gKiAgICAgLy8gLi4uCi0gKiAgIH0KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IHVwYl9zdHJ0YWJsZSAqdDsKLSAgc2l6ZV90IGluZGV4OwotfSB1cGJfc3RydGFibGVfaXRlcjsKLQotdm9pZCB1cGJfc3RydGFibGVfYmVnaW4odXBiX3N0cnRhYmxlX2l0ZXIgKmksIGNvbnN0IHVwYl9zdHJ0YWJsZSAqdCk7Ci12b2lkIHVwYl9zdHJ0YWJsZV9uZXh0KHVwYl9zdHJ0YWJsZV9pdGVyICppKTsKLWJvb2wgdXBiX3N0cnRhYmxlX2RvbmUoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkpOwotY29uc3QgY2hhciAqdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KHVwYl9zdHJ0YWJsZV9pdGVyICppKTsKLXNpemVfdCB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgodXBiX3N0cnRhYmxlX2l0ZXIgKmkpOwotdXBiX3ZhbHVlIHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKTsKLXZvaWQgdXBiX3N0cnRhYmxlX2l0ZXJfc2V0ZG9uZSh1cGJfc3RydGFibGVfaXRlciAqaSk7Ci1ib29sIHVwYl9zdHJ0YWJsZV9pdGVyX2lzZXF1YWwoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppMik7Ci0KLQotLyogdXBiX2ludHRhYmxlX2l0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICB1cGJfaW50dGFibGVfaXRlciBpOwotICogICB1cGJfaW50dGFibGVfYmVnaW4oJmksIHQpOwotICogICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAqICAgICB1aW50cHRyX3Qga2V5ID0gdXBiX2ludHRhYmxlX2l0ZXJfa2V5KCZpKTsKLSAqICAgICB1cGJfdmFsdWUgdmFsID0gdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpOwotICogICAgIC8vIC4uLgotICogICB9Ci0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCB1cGJfaW50dGFibGUgKnQ7Ci0gIHNpemVfdCBpbmRleDsKLSAgYm9vbCBhcnJheV9wYXJ0OwotfSB1cGJfaW50dGFibGVfaXRlcjsKLQotdm9pZCB1cGJfaW50dGFibGVfYmVnaW4odXBiX2ludHRhYmxlX2l0ZXIgKmksIGNvbnN0IHVwYl9pbnR0YWJsZSAqdCk7Ci12b2lkIHVwYl9pbnR0YWJsZV9uZXh0KHVwYl9pbnR0YWJsZV9pdGVyICppKTsKLWJvb2wgdXBiX2ludHRhYmxlX2RvbmUoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpOwotdWludHB0cl90IHVwYl9pbnR0YWJsZV9pdGVyX2tleShjb25zdCB1cGJfaW50dGFibGVfaXRlciAqaSk7Ci11cGJfdmFsdWUgdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpOwotdm9pZCB1cGJfaW50dGFibGVfaXRlcl9zZXRkb25lKHVwYl9pbnR0YWJsZV9pdGVyICppKTsKLWJvb2wgdXBiX2ludHRhYmxlX2l0ZXJfaXNlcXVhbChjb25zdCB1cGJfaW50dGFibGVfaXRlciAqaTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkyKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8qIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9UQUJMRV9IXyAqLwotCi0vKiBSZWZlcmVuY2UgdHJhY2tpbmcgd2lsbCBjaGVjayByZWYoKS91bnJlZigpIG9wZXJhdGlvbnMgdG8gbWFrZSBzdXJlIHRoZQotICogcmVmIG93bmVyc2hpcCBpcyBjb3JyZWN0LiAgV2hlcmUgcG9zc2libGUgaXQgd2lsbCBhbHNvIG1ha2UgdG9vbHMgbGlrZQotICogVmFsZ3JpbmQgYXR0cmlidXRlIHJlZiBsZWFrcyB0byB0aGUgY29kZSB0aGF0IHRvb2sgdGhlIGxlYWtlZCByZWYsIG5vdAotICogdGhlIGNvZGUgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhlIG9iamVjdC4KLSAqCi0gKiBFbmFibGluZyB0aGlzIHJlcXVpcmVzIHRoZSBhcHBsaWNhdGlvbiB0byBkZWZpbmUgdXBiX2xvY2soKS91cGJfdW5sb2NrKCkKLSAqIGZ1bmN0aW9ucyB0aGF0IGFjcXVpcmUvcmVsZWFzZSBhIGdsb2JhbCBtdXRleCAob3IgI2RlZmluZSBVUEJfVEhSRUFEX1VOU0FGRSkuCi0gKiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3QgZW5hYmxlIGl0IGJ5IGRlZmF1bHQsIGV2ZW4gaW4gZGVidWcgYnVpbGRzLgotICovCi0KLS8qICNkZWZpbmUgVVBCX0RFQlVHX1JFRlMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgdXBiIHsgY2xhc3MgUmVmQ291bnRlZDsgfQotI2VuZGlmCi0KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpSZWZDb3VudGVkLCB1cGJfcmVmY291bnRlZCkKLQotc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0Ymw7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1jbGFzcyB1cGI6OlJlZkNvdW50ZWQgewotIHB1YmxpYzoKLSAgLyogUmV0dXJucyB0cnVlIGlmIHRoZSBnaXZlbiBvYmplY3QgaXMgZnJvemVuLiAqLwotICBib29sIElzRnJvemVuKCkgY29uc3Q7Ci0KLSAgLyogSW5jcmVhc2VzIHRoZSByZWYgY291bnQsIHRoZSBuZXcgcmVmIGlzIG93bmVkIGJ5ICJvd25lciIgd2hpY2ggbXVzdCBub3QKLSAgICogYWxyZWFkeSBvd24gYSByZWYgKGFuZCBzaG91bGQgbm90IGl0c2VsZiBiZSBhIHJlZmNvdW50ZWQgb2JqZWN0IGlmIHRoZSByZWYKLSAgICogY291bGQgcG9zc2libHkgYmUgY2lyY3VsYXI7IHNlZSBiZWxvdykuCi0gICAqIFRocmVhZC1zYWZlIGlmZiAidGhpcyIgaXMgZnJvemVuLiAqLwotICB2b2lkIFJlZihjb25zdCB2b2lkICpvd25lcikgY29uc3Q7Ci0KLSAgLyogUmVsZWFzZSBhIHJlZiB0aGF0IHdhcyBhY3F1aXJlZCBmcm9tIHVwYl9yZWZjb3VudGVkX3JlZigpIGFuZCBjb2xsZWN0cyBhbnkKLSAgICogb2JqZWN0cyBpdCBjYW4uICovCi0gIHZvaWQgVW5yZWYoY29uc3Qgdm9pZCAqb3duZXIpIGNvbnN0OwotCi0gIC8qIE1vdmVzIGFuIGV4aXN0aW5nIHJlZiBmcm9tICJmcm9tIiB0byAidG8iLCB3aXRob3V0IGNoYW5naW5nIHRoZSBvdmVyYWxsCi0gICAqIHJlZiBjb3VudC4gIERvbmF0ZVJlZihmb28sIE5VTEwsIG93bmVyKSBpcyB0aGUgc2FtZSBhcyBSZWYoZm9vLCBvd25lciksCi0gICAqIGJ1dCAidG8iIG1heSBub3QgYmUgTlVMTC4gKi8KLSAgdm9pZCBEb25hdGVSZWYoY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8pIGNvbnN0OwotCi0gIC8qIFZlcmlmaWVzIHRoYXQgYSByZWYgdG8gdGhlIGdpdmVuIG9iamVjdCBpcyBjdXJyZW50bHkgaGVsZCBieSB0aGUgZ2l2ZW4KLSAgICogb3duZXIuICBPbmx5IGVmZmVjdGl2ZSBpbiBVUEJfREVCVUdfUkVGUyBidWlsZHMuICovCi0gIHZvaWQgQ2hlY2tSZWYoY29uc3Qgdm9pZCAqb3duZXIpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoUmVmQ291bnRlZCwgdXBiOjpSZWZDb3VudGVkKQotI2Vsc2UKLXN0cnVjdCB1cGJfcmVmY291bnRlZCB7Ci0jZW5kaWYKLSAgLyogVE9ETyhoYWJlcm1hbik6IG1vdmUgdGhlIGFjdHVhbCBzdHJ1Y3R1cmUgZGVmaW5pdGlvbiB0byBzdHJ1Y3RkZWZzLmludC5oLgotICAgKiBUaGUgb25seSByZWFzb24gdGhleSBhcmUgaGVyZSBpcyBiZWNhdXNlIGlubGluZSBmdW5jdGlvbnMgbmVlZCB0byBzZWUgdGhlCi0gICAqIGRlZmluaXRpb24gb2YgdXBiX2hhbmRsZXJzLCB3aGljaCBuZWVkcyB0byBzZWUgdGhpcyBkZWZpbml0aW9uLiAgQnV0IHdlCi0gICAqIGNhbiBjaGFuZ2UgdGhlIHVwYl9oYW5kbGVycyBpbmxpbmUgZnVuY3Rpb25zIHRvIGRlYWwgaW4gcmF3IG9mZnNldHMKLSAgICogaW5zdGVhZC4KLSAgICovCi0KLSAgLyogQSBzaW5nbGUgcmVmZXJlbmNlIGNvdW50IHNoYXJlZCBieSBhbGwgb2JqZWN0cyBpbiB0aGUgZ3JvdXAuICovCi0gIHVpbnQzMl90ICpncm91cDsKLQotICAvKiBBIHNpbmdseS1saW5rZWQgbGlzdCBvZiBhbGwgb2JqZWN0cyBpbiB0aGUgZ3JvdXAuICovCi0gIHVwYl9yZWZjb3VudGVkICpuZXh0OwotCi0gIC8qIFRhYmxlIG9mIGZ1bmN0aW9uIHBvaW50ZXJzIGZvciB0aGlzIHR5cGUuICovCi0gIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsICp2dGJsOwotCi0gIC8qIE1haW50YWluZWQgb25seSB3aGVuIG11dGFibGUsIHRoaXMgdHJhY2tzIHRoZSBudW1iZXIgb2YgcmVmcyAoYnV0IG5vdAotICAgKiByZWYyJ3MpIHRvIHRoaXMgb2JqZWN0LiAgKmdyb3VwIHNob3VsZCBiZSB0aGUgc3VtIG9mIGFsbCBpbmRpdmlkdWFsX2NvdW50Ci0gICAqIGluIHRoZSBncm91cC4gKi8KLSAgdWludDMyX3QgaW5kaXZpZHVhbF9jb3VudDsKLQotICBib29sIGlzX2Zyb3plbjsKLQotI2lmZGVmIFVQQl9ERUJVR19SRUZTCi0gIHVwYl9pbnR0YWJsZSAqcmVmczsgIC8qIE1hcHMgb3duZXIgLT4gdHJhY2tlZHJlZiBmb3IgaW5jb21pbmcgcmVmcy4gKi8KLSAgdXBiX2ludHRhYmxlICpyZWYyczsgLyogU2V0IG9mIHRhcmdldHMgZm9yIG91dGdvaW5nIHJlZjJzLiAqLwotI2VuZGlmCi19OwotCi0jaWZkZWYgVVBCX0RFQlVHX1JFRlMKLSNkZWZpbmUgVVBCX1JFRkNPVU5UX0lOSVQocmVmcywgcmVmMnMpIFwKLSAgICB7JnN0YXRpY19yZWZjb3VudCwgTlVMTCwgTlVMTCwgMCwgdHJ1ZSwgcmVmcywgcmVmMnN9Ci0jZWxzZQotI2RlZmluZSBVUEJfUkVGQ09VTlRfSU5JVChyZWZzLCByZWYycykgeyZzdGF0aWNfcmVmY291bnQsIE5VTEwsIE5VTEwsIDAsIHRydWV9Ci0jZW5kaWYKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIEl0IGlzIGJldHRlciB0byB1c2UgdHJhY2tlZCByZWZzIHdoZW4gcG9zc2libGUsIGZvciB0aGUgZXh0cmEgZGVidWdnaW5nCi0gKiBjYXBhYmlsaXR5LiAgQnV0IGlmIHRoaXMgaXMgbm90IHBvc3NpYmxlIChiZWNhdXNlIHlvdSBkb24ndCBoYXZlIGVhc3kgYWNjZXNzCi0gKiB0byBhIHN0YWJsZSBwb2ludGVyIHZhbHVlIHRoYXQgaXMgYXNzb2NpYXRlZCB3aXRoIHRoZSByZWYpLCB5b3UgY2FuIHBhc3MKLSAqIFVQQl9VTlRSQUNLRURfUkVGIGluc3RlYWQuICAqLwotZXh0ZXJuIGNvbnN0IHZvaWQgKlVQQl9VTlRSQUNLRURfUkVGOwotCi0vKiBOYXRpdmUgQyBBUEkuICovCi1ib29sIHVwYl9yZWZjb3VudGVkX2lzZnJvemVuKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKTsKLXZvaWQgdXBiX3JlZmNvdW50ZWRfcmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lcik7Ci12b2lkIHVwYl9yZWZjb3VudGVkX3VucmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lcik7Ci12b2lkIHVwYl9yZWZjb3VudGVkX2RvbmF0ZXJlZigKLSAgICBjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8pOwotdm9pZCB1cGJfcmVmY291bnRlZF9jaGVja3JlZihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIpOwotCi0jZGVmaW5lIFVQQl9SRUZDT1VOVEVEX0NNRVRIT0RTKHR5cGUsIHVwY2FzdGZ1bmMpIFwKLSAgVVBCX0lOTElORSBib29sIHR5cGUgIyMgX2lzZnJvemVuKGNvbnN0IHR5cGUgKnYpIHsgXAotICAgIHJldHVybiB1cGJfcmVmY291bnRlZF9pc2Zyb3plbih1cGNhc3RmdW5jKHYpKTsgXAotICB9IFwKLSAgVVBCX0lOTElORSB2b2lkIHR5cGUgIyMgX3JlZihjb25zdCB0eXBlICp2LCBjb25zdCB2b2lkICpvd25lcikgeyBcCi0gICAgdXBiX3JlZmNvdW50ZWRfcmVmKHVwY2FzdGZ1bmModiksIG93bmVyKTsgXAotICB9IFwKLSAgVVBCX0lOTElORSB2b2lkIHR5cGUgIyMgX3VucmVmKGNvbnN0IHR5cGUgKnYsIGNvbnN0IHZvaWQgKm93bmVyKSB7IFwKLSAgICB1cGJfcmVmY291bnRlZF91bnJlZih1cGNhc3RmdW5jKHYpLCBvd25lcik7IFwKLSAgfSBcCi0gIFVQQl9JTkxJTkUgdm9pZCB0eXBlICMjIF9kb25hdGVyZWYoY29uc3QgdHlwZSAqdiwgY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8pIHsgXAotICAgIHVwYl9yZWZjb3VudGVkX2RvbmF0ZXJlZih1cGNhc3RmdW5jKHYpLCBmcm9tLCB0byk7IFwKLSAgfSBcCi0gIFVQQl9JTkxJTkUgdm9pZCB0eXBlICMjIF9jaGVja3JlZihjb25zdCB0eXBlICp2LCBjb25zdCB2b2lkICpvd25lcikgeyBcCi0gICAgdXBiX3JlZmNvdW50ZWRfY2hlY2tyZWYodXBjYXN0ZnVuYyh2KSwgb3duZXIpOyBcCi0gIH0KLQotI2RlZmluZSBVUEJfUkVGQ09VTlRFRF9DUFBNRVRIT0RTIFwKLSAgYm9vbCBJc0Zyb3plbigpIGNvbnN0IHsgXAotICAgIHJldHVybiB1cGI6OnVwY2FzdF90bzxjb25zdCB1cGI6OlJlZkNvdW50ZWQ+KHRoaXMpLT5Jc0Zyb3plbigpOyBcCi0gIH0gXAotICB2b2lkIFJlZihjb25zdCB2b2lkICpvd25lcikgY29uc3QgeyBcCi0gICAgcmV0dXJuIHVwYjo6dXBjYXN0X3RvPGNvbnN0IHVwYjo6UmVmQ291bnRlZD4odGhpcyktPlJlZihvd25lcik7IFwKLSAgfSBcCi0gIHZvaWQgVW5yZWYoY29uc3Qgdm9pZCAqb3duZXIpIGNvbnN0IHsgXAotICAgIHJldHVybiB1cGI6OnVwY2FzdF90bzxjb25zdCB1cGI6OlJlZkNvdW50ZWQ+KHRoaXMpLT5VbnJlZihvd25lcik7IFwKLSAgfSBcCi0gIHZvaWQgRG9uYXRlUmVmKGNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvKSBjb25zdCB7IFwKLSAgICByZXR1cm4gdXBiOjp1cGNhc3RfdG88Y29uc3QgdXBiOjpSZWZDb3VudGVkPih0aGlzKS0+RG9uYXRlUmVmKGZyb20sIHRvKTsgXAotICB9IFwKLSAgdm9pZCBDaGVja1JlZihjb25zdCB2b2lkICpvd25lcikgY29uc3QgeyBcCi0gICAgcmV0dXJuIHVwYjo6dXBjYXN0X3RvPGNvbnN0IHVwYjo6UmVmQ291bnRlZD4odGhpcyktPkNoZWNrUmVmKG93bmVyKTsgXAotICB9Ci0KLS8qIEludGVybmFsLXRvLXVwYiBJbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgdm9pZCB1cGJfcmVmY291bnRlZF92aXNpdChjb25zdCB1cGJfcmVmY291bnRlZCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfcmVmY291bnRlZCAqc3Vib2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpOwotCi1zdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB7Ci0gIC8qIE11c3QgdmlzaXQgYWxsIHN1Ym9iamVjdHMgdGhhdCBhcmUgY3VycmVudGx5IHJlZidkIHZpYSB1cGJfcmVmY291bnRlZF9yZWYyLgotICAgKiBNdXN0IGJlIGxvbmdqbXAoKS1zYWZlLiAqLwotICB2b2lkICgqdmlzaXQpKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZF92aXNpdCAqdmlzaXQsIHZvaWQgKmMpOwotCi0gIC8qIE11c3QgZnJlZSB0aGUgb2JqZWN0IGFuZCByZWxlYXNlIGFsbCByZWZlcmVuY2VzIHRvIG90aGVyIG9iamVjdHMuICovCi0gIHZvaWQgKCpmcmVlKSh1cGJfcmVmY291bnRlZCAqcik7Ci19OwotCi0vKiBJbml0aWFsaXplcyB0aGUgcmVmY291bnRlZCB3aXRoIGEgc2luZ2xlIHJlZiBmb3IgdGhlIGdpdmVuIG93bmVyLiAgUmV0dXJucwotICogZmFsc2UgaWYgbWVtb3J5IGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuICovCi1ib29sIHVwYl9yZWZjb3VudGVkX2luaXQodXBiX3JlZmNvdW50ZWQgKnIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgKnZ0YmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3duZXIpOwotCi0vKiBBZGRzIGEgcmVmIGZyb20gb25lIHJlZmNvdW50ZWQgb2JqZWN0IHRvIGFub3RoZXIgKCJmcm9tIiBtdXN0IG5vdCBhbHJlYWR5Ci0gKiBvd24gYSByZWYpLiAgVGhlc2UgcmVmcyBtYXkgYmUgY2lyY3VsYXI7IGN5Y2xlcyB3aWxsIGJlIGNvbGxlY3RlZCBjb3JyZWN0bHkKLSAqIChpZiBjb25zZXJ2YXRpdmVseSkuICBUaGVzZSByZWZzIGRvIG5vdCBuZWVkIHRvIGJlIGZyZWVkIGluIGZyb20ncyBmcmVlKCkKLSAqIGZ1bmN0aW9uLiAqLwotdm9pZCB1cGJfcmVmY291bnRlZF9yZWYyKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZCAqZnJvbSk7Ci0KLS8qIFJlbW92ZXMgYSByZWYgdGhhdCB3YXMgYWNxdWlyZWQgZnJvbSB1cGJfcmVmY291bnRlZF9yZWYyKCksIGFuZCBjb2xsZWN0cyBhbnkKLSAqIG9iamVjdCBpdCBjYW4uICBUaGlzIGlzIG9ubHkgbmVjZXNzYXJ5IHdoZW4gImZyb20iIG5vIGxvbmdlciBwb2ludHMgdG8gInIiLAotICogYW5kIG5vdCBmcm9tIGZyb20ncyAiZnJlZSIgZnVuY3Rpb24uICovCi12b2lkIHVwYl9yZWZjb3VudGVkX3VucmVmMihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWQgKmZyb20pOwotCi0jZGVmaW5lIHVwYl9yZWYyKHIsIGZyb20pIFwKLSAgICB1cGJfcmVmY291bnRlZF9yZWYyKChjb25zdCB1cGJfcmVmY291bnRlZCopciwgKHVwYl9yZWZjb3VudGVkKilmcm9tKQotI2RlZmluZSB1cGJfdW5yZWYyKHIsIGZyb20pIFwKLSAgICB1cGJfcmVmY291bnRlZF91bnJlZjIoKGNvbnN0IHVwYl9yZWZjb3VudGVkKilyLCAodXBiX3JlZmNvdW50ZWQqKWZyb20pCi0KLS8qIEZyZWV6ZXMgYWxsIG11dGFibGUgb2JqZWN0IHJlYWNoYWJsZSBieSByZWYyKCkgcmVmcyBmcm9tIHRoZSBnaXZlbiByb290cy4KLSAqIFRoaXMgd2lsbCBzcGxpdCByZWZjb3VudGluZyBncm91cHMgaW50byBwcmVjaXNlIFNDQyBncm91cHMsIHNvIHRoYXQKLSAqIHJlZmNvdW50aW5nIG9mIGZyb3plbiBvYmplY3RzIGNhbiBiZSBtb3JlIGFnZ3Jlc3NpdmUuICBJZiBtZW1vcnkgYWxsb2NhdGlvbgotICogZmFpbHMsIG9yIGlmIG1vcmUgdGhhbiAyKiozMSBtdXRhYmxlIG9iamVjdHMgYXJlIHJlYWNoYWJsZSBmcm9tICJyb290cyIsIG9yCi0gKiBpZiB0aGUgbWF4aW11bSBkZXB0aCBvZiB0aGUgZ3JhcGggZXhjZWVkcyAibWF4ZGVwdGgiLCBmYWxzZSBpcyByZXR1cm5lZCBhbmQKLSAqIHRoZSBvYmplY3RzIGFyZSB1bmNoYW5nZWQuCi0gKgotICogQWZ0ZXIgdGhpcyBvcGVyYXRpb24gc3VjY2VlZHMsIHRoZSBvYmplY3RzIGFyZSBmcm96ZW4vY29uc3QsIGFuZCBtYXkgbm90IGJlCi0gKiB1c2VkIHRocm91Z2ggbm9uLWNvbnN0IHBvaW50ZXJzLiAgSW4gcGFydGljdWxhciwgdGhleSBtYXkgbm90IGJlIHBhc3NlZCBhcwotICogdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdXBiX3JlZmNvdW50ZWRfe3JlZix1bnJlZn0yKCkuICBPbiB0aGUgdXBzaWRlLCBhbGwKLSAqIG9wZXJhdGlvbnMgb24gZnJvemVuIHJlZmNvdW50ZWRzIGFyZSB0aHJlYWRzYWZlLCBhbmQgb2JqZWN0cyB3aWxsIGJlIGZyZWVkCi0gKiBhdCB0aGUgcHJlY2lzZSBtb21lbnQgdGhhdCB0aGV5IGJlY29tZSB1bnJlYWNoYWJsZS4KLSAqCi0gKiBDYWxsZXIgbXVzdCBvd24gcmVmcyBvbiBlYWNoIG9iamVjdCBpbiB0aGUgInJvb3RzIiBsaXN0LiAqLwotYm9vbCB1cGJfcmVmY291bnRlZF9mcmVlemUodXBiX3JlZmNvdW50ZWQgKmNvbnN0KnJvb3RzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhkZXB0aCk7Ci0KLS8qIFNoYXJlZCBieSBhbGwgY29tcGlsZWQtaW4gcmVmY291bnRlZCBvYmplY3RzLiAqLwotZXh0ZXJuIHVpbnQzMl90IHN0YXRpY19yZWZjb3VudDsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLS8qIEMrKyBXcmFwcGVycy4gKi8KLW5hbWVzcGFjZSB1cGIgewotaW5saW5lIGJvb2wgUmVmQ291bnRlZDo6SXNGcm96ZW4oKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfcmVmY291bnRlZF9pc2Zyb3plbih0aGlzKTsKLX0KLWlubGluZSB2b2lkIFJlZkNvdW50ZWQ6OlJlZihjb25zdCB2b2lkICpvd25lcikgY29uc3QgewotICB1cGJfcmVmY291bnRlZF9yZWYodGhpcywgb3duZXIpOwotfQotaW5saW5lIHZvaWQgUmVmQ291bnRlZDo6VW5yZWYoY29uc3Qgdm9pZCAqb3duZXIpIGNvbnN0IHsKLSAgdXBiX3JlZmNvdW50ZWRfdW5yZWYodGhpcywgb3duZXIpOwotfQotaW5saW5lIHZvaWQgUmVmQ291bnRlZDo6RG9uYXRlUmVmKGNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvKSBjb25zdCB7Ci0gIHVwYl9yZWZjb3VudGVkX2RvbmF0ZXJlZih0aGlzLCBmcm9tLCB0byk7Ci19Ci1pbmxpbmUgdm9pZCBSZWZDb3VudGVkOjpDaGVja1JlZihjb25zdCB2b2lkICpvd25lcikgY29uc3QgewotICB1cGJfcmVmY291bnRlZF9jaGVja3JlZih0aGlzLCBvd25lcik7Ci19Ci19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfUkVGQ09VTlRfSF8gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8Y3N0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi1uYW1lc3BhY2UgdXBiIHsKLWNsYXNzIERlZjsKLWNsYXNzIEVudW1EZWY7Ci1jbGFzcyBGaWVsZERlZjsKLWNsYXNzIE1lc3NhZ2VEZWY7Ci1jbGFzcyBPbmVvZkRlZjsKLX0KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUodXBiOjpEZWYsIHVwYjo6UmVmQ291bnRlZCwgdXBiX2RlZiwgdXBiX3JlZmNvdW50ZWQpCi0KLS8qIFRoZSBtYXhpbXVtIG1lc3NhZ2UgZGVwdGggdGhhdCB0aGUgdHlwZSBncmFwaCBjYW4gaGF2ZS4gIFRoaXMgaXMgYSByZXNvdXJjZQotICogbGltaXQgZm9yIHRoZSBDIHN0YWNrIHNpbmNlIHdlIHNvbWV0aW1lcyBuZWVkIHRvIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZQotICogZ3JhcGguICBDeWNsZXMgYXJlIG9rOyB0aGUgdHJhdmVyc2FsIHdpbGwgc3RvcCB3aGVuIGl0IGRldGVjdHMgYSBjeWNsZSwgYnV0Ci0gKiB3ZSBtdXN0IGhpdCB0aGUgY3ljbGUgYmVmb3JlIHRoZSBtYXhpbXVtIGRlcHRoIGlzIHJlYWNoZWQuCi0gKgotICogSWYgaGF2aW5nIGEgc2luZ2xlIHN0YXRpYyBsaW1pdCBpcyB0b28gaW5mbGV4aWJsZSwgd2UgY2FuIGFkZCBhbm90aGVyIHZhcmlhbnQKLSAqIG9mIERlZjo6RnJlZXplIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhpcyBhcyBhIHBhcmFtZXRlci4gKi8KLSNkZWZpbmUgVVBCX01BWF9NRVNTQUdFX0RFUFRIIDY0Ci0KLQotLyogdXBiOjpEZWY6IGJhc2UgY2xhc3MgZm9yIGRlZnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQWxsIHRoZSBkaWZmZXJlbnQga2luZCBvZiBkZWZzIHdlIHN1cHBvcnQuICBUaGVzZSBjb3JyZXNwb25kIDE6MSB3aXRoCi0gKiBkZWNsYXJhdGlvbnMgaW4gYSAucHJvdG8gZmlsZS4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9ERUZfTVNHLAotICBVUEJfREVGX0ZJRUxELAotICBVUEJfREVGX0VOVU0sCi0gIFVQQl9ERUZfT05FT0YsCi0gIFVQQl9ERUZfU0VSVklDRSwgICAvKiBOb3QgeWV0IGltcGxlbWVudGVkLiAqLwotICBVUEJfREVGX0FOWSA9IC0xICAgLyogV2lsZGNhcmQgZm9yIHVwYl9zeW10YWJfZ2V0KigpICovCi19IHVwYl9kZWZ0eXBlX3Q7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGUgYmFzZSBjbGFzcyBvZiBhbGwgZGVmcy4gIEl0cyBiYXNlIGlzIHVwYjo6UmVmQ291bnRlZCAodXNlIHVwYjo6dXBjYXN0KCkKLSAqIHRvIGNvbnZlcnQpLiAqLwotY2xhc3MgdXBiOjpEZWYgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB1cGJfZGVmdHlwZV90IFR5cGU7Ci0KLSAgRGVmKiBEdXAoY29uc3Qgdm9pZCAqb3duZXIpIGNvbnN0OwotCi0gIC8qIHVwYjo6UmVmQ291bnRlZCBtZXRob2RzIGxpa2UgUmVmKCkvVW5yZWYoKS4gKi8KLSAgVVBCX1JFRkNPVU5URURfQ1BQTUVUSE9EUwotCi0gIFR5cGUgZGVmX3R5cGUoKSBjb25zdDsKLQotICAvKiAiZnVsbG5hbWUiIGlzIHRoZSBkZWYncyBmdWxseS1xdWFsaWZpZWQgbmFtZSAoZWcuIGZvby5iYXIuTWVzc2FnZSkuICovCi0gIGNvbnN0IGNoYXIgKmZ1bGxfbmFtZSgpIGNvbnN0OwotCi0gIC8qIFRoZSBkZWYgbXVzdCBiZSBtdXRhYmxlLiAgQ2FsbGVyIHJldGFpbnMgb3duZXJzaGlwIG9mIGZ1bGxuYW1lLiAgRGVmcyBhcmUKLSAgICogbm90IHJlcXVpcmVkIHRvIGhhdmUgYSBuYW1lOyBpZiBhIGRlZiBoYXMgbm8gbmFtZSB3aGVuIGl0IGlzIGZyb3plbiwgaXQKLSAgICogd2lsbCByZW1haW4gYW4gYW5vbnltb3VzIGRlZi4gIE9uIGZhaWx1cmUsIHJldHVybnMgZmFsc2UgYW5kIGRldGFpbHMgaW4gInMiCi0gICAqIGlmIG5vbi1OVUxMLiAqLwotICBib29sIHNldF9mdWxsX25hbWUoY29uc3QgY2hhciogZnVsbG5hbWUsIHVwYjo6U3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfZnVsbF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZmdWxsbmFtZSwgdXBiOjpTdGF0dXMqIHMpOwotCi0gIC8qIEZyZWV6ZXMgdGhlIGdpdmVuIGRlZnM7IHRoaXMgdmFsaWRhdGVzIGFsbCBjb25zdHJhaW50cyBhbmQgbWFya3MgdGhlIGRlZnMKLSAgICogYXMgZnJvemVuIChyZWFkLW9ubHkpLiAgImRlZnMiIG1heSBub3QgY29udGFpbiBhbnkgZmllbGRkZWZzLCBidXQgZmllbGRzCi0gICAqIG9mIGFueSBtc2dkZWZzIHdpbGwgYmUgZnJvemVuLgotICAgKgotICAgKiBTeW1ib2xpYyByZWZlcmVuY2VzIHRvIHN1Yi10eXBlcyBhbmQgZW51bSBkZWZhdWx0cyBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuCi0gICAqIHJlc29sdmVkLiAgQW55IG11dGFibGUgZGVmcyByZWFjaGFibGUgZnJvbSBhbnkgb2YgImRlZnMiIG11c3QgYWxzbyBiZSBpbgotICAgKiB0aGUgbGlzdDsgbW9yZSBmb3JtYWxseSwgImRlZnMiIG11c3QgYmUgYSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgbXV0YWJsZQotICAgKiBkZWZzLgotICAgKgotICAgKiBBZnRlciB0aGlzIG9wZXJhdGlvbiBzdWNjZWVkcywgdGhlIGZpbmFsaXplZCBkZWZzIG11c3Qgb25seSBiZSBhY2Nlc3NlZAotICAgKiB0aHJvdWdoIGEgY29uc3QgcG9pbnRlciEgKi8KLSAgc3RhdGljIGJvb2wgRnJlZXplKERlZiogY29uc3QqIGRlZnMsIGludCBuLCBTdGF0dXMqIHN0YXR1cyk7Ci0gIHN0YXRpYyBib29sIEZyZWV6ZShjb25zdCBzdGQ6OnZlY3RvcjxEZWYqPiYgZGVmcywgU3RhdHVzKiBzdGF0dXMpOwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoRGVmLCB1cGI6OkRlZikKLX07Ci0KLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIE5hdGl2ZSBDIEFQSS4gKi8KLXVwYl9kZWYgKnVwYl9kZWZfZHVwKGNvbnN0IHVwYl9kZWYgKmRlZiwgY29uc3Qgdm9pZCAqb3duZXIpOwotCi0vKiBJbmNsdWRlIHVwYl9yZWZjb3VudGVkIG1ldGhvZHMgbGlrZSB1cGJfZGVmX3JlZigpL3VwYl9kZWZfdW5yZWYoKS4gKi8KLVVQQl9SRUZDT1VOVEVEX0NNRVRIT0RTKHVwYl9kZWYsIHVwYl9kZWZfdXBjYXN0KQotCi11cGJfZGVmdHlwZV90IHVwYl9kZWZfdHlwZShjb25zdCB1cGJfZGVmICpkKTsKLWNvbnN0IGNoYXIgKnVwYl9kZWZfZnVsbG5hbWUoY29uc3QgdXBiX2RlZiAqZCk7Ci1ib29sIHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX2RlZiAqZGVmLCBjb25zdCBjaGFyICpmdWxsbmFtZSwgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9kZWZfZnJlZXplKHVwYl9kZWYgKmNvbnN0ICpkZWZzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcyk7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotCi0vKiB1cGI6OkRlZiBjYXN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgVVBCX0NQUF9DQVNUUyhjbmFtZSwgY3BwdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5hbWVzcGFjZSB1cGIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGNwcHR5cGUgKmRvd25fY2FzdDxjcHB0eXBlICosIERlZj4oRGVmICogZGVmKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHVwYl9kb3duY2FzdF8jI2NuYW1lIyNfbXV0YWJsZShkZWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBjcHB0eXBlICpkeW5fY2FzdDxjcHB0eXBlICosIERlZj4oRGVmICogZGVmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB1cGJfZHluY2FzdF8jI2NuYW1lIyNfbXV0YWJsZShkZWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3QgY3BwdHlwZSAqZG93bl9jYXN0PGNvbnN0IGNwcHR5cGUgKiwgY29uc3QgRGVmPiggICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IERlZiAqZGVmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHVwYl9kb3duY2FzdF8jI2NuYW1lKGRlZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBjb25zdCBjcHB0eXBlICpkeW5fY2FzdDxjb25zdCBjcHB0eXBlICosIGNvbnN0IERlZj4oY29uc3QgRGVmICpkZWYpIHsgXAotICAgIHJldHVybiB1cGJfZHluY2FzdF8jI2NuYW1lKGRlZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3QgY3BwdHlwZSAqZG93bl9jYXN0PGNvbnN0IGNwcHR5cGUgKiwgRGVmPihEZWYgKiBkZWYpIHsgICAgICAgICAgIFwKLSAgICByZXR1cm4gdXBiX2Rvd25jYXN0XyMjY25hbWUoZGVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGNvbnN0IGNwcHR5cGUgKmR5bl9jYXN0PGNvbnN0IGNwcHR5cGUgKiwgRGVmPihEZWYgKiBkZWYpIHsgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHVwYl9keW5jYXN0XyMjY25hbWUoZGVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2Vsc2UKLSNkZWZpbmUgVVBCX0NQUF9DQVNUUyhjbmFtZSwgY3BwdHlwZSkKLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotLyogRHluYW1pYyBjYXN0cywgZm9yIGRldGVybWluaW5nIGlmIGEgZGVmIGlzIG9mIGEgcGFydGljdWxhciB0eXBlIGF0IHJ1bnRpbWUuCi0gKiBEb3duY2FzdHMsIGZvciB3aGVuIHNvbWUgd2FudHMgdG8gYXNzZXJ0IHRoYXQgYSBkZWYgaXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCi0gKiBUaGVzZSBhcmUgb25seSBjaGVja2VkIGlmIHdlIGFyZSBidWlsZGluZyBkZWJ1Zy4gKi8KLSNkZWZpbmUgVVBCX0RFRl9DQVNUUyhsb3dlciwgdXBwZXIsIGNwcHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSBjb25zdCB1cGJfIyNsb3dlciAqdXBiX2R5bmNhc3RfIyNsb3dlcihjb25zdCB1cGJfZGVmICpkZWYpIHsgIFwKLSAgICBpZiAodXBiX2RlZl90eXBlKGRlZikgIT0gVVBCX0RFRl8jI3VwcGVyKSByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gKHVwYl8jI2xvd2VyICopZGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSBjb25zdCB1cGJfIyNsb3dlciAqdXBiX2Rvd25jYXN0XyMjbG93ZXIoY29uc3QgdXBiX2RlZiAqZGVmKSB7IFwKLSAgICBhc3NlcnQodXBiX2RlZl90eXBlKGRlZikgPT0gVVBCX0RFRl8jI3VwcGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gKGNvbnN0IHVwYl8jI2xvd2VyICopZGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSB1cGJfIyNsb3dlciAqdXBiX2R5bmNhc3RfIyNsb3dlciMjX211dGFibGUodXBiX2RlZiAqZGVmKSB7ICAgIFwKLSAgICByZXR1cm4gKHVwYl8jI2xvd2VyICopdXBiX2R5bmNhc3RfIyNsb3dlcihkZWYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSB1cGJfIyNsb3dlciAqdXBiX2Rvd25jYXN0XyMjbG93ZXIjI19tdXRhYmxlKHVwYl9kZWYgKmRlZikgeyAgIFwKLSAgICByZXR1cm4gKHVwYl8jI2xvd2VyICopdXBiX2Rvd25jYXN0XyMjbG93ZXIoZGVmKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0NQUF9DQVNUUyhsb3dlciwgY3BwdHlwZSkKLQotI2RlZmluZSBVUEJfREVGSU5FX0RFRihjcHBuYW1lLCBsb3dlciwgdXBwZXIsIGNwcG1ldGhvZHMsIG1lbWJlcnMpICAgICAgICAgICAgIFwKLSAgVVBCX0RFRklORV9DTEFTUzIoY3BwbmFtZSwgdXBiOjpEZWYsIHVwYjo6UmVmQ291bnRlZCwgY3BwbWV0aG9kcywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgbWVtYmVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfREVGX0NBU1RTKGxvd2VyLCB1cHBlciwgY3BwbmFtZSkKLQotI2RlZmluZSBVUEJfREVDTEFSRV9ERUZfVFlQRShjcHBuYW1lLCBsb3dlciwgdXBwZXIpIFwKLSAgVVBCX0RFQ0xBUkVfREVSSVZFRF9UWVBFMihjcHBuYW1lLCB1cGI6OkRlZiwgdXBiOjpSZWZDb3VudGVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiXyAjIyBsb3dlciwgdXBiX2RlZiwgdXBiX3JlZmNvdW50ZWQpIFwKLSAgVVBCX0RFRl9DQVNUUyhsb3dlciwgdXBwZXIsIGNwcG5hbWUpCi0KLVVQQl9ERUNMQVJFX0RFRl9UWVBFKHVwYjo6RmllbGREZWYsIGZpZWxkZGVmLCBGSUVMRCkKLVVQQl9ERUNMQVJFX0RFRl9UWVBFKHVwYjo6TWVzc2FnZURlZiwgbXNnZGVmLCBNU0cpCi1VUEJfREVDTEFSRV9ERUZfVFlQRSh1cGI6OkVudW1EZWYsIGVudW1kZWYsIEVOVU0pCi1VUEJfREVDTEFSRV9ERUZfVFlQRSh1cGI6Ok9uZW9mRGVmLCBvbmVvZmRlZiwgT05FT0YpCi0KLSN1bmRlZiBVUEJfREVDTEFSRV9ERUZfVFlQRQotI3VuZGVmIFVQQl9ERUZfQ0FTVFMKLSN1bmRlZiBVUEJfQ1BQX0NBU1RTCi0KLQotLyogdXBiOjpGaWVsZERlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIHR5cGVzIGEgZmllbGQgY2FuIGhhdmUuICBOb3RlIHRoYXQgdGhpcyBsaXN0IGlzIG5vdCBpZGVudGljYWwgdG8gdGhlCi0gKiB0eXBlcyBkZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8sIHdoaWNoIGdpdmVzIElOVDMyIGFuZCBTSU5UMzIgc2VwYXJhdGUKLSAqIHR5cGVzICh3ZSBkaXN0aW5ndWlzaCB0aGUgdHdvIHdpdGggdGhlICJpbnRlZ2VyIGVuY29kaW5nIiBlbnVtIGJlbG93KS4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9UWVBFX0ZMT0FUICAgID0gMSwKLSAgVVBCX1RZUEVfRE9VQkxFICAgPSAyLAotICBVUEJfVFlQRV9CT09MICAgICA9IDMsCi0gIFVQQl9UWVBFX1NUUklORyAgID0gNCwKLSAgVVBCX1RZUEVfQllURVMgICAgPSA1LAotICBVUEJfVFlQRV9NRVNTQUdFICA9IDYsCi0gIFVQQl9UWVBFX0VOVU0gICAgID0gNywgIC8qIEVudW0gdmFsdWVzIGFyZSBpbnQzMi4gKi8KLSAgVVBCX1RZUEVfSU5UMzIgICAgPSA4LAotICBVUEJfVFlQRV9VSU5UMzIgICA9IDksCi0gIFVQQl9UWVBFX0lOVDY0ICAgID0gMTAsCi0gIFVQQl9UWVBFX1VJTlQ2NCAgID0gMTEKLX0gdXBiX2ZpZWxkdHlwZV90OwotCi0vKiBUaGUgcmVwZWF0ZWQtbmVzcyBvZiBlYWNoIGZpZWxkOyB0aGlzIG1hdGNoZXMgZGVzY3JpcHRvci5wcm90by4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9MQUJFTF9PUFRJT05BTCA9IDEsCi0gIFVQQl9MQUJFTF9SRVFVSVJFRCA9IDIsCi0gIFVQQl9MQUJFTF9SRVBFQVRFRCA9IDMKLX0gdXBiX2xhYmVsX3Q7Ci0KLS8qIEhvdyBpbnRlZ2VycyBzaG91bGQgYmUgZW5jb2RlZCBpbiBzZXJpYWxpemF0aW9ucyB0aGF0IG9mZmVyIG11bHRpcGxlCi0gKiBpbnRlZ2VyIGVuY29kaW5nIG1ldGhvZHMuICovCi10eXBlZGVmIGVudW0gewotICBVUEJfSU5URk1UX1ZBUklBQkxFID0gMSwKLSAgVVBCX0lOVEZNVF9GSVhFRCA9IDIsCi0gIFVQQl9JTlRGTVRfWklHWkFHID0gMyAgIC8qIE9ubHkgZm9yIHNpZ25lZCB0eXBlcyAoSU5UMzIvSU5UNjQpLiAqLwotfSB1cGJfaW50Zm10X3Q7Ci0KLS8qIERlc2NyaXB0b3IgdHlwZXMsIGFzIGRlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90by4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9ERVNDUklQVE9SX1RZUEVfRE9VQkxFICAgPSAxLAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0ZMT0FUICAgID0gMiwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9JTlQ2NCAgICA9IDMsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfVUlOVDY0ICAgPSA0LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0lOVDMyICAgID0gNSwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDY0ICA9IDYsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfRklYRUQzMiAgPSA3LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0JPT0wgICAgID0gOCwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9TVFJJTkcgICA9IDksCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfR1JPVVAgICAgPSAxMCwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9NRVNTQUdFICA9IDExLAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0JZVEVTICAgID0gMTIsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfVUlOVDMyICAgPSAxMywKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9FTlVNICAgICA9IDE0LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX1NGSVhFRDMyID0gMTUsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfU0ZJWEVENjQgPSAxNiwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzIgICA9IDE3LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX1NJTlQ2NCAgID0gMTgKLX0gdXBiX2Rlc2NyaXB0b3J0eXBlX3Q7Ci0KLS8qIE1heGltdW0gZmllbGQgbnVtYmVyIGFsbG93ZWQgZm9yIEZpZWxkRGVmcy4gIFRoaXMgaXMgYW4gaW5oZXJlbnQgbGltaXQgb2YgdGhlCi0gKiBwcm90b2J1ZiB3aXJlIGZvcm1hdC4gKi8KLSNkZWZpbmUgVVBCX01BWF9GSUVMRE5VTUJFUiAoKDEgPDwgMjkpIC0gMSkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIEEgdXBiX2ZpZWxkZGVmIGRlc2NyaWJlcyBhIHNpbmdsZSBmaWVsZCBpbiBhIG1lc3NhZ2UuICBJdCBpcyBtb3N0IG9mdGVuCi0gKiBmb3VuZCBhcyBhIHBhcnQgb2YgYSB1cGJfbXNnZGVmLCBidXQgY2FuIGFsc28gc3RhbmQgYWxvbmUgdG8gcmVwcmVzZW50Ci0gKiBhbiBleHRlbnNpb24uCi0gKgotICogSXRzIGJhc2UgY2xhc3MgaXMgdXBiOjpEZWYgKHVzZSB1cGI6OnVwY2FzdCgpIHRvIGNvbnZlcnQpLiAqLwotY2xhc3MgdXBiOjpGaWVsZERlZiB7Ci0gcHVibGljOgotICB0eXBlZGVmIHVwYl9maWVsZHR5cGVfdCBUeXBlOwotICB0eXBlZGVmIHVwYl9sYWJlbF90IExhYmVsOwotICB0eXBlZGVmIHVwYl9pbnRmbXRfdCBJbnRlZ2VyRm9ybWF0OwotICB0eXBlZGVmIHVwYl9kZXNjcmlwdG9ydHlwZV90IERlc2NyaXB0b3JUeXBlOwotCi0gIC8qIFRoZXNlIHJldHVybiB0cnVlIGlmIHRoZSBnaXZlbiB2YWx1ZSBpcyBhIHZhbGlkIG1lbWJlciBvZiB0aGUgZW51bWVyYXRpb24uICovCi0gIHN0YXRpYyBib29sIENoZWNrVHlwZShpbnQzMl90IHZhbCk7Ci0gIHN0YXRpYyBib29sIENoZWNrTGFiZWwoaW50MzJfdCB2YWwpOwotICBzdGF0aWMgYm9vbCBDaGVja0Rlc2NyaXB0b3JUeXBlKGludDMyX3QgdmFsKTsKLSAgc3RhdGljIGJvb2wgQ2hlY2tJbnRlZ2VyRm9ybWF0KGludDMyX3QgdmFsKTsKLQotICAvKiBUaGVzZSBjb252ZXJ0IHRvIHRoZSBnaXZlbiBlbnVtZXJhdGlvbjsgdGhleSByZXF1aXJlIHRoYXQgdGhlIHZhbHVlIGlzCi0gICAqIHZhbGlkLiAqLwotICBzdGF0aWMgVHlwZSBDb252ZXJ0VHlwZShpbnQzMl90IHZhbCk7Ci0gIHN0YXRpYyBMYWJlbCBDb252ZXJ0TGFiZWwoaW50MzJfdCB2YWwpOwotICBzdGF0aWMgRGVzY3JpcHRvclR5cGUgQ29udmVydERlc2NyaXB0b3JUeXBlKGludDMyX3QgdmFsKTsKLSAgc3RhdGljIEludGVnZXJGb3JtYXQgQ29udmVydEludGVnZXJGb3JtYXQoaW50MzJfdCB2YWwpOwotCi0gIC8qIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPEZpZWxkRGVmPiBOZXcoKTsKLQotICAvKiBEdXBsaWNhdGVzIHRoZSBnaXZlbiBmaWVsZCwgcmV0dXJuaW5nIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLgotICAgKiBXaGVuIGEgZmllbGRkZWYgaXMgZHVwbGljYXRlZCwgdGhlIHN1YmRlZiAoaWYgYW55KSBpcyBtYWRlIHN5bWJvbGljIGlmIGl0Ci0gICAqIHdhc24ndCBhbHJlYWR5LiAgSWYgdGhlIHN1YmRlZiBpcyBzZXQgYnV0IGhhcyBubyBuYW1lICh3aGljaCBpcyBwb3NzaWJsZQotICAgKiBzaW5jZSBtc2dkZWZzIGFyZSBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIG5hbWUpIHRoZSBuZXcgZmllbGRkZWYncyBzdWJkZWYKLSAgICogd2lsbCBiZSB1bnNldC4gKi8KLSAgRmllbGREZWYqIER1cChjb25zdCB2b2lkKiBvd25lcikgY29uc3Q7Ci0KLSAgLyogdXBiOjpSZWZDb3VudGVkIG1ldGhvZHMgbGlrZSBSZWYoKS9VbnJlZigpLiAqLwotICBVUEJfUkVGQ09VTlRFRF9DUFBNRVRIT0RTCi0KLSAgLyogRnVuY3Rpb25hbGl0eSBmcm9tIHVwYjo6RGVmLiAqLwotICBjb25zdCBjaGFyKiBmdWxsX25hbWUoKSBjb25zdDsKLQotICBib29sIHR5cGVfaXNfc2V0KCkgY29uc3Q7ICAvKiBzZXRfW2Rlc2NyaXB0b3JfXXR5cGUoKSBoYXMgYmVlbiBjYWxsZWQ/ICovCi0gIFR5cGUgdHlwZSgpIGNvbnN0OyAgICAgICAgIC8qIFJlcXVpcmVzIHRoYXQgdHlwZV9pc19zZXQoKSA9PSB0cnVlLiAqLwotICBMYWJlbCBsYWJlbCgpIGNvbnN0OyAgICAgICAvKiBEZWZhdWx0cyB0byBVUEJfTEFCRUxfT1BUSU9OQUwuICovCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsgIC8qIE5VTEwgaWYgdW5pbml0aWFsaXplZC4gKi8KLSAgdWludDMyX3QgbnVtYmVyKCkgY29uc3Q7ICAgLyogUmV0dXJucyAwIGlmIHVuaW5pdGlhbGl6ZWQuICovCi0gIGJvb2wgaXNfZXh0ZW5zaW9uKCkgY29uc3Q7Ci0KLSAgLyogRm9yIFVQQl9UWVBFX01FU1NBR0UgZmllbGRzIG9ubHkgd2hlcmUgaXNfdGFnX2RlbGltaXRlZCgpID09IGZhbHNlLAotICAgKiBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGZpZWxkIHNob3VsZCBoYXZlIGxhenkgcGFyc2luZyBoYW5kbGVycyB0aGF0IHlpZWxkCi0gICAqIHRoZSB1bnBhcnNlZCBzdHJpbmcgZm9yIHRoZSBzdWJtZXNzYWdlLgotICAgKgotICAgKiBUT0RPKGhhYmVybWFuKTogSSB0aGluayB3ZSB3YW50IHRvIG1vdmUgdGhpcyBpbnRvIGEgRmllbGRPcHRpb25zIGNvbnRhaW5lcgotICAgKiB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciBjdXN0b20gb3B0aW9ucyAodGhlIEZpZWxkT3B0aW9ucyBzdHJ1Y3Qgd2lsbAotICAgKiBjb250YWluIGJvdGggcmVndWxhciBGaWVsZE9wdGlvbnMgbGlrZSAibGF6eSIgKmFuZCogY3VzdG9tIG9wdGlvbnMpLiAqLwotICBib29sIGxhenkoKSBjb25zdDsKLQotICAvKiBGb3Igbm9uLXN0cmluZywgbm9uLXN1Ym1lc3NhZ2UgZmllbGRzLCB0aGlzIGluZGljYXRlcyB3aGV0aGVyIGJpbmFyeQotICAgKiBwcm90b2J1ZnMgYXJlIGVuY29kZWQgaW4gcGFja2VkIG9yIG5vbi1wYWNrZWQgZm9ybWF0LgotICAgKgotICAgKiBUT0RPKGhhYmVybWFuKTogc2VlIG5vdGUgYWJvdmUgYWJvdXQgcHV0dGluZyBvcHRpb25zIGxpa2UgdGhpcyBpbnRvIGEKLSAgICogRmllbGRPcHRpb25zIGNvbnRhaW5lci4gKi8KLSAgYm9vbCBwYWNrZWQoKSBjb25zdDsKLQotICAvKiBBbiBpbnRlZ2VyIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggaW50byBhbiBhcnJheSBvZiBmaWVsZHMgZm9yCi0gICAqIHdoYXRldmVyIG1lc3NhZ2UgdGhpcyBmaWVsZCBiZWxvbmdzIHRvLiAgR3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4KLSAgICogZi0+Y29udGFpbmluZ190eXBlKCktPmZpZWxkX2NvdW50KCkuICBNYXkgb25seSBiZSBhY2Nlc3NlZCBvbmNlIHRoZSBkZWYgaGFzCi0gICAqIGJlZW4gZmluYWxpemVkLiAqLwotICBpbnQgaW5kZXgoKSBjb25zdDsKLQotICAvKiBUaGUgTWVzc2FnZURlZiB0byB3aGljaCB0aGlzIGZpZWxkIGJlbG9uZ3MuCi0gICAqCi0gICAqIElmIHRoaXMgZmllbGQgaGFzIGJlZW4gYWRkZWQgdG8gYSBNZXNzYWdlRGVmLCB0aGF0IG1lc3NhZ2UgY2FuIGJlIHJldHJpZXZlZAotICAgKiBkaXJlY3RseSAodGhpcyBpcyBhbHdheXMgdGhlIGNhc2UgZm9yIGZyb3plbiBGaWVsZERlZnMpLgotICAgKgotICAgKiBJZiB0aGUgZmllbGQgaGFzIG5vdCB5ZXQgYmVlbiBhZGRlZCB0byBhIE1lc3NhZ2VEZWYsIHlvdSBjYW4gc2V0IHRoZSBuYW1lCi0gICAqIG9mIHRoZSBjb250YWluaW5nIHR5cGUgc3ltYm9saWNhbGx5IGluc3RlYWQuICBUaGlzIGlzIG1vc3RseSB1c2VmdWwgZm9yCi0gICAqIGV4dGVuc2lvbnMsIHdoZXJlIHRoZSBleHRlbnNpb24gaXMgZGVjbGFyZWQgc2VwYXJhdGVseSBmcm9tIHRoZSBtZXNzYWdlLiAqLwotICBjb25zdCBNZXNzYWdlRGVmKiBjb250YWluaW5nX3R5cGUoKSBjb25zdDsKLSAgY29uc3QgY2hhciogY29udGFpbmluZ190eXBlX25hbWUoKTsKLQotICAvKiBUaGUgT25lb2ZEZWYgdG8gd2hpY2ggdGhpcyBmaWVsZCBiZWxvbmdzLCBvciBOVUxMIGlmIHRoaXMgZmllbGQgaXMgbm90IHBhcnQKLSAgICogb2YgYSBvbmVvZi4gKi8KLSAgY29uc3QgT25lb2ZEZWYqIGNvbnRhaW5pbmdfb25lb2YoKSBjb25zdDsKLQotICAvKiBUaGUgZmllbGQncyB0eXBlIGFjY29yZGluZyB0byB0aGUgZW51bSBpbiBkZXNjcmlwdG9yLnByb3RvLiAgVGhpcyBpcyBub3QKLSAgICogdGhlIHNhbWUgYXMgVVBCX1RZUEVfKiwgYmVjYXVzZSBpdCBkaXN0aW5ndWlzaGVzIGJldHdlZW4gKGZvciBleGFtcGxlKQotICAgKiBJTlQzMiBhbmQgU0lOVDMyLCB3aGVyZWFzIG91ciAidHlwZSIgZW51bSBkb2VzIG5vdC4gIFRoaXMgcmV0dXJuIG9mCi0gICAqIGRlc2NyaXB0b3JfdHlwZSgpIGlzIGEgZnVuY3Rpb24gb2YgdHlwZSgpLCBpbnRlZ2VyX2Zvcm1hdCgpLCBhbmQKLSAgICogaXNfdGFnX2RlbGltaXRlZCgpLiAgTGlrZXdpc2Ugc2V0X2Rlc2NyaXB0b3JfdHlwZSgpIHNldHMgYWxsIHRocmVlCi0gICAqIGFwcHJvcHJpYXRlbHkuICovCi0gIERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3JfdHlwZSgpIGNvbnN0OwotCi0gIC8qIENvbnZlbmllbnQgZmllbGQgdHlwZSB0ZXN0cy4gKi8KLSAgYm9vbCBJc1N1Yk1lc3NhZ2UoKSBjb25zdDsKLSAgYm9vbCBJc1N0cmluZygpIGNvbnN0OwotICBib29sIElzU2VxdWVuY2UoKSBjb25zdDsKLSAgYm9vbCBJc1ByaW1pdGl2ZSgpIGNvbnN0OwotICBib29sIElzTWFwKCkgY29uc3Q7Ci0KLSAgLyogSG93IGludGVnZXJzIGFyZSBlbmNvZGVkLiAgT25seSBtZWFuaW5nZnVsIGZvciBpbnRlZ2VyIHR5cGVzLgotICAgKiBEZWZhdWx0cyB0byBVUEJfSU5URk1UX1ZBUklBQkxFLCBhbmQgaXMgcmVzZXQgd2hlbiAidHlwZSIgY2hhbmdlcy4gKi8KLSAgSW50ZWdlckZvcm1hdCBpbnRlZ2VyX2Zvcm1hdCgpIGNvbnN0OwotCi0gIC8qIFdoZXRoZXIgYSBzdWJtZXNzYWdlIGZpZWxkIGlzIHRhZy1kZWxpbWl0ZWQgb3Igbm90IChpZiBmYWxzZSwgdGhlbgotICAgKiBsZW5ndGgtZGVsaW1pdGVkKS4gIE1heSBvbmx5IGJlIHNldCB3aGVuIHR5cGUoKSA9PSBVUEJfVFlQRV9NRVNTQUdFLiAqLwotICBib29sIGlzX3RhZ19kZWxpbWl0ZWQoKSBjb25zdDsKLQotICAvKiBSZXR1cm5zIHRoZSBub24tc3RyaW5nIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGRkZWYsIHdoaWNoIG1heSBlaXRoZXIKLSAgICogYmUgc29tZXRoaW5nIHRoZSBjbGllbnQgc2V0IGV4cGxpY2l0bHkgb3IgdGhlICJkZWZhdWx0IGRlZmF1bHQiICgwIGZvcgotICAgKiBudW1iZXJzLCBlbXB0eSBmb3Igc3RyaW5ncykuICBUaGUgZmllbGQncyB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUKLSAgICogcmV0dXJuZWQgdmFsdWUsIGV4Y2VwdCBmb3IgZW51bSBmaWVsZHMgdGhhdCBhcmUgc3RpbGwgbXV0YWJsZS4KLSAgICoKLSAgICogUmVxdWlyZXMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gbWF0Y2hlcyB0aGUgZmllbGQncyBjdXJyZW50IHR5cGUuICovCi0gIGludDY0X3QgZGVmYXVsdF9pbnQ2NCgpIGNvbnN0OwotICBpbnQzMl90IGRlZmF1bHRfaW50MzIoKSBjb25zdDsKLSAgdWludDY0X3QgZGVmYXVsdF91aW50NjQoKSBjb25zdDsKLSAgdWludDMyX3QgZGVmYXVsdF91aW50MzIoKSBjb25zdDsKLSAgYm9vbCBkZWZhdWx0X2Jvb2woKSBjb25zdDsKLSAgZmxvYXQgZGVmYXVsdF9mbG9hdCgpIGNvbnN0OwotICBkb3VibGUgZGVmYXVsdF9kb3VibGUoKSBjb25zdDsKLQotICAvKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBhbHdheXMgTlVMTC10ZXJtaW5hdGVkLiAgSWYgbm9uLU5VTEwsIHRoZSBsZW5ndGgKLSAgICogd2lsbCBiZSBzdG9yZWQgaW4gKmxlbi4gKi8KLSAgY29uc3QgY2hhciAqZGVmYXVsdF9zdHJpbmcoc2l6ZV90KiBsZW4pIGNvbnN0OwotCi0gIC8qIEZvciBmcm96ZW4gVVBCX1RZUEVfRU5VTSBmaWVsZHMsIGVudW0gZGVmYXVsdHMgY2FuIGFsd2F5cyBiZSByZWFkIGFzIGVpdGhlcgotICAgKiBzdHJpbmcgb3IgaW50MzIsIGFuZCBib3RoIG9mIHRoZXNlIG1ldGhvZHMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUuCi0gICAqCi0gICAqIEZvciBtdXRhYmxlIFVQQl9UWVBFX0VOVU0gZmllbGRzLCB0aGUgc3RvcnkgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4KLSAgICogRW51bSBkZWZhdWx0cyBhcmUgdW51c3VhbC4gVGhleSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBzdHJpbmcgb3IgaW50MzIsCi0gICAqIGJ1dCB0byBiZSB2YWxpZCB0aGUgZW51bSBtdXN0IGhhdmUgdGhhdCB2YWx1ZSBhcyBhIG1lbWJlci4gIEFuZCBpZiBubwotICAgKiBkZWZhdWx0IGlzIHNwZWNpZmllZCwgdGhlICJkZWZhdWx0IGRlZmF1bHQiIGNvbWVzIGZyb20gdGhlIEVudW1EZWYuCi0gICAqCi0gICAqIFdlIGFsbG93IHJlYWRpbmcgdGhlIGRlZmF1bHQgYXMgZWl0aGVyIGFuIGludDMyIG9yIGEgc3RyaW5nLCBidXQgb25seSBpZgotICAgKiB3ZSBoYXZlIGEgbWVhbmluZ2Z1bCB2YWx1ZSB0byByZXBvcnQuICBXZSBoYXZlIGEgbWVhbmluZ2Z1bCB2YWx1ZSBpZiBpdCB3YXMKLSAgICogc2V0IGV4cGxpY2l0bHksIG9yIGlmIHdlIGNvdWxkIGdldCB0aGUgImRlZmF1bHQgZGVmYXVsdCIgZnJvbSB0aGUgRW51bURlZi4KLSAgICogQWxzbyBpZiB5b3UgZXhwbGljaXRseSBzZXQgdGhlIG5hbWUgYW5kIHdlIGZpbmQgdGhlIG51bWJlciBpbiB0aGUgRW51bURlZiAqLwotICBib29sIEVudW1IYXNTdHJpbmdEZWZhdWx0KCkgY29uc3Q7Ci0gIGJvb2wgRW51bUhhc0ludDMyRGVmYXVsdCgpIGNvbnN0OwotCi0gIC8qIFN1Ym1lc3NhZ2UgYW5kIGVudW0gZmllbGRzIG11c3QgcmVmZXJlbmNlIGEgInN1YmRlZiIsIHdoaWNoIGlzIHRoZQotICAgKiB1cGI6Ok1lc3NhZ2VEZWYgb3IgdXBiOjpFbnVtRGVmIHRoYXQgZGVmaW5lcyB0aGVpciB0eXBlLiAgTm90ZSB0aGF0IHdoZW4KLSAgICogdGhlIEZpZWxkRGVmIGlzIG11dGFibGUgaXQgbWF5IG5vdCBoYXZlIGEgc3ViZGVmICp5ZXQqLCBidXQgdGhpcyBmdW5jdGlvbgotICAgKiBzdGlsbCByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmllbGQncyB0eXBlIHJlcXVpcmVzIGEgc3ViZGVmLiAqLwotICBib29sIEhhc1N1YkRlZigpIGNvbnN0OwotCi0gIC8qIFJldHVybnMgdGhlIGVudW0gb3Igc3VibWVzc2FnZSBkZWYgZm9yIHRoaXMgZmllbGQsIGlmIGFueS4gIFRoZSBmaWVsZCdzCi0gICAqIHR5cGUgbXVzdCBtYXRjaCAoaWUuIHlvdSBtYXkgb25seSBjYWxsIGVudW1fc3ViZGVmKCkgZm9yIGZpZWxkcyB3aGVyZQotICAgKiB0eXBlKCkgPT0gVVBCX1RZUEVfRU5VTSkuICBSZXR1cm5zIE5VTEwgaWYgdGhlIHN1YmRlZiBoYXMgbm90IGJlZW4gc2V0IG9yCi0gICAqIGlzIGN1cnJlbnRseSBzZXQgc3ltYm9saWNhbGx5LiAqLwotICBjb25zdCBFbnVtRGVmKiBlbnVtX3N1YmRlZigpIGNvbnN0OwotICBjb25zdCBNZXNzYWdlRGVmKiBtZXNzYWdlX3N1YmRlZigpIGNvbnN0OwotCi0gIC8qIFJldHVybnMgdGhlIGdlbmVyaWMgc3ViZGVmIGZvciB0aGlzIGZpZWxkLiAgUmVxdWlyZXMgdGhhdCBIYXNTdWJEZWYoKSAoaWUuCi0gICAqIG9ubHkgd29ya3MgZm9yIFVQQl9UWVBFX0VOVU0gYW5kIFVQQl9UWVBFX01FU1NBR0UgZmllbGRzKS4gKi8KLSAgY29uc3QgRGVmKiBzdWJkZWYoKSBjb25zdDsKLQotICAvKiBSZXR1cm5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBzdWJkZWYuICBJZiB0aGUgc3ViZGVmIGlzIGN1cnJlbnRseSBzZXQKLSAgICogdW5yZXNvbHZlZCAoaWUuIHNldCBzeW1ib2xpY2FsbHkpIHJldHVybnMgdGhlIHN5bWJvbGljIG5hbWUuICBJZiBpdCBoYXMKLSAgICogYmVlbiByZXNvbHZlZCB0byBhIHNwZWNpZmljIHN1YmRlZiwgcmV0dXJucyB0aGUgbmFtZSBmcm9tIHRoYXQgc3ViZGVmLiAqLwotICBjb25zdCBjaGFyKiBzdWJkZWZfbmFtZSgpIGNvbnN0OwotCi0gIC8qIFNldHRlcnMgKG5vbi1jb25zdCBtZXRob2RzKSwgb25seSB2YWxpZCBmb3IgbXV0YWJsZSBGaWVsZERlZnMhICoqKioqKioqKioqLwotCi0gIGJvb2wgc2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgdXBiOjpTdGF0dXMqIHMpOwotICBib29sIHNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxuYW1lLCB1cGI6OlN0YXR1cyogcyk7Ci0KLSAgLyogVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgaWYgY29udGFpbmluZ190eXBlKCkgPT0gTlVMTCAoaWUuIHRoZSBmaWVsZCBoYXMgbm90Ci0gICAqIGJlZW4gYWRkZWQgdG8gYSBtZXNzYWdlIHlldCkuICovCi0gIGJvb2wgc2V0X2NvbnRhaW5pbmdfdHlwZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIFN0YXR1cyogc3RhdHVzKTsKLSAgYm9vbCBzZXRfY29udGFpbmluZ190eXBlX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFN0YXR1cyogc3RhdHVzKTsKLQotICAvKiBEZWZhdWx0cyB0byBmYWxzZS4gIFdoZW4gd2UgZnJlZXplLCB3ZSBlbnN1cmUgdGhhdCB0aGlzIGNhbiBvbmx5IGJlIHRydWUKLSAgICogZm9yIGxlbmd0aC1kZWxpbWl0ZWQgbWVzc2FnZSBmaWVsZHMuICBQcmlvciB0byBmcmVlemluZyB0aGlzIGNhbiBiZSB0cnVlIG9yCi0gICAqIGZhbHNlIHdpdGggbm8gcmVzdHJpY3Rpb25zLiAqLwotICB2b2lkIHNldF9sYXp5KGJvb2wgbGF6eSk7Ci0KLSAgLyogRGVmYXVsdHMgdG8gdHJ1ZS4gIFNldHMgd2hldGhlciB0aGlzIGZpZWxkIGlzIGVuY29kZWQgaW4gcGFja2VkIGZvcm1hdC4gKi8KLSAgdm9pZCBzZXRfcGFja2VkKGJvb2wgcGFja2VkKTsKLQotICAvKiAidHlwZSIgb3IgImRlc2NyaXB0b3JfdHlwZSIgTVVTVCBiZSBzZXQgZXhwbGljaXRseSBiZWZvcmUgdGhlIGZpZWxkZGVmIGlzCi0gICAqIGZpbmFsaXplZC4gIFRoZXNlIHNldHRlcnMgcmVxdWlyZSB0aGF0IHRoZSBlbnVtIHZhbHVlIGlzIHZhbGlkOyBpZiB0aGUKLSAgICogdmFsdWUgZGlkIG5vdCBjb21lIGRpcmVjdGx5IGZyb20gYW4gZW51bSBjb25zdGFudCwgdGhlIGNhbGxlciBzaG91bGQKLSAgICogdmFsaWRhdGUgaXQgZmlyc3Qgd2l0aCB0aGUgZnVuY3Rpb25zIGFib3ZlIChDaGVja0ZpZWxkVHlwZSgpLCBldGMpLiAqLwotICB2b2lkIHNldF90eXBlKFR5cGUgdHlwZSk7Ci0gIHZvaWQgc2V0X2xhYmVsKExhYmVsIGxhYmVsKTsKLSAgdm9pZCBzZXRfZGVzY3JpcHRvcl90eXBlKERlc2NyaXB0b3JUeXBlIHR5cGUpOwotICB2b2lkIHNldF9pc19leHRlbnNpb24oYm9vbCBpc19leHRlbnNpb24pOwotCi0gIC8qICJudW1iZXIiIGFuZCAibmFtZSIgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBGaWVsZERlZiBpcyBhZGRlZCB0byBhCi0gICAqIE1lc3NhZ2VEZWYsIGFuZCBtYXkgbm90IGJlIHNldCBhZnRlciB0aGF0LgotICAgKgotICAgKiAibmFtZSIgaXMgdGhlIHNhbWUgYXMgZnVsbF9uYW1lKCkvc2V0X2Z1bGxfbmFtZSgpLCBidXQgc2luY2UgZmllbGRkZWZzCi0gICAqIG1vc3Qgb2Z0ZW4gdXNlIHNpbXBsZSwgbm9uLXF1YWxpZmllZCBuYW1lcywgd2UgcHJvdmlkZSB0aGlzIGFjY2Vzc29yCi0gICAqIGFsc28uICBHZW5lcmFsbHkgb25seSBleHRlbnNpb25zIHdpbGwgd2FudCB0byB0aGluayBvZiB0aGlzIG5hbWUgYXMKLSAgICogZnVsbHktcXVhbGlmaWVkLiAqLwotICBib29sIHNldF9udW1iZXIodWludDMyX3QgbnVtYmVyLCB1cGI6OlN0YXR1cyogcyk7Ci0gIGJvb2wgc2V0X25hbWUoY29uc3QgY2hhciogbmFtZSwgdXBiOjpTdGF0dXMqIHMpOwotICBib29sIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1cGI6OlN0YXR1cyogcyk7Ci0KLSAgdm9pZCBzZXRfaW50ZWdlcl9mb3JtYXQoSW50ZWdlckZvcm1hdCBmb3JtYXQpOwotICBib29sIHNldF90YWdfZGVsaW1pdGVkKGJvb2wgdGFnX2RlbGltaXRlZCwgdXBiOjpTdGF0dXMqIHMpOwotCi0gIC8qIFNldHMgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZpZWxkLiAgVGhlIGNhbGwgbXVzdCBleGFjdGx5IG1hdGNoIHRoZSB0eXBlCi0gICAqIG9mIHRoZSBmaWVsZC4gIEVudW0gZmllbGRzIG1heSB1c2UgZWl0aGVyIHNldGludDMyIG9yIHNldHN0cmluZyB0byBzZXQKLSAgICogdGhlIGRlZmF1bHQgbnVtZXJpY2FsbHkgb3Igc3ltYm9saWNhbGx5LCByZXNwZWN0aXZlbHksIGJ1dCBzeW1ib2xpYwotICAgKiBkZWZhdWx0cyBtdXN0IGJlIHJlc29sdmVkIGJlZm9yZSBmaW5hbGl6aW5nIChzZWUgUmVzb2x2ZUVudW1EZWZhdWx0KCkpLgotICAgKgotICAgKiBDaGFuZ2luZyB0aGUgdHlwZSBvZiBhIGZpZWxkIHdpbGwgcmVzZXQgaXRzIGRlZmF1bHQuICovCi0gIHZvaWQgc2V0X2RlZmF1bHRfaW50NjQoaW50NjRfdCB2YWwpOwotICB2b2lkIHNldF9kZWZhdWx0X2ludDMyKGludDMyX3QgdmFsKTsKLSAgdm9pZCBzZXRfZGVmYXVsdF91aW50NjQodWludDY0X3QgdmFsKTsKLSAgdm9pZCBzZXRfZGVmYXVsdF91aW50MzIodWludDMyX3QgdmFsKTsKLSAgdm9pZCBzZXRfZGVmYXVsdF9ib29sKGJvb2wgdmFsKTsKLSAgdm9pZCBzZXRfZGVmYXVsdF9mbG9hdChmbG9hdCB2YWwpOwotICB2b2lkIHNldF9kZWZhdWx0X2RvdWJsZShkb3VibGUgdmFsKTsKLSAgYm9vbCBzZXRfZGVmYXVsdF9zdHJpbmcoY29uc3Qgdm9pZCAqc3RyLCBzaXplX3QgbGVuLCBTdGF0dXMgKnMpOwotICBib29sIHNldF9kZWZhdWx0X3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyAmc3RyLCBTdGF0dXMgKnMpOwotICB2b2lkIHNldF9kZWZhdWx0X2NzdHIoY29uc3QgY2hhciAqc3RyLCBTdGF0dXMgKnMpOwotCi0gIC8qIEJlZm9yZSBhIGZpZWxkZGVmIGlzIGZyb3plbiwgaXRzIHN1YmRlZiBtYXkgYmUgc2V0IGVpdGhlciBkaXJlY3RseSAod2l0aCBhCi0gICAqIHVwYjo6RGVmKikgb3Igc3ltYm9saWNhbGx5LiAgU3ltYm9saWMgcmVmcyBtdXN0IGJlIHJlc29sdmVkIGJlZm9yZSB0aGUKLSAgICogY29udGFpbmluZyBtc2dkZWYgY2FuIGJlIGZyb3plbiAoc2VlIHVwYl9yZXNvbHZlKCkgYWJvdmUpLiAgdXBiIGFsd2F5cwotICAgKiBndWFyYW50ZWVzIHRoYXQgYW55IGRlZiByZWFjaGFibGUgZnJvbSBhIGxpdmUgZGVmIHdpbGwgYWxzbyBiZSBrZXB0IGFsaXZlLgotICAgKgotICAgKiBCb3RoIG1ldGhvZHMgcmVxdWlyZSB0aGF0IHVwYl9oYXNzdWJkZWYoZikgKHNvIHRoZSB0eXBlIG11c3QgYmUgc2V0IHByaW9yCi0gICAqIHRvIGNhbGxpbmcgdGhlc2UgbWV0aG9kcykuICBSZXR1cm5zIGZhbHNlIGlmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciBpZgotICAgKiB0aGUgZ2l2ZW4gc3ViZGVmIGlzIG5vdCBvZiB0aGUgY29ycmVjdCB0eXBlLiAgVGhlIHN1YmRlZiBpcyByZXNldCBpZiB0aGUKLSAgICogZmllbGQncyB0eXBlIGlzIGNoYW5nZWQuICBUaGUgc3ViZGVmIGNhbiBiZSBzZXQgdG8gTlVMTCB0byBjbGVhciBpdC4gKi8KLSAgYm9vbCBzZXRfc3ViZGVmKGNvbnN0IERlZiogc3ViZGVmLCBTdGF0dXMqIHMpOwotICBib29sIHNldF9lbnVtX3N1YmRlZihjb25zdCBFbnVtRGVmKiBzdWJkZWYsIFN0YXR1cyogcyk7Ci0gIGJvb2wgc2V0X21lc3NhZ2Vfc3ViZGVmKGNvbnN0IE1lc3NhZ2VEZWYqIHN1YmRlZiwgU3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfc3ViZGVmX25hbWUoY29uc3QgY2hhciogbmFtZSwgU3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfc3ViZGVmX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsIFN0YXR1cyogcyk7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhGaWVsZERlZiwgdXBiOjpGaWVsZERlZikKLX07Ci0KLSMgZW5kaWYgIC8qIGRlZmluZWQoX19jcGx1c3BsdXMpICovCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBOYXRpdmUgQyBBUEkuICovCi11cGJfZmllbGRkZWYgKnVwYl9maWVsZGRlZl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpOwotdXBiX2ZpZWxkZGVmICp1cGJfZmllbGRkZWZfZHVwKGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgY29uc3Qgdm9pZCAqb3duZXIpOwotCi0vKiBJbmNsdWRlIHVwYl9yZWZjb3VudGVkIG1ldGhvZHMgbGlrZSB1cGJfZmllbGRkZWZfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfZmllbGRkZWYsIHVwYl9maWVsZGRlZl91cGNhc3QyKQotCi0vKiBNZXRob2RzIGZyb20gdXBiX2RlZi4gKi8KLWNvbnN0IGNoYXIgKnVwYl9maWVsZGRlZl9mdWxsbmFtZShjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfc2V0ZnVsbG5hbWUodXBiX2ZpZWxkZGVmICpmLCBjb25zdCBjaGFyICpmdWxsbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpOwotCi1ib29sIHVwYl9maWVsZGRlZl90eXBlaXNzZXQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLXVwYl9maWVsZHR5cGVfdCB1cGJfZmllbGRkZWZfdHlwZShjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotdXBiX2Rlc2NyaXB0b3J0eXBlX3QgdXBiX2ZpZWxkZGVmX2Rlc2NyaXB0b3J0eXBlKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci11cGJfbGFiZWxfdCB1cGJfZmllbGRkZWZfbGFiZWwoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLXVpbnQzMl90IHVwYl9maWVsZGRlZl9udW1iZXIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IGNoYXIgKnVwYl9maWVsZGRlZl9uYW1lKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9pc2V4dGVuc2lvbihjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfbGF6eShjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfcGFja2VkKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IHVwYl9vbmVvZmRlZiAqdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotdXBiX21zZ2RlZiAqdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlX211dGFibGUodXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IGNoYXIgKnVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZW5hbWUodXBiX2ZpZWxkZGVmICpmKTsKLXVwYl9pbnRmbXRfdCB1cGJfZmllbGRkZWZfaW50Zm10KGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci11aW50MzJfdCB1cGJfZmllbGRkZWZfaW5kZXgoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2lzdGFnZGVsaW0oY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2lzc3VibXNnKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9pc3N0cmluZyhjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfaXNzZXEoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2lzcHJpbWl0aXZlKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9pc21hcChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotaW50NjRfdCB1cGJfZmllbGRkZWZfZGVmYXVsdGludDY0KGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1pbnQzMl90IHVwYl9maWVsZGRlZl9kZWZhdWx0aW50MzIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLXVpbnQ2NF90IHVwYl9maWVsZGRlZl9kZWZhdWx0dWludDY0KGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci11aW50MzJfdCB1cGJfZmllbGRkZWZfZGVmYXVsdHVpbnQzMihjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfZGVmYXVsdGJvb2woY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWZsb2F0IHVwYl9maWVsZGRlZl9kZWZhdWx0ZmxvYXQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWRvdWJsZSB1cGJfZmllbGRkZWZfZGVmYXVsdGRvdWJsZShjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotY29uc3QgY2hhciAqdXBiX2ZpZWxkZGVmX2RlZmF1bHRzdHIoY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBzaXplX3QgKmxlbik7Ci1ib29sIHVwYl9maWVsZGRlZl9lbnVtaGFzZGVmYXVsdGludDMyKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9lbnVtaGFzZGVmYXVsdHN0cihjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfaGFzc3ViZGVmKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1jb25zdCB1cGJfZGVmICp1cGJfZmllbGRkZWZfc3ViZGVmKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJfZmllbGRkZWZfbXNnc3ViZGVmKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1jb25zdCB1cGJfZW51bWRlZiAqdXBiX2ZpZWxkZGVmX2VudW1zdWJkZWYoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IGNoYXIgKnVwYl9maWVsZGRlZl9zdWJkZWZuYW1lKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldHR5cGUodXBiX2ZpZWxkZGVmICpmLCB1cGJfZmllbGR0eXBlX3QgdHlwZSk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXRkZXNjcmlwdG9ydHlwZSh1cGJfZmllbGRkZWYgKmYsIGludCB0eXBlKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGxhYmVsKHVwYl9maWVsZGRlZiAqZiwgdXBiX2xhYmVsX3QgbGFiZWwpOwotYm9vbCB1cGJfZmllbGRkZWZfc2V0bnVtYmVyKHVwYl9maWVsZGRlZiAqZiwgdWludDMyX3QgbnVtYmVyLCB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX3NldG5hbWUodXBiX2ZpZWxkZGVmICpmLCBjb25zdCBjaGFyICpuYW1lLCB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX3NldGNvbnRhaW5pbmd0eXBlbmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXRpc2V4dGVuc2lvbih1cGJfZmllbGRkZWYgKmYsIGJvb2wgaXNfZXh0ZW5zaW9uKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGxhenkodXBiX2ZpZWxkZGVmICpmLCBib29sIGxhenkpOwotdm9pZCB1cGJfZmllbGRkZWZfc2V0cGFja2VkKHVwYl9maWVsZGRlZiAqZiwgYm9vbCBwYWNrZWQpOwotdm9pZCB1cGJfZmllbGRkZWZfc2V0aW50Zm10KHVwYl9maWVsZGRlZiAqZiwgdXBiX2ludGZtdF90IGZtdCk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXR0YWdkZWxpbSh1cGJfZmllbGRkZWYgKmYsIGJvb2wgdGFnX2RlbGltKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQ2NCh1cGJfZmllbGRkZWYgKmYsIGludDY0X3QgdmFsKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQzMih1cGJfZmllbGRkZWYgKmYsIGludDMyX3QgdmFsKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50NjQodXBiX2ZpZWxkZGVmICpmLCB1aW50NjRfdCB2YWwpOwotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdHVpbnQzMih1cGJfZmllbGRkZWYgKmYsIHVpbnQzMl90IHZhbCk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbCh1cGJfZmllbGRkZWYgKmYsIGJvb2wgdmFsKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRmbG9hdCh1cGJfZmllbGRkZWYgKmYsIGZsb2F0IHZhbCk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0ZG91YmxlKHVwYl9maWVsZGRlZiAqZiwgZG91YmxlIHZhbCk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0c3RyKHVwYl9maWVsZGRlZiAqZiwgY29uc3Qgdm9pZCAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRjc3RyKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRzdWJkZWYodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRtc2dzdWJkZWYodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfbXNnZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRlbnVtc3ViZGVmKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgdXBiX2VudW1kZWYgKnN1YmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNrbGFiZWwoaW50MzJfdCBsYWJlbCk7Ci1ib29sIHVwYl9maWVsZGRlZl9jaGVja3R5cGUoaW50MzJfdCB0eXBlKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNrZGVzY3JpcHRvcnR5cGUoaW50MzJfdCB0eXBlKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNraW50Zm10KGludDMyX3QgZm10KTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0KLS8qIHVwYjo6TWVzc2FnZURlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgdXBiX2ludHRhYmxlX2l0ZXIgdXBiX21zZ19maWVsZF9pdGVyOwotdHlwZWRlZiB1cGJfc3RydGFibGVfaXRlciB1cGJfbXNnX29uZW9mX2l0ZXI7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBTdHJ1Y3R1cmUgdGhhdCBkZXNjcmliZXMgYSBzaW5nbGUgLnByb3RvIG1lc3NhZ2UgdHlwZS4KLSAqCi0gKiBJdHMgYmFzZSBjbGFzcyBpcyB1cGI6OkRlZiAodXNlIHVwYjo6dXBjYXN0KCkgdG8gY29udmVydCkuICovCi1jbGFzcyB1cGI6Ok1lc3NhZ2VEZWYgewotIHB1YmxpYzoKLSAgLyogUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KLSAgc3RhdGljIHJlZmZlZF9wdHI8TWVzc2FnZURlZj4gTmV3KCk7Ci0KLSAgLyogdXBiOjpSZWZDb3VudGVkIG1ldGhvZHMgbGlrZSBSZWYoKS9VbnJlZigpLiAqLwotICBVUEJfUkVGQ09VTlRFRF9DUFBNRVRIT0RTCi0KLSAgLyogRnVuY3Rpb25hbGl0eSBmcm9tIHVwYjo6RGVmLiAqLwotICBjb25zdCBjaGFyKiBmdWxsX25hbWUoKSBjb25zdDsKLSAgYm9vbCBzZXRfZnVsbF9uYW1lKGNvbnN0IGNoYXIqIGZ1bGxuYW1lLCBTdGF0dXMqIHMpOwotICBib29sIHNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxuYW1lLCBTdGF0dXMqIHMpOwotCi0gIC8qIENhbGwgdG8gZnJlZXplIHRoaXMgTWVzc2FnZURlZi4KLSAgICogV0FSTklORzogdGhpcyB3aWxsIGZhaWwgaWYgdGhpcyBtZXNzYWdlIGhhcyBhbnkgdW5mcm96ZW4gc3VibWVzc2FnZXMhCi0gICAqIE1lc3NhZ2VzIHdpdGggY3ljbGVzIG11c3QgYmUgZnJvemVuIGFzIGEgYmF0Y2ggdXNpbmcgdXBiOjpEZWY6OkZyZWV6ZSgpLiAqLwotICBib29sIEZyZWV6ZShTdGF0dXMqIHMpOwotCi0gIC8qIFRoZSBudW1iZXIgb2YgZmllbGRzIHRoYXQgYmVsb25nIHRvIHRoZSBNZXNzYWdlRGVmLiAqLwotICBpbnQgZmllbGRfY291bnQoKSBjb25zdDsKLQotICAvKiBUaGUgbnVtYmVyIG9mIG9uZW9mcyB0aGF0IGJlbG9uZyB0byB0aGUgTWVzc2FnZURlZi4gKi8KLSAgaW50IG9uZW9mX2NvdW50KCkgY29uc3Q7Ci0KLSAgLyogQWRkcyBhIGZpZWxkICh1cGJfZmllbGRkZWYgb2JqZWN0KSB0byBhIG1zZ2RlZi4gIFJlcXVpcmVzIHRoYXQgdGhlIG1zZ2RlZgotICAgKiBhbmQgdGhlIGZpZWxkZGVmcyBhcmUgbXV0YWJsZS4gIFRoZSBmaWVsZGRlZidzIG5hbWUgYW5kIG51bWJlciBtdXN0IGJlCi0gICAqIHNldCwgYW5kIHRoZSBtZXNzYWdlIG1heSBub3QgYWxyZWFkeSBjb250YWluIGFueSBmaWVsZCB3aXRoIHRoaXMgbmFtZSBvcgotICAgKiBudW1iZXIsIGFuZCB0aGlzIGZpZWxkZGVmIG1heSBub3QgYmUgcGFydCBvZiBhbm90aGVyIG1lc3NhZ2UuICBJbiBlcnJvcgotICAgKiBjYXNlcyBmYWxzZSBpcyByZXR1cm5lZCBhbmQgdGhlIG1zZ2RlZiBpcyB1bmNoYW5nZWQuCi0gICAqCi0gICAqIElmIHRoZSBnaXZlbiBmaWVsZCBpcyBwYXJ0IG9mIGEgb25lb2YsIHRoaXMgY2FsbCBzdWNjZWVkcyBpZiBhbmQgb25seSBpZgotICAgKiB0aGF0IG9uZW9mIGlzIGFscmVhZHkgcGFydCBvZiB0aGlzIG1zZ2RlZi4gKE5vdGUgdGhhdCBhZGRpbmcgYSBvbmVvZiB0byBhCi0gICAqIG1zZ2RlZiBhdXRvbWF0aWNhbGx5IGFkZHMgYWxsIG9mIGl0cyBmaWVsZHMgdG8gdGhlIG1zZ2RlZiBhdCB0aGUgdGltZSB0aGF0Ci0gICAqIHRoZSBvbmVvZiBpcyBhZGRlZCwgc28gaXQgaXMgdXN1YWxseSBtb3JlIGlkaW9tYXRpYyB0byBhZGQgdGhlIG9uZW9mJ3MKLSAgICogZmllbGRzIGZpcnN0IHRoZW4gYWRkIHRoZSBvbmVvZiB0byB0aGUgbXNnZGVmLiBUaGlzIGNhc2UgaXMgc3VwcG9ydGVkIGZvcgotICAgKiBjb252ZW5pZW5jZS4pCi0gICAqCi0gICAqIElmIHxmfCBpcyBhbHJlYWR5IHBhcnQgb2YgdGhpcyBNZXNzYWdlRGVmLCB0aGlzIG1ldGhvZCBwZXJmb3JtcyBubyBhY3Rpb24KLSAgICogYW5kIHJldHVybnMgdHJ1ZSAoc3VjY2VzcykuIFRodXMsIHRoaXMgbWV0aG9kIGlzIGlkZW1wb3RlbnQuICovCi0gIGJvb2wgQWRkRmllbGQoRmllbGREZWYqIGYsIFN0YXR1cyogcyk7Ci0gIGJvb2wgQWRkRmllbGQoY29uc3QgcmVmZmVkX3B0cjxGaWVsZERlZj4mIGYsIFN0YXR1cyogcyk7Ci0KLSAgLyogQWRkcyBhIG9uZW9mICh1cGJfb25lb2ZkZWYgb2JqZWN0KSB0byBhIG1zZ2RlZi4gUmVxdWlyZXMgdGhhdCB0aGUgbXNnZGVmLAotICAgKiBvbmVvZiwgYW5kIGFueSBmaWVsZGRlZnMgYXJlIG11dGFibGUsIHRoYXQgdGhlIGZpZWxkZGVmcyBjb250YWluZWQgaW4gdGhlCi0gICAqIG9uZW9mIGRvIG5vdCBoYXZlIGFueSBuYW1lIG9yIG51bWJlciBjb25mbGljdHMgd2l0aCBleGlzdGluZyBmaWVsZHMgaW4gdGhlCi0gICAqIG1zZ2RlZiwgYW5kIHRoYXQgdGhlIG9uZW9mJ3MgbmFtZSBpcyB1bmlxdWUgYW1vbmcgYWxsIG9uZW9mcyBpbiB0aGUgbXNnZGVmLgotICAgKiBJZiB0aGUgb25lb2YgaXMgYWRkZWQgc3VjY2Vzc2Z1bGx5LCBhbGwgb2YgaXRzIGZpZWxkcyB3aWxsIGJlIGFkZGVkCi0gICAqIGRpcmVjdGx5IHRvIHRoZSBtc2dkZWYgYXMgd2VsbC4gSW4gZXJyb3IgY2FzZXMsIGZhbHNlIGlzIHJldHVybmVkIGFuZCB0aGUKLSAgICogbXNnZGVmIGlzIHVuY2hhbmdlZC4gKi8KLSAgYm9vbCBBZGRPbmVvZihPbmVvZkRlZiogbywgU3RhdHVzKiBzKTsKLSAgYm9vbCBBZGRPbmVvZihjb25zdCByZWZmZWRfcHRyPE9uZW9mRGVmPiYgbywgU3RhdHVzKiBzKTsKLQotICAvKiBUaGVzZSByZXR1cm4gTlVMTCBpZiB0aGUgZmllbGQgaXMgbm90IGZvdW5kLiAqLwotICBGaWVsZERlZiogRmluZEZpZWxkQnlOdW1iZXIodWludDMyX3QgbnVtYmVyKTsKLSAgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKTsKLSAgY29uc3QgRmllbGREZWYqIEZpbmRGaWVsZEJ5TnVtYmVyKHVpbnQzMl90IG51bWJlcikgY29uc3Q7Ci0gIGNvbnN0IEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IGxlbikgY29uc3Q7Ci0KLQotICBGaWVsZERlZiogRmluZEZpZWxkQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgICByZXR1cm4gRmluZEZpZWxkQnlOYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7Ci0gIH0KLSAgY29uc3QgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBjaGFyICpuYW1lKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZpbmRGaWVsZEJ5TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgVCYgc3RyKSB7Ci0gICAgcmV0dXJuIEZpbmRGaWVsZEJ5TmFtZShzdHIuY19zdHIoKSwgc3RyLnNpemUoKSk7Ci0gIH0KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIGNvbnN0IEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgVCYgc3RyKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZpbmRGaWVsZEJ5TmFtZShzdHIuY19zdHIoKSwgc3RyLnNpemUoKSk7Ci0gIH0KLQotICBPbmVvZkRlZiogRmluZE9uZW9mQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBsZW4pOwotICBjb25zdCBPbmVvZkRlZiogRmluZE9uZW9mQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBsZW4pIGNvbnN0OwotCi0gIE9uZW9mRGVmKiBGaW5kT25lb2ZCeU5hbWUoY29uc3QgY2hhciogbmFtZSkgewotICAgIHJldHVybiBGaW5kT25lb2ZCeU5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKLSAgfQotICBjb25zdCBPbmVvZkRlZiogRmluZE9uZW9mQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUpIGNvbnN0IHsKLSAgICByZXR1cm4gRmluZE9uZW9mQnlOYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZTxjbGFzcyBUPgotICBPbmVvZkRlZiogRmluZE9uZW9mQnlOYW1lKGNvbnN0IFQmIHN0cikgewotICAgIHJldHVybiBGaW5kT25lb2ZCeU5hbWUoc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOwotICB9Ci0gIHRlbXBsYXRlPGNsYXNzIFQ+Ci0gIGNvbnN0IE9uZW9mRGVmKiBGaW5kT25lb2ZCeU5hbWUoY29uc3QgVCYgc3RyKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZpbmRPbmVvZkJ5TmFtZShzdHIuY19zdHIoKSwgc3RyLnNpemUoKSk7Ci0gIH0KLQotICAvKiBSZXR1cm5zIGEgbmV3IG1zZ2RlZiB0aGF0IGlzIGEgY29weSBvZiB0aGUgZ2l2ZW4gbXNnZGVmIChhbmQgYSBjb3B5IG9mIGFsbAotICAgKiB0aGUgZmllbGRzKSBidXQgd2l0aCBhbnkgcmVmZXJlbmNlcyB0byBzdWJtZXNzYWdlcyBicm9rZW4gYW5kIHJlcGxhY2VkCi0gICAqIHdpdGgganVzdCB0aGUgbmFtZSBvZiB0aGUgc3VibWVzc2FnZS4gIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbgotICAgKiBmYWlsZWQuCi0gICAqCi0gICAqIFRPRE8oaGFiZXJtYW4pOiB3aGljaCBpcyBtb3JlIHVzZWZ1bCwga2VlcGluZyBmaWVsZHMgcmVzb2x2ZWQgb3IKLSAgICogdW5yZXNvbHZpbmcgdGhlbT8gIElmIHRoZXJlJ3Mgbm8gb2J2aW91cyBhbnN3ZXIsIFNob3VsZCB0aGlzIGZ1bmN0aW9uYWxpdHkKLSAgICoganVzdCBiZSBtb3ZlZCBpbnRvIHN5bXRhYi5jPyAqLwotICBNZXNzYWdlRGVmKiBEdXAoY29uc3Qgdm9pZCogb3duZXIpIGNvbnN0OwotCi0gIC8qIElzIHRoaXMgbWVzc2FnZSBhIG1hcCBlbnRyeT8gKi8KLSAgdm9pZCBzZXRtYXBlbnRyeShib29sIG1hcF9lbnRyeSk7Ci0gIGJvb2wgbWFwZW50cnkoKSBjb25zdDsKLQotICAvKiBJdGVyYXRpb24gb3ZlciBmaWVsZHMuICBUaGUgb3JkZXIgaXMgdW5kZWZpbmVkLiAqLwotICBjbGFzcyBmaWVsZF9pdGVyYXRvcgotICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBGaWVsZERlZio+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBmaWVsZF9pdGVyYXRvcihNZXNzYWdlRGVmKiBtZCk7Ci0gICAgc3RhdGljIGZpZWxkX2l0ZXJhdG9yIGVuZChNZXNzYWdlRGVmKiBtZCk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yKysoKTsKLSAgICBGaWVsZERlZiogb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGZpZWxkX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGZpZWxkX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgdXBiX21zZ19maWVsZF9pdGVyIGl0ZXJfOwotICB9OwotCi0gIGNsYXNzIGNvbnN0X2ZpZWxkX2l0ZXJhdG9yCi0gICAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIGNvbnN0IEZpZWxkRGVmKj4gewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IGNvbnN0X2ZpZWxkX2l0ZXJhdG9yKGNvbnN0IE1lc3NhZ2VEZWYqIG1kKTsKLSAgICBzdGF0aWMgY29uc3RfZmllbGRfaXRlcmF0b3IgZW5kKGNvbnN0IE1lc3NhZ2VEZWYqIG1kKTsKLQotICAgIHZvaWQgb3BlcmF0b3IrKygpOwotICAgIGNvbnN0IEZpZWxkRGVmKiBvcGVyYXRvciooKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfZmllbGRfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfZmllbGRfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLQotICAgcHJpdmF0ZToKLSAgICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaXRlcl87Ci0gIH07Ci0KLSAgLyogSXRlcmF0aW9uIG92ZXIgb25lb2ZzLiBUaGUgb3JkZXIgaXMgdW5kZWZpbmVkLiAqLwotICBjbGFzcyBvbmVvZl9pdGVyYXRvcgotICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBGaWVsZERlZio+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBvbmVvZl9pdGVyYXRvcihNZXNzYWdlRGVmKiBtZCk7Ci0gICAgc3RhdGljIG9uZW9mX2l0ZXJhdG9yIGVuZChNZXNzYWdlRGVmKiBtZCk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yKysoKTsKLSAgICBPbmVvZkRlZiogb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IG9uZW9mX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IG9uZW9mX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgdXBiX21zZ19vbmVvZl9pdGVyIGl0ZXJfOwotICB9OwotCi0gIGNsYXNzIGNvbnN0X29uZW9mX2l0ZXJhdG9yCi0gICAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcsIGNvbnN0IEZpZWxkRGVmKj4gewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IGNvbnN0X29uZW9mX2l0ZXJhdG9yKGNvbnN0IE1lc3NhZ2VEZWYqIG1kKTsKLSAgICBzdGF0aWMgY29uc3Rfb25lb2ZfaXRlcmF0b3IgZW5kKGNvbnN0IE1lc3NhZ2VEZWYqIG1kKTsKLQotICAgIHZvaWQgb3BlcmF0b3IrKygpOwotICAgIGNvbnN0IE9uZW9mRGVmKiBvcGVyYXRvciooKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3Rfb25lb2ZfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3Rfb25lb2ZfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLQotICAgcHJpdmF0ZToKLSAgICB1cGJfbXNnX29uZW9mX2l0ZXIgaXRlcl87Ci0gIH07Ci0KLSAgY2xhc3MgRmllbGRBY2Nlc3NvciB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgRmllbGRBY2Nlc3NvcihNZXNzYWdlRGVmKiBtc2cpIDogbXNnXyhtc2cpIHt9Ci0gICAgZmllbGRfaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtc2dfLT5maWVsZF9iZWdpbigpOyB9Ci0gICAgZmllbGRfaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbXNnXy0+ZmllbGRfZW5kKCk7IH0KLSAgIHByaXZhdGU6Ci0gICAgTWVzc2FnZURlZiogbXNnXzsKLSAgfTsKLQotICBjbGFzcyBDb25zdEZpZWxkQWNjZXNzb3IgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IENvbnN0RmllbGRBY2Nlc3Nvcihjb25zdCBNZXNzYWdlRGVmKiBtc2cpIDogbXNnXyhtc2cpIHt9Ci0gICAgY29uc3RfZmllbGRfaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtc2dfLT5maWVsZF9iZWdpbigpOyB9Ci0gICAgY29uc3RfZmllbGRfaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbXNnXy0+ZmllbGRfZW5kKCk7IH0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTWVzc2FnZURlZiogbXNnXzsKLSAgfTsKLQotICBjbGFzcyBPbmVvZkFjY2Vzc29yIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBPbmVvZkFjY2Vzc29yKE1lc3NhZ2VEZWYqIG1zZykgOiBtc2dfKG1zZykge30KLSAgICBvbmVvZl9pdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1zZ18tPm9uZW9mX2JlZ2luKCk7IH0KLSAgICBvbmVvZl9pdGVyYXRvciBlbmQoKSB7IHJldHVybiBtc2dfLT5vbmVvZl9lbmQoKTsgfQotICAgcHJpdmF0ZToKLSAgICBNZXNzYWdlRGVmKiBtc2dfOwotICB9OwotCi0gIGNsYXNzIENvbnN0T25lb2ZBY2Nlc3NvciB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgQ29uc3RPbmVvZkFjY2Vzc29yKGNvbnN0IE1lc3NhZ2VEZWYqIG1zZykgOiBtc2dfKG1zZykge30KLSAgICBjb25zdF9vbmVvZl9pdGVyYXRvciBiZWdpbigpIHsgcmV0dXJuIG1zZ18tPm9uZW9mX2JlZ2luKCk7IH0KLSAgICBjb25zdF9vbmVvZl9pdGVyYXRvciBlbmQoKSB7IHJldHVybiBtc2dfLT5vbmVvZl9lbmQoKTsgfQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBNZXNzYWdlRGVmKiBtc2dfOwotICB9OwotCi0gIGZpZWxkX2l0ZXJhdG9yIGZpZWxkX2JlZ2luKCk7Ci0gIGZpZWxkX2l0ZXJhdG9yIGZpZWxkX2VuZCgpOwotICBjb25zdF9maWVsZF9pdGVyYXRvciBmaWVsZF9iZWdpbigpIGNvbnN0OwotICBjb25zdF9maWVsZF9pdGVyYXRvciBmaWVsZF9lbmQoKSBjb25zdDsKLQotICBvbmVvZl9pdGVyYXRvciBvbmVvZl9iZWdpbigpOwotICBvbmVvZl9pdGVyYXRvciBvbmVvZl9lbmQoKTsKLSAgY29uc3Rfb25lb2ZfaXRlcmF0b3Igb25lb2ZfYmVnaW4oKSBjb25zdDsKLSAgY29uc3Rfb25lb2ZfaXRlcmF0b3Igb25lb2ZfZW5kKCkgY29uc3Q7Ci0KLSAgRmllbGRBY2Nlc3NvciBmaWVsZHMoKSB7IHJldHVybiBGaWVsZEFjY2Vzc29yKHRoaXMpOyB9Ci0gIENvbnN0RmllbGRBY2Nlc3NvciBmaWVsZHMoKSBjb25zdCB7IHJldHVybiBDb25zdEZpZWxkQWNjZXNzb3IodGhpcyk7IH0KLSAgT25lb2ZBY2Nlc3NvciBvbmVvZnMoKSB7IHJldHVybiBPbmVvZkFjY2Vzc29yKHRoaXMpOyB9Ci0gIENvbnN0T25lb2ZBY2Nlc3NvciBvbmVvZnMoKSBjb25zdCB7IHJldHVybiBDb25zdE9uZW9mQWNjZXNzb3IodGhpcyk7IH0KLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKE1lc3NhZ2VEZWYsIHVwYjo6TWVzc2FnZURlZikKLX07Ci0KLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi11cGJfbXNnZGVmICp1cGJfbXNnZGVmX25ldyhjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEluY2x1ZGUgdXBiX3JlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9tc2dkZWZfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfbXNnZGVmLCB1cGJfbXNnZGVmX3VwY2FzdDIpCi0KLWJvb2wgdXBiX21zZ2RlZl9mcmVlemUodXBiX21zZ2RlZiAqbSwgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotY29uc3QgY2hhciAqdXBiX21zZ2RlZl9mdWxsbmFtZShjb25zdCB1cGJfbXNnZGVmICptKTsKLWJvb2wgdXBiX21zZ2RlZl9zZXRmdWxsbmFtZSh1cGJfbXNnZGVmICptLCBjb25zdCBjaGFyICpmdWxsbmFtZSwgdXBiX3N0YXR1cyAqcyk7Ci0KLXVwYl9tc2dkZWYgKnVwYl9tc2dkZWZfZHVwKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IHZvaWQgKm93bmVyKTsKLWJvb2wgdXBiX21zZ2RlZl9hZGRmaWVsZCh1cGJfbXNnZGVmICptLCB1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX21zZ2RlZl9hZGRvbmVvZih1cGJfbXNnZGVmICptLCB1cGJfb25lb2ZkZWYgKm8sIGNvbnN0IHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLQotLyogRmllbGQgbG9va3VwIGluIGEgY291cGxlIG9mIGRpZmZlcmVudCB2YXJpYXRpb25zOgotICogICAtIGl0b2YgPSBpbnQgdG8gZmllbGQKLSAqICAgLSBudG9mID0gbmFtZSB0byBmaWVsZAotICogICAtIG50b2Z6ID0gbmFtZSB0byBmaWVsZCwgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gKi8KLWNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX21zZ2RlZl9pdG9mKGNvbnN0IHVwYl9tc2dkZWYgKm0sIHVpbnQzMl90IGkpOwotY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJfbXNnZGVmX250b2YoY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOwotaW50IHVwYl9tc2dkZWZfbnVtZmllbGRzKGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotCi1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX21zZ2RlZl9udG9meihjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgewotICByZXR1cm4gdXBiX21zZ2RlZl9udG9mKG0sIG5hbWUsIHN0cmxlbihuYW1lKSk7Ci19Ci0KLVVQQl9JTkxJTkUgdXBiX2ZpZWxkZGVmICp1cGJfbXNnZGVmX2l0b2ZfbXV0YWJsZSh1cGJfbXNnZGVmICptLCB1aW50MzJfdCBpKSB7Ci0gIHJldHVybiAodXBiX2ZpZWxkZGVmKil1cGJfbXNnZGVmX2l0b2YobSwgaSk7Ci19Ci0KLVVQQl9JTkxJTkUgdXBiX2ZpZWxkZGVmICp1cGJfbXNnZGVmX250b2ZfbXV0YWJsZSh1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIHsKLSAgcmV0dXJuICh1cGJfZmllbGRkZWYgKil1cGJfbXNnZGVmX250b2YobSwgbmFtZSwgbGVuKTsKLX0KLQotLyogT25lb2YgbG9va3VwOgotICogICAtIG50b28gPSBuYW1lIHRvIG9uZW9mCi0gKiAgIC0gbnRvb3ogPSBuYW1lIHRvIG9uZW9mLCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAqLwotY29uc3QgdXBiX29uZW9mZGVmICp1cGJfbXNnZGVmX250b28oY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOwotaW50IHVwYl9tc2dkZWZfbnVtb25lb2ZzKGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotCi1VUEJfSU5MSU5FIGNvbnN0IHVwYl9vbmVvZmRlZiAqdXBiX21zZ2RlZl9udG9veihjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX250b28obSwgbmFtZSwgc3RybGVuKG5hbWUpKTsKLX0KLQotVVBCX0lOTElORSB1cGJfb25lb2ZkZWYgKnVwYl9tc2dkZWZfbnRvb19tdXRhYmxlKHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikgewotICByZXR1cm4gKHVwYl9vbmVvZmRlZiAqKXVwYl9tc2dkZWZfbnRvbyhtLCBuYW1lLCBsZW4pOwotfQotCi12b2lkIHVwYl9tc2dkZWZfc2V0bWFwZW50cnkodXBiX21zZ2RlZiAqbSwgYm9vbCBtYXBfZW50cnkpOwotYm9vbCB1cGJfbXNnZGVmX21hcGVudHJ5KGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotCi0vKiBXZWxsLWtub3duIGZpZWxkIHRhZyBudW1iZXJzIGZvciBtYXAtZW50cnkgbWVzc2FnZXMuICovCi0jZGVmaW5lIFVQQl9NQVBFTlRSWV9LRVkgICAxCi0jZGVmaW5lIFVQQl9NQVBFTlRSWV9WQUxVRSAyCi0KLWNvbnN0IHVwYl9vbmVvZmRlZiAqdXBiX21zZ2RlZl9maW5kb25lb2YoY29uc3QgdXBiX21zZ2RlZiAqbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpOwotaW50IHVwYl9tc2dkZWZfbnVtb25lb2ZzKGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotCi0vKiB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLSAqIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBtKTsKLSAqICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAqICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gKiAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0gKiAgIC8vIC4uLgotICogfQotICoKLSAqIEZvciBDIHdlIGRvbid0IGhhdmUgc2VwYXJhdGUgaXRlcmF0b3JzIGZvciBjb25zdCBhbmQgbm9uLWNvbnN0LgotICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhc3QgdGhlIHVwYl9maWVsZGRlZiogdG8KLSAqIGNvbnN0IGlmIHRoZSB1cGJfbXNnZGVmKiBpcyBjb25zdC4gKi8KLXZvaWQgdXBiX21zZ19maWVsZF9iZWdpbih1cGJfbXNnX2ZpZWxkX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotdm9pZCB1cGJfbXNnX2ZpZWxkX25leHQodXBiX21zZ19maWVsZF9pdGVyICppdGVyKTsKLWJvb2wgdXBiX21zZ19maWVsZF9kb25lKGNvbnN0IHVwYl9tc2dfZmllbGRfaXRlciAqaXRlcik7Ci11cGJfZmllbGRkZWYgKnVwYl9tc2dfaXRlcl9maWVsZChjb25zdCB1cGJfbXNnX2ZpZWxkX2l0ZXIgKml0ZXIpOwotdm9pZCB1cGJfbXNnX2ZpZWxkX2l0ZXJfc2V0ZG9uZSh1cGJfbXNnX2ZpZWxkX2l0ZXIgKml0ZXIpOwotCi0vKiBTaW1pbGFyIHRvIGFib3ZlLCB3ZSBhbHNvIHN1cHBvcnQgaXRlcmF0aW5nIHRocm91Z2ggdGhlIG9uZW9mcyBpbiBhCi0gKiBtc2dkZWYuICovCi12b2lkIHVwYl9tc2dfb25lb2ZfYmVnaW4odXBiX21zZ19vbmVvZl9pdGVyICppdGVyLCBjb25zdCB1cGJfbXNnZGVmICptKTsKLXZvaWQgdXBiX21zZ19vbmVvZl9uZXh0KHVwYl9tc2dfb25lb2ZfaXRlciAqaXRlcik7Ci1ib29sIHVwYl9tc2dfb25lb2ZfZG9uZShjb25zdCB1cGJfbXNnX29uZW9mX2l0ZXIgKml0ZXIpOwotdXBiX29uZW9mZGVmICp1cGJfbXNnX2l0ZXJfb25lb2YoY29uc3QgdXBiX21zZ19vbmVvZl9pdGVyICppdGVyKTsKLXZvaWQgdXBiX21zZ19vbmVvZl9pdGVyX3NldGRvbmUodXBiX21zZ19vbmVvZl9pdGVyICppdGVyKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0KLS8qIHVwYjo6RW51bURlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgdXBiX3N0cnRhYmxlX2l0ZXIgdXBiX2VudW1faXRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhbiBlbnVtLiAgSXRzIGJhc2UgY2xhc3MgaXMgdXBiOjpEZWYgKGNvbnZlcnQgd2l0aAotICogdXBiOjp1cGNhc3QoKSkuICovCi1jbGFzcyB1cGI6OkVudW1EZWYgewotIHB1YmxpYzoKLSAgLyogUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KLSAgc3RhdGljIHJlZmZlZF9wdHI8RW51bURlZj4gTmV3KCk7Ci0KLSAgLyogdXBiOjpSZWZDb3VudGVkIG1ldGhvZHMgbGlrZSBSZWYoKS9VbnJlZigpLiAqLwotICBVUEJfUkVGQ09VTlRFRF9DUFBNRVRIT0RTCi0KLSAgLyogRnVuY3Rpb25hbGl0eSBmcm9tIHVwYjo6RGVmLiAqLwotICBjb25zdCBjaGFyKiBmdWxsX25hbWUoKSBjb25zdDsKLSAgYm9vbCBzZXRfZnVsbF9uYW1lKGNvbnN0IGNoYXIqIGZ1bGxuYW1lLCBTdGF0dXMqIHMpOwotICBib29sIHNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxuYW1lLCBTdGF0dXMqIHMpOwotCi0gIC8qIENhbGwgdG8gZnJlZXplIHRoaXMgRW51bURlZi4gKi8KLSAgYm9vbCBGcmVlemUoU3RhdHVzKiBzKTsKLQotICAvKiBUaGUgdmFsdWUgdGhhdCBpcyB1c2VkIGFzIHRoZSBkZWZhdWx0IHdoZW4gbm8gZmllbGQgZGVmYXVsdCBpcyBzcGVjaWZpZWQuCi0gICAqIElmIG5vdCBzZXQgZXhwbGljaXRseSwgdGhlIGZpcnN0IHZhbHVlIHRoYXQgd2FzIGFkZGVkIHdpbGwgYmUgdXNlZC4KLSAgICogVGhlIGRlZmF1bHQgdmFsdWUgbXVzdCBiZSBhIG1lbWJlciBvZiB0aGUgZW51bS4KLSAgICogUmVxdWlyZXMgdGhhdCB2YWx1ZV9jb3VudCgpID4gMC4gKi8KLSAgaW50MzJfdCBkZWZhdWx0X3ZhbHVlKCkgY29uc3Q7Ci0KLSAgLyogU2V0cyB0aGUgZGVmYXVsdCB2YWx1ZS4gIElmIHRoaXMgdmFsdWUgaXMgbm90IHZhbGlkLCByZXR1cm5zIGZhbHNlIGFuZCBhbgotICAgKiBlcnJvciBtZXNzYWdlIGluIHN0YXR1cy4gKi8KLSAgYm9vbCBzZXRfZGVmYXVsdF92YWx1ZShpbnQzMl90IHZhbCwgU3RhdHVzKiBzdGF0dXMpOwotCi0gIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiB2YWx1ZXMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIGVudW0uICBOb3RlIHRoYXQKLSAgICogbXVsdGlwbGUgbmFtZXMgY2FuIHJlZmVyIHRvIHRoZSBzYW1lIG51bWJlciwgc28gdGhpcyBtYXkgYmUgZ3JlYXRlciB0aGFuCi0gICAqIHRoZSB0b3RhbCBudW1iZXIgb2YgdW5pcXVlIG51bWJlcnMuICovCi0gIGludCB2YWx1ZV9jb3VudCgpIGNvbnN0OwotCi0gIC8qIEFkZHMgYSBzaW5nbGUgbmFtZS9udW1iZXIgcGFpciB0byB0aGUgZW51bS4gIEZhaWxzIGlmIHRoaXMgbmFtZSBoYXMKLSAgICogYWxyZWFkeSBiZWVuIHVzZWQgYnkgYW5vdGhlciB2YWx1ZS4gKi8KLSAgYm9vbCBBZGRWYWx1ZShjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IG51bSwgU3RhdHVzKiBzdGF0dXMpOwotICBib29sIEFkZFZhbHVlKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBpbnQzMl90IG51bSwgU3RhdHVzKiBzdGF0dXMpOwotCi0gIC8qIExvb2t1cHMgZnJvbSBuYW1lIHRvIGludGVnZXIsIHJldHVybmluZyB0cnVlIGlmIGZvdW5kLiAqLwotICBib29sIEZpbmRWYWx1ZUJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90KiBudW0pIGNvbnN0OwotCi0gIC8qIEZpbmRzIHRoZSBuYW1lIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIG51bWJlciwgb3IgTlVMTCBpZiBub25lIHdhcwotICAgKiBmb3VuZC4gIElmIG1vcmUgdGhhbiBvbmUgbmFtZSBjb3JyZXNwb25kcyB0byB0aGlzIG51bWJlciwgcmV0dXJucyB0aGUKLSAgICogZmlyc3Qgb25lIHRoYXQgd2FzIGFkZGVkLiAqLwotICBjb25zdCBjaGFyKiBGaW5kVmFsdWVCeU51bWJlcihpbnQzMl90IG51bSkgY29uc3Q7Ci0KLSAgLyogUmV0dXJucyBhIG5ldyBFbnVtRGVmIHdpdGggYWxsIHRoZSBzYW1lIHZhbHVlcy4gIFRoZSBuZXcgRW51bURlZiB3aWxsIGJlCi0gICAqIG93bmVkIGJ5IHRoZSBnaXZlbiBvd25lci4gKi8KLSAgRW51bURlZiogRHVwKGNvbnN0IHZvaWQqIG93bmVyKSBjb25zdDsKLQotICAvKiBJdGVyYXRpb24gb3ZlciBuYW1lL3ZhbHVlIHBhaXJzLiAgVGhlIG9yZGVyIGlzIHVuZGVmaW5lZC4KLSAgICogQWRkaW5nIGFuIGVudW0gdmFsIGludmFsaWRhdGVzIGFueSBpdGVyYXRvcnMuCi0gICAqCi0gICAqIFRPRE86IG1ha2UgY29tcGF0aWJsZSB3aXRoIHJhbmdlLWZvciwgd2l0aCBlbGVtZW50cyBhcyBwYWlycz8gKi8KLSAgY2xhc3MgSXRlcmF0b3IgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEl0ZXJhdG9yKGNvbnN0IEVudW1EZWYqKTsKLQotICAgIGludDMyX3QgbnVtYmVyKCk7Ci0gICAgY29uc3QgY2hhciAqbmFtZSgpOwotICAgIGJvb2wgRG9uZSgpOwotICAgIHZvaWQgTmV4dCgpOwotCi0gICBwcml2YXRlOgotICAgIHVwYl9lbnVtX2l0ZXIgaXRlcl87Ci0gIH07Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhFbnVtRGVmLCB1cGI6OkVudW1EZWYpCi19OwotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBOYXRpdmUgQyBBUEkuICovCi11cGJfZW51bWRlZiAqdXBiX2VudW1kZWZfbmV3KGNvbnN0IHZvaWQgKm93bmVyKTsKLXVwYl9lbnVtZGVmICp1cGJfZW51bWRlZl9kdXAoY29uc3QgdXBiX2VudW1kZWYgKmUsIGNvbnN0IHZvaWQgKm93bmVyKTsKLQotLyogSW5jbHVkZSB1cGJfcmVmY291bnRlZCBtZXRob2RzIGxpa2UgdXBiX2VudW1kZWZfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfZW51bWRlZiwgdXBiX2VudW1kZWZfdXBjYXN0MikKLQotYm9vbCB1cGJfZW51bWRlZl9mcmVlemUodXBiX2VudW1kZWYgKmUsIHVwYl9zdGF0dXMgKnN0YXR1cyk7Ci0KLS8qIEZyb20gdXBiX2RlZi4gKi8KLWNvbnN0IGNoYXIgKnVwYl9lbnVtZGVmX2Z1bGxuYW1lKGNvbnN0IHVwYl9lbnVtZGVmICplKTsKLWJvb2wgdXBiX2VudW1kZWZfc2V0ZnVsbG5hbWUodXBiX2VudW1kZWYgKmUsIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLQotaW50MzJfdCB1cGJfZW51bWRlZl9kZWZhdWx0KGNvbnN0IHVwYl9lbnVtZGVmICplKTsKLWJvb2wgdXBiX2VudW1kZWZfc2V0ZGVmYXVsdCh1cGJfZW51bWRlZiAqZSwgaW50MzJfdCB2YWwsIHVwYl9zdGF0dXMgKnMpOwotaW50IHVwYl9lbnVtZGVmX251bXZhbHMoY29uc3QgdXBiX2VudW1kZWYgKmUpOwotYm9vbCB1cGJfZW51bWRlZl9hZGR2YWwodXBiX2VudW1kZWYgKmUsIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotLyogRW51bSBsb29rdXBzOgotICogLSBudG9pOiAgbG9vayB1cCBhIG5hbWUgd2l0aCBzcGVjaWZpZWQgbGVuZ3RoLgotICogLSBudG9pejogbG9vayB1cCBhIG5hbWUgcHJvdmlkZWQgYXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgotICogLSBpdG9uOiAgbG9vayB1cCBhbiBpbnRlZ2VyLCByZXR1cm5pbmcgdGhlIG5hbWUgYXMgYSBudWxsLXRlcm1pbmF0ZWQKLSAqICAgICAgICAgIHN0cmluZy4gKi8KLWJvb2wgdXBiX2VudW1kZWZfbnRvaShjb25zdCB1cGJfZW51bWRlZiAqZSwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpudW0pOwotVVBCX0lOTElORSBib29sIHVwYl9lbnVtZGVmX250b2l6KGNvbnN0IHVwYl9lbnVtZGVmICplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm51bSkgewotICByZXR1cm4gdXBiX2VudW1kZWZfbnRvaShlLCBuYW1lLCBzdHJsZW4obmFtZSksIG51bSk7Ci19Ci1jb25zdCBjaGFyICp1cGJfZW51bWRlZl9pdG9uKGNvbnN0IHVwYl9lbnVtZGVmICplLCBpbnQzMl90IG51bSk7Ci0KLS8qICB1cGJfZW51bV9pdGVyIGk7Ci0gKiAgZm9yKHVwYl9lbnVtX2JlZ2luKCZpLCBlKTsgIXVwYl9lbnVtX2RvbmUoJmkpOyB1cGJfZW51bV9uZXh0KCZpKSkgewotICogICAgLy8gLi4uCi0gKiAgfQotICovCi12b2lkIHVwYl9lbnVtX2JlZ2luKHVwYl9lbnVtX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9lbnVtZGVmICplKTsKLXZvaWQgdXBiX2VudW1fbmV4dCh1cGJfZW51bV9pdGVyICppdGVyKTsKLWJvb2wgdXBiX2VudW1fZG9uZSh1cGJfZW51bV9pdGVyICppdGVyKTsKLWNvbnN0IGNoYXIgKnVwYl9lbnVtX2l0ZXJfbmFtZSh1cGJfZW51bV9pdGVyICppdGVyKTsKLWludDMyX3QgdXBiX2VudW1faXRlcl9udW1iZXIodXBiX2VudW1faXRlciAqaXRlcik7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotLyogdXBiOjpPbmVvZkRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiB1cGJfaW50dGFibGVfaXRlciB1cGJfb25lb2ZfaXRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIG9uZW9mLiAgSXRzIGJhc2UgY2xhc3MgaXMgdXBiOjpEZWYgKGNvbnZlcnQgd2l0aAotICogdXBiOjp1cGNhc3QoKSkuICovCi1jbGFzcyB1cGI6Ok9uZW9mRGVmIHsKLSBwdWJsaWM6Ci0gIC8qIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPE9uZW9mRGVmPiBOZXcoKTsKLQotICAvKiB1cGI6OlJlZkNvdW50ZWQgbWV0aG9kcyBsaWtlIFJlZigpL1VucmVmKCkuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBGdW5jdGlvbmFsaXR5IGZyb20gdXBiOjpEZWYuICovCi0gIGNvbnN0IGNoYXIqIGZ1bGxfbmFtZSgpIGNvbnN0OwotCi0gIC8qIFJldHVybnMgdGhlIE1lc3NhZ2VEZWYgdGhhdCBvd25zIHRoaXMgT25lb2ZEZWYuICovCi0gIGNvbnN0IE1lc3NhZ2VEZWYqIGNvbnRhaW5pbmdfdHlwZSgpIGNvbnN0OwotCi0gIC8qIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBvbmVvZi4gVGhpcyBpcyB0aGUgbmFtZSB1c2VkIHRvIGxvb2sgdXAgdGhlIG9uZW9mCi0gICAqIGJ5IG5hbWUgb25jZSBhZGRlZCB0byBhIG1lc3NhZ2UgZGVmLiAqLwotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGJvb2wgc2V0X25hbWUoY29uc3QgY2hhciogbmFtZSwgU3RhdHVzKiBzKTsKLQotICAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgZmllbGRzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoZSBvbmVvZi4gKi8KLSAgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7Ci0KLSAgLyogQWRkcyBhIGZpZWxkIHRvIHRoZSBvbmVvZi4gVGhlIGZpZWxkIG11c3Qgbm90IGhhdmUgYmVlbiBhZGRlZCB0byBhbnkgb3RoZXIKLSAgICogb25lb2Ygb3IgbXNnZGVmLiBJZiB0aGUgb25lb2YgaXMgbm90IHlldCBwYXJ0IG9mIGEgbXNnZGVmLCB0aGVuIHdoZW4gdGhlCi0gICAqIG9uZW9mIGlzIGV2ZW50dWFsbHkgYWRkZWQgdG8gYSBtc2dkZWYsIGFsbCBmaWVsZHMgYWRkZWQgdG8gdGhlIG9uZW9mIHdpbGwKLSAgICogYWxzbyBiZSBhZGRlZCB0byB0aGUgbXNnZGVmIGF0IHRoYXQgdGltZS4gSWYgdGhlIG9uZW9mIGlzIGFscmVhZHkgcGFydCBvZiBhCi0gICAqIG1zZ2RlZiwgdGhlIGZpZWxkIG11c3QgZWl0aGVyIGJlIGEgcGFydCBvZiB0aGF0IG1zZ2RlZiBhbHJlYWR5LCBvciBtdXN0IG5vdAotICAgKiBiZSBhIHBhcnQgb2YgYW55IG1zZ2RlZjsgaW4gdGhlIGxhdHRlciBjYXNlLCB0aGUgZmllbGQgaXMgYWRkZWQgdG8gdGhlCi0gICAqIG1zZ2RlZiBhcyBhIHBhcnQgb2YgdGhpcyBvcGVyYXRpb24uCi0gICAqCi0gICAqIFRoZSBmaWVsZCBtYXkgb25seSBoYXZlIGFuIE9QVElPTkFMIGxhYmVsLCBuZXZlciBSRVFVSVJFRCBvciBSRVBFQVRFRC4KLSAgICoKLSAgICogSWYgfGZ8IGlzIGFscmVhZHkgcGFydCBvZiB0aGlzIE1lc3NhZ2VEZWYsIHRoaXMgbWV0aG9kIHBlcmZvcm1zIG5vIGFjdGlvbgotICAgKiBhbmQgcmV0dXJucyB0cnVlIChzdWNjZXNzKS4gVGh1cywgdGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gKi8KLSAgYm9vbCBBZGRGaWVsZChGaWVsZERlZiogZmllbGQsIFN0YXR1cyogcyk7Ci0gIGJvb2wgQWRkRmllbGQoY29uc3QgcmVmZmVkX3B0cjxGaWVsZERlZj4mIGZpZWxkLCBTdGF0dXMqIHMpOwotCi0gIC8qIExvb2tzIHVwIGJ5IG5hbWUuICovCi0gIGNvbnN0IEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IGxlbikgY29uc3Q7Ci0gIEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IGxlbik7Ci0gIGNvbnN0IEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSkgY29uc3QgewotICAgIHJldHVybiBGaW5kRmllbGRCeU5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKLSAgfQotICBGaWVsZERlZiogRmluZEZpZWxkQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICByZXR1cm4gRmluZEZpZWxkQnlOYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBUJiBzdHIpIHsKLSAgICByZXR1cm4gRmluZEZpZWxkQnlOYW1lKHN0ci5jX3N0cigpLCBzdHIuc2l6ZSgpKTsKLSAgfQotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgY29uc3QgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBUJiBzdHIpIGNvbnN0IHsKLSAgICByZXR1cm4gRmluZEZpZWxkQnlOYW1lKHN0ci5jX3N0cigpLCBzdHIuc2l6ZSgpKTsKLSAgfQotCi0gIC8qIExvb2tzIHVwIGJ5IHRhZyBudW1iZXIuICovCi0gIGNvbnN0IEZpZWxkRGVmKiBGaW5kRmllbGRCeU51bWJlcih1aW50MzJfdCBudW0pIGNvbnN0OwotCi0gIC8qIFJldHVybnMgYSBuZXcgT25lb2ZEZWYgd2l0aCBhbGwgdGhlIHNhbWUgZmllbGRzLiBUaGUgT25lb2ZEZWYgd2lsbCBiZSBvd25lZAotICAgKiBieSB0aGUgZ2l2ZW4gb3duZXIuICovCi0gIE9uZW9mRGVmKiBEdXAoY29uc3Qgdm9pZCogb3duZXIpIGNvbnN0OwotCi0gIC8qIEl0ZXJhdGlvbiBvdmVyIGZpZWxkcy4gIFRoZSBvcmRlciBpcyB1bmRlZmluZWQuICovCi0gIGNsYXNzIGl0ZXJhdG9yIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgRmllbGREZWYqPiB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgaXRlcmF0b3IoT25lb2ZEZWYqIG1kKTsKLSAgICBzdGF0aWMgaXRlcmF0b3IgZW5kKE9uZW9mRGVmKiBtZCk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yKysoKTsKLSAgICBGaWVsZERlZiogb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGl0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgdXBiX29uZW9mX2l0ZXIgaXRlcl87Ci0gIH07Ci0KLSAgY2xhc3MgY29uc3RfaXRlcmF0b3IKLSAgICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgY29uc3QgRmllbGREZWYqPiB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgY29uc3RfaXRlcmF0b3IoY29uc3QgT25lb2ZEZWYqIG1kKTsKLSAgICBzdGF0aWMgY29uc3RfaXRlcmF0b3IgZW5kKGNvbnN0IE9uZW9mRGVmKiBtZCk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yKysoKTsKLSAgICBjb25zdCBGaWVsZERlZiogb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgdXBiX29uZW9mX2l0ZXIgaXRlcl87Ci0gIH07Ci0KLSAgaXRlcmF0b3IgYmVnaW4oKTsKLSAgaXRlcmF0b3IgZW5kKCk7Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0gIGNvbnN0X2l0ZXJhdG9yIGVuZCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoT25lb2ZEZWYsIHVwYjo6T25lb2ZEZWYpCi19OwotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBOYXRpdmUgQyBBUEkuICovCi11cGJfb25lb2ZkZWYgKnVwYl9vbmVvZmRlZl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpOwotdXBiX29uZW9mZGVmICp1cGJfb25lb2ZkZWZfZHVwKGNvbnN0IHVwYl9vbmVvZmRlZiAqbywgY29uc3Qgdm9pZCAqb3duZXIpOwotCi0vKiBJbmNsdWRlIHVwYl9yZWZjb3VudGVkIG1ldGhvZHMgbGlrZSB1cGJfb25lb2ZkZWZfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfb25lb2ZkZWYsIHVwYl9vbmVvZmRlZl91cGNhc3QyKQotCi1jb25zdCBjaGFyICp1cGJfb25lb2ZkZWZfbmFtZShjb25zdCB1cGJfb25lb2ZkZWYgKm8pOwotYm9vbCB1cGJfb25lb2ZkZWZfc2V0bmFtZSh1cGJfb25lb2ZkZWYgKm8sIGNvbnN0IGNoYXIgKm5hbWUsIHVwYl9zdGF0dXMgKnMpOwotCi1jb25zdCB1cGJfbXNnZGVmICp1cGJfb25lb2ZkZWZfY29udGFpbmluZ3R5cGUoY29uc3QgdXBiX29uZW9mZGVmICpvKTsKLWludCB1cGJfb25lb2ZkZWZfbnVtZmllbGRzKGNvbnN0IHVwYl9vbmVvZmRlZiAqbyk7Ci1ib29sIHVwYl9vbmVvZmRlZl9hZGRmaWVsZCh1cGJfb25lb2ZkZWYgKm8sIHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpOwotCi0vKiBPbmVvZiBsb29rdXBzOgotICogLSBudG9mOiAgbG9vayB1cCBhIGZpZWxkIGJ5IG5hbWUuCi0gKiAtIG50b2Z6OiBsb29rIHVwIGEgZmllbGQgYnkgbmFtZSAoYXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nKS4KLSAqIC0gaXRvZjogIGxvb2sgdXAgYSBmaWVsZCBieSBudW1iZXIuICovCi1jb25zdCB1cGJfZmllbGRkZWYgKnVwYl9vbmVvZmRlZl9udG9mKGNvbnN0IHVwYl9vbmVvZmRlZiAqbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbmd0aCk7Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX29uZW9mZGVmX250b2Z6KGNvbnN0IHVwYl9vbmVvZmRlZiAqbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgewotICByZXR1cm4gdXBiX29uZW9mZGVmX250b2YobywgbmFtZSwgc3RybGVuKG5hbWUpKTsKLX0KLWNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX29uZW9mZGVmX2l0b2YoY29uc3QgdXBiX29uZW9mZGVmICpvLCB1aW50MzJfdCBudW0pOwotCi0vKiAgdXBiX29uZW9mX2l0ZXIgaTsKLSAqICBmb3IodXBiX29uZW9mX2JlZ2luKCZpLCBlKTsgIXVwYl9vbmVvZl9kb25lKCZpKTsgdXBiX29uZW9mX25leHQoJmkpKSB7Ci0gKiAgICAvLyAuLi4KLSAqICB9Ci0gKi8KLXZvaWQgdXBiX29uZW9mX2JlZ2luKHVwYl9vbmVvZl9pdGVyICppdGVyLCBjb25zdCB1cGJfb25lb2ZkZWYgKm8pOwotdm9pZCB1cGJfb25lb2ZfbmV4dCh1cGJfb25lb2ZfaXRlciAqaXRlcik7Ci1ib29sIHVwYl9vbmVvZl9kb25lKHVwYl9vbmVvZl9pdGVyICppdGVyKTsKLXVwYl9maWVsZGRlZiAqdXBiX29uZW9mX2l0ZXJfZmllbGQoY29uc3QgdXBiX29uZW9mX2l0ZXIgKml0ZXIpOwotdm9pZCB1cGJfb25lb2ZfaXRlcl9zZXRkb25lKHVwYl9vbmVvZl9pdGVyICppdGVyKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotVVBCX0lOTElORSBjb25zdCBjaGFyKiB1cGJfc2FmZWNzdHIoY29uc3Qgc3RkOjpzdHJpbmcmIHN0cikgewotICBhc3NlcnQoc3RyLnNpemUoKSA9PSBzdGQ6OnN0cmxlbihzdHIuY19zdHIoKSkpOwotICByZXR1cm4gc3RyLmNfc3RyKCk7Ci19Ci0KLS8qIElubGluZSBDKysgd3JhcHBlcnMuICovCi1uYW1lc3BhY2UgdXBiIHsKLQotaW5saW5lIERlZiogRGVmOjpEdXAoY29uc3Qgdm9pZCogb3duZXIpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9kZWZfZHVwKHRoaXMsIG93bmVyKTsKLX0KLWlubGluZSBEZWY6OlR5cGUgRGVmOjpkZWZfdHlwZSgpIGNvbnN0IHsgcmV0dXJuIHVwYl9kZWZfdHlwZSh0aGlzKTsgfQotaW5saW5lIGNvbnN0IGNoYXIqIERlZjo6ZnVsbF9uYW1lKCkgY29uc3QgeyByZXR1cm4gdXBiX2RlZl9mdWxsbmFtZSh0aGlzKTsgfQotaW5saW5lIGJvb2wgRGVmOjpzZXRfZnVsbF9uYW1lKGNvbnN0IGNoYXIqIGZ1bGxuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9kZWZfc2V0ZnVsbG5hbWUodGhpcywgZnVsbG5hbWUsIHMpOwotfQotaW5saW5lIGJvb2wgRGVmOjpzZXRfZnVsbF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZGVmX3NldGZ1bGxuYW1lKHRoaXMsIHVwYl9zYWZlY3N0cihmdWxsbmFtZSksIHMpOwotfQotaW5saW5lIGJvb2wgRGVmOjpGcmVlemUoRGVmKiBjb25zdCogZGVmcywgaW50IG4sIFN0YXR1cyogc3RhdHVzKSB7Ci0gIHJldHVybiB1cGJfZGVmX2ZyZWV6ZShkZWZzLCBuLCBzdGF0dXMpOwotfQotaW5saW5lIGJvb2wgRGVmOjpGcmVlemUoY29uc3Qgc3RkOjp2ZWN0b3I8RGVmKj4mIGRlZnMsIFN0YXR1cyogc3RhdHVzKSB7Ci0gIHJldHVybiB1cGJfZGVmX2ZyZWV6ZSgoRGVmKiBjb25zdCopJmRlZnNbMF0sIGRlZnMuc2l6ZSgpLCBzdGF0dXMpOwotfQotCi1pbmxpbmUgYm9vbCBGaWVsZERlZjo6Q2hlY2tUeXBlKGludDMyX3QgdmFsKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfY2hlY2t0eXBlKHZhbCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6Q2hlY2tMYWJlbChpbnQzMl90IHZhbCkgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2NoZWNrbGFiZWwodmFsKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpDaGVja0Rlc2NyaXB0b3JUeXBlKGludDMyX3QgdmFsKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfY2hlY2tkZXNjcmlwdG9ydHlwZSh2YWwpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OkNoZWNrSW50ZWdlckZvcm1hdChpbnQzMl90IHZhbCkgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2NoZWNraW50Zm10KHZhbCk7Ci19Ci1pbmxpbmUgRmllbGREZWY6OlR5cGUgRmllbGREZWY6OkNvbnZlcnRUeXBlKGludDMyX3QgdmFsKSB7Ci0gIGFzc2VydChDaGVja1R5cGUodmFsKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxGaWVsZERlZjo6VHlwZT4odmFsKTsKLX0KLWlubGluZSBGaWVsZERlZjo6TGFiZWwgRmllbGREZWY6OkNvbnZlcnRMYWJlbChpbnQzMl90IHZhbCkgewotICBhc3NlcnQoQ2hlY2tMYWJlbCh2YWwpKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEZpZWxkRGVmOjpMYWJlbD4odmFsKTsKLX0KLWlubGluZSBGaWVsZERlZjo6RGVzY3JpcHRvclR5cGUgRmllbGREZWY6OkNvbnZlcnREZXNjcmlwdG9yVHlwZShpbnQzMl90IHZhbCkgewotICBhc3NlcnQoQ2hlY2tEZXNjcmlwdG9yVHlwZSh2YWwpKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEZpZWxkRGVmOjpEZXNjcmlwdG9yVHlwZT4odmFsKTsKLX0KLWlubGluZSBGaWVsZERlZjo6SW50ZWdlckZvcm1hdCBGaWVsZERlZjo6Q29udmVydEludGVnZXJGb3JtYXQoaW50MzJfdCB2YWwpIHsKLSAgYXNzZXJ0KENoZWNrSW50ZWdlckZvcm1hdCh2YWwpKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEZpZWxkRGVmOjpJbnRlZ2VyRm9ybWF0Pih2YWwpOwotfQotCi1pbmxpbmUgcmVmZmVkX3B0cjxGaWVsZERlZj4gRmllbGREZWY6Ok5ldygpIHsKLSAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX2ZpZWxkZGVmX25ldygmZik7Ci0gIHJldHVybiByZWZmZWRfcHRyPEZpZWxkRGVmPihmLCAmZik7Ci19Ci1pbmxpbmUgRmllbGREZWYqIEZpZWxkRGVmOjpEdXAoY29uc3Qgdm9pZCogb3duZXIpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kdXAodGhpcywgb3duZXIpOwotfQotaW5saW5lIGNvbnN0IGNoYXIqIEZpZWxkRGVmOjpmdWxsX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfZnVsbG5hbWUodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0ZnVsbG5hbWUodGhpcywgZnVsbG5hbWUsIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRmdWxsbmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIoZnVsbG5hbWUpLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjp0eXBlX2lzX3NldCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl90eXBlaXNzZXQodGhpcyk7Ci19Ci1pbmxpbmUgRmllbGREZWY6OlR5cGUgRmllbGREZWY6OnR5cGUoKSBjb25zdCB7IHJldHVybiB1cGJfZmllbGRkZWZfdHlwZSh0aGlzKTsgfQotaW5saW5lIEZpZWxkRGVmOjpEZXNjcmlwdG9yVHlwZSBGaWVsZERlZjo6ZGVzY3JpcHRvcl90eXBlKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2Rlc2NyaXB0b3J0eXBlKHRoaXMpOwotfQotaW5saW5lIEZpZWxkRGVmOjpMYWJlbCBGaWVsZERlZjo6bGFiZWwoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfbGFiZWwodGhpcyk7Ci19Ci1pbmxpbmUgdWludDMyX3QgRmllbGREZWY6Om51bWJlcigpIGNvbnN0IHsgcmV0dXJuIHVwYl9maWVsZGRlZl9udW1iZXIodGhpcyk7IH0KLWlubGluZSBjb25zdCBjaGFyKiBGaWVsZERlZjo6bmFtZSgpIGNvbnN0IHsgcmV0dXJuIHVwYl9maWVsZGRlZl9uYW1lKHRoaXMpOyB9Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6aXNfZXh0ZW5zaW9uKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2lzZXh0ZW5zaW9uKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OmxhenkoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfbGF6eSh0aGlzKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfbGF6eShib29sIGxhenkpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGxhenkodGhpcywgbGF6eSk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6cGFja2VkKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3BhY2tlZCh0aGlzKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfcGFja2VkKGJvb2wgcGFja2VkKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRwYWNrZWQodGhpcywgcGFja2VkKTsKLX0KLWlubGluZSBjb25zdCBNZXNzYWdlRGVmKiBGaWVsZERlZjo6Y29udGFpbmluZ190eXBlKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKHRoaXMpOwotfQotaW5saW5lIGNvbnN0IE9uZW9mRGVmKiBGaWVsZERlZjo6Y29udGFpbmluZ19vbmVvZigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogRmllbGREZWY6OmNvbnRhaW5pbmdfdHlwZV9uYW1lKCkgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlbmFtZSh0aGlzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfbnVtYmVyKHVpbnQzMl90IG51bWJlciwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0bnVtYmVyKHRoaXMsIG51bWJlciwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X25hbWUoY29uc3QgY2hhciAqbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0bmFtZSh0aGlzLCBuYW1lLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0bmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIobmFtZSksIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9jb250YWluaW5nX3R5cGVfbmFtZShjb25zdCBjaGFyICpuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRjb250YWluaW5ndHlwZW5hbWUodGhpcywgbmFtZSwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X2NvbnRhaW5pbmdfdHlwZV9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMgKnMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRjb250YWluaW5ndHlwZW5hbWUodGhpcywgdXBiX3NhZmVjc3RyKG5hbWUpLCBzKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfdHlwZSh1cGJfZmllbGR0eXBlX3QgdHlwZSkgewotICB1cGJfZmllbGRkZWZfc2V0dHlwZSh0aGlzLCB0eXBlKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfaXNfZXh0ZW5zaW9uKGJvb2wgaXNfZXh0ZW5zaW9uKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRpc2V4dGVuc2lvbih0aGlzLCBpc19leHRlbnNpb24pOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZXNjcmlwdG9yX3R5cGUoRmllbGREZWY6OkRlc2NyaXB0b3JUeXBlIHR5cGUpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlc2NyaXB0b3J0eXBlKHRoaXMsIHR5cGUpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9sYWJlbCh1cGJfbGFiZWxfdCBsYWJlbCkgewotICB1cGJfZmllbGRkZWZfc2V0bGFiZWwodGhpcywgbGFiZWwpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OklzU3ViTWVzc2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9pc3N1Ym1zZyh0aGlzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpJc1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHVwYl9maWVsZGRlZl9pc3N0cmluZyh0aGlzKTsgfQotaW5saW5lIGJvb2wgRmllbGREZWY6OklzU2VxdWVuY2UoKSBjb25zdCB7IHJldHVybiB1cGJfZmllbGRkZWZfaXNzZXEodGhpcyk7IH0KLWlubGluZSBib29sIEZpZWxkRGVmOjpJc01hcCgpIGNvbnN0IHsgcmV0dXJuIHVwYl9maWVsZGRlZl9pc21hcCh0aGlzKTsgfQotaW5saW5lIGludDY0X3QgRmllbGREZWY6OmRlZmF1bHRfaW50NjQoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfZGVmYXVsdGludDY0KHRoaXMpOwotfQotaW5saW5lIGludDMyX3QgRmllbGREZWY6OmRlZmF1bHRfaW50MzIoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfZGVmYXVsdGludDMyKHRoaXMpOwotfQotaW5saW5lIHVpbnQ2NF90IEZpZWxkRGVmOjpkZWZhdWx0X3VpbnQ2NCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZWZhdWx0dWludDY0KHRoaXMpOwotfQotaW5saW5lIHVpbnQzMl90IEZpZWxkRGVmOjpkZWZhdWx0X3VpbnQzMigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZWZhdWx0dWludDMyKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OmRlZmF1bHRfYm9vbCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZWZhdWx0Ym9vbCh0aGlzKTsKLX0KLWlubGluZSBmbG9hdCBGaWVsZERlZjo6ZGVmYXVsdF9mbG9hdCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZWZhdWx0ZmxvYXQodGhpcyk7Ci19Ci1pbmxpbmUgZG91YmxlIEZpZWxkRGVmOjpkZWZhdWx0X2RvdWJsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZWZhdWx0ZG91YmxlKHRoaXMpOwotfQotaW5saW5lIGNvbnN0IGNoYXIqIEZpZWxkRGVmOjpkZWZhdWx0X3N0cmluZyhzaXplX3QqIGxlbikgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2RlZmF1bHRzdHIodGhpcywgbGVuKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfZGVmYXVsdF9pbnQ2NChpbnQ2NF90IHZhbHVlKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0aW50NjQodGhpcywgdmFsdWUpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZWZhdWx0X2ludDMyKGludDMyX3QgdmFsdWUpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQzMih0aGlzLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2RlZmF1bHRfdWludDY0KHVpbnQ2NF90IHZhbHVlKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0dWludDY0KHRoaXMsIHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfZGVmYXVsdF91aW50MzIodWludDMyX3QgdmFsdWUpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50MzIodGhpcywgdmFsdWUpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZWZhdWx0X2Jvb2woYm9vbCB2YWx1ZSkgewotICB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGJvb2wodGhpcywgdmFsdWUpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZWZhdWx0X2Zsb2F0KGZsb2F0IHZhbHVlKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0ZmxvYXQodGhpcywgdmFsdWUpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZWZhdWx0X2RvdWJsZShkb3VibGUgdmFsdWUpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRkb3VibGUodGhpcywgdmFsdWUpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9kZWZhdWx0X3N0cmluZyhjb25zdCB2b2lkICpzdHIsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRzdHIodGhpcywgc3RyLCBsZW4sIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9kZWZhdWx0X3N0cmluZyhjb25zdCBzdGQ6OnN0cmluZyYgc3RyLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0c3RyKHRoaXMsIHN0ci5jX3N0cigpLCBzdHIuc2l6ZSgpLCBzKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfZGVmYXVsdF9jc3RyKGNvbnN0IGNoYXIqIHN0ciwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGNzdHIodGhpcywgc3RyLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpIYXNTdWJEZWYoKSBjb25zdCB7IHJldHVybiB1cGJfZmllbGRkZWZfaGFzc3ViZGVmKHRoaXMpOyB9Ci1pbmxpbmUgY29uc3QgRGVmKiBGaWVsZERlZjo6c3ViZGVmKCkgY29uc3QgeyByZXR1cm4gdXBiX2ZpZWxkZGVmX3N1YmRlZih0aGlzKTsgfQotaW5saW5lIGNvbnN0IE1lc3NhZ2VEZWYgKkZpZWxkRGVmOjptZXNzYWdlX3N1YmRlZigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9tc2dzdWJkZWYodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgRW51bURlZiAqRmllbGREZWY6OmVudW1fc3ViZGVmKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2VudW1zdWJkZWYodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogRmllbGREZWY6OnN1YmRlZl9uYW1lKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3N1YmRlZm5hbWUodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X3N1YmRlZihjb25zdCBEZWYqIHN1YmRlZiwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0c3ViZGVmKHRoaXMsIHN1YmRlZiwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X2VudW1fc3ViZGVmKGNvbnN0IEVudW1EZWYqIHN1YmRlZiwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0ZW51bXN1YmRlZih0aGlzLCBzdWJkZWYsIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9tZXNzYWdlX3N1YmRlZihjb25zdCBNZXNzYWdlRGVmKiBzdWJkZWYsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldG1zZ3N1YmRlZih0aGlzLCBzdWJkZWYsIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9zdWJkZWZfbmFtZShjb25zdCBjaGFyKiBuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKHRoaXMsIG5hbWUsIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9zdWJkZWZfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0c3ViZGVmbmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIobmFtZSksIHMpOwotfQotCi1pbmxpbmUgcmVmZmVkX3B0cjxNZXNzYWdlRGVmPiBNZXNzYWdlRGVmOjpOZXcoKSB7Ci0gIHVwYl9tc2dkZWYgKm0gPSB1cGJfbXNnZGVmX25ldygmbSk7Ci0gIHJldHVybiByZWZmZWRfcHRyPE1lc3NhZ2VEZWY+KG0sICZtKTsKLX0KLWlubGluZSBjb25zdCBjaGFyICpNZXNzYWdlRGVmOjpmdWxsX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX2Z1bGxuYW1lKHRoaXMpOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6c2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX3NldGZ1bGxuYW1lKHRoaXMsIGZ1bGxuYW1lLCBzKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OnNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfc2V0ZnVsbG5hbWUodGhpcywgdXBiX3NhZmVjc3RyKGZ1bGxuYW1lKSwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpGcmVlemUoU3RhdHVzKiBzdGF0dXMpIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfZnJlZXplKHRoaXMsIHN0YXR1cyk7Ci19Ci1pbmxpbmUgaW50IE1lc3NhZ2VEZWY6OmZpZWxkX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ2RlZl9udW1maWVsZHModGhpcyk7Ci19Ci1pbmxpbmUgaW50IE1lc3NhZ2VEZWY6Om9uZW9mX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ2RlZl9udW1vbmVvZnModGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpBZGRGaWVsZCh1cGJfZmllbGRkZWYqIGYsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX21zZ2RlZl9hZGRmaWVsZCh0aGlzLCBmLCBOVUxMLCBzKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OkFkZEZpZWxkKGNvbnN0IHJlZmZlZF9wdHI8RmllbGREZWY+JiBmLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfYWRkZmllbGQodGhpcywgZi5nZXQoKSwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpBZGRPbmVvZih1cGJfb25lb2ZkZWYqIG8sIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX21zZ2RlZl9hZGRvbmVvZih0aGlzLCBvLCBOVUxMLCBzKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OkFkZE9uZW9mKGNvbnN0IHJlZmZlZF9wdHI8T25lb2ZEZWY+JiBvLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfYWRkb25lb2YodGhpcywgby5nZXQoKSwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgRmllbGREZWYqIE1lc3NhZ2VEZWY6OkZpbmRGaWVsZEJ5TnVtYmVyKHVpbnQzMl90IG51bWJlcikgewotICByZXR1cm4gdXBiX21zZ2RlZl9pdG9mX211dGFibGUodGhpcywgbnVtYmVyKTsKLX0KLWlubGluZSBGaWVsZERlZiogTWVzc2FnZURlZjo6RmluZEZpZWxkQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBsZW4pIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfbnRvZl9tdXRhYmxlKHRoaXMsIG5hbWUsIGxlbik7Ci19Ci1pbmxpbmUgY29uc3QgRmllbGREZWYqIE1lc3NhZ2VEZWY6OkZpbmRGaWVsZEJ5TnVtYmVyKHVpbnQzMl90IG51bWJlcikgY29uc3QgewotICByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHRoaXMsIG51bWJlcik7Ci19Ci1pbmxpbmUgY29uc3QgRmllbGREZWYgKk1lc3NhZ2VEZWY6OkZpbmRGaWVsZEJ5TmFtZShjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgY29uc3QgewotICByZXR1cm4gdXBiX21zZ2RlZl9udG9mKHRoaXMsIG5hbWUsIGxlbik7Ci19Ci1pbmxpbmUgT25lb2ZEZWYqIE1lc3NhZ2VEZWY6OkZpbmRPbmVvZkJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbGVuKSB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX250b29fbXV0YWJsZSh0aGlzLCBuYW1lLCBsZW4pOwotfQotaW5saW5lIGNvbnN0IE9uZW9mRGVmKiBNZXNzYWdlRGVmOjpGaW5kT25lb2ZCeU5hbWUoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfbnRvbyh0aGlzLCBuYW1lLCBsZW4pOwotfQotaW5saW5lIE1lc3NhZ2VEZWYqIE1lc3NhZ2VEZWY6OkR1cChjb25zdCB2b2lkICpvd25lcikgY29uc3QgewotICByZXR1cm4gdXBiX21zZ2RlZl9kdXAodGhpcywgb3duZXIpOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZURlZjo6c2V0bWFwZW50cnkoYm9vbCBtYXBfZW50cnkpIHsKLSAgdXBiX21zZ2RlZl9zZXRtYXBlbnRyeSh0aGlzLCBtYXBfZW50cnkpOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6bWFwZW50cnkoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX21hcGVudHJ5KHRoaXMpOwotfQotaW5saW5lIE1lc3NhZ2VEZWY6OmZpZWxkX2l0ZXJhdG9yIE1lc3NhZ2VEZWY6OmZpZWxkX2JlZ2luKCkgewotICByZXR1cm4gZmllbGRfaXRlcmF0b3IodGhpcyk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3IgTWVzc2FnZURlZjo6ZmllbGRfZW5kKCkgewotICByZXR1cm4gZmllbGRfaXRlcmF0b3I6OmVuZCh0aGlzKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvciBNZXNzYWdlRGVmOjpmaWVsZF9iZWdpbigpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2ZpZWxkX2l0ZXJhdG9yKHRoaXMpOwotfQotaW5saW5lIE1lc3NhZ2VEZWY6OmNvbnN0X2ZpZWxkX2l0ZXJhdG9yIE1lc3NhZ2VEZWY6OmZpZWxkX2VuZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2ZpZWxkX2l0ZXJhdG9yOjplbmQodGhpcyk7Ci19Ci0KLWlubGluZSBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvciBNZXNzYWdlRGVmOjpvbmVvZl9iZWdpbigpIHsKLSAgcmV0dXJuIG9uZW9mX2l0ZXJhdG9yKHRoaXMpOwotfQotaW5saW5lIE1lc3NhZ2VEZWY6Om9uZW9mX2l0ZXJhdG9yIE1lc3NhZ2VEZWY6Om9uZW9mX2VuZCgpIHsKLSAgcmV0dXJuIG9uZW9mX2l0ZXJhdG9yOjplbmQodGhpcyk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3IgTWVzc2FnZURlZjo6b25lb2ZfYmVnaW4oKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9vbmVvZl9pdGVyYXRvcih0aGlzKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvciBNZXNzYWdlRGVmOjpvbmVvZl9lbmQoKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9vbmVvZl9pdGVyYXRvcjo6ZW5kKHRoaXMpOwotfQotCi1pbmxpbmUgTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3I6OmZpZWxkX2l0ZXJhdG9yKE1lc3NhZ2VEZWYqIG1kKSB7Ci0gIHVwYl9tc2dfZmllbGRfYmVnaW4oJml0ZXJfLCBtZCk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3IgTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3I6OmVuZCgKLSAgICBNZXNzYWdlRGVmKiBtZCkgewotICBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvciBpdGVyKG1kKTsKLSAgdXBiX21zZ19maWVsZF9pdGVyX3NldGRvbmUoJml0ZXIuaXRlcl8pOwotICByZXR1cm4gaXRlcjsKLX0KLWlubGluZSBGaWVsZERlZiogTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dfaXRlcl9maWVsZCgmaXRlcl8pOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIHJldHVybiB1cGJfbXNnX2ZpZWxkX25leHQoJml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OmZpZWxkX2l0ZXJhdG9yOjpvcGVyYXRvcj09KAotICAgIGNvbnN0IGZpZWxkX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gdXBiX2ludHRhYmxlX2l0ZXJfaXNlcXVhbCgmaXRlcl8sICZvdGhlci5pdGVyXyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvcjo6b3BlcmF0b3IhPSgKLSAgICBjb25zdCBmaWVsZF9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotfQotCi1pbmxpbmUgTWVzc2FnZURlZjo6Y29uc3RfZmllbGRfaXRlcmF0b3I6OmNvbnN0X2ZpZWxkX2l0ZXJhdG9yKAotICAgIGNvbnN0IE1lc3NhZ2VEZWYqIG1kKSB7Ci0gIHVwYl9tc2dfZmllbGRfYmVnaW4oJml0ZXJfLCBtZCk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6Y29uc3RfZmllbGRfaXRlcmF0b3IgTWVzc2FnZURlZjo6Y29uc3RfZmllbGRfaXRlcmF0b3I6OmVuZCgKLSAgICBjb25zdCBNZXNzYWdlRGVmICptZCkgewotICBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvciBpdGVyKG1kKTsKLSAgdXBiX21zZ19maWVsZF9pdGVyX3NldGRvbmUoJml0ZXIuaXRlcl8pOwotICByZXR1cm4gaXRlcjsKLX0KLWlubGluZSBjb25zdCBGaWVsZERlZiogTWVzc2FnZURlZjo6Y29uc3RfZmllbGRfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dfaXRlcl9maWVsZCgmaXRlcl8pOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZURlZjo6Y29uc3RfZmllbGRfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIHJldHVybiB1cGJfbXNnX2ZpZWxkX25leHQoJml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OmNvbnN0X2ZpZWxkX2l0ZXJhdG9yOjpvcGVyYXRvcj09KAotICAgIGNvbnN0IGNvbnN0X2ZpZWxkX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gdXBiX2ludHRhYmxlX2l0ZXJfaXNlcXVhbCgmaXRlcl8sICZvdGhlci5pdGVyXyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvcjo6b3BlcmF0b3IhPSgKLSAgICBjb25zdCBjb25zdF9maWVsZF9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotfQotCi1pbmxpbmUgTWVzc2FnZURlZjo6b25lb2ZfaXRlcmF0b3I6Om9uZW9mX2l0ZXJhdG9yKE1lc3NhZ2VEZWYqIG1kKSB7Ci0gIHVwYl9tc2dfb25lb2ZfYmVnaW4oJml0ZXJfLCBtZCk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6b25lb2ZfaXRlcmF0b3IgTWVzc2FnZURlZjo6b25lb2ZfaXRlcmF0b3I6OmVuZCgKLSAgICBNZXNzYWdlRGVmKiBtZCkgewotICBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvciBpdGVyKG1kKTsKLSAgdXBiX21zZ19vbmVvZl9pdGVyX3NldGRvbmUoJml0ZXIuaXRlcl8pOwotICByZXR1cm4gaXRlcjsKLX0KLWlubGluZSBPbmVvZkRlZiogTWVzc2FnZURlZjo6b25lb2ZfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dfaXRlcl9vbmVvZigmaXRlcl8pOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZURlZjo6b25lb2ZfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIHJldHVybiB1cGJfbXNnX29uZW9mX25leHQoJml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6Om9uZW9mX2l0ZXJhdG9yOjpvcGVyYXRvcj09KAotICAgIGNvbnN0IG9uZW9mX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2l0ZXJfaXNlcXVhbCgmaXRlcl8sICZvdGhlci5pdGVyXyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvcjo6b3BlcmF0b3IhPSgKLSAgICBjb25zdCBvbmVvZl9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotfQotCi1pbmxpbmUgTWVzc2FnZURlZjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3I6OmNvbnN0X29uZW9mX2l0ZXJhdG9yKAotICAgIGNvbnN0IE1lc3NhZ2VEZWYqIG1kKSB7Ci0gIHVwYl9tc2dfb25lb2ZfYmVnaW4oJml0ZXJfLCBtZCk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3IgTWVzc2FnZURlZjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3I6OmVuZCgKLSAgICBjb25zdCBNZXNzYWdlRGVmICptZCkgewotICBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvciBpdGVyKG1kKTsKLSAgdXBiX21zZ19vbmVvZl9pdGVyX3NldGRvbmUoJml0ZXIuaXRlcl8pOwotICByZXR1cm4gaXRlcjsKLX0KLWlubGluZSBjb25zdCBPbmVvZkRlZiogTWVzc2FnZURlZjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dfaXRlcl9vbmVvZigmaXRlcl8pOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZURlZjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIHJldHVybiB1cGJfbXNnX29uZW9mX25leHQoJml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OmNvbnN0X29uZW9mX2l0ZXJhdG9yOjpvcGVyYXRvcj09KAotICAgIGNvbnN0IGNvbnN0X29uZW9mX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2l0ZXJfaXNlcXVhbCgmaXRlcl8sICZvdGhlci5pdGVyXyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvcjo6b3BlcmF0b3IhPSgKLSAgICBjb25zdCBjb25zdF9vbmVvZl9pdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotfQotCi1pbmxpbmUgcmVmZmVkX3B0cjxFbnVtRGVmPiBFbnVtRGVmOjpOZXcoKSB7Ci0gIHVwYl9lbnVtZGVmICplID0gdXBiX2VudW1kZWZfbmV3KCZlKTsKLSAgcmV0dXJuIHJlZmZlZF9wdHI8RW51bURlZj4oZSwgJmUpOwotfQotaW5saW5lIGNvbnN0IGNoYXIqIEVudW1EZWY6OmZ1bGxfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX2Z1bGxuYW1lKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRW51bURlZjo6c2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZW51bWRlZl9zZXRmdWxsbmFtZSh0aGlzLCBmdWxsbmFtZSwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBFbnVtRGVmOjpzZXRfZnVsbF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZW51bWRlZl9zZXRmdWxsbmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIoZnVsbG5hbWUpLCBzKTsKLX0KLWlubGluZSBib29sIEVudW1EZWY6OkZyZWV6ZShTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2VudW1kZWZfZnJlZXplKHRoaXMsIHN0YXR1cyk7Ci19Ci1pbmxpbmUgaW50MzJfdCBFbnVtRGVmOjpkZWZhdWx0X3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gdXBiX2VudW1kZWZfZGVmYXVsdCh0aGlzKTsKLX0KLWlubGluZSBib29sIEVudW1EZWY6OnNldF9kZWZhdWx0X3ZhbHVlKGludDMyX3QgdmFsLCBTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2VudW1kZWZfc2V0ZGVmYXVsdCh0aGlzLCB2YWwsIHN0YXR1cyk7Ci19Ci1pbmxpbmUgaW50IEVudW1EZWY6OnZhbHVlX2NvdW50KCkgY29uc3QgeyByZXR1cm4gdXBiX2VudW1kZWZfbnVtdmFscyh0aGlzKTsgfQotaW5saW5lIGJvb2wgRW51bURlZjo6QWRkVmFsdWUoY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCBudW0sIFN0YXR1cyogc3RhdHVzKSB7Ci0gIHJldHVybiB1cGJfZW51bWRlZl9hZGR2YWwodGhpcywgbmFtZSwgbnVtLCBzdGF0dXMpOwotfQotaW5saW5lIGJvb2wgRW51bURlZjo6QWRkVmFsdWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIGludDMyX3QgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzKiBzdGF0dXMpIHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX2FkZHZhbCh0aGlzLCB1cGJfc2FmZWNzdHIobmFtZSksIG51bSwgc3RhdHVzKTsKLX0KLWlubGluZSBib29sIEVudW1EZWY6OkZpbmRWYWx1ZUJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90ICpudW0pIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX250b2l6KHRoaXMsIG5hbWUsIG51bSk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogRW51bURlZjo6RmluZFZhbHVlQnlOdW1iZXIoaW50MzJfdCBudW0pIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX2l0b24odGhpcywgbnVtKTsKLX0KLWlubGluZSBFbnVtRGVmKiBFbnVtRGVmOjpEdXAoY29uc3Qgdm9pZCogb3duZXIpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX2R1cCh0aGlzLCBvd25lcik7Ci19Ci0KLWlubGluZSBFbnVtRGVmOjpJdGVyYXRvcjo6SXRlcmF0b3IoY29uc3QgRW51bURlZiogZSkgewotICB1cGJfZW51bV9iZWdpbigmaXRlcl8sIGUpOwotfQotaW5saW5lIGludDMyX3QgRW51bURlZjo6SXRlcmF0b3I6Om51bWJlcigpIHsKLSAgcmV0dXJuIHVwYl9lbnVtX2l0ZXJfbnVtYmVyKCZpdGVyXyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogRW51bURlZjo6SXRlcmF0b3I6Om5hbWUoKSB7Ci0gIHJldHVybiB1cGJfZW51bV9pdGVyX25hbWUoJml0ZXJfKTsKLX0KLWlubGluZSBib29sIEVudW1EZWY6Okl0ZXJhdG9yOjpEb25lKCkgeyByZXR1cm4gdXBiX2VudW1fZG9uZSgmaXRlcl8pOyB9Ci1pbmxpbmUgdm9pZCBFbnVtRGVmOjpJdGVyYXRvcjo6TmV4dCgpIHsgcmV0dXJuIHVwYl9lbnVtX25leHQoJml0ZXJfKTsgfQotCi1pbmxpbmUgcmVmZmVkX3B0cjxPbmVvZkRlZj4gT25lb2ZEZWY6Ok5ldygpIHsKLSAgdXBiX29uZW9mZGVmICpvID0gdXBiX29uZW9mZGVmX25ldygmbyk7Ci0gIHJldHVybiByZWZmZWRfcHRyPE9uZW9mRGVmPihvLCAmbyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogT25lb2ZEZWY6OmZ1bGxfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9uYW1lKHRoaXMpOwotfQotCi1pbmxpbmUgY29uc3QgTWVzc2FnZURlZiogT25lb2ZEZWY6OmNvbnRhaW5pbmdfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9jb250YWluaW5ndHlwZSh0aGlzKTsKLX0KLWlubGluZSBjb25zdCBjaGFyKiBPbmVvZkRlZjo6bmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9uYW1lKHRoaXMpOwotfQotaW5saW5lIGJvb2wgT25lb2ZEZWY6OnNldF9uYW1lKGNvbnN0IGNoYXIqIG5hbWUsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX29uZW9mZGVmX3NldG5hbWUodGhpcywgbmFtZSwgcyk7Ci19Ci1pbmxpbmUgaW50IE9uZW9mRGVmOjpmaWVsZF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9udW1maWVsZHModGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6QWRkRmllbGQoRmllbGREZWYqIGZpZWxkLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9hZGRmaWVsZCh0aGlzLCBmaWVsZCwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6QWRkRmllbGQoY29uc3QgcmVmZmVkX3B0cjxGaWVsZERlZj4mIGZpZWxkLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9hZGRmaWVsZCh0aGlzLCBmaWVsZC5nZXQoKSwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgY29uc3QgRmllbGREZWYqIE9uZW9mRGVmOjpGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfb25lb2ZkZWZfbnRvZih0aGlzLCBuYW1lLCBsZW4pOwotfQotaW5saW5lIGNvbnN0IEZpZWxkRGVmKiBPbmVvZkRlZjo6RmluZEZpZWxkQnlOdW1iZXIodWludDMyX3QgbnVtKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfb25lb2ZkZWZfaXRvZih0aGlzLCBudW0pOwotfQotaW5saW5lIE9uZW9mRGVmOjppdGVyYXRvciBPbmVvZkRlZjo6YmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcih0aGlzKTsgfQotaW5saW5lIE9uZW9mRGVmOjppdGVyYXRvciBPbmVvZkRlZjo6ZW5kKCkgeyByZXR1cm4gaXRlcmF0b3I6OmVuZCh0aGlzKTsgfQotaW5saW5lIE9uZW9mRGVmOjpjb25zdF9pdGVyYXRvciBPbmVvZkRlZjo6YmVnaW4oKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzKTsKLX0KLWlubGluZSBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3IgT25lb2ZEZWY6OmVuZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjplbmQodGhpcyk7Ci19Ci0KLWlubGluZSBPbmVvZkRlZjo6aXRlcmF0b3I6Oml0ZXJhdG9yKE9uZW9mRGVmKiBvKSB7Ci0gIHVwYl9vbmVvZl9iZWdpbigmaXRlcl8sIG8pOwotfQotaW5saW5lIE9uZW9mRGVmOjppdGVyYXRvciBPbmVvZkRlZjo6aXRlcmF0b3I6OmVuZChPbmVvZkRlZiogbykgewotICBPbmVvZkRlZjo6aXRlcmF0b3IgaXRlcihvKTsKLSAgdXBiX29uZW9mX2l0ZXJfc2V0ZG9uZSgmaXRlci5pdGVyXyk7Ci0gIHJldHVybiBpdGVyOwotfQotaW5saW5lIEZpZWxkRGVmKiBPbmVvZkRlZjo6aXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9vbmVvZl9pdGVyX2ZpZWxkKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBPbmVvZkRlZjo6aXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7IHJldHVybiB1cGJfb25lb2ZfbmV4dCgmaXRlcl8pOyB9Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6aXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfaXRlcl9pc2VxdWFsKCZpdGVyXywgJm90aGVyLml0ZXJfKTsKLX0KLWlubGluZSBib29sIE9uZW9mRGVmOjppdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotfQotCi1pbmxpbmUgT25lb2ZEZWY6OmNvbnN0X2l0ZXJhdG9yOjpjb25zdF9pdGVyYXRvcihjb25zdCBPbmVvZkRlZiogbWQpIHsKLSAgdXBiX29uZW9mX2JlZ2luKCZpdGVyXywgbWQpOwotfQotaW5saW5lIE9uZW9mRGVmOjpjb25zdF9pdGVyYXRvciBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3I6OmVuZCgKLSAgICBjb25zdCBPbmVvZkRlZiAqbWQpIHsKLSAgT25lb2ZEZWY6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIobWQpOwotICB1cGJfb25lb2ZfaXRlcl9zZXRkb25lKCZpdGVyLml0ZXJfKTsKLSAgcmV0dXJuIGl0ZXI7Ci19Ci1pbmxpbmUgY29uc3QgRmllbGREZWYqIE9uZW9mRGVmOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIHJldHVybiB1cGJfb25lb2ZfbmV4dCgmaXRlcl8pOwotfQotaW5saW5lIGJvb2wgT25lb2ZEZWY6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcj09KAotICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gdXBiX2ludHRhYmxlX2l0ZXJfaXNlcXVhbCgmaXRlcl8sICZvdGhlci5pdGVyXyk7Ci19Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yIT0oCi0gICAgY29uc3QgY29uc3RfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLX0KLQotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2VuZGlmCi0KLSNlbmRpZiAvKiBVUEJfREVGX0hfICovCi0vKgotKiogVGhpcyBmaWxlIGNvbnRhaW5zIGRlZmluaXRpb25zIG9mIHN0cnVjdHMgdGhhdCBzaG91bGQgYmUgY29uc2lkZXJlZCBwcml2YXRlCi0qKiBhbmQgTk9UIHN0YWJsZSBhY3Jvc3MgdmVyc2lvbnMgb2YgdXBiLgotKioKLSoqIFRoZSBvbmx5IHJlYXNvbiB0aGV5IGFyZSBkZWNsYXJlZCBoZXJlIGFuZCBub3QgaW4gLmMgZmlsZXMgaXMgdG8gYWxsb3cgdXBiCi0qKiBhbmQgdGhlIGFwcGxpY2F0aW9uIChpZiBkZXNpcmVkKSB0byBlbWJlZCBzdGF0aWNhbGx5LWluaXRpYWxpemVkIGluc3RhbmNlcwotKiogb2Ygc3RydWN0dXJlcyBsaWtlIGRlZnMuCi0qKgotKiogSWYgeW91IGluY2x1ZGUgdGhpcyBmaWxlLCBhbGwgZ3VhcmFudGVlcyBvZiBBQkkgY29tcGF0aWJpbGl0eSBnbyBvdXQgdGhlCi0qKiB3aW5kb3chICBBbnkgY29kZSB0aGF0IGluY2x1ZGVzIHRoaXMgZmlsZSBuZWVkcyB0byByZWNvbXBpbGUgYWdhaW5zdCB0aGUKLSoqIGV4YWN0IHNhbWUgdmVyc2lvbiBvZiB1cGIgdGhhdCB0aGV5IGFyZSBsaW5raW5nIGFnYWluc3QuCi0qKgotKiogWW91IGFsc28gbmVlZCB0byByZWNvbXBpbGUgaWYgeW91IGNoYW5nZSB0aGUgdmFsdWUgb2YgdGhlIFVQQl9ERUJVR19SRUZTCi0qKiBmbGFnLgotKi8KLQotCi0jaWZuZGVmIFVQQl9TVEFUSUNJTklUX0hfCi0jZGVmaW5lIFVQQl9TVEFUSUNJTklUX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotLyogQmVjYXVzZSBvZiBob3cgd2UgZG8gb3VyIHR5cGVkZWZzLCB0aGlzIGhlYWRlciBjYW4ndCBiZSBpbmNsdWRlZCBmcm9tIEMrKy4gKi8KLSNlcnJvciBUaGlzIGZpbGUgY2Fubm90IGJlIGluY2x1ZGVkIGZyb20gQysrCi0jZW5kaWYKLQotLyogdXBiX3JlZmNvdW50ZWQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotCi0vKiB1cGJfZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdXBiX2RlZiB7Ci0gIHVwYl9yZWZjb3VudGVkIGJhc2U7Ci0KLSAgY29uc3QgY2hhciAqZnVsbG5hbWU7Ci0gIGNoYXIgdHlwZTsgIC8qIEEgdXBiX2RlZnR5cGVfdCAoY2hhciB0byBzYXZlIHNwYWNlKSAqLwotCi0gIC8qIFVzZWQgYXMgYSBmbGFnIGR1cmluZyB0aGUgZGVmJ3MgbXV0YWJsZSBzdGFnZS4gIE11c3QgYmUgZmFsc2UgdW5sZXNzCi0gICAqIGl0IGlzIGN1cnJlbnRseSBiZWluZyB1c2VkIGJ5IGEgZnVuY3Rpb24gb24gdGhlIHN0YWNrLiAgVGhpcyBhbGxvd3MKLSAgICogdXMgdG8gZWFzaWx5IGRldGVybWluZSB3aGljaCBkZWZzIHdlcmUgcGFzc2VkIGludG8gdGhlIGZ1bmN0aW9uJ3MKLSAgICogY3VycmVudCBpbnZvY2F0aW9uLiAqLwotICBib29sIGNhbWVfZnJvbV91c2VyOwotfTsKLQotI2RlZmluZSBVUEJfREVGX0lOSVQobmFtZSwgdHlwZSwgcmVmcywgcmVmMnMpIFwKLSAgICB7IFVQQl9SRUZDT1VOVF9JTklUKHJlZnMsIHJlZjJzKSwgbmFtZSwgdHlwZSwgZmFsc2UgfQotCi0KLS8qIHVwYl9maWVsZGRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCB1cGJfZmllbGRkZWYgewotICB1cGJfZGVmIGJhc2U7Ci0KLSAgdW5pb24gewotICAgIGludDY0X3Qgc2ludDsKLSAgICB1aW50NjRfdCB1aW50OwotICAgIGRvdWJsZSBkYmw7Ci0gICAgZmxvYXQgZmx0OwotICAgIHZvaWQgKmJ5dGVzOwotICB9IGRlZmF1bHR2YWw7Ci0gIHVuaW9uIHsKLSAgICBjb25zdCB1cGJfbXNnZGVmICpkZWY7ICAvKiBJZiAhbXNnX2lzX3N5bWJvbGljLiAqLwotICAgIGNoYXIgKm5hbWU7ICAgICAgICAgICAgIC8qIElmIG1zZ19pc19zeW1ib2xpYy4gKi8KLSAgfSBtc2c7Ci0gIHVuaW9uIHsKLSAgICBjb25zdCB1cGJfZGVmICpkZWY7ICAvKiBJZiAhc3ViZGVmX2lzX3N5bWJvbGljLiAqLwotICAgIGNoYXIgKm5hbWU7ICAgICAgICAgIC8qIElmIHN1YmRlZl9pc19zeW1ib2xpYy4gKi8KLSAgfSBzdWI7ICAvKiBUaGUgbXNnZGVmIG9yIGVudW1kZWYgZm9yIHRoaXMgZmllbGQsIGlmIHVwYl9oYXNzdWJkZWYoZikuICovCi0gIGJvb2wgc3ViZGVmX2lzX3N5bWJvbGljOwotICBib29sIG1zZ19pc19zeW1ib2xpYzsKLSAgY29uc3QgdXBiX29uZW9mZGVmICpvbmVvZjsKLSAgYm9vbCBkZWZhdWx0X2lzX3N0cmluZzsKLSAgYm9vbCB0eXBlX2lzX3NldF87ICAgICAvKiBGYWxzZSB1bnRpbCB0eXBlIGlzIGV4cGxpY2l0bHkgc2V0LiAqLwotICBib29sIGlzX2V4dGVuc2lvbl87Ci0gIGJvb2wgbGF6eV87Ci0gIGJvb2wgcGFja2VkXzsKLSAgdXBiX2ludGZtdF90IGludGZtdDsKLSAgYm9vbCB0YWdkZWxpbTsKLSAgdXBiX2ZpZWxkdHlwZV90IHR5cGVfOwotICB1cGJfbGFiZWxfdCBsYWJlbF87Ci0gIHVpbnQzMl90IG51bWJlcl87Ci0gIHVpbnQzMl90IHNlbGVjdG9yX2Jhc2U7ICAvKiBVc2VkIHRvIGluZGV4IGludG8gYSB1cGI6OkhhbmRsZXJzIHRhYmxlLiAqLwotICB1aW50MzJfdCBpbmRleF87Ci19OwotCi0jZGVmaW5lIFVQQl9GSUVMRERFRl9JTklUKGxhYmVsLCB0eXBlLCBpbnRmbXQsIHRhZ2RlbGltLCBpc19leHRlbnNpb24sIGxhenksICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBwYWNrZWQsIG5hbWUsIG51bSwgbXNnZGVmLCBzdWJkZWYsIHNlbGVjdG9yX2Jhc2UsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW5kZXgsIGRlZmF1bHR2YWwsIHJlZnMsIHJlZjJzKSAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVQQl9ERUZfSU5JVChuYW1lLCBVUEJfREVGX0ZJRUxELCByZWZzLCByZWYycyksIGRlZmF1bHR2YWwsIHttc2dkZWZ9LCAgICAgIFwKLSAgICAgICAge3N1YmRlZn0sIE5VTEwsIGZhbHNlLCBmYWxzZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHR5cGUgPT0gVVBCX1RZUEVfU1RSSU5HIHx8IHR5cGUgPT0gVVBCX1RZUEVfQllURVMsIHRydWUsIGlzX2V4dGVuc2lvbiwgXAotICAgICAgICBsYXp5LCBwYWNrZWQsIGludGZtdCwgdGFnZGVsaW0sIHR5cGUsIGxhYmVsLCBudW0sIHNlbGVjdG9yX2Jhc2UsIGluZGV4IFwKLSAgfQotCi0KLS8qIHVwYl9tc2dkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCB1cGJfbXNnZGVmIHsKLSAgdXBiX2RlZiBiYXNlOwotCi0gIHNpemVfdCBzZWxlY3Rvcl9jb3VudDsKLSAgdWludDMyX3Qgc3VibXNnX2ZpZWxkX2NvdW50OwotCi0gIC8qIFRhYmxlcyBmb3IgbG9va2luZyB1cCBmaWVsZHMgYnkgbnVtYmVyIGFuZCBuYW1lLiAqLwotICB1cGJfaW50dGFibGUgaXRvZjsgIC8qIGludCB0byBmaWVsZCAqLwotICB1cGJfc3RydGFibGUgbnRvZjsgIC8qIG5hbWUgdG8gZmllbGQgKi8KLQotICAvKiBUYWJsZXMgZm9yIGxvb2tpbmcgdXAgb25lb2ZzIGJ5IG5hbWUuICovCi0gIHVwYl9zdHJ0YWJsZSBudG9vOyAgLyogbmFtZSB0byBvbmVvZiAqLwotCi0gIC8qIElzIHRoaXMgYSBtYXAtZW50cnkgbWVzc2FnZT8KLSAgICogVE9ETzogc2V0IHRoaXMgZmxhZyBwcm9wZXJseSBmb3Igc3RhdGljIGRlc2NyaXB0b3JzOyByZWdlbmVyYXRlCi0gICAqIGRlc2NyaXB0b3IudXBiLmMuICovCi0gIGJvb2wgbWFwX2VudHJ5OwotCi0gIC8qIFRPRE8oaGFiZXJtYW4pOiBwcm9wZXIgZXh0ZW5zaW9uIHJhbmdlcyAodGhlcmUgY2FuIGJlIG11bHRpcGxlKS4gKi8KLX07Ci0KLS8qIFRPRE86IGFsc28gc3VwcG9ydCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb2YgdGhlIG9uZW9mcyB0YWJsZS4gVGhpcyB3aWxsIGJlCi0gKiBuZWVkZWQgaWYgd2UgY29tcGlsZSBpbiBkZXNjcmlwdG9ycyB0aGF0IGNvbnRhaW4gb25lb2ZzLiAqLwotI2RlZmluZSBVUEJfTVNHREVGX0lOSVQobmFtZSwgc2VsZWN0b3JfY291bnQsIHN1Ym1zZ19maWVsZF9jb3VudCwgaXRvZiwgbnRvZiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgcmVmcywgcmVmMnMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVQQl9ERUZfSU5JVChuYW1lLCBVUEJfREVGX01TRywgcmVmcywgcmVmMnMpLCBzZWxlY3Rvcl9jb3VudCwgICAgICAgICAgICAgXAotICAgICAgICBzdWJtc2dfZmllbGRfY291bnQsIGl0b2YsIG50b2YsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBVUEJfRU1QVFlfU1RSVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwgZmFsc2UgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLQotLyogdXBiX2VudW1kZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHVwYl9lbnVtZGVmIHsKLSAgdXBiX2RlZiBiYXNlOwotCi0gIHVwYl9zdHJ0YWJsZSBudG9pOwotICB1cGJfaW50dGFibGUgaXRvbjsKLSAgaW50MzJfdCBkZWZhdWx0dmFsOwotfTsKLQotI2RlZmluZSBVUEJfRU5VTURFRl9JTklUKG5hbWUsIG50b2ksIGl0b24sIGRlZmF1bHR2YWwsIHJlZnMsIHJlZjJzKSBcCi0gIHsgVVBCX0RFRl9JTklUKG5hbWUsIFVQQl9ERUZfRU5VTSwgcmVmcywgcmVmMnMpLCBudG9pLCBpdG9uLCBkZWZhdWx0dmFsIH0KLQotCi0vKiB1cGJfb25lb2ZkZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdXBiX29uZW9mZGVmIHsKLSAgdXBiX2RlZiBiYXNlOwotCi0gIHVwYl9zdHJ0YWJsZSBudG9mOwotICB1cGJfaW50dGFibGUgaXRvZjsKLSAgY29uc3QgdXBiX21zZ2RlZiAqcGFyZW50OwotfTsKLQotI2RlZmluZSBVUEJfT05FT0ZERUZfSU5JVChuYW1lLCBudG9mLCBpdG9mLCByZWZzLCByZWYycykgXAotICB7IFVQQl9ERUZfSU5JVChuYW1lLCBVUEJfREVGX0VOVU0sIHJlZnMsIHJlZjJzKSwgbnRvZiwgaXRvZiB9Ci0KLQotLyogdXBiX3N5bXRhYiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHVwYl9zeW10YWIgewotICB1cGJfcmVmY291bnRlZCBiYXNlOwotCi0gIHVwYl9zdHJ0YWJsZSBzeW10YWI7Ci19OwotCi0jZGVmaW5lIFVQQl9TWU1UQUJfSU5JVChzeW10YWIsIHJlZnMsIHJlZjJzKSBcCi0gIHsgVVBCX1JFRkNPVU5UX0lOSVQocmVmcywgcmVmMnMpLCBzeW10YWIgfQotCi0KLSNlbmRpZiAgLyogVVBCX1NUQVRJQ0lOSVRfSF8gKi8KLS8qCi0qKiB1cGI6OkhhbmRsZXJzICh1cGJfaGFuZGxlcnMpCi0qKgotKiogQSB1cGJfaGFuZGxlcnMgaXMgbGlrZSBhIHZpcnR1YWwgdGFibGUgZm9yIGEgdXBiX21zZ2RlZi4gIEVhY2ggZmllbGQgb2YgdGhlCi0qKiBtZXNzYWdlIGNhbiBoYXZlIGFzc29jaWF0ZWQgZnVuY3Rpb25zIHRoYXQgd2lsbCBiZSBjYWxsZWQgd2hlbiB3ZSBhcmUKLSoqIHBhcnNpbmcgb3IgdmlzaXRpbmcgYSBzdHJlYW0gb2YgZGF0YS4gIFRoaXMgaXMgc2ltaWxhciB0byBob3cgaGFuZGxlcnMgd29yawotKiogaW4gU0FYICh0aGUgU2ltcGxlIEFQSSBmb3IgWE1MKS4KLSoqCi0qKiBUaGUgaGFuZGxlcnMgaGF2ZSBubyBpZGVhIHdoZXJlIHRoZSBkYXRhIGlzIGNvbWluZyBmcm9tLCBzbyBhIHNpbmdsZSBzZXQgb2YKLSoqIGhhbmRsZXJzIGNvdWxkIGJlIHVzZWQgd2l0aCB0d28gY29tcGxldGVseSBkaWZmZXJlbnQgZGF0YSBzb3VyY2VzIChmb3IKLSoqIGV4YW1wbGUsIGEgcGFyc2VyIGFuZCBhIHZpc2l0b3Igb3ZlciBpbi1tZW1vcnkgb2JqZWN0cykuICBUaGlzIGRlY291cGxpbmcgaXMKLSoqIHRoZSBtb3N0IGltcG9ydGFudCBmZWF0dXJlIG9mIHVwYiwgYmVjYXVzZSBpdCBhbGxvd3MgcGFyc2VycyBhbmQgc2VyaWFsaXplcnMKLSoqIHRvIGJlIGhpZ2hseSByZXVzYWJsZS4KLSoqCi0qKiBUaGlzIGlzIGEgbWl4ZWQgQy9DKysgaW50ZXJmYWNlIHRoYXQgb2ZmZXJzIGEgZnVsbCBBUEkgdG8gYm90aCBsYW5ndWFnZXMuCi0qKiBTZWUgdGhlIHRvcC1sZXZlbCBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0qLwotCi0jaWZuZGVmIFVQQl9IQU5ETEVSU19ICi0jZGVmaW5lIFVQQl9IQU5ETEVSU19ICi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgdXBiIHsKLWNsYXNzIEJ1ZmZlckhhbmRsZTsKLWNsYXNzIEJ5dGVzSGFuZGxlcjsKLWNsYXNzIEhhbmRsZXJBdHRyaWJ1dGVzOwotY2xhc3MgSGFuZGxlcnM7Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgSGFuZGxlcjsKLXRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgQ2Fub25pY2FsVHlwZTsKLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6QnVmZmVySGFuZGxlLCB1cGJfYnVmaGFuZGxlKQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OkJ5dGVzSGFuZGxlciwgdXBiX2J5dGVzaGFuZGxlcikKLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpIYW5kbGVyQXR0cmlidXRlcywgdXBiX2hhbmRsZXJhdHRyKQotVVBCX0RFQ0xBUkVfREVSSVZFRF9UWVBFKHVwYjo6SGFuZGxlcnMsIHVwYjo6UmVmQ291bnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnMsIHVwYl9yZWZjb3VudGVkKQotCi0vKiBUaGUgbWF4aW11bSBkZXB0aCB0aGF0IHRoZSBoYW5kbGVyIGdyYXBoIGNhbiBoYXZlLiAgVGhpcyBpcyBhIHJlc291cmNlIGxpbWl0Ci0gKiBmb3IgdGhlIEMgc3RhY2sgc2luY2Ugd2Ugc29tZXRpbWVzIG5lZWQgdG8gcmVjdXJzaXZlbHkgdHJhdmVyc2UgdGhlIGdyYXBoLgotICogQ3ljbGVzIGFyZSBvazsgdGhlIHRyYXZlcnNhbCB3aWxsIHN0b3Agd2hlbiBpdCBkZXRlY3RzIGEgY3ljbGUsIGJ1dCB3ZSBtdXN0Ci0gKiBoaXQgdGhlIGN5Y2xlIGJlZm9yZSB0aGUgbWF4aW11bSBkZXB0aCBpcyByZWFjaGVkLgotICoKLSAqIElmIGhhdmluZyBhIHNpbmdsZSBzdGF0aWMgbGltaXQgaXMgdG9vIGluZmxleGlibGUsIHdlIGNhbiBhZGQgYW5vdGhlciB2YXJpYW50Ci0gKiBvZiBIYW5kbGVyczo6RnJlZXplIHRoYXQgYWxsb3dzIHNwZWNpZnlpbmcgdGhpcyBhcyBhIHBhcmFtZXRlci4gKi8KLSNkZWZpbmUgVVBCX01BWF9IQU5ETEVSX0RFUFRIIDY0Ci0KLS8qIEFsbCB0aGUgZGlmZmVyZW50IHR5cGVzIG9mIGhhbmRsZXJzIHRoYXQgY2FuIGJlIHJlZ2lzdGVyZWQuCi0gKiBPbmx5IG5lZWRlZCBmb3IgdGhlIGFkdmFuY2VkIGZ1bmN0aW9ucyBpbiB1cGI6OkhhbmRsZXJzLiAqLwotdHlwZWRlZiBlbnVtIHsKLSAgVVBCX0hBTkRMRVJfSU5UMzIsCi0gIFVQQl9IQU5ETEVSX0lOVDY0LAotICBVUEJfSEFORExFUl9VSU5UMzIsCi0gIFVQQl9IQU5ETEVSX1VJTlQ2NCwKLSAgVVBCX0hBTkRMRVJfRkxPQVQsCi0gIFVQQl9IQU5ETEVSX0RPVUJMRSwKLSAgVVBCX0hBTkRMRVJfQk9PTCwKLSAgVVBCX0hBTkRMRVJfU1RBUlRTVFIsCi0gIFVQQl9IQU5ETEVSX1NUUklORywKLSAgVVBCX0hBTkRMRVJfRU5EU1RSLAotICBVUEJfSEFORExFUl9TVEFSVFNVQk1TRywKLSAgVVBCX0hBTkRMRVJfRU5EU1VCTVNHLAotICBVUEJfSEFORExFUl9TVEFSVFNFUSwKLSAgVVBCX0hBTkRMRVJfRU5EU0VRCi19IHVwYl9oYW5kbGVydHlwZV90OwotCi0jZGVmaW5lIFVQQl9IQU5ETEVSX01BWCAoVVBCX0hBTkRMRVJfRU5EU0VRKzEpCi0KLSNkZWZpbmUgVVBCX0JSRUFLIE5VTEwKLQotLyogQSBjb252ZW5pZW50IGRlZmluaXRpb24gZm9yIHdoZW4gbm8gY2xvc3VyZSBpcyBuZWVkZWQuICovCi1leHRlcm4gY2hhciBfdXBiX25vY2xvc3VyZTsKLSNkZWZpbmUgVVBCX05PX0NMT1NVUkUgJl91cGJfbm9jbG9zdXJlCi0KLS8qIEEgc2VsZWN0b3IgcmVmZXJzIHRvIGEgc3BlY2lmaWMgZmllbGQgaGFuZGxlciBpbiB0aGUgSGFuZGxlcnMgb2JqZWN0Ci0gKiAoZm9yIGV4YW1wbGU6IHRoZSBTVEFSVFNVQk1TRyBoYW5kbGVyIGZvciBmaWVsZCAiZmllbGQxNSIpLiAqLwotdHlwZWRlZiBpbnQzMl90IHVwYl9zZWxlY3Rvcl90OwotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogRm9yd2FyZC1kZWNsYXJlcyBmb3IgQyBpbmxpbmUgYWNjZXNzb3JzLiAgV2UgbmVlZCB0byBkZWNsYXJlIHRoZXNlIGhlcmUKLSAqIHNvIHdlIGNhbiAiZnJpZW5kIiB0aGVtIGluIHRoZSBjbGFzcyBkZWNsYXJhdGlvbnMgaW4gQysrLiAqLwotVVBCX0lOTElORSB1cGJfZnVuYyAqdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NlbGVjdG9yX3Qgcyk7Ci1VUEJfSU5MSU5FIGNvbnN0IHZvaWQgKnVwYl9oYW5kbGVyYXR0cl9oYW5kbGVyZGF0YShjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotVVBCX0lOTElORSBjb25zdCB2b2lkICp1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEoY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NlbGVjdG9yX3Qgcyk7Ci0KLVVQQl9JTkxJTkUgdm9pZCB1cGJfYnVmaGFuZGxlX2luaXQodXBiX2J1ZmhhbmRsZSAqaCk7Ci1VUEJfSU5MSU5FIHZvaWQgdXBiX2J1ZmhhbmRsZV9zZXRvYmoodXBiX2J1ZmhhbmRsZSAqaCwgY29uc3Qgdm9pZCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnR5cGUpOwotVVBCX0lOTElORSB2b2lkIHVwYl9idWZoYW5kbGVfc2V0YnVmKHVwYl9idWZoYW5kbGUgKmgsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2ZzKTsKLVVQQl9JTkxJTkUgY29uc3Qgdm9pZCAqdXBiX2J1ZmhhbmRsZV9vYmooY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCk7Ci1VUEJfSU5MSU5FIGNvbnN0IHZvaWQgKnVwYl9idWZoYW5kbGVfb2JqdHlwZShjb25zdCB1cGJfYnVmaGFuZGxlICpoKTsKLVVQQl9JTkxJTkUgY29uc3QgY2hhciAqdXBiX2J1ZmhhbmRsZV9idWYoY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCk7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotCi0vKiBTdGF0aWMgc2VsZWN0b3JzIGZvciB1cGI6OkhhbmRsZXJzLiAqLwotI2RlZmluZSBVUEJfU1RBUlRNU0dfU0VMRUNUT1IgMAotI2RlZmluZSBVUEJfRU5ETVNHX1NFTEVDVE9SIDEKLSNkZWZpbmUgVVBCX1NUQVRJQ19TRUxFQ1RPUl9DT1VOVCAyCi0KLS8qIFN0YXRpYyBzZWxlY3RvcnMgZm9yIHVwYjo6Qnl0ZXNIYW5kbGVyLiAqLwotI2RlZmluZSBVUEJfU1RBUlRTVFJfU0VMRUNUT1IgMAotI2RlZmluZSBVUEJfU1RSSU5HX1NFTEVDVE9SIDEKLSNkZWZpbmUgVVBCX0VORFNUUl9TRUxFQ1RPUiAyCi0KLXR5cGVkZWYgdm9pZCB1cGJfaGFuZGxlcmZyZWUodm9pZCAqZCk7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBBIHNldCBvZiBhdHRyaWJ1dGVzIHRoYXQgYWNjb21wYW5pZXMgYSBoYW5kbGVyJ3MgZnVuY3Rpb24gcG9pbnRlci4gKi8KLWNsYXNzIHVwYjo6SGFuZGxlckF0dHJpYnV0ZXMgewotIHB1YmxpYzoKLSAgSGFuZGxlckF0dHJpYnV0ZXMoKTsKLSAgfkhhbmRsZXJBdHRyaWJ1dGVzKCk7Ci0KLSAgLyogU2V0cyB0aGUgaGFuZGxlciBkYXRhIHRoYXQgd2lsbCBiZSBwYXNzZWQgYXMgdGhlIHNlY29uZCBwYXJhbWV0ZXIgb2YgdGhlCi0gICAqIGhhbmRsZXIuICBUbyBmcmVlIHRoaXMgcG9pbnRlciB3aGVuIHRoZSBoYW5kbGVycyBhcmUgZnJlZWQsIGNhbGwKLSAgICogSGFuZGxlcnM6OkFkZENsZWFudXAoKS4gKi8KLSAgYm9vbCBTZXRIYW5kbGVyRGF0YShjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpOwotICBjb25zdCB2b2lkKiBoYW5kbGVyX2RhdGEoKSBjb25zdDsKLQotICAvKiBVc2UgdGhpcyB0byBzcGVjaWZ5IHRoZSB0eXBlIG9mIHRoZSBjbG9zdXJlLiAgVGhpcyB3aWxsIGJlIGNoZWNrZWQgYWdhaW5zdAotICAgKiBhbGwgb3RoZXIgY2xvc3VyZSB0eXBlcyBmb3IgaGFuZGxlciB0aGF0IHVzZSB0aGUgc2FtZSBjbG9zdXJlLgotICAgKiBSZWdpc3RyYXRpb24gd2lsbCBmYWlsIGlmIHRoaXMgZG9lcyBub3QgbWF0Y2ggYWxsIG90aGVyIG5vbi1OVUxMIGNsb3N1cmUKLSAgICogdHlwZXMuICovCi0gIGJvb2wgU2V0Q2xvc3VyZVR5cGUoY29uc3Qgdm9pZCAqY2xvc3VyZV90eXBlKTsKLSAgY29uc3Qgdm9pZCogY2xvc3VyZV90eXBlKCkgY29uc3Q7Ci0KLSAgLyogVXNlIHRoaXMgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiB0aGUgcmV0dXJuZWQgY2xvc3VyZS4gIE9ubHkgdXNlZCBmb3IKLSAgICogU3RhcnQqe1N0cmluZyxTdWJNZXNzYWdlLFNlcXVlbmNlfSBoYW5kbGVycy4gIFRoaXMgbXVzdCBtYXRjaCB0aGUgY2xvc3VyZQotICAgKiB0eXBlIG9mIGFueSBoYW5kbGVycyB0aGF0IHVzZSBpdCAoZm9yIGV4YW1wbGUsIHRoZSBTdHJpbmdCdWYgaGFuZGxlciBtdXN0Ci0gICAqIG1hdGNoIHRoZSBjbG9zdXJlIHJldHVybmVkIGZyb20gU3RhcnRTdHJpbmcpLiAqLwotICBib29sIFNldFJldHVybkNsb3N1cmVUeXBlKGNvbnN0IHZvaWQgKnJldHVybl9jbG9zdXJlX3R5cGUpOwotICBjb25zdCB2b2lkKiByZXR1cm5fY2xvc3VyZV90eXBlKCkgY29uc3Q7Ci0KLSAgLyogU2V0IHRvIGluZGljYXRlIHRoYXQgdGhlIGhhbmRsZXIgYWx3YXlzIHJldHVybnMgIm9rIiAoZWl0aGVyICJ0cnVlIiBvciBhCi0gICAqIG5vbi1OVUxMIGNsb3N1cmUpLiAgVGhpcyBpcyBhIGhpbnQgdGhhdCBjYW4gYWxsb3cgY29kZSBnZW5lcmF0b3JzIHRvCi0gICAqIGdlbmVyYXRlIG1vcmUgZWZmaWNpZW50IGNvZGUuICovCi0gIGJvb2wgU2V0QWx3YXlzT2soYm9vbCBhbHdheXNfb2spOwotICBib29sIGFsd2F5c19vaygpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIFVQQl9JTkxJTkUgY29uc3Qgdm9pZCAqIDo6dXBiX2hhbmRsZXJhdHRyX2hhbmRsZXJkYXRhKAotICAgICAgY29uc3QgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLSNlbHNlCi1zdHJ1Y3QgdXBiX2hhbmRsZXJhdHRyIHsKLSNlbmRpZgotICBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGFfOwotICBjb25zdCB2b2lkICpjbG9zdXJlX3R5cGVfOwotICBjb25zdCB2b2lkICpyZXR1cm5fY2xvc3VyZV90eXBlXzsKLSAgYm9vbCBhbHdheXNva187Ci19OwotCi0jZGVmaW5lIFVQQl9IQU5ETEVSQVRUUl9JTklUSUFMSVpFUiB7TlVMTCwgTlVMTCwgTlVMTCwgZmFsc2V9Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdXBiX2Z1bmMgKmZ1bmM7Ci0KLSAgLyogSXQgaXMgd2FzdGVmdWwgdG8gaW5jbHVkZSB0aGUgZW50aXJlIGF0dHJpYnV0ZXMgaGVyZToKLSAgICoKLSAgICogKiBTb21lIG9mIHRoZSBpbmZvcm1hdGlvbiBpcyByZWR1bmRhbnQgKGxpa2Ugc3RvcmluZyB0aGUgY2xvc3VyZSB0eXBlCi0gICAqICAgc2VwYXJhdGVseSBmb3IgZWFjaCBoYW5kbGVyIHRoYXQgbXVzdCBtYXRjaCkuCi0gICAqICogU29tZSBvZiB0aGUgaW5mbyBpcyBvbmx5IG5lZWRlZCBwcmlvciB0byBmcmVlemUoKSAobGlrZSBjbG9zdXJlIHR5cGVzKS4KLSAgICogKiBhbGlnbm1lbnQgcGFkZGluZyB3YXN0ZXMgYSBsb3Qgb2Ygc3BhY2UgZm9yIGFsd2F5c29rXy4KLSAgICoKLSAgICogSWYvd2hlbiB0aGUgc2l6ZSBhbmQgbG9jYWxpdHkgb2YgaGFuZGxlcnMgaXMgYW4gaXNzdWUsIHdlIGNhbiBvcHRpbWl6ZSB0aGlzCi0gICAqIG5vdCB0byBzdG9yZSB0aGUgZW50aXJlIGF0dHIgbGlrZSB0aGlzLiAgV2UgZG8gbm90IGV4cG9zZSB0aGUgdGFibGUncwotICAgKiBsYXlvdXQgdG8gYWxsb3cgdGhpcyBvcHRpbWl6YXRpb24gaW4gdGhlIGZ1dHVyZS4gKi8KLSAgdXBiX2hhbmRsZXJhdHRyIGF0dHI7Ci19IHVwYl9oYW5kbGVyc190YWJlbnQ7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBFeHRyYSBpbmZvcm1hdGlvbiBhYm91dCBhIGJ1ZmZlciB0aGF0IGlzIHBhc3NlZCB0byBhIFN0cmluZ0J1ZiBoYW5kbGVyLgotICogVE9ETyhoYWJlcm1hbik6IGFsbG93IHRoZSBoYW5kbGUgdG8gYmUgcGlubmVkIHNvIHRoYXQgaXQgd2lsbCBvdXRsaXZlCi0gKiB0aGUgaGFuZGxlciBpbnZvY2F0aW9uLiAqLwotY2xhc3MgdXBiOjpCdWZmZXJIYW5kbGUgewotIHB1YmxpYzoKLSAgQnVmZmVySGFuZGxlKCk7Ci0gIH5CdWZmZXJIYW5kbGUoKTsKLQotICAvKiBUaGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIuICBUaGlzIG1heSBiZSBkaWZmZXJlbnQgdGhhbiB0aGUgcG9pbnRlcgotICAgKiBwYXNzZWQgdG8gYSBTdHJpbmdCdWYgaGFuZGxlciBiZWNhdXNlIHRoZSBoYW5kbGVyIG1heSByZWNlaXZlIGRhdGEKLSAgICogdGhhdCBpcyBmcm9tIHRoZSBtaWRkbGUgb3IgZW5kIG9mIGEgbGFyZ2VyIGJ1ZmZlci4gKi8KLSAgY29uc3QgY2hhciogYnVmZmVyKCkgY29uc3Q7Ci0KLSAgLyogVGhlIG9mZnNldCB3aXRoaW4gdGhlIGF0dGFjaGVkIG9iamVjdCB3aGVyZSB0aGlzIGJ1ZmZlciBiZWdpbnMuICBPbmx5Ci0gICAqIG1lYW5pbmdmdWwgaWYgdGhlcmUgaXMgYW4gYXR0YWNoZWQgb2JqZWN0LiAqLwotICBzaXplX3Qgb2JqZWN0X29mZnNldCgpIGNvbnN0OwotCi0gIC8qIE5vdGUgdGhhdCBvYmplY3Rfb2Zmc2V0IGlzIHRoZSBvZmZzZXQgb2YgImJ1ZiIgd2l0aGluIHRoZSBhdHRhY2hlZAotICAgKiBvYmplY3QuICovCi0gIHZvaWQgU2V0QnVmZmVyKGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IG9iamVjdF9vZmZzZXQpOwotCi0gIC8qIFRoZSBCdWZmZXJIYW5kbGUgY2FuIGhhdmUgYW4gImF0dGFjaGVkIG9iamVjdCIsIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0gICAqIHR1bm5lbCB0aHJvdWdoIGEgcG9pbnRlciB0byB0aGUgYnVmZmVyJ3MgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIHZvaWQgU2V0QXR0YWNoZWRPYmplY3QoY29uc3QgVCogb2JqKTsKLQotICAvKiBSZXR1cm5zIE5VTEwgaWYgdGhlIGF0dGFjaGVkIG9iamVjdCBpcyBub3Qgb2YgdGhpcyB0eXBlLiAqLwotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgY29uc3QgVCogR2V0QXR0YWNoZWRPYmplY3QoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIHZvaWQgOjp1cGJfYnVmaGFuZGxlX2luaXQodXBiX2J1ZmhhbmRsZSAqaCk7Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIHZvaWQgOjp1cGJfYnVmaGFuZGxlX3NldG9iaih1cGJfYnVmaGFuZGxlICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdHlwZSk7Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIHZvaWQgOjp1cGJfYnVmaGFuZGxlX3NldGJ1Zih1cGJfYnVmaGFuZGxlICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgb2ZzKTsKLSAgZnJpZW5kIFVQQl9JTkxJTkUgY29uc3Qgdm9pZCogOjp1cGJfYnVmaGFuZGxlX29iaihjb25zdCB1cGJfYnVmaGFuZGxlICpoKTsKLSAgZnJpZW5kIFVQQl9JTkxJTkUgY29uc3Qgdm9pZCogOjp1cGJfYnVmaGFuZGxlX29ianR5cGUoCi0gICAgICBjb25zdCB1cGJfYnVmaGFuZGxlICpoKTsKLSAgZnJpZW5kIFVQQl9JTkxJTkUgY29uc3QgY2hhciogOjp1cGJfYnVmaGFuZGxlX2J1Zihjb25zdCB1cGJfYnVmaGFuZGxlICpoKTsKLSNlbHNlCi1zdHJ1Y3QgdXBiX2J1ZmhhbmRsZSB7Ci0jZW5kaWYKLSAgY29uc3QgY2hhciAqYnVmXzsKLSAgY29uc3Qgdm9pZCAqb2JqXzsKLSAgY29uc3Qgdm9pZCAqb2JqdHlwZV87Ci0gIHNpemVfdCBvYmpvZnNfOwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIEEgdXBiOjpIYW5kbGVycyBvYmplY3QgcmVwcmVzZW50cyB0aGUgc2V0IG9mIGhhbmRsZXJzIGFzc29jaWF0ZWQgd2l0aCBhCi0gKiBtZXNzYWdlIGluIHRoZSBncmFwaCBvZiBtZXNzYWdlcy4gIFlvdSBjYW4gdGhpbmsgb2YgaXQgYXMgYSBiaWcgdmlydHVhbAotICogdGFibGUgd2l0aCBmdW5jdGlvbnMgY29ycmVzcG9uZGluZyB0byBhbGwgdGhlIGV2ZW50cyB0aGF0IGNhbiBmaXJlIHdoaWxlCi0gKiBwYXJzaW5nIG9yIHZpc2l0aW5nIGEgbWVzc2FnZSBvZiBhIHNwZWNpZmljIHR5cGUuCi0gKgotICogQW55IGhhbmRsZXJzIHRoYXQgYXJlIG5vdCBzZXQgYmVoYXZlIGFzIGlmIHRoZXkgaGFkIHN1Y2Nlc3NmdWxseSBjb25zdW1lZAotICogdGhlIHZhbHVlLiAgQW55IHVuc2V0IFN0YXJ0KiBoYW5kbGVycyB3aWxsIHByb3BhZ2F0ZSB0aGVpciBjbG9zdXJlIHRvIHRoZQotICogaW5uZXIgZnJhbWUuCi0gKgotICogVGhlIGVhc2llc3Qgd2F5IHRvIGNyZWF0ZSB0aGUgKkhhbmRsZXIgb2JqZWN0cyBuZWVkZWQgYnkgdGhlIFNldCogbWV0aG9kcyBpcwotICogd2l0aCB0aGUgVXBiQmluZCgpIGFuZCBVcGJNYWtlSGFuZGxlcigpIG1hY3Jvczsgc2VlIGJlbG93LiAqLwotY2xhc3MgdXBiOjpIYW5kbGVycyB7Ci0gcHVibGljOgotICB0eXBlZGVmIHVwYl9zZWxlY3Rvcl90IFNlbGVjdG9yOwotICB0eXBlZGVmIHVwYl9oYW5kbGVydHlwZV90IFR5cGU7Ci0KLSAgdHlwZWRlZiBIYW5kbGVyPHZvaWQgKigqKSh2b2lkICosIGNvbnN0IHZvaWQgKik+IFN0YXJ0RmllbGRIYW5kbGVyOwotICB0eXBlZGVmIEhhbmRsZXI8Ym9vbCAoKikodm9pZCAqLCBjb25zdCB2b2lkICopPiBFbmRGaWVsZEhhbmRsZXI7Ci0gIHR5cGVkZWYgSGFuZGxlcjxib29sICgqKSh2b2lkICosIGNvbnN0IHZvaWQgKik+IFN0YXJ0TWVzc2FnZUhhbmRsZXI7Ci0gIHR5cGVkZWYgSGFuZGxlcjxib29sICgqKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgU3RhdHVzKik+IEVuZE1lc3NhZ2VIYW5kbGVyOwotICB0eXBlZGVmIEhhbmRsZXI8dm9pZCAqKCopKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBzaXplX3QpPiBTdGFydFN0cmluZ0hhbmRsZXI7Ci0gIHR5cGVkZWYgSGFuZGxlcjxzaXplX3QgKCopKHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBjb25zdCBjaGFyICosIHNpemVfdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVySGFuZGxlICopPiBTdHJpbmdIYW5kbGVyOwotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgVmFsdWVIYW5kbGVyIHsKLSAgICB0eXBlZGVmIEhhbmRsZXI8Ym9vbCgqKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgVCk+IEg7Ci0gIH07Ci0KLSAgdHlwZWRlZiBWYWx1ZUhhbmRsZXI8aW50MzJfdD46OkggICAgIEludDMySGFuZGxlcjsKLSAgdHlwZWRlZiBWYWx1ZUhhbmRsZXI8aW50NjRfdD46OkggICAgIEludDY0SGFuZGxlcjsKLSAgdHlwZWRlZiBWYWx1ZUhhbmRsZXI8dWludDMyX3Q+OjpIICAgIFVJbnQzMkhhbmRsZXI7Ci0gIHR5cGVkZWYgVmFsdWVIYW5kbGVyPHVpbnQ2NF90Pjo6SCAgICBVSW50NjRIYW5kbGVyOwotICB0eXBlZGVmIFZhbHVlSGFuZGxlcjxmbG9hdD46OkggICAgICAgRmxvYXRIYW5kbGVyOwotICB0eXBlZGVmIFZhbHVlSGFuZGxlcjxkb3VibGU+OjpIICAgICAgRG91YmxlSGFuZGxlcjsKLSAgdHlwZWRlZiBWYWx1ZUhhbmRsZXI8Ym9vbD46OkggICAgICAgIEJvb2xIYW5kbGVyOwotCi0gIC8qIEFueSBmdW5jdGlvbiBwb2ludGVyIGNhbiBiZSBjb252ZXJ0ZWQgdG8gdGhpcyBhbmQgY29udmVydGVkIGJhY2sgdG8gaXRzCi0gICAqIGNvcnJlY3QgdHlwZS4gKi8KLSAgdHlwZWRlZiB2b2lkIEdlbmVyaWNGdW5jdGlvbigpOwotCi0gIHR5cGVkZWYgdm9pZCBIYW5kbGVyc0NhbGxiYWNrKGNvbnN0IHZvaWQgKmNsb3N1cmUsIHVwYl9oYW5kbGVycyAqaCk7Ci0KLSAgLyogUmV0dXJucyBhIG5ldyBoYW5kbGVycyBvYmplY3QgZm9yIHRoZSBnaXZlbiBmcm96ZW4gbXNnZGVmLgotICAgKiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxIYW5kbGVycz4gTmV3KGNvbnN0IE1lc3NhZ2VEZWYgKm0pOwotCi0gIC8qIENvbnZlbmllbmNlIGZ1bmN0aW9uIGZvciByZWdpc3RlcmluZyBhIGdyYXBoIG9mIGhhbmRsZXJzIHRoYXQgbWlycm9ycyB0aGUKLSAgICogZ3JhcGggb2YgbXNnZGVmcyBmb3Igc29tZSBtZXNzYWdlLiAgRm9yICJtIiBhbmQgYWxsIGl0cyBjaGlsZHJlbiBhIG5ldyBzZXQKLSAgICogb2YgaGFuZGxlcnMgd2lsbCBiZSBjcmVhdGVkIGFuZCB0aGUgZ2l2ZW4gY2FsbGJhY2sgd2lsbCBiZSBpbnZva2VkLAotICAgKiBhbGxvd2luZyB0aGUgY2xpZW50IHRvIHJlZ2lzdGVyIGhhbmRsZXJzIGZvciB0aGlzIG1lc3NhZ2UuICBOb3RlIHRoYXQgYW55Ci0gICAqIHN1YmhhbmRsZXJzIHNldCBieSB0aGUgY2FsbGJhY2sgd2lsbCBiZSBvdmVyd3JpdHRlbi4gKi8KLSAgc3RhdGljIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+IE5ld0Zyb3plbihjb25zdCBNZXNzYWdlRGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhhbmRsZXJzQ2FsbGJhY2sgKmNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNsb3N1cmUpOwotCi0gIC8qIEZ1bmN0aW9uYWxpdHkgZnJvbSB1cGI6OlJlZkNvdW50ZWQuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBBbGwgaGFuZGxlciByZWdpc3RyYXRpb24gZnVuY3Rpb25zIHJldHVybiBib29sIHRvIGluZGljYXRlIHN1Y2Nlc3Mgb3IKLSAgICogZmFpbHVyZTsgZGV0YWlscyBhYm91dCBmYWlsdXJlcyBhcmUgc3RvcmVkIGluIHRoaXMgc3RhdHVzIG9iamVjdC4gIElmIGEKLSAgICogZmFpbHVyZSBkb2VzIG9jY3VyLCBpdCBtdXN0IGJlIGNsZWFyZWQgYmVmb3JlIHRoZSBIYW5kbGVycyBhcmUgZnJvemVuLAotICAgKiBvdGhlcndpc2UgdGhlIGZyZWV6ZSgpIG9wZXJhdGlvbiB3aWxsIGZhaWwuICBUaGUgZnVuY3Rpb25zIG1heSAqb25seSogYmUKLSAgICogdXNlZCB3aGlsZSB0aGUgSGFuZGxlcnMgYXJlIG11dGFibGUuICovCi0gIGNvbnN0IFN0YXR1cyogc3RhdHVzKCk7Ci0gIHZvaWQgQ2xlYXJFcnJvcigpOwotCi0gIC8qIENhbGwgdG8gZnJlZXplIHRoZXNlIEhhbmRsZXJzLiAgUmVxdWlyZXMgdGhhdCBhbnkgU3ViSGFuZGxlcnMgYXJlIGFscmVhZHkKLSAgICogZnJvemVuLiAgRm9yIGN5Y2xlcywgeW91IG11c3QgdXNlIHRoZSBzdGF0aWMgdmVyc2lvbiBiZWxvdyBhbmQgZnJlZXplIHRoZQotICAgKiB3aG9sZSBncmFwaCBhdCBvbmNlLiAqLwotICBib29sIEZyZWV6ZShTdGF0dXMqIHMpOwotCi0gIC8qIEZyZWV6ZXMgdGhlIGdpdmVuIHNldCBvZiBoYW5kbGVycy4gIFlvdSBtYXkgbm90IGZyZWV6ZSBhIGhhbmRsZXIgd2l0aG91dAotICAgKiBhbHNvIGZyZWV6aW5nIGFueSBoYW5kbGVycyB0aGV5IHBvaW50IHRvLiAqLwotICBzdGF0aWMgYm9vbCBGcmVlemUoSGFuZGxlcnMqY29uc3QqIGhhbmRsZXJzLCBpbnQgbiwgU3RhdHVzKiBzKTsKLSAgc3RhdGljIGJvb2wgRnJlZXplKGNvbnN0IHN0ZDo6dmVjdG9yPEhhbmRsZXJzKj4mIGhhbmRsZXJzLCBTdGF0dXMqIHMpOwotCi0gIC8qIFJldHVybnMgdGhlIG1zZ2RlZiBhc3NvY2lhdGVkIHdpdGggdGhpcyBoYW5kbGVycyBvYmplY3QuICovCi0gIGNvbnN0IE1lc3NhZ2VEZWYqIG1lc3NhZ2VfZGVmKCkgY29uc3Q7Ci0KLSAgLyogQWRkcyB0aGUgZ2l2ZW4gcG9pbnRlciBhbmQgZnVuY3Rpb24gdG8gdGhlIGxpc3Qgb2YgY2xlYW51cCBmdW5jdGlvbnMgdGhhdAotICAgKiB3aWxsIGJlIHJ1biB3aGVuIHRoZXNlIGhhbmRsZXJzIGFyZSBmcmVlZC4gIElmIHRoaXMgcG9pbnRlciBoYXMgcHJldmlvdXNseQotICAgKiBiZWVuIHJlZ2lzdGVyZWQsIHRoZSBmdW5jdGlvbiByZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdGhpbmcuICovCi0gIGJvb2wgQWRkQ2xlYW51cCh2b2lkICpwdHIsIHVwYl9oYW5kbGVyZnJlZSAqY2xlYW51cCk7Ci0KLSAgLyogU2V0cyB0aGUgc3RhcnRtc2cgaGFuZGxlciBmb3IgdGhlIG1lc3NhZ2UsIHdoaWNoIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLSAgICoKLSAgICogICBib29sIHN0YXJ0bXNnKE15VHlwZSogY2xvc3VyZSkgewotICAgKiAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIG1lc3NhZ2UgYmVnaW5zLiAgUmV0dXJucyB0cnVlIGlmIHByb2Nlc3Npbmcgc2hvdWxkCi0gICAqICAgICAvLyBjb250aW51ZS4KLSAgICogICAgIHJldHVybiB0cnVlOwotICAgKiAgIH0KLSAgICovCi0gIGJvb2wgU2V0U3RhcnRNZXNzYWdlSGFuZGxlcihjb25zdCBTdGFydE1lc3NhZ2VIYW5kbGVyJiBoYW5kbGVyKTsKLQotICAvKiBTZXRzIHRoZSBlbmRtc2cgaGFuZGxlciBmb3IgdGhlIG1lc3NhZ2UsIHdoaWNoIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLSAgICoKLSAgICogICBib29sIGVuZG1zZyhNeVR5cGUqIGNsb3N1cmUsIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICAgKiAgICAgLy8gQ2FsbGVkIHdoZW4gcHJvY2Vzc2luZyBvZiB0aGlzIG1lc3NhZ2UgZW5kcywgd2hldGhlciBpbiBzdWNjZXNzIG9yCi0gICAqICAgICAvLyBmYWlsdXJlLiAgInN0YXR1cyIgaW5kaWNhdGVzIHRoZSBmaW5hbCBzdGF0dXMgb2YgcHJvY2Vzc2luZywgYW5kCi0gICAqICAgICAvLyBjYW4gYWxzbyBiZSBtb2RpZmllZCBpbi1wbGFjZSB0byB1cGRhdGUgdGhlIGZpbmFsIHN0YXR1cy4KLSAgICogICB9Ci0gICAqLwotICBib29sIFNldEVuZE1lc3NhZ2VIYW5kbGVyKGNvbnN0IEVuZE1lc3NhZ2VIYW5kbGVyJiBoYW5kbGVyKTsKLQotICAvKiBTZXRzIHRoZSB2YWx1ZSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQsIHdoaWNoIGlzIGRlZmluZWQgYXMgZm9sbG93cwotICAgKiAodGhpcyBpcyBmb3IgYW4gaW50MzIgZmllbGQ7IG90aGVyIGZpZWxkIHR5cGVzIHdpbGwgcGFzcyB0aGVpciBuYXRpdmUKLSAgICogQy9DKysgdHlwZSBmb3IgInZhbCIpOgotICAgKgotICAgKiAgIGJvb2wgT25WYWx1ZShNeUNsb3N1cmUqIGMsIGNvbnN0IE15SGFuZGxlckRhdGEqIGQsIGludDMyX3QgdmFsKSB7Ci0gICAqICAgICAvLyBDYWxsZWQgd2hlbiB0aGUgZmllbGQncyB2YWx1ZSBpcyBlbmNvdW50ZXJlZC4gICJkIiBjb250YWlucwotICAgKiAgICAgLy8gd2hhdGV2ZXIgZGF0YSB3YXMgYm91bmQgdG8gdGhpcyBmaWVsZCB3aGVuIGl0IHdhcyByZWdpc3RlcmVkLgotICAgKiAgICAgLy8gUmV0dXJucyB0cnVlIGlmIHByb2Nlc3Npbmcgc2hvdWxkIGNvbnRpbnVlLgotICAgKiAgICAgcmV0dXJuIHRydWU7Ci0gICAqICAgfQotICAgKgotICAgKiAgIGhhbmRlcnMtPlNldEludDMySGFuZGxlcihmLCBVcGJCaW5kKE9uVmFsdWUsIG5ldyBNeUhhbmRsZXJEYXRhKC4uLikpKTsKLSAgICoKLSAgICogVGhlIHZhbHVlIHR5cGUgbXVzdCBleGFjdGx5IG1hdGNoIGYtPnR5cGUoKS4KLSAgICogRm9yIGV4YW1wbGUsIGEgaGFuZGxlciB0aGF0IHRha2VzIGFuIGludDMyX3QgcGFyYW1ldGVyIG1heSBvbmx5IGJlIHVzZWQgZm9yCi0gICAqIGZpZWxkcyBvZiB0eXBlIFVQQl9UWVBFX0lOVDMyIGFuZCBVUEJfVFlQRV9FTlVNLgotICAgKgotICAgKiBSZXR1cm5zIGZhbHNlIGlmIHRoZSBoYW5kbGVyIGZhaWxlZCB0byByZWdpc3RlcjsgaW4gdGhpcyBjYXNlIHRoZSBjbGVhbnVwCi0gICAqIGhhbmRsZXIgKGlmIGFueSkgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkuCi0gICAqLwotICBib29sIFNldEludDMySGFuZGxlciAoY29uc3QgRmllbGREZWYqIGYsICBjb25zdCBJbnQzMkhhbmRsZXImIGgpOwotICBib29sIFNldEludDY0SGFuZGxlciAoY29uc3QgRmllbGREZWYqIGYsICBjb25zdCBJbnQ2NEhhbmRsZXImIGgpOwotICBib29sIFNldFVJbnQzMkhhbmRsZXIoY29uc3QgRmllbGREZWYqIGYsIGNvbnN0IFVJbnQzMkhhbmRsZXImIGgpOwotICBib29sIFNldFVJbnQ2NEhhbmRsZXIoY29uc3QgRmllbGREZWYqIGYsIGNvbnN0IFVJbnQ2NEhhbmRsZXImIGgpOwotICBib29sIFNldEZsb2F0SGFuZGxlciAoY29uc3QgRmllbGREZWYqIGYsICBjb25zdCBGbG9hdEhhbmRsZXImIGgpOwotICBib29sIFNldERvdWJsZUhhbmRsZXIoY29uc3QgRmllbGREZWYqIGYsIGNvbnN0IERvdWJsZUhhbmRsZXImIGgpOwotICBib29sIFNldEJvb2xIYW5kbGVyICAoY29uc3QgRmllbGREZWYqIGYsICAgY29uc3QgQm9vbEhhbmRsZXImIGgpOwotCi0gIC8qIExpa2UgdGhlIHByZXZpb3VzLCBidXQgdGVtcGxhdGVkIG9uIHRoZSB0eXBlIG9uIHRoZSB2YWx1ZSAoaWUuIGludDMyKS4KLSAgICogVGhpcyBpcyBtb3N0bHkgdXNlZnVsIHRvIGNhbGwgZnJvbSBvdGhlciB0ZW1wbGF0ZXMuICBUbyBjYWxsIHRoaXMgeW91IG11c3QKLSAgICogc3BlY2lmeSB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyIGV4cGxpY2l0bHksIGllOgotICAgKiAgIGgtPlNldFZhbHVlSGFuZGxlcjxUPihmLCBVcGJCaW5kKE15SGFuZGxlcjxUPiwgTXlEYXRhKSk7ICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBib29sIFNldFZhbHVlSGFuZGxlcigKLSAgICAgIGNvbnN0IEZpZWxkRGVmICpmLAotICAgICAgY29uc3QgdHlwZW5hbWUgVmFsdWVIYW5kbGVyPHR5cGVuYW1lIENhbm9uaWNhbFR5cGU8VD46OlR5cGU+OjpIJiBoYW5kbGVyKTsKLQotICAvKiBTZXRzIGhhbmRsZXJzIGZvciBhIHN0cmluZyBmaWVsZCwgd2hpY2ggYXJlIGRlZmluZWQgYXMgZm9sbG93czoKLSAgICoKLSAgICogICBNeVN1YkNsb3N1cmUqIHN0YXJ0c3RyKE15Q2xvc3VyZSogYywgY29uc3QgTXlIYW5kbGVyRGF0YSogZCwKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX2hpbnQpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyaW5nIHZhbHVlIGJlZ2lucy4gIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHRoZQotICAgKiAgICAgLy8gY2xvc3VyZSBmb3IgdGhlIHN0cmluZy4gICJzaXplX2hpbnQiIGluZGljYXRlcyB0aGUgc2l6ZSBvZiB0aGUKLSAgICogICAgIC8vIHN0cmluZyBpZiBpdCBpcyBrbm93biwgaG93ZXZlciBpZiB0aGUgc3RyaW5nIGlzIGxlbmd0aC1kZWxpbWl0ZWQKLSAgICogICAgIC8vIGFuZCB0aGUgZW5kLW9mLXN0cmluZyBpcyBub3QgYXZhaWxhYmxlIHNpemVfaGludCB3aWxsIGJlIHplcm8uCi0gICAqICAgICAvLyBUaGlzIGNhc2UgaXMgaW5kaXN0aW5ndWlzaGFibGUgZnJvbSB0aGUgY2FzZSB3aGVyZSB0aGUgc2l6ZSBpcwotICAgKiAgICAgLy8ga25vd24gdG8gYmUgemVyby4KLSAgICogICAgIC8vCi0gICAqICAgICAvLyBUT0RPKGhhYmVybWFuKTogaXMgaXQgaW1wb3J0YW50IHRvIGRpc3Rpbmd1aXNoIHRoZXNlIGNhc2VzPwotICAgKiAgICAgLy8gSWYgd2UgaGFkIHNzaXplX3QgYXMgYSB0eXBlIHdlIGNvdWxkIG1ha2UgLTEgInVua25vd24iLCBidXQKLSAgICogICAgIC8vIHNzaXplX3QgaXMgUE9TSVggKG5vdCBBTlNJKSBhbmQgdGhlcmVmb3JlIGxlc3MgcG9ydGFibGUuCi0gICAqICAgICAvLyBJbiBwcmFjdGljZSBJIHN1c3BlY3QgaXQgd29uJ3QgYmUgaW1wb3J0YW50IHRvIGRpc3Rpbmd1aXNoLgotICAgKiAgICAgcmV0dXJuIGNsb3N1cmU7Ci0gICAqICAgfQotICAgKgotICAgKiAgIHNpemVfdCBzdHIoTXlDbG9zdXJlKiBjbG9zdXJlLCBjb25zdCBNeUhhbmRsZXJEYXRhKiBkLAotICAgKiAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKSB7Ci0gICAqICAgICAvLyBDYWxsZWQgZm9yIGVhY2ggYnVmZmVyIG9mIHN0cmluZyBkYXRhOyB0aGUgbXVsdGlwbGUgcGh5c2ljYWwgYnVmZmVycwotICAgKiAgICAgLy8gYXJlIGFsbCBwYXJ0IG9mIHRoZSBzYW1lIGxvZ2ljYWwgc3RyaW5nLiAgVGhlIHJldHVybiB2YWx1ZSBpbmRpY2F0ZXMKLSAgICogICAgIC8vIGhvdyBtYW55IGJ5dGVzIHdlcmUgY29uc3VtZWQuICBJZiB0aGlzIG51bWJlciBpcyBsZXNzIHRoYW4gImxlbiIsCi0gICAqICAgICAvLyB0aGlzIHdpbGwgYWxzbyBpbmRpY2F0ZSB0aGF0IHByb2Nlc3Npbmcgc2hvdWxkIGJlIGhhbHRlZCBmb3Igbm93LAotICAgKiAgICAgLy8gbGlrZSByZXR1cm5pbmcgZmFsc2Ugb3IgVVBCX0JSRUFLIGZyb20gYW55IG90aGVyIGNhbGxiYWNrLiAgSWYKLSAgICogICAgIC8vIG51bWJlciBpcyBncmVhdGVyIHRoYW4gImxlbiIsIHRoZSBleGNlc3MgYnl0ZXMgd2lsbCBiZSBza2lwcGVkIG92ZXIKLSAgICogICAgIC8vIGFuZCBub3QgcGFzc2VkIHRvIHRoZSBjYWxsYmFjay4KLSAgICogICAgIHJldHVybiBsZW47Ci0gICAqICAgfQotICAgKgotICAgKiAgIGJvb2wgZW5kc3RyKE15Q2xvc3VyZSogYywgY29uc3QgTXlIYW5kbGVyRGF0YSogZCkgewotICAgKiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdHJpbmcgdmFsdWUgZW5kcy4gIFJldHVybiB2YWx1ZSBpbmRpY2F0ZXMgd2hldGhlcgotICAgKiAgICAgLy8gcHJvY2Vzc2luZyBzaG91bGQgY29udGludWUuCi0gICAqICAgICByZXR1cm4gdHJ1ZTsKLSAgICogICB9Ci0gICAqLwotICBib29sIFNldFN0YXJ0U3RyaW5nSGFuZGxlcihjb25zdCBGaWVsZERlZiogZiwgY29uc3QgU3RhcnRTdHJpbmdIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXRTdHJpbmdIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBTdHJpbmdIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXRFbmRTdHJpbmdIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBFbmRGaWVsZEhhbmRsZXImIGgpOwotCi0gIC8qIFNldHMgdGhlIHN0YXJ0c2VxIGhhbmRsZXIsIHdoaWNoIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLSAgICoKLSAgICogICBNeVN1YkNsb3N1cmUgKnN0YXJ0c2VxKE15Q2xvc3VyZSogYywgY29uc3QgTXlIYW5kbGVyRGF0YSogZCkgewotICAgKiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzZXF1ZW5jZSAocmVwZWF0ZWQgZmllbGQpIGJlZ2lucy4gIFRoZSByZXR1cm5lZAotICAgKiAgICAgLy8gcG9pbnRlciBpbmRpY2F0ZXMgdGhlIGNsb3N1cmUgZm9yIHRoZSBzZXF1ZW5jZSAob3IgVVBCX0JSRUFLCi0gICAqICAgICAvLyB0byBpbnRlcnJ1cHQgcHJvY2Vzc2luZykuCi0gICAqICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICogICB9Ci0gICAqCi0gICAqICAgaC0+U2V0U3RhcnRTZXF1ZW5jZUhhbmRsZXIoZiwgVXBiQmluZChzdGFydHNlcSwgbmV3IE15SGFuZGxlckRhdGEoLi4uKSkpOwotICAgKgotICAgKiBSZXR1cm5zICJmYWxzZSIgaWYgImYiIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIG1lc3NhZ2Ugb3IgaXMgbm90IGEKLSAgICogcmVwZWF0ZWQgZmllbGQuCi0gICAqLwotICBib29sIFNldFN0YXJ0U2VxdWVuY2VIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBTdGFydEZpZWxkSGFuZGxlciYgaCk7Ci0KLSAgLyogU2V0cyB0aGUgc3RhcnRzdWJtc2cgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGZpZWxkLCB3aGljaCBpcyBkZWZpbmVkIGFzCi0gICAqIGZvbGxvd3M6Ci0gICAqCi0gICAqICAgTXlTdWJDbG9zdXJlKiBzdGFydHN1Ym1zZyhNeUNsb3N1cmUqIGMsIGNvbnN0IE15SGFuZGxlckRhdGEqIGQpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIGEgc3VibWVzc2FnZSBiZWdpbnMuICBUaGUgcmV0dXJuZWQgcG9pbnRlciBpbmRpY2F0ZXMgdGhlCi0gICAqICAgICAvLyBjbG9zdXJlIGZvciB0aGUgc2VxdWVuY2UgKG9yIFVQQl9CUkVBSyB0byBpbnRlcnJ1cHQgcHJvY2Vzc2luZykuCi0gICAqICAgICByZXR1cm4gY2xvc3VyZTsKLSAgICogICB9Ci0gICAqCi0gICAqICAgaC0+U2V0U3RhcnRTdWJNZXNzYWdlSGFuZGxlcihmLCBVcGJCaW5kKHN0YXJ0c3VibXNnLAotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXcgTXlIYW5kbGVyRGF0YSguLi4pKSk7Ci0gICAqCi0gICAqIFJldHVybnMgImZhbHNlIiBpZiAiZiIgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgbWVzc2FnZSBvciBpcyBub3QgYQotICAgKiBzdWJtZXNzYWdlL2dyb3VwIGZpZWxkLgotICAgKi8KLSAgYm9vbCBTZXRTdGFydFN1Yk1lc3NhZ2VIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBTdGFydEZpZWxkSGFuZGxlciYgaCk7Ci0KLSAgLyogU2V0cyB0aGUgZW5kc3VibXNnIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCwgd2hpY2ggaXMgZGVmaW5lZCBhcwotICAgKiBmb2xsb3dzOgotICAgKgotICAgKiAgIGJvb2wgZW5kc3VibXNnKE15Q2xvc3VyZSogYywgY29uc3QgTXlIYW5kbGVyRGF0YSogZCkgewotICAgKiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzdWJtZXNzYWdlIGVuZHMuICBSZXR1cm5zIHRydWUgdG8gY29udGludWUgcHJvY2Vzc2luZy4KLSAgICogICAgIHJldHVybiB0cnVlOwotICAgKiAgIH0KLSAgICoKLSAgICogUmV0dXJucyAiZmFsc2UiIGlmICJmIiBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBtZXNzYWdlIG9yIGlzIG5vdCBhCi0gICAqIHN1Ym1lc3NhZ2UvZ3JvdXAgZmllbGQuCi0gICAqLwotICBib29sIFNldEVuZFN1Yk1lc3NhZ2VIYW5kbGVyKGNvbnN0IEZpZWxkRGVmICpmLCBjb25zdCBFbmRGaWVsZEhhbmRsZXIgJmgpOwotCi0gIC8qIFN0YXJ0cyB0aGUgZW5kc3Vic2VxIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCwgd2hpY2ggaXMgZGVmaW5lZCBhcwotICAgKiBmb2xsb3dzOgotICAgKgotICAgKiAgIGJvb2wgZW5kc2VxKE15Q2xvc3VyZSogYywgY29uc3QgTXlIYW5kbGVyRGF0YSogZCkgewotICAgKiAgICAgLy8gQ2FsbGVkIHdoZW4gYSBzZXF1ZW5jZSBlbmRzLiAgUmV0dXJucyB0cnVlIGNvbnRpbnVlIHByb2Nlc3NpbmcuCi0gICAqICAgICByZXR1cm4gdHJ1ZTsKLSAgICogICB9Ci0gICAqCi0gICAqIFJldHVybnMgImZhbHNlIiBpZiAiZiIgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgbWVzc2FnZSBvciBpcyBub3QgYQotICAgKiByZXBlYXRlZCBmaWVsZC4KLSAgICovCi0gIGJvb2wgU2V0RW5kU2VxdWVuY2VIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBFbmRGaWVsZEhhbmRsZXImIGgpOwotCi0gIC8qIFNldHMgb3IgZ2V0cyB0aGUgb2JqZWN0IHRoYXQgc3BlY2lmaWVzIGhhbmRsZXJzIGZvciB0aGUgZ2l2ZW4gZmllbGQsIHdoaWNoCi0gICAqIG11c3QgYmUgYSBzdWJtZXNzYWdlIG9yIGdyb3VwLiAgUmV0dXJucyBOVUxMIGlmIG5vIGhhbmRsZXJzIGFyZSBzZXQuICovCi0gIGJvb2wgU2V0U3ViSGFuZGxlcnMoY29uc3QgRmllbGREZWYqIGYsIGNvbnN0IEhhbmRsZXJzKiBzdWIpOwotICBjb25zdCBIYW5kbGVycyogR2V0U3ViSGFuZGxlcnMoY29uc3QgRmllbGREZWYqIGYpIGNvbnN0OwotCi0gIC8qIEVxdWl2YWxlbnQgdG8gR2V0U3ViSGFuZGxlcnMsIGJ1dCB0YWtlcyB0aGUgU1RBUlRTVUJNU0cgc2VsZWN0b3IgZm9yIHRoZQotICAgKiBmaWVsZC4gKi8KLSAgY29uc3QgSGFuZGxlcnMqIEdldFN1YkhhbmRsZXJzKFNlbGVjdG9yIHN0YXJ0c3VibXNnKSBjb25zdDsKLQotICAvKiBBIHNlbGVjdG9yIHJlZmVycyB0byBhIHNwZWNpZmljIGZpZWxkIGhhbmRsZXIgaW4gdGhlIEhhbmRsZXJzIG9iamVjdAotICAgKiAoZm9yIGV4YW1wbGU6IHRoZSBTVEFSVFNVQk1TRyBoYW5kbGVyIGZvciBmaWVsZCAiZmllbGQxNSIpLgotICAgKiBPbiBzdWNjZXNzLCByZXR1cm5zIHRydWUgYW5kIHN0b3JlcyB0aGUgc2VsZWN0b3IgaW4gInMiLgotICAgKiBJZiB0aGUgRmllbGREZWYgb3IgVHlwZSBhcmUgaW52YWxpZCwgcmV0dXJucyBmYWxzZS4KLSAgICogVGhlIHJldHVybmVkIHNlbGVjdG9yIGlzIE9OTFkgdmFsaWQgZm9yIEhhbmRsZXJzIHdob3NlIE1lc3NhZ2VEZWYKLSAgICogY29udGFpbnMgdGhpcyBGaWVsZERlZi4gKi8KLSAgc3RhdGljIGJvb2wgR2V0U2VsZWN0b3IoY29uc3QgRmllbGREZWYqIGYsIFR5cGUgdHlwZSwgU2VsZWN0b3IqIHMpOwotCi0gIC8qIEdpdmVuIGEgU1RBUlQgc2VsZWN0b3Igb2YgYW55IGtpbmQsIHJldHVybnMgdGhlIGNvcnJlc3BvbmRpbmcgRU5EIHNlbGVjdG9yLiAqLwotICBzdGF0aWMgU2VsZWN0b3IgR2V0RW5kU2VsZWN0b3IoU2VsZWN0b3Igc3RhcnRfc2VsZWN0b3IpOwotCi0gIC8qIFJldHVybnMgdGhlIGZ1bmN0aW9uIHBvaW50ZXIgZm9yIHRoaXMgaGFuZGxlci4gIEl0IGlzIHRoZSBjbGllbnQncwotICAgKiByZXNwb25zaWJpbGl0eSB0byBjYXN0IHRvIHRoZSBjb3JyZWN0IGZ1bmN0aW9uIHR5cGUgYmVmb3JlIGNhbGxpbmcgaXQuICovCi0gIEdlbmVyaWNGdW5jdGlvbiogR2V0SGFuZGxlcihTZWxlY3RvciBzZWxlY3Rvcik7Ci0KLSAgLyogU2V0cyB0aGUgZ2l2ZW4gYXR0cmlidXRlcyB0byB0aGUgYXR0cmlidXRlcyBmb3IgdGhpcyBzZWxlY3Rvci4gKi8KLSAgYm9vbCBHZXRBdHRyaWJ1dGVzKFNlbGVjdG9yIHNlbGVjdG9yLCBIYW5kbGVyQXR0cmlidXRlcyogYXR0cik7Ci0KLSAgLyogUmV0dXJucyB0aGUgaGFuZGxlciBkYXRhIHRoYXQgd2FzIHJlZ2lzdGVyZWQgd2l0aCB0aGlzIGhhbmRsZXIuICovCi0gIGNvbnN0IHZvaWQqIEdldEhhbmRsZXJEYXRhKFNlbGVjdG9yIHNlbGVjdG9yKTsKLQotICAvKiBDb3VsZCBhZGQgYW55IG9mIHRoZSBmb2xsb3dpbmcgZnVuY3Rpb25zIGFzLW5lZWRlZCwgd2l0aCBzb21lIG1pbm9yCi0gICAqIGltcGxlbWVudGF0aW9uIGNoYW5nZXM6Ci0gICAqCi0gICAqIGNvbnN0IEZpZWxkRGVmKiBHZXRGaWVsZERlZihTZWxlY3RvciBzZWxlY3Rvcik7Ci0gICAqIHN0YXRpYyBib29sIElzU2VxdWVuY2UoU2VsZWN0b3Igc2VsZWN0b3IpOyAqLwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoSGFuZGxlcnMsIHVwYjo6SGFuZGxlcnMpCi0KLSAgZnJpZW5kIFVQQl9JTkxJTkUgR2VuZXJpY0Z1bmN0aW9uICo6OnVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKAotICAgICAgY29uc3QgdXBiX2hhbmRsZXJzICpoLCB1cGJfc2VsZWN0b3JfdCBzKTsKLSAgZnJpZW5kIFVQQl9JTkxJTkUgY29uc3Qgdm9pZCAqOjp1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEoCi0gICAgICBjb25zdCB1cGJfaGFuZGxlcnMgKmgsIHVwYl9zZWxlY3Rvcl90IHMpOwotI2Vsc2UKLXN0cnVjdCB1cGJfaGFuZGxlcnMgewotI2VuZGlmCi0gIHVwYl9yZWZjb3VudGVkIGJhc2U7Ci0KLSAgY29uc3QgdXBiX21zZ2RlZiAqbXNnOwotICBjb25zdCB1cGJfaGFuZGxlcnMgKipzdWI7Ci0gIGNvbnN0IHZvaWQgKnRvcF9jbG9zdXJlX3R5cGU7Ci0gIHVwYl9pbnR0YWJsZSBjbGVhbnVwXzsKLSAgdXBiX3N0YXR1cyBzdGF0dXNfOyAgLyogVXNlZCBvbmx5IHdoZW4gbXV0YWJsZS4gKi8KLSAgdXBiX2hhbmRsZXJzX3RhYmVudCB0YWJsZVsxXTsgIC8qIER5bmFtaWNhbGx5LXNpemVkIGZpZWxkIGhhbmRsZXIgYXJyYXkuICovCi19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYiB7Ci0KLS8qIENvbnZlbmllbmNlIG1hY3JvcyBmb3IgY3JlYXRpbmcgYSBIYW5kbGVyIG9iamVjdCB0aGF0IGlzIHdyYXBwZWQgd2l0aCBhCi0gKiB0eXBlLXNhZmUgd3JhcHBlciBmdW5jdGlvbiB0aGF0IGNvbnZlcnRzIHRoZSAidm9pZCoiIHBhcmFtZXRlcnMvcmV0dXJucwotICogb2YgdGhlIHVuZGVybHlpbmcgQyBBUEkgaW50byBuaWNlIEMrKyBmdW5jdGlvbi4KLSAqCi0gKiBTYW1wbGUgdXNhZ2U6Ci0gKiAgIHZvaWQgT25WYWx1ZTEoTXlDbG9zdXJlKiBjLCBjb25zdCBNeUhhbmRsZXJEYXRhKiBkLCBpbnQzMl90IHZhbCkgewotICogICAgIC8vIGRvIHN0dWZmIC4uLgotICogICB9Ci0gKgotICogICAvLyBIYW5kbGVyIHRoYXQgZG9lc24ndCBuZWVkIGFueSBkYXRhIGJvdW5kIHRvIGl0LgotICogICB2b2lkIE9uVmFsdWUyKE15Q2xvc3VyZSogYywgaW50MzJfdCB2YWwpIHsKLSAqICAgICAvLyBkbyBzdHVmZiAuLi4KLSAqICAgfQotICoKLSAqICAgLy8gSGFuZGxlciB0aGF0IHJldHVybnMgYm9vbCBzbyBpdCBjYW4gcmV0dXJuIGZhaWx1cmUgaWYgbmVjZXNzYXJ5LgotICogICBib29sIE9uVmFsdWUzKE15Q2xvc3VyZSogYywgaW50MzJfdCB2YWwpIHsKLSAqICAgICAvLyBkbyBzdHVmZiAuLi4KLSAqICAgICByZXR1cm4gb2s7Ci0gKiAgIH0KLSAqCi0gKiAgIC8vIE1lbWJlciBmdW5jdGlvbiBoYW5kbGVyLgotICogICBjbGFzcyBNeUNsb3N1cmUgewotICogICAgcHVibGljOgotICogICAgIHZvaWQgT25WYWx1ZShpbnQzMl90IHZhbCkgewotICogICAgICAgLy8gZG8gc3R1ZmYgLi4uCi0gKiAgICAgfQotICogICB9OwotICoKLSAqICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBNeUhhbmRsZXJEYXRhLgotICogICBoYW5kbGVycy0+U2V0SW50MzJIYW5kbGVyKGYxLCBVcGJCaW5kKE9uVmFsdWUxLCBuZXcgTXlIYW5kbGVyRGF0YSguLi4pKSk7Ci0gKiAgIGhhbmRsZXJzLT5TZXRJbnQzMkhhbmRsZXIoZjIsIFVwYk1ha2VIYW5kbGVyKE9uVmFsdWUyKSk7Ci0gKiAgIGhhbmRsZXJzLT5TZXRJbnQzMkhhbmRsZXIoZjEsIFVwYk1ha2VIYW5kbGVyKE9uVmFsdWUzKSk7Ci0gKiAgIGhhbmRsZXJzLT5TZXRJbnQzMkhhbmRsZXIoZjIsIFVwYk1ha2VIYW5kbGVyKCZNeUNsb3N1cmU6Ok9uVmFsdWUpKTsKLSAqLwotCi0jaWZkZWYgVVBCX0NYWDExCi0KLS8qIEluIEMrKzExLCB0aGUgInRlbXBsYXRlIiBkaXNhbWJpZ3VhdG9yIGNhbiBhcHBlYXIgZXZlbiBvdXRzaWRlIHRlbXBsYXRlcywKLSAqIHNvIGFsbCBjYWxscyBjYW4gc2FmZWx5IHVzZSB0aGlzIHBhaXIgb2YgbWFjcm9zLiAqLwotCi0jZGVmaW5lIFVwYk1ha2VIYW5kbGVyKGYpIHVwYjo6TWF0Y2hGdW5jKGYpLnRlbXBsYXRlIEdldEZ1bmM8Zj4oKQotCi0vKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gb25seSBldmFsdWF0ZSAiZCIgb25jZS4gKi8KLSNkZWZpbmUgVXBiQmluZChmLCBkKSB1cGI6Ok1hdGNoRnVuYyhmKS50ZW1wbGF0ZSBHZXRGdW5jPGY+KChkKSkKLQotI2Vsc2UKLQotLyogUHJpb3IgdG8gQysrMTEsIHRoZSAidGVtcGxhdGUiIGRpc2FtYmlndWF0b3IgbWF5IG9ubHkgYXBwZWFyIGluc2lkZSBhCi0gKiB0ZW1wbGF0ZSwgc28gdGhlIHJlZ3VsYXIgbWFjcm8gbXVzdCBub3QgdXNlICJ0ZW1wbGF0ZSIgKi8KLQotI2RlZmluZSBVcGJNYWtlSGFuZGxlcihmKSB1cGI6Ok1hdGNoRnVuYyhmKS5HZXRGdW5jPGY+KCkKLQotI2RlZmluZSBVcGJCaW5kKGYsIGQpIHVwYjo6TWF0Y2hGdW5jKGYpLkdldEZ1bmM8Zj4oKGQpKQotCi0jZW5kaWYgIC8qIFVQQl9DWFgxMSAqLwotCi0vKiBUaGlzIG1hY3JvIG11c3QgYmUgdXNlZCBpbiBDKys5OCBmb3IgY2FsbHMgZnJvbSBpbnNpZGUgYSB0ZW1wbGF0ZS4gIEJ1dCB3ZQotICogZGVmaW5lIHRoaXMgdmFyaWFudCBpbiBhbGwgY2FzZXM7IGNvZGUgdGhhdCB3YW50cyB0byBiZSBjb21wYXRpYmxlIHdpdGggYm90aAotICogQysrOTggYW5kIEMrKzExIHNob3VsZCBhbHdheXMgdXNlIHRoaXMgbWFjcm8gd2hlbiBjYWxsaW5nIGZyb20gYSB0ZW1wbGF0ZS4gKi8KLSNkZWZpbmUgVXBiTWFrZUhhbmRsZXJUKGYpIHVwYjo6TWF0Y2hGdW5jKGYpLnRlbXBsYXRlIEdldEZ1bmM8Zj4oKQotCi0vKiBXZSBoYXZlIHRvIGJlIGNhcmVmdWwgdG8gb25seSBldmFsdWF0ZSAiZCIgb25jZS4gKi8KLSNkZWZpbmUgVXBiQmluZFQoZiwgZCkgdXBiOjpNYXRjaEZ1bmMoZikudGVtcGxhdGUgR2V0RnVuYzxmPigoZCkpCi0KLS8qIEhhbmRsZXI6IGEgc3RydWN0IHRoYXQgY29udGFpbnMgdGhlIChoYW5kbGVyLCBkYXRhLCBkZWxldGVyKSB0dXBsZSB0aGF0IGlzCi0gKiB1c2VkIHRvIHJlZ2lzdGVyIGFsbCBoYW5kbGVycy4gIFVzZXJzIGNhbiBNYWtlKCkgdGhlc2UgZGlyZWN0bHkgYnV0IGl0J3MKLSAqIG1vcmUgY29udmVuaWVudCB0byB1c2UgdGhlIFVwYk1ha2VIYW5kbGVyL1VwYkJpbmQgbWFjcm9zIGFib3ZlLiAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEhhbmRsZXIgewotIHB1YmxpYzoKLSAgLyogVGhlIHVuZGVybHlpbmcsIGhhbmRsZXIgZnVuY3Rpb24gc2lnbmF0dXJlIHRoYXQgdXBiIHVzZXMgaW50ZXJuYWxseS4gKi8KLSAgdHlwZWRlZiBUIEZ1bmNQdHI7Ci0KLSAgLyogSW50ZW50aW9uYWxseSBpbXBsaWNpdC4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIEY+IEhhbmRsZXIoRiBmdW5jKTsKLSAgfkhhbmRsZXIoKTsKLQotIHByaXZhdGU6Ci0gIHZvaWQgQWRkQ2xlYW51cChIYW5kbGVycyogaCkgY29uc3QgewotICAgIGlmIChjbGVhbnVwX2Z1bmNfKSB7Ci0gICAgICBib29sIG9rID0gaC0+QWRkQ2xlYW51cChjbGVhbnVwX2RhdGFfLCBjbGVhbnVwX2Z1bmNfKTsKLSAgICAgIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gICAgfQotICB9Ci0KLSAgVVBCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihIYW5kbGVyKQotICBmcmllbmQgY2xhc3MgSGFuZGxlcnM7Ci0gIEZ1bmNQdHIgaGFuZGxlcl87Ci0gIG11dGFibGUgSGFuZGxlckF0dHJpYnV0ZXMgYXR0cl87Ci0gIG11dGFibGUgYm9vbCByZWdpc3RlcmVkXzsKLSAgdm9pZCAqY2xlYW51cF9kYXRhXzsKLSAgdXBiX2hhbmRsZXJmcmVlICpjbGVhbnVwX2Z1bmNfOwotfTsKLQotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBOYXRpdmUgQyBBUEkuICovCi0KLS8qIEhhbmRsZXIgZnVuY3Rpb24gdHlwZWRlZnMuICovCi10eXBlZGVmIGJvb2wgdXBiX3N0YXJ0bXNnX2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQqKTsKLXR5cGVkZWYgYm9vbCB1cGJfZW5kbXNnX2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKiwgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLXR5cGVkZWYgdm9pZCogdXBiX3N0YXJ0ZmllbGRfaGFuZGxlcmZ1bmModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQpOwotdHlwZWRlZiBib29sIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCk7Ci10eXBlZGVmIGJvb2wgdXBiX2ludDMyX2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCBpbnQzMl90IHZhbCk7Ci10eXBlZGVmIGJvb2wgdXBiX2ludDY0X2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCBpbnQ2NF90IHZhbCk7Ci10eXBlZGVmIGJvb2wgdXBiX3VpbnQzMl9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgdWludDMyX3QgdmFsKTsKLXR5cGVkZWYgYm9vbCB1cGJfdWludDY0X2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCB1aW50NjRfdCB2YWwpOwotdHlwZWRlZiBib29sIHVwYl9mbG9hdF9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgZmxvYXQgdmFsKTsKLXR5cGVkZWYgYm9vbCB1cGJfZG91YmxlX2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCBkb3VibGUgdmFsKTsKLXR5cGVkZWYgYm9vbCB1cGJfYm9vbF9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgYm9vbCB2YWwpOwotdHlwZWRlZiB2b2lkICp1cGJfc3RhcnRzdHJfaGFuZGxlcmZ1bmModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KTsKLXR5cGVkZWYgc2l6ZV90IHVwYl9zdHJpbmdfaGFuZGxlcmZ1bmModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIGNvbnN0IHVwYl9idWZoYW5kbGUqIGhhbmRsZSk7Ci0KLS8qIHVwYl9idWZoYW5kbGUgKi8KLXNpemVfdCB1cGJfYnVmaGFuZGxlX29iam9mcyhjb25zdCB1cGJfYnVmaGFuZGxlICpoKTsKLQotLyogdXBiX2hhbmRsZXJhdHRyICovCi12b2lkIHVwYl9oYW5kbGVyYXR0cl9pbml0KHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci12b2lkIHVwYl9oYW5kbGVyYXR0cl91bmluaXQodXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLQotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0aGFuZGxlcmRhdGEodXBiX2hhbmRsZXJhdHRyICphdHRyLCBjb25zdCB2b2lkICpoZCk7Ci1ib29sIHVwYl9oYW5kbGVyYXR0cl9zZXRjbG9zdXJldHlwZSh1cGJfaGFuZGxlcmF0dHIgKmF0dHIsIGNvbnN0IHZvaWQgKnR5cGUpOwotY29uc3Qgdm9pZCAqdXBiX2hhbmRsZXJhdHRyX2Nsb3N1cmV0eXBlKGNvbnN0IHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyYXR0cl9zZXRyZXR1cm5jbG9zdXJldHlwZSh1cGJfaGFuZGxlcmF0dHIgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0eXBlKTsKLWNvbnN0IHZvaWQgKnVwYl9oYW5kbGVyYXR0cl9yZXR1cm5jbG9zdXJldHlwZShjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0YWx3YXlzb2sodXBiX2hhbmRsZXJhdHRyICphdHRyLCBib29sIGFsd2F5c29rKTsKLWJvb2wgdXBiX2hhbmRsZXJhdHRyX2Fsd2F5c29rKGNvbnN0IHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci0KLVVQQl9JTkxJTkUgY29uc3Qgdm9pZCAqdXBiX2hhbmRsZXJhdHRyX2hhbmRsZXJkYXRhKAotICAgIGNvbnN0IHVwYl9oYW5kbGVyYXR0ciAqYXR0cikgewotICByZXR1cm4gYXR0ci0+aGFuZGxlcl9kYXRhXzsKLX0KLQotLyogdXBiX2hhbmRsZXJzICovCi10eXBlZGVmIHZvaWQgdXBiX2hhbmRsZXJzX2NhbGxiYWNrKGNvbnN0IHZvaWQgKmNsb3N1cmUsIHVwYl9oYW5kbGVycyAqaCk7Ci11cGJfaGFuZGxlcnMgKnVwYl9oYW5kbGVyc19uZXcoY29uc3QgdXBiX21zZ2RlZiAqbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9oYW5kbGVyc19uZXdmcm96ZW4oY29uc3QgdXBiX21zZ2RlZiAqbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnNfY2FsbGJhY2sgKmNhbGxiYWNrLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmNsb3N1cmUpOwotCi0vKiBJbmNsdWRlIHJlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9oYW5kbGVyc19yZWYoKS4gKi8KLVVQQl9SRUZDT1VOVEVEX0NNRVRIT0RTKHVwYl9oYW5kbGVycywgdXBiX2hhbmRsZXJzX3VwY2FzdCkKLQotY29uc3QgdXBiX3N0YXR1cyAqdXBiX2hhbmRsZXJzX3N0YXR1cyh1cGJfaGFuZGxlcnMgKmgpOwotdm9pZCB1cGJfaGFuZGxlcnNfY2xlYXJlcnIodXBiX2hhbmRsZXJzICpoKTsKLWNvbnN0IHVwYl9tc2dkZWYgKnVwYl9oYW5kbGVyc19tc2dkZWYoY29uc3QgdXBiX2hhbmRsZXJzICpoKTsKLWJvb2wgdXBiX2hhbmRsZXJzX2FkZGNsZWFudXAodXBiX2hhbmRsZXJzICpoLCB2b2lkICpwLCB1cGJfaGFuZGxlcmZyZWUgKmhmcmVlKTsKLQotYm9vbCB1cGJfaGFuZGxlcnNfc2V0c3RhcnRtc2codXBiX2hhbmRsZXJzICpoLCB1cGJfc3RhcnRtc2dfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0ZW5kbXNnKHVwYl9oYW5kbGVycyAqaCwgdXBiX2VuZG1zZ19oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0aW50MzIodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaW50MzJfaGFuZGxlcmZ1bmMgKmZ1bmMsIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXRpbnQ2NCh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9pbnQ2NF9oYW5kbGVyZnVuYyAqZnVuYywgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldHVpbnQzMih1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfdWludDMyX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXR1aW50NjQodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3VpbnQ2NF9oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0ZmxvYXQodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmxvYXRfaGFuZGxlcmZ1bmMgKmZ1bmMsIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXRkb3VibGUodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2RvdWJsZV9oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0Ym9vbCh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2Jvb2xfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXRzdGFydHN0cih1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGFydHN0cl9oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0cmluZ19oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0ZW5kc3RyKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzZXEodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhcnRmaWVsZF9oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGFydGZpZWxkX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldGVuZHN1Ym1zZyh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldGVuZHNlcSh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLQotYm9vbCB1cGJfaGFuZGxlcnNfc2V0c3ViaGFuZGxlcnModXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfaGFuZGxlcnMgKnN1Yik7Ci1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVycyhjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnNfc2VsKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2VsZWN0b3JfdCBzZWwpOwotCi1VUEJfSU5MSU5FIHVwYl9mdW5jICp1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2VsZWN0b3JfdCBzKSB7Ci0gIHJldHVybiAodXBiX2Z1bmMgKiloLT50YWJsZVtzXS5mdW5jOwotfQotCi1ib29sIHVwYl9oYW5kbGVyc19nZXRhdHRyKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwgdXBiX3NlbGVjdG9yX3QgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLQotVVBCX0lOTElORSBjb25zdCB2b2lkICp1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEoY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NlbGVjdG9yX3QgcykgewotICByZXR1cm4gdXBiX2hhbmRsZXJhdHRyX2hhbmRsZXJkYXRhKCZoLT50YWJsZVtzXS5hdHRyKTsKLX0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIEhhbmRsZXIgdHlwZXMgZm9yIHNpbmdsZSBmaWVsZHMuCi0gKiBSaWdodCBub3cgd2Ugb25seSBoYXZlIG9uZSBmb3IgVFlQRV9CWVRFUyBidXQgb25lcyBmb3Igb3RoZXIgdHlwZXMKLSAqIHNob3VsZCBmb2xsb3cuCi0gKgotICogVGhlc2UgZm9sbG93IHRoZSBzYW1lIGhhbmRsZXJzIHByb3RvY29sIGZvciBmaWVsZHMgb2YgYSBtZXNzYWdlLiAqLwotY2xhc3MgdXBiOjpCeXRlc0hhbmRsZXIgewotIHB1YmxpYzoKLSAgQnl0ZXNIYW5kbGVyKCk7Ci0gIH5CeXRlc0hhbmRsZXIoKTsKLSNlbHNlCi1zdHJ1Y3QgdXBiX2J5dGVzaGFuZGxlciB7Ci0jZW5kaWYKLSAgdXBiX2hhbmRsZXJzX3RhYmVudCB0YWJsZVszXTsKLX07Ci0KLXZvaWQgdXBiX2J5dGVzaGFuZGxlcl9pbml0KHVwYl9ieXRlc2hhbmRsZXIgKmgpOwotCi0vKiBDYWxsZXIgbXVzdCBlbnN1cmUgdGhhdCAiZCIgb3V0bGl2ZXMgdGhlIGhhbmRsZXJzLgotICogVE9ETyhoYWJlcm1hbik6IHNob3VsZCB0aGlzIGhhdmUgYSAiZnJlZXplIiBvcGVyYXRpb24/ICBJdCdzIG5vdCBuZWNlc3NhcnkKLSAqIGZvciBtZW1vcnkgbWFuYWdlbWVudCwgYnV0IGNvdWxkIGJlIHVzZWZ1bCB0byBmb3JjZSBpbW11dGFiaWxpdHkgYW5kIHByb3ZpZGUKLSAqIGEgY29udmVuaWVudCBtb21lbnQgdG8gdmVyaWZ5IHRoYXQgYWxsIHJlZ2lzdHJhdGlvbiBzdWNjZWVkZWQuICovCi1ib29sIHVwYl9ieXRlc2hhbmRsZXJfc2V0c3RhcnRzdHIodXBiX2J5dGVzaGFuZGxlciAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhcnRzdHJfaGFuZGxlcmZ1bmMgKmZ1bmMsIHZvaWQgKmQpOwotYm9vbCB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0cmluZyh1cGJfYnl0ZXNoYW5kbGVyICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RyaW5nX2hhbmRsZXJmdW5jICpmdW5jLCB2b2lkICpkKTsKLWJvb2wgdXBiX2J5dGVzaGFuZGxlcl9zZXRlbmRzdHIodXBiX2J5dGVzaGFuZGxlciAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jICpmdW5jLCB2b2lkICpkKTsKLQotLyogIlN0YXRpYyIgbWV0aG9kcyAqLwotYm9vbCB1cGJfaGFuZGxlcnNfZnJlZXplKHVwYl9oYW5kbGVycyAqY29uc3QgKmhhbmRsZXJzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcyk7Ci11cGJfaGFuZGxlcnR5cGVfdCB1cGJfaGFuZGxlcnNfZ2V0cHJpbWl0aXZlaGFuZGxlcnR5cGUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2hhbmRsZXJzX2dldHNlbGVjdG9yKGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgdXBiX2hhbmRsZXJ0eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zZWxlY3Rvcl90ICpzKTsKLVVQQl9JTkxJTkUgdXBiX3NlbGVjdG9yX3QgdXBiX2hhbmRsZXJzX2dldGVuZHNlbGVjdG9yKHVwYl9zZWxlY3Rvcl90IHN0YXJ0KSB7Ci0gIHJldHVybiBzdGFydCArIDE7Ci19Ci0KLS8qIEludGVybmFsLW9ubHkuICovCi11aW50MzJfdCB1cGJfaGFuZGxlcnNfc2VsZWN0b3JiYXNlb2Zmc2V0KGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci11aW50MzJfdCB1cGJfaGFuZGxlcnNfc2VsZWN0b3Jjb3VudChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLS8qCi0qKiBJbmxpbmUgZGVmaW5pdGlvbnMgZm9yIGhhbmRsZXJzLmgsIHdoaWNoIGFyZSBwYXJ0aWN1bGFybHkgbG9uZyBhbmQgYSBiaXQKLSoqIHRyaWNreS4KLSovCi0KLSNpZm5kZWYgVVBCX0hBTkRMRVJTX0lOTF9IXwotI2RlZmluZSBVUEJfSEFORExFUlNfSU5MX0hfCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotLyogQyBpbmxpbmUgbWV0aG9kcy4gKi8KLQotLyogdXBiX2J1ZmhhbmRsZSAqLwotVVBCX0lOTElORSB2b2lkIHVwYl9idWZoYW5kbGVfaW5pdCh1cGJfYnVmaGFuZGxlICpoKSB7Ci0gIGgtPm9ial8gPSBOVUxMOwotICBoLT5vYmp0eXBlXyA9IE5VTEw7Ci0gIGgtPmJ1Zl8gPSBOVUxMOwotICBoLT5vYmpvZnNfID0gMDsKLX0KLVVQQl9JTkxJTkUgdm9pZCB1cGJfYnVmaGFuZGxlX3VuaW5pdCh1cGJfYnVmaGFuZGxlICpoKSB7Ci0gIFVQQl9VTlVTRUQoaCk7Ci19Ci1VUEJfSU5MSU5FIHZvaWQgdXBiX2J1ZmhhbmRsZV9zZXRvYmoodXBiX2J1ZmhhbmRsZSAqaCwgY29uc3Qgdm9pZCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnR5cGUpIHsKLSAgaC0+b2JqXyA9IG9iajsKLSAgaC0+b2JqdHlwZV8gPSB0eXBlOwotfQotVVBCX0lOTElORSB2b2lkIHVwYl9idWZoYW5kbGVfc2V0YnVmKHVwYl9idWZoYW5kbGUgKmgsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgb2ZzKSB7Ci0gIGgtPmJ1Zl8gPSBidWY7Ci0gIGgtPm9iam9mc18gPSBvZnM7Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHZvaWQgKnVwYl9idWZoYW5kbGVfb2JqKGNvbnN0IHVwYl9idWZoYW5kbGUgKmgpIHsKLSAgcmV0dXJuIGgtPm9ial87Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHZvaWQgKnVwYl9idWZoYW5kbGVfb2JqdHlwZShjb25zdCB1cGJfYnVmaGFuZGxlICpoKSB7Ci0gIHJldHVybiBoLT5vYmp0eXBlXzsKLX0KLVVQQl9JTkxJTkUgY29uc3QgY2hhciAqdXBiX2J1ZmhhbmRsZV9idWYoY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCkgewotICByZXR1cm4gaC0+YnVmXzsKLX0KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogVHlwZSBkZXRlY3Rpb24gYW5kIHR5cGVkZWZzIGZvciBpbnRlZ2VyIHR5cGVzLgotICogRm9yIHBsYXRmb3JtcyB3aGVyZSB0aGVyZSBhcmUgbXVsdGlwbGUgMzItYml0IG9yIDY0LWJpdCB0eXBlcywgd2UgbmVlZCB0byBiZQotICogYWJsZSB0byBlbnVtZXJhdGUgdGhlbSBzbyB3ZSBjYW4gcHJvcGVybHkgY3JlYXRlIG92ZXJsb2FkcyBmb3IgYWxsIHZhcmlhbnRzLgotICoKLSAqIElmIGFueSBwbGF0Zm9ybSBleGlzdGVkIHdoZXJlIHRoZXJlIHdlcmUgdGhyZWUgaW50ZWdlciB0eXBlcyB3aXRoIHRoZSBzYW1lCi0gKiBzaXplLCB0aGlzIHdvdWxkIGhhdmUgdG8gYmVjb21lIG1vcmUgY29tcGxpY2F0ZWQuICBGb3IgZXhhbXBsZSwgc2hvcnQsIGludCwKLSAqIGFuZCBsb25nIGNvdWxkIGFsbCBiZSAzMi1iaXRzLiAgRXZlbiBtb3JlIGRpYWJvbGljYWxseSwgc2hvcnQsIGludCwgbG9uZywKLSAqIGFuZCBsb25nIGxvbmcgY291bGQgYWxsIGJlIDY0IGJpdHMgYW5kIHN0aWxsIGJlIHN0YW5kYXJkLWNvbXBsaWFudC4KLSAqIEhvd2V2ZXIsIGZldyBwbGF0Zm9ybXMgYXJlIHRoaXMgc3RyYW5nZSwgYW5kIGl0J3MgdW5saWtlbHkgdGhhdCB1cGIgd2lsbCBiZQotICogdXNlZCBvbiB0aGUgc3RyYW5nZXN0IG9uZXMuICovCi0KLS8qIENhbid0IGNvdW50IG9uIHN0ZGludC5oIGxpbWl0cyBsaWtlIElOVDMyX01BWCwgYmVjYXVzZSBpbiBDKysgdGhlc2UgYXJlCi0gKiBvbmx5IGRlZmluZWQgd2hlbiBfX1NURENfTElNSVRfTUFDUk9TIGFyZSBkZWZpbmVkIGJlZm9yZSB0aGUgKmZpcnN0KiBpbmNsdWRlCi0gKiBvZiBzdGRpbnQuaC4gIFdlIGNhbid0IGd1YXJhbnRlZSB0aGF0IHNvbWVvbmUgZWxzZSBkaWRuJ3QgaW5jbHVkZSB0aGVzZSBmaXJzdAotICogd2l0aG91dCBkZWZpbmluZyBfX1NURENfTElNSVRfTUFDUk9TLiAqLwotI2RlZmluZSBVUEJfSU5UMzJfTUFYIDB4N2ZmZmZmZmZMTAotI2RlZmluZSBVUEJfSU5UMzJfTUlOICgtVVBCX0lOVDMyX01BWCAtIDEpCi0jZGVmaW5lIFVQQl9JTlQ2NF9NQVggMHg3ZmZmZmZmZmZmZmZmZmZmTEwKLSNkZWZpbmUgVVBCX0lOVDY0X01JTiAoLVVQQl9JTlQ2NF9NQVggLSAxKQotCi0jaWYgSU5UX01BWCA9PSBVUEJfSU5UMzJfTUFYICYmIElOVF9NSU4gPT0gVVBCX0lOVDMyX01JTgotI2RlZmluZSBVUEJfSU5UX0lTXzMyQklUUyAxCi0jZW5kaWYKLQotI2lmIExPTkdfTUFYID09IFVQQl9JTlQzMl9NQVggJiYgTE9OR19NSU4gPT0gVVBCX0lOVDMyX01JTgotI2RlZmluZSBVUEJfTE9OR19JU18zMkJJVFMgMQotI2VuZGlmCi0KLSNpZiBMT05HX01BWCA9PSBVUEJfSU5UNjRfTUFYICYmIExPTkdfTUlOID09IFVQQl9JTlQ2NF9NSU4KLSNkZWZpbmUgVVBCX0xPTkdfSVNfNjRCSVRTIDEKLSNlbmRpZgotCi0jaWYgTExPTkdfTUFYID09IFVQQl9JTlQ2NF9NQVggJiYgTExPTkdfTUlOID09IFVQQl9JTlQ2NF9NSU4KLSNkZWZpbmUgVVBCX0xMT05HX0lTXzY0QklUUyAxCi0jZW5kaWYKLQotLyogV2UgdXNlIG1hY3JvcyBpbnN0ZWFkIG9mIHR5cGVkZWZzIHNvIHdlIGNhbiB1bmRlZmluZSB0aGVtIGxhdGVyIGFuZCBhdm9pZAotICogbGVha2luZyB0aGVtIG91dHNpZGUgdGhpcyBoZWFkZXIgZmlsZS4gKi8KLSNpZiBVUEJfSU5UX0lTXzMyQklUUwotI2RlZmluZSBVUEJfSU5UMzJfVCBpbnQKLSNkZWZpbmUgVVBCX1VJTlQzMl9UIHVuc2lnbmVkIGludAotCi0jaWYgVVBCX0xPTkdfSVNfMzJCSVRTCi0jZGVmaW5lIFVQQl9UV09fMzJCSVRfVFlQRVMgMQotI2RlZmluZSBVUEJfSU5UMzJBTFRfVCBsb25nCi0jZGVmaW5lIFVQQl9VSU5UMzJBTFRfVCB1bnNpZ25lZCBsb25nCi0jZW5kaWYgIC8qIFVQQl9MT05HX0lTXzMyQklUUyAqLwotCi0jZWxpZiBVUEJfTE9OR19JU18zMkJJVFMgIC8qICYmICFVUEJfSU5UX0lTXzMyQklUUyAqLwotI2RlZmluZSBVUEJfSU5UMzJfVCBsb25nCi0jZGVmaW5lIFVQQl9VSU5UMzJfVCB1bnNpZ25lZCBsb25nCi0jZW5kaWYgIC8qIFVQQl9JTlRfSVNfMzJCSVRTICovCi0KLQotI2lmIFVQQl9MT05HX0lTXzY0QklUUwotI2RlZmluZSBVUEJfSU5UNjRfVCBsb25nCi0jZGVmaW5lIFVQQl9VSU5UNjRfVCB1bnNpZ25lZCBsb25nCi0KLSNpZiBVUEJfTExPTkdfSVNfNjRCSVRTCi0jZGVmaW5lIFVQQl9UV09fNjRCSVRfVFlQRVMgMQotI2RlZmluZSBVUEJfSU5UNjRBTFRfVCBsb25nIGxvbmcKLSNkZWZpbmUgVVBCX1VJTlQ2NEFMVF9UIHVuc2lnbmVkIGxvbmcgbG9uZwotI2VuZGlmICAvKiBVUEJfTExPTkdfSVNfNjRCSVRTICovCi0KLSNlbGlmIFVQQl9MTE9OR19JU182NEJJVFMgIC8qICYmICFVUEJfTE9OR19JU182NEJJVFMgKi8KLSNkZWZpbmUgVVBCX0lOVDY0X1QgbG9uZyBsb25nCi0jZGVmaW5lIFVQQl9VSU5UNjRfVCB1bnNpZ25lZCBsb25nIGxvbmcKLSNlbmRpZiAgLyogVVBCX0xPTkdfSVNfNjRCSVRTICovCi0KLSN1bmRlZiBVUEJfSU5UMzJfTUFYCi0jdW5kZWYgVVBCX0lOVDMyX01JTgotI3VuZGVmIFVQQl9JTlQ2NF9NQVgKLSN1bmRlZiBVUEJfSU5UNjRfTUlOCi0jdW5kZWYgVVBCX0lOVF9JU18zMkJJVFMKLSN1bmRlZiBVUEJfTE9OR19JU18zMkJJVFMKLSN1bmRlZiBVUEJfTE9OR19JU182NEJJVFMKLSN1bmRlZiBVUEJfTExPTkdfSVNfNjRCSVRTCi0KLQotbmFtZXNwYWNlIHVwYiB7Ci0KLXR5cGVkZWYgdm9pZCBDbGVhbnVwRnVuYyh2b2lkICpwdHIpOwotCi0vKiBUZW1wbGF0ZSB0byByZW1vdmUgImNvbnN0IiBmcm9tICJjb25zdCBUKiIgYW5kIGp1c3QgcmV0dXJuICJUKiIuCi0gKgotICogV2UgZGVmaW5lIGEgbm9uc2Vuc2UgZGVmYXVsdCBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGZhaWwgdG8gaW5zdGFudGlhdGUgYXMKLSAqIGEgZnVuY3Rpb24gcGFyYW1ldGVyIHR5cGUgZXZlbiBpbiBjYXNlcyB3aGVyZSB3ZSBkb24ndCBleHBlY3QgYW55IGNhbGxlciB0bwotICogYWN0dWFsbHkgbWF0Y2ggdGhlIG92ZXJsb2FkLiAqLwotY2xhc3MgQ291bGRudFJlbW92ZUNvbnN0IHt9OwotdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfY29uc3RwdHIgeyB0eXBlZGVmIENvdWxkbnRSZW1vdmVDb25zdCB0eXBlOyB9OwotdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCByZW1vdmVfY29uc3RwdHI8Y29uc3QgVCAqPiB7IHR5cGVkZWYgVCAqdHlwZTsgfTsKLQotLyogVGVtcGxhdGUgdGhhdCB3ZSB1c2UgYmVsb3cgdG8gcmVtb3ZlIGEgdGVtcGxhdGUgc3BlY2lhbGl6YXRpb24gZnJvbQotICogY29uc2lkZXJhdGlvbiBpZiBpdCBtYXRjaGVzIGEgc3BlY2lmaWMgdHlwZS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBVPiBzdHJ1Y3QgZGlzYWJsZV9pZl9zYW1lIHsgdHlwZWRlZiB2b2lkIFR5cGU7IH07Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IGRpc2FibGVfaWZfc2FtZTxULCBUPiB7fTsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgRGVsZXRlUG9pbnRlcih2b2lkICpwKSB7IGRlbGV0ZSBzdGF0aWNfY2FzdDxUPihwKTsgfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVDEsIGNsYXNzIFQyPgotc3RydWN0IEZpcnN0VW5sZXNzVm9pZE9yQm9vbCB7Ci0gIHR5cGVkZWYgVDEgdmFsdWU7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVDI+Ci1zdHJ1Y3QgRmlyc3RVbmxlc3NWb2lkT3JCb29sPHZvaWQsIFQyPiB7Ci0gIHR5cGVkZWYgVDIgdmFsdWU7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgVDI+Ci1zdHJ1Y3QgRmlyc3RVbmxlc3NWb2lkT3JCb29sPGJvb2wsIFQyPiB7Ci0gIHR5cGVkZWYgVDIgdmFsdWU7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBULCBjbGFzcyBVPgotc3RydWN0IGlzX3NhbWUgewotICBzdGF0aWMgYm9vbCB2YWx1ZTsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1zdHJ1Y3QgaXNfc2FtZTxULCBUPiB7Ci0gIHN0YXRpYyBib29sIHZhbHVlOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KLWJvb2wgaXNfc2FtZTxULCBVPjo6dmFsdWUgPSBmYWxzZTsKLQotdGVtcGxhdGU8Y2xhc3MgVD4KLWJvb2wgaXNfc2FtZTxULCBUPjo6dmFsdWUgPSB0cnVlOwotCi0vKiBGdW5jSW5mbyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBJbmZvIGFib3V0IHRoZSB1c2VyJ3Mgb3JpZ2luYWwsIHByZS13cmFwcGVkIGZ1bmN0aW9uLiAqLwotdGVtcGxhdGUgPGNsYXNzIEMsIGNsYXNzIFIgPSB2b2lkPgotc3RydWN0IEZ1bmNJbmZvIHsKLSAgLyogVGhlIHR5cGUgb2YgdGhlIGNsb3N1cmUgdGhhdCB0aGUgZnVuY3Rpb24gdGFrZXMgKGl0cyBmaXJzdCBwYXJhbSkuICovCi0gIHR5cGVkZWYgQyBDbG9zdXJlOwotCi0gIC8qIFRoZSByZXR1cm4gdHlwZS4gKi8KLSAgdHlwZWRlZiBSIFJldHVybjsKLX07Ci0KLS8qIEZ1bmMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZ1bmMxLCBGdW5jMiwgRnVuYzM6IFRlbXBsYXRlIGNsYXNzZXMgcmVwcmVzZW50aW5nIGEgZnVuY3Rpb24gYW5kIGl0cwotICogc2lnbmF0dXJlLgotICoKLSAqIFNpbmNlIHRoZSBmdW5jdGlvbiBpcyBhIHRlbXBsYXRlIHBhcmFtZXRlciwgY2FsbGluZyB0aGUgZnVuY3Rpb24gY2FuIGJlCi0gKiBpbmxpbmVkIGF0IGNvbXBpbGUtdGltZSBhbmQgZG9lcyBub3QgcmVxdWlyZSBhIGZ1bmN0aW9uIHBvaW50ZXIgYXQgcnVudGltZS4KLSAqIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IGJvdW5kIHRvIGEgaGFuZGxlciBkYXRhIHNvIGhhdmUgbm8gZGF0YSBvciBjbGVhbnVwCi0gKiBoYW5kbGVyLiAqLwotc3RydWN0IFVuYm91bmRGdW5jIHsKLSAgQ2xlYW51cEZ1bmMgKkdldENsZWFudXAoKSB7IHJldHVybiBOVUxMOyB9Ci0gIHZvaWQgKkdldERhdGEoKSB7IHJldHVybiBOVUxMOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIFIgRihQMSksIGNsYXNzIEk+Ci1zdHJ1Y3QgRnVuYzEgOiBwdWJsaWMgVW5ib3VuZEZ1bmMgewotICB0eXBlZGVmIFIgUmV0dXJuOwotICB0eXBlZGVmIEkgRnVuY0luZm87Ci0gIHN0YXRpYyBSIENhbGwoUDEgcDEpIHsgcmV0dXJuIEYocDEpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSIEYoUDEsIFAyKSwgY2xhc3MgST4KLXN0cnVjdCBGdW5jMiA6IHB1YmxpYyBVbmJvdW5kRnVuYyB7Ci0gIHR5cGVkZWYgUiBSZXR1cm47Ci0gIHR5cGVkZWYgSSBGdW5jSW5mbzsKLSAgc3RhdGljIFIgQ2FsbChQMSBwMSwgUDIgcDIpIHsgcmV0dXJuIEYocDEsIHAyKTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIFIgRihQMSwgUDIsIFAzKSwgY2xhc3MgST4KLXN0cnVjdCBGdW5jMyA6IHB1YmxpYyBVbmJvdW5kRnVuYyB7Ci0gIHR5cGVkZWYgUiBSZXR1cm47Ci0gIHR5cGVkZWYgSSBGdW5jSW5mbzsKLSAgc3RhdGljIFIgQ2FsbChQMSBwMSwgUDIgcDIsIFAzIHAzKSB7IHJldHVybiBGKHAxLCBwMiwgcDMpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIFIgRihQMSwgUDIsIFAzLCBQNCksCi0gICAgICAgICAgY2xhc3MgST4KLXN0cnVjdCBGdW5jNCA6IHB1YmxpYyBVbmJvdW5kRnVuYyB7Ci0gIHR5cGVkZWYgUiBSZXR1cm47Ci0gIHR5cGVkZWYgSSBGdW5jSW5mbzsKLSAgc3RhdGljIFIgQ2FsbChQMSBwMSwgUDIgcDIsIFAzIHAzLCBQNCBwNCkgeyByZXR1cm4gRihwMSwgcDIsIHAzLCBwNCk7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQNCwgY2xhc3MgUDUsCi0gICAgICAgICAgUiBGKFAxLCBQMiwgUDMsIFA0LCBQNSksIGNsYXNzIEk+Ci1zdHJ1Y3QgRnVuYzUgOiBwdWJsaWMgVW5ib3VuZEZ1bmMgewotICB0eXBlZGVmIFIgUmV0dXJuOwotICB0eXBlZGVmIEkgRnVuY0luZm87Ci0gIHN0YXRpYyBSIENhbGwoUDEgcDEsIFAyIHAyLCBQMyBwMywgUDQgcDQsIFA1IHA1KSB7Ci0gICAgcmV0dXJuIEYocDEsIHAyLCBwMywgcDQsIHA1KTsKLSAgfQotfTsKLQotLyogQm91bmRGdW5jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQm91bmRGdW5jMiwgQm91bmRGdW5jMzogTGlrZSBGdW5jMi9GdW5jMyBleGNlcHQgYWxzbyBjb250YWlucyBhIHZhbHVlIHRoYXQKLSAqIHNoYWxsIGJlIGJvdW5kIHRvIHRoZSBmdW5jdGlvbidzIHNlY29uZCBwYXJhbWV0ZXIuCi0gKiAKLSAqIE5vdGUgdGhhdCB0aGUgc2Vjb25kIHBhcmFtZXRlciBpcyBhIGNvbnN0IHBvaW50ZXIsIGJ1dCBvdXIgc3RvcmVkIGJvdW5kIHZhbHVlCi0gKiBpcyBub24tY29uc3Qgc28gd2UgY2FuIGZyZWUgaXQgd2hlbiB0aGUgaGFuZGxlcnMgYXJlIGRlc3Ryb3llZC4gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPgotc3RydWN0IEJvdW5kRnVuYyB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFQ+Ojp0eXBlIE11dGFibGVQMjsKLSAgZXhwbGljaXQgQm91bmRGdW5jKE11dGFibGVQMiBkYXRhXykgOiBkYXRhKGRhdGFfKSB7fQotICBDbGVhbnVwRnVuYyAqR2V0Q2xlYW51cCgpIHsgcmV0dXJuICZEZWxldGVQb2ludGVyPE11dGFibGVQMj47IH0KLSAgTXV0YWJsZVAyIEdldERhdGEoKSB7IHJldHVybiBkYXRhOyB9Ci0gIE11dGFibGVQMiBkYXRhOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgUiBGKFAxLCBQMiksIGNsYXNzIEk+Ci1zdHJ1Y3QgQm91bmRGdW5jMiA6IHB1YmxpYyBCb3VuZEZ1bmM8UDI+IHsKLSAgdHlwZWRlZiBCb3VuZEZ1bmM8UDI+IEJhc2U7Ci0gIHR5cGVkZWYgSSBGdW5jSW5mbzsKLSAgZXhwbGljaXQgQm91bmRGdW5jMih0eXBlbmFtZSBCYXNlOjpNdXRhYmxlUDIgYXJnKSA6IEJhc2UoYXJnKSB7fQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIFIgRihQMSwgUDIsIFAzKSwgY2xhc3MgST4KLXN0cnVjdCBCb3VuZEZ1bmMzIDogcHVibGljIEJvdW5kRnVuYzxQMj4gewotICB0eXBlZGVmIEJvdW5kRnVuYzxQMj4gQmFzZTsKLSAgdHlwZWRlZiBJIEZ1bmNJbmZvOwotICBleHBsaWNpdCBCb3VuZEZ1bmMzKHR5cGVuYW1lIEJhc2U6Ok11dGFibGVQMiBhcmcpIDogQmFzZShhcmcpIHt9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIFIgRihQMSwgUDIsIFAzLCBQNCksCi0gICAgICAgICAgY2xhc3MgST4KLXN0cnVjdCBCb3VuZEZ1bmM0IDogcHVibGljIEJvdW5kRnVuYzxQMj4gewotICB0eXBlZGVmIEJvdW5kRnVuYzxQMj4gQmFzZTsKLSAgdHlwZWRlZiBJIEZ1bmNJbmZvOwotICBleHBsaWNpdCBCb3VuZEZ1bmM0KHR5cGVuYW1lIEJhc2U6Ok11dGFibGVQMiBhcmcpIDogQmFzZShhcmcpIHt9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIGNsYXNzIFA1LAotICAgICAgICAgIFIgRihQMSwgUDIsIFAzLCBQNCwgUDUpLCBjbGFzcyBJPgotc3RydWN0IEJvdW5kRnVuYzUgOiBwdWJsaWMgQm91bmRGdW5jPFAyPiB7Ci0gIHR5cGVkZWYgQm91bmRGdW5jPFAyPiBCYXNlOwotICB0eXBlZGVmIEkgRnVuY0luZm87Ci0gIGV4cGxpY2l0IEJvdW5kRnVuYzUodHlwZW5hbWUgQmFzZTo6TXV0YWJsZVAyIGFyZykgOiBCYXNlKGFyZykge30KLX07Ci0KLS8qIEZ1bmNTaWcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEZ1bmNTaWcxLCBGdW5jU2lnMiwgRnVuY1NpZzM6IHRlbXBsYXRlIGNsYXNzZXMgcmVmbGVjdGluZyBhIGZ1bmN0aW9uCi0gKiAqc2lnbmF0dXJlKiwgYnV0IHdpdGhvdXQgYSBzcGVjaWZpYyBmdW5jdGlvbiBhdHRhY2hlZC4KLSAqCi0gKiBUaGVzZSBjbGFzc2VzIGNvbnRhaW4gbWVtYmVyIGZ1bmN0aW9ucyB0aGF0IGNhbiBiZSBpbnZva2VkIHdpdGggYQotICogc3BlY2lmaWMgZnVuY3Rpb24gdG8gcmV0dXJuIGEgRnVuYy9Cb3VuZEZ1bmMgY2xhc3MuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDE+Ci1zdHJ1Y3QgRnVuY1NpZzEgewotICB0ZW1wbGF0ZSA8UiBGKFAxKT4KLSAgRnVuYzE8UiwgUDEsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+IEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmMxPFIsIFAxLCBGLCBGdW5jSW5mbzxQMSwgUj4gPigpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyPgotc3RydWN0IEZ1bmNTaWcyIHsKLSAgdGVtcGxhdGUgPFIgRihQMSwgUDIpPgotICBGdW5jMjxSLCBQMSwgUDIsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+IEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmMyPFIsIFAxLCBQMiwgRiwgRnVuY0luZm88UDEsIFI+ID4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxSIEYoUDEsIFAyKT4KLSAgQm91bmRGdW5jMjxSLCBQMSwgUDIsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+IEdldEZ1bmMoCi0gICAgICB0eXBlbmFtZSByZW1vdmVfY29uc3RwdHI8UDI+Ojp0eXBlIHBhcmFtMikgewotICAgIHJldHVybiBCb3VuZEZ1bmMyPFIsIFAxLCBQMiwgRiwgRnVuY0luZm88UDEsIFI+ID4ocGFyYW0yKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDM+Ci1zdHJ1Y3QgRnVuY1NpZzMgewotICB0ZW1wbGF0ZSA8UiBGKFAxLCBQMiwgUDMpPgotICBGdW5jMzxSLCBQMSwgUDIsIFAzLCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jMzxSLCBQMSwgUDIsIFAzLCBGLCBGdW5jSW5mbzxQMSwgUj4gPigpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFIgRihQMSwgUDIsIFAzKT4KLSAgQm91bmRGdW5jMzxSLCBQMSwgUDIsIFAzLCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKAotICAgICAgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAyPjo6dHlwZSBwYXJhbTIpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jMzxSLCBQMSwgUDIsIFAzLCBGLCBGdW5jSW5mbzxQMSwgUj4gPihwYXJhbTIpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQ+Ci1zdHJ1Y3QgRnVuY1NpZzQgewotICB0ZW1wbGF0ZSA8UiBGKFAxLCBQMiwgUDMsIFA0KT4KLSAgRnVuYzQ8UiwgUDEsIFAyLCBQMywgUDQsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+IEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmM0PFIsIFAxLCBQMiwgUDMsIFA0LCBGLCBGdW5jSW5mbzxQMSwgUj4gPigpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFIgRihQMSwgUDIsIFAzLCBQNCk+Ci0gIEJvdW5kRnVuYzQ8UiwgUDEsIFAyLCBQMywgUDQsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+IEdldEZ1bmMoCi0gICAgICB0eXBlbmFtZSByZW1vdmVfY29uc3RwdHI8UDI+Ojp0eXBlIHBhcmFtMikgewotICAgIHJldHVybiBCb3VuZEZ1bmM0PFIsIFAxLCBQMiwgUDMsIFA0LCBGLCBGdW5jSW5mbzxQMSwgUj4gPihwYXJhbTIpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIGNsYXNzIFA1Pgotc3RydWN0IEZ1bmNTaWc1IHsKLSAgdGVtcGxhdGUgPFIgRihQMSwgUDIsIFAzLCBQNCwgUDUpPgotICBGdW5jNTxSLCBQMSwgUDIsIFAzLCBQNCwgUDUsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+IEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmM1PFIsIFAxLCBQMiwgUDMsIFA0LCBQNSwgRiwgRnVuY0luZm88UDEsIFI+ID4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxSIEYoUDEsIFAyLCBQMywgUDQsIFA1KT4KLSAgQm91bmRGdW5jNTxSLCBQMSwgUDIsIFAzLCBQNCwgUDUsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+IEdldEZ1bmMoCi0gICAgICB0eXBlbmFtZSByZW1vdmVfY29uc3RwdHI8UDI+Ojp0eXBlIHBhcmFtMikgewotICAgIHJldHVybiBCb3VuZEZ1bmM1PFIsIFAxLCBQMiwgUDMsIFA0LCBQNSwgRiwgRnVuY0luZm88UDEsIFI+ID4ocGFyYW0yKTsKLSAgfQotfTsKLQotLyogT3ZlcmxvYWRlZCB0ZW1wbGF0ZSBmdW5jdGlvbiB0aGF0IGNhbiBjb25zdHJ1Y3QgdGhlIGFwcHJvcHJpYXRlIEZ1bmNTaWcqCi0gKiBjbGFzcyBnaXZlbiBhIGZ1bmN0aW9uIHBvaW50ZXIgYnkgZGVkdWNpbmcgdGhlIHRlbXBsYXRlIHBhcmFtZXRlcnMuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDE+Ci1pbmxpbmUgRnVuY1NpZzE8UiwgUDE+IE1hdGNoRnVuYyhSICgqZikoUDEpKSB7Ci0gIFVQQl9VTlVTRUQoZik7ICAvKiBPbmx5IHVzZWQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciBkZWR1Y3Rpb24uICovCi0gIHJldHVybiBGdW5jU2lnMTxSLCBQMT4oKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMj4KLWlubGluZSBGdW5jU2lnMjxSLCBQMSwgUDI+IE1hdGNoRnVuYyhSICgqZikoUDEsIFAyKSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gRnVuY1NpZzI8UiwgUDEsIFAyPigpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMz4KLWlubGluZSBGdW5jU2lnMzxSLCBQMSwgUDIsIFAzPiBNYXRjaEZ1bmMoUiAoKmYpKFAxLCBQMiwgUDMpKSB7Ci0gIFVQQl9VTlVTRUQoZik7ICAvKiBPbmx5IHVzZWQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciBkZWR1Y3Rpb24uICovCi0gIHJldHVybiBGdW5jU2lnMzxSLCBQMSwgUDIsIFAzPigpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQ+Ci1pbmxpbmUgRnVuY1NpZzQ8UiwgUDEsIFAyLCBQMywgUDQ+IE1hdGNoRnVuYyhSICgqZikoUDEsIFAyLCBQMywgUDQpKSB7Ci0gIFVQQl9VTlVTRUQoZik7ICAvKiBPbmx5IHVzZWQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciBkZWR1Y3Rpb24uICovCi0gIHJldHVybiBGdW5jU2lnNDxSLCBQMSwgUDIsIFAzLCBQND4oKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBjbGFzcyBQNT4KLWlubGluZSBGdW5jU2lnNTxSLCBQMSwgUDIsIFAzLCBQNCwgUDU+IE1hdGNoRnVuYyhSICgqZikoUDEsIFAyLCBQMywgUDQsIFA1KSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gRnVuY1NpZzU8UiwgUDEsIFAyLCBQMywgUDQsIFA1PigpOwotfQotCi0vKiBNZXRob2RTaWcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBDYWxsTWV0aG9kKjogYSBmdW5jdGlvbiB0ZW1wbGF0ZSB0aGF0IGNhbGxzIGEgZ2l2ZW4gbWV0aG9kLiAqLwotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEMsIFIgKEM6OipGKSgpPgotUiBDYWxsTWV0aG9kMChDICpvYmopIHsKLSAgcmV0dXJuICgoKm9iaikuKkYpKCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgUiAoQzo6KkYpKFAxKT4KLVIgQ2FsbE1ldGhvZDEoQyAqb2JqLCBQMSBhcmcxKSB7Ci0gIHJldHVybiAoKCpvYmopLipGKShhcmcxKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEMsIGNsYXNzIFAxLCBjbGFzcyBQMiwgUiAoQzo6KkYpKFAxLCBQMik+Ci1SIENhbGxNZXRob2QyKEMgKm9iaiwgUDEgYXJnMSwgUDIgYXJnMikgewotICByZXR1cm4gKCgqb2JqKS4qRikoYXJnMSwgYXJnMik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBSIChDOjoqRikoUDEsIFAyLCBQMyk+Ci1SIENhbGxNZXRob2QzKEMgKm9iaiwgUDEgYXJnMSwgUDIgYXJnMiwgUDMgYXJnMykgewotICByZXR1cm4gKCgqb2JqKS4qRikoYXJnMSwgYXJnMiwgYXJnMyk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQNCwKLSAgICAgICAgICBSIChDOjoqRikoUDEsIFAyLCBQMywgUDQpPgotUiBDYWxsTWV0aG9kNChDICpvYmosIFAxIGFyZzEsIFAyIGFyZzIsIFAzIGFyZzMsIFA0IGFyZzQpIHsKLSAgcmV0dXJuICgoKm9iaikuKkYpKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOwotfQotCi0vKiBNZXRob2RTaWc6IGxpa2UgRnVuY1NpZywgYnV0IGZvciBtZW1iZXIgZnVuY3Rpb25zLgotICoKLSAqIEdldEZ1bmMoKSByZXR1cm5zIGEgbm9ybWFsIEZ1bmNOIG9iamVjdCwgc28gYWZ0ZXIgY2FsbGluZyBHZXRGdW5jKCkgbm8KLSAqIG1vcmUgbG9naWMgaXMgcmVxdWlyZWQgdG8gc3BlY2lhbC1jYXNlIG1ldGhvZHMuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQz4KLXN0cnVjdCBNZXRob2RTaWcwIHsKLSAgdGVtcGxhdGUgPFIgKEM6OipGKSgpPgotICBGdW5jMTxSLCBDICosIENhbGxNZXRob2QwPFIsIEMsIEY+LCBGdW5jSW5mbzxDICosIFI+ID4gR2V0RnVuYygpIHsKLSAgICByZXR1cm4gRnVuYzE8UiwgQyAqLCBDYWxsTWV0aG9kMDxSLCBDLCBGPiwgRnVuY0luZm88QyAqLCBSPiA+KCk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMT4KLXN0cnVjdCBNZXRob2RTaWcxIHsKLSAgdGVtcGxhdGUgPFIgKEM6OipGKShQMSk+Ci0gIEZ1bmMyPFIsIEMgKiwgUDEsIENhbGxNZXRob2QxPFIsIEMsIFAxLCBGPiwgRnVuY0luZm88QyAqLCBSPiA+IEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmMyPFIsIEMgKiwgUDEsIENhbGxNZXRob2QxPFIsIEMsIFAxLCBGPiwgRnVuY0luZm88QyAqLCBSPiA+KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8UiAoQzo6KkYpKFAxKT4KLSAgQm91bmRGdW5jMjxSLCBDICosIFAxLCBDYWxsTWV0aG9kMTxSLCBDLCBQMSwgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPiBHZXRGdW5jKAotICAgICAgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAxPjo6dHlwZSBwYXJhbTEpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jMjxSLCBDICosIFAxLCBDYWxsTWV0aG9kMTxSLCBDLCBQMSwgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPigKLSAgICAgICAgcGFyYW0xKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEMsIGNsYXNzIFAxLCBjbGFzcyBQMj4KLXN0cnVjdCBNZXRob2RTaWcyIHsKLSAgdGVtcGxhdGUgPFIgKEM6OipGKShQMSwgUDIpPgotICBGdW5jMzxSLCBDICosIFAxLCBQMiwgQ2FsbE1ldGhvZDI8UiwgQywgUDEsIFAyLCBGPiwgRnVuY0luZm88QyAqLCBSPiA+Ci0gIEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmMzPFIsIEMgKiwgUDEsIFAyLCBDYWxsTWV0aG9kMjxSLCBDLCBQMSwgUDIsIEY+LAotICAgICAgICAgICAgICAgICBGdW5jSW5mbzxDICosIFI+ID4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxSIChDOjoqRikoUDEsIFAyKT4KLSAgQm91bmRGdW5jMzxSLCBDICosIFAxLCBQMiwgQ2FsbE1ldGhvZDI8UiwgQywgUDEsIFAyLCBGPiwgRnVuY0luZm88QyAqLCBSPiA+Ci0gIEdldEZ1bmModHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAxPjo6dHlwZSBwYXJhbTEpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jMzxSLCBDICosIFAxLCBQMiwgQ2FsbE1ldGhvZDI8UiwgQywgUDEsIFAyLCBGPiwKLSAgICAgICAgICAgICAgICAgICAgICBGdW5jSW5mbzxDICosIFI+ID4ocGFyYW0xKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEMsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDM+Ci1zdHJ1Y3QgTWV0aG9kU2lnMyB7Ci0gIHRlbXBsYXRlIDxSIChDOjoqRikoUDEsIFAyLCBQMyk+Ci0gIEZ1bmM0PFIsIEMgKiwgUDEsIFAyLCBQMywgQ2FsbE1ldGhvZDM8UiwgQywgUDEsIFAyLCBQMywgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPgotICBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jNDxSLCBDICosIFAxLCBQMiwgUDMsIENhbGxNZXRob2QzPFIsIEMsIFAxLCBQMiwgUDMsIEY+LAotICAgICAgICAgICAgICAgICBGdW5jSW5mbzxDICosIFI+ID4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxSIChDOjoqRikoUDEsIFAyLCBQMyk+Ci0gIEJvdW5kRnVuYzQ8UiwgQyAqLCBQMSwgUDIsIFAzLCBDYWxsTWV0aG9kMzxSLCBDLCBQMSwgUDIsIFAzLCBGPiwKLSAgICAgICAgICAgICBGdW5jSW5mbzxDICosIFI+ID4KLSAgR2V0RnVuYyh0eXBlbmFtZSByZW1vdmVfY29uc3RwdHI8UDE+Ojp0eXBlIHBhcmFtMSkgewotICAgIHJldHVybiBCb3VuZEZ1bmM0PFIsIEMgKiwgUDEsIFAyLCBQMywgQ2FsbE1ldGhvZDM8UiwgQywgUDEsIFAyLCBQMywgRj4sCi0gICAgICAgICAgICAgICAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+KHBhcmFtMSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQND4KLXN0cnVjdCBNZXRob2RTaWc0IHsKLSAgdGVtcGxhdGUgPFIgKEM6OipGKShQMSwgUDIsIFAzLCBQNCk+Ci0gIEZ1bmM1PFIsIEMgKiwgUDEsIFAyLCBQMywgUDQsIENhbGxNZXRob2Q0PFIsIEMsIFAxLCBQMiwgUDMsIFA0LCBGPiwKLSAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+Ci0gIEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmM1PFIsIEMgKiwgUDEsIFAyLCBQMywgUDQsIENhbGxNZXRob2Q0PFIsIEMsIFAxLCBQMiwgUDMsIFA0LCBGPiwKLSAgICAgICAgICAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8UiAoQzo6KkYpKFAxLCBQMiwgUDMsIFA0KT4KLSAgQm91bmRGdW5jNTxSLCBDICosIFAxLCBQMiwgUDMsIFA0LCBDYWxsTWV0aG9kNDxSLCBDLCBQMSwgUDIsIFAzLCBQNCwgRj4sCi0gICAgICAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+Ci0gIEdldEZ1bmModHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAxPjo6dHlwZSBwYXJhbTEpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jNTxSLCBDICosIFAxLCBQMiwgUDMsIFA0LAotICAgICAgICAgICAgICAgICAgICAgIENhbGxNZXRob2Q0PFIsIEMsIFAxLCBQMiwgUDMsIFA0LCBGPiwgRnVuY0luZm88QyAqLCBSPiA+KAotICAgICAgICBwYXJhbTEpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQz4KLWlubGluZSBNZXRob2RTaWcwPFIsIEM+IE1hdGNoRnVuYyhSIChDOjoqZikoKSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gTWV0aG9kU2lnMDxSLCBDPigpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDE+Ci1pbmxpbmUgTWV0aG9kU2lnMTxSLCBDLCBQMT4gTWF0Y2hGdW5jKFIgKEM6OipmKShQMSkpIHsKLSAgVVBCX1VOVVNFRChmKTsgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbi4gKi8KLSAgcmV0dXJuIE1ldGhvZFNpZzE8UiwgQywgUDE+KCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDI+Ci1pbmxpbmUgTWV0aG9kU2lnMjxSLCBDLCBQMSwgUDI+IE1hdGNoRnVuYyhSIChDOjoqZikoUDEsIFAyKSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gTWV0aG9kU2lnMjxSLCBDLCBQMSwgUDI+KCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzPgotaW5saW5lIE1ldGhvZFNpZzM8UiwgQywgUDEsIFAyLCBQMz4gTWF0Y2hGdW5jKFIgKEM6OipmKShQMSwgUDIsIFAzKSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gTWV0aG9kU2lnMzxSLCBDLCBQMSwgUDIsIFAzPigpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQ+Ci1pbmxpbmUgTWV0aG9kU2lnNDxSLCBDLCBQMSwgUDIsIFAzLCBQND4gTWF0Y2hGdW5jKFIgKEM6OipmKShQMSwgUDIsIFAzLCBQNCkpIHsKLSAgVVBCX1VOVVNFRChmKTsgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbi4gKi8KLSAgcmV0dXJuIE1ldGhvZFNpZzQ8UiwgQywgUDEsIFAyLCBQMywgUDQ+KCk7Ci19Ci0KLS8qIE1heWJlV3JhcFJldHVybiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRlbXBsYXRlIGNsYXNzIHRoYXQgYXR0ZW1wdHMgdG8gd3JhcCB0aGUgcmV0dXJuIHZhbHVlIG9mIHRoZSBmdW5jdGlvbiBzbyBpdAotICogbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgdHlwZS4gIFRoZXJlIGFyZSB0d28gbWFpbiBhZGp1c3RtZW50cyBpdCBtYXkgbWFrZToKLSAqCi0gKiAgIDEuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIHZvaWQsIG1ha2UgaXQgcmV0dXJuIHRoZSBleHBlY3RlZCB0eXBlIGFuZCB3aXRoCi0gKiAgICAgIGEgdmFsdWUgdGhhdCBhbHdheXMgaW5kaWNhdGVzIHN1Y2Nlc3MuCi0gKiAgIDIuIElmIHRoZSBmdW5jdGlvbiByZXR1cm5zIGJvb2wsIG1ha2UgaXQgcmV0dXJuIHRoZSBleHBlY3RlZCB0eXBlIHdpdGggYQotICogICAgICB2YWx1ZSB0aGF0IGluZGljYXRlcyBzdWNjZXNzIG9yIGZhaWx1cmUuCi0gKgotICogVGhlICJleHBlY3RlZCB0eXBlIiBmb3IgcmV0dXJuIGlzOgotICogICAxLiB2b2lkKiBmb3Igc3RhcnQgaGFuZGxlcnMuICBJZiB0aGUgY2xvc3VyZSBwYXJhbWV0ZXIgaGFzIGEgZGlmZmVyZW50IHR5cGUKLSAqICAgICAgd2Ugd2lsbCBjYXN0IGl0IHRvIHZvaWQqIGZvciB0aGUgcmV0dXJuIGluIHRoZSBzdWNjZXNzIGNhc2UuCi0gKiAgIDIuIHNpemVfdCBmb3Igc3RyaW5nIGJ1ZmZlciBoYW5kbGVycy4KLSAqICAgMy4gYm9vbCBmb3IgZXZlcnl0aGluZyBlbHNlLiAqLwotCi0vKiBUZW1wbGF0ZSBwYXJhbWV0ZXJzIGFyZSBGdW5jTiB0eXBlIGFuZCBkZXNpcmVkIHJldHVybiB0eXBlLiAqLwotdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzIFIsIGNsYXNzIEVuYWJsZSA9IHZvaWQ+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuOwotCi0vKiBJZiB0aGUgcmV0dXJuIHR5cGUgbWF0Y2hlcywgcmV0dXJuIHRoZSBnaXZlbiBmdW5jdGlvbiB1bndyYXBwZWQuICovCi10ZW1wbGF0ZSA8Y2xhc3MgRj4KLXN0cnVjdCBNYXliZVdyYXBSZXR1cm48RiwgdHlwZW5hbWUgRjo6UmV0dXJuPiB7Ci0gIHR5cGVkZWYgRiBGdW5jOwotfTsKLQotLyogRnVuY3Rpb24gd3JhcHBlciB0aGF0IG11bmdlcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdm9pZCB0byAoYm9vbCl0cnVlLiAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgdm9pZCBGKFAxLCBQMik+Ci1ib29sIFJldHVyblRydWUyKFAxIHAxLCBQMiBwMikgewotICBGKHAxLCBwMik7Ci0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgdm9pZCBGKFAxLCBQMiwgUDMpPgotYm9vbCBSZXR1cm5UcnVlMyhQMSBwMSwgUDIgcDIsIFAzIHAzKSB7Ci0gIEYocDEsIHAyLCBwMyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGdW5jdGlvbiB3cmFwcGVyIHRoYXQgbXVuZ2VzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSB2b2lkIHRvICh2b2lkKilhcmcxICAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgdm9pZCBGKFAxLCBQMik+Ci12b2lkICpSZXR1cm5DbG9zdXJlMihQMSBwMSwgUDIgcDIpIHsKLSAgRihwMSwgcDIpOwotICByZXR1cm4gcDE7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCB2b2lkIEYoUDEsIFAyLCBQMyk+Ci12b2lkICpSZXR1cm5DbG9zdXJlMyhQMSBwMSwgUDIgcDIsIFAzIHAzKSB7Ci0gIEYocDEsIHAyLCBwMyk7Ci0gIHJldHVybiBwMTsKLX0KLQotLyogRnVuY3Rpb24gd3JhcHBlciB0aGF0IG11bmdlcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gUiB0byB2b2lkKi4gKi8KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIFIgRihQMSwgUDIpPgotdm9pZCAqQ2FzdFJldHVyblRvVm9pZFB0cjIoUDEgcDEsIFAyIHAyKSB7Ci0gIHJldHVybiBGKHAxLCBwMik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBSIEYoUDEsIFAyLCBQMyk+Ci12b2lkICpDYXN0UmV0dXJuVG9Wb2lkUHRyMyhQMSBwMSwgUDIgcDIsIFAzIHAzKSB7Ci0gIHJldHVybiBGKHAxLCBwMiwgcDMpOwotfQotCi0vKiBGdW5jdGlvbiB3cmFwcGVyIHRoYXQgbXVuZ2VzIHRoZSByZXR1cm4gdmFsdWUgZnJvbSBib29sIHRvIHZvaWQqLiAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgYm9vbCBGKFAxLCBQMik+Ci12b2lkICpSZXR1cm5DbG9zdXJlT3JCcmVhazIoUDEgcDEsIFAyIHAyKSB7Ci0gIHJldHVybiBGKHAxLCBwMikgPyBwMSA6IFVQQl9CUkVBSzsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGJvb2wgRihQMSwgUDIsIFAzKT4KLXZvaWQgKlJldHVybkNsb3N1cmVPckJyZWFrMyhQMSBwMSwgUDIgcDIsIFAzIHAzKSB7Ci0gIHJldHVybiBGKHAxLCBwMiwgcDMpID8gcDEgOiBVUEJfQlJFQUs7Ci19Ci0KLS8qIEZvciB0aGUgc3RyaW5nIGNhbGxiYWNrLCB3aGljaCB0YWtlcyBmaXZlIHBhcmFtcywgcmV0dXJucyB0aGUgc2l6ZSBwYXJhbS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsCi0gICAgICAgICAgdm9pZCBGKFAxLCBQMiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqKT4KLXNpemVfdCBSZXR1cm5TdHJpbmdMZW4oUDEgcDEsIFAyIHAyLCBjb25zdCBjaGFyICpwMywgc2l6ZV90IHA0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdWZmZXJIYW5kbGUgKnA1KSB7Ci0gIEYocDEsIHAyLCBwMywgcDQsIHA1KTsKLSAgcmV0dXJuIHA0OwotfQotCi0vKiBGb3IgdGhlIHN0cmluZyBjYWxsYmFjaywgd2hpY2ggdGFrZXMgZml2ZSBwYXJhbXMsIHJldHVybnMgdGhlIHNpemUgcGFyYW0gb3IKLSAqIHplcm8uICovCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLAotICAgICAgICAgIGJvb2wgRihQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjb25zdCBCdWZmZXJIYW5kbGUgKik+Ci1zaXplX3QgUmV0dXJuTk9yMChQMSBwMSwgUDIgcDIsIGNvbnN0IGNoYXIgKnAzLCBzaXplX3QgcDQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBCdWZmZXJIYW5kbGUgKnA1KSB7Ci0gIHJldHVybiBGKHAxLCBwMiwgcDMsIHA0LCBwNSkgPyBwNCA6IDA7Ci19Ci0KLS8qIElmIHdlIGhhdmUgYSBmdW5jdGlvbiByZXR1cm5pbmcgdm9pZCBidXQgd2FudCBhIGZ1bmN0aW9uIHJldHVybmluZyBib29sLCB3cmFwCi0gKiBpdCBpbiBhIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0cnVlLiAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgdm9pZCBGKFAxLCBQMiksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPEZ1bmMyPHZvaWQsIFAxLCBQMiwgRiwgST4sIGJvb2w+IHsKLSAgdHlwZWRlZiBGdW5jMjxib29sLCBQMSwgUDIsIFJldHVyblRydWUyPFAxLCBQMiwgRj4sIEk+IEZ1bmM7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgdm9pZCBGKFAxLCBQMiwgUDMpLCBjbGFzcyBJPgotc3RydWN0IE1heWJlV3JhcFJldHVybjxGdW5jMzx2b2lkLCBQMSwgUDIsIFAzLCBGLCBJPiwgYm9vbD4gewotICB0eXBlZGVmIEZ1bmMzPGJvb2wsIFAxLCBQMiwgUDMsIFJldHVyblRydWUzPFAxLCBQMiwgUDMsIEY+LCBJPiBGdW5jOwotfTsKLQotLyogSWYgb3VyIGZ1bmN0aW9uIHJldHVybnMgdm9pZCBidXQgd2Ugd2FudCBvbmUgcmV0dXJuaW5nIHZvaWQqLCB3cmFwIGl0IGluIGEKLSAqIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZmlyc3QgYXJndW1lbnQuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLCB2b2lkIEYoUDEsIFAyKSwgY2xhc3MgST4KLXN0cnVjdCBNYXliZVdyYXBSZXR1cm48RnVuYzI8dm9pZCwgUDEsIFAyLCBGLCBJPiwgdm9pZCAqPiB7Ci0gIHR5cGVkZWYgRnVuYzI8dm9pZCAqLCBQMSwgUDIsIFJldHVybkNsb3N1cmUyPFAxLCBQMiwgRj4sIEk+IEZ1bmM7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgdm9pZCBGKFAxLCBQMiwgUDMpLCBjbGFzcyBJPgotc3RydWN0IE1heWJlV3JhcFJldHVybjxGdW5jMzx2b2lkLCBQMSwgUDIsIFAzLCBGLCBJPiwgdm9pZCAqPiB7Ci0gIHR5cGVkZWYgRnVuYzM8dm9pZCAqLCBQMSwgUDIsIFAzLCBSZXR1cm5DbG9zdXJlMzxQMSwgUDIsIFAzLCBGPiwgST4gRnVuYzsKLX07Ci0KLS8qIElmIG91ciBmdW5jdGlvbiByZXR1cm5zIFIqIGJ1dCB3ZSB3YW50IG9uZSByZXR1cm5pbmcgdm9pZCosIHdyYXAgaXQgaW4gYQotICogZnVuY3Rpb24gdGhhdCBjYXN0cyB0byB2b2lkKi4gKi8KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIFIgKkYoUDEsIFAyKSwgY2xhc3MgST4KLXN0cnVjdCBNYXliZVdyYXBSZXR1cm48RnVuYzI8UiAqLCBQMSwgUDIsIEYsIEk+LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGRpc2FibGVfaWZfc2FtZTxSICosIHZvaWQgKj46OlR5cGU+IHsKLSAgdHlwZWRlZiBGdW5jMjx2b2lkICosIFAxLCBQMiwgQ2FzdFJldHVyblRvVm9pZFB0cjI8UiAqLCBQMSwgUDIsIEY+LCBJPiBGdW5jOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIFIgKkYoUDEsIFAyLCBQMyksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPEZ1bmMzPFIgKiwgUDEsIFAyLCBQMywgRiwgST4sIHZvaWQgKiwKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgZGlzYWJsZV9pZl9zYW1lPFIgKiwgdm9pZCAqPjo6VHlwZT4gewotICB0eXBlZGVmIEZ1bmMzPHZvaWQgKiwgUDEsIFAyLCBQMywgQ2FzdFJldHVyblRvVm9pZFB0cjM8UiAqLCBQMSwgUDIsIFAzLCBGPiwgST4KLSAgICAgIEZ1bmM7Ci19OwotCi0vKiBJZiBvdXIgZnVuY3Rpb24gcmV0dXJucyBib29sIGJ1dCB3ZSB3YW50IG9uZSByZXR1cm5pbmcgdm9pZCosIHdyYXAgaXQgaW4gYQotICogZnVuY3Rpb24gdGhhdCByZXR1cm5zIGVpdGhlciB0aGUgZmlyc3QgcGFyYW0gb3IgVVBCX0JSRUFLLiAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgYm9vbCBGKFAxLCBQMiksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPEZ1bmMyPGJvb2wsIFAxLCBQMiwgRiwgST4sIHZvaWQgKj4gewotICB0eXBlZGVmIEZ1bmMyPHZvaWQgKiwgUDEsIFAyLCBSZXR1cm5DbG9zdXJlT3JCcmVhazI8UDEsIFAyLCBGPiwgST4gRnVuYzsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBib29sIEYoUDEsIFAyLCBQMyksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPEZ1bmMzPGJvb2wsIFAxLCBQMiwgUDMsIEYsIEk+LCB2b2lkICo+IHsKLSAgdHlwZWRlZiBGdW5jMzx2b2lkICosIFAxLCBQMiwgUDMsIFJldHVybkNsb3N1cmVPckJyZWFrMzxQMSwgUDIsIFAzLCBGPiwgST4KLSAgICAgIEZ1bmM7Ci19OwotCi0vKiBJZiBvdXIgZnVuY3Rpb24gcmV0dXJucyB2b2lkIGJ1dCB3ZSB3YW50IG9uZSByZXR1cm5pbmcgc2l6ZV90LCB3cmFwIGl0IGluIGEKLSAqIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgc2l6ZSBhcmd1bWVudC4gKi8KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsCi0gICAgICAgICAgdm9pZCBGKFAxLCBQMiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqKSwgY2xhc3MgST4KLXN0cnVjdCBNYXliZVdyYXBSZXR1cm48Ci0gICAgRnVuYzU8dm9pZCwgUDEsIFAyLCBjb25zdCBjaGFyICosIHNpemVfdCwgY29uc3QgQnVmZmVySGFuZGxlICosIEYsIEk+LAotICAgICAgICAgIHNpemVfdD4gewotICB0eXBlZGVmIEZ1bmM1PHNpemVfdCwgUDEsIFAyLCBjb25zdCBjaGFyICosIHNpemVfdCwgY29uc3QgQnVmZmVySGFuZGxlICosCi0gICAgICAgICAgICAgICAgUmV0dXJuU3RyaW5nTGVuPFAxLCBQMiwgRj4sIEk+IEZ1bmM7Ci19OwotCi0vKiBJZiBvdXIgZnVuY3Rpb24gcmV0dXJucyBib29sIGJ1dCB3ZSB3YW50IG9uZSByZXR1cm5pbmcgc2l6ZV90LCB3cmFwIGl0IGluIGEKLSAqIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlaXRoZXIgMCBvciB0aGUgYnVmIHNpemUuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLAotICAgICAgICAgIGJvb2wgRihQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjb25zdCBCdWZmZXJIYW5kbGUgKiksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPAotICAgIEZ1bmM1PGJvb2wsIFAxLCBQMiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqLCBGLCBJPiwKLSAgICBzaXplX3Q+IHsKLSAgdHlwZWRlZiBGdW5jNTxzaXplX3QsIFAxLCBQMiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqLAotICAgICAgICAgICAgICAgIFJldHVybk5PcjA8UDEsIFAyLCBGPiwgST4gRnVuYzsKLX07Ci0KLS8qIENvbnZlcnRQYXJhbXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRlbXBsYXRlIGNsYXNzIHRoYXQgY29udmVydHMgdGhlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgaWYgbmVjZXNzYXJ5LCBhbmQKLSAqIGlnbm9yZXMgdGhlIEhhbmRsZXJEYXRhIHBhcmFtZXRlciBpZiBhcHByb3ByaWF0ZS4KLSAqCi0gKiBUZW1wbGF0ZSBwYXJhbWV0ZXIgaXMgdGhlIGFyZSBGdW5jTiBmdW5jdGlvbiB0eXBlLiAqLwotdGVtcGxhdGUgPGNsYXNzIEYsIGNsYXNzIFQ+Ci1zdHJ1Y3QgQ29udmVydFBhcmFtczsKLQotLyogRnVuY3Rpb24gdGhhdCBkaXNjYXJkcyB0aGUgaGFuZGxlciBkYXRhIHBhcmFtZXRlci4gKi8KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgUiBGKFAxKT4KLVIgSWdub3JlSGFuZGxlckRhdGEyKHZvaWQgKnAxLCBjb25zdCB2b2lkICpoZCkgewotICBVUEJfVU5VU0VEKGhkKTsKLSAgcmV0dXJuIEYoc3RhdGljX2Nhc3Q8UDE+KHAxKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDJXcmFwcGVyLCBjbGFzcyBQMldyYXBwZWQsCi0gICAgICAgICAgUiBGKFAxLCBQMldyYXBwZWQpPgotUiBJZ25vcmVIYW5kbGVyRGF0YTModm9pZCAqcDEsIGNvbnN0IHZvaWQgKmhkLCBQMldyYXBwZXIgcDIpIHsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIHJldHVybiBGKHN0YXRpY19jYXN0PFAxPihwMSksIHAyKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIFIgRihQMSwgUDIsIFAzKT4KLVIgSWdub3JlSGFuZGxlckRhdGE0KHZvaWQgKnAxLCBjb25zdCB2b2lkICpoZCwgUDIgcDIsIFAzIHAzKSB7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByZXR1cm4gRihzdGF0aWNfY2FzdDxQMT4ocDEpLCBwMiwgcDMpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIFIgRihQMSwgUDIsIFAzLCBQNCk+Ci1SIElnbm9yZUhhbmRsZXJEYXRhNSh2b2lkICpwMSwgY29uc3Qgdm9pZCAqaGQsIFAyIHAyLCBQMyBwMywgUDQgcDQpIHsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIHJldHVybiBGKHN0YXRpY19jYXN0PFAxPihwMSksIHAyLCBwMywgcDQpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIFIgRihQMSwgY29uc3QgY2hhciosIHNpemVfdCk+Ci1SIElnbm9yZUhhbmRsZXJEYXRhSWdub3JlSGFuZGxlKHZvaWQgKnAxLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqcDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBwMywgY29uc3QgQnVmZmVySGFuZGxlICpoYW5kbGUpIHsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLSAgcmV0dXJuIEYoc3RhdGljX2Nhc3Q8UDE+KHAxKSwgcDIsIHAzKTsKLX0KLQotLyogRnVuY3Rpb24gdGhhdCBjYXN0cyB0aGUgaGFuZGxlciBkYXRhIHBhcmFtZXRlci4gKi8KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIFIgRihQMSwgUDIpPgotUiBDYXN0SGFuZGxlckRhdGEyKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHJldHVybiBGKHN0YXRpY19jYXN0PFAxPihjKSwgc3RhdGljX2Nhc3Q8UDI+KGhkKSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzV3JhcHBlciwgY2xhc3MgUDNXcmFwcGVkLAotICAgICAgICAgIFIgRihQMSwgUDIsIFAzV3JhcHBlZCk+Ci1SIENhc3RIYW5kbGVyRGF0YTModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIFAzV3JhcHBlciBwMykgewotICByZXR1cm4gRihzdGF0aWNfY2FzdDxQMT4oYyksIHN0YXRpY19jYXN0PFAyPihoZCksIHAzKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBjbGFzcyBQNSwKLSAgICAgICAgICBSIEYoUDEsIFAyLCBQMywgUDQsIFA1KT4KLVIgQ2FzdEhhbmRsZXJEYXRhNSh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgUDMgcDMsIFA0IHA0LCBQNSBwNSkgewotICByZXR1cm4gRihzdGF0aWNfY2FzdDxQMT4oYyksIHN0YXRpY19jYXN0PFAyPihoZCksIHAzLCBwNCwgcDUpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSIEYoUDEsIFAyLCBjb25zdCBjaGFyICosIHNpemVfdCk+Ci1SIENhc3RIYW5kbGVyRGF0YUlnbm9yZUhhbmRsZSh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqcDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcDQsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqaGFuZGxlKSB7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLSAgcmV0dXJuIEYoc3RhdGljX2Nhc3Q8UDE+KGMpLCBzdGF0aWNfY2FzdDxQMj4oaGQpLCBwMywgcDQpOwotfQotCi0vKiBGb3IgdW5ib3VuZCBmdW5jdGlvbnMsIGlnbm9yZSB0aGUgaGFuZGxlciBkYXRhLiAqLwotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBSIEYoUDEpLCBjbGFzcyBJLCBjbGFzcyBUPgotc3RydWN0IENvbnZlcnRQYXJhbXM8RnVuYzE8UiwgUDEsIEYsIEk+LCBUPiB7Ci0gIHR5cGVkZWYgRnVuYzI8Uiwgdm9pZCAqLCBjb25zdCB2b2lkICosIElnbm9yZUhhbmRsZXJEYXRhMjxSLCBQMSwgRj4sIEk+IEZ1bmM7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSIEYoUDEsIFAyKSwgY2xhc3MgSSwKLSAgICAgICAgICBjbGFzcyBSMiwgY2xhc3MgUDFfMiwgY2xhc3MgUDJfMiwgY2xhc3MgUDNfMj4KLXN0cnVjdCBDb252ZXJ0UGFyYW1zPEZ1bmMyPFIsIFAxLCBQMiwgRiwgST4sCi0gICAgICAgICAgICAgICAgICAgICBSMiAoKikoUDFfMiwgUDJfMiwgUDNfMik+IHsKLSAgdHlwZWRlZiBGdW5jMzxSLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgUDNfMiwKLSAgICAgICAgICAgICAgICBJZ25vcmVIYW5kbGVyRGF0YTM8UiwgUDEsIFAzXzIsIFAyLCBGPiwgST4gRnVuYzsKLX07Ci0KLS8qIEZvciBTdHJpbmdCdWZmZXIgb25seTsgdGhpcyBpZ25vcmVzIGJvdGggdGhlIGhhbmRsZXIgZGF0YSBhbmQgdGhlCi0gKiBCdWZmZXJIYW5kbGUuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIFIgRihQMSwgY29uc3QgY2hhciAqLCBzaXplX3QpLCBjbGFzcyBJLCBjbGFzcyBUPgotc3RydWN0IENvbnZlcnRQYXJhbXM8RnVuYzM8UiwgUDEsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBGLCBJPiwgVD4gewotICB0eXBlZGVmIEZ1bmM1PFIsIHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBjb25zdCBjaGFyICosIHNpemVfdCwKLSAgICAgICAgICAgICAgICBjb25zdCBCdWZmZXJIYW5kbGUgKiwgSWdub3JlSGFuZGxlckRhdGFJZ25vcmVIYW5kbGU8UiwgUDEsIEY+LAotICAgICAgICAgICAgICAgIEk+IEZ1bmM7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIFIgRihQMSwgUDIsIFAzLCBQNCksCi0gICAgICAgICAgY2xhc3MgSSwgY2xhc3MgVD4KLXN0cnVjdCBDb252ZXJ0UGFyYW1zPEZ1bmM0PFIsIFAxLCBQMiwgUDMsIFA0LCBGLCBJPiwgVD4gewotICB0eXBlZGVmIEZ1bmM1PFIsIHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBQMiwgUDMsIFA0LAotICAgICAgICAgICAgICAgIElnbm9yZUhhbmRsZXJEYXRhNTxSLCBQMSwgUDIsIFAzLCBQNCwgRj4sIEk+IEZ1bmM7Ci19OwotCi0vKiBGb3IgYm91bmQgZnVuY3Rpb25zLCBjYXN0IHRoZSBoYW5kbGVyIGRhdGEuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSIEYoUDEsIFAyKSwgY2xhc3MgSSwgY2xhc3MgVD4KLXN0cnVjdCBDb252ZXJ0UGFyYW1zPEJvdW5kRnVuYzI8UiwgUDEsIFAyLCBGLCBJPiwgVD4gewotICB0eXBlZGVmIEZ1bmMyPFIsIHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBDYXN0SGFuZGxlckRhdGEyPFIsIFAxLCBQMiwgRj4sIEk+Ci0gICAgICBGdW5jOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIFIgRihQMSwgUDIsIFAzKSwgY2xhc3MgSSwKLSAgICAgICAgICBjbGFzcyBSMiwgY2xhc3MgUDFfMiwgY2xhc3MgUDJfMiwgY2xhc3MgUDNfMj4KLXN0cnVjdCBDb252ZXJ0UGFyYW1zPEJvdW5kRnVuYzM8UiwgUDEsIFAyLCBQMywgRiwgST4sCi0gICAgICAgICAgICAgICAgICAgICBSMiAoKikoUDFfMiwgUDJfMiwgUDNfMik+IHsKLSAgdHlwZWRlZiBGdW5jMzxSLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgUDNfMiwKLSAgICAgICAgICAgICAgICBDYXN0SGFuZGxlckRhdGEzPFIsIFAxLCBQMiwgUDNfMiwgUDMsIEY+LCBJPiBGdW5jOwotfTsKLQotLyogRm9yIFN0cmluZ0J1ZmZlciBvbmx5OyB0aGlzIGlnbm9yZXMgdGhlIEJ1ZmZlckhhbmRsZS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIFIgRihQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSwKLSAgICAgICAgICBjbGFzcyBJLCBjbGFzcyBUPgotc3RydWN0IENvbnZlcnRQYXJhbXM8Qm91bmRGdW5jNDxSLCBQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBGLCBJPiwgVD4gewotICB0eXBlZGVmIEZ1bmM1PFIsIHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBjb25zdCBjaGFyICosIHNpemVfdCwKLSAgICAgICAgICAgICAgICBjb25zdCBCdWZmZXJIYW5kbGUgKiwgQ2FzdEhhbmRsZXJEYXRhSWdub3JlSGFuZGxlPFIsIFAxLCBQMiwgRj4sCi0gICAgICAgICAgICAgICAgST4gRnVuYzsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQNCwgY2xhc3MgUDUsCi0gICAgICAgICAgUiBGKFAxLCBQMiwgUDMsIFA0LCBQNSksIGNsYXNzIEksIGNsYXNzIFQ+Ci1zdHJ1Y3QgQ29udmVydFBhcmFtczxCb3VuZEZ1bmM1PFIsIFAxLCBQMiwgUDMsIFA0LCBQNSwgRiwgST4sIFQ+IHsKLSAgdHlwZWRlZiBGdW5jNTxSLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgUDMsIFA0LCBQNSwKLSAgICAgICAgICAgICAgICBDYXN0SGFuZGxlckRhdGE1PFIsIFAxLCBQMiwgUDMsIFA0LCBQNSwgRj4sIEk+IEZ1bmM7Ci19OwotCi0vKiB1dHlwZS9sdHlwZSBhcmUgdXBwZXIvbG93ZXItY2FzZSwgY3R5cGUgaXMgY2Fub25pY2FsIEMgdHlwZSwgdnR5cGUgaXMKLSAqIHZhcmlhbnQgQyB0eXBlLiAqLwotI2RlZmluZSBUWVBFX01FVEhPRFModXR5cGUsIGx0eXBlLCBjdHlwZSwgdnR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gc3RydWN0IENhbm9uaWNhbFR5cGU8dnR5cGU+IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHlwZWRlZiBjdHlwZSBUeXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBib29sIEhhbmRsZXJzOjpTZXRWYWx1ZUhhbmRsZXI8dnR5cGU+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgRmllbGREZWYgKmYsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IEhhbmRsZXJzOjp1dHlwZSAjIyBIYW5kbGVyJiBoYW5kbGVyKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYXNzZXJ0KCFoYW5kbGVyLnJlZ2lzdGVyZWRfKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGhhbmRsZXIuQWRkQ2xlYW51cCh0aGlzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBoYW5kbGVyLnJlZ2lzdGVyZWRfID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXQjI2x0eXBlKHRoaXMsIGYsIGhhbmRsZXIuaGFuZGxlcl8sICZoYW5kbGVyLmF0dHJfKTsgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotVFlQRV9NRVRIT0RTKERvdWJsZSwgZG91YmxlLCBkb3VibGUsICAgZG91YmxlKQotVFlQRV9NRVRIT0RTKEZsb2F0LCAgZmxvYXQsICBmbG9hdCwgICAgZmxvYXQpCi1UWVBFX01FVEhPRFMoVUludDY0LCB1aW50NjQsIHVpbnQ2NF90LCBVUEJfVUlOVDY0X1QpCi1UWVBFX01FVEhPRFMoVUludDMyLCB1aW50MzIsIHVpbnQzMl90LCBVUEJfVUlOVDMyX1QpCi1UWVBFX01FVEhPRFMoSW50NjQsICBpbnQ2NCwgIGludDY0X3QsICBVUEJfSU5UNjRfVCkKLVRZUEVfTUVUSE9EUyhJbnQzMiwgIGludDMyLCAgaW50MzJfdCwgIFVQQl9JTlQzMl9UKQotVFlQRV9NRVRIT0RTKEJvb2wsICAgYm9vbCwgICBib29sLCAgICAgYm9vbCkKLQotI2lmZGVmIFVQQl9UV09fMzJCSVRfVFlQRVMKLVRZUEVfTUVUSE9EUyhJbnQzMiwgIGludDMyLCAgaW50MzJfdCwgIFVQQl9JTlQzMkFMVF9UKQotVFlQRV9NRVRIT0RTKFVJbnQzMiwgdWludDMyLCB1aW50MzJfdCwgVVBCX1VJTlQzMkFMVF9UKQotI2VuZGlmCi0KLSNpZmRlZiBVUEJfVFdPXzY0QklUX1RZUEVTCi1UWVBFX01FVEhPRFMoSW50NjQsICBpbnQ2NCwgIGludDY0X3QsICBVUEJfSU5UNjRBTFRfVCkKLVRZUEVfTUVUSE9EUyhVSW50NjQsIHVpbnQ2NCwgdWludDY0X3QsIFVQQl9VSU5UNjRBTFRfVCkKLSNlbmRpZgotI3VuZGVmIFRZUEVfTUVUSE9EUwotCi10ZW1wbGF0ZSA8PiBzdHJ1Y3QgQ2Fub25pY2FsVHlwZTxTdGF0dXMqPiB7Ci0gIHR5cGVkZWYgU3RhdHVzKiBUeXBlOwotfTsKLQotLyogVHlwZSBtZXRob2RzIHRoYXQgYXJlIG9ubHkgb25lLXBlci1jYW5vbmljYWwtdHlwZSBhbmQgbm90Ci0gKiBvbmUtcGVyLWN2YXJpYW50LiAqLwotCi0jZGVmaW5lIFRZUEVfTUVUSE9EUyh1dHlwZSwgY3R5cGUpIFwKLSAgICBpbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0IyN1dHlwZSMjSGFuZGxlcihjb25zdCBGaWVsZERlZiAqZiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHV0eXBlIyNIYW5kbGVyICZoKSB7IFwKLSAgICAgIHJldHVybiBTZXRWYWx1ZUhhbmRsZXI8Y3R5cGU+KGYsIGgpOyBcCi0gICAgfSBcCi0KLVRZUEVfTUVUSE9EUyhEb3VibGUsIGRvdWJsZSkKLVRZUEVfTUVUSE9EUyhGbG9hdCwgIGZsb2F0KQotVFlQRV9NRVRIT0RTKFVJbnQ2NCwgdWludDY0X3QpCi1UWVBFX01FVEhPRFMoVUludDMyLCB1aW50MzJfdCkKLVRZUEVfTUVUSE9EUyhJbnQ2NCwgIGludDY0X3QpCi1UWVBFX01FVEhPRFMoSW50MzIsICBpbnQzMl90KQotVFlQRV9NRVRIT0RTKEJvb2wsICAgYm9vbCkKLSN1bmRlZiBUWVBFX01FVEhPRFMKLQotdGVtcGxhdGUgPGNsYXNzIEY+IHN0cnVjdCBSZXR1cm5PZjsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMj4KLXN0cnVjdCBSZXR1cm5PZjxSICgqKShQMSwgUDIpPiB7Ci0gIHR5cGVkZWYgUiBSZXR1cm47Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMz4KLXN0cnVjdCBSZXR1cm5PZjxSICgqKShQMSwgUDIsIFAzKT4gewotICB0eXBlZGVmIFIgUmV0dXJuOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0Pgotc3RydWN0IFJldHVybk9mPFIgKCopKFAxLCBQMiwgUDMsIFA0KT4gewotICB0eXBlZGVmIFIgUmV0dXJuOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBjbGFzcyBQNT4KLXN0cnVjdCBSZXR1cm5PZjxSICgqKShQMSwgUDIsIFAzLCBQNCwgUDUpPiB7Ci0gIHR5cGVkZWYgUiBSZXR1cm47Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPiBjb25zdCB2b2lkICpVbmlxdWVQdHJGb3JUeXBlKCkgewotICBzdGF0aWMgY29uc3QgY2hhciBjaCA9IDA7Ci0gIHJldHVybiAmY2g7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdGVtcGxhdGUgPGNsYXNzIEY+Ci1pbmxpbmUgSGFuZGxlcjxUPjo6SGFuZGxlcihGIGZ1bmMpCi0gICAgOiByZWdpc3RlcmVkXyhmYWxzZSksCi0gICAgICBjbGVhbnVwX2RhdGFfKGZ1bmMuR2V0RGF0YSgpKSwKLSAgICAgIGNsZWFudXBfZnVuY18oZnVuYy5HZXRDbGVhbnVwKCkpIHsKLSAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKCZhdHRyXywgZnVuYy5HZXREYXRhKCkpOwotICB0eXBlZGVmIHR5cGVuYW1lIFJldHVybk9mPFQ+OjpSZXR1cm4gUmV0dXJuOwotICB0eXBlZGVmIHR5cGVuYW1lIENvbnZlcnRQYXJhbXM8RiwgVD46OkZ1bmMgQ29udmVydGVkUGFyYW1zRnVuYzsKLSAgdHlwZWRlZiB0eXBlbmFtZSBNYXliZVdyYXBSZXR1cm48Q29udmVydGVkUGFyYW1zRnVuYywgUmV0dXJuPjo6RnVuYwotICAgICAgUmV0dXJuV3JhcHBlZEZ1bmM7Ci0gIGhhbmRsZXJfID0gUmV0dXJuV3JhcHBlZEZ1bmMoKS5DYWxsOwotCi0gIC8qIFNldCBhdHRyaWJ1dGVzIGJhc2VkIG9uIHdoYXQgdGVtcGxhdGVzIGNhbiBzdGF0aWNhbGx5IHRlbGwgdXMgYWJvdXQgdGhlCi0gICAqIHVzZXIncyBmdW5jdGlvbi4gKi8KLQotICAvKiBJZiB0aGUgb3JpZ2luYWwgZnVuY3Rpb24gcmV0dXJucyB2b2lkLCB0aGVuIHdlIGtub3cgdGhhdCB3ZSB3cmFwcGVkIGl0IHRvCi0gICAqIGFsd2F5cyByZXR1cm4gb2suICovCi0gIGJvb2wgYWx3YXlzX29rID0gaXNfc2FtZTx0eXBlbmFtZSBGOjpGdW5jSW5mbzo6UmV0dXJuLCB2b2lkPjo6dmFsdWU7Ci0gIGF0dHJfLlNldEFsd2F5c09rKGFsd2F5c19vayk7Ci0KLSAgLyogQ2xvc3VyZSBwYXJhbWV0ZXIgYW5kIHJldHVybiB0eXBlLiAqLwotICBhdHRyXy5TZXRDbG9zdXJlVHlwZShVbmlxdWVQdHJGb3JUeXBlPHR5cGVuYW1lIEY6OkZ1bmNJbmZvOjpDbG9zdXJlPigpKTsKLQotICAvKiBXZSB1c2UgdGhlIGNsb3N1cmUgdHlwZSAoZnJvbSB0aGUgZmlyc3QgcGFyYW1ldGVyKSBpZiB0aGUgcmV0dXJuIHR5cGUgaXMKLSAgICogdm9pZCBvciBib29sLCBzaW5jZSB0aGVzZSBhcmUgdGhlIHR3byBjYXNlcyB3ZSB3cmFwIHRvIHJldHVybiB0aGUgY2xvc3VyZSdzCi0gICAqIHR5cGUgYW55d2F5LgotICAgKgotICAgKiBUaGlzIGlzIGFsbCBub25zZW5zZSBmb3Igbm9uIFNUQVJUKiBoYW5kbGVycywgYnV0IGl0IGRvZXNuJ3QgbWF0dGVyIGJlY2F1c2UKLSAgICogaW4gdGhhdCBjYXNlIHRoZSB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuICovCi0gIHR5cGVkZWYgdHlwZW5hbWUgRmlyc3RVbmxlc3NWb2lkT3JCb29sPHR5cGVuYW1lIEY6OkZ1bmNJbmZvOjpSZXR1cm4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIEY6OkZ1bmNJbmZvOjpDbG9zdXJlPjo6dmFsdWUKLSAgICAgIEVmZmVjdGl2ZVJldHVybjsKLSAgYXR0cl8uU2V0UmV0dXJuQ2xvc3VyZVR5cGUoVW5pcXVlUHRyRm9yVHlwZTxFZmZlY3RpdmVSZXR1cm4+KCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWlubGluZSBIYW5kbGVyPFQ+Ojp+SGFuZGxlcigpIHsKLSAgYXNzZXJ0KHJlZ2lzdGVyZWRfKTsKLX0KLQotaW5saW5lIEhhbmRsZXJBdHRyaWJ1dGVzOjpIYW5kbGVyQXR0cmlidXRlcygpIHsgdXBiX2hhbmRsZXJhdHRyX2luaXQodGhpcyk7IH0KLWlubGluZSBIYW5kbGVyQXR0cmlidXRlczo6fkhhbmRsZXJBdHRyaWJ1dGVzKCkgeyB1cGJfaGFuZGxlcmF0dHJfdW5pbml0KHRoaXMpOyB9Ci1pbmxpbmUgYm9vbCBIYW5kbGVyQXR0cmlidXRlczo6U2V0SGFuZGxlckRhdGEoY29uc3Qgdm9pZCAqaGQpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSh0aGlzLCBoZCk7Ci19Ci1pbmxpbmUgY29uc3Qgdm9pZCogSGFuZGxlckF0dHJpYnV0ZXM6OmhhbmRsZXJfZGF0YSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyYXR0cl9oYW5kbGVyZGF0YSh0aGlzKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJBdHRyaWJ1dGVzOjpTZXRDbG9zdXJlVHlwZShjb25zdCB2b2lkICp0eXBlKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfc2V0Y2xvc3VyZXR5cGUodGhpcywgdHlwZSk7Ci19Ci1pbmxpbmUgY29uc3Qgdm9pZCogSGFuZGxlckF0dHJpYnV0ZXM6OmNsb3N1cmVfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyYXR0cl9jbG9zdXJldHlwZSh0aGlzKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJBdHRyaWJ1dGVzOjpTZXRSZXR1cm5DbG9zdXJlVHlwZShjb25zdCB2b2lkICp0eXBlKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfc2V0cmV0dXJuY2xvc3VyZXR5cGUodGhpcywgdHlwZSk7Ci19Ci1pbmxpbmUgY29uc3Qgdm9pZCogSGFuZGxlckF0dHJpYnV0ZXM6OnJldHVybl9jbG9zdXJlX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyQXR0cmlidXRlczo6U2V0QWx3YXlzT2soYm9vbCBhbHdheXNfb2spIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyYXR0cl9zZXRhbHdheXNvayh0aGlzLCBhbHdheXNfb2spOwotfQotaW5saW5lIGJvb2wgSGFuZGxlckF0dHJpYnV0ZXM6OmFsd2F5c19vaygpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyYXR0cl9hbHdheXNvayh0aGlzKTsKLX0KLQotaW5saW5lIEJ1ZmZlckhhbmRsZTo6QnVmZmVySGFuZGxlKCkgeyB1cGJfYnVmaGFuZGxlX2luaXQodGhpcyk7IH0KLWlubGluZSBCdWZmZXJIYW5kbGU6On5CdWZmZXJIYW5kbGUoKSB7IHVwYl9idWZoYW5kbGVfdW5pbml0KHRoaXMpOyB9Ci1pbmxpbmUgY29uc3QgY2hhciogQnVmZmVySGFuZGxlOjpidWZmZXIoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfYnVmaGFuZGxlX2J1Zih0aGlzKTsKLX0KLWlubGluZSBzaXplX3QgQnVmZmVySGFuZGxlOjpvYmplY3Rfb2Zmc2V0KCkgY29uc3QgewotICByZXR1cm4gdXBiX2J1ZmhhbmRsZV9vYmpvZnModGhpcyk7Ci19Ci1pbmxpbmUgdm9pZCBCdWZmZXJIYW5kbGU6OlNldEJ1ZmZlcihjb25zdCBjaGFyKiBidWYsIHNpemVfdCBvZnMpIHsKLSAgdXBiX2J1ZmhhbmRsZV9zZXRidWYodGhpcywgYnVmLCBvZnMpOwotfQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIEJ1ZmZlckhhbmRsZTo6U2V0QXR0YWNoZWRPYmplY3QoY29uc3QgVCogb2JqKSB7Ci0gIHVwYl9idWZoYW5kbGVfc2V0b2JqKHRoaXMsIG9iaiwgVW5pcXVlUHRyRm9yVHlwZTxUPigpKTsKLX0KLXRlbXBsYXRlIDxjbGFzcyBUPgotY29uc3QgVCogQnVmZmVySGFuZGxlOjpHZXRBdHRhY2hlZE9iamVjdCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9idWZoYW5kbGVfb2JqdHlwZSh0aGlzKSA9PSBVbmlxdWVQdHJGb3JUeXBlPFQ+KCkKLSAgICAgID8gc3RhdGljX2Nhc3Q8Y29uc3QgVCAqPih1cGJfYnVmaGFuZGxlX29iaih0aGlzKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEw7Ci19Ci0KLWlubGluZSByZWZmZWRfcHRyPEhhbmRsZXJzPiBIYW5kbGVyczo6TmV3KGNvbnN0IE1lc3NhZ2VEZWYgKm0pIHsKLSAgdXBiX2hhbmRsZXJzICpoID0gdXBiX2hhbmRsZXJzX25ldyhtLCAmaCk7Ci0gIHJldHVybiByZWZmZWRfcHRyPEhhbmRsZXJzPihoLCAmaCk7Ci19Ci1pbmxpbmUgcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4gSGFuZGxlcnM6Ok5ld0Zyb3plbigKLSAgICBjb25zdCBNZXNzYWdlRGVmICptLCB1cGJfaGFuZGxlcnNfY2FsbGJhY2sgKmNhbGxiYWNrLAotICAgIGNvbnN0IHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgdXBiX2hhbmRsZXJzICpoID0gdXBiX2hhbmRsZXJzX25ld2Zyb3plbihtLCAmaCwgY2FsbGJhY2ssIGNsb3N1cmUpOwotICByZXR1cm4gcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4oaCwgJmgpOwotfQotaW5saW5lIGNvbnN0IFN0YXR1cyogSGFuZGxlcnM6OnN0YXR1cygpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zdGF0dXModGhpcyk7Ci19Ci1pbmxpbmUgdm9pZCBIYW5kbGVyczo6Q2xlYXJFcnJvcigpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19jbGVhcmVycih0aGlzKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpGcmVlemUoU3RhdHVzICpzKSB7Ci0gIHVwYjo6SGFuZGxlcnMqIGggPSB0aGlzOwotICByZXR1cm4gdXBiX2hhbmRsZXJzX2ZyZWV6ZSgmaCwgMSwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6RnJlZXplKEhhbmRsZXJzICpjb25zdCAqaGFuZGxlcnMsIGludCBuLCBTdGF0dXMgKnMpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19mcmVlemUoaGFuZGxlcnMsIG4sIHMpOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OkZyZWV6ZShjb25zdCBzdGQ6OnZlY3RvcjxIYW5kbGVycyo+JiBoLCBTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX2ZyZWV6ZSgoSGFuZGxlcnMqIGNvbnN0KikmaFswXSwgaC5zaXplKCksIHN0YXR1cyk7Ci19Ci1pbmxpbmUgY29uc3QgTWVzc2FnZURlZiAqSGFuZGxlcnM6Om1lc3NhZ2VfZGVmKCkgY29uc3QgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX21zZ2RlZih0aGlzKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpBZGRDbGVhbnVwKHZvaWQgKnAsIHVwYl9oYW5kbGVyZnJlZSAqZnVuYykgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX2FkZGNsZWFudXAodGhpcywgcCwgZnVuYyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0U3RhcnRNZXNzYWdlSGFuZGxlcigKLSAgICBjb25zdCBIYW5kbGVyczo6U3RhcnRNZXNzYWdlSGFuZGxlciAmaGFuZGxlcikgewotICBhc3NlcnQoIWhhbmRsZXIucmVnaXN0ZXJlZF8pOwotICBoYW5kbGVyLnJlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgaGFuZGxlci5BZGRDbGVhbnVwKHRoaXMpOwotICByZXR1cm4gdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKHRoaXMsIGhhbmRsZXIuaGFuZGxlcl8sICZoYW5kbGVyLmF0dHJfKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpTZXRFbmRNZXNzYWdlSGFuZGxlcigKLSAgICBjb25zdCBIYW5kbGVyczo6RW5kTWVzc2FnZUhhbmRsZXIgJmhhbmRsZXIpIHsKLSAgYXNzZXJ0KCFoYW5kbGVyLnJlZ2lzdGVyZWRfKTsKLSAgaGFuZGxlci5yZWdpc3RlcmVkXyA9IHRydWU7Ci0gIGhhbmRsZXIuQWRkQ2xlYW51cCh0aGlzKTsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXRlbmRtc2codGhpcywgaGFuZGxlci5oYW5kbGVyXywgJmhhbmRsZXIuYXR0cl8pOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldFN0YXJ0U3RyaW5nSGFuZGxlcihjb25zdCBGaWVsZERlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RhcnRTdHJpbmdIYW5kbGVyICZoYW5kbGVyKSB7Ci0gIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7Ci0gIGhhbmRsZXIucmVnaXN0ZXJlZF8gPSB0cnVlOwotICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIodGhpcywgZiwgaGFuZGxlci5oYW5kbGVyXywgJmhhbmRsZXIuYXR0cl8pOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldEVuZFN0cmluZ0hhbmRsZXIoY29uc3QgRmllbGREZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbmRGaWVsZEhhbmRsZXIgJmhhbmRsZXIpIHsKLSAgYXNzZXJ0KCFoYW5kbGVyLnJlZ2lzdGVyZWRfKTsKLSAgaGFuZGxlci5yZWdpc3RlcmVkXyA9IHRydWU7Ci0gIGhhbmRsZXIuQWRkQ2xlYW51cCh0aGlzKTsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXRlbmRzdHIodGhpcywgZiwgaGFuZGxlci5oYW5kbGVyXywgJmhhbmRsZXIuYXR0cl8pOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldFN0cmluZ0hhbmRsZXIoY29uc3QgRmllbGREZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTdHJpbmdIYW5kbGVyJiBoYW5kbGVyKSB7Ci0gIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7Ci0gIGhhbmRsZXIucmVnaXN0ZXJlZF8gPSB0cnVlOwotICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKHRoaXMsIGYsIGhhbmRsZXIuaGFuZGxlcl8sICZoYW5kbGVyLmF0dHJfKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpTZXRTdGFydFNlcXVlbmNlSGFuZGxlcigKLSAgICBjb25zdCBGaWVsZERlZiAqZiwgY29uc3QgU3RhcnRGaWVsZEhhbmRsZXIgJmhhbmRsZXIpIHsKLSAgYXNzZXJ0KCFoYW5kbGVyLnJlZ2lzdGVyZWRfKTsKLSAgaGFuZGxlci5yZWdpc3RlcmVkXyA9IHRydWU7Ci0gIGhhbmRsZXIuQWRkQ2xlYW51cCh0aGlzKTsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXRzdGFydHNlcSh0aGlzLCBmLCBoYW5kbGVyLmhhbmRsZXJfLCAmaGFuZGxlci5hdHRyXyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0U3RhcnRTdWJNZXNzYWdlSGFuZGxlcigKLSAgICBjb25zdCBGaWVsZERlZiAqZiwgY29uc3QgU3RhcnRGaWVsZEhhbmRsZXIgJmhhbmRsZXIpIHsKLSAgYXNzZXJ0KCFoYW5kbGVyLnJlZ2lzdGVyZWRfKTsKLSAgaGFuZGxlci5yZWdpc3RlcmVkXyA9IHRydWU7Ci0gIGhhbmRsZXIuQWRkQ2xlYW51cCh0aGlzKTsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyh0aGlzLCBmLCBoYW5kbGVyLmhhbmRsZXJfLCAmaGFuZGxlci5hdHRyXyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0RW5kU3ViTWVzc2FnZUhhbmRsZXIoY29uc3QgRmllbGREZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW5kRmllbGRIYW5kbGVyICZoYW5kbGVyKSB7Ci0gIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7Ci0gIGhhbmRsZXIucmVnaXN0ZXJlZF8gPSB0cnVlOwotICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0ZW5kc3VibXNnKHRoaXMsIGYsIGhhbmRsZXIuaGFuZGxlcl8sICZoYW5kbGVyLmF0dHJfKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpTZXRFbmRTZXF1ZW5jZUhhbmRsZXIoY29uc3QgRmllbGREZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVuZEZpZWxkSGFuZGxlciAmaGFuZGxlcikgewotICBhc3NlcnQoIWhhbmRsZXIucmVnaXN0ZXJlZF8pOwotICBoYW5kbGVyLnJlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgaGFuZGxlci5BZGRDbGVhbnVwKHRoaXMpOwotICByZXR1cm4gdXBiX2hhbmRsZXJzX3NldGVuZHNlcSh0aGlzLCBmLCBoYW5kbGVyLmhhbmRsZXJfLCAmaGFuZGxlci5hdHRyXyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0U3ViSGFuZGxlcnMoY29uc3QgRmllbGREZWYgKmYsIGNvbnN0IEhhbmRsZXJzICpzdWIpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXRzdWJoYW5kbGVycyh0aGlzLCBmLCBzdWIpOwotfQotaW5saW5lIGNvbnN0IEhhbmRsZXJzICpIYW5kbGVyczo6R2V0U3ViSGFuZGxlcnMoY29uc3QgRmllbGREZWYgKmYpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVycyh0aGlzLCBmKTsKLX0KLWlubGluZSBjb25zdCBIYW5kbGVycyAqSGFuZGxlcnM6OkdldFN1YkhhbmRsZXJzKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVyc19zZWwodGhpcywgc2VsKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpHZXRTZWxlY3Rvcihjb25zdCBGaWVsZERlZiAqZiwgSGFuZGxlcnM6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyczo6U2VsZWN0b3IgKnMpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19nZXRzZWxlY3RvcihmLCB0eXBlLCBzKTsKLX0KLWlubGluZSBIYW5kbGVyczo6U2VsZWN0b3IgSGFuZGxlcnM6OkdldEVuZFNlbGVjdG9yKEhhbmRsZXJzOjpTZWxlY3RvciBzdGFydCkgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX2dldGVuZHNlbGVjdG9yKHN0YXJ0KTsKLX0KLWlubGluZSBIYW5kbGVyczo6R2VuZXJpY0Z1bmN0aW9uICpIYW5kbGVyczo6R2V0SGFuZGxlcigKLSAgICBIYW5kbGVyczo6U2VsZWN0b3Igc2VsZWN0b3IpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHRoaXMsIHNlbGVjdG9yKTsKLX0KLWlubGluZSBjb25zdCB2b2lkICpIYW5kbGVyczo6R2V0SGFuZGxlckRhdGEoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEodGhpcywgc2VsZWN0b3IpOwotfQotCi1pbmxpbmUgQnl0ZXNIYW5kbGVyOjpCeXRlc0hhbmRsZXIoKSB7Ci0gIHVwYl9ieXRlc2hhbmRsZXJfaW5pdCh0aGlzKTsKLX0KLQotaW5saW5lIEJ5dGVzSGFuZGxlcjo6fkJ5dGVzSGFuZGxlcigpIHt9Ci0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLSN1bmRlZiBVUEJfVFdPXzMyQklUX1RZUEVTCi0jdW5kZWYgVVBCX1RXT182NEJJVF9UWVBFUwotI3VuZGVmIFVQQl9JTlQzMl9UCi0jdW5kZWYgVVBCX1VJTlQzMl9UCi0jdW5kZWYgVVBCX0lOVDMyQUxUX1QKLSN1bmRlZiBVUEJfVUlOVDMyQUxUX1QKLSN1bmRlZiBVUEJfSU5UNjRfVAotI3VuZGVmIFVQQl9VSU5UNjRfVAotI3VuZGVmIFVQQl9JTlQ2NEFMVF9UCi0jdW5kZWYgVVBCX1VJTlQ2NEFMVF9UCi0KLSNlbmRpZiAgLyogVVBCX0hBTkRMRVJTX0lOTF9IXyAqLwotCi0jZW5kaWYgIC8qIFVQQl9IQU5ETEVSU19IICovCi0vKgotKiogdXBiOjpFbnZpcm9ubWVudCAodXBiX2VudikKLSoqCi0qKiBBIHVwYjo6RW52aXJvbm1lbnQgcHJvdmlkZXMgYSBtZWFucyBmb3IgaW5qZWN0aW5nIG1hbGxvYyBhbmQgYW4KLSoqIGVycm9yLXJlcG9ydGluZyBjYWxsYmFjayBpbnRvIGVuY29kZXJzL2RlY29kZXJzLiAgVGhpcyBhbGxvd3MgdGhlbSB0byBiZQotKiogaW5kZXBlbmRlbnQgb2YgbmVhcmx5IGFsbCBhc3N1bXB0aW9ucyBhYm91dCB0aGVpciBhY3R1YWwgZW52aXJvbm1lbnQuCi0qKgotKiogSXQgaXMgYWxzbyBhIGNvbnRhaW5lciBmb3IgYWxsb2NhdGluZyB0aGUgZW5jb2RlcnMvZGVjb2RlcnMgdGhlbXNlbHZlcyB0aGF0Ci0qKiBpbnN1bGF0ZXMgY2xpZW50cyBmcm9tIGtub3dpbmcgdGhlaXIgYWN0dWFsIHNpemUuICBUaGlzIHByb3ZpZGVzIEFCSQotKiogY29tcGF0aWJpbGl0eSBldmVuIGlmIHRoZSBzaXplIG9mIHRoZSBvYmplY3RzIGNoYW5nZS4gIEFuZCB0aGlzIGFsbG93cyB0aGUKLSoqIHN0cnVjdHVyZSBkZWZpbml0aW9ucyB0byBiZSBpbiB0aGUgLmMgZmlsZXMgaW5zdGVhZCBvZiB0aGUgLmggZmlsZXMsIG1ha2luZwotKiogdGhlIC5oIGZpbGVzIHNtYWxsZXIgYW5kIG1vcmUgcmVhZGFibGUuCi0qLwotCi0KLSNpZm5kZWYgVVBCX0VOVl9IXwotI2RlZmluZSBVUEJfRU5WX0hfCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1jbGFzcyBFbnZpcm9ubWVudDsKLWNsYXNzIFNlZWRlZEFsbG9jYXRvcjsKLX0KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6RW52aXJvbm1lbnQsIHVwYl9lbnYpCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6U2VlZGVkQWxsb2NhdG9yLCB1cGJfc2VlZGVkYWxsb2MpCi0KLXR5cGVkZWYgdm9pZCAqdXBiX2FsbG9jX2Z1bmModm9pZCAqdWQsIHZvaWQgKnB0ciwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplKTsKLXR5cGVkZWYgdm9pZCB1cGJfY2xlYW51cF9mdW5jKHZvaWQgKnVkKTsKLXR5cGVkZWYgYm9vbCB1cGJfZXJyb3JfZnVuYyh2b2lkICp1ZCwgY29uc3QgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIEFuIGVudmlyb25tZW50IGlzICpub3QqIHRocmVhZC1zYWZlLiAqLwotY2xhc3MgdXBiOjpFbnZpcm9ubWVudCB7Ci0gcHVibGljOgotICBFbnZpcm9ubWVudCgpOwotICB+RW52aXJvbm1lbnQoKTsKLQotICAvKiBTZXQgYSBjdXN0b20gbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBlbnZpcm9ubWVudC4gIE1heSBPTkxZCi0gICAqIGJlIGNhbGxlZCBiZWZvcmUgYW55IGNhbGxzIHRvIE1hbGxvYygpL1JlYWxsb2MoKS9BZGRDbGVhbnVwKCkgYmVsb3cuCi0gICAqIElmIHRoaXMgaXMgbm90IGNhbGxlZCwgdGhlIHN5c3RlbSByZWFsbG9jKCkgZnVuY3Rpb24gd2lsbCBiZSB1c2VkLgotICAgKiBUaGUgZ2l2ZW4gdXNlciBwb2ludGVyICJ1ZCIgd2lsbCBiZSBwYXNzZWQgdG8gdGhlIGFsbG9jYXRpb24gZnVuY3Rpb24uCi0gICAqCi0gICAqIFRoZSBhbGxvY2F0aW9uIGZ1bmN0aW9uIHdpbGwgbm90IHJlY2VpdmUgY29ycmVzcG9uZGluZyAiZnJlZSIgY2FsbHMuICBpdAotICAgKiBtdXN0IGVuc3VyZSB0aGF0IHRoZSBtZW1vcnkgaXMgdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgRW52aXJvbm1lbnQsCi0gICAqIGJ1dCBpdCBtYXkgYmUgcmVjbGFpbWVkIGFueSB0aW1lIHRoZXJlYWZ0ZXIuICBUaGUgbGlrZWx5IHVzYWdlIGlzIHRoYXQKLSAgICogInVkIiBwb2ludHMgdG8gYSBzdGF0ZWZ1bCBhbGxvY2F0b3IsIGFuZCB0aGF0IHRoZSBhbGxvY2F0b3IgZnJlZXMgYWxsCi0gICAqIG1lbW9yeSwgYXJlbmEtc3R5bGUsIHdoZW4gaXQgaXMgZGVzdHJveWVkLiAgSW4gdGhpcyBjYXNlIHRoZSBhbGxvY2F0b3IgbXVzdAotICAgKiBvdXRsaXZlIHRoZSBFbnZpcm9ubWVudC4gIEFub3RoZXIgcG9zc2liaWxpdHkgaXMgdGhhdCB0aGUgYWxsb2NhdGlvbgotICAgKiBmdW5jdGlvbiByZXR1cm5zIEdDLWFibGUgbWVtb3J5IHRoYXQgaXMgZ3VhcmFudGVlZCB0byBiZSBHQy1yb290ZWQgZm9yIHRoZQotICAgKiBsaWZlIG9mIHRoZSBFbnZpcm9ubWVudC4gKi8KLSAgdm9pZCBTZXRBbGxvY2F0aW9uRnVuY3Rpb24odXBiX2FsbG9jX2Z1bmMqIGFsbG9jLCB2b2lkKiB1ZCk7Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgVD4KLSAgdm9pZCBTZXRBbGxvY2F0b3IoVCogYWxsb2NhdG9yKSB7Ci0gICAgU2V0QWxsb2NhdGlvbkZ1bmN0aW9uKGFsbG9jYXRvci0+R2V0QWxsb2NhdGlvbkZ1bmN0aW9uKCksIGFsbG9jYXRvcik7Ci0gIH0KLQotICAvKiBTZXQgYSBjdXN0b20gZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9uLiAqLwotICB2b2lkIFNldEVycm9yRnVuY3Rpb24odXBiX2Vycm9yX2Z1bmMqIGZ1bmMsIHZvaWQqIHVkKTsKLQotICAvKiBTZXQgdGhlIGVycm9yIHJlcG9ydGluZyBmdW5jdGlvbiB0byBzaW1wbHkgY29weSB0aGUgc3RhdHVzIHRvIHRoZSBnaXZlbgotICAgKiBzdGF0dXMgYW5kIGFib3J0LiAqLwotICB2b2lkIFJlcG9ydEVycm9yc1RvKFN0YXR1cyogc3RhdHVzKTsKLQotICAvKiBSZXR1cm5zIHRydWUgaWYgYWxsIGFsbG9jYXRpb25zIGFuZCBBZGRDbGVhbnVwKCkgY2FsbHMgaGF2ZSBzdWNjZWVkZWQsCi0gICAqIGFuZCBubyBlcnJvcnMgd2VyZSByZXBvcnRlZCB3aXRoIFJlcG9ydEVycm9yKCkgKGV4Y2VwdCBvbmVzIHRoYXQgcmVjb3ZlcmVkCi0gICAqIHN1Y2Nlc3NmdWxseSkuICovCi0gIGJvb2wgb2soKSBjb25zdDsKLQotICAvKiBGdW5jdGlvbnMgZm9yIHVzZSBieSBlbmNvZGVycy9kZWNvZGVycy4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotICAvKiBSZXBvcnRzIGFuIGVycm9yIHRvIHRoaXMgZW52aXJvbm1lbnQncyBjYWxsYmFjaywgcmV0dXJuaW5nIHRydWUgaWYKLSAgICogdGhlIGNhbGxlciBzaG91bGQgdHJ5IHRvIHJlY292ZXIuICovCi0gIGJvb2wgUmVwb3J0RXJyb3IoY29uc3QgU3RhdHVzKiBzdGF0dXMpOwotCi0gIC8qIEFsbG9jYXRlIG1lbW9yeS4gIFVzZXMgdGhlIGVudmlyb25tZW50J3MgYWxsb2NhdGlvbiBmdW5jdGlvbi4KLSAgICoKLSAgICogVGhlcmUgaXMgbm8gbmVlZCB0byBmcmVlKCkuIEFsbCBtZW1vcnkgd2lsbCBiZSBmcmVlZCBhdXRvbWF0aWNhbGx5LCBidXQgaXMKLSAgICogZ3VhcmFudGVlZCB0byBvdXRsaXZlIHRoZSBFbnZpcm9ubWVudC4gKi8KLSAgdm9pZCogTWFsbG9jKHNpemVfdCBzaXplKTsKLQotICAvKiBSZWFsbG9jYXRlIG1lbW9yeS4gIFByZXNlcnZlcyAib2xkc2l6ZSIgYnl0ZXMgZnJvbSB0aGUgZXhpc3RpbmcgYnVmZmVyCi0gICAqIFJlcXVpcmVzOiBvbGRzaXplIDw9IGV4aXN0aW5nX3NpemUuCi0gICAqCi0gICAqIFRPRE8oaGFiZXJtYW4pOiBzaG91bGQgd2UgYWxzbyBlbmZvcmNlIHRoYXQgb2xkc2l6ZSA8PSBzaXplPyAqLwotICB2b2lkKiBSZWFsbG9jKHZvaWQqIHB0ciwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplKTsKLQotICAvKiBBZGQgYSBjbGVhbnVwIGZ1bmN0aW9uIHRvIHJ1biB3aGVuIHRoZSBlbnZpcm9ubWVudCBpcyBkZXN0cm95ZWQuCi0gICAqIFJldHVybnMgZmFsc2Ugb24gb3V0LW9mLW1lbW9yeS4KLSAgICoKLSAgICogVGhlIGZpcnN0IGNhbGwgdG8gQWRkQ2xlYW51cCgpIGFmdGVyIFNldEFsbG9jYXRpb25GdW5jdGlvbigpIGlzIGd1YXJhbnRlZWQKLSAgICogdG8gcmV0dXJuIHRydWUgLS0gdGhpcyBtYWtlcyBpdCBwb3NzaWJsZSB0byByb2J1c3RseSBzZXQgYSBjbGVhbnVwIGhhbmRsZXIKLSAgICogZm9yIGEgY3VzdG9tIGFsbG9jYXRpb24gZnVuY3Rpb24uICovCi0gIGJvb2wgQWRkQ2xlYW51cCh1cGJfY2xlYW51cF9mdW5jKiBmdW5jLCB2b2lkKiB1ZCk7Ci0KLSAgLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZC4gIEl0IGlzIHVuZGVmaW5lZCB3aGF0Ci0gICAqIFJlYWxsb2MoKSBkb2VzIHRvIHRoaXMgY291bnRlci4gKi8KLSAgc2l6ZV90IEJ5dGVzQWxsb2NhdGVkKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEVudmlyb25tZW50KQotCi0jZWxzZQotc3RydWN0IHVwYl9lbnYgewotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0gIGJvb2wgb2tfOwotICBzaXplX3QgYnl0ZXNfYWxsb2NhdGVkOwotCi0gIC8qIEFsbG9jIGZ1bmN0aW9uLiAqLwotICB1cGJfYWxsb2NfZnVuYyAqYWxsb2M7Ci0gIHZvaWQgKmFsbG9jX3VkOwotCi0gIC8qIEVycm9yLXJlcG9ydGluZyBmdW5jdGlvbi4gKi8KLSAgdXBiX2Vycm9yX2Z1bmMgKmVycjsKLSAgdm9pZCAqZXJyX3VkOwotCi0gIC8qIFVzZXJkYXRhIGZvciBkZWZhdWx0IGFsbG9jIGZ1bmMuICovCi0gIHZvaWQgKmRlZmF1bHRfYWxsb2NfdWQ7Ci0KLSAgLyogQ2xlYW51cCBlbnRyaWVzLiAgUG9pbnRlciB0byBhIGNsZWFudXBfZW50LCBkZWZpbmVkIGluIGVudi5jICovCi0gIHZvaWQgKmNsZWFudXBfaGVhZDsKLQotICAvKiBGb3IgZnV0dXJlIGV4cGFuc2lvbiwgc2luY2UgdGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3QgaXMgZXhwb3NlZCB0byB1c2Vycy4gKi8KLSAgdm9pZCAqZnV0dXJlMTsKLSAgdm9pZCAqZnV0dXJlMjsKLX07Ci0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi12b2lkIHVwYl9lbnZfaW5pdCh1cGJfZW52ICplKTsKLXZvaWQgdXBiX2Vudl91bmluaXQodXBiX2VudiAqZSk7Ci12b2lkIHVwYl9lbnZfc2V0YWxsb2NmdW5jKHVwYl9lbnYgKmUsIHVwYl9hbGxvY19mdW5jICpmdW5jLCB2b2lkICp1ZCk7Ci12b2lkIHVwYl9lbnZfc2V0ZXJyb3JmdW5jKHVwYl9lbnYgKmUsIHVwYl9lcnJvcl9mdW5jICpmdW5jLCB2b2lkICp1ZCk7Ci12b2lkIHVwYl9lbnZfcmVwb3J0ZXJyb3JzdG8odXBiX2VudiAqZSwgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLWJvb2wgdXBiX2Vudl9vayhjb25zdCB1cGJfZW52ICplKTsKLWJvb2wgdXBiX2Vudl9yZXBvcnRlcnJvcih1cGJfZW52ICplLCBjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpOwotdm9pZCAqdXBiX2Vudl9tYWxsb2ModXBiX2VudiAqZSwgc2l6ZV90IHNpemUpOwotdm9pZCAqdXBiX2Vudl9yZWFsbG9jKHVwYl9lbnYgKmUsIHZvaWQgKnB0ciwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplKTsKLWJvb2wgdXBiX2Vudl9hZGRjbGVhbnVwKHVwYl9lbnYgKmUsIHVwYl9jbGVhbnVwX2Z1bmMgKmZ1bmMsIHZvaWQgKnVkKTsKLXNpemVfdCB1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGNvbnN0IHVwYl9lbnYgKmUpOwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBBbiBhbGxvY2F0b3IgdGhhdCBhbGxvY2F0ZXMgZnJvbSBhbiBpbml0aWFsIG1lbW9yeSByZWdpb24gKGxpa2VseSB0aGUgc3RhY2spCi0gKiBiZWZvcmUgZmFsbGluZyBiYWNrIHRvIGFub3RoZXIgYWxsb2NhdG9yLiAqLwotY2xhc3MgdXBiOjpTZWVkZWRBbGxvY2F0b3IgewotIHB1YmxpYzoKLSAgU2VlZGVkQWxsb2NhdG9yKHZvaWQgKm1lbSwgc2l6ZV90IGxlbik7Ci0gIH5TZWVkZWRBbGxvY2F0b3IoKTsKLQotICAvKiBTZXQgYSBjdXN0b20gZmFsbGJhY2sgbWVtb3J5IGFsbG9jYXRpb24gZnVuY3Rpb24gZm9yIHRoZSBhbGxvY2F0b3IsIHRvIHVzZQotICAgKiBvbmNlIHRoZSBpbml0aWFsIHJlZ2lvbiBydW5zIG91dC4KLSAgICoKLSAgICogTWF5IE9OTFkgYmUgY2FsbGVkIGJlZm9yZSBHZXRBbGxvY2F0aW9uRnVuY3Rpb24oKS4gIElmIHRoaXMgaXMgbm90Ci0gICAqIGNhbGxlZCwgdGhlIHN5c3RlbSByZWFsbG9jKCkgd2lsbCBiZSB0aGUgZmFsbGJhY2sgYWxsb2NhdG9yLiAqLwotICB2b2lkIFNldEZhbGxiYWNrQWxsb2NhdG9yKHVwYl9hbGxvY19mdW5jICphbGxvYywgdm9pZCAqdWQpOwotCi0gIC8qIEdldHMgdGhlIGFsbG9jYXRpb24gZnVuY3Rpb24gZm9yIHRoaXMgYWxsb2NhdG9yLiAqLwotICB1cGJfYWxsb2NfZnVuYyogR2V0QWxsb2NhdGlvbkZ1bmN0aW9uKCk7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFNlZWRlZEFsbG9jYXRvcikKLQotI2Vsc2UKLXN0cnVjdCB1cGJfc2VlZGVkYWxsb2MgewotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0gIC8qIEZhbGxiYWNrIGFsbG9jIGZ1bmN0aW9uLiAgKi8KLSAgdXBiX2FsbG9jX2Z1bmMgKmFsbG9jOwotICB1cGJfY2xlYW51cF9mdW5jICphbGxvY19jbGVhbnVwOwotICB2b2lkICphbGxvY191ZDsKLSAgYm9vbCBuZWVkX2NsZWFudXA7Ci0gIGJvb2wgcmV0dXJuZWRfYWxsb2NmdW5jOwotCi0gIC8qIFVzZXJkYXRhIGZvciBkZWZhdWx0IGFsbG9jIGZ1bmMuICovCi0gIHZvaWQgKmRlZmF1bHRfYWxsb2NfdWQ7Ci0KLSAgLyogUG9pbnRlcnMgZm9yIHRoZSBpbml0aWFsIG1lbW9yeSByZWdpb24uICovCi0gIGNoYXIgKm1lbV9iYXNlOwotICBjaGFyICptZW1fcHRyOwotICBjaGFyICptZW1fbGltaXQ7Ci0KLSAgLyogRm9yIGZ1dHVyZSBleHBhbnNpb24sIHNpbmNlIHRoZSBzaXplIG9mIHRoaXMgc3RydWN0IGlzIGV4cG9zZWQgdG8gdXNlcnMuICovCi0gIHZvaWQgKmZ1dHVyZTE7Ci0gIHZvaWQgKmZ1dHVyZTI7Ci19OwotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotdm9pZCB1cGJfc2VlZGVkYWxsb2NfaW5pdCh1cGJfc2VlZGVkYWxsb2MgKmEsIHZvaWQgKm1lbSwgc2l6ZV90IGxlbik7Ci12b2lkIHVwYl9zZWVkZWRhbGxvY191bmluaXQodXBiX3NlZWRlZGFsbG9jICphKTsKLXZvaWQgdXBiX3NlZWRlZGFsbG9jX3NldGZhbGxiYWNrYWxsb2ModXBiX3NlZWRlZGFsbG9jICphLCB1cGJfYWxsb2NfZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqdWQpOwotdXBiX2FsbG9jX2Z1bmMgKnVwYl9zZWVkZWRhbGxvY19nZXRhbGxvY2Z1bmModXBiX3NlZWRlZGFsbG9jICphKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYiB7Ci0KLWlubGluZSBFbnZpcm9ubWVudDo6RW52aXJvbm1lbnQoKSB7Ci0gIHVwYl9lbnZfaW5pdCh0aGlzKTsKLX0KLWlubGluZSBFbnZpcm9ubWVudDo6fkVudmlyb25tZW50KCkgewotICB1cGJfZW52X3VuaW5pdCh0aGlzKTsKLX0KLWlubGluZSB2b2lkIEVudmlyb25tZW50OjpTZXRBbGxvY2F0aW9uRnVuY3Rpb24odXBiX2FsbG9jX2Z1bmMgKmFsbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1ZCkgewotICB1cGJfZW52X3NldGFsbG9jZnVuYyh0aGlzLCBhbGxvYywgdWQpOwotfQotaW5saW5lIHZvaWQgRW52aXJvbm1lbnQ6OlNldEVycm9yRnVuY3Rpb24odXBiX2Vycm9yX2Z1bmMgKmZ1bmMsIHZvaWQgKnVkKSB7Ci0gIHVwYl9lbnZfc2V0ZXJyb3JmdW5jKHRoaXMsIGZ1bmMsIHVkKTsKLX0KLWlubGluZSB2b2lkIEVudmlyb25tZW50OjpSZXBvcnRFcnJvcnNUbyhTdGF0dXMqIHN0YXR1cykgewotICB1cGJfZW52X3JlcG9ydGVycm9yc3RvKHRoaXMsIHN0YXR1cyk7Ci19Ci1pbmxpbmUgYm9vbCBFbnZpcm9ubWVudDo6b2soKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZW52X29rKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRW52aXJvbm1lbnQ6OlJlcG9ydEVycm9yKGNvbnN0IFN0YXR1cyogc3RhdHVzKSB7Ci0gIHJldHVybiB1cGJfZW52X3JlcG9ydGVycm9yKHRoaXMsIHN0YXR1cyk7Ci19Ci1pbmxpbmUgdm9pZCAqRW52aXJvbm1lbnQ6Ok1hbGxvYyhzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gdXBiX2Vudl9tYWxsb2ModGhpcywgc2l6ZSk7Ci19Ci1pbmxpbmUgdm9pZCAqRW52aXJvbm1lbnQ6OlJlYWxsb2Modm9pZCAqcHRyLCBzaXplX3Qgb2xkc2l6ZSwgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIHVwYl9lbnZfcmVhbGxvYyh0aGlzLCBwdHIsIG9sZHNpemUsIHNpemUpOwotfQotaW5saW5lIGJvb2wgRW52aXJvbm1lbnQ6OkFkZENsZWFudXAodXBiX2NsZWFudXBfZnVuYyAqZnVuYywgdm9pZCAqdWQpIHsKLSAgcmV0dXJuIHVwYl9lbnZfYWRkY2xlYW51cCh0aGlzLCBmdW5jLCB1ZCk7Ci19Ci1pbmxpbmUgc2l6ZV90IEVudmlyb25tZW50OjpCeXRlc0FsbG9jYXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQodGhpcyk7Ci19Ci0KLWlubGluZSBTZWVkZWRBbGxvY2F0b3I6OlNlZWRlZEFsbG9jYXRvcih2b2lkICptZW0sIHNpemVfdCBsZW4pIHsKLSAgdXBiX3NlZWRlZGFsbG9jX2luaXQodGhpcywgbWVtLCBsZW4pOwotfQotaW5saW5lIFNlZWRlZEFsbG9jYXRvcjo6flNlZWRlZEFsbG9jYXRvcigpIHsKLSAgdXBiX3NlZWRlZGFsbG9jX3VuaW5pdCh0aGlzKTsKLX0KLWlubGluZSB2b2lkIFNlZWRlZEFsbG9jYXRvcjo6U2V0RmFsbGJhY2tBbGxvY2F0b3IodXBiX2FsbG9jX2Z1bmMgKmFsbG9jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICp1ZCkgewotICB1cGJfc2VlZGVkYWxsb2Nfc2V0ZmFsbGJhY2thbGxvYyh0aGlzLCBhbGxvYywgdWQpOwotfQotaW5saW5lIHVwYl9hbGxvY19mdW5jICpTZWVkZWRBbGxvY2F0b3I6OkdldEFsbG9jYXRpb25GdW5jdGlvbigpIHsKLSAgcmV0dXJuIHVwYl9zZWVkZWRhbGxvY19nZXRhbGxvY2Z1bmModGhpcyk7Ci19Ci0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIFVQQl9FTlZfSF8gKi8KLS8qCi0qKiB1cGI6OlNpbmsgKHVwYl9zaW5rKQotKiogdXBiOjpCeXRlc1NpbmsgKHVwYl9ieXRlc3NpbmspCi0qKgotKiogQSB1cGJfc2luayBpcyBhbiBvYmplY3QgdGhhdCBiaW5kcyBhIHVwYl9oYW5kbGVycyBvYmplY3QgdG8gc29tZSBydW50aW1lCi0qKiBzdGF0ZS4gIEl0IGlzIHRoZSBvYmplY3QgdGhhdCBjYW4gYWN0dWFsbHkgcmVjZWl2ZSBkYXRhIHZpYSB0aGUgdXBiX2hhbmRsZXJzCi0qKiBpbnRlcmZhY2UuCi0qKgotKiogVW5saWtlIHVwYl9kZWYgYW5kIHVwYl9oYW5kbGVycywgdXBiX3NpbmsgaXMgbmV2ZXIgZnJvemVuLCBpbW11dGFibGUsIG9yCi0qKiB0aHJlYWQtc2FmZS4gIFlvdSBjYW4gY3JlYXRlIGFzIG1hbnkgb2YgdGhlbSBhcyB5b3Ugd2FudCwgYnV0IGVhY2ggb25lIG1heQotKiogb25seSBiZSB1c2VkIGluIGEgc2luZ2xlIHRocmVhZCBhdCBhIHRpbWUuCi0qKgotKiogSWYgd2UgY29tcGFyZSB3aXRoIGNsYXNzLWJhc2VkIE9PUCwgYSB5b3UgY2FuIHRoaW5rIG9mIGEgdXBiX2RlZiBhcyBhbgotKiogYWJzdHJhY3QgYmFzZSBjbGFzcywgYSB1cGJfaGFuZGxlcnMgYXMgYSBjb25jcmV0ZSBkZXJpdmVkIGNsYXNzLCBhbmQgYQotKiogdXBiX3NpbmsgYXMgYW4gb2JqZWN0IChjbGFzcyBpbnN0YW5jZSkuCi0qLwotCi0jaWZuZGVmIFVQQl9TSU5LX0gKLSNkZWZpbmUgVVBCX1NJTktfSAotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1jbGFzcyBCdWZmZXJTb3VyY2U7Ci1jbGFzcyBCeXRlc1Npbms7Ci1jbGFzcyBTaW5rOwotfQotI2VuZGlmCi0KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpCdWZmZXJTb3VyY2UsIHVwYl9idWZzcmMpCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6Qnl0ZXNTaW5rLCB1cGJfYnl0ZXNzaW5rKQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OlNpbmssIHVwYl9zaW5rKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQSB1cGI6OlNpbmsgaXMgYW4gb2JqZWN0IHRoYXQgYmluZHMgYSB1cGI6OkhhbmRsZXJzIG9iamVjdCB0byBzb21lIHJ1bnRpbWUKLSAqIHN0YXRlLiAgSXQgcmVwcmVzZW50cyBhbiBlbmRwb2ludCB0byB3aGljaCBkYXRhIGNhbiBiZSBzZW50LgotICoKLSAqIFRPRE8oaGFiZXJtYW4pOiByaWdodCBub3cgYWxsIG9mIHRoZXNlIGZ1bmN0aW9ucyB0YWtlIHNlbGVjdG9ycy4gIFNob3VsZCB0aGV5Ci0gKiB0YWtlIHNlbGVjdG9yYmFzZSBpbnN0ZWFkPwotICoKLSAqIGllLiBpbnN0ZWFkIG9mIGNhbGxpbmc6Ci0gKiAgIHNpbmstPlN0YXJ0U3RyaW5nKEZPT19GSUVMRF9TVEFSVF9TVFJJTkcsIC4uLikKLSAqIGEgc2VsZWN0b3IgYmFzZSB3b3VsZCBsZXQgeW91IHNheToKLSAqICAgc2luay0+U3RhcnRTdHJpbmcoRk9PX0ZJRUxELCAuLi4pCi0gKgotICogVGhpcyB3b3VsZCBtYWtlIGNhbGwgc2l0ZXMgYSBsaXR0bGUgbmljZXIgYW5kIHJlcXVpcmUgZW1pdHRpbmcgZmV3ZXIgc2VsZWN0b3IKLSAqIGRlZmluaXRpb25zIGluIC5oIGZpbGVzLgotICoKLSAqIEJ1dCB0aGUgY3VycmVudCBzY2hlbWUgaGFzIHRoZSBiZW5lZml0IHRoYXQgeW91IGNhbiByZXRyaWV2ZSBhIGZ1bmN0aW9uCi0gKiBwb2ludGVyIGZvciBhbnkgaGFuZGxlciB3aXRoIGhhbmRsZXJzLT5HZXRIYW5kbGVyKHNlbGVjdG9yKSwgd2l0aG91dCBoYXZpbmcKLSAqIHRvIGhhdmUgYSBzZXBhcmF0ZSBHZXRIYW5kbGVyKCkgZnVuY3Rpb24gZm9yIGVhY2ggaGFuZGxlciB0eXBlLiAgVGhlIEpJVAotICogY29tcGlsZXIgdXNlcyB0aGlzLiAgVG8gYWNjb21tb2RhdGUgd2UnZCBoYXZlIHRvIGV4cG9zZSBhIHNlcGFyYXRlCi0gKiBHZXRIYW5kbGVyKCkgZm9yIGV2ZXJ5IGhhbmRsZXIgdHlwZS4KLSAqCi0gKiBBbHNvIHRvIHBvbmRlcjogc2VsZWN0b3JzIHJpZ2h0IG5vdyBhcmUgaW5kZXBlbmRlbnQgb2YgYSBzcGVjaWZpYyBIYW5kbGVycwotICogaW5zdGFuY2UuICBJbiBvdGhlciB3b3JkcywgdGhleSBhbGxvY2F0ZSBhIG51bWJlciB0byBldmVyeSBwb3NzaWJsZSBoYW5kbGVyCi0gKiB0aGF0ICpjb3VsZCogYmUgcmVnaXN0ZXJlZCwgd2l0aG91dCBrbm93aW5nIGFueXRoaW5nIGFib3V0IHdoYXQgaGFuZGxlcnMKLSAqICphcmUqIHJlZ2lzdGVyZWQuICBUaGF0IG1lYW5zIHRoYXQgdXNpbmcgc2VsZWN0b3JzIGFzIHRhYmxlIG9mZnNldHMgcHJvaGliaXRzCi0gKiB1cyBmcm9tIGNvbXBhY3RpbmcgdGhlIGhhbmRsZXIgdGFibGUgYXQgRnJlZXplKCkgdGltZS4gIElmIHRoZSB0YWJsZSBpcyB2ZXJ5Ci0gKiBzcGFyc2UsIHRoaXMgY291bGQgYmUgd2FzdGVmdWwuCi0gKgotICogSGF2aW5nIGFub3RoZXIgc2VsZWN0b3ItbGlrZSB0aGluZyB0aGF0IGlzIHNwZWNpZmljIHRvIGEgSGFuZGxlcnMgaW5zdGFuY2UKLSAqIHdvdWxkIGFsbG93IHRoaXMgY29tcGFjdGluZywgYnV0IHRoZW4gaXQgd291bGQgYmUgaW1wb3NzaWJsZSB0byB3cml0ZSBjb2RlCi0gKiBhaGVhZC1vZi10aW1lIHRoYXQgY2FuIGJlIGJvdW5kIHRvIGFueSBIYW5kbGVycyBpbnN0YW5jZSBhdCBydW50aW1lLiAgRm9yCi0gKiBleGFtcGxlLCBhIC5wcm90byBmaWxlIHBhcnNlciB3cml0dGVuIGFzIHN0cmFpZ2h0IEMgd2lsbCBub3Qga25vdyB3aGF0Ci0gKiBIYW5kbGVycyBpdCB3aWxsIGJlIGJvdW5kIHRvLCBzbyB3aGVuIGl0IGNhbGxzIHNpbmstPlN0YXJ0U3RyaW5nKCkgd2hhdAotICogc2VsZWN0b3Igd2lsbCBpdCBwYXNzPyAgSXQgbmVlZHMgYSBzZWxlY3RvciBsaWtlIHdlIGhhdmUgdG9kYXksIHRoYXQgaXMKLSAqIGluZGVwZW5kZW50IG9mIGFueSBwYXJ0aWN1bGFyIHVwYjo6SGFuZGxlcnMuCi0gKgotICogSXMgdGhlcmUgYSB3YXkgdGhlbiB0byBhbGxvdyBIYW5kbGVycyB0YWJsZSBjb21wYWN0aW9uPyAqLwotY2xhc3MgdXBiOjpTaW5rIHsKLSBwdWJsaWM6Ci0gIC8qIENvbnN0cnVjdG9yIHdpdGggbm8gaW5pdGlhbGl6YXRpb247IG11c3QgYmUgUmVzZXQoKSBiZWZvcmUgdXNlLiAqLwotICBTaW5rKCkge30KLQotICAvKiBDb25zdHJ1Y3RzIGEgbmV3IHNpbmsgZm9yIHRoZSBnaXZlbiBmcm96ZW4gaGFuZGxlcnMgYW5kIGNsb3N1cmUuCi0gICAqCi0gICAqIFRPRE86IG9uY2UgdGhlIEhhbmRsZXJzIGtub3cgdGhlIGV4cGVjdGVkIGNsb3N1cmUgdHlwZSwgdmVyaWZ5IHRoYXQgVAotICAgKiBtYXRjaGVzIGl0LiAqLwotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gU2luayhjb25zdCBIYW5kbGVycyogaGFuZGxlcnMsIFQqIGNsb3N1cmUpOwotCi0gIC8qIFJlc2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNpbmsuICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIFJlc2V0KGNvbnN0IEhhbmRsZXJzKiBoYW5kbGVycywgVCogY2xvc3VyZSk7Ci0KLSAgLyogUmV0dXJucyB0aGUgdG9wLWxldmVsIG9iamVjdCB0aGF0IGlzIGJvdW5kIHRvIHRoaXMgc2luay4KLSAgICoKLSAgICogVE9ETzogb25jZSB0aGUgSGFuZGxlcnMga25vdyB0aGUgZXhwZWN0ZWQgY2xvc3VyZSB0eXBlLCB2ZXJpZnkgdGhhdCBUCi0gICAqIG1hdGNoZXMgaXQuICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPiBUKiBHZXRPYmplY3QoKSBjb25zdDsKLQotICAvKiBGdW5jdGlvbnMgZm9yIHB1c2hpbmcgZGF0YSBpbnRvIHRoZSBzaW5rLgotICAgKgotICAgKiBUaGVzZSByZXR1cm4gZmFsc2UgaWYgcHJvY2Vzc2luZyBzaG91bGQgc3RvcCAoZWl0aGVyIGR1ZSB0byBlcnJvciBvciBqdXN0Ci0gICAqIHRvIHN1c3BlbmQpLgotICAgKgotICAgKiBUaGVzZSBtYXkgbm90IGJlIGNhbGxlZCBmcm9tIHdpdGhpbiBvbmUgb2YgdGhlIHNhbWUgc2luaydzIGhhbmRsZXJzIChpbgotICAgKiBvdGhlciB3b3JkcywgaGFuZGxlcnMgYXJlIG5vdCByZS1lbnRyYW50KS4gKi8KLQotICAvKiBTaG91bGQgYmUgY2FsbGVkIGF0IHRoZSBzdGFydCBhbmQgZW5kIG9mIGV2ZXJ5IG1lc3NhZ2U7IGJvdGggdGhlIHRvcC1sZXZlbAotICAgKiBtZXNzYWdlIGFuZCBzdWJtZXNzYWdlcy4gIFRoaXMgbWVhbnMgdGhhdCBzdWJtZXNzYWdlcyBzaG91bGQgdXNlIHRoZQotICAgKiBmb2xsb3dpbmcgc2VxdWVuY2U6Ci0gICAqICAgc2luay0+U3RhcnRTdWJNZXNzYWdlKHN0YXJ0c3VibXNnX3NlbGVjdG9yKTsKLSAgICogICBzaW5rLT5TdGFydE1lc3NhZ2UoKTsKLSAgICogICAvLyAuLi4KLSAgICogICBzaW5rLT5FbmRNZXNzYWdlKCZzdGF0dXMpOwotICAgKiAgIHNpbmstPkVuZFN1Yk1lc3NhZ2UoZW5kc3VibXNnX3NlbGVjdG9yKTsgKi8KLSAgYm9vbCBTdGFydE1lc3NhZ2UoKTsKLSAgYm9vbCBFbmRNZXNzYWdlKFN0YXR1cyogc3RhdHVzKTsKLQotICAvKiBQdXR0aW5nIG9mIGluZGl2aWR1YWwgdmFsdWVzLiAgVGhlc2Ugd29yayBmb3IgYm90aCByZXBlYXRlZCBhbmQKLSAgICogbm9uLXJlcGVhdGVkIGZpZWxkcywgYnV0IGZvciByZXBlYXRlZCBmaWVsZHMgeW91IG11c3Qgd3JhcCB0aGVtIGluCi0gICAqIGNhbGxzIHRvIFN0YXJ0U2VxdWVuY2UoKS9FbmRTZXF1ZW5jZSgpLiAqLwotICBib29sIFB1dEludDMyKEhhbmRsZXJzOjpTZWxlY3RvciBzLCBpbnQzMl90IHZhbCk7Ci0gIGJvb2wgUHV0SW50NjQoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIGludDY0X3QgdmFsKTsKLSAgYm9vbCBQdXRVSW50MzIoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIHVpbnQzMl90IHZhbCk7Ci0gIGJvb2wgUHV0VUludDY0KEhhbmRsZXJzOjpTZWxlY3RvciBzLCB1aW50NjRfdCB2YWwpOwotICBib29sIFB1dEZsb2F0KEhhbmRsZXJzOjpTZWxlY3RvciBzLCBmbG9hdCB2YWwpOwotICBib29sIFB1dERvdWJsZShIYW5kbGVyczo6U2VsZWN0b3IgcywgZG91YmxlIHZhbCk7Ci0gIGJvb2wgUHV0Qm9vbChIYW5kbGVyczo6U2VsZWN0b3IgcywgYm9vbCB2YWwpOwotCi0gIC8qIFB1dHRpbmcgb2Ygc3RyaW5nL2J5dGVzIHZhbHVlcy4gIEVhY2ggc3RyaW5nIGNhbiBjb25zaXN0IG9mIHplcm8gb3IgbW9yZQotICAgKiBub24tY29udGlndW91cyBidWZmZXJzIG9mIGRhdGEuCi0gICAqCi0gICAqIEZvciBTdGFydFN0cmluZygpLCB0aGUgZnVuY3Rpb24gd2lsbCB3cml0ZSBhIHNpbmsgZm9yIHRoZSBzdHJpbmcgdG8gInN1Yi4iCi0gICAqIFRoZSBzdWItc2luayBtdXN0IGJlIHVzZWQgZm9yIGFueS9hbGwgUHV0U3RyaW5nQnVmZmVyKCkgY2FsbHMuICovCi0gIGJvb2wgU3RhcnRTdHJpbmcoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIHNpemVfdCBzaXplX2hpbnQsIFNpbmsqIHN1Yik7Ci0gIHNpemVfdCBQdXRTdHJpbmdCdWZmZXIoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBCdWZmZXJIYW5kbGUgKmhhbmRsZSk7Ci0gIGJvb2wgRW5kU3RyaW5nKEhhbmRsZXJzOjpTZWxlY3RvciBzKTsKLQotICAvKiBGb3Igc3VibWVzc2FnZSBmaWVsZHMuCi0gICAqCi0gICAqIEZvciBTdGFydFN1Yk1lc3NhZ2UoKSwgdGhlIGZ1bmN0aW9uIHdpbGwgd3JpdGUgYSBzaW5rIGZvciB0aGUgc3RyaW5nIHRvCi0gICAqICJzdWIuIiBUaGUgc3ViLXNpbmsgbXVzdCBiZSB1c2VkIGZvciBhbnkvYWxsIGhhbmRsZXJzIGNhbGxlZCB3aXRoaW4gdGhlCi0gICAqIHN1Ym1lc3NhZ2UuICovCi0gIGJvb2wgU3RhcnRTdWJNZXNzYWdlKEhhbmRsZXJzOjpTZWxlY3RvciBzLCBTaW5rKiBzdWIpOwotICBib29sIEVuZFN1Yk1lc3NhZ2UoSGFuZGxlcnM6OlNlbGVjdG9yIHMpOwotCi0gIC8qIEZvciByZXBlYXRlZCBmaWVsZHMgb2YgYW55IHR5cGUsIHRoZSBzZXF1ZW5jZSBvZiB2YWx1ZXMgbXVzdCBiZSB3cmFwcGVkIGluCi0gICAqIHRoZXNlIGNhbGxzLgotICAgKgotICAgKiBGb3IgU3RhcnRTZXF1ZW5jZSgpLCB0aGUgZnVuY3Rpb24gd2lsbCB3cml0ZSBhIHNpbmsgZm9yIHRoZSBzdHJpbmcgdG8KLSAgICogInN1Yi4iIFRoZSBzdWItc2luayBtdXN0IGJlIHVzZWQgZm9yIGFueS9hbGwgaGFuZGxlcnMgY2FsbGVkIHdpdGhpbiB0aGUKLSAgICogc2VxdWVuY2UuICovCi0gIGJvb2wgU3RhcnRTZXF1ZW5jZShIYW5kbGVyczo6U2VsZWN0b3IgcywgU2luayogc3ViKTsKLSAgYm9vbCBFbmRTZXF1ZW5jZShIYW5kbGVyczo6U2VsZWN0b3Igcyk7Ci0KLSAgLyogQ29weSBhbmQgYXNzaWduIHNwZWNpZmljYWxseSBhbGxvd2VkLgotICAgKiBXZSBkb24ndCBldmVuIGJvdGhlciBtYWtpbmcgdGhlc2UgbWVtYmVycyBwcml2YXRlIGJlY2F1c2Ugc28gbWFueQotICAgKiBmdW5jdGlvbnMgbmVlZCB0aGVtIGFuZCB0aGlzIGlzIG1haW5seSBqdXN0IGEgZHVtYiBkYXRhIGNvbnRhaW5lciBhbnl3YXkuCi0gICAqLwotI2Vsc2UKLXN0cnVjdCB1cGJfc2luayB7Ci0jZW5kaWYKLSAgY29uc3QgdXBiX2hhbmRsZXJzICpoYW5kbGVyczsKLSAgdm9pZCAqY2xvc3VyZTsKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotY2xhc3MgdXBiOjpCeXRlc1NpbmsgewotIHB1YmxpYzoKLSAgQnl0ZXNTaW5rKCkge30KLQotICAvKiBDb25zdHJ1Y3RzIGEgbmV3IHNpbmsgZm9yIHRoZSBnaXZlbiBmcm96ZW4gaGFuZGxlcnMgYW5kIGNsb3N1cmUuCi0gICAqCi0gICAqIFRPRE8oaGFiZXJtYW4pOiBvbmNlIHRoZSBIYW5kbGVycyBrbm93IHRoZSBleHBlY3RlZCBjbG9zdXJlIHR5cGUsIHZlcmlmeQotICAgKiB0aGF0IFQgbWF0Y2hlcyBpdC4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+IEJ5dGVzU2luayhjb25zdCBCeXRlc0hhbmRsZXIqIGhhbmRsZXIsIFQqIGNsb3N1cmUpOwotCi0gIC8qIFJlc2V0cyB0aGUgdmFsdWUgb2YgdGhlIHNpbmsuICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIFJlc2V0KGNvbnN0IEJ5dGVzSGFuZGxlciogaGFuZGxlciwgVCogY2xvc3VyZSk7Ci0KLSAgYm9vbCBTdGFydChzaXplX3Qgc2l6ZV9oaW50LCB2b2lkICoqc3ViYyk7Ci0gIHNpemVfdCBQdXRCdWZmZXIodm9pZCAqc3ViYywgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckhhbmRsZSAqaGFuZGxlKTsKLSAgYm9vbCBFbmQoKTsKLSNlbHNlCi1zdHJ1Y3QgdXBiX2J5dGVzc2luayB7Ci0jZW5kaWYKLSAgY29uc3QgdXBiX2J5dGVzaGFuZGxlciAqaGFuZGxlcjsKLSAgdm9pZCAqY2xvc3VyZTsKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBBIGNsYXNzIGZvciBwdXNoaW5nIGEgZmxhdCBidWZmZXIgb2YgZGF0YSB0byBhIEJ5dGVzU2luay4KLSAqIFlvdSBjYW4gY29uc3RydWN0IGFuIGluc3RhbmNlIG9mIHRoaXMgdG8gZ2V0IGEgcmVzdW1hYmxlIHNvdXJjZSwKLSAqIG9yIGp1c3QgY2FsbCB0aGUgc3RhdGljIFB1dEJ1ZmZlcigpIHRvIGRvIGEgbm9uLXJlc3VtYWJsZSBwdXNoIGFsbCBpbiBvbmUKLSAqIGdvLiAqLwotY2xhc3MgdXBiOjpCdWZmZXJTb3VyY2UgewotIHB1YmxpYzoKLSAgQnVmZmVyU291cmNlKCk7Ci0gIEJ1ZmZlclNvdXJjZShjb25zdCBjaGFyKiBidWYsIHNpemVfdCBsZW4sIEJ5dGVzU2luayogc2luayk7Ci0KLSAgLyogUmV0dXJucyB0cnVlIGlmIHRoZSBlbnRpcmUgYnVmZmVyIHdhcyBwdXNoZWQgc3VjY2Vzc2Z1bGx5LiAgT3RoZXJ3aXNlIHRoZQotICAgKiBuZXh0IGNhbGwgdG8gUHV0TmV4dCgpIHdpbGwgcmVzdW1lIHdoZXJlIHRoZSBwcmV2aW91cyBvbmUgbGVmdCBvZmYuCi0gICAqIFRPRE8oaGFiZXJtYW4pOiBpbXBsZW1lbnQgdGhpcy4gKi8KLSAgYm9vbCBQdXROZXh0KCk7Ci0KLSAgLyogQSBzdGF0aWMgdmVyc2lvbjsgd2l0aCB0aGlzIHZlcnNpb24gaXMgaXQgbm90IHBvc3NpYmxlIHRvIHJlc3VtZSBpbiB0aGUKLSAgICogY2FzZSBvZiBmYWlsdXJlIG9yIGEgcGFydGlhbGx5LWNvbnN1bWVkIGJ1ZmZlci4gKi8KLSAgc3RhdGljIGJvb2wgUHV0QnVmZmVyKGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbiwgQnl0ZXNTaW5rKiBzaW5rKTsKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RhdGljIGJvb2wgUHV0QnVmZmVyKGNvbnN0IFQmIHN0ciwgQnl0ZXNTaW5rKiBzaW5rKSB7Ci0gICAgcmV0dXJuIFB1dEJ1ZmZlcihzdHIuY19zdHIoKSwgc3RyLnNpemUoKSwgc2luayk7Ci0gIH0KLSNlbHNlCi1zdHJ1Y3QgdXBiX2J1ZnNyYyB7Ci0gIGNoYXIgZHVtbXk7Ci0jZW5kaWYKLX07Ci0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBJbmxpbmUgZGVmaW5pdGlvbnMuICovCi0KLVVQQl9JTkxJTkUgdm9pZCB1cGJfYnl0ZXNzaW5rX3Jlc2V0KHVwYl9ieXRlc3NpbmsgKnMsIGNvbnN0IHVwYl9ieXRlc2hhbmRsZXIgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIHMtPmhhbmRsZXIgPSBoOwotICBzLT5jbG9zdXJlID0gY2xvc3VyZTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9ieXRlc3Npbmtfc3RhcnQodXBiX2J5dGVzc2luayAqcywgc2l6ZV90IHNpemVfaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKipzdWJjKSB7Ci0gIHR5cGVkZWYgdXBiX3N0YXJ0c3RyX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKnN0YXJ0OwotICAqc3ViYyA9IHMtPmNsb3N1cmU7Ci0gIGlmICghcy0+aGFuZGxlcikgcmV0dXJuIHRydWU7Ci0gIHN0YXJ0ID0gKGZ1bmMgKilzLT5oYW5kbGVyLT50YWJsZVtVUEJfU1RBUlRTVFJfU0VMRUNUT1JdLmZ1bmM7Ci0KLSAgaWYgKCFzdGFydCkgcmV0dXJuIHRydWU7Ci0gICpzdWJjID0gc3RhcnQocy0+Y2xvc3VyZSwgdXBiX2hhbmRsZXJhdHRyX2hhbmRsZXJkYXRhKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcy0+aGFuZGxlci0+dGFibGVbVVBCX1NUQVJUU1RSX1NFTEVDVE9SXS5hdHRyKSwKLSAgICAgICAgICAgICAgICBzaXplX2hpbnQpOwotICByZXR1cm4gKnN1YmMgIT0gTlVMTDsKLX0KLQotVVBCX0lOTElORSBzaXplX3QgdXBiX2J5dGVzc2lua19wdXRidWYodXBiX2J5dGVzc2luayAqcywgdm9pZCAqc3ViYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfYnVmaGFuZGxlKiBoYW5kbGUpIHsKLSAgdHlwZWRlZiB1cGJfc3RyaW5nX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKnB1dGJ1ZjsKLSAgaWYgKCFzLT5oYW5kbGVyKSByZXR1cm4gdHJ1ZTsKLSAgcHV0YnVmID0gKGZ1bmMgKilzLT5oYW5kbGVyLT50YWJsZVtVUEJfU1RSSU5HX1NFTEVDVE9SXS5mdW5jOwotCi0gIGlmICghcHV0YnVmKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIHB1dGJ1ZihzdWJjLCB1cGJfaGFuZGxlcmF0dHJfaGFuZGxlcmRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5oYW5kbGVyLT50YWJsZVtVUEJfU1RSSU5HX1NFTEVDVE9SXS5hdHRyKSwKLSAgICAgICAgICAgICAgICBidWYsIHNpemUsIGhhbmRsZSk7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfYnl0ZXNzaW5rX2VuZCh1cGJfYnl0ZXNzaW5rICpzKSB7Ci0gIHR5cGVkZWYgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKmVuZDsKLSAgaWYgKCFzLT5oYW5kbGVyKSByZXR1cm4gdHJ1ZTsKLSAgZW5kID0gKGZ1bmMgKilzLT5oYW5kbGVyLT50YWJsZVtVUEJfRU5EU1RSX1NFTEVDVE9SXS5mdW5jOwotCi0gIGlmICghZW5kKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGVuZChzLT5jbG9zdXJlLAotICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0cl9oYW5kbGVyZGF0YSgKLSAgICAgICAgICAgICAgICAgJnMtPmhhbmRsZXItPnRhYmxlW1VQQl9FTkRTVFJfU0VMRUNUT1JdLmF0dHIpKTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9idWZzcmNfcHV0YnVmKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfYnl0ZXNzaW5rICpzaW5rKSB7Ci0gIHZvaWQgKnN1YmM7Ci0gIGJvb2wgcmV0OwotICB1cGJfYnVmaGFuZGxlIGhhbmRsZTsKLSAgdXBiX2J1ZmhhbmRsZV9pbml0KCZoYW5kbGUpOwotICB1cGJfYnVmaGFuZGxlX3NldGJ1ZigmaGFuZGxlLCBidWYsIDApOwotICByZXQgPSB1cGJfYnl0ZXNzaW5rX3N0YXJ0KHNpbmssIGxlbiwgJnN1YmMpOwotICBpZiAocmV0ICYmIGxlbiAhPSAwKSB7Ci0gICAgcmV0ID0gKHVwYl9ieXRlc3NpbmtfcHV0YnVmKHNpbmssIHN1YmMsIGJ1ZiwgbGVuLCAmaGFuZGxlKSA+PSBsZW4pOwotICB9Ci0gIGlmIChyZXQpIHsKLSAgICByZXQgPSB1cGJfYnl0ZXNzaW5rX2VuZChzaW5rKTsKLSAgfQotICB1cGJfYnVmaGFuZGxlX3VuaW5pdCgmaGFuZGxlKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotI2RlZmluZSBQVVRWQUwodHlwZSwgY3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSBib29sIHVwYl9zaW5rX3B1dCMjdHlwZSh1cGJfc2luayAqcywgdXBiX3NlbGVjdG9yX3Qgc2VsLCAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGUgdmFsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHR5cGVkZWYgdXBiXyMjdHlwZSMjX2hhbmRsZXJmdW5jIGZ1bmN0eXBlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmdW5jdHlwZSAqZnVuYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3Qgdm9pZCAqaGQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghcy0+aGFuZGxlcnMpIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmdW5jID0gKGZ1bmN0eXBlICopdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIocy0+aGFuZGxlcnMsIHNlbCk7ICAgICAgICAgICAgICBcCi0gICAgaWYgKCFmdW5jKSByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBzZWwpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gZnVuYyhzLT5jbG9zdXJlLCBoZCwgdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotUFVUVkFMKGludDMyLCAgaW50MzJfdCkKLVBVVFZBTChpbnQ2NCwgIGludDY0X3QpCi1QVVRWQUwodWludDMyLCB1aW50MzJfdCkKLVBVVFZBTCh1aW50NjQsIHVpbnQ2NF90KQotUFVUVkFMKGZsb2F0LCAgZmxvYXQpCi1QVVRWQUwoZG91YmxlLCBkb3VibGUpCi1QVVRWQUwoYm9vbCwgICBib29sKQotI3VuZGVmIFBVVFZBTAotCi1VUEJfSU5MSU5FIHZvaWQgdXBiX3NpbmtfcmVzZXQodXBiX3NpbmsgKnMsIGNvbnN0IHVwYl9oYW5kbGVycyAqaCwgdm9pZCAqYykgewotICBzLT5oYW5kbGVycyA9IGg7Ci0gIHMtPmNsb3N1cmUgPSBjOwotfQotCi1VUEJfSU5MSU5FIHNpemVfdCB1cGJfc2lua19wdXRzdHJpbmcodXBiX3NpbmsgKnMsIHVwYl9zZWxlY3Rvcl90IHNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpidWYsIHNpemVfdCBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB0eXBlZGVmIHVwYl9zdHJpbmdfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqaGFuZGxlcjsKLSAgY29uc3Qgdm9pZCAqaGQ7Ci0gIGlmICghcy0+aGFuZGxlcnMpIHJldHVybiBuOwotICBoYW5kbGVyID0gKGZ1bmMgKil1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihzLT5oYW5kbGVycywgc2VsKTsKLQotICBpZiAoIWhhbmRsZXIpIHJldHVybiBuOwotICBoZCA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShzLT5oYW5kbGVycywgc2VsKTsKLSAgcmV0dXJuIGhhbmRsZXIocy0+Y2xvc3VyZSwgaGQsIGJ1ZiwgbiwgaGFuZGxlKTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9zaW5rX3N0YXJ0bXNnKHVwYl9zaW5rICpzKSB7Ci0gIHR5cGVkZWYgdXBiX3N0YXJ0bXNnX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKnN0YXJ0bXNnOwotICBjb25zdCB2b2lkICpoZDsKLSAgaWYgKCFzLT5oYW5kbGVycykgcmV0dXJuIHRydWU7Ci0gIHN0YXJ0bXNnID0gKGZ1bmMqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBVUEJfU1RBUlRNU0dfU0VMRUNUT1IpOwotCi0gIGlmICghc3RhcnRtc2cpIHJldHVybiB0cnVlOwotICBoZCA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShzLT5oYW5kbGVycywgVVBCX1NUQVJUTVNHX1NFTEVDVE9SKTsKLSAgcmV0dXJuIHN0YXJ0bXNnKHMtPmNsb3N1cmUsIGhkKTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9zaW5rX2VuZG1zZyh1cGJfc2luayAqcywgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIHR5cGVkZWYgdXBiX2VuZG1zZ19oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICplbmRtc2c7Ci0gIGNvbnN0IHZvaWQgKmhkOwotICBpZiAoIXMtPmhhbmRsZXJzKSByZXR1cm4gdHJ1ZTsKLSAgZW5kbXNnID0gKGZ1bmMgKil1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihzLT5oYW5kbGVycywgVVBCX0VORE1TR19TRUxFQ1RPUik7Ci0KLSAgaWYgKCFlbmRtc2cpIHJldHVybiB0cnVlOwotICBoZCA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShzLT5oYW5kbGVycywgVVBCX0VORE1TR19TRUxFQ1RPUik7Ci0gIHJldHVybiBlbmRtc2cocy0+Y2xvc3VyZSwgaGQsIHN0YXR1cyk7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc2lua19zdGFydHNlcSh1cGJfc2luayAqcywgdXBiX3NlbGVjdG9yX3Qgc2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zaW5rICpzdWIpIHsKLSAgdHlwZWRlZiB1cGJfc3RhcnRmaWVsZF9oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICpzdGFydHNlcTsKLSAgY29uc3Qgdm9pZCAqaGQ7Ci0gIHN1Yi0+Y2xvc3VyZSA9IHMtPmNsb3N1cmU7Ci0gIHN1Yi0+aGFuZGxlcnMgPSBzLT5oYW5kbGVyczsKLSAgaWYgKCFzLT5oYW5kbGVycykgcmV0dXJuIHRydWU7Ci0gIHN0YXJ0c2VxID0gKGZ1bmMqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBzZWwpOwotCi0gIGlmICghc3RhcnRzZXEpIHJldHVybiB0cnVlOwotICBoZCA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShzLT5oYW5kbGVycywgc2VsKTsKLSAgc3ViLT5jbG9zdXJlID0gc3RhcnRzZXEocy0+Y2xvc3VyZSwgaGQpOwotICByZXR1cm4gc3ViLT5jbG9zdXJlID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX3NpbmtfZW5kc2VxKHVwYl9zaW5rICpzLCB1cGJfc2VsZWN0b3JfdCBzZWwpIHsKLSAgdHlwZWRlZiB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqZW5kc2VxOwotICBjb25zdCB2b2lkICpoZDsKLSAgaWYgKCFzLT5oYW5kbGVycykgcmV0dXJuIHRydWU7Ci0gIGVuZHNlcSA9IChmdW5jKil1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihzLT5oYW5kbGVycywgc2VsKTsKLQotICBpZiAoIWVuZHNlcSkgcmV0dXJuIHRydWU7Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBzZWwpOwotICByZXR1cm4gZW5kc2VxKHMtPmNsb3N1cmUsIGhkKTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9zaW5rX3N0YXJ0c3RyKHVwYl9zaW5rICpzLCB1cGJfc2VsZWN0b3JfdCBzZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCwgdXBiX3NpbmsgKnN1YikgewotICB0eXBlZGVmIHVwYl9zdGFydHN0cl9oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICpzdGFydHN0cjsKLSAgY29uc3Qgdm9pZCAqaGQ7Ci0gIHN1Yi0+Y2xvc3VyZSA9IHMtPmNsb3N1cmU7Ci0gIHN1Yi0+aGFuZGxlcnMgPSBzLT5oYW5kbGVyczsKLSAgaWYgKCFzLT5oYW5kbGVycykgcmV0dXJuIHRydWU7Ci0gIHN0YXJ0c3RyID0gKGZ1bmMqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBzZWwpOwotCi0gIGlmICghc3RhcnRzdHIpIHJldHVybiB0cnVlOwotICBoZCA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShzLT5oYW5kbGVycywgc2VsKTsKLSAgc3ViLT5jbG9zdXJlID0gc3RhcnRzdHIocy0+Y2xvc3VyZSwgaGQsIHNpemVfaGludCk7Ci0gIHJldHVybiBzdWItPmNsb3N1cmUgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc2lua19lbmRzdHIodXBiX3NpbmsgKnMsIHVwYl9zZWxlY3Rvcl90IHNlbCkgewotICB0eXBlZGVmIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICplbmRzdHI7Ci0gIGNvbnN0IHZvaWQgKmhkOwotICBpZiAoIXMtPmhhbmRsZXJzKSByZXR1cm4gdHJ1ZTsKLSAgZW5kc3RyID0gKGZ1bmMqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBzZWwpOwotCi0gIGlmICghZW5kc3RyKSByZXR1cm4gdHJ1ZTsKLSAgaGQgPSB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEocy0+aGFuZGxlcnMsIHNlbCk7Ci0gIHJldHVybiBlbmRzdHIocy0+Y2xvc3VyZSwgaGQpOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX3Npbmtfc3RhcnRzdWJtc2codXBiX3NpbmsgKnMsIHVwYl9zZWxlY3Rvcl90IHNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2luayAqc3ViKSB7Ci0gIHR5cGVkZWYgdXBiX3N0YXJ0ZmllbGRfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqc3RhcnRzdWJtc2c7Ci0gIGNvbnN0IHZvaWQgKmhkOwotICBzdWItPmNsb3N1cmUgPSBzLT5jbG9zdXJlOwotICBpZiAoIXMtPmhhbmRsZXJzKSB7Ci0gICAgc3ViLT5oYW5kbGVycyA9IE5VTEw7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgc3ViLT5oYW5kbGVycyA9IHVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVyc19zZWwocy0+aGFuZGxlcnMsIHNlbCk7Ci0gIHN0YXJ0c3VibXNnID0gKGZ1bmMqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBzZWwpOwotCi0gIGlmICghc3RhcnRzdWJtc2cpIHJldHVybiB0cnVlOwotICBoZCA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShzLT5oYW5kbGVycywgc2VsKTsKLSAgc3ViLT5jbG9zdXJlID0gc3RhcnRzdWJtc2cocy0+Y2xvc3VyZSwgaGQpOwotICByZXR1cm4gc3ViLT5jbG9zdXJlID8gdHJ1ZSA6IGZhbHNlOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX3NpbmtfZW5kc3VibXNnKHVwYl9zaW5rICpzLCB1cGJfc2VsZWN0b3JfdCBzZWwpIHsKLSAgdHlwZWRlZiB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqZW5kc3VibXNnOwotICBjb25zdCB2b2lkICpoZDsKLSAgaWYgKCFzLT5oYW5kbGVycykgcmV0dXJuIHRydWU7Ci0gIGVuZHN1Ym1zZyA9IChmdW5jKil1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihzLT5oYW5kbGVycywgc2VsKTsKLQotICBpZiAoIWVuZHN1Ym1zZykgcmV0dXJuIHMtPmNsb3N1cmU7Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBzZWwpOwotICByZXR1cm4gZW5kc3VibXNnKHMtPmNsb3N1cmUsIGhkKTsKLX0KLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYiB7Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPiBTaW5rOjpTaW5rKGNvbnN0IEhhbmRsZXJzKiBoYW5kbGVycywgVCogY2xvc3VyZSkgewotICB1cGJfc2lua19yZXNldCh0aGlzLCBoYW5kbGVycywgY2xvc3VyZSk7Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWlubGluZSB2b2lkIFNpbms6OlJlc2V0KGNvbnN0IEhhbmRsZXJzKiBoYW5kbGVycywgVCogY2xvc3VyZSkgewotICB1cGJfc2lua19yZXNldCh0aGlzLCBoYW5kbGVycywgY2xvc3VyZSk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpTdGFydE1lc3NhZ2UoKSB7Ci0gIHJldHVybiB1cGJfc2lua19zdGFydG1zZyh0aGlzKTsKLX0KLWlubGluZSBib29sIFNpbms6OkVuZE1lc3NhZ2UoU3RhdHVzKiBzdGF0dXMpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX2VuZG1zZyh0aGlzLCBzdGF0dXMpOwotfQotaW5saW5lIGJvb2wgU2luazo6UHV0SW50MzIoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgaW50MzJfdCB2YWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3B1dGludDMyKHRoaXMsIHNlbCwgdmFsKTsKLX0KLWlubGluZSBib29sIFNpbms6OlB1dEludDY0KEhhbmRsZXJzOjpTZWxlY3RvciBzZWwsIGludDY0X3QgdmFsKSB7Ci0gIHJldHVybiB1cGJfc2lua19wdXRpbnQ2NCh0aGlzLCBzZWwsIHZhbCk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpQdXRVSW50MzIoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgdWludDMyX3QgdmFsKSB7Ci0gIHJldHVybiB1cGJfc2lua19wdXR1aW50MzIodGhpcywgc2VsLCB2YWwpOwotfQotaW5saW5lIGJvb2wgU2luazo6UHV0VUludDY0KEhhbmRsZXJzOjpTZWxlY3RvciBzZWwsIHVpbnQ2NF90IHZhbCkgewotICByZXR1cm4gdXBiX3NpbmtfcHV0dWludDY0KHRoaXMsIHNlbCwgdmFsKTsKLX0KLWlubGluZSBib29sIFNpbms6OlB1dEZsb2F0KEhhbmRsZXJzOjpTZWxlY3RvciBzZWwsIGZsb2F0IHZhbCkgewotICByZXR1cm4gdXBiX3NpbmtfcHV0ZmxvYXQodGhpcywgc2VsLCB2YWwpOwotfQotaW5saW5lIGJvb2wgU2luazo6UHV0RG91YmxlKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwsIGRvdWJsZSB2YWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3B1dGRvdWJsZSh0aGlzLCBzZWwsIHZhbCk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpQdXRCb29sKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwsIGJvb2wgdmFsKSB7Ci0gIHJldHVybiB1cGJfc2lua19wdXRib29sKHRoaXMsIHNlbCwgdmFsKTsKLX0KLWlubGluZSBib29sIFNpbms6OlN0YXJ0U3RyaW5nKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwsIHNpemVfdCBzaXplX2hpbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5rICpzdWIpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3N0YXJ0c3RyKHRoaXMsIHNlbCwgc2l6ZV9oaW50LCBzdWIpOwotfQotaW5saW5lIHNpemVfdCBTaW5rOjpQdXRTdHJpbmdCdWZmZXIoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiwgY29uc3QgQnVmZmVySGFuZGxlKiBoYW5kbGUpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3B1dHN0cmluZyh0aGlzLCBzZWwsIGJ1ZiwgbGVuLCBoYW5kbGUpOwotfQotaW5saW5lIGJvb2wgU2luazo6RW5kU3RyaW5nKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX2VuZHN0cih0aGlzLCBzZWwpOwotfQotaW5saW5lIGJvb2wgU2luazo6U3RhcnRTdWJNZXNzYWdlKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwsIFNpbmsqIHN1YikgewotICByZXR1cm4gdXBiX3Npbmtfc3RhcnRzdWJtc2codGhpcywgc2VsLCBzdWIpOwotfQotaW5saW5lIGJvb2wgU2luazo6RW5kU3ViTWVzc2FnZShIYW5kbGVyczo6U2VsZWN0b3Igc2VsKSB7Ci0gIHJldHVybiB1cGJfc2lua19lbmRzdWJtc2codGhpcywgc2VsKTsKLX0KLWlubGluZSBib29sIFNpbms6OlN0YXJ0U2VxdWVuY2UoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgU2luayogc3ViKSB7Ci0gIHJldHVybiB1cGJfc2lua19zdGFydHNlcSh0aGlzLCBzZWwsIHN1Yik7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpFbmRTZXF1ZW5jZShIYW5kbGVyczo6U2VsZWN0b3Igc2VsKSB7Ci0gIHJldHVybiB1cGJfc2lua19lbmRzZXEodGhpcywgc2VsKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1CeXRlc1Npbms6OkJ5dGVzU2luayhjb25zdCBCeXRlc0hhbmRsZXIqIGhhbmRsZXIsIFQqIGNsb3N1cmUpIHsKLSAgUmVzZXQoaGFuZGxlciwgY2xvc3VyZSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBCeXRlc1Npbms6OlJlc2V0KGNvbnN0IEJ5dGVzSGFuZGxlciAqaGFuZGxlciwgVCAqY2xvc3VyZSkgewotICB1cGJfYnl0ZXNzaW5rX3Jlc2V0KHRoaXMsIGhhbmRsZXIsIGNsb3N1cmUpOwotfQotaW5saW5lIGJvb2wgQnl0ZXNTaW5rOjpTdGFydChzaXplX3Qgc2l6ZV9oaW50LCB2b2lkICoqc3ViYykgewotICByZXR1cm4gdXBiX2J5dGVzc2lua19zdGFydCh0aGlzLCBzaXplX2hpbnQsIHN1YmMpOwotfQotaW5saW5lIHNpemVfdCBCeXRlc1Npbms6OlB1dEJ1ZmZlcih2b2lkICpzdWJjLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckhhbmRsZSAqaGFuZGxlKSB7Ci0gIHJldHVybiB1cGJfYnl0ZXNzaW5rX3B1dGJ1Zih0aGlzLCBzdWJjLCBidWYsIGxlbiwgaGFuZGxlKTsKLX0KLWlubGluZSBib29sIEJ5dGVzU2luazo6RW5kKCkgewotICByZXR1cm4gdXBiX2J5dGVzc2lua19lbmQodGhpcyk7Ci19Ci0KLWlubGluZSBib29sIEJ1ZmZlclNvdXJjZTo6UHV0QnVmZmVyKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzU2luayAqc2luaykgewotICByZXR1cm4gdXBiX2J1ZnNyY19wdXRidWYoYnVmLCBsZW4sIHNpbmspOwotfQotCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotI2VuZGlmCi0vKgotKiogRm9yIGhhbmRsZXJzIHRoYXQgZG8gdmVyeSB0aW55LCB2ZXJ5IHNpbXBsZSBvcGVyYXRpb25zLCB0aGUgZnVuY3Rpb24gY2FsbAotKiogb3ZlcmhlYWQgb2YgY2FsbGluZyBhIGhhbmRsZXIgY2FuIGJlIHNpZ25pZmljYW50LiAgVGhpcyBmaWxlIGFsbG93cyB0aGUKLSoqIHVzZXIgdG8gZGVmaW5lIGhhbmRsZXJzIHRoYXQgZG8gc29tZXRoaW5nIHZlcnkgc2ltcGxlIGxpa2Ugc3RvcmUgdGhlIHZhbHVlCi0qKiB0byBtZW1vcnkgYW5kL29yIHNldCBhIGhhc2JpdC4gIEpJVCBjb21waWxlcnMgY2FuIHRoZW4gc3BlY2lhbC1jYXNlIHRoZXNlCi0qKiBoYW5kbGVycyBhbmQgZW1pdCBzcGVjaWFsaXplZCBjb2RlIGZvciB0aGVtIGluc3RlYWQgb2YgYWN0dWFsbHkgY2FsbGluZyB0aGUKLSoqIGhhbmRsZXIuCi0qKgotKiogVGhlIGZ1bmN0aW9uYWxpdHkgaXMgdmVyeSBzaW1wbGUvbGltaXRlZCByaWdodCBub3cgYnV0IG1heSBleHBhbmQgdG8gYmUgYWJsZQotKiogdG8gY2FsbCBhbm90aGVyIGZ1bmN0aW9uLgotKi8KLQotI2lmbmRlZiBVUEJfU0hJTV9ICi0jZGVmaW5lIFVQQl9TSElNX0gKLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHNpemVfdCBvZmZzZXQ7Ci0gIGludDMyX3QgaGFzYml0OwotfSB1cGJfc2hpbV9kYXRhOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYiB7Ci0KLXN0cnVjdCBTaGltIHsKLSAgdHlwZWRlZiB1cGJfc2hpbV9kYXRhIERhdGE7Ci0KLSAgLyogU2V0cyBhIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCB0aGF0IHdyaXRlcyB0aGUgdmFsdWUgdG8gdGhlIGdpdmVuCi0gICAqIG9mZnNldCBhbmQsIGlmIGhhc2JpdCA+PSAwLCBzZXRzIGEgYml0IGF0IHRoZSBnaXZlbiBiaXQgb2Zmc2V0LiAgUmV0dXJucwotICAgKiB0cnVlIGlmIHRoZSBoYW5kbGVyIHdhcyBzZXQgc3VjY2Vzc2Z1bGx5LiAqLwotICBzdGF0aWMgYm9vbCBTZXQoSGFuZGxlcnMgKmgsIGNvbnN0IEZpZWxkRGVmICpmLCBzaXplX3Qgb2ZzLCBpbnQzMl90IGhhc2JpdCk7Ci0KLSAgLyogSWYgdGhpcyBoYW5kbGVyIGlzIGEgc2hpbSwgcmV0dXJucyB0aGUgY29ycmVzcG9uZGluZyB1cGI6OlNoaW06OkRhdGEgYW5kCi0gICAqIHN0b3JlcyB0aGUgdHlwZSBpbiAidHlwZSIuICBPdGhlcndpc2UgcmV0dXJucyBOVUxMLiAqLwotICBzdGF0aWMgY29uc3QgRGF0YSogR2V0RGF0YShjb25zdCBIYW5kbGVycyogaCwgSGFuZGxlcnM6OlNlbGVjdG9yIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVmOjpUeXBlKiB0eXBlKTsKLX07Ci0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLQotI2VuZGlmCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBDIEFQSS4gKi8KLWJvb2wgdXBiX3NoaW1fc2V0KHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBzaXplX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYXNiaXQpOwotY29uc3QgdXBiX3NoaW1fZGF0YSAqdXBiX3NoaW1fZ2V0ZGF0YShjb25zdCB1cGJfaGFuZGxlcnMgKmgsIHVwYl9zZWxlY3Rvcl90IHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZHR5cGVfdCAqdHlwZSk7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0vKiBDKysgV3JhcHBlcnMuICovCi1uYW1lc3BhY2UgdXBiIHsKLWlubGluZSBib29sIFNoaW06OlNldChIYW5kbGVycyogaCwgY29uc3QgRmllbGREZWYqIGYsIHNpemVfdCBvZnMsCi0gICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYXNiaXQpIHsKLSAgcmV0dXJuIHVwYl9zaGltX3NldChoLCBmLCBvZnMsIGhhc2JpdCk7Ci19Ci1pbmxpbmUgY29uc3QgU2hpbTo6RGF0YSogU2hpbTo6R2V0RGF0YShjb25zdCBIYW5kbGVycyogaCwgSGFuZGxlcnM6OlNlbGVjdG9yIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlZjo6VHlwZSogdHlwZSkgewotICByZXR1cm4gdXBiX3NoaW1fZ2V0ZGF0YShoLCBzLCB0eXBlKTsKLX0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9TSElNX0ggKi8KLS8qCi0qKiB1cGI6OlN5bWJvbFRhYmxlICh1cGJfc3ltdGFiKQotKioKLSoqIEEgc3ltdGFiIChzeW1ib2wgdGFibGUpIHN0b3JlcyBhIG5hbWUtPmRlZiBtYXAgb2YgdXBiX2RlZnMuICBDbGllbnRzIGNvdWxkCi0qKiBhbHdheXMgY3JlYXRlIHN1Y2ggdGFibGVzIHRoZW1zZWx2ZXMsIGJ1dCB1cGJfc3ltdGFiIGhhcyBsb2dpYyBmb3IgcmVzb2x2aW5nCi0qKiBzeW1ib2xpYyByZWZlcmVuY2VzLCBhbmQgaW4gcGFydGljdWxhciwgZm9yIGtlZXBpbmcgYSB3aG9sZSBzZXQgb2YgY29uc2lzdGVudAotKiogZGVmcyB3aGVuIHJlcGxhY2luZyBzb21lIHN1YnNldCBvZiB0aG9zZSBkZWZzLiAgVGhpcyBsb2dpYyBpcyBub250cml2aWFsLgotKioKLSoqIFRoaXMgaXMgYSBtaXhlZCBDL0MrKyBpbnRlcmZhY2UgdGhhdCBvZmZlcnMgYSBmdWxsIEFQSSB0byBib3RoIGxhbmd1YWdlcy4KLSoqIFNlZSB0aGUgdG9wLWxldmVsIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSovCi0KLSNpZm5kZWYgVVBCX1NZTVRBQl9IXwotI2RlZmluZSBVUEJfU1lNVEFCX0hfCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0jaW5jbHVkZSA8dmVjdG9yPgotbmFtZXNwYWNlIHVwYiB7IGNsYXNzIFN5bWJvbFRhYmxlOyB9Ci0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfREVSSVZFRF9UWVBFKHVwYjo6U3ltYm9sVGFibGUsIHVwYjo6UmVmQ291bnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3ltdGFiLCB1cGJfcmVmY291bnRlZCkKLQotdHlwZWRlZiBzdHJ1Y3QgewotIFVQQl9QUklWQVRFX0ZPUl9DUFAKLSAgdXBiX3N0cnRhYmxlX2l0ZXIgaXRlcjsKLSAgdXBiX2RlZnR5cGVfdCB0eXBlOwotfSB1cGJfc3ltdGFiX2l0ZXI7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBOb24tY29uc3QgbWV0aG9kcyBpbiB1cGI6OlN5bWJvbFRhYmxlIGFyZSBOT1QgdGhyZWFkLXNhZmUuICovCi1jbGFzcyB1cGI6OlN5bWJvbFRhYmxlIHsKLSBwdWJsaWM6Ci0gIC8qIFJldHVybnMgYSBuZXcgc3ltYm9sIHRhYmxlIHdpdGggYSBzaW5nbGUgcmVmIG93bmVkIGJ5ICJvd25lci4iCi0gICAqIFJldHVybnMgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPFN5bWJvbFRhYmxlPiBOZXcoKTsKLQotICAvKiBJbmNsdWRlIFJlZkNvdW50ZWQgYmFzZSBtZXRob2RzLiAqLwotICBVUEJfUkVGQ09VTlRFRF9DUFBNRVRIT0RTCi0KLSAgLyogRm9yIGFsbCBsb29rdXAgZnVuY3Rpb25zLCB0aGUgcmV0dXJuZWQgcG9pbnRlciBpcyBub3Qgb3duZWQgYnkgdGhlCi0gICAqIGNhbGxlcjsgaXQgbWF5IGJlIGludmFsaWRhdGVkIGJ5IGFueSBub24tY29uc3QgY2FsbCBvciB1bnJlZiBvZiB0aGUKLSAgICogU3ltYm9sVGFibGUhICBUbyBwcm90ZWN0IGFnYWluc3QgdGhpcywgdGFrZSBhIHJlZiBpZiBkZXNpcmVkLiAqLwotCi0gIC8qIEZyZWV6ZXMgdGhlIHN5bWJvbCB0YWJsZTogcHJldmVudHMgZnVydGhlciBtb2RpZmljYXRpb24gb2YgaXQuCi0gICAqIEFmdGVyIHRoZSBGcmVlemUoKSBvcGVyYXRpb24gaXMgc3VjY2Vzc2Z1bCwgdGhlIFN5bWJvbFRhYmxlIG11c3Qgb25seSBiZQotICAgKiBhY2Nlc3NlZCB2aWEgYSBjb25zdCBwb2ludGVyLgotICAgKgotICAgKiBVbmxpa2Ugd2l0aCB1cGI6Ok1lc3NhZ2VEZWYvdXBiOjpFbnVtRGVmL2V0YywgZnJlZXppbmcgYSBTeW1ib2xUYWJsZSBpcyBub3QKLSAgICogYSBuZWNlc3Nhcnkgc3RlcCBpbiB1c2luZyBhIFN5bWJvbFRhYmxlLiAgSWYgeW91IGhhdmUgbm8gbmVlZCBmb3IgaXQgdG8gYmUKLSAgICogaW1tdXRhYmxlLCB0aGVyZSBpcyBubyBuZWVkIHRvIGZyZWV6ZSBpdCBldmVyLiAgSG93ZXZlciBzb21ldGltZXMgaXQgaXMKLSAgICogdXNlZnVsLCBhbmQgU3ltYm9sVGFibGVzIHRoYXQgYXJlIHN0YXRpY2FsbHkgY29tcGlsZWQgaW50byB0aGUgYmluYXJ5IGFyZQotICAgKiBhbHdheXMgZnJvemVuIGJ5IG5hdHVyZS4gKi8KLSAgdm9pZCBGcmVlemUoKTsKLQotICAvKiBSZXNvbHZlcyB0aGUgZ2l2ZW4gc3ltYm9sIHVzaW5nIHRoZSBydWxlcyBkZXNjcmliZWQgaW4gZGVzY3JpcHRvci5wcm90bywKLSAgICogbmFtZWx5OgotICAgKgotICAgKiAgICBJZiB0aGUgbmFtZSBzdGFydHMgd2l0aCBhICcuJywgaXQgaXMgZnVsbHktcXVhbGlmaWVkLiAgT3RoZXJ3aXNlLAotICAgKiAgICBDKystbGlrZSBzY29waW5nIHJ1bGVzIGFyZSB1c2VkIHRvIGZpbmQgdGhlIHR5cGUgKGkuZS4gZmlyc3QgdGhlIG5lc3RlZAotICAgKiAgICB0eXBlcyB3aXRoaW4gdGhpcyBtZXNzYWdlIGFyZSBzZWFyY2hlZCwgdGhlbiB3aXRoaW4gdGhlIHBhcmVudCwgb24gdXAKLSAgICogICAgdG8gdGhlIHJvb3QgbmFtZXNwYWNlKS4KLSAgICoKLSAgICogSWYgbm90IGZvdW5kLCByZXR1cm5zIE5VTEwuICovCi0gIGNvbnN0IERlZiogUmVzb2x2ZShjb25zdCBjaGFyKiBiYXNlLCBjb25zdCBjaGFyKiBzeW0pIGNvbnN0OwotCi0gIC8qIEZpbmRzIGFuIGVudHJ5IGluIHRoZSBzeW1ib2wgdGFibGUgd2l0aCB0aGlzIGV4YWN0IG5hbWUuICBJZiBub3QgZm91bmQsCi0gICAqIHJldHVybnMgTlVMTC4gKi8KLSAgY29uc3QgRGVmKiBMb29rdXAoY29uc3QgY2hhciAqc3ltKSBjb25zdDsKLSAgY29uc3QgTWVzc2FnZURlZiogTG9va3VwTWVzc2FnZShjb25zdCBjaGFyICpzeW0pIGNvbnN0OwotICBjb25zdCBFbnVtRGVmKiBMb29rdXBFbnVtKGNvbnN0IGNoYXIgKnN5bSkgY29uc3Q7Ci0KLSAgLyogVE9ETzogaW50cm9kdWNlIGEgQysrIGl0ZXJhdG9yLCBidXQgbWFrZSBpdCBuaWNlIGFuZCB0ZW1wbGF0ZWQgc28gdGhhdCBpZgotICAgKiB5b3UgYXNrIGZvciBhbiBpdGVyYXRvciBvZiBNZXNzYWdlRGVmIHRoZSBpdGVyYXRlZCBlbGVtZW50cyBhcmUgc3Ryb25nbHkKLSAgICogdHlwZWQgYXMgTWVzc2FnZURlZiouICovCi0KLSAgLyogQWRkcyB0aGUgZ2l2ZW4gbXV0YWJsZSBkZWZzIHRvIHRoZSBzeW10YWIsIHJlc29sdmluZyBhbGwgc3ltYm9scwotICAgKiAoaW5jbHVkaW5nIGVudW0gZGVmYXVsdCB2YWx1ZXMpIGFuZCBmaW5hbGl6aW5nIHRoZSBkZWZzLiAgT25seSBvbmUgZGVmIHBlcgotICAgKiBuYW1lIG1heSBiZSBpbiB0aGUgbGlzdCwgYnV0IGRlZnMgY2FuIHJlcGxhY2UgZXhpc3RpbmcgZGVmcyBpbiB0aGUgc3ltdGFiLgotICAgKiBBbGwgZGVmcyBtdXN0IGhhdmUgYSBuYW1lIC0tIGFub255bW91cyBkZWZzIGFyZSBub3QgYWxsb3dlZC4gIEFub255bW91cwotICAgKiBkZWZzIGNhbiBzdGlsbCBiZSBmcm96ZW4gYnkgY2FsbGluZyB1cGJfZGVmX2ZyZWV6ZSgpIGRpcmVjdGx5LgotICAgKgotICAgKiBBbnkgZXhpc3RpbmcgZGVmcyB0aGF0IGNhbiByZWFjaCBkZWZzIHRoYXQgYXJlIGJlaW5nIHJlcGxhY2VkIHdpbGwKLSAgICogdGhlbXNlbHZlcyBiZSByZXBsYWNlZCBhbHNvLCBzbyB0aGF0IHRoZSByZXN1bHRpbmcgc2V0IG9mIGRlZnMgaXMgZnVsbHkKLSAgICogY29uc2lzdGVudC4KLSAgICoKLSAgICogVGhpcyBsb2dpYyBpbXBsZW1lbnRlZCBpbiB0aGlzIG1ldGhvZCBpcyBhIGNvbnZlbmllbmNlOyB1bHRpbWF0ZWx5IGl0Ci0gICAqIGNhbGxzIHNvbWUgY29tYmluYXRpb24gb2YgdXBiX2ZpZWxkZGVmX3NldHN1YmRlZigpLCB1cGJfZGVmX2R1cCgpLCBhbmQKLSAgICogdXBiX2ZyZWV6ZSgpLCBhbnkgb2Ygd2hpY2ggdGhlIGNsaWVudCBjb3VsZCBjYWxsIHRoZW1zZWxmLiAgSG93ZXZlciwgc2luY2UKLSAgICogdGhlIGxvZ2ljIGZvciBkb2luZyBzbyBpcyBub250cml2aWFsLCB3ZSBwcm92aWRlIGl0IGhlcmUuCi0gICAqCi0gICAqIFRoZSBlbnRpcmUgb3BlcmF0aW9uIGVpdGhlciBzdWNjZWVkcyBvciBmYWlscy4gIElmIHRoZSBvcGVyYXRpb24gZmFpbHMsCi0gICAqIHRoZSBzeW10YWIgaXMgdW5jaGFuZ2VkLCBmYWxzZSBpcyByZXR1cm5lZCwgYW5kIHN0YXR1cyBpbmRpY2F0ZXMgdGhlCi0gICAqIGVycm9yLiAgVGhlIGNhbGxlciBwYXNzZXMgYSByZWYgb24gYWxsIGRlZnMgdG8gdGhlIHN5bXRhYiAoZXZlbiBpZiB0aGUKLSAgICogb3BlcmF0aW9uIGZhaWxzKS4KLSAgICoKLSAgICogVE9ETyhoYWJlcm1hbik6IGN1cnJlbnRseSBmYWlsdXJlIHdpbGwgbGVhdmUgdGhlIHN5bXRhYiB1bmNoYW5nZWQsIGJ1dCBtYXkKLSAgICogbGVhdmUgdGhlIGRlZnMgdGhlbXNlbHZlcyBwYXJ0aWFsbHkgcmVzb2x2ZWQuICBEb2VzIHRoaXMgbWF0dGVyPyAgSWYgc28gd2UKLSAgICogY291bGQgZG8gYSBwcmVwYXNzIHRoYXQgZW5zdXJlcyB0aGF0IGFsbCBzeW1ib2xzIGFyZSByZXNvbHZhYmxlIGFuZCBiYWlsCi0gICAqIGlmIG5vdCwgc28gd2UgZG9uJ3QgbXV0YXRlIGFueXRoaW5nIHVudGlsIHdlIGtub3cgdGhlIG9wZXJhdGlvbiB3aWxsCi0gICAqIHN1Y2NlZWQuCi0gICAqCi0gICAqIFRPRE8oaGFiZXJtYW4pOiBzaW5jZSB0aGUgZGVmcyBtdXN0IGJlIG11dGFibGUsIHJlZmluaW5nIGEgZnJvemVuIGRlZgotICAgKiByZXF1aXJlcyBtYWtpbmcgbXV0YWJsZSBjb3BpZXMgb2YgdGhlIGVudGlyZSB0cmVlLiAgVGhpcyBpcyB3YXN0ZWZ1bCBpZgotICAgKiBvbmx5IGEgZmV3IG1lc3NhZ2VzIGFyZSBjaGFuZ2luZy4gIFdlIG1heSB3YW50IHRvIGFkZCBhIHdheSBvZiBhZGRpbmcgYQotICAgKiB0cmVlIG9mIGZyb3plbiBkZWZzIHRvIHRoZSBzeW10YWIgKHBlcmhhcHMgYW4gYWx0ZXJuYXRlIGNvbnN0cnVjdG9yIHdoZXJlCi0gICAqIHlvdSBwYXNzIHRoZSByb290IG9mIHRoZSB0cmVlPykgKi8KLSAgYm9vbCBBZGQoRGVmKmNvbnN0KiBkZWZzLCBpbnQgbiwgdm9pZCogcmVmX2Rvbm9yLCB1cGJfc3RhdHVzKiBzdGF0dXMpOwotCi0gIGJvb2wgQWRkKGNvbnN0IHN0ZDo6dmVjdG9yPERlZio+JiBkZWZzLCB2b2lkICpvd25lciwgU3RhdHVzKiBzdGF0dXMpIHsKLSAgICByZXR1cm4gQWRkKChEZWYqY29uc3QqKSZkZWZzWzBdLCBkZWZzLnNpemUoKSwgb3duZXIsIHN0YXR1cyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKFN5bWJvbFRhYmxlLCB1cGI6OlN5bWJvbFRhYmxlKQotfTsKLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogTmF0aXZlIEMgQVBJLiAqLwotCi0vKiBJbmNsdWRlIHJlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9zeW10YWJfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfc3ltdGFiLCB1cGJfc3ltdGFiX3VwY2FzdCkKLQotdXBiX3N5bXRhYiAqdXBiX3N5bXRhYl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpOwotdm9pZCB1cGJfc3ltdGFiX2ZyZWV6ZSh1cGJfc3ltdGFiICpzKTsKLWNvbnN0IHVwYl9kZWYgKnVwYl9zeW10YWJfcmVzb2x2ZShjb25zdCB1cGJfc3ltdGFiICpzLCBjb25zdCBjaGFyICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN5bSk7Ci1jb25zdCB1cGJfZGVmICp1cGJfc3ltdGFiX2xvb2t1cChjb25zdCB1cGJfc3ltdGFiICpzLCBjb25zdCBjaGFyICpzeW0pOwotY29uc3QgdXBiX21zZ2RlZiAqdXBiX3N5bXRhYl9sb29rdXBtc2coY29uc3QgdXBiX3N5bXRhYiAqcywgY29uc3QgY2hhciAqc3ltKTsKLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJfc3ltdGFiX2xvb2t1cGVudW0oY29uc3QgdXBiX3N5bXRhYiAqcywgY29uc3QgY2hhciAqc3ltKTsKLWJvb2wgdXBiX3N5bXRhYl9hZGQodXBiX3N5bXRhYiAqcywgdXBiX2RlZiAqY29uc3QqZGVmcywgaW50IG4sIHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotLyogdXBiX3N5bXRhYl9pdGVyIGk7Ci0gKiBmb3IodXBiX3N5bXRhYl9iZWdpbigmaSwgcywgdHlwZSk7ICF1cGJfc3ltdGFiX2RvbmUoJmkpOwotICogICAgIHVwYl9zeW10YWJfbmV4dCgmaSkpIHsKLSAqICAgY29uc3QgdXBiX2RlZiAqZGVmID0gdXBiX3N5bXRhYl9pdGVyX2RlZigmaSk7Ci0gKiAgICAvLyAuLi4KLSAqIH0KLSAqCi0gKiBGb3IgQyB3ZSBkb24ndCBoYXZlIHNlcGFyYXRlIGl0ZXJhdG9ycyBmb3IgY29uc3QgYW5kIG5vbi1jb25zdC4KLSAqIEl0IGlzIHRoZSBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBjYXN0IHRoZSB1cGJfZmllbGRkZWYqIHRvCi0gKiBjb25zdCBpZiB0aGUgdXBiX21zZ2RlZiogaXMgY29uc3QuICovCi12b2lkIHVwYl9zeW10YWJfYmVnaW4odXBiX3N5bXRhYl9pdGVyICppdGVyLCBjb25zdCB1cGJfc3ltdGFiICpzLAotICAgICAgICAgICAgICAgICAgICAgIHVwYl9kZWZ0eXBlX3QgdHlwZSk7Ci12b2lkIHVwYl9zeW10YWJfbmV4dCh1cGJfc3ltdGFiX2l0ZXIgKml0ZXIpOwotYm9vbCB1cGJfc3ltdGFiX2RvbmUoY29uc3QgdXBiX3N5bXRhYl9pdGVyICppdGVyKTsKLWNvbnN0IHVwYl9kZWYgKnVwYl9zeW10YWJfaXRlcl9kZWYoY29uc3QgdXBiX3N5bXRhYl9pdGVyICppdGVyKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLS8qIEMrKyBpbmxpbmUgd3JhcHBlcnMuICovCi1uYW1lc3BhY2UgdXBiIHsKLWlubGluZSByZWZmZWRfcHRyPFN5bWJvbFRhYmxlPiBTeW1ib2xUYWJsZTo6TmV3KCkgewotICB1cGJfc3ltdGFiICpzID0gdXBiX3N5bXRhYl9uZXcoJnMpOwotICByZXR1cm4gcmVmZmVkX3B0cjxTeW1ib2xUYWJsZT4ocywgJnMpOwotfQotCi1pbmxpbmUgdm9pZCBTeW1ib2xUYWJsZTo6RnJlZXplKCkgewotICByZXR1cm4gdXBiX3N5bXRhYl9mcmVlemUodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgRGVmICpTeW1ib2xUYWJsZTo6UmVzb2x2ZShjb25zdCBjaGFyICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3ltKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfc3ltdGFiX3Jlc29sdmUodGhpcywgYmFzZSwgc3ltKTsKLX0KLWlubGluZSBjb25zdCBEZWYqIFN5bWJvbFRhYmxlOjpMb29rdXAoY29uc3QgY2hhciAqc3ltKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfc3ltdGFiX2xvb2t1cCh0aGlzLCBzeW0pOwotfQotaW5saW5lIGNvbnN0IE1lc3NhZ2VEZWYgKlN5bWJvbFRhYmxlOjpMb29rdXBNZXNzYWdlKGNvbnN0IGNoYXIgKnN5bSkgY29uc3QgewotICByZXR1cm4gdXBiX3N5bXRhYl9sb29rdXBtc2codGhpcywgc3ltKTsKLX0KLWlubGluZSBib29sIFN5bWJvbFRhYmxlOjpBZGQoCi0gICAgRGVmKmNvbnN0KiBkZWZzLCBpbnQgbiwgdm9pZCogcmVmX2Rvbm9yLCB1cGJfc3RhdHVzKiBzdGF0dXMpIHsKLSAgcmV0dXJuIHVwYl9zeW10YWJfYWRkKHRoaXMsICh1cGJfZGVmKmNvbnN0KilkZWZzLCBuLCByZWZfZG9ub3IsIHN0YXR1cyk7Ci19Ci19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfU1lNVEFCX0hfICovCi0vKgotKiogdXBiOjpkZXNjcmlwdG9yOjpSZWFkZXIgKHVwYl9kZXNjcmVhZGVyKQotKioKLSoqIFByb3ZpZGVzIGEgd2F5IG9mIGJ1aWxkaW5nIHVwYjo6RGVmcyBmcm9tIGRhdGEgaW4gZGVzY3JpcHRvci5wcm90byBmb3JtYXQuCi0qLwotCi0jaWZuZGVmIFVQQl9ERVNDUklQVE9SX0gKLSNkZWZpbmUgVVBCX0RFU0NSSVBUT1JfSAotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UgZGVzY3JpcHRvciB7Ci1jbGFzcyBSZWFkZXI7Ci19ICAvKiBuYW1lc3BhY2UgZGVzY3JpcHRvciAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2VuZGlmCi0KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpkZXNjcmlwdG9yOjpSZWFkZXIsIHVwYl9kZXNjcmVhZGVyKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQ2xhc3MgdGhhdCByZWNlaXZlcyBkZXNjcmlwdG9yIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBkZXNjcmlwdG9yLnByb3RvIHNjaGVtYQotICogYW5kIHVzZSBpdCB0byBidWlsZCB1cGI6OkRlZnMgY29ycmVzcG9uZGluZyB0byB0aGF0IHNjaGVtYS4gKi8KLWNsYXNzIHVwYjo6ZGVzY3JpcHRvcjo6UmVhZGVyIHsKLSBwdWJsaWM6Ci0gIC8qIFRoZXNlIGhhbmRsZXJzIG11c3QgaGF2ZSBjb21lIGZyb20gTmV3SGFuZGxlcnMoKSBhbmQgbXVzdCBvdXRsaXZlIHRoZQotICAgKiBSZWFkZXIuCi0gICAqCi0gICAqIFRPRE86IGdlbmVyYXRlIHRoZSBoYW5kbGVycyBzdGF0aWNhbGx5IChsaWtlIHdlIGRvIHdpdGggdGhlCi0gICAqIGRlc2NyaXB0b3IucHJvdG8gZGVmcykgc28gdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHBhc3MgdGhpcyBwYXJhbWV0ZXIgKG9yCi0gICAqIHRvIGJ1aWxkL21lbW9yeS1tYW5hZ2UgdGhlIGhhbmRsZXJzIGF0IHJ1bnRpbWUgYXQgYWxsKS4gIFVuZm9ydHVuYXRlbHkgdGhpcwotICAgKiBpcyBhIGJpdCB0cmlja3kgdG8gaW1wbGVtZW50IGZvciBIYW5kbGVycywgYnV0IG5lY2Vzc2FyeSB0byBzaW1wbGlmeSB0aGlzCi0gICAqIGludGVyZmFjZS4gKi8KLSAgc3RhdGljIFJlYWRlciogQ3JlYXRlKEVudmlyb25tZW50KiBlbnYsIGNvbnN0IEhhbmRsZXJzKiBoYW5kbGVycyk7Ci0KLSAgLyogVGhlIHJlYWRlcidzIGlucHV0OyB0aGlzIGlzIHdoZXJlIGRlc2NyaXB0b3IucHJvdG8gZGF0YSBzaG91bGQgYmUgc2VudC4gKi8KLSAgU2luayogaW5wdXQoKTsKLQotICAvKiBSZXR1cm5zIGFuIGFycmF5IG9mIGFsbCBkZWZzIHRoYXQgaGF2ZSBiZWVuIHBhcnNlZCwgYW5kIHRyYW5zZmVycyBvd25lcnNoaXAKLSAgICogb2YgdGhlbSB0byAib3duZXIiLiAgVGhlIG51bWJlciBvZiBkZWZzIGlzIHN0b3JlZCBpbiAqbi4gIE93bmVyc2hpcCBvZiB0aGUKLSAgICogcmV0dXJuZWQgYXJyYXkgaXMgcmV0YWluZWQgYW5kIGlzIGludmFsaWRhdGVkIGJ5IGFueSBvdGhlciBjYWxsIGludG8KLSAgICogUmVhZGVyLgotICAgKgotICAgKiBUaGVzZSBkZWZzIGFyZSBub3QgZnJvemVuIG9yIHJlc29sdmVkOyB0aGV5IGFyZSByZWFkeSB0byBiZSBhZGRlZCB0byBhCi0gICAqIHN5bXRhYi4gKi8KLSAgdXBiOjpEZWYqKiBHZXREZWZzKHZvaWQqIG93bmVyLCBpbnQqIG4pOwotCi0gIC8qIEJ1aWxkcyBhbmQgcmV0dXJucyBoYW5kbGVycyBmb3IgdGhlIHJlYWRlciwgb3duZWQgYnkgIm93bmVyLiIgKi8KLSAgc3RhdGljIEhhbmRsZXJzKiBOZXdIYW5kbGVycyhjb25zdCB2b2lkKiBvd25lcik7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhSZWFkZXIsIHVwYjo6ZGVzY3JpcHRvcjo6UmVhZGVyKQotfTsKLQotI2VuZGlmCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBDIEFQSS4gKi8KLXVwYl9kZXNjcmVhZGVyICp1cGJfZGVzY3JlYWRlcl9jcmVhdGUodXBiX2VudiAqZSwgY29uc3QgdXBiX2hhbmRsZXJzICpoKTsKLXVwYl9zaW5rICp1cGJfZGVzY3JlYWRlcl9pbnB1dCh1cGJfZGVzY3JlYWRlciAqcik7Ci11cGJfZGVmICoqdXBiX2Rlc2NyZWFkZXJfZ2V0ZGVmcyh1cGJfZGVzY3JlYWRlciAqciwgdm9pZCAqb3duZXIsIGludCAqbik7Ci1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9kZXNjcmVhZGVyX25ld2hhbmRsZXJzKGNvbnN0IHZvaWQgKm93bmVyKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLS8qIEMrKyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1uYW1lc3BhY2UgdXBiIHsKLW5hbWVzcGFjZSBkZXNjcmlwdG9yIHsKLWlubGluZSBSZWFkZXIqIFJlYWRlcjo6Q3JlYXRlKEVudmlyb25tZW50KiBlLCBjb25zdCBIYW5kbGVycyAqaCkgewotICByZXR1cm4gdXBiX2Rlc2NyZWFkZXJfY3JlYXRlKGUsIGgpOwotfQotaW5saW5lIFNpbmsqIFJlYWRlcjo6aW5wdXQoKSB7IHJldHVybiB1cGJfZGVzY3JlYWRlcl9pbnB1dCh0aGlzKTsgfQotaW5saW5lIHVwYjo6RGVmKiogUmVhZGVyOjpHZXREZWZzKHZvaWQqIG93bmVyLCBpbnQqIG4pIHsKLSAgcmV0dXJuIHVwYl9kZXNjcmVhZGVyX2dldGRlZnModGhpcywgb3duZXIsIG4pOwotfQotfSAgLyogbmFtZXNwYWNlIGRlc2NyaXB0b3IgKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9ERVNDUklQVE9SX0ggKi8KLS8qIFRoaXMgZmlsZSBjb250YWlucyBhY2Nlc3NvcnMgZm9yIGEgc2V0IG9mIGNvbXBpbGVkLWluIGRlZnMuCi0gKiBOb3RlIHRoYXQgdW5saWtlIEdvb2dsZSdzIHByb3RvYnVmLCBpdCBkb2VzICpub3QqIGRlZmluZQotICogZ2VuZXJhdGVkIGNsYXNzZXMgb3IgYW55IG90aGVyIGtpbmQgb2YgZGF0YSBzdHJ1Y3R1cmUgZm9yCi0gKiBhY3R1YWxseSBzdG9yaW5nIHByb3RvYnVmcy4gIEl0IG9ubHkgY29udGFpbnMgKmRlZnMqIHdoaWNoCi0gKiBsZXQgeW91IHJlZmxlY3Qgb3ZlciBhIHByb3RvYnVmICpzY2hlbWEqLgotICovCi0vKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB1cGJjICh0aGUgdXBiIGNvbXBpbGVyKS4KLSAqIERvIG5vdCBlZGl0IC0tIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHRoZSBmaWxlIGlzCi0gKiByZWdlbmVyYXRlZC4gKi8KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9VUEJfSF8KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfVVBCX0hfCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1VUEJfQkVHSU5fRVhURVJOX0MKLSNlbmRpZgotCi0vKiBFbnVtcyAqLwotCi10eXBlZGVmIGVudW0gewotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUxfT1BUSU9OQUwgPSAxLAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUxfUkVRVUlSRUQgPSAyLAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUxfUkVQRUFURUQgPSAzCi19IGdvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfRE9VQkxFID0gMSwKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfRkxPQVQgPSAyLAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9JTlQ2NCA9IDMsCi0gIEdPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFX1VJTlQ2NCA9IDQsCi0gIEdPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFX0lOVDMyID0gNSwKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfRklYRUQ2NCA9IDYsCi0gIEdPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFX0ZJWEVEMzIgPSA3LAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9CT09MID0gOCwKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfU1RSSU5HID0gOSwKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfR1JPVVAgPSAxMCwKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfTUVTU0FHRSA9IDExLAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9CWVRFUyA9IDEyLAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9VSU5UMzIgPSAxMywKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfRU5VTSA9IDE0LAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9TRklYRUQzMiA9IDE1LAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9TRklYRUQ2NCA9IDE2LAotICBHT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9TSU5UMzIgPSAxNywKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfU0lOVDY0ID0gMTgKLX0gZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEdPT0dMRV9QUk9UT0JVRl9GSUVMRE9QVElPTlNfU1RSSU5HID0gMCwKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxET1BUSU9OU19DT1JEID0gMSwKLSAgR09PR0xFX1BST1RPQlVGX0ZJRUxET1BUSU9OU19TVFJJTkdfUElFQ0UgPSAyCi19IGdvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfQ1R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIEdPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19TUEVFRCA9IDEsCi0gIEdPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19DT0RFX1NJWkUgPSAyLAotICBHT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfTElURV9SVU5USU1FID0gMwotfSBnb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlOwotCi0vKiBTZWxlY3RvcnMgKi8KLQotLyogZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byAqLwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JQUk9UT19GSUVMRF9TVEFSVFNVQk1TRyAyCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX05FU1RFRF9UWVBFX1NUQVJUU1VCTVNHIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRU5VTV9UWVBFX1NUQVJUU1VCTVNHIDQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OX1JBTkdFX1NUQVJUU1VCTVNHIDUKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OX1NUQVJUU1VCTVNHIDYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fT1BUSU9OU19TVEFSVFNVQk1TRyA3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX0ZJRUxEX1NUQVJUU0VRIDgKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRklFTERfRU5EU0VRIDkKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRklFTERfRU5EU1VCTVNHIDEwCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX05FU1RFRF9UWVBFX1NUQVJUU0VRIDExCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX05FU1RFRF9UWVBFX0VORFNFUSAxMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JQUk9UT19ORVNURURfVFlQRV9FTkRTVUJNU0cgMTMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRU5VTV9UWVBFX1NUQVJUU0VRIDE0Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX0VOVU1fVFlQRV9FTkRTRVEgMTUKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRU5VTV9UWVBFX0VORFNVQk1TRyAxNgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05fUkFOR0VfU1RBUlRTRVEgMTcKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OX1JBTkdFX0VORFNFUSAxOAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05fUkFOR0VfRU5EU1VCTVNHIDE5Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTl9TVEFSVFNFUSAyMAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05fRU5EU0VRIDIxCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTl9FTkRTVUJNU0cgMjIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fT1BUSU9OU19FTkRTVUJNU0cgMjMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fTkFNRV9TVFJJTkcgMjQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fTkFNRV9TVEFSVFNUUiAyNQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JQUk9UT19OQU1FX0VORFNUUiAyNgotCi0vKiBnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFX1NUQVJUX0lOVDMyIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OUkFOR0VfRU5EX0lOVDMyIDMKLQotLyogZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gKi8KLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNREVTQ1JJUFRPUlBST1RPX1ZBTFVFX1NUQVJUU1VCTVNHIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNREVTQ1JJUFRPUlBST1RPX09QVElPTlNfU1RBUlRTVUJNU0cgMwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0VOVU1ERVNDUklQVE9SUFJPVE9fVkFMVUVfU1RBUlRTRVEgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0VOVU1ERVNDUklQVE9SUFJPVE9fVkFMVUVfRU5EU0VRIDUKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNREVTQ1JJUFRPUlBST1RPX1ZBTFVFX0VORFNVQk1TRyA2Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTURFU0NSSVBUT1JQUk9UT19PUFRJT05TX0VORFNVQk1TRyA3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTURFU0NSSVBUT1JQUk9UT19OQU1FX1NUUklORyA4Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTURFU0NSSVBUT1JQUk9UT19OQU1FX1NUQVJUU1RSIDkKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNREVTQ1JJUFRPUlBST1RPX05BTUVfRU5EU1RSIDEwCi0KLS8qIGdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyAqLwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0VOVU1PUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX1NUQVJUU1VCTVNHIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNT1BUSU9OU19VTklOVEVSUFJFVEVEX09QVElPTl9TVEFSVFNFUSAzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTU9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fRU5EU0VRIDQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNT1BUSU9OU19VTklOVEVSUFJFVEVEX09QVElPTl9FTkRTVUJNU0cgNQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0VOVU1PUFRJT05TX0FMTE9XX0FMSUFTX0JPT0wgNgotCi0vKiBnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPX09QVElPTlNfU1RBUlRTVUJNU0cgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0VOVU1WQUxVRURFU0NSSVBUT1JQUk9UT19PUFRJT05TX0VORFNVQk1TRyAzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPX05BTUVfU1RSSU5HIDQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNVkFMVUVERVNDUklQVE9SUFJPVE9fTkFNRV9TVEFSVFNUUiA1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPX05BTUVfRU5EU1RSIDYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNVkFMVUVERVNDUklQVE9SUFJPVE9fTlVNQkVSX0lOVDMyIDcKLQotLyogZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgKi8KLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNVkFMVUVPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX1NUQVJUU1VCTVNHIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNVkFMVUVPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX1NUQVJUU0VRIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9FTlVNVkFMVUVPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX0VORFNFUSA0Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRU5VTVZBTFVFT1BUSU9OU19VTklOVEVSUFJFVEVEX09QVElPTl9FTkRTVUJNU0cgNQotCi0vKiBnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gKi8KLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19PUFRJT05TX1NUQVJUU1VCTVNHIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19PUFRJT05TX0VORFNVQk1TRyAzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fTkFNRV9TVFJJTkcgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX05BTUVfU1RBUlRTVFIgNQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX05BTUVfRU5EU1RSIDYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19FWFRFTkRFRV9TVFJJTkcgNwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0VYVEVOREVFX1NUQVJUU1RSIDgKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19FWFRFTkRFRV9FTkRTVFIgOQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX05VTUJFUl9JTlQzMiAxMAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMX0lOVDMyIDExCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRV9JTlQzMiAxMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEVfTkFNRV9TVFJJTkcgMTMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFX05BTUVfU1RBUlRTVFIgMTQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFX05BTUVfRU5EU1RSIDE1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fREVGQVVMVF9WQUxVRV9TVFJJTkcgMTYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRERFU0NSSVBUT1JQUk9UT19ERUZBVUxUX1ZBTFVFX1NUQVJUU1RSIDE3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERERVNDUklQVE9SUFJPVE9fREVGQVVMVF9WQUxVRV9FTkRTVFIgMTgKLQotLyogZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyAqLwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxET1BUSU9OU19VTklOVEVSUFJFVEVEX09QVElPTl9TVEFSVFNVQk1TRyAyCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX1NUQVJUU0VRIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRE9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fRU5EU0VRIDQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRE9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fRU5EU1VCTVNHIDUKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRE9QVElPTlNfQ1RZUEVfSU5UMzIgNgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxET1BUSU9OU19QQUNLRURfQk9PTCA3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERPUFRJT05TX0RFUFJFQ0FURURfQk9PTCA4Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERPUFRJT05TX0xBWllfQk9PTCA5Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklFTERPUFRJT05TX0VYUEVSSU1FTlRBTF9NQVBfS0VZX1NUUklORyAxMAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxET1BUSU9OU19FWFBFUklNRU5UQUxfTUFQX0tFWV9TVEFSVFNUUiAxMQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJRUxET1BUSU9OU19FWFBFUklNRU5UQUxfTUFQX0tFWV9FTkRTVFIgMTIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUVMRE9QVElPTlNfV0VBS19CT09MIDEzCi0KLS8qIGdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19NRVNTQUdFX1RZUEVfU1RBUlRTVUJNU0cgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fRU5VTV9UWVBFX1NUQVJUU1VCTVNHIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX1NFUlZJQ0VfU1RBUlRTVUJNU0cgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OX1NUQVJUU1VCTVNHIDUKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX09QVElPTlNfU1RBUlRTVUJNU0cgNgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fU09VUkNFX0NPREVfSU5GT19TVEFSVFNVQk1TRyA3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19NRVNTQUdFX1RZUEVfU1RBUlRTRVEgOAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fTUVTU0FHRV9UWVBFX0VORFNFUSA5Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19NRVNTQUdFX1RZUEVfRU5EU1VCTVNHIDEwCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19FTlVNX1RZUEVfU1RBUlRTRVEgMTEKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX0VOVU1fVFlQRV9FTkRTRVEgMTIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX0VOVU1fVFlQRV9FTkRTVUJNU0cgMTMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX1NFUlZJQ0VfU1RBUlRTRVEgMTQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX1NFUlZJQ0VfRU5EU0VRIDE1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19TRVJWSUNFX0VORFNVQk1TRyAxNgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OX1NUQVJUU0VRIDE3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05fRU5EU0VRIDE4Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05fRU5EU1VCTVNHIDE5Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19PUFRJT05TX0VORFNVQk1TRyAyMAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fU09VUkNFX0NPREVfSU5GT19FTkRTVUJNU0cgMjEKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX05BTUVfU1RSSU5HIDIyCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19OQU1FX1NUQVJUU1RSIDIzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19OQU1FX0VORFNUUiAyNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fUEFDS0FHRV9TVFJJTkcgMjUKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX1BBQ0tBR0VfU1RBUlRTVFIgMjYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX1BBQ0tBR0VfRU5EU1RSIDI3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19ERVBFTkRFTkNZX1NUQVJUU0VRIDI4Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19ERVBFTkRFTkNZX0VORFNFUSAyOQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fREVQRU5ERU5DWV9TVFJJTkcgMzAKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX0RFUEVOREVOQ1lfU1RBUlRTVFIgMzEKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFREVTQ1JJUFRPUlBST1RPX0RFUEVOREVOQ1lfRU5EU1RSIDMyCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19QVUJMSUNfREVQRU5ERU5DWV9TVEFSVFNFUSAzMwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fUFVCTElDX0RFUEVOREVOQ1lfRU5EU0VRIDM0Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19QVUJMSUNfREVQRU5ERU5DWV9JTlQzMiAzNQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SUFJPVE9fV0VBS19ERVBFTkRFTkNZX1NUQVJUU0VRIDM2Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19XRUFLX0RFUEVOREVOQ1lfRU5EU0VRIDM3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JQUk9UT19XRUFLX0RFUEVOREVOQ1lfSU5UMzIgMzgKLQotLyogZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0ICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JTRVRfRklMRV9TVEFSVFNVQk1TRyAyCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JTRVRfRklMRV9TVEFSVFNFUSAzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRURFU0NSSVBUT1JTRVRfRklMRV9FTkRTRVEgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVERVNDUklQVE9SU0VUX0ZJTEVfRU5EU1VCTVNHIDUKLQotLyogZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fU1RBUlRTVUJNU0cgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX1NUQVJUU0VRIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19VTklOVEVSUFJFVEVEX09QVElPTl9FTkRTRVEgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX0VORFNVQk1TRyA1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfSkFWQV9QQUNLQUdFX1NUUklORyA2Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfSkFWQV9QQUNLQUdFX1NUQVJUU1RSIDcKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19KQVZBX1BBQ0tBR0VfRU5EU1RSIDgKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19KQVZBX09VVEVSX0NMQVNTTkFNRV9TVFJJTkcgOQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVPUFRJT05TX0pBVkFfT1VURVJfQ0xBU1NOQU1FX1NUQVJUU1RSIDEwCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfSkFWQV9PVVRFUl9DTEFTU05BTUVfRU5EU1RSIDExCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfT1BUSU1JWkVfRk9SX0lOVDMyIDEyCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfSkFWQV9NVUxUSVBMRV9GSUxFU19CT09MIDEzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfR09fUEFDS0FHRV9TVFJJTkcgMTQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19HT19QQUNLQUdFX1NUQVJUU1RSIDE1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfRklMRU9QVElPTlNfR09fUEFDS0FHRV9FTkRTVFIgMTYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19DQ19HRU5FUklDX1NFUlZJQ0VTX0JPT0wgMTcKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9GSUxFT1BUSU9OU19KQVZBX0dFTkVSSUNfU0VSVklDRVNfQk9PTCAxOAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVPUFRJT05TX1BZX0dFTkVSSUNfU0VSVklDRVNfQk9PTCAxOQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX0ZJTEVPUFRJT05TX0pBVkFfR0VORVJBVEVfRVFVQUxTX0FORF9IQVNIX0JPT0wgMjAKLQotLyogZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVTU0FHRU9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fU1RBUlRTVUJNU0cgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FU1NBR0VPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX1NUQVJUU0VRIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9NRVNTQUdFT1BUSU9OU19VTklOVEVSUFJFVEVEX09QVElPTl9FTkRTRVEgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FU1NBR0VPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX0VORFNVQk1TRyA1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVTU0FHRU9QVElPTlNfTUVTU0FHRV9TRVRfV0lSRV9GT1JNQVRfQk9PTCA2Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVTU0FHRU9QVElPTlNfTk9fU1RBTkRBUkRfREVTQ1JJUFRPUl9BQ0NFU1NPUl9CT09MIDcKLQotLyogZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byAqLwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FVEhPRERFU0NSSVBUT1JQUk9UT19PUFRJT05TX1NUQVJUU1VCTVNHIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9NRVRIT0RERVNDUklQVE9SUFJPVE9fT1BUSU9OU19FTkRTVUJNU0cgMwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FVEhPRERFU0NSSVBUT1JQUk9UT19OQU1FX1NUUklORyA0Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVUSE9EREVTQ1JJUFRPUlBST1RPX05BTUVfU1RBUlRTVFIgNQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FVEhPRERFU0NSSVBUT1JQUk9UT19OQU1FX0VORFNUUiA2Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVUSE9EREVTQ1JJUFRPUlBST1RPX0lOUFVUX1RZUEVfU1RSSU5HIDcKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9NRVRIT0RERVNDUklQVE9SUFJPVE9fSU5QVVRfVFlQRV9TVEFSVFNUUiA4Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVUSE9EREVTQ1JJUFRPUlBST1RPX0lOUFVUX1RZUEVfRU5EU1RSIDkKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9NRVRIT0RERVNDUklQVE9SUFJPVE9fT1VUUFVUX1RZUEVfU1RSSU5HIDEwCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVUSE9EREVTQ1JJUFRPUlBST1RPX09VVFBVVF9UWVBFX1NUQVJUU1RSIDExCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfTUVUSE9EREVTQ1JJUFRPUlBST1RPX09VVFBVVF9UWVBFX0VORFNUUiAxMgotCi0vKiBnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyAqLwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FVEhPRE9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fU1RBUlRTVUJNU0cgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FVEhPRE9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fU1RBUlRTRVEgMwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX01FVEhPRE9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fRU5EU0VRIDQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9NRVRIT0RPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX0VORFNVQk1TRyA1Ci0KLS8qIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU0VSVklDRURFU0NSSVBUT1JQUk9UT19NRVRIT0RfU1RBUlRTVUJNU0cgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VERVNDUklQVE9SUFJPVE9fT1BUSU9OU19TVEFSVFNVQk1TRyAzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU0VSVklDRURFU0NSSVBUT1JQUk9UT19NRVRIT0RfU1RBUlRTRVEgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VERVNDUklQVE9SUFJPVE9fTUVUSE9EX0VORFNFUSA1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU0VSVklDRURFU0NSSVBUT1JQUk9UT19NRVRIT0RfRU5EU1VCTVNHIDYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TRVJWSUNFREVTQ1JJUFRPUlBST1RPX09QVElPTlNfRU5EU1VCTVNHIDcKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TRVJWSUNFREVTQ1JJUFRPUlBST1RPX05BTUVfU1RSSU5HIDgKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TRVJWSUNFREVTQ1JJUFRPUlBST1RPX05BTUVfU1RBUlRTVFIgOQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VERVNDUklQVE9SUFJPVE9fTkFNRV9FTkRTVFIgMTAKLQotLyogZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU0VSVklDRU9QVElPTlNfVU5JTlRFUlBSRVRFRF9PUFRJT05fU1RBUlRTVUJNU0cgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX1NUQVJUU0VRIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TRVJWSUNFT1BUSU9OU19VTklOVEVSUFJFVEVEX09QVElPTl9FTkRTRVEgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VPUFRJT05TX1VOSU5URVJQUkVURURfT1BUSU9OX0VORFNVQk1TRyA1Ci0KLS8qIGdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyAqLwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OX1NUQVJUU1VCTVNHIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTl9TVEFSVFNFUSAzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU09VUkNFQ09ERUlORk9fTE9DQVRJT05fRU5EU0VRIDQKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTl9FTkRTVUJNU0cgNQotCi0vKiBnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gKi8KLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTl9QQVRIX1NUQVJUU0VRIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTl9QQVRIX0VORFNFUSAzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU09VUkNFQ09ERUlORk9fTE9DQVRJT05fUEFUSF9JTlQzMiA0Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU09VUkNFQ09ERUlORk9fTE9DQVRJT05fU1BBTl9TVEFSVFNFUSA1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU09VUkNFQ09ERUlORk9fTE9DQVRJT05fU1BBTl9FTkRTRVEgNgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OX1NQQU5fSU5UMzIgNwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OX0xFQURJTkdfQ09NTUVOVFNfU1RSSU5HIDgKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTl9MRUFESU5HX0NPTU1FTlRTX1NUQVJUU1RSIDkKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTl9MRUFESU5HX0NPTU1FTlRTX0VORFNUUiAxMAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OX1RSQUlMSU5HX0NPTU1FTlRTX1NUUklORyAxMQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OX1RSQUlMSU5HX0NPTU1FTlRTX1NUQVJUU1RSIDEyCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfU09VUkNFQ09ERUlORk9fTE9DQVRJT05fVFJBSUxJTkdfQ09NTUVOVFNfRU5EU1RSIDEzCi0KLS8qIGdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uICovCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfVU5JTlRFUlBSRVRFRE9QVElPTl9OQU1FX1NUQVJUU1VCTVNHIDIKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVfU1RBUlRTRVEgMwotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fTkFNRV9FTkRTRVEgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fTkFNRV9FTkRTVUJNU0cgNQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fSURFTlRJRklFUl9WQUxVRV9TVFJJTkcgNgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fSURFTlRJRklFUl9WQUxVRV9TVEFSVFNUUiA3Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfVU5JTlRFUlBSRVRFRE9QVElPTl9JREVOVElGSUVSX1ZBTFVFX0VORFNUUiA4Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfVU5JTlRFUlBSRVRFRE9QVElPTl9QT1NJVElWRV9JTlRfVkFMVUVfVUlOVDY0IDkKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9VTklOVEVSUFJFVEVET1BUSU9OX05FR0FUSVZFX0lOVF9WQUxVRV9JTlQ2NCAxMAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fRE9VQkxFX1ZBTFVFX0RPVUJMRSAxMQotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fU1RSSU5HX1ZBTFVFX1NUUklORyAxMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fU1RSSU5HX1ZBTFVFX1NUQVJUU1RSIDEzCi0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfVU5JTlRFUlBSRVRFRE9QVElPTl9TVFJJTkdfVkFMVUVfRU5EU1RSIDE0Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfVU5JTlRFUlBSRVRFRE9QVElPTl9BR0dSRUdBVEVfVkFMVUVfU1RSSU5HIDE1Ci0jZGVmaW5lIFNFTF9HT09HTEVfUFJPVE9CVUZfVU5JTlRFUlBSRVRFRE9QVElPTl9BR0dSRUdBVEVfVkFMVUVfU1RBUlRTVFIgMTYKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9VTklOVEVSUFJFVEVET1BUSU9OX0FHR1JFR0FURV9WQUxVRV9FTkRTVFIgMTcKLQotLyogZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgKi8KLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJUX05BTUVfUEFSVF9TVFJJTkcgMgotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlRfTkFNRV9QQVJUX1NUQVJUU1RSIDMKLSNkZWZpbmUgU0VMX0dPT0dMRV9QUk9UT0JVRl9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJUX05BTUVfUEFSVF9FTkRTVFIgNAotI2RlZmluZSBTRUxfR09PR0xFX1BST1RPQlVGX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlRfSVNfRVhURU5TSU9OX0JPT0wgNQotCi1jb25zdCB1cGJfc3ltdGFiICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9kZXNjcmlwdG9yKGNvbnN0IHZvaWQgKm93bmVyKTsKLQotLyogTWVzc2FnZURlZnMgKi8KLVVQQl9JTkxJTkUgY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IHVwYl9zeW10YWJfbG9va3VwbXNnKHMsICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIik7Ci0gIGFzc2VydChtKTsKLSAgcmV0dXJuIG07Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZShjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IHVwYl9zeW10YWJfbG9va3VwbXNnKHMsICJnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9ucyhjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIik7Ci0gIGFzc2VydChtKTsKLSAgcmV0dXJuIG07Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90byhjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IHVwYl9zeW10YWJfbG9va3VwbXNnKHMsICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIik7Ci0gIGFzc2VydChtKTsKLSAgcmV0dXJuIG07Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9ucyhjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IHVwYl9zeW10YWJfbG9va3VwbXNnKHMsICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclNldChjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0Iik7Ci0gIGFzc2VydChtKTsKLSAgcmV0dXJuIG07Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IHVwYl9zeW10YWJfbG9va3VwbXNnKHMsICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMiKTsKLSAgYXNzZXJ0KG0pOwotICByZXR1cm4gbTsKLX0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnMoY29uc3QgdXBiX3N5bXRhYiAqcykgewotICBjb25zdCB1cGJfbXNnZGVmICptID0gdXBiX3N5bXRhYl9sb29rdXBtc2cocywgImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG8oY29uc3QgdXBiX3N5bXRhYiAqcykgewotICBjb25zdCB1cGJfbXNnZGVmICptID0gdXBiX3N5bXRhYl9sb29rdXBtc2cocywgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8iKTsKLSAgYXNzZXJ0KG0pOwotICByZXR1cm4gbTsKLX0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kT3B0aW9ucyhjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMiKTsKLSAgYXNzZXJ0KG0pOwotICByZXR1cm4gbTsKLX0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90byhjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8iKTsKLSAgYXNzZXJ0KG0pOwotICByZXR1cm4gbTsKLX0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZU9wdGlvbnMoY29uc3QgdXBiX3N5bXRhYiAqcykgewotICBjb25zdCB1cGJfbXNnZGVmICptID0gdXBiX3N5bXRhYl9sb29rdXBtc2cocywgImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyIpOwotICBhc3NlcnQobSk7Ci0gIHJldHVybiBtOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mbyhjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIik7Ci0gIGFzc2VydChtKTsKLSAgcmV0dXJuIG07Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IHVwYl9zeW10YWJfbG9va3VwbXNnKHMsICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24iKTsKLSAgYXNzZXJ0KG0pOwotICByZXR1cm4gbTsKLX0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbihjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24iKTsKLSAgYXNzZXJ0KG0pOwotICByZXR1cm4gbTsKLX0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydChjb25zdCB1cGJfc3ltdGFiICpzKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQiKTsKLSAgYXNzZXJ0KG0pOwotICByZXR1cm4gbTsKLX0KLQotCi0vKiBFbnVtRGVmcyAqLwotVVBCX0lOTElORSBjb25zdCB1cGJfZW51bWRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwoY29uc3QgdXBiX3N5bXRhYiAqcykgewotICBjb25zdCB1cGJfZW51bWRlZiAqZSA9IHVwYl9zeW10YWJfbG9va3VwZW51bShzLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIik7Ci0gIGFzc2VydChlKTsKLSAgcmV0dXJuIGU7Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9lbnVtZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19UeXBlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX2VudW1kZWYgKmUgPSB1cGJfc3ltdGFiX2xvb2t1cGVudW0ocywgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIik7Ci0gIGFzc2VydChlKTsKLSAgcmV0dXJuIGU7Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9lbnVtZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfQ1R5cGUoY29uc3QgdXBiX3N5bXRhYiAqcykgewotICBjb25zdCB1cGJfZW51bWRlZiAqZSA9IHVwYl9zeW10YWJfbG9va3VwZW51bShzLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSIpOwotICBhc3NlcnQoZSk7Ci0gIHJldHVybiBlOwotfQotVVBCX0lOTElORSBjb25zdCB1cGJfZW51bWRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsKLSAgY29uc3QgdXBiX2VudW1kZWYgKmUgPSB1cGJfc3ltdGFiX2xvb2t1cGVudW0ocywgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUiKTsKLSAgYXNzZXJ0KGUpOwotICByZXR1cm4gZTsKLX0KLQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9lbmQoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZShzKSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2Vfc3RhcnQoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZShzKSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZW51bV90eXBlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG8ocyksIDQpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2V4dGVuc2lvbihjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvKHMpLCA2KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19leHRlbnNpb25fcmFuZ2UoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90byhzKSwgNSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZmllbGQoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90byhzKSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fbmFtZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvKHMpLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19uZXN0ZWRfdHlwZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19vcHRpb25zKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG8ocyksIDcpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90b19uYW1lKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvKHMpLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1EZXNjcmlwdG9yUHJvdG9fb3B0aW9ucyhjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90byhzKSwgMyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX3ZhbHVlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvKHMpLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX2FsbG93X2FsaWFzKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9ucyhzKSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9uc191bmludGVycHJldGVkX29wdGlvbihjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnMocyksIDk5OSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fbmFtZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKHMpLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19udW1iZXIoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90byhzKSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fb3B0aW9ucyhjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnNfdW5pbnRlcnByZXRlZF9vcHRpb24oY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnMocyksIDk5OSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19kZWZhdWx0X3ZhbHVlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90byhzKSwgNyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19leHRlbmRlZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG8ocyksIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fbGFiZWwoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvKHMpLCA0KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX25hbWUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvKHMpLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX251bWJlcihjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG8ocyksIDMpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fb3B0aW9ucyhjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG8ocyksIDgpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fdHlwZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG8ocyksIDUpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fdHlwZV9uYW1lKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90byhzKSwgNik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfY3R5cGUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9ucyhzKSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfZGVwcmVjYXRlZChjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19leHBlcmltZW50YWxfbWFwX2tleShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zKHMpLCA5KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19sYXp5KGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnMocyksIDUpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX3BhY2tlZChjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zKHMpLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc191bmludGVycHJldGVkX29wdGlvbihjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zKHMpLCA5OTkpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX3dlYWsoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9ucyhzKSwgMTApOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19kZXBlbmRlbmN5KGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZW51bV90eXBlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvKHMpLCA1KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZXh0ZW5zaW9uKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvKHMpLCA3KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fbWVzc2FnZV90eXBlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvKHMpLCA0KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fbmFtZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90byhzKSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX29wdGlvbnMoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG8ocyksIDgpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19wYWNrYWdlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvKHMpLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fcHVibGljX2RlcGVuZGVuY3koY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG8ocyksIDEwKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fc2VydmljZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90byhzKSwgNik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX3NvdXJjZV9jb2RlX2luZm8oY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG8ocyksIDkpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b193ZWFrX2RlcGVuZGVuY3koY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG8ocyksIDExKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X2ZpbGUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0KHMpLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2NjX2dlbmVyaWNfc2VydmljZXMoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zKHMpLCAxNik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19nb19wYWNrYWdlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9ucyhzKSwgMTEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zKHMpLCAyMCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19qYXZhX2dlbmVyaWNfc2VydmljZXMoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zKHMpLCAxNyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19qYXZhX211bHRpcGxlX2ZpbGVzKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9ucyhzKSwgMTApOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zKHMpLCA4KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2phdmFfcGFja2FnZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnMocyksIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfb3B0aW1pemVfZm9yKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9ucyhzKSwgOSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19weV9nZW5lcmljX3NlcnZpY2VzKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9ucyhzKSwgMTgpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfdW5pbnRlcnByZXRlZF9vcHRpb24oY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zKHMpLCA5OTkpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zKHMpLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zKHMpLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9ucyhzKSwgOTk5KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19pbnB1dF90eXBlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG8ocyksIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX25hbWUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90byhzKSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fb3B0aW9ucyhjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvKHMpLCA0KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19vdXRwdXRfdHlwZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnNfdW5pbnRlcnByZXRlZF9vcHRpb24oY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnMocyksIDk5OSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX21ldGhvZChjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90byhzKSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX25hbWUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG8ocyksIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19vcHRpb25zKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VPcHRpb25zX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlT3B0aW9ucyhzKSwgOTk5KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2xlYWRpbmdfY29tbWVudHMoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3BhdGgoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKHMpLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3NwYW4oY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKHMpLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbihzKSwgNCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19sb2NhdGlvbihjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm8ocyksIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9pc19leHRlbnNpb24oY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQocyksIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9uYW1lX3BhcnQoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQocyksIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb24ocyksIDgpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9kb3VibGVfdmFsdWUoY29uc3QgdXBiX3N5bXRhYiAqcykgeyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb24ocyksIDYpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IHVwYl9zeW10YWIgKnMpIHsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZih1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uKHMpLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fbmFtZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbihzKSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX25lZ2F0aXZlX2ludF92YWx1ZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbihzKSwgNSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX3Bvc2l0aXZlX2ludF92YWx1ZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbihzKSwgNCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX3N0cmluZ192YWx1ZShjb25zdCB1cGJfc3ltdGFiICpzKSB7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YodXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbihzKSwgNyk7IH0KLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYmRlZnMgewotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGRlc2NyaXB0b3IgewotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OlN5bWJvbFRhYmxlPiBTeW1ib2xUYWJsZSgpIHsKLSAgY29uc3QgdXBiOjpTeW1ib2xUYWJsZSogcyA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX2Rlc2NyaXB0b3IoJnMpOwotICByZXR1cm4gdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6U3ltYm9sVGFibGU+KHMsICZzKTsKLX0KLX0gIC8qIG5hbWVzcGFjZSBkZXNjcmlwdG9yICovCi19ICAvKiBuYW1lc3BhY2UgcHJvdG9idWYgKi8KLX0gIC8qIG5hbWVzcGFjZSBnb29nbGUgKi8KLQotI2RlZmluZSBSRVRVUk5fUkVGRkVEKHR5cGUsIGZ1bmMpIFwKLSAgICBjb25zdCB0eXBlKiBvYmogPSBmdW5jKHVwYmRlZnM6Omdvb2dsZTo6cHJvdG9idWY6OmRlc2NyaXB0b3I6OlN5bWJvbFRhYmxlKCkuZ2V0KCkpOyBcCi0gICAgcmV0dXJuIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB0eXBlPihvYmopOwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRGVzY3JpcHRvclByb3RvIHsKLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpNZXNzYWdlRGVmPiBNZXNzYWdlRGVmKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6TWVzc2FnZURlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGVudW1fdHlwZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZW51bV90eXBlKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGV4dGVuc2lvbigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZXh0ZW5zaW9uKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGV4dGVuc2lvbl9yYW5nZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZXh0ZW5zaW9uX3JhbmdlKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGZpZWxkKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19maWVsZCkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBuYW1lKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19uYW1lKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG5lc3RlZF90eXBlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19uZXN0ZWRfdHlwZSkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBvcHRpb25zKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19vcHRpb25zKSB9Ci19ICAvKiBuYW1lc3BhY2UgRGVzY3JpcHRvclByb3RvICovCi19ICAvKiBuYW1lc3BhY2UgcHJvdG9idWYgKi8KLX0gIC8qIG5hbWVzcGFjZSBnb29nbGUgKi8KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIERlc2NyaXB0b3JQcm90byB7Ci1uYW1lc3BhY2UgRXh0ZW5zaW9uUmFuZ2UgewotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6Ok1lc3NhZ2VEZWY+IE1lc3NhZ2VEZWYoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpNZXNzYWdlRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gZW5kKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9lbmQpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gc3RhcnQoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3N0YXJ0KSB9Ci19ICAvKiBuYW1lc3BhY2UgRXh0ZW5zaW9uUmFuZ2UgKi8KLX0gIC8qIG5hbWVzcGFjZSBEZXNjcmlwdG9yUHJvdG8gKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRW51bURlc2NyaXB0b3JQcm90byB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1EZXNjcmlwdG9yUHJvdG8pIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gbmFtZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX25hbWUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gb3B0aW9ucygpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX29wdGlvbnMpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gdmFsdWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90b192YWx1ZSkgfQotfSAgLyogbmFtZXNwYWNlIEVudW1EZXNjcmlwdG9yUHJvdG8gKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRW51bU9wdGlvbnMgewotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6Ok1lc3NhZ2VEZWY+IE1lc3NhZ2VEZWYoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpNZXNzYWdlRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9ucykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBhbGxvd19hbGlhcygpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9uc19hbGxvd19hbGlhcykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiB1bmludGVycHJldGVkX29wdGlvbigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9uc191bmludGVycHJldGVkX29wdGlvbikgfQotfSAgLyogbmFtZXNwYWNlIEVudW1PcHRpb25zICovCi19ICAvKiBuYW1lc3BhY2UgcHJvdG9idWYgKi8KLX0gIC8qIG5hbWVzcGFjZSBnb29nbGUgKi8KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90bykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBuYW1lKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19uYW1lKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG51bWJlcigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fbnVtYmVyKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG9wdGlvbnMoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX29wdGlvbnMpIH0KLX0gIC8qIG5hbWVzcGFjZSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRW51bVZhbHVlT3B0aW9ucyB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnMpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlT3B0aW9uc191bmludGVycHJldGVkX29wdGlvbikgfQotfSAgLyogbmFtZXNwYWNlIEVudW1WYWx1ZU9wdGlvbnMgKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRmllbGREZXNjcmlwdG9yUHJvdG8gewotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6Ok1lc3NhZ2VEZWY+IE1lc3NhZ2VEZWYoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpNZXNzYWdlRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90bykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBkZWZhdWx0X3ZhbHVlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX2RlZmF1bHRfdmFsdWUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gZXh0ZW5kZWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fZXh0ZW5kZWUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gbGFiZWwoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fbGFiZWwpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gbmFtZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19uYW1lKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG51bWJlcigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19udW1iZXIpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gb3B0aW9ucygpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19vcHRpb25zKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IHR5cGUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fdHlwZSkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiB0eXBlX25hbWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fdHlwZV9uYW1lKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RW51bURlZj4gTGFiZWwoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpFbnVtRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkVudW1EZWY+IFR5cGUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpFbnVtRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19UeXBlKSB9Ci19ICAvKiBuYW1lc3BhY2UgRmllbGREZXNjcmlwdG9yUHJvdG8gKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRmllbGRPcHRpb25zIHsKLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpNZXNzYWdlRGVmPiBNZXNzYWdlRGVmKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6TWVzc2FnZURlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGN0eXBlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19jdHlwZSkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBkZXByZWNhdGVkKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19kZXByZWNhdGVkKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGV4cGVyaW1lbnRhbF9tYXBfa2V5KCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19leHBlcmltZW50YWxfbWFwX2tleSkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBsYXp5KCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19sYXp5KSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IHBhY2tlZCgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfcGFja2VkKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc191bmludGVycHJldGVkX29wdGlvbikgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiB3ZWFrKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc193ZWFrKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RW51bURlZj4gQ1R5cGUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpFbnVtRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfQ1R5cGUpIH0KLX0gIC8qIG5hbWVzcGFjZSBGaWVsZE9wdGlvbnMgKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRmlsZURlc2NyaXB0b3JQcm90byB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG8pIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gZGVwZW5kZW5jeSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2RlcGVuZGVuY3kpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gZW51bV90eXBlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZW51bV90eXBlKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGV4dGVuc2lvbigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2V4dGVuc2lvbikgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBtZXNzYWdlX3R5cGUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19tZXNzYWdlX3R5cGUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gbmFtZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX25hbWUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gb3B0aW9ucygpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX29wdGlvbnMpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gcGFja2FnZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX3BhY2thZ2UpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gcHVibGljX2RlcGVuZGVuY3koKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19wdWJsaWNfZGVwZW5kZW5jeSkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBzZXJ2aWNlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fc2VydmljZSkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBzb3VyY2VfY29kZV9pbmZvKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fc291cmNlX2NvZGVfaW5mbykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiB3ZWFrX2RlcGVuZGVuY3koKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b193ZWFrX2RlcGVuZGVuY3kpIH0KLX0gIC8qIG5hbWVzcGFjZSBGaWxlRGVzY3JpcHRvclByb3RvICovCi19ICAvKiBuYW1lc3BhY2UgcHJvdG9idWYgKi8KLX0gIC8qIG5hbWVzcGFjZSBnb29nbGUgKi8KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIEZpbGVEZXNjcmlwdG9yU2V0IHsKLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpNZXNzYWdlRGVmPiBNZXNzYWdlRGVmKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6TWVzc2FnZURlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JTZXQpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gZmlsZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclNldF9maWxlKSB9Ci19ICAvKiBuYW1lc3BhY2UgRmlsZURlc2NyaXB0b3JTZXQgKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgRmlsZU9wdGlvbnMgewotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6Ok1lc3NhZ2VEZWY+IE1lc3NhZ2VEZWYoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpNZXNzYWdlRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9ucykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBjY19nZW5lcmljX3NlcnZpY2VzKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2NjX2dlbmVyaWNfc2VydmljZXMpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gZ29fcGFja2FnZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19nb19wYWNrYWdlKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGphdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19qYXZhX2dlbmVyaWNfc2VydmljZXMpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gamF2YV9tdWx0aXBsZV9maWxlcygpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19qYXZhX211bHRpcGxlX2ZpbGVzKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGphdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2phdmFfb3V0ZXJfY2xhc3NuYW1lKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGphdmFfcGFja2FnZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19qYXZhX3BhY2thZ2UpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gb3B0aW1pemVfZm9yKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX29wdGltaXplX2ZvcikgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBweV9nZW5lcmljX3NlcnZpY2VzKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX3B5X2dlbmVyaWNfc2VydmljZXMpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfdW5pbnRlcnByZXRlZF9vcHRpb24pIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpFbnVtRGVmPiBPcHRpbWl6ZU1vZGUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpFbnVtRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUpIH0KLX0gIC8qIG5hbWVzcGFjZSBGaWxlT3B0aW9ucyAqLwotfSAgLyogbmFtZXNwYWNlIHByb3RvYnVmICovCi19ICAvKiBuYW1lc3BhY2UgZ29vZ2xlICovCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBNZXNzYWdlT3B0aW9ucyB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcikgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiB1bmludGVycHJldGVkX29wdGlvbigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc191bmludGVycHJldGVkX29wdGlvbikgfQotfSAgLyogbmFtZXNwYWNlIE1lc3NhZ2VPcHRpb25zICovCi19ICAvKiBuYW1lc3BhY2UgcHJvdG9idWYgKi8KLX0gIC8qIG5hbWVzcGFjZSBnb29nbGUgKi8KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIE1ldGhvZERlc2NyaXB0b3JQcm90byB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90bykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBpbnB1dF90eXBlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19pbnB1dF90eXBlKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG5hbWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX25hbWUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gb3B0aW9ucygpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fb3B0aW9ucykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBvdXRwdXRfdHlwZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fb3V0cHV0X3R5cGUpIH0KLX0gIC8qIG5hbWVzcGFjZSBNZXRob2REZXNjcmlwdG9yUHJvdG8gKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgTWV0aG9kT3B0aW9ucyB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnMpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kT3B0aW9uc191bmludGVycHJldGVkX29wdGlvbikgfQotfSAgLyogbmFtZXNwYWNlIE1ldGhvZE9wdGlvbnMgKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgU2VydmljZURlc2NyaXB0b3JQcm90byB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG8pIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gbWV0aG9kKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG9fbWV0aG9kKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG5hbWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19uYW1lKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG9wdGlvbnMoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19vcHRpb25zKSB9Ci19ICAvKiBuYW1lc3BhY2UgU2VydmljZURlc2NyaXB0b3JQcm90byAqLwotfSAgLyogbmFtZXNwYWNlIHByb3RvYnVmICovCi19ICAvKiBuYW1lc3BhY2UgZ29vZ2xlICovCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBTZXJ2aWNlT3B0aW9ucyB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VPcHRpb25zKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VPcHRpb25zX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKSB9Ci19ICAvKiBuYW1lc3BhY2UgU2VydmljZU9wdGlvbnMgKi8KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgU291cmNlQ29kZUluZm8gewotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6Ok1lc3NhZ2VEZWY+IE1lc3NhZ2VEZWYoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpNZXNzYWdlRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mbykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBsb2NhdGlvbigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19sb2NhdGlvbikgfQotfSAgLyogbmFtZXNwYWNlIFNvdXJjZUNvZGVJbmZvICovCi19ICAvKiBuYW1lc3BhY2UgcHJvdG9idWYgKi8KLX0gIC8qIG5hbWVzcGFjZSBnb29nbGUgKi8KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIFNvdXJjZUNvZGVJbmZvIHsKLW5hbWVzcGFjZSBMb2NhdGlvbiB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGxlYWRpbmdfY29tbWVudHMoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25fbGVhZGluZ19jb21tZW50cykgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBwYXRoKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3BhdGgpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gc3BhbigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9zcGFuKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IHRyYWlsaW5nX2NvbW1lbnRzKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3RyYWlsaW5nX2NvbW1lbnRzKSB9Ci19ICAvKiBuYW1lc3BhY2UgTG9jYXRpb24gKi8KLX0gIC8qIG5hbWVzcGFjZSBTb3VyY2VDb2RlSW5mbyAqLwotfSAgLyogbmFtZXNwYWNlIHByb3RvYnVmICovCi19ICAvKiBuYW1lc3BhY2UgZ29vZ2xlICovCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBVbmludGVycHJldGVkT3B0aW9uIHsKLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpNZXNzYWdlRGVmPiBNZXNzYWdlRGVmKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6TWVzc2FnZURlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbikgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBhZ2dyZWdhdGVfdmFsdWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9hZ2dyZWdhdGVfdmFsdWUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gZG91YmxlX3ZhbHVlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fZG91YmxlX3ZhbHVlKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IGlkZW50aWZpZXJfdmFsdWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9pZGVudGlmaWVyX3ZhbHVlKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG5hbWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9uYW1lKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG5lZ2F0aXZlX2ludF92YWx1ZSgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX25lZ2F0aXZlX2ludF92YWx1ZSkgfQotaW5saW5lIHVwYjo6cmVmZmVkX3B0cjxjb25zdCB1cGI6OkZpZWxkRGVmPiBwb3NpdGl2ZV9pbnRfdmFsdWUoKSB7IFJFVFVSTl9SRUZGRUQodXBiOjpGaWVsZERlZiwgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9wb3NpdGl2ZV9pbnRfdmFsdWUpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gc3RyaW5nX3ZhbHVlKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fc3RyaW5nX3ZhbHVlKSB9Ci19ICAvKiBuYW1lc3BhY2UgVW5pbnRlcnByZXRlZE9wdGlvbiAqLwotfSAgLyogbmFtZXNwYWNlIHByb3RvYnVmICovCi19ICAvKiBuYW1lc3BhY2UgZ29vZ2xlICovCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBVbmludGVycHJldGVkT3B0aW9uIHsKLW5hbWVzcGFjZSBOYW1lUGFydCB7Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6TWVzc2FnZURlZj4gTWVzc2FnZURlZigpIHsgUkVUVVJOX1JFRkZFRCh1cGI6Ok1lc3NhZ2VEZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQpIH0KLWlubGluZSB1cGI6OnJlZmZlZF9wdHI8Y29uc3QgdXBiOjpGaWVsZERlZj4gaXNfZXh0ZW5zaW9uKCkgeyBSRVRVUk5fUkVGRkVEKHVwYjo6RmllbGREZWYsIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfaXNfZXh0ZW5zaW9uKSB9Ci1pbmxpbmUgdXBiOjpyZWZmZWRfcHRyPGNvbnN0IHVwYjo6RmllbGREZWY+IG5hbWVfcGFydCgpIHsgUkVUVVJOX1JFRkZFRCh1cGI6OkZpZWxkRGVmLCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X25hbWVfcGFydCkgfQotfSAgLyogbmFtZXNwYWNlIE5hbWVQYXJ0ICovCi19ICAvKiBuYW1lc3BhY2UgVW5pbnRlcnByZXRlZE9wdGlvbiAqLwotfSAgLyogbmFtZXNwYWNlIHByb3RvYnVmICovCi19ICAvKiBuYW1lc3BhY2UgZ29vZ2xlICovCi0KLX0gIC8qIG5hbWVzcGFjZSB1cGJkZWZzICovCi0KLQotI3VuZGVmIFJFVFVSTl9SRUZGRUQKLSNlbmRpZiAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX1VQQl9IXyAqLwotLyoKLSoqIEludGVybmFsLW9ubHkgZGVmaW5pdGlvbnMgZm9yIHRoZSBkZWNvZGVyLgotKi8KLQotI2lmbmRlZiBVUEJfREVDT0RFUl9JTlRfSF8KLSNkZWZpbmUgVVBCX0RFQ09ERVJfSU5UX0hfCi0KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLS8qCi0qKiB1cGI6OnBiOjpEZWNvZGVyCi0qKgotKiogQSBoaWdoIHBlcmZvcm1hbmNlLCBzdHJlYW1pbmcsIHJlc3VtYWJsZSBkZWNvZGVyIGZvciB0aGUgYmluYXJ5IHByb3RvYnVmCi0qKiBmb3JtYXQuCi0qKgotKiogVGhpcyBpbnRlcmZhY2Ugd29ya3MgdGhlIHNhbWUgcmVnYXJkbGVzcyBvZiB3aGF0IGRlY29kZXIgYmFja2VuZCBpcyBiZWluZwotKiogdXNlZC4gIEEgY2xpZW50IG9mIHRoaXMgY2xhc3MgZG9lcyBub3QgbmVlZCB0byBrbm93IHdoZXRoZXIgZGVjb2RpbmcgaXMgdXNpbmcKLSoqIGEgSklUdGVkIGRlY29kZXIgKER5bkFTTSwgTExWTSwgZXRjKSBvciBhbiBpbnRlcnByZXRlZCBkZWNvZGVyLiAgQnkgZGVmYXVsdCwKLSoqIGl0IHdpbGwgYWx3YXlzIHVzZSB0aGUgZmFzdGVzdCBhdmFpbGFibGUgZGVjb2Rlci4gIEhvd2V2ZXIsIHlvdSBjYW4gY2FsbAotKiogc2V0X2FsbG93X2ppdChmYWxzZSkgdG8gZGlzYWJsZSBhbnkgSklUIGRlY29kZXIgdGhhdCBtaWdodCBiZSBhdmFpbGFibGUuCi0qKiBUaGlzIGlzIHByaW1hcmlseSB1c2VmdWwgZm9yIHRlc3RpbmcgcHVycG9zZXMuCi0qLwotCi0jaWZuZGVmIFVQQl9ERUNPREVSX0hfCi0jZGVmaW5lIFVQQl9ERUNPREVSX0hfCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgdXBiIHsKLW5hbWVzcGFjZSBwYiB7Ci1jbGFzcyBDb2RlQ2FjaGU7Ci1jbGFzcyBEZWNvZGVyOwotY2xhc3MgRGVjb2Rlck1ldGhvZDsKLWNsYXNzIERlY29kZXJNZXRob2RPcHRpb25zOwotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OnBiOjpDb2RlQ2FjaGUsIHVwYl9wYmNvZGVjYWNoZSkKLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpwYjo6RGVjb2RlciwgdXBiX3BiZGVjb2RlcikKLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpwYjo6RGVjb2Rlck1ldGhvZE9wdGlvbnMsIHVwYl9wYmRlY29kZXJtZXRob2RvcHRzKQotCi1VUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUodXBiOjpwYjo6RGVjb2Rlck1ldGhvZCwgdXBiOjpSZWZDb3VudGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9wYmRlY29kZXJtZXRob2QsIHVwYl9yZWZjb3VudGVkKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogVGhlIHBhcmFtZXRlcnMgb25lIHVzZXMgdG8gY29uc3RydWN0IGEgRGVjb2Rlck1ldGhvZC4KLSAqIFRPRE8oaGFiZXJtYW4pOiBtb3ZlIGFsbG93aml0IGhlcmU/ICBTZWVtcyBtb3JlIGNvbnZlbmllbnQgZm9yIHVzZXJzLgotICogVE9ETyhoYWJlcm1hbik6IG1vdmUgdGhpcyB0byBiZSBoZWFwIGFsbG9jYXRlZCBmb3IgQUJJIHN0YWJpbGl0eS4gKi8KLWNsYXNzIHVwYjo6cGI6OkRlY29kZXJNZXRob2RPcHRpb25zIHsKLSBwdWJsaWM6Ci0gIC8qIFBhcmFtZXRlciByZXByZXNlbnRzIHRoZSBkZXN0aW5hdGlvbiBoYW5kbGVycyB0aGF0IHRoaXMgbWV0aG9kIHdpbGwgcHVzaAotICAgKiB0by4gKi8KLSAgZXhwbGljaXQgRGVjb2Rlck1ldGhvZE9wdGlvbnMoY29uc3QgSGFuZGxlcnMqIGRlc3RfaGFuZGxlcnMpOwotCi0gIC8qIFNob3VsZCB0aGUgZGVjb2RlciBwdXNoIHN1Ym1lc3NhZ2VzIHRvIGxhenkgaGFuZGxlcnMgZm9yIGZpZWxkcyB0aGF0IGhhdmUKLSAgICogdGhlbT8gIFRoZSBjYWxsZXIgc2hvdWxkIHNldCB0aGlzIGlmZiB0aGUgbGF6eSBoYW5kbGVycyBleHBlY3QgZGF0YSB0aGF0IGlzCi0gICAqIGluIHByb3RvYnVmIGJpbmFyeSBmb3JtYXQgYW5kIHRoZSBjYWxsZXIgd2lzaGVzIHRvIGxhenkgcGFyc2UgaXQuICovCi0gIHZvaWQgc2V0X2xhenkoYm9vbCBsYXp5KTsKLSNlbHNlCi1zdHJ1Y3QgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgewotI2VuZGlmCi0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaGFuZGxlcnM7Ci0gIGJvb2wgbGF6eTsKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBSZXByZXNlbnRzIHRoZSBjb2RlIHRvIHBhcnNlIGEgcHJvdG9idWYgYWNjb3JkaW5nIHRvIGEgZGVzdGluYXRpb24KLSAqIEhhbmRsZXJzLiAqLwotY2xhc3MgdXBiOjpwYjo6RGVjb2Rlck1ldGhvZCB7Ci0gcHVibGljOgotICAvKiBJbmNsdWRlIGJhc2UgbWV0aG9kcyBmcm9tIHVwYjo6UmVmZXJlbmNlQ291bnRlZC4gKi8KLSAgVVBCX1JFRkNPVU5URURfQ1BQTUVUSE9EUwotCi0gIC8qIFRoZSBkZXN0aW5hdGlvbiBoYW5kbGVycyB0aGF0IGFyZSBzdGF0aWNhbGx5IGJvdW5kIHRvIHRoaXMgbWV0aG9kLgotICAgKiBUaGlzIG1ldGhvZCBpcyBvbmx5IGNhcGFibGUgb2Ygb3V0cHV0dGluZyB0byBhIHNpbmsgdGhhdCB1c2VzIHRoZXNlCi0gICAqIGhhbmRsZXJzLiAqLwotICBjb25zdCBIYW5kbGVycyogZGVzdF9oYW5kbGVycygpIGNvbnN0OwotCi0gIC8qIFRoZSBpbnB1dCBoYW5kbGVycyBmb3IgdGhpcyBkZWNvZGVyIG1ldGhvZC4gKi8KLSAgY29uc3QgQnl0ZXNIYW5kbGVyKiBpbnB1dF9oYW5kbGVyKCkgY29uc3Q7Ci0KLSAgLyogV2hldGhlciB0aGlzIG1ldGhvZCBpcyBuYXRpdmUuICovCi0gIGJvb2wgaXNfbmF0aXZlKCkgY29uc3Q7Ci0KLSAgLyogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBnZW5lcmF0aW5nIGEgRGVjb2Rlck1ldGhvZCB3aXRob3V0IGV4cGxpY2l0bHkKLSAgICogY3JlYXRpbmcgYSBDb2RlQ2FjaGUuICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPGNvbnN0IERlY29kZXJNZXRob2Q+IE5ldyhjb25zdCBEZWNvZGVyTWV0aG9kT3B0aW9ucyYgb3B0cyk7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhEZWNvZGVyTWV0aG9kLCB1cGI6OnBiOjpEZWNvZGVyTWV0aG9kKQotfTsKLQotI2VuZGlmCi0KLS8qIFByZWFsbG9jYXRpb24gaGludDogZGVjb2RlciB3b24ndCBhbGxvY2F0ZSBtb3JlIGJ5dGVzIHRoYW4gdGhpcyB3aGVuIGZpcnN0Ci0gKiBjb25zdHJ1Y3RlZC4gIFRoaXMgaGludCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlIGZvciBzb21lIGJ1aWxkIGNvbmZpZ3VyYXRpb25zLgotICogQnV0IGlmIHRoZSBkZWNvZGVyIGxpYnJhcnkgaXMgdXBncmFkZWQgd2l0aG91dCByZWNvbXBpbGluZyB0aGUgYXBwbGljYXRpb24sCi0gKiBpdCBtYXkgYmUgYW4gdW5kZXJlc3RpbWF0ZS4gKi8KLSNkZWZpbmUgVVBCX1BCX0RFQ09ERVJfU0laRSA0NDA4Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBBIERlY29kZXIgcmVjZWl2ZXMgYmluYXJ5IHByb3RvYnVmIGRhdGEgb24gaXRzIGlucHV0IHNpbmsgYW5kIHB1c2hlcyB0aGUKLSAqIGRlY29kZWQgZGF0YSB0byBpdHMgb3V0cHV0IHNpbmsuICovCi1jbGFzcyB1cGI6OnBiOjpEZWNvZGVyIHsKLSBwdWJsaWM6Ci0gIC8qIENvbnN0cnVjdHMgYSBkZWNvZGVyIGluc3RhbmNlIGZvciB0aGUgZ2l2ZW4gbWV0aG9kLCB3aGljaCBtdXN0IG91dGxpdmUgdGhpcwotICAgKiBkZWNvZGVyLiAgQW55IGVycm9ycyBkdXJpbmcgcGFyc2luZyB3aWxsIGJlIHNldCBvbiB0aGUgZ2l2ZW4gc3RhdHVzLCB3aGljaAotICAgKiBtdXN0IGFsc28gb3V0bGl2ZSB0aGlzIGRlY29kZXIuCi0gICAqCi0gICAqIFRoZSBzaW5rIG11c3QgbWF0Y2ggdGhlIGdpdmVuIG1ldGhvZC4gKi8KLSAgc3RhdGljIERlY29kZXIqIENyZWF0ZShFbnZpcm9ubWVudCogZW52LCBjb25zdCBEZWNvZGVyTWV0aG9kKiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgU2luayogb3V0cHV0KTsKLQotICAvKiBSZXR1cm5zIHRoZSBEZWNvZGVyTWV0aG9kIHRoaXMgZGVjb2RlciBpcyBwYXJzaW5nIGZyb20uICovCi0gIGNvbnN0IERlY29kZXJNZXRob2QqIG1ldGhvZCgpIGNvbnN0OwotCi0gIC8qIFRoZSBzaW5rIG9uIHdoaWNoIHRoaXMgZGVjb2RlciByZWNlaXZlcyBpbnB1dC4gKi8KLSAgQnl0ZXNTaW5rKiBpbnB1dCgpOwotCi0gIC8qIFJldHVybnMgbnVtYmVyIG9mIGJ5dGVzIHN1Y2Nlc3NmdWxseSBwYXJzZWQuCi0gICAqCi0gICAqIFRoaXMgY2FuIGJlIHVzZWZ1bCBmb3IgZGV0ZXJtaW5pbmcgdGhlIHN0cmVhbSBwb3NpdGlvbiB3aGVyZSBhbiBlcnJvcgotICAgKiBvY2N1cnJlZC4KLSAgICoKLSAgICogVGhpcyB2YWx1ZSBtYXkgbm90IGJlIHVwLXRvLWRhdGUgd2hlbiBjYWxsZWQgZnJvbSBpbnNpZGUgYSBwYXJzaW5nCi0gICAqIGNhbGxiYWNrLiAqLwotICB1aW50NjRfdCBCeXRlc1BhcnNlZCgpIGNvbnN0OwotCi0gIC8qIEdldHMvc2V0cyB0aGUgcGFyc2luZyBuZXh0aW5nIGxpbWl0LiAgSWYgdGhlIHRvdGFsIG51bWJlciBvZiBuZXN0ZWQKLSAgICogc3VibWVzc2FnZXMgYW5kIHJlcGVhdGVkIGZpZWxkcyBoaXRzIHRoaXMgbGltaXQsIHBhcnNpbmcgd2lsbCBmYWlsLiAgVGhpcwotICAgKiBpcyBhIHJlc291cmNlIGxpbWl0IHRoYXQgY29udHJvbHMgdGhlIGFtb3VudCBvZiBtZW1vcnkgdXNlZCBieSB0aGUgcGFyc2luZwotICAgKiBzdGFjay4KLSAgICoKLSAgICogU2V0dGluZyB0aGUgbGltaXQgd2lsbCBmYWlsIGlmIHRoZSBwYXJzZXIgaXMgY3VycmVudGx5IHN1c3BlbmRlZCBhdCBhIGRlcHRoCi0gICAqIGdyZWF0ZXIgdGhhbiB0aGlzLCBvciBpZiBtZW1vcnkgYWxsb2NhdGlvbiBvZiB0aGUgc3RhY2sgZmFpbHMuICovCi0gIHNpemVfdCBtYXhfbmVzdGluZygpIGNvbnN0OwotICBib29sIHNldF9tYXhfbmVzdGluZyhzaXplX3QgbWF4KTsKLQotICB2b2lkIFJlc2V0KCk7Ci0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2l6ZSA9IFVQQl9QQl9ERUNPREVSX1NJWkU7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhEZWNvZGVyLCB1cGI6OnBiOjpEZWNvZGVyKQotfTsKLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQSBjbGFzcyBmb3IgY2FjaGluZyBwcm90b2J1ZiBwcm9jZXNzaW5nIGNvZGUsIHdoZXRoZXIgYnl0ZWNvZGUgZm9yIHRoZQotICogaW50ZXJwcmV0ZWQgZGVjb2RlciBvciBtYWNoaW5lIGNvZGUgZm9yIHRoZSBKSVQuCi0gKgotICogVGhpcyBjbGFzcyBpcyBub3QgdGhyZWFkLXNhZmUuCi0gKgotICogVE9ETyhoYWJlcm1hbik6IG1vdmUgdGhpcyB0byBiZSBoZWFwIGFsbG9jYXRlZCBmb3IgQUJJIHN0YWJpbGl0eS4gKi8KLWNsYXNzIHVwYjo6cGI6OkNvZGVDYWNoZSB7Ci0gcHVibGljOgotICBDb2RlQ2FjaGUoKTsKLSAgfkNvZGVDYWNoZSgpOwotCi0gIC8qIFdoZXRoZXIgdGhlIGNhY2hlIGlzIGFsbG93ZWQgdG8gZ2VuZXJhdGUgbWFjaGluZSBjb2RlLiAgRGVmYXVsdHMgdG8gdHJ1ZS4KLSAgICogVGhlcmUgaXMgbm8gcmVhbCByZWFzb24gdG8gdHVybiBpdCBvZmYgZXhjZXB0IGZvciB0ZXN0aW5nIG9yIGlmIHlvdSBhcmUKLSAgICogaGF2aW5nIGEgc3BlY2lmaWMgcHJvYmxlbSB3aXRoIHRoZSBKSVQuCi0gICAqCi0gICAqIE5vdGUgdGhhdCBhbGxvd19qaXQgPSB0cnVlIGRvZXMgbm90ICpndWFyYW50ZWUqIHRoYXQgdGhlIGNvZGUgd2lsbCBiZSBKSVQKLSAgICogY29tcGlsZWQuICBJZiB0aGlzIHBsYXRmb3JtIGlzIG5vdCBzdXBwb3J0ZWQgb3IgdGhlIEpJVCB3YXMgbm90IGNvbXBpbGVkCi0gICAqIGluLCB0aGUgY29kZSBtYXkgc3RpbGwgYmUgaW50ZXJwcmV0ZWQuICovCi0gIGJvb2wgYWxsb3dfaml0KCkgY29uc3Q7Ci0KLSAgLyogVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgd2hlbiB0aGUgb2JqZWN0IGlzIGZpcnN0IGNvbnN0cnVjdGVkLCBhbmQgcHJpb3IgdG8KLSAgICogYW55IGNvZGUgZ2VuZXJhdGlvbiwgb3RoZXJ3aXNlIHJldHVybnMgZmFsc2UgYW5kIGRvZXMgbm90aGluZy4gKi8KLSAgYm9vbCBzZXRfYWxsb3dfaml0KGJvb2wgYWxsb3cpOwotCi0gIC8qIFJldHVybnMgYSBEZWNvZGVyTWV0aG9kIHRoYXQgY2FuIHB1c2ggZGF0YSB0byB0aGUgZ2l2ZW4gaGFuZGxlcnMuCi0gICAqIElmIGEgc3VpdGFibGUgbWV0aG9kIGFscmVhZHkgZXhpc3RzLCBpdCB3aWxsIGJlIHJldHVybmVkIGZyb20gdGhlIGNhY2hlLgotICAgKgotICAgKiBTcGVjaWZ5aW5nIHRoZSBkZXN0aW5hdGlvbiBoYW5kbGVycyBoZXJlIGFsbG93cyB0aGUgRGVjb2Rlck1ldGhvZCB0byBiZQotICAgKiBzdGF0aWNhbGx5IGJvdW5kIHRvIHRoZSBkZXN0aW5hdGlvbiBoYW5kbGVycyBpZiBwb3NzaWJsZSwgd2hpY2ggY2FuIGFsbG93Ci0gICAqIG1vcmUgZWZmaWNpZW50IGRlY29kaW5nLiAgSG93ZXZlciB0aGUgcmV0dXJuZWQgbWV0aG9kIG1heSBvciBtYXkgbm90Ci0gICAqIGFjdHVhbGx5IGJlIHN0YXRpY2FsbHkgYm91bmQuICBCdXQgaW4gYWxsIGNhc2VzLCB0aGUgcmV0dXJuZWQgbWV0aG9kIGNhbgotICAgKiBwdXNoIGRhdGEgdG8gdGhlIGdpdmVuIGhhbmRsZXJzLiAqLwotICBjb25zdCBEZWNvZGVyTWV0aG9kICpHZXREZWNvZGVyTWV0aG9kKGNvbnN0IERlY29kZXJNZXRob2RPcHRpb25zJiBvcHRzKTsKLQotICAvKiBJZi93aGVuIHNvbWVvbmUgbmVlZHMgdG8gZXhwbGljaXRseSBjcmVhdGUgYSBkeW5hbWljYWxseS1ib3VuZAotICAgKiBEZWNvZGVyTWV0aG9kKiwgd2UgY2FuIGFkZCBhIG1ldGhvZCB0byBnZXQgaXQgaGVyZS4gKi8KLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oQ29kZUNhY2hlKQotI2Vsc2UKLXN0cnVjdCB1cGJfcGJjb2RlY2FjaGUgewotI2VuZGlmCi0gIGJvb2wgYWxsb3dfaml0XzsKLQotICAvKiBBcnJheSBvZiBtZ3JvdXBzLiAqLwotICB1cGJfaW50dGFibGUgZ3JvdXBzOwotfTsKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLXVwYl9wYmRlY29kZXIgKnVwYl9wYmRlY29kZXJfY3JlYXRlKHVwYl9lbnYgKmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2luayAqb3V0cHV0KTsKLWNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKnVwYl9wYmRlY29kZXJfbWV0aG9kKGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpOwotdXBiX2J5dGVzc2luayAqdXBiX3BiZGVjb2Rlcl9pbnB1dCh1cGJfcGJkZWNvZGVyICpkKTsKLXVpbnQ2NF90IHVwYl9wYmRlY29kZXJfYnl0ZXNwYXJzZWQoY29uc3QgdXBiX3BiZGVjb2RlciAqZCk7Ci1zaXplX3QgdXBiX3BiZGVjb2Rlcl9tYXhuZXN0aW5nKGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpOwotYm9vbCB1cGJfcGJkZWNvZGVyX3NldG1heG5lc3RpbmcodXBiX3BiZGVjb2RlciAqZCwgc2l6ZV90IG1heCk7Ci12b2lkIHVwYl9wYmRlY29kZXJfcmVzZXQodXBiX3BiZGVjb2RlciAqZCk7Ci0KLXZvaWQgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHNfaW5pdCh1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyAqb3B0cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfaGFuZGxlcnMgKmgpOwotdm9pZCB1cGJfcGJkZWNvZGVybWV0aG9kb3B0c19zZXRsYXp5KHVwYl9wYmRlY29kZXJtZXRob2RvcHRzICpvcHRzLCBib29sIGxhenkpOwotCi0KLS8qIEluY2x1ZGUgcmVmY291bnRlZCBtZXRob2RzIGxpa2UgdXBiX3BiZGVjb2Rlcm1ldGhvZF9yZWYoKS4gKi8KLVVQQl9SRUZDT1VOVEVEX0NNRVRIT0RTKHVwYl9wYmRlY29kZXJtZXRob2QsIHVwYl9wYmRlY29kZXJtZXRob2RfdXBjYXN0KQotCi1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9wYmRlY29kZXJtZXRob2RfZGVzdGhhbmRsZXJzKAotICAgIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKm0pOwotY29uc3QgdXBiX2J5dGVzaGFuZGxlciAqdXBiX3BiZGVjb2Rlcm1ldGhvZF9pbnB1dGhhbmRsZXIoCi0gICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbSk7Ci1ib29sIHVwYl9wYmRlY29kZXJtZXRob2RfaXNuYXRpdmUoY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbSk7Ci1jb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICp1cGJfcGJkZWNvZGVybWV0aG9kX25ldygKLSAgICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyAqb3B0cywgY29uc3Qgdm9pZCAqb3duZXIpOwotCi12b2lkIHVwYl9wYmNvZGVjYWNoZV9pbml0KHVwYl9wYmNvZGVjYWNoZSAqYyk7Ci12b2lkIHVwYl9wYmNvZGVjYWNoZV91bmluaXQodXBiX3BiY29kZWNhY2hlICpjKTsKLWJvb2wgdXBiX3BiY29kZWNhY2hlX2FsbG93aml0KGNvbnN0IHVwYl9wYmNvZGVjYWNoZSAqYyk7Ci1ib29sIHVwYl9wYmNvZGVjYWNoZV9zZXRhbGxvd2ppdCh1cGJfcGJjb2RlY2FjaGUgKmMsIGJvb2wgYWxsb3cpOwotY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqdXBiX3BiY29kZWNhY2hlX2dldGRlY29kZXJtZXRob2QoCi0gICAgdXBiX3BiY29kZWNhY2hlICpjLCBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyAqb3B0cyk7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSB1cGIgewotCi1uYW1lc3BhY2UgcGIgewotCi0vKiBzdGF0aWMgKi8KLWlubGluZSBEZWNvZGVyKiBEZWNvZGVyOjpDcmVhdGUoRW52aXJvbm1lbnQqIGVudiwgY29uc3QgRGVjb2Rlck1ldGhvZCogbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2luayogc2luaykgewotICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9jcmVhdGUoZW52LCBtLCBzaW5rKTsKLX0KLWlubGluZSBjb25zdCBEZWNvZGVyTWV0aG9kKiBEZWNvZGVyOjptZXRob2QoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfcGJkZWNvZGVyX21ldGhvZCh0aGlzKTsKLX0KLWlubGluZSBCeXRlc1NpbmsqIERlY29kZXI6OmlucHV0KCkgewotICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9pbnB1dCh0aGlzKTsKLX0KLWlubGluZSB1aW50NjRfdCBEZWNvZGVyOjpCeXRlc1BhcnNlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9wYmRlY29kZXJfYnl0ZXNwYXJzZWQodGhpcyk7Ci19Ci1pbmxpbmUgc2l6ZV90IERlY29kZXI6Om1heF9uZXN0aW5nKCkgY29uc3QgewotICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9tYXhuZXN0aW5nKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRGVjb2Rlcjo6c2V0X21heF9uZXN0aW5nKHNpemVfdCBtYXgpIHsKLSAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc2V0bWF4bmVzdGluZyh0aGlzLCBtYXgpOwotfQotaW5saW5lIHZvaWQgRGVjb2Rlcjo6UmVzZXQoKSB7IHVwYl9wYmRlY29kZXJfcmVzZXQodGhpcyk7IH0KLQotaW5saW5lIERlY29kZXJNZXRob2RPcHRpb25zOjpEZWNvZGVyTWV0aG9kT3B0aW9ucyhjb25zdCBIYW5kbGVycyogaCkgewotICB1cGJfcGJkZWNvZGVybWV0aG9kb3B0c19pbml0KHRoaXMsIGgpOwotfQotaW5saW5lIHZvaWQgRGVjb2Rlck1ldGhvZE9wdGlvbnM6OnNldF9sYXp5KGJvb2wgbGF6eSkgewotICB1cGJfcGJkZWNvZGVybWV0aG9kb3B0c19zZXRsYXp5KHRoaXMsIGxhenkpOwotfQotCi1pbmxpbmUgY29uc3QgSGFuZGxlcnMqIERlY29kZXJNZXRob2Q6OmRlc3RfaGFuZGxlcnMoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfcGJkZWNvZGVybWV0aG9kX2Rlc3RoYW5kbGVycyh0aGlzKTsKLX0KLWlubGluZSBjb25zdCBCeXRlc0hhbmRsZXIqIERlY29kZXJNZXRob2Q6OmlucHV0X2hhbmRsZXIoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfcGJkZWNvZGVybWV0aG9kX2lucHV0aGFuZGxlcih0aGlzKTsKLX0KLWlubGluZSBib29sIERlY29kZXJNZXRob2Q6OmlzX25hdGl2ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9wYmRlY29kZXJtZXRob2RfaXNuYXRpdmUodGhpcyk7Ci19Ci0vKiBzdGF0aWMgKi8KLWlubGluZSByZWZmZWRfcHRyPGNvbnN0IERlY29kZXJNZXRob2Q+IERlY29kZXJNZXRob2Q6Ok5ldygKLSAgICBjb25zdCBEZWNvZGVyTWV0aG9kT3B0aW9ucyAmb3B0cykgewotICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptID0gdXBiX3BiZGVjb2Rlcm1ldGhvZF9uZXcoJm9wdHMsICZtKTsKLSAgcmV0dXJuIHJlZmZlZF9wdHI8Y29uc3QgRGVjb2Rlck1ldGhvZD4obSwgJm0pOwotfQotCi1pbmxpbmUgQ29kZUNhY2hlOjpDb2RlQ2FjaGUoKSB7Ci0gIHVwYl9wYmNvZGVjYWNoZV9pbml0KHRoaXMpOwotfQotaW5saW5lIENvZGVDYWNoZTo6fkNvZGVDYWNoZSgpIHsKLSAgdXBiX3BiY29kZWNhY2hlX3VuaW5pdCh0aGlzKTsKLX0KLWlubGluZSBib29sIENvZGVDYWNoZTo6YWxsb3dfaml0KCkgY29uc3QgewotICByZXR1cm4gdXBiX3BiY29kZWNhY2hlX2FsbG93aml0KHRoaXMpOwotfQotaW5saW5lIGJvb2wgQ29kZUNhY2hlOjpzZXRfYWxsb3dfaml0KGJvb2wgYWxsb3cpIHsKLSAgcmV0dXJuIHVwYl9wYmNvZGVjYWNoZV9zZXRhbGxvd2ppdCh0aGlzLCBhbGxvdyk7Ci19Ci1pbmxpbmUgY29uc3QgRGVjb2Rlck1ldGhvZCAqQ29kZUNhY2hlOjpHZXREZWNvZGVyTWV0aG9kKAotICAgIGNvbnN0IERlY29kZXJNZXRob2RPcHRpb25zJiBvcHRzKSB7Ci0gIHJldHVybiB1cGJfcGJjb2RlY2FjaGVfZ2V0ZGVjb2Rlcm1ldGhvZCh0aGlzLCAmb3B0cyk7Ci19Ci0KLX0gIC8qIG5hbWVzcGFjZSBwYiAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLSNlbmRpZiAgLyogVVBCX0RFQ09ERVJfSF8gKi8KLQotLyogQysrIG5hbWVzIGFyZSBub3QgYWN0dWFsbHkgdXNlZCBzaW5jZSB0aGlzIHR5cGUgaXNuJ3QgZXhwb3NlZCB0byB1c2Vycy4gKi8KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UgcGIgewotY2xhc3MgTWVzc2FnZUdyb3VwOwotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLVVQQl9ERUNMQVJFX0RFUklWRURfVFlQRSh1cGI6OnBiOjpNZXNzYWdlR3JvdXAsIHVwYjo6UmVmQ291bnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZ3JvdXAsIHVwYl9yZWZjb3VudGVkKQotCi0vKiBPcGNvZGUgZGVmaW5pdGlvbnMuICBUaGUgY2Fub25pY2FsIG1lYW5pbmcgb2YgZWFjaCBvcGNvZGUgaXMgaXRzCi0gKiBpbXBsZW1lbnRhdGlvbiBpbiB0aGUgaW50ZXJwcmV0ZXIgKHRoZSBKSVQgaXMgd3JpdHRlbiB0byBtYXRjaCB0aGlzKS4KLSAqCi0gKiBBbGwgaW5zdHJ1Y3Rpb25zIGhhdmUgdGhlIG9wY29kZSBpbiB0aGUgbG93IGJ5dGUuCi0gKiBJbnN0cnVjdGlvbiBmb3JtYXQgZm9yIG1vc3QgaW5zdHJ1Y3Rpb25zIGlzOgotICoKLSAqICstLS0tLS0tLS0tLS0tLS0tLS0tKy0tLS0tLS0tKwotICogfCAgICAgYXJnICgyNCkgICAgICB8IG9wICg4KSB8Ci0gKiArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSsKLSAqCi0gKiBFeGNlcHRpb25zIGFyZSBpbmRpY2F0ZWQgYmVsb3cuICBBIGZldyBvcGNvZGVzIGFyZSBtdWx0aS13b3JkLiAqLwotdHlwZWRlZiBlbnVtIHsKLSAgLyogT3Bjb2RlcyAxLTgsIDEzLCAxNS0xOCBwYXJzZSB0aGVpciByZXNwZWN0aXZlIGRlc2NyaXB0b3IgdHlwZXMuCi0gICAqIEFyZyBmb3IgYWxsIG9mIHRoZXNlIGlzIHRoZSB1cGIgc2VsZWN0b3IgZm9yIHRoaXMgZmllbGQuICovCi0jZGVmaW5lIFQodHlwZSkgT1BfUEFSU0VfICMjIHR5cGUgPSBVUEJfREVTQ1JJUFRPUl9UWVBFXyAjIyB0eXBlCi0gIFQoRE9VQkxFKSwgVChGTE9BVCksIFQoSU5UNjQpLCBUKFVJTlQ2NCksIFQoSU5UMzIpLCBUKEZJWEVENjQpLCBUKEZJWEVEMzIpLAotICBUKEJPT0wpLCBUKFVJTlQzMiksIFQoU0ZJWEVEMzIpLCBUKFNGSVhFRDY0KSwgVChTSU5UMzIpLCBUKFNJTlQ2NCksCi0jdW5kZWYgVAotICBPUF9TVEFSVE1TRyAgICAgICA9IDksICAgLyogTm8gYXJnLiAqLwotICBPUF9FTkRNU0cgICAgICAgICA9IDEwLCAgLyogTm8gYXJnLiAqLwotICBPUF9TVEFSVFNFUSAgICAgICA9IDExLAotICBPUF9FTkRTRVEgICAgICAgICA9IDEyLAotICBPUF9TVEFSVFNVQk1TRyAgICA9IDE0LAotICBPUF9FTkRTVUJNU0cgICAgICA9IDE5LAotICBPUF9TVEFSVFNUUiAgICAgICA9IDIwLAotICBPUF9TVFJJTkcgICAgICAgICA9IDIxLAotICBPUF9FTkRTVFIgICAgICAgICA9IDIyLAotCi0gIE9QX1BVU0hUQUdERUxJTSAgID0gMjMsICAvKiBObyBhcmcuICovCi0gIE9QX1BVU0hMRU5ERUxJTSAgID0gMjQsICAvKiBObyBhcmcuICovCi0gIE9QX1BPUCAgICAgICAgICAgID0gMjUsICAvKiBObyBhcmcuICovCi0gIE9QX1NFVERFTElNICAgICAgID0gMjYsICAvKiBObyBhcmcuICovCi0gIE9QX1NFVEJJR0dST1VQTlVNID0gMjcsICAvKiB0d28gd29yZHM6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHwgdW51c2VkICgyNCkgICAgIHwgb3BjICg4KSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKiAgIHwgICAgICAgIGdyb3VwbnVtICgzMikgICAgICB8ICovCi0gIE9QX0NIRUNLREVMSU0gICAgID0gMjgsCi0gIE9QX0NBTEwgICAgICAgICAgID0gMjksCi0gIE9QX1JFVCAgICAgICAgICAgID0gMzAsCi0gIE9QX0JSQU5DSCAgICAgICAgID0gMzEsCi0KLSAgLyogRGlmZmVyZW50IG9wY29kZXMgZGVwZW5kaW5nIG9uIGhvdyBtYW55IGJ5dGVzIGV4cGVjdGVkLiAqLwotICBPUF9UQUcxICAgICAgICAgICA9IDMyLCAgLyogfCBtYXRjaCB0YWcgKDE2KSB8IGp1bXAgdGFyZ2V0ICg4KSB8IG9wYyAoOCkgfCAqLwotICBPUF9UQUcyICAgICAgICAgICA9IDMzLCAgLyogfCBtYXRjaCB0YWcgKDE2KSB8IGp1bXAgdGFyZ2V0ICg4KSB8IG9wYyAoOCkgfCAqLwotICBPUF9UQUdOICAgICAgICAgICA9IDM0LCAgLyogdGhyZWUgd29yZHM6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHwgdW51c2VkICgxNikgfCBqdW1wIHRhcmdldCg4KSB8IG9wYyAoOCkgfCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICB8ICAgICAgICAgICBtYXRjaCB0YWcgMSAoMzIpICAgICAgICAgICAgIHwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgfCAgICAgICAgICAgbWF0Y2ggdGFnIDIgKDMyKSAgICAgICAgICAgICB8ICovCi0KLSAgT1BfU0VURElTUEFUQ0ggICAgPSAzNSwgIC8qIE4gd29yZHM6ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHwgdW51c2VkICgyNCkgICAgICAgICB8IG9wYyB8ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHwgdXBiX2ludHRhYmxlKiAoMzIgb3IgNjQpICB8ICovCi0KLSAgT1BfRElTUEFUQ0ggICAgICAgPSAzNiwgIC8qIE5vIGFyZy4gKi8KLQotICBPUF9IQUxUICAgICAgICAgICA9IDM3ICAgLyogTm8gYXJnLiAqLwotfSBvcGNvZGU7Ci0KLSNkZWZpbmUgT1BfTUFYIE9QX0hBTFQKLQotVVBCX0lOTElORSBvcGNvZGUgZ2V0b3AodWludDMyX3QgaW5zdHIpIHsgcmV0dXJuIGluc3RyICYgMHhmZjsgfQotCi0vKiBNZXRob2QgZ3JvdXA7IHJlcHJlc2VudHMgYSBzZXQgb2YgZGVjb2RlciBtZXRob2RzIHRoYXQgaGFkIHRoZWlyIGNvZGUKLSAqIGVtaXR0ZWQgdG9nZXRoZXIsIGFuZCBtdXN0IHRoZXJlZm9yZSBiZSBmcmVlZCB0b2dldGhlci4gIEltbXV0YWJsZSBvbmNlCi0gKiBjcmVhdGVkLiAgSXQgaXMgcG9zc2libGUgd2UgbWF5IHdhbnQgdG8gZXhwb3NlIHRoaXMgdG8gdXNlcnMgYXQgc29tZSBwb2ludC4KLSAqCi0gKiBPdmVyYWxsIG93bmVyc2hpcCBvZiBEZWNvZGVyIG9iamVjdHMgbG9va3MgbGlrZSB0aGlzOgotICoKLSAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tKwotICogICAgICAgICAgICAgICAgfCAgICAgICAgICB8IDwtLS0+IERlY29kZXJNZXRob2QKLSAqICAgICAgICAgICAgICAgIHwgbWV0aG9kICAgfAotICogQ29kZUNhY2hlIC0tLT4gfCAgZ3JvdXAgICB8IDwtLS0+IERlY29kZXJNZXRob2QKLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgfAotICogICAgICAgICAgICAgICAgfCAobWdyb3VwKSB8IDwtLS0+IERlY29kZXJNZXRob2QKLSAqICAgICAgICAgICAgICAgICstLS0tLS0tLS0tKwotICovCi1zdHJ1Y3QgbWdyb3VwIHsKLSAgdXBiX3JlZmNvdW50ZWQgYmFzZTsKLQotICAvKiBNYXBzIHVwYl9tc2dkZWYvdXBiX2hhbmRsZXJzIC0+IHVwYl9wYmRlY29kZXJtZXRob2QuICBXZSBvd24gcmVmcyBvbiB0aGUKLSAgICogbWV0aG9kcy4gKi8KLSAgdXBiX2ludHRhYmxlIG1ldGhvZHM7Ci0KLSAgLyogV2hlbiB3ZSBhZGQgdGhlIGFiaWxpdHkgdG8gbGluayB0byBwcmV2aW91c2x5IGV4aXN0aW5nIG1ncm91cHMsIHdlJ2xsCi0gICAqIG5lZWQgYW4gYXJyYXkgb2YgbWdyb3VwcyB3ZSByZWZlcmVuY2UgaGVyZSwgYW5kIG93biByZWZzIG9uIHRoZW0uICovCi0KLSAgLyogVGhlIGJ5dGVjb2RlIGZvciBvdXIgbWV0aG9kcywgaWYgYW55IGV4aXN0cy4gIE93bmVkIGJ5IHVzLiAqLwotICB1aW50MzJfdCAqYnl0ZWNvZGU7Ci0gIHVpbnQzMl90ICpieXRlY29kZV9lbmQ7Ci0KLSNpZmRlZiBVUEJfVVNFX0pJVF9YNjQKLSAgLyogSklULWdlbmVyYXRlZCBtYWNoaW5lIGNvZGUsIGlmIGFueS4gKi8KLSAgdXBiX3N0cmluZ19oYW5kbGVyZnVuYyAqaml0X2NvZGU7Ci0gIC8qIFRoZSBzaXplIG9mIHRoZSBqaXRfY29kZSAocmVxdWlyZWQgdG8gbXVubWFwKCkpLiAqLwotICBzaXplX3Qgaml0X3NpemU7Ci0gIGNoYXIgKmRlYnVnX2luZm87Ci0gIHZvaWQgKmRsOwotI2VuZGlmCi19OwotCi0vKiBUaGUgbWF4aW11bSB0aGF0IGFueSBzdWJtZXNzYWdlcyBjYW4gYmUgbmVzdGVkLiAgTWF0Y2hlcyBwcm90bzIncyBsaW1pdC4KLSAqIFRoaXMgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBkZWNvZGVyJ3Mgc3RhdGljYWxseS1zaXplZCBhcnJheSBhbmQgdGhlcmVmb3JlCi0gKiBzZXR0aW5nIGl0IGhpZ2ggd2lsbCBjYXVzZSB0aGUgdXBiOjpwYjo6RGVjb2RlciBvYmplY3QgdG8gYmUgbGFyZ2VyLgotICoKLSAqIElmIG5lY2Vzc2FyeSB3ZSBjYW4gYWRkIGEgcnVudGltZS1zZXR0YWJsZSBwcm9wZXJ0eSB0byBEZWNvZGVyIHRoYXQgYWxsb3cKLSAqIHRoaXMgdG8gYmUgbGFyZ2VyIHRoYW4gdGhlIGNvbXBpbGUtdGltZSBzZXR0aW5nLCBidXQgdGhpcyB3b3VsZCBhZGQKLSAqIGNvbXBsZXhpdHksIHBhcnRpY3VsYXJseSBzaW5jZSB3ZSB3b3VsZCBoYXZlIHRvIGRlY2lkZSBob3cvaWYgdG8gZ2l2ZSB1c2VycwotICogdGhlIGFiaWxpdHkgdG8gc2V0IGEgY3VzdG9tIG1lbW9yeSBhbGxvY2F0aW9uIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBVUEJfREVDT0RFUl9NQVhfTkVTVElORyA2NAotCi0vKiBJbnRlcm5hbC1vbmx5IHN0cnVjdCB1c2VkIGJ5IHRoZSBkZWNvZGVyLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICAvKiBTcGFjZSBvcHRpbWl6YXRpb24gbm90ZTogd2Ugc3RvcmUgdHdvIHBvaW50ZXJzIGhlcmUgdGhhdCB0aGUgSklUCi0gICAqIGRvZXNuJ3QgbmVlZCBhdCBhbGw7IHRoZSB1cGJfaGFuZGxlcnMqIGluc2lkZSB0aGUgc2luayBhbmQKLSAgICogdGhlIGRpc3BhdGNoIHRhYmxlIHBvaW50ZXIuICBXZSBjYW4gb3B0aW16ZSBzbyB0aGF0IHRoZSBKSVQgdXNlcwotICAgKiBzbWFsbGVyIHN0YWNrIGZyYW1lcyB0aGFuIHRoZSBpbnRlcnByZXRlci4gIFRoZSBvbmx5IHRoaW5nIHdlIG5lZWQKLSAgICogdG8gZ3VhcmFudGVlIGlzIHRoYXQgdGhlIGZhbGxiYWNrIHJvdXRpbmVzIGNhbiBmaW5kIGVuZF9vZnMuICovCi0gIHVwYl9zaW5rIHNpbms7Ci0KLSAgLyogVGhlIGFic29sdXRlIHN0cmVhbSBvZmZzZXQgb2YgdGhlIGVuZC1vZi1mcmFtZSBkZWxpbWl0ZXIuCi0gICAqIE5vbi1kZWxpbWl0ZWQgZnJhbWVzIChncm91cHMgYW5kIG5vbi1wYWNrZWQgcmVwZWF0ZWQgZmllbGRzKSByZXVzZSB0aGUKLSAgICogZGVsaW1pdGVyIG9mIHRoZWlyIHBhcmVudCwgZXZlbiB0aG91Z2ggdGhlIGZyYW1lIG1heSBub3QgZW5kIHRoZXJlLgotICAgKgotICAgKiBOT1RFOiB0aGUgSklUIHN0b3JlcyBhIHNsaWdodGx5IGRpZmZlcmVudCB2YWx1ZSBoZXJlIGZvciBub24tdG9wIGZyYW1lcy4KLSAgICogSXQgc3RvcmVzIHRoZSB2YWx1ZSByZWxhdGl2ZSB0byB0aGUgZW5kIG9mIHRoZSBlbmNsb3NlZCBtZXNzYWdlLiAgQnV0IHRoZQotICAgKiB0b3AgZnJhbWUgaXMgc3RpbGwgc3RvcmVkIHRoZSBzYW1lIHdheSwgd2hpY2ggaXMgaW1wb3J0YW50IGZvciBlbnN1cmluZwotICAgKiB0aGF0IGNhbGxzIGZyb20gdGhlIEpJVCBpbnRvIEMgd29yayBjb3JyZWN0bHkuICovCi0gIHVpbnQ2NF90IGVuZF9vZnM7Ci0gIGNvbnN0IHVpbnQzMl90ICpiYXNlOwotCi0gIC8qIDAgaW5kaWNhdGVzIGEgbGVuZ3RoLWRlbGltaXRlZCBmaWVsZC4KLSAgICogQSBwb3NpdGl2ZSBudW1iZXIgaW5kaWNhdGVzIGEga25vd24gZ3JvdXAuCi0gICAqIEEgbmVnYXRpdmUgbnVtYmVyIGluZGljYXRlcyBhbiB1bmtub3duIGdyb3VwLiAqLwotICBpbnQzMl90IGdyb3VwbnVtOwotICB1cGJfaW50dGFibGUgKmRpc3BhdGNoOyAgLyogTm90IHVzZWQgYnkgdGhlIEpJVC4gKi8KLX0gdXBiX3BiZGVjb2Rlcl9mcmFtZTsKLQotc3RydWN0IHVwYl9wYmRlY29kZXJtZXRob2QgewotICB1cGJfcmVmY291bnRlZCBiYXNlOwotCi0gIC8qIFdoaWxlIGNvbXBpbGluZywgdGhlIGJhc2UgaXMgcmVsYXRpdmUgaW4gIm9mcyIsIGFmdGVyIGNvbXBpbGluZyBpdCBpcwotICAgKiBhYnNvbHV0ZSBpbiAicHRyIi4gKi8KLSAgdW5pb24gewotICAgIHVpbnQzMl90IG9mczsgICAgIC8qIFBDIG9mZnNldCBvZiBtZXRob2QuICovCi0gICAgdm9pZCAqcHRyOyAgICAgICAgLyogUG9pbnRlciB0byBieXRlY29kZSBvciBtYWNoaW5lIGNvZGUgZm9yIHRoaXMgbWV0aG9kLiAqLwotICB9IGNvZGVfYmFzZTsKLQotICAvKiBUaGUgZGVjb2RlciBtZXRob2QgZ3JvdXAgdG8gd2hpY2ggdGhpcyBtZXRob2QgYmVsb25ncy4gIFdlIG93biBhIHJlZi4KLSAgICogT3duaW5nIGEgcmVmIG9uIHRoZSBlbnRpcmUgZ3JvdXAgaXMgbW9yZSBjb2Fyc2UtZ3JhaW5lZCB0aGFuIGlzIHN0cmljdGx5Ci0gICAqIG5lY2Vzc2FyeTsgYWxsIHdlIHRydWx5IHJlcXVpcmUgaXMgdGhhdCBtZXRob2RzIHdlIGRpcmVjdGx5IHJlZmVyZW5jZQotICAgKiBvdXRsaXZlIHVzLCB3aGlsZSB0aGUgZ3JvdXAgY291bGQgY29udGFpbiBtYW55IG90aGVyIG1lc3NhZ2VzIHdlIGRvbid0Ci0gICAqIHJlcXVpcmUuICBCdXQgdGhlIGdyb3VwIHJlcHJlc2VudHMgdGhlIG1lc3NhZ2VzIHRoYXQgd2VyZQotICAgKiBhbGxvY2F0ZWQrY29tcGlsZWQgdG9nZXRoZXIsIHNvIGl0IG1ha2VzIHRoZSBtb3N0IHNlbnNlIHRvIGZyZWUgdGhlbQotICAgKiB0b2dldGhlciBhbHNvLiAqLwotICBjb25zdCB1cGJfcmVmY291bnRlZCAqZ3JvdXA7Ci0KLSAgLyogV2hldGhlciB0aGlzIG1ldGhvZCBpcyBuYXRpdmUgY29kZSBvciBieXRlY29kZS4gKi8KLSAgYm9vbCBpc19uYXRpdmVfOwotCi0gIC8qIFRoZSBoYW5kbGVyIG9uZSBjYWxscyB0byBpbnZva2UgdGhpcyBtZXRob2QuICovCi0gIHVwYl9ieXRlc2hhbmRsZXIgaW5wdXRfaGFuZGxlcl87Ci0KLSAgLyogVGhlIGRlc3RpbmF0aW9uIGhhbmRsZXJzIHRoaXMgbWV0aG9kIGlzIGJvdW5kIHRvLiAgV2Ugb3duIGEgcmVmLiAqLwotICBjb25zdCB1cGJfaGFuZGxlcnMgKmRlc3RfaGFuZGxlcnNfOwotCi0gIC8qIERpc3BhdGNoIHRhYmxlIC0tIHVzZWQgYnkgYm90aCBieXRlY29kZSBkZWNvZGVyIGFuZCBKSVQgd2hlbiBlbmNvdW50ZXJpbmcgYQotICAgKiBmaWVsZCBudW1iZXIgdGhhdCB3YXNuJ3QgdGhlIG9uZSB3ZSB3ZXJlIGV4cGVjdGluZyB0byBzZWUuICBTZWUKLSAgICogZGVjb2Rlci5pbnQuaCBmb3IgdGhlIGxheW91dCBvZiB0aGlzIHRhYmxlLiAqLwotICB1cGJfaW50dGFibGUgZGlzcGF0Y2g7Ci19OwotCi1zdHJ1Y3QgdXBiX3BiZGVjb2RlciB7Ci0gIHVwYl9lbnYgKmVudjsKLQotICAvKiBPdXIgaW5wdXQgc2luay4gKi8KLSAgdXBiX2J5dGVzc2luayBpbnB1dF87Ci0KLSAgLyogVGhlIGRlY29kZXIgbWV0aG9kIHdlIGFyZSBwYXJzaW5nIHdpdGggKG93bmVkKS4gKi8KLSAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kXzsKLQotICBzaXplX3QgY2FsbF9sZW47Ci0gIGNvbnN0IHVpbnQzMl90ICpwYywgKmxhc3Q7Ci0KLSAgLyogQ3VycmVudCBpbnB1dCBidWZmZXIgYW5kIGl0cyBzdHJlYW0gb2Zmc2V0LiAqLwotICBjb25zdCBjaGFyICpidWYsICpwdHIsICplbmQsICpjaGVja3BvaW50OwotCi0gIC8qIEVuZCBvZiB0aGUgZGVsaW1pdGVkIHJlZ2lvbiwgcmVsYXRpdmUgdG8gcHRyLCBOVUxMIGlmIG5vdCBpbiB0aGlzIGJ1Zi4gKi8KLSAgY29uc3QgY2hhciAqZGVsaW1fZW5kOwotCi0gIC8qIEVuZCBvZiB0aGUgZGVsaW1pdGVkIHJlZ2lvbiwgcmVsYXRpdmUgdG8gcHRyLCBlbmQgaWYgbm90IGluIHRoaXMgYnVmLiAqLwotICBjb25zdCBjaGFyICpkYXRhX2VuZDsKLQotICAvKiBPdmVyYWxsIHN0cmVhbSBvZmZzZXQgb2YgImJ1Zi4iICovCi0gIHVpbnQ2NF90IGJ1ZnN0YXJ0X29mczsKLQotICAvKiBCdWZmZXIgZm9yIHJlc2lkdWFsIGJ5dGVzIG5vdCBwYXJzZWQgZnJvbSB0aGUgcHJldmlvdXMgYnVmZmVyLgotICAgKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgcmVzaWR1YWwgYnl0ZXMgd2UgcmVxdWlyZSBpcyAxMjsgYSBmaXZlLWJ5dGUKLSAgICogdW5rbm93biB0YWcgcGx1cyBhbiBlaWdodC1ieXRlIHZhbHVlLCBsZXNzIG9uZSBiZWNhdXNlIHRoZSB2YWx1ZQotICAgKiBpcyBvbmx5IGEgcGFydGlhbCB2YWx1ZS4gKi8KLSAgY2hhciByZXNpZHVhbFsxMl07Ci0gIGNoYXIgKnJlc2lkdWFsX2VuZDsKLQotICAvKiBCeXRlcyBvZiBkYXRhIHRoYXQgc2hvdWxkIGJlIGRpc2NhcmRlZCBmcm9tIHRoZSBpbnB1dCBiZW9yZSB3ZSBzdGFydAotICAgKiBwYXJzaW5nIGFnYWluLiAgV2Ugc2V0IHRoaXMgd2hlbiB3ZSBpbnRlcm5hbGx5IGRldGVybWluZSB0aGF0IHdlIGNhbgotICAgKiBzYWZlbHkgc2tpcCB0aGUgbmV4dCBOIGJ5dGVzLCBidXQgdGhpcyByZWdpb24gZXh0ZW5kcyBwYXN0IHRoZSBjdXJyZW50Ci0gICAqIHVzZXIgYnVmZmVyLiAqLwotICBzaXplX3Qgc2tpcDsKLQotICAvKiBTdG9yZXMgdGhlIHVzZXIgYnVmZmVyIHBhc3NlZCB0byBvdXIgZGVjb2RlIGZ1bmN0aW9uLiAqLwotICBjb25zdCBjaGFyICpidWZfcGFyYW07Ci0gIHNpemVfdCBzaXplX3BhcmFtOwotICBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGU7Ci0KLSAgLyogT3VyIGludGVybmFsIHN0YWNrLiAqLwotICB1cGJfcGJkZWNvZGVyX2ZyYW1lICpzdGFjaywgKnRvcCwgKmxpbWl0OwotICBjb25zdCB1aW50MzJfdCAqKmNhbGxzdGFjazsKLSAgc2l6ZV90IHN0YWNrX3NpemU7Ci0KLSAgdXBiX3N0YXR1cyAqc3RhdHVzOwotCi0jaWZkZWYgVVBCX1VTRV9KSVRfWDY0Ci0gIC8qIFVzZWQgbW9tZW50YXJpbHkgYnkgdGhlIGdlbmVyYXRlZCBjb2RlIHRvIHN0b3JlIGEgdmFsdWUgd2hpbGUgYSB1c2VyCi0gICAqIGZ1bmN0aW9uIGlzIGNhbGxlZC4gKi8KLSAgdWludDMyX3QgdG1wX2xlbjsKLQotICBjb25zdCB2b2lkICpzYXZlZF9yc3A7Ci0jZW5kaWYKLX07Ci0KLS8qIERlY29kZXIgZW50cnkgcG9pbnRzOyB1c2VkIGFzIGhhbmRsZXJzLiAqLwotdm9pZCAqdXBiX3BiZGVjb2Rlcl9zdGFydGJjKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKnBjLCBzaXplX3Qgc2l6ZV9oaW50KTsKLXZvaWQgKnVwYl9wYmRlY29kZXJfc3RhcnRqaXQodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIHNpemVfdCBzaXplX2hpbnQpOwotc2l6ZV90IHVwYl9wYmRlY29kZXJfZGVjb2RlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSk7Ci1ib29sIHVwYl9wYmRlY29kZXJfZW5kKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSk7Ci0KLS8qIERlY29kZXItaW50ZXJuYWwgZnVuY3Rpb25zIHRoYXQgdGhlIEpJVCBjYWxscyB0byBoYW5kbGUgZmFsbGJhY2sgcGF0aHMuICovCi1pbnQzMl90IHVwYl9wYmRlY29kZXJfcmVzdW1lKHVwYl9wYmRlY29kZXIgKmQsIHZvaWQgKnAsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSk7Ci1zaXplX3QgdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKHVwYl9wYmRlY29kZXIgKmQpOwotaW50MzJfdCB1cGJfcGJkZWNvZGVyX3NraXB1bmtub3duKHVwYl9wYmRlY29kZXIgKmQsIGludDMyX3QgZmllbGRudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB3aXJlX3R5cGUpOwotaW50MzJfdCB1cGJfcGJkZWNvZGVyX2NoZWNrdGFnX3Nsb3codXBiX3BiZGVjb2RlciAqZCwgdWludDY0X3QgZXhwZWN0ZWQpOwotaW50MzJfdCB1cGJfcGJkZWNvZGVyX2RlY29kZV92YXJpbnRfc2xvdyh1cGJfcGJkZWNvZGVyICpkLCB1aW50NjRfdCAqdTY0KTsKLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9kZWNvZGVfZjMyKHVwYl9wYmRlY29kZXIgKmQsIHVpbnQzMl90ICp1MzIpOwotaW50MzJfdCB1cGJfcGJkZWNvZGVyX2RlY29kZV9mNjQodXBiX3BiZGVjb2RlciAqZCwgdWludDY0X3QgKnU2NCk7Ci12b2lkIHVwYl9wYmRlY29kZXJfc2V0ZXJyKHVwYl9wYmRlY29kZXIgKmQsIGNvbnN0IGNoYXIgKm1zZyk7Ci0KLS8qIEVycm9yIG1lc3NhZ2VzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBieXRlY29kZSBhbmQgSklUIGRlY29kZXJzLiAqLwotZXh0ZXJuIGNvbnN0IGNoYXIgKmtQYkRlY29kZXJTdGFja092ZXJmbG93OwotZXh0ZXJuIGNvbnN0IGNoYXIgKmtQYkRlY29kZXJTdWJtZXNzYWdlVG9vTG9uZzsKLQotLyogQWNjZXNzIHRvIGRlY29kZXJwbGFuIG1lbWJlcnMgbmVlZGVkIGJ5IHRoZSBkZWNvZGVyLiAqLwotY29uc3QgY2hhciAqdXBiX3BiZGVjb2Rlcl9nZXRvcG5hbWUodW5zaWduZWQgaW50IG9wKTsKLQotLyogSklUIGNvZGVnZW4gZW50cnkgcG9pbnQuICovCi12b2lkIHVwYl9wYmRlY29kZXJfaml0KG1ncm91cCAqZ3JvdXApOwotdm9pZCB1cGJfcGJkZWNvZGVyX2ZyZWVqaXQobWdyb3VwICpncm91cCk7Ci1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyhtZ3JvdXAsIG1ncm91cF91cGNhc3QpCi0KLS8qIEEgc3BlY2lhbCBsYWJlbCB0aGF0IG1lYW5zICJkbyBmaWVsZCBkaXNwYXRjaCBmb3IgdGhpcyBtZXNzYWdlIGFuZCBicmFuY2ggdG8KLSAqIHdoZXJldmVyIHRoYXQgdGFrZXMgeW91LiIgKi8KLSNkZWZpbmUgTEFCRUxfRElTUEFUQ0ggMAotCi0vKiBBIHNwZWNpYWwgc2xvdCBpbiB0aGUgZGlzcGF0Y2ggdGFibGUgdGhhdCBzdG9yZXMgdGhlIGVwaWxvZ3VlIChFTkRNU0cgYW5kL29yCi0gKiBSRVQpIGZvciBicmFuY2hpbmcgdG8gd2hlbiB3ZSBmaW5kIGFuIGFwcHJvcHJpYXRlIEVOREdST1VQIHRhZy4gKi8KLSNkZWZpbmUgRElTUEFUQ0hfRU5ETVNHIDAKLQotLyogSXQncyBpbXBvcnRhbnQgdG8gdXNlIHRoaXMgaW52YWxpZCB3aXJlIHR5cGUgaW5zdGVhZCBvZiAwICh3aGljaCBpcyBhIHZhbGlkCi0gKiB3aXJlIHR5cGUpLiAqLwotI2RlZmluZSBOT19XSVJFX1RZUEUgMHhmZgotCi0vKiBUaGUgZGlzcGF0Y2ggdGFibGUgbGF5b3V0IGlzOgotICogICBbZmllbGQgbnVtYmVyXSAtPiBbIDQ4LWJpdCBvZmZzZXQgXVsgOC1iaXQgd3QyIF1bIDgtYml0IHd0MSBdCi0gKgotICogSWYgd3QxIG1hdGNoZXMsIGp1bXAgdG8gdGhlIDQ4LWJpdCBvZmZzZXQuICBJZiB3dDIgbWF0Y2hlcywgbG9va3VwCi0gKiAoVVBCX01BWF9GSUVMRE5VTUJFUiArIGZpZWxkbnVtKSBhbmQganVtcCB0aGVyZS4KLSAqCi0gKiBXZSBuZWVkIHR3byB3aXJlIHR5cGVzIGJlY2F1c2Ugb2YgcGFja2VkL25vbi1wYWNrZWQgY29tcGF0aWJpbGl0eS4gIEEKLSAqIHByaW1pdGl2ZSByZXBlYXRlZCBmaWVsZCBjYW4gdXNlIGVpdGhlciB3aXJlIHR5cGUgYW5kIGJlIHZhbGlkLiAgV2hpbGUgd2UKLSAqIGNvdWxkIGtleSB0aGUgdGFibGUgb24gZmllbGRudW0rd2lyZXR5cGUsIHRoZSB0YWJsZSB3b3VsZCBiZSA4eCBzcGFyc2VyLgotICoKLSAqIFN0b3JpbmcgdHdvIHdpcmUgdHlwZXMgaW4gdGhlIHByaW1hcnkgdmFsdWUgYWxsb3dzIHVzIHRvIHF1aWNrbHkgcnVsZSBvdXQKLSAqIHRoZSBzZWNvbmQgd2lyZSB0eXBlIHdpdGhvdXQgbmVlZGluZyB0byBkbyBhIHNlcGFyYXRlIGxvb2t1cCAodGhpcyBjYXNlIGlzCi0gKiBsZXNzIGNvbW1vbiB0aGFuIGFuIHVua25vd24gZmllbGQpLiAqLwotVVBCX0lOTElORSB1aW50NjRfdCB1cGJfcGJkZWNvZGVyX3BhY2tkaXNwYXRjaCh1aW50NjRfdCBvZnMsIHVpbnQ4X3Qgd3QxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90IHd0MikgewotICByZXR1cm4gKG9mcyA8PCAxNikgfCAod3QyIDw8IDgpIHwgd3QxOwotfQotCi1VUEJfSU5MSU5FIHZvaWQgdXBiX3BiZGVjb2Rlcl91bnBhY2tkaXNwYXRjaCh1aW50NjRfdCBkaXNwYXRjaCwgdWludDY0X3QgKm9mcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3QgKnd0MSwgdWludDhfdCAqd3QyKSB7Ci0gICp3dDEgPSAodWludDhfdClkaXNwYXRjaDsKLSAgKnd0MiA9ICh1aW50OF90KShkaXNwYXRjaCA+PiA4KTsKLSAgKm9mcyA9IGRpc3BhdGNoID4+IDE2OwotfQotCi0vKiBBbGwgb2YgdGhlIGZ1bmN0aW9ucyBpbiBkZWNvZGVyLmMgdGhhdCByZXR1cm4gaW50MzJfdCByZXR1cm4gdmFsdWVzIGFjY29yZGluZwotICogdG8gdGhlIGZvbGxvd2luZyBzY2hlbWU6Ci0gKiAgIDEuIG5lZ2F0aXZlIHZhbHVlcyBpbmRpY2F0ZSBhIHJldHVybiBjb2RlIGZyb20gdGhlIGZvbGxvd2luZyBsaXN0LgotICogICAyLiBwb3NpdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgdGhhdCBlcnJvciBvciBlbmQgb2YgYnVmZmVyIHdhcyBoaXQsIGFuZAotICogICAgICB0aGF0IHRoZSBkZWNvZGUgZnVuY3Rpb24gc2hvdWxkIGltbWVkaWF0ZWx5IHJldHVybiB0aGUgZ2l2ZW4gdmFsdWUKLSAqICAgICAgKHRoZSBkZWNvZGVyIHN0YXRlIGhhcyBhbHJlYWR5IGJlZW4gc3VzcGVuZGVkIGFuZCBpcyByZWFkeSB0byBiZQotICogICAgICByZXN1bWVkKS4gKi8KLSNkZWZpbmUgREVDT0RFX09LIC0xCi0jZGVmaW5lIERFQ09ERV9NSVNNQVRDSCAtMiAgLyogVXNlZCBvbmx5IGZyb20gY2hlY2t0YWdfc2xvdygpLiAqLwotI2RlZmluZSBERUNPREVfRU5ER1JPVVAgLTMgIC8qIFVzZWQgb25seSBmcm9tIGNoZWNrdW5rbm93bigpLiAqLwotCi0jZGVmaW5lIENIRUNLX1JFVFVSTih4KSB7IGludDMyX3QgcmV0ID0geDsgaWYgKHJldCA+PSAwKSByZXR1cm4gcmV0OyB9Ci0KLSNlbmRpZiAgLyogVVBCX0RFQ09ERVJfSU5UX0hfICovCi0vKgotKiogQSBudW1iZXIgb2Ygcm91dGluZXMgZm9yIHZhcmludCBtYW5pcHVsYXRpb24gKHdlIGtlZXAgdGhlbSBhbGwgYXJvdW5kIHRvCi0qKiBoYXZlIG11bHRpcGxlIGFwcHJvYWNoZXMgYXZhaWxhYmxlIGZvciBiZW5jaG1hcmtpbmcpLgotKi8KLQotI2lmbmRlZiBVUEJfVkFSSU5UX0RFQ09ERVJfSF8KLSNkZWZpbmUgVVBCX1ZBUklOVF9ERUNPREVSX0hfCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0vKiBBIGxpc3Qgb2YgdHlwZXMgYXMgdGhleSBhcmUgZW5jb2RlZCBvbi10aGUtd2lyZS4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9XSVJFX1RZUEVfVkFSSU5UICAgICAgPSAwLAotICBVUEJfV0lSRV9UWVBFXzY0QklUICAgICAgID0gMSwKLSAgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQgICA9IDIsCi0gIFVQQl9XSVJFX1RZUEVfU1RBUlRfR1JPVVAgPSAzLAotICBVUEJfV0lSRV9UWVBFX0VORF9HUk9VUCAgID0gNCwKLSAgVVBCX1dJUkVfVFlQRV8zMkJJVCAgICAgICA9IDUKLX0gdXBiX3dpcmV0eXBlX3Q7Ci0KLSNkZWZpbmUgVVBCX01BWF9XSVJFX1RZUEUgNQotCi0vKiBUaGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCBpdCB0YWtlcyB0byBlbmNvZGUgYSA2NC1iaXQgdmFyaW50LgotICogTm90ZSB0aGF0IHdpdGggYSBiZXR0ZXIgZW5jb2RpbmcgdGhpcyBjb3VsZCBiZSA5IChUT0RPOiB3cml0ZSB1cCBhCi0gKiB3aWtpIGRvY3VtZW50IGFib3V0IHRoaXMpLiAqLwotI2RlZmluZSBVUEJfUEJfVkFSSU5UX01BWF9MRU4gMTAKLQotLyogQXJyYXkgb2YgdGhlICJuYXRpdmUiIChpZS4gbm9uLXBhY2tlZC1yZXBlYXRlZCkgd2lyZSB0eXBlIGZvciB0aGUgZ2l2ZW4gYQotICogZGVzY3JpcHRvciB0eXBlICh1cGJfZGVzY3JpcHRvcnR5cGVfdCkuICovCi1leHRlcm4gY29uc3QgdWludDhfdCB1cGJfcGJfbmF0aXZlX3dpcmVfdHlwZXNbXTsKLQotLyogWmlnLXphZyBlbmNvZGluZy9kZWNvZGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotVVBCX0lOTElORSBpbnQzMl90IHVwYl96emRlY18zMih1aW50MzJfdCBuKSB7Ci0gIHJldHVybiAobiA+PiAxKSBeIC0oaW50MzJfdCkobiAmIDEpOwotfQotVVBCX0lOTElORSBpbnQ2NF90IHVwYl96emRlY182NCh1aW50NjRfdCBuKSB7Ci0gIHJldHVybiAobiA+PiAxKSBeIC0oaW50NjRfdCkobiAmIDEpOwotfQotVVBCX0lOTElORSB1aW50MzJfdCB1cGJfenplbmNfMzIoaW50MzJfdCBuKSB7IHJldHVybiAobiA8PCAxKSBeIChuID4+IDMxKTsgfQotVVBCX0lOTElORSB1aW50NjRfdCB1cGJfenplbmNfNjQoaW50NjRfdCBuKSB7IHJldHVybiAobiA8PCAxKSBeIChuID4+IDYzKTsgfQotCi0vKiBEZWNvZGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBBbGwgZGVjb2RpbmcgZnVuY3Rpb25zIHJldHVybiB0aGlzIHN0cnVjdCBieSB2YWx1ZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY29uc3QgY2hhciAqcDsgIC8qIE5VTEwgaWYgdGhlIHZhcmludCB3YXMgdW50ZXJtaW5hdGVkLiAqLwotICB1aW50NjRfdCB2YWw7Ci19IHVwYl9kZWNvZGVyZXQ7Ci0KLVVQQl9JTkxJTkUgdXBiX2RlY29kZXJldCB1cGJfZGVjb2RlcmV0X21ha2UoY29uc3QgY2hhciAqcCwgdWludDY0X3QgdmFsKSB7Ci0gIHVwYl9kZWNvZGVyZXQgcmV0OwotICByZXQucCA9IHA7Ci0gIHJldC52YWwgPSB2YWw7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEZvdXIgZnVuY3Rpb25zIGZvciBkZWNvZGluZyBhIHZhcmludCBvZiBhdCBtb3N0IGVpZ2h0IGJ5dGVzLiAgVGhleSBhcmUgYWxsCi0gKiBmdW5jdGlvbmFsbHkgaWRlbnRpY2FsLCBidXQgYXJlIGltcGxlbWVudGVkIGluIGRpZmZlcmVudCB3YXlzIGFuZCBsaWtlbHkgaGF2ZQotICogZGlmZmVyZW50IHBlcmZvcm1hbmNlIHByb2ZpbGVzLiAgV2Uga2VlcCB0aGVtIGFyb3VuZCBmb3IgcGVyZm9ybWFuY2UgdGVzdGluZy4KLSAqCi0gKiBOb3RlIHRoYXQgdGhlc2UgZnVuY3Rpb25zIG1heSBub3QgcmVhZCBieXRlLWJ5LWJ5dGUsIHNvIHRoZXkgbXVzdCBub3QgYmUgdXNlZAotICogdW5sZXNzIHRoZXJlIGFyZSBhdCBsZWFzdCBlaWdodCBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIhICovCi11cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX21heDhfYnJhbmNoMzIodXBiX2RlY29kZXJldCByKTsKLXVwYl9kZWNvZGVyZXQgdXBiX3ZkZWNvZGVfbWF4OF9icmFuY2g2NCh1cGJfZGVjb2RlcmV0IHIpOwotdXBiX2RlY29kZXJldCB1cGJfdmRlY29kZV9tYXg4X3dyaWdodCh1cGJfZGVjb2RlcmV0IHIpOwotdXBiX2RlY29kZXJldCB1cGJfdmRlY29kZV9tYXg4X21hc3NpbWlubyh1cGJfZGVjb2RlcmV0IHIpOwotCi0vKiBUZW1wbGF0ZSBmb3IgYSBmdW5jdGlvbiB0aGF0IGNoZWNrcyB0aGUgZmlyc3QgdHdvIGJ5dGVzIHdpdGggYnJhbmNoaW5nCi0gKiBhbmQgZGlzcGF0Y2hlcyAyLTEwIGJ5dGVzIHdpdGggYSBzZXBhcmF0ZSBmdW5jdGlvbi4gIE5vdGUgdGhhdCB0aGlzIG1heSByZWFkCi0gKiB1cCB0byAxMCBieXRlcywgc28gaXQgbXVzdCBub3QgYmUgdXNlZCB1bmxlc3MgdGhlcmUgYXJlIGF0IGxlYXN0IHRlbiBieXRlcwotICogbGVmdCBpbiB0aGUgYnVmZmVyISAqLwotI2RlZmluZSBVUEJfVkFSSU5UX0RFQ09ERVJfQ0hFQ0syKG5hbWUsIGRlY29kZV9tYXg4X2Z1bmN0aW9uKSAgICAgICAgICAgICAgICAgIFwKLVVQQl9JTkxJTkUgdXBiX2RlY29kZXJldCB1cGJfdmRlY29kZV9jaGVjazJfICMjIG5hbWUoY29uc3QgY2hhciAqX3ApIHsgICAgICAgICBcCi0gIHVpbnQ4X3QgKnAgPSAodWludDhfdCopX3A7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB1cGJfZGVjb2RlcmV0IHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCgqcCAmIDB4ODApID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIENvbW1vbiBjYXNlOiBvbmUtYnl0ZSB2YXJpbnQuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB1cGJfZGVjb2RlcmV0X21ha2UoX3AgKyAxLCAqcCAmIDB4N2ZVKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHIgPSB1cGJfZGVjb2RlcmV0X21ha2UoX3AgKyAyLCAoKnAgJiAweDdmVSkgfCAoKCoocCArIDEpICYgMHg3ZlUpIDw8IDcpKTsgICAgXAotICBpZiAoKCoocCArIDEpICYgMHg4MCkgPT0gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAvKiBUd28tYnl0ZSB2YXJpbnQuICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogTG9uZ2VyIHZhcmludCwgZmFsbGJhY2sgdG8gb3V0LW9mLWxpbmUgZnVuY3Rpb24uICovICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJldHVybiBkZWNvZGVfbWF4OF9mdW5jdGlvbihyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfQotCi1VUEJfVkFSSU5UX0RFQ09ERVJfQ0hFQ0syKGJyYW5jaDMyLCB1cGJfdmRlY29kZV9tYXg4X2JyYW5jaDMyKQotVVBCX1ZBUklOVF9ERUNPREVSX0NIRUNLMihicmFuY2g2NCwgdXBiX3ZkZWNvZGVfbWF4OF9icmFuY2g2NCkKLVVQQl9WQVJJTlRfREVDT0RFUl9DSEVDSzIod3JpZ2h0LCB1cGJfdmRlY29kZV9tYXg4X3dyaWdodCkKLVVQQl9WQVJJTlRfREVDT0RFUl9DSEVDSzIobWFzc2ltaW5vLCB1cGJfdmRlY29kZV9tYXg4X21hc3NpbWlubykKLSN1bmRlZiBVUEJfVkFSSU5UX0RFQ09ERVJfQ0hFQ0syCi0KLS8qIE91ciBjYW5vbmljYWwgZnVuY3Rpb25zIGZvciBkZWNvZGluZyB2YXJpbnRzLCBiYXNlZCBvbiB0aGUgY3VycmVudGx5Ci0gKiBmYXZvcmVkIGJlc3QtcGVyZm9ybWluZyBpbXBsZW1lbnRhdGlvbnMuICovCi1VUEJfSU5MSU5FIHVwYl9kZWNvZGVyZXQgdXBiX3ZkZWNvZGVfZmFzdChjb25zdCBjaGFyICpwKSB7Ci0gIGlmIChzaXplb2YobG9uZykgPT0gOCkKLSAgICByZXR1cm4gdXBiX3ZkZWNvZGVfY2hlY2syX2JyYW5jaDY0KHApOwotICBlbHNlCi0gICAgcmV0dXJuIHVwYl92ZGVjb2RlX2NoZWNrMl9icmFuY2gzMihwKTsKLX0KLQotVVBCX0lOTElORSB1cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX21heDhfZmFzdCh1cGJfZGVjb2RlcmV0IHIpIHsKLSAgcmV0dXJuIHVwYl92ZGVjb2RlX21heDhfbWFzc2ltaW5vKHIpOwotfQotCi0KLS8qIEVuY29kaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVVQQl9JTkxJTkUgaW50IHVwYl92YWx1ZV9zaXplKHVpbnQ2NF90IHZhbCkgewotI2lmZGVmIF9fR05VQ19fCi0gIGludCBoaWdoX2JpdCA9IDYzIC0gX19idWlsdGluX2NsemxsKHZhbCk7ICAvKiAwLWJhc2VkLCB1bmRlZiBpZiB2YWwgPT0gMC4gKi8KLSNlbHNlCi0gIGludCBoaWdoX2JpdCA9IDA7Ci0gIHVpbnQ2NF90IHRtcCA9IHZhbDsKLSAgd2hpbGUodG1wID4+PSAxKSBoaWdoX2JpdCsrOwotI2VuZGlmCi0gIHJldHVybiB2YWwgPT0gMCA/IDEgOiBoaWdoX2JpdCAvIDggKyAxOwotfQotCi0vKiBFbmNvZGVzIGEgNjQtYml0IHZhcmludCBpbnRvIGJ1ZiAod2hpY2ggbXVzdCBiZSA+PVVQQl9QQl9WQVJJTlRfTUFYX0xFTgotICogYnl0ZXMgbG9uZyksIHJldHVybmluZyBob3cgbWFueSBieXRlcyB3ZXJlIHVzZWQuCi0gKgotICogVE9ETzogYmVuY2htYXJrIGFuZCBvcHRpbWl6ZSBpZiBuZWNlc3NhcnkuICovCi1VUEJfSU5MSU5FIHNpemVfdCB1cGJfdmVuY29kZTY0KHVpbnQ2NF90IHZhbCwgY2hhciAqYnVmKSB7Ci0gIHNpemVfdCBpOwotICBpZiAodmFsID09IDApIHsgYnVmWzBdID0gMDsgcmV0dXJuIDE7IH0KLSAgaSA9IDA7Ci0gIHdoaWxlICh2YWwpIHsKLSAgICB1aW50OF90IGJ5dGUgPSB2YWwgJiAweDdmVTsKLSAgICB2YWwgPj49IDc7Ci0gICAgaWYgKHZhbCkgYnl0ZSB8PSAweDgwVTsKLSAgICBidWZbaSsrXSA9IGJ5dGU7Ci0gIH0KLSAgcmV0dXJuIGk7Ci19Ci0KLVVQQl9JTkxJTkUgc2l6ZV90IHVwYl92YXJpbnRfc2l6ZSh1aW50NjRfdCB2YWwpIHsKLSAgY2hhciBidWZbVVBCX1BCX1ZBUklOVF9NQVhfTEVOXTsKLSAgcmV0dXJuIHVwYl92ZW5jb2RlNjQodmFsLCBidWYpOwotfQotCi0vKiBFbmNvZGVzIGEgMzItYml0IHZhcmludCwgKm5vdCogc2lnbi1leHRlbmRlZC4gKi8KLVVQQl9JTkxJTkUgdWludDY0X3QgdXBiX3ZlbmNvZGUzMih1aW50MzJfdCB2YWwpIHsKLSAgY2hhciBidWZbVVBCX1BCX1ZBUklOVF9NQVhfTEVOXTsKLSAgc2l6ZV90IGJ5dGVzID0gdXBiX3ZlbmNvZGU2NCh2YWwsIGJ1Zik7Ci0gIHVpbnQ2NF90IHJldCA9IDA7Ci0gIGFzc2VydChieXRlcyA8PSA1KTsKLSAgbWVtY3B5KCZyZXQsIGJ1ZiwgYnl0ZXMpOwotICBhc3NlcnQocmV0IDw9IDB4ZmZmZmZmZmZmZlUpOwotICByZXR1cm4gcmV0OwotfQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8qIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9WQVJJTlRfREVDT0RFUl9IXyAqLwotLyoKLSoqIHVwYjo6cGI6OkVuY29kZXIgKHVwYl9wYl9lbmNvZGVyKQotKioKLSoqIEltcGxlbWVudHMgYSBzZXQgb2YgdXBiX2hhbmRsZXJzIHRoYXQgd3JpdGUgcHJvdG9idWYgZGF0YSB0byB0aGUgYmluYXJ5IHdpcmUKLSoqIGZvcm1hdC4KLSoqCi0qKiBUaGlzIGVuY29kZXIgaW1wbGVtZW50YXRpb24gZG9lcyBub3QgaGF2ZSBhbnkgYWNjZXNzIHRvIGFueSBvdXQtb2YtYmFuZCBvcgotKiogcHJlY29tcHV0ZWQgbGVuZ3RocyBmb3Igc3VibWVzc2FnZXMsIHNvIGl0IG11c3QgYnVmZmVyIHN1Ym1lc3NhZ2VzIGludGVybmFsbHkKLSoqIGJlZm9yZSBpdCBjYW4gZW1pdCB0aGUgZmlyc3QgYnl0ZS4KLSovCi0KLSNpZm5kZWYgVVBCX0VOQ09ERVJfSF8KLSNkZWZpbmUgVVBCX0VOQ09ERVJfSF8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWNsYXNzIEVuY29kZXI7Ci19ICAvKiBuYW1lc3BhY2UgcGIgKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6cGI6OkVuY29kZXIsIHVwYl9wYl9lbmNvZGVyKQotCi0jZGVmaW5lIFVQQl9QQkVOQ09ERVJfTUFYX05FU1RJTkcgMTAwCi0KLS8qIHVwYjo6cGI6OkVuY29kZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFByZWFsbG9jYXRpb24gaGludDogZGVjb2RlciB3b24ndCBhbGxvY2F0ZSBtb3JlIGJ5dGVzIHRoYW4gdGhpcyB3aGVuIGZpcnN0Ci0gKiBjb25zdHJ1Y3RlZC4gIFRoaXMgaGludCBtYXkgYmUgYW4gb3ZlcmVzdGltYXRlIGZvciBzb21lIGJ1aWxkIGNvbmZpZ3VyYXRpb25zLgotICogQnV0IGlmIHRoZSBkZWNvZGVyIGxpYnJhcnkgaXMgdXBncmFkZWQgd2l0aG91dCByZWNvbXBpbGluZyB0aGUgYXBwbGljYXRpb24sCi0gKiBpdCBtYXkgYmUgYW4gdW5kZXJlc3RpbWF0ZS4gKi8KLSNkZWZpbmUgVVBCX1BCX0VOQ09ERVJfU0laRSA3NjgKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLWNsYXNzIHVwYjo6cGI6OkVuY29kZXIgewotIHB1YmxpYzoKLSAgLyogQ3JlYXRlcyBhIG5ldyBlbmNvZGVyIGluIHRoZSBnaXZlbiBlbnZpcm9ubWVudC4gIFRoZSBIYW5kbGVycyBtdXN0IGhhdmUKLSAgICogY29tZSBmcm9tIE5ld0hhbmRsZXJzKCkgYmVsb3cuICovCi0gIHN0YXRpYyBFbmNvZGVyKiBDcmVhdGUoRW52aXJvbm1lbnQqIGVudiwgY29uc3QgSGFuZGxlcnMqIGhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzU2luayogb3V0cHV0KTsKLQotICAvKiBUaGUgaW5wdXQgdG8gdGhlIGVuY29kZXIuICovCi0gIFNpbmsqIGlucHV0KCk7Ci0KLSAgLyogQ3JlYXRlcyBhIG5ldyBzZXQgb2YgaGFuZGxlcnMgZm9yIHRoaXMgTWVzc2FnZURlZi4gKi8KLSAgc3RhdGljIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+IE5ld0hhbmRsZXJzKGNvbnN0IE1lc3NhZ2VEZWYqIG1zZyk7Ci0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2l6ZSA9IFVQQl9QQl9FTkNPREVSX1NJWkU7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhFbmNvZGVyLCB1cGI6OnBiOjpFbmNvZGVyKQotfTsKLQotI2VuZGlmCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9wYl9lbmNvZGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm93bmVyKTsKLXVwYl9zaW5rICp1cGJfcGJfZW5jb2Rlcl9pbnB1dCh1cGJfcGJfZW5jb2RlciAqcCk7Ci11cGJfcGJfZW5jb2RlciogdXBiX3BiX2VuY29kZXJfY3JlYXRlKHVwYl9lbnYqIGUsIGNvbnN0IHVwYl9oYW5kbGVycyogaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2J5dGVzc2luayogb3V0cHV0KTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UgcGIgewotaW5saW5lIEVuY29kZXIqIEVuY29kZXI6OkNyZWF0ZShFbnZpcm9ubWVudCogZW52LCBjb25zdCBIYW5kbGVycyogaGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzU2luayogb3V0cHV0KSB7Ci0gIHJldHVybiB1cGJfcGJfZW5jb2Rlcl9jcmVhdGUoZW52LCBoYW5kbGVycywgb3V0cHV0KTsKLX0KLWlubGluZSBTaW5rKiBFbmNvZGVyOjppbnB1dCgpIHsKLSAgcmV0dXJuIHVwYl9wYl9lbmNvZGVyX2lucHV0KHRoaXMpOwotfQotaW5saW5lIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+IEVuY29kZXI6Ok5ld0hhbmRsZXJzKAotICAgIGNvbnN0IHVwYjo6TWVzc2FnZURlZiAqbWQpIHsKLSAgY29uc3QgSGFuZGxlcnMqIGggPSB1cGJfcGJfZW5jb2Rlcl9uZXdoYW5kbGVycyhtZCwgJmgpOwotICByZXR1cm4gcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4oaCwgJmgpOwotfQotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9FTkNPREVSX0hfICovCi0vKgotKiogdXBiJ3MgY29yZSBjb21wb25lbnRzIGxpa2UgdXBiX2RlY29kZXIgYW5kIHVwYl9tc2cgYXJlIGNhcmVmdWxseSBkZXNpZ25lZCB0bwotKiogYXZvaWQgZGVwZW5kaW5nIG9uIGVhY2ggb3RoZXIgZm9yIG1heGltdW0gb3J0aG9nb25hbGl0eS4gIEluIG90aGVyIHdvcmRzLAotKiogeW91IGNhbiB1c2UgYSB1cGJfZGVjb2RlciB0byBkZWNvZGUgaW50byAqYW55KiBraW5kIG9mIHN0cnVjdHVyZTsgdXBiX21zZyBpcwotKioganVzdCBvbmUgc3VjaCBzdHJ1Y3R1cmUuICBBIHVwYl9tc2cgY2FuIGJlIHNlcmlhbGl6ZWQvZGVzZXJpYWxpemVkIGludG8gYW55Ci0qKiBmb3JtYXQsIHByb3RvYnVmIGJpbmFyeSBmb3JtYXQgaXMganVzdCBvbmUgc3VjaCBmb3JtYXQuCi0qKgotKiogSG93ZXZlciwgZm9yIGNvbnZlbmllbmNlIHdlIHByb3ZpZGUgZnVuY3Rpb25zIGhlcmUgZm9yIGRvaW5nIGNvbW1vbgotKiogb3BlcmF0aW9ucyBsaWtlIGRlc2VyaWFsaXppbmcgcHJvdG9idWYgYmluYXJ5IGZvcm1hdCBpbnRvIGEgdXBiX21zZy4gIFRoZQotKiogY29tcHJvbWlzZSBpcyB0aGF0IHRoaXMgZmlsZSBkcmFncyBpbiBhbG1vc3QgYWxsIG9mIHVwYiBhcyBhIGRlcGVuZGVuY3ksCi0qKiB3aGljaCBjb3VsZCBiZSB1bmRlc2lyYWJsZSBpZiB5b3UncmUgdHJ5aW5nIHRvIHVzZSBhIHRyaW1tZWQtZG93biBidWlsZCBvZgotKiogdXBiLgotKioKLSoqIFdoaWxlIHRoZXNlIHJvdXRpbmVzIGFyZSBjb252ZW5pZW50LCB0aGV5IGRvIG5vdCByZXVzZSBhbnkgZW5jb2RpbmcvZGVjb2RpbmcKLSoqIHN0YXRlLiAgRm9yIGV4YW1wbGUsIGlmIGEgZGVjb2RlciBpcyBKSVQtYmFzZWQsIGl0IHdpbGwgYmUgcmUtSklUdGVkIGV2ZXJ5Ci0qKiB0aW1lIHRoZXNlIGZ1bmN0aW9ucyBhcmUgY2FsbGVkLiAgRm9yIHRoaXMgcmVhc29uLCBpZiB5b3UgYXJlIHBhcnNpbmcgbG90cwotKiogb2YgZGF0YSBhbmQgZWZmaWNpZW5jeSBpcyBhbiBpc3N1ZSwgdGhlc2UgbWF5IG5vdCBiZSB0aGUgYmVzdCBmdW5jdGlvbnMgdG8KLSoqIHVzZSAodGhvdWdoIHRoZXkgYXJlIHVzZWZ1bCBmb3IgcHJvdG90eXBpbmcsIGJlZm9yZSBvcHRpbWl6aW5nKS4KLSovCi0KLSNpZm5kZWYgVVBCX0dMVUVfSAotI2RlZmluZSBVUEJfR0xVRV9ICi0KLSNpbmNsdWRlIDxzdGRib29sLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogTG9hZHMgYWxsIGRlZnMgZnJvbSB0aGUgZ2l2ZW4gcHJvdG9idWYgYmluYXJ5IGRlc2NyaXB0b3IsIHNldHRpbmcgZGVmYXVsdAotICogYWNjZXNzb3JzIGFuZCBhIGRlZmF1bHQgbGF5b3V0IG9uIGFsbCBtZXNzYWdlcy4gIFRoZSBjYWxsZXIgb3ducyB0aGUKLSAqIHJldHVybmVkIGFycmF5IG9mIGRlZnMsIHdoaWNoIHdpbGwgYmUgb2YgbGVuZ3RoICpuLiAgT24gZXJyb3IgTlVMTCBpcwotICogcmV0dXJuZWQgYW5kIHN0YXR1cyBpcyBzZXQgKGlmIG5vbi1OVUxMKS4gKi8KLXVwYl9kZWYgKip1cGJfbG9hZF9kZWZzX2Zyb21fZGVzY3JpcHRvcihjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sIGludCAqbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpvd25lciwgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotLyogTGlrZSB0aGUgcHJldmlvdXMgYnV0IGFsc28gYWRkcyB0aGUgbG9hZGVkIGRlZnMgdG8gdGhlIGdpdmVuIHN5bXRhYi4gKi8KLWJvb2wgdXBiX2xvYWRfZGVzY3JpcHRvcl9pbnRvX3N5bXRhYih1cGJfc3ltdGFiICpzeW10YWIsIGNvbnN0IGNoYXIgKnN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCB1cGJfc3RhdHVzICpzdGF0dXMpOwotCi0vKiBMaWtlIHRoZSBwcmV2aW91cyBidXQgYWxzbyByZWFkcyB0aGUgZGVzY3JpcHRvciBmcm9tIHRoZSBnaXZlbiBmaWxlbmFtZS4gKi8KLWJvb2wgdXBiX2xvYWRfZGVzY3JpcHRvcl9maWxlX2ludG9fc3ltdGFiKHVwYl9zeW10YWIgKnN5bXRhYiwgY29uc3QgY2hhciAqZm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzdGF0dXMpOwotCi0vKiBSZWFkcyB0aGUgZ2l2ZW4gZmlsZW5hbWUgaW50byBhIGNoYXJhY3RlciBzdHJpbmcsIHJldHVybmluZyBOVUxMIGlmIHRoZXJlCi0gKiB3YXMgYW4gZXJyb3IuICovCi1jaGFyICp1cGJfcmVhZGZpbGUoY29uc3QgY2hhciAqZmlsZW5hbWUsIHNpemVfdCAqbGVuKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvKiBleHRlcm4gIkMiICovCi0KLW5hbWVzcGFjZSB1cGIgewotCi0vKiBBbGwgcm91dGluZXMgdGhhdCBsb2FkIGRlc2NyaXB0b3JzIGV4cGVjdCB0aGUgZGVzY3JpcHRvciB0byBiZSBhCi0gKiBGaWxlRGVzY3JpcHRvclNldC4gKi8KLWlubGluZSBib29sIExvYWREZXNjcmlwdG9yRmlsZUludG9TeW10YWIoU3ltYm9sVGFibGUqIHMsIGNvbnN0IGNoYXIgKmZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2xvYWRfZGVzY3JpcHRvcl9maWxlX2ludG9fc3ltdGFiKHMsIGZuYW1lLCBzdGF0dXMpOwotfQotCi1pbmxpbmUgYm9vbCBMb2FkRGVzY3JpcHRvckludG9TeW10YWIoU3ltYm9sVGFibGUqIHMsIGNvbnN0IGNoYXIqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2xvYWRfZGVzY3JpcHRvcl9pbnRvX3N5bXRhYihzLCBzdHIsIGxlbiwgc3RhdHVzKTsKLX0KLQotLyogVGVtcGxhdGVkIHNvIGl0IGNhbiBhY2NlcHQgYm90aCBzdHJpbmcgYW5kIHN0ZDo6c3RyaW5nLiAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIExvYWREZXNjcmlwdG9ySW50b1N5bXRhYihTeW1ib2xUYWJsZSogcywgY29uc3QgVCYgZGVzYywgU3RhdHVzKiBzdGF0dXMpIHsKLSAgcmV0dXJuIHVwYl9sb2FkX2Rlc2NyaXB0b3JfaW50b19zeW10YWIocywgZGVzYy5jX3N0cigpLCBkZXNjLnNpemUoKSwgc3RhdHVzKTsKLX0KLQotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfR0xVRV9IICovCi0vKgotKiogdXBiOjpwYjo6VGV4dFByaW50ZXIgKHVwYl90ZXh0cHJpbnRlcikKLSoqCi0qKiBIYW5kbGVycyBmb3Igd3JpdGluZyB0byBwcm90b2J1ZiB0ZXh0IGZvcm1hdC4KLSovCi0KLSNpZm5kZWYgVVBCX1RFWFRfSF8KLSNkZWZpbmUgVVBCX1RFWFRfSF8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWNsYXNzIFRleHRQcmludGVyOwotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OnBiOjpUZXh0UHJpbnRlciwgdXBiX3RleHRwcmludGVyKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotY2xhc3MgdXBiOjpwYjo6VGV4dFByaW50ZXIgewotIHB1YmxpYzoKLSAgLyogVGhlIGdpdmVuIGhhbmRsZXJzIG11c3QgaGF2ZSBjb21lIGZyb20gTmV3SGFuZGxlcnMoKS4gIEl0IG11c3Qgb3V0bGl2ZSB0aGUKLSAgICogVGV4dFByaW50ZXIuICovCi0gIHN0YXRpYyBUZXh0UHJpbnRlciAqQ3JlYXRlKEVudmlyb25tZW50ICplbnYsIGNvbnN0IHVwYjo6SGFuZGxlcnMgKmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc1NpbmsgKm91dHB1dCk7Ci0KLSAgdm9pZCBTZXRTaW5nbGVMaW5lTW9kZShib29sIHNpbmdsZV9saW5lKTsKLQotICBTaW5rKiBpbnB1dCgpOwotCi0gIC8qIElmIGhhbmRsZXIgY2FjaGluZyBiZWNvbWVzIGEgcmVxdWlyZW1lbnQgd2UgY2FuIGFkZCBhIGNvZGUgY2FjaGUgYXMgaW4KLSAgICogZGVjb2Rlci5oICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPGNvbnN0IEhhbmRsZXJzPiBOZXdIYW5kbGVycyhjb25zdCBNZXNzYWdlRGVmKiBtZCk7Ci19OwotCi0jZW5kaWYKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIEMgQVBJLiAqLwotdXBiX3RleHRwcmludGVyICp1cGJfdGV4dHByaW50ZXJfY3JlYXRlKHVwYl9lbnYgKmVudiwgY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ieXRlc3NpbmsgKm91dHB1dCk7Ci12b2lkIHVwYl90ZXh0cHJpbnRlcl9zZXRzaW5nbGVsaW5lKHVwYl90ZXh0cHJpbnRlciAqcCwgYm9vbCBzaW5nbGVfbGluZSk7Ci11cGJfc2luayAqdXBiX3RleHRwcmludGVyX2lucHV0KHVwYl90ZXh0cHJpbnRlciAqcCk7Ci0KLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX3RleHRwcmludGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcik7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWlubGluZSBUZXh0UHJpbnRlciAqVGV4dFByaW50ZXI6OkNyZWF0ZShFbnZpcm9ubWVudCAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYjo6SGFuZGxlcnMgKmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzU2luayAqb3V0cHV0KSB7Ci0gIHJldHVybiB1cGJfdGV4dHByaW50ZXJfY3JlYXRlKGVudiwgaGFuZGxlcnMsIG91dHB1dCk7Ci19Ci1pbmxpbmUgdm9pZCBUZXh0UHJpbnRlcjo6U2V0U2luZ2xlTGluZU1vZGUoYm9vbCBzaW5nbGVfbGluZSkgewotICB1cGJfdGV4dHByaW50ZXJfc2V0c2luZ2xlbGluZSh0aGlzLCBzaW5nbGVfbGluZSk7Ci19Ci1pbmxpbmUgU2luayogVGV4dFByaW50ZXI6OmlucHV0KCkgewotICByZXR1cm4gdXBiX3RleHRwcmludGVyX2lucHV0KHRoaXMpOwotfQotaW5saW5lIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+IFRleHRQcmludGVyOjpOZXdIYW5kbGVycygKLSAgICBjb25zdCBNZXNzYWdlRGVmICptZCkgewotICBjb25zdCBIYW5kbGVycyogaCA9IHVwYl90ZXh0cHJpbnRlcl9uZXdoYW5kbGVycyhtZCwgJmgpOwotICByZXR1cm4gcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4oaCwgJmgpOwotfQotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9URVhUX0hfICovCi0vKgotKiogdXBiOjpqc29uOjpQYXJzZXIgKHVwYl9qc29uX3BhcnNlcikKLSoqCi0qKiBQYXJzZXMgSlNPTiBhY2NvcmRpbmcgdG8gYSBzcGVjaWZpYyBzY2hlbWEuCi0qKiBTdXBwb3J0IGZvciBwYXJzaW5nIGFyYml0cmFyeSBKU09OIChzY2hlbWEtbGVzcykgd2lsbCBiZSBhZGRlZCBsYXRlci4KLSovCi0KLSNpZm5kZWYgVVBCX0pTT05fUEFSU0VSX0hfCi0jZGVmaW5lIFVQQl9KU09OX1BBUlNFUl9IXwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UganNvbiB7Ci1jbGFzcyBQYXJzZXI7Ci19ICAvKiBuYW1lc3BhY2UganNvbiAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2VuZGlmCi0KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpqc29uOjpQYXJzZXIsIHVwYl9qc29uX3BhcnNlcikKLQotLyogdXBiOjpqc29uOjpQYXJzZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogUHJlYWxsb2NhdGlvbiBoaW50OiBwYXJzZXIgd29uJ3QgYWxsb2NhdGUgbW9yZSBieXRlcyB0aGFuIHRoaXMgd2hlbiBmaXJzdAotICogY29uc3RydWN0ZWQuICBUaGlzIGhpbnQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSBmb3Igc29tZSBidWlsZCBjb25maWd1cmF0aW9ucy4KLSAqIEJ1dCBpZiB0aGUgcGFyc2VyIGxpYnJhcnkgaXMgdXBncmFkZWQgd2l0aG91dCByZWNvbXBpbGluZyB0aGUgYXBwbGljYXRpb24sCi0gKiBpdCBtYXkgYmUgYW4gdW5kZXJlc3RpbWF0ZS4gKi8KLSNkZWZpbmUgVVBCX0pTT05fUEFSU0VSX1NJWkUgMzcwNAotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogUGFyc2VzIGFuIGluY29taW5nIEJ5dGVzU3RyZWFtLCBwdXNoaW5nIHRoZSByZXN1bHRzIHRvIHRoZSBkZXN0aW5hdGlvbgotICogc2luay4gKi8KLWNsYXNzIHVwYjo6anNvbjo6UGFyc2VyIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBQYXJzZXIqIENyZWF0ZShFbnZpcm9ubWVudCogZW52LCBTaW5rKiBvdXRwdXQpOwotCi0gIEJ5dGVzU2luayogaW5wdXQoKTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKFBhcnNlciwgdXBiOjpqc29uOjpQYXJzZXIpCi19OwotCi0jZW5kaWYKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLXVwYl9qc29uX3BhcnNlciAqdXBiX2pzb25fcGFyc2VyX2NyZWF0ZSh1cGJfZW52ICplLCB1cGJfc2luayAqb3V0cHV0KTsKLXVwYl9ieXRlc3NpbmsgKnVwYl9qc29uX3BhcnNlcl9pbnB1dCh1cGJfanNvbl9wYXJzZXIgKnApOwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1uYW1lc3BhY2UgdXBiIHsKLW5hbWVzcGFjZSBqc29uIHsKLWlubGluZSBQYXJzZXIqIFBhcnNlcjo6Q3JlYXRlKEVudmlyb25tZW50KiBlbnYsIFNpbmsqIG91dHB1dCkgewotICByZXR1cm4gdXBiX2pzb25fcGFyc2VyX2NyZWF0ZShlbnYsIG91dHB1dCk7Ci19Ci1pbmxpbmUgQnl0ZXNTaW5rKiBQYXJzZXI6OmlucHV0KCkgewotICByZXR1cm4gdXBiX2pzb25fcGFyc2VyX2lucHV0KHRoaXMpOwotfQotfSAgLyogbmFtZXNwYWNlIGpzb24gKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLQotI2VuZGlmCi0KLQotI2VuZGlmICAvKiBVUEJfSlNPTl9QQVJTRVJfSF8gKi8KLS8qCi0qKiB1cGI6Ompzb246OlByaW50ZXIKLSoqCi0qKiBIYW5kbGVycyB0aGF0IGVtaXQgSlNPTiBhY2NvcmRpbmcgdG8gYSBzcGVjaWZpYyBwcm90b2J1ZiBzY2hlbWEuCi0qLwotCi0jaWZuZGVmIFVQQl9KU09OX1RZUEVEX1BSSU5URVJfSF8KLSNkZWZpbmUgVVBCX0pTT05fVFlQRURfUFJJTlRFUl9IXwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UganNvbiB7Ci1jbGFzcyBQcmludGVyOwotfSAgLyogbmFtZXNwYWNlIGpzb24gKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6anNvbjo6UHJpbnRlciwgdXBiX2pzb25fcHJpbnRlcikKLQotCi0vKiB1cGI6Ompzb246OlByaW50ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jZGVmaW5lIFVQQl9KU09OX1BSSU5URVJfU0laRSAxNjgKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFByaW50cyBhbiBpbmNvbWluZyBzdHJlYW0gb2YgZGF0YSB0byBhIEJ5dGVzU2luayBpbiBKU09OIGZvcm1hdC4gKi8KLWNsYXNzIHVwYjo6anNvbjo6UHJpbnRlciB7Ci0gcHVibGljOgotICBzdGF0aWMgUHJpbnRlciogQ3JlYXRlKEVudmlyb25tZW50KiBlbnYsIGNvbnN0IHVwYjo6SGFuZGxlcnMqIGhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzU2luayogb3V0cHV0KTsKLQotICAvKiBUaGUgaW5wdXQgdG8gdGhlIHByaW50ZXIuICovCi0gIFNpbmsqIGlucHV0KCk7Ci0KLSAgLyogUmV0dXJucyBoYW5kbGVycyBmb3IgcHJpbnRpbmcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgc2NoZW1hLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4gTmV3SGFuZGxlcnMoY29uc3QgdXBiOjpNZXNzYWdlRGVmKiBtZCk7Ci0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2l6ZSA9IFVQQl9KU09OX1BSSU5URVJfU0laRTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKFByaW50ZXIsIHVwYjo6anNvbjo6UHJpbnRlcikKLX07Ci0KLSNlbmRpZgotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogTmF0aXZlIEMgQVBJLiAqLwotdXBiX2pzb25fcHJpbnRlciAqdXBiX2pzb25fcHJpbnRlcl9jcmVhdGUodXBiX2VudiAqZSwgY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2J5dGVzc2luayAqb3V0cHV0KTsKLXVwYl9zaW5rICp1cGJfanNvbl9wcmludGVyX2lucHV0KHVwYl9qc29uX3ByaW50ZXIgKnApOwotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfanNvbl9wcmludGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm1kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm93bmVyKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UganNvbiB7Ci1pbmxpbmUgUHJpbnRlciogUHJpbnRlcjo6Q3JlYXRlKEVudmlyb25tZW50KiBlbnYsIGNvbnN0IHVwYjo6SGFuZGxlcnMqIGhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc1NpbmsqIG91dHB1dCkgewotICByZXR1cm4gdXBiX2pzb25fcHJpbnRlcl9jcmVhdGUoZW52LCBoYW5kbGVycywgb3V0cHV0KTsKLX0KLWlubGluZSBTaW5rKiBQcmludGVyOjppbnB1dCgpIHsgcmV0dXJuIHVwYl9qc29uX3ByaW50ZXJfaW5wdXQodGhpcyk7IH0KLWlubGluZSByZWZmZWRfcHRyPGNvbnN0IEhhbmRsZXJzPiBQcmludGVyOjpOZXdIYW5kbGVycygKLSAgICBjb25zdCB1cGI6Ok1lc3NhZ2VEZWYgKm1kKSB7Ci0gIGNvbnN0IEhhbmRsZXJzKiBoID0gdXBiX2pzb25fcHJpbnRlcl9uZXdoYW5kbGVycyhtZCwgJmgpOwotICByZXR1cm4gcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4oaCwgJmgpOwotfQotfSAgLyogbmFtZXNwYWNlIGpzb24gKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLQotI2VuZGlmCi0KLSNlbmRpZiAgLyogVVBCX0pTT05fVFlQRURfUFJJTlRFUl9IXyAqLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL3Rlc3RzL2F1dG9sb2FkLnBocCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BocC90ZXN0cy9hdXRvbG9hZC5waHAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFmODhiYTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGhwL3Rlc3RzL2F1dG9sb2FkLnBocAorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotPD9waHAKLQotcmVxdWlyZV9vbmNlKCd0ZXN0LnBiLnBocCcpOwotcmVxdWlyZV9vbmNlKCd0ZXN0X3V0aWwucGhwJyk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b2J1Zi5neXAgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b2J1Zi5neXAKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ODU4MzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9idWYuZ3lwCisrKyAvZGV2L251bGwKQEAgLTEsNTYzICswLDAgQEAKLSMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0jIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLXsKLSAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgWyd1c2Vfc3lzdGVtX3Byb3RvYnVmPT0wJywgewotICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgIFsnT1M9PSJ3aW4iJywgewotICAgICAgICAgICd0YXJnZXRfZGVmYXVsdHMnOiB7Ci0gICAgICAgICAgICAnbXN2c19kaXNhYmxlZF93YXJuaW5ncyc6IFsKLSAgICAgICAgICAgICAgNDAxOCwgICMgc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoIGluIGNvbXBhcmlzb24KLSAgICAgICAgICAgICAgNDA2NSwgICMgc3dpdGNoIHN0YXRlbWVudCBjb250YWlucyAnZGVmYXVsdCcgYnV0IG5vICdjYXNlJyBsYWJlbHMKLSAgICAgICAgICAgICAgNDE0NiwgICMgdW5hcnkgbWludXMgb3BlcmF0b3IgYXBwbGllZCB0byB1bnNpZ25lZCB0eXBlCi0gICAgICAgICAgICAgIDQyNDQsICAjIGltcGxpY2l0IGNvbnZlcnNpb24sIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YQotICAgICAgICAgICAgICA0MjY3LCAgIyBzaXplX3QgdG8gaW50IHRydW5jYXRpb24KLSAgICAgICAgICAgICAgNDI5MSwgICMgbm8gbWF0Y2hpbmcgb3BlcmF0b3IgZGVsZXRlIGZvciBhIHBsYWNlbWVudCBuZXcKLSAgICAgICAgICAgICAgNDMwNSwgICMgZG91YmxlIHRvIGZsb2F0IHRydW5jYXRpb24KLSAgICAgICAgICAgICAgNDM1NSwgICMgJ3RoaXMnIHVzZWQgaW4gYmFzZSBtZW1iZXIgaW5pdGlhbGl6ZXIgbGlzdAotICAgICAgICAgICAgICA0NTA2LCAgIyBubyBkZWZpbml0aW9uIGZvciBpbmxpbmUgZnVuY3Rpb24gKHByb3RvYnVmIGlzc3VlICMyNDApCi0gICAgICAgICAgICAgIDQ3MTUsICAjIG5vdCBhbGwgY29udHJvbCBwYXRocyByZXR1cm4gYSB2YWx1ZSAoZml4ZWQgaW4gdHJ1bmspCi0gICAgICAgICAgICBdLAotICAgICAgICAgICAgJ2RlZmluZXMhJzogWwotICAgICAgICAgICAgICAnV0lOMzJfTEVBTl9BTkRfTUVBTicsICAjIFByb3RvYnVmIGRlZmluZXMgdGhpcyBpdHNlbGYuCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgIH1dLAotICAgICAgXSwKLSAgICAgICd0YXJnZXRzJzogWwotICAgICAgICAjIFRoZSAibGl0ZSIgbGliIGlzIGFib3V0IDEvN3RoIHRoZSBzaXplIG9mIHRoZSBoZWF2eSBsaWIsCi0gICAgICAgICMgYnV0IGl0IGRvZXNuJ3Qgc3VwcG9ydCBzb21lIG9mIHRoZSBtb3JlIGV4b3RpYyBmZWF0dXJlcyBvZgotICAgICAgICAjIHByb3RvYnVmcywgbGlrZSByZWZsZWN0aW9uLiAgVG8gZ2VuZXJhdGUgQysrIGNvZGUgdGhhdCBjYW4gbGluawotICAgICAgICAjIGFnYWluc3QgdGhlIGxpdGUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSwgYWRkIHRoZSBvcHRpb24gbGluZToKLSAgICAgICAgIwotICAgICAgICAjICAgb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLSAgICAgICAgIwotICAgICAgICAjIHRvIHlvdXIgLnByb3RvIGZpbGUuCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9idWZfbGl0ZScsCi0gICAgICAgICAgJ3R5cGUnOiAnPChjb21wb25lbnQpJywKLSAgICAgICAgICAndG9vbHNldHMnOiBbJ2hvc3QnLCAndGFyZ2V0J10sCi0gICAgICAgICAgJ2luY2x1ZGVzJzogWwotICAgICAgICAgICAgJ3Byb3RvYnVmX2xpdGUuZ3lwaScsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAndmFyaWFibGVzJzogewotICAgICAgICAgICAgJ2NsYW5nX3dhcm5pbmdfZmxhZ3MnOiBbCi0gICAgICAgICAgICAgICMgcHJvdG9idWYtMyBjb250YWlucyBhIGZldyBmdW5jdGlvbnMgdGhhdCBhcmUgdW51c2VkLgotICAgICAgICAgICAgICAnLVduby11bnVzZWQtZnVuY3Rpb24nLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICB9LAotICAgICAgICAgICMgUmVxdWlyZWQgZm9yIGNvbXBvbmVudCBidWlsZHMuIFNlZSBodHRwOi8vY3JidWcuY29tLzE3MjgwMC4KLSAgICAgICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgICAgICdMSUJQUk9UT0JVRl9FWFBPUlRTJywKLSAgICAgICAgICAgICdQUk9UT0JVRl9VU0VfRExMUycsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAnZGlyZWN0X2RlcGVuZGVudF9zZXR0aW5ncyc6IHsKLSAgICAgICAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAgICAgICAnUFJPVE9CVUZfVVNFX0RMTFMnLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICB9LAotICAgICAgICB9LAotICAgICAgICAjIFRoaXMgaXMgdGhlIGZ1bGwsIGhlYXZ5IHByb3RvYnVmIGxpYiB0aGF0J3MgbmVlZGVkIGZvciBjKysgLnByb3RvcwotICAgICAgICAjIHRoYXQgZG9uJ3Qgc3BlY2lmeSB0aGUgTElURV9SVU5USU1FIG9wdGlvbi4gIFRoZSBwcm90b2NvbAotICAgICAgICAjIGNvbXBpbGVyIGl0c2VsZiAocHJvdG9jKSBmYWxscyBpbnRvIHRoYXQgY2F0ZWdvcnkuCi0gICAgICAgICMKLSAgICAgICAgIyBETyBOT1QgTElOSyBBR0FJTlNUIFRISVMgVEFSR0VUIElOIENIUk9NRSBDT0RFICAtLWFnbAotICAgICAgICB7Ci0gICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3Byb3RvYnVmX2Z1bGxfZG9fbm90X3VzZScsCi0gICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgICAgICd0b29sc2V0cyc6IFsnaG9zdCcsJ3RhcmdldCddLAotICAgICAgICAgICdpbmNsdWRlcyc6IFsKLSAgICAgICAgICAgICdwcm90b2J1Zl9saXRlLmd5cGknLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICdjbGFuZ193YXJuaW5nX2ZsYWdzJzogWwotICAgICAgICAgICAgICAjIHByb3RvYnVmLTMgY29udGFpbnMgYSBmZXcgZnVuY3Rpb25zIHRoYXQgYXJlIHVudXNlZC4KLSAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLWZ1bmN0aW9uJywKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgfSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvYW55LnBiLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBiLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBiLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oJywKLQotICAgICAgICAgICAgIyBnemlwX3N0cmVhbS5jYyBwdWxscyBpbiB6bGliLCBidXQgaXQncyBub3QgYWN0dWFsbHkgdXNlZCBieQotICAgICAgICAgICAgIyBwcm90b2MsIGp1c3QgYnkgdGVzdCBjb2RlLCBzbyBpbnN0ZWFkIG9mIGNvbXBpbGluZyB6bGliIGZvciB0aGUKLSAgICAgICAgICAgICMgaG9zdCwgbGV0J3MganVzdCBleGNsdWRlIHRoaXMuCi0gICAgICAgICAgICAjICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjJywKLSAgICAgICAgICAgICMgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaCcsCi0KLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeS5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9pbnRlcm5hbC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnBiLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aHV0aWwuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zaW5nbGV0b24kLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wYi5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2NvbnN0YW50cy5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2xvY2F0aW9uX3RyYWNrZXIuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9sb2NhdGlvbl90cmFja2VyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfc291cmNlLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdXRpbGl0eS5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmgnLAotICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9jX2xpYicsCi0gICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAotICAgICAgICAgICd0b29sc2V0cyc6IFsnaG9zdCddLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWFwX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWFwX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bS5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW1fZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZV9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX29wdGlvbnMuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkX2xpdGUuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGRfbGl0ZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2xpdGUuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fbGl0ZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb25fbGl0ZS5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uX2xpdGUuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvcl9mYWN0b3J5LmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkX2xpdGUuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZF9saXRlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZF9saXRlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGRfbGl0ZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlcl9saXRlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9saXRlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkX2xpdGUuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZF9saXRlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zaGFyZWRfY29kZV9nZW5lcmF0b3IuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkX2xpdGUuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2V4dGVuc2lvbi5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19maWxlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2dlbmVyYXRvci5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2hlbHBlcnMuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21hcF9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tYXBfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2UuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2VfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wcmltaXRpdmVfZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcHJpbWl0aXZlX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2pzL2pzX2dlbmVyYXRvci5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW1fZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW1fZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpbGUuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpbGUuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21hcF9maWVsZC5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmgiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaCIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYyIsCi0gICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oIiwKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MiLAotICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oIiwKLSAgICAgICAgICBdLAotICAgICAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICAgICAnY2xhbmdfd2FybmluZ19mbGFncyc6IFsKLSAgICAgICAgICAgICAgIyBwcm90b2J1Zi0zIGNvbnRhaW5zIGEgZmV3IGZ1bmN0aW9ucyB0aGF0IGFyZSB1bnVzZWQuCi0gICAgICAgICAgICAgICctV25vLXVudXNlZC1mdW5jdGlvbicsCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICdwcm90b2J1Zl9mdWxsX2RvX25vdF91c2UnLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgICAgICdzcmMnLAotICAgICAgICAgIF0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9jJywKLSAgICAgICAgICAndHlwZSc6ICdleGVjdXRhYmxlJywKLSAgICAgICAgICAndG9vbHNldHMnOiBbJ2hvc3QnXSwKLSAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MiLAotICAgICAgICAgIF0sCi0gICAgICAgICAgJ2RlcGVuZGVuY2llcyc6IFsKLSAgICAgICAgICAgICdwcm90b2NfbGliJywKLSAgICAgICAgICBdLAotICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCi0gICAgICAgICAgICAnc3JjJywKLSAgICAgICAgICBdLAotICAgICAgICB9LAotICAgICAgICB7Ci0gICAgICAgICAgIyBHZW5lcmF0ZSB0aGUgcHl0aG9uIG1vZHVsZSBuZWVkZWQgYnkgYWxsIHByb3RvYy1nZW5lcmF0ZWQgUHl0aG9uIGNvZGUuCi0gICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3B5X3Byb3RvJywKLSAgICAgICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICAgICAnY29waWVzJzogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAnZGVzdGluYXRpb24nOiAnPChQUk9EVUNUX0RJUikvcHlwcm90by9nb29nbGUvJywKLSAgICAgICAgICAgICAgJ2ZpbGVzJzogWwotICAgICAgICAgICAgICAgICdfX2luaXRfXy5weScsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAnZGVzdGluYXRpb24nOiAnPChQUk9EVUNUX0RJUikvcHlwcm90by9nb29nbGUvdGhpcmRfcGFydHkvc2l4LycsCi0gICAgICAgICAgICAgICdmaWxlcyc6IFsKLSAgICAgICAgICAgICAgICAndGhpcmRfcGFydHkvc2l4L3NpeC5weScsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAnZGVzdGluYXRpb24nOiAnPChQUk9EVUNUX0RJUikvcHlwcm90by9nb29nbGUvcHJvdG9idWYnLAotICAgICAgICAgICAgICAnZmlsZXMnOiBbCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvX19pbml0X18ucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfcG9vbC5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvanNvbl9mb3JtYXQucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfZmFjdG9yeS5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHJvdG9fYnVpbGRlci5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZS5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5JywKLSAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zeW1ib2xfZGF0YWJhc2UucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZW5jb2RpbmcucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LnB5JywKLQotICAgICAgICAgICAgICAgICMgVE9ETyhuY2FydGVyKTogcHJvdG9jJ3MgcHl0aG9uIGdlbmVyYXRvciB0cmVhdHMKLSAgICAgICAgICAgICAgICAjIGRlc2NyaXB0b3IucHJvdG8gc3BlY2lhbGx5LCBidXQgb25seSB3aGVuIHRoZSBpbnB1dCBwYXRoIGlzCi0gICAgICAgICAgICAgICAgIyBleGFjdGx5ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIuICBJJ20gbm90IHN1cmUgaG93Ci0gICAgICAgICAgICAgICAgIyB0byBleGVjdXRlIGEgcnVsZSBmcm9tIGEgZGlmZmVyZW50IGRpcmVjdG9yeS4gIEZvciBub3csIHVzZSBhCi0gICAgICAgICAgICAgICAgIyBtYW51YWxseS1nZW5lcmF0ZWQgY29weSBvZiBkZXNjcmlwdG9yX3BiMi5weS4KLSAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3BiMi5weScsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICB9LAotICAgICAgICAgICAgewotICAgICAgICAgICAgICAnZGVzdGluYXRpb24nOiAnPChQUk9EVUNUX0RJUikvcHlwcm90by9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwnLAotICAgICAgICAgICAgICAnZmlsZXMnOiBbCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX19pbml0X18ucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19wYXJhbWV0ZXJpemVkLnB5JywKLSAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hcGlfaW1wbGVtZW50YXRpb24ucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2RlY29kZXIucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHknLAotICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5JywKLSAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2xpc3RlbmVyLnB5JywKLSAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fbWVzc2FnZS5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2VsbF9rbm93bl90eXBlcy5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHknLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgICBdLAotICAgICAgIyAgICMgV2UgY2FuJ3QgZ2VuZXJhdGUgYSBwcm9wZXIgZGVzY3JpcHRvcl9wYjIucHkgLS0gc2VlIGVhcmxpZXIgY29tbWVudC4KLSAgICAgICMgICAncnVsZXMnOiBbCi0gICAgICAjICAgICB7Ci0gICAgICAjICAgICAgICdydWxlX25hbWUnOiAnZ2VucHJvdG8nLAotICAgICAgIyAgICAgICAnZXh0ZW5zaW9uJzogJ3Byb3RvJywKLSAgICAgICMgICAgICAgJ2lucHV0cyc6IFsKLSAgICAgICMgICAgICAgICAnPChQUk9EVUNUX0RJUikvPChFWEVDVVRBQkxFX1BSRUZJWClwcm90b2M8KEVYRUNVVEFCTEVfU1VGRklYKScsCi0gICAgICAjICAgICAgIF0sCi0gICAgICAjICAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAjICAgICAgICAgIyBUaGUgcHJvdG9jIGNvbXBpbGVyIHJlcXVpcmVzIGEgcHJvdG9fcGF0aCBhcmd1bWVudCB3aXRoIHRoZQotICAgICAgIyAgICAgICAgICAgIyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgLnByb3RvIGZpbGUuCi0gICAgICAjICAgICAgICAgICAncnVsZV9pbnB1dF9yZWxwYXRoJzogJ3NyYy9nb29nbGUvcHJvdG9idWYnLAotICAgICAgIyAgICAgICAgIH0sCi0gICAgICAjICAgICAgICAgJ291dHB1dHMnOiBbCi0gICAgICAjICAgICAgICAgICAnPChQUk9EVUNUX0RJUikvcHlwcm90by9nb29nbGUvcHJvdG9idWYvPChSVUxFX0lOUFVUX1JPT1QpX3BiMi5weScsCi0gICAgICAjICAgICAgICAgXSwKLSAgICAgICMgICAgICAgICAnYWN0aW9uJzogWwotICAgICAgIyAgICAgICAgICAgJzwoUFJPRFVDVF9ESVIpLzwoRVhFQ1VUQUJMRV9QUkVGSVgpcHJvdG9jPChFWEVDVVRBQkxFX1NVRkZJWCknLAotICAgICAgIyAgICAgICAgICAgJy1JLi9zcmMnLAotICAgICAgIyAgICAgICAgICAgJy1JLicsCi0gICAgICAjICAgICAgICAgICAnLS1weXRob25fb3V0PTwoUFJPRFVDVF9ESVIpL3B5cHJvdG8vZ29vZ2xlL3Byb3RvYnVmJywKLSAgICAgICMgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bycsCi0gICAgICAjICAgICAgICAgXSwKLSAgICAgICMgICAgICAgICAnbWVzc2FnZSc6ICdHZW5lcmF0aW5nIFB5dGhvbiBjb2RlIGZyb20gPChSVUxFX0lOUFVUX1BBVEgpJywKLSAgICAgICMgICAgICAgfSwKLSAgICAgICMgICAgIF0sCi0gICAgICAjICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgIyAgICAgICAncHJvdG9jI2hvc3QnLAotICAgICAgIyAgICAgXSwKLSAgICAgICMgICAgICdzb3VyY2VzJzogWwotICAgICAgIyAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvJywKLSAgICAgICMgICAgIF0sCi0gICAgICAgICB9LAotICAgICAgXSwKLSAgICB9LCB7ICMgdXNlX3N5c3RlbV9wcm90b2J1Zj09MQotICAgICAgJ3RhcmdldHMnOiBbCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9idWZfbGl0ZScsCi0gICAgICAgICAgJ3R5cGUnOiAnbm9uZScsCi0gICAgICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnY2ZsYWdzJzogWwotICAgICAgICAgICAgICAjIFVzZSBmdWxsIHByb3RvYnVmLCBiZWNhdXNlIHZhbmlsbGEgcHJvdG9idWYgZG9lc24ndCBoYXZlCi0gICAgICAgICAgICAgICMgb3VyIGN1c3RvbSBwYXRjaCB0byByZXRhaW4gdW5rbm93biBmaWVsZHMgaW4gbGl0ZSBtb2RlLgotICAgICAgICAgICAgICAnPCFAKHBrZy1jb25maWcgLS1jZmxhZ3MgcHJvdG9idWYpJywKLSAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgICAgICAgJ1VTRV9TWVNURU1fUFJPVE9CVUYnLAotCi0gICAgICAgICAgICAgICMgVGhpcyBtYWNybyBtdXN0IGJlIGRlZmluZWQgdG8gc3VwcHJlc3MgdGhlIHVzZQotICAgICAgICAgICAgICAjIG9mIGR5bmFtaWNfY2FzdDw+LCB3aGljaCByZXF1aXJlcyBSVFRJLgotICAgICAgICAgICAgICAnR09PR0xFX1BST1RPQlVGX05PX1JUVEknLAotICAgICAgICAgICAgICAnR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUicsCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgICAgJ2xpbmtfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAjIFVzZSBmdWxsIHByb3RvYnVmLCBiZWNhdXNlIHZhbmlsbGEgcHJvdG9idWYgZG9lc24ndCBoYXZlCi0gICAgICAgICAgICAjIG91ciBjdXN0b20gcGF0Y2ggdG8gcmV0YWluIHVua25vd24gZmllbGRzIGluIGxpdGUgbW9kZS4KLSAgICAgICAgICAgICdsZGZsYWdzJzogWwotICAgICAgICAgICAgICAnPCFAKHBrZy1jb25maWcgLS1saWJzLW9ubHktTCAtLWxpYnMtb25seS1vdGhlciBwcm90b2J1ZiknLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICdsaWJyYXJpZXMnOiBbCi0gICAgICAgICAgICAgICc8IUAocGtnLWNvbmZpZyAtLWxpYnMtb25seS1sIHByb3RvYnVmKScsCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9jJywKLSAgICAgICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICAgICAndG9vbHNldHMnOiBbJ2hvc3QnLCAndGFyZ2V0J10sCi0gICAgICAgIH0sCi0gICAgICAgIHsKLSAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHlfcHJvdG8nLAotICAgICAgICAgICd0eXBlJzogJ25vbmUnLAotICAgICAgICB9LAotICAgICAgXSwKLSAgICB9XSwKLSAgXSwKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9NQU5JRkVTVC5pbiBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9NQU5JRkVTVC5pbgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjYwODg4Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vTUFOSUZFU1QuaW4KKysrIC9kZXYvbnVsbApAQCAtMSwxNCArMCwwIEBACi1wcnVuZSBnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZQotZXhjbHVkZSBnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvKl9wYjIucHkKLWV4Y2x1ZGUgZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsLypfdGVzdC5weQotZXhjbHVkZSBnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvKi5wcm90bwotZXhjbHVkZSBnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF91dGlsLnB5Ci0KLXJlY3Vyc2l2ZS1leGNsdWRlIGdvb2dsZSAqX3Rlc3QucHkKLXJlY3Vyc2l2ZS1leGNsdWRlIGdvb2dsZSAqX3Rlc3QucHJvdG8KLXJlY3Vyc2l2ZS1leGNsdWRlIGdvb2dsZSB1bml0dGVzdCpfcGIyLnB5Ci0KLWdsb2JhbC1leGNsdWRlICouZGxsCi1nbG9iYWwtZXhjbHVkZSAqLnB5YwotZ2xvYmFsLWV4Y2x1ZGUgKi5weW8KLWdsb2JhbC1leGNsdWRlICouc28KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1N2FjZmQ5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9SRUFETUUubWQKKysrIC9kZXYvbnVsbApAQCAtMSwxMjcgKzAsMCBAQAotUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotWyFbQnVpbGQgU3RhdHVzXShodHRwczovL3RyYXZpcy1jaS5vcmcvZ29vZ2xlL3Byb3RvYnVmLnN2Zz9icmFuY2g9bWFzdGVyKV0oaHR0cHM6Ly90cmF2aXMtY2kub3JnL2dvb2dsZS9wcm90b2J1ZikKLQotQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLQotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgdGhlIFB5dGhvbiBQcm90b2NvbCBCdWZmZXJzIHJ1bnRpbWUgbGlicmFyeS4KLQotTm9ybWFsbHksIHRoaXMgZGlyZWN0b3J5IGNvbWVzIGFzIHBhcnQgb2YgdGhlIHByb3RvYnVmIHBhY2thZ2UsIGF2YWlsYWJsZQotZnJvbToKLQotICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotCi1UaGUgY29tcGxldGUgcGFja2FnZSBpbmNsdWRlcyB0aGUgQysrIHNvdXJjZSBjb2RlLCB3aGljaCBpbmNsdWRlcyB0aGUKLVByb3RvY29sIENvbXBpbGVyIChwcm90b2MpLiAgSWYgeW91IGRvd25sb2FkZWQgdGhpcyBwYWNrYWdlIGZyb20gUHlQSQotb3Igc29tZSBvdGhlciBQeXRob24tc3BlY2lmaWMgc291cmNlLCB5b3UgbWF5IGhhdmUgcmVjZWl2ZWQgb25seSB0aGUKLVB5dGhvbiBwYXJ0IG9mIHRoZSBjb2RlLiAgSW4gdGhpcyBjYXNlLCB5b3Ugd2lsbCBuZWVkIHRvIG9idGFpbiB0aGUKLVByb3RvY29sIENvbXBpbGVyIGZyb20gc29tZSBvdGhlciBzb3VyY2UgYmVmb3JlIHlvdSBjYW4gdXNlIHRoaXMKLXBhY2thZ2UuCi0KLURldmVsb3BtZW50IFdhcm5pbmcKLT09PT09PT09PT09PT09PT09PT0KLQotVGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBvZiBQcm90b2NvbCBCdWZmZXJzIGlzIG5vdCBhcyBtYXR1cmUgYXMgdGhlIEMrKwotYW5kIEphdmEgaW1wbGVtZW50YXRpb25zLiAgSXQgbWF5IGJlIG1vcmUgYnVnZ3ksIGFuZCBpdCBpcyBrbm93biB0byBiZQotcHJldHR5IHNsb3cgYXQgdGhpcyB0aW1lLiAgSWYgeW91IHdvdWxkIGxpa2UgdG8gaGVscCBmaXggdGhlc2UgaXNzdWVzLAotam9pbiB0aGUgUHJvdG9jb2wgQnVmZmVycyBkaXNjdXNzaW9uIGxpc3QgYW5kIGxldCB1cyBrbm93IQotCi1JbnN0YWxsYXRpb24KLT09PT09PT09PT09PQotCi0xKSBNYWtlIHN1cmUgeW91IGhhdmUgUHl0aG9uIDIuNiBvciBuZXdlci4gIElmIGluIGRvdWJ0LCBydW46Ci0KLSAgICAgJCBweXRob24gLVYKLQotMikgSWYgeW91IGRvIG5vdCBoYXZlIHNldHVwdG9vbHMgaW5zdGFsbGVkLCBub3RlIHRoYXQgaXQgd2lsbCBiZQotICAgZG93bmxvYWRlZCBhbmQgaW5zdGFsbGVkIGF1dG9tYXRpY2FsbHkgYXMgc29vbiBhcyB5b3UgcnVuIHNldHVwLnB5LgotICAgSWYgeW91IHdvdWxkIHJhdGhlciBpbnN0YWxsIGl0IG1hbnVhbGx5LCB5b3UgbWF5IGRvIHNvIGJ5IGZvbGxvd2luZwotICAgdGhlIGluc3RydWN0aW9ucyBvbiB0aGlzIHBhZ2U6Ci0KLSAgICAgaHR0cHM6Ly9wYWNrYWdpbmcucHl0aG9uLm9yZy9lbi9sYXRlc3QvaW5zdGFsbGluZy5odG1sI3NldHVwLWZvci1pbnN0YWxsaW5nLXBhY2thZ2VzCi0KLTMpIEJ1aWxkIHRoZSBDKysgY29kZSwgb3IgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24gb2YgcHJvdG9jLiAgSWYKLSAgIHlvdSBpbnN0YWxsIGEgYmluYXJ5IGRpc3RyaWJ1dGlvbiwgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdGhlIHNhbWUKLSAgIHZlcnNpb24gYXMgdGhpcyBwYWNrYWdlLiAgSWYgaW4gZG91YnQsIHJ1bjoKLQotICAgICAkIHByb3RvYyAtLXZlcnNpb24KLQotNCkgQnVpbGQgYW5kIHJ1biB0aGUgdGVzdHM6Ci0KLSAgICAgJCBweXRob24gc2V0dXAucHkgYnVpbGQKLSAgICAgJCBweXRob24gc2V0dXAucHkgdGVzdAotCi0gICAgIFRvIGJ1aWxkLCB0ZXN0LCBhbmQgdXNlIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBtdXN0IGZpcnN0IGNvbXBpbGUKLSAgICAgbGlicHJvdG9idWYuc286Ci0KLSAgICAgJCAoY2QgLi4gJiYgbWFrZSkKLQotICAgICBPbiBPUyBYOgotCi0gICAgICBJZiB5b3UgYXJlIHJ1bm5pbmcgYSBob21lYnJldy1wcm92aWRlZCBweXRob24sIHlvdSBtdXN0IG1ha2Ugc3VyZSBhbm90aGVyCi0gICAgICB2ZXJzaW9uIG9mIHByb3RvYnVmIGlzIG5vdCBhbHJlYWR5IGluc3RhbGxlZCwgYXMgaG9tZWJyZXcncyBweXRob24gd2lsbAotICAgICAgc2VhcmNoIC91c3IvbG9jYWwvbGliIGZvciBsaWJwcm90b2J1Zi5zbyBiZWZvcmUgaXQgc2VhcmNoZXMgLi4vc3JjLy5saWJzCi0gICAgICBZb3UgY2FuIGVpdGhlciB1bmxpbmsgaG9tZWJyZXcncyBwcm90b2J1ZiBvciBpbnN0YWxsIHRoZSBsaWJwcm90b2J1ZiB5b3UKLSAgICAgIGJ1aWx0IGVhcmxpZXI6Ci0KLSAgICAgICQgYnJldyB1bmxpbmsgcHJvdG9idWYKLSAgICAgIG9yCi0gICAgICAkIChjZCAuLiAmJiBtYWtlIGluc3RhbGwpCi0KLSAgICAgT24gb3RoZXIgKm5peDoKLQotICAgICAgWW91IG11c3QgbWFrZSBsaWJwcm90b2J1Zi5zbyBkeW5hbWljYWxseSBhdmFpbGFibGUuIFlvdSBjYW4gZWl0aGVyCi0gICAgICBpbnN0YWxsIGxpYnByb3RvYnVmIHlvdSBidWlsdCBlYXJsaWVyLCBvciBzZXQgTERfTElCUkFSWV9QQVRIOgotCi0gICAgICAkIGV4cG9ydCBMRF9MSUJSQVJZX1BBVEg9Li4vc3JjLy5saWJzCi0gICAgICBvcgotICAgICAgJCAoY2QgLi4gJiYgbWFrZSBpbnN0YWxsKQotCi0gICAgIFRvIGJ1aWxkIHRoZSBDKysgaW1wbGVtZW50YXRpb24gcnVuOgotICAgICAkIHB5dGhvbiBzZXR1cC5weSBidWlsZCAtLWNwcF9pbXBsZW1lbnRhdGlvbgotCi0gICAgIFRoZW4gcnVuIHRoZSB0ZXN0cyBsaWtlIHNvOgotICAgICAkIHB5dGhvbiBzZXR1cC5weSB0ZXN0IC0tY3BwX2ltcGxlbWVudGF0aW9uCi0KLSAgIElmIHNvbWUgdGVzdHMgZmFpbCwgdGhpcyBsaWJyYXJ5IG1heSBub3Qgd29yayBjb3JyZWN0bHkgb24geW91cgotICAgc3lzdGVtLiAgQ29udGludWUgYXQgeW91ciBvd24gcmlzay4KLQotICAgUGxlYXNlIG5vdGUgdGhhdCB0aGVyZSBpcyBhIGtub3duIHByb2JsZW0gd2l0aCBzb21lIHZlcnNpb25zIG9mCi0gICBQeXRob24gb24gQ3lnd2luIHdoaWNoIGNhdXNlcyB0aGUgdGVzdHMgdG8gZmFpbCBhZnRlciBwcmludGluZyB0aGUKLSAgIGVycm9yOiAgInNlbV9pbml0OiBSZXNvdXJjZSB0ZW1wb3JhcmlseSB1bmF2YWlsYWJsZSIuICBUaGlzIGFwcGVhcnMKLSAgIHRvIGJlIGEgYnVnIGVpdGhlciBpbiBDeWd3aW4gb3IgaW4gUHl0aG9uOgotICAgICBodHRwOi8vd3d3LmN5Z3dpbi5jb20vbWwvY3lnd2luLzIwMDUtMDcvbXNnMDEzNzguaHRtbAotICAgV2UgZG8gbm90IGtub3cgaWYgb3Igd2hlbiBpdCBtaWdodCBtZSBmaXhlZC4gIFdlIGFsc28gZG8gbm90IGtub3cKLSAgIGhvdyBsaWtlbHkgaXQgaXMgdGhhdCB0aGlzIGJ1ZyB3aWxsIGFmZmVjdCB1c2VycyBpbiBwcmFjdGljZS4KLQotNSkgSW5zdGFsbDoKLQotICAgICQgcHl0aG9uIHNldHVwLnB5IGluc3RhbGwKLQotICBvcjoKLQotICAgICQgKGNkIC4uICYmIG1ha2UgaW5zdGFsbCkKLSAgICAkIHB5dGhvbiBzZXR1cC5weSBpbnN0YWxsIC0tY3BwX2ltcGxlbWVudGF0aW9uCi0KLSAgIFRoaXMgc3RlcCBtYXkgcmVxdWlyZSBzdXBlcnVzZXIgcHJpdmlsZWdlcy4KLSAgIE5PVEU6IFRvIHVzZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvIGV4cG9ydCBhbiBlbnZpcm9ubWVudAotICAgdmFyaWFibGUgYmVmb3JlIHJ1bm5pbmcgeW91ciBwcm9ncmFtLiAgU2VlIHRoZSAiQysrIEltcGxlbWVudGF0aW9uIgotICAgc2VjdGlvbiBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLgotCi1Vc2FnZQotPT09PT0KLQotVGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gZm9yIFByb3RvY29sIEJ1ZmZlcnMgaXMgYXZhaWxhYmxlIHZpYSB0aGUKLXdlYiBhdDoKLQotICBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotCi1DKysgSW1wbGVtZW50YXRpb24KLT09PT09PT09PT09PT09PT09PQotCi1UaGUgQysrIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24gbWVzc2FnZXMgaXMgYnVpbHQgYXMgYSBQeXRob24gZXh0ZW5zaW9uIHRvCi1pbXByb3ZlIHRoZSBvdmVyYWxsIHByb3RvYnVmIFB5dGhvbiBwZXJmb3JtYW5jZS4KLQotVG8gdXNlIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvIGluc3RhbGwgdGhlIEMrKyBwcm90b2J1ZiBydW50aW1lCi1saWJyYXJ5LCBwbGVhc2Ugc2VlIGluc3RydWN0aW9ucyBpbiB0aGUgcGFyZW50IGRpcmVjdG9yeS4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvX19pbml0X18ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NTg1NjE0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvX19pbml0X18ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0ICswLDAgQEAKLXRyeToKLSAgX19pbXBvcnRfXygncGtnX3Jlc291cmNlcycpLmRlY2xhcmVfbmFtZXNwYWNlKF9fbmFtZV9fKQotZXhjZXB0IEltcG9ydEVycm9yOgotICBfX3BhdGhfXyA9IF9faW1wb3J0X18oJ3BrZ3V0aWwnKS5leHRlbmRfcGF0aChfX3BhdGhfXywgX19uYW1lX18pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmEzYzY3Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzkgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jIENvcHlyaWdodCAyMDA3IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0KLV9fdmVyc2lvbl9fID0gJzMuMC4wYjMnCi0KLWlmIF9fbmFtZV9fICE9ICdfX21haW5fXyc6Ci0gIHRyeToKLSAgICBfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pCi0gIGV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgICBfX3BhdGhfXyA9IF9faW1wb3J0X18oJ3BrZ3V0aWwnKS5leHRlbmRfcGF0aChfX3BhdGhfXywgX19uYW1lX18pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDMyMDliMzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnB5CisrKyAvZGV2L251bGwKQEAgLTEsOTcxICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiRGVzY3JpcHRvcnMgZXNzZW50aWFsbHkgY29udGFpbiBleGFjdGx5IHRoZSBpbmZvcm1hdGlvbiBmb3VuZCBpbiBhIC5wcm90bwotZmlsZSwgaW4gdHlwZXMgdGhhdCBtYWtlIHRoaXMgaW5mb3JtYXRpb24gYWNjZXNzaWJsZSBpbiBQeXRob24uCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotaW1wb3J0IHNpeAotCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCi0KLV9VU0VfQ19ERVNDUklQVE9SUyA9IEZhbHNlCi1pZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgotICAjIFVzZWQgYnkgTWFrZURlc2NyaXB0b3IgaW4gY3BwIG1vZGUKLSAgaW1wb3J0IG9zCi0gIGltcG9ydCB1dWlkCi0gIGZyb20gZ29vZ2xlLnByb3RvYnVmLnB5ZXh0IGltcG9ydCBfbWVzc2FnZQotICBfVVNFX0NfREVTQ1JJUFRPUlMgPSBnZXRhdHRyKF9tZXNzYWdlLCAnX1VTRV9DX0RFU0NSSVBUT1JTJywgRmFsc2UpCi0KLQotY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKLSAgIiIiQmFzZSBlcnJvciBmb3IgdGhpcyBtb2R1bGUuIiIiCi0KLQotY2xhc3MgVHlwZVRyYW5zZm9ybWF0aW9uRXJyb3IoRXJyb3IpOgotICAiIiJFcnJvciB0cmFuc2Zvcm1pbmcgYmV0d2VlbiBweXRob24gcHJvdG8gdHlwZSBhbmQgY29ycmVzcG9uZGluZyBDKysgdHlwZS4iIiIKLQotCi1pZiBfVVNFX0NfREVTQ1JJUFRPUlM6Ci0gICMgVGhpcyBtZXRhY2xhc3MgYWxsb3dzIHRvIG92ZXJyaWRlIHRoZSBiZWhhdmlvciBvZiBjb2RlIGxpa2UKLSAgIyAgICAgaXNpbnN0YW5jZShteV9kZXNjcmlwdG9yLCBGaWVsZERlc2NyaXB0b3IpCi0gICMgYW5kIG1ha2UgaXQgcmV0dXJuIFRydWUgd2hlbiB0aGUgZGVzY3JpcHRvciBpcyBhbiBpbnN0YW5jZSBvZiB0aGUgZXh0ZW5zaW9uCi0gICMgdHlwZSB3cml0dGVuIGluIEMrKy4KLSAgY2xhc3MgRGVzY3JpcHRvck1ldGFjbGFzcyh0eXBlKToKLSAgICBkZWYgX19pbnN0YW5jZWNoZWNrX18oY2xzLCBvYmopOgotICAgICAgaWYgc3VwZXIoRGVzY3JpcHRvck1ldGFjbGFzcywgY2xzKS5fX2luc3RhbmNlY2hlY2tfXyhvYmopOgotICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgaWYgaXNpbnN0YW5jZShvYmosIGNscy5fQ19ERVNDUklQVE9SX0NMQVNTKToKLSAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgIHJldHVybiBGYWxzZQotZWxzZToKLSAgIyBUaGUgc3RhbmRhcmQgbWV0YWNsYXNzOyBub3RoaW5nIGNoYW5nZXMuCi0gIERlc2NyaXB0b3JNZXRhY2xhc3MgPSB0eXBlCi0KLQotY2xhc3MgRGVzY3JpcHRvckJhc2Uoc2l4LndpdGhfbWV0YWNsYXNzKERlc2NyaXB0b3JNZXRhY2xhc3MpKToKLQotICAiIiJEZXNjcmlwdG9ycyBiYXNlIGNsYXNzLgotCi0gIFRoaXMgY2xhc3MgaXMgdGhlIGJhc2Ugb2YgYWxsIGRlc2NyaXB0b3IgY2xhc3Nlcy4gSXQgcHJvdmlkZXMgY29tbW9uIG9wdGlvbnMKLSAgcmVsYXRlZCBmdW5jdGlvbmFsaXR5LgotCi0gIEF0dHJpYnV0ZXM6Ci0gICAgaGFzX29wdGlvbnM6ICBUcnVlIGlmIHRoZSBkZXNjcmlwdG9yIGhhcyBub24tZGVmYXVsdCBvcHRpb25zLiAgVXN1YWxseSBpdAotICAgICAgICBpcyBub3QgbmVjZXNzYXJ5IHRvIHJlYWQgdGhpcyAtLSBqdXN0IGNhbGwgR2V0T3B0aW9ucygpIHdoaWNoIHdpbGwKLSAgICAgICAgaGFwcGlseSByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2UuICBIb3dldmVyLCBpdCdzIHNvbWV0aW1lcyB1c2VmdWwKLSAgICAgICAgZm9yIGVmZmljaWVuY3ksIGFuZCBhbHNvIHVzZWZ1bCBpbnNpZGUgdGhlIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIHRvCi0gICAgICAgIGF2b2lkIHNvbWUgYm9vdHN0cmFwcGluZyBpc3N1ZXMuCi0gICIiIgotCi0gIGlmIF9VU0VfQ19ERVNDUklQVE9SUzoKLSAgICAjIFRoZSBjbGFzcywgb3IgdHVwbGUgb2YgY2xhc3NlcywgdGhhdCBhcmUgY29uc2lkZXJlZCBhcyAidmlydHVhbAotICAgICMgc3ViY2xhc3NlcyIgb2YgdGhpcyBkZXNjcmlwdG9yIGNsYXNzLgotICAgIF9DX0RFU0NSSVBUT1JfQ0xBU1MgPSAoKQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUpOgotICAgICIiIkluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgZ2l2ZW4gaXRzIG9wdGlvbnMgbWVzc2FnZSBhbmQgdGhlIG5hbWUgb2YgdGhlCi0gICAgY2xhc3Mgb2YgdGhlIG9wdGlvbnMgbWVzc2FnZS4gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIHJlcXVpcmVkIGluIGNhc2UKLSAgICB0aGUgb3B0aW9ucyBtZXNzYWdlIGlzIE5vbmUgYW5kIGhhcyB0byBiZSBjcmVhdGVkLgotICAgICIiIgotICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCi0gICAgc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lID0gb3B0aW9uc19jbGFzc19uYW1lCi0KLSAgICAjIERvZXMgdGhpcyBkZXNjcmlwdG9yIGhhdmUgbm9uLWRlZmF1bHQgb3B0aW9ucz8KLSAgICBzZWxmLmhhc19vcHRpb25zID0gb3B0aW9ucyBpcyBub3QgTm9uZQotCi0gIGRlZiBfU2V0T3B0aW9ucyhzZWxmLCBvcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUpOgotICAgICIiIlNldHMgdGhlIGRlc2NyaXB0b3IncyBvcHRpb25zCi0KLSAgICBUaGlzIGZ1bmN0aW9uIGlzIHVzZWQgaW4gZ2VuZXJhdGVkIHByb3RvMiBmaWxlcyB0byB1cGRhdGUgZGVzY3JpcHRvcgotICAgIG9wdGlvbnMuIEl0IG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBwcm90bzIuCi0gICAgIiIiCi0gICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnMKLSAgICBzZWxmLl9vcHRpb25zX2NsYXNzX25hbWUgPSBvcHRpb25zX2NsYXNzX25hbWUKLQotICAgICMgRG9lcyB0aGlzIGRlc2NyaXB0b3IgaGF2ZSBub24tZGVmYXVsdCBvcHRpb25zPwotICAgIHNlbGYuaGFzX29wdGlvbnMgPSBvcHRpb25zIGlzIG5vdCBOb25lCi0KLSAgZGVmIEdldE9wdGlvbnMoc2VsZik6Ci0gICAgIiIiUmV0cmlldmVzIGRlc2NyaXB0b3Igb3B0aW9ucy4KLQotICAgIFRoaXMgbWV0aG9kIHJldHVybnMgdGhlIG9wdGlvbnMgc2V0IG9yIGNyZWF0ZXMgdGhlIGRlZmF1bHQgb3B0aW9ucyBmb3IgdGhlCi0gICAgZGVzY3JpcHRvci4KLSAgICAiIiIKLSAgICBpZiBzZWxmLl9vcHRpb25zOgotICAgICAgcmV0dXJuIHNlbGYuX29wdGlvbnMKLSAgICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjIKLSAgICB0cnk6Ci0gICAgICBvcHRpb25zX2NsYXNzID0gZ2V0YXR0cihkZXNjcmlwdG9yX3BiMiwgc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lKQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignVW5rbm93biBvcHRpb25zIGNsYXNzIG5hbWUgJXMhJyAlCi0gICAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYuX29wdGlvbnNfY2xhc3NfbmFtZSkpCi0gICAgc2VsZi5fb3B0aW9ucyA9IG9wdGlvbnNfY2xhc3MoKQotICAgIHJldHVybiBzZWxmLl9vcHRpb25zCi0KLQotY2xhc3MgX05lc3RlZERlc2NyaXB0b3JCYXNlKERlc2NyaXB0b3JCYXNlKToKLSAgIiIiQ29tbW9uIGNsYXNzIGZvciBkZXNjcmlwdG9ycyB0aGF0IGNhbiBiZSBuZXN0ZWQuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG9wdGlvbnMsIG9wdGlvbnNfY2xhc3NfbmFtZSwgbmFtZSwgZnVsbF9uYW1lLAotICAgICAgICAgICAgICAgZmlsZSwgY29udGFpbmluZ190eXBlLCBzZXJpYWxpemVkX3N0YXJ0PU5vbmUsCi0gICAgICAgICAgICAgICBzZXJpYWxpemVkX2VuZD1Ob25lKToKLSAgICAiIiJDb25zdHJ1Y3Rvci4KLQotICAgIEFyZ3M6Ci0gICAgICBvcHRpb25zOiBQcm90b2NvbCBtZXNzYWdlIG9wdGlvbnMgb3IgTm9uZQotICAgICAgICB0byB1c2UgZGVmYXVsdCBtZXNzYWdlIG9wdGlvbnMuCi0gICAgICBvcHRpb25zX2NsYXNzX25hbWU6IChzdHIpIFRoZSBjbGFzcyBuYW1lIG9mIHRoZSBhYm92ZSBvcHRpb25zLgotCi0gICAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLgotICAgICAgZnVsbF9uYW1lOiAoc3RyKSBGdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZSwKLSAgICAgICAgd2hpY2ggd2lsbCBpbmNsdWRlIHByb3RvY29sICJwYWNrYWdlIiBuYW1lIGFuZCB0aGUgbmFtZSBvZiBhbnkKLSAgICAgICAgZW5jbG9zaW5nIHR5cGVzLgotICAgICAgZmlsZTogKEZpbGVEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gZmlsZSBpbmZvLgotICAgICAgY29udGFpbmluZ190eXBlOiBpZiBwcm92aWRlZCwgdGhpcyBpcyBhIG5lc3RlZCBkZXNjcmlwdG9yLCB3aXRoIHRoaXMKLSAgICAgICAgZGVzY3JpcHRvciBhcyBwYXJlbnQsIG90aGVyd2lzZSBOb25lLgotICAgICAgc2VyaWFsaXplZF9zdGFydDogVGhlIHN0YXJ0IGluZGV4IChpbmNsdXNpdmUpIGluIGJsb2NrIGluIHRoZQotICAgICAgICBmaWxlLnNlcmlhbGl6ZWRfcGIgdGhhdCBkZXNjcmliZXMgdGhpcyBkZXNjcmlwdG9yLgotICAgICAgc2VyaWFsaXplZF9lbmQ6IFRoZSBlbmQgaW5kZXggKGV4Y2x1c2l2ZSkgaW4gYmxvY2sgaW4gdGhlCi0gICAgICAgIGZpbGUuc2VyaWFsaXplZF9wYiB0aGF0IGRlc2NyaWJlcyB0aGlzIGRlc2NyaXB0b3IuCi0gICAgIiIiCi0gICAgc3VwZXIoX05lc3RlZERlc2NyaXB0b3JCYXNlLCBzZWxmKS5fX2luaXRfXygKLSAgICAgICAgb3B0aW9ucywgb3B0aW9uc19jbGFzc19uYW1lKQotCi0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgICMgVE9ETyhmYWxrKTogQWRkIGZ1bmN0aW9uIHRvIGNhbGN1bGF0ZSBmdWxsX25hbWUgaW5zdGVhZCBvZiBoYXZpbmcgaXQgaW4KLSAgICAjICAgICAgICAgICAgIG1lbW9yeT8KLSAgICBzZWxmLmZ1bGxfbmFtZSA9IGZ1bGxfbmFtZQotICAgIHNlbGYuZmlsZSA9IGZpbGUKLSAgICBzZWxmLmNvbnRhaW5pbmdfdHlwZSA9IGNvbnRhaW5pbmdfdHlwZQotCi0gICAgc2VsZi5fc2VyaWFsaXplZF9zdGFydCA9IHNlcmlhbGl6ZWRfc3RhcnQKLSAgICBzZWxmLl9zZXJpYWxpemVkX2VuZCA9IHNlcmlhbGl6ZWRfZW5kCi0KLSAgZGVmIEdldFRvcExldmVsQ29udGFpbmluZ1R5cGUoc2VsZik6Ci0gICAgIiIiUmV0dXJucyB0aGUgcm9vdCBpZiB0aGlzIGlzIGEgbmVzdGVkIHR5cGUsIG9yIGl0c2VsZiBpZiBpdHMgdGhlIHJvb3QuIiIiCi0gICAgZGVzYyA9IHNlbGYKLSAgICB3aGlsZSBkZXNjLmNvbnRhaW5pbmdfdHlwZSBpcyBub3QgTm9uZToKLSAgICAgIGRlc2MgPSBkZXNjLmNvbnRhaW5pbmdfdHlwZQotICAgIHJldHVybiBkZXNjCi0KLSAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKLSAgICAiIiJDb3BpZXMgdGhpcyB0byB0aGUgbWF0Y2hpbmcgcHJvdG8gaW4gZGVzY3JpcHRvcl9wYjIuCi0KLSAgICBBcmdzOgotICAgICAgcHJvdG86IEFuIGVtcHR5IHByb3RvIGluc3RhbmNlIGZyb20gZGVzY3JpcHRvcl9wYjIuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBFcnJvcjogSWYgc2VsZiBjb3VsZG50IGJlIHNlcmlhbGl6ZWQsIGR1ZSB0byB0byBmZXcgY29uc3RydWN0b3IgYXJndW1lbnRzLgotICAgICIiIgotICAgIGlmIChzZWxmLmZpbGUgaXMgbm90IE5vbmUgYW5kCi0gICAgICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQgaXMgbm90IE5vbmUgYW5kCi0gICAgICAgIHNlbGYuX3NlcmlhbGl6ZWRfZW5kIGlzIG5vdCBOb25lKToKLSAgICAgIHByb3RvLlBhcnNlRnJvbVN0cmluZyhzZWxmLmZpbGUuc2VyaWFsaXplZF9wYlsKLSAgICAgICAgICBzZWxmLl9zZXJpYWxpemVkX3N0YXJ0OnNlbGYuX3NlcmlhbGl6ZWRfZW5kXSkKLSAgICBlbHNlOgotICAgICAgcmFpc2UgRXJyb3IoJ0Rlc2NyaXB0b3IgZG9lcyBub3QgY29udGFpbiBzZXJpYWxpemF0aW9uLicpCi0KLQotY2xhc3MgRGVzY3JpcHRvcihfTmVzdGVkRGVzY3JpcHRvckJhc2UpOgotCi0gICIiIkRlc2NyaXB0b3IgZm9yIGEgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLgotCi0gIEEgRGVzY3JpcHRvciBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCi0gICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZS4KLSAgICBmdWxsX25hbWU6IChzdHIpIEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLAotICAgICAgd2hpY2ggd2lsbCBpbmNsdWRlIHByb3RvY29sICJwYWNrYWdlIiBuYW1lIGFuZCB0aGUgbmFtZSBvZiBhbnkKLSAgICAgIGVuY2xvc2luZyB0eXBlcy4KLQotICAgIGNvbnRhaW5pbmdfdHlwZTogKERlc2NyaXB0b3IpIFJlZmVyZW5jZSB0byB0aGUgZGVzY3JpcHRvciBvZiB0aGUKLSAgICAgIHR5cGUgY29udGFpbmluZyB1cywgb3IgTm9uZSBpZiB0aGlzIGlzIHRvcC1sZXZlbC4KLQotICAgIGZpZWxkczogKGxpc3Qgb2YgRmllbGREZXNjcmlwdG9ycykgRmllbGQgZGVzY3JpcHRvcnMgZm9yIGFsbAotICAgICAgZmllbGRzIGluIHRoaXMgdHlwZS4KLSAgICBmaWVsZHNfYnlfbnVtYmVyOiAoZGljdCBpbnQgLT4gRmllbGREZXNjcmlwdG9yKSBTYW1lIEZpZWxkRGVzY3JpcHRvcgotICAgICAgb2JqZWN0cyBhcyBpbiB8ZmllbGRzfCwgYnV0IGluZGV4ZWQgYnkgIm51bWJlciIgYXR0cmlidXRlIGluIGVhY2gKLSAgICAgIEZpZWxkRGVzY3JpcHRvci4KLSAgICBmaWVsZHNfYnlfbmFtZTogKGRpY3Qgc3RyIC0+IEZpZWxkRGVzY3JpcHRvcikgU2FtZSBGaWVsZERlc2NyaXB0b3IKLSAgICAgIG9iamVjdHMgYXMgaW4gfGZpZWxkc3wsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUgaW4gZWFjaAotICAgICAgRmllbGREZXNjcmlwdG9yLgotICAgIGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZTogKGRpY3Qgc3RyIC0+IEZpZWxkRGVzY3JpcHRvcikgU2FtZQotICAgICAgRmllbGREZXNjcmlwdG9yIG9iamVjdHMgYXMgaW4gfGZpZWxkc3wsIGJ1dCBpbmRleGVkIGJ5Ci0gICAgICAiY2FtZWxjYXNlX25hbWUiIGF0dHJpYnV0ZSBpbiBlYWNoIEZpZWxkRGVzY3JpcHRvci4KLQotICAgIG5lc3RlZF90eXBlczogKGxpc3Qgb2YgRGVzY3JpcHRvcnMpIERlc2NyaXB0b3IgcmVmZXJlbmNlcwotICAgICAgZm9yIGFsbCBwcm90b2NvbCBtZXNzYWdlIHR5cGVzIG5lc3RlZCB3aXRoaW4gdGhpcyBvbmUuCi0gICAgbmVzdGVkX3R5cGVzX2J5X25hbWU6IChkaWN0IHN0ciAtPiBEZXNjcmlwdG9yKSBTYW1lIERlc2NyaXB0b3IKLSAgICAgIG9iamVjdHMgYXMgaW4gfG5lc3RlZF90eXBlc3wsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUKLSAgICAgIGluIGVhY2ggRGVzY3JpcHRvci4KLQotICAgIGVudW1fdHlwZXM6IChsaXN0IG9mIEVudW1EZXNjcmlwdG9ycykgRW51bURlc2NyaXB0b3IgcmVmZXJlbmNlcwotICAgICAgZm9yIGFsbCBlbnVtcyBjb250YWluZWQgd2l0aGluIHRoaXMgdHlwZS4KLSAgICBlbnVtX3R5cGVzX2J5X25hbWU6IChkaWN0IHN0ciAtPkVudW1EZXNjcmlwdG9yKSBTYW1lIEVudW1EZXNjcmlwdG9yCi0gICAgICBvYmplY3RzIGFzIGluIHxlbnVtX3R5cGVzfCwgYnV0IGluZGV4ZWQgYnkgIm5hbWUiIGF0dHJpYnV0ZQotICAgICAgaW4gZWFjaCBFbnVtRGVzY3JpcHRvci4KLSAgICBlbnVtX3ZhbHVlc19ieV9uYW1lOiAoZGljdCBzdHIgLT4gRW51bVZhbHVlRGVzY3JpcHRvcikgRGljdCBtYXBwaW5nCi0gICAgICBmcm9tIGVudW0gdmFsdWUgbmFtZSB0byBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciB0aGF0IHZhbHVlLgotCi0gICAgZXh0ZW5zaW9uczogKGxpc3Qgb2YgRmllbGREZXNjcmlwdG9yKSBBbGwgZXh0ZW5zaW9ucyBkZWZpbmVkIGRpcmVjdGx5Ci0gICAgICB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUgKE5PVCB3aXRoaW4gYSBuZXN0ZWQgdHlwZSkuCi0gICAgZXh0ZW5zaW9uc19ieV9uYW1lOiAoZGljdCwgc3RyaW5nIC0+IEZpZWxkRGVzY3JpcHRvcikgU2FtZSBGaWVsZERlc2NyaXB0b3IKLSAgICAgIG9iamVjdHMgYXMgfGV4dGVuc2lvbnN8LCBidXQgaW5kZXhlZCBieSAibmFtZSIgYXR0cmlidXRlIG9mIGVhY2gKLSAgICAgIEZpZWxkRGVzY3JpcHRvci4KLQotICAgIGlzX2V4dGVuZGFibGU6ICBEb2VzIHRoaXMgdHlwZSBkZWZpbmUgYW55IGV4dGVuc2lvbiByYW5nZXM/Ci0KLSAgICBvbmVvZnM6IChsaXN0IG9mIE9uZW9mRGVzY3JpcHRvcikgVGhlIGxpc3Qgb2YgZGVzY3JpcHRvcnMgZm9yIG9uZW9mIGZpZWxkcwotICAgICAgaW4gdGhpcyBtZXNzYWdlLgotICAgIG9uZW9mc19ieV9uYW1lOiAoZGljdCBzdHIgLT4gT25lb2ZEZXNjcmlwdG9yKSBTYW1lIG9iamVjdHMgYXMgaW4gfG9uZW9mc3wsCi0gICAgICBidXQgaW5kZXhlZCBieSAibmFtZSIgYXR0cmlidXRlLgotCi0gICAgZmlsZTogKEZpbGVEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gZmlsZSBkZXNjcmlwdG9yLgotICAiIiIKLQotICBpZiBfVVNFX0NfREVTQ1JJUFRPUlM6Ci0gICAgX0NfREVTQ1JJUFRPUl9DTEFTUyA9IF9tZXNzYWdlLkRlc2NyaXB0b3IKLQotICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlbmFtZSwgY29udGFpbmluZ190eXBlLCBmaWVsZHMsCi0gICAgICAgICAgICAgICAgbmVzdGVkX3R5cGVzLCBlbnVtX3R5cGVzLCBleHRlbnNpb25zLCBvcHRpb25zPU5vbmUsCi0gICAgICAgICAgICAgICAgaXNfZXh0ZW5kYWJsZT1UcnVlLCBleHRlbnNpb25fcmFuZ2VzPU5vbmUsIG9uZW9mcz1Ob25lLAotICAgICAgICAgICAgICAgIGZpbGU9Tm9uZSwgc2VyaWFsaXplZF9zdGFydD1Ob25lLCBzZXJpYWxpemVkX2VuZD1Ob25lLAotICAgICAgICAgICAgICAgIHN5bnRheD1Ob25lKToKLSAgICAgIF9tZXNzYWdlLk1lc3NhZ2UuX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoKQotICAgICAgcmV0dXJuIF9tZXNzYWdlLmRlZmF1bHRfcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoZnVsbF9uYW1lKQotCi0gICMgTk9URSh0bWFyZWspOiBUaGUgZmlsZSBhcmd1bWVudCByZWRlZmluaW5nIGEgYnVpbHRpbiBpcyBub3RoaW5nIHdlIGNhbgotICAjIGZpeCByaWdodCBub3cgc2luY2Ugd2UgZG9uJ3Qga25vdyBob3cgbWFueSBjbGllbnRzIGFscmVhZHkgcmVseSBvbiB0aGUKLSAgIyBuYW1lIG9mIHRoZSBhcmd1bWVudC4KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgZmlsZW5hbWUsIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRzLAotICAgICAgICAgICAgICAgbmVzdGVkX3R5cGVzLCBlbnVtX3R5cGVzLCBleHRlbnNpb25zLCBvcHRpb25zPU5vbmUsCi0gICAgICAgICAgICAgICBpc19leHRlbmRhYmxlPVRydWUsIGV4dGVuc2lvbl9yYW5nZXM9Tm9uZSwgb25lb2ZzPU5vbmUsCi0gICAgICAgICAgICAgICBmaWxlPU5vbmUsIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwgc2VyaWFsaXplZF9lbmQ9Tm9uZSwKLSAgICAgICAgICAgICAgIHN5bnRheD1Ob25lKTogICMgcHlsaW50OmRpc2FibGU9cmVkZWZpbmVkLWJ1aWx0aW4KLSAgICAiIiJBcmd1bWVudHMgdG8gX19pbml0X18oKSBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbgotICAgIG9mIERlc2NyaXB0b3IgZmllbGRzIGFib3ZlLgotCi0gICAgTm90ZSB0aGF0IGZpbGVuYW1lIGlzIGFuIG9ic29sZXRlIGFyZ3VtZW50LCB0aGF0IGlzIG5vdCB1c2VkIGFueW1vcmUuCi0gICAgUGxlYXNlIHVzZSBmaWxlLm5hbWUgdG8gYWNjZXNzIHRoaXMgYXMgYW4gYXR0cmlidXRlLgotICAgICIiIgotICAgIHN1cGVyKERlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKAotICAgICAgICBvcHRpb25zLCAnTWVzc2FnZU9wdGlvbnMnLCBuYW1lLCBmdWxsX25hbWUsIGZpbGUsCi0gICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgc2VyaWFsaXplZF9zdGFydD1zZXJpYWxpemVkX3N0YXJ0LAotICAgICAgICBzZXJpYWxpemVkX2VuZD1zZXJpYWxpemVkX2VuZCkKLQotICAgICMgV2UgaGF2ZSBmaWVsZHMgaW4gYWRkaXRpb24gdG8gZmllbGRzX2J5X25hbWUgYW5kIGZpZWxkc19ieV9udW1iZXIsCi0gICAgIyBzbyB0aGF0OgotICAgICMgICAxLiBDbGllbnRzIGNhbiBpbmRleCBmaWVsZHMgYnkgIm9yZGVyIGluIHdoaWNoIHRoZXkncmUgbGlzdGVkLiIKLSAgICAjICAgMi4gQ2xpZW50cyBjYW4gZWFzaWx5IGl0ZXJhdGUgb3ZlciBhbGwgZmllbGRzIHdpdGggdGhlIHRlcnNlCi0gICAgIyAgICAgIHN5bnRheDogZm9yIGYgaW4gZGVzY3JpcHRvci5maWVsZHM6IC4uLgotICAgIHNlbGYuZmllbGRzID0gZmllbGRzCi0gICAgZm9yIGZpZWxkIGluIHNlbGYuZmllbGRzOgotICAgICAgZmllbGQuY29udGFpbmluZ190eXBlID0gc2VsZgotICAgIHNlbGYuZmllbGRzX2J5X251bWJlciA9IGRpY3QoKGYubnVtYmVyLCBmKSBmb3IgZiBpbiBmaWVsZHMpCi0gICAgc2VsZi5maWVsZHNfYnlfbmFtZSA9IGRpY3QoKGYubmFtZSwgZikgZm9yIGYgaW4gZmllbGRzKQotICAgIHNlbGYuX2ZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZSA9IE5vbmUKLQotICAgIHNlbGYubmVzdGVkX3R5cGVzID0gbmVzdGVkX3R5cGVzCi0gICAgZm9yIG5lc3RlZF90eXBlIGluIG5lc3RlZF90eXBlczoKLSAgICAgIG5lc3RlZF90eXBlLmNvbnRhaW5pbmdfdHlwZSA9IHNlbGYKLSAgICBzZWxmLm5lc3RlZF90eXBlc19ieV9uYW1lID0gZGljdCgodC5uYW1lLCB0KSBmb3IgdCBpbiBuZXN0ZWRfdHlwZXMpCi0KLSAgICBzZWxmLmVudW1fdHlwZXMgPSBlbnVtX3R5cGVzCi0gICAgZm9yIGVudW1fdHlwZSBpbiBzZWxmLmVudW1fdHlwZXM6Ci0gICAgICBlbnVtX3R5cGUuY29udGFpbmluZ190eXBlID0gc2VsZgotICAgIHNlbGYuZW51bV90eXBlc19ieV9uYW1lID0gZGljdCgodC5uYW1lLCB0KSBmb3IgdCBpbiBlbnVtX3R5cGVzKQotICAgIHNlbGYuZW51bV92YWx1ZXNfYnlfbmFtZSA9IGRpY3QoCi0gICAgICAgICh2Lm5hbWUsIHYpIGZvciB0IGluIGVudW1fdHlwZXMgZm9yIHYgaW4gdC52YWx1ZXMpCi0KLSAgICBzZWxmLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zCi0gICAgZm9yIGV4dGVuc2lvbiBpbiBzZWxmLmV4dGVuc2lvbnM6Ci0gICAgICBleHRlbnNpb24uZXh0ZW5zaW9uX3Njb3BlID0gc2VsZgotICAgIHNlbGYuZXh0ZW5zaW9uc19ieV9uYW1lID0gZGljdCgoZi5uYW1lLCBmKSBmb3IgZiBpbiBleHRlbnNpb25zKQotICAgIHNlbGYuaXNfZXh0ZW5kYWJsZSA9IGlzX2V4dGVuZGFibGUKLSAgICBzZWxmLmV4dGVuc2lvbl9yYW5nZXMgPSBleHRlbnNpb25fcmFuZ2VzCi0gICAgc2VsZi5vbmVvZnMgPSBvbmVvZnMgaWYgb25lb2ZzIGlzIG5vdCBOb25lIGVsc2UgW10KLSAgICBzZWxmLm9uZW9mc19ieV9uYW1lID0gZGljdCgoby5uYW1lLCBvKSBmb3IgbyBpbiBzZWxmLm9uZW9mcykKLSAgICBmb3Igb25lb2YgaW4gc2VsZi5vbmVvZnM6Ci0gICAgICBvbmVvZi5jb250YWluaW5nX3R5cGUgPSBzZWxmCi0gICAgc2VsZi5zeW50YXggPSBzeW50YXggb3IgInByb3RvMiIKLQotICBAcHJvcGVydHkKLSAgZGVmIGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZShzZWxmKToKLSAgICBpZiBzZWxmLl9maWVsZHNfYnlfY2FtZWxjYXNlX25hbWUgaXMgTm9uZToKLSAgICAgIHNlbGYuX2ZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZSA9IGRpY3QoCi0gICAgICAgICAgKGYuY2FtZWxjYXNlX25hbWUsIGYpIGZvciBmIGluIHNlbGYuZmllbGRzKQotICAgIHJldHVybiBzZWxmLl9maWVsZHNfYnlfY2FtZWxjYXNlX25hbWUKLQotICBkZWYgRW51bVZhbHVlTmFtZShzZWxmLCBlbnVtLCB2YWx1ZSk6Ci0gICAgIiIiUmV0dXJucyB0aGUgc3RyaW5nIG5hbWUgb2YgYW4gZW51bSB2YWx1ZS4KLQotICAgIFRoaXMgaXMganVzdCBhIHNtYWxsIGhlbHBlciBtZXRob2QgdG8gc2ltcGxpZnkgYSBjb21tb24gb3BlcmF0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIGVudW06IHN0cmluZyBuYW1lIG9mIHRoZSBFbnVtLgotICAgICAgdmFsdWU6IGludCwgdmFsdWUgb2YgdGhlIGVudW0uCi0KLSAgICBSZXR1cm5zOgotICAgICAgc3RyaW5nIG5hbWUgb2YgdGhlIGVudW0gdmFsdWUuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBLZXlFcnJvciBpZiBlaXRoZXIgdGhlIEVudW0gZG9lc24ndCBleGlzdCBvciB0aGUgdmFsdWUgaXMgbm90IGEgdmFsaWQKLSAgICAgICAgdmFsdWUgZm9yIHRoZSBlbnVtLgotICAgICIiIgotICAgIHJldHVybiBzZWxmLmVudW1fdHlwZXNfYnlfbmFtZVtlbnVtXS52YWx1ZXNfYnlfbnVtYmVyW3ZhbHVlXS5uYW1lCi0KLSAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKLSAgICAiIiJDb3BpZXMgdGhpcyB0byBhIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90by4KLQotICAgIEFyZ3M6Ci0gICAgICBwcm90bzogQW4gZW1wdHkgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLgotICAgICIiIgotICAgICMgVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZW4gdG8gZ2l2ZSBhIGJldHRlciBkb2MgY29tbWVudC4KLSAgICBzdXBlcihEZXNjcmlwdG9yLCBzZWxmKS5Db3B5VG9Qcm90byhwcm90bykKLQotCi0jIFRPRE8ocm9iaW5zb24pOiBXZSBzaG91bGQgaGF2ZSBhZ2dyZXNzaXZlIGNoZWNraW5nIGhlcmUsCi0jIGZvciBleGFtcGxlOgotIyAgICogSWYgeW91IHNwZWNpZnkgYSByZXBlYXRlZCBmaWVsZCwgeW91IHNob3VsZCBub3QgYmUgYWxsb3dlZAotIyAgICAgdG8gc3BlY2lmeSBhIGRlZmF1bHQgdmFsdWUuCi0jICAgKiBbT3RoZXIgZXhhbXBsZXMgaGVyZSBhcyBuZWVkZWRdLgotIwotIyBUT0RPKHJvYmluc29uKTogZm9yIHRoaXMgYW5kIG90aGVyICpEZXNjcmlwdG9yIGNsYXNzZXMsIHdlCi0jIG1pZ2h0IGFsc28gd2FudCB0byBsb2NrIHRoaW5ncyBkb3duIGFnZ3Jlc3NpdmVseSAoZS5nLiwKLSMgcHJldmVudCBjbGllbnRzIGZyb20gc2V0dGluZyB0aGUgYXR0cmlidXRlcykuICBIYXZpbmcKLSMgc3Ryb25nZXIgaW52YXJpYW50cyBoZXJlIGluIGdlbmVyYWwgd2lsbCByZWR1Y2UgdGhlIG51bWJlcgotIyBvZiBydW50aW1lIGNoZWNrcyB3ZSBtdXN0IGRvIGluIHJlZmxlY3Rpb24ucHkuLi4KLWNsYXNzIEZpZWxkRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6Ci0KLSAgIiIiRGVzY3JpcHRvciBmb3IgYSBzaW5nbGUgZmllbGQgaW4gYSAucHJvdG8gZmlsZS4KLQotICBBIEZpZWxkRGVzY3JpcHRvciBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCi0gICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIGZpZWxkLCBleGFjdGx5IGFzIGl0IGFwcGVhcnMgaW4gLnByb3RvLgotICAgIGZ1bGxfbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIGZpZWxkLCBpbmNsdWRpbmcgY29udGFpbmluZyBzY29wZS4gIFRoaXMgaXMKLSAgICAgIHBhcnRpY3VsYXJseSByZWxldmFudCBmb3IgZXh0ZW5zaW9ucy4KLSAgICBjYW1lbGNhc2VfbmFtZTogKHN0cikgQ2FtZWxjYXNlIG5hbWUgb2YgdGhpcyBmaWVsZC4KLSAgICBpbmRleDogKGludCkgRGVuc2UsIDAtaW5kZXhlZCBpbmRleCBnaXZpbmcgdGhlIG9yZGVyIHRoYXQgdGhpcwotICAgICAgZmllbGQgdGV4dHVhbGx5IGFwcGVhcnMgd2l0aGluIGl0cyBtZXNzYWdlIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICBudW1iZXI6IChpbnQpIFRhZyBudW1iZXIgZGVjbGFyZWQgZm9yIHRoaXMgZmllbGQgaW4gdGhlIC5wcm90byBmaWxlLgotCi0gICAgdHlwZTogKE9uZSBvZiB0aGUgVFlQRV8qIGNvbnN0YW50cyBiZWxvdykgRGVjbGFyZWQgdHlwZS4KLSAgICBjcHBfdHlwZTogKE9uZSBvZiB0aGUgQ1BQVFlQRV8qIGNvbnN0YW50cyBiZWxvdykgQysrIHR5cGUgdXNlZCB0bwotICAgICAgcmVwcmVzZW50IHRoaXMgZmllbGQuCi0KLSAgICBsYWJlbDogKE9uZSBvZiB0aGUgTEFCRUxfKiBjb25zdGFudHMgYmVsb3cpIFRlbGxzIHdoZXRoZXIgdGhpcwotICAgICAgZmllbGQgaXMgb3B0aW9uYWwsIHJlcXVpcmVkLCBvciByZXBlYXRlZC4KLSAgICBoYXNfZGVmYXVsdF92YWx1ZTogKGJvb2wpIFRydWUgaWYgdGhpcyBmaWVsZCBoYXMgYSBkZWZhdWx0IHZhbHVlIGRlZmluZWQsCi0gICAgICBvdGhlcndpc2UgZmFsc2UuCi0gICAgZGVmYXVsdF92YWx1ZTogKFZhcmllcykgRGVmYXVsdCB2YWx1ZSBvZiB0aGlzIGZpZWxkLiAgT25seQotICAgICAgbWVhbmluZ2Z1bCBmb3Igbm9uLXJlcGVhdGVkIHNjYWxhciBmaWVsZHMuICBSZXBlYXRlZCBmaWVsZHMKLSAgICAgIHNob3VsZCBhbHdheXMgc2V0IHRoaXMgdG8gW10sIGFuZCBub24tcmVwZWF0ZWQgY29tcG9zaXRlCi0gICAgICBmaWVsZHMgc2hvdWxkIGFsd2F5cyBzZXQgdGhpcyB0byBOb25lLgotCi0gICAgY29udGFpbmluZ190eXBlOiAoRGVzY3JpcHRvcikgRGVzY3JpcHRvciBvZiB0aGUgcHJvdG9jb2wgbWVzc2FnZQotICAgICAgdHlwZSB0aGF0IGNvbnRhaW5zIHRoaXMgZmllbGQuICBTZXQgYnkgdGhlIERlc2NyaXB0b3IgY29uc3RydWN0b3IKLSAgICAgIGlmIHdlJ3JlIHBhc3NlZCBpbnRvIG9uZS4KLSAgICAgIFNvbWV3aGF0IGNvbmZ1c2luZ2x5LCBmb3IgZXh0ZW5zaW9uIGZpZWxkcywgdGhpcyBpcyB0aGUKLSAgICAgIGRlc2NyaXB0b3Igb2YgdGhlIEVYVEVOREVEIG1lc3NhZ2UsIG5vdCB0aGUgZGVzY3JpcHRvcgotICAgICAgb2YgdGhlIG1lc3NhZ2UgY29udGFpbmluZyB0aGlzIGZpZWxkLiAgKFNlZSBpc19leHRlbnNpb24gYW5kCi0gICAgICBleHRlbnNpb25fc2NvcGUgYmVsb3cpLgotICAgIG1lc3NhZ2VfdHlwZTogKERlc2NyaXB0b3IpIElmIGEgY29tcG9zaXRlIGZpZWxkLCBhIGRlc2NyaXB0b3IKLSAgICAgIG9mIHRoZSBtZXNzYWdlIHR5cGUgY29udGFpbmVkIGluIHRoaXMgZmllbGQuICBPdGhlcndpc2UsIHRoaXMgaXMgTm9uZS4KLSAgICBlbnVtX3R5cGU6IChFbnVtRGVzY3JpcHRvcikgSWYgdGhpcyBmaWVsZCBjb250YWlucyBhbiBlbnVtLCBhCi0gICAgICBkZXNjcmlwdG9yIG9mIHRoYXQgZW51bS4gIE90aGVyd2lzZSwgdGhpcyBpcyBOb25lLgotCi0gICAgaXNfZXh0ZW5zaW9uOiBUcnVlIGlmZiB0aGlzIGRlc2NyaWJlcyBhbiBleHRlbnNpb24gZmllbGQuCi0gICAgZXh0ZW5zaW9uX3Njb3BlOiAoRGVzY3JpcHRvcikgT25seSBtZWFuaW5nZnVsIGlmIGlzX2V4dGVuc2lvbiBpcyBUcnVlLgotICAgICAgR2l2ZXMgdGhlIG1lc3NhZ2UgdGhhdCBpbW1lZGlhdGVseSBjb250YWlucyB0aGlzIGV4dGVuc2lvbiBmaWVsZC4KLSAgICAgIFdpbGwgYmUgTm9uZSBpZmYgd2UncmUgYSB0b3AtbGV2ZWwgKGZpbGUtbGV2ZWwpIGV4dGVuc2lvbiBmaWVsZC4KLQotICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMpIFByb3RvY29sIG1lc3NhZ2UgZmllbGQgb3B0aW9ucyBvcgotICAgICAgTm9uZSB0byB1c2UgZGVmYXVsdCBmaWVsZCBvcHRpb25zLgotCi0gICAgY29udGFpbmluZ19vbmVvZjogKE9uZW9mRGVzY3JpcHRvcikgSWYgdGhlIGZpZWxkIGlzIGEgbWVtYmVyIG9mIGEgb25lb2YKLSAgICAgIHVuaW9uLCBjb250YWlucyBpdHMgZGVzY3JpcHRvci4gT3RoZXJ3aXNlLCBOb25lLgotICAiIiIKLQotICAjIE11c3QgYmUgY29uc2lzdGVudCB3aXRoIEMrKyBGaWVsZERlc2NyaXB0b3I6OlR5cGUgZW51bSBpbgotICAjIGRlc2NyaXB0b3IuaC4KLSAgIwotICAjIFRPRE8ocm9iaW5zb24pOiBGaW5kIGEgd2F5IHRvIGVsaW1pbmF0ZSB0aGlzIHJlcGV0aXRpb24uCi0gIFRZUEVfRE9VQkxFICAgICAgICAgPSAxCi0gIFRZUEVfRkxPQVQgICAgICAgICAgPSAyCi0gIFRZUEVfSU5UNjQgICAgICAgICAgPSAzCi0gIFRZUEVfVUlOVDY0ICAgICAgICAgPSA0Ci0gIFRZUEVfSU5UMzIgICAgICAgICAgPSA1Ci0gIFRZUEVfRklYRUQ2NCAgICAgICAgPSA2Ci0gIFRZUEVfRklYRUQzMiAgICAgICAgPSA3Ci0gIFRZUEVfQk9PTCAgICAgICAgICAgPSA4Ci0gIFRZUEVfU1RSSU5HICAgICAgICAgPSA5Ci0gIFRZUEVfR1JPVVAgICAgICAgICAgPSAxMAotICBUWVBFX01FU1NBR0UgICAgICAgID0gMTEKLSAgVFlQRV9CWVRFUyAgICAgICAgICA9IDEyCi0gIFRZUEVfVUlOVDMyICAgICAgICAgPSAxMwotICBUWVBFX0VOVU0gICAgICAgICAgID0gMTQKLSAgVFlQRV9TRklYRUQzMiAgICAgICA9IDE1Ci0gIFRZUEVfU0ZJWEVENjQgICAgICAgPSAxNgotICBUWVBFX1NJTlQzMiAgICAgICAgID0gMTcKLSAgVFlQRV9TSU5UNjQgICAgICAgICA9IDE4Ci0gIE1BWF9UWVBFICAgICAgICAgICAgPSAxOAotCi0gICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggQysrIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBlbnVtIGluCi0gICMgZGVzY3JpcHRvci5oLgotICAjCi0gICMgVE9ETyhyb2JpbnNvbik6IEZpbmQgYSB3YXkgdG8gZWxpbWluYXRlIHRoaXMgcmVwZXRpdGlvbi4KLSAgQ1BQVFlQRV9JTlQzMiAgICAgICA9IDEKLSAgQ1BQVFlQRV9JTlQ2NCAgICAgICA9IDIKLSAgQ1BQVFlQRV9VSU5UMzIgICAgICA9IDMKLSAgQ1BQVFlQRV9VSU5UNjQgICAgICA9IDQKLSAgQ1BQVFlQRV9ET1VCTEUgICAgICA9IDUKLSAgQ1BQVFlQRV9GTE9BVCAgICAgICA9IDYKLSAgQ1BQVFlQRV9CT09MICAgICAgICA9IDcKLSAgQ1BQVFlQRV9FTlVNICAgICAgICA9IDgKLSAgQ1BQVFlQRV9TVFJJTkcgICAgICA9IDkKLSAgQ1BQVFlQRV9NRVNTQUdFICAgICA9IDEwCi0gIE1BWF9DUFBUWVBFICAgICAgICAgPSAxMAotCi0gIF9QWVRIT05fVE9fQ1BQX1BST1RPX1RZUEVfTUFQID0gewotICAgICAgVFlQRV9ET1VCTEU6IENQUFRZUEVfRE9VQkxFLAotICAgICAgVFlQRV9GTE9BVDogQ1BQVFlQRV9GTE9BVCwKLSAgICAgIFRZUEVfRU5VTTogQ1BQVFlQRV9FTlVNLAotICAgICAgVFlQRV9JTlQ2NDogQ1BQVFlQRV9JTlQ2NCwKLSAgICAgIFRZUEVfU0lOVDY0OiBDUFBUWVBFX0lOVDY0LAotICAgICAgVFlQRV9TRklYRUQ2NDogQ1BQVFlQRV9JTlQ2NCwKLSAgICAgIFRZUEVfVUlOVDY0OiBDUFBUWVBFX1VJTlQ2NCwKLSAgICAgIFRZUEVfRklYRUQ2NDogQ1BQVFlQRV9VSU5UNjQsCi0gICAgICBUWVBFX0lOVDMyOiBDUFBUWVBFX0lOVDMyLAotICAgICAgVFlQRV9TRklYRUQzMjogQ1BQVFlQRV9JTlQzMiwKLSAgICAgIFRZUEVfU0lOVDMyOiBDUFBUWVBFX0lOVDMyLAotICAgICAgVFlQRV9VSU5UMzI6IENQUFRZUEVfVUlOVDMyLAotICAgICAgVFlQRV9GSVhFRDMyOiBDUFBUWVBFX1VJTlQzMiwKLSAgICAgIFRZUEVfQllURVM6IENQUFRZUEVfU1RSSU5HLAotICAgICAgVFlQRV9TVFJJTkc6IENQUFRZUEVfU1RSSU5HLAotICAgICAgVFlQRV9CT09MOiBDUFBUWVBFX0JPT0wsCi0gICAgICBUWVBFX01FU1NBR0U6IENQUFRZUEVfTUVTU0FHRSwKLSAgICAgIFRZUEVfR1JPVVA6IENQUFRZUEVfTUVTU0FHRQotICAgICAgfQotCi0gICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggQysrIEZpZWxkRGVzY3JpcHRvcjo6TGFiZWwgZW51bSBpbgotICAjIGRlc2NyaXB0b3IuaC4KLSAgIwotICAjIFRPRE8ocm9iaW5zb24pOiBGaW5kIGEgd2F5IHRvIGVsaW1pbmF0ZSB0aGlzIHJlcGV0aXRpb24uCi0gIExBQkVMX09QVElPTkFMICAgICAgPSAxCi0gIExBQkVMX1JFUVVJUkVEICAgICAgPSAyCi0gIExBQkVMX1JFUEVBVEVEICAgICAgPSAzCi0gIE1BWF9MQUJFTCAgICAgICAgICAgPSAzCi0KLSAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBDKysgY29uc3RhbnRzIGtNYXhOdW1iZXIsIGtGaXJzdFJlc2VydmVkTnVtYmVyLAotICAjIGFuZCBrTGFzdFJlc2VydmVkTnVtYmVyIGluIGRlc2NyaXB0b3IuaAotICBNQVhfRklFTERfTlVNQkVSID0gKDEgPDwgMjkpIC0gMQotICBGSVJTVF9SRVNFUlZFRF9GSUVMRF9OVU1CRVIgPSAxOTAwMAotICBMQVNUX1JFU0VSVkVEX0ZJRUxEX05VTUJFUiA9IDE5OTk5Ci0KLSAgaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgotICAgIF9DX0RFU0NSSVBUT1JfQ0xBU1MgPSBfbWVzc2FnZS5GaWVsZERlc2NyaXB0b3IKLQotICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgbnVtYmVyLCB0eXBlLCBjcHBfdHlwZSwgbGFiZWwsCi0gICAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSwgbWVzc2FnZV90eXBlLCBlbnVtX3R5cGUsIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICBpc19leHRlbnNpb24sIGV4dGVuc2lvbl9zY29wZSwgb3B0aW9ucz1Ob25lLAotICAgICAgICAgICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGNvbnRhaW5pbmdfb25lb2Y9Tm9uZSk6Ci0gICAgICBfbWVzc2FnZS5NZXNzYWdlLl9DaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCkKLSAgICAgIGlmIGlzX2V4dGVuc2lvbjoKLSAgICAgICAgcmV0dXJuIF9tZXNzYWdlLmRlZmF1bHRfcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKGZ1bGxfbmFtZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBfbWVzc2FnZS5kZWZhdWx0X3Bvb2wuRmluZEZpZWxkQnlOYW1lKGZ1bGxfbmFtZSkKLQotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgbnVtYmVyLCB0eXBlLCBjcHBfdHlwZSwgbGFiZWwsCi0gICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlLCBtZXNzYWdlX3R5cGUsIGVudW1fdHlwZSwgY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uLCBleHRlbnNpb25fc2NvcGUsIG9wdGlvbnM9Tm9uZSwKLSAgICAgICAgICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGNvbnRhaW5pbmdfb25lb2Y9Tm9uZSk6Ci0gICAgIiIiVGhlIGFyZ3VtZW50cyBhcmUgYXMgZGVzY3JpYmVkIGluIHRoZSBkZXNjcmlwdGlvbiBvZiBGaWVsZERlc2NyaXB0b3IKLSAgICBhdHRyaWJ1dGVzIGFib3ZlLgotCi0gICAgTm90ZSB0aGF0IGNvbnRhaW5pbmdfdHlwZSBtYXkgYmUgTm9uZSwgYW5kIG1heSBiZSBzZXQgbGF0ZXIgaWYgbmVjZXNzYXJ5Ci0gICAgKHRvIGRlYWwgd2l0aCBjaXJjdWxhciByZWZlcmVuY2VzIGJldHdlZW4gbWVzc2FnZSB0eXBlcywgZm9yIGV4YW1wbGUpLgotICAgIExpa2V3aXNlIGZvciBleHRlbnNpb25fc2NvcGUuCi0gICAgIiIiCi0gICAgc3VwZXIoRmllbGREZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zLCAnRmllbGRPcHRpb25zJykKLSAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgc2VsZi5mdWxsX25hbWUgPSBmdWxsX25hbWUKLSAgICBzZWxmLl9jYW1lbGNhc2VfbmFtZSA9IE5vbmUKLSAgICBzZWxmLmluZGV4ID0gaW5kZXgKLSAgICBzZWxmLm51bWJlciA9IG51bWJlcgotICAgIHNlbGYudHlwZSA9IHR5cGUKLSAgICBzZWxmLmNwcF90eXBlID0gY3BwX3R5cGUKLSAgICBzZWxmLmxhYmVsID0gbGFiZWwKLSAgICBzZWxmLmhhc19kZWZhdWx0X3ZhbHVlID0gaGFzX2RlZmF1bHRfdmFsdWUKLSAgICBzZWxmLmRlZmF1bHRfdmFsdWUgPSBkZWZhdWx0X3ZhbHVlCi0gICAgc2VsZi5jb250YWluaW5nX3R5cGUgPSBjb250YWluaW5nX3R5cGUKLSAgICBzZWxmLm1lc3NhZ2VfdHlwZSA9IG1lc3NhZ2VfdHlwZQotICAgIHNlbGYuZW51bV90eXBlID0gZW51bV90eXBlCi0gICAgc2VsZi5pc19leHRlbnNpb24gPSBpc19leHRlbnNpb24KLSAgICBzZWxmLmV4dGVuc2lvbl9zY29wZSA9IGV4dGVuc2lvbl9zY29wZQotICAgIHNlbGYuY29udGFpbmluZ19vbmVvZiA9IGNvbnRhaW5pbmdfb25lb2YKLSAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgotICAgICAgaWYgaXNfZXh0ZW5zaW9uOgotICAgICAgICBzZWxmLl9jZGVzY3JpcHRvciA9IF9tZXNzYWdlLmRlZmF1bHRfcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKGZ1bGxfbmFtZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuX2NkZXNjcmlwdG9yID0gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRGaWVsZEJ5TmFtZShmdWxsX25hbWUpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX2NkZXNjcmlwdG9yID0gTm9uZQotCi0gIEBwcm9wZXJ0eQotICBkZWYgY2FtZWxjYXNlX25hbWUoc2VsZik6Ci0gICAgaWYgc2VsZi5fY2FtZWxjYXNlX25hbWUgaXMgTm9uZToKLSAgICAgIHNlbGYuX2NhbWVsY2FzZV9uYW1lID0gX1RvQ2FtZWxDYXNlKHNlbGYubmFtZSkKLSAgICByZXR1cm4gc2VsZi5fY2FtZWxjYXNlX25hbWUKLQotICBAc3RhdGljbWV0aG9kCi0gIGRlZiBQcm90b1R5cGVUb0NwcFByb3RvVHlwZShwcm90b190eXBlKToKLSAgICAiIiJDb252ZXJ0cyBmcm9tIGEgUHl0aG9uIHByb3RvIHR5cGUgdG8gYSBDKysgUHJvdG8gVHlwZS4KLQotICAgIFRoZSBQeXRob24gUHJvdG9jb2xCdWZmZXIgY2xhc3NlcyBzcGVjaWZ5IGJvdGggdGhlICdQeXRob24nIGRhdGF0eXBlIGFuZCB0aGUKLSAgICAnQysrJyBkYXRhdHlwZSAtIGFuZCB0aGV5J3JlIG5vdCB0aGUgc2FtZS4gVGhpcyBoZWxwZXIgbWV0aG9kIHNob3VsZAotICAgIHRyYW5zbGF0ZSBmcm9tIG9uZSB0byBhbm90aGVyLgotCi0gICAgQXJnczoKLSAgICAgIHByb3RvX3R5cGU6IHRoZSBQeXRob24gcHJvdG8gdHlwZSAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV8qKQotICAgIFJldHVybnM6Ci0gICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFXyosIHRoZSBDKysgdHlwZS4KLSAgICBSYWlzZXM6Ci0gICAgICBUeXBlVHJhbnNmb3JtYXRpb25FcnJvcjogd2hlbiB0aGUgUHl0aG9uIHByb3RvIHR5cGUgaXNuJ3Qga25vd24uCi0gICAgIiIiCi0gICAgdHJ5OgotICAgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvci5fUFlUSE9OX1RPX0NQUF9QUk9UT19UWVBFX01BUFtwcm90b190eXBlXQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgIHJhaXNlIFR5cGVUcmFuc2Zvcm1hdGlvbkVycm9yKCdVbmtub3duIHByb3RvX3R5cGU6ICVzJyAlIHByb3RvX3R5cGUpCi0KLQotY2xhc3MgRW51bURlc2NyaXB0b3IoX05lc3RlZERlc2NyaXB0b3JCYXNlKToKLQotICAiIiJEZXNjcmlwdG9yIGZvciBhbiBlbnVtIGRlZmluZWQgaW4gYSAucHJvdG8gZmlsZS4KLQotICBBbiBFbnVtRGVzY3JpcHRvciBpbnN0YW5jZSBoYXMgdGhlIGZvbGxvd2luZyBhdHRyaWJ1dGVzOgotCi0gICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGUgZW51bSB0eXBlLgotICAgIGZ1bGxfbmFtZTogKHN0cikgRnVsbCBuYW1lIG9mIHRoZSB0eXBlLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lCi0gICAgICBhbmQgYW55IGVuY2xvc2luZyB0eXBlKHMpLgotCi0gICAgdmFsdWVzOiAobGlzdCBvZiBFbnVtVmFsdWVEZXNjcmlwdG9ycykgTGlzdCBvZiB0aGUgdmFsdWVzCi0gICAgICBpbiB0aGlzIGVudW0uCi0gICAgdmFsdWVzX2J5X25hbWU6IChkaWN0IHN0ciAtPiBFbnVtVmFsdWVEZXNjcmlwdG9yKSBTYW1lIGFzIHx2YWx1ZXN8LAotICAgICAgYnV0IGluZGV4ZWQgYnkgdGhlICJuYW1lIiBmaWVsZCBvZiBlYWNoIEVudW1WYWx1ZURlc2NyaXB0b3IuCi0gICAgdmFsdWVzX2J5X251bWJlcjogKGRpY3QgaW50IC0+IEVudW1WYWx1ZURlc2NyaXB0b3IpIFNhbWUgYXMgfHZhbHVlc3wsCi0gICAgICBidXQgaW5kZXhlZCBieSB0aGUgIm51bWJlciIgZmllbGQgb2YgZWFjaCBFbnVtVmFsdWVEZXNjcmlwdG9yLgotICAgIGNvbnRhaW5pbmdfdHlwZTogKERlc2NyaXB0b3IpIERlc2NyaXB0b3Igb2YgdGhlIGltbWVkaWF0ZSBjb250YWluaW5nCi0gICAgICB0eXBlIG9mIHRoaXMgZW51bSwgb3IgTm9uZSBpZiB0aGlzIGlzIGFuIGVudW0gZGVmaW5lZCBhdCB0aGUKLSAgICAgIHRvcCBsZXZlbCBpbiBhIC5wcm90byBmaWxlLiAgU2V0IGJ5IERlc2NyaXB0b3IncyBjb25zdHJ1Y3RvcgotICAgICAgaWYgd2UncmUgcGFzc2VkIGludG8gb25lLgotICAgIGZpbGU6IChGaWxlRGVzY3JpcHRvcikgUmVmZXJlbmNlIHRvIGZpbGUgZGVzY3JpcHRvci4KLSAgICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuRW51bU9wdGlvbnMpIEVudW0gb3B0aW9ucyBtZXNzYWdlIG9yCi0gICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IGVudW0gb3B0aW9ucy4KLSAgIiIiCi0KLSAgaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgotICAgIF9DX0RFU0NSSVBUT1JfQ0xBU1MgPSBfbWVzc2FnZS5FbnVtRGVzY3JpcHRvcgotCi0gICAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBmdWxsX25hbWUsIGZpbGVuYW1lLCB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIG9wdGlvbnM9Tm9uZSwgZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwgc2VyaWFsaXplZF9lbmQ9Tm9uZSk6Ci0gICAgICBfbWVzc2FnZS5NZXNzYWdlLl9DaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCkKLSAgICAgIHJldHVybiBfbWVzc2FnZS5kZWZhdWx0X3Bvb2wuRmluZEVudW1UeXBlQnlOYW1lKGZ1bGxfbmFtZSkKLQotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBmaWxlbmFtZSwgdmFsdWVzLAotICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIG9wdGlvbnM9Tm9uZSwgZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLCBzZXJpYWxpemVkX2VuZD1Ob25lKToKLSAgICAiIiJBcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlLgotCi0gICAgTm90ZSB0aGF0IGZpbGVuYW1lIGlzIGFuIG9ic29sZXRlIGFyZ3VtZW50LCB0aGF0IGlzIG5vdCB1c2VkIGFueW1vcmUuCi0gICAgUGxlYXNlIHVzZSBmaWxlLm5hbWUgdG8gYWNjZXNzIHRoaXMgYXMgYW4gYXR0cmlidXRlLgotICAgICIiIgotICAgIHN1cGVyKEVudW1EZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKLSAgICAgICAgb3B0aW9ucywgJ0VudW1PcHRpb25zJywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlLAotICAgICAgICBjb250YWluaW5nX3R5cGUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKLSAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9lbmQpCi0KLSAgICBzZWxmLnZhbHVlcyA9IHZhbHVlcwotICAgIGZvciB2YWx1ZSBpbiBzZWxmLnZhbHVlczoKLSAgICAgIHZhbHVlLnR5cGUgPSBzZWxmCi0gICAgc2VsZi52YWx1ZXNfYnlfbmFtZSA9IGRpY3QoKHYubmFtZSwgdikgZm9yIHYgaW4gdmFsdWVzKQotICAgIHNlbGYudmFsdWVzX2J5X251bWJlciA9IGRpY3QoKHYubnVtYmVyLCB2KSBmb3IgdiBpbiB2YWx1ZXMpCi0KLSAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKLSAgICAiIiJDb3BpZXMgdGhpcyB0byBhIGRlc2NyaXB0b3JfcGIyLkVudW1EZXNjcmlwdG9yUHJvdG8uCi0KLSAgICBBcmdzOgotICAgICAgcHJvdG86IEFuIGVtcHR5IGRlc2NyaXB0b3JfcGIyLkVudW1EZXNjcmlwdG9yUHJvdG8uCi0gICAgIiIiCi0gICAgIyBUaGlzIGZ1bmN0aW9uIGlzIG92ZXJyaWRlbiB0byBnaXZlIGEgYmV0dGVyIGRvYyBjb21tZW50LgotICAgIHN1cGVyKEVudW1EZXNjcmlwdG9yLCBzZWxmKS5Db3B5VG9Qcm90byhwcm90bykKLQotCi1jbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yKERlc2NyaXB0b3JCYXNlKToKLQotICAiIiJEZXNjcmlwdG9yIGZvciBhIHNpbmdsZSB2YWx1ZSB3aXRoaW4gYW4gZW51bS4KLQotICAgIG5hbWU6IChzdHIpIE5hbWUgb2YgdGhpcyB2YWx1ZS4KLSAgICBpbmRleDogKGludCkgRGVuc2UsIDAtaW5kZXhlZCBpbmRleCBnaXZpbmcgdGhlIG9yZGVyIHRoYXQgdGhpcwotICAgICAgdmFsdWUgYXBwZWFycyB0ZXh0dWFsbHkgd2l0aGluIGl0cyBlbnVtIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICBudW1iZXI6IChpbnQpIEFjdHVhbCBudW1iZXIgYXNzaWduZWQgdG8gdGhpcyBlbnVtIHZhbHVlLgotICAgIHR5cGU6IChFbnVtRGVzY3JpcHRvcikgRW51bURlc2NyaXB0b3IgdG8gd2hpY2ggdGhpcyB2YWx1ZQotICAgICAgYmVsb25ncy4gIFNldCBieSBFbnVtRGVzY3JpcHRvcidzIGNvbnN0cnVjdG9yIGlmIHdlJ3JlCi0gICAgICBwYXNzZWQgaW50byBvbmUuCi0gICAgb3B0aW9uczogKGRlc2NyaXB0b3JfcGIyLkVudW1WYWx1ZU9wdGlvbnMpIEVudW0gdmFsdWUgb3B0aW9ucyBtZXNzYWdlIG9yCi0gICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IGVudW0gdmFsdWUgb3B0aW9ucyBvcHRpb25zLgotICAiIiIKLQotICBpZiBfVVNFX0NfREVTQ1JJUFRPUlM6Ci0gICAgX0NfREVTQ1JJUFRPUl9DTEFTUyA9IF9tZXNzYWdlLkVudW1WYWx1ZURlc2NyaXB0b3IKLQotICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgaW5kZXgsIG51bWJlciwgdHlwZT1Ob25lLCBvcHRpb25zPU5vbmUpOgotICAgICAgX21lc3NhZ2UuTWVzc2FnZS5fQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgpCi0gICAgICAjIFRoZXJlIGlzIG5vIHdheSB3ZSBjYW4gYnVpbGQgYSBjb21wbGV0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yIHdpdGggdGhlCi0gICAgICAjIGdpdmVuIHBhcmFtZXRlcnMgKHRoZSBuYW1lIG9mIHRoZSBFbnVtIGlzIG5vdCBrbm93biwgZm9yIGV4YW1wbGUpLgotICAgICAgIyBGb3J0dW5hdGVseSBnZW5lcmF0ZWQgZmlsZXMganVzdCBwYXNzIGl0IHRvIHRoZSBFbnVtRGVzY3JpcHRvcigpCi0gICAgICAjIGNvbnN0cnVjdG9yLCB3aGljaCB3aWxsIGlnbm9yZSBpdCwgc28gcmV0dXJuaW5nIE5vbmUgaXMgZ29vZCBlbm91Z2guCi0gICAgICByZXR1cm4gTm9uZQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBpbmRleCwgbnVtYmVyLCB0eXBlPU5vbmUsIG9wdGlvbnM9Tm9uZSk6Ci0gICAgIiIiQXJndW1lbnRzIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIGF0dHJpYnV0ZSBkZXNjcmlwdGlvbiBhYm92ZS4iIiIKLSAgICBzdXBlcihFbnVtVmFsdWVEZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zLCAnRW51bVZhbHVlT3B0aW9ucycpCi0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYuaW5kZXggPSBpbmRleAotICAgIHNlbGYubnVtYmVyID0gbnVtYmVyCi0gICAgc2VsZi50eXBlID0gdHlwZQotCi0KLWNsYXNzIE9uZW9mRGVzY3JpcHRvcihvYmplY3QpOgotICAiIiJEZXNjcmlwdG9yIGZvciBhIG9uZW9mIGZpZWxkLgotCi0gICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGUgb25lb2YgZmllbGQuCi0gICAgZnVsbF9uYW1lOiAoc3RyKSBGdWxsIG5hbWUgb2YgdGhlIG9uZW9mIGZpZWxkLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lLgotICAgIGluZGV4OiAoaW50KSAwLWJhc2VkIGluZGV4IGdpdmluZyB0aGUgb3JkZXIgb2YgdGhlIG9uZW9mIGZpZWxkIGluc2lkZQotICAgICAgaXRzIGNvbnRhaW5pbmcgdHlwZS4KLSAgICBjb250YWluaW5nX3R5cGU6IChEZXNjcmlwdG9yKSBEZXNjcmlwdG9yIG9mIHRoZSBwcm90b2NvbCBtZXNzYWdlCi0gICAgICB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gIFNldCBieSB0aGUgRGVzY3JpcHRvciBjb25zdHJ1Y3RvcgotICAgICAgaWYgd2UncmUgcGFzc2VkIGludG8gb25lLgotICAgIGZpZWxkczogKGxpc3Qgb2YgRmllbGREZXNjcmlwdG9yKSBUaGUgbGlzdCBvZiBmaWVsZCBkZXNjcmlwdG9ycyB0aGlzCi0gICAgICBvbmVvZiBjYW4gY29udGFpbi4KLSAgIiIiCi0KLSAgaWYgX1VTRV9DX0RFU0NSSVBUT1JTOgotICAgIF9DX0RFU0NSSVBUT1JfQ0xBU1MgPSBfbWVzc2FnZS5PbmVvZkRlc2NyaXB0b3IKLQotICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgY29udGFpbmluZ190eXBlLCBmaWVsZHMpOgotICAgICAgX21lc3NhZ2UuTWVzc2FnZS5fQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgpCi0gICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkZpbmRPbmVvZkJ5TmFtZShmdWxsX25hbWUpCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgaW5kZXgsIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRzKToKLSAgICAiIiJBcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlLiIiIgotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICBzZWxmLmZ1bGxfbmFtZSA9IGZ1bGxfbmFtZQotICAgIHNlbGYuaW5kZXggPSBpbmRleAotICAgIHNlbGYuY29udGFpbmluZ190eXBlID0gY29udGFpbmluZ190eXBlCi0gICAgc2VsZi5maWVsZHMgPSBmaWVsZHMKLQotCi1jbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcihfTmVzdGVkRGVzY3JpcHRvckJhc2UpOgotCi0gICIiIkRlc2NyaXB0b3IgZm9yIGEgc2VydmljZS4KLQotICAgIG5hbWU6IChzdHIpIE5hbWUgb2YgdGhlIHNlcnZpY2UuCi0gICAgZnVsbF9uYW1lOiAoc3RyKSBGdWxsIG5hbWUgb2YgdGhlIHNlcnZpY2UsIGluY2x1ZGluZyBwYWNrYWdlIG5hbWUuCi0gICAgaW5kZXg6IChpbnQpIDAtaW5kZXhlZCBpbmRleCBnaXZpbmcgdGhlIG9yZGVyIHRoYXQgdGhpcyBzZXJ2aWNlcwotICAgICAgZGVmaW5pdGlvbiBhcHBlYXJzIHdpdGhpbmcgdGhlIC5wcm90byBmaWxlLgotICAgIG1ldGhvZHM6IChsaXN0IG9mIE1ldGhvZERlc2NyaXB0b3IpIExpc3Qgb2YgbWV0aG9kcyBwcm92aWRlZCBieSB0aGlzCi0gICAgICBzZXJ2aWNlLgotICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlT3B0aW9ucykgU2VydmljZSBvcHRpb25zIG1lc3NhZ2Ugb3IKLSAgICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgc2VydmljZSBvcHRpb25zLgotICAgIGZpbGU6IChGaWxlRGVzY3JpcHRvcikgUmVmZXJlbmNlIHRvIGZpbGUgaW5mby4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgaW5kZXgsIG1ldGhvZHMsIG9wdGlvbnM9Tm9uZSwgZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLCBzZXJpYWxpemVkX2VuZD1Ob25lKToKLSAgICBzdXBlcihTZXJ2aWNlRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18oCi0gICAgICAgIG9wdGlvbnMsICdTZXJ2aWNlT3B0aW9ucycsIG5hbWUsIGZ1bGxfbmFtZSwgZmlsZSwKLSAgICAgICAgTm9uZSwgc2VyaWFsaXplZF9zdGFydD1zZXJpYWxpemVkX3N0YXJ0LAotICAgICAgICBzZXJpYWxpemVkX2VuZD1zZXJpYWxpemVkX2VuZCkKLSAgICBzZWxmLmluZGV4ID0gaW5kZXgKLSAgICBzZWxmLm1ldGhvZHMgPSBtZXRob2RzCi0gICAgIyBTZXQgdGhlIGNvbnRhaW5pbmcgc2VydmljZSBmb3IgZWFjaCBtZXRob2QgaW4gdGhpcyBzZXJ2aWNlLgotICAgIGZvciBtZXRob2QgaW4gc2VsZi5tZXRob2RzOgotICAgICAgbWV0aG9kLmNvbnRhaW5pbmdfc2VydmljZSA9IHNlbGYKLQotICBkZWYgRmluZE1ldGhvZEJ5TmFtZShzZWxmLCBuYW1lKToKLSAgICAiIiJTZWFyY2hlcyBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QsIGFuZCByZXR1cm5zIGl0cyBkZXNjcmlwdG9yLiIiIgotICAgIGZvciBtZXRob2QgaW4gc2VsZi5tZXRob2RzOgotICAgICAgaWYgbmFtZSA9PSBtZXRob2QubmFtZToKLSAgICAgICAgcmV0dXJuIG1ldGhvZAotICAgIHJldHVybiBOb25lCi0KLSAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKLSAgICAiIiJDb3BpZXMgdGhpcyB0byBhIGRlc2NyaXB0b3JfcGIyLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uCi0KLSAgICBBcmdzOgotICAgICAgcHJvdG86IEFuIGVtcHR5IGRlc2NyaXB0b3JfcGIyLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8uCi0gICAgIiIiCi0gICAgIyBUaGlzIGZ1bmN0aW9uIGlzIG92ZXJyaWRlbiB0byBnaXZlIGEgYmV0dGVyIGRvYyBjb21tZW50LgotICAgIHN1cGVyKFNlcnZpY2VEZXNjcmlwdG9yLCBzZWxmKS5Db3B5VG9Qcm90byhwcm90bykKLQotCi1jbGFzcyBNZXRob2REZXNjcmlwdG9yKERlc2NyaXB0b3JCYXNlKToKLQotICAiIiJEZXNjcmlwdG9yIGZvciBhIG1ldGhvZCBpbiBhIHNlcnZpY2UuCi0KLSAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGUgbWV0aG9kIHdpdGhpbiB0aGUgc2VydmljZS4KLSAgZnVsbF9uYW1lOiAoc3RyKSBGdWxsIG5hbWUgb2YgbWV0aG9kLgotICBpbmRleDogKGludCkgMC1pbmRleGVkIGluZGV4IG9mIHRoZSBtZXRob2QgaW5zaWRlIHRoZSBzZXJ2aWNlLgotICBjb250YWluaW5nX3NlcnZpY2U6IChTZXJ2aWNlRGVzY3JpcHRvcikgVGhlIHNlcnZpY2UgdGhhdCBjb250YWlucyB0aGlzCi0gICAgbWV0aG9kLgotICBpbnB1dF90eXBlOiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgbWVzc2FnZSB0aGF0IHRoaXMgbWV0aG9kIGFjY2VwdHMuCi0gIG91dHB1dF90eXBlOiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgbWVzc2FnZSB0aGF0IHRoaXMgbWV0aG9kIHJldHVybnMuCi0gIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5NZXRob2RPcHRpb25zKSBNZXRob2Qgb3B0aW9ucyBtZXNzYWdlIG9yCi0gICAgTm9uZSB0byB1c2UgZGVmYXVsdCBtZXRob2Qgb3B0aW9ucy4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGZ1bGxfbmFtZSwgaW5kZXgsIGNvbnRhaW5pbmdfc2VydmljZSwKLSAgICAgICAgICAgICAgIGlucHV0X3R5cGUsIG91dHB1dF90eXBlLCBvcHRpb25zPU5vbmUpOgotICAgICIiIlRoZSBhcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgTWV0aG9kRGVzY3JpcHRvcgotICAgIGF0dHJpYnV0ZXMgYWJvdmUuCi0KLSAgICBOb3RlIHRoYXQgY29udGFpbmluZ19zZXJ2aWNlIG1heSBiZSBOb25lLCBhbmQgbWF5IGJlIHNldCBsYXRlciBpZiBuZWNlc3NhcnkuCi0gICAgIiIiCi0gICAgc3VwZXIoTWV0aG9kRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18ob3B0aW9ucywgJ01ldGhvZE9wdGlvbnMnKQotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICBzZWxmLmZ1bGxfbmFtZSA9IGZ1bGxfbmFtZQotICAgIHNlbGYuaW5kZXggPSBpbmRleAotICAgIHNlbGYuY29udGFpbmluZ19zZXJ2aWNlID0gY29udGFpbmluZ19zZXJ2aWNlCi0gICAgc2VsZi5pbnB1dF90eXBlID0gaW5wdXRfdHlwZQotICAgIHNlbGYub3V0cHV0X3R5cGUgPSBvdXRwdXRfdHlwZQotCi0KLWNsYXNzIEZpbGVEZXNjcmlwdG9yKERlc2NyaXB0b3JCYXNlKToKLSAgIiIiRGVzY3JpcHRvciBmb3IgYSBmaWxlLiBNaW1pY3MgdGhlIGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uCi0KLSAgTm90ZSB0aGF0IGVudW1fdHlwZXNfYnlfbmFtZSwgZXh0ZW5zaW9uc19ieV9uYW1lLCBhbmQgZGVwZW5kZW5jaWVzCi0gIGZpZWxkcyBhcmUgb25seSBzZXQgYnkgdGhlIG1lc3NhZ2VfZmFjdG9yeSBtb2R1bGUsIGFuZCBub3QgYnkgdGhlCi0gIGdlbmVyYXRlZCBwcm90byBjb2RlLgotCi0gIG5hbWU6IG5hbWUgb2YgZmlsZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZS4KLSAgcGFja2FnZTogbmFtZSBvZiB0aGUgcGFja2FnZQotICBzeW50YXg6IHN0cmluZyBpbmRpY2F0aW5nIHN5bnRheCBvZiB0aGUgZmlsZSAoY2FuIGJlICJwcm90bzIiIG9yICJwcm90bzMiKQotICBzZXJpYWxpemVkX3BiOiAoc3RyKSBCeXRlIHN0cmluZyBvZiBzZXJpYWxpemVkCi0gICAgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by4KLSAgZGVwZW5kZW5jaWVzOiBMaXN0IG9mIG90aGVyIEZpbGVEZXNjcmlwdG9ycyB0aGlzIEZpbGVEZXNjcmlwdG9yIGRlcGVuZHMgb24uCi0gIHB1YmxpY19kZXBlbmRlbmNpZXM6IEEgbGlzdCBvZiBGaWxlRGVzY3JpcHRvcnMsIHN1YnNldCBvZiB0aGUgZGVwZW5kZW5jaWVzCi0gICAgYWJvdmUsIHdoaWNoIHdlcmUgZGVjbGFyZWQgYXMgInB1YmxpYyIuCi0gIG1lc3NhZ2VfdHlwZXNfYnlfbmFtZTogRGljdCBvZiBtZXNzYWdlIG5hbWVzIG9mIHRoZWlyIGRlc2NyaXB0b3JzLgotICBlbnVtX3R5cGVzX2J5X25hbWU6IERpY3Qgb2YgZW51bSBuYW1lcyBhbmQgdGhlaXIgZGVzY3JpcHRvcnMuCi0gIGV4dGVuc2lvbnNfYnlfbmFtZTogRGljdCBvZiBleHRlbnNpb24gbmFtZXMgYW5kIHRoZWlyIGRlc2NyaXB0b3JzLgotICBwb29sOiB0aGUgRGVzY3JpcHRvclBvb2wgdGhpcyBkZXNjcmlwdG9yIGJlbG9uZ3MgdG8uICBXaGVuIG5vdCBwYXNzZWQgdG8gdGhlCi0gICAgY29uc3RydWN0b3IsIHRoZSBnbG9iYWwgZGVmYXVsdCBwb29sIGlzIHVzZWQuCi0gICIiIgotCi0gIGlmIF9VU0VfQ19ERVNDUklQVE9SUzoKLSAgICBfQ19ERVNDUklQVE9SX0NMQVNTID0gX21lc3NhZ2UuRmlsZURlc2NyaXB0b3IKLQotICAgIGRlZiBfX25ld19fKGNscywgbmFtZSwgcGFja2FnZSwgb3B0aW9ucz1Ob25lLCBzZXJpYWxpemVkX3BiPU5vbmUsCi0gICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzPU5vbmUsIHB1YmxpY19kZXBlbmRlbmNpZXM9Tm9uZSwKLSAgICAgICAgICAgICAgICBzeW50YXg9Tm9uZSwgcG9vbD1Ob25lKToKLSAgICAgICMgRmlsZURlc2NyaXB0b3IoKSBpcyBjYWxsZWQgZnJvbSB2YXJpb3VzIHBsYWNlcywgbm90IG9ubHkgZnJvbSBnZW5lcmF0ZWQKLSAgICAgICMgZmlsZXMsIHRvIHJlZ2lzdGVyIGR5bmFtaWMgcHJvdG8gZmlsZXMgYW5kIG1lc3NhZ2VzLgotICAgICAgaWYgc2VyaWFsaXplZF9wYjoKLSAgICAgICAgIyBUT0RPKGFtYXVyeWZhKTogdXNlIHRoZSBwb29sIHBhc3NlZCBhcyBhcmd1bWVudC4gVGhpcyB3aWxsIHdvcmsgb25seQotICAgICAgICAjIGZvciBDKystaW1wbGVtZW50ZWQgRGVzY3JpcHRvclBvb2xzLgotICAgICAgICByZXR1cm4gX21lc3NhZ2UuZGVmYXVsdF9wb29sLkFkZFNlcmlhbGl6ZWRGaWxlKHNlcmlhbGl6ZWRfcGIpCi0gICAgICBlbHNlOgotICAgICAgICByZXR1cm4gc3VwZXIoRmlsZURlc2NyaXB0b3IsIGNscykuX19uZXdfXyhjbHMpCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHBhY2thZ2UsIG9wdGlvbnM9Tm9uZSwgc2VyaWFsaXplZF9wYj1Ob25lLAotICAgICAgICAgICAgICAgZGVwZW5kZW5jaWVzPU5vbmUsIHB1YmxpY19kZXBlbmRlbmNpZXM9Tm9uZSwKLSAgICAgICAgICAgICAgIHN5bnRheD1Ob25lLCBwb29sPU5vbmUpOgotICAgICIiIkNvbnN0cnVjdG9yLiIiIgotICAgIHN1cGVyKEZpbGVEZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXyhvcHRpb25zLCAnRmlsZU9wdGlvbnMnKQotCi0gICAgaWYgcG9vbCBpcyBOb25lOgotICAgICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAotICAgICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZWZhdWx0KCkKLSAgICBzZWxmLnBvb2wgPSBwb29sCi0gICAgc2VsZi5tZXNzYWdlX3R5cGVzX2J5X25hbWUgPSB7fQotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICBzZWxmLnBhY2thZ2UgPSBwYWNrYWdlCi0gICAgc2VsZi5zeW50YXggPSBzeW50YXggb3IgInByb3RvMiIKLSAgICBzZWxmLnNlcmlhbGl6ZWRfcGIgPSBzZXJpYWxpemVkX3BiCi0KLSAgICBzZWxmLmVudW1fdHlwZXNfYnlfbmFtZSA9IHt9Ci0gICAgc2VsZi5leHRlbnNpb25zX2J5X25hbWUgPSB7fQotICAgIHNlbGYuZGVwZW5kZW5jaWVzID0gKGRlcGVuZGVuY2llcyBvciBbXSkKLSAgICBzZWxmLnB1YmxpY19kZXBlbmRlbmNpZXMgPSAocHVibGljX2RlcGVuZGVuY2llcyBvciBbXSkKLQotICAgIGlmIChhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnIGFuZAotICAgICAgICBzZWxmLnNlcmlhbGl6ZWRfcGIgaXMgbm90IE5vbmUpOgotICAgICAgX21lc3NhZ2UuZGVmYXVsdF9wb29sLkFkZFNlcmlhbGl6ZWRGaWxlKHNlbGYuc2VyaWFsaXplZF9wYikKLQotICBkZWYgQ29weVRvUHJvdG8oc2VsZiwgcHJvdG8pOgotICAgICIiIkNvcGllcyB0aGlzIHRvIGEgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by4KLQotICAgIEFyZ3M6Ci0gICAgICBwcm90bzogQW4gZW1wdHkgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by4KLSAgICAiIiIKLSAgICBwcm90by5QYXJzZUZyb21TdHJpbmcoc2VsZi5zZXJpYWxpemVkX3BiKQotCi0KLWRlZiBfUGFyc2VPcHRpb25zKG1lc3NhZ2UsIHN0cmluZyk6Ci0gICIiIlBhcnNlcyBzZXJpYWxpemVkIG9wdGlvbnMuCi0KLSAgVGhpcyBoZWxwZXIgZnVuY3Rpb24gaXMgdXNlZCB0byBwYXJzZSBzZXJpYWxpemVkIG9wdGlvbnMgaW4gZ2VuZXJhdGVkCi0gIHByb3RvMiBmaWxlcy4gSXQgbXVzdCBub3QgYmUgdXNlZCBvdXRzaWRlIHByb3RvMi4KLSAgIiIiCi0gIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHN0cmluZykKLSAgcmV0dXJuIG1lc3NhZ2UKLQotCi1kZWYgX1RvQ2FtZWxDYXNlKG5hbWUpOgotICAiIiJDb252ZXJ0cyBuYW1lIHRvIGNhbWVsLWNhc2UgYW5kIHJldHVybnMgaXQuIiIiCi0gIGNhcGl0YWxpemVfbmV4dCA9IEZhbHNlCi0gIHJlc3VsdCA9IFtdCi0KLSAgZm9yIGMgaW4gbmFtZToKLSAgICBpZiBjID09ICdfJzoKLSAgICAgIGlmIHJlc3VsdDoKLSAgICAgICAgY2FwaXRhbGl6ZV9uZXh0ID0gVHJ1ZQotICAgIGVsaWYgY2FwaXRhbGl6ZV9uZXh0OgotICAgICAgcmVzdWx0LmFwcGVuZChjLnVwcGVyKCkpCi0gICAgICBjYXBpdGFsaXplX25leHQgPSBGYWxzZQotICAgIGVsc2U6Ci0gICAgICByZXN1bHQgKz0gYwotCi0gICMgTG93ZXItY2FzZSB0aGUgZmlyc3QgbGV0dGVyLgotICBpZiByZXN1bHQgYW5kIHJlc3VsdFswXS5pc3VwcGVyKCk6Ci0gICAgcmVzdWx0WzBdID0gcmVzdWx0WzBdLmxvd2VyKCkKLSAgcmV0dXJuICcnLmpvaW4ocmVzdWx0KQotCi0KLWRlZiBNYWtlRGVzY3JpcHRvcihkZXNjX3Byb3RvLCBwYWNrYWdlPScnLCBidWlsZF9maWxlX2lmX2NwcD1UcnVlLAotICAgICAgICAgICAgICAgICAgIHN5bnRheD1Ob25lKToKLSAgIiIiTWFrZSBhIHByb3RvYnVmIERlc2NyaXB0b3IgZ2l2ZW4gYSBEZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYuCi0KLSAgSGFuZGxlcyBuZXN0ZWQgZGVzY3JpcHRvcnMuIE5vdGUgdGhhdCB0aGlzIGlzIGxpbWl0ZWQgdG8gdGhlIHNjb3BlIG9mIGRlZmluaW5nCi0gIGEgbWVzc2FnZSBpbnNpZGUgb2YgYW5vdGhlciBtZXNzYWdlLiBDb21wb3NpdGUgZmllbGRzIGNhbiBjdXJyZW50bHkgb25seSBiZQotICByZXNvbHZlZCBpZiB0aGUgbWVzc2FnZSBpcyBkZWZpbmVkIGluIHRoZSBzYW1lIHNjb3BlIGFzIHRoZSBmaWVsZC4KLQotICBBcmdzOgotICAgIGRlc2NfcHJvdG86IFRoZSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYgbWVzc2FnZS4KLSAgICBwYWNrYWdlOiBPcHRpb25hbCBwYWNrYWdlIG5hbWUgZm9yIHRoZSBuZXcgbWVzc2FnZSBEZXNjcmlwdG9yIChzdHJpbmcpLgotICAgIGJ1aWxkX2ZpbGVfaWZfY3BwOiBVcGRhdGUgdGhlIEMrKyBkZXNjcmlwdG9yIHBvb2wgaWYgYXBpIG1hdGNoZXMuCi0gICAgICAgICAgICAgICAgICAgICAgIFNldCB0byBGYWxzZSBvbiByZWN1cnNpb24sIHNvIG5vIGR1cGxpY2F0ZXMgYXJlIGNyZWF0ZWQuCi0gICAgc3ludGF4OiBUaGUgc3ludGF4L3NlbWFudGljcyB0aGF0IHNob3VsZCBiZSB1c2VkLiAgU2V0IHRvICJwcm90bzMiIHRvIGdldAotICAgICAgICAgICAgcHJvdG8zIGZpZWxkIHByZXNlbmNlIHNlbWFudGljcy4KLSAgUmV0dXJuczoKLSAgICBBIERlc2NyaXB0b3IgZm9yIHByb3RvYnVmIG1lc3NhZ2VzLgotICAiIiIKLSAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJyBhbmQgYnVpbGRfZmlsZV9pZl9jcHA6Ci0gICAgIyBUaGUgQysrIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGFsbCBkZXNjcmlwdG9ycyB0byBiZSBiYWNrZWQgYnkgdGhlIHNhbWUKLSAgICAjIGRlZmluaXRpb24gaW4gdGhlIEMrKyBkZXNjcmlwdG9yIHBvb2wuIFRvIGRvIHRoaXMsIHdlIGJ1aWxkIGEKLSAgICAjIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2l0aCB0aGUgc2FtZSBkZWZpbml0aW9uIGFzIHRoaXMgZGVzY3JpcHRvciBhbmQgYnVpbGQKLSAgICAjIGl0IGludG8gdGhlIHBvb2wuCi0gICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCi0gICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCi0gICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm1lc3NhZ2VfdHlwZS5hZGQoKS5NZXJnZUZyb20oZGVzY19wcm90bykKLQotICAgICMgR2VuZXJhdGUgYSByYW5kb20gbmFtZSBmb3IgdGhpcyBwcm90byBmaWxlIHRvIHByZXZlbnQgY29uZmxpY3RzIHdpdGggYW55Ci0gICAgIyBpbXBvcnRlZCBvbmVzLiBXZSBuZWVkIHRvIHNwZWNpZnkgYSBmaWxlIG5hbWUgc28gdGhlIGRlc2NyaXB0b3IgcG9vbAotICAgICMgYWNjZXB0cyBvdXIgRmlsZURlc2NyaXB0b3JQcm90bywgYnV0IGl0IGlzIG5vdCBpbXBvcnRhbnQgd2hhdCB0aGF0IGZpbGUKLSAgICAjIG5hbWUgaXMgYWN0dWFsbHkgc2V0IHRvLgotICAgIHByb3RvX25hbWUgPSBzdHIodXVpZC51dWlkNCgpKQotCi0gICAgaWYgcGFja2FnZToKLSAgICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5uYW1lID0gb3MucGF0aC5qb2luKHBhY2thZ2UucmVwbGFjZSgnLicsICcvJyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b19uYW1lICsgJy5wcm90bycpCi0gICAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ucGFja2FnZSA9IHBhY2thZ2UKLSAgICBlbHNlOgotICAgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm5hbWUgPSBwcm90b19uYW1lICsgJy5wcm90bycKLQotICAgIF9tZXNzYWdlLmRlZmF1bHRfcG9vbC5BZGQoZmlsZV9kZXNjcmlwdG9yX3Byb3RvKQotICAgIHJlc3VsdCA9IF9tZXNzYWdlLmRlZmF1bHRfcG9vbC5GaW5kRmlsZUJ5TmFtZShmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubmFtZSkKLQotICAgIGlmIF9VU0VfQ19ERVNDUklQVE9SUzoKLSAgICAgIHJldHVybiByZXN1bHQubWVzc2FnZV90eXBlc19ieV9uYW1lW2Rlc2NfcHJvdG8ubmFtZV0KLQotICBmdWxsX21lc3NhZ2VfbmFtZSA9IFtkZXNjX3Byb3RvLm5hbWVdCi0gIGlmIHBhY2thZ2U6IGZ1bGxfbWVzc2FnZV9uYW1lLmluc2VydCgwLCBwYWNrYWdlKQotCi0gICMgQ3JlYXRlIERlc2NyaXB0b3JzIGZvciBlbnVtIHR5cGVzCi0gIGVudW1fdHlwZXMgPSB7fQotICBmb3IgZW51bV9wcm90byBpbiBkZXNjX3Byb3RvLmVudW1fdHlwZToKLSAgICBmdWxsX25hbWUgPSAnLicuam9pbihmdWxsX21lc3NhZ2VfbmFtZSArIFtlbnVtX3Byb3RvLm5hbWVdKQotICAgIGVudW1fZGVzYyA9IEVudW1EZXNjcmlwdG9yKAotICAgICAgZW51bV9wcm90by5uYW1lLCBmdWxsX25hbWUsIE5vbmUsIFsKLSAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKGVudW1fdmFsLm5hbWUsIGlpLCBlbnVtX3ZhbC5udW1iZXIpCi0gICAgICAgICAgZm9yIGlpLCBlbnVtX3ZhbCBpbiBlbnVtZXJhdGUoZW51bV9wcm90by52YWx1ZSldKQotICAgIGVudW1fdHlwZXNbZnVsbF9uYW1lXSA9IGVudW1fZGVzYwotCi0gICMgQ3JlYXRlIERlc2NyaXB0b3JzIGZvciBuZXN0ZWQgdHlwZXMKLSAgbmVzdGVkX3R5cGVzID0ge30KLSAgZm9yIG5lc3RlZF9wcm90byBpbiBkZXNjX3Byb3RvLm5lc3RlZF90eXBlOgotICAgIGZ1bGxfbmFtZSA9ICcuJy5qb2luKGZ1bGxfbWVzc2FnZV9uYW1lICsgW25lc3RlZF9wcm90by5uYW1lXSkKLSAgICAjIE5lc3RlZCB0eXBlcyBhcmUganVzdCB0aG9zZSBkZWZpbmVkIGluc2lkZSBvZiB0aGUgbWVzc2FnZSwgbm90IGFsbCB0eXBlcwotICAgICMgdXNlZCBieSBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UsIHNvIG5vIGxvb3BzIGFyZSBwb3NzaWJsZSBoZXJlLgotICAgIG5lc3RlZF9kZXNjID0gTWFrZURlc2NyaXB0b3IobmVzdGVkX3Byb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2FnZT0nLicuam9pbihmdWxsX21lc3NhZ2VfbmFtZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWlsZF9maWxlX2lmX2NwcD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5bnRheD1zeW50YXgpCi0gICAgbmVzdGVkX3R5cGVzW2Z1bGxfbmFtZV0gPSBuZXN0ZWRfZGVzYwotCi0gIGZpZWxkcyA9IFtdCi0gIGZvciBmaWVsZF9wcm90byBpbiBkZXNjX3Byb3RvLmZpZWxkOgotICAgIGZ1bGxfbmFtZSA9ICcuJy5qb2luKGZ1bGxfbWVzc2FnZV9uYW1lICsgW2ZpZWxkX3Byb3RvLm5hbWVdKQotICAgIGVudW1fZGVzYyA9IE5vbmUKLSAgICBuZXN0ZWRfZGVzYyA9IE5vbmUKLSAgICBpZiBmaWVsZF9wcm90by5IYXNGaWVsZCgndHlwZV9uYW1lJyk6Ci0gICAgICB0eXBlX25hbWUgPSBmaWVsZF9wcm90by50eXBlX25hbWUKLSAgICAgIGZ1bGxfdHlwZV9uYW1lID0gJy4nLmpvaW4oZnVsbF9tZXNzYWdlX25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBbdHlwZV9uYW1lW3R5cGVfbmFtZS5yZmluZCgnLicpKzE6XV0pCi0gICAgICBpZiBmdWxsX3R5cGVfbmFtZSBpbiBuZXN0ZWRfdHlwZXM6Ci0gICAgICAgIG5lc3RlZF9kZXNjID0gbmVzdGVkX3R5cGVzW2Z1bGxfdHlwZV9uYW1lXQotICAgICAgZWxpZiBmdWxsX3R5cGVfbmFtZSBpbiBlbnVtX3R5cGVzOgotICAgICAgICBlbnVtX2Rlc2MgPSBlbnVtX3R5cGVzW2Z1bGxfdHlwZV9uYW1lXQotICAgICAgIyBFbHNlIHR5cGVfbmFtZSByZWZlcmVuY2VzIGEgbm9uLWxvY2FsIHR5cGUsIHdoaWNoIGlzbid0IGltcGxlbWVudGVkCi0gICAgZmllbGQgPSBGaWVsZERlc2NyaXB0b3IoCi0gICAgICAgIGZpZWxkX3Byb3RvLm5hbWUsIGZ1bGxfbmFtZSwgZmllbGRfcHJvdG8ubnVtYmVyIC0gMSwKLSAgICAgICAgZmllbGRfcHJvdG8ubnVtYmVyLCBmaWVsZF9wcm90by50eXBlLAotICAgICAgICBGaWVsZERlc2NyaXB0b3IuUHJvdG9UeXBlVG9DcHBQcm90b1R5cGUoZmllbGRfcHJvdG8udHlwZSksCi0gICAgICAgIGZpZWxkX3Byb3RvLmxhYmVsLCBOb25lLCBuZXN0ZWRfZGVzYywgZW51bV9kZXNjLCBOb25lLCBGYWxzZSwgTm9uZSwKLSAgICAgICAgb3B0aW9ucz1maWVsZF9wcm90by5vcHRpb25zLCBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSkKLSAgICBmaWVsZHMuYXBwZW5kKGZpZWxkKQotCi0gIGRlc2NfbmFtZSA9ICcuJy5qb2luKGZ1bGxfbWVzc2FnZV9uYW1lKQotICByZXR1cm4gRGVzY3JpcHRvcihkZXNjX3Byb3RvLm5hbWUsIGRlc2NfbmFtZSwgTm9uZSwgTm9uZSwgZmllbGRzLAotICAgICAgICAgICAgICAgICAgICBsaXN0KG5lc3RlZF90eXBlcy52YWx1ZXMoKSksIGxpc3QoZW51bV90eXBlcy52YWx1ZXMoKSksIFtdLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25zPWRlc2NfcHJvdG8ub3B0aW9ucykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTMzM2Y5OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDEgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJQcm92aWRlcyBhIGNvbnRhaW5lciBmb3IgRGVzY3JpcHRvclByb3Rvcy4iIiIKLQotX19hdXRob3JfXyA9ICdtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpJwotCi0KLWNsYXNzIEVycm9yKEV4Y2VwdGlvbik6Ci0gIHBhc3MKLQotCi1jbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2VDb25mbGljdGluZ0RlZmluaXRpb25FcnJvcihFcnJvcik6Ci0gICIiIlJhaXNlZCB3aGVuIGEgcHJvdG8gaXMgYWRkZWQgd2l0aCB0aGUgc2FtZSBuYW1lICYgZGlmZmVyZW50IGRlc2NyaXB0b3IuIiIiCi0KLQotY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlKG9iamVjdCk6Ci0gICIiIkEgY29udGFpbmVyIGFjY2VwdGluZyBGaWxlRGVzY3JpcHRvclByb3RvcyBhbmQgbWFwcyBEZXNjcmlwdG9yUHJvdG9zLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X2ZpbGUgPSB7fQotICAgIHNlbGYuX2ZpbGVfZGVzY19wcm90b3NfYnlfc3ltYm9sID0ge30KLQotICBkZWYgQWRkKHNlbGYsIGZpbGVfZGVzY19wcm90byk6Ci0gICAgIiIiQWRkcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhbmQgaXRzIHR5cGVzIHRvIHRoaXMgZGF0YWJhc2UuCi0KLSAgICBBcmdzOgotICAgICAgZmlsZV9kZXNjX3Byb3RvOiBUaGUgRmlsZURlc2NyaXB0b3JQcm90byB0byBhZGQuCi0gICAgUmFpc2VzOgotICAgICAgRGVzY3JpcHRvckRhdGFiYXNlRXhjZXB0aW9uOiBpZiBhbiBhdHRlbXB0IGlzIG1hZGUgdG8gYWRkIGEgcHJvdG8KLSAgICAgICAgd2l0aCB0aGUgc2FtZSBuYW1lIGJ1dCBkaWZmZXJlbnQgZGVmaW5pdGlvbiB0aGFuIGFuIGV4aXNpdGluZwotICAgICAgICBwcm90byBpbiB0aGUgZGF0YWJhc2UuCi0gICAgIiIiCi0gICAgcHJvdG9fbmFtZSA9IGZpbGVfZGVzY19wcm90by5uYW1lCi0gICAgaWYgcHJvdG9fbmFtZSBub3QgaW4gc2VsZi5fZmlsZV9kZXNjX3Byb3Rvc19ieV9maWxlOgotICAgICAgc2VsZi5fZmlsZV9kZXNjX3Byb3Rvc19ieV9maWxlW3Byb3RvX25hbWVdID0gZmlsZV9kZXNjX3Byb3RvCi0gICAgZWxpZiBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X2ZpbGVbcHJvdG9fbmFtZV0gIT0gZmlsZV9kZXNjX3Byb3RvOgotICAgICAgcmFpc2UgRGVzY3JpcHRvckRhdGFiYXNlQ29uZmxpY3RpbmdEZWZpbml0aW9uRXJyb3IoCi0gICAgICAgICAgJyVzIGFscmVhZHkgYWRkZWQsIGJ1dCB3aXRoIGRpZmZlcmVudCBkZXNjcmlwdG9yLicgJSBwcm90b19uYW1lKQotCi0gICAgIyBBZGQgdGhlIHRvcC1sZXZlbCBNZXNzYWdlLCBFbnVtIGFuZCBFeHRlbnNpb24gZGVzY3JpcHRvcnMgdG8gdGhlIGluZGV4LgotICAgIHBhY2thZ2UgPSBmaWxlX2Rlc2NfcHJvdG8ucGFja2FnZQotICAgIGZvciBtZXNzYWdlIGluIGZpbGVfZGVzY19wcm90by5tZXNzYWdlX3R5cGU6Ci0gICAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X3N5bWJvbC51cGRhdGUoCi0gICAgICAgICAgKG5hbWUsIGZpbGVfZGVzY19wcm90bykgZm9yIG5hbWUgaW4gX0V4dHJhY3RTeW1ib2xzKG1lc3NhZ2UsIHBhY2thZ2UpKQotICAgIGZvciBlbnVtIGluIGZpbGVfZGVzY19wcm90by5lbnVtX3R5cGU6Ci0gICAgICBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X3N5bWJvbFsKLSAgICAgICAgICAnLicuam9pbigocGFja2FnZSwgZW51bS5uYW1lKSldID0gZmlsZV9kZXNjX3Byb3RvCi0gICAgZm9yIGV4dGVuc2lvbiBpbiBmaWxlX2Rlc2NfcHJvdG8uZXh0ZW5zaW9uOgotICAgICAgc2VsZi5fZmlsZV9kZXNjX3Byb3Rvc19ieV9zeW1ib2xbCi0gICAgICAgICAgJy4nLmpvaW4oKHBhY2thZ2UsIGV4dGVuc2lvbi5uYW1lKSldID0gZmlsZV9kZXNjX3Byb3RvCi0KLSAgZGVmIEZpbmRGaWxlQnlOYW1lKHNlbGYsIG5hbWUpOgotICAgICIiIkZpbmRzIHRoZSBmaWxlIGRlc2NyaXB0b3IgcHJvdG8gYnkgZmlsZSBuYW1lLgotCi0gICAgVHlwaWNhbGx5IHRoZSBmaWxlIG5hbWUgaXMgYSByZWxhdGl2ZSBwYXRoIGVuZGluZyB0byBhIC5wcm90byBmaWxlLiBUaGUKLSAgICBwcm90byB3aXRoIHRoZSBnaXZlbiBuYW1lIHdpbGwgaGF2ZSB0byBoYXZlIGJlZW4gYWRkZWQgdG8gdGhpcyBkYXRhYmFzZQotICAgIHVzaW5nIHRoZSBBZGQgbWV0aG9kIG9yIGVsc2UgYW4gZXJyb3Igd2lsbCBiZSByYWlzZWQuCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogVGhlIGZpbGUgbmFtZSB0byBmaW5kLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgcHJvdG8gbWF0Y2hpbmcgdGhlIG5hbWUuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBLZXlFcnJvciBpZiBubyBmaWxlIGJ5IHRoZSBnaXZlbiBuYW1lIHdhcyBhZGRlZC4KLSAgICAiIiIKLQotICAgIHJldHVybiBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X2ZpbGVbbmFtZV0KLQotICBkZWYgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHNlbGYsIHN5bWJvbCk6Ci0gICAgIiIiRmluZHMgdGhlIGZpbGUgZGVzY3JpcHRvciBwcm90byBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sLgotCi0gICAgVGhlIHN5bWJvbCBzaG91bGQgYmUgYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBpbmNsdWRpbmcgdGhlIGZpbGUgZGVzY3JpcHRvcidzCi0gICAgcGFja2FnZSBhbmQgYW55IGNvbnRhaW5pbmcgbWVzc2FnZXMuIFNvbWUgZXhhbXBsZXM6Ci0KLSAgICAnc29tZS5wYWNrYWdlLm5hbWUuTWVzc2FnZScKLSAgICAnc29tZS5wYWNrYWdlLm5hbWUuTWVzc2FnZS5OZXN0ZWRFbnVtJwotCi0gICAgVGhlIGZpbGUgZGVzY3JpcHRvciBwcm90byBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sIG11c3QgYmUgYWRkZWQgdG8KLSAgICB0aGlzIGRhdGFiYXNlIHVzaW5nIHRoZSBBZGQgbWV0aG9kIG9yIGVsc2UgYW4gZXJyb3Igd2lsbCBiZSByYWlzZWQuCi0KLSAgICBBcmdzOgotICAgICAgc3ltYm9sOiBUaGUgZnVsbHkgcXVhbGlmaWVkIHN5bWJvbCBuYW1lLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBmaWxlIGRlc2NyaXB0b3IgcHJvdG8gY29udGFpbmluZyB0aGUgc3ltYm9sLgotCi0gICAgUmFpc2VzOgotICAgICAgS2V5RXJyb3IgaWYgbm8gZmlsZSBjb250YWlucyB0aGUgc3BlY2lmaWVkIHN5bWJvbC4KLSAgICAiIiIKLQotICAgIHJldHVybiBzZWxmLl9maWxlX2Rlc2NfcHJvdG9zX2J5X3N5bWJvbFtzeW1ib2xdCi0KLQotZGVmIF9FeHRyYWN0U3ltYm9scyhkZXNjX3Byb3RvLCBwYWNrYWdlKToKLSAgIiIiUHVsbHMgb3V0IGFsbCB0aGUgc3ltYm9scyBmcm9tIGEgZGVzY3JpcHRvciBwcm90by4KLQotICBBcmdzOgotICAgIGRlc2NfcHJvdG86IFRoZSBwcm90byB0byBleHRyYWN0IHN5bWJvbHMgZnJvbS4KLSAgICBwYWNrYWdlOiBUaGUgcGFja2FnZSBjb250YWluaW5nIHRoZSBkZXNjcmlwdG9yIHR5cGUuCi0KLSAgWWllbGRzOgotICAgIFRoZSBmdWxseSBxdWFsaWZpZWQgbmFtZSBmb3VuZCBpbiB0aGUgZGVzY3JpcHRvci4KLSAgIiIiCi0KLSAgbWVzc2FnZV9uYW1lID0gJy4nLmpvaW4oKHBhY2thZ2UsIGRlc2NfcHJvdG8ubmFtZSkpCi0gIHlpZWxkIG1lc3NhZ2VfbmFtZQotICBmb3IgbmVzdGVkX3R5cGUgaW4gZGVzY19wcm90by5uZXN0ZWRfdHlwZToKLSAgICBmb3Igc3ltYm9sIGluIF9FeHRyYWN0U3ltYm9scyhuZXN0ZWRfdHlwZSwgbWVzc2FnZV9uYW1lKToKLSAgICAgIHlpZWxkIHN5bWJvbAotICBmb3IgZW51bV90eXBlIGluIGRlc2NfcHJvdG8uZW51bV90eXBlOgotICAgIHlpZWxkICcuJy5qb2luKChtZXNzYWdlX25hbWUsIGVudW1fdHlwZS5uYW1lKSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wYjIucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfcGIyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYTNiZTVhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wYjIucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNzk3ICswLDAgQEAKLSMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLSMgc291cmNlOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwotCi1pbXBvcnQgc3lzCi1fYj1zeXMudmVyc2lvbl9pbmZvWzBdPDMgYW5kIChsYW1iZGEgeDp4KSBvciAobGFtYmRhIHg6eC5lbmNvZGUoJ2xhdGluMScpKQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3IKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgcmVmbGVjdGlvbiBhcyBfcmVmbGVjdGlvbgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyBfc3ltYm9sX2RhdGFiYXNlCi0jIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi1fc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKLQotCi0KLQotREVTQ1JJUFRPUiA9IF9kZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAotICBuYW1lPSdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bycsCi0gIHBhY2thZ2U9J2dvb2dsZS5wcm90b2J1ZicsCi0gIHN5bnRheD0ncHJvdG8yJywKLSAgc2VyaWFsaXplZF9wYj1fYignXG4gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9ceDEyXHgwZmdvb2dsZS5wcm90b2J1ZlwiR1xuXHgxMVx4NDZpbGVEZXNjcmlwdG9yU2V0XHgxMlx4MzJcblx4MDRceDY2aWxlXHgxOFx4MDEgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG9cIlx4ZGJceDAzXG5ceDEzXHg0NmlsZURlc2NyaXB0b3JQcm90b1x4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgwZlxuXHgwN3BhY2thZ2VceDE4XHgwMiBceDAxKFx0XHgxMlx4MTJcblxuZGVwZW5kZW5jeVx4MThceDAzIFx4MDMoXHRceDEyXHgxOVxuXHgxMXB1YmxpY19kZXBlbmRlbmN5XHgxOFxuIFx4MDMoXHgwNVx4MTJceDE3XG5ceDBmd2Vha19kZXBlbmRlbmN5XHgxOFx4MGIgXHgwMyhceDA1XHgxMlx4MzZcblx4MGNtZXNzYWdlX3R5cGVceDE4XHgwNCBceDAzKFx4MGJceDMyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvXHgxMlx4Mzdcblx0ZW51bV90eXBlXHgxOFx4MDUgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHgwN3NlcnZpY2VceDE4XHgwNiBceDAzKFx4MGJceDMyXCcuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHRleHRlbnNpb25ceDE4XHgwNyBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9ceDEyLVxuXHgwN29wdGlvbnNceDE4XHgwOCBceDAxKFx4MGJceDMyXHgxYy5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNceDEyXHgzOVxuXHgxMHNvdXJjZV9jb2RlX2luZm9ceDE4XHQgXHgwMShceDBiXHgzMlx4MWYuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvXHgxMlx4MGVcblx4MDZzeW50YXhceDE4XHgwYyBceDAxKFx0XCJceGYwXHgwNFxuXHgwZlx4NDRceDY1c2NyaXB0b3JQcm90b1x4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgzNFxuXHgwNVx4NjZpZWxkXHgxOFx4MDIgXHgwMyhceDBiXHgzMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvXHgxMlx4Mzhcblx0ZXh0ZW5zaW9uXHgxOFx4MDYgXHgwMyhceDBiXHgzMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvXHgxMlx4MzVcblx4MGJuZXN0ZWRfdHlwZVx4MThceDAzIFx4MDMoXHgwYlx4MzIgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9ceDEyXHgzN1xuXHRlbnVtX3R5cGVceDE4XHgwNCBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1x4MTJIXG5ceDBmXHg2NXh0ZW5zaW9uX3JhbmdlXHgxOFx4MDUgXHgwMyhceDBiXHgzMi8uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZVx4MTJceDM5XG5cbm9uZW9mX2RlY2xceDE4XHgwOCBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9ceDEyXHgzMFxuXHgwN29wdGlvbnNceDE4XHgwNyBceDAxKFx4MGJceDMyXHgxZi5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnNceDEyXHg0NlxuXHgwZXJlc2VydmVkX3JhbmdlXHgxOFx0IFx4MDMoXHgwYlx4MzIuLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVx4MTJceDE1XG5ccnJlc2VydmVkX25hbWVceDE4XG4gXHgwMyhcdFx4MWEsXG5ceDBlXHg0NXh0ZW5zaW9uUmFuZ2VceDEyXHJcblx4MDVzdGFydFx4MThceDAxIFx4MDEoXHgwNVx4MTJceDBiXG5ceDAzXHg2NW5kXHgxOFx4MDIgXHgwMShceDA1XHgxYStcblxyUmVzZXJ2ZWRSYW5nZVx4MTJcclxuXHgwNXN0YXJ0XHgxOFx4MDEgXHgwMShceDA1XHgxMlx4MGJcblx4MDNceDY1bmRceDE4XHgwMiBceDAxKFx4MDVcIlx4YmNceDA1XG5ceDE0XHg0NmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGVcblx4MDZudW1iZXJceDE4XHgwMyBceDAxKFx4MDVceDEyOlxuXHgwNWxhYmVsXHgxOFx4MDQgXHgwMShceDBlXHgzMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsXHgxMlx4Mzhcblx4MDR0eXBlXHgxOFx4MDUgXHgwMShceDBlXHgzMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVceDEyXHgxMVxuXHR0eXBlX25hbWVceDE4XHgwNiBceDAxKFx0XHgxMlx4MTBcblx4MDhceDY1eHRlbmRlZVx4MThceDAyIFx4MDEoXHRceDEyXHgxNVxuXHJkZWZhdWx0X3ZhbHVlXHgxOFx4MDcgXHgwMShcdFx4MTJceDEzXG5ceDBib25lb2ZfaW5kZXhceDE4XHQgXHgwMShceDA1XHgxMlx4MTFcblx0anNvbl9uYW1lXHgxOFxuIFx4MDEoXHRceDEyLlxuXHgwN29wdGlvbnNceDE4XHgwOCBceDAxKFx4MGJceDMyXHgxZC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCJceGI2XHgwMlxuXHgwNFR5cGVceDEyXHgwZlxuXHgwYlRZUEVfRE9VQkxFXHgxMFx4MDFceDEyXHgwZVxuXG5UWVBFX0ZMT0FUXHgxMFx4MDJceDEyXHgwZVxuXG5UWVBFX0lOVDY0XHgxMFx4MDNceDEyXHgwZlxuXHgwYlRZUEVfVUlOVDY0XHgxMFx4MDRceDEyXHgwZVxuXG5UWVBFX0lOVDMyXHgxMFx4MDVceDEyXHgxMFxuXHgwY1RZUEVfRklYRUQ2NFx4MTBceDA2XHgxMlx4MTBcblx4MGNUWVBFX0ZJWEVEMzJceDEwXHgwN1x4MTJcclxuXHRUWVBFX0JPT0xceDEwXHgwOFx4MTJceDBmXG5ceDBiVFlQRV9TVFJJTkdceDEwXHRceDEyXHgwZVxuXG5UWVBFX0dST1VQXHgxMFxuXHgxMlx4MTBcblx4MGNUWVBFX01FU1NBR0VceDEwXHgwYlx4MTJceDBlXG5cblRZUEVfQllURVNceDEwXHgwY1x4MTJceDBmXG5ceDBiVFlQRV9VSU5UMzJceDEwXHJceDEyXHJcblx0VFlQRV9FTlVNXHgxMFx4MGVceDEyXHgxMVxuXHJUWVBFX1NGSVhFRDMyXHgxMFx4MGZceDEyXHgxMVxuXHJUWVBFX1NGSVhFRDY0XHgxMFx4MTBceDEyXHgwZlxuXHgwYlRZUEVfU0lOVDMyXHgxMFx4MTFceDEyXHgwZlxuXHgwYlRZUEVfU0lOVDY0XHgxMFx4MTJcIkNcblx4MDVMYWJlbFx4MTJceDEyXG5ceDBlTEFCRUxfT1BUSU9OQUxceDEwXHgwMVx4MTJceDEyXG5ceDBlTEFCRUxfUkVRVUlSRURceDEwXHgwMlx4MTJceDEyXG5ceDBlTEFCRUxfUkVQRUFURURceDEwXHgwM1wiJFxuXHgxNE9uZW9mRGVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFwiXHg4Y1x4MDFcblx4MTNceDQ1bnVtRGVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDM4XG5ceDA1dmFsdWVceDE4XHgwMiBceDAzKFx4MGJceDMyKS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvXHgxMi1cblx4MDdvcHRpb25zXHgxOFx4MDMgXHgwMShceDBiXHgzMlx4MWMuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zXCJsXG5ceDE4XHg0NW51bVZhbHVlRGVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDBlXG5ceDA2bnVtYmVyXHgxOFx4MDIgXHgwMShceDA1XHgxMlx4MzJcblx4MDdvcHRpb25zXHgxOFx4MDMgXHgwMShceDBiXHgzMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNcIlx4OTBceDAxXG5ceDE2U2VydmljZURlc2NyaXB0b3JQcm90b1x4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgzNlxuXHgwNm1ldGhvZFx4MThceDAyIFx4MDMoXHgwYlx4MzImLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG9ceDEyXHgzMFxuXHgwN29wdGlvbnNceDE4XHgwMyBceDAxKFx4MGJceDMyXHgxZi5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnNcIlx4YzFceDAxXG5ceDE1TWV0aG9kRGVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDEyXG5cbmlucHV0X3R5cGVceDE4XHgwMiBceDAxKFx0XHgxMlx4MTNcblx4MGJvdXRwdXRfdHlwZVx4MThceDAzIFx4MDEoXHRceDEyL1xuXHgwN29wdGlvbnNceDE4XHgwNCBceDAxKFx4MGJceDMyXHgxZS5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9uc1x4MTJceDFmXG5ceDEwXHg2M2xpZW50X3N0cmVhbWluZ1x4MThceDA1IFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHgxZlxuXHgxMHNlcnZlcl9zdHJlYW1pbmdceDE4XHgwNiBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXCJceDg3XHgwNVxuXHgwYlx4NDZpbGVPcHRpb25zXHgxMlx4MTRcblx4MGNqYXZhX3BhY2thZ2VceDE4XHgwMSBceDAxKFx0XHgxMlx4MWNcblx4MTRqYXZhX291dGVyX2NsYXNzbmFtZVx4MThceDA4IFx4MDEoXHRceDEyXCJcblx4MTNqYXZhX211bHRpcGxlX2ZpbGVzXHgxOFxuIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyLFxuXHgxZGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXHgxOFx4MTQgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTIlXG5ceDE2amF2YV9zdHJpbmdfY2hlY2tfdXRmOFx4MThceDFiIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHg0NlxuXHgwY29wdGltaXplX2Zvclx4MThcdCBceDAxKFx4MGVceDMyKS5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlOlx4MDVTUEVFRFx4MTJceDEyXG5cbmdvX3BhY2thZ2VceDE4XHgwYiBceDAxKFx0XHgxMlwiXG5ceDEzXHg2M1x4NjNfZ2VuZXJpY19zZXJ2aWNlc1x4MThceDEwIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyJFxuXHgxNWphdmFfZ2VuZXJpY19zZXJ2aWNlc1x4MThceDExIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXCJcblx4MTNweV9nZW5lcmljX3NlcnZpY2VzXHgxOFx4MTIgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDE5XG5cbmRlcHJlY2F0ZWRceDE4XHgxNyBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MWZcblx4MTBceDYzXHg2M19lbmFibGVfYXJlbmFzXHgxOFx4MWYgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDE5XG5ceDExb2JqY19jbGFzc19wcmVmaXhceDE4JCBceDAxKFx0XHgxMlx4MThcblx4MTBceDYzc2hhcnBfbmFtZXNwYWNlXHgxOCUgXHgwMShcdFx4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25cIjpcblx4MGNPcHRpbWl6ZU1vZGVceDEyXHRcblx4MDVTUEVFRFx4MTBceDAxXHgxMlxyXG5cdENPREVfU0laRVx4MTBceDAyXHgxMlx4MTBcblx4MGNMSVRFX1JVTlRJTUVceDEwXHgwMypcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMkpceDA0XHgwOCZceDEwXCdcIlx4ZTZceDAxXG5ceDBlTWVzc2FnZU9wdGlvbnNceDEyJlxuXHgxN21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XHgxOFx4MDEgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTIuXG5ceDFmbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvclx4MThceDAyIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHgxOVxuXG5kZXByZWNhdGVkXHgxOFx4MDMgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDExXG5cdG1hcF9lbnRyeVx4MThceDA3IFx4MDEoXHgwOFx4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIlx4OThceDAzXG5ceDBjXHg0NmllbGRPcHRpb25zXHgxMjpcblx4MDVceDYzdHlwZVx4MThceDAxIFx4MDEoXHgwZVx4MzIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6XHgwNlNUUklOR1x4MTJceDBlXG5ceDA2cGFja2VkXHgxOFx4MDIgXHgwMShceDA4XHgxMj9cblx4MDZqc3R5cGVceDE4XHgwNiBceDAxKFx4MGVceDMyJC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZTpcdEpTX05PUk1BTFx4MTJceDEzXG5ceDA0bGF6eVx4MThceDA1IFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHgxOVxuXG5kZXByZWNhdGVkXHgxOFx4MDMgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDEzXG5ceDA0d2Vha1x4MThcbiBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblwiL1xuXHgwNVx4NDNUeXBlXHgxMlxuXG5ceDA2U1RSSU5HXHgxMFx4MDBceDEyXHgwOFxuXHgwNFx4NDNPUkRceDEwXHgwMVx4MTJceDEwXG5ceDBjU1RSSU5HX1BJRUNFXHgxMFx4MDJcIjVcblx4MDZKU1R5cGVceDEyXHJcblx0SlNfTk9STUFMXHgxMFx4MDBceDEyXHJcblx0SlNfU1RSSU5HXHgxMFx4MDFceDEyXHJcblx0SlNfTlVNQkVSXHgxMFx4MDIqXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIlx4OGRceDAxXG5ceDBiXHg0NW51bU9wdGlvbnNceDEyXHgxM1xuXHgwYlx4NjFsbG93X2FsaWFzXHgxOFx4MDIgXHgwMShceDA4XHgxMlx4MTlcblxuZGVwcmVjYXRlZFx4MThceDAzIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAyXCJ9XG5ceDEwXHg0NW51bVZhbHVlT3B0aW9uc1x4MTJceDE5XG5cbmRlcHJlY2F0ZWRceDE4XHgwMSBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwie1xuXHgwZVNlcnZpY2VPcHRpb25zXHgxMlx4MTlcblxuZGVwcmVjYXRlZFx4MTghIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAyXCJ6XG5cck1ldGhvZE9wdGlvbnNceDEyXHgxOVxuXG5kZXByZWNhdGVkXHgxOCEgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIlx4OWVceDAyXG5ceDEzVW5pbnRlcnByZXRlZE9wdGlvblx4MTI7XG5ceDA0bmFtZVx4MThceDAyIFx4MDMoXHgwYlx4MzItLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0XHgxMlx4MThcblx4MTBpZGVudGlmaWVyX3ZhbHVlXHgxOFx4MDMgXHgwMShcdFx4MTJceDFhXG5ceDEycG9zaXRpdmVfaW50X3ZhbHVlXHgxOFx4MDQgXHgwMShceDA0XHgxMlx4MWFcblx4MTJuZWdhdGl2ZV9pbnRfdmFsdWVceDE4XHgwNSBceDAxKFx4MDNceDEyXHgxNFxuXHgwY1x4NjRvdWJsZV92YWx1ZVx4MThceDA2IFx4MDEoXHgwMVx4MTJceDE0XG5ceDBjc3RyaW5nX3ZhbHVlXHgxOFx4MDcgXHgwMShceDBjXHgxMlx4MTdcblx4MGZceDYxZ2dyZWdhdGVfdmFsdWVceDE4XHgwOCBceDAxKFx0XHgxYVx4MzNcblx4MDhOYW1lUGFydFx4MTJceDExXG5cdG5hbWVfcGFydFx4MThceDAxIFx4MDIoXHRceDEyXHgxNFxuXHgwY2lzX2V4dGVuc2lvblx4MThceDAyIFx4MDIoXHgwOFwiXHhkNVx4MDFcblx4MGVTb3VyY2VDb2RlSW5mb1x4MTI6XG5ceDA4bG9jYXRpb25ceDE4XHgwMSBceDAzKFx4MGJceDMyKC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb25ceDFhXHg4Nlx4MDFcblx4MDhMb2NhdGlvblx4MTJceDEwXG5ceDA0cGF0aFx4MThceDAxIFx4MDMoXHgwNVx4NDJceDAyXHgxMFx4MDFceDEyXHgxMFxuXHgwNHNwYW5ceDE4XHgwMiBceDAzKFx4MDVceDQyXHgwMlx4MTBceDAxXHgxMlx4MThcblx4MTBsZWFkaW5nX2NvbW1lbnRzXHgxOFx4MDMgXHgwMShcdFx4MTJceDE5XG5ceDExdHJhaWxpbmdfY29tbWVudHNceDE4XHgwNCBceDAxKFx0XHgxMiFcblx4MTlsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXHgxOFx4MDYgXHgwMyhcdFwiXHhhN1x4MDFcblx4MTFHZW5lcmF0ZWRDb2RlSW5mb1x4MTJceDQxXG5cbmFubm90YXRpb25ceDE4XHgwMSBceDAzKFx4MGJceDMyLS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvblx4MWFPXG5cbkFubm90YXRpb25ceDEyXHgxMFxuXHgwNHBhdGhceDE4XHgwMSBceDAzKFx4MDVceDQyXHgwMlx4MTBceDAxXHgxMlx4MTNcblx4MGJzb3VyY2VfZmlsZVx4MThceDAyIFx4MDEoXHRceDEyXHJcblx4MDVceDYyXHg2NWdpblx4MThceDAzIFx4MDEoXHgwNVx4MTJceDBiXG5ceDAzXHg2NW5kXHgxOFx4MDQgXHgwMShceDA1XHg0Mlhcblx4MTNceDYzb20uZ29vZ2xlLnByb3RvYnVmQlx4MTBceDQ0XHg2NXNjcmlwdG9yUHJvdG9zSFx4MDFaXG5kZXNjcmlwdG9yXHhhMlx4MDJceDAzR1BCXHhhYVx4MDJceDFhR29vZ2xlLlByb3RvYnVmLlJlZmxlY3Rpb24nKQotKQotX3N5bV9kYi5SZWdpc3RlckZpbGVEZXNjcmlwdG9yKERFU0NSSVBUT1IpCi0KLQotCi1fRklFTERERVNDUklQVE9SUFJPVE9fVFlQRSA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdUeXBlJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9ET1VCTEUnLCBpbmRleD0wLCBudW1iZXI9MSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfRkxPQVQnLCBpbmRleD0xLCBudW1iZXI9MiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfSU5UNjQnLCBpbmRleD0yLCBudW1iZXI9MywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfVUlOVDY0JywgaW5kZXg9MywgbnVtYmVyPTQsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0lOVDMyJywgaW5kZXg9NCwgbnVtYmVyPTUsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0ZJWEVENjQnLCBpbmRleD01LCBudW1iZXI9NiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfRklYRUQzMicsIGluZGV4PTYsIG51bWJlcj03LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9CT09MJywgaW5kZXg9NywgbnVtYmVyPTgsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX1NUUklORycsIGluZGV4PTgsIG51bWJlcj05LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9HUk9VUCcsIGluZGV4PTksIG51bWJlcj0xMCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfTUVTU0FHRScsIGluZGV4PTEwLCBudW1iZXI9MTEsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0JZVEVTJywgaW5kZXg9MTEsIG51bWJlcj0xMiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfVUlOVDMyJywgaW5kZXg9MTIsIG51bWJlcj0xMywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfRU5VTScsIGluZGV4PTEzLCBudW1iZXI9MTQsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX1NGSVhFRDMyJywgaW5kZXg9MTQsIG51bWJlcj0xNSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfU0ZJWEVENjQnLCBpbmRleD0xNSwgbnVtYmVyPTE2LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9TSU5UMzInLCBpbmRleD0xNiwgbnVtYmVyPTE3LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9TSU5UNjQnLCBpbmRleD0xNywgbnVtYmVyPTE4LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0xNTUzLAotICBzZXJpYWxpemVkX2VuZD0xODYzLAotKQotX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFKQotCi1fRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUwgPSBfZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKLSAgbmFtZT0nTGFiZWwnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCcsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nTEFCRUxfT1BUSU9OQUwnLCBpbmRleD0wLCBudW1iZXI9MSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0xBQkVMX1JFUVVJUkVEJywgaW5kZXg9MSwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdMQUJFTF9SRVBFQVRFRCcsIGluZGV4PTIsIG51bWJlcj0zLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0xODY1LAotICBzZXJpYWxpemVkX2VuZD0xOTMyLAotKQotX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUVMRERFU0NSSVBUT1JQUk9UT19MQUJFTCkKLQotX0ZJTEVPUFRJT05TX09QVElNSVpFTU9ERSA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdPcHRpbWl6ZU1vZGUnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1NQRUVEJywgaW5kZXg9MCwgbnVtYmVyPTEsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdDT0RFX1NJWkUnLCBpbmRleD0xLCBudW1iZXI9MiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0xJVEVfUlVOVElNRScsIGluZGV4PTIsIG51bWJlcj0zLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0zMTQxLAotICBzZXJpYWxpemVkX2VuZD0zMTk5LAotKQotX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUpCi0KLV9GSUVMRE9QVElPTlNfQ1RZUEUgPSBfZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKLSAgbmFtZT0nQ1R5cGUnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1NUUklORycsIGluZGV4PTAsIG51bWJlcj0wLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ09SRCcsIGluZGV4PTEsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nU1RSSU5HX1BJRUNFJywgaW5kZXg9MiwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICBdLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgb3B0aW9ucz1Ob25lLAotICBzZXJpYWxpemVkX3N0YXJ0PTM3NDcsCi0gIHNlcmlhbGl6ZWRfZW5kPTM3OTQsCi0pCi1fc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoX0ZJRUxET1BUSU9OU19DVFlQRSkKLQotX0ZJRUxET1BUSU9OU19KU1RZUEUgPSBfZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKLSAgbmFtZT0nSlNUeXBlJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nSlNfTk9STUFMJywgaW5kZXg9MCwgbnVtYmVyPTAsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdKU19TVFJJTkcnLCBpbmRleD0xLCBudW1iZXI9MSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0pTX05VTUJFUicsIGluZGV4PTIsIG51bWJlcj0yLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0zNzk2LAotICBzZXJpYWxpemVkX2VuZD0zODQ5LAotKQotX3N5bV9kYi5SZWdpc3RlckVudW1EZXNjcmlwdG9yKF9GSUVMRE9QVElPTlNfSlNUWVBFKQotCi0KLV9GSUxFREVTQ1JJUFRPUlNFVCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0ZpbGVEZXNjcmlwdG9yU2V0JywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2ZpbGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIG9uZW9mcz1bCi0gIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9NTMsCi0gIHNlcmlhbGl6ZWRfZW5kPTEyNCwKLSkKLQotCi1fRklMRURFU0NSSVBUT1JQUk9UTyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0ZpbGVEZXNjcmlwdG9yUHJvdG8nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3BhY2thZ2UnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZGVwZW5kZW5jeScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeScsIGluZGV4PTIsCi0gICAgICBudW1iZXI9MywgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ncHVibGljX2RlcGVuZGVuY3knLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnB1YmxpY19kZXBlbmRlbmN5JywgaW5kZXg9MywKLSAgICAgIG51bWJlcj0xMCwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nd2Vha19kZXBlbmRlbmN5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3knLCBpbmRleD00LAotICAgICAgbnVtYmVyPTExLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdtZXNzYWdlX3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZScsIGluZGV4PTUsCi0gICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdlbnVtX3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZScsIGluZGV4PTYsCi0gICAgICBudW1iZXI9NSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdzZXJ2aWNlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlJywgaW5kZXg9NywKLSAgICAgIG51bWJlcj02LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2V4dGVuc2lvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uJywgaW5kZXg9OCwKLSAgICAgIG51bWJlcj03LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD05LAotICAgICAgbnVtYmVyPTgsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdzb3VyY2VfY29kZV9pbmZvJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvJywgaW5kZXg9MTAsCi0gICAgICBudW1iZXI9OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3N5bnRheCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4JywgaW5kZXg9MTEsCi0gICAgICBudW1iZXI9MTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIHN5bnRheD0ncHJvdG8yJywKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgb25lb2ZzPVsKLSAgXSwKLSAgc2VyaWFsaXplZF9zdGFydD0xMjcsCi0gIHNlcmlhbGl6ZWRfZW5kPTYwMiwKLSkKLQotCi1fREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRXh0ZW5zaW9uUmFuZ2UnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3N0YXJ0JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLnN0YXJ0JywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2VuZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5lbmQnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIHN5bnRheD0ncHJvdG8yJywKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgb25lb2ZzPVsKLSAgXSwKLSAgc2VyaWFsaXplZF9zdGFydD0xMTQwLAotICBzZXJpYWxpemVkX2VuZD0xMTg0LAotKQotCi1fREVTQ1JJUFRPUlBST1RPX1JFU0VSVkVEUkFOR0UgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdSZXNlcnZlZFJhbmdlJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3N0YXJ0JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2Uuc3RhcnQnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZW5kJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UuZW5kJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIG9uZW9mcz1bCi0gIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTE4NiwKLSAgc2VyaWFsaXplZF9lbmQ9MTIyOSwKLSkKLQotX0RFU0NSSVBUT1JQUk9UTyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0Rlc2NyaXB0b3JQcm90bycsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2ZpZWxkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2V4dGVuc2lvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24nLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTYsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmVzdGVkX3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUnLCBpbmRleD0zLAotICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZW51bV90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZScsIGluZGV4PTQsCi0gICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdleHRlbnNpb25fcmFuZ2UnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlJywgaW5kZXg9NSwKLSAgICAgIG51bWJlcj01LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J29uZW9mX2RlY2wnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCcsIGluZGV4PTYsCi0gICAgICBudW1iZXI9OCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD03LAotICAgICAgbnVtYmVyPTcsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdyZXNlcnZlZF9yYW5nZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZScsIGluZGV4PTgsCi0gICAgICBudW1iZXI9OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdyZXNlcnZlZF9uYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUnLCBpbmRleD05LAotICAgICAgbnVtYmVyPTEwLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05SQU5HRSwgX0RFU0NSSVBUT1JQUk9UT19SRVNFUlZFRFJBTkdFLCBdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIG9uZW9mcz1bCi0gIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9NjA1LAotICBzZXJpYWxpemVkX2VuZD0xMjI5LAotKQotCi0KLV9GSUVMRERFU0NSSVBUT1JQUk9UTyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0ZpZWxkRGVzY3JpcHRvclByb3RvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8nLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J251bWJlcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm51bWJlcicsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MywgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdsYWJlbCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmxhYmVsJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj00LCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd0eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZScsIGluZGV4PTMsCi0gICAgICBudW1iZXI9NSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTEsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndHlwZV9uYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lJywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj02LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2V4dGVuZGVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUnLCBpbmRleD01LAotICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZGVmYXVsdF92YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUnLCBpbmRleD02LAotICAgICAgbnVtYmVyPTcsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nb25lb2ZfaW5kZXgnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5vbmVvZl9pbmRleCcsIGluZGV4PTcsCi0gICAgICBudW1iZXI9OSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdqc29uX25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUnLCBpbmRleD04LAotICAgICAgbnVtYmVyPTEwLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9OSwKLSAgICAgIG51bWJlcj04LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICAgIF9GSUVMRERFU0NSSVBUT1JQUk9UT19UWVBFLAotICAgIF9GSUVMRERFU0NSSVBUT1JQUk9UT19MQUJFTCwKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIG9uZW9mcz1bCi0gIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTIzMiwKLSAgc2VyaWFsaXplZF9lbmQ9MTkzMiwKLSkKLQotCi1fT05FT0ZERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdPbmVvZkRlc2NyaXB0b3JQcm90bycsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9X2IoIiIpLmRlY29kZSgndXRmLTgnKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTE5MzQsCi0gIHNlcmlhbGl6ZWRfZW5kPTE5NzAsCi0pCi0KLQotX0VOVU1ERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdFbnVtRGVzY3JpcHRvclByb3RvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9X2IoIiIpLmRlY29kZSgndXRmLTgnKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd2YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTIsCi0gICAgICBudW1iZXI9MywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIG9uZW9mcz1bCi0gIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTk3MywKLSAgc2VyaWFsaXplZF9lbmQ9MjExMywKLSkKLQotCi1fRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbnVtYmVyJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm51bWJlcicsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTIxMTUsCi0gIHNlcmlhbGl6ZWRfZW5kPTIyMjMsCi0pCi0KLQotX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdTZXJ2aWNlRGVzY3JpcHRvclByb3RvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9X2IoIiIpLmRlY29kZSgndXRmLTgnKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdtZXRob2QnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCcsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIHN5bnRheD0ncHJvdG8yJywKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgb25lb2ZzPVsKLSAgXSwKLSAgc2VyaWFsaXplZF9zdGFydD0yMjI2LAotICBzZXJpYWxpemVkX2VuZD0yMzcwLAotKQotCi0KLV9NRVRIT0RERVNDUklQVE9SUFJPVE8gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdNZXRob2REZXNjcmlwdG9yUHJvdG8nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8nLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9X2IoIiIpLmRlY29kZSgndXRmLTgnKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdpbnB1dF90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nb3V0cHV0X3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9MywKLSAgICAgIG51bWJlcj00LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY2xpZW50X3N0cmVhbWluZycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5jbGllbnRfc3RyZWFtaW5nJywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj01LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3NlcnZlcl9zdHJlYW1pbmcnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uc2VydmVyX3N0cmVhbWluZycsIGluZGV4PTUsCi0gICAgICBudW1iZXI9NiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTIzNzMsCi0gIHNlcmlhbGl6ZWRfZW5kPTI1NjYsCi0pCi0KLQotX0ZJTEVPUFRJT05TID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRmlsZU9wdGlvbnMnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0namF2YV9wYWNrYWdlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2phdmFfb3V0ZXJfY2xhc3NuYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTgsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0namF2YV9tdWx0aXBsZV9maWxlcycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfbXVsdGlwbGVfZmlsZXMnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTEwLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2gnLCBpbmRleD0zLAotICAgICAgbnVtYmVyPTIwLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3N0cmluZ19jaGVja191dGY4JywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj0yNywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdvcHRpbWl6ZV9mb3InLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vcHRpbWl6ZV9mb3InLCBpbmRleD01LAotICAgICAgbnVtYmVyPTksIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPTEsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZ29fcGFja2FnZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UnLCBpbmRleD02LAotICAgICAgbnVtYmVyPTExLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2NjX2dlbmVyaWNfc2VydmljZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9NywKLSAgICAgIG51bWJlcj0xNiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdqYXZhX2dlbmVyaWNfc2VydmljZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX2dlbmVyaWNfc2VydmljZXMnLCBpbmRleD04LAotICAgICAgbnVtYmVyPTE3LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3B5X2dlbmVyaWNfc2VydmljZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5weV9nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9OSwKLSAgICAgIG51bWJlcj0xOCwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdkZXByZWNhdGVkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZGVwcmVjYXRlZCcsIGluZGV4PTEwLAotICAgICAgbnVtYmVyPTIzLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2NjX2VuYWJsZV9hcmVuYXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19lbmFibGVfYXJlbmFzJywgaW5kZXg9MTEsCi0gICAgICBudW1iZXI9MzEsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nb2JqY19jbGFzc19wcmVmaXgnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCcsIGluZGV4PTEyLAotICAgICAgbnVtYmVyPTM2LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2NzaGFycF9uYW1lc3BhY2UnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlJywgaW5kZXg9MTMsCi0gICAgICBudW1iZXI9MzcsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTE0LAotICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gICAgX0ZJTEVPUFRJT05TX09QVElNSVpFTU9ERSwKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPVRydWUsCi0gIHN5bnRheD0ncHJvdG8yJywKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCi0gIG9uZW9mcz1bCi0gIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MjU2OSwKLSAgc2VyaWFsaXplZF9lbmQ9MzIxNiwKLSkKLQotCi1fTUVTU0FHRU9QVElPTlMgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdNZXNzYWdlT3B0aW9ucycsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0JywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3InLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2RlcHJlY2F0ZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5kZXByZWNhdGVkJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J21hcF9lbnRyeScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeScsIGluZGV4PTMsCi0gICAgICBudW1iZXI9NywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTQsCi0gICAgICBudW1iZXI9OTk5LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPVRydWUsCi0gIHN5bnRheD0ncHJvdG8yJywKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCi0gIG9uZW9mcz1bCi0gIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MzIxOSwKLSAgc2VyaWFsaXplZF9lbmQ9MzQ0OSwKLSkKLQotCi1fRklFTERPUFRJT05TID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRmllbGRPcHRpb25zJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdjdHlwZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5jdHlwZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdwYWNrZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdqc3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj02LCB0eXBlPTE0LCBjcHBfdHlwZT04LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2xhenknLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eScsIGluZGV4PTMsCi0gICAgICBudW1iZXI9NSwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdkZXByZWNhdGVkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmRlcHJlY2F0ZWQnLCBpbmRleD00LAotICAgICAgbnVtYmVyPTMsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nd2VhaycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy53ZWFrJywgaW5kZXg9NSwKLSAgICAgIG51bWJlcj0xMCwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTYsCi0gICAgICBudW1iZXI9OTk5LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgICBfRklFTERPUFRJT05TX0NUWVBFLAotICAgIF9GSUVMRE9QVElPTlNfSlNUWVBFLAotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9VHJ1ZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKLSAgb25lb2ZzPVsKLSAgXSwKLSAgc2VyaWFsaXplZF9zdGFydD0zNDUyLAotICBzZXJpYWxpemVkX2VuZD0zODYwLAotKQotCi0KLV9FTlVNT1BUSU9OUyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0VudW1PcHRpb25zJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2FsbG93X2FsaWFzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMuYWxsb3dfYWxpYXMnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTIsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2RlcHJlY2F0ZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5kZXByZWNhdGVkJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1UcnVlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTM4NjMsCi0gIHNlcmlhbGl6ZWRfZW5kPTQwMDQsCi0pCi0KLQotX0VOVU1WQUxVRU9QVElPTlMgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdFbnVtVmFsdWVPcHRpb25zJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZGVwcmVjYXRlZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMuZGVwcmVjYXRlZCcsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1UcnVlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTQwMDYsCi0gIHNlcmlhbGl6ZWRfZW5kPTQxMzEsCi0pCi0KLQotX1NFUlZJQ0VPUFRJT05TID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nU2VydmljZU9wdGlvbnMnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZGVwcmVjYXRlZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLmRlcHJlY2F0ZWQnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTMzLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24nLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTk5OSwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1UcnVlLAotICBzeW50YXg9J3Byb3RvMicsCi0gIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTQxMzMsCi0gIHNlcmlhbGl6ZWRfZW5kPTQyNTYsCi0pCi0KLQotX01FVEhPRE9QVElPTlMgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdNZXRob2RPcHRpb25zJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZGVwcmVjYXRlZCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuZGVwcmVjYXRlZCcsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MzMsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9VHJ1ZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKLSAgb25lb2ZzPVsKLSAgXSwKLSAgc2VyaWFsaXplZF9zdGFydD00MjU4LAotICBzZXJpYWxpemVkX2VuZD00MzgwLAotKQotCi0KLV9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJUID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nTmFtZVBhcnQnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0JywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSduYW1lX3BhcnQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCcsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9X2IoIiIpLmRlY29kZSgndXRmLTgnKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdpc19leHRlbnNpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0LmlzX2V4dGVuc2lvbicsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIHN5bnRheD0ncHJvdG8yJywKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgb25lb2ZzPVsKLSAgXSwKLSAgc2VyaWFsaXplZF9zdGFydD00NjE4LAotICBzZXJpYWxpemVkX2VuZD00NjY5LAotKQotCi1fVU5JTlRFUlBSRVRFRE9QVElPTiA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1VuaW50ZXJwcmV0ZWRPcHRpb24nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2lkZW50aWZpZXJfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUnLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTMsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPV9iKCIiKS5kZWNvZGUoJ3V0Zi04JyksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ncG9zaXRpdmVfaW50X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5wb3NpdGl2ZV9pbnRfdmFsdWUnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTQsIHR5cGU9NCwgY3BwX3R5cGU9NCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmVnYXRpdmVfaW50X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uZWdhdGl2ZV9pbnRfdmFsdWUnLCBpbmRleD0zLAotICAgICAgbnVtYmVyPTUsIHR5cGU9MywgY3BwX3R5cGU9MiwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZG91YmxlX3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5kb3VibGVfdmFsdWUnLCBpbmRleD00LAotICAgICAgbnVtYmVyPTYsIHR5cGU9MSwgY3BwX3R5cGU9NSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPWZsb2F0KDApLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3N0cmluZ192YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlJywgaW5kZXg9NSwKLSAgICAgIG51bWJlcj03LCB0eXBlPTEyLCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9X2IoIiIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2FnZ3JlZ2F0ZV92YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlJywgaW5kZXg9NiwKLSAgICAgIG51bWJlcj04LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtfVU5JTlRFUlBSRVRFRE9QVElPTl9OQU1FUEFSVCwgXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTQzODMsCi0gIHNlcmlhbGl6ZWRfZW5kPTQ2NjksCi0pCi0KLQotX1NPVVJDRUNPREVJTkZPX0xPQ0FUSU9OID0gX2Rlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nTG9jYXRpb24nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbicsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ncGF0aCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3NwYW4nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdsZWFkaW5nX2NvbW1lbnRzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cycsIGluZGV4PTIsCi0gICAgICBudW1iZXI9MywgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9X2IoIiIpLmRlY29kZSgndXRmLTgnKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd0cmFpbGluZ19jb21tZW50cycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzJywgaW5kZXg9MywKLSAgICAgIG51bWJlcj00LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzJywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj02LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTQ3NTEsCi0gIHNlcmlhbGl6ZWRfZW5kPTQ4ODUsCi0pCi0KLV9TT1VSQ0VDT0RFSU5GTyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1NvdXJjZUNvZGVJbmZvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8nLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2xvY2F0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24nLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W19TT1VSQ0VDT0RFSU5GT19MT0NBVElPTiwgXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTQ2NzIsCi0gIHNlcmlhbGl6ZWRfZW5kPTQ4ODUsCi0pCi0KLQotX0dFTkVSQVRFRENPREVJTkZPX0FOTk9UQVRJT04gPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdBbm5vdGF0aW9uJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbicsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ncGF0aCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCcsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nc291cmNlX2ZpbGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1fYigiIikuZGVjb2RlKCd1dGYtOCcpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2JlZ2luJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5iZWdpbicsIGluZGV4PTIsCi0gICAgICBudW1iZXI9MywgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdlbmQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLmVuZCcsIGluZGV4PTMsCi0gICAgICBudW1iZXI9NCwgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTQ5NzYsCi0gIHNlcmlhbGl6ZWRfZW5kPTUwNTUsCi0pCi0KLV9HRU5FUkFURURDT0RFSU5GTyA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0dlbmVyYXRlZENvZGVJbmZvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8nLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIF9kZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2Fubm90YXRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtfR0VORVJBVEVEQ09ERUlORk9fQU5OT1RBVElPTiwgXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgc3ludGF4PSdwcm90bzInLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBvbmVvZnM9WwotICBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTQ4ODgsCi0gIHNlcmlhbGl6ZWRfZW5kPTUwNTUsCi0pCi0KLV9GSUxFREVTQ1JJUFRPUlNFVC5maWVsZHNfYnlfbmFtZVsnZmlsZSddLm1lc3NhZ2VfdHlwZSA9IF9GSUxFREVTQ1JJUFRPUlBST1RPCi1fRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnbWVzc2FnZV90eXBlJ10ubWVzc2FnZV90eXBlID0gX0RFU0NSSVBUT1JQUk9UTwotX0ZJTEVERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2VudW1fdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCi1fRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnc2VydmljZSddLm1lc3NhZ2VfdHlwZSA9IF9TRVJWSUNFREVTQ1JJUFRPUlBST1RPCi1fRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZXh0ZW5zaW9uJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCi1fRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9GSUxFT1BUSU9OUwotX0ZJTEVERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ3NvdXJjZV9jb2RlX2luZm8nXS5tZXNzYWdlX3R5cGUgPSBfU09VUkNFQ09ERUlORk8KLV9ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OUkFOR0UuY29udGFpbmluZ190eXBlID0gX0RFU0NSSVBUT1JQUk9UTwotX0RFU0NSSVBUT1JQUk9UT19SRVNFUlZFRFJBTkdFLmNvbnRhaW5pbmdfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE8KLV9ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2ZpZWxkJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCi1fREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydleHRlbnNpb24nXS5tZXNzYWdlX3R5cGUgPSBfRklFTERERVNDUklQVE9SUFJPVE8KLV9ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ25lc3RlZF90eXBlJ10ubWVzc2FnZV90eXBlID0gX0RFU0NSSVBUT1JQUk9UTwotX0RFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZW51bV90eXBlJ10ubWVzc2FnZV90eXBlID0gX0VOVU1ERVNDUklQVE9SUFJPVE8KLV9ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2V4dGVuc2lvbl9yYW5nZSddLm1lc3NhZ2VfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OUkFOR0UKLV9ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ29uZW9mX2RlY2wnXS5tZXNzYWdlX3R5cGUgPSBfT05FT0ZERVNDUklQVE9SUFJPVE8KLV9ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ29wdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBfTUVTU0FHRU9QVElPTlMKLV9ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ3Jlc2VydmVkX3JhbmdlJ10ubWVzc2FnZV90eXBlID0gX0RFU0NSSVBUT1JQUk9UT19SRVNFUlZFRFJBTkdFCi1fRklFTERERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2xhYmVsJ10uZW51bV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMCi1fRklFTERERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ3R5cGUnXS5lbnVtX3R5cGUgPSBfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRQotX0ZJRUxEREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxET1BUSU9OUwotX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEUuY29udGFpbmluZ190eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCi1fRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUwuY29udGFpbmluZ190eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCi1fRU5VTURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsndmFsdWUnXS5tZXNzYWdlX3R5cGUgPSBfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPCi1fRU5VTURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNT1BUSU9OUwotX0VOVU1WQUxVRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNVkFMVUVPUFRJT05TCi1fU0VSVklDRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnbWV0aG9kJ10ubWVzc2FnZV90eXBlID0gX01FVEhPRERFU0NSSVBUT1JQUk9UTwotX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ29wdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBfU0VSVklDRU9QVElPTlMKLV9NRVRIT0RERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ29wdGlvbnMnXS5tZXNzYWdlX3R5cGUgPSBfTUVUSE9ET1BUSU9OUwotX0ZJTEVPUFRJT05TLmZpZWxkc19ieV9uYW1lWydvcHRpbWl6ZV9mb3InXS5lbnVtX3R5cGUgPSBfRklMRU9QVElPTlNfT1BUSU1JWkVNT0RFCi1fRklMRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KLV9GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUuY29udGFpbmluZ190eXBlID0gX0ZJTEVPUFRJT05TCi1fTUVTU0FHRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KLV9GSUVMRE9QVElPTlMuZmllbGRzX2J5X25hbWVbJ2N0eXBlJ10uZW51bV90eXBlID0gX0ZJRUxET1BUSU9OU19DVFlQRQotX0ZJRUxET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsnanN0eXBlJ10uZW51bV90eXBlID0gX0ZJRUxET1BUSU9OU19KU1RZUEUKLV9GSUVMRE9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KLV9GSUVMRE9QVElPTlNfQ1RZUEUuY29udGFpbmluZ190eXBlID0gX0ZJRUxET1BUSU9OUwotX0ZJRUxET1BUSU9OU19KU1RZUEUuY29udGFpbmluZ190eXBlID0gX0ZJRUxET1BUSU9OUwotX0VOVU1PUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCi1fRU5VTVZBTFVFT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgotX1NFUlZJQ0VPUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCi1fTUVUSE9ET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgotX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQuY29udGFpbmluZ190eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KLV9VTklOVEVSUFJFVEVET1BUSU9OLmZpZWxkc19ieV9uYW1lWyduYW1lJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQKLV9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTi5jb250YWluaW5nX3R5cGUgPSBfU09VUkNFQ09ERUlORk8KLV9TT1VSQ0VDT0RFSU5GTy5maWVsZHNfYnlfbmFtZVsnbG9jYXRpb24nXS5tZXNzYWdlX3R5cGUgPSBfU09VUkNFQ09ERUlORk9fTE9DQVRJT04KLV9HRU5FUkFURURDT0RFSU5GT19BTk5PVEFUSU9OLmNvbnRhaW5pbmdfdHlwZSA9IF9HRU5FUkFURURDT0RFSU5GTwotX0dFTkVSQVRFRENPREVJTkZPLmZpZWxkc19ieV9uYW1lWydhbm5vdGF0aW9uJ10ubWVzc2FnZV90eXBlID0gX0dFTkVSQVRFRENPREVJTkZPX0FOTk9UQVRJT04KLURFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWxlRGVzY3JpcHRvclNldCddID0gX0ZJTEVERVNDUklQVE9SU0VUCi1ERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRmlsZURlc2NyaXB0b3JQcm90byddID0gX0ZJTEVERVNDUklQVE9SUFJPVE8KLURFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydEZXNjcmlwdG9yUHJvdG8nXSA9IF9ERVNDUklQVE9SUFJPVE8KLURFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWVsZERlc2NyaXB0b3JQcm90byddID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCi1ERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnT25lb2ZEZXNjcmlwdG9yUHJvdG8nXSA9IF9PTkVPRkRFU0NSSVBUT1JQUk9UTwotREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0VudW1EZXNjcmlwdG9yUHJvdG8nXSA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCi1ERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJ10gPSBfRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPCi1ERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnU2VydmljZURlc2NyaXB0b3JQcm90byddID0gX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8KLURFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydNZXRob2REZXNjcmlwdG9yUHJvdG8nXSA9IF9NRVRIT0RERVNDUklQVE9SUFJPVE8KLURFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydGaWxlT3B0aW9ucyddID0gX0ZJTEVPUFRJT05TCi1ERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnTWVzc2FnZU9wdGlvbnMnXSA9IF9NRVNTQUdFT1BUSU9OUwotREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0ZpZWxkT3B0aW9ucyddID0gX0ZJRUxET1BUSU9OUwotREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0VudW1PcHRpb25zJ10gPSBfRU5VTU9QVElPTlMKLURFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydFbnVtVmFsdWVPcHRpb25zJ10gPSBfRU5VTVZBTFVFT1BUSU9OUwotREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ1NlcnZpY2VPcHRpb25zJ10gPSBfU0VSVklDRU9QVElPTlMKLURFU0NSSVBUT1IubWVzc2FnZV90eXBlc19ieV9uYW1lWydNZXRob2RPcHRpb25zJ10gPSBfTUVUSE9ET1BUSU9OUwotREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ1VuaW50ZXJwcmV0ZWRPcHRpb24nXSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCi1ERVNDUklQVE9SLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnU291cmNlQ29kZUluZm8nXSA9IF9TT1VSQ0VDT0RFSU5GTwotREVTQ1JJUFRPUi5tZXNzYWdlX3R5cGVzX2J5X25hbWVbJ0dlbmVyYXRlZENvZGVJbmZvJ10gPSBfR0VORVJBVEVEQ09ERUlORk8KLQotRmlsZURlc2NyaXB0b3JTZXQgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdGaWxlRGVzY3JpcHRvclNldCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0gIERFU0NSSVBUT1IgPSBfRklMRURFU0NSSVBUT1JTRVQsCi0gIF9fbW9kdWxlX18gPSAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJwotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShGaWxlRGVzY3JpcHRvclNldCkKLQotRmlsZURlc2NyaXB0b3JQcm90byA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0ZpbGVEZXNjcmlwdG9yUHJvdG8nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX0ZJTEVERVNDUklQVE9SUFJPVE8sCi0gIF9fbW9kdWxlX18gPSAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJwotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKLSAgKSkKLV9zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEZpbGVEZXNjcmlwdG9yUHJvdG8pCi0KLURlc2NyaXB0b3JQcm90byA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0Rlc2NyaXB0b3JQcm90bycsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0KLSAgRXh0ZW5zaW9uUmFuZ2UgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdFeHRlbnNpb25SYW5nZScsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0gICAgREVTQ1JJUFRPUiA9IF9ERVNDUklQVE9SUFJPVE9fRVhURU5TSU9OUkFOR0UsCi0gICAgX19tb2R1bGVfXyA9ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCi0gICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKLSAgICApKQotICAsCi0KLSAgUmVzZXJ2ZWRSYW5nZSA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ1Jlc2VydmVkUmFuZ2UnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICAgIERFU0NSSVBUT1IgPSBfREVTQ1JJUFRPUlBST1RPX1JFU0VSVkVEUkFOR0UsCi0gICAgX19tb2R1bGVfXyA9ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCi0gICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQotICAgICkpCi0gICwKLSAgREVTQ1JJUFRPUiA9IF9ERVNDUklQVE9SUFJPVE8sCi0gIF9fbW9kdWxlX18gPSAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJwotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQotICApKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRGVzY3JpcHRvclByb3RvKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0KLUZpZWxkRGVzY3JpcHRvclByb3RvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRmllbGREZXNjcmlwdG9yUHJvdG8nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotICApKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRmllbGREZXNjcmlwdG9yUHJvdG8pCi0KLU9uZW9mRGVzY3JpcHRvclByb3RvID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnT25lb2ZEZXNjcmlwdG9yUHJvdG8nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX09ORU9GREVTQ1JJUFRPUlBST1RPLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotICApKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoT25lb2ZEZXNjcmlwdG9yUHJvdG8pCi0KLUVudW1EZXNjcmlwdG9yUHJvdG8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdFbnVtRGVzY3JpcHRvclByb3RvJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgZGljdCgKLSAgREVTQ1JJUFRPUiA9IF9FTlVNREVTQ1JJUFRPUlBST1RPLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShFbnVtRGVzY3JpcHRvclByb3RvKQotCi1FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX0VOVU1WQUxVRURFU0NSSVBUT1JQUk9UTywKLSAgX19tb2R1bGVfXyA9ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi0KLVNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdTZXJ2aWNlRGVzY3JpcHRvclByb3RvJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgZGljdCgKLSAgREVTQ1JJUFRPUiA9IF9TRVJWSUNFREVTQ1JJUFRPUlBST1RPLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShTZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotCi1NZXRob2REZXNjcmlwdG9yUHJvdG8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNZXRob2REZXNjcmlwdG9yUHJvdG8nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX01FVEhPRERFU0NSSVBUT1JQUk9UTywKLSAgX19tb2R1bGVfXyA9ICdnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvcl9wYjInCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShNZXRob2REZXNjcmlwdG9yUHJvdG8pCi0KLUZpbGVPcHRpb25zID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnRmlsZU9wdGlvbnMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX0ZJTEVPUFRJT05TLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICApKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoRmlsZU9wdGlvbnMpCi0KLU1lc3NhZ2VPcHRpb25zID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnTWVzc2FnZU9wdGlvbnMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX01FU1NBR0VPUFRJT05TLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotICApKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoTWVzc2FnZU9wdGlvbnMpCi0KLUZpZWxkT3B0aW9ucyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0ZpZWxkT3B0aW9ucycsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0gIERFU0NSSVBUT1IgPSBfRklFTERPUFRJT05TLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKLSAgKSkKLV9zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEZpZWxkT3B0aW9ucykKLQotRW51bU9wdGlvbnMgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdFbnVtT3B0aW9ucycsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0gIERFU0NSSVBUT1IgPSBfRU5VTU9QVElPTlMsCi0gIF9fbW9kdWxlX18gPSAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJwotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShFbnVtT3B0aW9ucykKLQotRW51bVZhbHVlT3B0aW9ucyA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0VudW1WYWx1ZU9wdGlvbnMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX0VOVU1WQUxVRU9QVElPTlMsCi0gIF9fbW9kdWxlX18gPSAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJwotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKLSAgKSkKLV9zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEVudW1WYWx1ZU9wdGlvbnMpCi0KLVNlcnZpY2VPcHRpb25zID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnU2VydmljZU9wdGlvbnMnLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICBERVNDUklQVE9SID0gX1NFUlZJQ0VPUFRJT05TLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotICApKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU2VydmljZU9wdGlvbnMpCi0KLU1ldGhvZE9wdGlvbnMgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdNZXRob2RPcHRpb25zJywgKF9tZXNzYWdlLk1lc3NhZ2UsKSwgZGljdCgKLSAgREVTQ1JJUFRPUiA9IF9NRVRIT0RPUFRJT05TLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShNZXRob2RPcHRpb25zKQotCi1VbmludGVycHJldGVkT3B0aW9uID0gX3JlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgnVW5pbnRlcnByZXRlZE9wdGlvbicsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0KLSAgTmFtZVBhcnQgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdOYW1lUGFydCcsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0gICAgREVTQ1JJUFRPUiA9IF9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJULAotICAgIF9fbW9kdWxlX18gPSAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJwotICAgICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICAgICkpCi0gICwKLSAgREVTQ1JJUFRPUiA9IF9VTklOVEVSUFJFVEVET1BUSU9OLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShVbmludGVycHJldGVkT3B0aW9uKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKLQotU291cmNlQ29kZUluZm8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdTb3VyY2VDb2RlSW5mbycsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0KLSAgTG9jYXRpb24gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdMb2NhdGlvbicsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0gICAgREVTQ1JJUFRPUiA9IF9TT1VSQ0VDT0RFSU5GT19MT0NBVElPTiwKLSAgICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCi0gICAgKSkKLSAgLAotICBERVNDUklQVE9SID0gX1NPVVJDRUNPREVJTkZPLAotICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQotICApKQotX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoU291cmNlQ29kZUluZm8pCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLQotR2VuZXJhdGVkQ29kZUluZm8gPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCdHZW5lcmF0ZWRDb2RlSW5mbycsIChfbWVzc2FnZS5NZXNzYWdlLCksIGRpY3QoCi0KLSAgQW5ub3RhdGlvbiA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJ0Fubm90YXRpb24nLCAoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KAotICAgIERFU0NSSVBUT1IgPSBfR0VORVJBVEVEQ09ERUlORk9fQU5OT1RBVElPTiwKLSAgICBfX21vZHVsZV9fID0gJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3BiMicKLSAgICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLSAgICApKQotICAsCi0gIERFU0NSSVBUT1IgPSBfR0VORVJBVEVEQ09ERUlORk8sCi0gIF9fbW9kdWxlX18gPSAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJwotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi0gICkpCi1fc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZShHZW5lcmF0ZWRDb2RlSW5mbykKLV9zeW1fZGIuUmVnaXN0ZXJNZXNzYWdlKEdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0KLQotIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobW9kdWxlX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3Bvb2wucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfcG9vbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjBhMzM3MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfcG9vbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDc1MSArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlByb3ZpZGVzIERlc2NyaXB0b3JQb29sIHRvIHVzZSBhcyBhIGNvbnRhaW5lciBmb3IgcHJvdG8yIGRlc2NyaXB0b3JzLgotCi1UaGUgRGVzY3JpcHRvclBvb2wgaXMgdXNlZCBpbiBjb25qZWN0aW9uIHdpdGggYSBEZXNjcmlwdG9yRGF0YWJhc2UgdG8gbWFpbnRhaW4KLWEgY29sbGVjdGlvbiBvZiBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvcnMgZm9yIHVzZSB3aGVuIGR5bmFtaWNhbGx5IGNyZWF0aW5nCi1tZXNzYWdlIHR5cGVzIGF0IHJ1bnRpbWUuCi0KLUZvciBtb3N0IGFwcGxpY2F0aW9ucyBwcm90b2NvbCBidWZmZXJzIHNob3VsZCBiZSB1c2VkIHZpYSBtb2R1bGVzIGdlbmVyYXRlZCBieQotdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlciB0b29sLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQgd2hlbiB0aGUgdHlwZSBvZgotcHJvdG9jb2wgYnVmZmVycyB1c2VkIGluIGFuIGFwcGxpY2F0aW9uIG9yIGxpYnJhcnkgY2Fubm90IGJlIHByZWRldGVybWluZWQuCi0KLUJlbG93IGlzIGEgc3RyYWlnaHRmb3J3YXJkIGV4YW1wbGUgb24gaG93IHRvIHVzZSB0aGlzIGNsYXNzOgotCi0gIHBvb2wgPSBEZXNjcmlwdG9yUG9vbCgpCi0gIGZpbGVfZGVzY3JpcHRvcl9wcm90b3MgPSBbIC4uLiBdCi0gIGZvciBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gaW4gZmlsZV9kZXNjcmlwdG9yX3Byb3RvczoKLSAgICBwb29sLkFkZChmaWxlX2Rlc2NyaXB0b3JfcHJvdG8pCi0gIG15X21lc3NhZ2VfZGVzY3JpcHRvciA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCdzb21lLnBhY2thZ2UuTWVzc2FnZVR5cGUnKQotCi1UaGUgbWVzc2FnZSBkZXNjcmlwdG9yIGNhbiBiZSB1c2VkIGluIGNvbmp1bmN0aW9uIHdpdGggdGhlIG1lc3NhZ2VfZmFjdG9yeQotbW9kdWxlIGluIG9yZGVyIHRvIGNyZWF0ZSBhIHByb3RvY29sIGJ1ZmZlciBjbGFzcyB0aGF0IGNhbiBiZSBlbmNvZGVkIGFuZAotZGVjb2RlZC4KLQotSWYgeW91IHdhbnQgdG8gZ2V0IGEgUHl0aG9uIGNsYXNzIGZvciB0aGUgc3BlY2lmaWVkIHByb3RvLCB1c2UgdGhlCi1oZWxwZXIgZnVuY3Rpb25zIGluc2lkZSBnb29nbGUucHJvdG9idWYubWVzc2FnZV9mYWN0b3J5Ci1kaXJlY3RseSBpbnN0ZWFkIG9mIHRoaXMgY2xhc3MuCi0iIiIKLQotX19hdXRob3JfXyA9ICdtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpJwotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfZGF0YWJhc2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2VuY29kaW5nCi0KLQotX1VTRV9DX0RFU0NSSVBUT1JTID0gZGVzY3JpcHRvci5fVVNFX0NfREVTQ1JJUFRPUlMKLQotCi1kZWYgX05vcm1hbGl6ZUZ1bGx5UXVhbGlmaWVkTmFtZShuYW1lKToKLSAgIiIiUmVtb3ZlIGxlYWRpbmcgcGVyaW9kIGZyb20gZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZS4KLQotICBEdWUgdG8gYi8xMzg2MDM1MSBpbiBkZXNjcmlwdG9yX2RhdGFiYXNlLnB5LCB0eXBlcyBpbiB0aGUgcm9vdCBuYW1lc3BhY2UgYXJlCi0gIGdlbmVyYXRlZCB3aXRoIGEgbGVhZGluZyBwZXJpb2QuIFRoaXMgZnVuY3Rpb24gcmVtb3ZlcyB0aGF0IHByZWZpeC4KLQotICBBcmdzOgotICAgIG5hbWU6IEEgc3RyLCB0aGUgZnVsbHktcXVhbGlmaWVkIHN5bWJvbCBuYW1lLgotCi0gIFJldHVybnM6Ci0gICAgQSBzdHIsIHRoZSBub3JtYWxpemVkIGZ1bGx5LXF1YWxpZmllZCBzeW1ib2wgbmFtZS4KLSAgIiIiCi0gIHJldHVybiBuYW1lLmxzdHJpcCgnLicpCi0KLQotY2xhc3MgRGVzY3JpcHRvclBvb2wob2JqZWN0KToKLSAgIiIiQSBjb2xsZWN0aW9uIG9mIHByb3RvYnVmcyBkeW5hbWljYWxseSBjb25zdHJ1Y3RlZCBieSBkZXNjcmlwdG9yIHByb3Rvcy4iIiIKLQotICBpZiBfVVNFX0NfREVTQ1JJUFRPUlM6Ci0KLSAgICBkZWYgX19uZXdfXyhjbHMsIGRlc2NyaXB0b3JfZGI9Tm9uZSk6Ci0gICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCi0gICAgICByZXR1cm4gZGVzY3JpcHRvci5fbWVzc2FnZS5EZXNjcmlwdG9yUG9vbChkZXNjcmlwdG9yX2RiKQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBkZXNjcmlwdG9yX2RiPU5vbmUpOgotICAgICIiIkluaXRpYWxpemVzIGEgUG9vbCBvZiBwcm90byBidWZmcy4KLQotICAgIFRoZSBkZXNjcmlwdG9yX2RiIGFyZ3VtZW50IHRvIHRoZSBjb25zdHJ1Y3RvciBpcyBwcm92aWRlZCB0byBhbGxvdwotICAgIHNwZWNpYWxpemVkIGZpbGUgZGVzY3JpcHRvciBwcm90byBsb29rdXAgY29kZSB0byBiZSB0cmlnZ2VyZWQgb24gZGVtYW5kLiBBbgotICAgIGV4YW1wbGUgd291bGQgYmUgYW4gaW1wbGVtZW50YXRpb24gd2hpY2ggd2lsbCByZWFkIGFuZCBjb21waWxlIGEgZmlsZQotICAgIHNwZWNpZmllZCBpbiBhIGNhbGwgdG8gRmluZEZpbGVCeU5hbWUoKSBhbmQgbm90IHJlcXVpcmUgdGhlIGNhbGwgdG8gQWRkKCkKLSAgICBhdCBhbGwuIFJlc3VsdHMgZnJvbSB0aGlzIGRhdGFiYXNlIHdpbGwgYmUgY2FjaGVkIGludGVybmFsbHkgaGVyZSBhcyB3ZWxsLgotCi0gICAgQXJnczoKLSAgICAgIGRlc2NyaXB0b3JfZGI6IEEgc2Vjb25kYXJ5IHNvdXJjZSBvZiBmaWxlIGRlc2NyaXB0b3JzLgotICAgICIiIgotCi0gICAgc2VsZi5faW50ZXJuYWxfZGIgPSBkZXNjcmlwdG9yX2RhdGFiYXNlLkRlc2NyaXB0b3JEYXRhYmFzZSgpCi0gICAgc2VsZi5fZGVzY3JpcHRvcl9kYiA9IGRlc2NyaXB0b3JfZGIKLSAgICBzZWxmLl9kZXNjcmlwdG9ycyA9IHt9Ci0gICAgc2VsZi5fZW51bV9kZXNjcmlwdG9ycyA9IHt9Ci0gICAgc2VsZi5fZmlsZV9kZXNjcmlwdG9ycyA9IHt9Ci0KLSAgZGVmIEFkZChzZWxmLCBmaWxlX2Rlc2NfcHJvdG8pOgotICAgICIiIkFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW5kIGl0cyB0eXBlcyB0byB0aGlzIHBvb2wuCi0KLSAgICBBcmdzOgotICAgICAgZmlsZV9kZXNjX3Byb3RvOiBUaGUgRmlsZURlc2NyaXB0b3JQcm90byB0byBhZGQuCi0gICAgIiIiCi0KLSAgICBzZWxmLl9pbnRlcm5hbF9kYi5BZGQoZmlsZV9kZXNjX3Byb3RvKQotCi0gIGRlZiBBZGRTZXJpYWxpemVkRmlsZShzZWxmLCBzZXJpYWxpemVkX2ZpbGVfZGVzY19wcm90byk6Ci0gICAgIiIiQWRkcyB0aGUgRmlsZURlc2NyaXB0b3JQcm90byBhbmQgaXRzIHR5cGVzIHRvIHRoaXMgcG9vbC4KLQotICAgIEFyZ3M6Ci0gICAgICBzZXJpYWxpemVkX2ZpbGVfZGVzY19wcm90bzogQSBieXRlcyBzdHJpbmcsIHNlcmlhbGl6YXRpb24gb2YgdGhlCi0gICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gYWRkLgotICAgICIiIgotCi0gICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAotICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotICAgIGZpbGVfZGVzY19wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKLSAgICAgICAgc2VyaWFsaXplZF9maWxlX2Rlc2NfcHJvdG8pCi0gICAgc2VsZi5BZGQoZmlsZV9kZXNjX3Byb3RvKQotCi0gIGRlZiBBZGREZXNjcmlwdG9yKHNlbGYsIGRlc2MpOgotICAgICIiIkFkZHMgYSBEZXNjcmlwdG9yIHRvIHRoZSBwb29sLCBub24tcmVjdXJzaXZlbHkuCi0KLSAgICBJZiB0aGUgRGVzY3JpcHRvciBjb250YWlucyBuZXN0ZWQgbWVzc2FnZXMgb3IgZW51bXMsIHRoZSBjYWxsZXIgbXVzdAotICAgIGV4cGxpY2l0bHkgcmVnaXN0ZXIgdGhlbS4gVGhpcyBtZXRob2QgYWxzbyByZWdpc3RlcnMgdGhlIEZpbGVEZXNjcmlwdG9yCi0gICAgYXNzb2NpYXRlZCB3aXRoIHRoZSBtZXNzYWdlLgotCi0gICAgQXJnczoKLSAgICAgIGRlc2M6IEEgRGVzY3JpcHRvci4KLSAgICAiIiIKLSAgICBpZiBub3QgaXNpbnN0YW5jZShkZXNjLCBkZXNjcmlwdG9yLkRlc2NyaXB0b3IpOgotICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBpbnN0YW5jZSBvZiBkZXNjcmlwdG9yLkRlc2NyaXB0b3IuJykKLQotICAgIHNlbGYuX2Rlc2NyaXB0b3JzW2Rlc2MuZnVsbF9uYW1lXSA9IGRlc2MKLSAgICBzZWxmLkFkZEZpbGVEZXNjcmlwdG9yKGRlc2MuZmlsZSkKLQotICBkZWYgQWRkRW51bURlc2NyaXB0b3Ioc2VsZiwgZW51bV9kZXNjKToKLSAgICAiIiJBZGRzIGFuIEVudW1EZXNjcmlwdG9yIHRvIHRoZSBwb29sLgotCi0gICAgVGhpcyBtZXRob2QgYWxzbyByZWdpc3RlcnMgdGhlIEZpbGVEZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgbWVzc2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICBlbnVtX2Rlc2M6IEFuIEVudW1EZXNjcmlwdG9yLgotICAgICIiIgotCi0gICAgaWYgbm90IGlzaW5zdGFuY2UoZW51bV9kZXNjLCBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKToKLSAgICAgIHJhaXNlIFR5cGVFcnJvcignRXhwZWN0ZWQgaW5zdGFuY2Ugb2YgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvci4nKQotCi0gICAgc2VsZi5fZW51bV9kZXNjcmlwdG9yc1tlbnVtX2Rlc2MuZnVsbF9uYW1lXSA9IGVudW1fZGVzYwotICAgIHNlbGYuQWRkRmlsZURlc2NyaXB0b3IoZW51bV9kZXNjLmZpbGUpCi0KLSAgZGVmIEFkZEZpbGVEZXNjcmlwdG9yKHNlbGYsIGZpbGVfZGVzYyk6Ci0gICAgIiIiQWRkcyBhIEZpbGVEZXNjcmlwdG9yIHRvIHRoZSBwb29sLCBub24tcmVjdXJzaXZlbHkuCi0KLSAgICBJZiB0aGUgRmlsZURlc2NyaXB0b3IgY29udGFpbnMgbWVzc2FnZXMgb3IgZW51bXMsIHRoZSBjYWxsZXIgbXVzdCBleHBsaWNpdGx5Ci0gICAgcmVnaXN0ZXIgdGhlbS4KLQotICAgIEFyZ3M6Ci0gICAgICBmaWxlX2Rlc2M6IEEgRmlsZURlc2NyaXB0b3IuCi0gICAgIiIiCi0KLSAgICBpZiBub3QgaXNpbnN0YW5jZShmaWxlX2Rlc2MsIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IpOgotICAgICAgcmFpc2UgVHlwZUVycm9yKCdFeHBlY3RlZCBpbnN0YW5jZSBvZiBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yLicpCi0gICAgc2VsZi5fZmlsZV9kZXNjcmlwdG9yc1tmaWxlX2Rlc2MubmFtZV0gPSBmaWxlX2Rlc2MKLQotICBkZWYgRmluZEZpbGVCeU5hbWUoc2VsZiwgZmlsZV9uYW1lKToKLSAgICAiIiJHZXRzIGEgRmlsZURlc2NyaXB0b3IgYnkgZmlsZSBuYW1lLgotCi0gICAgQXJnczoKLSAgICAgIGZpbGVfbmFtZTogVGhlIHBhdGggdG8gdGhlIGZpbGUgdG8gZ2V0IGEgZGVzY3JpcHRvciBmb3IuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBGaWxlRGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIGZpbGUuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBLZXlFcnJvcjogaWYgdGhlIGZpbGUgY2FuIG5vdCBiZSBmb3VuZCBpbiB0aGUgcG9vbC4KLSAgICAiIiIKLQotICAgIHRyeToKLSAgICAgIHJldHVybiBzZWxmLl9maWxlX2Rlc2NyaXB0b3JzW2ZpbGVfbmFtZV0KLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICBwYXNzCi0KLSAgICB0cnk6Ci0gICAgICBmaWxlX3Byb3RvID0gc2VsZi5faW50ZXJuYWxfZGIuRmluZEZpbGVCeU5hbWUoZmlsZV9uYW1lKQotICAgIGV4Y2VwdCBLZXlFcnJvciBhcyBlcnJvcjoKLSAgICAgIGlmIHNlbGYuX2Rlc2NyaXB0b3JfZGI6Ci0gICAgICAgIGZpbGVfcHJvdG8gPSBzZWxmLl9kZXNjcmlwdG9yX2RiLkZpbmRGaWxlQnlOYW1lKGZpbGVfbmFtZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIGVycm9yCi0gICAgaWYgbm90IGZpbGVfcHJvdG86Ci0gICAgICByYWlzZSBLZXlFcnJvcignQ2Fubm90IGZpbmQgYSBmaWxlIG5hbWVkICVzJyAlIGZpbGVfbmFtZSkKLSAgICByZXR1cm4gc2VsZi5fQ29udmVydEZpbGVQcm90b1RvRmlsZURlc2NyaXB0b3IoZmlsZV9wcm90bykKLQotICBkZWYgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHNlbGYsIHN5bWJvbCk6Ci0gICAgIiIiR2V0cyB0aGUgRmlsZURlc2NyaXB0b3IgZm9yIHRoZSBmaWxlIGNvbnRhaW5pbmcgdGhlIHNwZWNpZmllZCBzeW1ib2wuCi0KLSAgICBBcmdzOgotICAgICAgc3ltYm9sOiBUaGUgbmFtZSBvZiB0aGUgc3ltYm9sIHRvIHNlYXJjaCBmb3IuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBGaWxlRGVzY3JpcHRvciB0aGF0IGNvbnRhaW5zIHRoZSBzcGVjaWZpZWQgc3ltYm9sLgotCi0gICAgUmFpc2VzOgotICAgICAgS2V5RXJyb3I6IGlmIHRoZSBmaWxlIGNhbiBub3QgYmUgZm91bmQgaW4gdGhlIHBvb2wuCi0gICAgIiIiCi0KLSAgICBzeW1ib2wgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKHN5bWJvbCkKLSAgICB0cnk6Ci0gICAgICByZXR1cm4gc2VsZi5fZGVzY3JpcHRvcnNbc3ltYm9sXS5maWxlCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgcGFzcwotCi0gICAgdHJ5OgotICAgICAgcmV0dXJuIHNlbGYuX2VudW1fZGVzY3JpcHRvcnNbc3ltYm9sXS5maWxlCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgcGFzcwotCi0gICAgdHJ5OgotICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2ludGVybmFsX2RiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2wpCi0gICAgZXhjZXB0IEtleUVycm9yIGFzIGVycm9yOgotICAgICAgaWYgc2VsZi5fZGVzY3JpcHRvcl9kYjoKLSAgICAgICAgZmlsZV9wcm90byA9IHNlbGYuX2Rlc2NyaXB0b3JfZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIGVycm9yCi0gICAgaWYgbm90IGZpbGVfcHJvdG86Ci0gICAgICByYWlzZSBLZXlFcnJvcignQ2Fubm90IGZpbmQgYSBmaWxlIGNvbnRhaW5pbmcgJXMnICUgc3ltYm9sKQotICAgIHJldHVybiBzZWxmLl9Db252ZXJ0RmlsZVByb3RvVG9GaWxlRGVzY3JpcHRvcihmaWxlX3Byb3RvKQotCi0gIGRlZiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoc2VsZiwgZnVsbF9uYW1lKToKLSAgICAiIiJMb2FkcyB0aGUgbmFtZWQgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgotCi0gICAgQXJnczoKLSAgICAgIGZ1bGxfbmFtZTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciB0byBsb2FkLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgdHlwZS4KLSAgICAiIiIKLQotICAgIGZ1bGxfbmFtZSA9IF9Ob3JtYWxpemVGdWxseVF1YWxpZmllZE5hbWUoZnVsbF9uYW1lKQotICAgIGlmIGZ1bGxfbmFtZSBub3QgaW4gc2VsZi5fZGVzY3JpcHRvcnM6Ci0gICAgICBzZWxmLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChmdWxsX25hbWUpCi0gICAgcmV0dXJuIHNlbGYuX2Rlc2NyaXB0b3JzW2Z1bGxfbmFtZV0KLQotICBkZWYgRmluZEVudW1UeXBlQnlOYW1lKHNlbGYsIGZ1bGxfbmFtZSk6Ci0gICAgIiIiTG9hZHMgdGhlIG5hbWVkIGVudW0gZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgotCi0gICAgQXJnczoKLSAgICAgIGZ1bGxfbmFtZTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZW51bSBkZXNjcmlwdG9yIHRvIGxvYWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGVudW0gZGVzY3JpcHRvciBmb3IgdGhlIG5hbWVkIHR5cGUuCi0gICAgIiIiCi0KLSAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGxfbmFtZSkKLSAgICBpZiBmdWxsX25hbWUgbm90IGluIHNlbGYuX2VudW1fZGVzY3JpcHRvcnM6Ci0gICAgICBzZWxmLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChmdWxsX25hbWUpCi0gICAgcmV0dXJuIHNlbGYuX2VudW1fZGVzY3JpcHRvcnNbZnVsbF9uYW1lXQotCi0gIGRlZiBGaW5kRmllbGRCeU5hbWUoc2VsZiwgZnVsbF9uYW1lKToKLSAgICAiIiJMb2FkcyB0aGUgbmFtZWQgZmllbGQgZGVzY3JpcHRvciBmcm9tIHRoZSBwb29sLgotCi0gICAgQXJnczoKLSAgICAgIGZ1bGxfbmFtZTogVGhlIGZ1bGwgbmFtZSBvZiB0aGUgZmllbGQgZGVzY3JpcHRvciB0byBsb2FkLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBmaWVsZCBkZXNjcmlwdG9yIGZvciB0aGUgbmFtZWQgZmllbGQuCi0gICAgIiIiCi0gICAgZnVsbF9uYW1lID0gX05vcm1hbGl6ZUZ1bGx5UXVhbGlmaWVkTmFtZShmdWxsX25hbWUpCi0gICAgbWVzc2FnZV9uYW1lLCBfLCBmaWVsZF9uYW1lID0gZnVsbF9uYW1lLnJwYXJ0aXRpb24oJy4nKQotICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IHNlbGYuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKG1lc3NhZ2VfbmFtZSkKLSAgICByZXR1cm4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCi0KLSAgZGVmIEZpbmRFeHRlbnNpb25CeU5hbWUoc2VsZiwgZnVsbF9uYW1lKToKLSAgICAiIiJMb2FkcyB0aGUgbmFtZWQgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgZnJvbSB0aGUgcG9vbC4KLQotICAgIEFyZ3M6Ci0gICAgICBmdWxsX25hbWU6IFRoZSBmdWxsIG5hbWUgb2YgdGhlIGV4dGVuc2lvbiBkZXNjcmlwdG9yIHRvIGxvYWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBGaWVsZERlc2NyaXB0b3IsIGRlc2NyaWJpbmcgdGhlIG5hbWVkIGV4dGVuc2lvbi4KLSAgICAiIiIKLSAgICBmdWxsX25hbWUgPSBfTm9ybWFsaXplRnVsbHlRdWFsaWZpZWROYW1lKGZ1bGxfbmFtZSkKLSAgICBtZXNzYWdlX25hbWUsIF8sIGV4dGVuc2lvbl9uYW1lID0gZnVsbF9uYW1lLnJwYXJ0aXRpb24oJy4nKQotICAgIHRyeToKLSAgICAgICMgTW9zdCBleHRlbnNpb25zIGFyZSBuZXN0ZWQgaW5zaWRlIGEgbWVzc2FnZS4KLSAgICAgIHNjb3BlID0gc2VsZi5GaW5kTWVzc2FnZVR5cGVCeU5hbWUobWVzc2FnZV9uYW1lKQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICMgU29tZSBleHRlbnNpb25zIGFyZSBkZWZpbmVkIGF0IGZpbGUgc2NvcGUuCi0gICAgICBzY29wZSA9IHNlbGYuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGZ1bGxfbmFtZSkKLSAgICByZXR1cm4gc2NvcGUuZXh0ZW5zaW9uc19ieV9uYW1lW2V4dGVuc2lvbl9uYW1lXQotCi0gIGRlZiBfQ29udmVydEZpbGVQcm90b1RvRmlsZURlc2NyaXB0b3Ioc2VsZiwgZmlsZV9wcm90byk6Ci0gICAgIiIiQ3JlYXRlcyBhIEZpbGVEZXNjcmlwdG9yIGZyb20gYSBwcm90byBvciByZXR1cm5zIGEgY2FjaGVkIGNvcHkuCi0KLSAgICBUaGlzIG1ldGhvZCBhbHNvIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgbG9hZGluZyBhbGwgdGhlIHN5bWJvbHMgZm91bmQgaW4KLSAgICB0aGUgZmlsZSBpbnRvIHRoZSBhcHByb3ByaWF0ZSBkaWN0aW9uYXJpZXMgaW4gdGhlIHBvb2wuCi0KLSAgICBBcmdzOgotICAgICAgZmlsZV9wcm90bzogVGhlIHByb3RvIHRvIGNvbnZlcnQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBGaWxlRGVzY3JpcHRvciBtYXRjaGluZyB0aGUgcGFzc2VkIGluIHByb3RvLgotICAgICIiIgotCi0gICAgaWYgZmlsZV9wcm90by5uYW1lIG5vdCBpbiBzZWxmLl9maWxlX2Rlc2NyaXB0b3JzOgotICAgICAgYnVpbHRfZGVwcyA9IGxpc3Qoc2VsZi5fR2V0RGVwcyhmaWxlX3Byb3RvLmRlcGVuZGVuY3kpKQotICAgICAgZGlyZWN0X2RlcHMgPSBbc2VsZi5GaW5kRmlsZUJ5TmFtZShuKSBmb3IgbiBpbiBmaWxlX3Byb3RvLmRlcGVuZGVuY3ldCi0gICAgICBwdWJsaWNfZGVwcyA9IFtkaXJlY3RfZGVwc1tpXSBmb3IgaSBpbiBmaWxlX3Byb3RvLnB1YmxpY19kZXBlbmRlbmN5XQotCi0gICAgICBmaWxlX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAotICAgICAgICAgIHBvb2w9c2VsZiwKLSAgICAgICAgICBuYW1lPWZpbGVfcHJvdG8ubmFtZSwKLSAgICAgICAgICBwYWNrYWdlPWZpbGVfcHJvdG8ucGFja2FnZSwKLSAgICAgICAgICBzeW50YXg9ZmlsZV9wcm90by5zeW50YXgsCi0gICAgICAgICAgb3B0aW9ucz1maWxlX3Byb3RvLm9wdGlvbnMsCi0gICAgICAgICAgc2VyaWFsaXplZF9wYj1maWxlX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCksCi0gICAgICAgICAgZGVwZW5kZW5jaWVzPWRpcmVjdF9kZXBzLAotICAgICAgICAgIHB1YmxpY19kZXBlbmRlbmNpZXM9cHVibGljX2RlcHMpCi0gICAgICBpZiBfVVNFX0NfREVTQ1JJUFRPUlM6Ci0gICAgICAgICMgV2hlbiB1c2luZyBDKysgZGVzY3JpcHRvcnMsIGFsbCBvYmplY3RzIGRlZmluZWQgaW4gdGhlIGZpbGUgd2VyZSBhZGRlZAotICAgICAgICAjIHRvIHRoZSBDKysgZGF0YWJhc2Ugd2hlbiB0aGUgRmlsZURlc2NyaXB0b3Igd2FzIGJ1aWx0IGFib3ZlLgotICAgICAgICAjIEp1c3QgYWRkIHRoZW0gdG8gdGhpcyBkZXNjcmlwdG9yIHBvb2wuCi0gICAgICAgIGRlZiBfQWRkTWVzc2FnZURlc2NyaXB0b3IobWVzc2FnZV9kZXNjKToKLSAgICAgICAgICBzZWxmLl9kZXNjcmlwdG9yc1ttZXNzYWdlX2Rlc2MuZnVsbF9uYW1lXSA9IG1lc3NhZ2VfZGVzYwotICAgICAgICAgIGZvciBuZXN0ZWQgaW4gbWVzc2FnZV9kZXNjLm5lc3RlZF90eXBlczoKLSAgICAgICAgICAgIF9BZGRNZXNzYWdlRGVzY3JpcHRvcihuZXN0ZWQpCi0gICAgICAgICAgZm9yIGVudW1fdHlwZSBpbiBtZXNzYWdlX2Rlc2MuZW51bV90eXBlczoKLSAgICAgICAgICAgIF9BZGRFbnVtRGVzY3JpcHRvcihlbnVtX3R5cGUpCi0gICAgICAgIGRlZiBfQWRkRW51bURlc2NyaXB0b3IoZW51bV9kZXNjKToKLSAgICAgICAgICBzZWxmLl9lbnVtX2Rlc2NyaXB0b3JzW2VudW1fZGVzYy5mdWxsX25hbWVdID0gZW51bV9kZXNjCi0gICAgICAgIGZvciBtZXNzYWdlX3R5cGUgaW4gZmlsZV9kZXNjcmlwdG9yLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZS52YWx1ZXMoKToKLSAgICAgICAgICBfQWRkTWVzc2FnZURlc2NyaXB0b3IobWVzc2FnZV90eXBlKQotICAgICAgICBmb3IgZW51bV90eXBlIGluIGZpbGVfZGVzY3JpcHRvci5lbnVtX3R5cGVzX2J5X25hbWUudmFsdWVzKCk6Ci0gICAgICAgICAgX0FkZEVudW1EZXNjcmlwdG9yKGVudW1fdHlwZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNjb3BlID0ge30KLQotICAgICAgICAjIFRoaXMgbG9vcCBleHRyYWN0cyBhbGwgdGhlIG1lc3NhZ2UgYW5kIGVudW0gdHlwZXMgZnJvbSBhbGwgdGhlCi0gICAgICAgICMgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlX3Byb3RvLiBUaGlzIGlzIG5lY2Vzc2FyeSB0byBjcmVhdGUgdGhlCi0gICAgICAgICMgc2NvcGUgb2YgYXZhaWxhYmxlIG1lc3NhZ2UgdHlwZXMgd2hlbiBkZWZpbmluZyB0aGUgcGFzc2VkIGluCi0gICAgICAgICMgZmlsZSBwcm90by4KLSAgICAgICAgZm9yIGRlcGVuZGVuY3kgaW4gYnVpbHRfZGVwczoKLSAgICAgICAgICBzY29wZS51cGRhdGUoc2VsZi5fRXh0cmFjdFN5bWJvbHMoCi0gICAgICAgICAgICAgIGRlcGVuZGVuY3kubWVzc2FnZV90eXBlc19ieV9uYW1lLnZhbHVlcygpKSkKLSAgICAgICAgICBzY29wZS51cGRhdGUoKF9QcmVmaXhXaXRoRG90KGVudW0uZnVsbF9uYW1lKSwgZW51bSkKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGVudW0gaW4gZGVwZW5kZW5jeS5lbnVtX3R5cGVzX2J5X25hbWUudmFsdWVzKCkpCi0KLSAgICAgICAgZm9yIG1lc3NhZ2VfdHlwZSBpbiBmaWxlX3Byb3RvLm1lc3NhZ2VfdHlwZToKLSAgICAgICAgICBtZXNzYWdlX2Rlc2MgPSBzZWxmLl9Db252ZXJ0TWVzc2FnZURlc2NyaXB0b3IoCi0gICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSwgZmlsZV9wcm90by5wYWNrYWdlLCBmaWxlX2Rlc2NyaXB0b3IsIHNjb3BlLAotICAgICAgICAgICAgICBmaWxlX3Byb3RvLnN5bnRheCkKLSAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlc19ieV9uYW1lW21lc3NhZ2VfZGVzYy5uYW1lXSA9ICgKLSAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjKQotCi0gICAgICAgIGZvciBlbnVtX3R5cGUgaW4gZmlsZV9wcm90by5lbnVtX3R5cGU6Ci0gICAgICAgICAgZmlsZV9kZXNjcmlwdG9yLmVudW1fdHlwZXNfYnlfbmFtZVtlbnVtX3R5cGUubmFtZV0gPSAoCi0gICAgICAgICAgICAgIHNlbGYuX0NvbnZlcnRFbnVtRGVzY3JpcHRvcihlbnVtX3R5cGUsIGZpbGVfcHJvdG8ucGFja2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvciwgTm9uZSwgc2NvcGUpKQotCi0gICAgICAgIGZvciBpbmRleCwgZXh0ZW5zaW9uX3Byb3RvIGluIGVudW1lcmF0ZShmaWxlX3Byb3RvLmV4dGVuc2lvbik6Ci0gICAgICAgICAgZXh0ZW5zaW9uX2Rlc2MgPSBzZWxmLl9NYWtlRmllbGREZXNjcmlwdG9yKAotICAgICAgICAgICAgICBleHRlbnNpb25fcHJvdG8sIGZpbGVfcHJvdG8ucGFja2FnZSwgaW5kZXgsIGlzX2V4dGVuc2lvbj1UcnVlKQotICAgICAgICAgIGV4dGVuc2lvbl9kZXNjLmNvbnRhaW5pbmdfdHlwZSA9IHNlbGYuX0dldFR5cGVGcm9tU2NvcGUoCi0gICAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci5wYWNrYWdlLCBleHRlbnNpb25fcHJvdG8uZXh0ZW5kZWUsIHNjb3BlKQotICAgICAgICAgIHNlbGYuX1NldEZpZWxkVHlwZShleHRlbnNpb25fcHJvdG8sIGV4dGVuc2lvbl9kZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci5wYWNrYWdlLCBzY29wZSkKLSAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uc19ieV9uYW1lW2V4dGVuc2lvbl9kZXNjLm5hbWVdID0gKAotICAgICAgICAgICAgICBleHRlbnNpb25fZGVzYykKLQotICAgICAgICBmb3IgZGVzY19wcm90byBpbiBmaWxlX3Byb3RvLm1lc3NhZ2VfdHlwZToKLSAgICAgICAgICBzZWxmLl9TZXRBbGxGaWVsZFR5cGVzKGZpbGVfcHJvdG8ucGFja2FnZSwgZGVzY19wcm90bywgc2NvcGUpCi0KLSAgICAgICAgaWYgZmlsZV9wcm90by5wYWNrYWdlOgotICAgICAgICAgIGRlc2NfcHJvdG9fcHJlZml4ID0gX1ByZWZpeFdpdGhEb3QoZmlsZV9wcm90by5wYWNrYWdlKQotICAgICAgICBlbHNlOgotICAgICAgICAgIGRlc2NfcHJvdG9fcHJlZml4ID0gJycKLQotICAgICAgICBmb3IgZGVzY19wcm90byBpbiBmaWxlX3Byb3RvLm1lc3NhZ2VfdHlwZToKLSAgICAgICAgICBkZXNjID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZSgKLSAgICAgICAgICAgICAgZGVzY19wcm90b19wcmVmaXgsIGRlc2NfcHJvdG8ubmFtZSwgc2NvcGUpCi0gICAgICAgICAgZmlsZV9kZXNjcmlwdG9yLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVtkZXNjX3Byb3RvLm5hbWVdID0gZGVzYwotCi0gICAgICBzZWxmLkFkZChmaWxlX3Byb3RvKQotICAgICAgc2VsZi5fZmlsZV9kZXNjcmlwdG9yc1tmaWxlX3Byb3RvLm5hbWVdID0gZmlsZV9kZXNjcmlwdG9yCi0KLSAgICByZXR1cm4gc2VsZi5fZmlsZV9kZXNjcmlwdG9yc1tmaWxlX3Byb3RvLm5hbWVdCi0KLSAgZGVmIF9Db252ZXJ0TWVzc2FnZURlc2NyaXB0b3Ioc2VsZiwgZGVzY19wcm90bywgcGFja2FnZT1Ob25lLCBmaWxlX2Rlc2M9Tm9uZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NvcGU9Tm9uZSwgc3ludGF4PU5vbmUpOgotICAgICIiIkFkZHMgdGhlIHByb3RvIHRvIHRoZSBwb29sIGluIHRoZSBzcGVjaWZpZWQgcGFja2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICBkZXNjX3Byb3RvOiBUaGUgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvIHByb3RvYnVmIG1lc3NhZ2UuCi0gICAgICBwYWNrYWdlOiBUaGUgcGFja2FnZSB0aGUgcHJvdG8gc2hvdWxkIGJlIGxvY2F0ZWQgaW4uCi0gICAgICBmaWxlX2Rlc2M6IFRoZSBmaWxlIGNvbnRhaW5pbmcgdGhpcyBtZXNzYWdlLgotICAgICAgc2NvcGU6IERpY3QgbWFwcGluZyBzaG9ydCBhbmQgZnVsbCBzeW1ib2xzIHRvIG1lc3NhZ2UgYW5kIGVudW0gdHlwZXMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGFkZGVkIGRlc2NyaXB0b3IuCi0gICAgIiIiCi0KLSAgICBpZiBwYWNrYWdlOgotICAgICAgZGVzY19uYW1lID0gJy4nLmpvaW4oKHBhY2thZ2UsIGRlc2NfcHJvdG8ubmFtZSkpCi0gICAgZWxzZToKLSAgICAgIGRlc2NfbmFtZSA9IGRlc2NfcHJvdG8ubmFtZQotCi0gICAgaWYgZmlsZV9kZXNjIGlzIE5vbmU6Ci0gICAgICBmaWxlX25hbWUgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIGZpbGVfbmFtZSA9IGZpbGVfZGVzYy5uYW1lCi0KLSAgICBpZiBzY29wZSBpcyBOb25lOgotICAgICAgc2NvcGUgPSB7fQotCi0gICAgbmVzdGVkID0gWwotICAgICAgICBzZWxmLl9Db252ZXJ0TWVzc2FnZURlc2NyaXB0b3IoCi0gICAgICAgICAgICBuZXN0ZWQsIGRlc2NfbmFtZSwgZmlsZV9kZXNjLCBzY29wZSwgc3ludGF4KQotICAgICAgICBmb3IgbmVzdGVkIGluIGRlc2NfcHJvdG8ubmVzdGVkX3R5cGVdCi0gICAgZW51bXMgPSBbCi0gICAgICAgIHNlbGYuX0NvbnZlcnRFbnVtRGVzY3JpcHRvcihlbnVtLCBkZXNjX25hbWUsIGZpbGVfZGVzYywgTm9uZSwgc2NvcGUpCi0gICAgICAgIGZvciBlbnVtIGluIGRlc2NfcHJvdG8uZW51bV90eXBlXQotICAgIGZpZWxkcyA9IFtzZWxmLl9NYWtlRmllbGREZXNjcmlwdG9yKGZpZWxkLCBkZXNjX25hbWUsIGluZGV4KQotICAgICAgICAgICAgICBmb3IgaW5kZXgsIGZpZWxkIGluIGVudW1lcmF0ZShkZXNjX3Byb3RvLmZpZWxkKV0KLSAgICBleHRlbnNpb25zID0gWwotICAgICAgICBzZWxmLl9NYWtlRmllbGREZXNjcmlwdG9yKGV4dGVuc2lvbiwgZGVzY19uYW1lLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb249VHJ1ZSkKLSAgICAgICAgZm9yIGluZGV4LCBleHRlbnNpb24gaW4gZW51bWVyYXRlKGRlc2NfcHJvdG8uZXh0ZW5zaW9uKV0KLSAgICBvbmVvZnMgPSBbCi0gICAgICAgIGRlc2NyaXB0b3IuT25lb2ZEZXNjcmlwdG9yKGRlc2MubmFtZSwgJy4nLmpvaW4oKGRlc2NfbmFtZSwgZGVzYy5uYW1lKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBOb25lLCBbXSkKLSAgICAgICAgZm9yIGluZGV4LCBkZXNjIGluIGVudW1lcmF0ZShkZXNjX3Byb3RvLm9uZW9mX2RlY2wpXQotICAgIGV4dGVuc2lvbl9yYW5nZXMgPSBbKHIuc3RhcnQsIHIuZW5kKSBmb3IgciBpbiBkZXNjX3Byb3RvLmV4dGVuc2lvbl9yYW5nZV0KLSAgICBpZiBleHRlbnNpb25fcmFuZ2VzOgotICAgICAgaXNfZXh0ZW5kYWJsZSA9IFRydWUKLSAgICBlbHNlOgotICAgICAgaXNfZXh0ZW5kYWJsZSA9IEZhbHNlCi0gICAgZGVzYyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgICAgICAgbmFtZT1kZXNjX3Byb3RvLm5hbWUsCi0gICAgICAgIGZ1bGxfbmFtZT1kZXNjX25hbWUsCi0gICAgICAgIGZpbGVuYW1lPWZpbGVfbmFtZSwKLSAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICAgIGZpZWxkcz1maWVsZHMsCi0gICAgICAgIG9uZW9mcz1vbmVvZnMsCi0gICAgICAgIG5lc3RlZF90eXBlcz1uZXN0ZWQsCi0gICAgICAgIGVudW1fdHlwZXM9ZW51bXMsCi0gICAgICAgIGV4dGVuc2lvbnM9ZXh0ZW5zaW9ucywKLSAgICAgICAgb3B0aW9ucz1kZXNjX3Byb3RvLm9wdGlvbnMsCi0gICAgICAgIGlzX2V4dGVuZGFibGU9aXNfZXh0ZW5kYWJsZSwKLSAgICAgICAgZXh0ZW5zaW9uX3Jhbmdlcz1leHRlbnNpb25fcmFuZ2VzLAotICAgICAgICBmaWxlPWZpbGVfZGVzYywKLSAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLAotICAgICAgICBzZXJpYWxpemVkX2VuZD1Ob25lLAotICAgICAgICBzeW50YXg9c3ludGF4KQotICAgIGZvciBuZXN0ZWQgaW4gZGVzYy5uZXN0ZWRfdHlwZXM6Ci0gICAgICBuZXN0ZWQuY29udGFpbmluZ190eXBlID0gZGVzYwotICAgIGZvciBlbnVtIGluIGRlc2MuZW51bV90eXBlczoKLSAgICAgIGVudW0uY29udGFpbmluZ190eXBlID0gZGVzYwotICAgIGZvciBmaWVsZF9pbmRleCwgZmllbGRfZGVzYyBpbiBlbnVtZXJhdGUoZGVzY19wcm90by5maWVsZCk6Ci0gICAgICBpZiBmaWVsZF9kZXNjLkhhc0ZpZWxkKCdvbmVvZl9pbmRleCcpOgotICAgICAgICBvbmVvZl9pbmRleCA9IGZpZWxkX2Rlc2Mub25lb2ZfaW5kZXgKLSAgICAgICAgb25lb2ZzW29uZW9mX2luZGV4XS5maWVsZHMuYXBwZW5kKGZpZWxkc1tmaWVsZF9pbmRleF0pCi0gICAgICAgIGZpZWxkc1tmaWVsZF9pbmRleF0uY29udGFpbmluZ19vbmVvZiA9IG9uZW9mc1tvbmVvZl9pbmRleF0KLQotICAgIHNjb3BlW19QcmVmaXhXaXRoRG90KGRlc2NfbmFtZSldID0gZGVzYwotICAgIHNlbGYuX2Rlc2NyaXB0b3JzW2Rlc2NfbmFtZV0gPSBkZXNjCi0gICAgcmV0dXJuIGRlc2MKLQotICBkZWYgX0NvbnZlcnRFbnVtRGVzY3JpcHRvcihzZWxmLCBlbnVtX3Byb3RvLCBwYWNrYWdlPU5vbmUsIGZpbGVfZGVzYz1Ob25lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwgc2NvcGU9Tm9uZSk6Ci0gICAgIiIiTWFrZSBhIHByb3RvYnVmIEVudW1EZXNjcmlwdG9yIGdpdmVuIGFuIEVudW1EZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYuCi0KLSAgICBBcmdzOgotICAgICAgZW51bV9wcm90bzogVGhlIGRlc2NyaXB0b3JfcGIyLkVudW1EZXNjcmlwdG9yUHJvdG8gcHJvdG9idWYgbWVzc2FnZS4KLSAgICAgIHBhY2thZ2U6IE9wdGlvbmFsIHBhY2thZ2UgbmFtZSBmb3IgdGhlIG5ldyBtZXNzYWdlIEVudW1EZXNjcmlwdG9yLgotICAgICAgZmlsZV9kZXNjOiBUaGUgZmlsZSBjb250YWluaW5nIHRoZSBlbnVtIGRlc2NyaXB0b3IuCi0gICAgICBjb250YWluaW5nX3R5cGU6IFRoZSB0eXBlIGNvbnRhaW5pbmcgdGhpcyBlbnVtLgotICAgICAgc2NvcGU6IFNjb3BlIGNvbnRhaW5pbmcgYXZhaWxhYmxlIHR5cGVzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBhZGRlZCBkZXNjcmlwdG9yCi0gICAgIiIiCi0KLSAgICBpZiBwYWNrYWdlOgotICAgICAgZW51bV9uYW1lID0gJy4nLmpvaW4oKHBhY2thZ2UsIGVudW1fcHJvdG8ubmFtZSkpCi0gICAgZWxzZToKLSAgICAgIGVudW1fbmFtZSA9IGVudW1fcHJvdG8ubmFtZQotCi0gICAgaWYgZmlsZV9kZXNjIGlzIE5vbmU6Ci0gICAgICBmaWxlX25hbWUgPSBOb25lCi0gICAgZWxzZToKLSAgICAgIGZpbGVfbmFtZSA9IGZpbGVfZGVzYy5uYW1lCi0KLSAgICB2YWx1ZXMgPSBbc2VsZi5fTWFrZUVudW1WYWx1ZURlc2NyaXB0b3IodmFsdWUsIGluZGV4KQotICAgICAgICAgICAgICBmb3IgaW5kZXgsIHZhbHVlIGluIGVudW1lcmF0ZShlbnVtX3Byb3RvLnZhbHVlKV0KLSAgICBkZXNjID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcihuYW1lPWVudW1fcHJvdG8ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmdWxsX25hbWU9ZW51bV9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lPWZpbGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlPWZpbGVfZGVzYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZXM9dmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1jb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9ucz1lbnVtX3Byb3RvLm9wdGlvbnMpCi0gICAgc2NvcGVbJy4lcycgJSBlbnVtX25hbWVdID0gZGVzYwotICAgIHNlbGYuX2VudW1fZGVzY3JpcHRvcnNbZW51bV9uYW1lXSA9IGRlc2MKLSAgICByZXR1cm4gZGVzYwotCi0gIGRlZiBfTWFrZUZpZWxkRGVzY3JpcHRvcihzZWxmLCBmaWVsZF9wcm90bywgbWVzc2FnZV9uYW1lLCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSk6Ci0gICAgIiIiQ3JlYXRlcyBhIGZpZWxkIGRlc2NyaXB0b3IgZnJvbSBhIEZpZWxkRGVzY3JpcHRvclByb3RvLgotCi0gICAgRm9yIG1lc3NhZ2UgYW5kIGVudW0gdHlwZSBmaWVsZHMsIHRoaXMgbWV0aG9kIHdpbGwgZG8gYSBsb29rIHVwCi0gICAgaW4gdGhlIHBvb2wgZm9yIHRoZSBhcHByb3ByaWF0ZSBkZXNjcmlwdG9yIGZvciB0aGF0IHR5cGUuIElmIGl0Ci0gICAgaXMgdW5hdmFpbGFibGUsIGl0IHdpbGwgZmFsbCBiYWNrIHRvIHRoZSBfc291cmNlIGZ1bmN0aW9uIHRvCi0gICAgY3JlYXRlIGl0LiBJZiB0aGlzIHR5cGUgaXMgc3RpbGwgdW5hdmFpbGFibGUsIGNvbnN0cnVjdGlvbiB3aWxsCi0gICAgZmFpbC4KLQotICAgIEFyZ3M6Ci0gICAgICBmaWVsZF9wcm90bzogVGhlIHByb3RvIGRlc2NyaWJpbmcgdGhlIGZpZWxkLgotICAgICAgbWVzc2FnZV9uYW1lOiBUaGUgbmFtZSBvZiB0aGUgY29udGFpbmluZyBtZXNzYWdlLgotICAgICAgaW5kZXg6IEluZGV4IG9mIHRoZSBmaWVsZAotICAgICAgaXNfZXh0ZW5zaW9uOiBJbmRpY2F0aW9uIHRoYXQgdGhpcyBmaWVsZCBpcyBmb3IgYW4gZXh0ZW5zaW9uLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEFuIGluaXRpYWxpemVkIEZpZWxkRGVzY3JpcHRvciBvYmplY3QKLSAgICAiIiIKLQotICAgIGlmIG1lc3NhZ2VfbmFtZToKLSAgICAgIGZ1bGxfbmFtZSA9ICcuJy5qb2luKChtZXNzYWdlX25hbWUsIGZpZWxkX3Byb3RvLm5hbWUpKQotICAgIGVsc2U6Ci0gICAgICBmdWxsX25hbWUgPSBmaWVsZF9wcm90by5uYW1lCi0KLSAgICByZXR1cm4gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICAgIG5hbWU9ZmllbGRfcHJvdG8ubmFtZSwKLSAgICAgICAgZnVsbF9uYW1lPWZ1bGxfbmFtZSwKLSAgICAgICAgaW5kZXg9aW5kZXgsCi0gICAgICAgIG51bWJlcj1maWVsZF9wcm90by5udW1iZXIsCi0gICAgICAgIHR5cGU9ZmllbGRfcHJvdG8udHlwZSwKLSAgICAgICAgY3BwX3R5cGU9Tm9uZSwKLSAgICAgICAgbWVzc2FnZV90eXBlPU5vbmUsCi0gICAgICAgIGVudW1fdHlwZT1Ob25lLAotICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgICAgbGFiZWw9ZmllbGRfcHJvdG8ubGFiZWwsCi0gICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgICBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICAgIGlzX2V4dGVuc2lvbj1pc19leHRlbnNpb24sCi0gICAgICAgIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgICBvcHRpb25zPWZpZWxkX3Byb3RvLm9wdGlvbnMpCi0KLSAgZGVmIF9TZXRBbGxGaWVsZFR5cGVzKHNlbGYsIHBhY2thZ2UsIGRlc2NfcHJvdG8sIHNjb3BlKToKLSAgICAiIiJTZXRzIGFsbCB0aGUgZGVzY3JpcHRvcidzIGZpZWxkcydzIHR5cGVzLgotCi0gICAgVGhpcyBtZXRob2QgYWxzbyBzZXRzIHRoZSBjb250YWluaW5nIHR5cGVzIG9uIGFueSBleHRlbnNpb25zLgotCi0gICAgQXJnczoKLSAgICAgIHBhY2thZ2U6IFRoZSBjdXJyZW50IHBhY2thZ2Ugb2YgZGVzY19wcm90by4KLSAgICAgIGRlc2NfcHJvdG86IFRoZSBtZXNzYWdlIGRlc2NyaXB0b3IgdG8gdXBkYXRlLgotICAgICAgc2NvcGU6IEVuY2xvc2luZyBzY29wZSBvZiBhdmFpbGFibGUgdHlwZXMuCi0gICAgIiIiCi0KLSAgICBwYWNrYWdlID0gX1ByZWZpeFdpdGhEb3QocGFja2FnZSkKLQotICAgIG1haW5fZGVzYyA9IHNlbGYuX0dldFR5cGVGcm9tU2NvcGUocGFja2FnZSwgZGVzY19wcm90by5uYW1lLCBzY29wZSkKLQotICAgIGlmIHBhY2thZ2UgPT0gJy4nOgotICAgICAgbmVzdGVkX3BhY2thZ2UgPSBfUHJlZml4V2l0aERvdChkZXNjX3Byb3RvLm5hbWUpCi0gICAgZWxzZToKLSAgICAgIG5lc3RlZF9wYWNrYWdlID0gJy4nLmpvaW4oW3BhY2thZ2UsIGRlc2NfcHJvdG8ubmFtZV0pCi0KLSAgICBmb3IgZmllbGRfcHJvdG8sIGZpZWxkX2Rlc2MgaW4gemlwKGRlc2NfcHJvdG8uZmllbGQsIG1haW5fZGVzYy5maWVsZHMpOgotICAgICAgc2VsZi5fU2V0RmllbGRUeXBlKGZpZWxkX3Byb3RvLCBmaWVsZF9kZXNjLCBuZXN0ZWRfcGFja2FnZSwgc2NvcGUpCi0KLSAgICBmb3IgZXh0ZW5zaW9uX3Byb3RvLCBleHRlbnNpb25fZGVzYyBpbiAoCi0gICAgICAgIHppcChkZXNjX3Byb3RvLmV4dGVuc2lvbiwgbWFpbl9kZXNjLmV4dGVuc2lvbnMpKToKLSAgICAgIGV4dGVuc2lvbl9kZXNjLmNvbnRhaW5pbmdfdHlwZSA9IHNlbGYuX0dldFR5cGVGcm9tU2NvcGUoCi0gICAgICAgICAgbmVzdGVkX3BhY2thZ2UsIGV4dGVuc2lvbl9wcm90by5leHRlbmRlZSwgc2NvcGUpCi0gICAgICBzZWxmLl9TZXRGaWVsZFR5cGUoZXh0ZW5zaW9uX3Byb3RvLCBleHRlbnNpb25fZGVzYywgbmVzdGVkX3BhY2thZ2UsIHNjb3BlKQotCi0gICAgZm9yIG5lc3RlZF90eXBlIGluIGRlc2NfcHJvdG8ubmVzdGVkX3R5cGU6Ci0gICAgICBzZWxmLl9TZXRBbGxGaWVsZFR5cGVzKG5lc3RlZF9wYWNrYWdlLCBuZXN0ZWRfdHlwZSwgc2NvcGUpCi0KLSAgZGVmIF9TZXRGaWVsZFR5cGUoc2VsZiwgZmllbGRfcHJvdG8sIGZpZWxkX2Rlc2MsIHBhY2thZ2UsIHNjb3BlKToKLSAgICAiIiJTZXRzIHRoZSBmaWVsZCdzIHR5cGUsIGNwcF90eXBlLCBtZXNzYWdlX3R5cGUgYW5kIGVudW1fdHlwZS4KLQotICAgIEFyZ3M6Ci0gICAgICBmaWVsZF9wcm90bzogRGF0YSBhYm91dCB0aGUgZmllbGQgaW4gcHJvdG8gZm9ybWF0LgotICAgICAgZmllbGRfZGVzYzogVGhlIGRlc2NyaXB0b3IgdG8gbW9kaXkuCi0gICAgICBwYWNrYWdlOiBUaGUgcGFja2FnZSB0aGUgZmllbGQncyBjb250YWluZXIgaXMgaW4uCi0gICAgICBzY29wZTogRW5jbG9zaW5nIHNjb3BlIG9mIGF2YWlsYWJsZSB0eXBlcy4KLSAgICAiIiIKLSAgICBpZiBmaWVsZF9wcm90by50eXBlX25hbWU6Ci0gICAgICBkZXNjID0gc2VsZi5fR2V0VHlwZUZyb21TY29wZShwYWNrYWdlLCBmaWVsZF9wcm90by50eXBlX25hbWUsIHNjb3BlKQotICAgIGVsc2U6Ci0gICAgICBkZXNjID0gTm9uZQotCi0gICAgaWYgbm90IGZpZWxkX3Byb3RvLkhhc0ZpZWxkKCd0eXBlJyk6Ci0gICAgICBpZiBpc2luc3RhbmNlKGRlc2MsIGRlc2NyaXB0b3IuRGVzY3JpcHRvcik6Ci0gICAgICAgIGZpZWxkX3Byb3RvLnR5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UKLSAgICAgIGVsc2U6Ci0gICAgICAgIGZpZWxkX3Byb3RvLnR5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU0KLQotICAgIGZpZWxkX2Rlc2MuY3BwX3R5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5Qcm90b1R5cGVUb0NwcFByb3RvVHlwZSgKLSAgICAgICAgZmllbGRfcHJvdG8udHlwZSkKLQotICAgIGlmIChmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRQotICAgICAgICBvciBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVApOgotICAgICAgZmllbGRfZGVzYy5tZXNzYWdlX3R5cGUgPSBkZXNjCi0KLSAgICBpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTToKLSAgICAgIGZpZWxkX2Rlc2MuZW51bV90eXBlID0gZGVzYwotCi0gICAgaWYgZmllbGRfcHJvdG8ubGFiZWwgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgICBmaWVsZF9kZXNjLmhhc19kZWZhdWx0X3ZhbHVlID0gRmFsc2UKLSAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IFtdCi0gICAgZWxpZiBmaWVsZF9wcm90by5IYXNGaWVsZCgnZGVmYXVsdF92YWx1ZScpOgotICAgICAgZmllbGRfZGVzYy5oYXNfZGVmYXVsdF92YWx1ZSA9IFRydWUKLSAgICAgIGlmIChmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFIG9yCi0gICAgICAgICAgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUKToKLSAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmxvYXQoZmllbGRfcHJvdG8uZGVmYXVsdF92YWx1ZSkKLSAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzoKLSAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmllbGRfcHJvdG8uZGVmYXVsdF92YWx1ZQotICAgICAgZWxpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDoKLSAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmllbGRfcHJvdG8uZGVmYXVsdF92YWx1ZS5sb3dlcigpID09ICd0cnVlJwotICAgICAgZWxpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTToKLSAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gZmllbGRfZGVzYy5lbnVtX3R5cGUudmFsdWVzX2J5X25hbWVbCi0gICAgICAgICAgICBmaWVsZF9wcm90by5kZWZhdWx0X3ZhbHVlXS5udW1iZXIKLSAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgotICAgICAgICBmaWVsZF9kZXNjLmRlZmF1bHRfdmFsdWUgPSB0ZXh0X2VuY29kaW5nLkNVbmVzY2FwZSgKLSAgICAgICAgICAgIGZpZWxkX3Byb3RvLmRlZmF1bHRfdmFsdWUpCi0gICAgICBlbHNlOgotICAgICAgICAjIEFsbCBvdGhlciB0eXBlcyBhcmUgb2YgdGhlICJpbnQiIHR5cGUuCi0gICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IGludChmaWVsZF9wcm90by5kZWZhdWx0X3ZhbHVlKQotICAgIGVsc2U6Ci0gICAgICBmaWVsZF9kZXNjLmhhc19kZWZhdWx0X3ZhbHVlID0gRmFsc2UKLSAgICAgIGlmIChmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFIG9yCi0gICAgICAgICAgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUKToKLSAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gMC4wCi0gICAgICBlbGlmIGZpZWxkX3Byb3RvLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6Ci0gICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IHUnJwotICAgICAgZWxpZiBmaWVsZF9wcm90by50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDoKLSAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gRmFsc2UKLSAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU06Ci0gICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSA9IGZpZWxkX2Rlc2MuZW51bV90eXBlLnZhbHVlc1swXS5udW1iZXIKLSAgICAgIGVsaWYgZmllbGRfcHJvdG8udHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgotICAgICAgICBmaWVsZF9kZXNjLmRlZmF1bHRfdmFsdWUgPSBiJycKLSAgICAgIGVsc2U6Ci0gICAgICAgICMgQWxsIG90aGVyIHR5cGVzIGFyZSBvZiB0aGUgImludCIgdHlwZS4KLSAgICAgICAgZmllbGRfZGVzYy5kZWZhdWx0X3ZhbHVlID0gMAotCi0gICAgZmllbGRfZGVzYy50eXBlID0gZmllbGRfcHJvdG8udHlwZQotCi0gIGRlZiBfTWFrZUVudW1WYWx1ZURlc2NyaXB0b3Ioc2VsZiwgdmFsdWVfcHJvdG8sIGluZGV4KToKLSAgICAiIiJDcmVhdGVzIGEgZW51bSB2YWx1ZSBkZXNjcmlwdG9yIG9iamVjdCBmcm9tIGEgZW51bSB2YWx1ZSBwcm90by4KLQotICAgIEFyZ3M6Ci0gICAgICB2YWx1ZV9wcm90bzogVGhlIHByb3RvIGRlc2NyaWJpbmcgdGhlIGVudW0gdmFsdWUuCi0gICAgICBpbmRleDogVGhlIGluZGV4IG9mIHRoZSBlbnVtIHZhbHVlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEFuIGluaXRpYWxpemVkIEVudW1WYWx1ZURlc2NyaXB0b3Igb2JqZWN0LgotICAgICIiIgotCi0gICAgcmV0dXJuIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgICAgbmFtZT12YWx1ZV9wcm90by5uYW1lLAotICAgICAgICBpbmRleD1pbmRleCwKLSAgICAgICAgbnVtYmVyPXZhbHVlX3Byb3RvLm51bWJlciwKLSAgICAgICAgb3B0aW9ucz12YWx1ZV9wcm90by5vcHRpb25zLAotICAgICAgICB0eXBlPU5vbmUpCi0KLSAgZGVmIF9FeHRyYWN0U3ltYm9scyhzZWxmLCBkZXNjcmlwdG9ycyk6Ci0gICAgIiIiUHVsbHMgb3V0IGFsbCB0aGUgc3ltYm9scyBmcm9tIGRlc2NyaXB0b3IgcHJvdG9zLgotCi0gICAgQXJnczoKLSAgICAgIGRlc2NyaXB0b3JzOiBUaGUgbWVzc2FnZXMgdG8gZXh0cmFjdCBkZXNjcmlwdG9ycyBmcm9tLgotICAgIFlpZWxkczoKLSAgICAgIEEgdHdvIGVsZW1lbnQgdHVwbGUgb2YgdGhlIHR5cGUgbmFtZSBhbmQgZGVzY3JpcHRvciBvYmplY3QuCi0gICAgIiIiCi0KLSAgICBmb3IgZGVzYyBpbiBkZXNjcmlwdG9yczoKLSAgICAgIHlpZWxkIChfUHJlZml4V2l0aERvdChkZXNjLmZ1bGxfbmFtZSksIGRlc2MpCi0gICAgICBmb3Igc3ltYm9sIGluIHNlbGYuX0V4dHJhY3RTeW1ib2xzKGRlc2MubmVzdGVkX3R5cGVzKToKLSAgICAgICAgeWllbGQgc3ltYm9sCi0gICAgICBmb3IgZW51bSBpbiBkZXNjLmVudW1fdHlwZXM6Ci0gICAgICAgIHlpZWxkIChfUHJlZml4V2l0aERvdChlbnVtLmZ1bGxfbmFtZSksIGVudW0pCi0KLSAgZGVmIF9HZXREZXBzKHNlbGYsIGRlcGVuZGVuY2llcyk6Ci0gICAgIiIiUmVjdXJzaXZlbHkgZmluZHMgZGVwZW5kZW5jaWVzIGZvciBmaWxlIHByb3Rvcy4KLQotICAgIEFyZ3M6Ci0gICAgICBkZXBlbmRlbmNpZXM6IFRoZSBuYW1lcyBvZiB0aGUgZmlsZXMgYmVpbmcgZGVwZW5kZWQgb24uCi0KLSAgICBZaWVsZHM6Ci0gICAgICBFYWNoIGRpcmVjdCBhbmQgaW5kaXJlY3QgZGVwZW5kZW5jeS4KLSAgICAiIiIKLQotICAgIGZvciBkZXBlbmRlbmN5IGluIGRlcGVuZGVuY2llczoKLSAgICAgIGRlcF9kZXNjID0gc2VsZi5GaW5kRmlsZUJ5TmFtZShkZXBlbmRlbmN5KQotICAgICAgeWllbGQgZGVwX2Rlc2MKLSAgICAgIGZvciBwYXJlbnRfZGVwIGluIGRlcF9kZXNjLmRlcGVuZGVuY2llczoKLSAgICAgICAgeWllbGQgcGFyZW50X2RlcAotCi0gIGRlZiBfR2V0VHlwZUZyb21TY29wZShzZWxmLCBwYWNrYWdlLCB0eXBlX25hbWUsIHNjb3BlKToKLSAgICAiIiJGaW5kcyBhIGdpdmVuIHR5cGUgbmFtZSBpbiB0aGUgY3VycmVudCBzY29wZS4KLQotICAgIEFyZ3M6Ci0gICAgICBwYWNrYWdlOiBUaGUgcGFja2FnZSB0aGUgcHJvdG8gc2hvdWxkIGJlIGxvY2F0ZWQgaW4uCi0gICAgICB0eXBlX25hbWU6IFRoZSBuYW1lIG9mIHRoZSB0eXBlIHRvIGJlIGZvdW5kIGluIHRoZSBzY29wZS4KLSAgICAgIHNjb3BlOiBEaWN0IG1hcHBpbmcgc2hvcnQgYW5kIGZ1bGwgc3ltYm9scyB0byBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBkZXNjcmlwdG9yIGZvciB0aGUgcmVxdWVzdGVkIHR5cGUuCi0gICAgIiIiCi0gICAgaWYgdHlwZV9uYW1lIG5vdCBpbiBzY29wZToKLSAgICAgIGNvbXBvbmVudHMgPSBfUHJlZml4V2l0aERvdChwYWNrYWdlKS5zcGxpdCgnLicpCi0gICAgICB3aGlsZSBjb21wb25lbnRzOgotICAgICAgICBwb3NzaWJsZV9tYXRjaCA9ICcuJy5qb2luKGNvbXBvbmVudHMgKyBbdHlwZV9uYW1lXSkKLSAgICAgICAgaWYgcG9zc2libGVfbWF0Y2ggaW4gc2NvcGU6Ci0gICAgICAgICAgdHlwZV9uYW1lID0gcG9zc2libGVfbWF0Y2gKLSAgICAgICAgICBicmVhawotICAgICAgICBlbHNlOgotICAgICAgICAgIGNvbXBvbmVudHMucG9wKC0xKQotICAgIHJldHVybiBzY29wZVt0eXBlX25hbWVdCi0KLQotZGVmIF9QcmVmaXhXaXRoRG90KG5hbWUpOgotICByZXR1cm4gbmFtZSBpZiBuYW1lLnN0YXJ0c3dpdGgoJy4nKSBlbHNlICcuJXMnICUgbmFtZQotCi0KLWlmIF9VU0VfQ19ERVNDUklQVE9SUzoKLSAgIyBUT0RPKGFtYXVyeWZhKTogVGhpcyBwb29sIGNvdWxkIGJlIGNvbnN0cnVjdGVkIGZyb20gUHl0aG9uIGNvZGUsIHdoZW4gd2UKLSAgIyBzdXBwb3J0IGEgZmxhZyBsaWtlICd1c2VfY3BwX2dlbmVyYXRlZF9wb29sPVRydWUnLgotICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCi0gIF9ERUZBVUxUID0gZGVzY3JpcHRvci5fbWVzc2FnZS5kZWZhdWx0X3Bvb2wKLWVsc2U6Ci0gIF9ERUZBVUxUID0gRGVzY3JpcHRvclBvb2woKQotCi0KLWRlZiBEZWZhdWx0KCk6Ci0gIHJldHVybiBfREVGQVVMVApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fcGFyYW1ldGVyaXplZC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvX3BhcmFtZXRlcml6ZWQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGRlYTNmMTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fcGFyYW1ldGVyaXplZC5weQorKysgL2Rldi9udWxsCkBAIC0xLDQ0MyArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkFkZHMgc3VwcG9ydCBmb3IgcGFyYW1ldGVyaXplZCB0ZXN0cyB0byBQeXRob24ncyB1bml0dGVzdCBUZXN0Q2FzZSBjbGFzcy4KLQotQSBwYXJhbWV0ZXJpemVkIHRlc3QgaXMgYSBtZXRob2QgaW4gYSB0ZXN0IGNhc2UgdGhhdCBpcyBpbnZva2VkIHdpdGggZGlmZmVyZW50Ci1hcmd1bWVudCB0dXBsZXMuCi0KLUEgc2ltcGxlIGV4YW1wbGU6Ci0KLSAgY2xhc3MgQWRkaXRpb25FeGFtcGxlKHBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyaXplZFRlc3RDYXNlKToKLSAgICBAcGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKAotICAgICAgICgxLCAyLCAzKSwKLSAgICAgICAoNCwgNSwgOSksCi0gICAgICAgKDEsIDEsIDMpKQotICAgIGRlZiB0ZXN0QWRkaXRpb24oc2VsZiwgb3AxLCBvcDIsIHJlc3VsdCk6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgb3AxICsgb3AyKQotCi0KLUVhY2ggaW52b2NhdGlvbiBpcyBhIHNlcGFyYXRlIHRlc3QgY2FzZSBhbmQgcHJvcGVybHkgaXNvbGF0ZWQganVzdAotbGlrZSBhIG5vcm1hbCB0ZXN0IG1ldGhvZCwgd2l0aCBpdHMgb3duIHNldFVwL3RlYXJEb3duIGN5Y2xlLiBJbiB0aGUKLWV4YW1wbGUgYWJvdmUsIHRoZXJlIGFyZSB0aHJlZSBzZXBhcmF0ZSB0ZXN0Y2FzZXMsIG9uZSBvZiB3aGljaCB3aWxsCi1mYWlsIGR1ZSB0byBhbiBhc3NlcnRpb24gZXJyb3IgKDEgKyAxICE9IDMpLgotCi1QYXJhbWV0ZXJzIGZvciBpbnZpZGlkdWFsIHRlc3QgY2FzZXMgY2FuIGJlIHR1cGxlcyAod2l0aCBwb3NpdGlvbmFsIHBhcmFtZXRlcnMpCi1vciBkaWN0aW9uYXJpZXMgKHdpdGggbmFtZWQgcGFyYW1ldGVycyk6Ci0KLSAgY2xhc3MgQWRkaXRpb25FeGFtcGxlKHBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyaXplZFRlc3RDYXNlKToKLSAgICBAcGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKAotICAgICAgIHsnb3AxJzogMSwgJ29wMic6IDIsICdyZXN1bHQnOiAzfSwKLSAgICAgICB7J29wMSc6IDQsICdvcDInOiA1LCAncmVzdWx0JzogOX0sCi0gICAgKQotICAgIGRlZiB0ZXN0QWRkaXRpb24oc2VsZiwgb3AxLCBvcDIsIHJlc3VsdCk6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdCwgb3AxICsgb3AyKQotCi1JZiBhIHBhcmFtZXRlcml6ZWQgdGVzdCBmYWlscywgdGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBzaG93IHRoZQotb3JpZ2luYWwgdGVzdCBuYW1lICh3aGljaCBpcyBtb2RpZmllZCBpbnRlcm5hbGx5KSBhbmQgdGhlIGFyZ3VtZW50cwotZm9yIHRoZSBzcGVjaWZpYyBpbnZvY2F0aW9uLCB3aGljaCBhcmUgcGFydCBvZiB0aGUgc3RyaW5nIHJldHVybmVkIGJ5Ci10aGUgc2hvcnREZXNjcmlwdGlvbigpIG1ldGhvZCBvbiB0ZXN0IGNhc2VzLgotCi1UaGUgaWQgbWV0aG9kIG9mIHRoZSB0ZXN0LCB1c2VkIGludGVybmFsbHkgYnkgdGhlIHVuaXR0ZXN0IGZyYW1ld29yaywKLWlzIGFsc28gbW9kaWZpZWQgdG8gc2hvdyB0aGUgYXJndW1lbnRzLiBUbyBtYWtlIHN1cmUgdGhhdCB0ZXN0IG5hbWVzCi1zdGF5IHRoZSBzYW1lIGFjcm9zcyBzZXZlcmFsIGludm9jYXRpb25zLCBvYmplY3QgcmVwcmVzZW50YXRpb25zIGxpa2UKLQotICA+Pj4gY2xhc3MgRm9vKG9iamVjdCk6Ci0gIC4uLiAgcGFzcwotICA+Pj4gcmVwcihGb28oKSkKLSAgJzxfX21haW5fXy5Gb28gb2JqZWN0IGF0IDB4MjNkODYxMD4nCi0KLWFyZSB0dXJuZWQgaW50byAnPF9fbWFpbl9fLkZvbz4nLiBGb3IgZXZlbiBtb3JlIGRlc2NyaXB0aXZlIG5hbWVzLAotZXNwZWNpYWxseSBpbiB0ZXN0IGxvZ3MsIHlvdSBjYW4gdXNlIHRoZSBOYW1lZFBhcmFtZXRlcnMgZGVjb3JhdG9yLiBJbgotdGhpcyBjYXNlLCBvbmx5IHR1cGxlcyBhcmUgc3VwcG9ydGVkLCBhbmQgdGhlIGZpcnN0IHBhcmFtZXRlcnMgaGFzIHRvCi1iZSBhIHN0cmluZyAob3IgYW4gb2JqZWN0IHRoYXQgcmV0dXJucyBhbiBhcHQgbmFtZSB3aGVuIGNvbnZlcnRlZCB2aWEKLXN0cigpKToKLQotICBjbGFzcyBOYW1lZEV4YW1wbGUocGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJpemVkVGVzdENhc2UpOgotICAgIEBwYXJhbWV0ZXJpemVkLk5hbWVkUGFyYW1ldGVycygKLSAgICAgICAoJ05vcm1hbCcsICdhYScsICdhYWEnLCBUcnVlKSwKLSAgICAgICAoJ0VtcHR5UHJlZml4JywgJycsICdhYmMnLCBUcnVlKSwKLSAgICAgICAoJ0JvdGhFbXB0eScsICcnLCAnJywgVHJ1ZSkpCi0gICAgZGVmIHRlc3RTdGFydHNXaXRoKHNlbGYsIHByZWZpeCwgc3RyaW5nLCByZXN1bHQpOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIHN0cmluZ3Muc3RhcnRzd2l0aChwcmVmaXgpKQotCi1OYW1lZCB0ZXN0cyBhbHNvIGhhdmUgdGhlIGJlbmVmaXQgdGhhdCB0aGV5IGNhbiBiZSBydW4gaW5kaXZpZHVhbGx5Ci1mcm9tIHRoZSBjb21tYW5kIGxpbmU6Ci0KLSAgJCB0ZXN0bW9kdWxlLnB5IE5hbWVkRXhhbXBsZS50ZXN0U3RhcnRzV2l0aE5vcm1hbAotICAuCi0gIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIFJhbiAxIHRlc3QgaW4gMC4wMDBzCi0KLSAgT0sKLQotUGFyYW1ldGVyaXplZCBDbGFzc2VzCi09PT09PT09PT09PT09PT09PT09PT0KLUlmIGludm9jYXRpb24gYXJndW1lbnRzIGFyZSBzaGFyZWQgYWNyb3NzIHRlc3QgbWV0aG9kcyBpbiBhIHNpbmdsZQotUGFyYW1ldGVyaXplZFRlc3RDYXNlIGNsYXNzLCBpbnN0ZWFkIG9mIGRlY29yYXRpbmcgYWxsIHRlc3QgbWV0aG9kcwotaW5kaXZpZHVhbGx5LCB0aGUgY2xhc3MgaXRzZWxmIGNhbiBiZSBkZWNvcmF0ZWQ6Ci0KLSAgQHBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycygKLSAgICAoMSwgMiwgMykKLSAgICAoNCwgNSwgOSkpCi0gIGNsYXNzIEFyaXRobWV0aWNUZXN0KHBhcmFtZXRlcml6ZWQuUGFyYW1ldGVyaXplZFRlc3RDYXNlKToKLSAgICBkZWYgdGVzdEFkZChzZWxmLCBhcmcxLCBhcmcyLCByZXN1bHQpOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChhcmcxICsgYXJnMiwgcmVzdWx0KQotCi0gICAgZGVmIHRlc3RTdWJ0cmFjdChzZWxmLCBhcmcyLCBhcmcyLCByZXN1bHQpOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQgLSBhcmcxLCBhcmcyKQotCi1JbnB1dHMgZnJvbSBJdGVyYWJsZXMKLT09PT09PT09PT09PT09PT09PT09PQotSWYgcGFyYW1ldGVycyBzaG91bGQgYmUgc2hhcmVkIGFjcm9zcyBzZXZlcmFsIHRlc3QgY2FzZXMsIG9yIGFyZSBkeW5hbWljYWxseQotY3JlYXRlZCBmcm9tIG90aGVyIHNvdXJjZXMsIGEgc2luZ2xlIG5vbi10dXBsZSBpdGVyYWJsZSBjYW4gYmUgcGFzc2VkIGludG8KLXRoZSBkZWNvcmF0b3IuIFRoaXMgaXRlcmFibGUgd2lsbCBiZSB1c2VkIHRvIG9idGFpbiB0aGUgdGVzdCBjYXNlczoKLQotICBjbGFzcyBBZGRpdGlvbkV4YW1wbGUocGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJpemVkVGVzdENhc2UpOgotICAgIEBwYXJhbWV0ZXJpemVkLlBhcmFtZXRlcnMoCi0gICAgICBjLm9wMSwgYy5vcDIsIGMucmVzdWx0IGZvciBjIGluIHRlc3RjYXNlcwotICAgICkKLSAgICBkZWYgdGVzdEFkZGl0aW9uKHNlbGYsIG9wMSwgb3AyLCByZXN1bHQpOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQsIG9wMSArIG9wMikKLQotCi1TaW5nbGUtQXJndW1lbnQgVGVzdCBNZXRob2RzCi09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JZiBhIHRlc3QgbWV0aG9kIHRha2VzIG9ubHkgb25lIGFyZ3VtZW50LCB0aGUgc2luZ2xlIGFyZ3VtZW50IGRvZXMgbm90IG5lZWQgdG8KLWJlIHdyYXBwZWQgaW50byBhIHR1cGxlOgotCi0gIGNsYXNzIE5lZ2F0aXZlTnVtYmVyRXhhbXBsZShwYXJhbWV0ZXJpemVkLlBhcmFtZXRlcml6ZWRUZXN0Q2FzZSk6Ci0gICAgQHBhcmFtZXRlcml6ZWQuUGFyYW1ldGVycygKLSAgICAgICAtMSwgLTMsIC00LCAtNQotICAgICkKLSAgICBkZWYgdGVzdElzTmVnYXRpdmUoc2VsZiwgYXJnKToKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ2F0aXZlKGFyZykpCi0iIiIKLQotX19hdXRob3JfXyA9ICd0bWFyZWtAZ29vZ2xlLmNvbSAoVG9yc3RlbiBNYXJlayknCi0KLWltcG9ydCBjb2xsZWN0aW9ucwotaW1wb3J0IGZ1bmN0b29scwotaW1wb3J0IHJlCi1pbXBvcnQgdHlwZXMKLXRyeToKLSAgaW1wb3J0IHVuaXR0ZXN0MiBhcyB1bml0dGVzdAotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLWltcG9ydCB1dWlkCi0KLWltcG9ydCBzaXgKLQotQUREUl9SRSA9IHJlLmNvbXBpbGUocidcPChbYS16QS1aMC05X1wtXC5dKykgb2JqZWN0IGF0IDB4W2EtZkEtRjAtOV0rXD4nKQotX1NFUEFSQVRPUiA9IHV1aWQudXVpZDEoKS5oZXgKLV9GSVJTVF9BUkcgPSBvYmplY3QoKQotX0FSR1VNRU5UX1JFUFIgPSBvYmplY3QoKQotCi0KLWRlZiBfQ2xlYW5SZXByKG9iaik6Ci0gIHJldHVybiBBRERSX1JFLnN1YihyJzxcMT4nLCByZXByKG9iaikpCi0KLQotIyBIZWxwZXIgZnVuY3Rpb24gZm9ybWVybHkgZnJvbSB0aGUgdW5pdHRlc3QgbW9kdWxlLCByZW1vdmVkIGZyb20gaXQgaW4KLSMgUHl0aG9uIDIuNy4KLWRlZiBfU3RyQ2xhc3MoY2xzKToKLSAgcmV0dXJuICclcy4lcycgJSAoY2xzLl9fbW9kdWxlX18sIGNscy5fX25hbWVfXykKLQotCi1kZWYgX05vblN0cmluZ0l0ZXJhYmxlKG9iaik6Ci0gIHJldHVybiAoaXNpbnN0YW5jZShvYmosIGNvbGxlY3Rpb25zLkl0ZXJhYmxlKSBhbmQgbm90Ci0gICAgICAgICAgaXNpbnN0YW5jZShvYmosIHNpeC5zdHJpbmdfdHlwZXMpKQotCi0KLWRlZiBfRm9ybWF0UGFyYW1ldGVyTGlzdCh0ZXN0Y2FzZV9wYXJhbXMpOgotICBpZiBpc2luc3RhbmNlKHRlc3RjYXNlX3BhcmFtcywgY29sbGVjdGlvbnMuTWFwcGluZyk6Ci0gICAgcmV0dXJuICcsICcuam9pbignJXM9JXMnICUgKGFyZ25hbWUsIF9DbGVhblJlcHIodmFsdWUpKQotICAgICAgICAgICAgICAgICAgICAgZm9yIGFyZ25hbWUsIHZhbHVlIGluIHRlc3RjYXNlX3BhcmFtcy5pdGVtcygpKQotICBlbGlmIF9Ob25TdHJpbmdJdGVyYWJsZSh0ZXN0Y2FzZV9wYXJhbXMpOgotICAgIHJldHVybiAnLCAnLmpvaW4obWFwKF9DbGVhblJlcHIsIHRlc3RjYXNlX3BhcmFtcykpCi0gIGVsc2U6Ci0gICAgcmV0dXJuIF9Gb3JtYXRQYXJhbWV0ZXJMaXN0KCh0ZXN0Y2FzZV9wYXJhbXMsKSkKLQotCi1jbGFzcyBfUGFyYW1ldGVyaXplZFRlc3RJdGVyKG9iamVjdCk6Ci0gICIiIkNhbGxhYmxlIGFuZCBpdGVyYWJsZSBjbGFzcyBmb3IgcHJvZHVjaW5nIG5ldyB0ZXN0IGNhc2VzLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB0ZXN0X21ldGhvZCwgdGVzdGNhc2VzLCBuYW1pbmdfdHlwZSk6Ci0gICAgIiIiUmV0dXJucyBjb25jcmV0ZSB0ZXN0IGZ1bmN0aW9ucyBmb3IgYSB0ZXN0IGFuZCBhIGxpc3Qgb2YgcGFyYW1ldGVycy4KLQotICAgIFRoZSBuYW1pbmdfdHlwZSBpcyB1c2VkIHRvIGRldGVybWluZSB0aGUgbmFtZSBvZiB0aGUgY29uY3JldGUKLSAgICBmdW5jdGlvbnMgYXMgcmVwb3J0ZWQgYnkgdGhlIHVuaXR0ZXN0IGZyYW1ld29yay4gSWYgbmFtaW5nX3R5cGUgaXMKLSAgICBfRklSU1RfQVJHLCB0aGUgdGVzdGNhc2VzIG11c3QgYmUgdHVwbGVzLCBhbmQgdGhlIGZpcnN0IGVsZW1lbnQgbXVzdAotICAgIGhhdmUgYSBzdHJpbmcgcmVwcmVzZW50YXRpb24gdGhhdCBpcyBhIHZhbGlkIFB5dGhvbiBpZGVudGlmaWVyLgotCi0gICAgQXJnczoKLSAgICAgIHRlc3RfbWV0aG9kOiBUaGUgZGVjb3JhdGVkIHRlc3QgbWV0aG9kLgotICAgICAgdGVzdGNhc2VzOiAobGlzdCBvZiB0dXBsZS9kaWN0KSBBIGxpc3Qgb2YgcGFyYW1ldGVyCi0gICAgICAgICAgICAgICAgIHR1cGxlcy9kaWN0cyBmb3IgaW5kaXZpZHVhbCB0ZXN0IGludm9jYXRpb25zLgotICAgICAgbmFtaW5nX3R5cGU6IFRoZSB0ZXN0IG5hbWluZyB0eXBlLCBlaXRoZXIgX05BTUVEIG9yIF9BUkdVTUVOVF9SRVBSLgotICAgICIiIgotICAgIHNlbGYuX3Rlc3RfbWV0aG9kID0gdGVzdF9tZXRob2QKLSAgICBzZWxmLnRlc3RjYXNlcyA9IHRlc3RjYXNlcwotICAgIHNlbGYuX25hbWluZ190eXBlID0gbmFtaW5nX3R5cGUKLQotICBkZWYgX19jYWxsX18oc2VsZiwgKmFyZ3MsICoqa3dhcmdzKToKLSAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1lvdSBhcHBlYXIgdG8gYmUgcnVubmluZyBhIHBhcmFtZXRlcml6ZWQgdGVzdCBjYXNlICcKLSAgICAgICAgICAgICAgICAgICAgICAgJ3dpdGhvdXQgaGF2aW5nIGluaGVyaXRlZCBmcm9tIHBhcmFtZXRlcml6ZWQuJwotICAgICAgICAgICAgICAgICAgICAgICAnUGFyYW1ldGVyaXplZFRlc3RDYXNlLiBUaGlzIGlzIGJhZCBiZWNhdXNlIG5vbmUgb2YgJwotICAgICAgICAgICAgICAgICAgICAgICAneW91ciB0ZXN0IGNhc2VzIGFyZSBhY3R1YWxseSBiZWluZyBydW4uJykKLQotICBkZWYgX19pdGVyX18oc2VsZik6Ci0gICAgdGVzdF9tZXRob2QgPSBzZWxmLl90ZXN0X21ldGhvZAotICAgIG5hbWluZ190eXBlID0gc2VsZi5fbmFtaW5nX3R5cGUKLQotICAgIGRlZiBNYWtlQm91bmRQYXJhbVRlc3QodGVzdGNhc2VfcGFyYW1zKToKLSAgICAgIEBmdW5jdG9vbHMud3JhcHModGVzdF9tZXRob2QpCi0gICAgICBkZWYgQm91bmRQYXJhbVRlc3Qoc2VsZik6Ci0gICAgICAgIGlmIGlzaW5zdGFuY2UodGVzdGNhc2VfcGFyYW1zLCBjb2xsZWN0aW9ucy5NYXBwaW5nKToKLSAgICAgICAgICB0ZXN0X21ldGhvZChzZWxmLCAqKnRlc3RjYXNlX3BhcmFtcykKLSAgICAgICAgZWxpZiBfTm9uU3RyaW5nSXRlcmFibGUodGVzdGNhc2VfcGFyYW1zKToKLSAgICAgICAgICB0ZXN0X21ldGhvZChzZWxmLCAqdGVzdGNhc2VfcGFyYW1zKQotICAgICAgICBlbHNlOgotICAgICAgICAgIHRlc3RfbWV0aG9kKHNlbGYsIHRlc3RjYXNlX3BhcmFtcykKLQotICAgICAgaWYgbmFtaW5nX3R5cGUgaXMgX0ZJUlNUX0FSRzoKLSAgICAgICAgIyBTaWduYWwgdGhlIG1ldGFjbGFzcyB0aGF0IHRoZSBuYW1lIG9mIHRoZSB0ZXN0IGZ1bmN0aW9uIGlzIHVuaXF1ZQotICAgICAgICAjIGFuZCBkZXNjcmlwdGl2ZS4KLSAgICAgICAgQm91bmRQYXJhbVRlc3QuX194X3VzZV9uYW1lX18gPSBUcnVlCi0gICAgICAgIEJvdW5kUGFyYW1UZXN0Ll9fbmFtZV9fICs9IHN0cih0ZXN0Y2FzZV9wYXJhbXNbMF0pCi0gICAgICAgIHRlc3RjYXNlX3BhcmFtcyA9IHRlc3RjYXNlX3BhcmFtc1sxOl0KLSAgICAgIGVsaWYgbmFtaW5nX3R5cGUgaXMgX0FSR1VNRU5UX1JFUFI6Ci0gICAgICAgICMgX194X2V4dHJhX2lkX18gaXMgdXNlZCB0byBwYXNzIG5hbWluZyBpbmZvcm1hdGlvbiB0byB0aGUgX19uZXdfXwotICAgICAgICAjIG1ldGhvZCBvZiBUZXN0R2VuZXJhdG9yTWV0YWNsYXNzLgotICAgICAgICAjIFRoZSBtZXRhY2xhc3Mgd2lsbCBtYWtlIHN1cmUgdG8gY3JlYXRlIGEgdW5pcXVlLCBidXQgbm9uZGVzY3JpcHRpdmUKLSAgICAgICAgIyBuYW1lIGZvciB0aGlzIHRlc3QuCi0gICAgICAgIEJvdW5kUGFyYW1UZXN0Ll9feF9leHRyYV9pZF9fID0gJyglcyknICUgKAotICAgICAgICAgICAgX0Zvcm1hdFBhcmFtZXRlckxpc3QodGVzdGNhc2VfcGFyYW1zKSwpCi0gICAgICBlbHNlOgotICAgICAgICByYWlzZSBSdW50aW1lRXJyb3IoJyVzIGlzIG5vdCBhIHZhbGlkIG5hbWluZyB0eXBlLicgJSAobmFtaW5nX3R5cGUsKSkKLQotICAgICAgQm91bmRQYXJhbVRlc3QuX19kb2NfXyA9ICclcyglcyknICUgKAotICAgICAgICAgIEJvdW5kUGFyYW1UZXN0Ll9fbmFtZV9fLCBfRm9ybWF0UGFyYW1ldGVyTGlzdCh0ZXN0Y2FzZV9wYXJhbXMpKQotICAgICAgaWYgdGVzdF9tZXRob2QuX19kb2NfXzoKLSAgICAgICAgQm91bmRQYXJhbVRlc3QuX19kb2NfXyArPSAnXG4lcycgJSAodGVzdF9tZXRob2QuX19kb2NfXywpCi0gICAgICByZXR1cm4gQm91bmRQYXJhbVRlc3QKLSAgICByZXR1cm4gKE1ha2VCb3VuZFBhcmFtVGVzdChjKSBmb3IgYyBpbiBzZWxmLnRlc3RjYXNlcykKLQotCi1kZWYgX0lzU2luZ2xldG9uTGlzdCh0ZXN0Y2FzZXMpOgotICAiIiJUcnVlIGlmZiB0ZXN0Y2FzZXMgY29udGFpbnMgb25seSBhIHNpbmdsZSBub24tdHVwbGUgZWxlbWVudC4iIiIKLSAgcmV0dXJuIGxlbih0ZXN0Y2FzZXMpID09IDEgYW5kIG5vdCBpc2luc3RhbmNlKHRlc3RjYXNlc1swXSwgdHVwbGUpCi0KLQotZGVmIF9Nb2RpZnlDbGFzcyhjbGFzc19vYmplY3QsIHRlc3RjYXNlcywgbmFtaW5nX3R5cGUpOgotICBhc3NlcnQgbm90IGdldGF0dHIoY2xhc3Nfb2JqZWN0LCAnX2lkX3N1ZmZpeCcsIE5vbmUpLCAoCi0gICAgICAnQ2Fubm90IGFkZCBwYXJhbWV0ZXJzIHRvICVzLCcKLSAgICAgICcgd2hpY2ggYWxyZWFkeSBoYXMgcGFyYW1ldGVyaXplZCBtZXRob2RzLicgJSAoY2xhc3Nfb2JqZWN0LCkpCi0gIGNsYXNzX29iamVjdC5faWRfc3VmZml4ID0gaWRfc3VmZml4ID0ge30KLSAgIyBXZSBjaGFuZ2UgdGhlIHNpemUgb2YgX19kaWN0X18gd2hpbGUgd2UgaXRlcmF0ZSBvdmVyIGl0LCAKLSAgIyB3aGljaCBQeXRob24gMy54IHdpbGwgY29tcGxhaW4gYWJvdXQsIHNvIHVzZSBjb3B5KCkuCi0gIGZvciBuYW1lLCBvYmogaW4gY2xhc3Nfb2JqZWN0Ll9fZGljdF9fLmNvcHkoKS5pdGVtcygpOgotICAgIGlmIChuYW1lLnN0YXJ0c3dpdGgodW5pdHRlc3QuVGVzdExvYWRlci50ZXN0TWV0aG9kUHJlZml4KQotICAgICAgICBhbmQgaXNpbnN0YW5jZShvYmosIHR5cGVzLkZ1bmN0aW9uVHlwZSkpOgotICAgICAgZGVsYXR0cihjbGFzc19vYmplY3QsIG5hbWUpCi0gICAgICBtZXRob2RzID0ge30KLSAgICAgIF9VcGRhdGVDbGFzc0RpY3RGb3JQYXJhbVRlc3RDYXNlKAotICAgICAgICAgIG1ldGhvZHMsIGlkX3N1ZmZpeCwgbmFtZSwKLSAgICAgICAgICBfUGFyYW1ldGVyaXplZFRlc3RJdGVyKG9iaiwgdGVzdGNhc2VzLCBuYW1pbmdfdHlwZSkpCi0gICAgICBmb3IgbmFtZSwgbWV0aCBpbiBtZXRob2RzLml0ZW1zKCk6Ci0gICAgICAgIHNldGF0dHIoY2xhc3Nfb2JqZWN0LCBuYW1lLCBtZXRoKQotCi0KLWRlZiBfUGFyYW1ldGVyRGVjb3JhdG9yKG5hbWluZ190eXBlLCB0ZXN0Y2FzZXMpOgotICAiIiJJbXBsZW1lbnRhdGlvbiBvZiB0aGUgcGFyYW1ldGVyaXphdGlvbiBkZWNvcmF0b3JzLgotCi0gIEFyZ3M6Ci0gICAgbmFtaW5nX3R5cGU6IFRoZSBuYW1pbmcgdHlwZS4KLSAgICB0ZXN0Y2FzZXM6IFRlc3RjYXNlIHBhcmFtZXRlcnMuCi0KLSAgUmV0dXJuczoKLSAgICBBIGZ1bmN0aW9uIGZvciBtb2RpZnlpbmcgdGhlIGRlY29yYXRlZCBvYmplY3QuCi0gICIiIgotICBkZWYgX0FwcGx5KG9iaik6Ci0gICAgaWYgaXNpbnN0YW5jZShvYmosIHR5cGUpOgotICAgICAgX01vZGlmeUNsYXNzKAotICAgICAgICAgIG9iaiwKLSAgICAgICAgICBsaXN0KHRlc3RjYXNlcykgaWYgbm90IGlzaW5zdGFuY2UodGVzdGNhc2VzLCBjb2xsZWN0aW9ucy5TZXF1ZW5jZSkKLSAgICAgICAgICBlbHNlIHRlc3RjYXNlcywKLSAgICAgICAgICBuYW1pbmdfdHlwZSkKLSAgICAgIHJldHVybiBvYmoKLSAgICBlbHNlOgotICAgICAgcmV0dXJuIF9QYXJhbWV0ZXJpemVkVGVzdEl0ZXIob2JqLCB0ZXN0Y2FzZXMsIG5hbWluZ190eXBlKQotCi0gIGlmIF9Jc1NpbmdsZXRvbkxpc3QodGVzdGNhc2VzKToKLSAgICBhc3NlcnQgX05vblN0cmluZ0l0ZXJhYmxlKHRlc3RjYXNlc1swXSksICgKLSAgICAgICAgJ1NpbmdsZSBwYXJhbWV0ZXIgYXJndW1lbnQgbXVzdCBiZSBhIG5vbi1zdHJpbmcgaXRlcmFibGUnKQotICAgIHRlc3RjYXNlcyA9IHRlc3RjYXNlc1swXQotCi0gIHJldHVybiBfQXBwbHkKLQotCi1kZWYgUGFyYW1ldGVycygqdGVzdGNhc2VzKToKLSAgIiIiQSBkZWNvcmF0b3IgZm9yIGNyZWF0aW5nIHBhcmFtZXRlcml6ZWQgdGVzdHMuCi0KLSAgU2VlIHRoZSBtb2R1bGUgZG9jc3RyaW5nIGZvciBhIHVzYWdlIGV4YW1wbGUuCi0gIEFyZ3M6Ci0gICAgKnRlc3RjYXNlczogUGFyYW1ldGVycyBmb3IgdGhlIGRlY29yYXRlZCBtZXRob2QsIGVpdGhlciBhIHNpbmdsZQotICAgICAgICAgICAgICAgIGl0ZXJhYmxlLCBvciBhIGxpc3Qgb2YgdHVwbGVzL2RpY3RzL29iamVjdHMgKGZvciB0ZXN0cwotICAgICAgICAgICAgICAgIHdpdGggb25seSBvbmUgYXJndW1lbnQpLgotCi0gIFJldHVybnM6Ci0gICAgIEEgdGVzdCBnZW5lcmF0b3IgdG8gYmUgaGFuZGxlZCBieSBUZXN0R2VuZXJhdG9yTWV0YWNsYXNzLgotICAiIiIKLSAgcmV0dXJuIF9QYXJhbWV0ZXJEZWNvcmF0b3IoX0FSR1VNRU5UX1JFUFIsIHRlc3RjYXNlcykKLQotCi1kZWYgTmFtZWRQYXJhbWV0ZXJzKCp0ZXN0Y2FzZXMpOgotICAiIiJBIGRlY29yYXRvciBmb3IgY3JlYXRpbmcgcGFyYW1ldGVyaXplZCB0ZXN0cy4KLQotICBTZWUgdGhlIG1vZHVsZSBkb2NzdHJpbmcgZm9yIGEgdXNhZ2UgZXhhbXBsZS4gVGhlIGZpcnN0IGVsZW1lbnQgb2YKLSAgZWFjaCBwYXJhbWV0ZXIgdHVwbGUgc2hvdWxkIGJlIGEgc3RyaW5nIGFuZCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZQotICBuYW1lIG9mIHRoZSB0ZXN0IG1ldGhvZC4KLQotICBBcmdzOgotICAgICp0ZXN0Y2FzZXM6IFBhcmFtZXRlcnMgZm9yIHRoZSBkZWNvcmF0ZWQgbWV0aG9kLCBlaXRoZXIgYSBzaW5nbGUKLSAgICAgICAgICAgICAgICBpdGVyYWJsZSwgb3IgYSBsaXN0IG9mIHR1cGxlcy4KLQotICBSZXR1cm5zOgotICAgICBBIHRlc3QgZ2VuZXJhdG9yIHRvIGJlIGhhbmRsZWQgYnkgVGVzdEdlbmVyYXRvck1ldGFjbGFzcy4KLSAgIiIiCi0gIHJldHVybiBfUGFyYW1ldGVyRGVjb3JhdG9yKF9GSVJTVF9BUkcsIHRlc3RjYXNlcykKLQotCi1jbGFzcyBUZXN0R2VuZXJhdG9yTWV0YWNsYXNzKHR5cGUpOgotICAiIiJNZXRhY2xhc3MgZm9yIHRlc3QgY2FzZXMgd2l0aCB0ZXN0IGdlbmVyYXRvcnMuCi0KLSAgQSB0ZXN0IGdlbmVyYXRvciBpcyBhbiBpdGVyYWJsZSBpbiBhIHRlc3RjYXNlIHRoYXQgcHJvZHVjZXMgY2FsbGFibGVzLiBUaGVzZQotICBjYWxsYWJsZXMgbXVzdCBiZSBzaW5nbGUtYXJndW1lbnQgbWV0aG9kcy4gVGhlc2UgbWV0aG9kcyBhcmUgaW5qZWN0ZWQgaW50bwotICB0aGUgY2xhc3MgbmFtZXNwYWNlIGFuZCB0aGUgb3JpZ2luYWwgaXRlcmFibGUgaXMgcmVtb3ZlZC4gSWYgdGhlIG5hbWUgb2YgdGhlCi0gIGl0ZXJhYmxlIGNvbmZvcm1zIHRvIHRoZSB0ZXN0IHBhdHRlcm4sIHRoZSBpbmplY3RlZCBtZXRob2RzIHdpbGwgYmUgcGlja2VkCi0gIHVwIGFzIHRlc3RzIGJ5IHRoZSB1bml0dGVzdCBmcmFtZXdvcmsuCi0KLSAgSW4gZ2VuZXJhbCwgaXQgaXMgc3VwcG9zZWQgdG8gYmUgdXNlZCBpbiBjb25qdWN0aW9uIHdpdGggdGhlCi0gIFBhcmFtZXRlcnMgZGVjb3JhdG9yLgotICAiIiIKLQotICBkZWYgX19uZXdfXyhtY3MsIGNsYXNzX25hbWUsIGJhc2VzLCBkY3QpOgotICAgIGRjdFsnX2lkX3N1ZmZpeCddID0gaWRfc3VmZml4ID0ge30KLSAgICBmb3IgbmFtZSwgb2JqIGluIGRjdC5pdGVtcygpOgotICAgICAgaWYgKG5hbWUuc3RhcnRzd2l0aCh1bml0dGVzdC5UZXN0TG9hZGVyLnRlc3RNZXRob2RQcmVmaXgpIGFuZAotICAgICAgICAgIF9Ob25TdHJpbmdJdGVyYWJsZShvYmopKToKLSAgICAgICAgaXRlcmF0b3IgPSBpdGVyKG9iaikKLSAgICAgICAgZGN0LnBvcChuYW1lKQotICAgICAgICBfVXBkYXRlQ2xhc3NEaWN0Rm9yUGFyYW1UZXN0Q2FzZShkY3QsIGlkX3N1ZmZpeCwgbmFtZSwgaXRlcmF0b3IpCi0KLSAgICByZXR1cm4gdHlwZS5fX25ld19fKG1jcywgY2xhc3NfbmFtZSwgYmFzZXMsIGRjdCkKLQotCi1kZWYgX1VwZGF0ZUNsYXNzRGljdEZvclBhcmFtVGVzdENhc2UoZGN0LCBpZF9zdWZmaXgsIG5hbWUsIGl0ZXJhdG9yKToKLSAgIiIiQWRkcyBpbmRpdmlkdWFsIHRlc3QgY2FzZXMgdG8gYSBkaWN0aW9uYXJ5LgotCi0gIEFyZ3M6Ci0gICAgZGN0OiBUaGUgdGFyZ2V0IGRpY3Rpb25hcnkuCi0gICAgaWRfc3VmZml4OiBUaGUgZGljdGlvbmFyeSBmb3IgbWFwcGluZyBuYW1lcyB0byB0ZXN0IElEcy4KLSAgICBuYW1lOiBUaGUgb3JpZ2luYWwgbmFtZSBvZiB0aGUgdGVzdCBjYXNlLgotICAgIGl0ZXJhdG9yOiBUaGUgaXRlcmF0b3IgZ2VuZXJhdGluZyB0aGUgaW5kaXZpZHVhbCB0ZXN0IGNhc2VzLgotICAiIiIKLSAgZm9yIGlkeCwgZnVuYyBpbiBlbnVtZXJhdGUoaXRlcmF0b3IpOgotICAgIGFzc2VydCBjYWxsYWJsZShmdW5jKSwgJ1Rlc3QgZ2VuZXJhdG9ycyBtdXN0IHlpZWxkIGNhbGxhYmxlcywgZ290ICVyJyAlICgKLSAgICAgICAgZnVuYywpCi0gICAgaWYgZ2V0YXR0cihmdW5jLCAnX194X3VzZV9uYW1lX18nLCBGYWxzZSk6Ci0gICAgICBuZXdfbmFtZSA9IGZ1bmMuX19uYW1lX18KLSAgICBlbHNlOgotICAgICAgbmV3X25hbWUgPSAnJXMlcyVkJyAlIChuYW1lLCBfU0VQQVJBVE9SLCBpZHgpCi0gICAgYXNzZXJ0IG5ld19uYW1lIG5vdCBpbiBkY3QsICgKLSAgICAgICAgJ05hbWUgb2YgcGFyYW1ldGVyaXplZCB0ZXN0IGNhc2UgIiVzIiBub3QgdW5pcXVlJyAlIChuZXdfbmFtZSwpKQotICAgIGRjdFtuZXdfbmFtZV0gPSBmdW5jCi0gICAgaWRfc3VmZml4W25ld19uYW1lXSA9IGdldGF0dHIoZnVuYywgJ19feF9leHRyYV9pZF9fJywgJycpCi0KLQotY2xhc3MgUGFyYW1ldGVyaXplZFRlc3RDYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiQmFzZSBjbGFzcyBmb3IgdGVzdCBjYXNlcyB1c2luZyB0aGUgUGFyYW1ldGVycyBkZWNvcmF0b3IuIiIiCi0gIF9fbWV0YWNsYXNzX18gPSBUZXN0R2VuZXJhdG9yTWV0YWNsYXNzCi0KLSAgZGVmIF9PcmlnaW5hbE5hbWUoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX3Rlc3RNZXRob2ROYW1lLnNwbGl0KF9TRVBBUkFUT1IpWzBdCi0KLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgcmV0dXJuICclcyAoJXMpJyAlIChzZWxmLl9PcmlnaW5hbE5hbWUoKSwgX1N0ckNsYXNzKHNlbGYuX19jbGFzc19fKSkKLQotICBkZWYgaWQoc2VsZik6ICAjIHB5bGludDogZGlzYWJsZT1pbnZhbGlkLW5hbWUKLSAgICAiIiJSZXR1cm5zIHRoZSBkZXNjcmlwdGl2ZSBJRCBvZiB0aGUgdGVzdC4KLQotICAgIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSB1bml0dGVzdGluZyBmcmFtZXdvcmsgdG8gZ2V0IGEgbmFtZQotICAgIGZvciB0aGUgdGVzdCB0byBiZSB1c2VkIGluIHJlcG9ydHMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIHRlc3QgaWQuCi0gICAgIiIiCi0gICAgcmV0dXJuICclcy4lcyVzJyAlIChfU3RyQ2xhc3Moc2VsZi5fX2NsYXNzX18pLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fT3JpZ2luYWxOYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9pZF9zdWZmaXguZ2V0KHNlbGYuX3Rlc3RNZXRob2ROYW1lLCAnJykpCi0KLQotZGVmIENvb3BQYXJhbWV0ZXJpemVkVGVzdENhc2Uob3RoZXJfYmFzZV9jbGFzcyk6Ci0gICIiIlJldHVybnMgYSBuZXcgYmFzZSBjbGFzcyB3aXRoIGEgY29vcGVyYXRpdmUgbWV0YWNsYXNzIGJhc2UuCi0KLSAgVGhpcyBlbmFibGVzIHRoZSBQYXJhbWV0ZXJpemVkVGVzdENhc2UgdG8gYmUgdXNlZCBpbiBjb21iaW5hdGlvbgotICB3aXRoIG90aGVyIGJhc2UgY2xhc3NlcyB0aGF0IGhhdmUgY3VzdG9tIG1ldGFjbGFzc2VzLCBzdWNoIGFzCi0gIG1veC5Nb3hUZXN0QmFzZS4KLQotICBPbmx5IHdvcmtzIHdpdGggbWV0YWNsYXNzZXMgdGhhdCBkbyBub3Qgb3ZlcnJpZGUgdHlwZS5fX25ld19fLgotCi0gIEV4YW1wbGU6Ci0KLSAgICBpbXBvcnQgZ29vZ2xlMwotICAgIGltcG9ydCBtb3gKLQotICAgIGZyb20gZ29vZ2xlMy50ZXN0aW5nLnB5YmFzZSBpbXBvcnQgcGFyYW1ldGVyaXplZAotCi0gICAgY2xhc3MgRXhhbXBsZVRlc3QocGFyYW1ldGVyaXplZC5Db29wUGFyYW1ldGVyaXplZFRlc3RDYXNlKG1veC5Nb3hUZXN0QmFzZSkpOgotICAgICAgLi4uCi0KLSAgQXJnczoKLSAgICBvdGhlcl9iYXNlX2NsYXNzOiAoY2xhc3MpIEEgdGVzdCBjYXNlIGJhc2UgY2xhc3MuCi0KLSAgUmV0dXJuczoKLSAgICBBIG5ldyBjbGFzcyBvYmplY3QuCi0gICIiIgotICBtZXRhY2xhc3MgPSB0eXBlKAotICAgICAgJ0Nvb3BNZXRhY2xhc3MnLAotICAgICAgKG90aGVyX2Jhc2VfY2xhc3MuX19tZXRhY2xhc3NfXywKLSAgICAgICBUZXN0R2VuZXJhdG9yTWV0YWNsYXNzKSwge30pCi0gIHJldHVybiBtZXRhY2xhc3MoCi0gICAgICAnQ29vcFBhcmFtZXRlcml6ZWRUZXN0Q2FzZScsCi0gICAgICAob3RoZXJfYmFzZV9jbGFzcywgUGFyYW1ldGVyaXplZFRlc3RDYXNlKSwge30pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FueV90ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hbnlfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Q2NDFjYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FueV90ZXN0LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogamllbHVvQGdvb2dsZS5jb20gKEppZSBMdW8pCi0KLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbDsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvYW55LnByb3RvIjsKLQotbWVzc2FnZSBUZXN0QW55IHsKLSAgZ29vZ2xlLnByb3RvYnVmLkFueSB2YWx1ZSA9IDE7Ci0gIGludDMyIGludF92YWx1ZSA9IDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGIxMmU4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi0vLyBWZXJzaW9uIGNvbnN0YW50LgotLy8gVGhpcyBpcyBlaXRoZXIgMCBmb3IgcHl0aG9uLCAxIGZvciBDUFAgVjEsIDIgZm9yIENQUCBWMi4KLS8vCi0vLyAwIGlzIGRlZmF1bHQgYW5kIGlzIGVxdWl2YWxlbnQgdG8KLS8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049cHl0aG9uCi0vLwotLy8gMSBpcyBzZXQgd2l0aCAtRFBZVEhPTl9QUk9UTzJfQ1BQX0lNUExfVjEgYW5kIGlzIGVxdWl2YWxlbnQgdG8KLS8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049Y3BwCi0vLyBhbmQKLS8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT05fVkVSU0lPTj0xCi0vLwotLy8gMiBpcyBzZXQgd2l0aCAtRFBZVEhPTl9QUk9UTzJfQ1BQX0lNUExfVjIgYW5kIGlzIGVxdWl2YWxlbnQgdG8KLS8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT049Y3BwCi0vLyBhbmQKLS8vICAgUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT05fVkVSU0lPTj0yCi0jaWZkZWYgUFlUSE9OX1BST1RPMl9DUFBfSU1QTF9WMQotI2Vycm9yICJQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YxIGlzIG5vIGxvbmdlciBzdXBwb3J0ZWQuIgotI2Vsc2UKLSNpZmRlZiBQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YyCi1zdGF0aWMgaW50IGtJbXBsVmVyc2lvbiA9IDI7Ci0jZWxzZQotI2lmZGVmIFBZVEhPTl9QUk9UTzJfUFlUSE9OX0lNUEwKLXN0YXRpYyBpbnQga0ltcGxWZXJzaW9uID0gMDsKLSNlbHNlCi0KLXN0YXRpYyBpbnQga0ltcGxWZXJzaW9uID0gLTE7ICAvLyAtMSBtZWFucyAiVW5zcGVjaWZpZWQgYnkgY29tcGlsZXIgZmxhZ3MiLgotCi0jZW5kaWYgIC8vIFBZVEhPTl9QUk9UTzJfUFlUSE9OX0lNUEwKLSNlbmRpZiAgLy8gUFlUSE9OX1BST1RPMl9DUFBfSU1QTF9WMgotI2VuZGlmICAvLyBQWVRIT05fUFJPVE8yX0NQUF9JTVBMX1YxCi0KLXN0YXRpYyBjb25zdCBjaGFyKiBrSW1wbFZlcnNpb25OYW1lID0gImFwaV92ZXJzaW9uIjsKLQotc3RhdGljIGNvbnN0IGNoYXIqIGtNb2R1bGVOYW1lID0gIl9hcGlfaW1wbGVtZW50YXRpb24iOwotc3RhdGljIGNvbnN0IGNoYXIga01vZHVsZURvY3N0cmluZ1tdID0KLSJfYXBpX2ltcGxlbWVudGF0aW9uIGlzIGEgbW9kdWxlIHRoYXQgZXhwb3NlcyBjb21waWxlLXRpbWUgY29uc3RhbnRzIHRoYXRcbiIKLSJkZXRlcm1pbmUgdGhlIGRlZmF1bHQgQVBJIGltcGxlbWVudGF0aW9uIHRvIHVzZSBmb3IgUHl0aG9uIHByb3RvMi5cbiIKLSJcbiIKLSJJdCBjb21wbGVtZW50cyBhcGlfaW1wbGVtZW50YXRpb24ucHkgYnkgc2V0dGluZyBkZWZhdWx0cyB1c2luZyBjb21waWxlLXRpbWVcbiIKLSJjb25zdGFudHMgZGVmaW5lZCBpbiBDLCBzdWNoIHRoYXQgb25lIGNhbiBzZXQgZGVmYXVsdHMgYXQgY29tcGlsYXRpb25cbiIKLSIoZS5nLiB3aXRoIGJsYXplIGZsYWcgLS1jb3B0PS1EUFlUSE9OX1BST1RPMl9DUFBfSU1QTF9WMikuIjsKLQotI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMwotc3RhdGljIHN0cnVjdCBQeU1vZHVsZURlZiBfbW9kdWxlID0gewotICBQeU1vZHVsZURlZl9IRUFEX0lOSVQsCi0gIGtNb2R1bGVOYW1lLAotICBrTW9kdWxlRG9jc3RyaW5nLAotICAtMSwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTCwKLSAgTlVMTAotfTsKLSNkZWZpbmUgSU5JVEZVTkMgUHlJbml0X19hcGlfaW1wbGVtZW50YXRpb24KLSNkZWZpbmUgSU5JVEZVTkNfRVJST1JWQUwgTlVMTAotI2Vsc2UKLSNkZWZpbmUgSU5JVEZVTkMgaW5pdF9hcGlfaW1wbGVtZW50YXRpb24KLSNkZWZpbmUgSU5JVEZVTkNfRVJST1JWQUwKLSNlbmRpZgotCi1leHRlcm4gIkMiIHsKLSAgUHlNT0RJTklUX0ZVTkMgSU5JVEZVTkMoKSB7Ci0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gICAgUHlPYmplY3QgKm1vZHVsZSA9IFB5TW9kdWxlX0NyZWF0ZSgmX21vZHVsZSk7Ci0jZWxzZQotICAgIFB5T2JqZWN0ICptb2R1bGUgPSBQeV9Jbml0TW9kdWxlMygKLSAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4oa01vZHVsZU5hbWUpLAotICAgICAgICBOVUxMLAotICAgICAgICBjb25zdF9jYXN0PGNoYXIqPihrTW9kdWxlRG9jc3RyaW5nKSk7Ci0jZW5kaWYKLSAgICBpZiAobW9kdWxlID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBJTklURlVOQ19FUlJPUlZBTDsKLSAgICB9Ci0KLSAgICAvLyBBZGRzIHRoZSBtb2R1bGUgdmFyaWFibGUgImFwaV92ZXJzaW9uIi4KLSAgICBpZiAoUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQoCi0gICAgICAgIG1vZHVsZSwKLSAgICAgICAgY29uc3RfY2FzdDxjaGFyKj4oa0ltcGxWZXJzaW9uTmFtZSksCi0gICAgICAgIGtJbXBsVmVyc2lvbikpCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKLSAgICAgIHJldHVybjsKLSNlbHNlCi0gICAgICB7IFB5X0RFQ1JFRihtb2R1bGUpOyByZXR1cm4gTlVMTDsgfQotCi0gICAgcmV0dXJuIG1vZHVsZTsKLSNlbmRpZgotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hcGlfaW1wbGVtZW50YXRpb24ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDYwYTRhNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5weQorKysgL2Rldi9udWxsCkBAIC0xLDExMyArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkRldGVybWluZSB3aGljaCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgcHJvdG9idWYgQVBJIGlzIHVzZWQgaW4gdGhpcyBwcm9jZXNzLgotIiIiCi0KLWltcG9ydCBvcwotaW1wb3J0IHdhcm5pbmdzCi1pbXBvcnQgc3lzCi0KLXRyeToKLSAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAotICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgX2FwaV9pbXBsZW1lbnRhdGlvbgotICAjIFRoZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZSBfYXBpX2ltcGxlbWVudGF0aW9uIG1vZHVsZSBjYW4gYmUgdXNlZCB0bwotICAjIHN3aXRjaCB0byBhIGNlcnRhaW4gaW1wbGVtZW50YXRpb24gb2YgdGhlIFB5dGhvbiBBUEkgYXQgYnVpbGQgdGltZS4KLSAgX2FwaV92ZXJzaW9uID0gX2FwaV9pbXBsZW1lbnRhdGlvbi5hcGlfdmVyc2lvbgotICBfcHJvdG9fZXh0ZW5zaW9uX21vZHVsZXNfZXhpc3RfaW5fYnVpbGQgPSBUcnVlCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gIF9hcGlfdmVyc2lvbiA9IC0xICAjIFVuc3BlY2lmaWVkIGJ5IGNvbXBpbGVyIGZsYWdzLgotICBfcHJvdG9fZXh0ZW5zaW9uX21vZHVsZXNfZXhpc3RfaW5fYnVpbGQgPSBGYWxzZQotCi1pZiBfYXBpX3ZlcnNpb24gPT0gMToKLSAgcmFpc2UgVmFsdWVFcnJvcignYXBpX3ZlcnNpb249MSBpcyBubyBsb25nZXIgc3VwcG9ydGVkLicpCi1pZiBfYXBpX3ZlcnNpb24gPCAwOiAgIyBTdGlsbCB1bnNwZWNpZmllZD8KLSAgdHJ5OgotICAgICMgVGhlIHByZXNlbmNlIG9mIHRoaXMgbW9kdWxlIGluIGEgYnVpbGQgYWxsb3dzIHRoZSBwcm90byBpbXBsZW1lbnRhdGlvbiB0bwotICAgICMgYmUgdXBncmFkZWQgbWVyZWx5IHZpYSBidWlsZCBkZXBzIHJhdGhlciB0aGFuIGEgY29tcGlsZXIgZmxhZyBvciB0aGUKLSAgICAjIHJ1bnRpbWUgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAotICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBfdXNlX2Zhc3RfY3BwX3Byb3RvcwotICAgICMgV29yayBhcm91bmQgYSBrbm93biBpc3N1ZSBpbiB0aGUgY2xhc3NpYyBib290c3RyYXAgLnBhciBpbXBvcnQgaG9vay4KLSAgICBpZiBub3QgX3VzZV9mYXN0X2NwcF9wcm90b3M6Ci0gICAgICByYWlzZSBJbXBvcnRFcnJvcignX3VzZV9mYXN0X2NwcF9wcm90b3MgaW1wb3J0IHN1Y2NlZWRlZCBidXQgd2FzIE5vbmUnKQotICAgIGRlbCBfdXNlX2Zhc3RfY3BwX3Byb3RvcwotICAgIF9hcGlfdmVyc2lvbiA9IDIKLSAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgIGlmIF9wcm90b19leHRlbnNpb25fbW9kdWxlc19leGlzdF9pbl9idWlsZDoKLSAgICAgIGlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPj0gMzogICMgUHl0aG9uIDMgZGVmYXVsdHMgdG8gQysrIGltcGwgdjIuCi0gICAgICAgIF9hcGlfdmVyc2lvbiA9IDIKLSAgICAgICMgVE9ETyhiLzE3NDI3NDg2KTogTWFrZSBQeXRob24gMiBkZWZhdWx0IHRvIEMrKyBpbXBsIHYyLgotCi1fZGVmYXVsdF9pbXBsZW1lbnRhdGlvbl90eXBlID0gKAotICAgICdweXRob24nIGlmIF9hcGlfdmVyc2lvbiA8PSAwIGVsc2UgJ2NwcCcpCi0KLSMgVGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gYmUgdXNlZCB0byBzd2l0Y2ggdG8gYSBjZXJ0YWluIGltcGxlbWVudGF0aW9uCi0jIG9mIHRoZSBQeXRob24gQVBJLCBvdmVycmlkaW5nIHRoZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZQotIyBfYXBpX2ltcGxlbWVudGF0aW9uIG1vZHVsZS4gUmlnaHQgbm93IG9ubHkgJ3B5dGhvbicgYW5kICdjcHAnIGFyZSB2YWxpZAotIyB2YWx1ZXMuIEFueSBvdGhlciB2YWx1ZSB3aWxsIGJlIGlnbm9yZWQuCi1faW1wbGVtZW50YXRpb25fdHlwZSA9IG9zLmdldGVudignUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT04nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX2RlZmF1bHRfaW1wbGVtZW50YXRpb25fdHlwZSkKLQotaWYgX2ltcGxlbWVudGF0aW9uX3R5cGUgIT0gJ3B5dGhvbic6Ci0gIF9pbXBsZW1lbnRhdGlvbl90eXBlID0gJ2NwcCcKLQotaWYgJ1B5UHknIGluIHN5cy52ZXJzaW9uIGFuZCBfaW1wbGVtZW50YXRpb25fdHlwZSA9PSAnY3BwJzoKLSAgd2FybmluZ3Mud2FybignUHlQeSBkb2VzIG5vdCB3b3JrIHlldCB3aXRoIGNwcCBwcm90b2NvbCBidWZmZXJzLiAnCi0gICAgICAgICAgICAgICAgJ0ZhbGxpbmcgYmFjayB0byB0aGUgcHl0aG9uIGltcGxlbWVudGF0aW9uLicpCi0gIF9pbXBsZW1lbnRhdGlvbl90eXBlID0gJ3B5dGhvbicKLQotIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHN3aXRjaCBiZXR3ZWVuIHRoZSB0d28KLSMgJ2NwcCcgaW1wbGVtZW50YXRpb25zLCBvdmVycmlkaW5nIHRoZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIGluIHRoZQotIyBfYXBpX2ltcGxlbWVudGF0aW9uIG1vZHVsZS4gUmlnaHQgbm93IG9ubHkgJzInIGlzIHN1cHBvcnRlZC4gQW55IG90aGVyCi0jIHZhbHVlIHdpbGwgY2F1c2UgYW4gZXJyb3IgdG8gYmUgcmFpc2VkLgotX2ltcGxlbWVudGF0aW9uX3ZlcnNpb25fc3RyID0gb3MuZ2V0ZW52KAotICAgICdQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTl9WRVJTSU9OJywgJzInKQotCi1pZiBfaW1wbGVtZW50YXRpb25fdmVyc2lvbl9zdHIgIT0gJzInOgotICByYWlzZSBWYWx1ZUVycm9yKAotICAgICAgJ3Vuc3VwcG9ydGVkIFBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OX1ZFUlNJT046ICInICsKLSAgICAgIF9pbXBsZW1lbnRhdGlvbl92ZXJzaW9uX3N0ciArICciIChzdXBwb3J0ZWQgdmVyc2lvbnM6IDIpJwotICAgICAgKQotCi1faW1wbGVtZW50YXRpb25fdmVyc2lvbiA9IGludChfaW1wbGVtZW50YXRpb25fdmVyc2lvbl9zdHIpCi0KLQotIyBVc2FnZSBvZiB0aGlzIGZ1bmN0aW9uIGlzIGRpc2NvdXJhZ2VkLiBDbGllbnRzIHNob3VsZG4ndCBjYXJlIHdoaWNoCi0jIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgaXMgaW4gdXNlLiBOb3RlIHRoYXQgdGhlcmUgaXMgbm8gZ3VhcmFudGVlCi0jIHRoYXQgZGlmZmVyZW5jZXMgYmV0d2VlbiBBUElzIHdpbGwgYmUgbWFpbnRhaW5lZC4KLSMgUGxlYXNlIGRvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIGlmIHBvc3NpYmxlLgotZGVmIFR5cGUoKToKLSAgcmV0dXJuIF9pbXBsZW1lbnRhdGlvbl90eXBlCi0KLQotIyBTZWUgY29tbWVudCBvbiAnVHlwZScgYWJvdmUuCi1kZWYgVmVyc2lvbigpOgotICByZXR1cm4gX2ltcGxlbWVudGF0aW9uX3ZlcnNpb24KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVycy5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVycy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOTdjZGQ4NC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2MTEgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJDb250YWlucyBjb250YWluZXIgY2xhc3NlcyB0byByZXByZXNlbnQgZGlmZmVyZW50IHByb3RvY29sIGJ1ZmZlciB0eXBlcy4KLQotVGhpcyBmaWxlIGRlZmluZXMgY29udGFpbmVyIGNsYXNzZXMgd2hpY2ggcmVwcmVzZW50IGNhdGVnb3JpZXMgb2YgcHJvdG9jb2wKLWJ1ZmZlciBmaWVsZCB0eXBlcyB3aGljaCBuZWVkIGV4dHJhIG1haW50ZW5hbmNlLiBDdXJyZW50bHkgdGhlc2UgY2F0ZWdvcmllcwotYXJlOgotICAtIFJlcGVhdGVkIHNjYWxhciBmaWVsZHMgLSBUaGVzZSBhcmUgYWxsIHJlcGVhdGVkIGZpZWxkcyB3aGljaCBhcmVuJ3QKLSAgICBjb21wb3NpdGUgKGUuZy4gdGhleSBhcmUgb2Ygc2ltcGxlIHR5cGVzIGxpa2UgaW50MzIsIHN0cmluZywgZXRjKS4KLSAgLSBSZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzIC0gUmVwZWF0ZWQgZmllbGRzIHdoaWNoIGFyZSBjb21wb3NpdGUuIFRoaXMKLSAgICBpbmNsdWRlcyBncm91cHMgYW5kIG5lc3RlZCBtZXNzYWdlcy4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCi0KLWltcG9ydCBjb2xsZWN0aW9ucwotaW1wb3J0IHN5cwotCi1pZiBzeXMudmVyc2lvbl9pbmZvWzBdIDwgMzoKLSAgIyBXZSB3b3VsZCB1c2UgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcgYWxsIHRoZSB0aW1lLCBidXQgaW4gUHl0aG9uIDIgaXQKLSAgIyBkb2Vzbid0IGRlZmluZSBfX3Nsb3RzX18uICBUaGlzIGNhdXNlcyB0d28gc2lnbmlmaWNhbnQgcHJvYmxlbXM6Ci0gICMKLSAgIyAxLiB3ZSBjYW4ndCBkaXNhbGxvdyBhcmJpdHJhcnkgYXR0cmlidXRlIGFzc2lnbm1lbnQsIGV2ZW4gaWYgb3VyIGRlcml2ZWQKLSAgIyAgICBjbGFzc2VzICpkbyogZGVmaW5lIF9fc2xvdHNfXy4KLSAgIwotICAjIDIuIHdlIGNhbid0IHNhZmVseSBkZXJpdmUgYSBDIHR5cGUgZnJvbSBpdCB3aXRob3V0IF9fc2xvdHNfXyBkZWZpbmVkICh0aGUKLSAgIyAgICBpbnRlcnByZXRlciBleHBlY3RzIHRvIGZpbmQgYSBkaWN0IGF0IHRwX2RpY3RvZmZzZXQsIHdoaWNoIHdlIGNhbid0Ci0gICMgICAgcm9idXN0bHkgcHJvdmlkZS4gIEFuZCB3ZSBkb24ndCB3YW50IGFuIGluc3RhbmNlIGRpY3QgYW55d2F5LgotICAjCi0gICMgU28gdGhpcyBpcyB0aGUgUHl0aG9uIDIuNyBkZWZpbml0aW9uIG9mIE1hcHBpbmcvTXV0YWJsZU1hcHBpbmcgZnVuY3Rpb25zCi0gICMgdmVyYmF0aW0sIGV4Y2VwdCB0aGF0OgotICAjIDEuIFdlIGRlY2xhcmUgX19zbG90c19fLgotICAjIDIuIFdlIGRvbid0IGRlY2xhcmUgdGhpcyBhcyBhIHZpcnR1YWwgYmFzZSBjbGFzcy4gIFRoZSBjbGFzc2VzIGRlZmluZWQKLSAgIyAgICBpbiBjb2xsZWN0aW9ucyBhcmUgdGhlIGludGVyZXN0aW5nIGJhc2UgY2xhc3Nlcywgbm90IHVzLgotICAjCi0gICMgTm90ZTogZGVyaXZpbmcgZnJvbSBvYmplY3QgaXMgY3JpdGljYWwuICBJdCBpcyB0aGUgb25seSB0aGluZyB0aGF0IG1ha2VzCi0gICMgdGhpcyBhIHRydWUgdHlwZSwgYWxsb3dpbmcgdXMgdG8gZGVyaXZlIGZyb20gaXQgaW4gQysrIGNsZWFubHkgYW5kIG1ha2luZwotICAjIF9fc2xvdHNfXyBwcm9wZXJseSBkaXNhbGxvdyBhcmJpdHJhcnkgZWxlbWVudCBhc3NpZ25tZW50LgotCi0gIGNsYXNzIE1hcHBpbmcob2JqZWN0KToKLSAgICBfX3Nsb3RzX18gPSAoKQotCi0gICAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgICB0cnk6Ci0gICAgICAgIHJldHVybiBzZWxmW2tleV0KLSAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgcmV0dXJuIGRlZmF1bHQKLQotICAgIGRlZiBfX2NvbnRhaW5zX18oc2VsZiwga2V5KToKLSAgICAgIHRyeToKLSAgICAgICAgc2VsZltrZXldCi0gICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgICAgZWxzZToKLSAgICAgICAgcmV0dXJuIFRydWUKLQotICAgIGRlZiBpdGVya2V5cyhzZWxmKToKLSAgICAgIHJldHVybiBpdGVyKHNlbGYpCi0KLSAgICBkZWYgaXRlcnZhbHVlcyhzZWxmKToKLSAgICAgIGZvciBrZXkgaW4gc2VsZjoKLSAgICAgICAgeWllbGQgc2VsZltrZXldCi0KLSAgICBkZWYgaXRlcml0ZW1zKHNlbGYpOgotICAgICAgZm9yIGtleSBpbiBzZWxmOgotICAgICAgICB5aWVsZCAoa2V5LCBzZWxmW2tleV0pCi0KLSAgICBkZWYga2V5cyhzZWxmKToKLSAgICAgIHJldHVybiBsaXN0KHNlbGYpCi0KLSAgICBkZWYgaXRlbXMoc2VsZik6Ci0gICAgICByZXR1cm4gWyhrZXksIHNlbGZba2V5XSkgZm9yIGtleSBpbiBzZWxmXQotCi0gICAgZGVmIHZhbHVlcyhzZWxmKToKLSAgICAgIHJldHVybiBbc2VsZltrZXldIGZvciBrZXkgaW4gc2VsZl0KLQotICAgICMgTWFwcGluZ3MgYXJlIG5vdCBoYXNoYWJsZSBieSBkZWZhdWx0LCBidXQgc3ViY2xhc3NlcyBjYW4gY2hhbmdlIHRoaXMKLSAgICBfX2hhc2hfXyA9IE5vbmUKLQotICAgIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIGNvbGxlY3Rpb25zLk1hcHBpbmcpOgotICAgICAgICByZXR1cm4gTm90SW1wbGVtZW50ZWQKLSAgICAgIHJldHVybiBkaWN0KHNlbGYuaXRlbXMoKSkgPT0gZGljdChvdGhlci5pdGVtcygpKQotCi0gICAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6Ci0gICAgICByZXR1cm4gbm90IChzZWxmID09IG90aGVyKQotCi0gIGNsYXNzIE11dGFibGVNYXBwaW5nKE1hcHBpbmcpOgotICAgIF9fc2xvdHNfXyA9ICgpCi0KLSAgICBfX21hcmtlciA9IG9iamVjdCgpCi0KLSAgICBkZWYgcG9wKHNlbGYsIGtleSwgZGVmYXVsdD1fX21hcmtlcik6Ci0gICAgICB0cnk6Ci0gICAgICAgIHZhbHVlID0gc2VsZltrZXldCi0gICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIGlmIGRlZmF1bHQgaXMgc2VsZi5fX21hcmtlcjoKLSAgICAgICAgICByYWlzZQotICAgICAgICByZXR1cm4gZGVmYXVsdAotICAgICAgZWxzZToKLSAgICAgICAgZGVsIHNlbGZba2V5XQotICAgICAgICByZXR1cm4gdmFsdWUKLQotICAgIGRlZiBwb3BpdGVtKHNlbGYpOgotICAgICAgdHJ5OgotICAgICAgICBrZXkgPSBuZXh0KGl0ZXIoc2VsZikpCi0gICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKLSAgICAgICAgcmFpc2UgS2V5RXJyb3IKLSAgICAgIHZhbHVlID0gc2VsZltrZXldCi0gICAgICBkZWwgc2VsZltrZXldCi0gICAgICByZXR1cm4ga2V5LCB2YWx1ZQotCi0gICAgZGVmIGNsZWFyKHNlbGYpOgotICAgICAgdHJ5OgotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgIHNlbGYucG9waXRlbSgpCi0gICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIHBhc3MKLQotICAgIGRlZiB1cGRhdGUoKmFyZ3MsICoqa3dkcyk6Ci0gICAgICBpZiBsZW4oYXJncykgPiAyOgotICAgICAgICByYWlzZSBUeXBlRXJyb3IoInVwZGF0ZSgpIHRha2VzIGF0IG1vc3QgMiBwb3NpdGlvbmFsICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJhcmd1bWVudHMgKHt9IGdpdmVuKSIuZm9ybWF0KGxlbihhcmdzKSkpCi0gICAgICBlbGlmIG5vdCBhcmdzOgotICAgICAgICByYWlzZSBUeXBlRXJyb3IoInVwZGF0ZSgpIHRha2VzIGF0IGxlYXN0IDEgYXJndW1lbnQgKDAgZ2l2ZW4pIikKLSAgICAgIHNlbGYgPSBhcmdzWzBdCi0gICAgICBvdGhlciA9IGFyZ3NbMV0gaWYgbGVuKGFyZ3MpID49IDIgZWxzZSAoKQotCi0gICAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBNYXBwaW5nKToKLSAgICAgICAgZm9yIGtleSBpbiBvdGhlcjoKLSAgICAgICAgICBzZWxmW2tleV0gPSBvdGhlcltrZXldCi0gICAgICBlbGlmIGhhc2F0dHIob3RoZXIsICJrZXlzIik6Ci0gICAgICAgIGZvciBrZXkgaW4gb3RoZXIua2V5cygpOgotICAgICAgICAgIHNlbGZba2V5XSA9IG90aGVyW2tleV0KLSAgICAgIGVsc2U6Ci0gICAgICAgIGZvciBrZXksIHZhbHVlIGluIG90aGVyOgotICAgICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCi0gICAgICBmb3Iga2V5LCB2YWx1ZSBpbiBrd2RzLml0ZW1zKCk6Ci0gICAgICAgIHNlbGZba2V5XSA9IHZhbHVlCi0KLSAgICBkZWYgc2V0ZGVmYXVsdChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgICB0cnk6Ci0gICAgICAgIHJldHVybiBzZWxmW2tleV0KLSAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgc2VsZltrZXldID0gZGVmYXVsdAotICAgICAgcmV0dXJuIGRlZmF1bHQKLQotICBjb2xsZWN0aW9ucy5NYXBwaW5nLnJlZ2lzdGVyKE1hcHBpbmcpCi0gIGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nLnJlZ2lzdGVyKE11dGFibGVNYXBwaW5nKQotCi1lbHNlOgotICAjIEluIFB5dGhvbiAzIHdlIGNhbiBqdXN0IHVzZSBNdXRhYmxlTWFwcGluZyBkaXJlY3RseSwgYmVjYXVzZSBpdCBkZWZpbmVzCi0gICMgX19zbG90c19fLgotICBNdXRhYmxlTWFwcGluZyA9IGNvbGxlY3Rpb25zLk11dGFibGVNYXBwaW5nCi0KLQotY2xhc3MgQmFzZUNvbnRhaW5lcihvYmplY3QpOgotCi0gICIiIkJhc2UgY29udGFpbmVyIGNsYXNzLiIiIgotCi0gICMgTWluaW1pemVzIG1lbW9yeSB1c2FnZSBhbmQgZGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KLSAgX19zbG90c19fID0gWydfbWVzc2FnZV9saXN0ZW5lcicsICdfdmFsdWVzJ10KLQotICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZV9saXN0ZW5lcik6Ci0gICAgIiIiCi0gICAgQXJnczoKLSAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgotICAgICAgICBUaGUgUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lciB3aWxsIGNhbGwgdGhpcyBvYmplY3QncwotICAgICAgICBNb2RpZmllZCgpIG1ldGhvZCB3aGVuIGl0IGlzIG1vZGlmaWVkLgotICAgICIiIgotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyCi0gICAgc2VsZi5fdmFsdWVzID0gW10KLQotICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKLSAgICAiIiJSZXRyaWV2ZXMgaXRlbSBieSB0aGUgc3BlY2lmaWVkIGtleS4iIiIKLSAgICByZXR1cm4gc2VsZi5fdmFsdWVzW2tleV0KLQotICBkZWYgX19sZW5fXyhzZWxmKToKLSAgICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIGNvbnRhaW5lci4iIiIKLSAgICByZXR1cm4gbGVuKHNlbGYuX3ZhbHVlcykKLQotICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKLSAgICAiIiJDaGVja3MgaWYgYW5vdGhlciBpbnN0YW5jZSBpc24ndCBlcXVhbCB0byB0aGlzIG9uZS4iIiIKLSAgICAjIFRoZSBjb25jcmV0ZSBjbGFzc2VzIHNob3VsZCBkZWZpbmUgX19lcV9fLgotICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgotCi0gIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuIHJlcHIoc2VsZi5fdmFsdWVzKQotCi0gIGRlZiBzb3J0KHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgIyBDb250aW51ZSB0byBzdXBwb3J0IHRoZSBvbGQgc29ydF9mdW5jdGlvbiBrZXl3b3JkIGFyZ3VtZW50LgotICAgICMgVGhpcyBpcyBleHBlY3RlZCB0byBiZSBhIHJhcmUgb2NjdXJyZW5jZSwgc28gdXNlIExCWUwgdG8gYXZvaWQKLSAgICAjIHRoZSBvdmVyaGVhZCBvZiBhY3R1YWxseSBjYXRjaGluZyBLZXlFcnJvci4KLSAgICBpZiAnc29ydF9mdW5jdGlvbicgaW4ga3dhcmdzOgotICAgICAga3dhcmdzWydjbXAnXSA9IGt3YXJncy5wb3AoJ3NvcnRfZnVuY3Rpb24nKQotICAgIHNlbGYuX3ZhbHVlcy5zb3J0KCphcmdzLCAqKmt3YXJncykKLQotCi1jbGFzcyBSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyKEJhc2VDb250YWluZXIpOgotCi0gICIiIlNpbXBsZSwgdHlwZS1jaGVja2VkLCBsaXN0LWxpa2UgY29udGFpbmVyIGZvciBob2xkaW5nIHJlcGVhdGVkIHNjYWxhcnMuIiIiCi0KLSAgIyBEaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgotICBfX3Nsb3RzX18gPSBbJ190eXBlX2NoZWNrZXInXQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX2xpc3RlbmVyLCB0eXBlX2NoZWNrZXIpOgotICAgICIiIgotICAgIEFyZ3M6Ci0gICAgICBtZXNzYWdlX2xpc3RlbmVyOiBBIE1lc3NhZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbi4KLSAgICAgICAgVGhlIFJlcGVhdGVkU2NhbGFyRmllbGRDb250YWluZXIgd2lsbCBjYWxsIHRoaXMgb2JqZWN0J3MKLSAgICAgICAgTW9kaWZpZWQoKSBtZXRob2Qgd2hlbiBpdCBpcyBtb2RpZmllZC4KLSAgICAgIHR5cGVfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24gZWxlbWVudHMKLSAgICAgICAgaW5zZXJ0ZWQgaW50byB0aGlzIGNvbnRhaW5lci4KLSAgICAiIiIKLSAgICBzdXBlcihSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyLCBzZWxmKS5fX2luaXRfXyhtZXNzYWdlX2xpc3RlbmVyKQotICAgIHNlbGYuX3R5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcgotCi0gIGRlZiBhcHBlbmQoc2VsZiwgdmFsdWUpOgotICAgICIiIkFwcGVuZHMgYW4gaXRlbSB0byB0aGUgbGlzdC4gU2ltaWxhciB0byBsaXN0LmFwcGVuZCgpLiIiIgotICAgIHNlbGYuX3ZhbHVlcy5hcHBlbmQoc2VsZi5fdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpKQotICAgIGlmIG5vdCBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLmRpcnR5OgotICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIGluc2VydChzZWxmLCBrZXksIHZhbHVlKToKLSAgICAiIiJJbnNlcnRzIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFNpbWlsYXIgdG8gbGlzdC5pbnNlcnQoKS4iIiIKLSAgICBzZWxmLl92YWx1ZXMuaW5zZXJ0KGtleSwgc2VsZi5fdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpKQotICAgIGlmIG5vdCBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLmRpcnR5OgotICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIGV4dGVuZChzZWxmLCBlbGVtX3NlcSk6Ci0gICAgIiIiRXh0ZW5kcyBieSBhcHBlbmRpbmcgdGhlIGdpdmVuIGl0ZXJhYmxlLiBTaW1pbGFyIHRvIGxpc3QuZXh0ZW5kKCkuIiIiCi0KLSAgICBpZiBlbGVtX3NlcSBpcyBOb25lOgotICAgICAgcmV0dXJuCi0gICAgdHJ5OgotICAgICAgZWxlbV9zZXFfaXRlciA9IGl0ZXIoZWxlbV9zZXEpCi0gICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgIGlmIG5vdCBlbGVtX3NlcToKLSAgICAgICAgIyBzaWxlbnRseSBpZ25vcmUgZmFsc3kgaW5wdXRzIDotLy4KLSAgICAgICAgIyBUT0RPKHB0dWNrZXIpOiBEZXByZWNhdGUgdGhpcyBiZWhhdmlvci4gYi8xODQxMzg2MgotICAgICAgICByZXR1cm4KLSAgICAgIHJhaXNlCi0KLSAgICBuZXdfdmFsdWVzID0gW3NlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKGVsZW0pIGZvciBlbGVtIGluIGVsZW1fc2VxX2l0ZXJdCi0gICAgaWYgbmV3X3ZhbHVlczoKLSAgICAgIHNlbGYuX3ZhbHVlcy5leHRlbmQobmV3X3ZhbHVlcykKLSAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXIpOgotICAgICIiIkFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgcmVwZWF0ZWQgZmllbGQgb2YgdGhlIHNhbWUgdHlwZSB0byB0aGlzCi0gICAgb25lLiBXZSBkbyBub3QgY2hlY2sgdGhlIHR5cGVzIG9mIHRoZSBpbmRpdmlkdWFsIGZpZWxkcy4KLSAgICAiIiIKLSAgICBzZWxmLl92YWx1ZXMuZXh0ZW5kKG90aGVyLl92YWx1ZXMpCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIHJlbW92ZShzZWxmLCBlbGVtKToKLSAgICAiIiJSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgbGlzdC4gU2ltaWxhciB0byBsaXN0LnJlbW92ZSgpLiIiIgotICAgIHNlbGYuX3ZhbHVlcy5yZW1vdmUoZWxlbSkKLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgcG9wKHNlbGYsIGtleT0tMSk6Ci0gICAgIiIiUmVtb3ZlcyBhbmQgcmV0dXJucyBhbiBpdGVtIGF0IGEgZ2l2ZW4gaW5kZXguIFNpbWlsYXIgdG8gbGlzdC5wb3AoKS4iIiIKLSAgICB2YWx1ZSA9IHNlbGYuX3ZhbHVlc1trZXldCi0gICAgc2VsZi5fX2RlbGl0ZW1fXyhrZXkpCi0gICAgcmV0dXJuIHZhbHVlCi0KLSAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgotICAgICIiIlNldHMgdGhlIGl0ZW0gb24gdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4iIiIKLSAgICBpZiBpc2luc3RhbmNlKGtleSwgc2xpY2UpOiAgIyBQWTMKLSAgICAgIGlmIGtleS5zdGVwIGlzIG5vdCBOb25lOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHRlbmRlZCBzbGljZXMgbm90IHN1cHBvcnRlZCcpCi0gICAgICBzZWxmLl9fc2V0c2xpY2VfXyhrZXkuc3RhcnQsIGtleS5zdG9wLCB2YWx1ZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fdmFsdWVzW2tleV0gPSBzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKLSAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3ApOgotICAgICIiIlJldHJpZXZlcyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCi0gICAgcmV0dXJuIHNlbGYuX3ZhbHVlc1tzdGFydDpzdG9wXQotCi0gIGRlZiBfX3NldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3AsIHZhbHVlcyk6Ci0gICAgIiIiU2V0cyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCi0gICAgbmV3X3ZhbHVlcyA9IFtdCi0gICAgZm9yIHZhbHVlIGluIHZhbHVlczoKLSAgICAgIG5ld192YWx1ZXMuYXBwZW5kKHNlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKHZhbHVlKSkKLSAgICBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0gPSBuZXdfdmFsdWVzCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6Ci0gICAgIiIiRGVsZXRlcyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiIiIgotICAgIGRlbCBzZWxmLl92YWx1ZXNba2V5XQotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3ApOgotICAgICIiIkRlbGV0ZXMgdGhlIHN1YnNldCBvZiBpdGVtcyBmcm9tIGJldHdlZW4gdGhlIHNwZWNpZmllZCBpbmRpY2VzLiIiIgotICAgIGRlbCBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0KLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKLSAgICAiIiJDb21wYXJlcyB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGFub3RoZXIgb25lLiIiIgotICAgIGlmIHNlbGYgaXMgb3RoZXI6Ci0gICAgICByZXR1cm4gVHJ1ZQotICAgICMgU3BlY2lhbCBjYXNlIGZvciB0aGUgc2FtZSB0eXBlIHdoaWNoIHNob3VsZCBiZSBjb21tb24gYW5kIGZhc3QuCi0gICAgaWYgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgotICAgICAgcmV0dXJuIG90aGVyLl92YWx1ZXMgPT0gc2VsZi5fdmFsdWVzCi0gICAgIyBXZSBhcmUgcHJlc3VtYWJseSBjb21wYXJpbmcgYWdhaW5zdCBzb21lIG90aGVyIHNlcXVlbmNlIHR5cGUuCi0gICAgcmV0dXJuIG90aGVyID09IHNlbGYuX3ZhbHVlcwotCi1jb2xsZWN0aW9ucy5NdXRhYmxlU2VxdWVuY2UucmVnaXN0ZXIoQmFzZUNvbnRhaW5lcikKLQotCi1jbGFzcyBSZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyKEJhc2VDb250YWluZXIpOgotCi0gICIiIlNpbXBsZSwgbGlzdC1saWtlIGNvbnRhaW5lciBmb3IgaG9sZGluZyByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLiIiIgotCi0gICMgRGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KLSAgX19zbG90c19fID0gWydfbWVzc2FnZV9kZXNjcmlwdG9yJ10KLQotICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZV9saXN0ZW5lciwgbWVzc2FnZV9kZXNjcmlwdG9yKToKLSAgICAiIiIKLSAgICBOb3RlIHRoYXQgd2UgcGFzcyBpbiBhIGRlc2NyaXB0b3IgaW5zdGVhZCBvZiB0aGUgZ2VuZXJhdGVkIGRpcmVjdGx5LAotICAgIHNpbmNlIGF0IHRoZSB0aW1lIHdlIGNvbnN0cnVjdCBhIF9SZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIHdlCi0gICAgaGF2ZW4ndCB5ZXQgbmVjZXNzYXJpbHkgaW5pdGlhbGl6ZWQgdGhlIHR5cGUgdGhhdCB3aWxsIGJlIGNvbnRhaW5lZCBpbiB0aGUKLSAgICBjb250YWluZXIuCi0KLSAgICBBcmdzOgotICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQSBNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgIFRoZSBSZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzCi0gICAgICAgIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gICAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IEEgRGVzY3JpcHRvciBpbnN0YW5jZSBkZXNjcmliaW5nIHRoZSBwcm90b2NvbCB0eXBlCi0gICAgICAgIHRoYXQgc2hvdWxkIGJlIHByZXNlbnQgaW4gdGhpcyBjb250YWluZXIuICBXZSdsbCB1c2UgdGhlCi0gICAgICAgIF9jb25jcmV0ZV9jbGFzcyBmaWVsZCBvZiB0aGlzIGRlc2NyaXB0b3Igd2hlbiB0aGUgY2xpZW50IGNhbGxzIGFkZCgpLgotICAgICIiIgotICAgIHN1cGVyKFJlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXIsIHNlbGYpLl9faW5pdF9fKG1lc3NhZ2VfbGlzdGVuZXIpCi0gICAgc2VsZi5fbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZV9kZXNjcmlwdG9yCi0KLSAgZGVmIGFkZChzZWxmLCAqKmt3YXJncyk6Ci0gICAgIiIiQWRkcyBhIG5ldyBlbGVtZW50IGF0IHRoZSBlbmQgb2YgdGhlIGxpc3QgYW5kIHJldHVybnMgaXQuIEtleXdvcmQKLSAgICBhcmd1bWVudHMgbWF5IGJlIHVzZWQgdG8gaW5pdGlhbGl6ZSB0aGUgZWxlbWVudC4KLSAgICAiIiIKLSAgICBuZXdfZWxlbWVudCA9IHNlbGYuX21lc3NhZ2VfZGVzY3JpcHRvci5fY29uY3JldGVfY2xhc3MoKiprd2FyZ3MpCi0gICAgbmV3X2VsZW1lbnQuX1NldExpc3RlbmVyKHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIpCi0gICAgc2VsZi5fdmFsdWVzLmFwcGVuZChuZXdfZWxlbWVudCkKLSAgICBpZiBub3Qgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5kaXJ0eToKLSAgICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotICAgIHJldHVybiBuZXdfZWxlbWVudAotCi0gIGRlZiBleHRlbmQoc2VsZiwgZWxlbV9zZXEpOgotICAgICIiIkV4dGVuZHMgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlCi0gICAgYXMgdGhpcyBvbmUsIGNvcHlpbmcgZWFjaCBpbmRpdmlkdWFsIG1lc3NhZ2UuCi0gICAgIiIiCi0gICAgbWVzc2FnZV9jbGFzcyA9IHNlbGYuX21lc3NhZ2VfZGVzY3JpcHRvci5fY29uY3JldGVfY2xhc3MKLSAgICBsaXN0ZW5lciA9IHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIKLSAgICB2YWx1ZXMgPSBzZWxmLl92YWx1ZXMKLSAgICBmb3IgbWVzc2FnZSBpbiBlbGVtX3NlcToKLSAgICAgIG5ld19lbGVtZW50ID0gbWVzc2FnZV9jbGFzcygpCi0gICAgICBuZXdfZWxlbWVudC5fU2V0TGlzdGVuZXIobGlzdGVuZXIpCi0gICAgICBuZXdfZWxlbWVudC5NZXJnZUZyb20obWVzc2FnZSkKLSAgICAgIHZhbHVlcy5hcHBlbmQobmV3X2VsZW1lbnQpCi0gICAgbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXIpOgotICAgICIiIkFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgcmVwZWF0ZWQgZmllbGQgb2YgdGhlIHNhbWUgdHlwZSB0byB0aGlzCi0gICAgb25lLCBjb3B5aW5nIGVhY2ggaW5kaXZpZHVhbCBtZXNzYWdlLgotICAgICIiIgotICAgIHNlbGYuZXh0ZW5kKG90aGVyLl92YWx1ZXMpCi0KLSAgZGVmIHJlbW92ZShzZWxmLCBlbGVtKToKLSAgICAiIiJSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgbGlzdC4gU2ltaWxhciB0byBsaXN0LnJlbW92ZSgpLiIiIgotICAgIHNlbGYuX3ZhbHVlcy5yZW1vdmUoZWxlbSkKLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgcG9wKHNlbGYsIGtleT0tMSk6Ci0gICAgIiIiUmVtb3ZlcyBhbmQgcmV0dXJucyBhbiBpdGVtIGF0IGEgZ2l2ZW4gaW5kZXguIFNpbWlsYXIgdG8gbGlzdC5wb3AoKS4iIiIKLSAgICB2YWx1ZSA9IHNlbGYuX3ZhbHVlc1trZXldCi0gICAgc2VsZi5fX2RlbGl0ZW1fXyhrZXkpCi0gICAgcmV0dXJuIHZhbHVlCi0KLSAgZGVmIF9fZ2V0c2xpY2VfXyhzZWxmLCBzdGFydCwgc3RvcCk6Ci0gICAgIiIiUmV0cmlldmVzIHRoZSBzdWJzZXQgb2YgaXRlbXMgZnJvbSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy4iIiIKLSAgICByZXR1cm4gc2VsZi5fdmFsdWVzW3N0YXJ0OnN0b3BdCi0KLSAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6Ci0gICAgIiIiRGVsZXRlcyB0aGUgaXRlbSBhdCB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiIiIgotICAgIGRlbCBzZWxmLl92YWx1ZXNba2V5XQotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBfX2RlbHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3ApOgotICAgICIiIkRlbGV0ZXMgdGhlIHN1YnNldCBvZiBpdGVtcyBmcm9tIGJldHdlZW4gdGhlIHNwZWNpZmllZCBpbmRpY2VzLiIiIgotICAgIGRlbCBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0KLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKLSAgICAiIiJDb21wYXJlcyB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGFub3RoZXIgb25lLiIiIgotICAgIGlmIHNlbGYgaXMgb3RoZXI6Ci0gICAgICByZXR1cm4gVHJ1ZQotICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICByYWlzZSBUeXBlRXJyb3IoJ0NhbiBvbmx5IGNvbXBhcmUgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcyBhZ2FpbnN0ICcKLSAgICAgICAgICAgICAgICAgICAgICAnb3RoZXIgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4nKQotICAgIHJldHVybiBzZWxmLl92YWx1ZXMgPT0gb3RoZXIuX3ZhbHVlcwotCi0KLWNsYXNzIFNjYWxhck1hcChNdXRhYmxlTWFwcGluZyk6Ci0KLSAgIiIiU2ltcGxlLCB0eXBlLWNoZWNrZWQsIGRpY3QtbGlrZSBjb250YWluZXIgZm9yIGhvbGRpbmcgcmVwZWF0ZWQgc2NhbGFycy4iIiIKLQotICAjIERpc2FsbG93cyBhc3NpZ25tZW50IHRvIG90aGVyIGF0dHJpYnV0ZXMuCi0gIF9fc2xvdHNfXyA9IFsnX2tleV9jaGVja2VyJywgJ192YWx1ZV9jaGVja2VyJywgJ192YWx1ZXMnLCAnX21lc3NhZ2VfbGlzdGVuZXInXQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX2xpc3RlbmVyLCBrZXlfY2hlY2tlciwgdmFsdWVfY2hlY2tlcik6Ci0gICAgIiIiCi0gICAgQXJnczoKLSAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgotICAgICAgICBUaGUgU2NhbGFyTWFwIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQKLSAgICAgICAgaXMgbW9kaWZpZWQuCi0gICAgICBrZXlfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24ga2V5cwotICAgICAgICBpbnNlcnRlZCBpbnRvIHRoaXMgY29udGFpbmVyLgotICAgICAgdmFsdWVfY2hlY2tlcjogQSB0eXBlX2NoZWNrZXJzLlZhbHVlQ2hlY2tlciBpbnN0YW5jZSB0byBydW4gb24gdmFsdWVzCi0gICAgICAgIGluc2VydGVkIGludG8gdGhpcyBjb250YWluZXIuCi0gICAgIiIiCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lciA9IG1lc3NhZ2VfbGlzdGVuZXIKLSAgICBzZWxmLl9rZXlfY2hlY2tlciA9IGtleV9jaGVja2VyCi0gICAgc2VsZi5fdmFsdWVfY2hlY2tlciA9IHZhbHVlX2NoZWNrZXIKLSAgICBzZWxmLl92YWx1ZXMgPSB7fQotCi0gIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgIHRyeToKLSAgICAgIHJldHVybiBzZWxmLl92YWx1ZXNba2V5XQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgIGtleSA9IHNlbGYuX2tleV9jaGVja2VyLkNoZWNrVmFsdWUoa2V5KQotICAgICAgdmFsID0gc2VsZi5fdmFsdWVfY2hlY2tlci5EZWZhdWx0VmFsdWUoKQotICAgICAgc2VsZi5fdmFsdWVzW2tleV0gPSB2YWwKLSAgICAgIHJldHVybiB2YWwKLQotICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgotICAgICMgV2UgY2hlY2sgdGhlIGtleSdzIHR5cGUgdG8gbWF0Y2ggdGhlIHN0cm9uZy10eXBpbmcgZmxhdm9yIG9mIHRoZSBBUEkuCi0gICAgIyBBbHNvIHRoaXMgbWFrZXMgaXQgZWFzaWVyIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvZiB0aGUgQysrIGltcGxlbWVudGF0aW9uLgotICAgIHNlbGYuX2tleV9jaGVja2VyLkNoZWNrVmFsdWUoaXRlbSkKLSAgICByZXR1cm4gaXRlbSBpbiBzZWxmLl92YWx1ZXMKLQotICAjIFdlIG5lZWQgdG8gb3ZlcnJpZGUgdGhpcyBleHBsaWNpdGx5LCBiZWNhdXNlIG91ciBkZWZhdWx0ZGljdC1saWtlIGJlaGF2aW9yCi0gICMgd2lsbCBtYWtlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIChmcm9tIG91ciBiYXNlIGNsYXNzKSBhbHdheXMgaW5zZXJ0Ci0gICMgdGhlIGtleS4KLSAgZGVmIGdldChzZWxmLCBrZXksIGRlZmF1bHQ9Tm9uZSk6Ci0gICAgaWYga2V5IGluIHNlbGY6Ci0gICAgICByZXR1cm4gc2VsZltrZXldCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBkZWZhdWx0Ci0KLSAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGtleSwgdmFsdWUpOgotICAgIGNoZWNrZWRfa2V5ID0gc2VsZi5fa2V5X2NoZWNrZXIuQ2hlY2tWYWx1ZShrZXkpCi0gICAgY2hlY2tlZF92YWx1ZSA9IHNlbGYuX3ZhbHVlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKLSAgICBzZWxmLl92YWx1ZXNbY2hlY2tlZF9rZXldID0gY2hlY2tlZF92YWx1ZQotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgIGRlbCBzZWxmLl92YWx1ZXNba2V5XQotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBfX2xlbl9fKHNlbGYpOgotICAgIHJldHVybiBsZW4oc2VsZi5fdmFsdWVzKQotCi0gIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICByZXR1cm4gaXRlcihzZWxmLl92YWx1ZXMpCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiByZXByKHNlbGYuX3ZhbHVlcykKLQotICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyKToKLSAgICBzZWxmLl92YWx1ZXMudXBkYXRlKG90aGVyLl92YWx1ZXMpCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIEludmFsaWRhdGVJdGVyYXRvcnMoc2VsZik6Ci0gICAgIyBJdCBhcHBlYXJzIHRoYXQgdGhlIG9ubHkgd2F5IHRvIHJlbGlhYmx5IGludmFsaWRhdGUgaXRlcmF0b3JzIHRvCi0gICAgIyBzZWxmLl92YWx1ZXMgaXMgdG8gZW5zdXJlIHRoYXQgaXRzIHNpemUgY2hhbmdlcy4KLSAgICBvcmlnaW5hbCA9IHNlbGYuX3ZhbHVlcwotICAgIHNlbGYuX3ZhbHVlcyA9IG9yaWdpbmFsLmNvcHkoKQotICAgIG9yaWdpbmFsW05vbmVdID0gTm9uZQotCi0gICMgVGhpcyBpcyBkZWZpbmVkIGluIHRoZSBhYnN0cmFjdCBiYXNlLCBidXQgd2UgY2FuIGRvIGl0IG11Y2ggbW9yZSBjaGVhcGx5LgotICBkZWYgY2xlYXIoc2VsZik6Ci0gICAgc2VsZi5fdmFsdWVzLmNsZWFyKCkKLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotCi1jbGFzcyBNZXNzYWdlTWFwKE11dGFibGVNYXBwaW5nKToKLQotICAiIiJTaW1wbGUsIHR5cGUtY2hlY2tlZCwgZGljdC1saWtlIGNvbnRhaW5lciBmb3Igd2l0aCBzdWJtZXNzYWdlIHZhbHVlcy4iIiIKLQotICAjIERpc2FsbG93cyBhc3NpZ25tZW50IHRvIG90aGVyIGF0dHJpYnV0ZXMuCi0gIF9fc2xvdHNfXyA9IFsnX2tleV9jaGVja2VyJywgJ192YWx1ZXMnLCAnX21lc3NhZ2VfbGlzdGVuZXInLAotICAgICAgICAgICAgICAgJ19tZXNzYWdlX2Rlc2NyaXB0b3InXQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX2xpc3RlbmVyLCBtZXNzYWdlX2Rlc2NyaXB0b3IsIGtleV9jaGVja2VyKToKLSAgICAiIiIKLSAgICBBcmdzOgotICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQSBNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgIFRoZSBTY2FsYXJNYXAgd2lsbCBjYWxsIHRoaXMgb2JqZWN0J3MgTW9kaWZpZWQoKSBtZXRob2Qgd2hlbiBpdAotICAgICAgICBpcyBtb2RpZmllZC4KLSAgICAgIGtleV9jaGVja2VyOiBBIHR5cGVfY2hlY2tlcnMuVmFsdWVDaGVja2VyIGluc3RhbmNlIHRvIHJ1biBvbiBrZXlzCi0gICAgICAgIGluc2VydGVkIGludG8gdGhpcyBjb250YWluZXIuCi0gICAgICB2YWx1ZV9jaGVja2VyOiBBIHR5cGVfY2hlY2tlcnMuVmFsdWVDaGVja2VyIGluc3RhbmNlIHRvIHJ1biBvbiB2YWx1ZXMKLSAgICAgICAgaW5zZXJ0ZWQgaW50byB0aGlzIGNvbnRhaW5lci4KLSAgICAiIiIKLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyID0gbWVzc2FnZV9saXN0ZW5lcgotICAgIHNlbGYuX21lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvcgotICAgIHNlbGYuX2tleV9jaGVja2VyID0ga2V5X2NoZWNrZXIKLSAgICBzZWxmLl92YWx1ZXMgPSB7fQotCi0gIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgIHRyeToKLSAgICAgIHJldHVybiBzZWxmLl92YWx1ZXNba2V5XQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgIGtleSA9IHNlbGYuX2tleV9jaGVja2VyLkNoZWNrVmFsdWUoa2V5KQotICAgICAgbmV3X2VsZW1lbnQgPSBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IuX2NvbmNyZXRlX2NsYXNzKCkKLSAgICAgIG5ld19lbGVtZW50Ll9TZXRMaXN0ZW5lcihzZWxmLl9tZXNzYWdlX2xpc3RlbmVyKQotICAgICAgc2VsZi5fdmFsdWVzW2tleV0gPSBuZXdfZWxlbWVudAotICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgICAgIHJldHVybiBuZXdfZWxlbWVudAotCi0gIGRlZiBnZXRfb3JfY3JlYXRlKHNlbGYsIGtleSk6Ci0gICAgIiIiZ2V0X29yX2NyZWF0ZSgpIGlzIGFuIGFsaWFzIGZvciBnZXRpdGVtIChpZS4gbWFwW2tleV0pLgotCi0gICAgQXJnczoKLSAgICAgIGtleTogVGhlIGtleSB0byBnZXQgb3IgY3JlYXRlIGluIHRoZSBtYXAuCi0KLSAgICBUaGlzIGlzIHVzZWZ1bCBpbiBjYXNlcyB3aGVyZSB5b3Ugd2FudCB0byBiZSBleHBsaWNpdCB0aGF0IHRoZSBjYWxsIGlzCi0gICAgbXV0YXRpbmcgdGhlIG1hcC4gIFRoaXMgY2FuIGF2b2lkIGxpbnQgZXJyb3JzIGZvciBzdGF0ZW1lbnRzIGxpa2UgdGhpcwotICAgIHRoYXQgb3RoZXJ3aXNlIHdvdWxkIGFwcGVhciB0byBiZSBwb2ludGxlc3Mgc3RhdGVtZW50czoKLQotICAgICAgbXNnLm15X21hcFtrZXldCi0gICAgIiIiCi0gICAgcmV0dXJuIHNlbGZba2V5XQotCi0gICMgV2UgbmVlZCB0byBvdmVycmlkZSB0aGlzIGV4cGxpY2l0bHksIGJlY2F1c2Ugb3VyIGRlZmF1bHRkaWN0LWxpa2UgYmVoYXZpb3IKLSAgIyB3aWxsIG1ha2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gKGZyb20gb3VyIGJhc2UgY2xhc3MpIGFsd2F5cyBpbnNlcnQKLSAgIyB0aGUga2V5LgotICBkZWYgZ2V0KHNlbGYsIGtleSwgZGVmYXVsdD1Ob25lKToKLSAgICBpZiBrZXkgaW4gc2VsZjoKLSAgICAgIHJldHVybiBzZWxmW2tleV0KLSAgICBlbHNlOgotICAgICAgcmV0dXJuIGRlZmF1bHQKLQotICBkZWYgX19jb250YWluc19fKHNlbGYsIGl0ZW0pOgotICAgIHJldHVybiBpdGVtIGluIHNlbGYuX3ZhbHVlcwotCi0gIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdNYXkgbm90IHNldCB2YWx1ZXMgZGlyZWN0bHksIGNhbGwgbXlfbWFwW2tleV0uZm9vID0gNScpCi0KLSAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6Ci0gICAgZGVsIHNlbGYuX3ZhbHVlc1trZXldCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIF9fbGVuX18oc2VsZik6Ci0gICAgcmV0dXJuIGxlbihzZWxmLl92YWx1ZXMpCi0KLSAgZGVmIF9faXRlcl9fKHNlbGYpOgotICAgIHJldHVybiBpdGVyKHNlbGYuX3ZhbHVlcykKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuIHJlcHIoc2VsZi5fdmFsdWVzKQotCi0gIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXIpOgotICAgIGZvciBrZXkgaW4gb3RoZXI6Ci0gICAgICBzZWxmW2tleV0uTWVyZ2VGcm9tKG90aGVyW2tleV0pCi0gICAgIyBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkgbm90IHJlcXVpcmVkIGhlcmUsIGJlY2F1c2UKLSAgICAjIG11dGF0aW9ucyB0byBzdWJtZXNzYWdlcyBhbHJlYWR5IHByb3BhZ2F0ZS4KLQotICBkZWYgSW52YWxpZGF0ZUl0ZXJhdG9ycyhzZWxmKToKLSAgICAjIEl0IGFwcGVhcnMgdGhhdCB0aGUgb25seSB3YXkgdG8gcmVsaWFibHkgaW52YWxpZGF0ZSBpdGVyYXRvcnMgdG8KLSAgICAjIHNlbGYuX3ZhbHVlcyBpcyB0byBlbnN1cmUgdGhhdCBpdHMgc2l6ZSBjaGFuZ2VzLgotICAgIG9yaWdpbmFsID0gc2VsZi5fdmFsdWVzCi0gICAgc2VsZi5fdmFsdWVzID0gb3JpZ2luYWwuY29weSgpCi0gICAgb3JpZ2luYWxbTm9uZV0gPSBOb25lCi0KLSAgIyBUaGlzIGlzIGRlZmluZWQgaW4gdGhlIGFic3RyYWN0IGJhc2UsIGJ1dCB3ZSBjYW4gZG8gaXQgbXVjaCBtb3JlIGNoZWFwbHkuCi0gIGRlZiBjbGVhcihzZWxmKToKLSAgICBzZWxmLl92YWx1ZXMuY2xlYXIoKQotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAzMTg2OWU0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVjb2Rlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDg1NCArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkNvZGUgZm9yIGRlY29kaW5nIHByb3RvY29sIGJ1ZmZlciBwcmltaXRpdmVzLgotCi1UaGlzIGNvZGUgaXMgdmVyeSBzaW1pbGFyIHRvIGVuY29kZXIucHkgLS0gcmVhZCB0aGUgZG9jcyBmb3IgdGhhdCBtb2R1bGUgZmlyc3QuCi0KLUEgImRlY29kZXIiIGlzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2lnbmF0dXJlOgotICBEZWNvZGUoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCkKLVRoZSBhcmd1bWVudHMgYXJlOgotICBidWZmZXI6ICAgICBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgbWVzc2FnZS4KLSAgcG9zOiAgICAgICAgVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmluZy4KLSAgZW5kOiAgICAgICAgVGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgd2hlcmUgdGhlIGN1cnJlbnQgbWVzc2FnZSBlbmRzLiAgTWF5IGJlCi0gICAgICAgICAgICAgIGxlc3MgdGhhbiBsZW4oYnVmZmVyKSBpZiB3ZSdyZSByZWFkaW5nIGEgc3ViLW1lc3NhZ2UuCi0gIG1lc3NhZ2U6ICAgIFRoZSBtZXNzYWdlIG9iamVjdCBpbnRvIHdoaWNoIHdlJ3JlIHBhcnNpbmcuCi0gIGZpZWxkX2RpY3Q6IG1lc3NhZ2UuX2ZpZWxkcyAoYXZvaWRzIGEgaGFzaHRhYmxlIGxvb2t1cCkuCi1UaGUgZGVjb2RlciByZWFkcyB0aGUgZmllbGQgYW5kIHN0b3JlcyBpdCBpbnRvIGZpZWxkX2RpY3QsIHJldHVybmluZyB0aGUgbmV3Ci1idWZmZXIgcG9zaXRpb24uICBBIGRlY29kZXIgZm9yIGEgcmVwZWF0ZWQgZmllbGQgbWF5IHByb2FjdGl2ZWx5IGRlY29kZSBhbGwgb2YKLXRoZSBlbGVtZW50cyBvZiB0aGF0IGZpZWxkLCBpZiB0aGV5IGFwcGVhciBjb25zZWN1dGl2ZWx5LgotCi1Ob3RlIHRoYXQgZGVjb2RlcnMgbWF5IHRocm93IGFueSBvZiB0aGUgZm9sbG93aW5nOgotICBJbmRleEVycm9yOiAgSW5kaWNhdGVzIGEgdHJ1bmNhdGVkIG1lc3NhZ2UuCi0gIHN0cnVjdC5lcnJvcjogIFVucGFja2luZyBvZiBhIGZpeGVkLXdpZHRoIGZpZWxkIGZhaWxlZC4KLSAgbWVzc2FnZS5EZWNvZGVFcnJvcjogIE90aGVyIGVycm9ycy4KLQotRGVjb2RlcnMgYXJlIGV4cGVjdGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBjYWxsZWQgd2l0aCBwb3MgPiBlbmQuCi1UaGlzIGFsbG93cyBjYWxsZXJzIHRvIGJlIGxheCBhYm91dCBib3VuZHMgY2hlY2tpbmc6ICBpdCdzIGZpbmV0byByZWFkIHBhc3QKLSJlbmQiIGFzIGxvbmcgYXMgeW91IGFyZSBzdXJlIHRoYXQgc29tZW9uZSBlbHNlIHdpbGwgbm90aWNlIGFuZCB0aHJvdyBhbgotZXhjZXB0aW9uIGxhdGVyIG9uLgotCi1Tb21ldGhpbmcgdXAgdGhlIGNhbGwgc3RhY2sgaXMgZXhwZWN0ZWQgdG8gY2F0Y2ggSW5kZXhFcnJvciBhbmQgc3RydWN0LmVycm9yCi1hbmQgY29udmVydCB0aGVtIHRvIG1lc3NhZ2UuRGVjb2RlRXJyb3IuCi0KLURlY29kZXJzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyBkZWNvZGVyIGNvbnN0cnVjdG9ycyB3aXRoIHRoZSBzaWduYXR1cmU6Ci0gIE1ha2VEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCkKLVRoZSBhcmd1bWVudHMgYXJlOgotICBmaWVsZF9udW1iZXI6ICBUaGUgZmllbGQgbnVtYmVyIG9mIHRoZSBmaWVsZCB3ZSB3YW50IHRvIGRlY29kZS4KLSAgaXNfcmVwZWF0ZWQ6ICAgSXMgdGhlIGZpZWxkIGEgcmVwZWF0ZWQgZmllbGQ/IChib29sKQotICBpc19wYWNrZWQ6ICAgICBJcyB0aGUgZmllbGQgYSBwYWNrZWQgZmllbGQ/IChib29sKQotICBrZXk6ICAgICAgICAgICBUaGUga2V5IHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgdGhlIGZpZWxkIHdpdGhpbiBmaWVsZF9kaWN0LgotICAgICAgICAgICAgICAgICAoVGhpcyBpcyBhY3R1YWxseSB0aGUgRmllbGREZXNjcmlwdG9yIGJ1dCBub3RoaW5nIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgZmlsZSBzaG91bGQgZGVwZW5kIG9uIHRoYXQuKQotICBuZXdfZGVmYXVsdDogICBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgbWVzc2FnZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgYW5kCi0gICAgICAgICAgICAgICAgIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQuCi0gICAgICAgICAgICAgICAgIChUaGlzIGlzIGNhbGxlZCBmb3IgcmVwZWF0ZWQgZmllbGRzIGFuZCBzdWItbWVzc2FnZXMsIHdoZW4gYW4KLSAgICAgICAgICAgICAgICAgaW5zdGFuY2UgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4pCi0KLUFzIHdpdGggZW5jb2RlcnMsIHdlIGRlZmluZSBhIGRlY29kZXIgY29uc3RydWN0b3IgZm9yIGV2ZXJ5IHR5cGUgb2YgZmllbGQuCi1UaGVuLCBmb3IgZXZlcnkgZmllbGQgb2YgZXZlcnkgbWVzc2FnZSBjbGFzcyB3ZSBjb25zdHJ1Y3QgYW4gYWN0dWFsIGRlY29kZXIuCi1UaGF0IGRlY29kZXIgZ29lcyBpbnRvIGEgZGljdCBpbmRleGVkIGJ5IHRhZywgc28gd2hlbiB3ZSBkZWNvZGUgYSBtZXNzYWdlCi13ZSByZXBlYXRlZGx5IHJlYWQgYSB0YWcsIGxvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcgZGVjb2RlciwgYW5kIGludm9rZSBpdC4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ2tlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpJwotCi1pbXBvcnQgc3RydWN0Ci0KLWltcG9ydCBzaXgKLQotaWYgc2l4LlBZMzoKLSAgbG9uZyA9IGludAotCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW5jb2RlcgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0Ci1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQotCi0KLSMgVGhpcyB3aWxsIG92ZXJmbG93IGFuZCB0aHVzIGJlY29tZSBJRUVFLTc1NCAiaW5maW5pdHkiLiAgV2Ugd291bGQgdXNlCi0jICJmbG9hdCgnaW5mJykiIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb24gV2luZG93cyBwcmUtUHl0aG9uLTIuNi4KLV9QT1NfSU5GID0gMWUxMDAwMAotX05FR19JTkYgPSAtX1BPU19JTkYKLV9OQU4gPSBfUE9TX0lORiAqIDAKLQotCi0jIFRoaXMgaXMgbm90IGZvciBvcHRpbWl6YXRpb24sIGJ1dCByYXRoZXIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggbG9jYWwKLSMgdmFyaWFibGVzIG5hbWVkICJtZXNzYWdlIi4KLV9EZWNvZGVFcnJvciA9IG1lc3NhZ2UuRGVjb2RlRXJyb3IKLQotCi1kZWYgX1ZhcmludERlY29kZXIobWFzaywgcmVzdWx0X3R5cGUpOgotICAiIiJSZXR1cm4gYW4gZW5jb2RlciBmb3IgYSBiYXNpYyB2YXJpbnQgdmFsdWUgKGRvZXMgbm90IGluY2x1ZGUgdGFnKS4KLQotICBEZWNvZGVkIHZhbHVlcyB3aWxsIGJlIGJpdHdpc2UtYW5kZWQgd2l0aCB0aGUgZ2l2ZW4gbWFzayBiZWZvcmUgYmVpbmcKLSAgcmV0dXJuZWQsIGUuZy4gdG8gbGltaXQgdGhlbSB0byAzMiBiaXRzLiAgVGhlIHJldHVybmVkIGRlY29kZXIgZG9lcyBub3QKLSAgdGFrZSB0aGUgdXN1YWwgImVuZCIgcGFyYW1ldGVyIC0tIHRoZSBjYWxsZXIgaXMgZXhwZWN0ZWQgdG8gZG8gYm91bmRzIGNoZWNraW5nCi0gIGFmdGVyIHRoZSBmYWN0IChvZnRlbiB0aGUgY2FsbGVyIGNhbiBkZWZlciBzdWNoIGNoZWNraW5nIHVudGlsIGxhdGVyKS4gIFRoZQotICBkZWNvZGVyIHJldHVybnMgYSAodmFsdWUsIG5ld19wb3MpIHBhaXIuCi0gICIiIgotCi0gIGRlZiBEZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpOgotICAgIHJlc3VsdCA9IDAKLSAgICBzaGlmdCA9IDAKLSAgICB3aGlsZSAxOgotICAgICAgYiA9IHNpeC5pbmRleGJ5dGVzKGJ1ZmZlciwgcG9zKQotICAgICAgcmVzdWx0IHw9ICgoYiAmIDB4N2YpIDw8IHNoaWZ0KQotICAgICAgcG9zICs9IDEKLSAgICAgIGlmIG5vdCAoYiAmIDB4ODApOgotICAgICAgICByZXN1bHQgJj0gbWFzawotICAgICAgICByZXN1bHQgPSByZXN1bHRfdHlwZShyZXN1bHQpCi0gICAgICAgIHJldHVybiAocmVzdWx0LCBwb3MpCi0gICAgICBzaGlmdCArPSA3Ci0gICAgICBpZiBzaGlmdCA+PSA2NDoKLSAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUb28gbWFueSBieXRlcyB3aGVuIGRlY29kaW5nIHZhcmludC4nKQotICByZXR1cm4gRGVjb2RlVmFyaW50Ci0KLQotZGVmIF9TaWduZWRWYXJpbnREZWNvZGVyKG1hc2ssIHJlc3VsdF90eXBlKToKLSAgIiIiTGlrZSBfVmFyaW50RGVjb2RlcigpIGJ1dCBkZWNvZGVzIHNpZ25lZCB2YWx1ZXMuIiIiCi0KLSAgZGVmIERlY29kZVZhcmludChidWZmZXIsIHBvcyk6Ci0gICAgcmVzdWx0ID0gMAotICAgIHNoaWZ0ID0gMAotICAgIHdoaWxlIDE6Ci0gICAgICBiID0gc2l4LmluZGV4Ynl0ZXMoYnVmZmVyLCBwb3MpCi0gICAgICByZXN1bHQgfD0gKChiICYgMHg3ZikgPDwgc2hpZnQpCi0gICAgICBwb3MgKz0gMQotICAgICAgaWYgbm90IChiICYgMHg4MCk6Ci0gICAgICAgIGlmIHJlc3VsdCA+IDB4N2ZmZmZmZmZmZmZmZmZmZjoKLSAgICAgICAgICByZXN1bHQgLT0gKDEgPDwgNjQpCi0gICAgICAgICAgcmVzdWx0IHw9IH5tYXNrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgcmVzdWx0ICY9IG1hc2sKLSAgICAgICAgcmVzdWx0ID0gcmVzdWx0X3R5cGUocmVzdWx0KQotICAgICAgICByZXR1cm4gKHJlc3VsdCwgcG9zKQotICAgICAgc2hpZnQgKz0gNwotICAgICAgaWYgc2hpZnQgPj0gNjQ6Ci0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVG9vIG1hbnkgYnl0ZXMgd2hlbiBkZWNvZGluZyB2YXJpbnQuJykKLSAgcmV0dXJuIERlY29kZVZhcmludAotCi0jIFdlIGZvcmNlIDMyLWJpdCB2YWx1ZXMgdG8gaW50IGFuZCA2NC1iaXQgdmFsdWVzIHRvIGxvbmcgdG8gbWFrZQotIyBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zIHdoZXJlIHRoZSBkaXN0aW5jdGlvbiBpcyBtb3JlIHNpZ25pZmljYW50Ci0jIChlLmcuIHRoZSBDKysgaW1wbGVtZW50YXRpb24pIHNpbXBsZXIuCi0KLV9EZWNvZGVWYXJpbnQgPSBfVmFyaW50RGVjb2RlcigoMSA8PCA2NCkgLSAxLCBsb25nKQotX0RlY29kZVNpZ25lZFZhcmludCA9IF9TaWduZWRWYXJpbnREZWNvZGVyKCgxIDw8IDY0KSAtIDEsIGxvbmcpCi0KLSMgVXNlIHRoZXNlIHZlcnNpb25zIGZvciB2YWx1ZXMgd2hpY2ggbXVzdCBiZSBsaW1pdGVkIHRvIDMyIGJpdHMuCi1fRGVjb2RlVmFyaW50MzIgPSBfVmFyaW50RGVjb2RlcigoMSA8PCAzMikgLSAxLCBpbnQpCi1fRGVjb2RlU2lnbmVkVmFyaW50MzIgPSBfU2lnbmVkVmFyaW50RGVjb2RlcigoMSA8PCAzMikgLSAxLCBpbnQpCi0KLQotZGVmIFJlYWRUYWcoYnVmZmVyLCBwb3MpOgotICAiIiJSZWFkIGEgdGFnIGZyb20gdGhlIGJ1ZmZlciwgYW5kIHJldHVybiBhICh0YWdfYnl0ZXMsIG5ld19wb3MpIHR1cGxlLgotCi0gIFdlIHJldHVybiB0aGUgcmF3IGJ5dGVzIG9mIHRoZSB0YWcgcmF0aGVyIHRoYW4gZGVjb2RpbmcgdGhlbS4gIFRoZSByYXcKLSAgYnl0ZXMgY2FuIHRoZW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBwcm9wZXIgZGVjb2Rlci4gIFRoaXMgZWZmZWN0aXZlbHkgYWxsb3dzCi0gIHVzIHRvIHRyYWRlIHNvbWUgd29yayB0aGF0IHdvdWxkIGJlIGRvbmUgaW4gcHVyZS1weXRob24gKGRlY29kaW5nIGEgdmFyaW50KQotICBmb3Igd29yayB0aGF0IGlzIGRvbmUgaW4gQyAoc2VhcmNoaW5nIGZvciBhIGJ5dGUgc3RyaW5nIGluIGEgaGFzaCB0YWJsZSkuCi0gIEluIGEgbG93LWxldmVsIGxhbmd1YWdlIGl0IHdvdWxkIGJlIG11Y2ggY2hlYXBlciB0byBkZWNvZGUgdGhlIHZhcmludCBhbmQKLSAgdXNlIHRoYXQsIGJ1dCBub3QgaW4gUHl0aG9uLgotICAiIiIKLQotICBzdGFydCA9IHBvcwotICB3aGlsZSBzaXguaW5kZXhieXRlcyhidWZmZXIsIHBvcykgJiAweDgwOgotICAgIHBvcyArPSAxCi0gIHBvcyArPSAxCi0gIHJldHVybiAoYnVmZmVyW3N0YXJ0OnBvc10sIHBvcykKLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotZGVmIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgZGVjb2RlX3ZhbHVlKToKLSAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGEgZGVjb2RlciBmb3IgZmllbGRzIG9mIGEgcGFydGljdWxhciB0eXBlLgotCi0gIEFyZ3M6Ci0gICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUuCi0gICAgICBkZWNvZGVfdmFsdWU6ICBBIGZ1bmN0aW9uIHdoaWNoIGRlY29kZXMgYW4gaW5kaXZpZHVhbCB2YWx1ZSwgZS5nLgotICAgICAgICBfRGVjb2RlVmFyaW50KCkKLSAgIiIiCi0KLSAgZGVmIFNwZWNpZmljRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpOgotICAgIGlmIGlzX3BhY2tlZDoKLSAgICAgIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKLSAgICAgIGRlZiBEZWNvZGVQYWNrZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKLSAgICAgICAgKGVuZHBvaW50LCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgICBlbmRwb2ludCArPSBwb3MKLSAgICAgICAgaWYgZW5kcG9pbnQgPiBlbmQ6Ci0gICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICAgICAgICB3aGlsZSBwb3MgPCBlbmRwb2ludDoKLSAgICAgICAgICAoZWxlbWVudCwgcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKLSAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKLSAgICAgICAgaWYgcG9zID4gZW5kcG9pbnQ6Ci0gICAgICAgICAgZGVsIHZhbHVlWy0xXSAgICMgRGlzY2FyZCBjb3JydXB0IHZhbHVlLgotICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignUGFja2VkIGVsZW1lbnQgd2FzIHRydW5jYXRlZC4nKQotICAgICAgICByZXR1cm4gcG9zCi0gICAgICByZXR1cm4gRGVjb2RlUGFja2VkRmllbGQKLSAgICBlbGlmIGlzX3JlcGVhdGVkOgotICAgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQotICAgICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQotICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCi0gICAgICAgIHdoaWxlIDE6Ci0gICAgICAgICAgKGVsZW1lbnQsIG5ld19wb3MpID0gZGVjb2RlX3ZhbHVlKGJ1ZmZlciwgcG9zKQotICAgICAgICAgIHZhbHVlLmFwcGVuZChlbGVtZW50KQotICAgICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQKLSAgICAgICAgICAjIGZpZWxkLgotICAgICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCi0gICAgICAgICAgaWYgYnVmZmVyW25ld19wb3M6cG9zXSAhPSB0YWdfYnl0ZXMgb3IgbmV3X3BvcyA+PSBlbmQ6Ci0gICAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgotICAgICAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKLSAgICAgICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICAgICAgICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICAgIHJldHVybiBEZWNvZGVSZXBlYXRlZEZpZWxkCi0gICAgZWxzZToKLSAgICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICAgICAgKGZpZWxkX2RpY3Rba2V5XSwgcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKLSAgICAgICAgaWYgcG9zID4gZW5kOgotICAgICAgICAgIGRlbCBmaWVsZF9kaWN0W2tleV0gICMgRGlzY2FyZCBjb3JydXB0IHZhbHVlLgotICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICAgICAgcmV0dXJuIHBvcwotICAgICAgcmV0dXJuIERlY29kZUZpZWxkCi0KLSAgcmV0dXJuIFNwZWNpZmljRGVjb2RlcgotCi0KLWRlZiBfTW9kaWZpZWREZWNvZGVyKHdpcmVfdHlwZSwgZGVjb2RlX3ZhbHVlLCBtb2RpZnlfdmFsdWUpOgotICAiIiJMaWtlIFNpbXBsZURlY29kZXIgYnV0IGFkZGl0aW9uYWxseSBpbnZva2VzIG1vZGlmeV92YWx1ZSBvbiBldmVyeSB2YWx1ZQotICBiZWZvcmUgc3RvcmluZyBpdC4gIFVzdWFsbHkgbW9kaWZ5X3ZhbHVlIGlzIFppZ1phZ0RlY29kZS4KLSAgIiIiCi0KLSAgIyBSZXVzaW5nIF9TaW1wbGVEZWNvZGVyIGlzIHNsaWdodGx5IHNsb3dlciB0aGFuIGNvcHlpbmcgYSBidW5jaCBvZiBjb2RlLCBidXQKLSAgIyBub3QgZW5vdWdoIHRvIG1ha2UgYSBzaWduaWZpY2FudCBkaWZmZXJlbmNlLgotCi0gIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6Ci0gICAgKHJlc3VsdCwgbmV3X3BvcykgPSBkZWNvZGVfdmFsdWUoYnVmZmVyLCBwb3MpCi0gICAgcmV0dXJuIChtb2RpZnlfdmFsdWUocmVzdWx0KSwgbmV3X3BvcykKLSAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgSW5uZXJEZWNvZGUpCi0KLQotZGVmIF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX3R5cGUsIGZvcm1hdCk6Ci0gICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhIGRlY29kZXIgZm9yIGEgZml4ZWQtd2lkdGggZmllbGQuCi0KLSAgQXJnczoKLSAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZS4KLSAgICAgIGZvcm1hdDogIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHBhc3MgdG8gc3RydWN0LnVucGFjaygpLgotICAiIiIKLQotICB2YWx1ZV9zaXplID0gc3RydWN0LmNhbGNzaXplKGZvcm1hdCkKLSAgbG9jYWxfdW5wYWNrID0gc3RydWN0LnVucGFjawotCi0gICMgUmV1c2luZyBfU2ltcGxlRGVjb2RlciBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBjb3B5aW5nIGEgYnVuY2ggb2YgY29kZSwgYnV0Ci0gICMgbm90IGVub3VnaCB0byBtYWtlIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4KLQotICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKLSAgIyBpdCB0byBfRGVjb2RlRXJyb3IgLS0gdGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSB0byBzZXQgdXAgZXhjZXB0aW9uLQotICAjIGhhbmRsaW5nIGJsb2NrcyBldmVyeSB0aW1lIHdlIHBhcnNlIG9uZSB2YWx1ZS4KLQotICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgotICAgIG5ld19wb3MgPSBwb3MgKyB2YWx1ZV9zaXplCi0gICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKGZvcm1hdCwgYnVmZmVyW3BvczpuZXdfcG9zXSlbMF0KLSAgICByZXR1cm4gKHJlc3VsdCwgbmV3X3BvcykKLSAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfdHlwZSwgSW5uZXJEZWNvZGUpCi0KLQotZGVmIF9GbG9hdERlY29kZXIoKToKLSAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgZmxvYXQgZmllbGQuCi0KLSAgVGhpcyBjb2RlIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBzdHJ1Y3QudW5wYWNrIGZvciBub24tZmluaXRlIDMyLWJpdAotICBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCi0gICIiIgotCi0gIGxvY2FsX3VucGFjayA9IHN0cnVjdC51bnBhY2sKLQotICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgotICAgICMgV2UgZXhwZWN0IGEgMzItYml0IHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4gIEJpdCAxIGlzIHRoZSBzaWduCi0gICAgIyBiaXQsIGJpdHMgMi05IHJlcHJlc2VudCB0aGUgZXhwb25lbnQsIGFuZCBiaXRzIDEwLTMyIGFyZSB0aGUgc2lnbmlmaWNhbmQuCi0gICAgbmV3X3BvcyA9IHBvcyArIDQKLSAgICBmbG9hdF9ieXRlcyA9IGJ1ZmZlcltwb3M6bmV3X3Bvc10KLQotICAgICMgSWYgdGhpcyB2YWx1ZSBoYXMgYWxsIGl0cyBleHBvbmVudCBiaXRzIHNldCwgdGhlbiBpdCdzIG5vbi1maW5pdGUuCi0gICAgIyBJbiBQeXRob24gMi40LCBzdHJ1Y3QudW5wYWNrIHdpbGwgY29udmVydCBpdCB0byBhIGZpbml0ZSA2NC1iaXQgdmFsdWUuCi0gICAgIyBUbyBhdm9pZCB0aGF0LCB3ZSBwYXJzZSBpdCBzcGVjaWFsbHkuCi0gICAgaWYgKGZsb2F0X2J5dGVzWzM6NF0gaW4gYidceDdGXHhGRicgYW5kIGZsb2F0X2J5dGVzWzI6M10gPj0gYidceDgwJyk6Ci0gICAgICAjIElmIGF0IGxlYXN0IG9uZSBzaWduaWZpY2FuZCBiaXQgaXMgc2V0Li4uCi0gICAgICBpZiBmbG9hdF9ieXRlc1swOjNdICE9IGInXHgwMFx4MDBceDgwJzoKLSAgICAgICAgcmV0dXJuIChfTkFOLCBuZXdfcG9zKQotICAgICAgIyBJZiBzaWduIGJpdCBpcyBzZXQuLi4KLSAgICAgIGlmIGZsb2F0X2J5dGVzWzM6NF0gPT0gYidceEZGJzoKLSAgICAgICAgcmV0dXJuIChfTkVHX0lORiwgbmV3X3BvcykKLSAgICAgIHJldHVybiAoX1BPU19JTkYsIG5ld19wb3MpCi0KLSAgICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKLSAgICAjIGl0IHRvIF9EZWNvZGVFcnJvciAtLSB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHNldCB1cCBleGNlcHRpb24tCi0gICAgIyBoYW5kbGluZyBibG9ja3MgZXZlcnkgdGltZSB3ZSBwYXJzZSBvbmUgdmFsdWUuCi0gICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKCc8ZicsIGZsb2F0X2J5dGVzKVswXQotICAgIHJldHVybiAocmVzdWx0LCBuZXdfcG9zKQotICByZXR1cm4gX1NpbXBsZURlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgSW5uZXJEZWNvZGUpCi0KLQotZGVmIF9Eb3VibGVEZWNvZGVyKCk6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGRvdWJsZSBmaWVsZC4KLQotICBUaGlzIGNvZGUgd29ya3MgYXJvdW5kIGEgYnVnIGluIHN0cnVjdC51bnBhY2sgZm9yIG5vdC1hLW51bWJlci4KLSAgIiIiCi0KLSAgbG9jYWxfdW5wYWNrID0gc3RydWN0LnVucGFjawotCi0gIGRlZiBJbm5lckRlY29kZShidWZmZXIsIHBvcyk6Ci0gICAgIyBXZSBleHBlY3QgYSA2NC1iaXQgdmFsdWUgaW4gbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLiAgQml0IDEgaXMgdGhlIHNpZ24KLSAgICAjIGJpdCwgYml0cyAyLTEyIHJlcHJlc2VudCB0aGUgZXhwb25lbnQsIGFuZCBiaXRzIDEzLTY0IGFyZSB0aGUgc2lnbmlmaWNhbmQuCi0gICAgbmV3X3BvcyA9IHBvcyArIDgKLSAgICBkb3VibGVfYnl0ZXMgPSBidWZmZXJbcG9zOm5ld19wb3NdCi0KLSAgICAjIElmIHRoaXMgdmFsdWUgaGFzIGFsbCBpdHMgZXhwb25lbnQgYml0cyBzZXQgYW5kIGF0IGxlYXN0IG9uZSBzaWduaWZpY2FuZAotICAgICMgYml0IHNldCwgaXQncyBub3QgYSBudW1iZXIuICBJbiBQeXRob24gMi40LCBzdHJ1Y3QudW5wYWNrIHdpbGwgdHJlYXQgaXQKLSAgICAjIGFzIGluZiBvciAtaW5mLiAgVG8gYXZvaWQgdGhhdCwgd2UgdHJlYXQgaXQgc3BlY2lhbGx5LgotICAgIGlmICgoZG91YmxlX2J5dGVzWzc6OF0gaW4gYidceDdGXHhGRicpCi0gICAgICAgIGFuZCAoZG91YmxlX2J5dGVzWzY6N10gPj0gYidceEYwJykKLSAgICAgICAgYW5kIChkb3VibGVfYnl0ZXNbMDo3XSAhPSBiJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjAnKSk6Ci0gICAgICByZXR1cm4gKF9OQU4sIG5ld19wb3MpCi0KLSAgICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKLSAgICAjIGl0IHRvIF9EZWNvZGVFcnJvciAtLSB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHNldCB1cCBleGNlcHRpb24tCi0gICAgIyBoYW5kbGluZyBibG9ja3MgZXZlcnkgdGltZSB3ZSBwYXJzZSBvbmUgdmFsdWUuCi0gICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKCc8ZCcsIGRvdWJsZV9ieXRlcylbMF0KLSAgICByZXR1cm4gKHJlc3VsdCwgbmV3X3BvcykKLSAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsIElubmVyRGVjb2RlKQotCi0KLWRlZiBFbnVtRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpOgotICBlbnVtX3R5cGUgPSBrZXkuZW51bV90eXBlCi0gIGlmIGlzX3BhY2tlZDoKLSAgICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0gICAgZGVmIERlY29kZVBhY2tlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgKGVuZHBvaW50LCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgZW5kcG9pbnQgKz0gcG9zCi0gICAgICBpZiBlbmRwb2ludCA+IGVuZDoKLSAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICAgICAgd2hpbGUgcG9zIDwgZW5kcG9pbnQ6Ci0gICAgICAgIHZhbHVlX3N0YXJ0X3BvcyA9IHBvcwotICAgICAgICAoZWxlbWVudCwgcG9zKSA9IF9EZWNvZGVTaWduZWRWYXJpbnQzMihidWZmZXIsIHBvcykKLSAgICAgICAgaWYgZWxlbWVudCBpbiBlbnVtX3R5cGUudmFsdWVzX2J5X251bWJlcjoKLSAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpZiBub3QgbWVzc2FnZS5fdW5rbm93bl9maWVsZHM6Ci0gICAgICAgICAgICBtZXNzYWdlLl91bmtub3duX2ZpZWxkcyA9IFtdCi0gICAgICAgICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpCi0gICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuYXBwZW5kKAotICAgICAgICAgICAgICAodGFnX2J5dGVzLCBidWZmZXJbdmFsdWVfc3RhcnRfcG9zOnBvc10pKQotICAgICAgaWYgcG9zID4gZW5kcG9pbnQ6Ci0gICAgICAgIGlmIGVsZW1lbnQgaW4gZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXI6Ci0gICAgICAgICAgZGVsIHZhbHVlWy0xXSAgICMgRGlzY2FyZCBjb3JydXB0IHZhbHVlLgotICAgICAgICBlbHNlOgotICAgICAgICAgIGRlbCBtZXNzYWdlLl91bmtub3duX2ZpZWxkc1stMV0KLSAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdQYWNrZWQgZWxlbWVudCB3YXMgdHJ1bmNhdGVkLicpCi0gICAgICByZXR1cm4gcG9zCi0gICAgcmV0dXJuIERlY29kZVBhY2tlZEZpZWxkCi0gIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKLSAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKLSAgICBkZWYgRGVjb2RlUmVwZWF0ZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQotICAgICAgaWYgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKLSAgICAgIHdoaWxlIDE6Ci0gICAgICAgIChlbGVtZW50LCBuZXdfcG9zKSA9IF9EZWNvZGVTaWduZWRWYXJpbnQzMihidWZmZXIsIHBvcykKLSAgICAgICAgaWYgZWxlbWVudCBpbiBlbnVtX3R5cGUudmFsdWVzX2J5X251bWJlcjoKLSAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBpZiBub3QgbWVzc2FnZS5fdW5rbm93bl9maWVsZHM6Ci0gICAgICAgICAgICBtZXNzYWdlLl91bmtub3duX2ZpZWxkcyA9IFtdCi0gICAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuYXBwZW5kKAotICAgICAgICAgICAgICAodGFnX2J5dGVzLCBidWZmZXJbcG9zOm5ld19wb3NdKSkKLSAgICAgICAgIyBQcmVkaWN0IHRoYXQgdGhlIG5leHQgdGFnIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSByZXBlYXRlZAotICAgICAgICAjIGZpZWxkLgotICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgotICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID49IGVuZDoKLSAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgotICAgICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCi0gICAgICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAotICBlbHNlOgotICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICAgIHZhbHVlX3N0YXJ0X3BvcyA9IHBvcwotICAgICAgKGVudW1fdmFsdWUsIHBvcykgPSBfRGVjb2RlU2lnbmVkVmFyaW50MzIoYnVmZmVyLCBwb3MpCi0gICAgICBpZiBwb3MgPiBlbmQ6Ci0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICAgIGlmIGVudW1fdmFsdWUgaW4gZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXI6Ci0gICAgICAgIGZpZWxkX2RpY3Rba2V5XSA9IGVudW1fdmFsdWUKLSAgICAgIGVsc2U6Ci0gICAgICAgIGlmIG5vdCBtZXNzYWdlLl91bmtub3duX2ZpZWxkczoKLSAgICAgICAgICBtZXNzYWdlLl91bmtub3duX2ZpZWxkcyA9IFtdCi0gICAgICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKLSAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuYXBwZW5kKAotICAgICAgICAgICh0YWdfYnl0ZXMsIGJ1ZmZlclt2YWx1ZV9zdGFydF9wb3M6cG9zXSkpCi0gICAgICByZXR1cm4gcG9zCi0gICAgcmV0dXJuIERlY29kZUZpZWxkCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLUludDMyRGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKAotICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVNpZ25lZFZhcmludDMyKQotCi1JbnQ2NERlY29kZXIgPSBfU2ltcGxlRGVjb2RlcigKLSAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVTaWduZWRWYXJpbnQpCi0KLVVJbnQzMkRlY29kZXIgPSBfU2ltcGxlRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQzMikKLVVJbnQ2NERlY29kZXIgPSBfU2ltcGxlRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQpCi0KLVNJbnQzMkRlY29kZXIgPSBfTW9kaWZpZWREZWNvZGVyKAotICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludDMyLCB3aXJlX2Zvcm1hdC5aaWdaYWdEZWNvZGUpCi1TSW50NjREZWNvZGVyID0gX01vZGlmaWVkRGVjb2RlcigKLSAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQsIHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZSkKLQotIyBOb3RlIHRoYXQgUHl0aG9uIGNvbnZlbmllbnRseSBndWFyYW50ZWVzIHRoYXQgd2hlbiB1c2luZyB0aGUgJzwnIHByZWZpeCBvbgotIyBmb3JtYXRzLCB0aGV5IHdpbGwgYWxzbyBoYXZlIHRoZSBzYW1lIHNpemUgYWNyb3NzIGFsbCBwbGF0Zm9ybXMgKGFzIG9wcG9zZWQKLSMgdG8gd2l0aG91dCB0aGUgcHJlZml4LCB3aGVyZSB0aGVpciBzaXplcyBkZXBlbmQgb24gdGhlIEMgY29tcGlsZXIncyBiYXNpYwotIyB0eXBlIHNpemVzKS4KLUZpeGVkMzJEZWNvZGVyICA9IF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPEknKQotRml4ZWQ2NERlY29kZXIgID0gX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8UScpCi1TRml4ZWQzMkRlY29kZXIgPSBfU3RydWN0UGFja0RlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxpJykKLVNGaXhlZDY0RGVjb2RlciA9IF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPHEnKQotRmxvYXREZWNvZGVyID0gX0Zsb2F0RGVjb2RlcigpCi1Eb3VibGVEZWNvZGVyID0gX0RvdWJsZURlY29kZXIoKQotCi1Cb29sRGVjb2RlciA9IF9Nb2RpZmllZERlY29kZXIoCi0gICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlVmFyaW50LCBib29sKQotCi0KLWRlZiBTdHJpbmdEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIHN0cmluZyBmaWVsZC4iIiIKLQotICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0gIGxvY2FsX3VuaWNvZGUgPSBzaXgudGV4dF90eXBlCi0KLSAgZGVmIF9Db252ZXJ0VG9Vbmljb2RlKGJ5dGVfc3RyKToKLSAgICB0cnk6Ci0gICAgICByZXR1cm4gbG9jYWxfdW5pY29kZShieXRlX3N0ciwgJ3V0Zi04JykKLSAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yIGFzIGU6Ci0gICAgICAjIGFkZCBtb3JlIGluZm9ybWF0aW9uIHRvIHRoZSBlcnJvciBtZXNzYWdlIGFuZCByZS1yYWlzZSBpdC4KLSAgICAgIGUucmVhc29uID0gJyVzIGluIGZpZWxkOiAlcycgJSAoZSwga2V5LmZ1bGxfbmFtZSkKLSAgICAgIHJhaXNlCi0KLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQotICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgd2hpbGUgMToKLSAgICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCi0gICAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCi0gICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgc3RyaW5nLicpCi0gICAgICAgIHZhbHVlLmFwcGVuZChfQ29udmVydFRvVW5pY29kZShidWZmZXJbcG9zOm5ld19wb3NdKSkKLSAgICAgICAgIyBQcmVkaWN0IHRoYXQgdGhlIG5leHQgdGFnIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSByZXBlYXRlZCBmaWVsZC4KLSAgICAgICAgcG9zID0gbmV3X3BvcyArIHRhZ19sZW4KLSAgICAgICAgaWYgYnVmZmVyW25ld19wb3M6cG9zXSAhPSB0YWdfYnl0ZXMgb3IgbmV3X3BvcyA9PSBlbmQ6Ci0gICAgICAgICAgIyBQcmVkaWN0aW9uIGZhaWxlZC4gIFJldHVybi4KLSAgICAgICAgICByZXR1cm4gbmV3X3BvcwotICAgIHJldHVybiBEZWNvZGVSZXBlYXRlZEZpZWxkCi0gIGVsc2U6Ci0gICAgZGVmIERlY29kZUZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCi0gICAgICBuZXdfcG9zID0gcG9zICsgc2l6ZQotICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKLSAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgc3RyaW5nLicpCi0gICAgICBmaWVsZF9kaWN0W2tleV0gPSBfQ29udmVydFRvVW5pY29kZShidWZmZXJbcG9zOm5ld19wb3NdKQotICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICByZXR1cm4gRGVjb2RlRmllbGQKLQotCi1kZWYgQnl0ZXNEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGJ5dGVzIGZpZWxkLiIiIgotCi0gIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKLQotICBhc3NlcnQgbm90IGlzX3BhY2tlZAotICBpZiBpc19yZXBlYXRlZDoKLSAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCi0gICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKLSAgICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCi0gICAgICB3aGlsZSAxOgotICAgICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKLSAgICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKLSAgICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKLSAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBzdHJpbmcuJykKLSAgICAgICAgdmFsdWUuYXBwZW5kKGJ1ZmZlcltwb3M6bmV3X3Bvc10pCi0gICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCi0gICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCi0gICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgotICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCi0gICAgICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAotICBlbHNlOgotICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKLSAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIHN0cmluZy4nKQotICAgICAgZmllbGRfZGljdFtrZXldID0gYnVmZmVyW3BvczpuZXdfcG9zXQotICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICByZXR1cm4gRGVjb2RlRmllbGQKLQotCi1kZWYgR3JvdXBEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgotCi0gIGVuZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQotICBlbmRfdGFnX2xlbiA9IGxlbihlbmRfdGFnX2J5dGVzKQotCi0gIGFzc2VydCBub3QgaXNfcGFja2VkCi0gIGlmIGlzX3JlcGVhdGVkOgotICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApCi0gICAgdGFnX2xlbiA9IGxlbih0YWdfYnl0ZXMpCi0gICAgZGVmIERlY29kZVJlcGVhdGVkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKLSAgICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCi0gICAgICB3aGlsZSAxOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKLSAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCi0gICAgICAgIHBvcyA9IHZhbHVlLmFkZCgpLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBlbmQpCi0gICAgICAgICMgUmVhZCBlbmQgdGFnLgotICAgICAgICBuZXdfcG9zID0gcG9zK2VuZF90YWdfbGVuCi0gICAgICAgIGlmIGJ1ZmZlcltwb3M6bmV3X3Bvc10gIT0gZW5kX3RhZ19ieXRlcyBvciBuZXdfcG9zID4gZW5kOgotICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCi0gICAgICAgICMgUHJlZGljdCB0aGF0IHRoZSBuZXh0IHRhZyBpcyBhbm90aGVyIGNvcHkgb2YgdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQuCi0gICAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCi0gICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPT0gZW5kOgotICAgICAgICAgICMgUHJlZGljdGlvbiBmYWlsZWQuICBSZXR1cm4uCi0gICAgICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAotICBlbHNlOgotICAgIGRlZiBEZWNvZGVGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQotICAgICAgaWYgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKLSAgICAgICMgUmVhZCBzdWItbWVzc2FnZS4KLSAgICAgIHBvcyA9IHZhbHVlLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBlbmQpCi0gICAgICAjIFJlYWQgZW5kIHRhZy4KLSAgICAgIG5ld19wb3MgPSBwb3MrZW5kX3RhZ19sZW4KLSAgICAgIGlmIGJ1ZmZlcltwb3M6bmV3X3Bvc10gIT0gZW5kX3RhZ19ieXRlcyBvciBuZXdfcG9zID4gZW5kOgotICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ01pc3NpbmcgZ3JvdXAgZW5kIHRhZy4nKQotICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICByZXR1cm4gRGVjb2RlRmllbGQKLQotCi1kZWYgTWVzc2FnZURlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KToKLSAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgbWVzc2FnZSBmaWVsZC4iIiIKLQotICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0KLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQotICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgd2hpbGUgMToKLSAgICAgICAgIyBSZWFkIGxlbmd0aC4KLSAgICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCi0gICAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCi0gICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICAgICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCi0gICAgICAgIGlmIHZhbHVlLmFkZCgpLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBuZXdfcG9zKSAhPSBuZXdfcG9zOgotICAgICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdAotICAgICAgICAgICMgZW5jb3VudGVyZWQgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nKQotICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkIGZpZWxkLgotICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgotICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKLSAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgotICAgICAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgcmV0dXJuIERlY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKLSAgICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCi0gICAgICAjIFJlYWQgbGVuZ3RoLgotICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCi0gICAgICBuZXdfcG9zID0gcG9zICsgc2l6ZQotICAgICAgaWYgbmV3X3BvcyA+IGVuZDoKLSAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICAgICAgIyBSZWFkIHN1Yi1tZXNzYWdlLgotICAgICAgaWYgdmFsdWUuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBwb3MsIG5ld19wb3MpICE9IG5ld19wb3M6Ci0gICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdCBlbmNvdW50ZXJlZAotICAgICAgICAjIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCi0gICAgICByZXR1cm4gbmV3X3BvcwotICAgIHJldHVybiBEZWNvZGVGaWVsZAotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTUVTU0FHRV9TRVRfSVRFTV9UQUcgPSBlbmNvZGVyLlRhZ0J5dGVzKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKQotCi1kZWYgTWVzc2FnZVNldEl0ZW1EZWNvZGVyKGV4dGVuc2lvbnNfYnlfbnVtYmVyKToKLSAgIiIiUmV0dXJucyBhIGRlY29kZXIgZm9yIGEgTWVzc2FnZVNldCBpdGVtLgotCi0gIFRoZSBwYXJhbWV0ZXIgaXMgdGhlIF9leHRlbnNpb25zX2J5X251bWJlciBtYXAgZm9yIHRoZSBtZXNzYWdlIGNsYXNzLgotCi0gIFRoZSBtZXNzYWdlIHNldCBtZXNzYWdlIGxvb2tzIGxpa2UgdGhpczoKLSAgICBtZXNzYWdlIE1lc3NhZ2VTZXQgewotICAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgewotICAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKLSAgICAgICAgcmVxdWlyZWQgc3RyaW5nIG1lc3NhZ2UgPSAzOwotICAgICAgfQotICAgIH0KLSAgIiIiCi0KLSAgdHlwZV9pZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKLSAgbWVzc2FnZV90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDMsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gIGl0ZW1fZW5kX3RhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKQotCi0gIGxvY2FsX1JlYWRUYWcgPSBSZWFkVGFnCi0gIGxvY2FsX0RlY29kZVZhcmludCA9IF9EZWNvZGVWYXJpbnQKLSAgbG9jYWxfU2tpcEZpZWxkID0gU2tpcEZpZWxkCi0KLSAgZGVmIERlY29kZUl0ZW0oYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgbWVzc2FnZV9zZXRfaXRlbV9zdGFydCA9IHBvcwotICAgIHR5cGVfaWQgPSAtMQotICAgIG1lc3NhZ2Vfc3RhcnQgPSAtMQotICAgIG1lc3NhZ2VfZW5kID0gLTEKLQotICAgICMgVGVjaG5pY2FsbHksIHR5cGVfaWQgYW5kIG1lc3NhZ2UgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIsIHNvIHdlIG5lZWQKLSAgICAjIGEgbGl0dGxlIGxvb3AgaGVyZS4KLSAgICB3aGlsZSAxOgotICAgICAgKHRhZ19ieXRlcywgcG9zKSA9IGxvY2FsX1JlYWRUYWcoYnVmZmVyLCBwb3MpCi0gICAgICBpZiB0YWdfYnl0ZXMgPT0gdHlwZV9pZF90YWdfYnl0ZXM6Ci0gICAgICAgICh0eXBlX2lkLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gbWVzc2FnZV90YWdfYnl0ZXM6Ci0gICAgICAgIChzaXplLCBtZXNzYWdlX3N0YXJ0KSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKLSAgICAgICAgcG9zID0gbWVzc2FnZV9lbmQgPSBtZXNzYWdlX3N0YXJ0ICsgc2l6ZQotICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gaXRlbV9lbmRfdGFnX2J5dGVzOgotICAgICAgICBicmVhawotICAgICAgZWxzZToKLSAgICAgICAgcG9zID0gU2tpcEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIHRhZ19ieXRlcykKLSAgICAgICAgaWYgcG9zID09IC0xOgotICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCi0KLSAgICBpZiBwb3MgPiBlbmQ6Ci0gICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCi0KLSAgICBpZiB0eXBlX2lkID09IC0xOgotICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNZXNzYWdlU2V0IGl0ZW0gbWlzc2luZyB0eXBlX2lkLicpCi0gICAgaWYgbWVzc2FnZV9zdGFydCA9PSAtMToKLSAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWVzc2FnZVNldCBpdGVtIG1pc3NpbmcgbWVzc2FnZS4nKQotCi0gICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc19ieV9udW1iZXIuZ2V0KHR5cGVfaWQpCi0gICAgaWYgZXh0ZW5zaW9uIGlzIG5vdCBOb25lOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChleHRlbnNpb24pCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdCgKLSAgICAgICAgICAgIGV4dGVuc2lvbiwgZXh0ZW5zaW9uLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKSkKLSAgICAgIGlmIHZhbHVlLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgbWVzc2FnZV9zdGFydCxtZXNzYWdlX2VuZCkgIT0gbWVzc2FnZV9lbmQ6Ci0gICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdCBlbmNvdW50ZXJlZAotICAgICAgICAjIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCi0gICAgZWxzZToKLSAgICAgIGlmIG5vdCBtZXNzYWdlLl91bmtub3duX2ZpZWxkczoKLSAgICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMgPSBbXQotICAgICAgbWVzc2FnZS5fdW5rbm93bl9maWVsZHMuYXBwZW5kKChNRVNTQUdFX1NFVF9JVEVNX1RBRywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyW21lc3NhZ2Vfc2V0X2l0ZW1fc3RhcnQ6cG9zXSkpCi0KLSAgICByZXR1cm4gcG9zCi0KLSAgcmV0dXJuIERlY29kZUl0ZW0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1kZWYgTWFwRGVjb2RlcihmaWVsZF9kZXNjcmlwdG9yLCBuZXdfZGVmYXVsdCwgaXNfbWVzc2FnZV9tYXApOgotICAiIiJSZXR1cm5zIGEgZGVjb2RlciBmb3IgYSBtYXAgZmllbGQuIiIiCi0KLSAga2V5ID0gZmllbGRfZGVzY3JpcHRvcgotICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQotICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0gICMgQ2FuJ3QgcmVhZCBfY29uY3JldGVfY2xhc3MgeWV0OyBtaWdodCBub3QgYmUgaW5pdGlhbGl6ZWQuCi0gIG1lc3NhZ2VfdHlwZSA9IGZpZWxkX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlCi0KLSAgZGVmIERlY29kZU1hcChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICBzdWJtc2cgPSBtZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKCkKLSAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKLSAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKLSAgICB3aGlsZSAxOgotICAgICAgIyBSZWFkIGxlbmd0aC4KLSAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKLSAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICAgICMgUmVhZCBzdWItbWVzc2FnZS4KLSAgICAgIHN1Ym1zZy5DbGVhcigpCi0gICAgICBpZiBzdWJtc2cuX0ludGVybmFsUGFyc2UoYnVmZmVyLCBwb3MsIG5ld19wb3MpICE9IG5ld19wb3M6Ci0gICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdAotICAgICAgICAjIGVuY291bnRlcmVkIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCi0KLSAgICAgIGlmIGlzX21lc3NhZ2VfbWFwOgotICAgICAgICB2YWx1ZVtzdWJtc2cua2V5XS5NZXJnZUZyb20oc3VibXNnLnZhbHVlKQotICAgICAgZWxzZToKLSAgICAgICAgdmFsdWVbc3VibXNnLmtleV0gPSBzdWJtc2cudmFsdWUKLQotICAgICAgIyBQcmVkaWN0IHRoYXQgdGhlIG5leHQgdGFnIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSByZXBlYXRlZCBmaWVsZC4KLSAgICAgIHBvcyA9IG5ld19wb3MgKyB0YWdfbGVuCi0gICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKLSAgICAgICAgIyBQcmVkaWN0aW9uIGZhaWxlZC4gIFJldHVybi4KLSAgICAgICAgcmV0dXJuIG5ld19wb3MKLQotICByZXR1cm4gRGVjb2RlTWFwCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgT3B0aW1pemF0aW9uIGlzIG5vdCBhcyBoZWF2eSBoZXJlIGJlY2F1c2UgY2FsbHMgdG8gU2tpcEZpZWxkKCkgYXJlIHJhcmUsCi0jIGV4Y2VwdCBmb3IgaGFuZGxpbmcgZW5kLWdyb3VwIHRhZ3MuCi0KLWRlZiBfU2tpcFZhcmludChidWZmZXIsIHBvcywgZW5kKToKLSAgIiIiU2tpcCBhIHZhcmludCB2YWx1ZS4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKLSAgIyBQcmV2aW91c2x5IG9yZChidWZmZXJbcG9zXSkgcmFpc2VkIEluZGV4RXJyb3Igd2hlbiBwb3MgaXMgb3V0IG9mIHJhbmdlLgotICAjIFdpdGggdGhpcyBjb2RlLCBvcmQoYicnKSByYWlzZXMgVHlwZUVycm9yLiAgQm90aCBhcmUgaGFuZGxlZCBpbgotICAjIHB5dGhvbl9tZXNzYWdlLnB5IHRvIGdlbmVyYXRlIGEgJ1RydW5jYXRlZCBtZXNzYWdlJyBlcnJvci4KLSAgd2hpbGUgb3JkKGJ1ZmZlcltwb3M6cG9zKzFdKSAmIDB4ODA6Ci0gICAgcG9zICs9IDEKLSAgcG9zICs9IDEKLSAgaWYgcG9zID4gZW5kOgotICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgcmV0dXJuIHBvcwotCi1kZWYgX1NraXBGaXhlZDY0KGJ1ZmZlciwgcG9zLCBlbmQpOgotICAiIiJTa2lwIGEgZml4ZWQ2NCB2YWx1ZS4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKLQotICBwb3MgKz0gOAotICBpZiBwb3MgPiBlbmQ6Ci0gICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICByZXR1cm4gcG9zCi0KLWRlZiBfU2tpcExlbmd0aERlbGltaXRlZChidWZmZXIsIHBvcywgZW5kKToKLSAgIiIiU2tpcCBhIGxlbmd0aC1kZWxpbWl0ZWQgdmFsdWUuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCi0KLSAgKHNpemUsIHBvcykgPSBfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICBwb3MgKz0gc2l6ZQotICBpZiBwb3MgPiBlbmQ6Ci0gICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICByZXR1cm4gcG9zCi0KLWRlZiBfU2tpcEdyb3VwKGJ1ZmZlciwgcG9zLCBlbmQpOgotICAiIiJTa2lwIHN1Yi1ncm91cC4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKLQotICB3aGlsZSAxOgotICAgICh0YWdfYnl0ZXMsIHBvcykgPSBSZWFkVGFnKGJ1ZmZlciwgcG9zKQotICAgIG5ld19wb3MgPSBTa2lwRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgdGFnX2J5dGVzKQotICAgIGlmIG5ld19wb3MgPT0gLTE6Ci0gICAgICByZXR1cm4gcG9zCi0gICAgcG9zID0gbmV3X3BvcwotCi1kZWYgX0VuZEdyb3VwKGJ1ZmZlciwgcG9zLCBlbmQpOgotICAiIiJTa2lwcGluZyBhbiBFTkRfR1JPVVAgdGFnIHJldHVybnMgLTEgdG8gdGVsbCB0aGUgcGFyZW50IGxvb3AgdG8gYnJlYWsuIiIiCi0KLSAgcmV0dXJuIC0xCi0KLWRlZiBfU2tpcEZpeGVkMzIoYnVmZmVyLCBwb3MsIGVuZCk6Ci0gICIiIlNraXAgYSBmaXhlZDMyIHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgotCi0gIHBvcyArPSA0Ci0gIGlmIHBvcyA+IGVuZDoKLSAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCi0gIHJldHVybiBwb3MKLQotZGVmIF9SYWlzZUludmFsaWRXaXJlVHlwZShidWZmZXIsIHBvcywgZW5kKToKLSAgIiIiU2tpcCBmdW5jdGlvbiBmb3IgdW5rbm93biB3aXJlIHR5cGVzLiAgUmFpc2VzIGFuIGV4Y2VwdGlvbi4iIiIKLQotICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RhZyBoYWQgaW52YWxpZCB3aXJlIHR5cGUuJykKLQotZGVmIF9GaWVsZFNraXBwZXIoKToKLSAgIiIiQ29uc3RydWN0cyB0aGUgU2tpcEZpZWxkIGZ1bmN0aW9uLiIiIgotCi0gIFdJUkVUWVBFX1RPX1NLSVBQRVIgPSBbCi0gICAgICBfU2tpcFZhcmludCwKLSAgICAgIF9Ta2lwRml4ZWQ2NCwKLSAgICAgIF9Ta2lwTGVuZ3RoRGVsaW1pdGVkLAotICAgICAgX1NraXBHcm91cCwKLSAgICAgIF9FbmRHcm91cCwKLSAgICAgIF9Ta2lwRml4ZWQzMiwKLSAgICAgIF9SYWlzZUludmFsaWRXaXJlVHlwZSwKLSAgICAgIF9SYWlzZUludmFsaWRXaXJlVHlwZSwKLSAgICAgIF0KLQotICB3aXJldHlwZV9tYXNrID0gd2lyZV9mb3JtYXQuVEFHX1RZUEVfTUFTSwotCi0gIGRlZiBTa2lwRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgdGFnX2J5dGVzKToKLSAgICAiIiJTa2lwcyBhIGZpZWxkIHdpdGggdGhlIHNwZWNpZmllZCB0YWcuCi0KLSAgICB8cG9zfCBzaG91bGQgcG9pbnQgdG8gdGhlIGJ5dGUgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4KLQotICAgIFJldHVybnM6Ci0gICAgICAgIFRoZSBuZXcgcG9zaXRpb24gKGFmdGVyIHRoZSB0YWcgdmFsdWUpLCBvciAtMSBpZiB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cAotICAgICAgICB0YWcgKGluIHdoaWNoIGNhc2UgdGhlIGNhbGxpbmcgbG9vcCBzaG91bGQgYnJlYWspLgotICAgICIiIgotCi0gICAgIyBUaGUgd2lyZSB0eXBlIGlzIGFsd2F5cyBpbiB0aGUgZmlyc3QgYnl0ZSBzaW5jZSB2YXJpbnRzIGFyZSBsaXR0bGUtZW5kaWFuLgotICAgIHdpcmVfdHlwZSA9IG9yZCh0YWdfYnl0ZXNbMDoxXSkgJiB3aXJldHlwZV9tYXNrCi0gICAgcmV0dXJuIFdJUkVUWVBFX1RPX1NLSVBQRVJbd2lyZV90eXBlXShidWZmZXIsIHBvcywgZW5kKQotCi0gIHJldHVybiBTa2lwRmllbGQKLQotU2tpcEZpZWxkID0gX0ZpZWxkU2tpcHBlcigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9kYXRhYmFzZV90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MjI1YTQ1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9kYXRhYmFzZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjkgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUZXN0cyBmb3IgZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfZGF0YWJhc2UuIiIiCi0KLV9fYXV0aG9yX18gPSAnbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKScKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZmFjdG9yeV90ZXN0Ml9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX2RhdGFiYXNlCi0KLQotY2xhc3MgRGVzY3JpcHRvckRhdGFiYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RBZGQoc2VsZik6Ci0gICAgZGIgPSBkZXNjcmlwdG9yX2RhdGFiYXNlLkRlc2NyaXB0b3JEYXRhYmFzZSgpCi0gICAgZmlsZV9kZXNjX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAotICAgICAgICBmYWN0b3J5X3Rlc3QyX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCi0gICAgZGIuQWRkKGZpbGVfZGVzY19wcm90bykKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUJ5TmFtZSgKLSAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2Rlc2NfcHJvdG8sIGRiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaWxlX2Rlc2NfcHJvdG8sIGRiLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLk5lc3RlZEZhY3RvcnkyTWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCi0gICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyRW51bScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlsZV9kZXNjX3Byb3RvLCBkYi5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCi0gICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZS5OZXN0ZWRGYWN0b3J5MkVudW0nKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpbGVfZGVzY19wcm90bywgZGIuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAotICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5NZXNzYWdlV2l0aE5lc3RlZEVudW1Pbmx5Lk5lc3RlZEVudW0nKSkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmExM2UwYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzUwICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLSMKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVGVzdHMgZm9yIGdvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yX3Bvb2wuIiIiCi0KLV9fYXV0aG9yX18gPSAnbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKScKLQotaW1wb3J0IG9zCi1pbXBvcnQgc3lzCi0KLXRyeToKLSAgaW1wb3J0IHVuaXR0ZXN0MiBhcyB1bml0dGVzdCAgI1BZMjYKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgaW1wb3J0IHVuaXR0ZXN0Ci0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbF90ZXN0MV9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2xfdGVzdDJfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZmFjdG9yeV90ZXN0MV9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBmYWN0b3J5X3Rlc3QyX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1vcmVfbWVzc2FnZXNfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfZGF0YWJhc2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlX2ZhY3RvcnkKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UKLQotCi1jbGFzcyBEZXNjcmlwdG9yUG9vbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLnBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQotICAgIHNlbGYuZmFjdG9yeV90ZXN0MV9mZCA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKLSAgICAgICAgZmFjdG9yeV90ZXN0MV9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQotICAgIHNlbGYuZmFjdG9yeV90ZXN0Ml9mZCA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKLSAgICAgICAgZmFjdG9yeV90ZXN0Ml9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQotICAgIHNlbGYucG9vbC5BZGQoc2VsZi5mYWN0b3J5X3Rlc3QxX2ZkKQotICAgIHNlbGYucG9vbC5BZGQoc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkKQotCi0gIGRlZiB0ZXN0RmluZEZpbGVCeU5hbWUoc2VsZik6Ci0gICAgbmFtZTEgPSAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8nCi0gICAgZmlsZV9kZXNjMSA9IHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZShuYW1lMSkKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjMSwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKG5hbWUxLCBmaWxlX2Rlc2MxLm5hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcsIGZpbGVfZGVzYzEucGFja2FnZSkKLSAgICBzZWxmLmFzc2VydEluKCdGYWN0b3J5MU1lc3NhZ2UnLCBmaWxlX2Rlc2MxLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKLQotICAgIG5hbWUyID0gJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvJwotICAgIGZpbGVfZGVzYzIgPSBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUobmFtZTIpCi0gICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGZpbGVfZGVzYzIsIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChuYW1lMiwgZmlsZV9kZXNjMi5uYW1lKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwnLCBmaWxlX2Rlc2MyLnBhY2thZ2UpCi0gICAgc2VsZi5hc3NlcnRJbignRmFjdG9yeTJNZXNzYWdlJywgZmlsZV9kZXNjMi5tZXNzYWdlX3R5cGVzX2J5X25hbWUpCi0KLSAgZGVmIHRlc3RGaW5kRmlsZUJ5TmFtZUZhaWx1cmUoc2VsZik6Ci0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6Ci0gICAgICBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoJ0RvZXMgbm90IGV4aXN0JykKLQotICBkZWYgdGVzdEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzZWxmKToKLSAgICBmaWxlX2Rlc2MxID0gc2VsZi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlJykKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZmlsZV9kZXNjMSwgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90bycsCi0gICAgICAgICAgICAgICAgICAgICBmaWxlX2Rlc2MxLm5hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcsIGZpbGVfZGVzYzEucGFja2FnZSkKLSAgICBzZWxmLmFzc2VydEluKCdGYWN0b3J5MU1lc3NhZ2UnLCBmaWxlX2Rlc2MxLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZSkKLQotICAgIGZpbGVfZGVzYzIgPSBzZWxmLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAotICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShmaWxlX2Rlc2MyLCBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvJywKLSAgICAgICAgICAgICAgICAgICAgIGZpbGVfZGVzYzIubmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsJywgZmlsZV9kZXNjMi5wYWNrYWdlKQotICAgIHNlbGYuYXNzZXJ0SW4oJ0ZhY3RvcnkyTWVzc2FnZScsIGZpbGVfZGVzYzIubWVzc2FnZV90eXBlc19ieV9uYW1lKQotCi0gIGRlZiB0ZXN0RmluZEZpbGVDb250YWluaW5nU3ltYm9sRmFpbHVyZShzZWxmKToKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKLSAgICAgIHNlbGYucG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woJ0RvZXMgbm90IGV4aXN0JykKLQotICBkZWYgdGVzdEZpbmRNZXNzYWdlVHlwZUJ5TmFtZShzZWxmKToKLSAgICBtc2cxID0gc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlJykKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnMSwgZGVzY3JpcHRvci5EZXNjcmlwdG9yKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZhY3RvcnkxTWVzc2FnZScsIG1zZzEubmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkxTWVzc2FnZScsCi0gICAgICAgICAgICAgICAgICAgICBtc2cxLmZ1bGxfbmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIG1zZzEuY29udGFpbmluZ190eXBlKQotCi0gICAgbmVzdGVkX21zZzEgPSBtc2cxLm5lc3RlZF90eXBlc1swXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ05lc3RlZEZhY3RvcnkxTWVzc2FnZScsIG5lc3RlZF9tc2cxLm5hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtc2cxLCBuZXN0ZWRfbXNnMS5jb250YWluaW5nX3R5cGUpCi0KLSAgICBuZXN0ZWRfZW51bTEgPSBtc2cxLmVudW1fdHlwZXNbMF0KLSAgICBzZWxmLmFzc2VydEVxdWFsKCdOZXN0ZWRGYWN0b3J5MUVudW0nLCBuZXN0ZWRfZW51bTEubmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzEsIG5lc3RlZF9lbnVtMS5jb250YWluaW5nX3R5cGUpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKG5lc3RlZF9tc2cxLCBtc2cxLmZpZWxkc19ieV9uYW1lWwotICAgICAgICAnbmVzdGVkX2ZhY3RvcnlfMV9tZXNzYWdlJ10ubWVzc2FnZV90eXBlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobmVzdGVkX2VudW0xLCBtc2cxLmZpZWxkc19ieV9uYW1lWwotICAgICAgICAnbmVzdGVkX2ZhY3RvcnlfMV9lbnVtJ10uZW51bV90eXBlKQotCi0gICAgbXNnMiA9IHNlbGYucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCi0gICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZzIsIGRlc2NyaXB0b3IuRGVzY3JpcHRvcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdGYWN0b3J5Mk1lc3NhZ2UnLCBtc2cyLm5hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2UnLAotICAgICAgICAgICAgICAgICAgICAgbXNnMi5mdWxsX25hbWUpCi0gICAgc2VsZi5hc3NlcnRJc05vbmUobXNnMi5jb250YWluaW5nX3R5cGUpCi0KLSAgICBuZXN0ZWRfbXNnMiA9IG1zZzIubmVzdGVkX3R5cGVzWzBdCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnTmVzdGVkRmFjdG9yeTJNZXNzYWdlJywgbmVzdGVkX21zZzIubmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZzIsIG5lc3RlZF9tc2cyLmNvbnRhaW5pbmdfdHlwZSkKLQotICAgIG5lc3RlZF9lbnVtMiA9IG1zZzIuZW51bV90eXBlc1swXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ05lc3RlZEZhY3RvcnkyRW51bScsIG5lc3RlZF9lbnVtMi5uYW1lKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnMiwgbmVzdGVkX2VudW0yLmNvbnRhaW5pbmdfdHlwZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobmVzdGVkX21zZzIsIG1zZzIuZmllbGRzX2J5X25hbWVbCi0gICAgICAgICduZXN0ZWRfZmFjdG9yeV8yX21lc3NhZ2UnXS5tZXNzYWdlX3R5cGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChuZXN0ZWRfZW51bTIsIG1zZzIuZmllbGRzX2J5X25hbWVbCi0gICAgICAgICduZXN0ZWRfZmFjdG9yeV8yX2VudW0nXS5lbnVtX3R5cGUpCi0KLSAgICBzZWxmLmFzc2VydFRydWUobXNnMi5maWVsZHNfYnlfbmFtZVsnaW50X3dpdGhfZGVmYXVsdCddLmhhc19kZWZhdWx0X3ZhbHVlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDE3NzYsIG1zZzIuZmllbGRzX2J5X25hbWVbJ2ludF93aXRoX2RlZmF1bHQnXS5kZWZhdWx0X3ZhbHVlKQotCi0gICAgc2VsZi5hc3NlcnRUcnVlKAotICAgICAgICBtc2cyLmZpZWxkc19ieV9uYW1lWydkb3VibGVfd2l0aF9kZWZhdWx0J10uaGFzX2RlZmF1bHRfdmFsdWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgOS45OSwgbXNnMi5maWVsZHNfYnlfbmFtZVsnZG91YmxlX3dpdGhfZGVmYXVsdCddLmRlZmF1bHRfdmFsdWUpCi0KLSAgICBzZWxmLmFzc2VydFRydWUoCi0gICAgICAgIG1zZzIuZmllbGRzX2J5X25hbWVbJ3N0cmluZ193aXRoX2RlZmF1bHQnXS5oYXNfZGVmYXVsdF92YWx1ZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAnaGVsbG8gd29ybGQnLCBtc2cyLmZpZWxkc19ieV9uYW1lWydzdHJpbmdfd2l0aF9kZWZhdWx0J10uZGVmYXVsdF92YWx1ZSkKLQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cyLmZpZWxkc19ieV9uYW1lWydib29sX3dpdGhfZGVmYXVsdCddLmhhc19kZWZhdWx0X3ZhbHVlKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnMi5maWVsZHNfYnlfbmFtZVsnYm9vbF93aXRoX2RlZmF1bHQnXS5kZWZhdWx0X3ZhbHVlKQotCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1zZzIuZmllbGRzX2J5X25hbWVbJ2VudW1fd2l0aF9kZWZhdWx0J10uaGFzX2RlZmF1bHRfdmFsdWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgMSwgbXNnMi5maWVsZHNfYnlfbmFtZVsnZW51bV93aXRoX2RlZmF1bHQnXS5kZWZhdWx0X3ZhbHVlKQotCi0gICAgbXNnMyA9IHNlbGYucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCi0gICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZS5OZXN0ZWRGYWN0b3J5Mk1lc3NhZ2UnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobmVzdGVkX21zZzIsIG1zZzMpCi0KLSAgICBzZWxmLmFzc2VydFRydWUobXNnMi5maWVsZHNfYnlfbmFtZVsnYnl0ZXNfd2l0aF9kZWZhdWx0J10uaGFzX2RlZmF1bHRfdmFsdWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgYidhXHhmYlx4MDBjJywKLSAgICAgICAgbXNnMi5maWVsZHNfYnlfbmFtZVsnYnl0ZXNfd2l0aF9kZWZhdWx0J10uZGVmYXVsdF92YWx1ZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKG1zZzIub25lb2ZzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihtc2cyLm9uZW9mc19ieV9uYW1lKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihtc2cyLm9uZW9mc1swXS5maWVsZHMpKQotICAgIGZvciBuYW1lIGluIFsnb25lb2ZfaW50JywgJ29uZW9mX3N0cmluZyddOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChtc2cyLm9uZW9mc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgbXNnMi5maWVsZHNfYnlfbmFtZVtuYW1lXS5jb250YWluaW5nX29uZW9mKQotICAgICAgc2VsZi5hc3NlcnRJbihtc2cyLmZpZWxkc19ieV9uYW1lW25hbWVdLCBtc2cyLm9uZW9mc1swXS5maWVsZHMpCi0KLSAgZGVmIHRlc3RGaW5kTWVzc2FnZVR5cGVCeU5hbWVGYWlsdXJlKHNlbGYpOgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgnRG9lcyBub3QgZXhpc3QnKQotCi0gIGRlZiB0ZXN0RmluZEVudW1UeXBlQnlOYW1lKHNlbGYpOgotICAgIGVudW0xID0gc2VsZi5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFFbnVtJykKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZW51bTEsIGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBlbnVtMS52YWx1ZXNfYnlfbmFtZVsnRkFDVE9SWV8xX1ZBTFVFXzAnXS5udW1iZXIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBlbnVtMS52YWx1ZXNfYnlfbmFtZVsnRkFDVE9SWV8xX1ZBTFVFXzEnXS5udW1iZXIpCi0KLSAgICBuZXN0ZWRfZW51bTEgPSBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAotICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MU1lc3NhZ2UuTmVzdGVkRmFjdG9yeTFFbnVtJykKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobmVzdGVkX2VudW0xLCBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDAsIG5lc3RlZF9lbnVtMS52YWx1ZXNfYnlfbmFtZVsnTkVTVEVEX0ZBQ1RPUllfMV9WQUxVRV8wJ10ubnVtYmVyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDEsIG5lc3RlZF9lbnVtMS52YWx1ZXNfYnlfbmFtZVsnTkVTVEVEX0ZBQ1RPUllfMV9WQUxVRV8xJ10ubnVtYmVyKQotCi0gICAgZW51bTIgPSBzZWxmLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAotICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MkVudW0nKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShlbnVtMiwgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGVudW0yLnZhbHVlc19ieV9uYW1lWydGQUNUT1JZXzJfVkFMVUVfMCddLm51bWJlcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGVudW0yLnZhbHVlc19ieV9uYW1lWydGQUNUT1JZXzJfVkFMVUVfMSddLm51bWJlcikKLQotICAgIG5lc3RlZF9lbnVtMiA9IHNlbGYucG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoCi0gICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZS5OZXN0ZWRGYWN0b3J5MkVudW0nKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShuZXN0ZWRfZW51bTIsIGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgMCwgbmVzdGVkX2VudW0yLnZhbHVlc19ieV9uYW1lWydORVNURURfRkFDVE9SWV8yX1ZBTFVFXzAnXS5udW1iZXIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgMSwgbmVzdGVkX2VudW0yLnZhbHVlc19ieV9uYW1lWydORVNURURfRkFDVE9SWV8yX1ZBTFVFXzEnXS5udW1iZXIpCi0KLSAgZGVmIHRlc3RGaW5kRW51bVR5cGVCeU5hbWVGYWlsdXJlKHNlbGYpOgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgc2VsZi5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgnRG9lcyBub3QgZXhpc3QnKQotCi0gIGRlZiB0ZXN0RmluZEZpZWxkQnlOYW1lKHNlbGYpOgotICAgIGZpZWxkID0gc2VsZi5wb29sLkZpbmRGaWVsZEJ5TmFtZSgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlLmxpc3RfdmFsdWUnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmllbGQubmFtZSwgJ2xpc3RfdmFsdWUnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmllbGQubGFiZWwsIGZpZWxkLkxBQkVMX1JFUEVBVEVEKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgc2VsZi5wb29sLkZpbmRGaWVsZEJ5TmFtZSgnRG9lcyBub3QgZXhpc3QnKQotCi0gIGRlZiB0ZXN0RmluZEV4dGVuc2lvbkJ5TmFtZShzZWxmKToKLSAgICAjIEFuIGV4dGVuc2lvbiBkZWZpbmVkIGluIGEgbWVzc2FnZS4KLSAgICBleHRlbnNpb24gPSBzZWxmLnBvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZSgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLm9uZV9tb3JlX2ZpZWxkJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGV4dGVuc2lvbi5uYW1lLCAnb25lX21vcmVfZmllbGQnKQotICAgICMgQW4gZXh0ZW5zaW9uIGRlZmluZWQgYXQgZmlsZSBzY29wZS4KLSAgICBleHRlbnNpb24gPSBzZWxmLnBvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZSgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuYW5vdGhlcl9maWVsZCcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChleHRlbnNpb24ubmFtZSwgJ2Fub3RoZXJfZmllbGQnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXh0ZW5zaW9uLm51bWJlciwgMTAwMikKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKLSAgICAgIHNlbGYucG9vbC5GaW5kRmllbGRCeU5hbWUoJ0RvZXMgbm90IGV4aXN0JykKLQotICBkZWYgdGVzdEV4dGVuc2lvbnNBcmVOb3RGaWVsZHMoc2VsZik6Ci0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6Ci0gICAgICBzZWxmLnBvb2wuRmluZEZpZWxkQnlOYW1lKCdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmFub3RoZXJfZmllbGQnKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgc2VsZi5wb29sLkZpbmRGaWVsZEJ5TmFtZSgKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5Mk1lc3NhZ2Uub25lX21vcmVfZmllbGQnKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgc2VsZi5wb29sLkZpbmRFeHRlbnNpb25CeU5hbWUoCi0gICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlLmxpc3RfdmFsdWUnKQotCi0gIGRlZiB0ZXN0VXNlckRlZmluZWREQihzZWxmKToKLSAgICBkYiA9IGRlc2NyaXB0b3JfZGF0YWJhc2UuRGVzY3JpcHRvckRhdGFiYXNlKCkKLSAgICBzZWxmLnBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woZGIpCi0gICAgZGIuQWRkKHNlbGYuZmFjdG9yeV90ZXN0MV9mZCkKLSAgICBkYi5BZGQoc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkKQotICAgIHNlbGYudGVzdEZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgpCi0KLSAgZGVmIHRlc3RBZGRTZXJpYWxpemVkRmlsZShzZWxmKToKLSAgICBzZWxmLnBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQotICAgIHNlbGYucG9vbC5BZGRTZXJpYWxpemVkRmlsZShzZWxmLmZhY3RvcnlfdGVzdDFfZmQuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLnBvb2wuQWRkU2VyaWFsaXplZEZpbGUoc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi50ZXN0RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCkKLQotICBkZWYgdGVzdENvbXBsZXhOZXN0aW5nKHNlbGYpOgotICAgIG1vcmVfbWVzc2FnZXNfZGVzYyA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uRnJvbVN0cmluZygKLSAgICAgICAgbW9yZV9tZXNzYWdlc19wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQotICAgIHRlc3QxX2Rlc2MgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCi0gICAgICAgIGRlc2NyaXB0b3JfcG9vbF90ZXN0MV9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQotICAgIHRlc3QyX2Rlc2MgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCi0gICAgICAgIGRlc2NyaXB0b3JfcG9vbF90ZXN0Ml9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKQotICAgIHNlbGYucG9vbC5BZGQobW9yZV9tZXNzYWdlc19kZXNjKQotICAgIHNlbGYucG9vbC5BZGQodGVzdDFfZGVzYykKLSAgICBzZWxmLnBvb2wuQWRkKHRlc3QyX2Rlc2MpCi0gICAgVEVTVDFfRklMRS5DaGVja0ZpbGUoc2VsZiwgc2VsZi5wb29sKQotICAgIFRFU1QyX0ZJTEUuQ2hlY2tGaWxlKHNlbGYsIHNlbGYucG9vbCkKLQotCi0gIGRlZiB0ZXN0RW51bURlZmF1bHRWYWx1ZShzZWxmKToKLSAgICAiIiJUZXN0IHRoZSBkZWZhdWx0IHZhbHVlIG9mIGVudW1zIHdoaWNoIGRvbid0IHN0YXJ0IGF0IHplcm8uIiIiCi0gICAgZGVmIF9DaGVja0RlZmF1bHRWYWx1ZShmaWxlX2Rlc2NyaXB0b3IpOgotICAgICAgZGVmYXVsdF92YWx1ZSA9IChmaWxlX2Rlc2NyaXB0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnRGVzY3JpcHRvclBvb2xUZXN0MSddCi0gICAgICAgICAgICAgICAgICAgICAgIC5maWVsZHNfYnlfbmFtZVsnbmVzdGVkX2VudW0nXQotICAgICAgICAgICAgICAgICAgICAgICAuZGVmYXVsdF92YWx1ZSkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVmYXVsdF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sX3Rlc3QxX3BiMi5EZXNjcmlwdG9yUG9vbFRlc3QxLkJFVEEpCi0gICAgIyBGaXJzdCBjaGVjayB3aGF0IHRoZSBnZW5lcmF0ZWQgZGVzY3JpcHRvciBjb250YWlucy4KLSAgICBfQ2hlY2tEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcl9wb29sX3Rlc3QxX3BiMi5ERVNDUklQVE9SKQotICAgICMgVGhlbiBjaGVjayB0aGUgZ2VuZXJhdGVkIHBvb2wuIE5vcm1hbGx5IHRoaXMgaXMgdGhlIHNhbWUgZGVzY3JpcHRvci4KLSAgICBmaWxlX2Rlc2NyaXB0b3IgPSBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpLnBvb2wuRmluZEZpbGVCeU5hbWUoCi0gICAgICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QxLnByb3RvJykKLSAgICBzZWxmLmFzc2VydElzKGZpbGVfZGVzY3JpcHRvciwgZGVzY3JpcHRvcl9wb29sX3Rlc3QxX3BiMi5ERVNDUklQVE9SKQotICAgIF9DaGVja0RlZmF1bHRWYWx1ZShmaWxlX2Rlc2NyaXB0b3IpCi0KLSAgICAjIFRoZW4gY2hlY2sgdGhlIGR5bmFtaWMgcG9vbCBhbmQgaXRzIGludGVybmFsIERlc2NyaXB0b3JEYXRhYmFzZS4KLSAgICBkZXNjcmlwdG9yX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAotICAgICAgICBkZXNjcmlwdG9yX3Bvb2xfdGVzdDFfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikKLSAgICBzZWxmLnBvb2wuQWRkKGRlc2NyaXB0b3JfcHJvdG8pCi0gICAgIyBBbmQgZG8gdGhlIHNhbWUgY2hlY2sgYXMgYWJvdmUKLSAgICBmaWxlX2Rlc2NyaXB0b3IgPSBzZWxmLnBvb2wuRmluZEZpbGVCeU5hbWUoCi0gICAgICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QxLnByb3RvJykKLSAgICBfQ2hlY2tEZWZhdWx0VmFsdWUoZmlsZV9kZXNjcmlwdG9yKQotCi0gIGRlZiB0ZXN0RGVmYXVsdFZhbHVlRm9yQ3VzdG9tTWVzc2FnZXMoc2VsZik6Ci0gICAgIiIiQ2hlY2sgdGhlIHZhbHVlIHJldHVybmVkIGJ5IG5vbi1leGlzdGVudCBmaWVsZHMuIiIiCi0gICAgZGVmIF9DaGVja1ZhbHVlQW5kVHlwZSh2YWx1ZSwgZXhwZWN0ZWRfdmFsdWUsIGV4cGVjdGVkX3R5cGUpOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCh2YWx1ZSwgZXhwZWN0ZWRfdmFsdWUpCi0gICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmFsdWUsIGV4cGVjdGVkX3R5cGUpCi0KLSAgICBkZWYgX0NoZWNrRGVmYXVsdFZhbHVlcyhtc2cpOgotICAgICAgdHJ5OgotICAgICAgICBpbnQ2NCA9IGxvbmcKLSAgICAgIGV4Y2VwdCBOYW1lRXJyb3I6ICAjIFB5dGhvbjMKLSAgICAgICAgaW50NjQgPSBpbnQKLSAgICAgIHRyeToKLSAgICAgICAgdW5pY29kZV90eXBlID0gdW5pY29kZQotICAgICAgZXhjZXB0IE5hbWVFcnJvcjogICMgUHl0aG9uMwotICAgICAgICB1bmljb2RlX3R5cGUgPSBzdHIKLSAgICAgIF9DaGVja1ZhbHVlQW5kVHlwZShtc2cub3B0aW9uYWxfaW50MzIsIDAsIGludCkKLSAgICAgIF9DaGVja1ZhbHVlQW5kVHlwZShtc2cub3B0aW9uYWxfdWludDY0LCAwLCAoaW50NjQsIGludCkpCi0gICAgICBfQ2hlY2tWYWx1ZUFuZFR5cGUobXNnLm9wdGlvbmFsX2Zsb2F0LCAwLCAoZmxvYXQsIGludCkpCi0gICAgICBfQ2hlY2tWYWx1ZUFuZFR5cGUobXNnLm9wdGlvbmFsX2RvdWJsZSwgMCwgKGZsb2F0LCBpbnQpKQotICAgICAgX0NoZWNrVmFsdWVBbmRUeXBlKG1zZy5vcHRpb25hbF9ib29sLCBGYWxzZSwgYm9vbCkKLSAgICAgIF9DaGVja1ZhbHVlQW5kVHlwZShtc2cub3B0aW9uYWxfc3RyaW5nLCB1JycsIHVuaWNvZGVfdHlwZSkKLSAgICAgIF9DaGVja1ZhbHVlQW5kVHlwZShtc2cub3B0aW9uYWxfYnl0ZXMsIGInJywgYnl0ZXMpCi0gICAgICBfQ2hlY2tWYWx1ZUFuZFR5cGUobXNnLm9wdGlvbmFsX25lc3RlZF9lbnVtLCBtc2cuRk9PLCBpbnQpCi0gICAgIyBGaXJzdCBmb3IgdGhlIGdlbmVyYXRlZCBtZXNzYWdlCi0gICAgX0NoZWNrRGVmYXVsdFZhbHVlcyh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkpCi0gICAgIyBUaGVuIGZvciBhIG1lc3NhZ2UgYnVpbHQgd2l0aCBmcm9tIHRoZSBEZXNjcmlwdG9yUG9vbC4KLSAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKLSAgICBwb29sLkFkZChkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLkZyb21TdHJpbmcoCi0gICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikpCi0gICAgcG9vbC5BZGQoZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAotICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLkRFU0NSSVBUT1Iuc2VyaWFsaXplZF9wYikpCi0gICAgcG9vbC5BZGQoZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAotICAgICAgICB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUi5zZXJpYWxpemVkX3BiKSkKLSAgICBtZXNzYWdlX2NsYXNzID0gbWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KHBvb2wpLkdldFByb3RvdHlwZSgKLSAgICAgICAgcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZnVsbF9uYW1lKSkKLSAgICBfQ2hlY2tEZWZhdWx0VmFsdWVzKG1lc3NhZ2VfY2xhc3MoKSkKLQotCi1jbGFzcyBQcm90b0ZpbGUob2JqZWN0KToKLQotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgcGFja2FnZSwgbWVzc2FnZXMsIGRlcGVuZGVuY2llcz1Ob25lLAotICAgICAgICAgICAgICAgcHVibGljX2RlcGVuZGVuY2llcz1Ob25lKToKLSAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgc2VsZi5wYWNrYWdlID0gcGFja2FnZQotICAgIHNlbGYubWVzc2FnZXMgPSBtZXNzYWdlcwotICAgIHNlbGYuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzIG9yIFtdCi0gICAgc2VsZi5wdWJsaWNfZGVwZW5kZW5jaWVzID0gcHVibGljX2RlcGVuZGVuY2llcyBvciBbXQotCi0gIGRlZiBDaGVja0ZpbGUoc2VsZiwgdGVzdCwgcG9vbCk6Ci0gICAgZmlsZV9kZXNjID0gcG9vbC5GaW5kRmlsZUJ5TmFtZShzZWxmLm5hbWUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLm5hbWUsIGZpbGVfZGVzYy5uYW1lKQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoc2VsZi5wYWNrYWdlLCBmaWxlX2Rlc2MucGFja2FnZSkKLSAgICBkZXBlbmRlbmNpZXNfbmFtZXMgPSBbZi5uYW1lIGZvciBmIGluIGZpbGVfZGVzYy5kZXBlbmRlbmNpZXNdCi0gICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLmRlcGVuZGVuY2llcywgZGVwZW5kZW5jaWVzX25hbWVzKQotICAgIHB1YmxpY19kZXBlbmRlbmNpZXNfbmFtZXMgPSBbZi5uYW1lIGZvciBmIGluIGZpbGVfZGVzYy5wdWJsaWNfZGVwZW5kZW5jaWVzXQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoc2VsZi5wdWJsaWNfZGVwZW5kZW5jaWVzLCBwdWJsaWNfZGVwZW5kZW5jaWVzX25hbWVzKQotICAgIGZvciBuYW1lLCBtc2dfdHlwZSBpbiBzZWxmLm1lc3NhZ2VzLml0ZW1zKCk6Ci0gICAgICBtc2dfdHlwZS5DaGVja1R5cGUodGVzdCwgTm9uZSwgbmFtZSwgZmlsZV9kZXNjKQotCi0KLWNsYXNzIEVudW1UeXBlKG9iamVjdCk6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHZhbHVlcyk6Ci0gICAgc2VsZi52YWx1ZXMgPSB2YWx1ZXMKLQotICBkZWYgQ2hlY2tUeXBlKHNlbGYsIHRlc3QsIG1zZ19kZXNjLCBuYW1lLCBmaWxlX2Rlc2MpOgotICAgIGVudW1fZGVzYyA9IG1zZ19kZXNjLmVudW1fdHlwZXNfYnlfbmFtZVtuYW1lXQotICAgIHRlc3QuYXNzZXJ0RXF1YWwobmFtZSwgZW51bV9kZXNjLm5hbWUpCi0gICAgZXhwZWN0ZWRfZW51bV9mdWxsX25hbWUgPSAnLicuam9pbihbbXNnX2Rlc2MuZnVsbF9uYW1lLCBuYW1lXSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGV4cGVjdGVkX2VudW1fZnVsbF9uYW1lLCBlbnVtX2Rlc2MuZnVsbF9uYW1lKQotICAgIHRlc3QuYXNzZXJ0RXF1YWwobXNnX2Rlc2MsIGVudW1fZGVzYy5jb250YWluaW5nX3R5cGUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChmaWxlX2Rlc2MsIGVudW1fZGVzYy5maWxlKQotICAgIGZvciBpbmRleCwgKHZhbHVlLCBudW1iZXIpIGluIGVudW1lcmF0ZShzZWxmLnZhbHVlcyk6Ci0gICAgICB2YWx1ZV9kZXNjID0gZW51bV9kZXNjLnZhbHVlc19ieV9uYW1lW3ZhbHVlXQotICAgICAgdGVzdC5hc3NlcnRFcXVhbCh2YWx1ZSwgdmFsdWVfZGVzYy5uYW1lKQotICAgICAgdGVzdC5hc3NlcnRFcXVhbChpbmRleCwgdmFsdWVfZGVzYy5pbmRleCkKLSAgICAgIHRlc3QuYXNzZXJ0RXF1YWwobnVtYmVyLCB2YWx1ZV9kZXNjLm51bWJlcikKLSAgICAgIHRlc3QuYXNzZXJ0RXF1YWwoZW51bV9kZXNjLCB2YWx1ZV9kZXNjLnR5cGUpCi0gICAgICB0ZXN0LmFzc2VydEluKHZhbHVlLCBtc2dfZGVzYy5lbnVtX3ZhbHVlc19ieV9uYW1lKQotCi0KLWNsYXNzIE1lc3NhZ2VUeXBlKG9iamVjdCk6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHR5cGVfZGljdCwgZmllbGRfbGlzdCwgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgICAgICAgICAgICAgIGV4dGVuc2lvbnM9Tm9uZSk6Ci0gICAgc2VsZi50eXBlX2RpY3QgPSB0eXBlX2RpY3QKLSAgICBzZWxmLmZpZWxkX2xpc3QgPSBmaWVsZF9saXN0Ci0gICAgc2VsZi5pc19leHRlbmRhYmxlID0gaXNfZXh0ZW5kYWJsZQotICAgIHNlbGYuZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbnMgb3IgW10KLQotICBkZWYgQ2hlY2tUeXBlKHNlbGYsIHRlc3QsIGNvbnRhaW5pbmdfdHlwZV9kZXNjLCBuYW1lLCBmaWxlX2Rlc2MpOgotICAgIGlmIGNvbnRhaW5pbmdfdHlwZV9kZXNjIGlzIE5vbmU6Ci0gICAgICBkZXNjID0gZmlsZV9kZXNjLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVtuYW1lXQotICAgICAgZXhwZWN0ZWRfZnVsbF9uYW1lID0gJy4nLmpvaW4oW2ZpbGVfZGVzYy5wYWNrYWdlLCBuYW1lXSkKLSAgICBlbHNlOgotICAgICAgZGVzYyA9IGNvbnRhaW5pbmdfdHlwZV9kZXNjLm5lc3RlZF90eXBlc19ieV9uYW1lW25hbWVdCi0gICAgICBleHBlY3RlZF9mdWxsX25hbWUgPSAnLicuam9pbihbY29udGFpbmluZ190eXBlX2Rlc2MuZnVsbF9uYW1lLCBuYW1lXSkKLQotICAgIHRlc3QuYXNzZXJ0RXF1YWwobmFtZSwgZGVzYy5uYW1lKQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZnVsbF9uYW1lLCBkZXNjLmZ1bGxfbmFtZSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGNvbnRhaW5pbmdfdHlwZV9kZXNjLCBkZXNjLmNvbnRhaW5pbmdfdHlwZSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGRlc2MuZmlsZSwgZmlsZV9kZXNjKQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoc2VsZi5pc19leHRlbmRhYmxlLCBkZXNjLmlzX2V4dGVuZGFibGUpCi0gICAgZm9yIG5hbWUsIHN1YnR5cGUgaW4gc2VsZi50eXBlX2RpY3QuaXRlbXMoKToKLSAgICAgIHN1YnR5cGUuQ2hlY2tUeXBlKHRlc3QsIGRlc2MsIG5hbWUsIGZpbGVfZGVzYykKLQotICAgIGZvciBpbmRleCwgKG5hbWUsIGZpZWxkKSBpbiBlbnVtZXJhdGUoc2VsZi5maWVsZF9saXN0KToKLSAgICAgIGZpZWxkLkNoZWNrRmllbGQodGVzdCwgZGVzYywgbmFtZSwgaW5kZXgpCi0KLSAgICBmb3IgaW5kZXgsIChuYW1lLCBmaWVsZCkgaW4gZW51bWVyYXRlKHNlbGYuZXh0ZW5zaW9ucyk6Ci0gICAgICBmaWVsZC5DaGVja0ZpZWxkKHRlc3QsIGRlc2MsIG5hbWUsIGluZGV4KQotCi0KLWNsYXNzIEVudW1GaWVsZChvYmplY3QpOgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBudW1iZXIsIHR5cGVfbmFtZSwgZGVmYXVsdF92YWx1ZSk6Ci0gICAgc2VsZi5udW1iZXIgPSBudW1iZXIKLSAgICBzZWxmLnR5cGVfbmFtZSA9IHR5cGVfbmFtZQotICAgIHNlbGYuZGVmYXVsdF92YWx1ZSA9IGRlZmF1bHRfdmFsdWUKLQotICBkZWYgQ2hlY2tGaWVsZChzZWxmLCB0ZXN0LCBtc2dfZGVzYywgbmFtZSwgaW5kZXgpOgotICAgIGZpZWxkX2Rlc2MgPSBtc2dfZGVzYy5maWVsZHNfYnlfbmFtZVtuYW1lXQotICAgIGVudW1fZGVzYyA9IG1zZ19kZXNjLmVudW1fdHlwZXNfYnlfbmFtZVtzZWxmLnR5cGVfbmFtZV0KLSAgICB0ZXN0LmFzc2VydEVxdWFsKG5hbWUsIGZpZWxkX2Rlc2MubmFtZSkKLSAgICBleHBlY3RlZF9maWVsZF9mdWxsX25hbWUgPSAnLicuam9pbihbbXNnX2Rlc2MuZnVsbF9uYW1lLCBuYW1lXSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGV4cGVjdGVkX2ZpZWxkX2Z1bGxfbmFtZSwgZmllbGRfZGVzYy5mdWxsX25hbWUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChpbmRleCwgZmllbGRfZGVzYy5pbmRleCkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYubnVtYmVyLCBmaWVsZF9kZXNjLm51bWJlcikKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTSwgZmllbGRfZGVzYy50eXBlKQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNLAotICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzYy5jcHBfdHlwZSkKLSAgICB0ZXN0LmFzc2VydFRydWUoZmllbGRfZGVzYy5oYXNfZGVmYXVsdF92YWx1ZSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGVudW1fZGVzYy52YWx1ZXNfYnlfbmFtZVtzZWxmLmRlZmF1bHRfdmFsdWVdLm51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKG1zZ19kZXNjLCBmaWVsZF9kZXNjLmNvbnRhaW5pbmdfdHlwZSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGVudW1fZGVzYywgZmllbGRfZGVzYy5lbnVtX3R5cGUpCi0KLQotY2xhc3MgTWVzc2FnZUZpZWxkKG9iamVjdCk6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG51bWJlciwgdHlwZV9uYW1lKToKLSAgICBzZWxmLm51bWJlciA9IG51bWJlcgotICAgIHNlbGYudHlwZV9uYW1lID0gdHlwZV9uYW1lCi0KLSAgZGVmIENoZWNrRmllbGQoc2VsZiwgdGVzdCwgbXNnX2Rlc2MsIG5hbWUsIGluZGV4KToKLSAgICBmaWVsZF9kZXNjID0gbXNnX2Rlc2MuZmllbGRzX2J5X25hbWVbbmFtZV0KLSAgICBmaWVsZF90eXBlX2Rlc2MgPSBtc2dfZGVzYy5uZXN0ZWRfdHlwZXNfYnlfbmFtZVtzZWxmLnR5cGVfbmFtZV0KLSAgICB0ZXN0LmFzc2VydEVxdWFsKG5hbWUsIGZpZWxkX2Rlc2MubmFtZSkKLSAgICBleHBlY3RlZF9maWVsZF9mdWxsX25hbWUgPSAnLicuam9pbihbbXNnX2Rlc2MuZnVsbF9uYW1lLCBuYW1lXSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGV4cGVjdGVkX2ZpZWxkX2Z1bGxfbmFtZSwgZmllbGRfZGVzYy5mdWxsX25hbWUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChpbmRleCwgZmllbGRfZGVzYy5pbmRleCkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYubnVtYmVyLCBmaWVsZF9kZXNjLm51bWJlcikKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSwgZmllbGRfZGVzYy50eXBlKQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzYy5jcHBfdHlwZSkKLSAgICB0ZXN0LmFzc2VydEZhbHNlKGZpZWxkX2Rlc2MuaGFzX2RlZmF1bHRfdmFsdWUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChtc2dfZGVzYywgZmllbGRfZGVzYy5jb250YWluaW5nX3R5cGUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChmaWVsZF90eXBlX2Rlc2MsIGZpZWxkX2Rlc2MubWVzc2FnZV90eXBlKQotCi0KLWNsYXNzIFN0cmluZ0ZpZWxkKG9iamVjdCk6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG51bWJlciwgZGVmYXVsdF92YWx1ZSk6Ci0gICAgc2VsZi5udW1iZXIgPSBudW1iZXIKLSAgICBzZWxmLmRlZmF1bHRfdmFsdWUgPSBkZWZhdWx0X3ZhbHVlCi0KLSAgZGVmIENoZWNrRmllbGQoc2VsZiwgdGVzdCwgbXNnX2Rlc2MsIG5hbWUsIGluZGV4KToKLSAgICBmaWVsZF9kZXNjID0gbXNnX2Rlc2MuZmllbGRzX2J5X25hbWVbbmFtZV0KLSAgICB0ZXN0LmFzc2VydEVxdWFsKG5hbWUsIGZpZWxkX2Rlc2MubmFtZSkKLSAgICBleHBlY3RlZF9maWVsZF9mdWxsX25hbWUgPSAnLicuam9pbihbbXNnX2Rlc2MuZnVsbF9uYW1lLCBuYW1lXSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGV4cGVjdGVkX2ZpZWxkX2Z1bGxfbmFtZSwgZmllbGRfZGVzYy5mdWxsX25hbWUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChpbmRleCwgZmllbGRfZGVzYy5pbmRleCkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYubnVtYmVyLCBmaWVsZF9kZXNjLm51bWJlcikKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HLCBmaWVsZF9kZXNjLnR5cGUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORywKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2MuY3BwX3R5cGUpCi0gICAgdGVzdC5hc3NlcnRUcnVlKGZpZWxkX2Rlc2MuaGFzX2RlZmF1bHRfdmFsdWUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLmRlZmF1bHRfdmFsdWUsIGZpZWxkX2Rlc2MuZGVmYXVsdF92YWx1ZSkKLQotCi1jbGFzcyBFeHRlbnNpb25GaWVsZChvYmplY3QpOgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBudW1iZXIsIGV4dGVuZGVkX3R5cGUpOgotICAgIHNlbGYubnVtYmVyID0gbnVtYmVyCi0gICAgc2VsZi5leHRlbmRlZF90eXBlID0gZXh0ZW5kZWRfdHlwZQotCi0gIGRlZiBDaGVja0ZpZWxkKHNlbGYsIHRlc3QsIG1zZ19kZXNjLCBuYW1lLCBpbmRleCk6Ci0gICAgZmllbGRfZGVzYyA9IG1zZ19kZXNjLmV4dGVuc2lvbnNfYnlfbmFtZVtuYW1lXQotICAgIHRlc3QuYXNzZXJ0RXF1YWwobmFtZSwgZmllbGRfZGVzYy5uYW1lKQotICAgIGV4cGVjdGVkX2ZpZWxkX2Z1bGxfbmFtZSA9ICcuJy5qb2luKFttc2dfZGVzYy5mdWxsX25hbWUsIG5hbWVdKQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZmllbGRfZnVsbF9uYW1lLCBmaWVsZF9kZXNjLmZ1bGxfbmFtZSkKLSAgICB0ZXN0LmFzc2VydEVxdWFsKHNlbGYubnVtYmVyLCBmaWVsZF9kZXNjLm51bWJlcikKLSAgICB0ZXN0LmFzc2VydEVxdWFsKGluZGV4LCBmaWVsZF9kZXNjLmluZGV4KQotICAgIHRlc3QuYXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFLCBmaWVsZF9kZXNjLnR5cGUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgICBmaWVsZF9kZXNjLmNwcF90eXBlKQotICAgIHRlc3QuYXNzZXJ0RmFsc2UoZmllbGRfZGVzYy5oYXNfZGVmYXVsdF92YWx1ZSkKLSAgICB0ZXN0LmFzc2VydFRydWUoZmllbGRfZGVzYy5pc19leHRlbnNpb24pCi0gICAgdGVzdC5hc3NlcnRFcXVhbChtc2dfZGVzYywgZmllbGRfZGVzYy5leHRlbnNpb25fc2NvcGUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChtc2dfZGVzYywgZmllbGRfZGVzYy5tZXNzYWdlX3R5cGUpCi0gICAgdGVzdC5hc3NlcnRFcXVhbChzZWxmLmV4dGVuZGVkX3R5cGUsIGZpZWxkX2Rlc2MuY29udGFpbmluZ190eXBlLm5hbWUpCi0KLQotY2xhc3MgQWRkRGVzY3JpcHRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBfVGVzdE1lc3NhZ2Uoc2VsZiwgcHJlZml4KToKLSAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKLSAgICBwb29sLkFkZERlc2NyaXB0b3IodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnLAotICAgICAgICBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKLSAgICAgICAgICAgIHByZWZpeCArICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKS5mdWxsX25hbWUpCi0KLSAgICAjIEFkZERlc2NyaXB0b3IgaXMgbm90IHJlY3Vyc2l2ZS4KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yKToKLSAgICAgIHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKAotICAgICAgICAgIHByZWZpeCArICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZScpCi0KLSAgICBwb29sLkFkZERlc2NyaXB0b3IodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJywKLSAgICAgICAgcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCi0gICAgICAgICAgICBwcmVmaXggKyAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnKS5mdWxsX25hbWUpCi0KLSAgICAjIEZpbGVzIGFyZSBpbXBsaWNpdGx5IGFsc28gaW5kZXhlZCB3aGVuIG1lc3NhZ2VzIGFyZSBhZGRlZC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJywKLSAgICAgICAgcG9vbC5GaW5kRmlsZUJ5TmFtZSgKLSAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKS5uYW1lKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycsCi0gICAgICAgIHBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAotICAgICAgICAgICAgcHJlZml4ICsgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJykubmFtZSkKLQotICBAdW5pdHRlc3Quc2tpcElmKGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ2NwcCcsCi0gICAgICAgICAgICAgICAgICAgJ1dpdGggdGhlIGNwcCBpbXBsZW1lbnRhdGlvbiwgQWRkKCkgbXVzdCBiZSBjYWxsZWQgZmlyc3QnKQotICBkZWYgdGVzdE1lc3NhZ2Uoc2VsZik6Ci0gICAgc2VsZi5fVGVzdE1lc3NhZ2UoJycpCi0gICAgc2VsZi5fVGVzdE1lc3NhZ2UoJy4nKQotCi0gIGRlZiBfVGVzdEVudW0oc2VsZiwgcHJlZml4KToKLSAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKCkKLSAgICBwb29sLkFkZEVudW1EZXNjcmlwdG9yKHVuaXR0ZXN0X3BiMi5Gb3JlaWduRW51bS5ERVNDUklQVE9SKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bScsCi0gICAgICAgIHBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAotICAgICAgICAgICAgcHJlZml4ICsgJ3Byb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtJykuZnVsbF9uYW1lKQotCi0gICAgIyBBZGRFbnVtRGVzY3JpcHRvciBpcyBub3QgcmVjdXJzaXZlLgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgcG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoCi0gICAgICAgICAgcHJlZml4ICsgJ3Byb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtLk5lc3RlZEVudW0nKQotCi0gICAgcG9vbC5BZGRFbnVtRGVzY3JpcHRvcih1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uREVTQ1JJUFRPUikKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0nLAotICAgICAgICBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKLSAgICAgICAgICAgIHByZWZpeCArICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScpLmZ1bGxfbmFtZSkKLQotICAgICMgRmlsZXMgYXJlIGltcGxpY2l0bHkgYWxzbyBpbmRleGVkIHdoZW4gZW51bXMgYXJlIGFkZGVkLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLAotICAgICAgICBwb29sLkZpbmRGaWxlQnlOYW1lKAotICAgICAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycpLm5hbWUpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJywKLSAgICAgICAgcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCi0gICAgICAgICAgICBwcmVmaXggKyAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0nKS5uYW1lKQotCi0gIEB1bml0dGVzdC5za2lwSWYoYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJywKLSAgICAgICAgICAgICAgICAgICAnV2l0aCB0aGUgY3BwIGltcGxlbWVudGF0aW9uLCBBZGQoKSBtdXN0IGJlIGNhbGxlZCBmaXJzdCcpCi0gIGRlZiB0ZXN0RW51bShzZWxmKToKLSAgICBzZWxmLl9UZXN0RW51bSgnJykKLSAgICBzZWxmLl9UZXN0RW51bSgnLicpCi0KLSAgQHVuaXR0ZXN0LnNraXBJZihhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnLAotICAgICAgICAgICAgICAgICAgICdXaXRoIHRoZSBjcHAgaW1wbGVtZW50YXRpb24sIEFkZCgpIG11c3QgYmUgY2FsbGVkIGZpcnN0JykKLSAgZGVmIHRlc3RGaWxlKHNlbGYpOgotICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQotICAgIHBvb2wuQWRkRmlsZURlc2NyaXB0b3IodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycsCi0gICAgICAgIHBvb2wuRmluZEZpbGVCeU5hbWUoCi0gICAgICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJykubmFtZSkKLQotICAgICMgQWRkRmlsZURlc2NyaXB0b3IgaXMgbm90IHJlY3Vyc2l2ZTsgbWVzc2FnZXMgYW5kIGVudW1zIHdpdGhpbiBmaWxlcyBtdXN0Ci0gICAgIyBiZSBleHBsaWNpdGx5IHJlZ2lzdGVyZWQuCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvcik6Ci0gICAgICBwb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJykKLQotICBkZWYgdGVzdEVtcHR5RGVzY3JpcHRvclBvb2woc2VsZik6Ci0gICAgIyBDaGVjayB0aGF0IGFuIGVtcHR5IERlc2NyaXB0b3JQb29sKCkgY29udGFpbnMgbm8gbWVzc2FnZXMuCi0gICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCi0gICAgcHJvdG9fZmlsZV9uYW1lID0gZGVzY3JpcHRvcl9wYjIuREVTQ1JJUFRPUi5uYW1lCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIHBvb2wuRmluZEZpbGVCeU5hbWUsIHByb3RvX2ZpbGVfbmFtZSkKLSAgICAjIEFkZCB0aGUgYWJvdmUgZmlsZSB0byB0aGUgcG9vbAotICAgIGZpbGVfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQotICAgIGRlc2NyaXB0b3JfcGIyLkRFU0NSSVBUT1IuQ29weVRvUHJvdG8oZmlsZV9kZXNjcmlwdG9yKQotICAgIHBvb2wuQWRkKGZpbGVfZGVzY3JpcHRvcikKLSAgICAjIE5vdyBpdCBleGlzdHMuCi0gICAgc2VsZi5hc3NlcnRUcnVlKHBvb2wuRmluZEZpbGVCeU5hbWUocHJvdG9fZmlsZV9uYW1lKSkKLQotICBkZWYgdGVzdEN1c3RvbURlc2NyaXB0b3JQb29sKHNlbGYpOgotICAgICMgQ3JlYXRlIGEgbmV3IHBvb2wsIGFuZCBhZGQgYSBmaWxlIGRlc2NyaXB0b3IuCi0gICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCi0gICAgZmlsZV9kZXNjID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygKLSAgICAgICAgbmFtZT0nc29tZS9maWxlLnByb3RvJywgcGFja2FnZT0ncGFja2FnZScpCi0gICAgZmlsZV9kZXNjLm1lc3NhZ2VfdHlwZS5hZGQobmFtZT0nTWVzc2FnZScpCi0gICAgcG9vbC5BZGQoZmlsZV9kZXNjKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9vbC5GaW5kRmlsZUJ5TmFtZSgnc29tZS9maWxlLnByb3RvJykubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICdzb21lL2ZpbGUucHJvdG8nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoJ3BhY2thZ2UuTWVzc2FnZScpLm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAnTWVzc2FnZScpCi0KLQotQHVuaXR0ZXN0LnNraXBJZigKLSAgICBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdjcHAnLAotICAgICdkZWZhdWx0X3Bvb2wgaXMgb25seSBzdXBwb3J0ZWQgYnkgdGhlIEMrKyBpbXBsZW1lbnRhdGlvbicpCi1jbGFzcyBEZWZhdWx0UG9vbFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0RmluZE1ldGhvZHMoc2VsZik6Ci0gICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAotICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmLnB5ZXh0IGltcG9ydCBfbWVzc2FnZQotICAgIHBvb2wgPSBfbWVzc2FnZS5kZWZhdWx0X3Bvb2wKLSAgICBzZWxmLmFzc2VydElzKAotICAgICAgICBwb29sLkZpbmRGaWxlQnlOYW1lKCdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKSwKLSAgICAgICAgdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRJcygKLSAgICAgICAgcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcycpLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRJcygKLSAgICAgICAgcG9vbC5GaW5kRmllbGRCeU5hbWUoJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5vcHRpb25hbF9pbnQzMicpLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJ10pCi0gICAgc2VsZi5hc3NlcnRJcygKLSAgICAgICAgcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKCdwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24nKSwKLSAgICAgICAgdW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IuZXh0ZW5zaW9uc19ieV9uYW1lWydvcHRpb25hbF9pbnQzMl9leHRlbnNpb24nXSkKLSAgICBzZWxmLmFzc2VydElzKAotICAgICAgICBwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgncHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0nKSwKLSAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25FbnVtLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRJcygKLSAgICAgICAgcG9vbC5GaW5kT25lb2ZCeU5hbWUoJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5vbmVvZl9maWVsZCcpLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1Iub25lb2ZzX2J5X25hbWVbJ29uZW9mX2ZpZWxkJ10pCi0KLSAgZGVmIHRlc3RBZGRGaWxlRGVzY3JpcHRvcihzZWxmKToKLSAgICAjIHB5bGludDogZGlzYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wCi0gICAgZnJvbSBnb29nbGUucHJvdG9idWYucHlleHQgaW1wb3J0IF9tZXNzYWdlCi0gICAgcG9vbCA9IF9tZXNzYWdlLmRlZmF1bHRfcG9vbAotICAgIGZpbGVfZGVzYyA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8obmFtZT0nc29tZS9maWxlLnByb3RvJykKLSAgICBwb29sLkFkZChmaWxlX2Rlc2MpCi0gICAgcG9vbC5BZGRTZXJpYWxpemVkRmlsZShmaWxlX2Rlc2MuU2VyaWFsaXplVG9TdHJpbmcoKSkKLQotCi1URVNUMV9GSUxFID0gUHJvdG9GaWxlKAotICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QxLnByb3RvJywKLSAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcsCi0gICAgewotICAgICAgICAnRGVzY3JpcHRvclBvb2xUZXN0MSc6IE1lc3NhZ2VUeXBlKHsKLSAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnQUxQSEEnLCAxKSwgKCdCRVRBJywgMildKSwKLSAgICAgICAgICAgICdOZXN0ZWRNZXNzYWdlJzogTWVzc2FnZVR5cGUoewotICAgICAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnRVBTSUxPTicsIDUpLCAoJ1pFVEEnLCA2KV0pLAotICAgICAgICAgICAgICAgICdEZWVwTmVzdGVkTWVzc2FnZSc6IE1lc3NhZ2VUeXBlKHsKLSAgICAgICAgICAgICAgICAgICAgJ05lc3RlZEVudW0nOiBFbnVtVHlwZShbKCdFVEEnLCA3KSwgKCdUSEVUQScsIDgpXSksCi0gICAgICAgICAgICAgICAgfSwgWwotICAgICAgICAgICAgICAgICAgICAoJ25lc3RlZF9lbnVtJywgRW51bUZpZWxkKDEsICdOZXN0ZWRFbnVtJywgJ0VUQScpKSwKLSAgICAgICAgICAgICAgICAgICAgKCduZXN0ZWRfZmllbGQnLCBTdHJpbmdGaWVsZCgyLCAndGhldGEnKSksCi0gICAgICAgICAgICAgICAgXSksCi0gICAgICAgICAgICB9LCBbCi0gICAgICAgICAgICAgICAgKCduZXN0ZWRfZW51bScsIEVudW1GaWVsZCgxLCAnTmVzdGVkRW51bScsICdaRVRBJykpLAotICAgICAgICAgICAgICAgICgnbmVzdGVkX2ZpZWxkJywgU3RyaW5nRmllbGQoMiwgJ2JldGEnKSksCi0gICAgICAgICAgICAgICAgKCdkZWVwX25lc3RlZF9tZXNzYWdlJywgTWVzc2FnZUZpZWxkKDMsICdEZWVwTmVzdGVkTWVzc2FnZScpKSwKLSAgICAgICAgICAgIF0pCi0gICAgICAgIH0sIFsKLSAgICAgICAgICAgICgnbmVzdGVkX2VudW0nLCBFbnVtRmllbGQoMSwgJ05lc3RlZEVudW0nLCAnQkVUQScpKSwKLSAgICAgICAgICAgICgnbmVzdGVkX21lc3NhZ2UnLCBNZXNzYWdlRmllbGQoMiwgJ05lc3RlZE1lc3NhZ2UnKSksCi0gICAgICAgIF0sIGlzX2V4dGVuZGFibGU9VHJ1ZSksCi0KLSAgICAgICAgJ0Rlc2NyaXB0b3JQb29sVGVzdDInOiBNZXNzYWdlVHlwZSh7Ci0gICAgICAgICAgICAnTmVzdGVkRW51bSc6IEVudW1UeXBlKFsoJ0dBTU1BJywgMyksICgnREVMVEEnLCA0KV0pLAotICAgICAgICAgICAgJ05lc3RlZE1lc3NhZ2UnOiBNZXNzYWdlVHlwZSh7Ci0gICAgICAgICAgICAgICAgJ05lc3RlZEVudW0nOiBFbnVtVHlwZShbKCdJT1RBJywgOSksICgnS0FQUEEnLCAxMCldKSwKLSAgICAgICAgICAgICAgICAnRGVlcE5lc3RlZE1lc3NhZ2UnOiBNZXNzYWdlVHlwZSh7Ci0gICAgICAgICAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnTEFNQkRBJywgMTEpLCAoJ01VJywgMTIpXSksCi0gICAgICAgICAgICAgICAgfSwgWwotICAgICAgICAgICAgICAgICAgICAoJ25lc3RlZF9lbnVtJywgRW51bUZpZWxkKDEsICdOZXN0ZWRFbnVtJywgJ01VJykpLAotICAgICAgICAgICAgICAgICAgICAoJ25lc3RlZF9maWVsZCcsIFN0cmluZ0ZpZWxkKDIsICdsYW1iZGEnKSksCi0gICAgICAgICAgICAgICAgXSksCi0gICAgICAgICAgICB9LCBbCi0gICAgICAgICAgICAgICAgKCduZXN0ZWRfZW51bScsIEVudW1GaWVsZCgxLCAnTmVzdGVkRW51bScsICdJT1RBJykpLAotICAgICAgICAgICAgICAgICgnbmVzdGVkX2ZpZWxkJywgU3RyaW5nRmllbGQoMiwgJ2RlbHRhJykpLAotICAgICAgICAgICAgICAgICgnZGVlcF9uZXN0ZWRfbWVzc2FnZScsIE1lc3NhZ2VGaWVsZCgzLCAnRGVlcE5lc3RlZE1lc3NhZ2UnKSksCi0gICAgICAgICAgICBdKQotICAgICAgICB9LCBbCi0gICAgICAgICAgICAoJ25lc3RlZF9lbnVtJywgRW51bUZpZWxkKDEsICdOZXN0ZWRFbnVtJywgJ0dBTU1BJykpLAotICAgICAgICAgICAgKCduZXN0ZWRfbWVzc2FnZScsIE1lc3NhZ2VGaWVsZCgyLCAnTmVzdGVkTWVzc2FnZScpKSwKLSAgICAgICAgXSksCi0gICAgfSkKLQotCi1URVNUMl9GSUxFID0gUHJvdG9GaWxlKAotICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QyLnByb3RvJywKLSAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcsCi0gICAgewotICAgICAgICAnRGVzY3JpcHRvclBvb2xUZXN0Myc6IE1lc3NhZ2VUeXBlKHsKLSAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnTlUnLCAxMyksICgnWEknLCAxNCldKSwKLSAgICAgICAgICAgICdOZXN0ZWRNZXNzYWdlJzogTWVzc2FnZVR5cGUoewotICAgICAgICAgICAgICAgICdOZXN0ZWRFbnVtJzogRW51bVR5cGUoWygnT01JQ1JPTicsIDE1KSwgKCdQSScsIDE2KV0pLAotICAgICAgICAgICAgICAgICdEZWVwTmVzdGVkTWVzc2FnZSc6IE1lc3NhZ2VUeXBlKHsKLSAgICAgICAgICAgICAgICAgICAgJ05lc3RlZEVudW0nOiBFbnVtVHlwZShbKCdSSE8nLCAxNyksICgnU0lHTUEnLCAxOCldKSwKLSAgICAgICAgICAgICAgICB9LCBbCi0gICAgICAgICAgICAgICAgICAgICgnbmVzdGVkX2VudW0nLCBFbnVtRmllbGQoMSwgJ05lc3RlZEVudW0nLCAnUkhPJykpLAotICAgICAgICAgICAgICAgICAgICAoJ25lc3RlZF9maWVsZCcsIFN0cmluZ0ZpZWxkKDIsICdzaWdtYScpKSwKLSAgICAgICAgICAgICAgICBdKSwKLSAgICAgICAgICAgIH0sIFsKLSAgICAgICAgICAgICAgICAoJ25lc3RlZF9lbnVtJywgRW51bUZpZWxkKDEsICdOZXN0ZWRFbnVtJywgJ1BJJykpLAotICAgICAgICAgICAgICAgICgnbmVzdGVkX2ZpZWxkJywgU3RyaW5nRmllbGQoMiwgJ251JykpLAotICAgICAgICAgICAgICAgICgnZGVlcF9uZXN0ZWRfbWVzc2FnZScsIE1lc3NhZ2VGaWVsZCgzLCAnRGVlcE5lc3RlZE1lc3NhZ2UnKSksCi0gICAgICAgICAgICBdKQotICAgICAgICB9LCBbCi0gICAgICAgICAgICAoJ25lc3RlZF9lbnVtJywgRW51bUZpZWxkKDEsICdOZXN0ZWRFbnVtJywgJ1hJJykpLAotICAgICAgICAgICAgKCduZXN0ZWRfbWVzc2FnZScsIE1lc3NhZ2VGaWVsZCgyLCAnTmVzdGVkTWVzc2FnZScpKSwKLSAgICAgICAgXSwgZXh0ZW5zaW9ucz1bCi0gICAgICAgICAgICAoJ2Rlc2NyaXB0b3JfcG9vbF90ZXN0JywKLSAgICAgICAgICAgICBFeHRlbnNpb25GaWVsZCgxMDAxLCAnRGVzY3JpcHRvclBvb2xUZXN0MScpKSwKLSAgICAgICAgXSksCi0gICAgfSwKLSAgICBkZXBlbmRlbmNpZXM9Wydnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QxLnByb3RvJywKLSAgICAgICAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90byddLAotICAgIHB1YmxpY19kZXBlbmRlbmNpZXM9Wydnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90byddKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdDEucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0MS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDA4MTZiNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0MS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDk2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOwotCi0KLW1lc3NhZ2UgRGVzY3JpcHRvclBvb2xUZXN0MSB7Ci0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci0KLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBBTFBIQSA9IDE7Ci0gICAgQkVUQSA9IDI7Ci0gIH0KLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IEJFVEFdOwotCi0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICAgIEVQU0lMT04gPSA1OwotICAgICAgWkVUQSA9IDY7Ci0gICAgfQotICAgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAxIFtkZWZhdWx0ID0gWkVUQV07Ci0gICAgb3B0aW9uYWwgc3RyaW5nIG5lc3RlZF9maWVsZCA9IDIgW2RlZmF1bHQgPSAiYmV0YSJdOwotICAgIG9wdGlvbmFsIERlZXBOZXN0ZWRNZXNzYWdlIGRlZXBfbmVzdGVkX21lc3NhZ2UgPSAzOwotCi0gICAgbWVzc2FnZSBEZWVwTmVzdGVkTWVzc2FnZSB7Ci0gICAgICBlbnVtIE5lc3RlZEVudW0gewotICAgICAgICBFVEEgPSA3OwotICAgICAgICBUSEVUQSA9IDg7Ci0gICAgICB9Ci0gICAgICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IEVUQV07Ci0gICAgICBvcHRpb25hbCBzdHJpbmcgbmVzdGVkX2ZpZWxkID0gMiBbZGVmYXVsdCA9ICJ0aGV0YSJdOwotICAgIH0KLSAgfQotCi0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkX21lc3NhZ2UgPSAyOwotfQotCi1tZXNzYWdlIERlc2NyaXB0b3JQb29sVGVzdDIgewotICBlbnVtIE5lc3RlZEVudW0gewotICAgIEdBTU1BID0gMzsKLSAgICBERUxUQSA9IDQ7Ci0gIH0KLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IEdBTU1BXTsKLQotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgICBJT1RBID0gOTsKLSAgICAgIEtBUFBBID0gMTA7Ci0gICAgfQotICAgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAxIFtkZWZhdWx0ID0gSU9UQV07Ci0gICAgb3B0aW9uYWwgc3RyaW5nIG5lc3RlZF9maWVsZCA9IDIgW2RlZmF1bHQgPSAiZGVsdGEiXTsKLSAgICBvcHRpb25hbCBEZWVwTmVzdGVkTWVzc2FnZSBkZWVwX25lc3RlZF9tZXNzYWdlID0gMzsKLQotICAgIG1lc3NhZ2UgRGVlcE5lc3RlZE1lc3NhZ2UgewotICAgICAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICAgICAgTEFNQkRBID0gMTE7Ci0gICAgICAgIE1VID0gMTI7Ci0gICAgICB9Ci0gICAgICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IE1VXTsKLSAgICAgIG9wdGlvbmFsIHN0cmluZyBuZXN0ZWRfZmllbGQgPSAyIFtkZWZhdWx0ID0gImxhbWJkYSJdOwotICAgIH0KLSAgfQotCi0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgbmVzdGVkX21lc3NhZ2UgPSAyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdDIucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0Mi5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTIxOGVjYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2Rlc2NyaXB0b3JfcG9vbF90ZXN0Mi5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Bvb2xfdGVzdDEucHJvdG8iOwotaW1wb3J0IHB1YmxpYyAiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfbWVzc2FnZXMucHJvdG8iOwotCi0KLW1lc3NhZ2UgRGVzY3JpcHRvclBvb2xUZXN0MyB7Ci0KLSAgZXh0ZW5kIERlc2NyaXB0b3JQb29sVGVzdDEgewotICAgIG9wdGlvbmFsIERlc2NyaXB0b3JQb29sVGVzdDMgZGVzY3JpcHRvcl9wb29sX3Rlc3QgPSAxMDAxOwotICB9Ci0KLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBOVSA9IDEzOwotICAgIFhJID0gMTQ7Ci0gIH0KLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IFhJXTsKLQotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgICBPTUlDUk9OID0gMTU7Ci0gICAgICBQSSA9IDE2OwotICAgIH0KLSAgICBvcHRpb25hbCBOZXN0ZWRFbnVtIG5lc3RlZF9lbnVtID0gMSBbZGVmYXVsdCA9IFBJXTsKLSAgICBvcHRpb25hbCBzdHJpbmcgbmVzdGVkX2ZpZWxkID0gMiBbZGVmYXVsdCA9ICJudSJdOwotICAgIG9wdGlvbmFsIERlZXBOZXN0ZWRNZXNzYWdlIGRlZXBfbmVzdGVkX21lc3NhZ2UgPSAzOwotCi0gICAgbWVzc2FnZSBEZWVwTmVzdGVkTWVzc2FnZSB7Ci0gICAgICBlbnVtIE5lc3RlZEVudW0gewotICAgICAgICBSSE8gPSAxNzsKLSAgICAgICAgU0lHTUEgPSAxODsKLSAgICAgIH0KLSAgICAgIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAxIFtkZWZhdWx0ID0gUkhPXTsKLSAgICAgIG9wdGlvbmFsIHN0cmluZyBuZXN0ZWRfZmllbGQgPSAyIFtkZWZhdWx0ID0gInNpZ21hIl07Ci0gICAgfQotICB9Ci0KLSAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBuZXN0ZWRfbWVzc2FnZSA9IDI7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGI4ZTc1NTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MjIgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJVbml0dGVzdCBmb3IgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmRlc2NyaXB0b3IuIiIiCi0KLV9fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCi0KLWltcG9ydCBzeXMKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAotCi0KLVRFU1RfRU1QVFlfTUVTU0FHRV9ERVNDUklQVE9SX0FTQ0lJID0gIiIiCi1uYW1lOiAnVGVzdEVtcHR5TWVzc2FnZScKLSIiIgotCi0KLWNsYXNzIERlc2NyaXB0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgZmlsZV9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oCi0gICAgICAgIG5hbWU9J3NvbWUvZmlsZW5hbWUvc29tZS5wcm90bycsCi0gICAgICAgIHBhY2thZ2U9J3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBtZXNzYWdlX3Byb3RvID0gZmlsZV9wcm90by5tZXNzYWdlX3R5cGUuYWRkKAotICAgICAgICBuYW1lPSdOZXN0ZWRNZXNzYWdlJykKLSAgICBtZXNzYWdlX3Byb3RvLmZpZWxkLmFkZCgKLSAgICAgICAgbmFtZT0nYmInLAotICAgICAgICBudW1iZXI9MSwKLSAgICAgICAgdHlwZT1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5UWVBFX0lOVDMyLAotICAgICAgICBsYWJlbD1kZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTCkKLSAgICBlbnVtX3Byb3RvID0gbWVzc2FnZV9wcm90by5lbnVtX3R5cGUuYWRkKAotICAgICAgICBuYW1lPSdGb3JlaWduRW51bScpCi0gICAgZW51bV9wcm90by52YWx1ZS5hZGQobmFtZT0nRk9SRUlHTl9GT08nLCBudW1iZXI9NCkKLSAgICBlbnVtX3Byb3RvLnZhbHVlLmFkZChuYW1lPSdGT1JFSUdOX0JBUicsIG51bWJlcj01KQotICAgIGVudW1fcHJvdG8udmFsdWUuYWRkKG5hbWU9J0ZPUkVJR05fQkFaJywgbnVtYmVyPTYpCi0KLSAgICBzZWxmLnBvb2wgPSBzZWxmLkdldERlc2NyaXB0b3JQb29sKCkKLSAgICBzZWxmLnBvb2wuQWRkKGZpbGVfcHJvdG8pCi0gICAgc2VsZi5teV9maWxlID0gc2VsZi5wb29sLkZpbmRGaWxlQnlOYW1lKGZpbGVfcHJvdG8ubmFtZSkKLSAgICBzZWxmLm15X21lc3NhZ2UgPSBzZWxmLm15X2ZpbGUubWVzc2FnZV90eXBlc19ieV9uYW1lW21lc3NhZ2VfcHJvdG8ubmFtZV0KLSAgICBzZWxmLm15X2VudW0gPSBzZWxmLm15X21lc3NhZ2UuZW51bV90eXBlc19ieV9uYW1lW2VudW1fcHJvdG8ubmFtZV0KLQotICAgIHNlbGYubXlfbWV0aG9kID0gZGVzY3JpcHRvci5NZXRob2REZXNjcmlwdG9yKAotICAgICAgICBuYW1lPSdCYXInLAotICAgICAgICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RTZXJ2aWNlLkJhcicsCi0gICAgICAgIGluZGV4PTAsCi0gICAgICAgIGNvbnRhaW5pbmdfc2VydmljZT1Ob25lLAotICAgICAgICBpbnB1dF90eXBlPU5vbmUsCi0gICAgICAgIG91dHB1dF90eXBlPU5vbmUpCi0gICAgc2VsZi5teV9zZXJ2aWNlID0gZGVzY3JpcHRvci5TZXJ2aWNlRGVzY3JpcHRvcigKLSAgICAgICAgbmFtZT0nVGVzdFNlcnZpY2VXaXRoT3B0aW9ucycsCi0gICAgICAgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2VXaXRoT3B0aW9ucycsCi0gICAgICAgIGZpbGU9c2VsZi5teV9maWxlLAotICAgICAgICBpbmRleD0wLAotICAgICAgICBtZXRob2RzPVsKLSAgICAgICAgICAgIHNlbGYubXlfbWV0aG9kCi0gICAgICAgIF0pCi0KLSAgZGVmIEdldERlc2NyaXB0b3JQb29sKHNlbGYpOgotICAgIHJldHVybiBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpLnBvb2wKLQotICBkZWYgdGVzdEVudW1WYWx1ZU5hbWUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UuRW51bVZhbHVlTmFtZSgnRm9yZWlnbkVudW0nLCA0KSwKLSAgICAgICAgICAgICAgICAgICAgICdGT1JFSUdOX0ZPTycpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBzZWxmLm15X21lc3NhZ2UuZW51bV90eXBlc19ieV9uYW1lWwotICAgICAgICAgICAgJ0ZvcmVpZ25FbnVtJ10udmFsdWVzX2J5X251bWJlcls0XS5uYW1lLAotICAgICAgICBzZWxmLm15X21lc3NhZ2UuRW51bVZhbHVlTmFtZSgnRm9yZWlnbkVudW0nLCA0KSkKLQotICBkZWYgdGVzdEVudW1GaXh1cHMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2VudW0sIHNlbGYubXlfZW51bS52YWx1ZXNbMF0udHlwZSkKLQotICBkZWYgdGVzdENvbnRhaW5pbmdUeXBlRml4dXBzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLCBzZWxmLm15X21lc3NhZ2UuZmllbGRzWzBdLmNvbnRhaW5pbmdfdHlwZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZSwgc2VsZi5teV9lbnVtLmNvbnRhaW5pbmdfdHlwZSkKLQotICBkZWYgdGVzdENvbnRhaW5pbmdTZXJ2aWNlRml4dXBzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9zZXJ2aWNlLCBzZWxmLm15X21ldGhvZC5jb250YWluaW5nX3NlcnZpY2UpCi0KLSAgZGVmIHRlc3RHZXRPcHRpb25zKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9lbnVtLkdldE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLkVudW1PcHRpb25zKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2VudW0udmFsdWVzWzBdLkdldE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLkVudW1WYWx1ZU9wdGlvbnMoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZS5HZXRPcHRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5NZXNzYWdlT3B0aW9ucygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLmZpZWxkc1swXS5HZXRPcHRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWV0aG9kLkdldE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLk1ldGhvZE9wdGlvbnMoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfc2VydmljZS5HZXRPcHRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlT3B0aW9ucygpKQotCi0gIGRlZiB0ZXN0U2ltcGxlQ3VzdG9tT3B0aW9ucyhzZWxmKToKLSAgICBmaWxlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuREVTQ1JJUFRPUgotICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucy5ERVNDUklQVE9SCi0gICAgZmllbGRfZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsiZmllbGQxIl0KLSAgICBlbnVtX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV90eXBlc19ieV9uYW1lWyJBbkVudW0iXQotICAgIGVudW1fdmFsdWVfZGVzY3JpcHRvciA9XAotICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV92YWx1ZXNfYnlfbmFtZVsiQU5FTlVNX1ZBTDIiXQotICAgIHNlcnZpY2VfZGVzY3JpcHRvciA9XAotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuVGVzdFNlcnZpY2VXaXRoQ3VzdG9tT3B0aW9ucy5ERVNDUklQVE9SCi0gICAgbWV0aG9kX2Rlc2NyaXB0b3IgPSBzZXJ2aWNlX2Rlc2NyaXB0b3IuRmluZE1ldGhvZEJ5TmFtZSgiRm9vIikKLQotICAgIGZpbGVfb3B0aW9ucyA9IGZpbGVfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBmaWxlX29wdDEgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmlsZV9vcHQxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg5ODc2NTQzMjEwLCBmaWxlX29wdGlvbnMuRXh0ZW5zaW9uc1tmaWxlX29wdDFdKQotICAgIG1lc3NhZ2Vfb3B0aW9ucyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBtZXNzYWdlX29wdDEgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIubWVzc2FnZV9vcHQxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtNTYsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zW21lc3NhZ2Vfb3B0MV0pCi0gICAgZmllbGRfb3B0aW9ucyA9IGZpZWxkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCi0gICAgZmllbGRfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWVsZF9vcHQxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg4NzY1NDMyMTA5LCBmaWVsZF9vcHRpb25zLkV4dGVuc2lvbnNbZmllbGRfb3B0MV0pCi0gICAgZmllbGRfb3B0MiA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWVsZF9vcHQyCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZmllbGRfb3B0aW9ucy5FeHRlbnNpb25zW2ZpZWxkX29wdDJdKQotICAgIGVudW1fb3B0aW9ucyA9IGVudW1fZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBlbnVtX29wdDEgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZW51bV9vcHQxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtNzg5LCBlbnVtX29wdGlvbnMuRXh0ZW5zaW9uc1tlbnVtX29wdDFdKQotICAgIGVudW1fdmFsdWVfb3B0aW9ucyA9IGVudW1fdmFsdWVfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBlbnVtX3ZhbHVlX29wdDEgPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZW51bV92YWx1ZV9vcHQxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMsIGVudW1fdmFsdWVfb3B0aW9ucy5FeHRlbnNpb25zW2VudW1fdmFsdWVfb3B0MV0pCi0KLSAgICBzZXJ2aWNlX29wdGlvbnMgPSBzZXJ2aWNlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCi0gICAgc2VydmljZV9vcHQxID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNlcnZpY2Vfb3B0MQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTk4NzY1NDMyMTAsIHNlcnZpY2Vfb3B0aW9ucy5FeHRlbnNpb25zW3NlcnZpY2Vfb3B0MV0pCi0gICAgbWV0aG9kX29wdGlvbnMgPSBtZXRob2RfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBtZXRob2Rfb3B0MSA9IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5tZXRob2Rfb3B0MQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLk1FVEhPRE9QVDFfVkFMMiwKLSAgICAgICAgICAgICAgICAgICAgIG1ldGhvZF9vcHRpb25zLkV4dGVuc2lvbnNbbWV0aG9kX29wdDFdKQotCi0gICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gKAotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0uREVTQ1JJUFRPUikKLSAgICBzZWxmLmFzc2VydFRydWUoZmlsZV9kZXNjcmlwdG9yLmhhc19vcHRpb25zKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZV9kZXNjcmlwdG9yLmhhc19vcHRpb25zKQotCi0gIGRlZiB0ZXN0RGlmZmVyZW50Q3VzdG9tT3B0aW9uVHlwZXMoc2VsZik6Ci0gICAga2ludDMybWluID0gLTIqKjMxCi0gICAga2ludDY0bWluID0gLTIqKjYzCi0gICAga2ludDMybWF4ID0gMioqMzEgLSAxCi0gICAga2ludDY0bWF4ID0gMioqNjMgLSAxCi0gICAga3VpbnQzMm1heCA9IDIqKjMyIC0gMQotICAgIGt1aW50NjRtYXggPSAyKio2NCAtIDEKLQotICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9XAotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQ3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlcy5ERVNDUklQVE9SCi0gICAgbWVzc2FnZV9vcHRpb25zID0gbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuYm9vbF9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWluLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmludDMyX29wdF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtaW4sIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50NjRfb3B0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIudWludDMyX29wdF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnVpbnQ2NF9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWluLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNpbnQzMl9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDY0bWluLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNpbnQ2NF9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maXhlZDMyX29wdF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpeGVkNjRfb3B0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGtpbnQzMm1pbiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5zZml4ZWQzMl9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDY0bWluLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNmaXhlZDY0X29wdF0pCi0KLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPVwKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkN1c3RvbU9wdGlvbk1heEludGVnZXJWYWx1ZXMuREVTQ1JJUFRPUgotICAgIG1lc3NhZ2Vfb3B0aW9ucyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuYm9vbF9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmludDMyX29wdF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChraW50NjRtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuaW50NjRfb3B0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGt1aW50MzJtYXgsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIudWludDMyX29wdF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChrdWludDY0bWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnVpbnQ2NF9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDMybWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNpbnQzMl9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDY0bWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNpbnQ2NF9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa3VpbnQzMm1heCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maXhlZDMyX29wdF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChrdWludDY0bWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpeGVkNjRfb3B0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGtpbnQzMm1heCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5zZml4ZWQzMl9vcHRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoa2ludDY0bWF4LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLnNmaXhlZDY0X29wdF0pCi0KLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPVwKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkN1c3RvbU9wdGlvbk90aGVyVmFsdWVzLkRFU0NSSVBUT1IKLSAgICBtZXNzYWdlX29wdGlvbnMgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMTAwLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmludDMyX29wdF0pCi0gICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgxMi4zNDU2Nzg5LCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZsb2F0X29wdF0sIDYpCi0gICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgxLjIzNDU2Nzg5MDEyMzQ1Njc4OSwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5kb3VibGVfb3B0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCJIZWxsbywgXCJXb3JsZFwiIiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5zdHJpbmdfb3B0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGIiSGVsbG9cMFdvcmxkIiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5ieXRlc19vcHRdKQotICAgIGR1bW15X2VudW0gPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuRHVtbXlNZXNzYWdlQ29udGFpbmluZ0VudW0KLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBkdW1teV9lbnVtLlRFU1RfT1BUSU9OX0VOVU1fVFlQRTIsCi0gICAgICAgIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zW3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5lbnVtX29wdF0pCi0KLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPVwKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLlNldHRpbmdSZWFsc0Zyb21Qb3NpdGl2ZUludHMuREVTQ1JJUFRPUgotICAgIG1lc3NhZ2Vfb3B0aW9ucyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKDEyLCBtZXNzYWdlX29wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZsb2F0X29wdF0sIDYpCi0gICAgc2VsZi5hc3NlcnRBbG1vc3RFcXVhbCgxNTQsIG1lc3NhZ2Vfb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZG91YmxlX29wdF0pCi0KLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPVwKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLlNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHMuREVTQ1JJUFRPUgotICAgIG1lc3NhZ2Vfb3B0aW9ucyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkKLSAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKC0xMiwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5mbG9hdF9vcHRdLCA2KQotICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwoLTE1NCwgbWVzc2FnZV9vcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5kb3VibGVfb3B0XSkKLQotICBkZWYgdGVzdENvbXBsZXhFeHRlbnNpb25PcHRpb25zKHNlbGYpOgotICAgIGRlc2NyaXB0b3IgPVwKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLlZhcmlvdXNDb21wbGV4T3B0aW9ucy5ERVNDUklQVE9SCi0gICAgb3B0aW9ucyA9IGRlc2NyaXB0b3IuR2V0T3B0aW9ucygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0Miwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQxXS5mb28pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzMjQsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0MV0uRXh0ZW5zaW9uc1sKLSAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5xdXV4XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDg3Niwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQxXS5FeHRlbnNpb25zWwotICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvcmdlXS5xdXgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg5ODcsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uYmF6KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNjU0LCBvcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLkV4dGVuc2lvbnNbCi0gICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZ3JhdWx0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDc0Mywgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5iYXIuZm9vKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTk5OSwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5iYXIuRXh0ZW5zaW9uc1sKLSAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5xdXV4XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIwMDgsIG9wdGlvbnMuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmNvbXBsZXhfb3B0Ml0uYmFyLkV4dGVuc2lvbnNbCi0gICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29yZ2VdLnF1eCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDc0MSwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5FeHRlbnNpb25zWwotICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmdhcnBseV0uZm9vKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTk5OCwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5FeHRlbnNpb25zWwotICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmdhcnBseV0uRXh0ZW5zaW9uc1sKLSAgICAgICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIucXV1eF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMTIxLCBvcHRpb25zLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb21wbGV4X29wdDJdLkV4dGVuc2lvbnNbCi0gICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZ2FycGx5XS5FeHRlbnNpb25zWwotICAgICAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5jb3JnZV0ucXV4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTk3MSwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQ29tcGxleE9wdGlvblR5cGUyCi0gICAgICAgIC5Db21wbGV4T3B0aW9uVHlwZTQuY29tcGxleF9vcHQ0XS53YWxkbykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMyMSwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQyXS5mcmVkLndhbGRvKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOSwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQzXS5xdXgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMiwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleF9vcHQzXS5jb21wbGV4b3B0aW9udHlwZTUucGx1Z2gpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyNCwgb3B0aW9ucy5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuY29tcGxleG9wdDZdLnh5enp5KQotCi0gICMgQ2hlY2sgdGhhdCBhZ2dyZWdhdGUgb3B0aW9ucyB3ZXJlIHBhcnNlZCBhbmQgc2F2ZWQgY29ycmVjdGx5IGluCi0gICMgdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0b3JzLgotICBkZWYgdGVzdEFnZ3JlZ2F0ZU9wdGlvbnMoc2VsZik6Ci0gICAgZmlsZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkRFU0NSSVBUT1IKLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPVwKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkFnZ3JlZ2F0ZU1lc3NhZ2UuREVTQ1JJUFRPUgotICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbImZpZWxkbmFtZSJdCi0gICAgZW51bV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkFnZ3JlZ2F0ZUVudW0uREVTQ1JJUFRPUgotICAgIGVudW1fdmFsdWVfZGVzY3JpcHRvciA9IGVudW1fZGVzY3JpcHRvci52YWx1ZXNfYnlfbmFtZVsiVkFMVUUiXQotICAgIHNlcnZpY2VfZGVzY3JpcHRvciA9XAotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQWdncmVnYXRlU2VydmljZS5ERVNDUklQVE9SCi0gICAgbWV0aG9kX2Rlc2NyaXB0b3IgPSBzZXJ2aWNlX2Rlc2NyaXB0b3IuRmluZE1ldGhvZEJ5TmFtZSgiTWV0aG9kIikKLQotICAgICMgVGVzdHMgZm9yIHRoZSBkaWZmZXJlbnQgdHlwZXMgb2YgZGF0YSBlbWJlZGRlZCBpbiBmaWxlb3B0Ci0gICAgZmlsZV9vcHRpb25zID0gZmlsZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZmlsZW9wdF0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMCwgZmlsZV9vcHRpb25zLmkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgiRmlsZUFubm90YXRpb24iLCBmaWxlX29wdGlvbnMucykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCJOZXN0ZWRGaWxlQW5ub3RhdGlvbiIsIGZpbGVfb3B0aW9ucy5zdWIucykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCJGaWxlRXh0ZW5zaW9uQW5ub3RhdGlvbiIsIGZpbGVfb3B0aW9ucy5maWxlLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWxlb3B0XS5zKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoIkVtYmVkZGVkTWVzc2FnZVNldEVsZW1lbnQiLCBmaWxlX29wdGlvbnMubXNldC5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQKLSAgICAgICAgLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbl0ucykKLQotICAgICMgU2ltcGxlIHRlc3RzIGZvciBhbGwgdGhlIG90aGVyIHR5cGVzIG9mIGFubm90YXRpb25zCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgIk1lc3NhZ2VBbm5vdGF0aW9uIiwKLSAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWwotICAgICAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLm1zZ29wdF0ucykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAiRmllbGRBbm5vdGF0aW9uIiwKLSAgICAgICAgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKLSAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWVsZG9wdF0ucykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAiRW51bUFubm90YXRpb24iLAotICAgICAgICBlbnVtX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCi0gICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuZW51bW9wdF0ucykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAiRW51bVZhbHVlQW5ub3RhdGlvbiIsCi0gICAgICAgIGVudW1fdmFsdWVfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKLSAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5lbnVtdmFsb3B0XS5zKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICJTZXJ2aWNlQW5ub3RhdGlvbiIsCi0gICAgICAgIHNlcnZpY2VfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKLSAgICAgICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5zZXJ2aWNlb3B0XS5zKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICJNZXRob2RBbm5vdGF0aW9uIiwKLSAgICAgICAgbWV0aG9kX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCi0gICAgICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIubWV0aG9kb3B0XS5zKQotCi0gIGRlZiB0ZXN0TmVzdGVkT3B0aW9ucyhzZWxmKToKLSAgICBuZXN0ZWRfbWVzc2FnZSA9XAotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuTmVzdGVkT3B0aW9uVHlwZS5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDEsIG5lc3RlZF9tZXNzYWdlLkdldE9wdGlvbnMoKS5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIubWVzc2FnZV9vcHQxXSkKLSAgICBuZXN0ZWRfZmllbGQgPSBuZXN0ZWRfbWVzc2FnZS5maWVsZHNfYnlfbmFtZVsibmVzdGVkX2ZpZWxkIl0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDIsIG5lc3RlZF9maWVsZC5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmZpZWxkX29wdDFdKQotICAgIG91dGVyX21lc3NhZ2UgPVwKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLk5lc3RlZE9wdGlvblR5cGUuREVTQ1JJUFRPUgotICAgIG5lc3RlZF9lbnVtID0gb3V0ZXJfbWVzc2FnZS5lbnVtX3R5cGVzX2J5X25hbWVbIk5lc3RlZEVudW0iXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwMywgbmVzdGVkX2VudW0uR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5lbnVtX29wdDFdKQotICAgIG5lc3RlZF9lbnVtX3ZhbHVlID0gb3V0ZXJfbWVzc2FnZS5lbnVtX3ZhbHVlc19ieV9uYW1lWyJORVNURURfRU5VTV9WQUxVRSJdCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMDA0LCBuZXN0ZWRfZW51bV92YWx1ZS5HZXRPcHRpb25zKCkuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLmVudW1fdmFsdWVfb3B0MV0pCi0gICAgbmVzdGVkX2V4dGVuc2lvbiA9IG91dGVyX21lc3NhZ2UuZXh0ZW5zaW9uc19ieV9uYW1lWyJuZXN0ZWRfZXh0ZW5zaW9uIl0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDUsIG5lc3RlZF9leHRlbnNpb24uR2V0T3B0aW9ucygpLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMi5maWVsZF9vcHQyXSkKLQotICBkZWYgdGVzdEZpbGVEZXNjcmlwdG9yUmVmZXJlbmNlcyhzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZW51bS5maWxlLCBzZWxmLm15X2ZpbGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X21lc3NhZ2UuZmlsZSwgc2VsZi5teV9maWxlKQotCi0gIGRlZiB0ZXN0RmlsZURlc2NyaXB0b3Ioc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2ZpbGUubmFtZSwgJ3NvbWUvZmlsZW5hbWUvc29tZS5wcm90bycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2ZpbGUucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZmlsZS5wb29sLCBzZWxmLnBvb2wpCi0gICAgIyBHZW5lcmF0ZWQgbW9kdWxlcyBhbHNvIGJlbG9uZyB0byB0aGUgZGVmYXVsdCBwb29sLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IucG9vbCwgZGVzY3JpcHRvcl9wb29sLkRlZmF1bHQoKSkKLQotICBAdW5pdHRlc3Quc2tpcElmKAotICAgICAgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAnY3BwJyBvciBhcGlfaW1wbGVtZW50YXRpb24uVmVyc2lvbigpICE9IDIsCi0gICAgICAnSW1tdXRhYmlsaXR5IG9mIGRlc2NyaXB0b3JzIGlzIG9ubHkgZW5mb3JjZWQgaW4gdjIgaW1wbGVtZW50YXRpb24nKQotICBkZWYgdGVzdEltbXV0YWJsZUNwcERlc2NyaXB0b3Ioc2VsZik6Ci0gICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvcik6Ci0gICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWUgPSBOb25lCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lWydBbm90aGVyJ10gPSBOb25lCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkcy5hcHBlbmQoTm9uZSkKLQotCi1jbGFzcyBOZXdEZXNjcmlwdG9yVGVzdChEZXNjcmlwdG9yVGVzdCk6Ci0gICIiIlJlZG8gdGhlIHNhbWUgdGVzdHMgYXMgYWJvdmUsIGJ1dCB3aXRoIGEgc2VwYXJhdGUgRGVzY3JpcHRvclBvb2wuIiIiCi0KLSAgZGVmIEdldERlc2NyaXB0b3JQb29sKHNlbGYpOgotICAgIHJldHVybiBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQotCi0KLWNsYXNzIEdlbmVyYXRlZERlc2NyaXB0b3JUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiVGVzdHMgZm9yIHRoZSBwcm9wZXJ0aWVzIG9mIGRlc2NyaXB0b3JzIGluIGdlbmVyYXRlZCBjb2RlLiIiIgotCi0gIGRlZiBDaGVja01lc3NhZ2VEZXNjcmlwdG9yKHNlbGYsIG1lc3NhZ2VfZGVzY3JpcHRvcik6Ci0gICAgIyBCYXNpYyBwcm9wZXJ0aWVzCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSwgJ1Rlc3RBbGxUeXBlcycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcycpCi0gICAgIyBUZXN0IGVxdWFsaXR5IGFuZCBoYXNoYWJpbGl0eQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZV9kZXNjcmlwdG9yLCBtZXNzYWdlX2Rlc2NyaXB0b3IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzWzBdLmNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvcikKLSAgICBzZWxmLmFzc2VydEluKG1lc3NhZ2VfZGVzY3JpcHRvciwgW21lc3NhZ2VfZGVzY3JpcHRvcl0pCi0gICAgc2VsZi5hc3NlcnRJbihtZXNzYWdlX2Rlc2NyaXB0b3IsIHttZXNzYWdlX2Rlc2NyaXB0b3I6IE5vbmV9KQotICAgICMgVGVzdCBmaWVsZCBjb250YWluZXJzCi0gICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JTZXF1ZW5jZShtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzKQotICAgIHNlbGYuQ2hlY2tEZXNjcmlwdG9yTWFwcGluZyhtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWUpCi0gICAgc2VsZi5DaGVja0Rlc2NyaXB0b3JNYXBwaW5nKG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbnVtYmVyKQotICAgIHNlbGYuQ2hlY2tEZXNjcmlwdG9yTWFwcGluZyhtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lKQotCi0gIGRlZiBDaGVja0ZpZWxkRGVzY3JpcHRvcihzZWxmLCBmaWVsZF9kZXNjcmlwdG9yKToKLSAgICAjIEJhc2ljIHByb3BlcnRpZXMKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkX2Rlc2NyaXB0b3IubmFtZSwgJ29wdGlvbmFsX2ludDMyJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkX2Rlc2NyaXB0b3IuY2FtZWxjYXNlX25hbWUsICdvcHRpb25hbEludDMyJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpZWxkX2Rlc2NyaXB0b3IuZnVsbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5vcHRpb25hbF9pbnQzMicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfdHlwZS5uYW1lLCAnVGVzdEFsbFR5cGVzJykKLSAgICAjIFRlc3QgZXF1YWxpdHkgYW5kIGhhc2hhYmlsaXR5Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChmaWVsZF9kZXNjcmlwdG9yLCBmaWVsZF9kZXNjcmlwdG9yKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IuY29udGFpbmluZ190eXBlLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9pbnQzMiddLAotICAgICAgICBmaWVsZF9kZXNjcmlwdG9yKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IuY29udGFpbmluZ190eXBlLmZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZVsKLSAgICAgICAgICAgICdvcHRpb25hbEludDMyJ10sCi0gICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IpCi0gICAgc2VsZi5hc3NlcnRJbihmaWVsZF9kZXNjcmlwdG9yLCBbZmllbGRfZGVzY3JpcHRvcl0pCi0gICAgc2VsZi5hc3NlcnRJbihmaWVsZF9kZXNjcmlwdG9yLCB7ZmllbGRfZGVzY3JpcHRvcjogTm9uZX0pCi0KLSAgZGVmIENoZWNrRGVzY3JpcHRvclNlcXVlbmNlKHNlbGYsIHNlcXVlbmNlKToKLSAgICAjIFZlcmlmaWVzIHRoYXQgYSBwcm9wZXJ0eSBsaWtlICdtZXNzYWdlRGVzY3JpcHRvci5maWVsZHMnIGhhcyBhbGwgdGhlCi0gICAgIyBwcm9wZXJ0aWVzIG9mIGFuIGltbXV0YWJsZSBhYmMuU2VxdWVuY2UuCi0gICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihzZXF1ZW5jZSksIDApICAjIFNpemVkCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsZW4oc2VxdWVuY2UpLCBsZW4obGlzdChzZXF1ZW5jZSkpKSAgIyBJdGVyYWJsZQotICAgIGl0ZW0gPSBzZXF1ZW5jZVswXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbSwgc2VxdWVuY2VbMF0pCi0gICAgc2VsZi5hc3NlcnRJbihpdGVtLCBzZXF1ZW5jZSkgICMgQ29udGFpbmVyCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZXF1ZW5jZS5pbmRleChpdGVtKSwgMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlcXVlbmNlLmNvdW50KGl0ZW0pLCAxKQotICAgIHJldmVyc2VkX2l0ZXJhdG9yID0gcmV2ZXJzZWQoc2VxdWVuY2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KHJldmVyc2VkX2l0ZXJhdG9yKSwgbGlzdChzZXF1ZW5jZSlbOjotMV0pCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoU3RvcEl0ZXJhdGlvbiwgbmV4dCwgcmV2ZXJzZWRfaXRlcmF0b3IpCi0KLSAgZGVmIENoZWNrRGVzY3JpcHRvck1hcHBpbmcoc2VsZiwgbWFwcGluZyk6Ci0gICAgIyBWZXJpZmllcyB0aGF0IGEgcHJvcGVydHkgbGlrZSAnbWVzc2FnZURlc2NyaXB0b3IuZmllbGRzJyBoYXMgYWxsIHRoZQotICAgICMgcHJvcGVydGllcyBvZiBhbiBpbW11dGFibGUgYWJjLk1hcHBpbmcuCi0gICAgc2VsZi5hc3NlcnRHcmVhdGVyKGxlbihtYXBwaW5nKSwgMCkgICMgU2l6ZWQKLSAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtYXBwaW5nKSwgbGVuKGxpc3QobWFwcGluZykpKSAgIyBJdGVyYWJsZQotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPj0gKDMsKToKLSAgICAgIGtleSwgaXRlbSA9IG5leHQoaXRlcihtYXBwaW5nLml0ZW1zKCkpKQotICAgIGVsc2U6Ci0gICAgICBrZXksIGl0ZW0gPSBtYXBwaW5nLml0ZW1zKClbMF0KLSAgICBzZWxmLmFzc2VydEluKGtleSwgbWFwcGluZykgICMgQ29udGFpbmVyCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtYXBwaW5nLmdldChrZXkpLCBpdGVtKQotICAgICMga2V5cygpLCBpdGVya2V5cygpICZjbwotICAgIGl0ZW0gPSAobmV4dChpdGVyKG1hcHBpbmcua2V5cygpKSksIG5leHQoaXRlcihtYXBwaW5nLnZhbHVlcygpKSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChpdGVtLCBuZXh0KGl0ZXIobWFwcGluZy5pdGVtcygpKSkpCi0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCk6Ci0gICAgICBkZWYgQ2hlY2tJdGVtcyhzZXEsIGl0ZXJhdG9yKToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXh0KGl0ZXJhdG9yKSwgc2VxWzBdKQotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QoaXRlcmF0b3IpLCBzZXFbMTpdKQotICAgICAgQ2hlY2tJdGVtcyhtYXBwaW5nLmtleXMoKSwgbWFwcGluZy5pdGVya2V5cygpKQotICAgICAgQ2hlY2tJdGVtcyhtYXBwaW5nLnZhbHVlcygpLCBtYXBwaW5nLml0ZXJ2YWx1ZXMoKSkKLSAgICAgIENoZWNrSXRlbXMobWFwcGluZy5pdGVtcygpLCBtYXBwaW5nLml0ZXJpdGVtcygpKQotCi0gIGRlZiB0ZXN0RGVzY3JpcHRvcihzZWxmKToKLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKLSAgICBzZWxmLkNoZWNrTWVzc2FnZURlc2NyaXB0b3IobWVzc2FnZV9kZXNjcmlwdG9yKQotICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJ10KLSAgICBzZWxmLkNoZWNrRmllbGREZXNjcmlwdG9yKGZpZWxkX2Rlc2NyaXB0b3IpCi0gICAgZmllbGRfZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfY2FtZWxjYXNlX25hbWVbCi0gICAgICAgICdvcHRpb25hbEludDMyJ10KLSAgICBzZWxmLkNoZWNrRmllbGREZXNjcmlwdG9yKGZpZWxkX2Rlc2NyaXB0b3IpCi0KLSAgZGVmIHRlc3RDcHBEZXNjcmlwdG9yQ29udGFpbmVyKHNlbGYpOgotICAgICMgQ2hlY2sgdGhhdCB0aGUgY29sbGVjdGlvbiBpcyBzdGlsbCB2YWxpZCBldmVuIGlmIHRoZSBwYXJlbnQgZGlzYXBwZWFyZWQuCi0gICAgZW51bSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUi5lbnVtX3R5cGVzX2J5X25hbWVbJ05lc3RlZEVudW0nXQotICAgIHZhbHVlcyA9IGVudW0udmFsdWVzCi0gICAgZGVsIGVudW0KLSAgICBzZWxmLmFzc2VydEVxdWFsKCdGT08nLCB2YWx1ZXNbMF0ubmFtZSkKLQotICBkZWYgdGVzdENwcERlc2NyaXB0b3JDb250YWluZXJfSXRlcmF0b3Ioc2VsZik6Ci0gICAgIyBTYW1lIHRlc3Qgd2l0aCB0aGUgaXRlcmF0b3IKLSAgICBlbnVtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmVudW1fdHlwZXNfYnlfbmFtZVsnTmVzdGVkRW51bSddCi0gICAgdmFsdWVzX2l0ZXIgPSBpdGVyKGVudW0udmFsdWVzKQotICAgIGRlbCBlbnVtCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnRk9PJywgbmV4dCh2YWx1ZXNfaXRlcikubmFtZSkKLQotCi1jbGFzcyBEZXNjcmlwdG9yQ29weVRvUHJvdG9UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiVGVzdHMgZm9yIENvcHlUbyBmdW5jdGlvbnMgb2YgRGVzY3JpcHRvci4iIiIKLQotICBkZWYgX0Fzc2VydFByb3RvRXF1YWwoc2VsZiwgYWN0dWFsX3Byb3RvLCBleHBlY3RlZF9jbGFzcywgZXhwZWN0ZWRfYXNjaWkpOgotICAgIGV4cGVjdGVkX3Byb3RvID0gZXhwZWN0ZWRfY2xhc3MoKQotICAgIHRleHRfZm9ybWF0Lk1lcmdlKGV4cGVjdGVkX2FzY2lpLCBleHBlY3RlZF9wcm90bykKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGFjdHVhbF9wcm90bywgZXhwZWN0ZWRfcHJvdG8sCi0gICAgICAgICdOb3QgZXF1YWwsXG5BY3R1YWw6XG4lc1xuRXhwZWN0ZWQ6XG4lc1xuJwotICAgICAgICAlIChzdHIoYWN0dWFsX3Byb3RvKSwgc3RyKGV4cGVjdGVkX3Byb3RvKSkpCi0KLSAgZGVmIF9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90byhzZWxmLCBkZXNjLCBleHBlY3RlZF9wcm90b19jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZF9wcm90b19hc2NpaSk6Ci0gICAgYWN0dWFsID0gZXhwZWN0ZWRfcHJvdG9fY2xhc3MoKQotICAgIGRlc2MuQ29weVRvUHJvdG8oYWN0dWFsKQotICAgIHNlbGYuX0Fzc2VydFByb3RvRXF1YWwoCi0gICAgICAgIGFjdHVhbCwgZXhwZWN0ZWRfcHJvdG9fY2xhc3MsIGV4cGVjdGVkX3Byb3RvX2FzY2lpKQotCi0gIGRlZiB0ZXN0Q29weVRvUHJvdG9fRW1wdHlNZXNzYWdlKHNlbGYpOgotICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZS5ERVNDUklQVE9SLAotICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCi0gICAgICAgIFRFU1RfRU1QVFlfTUVTU0FHRV9ERVNDUklQVE9SX0FTQ0lJKQotCi0gIGRlZiB0ZXN0Q29weVRvUHJvdG9fTmVzdGVkTWVzc2FnZShzZWxmKToKLSAgICBURVNUX05FU1RFRF9NRVNTQUdFX0FTQ0lJID0gIiIiCi0gICAgICBuYW1lOiAnTmVzdGVkTWVzc2FnZScKLSAgICAgIGZpZWxkOiA8Ci0gICAgICAgIG5hbWU6ICdiYicKLSAgICAgICAgbnVtYmVyOiAxCi0gICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCi0gICAgICAgIHR5cGU6IDUgICMgVFlQRV9JTlQzMgotICAgICAgPgotICAgICAgIiIiCi0KLSAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IsCi0gICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKLSAgICAgICAgVEVTVF9ORVNURURfTUVTU0FHRV9BU0NJSSkKLQotICBkZWYgdGVzdENvcHlUb1Byb3RvX0ZvcmVpZ25OZXN0ZWRNZXNzYWdlKHNlbGYpOgotICAgIFRFU1RfRk9SRUlHTl9ORVNURURfQVNDSUkgPSAiIiIKLSAgICAgIG5hbWU6ICdUZXN0Rm9yZWlnbk5lc3RlZCcKLSAgICAgIGZpZWxkOiA8Ci0gICAgICAgIG5hbWU6ICdmb3JlaWduX25lc3RlZCcKLSAgICAgICAgbnVtYmVyOiAxCi0gICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCi0gICAgICAgIHR5cGU6IDExICAjIFRZUEVfTUVTU0FHRQotICAgICAgICB0eXBlX25hbWU6ICcucHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnCi0gICAgICA+Ci0gICAgICAiIiIKLQotICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEZvcmVpZ25OZXN0ZWQuREVTQ1JJUFRPUiwKLSAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAotICAgICAgICBURVNUX0ZPUkVJR05fTkVTVEVEX0FTQ0lJKQotCi0gIGRlZiB0ZXN0Q29weVRvUHJvdG9fRm9yZWlnbkVudW0oc2VsZik6Ci0gICAgVEVTVF9GT1JFSUdOX0VOVU1fQVNDSUkgPSAiIiIKLSAgICAgIG5hbWU6ICdGb3JlaWduRW51bScKLSAgICAgIHZhbHVlOiA8Ci0gICAgICAgIG5hbWU6ICdGT1JFSUdOX0ZPTycKLSAgICAgICAgbnVtYmVyOiA0Ci0gICAgICA+Ci0gICAgICB2YWx1ZTogPAotICAgICAgICBuYW1lOiAnRk9SRUlHTl9CQVInCi0gICAgICAgIG51bWJlcjogNQotICAgICAgPgotICAgICAgdmFsdWU6IDwKLSAgICAgICAgbmFtZTogJ0ZPUkVJR05fQkFaJwotICAgICAgICBudW1iZXI6IDYKLSAgICAgID4KLSAgICAgICIiIgotCi0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduRW51bS5ERVNDUklQVE9SLAotICAgICAgICBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvLAotICAgICAgICBURVNUX0ZPUkVJR05fRU5VTV9BU0NJSSkKLQotICBkZWYgdGVzdENvcHlUb1Byb3RvX09wdGlvbnMoc2VsZik6Ci0gICAgVEVTVF9ERVBSRUNBVEVEX0ZJRUxEU19BU0NJSSA9ICIiIgotICAgICAgbmFtZTogJ1Rlc3REZXByZWNhdGVkRmllbGRzJwotICAgICAgZmllbGQ6IDwKLSAgICAgICAgbmFtZTogJ2RlcHJlY2F0ZWRfaW50MzInCi0gICAgICAgIG51bWJlcjogMQotICAgICAgICBsYWJlbDogMSAgIyBPcHRpb25hbAotICAgICAgICB0eXBlOiA1ICAjIFRZUEVfSU5UMzIKLSAgICAgICAgb3B0aW9uczogPAotICAgICAgICAgIGRlcHJlY2F0ZWQ6IHRydWUKLSAgICAgICAgPgotICAgICAgPgotICAgICAgIiIiCi0KLSAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3REZXByZWNhdGVkRmllbGRzLkRFU0NSSVBUT1IsCi0gICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKLSAgICAgICAgVEVTVF9ERVBSRUNBVEVEX0ZJRUxEU19BU0NJSSkKLQotICBkZWYgdGVzdENvcHlUb1Byb3RvX0FsbEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgVEVTVF9FTVBUWV9NRVNTQUdFX1dJVEhfRVhURU5TSU9OU19BU0NJSSA9ICIiIgotICAgICAgbmFtZTogJ1Rlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucycKLSAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAotICAgICAgICBzdGFydDogMQotICAgICAgICBlbmQ6IDUzNjg3MDkxMgotICAgICAgPgotICAgICAgIiIiCi0KLSAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucy5ERVNDUklQVE9SLAotICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCi0gICAgICAgIFRFU1RfRU1QVFlfTUVTU0FHRV9XSVRIX0VYVEVOU0lPTlNfQVNDSUkpCi0KLSAgZGVmIHRlc3RDb3B5VG9Qcm90b19TZXZlcmFsRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBURVNUX01FU1NBR0VfV0lUSF9TRVZFUkFMX0VYVEVOU0lPTlNfQVNDSUkgPSAiIiIKLSAgICAgIG5hbWU6ICdUZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMnCi0gICAgICBleHRlbnNpb25fcmFuZ2U6IDwKLSAgICAgICAgc3RhcnQ6IDQyCi0gICAgICAgIGVuZDogNDMKLSAgICAgID4KLSAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAotICAgICAgICBzdGFydDogNDE0MwotICAgICAgICBlbmQ6IDQyNDQKLSAgICAgID4KLSAgICAgIGV4dGVuc2lvbl9yYW5nZTogPAotICAgICAgICBzdGFydDogNjU1MzYKLSAgICAgICAgZW5kOiA1MzY4NzA5MTIKLSAgICAgID4KLSAgICAgICIiIgotCi0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0TXVsdGlwbGVFeHRlbnNpb25SYW5nZXMuREVTQ1JJUFRPUiwKLSAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAotICAgICAgICBURVNUX01FU1NBR0VfV0lUSF9TRVZFUkFMX0VYVEVOU0lPTlNfQVNDSUkpCi0KLSAgIyBEaXNhYmxlIHRoaXMgdGVzdCBzbyB3ZSBjYW4gbWFrZSBjaGFuZ2VzIHRvIHRoZSBwcm90byBmaWxlLgotICAjIFRPRE8oeGlhb2ZlbmcpOiBFbmFibGUgdGhpcyB0ZXN0IGFmdGVyIGNsLzU1NTMwNjU5IGlzIHN1Ym1pdHRlZC4KLSAgIwotICAjIGRlZiB0ZXN0Q29weVRvUHJvdG9fRmlsZURlc2NyaXB0b3Ioc2VsZik6Ci0gICMgICBVTklUVEVTVF9JTVBPUlRfRklMRV9ERVNDUklQVE9SX0FTQ0lJID0gKCIiIgotICAjICAgICBuYW1lOiAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90bycKLSAgIyAgICAgcGFja2FnZTogJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcKLSAgIyAgICAgZGVwZW5kZW5jeTogJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvJwotICAjICAgICBtZXNzYWdlX3R5cGU6IDwKLSAgIyAgICAgICBuYW1lOiAnSW1wb3J0TWVzc2FnZScKLSAgIyAgICAgICBmaWVsZDogPAotICAjICAgICAgICAgbmFtZTogJ2QnCi0gICMgICAgICAgICBudW1iZXI6IDEKLSAgIyAgICAgICAgIGxhYmVsOiAxICAjIE9wdGlvbmFsCi0gICMgICAgICAgICB0eXBlOiA1ICAjIFRZUEVfSU5UMzIKLSAgIyAgICAgICA+Ci0gICMgICAgID4KLSAgIyAgICAgIiIiICsKLSAgIyAgICAgIiIiZW51bV90eXBlOiA8Ci0gICMgICAgICAgbmFtZTogJ0ltcG9ydEVudW0nCi0gICMgICAgICAgdmFsdWU6IDwKLSAgIyAgICAgICAgIG5hbWU6ICdJTVBPUlRfRk9PJwotICAjICAgICAgICAgbnVtYmVyOiA3Ci0gICMgICAgICAgPgotICAjICAgICAgIHZhbHVlOiA8Ci0gICMgICAgICAgICBuYW1lOiAnSU1QT1JUX0JBUicKLSAgIyAgICAgICAgIG51bWJlcjogOAotICAjICAgICAgID4KLSAgIyAgICAgICB2YWx1ZTogPAotICAjICAgICAgICAgbmFtZTogJ0lNUE9SVF9CQVonCi0gICMgICAgICAgICBudW1iZXI6IDkKLSAgIyAgICAgICA+Ci0gICMgICAgID4KLSAgIyAgICAgb3B0aW9uczogPAotICAjICAgICAgIGphdmFfcGFja2FnZTogJ2NvbS5nb29nbGUucHJvdG9idWYudGVzdCcKLSAgIyAgICAgICBvcHRpbWl6ZV9mb3I6IDEgICMgU1BFRUQKLSAgIyAgICAgPgotICAjICAgICBwdWJsaWNfZGVwZW5kZW5jeTogMAotICAjICAiIiIpCi0gICMgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAotICAjICAgICAgdW5pdHRlc3RfaW1wb3J0X3BiMi5ERVNDUklQVE9SLAotICAjICAgICAgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bywKLSAgIyAgICAgIFVOSVRURVNUX0lNUE9SVF9GSUxFX0RFU0NSSVBUT1JfQVNDSUkpCi0KLSAgZGVmIHRlc3RDb3B5VG9Qcm90b19TZXJ2aWNlRGVzY3JpcHRvcihzZWxmKToKLSAgICBURVNUX1NFUlZJQ0VfQVNDSUkgPSAiIiIKLSAgICAgIG5hbWU6ICdUZXN0U2VydmljZScKLSAgICAgIG1ldGhvZDogPAotICAgICAgICBuYW1lOiAnRm9vJwotICAgICAgICBpbnB1dF90eXBlOiAnLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1JlcXVlc3QnCi0gICAgICAgIG91dHB1dF90eXBlOiAnLnByb3RvYnVmX3VuaXR0ZXN0LkZvb1Jlc3BvbnNlJwotICAgICAgPgotICAgICAgbWV0aG9kOiA8Ci0gICAgICAgIG5hbWU6ICdCYXInCi0gICAgICAgIGlucHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVxdWVzdCcKLSAgICAgICAgb3V0cHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuQmFyUmVzcG9uc2UnCi0gICAgICA+Ci0gICAgICAiIiIKLSAgICAjIFRPRE8ocm9ja2luZyk6IGVuYWJsZSB0aGlzIHRlc3QgYWZ0ZXIgdGhlIHByb3RvIGRlc2NyaXB0b3IgY2hhbmdlIGlzCi0gICAgIyBjaGVja2VkIGluLgotICAgICNzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKLSAgICAjICAgIHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZS5ERVNDUklQVE9SLAotICAgICMgICAgZGVzY3JpcHRvcl9wYjIuU2VydmljZURlc2NyaXB0b3JQcm90bywKLSAgICAjICAgIFRFU1RfU0VSVklDRV9BU0NJSSkKLQotCi1jbGFzcyBNYWtlRGVzY3JpcHRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0TWFrZURlc2NyaXB0b3JXaXRoTmVzdGVkRmllbGRzKHNlbGYpOgotICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90byA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQotICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5uYW1lID0gJ0ZvbzInCi0gICAgbWVzc2FnZV90eXBlID0gZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm1lc3NhZ2VfdHlwZS5hZGQoKQotICAgIG1lc3NhZ2VfdHlwZS5uYW1lID0gZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm5hbWUKLSAgICBuZXN0ZWRfdHlwZSA9IG1lc3NhZ2VfdHlwZS5uZXN0ZWRfdHlwZS5hZGQoKQotICAgIG5lc3RlZF90eXBlLm5hbWUgPSAnU3ViJwotICAgIGVudW1fdHlwZSA9IG5lc3RlZF90eXBlLmVudW1fdHlwZS5hZGQoKQotICAgIGVudW1fdHlwZS5uYW1lID0gJ0ZPTycKLSAgICBlbnVtX3R5cGVfdmFsID0gZW51bV90eXBlLnZhbHVlLmFkZCgpCi0gICAgZW51bV90eXBlX3ZhbC5uYW1lID0gJ0JBUicKLSAgICBlbnVtX3R5cGVfdmFsLm51bWJlciA9IDMKLSAgICBmaWVsZCA9IG1lc3NhZ2VfdHlwZS5maWVsZC5hZGQoKQotICAgIGZpZWxkLm51bWJlciA9IDEKLSAgICBmaWVsZC5uYW1lID0gJ3VpbnQ2NF9maWVsZCcKLSAgICBmaWVsZC5sYWJlbCA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUVVJUkVECi0gICAgZmllbGQudHlwZSA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0Ci0gICAgZmllbGQgPSBtZXNzYWdlX3R5cGUuZmllbGQuYWRkKCkKLSAgICBmaWVsZC5udW1iZXIgPSAyCi0gICAgZmllbGQubmFtZSA9ICduZXN0ZWRfbWVzc2FnZV9maWVsZCcKLSAgICBmaWVsZC5sYWJlbCA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUVVJUkVECi0gICAgZmllbGQudHlwZSA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRQotICAgIGZpZWxkLnR5cGVfbmFtZSA9ICdTdWInCi0gICAgZW51bV9maWVsZCA9IG5lc3RlZF90eXBlLmZpZWxkLmFkZCgpCi0gICAgZW51bV9maWVsZC5udW1iZXIgPSAyCi0gICAgZW51bV9maWVsZC5uYW1lID0gJ2Jhcl9maWVsZCcKLSAgICBlbnVtX2ZpZWxkLmxhYmVsID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVRVUlSRUQKLSAgICBlbnVtX2ZpZWxkLnR5cGUgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0VOVU0KLSAgICBlbnVtX2ZpZWxkLnR5cGVfbmFtZSA9ICdGb28yLlN1Yi5GT08nCi0KLSAgICByZXN1bHQgPSBkZXNjcmlwdG9yLk1ha2VEZXNjcmlwdG9yKG1lc3NhZ2VfdHlwZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5maWVsZHNbMF0uY3BwX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1VJTlQ2NCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5maWVsZHNbMV0uY3BwX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZmllbGRzWzFdLm1lc3NhZ2VfdHlwZS5jb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICByZXN1bHQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQubmVzdGVkX3R5cGVzWzBdLmZpZWxkc1swXS5mdWxsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAnRm9vMi5TdWIuYmFyX2ZpZWxkJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHJlc3VsdC5uZXN0ZWRfdHlwZXNbMF0uZmllbGRzWzBdLmVudW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHJlc3VsdC5uZXN0ZWRfdHlwZXNbMF0uZW51bV90eXBlc1swXSkKLQotICBkZWYgdGVzdE1ha2VEZXNjcmlwdG9yV2l0aFVuc2lnbmVkSW50RmllbGQoc2VsZik6Ci0gICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCi0gICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLm5hbWUgPSAnRm9vJwotICAgIG1lc3NhZ2VfdHlwZSA9IGZpbGVfZGVzY3JpcHRvcl9wcm90by5tZXNzYWdlX3R5cGUuYWRkKCkKLSAgICBtZXNzYWdlX3R5cGUubmFtZSA9IGZpbGVfZGVzY3JpcHRvcl9wcm90by5uYW1lCi0gICAgZW51bV90eXBlID0gbWVzc2FnZV90eXBlLmVudW1fdHlwZS5hZGQoKQotICAgIGVudW1fdHlwZS5uYW1lID0gJ0ZPTycKLSAgICBlbnVtX3R5cGVfdmFsID0gZW51bV90eXBlLnZhbHVlLmFkZCgpCi0gICAgZW51bV90eXBlX3ZhbC5uYW1lID0gJ0JBUicKLSAgICBlbnVtX3R5cGVfdmFsLm51bWJlciA9IDMKLSAgICBmaWVsZCA9IG1lc3NhZ2VfdHlwZS5maWVsZC5hZGQoKQotICAgIGZpZWxkLm51bWJlciA9IDEKLSAgICBmaWVsZC5uYW1lID0gJ3VpbnQ2NF9maWVsZCcKLSAgICBmaWVsZC5sYWJlbCA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUVVJUkVECi0gICAgZmllbGQudHlwZSA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0Ci0gICAgZW51bV9maWVsZCA9IG1lc3NhZ2VfdHlwZS5maWVsZC5hZGQoKQotICAgIGVudW1fZmllbGQubnVtYmVyID0gMgotICAgIGVudW1fZmllbGQubmFtZSA9ICdiYXJfZmllbGQnCi0gICAgZW51bV9maWVsZC5sYWJlbCA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUVVJUkVECi0gICAgZW51bV9maWVsZC50eXBlID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNCi0gICAgZW51bV9maWVsZC50eXBlX25hbWUgPSAnRm9vLkZPTycKLQotICAgIHJlc3VsdCA9IGRlc2NyaXB0b3IuTWFrZURlc2NyaXB0b3IobWVzc2FnZV90eXBlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVzdWx0LmZpZWxkc1swXS5jcHBfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDY0KQotCi0KLSAgZGVmIHRlc3RNYWtlRGVzY3JpcHRvcldpdGhPcHRpb25zKHNlbGYpOgotICAgIGRlc2NyaXB0b3JfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8oKQotICAgIGFnZ3JlZ2F0ZV9tZXNzYWdlID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLkFnZ3JlZ2F0ZU1lc3NhZ2UKLSAgICBhZ2dyZWdhdGVfbWVzc2FnZS5ERVNDUklQVE9SLkNvcHlUb1Byb3RvKGRlc2NyaXB0b3JfcHJvdG8pCi0gICAgcmVmb3JtZWRfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3IuTWFrZURlc2NyaXB0b3IoZGVzY3JpcHRvcl9wcm90bykKLQotICAgIG9wdGlvbnMgPSByZWZvcm1lZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAxLAotICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnMuRXh0ZW5zaW9uc1t1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIubXNnb3B0XS5pKQotCi0gIGRlZiB0ZXN0Q2FtZWxjYXNlTmFtZShzZWxmKToKLSAgICBkZXNjcmlwdG9yX3Byb3RvID0gZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvKCkKLSAgICBkZXNjcmlwdG9yX3Byb3RvLm5hbWUgPSAnQmFyJwotICAgIG5hbWVzID0gWydmb29fZm9vJywgJ0Zvb0JhcicsICdmb29CYXonLCAnZm9vRm9vJywgJ2Zvb2JhciddCi0gICAgY2FtZWxjYXNlX25hbWVzID0gWydmb29Gb28nLCAnZm9vQmFyJywgJ2Zvb0JheicsICdmb29Gb28nLCAnZm9vYmFyJ10KLSAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKG5hbWVzKSk6Ci0gICAgICBmaWVsZCA9IGRlc2NyaXB0b3JfcHJvdG8uZmllbGQuYWRkKCkKLSAgICAgIGZpZWxkLm51bWJlciA9IGluZGV4ICsgMQotICAgICAgZmllbGQubmFtZSA9IG5hbWVzW2luZGV4XQotICAgIHJlc3VsdCA9IGRlc2NyaXB0b3IuTWFrZURlc2NyaXB0b3IoZGVzY3JpcHRvcl9wcm90bykKLSAgICBmb3IgaW5kZXggaW4gcmFuZ2UobGVuKGNhbWVsY2FzZV9uYW1lcykpOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChyZXN1bHQuZmllbGRzW2luZGV4XS5jYW1lbGNhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY2FtZWxjYXNlX25hbWVzW2luZGV4XSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2Rlci5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2Rlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNDhlZjJkZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VuY29kZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw4MjMgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJDb2RlIGZvciBlbmNvZGluZyBwcm90b2NvbCBtZXNzYWdlIHByaW1pdGl2ZXMuCi0KLUNvbnRhaW5zIHRoZSBsb2dpYyBmb3IgZW5jb2RpbmcgZXZlcnkgbG9naWNhbCBwcm90b2NvbCBmaWVsZCB0eXBlCi1pbnRvIG9uZSBvZiB0aGUgNSBwaHlzaWNhbCB3aXJlIHR5cGVzLgotCi1UaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gcHVzaCB0aGUgUHl0aG9uIGludGVycHJldGVyJ3MgcGVyZm9ybWFuY2UgdG8gdGhlCi1saW1pdHMuCi0KLVRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgYXQgc3RhcnR1cCB0aW1lLCBmb3IgZXZlcnkgZmllbGQgKGkuZS4gZXZlcnkKLUZpZWxkRGVzY3JpcHRvcikgd2UgY29uc3RydWN0IHR3byBmdW5jdGlvbnM6ICBhICJzaXplciIgYW5kIGFuICJlbmNvZGVyIi4gIFRoZQotc2l6ZXIgdGFrZXMgYSB2YWx1ZSBvZiB0aGlzIGZpZWxkJ3MgdHlwZSBhbmQgY29tcHV0ZXMgaXRzIGJ5dGUgc2l6ZS4gIFRoZQotZW5jb2RlciB0YWtlcyBhIHdyaXRlciBmdW5jdGlvbiBhbmQgYSB2YWx1ZS4gIEl0IGVuY29kZXMgdGhlIHZhbHVlIGludG8gYnl0ZQotc3RyaW5ncyBhbmQgaW52b2tlcyB0aGUgd3JpdGVyIGZ1bmN0aW9uIHRvIHdyaXRlIHRob3NlIHN0cmluZ3MuICBUeXBpY2FsbHkgdGhlCi13cml0ZXIgZnVuY3Rpb24gaXMgdGhlIHdyaXRlKCkgbWV0aG9kIG9mIGEgQnl0ZXNJTy4KLQotV2UgdHJ5IHRvIGRvIGFzIG11Y2ggd29yayBhcyBwb3NzaWJsZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUgd3JpdGVyIGFuZCB0aGUKLXNpemVyIHJhdGhlciB0aGFuIHdoZW4gY2FsbGluZyB0aGVtLiAgSW4gcGFydGljdWxhcjoKLSogV2UgY29weSBhbnkgbmVlZGVkIGdsb2JhbCBmdW5jdGlvbnMgdG8gbG9jYWwgdmFyaWFibGVzLCBzbyB0aGF0IHdlIGRvIG5vdCBuZWVkCi0gIHRvIGRvIGNvc3RseSBnbG9iYWwgdGFibGUgbG9va3VwcyBhdCBydW50aW1lLgotKiBTaW1pbGFybHksIHdlIHRyeSB0byBkbyBhbnkgYXR0cmlidXRlIGxvb2t1cHMgYXQgc3RhcnR1cCB0aW1lIGlmIHBvc3NpYmxlLgotKiBFdmVyeSBmaWVsZCdzIHRhZyBpcyBlbmNvZGVkIHRvIGJ5dGVzIGF0IHN0YXJ0dXAsIHNpbmNlIGl0IGNhbid0IGNoYW5nZSBhdAotICBydW50aW1lLgotKiBXaGF0ZXZlciBjb21wb25lbnQgb2YgdGhlIGZpZWxkIHNpemUgd2UgY2FuIGNvbXB1dGUgYXQgc3RhcnR1cCwgd2UgZG8uCi0qIFdlICphdm9pZCogc2hhcmluZyBjb2RlIGlmIGRvaW5nIHNvIHdvdWxkIG1ha2UgdGhlIGNvZGUgc2xvd2VyIGFuZCBub3Qgc2hhcmluZwotICBkb2VzIG5vdCBidXJkZW4gdXMgdG9vIG11Y2guICBGb3IgZXhhbXBsZSwgZW5jb2RlcnMgZm9yIHJlcGVhdGVkIGZpZWxkcyBkbwotICBub3QganVzdCBjYWxsIHRoZSBlbmNvZGVycyBmb3Igc2luZ3VsYXIgZmllbGRzIGluIGEgbG9vcCBiZWNhdXNlIHRoaXMgd291bGQKLSAgYWRkIGFuIGV4dHJhIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQgZm9yIGV2ZXJ5IGxvb3AgaXRlcmF0aW9uOyBpbnN0ZWFkLCB3ZQotICBtYW51YWxseSBpbmxpbmUgdGhlIHNpbmdsZS12YWx1ZSBlbmNvZGVyIGludG8gdGhlIGxvb3AuCi0qIElmIGEgUHl0aG9uIGZ1bmN0aW9uIGxhY2tzIGEgcmV0dXJuIHN0YXRlbWVudCwgUHl0aG9uIGFjdHVhbGx5IGdlbmVyYXRlcwotICBpbnN0cnVjdGlvbnMgdG8gcG9wIHRoZSByZXN1bHQgb2YgdGhlIGxhc3Qgc3RhdGVtZW50IG9mZiB0aGUgc3RhY2ssIHB1c2gKLSAgTm9uZSBvbnRvIHRoZSBzdGFjaywgYW5kIHRoZW4gcmV0dXJuIHRoYXQuICBJZiB3ZSByZWFsbHkgZG9uJ3QgY2FyZSB3aGF0Ci0gIHZhbHVlIGlzIHJldHVybmVkLCB0aGVuIHdlIGNhbiBzYXZlIHR3byBpbnN0cnVjdGlvbnMgYnkgcmV0dXJuaW5nIHRoZQotICByZXN1bHQgb2YgdGhlIGxhc3Qgc3RhdGVtZW50LiAgSXQgbG9va3MgZnVubnkgYnV0IGl0IGhlbHBzLgotKiBXZSBhc3N1bWUgdGhhdCB0eXBlIGFuZCBib3VuZHMgY2hlY2tpbmcgaGFzIGhhcHBlbmVkIGF0IGEgaGlnaGVyIGxldmVsLgotIiIiCi0KLV9fYXV0aG9yX18gPSAna2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSknCi0KLWltcG9ydCBzdHJ1Y3QKLQotaW1wb3J0IHNpeAotCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKLQotCi0jIFRoaXMgd2lsbCBvdmVyZmxvdyBhbmQgdGh1cyBiZWNvbWUgSUVFRS03NTQgImluZmluaXR5Ii4gIFdlIHdvdWxkIHVzZQotIyAiZmxvYXQoJ2luZicpIiBidXQgaXQgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MgcHJlLVB5dGhvbi0yLjYuCi1fUE9TX0lORiA9IDFlMTAwMDAKLV9ORUdfSU5GID0gLV9QT1NfSU5GCi0KLQotZGVmIF9WYXJpbnRTaXplKHZhbHVlKToKLSAgIiIiQ29tcHV0ZSB0aGUgc2l6ZSBvZiBhIHZhcmludCB2YWx1ZS4iIiIKLSAgaWYgdmFsdWUgPD0gMHg3ZjogcmV0dXJuIDEKLSAgaWYgdmFsdWUgPD0gMHgzZmZmOiByZXR1cm4gMgotICBpZiB2YWx1ZSA8PSAweDFmZmZmZjogcmV0dXJuIDMKLSAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmOiByZXR1cm4gNAotICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZjogcmV0dXJuIDUKLSAgaWYgdmFsdWUgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKLSAgaWYgdmFsdWUgPD0gMHgxZmZmZmZmZmZmZmZmOiByZXR1cm4gNwotICBpZiB2YWx1ZSA8PSAweGZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOAotICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5Ci0gIHJldHVybiAxMAotCi0KLWRlZiBfU2lnbmVkVmFyaW50U2l6ZSh2YWx1ZSk6Ci0gICIiIkNvbXB1dGUgdGhlIHNpemUgb2YgYSBzaWduZWQgdmFyaW50IHZhbHVlLiIiIgotICBpZiB2YWx1ZSA8IDA6IHJldHVybiAxMAotICBpZiB2YWx1ZSA8PSAweDdmOiByZXR1cm4gMQotICBpZiB2YWx1ZSA8PSAweDNmZmY6IHJldHVybiAyCi0gIGlmIHZhbHVlIDw9IDB4MWZmZmZmOiByZXR1cm4gMwotICBpZiB2YWx1ZSA8PSAweGZmZmZmZmY6IHJldHVybiA0Ci0gIGlmIHZhbHVlIDw9IDB4N2ZmZmZmZmZmOiByZXR1cm4gNQotICBpZiB2YWx1ZSA8PSAweDNmZmZmZmZmZmZmOiByZXR1cm4gNgotICBpZiB2YWx1ZSA8PSAweDFmZmZmZmZmZmZmZmY6IHJldHVybiA3Ci0gIGlmIHZhbHVlIDw9IDB4ZmZmZmZmZmZmZmZmZmY6IHJldHVybiA4Ci0gIGlmIHZhbHVlIDw9IDB4N2ZmZmZmZmZmZmZmZmZmZjogcmV0dXJuIDkKLSAgcmV0dXJuIDEwCi0KLQotZGVmIF9UYWdTaXplKGZpZWxkX251bWJlcik6Ci0gICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSB0YWcgd2l0aCB0aGlzIGZpZWxkCi0gIG51bWJlci4iIiIKLSAgIyBKdXN0IHBhc3MgaW4gdHlwZSAwLCBzaW5jZSB0aGUgdHlwZSB3b24ndCBhZmZlY3QgdGhlIHRhZyt0eXBlIHNpemUuCi0gIHJldHVybiBfVmFyaW50U2l6ZSh3aXJlX2Zvcm1hdC5QYWNrVGFnKGZpZWxkX251bWJlciwgMCkpCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBJbiB0aGlzIHNlY3Rpb24gd2UgZGVmaW5lIHNvbWUgZ2VuZXJpYyBzaXplcnMuICBFYWNoIG9mIHRoZXNlIGZ1bmN0aW9ucwotIyB0YWtlcyBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBmaWVsZCB0eXBlLCBlLmcuIGludDMyIG9yIGZpeGVkNjQuCi0jIEl0IHJldHVybnMgYW5vdGhlciBmdW5jdGlvbiB3aGljaCBpbiB0dXJuIHRha2VzIHBhcmFtZXRlcnMgc3BlY2lmaWMgdG8gYQotIyBwYXJ0aWN1bGFyIGZpZWxkLCBlLmcuIHRoZSBmaWVsZCBudW1iZXIgYW5kIHdoZXRoZXIgaXQgaXMgcmVwZWF0ZWQgb3IgcGFja2VkLgotIyBMb29rIGF0IHRoZSBuZXh0IHNlY3Rpb24gdG8gc2VlIGhvdyB0aGVzZSBhcmUgdXNlZC4KLQotCi1kZWYgX1NpbXBsZVNpemVyKGNvbXB1dGVfdmFsdWVfc2l6ZSk6Ci0gICIiIkEgc2l6ZXIgd2hpY2ggdXNlcyB0aGUgZnVuY3Rpb24gY29tcHV0ZV92YWx1ZV9zaXplIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YKLSAgZWFjaCB2YWx1ZS4gIFR5cGljYWxseSBjb21wdXRlX3ZhbHVlX3NpemUgaXMgX1ZhcmludFNpemUuIiIiCi0KLSAgZGVmIFNwZWNpZmljU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKLSAgICBpZiBpc19wYWNrZWQ6Ci0gICAgICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKLSAgICAgIGRlZiBQYWNrZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgICByZXN1bHQgPSAwCi0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUoZWxlbWVudCkKLSAgICAgICAgcmV0dXJuIHJlc3VsdCArIGxvY2FsX1ZhcmludFNpemUocmVzdWx0KSArIHRhZ19zaXplCi0gICAgICByZXR1cm4gUGFja2VkRmllbGRTaXplCi0gICAgZWxpZiBpc19yZXBlYXRlZDoKLSAgICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICByZXN1bHQgKz0gY29tcHV0ZV92YWx1ZV9zaXplKGVsZW1lbnQpCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQotICAgIGVsc2U6Ci0gICAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKLSAgICAgICAgcmV0dXJuIHRhZ19zaXplICsgY29tcHV0ZV92YWx1ZV9zaXplKHZhbHVlKQotICAgICAgcmV0dXJuIEZpZWxkU2l6ZQotCi0gIHJldHVybiBTcGVjaWZpY1NpemVyCi0KLQotZGVmIF9Nb2RpZmllZFNpemVyKGNvbXB1dGVfdmFsdWVfc2l6ZSwgbW9kaWZ5X3ZhbHVlKToKLSAgIiIiTGlrZSBTaW1wbGVTaXplciwgYnV0IG1vZGlmeV92YWx1ZSBpcyBpbnZva2VkIG9uIGVhY2ggdmFsdWUgYmVmb3JlIGl0IGlzCi0gIHBhc3NlZCB0byBjb21wdXRlX3ZhbHVlX3NpemUuICBtb2RpZnlfdmFsdWUgaXMgdHlwaWNhbGx5IFppZ1phZ0VuY29kZS4iIiIKLQotICBkZWYgU3BlY2lmaWNTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAgIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKQotICAgIGlmIGlzX3BhY2tlZDoKLSAgICAgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQotICAgICAgZGVmIFBhY2tlZEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICAgIHJlc3VsdCA9IDAKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgcmVzdWx0ICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShtb2RpZnlfdmFsdWUoZWxlbWVudCkpCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBsb2NhbF9WYXJpbnRTaXplKHJlc3VsdCkgKyB0YWdfc2l6ZQotICAgICAgcmV0dXJuIFBhY2tlZEZpZWxkU2l6ZQotICAgIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgcmVzdWx0ICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShtb2RpZnlfdmFsdWUoZWxlbWVudCkpCi0gICAgICAgIHJldHVybiByZXN1bHQKLSAgICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQotICAgIGVsc2U6Ci0gICAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKLSAgICAgICAgcmV0dXJuIHRhZ19zaXplICsgY29tcHV0ZV92YWx1ZV9zaXplKG1vZGlmeV92YWx1ZSh2YWx1ZSkpCi0gICAgICByZXR1cm4gRmllbGRTaXplCi0KLSAgcmV0dXJuIFNwZWNpZmljU2l6ZXIKLQotCi1kZWYgX0ZpeGVkU2l6ZXIodmFsdWVfc2l6ZSk6Ci0gICIiIkxpa2UgX1NpbXBsZVNpemVyIGV4Y2VwdCBmb3IgYSBmaXhlZC1zaXplIGZpZWxkLiAgVGhlIGlucHV0IGlzIHRoZSBzaXplCi0gIG9mIG9uZSB2YWx1ZS4iIiIKLQotICBkZWYgU3BlY2lmaWNTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAgIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKQotICAgIGlmIGlzX3BhY2tlZDoKLSAgICAgIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQotICAgICAgZGVmIFBhY2tlZEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICAgIHJlc3VsdCA9IGxlbih2YWx1ZSkgKiB2YWx1ZV9zaXplCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBsb2NhbF9WYXJpbnRTaXplKHJlc3VsdCkgKyB0YWdfc2l6ZQotICAgICAgcmV0dXJuIFBhY2tlZEZpZWxkU2l6ZQotICAgIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgICBlbGVtZW50X3NpemUgPSB2YWx1ZV9zaXplICsgdGFnX3NpemUKLSAgICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICAgIHJldHVybiBsZW4odmFsdWUpICogZWxlbWVudF9zaXplCi0gICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKLSAgICBlbHNlOgotICAgICAgZmllbGRfc2l6ZSA9IHZhbHVlX3NpemUgKyB0YWdfc2l6ZQotICAgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICAgIHJldHVybiBmaWVsZF9zaXplCi0gICAgICByZXR1cm4gRmllbGRTaXplCi0KLSAgcmV0dXJuIFNwZWNpZmljU2l6ZXIKLQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIEhlcmUgd2UgZGVjbGFyZSBhIHNpemVyIGNvbnN0cnVjdG9yIGZvciBlYWNoIGZpZWxkIHR5cGUuICBFYWNoICJzaXplcgotIyBjb25zdHJ1Y3RvciIgaXMgYSBmdW5jdGlvbiB0aGF0IHRha2VzIChmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpCi0jIGFzIHBhcmFtZXRlcnMgYW5kIHJldHVybnMgYSBzaXplciwgd2hpY2ggaW4gdHVybiB0YWtlcyBhIGZpZWxkIHZhbHVlIGFzCi0jIGEgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGl0cyBlbmNvZGVkIHNpemUuCi0KLQotSW50MzJTaXplciA9IEludDY0U2l6ZXIgPSBFbnVtU2l6ZXIgPSBfU2ltcGxlU2l6ZXIoX1NpZ25lZFZhcmludFNpemUpCi0KLVVJbnQzMlNpemVyID0gVUludDY0U2l6ZXIgPSBfU2ltcGxlU2l6ZXIoX1ZhcmludFNpemUpCi0KLVNJbnQzMlNpemVyID0gU0ludDY0U2l6ZXIgPSBfTW9kaWZpZWRTaXplcigKLSAgICBfU2lnbmVkVmFyaW50U2l6ZSwgd2lyZV9mb3JtYXQuWmlnWmFnRW5jb2RlKQotCi1GaXhlZDMyU2l6ZXIgPSBTRml4ZWQzMlNpemVyID0gRmxvYXRTaXplciAgPSBfRml4ZWRTaXplcig0KQotRml4ZWQ2NFNpemVyID0gU0ZpeGVkNjRTaXplciA9IERvdWJsZVNpemVyID0gX0ZpeGVkU2l6ZXIoOCkKLQotQm9vbFNpemVyID0gX0ZpeGVkU2l6ZXIoMSkKLQotCi1kZWYgU3RyaW5nU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgIiIiUmV0dXJucyBhIHNpemVyIGZvciBhIHN0cmluZyBmaWVsZC4iIiIKLQotICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKLSAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCi0gIGxvY2FsX2xlbiA9IGxlbgotICBhc3NlcnQgbm90IGlzX3BhY2tlZAotICBpZiBpc19yZXBlYXRlZDoKLSAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCi0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgbCA9IGxvY2FsX2xlbihlbGVtZW50LmVuY29kZSgndXRmLTgnKSkKLSAgICAgICAgcmVzdWx0ICs9IGxvY2FsX1ZhcmludFNpemUobCkgKyBsCi0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCi0gIGVsc2U6Ci0gICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICBsID0gbG9jYWxfbGVuKHZhbHVlLmVuY29kZSgndXRmLTgnKSkKLSAgICAgIHJldHVybiB0YWdfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCi0gICAgcmV0dXJuIEZpZWxkU2l6ZQotCi0KLWRlZiBCeXRlc1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICIiIlJldHVybnMgYSBzaXplciBmb3IgYSBieXRlcyBmaWVsZC4iIiIKLQotICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKLSAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCi0gIGxvY2FsX2xlbiA9IGxlbgotICBhc3NlcnQgbm90IGlzX3BhY2tlZAotICBpZiBpc19yZXBlYXRlZDoKLSAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCi0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgbCA9IGxvY2FsX2xlbihlbGVtZW50KQotICAgICAgICByZXN1bHQgKz0gbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKLSAgZWxzZToKLSAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKLSAgICAgIGwgPSBsb2NhbF9sZW4odmFsdWUpCi0gICAgICByZXR1cm4gdGFnX3NpemUgKyBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAotICAgIHJldHVybiBGaWVsZFNpemUKLQotCi1kZWYgR3JvdXBTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgZ3JvdXAgZmllbGQuIiIiCi0KLSAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpICogMgotICBhc3NlcnQgbm90IGlzX3BhY2tlZAotICBpZiBpc19yZXBlYXRlZDoKLSAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCi0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgcmVzdWx0ICs9IGVsZW1lbnQuQnl0ZVNpemUoKQotICAgICAgcmV0dXJuIHJlc3VsdAotICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQotICBlbHNlOgotICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgotICAgICAgcmV0dXJuIHRhZ19zaXplICsgdmFsdWUuQnl0ZVNpemUoKQotICAgIHJldHVybiBGaWVsZFNpemUKLQotCi1kZWYgTWVzc2FnZVNpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICIiIlJldHVybnMgYSBzaXplciBmb3IgYSBtZXNzYWdlIGZpZWxkLiIiIgotCi0gIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKQotICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKLSAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIGwgPSBlbGVtZW50LkJ5dGVTaXplKCkKLSAgICAgICAgcmVzdWx0ICs9IGxvY2FsX1ZhcmludFNpemUobCkgKyBsCi0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCi0gIGVsc2U6Ci0gICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICBsID0gdmFsdWUuQnl0ZVNpemUoKQotICAgICAgcmV0dXJuIHRhZ19zaXplICsgbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKLSAgICByZXR1cm4gRmllbGRTaXplCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBNZXNzYWdlU2V0IGlzIHNwZWNpYWw6IGl0IG5lZWRzIGN1c3RvbSBsb2dpYyB0byBjb21wdXRlIGl0cyBzaXplIHByb3Blcmx5LgotCi0KLWRlZiBNZXNzYWdlU2V0SXRlbVNpemVyKGZpZWxkX251bWJlcik6Ci0gICIiIlJldHVybnMgYSBzaXplciBmb3IgZXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0LgotCi0gIFRoZSBtZXNzYWdlIHNldCBtZXNzYWdlIGxvb2tzIGxpa2UgdGhpczoKLSAgICBtZXNzYWdlIE1lc3NhZ2VTZXQgewotICAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgewotICAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKLSAgICAgICAgcmVxdWlyZWQgc3RyaW5nIG1lc3NhZ2UgPSAzOwotICAgICAgfQotICAgIH0KLSAgIiIiCi0gIHN0YXRpY19zaXplID0gKF9UYWdTaXplKDEpICogMiArIF9UYWdTaXplKDIpICsgX1ZhcmludFNpemUoZmllbGRfbnVtYmVyKSArCi0gICAgICAgICAgICAgICAgIF9UYWdTaXplKDMpKQotICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKLQotICBkZWYgRmllbGRTaXplKHZhbHVlKToKLSAgICBsID0gdmFsdWUuQnl0ZVNpemUoKQotICAgIHJldHVybiBzdGF0aWNfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCi0KLSAgcmV0dXJuIEZpZWxkU2l6ZQotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTWFwIGlzIHNwZWNpYWw6IGl0IG5lZWRzIGN1c3RvbSBsb2dpYyB0byBjb21wdXRlIGl0cyBzaXplIHByb3Blcmx5LgotCi0KLWRlZiBNYXBTaXplcihmaWVsZF9kZXNjcmlwdG9yKToKLSAgIiIiUmV0dXJucyBhIHNpemVyIGZvciBhIG1hcCBmaWVsZC4iIiIKLQotICAjIENhbid0IGxvb2sgYXQgZmllbGRfZGVzY3JpcHRvci5tZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzIGJlY2F1c2UgaXQgbWF5Ci0gICMgbm90IGhhdmUgYmVlbiBpbml0aWFsaXplZCB5ZXQuCi0gIG1lc3NhZ2VfdHlwZSA9IGZpZWxkX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlCi0gIG1lc3NhZ2Vfc2l6ZXIgPSBNZXNzYWdlU2l6ZXIoZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIEZhbHNlLCBGYWxzZSkKLQotICBkZWYgRmllbGRTaXplKG1hcF92YWx1ZSk6Ci0gICAgdG90YWwgPSAwCi0gICAgZm9yIGtleSBpbiBtYXBfdmFsdWU6Ci0gICAgICB2YWx1ZSA9IG1hcF92YWx1ZVtrZXldCi0gICAgICAjIEl0J3Mgd2FzdGVmdWwgdG8gY3JlYXRlIHRoZSBtZXNzYWdlcyBhbmQgdGhyb3cgdGhlbSBhd2F5IG9uZSBzZWNvbmQKLSAgICAgICMgbGF0ZXIgc2luY2Ugd2UnbGwgZG8gdGhlIHNhbWUgZm9yIHRoZSBhY3R1YWwgZW5jb2RlLiAgQnV0IHRoZXJlJ3Mgbm90IGFuCi0gICAgICAjIG9idmlvdXMgd2F5IHRvIGF2b2lkIHRoaXMgd2l0aGluIHRoZSBjdXJyZW50IGRlc2lnbiB3aXRob3V0IHRvbnMgb2YgY29kZQotICAgICAgIyBkdXBsaWNhdGlvbi4KLSAgICAgIGVudHJ5X21zZyA9IG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3Moa2V5PWtleSwgdmFsdWU9dmFsdWUpCi0gICAgICB0b3RhbCArPSBtZXNzYWdlX3NpemVyKGVudHJ5X21zZykKLSAgICByZXR1cm4gdG90YWwKLQotICByZXR1cm4gRmllbGRTaXplCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRW5jb2RlcnMhCi0KLQotZGVmIF9WYXJpbnRFbmNvZGVyKCk6Ci0gICIiIlJldHVybiBhbiBlbmNvZGVyIGZvciBhIGJhc2ljIHZhcmludCB2YWx1ZSAoZG9lcyBub3QgaW5jbHVkZSB0YWcpLiIiIgotCi0gIGRlZiBFbmNvZGVWYXJpbnQod3JpdGUsIHZhbHVlKToKLSAgICBiaXRzID0gdmFsdWUgJiAweDdmCi0gICAgdmFsdWUgPj49IDcKLSAgICB3aGlsZSB2YWx1ZToKLSAgICAgIHdyaXRlKHNpeC5pbnQyYnl0ZSgweDgwfGJpdHMpKQotICAgICAgYml0cyA9IHZhbHVlICYgMHg3ZgotICAgICAgdmFsdWUgPj49IDcKLSAgICByZXR1cm4gd3JpdGUoc2l4LmludDJieXRlKGJpdHMpKQotCi0gIHJldHVybiBFbmNvZGVWYXJpbnQKLQotCi1kZWYgX1NpZ25lZFZhcmludEVuY29kZXIoKToKLSAgIiIiUmV0dXJuIGFuIGVuY29kZXIgZm9yIGEgYmFzaWMgc2lnbmVkIHZhcmludCB2YWx1ZSAoZG9lcyBub3QgaW5jbHVkZQotICB0YWcpLiIiIgotCi0gIGRlZiBFbmNvZGVTaWduZWRWYXJpbnQod3JpdGUsIHZhbHVlKToKLSAgICBpZiB2YWx1ZSA8IDA6Ci0gICAgICB2YWx1ZSArPSAoMSA8PCA2NCkKLSAgICBiaXRzID0gdmFsdWUgJiAweDdmCi0gICAgdmFsdWUgPj49IDcKLSAgICB3aGlsZSB2YWx1ZToKLSAgICAgIHdyaXRlKHNpeC5pbnQyYnl0ZSgweDgwfGJpdHMpKQotICAgICAgYml0cyA9IHZhbHVlICYgMHg3ZgotICAgICAgdmFsdWUgPj49IDcKLSAgICByZXR1cm4gd3JpdGUoc2l4LmludDJieXRlKGJpdHMpKQotCi0gIHJldHVybiBFbmNvZGVTaWduZWRWYXJpbnQKLQotCi1fRW5jb2RlVmFyaW50ID0gX1ZhcmludEVuY29kZXIoKQotX0VuY29kZVNpZ25lZFZhcmludCA9IF9TaWduZWRWYXJpbnRFbmNvZGVyKCkKLQotCi1kZWYgX1ZhcmludEJ5dGVzKHZhbHVlKToKLSAgIiIiRW5jb2RlIHRoZSBnaXZlbiBpbnRlZ2VyIGFzIGEgdmFyaW50IGFuZCByZXR1cm4gdGhlIGJ5dGVzLiAgVGhpcyBpcyBvbmx5Ci0gIGNhbGxlZCBhdCBzdGFydHVwIHRpbWUgc28gaXQgZG9lc24ndCBuZWVkIHRvIGJlIGZhc3QuIiIiCi0KLSAgcGllY2VzID0gW10KLSAgX0VuY29kZVZhcmludChwaWVjZXMuYXBwZW5kLCB2YWx1ZSkKLSAgcmV0dXJuIGIiIi5qb2luKHBpZWNlcykKLQotCi1kZWYgVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpOgotICAiIiJFbmNvZGUgdGhlIGdpdmVuIHRhZyBhbmQgcmV0dXJuIHRoZSBieXRlcy4gIE9ubHkgY2FsbGVkIGF0IHN0YXJ0dXAuIiIiCi0KLSAgcmV0dXJuIF9WYXJpbnRCeXRlcyh3aXJlX2Zvcm1hdC5QYWNrVGFnKGZpZWxkX251bWJlciwgd2lyZV90eXBlKSkKLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBcyB3aXRoIHNpemVycyAoc2VlIGFib3ZlKSwgd2UgaGF2ZSBhIG51bWJlciBvZiBjb21tb24gZW5jb2RlcgotIyBpbXBsZW1lbnRhdGlvbnMuCi0KLQotZGVmIF9TaW1wbGVFbmNvZGVyKHdpcmVfdHlwZSwgZW5jb2RlX3ZhbHVlLCBjb21wdXRlX3ZhbHVlX3NpemUpOgotICAiIiJSZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYW4gZW5jb2RlciBmb3IgZmllbGRzIG9mIGEgcGFydGljdWxhciB0eXBlLgotCi0gIEFyZ3M6Ci0gICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUsIGZvciBlbmNvZGluZyB0YWdzLgotICAgICAgZW5jb2RlX3ZhbHVlOiAgQSBmdW5jdGlvbiB3aGljaCBlbmNvZGVzIGFuIGluZGl2aWR1YWwgdmFsdWUsIGUuZy4KLSAgICAgICAgX0VuY29kZVZhcmludCgpLgotICAgICAgY29tcHV0ZV92YWx1ZV9zaXplOiAgQSBmdW5jdGlvbiB3aGljaCBjb21wdXRlcyB0aGUgc2l6ZSBvZiBhbiBpbmRpdmlkdWFsCi0gICAgICAgIHZhbHVlLCBlLmcuIF9WYXJpbnRTaXplKCkuCi0gICIiIgotCi0gIGRlZiBTcGVjaWZpY0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgICBpZiBpc19wYWNrZWQ6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gICAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50Ci0gICAgICBkZWYgRW5jb2RlUGFja2VkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICBzaXplID0gMAotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICBzaXplICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShlbGVtZW50KQotICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIHNpemUpCi0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIGVuY29kZV92YWx1ZSh3cml0ZSwgZWxlbWVudCkKLSAgICAgIHJldHVybiBFbmNvZGVQYWNrZWRGaWVsZAotICAgIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgICBlbmNvZGVfdmFsdWUod3JpdGUsIGVsZW1lbnQpCi0gICAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAotICAgIGVsc2U6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICAgIHJldHVybiBlbmNvZGVfdmFsdWUod3JpdGUsIHZhbHVlKQotICAgICAgcmV0dXJuIEVuY29kZUZpZWxkCi0KLSAgcmV0dXJuIFNwZWNpZmljRW5jb2RlcgotCi0KLWRlZiBfTW9kaWZpZWRFbmNvZGVyKHdpcmVfdHlwZSwgZW5jb2RlX3ZhbHVlLCBjb21wdXRlX3ZhbHVlX3NpemUsIG1vZGlmeV92YWx1ZSk6Ci0gICIiIkxpa2UgU2ltcGxlRW5jb2RlciBidXQgYWRkaXRpb25hbGx5IGludm9rZXMgbW9kaWZ5X3ZhbHVlIG9uIGV2ZXJ5IHZhbHVlCi0gIGJlZm9yZSBwYXNzaW5nIGl0IHRvIGVuY29kZV92YWx1ZS4gIFVzdWFsbHkgbW9kaWZ5X3ZhbHVlIGlzIFppZ1phZ0VuY29kZS4iIiIKLQotICBkZWYgU3BlY2lmaWNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICAgaWYgaXNfcGFja2VkOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotICAgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgc2l6ZSA9IDAKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgc2l6ZSArPSBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQotICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIHNpemUpCi0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIGVuY29kZV92YWx1ZSh3cml0ZSwgbW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQotICAgICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCi0gICAgZWxpZiBpc19yZXBlYXRlZDoKLSAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQotICAgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICAgIGVuY29kZV92YWx1ZSh3cml0ZSwgbW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQotICAgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgICBlbHNlOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICByZXR1cm4gZW5jb2RlX3ZhbHVlKHdyaXRlLCBtb2RpZnlfdmFsdWUodmFsdWUpKQotICAgICAgcmV0dXJuIEVuY29kZUZpZWxkCi0KLSAgcmV0dXJuIFNwZWNpZmljRW5jb2RlcgotCi0KLWRlZiBfU3RydWN0UGFja0VuY29kZXIod2lyZV90eXBlLCBmb3JtYXQpOgotICAiIiJSZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYW4gZW5jb2RlciBmb3IgYSBmaXhlZC13aWR0aCBmaWVsZC4KLQotICBBcmdzOgotICAgICAgd2lyZV90eXBlOiAgVGhlIGZpZWxkJ3Mgd2lyZSB0eXBlLCBmb3IgZW5jb2RpbmcgdGFncy4KLSAgICAgIGZvcm1hdDogIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHBhc3MgdG8gc3RydWN0LnBhY2soKS4KLSAgIiIiCi0KLSAgdmFsdWVfc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShmb3JtYXQpCi0KLSAgZGVmIFNwZWNpZmljRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAgIGxvY2FsX3N0cnVjdF9wYWNrID0gc3RydWN0LnBhY2sKLSAgICBpZiBpc19wYWNrZWQ6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gICAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50Ci0gICAgICBkZWYgRW5jb2RlUGFja2VkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxlbih2YWx1ZSkgKiB2YWx1ZV9zaXplKQotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIGVsZW1lbnQpKQotICAgICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCi0gICAgZWxpZiBpc19yZXBlYXRlZDoKLSAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQotICAgICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgZWxlbWVudCkpCi0gICAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAotICAgIGVsc2U6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICAgIHJldHVybiB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIHZhbHVlKSkKLSAgICAgIHJldHVybiBFbmNvZGVGaWVsZAotCi0gIHJldHVybiBTcGVjaWZpY0VuY29kZXIKLQotCi1kZWYgX0Zsb2F0aW5nUG9pbnRFbmNvZGVyKHdpcmVfdHlwZSwgZm9ybWF0KToKLSAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGFuIGVuY29kZXIgZm9yIGZsb2F0IGZpZWxkcy4KLQotICBUaGlzIGlzIGxpa2UgU3RydWN0UGFja0VuY29kZXIsIGJ1dCBjYXRjaGVzIGVycm9ycyB0aGF0IG1heSBiZSBkdWUgdG8KLSAgcGFzc2luZyBub24tZmluaXRlIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB0byBzdHJ1Y3QucGFjaywgYW5kIG1ha2VzIGEKLSAgc2Vjb25kIGF0dGVtcHQgdG8gZW5jb2RlIHRob3NlIHZhbHVlcy4KLQotICBBcmdzOgotICAgICAgd2lyZV90eXBlOiAgVGhlIGZpZWxkJ3Mgd2lyZSB0eXBlLCBmb3IgZW5jb2RpbmcgdGFncy4KLSAgICAgIGZvcm1hdDogIFRoZSBmb3JtYXQgc3RyaW5nIHRvIHBhc3MgdG8gc3RydWN0LnBhY2soKS4KLSAgIiIiCi0KLSAgdmFsdWVfc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShmb3JtYXQpCi0gIGlmIHZhbHVlX3NpemUgPT0gNDoKLSAgICBkZWYgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgdmFsdWUpOgotICAgICAgIyBSZW1lbWJlciB0aGF0IHRoZSBzZXJpYWxpemVkIGZvcm0gdXNlcyBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuCi0gICAgICBpZiB2YWx1ZSA9PSBfUE9TX0lORjoKLSAgICAgICAgd3JpdGUoYidceDAwXHgwMFx4ODBceDdGJykKLSAgICAgIGVsaWYgdmFsdWUgPT0gX05FR19JTkY6Ci0gICAgICAgIHdyaXRlKGInXHgwMFx4MDBceDgwXHhGRicpCi0gICAgICBlbGlmIHZhbHVlICE9IHZhbHVlOiAgICAgICAgICAgIyBOYU4KLSAgICAgICAgd3JpdGUoYidceDAwXHgwMFx4QzBceDdGJykKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlCi0gIGVsaWYgdmFsdWVfc2l6ZSA9PSA4OgotICAgIGRlZiBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICBpZiB2YWx1ZSA9PSBfUE9TX0lORjoKLSAgICAgICAgd3JpdGUoYidceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHg3RicpCi0gICAgICBlbGlmIHZhbHVlID09IF9ORUdfSU5GOgotICAgICAgICB3cml0ZShiJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceEZGJykKLSAgICAgIGVsaWYgdmFsdWUgIT0gdmFsdWU6ICAgICAgICAgICAgICAgICAgICAgICAgICMgTmFOCi0gICAgICAgIHdyaXRlKGInXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGOFx4N0YnKQotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UKLSAgZWxzZToKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdDYW5cJ3QgZW5jb2RlIGZsb2F0aW5nLXBvaW50IHZhbHVlcyB0aGF0IGFyZSAnCi0gICAgICAgICAgICAgICAgICAgICAnJWQgYnl0ZXMgbG9uZyAob25seSA0IG9yIDgpJyAlIHZhbHVlX3NpemUpCi0KLSAgZGVmIFNwZWNpZmljRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAgIGxvY2FsX3N0cnVjdF9wYWNrID0gc3RydWN0LnBhY2sKLSAgICBpZiBpc19wYWNrZWQ6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gICAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50Ci0gICAgICBkZWYgRW5jb2RlUGFja2VkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxlbih2YWx1ZSkgKiB2YWx1ZV9zaXplKQotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICAjIFRoaXMgdHJ5L2V4Y2VwdCBibG9jayBpcyBnb2luZyB0byBiZSBmYXN0ZXIgdGhhbiBhbnkgY29kZSB0aGF0Ci0gICAgICAgICAgIyB3ZSBjb3VsZCB3cml0ZSB0byBjaGVjayB3aGV0aGVyIGVsZW1lbnQgaXMgZmluaXRlLgotICAgICAgICAgIHRyeToKLSAgICAgICAgICAgIHdyaXRlKGxvY2FsX3N0cnVjdF9wYWNrKGZvcm1hdCwgZWxlbWVudCkpCi0gICAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOgotICAgICAgICAgICAgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgZWxlbWVudCkKLSAgICAgIHJldHVybiBFbmNvZGVQYWNrZWRGaWVsZAotICAgIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIGVsZW1lbnQpKQotICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKLSAgICAgICAgICAgIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIGVsZW1lbnQpCi0gICAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAotICAgIGVsc2U6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICAgIHRyeToKLSAgICAgICAgICB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIHZhbHVlKSkKLSAgICAgICAgZXhjZXB0IFN5c3RlbUVycm9yOgotICAgICAgICAgIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIHZhbHVlKQotICAgICAgcmV0dXJuIEVuY29kZUZpZWxkCi0KLSAgcmV0dXJuIFNwZWNpZmljRW5jb2RlcgotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgSGVyZSB3ZSBkZWNsYXJlIGFuIGVuY29kZXIgY29uc3RydWN0b3IgZm9yIGVhY2ggZmllbGQgdHlwZS4gIFRoZXNlIHdvcmsKLSMgdmVyeSBzaW1pbGFybHkgdG8gc2l6ZXIgY29uc3RydWN0b3JzLCBkZXNjcmliZWQgZWFybGllci4KLQotCi1JbnQzMkVuY29kZXIgPSBJbnQ2NEVuY29kZXIgPSBFbnVtRW5jb2RlciA9IF9TaW1wbGVFbmNvZGVyKAotICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0VuY29kZVNpZ25lZFZhcmludCwgX1NpZ25lZFZhcmludFNpemUpCi0KLVVJbnQzMkVuY29kZXIgPSBVSW50NjRFbmNvZGVyID0gX1NpbXBsZUVuY29kZXIoCi0gICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRW5jb2RlVmFyaW50LCBfVmFyaW50U2l6ZSkKLQotU0ludDMyRW5jb2RlciA9IFNJbnQ2NEVuY29kZXIgPSBfTW9kaWZpZWRFbmNvZGVyKAotICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0VuY29kZVZhcmludCwgX1ZhcmludFNpemUsCi0gICAgd2lyZV9mb3JtYXQuWmlnWmFnRW5jb2RlKQotCi0jIE5vdGUgdGhhdCBQeXRob24gY29udmVuaWVudGx5IGd1YXJhbnRlZXMgdGhhdCB3aGVuIHVzaW5nIHRoZSAnPCcgcHJlZml4IG9uCi0jIGZvcm1hdHMsIHRoZXkgd2lsbCBhbHNvIGhhdmUgdGhlIHNhbWUgc2l6ZSBhY3Jvc3MgYWxsIHBsYXRmb3JtcyAoYXMgb3Bwb3NlZAotIyB0byB3aXRob3V0IHRoZSBwcmVmaXgsIHdoZXJlIHRoZWlyIHNpemVzIGRlcGVuZCBvbiB0aGUgQyBjb21waWxlcidzIGJhc2ljCi0jIHR5cGUgc2l6ZXMpLgotRml4ZWQzMkVuY29kZXIgID0gX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8SScpCi1GaXhlZDY0RW5jb2RlciAgPSBfU3RydWN0UGFja0VuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxRJykKLVNGaXhlZDMyRW5jb2RlciA9IF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPGknKQotU0ZpeGVkNjRFbmNvZGVyID0gX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8cScpCi1GbG9hdEVuY29kZXIgICAgPSBfRmxvYXRpbmdQb2ludEVuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxmJykKLURvdWJsZUVuY29kZXIgICA9IF9GbG9hdGluZ1BvaW50RW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPGQnKQotCi0KLWRlZiBCb29sRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAiIiJSZXR1cm5zIGFuIGVuY29kZXIgZm9yIGEgYm9vbGVhbiBmaWVsZC4iIiIKLQotICBmYWxzZV9ieXRlID0gYidceDAwJwotICB0cnVlX2J5dGUgPSBiJ1x4MDEnCi0gIGlmIGlzX3BhY2tlZDoKLSAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsZW4odmFsdWUpKQotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIGlmIGVsZW1lbnQ6Ci0gICAgICAgICAgd3JpdGUodHJ1ZV9ieXRlKQotICAgICAgICBlbHNlOgotICAgICAgICAgIHdyaXRlKGZhbHNlX2J5dGUpCi0gICAgcmV0dXJuIEVuY29kZVBhY2tlZEZpZWxkCi0gIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpCi0gICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICAgIGlmIGVsZW1lbnQ6Ci0gICAgICAgICAgd3JpdGUodHJ1ZV9ieXRlKQotICAgICAgICBlbHNlOgotICAgICAgICAgIHdyaXRlKGZhbHNlX2J5dGUpCi0gICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKLSAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgIGlmIHZhbHVlOgotICAgICAgICByZXR1cm4gd3JpdGUodHJ1ZV9ieXRlKQotICAgICAgcmV0dXJuIHdyaXRlKGZhbHNlX2J5dGUpCi0gICAgcmV0dXJuIEVuY29kZUZpZWxkCi0KLQotZGVmIFN0cmluZ0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIHN0cmluZyBmaWVsZC4iIiIKLQotICB0YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKLSAgbG9jYWxfbGVuID0gbGVuCi0gIGFzc2VydCBub3QgaXNfcGFja2VkCi0gIGlmIGlzX3JlcGVhdGVkOgotICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgZW5jb2RlZCA9IGVsZW1lbnQuZW5jb2RlKCd1dGYtOCcpCi0gICAgICAgIHdyaXRlKHRhZykKLSAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4oZW5jb2RlZCkpCi0gICAgICAgIHdyaXRlKGVuY29kZWQpCi0gICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgIGVuY29kZWQgPSB2YWx1ZS5lbmNvZGUoJ3V0Zi04JykKLSAgICAgIHdyaXRlKHRhZykKLSAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbG9jYWxfbGVuKGVuY29kZWQpKQotICAgICAgcmV0dXJuIHdyaXRlKGVuY29kZWQpCi0gICAgcmV0dXJuIEVuY29kZUZpZWxkCi0KLQotZGVmIEJ5dGVzRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAiIiJSZXR1cm5zIGFuIGVuY29kZXIgZm9yIGEgYnl0ZXMgZmllbGQuIiIiCi0KLSAgdGFnID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50Ci0gIGxvY2FsX2xlbiA9IGxlbgotICBhc3NlcnQgbm90IGlzX3BhY2tlZAotICBpZiBpc19yZXBlYXRlZDoKLSAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIHdyaXRlKHRhZykKLSAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4oZWxlbWVudCkpCi0gICAgICAgIHdyaXRlKGVsZW1lbnQpCi0gICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgIHdyaXRlKHRhZykKLSAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgbG9jYWxfbGVuKHZhbHVlKSkKLSAgICAgIHJldHVybiB3cml0ZSh2YWx1ZSkKLSAgICByZXR1cm4gRW5jb2RlRmllbGQKLQotCi1kZWYgR3JvdXBFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBncm91cCBmaWVsZC4iIiIKLQotICBzdGFydF90YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKQotICBlbmRfdGFnID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApCi0gIGFzc2VydCBub3QgaXNfcGFja2VkCi0gIGlmIGlzX3JlcGVhdGVkOgotICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgd3JpdGUoc3RhcnRfdGFnKQotICAgICAgICBlbGVtZW50Ll9JbnRlcm5hbFNlcmlhbGl6ZSh3cml0ZSkKLSAgICAgICAgd3JpdGUoZW5kX3RhZykKLSAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAotICBlbHNlOgotICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgd3JpdGUoc3RhcnRfdGFnKQotICAgICAgdmFsdWUuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQotICAgICAgcmV0dXJuIHdyaXRlKGVuZF90YWcpCi0gICAgcmV0dXJuIEVuY29kZUZpZWxkCi0KLQotZGVmIE1lc3NhZ2VFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBtZXNzYWdlIGZpZWxkLiIiIgotCi0gIHRhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKLSAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotICBhc3NlcnQgbm90IGlzX3BhY2tlZAotICBpZiBpc19yZXBlYXRlZDoKLSAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIHdyaXRlKHRhZykKLSAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBlbGVtZW50LkJ5dGVTaXplKCkpCi0gICAgICAgIGVsZW1lbnQuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQotICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCi0gIGVsc2U6Ci0gICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICB3cml0ZSh0YWcpCi0gICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIHZhbHVlLkJ5dGVTaXplKCkpCi0gICAgICByZXR1cm4gdmFsdWUuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQotICAgIHJldHVybiBFbmNvZGVGaWVsZAotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXMgYmVmb3JlLCBNZXNzYWdlU2V0IGlzIHNwZWNpYWwuCi0KLQotZGVmIE1lc3NhZ2VTZXRJdGVtRW5jb2RlcihmaWVsZF9udW1iZXIpOgotICAiIiJFbmNvZGVyIGZvciBleHRlbnNpb25zIG9mIE1lc3NhZ2VTZXQuCi0KLSAgVGhlIG1lc3NhZ2Ugc2V0IG1lc3NhZ2UgbG9va3MgbGlrZSB0aGlzOgotICAgIG1lc3NhZ2UgTWVzc2FnZVNldCB7Ci0gICAgICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7Ci0gICAgICAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOwotICAgICAgICByZXF1aXJlZCBzdHJpbmcgbWVzc2FnZSA9IDM7Ci0gICAgICB9Ci0gICAgfQotICAiIiIKLSAgc3RhcnRfYnl0ZXMgPSBiIiIuam9pbihbCi0gICAgICBUYWdCeXRlcygxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCksCi0gICAgICBUYWdCeXRlcygyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLAotICAgICAgX1ZhcmludEJ5dGVzKGZpZWxkX251bWJlciksCi0gICAgICBUYWdCeXRlcygzLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKV0pCi0gIGVuZF9ieXRlcyA9IFRhZ0J5dGVzKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkKLSAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotCi0gIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgIHdyaXRlKHN0YXJ0X2J5dGVzKQotICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgdmFsdWUuQnl0ZVNpemUoKSkKLSAgICB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUpCi0gICAgcmV0dXJuIHdyaXRlKGVuZF9ieXRlcykKLQotICByZXR1cm4gRW5jb2RlRmllbGQKLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0jIEFzIGJlZm9yZSwgTWFwIGlzIHNwZWNpYWwuCi0KLQotZGVmIE1hcEVuY29kZXIoZmllbGRfZGVzY3JpcHRvcik6Ci0gICIiIkVuY29kZXIgZm9yIGV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldC4KLQotICBNYXBzIGFsd2F5cyBoYXZlIGEgd2lyZSBmb3JtYXQgbGlrZSB0aGlzOgotICAgIG1lc3NhZ2UgTWFwRW50cnkgewotICAgICAga2V5X3R5cGUga2V5ID0gMTsKLSAgICAgIHZhbHVlX3R5cGUgdmFsdWUgPSAyOwotICAgIH0KLSAgICByZXBlYXRlZCBNYXBFbnRyeSBtYXAgPSBOOwotICAiIiIKLSAgIyBDYW4ndCBsb29rIGF0IGZpZWxkX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcyBiZWNhdXNlIGl0IG1heQotICAjIG5vdCBoYXZlIGJlZW4gaW5pdGlhbGl6ZWQgeWV0LgotICBtZXNzYWdlX3R5cGUgPSBmaWVsZF9kZXNjcmlwdG9yLm1lc3NhZ2VfdHlwZQotICBlbmNvZGVfbWVzc2FnZSA9IE1lc3NhZ2VFbmNvZGVyKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLCBGYWxzZSwgRmFsc2UpCi0KLSAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgZm9yIGtleSBpbiB2YWx1ZToKLSAgICAgIGVudHJ5X21zZyA9IG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3Moa2V5PWtleSwgdmFsdWU9dmFsdWVba2V5XSkKLSAgICAgIGVuY29kZV9tZXNzYWdlKHdyaXRlLCBlbnRyeV9tc2cpCi0KLSAgcmV0dXJuIEVuY29kZUZpZWxkCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9lbnVtX3R5cGVfd3JhcHBlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWNmZmUzNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsODkgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJBIHNpbXBsZSB3cmFwcGVyIGFyb3VuZCBlbnVtIHR5cGVzIHRvIGV4cG9zZSB1dGlsaXR5IGZ1bmN0aW9ucy4KLQotSW5zdGFuY2VzIGFyZSBjcmVhdGVkIGFzIHByb3BlcnRpZXMgd2l0aCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBlbnVtIHRoZXkgd3JhcAotb24gcHJvdG8gY2xhc3Nlcy4gIEZvciB1c2FnZSwgc2VlOgotICByZWZsZWN0aW9uX3Rlc3QucHkKLSIiIgotCi1fX2F1dGhvcl9fID0gJ3JhYnNhdHRAZ29vZ2xlLmNvbSAoS2V2aW4gUmFic2F0dCknCi0KLQotY2xhc3MgRW51bVR5cGVXcmFwcGVyKG9iamVjdCk6Ci0gICIiIkEgdXRpbGl0eSBmb3IgZmluZGluZyB0aGUgbmFtZXMgb2YgZW51bSB2YWx1ZXMuIiIiCi0KLSAgREVTQ1JJUFRPUiA9IE5vbmUKLQotICBkZWYgX19pbml0X18oc2VsZiwgZW51bV90eXBlKToKLSAgICAiIiJJbml0cyBFbnVtVHlwZVdyYXBwZXIgd2l0aCBhbiBFbnVtRGVzY3JpcHRvci4iIiIKLSAgICBzZWxmLl9lbnVtX3R5cGUgPSBlbnVtX3R5cGUKLSAgICBzZWxmLkRFU0NSSVBUT1IgPSBlbnVtX3R5cGU7Ci0KLSAgZGVmIE5hbWUoc2VsZiwgbnVtYmVyKToKLSAgICAiIiJSZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgYW4gZW51bSB2YWx1ZS4iIiIKLSAgICBpZiBudW1iZXIgaW4gc2VsZi5fZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXI6Ci0gICAgICByZXR1cm4gc2VsZi5fZW51bV90eXBlLnZhbHVlc19ieV9udW1iZXJbbnVtYmVyXS5uYW1lCi0gICAgcmFpc2UgVmFsdWVFcnJvcignRW51bSAlcyBoYXMgbm8gbmFtZSBkZWZpbmVkIGZvciB2YWx1ZSAlZCcgJSAoCi0gICAgICAgIHNlbGYuX2VudW1fdHlwZS5uYW1lLCBudW1iZXIpKQotCi0gIGRlZiBWYWx1ZShzZWxmLCBuYW1lKToKLSAgICAiIiJSZXR1cm5zIHRoZSB2YWx1ZSBjb3Jlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGVudW0gbmFtZS4iIiIKLSAgICBpZiBuYW1lIGluIHNlbGYuX2VudW1fdHlwZS52YWx1ZXNfYnlfbmFtZToKLSAgICAgIHJldHVybiBzZWxmLl9lbnVtX3R5cGUudmFsdWVzX2J5X25hbWVbbmFtZV0ubnVtYmVyCi0gICAgcmFpc2UgVmFsdWVFcnJvcignRW51bSAlcyBoYXMgbm8gdmFsdWUgZGVmaW5lZCBmb3IgbmFtZSAlcycgJSAoCi0gICAgICAgIHNlbGYuX2VudW1fdHlwZS5uYW1lLCBuYW1lKSkKLQotICBkZWYga2V5cyhzZWxmKToKLSAgICAiIiJSZXR1cm4gYSBsaXN0IG9mIHRoZSBzdHJpbmcgbmFtZXMgaW4gdGhlIGVudW0uCi0KLSAgICBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICAiIiIKLQotICAgIHJldHVybiBbdmFsdWVfZGVzY3JpcHRvci5uYW1lCi0gICAgICAgICAgICBmb3IgdmFsdWVfZGVzY3JpcHRvciBpbiBzZWxmLl9lbnVtX3R5cGUudmFsdWVzXQotCi0gIGRlZiB2YWx1ZXMoc2VsZik6Ci0gICAgIiIiUmV0dXJuIGEgbGlzdCBvZiB0aGUgaW50ZWdlciB2YWx1ZXMgaW4gdGhlIGVudW0uCi0KLSAgICBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICAiIiIKLQotICAgIHJldHVybiBbdmFsdWVfZGVzY3JpcHRvci5udW1iZXIKLSAgICAgICAgICAgIGZvciB2YWx1ZV9kZXNjcmlwdG9yIGluIHNlbGYuX2VudW1fdHlwZS52YWx1ZXNdCi0KLSAgZGVmIGl0ZW1zKHNlbGYpOgotICAgICIiIlJldHVybiBhIGxpc3Qgb2YgdGhlIChuYW1lLCB2YWx1ZSkgcGFpcnMgb2YgdGhlIGVudW0uCi0KLSAgICBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICAiIiIKLSAgICByZXR1cm4gWyh2YWx1ZV9kZXNjcmlwdG9yLm5hbWUsIHZhbHVlX2Rlc2NyaXB0b3IubnVtYmVyKQotICAgICAgICAgICAgZm9yIHZhbHVlX2Rlc2NyaXB0b3IgaW4gc2VsZi5fZW51bV90eXBlLnZhbHVlc10KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDJmYmJlZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDEucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWw7Ci0KLQotZW51bSBGYWN0b3J5MUVudW0gewotICBGQUNUT1JZXzFfVkFMVUVfMCA9IDA7Ci0gIEZBQ1RPUllfMV9WQUxVRV8xID0gMTsKLX0KLQotbWVzc2FnZSBGYWN0b3J5MU1lc3NhZ2UgewotICBvcHRpb25hbCBGYWN0b3J5MUVudW0gZmFjdG9yeV8xX2VudW0gPSAxOwotICBlbnVtIE5lc3RlZEZhY3RvcnkxRW51bSB7Ci0gICAgTkVTVEVEX0ZBQ1RPUllfMV9WQUxVRV8wID0gMDsKLSAgICBORVNURURfRkFDVE9SWV8xX1ZBTFVFXzEgPSAxOwotICB9Ci0gIG9wdGlvbmFsIE5lc3RlZEZhY3RvcnkxRW51bSBuZXN0ZWRfZmFjdG9yeV8xX2VudW0gPSAyOwotICBtZXNzYWdlIE5lc3RlZEZhY3RvcnkxTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgc3RyaW5nIHZhbHVlID0gMTsKLSAgfQotICBvcHRpb25hbCBOZXN0ZWRGYWN0b3J5MU1lc3NhZ2UgbmVzdGVkX2ZhY3RvcnlfMV9tZXNzYWdlID0gMzsKLSAgb3B0aW9uYWwgaW50MzIgc2NhbGFyX3ZhbHVlID0gNDsKLSAgcmVwZWF0ZWQgc3RyaW5nIGxpc3RfdmFsdWUgPSA1OwotCi0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJiMWI1NGEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QyLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsOTkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogbWF0dGhld3RvaWFAZ29vZ2xlLmNvbSAoTWF0dCBUb2lhKQotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9mYWN0b3J5X3Rlc3QxLnByb3RvIjsKLQotCi1lbnVtIEZhY3RvcnkyRW51bSB7Ci0gIEZBQ1RPUllfMl9WQUxVRV8wID0gMDsKLSAgRkFDVE9SWV8yX1ZBTFVFXzEgPSAxOwotfQotCi1tZXNzYWdlIEZhY3RvcnkyTWVzc2FnZSB7Ci0gIHJlcXVpcmVkIGludDMyIG1hbmRhdG9yeSA9IDE7Ci0gIG9wdGlvbmFsIEZhY3RvcnkyRW51bSBmYWN0b3J5XzJfZW51bSA9IDI7Ci0gIGVudW0gTmVzdGVkRmFjdG9yeTJFbnVtIHsKLSAgICBORVNURURfRkFDVE9SWV8yX1ZBTFVFXzAgPSAwOwotICAgIE5FU1RFRF9GQUNUT1JZXzJfVkFMVUVfMSA9IDE7Ci0gIH0KLSAgb3B0aW9uYWwgTmVzdGVkRmFjdG9yeTJFbnVtIG5lc3RlZF9mYWN0b3J5XzJfZW51bSA9IDM7Ci0gIG1lc3NhZ2UgTmVzdGVkRmFjdG9yeTJNZXNzYWdlIHsKLSAgICBvcHRpb25hbCBzdHJpbmcgdmFsdWUgPSAxOwotICB9Ci0gIG9wdGlvbmFsIE5lc3RlZEZhY3RvcnkyTWVzc2FnZSBuZXN0ZWRfZmFjdG9yeV8yX21lc3NhZ2UgPSA0OwotICBvcHRpb25hbCBGYWN0b3J5MU1lc3NhZ2UgZmFjdG9yeV8xX21lc3NhZ2UgPSA1OwotICBvcHRpb25hbCBGYWN0b3J5MUVudW0gZmFjdG9yeV8xX2VudW0gPSA2OwotICBvcHRpb25hbCBGYWN0b3J5MU1lc3NhZ2UuTmVzdGVkRmFjdG9yeTFFbnVtIG5lc3RlZF9mYWN0b3J5XzFfZW51bSA9IDc7Ci0gIG9wdGlvbmFsIEZhY3RvcnkxTWVzc2FnZS5OZXN0ZWRGYWN0b3J5MU1lc3NhZ2UgbmVzdGVkX2ZhY3RvcnlfMV9tZXNzYWdlID0gODsKLSAgb3B0aW9uYWwgRmFjdG9yeTJNZXNzYWdlIGNpcmN1bGFyX21lc3NhZ2UgPSA5OwotICBvcHRpb25hbCBzdHJpbmcgc2NhbGFyX3ZhbHVlID0gMTA7Ci0gIHJlcGVhdGVkIHN0cmluZyBsaXN0X3ZhbHVlID0gMTE7Ci0gIHJlcGVhdGVkIGdyb3VwIEdyb3VwZWQgPSAxMiB7Ci0gICAgb3B0aW9uYWwgc3RyaW5nIHBhcnRfMSA9IDEzOwotICAgIG9wdGlvbmFsIHN0cmluZyBwYXJ0XzIgPSAxNDsKLSAgfQotICBvcHRpb25hbCBMb29wTWVzc2FnZSBsb29wID0gMTU7Ci0gIG9wdGlvbmFsIGludDMyIGludF93aXRoX2RlZmF1bHQgPSAxNiBbZGVmYXVsdCA9IDE3NzZdOwotICBvcHRpb25hbCBkb3VibGUgZG91YmxlX3dpdGhfZGVmYXVsdCA9IDE3IFtkZWZhdWx0ID0gOS45OV07Ci0gIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfd2l0aF9kZWZhdWx0ID0gMTggW2RlZmF1bHQgPSAiaGVsbG8gd29ybGQiXTsKLSAgb3B0aW9uYWwgYm9vbCBib29sX3dpdGhfZGVmYXVsdCA9IDE5IFtkZWZhdWx0ID0gZmFsc2VdOwotICBvcHRpb25hbCBGYWN0b3J5MkVudW0gZW51bV93aXRoX2RlZmF1bHQgPSAyMCBbZGVmYXVsdCA9IEZBQ1RPUllfMl9WQUxVRV8xXTsKLSAgb3B0aW9uYWwgYnl0ZXMgYnl0ZXNfd2l0aF9kZWZhdWx0ID0gMjEgW2RlZmF1bHQgPSAiYVwzNzNcMDAwYyJdOwotCi0KLSAgZXh0ZW5kIEZhY3RvcnkxTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgc3RyaW5nIG9uZV9tb3JlX2ZpZWxkID0gMTAwMTsKLSAgfQotCi0gIG9uZW9mIG9uZW9mX2ZpZWxkIHsKLSAgICBpbnQzMiBvbmVvZl9pbnQgPSAyMjsKLSAgICBzdHJpbmcgb25lb2Zfc3RyaW5nID0gMjM7Ci0gIH0KLX0KLQotbWVzc2FnZSBMb29wTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIEZhY3RvcnkyTWVzc2FnZSBsb29wID0gMTsKLX0KLQotbWVzc2FnZSBNZXNzYWdlV2l0aE5lc3RlZEVudW1Pbmx5IHsKLSAgZW51bSBOZXN0ZWRFbnVtIHsKLSAgICBORVNURURfTUVTU0FHRV9FTlVNXzAgPSAwOwotICB9Ci19Ci0KLWV4dGVuZCBGYWN0b3J5MU1lc3NhZ2UgewotICBvcHRpb25hbCBzdHJpbmcgYW5vdGhlcl9maWVsZCA9IDEwMDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2dlbmVyYXRvcl90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODNlYTVmNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2dlbmVyYXRvcl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzQ4ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLSMKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIyBUT0RPKHJvYmluc29uKTogRmxlc2ggdGhpcyBvdXQgY29uc2lkZXJhYmx5LiAgV2UgZm9jdXNlZCBvbiByZWZsZWN0aW9uX3Rlc3QucHkKLSMgZmlyc3QsIHNpbmNlIGl0J3MgdGVzdGluZyB0aGUgc3VidGxlciBjb2RlLCBhbmQgc2luY2UgaXQgcHJvdmlkZXMgZGVjZW50Ci0jIGluZGlyZWN0IHRlc3Rpbmcgb2YgdGhlIHByb3RvY29sIGNvbXBpbGVyIG91dHB1dC4KLQotIiIiVW5pdHRlc3QgdGhhdCBkaXJlY3RseSB0ZXN0cyB0aGUgb3V0cHV0IG9mIHRoZSBwdXJlLVB5dGhvbiBwcm90b2NvbAotY29tcGlsZXIuICBTZWUgLy9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5IGZvciBhIHRlc3Qgd2hpY2gKLWZ1cnRoZXIgZW5zdXJlcyB0aGF0IHdlIGNhbiB1c2UgUHl0aG9uIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0cyBhcyB3ZSBleHBlY3QuCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfYmFkX2lkZW50aWZpZXJzX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X21zZXRfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzeW1ib2xfZGF0YWJhc2UKLQotTUFYX0VYVEVOU0lPTiA9IDUzNjg3MDkxMgotCi0KLWNsYXNzIEdlbmVyYXRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0TmVzdGVkTWVzc2FnZURlc2NyaXB0b3Ioc2VsZik6Ci0gICAgZmllbGRfbmFtZSA9ICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScKLSAgICBwcm90b190eXBlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHByb3RvX3R5cGUuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLAotICAgICAgICBwcm90b190eXBlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbZmllbGRfbmFtZV0ubWVzc2FnZV90eXBlKQotCi0gIGRlZiB0ZXN0RW51bXMoc2VsZik6Ci0gICAgIyBXZSB0ZXN0IG9ubHkgbW9kdWxlLWxldmVsIGVudW1zIGhlcmUuCi0gICAgIyBUT0RPKHJvYmluc29uKTogRXhhbWluZSBkZXNjcmlwdG9ycyBkaXJlY3RseSB0byBjaGVjawotICAgICMgZW51bSBkZXNjcmlwdG9yIG91dHB1dC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKLQotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5GT08pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJBUikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8uQkFaKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVopCi0KLSAgZGVmIHRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcygpCi0KLSAgICAjIFB5dGhvbiBwcmUtMi42IGRvZXMgbm90IGhhdmUgaXNpbmYoKSBvciBpc25hbigpIGZ1bmN0aW9ucywgc28gd2UgaGF2ZQotICAgICMgdG8gcHJvdmlkZSBvdXIgb3duLgotICAgIGRlZiBpc25hbih2YWwpOgotICAgICAgIyBOYU4gaXMgbmV2ZXIgZXF1YWwgdG8gaXRzZWxmLgotICAgICAgcmV0dXJuIHZhbCAhPSB2YWwKLSAgICBkZWYgaXNpbmYodmFsKToKLSAgICAgICMgSW5maW5pdHkgdGltZXMgemVybyBlcXVhbHMgTmFOLgotICAgICAgcmV0dXJuIG5vdCBpc25hbih2YWwpIGFuZCBpc25hbih2YWwgKiAwKQotCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UuaW5mX2RvdWJsZSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuaW5mX2RvdWJsZSA+IDApCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UubmVnX2luZl9kb3VibGUpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm5lZ19pbmZfZG91YmxlIDwgMCkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5uYW5fZG91YmxlKSkKLQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihtZXNzYWdlLmluZl9mbG9hdCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuaW5mX2Zsb2F0ID4gMCkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYobWVzc2FnZS5uZWdfaW5mX2Zsb2F0KSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5uZWdfaW5mX2Zsb2F0IDwgMCkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5uYW5fZmxvYXQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSIsIG1lc3NhZ2UuY3BwX3RyaWdyYXBoKQotCi0gIGRlZiB0ZXN0SGFzRGVmYXVsdFZhbHVlcyhzZWxmKToKLSAgICBkZXNjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SCi0KLSAgICBleHBlY3RlZF9oYXNfZGVmYXVsdF9ieV9uYW1lID0gewotICAgICAgICAnb3B0aW9uYWxfaW50MzInOiBGYWxzZSwKLSAgICAgICAgJ3JlcGVhdGVkX2ludDMyJzogRmFsc2UsCi0gICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSc6IEZhbHNlLAotICAgICAgICAnZGVmYXVsdF9pbnQzMic6IFRydWUsCi0gICAgfQotCi0gICAgaGFzX2RlZmF1bHRfYnlfbmFtZSA9IGRpY3QoCi0gICAgICAgIFsoZi5uYW1lLCBmLmhhc19kZWZhdWx0X3ZhbHVlKQotICAgICAgICAgZm9yIGYgaW4gZGVzYy5maWVsZHMKLSAgICAgICAgIGlmIGYubmFtZSBpbiBleHBlY3RlZF9oYXNfZGVmYXVsdF9ieV9uYW1lXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX2hhc19kZWZhdWx0X2J5X25hbWUsIGhhc19kZWZhdWx0X2J5X25hbWUpCi0KLSAgZGVmIHRlc3RDb250YWluaW5nVHlwZUJlaGF2aW9yRm9yRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24uY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5jb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMuREVTQ1JJUFRPUikKLQotICBkZWYgdGVzdEV4dGVuc2lvblNjb3BlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbi5leHRlbnNpb25fc2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICBOb25lKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUuZXh0ZW5zaW9uX3Njb3BlLAotICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5ERVNDUklQVE9SKQotCi0gIGRlZiB0ZXN0SXNFeHRlbnNpb24oc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24uaXNfZXh0ZW5zaW9uKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5pc19leHRlbnNpb24pCi0KLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLkRFU0NSSVBUT1IKLSAgICBub25fZXh0ZW5zaW9uX2Rlc2NyaXB0b3IgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbJ2EnXQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3Qgbm9uX2V4dGVuc2lvbl9kZXNjcmlwdG9yLmlzX2V4dGVuc2lvbikKLQotICBkZWYgdGVzdE9wdGlvbnMoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0X3BiMi5UZXN0TWVzc2FnZVNldCgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQotCi0gIGRlZiB0ZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnNfcGIyLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMoKQotICAgIGVudW1fb3B0aW9ucyA9IHByb3RvLkRFU0NSSVBUT1IuZW51bV90eXBlc19ieV9uYW1lWydBbkVudW0nXS5HZXRPcHRpb25zKCkKLSAgICBzZWxmLmFzc2VydFRydWUoZW51bV9vcHRpb25zIGlzIG5vdCBOb25lKQotICAgICMgVE9ETyhncHMpOiBXZSByZWFsbHkgc2hvdWxkIHRlc3QgZm9yIHRoZSBwcmVzZW5jZSBvZiB0aGUgZW51bV9vcHQxCi0gICAgIyBleHRlbnNpb24gYW5kIGZvciBpdHMgdmFsdWUgdG8gYmUgc2V0IHRvIC03ODkuCi0KLSAgZGVmIHRlc3ROZXN0ZWRUeXBlcyhzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBzZXQodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLm5lc3RlZF90eXBlcyksCi0gICAgICAgIHNldChbCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUiwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5ERVNDUklQVE9SLAotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLkRFU0NSSVBUT1IsCi0gICAgICAgIF0pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UuREVTQ1JJUFRPUi5uZXN0ZWRfdHlwZXMsIFtdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLm5lc3RlZF90eXBlcywgW10pCi0KLSAgZGVmIHRlc3RDb250YWluaW5nVHlwZShzZWxmKToKLSAgICBzZWxmLmFzc2VydFRydWUoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlIGlzIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRUcnVlKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlIGlzIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0KLSAgZGVmIHRlc3RDb250YWluaW5nVHlwZUluRW51bURlc2NyaXB0b3Ioc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0X3BiMi5fRk9SRUlHTkVOVU0uY29udGFpbmluZ190eXBlIGlzIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFU19ORVNURURFTlVNLmNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUikKLQotICBkZWYgdGVzdFBhY2thZ2Uoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBkZXNjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IKLSAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2MuZmlsZS5wYWNrYWdlLCAncHJvdG9idWZfdW5pdHRlc3QnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuSW1wb3J0TWVzc2FnZS5ERVNDUklQVE9SLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuX0ZPUkVJR05FTlVNLmZpbGUucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFU19ORVNURURFTlVNLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLl9JTVBPUlRFTlVNLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcpCi0KLSAgZGVmIHRlc3RFeHRlbnNpb25SYW5nZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZXh0ZW5zaW9uX3JhbmdlcywgW10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IuZXh0ZW5zaW9uX3JhbmdlcywKLSAgICAgICAgWygxLCBNQVhfRVhURU5TSU9OKV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5ERVNDUklQVE9SLmV4dGVuc2lvbl9yYW5nZXMsCi0gICAgICAgIFsoNDIsIDQzKSwgKDQxNDMsIDQyNDQpLCAoNjU1MzYsIE1BWF9FWFRFTlNJT04pXSkKLQotICBkZWYgdGVzdEZpbGVEZXNjcmlwdG9yKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBzZWxmLmFzc2VydEZhbHNlKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIgaXMgTm9uZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLmRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgIFt1bml0dGVzdF9pbXBvcnRfcGIyLkRFU0NSSVBUT1JdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5ERVNDUklQVE9SLmRlcGVuZGVuY2llcywKLSAgICAgICAgICAgICAgICAgICAgIFt1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMi5ERVNDUklQVE9SXSkKLQotICBkZWYgdGVzdE5vR2VuZXJpY1NlcnZpY2VzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAiVGVzdE1lc3NhZ2UiKSkKLSAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgIkZPTyIpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAidGVzdF9leHRlbnNpb24iKSkKLQotICAgICMgTWFrZSBzdXJlIHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyIGhhcyBubyBzZXJ2aWNlcyBzdWJjbGFzc2luZwotICAgICMgUHJvdG8yIFNlcnZpY2UgY2xhc3MuCi0gICAgaWYgaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgIlRlc3RTZXJ2aWNlIik6Ci0gICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIuVGVzdFNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5TZXJ2aWNlKSkKLQotICBkZWYgdGVzdE1lc3NhZ2VUeXBlc0J5TmFtZShzZWxmKToKLSAgICBmaWxlX3R5cGUgPSB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTLAotICAgICAgICBmaWxlX3R5cGUubWVzc2FnZV90eXBlc19ieV9uYW1lW3VuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTLm5hbWVdKQotCi0gICAgIyBOZXN0ZWQgbWVzc2FnZXMgc2hvdWxkbid0IGJlIGluY2x1ZGVkIGluIHRoZSBtZXNzYWdlX3R5cGVzX2J5X25hbWUKLSAgICAjIGRpY3Rpb25hcnkgKGxpa2UgaW4gdGhlIEMrKyBBUEkpLgotICAgIHNlbGYuYXNzZXJ0RmFsc2UoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTX05FU1RFRE1FU1NBR0UubmFtZSBpbgotICAgICAgICBmaWxlX3R5cGUubWVzc2FnZV90eXBlc19ieV9uYW1lKQotCi0gIGRlZiB0ZXN0RW51bVR5cGVzQnlOYW1lKHNlbGYpOgotICAgIGZpbGVfdHlwZSA9IHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLl9GT1JFSUdORU5VTSwKLSAgICAgICAgZmlsZV90eXBlLmVudW1fdHlwZXNfYnlfbmFtZVt1bml0dGVzdF9wYjIuX0ZPUkVJR05FTlVNLm5hbWVdKQotCi0gIGRlZiB0ZXN0RXh0ZW5zaW9uc0J5TmFtZShzZWxmKToKLSAgICBmaWxlX3R5cGUgPSB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25fc3RyaW5nLAotICAgICAgICBmaWxlX3R5cGUuZXh0ZW5zaW9uc19ieV9uYW1lW3VuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25fc3RyaW5nLm5hbWVdKQotCi0gIGRlZiB0ZXN0UHVibGljSW1wb3J0cyhzZWxmKToKLSAgICAjIFRlc3QgcHVibGljIGltcG9ydHMgYXMgZW1iZWRkZWQgbWVzc2FnZS4KLSAgICBhbGxfdHlwZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYWxsX3R5cGVfcHJvdG8ub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlLmUpCi0KLSAgICAjIFB1YmxpY0ltcG9ydE1lc3NhZ2UgaXMgYWN0dWFsbHkgZGVmaW5lZCBpbiB1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMgotICAgICMgbW9kdWxlLCBhbmQgaXMgcHVibGljIGltcG9ydGVkIGJ5IHVuaXR0ZXN0X2ltcG9ydF9wYjIgbW9kdWxlLgotICAgIHB1YmxpY19pbXBvcnRfcHJvdG8gPSB1bml0dGVzdF9pbXBvcnRfcGIyLlB1YmxpY0ltcG9ydE1lc3NhZ2UoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHVibGljX2ltcG9ydF9wcm90by5lKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh1bml0dGVzdF9pbXBvcnRfcHVibGljX3BiMi5QdWJsaWNJbXBvcnRNZXNzYWdlIGlzCi0gICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuUHVibGljSW1wb3J0TWVzc2FnZSkKLQotICBkZWYgdGVzdEJhZElkZW50aWZpZXJzKHNlbGYpOgotICAgICMgV2UncmUganVzdCB0ZXN0aW5nIHRoYXQgdGhlIGNvZGUgd2FzIGltcG9ydGVkIHdpdGhvdXQgcHJvYmxlbXMuCi0gICAgbWVzc2FnZSA9IHRlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5UZXN0QmFkSWRlbnRpZmllcnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5tZXNzYWdlXSwKLSAgICAgICAgICAgICAgICAgICAgICJmb28iKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5kZXNjcmlwdG9yXSwKLSAgICAgICAgICAgICAgICAgICAgICJiYXIiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5yZWZsZWN0aW9uXSwKLSAgICAgICAgICAgICAgICAgICAgICJiYXoiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5FeHRlbnNpb25zW3Rlc3RfYmFkX2lkZW50aWZpZXJzX3BiMi5zZXJ2aWNlXSwKLSAgICAgICAgICAgICAgICAgICAgICJxdXgiKQotCi0gIGRlZiB0ZXN0T25lb2Yoc2VsZik6Ci0gICAgZGVzYyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKGRlc2Mub25lb2ZzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9maWVsZCcsIGRlc2Mub25lb2ZzWzBdLm5hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBkZXNjLm9uZW9mc1swXS5pbmRleCkKLSAgICBzZWxmLmFzc2VydElzKGRlc2MsIGRlc2Mub25lb2ZzWzBdLmNvbnRhaW5pbmdfdHlwZSkKLSAgICBzZWxmLmFzc2VydElzKGRlc2Mub25lb2ZzWzBdLCBkZXNjLm9uZW9mc19ieV9uYW1lWydvbmVvZl9maWVsZCddKQotICAgIG5lc3RlZF9uYW1lcyA9IHNldChbJ29uZW9mX3VpbnQzMicsICdvbmVvZl9uZXN0ZWRfbWVzc2FnZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAnb25lb2Zfc3RyaW5nJywgJ29uZW9mX2J5dGVzJ10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbmVzdGVkX25hbWVzLAotICAgICAgICBzZXQoW2ZpZWxkLm5hbWUgZm9yIGZpZWxkIGluIGRlc2Mub25lb2ZzWzBdLmZpZWxkc10pKQotICAgIGZvciBmaWVsZF9uYW1lLCBmaWVsZF9kZXNjIGluIGRlc2MuZmllbGRzX2J5X25hbWUuaXRlbXMoKToKLSAgICAgIGlmIGZpZWxkX25hbWUgaW4gbmVzdGVkX25hbWVzOgotICAgICAgICBzZWxmLmFzc2VydElzKGRlc2Mub25lb2ZzWzBdLCBmaWVsZF9kZXNjLmNvbnRhaW5pbmdfb25lb2YpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLmFzc2VydElzTm9uZShmaWVsZF9kZXNjLmNvbnRhaW5pbmdfb25lb2YpCi0KLQotY2xhc3MgU3ltYm9sRGF0YWJhc2VSZWdpc3RyYXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiQ2hlY2tzIHRoYXQgbWVzc2FnZXMsIGVudW1zIGFuZCBmaWxlcyBhcmUgY29ycmVjdGx5IHJlZ2lzdGVyZWQuIiIiCi0KLSAgZGVmIHRlc3RHZXRTeW1ib2woc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5HZXRTeW1ib2woCi0gICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLAotICAgICAgICBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpLkdldFN5bWJvbCgKLSAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZScpKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5HZXRTeW1ib2woJ3Byb3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZE1lc3NhZ2UnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cCwKLSAgICAgICAgc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5HZXRTeW1ib2woCi0gICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAsCi0gICAgICAgIHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkuR2V0U3ltYm9sKAotICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwJykpCi0KLSAgZGVmIHRlc3RFbnVtcyhzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0nLAotICAgICAgICBzeW1ib2xfZGF0YWJhc2UuRGVmYXVsdCgpLnBvb2wuRmluZEVudW1UeXBlQnlOYW1lKAotICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtJykuZnVsbF9uYW1lKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScsCi0gICAgICAgIHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkucG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoCi0gICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0nKS5mdWxsX25hbWUpCi0KLSAgZGVmIHRlc3RGaW5kRmlsZUJ5TmFtZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJywKLSAgICAgICAgc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKS5wb29sLkZpbmRGaWxlQnlOYW1lKAotICAgICAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycpLm5hbWUpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL19faW5pdF9fLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1MTIxZGQwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9fX2luaXRfXy5weQorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiU2FtcGxlIG1vZHVsZSBpbXBvcnRpbmcgYSBuZXN0ZWQgcHJvdG8gZnJvbSBpdHNlbGYuIiIiCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmltcG9ydF90ZXN0X3BhY2thZ2UgaW1wb3J0IG91dGVyX3BiMiBhcyBteXByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UvaW5uZXIucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2UvaW5uZXIucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI4ODdjMTIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2lubmVyLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMzcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuaW1wb3J0X3Rlc3RfcGFja2FnZTsKLQotbWVzc2FnZSBJbm5lciB7Ci0gIG9wdGlvbmFsIGludDMyIHZhbHVlID0gMSBbZGVmYXVsdCA9IDU3XTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9vdXRlci5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9vdXRlci5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTI3ZmI1Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ltcG9ydF90ZXN0X3BhY2thZ2Uvb3V0ZXIucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwzOSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5pbXBvcnRfdGVzdF9wYWNrYWdlOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2lubmVyLnByb3RvIjsKLQotbWVzc2FnZSBPdXRlciB7Ci0gIG9wdGlvbmFsIElubmVyIGlubmVyID0gMTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvanNvbl9mb3JtYXRfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvanNvbl9mb3JtYXRfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmRjOWY0OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2pzb25fZm9ybWF0X3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3NjkgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUZXN0IGZvciBnb29nbGUucHJvdG9idWYuanNvbl9mb3JtYXQuIiIiCi0KLV9fYXV0aG9yX18gPSAnamllbHVvQGdvb2dsZS5jb20gKEppZSBMdW8pJwotCi1pbXBvcnQganNvbgotaW1wb3J0IG1hdGgKLWltcG9ydCBzeXMKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGFueV9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkdXJhdGlvbl9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBmaWVsZF9tYXNrX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN0cnVjdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0aW1lc3RhbXBfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgd3JhcHBlcnNfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2VsbF9rbm93bl90eXBlcwotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGpzb25fZm9ybWF0Ci1mcm9tIGdvb2dsZS5wcm90b2J1Zi51dGlsIGltcG9ydCBqc29uX2Zvcm1hdF9wcm90bzNfcGIyCi0KLQotY2xhc3MgSnNvbkZvcm1hdEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBGaWxsQWxsRmllbGRzKHNlbGYsIG1lc3NhZ2UpOgotICAgIG1lc3NhZ2UuaW50MzJfdmFsdWUgPSAyMAotICAgIG1lc3NhZ2UuaW50NjRfdmFsdWUgPSAtMjAKLSAgICBtZXNzYWdlLnVpbnQzMl92YWx1ZSA9IDMxMjA5ODc2NTQKLSAgICBtZXNzYWdlLnVpbnQ2NF92YWx1ZSA9IDEyMzQ1Njc4OTAwCi0gICAgbWVzc2FnZS5mbG9hdF92YWx1ZSA9IGZsb2F0KCctaW5mJykKLSAgICBtZXNzYWdlLmRvdWJsZV92YWx1ZSA9IDMuMTQxNQotICAgIG1lc3NhZ2UuYm9vbF92YWx1ZSA9IFRydWUKLSAgICBtZXNzYWdlLnN0cmluZ192YWx1ZSA9ICdmb28nCi0gICAgbWVzc2FnZS5ieXRlc192YWx1ZSA9IGInYmFyJwotICAgIG1lc3NhZ2UubWVzc2FnZV92YWx1ZS52YWx1ZSA9IDEwCi0gICAgbWVzc2FnZS5lbnVtX3ZhbHVlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5CQVIKLSAgICAjIFJlcGVhdGVkCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl92YWx1ZS5hcHBlbmQoMHg3RkZGRkZGRikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3ZhbHVlLmFwcGVuZCgtMjE0NzQ4MzY0OCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3ZhbHVlLmFwcGVuZCg5MDA3MTk5MjU0NzQwOTkyKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfdmFsdWUuYXBwZW5kKC05MDA3MTk5MjU0NzQwOTkyKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3ZhbHVlLmFwcGVuZCgweEZGRkZGRkYpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfdmFsdWUuYXBwZW5kKDB4N0ZGRkZGRikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF92YWx1ZS5hcHBlbmQoOTAwNzE5OTI1NDc0MDk5MikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF92YWx1ZS5hcHBlbmQoOTAwNzE5OTI1NDc0MDk5MSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3ZhbHVlLmFwcGVuZCgwKQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfdmFsdWUuYXBwZW5kKDFFLTE1KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3ZhbHVlLmFwcGVuZChmbG9hdCgnaW5mJykpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3ZhbHVlLmFwcGVuZChUcnVlKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF92YWx1ZS5hcHBlbmQoRmFsc2UpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfdmFsdWUuYXBwZW5kKCdGZXcgc3ltYm9scyEjJCw7JykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ192YWx1ZS5hcHBlbmQoJ2JhcicpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc192YWx1ZS5hcHBlbmQoYidmb28nKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfdmFsdWUuYXBwZW5kKGInYmFyJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUuYWRkKCkudmFsdWUgPSAxMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS5hZGQoKS52YWx1ZSA9IDExCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9lbnVtX3ZhbHVlLmFwcGVuZChqc29uX2Zvcm1hdF9wcm90bzNfcGIyLkZPTykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2VudW1fdmFsdWUuYXBwZW5kKGpzb25fZm9ybWF0X3Byb3RvM19wYjIuQkFSKQotICAgIHNlbGYubWVzc2FnZSA9IG1lc3NhZ2UKLQotICBkZWYgQ2hlY2tQYXJzZUJhY2soc2VsZiwgbWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpOgotICAgIGpzb25fZm9ybWF0LlBhcnNlKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSksCi0gICAgICAgICAgICAgICAgICAgICAgcGFyc2VkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLQotICBkZWYgQ2hlY2tFcnJvcihzZWxmLCB0ZXh0LCBlcnJvcl9tZXNzYWdlKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgIGVycm9yX21lc3NhZ2UsCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotCi0KLWNsYXNzIEpzb25Gb3JtYXRUZXN0KEpzb25Gb3JtYXRCYXNlKToKLQotICBkZWYgdGVzdEVtcHR5TWVzc2FnZVRvSnNvbihzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UpLAotICAgICAgICAgICAgICAgICAgICAgJ3t9JykKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJ0aWFsTWVzc2FnZVRvSnNvbihzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgKLSAgICAgICAgc3RyaW5nX3ZhbHVlPSd0ZXN0JywKLSAgICAgICAgcmVwZWF0ZWRfaW50MzJfdmFsdWU9Wzg5LCA0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSksCi0gICAgICAgICAgICAgICAgICAgICBqc29uLmxvYWRzKCd7InN0cmluZ1ZhbHVlIjogInRlc3QiLCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRJbnQzMlZhbHVlIjogWzg5LCA0XX0nKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RBbGxGaWVsZHNUb0pzb24oc2VsZik6Ci0gICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQotICAgIHRleHQgPSAoJ3siaW50MzJWYWx1ZSI6IDIwLCAnCi0gICAgICAgICAgICAnImludDY0VmFsdWUiOiAiLTIwIiwgJwotICAgICAgICAgICAgJyJ1aW50MzJWYWx1ZSI6IDMxMjA5ODc2NTQsJwotICAgICAgICAgICAgJyJ1aW50NjRWYWx1ZSI6ICIxMjM0NTY3ODkwMCIsJwotICAgICAgICAgICAgJyJmbG9hdFZhbHVlIjogIi1JbmZpbml0eSIsJwotICAgICAgICAgICAgJyJkb3VibGVWYWx1ZSI6IDMuMTQxNSwnCi0gICAgICAgICAgICAnImJvb2xWYWx1ZSI6IHRydWUsJwotICAgICAgICAgICAgJyJzdHJpbmdWYWx1ZSI6ICJmb28iLCcKLSAgICAgICAgICAgICciYnl0ZXNWYWx1ZSI6ICJZbUZ5IiwnCi0gICAgICAgICAgICAnIm1lc3NhZ2VWYWx1ZSI6IHsidmFsdWUiOiAxMH0sJwotICAgICAgICAgICAgJyJlbnVtVmFsdWUiOiAiQkFSIiwnCi0gICAgICAgICAgICAnInJlcGVhdGVkSW50MzJWYWx1ZSI6IFsyMTQ3NDgzNjQ3LCAtMjE0NzQ4MzY0OF0sJwotICAgICAgICAgICAgJyJyZXBlYXRlZEludDY0VmFsdWUiOiBbIjkwMDcxOTkyNTQ3NDA5OTIiLCAiLTkwMDcxOTkyNTQ3NDA5OTIiXSwnCi0gICAgICAgICAgICAnInJlcGVhdGVkVWludDMyVmFsdWUiOiBbMjY4NDM1NDU1LCAxMzQyMTc3MjddLCcKLSAgICAgICAgICAgICcicmVwZWF0ZWRVaW50NjRWYWx1ZSI6IFsiOTAwNzE5OTI1NDc0MDk5MiIsICI5MDA3MTk5MjU0NzQwOTkxIl0sJwotICAgICAgICAgICAgJyJyZXBlYXRlZEZsb2F0VmFsdWUiOiBbMF0sJwotICAgICAgICAgICAgJyJyZXBlYXRlZERvdWJsZVZhbHVlIjogWzFlLTE1LCAiSW5maW5pdHkiXSwnCi0gICAgICAgICAgICAnInJlcGVhdGVkQm9vbFZhbHVlIjogW3RydWUsIGZhbHNlXSwnCi0gICAgICAgICAgICAnInJlcGVhdGVkU3RyaW5nVmFsdWUiOiBbIkZldyBzeW1ib2xzISMkLDsiLCAiYmFyIl0sJwotICAgICAgICAgICAgJyJyZXBlYXRlZEJ5dGVzVmFsdWUiOiBbIlptOXYiLCAiWW1GeSJdLCcKLSAgICAgICAgICAgICcicmVwZWF0ZWRNZXNzYWdlVmFsdWUiOiBbeyJ2YWx1ZSI6IDEwfSwgeyJ2YWx1ZSI6IDExfV0sJwotICAgICAgICAgICAgJyJyZXBlYXRlZEVudW1WYWx1ZSI6IFsiRk9PIiwgIkJBUiJdJwotICAgICAgICAgICAgJ30nKQotICAgIHNlbGYuRmlsbEFsbEZpZWxkcyhtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSksCi0gICAgICAgIGpzb24ubG9hZHModGV4dCkpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKLSAgICBqc29uX2Zvcm1hdC5QYXJzZSh0ZXh0LCBwYXJzZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0SnNvbkVzY2FwZVN0cmluZyhzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCi0gICAgaWYgc3lzLnZlcnNpb25faW5mb1swXSA8IDM6Ci0gICAgICBtZXNzYWdlLnN0cmluZ192YWx1ZSA9ICcmXG48XCJccj5cYlx0XGZcXFwwMDEvXHhlMlx4ODBceGE4XHhlMlx4ODBceGE5JwotICAgIGVsc2U6Ci0gICAgICBtZXNzYWdlLnN0cmluZ192YWx1ZSA9ICcmXG48XCJccj5cYlx0XGZcXFwwMDEvJwotICAgICAgbWVzc2FnZS5zdHJpbmdfdmFsdWUgKz0gKGInXHhlMlx4ODBceGE4XHhlMlx4ODBceGE5JykuZGVjb2RlKCd1dGYtOCcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKSwKLSAgICAgICAgJ3tcbiAgInN0cmluZ1ZhbHVlIjogJwotICAgICAgICAnIiZcXG48XFxcIlxccj5cXGJcXHRcXGZcXFxcXFx1MDAwMS9cXHUyMDI4XFx1MjAyOSJcbn0nKQotICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCi0gICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLSAgICB0ZXh0ID0gdSd7ImludDMyVmFsdWUiOiAiXHUwMDMxIn0nCi0gICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UuaW50MzJfdmFsdWUsIDEpCi0KLSAgZGVmIHRlc3RBbHdheXNTZXJpbGlhemUoc2VsZik6Ci0gICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoCi0gICAgICAgIHN0cmluZ192YWx1ZT0nZm9vJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgVHJ1ZSkpLAotICAgICAgICBqc29uLmxvYWRzKCd7JwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRTdHJpbmdWYWx1ZSI6IFtdLCcKLSAgICAgICAgICAgICAgICAgICAnInN0cmluZ1ZhbHVlIjogImZvbyIsJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRCb29sVmFsdWUiOiBbXSwnCi0gICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFVpbnQzMlZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRJbnQzMlZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICciZW51bVZhbHVlIjogIkZPTyIsJwotICAgICAgICAgICAgICAgICAgICciaW50MzJWYWx1ZSI6IDAsJwotICAgICAgICAgICAgICAgICAgICciZmxvYXRWYWx1ZSI6IDAsJwotICAgICAgICAgICAgICAgICAgICciaW50NjRWYWx1ZSI6ICIwIiwnCi0gICAgICAgICAgICAgICAgICAgJyJ1aW50MzJWYWx1ZSI6IDAsJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRCeXRlc1ZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRVaW50NjRWYWx1ZSI6IFtdLCcKLSAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkRG91YmxlVmFsdWUiOiBbXSwnCi0gICAgICAgICAgICAgICAgICAgJyJieXRlc1ZhbHVlIjogIiIsJwotICAgICAgICAgICAgICAgICAgICciYm9vbFZhbHVlIjogZmFsc2UsJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRFbnVtVmFsdWUiOiBbXSwnCi0gICAgICAgICAgICAgICAgICAgJyJ1aW50NjRWYWx1ZSI6ICIwIiwnCi0gICAgICAgICAgICAgICAgICAgJyJkb3VibGVWYWx1ZSI6IDAsJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRGbG9hdFZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRJbnQ2NFZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRNZXNzYWdlVmFsdWUiOiBbXX0nKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RNYXBGaWVsZHMoc2VsZik6Ci0gICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1hcCgpCi0gICAgbWVzc2FnZS5ib29sX21hcFtUcnVlXSA9IDEKLSAgICBtZXNzYWdlLmJvb2xfbWFwW0ZhbHNlXSA9IDIKLSAgICBtZXNzYWdlLmludDMyX21hcFsxXSA9IDIKLSAgICBtZXNzYWdlLmludDMyX21hcFsyXSA9IDMKLSAgICBtZXNzYWdlLmludDY0X21hcFsxXSA9IDIKLSAgICBtZXNzYWdlLmludDY0X21hcFsyXSA9IDMKLSAgICBtZXNzYWdlLnVpbnQzMl9tYXBbMV0gPSAyCi0gICAgbWVzc2FnZS51aW50MzJfbWFwWzJdID0gMwotICAgIG1lc3NhZ2UudWludDY0X21hcFsxXSA9IDIKLSAgICBtZXNzYWdlLnVpbnQ2NF9tYXBbMl0gPSAzCi0gICAgbWVzc2FnZS5zdHJpbmdfbWFwWycxJ10gPSAyCi0gICAgbWVzc2FnZS5zdHJpbmdfbWFwWydudWxsJ10gPSAzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpKSwKLSAgICAgICAganNvbi5sb2FkcygneycKLSAgICAgICAgICAgICAgICAgICAnImJvb2xNYXAiOiB7ImZhbHNlIjogMiwgInRydWUiOiAxfSwnCi0gICAgICAgICAgICAgICAgICAgJyJpbnQzMk1hcCI6IHsiMSI6IDIsICIyIjogM30sJwotICAgICAgICAgICAgICAgICAgICciaW50NjRNYXAiOiB7IjEiOiAyLCAiMiI6IDN9LCcKLSAgICAgICAgICAgICAgICAgICAnInVpbnQzMk1hcCI6IHsiMSI6IDIsICIyIjogM30sJwotICAgICAgICAgICAgICAgICAgICcidWludDY0TWFwIjogeyIxIjogMiwgIjIiOiAzfSwnCi0gICAgICAgICAgICAgICAgICAgJyJzdHJpbmdNYXAiOiB7IjEiOiAyLCAibnVsbCI6IDN9JwotICAgICAgICAgICAgICAgICAgICd9JykpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNYXAoKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RPbmVvZkZpZWxkcyhzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0T25lb2YoKQotICAgICMgQWx3YXlzIHByaW50IGRvZXMgbm90IGFmZmVjdCBvbmVvZiBmaWVsZHMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSwKLSAgICAgICAgJ3t9JykKLSAgICBtZXNzYWdlLm9uZW9mX2ludDMyX3ZhbHVlID0gMAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgVHJ1ZSksCi0gICAgICAgICd7XG4nCi0gICAgICAgICcgICJvbmVvZkludDMyVmFsdWUiOiAwXG4nCi0gICAgICAgICd9JykKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE9uZW9mKCkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0VGltZXN0YW1wTWVzc2FnZShzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0VGltZXN0YW1wKCkKLSAgICBtZXNzYWdlLnZhbHVlLnNlY29uZHMgPSAwCi0gICAgbWVzc2FnZS52YWx1ZS5uYW5vcyA9IDAKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAyMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMF0ubmFub3MgPSAxCi0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5zZWNvbmRzID0gMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMV0ubmFub3MgPSAxMDAwMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDEwMDAwMDAwMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMl0ubmFub3MgPSAwCi0gICAgIyBNYXhpbXVtIHRpbWUKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAyNTM0MDIzMDA3OTkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzNdLm5hbm9zID0gOTk5OTk5OTk5Ci0gICAgIyBNaW5pbXVtIHRpbWUKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAtNjIxMzU1OTY4MDAKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzRdLm5hbm9zID0gMAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCi0gICAgICAgIGpzb24ubG9hZHMoJ3snCi0gICAgICAgICAgICAgICAgICAgJyJ2YWx1ZSI6ICIxOTcwLTAxLTAxVDAwOjAwOjAwWiIsJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRWYWx1ZSI6IFsnCi0gICAgICAgICAgICAgICAgICAgJyAgIjE5NzAtMDEtMDFUMDA6MDA6MjAuMDAwMDAwMDAxWiIsJwotICAgICAgICAgICAgICAgICAgICcgICIxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAxMFoiLCcKLSAgICAgICAgICAgICAgICAgICAnICAiMTk3My0wMy0wM1QwOTo0Njo0MFoiLCcKLSAgICAgICAgICAgICAgICAgICAnICAiOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaIiwnCi0gICAgICAgICAgICAgICAgICAgJyAgIjAwMDEtMDEtMDFUMDA6MDA6MDBaIicKLSAgICAgICAgICAgICAgICAgICAnXScKLSAgICAgICAgICAgICAgICAgICAnfScpKQotICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0VGltZXN0YW1wKCkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotICAgIHRleHQgPSAocid7InZhbHVlIjogIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDErMDg6MDAiLCcKLSAgICAgICAgICAgIHInInJlcGVhdGVkVmFsdWUiOlsnCi0gICAgICAgICAgICByJyAgIjE5NzAtMDEtMDFUMDA6MDA6MDAuMDErMDg6MzAiLCcKLSAgICAgICAgICAgIHInICAiMTk3MC0wMS0wMVQwMDowMDowMC4wMS0wMToyMyJdfScpCi0gICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgcGFyc2VkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfbWVzc2FnZS52YWx1ZS5zZWNvbmRzLCAtOCAqIDM2MDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfbWVzc2FnZS52YWx1ZS5uYW5vcywgMTAwMDAwMDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwYXJzZWRfbWVzc2FnZS5yZXBlYXRlZF92YWx1ZVswXS5zZWNvbmRzLCAtOC41ICogMzYwMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHBhcnNlZF9tZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzFdLnNlY29uZHMsIDM2MDAgKyAyMyAqIDYwKQotCi0gIGRlZiB0ZXN0RHVyYXRpb25NZXNzYWdlKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3REdXJhdGlvbigpCi0gICAgbWVzc2FnZS52YWx1ZS5zZWNvbmRzID0gMQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDAKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlWzBdLm5hbm9zID0gMTAKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLnNlY29uZHMgPSAtMQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWVbMV0ubmFub3MgPSAtMTAwMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDEwCi0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZVsyXS5uYW5vcyA9IDExMDAwMDAwCi0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5zZWNvbmRzID0gLTMxNTU3NjAwMDAwMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuc2Vjb25kcyA9IDMxNTU3NjAwMDAwMAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCi0gICAgICAgIGpzb24ubG9hZHMoJ3snCi0gICAgICAgICAgICAgICAgICAgJyJ2YWx1ZSI6ICIxcyIsJwotICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRWYWx1ZSI6IFsnCi0gICAgICAgICAgICAgICAgICAgJyAgIjAuMDAwMDAwMDEwcyIsJwotICAgICAgICAgICAgICAgICAgICcgICItMS4wMDAwMDFzIiwnCi0gICAgICAgICAgICAgICAgICAgJyAgIjEwLjAxMXMiLCcKLSAgICAgICAgICAgICAgICAgICAnICAiLTMxNTU3NjAwMDAwMHMiLCcKLSAgICAgICAgICAgICAgICAgICAnICAiMzE1NTc2MDAwMDAwcyInCi0gICAgICAgICAgICAgICAgICAgJ10nCi0gICAgICAgICAgICAgICAgICAgJ30nKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdER1cmF0aW9uKCkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0RmllbGRNYXNrTWVzc2FnZShzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0RmllbGRNYXNrKCkKLSAgICBtZXNzYWdlLnZhbHVlLnBhdGhzLmFwcGVuZCgnZm9vLmJhcicpCi0gICAgbWVzc2FnZS52YWx1ZS5wYXRocy5hcHBlbmQoJ2JhcicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSwKLSAgICAgICAgJ3tcbicKLSAgICAgICAgJyAgInZhbHVlIjogImZvby5iYXIsYmFyIlxuJwotICAgICAgICAnfScpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RGaWVsZE1hc2soKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RXcmFwcGVyTWVzc2FnZShzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0V3JhcHBlcigpCi0gICAgbWVzc2FnZS5ib29sX3ZhbHVlLnZhbHVlID0gRmFsc2UKLSAgICBtZXNzYWdlLmludDMyX3ZhbHVlLnZhbHVlID0gMAotICAgIG1lc3NhZ2Uuc3RyaW5nX3ZhbHVlLnZhbHVlID0gJycKLSAgICBtZXNzYWdlLmJ5dGVzX3ZhbHVlLnZhbHVlID0gYicnCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3ZhbHVlLmFkZCgpLnZhbHVlID0gVHJ1ZQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF92YWx1ZS5hZGQoKS52YWx1ZSA9IEZhbHNlCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl92YWx1ZS5hZGQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCi0gICAgICAgIGpzb24ubG9hZHMoJ3tcbicKLSAgICAgICAgICAgICAgICAgICAnICAiaW50MzJWYWx1ZSI6IDAsJwotICAgICAgICAgICAgICAgICAgICcgICJib29sVmFsdWUiOiBmYWxzZSwnCi0gICAgICAgICAgICAgICAgICAgJyAgInN0cmluZ1ZhbHVlIjogIiIsJwotICAgICAgICAgICAgICAgICAgICcgICJieXRlc1ZhbHVlIjogIiIsJwotICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZEJvb2xWYWx1ZSI6IFt0cnVlLCBmYWxzZV0sJwotICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZEludDMyVmFsdWUiOiBbMF0sJwotICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZFVpbnQzMlZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZEZsb2F0VmFsdWUiOiBbXSwnCi0gICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkRG91YmxlVmFsdWUiOiBbXSwnCi0gICAgICAgICAgICAgICAgICAgJyAgInJlcGVhdGVkQnl0ZXNWYWx1ZSI6IFtdLCcKLSAgICAgICAgICAgICAgICAgICAnICAicmVwZWF0ZWRJbnQ2NFZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZFVpbnQ2NFZhbHVlIjogW10sJwotICAgICAgICAgICAgICAgICAgICcgICJyZXBlYXRlZFN0cmluZ1ZhbHVlIjogW10nCi0gICAgICAgICAgICAgICAgICAgJ30nKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdFdyYXBwZXIoKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RTdHJ1Y3RNZXNzYWdlKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RTdHJ1Y3QoKQotICAgIG1lc3NhZ2UudmFsdWVbJ25hbWUnXSA9ICdKaW0nCi0gICAgbWVzc2FnZS52YWx1ZVsnYWdlJ10gPSAxMAotICAgIG1lc3NhZ2UudmFsdWVbJ2F0dGVuZCddID0gVHJ1ZQotICAgIG1lc3NhZ2UudmFsdWVbJ2VtYWlsJ10gPSBOb25lCi0gICAgbWVzc2FnZS52YWx1ZS5nZXRfb3JfY3JlYXRlX3N0cnVjdCgnYWRkcmVzcycpWydjaXR5J10gPSAnU0ZPJwotICAgIG1lc3NhZ2UudmFsdWVbJ2FkZHJlc3MnXVsnaG91c2VfbnVtYmVyJ10gPSAxMDI0Ci0gICAgc3RydWN0X2xpc3QgPSBtZXNzYWdlLnZhbHVlLmdldF9vcl9jcmVhdGVfbGlzdCgnbGlzdCcpCi0gICAgc3RydWN0X2xpc3QuZXh0ZW5kKFs2LCAnc2V2ZW4nLCBUcnVlLCBGYWxzZSwgTm9uZV0pCi0gICAgc3RydWN0X2xpc3QuYWRkX3N0cnVjdCgpWydzdWJrZXkyJ10gPSA5Ci0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKVsnYWdlJ10gPSAxMQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgRmFsc2UpKSwKLSAgICAgICAganNvbi5sb2FkcygKLSAgICAgICAgICAgICd7JwotICAgICAgICAgICAgJyAgInZhbHVlIjogeycKLSAgICAgICAgICAgICcgICAgImFkZHJlc3MiOiB7JwotICAgICAgICAgICAgJyAgICAgICJjaXR5IjogIlNGTyIsICcKLSAgICAgICAgICAgICcgICAgICAiaG91c2VfbnVtYmVyIjogMTAyNCcKLSAgICAgICAgICAgICcgICAgfSwgJwotICAgICAgICAgICAgJyAgICAiYWdlIjogMTAsICcKLSAgICAgICAgICAgICcgICAgIm5hbWUiOiAiSmltIiwgJwotICAgICAgICAgICAgJyAgICAiYXR0ZW5kIjogdHJ1ZSwgJwotICAgICAgICAgICAgJyAgICAiZW1haWwiOiBudWxsLCAnCi0gICAgICAgICAgICAnICAgICJsaXN0IjogWzYsICJzZXZlbiIsIHRydWUsIGZhbHNlLCBudWxsLCB7InN1YmtleTIiOiA5fV0nCi0gICAgICAgICAgICAnICB9LCcKLSAgICAgICAgICAgICcgICJyZXBlYXRlZFZhbHVlIjogW3siYWdlIjogMTF9LCB7fV0nCi0gICAgICAgICAgICAnfScpKQotICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0U3RydWN0KCkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0VmFsdWVNZXNzYWdlKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RWYWx1ZSgpCi0gICAgbWVzc2FnZS52YWx1ZS5zdHJpbmdfdmFsdWUgPSAnaGVsbG8nCi0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5udW1iZXJfdmFsdWUgPSAxMS4xCi0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS5ib29sX3ZhbHVlID0gRmFsc2UKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLm51bGxfdmFsdWUgPSAwCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIEZhbHNlKSksCi0gICAgICAgIGpzb24ubG9hZHMoCi0gICAgICAgICAgICAneycKLSAgICAgICAgICAgICcgICJ2YWx1ZSI6ICJoZWxsbyIsJwotICAgICAgICAgICAgJyAgInJlcGVhdGVkVmFsdWUiOiBbMTEuMSwgZmFsc2UsIG51bGxdJwotICAgICAgICAgICAgJ30nKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdFZhbHVlKCkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotICAgICMgQ2FuJ3QgcGFyc2UgYmFjayBpZiB0aGUgVmFsdWUgbWVzc2FnZSBpcyBub3Qgc2V0LgotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgRmFsc2UpKSwKLSAgICAgICAganNvbi5sb2FkcygKLSAgICAgICAgICAgICd7JwotICAgICAgICAgICAgJyAgInZhbHVlIjogImhlbGxvIiwnCi0gICAgICAgICAgICAnICAicmVwZWF0ZWRWYWx1ZSI6IFsxMS4xLCBmYWxzZSwgbnVsbCwgbnVsbF0nCi0gICAgICAgICAgICAnfScpKQotCi0gIGRlZiB0ZXN0TGlzdFZhbHVlTWVzc2FnZShzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TGlzdFZhbHVlKCkKLSAgICBtZXNzYWdlLnZhbHVlLnZhbHVlcy5hZGQoKS5udW1iZXJfdmFsdWUgPSAxMS4xCi0gICAgbWVzc2FnZS52YWx1ZS52YWx1ZXMuYWRkKCkubnVsbF92YWx1ZSA9IDAKLSAgICBtZXNzYWdlLnZhbHVlLnZhbHVlcy5hZGQoKS5ib29sX3ZhbHVlID0gVHJ1ZQotICAgIG1lc3NhZ2UudmFsdWUudmFsdWVzLmFkZCgpLnN0cmluZ192YWx1ZSA9ICdoZWxsbycKLSAgICBtZXNzYWdlLnZhbHVlLnZhbHVlcy5hZGQoKS5zdHJ1Y3RfdmFsdWVbJ25hbWUnXSA9ICdKaW0nCi0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKS52YWx1ZXMuYWRkKCkubnVtYmVyX3ZhbHVlID0gMQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgRmFsc2UpKSwKLSAgICAgICAganNvbi5sb2FkcygKLSAgICAgICAgICAgICd7InZhbHVlIjogWzExLjEsIG51bGwsIHRydWUsICJoZWxsbyIsIHsibmFtZSI6ICJKaW0ifV1cbiwnCi0gICAgICAgICAgICAnInJlcGVhdGVkVmFsdWUiOiBbWzFdLCBbXV19JykpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RMaXN0VmFsdWUoKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RBbnlNZXNzYWdlKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RBbnkoKQotICAgIHZhbHVlMSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuTWVzc2FnZVR5cGUoKQotICAgIHZhbHVlMiA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuTWVzc2FnZVR5cGUoKQotICAgIHZhbHVlMS52YWx1ZSA9IDEyMzQKLSAgICB2YWx1ZTIudmFsdWUgPSA1Njc4Ci0gICAgbWVzc2FnZS52YWx1ZS5QYWNrKHZhbHVlMSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3ZhbHVlLmFkZCgpLlBhY2sodmFsdWUxKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdmFsdWUuYWRkKCkuUGFjayh2YWx1ZTIpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF92YWx1ZS5hZGQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCi0gICAgICAgIGpzb24ubG9hZHMoCi0gICAgICAgICAgICAne1xuJwotICAgICAgICAgICAgJyAgInJlcGVhdGVkVmFsdWUiOiBbIHtcbicKLSAgICAgICAgICAgICcgICAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vcHJvdG8zLk1lc3NhZ2VUeXBlIixcbicKLSAgICAgICAgICAgICcgICAgInZhbHVlIjogMTIzNFxuJwotICAgICAgICAgICAgJyAgfSwge1xuJwotICAgICAgICAgICAgJyAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90bzMuTWVzc2FnZVR5cGUiLFxuJwotICAgICAgICAgICAgJyAgICAidmFsdWUiOiA1Njc4XG4nCi0gICAgICAgICAgICAnICB9LFxuJwotICAgICAgICAgICAgJyAge31dLFxuJwotICAgICAgICAgICAgJyAgInZhbHVlIjoge1xuJwotICAgICAgICAgICAgJyAgICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9wcm90bzMuTWVzc2FnZVR5cGUiLFxuJwotICAgICAgICAgICAgJyAgICAidmFsdWUiOiAxMjM0XG4nCi0gICAgICAgICAgICAnICB9XG4nCi0gICAgICAgICAgICAnfVxuJykpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RBbnkoKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RXZWxsS25vd25JbkFueU1lc3NhZ2Uoc2VsZik6Ci0gICAgbWVzc2FnZSA9IGFueV9wYjIuQW55KCkKLSAgICBpbnQzMl92YWx1ZSA9IHdyYXBwZXJzX3BiMi5JbnQzMlZhbHVlKCkKLSAgICBpbnQzMl92YWx1ZS52YWx1ZSA9IDEyMzQKLSAgICBtZXNzYWdlLlBhY2soaW50MzJfdmFsdWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpKSwKLSAgICAgICAganNvbi5sb2FkcygKLSAgICAgICAgICAgICd7XG4nCi0gICAgICAgICAgICAnICAiQHR5cGUiOiBcInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkludDMyVmFsdWVcIixcbicKLSAgICAgICAgICAgICcgICJ2YWx1ZSI6IDEyMzRcbicKLSAgICAgICAgICAgICd9XG4nKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IGFueV9wYjIuQW55KCkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gICAgdGltZXN0YW1wID0gdGltZXN0YW1wX3BiMi5UaW1lc3RhbXAoKQotICAgIG1lc3NhZ2UuUGFjayh0aW1lc3RhbXApCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAganNvbi5sb2Fkcyhqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UsIFRydWUpKSwKLSAgICAgICAganNvbi5sb2FkcygKLSAgICAgICAgICAgICd7XG4nCi0gICAgICAgICAgICAnICAiQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIixcbicKLSAgICAgICAgICAgICcgICJ2YWx1ZSI6ICIxOTcwLTAxLTAxVDAwOjAwOjAwWiJcbicKLSAgICAgICAgICAgICd9XG4nKSkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gICAgZHVyYXRpb24gPSBkdXJhdGlvbl9wYjIuRHVyYXRpb24oKQotICAgIGR1cmF0aW9uLnNlY29uZHMgPSAxCi0gICAgbWVzc2FnZS5QYWNrKGR1cmF0aW9uKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCi0gICAgICAgIGpzb24ubG9hZHMoCi0gICAgICAgICAgICAne1xuJwotICAgICAgICAgICAgJyAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkR1cmF0aW9uIixcbicKLSAgICAgICAgICAgICcgICJ2YWx1ZSI6ICIxcyJcbicKLSAgICAgICAgICAgICd9XG4nKSkKLSAgICBzZWxmLkNoZWNrUGFyc2VCYWNrKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gICAgZmllbGRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCi0gICAgZmllbGRfbWFzay5wYXRocy5hcHBlbmQoJ2Zvby5iYXInKQotICAgIGZpZWxkX21hc2sucGF0aHMuYXBwZW5kKCdiYXInKQotICAgIG1lc3NhZ2UuUGFjayhmaWVsZF9tYXNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCi0gICAgICAgIGpzb24ubG9hZHMoCi0gICAgICAgICAgICAne1xuJwotICAgICAgICAgICAgJyAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayIsXG4nCi0gICAgICAgICAgICAnICAidmFsdWUiOiAiZm9vLmJhcixiYXIiXG4nCi0gICAgICAgICAgICAnfVxuJykpCi0gICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLQotICAgIHN0cnVjdF9tZXNzYWdlID0gc3RydWN0X3BiMi5TdHJ1Y3QoKQotICAgIHN0cnVjdF9tZXNzYWdlWyduYW1lJ10gPSAnSmltJwotICAgIG1lc3NhZ2UuUGFjayhzdHJ1Y3RfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBqc29uLmxvYWRzKGpzb25fZm9ybWF0Lk1lc3NhZ2VUb0pzb24obWVzc2FnZSwgVHJ1ZSkpLAotICAgICAgICBqc29uLmxvYWRzKAotICAgICAgICAgICAgJ3tcbicKLSAgICAgICAgICAgICcgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5TdHJ1Y3QiLFxuJwotICAgICAgICAgICAgJyAgInZhbHVlIjogeyJuYW1lIjogIkppbSJ9XG4nCi0gICAgICAgICAgICAnfVxuJykpCi0gICAgc2VsZi5DaGVja1BhcnNlQmFjayhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLQotICAgIG5lc3RlZF9hbnkgPSBhbnlfcGIyLkFueSgpCi0gICAgaW50MzJfdmFsdWUudmFsdWUgPSA1Njc4Ci0gICAgbmVzdGVkX2FueS5QYWNrKGludDMyX3ZhbHVlKQotICAgIG1lc3NhZ2UuUGFjayhuZXN0ZWRfYW55KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGpzb24ubG9hZHMoanNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlLCBUcnVlKSksCi0gICAgICAgIGpzb24ubG9hZHMoCi0gICAgICAgICAgICAne1xuJwotICAgICAgICAgICAgJyAgIkB0eXBlIjogInR5cGUuZ29vZ2xlYXBpcy5jb20vZ29vZ2xlLnByb3RvYnVmLkFueSIsXG4nCi0gICAgICAgICAgICAnICAidmFsdWUiOiB7XG4nCi0gICAgICAgICAgICAnICAgICJAdHlwZSI6ICJ0eXBlLmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIixcbicKLSAgICAgICAgICAgICcgICAgInZhbHVlIjogNTY3OFxuJwotICAgICAgICAgICAgJyAgfVxuJwotICAgICAgICAgICAgJ31cbicpKQotICAgIHNlbGYuQ2hlY2tQYXJzZUJhY2sobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJzZU51bGwoc2VsZik6Ci0gICAgbWVzc2FnZSA9IGpzb25fZm9ybWF0X3Byb3RvM19wYjIuVGVzdE1lc3NhZ2UoKQotICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCi0gICAgc2VsZi5GaWxsQWxsRmllbGRzKHBhcnNlZF9tZXNzYWdlKQotICAgIGpzb25fZm9ybWF0LlBhcnNlKCd7ImludDMyVmFsdWUiOiBudWxsLCAnCi0gICAgICAgICAgICAgICAgICAgICAgJyJpbnQ2NFZhbHVlIjogbnVsbCwgJwotICAgICAgICAgICAgICAgICAgICAgICcidWludDMyVmFsdWUiOiBudWxsLCcKLSAgICAgICAgICAgICAgICAgICAgICAnInVpbnQ2NFZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJmbG9hdFZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJkb3VibGVWYWx1ZSI6IG51bGwsJwotICAgICAgICAgICAgICAgICAgICAgICciYm9vbFZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJzdHJpbmdWYWx1ZSI6IG51bGwsJwotICAgICAgICAgICAgICAgICAgICAgICciYnl0ZXNWYWx1ZSI6IG51bGwsJwotICAgICAgICAgICAgICAgICAgICAgICcibWVzc2FnZVZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJlbnVtVmFsdWUiOiBudWxsLCcKLSAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkSW50MzJWYWx1ZSI6IG51bGwsJwotICAgICAgICAgICAgICAgICAgICAgICcicmVwZWF0ZWRJbnQ2NFZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFVpbnQzMlZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFVpbnQ2NFZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEZsb2F0VmFsdWUiOiBudWxsLCcKLSAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkRG91YmxlVmFsdWUiOiBudWxsLCcKLSAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkQm9vbFZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZFN0cmluZ1ZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEJ5dGVzVmFsdWUiOiBudWxsLCcKLSAgICAgICAgICAgICAgICAgICAgICAnInJlcGVhdGVkTWVzc2FnZVZhbHVlIjogbnVsbCwnCi0gICAgICAgICAgICAgICAgICAgICAgJyJyZXBlYXRlZEVudW1WYWx1ZSI6IG51bGwnCi0gICAgICAgICAgICAgICAgICAgICAgJ30nLAotICAgICAgICAgICAgICAgICAgICAgIHBhcnNlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICdGYWlsZWQgdG8gcGFyc2UgcmVwZWF0ZWRJbnQzMlZhbHVlIGZpZWxkOiAnCi0gICAgICAgICdudWxsIGlzIG5vdCBhbGxvd2VkIHRvIGJlIHVzZWQgYXMgYW4gZWxlbWVudCBpbiBhIHJlcGVhdGVkIGZpZWxkLicsCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLAotICAgICAgICAneyJyZXBlYXRlZEludDMyVmFsdWUiOlsxLCBudWxsXX0nLAotICAgICAgICBwYXJzZWRfbWVzc2FnZSkKLQotICBkZWYgdGVzdE5hbkZsb2F0KHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNZXNzYWdlKCkKLSAgICBtZXNzYWdlLmZsb2F0X3ZhbHVlID0gZmxvYXQoJ25hbicpCi0gICAgdGV4dCA9ICd7XG4gICJmbG9hdFZhbHVlIjogIk5hTiJcbn0nCi0gICAgc2VsZi5hc3NlcnRFcXVhbChqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uKG1lc3NhZ2UpLCB0ZXh0KQotICAgIHBhcnNlZF9tZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCi0gICAganNvbl9mb3JtYXQuUGFyc2UodGV4dCwgcGFyc2VkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1hdGguaXNuYW4ocGFyc2VkX21lc3NhZ2UuZmxvYXRfdmFsdWUpKQotCi0gIGRlZiB0ZXN0UGFyc2VFbXB0eVRleHQoc2VsZik6Ci0gICAgc2VsZi5DaGVja0Vycm9yKCcnLAotICAgICAgICAgICAgICAgICAgICByJ0ZhaWxlZCB0byBsb2FkIEpTT046IChFeHBlY3RpbmcgdmFsdWUpfChObyBKU09OKS4nKQotCi0gIGRlZiB0ZXN0UGFyc2VCYWRFbnVtVmFsdWUoc2VsZik6Ci0gICAgc2VsZi5DaGVja0Vycm9yKAotICAgICAgICAneyJlbnVtVmFsdWUiOiAxfScsCi0gICAgICAgICdFbnVtIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbCB3aXRoIGRvdWJsZSBxdW90ZXMuICcKLSAgICAgICAgJ1R5cGUgInByb3RvMy5FbnVtVHlwZSIgaGFzIG5vIHZhbHVlIG5hbWVkIDEuJykKLSAgICBzZWxmLkNoZWNrRXJyb3IoCi0gICAgICAgICd7ImVudW1WYWx1ZSI6ICJiYXoifScsCi0gICAgICAgICdFbnVtIHZhbHVlIG11c3QgYmUgYSBzdHJpbmcgbGl0ZXJhbCB3aXRoIGRvdWJsZSBxdW90ZXMuICcKLSAgICAgICAgJ1R5cGUgInByb3RvMy5FbnVtVHlwZSIgaGFzIG5vIHZhbHVlIG5hbWVkIGJhei4nKQotCi0gIGRlZiB0ZXN0UGFyc2VCYWRJZGVudGlmZXIoc2VsZik6Ci0gICAgc2VsZi5DaGVja0Vycm9yKCd7aW50MzJWYWx1ZTogMX0nLAotICAgICAgICAgICAgICAgICAgICAocidGYWlsZWQgdG8gbG9hZCBKU09OOiBFeHBlY3RpbmcgcHJvcGVydHkgbmFtZScKLSAgICAgICAgICAgICAgICAgICAgIHInKCBlbmNsb3NlZCBpbiBkb3VibGUgcXVvdGVzKT86IGxpbmUgMScpKQotICAgIHNlbGYuQ2hlY2tFcnJvcigneyJ1bmtub3duTmFtZSI6IDF9JywKLSAgICAgICAgICAgICAgICAgICAgJ01lc3NhZ2UgdHlwZSAicHJvdG8zLlRlc3RNZXNzYWdlIiBoYXMgbm8gZmllbGQgbmFtZWQgJwotICAgICAgICAgICAgICAgICAgICAnInVua25vd25OYW1lIi4nKQotCi0gIGRlZiB0ZXN0RHVwbGljYXRlRmllbGQoc2VsZik6Ci0gICAgIyBEdXBsaWNhdGUga2V5IGNoZWNrIGlzIG5vdCBzdXBwb3J0ZWQgZm9yIHB5dGhvbjIuNgotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMiwgNyk6Ci0gICAgICByZXR1cm4KLSAgICBzZWxmLkNoZWNrRXJyb3IoJ3siaW50MzJWYWx1ZSI6IDEsXG4iaW50MzJWYWx1ZSI6Mn0nLAotICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIGxvYWQgSlNPTjogZHVwbGljYXRlIGtleSBpbnQzMlZhbHVlLicpCi0KLSAgZGVmIHRlc3RJbnZhbGlkQm9vbFZhbHVlKHNlbGYpOgotICAgIHNlbGYuQ2hlY2tFcnJvcigneyJib29sVmFsdWUiOiAxfScsCi0gICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgYm9vbFZhbHVlIGZpZWxkOiAnCi0gICAgICAgICAgICAgICAgICAgICdFeHBlY3RlZCB0cnVlIG9yIGZhbHNlIHdpdGhvdXQgcXVvdGVzLicpCi0gICAgc2VsZi5DaGVja0Vycm9yKCd7ImJvb2xWYWx1ZSI6ICJ0cnVlIn0nLAotICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGJvb2xWYWx1ZSBmaWVsZDogJwotICAgICAgICAgICAgICAgICAgICAnRXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZSB3aXRob3V0IHF1b3Rlcy4nKQotCi0gIGRlZiB0ZXN0SW52YWxpZEludGVnZXJWYWx1ZShzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TWVzc2FnZSgpCi0gICAgdGV4dCA9ICd7ImludDMyVmFsdWUiOiAweDEyMzQ1fScKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotICAgIHNlbGYuQ2hlY2tFcnJvcigneyJpbnQzMlZhbHVlIjogMDEyMzQ1fScsCi0gICAgICAgICAgICAgICAgICAgIChyJ0ZhaWxlZCB0byBsb2FkIEpTT046IEV4cGVjdGluZyBcJz8sXCc/IGRlbGltaXRlcjogJwotICAgICAgICAgICAgICAgICAgICAgcidsaW5lIDEuJykpCi0gICAgc2VsZi5DaGVja0Vycm9yKCd7ImludDMyVmFsdWUiOiAxLjB9JywKLSAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBpbnQzMlZhbHVlIGZpZWxkOiAnCi0gICAgICAgICAgICAgICAgICAgICdDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogMS4wLicpCi0gICAgc2VsZi5DaGVja0Vycm9yKCd7ImludDMyVmFsdWUiOiAiIDEgIn0nLAotICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGludDMyVmFsdWUgZmllbGQ6ICcKLSAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAiIDEgIi4nKQotICAgIHNlbGYuQ2hlY2tFcnJvcigneyJpbnQzMlZhbHVlIjogIjEgIn0nLAotICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGludDMyVmFsdWUgZmllbGQ6ICcKLSAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAiMSAiLicpCi0gICAgc2VsZi5DaGVja0Vycm9yKCd7ImludDMyVmFsdWUiOiAxMjM0NTY3ODkwMTIzNDU2Nzg5MH0nLAotICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGludDMyVmFsdWUgZmllbGQ6IFZhbHVlIG91dCBvZiByYW5nZTogJwotICAgICAgICAgICAgICAgICAgICAnMTIzNDU2Nzg5MDEyMzQ1Njc4OTAuJykKLSAgICBzZWxmLkNoZWNrRXJyb3IoJ3siaW50MzJWYWx1ZSI6IDFlNX0nLAotICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGludDMyVmFsdWUgZmllbGQ6ICcKLSAgICAgICAgICAgICAgICAgICAgJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAxMDAwMDAuMC4nKQotICAgIHNlbGYuQ2hlY2tFcnJvcigneyJ1aW50MzJWYWx1ZSI6IC0xfScsCi0gICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgdWludDMyVmFsdWUgZmllbGQ6ICcKLSAgICAgICAgICAgICAgICAgICAgJ1ZhbHVlIG91dCBvZiByYW5nZTogLTEuJykKLQotICBkZWYgdGVzdEludmFsaWRGbG9hdFZhbHVlKHNlbGYpOgotICAgIHNlbGYuQ2hlY2tFcnJvcigneyJmbG9hdFZhbHVlIjogIm5hbiJ9JywKLSAgICAgICAgICAgICAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSBmbG9hdFZhbHVlIGZpZWxkOiBDb3VsZG5cJ3QgJwotICAgICAgICAgICAgICAgICAgICAncGFyc2UgZmxvYXQgIm5hbiIsIHVzZSAiTmFOIiBpbnN0ZWFkLicpCi0KLSAgZGVmIHRlc3RJbnZhbGlkQnl0ZXNWYWx1ZShzZWxmKToKLSAgICBzZWxmLkNoZWNrRXJyb3IoJ3siYnl0ZXNWYWx1ZSI6ICJBUUkifScsCi0gICAgICAgICAgICAgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgYnl0ZXNWYWx1ZSBmaWVsZDogSW5jb3JyZWN0IHBhZGRpbmcuJykKLSAgICBzZWxmLkNoZWNrRXJyb3IoJ3siYnl0ZXNWYWx1ZSI6ICJBUUkqIn0nLAotICAgICAgICAgICAgICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGJ5dGVzVmFsdWUgZmllbGQ6IEluY29ycmVjdCBwYWRkaW5nLicpCi0KLSAgZGVmIHRlc3RJbnZhbGlkTWFwKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RNYXAoKQotICAgIHRleHQgPSAneyJpbnQzMk1hcCI6IHsibnVsbCI6IDIsICIyIjogM319JwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGludDMyTWFwIGZpZWxkOiBpbnZhbGlkIGxpdGVyYWwnLAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLSAgICB0ZXh0ID0gJ3siaW50MzJNYXAiOiB7MTogMiwgIjIiOiAzfX0nCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgIChyJ0ZhaWxlZCB0byBsb2FkIEpTT046IEV4cGVjdGluZyBwcm9wZXJ0eSBuYW1lJwotICAgICAgICAgcicoIGVuY2xvc2VkIGluIGRvdWJsZSBxdW90ZXMpPzogbGluZSAxJyksCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotICAgIHRleHQgPSAneyJib29sTWFwIjogeyJudWxsIjogMX19JwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIGJvb2xNYXAgZmllbGQ6IEV4cGVjdGVkICJ0cnVlIiBvciAiZmFsc2UiLCBub3QgbnVsbC4nLAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvIDwgKDIsIDcpOgotICAgICAgcmV0dXJuCi0gICAgdGV4dCA9IHIneyJzdHJpbmdNYXAiOiB7ImEiOiAzLCAiXHUwMDYxIjogMn19JwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAnRmFpbGVkIHRvIGxvYWQgSlNPTjogZHVwbGljYXRlIGtleSBhJywKLSAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0KLSAgZGVmIHRlc3RJbnZhbGlkVGltZXN0YW1wKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RUaW1lc3RhbXAoKQotICAgIHRleHQgPSAneyJ2YWx1ZSI6ICIxMDAwMC0wMS0wMVQwMDowMDowMC4wMFoifScKLSAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKLSAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgJ3RpbWUgZGF0YSBcJzEwMDAwLTAxLTAxVDAwOjAwOjAwXCcgZG9lcyBub3QgbWF0Y2gnCi0gICAgICAgICcgZm9ybWF0IFwnJVktJW0tJWRUJUg6JU06JVNcJy4nLAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLSAgICB0ZXh0ID0gJ3sidmFsdWUiOiAiMTk3MC0wMS0wMVQwMDowMDowMC4wMTIzNDU2Nzg5MDEyWiJ9JwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICB3ZWxsX2tub3duX3R5cGVzLlBhcnNlRXJyb3IsCi0gICAgICAgICduYW5vcyAwMTIzNDU2Nzg5MDEyIG1vcmUgdGhhbiA5IGZyYWN0aW9uYWwgZGlnaXRzLicsCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotICAgIHRleHQgPSAneyJ2YWx1ZSI6ICIxOTcyLTAxLTAxVDAxOjAwOjAwLjAxKzA4In0nCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgIHdlbGxfa25vd25fdHlwZXMuUGFyc2VFcnJvciwKLSAgICAgICAgKHInSW52YWxpZCB0aW1lem9uZSBvZmZzZXQgdmFsdWU6IFwrMDguJyksCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotICAgICMgVGltZSBzbWFsbGVyIHRoYW4gbWluaW11bSB0aW1lLgotICAgIHRleHQgPSAneyJ2YWx1ZSI6ICIwMDAwLTAxLTAxVDAwOjAwOjAwWiJ9JwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAnRmFpbGVkIHRvIHBhcnNlIHZhbHVlIGZpZWxkOiB5ZWFyIGlzIG91dCBvZiByYW5nZS4nLAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLSAgICAjIFRpbWUgYmlnZ2VyIHRoYW4gbWF4aW51bSB0aW1lLgotICAgIG1lc3NhZ2UudmFsdWUuc2Vjb25kcyA9IDI1MzQwMjMwMDgwMAotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBPdmVyZmxvd0Vycm9yLAotICAgICAgICAnZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UnLAotICAgICAgICBqc29uX2Zvcm1hdC5NZXNzYWdlVG9Kc29uLCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0SW52YWxpZE9uZW9mKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBqc29uX2Zvcm1hdF9wcm90bzNfcGIyLlRlc3RPbmVvZigpCi0gICAgdGV4dCA9ICd7Im9uZW9mSW50MzJWYWx1ZSI6IDEsICJvbmVvZlN0cmluZ1ZhbHVlIjogIjIifScKLSAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKLSAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgJ01lc3NhZ2UgdHlwZSAicHJvdG8zLlRlc3RPbmVvZiInCi0gICAgICAgICcgc2hvdWxkIG5vdCBoYXZlIG11bHRpcGxlICJvbmVvZl92YWx1ZSIgb25lb2YgZmllbGRzLicsCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0SW52YWxpZExpc3RWYWx1ZShzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0TGlzdFZhbHVlKCkKLSAgICB0ZXh0ID0gJ3sidmFsdWUiOiAxMjM0fScKLSAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKLSAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgcidGYWlsZWQgdG8gcGFyc2UgdmFsdWUgZmllbGQ6IExpc3RWYWx1ZSBtdXN0IGJlIGluIFxbXF0gd2hpY2ggaXMgMTIzNCcsCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0SW52YWxpZFN0cnVjdChzZWxmKToKLSAgICBtZXNzYWdlID0ganNvbl9mb3JtYXRfcHJvdG8zX3BiMi5UZXN0U3RydWN0KCkKLSAgICB0ZXh0ID0gJ3sidmFsdWUiOiAxMjM0fScKLSAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKLSAgICAgICAganNvbl9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgJ0ZhaWxlZCB0byBwYXJzZSB2YWx1ZSBmaWVsZDogU3RydWN0IG11c3QgYmUgaW4gYSBkaWN0IHdoaWNoIGlzIDEyMzQnLAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdEludmFsaWRBbnkoc2VsZik6Ci0gICAgbWVzc2FnZSA9IGFueV9wYjIuQW55KCkKLSAgICB0ZXh0ID0gJ3siQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9nb29nbGUucHJvdG9idWYuSW50MzJWYWx1ZSJ9JwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBLZXlFcnJvciwKLSAgICAgICAgJ3ZhbHVlJywKLSAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0gICAgdGV4dCA9ICd7InZhbHVlIjogMTIzNH0nCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgIGpzb25fZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICdAdHlwZSBpcyBtaXNzaW5nIHdoZW4gcGFyc2luZyBhbnkgbWVzc2FnZS4nLAotICAgICAgICBqc29uX2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLSAgICB0ZXh0ID0gJ3siQHR5cGUiOiAidHlwZS5nb29nbGVhcGlzLmNvbS9NZXNzYWdlTm90RXhpc3QiLCAidmFsdWUiOiAxMjM0fScKLSAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKLSAgICAgICAgVHlwZUVycm9yLAotICAgICAgICAnQ2FuIG5vdCBmaW5kIG1lc3NhZ2UgZGVzY3JpcHRvciBieSB0eXBlX3VybDogJwotICAgICAgICAndHlwZS5nb29nbGVhcGlzLmNvbS9NZXNzYWdlTm90RXhpc3QuJywKLSAgICAgICAganNvbl9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0gICAgIyBPbmx5IGxhc3QgcGFydCBpcyB0byBiZSB1c2VkOiBiLzI1NjMwMTEyCi0gICAgdGV4dCA9IChyJ3siQHR5cGUiOiAiaW5jb3JyZWN0Lmdvb2dsZWFwaXMuY29tL2dvb2dsZS5wcm90b2J1Zi5JbnQzMlZhbHVlIiwnCi0gICAgICAgICAgICByJyJ2YWx1ZSI6IDEyMzR9JykKLSAgICBqc29uX2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2ZhY3RvcnlfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9mYWN0b3J5X3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdiYjdkMWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2ZhY3RvcnlfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE5MCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYubWVzc2FnZV9mYWN0b3J5LiIiIgotCi1fX2F1dGhvcl9fID0gJ21hdHRoZXd0b2lhQGdvb2dsZS5jb20gKE1hdHQgVG9pYSknCi0KLXRyeToKLSAgaW1wb3J0IHVuaXR0ZXN0MiBhcyB1bml0dGVzdCAgI1BZMjYKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgaW1wb3J0IHVuaXR0ZXN0Ci0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGZhY3RvcnlfdGVzdDFfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZmFjdG9yeV90ZXN0Ml9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX2RhdGFiYXNlCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wb29sCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZV9mYWN0b3J5Ci0KLQotY2xhc3MgTWVzc2FnZUZhY3RvcnlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgc2VsZi5mYWN0b3J5X3Rlc3QxX2ZkID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAotICAgICAgICBmYWN0b3J5X3Rlc3QxX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCi0gICAgc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by5Gcm9tU3RyaW5nKAotICAgICAgICBmYWN0b3J5X3Rlc3QyX3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIpCi0KLSAgZGVmIF9FeGVyY2lzZUR5bmFtaWNDbGFzcyhzZWxmLCBjbHMpOgotICAgIG1zZyA9IGNscygpCi0gICAgbXNnLm1hbmRhdG9yeSA9IDQyCi0gICAgbXNnLm5lc3RlZF9mYWN0b3J5XzJfZW51bSA9IDAKLSAgICBtc2cubmVzdGVkX2ZhY3RvcnlfMl9tZXNzYWdlLnZhbHVlID0gJ25lc3RlZCBtZXNzYWdlIHZhbHVlJwotICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5mYWN0b3J5XzFfZW51bSA9IDEKLSAgICBtc2cuZmFjdG9yeV8xX21lc3NhZ2UubmVzdGVkX2ZhY3RvcnlfMV9lbnVtID0gMAotICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5uZXN0ZWRfZmFjdG9yeV8xX21lc3NhZ2UudmFsdWUgPSAoCi0gICAgICAgICduZXN0ZWQgbWVzc2FnZSB2YWx1ZScpCi0gICAgbXNnLmZhY3RvcnlfMV9tZXNzYWdlLnNjYWxhcl92YWx1ZSA9IDIyCi0gICAgbXNnLmZhY3RvcnlfMV9tZXNzYWdlLmxpc3RfdmFsdWUuZXh0ZW5kKFt1J29uZScsIHUndHdvJywgdSd0aHJlZSddKQotICAgIG1zZy5mYWN0b3J5XzFfbWVzc2FnZS5saXN0X3ZhbHVlLmFwcGVuZCh1J2ZvdXInKQotICAgIG1zZy5mYWN0b3J5XzFfZW51bSA9IDEKLSAgICBtc2cubmVzdGVkX2ZhY3RvcnlfMV9lbnVtID0gMAotICAgIG1zZy5uZXN0ZWRfZmFjdG9yeV8xX21lc3NhZ2UudmFsdWUgPSAnbmVzdGVkIG1lc3NhZ2UgdmFsdWUnCi0gICAgbXNnLmNpcmN1bGFyX21lc3NhZ2UubWFuZGF0b3J5ID0gMQotICAgIG1zZy5jaXJjdWxhcl9tZXNzYWdlLmNpcmN1bGFyX21lc3NhZ2UubWFuZGF0b3J5ID0gMgotICAgIG1zZy5jaXJjdWxhcl9tZXNzYWdlLnNjYWxhcl92YWx1ZSA9ICdvbmUgZGVlcCcKLSAgICBtc2cuc2NhbGFyX3ZhbHVlID0gJ3plcm8gZGVlcCcKLSAgICBtc2cubGlzdF92YWx1ZS5leHRlbmQoW3UnZm91cicsIHUndGhyZWUnLCB1J3R3byddKQotICAgIG1zZy5saXN0X3ZhbHVlLmFwcGVuZCh1J29uZScpCi0gICAgbXNnLmdyb3VwZWQuYWRkKCkKLSAgICBtc2cuZ3JvdXBlZFswXS5wYXJ0XzEgPSAnaGVsbG8nCi0gICAgbXNnLmdyb3VwZWRbMF0ucGFydF8yID0gJ3dvcmxkJwotICAgIG1zZy5ncm91cGVkLmFkZChwYXJ0XzE9J3Rlc3RpbmcnLCBwYXJ0XzI9JzEyMycpCi0gICAgbXNnLmxvb3AubG9vcC5tYW5kYXRvcnkgPSAyCi0gICAgbXNnLmxvb3AubG9vcC5sb29wLmxvb3AubWFuZGF0b3J5ID0gNAotICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIGNvbnZlcnRlZCA9IGZhY3RvcnlfdGVzdDJfcGIyLkZhY3RvcnkyTWVzc2FnZS5Gcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0gICAgcmVzZXJpYWxpemVkID0gY29udmVydGVkLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlcmlhbGl6ZWQsIHJlc2VyaWFsaXplZCkKLSAgICByZXN1bHQgPSBjbHMuRnJvbVN0cmluZyhyZXNlcmlhbGl6ZWQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIHJlc3VsdCkKLQotICBkZWYgdGVzdEdldFByb3RvdHlwZShzZWxmKToKLSAgICBkYiA9IGRlc2NyaXB0b3JfZGF0YWJhc2UuRGVzY3JpcHRvckRhdGFiYXNlKCkKLSAgICBwb29sID0gZGVzY3JpcHRvcl9wb29sLkRlc2NyaXB0b3JQb29sKGRiKQotICAgIGRiLkFkZChzZWxmLmZhY3RvcnlfdGVzdDFfZmQpCi0gICAgZGIuQWRkKHNlbGYuZmFjdG9yeV90ZXN0Ml9mZCkKLSAgICBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KCkKLSAgICBjbHMgPSBmYWN0b3J5LkdldFByb3RvdHlwZShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKLSAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShjbHMgaXMgZmFjdG9yeV90ZXN0Ml9wYjIuRmFjdG9yeTJNZXNzYWdlKQotICAgIHNlbGYuX0V4ZXJjaXNlRHluYW1pY0NsYXNzKGNscykKLSAgICBjbHMyID0gZmFjdG9yeS5HZXRQcm90b3R5cGUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCi0gICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShjbHMgaXMgY2xzMikKLQotICBkZWYgdGVzdEdldE1lc3NhZ2VzKHNlbGYpOgotICAgICMgcGVyZm9ybWVkIHR3aWNlIGJlY2F1c2UgbXVsdGlwbGUgY2FsbHMgd2l0aCB0aGUgc2FtZSBpbnB1dCBtdXN0IGJlIGFsbG93ZWQKLSAgICBmb3IgXyBpbiByYW5nZSgyKToKLSAgICAgIG1lc3NhZ2VzID0gbWVzc2FnZV9mYWN0b3J5LkdldE1lc3NhZ2VzKFtzZWxmLmZhY3RvcnlfdGVzdDFfZmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5mYWN0b3J5X3Rlc3QyX2ZkXSkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgICBzZXQoWydnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZScsCi0gICAgICAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MU1lc3NhZ2UnXSwKLSAgICAgICAgICAgICApLmlzc3Vic2V0KHNldChtZXNzYWdlcy5rZXlzKCkpKSkKLSAgICAgIHNlbGYuX0V4ZXJjaXNlRHluYW1pY0NsYXNzKAotICAgICAgICAgIG1lc3NhZ2VzWydnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLkZhY3RvcnkyTWVzc2FnZSddKQotICAgICAgc2VsZi5hc3NlcnRUcnVlKAotICAgICAgICAgIHNldChbJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLm9uZV9tb3JlX2ZpZWxkJywKLSAgICAgICAgICAgICAgICdnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsLmFub3RoZXJfZmllbGQnXSwKLSAgICAgICAgICAgICApLmlzc3Vic2V0KAotICAgICAgICAgICAgICAgICBzZXQobWVzc2FnZXNbJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlJ10KLSAgICAgICAgICAgICAgICAgICAgIC5fZXh0ZW5zaW9uc19ieV9uYW1lLmtleXMoKSkpKQotICAgICAgZmFjdG9yeV9tc2cxID0gbWVzc2FnZXNbJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTFNZXNzYWdlJ10KLSAgICAgIG1zZzEgPSBtZXNzYWdlc1snZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5GYWN0b3J5MU1lc3NhZ2UnXSgpCi0gICAgICBleHQxID0gZmFjdG9yeV9tc2cxLl9leHRlbnNpb25zX2J5X25hbWVbCi0gICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRmFjdG9yeTJNZXNzYWdlLm9uZV9tb3JlX2ZpZWxkJ10KLSAgICAgIGV4dDIgPSBmYWN0b3J5X21zZzEuX2V4dGVuc2lvbnNfYnlfbmFtZVsKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbC5hbm90aGVyX2ZpZWxkJ10KLSAgICAgIG1zZzEuRXh0ZW5zaW9uc1tleHQxXSA9ICd0ZXN0MScKLSAgICAgIG1zZzEuRXh0ZW5zaW9uc1tleHQyXSA9ICd0ZXN0MicKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3Rlc3QxJywgbXNnMS5FeHRlbnNpb25zW2V4dDFdKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbCgndGVzdDInLCBtc2cxLkV4dGVuc2lvbnNbZXh0Ml0pCi0KLSAgZGVmIHRlc3REdXBsaWNhdGVFeHRlbnNpb25OdW1iZXIoc2VsZik6Ci0gICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCi0gICAgZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeS5NZXNzYWdlRmFjdG9yeShwb29sPXBvb2wpCi0KLSAgICAjIEFkZCBDb250YWluZXIgbWVzc2FnZS4KLSAgICBmID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCi0gICAgZi5uYW1lID0gJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXIucHJvdG8nCi0gICAgZi5wYWNrYWdlID0gJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwnCi0gICAgbXNnID0gZi5tZXNzYWdlX3R5cGUuYWRkKCkKLSAgICBtc2cubmFtZSA9ICdDb250YWluZXInCi0gICAgcm5nID0gbXNnLmV4dGVuc2lvbl9yYW5nZS5hZGQoKQotICAgIHJuZy5zdGFydCA9IDEKLSAgICBybmcuZW5kID0gMTAKLSAgICBwb29sLkFkZChmKQotICAgIG1zZ3MgPSBmYWN0b3J5LkdldE1lc3NhZ2VzKFtmLm5hbWVdKQotICAgIHNlbGYuYXNzZXJ0SW4oJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuQ29udGFpbmVyJywgbXNncykKLQotICAgICMgRXh0ZW5kIGNvbnRhaW5lci4KLSAgICBmID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCi0gICAgZi5uYW1lID0gJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9leHRlbnNpb24ucHJvdG8nCi0gICAgZi5wYWNrYWdlID0gJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwnCi0gICAgZi5kZXBlbmRlbmN5LmFwcGVuZCgnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lci5wcm90bycpCi0gICAgbXNnID0gZi5tZXNzYWdlX3R5cGUuYWRkKCkKLSAgICBtc2cubmFtZSA9ICdFeHRlbnNpb24nCi0gICAgZXh0ID0gbXNnLmV4dGVuc2lvbi5hZGQoKQotICAgIGV4dC5uYW1lID0gJ2V4dGVuc2lvbl9maWVsZCcKLSAgICBleHQubnVtYmVyID0gMgotICAgIGV4dC5sYWJlbCA9IGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLkxBQkVMX09QVElPTkFMCi0gICAgZXh0LnR5cGVfbmFtZSA9ICdFeHRlbnNpb24nCi0gICAgZXh0LmV4dGVuZGVlID0gJ0NvbnRhaW5lcicKLSAgICBwb29sLkFkZChmKQotICAgIG1zZ3MgPSBmYWN0b3J5LkdldE1lc3NhZ2VzKFtmLm5hbWVdKQotICAgIHNlbGYuYXNzZXJ0SW4oJ2dvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuRXh0ZW5zaW9uJywgbXNncykKLQotICAgICMgQWRkIER1cGxpY2F0ZSBleHRlbmRpbmcgdGhlIHNhbWUgZmllbGQgbnVtYmVyLgotICAgIGYgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKLSAgICBmLm5hbWUgPSAnZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2R1cGxpY2F0ZS5wcm90bycKLSAgICBmLnBhY2thZ2UgPSAnZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbCcKLSAgICBmLmRlcGVuZGVuY3kuYXBwZW5kKCdnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY29udGFpbmVyLnByb3RvJykKLSAgICBtc2cgPSBmLm1lc3NhZ2VfdHlwZS5hZGQoKQotICAgIG1zZy5uYW1lID0gJ0R1cGxpY2F0ZScKLSAgICBleHQgPSBtc2cuZXh0ZW5zaW9uLmFkZCgpCi0gICAgZXh0Lm5hbWUgPSAnZXh0ZW5zaW9uX2ZpZWxkJwotICAgIGV4dC5udW1iZXIgPSAyCi0gICAgZXh0LmxhYmVsID0gZGVzY3JpcHRvcl9wYjIuRmllbGREZXNjcmlwdG9yUHJvdG8uTEFCRUxfT1BUSU9OQUwKLSAgICBleHQudHlwZV9uYW1lID0gJ0R1cGxpY2F0ZScKLSAgICBleHQuZXh0ZW5kZWUgPSAnQ29udGFpbmVyJwotICAgIHBvb2wuQWRkKGYpCi0KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEV4Y2VwdGlvbikgYXMgY206Ci0gICAgICBmYWN0b3J5LkdldE1lc3NhZ2VzKFtmLm5hbWVdKQotCi0gICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGNtLmV4Y2VwdGlvbiwgKEFzc2VydGlvbkVycm9yLCBWYWx1ZUVycm9yKSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMGZjMjU1YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfbGlzdGVuZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3OCArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkRlZmluZXMgYSBsaXN0ZW5lciBpbnRlcmZhY2UgZm9yIG9ic2VydmluZyBjZXJ0YWluCi1zdGF0ZSB0cmFuc2l0aW9ucyBvbiBNZXNzYWdlIG9iamVjdHMuCi0KLUFsc28gZGVmaW5lcyBhIG51bGwgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcmZhY2UuCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotCi1jbGFzcyBNZXNzYWdlTGlzdGVuZXIob2JqZWN0KToKLQotICAiIiJMaXN0ZW5zIGZvciBtb2RpZmljYXRpb25zIG1hZGUgdG8gYSBtZXNzYWdlLiAgTWVhbnQgdG8gYmUgcmVnaXN0ZXJlZCB2aWEKLSAgTWVzc2FnZS5fU2V0TGlzdGVuZXIoKS4KLQotICBBdHRyaWJ1dGVzOgotICAgIGRpcnR5OiAgSWYgVHJ1ZSwgdGhlbiBjYWxsaW5nIE1vZGlmaWVkKCkgd291bGQgYmUgYSBuby1vcC4gIFRoaXMgY2FuIGJlCi0gICAgICAgICAgICB1c2VkIHRvIGF2b2lkIHRoZXNlIGNhbGxzIGVudGlyZWx5IGluIHRoZSBjb21tb24gY2FzZS4KLSAgIiIiCi0KLSAgZGVmIE1vZGlmaWVkKHNlbGYpOgotICAgICIiIkNhbGxlZCBldmVyeSB0aW1lIHRoZSBtZXNzYWdlIGlzIG1vZGlmaWVkIGluIHN1Y2ggYSB3YXkgdGhhdCB0aGUgcGFyZW50Ci0gICAgbWVzc2FnZSBtYXkgbmVlZCB0byBiZSB1cGRhdGVkLiAgVGhpcyBjdXJyZW50bHkgbWVhbnMgZWl0aGVyOgotICAgIChhKSBUaGUgbWVzc2FnZSB3YXMgbW9kaWZpZWQgZm9yIHRoZSBmaXJzdCB0aW1lLCBzbyB0aGUgcGFyZW50IG1lc3NhZ2UKLSAgICAgICAgc2hvdWxkIGhlbmNlZm9ydGggbWFyayB0aGUgbWVzc2FnZSBhcyBwcmVzZW50LgotICAgIChiKSBUaGUgbWVzc2FnZSdzIGNhY2hlZCBieXRlIHNpemUgYmVjYW1lIGRpcnR5IC0tIGkuZS4gdGhlIG1lc3NhZ2Ugd2FzCi0gICAgICAgIG1vZGlmaWVkIGZvciB0aGUgZmlyc3QgdGltZSBhZnRlciBhIHByZXZpb3VzIGNhbGwgdG8gQnl0ZVNpemUoKS4KLSAgICAgICAgVGhlcmVmb3JlIHRoZSBwYXJlbnQgc2hvdWxkIGFsc28gbWFyayBpdHMgYnl0ZSBzaXplIGFzIGRpcnR5LgotICAgIE5vdGUgdGhhdCAoYSkgaW1wbGllcyAoYiksIHNpbmNlIG5ldyBvYmplY3RzIHN0YXJ0IG91dCB3aXRoIGEgY2xpZW50IGNhY2hlZAotICAgIHNpemUgKHplcm8pLiAgSG93ZXZlciwgd2UgZG9jdW1lbnQgKGEpIGV4cGxpY2l0bHkgYmVjYXVzZSBpdCBpcyBpbXBvcnRhbnQuCi0KLSAgICBNb2RpZmllZCgpIHdpbGwgKm9ubHkqIGJlIGNhbGxlZCBpbiByZXNwb25zZSB0byBvbmUgb2YgdGhlc2UgdHdvIGV2ZW50cyAtLQotICAgIG5vdCBldmVyeSB0aW1lIHRoZSBzdWItbWVzc2FnZSBpcyBtb2RpZmllZC4KLQotICAgIE5vdGUgdGhhdCBpZiB0aGUgbGlzdGVuZXIncyB8ZGlydHl8IGF0dHJpYnV0ZSBpcyB0cnVlLCB0aGVuIGNhbGxpbmcKLSAgICBNb2RpZmllZCBhdCB0aGUgbW9tZW50IHdvdWxkIGJlIGEgbm8tb3AsIHNvIGl0IGNhbiBiZSBza2lwcGVkLiAgUGVyZm9ybWFuY2UtCi0gICAgc2Vuc2l0aXZlIGNhbGxlcnMgc2hvdWxkIGNoZWNrIHRoaXMgYXR0cmlidXRlIGRpcmVjdGx5IGJlZm9yZSBjYWxsaW5nIHNpbmNlCi0gICAgaXQgd2lsbCBiZSB0cnVlIG1vc3Qgb2YgdGhlIHRpbWUuCi0gICAgIiIiCi0KLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLQotY2xhc3MgTnVsbE1lc3NhZ2VMaXN0ZW5lcihvYmplY3QpOgotCi0gICIiIk5vLW9wIE1lc3NhZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbi4iIiIKLQotICBkZWYgTW9kaWZpZWQoc2VsZik6Ci0gICAgcGFzcwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3NldF9leHRlbnNpb25zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3NldF9leHRlbnNpb25zLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNGU1ZjE5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9zZXRfZXh0ZW5zaW9ucy5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDc0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgbWVzc2FnZXMgdGhhdCBleHRlbmQgTWVzc2FnZVNldC4KLQotc3ludGF4ID0gInByb3RvMiI7Ci1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbDsKLQotCi0vLyBBIG1lc3NhZ2Ugd2l0aCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdC4KLW1lc3NhZ2UgVGVzdE1lc3NhZ2VTZXQgewotICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlOwotICBleHRlbnNpb25zIDQgdG8gbWF4OwotfQotCi1tZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSB7Ci0gIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7Ci0gICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDk4NDE4NjAzOwotICB9Ci0gIG9wdGlvbmFsIGludDMyIGkgPSAxNTsKLX0KLQotbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgewotICBleHRlbmQgVGVzdE1lc3NhZ2VTZXQgewotICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlX3NldF9leHRlbnNpb24gPSA5ODQxODYzNDsKLSAgfQotICBvcHRpb25hbCBzdHJpbmcgc3RyID0gMjU7Ci19Ci0KLW1lc3NhZ2UgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24zIHsKLSAgb3B0aW9uYWwgc3RyaW5nIHRleHQgPSAzNTsKLX0KLQotZXh0ZW5kIFRlc3RNZXNzYWdlU2V0IHsKLSAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24zIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbjMgPSA5ODQxODY1NTsKLX0KLQotLy8gVGhpcyBtZXNzYWdlIHdhcyB1c2VkIHRvIGdlbmVyYXRlCi0vLyAvL25ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL3Rlc3RkYXRhL21lc3NhZ2Vfc2V0X21lc3NhZ2UsIGJ1dCBpcyBjb21tZW50ZWQKLS8vIG91dCBzaW5jZSBpdCBtdXN0IG5vdCBhY3R1YWxseSBleGlzdCBpbiBjb2RlLCB0byBzaW11bGF0ZSBhbiAidW5rbm93biIKLS8vIGV4dGVuc2lvbi4KLS8vIG1lc3NhZ2UgVGVzdE1lc3NhZ2VTZXRVbmtub3duRXh0ZW5zaW9uIHsKLS8vICAgZXh0ZW5kIFRlc3RNZXNzYWdlU2V0IHsKLS8vICAgICBvcHRpb25hbCBUZXN0TWVzc2FnZVNldFVua25vd25FeHRlbnNpb24gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uID0gNTYxNDE0MjE7Ci0vLyAgIH0KLS8vICAgb3B0aW9uYWwgaW50NjQgYSA9IDE7Ci0vLyB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA0ZWUzMWQ4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTg1MiArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3RzIHB5dGhvbiBwcm90b2NvbCBidWZmZXJzIGFnYWluc3QgdGhlIGdvbGRlbiBtZXNzYWdlLgotCi1Ob3RlIHRoYXQgdGhlIGdvbGRlbiBtZXNzYWdlcyBleGVyY2lzZSBldmVyeSBrbm93biBmaWVsZCB0eXBlLCB0aHVzIHRoaXMKLXRlc3QgZW5kcyB1cCBleGVyY2lzaW5nIGFuZCB2ZXJpZnlpbmcgbmVhcmx5IGFsbCBvZiB0aGUgcGFyc2luZyBhbmQKLXNlcmlhbGl6YXRpb24gY29kZSBpbiB0aGUgd2hvbGUgbGlicmFyeS4KLQotVE9ETyhrZW50b24pOiAgTWVyZ2Ugd2l0aCB3aXJlX2Zvcm1hdF90ZXN0PyAgSXQgZG9lc24ndCBtYWtlIGEgd2hvbGUgbG90IG9mCi1zZW5zZSB0byBjYWxsIHRoaXMgYSB0ZXN0IG9mIHRoZSAibWVzc2FnZSIgbW9kdWxlLCB3aGljaCBvbmx5IGRlY2xhcmVzIGFuCi1hYnN0cmFjdCBpbnRlcmZhY2UuCi0iIiIKLQotX19hdXRob3JfXyA9ICdncHNAZ29vZ2xlLmNvbSAoR3JlZ29yeSBQLiBTbWl0aCknCi0KLQotaW1wb3J0IGNvbGxlY3Rpb25zCi1pbXBvcnQgY29weQotaW1wb3J0IG1hdGgKLWltcG9ydCBvcGVyYXRvcgotaW1wb3J0IHBpY2tsZQotaW1wb3J0IHNpeAotaW1wb3J0IHN5cwotCi10cnk6Ci0gIGltcG9ydCB1bml0dGVzdDIgYXMgdW5pdHRlc3QgICNQWTI2Ci1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gIGltcG9ydCB1bml0dGVzdAotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWFwX3VuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2VfZmFjdG9yeQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Ci1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgcGFja2VkX2ZpZWxkX3Rlc3RfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IF9wYXJhbWV0ZXJpemVkCi0KLWlmIHNpeC5QWTM6Ci0gIGxvbmcgPSBpbnQKLQotCi0jIFB5dGhvbiBwcmUtMi42IGRvZXMgbm90IGhhdmUgaXNpbmYoKSBvciBpc25hbigpIGZ1bmN0aW9ucywgc28gd2UgaGF2ZQotIyB0byBwcm92aWRlIG91ciBvd24uCi1kZWYgaXNuYW4odmFsKToKLSAgIyBOYU4gaXMgbmV2ZXIgZXF1YWwgdG8gaXRzZWxmLgotICByZXR1cm4gdmFsICE9IHZhbAotZGVmIGlzaW5mKHZhbCk6Ci0gICMgSW5maW5pdHkgdGltZXMgemVybyBlcXVhbHMgTmFOLgotICByZXR1cm4gbm90IGlzbmFuKHZhbCkgYW5kIGlzbmFuKHZhbCAqIDApCi1kZWYgSXNQb3NJbmYodmFsKToKLSAgcmV0dXJuIGlzaW5mKHZhbCkgYW5kICh2YWwgPiAwKQotZGVmIElzTmVnSW5mKHZhbCk6Ci0gIHJldHVybiBpc2luZih2YWwpIGFuZCAodmFsIDwgMCkKLQotCi1AX3BhcmFtZXRlcml6ZWQuUGFyYW1ldGVycygKLSAgICAodW5pdHRlc3RfcGIyKSwKLSAgICAodW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMikpCi1jbGFzcyBNZXNzYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RCYWRVdGY4U3RyaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgotICAgICAgc2VsZi5za2lwVGVzdCgiU2tpcHBpbmcgdGVzdEJhZFV0ZjhTdHJpbmcsIGN1cnJlbnRseSBvbmx5IHRoZSBweXRob24gIgotICAgICAgICAgICAgICAgICAgICAiYXBpIGltcGxlbWVudGF0aW9uIHJhaXNlcyBVbmljb2RlRGVjb2RlRXJyb3Igd2hlbiBhICIKLSAgICAgICAgICAgICAgICAgICAgInN0cmluZyBmaWVsZCBjb250YWlucyBiYWQgdXRmLTguIikKLSAgICBiYWRfdXRmOF9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGVEYXRhKCdiYWRfdXRmOF9zdHJpbmcnKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVW5pY29kZURlY29kZUVycm9yKSBhcyBjb250ZXh0OgotICAgICAgbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzLkZyb21TdHJpbmcoYmFkX3V0ZjhfZGF0YSkKLSAgICBzZWxmLmFzc2VydEluKCdUZXN0QWxsVHlwZXMub3B0aW9uYWxfc3RyaW5nJywgc3RyKGNvbnRleHQuZXhjZXB0aW9uKSkKLQotICBkZWYgdGVzdEdvbGRlbk1lc3NhZ2Uoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgICMgUHJvdG8zIGRvZXNuJ3QgaGF2ZSB0aGUgImRlZmF1bHRfZm9vIiBtZW1iZXJzIG9yIGZvcmVpZ24gZW51bXMsCi0gICAgIyBhbmQgZG9lc24ndCBwcmVzZXJ2ZSB1bmtub3duIGZpZWxkcywgc28gZm9yIHByb3RvMyB3ZSB1c2UgYSBnb2xkZW4KLSAgICAjIG1lc3NhZ2UgdGhhdCBkb2Vzbid0IGhhdmUgdGhlc2UgZmllbGRzIHNldC4KLSAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6Ci0gICAgICBnb2xkZW5fZGF0YSA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlRGF0YSgKLSAgICAgICAgICAnZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQnKQotICAgIGVsc2U6Ci0gICAgICBnb2xkZW5fZGF0YSA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlRGF0YSgnZ29sZGVuX21lc3NhZ2VfcHJvdG8zJykKLQotICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgotICAgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc1NldChzZWxmLCBnb2xkZW5fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIGdvbGRlbl9jb3B5ID0gY29weS5kZWVwY29weShnb2xkZW5fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fY29weS5TZXJpYWxpemVUb1N0cmluZygpKQotCi0gIGRlZiB0ZXN0R29sZGVuUGFja2VkTWVzc2FnZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgZ29sZGVuX2RhdGEgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZURhdGEoJ2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UnKQotICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdFBhY2tlZFR5cGVzKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgYWxsX3NldCA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhhbGxfc2V0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsX3NldCwgZ29sZGVuX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChnb2xkZW5fZGF0YSwgYWxsX3NldC5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIGdvbGRlbl9jb3B5ID0gY29weS5kZWVwY29weShnb2xkZW5fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fY29weS5TZXJpYWxpemVUb1N0cmluZygpKQotCi0gIGRlZiB0ZXN0UGlja2xlU3VwcG9ydChzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgZ29sZGVuX2RhdGEgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZURhdGEoJ2dvbGRlbl9tZXNzYWdlJykKLSAgICBnb2xkZW5fbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIHBpY2tsZWRfbWVzc2FnZSA9IHBpY2tsZS5kdW1wcyhnb2xkZW5fbWVzc2FnZSkKLQotICAgIHVucGlja2xlZF9tZXNzYWdlID0gcGlja2xlLmxvYWRzKHBpY2tsZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVucGlja2xlZF9tZXNzYWdlLCBnb2xkZW5fbWVzc2FnZSkKLQotICBkZWYgdGVzdFBvc2l0aXZlSW5maW5pdHkoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIGlmIG1lc3NhZ2VfbW9kdWxlIGlzIHVuaXR0ZXN0X3BiMjoKLSAgICAgIGdvbGRlbl9kYXRhID0gKGInXHg1RFx4MDBceDAwXHg4MFx4N0YnCi0gICAgICAgICAgICAgICAgICAgICBiJ1x4NjFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHg3RicKLSAgICAgICAgICAgICAgICAgICAgIGInXHhDRFx4MDJceDAwXHgwMFx4ODBceDdGJwotICAgICAgICAgICAgICAgICAgICAgYidceEQxXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJykKLSAgICBlbHNlOgotICAgICAgZ29sZGVuX2RhdGEgPSAoYidceDVEXHgwMFx4MDBceDgwXHg3RicKLSAgICAgICAgICAgICAgICAgICAgIGInXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJwotICAgICAgICAgICAgICAgICAgICAgYidceENBXHgwMlx4MDRceDAwXHgwMFx4ODBceDdGJwotICAgICAgICAgICAgICAgICAgICAgYidceEQyXHgwMlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHg3RicpCi0KLSAgICBnb2xkZW5fbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9mbG9hdCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKSkKLSAgICBzZWxmLmFzc2VydFRydWUoSXNQb3NJbmYoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotCi0gIGRlZiB0ZXN0TmVnYXRpdmVJbmZpbml0eShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgotICAgICAgZ29sZGVuX2RhdGEgPSAoYidceDVEXHgwMFx4MDBceDgwXHhGRicKLSAgICAgICAgICAgICAgICAgICAgIGInXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceEZGJwotICAgICAgICAgICAgICAgICAgICAgYidceENEXHgwMlx4MDBceDAwXHg4MFx4RkYnCi0gICAgICAgICAgICAgICAgICAgICBiJ1x4RDFceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQotICAgIGVsc2U6Ci0gICAgICBnb2xkZW5fZGF0YSA9IChiJ1x4NURceDAwXHgwMFx4ODBceEZGJwotICAgICAgICAgICAgICAgICAgICAgYidceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnCi0gICAgICAgICAgICAgICAgICAgICBiJ1x4Q0FceDAyXHgwNFx4MDBceDAwXHg4MFx4RkYnCi0gICAgICAgICAgICAgICAgICAgICBiJ1x4RDJceDAyXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceEZGJykKLQotICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzTmVnSW5mKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KSkKLSAgICBzZWxmLmFzc2VydFRydWUoSXNOZWdJbmYoZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKSkKLSAgICBzZWxmLmFzc2VydFRydWUoSXNOZWdJbmYoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLSAgZGVmIHRlc3ROb3RBTnVtYmVyKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBnb2xkZW5fZGF0YSA9IChiJ1x4NURceDAwXHgwMFx4QzBceDdGJwotICAgICAgICAgICAgICAgICAgIGInXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJwotICAgICAgICAgICAgICAgICAgIGInXHhDRFx4MDJceDAwXHgwMFx4QzBceDdGJwotICAgICAgICAgICAgICAgICAgIGInXHhEMVx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicpCi0gICAgZ29sZGVuX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkpCi0KLSAgICAjIFRoZSBwcm90b2NvbCBidWZmZXIgbWF5IHNlcmlhbGl6ZSB0byBhbnkgb25lIG9mIG11bHRpcGxlIGRpZmZlcmVudAotICAgICMgcmVwcmVzZW50YXRpb25zIG9mIGEgTmFOLiAgUmF0aGVyIHRoYW4gdmVyaWZ5IGEgc3BlY2lmaWMgcmVwcmVzZW50YXRpb24sCi0gICAgIyB2ZXJpZnkgdGhlIHNlcmlhbGl6ZWQgc3RyaW5nIGNhbiBiZSBjb252ZXJ0ZWQgaW50byBhIGNvcnJlY3RseQotICAgICMgYmVoYXZpbmcgcHJvdG9jb2wgYnVmZmVyLgotICAgIHNlcmlhbGl6ZWQgPSBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5vcHRpb25hbF9mbG9hdCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdKSkKLQotICBkZWYgdGVzdFBvc2l0aXZlSW5maW5pdHlQYWNrZWQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIGdvbGRlbl9kYXRhID0gKGInXHhBMlx4MDZceDA0XHgwMFx4MDBceDgwXHg3RicKLSAgICAgICAgICAgICAgICAgICBiJ1x4QUFceDA2XHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJykKLSAgICBnb2xkZW5fbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZmxvYXRbMF0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotCi0gIGRlZiB0ZXN0TmVnYXRpdmVJbmZpbml0eVBhY2tlZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgZ29sZGVuX2RhdGEgPSAoYidceEEyXHgwNlx4MDRceDAwXHgwMFx4ODBceEZGJwotICAgICAgICAgICAgICAgICAgIGInXHhBQVx4MDZceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQotICAgIGdvbGRlbl9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdFBhY2tlZFR5cGVzKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzTmVnSW5mKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9mbG9hdFswXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzTmVnSW5mKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9kb3VibGVbMF0pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLSAgZGVmIHRlc3ROb3RBTnVtYmVyUGFja2VkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBnb2xkZW5fZGF0YSA9IChiJ1x4QTJceDA2XHgwNFx4MDBceDAwXHhDMFx4N0YnCi0gICAgICAgICAgICAgICAgICAgYidceEFBXHgwNlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicpCi0gICAgZ29sZGVuX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0UGFja2VkVHlwZXMoKQotICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2UucGFja2VkX2Zsb2F0WzBdKSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2UucGFja2VkX2RvdWJsZVswXSkpCi0KLSAgICBzZXJpYWxpemVkID0gZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0UGFja2VkVHlwZXMoKQotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKG1lc3NhZ2UucGFja2VkX2Zsb2F0WzBdKSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4obWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKLQotICBkZWYgdGVzdEV4dHJlbWVGbG9hdFZhbHVlcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0KLSAgICAjIE1vc3QgcG9zaXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgotICAgIGtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAxMjcpCi0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IGtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0ga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cykKLQotICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgb25lIHNpZ25pZmljYW5kIGJpdCBzZXQuCi0gICAga01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdCA9IDEuNSAqIG1hdGgucG93KDIsIDEyNykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0ga01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdAotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0KQotCi0gICAgIyBSZXBlYXQgbGFzdCB0d28gY2FzZXMgd2l0aCB2YWx1ZXMgb2Ygc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMpCi0KLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgotICAgIGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAtMTI3KQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCi0KLSAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgotICAgIGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAtMTI3KQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0Ci0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiB0aGUgc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCi0KLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgZGVmIHRlc3RFeHRyZW1lRG91YmxlVmFsdWVzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLQotICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgbm8gc2lnbmlmaWNhbmQgYml0cyBzZXQuCi0gICAga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cyA9IG1hdGgucG93KDIsIDEwMjMpCi0gICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQotCi0gICAgIyBNb3N0IHBvc2l0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KLSAgICBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgMTAyMykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiBzYW1lIG1hZ25pdHVkZSwgYnV0IG5lZ2F0aXZlLgotICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQotCi0gICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSAta01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdAotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPT0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgotICAgIGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAtMTAyMykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCi0KLSAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgotICAgIGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAtMTAyMykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiB0aGUgc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSAta01vc3ROZWdFeHBvbmVudE5vU2lnQml0cykKLQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQotCi0gIGRlZiB0ZXN0RmxvYXRQcmludGluZyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IDIuMAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKG1lc3NhZ2UpLCAnb3B0aW9uYWxfZmxvYXQ6IDIuMFxuJykKLQotICBkZWYgdGVzdEhpZ2hQcmVjaXNpb25GbG9hdFByaW50aW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IDAuMTIzNDU2Nzg5MTIzNDU2NzgKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgzLCk6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihtZXNzYWdlKSwgJ29wdGlvbmFsX2RvdWJsZTogMC4xMjM0NTY3ODkxMjM0NTY3OFxuJykKLSAgICBlbHNlOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChzdHIobWVzc2FnZSksICdvcHRpb25hbF9kb3VibGU6IDAuMTIzNDU2Nzg5MTIzXG4nKQotCi0gIGRlZiB0ZXN0VW5rbm93bkZpZWxkUHJpbnRpbmcoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIHBvcHVsYXRlZCA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbE5vbkxhenlGaWVsZHMocG9wdWxhdGVkKQotICAgIGVtcHR5ID0gbWVzc2FnZV9tb2R1bGUuVGVzdEVtcHR5TWVzc2FnZSgpCi0gICAgZW1wdHkuUGFyc2VGcm9tU3RyaW5nKHBvcHVsYXRlZC5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyKGVtcHR5KSwgJycpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZE5lc3RlZEZpZWxkSXRlcmF0aW9uKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtc2cgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoYmI9MSkKLSAgICBtc2cucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKGJiPTIpCi0gICAgbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZChiYj0zKQotICAgIG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoYmI9NCkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDIsIDMsIDRdLAotICAgICAgICAgICAgICAgICAgICAgW20uYmIgZm9yIG0gaW4gbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFs0LCAzLCAyLCAxXSwKLSAgICAgICAgICAgICAgICAgICAgIFttLmJiIGZvciBtIGluIHJldmVyc2VkKG1zZy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSldKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzQsIDMsIDIsIDFdLAotICAgICAgICAgICAgICAgICAgICAgW20uYmIgZm9yIG0gaW4gbXNnLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzo6LTFdXSkKLQotICBkZWYgdGVzdFNvcnRpbmdSZXBlYXRlZFNjYWxhckZpZWxkc0RlZmF1bHRDb21wYXJhdG9yKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJDaGVjayBzb21lIGRpZmZlcmVudCB0eXBlcyB3aXRoIHRoZSBkZWZhdWx0IGNvbXBhcmF0b3IuIiIiCi0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0KLSAgICAjIFRPRE8obWF0dHApOiB3b3VsZCB0ZXN0aW5nIG1vcmUgc2NhbGFyIHR5cGVzIHN0cmVuZ3RoZW4gdGVzdD8KLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLnNvcnQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlswXSwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMV0sIDIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzJdLCAzKQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4xKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjIpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5zb3J0KCkKLSAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0sIDEuMSkKLSAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMV0sIDEuMikKLSAgICBzZWxmLmFzc2VydEFsbW9zdEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMl0sIDEuMykKLQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYScpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdjJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2InKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLnNvcnQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0sICdhJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdLCAnYicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1syXSwgJ2MnKQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoYidhJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLmFwcGVuZChiJ2MnKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKGInYicpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5zb3J0KCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNbMF0sIGInYScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzFdLCBiJ2InKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1syXSwgYidjJykKLQotICBkZWYgdGVzdFNvcnRpbmdSZXBlYXRlZFNjYWxhckZpZWxkc0N1c3RvbUNvbXBhcmF0b3Ioc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgICIiIkNoZWNrIHNvbWUgZGlmZmVyZW50IHR5cGVzIHdpdGggY3VzdG9tIGNvbXBhcmF0b3IuIiIiCi0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0KLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgtMykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgtMikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgtMSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLnNvcnQoa2V5PWFicykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMF0sIC0xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlsxXSwgLTIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzJdLCAtMykKLQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYWFhJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2JiJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2MnKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLnNvcnQoa2V5PWxlbikKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdLCAnYycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1sxXSwgJ2JiJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzJdLCAnYWFhJykKLQotICBkZWYgdGVzdFNvcnRpbmdSZXBlYXRlZENvbXBvc2l0ZUZpZWxkc0N1c3RvbUNvbXBhcmF0b3Ioc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgICIiIkNoZWNrIHBhc3NpbmcgYSBjdXN0b20gY29tcGFyYXRvciB0byBzb3J0IGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLiIiIgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDEKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMwotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDYKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA0Ci0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5zb3J0KGtleT1vcGVyYXRvci5hdHRyZ2V0dGVyKCdiYicpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIsIDIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdLmJiLCAzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVszXS5iYiwgNCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbNF0uYmIsIDUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzVdLmJiLCA2KQotCi0gIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkQ29tcG9zaXRlRmllbGRzU3RhYmxlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJDaGVjayBwYXNzaW5nIGEgY3VzdG9tIGNvbXBhcmF0b3IgdG8gc29ydCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4iIiIKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyMQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAxMwotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzMwotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAxMQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyNAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAxMAotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uuc29ydChrZXk9bGFtYmRhIHo6IHouYmIgLy8gMTApCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgWzEzLCAxMSwgMTAsIDIxLCAyMCwgMjQsIDMzXSwKLSAgICAgICAgW24uYmIgZm9yIG4gaW4gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV0pCi0KLSAgICAjIE1ha2Ugc3VyZSB0aGF0IGZvciB0aGUgQysrIGltcGxlbWVudGF0aW9uLCB0aGUgdW5kZXJseWluZyBmaWVsZHMKLSAgICAjIGFyZSBhY3R1YWxseSByZW9yZGVyZWQuCi0gICAgcGIgPSBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBtZXNzYWdlLkNsZWFyKCkKLSAgICBtZXNzYWdlLk1lcmdlRnJvbVN0cmluZyhwYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBbMTMsIDExLCAxMCwgMjEsIDIwLCAyNCwgMzNdLAotICAgICAgICBbbi5iYiBmb3IgbiBpbiBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSkKLQotICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlRmllbGRTb3J0QXJndW1lbnRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJDaGVjayBzb3J0aW5nIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkIHVzaW5nIGxpc3Quc29ydCgpIGFyZ3VtZW50cy4iIiIKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLQotICAgIGdldF9iYiA9IG9wZXJhdG9yLmF0dHJnZXR0ZXIoJ2JiJykKLSAgICBjbXBfYmIgPSBsYW1iZGEgYSwgYjogY21wKGEuYmIsIGIuYmIpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDEKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMwotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAyCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDYKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA0Ci0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5zb3J0KGtleT1nZXRfYmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbay5iYiBmb3IgayBpbiBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSwKLSAgICAgICAgICAgICAgICAgICAgIFsxLCAyLCAzLCA0LCA1LCA2XSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQoa2V5PWdldF9iYiwgcmV2ZXJzZT1UcnVlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoW2suYmIgZm9yIGsgaW4gbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV0sCi0gICAgICAgICAgICAgICAgICAgICBbNiwgNSwgNCwgMywgMiwgMV0pCi0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywpOiByZXR1cm4gICMgTm8gY21wIHNvcnRpbmcgaW4gUFkzLgotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uuc29ydChzb3J0X2Z1bmN0aW9uPWNtcF9iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKFtrLmJiIGZvciBrIGluIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VdLAotICAgICAgICAgICAgICAgICAgICAgWzEsIDIsIDMsIDQsIDUsIDZdKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Uuc29ydChjbXA9Y21wX2JiLCByZXZlcnNlPVRydWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbay5iYiBmb3IgayBpbiBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSwKLSAgICAgICAgICAgICAgICAgICAgIFs2LCA1LCA0LCAzLCAyLCAxXSkKLQotICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyRmllbGRTb3J0QXJndW1lbnRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJDaGVjayBzb3J0aW5nIGEgc2NhbGFyIGZpZWxkIHVzaW5nIGxpc3Quc29ydCgpIGFyZ3VtZW50cy4iIiIKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0zKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0yKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0xKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChrZXk9YWJzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZXNzYWdlLnJlcGVhdGVkX2ludDMyKSwgWy0xLCAtMiwgLTNdKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChrZXk9YWJzLCByZXZlcnNlPVRydWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIpLCBbLTMsIC0yLCAtMV0pCi0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgzLCk6ICAjIE5vIGNtcCBzb3J0aW5nIGluIFBZMy4KLSAgICAgIGFic19jbXAgPSBsYW1iZGEgYSwgYjogY21wKGFicyhhKSwgYWJzKGIpKQotICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5zb3J0KHNvcnRfZnVuY3Rpb249YWJzX2NtcCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobGlzdChtZXNzYWdlLnJlcGVhdGVkX2ludDMyKSwgWy0xLCAtMiwgLTNdKQotICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5zb3J0KGNtcD1hYnNfY21wLCByZXZlcnNlPVRydWUpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVzc2FnZS5yZXBlYXRlZF9pbnQzMiksIFstMywgLTIsIC0xXSkKLQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYWFhJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2JiJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2MnKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLnNvcnQoa2V5PWxlbikKLSAgICBzZWxmLmFzc2VydEVxdWFsKGxpc3QobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcpLCBbJ2MnLCAnYmInLCAnYWFhJ10pCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydChrZXk9bGVuLCByZXZlcnNlPVRydWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSwgWydhYWEnLCAnYmInLCAnYyddKQotICAgIGlmIHN5cy52ZXJzaW9uX2luZm8gPCAoMywpOiAgIyBObyBjbXAgc29ydGluZyBpbiBQWTMuCi0gICAgICBsZW5fY21wID0gbGFtYmRhIGEsIGI6IGNtcChsZW4oYSksIGxlbihiKSkKLSAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLnNvcnQoc29ydF9mdW5jdGlvbj1sZW5fY21wKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSwgWydjJywgJ2JiJywgJ2FhYSddKQotICAgICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydChjbXA9bGVuX2NtcCwgcmV2ZXJzZT1UcnVlKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChsaXN0KG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSwgWydhYWEnLCAnYmInLCAnYyddKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRGaWVsZHNDb21wYXJhYmxlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtMSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIG0xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgwKQotICAgIG0xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIG0xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyKQotICAgIG0yLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgwKQotICAgIG0yLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIG0yLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyKQotICAgIG0xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMQotICAgIG0xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMgotICAgIG0xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMwotICAgIG0yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMQotICAgIG0yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMgotICAgIG0yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMwotCi0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA+PSAoMywpOiByZXR1cm4gICMgTm8gY21wKCkgaW4gUFkzLgotCi0gICAgIyBUaGVzZSBjb21wYXJpc29ucyBzaG91bGQgbm90IHJhaXNlIGVycm9ycy4KLSAgICBfID0gbTEgPCBtMgotICAgIF8gPSBtMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8IG0yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlCi0KLSAgICAjIE1ha2Ugc3VyZSBjbXAgYWx3YXlzIHdvcmtzLiBJZiBpdCB3YXNuJ3QgZGVmaW5lZCwgdGhlc2Ugd291bGQgYmUKLSAgICAjIGlkKCkgY29tcGFyaXNvbnMgYW5kIHdvdWxkIGFsbCBmYWlsLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoY21wKG0xLCBtMiksIDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChjbXAobTEucmVwZWF0ZWRfaW50MzIsIG0yLnJlcGVhdGVkX2ludDMyKSwgMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChtMS5yZXBlYXRlZF9pbnQzMiwgWzAsIDEsIDJdKSwgMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGNtcChtMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSksIDApCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgIyBDYW4ndCBjb21wYXJlIHJlcGVhdGVkIGNvbXBvc2l0ZSBjb250YWluZXJzIHRvIGxpc3RzLgotICAgICAgY21wKG0xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLCBtMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVs6XSkKLQotICAgICMgVE9ETyhhbnVyYWFnKTogSW1wbGVtZW50IGV4dGVuc2lvbmRpY3QgY29tcGFyaXNvbiBpbiBDKysgYW5kIHRoZW4gYWRkIHRlc3QKLQotICBkZWYgdGVzdFJlcGVhdGVkRmllbGRzQXJlU2VxdWVuY2VzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobS5yZXBlYXRlZF9pbnQzMiwgY29sbGVjdGlvbnMuTXV0YWJsZVNlcXVlbmNlKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb2xsZWN0aW9ucy5NdXRhYmxlU2VxdWVuY2UpCi0KLSAgZGVmIGVuc3VyZU5lc3RlZE1lc3NhZ2VFeGlzdHMoc2VsZiwgbXNnLCBhdHRyaWJ1dGUpOgotICAgICIiIk1ha2Ugc3VyZSB0aGF0IGEgbmVzdGVkIG1lc3NhZ2Ugb2JqZWN0IGV4aXN0cy4KLQotICAgIEFzIHNvb24gYXMgYSBuZXN0ZWQgbWVzc2FnZSBhdHRyaWJ1dGUgaXMgYWNjZXNzZWQsIGl0IHdpbGwgYmUgcHJlc2VudCBpbiB0aGUKLSAgICBfZmllbGRzIGRpY3QsIHdpdGhvdXQgYmVpbmcgbWFya2VkIGFzIGFjdHVhbGx5IGJlaW5nIHNldC4KLSAgICAiIiIKLSAgICBnZXRhdHRyKG1zZywgYXR0cmlidXRlKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobXNnLkhhc0ZpZWxkKGF0dHJpYnV0ZSkpCi0KLSAgZGVmIHRlc3RPbmVvZkdldENhc2VOb25leGlzdGluZ0ZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBtLldoaWNoT25lb2YsICdub19zdWNoX29uZW9mX2ZpZWxkJykKLQotICBkZWYgdGVzdE9uZW9mRGVmYXVsdFZhbHVlcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRJcyhOb25lLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl91aW50MzInKSkKLQotICAgICMgT25lb2YgaXMgc2V0IGV2ZW4gd2hlbiBzZXR0aW5nIGl0IHRvIGEgZGVmYXVsdCB2YWx1ZS4KLSAgICBtLm9uZW9mX3VpbnQzMiA9IDAKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl91aW50MzInLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX3VpbnQzMicpKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5IYXNGaWVsZCgnb25lb2Zfc3RyaW5nJykpCi0KLSAgICBtLm9uZW9mX3N0cmluZyA9ICIiCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2Zfc3RyaW5nJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9zdHJpbmcnKSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX3VpbnQzMicpKQotCi0gIGRlZiB0ZXN0T25lb2ZTZW1hbnRpY3Moc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0SXMoTm9uZSwgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotCi0gICAgbS5vbmVvZl91aW50MzIgPSAxMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3VpbnQzMicsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLSAgICBzZWxmLmFzc2VydFRydWUobS5IYXNGaWVsZCgnb25lb2ZfdWludDMyJykpCi0KLSAgICBtLm9uZW9mX3N0cmluZyA9IHUnZm9vJwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3N0cmluZycsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX3VpbnQzMicpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9zdHJpbmcnKSkKLQotICAgICMgUmVhZCBuZXN0ZWQgbWVzc2FnZSBhY2Nlc3NvciB3aXRob3V0IGFjY2Vzc2luZyBzdWJtZXNzYWdlLgotICAgIG0ub25lb2ZfbmVzdGVkX21lc3NhZ2UKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9zdHJpbmcnLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX3N0cmluZycpKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5IYXNGaWVsZCgnb25lb2ZfbmVzdGVkX21lc3NhZ2UnKSkKLQotICAgICMgUmVhZCBhY2Nlc3NvciBvZiBuZXN0ZWQgbWVzc2FnZSB3aXRob3V0IGFjY2Vzc2luZyBzdWJtZXNzYWdlLgotICAgIG0ub25lb2ZfbmVzdGVkX21lc3NhZ2UuYmIKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9zdHJpbmcnLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX3N0cmluZycpKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5IYXNGaWVsZCgnb25lb2ZfbmVzdGVkX21lc3NhZ2UnKSkKLQotICAgIG0ub25lb2ZfbmVzdGVkX21lc3NhZ2UuYmIgPSAxMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX25lc3RlZF9tZXNzYWdlJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobS5IYXNGaWVsZCgnb25lb2Zfc3RyaW5nJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBtLm9uZW9mX2J5dGVzID0gYidiYicKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9ieXRlcycsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX25lc3RlZF9tZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX2J5dGVzJykpCi0KLSAgZGVmIHRlc3RPbmVvZkNvbXBvc2l0ZUZpZWxkUmVhZEFjY2VzcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbS5vbmVvZl91aW50MzIgPSAxMQotCi0gICAgc2VsZi5lbnN1cmVOZXN0ZWRNZXNzYWdlRXhpc3RzKG0sICdvbmVvZl9uZXN0ZWRfbWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfdWludDMyJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEsIG0ub25lb2ZfdWludDMyKQotCi0gIGRlZiB0ZXN0T25lb2ZXaGljaE9uZW9mKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydElzKE5vbmUsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLSAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6Ci0gICAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX2ZpZWxkJykpCi0KLSAgICBtLm9uZW9mX3VpbnQzMiA9IDExCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfdWludDMyJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotICAgIGlmIG1lc3NhZ2VfbW9kdWxlIGlzIHVuaXR0ZXN0X3BiMjoKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShtLkhhc0ZpZWxkKCdvbmVvZl9maWVsZCcpKQotCi0gICAgbS5vbmVvZl9ieXRlcyA9IGInYmInCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfYnl0ZXMnLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCi0KLSAgICBtLkNsZWFyRmllbGQoJ29uZW9mX2J5dGVzJykKLSAgICBzZWxmLmFzc2VydElzKE5vbmUsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLSAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6Ci0gICAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX2ZpZWxkJykpCi0KLSAgZGVmIHRlc3RPbmVvZkNsZWFyRmllbGQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIG0ub25lb2ZfdWludDMyID0gMTEKLSAgICBtLkNsZWFyRmllbGQoJ29uZW9mX2ZpZWxkJykKLSAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6Ci0gICAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX2ZpZWxkJykpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl91aW50MzInKSkKLSAgICBzZWxmLmFzc2VydElzKE5vbmUsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLQotICBkZWYgdGVzdE9uZW9mQ2xlYXJTZXRGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbS5vbmVvZl91aW50MzIgPSAxMQotICAgIG0uQ2xlYXJGaWVsZCgnb25lb2ZfdWludDMyJykKLSAgICBpZiBtZXNzYWdlX21vZHVsZSBpcyB1bml0dGVzdF9wYjI6Ci0gICAgICBzZWxmLmFzc2VydEZhbHNlKG0uSGFzRmllbGQoJ29uZW9mX2ZpZWxkJykpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShtLkhhc0ZpZWxkKCdvbmVvZl91aW50MzInKSkKLSAgICBzZWxmLmFzc2VydElzKE5vbmUsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLQotICBkZWYgdGVzdE9uZW9mQ2xlYXJVbnNldEZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtLm9uZW9mX3VpbnQzMiA9IDExCi0gICAgc2VsZi5lbnN1cmVOZXN0ZWRNZXNzYWdlRXhpc3RzKG0sICdvbmVvZl9uZXN0ZWRfbWVzc2FnZScpCi0gICAgbS5DbGVhckZpZWxkKCdvbmVvZl9uZXN0ZWRfbWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMSwgbS5vbmVvZl91aW50MzIpCi0gICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgotICAgICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX2ZpZWxkJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG0uSGFzRmllbGQoJ29uZW9mX3VpbnQzMicpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3VpbnQzMicsIG0uV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLQotICBkZWYgdGVzdE9uZW9mRGVzZXJpYWxpemUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIG0ub25lb2ZfdWludDMyID0gMTEKLSAgICBtMiA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbTIuUGFyc2VGcm9tU3RyaW5nKG0uU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl91aW50MzInLCBtMi5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotCi0gIGRlZiB0ZXN0T25lb2ZDb3B5RnJvbShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbS5vbmVvZl91aW50MzIgPSAxMQotICAgIG0yID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtMi5Db3B5RnJvbShtKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3VpbnQzMicsIG0yLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCi0KLSAgZGVmIHRlc3RPbmVvZk5lc3RlZE1lcmdlRnJvbShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLk5lc3RlZFRlc3RBbGxUeXBlcygpCi0gICAgbS5wYXlsb2FkLm9uZW9mX3VpbnQzMiA9IDExCi0gICAgbTIgPSBtZXNzYWdlX21vZHVsZS5OZXN0ZWRUZXN0QWxsVHlwZXMoKQotICAgIG0yLnBheWxvYWQub25lb2ZfYnl0ZXMgPSBiJ2JiJwotICAgIG0yLmNoaWxkLnBheWxvYWQub25lb2ZfYnl0ZXMgPSBiJ2JiJwotICAgIG0yLk1lcmdlRnJvbShtKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX3VpbnQzMicsIG0yLnBheWxvYWQuV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9ieXRlcycsIG0yLmNoaWxkLnBheWxvYWQuV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLQotICBkZWYgdGVzdE9uZW9mTWVzc2FnZU1lcmdlRnJvbShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLk5lc3RlZFRlc3RBbGxUeXBlcygpCi0gICAgbS5wYXlsb2FkLm9uZW9mX25lc3RlZF9tZXNzYWdlLmJiID0gMTEKLSAgICBtLmNoaWxkLnBheWxvYWQub25lb2ZfbmVzdGVkX21lc3NhZ2UuYmIgPSAxMgotICAgIG0yID0gbWVzc2FnZV9tb2R1bGUuTmVzdGVkVGVzdEFsbFR5cGVzKCkKLSAgICBtMi5wYXlsb2FkLm9uZW9mX3VpbnQzMiA9IDEzCi0gICAgbTIuTWVyZ2VGcm9tKG0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfbmVzdGVkX21lc3NhZ2UnLAotICAgICAgICAgICAgICAgICAgICAgbTIucGF5bG9hZC5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX25lc3RlZF9tZXNzYWdlJywKLSAgICAgICAgICAgICAgICAgICAgIG0yLmNoaWxkLnBheWxvYWQuV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLQotICBkZWYgdGVzdE9uZW9mTmVzdGVkTWVzc2FnZUluaXQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoCi0gICAgICAgIG9uZW9mX25lc3RlZF9tZXNzYWdlPW1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfbmVzdGVkX21lc3NhZ2UnLCBtLldoaWNoT25lb2YoJ29uZW9mX2ZpZWxkJykpCi0KLSAgZGVmIHRlc3RPbmVvZkNsZWFyKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtLm9uZW9mX3VpbnQzMiA9IDExCi0gICAgbS5DbGVhcigpCi0gICAgc2VsZi5hc3NlcnRJc05vbmUobS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotICAgIG0ub25lb2ZfYnl0ZXMgPSBiJ2JiJwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29uZW9mX2J5dGVzJywgbS5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotCi0gIGRlZiB0ZXN0QXNzaWduQnl0ZVN0cmluZ1RvVW5pY29kZUZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJBc3NpZ25pbmcgYSBieXRlIHN0cmluZyB0byBhIHN0cmluZyBmaWVsZCBzaG91bGQgcmVzdWx0Ci0gICAgaW4gdGhlIHZhbHVlIGJlaW5nIGNvbnZlcnRlZCB0byBhIFVuaWNvZGUgc3RyaW5nLiIiIgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIG0ub3B0aW9uYWxfc3RyaW5nID0gc3RyKCcnKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtLm9wdGlvbmFsX3N0cmluZywgc2l4LnRleHRfdHlwZSkKLQotICBkZWYgdGVzdExvbmdWYWx1ZWRTbGljZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgIiIiSXQgc2hvdWxkIGJlIHBvc3NpYmxlIHRvIHVzZSBsb25nLXZhbHVlZCBpbmRpY2llcyBpbiBzbGljZXMKLQotICAgIFRoaXMgZGlkbid0IHVzZWQgdG8gd29yayBpbiB0aGUgdjIgQysrIGltcGxlbWVudGF0aW9uLgotICAgICIiIgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotCi0gICAgIyBSZXBlYXRlZCBzY2FsYXIKLSAgICBtLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIHNsID0gbS5yZXBlYXRlZF9pbnQzMltsb25nKDApOmxvbmcobGVuKG0ucmVwZWF0ZWRfaW50MzIpKV0KLSAgICBzZWxmLmFzc2VydEVxdWFsKGxlbihtLnJlcGVhdGVkX2ludDMyKSwgbGVuKHNsKSkKLQotICAgICMgUmVwZWF0ZWQgY29tcG9zaXRlCi0gICAgbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDMKLSAgICBzbCA9IG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbbG9uZygwKTpsb25nKGxlbihtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSldCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsZW4obS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSksIGxlbihzbCkpCi0KLSAgZGVmIHRlc3RFeHRlbmRTaG91bGROb3RTd2FsbG93RXhjZXB0aW9ucyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgIiIiVGhpcyBkaWRuJ3QgdXNlIHRvIHdvcmsgaW4gdGhlIHYyIEMrKyBpbXBsZW1lbnRhdGlvbi4iIiIKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKE5hbWVFcnJvcikgYXMgXzoKLSAgICAgIG0ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKGEgZm9yIGkgaW4gcmFuZ2UoMTApKSAgIyBweWxpbnQ6IGRpc2FibGU9dW5kZWZpbmVkLXZhcmlhYmxlCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhOYW1lRXJyb3IpIGFzIF86Ci0gICAgICBtLnJlcGVhdGVkX25lc3RlZF9lbnVtLmV4dGVuZCgKLSAgICAgICAgICBhIGZvciBpIGluIHJhbmdlKDEwKSkgICMgcHlsaW50OiBkaXNhYmxlPXVuZGVmaW5lZC12YXJpYWJsZQotCi0gIEZBTFNZX1ZBTFVFUyA9IFtOb25lLCBGYWxzZSwgMCwgMC4wLCBiJycsIHUnJywgYnl0ZWFycmF5KCksIFtdLCB7fSwgc2V0KCldCi0KLSAgZGVmIHRlc3RFeHRlbmRJbnQzMldpdGhOb3RoaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJUZXN0IG5vLW9wcyBleHRlbmRpbmcgcmVwZWF0ZWQgaW50MzIgZmllbGRzLiIiIgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVE9ETyhwdHVja2VyKTogRGVwcmVjYXRlIHRoaXMgYmVoYXZpb3IuIGIvMTg0MTM4NjIKLSAgICBmb3IgZmFsc3lfdmFsdWUgaW4gTWVzc2FnZVRlc3QuRkFMU1lfVkFMVUVTOgotICAgICAgbS5yZXBlYXRlZF9pbnQzMi5leHRlbmQoZmFsc3lfdmFsdWUpCi0gICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbXSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCi0KLSAgZGVmIHRlc3RFeHRlbmRGbG9hdFdpdGhOb3RoaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJUZXN0IG5vLW9wcyBleHRlbmRpbmcgcmVwZWF0ZWQgZmxvYXQgZmllbGRzLiIiIgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9mbG9hdCkKLQotICAgICMgVE9ETyhwdHVja2VyKTogRGVwcmVjYXRlIHRoaXMgYmVoYXZpb3IuIGIvMTg0MTM4NjIKLSAgICBmb3IgZmFsc3lfdmFsdWUgaW4gTWVzc2FnZVRlc3QuRkFMU1lfVkFMVUVTOgotICAgICAgbS5yZXBlYXRlZF9mbG9hdC5leHRlbmQoZmFsc3lfdmFsdWUpCi0gICAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfZmxvYXQpCi0KLSAgICBtLnJlcGVhdGVkX2Zsb2F0LmV4dGVuZChbXSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfZmxvYXQpCi0KLSAgZGVmIHRlc3RFeHRlbmRTdHJpbmdXaXRoTm90aGluZyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgIiIiVGVzdCBuby1vcHMgZXh0ZW5kaW5nIHJlcGVhdGVkIHN0cmluZyBmaWVsZHMuIiIiCi0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKLQotICAgICMgVE9ETyhwdHVja2VyKTogRGVwcmVjYXRlIHRoaXMgYmVoYXZpb3IuIGIvMTg0MTM4NjIKLSAgICBmb3IgZmFsc3lfdmFsdWUgaW4gTWVzc2FnZVRlc3QuRkFMU1lfVkFMVUVTOgotICAgICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKGZhbHN5X3ZhbHVlKQotICAgICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKLQotICAgIG0ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbXSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfc3RyaW5nKQotCi0gIGRlZiB0ZXN0RXh0ZW5kSW50MzJXaXRoUHl0aG9uTGlzdChzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgIiIiVGVzdCBleHRlbmRpbmcgcmVwZWF0ZWQgaW50MzIgZmllbGRzIHdpdGggcHl0aG9uIGxpc3RzLiIiIgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9pbnQzMikKLSAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMF0pCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswXSwgbS5yZXBlYXRlZF9pbnQzMikKLSAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMSwgMl0pCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLCAxLCAyXSwgbS5yZXBlYXRlZF9pbnQzMikKLSAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChbMywgNF0pCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLCAxLCAyLCAzLCA0XSwgbS5yZXBlYXRlZF9pbnQzMikKLQotICBkZWYgdGVzdEV4dGVuZEZsb2F0V2l0aFB5dGhvbkxpc3Qoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgICIiIlRlc3QgZXh0ZW5kaW5nIHJlcGVhdGVkIGZsb2F0IGZpZWxkcyB3aXRoIHB5dGhvbiBsaXN0cy4iIiIKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfZmxvYXQpCi0gICAgbS5yZXBlYXRlZF9mbG9hdC5leHRlbmQoWzAuMF0pCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQotICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKFsxLjAsIDIuMF0pCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLjAsIDEuMCwgMi4wXSwgbS5yZXBlYXRlZF9mbG9hdCkKLSAgICBtLnJlcGVhdGVkX2Zsb2F0LmV4dGVuZChbMy4wLCA0LjBdKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbMC4wLCAxLjAsIDIuMCwgMy4wLCA0LjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQotCi0gIGRlZiB0ZXN0RXh0ZW5kU3RyaW5nV2l0aFB5dGhvbkxpc3Qoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgICIiIlRlc3QgZXh0ZW5kaW5nIHJlcGVhdGVkIHN0cmluZyBmaWVsZHMgd2l0aCBweXRob24gbGlzdHMuIiIiCi0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKLSAgICBtLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoWycnXSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnXSwgbS5yZXBlYXRlZF9zdHJpbmcpCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKFsnMTEnLCAnMjInXSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnLCAnMTEnLCAnMjInXSwgbS5yZXBlYXRlZF9zdHJpbmcpCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKFsnMzMnLCAnNDQnXSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnLCAnMTEnLCAnMjInLCAnMzMnLCAnNDQnXSwgbS5yZXBlYXRlZF9zdHJpbmcpCi0KLSAgZGVmIHRlc3RFeHRlbmRTdHJpbmdXaXRoU3RyaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJUZXN0IGV4dGVuZGluZyByZXBlYXRlZCBzdHJpbmcgZmllbGRzIHdpdGggY2hhcmFjdGVycyBmcm9tIGEgc3RyaW5nLiIiIgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9zdHJpbmcpCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKCdhYmMnKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbJ2EnLCAnYicsICdjJ10sIG0ucmVwZWF0ZWRfc3RyaW5nKQotCi0gIGNsYXNzIFRlc3RJdGVyYWJsZShvYmplY3QpOgotICAgICIiIlRoaXMgaXRlcmFibGUgb2JqZWN0IG1pbWljcyB0aGUgYmVoYXZpb3Igb2YgbnVtcHkuYXJyYXkuCi0KLSAgICBfX25vbnplcm9fXyBmYWlscyBmb3IgbGVuZ3RoID4gMSwgYW5kIHJldHVybnMgYm9vbChpdGVtWzBdKSBmb3IgbGVuZ3RoID09IDEuCi0KLSAgICAiIiIKLQotICAgIGRlZiBfX2luaXRfXyhzZWxmLCB2YWx1ZXM9Tm9uZSk6Ci0gICAgICBzZWxmLl9saXN0ID0gdmFsdWVzIG9yIFtdCi0KLSAgICBkZWYgX19ub256ZXJvX18oc2VsZik6Ci0gICAgICBzaXplID0gbGVuKHNlbGYuX2xpc3QpCi0gICAgICBpZiBzaXplID09IDA6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgICAgaWYgc2l6ZSA9PSAxOgotICAgICAgICByZXR1cm4gYm9vbChzZWxmLl9saXN0WzBdKQotICAgICAgcmFpc2UgVmFsdWVFcnJvcignVHJ1dGggdmFsdWUgaXMgYW1iaWd1b3VzLicpCi0KLSAgICBkZWYgX19sZW5fXyhzZWxmKToKLSAgICAgIHJldHVybiBsZW4oc2VsZi5fbGlzdCkKLQotICAgIGRlZiBfX2l0ZXJfXyhzZWxmKToKLSAgICAgIHJldHVybiBzZWxmLl9saXN0Ll9faXRlcl9fKCkKLQotICBkZWYgdGVzdEV4dGVuZEludDMyV2l0aEl0ZXJhYmxlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJUZXN0IGV4dGVuZGluZyByZXBlYXRlZCBpbnQzMiBmaWVsZHMgd2l0aCBpdGVyYWJsZS4iIiIKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCi0gICAgbS5yZXBlYXRlZF9pbnQzMi5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFtdKSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoW10sIG0ucmVwZWF0ZWRfaW50MzIpCi0gICAgbS5yZXBlYXRlZF9pbnQzMi5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFswXSkpCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswXSwgbS5yZXBlYXRlZF9pbnQzMikKLSAgICBtLnJlcGVhdGVkX2ludDMyLmV4dGVuZChNZXNzYWdlVGVzdC5UZXN0SXRlcmFibGUoWzEsIDJdKSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWzAsIDEsIDJdLCBtLnJlcGVhdGVkX2ludDMyKQotICAgIG0ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMywgNF0pKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbMCwgMSwgMiwgMywgNF0sIG0ucmVwZWF0ZWRfaW50MzIpCi0KLSAgZGVmIHRlc3RFeHRlbmRGbG9hdFdpdGhJdGVyYWJsZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgIiIiVGVzdCBleHRlbmRpbmcgcmVwZWF0ZWQgZmxvYXQgZmllbGRzIHdpdGggaXRlcmFibGUuIiIiCi0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX2Zsb2F0KQotICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbXSkpCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX2Zsb2F0KQotICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMC4wXSkpCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFswLjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQotICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMS4wLCAyLjBdKSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWzAuMCwgMS4wLCAyLjBdLCBtLnJlcGVhdGVkX2Zsb2F0KQotICAgIG0ucmVwZWF0ZWRfZmxvYXQuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbMy4wLCA0LjBdKSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWzAuMCwgMS4wLCAyLjAsIDMuMCwgNC4wXSwgbS5yZXBlYXRlZF9mbG9hdCkKLQotICBkZWYgdGVzdEV4dGVuZFN0cmluZ1dpdGhJdGVyYWJsZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgIiIiVGVzdCBleHRlbmRpbmcgcmVwZWF0ZWQgc3RyaW5nIGZpZWxkcyB3aXRoIGl0ZXJhYmxlLiIiIgotICAgIG0gPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbXSwgbS5yZXBlYXRlZF9zdHJpbmcpCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbXSkpCi0gICAgc2VsZi5hc3NlcnRTZXF1ZW5jZUVxdWFsKFtdLCBtLnJlcGVhdGVkX3N0cmluZykKLSAgICBtLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFsnJ10pKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbJyddLCBtLnJlcGVhdGVkX3N0cmluZykKLSAgICBtLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoTWVzc2FnZVRlc3QuVGVzdEl0ZXJhYmxlKFsnMScsICcyJ10pKQotICAgIHNlbGYuYXNzZXJ0U2VxdWVuY2VFcXVhbChbJycsICcxJywgJzInXSwgbS5yZXBlYXRlZF9zdHJpbmcpCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcuZXh0ZW5kKE1lc3NhZ2VUZXN0LlRlc3RJdGVyYWJsZShbJzMnLCAnNCddKSkKLSAgICBzZWxmLmFzc2VydFNlcXVlbmNlRXF1YWwoWycnLCAnMScsICcyJywgJzMnLCAnNCddLCBtLnJlcGVhdGVkX3N0cmluZykKLQotICBkZWYgdGVzdFBpY2tsZVJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAjIFRPRE8odGliZWxsKTogVGhlIHB1cmUtUHl0aG9uIGltcGxlbWVudGF0aW9uIHN1cHBvcnQgcGlja2xpbmcgb2YKLSAgICAjICAgc2NhbGFyIGNvbnRhaW5lcnMgaW4gKnNvbWUqIGNhc2VzLiBGb3Igbm93IHRoZSBjcHAyIHZlcnNpb24KLSAgICAjICAgdGhyb3dzIGFuIGV4Y2VwdGlvbiB0byBhdm9pZCBhIHNlZ2ZhdWx0LiBJbnZlc3RpZ2F0ZSBpZiB3ZQotICAgICMgICB3YW50IHRvIHN1cHBvcnQgcGlja2xpbmcgb2YgdGhlc2UgZmllbGRzLgotICAgICMKLSAgICAjIEZvciBtb3JlIGluZm9ybWF0aW9uIHNlZTogaHR0cHM6Ly9iMi5jb3JwLmdvb2dsZS5jb20vdS8wL2lzc3Vlcy8xODY3Nzg5NwotICAgIGlmIChhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdjcHAnIG9yCi0gICAgICAgIGFwaV9pbXBsZW1lbnRhdGlvbi5WZXJzaW9uKCkgPT0gMik6Ci0gICAgICByZXR1cm4KLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKHBpY2tsZS5QaWNrbGVFcnJvcikgYXMgXzoKLSAgICAgIHBpY2tsZS5kdW1wcyhtLnJlcGVhdGVkX2ludDMyLCBwaWNrbGUuSElHSEVTVF9QUk9UT0NPTCkKLQotICBkZWYgdGVzdFNvcnRFbXB0eVJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJFeGVyY2lzZSBhIHNjZW5hcmlvIHRoYXQgaGFzIGxlZCB0byBzZWdmYXVsdHMgaW4gdGhlIHBhc3QuCi0gICAgIiIiCi0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5zb3J0KCkKLQotICBkZWYgdGVzdEhhc0ZpZWxkT25SZXBlYXRlZEZpZWxkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAiIiJVc2luZyBIYXNGaWVsZCBvbiBhIHJlcGVhdGVkIGZpZWxkIHNob3VsZCByYWlzZSBhbiBleGNlcHRpb24uCi0gICAgIiIiCi0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKSBhcyBfOgotICAgICAgbS5IYXNGaWVsZCgncmVwZWF0ZWRfaW50MzInKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRTY2FsYXJGaWVsZFBvcChzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yKSBhcyBfOgotICAgICAgbS5yZXBlYXRlZF9pbnQzMi5wb3AoKQotICAgIG0ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKHJhbmdlKDUpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbS5yZXBlYXRlZF9pbnQzMi5wb3AoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG0ucmVwZWF0ZWRfaW50MzIucG9wKDApKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbS5yZXBlYXRlZF9pbnQzMi5wb3AoMSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbMSwgM10sIG0ucmVwZWF0ZWRfaW50MzIpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZUZpZWxkUG9wKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IpIGFzIF86Ci0gICAgICBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnBvcCgpCi0gICAgZm9yIGkgaW4gcmFuZ2UoNSk6Ci0gICAgICBuID0gbS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgICAgbi5iYiA9IGkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucG9wKCkuYmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnBvcCgwKS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG0ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucG9wKDEpLmJiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDNdLCBbbi5iYiBmb3IgbiBpbiBtLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlXSkKLQotCi0jIENsYXNzIHRvIHRlc3QgcHJvdG8yLW9ubHkgZmVhdHVyZXMgKHJlcXVpcmVkLCBleHRlbnNpb25zLCBldGMuKQotY2xhc3MgUHJvdG8yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RGaWVsZFByZXNlbmNlKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZS5IYXNGaWVsZCgib3B0aW9uYWxfaW50MzIiKSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoIm9wdGlvbmFsX2Jvb2wiKSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpCi0KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgbWVzc2FnZS5IYXNGaWVsZCgiZmllbGRfZG9lc250X2V4aXN0IikKLQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICBtZXNzYWdlLkhhc0ZpZWxkKCJyZXBlYXRlZF9pbnQzMiIpCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKLSAgICAgIG1lc3NhZ2UuSGFzRmllbGQoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotCi0gICAgIyBGaWVsZHMgYXJlIHNldCBldmVuIHdoZW4gc2V0dGluZyB0aGUgdmFsdWVzIHRvIGRlZmF1bHQgdmFsdWVzLgotICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSAwCi0gICAgbWVzc2FnZS5vcHRpb25hbF9ib29sID0gRmFsc2UKLSAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMAotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCJvcHRpb25hbF9pbnQzMiIpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCJvcHRpb25hbF9ib29sIikpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpCi0KLSAgICAjIFNldCB0aGUgZmllbGRzIHRvIG5vbi1kZWZhdWx0IHZhbHVlcy4KLSAgICBtZXNzYWdlLm9wdGlvbmFsX2ludDMyID0gNQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCA9IFRydWUKLSAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMTUKLQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCJvcHRpb25hbF9pbnQzMiIpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCJvcHRpb25hbF9ib29sIikpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpCi0KLSAgICAjIENsZWFyaW5nIHRoZSBmaWVsZHMgdW5zZXRzIHRoZW0gYW5kIHJlc2V0cyB0aGVpciB2YWx1ZSB0byBkZWZhdWx0LgotICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgib3B0aW9uYWxfaW50MzIiKQotICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgib3B0aW9uYWxfYm9vbCIpCi0gICAgbWVzc2FnZS5DbGVhckZpZWxkKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpCi0KLSAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoIm9wdGlvbmFsX2ludDMyIikpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKCJvcHRpb25hbF9ib29sIikpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShtZXNzYWdlLkhhc0ZpZWxkKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotCi0gICMgVE9ETyh0aWJlbGwpOiBUaGUgQysrIGltcGxlbWVudGF0aW9ucyBhY3R1YWxseSBhbGxvd3MgYXNzaWdubWVudAotICAjIG9mIHVua25vd24gZW51bSB2YWx1ZXMgdG8gKnNjYWxhciogZmllbGRzIChidXQgbm90IHJlcGVhdGVkCi0gICMgZmllbGRzKS4gT25jZSBjaGVja2VkIGVudW0gZmllbGRzIGJlY29tZXMgdGhlIGRlZmF1bHQgaW4gdGhlCi0gICMgUHl0aG9uIGltcGxlbWVudGF0aW9uLCB0aGUgQysrIGltcGxlbWVudGF0aW9uIHNob3VsZCBmb2xsb3cgc3VpdC4KLSAgZGVmIHRlc3RBc3NpZ25JbnZhbGlkRW51bShzZWxmKToKLSAgICAiIiJJdCBzaG91bGQgbm90IGJlIHBvc3NpYmxlIHRvIGFzc2lnbiBhbiBpbnZhbGlkIGVudW0gbnVtYmVyIHRvIGFuCi0gICAgZW51bSBmaWVsZC4iIiIKLSAgICBtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpIGFzIF86Ci0gICAgICBtLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gMTIzNDU2NwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIG0ucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kLCAxMjM0NTY3KQotCi0gIGRlZiB0ZXN0R29sZGVuRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBnb2xkZW5fZGF0YSA9IHRlc3RfdXRpbC5Hb2xkZW5GaWxlRGF0YSgnZ29sZGVuX21lc3NhZ2UnKQotICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgYWxsX3NldCA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoYWxsX3NldCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGFsbF9zZXQsIGdvbGRlbl9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgZ29sZGVuX2NvcHkgPSBjb3B5LmRlZXBjb3B5KGdvbGRlbl9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLSAgZGVmIHRlc3RHb2xkZW5QYWNrZWRFeHRlbnNpb25zKHNlbGYpOgotICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGVEYXRhKCdnb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlJykKLSAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIGFsbF9zZXQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRFeHRlbnNpb25zKGFsbF9zZXQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChhbGxfc2V0LCBnb2xkZW5fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBhbGxfc2V0LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgZ29sZGVuX2NvcHkgPSBjb3B5LmRlZXBjb3B5KGdvbGRlbl9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLSAgZGVmIHRlc3RQaWNrbGVJbmNvbXBsZXRlUHJvdG8oc2VsZik6Ci0gICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKGE9MSkKLSAgICBwaWNrbGVkX21lc3NhZ2UgPSBwaWNrbGUuZHVtcHMoZ29sZGVuX21lc3NhZ2UpCi0KLSAgICB1bnBpY2tsZWRfbWVzc2FnZSA9IHBpY2tsZS5sb2FkcyhwaWNrbGVkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZWRfbWVzc2FnZSwgZ29sZGVuX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bnBpY2tsZWRfbWVzc2FnZS5hLCAxKQotICAgICMgVGhpcyBpcyBzdGlsbCBhbiBpbmNvbXBsZXRlIHByb3RvIC0gc28gc2VyaWFsaXppbmcgc2hvdWxkIGZhaWwKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLCB1bnBpY2tsZWRfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZykKLQotCi0gICMgVE9ETyhoYWJlcm1hbik6IHRoaXMgaXNuJ3QgcmVhbGx5IGEgcHJvdG8yLXNwZWNpZmljIHRlc3QgZXhjZXB0IHRoYXQgdGhpcwotICAjIG1lc3NhZ2UgaGFzIGEgcmVxdWlyZWQgZmllbGQgaW4gaXQuICBTaG91bGQgcHJvYmFibHkgYmUgZmFjdG9yZWQgb3V0IHNvCi0gICMgdGhhdCB3ZSBjYW4gdGVzdCB0aGUgb3RoZXIgcGFydHMgd2l0aCBwcm90bzMuCi0gIGRlZiB0ZXN0UGFyc2luZ01lcmdlKHNlbGYpOgotICAgICIiIkNoZWNrIHRoZSBtZXJnZSBiZWhhdmlvciB3aGVuIGEgcmVxdWlyZWQgb3Igb3B0aW9uYWwgZmllbGQgYXBwZWFycwotICAgIG11bHRpcGxlIHRpbWVzIGluIHRoZSBpbnB1dC4iIiIKLSAgICBtZXNzYWdlcyA9IFsKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCksCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKSBdCi0gICAgbWVzc2FnZXNbMF0ub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgbWVzc2FnZXNbMV0ub3B0aW9uYWxfaW50NjQgPSAyCi0gICAgbWVzc2FnZXNbMl0ub3B0aW9uYWxfaW50MzIgPSAzCi0gICAgbWVzc2FnZXNbMl0ub3B0aW9uYWxfc3RyaW5nID0gJ2hlbGxvJwotCi0gICAgbWVyZ2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXJnZWRfbWVzc2FnZS5vcHRpb25hbF9pbnQzMiA9IDMKLSAgICBtZXJnZWRfbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCA9IDIKLSAgICBtZXJnZWRfbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgPSAnaGVsbG8nCi0KLSAgICBnZW5lcmF0b3IgPSB1bml0dGVzdF9wYjIuVGVzdFBhcnNpbmdNZXJnZS5SZXBlYXRlZEZpZWxkc0dlbmVyYXRvcigpCi0gICAgZ2VuZXJhdG9yLmZpZWxkMS5leHRlbmQobWVzc2FnZXMpCi0gICAgZ2VuZXJhdG9yLmZpZWxkMi5leHRlbmQobWVzc2FnZXMpCi0gICAgZ2VuZXJhdG9yLmZpZWxkMy5leHRlbmQobWVzc2FnZXMpCi0gICAgZ2VuZXJhdG9yLmV4dDEuZXh0ZW5kKG1lc3NhZ2VzKQotICAgIGdlbmVyYXRvci5leHQyLmV4dGVuZChtZXNzYWdlcykKLSAgICBnZW5lcmF0b3IuZ3JvdXAxLmFkZCgpLmZpZWxkMS5NZXJnZUZyb20obWVzc2FnZXNbMF0pCi0gICAgZ2VuZXJhdG9yLmdyb3VwMS5hZGQoKS5maWVsZDEuTWVyZ2VGcm9tKG1lc3NhZ2VzWzFdKQotICAgIGdlbmVyYXRvci5ncm91cDEuYWRkKCkuZmllbGQxLk1lcmdlRnJvbShtZXNzYWdlc1syXSkKLSAgICBnZW5lcmF0b3IuZ3JvdXAyLmFkZCgpLmZpZWxkMS5NZXJnZUZyb20obWVzc2FnZXNbMF0pCi0gICAgZ2VuZXJhdG9yLmdyb3VwMi5hZGQoKS5maWVsZDEuTWVyZ2VGcm9tKG1lc3NhZ2VzWzFdKQotICAgIGdlbmVyYXRvci5ncm91cDIuYWRkKCkuZmllbGQxLk1lcmdlRnJvbShtZXNzYWdlc1syXSkKLQotICAgIGRhdGEgPSBnZW5lcmF0b3IuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHBhcnNpbmdfbWVyZ2UgPSB1bml0dGVzdF9wYjIuVGVzdFBhcnNpbmdNZXJnZSgpCi0gICAgcGFyc2luZ19tZXJnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkKLQotICAgICMgUmVxdWlyZWQgYW5kIG9wdGlvbmFsIGZpZWxkcyBzaG91bGQgYmUgbWVyZ2VkLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2luZ19tZXJnZS5yZXF1aXJlZF9hbGxfdHlwZXMsIG1lcmdlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2luZ19tZXJnZS5vcHRpb25hbF9hbGxfdHlwZXMsIG1lcmdlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2luZ19tZXJnZS5vcHRpb25hbGdyb3VwLm9wdGlvbmFsX2dyb3VwX2FsbF90eXBlcywKLSAgICAgICAgICAgICAgICAgICAgIG1lcmdlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocGFyc2luZ19tZXJnZS5FeHRlbnNpb25zWwotICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RQYXJzaW5nTWVyZ2Uub3B0aW9uYWxfZXh0XSwKLSAgICAgICAgICAgICAgICAgICAgIG1lcmdlZF9tZXNzYWdlKQotCi0gICAgIyBSZXBlYXRlZCBmaWVsZHMgc2hvdWxkIG5vdCBiZSBtZXJnZWQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGFyc2luZ19tZXJnZS5yZXBlYXRlZF9hbGxfdHlwZXMpLCAzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRncm91cCksIDMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChsZW4ocGFyc2luZ19tZXJnZS5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdFBhcnNpbmdNZXJnZS5yZXBlYXRlZF9leHRdKSwgMykKLQotICBkZWYgdGVzdFB5dGhvbmljSW5pdChzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgb3B0aW9uYWxfaW50MzI9MTAwLAotICAgICAgICBvcHRpb25hbF9maXhlZDMyPTIwMCwKLSAgICAgICAgb3B0aW9uYWxfZmxvYXQ9MzAwLjUsCi0gICAgICAgIG9wdGlvbmFsX2J5dGVzPWIneCcsCi0gICAgICAgIG9wdGlvbmFsZ3JvdXA9eydhJzogNDAwfSwKLSAgICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U9eydiYic6IDUwMH0sCi0gICAgICAgIG9wdGlvbmFsX25lc3RlZF9lbnVtPSdCQVonLAotICAgICAgICByZXBlYXRlZGdyb3VwPVt7J2EnOiA2MDB9LAotICAgICAgICAgICAgICAgICAgICAgICB7J2EnOiA3MDB9XSwKLSAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX2VudW09WydGT08nLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUl0sCi0gICAgICAgIGRlZmF1bHRfaW50MzI9ODAwLAotICAgICAgICBvbmVvZl9zdHJpbmc9J3knKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtZXNzYWdlLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjAwLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkMzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzMDAuNSwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGIneCcsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0MDAsIG1lc3NhZ2Uub3B0aW9uYWxncm91cC5hKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1MDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZGdyb3VwKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDYwMCwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwWzBdLmEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg3MDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFsxXS5hKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtWzFdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoODAwLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgneScsIG1lc3NhZ2Uub25lb2Zfc3RyaW5nKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50NjQnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBtZXNzYWdlLmRlZmF1bHRfaW50NjQpCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhvcHRpb25hbF9uZXN0ZWRfZW51bT11J0JBWicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0pCi0KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT17J0lOVkFMSURfTkVTVEVEX0ZJRUxEJzogMTd9KQotCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT17J2JiJzogJ0lOVkFMSURfVkFMVUVfVFlQRSd9KQotCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKLSAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfbmVzdGVkX2VudW09J0lOVkFMSURfTEFCRUwnKQotCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKLSAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMocmVwZWF0ZWRfbmVzdGVkX2VudW09J0ZPTycpCi0KLQotCi0jIENsYXNzIHRvIHRlc3QgcHJvdG8zLW9ubHkgZmVhdHVyZXMvYmVoYXZpb3IgKHVwZGF0ZWQgZmllbGQgcHJlc2VuY2UgJiBlbnVtcykKLWNsYXNzIFByb3RvM1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gICMgVXRpbGl0eSBtZXRob2QgZm9yIGNvbXBhcmluZyBlcXVhbGl0eSB3aXRoIGEgbWFwLgotICBkZWYgYXNzZXJ0TWFwSXRlckVxdWFscyhzZWxmLCBtYXBfaXRlciwgZGljdF92YWx1ZSk6Ci0gICAgIyBBdm9pZCBtdXRhdGluZyBjYWxsZXIncyBjb3B5LgotICAgIGRpY3RfdmFsdWUgPSBkaWN0KGRpY3RfdmFsdWUpCi0KLSAgICBmb3IgaywgdiBpbiBtYXBfaXRlcjoKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodiwgZGljdF92YWx1ZVtrXSkKLSAgICAgIGRlbCBkaWN0X3ZhbHVlW2tdCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKHt9LCBkaWN0X3ZhbHVlKQotCi0gIGRlZiB0ZXN0RmllbGRQcmVzZW5jZShzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcHJvdG8zX2FyZW5hX3BiMi5UZXN0QWxsVHlwZXMoKQotCi0gICAgIyBXZSBjYW4ndCB0ZXN0IHByZXNlbmNlIG9mIG5vbi1yZXBlYXRlZCwgbm9uLXN1Ym1lc3NhZ2UgZmllbGRzLgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICBtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKLSAgICAgIG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2Zsb2F0JykKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgbWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgbWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpCi0KLSAgICAjIEJ1dCB3ZSBjYW4gc3RpbGwgdGVzdCBwcmVzZW5jZSBvZiBzdWJtZXNzYWdlIGZpZWxkcy4KLSAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICAjIEFzIHdpdGggcHJvdG8yLCB3ZSBjYW4ndCB0ZXN0IHByZXNlbmNlIG9mIGZpZWxkcyB0aGF0IGRvbid0IGV4aXN0LCBvcgotICAgICMgcmVwZWF0ZWQgZmllbGRzLgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICBtZXNzYWdlLkhhc0ZpZWxkKCdmaWVsZF9kb2VzbnRfZXhpc3QnKQotCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yKToKLSAgICAgIG1lc3NhZ2UuSGFzRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IpOgotICAgICAgbWVzc2FnZS5IYXNGaWVsZCgncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UnKQotCi0gICAgIyBGaWVsZHMgc2hvdWxkIGRlZmF1bHQgdG8gdGhlaXIgdHlwZS1zcGVjaWZpYyBkZWZhdWx0LgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKLQotICAgICMgU2V0dGluZyBhIHN1Ym1lc3NhZ2Ugc2hvdWxkIHN0aWxsIHJldHVybiBwcm9wZXIgcHJlc2VuY2UgaW5mb3JtYXRpb24uCi0gICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDAKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKLQotICAgICMgU2V0IHRoZSBmaWVsZHMgdG8gbm9uLWRlZmF1bHQgdmFsdWVzLgotICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIgPSA1Ci0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IDEuMQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nID0gJ2FiYycKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wgPSBUcnVlCi0gICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDE1Ci0KLSAgICAjIENsZWFyaW5nIHRoZSBmaWVsZHMgdW5zZXRzIHRoZW0gYW5kIHJlc2V0cyB0aGVpciB2YWx1ZSB0byBkZWZhdWx0LgotICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfZmxvYXQnKQotICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykKLSAgICBtZXNzYWdlLkNsZWFyRmllbGQoJ29wdGlvbmFsX2Jvb2wnKQotICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotCi0gIGRlZiB0ZXN0QXNzaWduVW5rbm93bkVudW0oc2VsZik6Ci0gICAgIiIiQXNzaWduaW5nIGFuIHVua25vd24gZW51bSB2YWx1ZSBpcyBhbGxvd2VkIGFuZCBwcmVzZXJ2ZXMgdGhlIHZhbHVlLiIiIgotICAgIG0gPSB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBtLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gMTIzNDU2NwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNDU2NywgbS5vcHRpb25hbF9uZXN0ZWRfZW51bSkKLSAgICBtLnJlcGVhdGVkX25lc3RlZF9lbnVtLmFwcGVuZCgyMjMzNDQ1NSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIyMzM0NDU1LCBtLnJlcGVhdGVkX25lc3RlZF9lbnVtWzBdKQotICAgICMgQXNzaWdubWVudCBpcyBhIGRpZmZlcmVudCBjb2RlIHBhdGggdGhhbiBhcHBlbmQgZm9yIHRoZSBDKysgaW1wbC4KLSAgICBtLnJlcGVhdGVkX25lc3RlZF9lbnVtWzBdID0gNzY1NDMyMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNzY1NDMyMSwgbS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSkKLSAgICBzZXJpYWxpemVkID0gbS5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICBtMiA9IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBtMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQ1NjcsIG0yLm9wdGlvbmFsX25lc3RlZF9lbnVtKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNzY1NDMyMSwgbTIucmVwZWF0ZWRfbmVzdGVkX2VudW1bMF0pCi0KLSAgIyBNYXAgaXNuJ3QgcmVhbGx5IGEgcHJvdG8zLW9ubHkgZmVhdHVyZS4gQnV0IHRoZXJlIGlzIG5vIHByb3RvMiBlcXVpdmFsZW50Ci0gICMgb2YgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wcm90byByaWdodCBub3csIHNvIGl0J3Mgbm90IGVhc3kgdG8KLSAgIyB0ZXN0IGJvdGggd2l0aCB0aGUgc2FtZSB0ZXN0IGxpa2Ugd2UgZG8gZm9yIHRoZSBvdGhlciBwcm90bzIvcHJvdG8zIHRlc3RzLgotICAjIChnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvYnVmX3VuaXR0ZXN0LnByb3RvIGlzIHZlcnkgZGlmZmVyZW50IGluIHRoZSBzZXQKLSAgIyBvZiBtZXNzYWdlcyBhbmQgZmllbGRzIGl0IGNvbnRhaW5zKS4KLSAgZGVmIHRlc3RTY2FsYXJNYXBEZWZhdWx0cyhzZWxmKToKLSAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQotCi0gICAgIyBTY2FsYXJzIHN0YXJ0IG91dCB1bnNldC4KLSAgICBzZWxmLmFzc2VydEZhbHNlKC0xMjMgaW4gbXNnLm1hcF9pbnQzMl9pbnQzMikKLSAgICBzZWxmLmFzc2VydEZhbHNlKC0yKiozMyBpbiBtc2cubWFwX2ludDY0X2ludDY0KQotICAgIHNlbGYuYXNzZXJ0RmFsc2UoMTIzIGluIG1zZy5tYXBfdWludDMyX3VpbnQzMikKLSAgICBzZWxmLmFzc2VydEZhbHNlKDIqKjMzIGluIG1zZy5tYXBfdWludDY0X3VpbnQ2NCkKLSAgICBzZWxmLmFzc2VydEZhbHNlKDEyMyBpbiBtc2cubWFwX2ludDMyX2RvdWJsZSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKEZhbHNlIGluIG1zZy5tYXBfYm9vbF9ib29sKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UoJ2FiYycgaW4gbXNnLm1hcF9zdHJpbmdfc3RyaW5nKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UoMTExIGluIG1zZy5tYXBfaW50MzJfYnl0ZXMpCi0gICAgc2VsZi5hc3NlcnRGYWxzZSg4ODggaW4gbXNnLm1hcF9pbnQzMl9lbnVtKQotCi0gICAgIyBBY2Nlc3NpbmcgYW4gdW5zZXQga2V5IHJldHVybnMgdGhlIGRlZmF1bHQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtc2cubWFwX2ludDMyX2ludDMyWy0xMjNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbXNnLm1hcF9pbnQ2NF9pbnQ2NFstMioqMzNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbXNnLm1hcF91aW50MzJfdWludDMyWzEyM10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtc2cubWFwX3VpbnQ2NF91aW50NjRbMioqMzNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4wLCBtc2cubWFwX2ludDMyX2RvdWJsZVsxMjNdKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKG1zZy5tYXBfaW50MzJfZG91YmxlWzEyM10sIGZsb2F0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBtc2cubWFwX2Jvb2xfYm9vbFtGYWxzZV0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobXNnLm1hcF9ib29sX2Jvb2xbRmFsc2VdLCBib29sKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2FiYyddKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBtc2cubWFwX2ludDMyX2J5dGVzWzExMV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBtc2cubWFwX2ludDMyX2VudW1bODg4XSkKLQotICAgICMgSXQgYWxzbyBzZXRzIHRoZSB2YWx1ZSBpbiB0aGUgbWFwCi0gICAgc2VsZi5hc3NlcnRUcnVlKC0xMjMgaW4gbXNnLm1hcF9pbnQzMl9pbnQzMikKLSAgICBzZWxmLmFzc2VydFRydWUoLTIqKjMzIGluIG1zZy5tYXBfaW50NjRfaW50NjQpCi0gICAgc2VsZi5hc3NlcnRUcnVlKDEyMyBpbiBtc2cubWFwX3VpbnQzMl91aW50MzIpCi0gICAgc2VsZi5hc3NlcnRUcnVlKDIqKjMzIGluIG1zZy5tYXBfdWludDY0X3VpbnQ2NCkKLSAgICBzZWxmLmFzc2VydFRydWUoMTIzIGluIG1zZy5tYXBfaW50MzJfZG91YmxlKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShGYWxzZSBpbiBtc2cubWFwX2Jvb2xfYm9vbCkKLSAgICBzZWxmLmFzc2VydFRydWUoJ2FiYycgaW4gbXNnLm1hcF9zdHJpbmdfc3RyaW5nKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxMTEgaW4gbXNnLm1hcF9pbnQzMl9ieXRlcykKLSAgICBzZWxmLmFzc2VydFRydWUoODg4IGluIG1zZy5tYXBfaW50MzJfZW51bSkKLQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2FiYyddLCBzaXgudGV4dF90eXBlKQotCi0gICAgIyBBY2Nlc3NpbmcgYW4gdW5zZXQga2V5IHN0aWxsIHRocm93cyBUeXBlRXJyb3IgaWYgdGhlIHR5cGUgb2YgdGhlIGtleQotICAgICMgaXMgaW5jb3JyZWN0LgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKToKLSAgICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1sxMjNdCi0KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6Ci0gICAgICAxMjMgaW4gbXNnLm1hcF9zdHJpbmdfc3RyaW5nCi0KLSAgZGVmIHRlc3RNYXBHZXQoc2VsZik6Ci0gICAgIyBOZWVkIHRvIHRlc3QgdGhhdCBnZXQoKSBwcm9wZXJseSByZXR1cm5zIHRoZSBkZWZhdWx0LCBldmVuIHRob3VnaCB0aGUgZGljdAotICAgICMgaGFzIGRlZmF1bHRkaWN0LWxpa2Ugc2VtYW50aWNzLgotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBzZWxmLmFzc2VydElzTm9uZShtc2cubWFwX2ludDMyX2ludDMyLmdldCg1KSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCBtc2cubWFwX2ludDMyX2ludDMyLmdldCg1LCAxMCkpCi0gICAgc2VsZi5hc3NlcnRJc05vbmUobXNnLm1hcF9pbnQzMl9pbnQzMi5nZXQoNSkpCi0KLSAgICBtc2cubWFwX2ludDMyX2ludDMyWzVdID0gMTUKLSAgICBzZWxmLmFzc2VydEVxdWFsKDE1LCBtc2cubWFwX2ludDMyX2ludDMyLmdldCg1KSkKLQotICAgIHNlbGYuYXNzZXJ0SXNOb25lKG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLmdldCg1KSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5nZXQoNSwgMTApKQotCi0gICAgc3VibXNnID0gbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbNV0KLSAgICBzZWxmLmFzc2VydElzKHN1Ym1zZywgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UuZ2V0KDUpKQotCi0gIGRlZiB0ZXN0U2NhbGFyTWFwKHNlbGYpOgotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtc2cubWFwX2ludDMyX2ludDMyKSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKDUgaW4gbXNnLm1hcF9pbnQzMl9pbnQzMikKLQotICAgIG1zZy5tYXBfaW50MzJfaW50MzJbLTEyM10gPSAtNDU2Ci0gICAgbXNnLm1hcF9pbnQ2NF9pbnQ2NFstMioqMzNdID0gLTIqKjM0Ci0gICAgbXNnLm1hcF91aW50MzJfdWludDMyWzEyM10gPSA0NTYKLSAgICBtc2cubWFwX3VpbnQ2NF91aW50NjRbMioqMzNdID0gMioqMzQKLSAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2FiYyddID0gJzEyMycKLSAgICBtc2cubWFwX2ludDMyX2VudW1bODg4XSA9IDIKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIG1zZy5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKG1zZy5tYXBfc3RyaW5nX3N0cmluZykpCi0KLSAgICAjIEJhZCBrZXkuCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWzEyM10gPSAnMTIzJwotCi0gICAgIyBWZXJpZnkgdGhhdCB0cnlpbmcgdG8gYXNzaWduIGEgYmFkIGtleSBkb2Vzbid0IGFjdHVhbGx5IGFkZCBhIG1lbWJlciB0bwotICAgICMgdGhlIG1hcC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihtc2cubWFwX3N0cmluZ19zdHJpbmcpKQotCi0gICAgIyBCYWQgdmFsdWUuCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWycxMjMnXSA9IDEyMwotCi0gICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0gICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICAgICMgQmFkIGtleS4KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvcik6Ci0gICAgICBtc2cyLm1hcF9zdHJpbmdfc3RyaW5nWzEyM10gPSAnMTIzJwotCi0gICAgIyBCYWQgdmFsdWUuCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgbXNnMi5tYXBfc3RyaW5nX3N0cmluZ1snMTIzJ10gPSAxMjMKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTQ1NiwgbXNnMi5tYXBfaW50MzJfaW50MzJbLTEyM10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMioqMzQsIG1zZzIubWFwX2ludDY0X2ludDY0Wy0yKiozM10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0NTYsIG1zZzIubWFwX3VpbnQzMl91aW50MzJbMTIzXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIqKjM0LCBtc2cyLm1hcF91aW50NjRfdWludDY0WzIqKjMzXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcxMjMnLCBtc2cyLm1hcF9zdHJpbmdfc3RyaW5nWydhYmMnXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1zZzIubWFwX2ludDMyX2VudW1bODg4XSkKLQotICBkZWYgdGVzdFN0cmluZ1VuaWNvZGVDb252ZXJzaW9uSW5NYXAoc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLQotICAgIHVuaWNvZGVfb2JqID0gdSdcdTEyMzQnCi0gICAgYnl0ZXNfb2JqID0gdW5pY29kZV9vYmouZW5jb2RlKCd1dGY4JykKLQotICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1tieXRlc19vYmpdID0gYnl0ZXNfb2JqCi0KLSAgICAoa2V5LCB2YWx1ZSkgPSBsaXN0KG1zZy5tYXBfc3RyaW5nX3N0cmluZy5pdGVtcygpKVswXQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbChrZXksIHVuaWNvZGVfb2JqKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWUsIHVuaWNvZGVfb2JqKQotCi0gICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKGtleSwgc2l4LnRleHRfdHlwZSkKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UodmFsdWUsIHNpeC50ZXh0X3R5cGUpCi0KLSAgZGVmIHRlc3RNZXNzYWdlTWFwKHNlbGYpOgotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpCi0gICAgc2VsZi5hc3NlcnRGYWxzZSg1IGluIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQotCi0gICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTIzXQotICAgICMgZ2V0X29yX2NyZWF0ZSgpIGlzIGFuIGFsaWFzIGZvciBnZXRpdGVtLgotICAgIG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLmdldF9vcl9jcmVhdGUoLTQ1NikKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEluKDEyMywgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRJbigtNDU2LCBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpCi0KLSAgICAjIEJhZCBrZXkuCi0gICAgd2l0aCBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IpOgotICAgICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbJzEyMyddCi0KLSAgICAjIENhbid0IGFzc2lnbiBkaXJlY3RseSB0byBzdWJtZXNzYWdlLgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVs5OTldID0gbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTIzXQotCi0gICAgIyBWZXJpZnkgdGhhdCB0cnlpbmcgdG8gYXNzaWduIGEgYmFkIGtleSBkb2Vzbid0IGFjdHVhbGx5IGFkZCBhIG1lbWJlciB0bwotICAgICMgdGhlIG1hcC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpCi0KLSAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBtc2cyID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLSAgICBtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4obXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEluKDEyMywgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0SW4oLTQ1NiwgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSkpCi0KLSAgZGVmIHRlc3RNZXJnZUZyb20oc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLSAgICBtc2cubWFwX2ludDMyX2ludDMyWzEyXSA9IDM0Ci0gICAgbXNnLm1hcF9pbnQzMl9pbnQzMls1Nl0gPSA3OAotICAgIG1zZy5tYXBfaW50NjRfaW50NjRbMjJdID0gMzMKLSAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMTFdLmMgPSA1Ci0gICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMjIyXS5jID0gMTAKLQotICAgIG1zZzIgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQotICAgIG1zZzIubWFwX2ludDMyX2ludDMyWzEyXSA9IDU1Ci0gICAgbXNnMi5tYXBfaW50NjRfaW50NjRbODhdID0gOTkKLSAgICBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMjIyXS5jID0gMTUKLQotICAgIG1zZzIuTWVyZ2VGcm9tKG1zZykKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzQsIG1zZzIubWFwX2ludDMyX2ludDMyWzEyXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDc4LCBtc2cyLm1hcF9pbnQzMl9pbnQzMls1Nl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzMywgbXNnMi5tYXBfaW50NjRfaW50NjRbMjJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTksIG1zZzIubWFwX2ludDY0X2ludDY0Wzg4XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMTFdLmMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzIyMl0uYykKLQotICAgICMgVmVyaWZ5IHRoYXQgdGhlcmUgaXMgb25seSBvbmUgZW50cnkgcGVyIGtleSwgZXZlbiB0aG91Z2ggdGhlIE1lcmdlRnJvbQotICAgICMgbWF5IGhhdmUgaW50ZXJuYWxseSBjcmVhdGVkIG11bHRpcGxlIGVudHJpZXMgZm9yIGEgc2luZ2xlIGtleSBpbiB0aGUKLSAgICAjIGxpc3QgcmVwcmVzZW50YXRpb24uCi0gICAgYXNfZGljdCA9IHt9Ci0gICAgZm9yIGtleSBpbiBtc2cyLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2U6Ci0gICAgICBzZWxmLmFzc2VydEZhbHNlKGtleSBpbiBhc19kaWN0KQotICAgICAgYXNfZGljdFtrZXldID0gbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlW2tleV0uYwotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh7MTExOiA1LCAyMjI6IDEwfSwgYXNfZGljdCkKLQotICAgICMgU3BlY2lhbCBjYXNlOiB0ZXN0IHRoYXQgZGVsZXRlIG9mIGl0ZW0gcmVhbGx5IHJlbW92ZXMgdGhlIGl0ZW0sIGV2ZW4gaWYKLSAgICAjIHRoZXJlIG1pZ2h0IGhhdmUgcGh5c2ljYWxseSBiZWVuIGR1cGxpY2F0ZSBrZXlzIGR1ZSB0byB0aGUgcHJldmlvdXMgbWVyZ2UuCi0gICAgIyBUaGlzIGlzIG9ubHkgYSBzcGVjaWFsIGNhc2UgZm9yIHRoZSBDKysgaW1wbGVtZW50YXRpb24gd2hpY2ggc3RvcmVzIHRoZQotICAgICMgbWFwIGFzIGFuIGFycmF5LgotICAgIGRlbCBtc2cyLm1hcF9pbnQzMl9pbnQzMlsxMl0KLSAgICBzZWxmLmFzc2VydEZhbHNlKDEyIGluIG1zZzIubWFwX2ludDMyX2ludDMyKQotCi0gICAgZGVsIG1zZzIubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsyMjJdCi0gICAgc2VsZi5hc3NlcnRGYWxzZSgyMjIgaW4gbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tQmFkVHlwZShzZWxmKToKLSAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgIFR5cGVFcnJvciwKLSAgICAgICAgcidQYXJhbWV0ZXIgdG8gTWVyZ2VGcm9tXChcKSBtdXN0IGJlIGluc3RhbmNlIG9mIHNhbWUgY2xhc3M6IGV4cGVjdGVkICcKLSAgICAgICAgcicuKlRlc3RNYXAgZ290IGludFwuJyk6Ci0gICAgICBtc2cuTWVyZ2VGcm9tKDEpCi0KLSAgZGVmIHRlc3RDb3B5RnJvbUJhZFR5cGUoc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBUeXBlRXJyb3IsCi0gICAgICAgIHInUGFyYW1ldGVyIHRvIFtBLVphLXpdKkZyb21cKFwpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzczogJwotICAgICAgICByJ2V4cGVjdGVkIC4qVGVzdE1hcCBnb3QgaW50XC4nKToKLSAgICAgIG1zZy5Db3B5RnJvbSgxKQotCi0gIGRlZiB0ZXN0SW50ZWdlck1hcFdpdGhMb25ncyhzZWxmKToKLSAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQotICAgIG1zZy5tYXBfaW50MzJfaW50MzJbbG9uZygtMTIzKV0gPSBsb25nKC00NTYpCi0gICAgbXNnLm1hcF9pbnQ2NF9pbnQ2NFtsb25nKC0yKiozMyldID0gbG9uZygtMioqMzQpCi0gICAgbXNnLm1hcF91aW50MzJfdWludDMyW2xvbmcoMTIzKV0gPSBsb25nKDQ1NikKLSAgICBtc2cubWFwX3VpbnQ2NF91aW50NjRbbG9uZygyKiozMyldID0gbG9uZygyKiozNCkKLQotICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIG1zZzIgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQotICAgIG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKC00NTYsIG1zZzIubWFwX2ludDMyX2ludDMyWy0xMjNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIqKjM0LCBtc2cyLm1hcF9pbnQ2NF9pbnQ2NFstMioqMzNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDU2LCBtc2cyLm1hcF91aW50MzJfdWludDMyWzEyM10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyKiozNCwgbXNnMi5tYXBfdWludDY0X3VpbnQ2NFsyKiozM10pCi0KLSAgZGVmIHRlc3RNYXBBc3NpZ25tZW50Q2F1c2VzUHJlc2VuY2Uoc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwU3VibWVzc2FnZSgpCi0gICAgbXNnLnRlc3RfbWFwLm1hcF9pbnQzMl9pbnQzMlsxMjNdID0gNDU2Ci0KLSAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBtc2cyID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwU3VibWVzc2FnZSgpCi0gICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBtc2cyKQotCi0gICAgIyBOb3cgdGVzdCB0aGF0IHZhcmlvdXMgbXV0YXRpb25zIG9mIHRoZSBtYXAgcHJvcGVybHkgaW52YWxpZGF0ZSB0aGUKLSAgICAjIGNhY2hlZCBzaXplIG9mIHRoZSBzdWJtZXNzYWdlLgotICAgIG1zZy50ZXN0X21hcC5tYXBfaW50MzJfaW50MzJbODg4XSA9IDk5OQotICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIG1zZzIpCi0KLSAgICBtc2cudGVzdF9tYXAubWFwX2ludDMyX2ludDMyLmNsZWFyKCkKLSAgICBzZXJpYWxpemVkID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBtc2cyLlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLCBtc2cyKQotCi0gIGRlZiB0ZXN0TWFwQXNzaWdubWVudENhdXNlc1ByZXNlbmNlRm9yU3VibWVzc2FnZXMoc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwU3VibWVzc2FnZSgpCi0gICAgbXNnLnRlc3RfbWFwLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTIzXS5jID0gNQotCi0gICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcFN1Ym1lc3NhZ2UoKQotICAgIG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgbXNnMikKLQotICAgICMgTm93IHRlc3QgdGhhdCB2YXJpb3VzIG11dGF0aW9ucyBvZiB0aGUgbWFwIHByb3Blcmx5IGludmFsaWRhdGUgdGhlCi0gICAgIyBjYWNoZWQgc2l6ZSBvZiB0aGUgc3VibWVzc2FnZS4KLSAgICBtc2cudGVzdF9tYXAubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVs4ODhdLmMgPSA3Ci0gICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgbXNnMikKLQotICAgIG1zZy50ZXN0X21hcC5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzg4OF0uTWVyZ2VGcm9tKAotICAgICAgICBtc2cudGVzdF9tYXAubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMjNdKQotICAgIHNlcmlhbGl6ZWQgPSBtc2cuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtc2csIG1zZzIpCi0KLSAgICBtc2cudGVzdF9tYXAubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZS5jbGVhcigpCi0gICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgbXNnMikKLQotICBkZWYgdGVzdE1vZGlmeU1hcFdoaWxlSXRlcmF0aW5nKHNlbGYpOgotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBzdHJpbmdfc3RyaW5nX2l0ZXIgPSBpdGVyKG1zZy5tYXBfc3RyaW5nX3N0cmluZykKLSAgICBpbnQzMl9mb3JlaWduX2l0ZXIgPSBpdGVyKG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlKQotCi0gICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWydhYmMnXSA9ICcxMjMnCi0gICAgbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbNV0uYyA9IDUKLQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKLSAgICAgIGZvciBrZXkgaW4gc3RyaW5nX3N0cmluZ19pdGVyOgotICAgICAgICBwYXNzCi0KLSAgICB3aXRoIHNlbGYuYXNzZXJ0UmFpc2VzKFJ1bnRpbWVFcnJvcik6Ci0gICAgICBmb3Iga2V5IGluIGludDMyX2ZvcmVpZ25faXRlcjoKLSAgICAgICAgcGFzcwotCi0gIGRlZiB0ZXN0U3VibWVzc2FnZU1hcChzZWxmKToKLSAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQotCi0gICAgc3VibXNnID0gbXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTExXQotICAgIHNlbGYuYXNzZXJ0SXMoc3VibXNnLCBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVsxMTFdKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzdWJtc2csIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZSkKLQotICAgIHN1Ym1zZy5jID0gNQotCi0gICAgc2VyaWFsaXplZCA9IG1zZy5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgbXNnMiA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0gICAgbXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbXNnMi5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzExMV0uYykKLQotICAgICMgRG9lc24ndCBhbGxvdyBkaXJlY3Qgc3VibWVzc2FnZSBhc3NpZ25tZW50LgotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvcik6Ci0gICAgICBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVs4OF0gPSB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoKQotCi0gIGRlZiB0ZXN0TWFwSXRlcmF0aW9uKHNlbGYpOgotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBmb3IgaywgdiBpbiBtc2cubWFwX2ludDMyX2ludDMyLml0ZW1zKCk6Ci0gICAgICAjIFNob3VsZCBub3QgYmUgcmVhY2hlZC4KLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShGYWxzZSkKLQotICAgIG1zZy5tYXBfaW50MzJfaW50MzJbMl0gPSA0Ci0gICAgbXNnLm1hcF9pbnQzMl9pbnQzMlszXSA9IDYKLSAgICBtc2cubWFwX2ludDMyX2ludDMyWzRdID0gOAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKG1zZy5tYXBfaW50MzJfaW50MzIpKQotCi0gICAgbWF0Y2hpbmdfZGljdCA9IHsyOiA0LCAzOiA2LCA0OiA4fQotICAgIHNlbGYuYXNzZXJ0TWFwSXRlckVxdWFscyhtc2cubWFwX2ludDMyX2ludDMyLml0ZW1zKCksIG1hdGNoaW5nX2RpY3QpCi0KLSAgZGVmIHRlc3RNYXBJdGVtcyhzZWxmKToKLSAgICAjIE1hcCBpdGVtcyB1c2VkIHRvIGhhdmUgc3RyYW5nZSBiZWhhdmlvcnMgd2hlbiB1c2UgYyBleHRlbnNpb24uIEJlY2F1c2UKLSAgICAjIFtdIG1heSByZW9yZGVyIHRoZSBtYXAgYW5kIGludmFsaWRhdGUgYW55IGV4c3RpbmcgaXRlcmF0b3JzLgotICAgICMgVE9ETyhqaWVsdW8pOiBDaGVjayBpZiBbXSByZW9yZGVyaW5nIHRoZSBtYXAgaXMgYSBidWcgb3IgaW50ZW5kZWQKLSAgICAjIGJlaGF2aW9yLgotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0gICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWydsb2NhbF9pbml0X29wJ10gPSAnJwotICAgIG1zZy5tYXBfc3RyaW5nX3N0cmluZ1sndHJhaW5hYmxlX3ZhcmlhYmxlcyddID0gJycKLSAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ3ZhcmlhYmxlcyddID0gJycKLSAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2luaXRfb3AnXSA9ICcnCi0gICAgbXNnLm1hcF9zdHJpbmdfc3RyaW5nWydzdW1tYXJpZXMnXSA9ICcnCi0gICAgaXRlbXMxID0gbXNnLm1hcF9zdHJpbmdfc3RyaW5nLml0ZW1zKCkKLSAgICBpdGVtczIgPSBtc2cubWFwX3N0cmluZ19zdHJpbmcuaXRlbXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoaXRlbXMxLCBpdGVtczIpCi0KLSAgZGVmIHRlc3RNYXBJdGVyYXRpb25DbGVhck1lc3NhZ2Uoc2VsZik6Ci0gICAgIyBJdGVyYXRvciBuZWVkcyB0byB3b3JrIGV2ZW4gaWYgbWVzc2FnZSBhbmQgbWFwIGFyZSBkZWxldGVkLgotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBtc2cubWFwX2ludDMyX2ludDMyWzJdID0gNAotICAgIG1zZy5tYXBfaW50MzJfaW50MzJbM10gPSA2Ci0gICAgbXNnLm1hcF9pbnQzMl9pbnQzMls0XSA9IDgKLQotICAgIGl0ID0gbXNnLm1hcF9pbnQzMl9pbnQzMi5pdGVtcygpCi0gICAgZGVsIG1zZwotCi0gICAgbWF0Y2hpbmdfZGljdCA9IHsyOiA0LCAzOiA2LCA0OiA4fQotICAgIHNlbGYuYXNzZXJ0TWFwSXRlckVxdWFscyhpdCwgbWF0Y2hpbmdfZGljdCkKLQotICBkZWYgdGVzdE1hcENvbnN0cnVjdGlvbihzZWxmKToKLSAgICBtc2cgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAobWFwX2ludDMyX2ludDMyPXsxOiAyLCAzOiA0fSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1zZy5tYXBfaW50MzJfaW50MzJbMV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBtc2cubWFwX2ludDMyX2ludDMyWzNdKQotCi0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKAotICAgICAgICBtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlPXszOiB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz01KX0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZVszXS5jKQotCi0gIGRlZiB0ZXN0TWFwVmFsaWRBZnRlckZpZWxkQ2xlYXJlZChzZWxmKToKLSAgICAjIE1hcCBuZWVkcyB0byB3b3JrIGV2ZW4gaWYgZmllbGQgaXMgY2xlYXJlZC4KLSAgICAjIEZvciB0aGUgQysrIGltcGxlbWVudGF0aW9uIHRoaXMgdGVzdHMgdGhlIGNvcnJlY3RuZXNzIG9mCi0gICAgIyBTY2FsYXJNYXBDb250YWluZXI6OlJlbGVhc2UoKQotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0gICAgaW50MzJfbWFwID0gbXNnLm1hcF9pbnQzMl9pbnQzMgotCi0gICAgaW50MzJfbWFwWzJdID0gNAotICAgIGludDMyX21hcFszXSA9IDYKLSAgICBpbnQzMl9tYXBbNF0gPSA4Ci0KLSAgICBtc2cuQ2xlYXJGaWVsZCgnbWFwX2ludDMyX2ludDMyJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGInJywgbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgbWF0Y2hpbmdfZGljdCA9IHsyOiA0LCAzOiA2LCA0OiA4fQotICAgIHNlbGYuYXNzZXJ0TWFwSXRlckVxdWFscyhpbnQzMl9tYXAuaXRlbXMoKSwgbWF0Y2hpbmdfZGljdCkKLQotICBkZWYgdGVzdE1lc3NhZ2VNYXBWYWxpZEFmdGVyRmllbGRDbGVhcmVkKHNlbGYpOgotICAgICMgTWFwIG5lZWRzIHRvIHdvcmsgZXZlbiBpZiBmaWVsZCBpcyBjbGVhcmVkLgotICAgICMgRm9yIHRoZSBDKysgaW1wbGVtZW50YXRpb24gdGhpcyB0ZXN0cyB0aGUgY29ycmVjdG5lc3Mgb2YKLSAgICAjIFNjYWxhck1hcENvbnRhaW5lcjo6UmVsZWFzZSgpCi0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLSAgICBpbnQzMl9mb3JlaWduX21lc3NhZ2UgPSBtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZQotCi0gICAgaW50MzJfZm9yZWlnbl9tZXNzYWdlWzJdLmMgPSA1Ci0KLSAgICBtc2cuQ2xlYXJGaWVsZCgnbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIG1zZy5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSgyIGluIGludDMyX2ZvcmVpZ25fbWVzc2FnZS5rZXlzKCkpCi0KLSAgZGVmIHRlc3RNYXBJdGVySW52YWxpZGF0ZWRCeUNsZWFyRmllbGQoc2VsZik6Ci0gICAgIyBNYXAgaXRlcmF0b3IgaXMgaW52YWxpZGF0ZWQgd2hlbiBmaWVsZCBpcyBjbGVhcmVkLgotICAgICMgQnV0IHRoaXMgY2FzZSBkb2VzIG5lZWQgdG8gbm90IGNyYXNoIHRoZSBpbnRlcnByZXRlci4KLSAgICAjIEZvciB0aGUgQysrIGltcGxlbWVudGF0aW9uIHRoaXMgdGVzdHMgdGhlIGNvcnJlY3RuZXNzIG9mCi0gICAgIyBTY2FsYXJNYXBDb250YWluZXI6OlJlbGVhc2UoKQotICAgIG1zZyA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBpdCA9IGl0ZXIobXNnLm1hcF9pbnQzMl9pbnQzMikKLQotICAgIG1zZy5DbGVhckZpZWxkKCdtYXBfaW50MzJfaW50MzInKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKLSAgICAgIGZvciBfIGluIGl0OgotICAgICAgICBwYXNzCi0KLSAgICBpdCA9IGl0ZXIobXNnLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UpCi0gICAgbXNnLkNsZWFyRmllbGQoJ21hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2UnKQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoUnVudGltZUVycm9yKToKLSAgICAgIGZvciBfIGluIGl0OgotICAgICAgICBwYXNzCi0KLSAgZGVmIHRlc3RNYXBEZWxldGUoc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKG1zZy5tYXBfaW50MzJfaW50MzIpKQotCi0gICAgbXNnLm1hcF9pbnQzMl9pbnQzMls0XSA9IDYKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihtc2cubWFwX2ludDMyX2ludDMyKSkKLQotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IpOgotICAgICAgZGVsIG1zZy5tYXBfaW50MzJfaW50MzJbODhdCi0KLSAgICBkZWwgbXNnLm1hcF9pbnQzMl9pbnQzMls0XQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKG1zZy5tYXBfaW50MzJfaW50MzIpKQotCi0gIGRlZiB0ZXN0TWFwc0FyZU1hcHBpbmcoc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLm1hcF9pbnQzMl9pbnQzMiwgY29sbGVjdGlvbnMuTWFwcGluZykKLSAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UobXNnLm1hcF9pbnQzMl9pbnQzMiwgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcpCi0gICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG1zZy5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlLCBjb2xsZWN0aW9ucy5NYXBwaW5nKQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShtc2cubWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29sbGVjdGlvbnMuTXV0YWJsZU1hcHBpbmcpCi0KLSAgZGVmIHRlc3RNYXBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnNTbW9rZVRlc3Qoc2VsZik6Ci0gICAgbXNnID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLSAgICBtc2cubWFwX3N0cmluZ19zdHJpbmdbJ2FiYyddID0gJzEyMycKLSAgICBtc2cubWFwX2ludDMyX2ludDMyWzM1XSA9IDY0Ci0gICAgbXNnLm1hcF9zdHJpbmdfZm9yZWlnbl9tZXNzYWdlWydmb28nXS5jID0gNQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKG1zZy5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkpCi0KLQotCi1jbGFzcyBWYWxpZFR5cGVOYW1lc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBhc3NlcnRJbXBvcnRGcm9tTmFtZShzZWxmLCBtc2csIGJhc2VfbmFtZSk6Ci0gICAgIyBQYXJzZSA8dHlwZSAnbW9kdWxlLmNsYXNzX25hbWUnPiB0byBleHRyYSAnc29tZS5uYW1lJyBhcyBhIHN0cmluZy4KLSAgICB0cF9uYW1lID0gc3RyKHR5cGUobXNnKSkuc3BsaXQoIiciKVsxXQotICAgIHZhbGlkX25hbWVzID0gKCdSZXBlYXRlZCVzQ29udGFpbmVyJyAlIGJhc2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAnUmVwZWF0ZWQlc0ZpZWxkQ29udGFpbmVyJyAlIGJhc2VfbmFtZSkKLSAgICBzZWxmLmFzc2VydFRydWUoYW55KHRwX25hbWUuZW5kc3dpdGgodikgZm9yIHYgaW4gdmFsaWRfbmFtZXMpLAotICAgICAgICAgICAgICAgICAgICAnJXIgZG9lcyBlbmQgd2l0aCBhbnkgb2YgJXInICUgKHRwX25hbWUsIHZhbGlkX25hbWVzKSkKLQotICAgIHBhcnRzID0gdHBfbmFtZS5zcGxpdCgnLicpCi0gICAgY2xhc3NfbmFtZSA9IHBhcnRzWy0xXQotICAgIG1vZHVsZV9uYW1lID0gJy4nLmpvaW4ocGFydHNbOi0xXSkKLSAgICBfX2ltcG9ydF9fKG1vZHVsZV9uYW1lLCBmcm9tbGlzdD1bY2xhc3NfbmFtZV0pCi0KLSAgZGVmIHRlc3RUeXBlTmFtZXNDYW5CZUltcG9ydGVkKHNlbGYpOgotICAgICMgSWYgaW1wb3J0IGRvZXNuJ3Qgd29yaywgcGlja2xpbmcgd29uJ3Qgd29yayBlaXRoZXIuCi0gICAgcGIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEltcG9ydEZyb21OYW1lKHBiLnJlcGVhdGVkX2ludDMyLCAnU2NhbGFyJykKLSAgICBzZWxmLmFzc2VydEltcG9ydEZyb21OYW1lKHBiLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLCAnQ29tcG9zaXRlJykKLQotY2xhc3MgUGFja2VkRmllbGRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgc2V0TWVzc2FnZShzZWxmLCBtZXNzYWdlKToKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgxKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgxKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4wKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjApCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sLmFwcGVuZChUcnVlKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKDEpCi0KLSAgZGVmIHRlc3RQYWNrZWRGaWVsZHMoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHBhY2tlZF9maWVsZF90ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIHNlbGYuc2V0TWVzc2FnZShtZXNzYWdlKQotICAgIGdvbGRlbl9kYXRhID0gKGInXHgwQVx4MDFceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHgxMlx4MDFceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHgxQVx4MDFceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHgyMlx4MDFceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHgyQVx4MDFceDAyJwotICAgICAgICAgICAgICAgICAgIGInXHgzMlx4MDFceDAyJwotICAgICAgICAgICAgICAgICAgIGInXHgzQVx4MDRceDAxXHgwMFx4MDBceDAwJwotICAgICAgICAgICAgICAgICAgIGInXHg0Mlx4MDhceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCcKLSAgICAgICAgICAgICAgICAgICBiJ1x4NEFceDA0XHgwMVx4MDBceDAwXHgwMCcKLSAgICAgICAgICAgICAgICAgICBiJ1x4NTJceDA4XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCi0gICAgICAgICAgICAgICAgICAgYidceDVBXHgwNFx4MDBceDAwXHg4MFx4M2YnCi0gICAgICAgICAgICAgICAgICAgYidceDYyXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZjBceDNmJwotICAgICAgICAgICAgICAgICAgIGInXHg2QVx4MDFceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHg3Mlx4MDFceDAxJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9kYXRhLCBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLSAgZGVmIHRlc3RVbnBhY2tlZEZpZWxkcyhzZWxmKToKLSAgICBtZXNzYWdlID0gcGFja2VkX2ZpZWxkX3Rlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKLSAgICBzZWxmLnNldE1lc3NhZ2UobWVzc2FnZSkKLSAgICBnb2xkZW5fZGF0YSA9IChiJ1x4MDhceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHgxMFx4MDEnCi0gICAgICAgICAgICAgICAgICAgYidceDE4XHgwMScKLSAgICAgICAgICAgICAgICAgICBiJ1x4MjBceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHgyOFx4MDInCi0gICAgICAgICAgICAgICAgICAgYidceDMwXHgwMicKLSAgICAgICAgICAgICAgICAgICBiJ1x4M0RceDAxXHgwMFx4MDBceDAwJwotICAgICAgICAgICAgICAgICAgIGInXHg0MVx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwJwotICAgICAgICAgICAgICAgICAgIGInXHg0RFx4MDFceDAwXHgwMFx4MDAnCi0gICAgICAgICAgICAgICAgICAgYidceDUxXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAnCi0gICAgICAgICAgICAgICAgICAgYidceDVEXHgwMFx4MDBceDgwXHgzZicKLSAgICAgICAgICAgICAgICAgICBiJ1x4NjFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGYwXHgzZicKLSAgICAgICAgICAgICAgICAgICBiJ1x4NjhceDAxJwotICAgICAgICAgICAgICAgICAgIGInXHg3MFx4MDEnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZ29sZGVuX2RhdGEsIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLQotCi1AdW5pdHRlc3Quc2tpcElmKGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ2NwcCcsCi0gICAgICAgICAgICAgICAgICdleHBsaWNpdCB0ZXN0cyBvZiB0aGUgQysrIGltcGxlbWVudGF0aW9uJykKLWNsYXNzIE92ZXJzaXplUHJvdG9zVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIHNlbGYuZmlsZV9kZXNjID0gIiIiCi0gICAgICBuYW1lOiAiZi9mLm1zZzIiCi0gICAgICBwYWNrYWdlOiAiZiIKLSAgICAgIG1lc3NhZ2VfdHlwZSB7Ci0gICAgICAgIG5hbWU6ICJtc2cxIgotICAgICAgICBmaWVsZCB7Ci0gICAgICAgICAgbmFtZTogInBheWxvYWQiCi0gICAgICAgICAgbnVtYmVyOiAxCi0gICAgICAgICAgbGFiZWw6IExBQkVMX09QVElPTkFMCi0gICAgICAgICAgdHlwZTogVFlQRV9TVFJJTkcKLSAgICAgICAgfQotICAgICAgfQotICAgICAgbWVzc2FnZV90eXBlIHsKLSAgICAgICAgbmFtZTogIm1zZzIiCi0gICAgICAgIGZpZWxkIHsKLSAgICAgICAgICBuYW1lOiAiZmllbGQiCi0gICAgICAgICAgbnVtYmVyOiAxCi0gICAgICAgICAgbGFiZWw6IExBQkVMX09QVElPTkFMCi0gICAgICAgICAgdHlwZTogVFlQRV9NRVNTQUdFCi0gICAgICAgICAgdHlwZV9uYW1lOiAibXNnMSIKLSAgICAgICAgfQotICAgICAgfQotICAgICIiIgotICAgIHBvb2wgPSBkZXNjcmlwdG9yX3Bvb2wuRGVzY3JpcHRvclBvb2woKQotICAgIGRlc2MgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZShzZWxmLmZpbGVfZGVzYywgZGVzYykKLSAgICBwb29sLkFkZChkZXNjKQotICAgIHNlbGYucHJvdG9fY2xzID0gbWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KHBvb2wpLkdldFByb3RvdHlwZSgKLSAgICAgICAgcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoJ2YubXNnMicpKQotICAgIHNlbGYucCA9IHNlbGYucHJvdG9fY2xzKCkKLSAgICBzZWxmLnAuZmllbGQucGF5bG9hZCA9ICdjJyAqICgxMDI0ICogMTAyNCAqIDY0ICsgMSkKLSAgICBzZWxmLnBfc2VyaWFsaXplZCA9IHNlbGYucC5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgZGVmIHRlc3RBc3NlcnRPdmVyc2l6ZVByb3RvKHNlbGYpOgotICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmLnB5ZXh0Ll9tZXNzYWdlIGltcG9ydCBTZXRBbGxvd092ZXJzaXplUHJvdG9zCi0gICAgU2V0QWxsb3dPdmVyc2l6ZVByb3RvcyhGYWxzZSkKLSAgICBxID0gc2VsZi5wcm90b19jbHMoKQotICAgIHRyeToKLSAgICAgIHEuUGFyc2VGcm9tU3RyaW5nKHNlbGYucF9zZXJpYWxpemVkKQotICAgIGV4Y2VwdCBtZXNzYWdlLkRlY29kZUVycm9yIGFzIGU6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKHN0cihlKSwgJ0Vycm9yIHBhcnNpbmcgbWVzc2FnZScpCi0KLSAgZGVmIHRlc3RTdWNjZWVkT3ZlcnNpemVQcm90byhzZWxmKToKLSAgICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5weWV4dC5fbWVzc2FnZSBpbXBvcnQgU2V0QWxsb3dPdmVyc2l6ZVByb3RvcwotICAgIFNldEFsbG93T3ZlcnNpemVQcm90b3MoVHJ1ZSkKLSAgICBxID0gc2VsZi5wcm90b19jbHMoKQotICAgIHEuUGFyc2VGcm9tU3RyaW5nKHNlbGYucF9zZXJpYWxpemVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5wLmZpZWxkLnBheWxvYWQsIHEuZmllbGQucGF5bG9hZCkKLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21pc3NpbmdfZW51bV92YWx1ZXMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21pc3NpbmdfZW51bV92YWx1ZXMucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NTBiZTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9taXNzaW5nX2VudW1fdmFsdWVzLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWw7Ci0KLW1lc3NhZ2UgVGVzdEVudW1WYWx1ZXMgewotICBlbnVtIE5lc3RlZEVudW0gewotICAgIFpFUk8gPSAwOwotICAgIE9ORSA9IDE7Ci0gIH0KLSAgb3B0aW9uYWwgTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bSA9IDE7Ci0gIHJlcGVhdGVkIE5lc3RlZEVudW0gcmVwZWF0ZWRfbmVzdGVkX2VudW0gPSAyOwotICByZXBlYXRlZCBOZXN0ZWRFbnVtIHBhY2tlZF9uZXN0ZWRfZW51bSA9IDMgW3BhY2tlZCA9IHRydWVdOwotfQotCi1tZXNzYWdlIFRlc3RNaXNzaW5nRW51bVZhbHVlcyB7Ci0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgVFdPID0gMjsKLSAgfQotICBvcHRpb25hbCBOZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtID0gMTsKLSAgcmVwZWF0ZWQgTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bSA9IDI7Ci0gIHJlcGVhdGVkIE5lc3RlZEVudW0gcGFja2VkX25lc3RlZF9lbnVtID0gMyBbcGFja2VkID0gdHJ1ZV07Ci19Ci0KLW1lc3NhZ2UgSnVzdFN0cmluZyB7Ci0gIHJlcXVpcmVkIHN0cmluZyBkdW1teSA9IDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3OGYxNDY3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsOwotCi0KLW1lc3NhZ2UgVG9wTGV2ZWxNZXNzYWdlIHsKLSAgb3B0aW9uYWwgRXh0ZW5kZWRNZXNzYWdlIHN1Ym1lc3NhZ2UgPSAxOwotfQotCi0KLW1lc3NhZ2UgRXh0ZW5kZWRNZXNzYWdlIHsKLSAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKLX0KLQotCi1tZXNzYWdlIEZvcmVpZ25NZXNzYWdlIHsKLSAgb3B0aW9uYWwgaW50MzIgZm9yZWlnbl9tZXNzYWdlX2ludCA9IDE7Ci19Ci0KLQotZXh0ZW5kIEV4dGVuZGVkTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludF9leHRlbnNpb24gPSAxOwotICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBvcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI7Ci0KLSAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50X2V4dGVuc2lvbiA9IDM7Ci0gIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIHJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gNDsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zX2R5bmFtaWMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9uc19keW5hbWljLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMWY4NWVmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zX2R5bmFtaWMucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBqYXNvbmhAZ29vZ2xlLmNvbSAoSmFzb24gSHN1ZWgpCi0vLwotLy8gVGhpcyBmaWxlIGlzIHVzZWQgdG8gdGVzdCBhIGNvcm5lciBjYXNlIGluIHRoZSBDUFAgaW1wbGVtZW50YXRpb24gd2hlcmUgdGhlCi0vLyBnZW5lcmF0ZWQgQysrIHR5cGUgaXMgYXZhaWxhYmxlIGZvciB0aGUgZXh0ZW5kZWUsIGJ1dCB0aGUgZXh0ZW5zaW9uIGlzCi0vLyBkZWZpbmVkIGluIGEgZmlsZSB3aG9zZSBDKysgdHlwZSBpcyBub3QgaW4gdGhlIGJpbmFyeS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90byI7Ci0KLXBhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsOwotCi1tZXNzYWdlIER5bmFtaWNNZXNzYWdlVHlwZSB7Ci0gIG9wdGlvbmFsIGludDMyIGEgPSAxOwotfQotCi1leHRlbmQgRXh0ZW5kZWRNZXNzYWdlIHsKLSAgb3B0aW9uYWwgaW50MzIgZHluYW1pY19pbnQzMl9leHRlbnNpb24gPSAxMDA7Ci0gIG9wdGlvbmFsIER5bmFtaWNNZXNzYWdlVHlwZSBkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uID0gMTAxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzZhYjllLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDUyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHJvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbDsKLQotLy8gQSBtZXNzYWdlIHdoZXJlIHRhZyBudW1iZXJzIGFyZSBsaXN0ZWQgb3V0IG9mIG9yZGVyLCB0byBhbGxvdyB1cyB0byB0ZXN0IG91cgotLy8gY2Fub25pY2FsaXphdGlvbiBvZiBzZXJpYWxpemVkIG91dHB1dCwgd2hpY2ggc2hvdWxkIGFsd2F5cyBiZSBpbiB0YWcgb3JkZXIuCi0vLyBXZSBhbHNvIG1peCBpbiBzb21lIGV4dGVuc2lvbnMgZm9yIGV4dHJhIGZ1bi4KLW1lc3NhZ2UgT3V0T2ZPcmRlckZpZWxkcyB7Ci0gIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMiAgID0gIDU7Ci0gIGV4dGVuc2lvbnMgNCB0byA0OwotICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOwotICBleHRlbnNpb25zIDIgdG8gMjsKLSAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKLX07Ci0KLQotZXh0ZW5kIE91dE9mT3JkZXJGaWVsZHMgewotICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OwotICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9wYWNrZWRfZmllbGRfdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcGFja2VkX2ZpZWxkX3Rlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDBkZmRjMTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9wYWNrZWRfZmllbGRfdGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDczICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1zeW50YXggPSAicHJvdG8zIjsKLQotcGFja2FnZSBnb29nbGUucHJvdG9idWYucHl0aG9uLmludGVybmFsOwotCi1tZXNzYWdlIFRlc3RQYWNrZWRUeXBlcyB7Ci0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgRk9PID0gMDsKLSAgICBCQVIgPSAxOwotICAgIEJBWiA9IDI7Ci0gIH0KLQotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9ICAxOwotICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9ICAyOwotICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9ICAzOwotICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9ICA0OwotICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9ICA1OwotICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9ICA2OwotICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9ICA3OwotICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9ICA4OwotICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9ICA5OwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDEwOwotICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDExOwotICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDEyOwotICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDEzOwotICByZXBlYXRlZCBOZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gMTQ7Ci19Ci0KLW1lc3NhZ2UgVGVzdFVucGFja2VkVHlwZXMgewotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9ICAxIFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0ICAgID0gIDIgW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyICAgPSAgMyBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9ICA0IFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkICAgc2ludDMyIHJlcGVhdGVkX3NpbnQzMiAgID0gIDUgW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ICAgPSAgNiBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9ICA3IFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkICBmaXhlZDY0IHJlcGVhdGVkX2ZpeGVkNjQgID0gIDggW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAgOSBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDEwIFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkICAgIGZsb2F0IHJlcGVhdGVkX2Zsb2F0ICAgID0gMTEgW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlICAgPSAxMiBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDEzIFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkIFRlc3RQYWNrZWRUeXBlcy5OZXN0ZWRFbnVtIHJlcGVhdGVkX25lc3RlZF9lbnVtID0gMTQgW3BhY2tlZCA9IGZhbHNlXTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHJvdG9fYnVpbGRlcl90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9wcm90b19idWlsZGVyX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDM2ZGZiZmQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9wcm90b19idWlsZGVyX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSw5NiArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYucHJvdG9fYnVpbGRlci4iIiIKLQotdHJ5OgotICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Ci1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgICNQWTI2Ci10cnk6Ci0gIGltcG9ydCB1bml0dGVzdDIgYXMgdW5pdHRlc3QKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgaW1wb3J0IHVuaXR0ZXN0Ci0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcG9vbAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHByb3RvX2J1aWxkZXIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAotCi0KLWNsYXNzIFByb3RvQnVpbGRlclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLm9yZGVyZWRfZmllbGRzID0gT3JkZXJlZERpY3QoWwotICAgICAgICAoJ2ZvbycsIGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLlRZUEVfSU5UNjQpLAotICAgICAgICAoJ2JhcicsIGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLlRZUEVfU1RSSU5HKSwKLSAgICAgICAgXSkKLSAgICBzZWxmLl9maWVsZHMgPSBkaWN0KHNlbGYub3JkZXJlZF9maWVsZHMpCi0KLSAgZGVmIHRlc3RNYWtlU2ltcGxlUHJvdG9DbGFzcyhzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgd2UgY2FuIGNyZWF0ZSBhIHByb3RvIGNsYXNzLiIiIgotICAgIHByb3RvX2NscyA9IHByb3RvX2J1aWxkZXIuTWFrZVNpbXBsZVByb3RvQ2xhc3MoCi0gICAgICAgIHNlbGYuX2ZpZWxkcywKLSAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0LlRlc3QnKQotICAgIHByb3RvID0gcHJvdG9fY2xzKCkKLSAgICBwcm90by5mb28gPSAxMjM0NQotICAgIHByb3RvLmJhciA9ICdhc2RmJwotICAgIHNlbGYuYXNzZXJ0TXVsdGlMaW5lRXF1YWwoCi0gICAgICAgICdiYXI6ICJhc2RmIlxuZm9vOiAxMjM0NVxuJywgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKHByb3RvKSkKLQotICBkZWYgdGVzdE9yZGVyZWRGaWVsZHMoc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IHRoZSBmaWVsZCBvcmRlciBpcyBtYWludGFpbmVkIHdoZW4gZ2l2ZW4gYW4gT3JkZXJlZERpY3QuIiIiCi0gICAgcHJvdG9fY2xzID0gcHJvdG9fYnVpbGRlci5NYWtlU2ltcGxlUHJvdG9DbGFzcygKLSAgICAgICAgc2VsZi5vcmRlcmVkX2ZpZWxkcywKLSAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0Lk9yZGVyZWRUZXN0JykKLSAgICBwcm90byA9IHByb3RvX2NscygpCi0gICAgcHJvdG8uZm9vID0gMTIzNDUKLSAgICBwcm90by5iYXIgPSAnYXNkZicKLSAgICBzZWxmLmFzc2VydE11bHRpTGluZUVxdWFsKAotICAgICAgICAnZm9vOiAxMjM0NVxuYmFyOiAiYXNkZiJcbicsIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhwcm90bykpCi0KLSAgZGVmIHRlc3RNYWtlU2FtZVByb3RvQ2xhc3NUd2ljZShzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgdGhlIERlc2NyaXB0b3JQb29sIGlzIHVzZWQuIiIiCi0gICAgcG9vbCA9IGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCi0gICAgcHJvdG9fY2xzMSA9IHByb3RvX2J1aWxkZXIuTWFrZVNpbXBsZVByb3RvQ2xhc3MoCi0gICAgICAgIHNlbGYuX2ZpZWxkcywKLSAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0LlRlc3QnLAotICAgICAgICBwb29sPXBvb2wpCi0gICAgcHJvdG9fY2xzMiA9IHByb3RvX2J1aWxkZXIuTWFrZVNpbXBsZVByb3RvQ2xhc3MoCi0gICAgICAgIHNlbGYuX2ZpZWxkcywKLSAgICAgICAgZnVsbF9uYW1lPSduZXQucHJvdG8yLnB5dGhvbi5wdWJsaWMucHJvdG9fYnVpbGRlcl90ZXN0LlRlc3QnLAotICAgICAgICBwb29sPXBvb2wpCi0gICAgc2VsZi5hc3NlcnRJcyhwcm90b19jbHMxLkRFU0NSSVBUT1IsIHByb3RvX2NsczIuREVTQ1JJUFRPUikKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3B5dGhvbl9tZXNzYWdlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBmOGY3M2RkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcHl0aG9uX21lc3NhZ2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNTQ4ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIyBUaGlzIGNvZGUgaXMgbWVhbnQgdG8gd29yayBvbiBQeXRob24gMi40IGFuZCBhYm92ZSBvbmx5LgotIwotIyBUT0RPKHJvYmluc29uKTogSGVscGVycyBmb3IgdmVyYm9zZSwgY29tbW9uIGNoZWNrcyBsaWtlIHNlZWluZyBpZiBhCi0jIGRlc2NyaXB0b3IncyBjcHBfdHlwZSBpcyBDUFBUWVBFX01FU1NBR0UuCi0KLSIiIkNvbnRhaW5zIGEgbWV0YWNsYXNzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgdG8gY3JlYXRlCi1wcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZnJvbSBEZXNjcmlwdG9yIG9iamVjdHMgYXQgcnVudGltZS4KLQotUmVjYWxsIHRoYXQgYSBtZXRhY2xhc3MgaXMgdGhlICJ0eXBlIiBvZiBhIGNsYXNzLgotKEEgY2xhc3MgaXMgdG8gYSBtZXRhY2xhc3Mgd2hhdCBhbiBpbnN0YW5jZSBpcyB0byBhIGNsYXNzLikKLQotSW4gdGhpcyBjYXNlLCB3ZSB1c2UgdGhlIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgbWV0YWNsYXNzCi10byBpbmplY3QgYWxsIHRoZSB1c2VmdWwgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBjbGFzc2VzCi1vdXRwdXQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyIGF0IGNvbXBpbGUtdGltZS4KLQotVGhlIHVwc2hvdCBvZiBhbGwgdGhpcyBpcyB0aGF0IHRoZSByZWFsIGltcGxlbWVudGF0aW9uCi1kZXRhaWxzIGZvciBBTEwgcHVyZS1QeXRob24gcHJvdG9jb2wgYnVmZmVycyBhcmUgKmhlcmUgaW4KLXRoaXMgZmlsZSouCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotZnJvbSBpbyBpbXBvcnQgQnl0ZXNJTwotaW1wb3J0IHN5cwotaW1wb3J0IHN0cnVjdAotaW1wb3J0IHdlYWtyZWYKLQotaW1wb3J0IHNpeAotdHJ5OgotICBpbXBvcnQgc2l4Lm1vdmVzLmNvcHlyZWcgYXMgY29weXJlZwotZXhjZXB0IEltcG9ydEVycm9yOgotICAjIE9uIHNvbWUgcGxhdGZvcm1zLCBmb3IgZXhhbXBsZSBnTWFjLCB3ZSBydW4gbmF0aXZlIFB5dGhvbiBiZWNhdXNlIHRoZXJlIGlzCi0gICMgbm90aGluZyBsaWtlIGhlcm1ldGljIFB5dGhvbi4gVGhpcyBtZWFucyBsZXNzZXIgY29udHJvbCBvbiB0aGUgc3lzdGVtIGFuZAotICAjIHRoZSBzaXgubW92ZXMgcGFja2FnZSBtYXkgYmUgbWlzc2luZyAoaXMgbWlzc2luZyBvbiAyMDE1MDMyMSBvbiBnTWFjKS4gQmUKLSAgIyBleHRyYSBjb25zZXJ2YXRpdmUgYW5kIHRyeSB0byBsb2FkIHRoZSBvbGQgcmVwbGFjZW1lbnQgaWYgaXQgZmFpbHMuCi0gIGltcG9ydCBjb3B5X3JlZyBhcyBjb3B5cmVnCi0KLSMgV2UgdXNlICJhcyIgdG8gYXZvaWQgbmFtZSBjb2xsaXNpb25zIHdpdGggdmFyaWFibGVzLgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNvbnRhaW5lcnMKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZWNvZGVyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW5jb2RlcgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGVudW1fdHlwZV93cmFwcGVyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbWVzc2FnZV9saXN0ZW5lciBhcyBtZXNzYWdlX2xpc3RlbmVyX21vZAotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHR5cGVfY2hlY2tlcnMKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3ZWxsX2tub3duX3R5cGVzCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIGRlc2NyaXB0b3JfbW9kCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBtZXNzYWdlX21vZAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Ci0KLV9GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX21vZC5GaWVsZERlc2NyaXB0b3IKLV9BbnlGdWxsVHlwZU5hbWUgPSAnZ29vZ2xlLnByb3RvYnVmLkFueScKLQotCi1jbGFzcyBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKHR5cGUpOgotCi0gICIiIk1ldGFjbGFzcyBmb3IgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGNyZWF0ZWQgYXQgcnVudGltZSBmcm9tIERlc2NyaXB0b3JzLgotCi0gIFdlIGFkZCBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgTWVzc2FnZSBjbGFzcy4gIFdlCi0gIGFsc28gY3JlYXRlIHByb3BlcnRpZXMgdG8gYWxsb3cgZ2V0dGluZy9zZXR0aW5nIGFsbCBmaWVsZHMgaW4gdGhlIHByb3RvY29sCi0gIG1lc3NhZ2UuICBGaW5hbGx5LCB3ZSBjcmVhdGUgc2xvdHMgdG8gcHJldmVudCB1c2VycyBmcm9tIGFjY2lkZW50YWxseQotICAic2V0dGluZyIgbm9uZXhpc3RlbnQgZmllbGRzIGluIHRoZSBwcm90b2NvbCBtZXNzYWdlLCB3aGljaCB0aGVuIHdvdWxkbid0IGdldAotICBzZXJpYWxpemVkIC8gZGVzZXJpYWxpemVkIHByb3Blcmx5LgotCi0gIFRoZSBwcm90b2NvbCBjb21waWxlciBjdXJyZW50bHkgdXNlcyB0aGlzIG1ldGFjbGFzcyB0byBjcmVhdGUgcHJvdG9jb2wKLSAgbWVzc2FnZSBjbGFzc2VzIGF0IHJ1bnRpbWUuICBDbGllbnRzIGNhbiBhbHNvIG1hbnVhbGx5IGNyZWF0ZSB0aGVpciBvd24KLSAgY2xhc3NlcyBhdCBydW50aW1lLCBhcyBpbiB0aGlzIGV4YW1wbGU6Ci0KLSAgbXlkZXNjcmlwdG9yID0gRGVzY3JpcHRvciguLi4uLikKLSAgY2xhc3MgTXlQcm90b0NsYXNzKE1lc3NhZ2UpOgotICAgIF9fbWV0YWNsYXNzX18gPSBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgotICBteXByb3RvX2luc3RhbmNlID0gTXlQcm90b0NsYXNzKCkKLSAgbXlwcm90by5mb29fZmllbGQgPSAyMwotICAuLi4KLQotICBUaGUgYWJvdmUgZXhhbXBsZSB3aWxsIG5vdCB3b3JrIGZvciBuZXN0ZWQgdHlwZXMuIElmIHlvdSB3aXNoIHRvIGluY2x1ZGUgdGhlbSwKLSAgdXNlIHJlZmxlY3Rpb24uTWFrZUNsYXNzKCkgaW5zdGVhZCBvZiBtYW51YWxseSBpbnN0YW50aWF0aW5nIHRoZSBjbGFzcyBpbgotICBvcmRlciB0byBjcmVhdGUgdGhlIGFwcHJvcHJpYXRlIGNsYXNzIHN0cnVjdHVyZS4KLSAgIiIiCi0KLSAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJvdG9jb2wtY29tcGlsZXIgY29kZSBpbgotICAjIHByb3RvMi9jb21waWxlci9pbnRlcm5hbC9nZW5lcmF0b3IuKi4KLSAgX0RFU0NSSVBUT1JfS0VZID0gJ0RFU0NSSVBUT1InCi0KLSAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6Ci0gICAgIiIiQ3VzdG9tIGFsbG9jYXRpb24gZm9yIHJ1bnRpbWUtZ2VuZXJhdGVkIGNsYXNzIHR5cGVzLgotCi0gICAgV2Ugb3ZlcnJpZGUgX19uZXdfXyBiZWNhdXNlIHRoaXMgaXMgYXBwYXJlbnRseSB0aGUgb25seSBwbGFjZQotICAgIHdoZXJlIHdlIGNhbiBtZWFuaW5nZnVsbHkgc2V0IF9fc2xvdHNfXyBvbiB0aGUgY2xhc3Mgd2UncmUgY3JlYXRpbmcoPykuCi0gICAgKFRoZSBpbnRlcnBsYXkgYmV0d2VlbiBtZXRhY2xhc3NlcyBhbmQgc2xvdHMgaXMgbm90IHZlcnkgd2VsbC1kb2N1bWVudGVkKS4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICBtZXRhY2xhc3MgcHJvdG9jb2wpLgotICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgotICAgICAgICAoU2hvdWxkIGJlIG1lc3NhZ2UuTWVzc2FnZSkuICBXZSBpZ25vcmUgdGhpcyBmaWVsZCwgYnV0Ci0gICAgICAgIGl0J3MgcmVxdWlyZWQgYnkgdGhlIG1ldGFjbGFzcyBwcm90b2NvbAotICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIHdlJ3JlCi0gICAgICAgIGNvbnN0cnVjdGluZy4gIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4KLSAgICAgICAgYSBEZXNjcmlwdG9yIG9iamVjdCBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgbWVzc2FnZQotICAgICAgICB0eXBlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIE5ld2x5LWFsbG9jYXRlZCBjbGFzcy4KLSAgICAiIiIKLSAgICBkZXNjcmlwdG9yID0gZGljdGlvbmFyeVtHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlLl9ERVNDUklQVE9SX0tFWV0KLSAgICBpZiBkZXNjcmlwdG9yLmZ1bGxfbmFtZSBpbiB3ZWxsX2tub3duX3R5cGVzLldLVEJBU0VTOgotICAgICAgYmFzZXMgKz0gKHdlbGxfa25vd25fdHlwZXMuV0tUQkFTRVNbZGVzY3JpcHRvci5mdWxsX25hbWVdLCkKLSAgICBfQWRkQ2xhc3NBdHRyaWJ1dGVzRm9yTmVzdGVkRXh0ZW5zaW9ucyhkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KQotICAgIF9BZGRTbG90cyhkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KQotCi0gICAgc3VwZXJjbGFzcyA9IHN1cGVyKEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUsIGNscykKLSAgICBuZXdfY2xhc3MgPSBzdXBlcmNsYXNzLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSkKLSAgICByZXR1cm4gbmV3X2NsYXNzCi0KLSAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgotICAgICIiIkhlcmUgd2UgcGVyZm9ybSB0aGUgbWFqb3JpdHkgb2Ygb3VyIHdvcmsgb24gdGhlIGNsYXNzLgotICAgIFdlIGFkZCBlbnVtIGdldHRlcnMsIGFuIF9faW5pdF9fIG1ldGhvZCwgaW1wbGVtZW50YXRpb25zCi0gICAgb2YgYWxsIE1lc3NhZ2UgbWV0aG9kcywgYW5kIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMKLSAgICBpbiB0aGUgcHJvdG9jb2wgdHlwZS4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICBtZXRhY2xhc3MgcHJvdG9jb2wpLgotICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgotICAgICAgICAoU2hvdWxkIGJlIG1lc3NhZ2UuTWVzc2FnZSkuICBXZSBpZ25vcmUgdGhpcyBmaWVsZCwgYnV0Ci0gICAgICAgIGl0J3MgcmVxdWlyZWQgYnkgdGhlIG1ldGFjbGFzcyBwcm90b2NvbAotICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIHdlJ3JlCi0gICAgICAgIGNvbnN0cnVjdGluZy4gIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4KLSAgICAgICAgYSBEZXNjcmlwdG9yIG9iamVjdCBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgbWVzc2FnZQotICAgICAgICB0eXBlLgotICAgICIiIgotICAgIGRlc2NyaXB0b3IgPSBkaWN0aW9uYXJ5W0dlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUuX0RFU0NSSVBUT1JfS0VZXQotICAgIGNscy5fZGVjb2RlcnNfYnlfdGFnID0ge30KLSAgICBjbHMuX2V4dGVuc2lvbnNfYnlfbmFtZSA9IHt9Ci0gICAgY2xzLl9leHRlbnNpb25zX2J5X251bWJlciA9IHt9Ci0gICAgaWYgKGRlc2NyaXB0b3IuaGFzX29wdGlvbnMgYW5kCi0gICAgICAgIGRlc2NyaXB0b3IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KToKLSAgICAgIGNscy5fZGVjb2RlcnNfYnlfdGFnW2RlY29kZXIuTUVTU0FHRV9TRVRfSVRFTV9UQUddID0gKAotICAgICAgICAgIGRlY29kZXIuTWVzc2FnZVNldEl0ZW1EZWNvZGVyKGNscy5fZXh0ZW5zaW9uc19ieV9udW1iZXIpLCBOb25lKQotCi0gICAgIyBBdHRhY2ggc3R1ZmYgdG8gZWFjaCBGaWVsZERlc2NyaXB0b3IgZm9yIHF1aWNrIGxvb2t1cCBsYXRlciBvbi4KLSAgICBmb3IgZmllbGQgaW4gZGVzY3JpcHRvci5maWVsZHM6Ci0gICAgICBfQXR0YWNoRmllbGRIZWxwZXJzKGNscywgZmllbGQpCi0KLSAgICBkZXNjcmlwdG9yLl9jb25jcmV0ZV9jbGFzcyA9IGNscyAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwotICAgIF9BZGRFbnVtVmFsdWVzKGRlc2NyaXB0b3IsIGNscykKLSAgICBfQWRkSW5pdE1ldGhvZChkZXNjcmlwdG9yLCBjbHMpCi0gICAgX0FkZFByb3BlcnRpZXNGb3JGaWVsZHMoZGVzY3JpcHRvciwgY2xzKQotICAgIF9BZGRQcm9wZXJ0aWVzRm9yRXh0ZW5zaW9ucyhkZXNjcmlwdG9yLCBjbHMpCi0gICAgX0FkZFN0YXRpY01ldGhvZHMoY2xzKQotICAgIF9BZGRNZXNzYWdlTWV0aG9kcyhkZXNjcmlwdG9yLCBjbHMpCi0gICAgX0FkZFByaXZhdGVIZWxwZXJNZXRob2RzKGRlc2NyaXB0b3IsIGNscykKLSAgICBjb3B5cmVnLnBpY2tsZShjbHMsIGxhbWJkYSBvYmo6IChjbHMsICgpLCBvYmouX19nZXRzdGF0ZV9fKCkpKQotCi0gICAgc3VwZXJjbGFzcyA9IHN1cGVyKEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUsIGNscykKLSAgICBzdXBlcmNsYXNzLl9faW5pdF9fKG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KQotCi0KLSMgU3RhdGVsZXNzIGhlbHBlcnMgZm9yIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgYmVsb3cuCi0jIE91dHNpZGUgY2xpZW50cyBzaG91bGQgbm90IGFjY2VzcyB0aGVzZSBkaXJlY3RseS4KLSMKLSMgSSBvcHRlZCBub3QgdG8gbWFrZSBhbnkgb2YgdGhlc2UgbWV0aG9kcyBvbiB0aGUgbWV0YWNsYXNzLCB0byBtYWtlIGl0IG1vcmUKLSMgY2xlYXIgdGhhdCBJJ20gbm90IHJlYWxseSB1c2luZyBhbnkgc3RhdGUgdGhlcmUgYW5kIHRvIGtlZXAgY2xpZW50cyBmcm9tCi0jIHRoaW5raW5nIHRoYXQgdGhleSBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgY29uc3RydWN0aW9uIGhlbHBlcnMuCi0KLQotZGVmIF9Qcm9wZXJ0eU5hbWUocHJvdG9fZmllbGRfbmFtZSk6Ci0gICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHB1YmxpYyBwcm9wZXJ0eSBhdHRyaWJ1dGUgd2hpY2gKLSAgY2xpZW50cyBjYW4gdXNlIHRvIGdldCBhbmQgKGluIHNvbWUgY2FzZXMpIHNldCB0aGUgdmFsdWUKLSAgb2YgYSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgotCi0gIEFyZ3M6Ci0gICAgcHJvdG9fZmllbGRfbmFtZTogVGhlIHByb3RvY29sIG1lc3NhZ2UgZmllbGQgbmFtZSwgZXhhY3RseQotICAgICAgYXMgaXQgYXBwZWFycyAob3Igd291bGQgYXBwZWFyKSBpbiBhIC5wcm90byBmaWxlLgotICAiIiIKLSAgIyBUT0RPKHJvYmluc29uKTogRXNjYXBlIFB5dGhvbiBrZXl3b3JkcyAoZS5nLiwgeWllbGQpLCBhbmQgdGVzdCB0aGlzIHN1cHBvcnQuCi0gICMgbm5vcndpdHogbWFrZXMgbXkgZGF5IGJ5IHdyaXRpbmc6Ci0gICMgIiIiCi0gICMgRllJLiAgU2VlIHRoZSBrZXl3b3JkIG1vZHVsZSBpbiB0aGUgc3RkbGliLiBUaGlzIGNvdWxkIGJlIGFzIHNpbXBsZSBhczoKLSAgIwotICAjIGlmIGtleXdvcmQuaXNrZXl3b3JkKHByb3RvX2ZpZWxkX25hbWUpOgotICAjICAgcmV0dXJuIHByb3RvX2ZpZWxkX25hbWUgKyAiXyIKLSAgIyByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQotICAjICIiIgotICAjIEtlbnRvbiBzYXlzOiAgVGhlIGFib3ZlIGlzIGEgQkFEIElERUEuICBQZW9wbGUgcmVseSBvbiBiZWluZyBhYmxlIHRvIHVzZQotICAjICAgZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgdG8gcmVmbGVjdGl2ZWx5IG1hbmlwdWxhdGUgZmllbGQgdmFsdWVzLiAgSWYgd2UKLSAgIyAgIHJlbmFtZSB0aGUgcHJvcGVydGllcywgdGhlbiBldmVyeSBzdWNoIHVzZXIgaGFzIHRvIGFsc28gbWFrZSBzdXJlIHRvIGFwcGx5Ci0gICMgICB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbi4gIE5vdGUgdGhhdCBjdXJyZW50bHkgaWYgeW91IG5hbWUgYSBmaWVsZCAieWllbGQiLAotICAjICAgeW91IGNhbiBzdGlsbCBhY2Nlc3MgaXQganVzdCBmaW5lIHVzaW5nIGdldGF0dHIvc2V0YXR0ciAtLSBpdCdzIG5vdCBldmVuCi0gICMgICB0aGF0IGN1bWJlcnNvbWUgdG8gZG8gc28uCi0gICMgVE9ETyhrZW50b24pOiAgUmVtb3ZlIHRoaXMgbWV0aG9kIGVudGlyZWx5IGlmL3doZW4gZXZlcnlvbmUgYWdyZWVzIHdpdGggbXkKLSAgIyAgIHBvc2l0aW9uLgotICByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQotCi0KLWRlZiBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKG1lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpOgotICAiIiJWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGhhbmRsZSBpcyB2YWxpZC4iIiIKLQotICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb25faGFuZGxlLCBfRmllbGREZXNjcmlwdG9yKToKLSAgICByYWlzZSBLZXlFcnJvcignSGFzRXh0ZW5zaW9uKCkgZXhwZWN0cyBhbiBleHRlbnNpb24gaGFuZGxlLCBnb3Q6ICVzJyAlCi0gICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZSkKLQotICBpZiBub3QgZXh0ZW5zaW9uX2hhbmRsZS5pc19leHRlbnNpb246Ci0gICAgcmFpc2UgS2V5RXJyb3IoJyIlcyIgaXMgbm90IGFuIGV4dGVuc2lvbi4nICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCi0KLSAgaWYgbm90IGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlOgotICAgIHJhaXNlIEtleUVycm9yKCciJXMiIGlzIG1pc3NpbmcgYSBjb250YWluaW5nX3R5cGUuJwotICAgICAgICAgICAgICAgICAgICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCi0KLSAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5jb250YWluaW5nX3R5cGUgaXMgbm90IG1lc3NhZ2UuREVTQ1JJUFRPUjoKLSAgICByYWlzZSBLZXlFcnJvcignRXh0ZW5zaW9uICIlcyIgZXh0ZW5kcyBtZXNzYWdlIHR5cGUgIiVzIiwgYnV0IHRoaXMgJwotICAgICAgICAgICAgICAgICAgICdtZXNzYWdlIGlzIG9mIHR5cGUgIiVzIi4nICUKLSAgICAgICAgICAgICAgICAgICAoZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlLmZ1bGxfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkpCi0KLQotZGVmIF9BZGRTbG90cyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpOgotICAiIiJBZGRzIGEgX19zbG90c19fIGVudHJ5IHRvIGRpY3Rpb25hcnksIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB2YWxpZAotICBhdHRyaWJ1dGVzIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KLQotICBBcmdzOgotICAgIG1lc3NhZ2VfZGVzY3JpcHRvcjogQSBEZXNjcmlwdG9yIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhpcyBtZXNzYWdlIHR5cGUuCi0gICAgZGljdGlvbmFyeTogQ2xhc3MgZGljdGlvbmFyeSB0byB3aGljaCB3ZSdsbCBhZGQgYSAnX19zbG90c19fJyBlbnRyeS4KLSAgIiIiCi0gIGRpY3Rpb25hcnlbJ19fc2xvdHNfXyddID0gWydfY2FjaGVkX2J5dGVfc2l6ZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfZmllbGRzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ191bmtub3duX2ZpZWxkcycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfaXNfcHJlc2VudF9pbl9wYXJlbnQnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2xpc3RlbmVyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19saXN0ZW5lcl9mb3JfY2hpbGRyZW4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX193ZWFrcmVmX18nLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX29uZW9mcyddCi0KLQotZGVmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGQpOgotICByZXR1cm4gKGZpZWxkLmlzX2V4dGVuc2lvbiBhbmQKLSAgICAgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUuaGFzX29wdGlvbnMgYW5kCi0gICAgICAgICAgZmllbGQuY29udGFpbmluZ190eXBlLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCBhbmQKLSAgICAgICAgICBmaWVsZC50eXBlID09IF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFIGFuZAotICAgICAgICAgIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfT1BUSU9OQUwpCi0KLQotZGVmIF9Jc01hcEZpZWxkKGZpZWxkKToKLSAgcmV0dXJuIChmaWVsZC50eXBlID09IF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFIGFuZAotICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZS5oYXNfb3B0aW9ucyBhbmQKLSAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUuR2V0T3B0aW9ucygpLm1hcF9lbnRyeSkKLQotCi1kZWYgX0lzTWVzc2FnZU1hcEZpZWxkKGZpZWxkKToKLSAgdmFsdWVfdHlwZSA9IGZpZWxkLm1lc3NhZ2VfdHlwZS5maWVsZHNfYnlfbmFtZVsidmFsdWUiXQotICByZXR1cm4gdmFsdWVfdHlwZS5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRQotCi0KLWRlZiBfQXR0YWNoRmllbGRIZWxwZXJzKGNscywgZmllbGRfZGVzY3JpcHRvcik6Ci0gIGlzX3JlcGVhdGVkID0gKGZpZWxkX2Rlc2NyaXB0b3IubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRCkKLSAgaXNfcGFja2FibGUgPSAoaXNfcmVwZWF0ZWQgYW5kCi0gICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LklzVHlwZVBhY2thYmxlKGZpZWxkX2Rlc2NyaXB0b3IudHlwZSkpCi0gIGlmIG5vdCBpc19wYWNrYWJsZToKLSAgICBpc19wYWNrZWQgPSBGYWxzZQotICBlbGlmIGZpZWxkX2Rlc2NyaXB0b3IuY29udGFpbmluZ190eXBlLnN5bnRheCA9PSAicHJvdG8yIjoKLSAgICBpc19wYWNrZWQgPSAoZmllbGRfZGVzY3JpcHRvci5oYXNfb3B0aW9ucyBhbmQKLSAgICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5wYWNrZWQpCi0gIGVsc2U6Ci0gICAgaGFzX3BhY2tlZF9mYWxzZSA9IChmaWVsZF9kZXNjcmlwdG9yLmhhc19vcHRpb25zIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkuSGFzRmllbGQoInBhY2tlZCIpIGFuZAotICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkucGFja2VkID09IEZhbHNlKQotICAgIGlzX3BhY2tlZCA9IG5vdCBoYXNfcGFja2VkX2ZhbHNlCi0gIGlzX21hcF9lbnRyeSA9IF9Jc01hcEZpZWxkKGZpZWxkX2Rlc2NyaXB0b3IpCi0KLSAgaWYgaXNfbWFwX2VudHJ5OgotICAgIGZpZWxkX2VuY29kZXIgPSBlbmNvZGVyLk1hcEVuY29kZXIoZmllbGRfZGVzY3JpcHRvcikKLSAgICBzaXplciA9IGVuY29kZXIuTWFwU2l6ZXIoZmllbGRfZGVzY3JpcHRvcikKLSAgZWxpZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkX2Rlc2NyaXB0b3IpOgotICAgIGZpZWxkX2VuY29kZXIgPSBlbmNvZGVyLk1lc3NhZ2VTZXRJdGVtRW5jb2RlcihmaWVsZF9kZXNjcmlwdG9yLm51bWJlcikKLSAgICBzaXplciA9IGVuY29kZXIuTWVzc2FnZVNldEl0ZW1TaXplcihmaWVsZF9kZXNjcmlwdG9yLm51bWJlcikKLSAgZWxzZToKLSAgICBmaWVsZF9lbmNvZGVyID0gdHlwZV9jaGVja2Vycy5UWVBFX1RPX0VOQ09ERVJbZmllbGRfZGVzY3JpcHRvci50eXBlXSgKLSAgICAgICAgZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpCi0gICAgc2l6ZXIgPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fU0laRVJbZmllbGRfZGVzY3JpcHRvci50eXBlXSgKLSAgICAgICAgZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpCi0KLSAgZmllbGRfZGVzY3JpcHRvci5fZW5jb2RlciA9IGZpZWxkX2VuY29kZXIKLSAgZmllbGRfZGVzY3JpcHRvci5fc2l6ZXIgPSBzaXplcgotICBmaWVsZF9kZXNjcmlwdG9yLl9kZWZhdWx0X2NvbnN0cnVjdG9yID0gX0RlZmF1bHRWYWx1ZUNvbnN0cnVjdG9yRm9yRmllbGQoCi0gICAgICBmaWVsZF9kZXNjcmlwdG9yKQotCi0gIGRlZiBBZGREZWNvZGVyKHdpcmV0eXBlLCBpc19wYWNrZWQpOgotICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIHdpcmV0eXBlKQotICAgIGRlY29kZV90eXBlID0gZmllbGRfZGVzY3JpcHRvci50eXBlCi0gICAgaWYgKGRlY29kZV90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNIGFuZAotICAgICAgICB0eXBlX2NoZWNrZXJzLlN1cHBvcnRzT3BlbkVudW1zKGZpZWxkX2Rlc2NyaXB0b3IpKToKLSAgICAgIGRlY29kZV90eXBlID0gX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyCi0KLSAgICBvbmVvZl9kZXNjcmlwdG9yID0gTm9uZQotICAgIGlmIGZpZWxkX2Rlc2NyaXB0b3IuY29udGFpbmluZ19vbmVvZiBpcyBub3QgTm9uZToKLSAgICAgIG9uZW9mX2Rlc2NyaXB0b3IgPSBmaWVsZF9kZXNjcmlwdG9yCi0KLSAgICBpZiBpc19tYXBfZW50cnk6Ci0gICAgICBpc19tZXNzYWdlX21hcCA9IF9Jc01lc3NhZ2VNYXBGaWVsZChmaWVsZF9kZXNjcmlwdG9yKQotCi0gICAgICBmaWVsZF9kZWNvZGVyID0gZGVjb2Rlci5NYXBEZWNvZGVyKAotICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IsIF9HZXRJbml0aWFsaXplRGVmYXVsdEZvck1hcChmaWVsZF9kZXNjcmlwdG9yKSwKLSAgICAgICAgICBpc19tZXNzYWdlX21hcCkKLSAgICBlbHNlOgotICAgICAgZmllbGRfZGVjb2RlciA9IHR5cGVfY2hlY2tlcnMuVFlQRV9UT19ERUNPREVSW2RlY29kZV90eXBlXSgKLSAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsCi0gICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IpCi0KLSAgICBjbHMuX2RlY29kZXJzX2J5X3RhZ1t0YWdfYnl0ZXNdID0gKGZpZWxkX2RlY29kZXIsIG9uZW9mX2Rlc2NyaXB0b3IpCi0KLSAgQWRkRGVjb2Rlcih0eXBlX2NoZWNrZXJzLkZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFW2ZpZWxkX2Rlc2NyaXB0b3IudHlwZV0sCi0gICAgICAgICAgICAgRmFsc2UpCi0KLSAgaWYgaXNfcmVwZWF0ZWQgYW5kIHdpcmVfZm9ybWF0LklzVHlwZVBhY2thYmxlKGZpZWxkX2Rlc2NyaXB0b3IudHlwZSk6Ci0gICAgIyBUbyBzdXBwb3J0IHdpcmUgY29tcGF0aWJpbGl0eSBvZiBhZGRpbmcgcGFja2VkID0gdHJ1ZSwgYWRkIGEgZGVjb2RlciBmb3IKLSAgICAjIHBhY2tlZCB2YWx1ZXMgcmVnYXJkbGVzcyBvZiB0aGUgZmllbGQncyBvcHRpb25zLgotICAgIEFkZERlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgVHJ1ZSkKLQotCi1kZWYgX0FkZENsYXNzQXR0cmlidXRlc0Zvck5lc3RlZEV4dGVuc2lvbnMoZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6Ci0gIGV4dGVuc2lvbl9kaWN0ID0gZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKLSAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlbXMoKToKLSAgICBhc3NlcnQgZXh0ZW5zaW9uX25hbWUgbm90IGluIGRpY3Rpb25hcnkKLSAgICBkaWN0aW9uYXJ5W2V4dGVuc2lvbl9uYW1lXSA9IGV4dGVuc2lvbl9maWVsZAotCi0KLWRlZiBfQWRkRW51bVZhbHVlcyhkZXNjcmlwdG9yLCBjbHMpOgotICAiIiJTZXRzIGNsYXNzLWxldmVsIGF0dHJpYnV0ZXMgZm9yIGFsbCBlbnVtIGZpZWxkcyBkZWZpbmVkIGluIHRoaXMgbWVzc2FnZS4KLQotICBBbHNvIGV4cG9ydGluZyBhIGNsYXNzLWxldmVsIG9iamVjdCB0aGF0IGNhbiBuYW1lIGVudW0gdmFsdWVzLgotCi0gIEFyZ3M6Ci0gICAgZGVzY3JpcHRvcjogRGVzY3JpcHRvciBvYmplY3QgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgotICAgIGNsczogQ2xhc3Mgd2UncmUgY29uc3RydWN0aW5nIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KLSAgIiIiCi0gIGZvciBlbnVtX3R5cGUgaW4gZGVzY3JpcHRvci5lbnVtX3R5cGVzOgotICAgIHNldGF0dHIoY2xzLCBlbnVtX3R5cGUubmFtZSwgZW51bV90eXBlX3dyYXBwZXIuRW51bVR5cGVXcmFwcGVyKGVudW1fdHlwZSkpCi0gICAgZm9yIGVudW1fdmFsdWUgaW4gZW51bV90eXBlLnZhbHVlczoKLSAgICAgIHNldGF0dHIoY2xzLCBlbnVtX3ZhbHVlLm5hbWUsIGVudW1fdmFsdWUubnVtYmVyKQotCi0KLWRlZiBfR2V0SW5pdGlhbGl6ZURlZmF1bHRGb3JNYXAoZmllbGQpOgotICBpZiBmaWVsZC5sYWJlbCAhPSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgIHJhaXNlIFZhbHVlRXJyb3IoJ21hcF9lbnRyeSBzZXQgb24gbm9uLXJlcGVhdGVkIGZpZWxkICVzJyAlICgKLSAgICAgICAgZmllbGQubmFtZSkpCi0gIGZpZWxkc19ieV9uYW1lID0gZmllbGQubWVzc2FnZV90eXBlLmZpZWxkc19ieV9uYW1lCi0gIGtleV9jaGVja2VyID0gdHlwZV9jaGVja2Vycy5HZXRUeXBlQ2hlY2tlcihmaWVsZHNfYnlfbmFtZVsna2V5J10pCi0KLSAgdmFsdWVfZmllbGQgPSBmaWVsZHNfYnlfbmFtZVsndmFsdWUnXQotICBpZiBfSXNNZXNzYWdlTWFwRmllbGQoZmllbGQpOgotICAgIGRlZiBNYWtlTWVzc2FnZU1hcERlZmF1bHQobWVzc2FnZSk6Ci0gICAgICByZXR1cm4gY29udGFpbmVycy5NZXNzYWdlTWFwKAotICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgdmFsdWVfZmllbGQubWVzc2FnZV90eXBlLCBrZXlfY2hlY2tlcikKLSAgICByZXR1cm4gTWFrZU1lc3NhZ2VNYXBEZWZhdWx0Ci0gIGVsc2U6Ci0gICAgdmFsdWVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIodmFsdWVfZmllbGQpCi0gICAgZGVmIE1ha2VQcmltaXRpdmVNYXBEZWZhdWx0KG1lc3NhZ2UpOgotICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuU2NhbGFyTWFwKAotICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwga2V5X2NoZWNrZXIsIHZhbHVlX2NoZWNrZXIpCi0gICAgcmV0dXJuIE1ha2VQcmltaXRpdmVNYXBEZWZhdWx0Ci0KLWRlZiBfRGVmYXVsdFZhbHVlQ29uc3RydWN0b3JGb3JGaWVsZChmaWVsZCk6Ci0gICIiIlJldHVybnMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmaWVsZC4KLQotICBBcmdzOgotICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0b3Igb2JqZWN0IGZvciB0aGlzIGZpZWxkLgotCi0gIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBoYXMgb25lIGFyZ3VtZW50OgotICAgIG1lc3NhZ2U6IE1lc3NhZ2UgaW5zdGFuY2UgY29udGFpbmluZyB0aGlzIGZpZWxkLCBvciBhIHdlYWtyZWYgcHJveHkKLSAgICAgIG9mIHNhbWUuCi0KLSAgVGhhdCBmdW5jdGlvbiBpbiB0dXJuIHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkLiAgVGhlIGRlZmF1bHQKLSAgICB2YWx1ZSBtYXkgcmVmZXIgYmFjayB0byB8bWVzc2FnZXwgdmlhIGEgd2VhayByZWZlcmVuY2UuCi0gICIiIgotCi0gIGlmIF9Jc01hcEZpZWxkKGZpZWxkKToKLSAgICByZXR1cm4gX0dldEluaXRpYWxpemVEZWZhdWx0Rm9yTWFwKGZpZWxkKQotCi0gIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgaWYgZmllbGQuaGFzX2RlZmF1bHRfdmFsdWUgYW5kIGZpZWxkLmRlZmF1bHRfdmFsdWUgIT0gW106Ci0gICAgICByYWlzZSBWYWx1ZUVycm9yKCdSZXBlYXRlZCBmaWVsZCBkZWZhdWx0IHZhbHVlIG5vdCBlbXB0eSBsaXN0OiAlcycgJSAoCi0gICAgICAgICAgZmllbGQuZGVmYXVsdF92YWx1ZSkpCi0gICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAjIFdlIGNhbid0IGxvb2sgYXQgX2NvbmNyZXRlX2NsYXNzIHlldCBzaW5jZSBpdCBtaWdodCBub3QgaGF2ZQotICAgICAgIyBiZWVuIHNldC4gIChEZXBlbmRzIG9uIG9yZGVyIGluIHdoaWNoIHdlIGluaXRpYWxpemUgdGhlIGNsYXNzZXMpLgotICAgICAgbWVzc2FnZV90eXBlID0gZmllbGQubWVzc2FnZV90eXBlCi0gICAgICBkZWYgTWFrZVJlcGVhdGVkTWVzc2FnZURlZmF1bHQobWVzc2FnZSk6Ci0gICAgICAgIHJldHVybiBjb250YWluZXJzLlJlcGVhdGVkQ29tcG9zaXRlRmllbGRDb250YWluZXIoCi0gICAgICAgICAgICBtZXNzYWdlLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4sIGZpZWxkLm1lc3NhZ2VfdHlwZSkKLSAgICAgIHJldHVybiBNYWtlUmVwZWF0ZWRNZXNzYWdlRGVmYXVsdAotICAgIGVsc2U6Ci0gICAgICB0eXBlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXJzLkdldFR5cGVDaGVja2VyKGZpZWxkKQotICAgICAgZGVmIE1ha2VSZXBlYXRlZFNjYWxhckRlZmF1bHQobWVzc2FnZSk6Ci0gICAgICAgIHJldHVybiBjb250YWluZXJzLlJlcGVhdGVkU2NhbGFyRmllbGRDb250YWluZXIoCi0gICAgICAgICAgICBtZXNzYWdlLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4sIHR5cGVfY2hlY2tlcikKLSAgICAgIHJldHVybiBNYWtlUmVwZWF0ZWRTY2FsYXJEZWZhdWx0Ci0KLSAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgIyBfY29uY3JldGVfY2xhc3MgbWF5IG5vdCB5ZXQgYmUgaW5pdGlhbGl6ZWQuCi0gICAgbWVzc2FnZV90eXBlID0gZmllbGQubWVzc2FnZV90eXBlCi0gICAgZGVmIE1ha2VTdWJNZXNzYWdlRGVmYXVsdChtZXNzYWdlKToKLSAgICAgIHJlc3VsdCA9IG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKQotICAgICAgcmVzdWx0Ll9TZXRMaXN0ZW5lcigKLSAgICAgICAgICBfT25lb2ZMaXN0ZW5lcihtZXNzYWdlLCBmaWVsZCkKLSAgICAgICAgICBpZiBmaWVsZC5jb250YWluaW5nX29uZW9mIGlzIG5vdCBOb25lCi0gICAgICAgICAgZWxzZSBtZXNzYWdlLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4pCi0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgcmV0dXJuIE1ha2VTdWJNZXNzYWdlRGVmYXVsdAotCi0gIGRlZiBNYWtlU2NhbGFyRGVmYXVsdChtZXNzYWdlKToKLSAgICAjIFRPRE8ocHJvdG9idWYtdGVhbSk6IFRoaXMgbWF5IGJlIGJyb2tlbiBzaW5jZSB0aGVyZSBtYXkgbm90IGJlCi0gICAgIyBkZWZhdWx0X3ZhbHVlLiAgQ29tYmluZSB3aXRoIGhhc19kZWZhdWx0X3ZhbHVlIHNvbWVob3cuCi0gICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRfdmFsdWUKLSAgcmV0dXJuIE1ha2VTY2FsYXJEZWZhdWx0Ci0KLQotZGVmIF9SZXJhaXNlVHlwZUVycm9yV2l0aEZpZWxkTmFtZShtZXNzYWdlX25hbWUsIGZpZWxkX25hbWUpOgotICAiIiJSZS1yYWlzZSB0aGUgY3VycmVudGx5LWhhbmRsZWQgVHlwZUVycm9yIHdpdGggdGhlIGZpZWxkIG5hbWUgYWRkZWQuIiIiCi0gIGV4YyA9IHN5cy5leGNfaW5mbygpWzFdCi0gIGlmIGxlbihleGMuYXJncykgPT0gMSBhbmQgdHlwZShleGMpIGlzIFR5cGVFcnJvcjoKLSAgICAjIHNpbXBsZSBUeXBlRXJyb3I7IGFkZCBmaWVsZCBuYW1lIHRvIGV4Y2VwdGlvbiBtZXNzYWdlCi0gICAgZXhjID0gVHlwZUVycm9yKCclcyBmb3IgZmllbGQgJXMuJXMnICUgKHN0cihleGMpLCBtZXNzYWdlX25hbWUsIGZpZWxkX25hbWUpKQotCi0gICMgcmUtcmFpc2UgcG9zc2libHktYW1lbmRlZCBleGNlcHRpb24gd2l0aCBvcmlnaW5hbCB0cmFjZWJhY2s6Ci0gIHNpeC5yZXJhaXNlKHR5cGUoZXhjKSwgZXhjLCBzeXMuZXhjX2luZm8oKVsyXSkKLQotCi1kZWYgX0FkZEluaXRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJBZGRzIGFuIF9faW5pdF9fIG1ldGhvZCB0byBjbHMuIiIiCi0KLSAgZGVmIF9HZXRJbnRlZ2VyRW51bVZhbHVlKGVudW1fdHlwZSwgdmFsdWUpOgotICAgICIiIkNvbnZlcnQgYSBzdHJpbmcgb3IgaW50ZWdlciBlbnVtIHZhbHVlIHRvIGFuIGludGVnZXIuCi0KLSAgICBJZiB0aGUgdmFsdWUgaXMgYSBzdHJpbmcsIGl0IGlzIGNvbnZlcnRlZCB0byB0aGUgZW51bSB2YWx1ZSBpbgotICAgIGVudW1fdHlwZSB3aXRoIHRoZSBzYW1lIG5hbWUuICBJZiB0aGUgdmFsdWUgaXMgbm90IGEgc3RyaW5nLCBpdCdzCi0gICAgcmV0dXJuZWQgYXMtaXMuICAoTm8gY29udmVyc2lvbiBvciBib3VuZHMtY2hlY2tpbmcgaXMgZG9uZS4pCi0gICAgIiIiCi0gICAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnN0cmluZ190eXBlcyk6Ci0gICAgICB0cnk6Ci0gICAgICAgIHJldHVybiBlbnVtX3R5cGUudmFsdWVzX2J5X25hbWVbdmFsdWVdLm51bWJlcgotICAgICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdFbnVtIHR5cGUgJXM6IHVua25vd24gbGFiZWwgIiVzIicgJSAoCi0gICAgICAgICAgICBlbnVtX3R5cGUuZnVsbF9uYW1lLCB2YWx1ZSkpCi0gICAgcmV0dXJuIHZhbHVlCi0KLSAgZGVmIGluaXQoc2VsZiwgKiprd2FyZ3MpOgotICAgIHNlbGYuX2NhY2hlZF9ieXRlX3NpemUgPSAwCi0gICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSA9IGxlbihrd2FyZ3MpID4gMAotICAgIHNlbGYuX2ZpZWxkcyA9IHt9Ci0gICAgIyBDb250YWlucyBhIG1hcHBpbmcgZnJvbSBvbmVvZiBmaWVsZCBkZXNjcmlwdG9ycyB0byB0aGUgZGVzY3JpcHRvcgotICAgICMgb2YgdGhlIGN1cnJlbnRseSBzZXQgZmllbGQgaW4gdGhhdCBvbmVvZiBmaWVsZC4KLSAgICBzZWxmLl9vbmVvZnMgPSB7fQotCi0gICAgIyBfdW5rbm93bl9maWVsZHMgaXMgKCkgd2hlbiBlbXB0eSBmb3IgZWZmaWNpZW5jeSwgYW5kIHdpbGwgYmUgdHVybmVkIGludG8KLSAgICAjIGEgbGlzdCBpZiBmaWVsZHMgYXJlIGFkZGVkLgotICAgIHNlbGYuX3Vua25vd25fZmllbGRzID0gKCkKLSAgICBzZWxmLl9pc19wcmVzZW50X2luX3BhcmVudCA9IEZhbHNlCi0gICAgc2VsZi5fbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyX21vZC5OdWxsTWVzc2FnZUxpc3RlbmVyKCkKLSAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4gPSBfTGlzdGVuZXIoc2VsZikKLSAgICBmb3IgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUgaW4ga3dhcmdzLml0ZW1zKCk6Ci0gICAgICBmaWVsZCA9IF9HZXRGaWVsZEJ5TmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IsIGZpZWxkX25hbWUpCi0gICAgICBpZiBmaWVsZCBpcyBOb25lOgotICAgICAgICByYWlzZSBUeXBlRXJyb3IoIiVzKCkgZ290IGFuIHVuZXhwZWN0ZWQga2V5d29yZCBhcmd1bWVudCAnJXMnIiAlCi0gICAgICAgICAgICAgICAgICAgICAgICAobWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUsIGZpZWxkX25hbWUpKQotICAgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKLSAgICAgICAgIyBmaWVsZD1Ob25lIGlzIHRoZSBzYW1lIGFzIG5vIGZpZWxkIGF0IGFsbC4KLSAgICAgICAgY29udGludWUKLSAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgICAgIGNvcHkgPSBmaWVsZC5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmKQotICAgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRTogICMgQ29tcG9zaXRlCi0gICAgICAgICAgaWYgX0lzTWFwRmllbGQoZmllbGQpOgotICAgICAgICAgICAgaWYgX0lzTWVzc2FnZU1hcEZpZWxkKGZpZWxkKToKLSAgICAgICAgICAgICAgZm9yIGtleSBpbiBmaWVsZF92YWx1ZToKLSAgICAgICAgICAgICAgICBjb3B5W2tleV0uTWVyZ2VGcm9tKGZpZWxkX3ZhbHVlW2tleV0pCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICBjb3B5LnVwZGF0ZShmaWVsZF92YWx1ZSkKLSAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgZm9yIHZhbCBpbiBmaWVsZF92YWx1ZToKLSAgICAgICAgICAgICAgaWYgaXNpbnN0YW5jZSh2YWwsIGRpY3QpOgotICAgICAgICAgICAgICAgIGNvcHkuYWRkKCoqdmFsKQotICAgICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICAgIGNvcHkuYWRkKCkuTWVyZ2VGcm9tKHZhbCkKLSAgICAgICAgZWxzZTogICMgU2NhbGFyCi0gICAgICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0VOVU06Ci0gICAgICAgICAgICBmaWVsZF92YWx1ZSA9IFtfR2V0SW50ZWdlckVudW1WYWx1ZShmaWVsZC5lbnVtX3R5cGUsIHZhbCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciB2YWwgaW4gZmllbGRfdmFsdWVdCi0gICAgICAgICAgY29weS5leHRlbmQoZmllbGRfdmFsdWUpCi0gICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5Ci0gICAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBjb3B5ID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKLSAgICAgICAgbmV3X3ZhbCA9IGZpZWxkX3ZhbHVlCi0gICAgICAgIGlmIGlzaW5zdGFuY2UoZmllbGRfdmFsdWUsIGRpY3QpOgotICAgICAgICAgIG5ld192YWwgPSBmaWVsZC5tZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKCoqZmllbGRfdmFsdWUpCi0gICAgICAgIHRyeToKLSAgICAgICAgICBjb3B5Lk1lcmdlRnJvbShuZXdfdmFsKQotICAgICAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgICAgIF9SZXJhaXNlVHlwZUVycm9yV2l0aEZpZWxkTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSwgZmllbGRfbmFtZSkKLSAgICAgICAgc2VsZi5fZmllbGRzW2ZpZWxkXSA9IGNvcHkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgotICAgICAgICAgIGZpZWxkX3ZhbHVlID0gX0dldEludGVnZXJFbnVtVmFsdWUoZmllbGQuZW51bV90eXBlLCBmaWVsZF92YWx1ZSkKLSAgICAgICAgdHJ5OgotICAgICAgICAgIHNldGF0dHIoc2VsZiwgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUpCi0gICAgICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAgICAgX1JlcmFpc2VUeXBlRXJyb3JXaXRoRmllbGROYW1lKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCBmaWVsZF9uYW1lKQotCi0gIGluaXQuX19tb2R1bGVfXyA9IE5vbmUKLSAgaW5pdC5fX2RvY19fID0gTm9uZQotICBjbHMuX19pbml0X18gPSBpbml0Ci0KLQotZGVmIF9HZXRGaWVsZEJ5TmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IsIGZpZWxkX25hbWUpOgotICAiIiJSZXR1cm5zIGEgZmllbGQgZGVzY3JpcHRvciBieSBmaWVsZCBuYW1lLgotCi0gIEFyZ3M6Ci0gICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBBIERlc2NyaXB0b3IgZGVzY3JpYmluZyBhbGwgZmllbGRzIGluIG1lc3NhZ2UuCi0gICAgZmllbGRfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHJldHJpZXZlLgotICBSZXR1cm5zOgotICAgIFRoZSBmaWVsZCBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGQgbmFtZS4KLSAgIiIiCi0gIHRyeToKLSAgICByZXR1cm4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCi0gIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdQcm90b2NvbCBtZXNzYWdlICVzIGhhcyBubyAiJXMiIGZpZWxkLicgJQotICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCBmaWVsZF9uYW1lKSkKLQotCi1kZWYgX0FkZFByb3BlcnRpZXNGb3JGaWVsZHMoZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiQWRkcyBwcm9wZXJ0aWVzIGZvciBhbGwgZmllbGRzIGluIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLiIiIgotICBmb3IgZmllbGQgaW4gZGVzY3JpcHRvci5maWVsZHM6Ci0gICAgX0FkZFByb3BlcnRpZXNGb3JGaWVsZChmaWVsZCwgY2xzKQotCi0gIGlmIGRlc2NyaXB0b3IuaXNfZXh0ZW5kYWJsZToKLSAgICAjIF9FeHRlbnNpb25EaWN0IGlzIGp1c3QgYW4gYWRhcHRvciB3aXRoIG5vIHN0YXRlIHNvIHdlIGFsbG9jYXRlIGEgbmV3IG9uZQotICAgICMgZXZlcnkgdGltZSBpdCBpcyBhY2Nlc3NlZC4KLSAgICBjbHMuRXh0ZW5zaW9ucyA9IHByb3BlcnR5KGxhbWJkYSBzZWxmOiBfRXh0ZW5zaW9uRGljdChzZWxmKSkKLQotCi1kZWYgX0FkZFByb3BlcnRpZXNGb3JGaWVsZChmaWVsZCwgY2xzKToKLSAgIiIiQWRkcyBhIHB1YmxpYyBwcm9wZXJ0eSBmb3IgYSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgotICBDbGllbnRzIGNhbiB1c2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQgYW5kIChpbiB0aGUgY2FzZQotICBvZiBub24tcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcykgZGlyZWN0bHkgc2V0IHRoZSB2YWx1ZQotICBvZiBhIHByb3RvY29sIG1lc3NhZ2UgZmllbGQuCi0KLSAgQXJnczoKLSAgICBmaWVsZDogQSBGaWVsZERlc2NyaXB0b3IgZm9yIHRoaXMgZmllbGQuCi0gICAgY2xzOiBUaGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgotICAiIiIKLSAgIyBDYXRjaCBpdCBpZiB3ZSBhZGQgb3RoZXIgdHlwZXMgdGhhdCB3ZSBzaG91bGQKLSAgIyBoYW5kbGUgc3BlY2lhbGx5IGhlcmUuCi0gIGFzc2VydCBfRmllbGREZXNjcmlwdG9yLk1BWF9DUFBUWVBFID09IDEwCi0KLSAgY29uc3RhbnRfbmFtZSA9IGZpZWxkLm5hbWUudXBwZXIoKSArICJfRklFTERfTlVNQkVSIgotICBzZXRhdHRyKGNscywgY29uc3RhbnRfbmFtZSwgZmllbGQubnVtYmVyKQotCi0gIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgX0FkZFByb3BlcnRpZXNGb3JSZXBlYXRlZEZpZWxkKGZpZWxkLCBjbHMpCi0gIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgX0FkZFByb3BlcnRpZXNGb3JOb25SZXBlYXRlZENvbXBvc2l0ZUZpZWxkKGZpZWxkLCBjbHMpCi0gIGVsc2U6Ci0gICAgX0FkZFByb3BlcnRpZXNGb3JOb25SZXBlYXRlZFNjYWxhckZpZWxkKGZpZWxkLCBjbHMpCi0KLQotZGVmIF9BZGRQcm9wZXJ0aWVzRm9yUmVwZWF0ZWRGaWVsZChmaWVsZCwgY2xzKToKLSAgIiIiQWRkcyBhIHB1YmxpYyBwcm9wZXJ0eSBmb3IgYSAicmVwZWF0ZWQiIHByb3RvY29sIG1lc3NhZ2UgZmllbGQuICBDbGllbnRzCi0gIGNhbiB1c2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCwgd2hpY2ggd2lsbCBiZSBlaXRoZXIgYQotICBfUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lciBvciBfUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lciAoc2VlCi0gIGJlbG93KS4KLQotICBOb3RlIHRoYXQgd2hlbiBjbGllbnRzIGFkZCB2YWx1ZXMgdG8gdGhlc2UgY29udGFpbmVycywgd2UgcGVyZm9ybQotICB0eXBlLWNoZWNraW5nIGluIHRoZSBjYXNlIG9mIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMsIGFuZCB3ZSBhbHNvIHNldCBhbnkKLSAgbmVjZXNzYXJ5ICJoYXMiIGJpdHMgYXMgYSBzaWRlLWVmZmVjdC4KLQotICBBcmdzOgotICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KLSAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCi0gICIiIgotICBwcm90b19maWVsZF9uYW1lID0gZmllbGQubmFtZQotICBwcm9wZXJ0eV9uYW1lID0gX1Byb3BlcnR5TmFtZShwcm90b19maWVsZF9uYW1lKQotCi0gIGRlZiBnZXR0ZXIoc2VsZik6Ci0gICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQotICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6Ci0gICAgICAjIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuCi0gICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkLl9kZWZhdWx0X2NvbnN0cnVjdG9yKHNlbGYpCi0KLSAgICAgICMgQXRvbWljYWxseSBjaGVjayBpZiBhbm90aGVyIHRocmVhZCBoYXMgcHJlZW1wdGVkIHVzIGFuZCwgaWYgbm90LCBzd2FwCi0gICAgICAjIGluIHRoZSBuZXcgb2JqZWN0IHdlIGp1c3QgY3JlYXRlZC4gIElmIHNvbWVvbmUgaGFzIHByZWVtcHRlZCB1cywgd2UKLSAgICAgICMgdGFrZSB0aGF0IG9iamVjdCBhbmQgZGlzY2FyZCBvdXJzLgotICAgICAgIyBXQVJOSU5HOiAgV2UgYXJlIHJlbHlpbmcgb24gc2V0ZGVmYXVsdCgpIGJlaW5nIGF0b21pYy4gIFRoaXMgaXMgdHJ1ZQotICAgICAgIyAgIGluIENQeXRob24gYnV0IHdlIGhhdmVuJ3QgaW52ZXN0aWdhdGVkIG90aGVycy4gIFRoaXMgd2FybmluZyBhcHBlYXJzCi0gICAgICAjICAgaW4gc2V2ZXJhbCBvdGhlciBsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLgotICAgICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuc2V0ZGVmYXVsdChmaWVsZCwgZmllbGRfdmFsdWUpCi0gICAgcmV0dXJuIGZpZWxkX3ZhbHVlCi0gIGdldHRlci5fX21vZHVsZV9fID0gTm9uZQotICBnZXR0ZXIuX19kb2NfXyA9ICdHZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCi0KLSAgIyBXZSBkZWZpbmUgYSBzZXR0ZXIganVzdCBzbyB3ZSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggYSBtb3JlCi0gICMgaGVscGZ1bCBlcnJvciBtZXNzYWdlLgotICBkZWYgc2V0dGVyKHNlbGYsIG5ld192YWx1ZSk6Ci0gICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJ0Fzc2lnbm1lbnQgbm90IGFsbG93ZWQgdG8gcmVwZWF0ZWQgZmllbGQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICciJXMiIGluIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LicgJSBwcm90b19maWVsZF9uYW1lKQotCi0gIGRvYyA9ICdNYWdpYyBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGZvciAiJXMiIHByb3RvIGZpZWxkLicgJSBwcm90b19maWVsZF9uYW1lCi0gIHNldGF0dHIoY2xzLCBwcm9wZXJ0eV9uYW1lLCBwcm9wZXJ0eShnZXR0ZXIsIHNldHRlciwgZG9jPWRvYykpCi0KLQotZGVmIF9BZGRQcm9wZXJ0aWVzRm9yTm9uUmVwZWF0ZWRTY2FsYXJGaWVsZChmaWVsZCwgY2xzKToKLSAgIiIiQWRkcyBhIHB1YmxpYyBwcm9wZXJ0eSBmb3IgYSBub25yZXBlYXRlZCwgc2NhbGFyIHByb3RvY29sIG1lc3NhZ2UgZmllbGQuCi0gIENsaWVudHMgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCBhbmQgZGlyZWN0bHkgc2V0IHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuCi0gIE5vdGUgdGhhdCB3aGVuIHRoZSBjbGllbnQgc2V0cyB0aGUgdmFsdWUgb2YgYSBmaWVsZCBieSB1c2luZyB0aGlzIHByb3BlcnR5LAotICBhbGwgbmVjZXNzYXJ5ICJoYXMiIGJpdHMgYXJlIHNldCBhcyBhIHNpZGUtZWZmZWN0LCBhbmQgd2UgYWxzbyBwZXJmb3JtCi0gIHR5cGUtY2hlY2tpbmcuCi0KLSAgQXJnczoKLSAgICBmaWVsZDogQSBGaWVsZERlc2NyaXB0b3IgZm9yIHRoaXMgZmllbGQuCi0gICAgY2xzOiBUaGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgotICAiIiIKLSAgcHJvdG9fZmllbGRfbmFtZSA9IGZpZWxkLm5hbWUKLSAgcHJvcGVydHlfbmFtZSA9IF9Qcm9wZXJ0eU5hbWUocHJvdG9fZmllbGRfbmFtZSkKLSAgdHlwZV9jaGVja2VyID0gdHlwZV9jaGVja2Vycy5HZXRUeXBlQ2hlY2tlcihmaWVsZCkKLSAgZGVmYXVsdF92YWx1ZSA9IGZpZWxkLmRlZmF1bHRfdmFsdWUKLSAgdmFsaWRfdmFsdWVzID0gc2V0KCkKLSAgaXNfcHJvdG8zID0gZmllbGQuY29udGFpbmluZ190eXBlLnN5bnRheCA9PSAicHJvdG8zIgotCi0gIGRlZiBnZXR0ZXIoc2VsZik6Ci0gICAgIyBUT0RPKHByb3RvYnVmLXRlYW0pOiBUaGlzIG1heSBiZSBicm9rZW4gc2luY2UgdGhlcmUgbWF5IG5vdCBiZQotICAgICMgZGVmYXVsdF92YWx1ZS4gIENvbWJpbmUgd2l0aCBoYXNfZGVmYXVsdF92YWx1ZSBzb21laG93LgotICAgIHJldHVybiBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkLCBkZWZhdWx0X3ZhbHVlKQotICBnZXR0ZXIuX19tb2R1bGVfXyA9IE5vbmUKLSAgZ2V0dGVyLl9fZG9jX18gPSAnR2V0dGVyIGZvciAlcy4nICUgcHJvdG9fZmllbGRfbmFtZQotCi0gIGNsZWFyX3doZW5fc2V0X3RvX2RlZmF1bHQgPSBpc19wcm90bzMgYW5kIG5vdCBmaWVsZC5jb250YWluaW5nX29uZW9mCi0KLSAgZGVmIGZpZWxkX3NldHRlcihzZWxmLCBuZXdfdmFsdWUpOgotICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKLSAgICAjIFRlc3RpbmcgdGhlIHZhbHVlIGZvciB0cnV0aGluZXNzIGNhcHR1cmVzIGFsbCBvZiB0aGUgcHJvdG8zIGRlZmF1bHRzCi0gICAgIyAoMCwgMC4wLCBlbnVtIDAsIGFuZCBGYWxzZSkuCi0gICAgbmV3X3ZhbHVlID0gdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUobmV3X3ZhbHVlKQotICAgIGlmIGNsZWFyX3doZW5fc2V0X3RvX2RlZmF1bHQgYW5kIG5vdCBuZXdfdmFsdWU6Ci0gICAgICBzZWxmLl9maWVsZHMucG9wKGZpZWxkLCBOb25lKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9maWVsZHNbZmllbGRdID0gbmV3X3ZhbHVlCi0gICAgIyBDaGVjayBfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSBpbmxpbmUgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSwgc2luY2Ugc2NhbGFyCi0gICAgIyBzZXR0ZXJzIGFyZSBjYWxsZWQgZnJlcXVlbnRseS4KLSAgICBpZiBub3Qgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eToKLSAgICAgIHNlbGYuX01vZGlmaWVkKCkKLQotICBpZiBmaWVsZC5jb250YWluaW5nX29uZW9mOgotICAgIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKLSAgICAgIGZpZWxkX3NldHRlcihzZWxmLCBuZXdfdmFsdWUpCi0gICAgICBzZWxmLl9VcGRhdGVPbmVvZlN0YXRlKGZpZWxkKQotICBlbHNlOgotICAgIHNldHRlciA9IGZpZWxkX3NldHRlcgotCi0gIHNldHRlci5fX21vZHVsZV9fID0gTm9uZQotICBzZXR0ZXIuX19kb2NfXyA9ICdTZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCi0KLSAgIyBBZGQgYSBwcm9wZXJ0eSB0byBlbmNhcHN1bGF0ZSB0aGUgZ2V0dGVyL3NldHRlci4KLSAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKLSAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5KGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKSkKLQotCi1kZWYgX0FkZFByb3BlcnRpZXNGb3JOb25SZXBlYXRlZENvbXBvc2l0ZUZpZWxkKGZpZWxkLCBjbHMpOgotICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIG5vbnJlcGVhdGVkLCBjb21wb3NpdGUgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KLSAgQSBjb21wb3NpdGUgZmllbGQgaXMgYSAiZ3JvdXAiIG9yICJtZXNzYWdlIiBmaWVsZC4KLQotICBDbGllbnRzIGNhbiB1c2UgdGhpcyBwcm9wZXJ0eSB0byBnZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCwgYnV0IGNhbm5vdAotICBhc3NpZ24gdG8gdGhlIHByb3BlcnR5IGRpcmVjdGx5LgotCi0gIEFyZ3M6Ci0gICAgZmllbGQ6IEEgRmllbGREZXNjcmlwdG9yIGZvciB0aGlzIGZpZWxkLgotICAgIGNsczogVGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KLSAgIiIiCi0gICMgVE9ETyhyb2JpbnNvbik6IFJlbW92ZSBkdXBsaWNhdGlvbiB3aXRoIHNpbWlsYXIgbWV0aG9kCi0gICMgZm9yIG5vbi1yZXBlYXRlZCBzY2FsYXJzLgotICBwcm90b19maWVsZF9uYW1lID0gZmllbGQubmFtZQotICBwcm9wZXJ0eV9uYW1lID0gX1Byb3BlcnR5TmFtZShwcm90b19maWVsZF9uYW1lKQotCi0gIGRlZiBnZXR0ZXIoc2VsZik6Ci0gICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQotICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6Ci0gICAgICAjIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuCi0gICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkLl9kZWZhdWx0X2NvbnN0cnVjdG9yKHNlbGYpCi0KLSAgICAgICMgQXRvbWljYWxseSBjaGVjayBpZiBhbm90aGVyIHRocmVhZCBoYXMgcHJlZW1wdGVkIHVzIGFuZCwgaWYgbm90LCBzd2FwCi0gICAgICAjIGluIHRoZSBuZXcgb2JqZWN0IHdlIGp1c3QgY3JlYXRlZC4gIElmIHNvbWVvbmUgaGFzIHByZWVtcHRlZCB1cywgd2UKLSAgICAgICMgdGFrZSB0aGF0IG9iamVjdCBhbmQgZGlzY2FyZCBvdXJzLgotICAgICAgIyBXQVJOSU5HOiAgV2UgYXJlIHJlbHlpbmcgb24gc2V0ZGVmYXVsdCgpIGJlaW5nIGF0b21pYy4gIFRoaXMgaXMgdHJ1ZQotICAgICAgIyAgIGluIENQeXRob24gYnV0IHdlIGhhdmVuJ3QgaW52ZXN0aWdhdGVkIG90aGVycy4gIFRoaXMgd2FybmluZyBhcHBlYXJzCi0gICAgICAjICAgaW4gc2V2ZXJhbCBvdGhlciBsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLgotICAgICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuc2V0ZGVmYXVsdChmaWVsZCwgZmllbGRfdmFsdWUpCi0gICAgcmV0dXJuIGZpZWxkX3ZhbHVlCi0gIGdldHRlci5fX21vZHVsZV9fID0gTm9uZQotICBnZXR0ZXIuX19kb2NfXyA9ICdHZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCi0KLSAgIyBXZSBkZWZpbmUgYSBzZXR0ZXIganVzdCBzbyB3ZSBjYW4gdGhyb3cgYW4gZXhjZXB0aW9uIHdpdGggYSBtb3JlCi0gICMgaGVscGZ1bCBlcnJvciBtZXNzYWdlLgotICBkZWYgc2V0dGVyKHNlbGYsIG5ld192YWx1ZSk6Ci0gICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJ0Fzc2lnbm1lbnQgbm90IGFsbG93ZWQgdG8gY29tcG9zaXRlIGZpZWxkICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAnIiVzIiBpbiBwcm90b2NvbCBtZXNzYWdlIG9iamVjdC4nICUgcHJvdG9fZmllbGRfbmFtZSkKLQotICAjIEFkZCBhIHByb3BlcnR5IHRvIGVuY2Fwc3VsYXRlIHRoZSBnZXR0ZXIuCi0gIGRvYyA9ICdNYWdpYyBhdHRyaWJ1dGUgZ2VuZXJhdGVkIGZvciAiJXMiIHByb3RvIGZpZWxkLicgJSBwcm90b19maWVsZF9uYW1lCi0gIHNldGF0dHIoY2xzLCBwcm9wZXJ0eV9uYW1lLCBwcm9wZXJ0eShnZXR0ZXIsIHNldHRlciwgZG9jPWRvYykpCi0KLQotZGVmIF9BZGRQcm9wZXJ0aWVzRm9yRXh0ZW5zaW9ucyhkZXNjcmlwdG9yLCBjbHMpOgotICAiIiJBZGRzIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMgaW4gdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuIiIiCi0gIGV4dGVuc2lvbl9kaWN0ID0gZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKLSAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlbXMoKToKLSAgICBjb25zdGFudF9uYW1lID0gZXh0ZW5zaW9uX25hbWUudXBwZXIoKSArICJfRklFTERfTlVNQkVSIgotICAgIHNldGF0dHIoY2xzLCBjb25zdGFudF9uYW1lLCBleHRlbnNpb25fZmllbGQubnVtYmVyKQotCi0KLWRlZiBfQWRkU3RhdGljTWV0aG9kcyhjbHMpOgotICAjIFRPRE8ocm9iaW5zb24pOiBUaGlzIHByb2JhYmx5IG5lZWRzIHRvIGJlIHRocmVhZC1zYWZlKD8pCi0gIGRlZiBSZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb25faGFuZGxlKToKLSAgICBleHRlbnNpb25faGFuZGxlLmNvbnRhaW5pbmdfdHlwZSA9IGNscy5ERVNDUklQVE9SCi0gICAgX0F0dGFjaEZpZWxkSGVscGVycyhjbHMsIGV4dGVuc2lvbl9oYW5kbGUpCi0KLSAgICAjIFRyeSB0byBpbnNlcnQgb3VyIGV4dGVuc2lvbiwgZmFpbGluZyBpZiBhbiBleHRlbnNpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIKLSAgICAjIGFscmVhZHkgZXhpc3RzLgotICAgIGFjdHVhbF9oYW5kbGUgPSBjbHMuX2V4dGVuc2lvbnNfYnlfbnVtYmVyLnNldGRlZmF1bHQoCi0gICAgICAgIGV4dGVuc2lvbl9oYW5kbGUubnVtYmVyLCBleHRlbnNpb25faGFuZGxlKQotICAgIGlmIGFjdHVhbF9oYW5kbGUgaXMgbm90IGV4dGVuc2lvbl9oYW5kbGU6Ci0gICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKLSAgICAgICAgICAnRXh0ZW5zaW9ucyAiJXMiIGFuZCAiJXMiIGJvdGggdHJ5IHRvIGV4dGVuZCBtZXNzYWdlIHR5cGUgIiVzIiB3aXRoICcKLSAgICAgICAgICAnZmllbGQgbnVtYmVyICVkLicgJQotICAgICAgICAgIChleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSwgYWN0dWFsX2hhbmRsZS5mdWxsX25hbWUsCi0gICAgICAgICAgIGNscy5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgZXh0ZW5zaW9uX2hhbmRsZS5udW1iZXIpKQotCi0gICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWVdID0gZXh0ZW5zaW9uX2hhbmRsZQotCi0gICAgaGFuZGxlID0gZXh0ZW5zaW9uX2hhbmRsZSAgIyBhdm9pZCBsaW5lIHdyYXBwaW5nCi0gICAgaWYgX0lzTWVzc2FnZVNldEV4dGVuc2lvbihoYW5kbGUpOgotICAgICAgIyBNZXNzYWdlU2V0IGV4dGVuc2lvbi4gIEFsc28gcmVnaXN0ZXIgdW5kZXIgdHlwZSBuYW1lLgotICAgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbCi0gICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUuZnVsbF9uYW1lXSA9IGV4dGVuc2lvbl9oYW5kbGUKLQotICBjbHMuUmVnaXN0ZXJFeHRlbnNpb24gPSBzdGF0aWNtZXRob2QoUmVnaXN0ZXJFeHRlbnNpb24pCi0KLSAgZGVmIEZyb21TdHJpbmcocyk6Ci0gICAgbWVzc2FnZSA9IGNscygpCi0gICAgbWVzc2FnZS5NZXJnZUZyb21TdHJpbmcocykKLSAgICByZXR1cm4gbWVzc2FnZQotICBjbHMuRnJvbVN0cmluZyA9IHN0YXRpY21ldGhvZChGcm9tU3RyaW5nKQotCi0KLWRlZiBfSXNQcmVzZW50KGl0ZW0pOgotICAiIiJHaXZlbiBhIChGaWVsZERlc2NyaXB0b3IsIHZhbHVlKSB0dXBsZSBmcm9tIF9maWVsZHMsIHJldHVybiB0cnVlIGlmIHRoZQotICB2YWx1ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QgcmV0dXJuZWQgYnkgTGlzdEZpZWxkcygpLiIiIgotCi0gIGlmIGl0ZW1bMF0ubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICByZXR1cm4gYm9vbChpdGVtWzFdKQotICBlbGlmIGl0ZW1bMF0uY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgcmV0dXJuIGl0ZW1bMV0uX2lzX3ByZXNlbnRfaW5fcGFyZW50Ci0gIGVsc2U6Ci0gICAgcmV0dXJuIFRydWUKLQotCi1kZWYgX0FkZExpc3RGaWVsZHNNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgotCi0gIGRlZiBMaXN0RmllbGRzKHNlbGYpOgotICAgIGFsbF9maWVsZHMgPSBbaXRlbSBmb3IgaXRlbSBpbiBzZWxmLl9maWVsZHMuaXRlbXMoKSBpZiBfSXNQcmVzZW50KGl0ZW0pXQotICAgIGFsbF9maWVsZHMuc29ydChrZXkgPSBsYW1iZGEgaXRlbTogaXRlbVswXS5udW1iZXIpCi0gICAgcmV0dXJuIGFsbF9maWVsZHMKLQotICBjbHMuTGlzdEZpZWxkcyA9IExpc3RGaWVsZHMKLQotX1Byb3RvM0hhc0Vycm9yID0gJ1Byb3RvY29sIG1lc3NhZ2UgaGFzIG5vIG5vbi1yZXBlYXRlZCBzdWJtZXNzYWdlIGZpZWxkICIlcyInCi1fUHJvdG8ySGFzRXJyb3IgPSAnUHJvdG9jb2wgbWVzc2FnZSBoYXMgbm8gbm9uLXJlcGVhdGVkIGZpZWxkICIlcyInCi0KLWRlZiBfQWRkSGFzRmllbGRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgotCi0gIGlzX3Byb3RvMyA9IChtZXNzYWdlX2Rlc2NyaXB0b3Iuc3ludGF4ID09ICJwcm90bzMiKQotICBlcnJvcl9tc2cgPSBfUHJvdG8zSGFzRXJyb3IgaWYgaXNfcHJvdG8zIGVsc2UgX1Byb3RvMkhhc0Vycm9yCi0KLSAgaGFzc2FibGVfZmllbGRzID0ge30KLSAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6Ci0gICAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgIGNvbnRpbnVlCi0gICAgIyBGb3IgcHJvdG8zLCBvbmx5IHN1Ym1lc3NhZ2VzIGFuZCBmaWVsZHMgaW5zaWRlIGEgb25lb2YgaGF2ZSBwcmVzZW5jZS4KLSAgICBpZiAoaXNfcHJvdG8zIGFuZCBmaWVsZC5jcHBfdHlwZSAhPSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSBhbmQKLSAgICAgICAgbm90IGZpZWxkLmNvbnRhaW5pbmdfb25lb2YpOgotICAgICAgY29udGludWUKLSAgICBoYXNzYWJsZV9maWVsZHNbZmllbGQubmFtZV0gPSBmaWVsZAotCi0gIGlmIG5vdCBpc19wcm90bzM6Ci0gICAgIyBGaWVsZHMgaW5zaWRlIG9uZW9mcyBhcmUgbmV2ZXIgcmVwZWF0ZWQgKGVuZm9yY2VkIGJ5IHRoZSBjb21waWxlcikuCi0gICAgZm9yIG9uZW9mIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5vbmVvZnM6Ci0gICAgICBoYXNzYWJsZV9maWVsZHNbb25lb2YubmFtZV0gPSBvbmVvZgotCi0gIGRlZiBIYXNGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKLSAgICB0cnk6Ci0gICAgICBmaWVsZCA9IGhhc3NhYmxlX2ZpZWxkc1tmaWVsZF9uYW1lXQotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoZXJyb3JfbXNnICUgZmllbGRfbmFtZSkKLQotICAgIGlmIGlzaW5zdGFuY2UoZmllbGQsIGRlc2NyaXB0b3JfbW9kLk9uZW9mRGVzY3JpcHRvcik6Ci0gICAgICB0cnk6Ci0gICAgICAgIHJldHVybiBIYXNGaWVsZChzZWxmLCBzZWxmLl9vbmVvZnNbZmllbGRdLm5hbWUpCi0gICAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICAgIHJldHVybiBGYWxzZQotICAgIGVsc2U6Ci0gICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQotICAgICAgICByZXR1cm4gdmFsdWUgaXMgbm90IE5vbmUgYW5kIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudAotICAgICAgZWxzZToKLSAgICAgICAgcmV0dXJuIGZpZWxkIGluIHNlbGYuX2ZpZWxkcwotCi0gIGNscy5IYXNGaWVsZCA9IEhhc0ZpZWxkCi0KLQotZGVmIF9BZGRDbGVhckZpZWxkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLSAgZGVmIENsZWFyRmllbGQoc2VsZiwgZmllbGRfbmFtZSk6Ci0gICAgdHJ5OgotICAgICAgZmllbGQgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbZmllbGRfbmFtZV0KLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICB0cnk6Ci0gICAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLm9uZW9mc19ieV9uYW1lW2ZpZWxkX25hbWVdCi0gICAgICAgIGlmIGZpZWxkIGluIHNlbGYuX29uZW9mczoKLSAgICAgICAgICBmaWVsZCA9IHNlbGYuX29uZW9mc1tmaWVsZF0KLSAgICAgICAgZWxzZToKLSAgICAgICAgICByZXR1cm4KLSAgICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignUHJvdG9jb2wgbWVzc2FnZSAlcygpIGhhcyBubyAiJXMiIGZpZWxkLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgIChtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSwgZmllbGRfbmFtZSkpCi0KLSAgICBpZiBmaWVsZCBpbiBzZWxmLl9maWVsZHM6Ci0gICAgICAjIFRvIG1hdGNoIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHdlIG5lZWQgdG8gaW52YWxpZGF0ZSBpdGVyYXRvcnMKLSAgICAgICMgZm9yIG1hcCBmaWVsZHMgd2hlbiBDbGVhckZpZWxkKCkgaGFwcGVucy4KLSAgICAgIGlmIGhhc2F0dHIoc2VsZi5fZmllbGRzW2ZpZWxkXSwgJ0ludmFsaWRhdGVJdGVyYXRvcnMnKToKLSAgICAgICAgc2VsZi5fZmllbGRzW2ZpZWxkXS5JbnZhbGlkYXRlSXRlcmF0b3JzKCkKLQotICAgICAgIyBOb3RlOiAgSWYgdGhlIGZpZWxkIGlzIGEgc3ViLW1lc3NhZ2UsIGl0cyBsaXN0ZW5lciB3aWxsIHN0aWxsIHBvaW50Ci0gICAgICAjICAgYXQgdXMuICBUaGF0J3MgZmluZSwgYmVjYXVzZSB0aGUgd29yc3QgdGhhbiBjYW4gaGFwcGVuIGlzIHRoYXQgaXQKLSAgICAgICMgICB3aWxsIGNhbGwgX01vZGlmaWVkKCkgYW5kIGludmFsaWRhdGUgb3VyIGJ5dGUgc2l6ZS4gIEJpZyBkZWFsLgotICAgICAgZGVsIHNlbGYuX2ZpZWxkc1tmaWVsZF0KLQotICAgICAgaWYgc2VsZi5fb25lb2ZzLmdldChmaWVsZC5jb250YWluaW5nX29uZW9mLCBOb25lKSBpcyBmaWVsZDoKLSAgICAgICAgZGVsIHNlbGYuX29uZW9mc1tmaWVsZC5jb250YWluaW5nX29uZW9mXQotCi0gICAgIyBBbHdheXMgY2FsbCBfTW9kaWZpZWQoKSAtLSBldmVuIGlmIG5vdGhpbmcgd2FzIGNoYW5nZWQsIHRoaXMgaXMKLSAgICAjIGEgbXV0YXRpbmcgbWV0aG9kLCBhbmQgdGh1cyBjYWxsaW5nIGl0IHNob3VsZCBjYXVzZSB0aGUgZmllbGQgdG8gYmVjb21lCi0gICAgIyBwcmVzZW50IGluIHRoZSBwYXJlbnQgbWVzc2FnZS4KLSAgICBzZWxmLl9Nb2RpZmllZCgpCi0KLSAgY2xzLkNsZWFyRmllbGQgPSBDbGVhckZpZWxkCi0KLQotZGVmIF9BZGRDbGVhckV4dGVuc2lvbk1ldGhvZChjbHMpOgotICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgotICBkZWYgQ2xlYXJFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSk6Ci0gICAgX1ZlcmlmeUV4dGVuc2lvbkhhbmRsZShzZWxmLCBleHRlbnNpb25faGFuZGxlKQotCi0gICAgIyBTaW1pbGFyIHRvIENsZWFyRmllbGQoKSwgYWJvdmUuCi0gICAgaWYgZXh0ZW5zaW9uX2hhbmRsZSBpbiBzZWxmLl9maWVsZHM6Ci0gICAgICBkZWwgc2VsZi5fZmllbGRzW2V4dGVuc2lvbl9oYW5kbGVdCi0gICAgc2VsZi5fTW9kaWZpZWQoKQotICBjbHMuQ2xlYXJFeHRlbnNpb24gPSBDbGVhckV4dGVuc2lvbgotCi0KLWRlZiBfQWRkSGFzRXh0ZW5zaW9uTWV0aG9kKGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBIYXNFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSk6Ci0gICAgX1ZlcmlmeUV4dGVuc2lvbkhhbmRsZShzZWxmLCBleHRlbnNpb25faGFuZGxlKQotICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgIHJhaXNlIEtleUVycm9yKCciJXMiIGlzIHJlcGVhdGVkLicgJSBleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSkKLQotICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICB2YWx1ZSA9IHNlbGYuX2ZpZWxkcy5nZXQoZXh0ZW5zaW9uX2hhbmRsZSkKLSAgICAgIHJldHVybiB2YWx1ZSBpcyBub3QgTm9uZSBhbmQgdmFsdWUuX2lzX3ByZXNlbnRfaW5fcGFyZW50Ci0gICAgZWxzZToKLSAgICAgIHJldHVybiBleHRlbnNpb25faGFuZGxlIGluIHNlbGYuX2ZpZWxkcwotICBjbHMuSGFzRXh0ZW5zaW9uID0gSGFzRXh0ZW5zaW9uCi0KLWRlZiBfSW50ZXJuYWxVbnBhY2tBbnkobXNnKToKLSAgIiIiVW5wYWNrcyBBbnkgbWVzc2FnZSBhbmQgcmV0dXJucyB0aGUgdW5wYWNrZWQgbWVzc2FnZS4KLQotICBUaGlzIGludGVybmFsIG1ldGhvZCBpcyBkaWZmZXJudCBmcm9tIHB1YmxpYyBBbnkgVW5wYWNrIG1ldGhvZCB3aGljaCB0YWtlcwotICB0aGUgdGFyZ2V0IG1lc3NhZ2UgYXMgYXJndW1lbnQuIF9JbnRlcm5hbFVucGFja0FueSBtZXRob2QgZG9lcyBub3QgaGF2ZQotICB0YXJnZXQgbWVzc2FnZSB0eXBlIGFuZCBuZWVkIHRvIGZpbmQgdGhlIG1lc3NhZ2UgdHlwZSBpbiBkZXNjcmlwdG9yIHBvb2wuCi0KLSAgQXJnczoKLSAgICBtc2c6IEFuIEFueSBtZXNzYWdlIHRvIGJlIHVucGFja2VkLgotCi0gIFJldHVybnM6Ci0gICAgVGhlIHVucGFja2VkIG1lc3NhZ2UuCi0gICIiIgotICB0eXBlX3VybCA9IG1zZy50eXBlX3VybAotICBkYiA9IHN5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KCkKLQotICBpZiBub3QgdHlwZV91cmw6Ci0gICAgcmV0dXJuIE5vbmUKLQotICAjIFRPRE8oaGFiZXJtYW4pOiBGb3Igbm93IHdlIGp1c3Qgc3RyaXAgdGhlIGhvc3RuYW1lLiAgQmV0dGVyIGxvZ2ljIHdpbGwgYmUKLSAgIyByZXF1aXJlZC4KLSAgdHlwZV9uYW1lID0gdHlwZV91cmwuc3BsaXQoIi8iKVstMV0KLSAgZGVzY3JpcHRvciA9IGRiLnBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKHR5cGVfbmFtZSkKLQotICBpZiBkZXNjcmlwdG9yIGlzIE5vbmU6Ci0gICAgcmV0dXJuIE5vbmUKLQotICBtZXNzYWdlX2NsYXNzID0gZGIuR2V0UHJvdG90eXBlKGRlc2NyaXB0b3IpCi0gIG1lc3NhZ2UgPSBtZXNzYWdlX2NsYXNzKCkKLQotICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtc2cudmFsdWUpCi0gIHJldHVybiBtZXNzYWdlCi0KLWRlZiBfQWRkRXF1YWxzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLSAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgaWYgKG5vdCBpc2luc3RhbmNlKG90aGVyLCBtZXNzYWdlX21vZC5NZXNzYWdlKSBvcgotICAgICAgICBvdGhlci5ERVNDUklQVE9SICE9IHNlbGYuREVTQ1JJUFRPUik6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICAgIGlmIHNlbGYgaXMgb3RoZXI6Ci0gICAgICByZXR1cm4gVHJ1ZQotCi0gICAgaWYgc2VsZi5ERVNDUklQVE9SLmZ1bGxfbmFtZSA9PSBfQW55RnVsbFR5cGVOYW1lOgotICAgICAgYW55X2EgPSBfSW50ZXJuYWxVbnBhY2tBbnkoc2VsZikKLSAgICAgIGFueV9iID0gX0ludGVybmFsVW5wYWNrQW55KG90aGVyKQotICAgICAgaWYgYW55X2EgYW5kIGFueV9iOgotICAgICAgICByZXR1cm4gYW55X2EgPT0gYW55X2IKLQotICAgIGlmIG5vdCBzZWxmLkxpc3RGaWVsZHMoKSA9PSBvdGhlci5MaXN0RmllbGRzKCk6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICAgICMgU29ydCB1bmtub3duIGZpZWxkcyBiZWNhdXNlIHRoZWlyIG9yZGVyIHNob3VsZG4ndCBhZmZlY3QgZXF1YWxpdHkgdGVzdC4KLSAgICB1bmtub3duX2ZpZWxkcyA9IGxpc3Qoc2VsZi5fdW5rbm93bl9maWVsZHMpCi0gICAgdW5rbm93bl9maWVsZHMuc29ydCgpCi0gICAgb3RoZXJfdW5rbm93bl9maWVsZHMgPSBsaXN0KG90aGVyLl91bmtub3duX2ZpZWxkcykKLSAgICBvdGhlcl91bmtub3duX2ZpZWxkcy5zb3J0KCkKLQotICAgIHJldHVybiB1bmtub3duX2ZpZWxkcyA9PSBvdGhlcl91bmtub3duX2ZpZWxkcwotCi0gIGNscy5fX2VxX18gPSBfX2VxX18KLQotCi1kZWYgX0FkZFN0ck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZikKLSAgY2xzLl9fc3RyX18gPSBfX3N0cl9fCi0KLQotZGVmIF9BZGRSZXByTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZikKLSAgY2xzLl9fcmVwcl9fID0gX19yZXByX18KLQotCi1kZWYgX0FkZFVuaWNvZGVNZXRob2QodW51c2VkX21lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLQotICBkZWYgX191bmljb2RlX18oc2VsZik6Ci0gICAgcmV0dXJuIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhzZWxmLCBhc191dGY4PVRydWUpLmRlY29kZSgndXRmLTgnKQotICBjbHMuX191bmljb2RlX18gPSBfX3VuaWNvZGVfXwotCi0KLWRlZiBfQnl0ZXNGb3JOb25SZXBlYXRlZEVsZW1lbnQodmFsdWUsIGZpZWxkX251bWJlciwgZmllbGRfdHlwZSk6Ci0gICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gc2VyaWFsaXplIGEgbm9uLXJlcGVhdGVkIGVsZW1lbnQuCi0gIFRoZSByZXR1cm5lZCBieXRlIGNvdW50IGluY2x1ZGVzIHNwYWNlIGZvciB0YWcgaW5mb3JtYXRpb24gYW5kIGFueQotICBvdGhlciBhZGRpdGlvbmFsIHNwYWNlIGFzc29jaWF0ZWQgd2l0aCBzZXJpYWxpemluZyB2YWx1ZS4KLQotICBBcmdzOgotICAgIHZhbHVlOiBWYWx1ZSB3ZSdyZSBzZXJpYWxpemluZy4KLSAgICBmaWVsZF9udW1iZXI6IEZpZWxkIG51bWJlciBvZiB0aGlzIHZhbHVlLiAgKFNpbmNlIHRoZSBmaWVsZCBudW1iZXIKLSAgICAgIGlzIHN0b3JlZCBhcyBwYXJ0IG9mIGEgdmFyaW50LWVuY29kZWQgdGFnLCB0aGlzIGhhcyBhbiBpbXBhY3QKLSAgICAgIG9uIHRoZSB0b3RhbCBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgdGhlIHZhbHVlKS4KLSAgICBmaWVsZF90eXBlOiBUaGUgdHlwZSBvZiB0aGUgZmllbGQuICBPbmUgb2YgdGhlIFRZUEVfKiBjb25zdGFudHMKLSAgICAgIHdpdGhpbiBGaWVsZERlc2NyaXB0b3IuCi0gICIiIgotICB0cnk6Ci0gICAgZm4gPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fQllURV9TSVpFX0ZOW2ZpZWxkX3R5cGVdCi0gICAgcmV0dXJuIGZuKGZpZWxkX251bWJlciwgdmFsdWUpCi0gIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICByYWlzZSBtZXNzYWdlX21vZC5FbmNvZGVFcnJvcignVW5yZWNvZ25pemVkIGZpZWxkIHR5cGU6ICVkJyAlIGZpZWxkX3R5cGUpCi0KLQotZGVmIF9BZGRCeXRlU2l6ZU1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0KLSAgZGVmIEJ5dGVTaXplKHNlbGYpOgotICAgIGlmIG5vdCBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5OgotICAgICAgcmV0dXJuIHNlbGYuX2NhY2hlZF9ieXRlX3NpemUKLQotICAgIHNpemUgPSAwCi0gICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX3ZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgotICAgICAgc2l6ZSArPSBmaWVsZF9kZXNjcmlwdG9yLl9zaXplcihmaWVsZF92YWx1ZSkKLQotICAgIGZvciB0YWdfYnl0ZXMsIHZhbHVlX2J5dGVzIGluIHNlbGYuX3Vua25vd25fZmllbGRzOgotICAgICAgc2l6ZSArPSBsZW4odGFnX2J5dGVzKSArIGxlbih2YWx1ZV9ieXRlcykKLQotICAgIHNlbGYuX2NhY2hlZF9ieXRlX3NpemUgPSBzaXplCi0gICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSA9IEZhbHNlCi0gICAgc2VsZi5fbGlzdGVuZXJfZm9yX2NoaWxkcmVuLmRpcnR5ID0gRmFsc2UKLSAgICByZXR1cm4gc2l6ZQotCi0gIGNscy5CeXRlU2l6ZSA9IEJ5dGVTaXplCi0KLQotZGVmIF9BZGRTZXJpYWxpemVUb1N0cmluZ01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0KLSAgZGVmIFNlcmlhbGl6ZVRvU3RyaW5nKHNlbGYpOgotICAgICMgQ2hlY2sgaWYgdGhlIG1lc3NhZ2UgaGFzIGFsbCBvZiBpdHMgcmVxdWlyZWQgZmllbGRzIHNldC4KLSAgICBlcnJvcnMgPSBbXQotICAgIGlmIG5vdCBzZWxmLklzSW5pdGlhbGl6ZWQoKToKLSAgICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkVuY29kZUVycm9yKAotICAgICAgICAgICdNZXNzYWdlICVzIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAlcycgJSAoCi0gICAgICAgICAgc2VsZi5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgJywnLmpvaW4oc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkpKQotICAgIHJldHVybiBzZWxmLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCi0gIGNscy5TZXJpYWxpemVUb1N0cmluZyA9IFNlcmlhbGl6ZVRvU3RyaW5nCi0KLQotZGVmIF9BZGRTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgotCi0gIGRlZiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc2VsZik6Ci0gICAgb3V0ID0gQnl0ZXNJTygpCi0gICAgc2VsZi5fSW50ZXJuYWxTZXJpYWxpemUob3V0LndyaXRlKQotICAgIHJldHVybiBvdXQuZ2V0dmFsdWUoKQotICBjbHMuU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nID0gU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nCi0KLSAgZGVmIEludGVybmFsU2VyaWFsaXplKHNlbGYsIHdyaXRlX2J5dGVzKToKLSAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgZmllbGRfdmFsdWUgaW4gc2VsZi5MaXN0RmllbGRzKCk6Ci0gICAgICBmaWVsZF9kZXNjcmlwdG9yLl9lbmNvZGVyKHdyaXRlX2J5dGVzLCBmaWVsZF92YWx1ZSkKLSAgICBmb3IgdGFnX2J5dGVzLCB2YWx1ZV9ieXRlcyBpbiBzZWxmLl91bmtub3duX2ZpZWxkczoKLSAgICAgIHdyaXRlX2J5dGVzKHRhZ19ieXRlcykKLSAgICAgIHdyaXRlX2J5dGVzKHZhbHVlX2J5dGVzKQotICBjbHMuX0ludGVybmFsU2VyaWFsaXplID0gSW50ZXJuYWxTZXJpYWxpemUKLQotCi1kZWYgX0FkZE1lcmdlRnJvbVN0cmluZ01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6Ci0gICAgbGVuZ3RoID0gbGVuKHNlcmlhbGl6ZWQpCi0gICAgdHJ5OgotICAgICAgaWYgc2VsZi5fSW50ZXJuYWxQYXJzZShzZXJpYWxpemVkLCAwLCBsZW5ndGgpICE9IGxlbmd0aDoKLSAgICAgICAgIyBUaGUgb25seSByZWFzb24gX0ludGVybmFsUGFyc2Ugd291bGQgcmV0dXJuIGVhcmx5IGlzIGlmIGl0Ci0gICAgICAgICMgZW5jb3VudGVyZWQgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRGVjb2RlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nKQotICAgIGV4Y2VwdCAoSW5kZXhFcnJvciwgVHlwZUVycm9yKToKLSAgICAgICMgTm93IG9yZChidWZbcDpwKzFdKSA9PSBvcmQoJycpIGdldHMgVHlwZUVycm9yLgotICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCi0gICAgZXhjZXB0IHN0cnVjdC5lcnJvciBhcyBlOgotICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRGVjb2RlRXJyb3IoZSkKLSAgICByZXR1cm4gbGVuZ3RoICAgIyBSZXR1cm4gdGhpcyBmb3IgbGVnYWN5IHJlYXNvbnMuCi0gIGNscy5NZXJnZUZyb21TdHJpbmcgPSBNZXJnZUZyb21TdHJpbmcKLQotICBsb2NhbF9SZWFkVGFnID0gZGVjb2Rlci5SZWFkVGFnCi0gIGxvY2FsX1NraXBGaWVsZCA9IGRlY29kZXIuU2tpcEZpZWxkCi0gIGRlY29kZXJzX2J5X3RhZyA9IGNscy5fZGVjb2RlcnNfYnlfdGFnCi0gIGlzX3Byb3RvMyA9IG1lc3NhZ2VfZGVzY3JpcHRvci5zeW50YXggPT0gInByb3RvMyIKLQotICBkZWYgSW50ZXJuYWxQYXJzZShzZWxmLCBidWZmZXIsIHBvcywgZW5kKToKLSAgICBzZWxmLl9Nb2RpZmllZCgpCi0gICAgZmllbGRfZGljdCA9IHNlbGYuX2ZpZWxkcwotICAgIHVua25vd25fZmllbGRfbGlzdCA9IHNlbGYuX3Vua25vd25fZmllbGRzCi0gICAgd2hpbGUgcG9zICE9IGVuZDoKLSAgICAgICh0YWdfYnl0ZXMsIG5ld19wb3MpID0gbG9jYWxfUmVhZFRhZyhidWZmZXIsIHBvcykKLSAgICAgIGZpZWxkX2RlY29kZXIsIGZpZWxkX2Rlc2MgPSBkZWNvZGVyc19ieV90YWcuZ2V0KHRhZ19ieXRlcywgKE5vbmUsIE5vbmUpKQotICAgICAgaWYgZmllbGRfZGVjb2RlciBpcyBOb25lOgotICAgICAgICB2YWx1ZV9zdGFydF9wb3MgPSBuZXdfcG9zCi0gICAgICAgIG5ld19wb3MgPSBsb2NhbF9Ta2lwRmllbGQoYnVmZmVyLCBuZXdfcG9zLCBlbmQsIHRhZ19ieXRlcykKLSAgICAgICAgaWYgbmV3X3BvcyA9PSAtMToKLSAgICAgICAgICByZXR1cm4gcG9zCi0gICAgICAgIGlmIG5vdCBpc19wcm90bzM6Ci0gICAgICAgICAgaWYgbm90IHVua25vd25fZmllbGRfbGlzdDoKLSAgICAgICAgICAgIHVua25vd25fZmllbGRfbGlzdCA9IHNlbGYuX3Vua25vd25fZmllbGRzID0gW10KLSAgICAgICAgICB1bmtub3duX2ZpZWxkX2xpc3QuYXBwZW5kKAotICAgICAgICAgICAgICAodGFnX2J5dGVzLCBidWZmZXJbdmFsdWVfc3RhcnRfcG9zOm5ld19wb3NdKSkKLSAgICAgICAgcG9zID0gbmV3X3BvcwotICAgICAgZWxzZToKLSAgICAgICAgcG9zID0gZmllbGRfZGVjb2RlcihidWZmZXIsIG5ld19wb3MsIGVuZCwgc2VsZiwgZmllbGRfZGljdCkKLSAgICAgICAgaWYgZmllbGRfZGVzYzoKLSAgICAgICAgICBzZWxmLl9VcGRhdGVPbmVvZlN0YXRlKGZpZWxkX2Rlc2MpCi0gICAgcmV0dXJuIHBvcwotICBjbHMuX0ludGVybmFsUGFyc2UgPSBJbnRlcm5hbFBhcnNlCi0KLQotZGVmIF9BZGRJc0luaXRpYWxpemVkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiQWRkcyB0aGUgSXNJbml0aWFsaXplZCBhbmQgRmluZEluaXRpYWxpemF0aW9uRXJyb3IgbWV0aG9kcyB0byB0aGUKLSAgcHJvdG9jb2wgbWVzc2FnZSBjbGFzcy4iIiIKLQotICByZXF1aXJlZF9maWVsZHMgPSBbZmllbGQgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVRVUlSRURdCi0KLSAgZGVmIElzSW5pdGlhbGl6ZWQoc2VsZiwgZXJyb3JzPU5vbmUpOgotICAgICIiIkNoZWNrcyBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIG9mIGEgbWVzc2FnZSBhcmUgc2V0LgotCi0gICAgQXJnczoKLSAgICAgIGVycm9yczogIEEgbGlzdCB3aGljaCwgaWYgcHJvdmlkZWQsIHdpbGwgYmUgcG9wdWxhdGVkIHdpdGggdGhlIGZpZWxkCi0gICAgICAgICAgICAgICBwYXRocyBvZiBhbGwgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVHJ1ZSBpZmYgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGhhcyBhbGwgcmVxdWlyZWQgZmllbGRzIHNldC4KLSAgICAiIiIKLQotICAgICMgUGVyZm9ybWFuY2UgaXMgY3JpdGljYWwgc28gd2UgYXZvaWQgSGFzRmllbGQoKSBhbmQgTGlzdEZpZWxkcygpLgotCi0gICAgZm9yIGZpZWxkIGluIHJlcXVpcmVkX2ZpZWxkczoKLSAgICAgIGlmIChmaWVsZCBub3QgaW4gc2VsZi5fZmllbGRzIG9yCi0gICAgICAgICAgKGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFIGFuZAotICAgICAgICAgICBub3Qgc2VsZi5fZmllbGRzW2ZpZWxkXS5faXNfcHJlc2VudF9pbl9wYXJlbnQpKToKLSAgICAgICAgaWYgZXJyb3JzIGlzIG5vdCBOb25lOgotICAgICAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkKLSAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICBmb3IgZmllbGQsIHZhbHVlIGluIGxpc3Qoc2VsZi5fZmllbGRzLml0ZW1zKCkpOiAgIyBkaWN0IGNhbiBjaGFuZ2Ugc2l6ZSEKLSAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiBmaWVsZC5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgICAgICAgIGlmIChmaWVsZC5tZXNzYWdlX3R5cGUuaGFzX29wdGlvbnMgYW5kCi0gICAgICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZS5HZXRPcHRpb25zKCkubWFwX2VudHJ5KToKLSAgICAgICAgICAgIGNvbnRpbnVlCi0gICAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgICBpZiBub3QgZWxlbWVudC5Jc0luaXRpYWxpemVkKCk6Ci0gICAgICAgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpCi0gICAgICAgICAgICAgIHJldHVybiBGYWxzZQotICAgICAgICBlbGlmIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudCBhbmQgbm90IHZhbHVlLklzSW5pdGlhbGl6ZWQoKToKLSAgICAgICAgICBpZiBlcnJvcnMgaXMgbm90IE5vbmU6Ci0gICAgICAgICAgICBlcnJvcnMuZXh0ZW5kKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpCi0gICAgICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgICByZXR1cm4gVHJ1ZQotCi0gIGNscy5Jc0luaXRpYWxpemVkID0gSXNJbml0aWFsaXplZAotCi0gIGRlZiBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc2VsZik6Ci0gICAgIiIiRmluZHMgcmVxdWlyZWQgZmllbGRzIHdoaWNoIGFyZSBub3QgaW5pdGlhbGl6ZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBsaXN0IG9mIHN0cmluZ3MuICBFYWNoIHN0cmluZyBpcyBhIHBhdGggdG8gYW4gdW5pbml0aWFsaXplZCBmaWVsZCBmcm9tCi0gICAgICB0aGUgdG9wLWxldmVsIG1lc3NhZ2UsIGUuZy4gImZvby5iYXJbNV0uYmF6Ii4KLSAgICAiIiIKLQotICAgIGVycm9ycyA9IFtdICAjIHNpbXBsaWZ5IHRoaW5ncwotCi0gICAgZm9yIGZpZWxkIGluIHJlcXVpcmVkX2ZpZWxkczoKLSAgICAgIGlmIG5vdCBzZWxmLkhhc0ZpZWxkKGZpZWxkLm5hbWUpOgotICAgICAgICBlcnJvcnMuYXBwZW5kKGZpZWxkLm5hbWUpCi0KLSAgICBmb3IgZmllbGQsIHZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgotICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKLSAgICAgICAgICBuYW1lID0gIiglcykiICUgZmllbGQuZnVsbF9uYW1lCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgbmFtZSA9IGZpZWxkLm5hbWUKLQotICAgICAgICBpZiBfSXNNYXBGaWVsZChmaWVsZCk6Ci0gICAgICAgICAgaWYgX0lzTWVzc2FnZU1hcEZpZWxkKGZpZWxkKToKLSAgICAgICAgICAgIGZvciBrZXkgaW4gdmFsdWU6Ci0gICAgICAgICAgICAgIGVsZW1lbnQgPSB2YWx1ZVtrZXldCi0gICAgICAgICAgICAgIHByZWZpeCA9ICIlc1slc10uIiAlIChuYW1lLCBrZXkpCi0gICAgICAgICAgICAgIHN1Yl9lcnJvcnMgPSBlbGVtZW50LkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpCi0gICAgICAgICAgICAgIGVycm9ycyArPSBbcHJlZml4ICsgZXJyb3IgZm9yIGVycm9yIGluIHN1Yl9lcnJvcnNdCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgICMgU2NhbGFyTWFwcyBjYW4ndCBoYXZlIGFueSBpbml0aWFsaXphdGlvbiBlcnJvcnMuCi0gICAgICAgICAgICBwYXNzCi0gICAgICAgIGVsaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgICAgICBmb3IgaSBpbiByYW5nZShsZW4odmFsdWUpKToKLSAgICAgICAgICAgIGVsZW1lbnQgPSB2YWx1ZVtpXQotICAgICAgICAgICAgcHJlZml4ID0gIiVzWyVkXS4iICUgKG5hbWUsIGkpCi0gICAgICAgICAgICBzdWJfZXJyb3JzID0gZWxlbWVudC5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKQotICAgICAgICAgICAgZXJyb3JzICs9IFtwcmVmaXggKyBlcnJvciBmb3IgZXJyb3IgaW4gc3ViX2Vycm9yc10KLSAgICAgICAgZWxzZToKLSAgICAgICAgICBwcmVmaXggPSBuYW1lICsgIi4iCi0gICAgICAgICAgc3ViX2Vycm9ycyA9IHZhbHVlLkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpCi0gICAgICAgICAgZXJyb3JzICs9IFtwcmVmaXggKyBlcnJvciBmb3IgZXJyb3IgaW4gc3ViX2Vycm9yc10KLQotICAgIHJldHVybiBlcnJvcnMKLQotICBjbHMuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzID0gRmluZEluaXRpYWxpemF0aW9uRXJyb3JzCi0KLQotZGVmIF9BZGRNZXJnZUZyb21NZXRob2QoY2xzKToKLSAgTEFCRUxfUkVQRUFURUQgPSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVECi0gIENQUFRZUEVfTUVTU0FHRSA9IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFCi0KLSAgZGVmIE1lcmdlRnJvbShzZWxmLCBtc2cpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKG1zZywgY2xzKToKLSAgICAgIHJhaXNlIFR5cGVFcnJvcigKLSAgICAgICAgICAiUGFyYW1ldGVyIHRvIE1lcmdlRnJvbSgpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzczogIgotICAgICAgICAgICJleHBlY3RlZCAlcyBnb3QgJXMuIiAlIChjbHMuX19uYW1lX18sIHR5cGUobXNnKS5fX25hbWVfXykpCi0KLSAgICBhc3NlcnQgbXNnIGlzIG5vdCBzZWxmCi0gICAgc2VsZi5fTW9kaWZpZWQoKQotCi0gICAgZmllbGRzID0gc2VsZi5fZmllbGRzCi0KLSAgICBmb3IgZmllbGQsIHZhbHVlIGluIG1zZy5fZmllbGRzLml0ZW1zKCk6Ci0gICAgICBpZiBmaWVsZC5sYWJlbCA9PSBMQUJFTF9SRVBFQVRFRDoKLSAgICAgICAgZmllbGRfdmFsdWUgPSBmaWVsZHMuZ2V0KGZpZWxkKQotICAgICAgICBpZiBmaWVsZF92YWx1ZSBpcyBOb25lOgotICAgICAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KLSAgICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkLl9kZWZhdWx0X2NvbnN0cnVjdG9yKHNlbGYpCi0gICAgICAgICAgZmllbGRzW2ZpZWxkXSA9IGZpZWxkX3ZhbHVlCi0gICAgICAgIGZpZWxkX3ZhbHVlLk1lcmdlRnJvbSh2YWx1ZSkKLSAgICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiB2YWx1ZS5faXNfcHJlc2VudF9pbl9wYXJlbnQ6Ci0gICAgICAgICAgZmllbGRfdmFsdWUgPSBmaWVsZHMuZ2V0KGZpZWxkKQotICAgICAgICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6Ci0gICAgICAgICAgICAjIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuCi0gICAgICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkLl9kZWZhdWx0X2NvbnN0cnVjdG9yKHNlbGYpCi0gICAgICAgICAgICBmaWVsZHNbZmllbGRdID0gZmllbGRfdmFsdWUKLSAgICAgICAgICBmaWVsZF92YWx1ZS5NZXJnZUZyb20odmFsdWUpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLl9maWVsZHNbZmllbGRdID0gdmFsdWUKLSAgICAgICAgaWYgZmllbGQuY29udGFpbmluZ19vbmVvZjoKLSAgICAgICAgICBzZWxmLl9VcGRhdGVPbmVvZlN0YXRlKGZpZWxkKQotCi0gICAgaWYgbXNnLl91bmtub3duX2ZpZWxkczoKLSAgICAgIGlmIG5vdCBzZWxmLl91bmtub3duX2ZpZWxkczoKLSAgICAgICAgc2VsZi5fdW5rbm93bl9maWVsZHMgPSBbXQotICAgICAgc2VsZi5fdW5rbm93bl9maWVsZHMuZXh0ZW5kKG1zZy5fdW5rbm93bl9maWVsZHMpCi0KLSAgY2xzLk1lcmdlRnJvbSA9IE1lcmdlRnJvbQotCi0KLWRlZiBfQWRkV2hpY2hPbmVvZk1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gIGRlZiBXaGljaE9uZW9mKHNlbGYsIG9uZW9mX25hbWUpOgotICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGN1cnJlbnRseSBzZXQgZmllbGQgaW5zaWRlIGEgb25lb2YsIG9yIE5vbmUuIiIiCi0gICAgdHJ5OgotICAgICAgZmllbGQgPSBtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZzX2J5X25hbWVbb25lb2ZfbmFtZV0KLSAgICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgICByYWlzZSBWYWx1ZUVycm9yKAotICAgICAgICAgICdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyBvbmVvZiAiJXMiIGZpZWxkLicgJSBvbmVvZl9uYW1lKQotCi0gICAgbmVzdGVkX2ZpZWxkID0gc2VsZi5fb25lb2ZzLmdldChmaWVsZCwgTm9uZSkKLSAgICBpZiBuZXN0ZWRfZmllbGQgaXMgbm90IE5vbmUgYW5kIHNlbGYuSGFzRmllbGQobmVzdGVkX2ZpZWxkLm5hbWUpOgotICAgICAgcmV0dXJuIG5lc3RlZF9maWVsZC5uYW1lCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBOb25lCi0KLSAgY2xzLldoaWNoT25lb2YgPSBXaGljaE9uZW9mCi0KLQotZGVmIF9DbGVhcihzZWxmKToKLSAgIyBDbGVhciBmaWVsZHMuCi0gIHNlbGYuX2ZpZWxkcyA9IHt9Ci0gIHNlbGYuX3Vua25vd25fZmllbGRzID0gKCkKLSAgc2VsZi5fb25lb2ZzID0ge30KLSAgc2VsZi5fTW9kaWZpZWQoKQotCi0KLWRlZiBfRGlzY2FyZFVua25vd25GaWVsZHMoc2VsZik6Ci0gIHNlbGYuX3Vua25vd25fZmllbGRzID0gW10KLSAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBzZWxmLkxpc3RGaWVsZHMoKToKLSAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgICAgIGZvciBzdWJfbWVzc2FnZSBpbiB2YWx1ZToKLSAgICAgICAgICBzdWJfbWVzc2FnZS5EaXNjYXJkVW5rbm93bkZpZWxkcygpCi0gICAgICBlbHNlOgotICAgICAgICB2YWx1ZS5EaXNjYXJkVW5rbm93bkZpZWxkcygpCi0KLQotZGVmIF9TZXRMaXN0ZW5lcihzZWxmLCBsaXN0ZW5lcik6Ci0gIGlmIGxpc3RlbmVyIGlzIE5vbmU6Ci0gICAgc2VsZi5fbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyX21vZC5OdWxsTWVzc2FnZUxpc3RlbmVyKCkKLSAgZWxzZToKLSAgICBzZWxmLl9saXN0ZW5lciA9IGxpc3RlbmVyCi0KLQotZGVmIF9BZGRNZXNzYWdlTWV0aG9kcyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkFkZHMgaW1wbGVtZW50YXRpb25zIG9mIGFsbCBNZXNzYWdlIG1ldGhvZHMgdG8gY2xzLiIiIgotICBfQWRkTGlzdEZpZWxkc01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZEhhc0ZpZWxkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkQ2xlYXJGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgaWYgbWVzc2FnZV9kZXNjcmlwdG9yLmlzX2V4dGVuZGFibGU6Ci0gICAgX0FkZENsZWFyRXh0ZW5zaW9uTWV0aG9kKGNscykKLSAgICBfQWRkSGFzRXh0ZW5zaW9uTWV0aG9kKGNscykKLSAgX0FkZEVxdWFsc01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZFN0ck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZFJlcHJNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRVbmljb2RlTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkQnl0ZVNpemVNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRTZXJpYWxpemVUb1N0cmluZ01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZ01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZE1lcmdlRnJvbVN0cmluZ01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZElzSW5pdGlhbGl6ZWRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRNZXJnZUZyb21NZXRob2QoY2xzKQotICBfQWRkV2hpY2hPbmVvZk1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgIyBBZGRzIG1ldGhvZHMgd2hpY2ggZG8gbm90IGRlcGVuZCBvbiBjbHMuCi0gIGNscy5DbGVhciA9IF9DbGVhcgotICBjbHMuRGlzY2FyZFVua25vd25GaWVsZHMgPSBfRGlzY2FyZFVua25vd25GaWVsZHMKLSAgY2xzLl9TZXRMaXN0ZW5lciA9IF9TZXRMaXN0ZW5lcgotCi0KLWRlZiBfQWRkUHJpdmF0ZUhlbHBlck1ldGhvZHMobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJBZGRzIGltcGxlbWVudGF0aW9uIG9mIHByaXZhdGUgaGVscGVyIG1ldGhvZHMgdG8gY2xzLiIiIgotCi0gIGRlZiBNb2RpZmllZChzZWxmKToKLSAgICAiIiJTZXRzIHRoZSBfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSBiaXQgdG8gdHJ1ZSwKLSAgICBhbmQgcHJvcGFnYXRlcyB0aGlzIHRvIG91ciBsaXN0ZW5lciBpZmYgdGhpcyB3YXMgYSBzdGF0ZSBjaGFuZ2UuCi0gICAgIiIiCi0KLSAgICAjIE5vdGU6ICBTb21lIGNhbGxlcnMgY2hlY2sgX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgYmVmb3JlIGNhbGxpbmcKLSAgICAjICAgX01vZGlmaWVkKCkgYXMgYW4gZXh0cmEgb3B0aW1pemF0aW9uLiAgU28sIGlmIHRoaXMgbWV0aG9kIGlzIGV2ZXIKLSAgICAjICAgY2hhbmdlZCBzdWNoIHRoYXQgaXQgZG9lcyBzdHVmZiBldmVuIHdoZW4gX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgaXMKLSAgICAjICAgYWxyZWFkeSB0cnVlLCB0aGUgY2FsbGVycyBuZWVkIHRvIGJlIHVwZGF0ZWQuCi0gICAgaWYgbm90IHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHk6Ci0gICAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5ID0gVHJ1ZQotICAgICAgc2VsZi5fbGlzdGVuZXJfZm9yX2NoaWxkcmVuLmRpcnR5ID0gVHJ1ZQotICAgICAgc2VsZi5faXNfcHJlc2VudF9pbl9wYXJlbnQgPSBUcnVlCi0gICAgICBzZWxmLl9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIF9VcGRhdGVPbmVvZlN0YXRlKHNlbGYsIGZpZWxkKToKLSAgICAiIiJTZXRzIGZpZWxkIGFzIHRoZSBhY3RpdmUgZmllbGQgaW4gaXRzIGNvbnRhaW5pbmcgb25lb2YuCi0KLSAgICBXaWxsIGFsc28gZGVsZXRlIGN1cnJlbnRseSBhY3RpdmUgZmllbGQgaW4gdGhlIG9uZW9mLCBpZiBpdCBpcyBkaWZmZXJlbnQKLSAgICBmcm9tIHRoZSBhcmd1bWVudC4gRG9lcyBub3QgbWFyayB0aGUgbWVzc2FnZSBhcyBtb2RpZmllZC4KLSAgICAiIiIKLSAgICBvdGhlcl9maWVsZCA9IHNlbGYuX29uZW9mcy5zZXRkZWZhdWx0KGZpZWxkLmNvbnRhaW5pbmdfb25lb2YsIGZpZWxkKQotICAgIGlmIG90aGVyX2ZpZWxkIGlzIG5vdCBmaWVsZDoKLSAgICAgIGRlbCBzZWxmLl9maWVsZHNbb3RoZXJfZmllbGRdCi0gICAgICBzZWxmLl9vbmVvZnNbZmllbGQuY29udGFpbmluZ19vbmVvZl0gPSBmaWVsZAotCi0gIGNscy5fTW9kaWZpZWQgPSBNb2RpZmllZAotICBjbHMuU2V0SW5QYXJlbnQgPSBNb2RpZmllZAotICBjbHMuX1VwZGF0ZU9uZW9mU3RhdGUgPSBfVXBkYXRlT25lb2ZTdGF0ZQotCi0KLWNsYXNzIF9MaXN0ZW5lcihvYmplY3QpOgotCi0gICIiIk1lc3NhZ2VMaXN0ZW5lciBpbXBsZW1lbnRhdGlvbiB0aGF0IGEgcGFyZW50IG1lc3NhZ2UgcmVnaXN0ZXJzIHdpdGggaXRzCi0gIGNoaWxkIG1lc3NhZ2UuCi0KLSAgSW4gb3JkZXIgdG8gc3VwcG9ydCBzZW1hbnRpY3MgbGlrZToKLQotICAgIGZvby5iYXIuYmF6LnF1eCA9IDIzCi0gICAgYXNzZXJ0IGZvby5IYXNGaWVsZCgnYmFyJykKLQotICAuLi5jaGlsZCBvYmplY3RzIG11c3QgaGF2ZSBiYWNrIHJlZmVyZW5jZXMgdG8gdGhlaXIgcGFyZW50cy4KLSAgVGhpcyBoZWxwZXIgY2xhc3MgaXMgYXQgdGhlIGhlYXJ0IG9mIHRoaXMgc3VwcG9ydC4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBhcmVudF9tZXNzYWdlKToKLSAgICAiIiJBcmdzOgotICAgICAgcGFyZW50X21lc3NhZ2U6IFRoZSBtZXNzYWdlIHdob3NlIF9Nb2RpZmllZCgpIG1ldGhvZCB3ZSBzaG91bGQgY2FsbCB3aGVuCi0gICAgICAgIHdlIHJlY2VpdmUgTW9kaWZpZWQoKSBtZXNzYWdlcy4KLSAgICAiIiIKLSAgICAjIFRoaXMgbGlzdGVuZXIgZXN0YWJsaXNoZXMgYSBiYWNrIHJlZmVyZW5jZSBmcm9tIGEgY2hpbGQgKGNvbnRhaW5lZCkgb2JqZWN0Ci0gICAgIyB0byBpdHMgcGFyZW50IChjb250YWluaW5nKSBvYmplY3QuICBXZSBtYWtlIHRoaXMgYSB3ZWFrIHJlZmVyZW5jZSB0byBhdm9pZAotICAgICMgY3JlYXRpbmcgY3ljbGljIGdhcmJhZ2Ugd2hlbiB0aGUgY2xpZW50IGZpbmlzaGVzIHdpdGggdGhlICdwYXJlbnQnIG9iamVjdAotICAgICMgaW4gdGhlIHRyZWUuCi0gICAgaWYgaXNpbnN0YW5jZShwYXJlbnRfbWVzc2FnZSwgd2Vha3JlZi5Qcm94eVR5cGUpOgotICAgICAgc2VsZi5fcGFyZW50X21lc3NhZ2Vfd2Vha3JlZiA9IHBhcmVudF9tZXNzYWdlCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX3BhcmVudF9tZXNzYWdlX3dlYWtyZWYgPSB3ZWFrcmVmLnByb3h5KHBhcmVudF9tZXNzYWdlKQotCi0gICAgIyBBcyBhbiBvcHRpbWl6YXRpb24sIHdlIGFsc28gaW5kaWNhdGUgZGlyZWN0bHkgb24gdGhlIGxpc3RlbmVyIHdoZXRoZXIKLSAgICAjIG9yIG5vdCB0aGUgcGFyZW50IG1lc3NhZ2UgaXMgZGlydHkuICBUaGlzIHdheSB3ZSBjYW4gYXZvaWQgdHJhdmVyc2luZwotICAgICMgdXAgdGhlIHRyZWUgaW4gdGhlIGNvbW1vbiBjYXNlLgotICAgIHNlbGYuZGlydHkgPSBGYWxzZQotCi0gIGRlZiBNb2RpZmllZChzZWxmKToKLSAgICBpZiBzZWxmLmRpcnR5OgotICAgICAgcmV0dXJuCi0gICAgdHJ5OgotICAgICAgIyBQcm9wYWdhdGUgdGhlIHNpZ25hbCB0byBvdXIgcGFyZW50cyBpZmYgdGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgc2V0LgotICAgICAgc2VsZi5fcGFyZW50X21lc3NhZ2Vfd2Vha3JlZi5fTW9kaWZpZWQoKQotICAgIGV4Y2VwdCBSZWZlcmVuY2VFcnJvcjoKLSAgICAgICMgV2UgY2FuIGdldCBoZXJlIGlmIGEgY2xpZW50IGhhcyBrZXB0IGEgcmVmZXJlbmNlIHRvIGEgY2hpbGQgb2JqZWN0LAotICAgICAgIyBhbmQgaXMgbm93IHNldHRpbmcgYSBmaWVsZCBvbiBpdCwgYnV0IHRoZSBjaGlsZCdzIHBhcmVudCBoYXMgYmVlbgotICAgICAgIyBnYXJiYWdlLWNvbGxlY3RlZC4gIFRoaXMgaXMgbm90IGFuIGVycm9yLgotICAgICAgcGFzcwotCi0KLWNsYXNzIF9PbmVvZkxpc3RlbmVyKF9MaXN0ZW5lcik6Ci0gICIiIlNwZWNpYWwgbGlzdGVuZXIgaW1wbGVtZW50YXRpb24gZm9yIHNldHRpbmcgY29tcG9zaXRlIG9uZW9mIGZpZWxkcy4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgcGFyZW50X21lc3NhZ2UsIGZpZWxkKToKLSAgICAiIiJBcmdzOgotICAgICAgcGFyZW50X21lc3NhZ2U6IFRoZSBtZXNzYWdlIHdob3NlIF9Nb2RpZmllZCgpIG1ldGhvZCB3ZSBzaG91bGQgY2FsbCB3aGVuCi0gICAgICAgIHdlIHJlY2VpdmUgTW9kaWZpZWQoKSBtZXNzYWdlcy4KLSAgICAgIGZpZWxkOiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgYmVpbmcgc2V0IGluIHRoZSBwYXJlbnQgbWVzc2FnZS4KLSAgICAiIiIKLSAgICBzdXBlcihfT25lb2ZMaXN0ZW5lciwgc2VsZikuX19pbml0X18ocGFyZW50X21lc3NhZ2UpCi0gICAgc2VsZi5fZmllbGQgPSBmaWVsZAotCi0gIGRlZiBNb2RpZmllZChzZWxmKToKLSAgICAiIiJBbHNvIHVwZGF0ZXMgdGhlIHN0YXRlIG9mIHRoZSBjb250YWluaW5nIG9uZW9mIGluIHRoZSBwYXJlbnQgbWVzc2FnZS4iIiIKLSAgICB0cnk6Ci0gICAgICBzZWxmLl9wYXJlbnRfbWVzc2FnZV93ZWFrcmVmLl9VcGRhdGVPbmVvZlN0YXRlKHNlbGYuX2ZpZWxkKQotICAgICAgc3VwZXIoX09uZW9mTGlzdGVuZXIsIHNlbGYpLk1vZGlmaWVkKCkKLSAgICBleGNlcHQgUmVmZXJlbmNlRXJyb3I6Ci0gICAgICBwYXNzCi0KLQotIyBUT0RPKHJvYmluc29uKTogTW92ZSBlbHNld2hlcmU/ICBUaGlzIGZpbGUgaXMgZ2V0dGluZyBwcmV0dHkgcmlkaWN1bG91cy4uLgotIyBUT0RPKHJvYmluc29uKTogVW5pZnkgZXJyb3IgaGFuZGxpbmcgb2YgInVua25vd24gZXh0ZW5zaW9uIiBjcmFwLgotIyBUT0RPKHJvYmluc29uKTogU3VwcG9ydCBpdGVyaXRlbXMoKS1zdHlsZSBpdGVyYXRpb24gb3ZlciBhbGwKLSMgZXh0ZW5zaW9ucyB3aXRoIHRoZSAiaGFzIiBiaXRzIHR1cm5lZCBvbj8KLWNsYXNzIF9FeHRlbnNpb25EaWN0KG9iamVjdCk6Ci0KLSAgIiIiRGljdC1saWtlIGNvbnRhaW5lciBmb3Igc3VwcG9ydGluZyBhbiBpbmRleGFibGUgIkV4dGVuc2lvbnMiCi0gIGZpZWxkIG9uIHByb3RvIGluc3RhbmNlcy4KLQotICBOb3RlIHRoYXQgaW4gYWxsIGNhc2VzIHdlIGV4cGVjdCBleHRlbnNpb24gaGFuZGxlcyB0byBiZQotICBGaWVsZERlc2NyaXB0b3JzLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgZXh0ZW5kZWRfbWVzc2FnZSk6Ci0gICAgIiIiZXh0ZW5kZWRfbWVzc2FnZTogTWVzc2FnZSBpbnN0YW5jZSBmb3Igd2hpY2ggd2UgYXJlIHRoZSBFeHRlbnNpb25zIGRpY3QuCi0gICAgIiIiCi0KLSAgICBzZWxmLl9leHRlbmRlZF9tZXNzYWdlID0gZXh0ZW5kZWRfbWVzc2FnZQotCi0gIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBleHRlbnNpb25faGFuZGxlKToKLSAgICAiIiJSZXR1cm5zIHRoZSBjdXJyZW50IHZhbHVlIG9mIHRoZSBnaXZlbiBleHRlbnNpb24gaGFuZGxlLiIiIgotCi0gICAgX1ZlcmlmeUV4dGVuc2lvbkhhbmRsZShzZWxmLl9leHRlbmRlZF9tZXNzYWdlLCBleHRlbnNpb25faGFuZGxlKQotCi0gICAgcmVzdWx0ID0gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fZmllbGRzLmdldChleHRlbnNpb25faGFuZGxlKQotICAgIGlmIHJlc3VsdCBpcyBub3QgTm9uZToKLSAgICAgIHJldHVybiByZXN1bHQKLQotICAgIGlmIGV4dGVuc2lvbl9oYW5kbGUubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbl9oYW5kbGUuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZSkKLSAgICBlbGlmIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICByZXN1bHQgPSBleHRlbnNpb25faGFuZGxlLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKQotICAgICAgdHJ5OgotICAgICAgICByZXN1bHQuX1NldExpc3RlbmVyKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbikKLSAgICAgIGV4Y2VwdCBSZWZlcmVuY2VFcnJvcjoKLSAgICAgICAgcGFzcwotICAgIGVsc2U6Ci0gICAgICAjIFNpbmd1bGFyIHNjYWxhciAtLSBqdXN0IHJldHVybiB0aGUgZGVmYXVsdCB3aXRob3V0IGluc2VydGluZyBpbnRvIHRoZQotICAgICAgIyBkaWN0LgotICAgICAgcmV0dXJuIGV4dGVuc2lvbl9oYW5kbGUuZGVmYXVsdF92YWx1ZQotCi0gICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKLSAgICAjIGluIHRoZSBuZXcgb2JqZWN0IHdlIGp1c3QgY3JlYXRlZC4gIElmIHNvbWVvbmUgaGFzIHByZWVtcHRlZCB1cywgd2UKLSAgICAjIHRha2UgdGhhdCBvYmplY3QgYW5kIGRpc2NhcmQgb3Vycy4KLSAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCi0gICAgIyAgIGluIENQeXRob24gYnV0IHdlIGhhdmVuJ3QgaW52ZXN0aWdhdGVkIG90aGVycy4gIFRoaXMgd2FybmluZyBhcHBlYXJzCi0gICAgIyAgIGluIHNldmVyYWwgb3RoZXIgbG9jYXRpb25zIGluIHRoaXMgZmlsZS4KLSAgICByZXN1bHQgPSBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHMuc2V0ZGVmYXVsdCgKLSAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZSwgcmVzdWx0KQotCi0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICAgIG15X2ZpZWxkcyA9IHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuTGlzdEZpZWxkcygpCi0gICAgb3RoZXJfZmllbGRzID0gb3RoZXIuX2V4dGVuZGVkX21lc3NhZ2UuTGlzdEZpZWxkcygpCi0KLSAgICAjIEdldCByaWQgb2Ygbm9uLWV4dGVuc2lvbiBmaWVsZHMuCi0gICAgbXlfZmllbGRzICAgID0gWyBmaWVsZCBmb3IgZmllbGQgaW4gbXlfZmllbGRzICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbiBdCi0gICAgb3RoZXJfZmllbGRzID0gWyBmaWVsZCBmb3IgZmllbGQgaW4gb3RoZXJfZmllbGRzIGlmIGZpZWxkLmlzX2V4dGVuc2lvbiBdCi0KLSAgICByZXR1cm4gbXlfZmllbGRzID09IG90aGVyX2ZpZWxkcwotCi0gIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgotICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcgotCi0gIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKLQotICAjIE5vdGUgdGhhdCB0aGlzIGlzIG9ubHkgbWVhbmluZ2Z1bCBmb3Igbm9uLXJlcGVhdGVkLCBzY2FsYXIgZXh0ZW5zaW9uCi0gICMgZmllbGRzLiAgTm90ZSBhbHNvIHRoYXQgd2UgbWF5IGhhdmUgdG8gY2FsbCBfTW9kaWZpZWQoKSB3aGVuIHdlIGRvCi0gICMgc3VjY2Vzc2Z1bGx5IHNldCBhIGZpZWxkIHRoaXMgd2F5LCB0byBzZXQgYW55IG5lY3NzYXJ5ICJoYXMiIGJpdHMgaW4gdGhlCi0gICMgYW5jZXN0b3JzIG9mIHRoZSBleHRlbmRlZCBtZXNzYWdlLgotICBkZWYgX19zZXRpdGVtX18oc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSwgdmFsdWUpOgotICAgICIiIklmIGV4dGVuc2lvbl9oYW5kbGUgc3BlY2lmaWVzIGEgbm9uLXJlcGVhdGVkLCBzY2FsYXIgZXh0ZW5zaW9uCi0gICAgZmllbGQsIHNldHMgdGhlIHZhbHVlIG9mIHRoYXQgZmllbGQuCi0gICAgIiIiCi0KLSAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpCi0KLSAgICBpZiAoZXh0ZW5zaW9uX2hhbmRsZS5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEIG9yCi0gICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UpOgotICAgICAgcmFpc2UgVHlwZUVycm9yKAotICAgICAgICAgICdDYW5ub3QgYXNzaWduIHRvIGV4dGVuc2lvbiAiJXMiIGJlY2F1c2UgaXQgaXMgYSByZXBlYXRlZCBvciAnCi0gICAgICAgICAgJ2NvbXBvc2l0ZSB0eXBlLicgJSBleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSkKLQotICAgICMgSXQncyBzbGlnaHRseSB3YXN0ZWZ1bCB0byBsb29rdXAgdGhlIHR5cGUgY2hlY2tlciBlYWNoIHRpbWUsCi0gICAgIyBidXQgd2UgZXhwZWN0IHRoaXMgdG8gYmUgYSB2YW5pc2hpbmdseSB1bmNvbW1vbiBjYXNlIGFueXdheS4KLSAgICB0eXBlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXJzLkdldFR5cGVDaGVja2VyKGV4dGVuc2lvbl9oYW5kbGUpCi0gICAgIyBweWxpbnQ6IGRpc2FibGU9cHJvdGVjdGVkLWFjY2VzcwotICAgIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX2ZpZWxkc1tleHRlbnNpb25faGFuZGxlXSA9ICgKLSAgICAgICAgdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUodmFsdWUpKQotICAgIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX01vZGlmaWVkKCkKLQotICBkZWYgX0ZpbmRFeHRlbnNpb25CeU5hbWUoc2VsZiwgbmFtZSk6Ci0gICAgIiIiVHJpZXMgdG8gZmluZCBhIGtub3duIGV4dGVuc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBFeHRlbnNpb24gZnVsbCBuYW1lLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEV4dGVuc2lvbiBmaWVsZCBkZXNjcmlwdG9yLgotICAgICIiIgotICAgIHJldHVybiBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9leHRlbnNpb25zX2J5X25hbWUuZ2V0KG5hbWUsIE5vbmUpCi0KLSAgZGVmIF9GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoc2VsZiwgbnVtYmVyKToKLSAgICAiIiJUcmllcyB0byBmaW5kIGEga25vd24gZXh0ZW5zaW9uIHdpdGggdGhlIGZpZWxkIG51bWJlci4KLQotICAgIEFyZ3M6Ci0gICAgICBudW1iZXI6IEV4dGVuc2lvbiBmaWVsZCBudW1iZXIuCi0KLSAgICBSZXR1cm5zOgotICAgICAgRXh0ZW5zaW9uIGZpZWxkIGRlc2NyaXB0b3IuCi0gICAgIiIiCi0gICAgcmV0dXJuIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX2V4dGVuc2lvbnNfYnlfbnVtYmVyLmdldChudW1iZXIsIE5vbmUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3JlZmxlY3Rpb25fdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA2ZGMyZmZmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjk4MyArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jIC0qLSBjb2Rpbmc6IHV0Zi04IC0qLQotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJVbml0dGVzdCBmb3IgcmVmbGVjdGlvbi5weSwgd2hpY2ggYWxzbyBpbmRpcmVjdGx5IHRlc3RzIHRoZSBvdXRwdXQgb2YgdGhlCi1wdXJlLVB5dGhvbiBwcm90b2NvbCBjb21waWxlci4KLSIiIgotCi1pbXBvcnQgY29weQotaW1wb3J0IGdjCi1pbXBvcnQgb3BlcmF0b3IKLWltcG9ydCBzaXgKLWltcG9ydCBzdHJ1Y3QKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdGV4dF9mb3JtYXQKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtb3JlX2V4dGVuc2lvbnNfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbW9yZV9tZXNzYWdlc19wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0Ci1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZGVjb2RlcgotCi0KLWNsYXNzIF9NaW5pRGVjb2RlcihvYmplY3QpOgotICAiIiJEZWNvZGVzIGEgc3RyZWFtIG9mIHZhbHVlcyBmcm9tIGEgc3RyaW5nLgotCi0gIE9uY2UgdXBvbiBhIHRpbWUgd2UgYWN0dWFsbHkgaGFkIGEgY2xhc3MgY2FsbGVkIGRlY29kZXIuRGVjb2Rlci4gIFRoZW4gd2UKLSAgZ290IHJpZCBvZiBpdCBkdXJpbmcgYSByZWRlc2lnbiB0aGF0IG1hZGUgZGVjb2RpbmcgbXVjaCwgbXVjaCBmYXN0ZXIgb3ZlcmFsbC4KLSAgQnV0IGEgY291cGxlIHRlc3RzIGluIHRoaXMgZmlsZSB1c2VkIGl0IHRvIGNoZWNrIHRoYXQgdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZgotICBhIG1lc3NhZ2Ugd2FzIGNvcnJlY3QuICBTbywgdGhpcyBjbGFzcyBpbXBsZW1lbnRzIGp1c3QgdGhlIG1ldGhvZHMgdGhhdCB3ZXJlCi0gIHVzZWQgYnkgc2FpZCB0ZXN0cywgc28gdGhhdCB3ZSBkb24ndCBoYXZlIHRvIHJld3JpdGUgdGhlIHRlc3RzLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgYnl0ZXMpOgotICAgIHNlbGYuX2J5dGVzID0gYnl0ZXMKLSAgICBzZWxmLl9wb3MgPSAwCi0KLSAgZGVmIFJlYWRWYXJpbnQoc2VsZik6Ci0gICAgcmVzdWx0LCBzZWxmLl9wb3MgPSBkZWNvZGVyLl9EZWNvZGVWYXJpbnQoc2VsZi5fYnl0ZXMsIHNlbGYuX3BvcykKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgUmVhZEludDMyID0gUmVhZFZhcmludAotICBSZWFkSW50NjQgPSBSZWFkVmFyaW50Ci0gIFJlYWRVSW50MzIgPSBSZWFkVmFyaW50Ci0gIFJlYWRVSW50NjQgPSBSZWFkVmFyaW50Ci0KLSAgZGVmIFJlYWRTSW50NjQoc2VsZik6Ci0gICAgcmV0dXJuIHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZShzZWxmLlJlYWRWYXJpbnQoKSkKLQotICBSZWFkU0ludDMyID0gUmVhZFNJbnQ2NAotCi0gIGRlZiBSZWFkRmllbGROdW1iZXJBbmRXaXJlVHlwZShzZWxmKToKLSAgICByZXR1cm4gd2lyZV9mb3JtYXQuVW5wYWNrVGFnKHNlbGYuUmVhZFZhcmludCgpKQotCi0gIGRlZiBSZWFkRmxvYXQoc2VsZik6Ci0gICAgcmVzdWx0ID0gc3RydWN0LnVucGFjaygiPGYiLCBzZWxmLl9ieXRlc1tzZWxmLl9wb3M6c2VsZi5fcG9zKzRdKVswXQotICAgIHNlbGYuX3BvcyArPSA0Ci0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBSZWFkRG91YmxlKHNlbGYpOgotICAgIHJlc3VsdCA9IHN0cnVjdC51bnBhY2soIjxkIiwgc2VsZi5fYnl0ZXNbc2VsZi5fcG9zOnNlbGYuX3Bvcys4XSlbMF0KLSAgICBzZWxmLl9wb3MgKz0gOAotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgRW5kT2ZTdHJlYW0oc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX3BvcyA9PSBsZW4oc2VsZi5fYnl0ZXMpCi0KLQotY2xhc3MgUmVmbGVjdGlvblRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBhc3NlcnRMaXN0c0VxdWFsKHNlbGYsIHZhbHVlcywgb3RoZXJzKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKGxlbih2YWx1ZXMpLCBsZW4ob3RoZXJzKSkKLSAgICBmb3IgaSBpbiByYW5nZShsZW4odmFsdWVzKSk6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKHZhbHVlc1tpXSwgb3RoZXJzW2ldKQotCi0gIGRlZiB0ZXN0U2NhbGFyQ29uc3RydWN0b3Ioc2VsZik6Ci0gICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgc2NhbGFyIHR5cGVzIHNob3VsZCBzdWNjZWVkLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgb3B0aW9uYWxfaW50MzI9MjQsCi0gICAgICAgIG9wdGlvbmFsX2RvdWJsZT01NC4zMjEsCi0gICAgICAgIG9wdGlvbmFsX3N0cmluZz0nb3B0aW9uYWxfc3RyaW5nJywKLSAgICAgICAgb3B0aW9uYWxfZmxvYXQ9Tm9uZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjQsIHByb3RvLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTQuMzIxLCBwcm90by5vcHRpb25hbF9kb3VibGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb3B0aW9uYWxfc3RyaW5nJywgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoIm9wdGlvbmFsX2Zsb2F0IikpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhckNvbnN0cnVjdG9yKHNlbGYpOgotICAgICMgQ29uc3RydWN0b3Igd2l0aCBvbmx5IHJlcGVhdGVkIHNjYWxhciB0eXBlcyBzaG91bGQgc3VjY2VlZC4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCi0gICAgICAgIHJlcGVhdGVkX2ludDMyPVsxLCAyLCAzLCA0XSwKLSAgICAgICAgcmVwZWF0ZWRfZG91YmxlPVsxLjIzLCA1NC4zMjFdLAotICAgICAgICByZXBlYXRlZF9ib29sPVtUcnVlLCBGYWxzZSwgRmFsc2VdLAotICAgICAgICByZXBlYXRlZF9zdHJpbmc9WyJvcHRpb25hbF9zdHJpbmciXSwKLSAgICAgICAgcmVwZWF0ZWRfZmxvYXQ9Tm9uZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDIsIDMsIDRdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2ludDMyKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsxLjIzLCA1NC4zMjFdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2RvdWJsZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbVHJ1ZSwgRmFsc2UsIEZhbHNlXSwgbGlzdChwcm90by5yZXBlYXRlZF9ib29sKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsib3B0aW9uYWxfc3RyaW5nIl0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfc3RyaW5nKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFtdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2Zsb2F0KSkKLQotICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlQ29uc3RydWN0b3Ioc2VsZik6Ci0gICAgIyBDb25zdHJ1Y3RvciB3aXRoIG9ubHkgcmVwZWF0ZWQgY29tcG9zaXRlIHR5cGVzIHNob3VsZCBzdWNjZWVkLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9WwotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAotICAgICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PKSwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUildLAotICAgICAgICByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2U9WwotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9LTQzKSwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTQ1MzI0KSwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEyKV0sCi0gICAgICAgIHJlcGVhdGVkZ3JvdXA9WwotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKCksCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoYT0xKSwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cChhPTIpXSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIFt1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCi0gICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTyksCi0gICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCi0gICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIpXSwKLSAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgW3VuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPS00MyksCi0gICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz00NTMyNCksCi0gICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xMildLAotICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgW3VuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCgpLAotICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKGE9MSksCi0gICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoYT0yKV0sCi0gICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRncm91cCkpCi0KLSAgZGVmIHRlc3RNaXhlZENvbnN0cnVjdG9yKHNlbGYpOgotICAgICMgQ29uc3RydWN0b3Igd2l0aCBvbmx5IG1peGVkIHR5cGVzIHNob3VsZCBzdWNjZWVkLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgb3B0aW9uYWxfaW50MzI9MjQsCi0gICAgICAgIG9wdGlvbmFsX3N0cmluZz0nb3B0aW9uYWxfc3RyaW5nJywKLSAgICAgICAgcmVwZWF0ZWRfZG91YmxlPVsxLjIzLCA1NC4zMjFdLAotICAgICAgICByZXBlYXRlZF9ib29sPVtUcnVlLCBGYWxzZSwgRmFsc2VdLAotICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZT1bCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pLAotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAotICAgICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKV0sCi0gICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZT1bCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0tNDMpLAotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSwKLSAgICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2U9Tm9uZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjQsIHByb3RvLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wdGlvbmFsX3N0cmluZycsIHByb3RvLm9wdGlvbmFsX3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsxLjIzLCA1NC4zMjFdLCBsaXN0KHByb3RvLnJlcGVhdGVkX2RvdWJsZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbVHJ1ZSwgRmFsc2UsIEZhbHNlXSwgbGlzdChwcm90by5yZXBlYXRlZF9ib29sKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBbdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAotICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pLAotICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAotICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKV0sCi0gICAgICAgIGxpc3QocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIFt1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0tNDMpLAotICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9NDUzMjQpLAotICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9MTIpXSwKLSAgICAgICAgbGlzdChwcm90by5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpCi0KLSAgZGVmIHRlc3RDb25zdHJ1Y3RvclR5cGVFcnJvcihzZWxmKToKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBvcHRpb25hbF9pbnQzMj0iZm9vIikKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBvcHRpb25hbF9zdHJpbmc9MTIzNCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT0xMjM0KQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX2ludDMyPTEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoCi0gICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfaW50MzI9WyJmb28iXSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9zdHJpbmc9MTIzNCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9zdHJpbmc9WzEyMzRdKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlPTEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoCi0gICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9WzEyMzRdKQotCi0gIGRlZiB0ZXN0Q29uc3RydWN0b3JJbnZhbGlkYXRlc0NhY2hlZEJ5dGVTaXplKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKG9wdGlvbmFsX2ludDMyID0gMTIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBtZXNzYWdlLkJ5dGVTaXplKCkpCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKLQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKHJlcGVhdGVkX2ludDMyID0gWzEyXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKLQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAotICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA9IFt1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBtZXNzYWdlLkJ5dGVTaXplKCkpCi0KLSAgZGVmIHRlc3RTaW1wbGVIYXNCaXRzKHNlbGYpOgotICAgICMgVGVzdCBhIHNjYWxhci4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKLSAgICAjIEhhc0ZpZWxkKCkgc2hvdWxkbid0IGJlIHRydWUgaWYgYWxsIHdlJ3ZlIGRvbmUgaXMKLSAgICAjIHJlYWQgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLSAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKLSAgICAjIFNldHRpbmcgYSB2YWx1ZSBob3dldmVyICpzaG91bGQqIHNldCB0aGUgImhhcyIgYml0LgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLSAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCi0gICAgIyBBbmQgY2xlYXJpbmcgdGhhdCB2YWx1ZSBzaG91bGQgdW5zZXQgdGhlICJoYXMiIGJpdC4KLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQotCi0gIGRlZiB0ZXN0SGFzQml0c1dpdGhTaW5nbHlOZXN0ZWRTY2FsYXIoc2VsZik6Ci0gICAgIyBIZWxwZXIgdXNlZCB0byB0ZXN0IGZvcmVpZ24gbWVzc2FnZXMgYW5kIGdyb3Vwcy4KLSAgICAjCi0gICAgIyBjb21wb3NpdGVfZmllbGRfbmFtZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYSBub24tcmVwZWF0ZWQKLSAgICAjIGNvbXBvc2l0ZSAoaS5lLiwgZm9yZWlnbiBvciBncm91cCkgZmllbGQgaW4gVGVzdEFsbFR5cGVzLAotICAgICMgYW5kIHNjYWxhcl9maWVsZF9uYW1lIHNob3VsZCBiZSB0aGUgbmFtZSBvZiBhbiBpbnRlZ2VyLXZhbHVlZAotICAgICMgc2NhbGFyIGZpZWxkIHdpdGhpbiB0aGF0IGNvbXBvc2l0ZS4KLSAgICAjCi0gICAgIyBJIG5ldmVyIHRob3VnaHQgSSdkIG1pc3MgQysrIG1hY3JvcyBhbmQgdGVtcGxhdGVzIHNvIG11Y2guIDooCi0gICAgIyBUaGlzIGhlbHBlciBpcyBzZW1hbnRpY2FsbHkganVzdDoKLSAgICAjCi0gICAgIyAgIGFzc2VydCBwcm90by5jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID09IDAKLSAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQuSGFzRmllbGQoJ3NjYWxhcl9maWVsZCcpCi0gICAgIyAgIGFzc2VydCBub3QgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCi0gICAgIwotICAgICMgICBwcm90by5jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID0gMTAKLSAgICAjICAgb2xkX2NvbXBvc2l0ZV9maWVsZCA9IHByb3RvLmNvbXBvc2l0ZV9maWVsZAotICAgICMKLSAgICAjICAgYXNzZXJ0IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPT0gMTAKLSAgICAjICAgYXNzZXJ0IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZCgnc2NhbGFyX2ZpZWxkJykKLSAgICAjICAgYXNzZXJ0IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQotICAgICMKLSAgICAjICAgcHJvdG8uQ2xlYXJGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKLSAgICAjCi0gICAgIyAgIGFzc2VydCBub3QgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKCdzY2FsYXJfZmllbGQnKQotICAgICMgICBhc3NlcnQgbm90IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQotICAgICMgICBhc3NlcnQgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLnNjYWxhcl9maWVsZCA9PSAwCi0gICAgIwotICAgICMgICAjIE5vdyBlbnN1cmUgdGhhdCBDbGVhckZpZWxkKCdjb21wb3NpdGVfZmllbGQnKSBkaXNjb25uZWN0ZWQKLSAgICAjICAgIyB0aGUgb2xkIGZpZWxkIG9iamVjdCBmcm9tIHRoZSBvYmplY3QgdHJlZS4uLgotICAgICMgICBhc3NlcnQgb2xkX2NvbXBvc2l0ZV9maWVsZCBpcyBub3QgcHJvdG8uY29tcG9zaXRlX2ZpZWxkCi0gICAgIyAgIG9sZF9jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID0gMjAKLSAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5jb21wb3NpdGVfZmllbGQuSGFzRmllbGQoJ3NjYWxhcl9maWVsZCcpCi0gICAgIyAgIGFzc2VydCBub3QgcHJvdG8uSGFzRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCi0gICAgZGVmIFRlc3RDb21wb3NpdGVIYXNCaXRzKGNvbXBvc2l0ZV9maWVsZF9uYW1lLCBzY2FsYXJfZmllbGRfbmFtZSk6Ci0gICAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgICAgIyBGaXJzdCwgY2hlY2sgdGhhdCB3ZSBjYW4gZ2V0IHRoZSBzY2FsYXIgdmFsdWUsIGFuZCBzZWUgdGhhdCBpdCdzIHRoZQotICAgICAgIyBkZWZhdWx0ICgwKSwgYnV0IHRoYXQgcHJvdG8uSGFzRmllbGQoJ29tcG9zaXRlJykgYW5kCi0gICAgICAjIHByb3RvLmNvbXBvc2l0ZS5IYXNGaWVsZCgnc2NhbGFyJykgd2lsbCBzdGlsbCByZXR1cm4gRmFsc2UuCi0gICAgICBjb21wb3NpdGVfZmllbGQgPSBnZXRhdHRyKHByb3RvLCBjb21wb3NpdGVfZmllbGRfbmFtZSkKLSAgICAgIG9yaWdpbmFsX3NjYWxhcl92YWx1ZSA9IGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgb3JpZ2luYWxfc2NhbGFyX3ZhbHVlKQotICAgICAgIyBBc3NlcnQgdGhhdCB0aGUgY29tcG9zaXRlIG9iamVjdCBkb2VzIG5vdCAiaGF2ZSIgdGhlIHNjYWxhci4KLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKHNjYWxhcl9maWVsZF9uYW1lKSkKLSAgICAgICMgQXNzZXJ0IHRoYXQgcHJvdG8gZG9lcyBub3QgImhhdmUiIHRoZSBjb21wb3NpdGUgZmllbGQuCi0gICAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKSkKLQotICAgICAgIyBOb3cgc2V0IHRoZSBzY2FsYXIgd2l0aGluIHRoZSBjb21wb3NpdGUgZmllbGQuICBFbnN1cmUgdGhhdCB0aGUgc2V0dGluZwotICAgICAgIyBpcyByZWZsZWN0ZWQsIGFuZCB0aGF0IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGUnKSBhbmQKLSAgICAgICMgcHJvdG8uY29tcG9zaXRlLkhhc0ZpZWxkKCdzY2FsYXInKSBub3cgYm90aCByZXR1cm4gVHJ1ZS4KLSAgICAgIG5ld192YWwgPSAyMAotICAgICAgc2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lLCBuZXdfdmFsKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChuZXdfdmFsLCBnZXRhdHRyKGNvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUpKQotICAgICAgIyBIb2xkIG9uIHRvIGEgcmVmZXJlbmNlIHRvIHRoZSBjdXJyZW50IGNvbXBvc2l0ZV9maWVsZCBvYmplY3QuCi0gICAgICBvbGRfY29tcG9zaXRlX2ZpZWxkID0gY29tcG9zaXRlX2ZpZWxkCi0gICAgICAjIEFzc2VydCB0aGF0IHRoZSBoYXMgbWV0aG9kcyBub3cgcmV0dXJuIHRydWUuCi0gICAgICBzZWxmLmFzc2VydFRydWUoY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKHNjYWxhcl9maWVsZF9uYW1lKSkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCi0KLSAgICAgICMgTm93IGNhbGwgdGhlIGNsZWFyIG1ldGhvZC4uLgotICAgICAgcHJvdG8uQ2xlYXJGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkKLQotICAgICAgIyAuLi5hbmQgZW5zdXJlIHRoYXQgdGhlICJoYXMiIGJpdHMgYXJlIGFsbCBiYWNrIHRvIEZhbHNlLi4uCi0gICAgICBjb21wb3NpdGVfZmllbGQgPSBnZXRhdHRyKHByb3RvLCBjb21wb3NpdGVfZmllbGRfbmFtZSkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKHNjYWxhcl9maWVsZF9uYW1lKSkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoY29tcG9zaXRlX2ZpZWxkX25hbWUpKQotICAgICAgIyAuLi5hbmQgZW5zdXJlIHRoYXQgdGhlIHNjYWxhciBmaWVsZCBoYXMgcmV0dXJuZWQgdG8gaXRzIGRlZmF1bHQuCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkpCi0KLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShvbGRfY29tcG9zaXRlX2ZpZWxkIGlzIG5vdCBjb21wb3NpdGVfZmllbGQpCi0gICAgICBzZXRhdHRyKG9sZF9jb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lLCBuZXdfdmFsKQotICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBjb21wb3NpdGVfZmllbGQuSGFzRmllbGQoc2NhbGFyX2ZpZWxkX25hbWUpKQotICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGdldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSkpCi0KLSAgICAjIFRlc3Qgc2ltcGxlLCBzaW5nbGUtbGV2ZWwgbmVzdGluZyB3aGVuIHdlIHNldCBhIHNjYWxhci4KLSAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxncm91cCcsICdhJykKLSAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnLCAnYmInKQotICAgIFRlc3RDb21wb3NpdGVIYXNCaXRzKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnLCAnYycpCi0gICAgVGVzdENvbXBvc2l0ZUhhc0JpdHMoJ29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlJywgJ2QnKQotCi0gIGRlZiB0ZXN0UmVmZXJlbmNlc1RvTmVzdGVkTWVzc2FnZShzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCi0gICAgZGVsIHByb3RvCi0gICAgIyBBIHByZXZpb3VzIHZlcnNpb24gaGFkIGEgYnVnIHdoZXJlIHRoaXMgd291bGQgcmFpc2UgYW4gZXhjZXB0aW9uIHdoZW4KLSAgICAjIGhpdHRpbmcgYSBub3ctZGVhZCB3ZWFrIHJlZmVyZW5jZS4KLSAgICBuZXN0ZWQuYmIgPSAyMwotCi0gIGRlZiB0ZXN0RGlzY29ubmVjdGluZ05lc3RlZE1lc3NhZ2VCZWZvcmVTZXR0aW5nRmllbGQoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBuZXN0ZWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQotICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykgICMgU2hvdWxkIGRpc2Nvbm5lY3QgZnJvbSBwYXJlbnQKLSAgICBzZWxmLmFzc2VydFRydWUobmVzdGVkIGlzIG5vdCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSkKLSAgICBuZXN0ZWQuYmIgPSAyMwotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKLQotICBkZWYgdGVzdEdldERlZmF1bHRNZXNzYWdlQWZ0ZXJEaXNjb25uZWN0aW5nRGVmYXVsdE1lc3NhZ2Uoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBuZXN0ZWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQotICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKLSAgICBkZWwgcHJvdG8KLSAgICBkZWwgbmVzdGVkCi0gICAgIyBGb3JjZSBhIGdhcmJhZ2UgY29sbGVjdCBzbyB0aGF0IHRoZSB1bmRlcmx5aW5nIENNZXNzYWdlcyBhcmUgZnJlZWQgYWxvbmcKLSAgICAjIHdpdGggdGhlIE1lc3NhZ2VzIHRoZXkgcG9pbnQgdG8uIFRoaXMgaXMgdG8gbWFrZSBzdXJlIHdlJ3JlIG5vdCBkZWxldGluZwotICAgICMgZGVmYXVsdCBtZXNzYWdlIGluc3RhbmNlcy4KLSAgICBnYy5jb2xsZWN0KCkKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCi0KLSAgZGVmIHRlc3REaXNjb25uZWN0aW5nTmVzdGVkTWVzc2FnZUFmdGVyU2V0dGluZ0ZpZWxkKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbmVzdGVkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKLSAgICBuZXN0ZWQuYmIgPSA1Ci0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykgICMgU2hvdWxkIGRpc2Nvbm5lY3QgZnJvbSBwYXJlbnQKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIG5lc3RlZC5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXN0ZWQgaXMgbm90IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKQotICAgIG5lc3RlZC5iYiA9IDIzCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotCi0gIGRlZiB0ZXN0RGlzY29ubmVjdGluZ05lc3RlZE1lc3NhZ2VCZWZvcmVHZXR0aW5nRmllbGQoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotCi0gIGRlZiB0ZXN0RGlzY29ubmVjdGluZ05lc3RlZE1lc3NhZ2VBZnRlck1lcmdlKHNlbGYpOgotICAgICMgVGhpcyB0ZXN0IGV4ZXJjaXNlcyB0aGUgY29kZSBwYXRoIHRoYXQgZG9lcyBub3QgdXNlIFJlbGVhc2VNZXNzYWdlKCkuCi0gICAgIyBUaGUgdW5kZXJseWluZyBmZWFyIGlzIHRoYXQgaWYgd2UgdXNlIFJlbGVhc2VNZXNzYWdlKCkgaW5jb3JyZWN0bHksCi0gICAgIyB3ZSB3aWxsIGhhdmUgbWVtb3J5IGxlYWtzLiAgSXQncyBoYXJkIHRvIGNoZWNrIHRoYXQgdGhhdCBkb2Vzbid0IGhhcHBlbiwKLSAgICAjIGJ1dCBhdCBsZWFzdCB3ZSBjYW4gZXhlcmNpc2UgdGhhdCBjb2RlIHBhdGggdG8gbWFrZSBzdXJlIGl0IHdvcmtzLgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMi5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDUKLSAgICBwcm90bzEuTWVyZ2VGcm9tKHByb3RvMikKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8xLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotICAgIHByb3RvMS5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90bzEuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgZGVmIHRlc3REaXNjb25uZWN0aW5nTGF6eU5lc3RlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgIyBUaGlzIHRlc3QgZXhlcmNpc2VzIHJlbGVhc2luZyBhIG5lc3RlZCBtZXNzYWdlIHRoYXQgaXMgbGF6eS4gVGhpcyB0ZXN0Ci0gICAgIyBvbmx5IGV4ZXJjaXNlcyByZWFsIGNvZGUgaW4gdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBhcyBQeXRob24gZG9lcyBub3QKLSAgICAjIHN1cHBvcnQgbGF6eSBwYXJzaW5nLCBidXQgdGhlIGN1cnJlbnQgQysrIGltcGxlbWVudGF0aW9uIHJlc3VsdHMgaW4KLSAgICAjIG1lbW9yeSBjb3JydXB0aW9uIGFuZCBhIGNyYXNoLgotICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6Ci0gICAgICByZXR1cm4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX2xhenlfbWVzc2FnZS5iYiA9IDUKLSAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9sYXp5X21lc3NhZ2UnKQotICAgIGRlbCBwcm90bwotICAgIGdjLmNvbGxlY3QoKQotCi0gIGRlZiB0ZXN0SGFzQml0c1doZW5Nb2RpZnlpbmdSZXBlYXRlZEZpZWxkcyhzZWxmKToKLSAgICAjIFRlc3QgbmVzdGluZyB3aGVuIHdlIGFkZCBhbiBlbGVtZW50IHRvIGEgcmVwZWF0ZWQgZmllbGQgaW4gYSBzdWJtZXNzYWdlLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cygpCi0gICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UubmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBbNV0sIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotCi0gICAgIyBEbyB0aGUgc2FtZSB0ZXN0LCBidXQgd2l0aCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZCB3aXRoaW4gdGhlCi0gICAgIyBzdWJtZXNzYWdlLgotICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfZm9yZWlnbm1lc3NhZ2UuYWRkKCkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgZGVmIHRlc3RIYXNCaXRzRm9yTWFueUxldmVsc09mTmVzdGluZyhzZWxmKToKLSAgICAjIFRlc3QgbmVzdGluZyBtYW55IGxldmVscyBkZWVwLgotICAgIHJlY3Vyc2l2ZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCByZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVjdXJzaXZlX3Byb3RvLkhhc0ZpZWxkKCdiYicpKQotICAgIHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIub3B0aW9uYWxfaW50MzIgPSA1Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCByZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHJlY3Vyc2l2ZV9wcm90by5iYi5IYXNGaWVsZCgnYScpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5IYXNGaWVsZCgnYmInKSkKLSAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuSGFzRmllbGQoJ2EnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5IYXNGaWVsZCgnYmInKSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIuSGFzRmllbGQoJ2EnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5iYi5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLQotICBkZWYgdGVzdFNpbmd1bGFyTGlzdEZpZWxkcyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX2ZpeGVkMzIgPSAxCi0gICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSA1Ci0gICAgcHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ2ZvbycKLSAgICAjIEFjY2VzcyBzdWItbWVzc2FnZSBidXQgZG9uJ3Qgc2V0IGl0IHlldC4KLSAgICBuZXN0ZWRfbWVzc2FnZSA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJyAgXSwgNSksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9maXhlZDMyJ10sIDEpLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfc3RyaW5nJyBdLCAnZm9vJykgXSwKLSAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKLQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMTIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJyAgXSwgNSksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9maXhlZDMyJ10sIDEpLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfc3RyaW5nJyBdLCAnZm9vJyksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScgXSwKLSAgICAgICAgICAgICBuZXN0ZWRfbWVzc2FnZSkgXSwKLSAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkTGlzdEZpZWxkcyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLnJlcGVhdGVkX2ZpeGVkMzIuYXBwZW5kKDEpCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDExKQotICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoWydmb28nLCAnYmFyJ10pCi0gICAgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbXSkKLSAgICBwcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYXonKQotICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoc3RyKHgpIGZvciB4IGluIHJhbmdlKDIpKQotICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMjEKLSAgICBwcm90by5yZXBlYXRlZF9ib29sICAjIEFjY2VzcyBidXQgZG9uJ3Qgc2V0IGFueXRoaW5nOyBzaG91bGQgbm90IGJlIGxpc3RlZC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfaW50MzInICBdLCAyMSksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydyZXBlYXRlZF9pbnQzMicgIF0sIFs1LCAxMV0pLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfZml4ZWQzMiddLCBbMV0pLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfc3RyaW5nJyBdLAotICAgICAgICAgIFsnZm9vJywgJ2JhcicsICdiYXonLCAnMCcsICcxJ10pIF0sCi0gICAgICBwcm90by5MaXN0RmllbGRzKCkpCi0KLSAgZGVmIHRlc3RTaW5ndWxhckxpc3RFeHRlbnNpb25zKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl0gPSAxCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICBdID0gNQotICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gXSA9ICdmb28nCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIFsgKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24gICwgNSksCi0gICAgICAgICh1bml0dGVzdF9wYjIub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24sIDEpLAotICAgICAgICAodW5pdHRlc3RfcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gLCAnZm9vJykgXSwKLSAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkTGlzdEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMSkKLSAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gIF0uYXBwZW5kKDUpCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICBdLmFwcGVuZCgxMSkKLSAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uIF0uYXBwZW5kKCdmb28nKQotICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gXS5hcHBlbmQoJ2JhcicpCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiBdLmFwcGVuZCgnYmF6JykKLSAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24gIF0gPSAyMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICBbICh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAsIDIxKSwKLSAgICAgICAgKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICwgWzUsIDExXSksCi0gICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIFsxXSksCi0gICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAsIFsnZm9vJywgJ2JhcicsICdiYXonXSkgXSwKLSAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKLQotICBkZWYgdGVzdExpc3RGaWVsZHNBbmRFeHRlbnNpb25zKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RGaWVsZE9yZGVyaW5ncygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMocHJvdG8pCi0gICAgdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgWyAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnbXlfaW50JyAgIF0sIDEpLAotICAgICAgICAodW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQgICAgICAgICAgICAgICAsIDIzKSwKLSAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ215X3N0cmluZyddLCAnZm9vJyksCi0gICAgICAgICh1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZyAgICAgICAgICAgICwgJ2JhcicpLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnbXlfZmxvYXQnIF0sIDEuMCkgXSwKLSAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKLQotICBkZWYgdGVzdERlZmF1bHRWYWx1ZXMoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfaW50NjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF91aW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF91aW50NjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zaW50NjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9maXhlZDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfZml4ZWQ2NCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX3NmaXhlZDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfc2ZpeGVkNjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLjAsIHByb3RvLm9wdGlvbmFsX2Zsb2F0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4wLCBwcm90by5vcHRpb25hbF9kb3VibGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwgcHJvdG8ub3B0aW9uYWxfYm9vbCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBwcm90by5vcHRpb25hbF9zdHJpbmcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChiJycsIHByb3RvLm9wdGlvbmFsX2J5dGVzKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0MSwgcHJvdG8uZGVmYXVsdF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBwcm90by5kZWZhdWx0X2ludDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDMsIHByb3RvLmRlZmF1bHRfdWludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDQsIHByb3RvLmRlZmF1bHRfdWludDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTQ1LCBwcm90by5kZWZhdWx0X3NpbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQ2LCBwcm90by5kZWZhdWx0X3NpbnQ2NCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQ3LCBwcm90by5kZWZhdWx0X2ZpeGVkMzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0OCwgcHJvdG8uZGVmYXVsdF9maXhlZDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDksIHByb3RvLmRlZmF1bHRfc2ZpeGVkMzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtNTAsIHByb3RvLmRlZmF1bHRfc2ZpeGVkNjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1MS41LCBwcm90by5kZWZhdWx0X2Zsb2F0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTJlMywgcHJvdG8uZGVmYXVsdF9kb3VibGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBwcm90by5kZWZhdWx0X2Jvb2wpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnaGVsbG8nLCBwcm90by5kZWZhdWx0X3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGInd29ybGQnLCBwcm90by5kZWZhdWx0X2J5dGVzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIsIHByb3RvLmRlZmF1bHRfbmVzdGVkX2VudW0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsIHByb3RvLmRlZmF1bHRfZm9yZWlnbl9lbnVtKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFSLAotICAgICAgICAgICAgICAgICAgICAgcHJvdG8uZGVmYXVsdF9pbXBvcnRfZW51bSkKLQotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1MTIzNCcsIHByb3RvLnV0Zjhfc3RyaW5nKQotCi0gIGRlZiB0ZXN0SGFzRmllbGRXaXRoVW5rbm93bkZpZWxkTmFtZShzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLkhhc0ZpZWxkLCAnbm9uZXhpc3RlbnRfZmllbGQnKQotCi0gIGRlZiB0ZXN0Q2xlYXJGaWVsZFdpdGhVbmtub3duRmllbGROYW1lKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcHJvdG8uQ2xlYXJGaWVsZCwgJ25vbmV4aXN0ZW50X2ZpZWxkJykKLQotICBkZWYgdGVzdENsZWFyUmVtb3Zlc0NoaWxkcmVuKHNlbGYpOgotICAgICMgTWFrZSBzdXJlIHRoZXJlIGFyZW4ndCBhbnkgaW1wbGVtZW50YXRpb24gYnVncyB0aGF0IGFyZSBvbmx5IHBhcnRpYWxseQotICAgICMgY2xlYXJpbmcgdGhlIG1lc3NhZ2UgKHdoaWNoIGNhbiBoYXBwZW4gaW4gdGhlIG1vcmUgY29tcGxleCBDKysKLSAgICAjIGltcGxlbWVudGF0aW9uIHdoaWNoIGhhcyBwYXJhbGxlbCBtZXNzYWdlIGxpc3RzKS4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKCkKLSAgICBmb3IgaSBpbiByYW5nZSgxMCk6Ci0gICAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlLmFkZCgpCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oKQotICAgIHByb3RvLkNvcHlGcm9tKHByb3RvMikKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhJbmRleEVycm9yLCBsYW1iZGE6IHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbNV0pCi0KLSAgZGVmIHRlc3REaXNhbGxvd2VkQXNzaWdubWVudHMoc2VsZik6Ci0gICAgIyBJdCdzIGlsbGVnYWwgdG8gYXNzaWduIHZhbHVlcyBkaXJlY3RseSB0byByZXBlYXRlZCBmaWVsZHMKLSAgICAjIG9yIHRvIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuICBFbnN1cmUgdGhhdCB0aGlzIGZhaWxzLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgIyBSZXBlYXRlZCBmaWVsZHMuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAncmVwZWF0ZWRfaW50MzInLCAxMCkKLSAgICAjIExpc3RzIHNob3VsZG4ndCB3b3JrLCBlaXRoZXIuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAncmVwZWF0ZWRfaW50MzInLCBbMTBdKQotICAgICMgQ29tcG9zaXRlIGZpZWxkcy4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJywgMjMpCi0gICAgIyBBc3NpZ25tZW50IHRvIGEgcmVwZWF0ZWQgbmVzdGVkIG1lc3NhZ2UgZmllbGQgd2l0aG91dCBzcGVjaWZ5aW5nCi0gICAgIyB0aGUgaW5kZXggaW4gdGhlIGFycmF5IG9mIG5lc3RlZCBtZXNzYWdlcy4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgJ2JiJywgMzQpCi0gICAgIyBBc3NpZ25tZW50IHRvIGFuIGF0dHJpYnV0ZSBvZiBhIHJlcGVhdGVkIGZpZWxkLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBwcm90by5yZXBlYXRlZF9mbG9hdCwKLSAgICAgICAgICAgICAgICAgICAgICAnc29tZV9hdHRyaWJ1dGUnLCAzNCkKLSAgICAjIHByb3RvLm5vbmV4aXN0ZW50X2ZpZWxkID0gMjMgc2hvdWxkIGZhaWwgYXMgd2VsbC4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdub25leGlzdGVudF9maWVsZCcsIDIzKQotCi0gIGRlZiB0ZXN0U2luZ2xlU2NhbGFyVHlwZVNhZmV0eShzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9pbnQzMicsIDEuMSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfaW50MzInLCAnZm9vJykKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfc3RyaW5nJywgMTApCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2J5dGVzJywgMTApCi0KLSAgZGVmIHRlc3RJbnRlZ2VyVHlwZXMoc2VsZik6Ci0gICAgZGVmIFRlc3RHZXRBbmREZXNlcmlhbGl6ZShmaWVsZF9uYW1lLCB2YWx1ZSwgZXhwZWN0ZWRfdHlwZSk6Ci0gICAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgICAgc2V0YXR0cihwcm90bywgZmllbGRfbmFtZSwgdmFsdWUpCi0gICAgICBzZWxmLmFzc2VydElzSW5zdGFuY2UoZ2V0YXR0cihwcm90bywgZmllbGRfbmFtZSksIGV4cGVjdGVkX3R5cGUpCi0gICAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICAgIHByb3RvMi5QYXJzZUZyb21TdHJpbmcocHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShnZXRhdHRyKHByb3RvMiwgZmllbGRfbmFtZSksIGV4cGVjdGVkX3R5cGUpCi0KLSAgICBUZXN0R2V0QW5kRGVzZXJpYWxpemUoJ29wdGlvbmFsX2ludDMyJywgMSwgaW50KQotICAgIFRlc3RHZXRBbmREZXNlcmlhbGl6ZSgnb3B0aW9uYWxfaW50MzInLCAxIDw8IDMwLCBpbnQpCi0gICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF91aW50MzInLCAxIDw8IDMwLCBpbnQpCi0gICAgdHJ5OgotICAgICAgaW50ZWdlcl82NCA9IGxvbmcKLSAgICBleGNlcHQgTmFtZUVycm9yOiAjIFB5dGhvbjMKLSAgICAgIGludGVnZXJfNjQgPSBpbnQKLSAgICBpZiBzdHJ1Y3QuY2FsY3NpemUoJ0wnKSA9PSA0OgotICAgICAgIyBQeXRob24gb25seSBoYXMgc2lnbmVkIGludHMsIHNvIDMyLWJpdCBweXRob24gY2FuJ3QgZml0IGFuIHVpbnQzMgotICAgICAgIyBpbiBhbiBpbnQuCi0gICAgICBUZXN0R2V0QW5kRGVzZXJpYWxpemUoJ29wdGlvbmFsX3VpbnQzMicsIDEgPDwgMzEsIGxvbmcpCi0gICAgZWxzZToKLSAgICAgICMgNjQtYml0IHB5dGhvbiBjYW4gZml0IHVpbnQzMiBpbnNpZGUgYW4gaW50Ci0gICAgICBUZXN0R2V0QW5kRGVzZXJpYWxpemUoJ29wdGlvbmFsX3VpbnQzMicsIDEgPDwgMzEsIGludCkKLSAgICBUZXN0R2V0QW5kRGVzZXJpYWxpemUoJ29wdGlvbmFsX2ludDY0JywgMSA8PCAzMCwgaW50ZWdlcl82NCkKLSAgICBUZXN0R2V0QW5kRGVzZXJpYWxpemUoJ29wdGlvbmFsX2ludDY0JywgMSA8PCA2MCwgaW50ZWdlcl82NCkKLSAgICBUZXN0R2V0QW5kRGVzZXJpYWxpemUoJ29wdGlvbmFsX3VpbnQ2NCcsIDEgPDwgMzAsIGludGVnZXJfNjQpCi0gICAgVGVzdEdldEFuZERlc2VyaWFsaXplKCdvcHRpb25hbF91aW50NjQnLCAxIDw8IDYwLCBpbnRlZ2VyXzY0KQotCi0gIGRlZiB0ZXN0U2luZ2xlU2NhbGFyQm91bmRzQ2hlY2tpbmcoc2VsZik6Ci0gICAgZGVmIFRlc3RNaW5BbmRNYXhJbnRlZ2VycyhmaWVsZF9uYW1lLCBleHBlY3RlZF9taW4sIGV4cGVjdGVkX21heCk6Ci0gICAgICBwYiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgICAgc2V0YXR0cihwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWluKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9taW4sIGdldGF0dHIocGIsIGZpZWxkX25hbWUpKQotICAgICAgc2V0YXR0cihwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWF4KQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9tYXgsIGdldGF0dHIocGIsIGZpZWxkX25hbWUpKQotICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgcGIsIGZpZWxkX25hbWUsIGV4cGVjdGVkX21pbiAtIDEpCi0gICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWF4ICsgMSkKLQotICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfaW50MzInLCAtKDEgPDwgMzEpLCAoMSA8PCAzMSkgLSAxKQotICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfdWludDMyJywgMCwgMHhmZmZmZmZmZikKLSAgICBUZXN0TWluQW5kTWF4SW50ZWdlcnMoJ29wdGlvbmFsX2ludDY0JywgLSgxIDw8IDYzKSwgKDEgPDwgNjMpIC0gMSkKLSAgICBUZXN0TWluQW5kTWF4SW50ZWdlcnMoJ29wdGlvbmFsX3VpbnQ2NCcsIDAsIDB4ZmZmZmZmZmZmZmZmZmZmZikKLQotICAgIHBiID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0gPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSkKLQotICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyVHlwZVNhZmV0eShzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kLCAxLjEpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQsICdmb28nKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLCAxMCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2J5dGVzLCAxMCkKLQotICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMlswXSA9IDIzCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19zZXRpdGVtX18sIDUwMCwgMjMpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9pbnQzMi5fX3NldGl0ZW1fXywgMCwgJ2FiYycpCi0KLSAgICAjIFJlcGVhdGVkIGVudW1zIHRlc3RzLgotICAgICNwcm90by5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQoMCkKLQotICBkZWYgdGVzdFNpbmdsZVNjYWxhckdldHRlcnNBbmRTZXR0ZXJzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKLSAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ludDMyKQotCi0gICAgcHJvdG8ub3B0aW9uYWxfdWludDY0ID0gMHhmZmZmZmZmZmZmZmYKLSAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmLCBwcm90by5vcHRpb25hbF91aW50NjQpCi0gICAgcHJvdG8ub3B0aW9uYWxfdWludDY0ID0gMHhmZmZmZmZmZmZmZmZmZmZmCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmYsIHByb3RvLm9wdGlvbmFsX3VpbnQ2NCkKLSAgICAjIFRPRE8ocm9iaW5zb24pOiBUZXN0IGFsbCBvdGhlciBzY2FsYXIgZmllbGQgdHlwZXMuCi0KLSAgZGVmIHRlc3RTaW5nbGVTY2FsYXJDbGVhckZpZWxkKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgIyBTaG91bGQgYmUgYWxsb3dlZCB0byBjbGVhciBzb21ldGhpbmcgdGhhdCdzIG5vdCB0aGVyZSAoYSBuby1vcCkuCi0gICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLSAgICBwcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQotICAgICMgVE9ETyhyb2JpbnNvbik6IFRlc3QgYWxsIG90aGVyIHNjYWxhciBmaWVsZCB0eXBlcy4KLQotICBkZWYgdGVzdEVudW1zKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5GT08pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJBUikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8uQkFaKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVopCi0KLSAgZGVmIHRlc3RFbnVtX05hbWUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgnRk9SRUlHTl9GT08nLAotICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25FbnVtLk5hbWUodW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdGT1JFSUdOX0JBUicsCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uTmFtZSh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZPUkVJR05fQkFaJywKLSAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduRW51bS5OYW1lKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uTmFtZSwgMTEzMTIpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0ZPTycsCi0gICAgICAgICAgICAgICAgICAgICBwcm90by5OZXN0ZWRFbnVtLk5hbWUocHJvdG8uRk9PKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdGT08nLAotICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLk5hbWUocHJvdG8uRk9PKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdCQVInLAotICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5OYW1lKHByb3RvLkJBUikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnQkFSJywKLSAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lKHByb3RvLkJBUikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnQkFaJywKLSAgICAgICAgICAgICAgICAgICAgIHByb3RvLk5lc3RlZEVudW0uTmFtZShwcm90by5CQVopKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ0JBWicsCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uTmFtZShwcm90by5CQVopKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5OYW1lLCAxMTMxMikKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5OYW1lLCAxMTMxMikKLQotICBkZWYgdGVzdEVudW1fVmFsdWUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9GT08sCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUoJ0ZPUkVJR05fRk9PJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUoJ0ZPUkVJR05fQkFSJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVosCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUoJ0ZPUkVJR05fQkFaJykpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uVmFsdWUsICdGTycpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uRk9PLAotICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSgnRk9PJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5GT08sCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUoJ0ZPTycpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQkFSLAotICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSgnQkFSJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CQVIsCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUoJ0JBUicpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8uQkFaLAotICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSgnQkFaJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CQVosCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUoJ0JBWicpKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgcHJvdG8uTmVzdGVkRW51bS5WYWx1ZSwgJ0ZvbycpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uVmFsdWUsICdGb28nKQotCi0gIGRlZiB0ZXN0RW51bV9LZXlzQW5kVmFsdWVzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydGT1JFSUdOX0ZPTycsICdGT1JFSUdOX0JBUicsICdGT1JFSUdOX0JBWiddLAotICAgICAgICAgICAgICAgICAgICAgbGlzdCh1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0ua2V5cygpKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFs0LCA1LCA2XSwKLSAgICAgICAgICAgICAgICAgICAgIGxpc3QodW5pdHRlc3RfcGIyLkZvcmVpZ25FbnVtLnZhbHVlcygpKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsoJ0ZPUkVJR05fRk9PJywgNCksICgnRk9SRUlHTl9CQVInLCA1KSwKLSAgICAgICAgICAgICAgICAgICAgICAoJ0ZPUkVJR05fQkFaJywgNildLAotICAgICAgICAgICAgICAgICAgICAgbGlzdCh1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uaXRlbXMoKSkpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydGT08nLCAnQkFSJywgJ0JBWicsICdORUcnXSwgbGlzdChwcm90by5OZXN0ZWRFbnVtLmtleXMoKSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbMSwgMiwgMywgLTFdLCBsaXN0KHByb3RvLk5lc3RlZEVudW0udmFsdWVzKCkpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWygnRk9PJywgMSksICgnQkFSJywgMiksICgnQkFaJywgMyksICgnTkVHJywgLTEpXSwKLSAgICAgICAgICAgICAgICAgICAgIGxpc3QocHJvdG8uTmVzdGVkRW51bS5pdGVtcygpKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFycyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5yZXBlYXRlZF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEwKQotICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxNSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMTAsIDE1XSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICAjIFRlc3Qgc2luZ2xlIHJldHJpZXZhbC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTUsIHByb3RvLnJlcGVhdGVkX2ludDMyWy0xXSkKLSAgICAjIFRlc3Qgb3V0LW9mLWJvdW5kcyBpbmRpY2VzLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAxMjM0KQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAtMTIzNCkKLSAgICAjIFRlc3QgaW5jb3JyZWN0IHR5cGVzIHBhc3NlZCB0byBfX2dldGl0ZW1fXy4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCAnZm9vJykKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZ2V0aXRlbV9fLCBOb25lKQotCi0gICAgIyBUZXN0IHNpbmdsZSBhc3NpZ25tZW50LgotICAgIHByb3RvLnJlcGVhdGVkX2ludDMyWzFdID0gMjAKLSAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCBpbnNlcnRpb24uCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuaW5zZXJ0KDEsIDI1KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDI1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCBzbGljZSByZXRyaWV2YWwuCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMwKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzI1LCAyMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMlsxOjRdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDI1LCAyMCwgMTUsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbOl0pCi0KLSAgICAjIFRlc3Qgc2xpY2UgYXNzaWdubWVudCB3aXRoIGFuIGl0ZXJhdG9yCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMTo0XSA9IChpIGZvciBpIGluIHJhbmdlKDMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDAsIDEsIDIsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICAjIFRlc3Qgc2xpY2UgYXNzaWdubWVudC4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMlsxOjRdID0gWzM1LCA0MCwgNDVdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDQwLCA0NSwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCB0aGF0IHdlIGNhbiB1c2UgdGhlIGZpZWxkIGFzIGFuIGl0ZXJhdG9yLgotICAgIHJlc3VsdCA9IFtdCi0gICAgZm9yIGkgaW4gcHJvdG8ucmVwZWF0ZWRfaW50MzI6Ci0gICAgICByZXN1bHQuYXBwZW5kKGkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDQwLCA0NSwgMzBdLCByZXN1bHQpCi0KLSAgICAjIFRlc3Qgc2luZ2xlIGRlbGV0aW9uLgotICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlsyXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDM1LCA0NSwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCBzbGljZSBkZWxldGlvbi4KLSAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMjpdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCBleHRlbmRpbmcuCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKFszLCAxM10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDMsIDEzXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICAjIFRlc3QgY2xlYXJpbmcuCi0gICAgcHJvdG8uQ2xlYXJGaWVsZCgncmVwZWF0ZWRfaW50MzInKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0pCi0gICAgIyBUZXN0IGFzc2lnbm1lbnQgdG8gYSBuZWdhdGl2ZSBpbmRleC4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0gPSAyCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0pCi0KLSAgICAjIFRlc3QgZGVsZXRpb24gYXQgbmVnYXRpdmUgaW5kaWNlcy4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMls6XSA9IFswLCAxLCAyLCAzXQotICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0KLSAgICBzZWxmLmFzc2VydEVxdWFsKFswLCAxLCAyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTJdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbMCwgMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQotCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19kZWxpdGVtX18sIC0zKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZGVsaXRlbV9fLCAzMDApCi0KLSAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTI6LTFdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQotCi0gICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWzEwMDoxMDAwMF0KLSAgICBzZWxmLmFzc2VydEVxdWFsKFsyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNSZW1vdmUoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQotICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBwcm90by5yZXBlYXRlZF9pbnQzMlsxXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzJdKQotCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIucmVtb3ZlKDUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0pCi0KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoMTApCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCi0KLSAgICAjIFJlbW92ZSBhIG5vbi1leGlzdGVudCBlbGVtZW50LgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLnJlbW92ZSwgMTIzKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCi0gICAgbTAgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0xID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRJc0luc3RhbmNlKG0wLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpCi0KLSAgICAjIFRlc3Qgb3V0LW9mLWJvdW5kcyBpbmRpY2VzLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAotICAgICAgICAgICAgICAgICAgICAgIDEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuX19nZXRpdGVtX18sCi0gICAgICAgICAgICAgICAgICAgICAgLTEyMzQpCi0KLSAgICAjIFRlc3QgaW5jb3JyZWN0IHR5cGVzIHBhc3NlZCB0byBfX2dldGl0ZW1fXy4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAotICAgICAgICAgICAgICAgICAgICAgICdmb28nKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuX19nZXRpdGVtX18sCi0gICAgICAgICAgICAgICAgICAgICAgTm9uZSkKLQotICAgICMgVGVzdCBzbGljZSByZXRyaWV2YWwuCi0gICAgbTIgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0zID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBtNCA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAotICAgICAgICBbbTEsIG0yLCBtM10sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzE6NF0pCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAotICAgICAgICBbbTAsIG0xLCBtMiwgbTMsIG00XSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbOl0pCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAotICAgICAgICBbbTAsIG0xXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbOjJdKQotICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKLSAgICAgICAgW20yLCBtMywgbTRdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyOl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbTAsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdKQotICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKLSAgICAgICAgW20wXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbOjFdKQotCi0gICAgIyBUZXN0IHRoYXQgd2UgY2FuIHVzZSB0aGUgZmllbGQgYXMgYW4gaXRlcmF0b3IuCi0gICAgcmVzdWx0ID0gW10KLSAgICBmb3IgaSBpbiBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZToKLSAgICAgIHJlc3VsdC5hcHBlbmQoaSkKLSAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoW20wLCBtMSwgbTIsIG0zLCBtNF0sIHJlc3VsdCkKLQotICAgICMgVGVzdCBzaW5nbGUgZGVsZXRpb24uCi0gICAgZGVsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTEsIG0zLCBtNF0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotCi0gICAgIyBUZXN0IHNsaWNlIGRlbGV0aW9uLgotICAgIGRlbCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyOl0KLSAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoW20wLCBtMV0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotCi0gICAgIyBUZXN0IGV4dGVuZGluZy4KLSAgICBuMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0xKQotICAgIG4yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKGJiPTIpCi0gICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuZXh0ZW5kKFtuMSxuMl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzNdKQotCi0gICAgIyBUZXN0IGNsZWFyaW5nLgotICAgIHByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlJykKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLQotICAgICMgVGVzdCBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudCB3aGlsZSBhZGRpbmcgaXQuCi0gICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKGJiPTIzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYikKLQotICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlUmVtb3ZlKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCi0gICAgbTAgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgICMgTmVlZCB0byBzZXQgc29tZSBkaWZmZXJlbnRpYXRpbmcgdmFyaWFibGUgc28gbTAgIT0gbTEgIT0gbTI6Ci0gICAgbTAuYmIgPSBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCi0gICAgbTEgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0xLmJiID0gbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtMCAhPSBtMSkKLSAgICBtMiA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgbTIuYmIgPSBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTEsIG0yXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCi0gICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UucmVtb3ZlKG0wKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG0xLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG0yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxXSkKLQotICAgICMgUmVtb3ZpbmcgbTAgYWdhaW4gb3IgcmVtb3ZpbmcgTm9uZSBzaG91bGQgcmFpc2UgZXJyb3IKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5yZW1vdmUsIG0wKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnJlbW92ZSwgTm9uZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCi0KLSAgICBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5yZW1vdmUobTIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobTEsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdKQotCi0gIGRlZiB0ZXN0SGFuZFdyaXR0ZW5SZWZsZWN0aW9uKHNlbGYpOgotICAgICMgSGFuZCB3cml0dGVuIGV4dGVuc2lvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGJ5IHRoZSBwdXJlLVB5dGhvbgotICAgICMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KLSAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgotICAgICAgcmV0dXJuCi0KLSAgICBGaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcgotICAgIGZvb19maWVsZF9kZXNjcmlwdG9yID0gRmllbGREZXNjcmlwdG9yKAotICAgICAgICBuYW1lPSdmb29fZmllbGQnLCBmdWxsX25hbWU9J015UHJvdG8uZm9vX2ZpZWxkJywKLSAgICAgICAgaW5kZXg9MCwgbnVtYmVyPTEsIHR5cGU9RmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQsCi0gICAgICAgIGNwcF90eXBlPUZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0lOVDY0LAotICAgICAgICBsYWJlbD1GaWVsZERlc2NyaXB0b3IuTEFCRUxfT1BUSU9OQUwsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwKLSAgICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgICAgb3B0aW9ucz1kZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMoKSkKLSAgICBteWRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gICAgICAgIG5hbWU9J015UHJvdG8nLCBmdWxsX25hbWU9J015UHJvdG8nLCBmaWxlbmFtZT0naWdub3JlZCcsCi0gICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBuZXN0ZWRfdHlwZXM9W10sIGVudW1fdHlwZXM9W10sCi0gICAgICAgIGZpZWxkcz1bZm9vX2ZpZWxkX2Rlc2NyaXB0b3JdLCBleHRlbnNpb25zPVtdLAotICAgICAgICBvcHRpb25zPWRlc2NyaXB0b3JfcGIyLk1lc3NhZ2VPcHRpb25zKCkpCi0gICAgY2xhc3MgTXlQcm90b0NsYXNzKHNpeC53aXRoX21ldGFjbGFzcyhyZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUsIG1lc3NhZ2UuTWVzc2FnZSkpOgotICAgICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgotICAgIG15cHJvdG9faW5zdGFuY2UgPSBNeVByb3RvQ2xhc3MoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBteXByb3RvX2luc3RhbmNlLkhhc0ZpZWxkKCdmb29fZmllbGQnKSkKLSAgICBteXByb3RvX2luc3RhbmNlLmZvb19maWVsZCA9IDIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG15cHJvdG9faW5zdGFuY2UuSGFzRmllbGQoJ2Zvb19maWVsZCcpKQotCi0gIGRlZiB0ZXN0RGVzY3JpcHRvclByb3RvU3VwcG9ydChzZWxmKToKLSAgICAjIEhhbmQgd3JpdHRlbiBkZXNjcmlwdG9ycy9yZWZsZWN0aW9uIGFyZSBvbmx5IHN1cHBvcnRlZCBieSB0aGUgcHVyZS1QeXRob24KLSAgICAjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCi0gICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKLSAgICAgIHJldHVybgotCi0gICAgZGVmIEFkZERlc2NyaXB0b3JGaWVsZChwcm90bywgZmllbGRfbmFtZSwgZmllbGRfdHlwZSk6Ci0gICAgICBBZGREZXNjcmlwdG9yRmllbGQuZmllbGRfaW5kZXggKz0gMQotICAgICAgbmV3X2ZpZWxkID0gcHJvdG8uZmllbGQuYWRkKCkKLSAgICAgIG5ld19maWVsZC5uYW1lID0gZmllbGRfbmFtZQotICAgICAgbmV3X2ZpZWxkLnR5cGUgPSBmaWVsZF90eXBlCi0gICAgICBuZXdfZmllbGQubnVtYmVyID0gQWRkRGVzY3JpcHRvckZpZWxkLmZpZWxkX2luZGV4Ci0gICAgICBuZXdfZmllbGQubGFiZWwgPSBkZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90by5MQUJFTF9PUFRJT05BTAotCi0gICAgQWRkRGVzY3JpcHRvckZpZWxkLmZpZWxkX2luZGV4ID0gMAotCi0gICAgZGVzY19wcm90byA9IGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bygpCi0gICAgZGVzY19wcm90by5uYW1lID0gJ0NhcicKLSAgICBmZHAgPSBkZXNjcmlwdG9yX3BiMi5GaWVsZERlc2NyaXB0b3JQcm90bwotICAgIEFkZERlc2NyaXB0b3JGaWVsZChkZXNjX3Byb3RvLCAnbmFtZScsIGZkcC5UWVBFX1NUUklORykKLSAgICBBZGREZXNjcmlwdG9yRmllbGQoZGVzY19wcm90bywgJ3llYXInLCBmZHAuVFlQRV9JTlQ2NCkKLSAgICBBZGREZXNjcmlwdG9yRmllbGQoZGVzY19wcm90bywgJ2F1dG9tYXRpYycsIGZkcC5UWVBFX0JPT0wpCi0gICAgQWRkRGVzY3JpcHRvckZpZWxkKGRlc2NfcHJvdG8sICdwcmljZScsIGZkcC5UWVBFX0RPVUJMRSkKLSAgICAjIEFkZCBhIHJlcGVhdGVkIGZpZWxkCi0gICAgQWRkRGVzY3JpcHRvckZpZWxkLmZpZWxkX2luZGV4ICs9IDEKLSAgICBuZXdfZmllbGQgPSBkZXNjX3Byb3RvLmZpZWxkLmFkZCgpCi0gICAgbmV3X2ZpZWxkLm5hbWUgPSAnb3duZXJzJwotICAgIG5ld19maWVsZC50eXBlID0gZmRwLlRZUEVfU1RSSU5HCi0gICAgbmV3X2ZpZWxkLm51bWJlciA9IEFkZERlc2NyaXB0b3JGaWVsZC5maWVsZF9pbmRleAotICAgIG5ld19maWVsZC5sYWJlbCA9IGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLkxBQkVMX1JFUEVBVEVECi0KLSAgICBkZXNjID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcihkZXNjX3Byb3RvKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSgnbmFtZScgaW4gZGVzYy5maWVsZHNfYnlfbmFtZSkKLSAgICBzZWxmLmFzc2VydFRydWUoJ3llYXInIGluIGRlc2MuZmllbGRzX2J5X25hbWUpCi0gICAgc2VsZi5hc3NlcnRUcnVlKCdhdXRvbWF0aWMnIGluIGRlc2MuZmllbGRzX2J5X25hbWUpCi0gICAgc2VsZi5hc3NlcnRUcnVlKCdwcmljZScgaW4gZGVzYy5maWVsZHNfYnlfbmFtZSkKLSAgICBzZWxmLmFzc2VydFRydWUoJ293bmVycycgaW4gZGVzYy5maWVsZHNfYnlfbmFtZSkKLQotICAgIGNsYXNzIENhck1lc3NhZ2Uoc2l4LndpdGhfbWV0YWNsYXNzKHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSwgbWVzc2FnZS5NZXNzYWdlKSk6Ci0gICAgICBERVNDUklQVE9SID0gZGVzYwotCi0gICAgcHJpdXMgPSBDYXJNZXNzYWdlKCkKLSAgICBwcml1cy5uYW1lID0gJ3ByaXVzJwotICAgIHByaXVzLnllYXIgPSAyMDEwCi0gICAgcHJpdXMuYXV0b21hdGljID0gVHJ1ZQotICAgIHByaXVzLnByaWNlID0gMjUxMzQuNzUKLSAgICBwcml1cy5vd25lcnMuZXh0ZW5kKFsnYm9iJywgJ3N1c2FuJ10pCi0KLSAgICBzZXJpYWxpemVkX3ByaXVzID0gcHJpdXMuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIG5ld19wcml1cyA9IHJlZmxlY3Rpb24uUGFyc2VNZXNzYWdlKGRlc2MsIHNlcmlhbGl6ZWRfcHJpdXMpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5ld19wcml1cyBpcyBub3QgcHJpdXMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcml1cywgbmV3X3ByaXVzKQotCi0gICAgIyB0aGVzZSBhcmUgdW5uZWNlc3NhcnkgYXNzdW1pbmcgbWVzc2FnZSBlcXVhbGl0eSB3b3JrcyBhcyBhZHZlcnRpc2VkIGJ1dAotICAgICMgZXhwbGljaXRseSBjaGVjayB0byBiZSBzYWZlIHNpbmNlIHdlJ3JlIG11Y2tpbmcgYWJvdXQgaW4gbWV0YWNsYXNzIGZvbwotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJpdXMubmFtZSwgbmV3X3ByaXVzLm5hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcml1cy55ZWFyLCBuZXdfcHJpdXMueWVhcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLmF1dG9tYXRpYywgbmV3X3ByaXVzLmF1dG9tYXRpYykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByaXVzLnByaWNlLCBuZXdfcHJpdXMucHJpY2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcml1cy5vd25lcnMsIG5ld19wcml1cy5vd25lcnMpCi0KLSAgZGVmIHRlc3RUb3BMZXZlbEV4dGVuc2lvbnNGb3JPcHRpb25hbFNjYWxhcihzZWxmKToKLSAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCi0gICAgIyBBcyB3aXRoIG5vcm1hbCBzY2FsYXIgZmllbGRzLCBqdXN0IGRvaW5nIGEgcmVhZCBkb2Vzbid0IGFjdHVhbGx5IHNldCB0aGUKLSAgICAjICJoYXMiIGJpdC4KLSAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgICMgQWN0dWFsbHkgc2V0IHRoZSB0aGluZy4KLSAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAyMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKLSAgICBzZWxmLmFzc2VydFRydWUoZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCi0gICAgIyBFbnN1cmUgdGhhdCBjbGVhcmluZyB3b3JrcyBhcyB3ZWxsLgotICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotCi0gIGRlZiB0ZXN0VG9wTGV2ZWxFeHRlbnNpb25zRm9yUmVwZWF0ZWRTY2FsYXIoc2VsZik6Ci0gICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKLSAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYXBwZW5kKCdmb28nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydmb28nXSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQotICAgIHN0cmluZ19saXN0ID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCi0gICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHN0cmluZ19saXN0IGlzIG5vdCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCi0gICAgIyBTaG91bGRuJ3QgYmUgYWxsb3dlZCB0byBkbyBFeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAnYScKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLCAnYScpCi0KLSAgZGVmIHRlc3RUb3BMZXZlbEV4dGVuc2lvbnNGb3JPcHRpb25hbE1lc3NhZ2Uoc2VsZik6Ci0gICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5jKQotICAgICMgQXMgd2l0aCBub3JtYWwgKG5vbi1leHRlbnNpb24pIGZpZWxkcywgbWVyZWx5IHJlYWRpbmcgZnJvbSB0aGUKLSAgICAjIHRoaW5nIHNob3VsZG4ndCBzZXQgdGhlICJoYXMiIGJpdC4KLSAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5jID0gMjMKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYykKLSAgICBzZWxmLmFzc2VydFRydWUoZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCi0gICAgIyBTYXZlIGEgcmVmZXJlbmNlIGhlcmUuCi0gICAgZm9yZWlnbl9tZXNzYWdlID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCi0gICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShmb3JlaWduX21lc3NhZ2UgaXMgbm90IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKLSAgICAjIFNldHRpbmcgYSBmaWVsZCBvbiBmb3JlaWduX21lc3NhZ2Ugbm93IHNob3VsZG4ndCBzZXQKLSAgICAjIGFueSAiaGFzIiBiaXRzIG9uIGV4dGVuZGVlX3Byb3RvLgotICAgIGZvcmVpZ25fbWVzc2FnZS5jID0gNDIKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBmb3JlaWduX21lc3NhZ2UuYykKLSAgICBzZWxmLmFzc2VydFRydWUoZm9yZWlnbl9tZXNzYWdlLkhhc0ZpZWxkKCdjJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLSAgICAjIFNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIGRvIEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9ICdhJwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sICdhJykKLQotICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0ZvclJlcGVhdGVkTWVzc2FnZShzZWxmKToKLSAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKLSAgICBncm91cCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hZGQoKQotICAgIGdyb3VwLmEgPSAyMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXVswXS5hKQotICAgIGdyb3VwLmEgPSA0MgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDIsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXVswXS5hKQotICAgIGdyb3VwX2xpc3QgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KLSAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4oZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKLSAgICBzZWxmLmFzc2VydFRydWUoZ3JvdXBfbGlzdCBpcyBub3QgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQotICAgICMgU2hvdWxkbid0IGJlIGFsbG93ZWQgdG8gZG8gRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gJ2EnCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLAotICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwgJ2EnKQotCi0gIGRlZiB0ZXN0TmVzdGVkRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBleHRlbmRlZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUKLQotICAgICMgV2UganVzdCB0ZXN0IHRoZSBub24tcmVwZWF0ZWQgY2FzZS4KLSAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgIHJlcXVpcmVkID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZXF1aXJlZC5hKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCi0gICAgcmVxdWlyZWQuYSA9IDIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmEpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICBzZWxmLmFzc2VydFRydWUocmVxdWlyZWQgaXMgbm90IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotCi0gIGRlZiB0ZXN0UmVnaXN0ZXJlZEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRUcnVlKCdwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24nIGluCi0gICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucy5fZXh0ZW5zaW9uc19ieV9uYW1lKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSgxIGluIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucy5fZXh0ZW5zaW9uc19ieV9udW1iZXIpCi0gICAgIyBNYWtlIHN1cmUgZXh0ZW5zaW9ucyBoYXZlbid0IGJlZW4gcmVnaXN0ZXJlZCBpbnRvIHR5cGVzIHRoYXQgc2hvdWxkbid0Ci0gICAgIyBoYXZlIGFueS4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbih1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLl9leHRlbnNpb25zX2J5X25hbWUpKQotCi0gICMgSWYgbWVzc2FnZSBBIGRpcmVjdGx5IGNvbnRhaW5zIG1lc3NhZ2UgQiwgYW5kCi0gICMgYS5IYXNGaWVsZCgnYicpIGlzIGN1cnJlbnRseSBGYWxzZSwgdGhlbiBtdXRhdGluZyBhbnkKLSAgIyBleHRlbnNpb24gaW4gQiBzaG91bGQgY2hhbmdlIGEuSGFzRmllbGQoJ2InKSB0byBUcnVlCi0gICMgKGFuZCBzbyBvbiB1cCB0aGUgb2JqZWN0IHRyZWUpLgotICBkZWYgdGVzdEhhc0JpdHNGb3JBbmNlc3RvcnNPZkV4dGVuZGVkTWVzc2FnZShzZWxmKToKLSAgICAjIE9wdGlvbmFsIHNjYWxhciBleHRlbnNpb24uCi0gICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb25dKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLSAgICB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCi0gICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbl0gPSAyMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKLSAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uXSkKLSAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLQotICAgICMgUmVwZWF0ZWQgc2NhbGFyIGV4dGVuc2lvbi4KLSAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbXSwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb25dKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLSAgICB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCi0gICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfaW50X2V4dGVuc2lvbl0uYXBwZW5kKDIzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzIzXSwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb25dKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotCi0gICAgIyBPcHRpb25hbCBtZXNzYWdlIGV4dGVuc2lvbi4KLSAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCi0gICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb25dLmZvcmVpZ25fbWVzc2FnZV9pbnQpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotICAgIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKLSAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbl0uZm9yZWlnbl9tZXNzYWdlX2ludCA9IDIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX21lc3NhZ2VfZXh0ZW5zaW9uXS5mb3JlaWduX21lc3NhZ2VfaW50KQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotCi0gICAgIyBSZXBlYXRlZCBtZXNzYWdlIGV4dGVuc2lvbi4KLSAgICB0b3BsZXZlbCA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuVG9wTGV2ZWxNZXNzYWdlKCkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4odG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotICAgIGZvcmVpZ24gPSB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCi0gICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmb3JlaWduLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCi0gICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfbWVzc2FnZV9leHRlbnNpb25dWzBdKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotCi0gIGRlZiB0ZXN0RGlzY29ubmVjdGlvbkFmdGVyQ2xlYXJpbmdFbXB0eU1lc3NhZ2Uoc2VsZik6Ci0gICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCi0gICAgZXh0ZW5kZWVfcHJvdG8gPSB0b3BsZXZlbC5zdWJtZXNzYWdlCi0gICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbgotICAgIGV4dGVuc2lvbl9wcm90byA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQotICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICBleHRlbnNpb25fcHJvdG8uZm9yZWlnbl9tZXNzYWdlX2ludCA9IDIzCi0KLSAgICBzZWxmLmFzc2VydFRydWUoZXh0ZW5zaW9uX3Byb3RvIGlzIG5vdCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCi0KLSAgZGVmIHRlc3RFeHRlbnNpb25GYWlsdXJlTW9kZXMoc2VsZik6Ci0gICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotCi0gICAgIyBUcnkgbm9uLWV4dGVuc2lvbi1oYW5kbGUgYXJndW1lbnRzIHRvIEhhc0V4dGVuc2lvbiwKLSAgICAjIENsZWFyRXh0ZW5zaW9uKCksIGFuZCBFeHRlbnNpb25zW10uLi4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uLCAxMjM0KQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbiwgMTIzNCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX2dldGl0ZW1fXywgMTIzNCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX3NldGl0ZW1fXywgMTIzNCwgNSkKLQotICAgICMgVHJ5IHNvbWV0aGluZyB0aGF0ICppcyogYW4gZXh0ZW5zaW9uIGhhbmRsZSwganVzdCBub3QgZm9yCi0gICAgIyB0aGlzIG1lc3NhZ2UuLi4KLSAgICBmb3IgdW5rbm93bl9oYW5kbGUgaW4gKG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKToKLSAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2hhbmRsZSkKLSAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25faGFuZGxlKQotICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMuX19nZXRpdGVtX18sCi0gICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2hhbmRsZSkKLSAgICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLl9fc2V0aXRlbV9fLAotICAgICAgICAgICAgICAgICAgICAgICAgdW5rbm93bl9oYW5kbGUsIDUpCi0KLSAgICAjIFRyeSBjYWxsIEhhc0V4dGVuc2lvbigpIHdpdGggYSB2YWxpZCBoYW5kbGUsIGJ1dCBmb3IgYQotICAgICMgKnJlcGVhdGVkKiBmaWVsZC4gIChKdXN0IGFzIHdpdGggbm9uLWV4dGVuc2lvbiByZXBlYXRlZAotICAgICMgZmllbGRzLCBIYXMqKCkgaXNuJ3Qgc3VwcG9ydGVkIGZvciBleHRlbnNpb24gcmVwZWF0ZWQgZmllbGRzKS4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKQotCi0gIGRlZiB0ZXN0U3RhdGljUGFyc2VGcm9tKHNlbGYpOgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMocHJvdG8xKQotCi0gICAgc3RyaW5nMSA9IHByb3RvMS5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5Gcm9tU3RyaW5nKHN0cmluZzEpCi0KLSAgICAjIE1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvMiwgcHJvdG8xKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tU2luZ3VsYXJGaWVsZChzZWxmKToKLSAgICAjIFRlc3QgbWVyZ2Ugd2l0aCBqdXN0IGEgc2luZ3VsYXIgZmllbGQuCi0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8xLm9wdGlvbmFsX2ludDMyID0gMQotCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgIyBUaGlzIHNob3VsZG4ndCBnZXQgb3ZlcndyaXR0ZW4uCi0gICAgcHJvdG8yLm9wdGlvbmFsX3N0cmluZyA9ICd2YWx1ZScKLQotICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ3ZhbHVlJywgcHJvdG8yLm9wdGlvbmFsX3N0cmluZykKLQotICBkZWYgdGVzdE1lcmdlRnJvbVJlcGVhdGVkRmllbGQoc2VsZik6Ci0gICAgIyBUZXN0IG1lcmdlIHdpdGgganVzdCBhIHJlcGVhdGVkIGZpZWxkLgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKLSAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDIpCi0KLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzIucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDApCi0gICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlswXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlsxXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlsyXSkKLQotICBkZWYgdGVzdE1lcmdlRnJvbU9wdGlvbmFsR3JvdXAoc2VsZik6Ci0gICAgIyBUZXN0IG1lcmdlIHdpdGggYW4gb3B0aW9uYWwgZ3JvdXAuCi0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8xLm9wdGlvbmFsZ3JvdXAuYSA9IDEyCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMiwgcHJvdG8yLm9wdGlvbmFsZ3JvdXAuYSkKLQotICBkZWYgdGVzdE1lcmdlRnJvbVJlcGVhdGVkTmVzdGVkTWVzc2FnZShzZWxmKToKLSAgICAjIFRlc3QgbWVyZ2Ugd2l0aCBhIHJlcGVhdGVkIG5lc3RlZCBtZXNzYWdlLgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG0gPSBwcm90bzEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBtLmJiID0gMTIzCi0gICAgbSA9IHByb3RvMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0uYmIgPSAzMjEKLQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG0gPSBwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBtLmJiID0gOTk5Ci0gICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg5OTksIHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgcHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzIxLCBwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMl0uYmIpCi0KLSAgICBwcm90bzMgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tKHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDk5OSwgcHJvdG8zLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzMjEsIHByb3RvMy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXS5iYikKLQotICBkZWYgdGVzdE1lcmdlRnJvbUFsbEZpZWxkcyhzZWxmKToKLSAgICAjIFdpdGggYWxsIGZpZWxkcyBzZXQuCi0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bzEpCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCi0KLSAgICAjIE1lc3NhZ2VzIHNob3VsZCBiZSBlcXVhbC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvMiwgcHJvdG8xKQotCi0gICAgIyBTZXJpYWxpemVkIHN0cmluZyBzaG91bGQgYmUgZXF1YWwgdG9vLgotICAgIHN0cmluZzEgPSBwcm90bzEuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHN0cmluZzIgPSBwcm90bzIuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3RyaW5nMSwgc3RyaW5nMikKLQotICBkZWYgdGVzdE1lcmdlRnJvbUV4dGVuc2lvbnNTaW5ndWxhcihzZWxmKToKLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHByb3RvMS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dID0gMQotCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAxLCBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSkKLQotICBkZWYgdGVzdE1lcmdlRnJvbUV4dGVuc2lvbnNSZXBlYXRlZChzZWxmKToKLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHByb3RvMS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dLmFwcGVuZCgxKQotICAgIHByb3RvMS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyKQotCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMCkKLSAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAzLCBsZW4ocHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDAsIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDEsIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dWzFdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDIsIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dWzJdKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tRXh0ZW5zaW9uc05lc3RlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBleHQxID0gcHJvdG8xLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dCi0gICAgbSA9IGV4dDEuYWRkKCkKLSAgICBtLmJiID0gMjIyCi0gICAgbSA9IGV4dDEuYWRkKCkKLSAgICBtLmJiID0gMzMzCi0KLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGV4dDIgPSBwcm90bzIuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0KLSAgICBtID0gZXh0Mi5hZGQoKQotICAgIG0uYmIgPSAxMTEKLQotICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQotICAgIGV4dDIgPSBwcm90bzIuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihleHQyKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDExMSwgZXh0MlswXS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIyMiwgZXh0MlsxXS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMzMywgZXh0MlsyXS5iYikKLQotICBkZWYgdGVzdE1lcmdlRnJvbUJ1ZyhzZWxmKToKLSAgICBtZXNzYWdlMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG1lc3NhZ2UyID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICAjIENhdXNlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHRvIGJlIGluc3RhbnRpYXRlZCB3aXRoaW4gbWVzc2FnZTEsIGV2ZW4KLSAgICAjIHRob3VnaCBpdCBpcyBub3QgY29uc2lkZXJlZCB0byBiZSAicHJlc2VudCIuCi0gICAgbWVzc2FnZTEub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKLSAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UxLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotCi0gICAgIyBNZXJnZSBpbnRvIG1lc3NhZ2UyLiAgVGhpcyBzaG91bGQgbm90IGluc3RhbnRpYXRlIHRoZSBmaWVsZCBpcyBtZXNzYWdlMi4KLSAgICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShtZXNzYWdlMi5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKLQotICBkZWYgdGVzdENvcHlGcm9tU2luZ3VsYXJGaWVsZChzZWxmKToKLSAgICAjIFRlc3QgY29weSB3aXRoIGp1c3QgYSBzaW5ndWxhciBmaWVsZC4KLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzEub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgcHJvdG8xLm9wdGlvbmFsX3N0cmluZyA9ICdpbXBvcnRhbnQtdGV4dCcKLQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMi5vcHRpb25hbF9zdHJpbmcgPSAndmFsdWUnCi0KLSAgICBwcm90bzIuQ29weUZyb20ocHJvdG8xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ltcG9ydGFudC10ZXh0JywgcHJvdG8yLm9wdGlvbmFsX3N0cmluZykKLQotICBkZWYgdGVzdENvcHlGcm9tUmVwZWF0ZWRGaWVsZChzZWxmKToKLSAgICAjIFRlc3QgY29weSB3aXRoIGEgcmVwZWF0ZWQgZmllbGQuCi0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKLQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMi5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMCkKLSAgICBwcm90bzIuQ29weUZyb20ocHJvdG8xKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIucmVwZWF0ZWRfaW50MzJbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzIucmVwZWF0ZWRfaW50MzJbMV0pCi0KLSAgZGVmIHRlc3RDb3B5RnJvbUFsbEZpZWxkcyhzZWxmKToKLSAgICAjIFdpdGggYWxsIGZpZWxkcyBzZXQuCi0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bzEpCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8yLkNvcHlGcm9tKHByb3RvMSkKLQotICAgICMgTWVzc2FnZXMgc2hvdWxkIGJlIGVxdWFsLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8yLCBwcm90bzEpCi0KLSAgICAjIFNlcmlhbGl6ZWQgc3RyaW5nIHNob3VsZCBiZSBlcXVhbCB0b28uCi0gICAgc3RyaW5nMSA9IHByb3RvMS5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc3RyaW5nMiA9IHByb3RvMi5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcxLCBzdHJpbmcyKQotCi0gIGRlZiB0ZXN0Q29weUZyb21TZWxmKHNlbGYpOgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKLSAgICBwcm90bzEub3B0aW9uYWxfaW50MzIgPSAyCi0gICAgcHJvdG8xLm9wdGlvbmFsX3N0cmluZyA9ICdpbXBvcnRhbnQtdGV4dCcKLQotICAgIHByb3RvMS5Db3B5RnJvbShwcm90bzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzEucmVwZWF0ZWRfaW50MzJbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzEub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnaW1wb3J0YW50LXRleHQnLCBwcm90bzEub3B0aW9uYWxfc3RyaW5nKQotCi0gIGRlZiB0ZXN0Q29weUZyb21CYWRUeXBlKHNlbGYpOgotICAgICMgVGhlIHB5dGhvbiBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IHJhaXNlIGFuIGV4Y2VwdGlvbiBpbiB0aGlzCi0gICAgIyBjYXNlLiBJbiB0aGVvcnkgaXQgc2hvdWxkLgotICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6Ci0gICAgICByZXR1cm4KLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8xLkNvcHlGcm9tLCBwcm90bzIpCi0KLSAgZGVmIHRlc3REZWVwQ29weShzZWxmKToKLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzEub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgcHJvdG8yID0gY29weS5kZWVwY29weShwcm90bzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIub3B0aW9uYWxfaW50MzIpCi0KLSAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDIpCi0gICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgzKQotICAgIGNvbnRhaW5lciA9IGNvcHkuZGVlcGNvcHkocHJvdG8xLnJlcGVhdGVkX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzIsIDNdLCBjb250YWluZXIpCi0KLSAgICAjIFRPRE8oYW51cmFhZyk6IEltcGxlbWVudCBkZWVwY29weSBmb3IgcmVwZWF0ZWQgY29tcG9zaXRlIC8gZXh0ZW5zaW9uIGRpY3QKLQotICBkZWYgdGVzdENsZWFyKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgIyBDKysgaW1wbGVtZW50YXRpb24gZG9lcyBub3Qgc3VwcG9ydCBsYXp5IGZpZWxkcyByaWdodCBub3cgc28gbGVhdmUgaXQKLSAgICAjIG91dCBmb3Igbm93LgotICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ3B5dGhvbic6Ci0gICAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvKQotICAgIGVsc2U6Ci0gICAgICB0ZXN0X3V0aWwuU2V0QWxsTm9uTGF6eUZpZWxkcyhwcm90bykKLSAgICAjIENsZWFyIHRoZSBtZXNzYWdlLgotICAgIHByb3RvLkNsZWFyKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIDApCi0gICAgZW1wdHlfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLCBlbXB0eV9wcm90bykKLQotICAgICMgVGVzdCBpZiBleHRlbnNpb25zIHdoaWNoIHdlcmUgc2V0IGFyZSBjbGVhcmVkLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhwcm90bykKLSAgICAjIENsZWFyIHRoZSBtZXNzYWdlLgotICAgIHByb3RvLkNsZWFyKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIDApCi0gICAgZW1wdHlfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8sIGVtcHR5X3Byb3RvKQotCi0gIGRlZiB0ZXN0RGlzY29ubmVjdGluZ0JlZm9yZUNsZWFyKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbmVzdGVkID0gcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKLSAgICBwcm90by5DbGVhcigpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5lc3RlZCBpcyBub3QgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UpCi0gICAgbmVzdGVkLmJiID0gMjMKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCi0gICAgbmVzdGVkLmJiID0gNQotICAgIGZvcmVpZ24gPSBwcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UKLSAgICBmb3JlaWduLmMgPSA2Ci0KLSAgICBwcm90by5DbGVhcigpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5lc3RlZCBpcyBub3QgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGZvcmVpZ24gaXMgbm90IHByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIG5lc3RlZC5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDYsIGZvcmVpZ24uYykKLSAgICBuZXN0ZWQuYmIgPSAxNQotICAgIGZvcmVpZ24uYyA9IDE2Ci0gICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMpCi0KLSAgZGVmIHRlc3RPbmVPZihzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9uZW9mX3VpbnQzMiA9IDEwCi0gICAgcHJvdG8ub25lb2ZfbmVzdGVkX21lc3NhZ2UuYmIgPSAxMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTEsIHByb3RvLm9uZW9mX25lc3RlZF9tZXNzYWdlLmJiKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29uZW9mX3VpbnQzMicpKQotICAgIG5lc3RlZCA9IHByb3RvLm9uZW9mX25lc3RlZF9tZXNzYWdlCi0gICAgcHJvdG8ub25lb2Zfc3RyaW5nID0gJ2FiYycKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdhYmMnLCBwcm90by5vbmVvZl9zdHJpbmcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMSwgbmVzdGVkLmJiKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSGFzRmllbGQoJ29uZW9mX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgZGVmIGFzc2VydEluaXRpYWxpemVkKHNlbGYsIHByb3RvKToKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQotICAgICMgTmVpdGhlciBtZXRob2Qgc2hvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbi4KLSAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKLQotICBkZWYgYXNzZXJ0Tm90SW5pdGlhbGl6ZWQoc2VsZiwgcHJvdG8pOgotICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSXNJbml0aWFsaXplZCgpKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRW5jb2RlRXJyb3IsIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKQotICAgICMgIlBhcnRpYWwiIHNlcmlhbGl6YXRpb24gZG9lc24ndCBjYXJlIGlmIG1lc3NhZ2UgaXMgdW5pbml0aWFsaXplZC4KLSAgICBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQotCi0gIGRlZiB0ZXN0SXNJbml0aWFsaXplZChzZWxmKToKLSAgICAjIFRyaXZpYWwgY2FzZXMgLSBhbGwgb3B0aW9uYWwgZmllbGRzIGFuZCBleHRlbnNpb25zLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKLQotICAgICMgVGhlIGNhc2Ugb2YgdW5pbml0aWFsaXplZCByZXF1aXJlZCBmaWVsZHMuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKLSAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvKQotICAgIHByb3RvLmEgPSBwcm90by5iID0gcHJvdG8uYyA9IDIKLSAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQotCi0gICAgIyBUaGUgY2FzZSBvZiB1bmluaXRpYWxpemVkIHN1Ym1lc3NhZ2UuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkRm9yZWlnbigpCi0gICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKLSAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmEgPSAxCi0gICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bykKLSAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmIgPSAwCi0gICAgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5jID0gMAotICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCi0KLSAgICAjIFVuaW5pdGlhbGl6ZWQgcmVwZWF0ZWQgc3VibWVzc2FnZS4KLSAgICBtZXNzYWdlMSA9IHByb3RvLnJlcGVhdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvKQotICAgIG1lc3NhZ2UxLmEgPSBtZXNzYWdlMS5iID0gbWVzc2FnZTEuYyA9IDAKLSAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQotCi0gICAgIyBVbmluaXRpYWxpemVkIHJlcGVhdGVkIGdyb3VwIGluIGFuIGV4dGVuc2lvbi4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5tdWx0aQotICAgIG1lc3NhZ2UxID0gcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmFkZCgpCi0gICAgbWVzc2FnZTIgPSBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYWRkKCkKLSAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvKQotICAgIG1lc3NhZ2UxLmEgPSAxCi0gICAgbWVzc2FnZTEuYiA9IDEKLSAgICBtZXNzYWdlMS5jID0gMQotICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCi0gICAgbWVzc2FnZTIuYSA9IDIKLSAgICBtZXNzYWdlMi5iID0gMgotICAgIG1lc3NhZ2UyLmMgPSAyCi0gICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKLQotICAgICMgVW5pbml0aWFsaXplZCBub25yZXBlYXRlZCBtZXNzYWdlIGluIGFuIGV4dGVuc2lvbi4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5zaW5nbGUKLSAgICBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYSA9IDEKLSAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvKQotICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5iID0gMgotICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5jID0gMwotICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCi0KLSAgICAjIFRyeSBwYXNzaW5nIGFuIGVycm9ycyBsaXN0LgotICAgIGVycm9ycyA9IFtdCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKLSAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLklzSW5pdGlhbGl6ZWQoZXJyb3JzKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGVycm9ycywgWydhJywgJ2InLCAnYyddKQotCi0gIEB1bml0dGVzdC5za2lwSWYoCi0gICAgICBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdjcHAnIG9yIGFwaV9pbXBsZW1lbnRhdGlvbi5WZXJzaW9uKCkgIT0gMiwKLSAgICAgICdFcnJvcnMgYXJlIG9ubHkgYXZhaWxhYmxlIGZyb20gdGhlIG1vc3QgcmVjZW50IEMrKyBpbXBsZW1lbnRhdGlvbi4nKQotICBkZWYgdGVzdEZpbGVEZXNjcmlwdG9yRXJyb3JzKHNlbGYpOgotICAgIGZpbGVfbmFtZSA9ICd0ZXN0X2ZpbGVfZGVzY3JpcHRvcl9lcnJvcnMucHJvdG8nCi0gICAgcGFja2FnZV9uYW1lID0gJ3Rlc3RfZmlsZV9kZXNjcmlwdG9yX2Vycm9ycy5wcm90bycKLSAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKLSAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubmFtZSA9IGZpbGVfbmFtZQotICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5wYWNrYWdlID0gcGFja2FnZV9uYW1lCi0gICAgbTEgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubWVzc2FnZV90eXBlLmFkZCgpCi0gICAgbTEubmFtZSA9ICdtc2cxJwotICAgICMgQ29tcGlsZXMgdGhlIHByb3RvIGludG8gdGhlIEMrKyBkZXNjcmlwdG9yIHBvb2wKLSAgICBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAotICAgICAgICBmaWxlX25hbWUsCi0gICAgICAgIHBhY2thZ2VfbmFtZSwKLSAgICAgICAgc2VyaWFsaXplZF9wYj1maWxlX2Rlc2NyaXB0b3JfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICAjIEFkZCBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gdGhhdCBoYXMgZHVwbGljYXRlIHN5bWJvbHMKLSAgICBhbm90aGVyX2ZpbGVfbmFtZSA9ICdhbm90aGVyX3Rlc3RfZmlsZV9kZXNjcmlwdG9yX2Vycm9ycy5wcm90bycKLSAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubmFtZSA9IGFub3RoZXJfZmlsZV9uYW1lCi0gICAgbTIgPSBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8ubWVzc2FnZV90eXBlLmFkZCgpCi0gICAgbTIubmFtZSA9ICdtc2cyJwotICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yKSBhcyBjbToKLSAgICAgIGRlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoCi0gICAgICAgICAgYW5vdGhlcl9maWxlX25hbWUsCi0gICAgICAgICAgcGFja2FnZV9uYW1lLAotICAgICAgICAgIHNlcmlhbGl6ZWRfcGI9ZmlsZV9kZXNjcmlwdG9yX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cihjbSwgJ2V4Y2VwdGlvbicpLCAnJXMgbm90IHJhaXNlZCcgJQotICAgICAgICAgICAgICAgICAgICAgIGdldGF0dHIoY20uZXhwZWN0ZWQsICdfX25hbWVfXycsIGNtLmV4cGVjdGVkKSkKLSAgICAgIHNlbGYuYXNzZXJ0SW4oJ3Rlc3RfZmlsZV9kZXNjcmlwdG9yX2Vycm9ycy5wcm90bycsIHN0cihjbS5leGNlcHRpb24pKQotICAgICAgIyBFcnJvciBtZXNzYWdlIHdpbGwgc2F5IHNvbWV0aGluZyBhYm91dCB0aGlzIGRlZmluaXRpb24gYmVpbmcgYQotICAgICAgIyBkdXBsaWNhdGUsIHRob3VnaCB3ZSBkb24ndCBjaGVjayB0aGUgbWVzc2FnZSBleGFjdGx5IHRvIGF2b2lkIGEKLSAgICAgICMgZGVwZW5kZW5jeSBvbiB0aGUgQysrIGxvZ2dpbmcgY29kZS4KLSAgICAgIHNlbGYuYXNzZXJ0SW4oJ3Rlc3RfZmlsZV9kZXNjcmlwdG9yX2Vycm9ycy5tc2cxJywgc3RyKGNtLmV4Y2VwdGlvbikpCi0KLSAgZGVmIHRlc3RTdHJpbmdVVEY4RW5jb2Rpbmcoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgICMgQXNzaWdubWVudCBvZiBhIHVuaWNvZGUgb2JqZWN0IHRvIGEgZmllbGQgb2YgdHlwZSAnYnl0ZXMnIGlzIG5vdCBhbGxvd2VkLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2J5dGVzJywgdSd1bmljb2RlIG9iamVjdCcpCi0KLSAgICAjIENoZWNrIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgb2YgcHl0aG9uJ3MgJ3VuaWNvZGUnIHR5cGUuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByb3RvLm9wdGlvbmFsX3N0cmluZyksIHNpeC50ZXh0X3R5cGUpCi0KLSAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSBzaXgudGV4dF90eXBlKCdUZXN0aW5nJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLm9wdGlvbmFsX3N0cmluZywgc3RyKCdUZXN0aW5nJykpCi0KLSAgICAjIEFzc2lnbiBhIHZhbHVlIG9mIHR5cGUgJ3N0cicgd2hpY2ggY2FuIGJlIGVuY29kZWQgaW4gVVRGLTguCi0gICAgcHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gc3RyKCdUZXN0aW5nJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLm9wdGlvbmFsX3N0cmluZywgc2l4LnRleHRfdHlwZSgnVGVzdGluZycpKQotCi0gICAgIyBUcnkgdG8gYXNzaWduIGEgJ2J5dGVzJyBvYmplY3Qgd2hpY2ggY29udGFpbnMgbm9uLVVURi04LgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9zdHJpbmcnLCBiJ2FceDgwYScpCi0gICAgIyBObyBleGNlcHRpb246IEFzc2lnbiBhbHJlYWR5IGVuY29kZWQgVVRGLTggYnl0ZXMgdG8gYSBzdHJpbmcgZmllbGQuCi0gICAgdXRmOF9ieXRlcyA9IHUn0KLQtdGB0YInLmVuY29kZSgndXRmLTgnKQotICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9IHV0ZjhfYnl0ZXMKLSAgICAjIE5vIGV4Y2VwdGlvbjogQXNzaWduIHRoZSBhIG5vbi1hc2NpaSB1bmljb2RlIG9iamVjdC4KLSAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSB1J9Ci0LXRgdGCJwotICAgICMgTm8gZXhjZXB0aW9uIHRocm93biAobm9ybWFsIHN0ciBhc3NpZ25tZW50IGNvbnRhaW5pbmcgQVNDSUkpLgotICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9ICdhYmMnCi0KLSAgZGVmIHRlc3RTdHJpbmdVVEY4U2VyaWFsaXphdGlvbihzZWxmKToKLSAgICBwcm90byA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0KCkKLSAgICBleHRlbnNpb25fbWVzc2FnZSA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMgotICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbl9tZXNzYWdlLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotCi0gICAgdGVzdF91dGY4ID0gdSfQotC10YHRgicKLSAgICB0ZXN0X3V0ZjhfYnl0ZXMgPSB0ZXN0X3V0ZjguZW5jb2RlKCd1dGYtOCcpCi0KLSAgICAjICdUZXN0JyBpbiBhbm90aGVyIGxhbmd1YWdlLCB1c2luZyBVVEYtOCBjaGFyc2V0LgotICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5zdHIgPSB0ZXN0X3V0ZjgKLQotICAgICMgU2VyaWFsaXplIHVzaW5nIHRoZSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0ICh0aGlzIGlzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAjIC5wcm90byBmaWxlKS4KLSAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgIyBDaGVjayBieXRlIHNpemUuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCi0KLSAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKLSAgICBieXRlc19yZWFkID0gcmF3Lk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcmlhbGl6ZWQpLCBieXRlc19yZWFkKQotCi0gICAgbWVzc2FnZTIgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIoKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocmF3Lml0ZW0pKQotICAgICMgQ2hlY2sgdGhhdCB0aGUgdHlwZV9pZCBpcyB0aGUgc2FtZSBhcyB0aGUgdGFnIElEIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgICBzZWxmLmFzc2VydEVxdWFsKHJhdy5pdGVtWzBdLnR5cGVfaWQsIDk4NDE4NjM0KQotCi0gICAgIyBDaGVjayB0aGUgYWN0dWFsIGJ5dGVzIG9uIHRoZSB3aXJlLgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShyYXcuaXRlbVswXS5tZXNzYWdlLmVuZHN3aXRoKHRlc3RfdXRmOF9ieXRlcykpCi0gICAgYnl0ZXNfcmVhZCA9IG1lc3NhZ2UyLk1lcmdlRnJvbVN0cmluZyhyYXcuaXRlbVswXS5tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHJhdy5pdGVtWzBdLm1lc3NhZ2UpLCBieXRlc19yZWFkKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKG1lc3NhZ2UyLnN0ciksIHNpeC50ZXh0X3R5cGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlMi5zdHIsIHRlc3RfdXRmOCkKLQotICAgICMgVGhlIHB1cmUgUHl0aG9uIEFQSSB0aHJvd3MgYW4gZXhjZXB0aW9uIG9uIE1lcmdlRnJvbVN0cmluZygpLAotICAgICMgaWYgYW55IG9mIHRoZSBzdHJpbmcgZmllbGRzIG9mIHRoZSBtZXNzYWdlIGNhbid0IGJlIFVURi04IGRlY29kZWQuCi0gICAgIyBUaGUgQysrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkgaGFzIG5vIHdheSB0byBjaGVjayB0aGF0IG9uCi0gICAgIyBNZXJnZUZyb21TdHJpbmcgYW5kIHRodXMgaGFzIG5vIHdheSB0byB0aHJvdyB0aGUgZXhjZXB0aW9uLgotICAgICMKLSAgICAjIFRoZSBwdXJlIFB5dGhvbiBBUEkgYWx3YXlzIHJldHVybnMgb2JqZWN0cyBvZiB0eXBlICd1bmljb2RlJyAoVVRGLTgKLSAgICAjIGVuY29kZWQpLCBvciAnYnl0ZXMnIChpbiA3IGJpdCBBU0NJSSkuCi0gICAgYmFkYnl0ZXMgPSByYXcuaXRlbVswXS5tZXNzYWdlLnJlcGxhY2UoCi0gICAgICAgIHRlc3RfdXRmOF9ieXRlcywgbGVuKHRlc3RfdXRmOF9ieXRlcykgKiBiJ1x4ZmYnKQotCi0gICAgdW5pY29kZV9kZWNvZGVfZmFpbGVkID0gRmFsc2UKLSAgICB0cnk6Ci0gICAgICBtZXNzYWdlMi5NZXJnZUZyb21TdHJpbmcoYmFkYnl0ZXMpCi0gICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKLSAgICAgIHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCA9IFRydWUKLSAgICBzdHJpbmdfZmllbGQgPSBtZXNzYWdlMi5zdHIKLSAgICBzZWxmLmFzc2VydFRydWUodW5pY29kZV9kZWNvZGVfZmFpbGVkIG9yIHR5cGUoc3RyaW5nX2ZpZWxkKSBpcyBieXRlcykKLQotICBkZWYgdGVzdEJ5dGVzSW5UZXh0Rm9ybWF0KHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhvcHRpb25hbF9ieXRlcz1iJ1x4MDBceDdmXHg4MFx4ZmYnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdvcHRpb25hbF9ieXRlczogIlxcMDAwXFwxNzdcXDIwMFxcMzc3IlxuJywKLSAgICAgICAgICAgICAgICAgICAgIHNpeC50ZXh0X3R5cGUocHJvdG8pKQotCi0gIGRlZiB0ZXN0RW1wdHlOZXN0ZWRNZXNzYWdlKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkNvcHlGcm9tKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIGJ5dGVzX3JlYWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5NZXJnZUZyb21TdHJpbmcoYicnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgYnl0ZXNfcmVhZCkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiJycpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotCi0gICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBsZW4oc2VyaWFsaXplZCksCi0gICAgICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvMi5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKLQotICBkZWYgdGVzdFNldEluUGFyZW50KHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxncm91cCcpKQotICAgIHByb3RvLm9wdGlvbmFsZ3JvdXAuU2V0SW5QYXJlbnQoKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxncm91cCcpKQotCi0gIGRlZiB0ZXN0UGFja2FnZUluaXRpYWxpemF0aW9uSW1wb3J0KHNlbGYpOgotICAgICIiIlRlc3QgdGhhdCB3ZSBjYW4gaW1wb3J0IG5lc3RlZCBtZXNzYWdlcyBmcm9tIHRoZWlyIF9faW5pdF9fLnB5LgotCi0gICAgU3VjaCBzZXR1cCBpcyBub3QgdHJpdmlhbCBzaW5jZSBhdCB0aGUgdGltZSBvZiBwcm9jZXNzaW5nIG9mIF9faW5pdF9fLnB5IG9uZQotICAgIGNhbid0IHJlZmVyIHRvIGl0cyBzdWJtb2R1bGVzIGJ5IG5hbWUgaW4gY29kZSwgc28gZXhwcmVzc2lvbnMgbGlrZQotICAgIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5pbXBvcnRfdGVzdF9wYWNrYWdlLmlubmVyX3BiMgotICAgIGRvbid0IHdvcmsuIFRoZXkgZG8gd29yayBpbiBpbXBvcnRzLCBzbyB3ZSBoYXZlIGFzc2lnbiBhbiBhbGlhcyBhdCBpbXBvcnQKLSAgICBhbmQgdGhlbiB1c2UgdGhhdCBhbGlhcyBpbiBnZW5lcmF0ZWQgY29kZS4KLSAgICAiIiIKLSAgICAjIFdlIGltcG9ydCBoZXJlIHNpbmNlIGl0J3MgdGhlIGltcG9ydCB0aGF0IHVzZWQgdG8gZmFpbCwgYW5kIHdlIHdhbnQKLSAgICAjIHRoZSBmYWlsdXJlIHRvIGhhdmUgdGhlIHJpZ2h0IGNvbnRleHQuCi0gICAgIyBweWxpbnQ6IGRpc2FibGU9Zy1pbXBvcnQtbm90LWF0LXRvcAotICAgIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBpbXBvcnRfdGVzdF9wYWNrYWdlCi0gICAgIyBweWxpbnQ6IGVuYWJsZT1nLWltcG9ydC1ub3QtYXQtdG9wCi0gICAgbXNnID0gaW1wb3J0X3Rlc3RfcGFja2FnZS5teXByb3RvLk91dGVyKCkKLSAgICAjIEp1c3QgY2hlY2sgdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1NywgbXNnLmlubmVyLnZhbHVlKQotCi0jICBTaW5jZSB3ZSBoYWQgc28gbWFueSB0ZXN0cyBmb3IgcHJvdG9jb2wgYnVmZmVyIGVxdWFsaXR5LCB3ZSBicm9rZSB0aGVzZSBvdXQKLSMgIGludG8gc2VwYXJhdGUgVGVzdENhc2UgY2xhc3Nlcy4KLQotCi1jbGFzcyBUZXN0QWxsVHlwZXNFcXVhbGl0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLmZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5zZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICBkZWYgdGVzdE5vdEhhc2hhYmxlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5maXJzdF9wcm90bykKLQotICBkZWYgdGVzdFNlbGZFcXVhbGl0eShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuZmlyc3RfcHJvdG8pCi0KLSAgZGVmIHRlc3RFbXB0eVByb3Rvc0VxdWFsKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLQotY2xhc3MgRnVsbFByb3Rvc0VxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgIiIiRXF1YWxpdHkgdGVzdHMgdXNpbmcgY29tcGxldGVseS1mdWxsIHByb3RvcyBhcyBhIHN0YXJ0aW5nIHBvaW50LiIiIgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLmZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5zZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHNlbGYuZmlyc3RfcHJvdG8pCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdE5vdEhhc2hhYmxlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgaGFzaCwgc2VsZi5maXJzdF9wcm90bykKLQotICBkZWYgdGVzdE5vbmVOb3RFcXVhbChzZWxmKToKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIE5vbmUpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChOb25lLCBzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdE5vdEVxdWFsVG9PdGhlck1lc3NhZ2Uoc2VsZik6Ci0gICAgdGhpcmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHRoaXJkX3Byb3RvKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwodGhpcmRfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotCi0gIGRlZiB0ZXN0QWxsRmllbGRzRmlsbGVkRXF1YWxpdHkoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFyKHNlbGYpOgotICAgICMgTm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkIGNoYW5nZSBzaG91bGQgY2F1c2UgaW5lcXVhbGl0eS4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyICs9IDEKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotICAgICMgLi4uYXMgc2hvdWxkIGNsZWFyaW5nIGEgZmllbGQuCi0gICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdE5vblJlcGVhdGVkQ29tcG9zaXRlKHNlbGYpOgotICAgICMgQ2hhbmdlIGEgbm9ucmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgotICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgKz0gMQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiAtPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLSAgICAjIENsZWFyIGEgZmllbGQgaW4gdGhlIG5lc3RlZCBtZXNzYWdlLgotICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9ICgKLSAgICAgICAgc2VsZi5zZWNvbmRfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLSAgICAjIFJlbW92ZSB0aGUgbmVzdGVkIG1lc3NhZ2UgZW50aXJlbHkuCi0gICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyKHNlbGYpOgotICAgICMgQ2hhbmdlIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgotICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLSAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGUoc2VsZik6Ci0gICAgIyBDaGFuZ2UgdmFsdWUgd2l0aGluIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgotICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIgKz0gMQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgc2VsZi5maXJzdF9wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiAtPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLSAgICAjIEFkZCBhIHZhbHVlIHRvIGEgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkLgotICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotICAgIHNlbGYuc2Vjb25kX3Byb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdE5vblJlcGVhdGVkU2NhbGFySGFzQml0cyhzZWxmKToKLSAgICAjIEVuc3VyZSB0aGF0IHdlIHRlc3QgImhhcyIgYml0cyBhcyB3ZWxsIGFzIHZhbHVlIGZvcgotICAgICMgbm9ucmVwZWF0ZWQgc2NhbGFyIGZpZWxkLgotICAgIHNlbGYuZmlyc3RfcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgIHNlbGYuc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMAotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3ROb25SZXBlYXRlZENvbXBvc2l0ZUhhc0JpdHMoc2VsZik6Ci0gICAgIyBFbnN1cmUgdGhhdCB3ZSB0ZXN0ICJoYXMiIGJpdHMgYXMgd2VsbCBhcyB2YWx1ZSBmb3IKLSAgICAjIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKLSAgICBzZWxmLnNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5DbGVhckZpZWxkKCdiYicpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLSAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMAotICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLQotY2xhc3MgRXh0ZW5zaW9uRXF1YWxpdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgdGVzdEV4dGVuc2lvbkVxdWFsaXR5KHNlbGYpOgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhmaXJzdF9wcm90bykKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0gICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoc2Vjb25kX3Byb3RvKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotICAgICMgRW5zdXJlIHRoYXQgd2UgY2hlY2sgdmFsdWUgZXF1YWxpdHkuCi0gICAgZmlyc3RfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSArPSAxCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotICAgIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gLT0gMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotICAgICMgRW5zdXJlIHRoYXQgd2UgYWxzbyBsb29rIGF0ICJoYXMiIGJpdHMuCi0gICAgZmlyc3RfcHJvdG8uQ2xlYXJFeHRlbnNpb24odW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikKLSAgICBzZWNvbmRfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDAKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0gICAgZmlyc3RfcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXSA9IDAKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgICAjIEVuc3VyZSB0aGF0IGRpZmZlcmVuY2VzIGluIGNhY2hlZCB2YWx1ZXMKLSAgICAjIGRvbid0IG1hdHRlciBpZiAiaGFzIiBiaXRzIGFyZSBib3RoIGZhbHNlLgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDAsIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotCi0KLWNsYXNzIE11dHVhbFJlY3Vyc2lvbkVxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RFcXVhbGl0eVdpdGhNdXR1YWxSZWN1cnNpb24oc2VsZik6Ci0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdE11dHVhbFJlY3Vyc2lvbkEoKQotICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotICAgIGZpcnN0X3Byb3RvLmJiLmEuYmIub3B0aW9uYWxfaW50MzIgPSAyMwotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLSAgICBzZWNvbmRfcHJvdG8uYmIuYS5iYi5vcHRpb25hbF9pbnQzMiA9IDIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotCi0KLWNsYXNzIEJ5dGVTaXplVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmV4dGVuZGVkX3Byb3RvID0gbW9yZV9leHRlbnNpb25zX3BiMi5FeHRlbmRlZE1lc3NhZ2UoKQotICAgIHNlbGYucGFja2VkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQotCi0gIGRlZiBTaXplKHNlbGYpOgotICAgIHJldHVybiBzZWxmLnByb3RvLkJ5dGVTaXplKCkKLQotICBkZWYgdGVzdEVtcHR5TWVzc2FnZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLQotICBkZWYgdGVzdFNpemVkT25Ld2FyZ3Moc2VsZik6Ci0gICAgIyBVc2UgYSBzZXBhcmF0ZSBtZXNzYWdlIHRvIGVuc3VyZSB0ZXN0aW5nIHJpZ2h0IGFmdGVyIGNyZWF0aW9uLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5CeXRlU2l6ZSgpKQotICAgIHByb3RvX2t3YXJncyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMob3B0aW9uYWxfaW50NjQgPSAxKQotICAgICMgT25lIGJ5dGUgZm9yIHRoZSB0YWcsIG9uZSB0byBlbmNvZGUgdmFyaW50IDEuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90b19rd2FyZ3MuQnl0ZVNpemUoKSkKLQotICBkZWYgdGVzdFZhcmludHMoc2VsZik6Ci0gICAgZGVmIFRlc3QoaSwgZXhwZWN0ZWRfdmFyaW50X3NpemUpOgotICAgICAgc2VsZi5wcm90by5DbGVhcigpCi0gICAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ludDY0ID0gaQotICAgICAgIyBBZGQgb25lIHRvIHRoZSB2YXJpbnQgc2l6ZSBmb3IgdGhlIHRhZyBpbmZvCi0gICAgICAjIGZvciB0YWcgMS4KLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfdmFyaW50X3NpemUgKyAxLCBzZWxmLlNpemUoKSkKLSAgICBUZXN0KDAsIDEpCi0gICAgVGVzdCgxLCAxKQotICAgIGZvciBpLCBudW1fYnl0ZXMgaW4gemlwKHJhbmdlKDcsIDYzLCA3KSwgcmFuZ2UoMSwgMTAwMDApKToKLSAgICAgIFRlc3QoKDEgPDwgaSkgLSAxLCBudW1fYnl0ZXMpCi0gICAgVGVzdCgtMSwgMTApCi0gICAgVGVzdCgtMiwgMTApCi0gICAgVGVzdCgtKDEgPDwgNjMpLCAxMCkKLQotICBkZWYgdGVzdFN0cmluZ3Moc2VsZik6Ci0gICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnJwotICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuU2l6ZSgpKQotCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcgPSAnYWJjJwotICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgb25lIGJ5dGUgZm9yIGxlbmd0aC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKLQotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ3gnICogMTI4Ci0gICAgIyBOZWVkIG9uZSBieXRlIGZvciB0YWcgaW5mbyAodGFnICMxNCksIGFuZCBUV08gYnl0ZXMgZm9yIGxlbmd0aC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyBsZW4oc2VsZi5wcm90by5vcHRpb25hbF9zdHJpbmcpLCBzZWxmLlNpemUoKSkKLQotICBkZWYgdGVzdE90aGVyTnVtZXJpY3Moc2VsZik6Ci0gICAgc2VsZi5wcm90by5vcHRpb25hbF9maXhlZDMyID0gMTIzNAotICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgNCBieXRlcyBmb3IgZml4ZWQzMi4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuU2l6ZSgpKQotICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZml4ZWQ2NCA9IDEyMzQKLSAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDggYnl0ZXMgZm9yIGZpeGVkNjQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKLSAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2Zsb2F0ID0gMS4yMzQKLSAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDQgYnl0ZXMgZm9yIGZsb2F0LgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5TaXplKCkpCi0gICAgc2VsZi5wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9kb3VibGUgPSAxLjIzNAotICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgOCBieXRlcyBmb3IgZmxvYXQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg5LCBzZWxmLlNpemUoKSkKLSAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX3NpbnQzMiA9IDY0Ci0gICAgIyBPbmUgYnl0ZSBmb3IgdGFnIGFuZCAyIGJ5dGVzIGZvciB6aWctemFnLWVuY29kZWQgNjQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLlNpemUoKSkKLSAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgZGVmIHRlc3RDb21wb3NpdGVzKHNlbGYpOgotICAgICMgMyBieXRlcy4KLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gKDEgPDwgMTQpCi0gICAgIyBQbHVzIG9uZSBieXRlIGZvciBiYiB0YWcuCi0gICAgIyBQbHVzIDEgYnl0ZSBmb3Igb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Ugc2VyaWFsaXplZCBzaXplLgotICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHRhZy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyAxICsgMSArIDIsIHNlbGYuU2l6ZSgpKQotCi0gIGRlZiB0ZXN0R3JvdXBzKHNlbGYpOgotICAgICMgNCBieXRlcy4KLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsZ3JvdXAuYSA9ICgxIDw8IDIxKQotICAgICMgUGx1cyB0d28gYnl0ZXMgZm9yIHxhfCB0YWcuCi0gICAgIyBQbHVzIDIgKiB0d28gYnl0ZXMgZm9yIFNUQVJUX0dST1VQIGFuZCBFTkRfR1JPVVAgdGFncy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDQgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFycyhzZWxmKToKLSAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgotICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KLSAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNFeHRlbmQoc2VsZik6Ci0gICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5leHRlbmQoWzEwLCAxMjhdKSAgIyAzIGJ5dGVzLgotICAgICMgQWxzbyBuZWVkIDIgYnl0ZXMgZm9yIGVhY2ggZW50cnkgZm9yIHRhZy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEgKyAyICsgMioyLCBzZWxmLlNpemUoKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkU2NhbGFyc1JlbW92ZShzZWxmKToKLSAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkgICMgMSBieXRlLgotICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KLSAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCi0gICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoMTI4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSArIDIsIHNlbGYuU2l6ZSgpKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVzKHNlbGYpOgotICAgICMgRW1wdHkgbWVzc2FnZS4gIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aC4KLSAgICBmb3JlaWduX21lc3NhZ2VfMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KLSAgICBmb3JlaWduX21lc3NhZ2VfMSA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBmb3JlaWduX21lc3NhZ2VfMS5iYiA9IDcKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMiArIDEgKyAxICsgMSwgc2VsZi5TaXplKCkpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZXNEZWxldGUoc2VsZik6Ci0gICAgIyBFbXB0eSBtZXNzYWdlLiAgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoLgotICAgIGZvcmVpZ25fbWVzc2FnZV8wID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgotICAgIGZvcmVpZ25fbWVzc2FnZV8xID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIGZvcmVpZ25fbWVzc2FnZV8xLmJiID0gOQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKLQotICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgotICAgIGRlbCBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKLQotICAgICMgTm93IGFkZCBhIG5ldyBtZXNzYWdlLgotICAgIGZvcmVpZ25fbWVzc2FnZV8yID0gc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIGZvcmVpZ25fbWVzc2FnZV8yLmJiID0gMTIKLQotICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgotICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAxICsgMSArIDIgKyAxICsgMSArIDEsIHNlbGYuU2l6ZSgpKQotCi0gICAgIyAyIGJ5dGVzIHRhZyBwbHVzIDEgYnl0ZSBsZW5ndGggcGx1cyAxIGJ5dGUgYmIgdGFnIDEgYnl0ZSBpbnQuCi0gICAgZGVsIHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMSArIDEsIHNlbGYuU2l6ZSgpKQotCi0gICAgZGVsIHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuU2l6ZSgpKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRHcm91cHMoc2VsZik6Ci0gICAgIyAyLWJ5dGUgU1RBUlRfR1JPVVAgcGx1cyAyLWJ5dGUgRU5EX0dST1VQLgotICAgIGdyb3VwXzAgPSBzZWxmLnByb3RvLnJlcGVhdGVkZ3JvdXAuYWRkKCkKLSAgICAjIDItYnl0ZSBTVEFSVF9HUk9VUCBwbHVzIDItYnl0ZSB8YXwgdGFnICsgMS1ieXRlIHxhfAotICAgICMgcGx1cyAyLWJ5dGUgRU5EX0dST1VQLgotICAgIGdyb3VwXzEgPSBzZWxmLnByb3RvLnJlcGVhdGVkZ3JvdXAuYWRkKCkKLSAgICBncm91cF8xLmEgPSAgNwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDIgKyAyICsgMiArIDEgKyAyLCBzZWxmLlNpemUoKSkKLQotICBkZWYgdGVzdEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAjIEZpZWxkICMxLCAxIGJ5dGUuCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gMjMKLSAgICAjIDEgYnl0ZSBmb3IgdGFnLCAxIGJ5dGUgZm9yIHZhbHVlLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8uQnl0ZVNpemUoKSkKLQotICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yTm9ucmVwZWF0ZWRTY2FsYXIoc2VsZik6Ci0gICAgIyBUZXN0IG5vbi1leHRlbnNpb24uCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9pbnQzMiA9IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ludDMyID0gMTI4Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9pbnQzMicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0KLSAgICAjIFRlc3Qgd2l0aGluIGV4dGVuc2lvbi4KLSAgICBleHRlbnNpb24gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb24KLSAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDEyOAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotCi0gIGRlZiB0ZXN0Q2FjaGVJbnZhbGlkYXRpb25Gb3JSZXBlYXRlZFNjYWxhcihzZWxmKToKLSAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KLSAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMlsxXSA9IDEyOAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgncmVwZWF0ZWRfaW50MzInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotCi0gICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCi0gICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uCi0gICAgcmVwZWF0ZWQgPSBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQotICAgIHJlcGVhdGVkLmFwcGVuZCgxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIHJlcGVhdGVkLmFwcGVuZCgxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIHJlcGVhdGVkWzFdID0gMTI4Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0KLSAgZGVmIHRlc3RDYWNoZUludmFsaWRhdGlvbkZvck5vbnJlcGVhdGVkTWVzc2FnZShzZWxmKToKLSAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMgPSAxMjgKLSAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5DbGVhckZpZWxkKCdjJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0KLSAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdweXRob24nOgotICAgICAgIyBUaGlzIGlzIG9ubHkgcG9zc2libGUgaW4gcHVyZS1QeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KLSAgICAgIGNoaWxkID0gc2VsZi5wcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UKLSAgICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlJykKLSAgICAgIGNoaWxkLmMgPSAxMjgKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotCi0gICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCi0gICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbgotICAgIGNoaWxkID0gc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBjaGlsZC5mb3JlaWduX21lc3NhZ2VfaW50ID0gMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIGNoaWxkLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAxMjgKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLQotICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yUmVwZWF0ZWRNZXNzYWdlKHNlbGYpOgotICAgICMgVGVzdCBub24tZXh0ZW5zaW9uLgotICAgIGNoaWxkMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmFkZCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5wcm90by5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UuYWRkKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBjaGlsZDAuYyA9IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKDgsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0KLSAgICAjIFRlc3Qgd2l0aGluIGV4dGVuc2lvbi4KLSAgICBleHRlbnNpb24gPSBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uCi0gICAgY2hpbGRfbGlzdCA9IHNlbGYuZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCi0gICAgY2hpbGQwID0gY2hpbGRfbGlzdC5hZGQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIGNoaWxkX2xpc3QuYWRkKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBjaGlsZDAuZm9yZWlnbl9tZXNzYWdlX2ludCA9IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKDYsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBjaGlsZDAuQ2xlYXJGaWVsZCgnZm9yZWlnbl9tZXNzYWdlX2ludCcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0KLSAgZGVmIHRlc3RQYWNrZWRSZXBlYXRlZFNjYWxhcnMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQotCi0gICAgc2VsZi5wYWNrZWRfcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgxMCkgICAjIDEgYnl0ZS4KLSAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfaW50MzIuYXBwZW5kKDEyOCkgICMgMiBieXRlcy4KLSAgICAjIFRoZSB0YWcgaXMgMiBieXRlcyAodGhlIGZpZWxkIG51bWJlciBpcyA5MCksIGFuZCB0aGUgdmFyaW50Ci0gICAgIyBzdG9yaW5nIHRoZSBsZW5ndGggaXMgMSBieXRlLgotICAgIGludF9zaXplID0gMSArIDIgKyAzCi0gICAgc2VsZi5hc3NlcnRFcXVhbChpbnRfc2l6ZSwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKLQotICAgIHNlbGYucGFja2VkX3Byb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDQuMikgICAjIDggYnl0ZXMKLSAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfZG91YmxlLmFwcGVuZCgzLjI1KSAgIyA4IGJ5dGVzCi0gICAgIyAyIG1vcmUgdGFnIGJ5dGVzLCAxIG1vcmUgbGVuZ3RoIGJ5dGUuCi0gICAgZG91YmxlX3NpemUgPSA4ICsgOCArIDMKLSAgICBzZWxmLmFzc2VydEVxdWFsKGludF9zaXplK2RvdWJsZV9zaXplLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQotCi0gICAgc2VsZi5wYWNrZWRfcHJvdG8uQ2xlYXJGaWVsZCgncGFja2VkX2ludDMyJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGRvdWJsZV9zaXplLCBzZWxmLnBhY2tlZF9wcm90by5CeXRlU2l6ZSgpKQotCi0gIGRlZiB0ZXN0UGFja2VkRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucGFja2VkX2V4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgZXh0ZW5zaW9uID0gc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0KLSAgICBleHRlbnNpb24uZXh0ZW5kKFsxLCAyLCAzLCA0XSkgICAjIDE2IGJ5dGVzCi0gICAgIyBUYWcgaXMgMyBieXRlcy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDE5LCBzZWxmLnBhY2tlZF9leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotCi0KLSMgSXNzdWVzIHRvIGJlIHN1cmUgdG8gY292ZXIgaW5jbHVkZToKLSMgICAqIEhhbmRsaW5nIG9mIHVucmVjb2duaXplZCB0YWdzICgidW5pbnRlcnByZXRlZF9ieXRlcyIpLgotIyAgICogSGFuZGxpbmcgb2YgTWVzc2FnZVNldHMuCi0jICAgKiBDb25zaXN0ZW50IG9yZGVyaW5nIG9mIHRhZ3MgaW4gdGhlIHdpcmUgZm9ybWF0LAotIyAgICAgaW5jbHVkaW5nIG9yZGVyaW5nIGJldHdlZW4gZXh0ZW5zaW9ucyBhbmQgbm9uLWV4dGVuc2lvbgotIyAgICAgZmllbGRzLgotIyAgICogQ29uc2lzdGVudCBzZXJpYWxpemF0aW9uIG9mIG5lZ2F0aXZlIG51bWJlcnMsIGVzcGVjaWFsbHkKLSMgICAgIG5lZ2F0aXZlIGludDMycy4KLSMgICAqIEhhbmRsaW5nIG9mIGVtcHR5IHN1Ym1lc3NhZ2VzICh3aXRoIGFuZCB3aXRob3V0ICJoYXMiCi0jICAgICBiaXRzIHNldCkuCi0KLWNsYXNzIFNlcmlhbGl6YXRpb25UZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgdGVzdFNlcmlhbGl6ZUVtdHB5TWVzc2FnZShzZWxmKToKLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAotICAgICAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdFNlcmlhbGl6ZUFsbEZpZWxkcyhzZWxmKToKLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoZmlyc3RfcHJvdG8pCi0gICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBsZW4oc2VyaWFsaXplZCksCi0gICAgICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplQWxsRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhmaXJzdF9wcm90bykKLSAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGxlbihzZXJpYWxpemVkKSwKLSAgICAgICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3RTZXJpYWxpemVXaXRoT3B0aW9uYWxHcm91cChzZWxmKToKLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsZ3JvdXAuYSA9IDI0MgotICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAotICAgICAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdFNlcmlhbGl6ZU5lZ2F0aXZlVmFsdWVzKHNlbGYpOgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBmaXJzdF9wcm90by5vcHRpb25hbF9pbnQzMiA9IC0xCi0gICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfaW50NjQgPSAtKDIgPDwgNDApCi0gICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfc2ludDMyID0gLTMKLSAgICBmaXJzdF9wcm90by5vcHRpb25hbF9zaW50NjQgPSAtKDQgPDwgNDApCi0gICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfc2ZpeGVkMzIgPSAtNQotICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX3NmaXhlZDY0ID0gLSg2IDw8IDQwKQotCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5Gcm9tU3RyaW5nKAotICAgICAgICBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotCi0gIGRlZiB0ZXN0UGFyc2VUcnVuY2F0ZWQoc2VsZik6Ci0gICAgIyBUaGlzIHRlc3QgaXMgb25seSBhcHBsaWNhYmxlIGZvciB0aGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCi0gICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKLSAgICAgIHJldHVybgotCi0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKGZpcnN0X3Byb3RvKQotICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICBmb3IgdHJ1bmNhdGlvbl9wb2ludCBpbiByYW5nZShsZW4oc2VyaWFsaXplZCkgKyAxKToKLSAgICAgIHRyeToKLSAgICAgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgICAgIHVua25vd25fZmllbGRzID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQotICAgICAgICBwb3MgPSBzZWNvbmRfcHJvdG8uX0ludGVybmFsUGFyc2Uoc2VyaWFsaXplZCwgMCwgdHJ1bmNhdGlvbl9wb2ludCkKLSAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgcmFpc2UgYW4gZXJyb3IgdGhlbiB3ZSByZWFkIGV4YWN0bHkgdGhlIGFtb3VudCBleHBlY3RlZC4KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cnVuY2F0aW9uX3BvaW50LCBwb3MpCi0KLSAgICAgICAgIyBQYXJzaW5nIHRvIHVua25vd24gZmllbGRzIHNob3VsZCBub3QgdGhyb3cgaWYgcGFyc2luZyB0byBrbm93biBmaWVsZHMKLSAgICAgICAgIyBkaWQgbm90LgotICAgICAgICB0cnk6Ci0gICAgICAgICAgcG9zMiA9IHVua25vd25fZmllbGRzLl9JbnRlcm5hbFBhcnNlKHNlcmlhbGl6ZWQsIDAsIHRydW5jYXRpb25fcG9pbnQpCi0gICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cnVuY2F0aW9uX3BvaW50LCBwb3MyKQotICAgICAgICBleGNlcHQgbWVzc2FnZS5EZWNvZGVFcnJvcjoKLSAgICAgICAgICBzZWxmLmZhaWwoJ1BhcnNpbmcgdW5rbm93biBmaWVsZHMgZmFpbGVkIHdoZW4gcGFyc2luZyBrbm93biBmaWVsZHMgJwotICAgICAgICAgICAgICAgICAgICAnZGlkIG5vdC4nKQotICAgICAgZXhjZXB0IG1lc3NhZ2UuRGVjb2RlRXJyb3I6Ci0gICAgICAgICMgUGFyc2luZyB1bmtub3duIGZpZWxkcyBzaG91bGQgYWxzbyBmYWlsLgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkRlY29kZUVycm9yLCB1bmtub3duX2ZpZWxkcy5fSW50ZXJuYWxQYXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCwgMCwgdHJ1bmNhdGlvbl9wb2ludCkKLQotICBkZWYgdGVzdENhbm9uaWNhbFNlcmlhbGl6YXRpb25PcmRlcihzZWxmKToKLSAgICBwcm90byA9IG1vcmVfbWVzc2FnZXNfcGIyLk91dE9mT3JkZXJGaWVsZHMoKQotICAgICMgVGhlc2UgYXJlIGFsc28gdGhlaXIgdGFnIG51bWJlcnMuICBFdmVuIHRob3VnaCB3ZSdyZSBzZXR0aW5nIHRoZXNlIGluCi0gICAgIyByZXZlcnNlLXRhZyBvcmRlciBBTkQgdGhleSdyZSBsaXN0ZWQgaW4gcmV2ZXJzZSB0YWctb3JkZXIgaW4gdGhlIC5wcm90bwotICAgICMgZmlsZSwgdGhleSBzaG91bGQgbm9uZXRoZWxlc3MgYmUgc2VyaWFsaXplZCBpbiB0YWcgb3JkZXIuCi0gICAgcHJvdG8ub3B0aW9uYWxfc2ludDMyID0gNQotICAgIHByb3RvLkV4dGVuc2lvbnNbbW9yZV9tZXNzYWdlc19wYjIub3B0aW9uYWxfdWludDY0XSA9IDQKLSAgICBwcm90by5vcHRpb25hbF91aW50MzIgPSAzCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1ttb3JlX21lc3NhZ2VzX3BiMi5vcHRpb25hbF9pbnQ2NF0gPSAyCi0gICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKLSAgICBkID0gX01pbmlEZWNvZGVyKHNlcmlhbGl6ZWQpCi0gICAgUmVhZFRhZyA9IGQuUmVhZEZpZWxkTnVtYmVyQW5kV2lyZVR5cGUKLSAgICBzZWxmLmFzc2VydEVxdWFsKCgxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCksIFJlYWRUYWcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGQuUmVhZEludDY0KCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoMywgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZC5SZWFkVUludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoNCwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgZC5SZWFkVUludDY0KCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoNSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgZC5SZWFkU0ludDMyKCkpCi0KLSAgZGVmIHRlc3RDYW5vbmljYWxTZXJpYWxpemF0aW9uT3JkZXJTYW1lQXNDcHAoc2VsZik6Ci0gICAgIyBDb3B5IG9mIHRoZSBzYW1lIHRlc3Qgd2UgdXNlIGZvciBDKysuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEZpZWxkT3JkZXJpbmdzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucyhwcm90bykKLSAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHRlc3RfdXRpbC5FeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihzZXJpYWxpemVkKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tU3RyaW5nV2hlbkZpZWxkc0FscmVhZHlTZXQoc2VsZik6Ci0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBmaXJzdF9wcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdmb29iYXInKQotICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMjMKLSAgICBmaXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDQyCi0gICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlY29uZF9wcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYXonKQotICAgIHNlY29uZF9wcm90by5vcHRpb25hbF9pbnQzMiA9IDEwMAotICAgIHNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDk5OQotCi0gICAgYnl0ZXNfcGFyc2VkID0gc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHNlcmlhbGl6ZWQpLCBieXRlc19wYXJzZWQpCi0KLSAgICAjIEVuc3VyZSB0aGF0IHdlIGFwcGVuZCB0byByZXBlYXRlZCBmaWVsZHMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbJ2JheicsICdmb29iYXInXSwgbGlzdChzZWNvbmRfcHJvdG8ucmVwZWF0ZWRfc3RyaW5nKSkKLSAgICAjIEVuc3VyZSB0aGF0IHdlIG92ZXJ3cml0ZSBub25yZXBlYXRkIHNjYWxhcnMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX2ludDMyKQotICAgICMgRW5zdXJlIHRoYXQgd2UgcmVjdXJzaXZlbHkgY2FsbCBNZXJnZUZyb21TdHJpbmcoKSBvbgotICAgICMgc3VibWVzc2FnZXMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0Miwgc2Vjb25kX3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotCi0gIGRlZiB0ZXN0TWVzc2FnZVNldFdpcmVGb3JtYXQoc2VsZik6Ci0gICAgcHJvdG8gPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldCgpCi0gICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCi0gICAgZXh0ZW5zaW9uX21lc3NhZ2UyID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yCi0gICAgZXh0ZW5zaW9uMSA9IGV4dGVuc2lvbl9tZXNzYWdlMS5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBleHRlbnNpb24yID0gZXh0ZW5zaW9uX21lc3NhZ2UyLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotICAgIGV4dGVuc2lvbjMgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5tZXNzYWdlX3NldF9leHRlbnNpb24zCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb24xXS5pID0gMTIzCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb24yXS5zdHIgPSAnZm9vJwotICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uM10udGV4dCA9ICdiYXInCi0KLSAgICAjIFNlcmlhbGl6ZSB1c2luZyB0aGUgTWVzc2FnZVNldCB3aXJlIGZvcm1hdCAodGhpcyBpcyBzcGVjaWZpZWQgaW4gdGhlCi0gICAgIyAucHJvdG8gZmlsZSkuCi0gICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICByYXcuREVTQ1JJUFRPUi5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAotICAgICAgICByYXcuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKHJhdy5pdGVtKSkKLQotICAgIG1lc3NhZ2UxID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBsZW4ocmF3Lml0ZW1bMF0ubWVzc2FnZSksCi0gICAgICAgIG1lc3NhZ2UxLk1lcmdlRnJvbVN0cmluZyhyYXcuaXRlbVswXS5tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgbWVzc2FnZTEuaSkKLQotICAgIG1lc3NhZ2UyID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBsZW4ocmF3Lml0ZW1bMV0ubWVzc2FnZSksCi0gICAgICAgIG1lc3NhZ2UyLk1lcmdlRnJvbVN0cmluZyhyYXcuaXRlbVsxXS5tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBtZXNzYWdlMi5zdHIpCi0KLSAgICBtZXNzYWdlMyA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHJhdy5pdGVtWzJdLm1lc3NhZ2UpLAotICAgICAgICBtZXNzYWdlMy5NZXJnZUZyb21TdHJpbmcocmF3Lml0ZW1bMl0ubWVzc2FnZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyJywgbWVzc2FnZTMudGV4dCkKLQotICAgICMgRGVzZXJpYWxpemUgdXNpbmcgdGhlIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQuCi0gICAgcHJvdG8yID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGxlbihzZXJpYWxpemVkKSwKLSAgICAgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEyMywgcHJvdG8yLkV4dGVuc2lvbnNbZXh0ZW5zaW9uMV0uaSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBwcm90bzIuRXh0ZW5zaW9uc1tleHRlbnNpb24yXS5zdHIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyJywgcHJvdG8yLkV4dGVuc2lvbnNbZXh0ZW5zaW9uM10udGV4dCkKLQotICAgICMgQ2hlY2sgYnl0ZSBzaXplLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8yLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKLQotICBkZWYgdGVzdE1lc3NhZ2VTZXRXaXJlRm9ybWF0VW5rbm93bkV4dGVuc2lvbihzZWxmKToKLSAgICAjIENyZWF0ZSBhIG1lc3NhZ2UgdXNpbmcgdGhlIG1lc3NhZ2Ugc2V0IHdpcmUgZm9ybWF0IHdpdGggYW4gdW5rbm93bgotICAgICMgbWVzc2FnZS4KLSAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKLQotICAgICMgQWRkIGFuIGl0ZW0uCi0gICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCi0gICAgaXRlbS50eXBlX2lkID0gOTg0MTg2MDMKLSAgICBleHRlbnNpb25fbWVzc2FnZTEgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKLSAgICBtZXNzYWdlMSA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpCi0gICAgbWVzc2FnZTEuaSA9IDEyMzQ1Ci0gICAgaXRlbS5tZXNzYWdlID0gbWVzc2FnZTEuU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgIyBBZGQgYSBzZWNvbmQsIHVua25vd24gZXh0ZW5zaW9uLgotICAgIGl0ZW0gPSByYXcuaXRlbS5hZGQoKQotICAgIGl0ZW0udHlwZV9pZCA9IDk4NDE4NjA0Ci0gICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCi0gICAgbWVzc2FnZTEgPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEoKQotICAgIG1lc3NhZ2UxLmkgPSAxMjM0NgotICAgIGl0ZW0ubWVzc2FnZSA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgICMgQWRkIGFub3RoZXIgdW5rbm93biBleHRlbnNpb24uCi0gICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCi0gICAgaXRlbS50eXBlX2lkID0gOTg0MTg2MDUKLSAgICBtZXNzYWdlMSA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMigpCi0gICAgbWVzc2FnZTEuc3RyID0gJ2ZvbycKLSAgICBpdGVtLm1lc3NhZ2UgPSBtZXNzYWdlMS5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICBzZXJpYWxpemVkID0gcmF3LlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgICMgUGFyc2UgbWVzc2FnZSB1c2luZyB0aGUgbWVzc2FnZSBzZXQgd2lyZSBmb3JtYXQuCi0gICAgcHJvdG8gPSBtZXNzYWdlX3NldF9leHRlbnNpb25zX3BiMi5UZXN0TWVzc2FnZVNldCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAotICAgICAgICBwcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCi0KLSAgICAjIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgcGFyc2VkIHdlbGwuCi0gICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCi0gICAgZXh0ZW5zaW9uMSA9IGV4dGVuc2lvbl9tZXNzYWdlMS5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEyMzQ1LCBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbjFdLmkpCi0KLSAgZGVmIHRlc3RVbmtub3duRmllbGRzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bykKLQotICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICAjIFRoZSBlbXB0eSBtZXNzYWdlIHNob3VsZCBiZSBwYXJzYWJsZSB3aXRoIGFsbCBvZiB0aGUgZmllbGRzCi0gICAgIyB1bmtub3duLgotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKLQotICAgICMgUGFyc2luZyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIHN1Y2NlZWQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAotICAgICAgICBwcm90bzIuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQotCi0gICAgIyBOb3cgdGVzdCB3aXRoIGEgaW50NjQgZmllbGQgc2V0LgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8ub3B0aW9uYWxfaW50NjQgPSAweDBmZmZmZmZmZmZmZmZmZmYKLSAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgICMgVGhlIGVtcHR5IG1lc3NhZ2Ugc2hvdWxkIGJlIHBhcnNhYmxlIHdpdGggYWxsIG9mIHRoZSBmaWVsZHMKLSAgICAjIHVua25vd24uCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQotICAgICMgUGFyc2luZyB0aGlzIG1lc3NhZ2Ugc2hvdWxkIHN1Y2NlZWQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAotICAgICAgICBwcm90bzIuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQotCi0gIGRlZiBfQ2hlY2tSYWlzZXMoc2VsZiwgZXhjX2NsYXNzLCBjYWxsYWJsZV9vYmosIGV4Y2VwdGlvbik6Ci0gICAgIiIiVGhpcyBtZXRob2QgY2hlY2tzIGlmIHRoZSBleGNwZXRpb24gdHlwZSBhbmQgbWVzc2FnZSBhcmUgYXMgZXhwZWN0ZWQuIiIiCi0gICAgdHJ5OgotICAgICAgY2FsbGFibGVfb2JqKCkKLSAgICBleGNlcHQgZXhjX2NsYXNzIGFzIGV4OgotICAgICAgIyBDaGVjayBpZiB0aGUgZXhjZXB0aW9uIG1lc3NhZ2UgaXMgdGhlIHJpZ2h0IG9uZS4KLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhjZXB0aW9uLCBzdHIoZXgpKQotICAgICAgcmV0dXJuCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIHNlbGYuZmFpbHVyZUV4Y2VwdGlvbignJXMgbm90IHJhaXNlZCcgJSBzdHIoZXhjX2NsYXNzKSkKLQotICBkZWYgdGVzdFNlcmlhbGl6ZVVuaW5pdGlhbGl6ZWQoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKLSAgICBzZWxmLl9DaGVja1JhaXNlcygKLSAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKLSAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCi0gICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJwotICAgICAgICAnYSxiLGMnKQotICAgICMgU2hvdWxkbid0IHJhaXNlIGV4Y2VwdGlvbnMuCi0gICAgcGFydGlhbCA9IHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCi0KLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkKCkKLSAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvMi5IYXNGaWVsZCgnYScpKQotICAgICMgcHJvdG8yIFBhcnNlRnJvbVN0cmluZyBkb2VzIG5vdCBjaGVjayB0aGF0IHJlcXVpcmVkIGZpZWxkcyBhcmUgc2V0LgotICAgIHByb3RvMi5QYXJzZUZyb21TdHJpbmcocGFydGlhbCkKLSAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvMi5IYXNGaWVsZCgnYScpKQotCi0gICAgcHJvdG8uYSA9IDEKLSAgICBzZWxmLl9DaGVja1JhaXNlcygKLSAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKLSAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCi0gICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYixjJykKLSAgICAjIFNob3VsZG4ndCByYWlzZSBleGNlcHRpb25zLgotICAgIHBhcnRpYWwgPSBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQotCi0gICAgcHJvdG8uYiA9IDIKLSAgICBzZWxmLl9DaGVja1JhaXNlcygKLSAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKLSAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCi0gICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYycpCi0gICAgIyBTaG91bGRuJ3QgcmFpc2UgZXhjZXB0aW9ucy4KLSAgICBwYXJ0aWFsID0gcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKLQotICAgIHByb3RvLmMgPSAzCi0gICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICAjIFNob3VsZG4ndCByYWlzZSBleGNlcHRpb25zLgotICAgIHBhcnRpYWwgPSBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQotCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbGVuKHNlcmlhbGl6ZWQpLAotICAgICAgICBwcm90bzIuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLmEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90bzIuYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvMi5jKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGxlbihwYXJ0aWFsKSwKLSAgICAgICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhwYXJ0aWFsKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5hKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8yLmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90bzIuYykKLQotICBkZWYgdGVzdFNlcmlhbGl6ZVVuaW5pdGlhbGl6ZWRTdWJNZXNzYWdlKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oKQotCi0gICAgIyBTdWItbWVzc2FnZSBkb2Vzbid0IGV4aXN0IHlldCwgc28gdGhpcyBzdWNjZWVkcy4KLSAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmEgPSAxCi0gICAgc2VsZi5fQ2hlY2tSYWlzZXMoCi0gICAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IsCi0gICAgICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nLAotICAgICAgICAnTWVzc2FnZSBwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWRGb3JlaWduICcKLSAgICAgICAgJ2lzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAnCi0gICAgICAgICdvcHRpb25hbF9tZXNzYWdlLmIsb3B0aW9uYWxfbWVzc2FnZS5jJykKLQotICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYiA9IDIKLSAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmMgPSAzCi0gICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZS5hZGQoKS5hID0gMQotICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2UuYWRkKCkuYiA9IDIKLSAgICBzZWxmLl9DaGVja1JhaXNlcygKLSAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKLSAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCi0gICAgICAgICdNZXNzYWdlIHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZEZvcmVpZ24gaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcKLSAgICAgICAgJ3JlcGVhdGVkX21lc3NhZ2VbMF0uYixyZXBlYXRlZF9tZXNzYWdlWzBdLmMsJwotICAgICAgICAncmVwZWF0ZWRfbWVzc2FnZVsxXS5hLHJlcGVhdGVkX21lc3NhZ2VbMV0uYycpCi0KLSAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzBdLmIgPSAyCi0gICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZVswXS5jID0gMwotICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbMV0uYSA9IDEKLSAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzFdLmMgPSAzCi0gICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplQWxsUGFja2VkRmllbGRzKHNlbGYpOgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhmaXJzdF9wcm90bykKLSAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQotICAgIGJ5dGVzX3JlYWQgPSBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfcHJvdG8uQnl0ZVNpemUoKSwgYnl0ZXNfcmVhZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3RTZXJpYWxpemVBbGxQYWNrZWRFeHRlbnNpb25zKHNlbGYpOgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRFeHRlbnNpb25zKCkKLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRFeHRlbnNpb25zKGZpcnN0X3Byb3RvKQotICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgYnl0ZXNfcmVhZCA9IHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9wcm90by5CeXRlU2l6ZSgpLCBieXRlc19yZWFkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdE1lcmdlUGFja2VkRnJvbVN0cmluZ1doZW5Tb21lRmllbGRzQWxyZWFkeVNldChzZWxmKToKLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIGZpcnN0X3Byb3RvLnBhY2tlZF9pbnQzMi5leHRlbmQoWzEsIDJdKQotICAgIGZpcnN0X3Byb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDMuMCkKLSAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgc2Vjb25kX3Byb3RvLnBhY2tlZF9pbnQzMi5hcHBlbmQoMykKLSAgICBzZWNvbmRfcHJvdG8ucGFja2VkX2RvdWJsZS5leHRlbmQoWzEuMCwgMi4wXSkKLSAgICBzZWNvbmRfcHJvdG8ucGFja2VkX3NpbnQzMi5hcHBlbmQoNCkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIGxlbihzZXJpYWxpemVkKSwKLSAgICAgICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFszLCAxLCAyXSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsxLjAsIDIuMCwgMy4wXSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9kb3VibGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNF0sIHNlY29uZF9wcm90by5wYWNrZWRfc2ludDMyKQotCi0gIGRlZiB0ZXN0UGFja2VkRmllbGRzV2lyZUZvcm1hdChzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIHByb3RvLnBhY2tlZF9pbnQzMi5leHRlbmQoWzEsIDIsIDE1MCwgM10pICAjIDEgKyAxICsgMiArIDEgYnl0ZXMKLSAgICBwcm90by5wYWNrZWRfZG91YmxlLmV4dGVuZChbMS4wLCAxMDAwLjBdKSAgIyA4ICsgOCBieXRlcwotICAgIHByb3RvLnBhY2tlZF9mbG9hdC5hcHBlbmQoMi4wKSAgICAgICAgICAgICAjIDQgYnl0ZXMsIHdpbGwgYmUgYmVmb3JlIGRvdWJsZQotICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCi0gICAgZCA9IF9NaW5pRGVjb2RlcihzZXJpYWxpemVkKQotICAgIFJlYWRUYWcgPSBkLlJlYWRGaWVsZE51bWJlckFuZFdpcmVUeXBlCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoOTAsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpLCBSZWFkVGFnKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxKzErMSsyLCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZC5SZWFkSW50MzIoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGQuUmVhZEludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxNTAsIGQuUmVhZEludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEwMCwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCksIFJlYWRUYWcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGQuUmVhZEludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLjAsIGQuUmVhZEZsb2F0KCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCs4LCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4wLCBkLlJlYWREb3VibGUoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDAuMCwgZC5SZWFkRG91YmxlKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGQuRW5kT2ZTdHJlYW0oKSkKLQotICBkZWYgdGVzdFBhcnNlUGFja2VkRnJvbVVucGFja2VkKHNlbGYpOgotICAgIHVucGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsVW5wYWNrZWRGaWVsZHModW5wYWNrZWQpCi0gICAgcGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgc2VyaWFsaXplZCA9IHVucGFja2VkLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBsZW4oc2VyaWFsaXplZCksCi0gICAgICAgIHBhY2tlZC5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpCi0gICAgZXhwZWN0ZWQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKGV4cGVjdGVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHBhY2tlZCkKLQotICBkZWYgdGVzdFBhcnNlVW5wYWNrZWRGcm9tUGFja2VkKHNlbGYpOgotICAgIHBhY2tlZCA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRGaWVsZHMocGFja2VkKQotICAgIHVucGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKLSAgICBzZXJpYWxpemVkID0gcGFja2VkLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBsZW4oc2VyaWFsaXplZCksCi0gICAgICAgIHVucGFja2VkLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKSkKLSAgICBleHBlY3RlZCA9IHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbFVucGFja2VkRmllbGRzKGV4cGVjdGVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWQsIHVucGFja2VkKQotCi0gIGRlZiB0ZXN0RmllbGROdW1iZXJzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuQkJfRklFTERfTlVNQkVSLCAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PUFRJT05BTF9JTlQzMl9GSUVMRF9OVU1CRVIsIDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMR1JPVVBfRklFTERfTlVNQkVSLCAxNikKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PUFRJT05BTF9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIsIDE4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9FTlVNX0ZJRUxEX05VTUJFUiwgMjEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJFUEVBVEVEX0lOVDMyX0ZJRUxEX05VTUJFUiwgMzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJFUEVBVEVER1JPVVBfRklFTERfTlVNQkVSLCA0NikKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SRVBFQVRFRF9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIsIDQ4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJFUEVBVEVEX05FU1RFRF9FTlVNX0ZJRUxEX05VTUJFUiwgNTEpCi0KLSAgZGVmIHRlc3RFeHRlbnNpb25GaWVsZE51bWJlcnMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5udW1iZXIsIDEwMDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLlNJTkdMRV9GSUVMRF9OVU1CRVIsIDEwMDApCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLm11bHRpLm51bWJlciwgMTAwMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuTVVMVElfRklFTERfTlVNQkVSLCAxMDAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbi5udW1iZXIsIDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuT1BUSU9OQUxfSU5UMzJfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbGdyb3VwX2V4dGVuc2lvbi5udW1iZXIsIDE2KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLk9QVElPTkFMR1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMTYpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLm51bWJlciwgMTgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIHVuaXR0ZXN0X3BiMi5PUFRJT05BTF9ORVNURURfTUVTU0FHRV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxOCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24ubnVtYmVyLCAyMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5PUFRJT05BTF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLAotICAgICAgMjEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLm51bWJlciwgMzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuUkVQRUFURURfSU5UMzJfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIucmVwZWF0ZWRncm91cF9leHRlbnNpb24ubnVtYmVyLCA0NikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5SRVBFQVRFREdST1VQX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDQ2KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbi5udW1iZXIsIDQ4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICB1bml0dGVzdF9wYjIuUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLm51bWJlciwgNTEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuUkVQRUFURURfTkVTVEVEX0VOVU1fRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwKLSAgICAgIDUxKQotCi0gIGRlZiB0ZXN0SW5pdEt3YXJncyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCi0gICAgICAgIG9wdGlvbmFsX2ludDMyPTEsCi0gICAgICAgIG9wdGlvbmFsX3N0cmluZz0nZm9vJywKLSAgICAgICAgb3B0aW9uYWxfYm9vbD1UcnVlLAotICAgICAgICBvcHRpb25hbF9ieXRlcz1iJ2JhcicsCi0gICAgICAgIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0xKSwKLSAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlPXVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEpLAotICAgICAgICBvcHRpb25hbF9uZXN0ZWRfZW51bT11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTywKLSAgICAgICAgb3B0aW9uYWxfZm9yZWlnbl9lbnVtPXVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywKLSAgICAgICAgcmVwZWF0ZWRfaW50MzI9WzEsIDIsIDNdKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5Jc0luaXRpYWxpemVkKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9ib29sJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9ieXRlcycpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fZW51bScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgcHJvdG8ub3B0aW9uYWxfYm9vbCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGInYmFyJywgcHJvdG8ub3B0aW9uYWxfYnl0ZXMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCi0gICAgICAgICAgICAgICAgICAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfZW51bSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywgcHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9lbnVtKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDIsIDNdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICBkZWYgdGVzdEluaXRBcmdzVW5rbm93bkZpZWxkTmFtZShzZWxmKToKLSAgICBkZWYgSW5pdGFsaXplRW1wdHlNZXNzYWdlV2l0aEV4dHJhS2V5d29yZEFyZygpOgotICAgICAgdW51c2VkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UodW5rbm93bj0ndW5rbm93bicpCi0gICAgc2VsZi5fQ2hlY2tSYWlzZXMoCi0gICAgICAgIFZhbHVlRXJyb3IsCi0gICAgICAgIEluaXRhbGl6ZUVtcHR5TWVzc2FnZVdpdGhFeHRyYUtleXdvcmRBcmcsCi0gICAgICAgICdQcm90b2NvbCBtZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2UgaGFzIG5vICJ1bmtub3duIiBmaWVsZC4nKQotCi0gIGRlZiB0ZXN0SW5pdFJlcXVpcmVkS3dhcmdzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZChhPTEsIGI9MSwgYz0xKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5Jc0luaXRpYWxpemVkKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdhJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdiJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdjJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnZHVtbXkyJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5hKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8uYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLmMpCi0KLSAgZGVmIHRlc3RJbml0UmVxdWlyZWRGb3JlaWduS3dhcmdzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZEZvcmVpZ24oCi0gICAgICAgIG9wdGlvbmFsX21lc3NhZ2U9dW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZChhPTEsIGI9MSwgYz0xKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5vcHRpb25hbF9tZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5IYXNGaWVsZCgnYScpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdiJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuSGFzRmllbGQoJ2MnKSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuSGFzRmllbGQoJ2R1bW15MicpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZChhPTEsIGI9MSwgYz0xKSwKLSAgICAgICAgICAgICAgICAgICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9tZXNzYWdlLmEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9tZXNzYWdlLmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9tZXNzYWdlLmMpCi0KLSAgZGVmIHRlc3RJbml0UmVwZWF0ZWRLd2FyZ3Moc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKHJlcGVhdGVkX2ludDMyPVsxLCAyLCAzXSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90by5yZXBlYXRlZF9pbnQzMlsxXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvLnJlcGVhdGVkX2ludDMyWzJdKQotCi0KLWNsYXNzIE9wdGlvbnNUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgdGVzdE1lc3NhZ2VPcHRpb25zKHNlbGYpOgotICAgIHByb3RvID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgIHByb3RvLkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChGYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgIHByb3RvLkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQotCi0gIGRlZiB0ZXN0UGFja2VkT3B0aW9ucyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX2ludDMyID0gMQotICAgIHByb3RvLm9wdGlvbmFsX2RvdWJsZSA9IDMuMAotICAgIGZvciBmaWVsZF9kZXNjcmlwdG9yLCBfIGluIHByb3RvLkxpc3RGaWVsZHMoKToKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIGZpZWxkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLnBhY2tlZCkKLQotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgxKQotICAgIHByb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDMuMCkKLSAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgXyBpbiBwcm90by5MaXN0RmllbGRzKCk6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIGZpZWxkX2Rlc2NyaXB0b3IuR2V0T3B0aW9ucygpLnBhY2tlZCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQsCi0gICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IubGFiZWwpCi0KLQotCi1jbGFzcyBDbGFzc0FQSVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIEB1bml0dGVzdC5za2lwSWYoCi0gICAgICBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnIGFuZCBhcGlfaW1wbGVtZW50YXRpb24uVmVyc2lvbigpID09IDIsCi0gICAgICAnQysrIGltcGxlbWVudGF0aW9uIHJlcXVpcmVzIGEgY2FsbCB0byBNYWtlRGVzY3JpcHRvcigpJykKLSAgZGVmIHRlc3RNYWtlQ2xhc3NXaXRoTmVzdGVkRGVzY3JpcHRvcihzZWxmKToKLSAgICBsZWFmX2Rlc2MgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoJ2xlYWYnLCAncGFja2FnZS5wYXJlbnQuY2hpbGQubGVhZicsICcnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwgZmllbGRzPVtdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRfdHlwZXM9W10sIGVudW1fdHlwZXM9W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbnM9W10pCi0gICAgY2hpbGRfZGVzYyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcignY2hpbGQnLCAncGFja2FnZS5wYXJlbnQuY2hpbGQnLCAnJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBmaWVsZHM9W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRfdHlwZXM9W2xlYWZfZGVzY10sIGVudW1fdHlwZXM9W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zPVtdKQotICAgIHNpYmxpbmdfZGVzYyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcignc2libGluZycsICdwYWNrYWdlLnBhcmVudC5zaWJsaW5nJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJycsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBmaWVsZHM9W10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZF90eXBlcz1bXSwgZW51bV90eXBlcz1bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9ucz1bXSkKLSAgICBwYXJlbnRfZGVzYyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigncGFyZW50JywgJ3BhY2thZ2UucGFyZW50JywgJycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIGZpZWxkcz1bXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXN0ZWRfdHlwZXM9W2NoaWxkX2Rlc2MsIHNpYmxpbmdfZGVzY10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW51bV90eXBlcz1bXSwgZXh0ZW5zaW9ucz1bXSkKLSAgICBtZXNzYWdlX2NsYXNzID0gcmVmbGVjdGlvbi5NYWtlQ2xhc3MocGFyZW50X2Rlc2MpCi0gICAgc2VsZi5hc3NlcnRJbignY2hpbGQnLCBtZXNzYWdlX2NsYXNzLl9fZGljdF9fKQotICAgIHNlbGYuYXNzZXJ0SW4oJ3NpYmxpbmcnLCBtZXNzYWdlX2NsYXNzLl9fZGljdF9fKQotICAgIHNlbGYuYXNzZXJ0SW4oJ2xlYWYnLCBtZXNzYWdlX2NsYXNzLmNoaWxkLl9fZGljdF9fKQotCi0gIGRlZiBfR2V0U2VyaWFsaXplZEZpbGVEZXNjcmlwdG9yKHNlbGYsIG5hbWUpOgotICAgICIiIkdldCBhIHNlcmlhbGl6ZWQgcmVwcmVzZW50YXRpb24gb2YgYSB0ZXN0IEZpbGVEZXNjcmlwdG9yUHJvdG8uCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogQWxsIGNhbGxzIHRvIHRoaXMgbXVzdCB1c2UgYSB1bmlxdWUgbWVzc2FnZSBuYW1lLCB0byBhdm9pZAotICAgICAgICAgIGNvbGxpc2lvbnMgaW4gdGhlIGNwcCBkZXNjcmlwdG9yIHBvb2wuCi0gICAgUmV0dXJuczoKLSAgICAgIEEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIHNlcmlhbGl6ZWQgZm9ybSBvZiBhIHRlc3QgRmlsZURlc2NyaXB0b3JQcm90by4KLSAgICAiIiIKLSAgICBmaWxlX2Rlc2NyaXB0b3Jfc3RyID0gKAotICAgICAgICAnbWVzc2FnZV90eXBlIHsnCi0gICAgICAgICcgIG5hbWU6ICInICsgbmFtZSArICciJwotICAgICAgICAnICBmaWVsZCB7JwotICAgICAgICAnICAgIG5hbWU6ICJmbGF0IicKLSAgICAgICAgJyAgICBudW1iZXI6IDEnCi0gICAgICAgICcgICAgbGFiZWw6IExBQkVMX1JFUEVBVEVEJwotICAgICAgICAnICAgIHR5cGU6IFRZUEVfVUlOVDMyJwotICAgICAgICAnICB9JwotICAgICAgICAnICBmaWVsZCB7JwotICAgICAgICAnICAgIG5hbWU6ICJiYXIiJwotICAgICAgICAnICAgIG51bWJlcjogMicKLSAgICAgICAgJyAgICBsYWJlbDogTEFCRUxfT1BUSU9OQUwnCi0gICAgICAgICcgICAgdHlwZTogVFlQRV9NRVNTQUdFJwotICAgICAgICAnICAgIHR5cGVfbmFtZTogIkJhciInCi0gICAgICAgICcgIH0nCi0gICAgICAgICcgIG5lc3RlZF90eXBlIHsnCi0gICAgICAgICcgICAgbmFtZTogIkJhciInCi0gICAgICAgICcgICAgZmllbGQgeycKLSAgICAgICAgJyAgICAgIG5hbWU6ICJiYXoiJwotICAgICAgICAnICAgICAgbnVtYmVyOiAzJwotICAgICAgICAnICAgICAgbGFiZWw6IExBQkVMX09QVElPTkFMJwotICAgICAgICAnICAgICAgdHlwZTogVFlQRV9NRVNTQUdFJwotICAgICAgICAnICAgICAgdHlwZV9uYW1lOiAiQmF6IicKLSAgICAgICAgJyAgICB9JwotICAgICAgICAnICAgIG5lc3RlZF90eXBlIHsnCi0gICAgICAgICcgICAgICBuYW1lOiAiQmF6IicKLSAgICAgICAgJyAgICAgIGVudW1fdHlwZSB7JwotICAgICAgICAnICAgICAgICBuYW1lOiAiZGVlcF9lbnVtIicKLSAgICAgICAgJyAgICAgICAgdmFsdWUgeycKLSAgICAgICAgJyAgICAgICAgICBuYW1lOiAiVkFMVUVfQSInCi0gICAgICAgICcgICAgICAgICAgbnVtYmVyOiAwJwotICAgICAgICAnICAgICAgICB9JwotICAgICAgICAnICAgICAgfScKLSAgICAgICAgJyAgICAgIGZpZWxkIHsnCi0gICAgICAgICcgICAgICAgIG5hbWU6ICJkZWVwIicKLSAgICAgICAgJyAgICAgICAgbnVtYmVyOiA0JwotICAgICAgICAnICAgICAgICBsYWJlbDogTEFCRUxfT1BUSU9OQUwnCi0gICAgICAgICcgICAgICAgIHR5cGU6IFRZUEVfVUlOVDMyJwotICAgICAgICAnICAgICAgfScKLSAgICAgICAgJyAgICB9JwotICAgICAgICAnICB9JwotICAgICAgICAnfScpCi0gICAgZmlsZV9kZXNjcmlwdG9yID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCi0gICAgdGV4dF9mb3JtYXQuTWVyZ2UoZmlsZV9kZXNjcmlwdG9yX3N0ciwgZmlsZV9kZXNjcmlwdG9yKQotICAgIHJldHVybiBmaWxlX2Rlc2NyaXB0b3IuU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gIGRlZiB0ZXN0UGFyc2luZ0ZsYXRDbGFzc1dpdGhFeHBsaWNpdENsYXNzRGVjbGFyYXRpb24oc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IHRoZSBnZW5lcmF0ZWQgY2xhc3MgY2FuIHBhcnNlIGEgZmxhdCBtZXNzYWdlLiIiIgotICAgICMgVE9ETyh4aWFvZmVuZyk6IFRoaXMgdGVzdCBmYWlscyB3aXRoIGNwcCBpbXBsZW1ldG5hdGlvbiBpbiB0aGUgY2FsbAotICAgICMgb2Ygc2l4LndpdGhfbWV0YWNsYXNzKCkuIFRoZSBvdGhlciB0d28gY2FsbHNpdGVzIG9mIHdpdGhfbWV0YWNsYXNzCi0gICAgIyBpbiB0aGlzIGZpbGUgYXJlIGJvdGggZXhjbHVkZWQgZnJvbSBjcHAgdGVzdCwgc28gaXQgbWlnaHQgYmUgZXhwZWN0ZWQKLSAgICAjIHRvIGZhaWwuIE5lZWQgc29tZW9uZSBtb3JlIGZhbWlsaWFyIHdpdGggdGhlIHB5dGhvbiBjb2RlIHRvIHRha2UgYQotICAgICMgbG9vayBhdCB0aGlzLgotICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6Ci0gICAgICByZXR1cm4KLSAgICBmaWxlX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKLSAgICBmaWxlX2Rlc2NyaXB0b3IuUGFyc2VGcm9tU3RyaW5nKHNlbGYuX0dldFNlcmlhbGl6ZWRGaWxlRGVzY3JpcHRvcignQScpKQotICAgIG1zZ19kZXNjcmlwdG9yID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcigKLSAgICAgICAgZmlsZV9kZXNjcmlwdG9yLm1lc3NhZ2VfdHlwZVswXSkKLQotICAgIGNsYXNzIE1lc3NhZ2VDbGFzcyhzaXgud2l0aF9tZXRhY2xhc3MocmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlLCBtZXNzYWdlLk1lc3NhZ2UpKToKLSAgICAgIERFU0NSSVBUT1IgPSBtc2dfZGVzY3JpcHRvcgotICAgIG1zZyA9IE1lc3NhZ2VDbGFzcygpCi0gICAgbXNnX3N0ciA9ICgKLSAgICAgICAgJ2ZsYXQ6IDAgJwotICAgICAgICAnZmxhdDogMSAnCi0gICAgICAgICdmbGF0OiAyICcpCi0gICAgdGV4dF9mb3JtYXQuTWVyZ2UobXNnX3N0ciwgbXNnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmZsYXQsIFswLCAxLCAyXSkKLQotICBkZWYgdGVzdFBhcnNpbmdGbGF0Q2xhc3Moc2VsZik6Ci0gICAgIiIiVGVzdCB0aGF0IHRoZSBnZW5lcmF0ZWQgY2xhc3MgY2FuIHBhcnNlIGEgZmxhdCBtZXNzYWdlLiIiIgotICAgIGZpbGVfZGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8oKQotICAgIGZpbGVfZGVzY3JpcHRvci5QYXJzZUZyb21TdHJpbmcoc2VsZi5fR2V0U2VyaWFsaXplZEZpbGVEZXNjcmlwdG9yKCdCJykpCi0gICAgbXNnX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLk1ha2VEZXNjcmlwdG9yKAotICAgICAgICBmaWxlX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlWzBdKQotICAgIG1zZ19jbGFzcyA9IHJlZmxlY3Rpb24uTWFrZUNsYXNzKG1zZ19kZXNjcmlwdG9yKQotICAgIG1zZyA9IG1zZ19jbGFzcygpCi0gICAgbXNnX3N0ciA9ICgKLSAgICAgICAgJ2ZsYXQ6IDAgJwotICAgICAgICAnZmxhdDogMSAnCi0gICAgICAgICdmbGF0OiAyICcpCi0gICAgdGV4dF9mb3JtYXQuTWVyZ2UobXNnX3N0ciwgbXNnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLmZsYXQsIFswLCAxLCAyXSkKLQotICBkZWYgdGVzdFBhcnNpbmdOZXN0ZWRDbGFzcyhzZWxmKToKLSAgICAiIiJUZXN0IHRoYXQgdGhlIGdlbmVyYXRlZCBjbGFzcyBjYW4gcGFyc2UgYSBuZXN0ZWQgbWVzc2FnZS4iIiIKLSAgICBmaWxlX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKLSAgICBmaWxlX2Rlc2NyaXB0b3IuUGFyc2VGcm9tU3RyaW5nKHNlbGYuX0dldFNlcmlhbGl6ZWRGaWxlRGVzY3JpcHRvcignQycpKQotICAgIG1zZ19kZXNjcmlwdG9yID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcigKLSAgICAgICAgZmlsZV9kZXNjcmlwdG9yLm1lc3NhZ2VfdHlwZVswXSkKLSAgICBtc2dfY2xhc3MgPSByZWZsZWN0aW9uLk1ha2VDbGFzcyhtc2dfZGVzY3JpcHRvcikKLSAgICBtc2cgPSBtc2dfY2xhc3MoKQotICAgIG1zZ19zdHIgPSAoCi0gICAgICAgICdiYXIgeycKLSAgICAgICAgJyAgYmF6IHsnCi0gICAgICAgICcgICAgZGVlcDogNCcKLSAgICAgICAgJyAgfScKLSAgICAgICAgJ30nKQotICAgIHRleHRfZm9ybWF0Lk1lcmdlKG1zZ19zdHIsIG1zZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy5iYXIuYmF6LmRlZXAsIDQpCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvc2VydmljZV9yZWZsZWN0aW9uX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYyOTAwYjEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3RzIGZvciBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuc2VydmljZV9yZWZsZWN0aW9uLiIiIgotCi1fX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCi0KLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2VfcmVmbGVjdGlvbgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UKLQotCi1jbGFzcyBGb29Vbml0VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RTZXJ2aWNlKHNlbGYpOgotICAgIGNsYXNzIE1vY2tScGNDaGFubmVsKHNlcnZpY2UuUnBjQ2hhbm5lbCk6Ci0gICAgICBkZWYgQ2FsbE1ldGhvZChzZWxmLCBtZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBjYWxsYmFjayk6Ci0gICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCi0gICAgICAgIHNlbGYuY29udHJvbGxlciA9IGNvbnRyb2xsZXIKLSAgICAgICAgc2VsZi5yZXF1ZXN0ID0gcmVxdWVzdAotICAgICAgICBjYWxsYmFjayhyZXNwb25zZSkKLQotICAgIGNsYXNzIE1vY2tScGNDb250cm9sbGVyKHNlcnZpY2UuUnBjQ29udHJvbGxlcik6Ci0gICAgICBkZWYgU2V0RmFpbGVkKHNlbGYsIG1zZyk6Ci0gICAgICAgIHNlbGYuZmFpbHVyZV9tZXNzYWdlID0gbXNnCi0KLSAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gTm9uZQotCi0gICAgY2xhc3MgTXlTZXJ2aWNlKHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZSk6Ci0gICAgICBwYXNzCi0KLSAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gTm9uZQotCi0gICAgZGVmIE15Q2FsbGJhY2socmVzcG9uc2UpOgotICAgICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IHJlc3BvbnNlCi0KLSAgICBycGNfY29udHJvbGxlciA9IE1vY2tScGNDb250cm9sbGVyKCkKLSAgICBjaGFubmVsID0gTW9ja1JwY0NoYW5uZWwoKQotICAgIHNydmMgPSBNeVNlcnZpY2UoKQotICAgIHNydmMuRm9vKHJwY19jb250cm9sbGVyLCB1bml0dGVzdF9wYjIuRm9vUmVxdWVzdCgpLCBNeUNhbGxiYWNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ01ldGhvZCBGb28gbm90IGltcGxlbWVudGVkLicsCi0gICAgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlKQotCi0gICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlID0gTm9uZQotCi0gICAgc2VydmljZV9kZXNjcmlwdG9yID0gdW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlLkdldERlc2NyaXB0b3IoKQotICAgIHNydmMuQ2FsbE1ldGhvZChzZXJ2aWNlX2Rlc2NyaXB0b3IubWV0aG9kc1sxXSwgcnBjX2NvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5CYXJSZXF1ZXN0KCksIE15Q2FsbGJhY2spCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnTWV0aG9kIEJhciBub3QgaW1wbGVtZW50ZWQuJywKLSAgICAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UpCi0KLSAgICBjbGFzcyBNeVNlcnZpY2VJbXBsKHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZSk6Ci0gICAgICBkZWYgRm9vKHNlbGYsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBkb25lKToKLSAgICAgICAgc2VsZi5mb29fY2FsbGVkID0gVHJ1ZQotICAgICAgZGVmIEJhcihzZWxmLCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgZG9uZSk6Ci0gICAgICAgIHNlbGYuYmFyX2NhbGxlZCA9IFRydWUKLQotICAgIHNydmMgPSBNeVNlcnZpY2VJbXBsKCkKLSAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UgPSBOb25lCi0gICAgc3J2Yy5Gb28ocnBjX2NvbnRyb2xsZXIsIHVuaXR0ZXN0X3BiMi5Gb29SZXF1ZXN0KCksIE15Q2FsbGJhY2spCi0gICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBzcnZjLmZvb19jYWxsZWQpCi0KLSAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UgPSBOb25lCi0gICAgc3J2Yy5DYWxsTWV0aG9kKHNlcnZpY2VfZGVzY3JpcHRvci5tZXRob2RzWzFdLCBycGNfY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkJhclJlcXVlc3QoKSwgTXlDYWxsYmFjaykKLSAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHNydmMuYmFyX2NhbGxlZCkKLQotICBkZWYgdGVzdFNlcnZpY2VTdHViKHNlbGYpOgotICAgIGNsYXNzIE1vY2tScGNDaGFubmVsKHNlcnZpY2UuUnBjQ2hhbm5lbCk6Ci0gICAgICBkZWYgQ2FsbE1ldGhvZChzZWxmLCBtZXRob2QsIGNvbnRyb2xsZXIsIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICAgICByZXNwb25zZV9jbGFzcywgY2FsbGJhY2spOgotICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAotICAgICAgICBzZWxmLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyCi0gICAgICAgIHNlbGYucmVxdWVzdCA9IHJlcXVlc3QKLSAgICAgICAgY2FsbGJhY2socmVzcG9uc2VfY2xhc3MoKSkKLQotICAgIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UgPSBOb25lCi0KLSAgICBkZWYgTXlDYWxsYmFjayhyZXNwb25zZSk6Ci0gICAgICBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlID0gcmVzcG9uc2UKLQotICAgIGNoYW5uZWwgPSBNb2NrUnBjQ2hhbm5lbCgpCi0gICAgc3R1YiA9IHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZV9TdHViKGNoYW5uZWwpCi0gICAgcnBjX2NvbnRyb2xsZXIgPSAnY29udHJvbGxlcicKLSAgICByZXF1ZXN0ID0gJ3JlcXVlc3QnCi0KLSAgICAjIEdldERlc2NyaXB0b3Igbm93IHN0YXRpYywgc3RpbGwgd29ya3MgYXMgaW5zdGFuY2UgbWV0aG9kIGZvciBjb21wYXRpYmlsaXR5Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2VfU3R1Yi5HZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICBzdHViLkdldERlc2NyaXB0b3IoKSkKLQotICAgICMgSW52b2tlIG1ldGhvZC4KLSAgICBzdHViLkZvbyhycGNfY29udHJvbGxlciwgcmVxdWVzdCwgTXlDYWxsYmFjaykKLQotICAgIHNlbGYuYXNzZXJ0SXNJbnN0YW5jZShzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlLCB1bml0dGVzdF9wYjIuRm9vUmVzcG9uc2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChyZXF1ZXN0LCBjaGFubmVsLnJlcXVlc3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChycGNfY29udHJvbGxlciwgY2hhbm5lbC5jb250cm9sbGVyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3R1Yi5HZXREZXNjcmlwdG9yKCkubWV0aG9kc1swXSwgY2hhbm5lbC5tZXRob2QpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3N5bWJvbF9kYXRhYmFzZV90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zeW1ib2xfZGF0YWJhc2VfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzk5YjQyNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3N5bWJvbF9kYXRhYmFzZV90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTI5ICswLDAgQEAKLSMhIC91c3IvYmluL2VudiBweXRob24KLSMKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVGVzdHMgZm9yIGdvb2dsZS5wcm90b2J1Zi5zeW1ib2xfZGF0YWJhc2UuIiIiCi0KLXRyeToKLSAgaW1wb3J0IHVuaXR0ZXN0MiBhcyB1bml0dGVzdCAgI1BZMjYKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgaW1wb3J0IHVuaXR0ZXN0Ci0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlCi0KLWNsYXNzIFN5bWJvbERhdGFiYXNlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIF9EYXRhYmFzZShzZWxmKToKLSAgICAjIFRPRE8oYi8xNzczNDA5NSk6IFJlbW92ZSB0aGlzIGRpZmZlcmVuY2Ugd2hlbiB0aGUgQysrIGltcGxlbWVudGF0aW9uCi0gICAgIyBzdXBwb3J0cyBtdWx0aXBsZSBkYXRhYmFzZXMuCi0gICAgaWYgZGVzY3JpcHRvci5fVVNFX0NfREVTQ1JJUFRPUlM6Ci0gICAgICByZXR1cm4gc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKQotICAgIGVsc2U6Ci0gICAgICBkYiA9IHN5bWJvbF9kYXRhYmFzZS5TeW1ib2xEYXRhYmFzZSgpCi0gICAgICAjIFJlZ2lzdGVyIHJlcHJlc2VudGF0aXZlIHR5cGVzIGZyb20gdW5pdHRlc3RfcGIyLgotICAgICAgZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcih1bml0dGVzdF9wYjIuREVTQ1JJUFRPUikKLSAgICAgIGRiLlJlZ2lzdGVyTWVzc2FnZSh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKQotICAgICAgZGIuUmVnaXN0ZXJNZXNzYWdlKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkKLSAgICAgIGRiLlJlZ2lzdGVyTWVzc2FnZSh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXApCi0gICAgICBkYi5SZWdpc3Rlck1lc3NhZ2UodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKQotICAgICAgZGIuUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcih1bml0dGVzdF9wYjIuRm9yZWlnbkVudW0uREVTQ1JJUFRPUikKLSAgICAgIGRiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkRFU0NSSVBUT1IpCi0gICAgICByZXR1cm4gZGIKLQotICBkZWYgdGVzdEdldFByb3RvdHlwZShzZWxmKToKLSAgICBpbnN0YW5jZSA9IHNlbGYuX0RhdGFiYXNlKCkuR2V0UHJvdG90eXBlKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGluc3RhbmNlIGlzIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMpCi0KLSAgZGVmIHRlc3RHZXRNZXNzYWdlcyhzZWxmKToKLSAgICBtZXNzYWdlcyA9IHNlbGYuX0RhdGFiYXNlKCkuR2V0TWVzc2FnZXMoCi0gICAgICAgIFsnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJ10pCi0gICAgc2VsZi5hc3NlcnRUcnVlKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzIGlzCi0gICAgICAgIG1lc3NhZ2VzWydwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnXSkKLQotICBkZWYgdGVzdEdldFN5bWJvbChzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBzZWxmLl9EYXRhYmFzZSgpLkdldFN5bWJvbCgKLSAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UsIHNlbGYuX0RhdGFiYXNlKCkuR2V0U3ltYm9sKAotICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5PcHRpb25hbEdyb3VwLCBzZWxmLl9EYXRhYmFzZSgpLkdldFN5bWJvbCgKLSAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cCcpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCwgc2VsZi5fRGF0YWJhc2UoKS5HZXRTeW1ib2woCi0gICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAnKSkKLQotICBkZWYgdGVzdEVudW1zKHNlbGYpOgotICAgICMgQ2hlY2sgcmVnaXN0cmF0aW9uIG9mIHR5cGVzIGluIHRoZSBwb29sLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bScsCi0gICAgICAgIHNlbGYuX0RhdGFiYXNlKCkucG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoCi0gICAgICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbkVudW0nKS5mdWxsX25hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtJywKLSAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgKLSAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bScpLmZ1bGxfbmFtZSkKLQotICBkZWYgdGVzdEZpbmRNZXNzYWdlVHlwZUJ5TmFtZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzJywKLSAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKLSAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKS5mdWxsX25hbWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlJywKLSAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKLSAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZScpLmZ1bGxfbmFtZSkKLQotICBkZWYgdGVzdEZpbmRGaW5kQ29udGFpbmluZ1N5bWJvbChzZWxmKToKLSAgICAjIExvb2t1cCBiYXNlZCBvbiBlaXRoZXIgZW51bSBvciBtZXNzYWdlLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nLAotICAgICAgICBzZWxmLl9EYXRhYmFzZSgpLnBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKAotICAgICAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtJykubmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAnZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvJywKLSAgICAgICAgc2VsZi5fRGF0YWJhc2UoKS5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICAgICAgICAgICdwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMnKS5uYW1lKQotCi0gIGRlZiB0ZXN0RmluZEZpbGVCeU5hbWUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgJ2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bycsCi0gICAgICAgIHNlbGYuX0RhdGFiYXNlKCkucG9vbC5GaW5kRmlsZUJ5TmFtZSgKLSAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKS5uYW1lKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM0ODYwZWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDUzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1vcHRpb24gcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7Ci0KLW1lc3NhZ2UgVGVzdEJhZElkZW50aWZpZXJzIHsKLSAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OwotfQotCi0vLyBNYWtlIHN1cmUgdGhlc2UgcmVhc29uYWJsZSBleHRlbnNpb24gbmFtZXMgZG9uJ3QgY29uZmxpY3Qgd2l0aCBpbnRlcm5hbAotLy8gdmFyaWFibGVzLgotZXh0ZW5kIFRlc3RCYWRJZGVudGlmaWVycyB7Ci0gIG9wdGlvbmFsIHN0cmluZyBtZXNzYWdlID0gMTAwIFtkZWZhdWx0PSJmb28iXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGRlc2NyaXB0b3IgPSAxMDEgW2RlZmF1bHQ9ImJhciJdOwotICBvcHRpb25hbCBzdHJpbmcgcmVmbGVjdGlvbiA9IDEwMiBbZGVmYXVsdD0iYmF6Il07Ci0gIG9wdGlvbmFsIHN0cmluZyBzZXJ2aWNlID0gMTAzIFtkZWZhdWx0PSJxdXgiXTsKLX0KLQotbWVzc2FnZSBBbm90aGVyTWVzc2FnZSB7fQotc2VydmljZSBBbm90aGVyU2VydmljZSB7fQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X3V0aWwucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMmM4MDU1OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDY5NiArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlV0aWxpdGllcyBmb3IgUHl0aG9uIHByb3RvMiB0ZXN0cy4KLQotVGhpcyBpcyBpbnRlbnRpb25hbGx5IG1vZGVsZWQgb24gQysrIGNvZGUgaW4KLS8vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC4qLgotIiIiCi0KLV9fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCi0KLWltcG9ydCBvcy5wYXRoCi0KLWltcG9ydCBzeXMKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotCi0jIFRlc3RzIHdoZXRoZXIgdGhlIGdpdmVuIFRlc3RBbGxUeXBlcyBtZXNzYWdlIGlzIHByb3RvMiBvciBub3QuCi0jIFRoaXMgaXMgdXNlZCB0byBnYXRlIHNldmVyYWwgZmllbGRzL2ZlYXR1cmVzIHRoYXQgb25seSBleGlzdAotIyBmb3IgdGhlIHByb3RvMiB2ZXJzaW9uIG9mIHRoZSBtZXNzYWdlLgotZGVmIElzUHJvdG8yKG1lc3NhZ2UpOgotICByZXR1cm4gbWVzc2FnZS5ERVNDUklQVE9SLnN5bnRheCA9PSAicHJvdG8yIgotCi1kZWYgU2V0QWxsTm9uTGF6eUZpZWxkcyhtZXNzYWdlKToKLSAgIiIiU2V0cyBldmVyeSBub24tbGF6eSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KLQotICBBcmdzOgotICAgIG1lc3NhZ2U6IEEgVGVzdEFsbFR5cGVzIGluc3RhbmNlLgotICAiIiIKLQotICAjCi0gICMgT3B0aW9uYWwgZmllbGRzLgotICAjCi0KLSAgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICA9IDEwMQotICBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgID0gMTAyCi0gIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAgPSAxMDMKLSAgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICA9IDEwNAotICBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgID0gMTA1Ci0gIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAgPSAxMDYKLSAgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICA9IDEwNwotICBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgID0gMTA4Ci0gIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIgPSAxMDkKLSAgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCA9IDExMAotICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgID0gMTExCi0gIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAgPSAxMTIKLSAgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICA9IFRydWUKLSAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgICA9IHUnMTE1JwotICBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzICAgID0gYicxMTYnCi0KLSAgaWYgSXNQcm90bzIobWVzc2FnZSk6Ci0gICAgbWVzc2FnZS5vcHRpb25hbGdyb3VwLmEgPSAxMTcKLSAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDExOAotICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMTE5Ci0gIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UuZCA9IDEyMAotICBtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZS5lID0gMTI2Ci0KLSAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFaCi0gIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtID0gdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaCi0gIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgotICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X2VudW0gPSB1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVoKLQotICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZ19waWVjZSA9IHUnMTI0JwotICBtZXNzYWdlLm9wdGlvbmFsX2NvcmQgPSB1JzEyNScKLQotICAjCi0gICMgUmVwZWF0ZWQgZmllbGRzLgotICAjCi0KLSAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMjAxKQotICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0LmFwcGVuZCgyMDIpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyLmFwcGVuZCgyMDMpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0LmFwcGVuZCgyMDQpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyLmFwcGVuZCgyMDUpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0LmFwcGVuZCgyMDYpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMi5hcHBlbmQoMjA3KQotICBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQuYXBwZW5kKDIwOCkKLSAgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMi5hcHBlbmQoMjA5KQotICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0LmFwcGVuZCgyMTApCi0gIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDIxMSkKLSAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDIxMikKLSAgbWVzc2FnZS5yZXBlYXRlZF9ib29sLmFwcGVuZChUcnVlKQotICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodScyMTUnKQotICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLmFwcGVuZChiJzIxNicpCi0KLSAgaWYgSXNQcm90bzIobWVzc2FnZSk6Ci0gICAgbWVzc2FnZS5yZXBlYXRlZGdyb3VwLmFkZCgpLmEgPSAyMTcKLSAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIxOAotICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5hZGQoKS5jID0gMjE5Ci0gIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UuYWRkKCkuZCA9IDIyMAotICBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZS5hZGQoKS5iYiA9IDIyNwotCi0gIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQotICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bS5hcHBlbmQodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSKQotICBpZiBJc1Byb3RvMihtZXNzYWdlKToKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtLmFwcGVuZCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVIpCi0KLSAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2UuYXBwZW5kKHUnMjI0JykKLSAgbWVzc2FnZS5yZXBlYXRlZF9jb3JkLmFwcGVuZCh1JzIyNScpCi0KLSAgIyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCi0gIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMwMSkKLSAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NC5hcHBlbmQoMzAyKQotICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMi5hcHBlbmQoMzAzKQotICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NC5hcHBlbmQoMzA0KQotICBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMi5hcHBlbmQoMzA1KQotICBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NC5hcHBlbmQoMzA2KQotICBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIuYXBwZW5kKDMwNykKLSAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0LmFwcGVuZCgzMDgpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIuYXBwZW5kKDMwOSkKLSAgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NC5hcHBlbmQoMzEwKQotICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgzMTEpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgzMTIpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbC5hcHBlbmQoRmFsc2UpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1JzMxNScpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKGInMzE2JykKLQotICBpZiBJc1Byb3RvMihtZXNzYWdlKToKLSAgICBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAuYWRkKCkuYSA9IDMxNwotICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMzE4Ci0gIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmFkZCgpLmMgPSAzMTkKLSAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZS5hZGQoKS5kID0gMzIwCi0gIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlLmFkZCgpLmJiID0gMzI3Ci0KLSAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bS5hcHBlbmQodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVopCi0gIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtLmFwcGVuZCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVopCi0gIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0uYXBwZW5kKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBWikKLQotICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZS5hcHBlbmQodSczMjQnKQotICBtZXNzYWdlLnJlcGVhdGVkX2NvcmQuYXBwZW5kKHUnMzI1JykKLQotICAjCi0gICMgRmllbGRzIHRoYXQgaGF2ZSBkZWZhdWx0cy4KLSAgIwotCi0gIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgotICAgIG1lc3NhZ2UuZGVmYXVsdF9pbnQzMiA9IDQwMQotICAgIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCA9IDQwMgotICAgIG1lc3NhZ2UuZGVmYXVsdF91aW50MzIgPSA0MDMKLSAgICBtZXNzYWdlLmRlZmF1bHRfdWludDY0ID0gNDA0Ci0gICAgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMiA9IDQwNQotICAgIG1lc3NhZ2UuZGVmYXVsdF9zaW50NjQgPSA0MDYKLSAgICBtZXNzYWdlLmRlZmF1bHRfZml4ZWQzMiA9IDQwNwotICAgIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0ID0gNDA4Ci0gICAgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyID0gNDA5Ci0gICAgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0ID0gNDEwCi0gICAgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0ID0gNDExCi0gICAgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSA9IDQxMgotICAgIG1lc3NhZ2UuZGVmYXVsdF9ib29sID0gRmFsc2UKLSAgICBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nID0gJzQxNScKLSAgICBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgPSBiJzQxNicKLQotICAgIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PCi0gICAgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSA9IHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTwotICAgIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSA9IHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0ZPTwotCi0gICAgbWVzc2FnZS5kZWZhdWx0X3N0cmluZ19waWVjZSA9ICc0MjQnCi0gICAgbWVzc2FnZS5kZWZhdWx0X2NvcmQgPSAnNDI1JwotCi0gIG1lc3NhZ2Uub25lb2ZfdWludDMyID0gNjAxCi0gIG1lc3NhZ2Uub25lb2ZfbmVzdGVkX21lc3NhZ2UuYmIgPSA2MDIKLSAgbWVzc2FnZS5vbmVvZl9zdHJpbmcgPSAnNjAzJwotICBtZXNzYWdlLm9uZW9mX2J5dGVzID0gYic2MDQnCi0KLQotZGVmIFNldEFsbEZpZWxkcyhtZXNzYWdlKToKLSAgU2V0QWxsTm9uTGF6eUZpZWxkcyhtZXNzYWdlKQotICBtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZS5iYiA9IDEyNwotCi0KLWRlZiBTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpOgotICAiIiJTZXRzIGV2ZXJ5IGV4dGVuc2lvbiBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KLQotICBBcmdzOgotICAgIG1lc3NhZ2U6IEEgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zIGluc3RhbmNlLgotICAiIiIKLQotICBleHRlbnNpb25zID0gbWVzc2FnZS5FeHRlbnNpb25zCi0gIHBiMiA9IHVuaXR0ZXN0X3BiMgotICBpbXBvcnRfcGIyID0gdW5pdHRlc3RfaW1wb3J0X3BiMgotCi0gICMKLSAgIyBPcHRpb25hbCBmaWVsZHMuCi0gICMKLQotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dID0gMTAxCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl0gPSAxMDIKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl0gPSAxMDMKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl0gPSAxMDQKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl0gPSAxMDUKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl0gPSAxMDYKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25dID0gMTA3Ci0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXSA9IDEwOAotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25dID0gMTA5Ci0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl0gPSAxMTAKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXSA9IDExMQotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uXSA9IDExMgotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9ib29sX2V4dGVuc2lvbl0gPSBUcnVlCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dID0gdScxMTUnCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl0gPSBiJzExNicKLQotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbGdyb3VwX2V4dGVuc2lvbl0uYSA9IDExNwotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmJiID0gMTE4Ci0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dLmMgPSAxMTkKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXS5kID0gMTIwCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dLmUgPSAxMjYKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0uYmIgPSAxMjcKLQotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dID0gcGIyLlRlc3RBbGxUeXBlcy5CQVoKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXSA9IHBiMi5UZXN0QWxsVHlwZXMuQkFaCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dID0gcGIyLkZPUkVJR05fQkFaCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0gPSBpbXBvcnRfcGIyLklNUE9SVF9CQVoKLQotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXSA9IHUnMTI0JwotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9jb3JkX2V4dGVuc2lvbl0gPSB1JzEyNScKLQotICAjCi0gICMgUmVwZWF0ZWQgZmllbGRzLgotICAjCi0KLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjAxKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDIpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDMpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDQpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDUpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDYpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA3KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDIwOCkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA5KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMTApCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDIxMSkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDIxMikKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChUcnVlKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXS5hcHBlbmQodScyMTUnKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dLmFwcGVuZChiJzIxNicpCi0KLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRncm91cF9leHRlbnNpb25dLmFkZCgpLmEgPSAyMTcKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5iYiA9IDIxOAotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5jID0gMjE5Ci0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuZCA9IDIyMAotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5iYiA9IDIyNwotCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKHBiMi5UZXN0QWxsVHlwZXMuQkFSKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQocGIyLkZPUkVJR05fQkFSKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25dLmFwcGVuZChpbXBvcnRfcGIyLklNUE9SVF9CQVIpCi0KLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl0uYXBwZW5kKHUnMjI0JykKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dLmFwcGVuZCh1JzIyNScpCi0KLSAgIyBBcHBlbmQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0uYXBwZW5kKDMwMSkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzAyKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzAzKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzA0KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA1KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzA2KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl0uYXBwZW5kKDMwNykKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDgpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl0uYXBwZW5kKDMwOSkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXS5hcHBlbmQoMzEwKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9mbG9hdF9leHRlbnNpb25dLmFwcGVuZCgzMTEpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25dLmFwcGVuZCgzMTIpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uXS5hcHBlbmQoRmFsc2UpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dLmFwcGVuZCh1JzMxNScpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl0uYXBwZW5kKGInMzE2JykKLQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0uYWRkKCkuYSA9IDMxNwotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzE4Ci0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmMgPSAzMTkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5kID0gMzIwCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzI3Ci0KLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQocGIyLlRlc3RBbGxUeXBlcy5CQVopCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuRk9SRUlHTl9CQVopCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKGltcG9ydF9wYjIuSU1QT1JUX0JBWikKLQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXS5hcHBlbmQodSczMjQnKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl0uYXBwZW5kKHUnMzI1JykKLQotICAjCi0gICMgRmllbGRzIHdpdGggZGVmYXVsdHMuCi0gICMKLQotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2ludDMyX2V4dGVuc2lvbl0gPSA0MDEKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25dID0gNDAyCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl0gPSA0MDMKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uXSA9IDQwNAotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NpbnQzMl9leHRlbnNpb25dID0gNDA1Ci0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl0gPSA0MDYKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl0gPSA0MDcKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl0gPSA0MDgKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb25dID0gNDA5Ci0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uXSA9IDQxMAotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl0gPSA0MTEKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uXSA9IDQxMgotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uXSA9IEZhbHNlCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl0gPSB1JzQxNScKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ieXRlc19leHRlbnNpb25dID0gYic0MTYnCi0KLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25dID0gcGIyLlRlc3RBbGxUeXBlcy5GT08KLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXSA9IHBiMi5GT1JFSUdOX0ZPTwotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0gPSBpbXBvcnRfcGIyLklNUE9SVF9GT08KLQotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25dID0gdSc0MjQnCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfY29yZF9leHRlbnNpb25dID0gJzQyNScKLQotICBleHRlbnNpb25zW3BiMi5vbmVvZl91aW50MzJfZXh0ZW5zaW9uXSA9IDYwMQotICBleHRlbnNpb25zW3BiMi5vbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmJiID0gNjAyCi0gIGV4dGVuc2lvbnNbcGIyLm9uZW9mX3N0cmluZ19leHRlbnNpb25dID0gdSc2MDMnCi0gIGV4dGVuc2lvbnNbcGIyLm9uZW9mX2J5dGVzX2V4dGVuc2lvbl0gPSBiJzYwNCcKLQotCi1kZWYgU2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucyhtZXNzYWdlKToKLSAgIiIiU2V0cyBldmVyeSBmaWVsZCBhbmQgZXh0ZW5zaW9uIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgotCi0gIEFyZ3M6Ci0gICAgbWVzc2FnZTogQSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZS4KLSAgIiIiCi0gIG1lc3NhZ2UubXlfaW50ID0gMQotICBtZXNzYWdlLm15X3N0cmluZyA9ICdmb28nCi0gIG1lc3NhZ2UubXlfZmxvYXQgPSAxLjAKLSAgbWVzc2FnZS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50XSA9IDIzCi0gIG1lc3NhZ2UuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZ10gPSAnYmFyJwotCi0KLWRlZiBFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihzZXJpYWxpemVkKToKLSAgIiIiRW5zdXJlcyB0aGF0IHNlcmlhbGl6ZWQgaXMgdGhlIHNlcmlhbGl6YXRpb24gd2UgZXhwZWN0IGZvciBhIG1lc3NhZ2UKLSAgZmlsbGVkIHdpdGggU2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygpLiAgKFNwZWNpZmljYWxseSwgZW5zdXJlcyB0aGF0IHRoZQotICBzZXJpYWxpemF0aW9uIGlzIGluIGNhbm9uaWNhbCwgdGFnLW51bWJlciBvcmRlcikuCi0gICIiIgotICBteV9leHRlbnNpb25faW50ID0gdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9pbnQKLSAgbXlfZXh0ZW5zaW9uX3N0cmluZyA9IHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25fc3RyaW5nCi0gIGV4cGVjdGVkX3N0cmluZ3MgPSBbXQotICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RGaWVsZE9yZGVyaW5ncygpCi0gIG1lc3NhZ2UubXlfaW50ID0gMSAgIyBGaWVsZCAxLgotICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gIG1lc3NhZ2UuQ2xlYXIoKQotICBtZXNzYWdlLkV4dGVuc2lvbnNbbXlfZXh0ZW5zaW9uX2ludF0gPSAyMyAgIyBGaWVsZCA1LgotICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gIG1lc3NhZ2UuQ2xlYXIoKQotICBtZXNzYWdlLm15X3N0cmluZyA9ICdmb28nICAjIEZpZWxkIDExLgotICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gIG1lc3NhZ2UuQ2xlYXIoKQotICBtZXNzYWdlLkV4dGVuc2lvbnNbbXlfZXh0ZW5zaW9uX3N0cmluZ10gPSAnYmFyJyAgIyBGaWVsZCA1MC4KLSAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICBtZXNzYWdlLkNsZWFyKCkKLSAgbWVzc2FnZS5teV9mbG9hdCA9IDEuMAotICBleHBlY3RlZF9zdHJpbmdzLmFwcGVuZChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gIG1lc3NhZ2UuQ2xlYXIoKQotICBleHBlY3RlZCA9IGInJy5qb2luKGV4cGVjdGVkX3N0cmluZ3MpCi0KLSAgaWYgZXhwZWN0ZWQgIT0gc2VyaWFsaXplZDoKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHBlY3RlZCAlciwgZm91bmQgJXInICUgKGV4cGVjdGVkLCBzZXJpYWxpemVkKSkKLQotCi1kZWYgRXhwZWN0QWxsRmllbGRzU2V0KHRlc3RfY2FzZSwgbWVzc2FnZSk6Ci0gICIiIkNoZWNrIGFsbCBmaWVsZHMgZm9yIGNvcnJlY3QgdmFsdWVzIGhhdmUgYWZ0ZXIgU2V0KkZpZWxkcygpIGlzIGNhbGxlZC4iIiIKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50NjQnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfdWludDMyJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX3VpbnQ2NCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zaW50MzInKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc2ludDY0JykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZpeGVkMzInKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZml4ZWQ2NCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQzMicpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQ2NCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9mbG9hdCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9kb3VibGUnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zdHJpbmcnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKLQotICBpZiBJc1Byb3RvMihtZXNzYWdlKToKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbXBvcnRfbWVzc2FnZScpKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxncm91cC5IYXNGaWVsZCgnYScpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkhhc0ZpZWxkKCdiYicpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5IYXNGaWVsZCgnYycpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLkhhc0ZpZWxkKCdkJykpCi0KLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9lbnVtJykpCi0gIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgotICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ltcG9ydF9lbnVtJykpCi0KLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nX3BpZWNlJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2NvcmQnKSkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAxLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAyLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAzLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMikKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNCwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDUsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA2LCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNywgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA4LCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDksIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTEsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTIsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoVHJ1ZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNScsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoYicxMTYnLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzKQotCi0gIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgotICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTcsIG1lc3NhZ2Uub3B0aW9uYWxncm91cC5hKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTE4LCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTE5LCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTIwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLmQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMjYsIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlLmUpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMjcsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlLmJiKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVosCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSkKLSAgaWYgSXNQcm90bzIobWVzc2FnZSk6Ci0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBWiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSkKLQotICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ludDMyKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ludDY0KSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMikpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF91aW50NjQpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2Jvb2wpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2J5dGVzKSkKLQotICBpZiBJc1Byb3RvMihtZXNzYWdlKToKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRncm91cCkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0pKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKSkKLSAgaWYgSXNQcm90bzIobWVzc2FnZSk6Ci0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtKSkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2NvcmQpKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyWzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0WzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NFswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMlswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NFswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChUcnVlLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnMjE1JywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChiJzIxNicsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNbMF0pCi0KLSAgaWYgSXNQcm90bzIobWVzc2FnZSk6Ci0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwWzBdLmEpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlWzBdLmMpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VbMF0uZCkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2VbMF0uYmIpCi0KLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtWzBdKQotICBpZiBJc1Byb3RvMihtZXNzYWdlKToKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtWzBdKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDMsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA0LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwNSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDYsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0WzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA3LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDgsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NFsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwOSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMlsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMCwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NFsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMSwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMxMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbChGYWxzZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzMxNScsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoYiczMTYnLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzFdKQotCi0gIGlmIElzUHJvdG8yKG1lc3NhZ2UpOgotICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFsxXS5hKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZVsxXS5jKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlWzFdLmQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlWzFdLmJiKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1bMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVosCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bVsxXSkKLSAgaWYgSXNQcm90bzIobWVzc2FnZSk6Ci0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X2ltcG9ydF9wYjIuSU1QT1JUX0JBWiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bVsxXSkKLQotICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaWYgSXNQcm90bzIobWVzc2FnZSk6Ci0gICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9pbnQzMicpKQotICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfaW50NjQnKSkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3VpbnQzMicpKQotICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDY0JykpCi0gICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9zaW50MzInKSkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3NpbnQ2NCcpKQotICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZml4ZWQzMicpKQotICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZml4ZWQ2NCcpKQotICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ZpeGVkMzInKSkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3NmaXhlZDY0JykpCi0gICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9mbG9hdCcpKQotICAgIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZG91YmxlJykpCi0gICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9ib29sJykpCi0gICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9zdHJpbmcnKSkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2J5dGVzJykpCi0KLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X25lc3RlZF9lbnVtJykpCi0gICAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9mb3JlaWduX2VudW0nKSkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ltcG9ydF9lbnVtJykpCi0KLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDAxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIpCi0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwMiwgbWVzc2FnZS5kZWZhdWx0X2ludDY0KQotICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDMsIG1lc3NhZ2UuZGVmYXVsdF91aW50MzIpCi0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDA1LCBtZXNzYWdlLmRlZmF1bHRfc2ludDMyKQotICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDYsIG1lc3NhZ2UuZGVmYXVsdF9zaW50NjQpCi0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNywgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIpCi0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwOCwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkNjQpCi0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwOSwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyKQotICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MTAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDExLCBtZXNzYWdlLmRlZmF1bHRfZmxvYXQpCi0gICAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQxMiwgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2UuZGVmYXVsdF9ib29sKQotICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnNDE1JywgbWVzc2FnZS5kZWZhdWx0X3N0cmluZykKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoYic0MTYnLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMpCi0KLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSkKLSAgICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtKQotICAgIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSkKLQotCi1kZWYgR29sZGVuRmlsZShmaWxlbmFtZSk6Ci0gICIiIkZpbmRzIHRoZSBnaXZlbiBnb2xkZW4gZmlsZSBhbmQgcmV0dXJucyBhIGZpbGUgb2JqZWN0IHJlcHJlc2VudGluZyBpdC4iIiIKLQotICAjIFNlYXJjaCB1cCB0aGUgZGlyZWN0b3J5IHRyZWUgbG9va2luZyBmb3IgdGhlIEMrKyBwcm90b2J1ZiBzb3VyY2UgY29kZS4KLSAgcGF0aCA9ICcuJwotICB3aGlsZSBvcy5wYXRoLmV4aXN0cyhwYXRoKToKLSAgICBpZiBvcy5wYXRoLmV4aXN0cyhvcy5wYXRoLmpvaW4ocGF0aCwgJ3NyYy9nb29nbGUvcHJvdG9idWYnKSk6Ci0gICAgICAjIEZvdW5kIGl0LiAgTG9hZCB0aGUgZ29sZGVuIGZpbGUgZnJvbSB0aGUgdGVzdGRhdGEgZGlyZWN0b3J5LgotICAgICAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhJywgZmlsZW5hbWUpCi0gICAgICByZXR1cm4gb3BlbihmdWxsX3BhdGgsICdyYicpCi0gICAgcGF0aCA9IG9zLnBhdGguam9pbihwYXRoLCAnLi4nKQotCi0gICMgU2VhcmNoIGludGVybmFsbHkuCi0gIHBhdGggPSAnLicKLSAgZnVsbF9wYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICd0aGlyZF9wYXJ0eS9weS9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUpCi0gIGlmIG9zLnBhdGguZXhpc3RzKGZ1bGxfcGF0aCk6Ci0gICAgIyBGb3VuZCBpdC4gIExvYWQgdGhlIGdvbGRlbiBmaWxlIGZyb20gdGhlIHRlc3RkYXRhIGRpcmVjdG9yeS4KLSAgICByZXR1cm4gb3BlbihmdWxsX3BhdGgsICdyYicpCi0KLSAgcmFpc2UgUnVudGltZUVycm9yKAotICAgICAgJ0NvdWxkIG5vdCBmaW5kIGdvbGRlbiBmaWxlcy4gIFRoaXMgdGVzdCBtdXN0IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgJwotICAgICAgJ3Byb3RvYnVmIHNvdXJjZSBwYWNrYWdlIHNvIHRoYXQgaXQgY2FuIHJlYWQgdGVzdCBkYXRhIGZpbGVzIGZyb20gdGhlICcKLSAgICAgICdDKysgc291cmNlIHRyZWUuJykKLQotCi1kZWYgR29sZGVuRmlsZURhdGEoZmlsZW5hbWUpOgotICAiIiJGaW5kcyB0aGUgZ2l2ZW4gZ29sZGVuIGZpbGUgYW5kIHJldHVybnMgaXRzIGNvbnRlbnRzLiIiIgotICB3aXRoIEdvbGRlbkZpbGUoZmlsZW5hbWUpIGFzIGY6Ci0gICAgcmV0dXJuIGYucmVhZCgpCi0KLQotZGVmIFNldEFsbFBhY2tlZEZpZWxkcyhtZXNzYWdlKToKLSAgIiIiU2V0cyBldmVyeSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KLQotICBBcmdzOgotICAgIG1lc3NhZ2U6IEEgVGVzdFBhY2tlZFR5cGVzIGluc3RhbmNlLgotICAiIiIKLSAgbWVzc2FnZS5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCi0gIG1lc3NhZ2UucGFja2VkX2ludDY0LmV4dGVuZChbNjAyLCA3MDJdKQotICBtZXNzYWdlLnBhY2tlZF91aW50MzIuZXh0ZW5kKFs2MDMsIDcwM10pCi0gIG1lc3NhZ2UucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKLSAgbWVzc2FnZS5wYWNrZWRfc2ludDMyLmV4dGVuZChbNjA1LCA3MDVdKQotICBtZXNzYWdlLnBhY2tlZF9zaW50NjQuZXh0ZW5kKFs2MDYsIDcwNl0pCi0gIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCi0gIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQuZXh0ZW5kKFs2MDgsIDcwOF0pCi0gIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyLmV4dGVuZChbNjA5LCA3MDldKQotICBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKLSAgbWVzc2FnZS5wYWNrZWRfZmxvYXQuZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQotICBtZXNzYWdlLnBhY2tlZF9kb3VibGUuZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQotICBtZXNzYWdlLnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQotICBtZXNzYWdlLnBhY2tlZF9lbnVtLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKLQotCi1kZWYgU2V0QWxsUGFja2VkRXh0ZW5zaW9ucyhtZXNzYWdlKToKLSAgIiIiU2V0cyBldmVyeSBleHRlbnNpb24gaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCi0KLSAgQXJnczoKLSAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucyBpbnN0YW5jZS4KLSAgIiIiCi0gIGV4dGVuc2lvbnMgPSBtZXNzYWdlLkV4dGVuc2lvbnMKLSAgcGIyID0gdW5pdHRlc3RfcGIyCi0KLSAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2ludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDEsIDcwMV0pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9pbnQ2NF9leHRlbnNpb25dLmV4dGVuZChbNjAyLCA3MDJdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfdWludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDMsIDcwM10pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYwNCwgNzA0XSkKLSAgZXh0ZW5zaW9uc1twYjIucGFja2VkX3NpbnQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA1LCA3MDVdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDYsIDcwNl0pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDcsIDcwN10pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDgsIDcwOF0pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA5LCA3MDldKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYxMCwgNzEwXSkKLSAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2Zsb2F0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfYm9vbF9leHRlbnNpb25dLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZW51bV9leHRlbnNpb25dLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKLQotCi1kZWYgU2V0QWxsVW5wYWNrZWRGaWVsZHMobWVzc2FnZSk6Ci0gICIiIlNldHMgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCi0KLSAgQXJnczoKLSAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcyBpbnN0YW5jZS4KLSAgIiIiCi0gIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQuZXh0ZW5kKFs2MDIsIDcwMl0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyLmV4dGVuZChbNjAzLCA3MDNdKQotICBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKLSAgbWVzc2FnZS51bnBhY2tlZF9zaW50MzIuZXh0ZW5kKFs2MDUsIDcwNV0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0LmV4dGVuZChbNjA2LCA3MDZdKQotICBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCi0gIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NC5leHRlbmQoWzYwOCwgNzA4XSkKLSAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQzMi5leHRlbmQoWzYwOSwgNzA5XSkKLSAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKLSAgbWVzc2FnZS51bnBhY2tlZF9mbG9hdC5leHRlbmQoWzYxMS4wLCA3MTEuMF0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlLmV4dGVuZChbNjEyLjAsIDcxMi4wXSkKLSAgbWVzc2FnZS51bnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQotICBtZXNzYWdlLnVucGFja2VkX2VudW0uZXh0ZW5kKFt1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWl0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZW5jb2RpbmdfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9lbmNvZGluZ190ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjN2QxODJjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9lbmNvZGluZ190ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzIgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUZXN0cyBmb3IgZ29vZ2xlLnByb3RvYnVmLnRleHRfZW5jb2RpbmcuIiIiCi0KLXRyeToKLSAgaW1wb3J0IHVuaXR0ZXN0MiBhcyB1bml0dGVzdCAgI1BZMjYKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgaW1wb3J0IHVuaXR0ZXN0Ci0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2VuY29kaW5nCi0KLVRFU1RfVkFMVUVTID0gWwotICAgICgiZm9vXFxyYmFyXFxuYmF6XFx0IiwKLSAgICAgImZvb1xccmJhclxcbmJhelxcdCIsCi0gICAgIGIiZm9vXHJiYXJcbmJhelx0IiksCi0gICAgKCJcXCdmdWxsIG9mIFxcXCJzb3VuZFxcXCIgYW5kIFxcXCJmdXJ5XFxcIlxcJyIsCi0gICAgICJcXCdmdWxsIG9mIFxcXCJzb3VuZFxcXCIgYW5kIFxcXCJmdXJ5XFxcIlxcJyIsCi0gICAgIGIiJ2Z1bGwgb2YgXCJzb3VuZFwiIGFuZCBcImZ1cnlcIiciKSwKLSAgICAoInNpZ25pXFxcXGZ5aW5nXFxcXCBub3RoaW5nXFxcXCIsCi0gICAgICJzaWduaVxcXFxmeWluZ1xcXFwgbm90aGluZ1xcXFwiLAotICAgICBiInNpZ25pXFxmeWluZ1xcIG5vdGhpbmdcXCIpLAotICAgICgiXFwwMTBcXHRcXG5cXDAxM1xcMDE0XFxyIiwKLSAgICAgIlx4MDhcXHRcXG5ceDBiXHgwY1xcciIsCi0gICAgIGIiXDAxMFwwMTFcMDEyXDAxM1wwMTRcMDE1IildCi0KLQotY2xhc3MgVGV4dEVuY29kaW5nVGVzdENhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgdGVzdENFc2NhcGUoc2VsZik6Ci0gICAgZm9yIGVzY2FwZWQsIGVzY2FwZWRfdXRmOCwgdW5lc2NhcGVkIGluIFRFU1RfVkFMVUVTOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChlc2NhcGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9lbmNvZGluZy5DRXNjYXBlKHVuZXNjYXBlZCwgYXNfdXRmOD1GYWxzZSkpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKGVzY2FwZWRfdXRmOCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZW5jb2RpbmcuQ0VzY2FwZSh1bmVzY2FwZWQsIGFzX3V0Zjg9VHJ1ZSkpCi0KLSAgZGVmIHRlc3RDVW5lc2NhcGUoc2VsZik6Ci0gICAgZm9yIGVzY2FwZWQsIGVzY2FwZWRfdXRmOCwgdW5lc2NhcGVkIGluIFRFU1RfVkFMVUVTOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmVzY2FwZWQsIHRleHRfZW5jb2RpbmcuQ1VuZXNjYXBlKGVzY2FwZWQpKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbCh1bmVzY2FwZWQsIHRleHRfZW5jb2RpbmcuQ1VuZXNjYXBlKGVzY2FwZWRfdXRmOCkpCi0KLQotaWYgX19uYW1lX18gPT0gIl9fbWFpbl9fIjoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZm9ybWF0X3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3RleHRfZm9ybWF0X3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGFiMmJmMDUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXh0X2Zvcm1hdF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTE1OSArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi50ZXh0X2Zvcm1hdC4iIiIKLQotX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKLQotCi1pbXBvcnQgcmUKLWltcG9ydCBzaXgKLWltcG9ydCBzdHJpbmcKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IF9wYXJhbWV0ZXJpemVkCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtYXBfdW5pdHRlc3RfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAotCi0KLSMgTG93LWxldmVsIG51dHMtbi1ib2x0cyB0ZXN0cy4KLWNsYXNzIFNpbXBsZVRleHRGb3JtYXRUZXN0cyh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgIyBUaGUgbWVtYmVycyBvZiBfUVVPVEVTIGFyZSBmb3JtYXR0ZWQgaW50byBhIHJlZ2V4cCB0ZW1wbGF0ZSB0aGF0Ci0gICMgZXhwZWN0cyBzaW5nbGUgY2hhcmFjdGVycy4gIFRoZXJlZm9yZSBpdCdzIGFuIGVycm9yIChpbiBhZGRpdGlvbiB0byBiZWluZwotICAjIG5vbi1zZW5zaWNhbCBpbiB0aGUgZmlyc3QgcGxhY2UpIHRvIHRyeSB0byBzcGVjaWZ5IGEgInF1b3RlIG1hcmsiIHRoYXQgaXMKLSAgIyBtb3JlIHRoYW4gb25lIGNoYXJhY3Rlci4KLSAgZGVmIHRlc3RRdW90ZU1hcmtzQXJlU2luZ2xlQ2hhcnMoc2VsZik6Ci0gICAgZm9yIHF1b3RlIGluIHRleHRfZm9ybWF0Ll9RVU9URVM6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihxdW90ZSkpCi0KLQotIyBCYXNlIGNsYXNzIHdpdGggc29tZSBjb21tb24gZnVuY3Rpb25hbGl0eS4KLWNsYXNzIFRleHRGb3JtYXRCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgUmVhZEdvbGRlbihzZWxmLCBnb2xkZW5fZmlsZW5hbWUpOgotICAgIHdpdGggdGVzdF91dGlsLkdvbGRlbkZpbGUoZ29sZGVuX2ZpbGVuYW1lKSBhcyBmOgotICAgICAgcmV0dXJuIChmLnJlYWRsaW5lcygpIGlmIHN0ciBpcyBieXRlcyBlbHNlICAjIFBZMwotICAgICAgICAgICAgICBbZ29sZGVuX2xpbmUuZGVjb2RlKCd1dGYtOCcpIGZvciBnb2xkZW5fbGluZSBpbiBmXSkKLQotICBkZWYgQ29tcGFyZVRvR29sZGVuRmlsZShzZWxmLCB0ZXh0LCBnb2xkZW5fZmlsZW5hbWUpOgotICAgIGdvbGRlbl9saW5lcyA9IHNlbGYuUmVhZEdvbGRlbihnb2xkZW5fZmlsZW5hbWUpCi0gICAgc2VsZi5hc3NlcnRNdWx0aUxpbmVFcXVhbCh0ZXh0LCAnJy5qb2luKGdvbGRlbl9saW5lcykpCi0KLSAgZGVmIENvbXBhcmVUb0dvbGRlblRleHQoc2VsZiwgdGV4dCwgZ29sZGVuX3RleHQpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwodGV4dCwgZ29sZGVuX3RleHQpCi0KLSAgZGVmIFJlbW92ZVJlZHVuZGFudFplcm9zKHNlbGYsIHRleHQpOgotICAgICMgU29tZSBwbGF0Zm9ybXMgcHJpbnQgMWUrNSBhcyAxZSswMDUuICBUaGlzIGlzIGZpbmUsIGJ1dCB3ZSBuZWVkIHRvIHJlbW92ZQotICAgICMgdGhlc2UgemVyb3MgaW4gb3JkZXIgdG8gbWF0Y2ggdGhlIGdvbGRlbiBmaWxlLgotICAgIHRleHQgPSB0ZXh0LnJlcGxhY2UoJ2UrMCcsJ2UrJykucmVwbGFjZSgnZSswJywnZSsnKSBcCi0gICAgICAgICAgICAgICAucmVwbGFjZSgnZS0wJywnZS0nKS5yZXBsYWNlKCdlLTAnLCdlLScpCi0gICAgIyBGbG9hdGluZyBwb2ludCBmaWVsZHMgYXJlIHByaW50ZWQgd2l0aCAuMCBzdWZmaXggZXZlbiBpZiB0aGV5IGFyZQotICAgICMgYWN0dWFseSBpbnRlZ2VyIG51bWJlcnMuCi0gICAgdGV4dCA9IHJlLmNvbXBpbGUoJ1wuMCQnLCByZS5NVUxUSUxJTkUpLnN1YignJywgdGV4dCkKLSAgICByZXR1cm4gdGV4dAotCi0KLUBfcGFyYW1ldGVyaXplZC5QYXJhbWV0ZXJzKAotICAgICh1bml0dGVzdF9wYjIpLAotICAgICh1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyKSkKLWNsYXNzIFRleHRGb3JtYXRUZXN0KFRleHRGb3JtYXRCYXNlKToKLQotICBkZWYgdGVzdFByaW50RXhvdGljKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDY0LmFwcGVuZCgtOTIyMzM3MjAzNjg1NDc3NTgwOCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NC5hcHBlbmQoMTg0NDY3NDQwNzM3MDk1NTE2MTUpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEyMy40NTYpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlMjIpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUuYXBwZW5kKDEuMjNlLTE4KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnXDAwMFwwMDFcYVxiXGZcblxyXHRcdlxcXCciJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkpLAotICAgICAgICAncmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4XG4nCi0gICAgICAgICdyZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1XG4nCi0gICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEyMy40NTZcbicKLSAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjJcbicKLSAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UtMThcbicKLSAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzonCi0gICAgICAgICcgIlxcMDAwXFwwMDFcXDAwN1xcMDEwXFwwMTRcXG5cXHJcXHRcXDAxM1xcXFxcXFwnXFwiIlxuJwotICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXFwzMDNcXDI3NFxcMzUyXFwyMzRcXDIzNyJcbicpCi0KLSAgZGVmIHRlc3RQcmludEV4b3RpY1VuaWNvZGVTdWJjbGFzcyhzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgY2xhc3MgVW5pY29kZVN1YihzaXgudGV4dF90eXBlKToKLSAgICAgIHBhc3MKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoVW5pY29kZVN1Yih1J1x1MDBmY1x1YTcxZicpKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLAotICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXFwzMDNcXDI3NFxcMzUyXFwyMzRcXDIzNyJcbicpCi0KLSAgZGVmIHRlc3RQcmludE5lc3RlZE1lc3NhZ2VBc09uZUxpbmUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIG1zZyA9IG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBtc2cuYmIgPSA0MgotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAotICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyBiYjogNDIgfScpCi0KLSAgZGVmIHRlc3RQcmludFJlcGVhdGVkRmllbGRzQXNPbmVMaW5lKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ0dvb2dsZScpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdadXJpY2gnKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAotICAgICAgICAncmVwZWF0ZWRfaW50MzI6IDEgcmVwZWF0ZWRfaW50MzI6IDEgcmVwZWF0ZWRfaW50MzI6IDMgJwotICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiR29vZ2xlIiByZXBlYXRlZF9zdHJpbmc6ICJadXJpY2giJykKLQotICBkZWYgdGVzdFByaW50TmVzdGVkTmV3TGluZUluU3RyaW5nQXNPbmVMaW5lKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyA9ICdhXG5uZXdcbmxpbmUnCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAotICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSksCi0gICAgICAgICdvcHRpb25hbF9zdHJpbmc6ICJhXFxubmV3XFxubGluZSInKQotCi0gIGRlZiB0ZXN0UHJpbnRFeG90aWNBc09uZUxpbmUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKC05MjIzMzcyMDM2ODU0Nzc1ODA4KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0LmFwcGVuZCgxODQ0Njc0NDA3MzcwOTU1MTYxNSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMTIzLjQ1NikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UyMikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UtMTgpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJyInKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1J1x1MDBmY1x1YTcxZicpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAotICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKAotICAgICAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpKSwKLSAgICAgICAgJ3JlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOCcKLSAgICAgICAgJyByZXBlYXRlZF91aW50NjQ6IDE4NDQ2NzQ0MDczNzA5NTUxNjE1JwotICAgICAgICAnIHJlcGVhdGVkX2RvdWJsZTogMTIzLjQ1NicKLSAgICAgICAgJyByZXBlYXRlZF9kb3VibGU6IDEuMjNlKzIyJwotICAgICAgICAnIHJlcGVhdGVkX2RvdWJsZTogMS4yM2UtMTgnCi0gICAgICAgICcgcmVwZWF0ZWRfc3RyaW5nOiAnCi0gICAgICAgICciXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcXCdcXCIiJwotICAgICAgICAnIHJlcGVhdGVkX3N0cmluZzogIlxcMzAzXFwyNzRcXDM1MlxcMjM0XFwyMzciJykKLQotICBkZWYgdGVzdFJvdW5kVHJpcEV4b3RpY0FzT25lTGluZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NC5hcHBlbmQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxMjMuNDU2KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZTIyKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZS0xOCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ1wwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnIicpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHVhNzFmJykKLQotICAgICMgVGVzdCBhc191dGY4ID0gRmFsc2UuCi0gICAgd2lyZV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAotICAgICAgICBtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlLCBhc191dGY4PUZhbHNlKQotICAgIHBhcnNlZF9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICByID0gdGV4dF9mb3JtYXQuUGFyc2Uod2lyZV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydElzKHIsIHBhcnNlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgICAjIFRlc3QgYXNfdXRmOCA9IFRydWUuCi0gICAgd2lyZV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAotICAgICAgICBtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlLCBhc191dGY4PVRydWUpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHIgPSB0ZXh0X2Zvcm1hdC5QYXJzZSh3aXJlX3RleHQsIHBhcnNlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0SXMociwgcGFyc2VkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAnXG4lcyAhPSAlcycgJSAobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpKQotCi0gIGRlZiB0ZXN0UHJpbnRSYXdVdGY4U3RyaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQotICAgIHRleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfdXRmOD1UcnVlKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCh0ZXh0LCAncmVwZWF0ZWRfc3RyaW5nOiAiXDMwM1wyNzRcMzUyXDIzNFwyMzciXG4nKQotICAgIHBhcnNlZF9tZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBwYXJzZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICdcbiVzICE9ICVzJyAlIChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkpCi0KLSAgZGVmIHRlc3RQcmludEZsb2F0Rm9ybWF0KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICAjIENoZWNrIHRoYXQgZmxvYXRfZm9ybWF0IGFyZ3VtZW50IGlzIHBhc3NlZCB0byBzdWItbWVzc2FnZSBmb3JtYXR0aW5nLgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5OZXN0ZWRUZXN0QWxsVHlwZXMoKQotICAgICMgV2UgdXNlIDEuMjUgYXMgaXQgaXMgYSByb3VuZCBudW1iZXIgaW4gYmluYXJ5LiAgVGhlIHByb3RvIDMyLWJpdCBmbG9hdAotICAgICMgd2lsbCBub3QgZ2FpbiBhZGRpdGlvbmFsIGltcHJlY2lzZSBkaWdpdHMgYXMgYSA2NC1iaXQgUHl0aG9uIGZsb2F0IGFuZAotICAgICMgc2hvdyB1cCBpbiBpdHMgc3RyLiAgMzItYml0IDEuMiBpcyBub2lzeSB3aGVuIGV4dGVuZGVkIHRvIDY0LWJpdDoKLSAgICAjICA+Pj4gc3RydWN0LnVucGFjaygnZicsIHN0cnVjdC5wYWNrKCdmJywgMS4yKSlbMF0KLSAgICAjICAxLjIwMDAwMDA0NzY4MzcxNTgKLSAgICAjICA+Pj4gc3RydWN0LnVucGFjaygnZicsIHN0cnVjdC5wYWNrKCdmJywgMS4yNSkpWzBdCi0gICAgIyAgMS4yNQotICAgIG1lc3NhZ2UucGF5bG9hZC5vcHRpb25hbF9mbG9hdCA9IDEuMjUKLSAgICAjIENoZWNrIHJvdW5kaW5nIGF0IDE1IHNpZ25pZmljYW50IGRpZ2l0cwotICAgIG1lc3NhZ2UucGF5bG9hZC5vcHRpb25hbF9kb3VibGUgPSAtLjAwMDAwMzQ1Njc4OTAxMjM0NTY3OAotICAgICMgQ2hlY2sgbm8gZGVjaW1hbCBwb2ludC4KLSAgICBtZXNzYWdlLnBheWxvYWQucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKC01NjQyKQotICAgICMgQ2hlY2sgbm8gdHJhaWxpbmcgemVyb3MuCi0gICAgbWVzc2FnZS5wYXlsb2FkLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoLjAwMDA3ODkwMCkKLSAgICBmb3JtYXR0ZWRfZmllbGRzID0gWydvcHRpb25hbF9mbG9hdDogMS4yNScsCi0gICAgICAgICAgICAgICAgICAgICAgICAnb3B0aW9uYWxfZG91YmxlOiAtMy40NTY3ODkwMTIzNDU2OGUtNicsCi0gICAgICAgICAgICAgICAgICAgICAgICAncmVwZWF0ZWRfZmxvYXQ6IC01NjQyJywKLSAgICAgICAgICAgICAgICAgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDcuODllLTUnXQotICAgIHRleHRfbWVzc2FnZSA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBmbG9hdF9mb3JtYXQ9Jy4xNWcnKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X21lc3NhZ2UpLAotICAgICAgICAncGF5bG9hZCB7e1xuICB7MH1cbiAgezF9XG4gIHsyfVxuICB7M31cbn19XG4nLmZvcm1hdCgqZm9ybWF0dGVkX2ZpZWxkcykpCi0gICAgIyBhc19vbmVfbGluZT1UcnVlIGlzIGEgc2VwYXJhdGUgY29kZSBicmFuY2ggd2hlcmUgZmxvYXRfZm9ybWF0IGlzIHBhc3NlZC4KLSAgICB0ZXh0X21lc3NhZ2UgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXRfZm9ybWF0PScuMTVnJykKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCi0gICAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9tZXNzYWdlKSwKLSAgICAgICAgJ3BheWxvYWQge3sgezB9IHsxfSB7Mn0gezN9IH19Jy5mb3JtYXQoKmZvcm1hdHRlZF9maWVsZHMpKQotCi0gIGRlZiB0ZXN0TWVzc2FnZVRvU3RyaW5nKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuRm9yZWlnbk1lc3NhZ2UoKQotICAgIG1lc3NhZ2UuYyA9IDEyMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2M6IDEyM1xuJywgc3RyKG1lc3NhZ2UpKQotCi0gIGRlZiB0ZXN0UHJpbnRGaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgZmllbGQgPSBtZXNzYWdlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2Zsb2F0J10KLSAgICB2YWx1ZSA9IG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQKLSAgICBvdXQgPSB0ZXh0X2Zvcm1hdC5UZXh0V3JpdGVyKEZhbHNlKQotICAgIHRleHRfZm9ybWF0LlByaW50RmllbGQoZmllbGQsIHZhbHVlLCBvdXQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb3B0aW9uYWxfZmxvYXQ6IDAuMFxuJywgb3V0LmdldHZhbHVlKCkpCi0gICAgb3V0LmNsb3NlKCkKLSAgICAjIFRlc3QgUHJpbnRlcgotICAgIG91dCA9IHRleHRfZm9ybWF0LlRleHRXcml0ZXIoRmFsc2UpCi0gICAgcHJpbnRlciA9IHRleHRfZm9ybWF0Ll9QcmludGVyKG91dCkKLSAgICBwcmludGVyLlByaW50RmllbGQoZmllbGQsIHZhbHVlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ29wdGlvbmFsX2Zsb2F0OiAwLjBcbicsIG91dC5nZXR2YWx1ZSgpKQotICAgIG91dC5jbG9zZSgpCi0KLSAgZGVmIHRlc3RQcmludEZpZWxkVmFsdWUoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIGZpZWxkID0gbWVzc2FnZS5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9mbG9hdCddCi0gICAgdmFsdWUgPSBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0Ci0gICAgb3V0ID0gdGV4dF9mb3JtYXQuVGV4dFdyaXRlcihGYWxzZSkKLSAgICB0ZXh0X2Zvcm1hdC5QcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCBvdXQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMC4wJywgb3V0LmdldHZhbHVlKCkpCi0gICAgb3V0LmNsb3NlKCkKLSAgICAjIFRlc3QgUHJpbnRlcgotICAgIG91dCA9IHRleHRfZm9ybWF0LlRleHRXcml0ZXIoRmFsc2UpCi0gICAgcHJpbnRlciA9IHRleHRfZm9ybWF0Ll9QcmludGVyKG91dCkKLSAgICBwcmludGVyLlByaW50RmllbGRWYWx1ZShmaWVsZCwgdmFsdWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMC4wJywgb3V0LmdldHZhbHVlKCkpCi0gICAgb3V0LmNsb3NlKCkKLQotICBkZWYgdGVzdFBhcnNlQWxsRmllbGRzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCi0gICAgYXNjaWlfdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQotCi0gICAgcGFyc2VkX21lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHRleHRfZm9ybWF0LlBhcnNlKGFzY2lpX3RleHQsIHBhcnNlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0gICAgaWYgbWVzc2FnZV9tb2R1bGUgaXMgdW5pdHRlc3RfcGIyOgotICAgICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc1NldChzZWxmLCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0UGFyc2VFeG90aWMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHRleHQgPSAoJ3JlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEyMy40NTZcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjNlKzIyXG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfZG91YmxlOiAxLjIzZS0xOFxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogXG4nCi0gICAgICAgICAgICAnIlxcMDAwXFwwMDFcXDAwN1xcMDEwXFwwMTRcXG5cXHJcXHRcXDAxM1xcXFxcXFwnXFwiIlxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogImZvbyIgXCdjb3JnZVwnICJncmF1bHQiXG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXFwzMDNcXDI3NFxcMzUyXFwyMzRcXDIzNyJcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJcXHhjM1xceGJjIlxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogIlx4YzNceGJjIlxuJykKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtOTIyMzM3MjAzNjg1NDc3NTgwOCwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFswXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDE4NDQ2NzQ0MDczNzA5NTUxNjE1LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFswXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEyMy40NTYsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4yM2UyMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLjIzZS0xOCwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgJ1wwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnIicsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Zvb2NvcmdlZ3JhdWx0JywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1MDBmY1x1YTcxZicsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdcdTAwZmMnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1szXSkKLQotICBkZWYgdGVzdFBhcnNlVHJhaWxpbmdDb21tYXMoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHRleHQgPSAoJ3JlcGVhdGVkX2ludDY0OiAxMDA7XG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfaW50NjQ6IDIwMDtcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF9pbnQ2NDogMzAwLFxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogIm9uZSIsXG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAidHdvIjtcbicpCi0gICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjAwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzFdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzAwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdvbmUnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHUndHdvJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMV0pCi0KLSAgZGVmIHRlc3RQYXJzZVJlcGVhdGVkU2NhbGFyU2hvcnRGb3JtYXQoc2VsZiwgbWVzc2FnZV9tb2R1bGUpOgotICAgIG1lc3NhZ2UgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHRleHQgPSAoJ3JlcGVhdGVkX2ludDY0OiBbMTAwLCAyMDBdO1xuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX2ludDY0OiAzMDAsXG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiBbIm9uZSIsICJ0d28iXTtcbicpCi0gICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjAwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzFdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzAwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodSdvbmUnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHUndHdvJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMV0pCi0KLSAgZGVmIHRlc3RQYXJzZVJlcGVhdGVkTWVzc2FnZVNob3J0Rm9ybWF0KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gKCdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZTogW3tiYjogMTAwfSwge2JiOiAyMDB9XSxcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZToge2JiOiAzMDB9XG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgW3tiYjogNDAwfV07XG4nKQotICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIwMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxXS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMwMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQwMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVszXS5iYikKLQotICBkZWYgdGVzdFBhcnNlRW1wdHlUZXh0KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJycKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCksIG1lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJzZUludmFsaWRVdGY4KHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJ3JlcGVhdGVkX3N0cmluZzogIlxceGMzXFx4YzMiJwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRleHRfZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0UGFyc2VTaW5nbGVXb3JkKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJ2ZvbycKLSAgICBzaXguYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgKHInMToxIDogTWVzc2FnZSB0eXBlICJcdysuVGVzdEFsbFR5cGVzIiBoYXMgbm8gZmllbGQgbmFtZWQgJwotICAgICAgICAgciciZm9vIi4nKSwKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJzZVVua25vd25GaWVsZChzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICd1bmtub3duX2ZpZWxkOiA4XG4nCi0gICAgc2l4LmFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgIChyJzE6MSA6IE1lc3NhZ2UgdHlwZSAiXHcrLlRlc3RBbGxUeXBlcyIgaGFzIG5vIGZpZWxkIG5hbWVkICcKLSAgICAgICAgIHInInVua25vd25fZmllbGQiLicpLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdFBhcnNlQmFkRW51bVZhbHVlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJ29wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVJSJwotICAgIHNpeC5hc3NlcnRSYWlzZXNSZWdleChzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAocicxOjIzIDogRW51bSB0eXBlICJcdysuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0iICcKLSAgICAgICAgIHInaGFzIG5vIHZhbHVlIG5hbWVkIEJBUlIuJyksCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotCi0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICdvcHRpb25hbF9uZXN0ZWRfZW51bTogMTAwJwotICAgIHNpeC5hc3NlcnRSYWlzZXNSZWdleChzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAocicxOjIzIDogRW51bSB0eXBlICJcdysuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0iICcKLSAgICAgICAgIHInaGFzIG5vIHZhbHVlIHdpdGggbnVtYmVyIDEwMC4nKSwKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJzZUJhZEludFZhbHVlKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJ29wdGlvbmFsX2ludDMyOiBib3JrJwotICAgIHNpeC5hc3NlcnRSYWlzZXNSZWdleChzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAoJzE6MTcgOiBDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogYm9yaycpLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdFBhcnNlU3RyaW5nRmllbGRVbmVzY2FwZShzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbWVzc2FnZSA9IG1lc3NhZ2VfbW9kdWxlLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9IHInJydyZXBlYXRlZF9zdHJpbmc6ICJceGZceDYyIgotICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXFx4ZlxceDYyIgotICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXFxceGZcXFx4NjIiCi0gICAgICAgICAgICAgICByZXBlYXRlZF9zdHJpbmc6ICJcXFxceGZcXFxceDYyIgotICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXFxcXFx4ZlxcXFxceDYyIgotICAgICAgICAgICAgICAgcmVwZWF0ZWRfc3RyaW5nOiAiXHg1Y3gyMCInJycKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQotCi0gICAgU0xBU0ggPSAnXFwnCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnXHgwZmInLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFNMQVNIICsgJ3hmJyArIFNMQVNIICsgJ3g2MicsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoU0xBU0ggKyAnXHgwZicgKyBTTEFTSCArICdiJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChTTEFTSCArIFNMQVNIICsgJ3hmJyArIFNMQVNIICsgU0xBU0ggKyAneDYyJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoU0xBU0ggKyBTTEFTSCArICdceDBmJyArIFNMQVNIICsgU0xBU0ggKyAnYicsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1s0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFNMQVNIICsgJ3gyMCcsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzVdKQotCi0gIGRlZiB0ZXN0TWVyZ2VEdXBsaWNhdGVTY2FsYXJzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gKCdvcHRpb25hbF9pbnQzMjogNDIgJwotICAgICAgICAgICAgJ29wdGlvbmFsX2ludDMyOiA2NycpCi0gICAgciA9IHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRJcyhyLCBtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNjcsIG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIpCi0KLSAgZGVmIHRlc3RNZXJnZUR1cGxpY2F0ZU5lc3RlZE1lc3NhZ2VTY2FsYXJzKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtZXNzYWdlID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAxIH0gJwotICAgICAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDIgfScpCi0gICAgciA9IHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHIgaXMgbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCi0KLSAgZGVmIHRlc3RQYXJzZU9uZW9mKHNlbGYsIG1lc3NhZ2VfbW9kdWxlKToKLSAgICBtID0gbWVzc2FnZV9tb2R1bGUuVGVzdEFsbFR5cGVzKCkKLSAgICBtLm9uZW9mX3VpbnQzMiA9IDExCi0gICAgbTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtKSwgbTIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnb25lb2ZfdWludDMyJywgbTIuV2hpY2hPbmVvZignb25lb2ZfZmllbGQnKSkKLQotICBkZWYgdGVzdFBhcnNlTXVsdGlwbGVPbmVvZihzZWxmLCBtZXNzYWdlX21vZHVsZSk6Ci0gICAgbV9zdHJpbmcgPSAnXG4nLmpvaW4oWwotICAgICAgICAnb25lb2ZfdWludDMyOiAxMScsCi0gICAgICAgICdvbmVvZl9zdHJpbmc6ICJmb28iJ10pCi0gICAgbTIgPSBtZXNzYWdlX21vZHVsZS5UZXN0QWxsVHlwZXMoKQotICAgIGlmIG1lc3NhZ2VfbW9kdWxlIGlzIHVuaXR0ZXN0X3BiMjoKLSAgICAgIHdpdGggc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgJyBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCBmaWVsZCAnKToKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UobV9zdHJpbmcsIG0yKQotICAgIGVsc2U6Ci0gICAgICB0ZXh0X2Zvcm1hdC5QYXJzZShtX3N0cmluZywgbTIpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKCdvbmVvZl9zdHJpbmcnLCBtMi5XaGljaE9uZW9mKCdvbmVvZl9maWVsZCcpKQotCi0KLSMgVGhlc2UgYXJlIHRlc3RzIHRoYXQgYXJlbid0IGZ1bmRhbWVudGFsbHkgc3BlY2lmaWMgdG8gcHJvdG8yLCBidXQgYXJlIGF0Ci0jIHRoZSBtb21lbnQgYmVjYXVzZSBvZiBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRoZSBwcm90bzIgYW5kIHByb3RvMyB0ZXN0IHNjaGVtYXMuCi0jIElkZWFsbHkgdGhlIHNjaGVtYXMgd291bGQgYmUgbWFkZSBtb3JlIHNpbWlsYXIgc28gdGhlc2UgdGVzdHMgY291bGQgcGFzcy4KLWNsYXNzIE9ubHlXb3Jrc1dpdGhQcm90bzJSaWdodE5vd1Rlc3RzKFRleHRGb3JtYXRCYXNlKToKLQotICBkZWYgdGVzdFByaW50QWxsRmllbGRzUG9pbnR5KHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAotICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKAotICAgICAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIHBvaW50eV9icmFja2V0cz1UcnVlKSksCi0gICAgICAgICd0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX3BvaW50eV9vbmVvZi50eHQnKQotCi0gIGRlZiB0ZXN0UGFyc2VHb2xkZW4oc2VsZik6Ci0gICAgZ29sZGVuX3RleHQgPSAnXG4nLmpvaW4oc2VsZi5SZWFkR29sZGVuKAotICAgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQnKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHIgPSB0ZXh0X2Zvcm1hdC5QYXJzZShnb2xkZW5fdGV4dCwgcGFyc2VkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRJcyhyLCBwYXJzZWRfbWVzc2FnZSkKLQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLQotICBkZWYgdGVzdFByaW50QWxsRmllbGRzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAotICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSksCi0gICAgICAgICd0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCcpCi0KLSAgZGVmIHRlc3RQcmludEFsbEZpZWxkc1BvaW50eShzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhtZXNzYWdlKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuRmlsZSgKLSAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcygKLSAgICAgICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBwb2ludHlfYnJhY2tldHM9VHJ1ZSkpLAotICAgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHlfb25lb2YudHh0JykKLQotICBkZWYgdGVzdFByaW50SW5JbmRleE9yZGVyKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEZpZWxkT3JkZXJpbmdzKCkKLSAgICBtZXNzYWdlLm15X3N0cmluZyA9ICcxMTUnCi0gICAgbWVzc2FnZS5teV9pbnQgPSAxMDEKLSAgICBtZXNzYWdlLm15X2Zsb2F0ID0gMTExCi0gICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5vbyA9IDAKLSAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoCi0gICAgICAgICAgICBtZXNzYWdlLCB1c2VfaW5kZXhfb3JkZXI9VHJ1ZSkpLAotICAgICAgICAnbXlfc3RyaW5nOiBcIjExNVwiXG5teV9pbnQ6IDEwMVxubXlfZmxvYXQ6IDExMVxuJwotICAgICAgICAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uge1xuICBvbzogMFxuICBiYjogMVxufVxuJykKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCi0gICAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAotICAgICAgICAgICAgbWVzc2FnZSkpLAotICAgICAgICAnbXlfaW50OiAxMDFcbm15X3N0cmluZzogXCIxMTVcIlxubXlfZmxvYXQ6IDExMVxuJwotICAgICAgICAnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2Uge1xuICBiYjogMVxuICBvbzogMFxufVxuJykKLQotICBkZWYgdGVzdE1lcmdlTGluZXNHb2xkZW4oc2VsZik6Ci0gICAgb3BlbmVkID0gc2VsZi5SZWFkR29sZGVuKCd0ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCcpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICByID0gdGV4dF9mb3JtYXQuTWVyZ2VMaW5lcyhvcGVuZWQsIHBhcnNlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0SXMociwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJzZUxpbmVzR29sZGVuKHNlbGYpOgotICAgIG9wZW5lZCA9IHNlbGYuUmVhZEdvbGRlbigndGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQnKQotICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgciA9IHRleHRfZm9ybWF0LlBhcnNlTGluZXMob3BlbmVkLCBwYXJzZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydElzKHIsIHBhcnNlZF9tZXNzYWdlKQotCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMobWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0UHJpbnRNYXAoc2VsZik6Ci0gICAgbWVzc2FnZSA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0KLSAgICBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMlstMTIzXSA9IC00NTYKLSAgICBtZXNzYWdlLm1hcF9pbnQ2NF9pbnQ2NFstMioqMzNdID0gLTIqKjM0Ci0gICAgbWVzc2FnZS5tYXBfdWludDMyX3VpbnQzMlsxMjNdID0gNDU2Ci0gICAgbWVzc2FnZS5tYXBfdWludDY0X3VpbnQ2NFsyKiozM10gPSAyKiozNAotICAgIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmdbImFiYyJdID0gIjEyMyIKLSAgICBtZXNzYWdlLm1hcF9pbnQzMl9mb3JlaWduX21lc3NhZ2VbMTExXS5jID0gNQotCi0gICAgIyBNYXBzIGFyZSBzZXJpYWxpemVkIHRvIHRleHQgZm9ybWF0IHVzaW5nIHRoZWlyIHVuZGVybHlpbmcgcmVwZWF0ZWQKLSAgICAjIHJlcHJlc2VudGF0aW9uLgotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLAotICAgICAgICAnbWFwX2ludDMyX2ludDMyIHtcbicKLSAgICAgICAgJyAga2V5OiAtMTIzXG4nCi0gICAgICAgICcgIHZhbHVlOiAtNDU2XG4nCi0gICAgICAgICd9XG4nCi0gICAgICAgICdtYXBfaW50NjRfaW50NjQge1xuJwotICAgICAgICAnICBrZXk6IC04NTg5OTM0NTkyXG4nCi0gICAgICAgICcgIHZhbHVlOiAtMTcxNzk4NjkxODRcbicKLSAgICAgICAgJ31cbicKLSAgICAgICAgJ21hcF91aW50MzJfdWludDMyIHtcbicKLSAgICAgICAgJyAga2V5OiAxMjNcbicKLSAgICAgICAgJyAgdmFsdWU6IDQ1NlxuJwotICAgICAgICAnfVxuJwotICAgICAgICAnbWFwX3VpbnQ2NF91aW50NjQge1xuJwotICAgICAgICAnICBrZXk6IDg1ODk5MzQ1OTJcbicKLSAgICAgICAgJyAgdmFsdWU6IDE3MTc5ODY5MTg0XG4nCi0gICAgICAgICd9XG4nCi0gICAgICAgICdtYXBfc3RyaW5nX3N0cmluZyB7XG4nCi0gICAgICAgICcgIGtleTogImFiYyJcbicKLSAgICAgICAgJyAgdmFsdWU6ICIxMjMiXG4nCi0gICAgICAgICd9XG4nCi0gICAgICAgICdtYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlIHtcbicKLSAgICAgICAgJyAga2V5OiAxMTFcbicKLSAgICAgICAgJyAgdmFsdWUge1xuJwotICAgICAgICAnICAgIGM6IDVcbicKLSAgICAgICAgJyAgfVxuJwotICAgICAgICAnfVxuJykKLQotICBkZWYgdGVzdE1hcE9yZGVyRW5mb3JjZW1lbnQoc2VsZik6Ci0gICAgbWVzc2FnZSA9IG1hcF91bml0dGVzdF9wYjIuVGVzdE1hcCgpCi0gICAgZm9yIGxldHRlciBpbiBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlWzEzOjI2XToKLSAgICAgIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmdbbGV0dGVyXSA9ICdkdW1teScKLSAgICBmb3IgbGV0dGVyIGluIHJldmVyc2VkKHN0cmluZy5hc2NpaV91cHBlcmNhc2VbMDoxM10pOgotICAgICAgbWVzc2FnZS5tYXBfc3RyaW5nX3N0cmluZ1tsZXR0ZXJdID0gJ2R1bW15JwotICAgIGdvbGRlbiA9ICcnLmpvaW4oKAotICAgICAgICAnbWFwX3N0cmluZ19zdHJpbmcge1xuICBrZXk6ICIlYyJcbiAgdmFsdWU6ICJkdW1teSJcbn1cbicgJSAobGV0dGVyLCkKLSAgICAgICAgZm9yIGxldHRlciBpbiBzdHJpbmcuYXNjaWlfdXBwZXJjYXNlKSkKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQodGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLCBnb2xkZW4pCi0KLSAgZGVmIHRlc3RNYXBPcmRlclNlbWFudGljcyhzZWxmKToKLSAgICBnb2xkZW5fbGluZXMgPSBzZWxmLlJlYWRHb2xkZW4oJ21hcF90ZXN0X2RhdGEudHh0JykKLSAgICAjIFRoZSBDKysgaW1wbGVtZW50YXRpb24gZW1pdHMgZGVmYXVsdGVkLXZhbHVlIGZpZWxkcywgd2hpbGUgdGhlIFB5dGhvbgotICAgICMgaW1wbGVtZW50YXRpb24gZG9lcyBub3QuICBBZGp1c3RpbmcgZm9yIHRoaXMgaXMgYXdrd2FyZCwgYnV0IGl0IGlzCi0gICAgIyB2YWx1YWJsZSB0byB0ZXN0IGFnYWluc3QgYSBjb21tb24gZ29sZGVuIGZpbGUuCi0gICAgbGluZV9ibGFja2xpc3QgPSAoJyAga2V5OiAwXG4nLAotICAgICAgICAgICAgICAgICAgICAgICcgIHZhbHVlOiAwXG4nLAotICAgICAgICAgICAgICAgICAgICAgICcgIGtleTogZmFsc2VcbicsCi0gICAgICAgICAgICAgICAgICAgICAgJyAgdmFsdWU6IGZhbHNlXG4nKQotICAgIGdvbGRlbl9saW5lcyA9IFtsaW5lIGZvciBsaW5lIGluIGdvbGRlbl9saW5lcyBpZiBsaW5lIG5vdCBpbiBsaW5lX2JsYWNrbGlzdF0KLQotICAgIG1lc3NhZ2UgPSBtYXBfdW5pdHRlc3RfcGIyLlRlc3RNYXAoKQotICAgIHRleHRfZm9ybWF0LlBhcnNlTGluZXMoZ29sZGVuX2xpbmVzLCBtZXNzYWdlKQotICAgIGNhbmRpZGF0ZSA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQotICAgICMgVGhlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiBlbWl0cyAiMS4wIiBmb3IgdGhlIGRvdWJsZSB2YWx1ZSB0aGF0IHRoZSBDKysKLSAgICAjIGltcGxlbWVudGF0aW9uIGVtaXRzIGFzICIxIi4KLSAgICBjYW5kaWRhdGUgPSBjYW5kaWRhdGUucmVwbGFjZSgnMS4wJywgJzEnLCAyKQotICAgIHNlbGYuYXNzZXJ0TXVsdGlMaW5lRXF1YWwoY2FuZGlkYXRlLCAnJy5qb2luKGdvbGRlbl9saW5lcykpCi0KLQotIyBUZXN0cyBvZiBwcm90bzItb25seSBmZWF0dXJlcyAoTWVzc2FnZVNldCwgZXh0ZW5zaW9ucywgZXRjLikuCi1jbGFzcyBQcm90bzJUZXN0cyhUZXh0Rm9ybWF0QmFzZSk6Ci0KLSAgZGVmIHRlc3RQcmludE1lc3NhZ2VTZXQoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKLSAgICBleHQxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotICAgIGV4dDIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkgPSAyMwotICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIgPSAnZm9vJwotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpLAotICAgICAgICAnbWVzc2FnZV9zZXQge1xuJwotICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4nCi0gICAgICAgICcgICAgaTogMjNcbicKLSAgICAgICAgJyAgfVxuJwotICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4nCi0gICAgICAgICcgICAgc3RyOiBcImZvb1wiXG4nCi0gICAgICAgICcgIH1cbicKLSAgICAgICAgJ31cbicpCi0KLSAgICBtZXNzYWdlID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXQoKQotICAgIGV4dCA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbjMKLSAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZXh0XS50ZXh0ID0gJ2JhcicKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCi0gICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSwKLSAgICAgICAgJ1tnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24zXSB7XG4nCi0gICAgICAgICcgIHRleHQ6IFwiYmFyXCJcbicKLSAgICAgICAgJ31cbicpCi0KLSAgZGVmIHRlc3RQcmludE1lc3NhZ2VTZXRCeUZpZWxkTnVtYmVyKHNlbGYpOgotICAgIG91dCA9IHRleHRfZm9ybWF0LlRleHRXcml0ZXIoRmFsc2UpCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKLSAgICBleHQxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotICAgIGV4dDIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkgPSAyMwotICAgIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIgPSAnZm9vJwotICAgIHRleHRfZm9ybWF0LlByaW50TWVzc2FnZShtZXNzYWdlLCBvdXQsIHVzZV9maWVsZF9udW1iZXI9VHJ1ZSkKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCi0gICAgICAgIG91dC5nZXR2YWx1ZSgpLAotICAgICAgICAnMSB7XG4nCi0gICAgICAgICcgIDE1NDUwMDgge1xuJwotICAgICAgICAnICAgIDE1OiAyM1xuJwotICAgICAgICAnICB9XG4nCi0gICAgICAgICcgIDE1NDc3Njkge1xuJwotICAgICAgICAnICAgIDI1OiBcImZvb1wiXG4nCi0gICAgICAgICcgIH1cbicKLSAgICAgICAgJ31cbicpCi0gICAgb3V0LmNsb3NlKCkKLQotICBkZWYgdGVzdFByaW50TWVzc2FnZVNldEFzT25lTGluZShzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQotICAgIGV4dDEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgZXh0MiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0MV0uaSA9IDIzCi0gICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0ciA9ICdmb28nCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAotICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSksCi0gICAgICAgICdtZXNzYWdlX3NldCB7JwotICAgICAgICAnIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHsnCi0gICAgICAgICcgaTogMjMnCi0gICAgICAgICcgfScKLSAgICAgICAgJyBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7JwotICAgICAgICAnIHN0cjogXCJmb29cIicKLSAgICAgICAgJyB9JwotICAgICAgICAnIH0nKQotCi0gIGRlZiB0ZXN0UGFyc2VNZXNzYWdlU2V0KHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gKCdyZXBlYXRlZF91aW50NjQ6IDFcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF91aW50NjQ6IDJcbicpCi0gICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMV0pCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQotICAgIHRleHQgPSAoJ21lc3NhZ2Vfc2V0IHtcbicKLSAgICAgICAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbicKLSAgICAgICAgICAgICcgICAgaTogMjNcbicKLSAgICAgICAgICAgICcgIH1cbicKLSAgICAgICAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHtcbicKLSAgICAgICAgICAgICcgICAgc3RyOiBcImZvb1wiXG4nCi0gICAgICAgICAgICAnICB9XG4nCi0gICAgICAgICAgICAnfVxuJykKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQotICAgIGV4dDEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgZXh0MiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0MV0uaSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0Ml0uc3RyKQotCi0gIGRlZiB0ZXN0UGFyc2VNZXNzYWdlQnlGaWVsZE51bWJlcihzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICgnMzQ6IDFcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF91aW50NjQ6IDJcbicpCi0gICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSwgYWxsb3dfZmllbGRfbnVtYmVyPVRydWUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NFswXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzFdKQotCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKLSAgICB0ZXh0ID0gKCcxIHtcbicKLSAgICAgICAgICAgICcgIDE1NDUwMDgge1xuJwotICAgICAgICAgICAgJyAgICAxNTogMjNcbicKLSAgICAgICAgICAgICcgIH1cbicKLSAgICAgICAgICAgICcgIDE1NDc3Njkge1xuJwotICAgICAgICAgICAgJyAgICAyNTogXCJmb29cIlxuJwotICAgICAgICAgICAgJyAgfVxuJwotICAgICAgICAgICAgJ31cbicpCi0gICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSwgYWxsb3dfZmllbGRfbnVtYmVyPVRydWUpCi0gICAgZXh0MSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBleHQyID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQxXS5pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIpCi0KLSAgICAjIENhbid0IHBhcnNlIGZpZWxkIG51bWJlciB3aXRob3V0IHNldCBhbGxvd19maWVsZF9udW1iZXI9VHJ1ZS4KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICczNDoxXG4nCi0gICAgc2l4LmFzc2VydFJhaXNlc1JlZ2V4KAotICAgICAgICBzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAocicxOjEgOiBNZXNzYWdlIHR5cGUgIlx3Ky5UZXN0QWxsVHlwZXMiIGhhcyBubyBmaWVsZCBuYW1lZCAnCi0gICAgICAgICByJyIzNCIuJyksCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotCi0gICAgIyBDYW4ndCBwYXJzZSBpZiBmaWVsZCBudW1iZXIgaXMgbm90IGZvdW5kLgotICAgIHRleHQgPSAnMTIzNDoxXG4nCi0gICAgc2l4LmFzc2VydFJhaXNlc1JlZ2V4KAotICAgICAgICBzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAocicxOjEgOiBNZXNzYWdlIHR5cGUgIlx3Ky5UZXN0QWxsVHlwZXMiIGhhcyBubyBmaWVsZCBuYW1lZCAnCi0gICAgICAgICByJyIxMjM0Ii4nKSwKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UsIGFsbG93X2ZpZWxkX251bWJlcj1UcnVlKQotCi0gIGRlZiB0ZXN0UHJpbnRBbGxFeHRlbnNpb25zKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAotICAgICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSksCi0gICAgICAgICd0ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0JykKLQotICBkZWYgdGVzdFByaW50QWxsRXh0ZW5zaW9uc1BvaW50eShzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuRmlsZSgKLSAgICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoCi0gICAgICAgICAgICBtZXNzYWdlLCBwb2ludHlfYnJhY2tldHM9VHJ1ZSkpLAotICAgICAgICAndGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhX3BvaW50eS50eHQnKQotCi0gIGRlZiB0ZXN0UGFyc2VHb2xkZW5FeHRlbnNpb25zKHNlbGYpOgotICAgIGdvbGRlbl90ZXh0ID0gJ1xuJy5qb2luKHNlbGYuUmVhZEdvbGRlbigKLSAgICAgICAgJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQnKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgdGV4dF9mb3JtYXQuUGFyc2UoZ29sZGVuX3RleHQsIHBhcnNlZF9tZXNzYWdlKQotCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0UGFyc2VBbGxFeHRlbnNpb25zKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpCi0gICAgYXNjaWlfdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQotCi0gICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHRleHRfZm9ybWF0LlBhcnNlKGFzY2lpX3RleHQsIHBhcnNlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJzZUFsbG93ZWRVbmtub3duRXh0ZW5zaW9uKHNlbGYpOgotICAgICMgU2tpcCBvdmVyIHVua25vd24gZXh0ZW5zaW9uIGNvcnJlY3RseS4KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQotICAgIHRleHQgPSAoJ21lc3NhZ2Vfc2V0IHtcbicKLSAgICAgICAgICAgICcgIFt1bmtub3duX2V4dGVuc2lvbl0ge1xuJwotICAgICAgICAgICAgJyAgICBpOiAyM1xuJwotICAgICAgICAgICAgJyAgICBiaW46ICJceGUwIicKLSAgICAgICAgICAgICcgICAgW25lc3RlZF91bmtub3duX2V4dF06IHtcbicKLSAgICAgICAgICAgICcgICAgICBpOiAyM1xuJwotICAgICAgICAgICAgJyAgICAgIHRlc3Q6ICJ0ZXN0X3N0cmluZyJcbicKLSAgICAgICAgICAgICcgICAgICBmbG9hdHlfZmxvYXQ6IC0wLjMxNVxuJwotICAgICAgICAgICAgJyAgICAgIG51bTogLWluZlxuJwotICAgICAgICAgICAgJyAgICAgIG11bHRpbGluZV9zdHI6ICJhYmMiXG4nCi0gICAgICAgICAgICAnICAgICAgICAgICJkZWYiXG4nCi0gICAgICAgICAgICAnICAgICAgICAgICJ4eXouIlxuJwotICAgICAgICAgICAgJyAgICAgIFtuZXN0ZWRfdW5rbm93bl9leHRdOiA8XG4nCi0gICAgICAgICAgICAnICAgICAgICBpOiAyM1xuJwotICAgICAgICAgICAgJyAgICAgICAgaTogMjRcbicKLSAgICAgICAgICAgICcgICAgICAgIHBvaW50ZmxvYXQ6IC4zXG4nCi0gICAgICAgICAgICAnICAgICAgICB0ZXN0OiAidGVzdF9zdHJpbmciXG4nCi0gICAgICAgICAgICAnICAgICAgICBmbG9hdHlfZmxvYXQ6IC0wLjMxNVxuJwotICAgICAgICAgICAgJyAgICAgICAgbnVtOiAtaW5mXG4nCi0gICAgICAgICAgICAnICAgICAgICBsb25nX3N0cmluZzogInRlc3QiICJ0ZXN0MiIgXG4nCi0gICAgICAgICAgICAnICAgICAgPlxuJwotICAgICAgICAgICAgJyAgICB9XG4nCi0gICAgICAgICAgICAnICB9XG4nCi0gICAgICAgICAgICAnICBbdW5rbm93bl9leHRlbnNpb25dOiA1XG4nCi0gICAgICAgICAgICAnfVxuJykKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlLCBhbGxvd191bmtub3duX2V4dGVuc2lvbj1UcnVlKQotICAgIGdvbGRlbiA9ICdtZXNzYWdlX3NldCB7XG59XG4nCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSwgZ29sZGVuKQotCi0gICAgIyBDYXRjaCBwYXJzZSBlcnJvcnMgaW4gdW5rbm93biBleHRlbnNpb24uCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKLSAgICBtYWxmb3JtZWQgPSAoJ21lc3NhZ2Vfc2V0IHtcbicKLSAgICAgICAgICAgICAgICAgJyAgW3Vua25vd25fZXh0ZW5zaW9uXSB7XG4nCi0gICAgICAgICAgICAgICAgICcgICAgaTpcbicgICMgTWlzc2luZyB2YWx1ZS4KLSAgICAgICAgICAgICAgICAgJyAgfVxuJwotICAgICAgICAgICAgICAgICAnfVxuJykKLSAgICBzaXguYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJ0ludmFsaWQgZmllbGQgdmFsdWU6IH0nLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgbWFsZm9ybWVkLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbj1UcnVlKQotCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKLSAgICBtYWxmb3JtZWQgPSAoJ21lc3NhZ2Vfc2V0IHtcbicKLSAgICAgICAgICAgICAgICAgJyAgW3Vua25vd25fZXh0ZW5zaW9uXSB7XG4nCi0gICAgICAgICAgICAgICAgICcgICAgc3RyOiAibWFsZm9ybWVkIHN0cmluZ1xuJyAgIyBNaXNzaW5nIGNsb3NpbmcgcXVvdGUuCi0gICAgICAgICAgICAgICAgICcgIH1cbicKLSAgICAgICAgICAgICAgICAgJ31cbicpCi0gICAgc2l4LmFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICdJbnZhbGlkIGZpZWxkIHZhbHVlOiAiJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIG1hbGZvcm1lZCwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb249VHJ1ZSkKLQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldENvbnRhaW5lcigpCi0gICAgbWFsZm9ybWVkID0gKCdtZXNzYWdlX3NldCB7XG4nCi0gICAgICAgICAgICAgICAgICcgIFt1bmtub3duX2V4dGVuc2lvbl0ge1xuJwotICAgICAgICAgICAgICAgICAnICAgIHN0cjogIm1hbGZvcm1lZFxuIG11bHRpbGluZVxuIHN0cmluZ1xuJwotICAgICAgICAgICAgICAgICAnICB9XG4nCi0gICAgICAgICAgICAgICAgICd9XG4nKQotICAgIHNpeC5hc3NlcnRSYWlzZXNSZWdleChzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnSW52YWxpZCBmaWVsZCB2YWx1ZTogIicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlLCBtYWxmb3JtZWQsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPVRydWUpCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQotICAgIG1hbGZvcm1lZCA9ICgnbWVzc2FnZV9zZXQge1xuJwotICAgICAgICAgICAgICAgICAnICBbbWFsZm9ybWVkX2V4dGVuc2lvbl0gPFxuJwotICAgICAgICAgICAgICAgICAnICAgIGk6IC01XG4nCi0gICAgICAgICAgICAgICAgICcgIFxuJyAgIyBNaXNzaW5nICc+JyBoZXJlLgotICAgICAgICAgICAgICAgICAnfVxuJykKLSAgICBzaXguYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJzU6MSA6IEV4cGVjdGVkICI+Ii4nLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgbWFsZm9ybWVkLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbj1UcnVlKQotCi0gICAgIyBEb24ndCBhbGxvdyB1bmtub3duIGZpZWxkcyB3aXRoIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPVRydWUuCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKLSAgICBtYWxmb3JtZWQgPSAoJ21lc3NhZ2Vfc2V0IHtcbicKLSAgICAgICAgICAgICAgICAgJyAgdW5rbm93bl9maWVsZDogdHJ1ZVxuJwotICAgICAgICAgICAgICAgICAnICBcbicgICMgTWlzc2luZyAnPicgaGVyZS4KLSAgICAgICAgICAgICAgICAgJ31cbicpCi0gICAgc2l4LmFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICgnMjozIDogTWVzc2FnZSB0eXBlICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcicHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQiIGhhcyBubycKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICcgZmllbGQgbmFtZWQgInVua25vd25fZmllbGQiLicpLAotICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgbWFsZm9ybWVkLCBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2V4dGVuc2lvbj1UcnVlKQotCi0gICAgIyBQYXJzZSBrbm93biBleHRlbnNpb24gY29ycmVjdHkuCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0Q29udGFpbmVyKCkKLSAgICB0ZXh0ID0gKCdtZXNzYWdlX3NldCB7XG4nCi0gICAgICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4nCi0gICAgICAgICAgICAnICAgIGk6IDIzXG4nCi0gICAgICAgICAgICAnICB9XG4nCi0gICAgICAgICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4nCi0gICAgICAgICAgICAnICAgIHN0cjogXCJmb29cIlxuJwotICAgICAgICAgICAgJyAgfVxuJwotICAgICAgICAgICAgJ31cbicpCi0gICAgdGV4dF9mb3JtYXQuUGFyc2UodGV4dCwgbWVzc2FnZSwgYWxsb3dfdW5rbm93bl9leHRlbnNpb249VHJ1ZSkKLSAgICBleHQxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotICAgIGV4dDIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0cikKLQotICBkZWYgdGVzdFBhcnNlQmFkRXh0ZW5zaW9uKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHRleHQgPSAnW3Vua25vd25fZXh0ZW5zaW9uXTogOFxuJwotICAgIHNpeC5hc3NlcnRSYWlzZXNSZWdleChzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAnMToyIDogRXh0ZW5zaW9uICJ1bmtub3duX2V4dGVuc2lvbiIgbm90IHJlZ2lzdGVyZWQuJywKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNpeC5hc3NlcnRSYWlzZXNSZWdleChzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAoJzE6MiA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiBkb2VzIG5vdCBoYXZlICcKLSAgICAgICAgICdleHRlbnNpb25zLicpLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdE1lcmdlRHVwbGljYXRlRXh0ZW5zaW9uU2NhbGFycyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXh0ID0gKCdbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogNDIgJwotICAgICAgICAgICAgJ1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dOiA2NycpCi0gICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICA2NywKLSAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dKQotCi0gIGRlZiB0ZXN0UGFyc2VEdXBsaWNhdGVFeHRlbnNpb25TY2FsYXJzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHRleHQgPSAoJ1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dOiA0MiAnCi0gICAgICAgICAgICAnW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl06IDY3JykKLSAgICBzaXguYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgKCcxOjk2IDogTWVzc2FnZSB0eXBlICJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsRXh0ZW5zaW9ucyIgJwotICAgICAgICAgJ3Nob3VsZCBub3QgaGF2ZSBtdWx0aXBsZSAnCi0gICAgICAgICAnInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIgZXh0ZW5zaW9ucy4nKSwKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0KLSAgZGVmIHRlc3RQYXJzZUR1cGxpY2F0ZU5lc3RlZE1lc3NhZ2VTY2FsYXJzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAxIH0gJwotICAgICAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgYmI6IDIgfScpCi0gICAgc2l4LmFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICgnMTo2NSA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UiICcKLSAgICAgICAgICdzaG91bGQgbm90IGhhdmUgbXVsdGlwbGUgImJiIiBmaWVsZHMuJyksCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlLCB0ZXh0LCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0UGFyc2VEdXBsaWNhdGVTY2FsYXJzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gKCdvcHRpb25hbF9pbnQzMjogNDIgJwotICAgICAgICAgICAgJ29wdGlvbmFsX2ludDMyOiA2NycpCi0gICAgc2l4LmFzc2VydFJhaXNlc1JlZ2V4KHNlbGYsCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICgnMTozNiA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiBzaG91bGQgbm90ICcKLSAgICAgICAgICdoYXZlIG11bHRpcGxlICJvcHRpb25hbF9pbnQzMiIgZmllbGRzLicpLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdFBhcnNlR3JvdXBOb3RDbG9zZWQoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRleHQgPSAnUmVwZWF0ZWRHcm91cDogPCcKLSAgICBzaXguYXNzZXJ0UmFpc2VzUmVnZXgoc2VsZiwKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgJzE6MTYgOiBFeHBlY3RlZCAiPiIuJywKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2UsIHRleHQsIG1lc3NhZ2UpCi0gICAgdGV4dCA9ICdSZXBlYXRlZEdyb3VwOiB7JwotICAgIHNpeC5hc3NlcnRSYWlzZXNSZWdleChzZWxmLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCAnMToxNiA6IEV4cGVjdGVkICJ9Ii4nLAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdFBhcnNlRW1wdHlHcm91cChzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICdPcHRpb25hbEdyb3VwOiB7fScKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCi0KLSAgICBtZXNzYWdlLkNsZWFyKCkKLQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJ09wdGlvbmFsR3JvdXA6IDw+JwotICAgIHRleHRfZm9ybWF0LlBhcnNlKHRleHQsIG1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKLQotICAjIE1hcHMgYXJlbid0IHJlYWxseSBwcm90bzItb25seSwgYnV0IG91ciB0ZXN0IHNjaGVtYSBvbmx5IGhhcyBtYXBzIGZvcgotICAjIHByb3RvMi4KLSAgZGVmIHRlc3RQYXJzZU1hcChzZWxmKToKLSAgICB0ZXh0ID0gKCdtYXBfaW50MzJfaW50MzIge1xuJwotICAgICAgICAgICAgJyAga2V5OiAtMTIzXG4nCi0gICAgICAgICAgICAnICB2YWx1ZTogLTQ1NlxuJwotICAgICAgICAgICAgJ31cbicKLSAgICAgICAgICAgICdtYXBfaW50NjRfaW50NjQge1xuJwotICAgICAgICAgICAgJyAga2V5OiAtODU4OTkzNDU5MlxuJwotICAgICAgICAgICAgJyAgdmFsdWU6IC0xNzE3OTg2OTE4NFxuJwotICAgICAgICAgICAgJ31cbicKLSAgICAgICAgICAgICdtYXBfdWludDMyX3VpbnQzMiB7XG4nCi0gICAgICAgICAgICAnICBrZXk6IDEyM1xuJwotICAgICAgICAgICAgJyAgdmFsdWU6IDQ1NlxuJwotICAgICAgICAgICAgJ31cbicKLSAgICAgICAgICAgICdtYXBfdWludDY0X3VpbnQ2NCB7XG4nCi0gICAgICAgICAgICAnICBrZXk6IDg1ODk5MzQ1OTJcbicKLSAgICAgICAgICAgICcgIHZhbHVlOiAxNzE3OTg2OTE4NFxuJwotICAgICAgICAgICAgJ31cbicKLSAgICAgICAgICAgICdtYXBfc3RyaW5nX3N0cmluZyB7XG4nCi0gICAgICAgICAgICAnICBrZXk6ICJhYmMiXG4nCi0gICAgICAgICAgICAnICB2YWx1ZTogIjEyMyJcbicKLSAgICAgICAgICAgICd9XG4nCi0gICAgICAgICAgICAnbWFwX2ludDMyX2ZvcmVpZ25fbWVzc2FnZSB7XG4nCi0gICAgICAgICAgICAnICBrZXk6IDExMVxuJwotICAgICAgICAgICAgJyAgdmFsdWUge1xuJwotICAgICAgICAgICAgJyAgICBjOiA1XG4nCi0gICAgICAgICAgICAnICB9XG4nCi0gICAgICAgICAgICAnfVxuJykKLSAgICBtZXNzYWdlID0gbWFwX3VuaXR0ZXN0X3BiMi5UZXN0TWFwKCkKLSAgICB0ZXh0X2Zvcm1hdC5QYXJzZSh0ZXh0LCBtZXNzYWdlKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtNDU2LCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMlstMTIzXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0yKiozNCwgbWVzc2FnZS5tYXBfaW50NjRfaW50NjRbLTIqKjMzXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQ1NiwgbWVzc2FnZS5tYXBfdWludDMyX3VpbnQzMlsxMjNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMioqMzQsIG1lc3NhZ2UubWFwX3VpbnQ2NF91aW50NjRbMioqMzNdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoIjEyMyIsIG1lc3NhZ2UubWFwX3N0cmluZ19zdHJpbmdbImFiYyJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgbWVzc2FnZS5tYXBfaW50MzJfZm9yZWlnbl9tZXNzYWdlWzExMV0uYykKLQotCi1jbGFzcyBUb2tlbml6ZXJUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgdGVzdFNpbXBsZVRva2VuQ2FzZXMoc2VsZik6Ci0gICAgdGV4dCA9ICgnaWRlbnRpZmllcjE6InN0cmluZzEiXG4gICAgIFxuXG4nCi0gICAgICAgICAgICAnaWRlbnRpZmllcjIgOiBcbiBcbjEyMyAgXG4gIGlkZW50aWZpZXIzIDpcJ3N0cmluZ1wnXG4nCi0gICAgICAgICAgICAnaWRlbnRpZmlFUl80IDogMS4xZSsyIElENTotMC4yMyBJRDY6XCdhYWFhXFxcJ2JiYmJcJ1xuJwotICAgICAgICAgICAgJ0lENyA6ICJhYVxcImJiIlxuXG5cblxuIElEODoge0E6aW5mIEI6LWluZiBDOnRydWUgRDpmYWxzZX1cbicKLSAgICAgICAgICAgICdJRDk6IDIyIElEMTA6IC0xMTExMTExMTExMTExMTExMTEgSUQxMTogLTIyXG4nCi0gICAgICAgICAgICAnSUQxMjogMjIyMjIyMjIyMjIyMjIyMjIyMiBJRDEzOiAxLjIzNDU2ZiBJRDE0OiAxLjJlKzJmICcKLSAgICAgICAgICAgICdmYWxzZV9ib29sOiAgMCB0cnVlX0JPT0w6dCBcbiB0cnVlX2Jvb2wxOiAgMSBmYWxzZV9CT09MMTpmICcpCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKLSAgICBtZXRob2RzID0gWyh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdpZGVudGlmaWVyMScpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lU3RyaW5nLCAnc3RyaW5nMScpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpZXIyJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJbnQzMiwgMTIzKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdpZGVudGlmaWVyMycpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lU3RyaW5nLCAnc3RyaW5nJyksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnaWRlbnRpZmlFUl80JyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVGbG9hdCwgMS4xZSsyKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDUnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCAtMC4yMyksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQ2JyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVTdHJpbmcsICdhYWFhXCdiYmJiJyksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQ3JyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVTdHJpbmcsICdhYVwiYmInKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDgnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICd7JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdBJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVGbG9hdCwgZmxvYXQoJ2luZicpKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdCJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVGbG9hdCwgLWZsb2F0KCdpbmYnKSksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnQycpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgVHJ1ZSksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnRCcpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgRmFsc2UpLAotICAgICAgICAgICAgICAgJ30nLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEOScpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lVWludDMyLCAyMiksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQxMCcpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSW50NjQsIC0xMTExMTExMTExMTExMTExMTEpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEMTEnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUludDMyLCAtMjIpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEMTInKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCwgMjIyMjIyMjIyMjIyMjIyMjIyMiksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQxMycpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIDEuMjM0NTYpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEMTQnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCAxLjJlKzIpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2ZhbHNlX2Jvb2wnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIEZhbHNlKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICd0cnVlX0JPT0wnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIFRydWUpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ3RydWVfYm9vbDEnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUJvb2wsIFRydWUpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2ZhbHNlX0JPT0wxJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBGYWxzZSldCi0KLSAgICBpID0gMAotICAgIHdoaWxlIG5vdCB0b2tlbml6ZXIuQXRFbmQoKToKLSAgICAgIG0gPSBtZXRob2RzW2ldCi0gICAgICBpZiB0eXBlKG0pID09IHN0cjoKLSAgICAgICAgdG9rZW4gPSB0b2tlbml6ZXIudG9rZW4KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0b2tlbiwgbSkKLSAgICAgICAgdG9rZW5pemVyLk5leHRUb2tlbigpCi0gICAgICBlbHNlOgotICAgICAgICBzZWxmLmFzc2VydEVxdWFsKG1bMV0sIG1bMF0oKSkKLSAgICAgIGkgKz0gMQotCi0gIGRlZiB0ZXN0Q29uc3VtZUludGVnZXJzKHNlbGYpOgotICAgICMgVGhpcyB0ZXN0IG9ubHkgdGVzdHMgdGhlIGZhaWx1cmVzIGluIHRoZSBpbnRlZ2VyIHBhcnNpbmcgbWV0aG9kcyBhcyB3ZWxsCi0gICAgIyBhcyB0aGUgJzAnIHNwZWNpYWwgY2FzZXMuCi0gICAgaW50NjRfbWF4ID0gKDEgPDwgNjMpIC0gMQotICAgIHVpbnQzMl9tYXggPSAoMSA8PCAzMikgLSAxCi0gICAgdGV4dCA9ICctMSAlZCAlZCcgJSAodWludDMyX21heCArIDEsIGludDY0X21heCArIDEpCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMikKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCB0b2tlbml6ZXIuQ29uc3VtZUludDMyKCkpCi0KLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMikKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodWludDMyX21heCArIDEsIHRva2VuaXplci5Db25zdW1lSW50NjQoKSkKLQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lSW50NjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChpbnQ2NF9tYXggKyAxLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCgpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2tlbml6ZXIuQXRFbmQoKSkKLQotICAgIHRleHQgPSAnLTAgLTAgMCAwJwotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dC5zcGxpdGxpbmVzKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9rZW5pemVyLkNvbnN1bWVVaW50NjQoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRva2VuaXplci5Db25zdW1lVWludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCgpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2tlbml6ZXIuQXRFbmQoKSkKLQotICBkZWYgdGVzdENvbnN1bWVCeXRlU3RyaW5nKHNlbGYpOgotICAgIHRleHQgPSAnInN0cmluZzFcJycKLSAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQuc3BsaXRsaW5lcygpKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQnl0ZVN0cmluZykKLQotICAgIHRleHQgPSAnc3RyaW5nMSInCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCi0KLSAgICB0ZXh0ID0gJ1xuIlxceHQiJwotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dC5zcGxpdGxpbmVzKCkpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKQotCi0gICAgdGV4dCA9ICdcbiJcXCInCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCi0KLSAgICB0ZXh0ID0gJ1xuIlxceCInCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCi0KLSAgZGVmIHRlc3RDb25zdW1lQm9vbChzZWxmKToKLSAgICB0ZXh0ID0gJ25vdC1hLWJvb2wnCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0LnNwbGl0bGluZXMoKSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJvb2wpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3R5cGVfY2hlY2tlcnMucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3R5cGVfY2hlY2tlcnMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFiZTNhZDkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90eXBlX2NoZWNrZXJzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzUyICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiUHJvdmlkZXMgdHlwZSBjaGVja2luZyByb3V0aW5lcy4KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyB0eXBlIGNoZWNraW5nIHV0aWxpdGllcyBpbiB0aGUgZm9ybXMgb2YgZGljdGlvbmFyaWVzOgotCi1WQUxVRV9DSEVDS0VSUzogQSBkaWN0aW9uYXJ5IG9mIGZpZWxkIHR5cGVzIGFuZCBhIHZhbHVlIHZhbGlkYXRpb24gb2JqZWN0LgotVFlQRV9UT19CWVRFX1NJWkVfRk46IEEgZGljdGlvbmFyeSB3aXRoIGZpZWxkIHR5cGVzIGFuZCBhIHNpemUgY29tcHV0aW5nCi0gIGZ1bmN0aW9uLgotVFlQRV9UT19TRVJJQUxJWkVfTUVUSE9EOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlcyBhbmQgc2VyaWFsaXphdGlvbgotICBmdW5jdGlvbi4KLUZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlZCBhbmQgdGhlaXIKLSAgY29yZXNwb25kaW5nIHdpcmUgdHlwZXMuCi1UWVBFX1RPX0RFU0VSSUFMSVpFX01FVEhPRDogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZXMgYW5kIGRlc2VyaWFsaXphdGlvbgotICBmdW5jdGlvbi4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJwotCi1pbXBvcnQgc2l4Ci0KLWlmIHNpeC5QWTM6Ci0gIGxvbmcgPSBpbnQKLQotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGRlY29kZXIKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbmNvZGVyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCi0KLV9GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcgotCi1kZWYgU3VwcG9ydHNPcGVuRW51bXMoZmllbGRfZGVzY3JpcHRvcik6Ci0gIHJldHVybiBmaWVsZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfdHlwZS5zeW50YXggPT0gInByb3RvMyIKLQotZGVmIEdldFR5cGVDaGVja2VyKGZpZWxkKToKLSAgIiIiUmV0dXJucyBhIHR5cGUgY2hlY2tlciBmb3IgYSBtZXNzYWdlIGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuCi0KLSAgQXJnczoKLSAgICBmaWVsZDogRmllbGREZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhpcyBmaWVsZC4KLQotICBSZXR1cm5zOgotICAgIEFuIGluc3RhbmNlIG9mIFR5cGVDaGVja2VyIHdoaWNoIGNhbiBiZSB1c2VkIHRvIHZlcmlmeSB0aGUgdHlwZXMKLSAgICBvZiB2YWx1ZXMgYXNzaWduZWQgdG8gYSBmaWVsZCBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0gICIiIgotICBpZiAoZmllbGQuY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORyBhbmQKLSAgICAgIGZpZWxkLnR5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORyk6Ci0gICAgcmV0dXJuIFVuaWNvZGVWYWx1ZUNoZWNrZXIoKQotICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRU5VTToKLSAgICBpZiBTdXBwb3J0c09wZW5FbnVtcyhmaWVsZCk6Ci0gICAgICAjIFdoZW4gb3BlbiBlbnVtcyBhcmUgc3VwcG9ydGVkLCBhbnkgaW50MzIgY2FuIGJlIGFzc2lnbmVkLgotICAgICAgcmV0dXJuIF9WQUxVRV9DSEVDS0VSU1tfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UMzJdCi0gICAgZWxzZToKLSAgICAgIHJldHVybiBFbnVtVmFsdWVDaGVja2VyKGZpZWxkLmVudW1fdHlwZSkKLSAgcmV0dXJuIF9WQUxVRV9DSEVDS0VSU1tmaWVsZC5jcHBfdHlwZV0KLQotCi0jIE5vbmUgb2YgdGhlIHR5cGVjaGVja2VycyBiZWxvdyBtYWtlIGFueSBhdHRlbXB0IHRvIGd1YXJkIGFnYWluc3QgcGVvcGxlCi0jIHN1YmNsYXNzaW5nIGJ1aWx0aW4gdHlwZXMgYW5kIGRvaW5nIHdlaXJkIHRoaW5ncy4gIFdlJ3JlIG5vdCB0cnlpbmcgdG8KLSMgcHJvdGVjdCBhZ2FpbnN0IG1hbGljaW91cyBjbGllbnRzIGhlcmUsIGp1c3QgcGVvcGxlIGFjY2lkZW50YWxseSBzaG9vdGluZwotIyB0aGVtc2VsdmVzIGluIHRoZSBmb290IGluIG9idmlvdXMgd2F5cy4KLQotY2xhc3MgVHlwZUNoZWNrZXIob2JqZWN0KToKLQotICAiIiJUeXBlIGNoZWNrZXIgdXNlZCB0byBjYXRjaCB0eXBlIGVycm9ycyBhcyBlYXJseSBhcyBwb3NzaWJsZQotICB3aGVuIHRoZSBjbGllbnQgaXMgc2V0dGluZyBzY2FsYXIgZmllbGRzIGluIHByb3RvY29sIG1lc3NhZ2VzLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgKmFjY2VwdGFibGVfdHlwZXMpOgotICAgIHNlbGYuX2FjY2VwdGFibGVfdHlwZXMgPSBhY2NlcHRhYmxlX3R5cGVzCi0KLSAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgotICAgICIiIlR5cGUgY2hlY2sgdGhlIHByb3ZpZGVkIHZhbHVlIGFuZCByZXR1cm4gaXQuCi0KLSAgICBUaGUgcmV0dXJuZWQgdmFsdWUgbWlnaHQgaGF2ZSBiZWVuIG5vcm1hbGl6ZWQgdG8gYW5vdGhlciB0eXBlLgotICAgICIiIgotICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzKToKLSAgICAgIG1lc3NhZ2UgPSAoJyUuMTAyNHIgaGFzIHR5cGUgJXMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzJyAlCi0gICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSwgdHlwZShwcm9wb3NlZF92YWx1ZSksIHNlbGYuX2FjY2VwdGFibGVfdHlwZXMpKQotICAgICAgcmFpc2UgVHlwZUVycm9yKG1lc3NhZ2UpCi0gICAgcmV0dXJuIHByb3Bvc2VkX3ZhbHVlCi0KLQotY2xhc3MgVHlwZUNoZWNrZXJXaXRoRGVmYXVsdChUeXBlQ2hlY2tlcik6Ci0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGRlZmF1bHRfdmFsdWUsICphY2NlcHRhYmxlX3R5cGVzKToKLSAgICBUeXBlQ2hlY2tlci5fX2luaXRfXyhzZWxmLCBhY2NlcHRhYmxlX3R5cGVzKQotICAgIHNlbGYuX2RlZmF1bHRfdmFsdWUgPSBkZWZhdWx0X3ZhbHVlCi0KLSAgZGVmIERlZmF1bHRWYWx1ZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fZGVmYXVsdF92YWx1ZQotCi0KLSMgSW50VmFsdWVDaGVja2VyIGFuZCBpdHMgc3ViY2xhc3NlcyBwZXJmb3JtIGludGVnZXIgdHlwZS1jaGVja3MKLSMgYW5kIGJvdW5kcy1jaGVja3MuCi1jbGFzcyBJbnRWYWx1ZUNoZWNrZXIob2JqZWN0KToKLQotICAiIiJDaGVja2VyIHVzZWQgZm9yIGludGVnZXIgZmllbGRzLiAgUGVyZm9ybXMgdHlwZS1jaGVjayBhbmQgcmFuZ2UgY2hlY2suIiIiCi0KLSAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCBzaXguaW50ZWdlcl90eXBlcyk6Ci0gICAgICBtZXNzYWdlID0gKCclLjEwMjRyIGhhcyB0eXBlICVzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcycgJQotICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUsIHR5cGUocHJvcG9zZWRfdmFsdWUpLCBzaXguaW50ZWdlcl90eXBlcykpCi0gICAgICByYWlzZSBUeXBlRXJyb3IobWVzc2FnZSkKLSAgICBpZiBub3Qgc2VsZi5fTUlOIDw9IHByb3Bvc2VkX3ZhbHVlIDw9IHNlbGYuX01BWDoKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1ZhbHVlIG91dCBvZiByYW5nZTogJWQnICUgcHJvcG9zZWRfdmFsdWUpCi0gICAgIyBXZSBmb3JjZSAzMi1iaXQgdmFsdWVzIHRvIGludCBhbmQgNjQtYml0IHZhbHVlcyB0byBsb25nIHRvIG1ha2UKLSAgICAjIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMgd2hlcmUgdGhlIGRpc3RpbmN0aW9uIGlzIG1vcmUgc2lnbmlmaWNhbnQKLSAgICAjIChlLmcuIHRoZSBDKysgaW1wbGVtZW50YXRpb24pIHNpbXBsZXIuCi0gICAgcHJvcG9zZWRfdmFsdWUgPSBzZWxmLl9UWVBFKHByb3Bvc2VkX3ZhbHVlKQotICAgIHJldHVybiBwcm9wb3NlZF92YWx1ZQotCi0gIGRlZiBEZWZhdWx0VmFsdWUoc2VsZik6Ci0gICAgcmV0dXJuIDAKLQotCi1jbGFzcyBFbnVtVmFsdWVDaGVja2VyKG9iamVjdCk6Ci0KLSAgIiIiQ2hlY2tlciB1c2VkIGZvciBlbnVtIGZpZWxkcy4gIFBlcmZvcm1zIHR5cGUtY2hlY2sgYW5kIHJhbmdlIGNoZWNrLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBlbnVtX3R5cGUpOgotICAgIHNlbGYuX2VudW1fdHlwZSA9IGVudW1fdHlwZQotCi0gIGRlZiBDaGVja1ZhbHVlKHNlbGYsIHByb3Bvc2VkX3ZhbHVlKToKLSAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgc2l4LmludGVnZXJfdHlwZXMpOgotICAgICAgbWVzc2FnZSA9ICgnJS4xMDI0ciBoYXMgdHlwZSAlcywgYnV0IGV4cGVjdGVkIG9uZSBvZjogJXMnICUKLSAgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3ZhbHVlLCB0eXBlKHByb3Bvc2VkX3ZhbHVlKSwgc2l4LmludGVnZXJfdHlwZXMpKQotICAgICAgcmFpc2UgVHlwZUVycm9yKG1lc3NhZ2UpCi0gICAgaWYgcHJvcG9zZWRfdmFsdWUgbm90IGluIHNlbGYuX2VudW1fdHlwZS52YWx1ZXNfYnlfbnVtYmVyOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcignVW5rbm93biBlbnVtIHZhbHVlOiAlZCcgJSBwcm9wb3NlZF92YWx1ZSkKLSAgICByZXR1cm4gcHJvcG9zZWRfdmFsdWUKLQotICBkZWYgRGVmYXVsdFZhbHVlKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9lbnVtX3R5cGUudmFsdWVzWzBdLm51bWJlcgotCi0KLWNsYXNzIFVuaWNvZGVWYWx1ZUNoZWNrZXIob2JqZWN0KToKLQotICAiIiJDaGVja2VyIHVzZWQgZm9yIHN0cmluZyBmaWVsZHMuCi0KLSAgQWx3YXlzIHJldHVybnMgYSB1bmljb2RlIHZhbHVlLCBldmVuIGlmIHRoZSBpbnB1dCBpcyBvZiB0eXBlIHN0ci4KLSAgIiIiCi0KLSAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCAoYnl0ZXMsIHNpeC50ZXh0X3R5cGUpKToKLSAgICAgIG1lc3NhZ2UgPSAoJyUuMTAyNHIgaGFzIHR5cGUgJXMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzJyAlCi0gICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSwgdHlwZShwcm9wb3NlZF92YWx1ZSksIChieXRlcywgc2l4LnRleHRfdHlwZSkpKQotICAgICAgcmFpc2UgVHlwZUVycm9yKG1lc3NhZ2UpCi0KLSAgICAjIElmIHRoZSB2YWx1ZSBpcyBvZiB0eXBlICdieXRlcycgbWFrZSBzdXJlIHRoYXQgaXQgaXMgdmFsaWQgVVRGLTggZGF0YS4KLSAgICBpZiBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCBieXRlcyk6Ci0gICAgICB0cnk6Ci0gICAgICAgIHByb3Bvc2VkX3ZhbHVlID0gcHJvcG9zZWRfdmFsdWUuZGVjb2RlKCd1dGYtOCcpCi0gICAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCclLjEwMjRyIGhhcyB0eXBlIGJ5dGVzLCBidXQgaXNuXCd0IHZhbGlkIFVURi04ICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAnZW5jb2RpbmcuIE5vbi1VVEYtOCBzdHJpbmdzIG11c3QgYmUgY29udmVydGVkIHRvICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAndW5pY29kZSBvYmplY3RzIGJlZm9yZSBiZWluZyBhZGRlZC4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAocHJvcG9zZWRfdmFsdWUpKQotICAgIHJldHVybiBwcm9wb3NlZF92YWx1ZQotCi0gIGRlZiBEZWZhdWx0VmFsdWUoc2VsZik6Ci0gICAgcmV0dXJuIHUiIgotCi0KLWNsYXNzIEludDMyVmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6Ci0gICMgV2UncmUgc3VyZSB0byB1c2UgaW50cyBpbnN0ZWFkIG9mIGxvbmdzIGhlcmUgc2luY2UgY29tcGFyaXNvbiBtYXkgYmUgbW9yZQotICAjIGVmZmljaWVudC4KLSAgX01JTiA9IC0yMTQ3NDgzNjQ4Ci0gIF9NQVggPSAyMTQ3NDgzNjQ3Ci0gIF9UWVBFID0gaW50Ci0KLQotY2xhc3MgVWludDMyVmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6Ci0gIF9NSU4gPSAwCi0gIF9NQVggPSAoMSA8PCAzMikgLSAxCi0gIF9UWVBFID0gaW50Ci0KLQotY2xhc3MgSW50NjRWYWx1ZUNoZWNrZXIoSW50VmFsdWVDaGVja2VyKToKLSAgX01JTiA9IC0oMSA8PCA2MykKLSAgX01BWCA9ICgxIDw8IDYzKSAtIDEKLSAgX1RZUEUgPSBsb25nCi0KLQotY2xhc3MgVWludDY0VmFsdWVDaGVja2VyKEludFZhbHVlQ2hlY2tlcik6Ci0gIF9NSU4gPSAwCi0gIF9NQVggPSAoMSA8PCA2NCkgLSAxCi0gIF9UWVBFID0gbG9uZwotCi0KLSMgVHlwZS1jaGVja2VycyBmb3IgYWxsIHNjYWxhciBDUFBUWVBFcy4KLV9WQUxVRV9DSEVDS0VSUyA9IHsKLSAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UMzI6IEludDMyVmFsdWVDaGVja2VyKCksCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0lOVDY0OiBJbnQ2NFZhbHVlQ2hlY2tlcigpLAotICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9VSU5UMzI6IFVpbnQzMlZhbHVlQ2hlY2tlcigpLAotICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9VSU5UNjQ6IFVpbnQ2NFZhbHVlQ2hlY2tlcigpLAotICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9ET1VCTEU6IFR5cGVDaGVja2VyV2l0aERlZmF1bHQoCi0gICAgICAgIDAuMCwgZmxvYXQsIGludCwgbG9uZyksCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0ZMT0FUOiBUeXBlQ2hlY2tlcldpdGhEZWZhdWx0KAotICAgICAgICAwLjAsIGZsb2F0LCBpbnQsIGxvbmcpLAotICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9CT09MOiBUeXBlQ2hlY2tlcldpdGhEZWZhdWx0KAotICAgICAgICBGYWxzZSwgYm9vbCwgaW50KSwKLSAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HOiBUeXBlQ2hlY2tlcldpdGhEZWZhdWx0KGInJywgYnl0ZXMpLAotICAgIH0KLQotCi0jIE1hcCBmcm9tIGZpZWxkIHR5cGUgdG8gYSBmdW5jdGlvbiBGLCBzdWNoIHRoYXQgRihmaWVsZF9udW0sIHZhbHVlKQotIyBnaXZlcyB0aGUgdG90YWwgYnl0ZSBzaXplIGZvciBhIHZhbHVlIG9mIHRoZSBnaXZlbiB0eXBlLiAgVGhpcwotIyBieXRlIHNpemUgaW5jbHVkZXMgdGFnIGluZm9ybWF0aW9uIGFuZCBhbnkgb3RoZXIgYWRkaXRpb25hbCBzcGFjZQotIyBhc3NvY2lhdGVkIHdpdGggc2VyaWFsaXppbmcgInZhbHVlIi4KLVRZUEVfVE9fQllURV9TSVpFX0ZOID0gewotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IHdpcmVfZm9ybWF0LkRvdWJsZUJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogd2lyZV9mb3JtYXQuRmxvYXRCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IHdpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NDogd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiB3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiB3aXJlX2Zvcm1hdC5GaXhlZDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IHdpcmVfZm9ybWF0LkZpeGVkMzJCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogd2lyZV9mb3JtYXQuQm9vbEJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6IHdpcmVfZm9ybWF0LlN0cmluZ0J5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogd2lyZV9mb3JtYXQuR3JvdXBCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogd2lyZV9mb3JtYXQuTWVzc2FnZUJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzogd2lyZV9mb3JtYXQuQnl0ZXNCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDMyOiB3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IHdpcmVfZm9ybWF0LlNGaXhlZDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUKLSAgICB9Ci0KLQotIyBNYXBzIGZyb20gZmllbGQgdHlwZXMgdG8gZW5jb2RlciBjb25zdHJ1Y3RvcnMuCi1UWVBFX1RPX0VOQ09ERVIgPSB7Ci0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogZW5jb2Rlci5Eb3VibGVFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogZW5jb2Rlci5GbG9hdEVuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiBlbmNvZGVyLkludDY0RW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiBlbmNvZGVyLlVJbnQ2NEVuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiBlbmNvZGVyLkludDMyRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogZW5jb2Rlci5GaXhlZDY0RW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogZW5jb2Rlci5GaXhlZDMyRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogZW5jb2Rlci5Cb29sRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOiBlbmNvZGVyLlN0cmluZ0VuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiBlbmNvZGVyLkdyb3VwRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogZW5jb2Rlci5NZXNzYWdlRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6IGVuY29kZXIuQnl0ZXNFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IGVuY29kZXIuVUludDMyRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogZW5jb2Rlci5FbnVtRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IGVuY29kZXIuU0ZpeGVkMzJFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogZW5jb2Rlci5TRml4ZWQ2NEVuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogZW5jb2Rlci5TSW50MzJFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IGVuY29kZXIuU0ludDY0RW5jb2RlciwKLSAgICB9Ci0KLQotIyBNYXBzIGZyb20gZmllbGQgdHlwZXMgdG8gc2l6ZXIgY29uc3RydWN0b3JzLgotVFlQRV9UT19TSVpFUiA9IHsKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiBlbmNvZGVyLkRvdWJsZVNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogZW5jb2Rlci5GbG9hdFNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogZW5jb2Rlci5JbnQ2NFNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IGVuY29kZXIuVUludDY0U2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiBlbmNvZGVyLkludDMyU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IGVuY29kZXIuRml4ZWQ2NFNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiBlbmNvZGVyLkZpeGVkMzJTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogZW5jb2Rlci5Cb29sU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzogZW5jb2Rlci5TdHJpbmdTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IGVuY29kZXIuR3JvdXBTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogZW5jb2Rlci5NZXNzYWdlU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOiBlbmNvZGVyLkJ5dGVzU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogZW5jb2Rlci5VSW50MzJTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogZW5jb2Rlci5FbnVtU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiBlbmNvZGVyLlNGaXhlZDMyU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiBlbmNvZGVyLlNGaXhlZDY0U2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogZW5jb2Rlci5TSW50MzJTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0OiBlbmNvZGVyLlNJbnQ2NFNpemVyLAotICAgIH0KLQotCi0jIE1hcHMgZnJvbSBmaWVsZCB0eXBlIHRvIGEgZGVjb2RlciBjb25zdHJ1Y3Rvci4KLVRZUEVfVE9fREVDT0RFUiA9IHsKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiBkZWNvZGVyLkRvdWJsZURlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUOiBkZWNvZGVyLkZsb2F0RGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IGRlY29kZXIuSW50NjREZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IGRlY29kZXIuVUludDY0RGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzI6IGRlY29kZXIuSW50MzJEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiBkZWNvZGVyLkZpeGVkNjREZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiBkZWNvZGVyLkZpeGVkMzJEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CT09MOiBkZWNvZGVyLkJvb2xEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6IGRlY29kZXIuU3RyaW5nRGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IGRlY29kZXIuR3JvdXBEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOiBkZWNvZGVyLk1lc3NhZ2VEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzogZGVjb2Rlci5CeXRlc0RlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogZGVjb2Rlci5VSW50MzJEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOiBkZWNvZGVyLkVudW1EZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogZGVjb2Rlci5TRml4ZWQzMkRlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiBkZWNvZGVyLlNGaXhlZDY0RGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyOiBkZWNvZGVyLlNJbnQzMkRlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogZGVjb2Rlci5TSW50NjREZWNvZGVyLAotICAgIH0KLQotIyBNYXBzIGZyb20gZmllbGQgdHlwZSB0byBleHBlY3RlZCB3aXJldHlwZS4KLUZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFID0gewotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6Ci0gICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVAsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6Ci0gICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzoKLSAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdW5rbm93bl9maWVsZHNfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdW5rbm93bl9maWVsZHNfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggODQwNzNmMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Vua25vd25fZmllbGRzX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzMjAgKzAsMCBAQAotIyEgL3Vzci9iaW4vZW52IHB5dGhvbgotIyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KLSMKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVGVzdCBmb3IgcHJlc2VydmF0aW9uIG9mIHVua25vd24gZmllbGRzIGluIHRoZSBwdXJlIFB5dGhvbiBpbXBsZW1lbnRhdGlvbi4iIiIKLQotX19hdXRob3JfXyA9ICdib2hkYW5rQGdvb2dsZS5jb20gKEJvaGRhbiBLb3ZhbCknCi0KLXRyeToKLSAgaW1wb3J0IHVuaXR0ZXN0MiBhcyB1bml0dGVzdCAgI1BZMjYKLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfbXNldF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wcm90bzNfYXJlbmFfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW5jb2RlcgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbWlzc2luZ19lbnVtX3ZhbHVlc19wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0ZXN0X3V0aWwKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0eXBlX2NoZWNrZXJzCi0KLQotZGVmIFNraXBJZkNwcEltcGxlbWVudGF0aW9uKGZ1bmMpOgotICByZXR1cm4gdW5pdHRlc3Quc2tpcElmKAotICAgICAgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJyBhbmQgYXBpX2ltcGxlbWVudGF0aW9uLlZlcnNpb24oKSA9PSAyLAotICAgICAgJ0MrKyBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCBleHBvc2UgdW5rbm93biBmaWVsZHMgdG8gUHl0aG9uJykoZnVuYykKLQotCi1jbGFzcyBVbmtub3duRmllbGRzVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHNldFVwKHNlbGYpOgotICAgIHNlbGYuZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUgotICAgIHNlbGYuYWxsX2ZpZWxkcyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoc2VsZi5hbGxfZmllbGRzKQotICAgIHNlbGYuYWxsX2ZpZWxkc19kYXRhID0gc2VsZi5hbGxfZmllbGRzLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmVtcHR5X21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCi0gICAgc2VsZi5lbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzZWxmLmFsbF9maWVsZHNfZGF0YSkKLQotICBkZWYgdGVzdFNlcmlhbGl6ZShzZWxmKToKLSAgICBkYXRhID0gc2VsZi5lbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgICMgRG9uJ3QgdXNlIGFzc2VydEVxdWFsIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0bwotICAgICMgc3Rkb3V0LgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShkYXRhID09IHNlbGYuYWxsX2ZpZWxkc19kYXRhKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplUHJvdG8zKHNlbGYpOgotICAgICMgVmVyaWZ5IHRoYXQgcHJvdG8zIGRvZXNuJ3QgcHJlc2VydmUgdW5rbm93biBmaWVsZHMuCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3Byb3RvM19hcmVuYV9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5hbGxfZmllbGRzX2RhdGEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4obWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKSkKLQotICBkZWYgdGVzdEJ5dGVTaXplKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hbGxfZmllbGRzLkJ5dGVTaXplKCksIHNlbGYuZW1wdHlfbWVzc2FnZS5CeXRlU2l6ZSgpKQotCi0gIGRlZiB0ZXN0TGlzdEZpZWxkcyhzZWxmKToKLSAgICAjIE1ha2Ugc3VyZSBMaXN0RmllbGRzIGRvZXNuJ3QgcmV0dXJuIHVua25vd24gZmllbGRzLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHNlbGYuZW1wdHlfbWVzc2FnZS5MaXN0RmllbGRzKCkpKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplTWVzc2FnZVNldFdpcmVGb3JtYXRVbmtub3duRXh0ZW5zaW9uKHNlbGYpOgotICAgICMgQ3JlYXRlIGEgbWVzc2FnZSB1c2luZyB0aGUgbWVzc2FnZSBzZXQgd2lyZSBmb3JtYXQgd2l0aCBhbiB1bmtub3duCi0gICAgIyBtZXNzYWdlLgotICAgIHJhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQotCi0gICAgIyBBZGQgYW4gdW5rbm93biBleHRlbnNpb24uCi0gICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCi0gICAgaXRlbS50eXBlX2lkID0gOTg0MTg2MDMKLSAgICBtZXNzYWdlMSA9IG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbnNfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpCi0gICAgbWVzc2FnZTEuaSA9IDEyMzQ1Ci0gICAgaXRlbS5tZXNzYWdlID0gbWVzc2FnZTEuU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgc2VyaWFsaXplZCA9IHJhdy5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICAjIFBhcnNlIG1lc3NhZ2UgdXNpbmcgdGhlIG1lc3NhZ2Ugc2V0IHdpcmUgZm9ybWF0LgotICAgIHByb3RvID0gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uc19wYjIuVGVzdE1lc3NhZ2VTZXQoKQotICAgIHByb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotCi0gICAgIyBWZXJpZnkgdGhhdCB0aGUgdW5rbm93biBleHRlbnNpb24gaXMgc2VyaWFsaXplZCB1bmNoYW5nZWQKLSAgICByZXNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgbmV3X3JhdyA9IHVuaXR0ZXN0X21zZXRfcGIyLlJhd01lc3NhZ2VTZXQoKQotICAgIG5ld19yYXcuTWVyZ2VGcm9tU3RyaW5nKHJlc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHJhdywgbmV3X3JhdykKLQotICBkZWYgdGVzdEVxdWFscyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlbGYuYWxsX2ZpZWxkc19kYXRhKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5lbXB0eV9tZXNzYWdlLCBtZXNzYWdlKQotCi0gICAgc2VsZi5hbGxfZmllbGRzLkNsZWFyRmllbGQoJ29wdGlvbmFsX3N0cmluZycpCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5hbGxfZmllbGRzLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmVtcHR5X21lc3NhZ2UsIG1lc3NhZ2UpCi0KLSAgZGVmIHRlc3REaXNjYXJkVW5rbm93bkZpZWxkcyhzZWxmKToKLSAgICBzZWxmLmVtcHR5X21lc3NhZ2UuRGlzY2FyZFVua25vd25GaWVsZHMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBzZWxmLmVtcHR5X21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICAjIFRlc3QgbWVzc2FnZSBmaWVsZCBhbmQgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgb3RoZXJfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG90aGVyX21lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nID0gJ2Rpc2NhcmQnCi0gICAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoCi0gICAgICAgIG90aGVyX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLlBhcnNlRnJvbVN0cmluZygKLSAgICAgICAgb3RoZXJfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCi0gICAgICAgIGInJywgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoCi0gICAgICAgIGInJywgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIG1lc3NhZ2UuRGlzY2FyZFVua25vd25GaWVsZHMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoYicnLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgYicnLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLQotY2xhc3MgVW5rbm93bkZpZWxkc0FjY2Vzc29yc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLmRlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKLSAgICBzZWxmLmFsbF9maWVsZHMgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHNlbGYuYWxsX2ZpZWxkcykKLSAgICBzZWxmLmFsbF9maWVsZHNfZGF0YSA9IHNlbGYuYWxsX2ZpZWxkcy5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5lbXB0eV9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQotICAgIHNlbGYuZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5hbGxfZmllbGRzX2RhdGEpCi0gICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAnY3BwJzoKLSAgICAgICMgX3Vua25vd25fZmllbGRzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRldGFpbC4KLSAgICAgIHNlbGYudW5rbm93bl9maWVsZHMgPSBzZWxmLmVtcHR5X21lc3NhZ2UuX3Vua25vd25fZmllbGRzCi0KLSAgIyBBbGwgdGhlIHRlc3RzIHRoYXQgdXNlIEdldEZpZWxkKCkgY2hlY2sgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZQotICAjIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggc3RvcmVzIHVua25vd24gZmllbGRzIGFzIHNlcmlhbGl6ZWQgc3RyaW5ncy4KLSAgIyBUaGVzZSB0ZXN0cyBhcmUgc2tpcHBlZCBieSB0aGUgQysrIGltcGxlbWVudGF0aW9uOiBpdCdzIGVub3VnaCB0byBjaGVjayB0aGF0Ci0gICMgdGhlIG1lc3NhZ2UgaXMgY29ycmVjdGx5IHNlcmlhbGl6ZWQuCi0KLSAgZGVmIEdldEZpZWxkKHNlbGYsIG5hbWUpOgotICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLmRlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbbmFtZV0KLSAgICB3aXJlX3R5cGUgPSB0eXBlX2NoZWNrZXJzLkZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFW2ZpZWxkX2Rlc2NyaXB0b3IudHlwZV0KLSAgICBmaWVsZF90YWcgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgcmVzdWx0X2RpY3QgPSB7fQotICAgIGZvciB0YWdfYnl0ZXMsIHZhbHVlIGluIHNlbGYudW5rbm93bl9maWVsZHM6Ci0gICAgICBpZiB0YWdfYnl0ZXMgPT0gZmllbGRfdGFnOgotICAgICAgICBkZWNvZGVyID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5fZGVjb2RlcnNfYnlfdGFnW3RhZ19ieXRlc11bMF0KLSAgICAgICAgZGVjb2Rlcih2YWx1ZSwgMCwgbGVuKHZhbHVlKSwgc2VsZi5hbGxfZmllbGRzLCByZXN1bHRfZGljdCkKLSAgICByZXR1cm4gcmVzdWx0X2RpY3RbZmllbGRfZGVzY3JpcHRvcl0KLQotICBAU2tpcElmQ3BwSW1wbGVtZW50YXRpb24KLSAgZGVmIHRlc3RFbnVtKHNlbGYpOgotICAgIHZhbHVlID0gc2VsZi5HZXRGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX25lc3RlZF9lbnVtLCB2YWx1ZSkKLQotICBAU2tpcElmQ3BwSW1wbGVtZW50YXRpb24KLSAgZGVmIHRlc3RSZXBlYXRlZEVudW0oc2VsZik6Ci0gICAgdmFsdWUgPSBzZWxmLkdldEZpZWxkKCdyZXBlYXRlZF9uZXN0ZWRfZW51bScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmFsbF9maWVsZHMucmVwZWF0ZWRfbmVzdGVkX2VudW0sIHZhbHVlKQotCi0gIEBTa2lwSWZDcHBJbXBsZW1lbnRhdGlvbgotICBkZWYgdGVzdFZhcmludChzZWxmKToKLSAgICB2YWx1ZSA9IHNlbGYuR2V0RmllbGQoJ29wdGlvbmFsX2ludDMyJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkcy5vcHRpb25hbF9pbnQzMiwgdmFsdWUpCi0KLSAgQFNraXBJZkNwcEltcGxlbWVudGF0aW9uCi0gIGRlZiB0ZXN0Rml4ZWQzMihzZWxmKToKLSAgICB2YWx1ZSA9IHNlbGYuR2V0RmllbGQoJ29wdGlvbmFsX2ZpeGVkMzInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX2ZpeGVkMzIsIHZhbHVlKQotCi0gIEBTa2lwSWZDcHBJbXBsZW1lbnRhdGlvbgotICBkZWYgdGVzdEZpeGVkNjQoc2VsZik6Ci0gICAgdmFsdWUgPSBzZWxmLkdldEZpZWxkKCdvcHRpb25hbF9maXhlZDY0JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkcy5vcHRpb25hbF9maXhlZDY0LCB2YWx1ZSkKLQotICBAU2tpcElmQ3BwSW1wbGVtZW50YXRpb24KLSAgZGVmIHRlc3RMZW5ndGhEZWxpbWl0ZWQoc2VsZik6Ci0gICAgdmFsdWUgPSBzZWxmLkdldEZpZWxkKCdvcHRpb25hbF9zdHJpbmcnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5hbGxfZmllbGRzLm9wdGlvbmFsX3N0cmluZywgdmFsdWUpCi0KLSAgQFNraXBJZkNwcEltcGxlbWVudGF0aW9uCi0gIGRlZiB0ZXN0R3JvdXAoc2VsZik6Ci0gICAgdmFsdWUgPSBzZWxmLkdldEZpZWxkKCdvcHRpb25hbGdyb3VwJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuYWxsX2ZpZWxkcy5vcHRpb25hbGdyb3VwLCB2YWx1ZSkKLQotICBkZWYgdGVzdENvcHlGcm9tKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCi0gICAgbWVzc2FnZS5Db3B5RnJvbShzZWxmLmVtcHR5X21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCksIHNlbGYuYWxsX2ZpZWxkc19kYXRhKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2ludDMyID0gMQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyID0gMgotICAgIHNvdXJjZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKLSAgICBzb3VyY2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLQotICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQgPSAzCi0gICAgbWVzc2FnZS5vcHRpb25hbF91aW50MzIgPSA0Ci0gICAgZGVzdGluYXRpb24gPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCi0gICAgZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLQotICAgIGRlc3RpbmF0aW9uLk1lcmdlRnJvbShzb3VyY2UpCi0gICAgIyBDaGVjayB0aGF0IHRoZSBmaWVsZHMgd2hlcmUgY29ycmVjdGx5IG1lcmdlZCwgZXZlbiBzdG9yZWQgaW4gdGhlIHVua25vd24KLSAgICAjIGZpZWxkcyBzZXQuCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGVzdGluYXRpb24uU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIsIDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMiwgMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQsIDMpCi0KLSAgZGVmIHRlc3RDbGVhcihzZWxmKToKLSAgICBzZWxmLmVtcHR5X21lc3NhZ2UuQ2xlYXIoKQotICAgICMgQWxsIGNsZWFyZWQsIGV2ZW4gdW5rbm93biBmaWVsZHMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmVtcHR5X21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSwgYicnKQotCi0gIGRlZiB0ZXN0VW5rbm93bkV4dGVuc2lvbnMoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMoKQotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlbGYuYWxsX2ZpZWxkc19kYXRhKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpLCBzZWxmLmFsbF9maWVsZHNfZGF0YSkKLQotCi1jbGFzcyBVbmtub3duRW51bVZhbHVlc1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLmRlc2NyaXB0b3IgPSBtaXNzaW5nX2VudW1fdmFsdWVzX3BiMi5UZXN0RW51bVZhbHVlcy5ERVNDUklQVE9SCi0KLSAgICBzZWxmLm1lc3NhZ2UgPSBtaXNzaW5nX2VudW1fdmFsdWVzX3BiMi5UZXN0RW51bVZhbHVlcygpCi0gICAgc2VsZi5tZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtID0gKAotICAgICAgbWlzc2luZ19lbnVtX3ZhbHVlc19wYjIuVGVzdEVudW1WYWx1ZXMuWkVSTykKLSAgICBzZWxmLm1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uZXh0ZW5kKFsKLSAgICAgIG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzLlpFUk8sCi0gICAgICBtaXNzaW5nX2VudW1fdmFsdWVzX3BiMi5UZXN0RW51bVZhbHVlcy5PTkUsCi0gICAgICBdKQotICAgIHNlbGYubWVzc2FnZS5wYWNrZWRfbmVzdGVkX2VudW0uZXh0ZW5kKFsKLSAgICAgIG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzLlpFUk8sCi0gICAgICBtaXNzaW5nX2VudW1fdmFsdWVzX3BiMi5UZXN0RW51bVZhbHVlcy5PTkUsCi0gICAgICBdKQotICAgIHNlbGYubWVzc2FnZV9kYXRhID0gc2VsZi5tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLm1pc3NpbmdfbWVzc2FnZSA9IG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RNaXNzaW5nRW51bVZhbHVlcygpCi0gICAgc2VsZi5taXNzaW5nX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHNlbGYubWVzc2FnZV9kYXRhKQotICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ2NwcCc6Ci0gICAgICAjIF91bmtub3duX2ZpZWxkcyBpcyBhbiBpbXBsZW1lbnRhdGlvbiBkZXRhaWwuCi0gICAgICBzZWxmLnVua25vd25fZmllbGRzID0gc2VsZi5taXNzaW5nX21lc3NhZ2UuX3Vua25vd25fZmllbGRzCi0KLSAgIyBBbGwgdGhlIHRlc3RzIHRoYXQgdXNlIEdldEZpZWxkKCkgY2hlY2sgYW4gaW1wbGVtZW50YXRpb24gZGV0YWlsIG9mIHRoZQotICAjIFB5dGhvbiBpbXBsZW1lbnRhdGlvbiwgd2hpY2ggc3RvcmVzIHVua25vd24gZmllbGRzIGFzIHNlcmlhbGl6ZWQgc3RyaW5ncy4KLSAgIyBUaGVzZSB0ZXN0cyBhcmUgc2tpcHBlZCBieSB0aGUgQysrIGltcGxlbWVudGF0aW9uOiBpdCdzIGVub3VnaCB0byBjaGVjayB0aGF0Ci0gICMgdGhlIG1lc3NhZ2UgaXMgY29ycmVjdGx5IHNlcmlhbGl6ZWQuCi0KLSAgZGVmIEdldEZpZWxkKHNlbGYsIG5hbWUpOgotICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLmRlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbbmFtZV0KLSAgICB3aXJlX3R5cGUgPSB0eXBlX2NoZWNrZXJzLkZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFW2ZpZWxkX2Rlc2NyaXB0b3IudHlwZV0KLSAgICBmaWVsZF90YWcgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgcmVzdWx0X2RpY3QgPSB7fQotICAgIGZvciB0YWdfYnl0ZXMsIHZhbHVlIGluIHNlbGYudW5rbm93bl9maWVsZHM6Ci0gICAgICBpZiB0YWdfYnl0ZXMgPT0gZmllbGRfdGFnOgotICAgICAgICBkZWNvZGVyID0gbWlzc2luZ19lbnVtX3ZhbHVlc19wYjIuVGVzdEVudW1WYWx1ZXMuX2RlY29kZXJzX2J5X3RhZ1sKLSAgICAgICAgICB0YWdfYnl0ZXNdWzBdCi0gICAgICAgIGRlY29kZXIodmFsdWUsIDAsIGxlbih2YWx1ZSksIHNlbGYubWVzc2FnZSwgcmVzdWx0X2RpY3QpCi0gICAgcmV0dXJuIHJlc3VsdF9kaWN0W2ZpZWxkX2Rlc2NyaXB0b3JdCi0KLSAgZGVmIHRlc3RVbmtub3duUGFyc2VNaXNtYXRjaEVudW1WYWx1ZShzZWxmKToKLSAgICBqdXN0X3N0cmluZyA9IG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLkp1c3RTdHJpbmcoKQotICAgIGp1c3Rfc3RyaW5nLmR1bW15ID0gJ2JsYWgnCi0KLSAgICBtaXNzaW5nID0gbWlzc2luZ19lbnVtX3ZhbHVlc19wYjIuVGVzdEVudW1WYWx1ZXMoKQotICAgICMgVGhlIHBhcnNlIGlzIGludmFsaWQsIHN0b3JpbmcgdGhlIHN0cmluZyBwcm90byBpbnRvIHRoZSBzZXQgb2YKLSAgICAjIHVua25vd24gZmllbGRzLgotICAgIG1pc3NpbmcuUGFyc2VGcm9tU3RyaW5nKGp1c3Rfc3RyaW5nLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLSAgICAjIEZldGNoaW5nIHRoZSBlbnVtIGZpZWxkIHNob3VsZG4ndCBjcmFzaCwgaW5zdGVhZCByZXR1cm5pbmcgdGhlCi0gICAgIyBkZWZhdWx0IHZhbHVlLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWlzc2luZy5vcHRpb25hbF9uZXN0ZWRfZW51bSwgMCkKLQotICBAU2tpcElmQ3BwSW1wbGVtZW50YXRpb24KLSAgZGVmIHRlc3RVbmtub3duRW51bVZhbHVlKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RmFsc2Uoc2VsZi5taXNzaW5nX21lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9lbnVtJykpCi0gICAgdmFsdWUgPSBzZWxmLkdldEZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfZW51bScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0sIHZhbHVlKQotCi0gIEBTa2lwSWZDcHBJbXBsZW1lbnRhdGlvbgotICBkZWYgdGVzdFVua25vd25SZXBlYXRlZEVudW1WYWx1ZShzZWxmKToKLSAgICB2YWx1ZSA9IHNlbGYuR2V0RmllbGQoJ3JlcGVhdGVkX25lc3RlZF9lbnVtJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSwgdmFsdWUpCi0KLSAgQFNraXBJZkNwcEltcGxlbWVudGF0aW9uCi0gIGRlZiB0ZXN0VW5rbm93blBhY2tlZEVudW1WYWx1ZShzZWxmKToKLSAgICB2YWx1ZSA9IHNlbGYuR2V0RmllbGQoJ3BhY2tlZF9uZXN0ZWRfZW51bScpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm1lc3NhZ2UucGFja2VkX25lc3RlZF9lbnVtLCB2YWx1ZSkKLQotICBkZWYgdGVzdFJvdW5kVHJpcChzZWxmKToKLSAgICBuZXdfbWVzc2FnZSA9IG1pc3NpbmdfZW51bV92YWx1ZXNfcGIyLlRlc3RFbnVtVmFsdWVzKCkKLSAgICBuZXdfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoc2VsZi5taXNzaW5nX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubWVzc2FnZSwgbmV3X21lc3NhZ2UpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXMucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdjNWRmZmQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93ZWxsX2tub3duX3R5cGVzLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzI0ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiQ29udGFpbnMgd2VsbCBrbm93biBjbGFzc2VzLgotCi1UaGlzIGZpbGVzIGRlZmluZXMgd2VsbCBrbm93biBjbGFzc2VzIHdoaWNoIG5lZWQgZXh0cmEgbWFpbnRlbmFuY2UgaW5jbHVkaW5nOgotICAtIEFueQotICAtIER1cmF0aW9uCi0gIC0gRmllbGRNYXNrCi0gIC0gU3RydWN0Ci0gIC0gVGltZXN0YW1wCi0iIiIKLQotX19hdXRob3JfXyA9ICdqaWVsdW9AZ29vZ2xlLmNvbSAoSmllIEx1byknCi0KLWZyb20gZGF0ZXRpbWUgaW1wb3J0IGRhdGV0aW1lCi1mcm9tIGRhdGV0aW1lIGltcG9ydCB0aW1lZGVsdGEKLWltcG9ydCBzaXgKLQotZnJvbSBnb29nbGUucHJvdG9idWYuZGVzY3JpcHRvciBpbXBvcnQgRmllbGREZXNjcmlwdG9yCi0KLV9USU1FU1RBTVBGT01BVCA9ICclWS0lbS0lZFQlSDolTTolUycKLV9OQU5PU19QRVJfU0VDT05EID0gMTAwMDAwMDAwMAotX05BTk9TX1BFUl9NSUxMSVNFQ09ORCA9IDEwMDAwMDAKLV9OQU5PU19QRVJfTUlDUk9TRUNPTkQgPSAxMDAwCi1fTUlMTElTX1BFUl9TRUNPTkQgPSAxMDAwCi1fTUlDUk9TX1BFUl9TRUNPTkQgPSAxMDAwMDAwCi1fU0VDT05EU19QRVJfREFZID0gMjQgKiAzNjAwCi0KLQotY2xhc3MgRXJyb3IoRXhjZXB0aW9uKToKLSAgIiIiVG9wLWxldmVsIG1vZHVsZSBlcnJvci4iIiIKLQotCi1jbGFzcyBQYXJzZUVycm9yKEVycm9yKToKLSAgIiIiVGhyb3duIGluIGNhc2Ugb2YgcGFyc2luZyBlcnJvci4iIiIKLQotCi1jbGFzcyBBbnkob2JqZWN0KToKLSAgIiIiQ2xhc3MgZm9yIEFueSBNZXNzYWdlIHR5cGUuIiIiCi0KLSAgZGVmIFBhY2soc2VsZiwgbXNnLCB0eXBlX3VybF9wcmVmaXg9J3R5cGUuZ29vZ2xlYXBpcy5jb20vJyk6Ci0gICAgIiIiUGFja3MgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGludG8gY3VycmVudCBBbnkgbWVzc2FnZS4iIiIKLSAgICBpZiBsZW4odHlwZV91cmxfcHJlZml4KSA8IDEgb3IgdHlwZV91cmxfcHJlZml4Wy0xXSAhPSAnLyc6Ci0gICAgICBzZWxmLnR5cGVfdXJsID0gJyVzLyVzJyAlICh0eXBlX3VybF9wcmVmaXgsIG1zZy5ERVNDUklQVE9SLmZ1bGxfbmFtZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi50eXBlX3VybCA9ICclcyVzJyAlICh0eXBlX3VybF9wcmVmaXgsIG1zZy5ERVNDUklQVE9SLmZ1bGxfbmFtZSkKLSAgICBzZWxmLnZhbHVlID0gbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICBkZWYgVW5wYWNrKHNlbGYsIG1zZyk6Ci0gICAgIiIiVW5wYWNrcyB0aGUgY3VycmVudCBBbnkgbWVzc2FnZSBpbnRvIHNwZWNpZmllZCBtZXNzYWdlLiIiIgotICAgIGRlc2NyaXB0b3IgPSBtc2cuREVTQ1JJUFRPUgotICAgIGlmIG5vdCBzZWxmLklzKGRlc2NyaXB0b3IpOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgbXNnLlBhcnNlRnJvbVN0cmluZyhzZWxmLnZhbHVlKQotICAgIHJldHVybiBUcnVlCi0KLSAgZGVmIFR5cGVOYW1lKHNlbGYpOgotICAgICIiIlJldHVybnMgdGhlIHByb3RvYnVmIHR5cGUgbmFtZSBvZiB0aGUgaW5uZXIgbWVzc2FnZS4iIiIKLSAgICAjIE9ubHkgbGFzdCBwYXJ0IGlzIHRvIGJlIHVzZWQ6IGIvMjU2MzAxMTIKLSAgICByZXR1cm4gc2VsZi50eXBlX3VybC5zcGxpdCgnLycpWy0xXQotCi0gIGRlZiBJcyhzZWxmLCBkZXNjcmlwdG9yKToKLSAgICAiIiJDaGVja3MgaWYgdGhpcyBBbnkgcmVwcmVzZW50cyB0aGUgZ2l2ZW4gcHJvdG9idWYgdHlwZS4iIiIKLSAgICByZXR1cm4gc2VsZi5UeXBlTmFtZSgpID09IGRlc2NyaXB0b3IuZnVsbF9uYW1lCi0KLQotY2xhc3MgVGltZXN0YW1wKG9iamVjdCk6Ci0gICIiIkNsYXNzIGZvciBUaW1lc3RhbXAgbWVzc2FnZSB0eXBlLiIiIgotCi0gIGRlZiBUb0pzb25TdHJpbmcoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgVGltZXN0YW1wIHRvIFJGQyAzMzM5IGRhdGUgc3RyaW5nIGZvcm1hdC4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIHN0cmluZyBjb252ZXJ0ZWQgZnJvbSB0aW1lc3RhbXAuIFRoZSBzdHJpbmcgaXMgYWx3YXlzIFotbm9ybWFsaXplZAotICAgICAgYW5kIHVzZXMgMywgNiBvciA5IGZyYWN0aW9uYWwgZGlnaXRzIGFzIHJlcXVpcmVkIHRvIHJlcHJlc2VudCB0aGUKLSAgICAgIGV4YWN0IHRpbWUuIEV4YW1wbGUgb2YgdGhlIHJldHVybiBmb3JtYXQ6ICcxOTcyLTAxLTAxVDEwOjAwOjIwLjAyMVonCi0gICAgIiIiCi0gICAgbmFub3MgPSBzZWxmLm5hbm9zICUgX05BTk9TX1BFUl9TRUNPTkQKLSAgICB0b3RhbF9zZWMgPSBzZWxmLnNlY29uZHMgKyAoc2VsZi5uYW5vcyAtIG5hbm9zKSAvLyBfTkFOT1NfUEVSX1NFQ09ORAotICAgIHNlY29uZHMgPSB0b3RhbF9zZWMgJSBfU0VDT05EU19QRVJfREFZCi0gICAgZGF5cyA9ICh0b3RhbF9zZWMgLSBzZWNvbmRzKSAvLyBfU0VDT05EU19QRVJfREFZCi0gICAgZHQgPSBkYXRldGltZSgxOTcwLCAxLCAxKSArIHRpbWVkZWx0YShkYXlzLCBzZWNvbmRzKQotCi0gICAgcmVzdWx0ID0gZHQuaXNvZm9ybWF0KCkKLSAgICBpZiAobmFub3MgJSAxZTkpID09IDA6Ci0gICAgICAjIElmIHRoZXJlIGFyZSAwIGZyYWN0aW9uYWwgZGlnaXRzLCB0aGUgZnJhY3Rpb25hbAotICAgICAgIyBwb2ludCAnLicgc2hvdWxkIGJlIG9taXR0ZWQgd2hlbiBzZXJpYWxpemluZy4KLSAgICAgIHJldHVybiByZXN1bHQgKyAnWicKLSAgICBpZiAobmFub3MgJSAxZTYpID09IDA6Ci0gICAgICAjIFNlcmlhbGl6ZSAzIGZyYWN0aW9uYWwgZGlnaXRzLgotICAgICAgcmV0dXJuIHJlc3VsdCArICcuJTAzZFonICUgKG5hbm9zIC8gMWU2KQotICAgIGlmIChuYW5vcyAlIDFlMykgPT0gMDoKLSAgICAgICMgU2VyaWFsaXplIDYgZnJhY3Rpb25hbCBkaWdpdHMuCi0gICAgICByZXR1cm4gcmVzdWx0ICsgJy4lMDZkWicgJSAobmFub3MgLyAxZTMpCi0gICAgIyBTZXJpYWxpemUgOSBmcmFjdGlvbmFsIGRpZ2l0cy4KLSAgICByZXR1cm4gcmVzdWx0ICsgJy4lMDlkWicgJSBuYW5vcwotCi0gIGRlZiBGcm9tSnNvblN0cmluZyhzZWxmLCB2YWx1ZSk6Ci0gICAgIiIiUGFyc2UgYSBSRkMgMzMzOSBkYXRlIHN0cmluZyBmb3JtYXQgdG8gVGltZXN0YW1wLgotCi0gICAgQXJnczoKLSAgICAgIHZhbHVlOiBBIGRhdGUgc3RyaW5nLiBBbnkgZnJhY3Rpb25hbCBkaWdpdHMgKG9yIG5vbmUpIGFuZCBhbnkgb2Zmc2V0IGFyZQotICAgICAgICAgIGFjY2VwdGVkIGFzIGxvbmcgYXMgdGhleSBmaXQgaW50byBuYW5vLXNlY29uZHMgcHJlY2lzaW9uLgotICAgICAgICAgIEV4YW1wbGUgb2YgYWNjZXB0ZWQgZm9ybWF0OiAnMTk3Mi0wMS0wMVQxMDowMDoyMC4wMjEtMDU6MDAnCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBPbiBwYXJzaW5nIHByb2JsZW1zLgotICAgICIiIgotICAgIHRpbWV6b25lX29mZnNldCA9IHZhbHVlLmZpbmQoJ1onKQotICAgIGlmIHRpbWV6b25lX29mZnNldCA9PSAtMToKLSAgICAgIHRpbWV6b25lX29mZnNldCA9IHZhbHVlLmZpbmQoJysnKQotICAgIGlmIHRpbWV6b25lX29mZnNldCA9PSAtMToKLSAgICAgIHRpbWV6b25lX29mZnNldCA9IHZhbHVlLnJmaW5kKCctJykKLSAgICBpZiB0aW1lem9uZV9vZmZzZXQgPT0gLTE6Ci0gICAgICByYWlzZSBQYXJzZUVycm9yKAotICAgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgdGltZXN0YW1wOiBtaXNzaW5nIHZhbGlkIHRpbWV6b25lIG9mZnNldC4nKQotICAgIHRpbWVfdmFsdWUgPSB2YWx1ZVswOnRpbWV6b25lX29mZnNldF0KLSAgICAjIFBhcnNlIGRhdGV0aW1lIGFuZCBuYW5vcy4KLSAgICBwb2ludF9wb3NpdGlvbiA9IHRpbWVfdmFsdWUuZmluZCgnLicpCi0gICAgaWYgcG9pbnRfcG9zaXRpb24gPT0gLTE6Ci0gICAgICBzZWNvbmRfdmFsdWUgPSB0aW1lX3ZhbHVlCi0gICAgICBuYW5vX3ZhbHVlID0gJycKLSAgICBlbHNlOgotICAgICAgc2Vjb25kX3ZhbHVlID0gdGltZV92YWx1ZVs6cG9pbnRfcG9zaXRpb25dCi0gICAgICBuYW5vX3ZhbHVlID0gdGltZV92YWx1ZVtwb2ludF9wb3NpdGlvbiArIDE6XQotICAgIGRhdGVfb2JqZWN0ID0gZGF0ZXRpbWUuc3RycHRpbWUoc2Vjb25kX3ZhbHVlLCBfVElNRVNUQU1QRk9NQVQpCi0gICAgdGQgPSBkYXRlX29iamVjdCAtIGRhdGV0aW1lKDE5NzAsIDEsIDEpCi0gICAgc2Vjb25kcyA9IHRkLnNlY29uZHMgKyB0ZC5kYXlzICogX1NFQ09ORFNfUEVSX0RBWQotICAgIGlmIGxlbihuYW5vX3ZhbHVlKSA+IDk6Ci0gICAgICByYWlzZSBQYXJzZUVycm9yKAotICAgICAgICAgICdGYWlsZWQgdG8gcGFyc2UgVGltZXN0YW1wOiBuYW5vcyB7MH0gbW9yZSB0aGFuICcKLSAgICAgICAgICAnOSBmcmFjdGlvbmFsIGRpZ2l0cy4nLmZvcm1hdChuYW5vX3ZhbHVlKSkKLSAgICBpZiBuYW5vX3ZhbHVlOgotICAgICAgbmFub3MgPSByb3VuZChmbG9hdCgnMC4nICsgbmFub192YWx1ZSkgKiAxZTkpCi0gICAgZWxzZToKLSAgICAgIG5hbm9zID0gMAotICAgICMgUGFyc2UgdGltZXpvbmUgb2Zmc2V0cy4KLSAgICBpZiB2YWx1ZVt0aW1lem9uZV9vZmZzZXRdID09ICdaJzoKLSAgICAgIGlmIGxlbih2YWx1ZSkgIT0gdGltZXpvbmVfb2Zmc2V0ICsgMToKLSAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignRmFpbGVkIHRvIHBhcnNlIHRpbWVzdGFtcDogaW52YWxpZCB0cmFpbGluZycKLSAgICAgICAgICAgICAgICAgICAgICAgICAnIGRhdGEgezB9LicuZm9ybWF0KHZhbHVlKSkKLSAgICBlbHNlOgotICAgICAgdGltZXpvbmUgPSB2YWx1ZVt0aW1lem9uZV9vZmZzZXQ6XQotICAgICAgcG9zID0gdGltZXpvbmUuZmluZCgnOicpCi0gICAgICBpZiBwb3MgPT0gLTE6Ci0gICAgICAgIHJhaXNlIFBhcnNlRXJyb3IoCi0gICAgICAgICAgICAnSW52YWxpZCB0aW1lem9uZSBvZmZzZXQgdmFsdWU6IHswfS4nLmZvcm1hdCh0aW1lem9uZSkpCi0gICAgICBpZiB0aW1lem9uZVswXSA9PSAnKyc6Ci0gICAgICAgIHNlY29uZHMgLT0gKGludCh0aW1lem9uZVsxOnBvc10pKjYwK2ludCh0aW1lem9uZVtwb3MrMTpdKSkqNjAKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlY29uZHMgKz0gKGludCh0aW1lem9uZVsxOnBvc10pKjYwK2ludCh0aW1lem9uZVtwb3MrMTpdKSkqNjAKLSAgICAjIFNldCBzZWNvbmRzIGFuZCBuYW5vcwotICAgIHNlbGYuc2Vjb25kcyA9IGludChzZWNvbmRzKQotICAgIHNlbGYubmFub3MgPSBpbnQobmFub3MpCi0KLSAgZGVmIEdldEN1cnJlbnRUaW1lKHNlbGYpOgotICAgICIiIkdldCB0aGUgY3VycmVudCBVVEMgaW50byBUaW1lc3RhbXAuIiIiCi0gICAgc2VsZi5Gcm9tRGF0ZXRpbWUoZGF0ZXRpbWUudXRjbm93KCkpCi0KLSAgZGVmIFRvTmFub3NlY29uZHMoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgVGltZXN0YW1wIHRvIG5hbm9zZWNvbmRzIHNpbmNlIGVwb2NoLiIiIgotICAgIHJldHVybiBzZWxmLnNlY29uZHMgKiBfTkFOT1NfUEVSX1NFQ09ORCArIHNlbGYubmFub3MKLQotICBkZWYgVG9NaWNyb3NlY29uZHMoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgVGltZXN0YW1wIHRvIG1pY3Jvc2Vjb25kcyBzaW5jZSBlcG9jaC4iIiIKLSAgICByZXR1cm4gKHNlbGYuc2Vjb25kcyAqIF9NSUNST1NfUEVSX1NFQ09ORCArCi0gICAgICAgICAgICBzZWxmLm5hbm9zIC8vIF9OQU5PU19QRVJfTUlDUk9TRUNPTkQpCi0KLSAgZGVmIFRvTWlsbGlzZWNvbmRzKHNlbGYpOgotICAgICIiIkNvbnZlcnRzIFRpbWVzdGFtcCB0byBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2guIiIiCi0gICAgcmV0dXJuIChzZWxmLnNlY29uZHMgKiBfTUlMTElTX1BFUl9TRUNPTkQgKwotICAgICAgICAgICAgc2VsZi5uYW5vcyAvLyBfTkFOT1NfUEVSX01JTExJU0VDT05EKQotCi0gIGRlZiBUb1NlY29uZHMoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgVGltZXN0YW1wIHRvIHNlY29uZHMgc2luY2UgZXBvY2guIiIiCi0gICAgcmV0dXJuIHNlbGYuc2Vjb25kcwotCi0gIGRlZiBGcm9tTmFub3NlY29uZHMoc2VsZiwgbmFub3MpOgotICAgICIiIkNvbnZlcnRzIG5hbm9zZWNvbmRzIHNpbmNlIGVwb2NoIHRvIFRpbWVzdGFtcC4iIiIKLSAgICBzZWxmLnNlY29uZHMgPSBuYW5vcyAvLyBfTkFOT1NfUEVSX1NFQ09ORAotICAgIHNlbGYubmFub3MgPSBuYW5vcyAlIF9OQU5PU19QRVJfU0VDT05ECi0KLSAgZGVmIEZyb21NaWNyb3NlY29uZHMoc2VsZiwgbWljcm9zKToKLSAgICAiIiJDb252ZXJ0cyBtaWNyb3NlY29uZHMgc2luY2UgZXBvY2ggdG8gVGltZXN0YW1wLiIiIgotICAgIHNlbGYuc2Vjb25kcyA9IG1pY3JvcyAvLyBfTUlDUk9TX1BFUl9TRUNPTkQKLSAgICBzZWxmLm5hbm9zID0gKG1pY3JvcyAlIF9NSUNST1NfUEVSX1NFQ09ORCkgKiBfTkFOT1NfUEVSX01JQ1JPU0VDT05ECi0KLSAgZGVmIEZyb21NaWxsaXNlY29uZHMoc2VsZiwgbWlsbGlzKToKLSAgICAiIiJDb252ZXJ0cyBtaWxsaXNlY29uZHMgc2luY2UgZXBvY2ggdG8gVGltZXN0YW1wLiIiIgotICAgIHNlbGYuc2Vjb25kcyA9IG1pbGxpcyAvLyBfTUlMTElTX1BFUl9TRUNPTkQKLSAgICBzZWxmLm5hbm9zID0gKG1pbGxpcyAlIF9NSUxMSVNfUEVSX1NFQ09ORCkgKiBfTkFOT1NfUEVSX01JTExJU0VDT05ECi0KLSAgZGVmIEZyb21TZWNvbmRzKHNlbGYsIHNlY29uZHMpOgotICAgICIiIkNvbnZlcnRzIHNlY29uZHMgc2luY2UgZXBvY2ggdG8gVGltZXN0YW1wLiIiIgotICAgIHNlbGYuc2Vjb25kcyA9IHNlY29uZHMKLSAgICBzZWxmLm5hbm9zID0gMAotCi0gIGRlZiBUb0RhdGV0aW1lKHNlbGYpOgotICAgICIiIkNvbnZlcnRzIFRpbWVzdGFtcCB0byBkYXRldGltZS4iIiIKLSAgICByZXR1cm4gZGF0ZXRpbWUudXRjZnJvbXRpbWVzdGFtcCgKLSAgICAgICAgc2VsZi5zZWNvbmRzICsgc2VsZi5uYW5vcyAvIGZsb2F0KF9OQU5PU19QRVJfU0VDT05EKSkKLQotICBkZWYgRnJvbURhdGV0aW1lKHNlbGYsIGR0KToKLSAgICAiIiJDb252ZXJ0cyBkYXRldGltZSB0byBUaW1lc3RhbXAuIiIiCi0gICAgdGQgPSBkdCAtIGRhdGV0aW1lKDE5NzAsIDEsIDEpCi0gICAgc2VsZi5zZWNvbmRzID0gdGQuc2Vjb25kcyArIHRkLmRheXMgKiBfU0VDT05EU19QRVJfREFZCi0gICAgc2VsZi5uYW5vcyA9IHRkLm1pY3Jvc2Vjb25kcyAqIF9OQU5PU19QRVJfTUlDUk9TRUNPTkQKLQotCi1jbGFzcyBEdXJhdGlvbihvYmplY3QpOgotICAiIiJDbGFzcyBmb3IgRHVyYXRpb24gbWVzc2FnZSB0eXBlLiIiIgotCi0gIGRlZiBUb0pzb25TdHJpbmcoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgRHVyYXRpb24gdG8gc3RyaW5nIGZvcm1hdC4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIHN0cmluZyBjb252ZXJ0ZWQgZnJvbSBzZWxmLiBUaGUgc3RyaW5nIGZvcm1hdCB3aWxsIGNvbnRhaW5zCi0gICAgICAzLCA2LCBvciA5IGZyYWN0aW9uYWwgZGlnaXRzIGRlcGVuZGluZyBvbiB0aGUgcHJlY2lzaW9uIHJlcXVpcmVkIHRvCi0gICAgICByZXByZXNlbnQgdGhlIGV4YWN0IER1cmF0aW9uIHZhbHVlLiBGb3IgZXhhbXBsZTogIjFzIiwgIjEuMDEwcyIsCi0gICAgICAiMS4wMDAwMDAxMDBzIiwgIi0zLjEwMHMiCi0gICAgIiIiCi0gICAgaWYgc2VsZi5zZWNvbmRzIDwgMCBvciBzZWxmLm5hbm9zIDwgMDoKLSAgICAgIHJlc3VsdCA9ICctJwotICAgICAgc2Vjb25kcyA9IC0gc2VsZi5zZWNvbmRzICsgaW50KCgwIC0gc2VsZi5uYW5vcykgLy8gMWU5KQotICAgICAgbmFub3MgPSAoMCAtIHNlbGYubmFub3MpICUgMWU5Ci0gICAgZWxzZToKLSAgICAgIHJlc3VsdCA9ICcnCi0gICAgICBzZWNvbmRzID0gc2VsZi5zZWNvbmRzICsgaW50KHNlbGYubmFub3MgLy8gMWU5KQotICAgICAgbmFub3MgPSBzZWxmLm5hbm9zICUgMWU5Ci0gICAgcmVzdWx0ICs9ICclZCcgJSBzZWNvbmRzCi0gICAgaWYgKG5hbm9zICUgMWU5KSA9PSAwOgotICAgICAgIyBJZiB0aGVyZSBhcmUgMCBmcmFjdGlvbmFsIGRpZ2l0cywgdGhlIGZyYWN0aW9uYWwKLSAgICAgICMgcG9pbnQgJy4nIHNob3VsZCBiZSBvbWl0dGVkIHdoZW4gc2VyaWFsaXppbmcuCi0gICAgICByZXR1cm4gcmVzdWx0ICsgJ3MnCi0gICAgaWYgKG5hbm9zICUgMWU2KSA9PSAwOgotICAgICAgIyBTZXJpYWxpemUgMyBmcmFjdGlvbmFsIGRpZ2l0cy4KLSAgICAgIHJldHVybiByZXN1bHQgKyAnLiUwM2RzJyAlIChuYW5vcyAvIDFlNikKLSAgICBpZiAobmFub3MgJSAxZTMpID09IDA6Ci0gICAgICAjIFNlcmlhbGl6ZSA2IGZyYWN0aW9uYWwgZGlnaXRzLgotICAgICAgcmV0dXJuIHJlc3VsdCArICcuJTA2ZHMnICUgKG5hbm9zIC8gMWUzKQotICAgICMgU2VyaWFsaXplIDkgZnJhY3Rpb25hbCBkaWdpdHMuCi0gICAgcmV0dXJuIHJlc3VsdCArICcuJTA5ZHMnICUgbmFub3MKLQotICBkZWYgRnJvbUpzb25TdHJpbmcoc2VsZiwgdmFsdWUpOgotICAgICIiIkNvbnZlcnRzIGEgc3RyaW5nIHRvIER1cmF0aW9uLgotCi0gICAgQXJnczoKLSAgICAgIHZhbHVlOiBBIHN0cmluZyB0byBiZSBjb252ZXJ0ZWQuIFRoZSBzdHJpbmcgbXVzdCBlbmQgd2l0aCAncycuIEFueQotICAgICAgICAgIGZyYWN0aW9uYWwgZGlnaXRzIChvciBub25lKSBhcmUgYWNjZXB0ZWQgYXMgbG9uZyBhcyB0aGV5IGZpdCBpbnRvCi0gICAgICAgICAgcHJlY2lzaW9uLiBGb3IgZXhhbXBsZTogIjFzIiwgIjEuMDFzIiwgIjEuMDAwMDAwMXMiLCAiLTMuMTAwcwotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogT24gcGFyc2luZyBwcm9ibGVtcy4KLSAgICAiIiIKLSAgICBpZiBsZW4odmFsdWUpIDwgMSBvciB2YWx1ZVstMV0gIT0gJ3MnOgotICAgICAgcmFpc2UgUGFyc2VFcnJvcigKLSAgICAgICAgICAnRHVyYXRpb24gbXVzdCBlbmQgd2l0aCBsZXR0ZXIgInMiOiB7MH0uJy5mb3JtYXQodmFsdWUpKQotICAgIHRyeToKLSAgICAgIHBvcyA9IHZhbHVlLmZpbmQoJy4nKQotICAgICAgaWYgcG9zID09IC0xOgotICAgICAgICBzZWxmLnNlY29uZHMgPSBpbnQodmFsdWVbOi0xXSkKLSAgICAgICAgc2VsZi5uYW5vcyA9IDAKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuc2Vjb25kcyA9IGludCh2YWx1ZVs6cG9zXSkKLSAgICAgICAgaWYgdmFsdWVbMF0gPT0gJy0nOgotICAgICAgICAgIHNlbGYubmFub3MgPSBpbnQocm91bmQoZmxvYXQoJy0wezB9Jy5mb3JtYXQodmFsdWVbcG9zOiAtMV0pKSAqMWU5KSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBzZWxmLm5hbm9zID0gaW50KHJvdW5kKGZsb2F0KCcwezB9Jy5mb3JtYXQodmFsdWVbcG9zOiAtMV0pKSAqMWU5KSkKLSAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgIHJhaXNlIFBhcnNlRXJyb3IoCi0gICAgICAgICAgJ0NvdWxkblwndCBwYXJzZSBkdXJhdGlvbjogezB9LicuZm9ybWF0KHZhbHVlKSkKLQotICBkZWYgVG9OYW5vc2Vjb25kcyhzZWxmKToKLSAgICAiIiJDb252ZXJ0cyBhIER1cmF0aW9uIHRvIG5hbm9zZWNvbmRzLiIiIgotICAgIHJldHVybiBzZWxmLnNlY29uZHMgKiBfTkFOT1NfUEVSX1NFQ09ORCArIHNlbGYubmFub3MKLQotICBkZWYgVG9NaWNyb3NlY29uZHMoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgYSBEdXJhdGlvbiB0byBtaWNyb3NlY29uZHMuIiIiCi0gICAgbWljcm9zID0gX1JvdW5kVG93YXJkWmVybyhzZWxmLm5hbm9zLCBfTkFOT1NfUEVSX01JQ1JPU0VDT05EKQotICAgIHJldHVybiBzZWxmLnNlY29uZHMgKiBfTUlDUk9TX1BFUl9TRUNPTkQgKyBtaWNyb3MKLQotICBkZWYgVG9NaWxsaXNlY29uZHMoc2VsZik6Ci0gICAgIiIiQ29udmVydHMgYSBEdXJhdGlvbiB0byBtaWxsaXNlY29uZHMuIiIiCi0gICAgbWlsbGlzID0gX1JvdW5kVG93YXJkWmVybyhzZWxmLm5hbm9zLCBfTkFOT1NfUEVSX01JTExJU0VDT05EKQotICAgIHJldHVybiBzZWxmLnNlY29uZHMgKiBfTUlMTElTX1BFUl9TRUNPTkQgKyBtaWxsaXMKLQotICBkZWYgVG9TZWNvbmRzKHNlbGYpOgotICAgICIiIkNvbnZlcnRzIGEgRHVyYXRpb24gdG8gc2Vjb25kcy4iIiIKLSAgICByZXR1cm4gc2VsZi5zZWNvbmRzCi0KLSAgZGVmIEZyb21OYW5vc2Vjb25kcyhzZWxmLCBuYW5vcyk6Ci0gICAgIiIiQ29udmVydHMgbmFub3NlY29uZHMgdG8gRHVyYXRpb24uIiIiCi0gICAgc2VsZi5fTm9ybWFsaXplRHVyYXRpb24obmFub3MgLy8gX05BTk9TX1BFUl9TRUNPTkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFub3MgJSBfTkFOT1NfUEVSX1NFQ09ORCkKLQotICBkZWYgRnJvbU1pY3Jvc2Vjb25kcyhzZWxmLCBtaWNyb3MpOgotICAgICIiIkNvbnZlcnRzIG1pY3Jvc2Vjb25kcyB0byBEdXJhdGlvbi4iIiIKLSAgICBzZWxmLl9Ob3JtYWxpemVEdXJhdGlvbigKLSAgICAgICAgbWljcm9zIC8vIF9NSUNST1NfUEVSX1NFQ09ORCwKLSAgICAgICAgKG1pY3JvcyAlIF9NSUNST1NfUEVSX1NFQ09ORCkgKiBfTkFOT1NfUEVSX01JQ1JPU0VDT05EKQotCi0gIGRlZiBGcm9tTWlsbGlzZWNvbmRzKHNlbGYsIG1pbGxpcyk6Ci0gICAgIiIiQ29udmVydHMgbWlsbGlzZWNvbmRzIHRvIER1cmF0aW9uLiIiIgotICAgIHNlbGYuX05vcm1hbGl6ZUR1cmF0aW9uKAotICAgICAgICBtaWxsaXMgLy8gX01JTExJU19QRVJfU0VDT05ELAotICAgICAgICAobWlsbGlzICUgX01JTExJU19QRVJfU0VDT05EKSAqIF9OQU5PU19QRVJfTUlMTElTRUNPTkQpCi0KLSAgZGVmIEZyb21TZWNvbmRzKHNlbGYsIHNlY29uZHMpOgotICAgICIiIkNvbnZlcnRzIHNlY29uZHMgdG8gRHVyYXRpb24uIiIiCi0gICAgc2VsZi5zZWNvbmRzID0gc2Vjb25kcwotICAgIHNlbGYubmFub3MgPSAwCi0KLSAgZGVmIFRvVGltZWRlbHRhKHNlbGYpOgotICAgICIiIkNvbnZlcnRzIER1cmF0aW9uIHRvIHRpbWVkZWx0YS4iIiIKLSAgICByZXR1cm4gdGltZWRlbHRhKAotICAgICAgICBzZWNvbmRzPXNlbGYuc2Vjb25kcywgbWljcm9zZWNvbmRzPV9Sb3VuZFRvd2FyZFplcm8oCi0gICAgICAgICAgICBzZWxmLm5hbm9zLCBfTkFOT1NfUEVSX01JQ1JPU0VDT05EKSkKLQotICBkZWYgRnJvbVRpbWVkZWx0YShzZWxmLCB0ZCk6Ci0gICAgIiIiQ29udmVydGQgdGltZWRlbHRhIHRvIER1cmF0aW9uLiIiIgotICAgIHNlbGYuX05vcm1hbGl6ZUR1cmF0aW9uKHRkLnNlY29uZHMgKyB0ZC5kYXlzICogX1NFQ09ORFNfUEVSX0RBWSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZC5taWNyb3NlY29uZHMgKiBfTkFOT1NfUEVSX01JQ1JPU0VDT05EKQotCi0gIGRlZiBfTm9ybWFsaXplRHVyYXRpb24oc2VsZiwgc2Vjb25kcywgbmFub3MpOgotICAgICIiIlNldCBEdXJhdGlvbiBieSBzZWNvbmRzIGFuZCBub25hcy4iIiIKLSAgICAjIEZvcmNlIG5hbm9zIHRvIGJlIG5lZ2F0aXZlIGlmIHRoZSBkdXJhdGlvbiBpcyBuZWdhdGl2ZS4KLSAgICBpZiBzZWNvbmRzIDwgMCBhbmQgbmFub3MgPiAwOgotICAgICAgc2Vjb25kcyArPSAxCi0gICAgICBuYW5vcyAtPSBfTkFOT1NfUEVSX1NFQ09ORAotICAgIHNlbGYuc2Vjb25kcyA9IHNlY29uZHMKLSAgICBzZWxmLm5hbm9zID0gbmFub3MKLQotCi1kZWYgX1JvdW5kVG93YXJkWmVybyh2YWx1ZSwgZGl2aWRlcik6Ci0gICIiIlRydW5jYXRlcyB0aGUgcmVtYWluZGVyIHBhcnQgYWZ0ZXIgZGl2aXNpb24uIiIiCi0gICMgRm9yIHNvbWUgbGFuZ3VhbmdlcywgdGhlIHNpZ24gb2YgdGhlIHJlbWFpbmRlciBpcyBpbXBsZW1lbnRhdGlvbgotICAjIGRlcGVuZGVudCBpZiBhbnkgb2YgdGhlIG9wZXJhbmRzIGlzIG5lZ2F0aXZlLiBIZXJlIHdlIGVuZm9yY2UKLSAgIyAicm91bmRlZCB0b3dhcmQgemVybyIgc2VtYW50aWNzLiBGb3IgZXhhbXBsZSwgZm9yICgtNSkgLyAyIGFuCi0gICMgaW1wbGVtZW50YXRpb24gbWF5IGdpdmUgLTMgYXMgdGhlIHJlc3VsdCB3aXRoIHRoZSByZW1haW5kZXIgYmVpbmcKLSAgIyAxLiBUaGlzIGZ1bmN0aW9uIGVuc3VyZXMgd2UgYWx3YXlzIHJldHVybiAtMiAoY2xvc2VyIHRvIHplcm8pLgotICByZXN1bHQgPSB2YWx1ZSAvLyBkaXZpZGVyCi0gIHJlbWFpbmRlciA9IHZhbHVlICUgZGl2aWRlcgotICBpZiByZXN1bHQgPCAwIGFuZCByZW1haW5kZXIgPiAwOgotICAgIHJldHVybiByZXN1bHQgKyAxCi0gIGVsc2U6Ci0gICAgcmV0dXJuIHJlc3VsdAotCi0KLWNsYXNzIEZpZWxkTWFzayhvYmplY3QpOgotICAiIiJDbGFzcyBmb3IgRmllbGRNYXNrIG1lc3NhZ2UgdHlwZS4iIiIKLQotICBkZWYgVG9Kc29uU3RyaW5nKHNlbGYpOgotICAgICIiIkNvbnZlcnRzIEZpZWxkTWFzayB0byBzdHJpbmcgYWNjb3JkaW5nIHRvIHByb3RvMyBKU09OIHNwZWMuIiIiCi0gICAgcmV0dXJuICcsJy5qb2luKHNlbGYucGF0aHMpCi0KLSAgZGVmIEZyb21Kc29uU3RyaW5nKHNlbGYsIHZhbHVlKToKLSAgICAiIiJDb252ZXJ0cyBzdHJpbmcgdG8gRmllbGRNYXNrIGFjY29yZGluZyB0byBwcm90bzMgSlNPTiBzcGVjLiIiIgotICAgIHNlbGYuQ2xlYXIoKQotICAgIGZvciBwYXRoIGluIHZhbHVlLnNwbGl0KCcsJyk6Ci0gICAgICBzZWxmLnBhdGhzLmFwcGVuZChwYXRoKQotCi0gIGRlZiBJc1ZhbGlkRm9yRGVzY3JpcHRvcihzZWxmLCBtZXNzYWdlX2Rlc2NyaXB0b3IpOgotICAgICIiIkNoZWNrcyB3aGV0aGVyIHRoZSBGaWVsZE1hc2sgaXMgdmFsaWQgZm9yIE1lc3NhZ2UgRGVzY3JpcHRvci4iIiIKLSAgICBmb3IgcGF0aCBpbiBzZWxmLnBhdGhzOgotICAgICAgaWYgbm90IF9Jc1ZhbGlkUGF0aChtZXNzYWdlX2Rlc2NyaXB0b3IsIHBhdGgpOgotICAgICAgICByZXR1cm4gRmFsc2UKLSAgICByZXR1cm4gVHJ1ZQotCi0gIGRlZiBBbGxGaWVsZHNGcm9tRGVzY3JpcHRvcihzZWxmLCBtZXNzYWdlX2Rlc2NyaXB0b3IpOgotICAgICIiIkdldHMgYWxsIGRpcmVjdCBmaWVsZHMgb2YgTWVzc2FnZSBEZXNjcmlwdG9yIHRvIEZpZWxkTWFzay4iIiIKLSAgICBzZWxmLkNsZWFyKCkKLSAgICBmb3IgZmllbGQgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkczoKLSAgICAgIHNlbGYucGF0aHMuYXBwZW5kKGZpZWxkLm5hbWUpCi0KLSAgZGVmIENhbm9uaWNhbEZvcm1Gcm9tTWFzayhzZWxmLCBtYXNrKToKLSAgICAiIiJDb252ZXJ0cyBhIEZpZWxkTWFzayB0byB0aGUgY2Fub25pY2FsIGZvcm0uCi0KLSAgICBSZW1vdmVzIHBhdGhzIHRoYXQgYXJlIGNvdmVyZWQgYnkgYW5vdGhlciBwYXRoLiBGb3IgZXhhbXBsZSwKLSAgICAiZm9vLmJhciIgaXMgY292ZXJlZCBieSAiZm9vIiBhbmQgd2lsbCBiZSByZW1vdmVkIGlmICJmb28iCi0gICAgaXMgYWxzbyBpbiB0aGUgRmllbGRNYXNrLiBUaGVuIHNvcnRzIGFsbCBwYXRocyBpbiBhbHBoYWJldGljYWwgb3JkZXIuCi0KLSAgICBBcmdzOgotICAgICAgbWFzazogVGhlIG9yaWdpbmFsIEZpZWxkTWFzayB0byBiZSBjb252ZXJ0ZWQuCi0gICAgIiIiCi0gICAgdHJlZSA9IF9GaWVsZE1hc2tUcmVlKG1hc2spCi0gICAgdHJlZS5Ub0ZpZWxkTWFzayhzZWxmKQotCi0gIGRlZiBVbmlvbihzZWxmLCBtYXNrMSwgbWFzazIpOgotICAgICIiIk1lcmdlcyBtYXNrMSBhbmQgbWFzazIgaW50byB0aGlzIEZpZWxkTWFzay4iIiIKLSAgICBfQ2hlY2tGaWVsZE1hc2tNZXNzYWdlKG1hc2sxKQotICAgIF9DaGVja0ZpZWxkTWFza01lc3NhZ2UobWFzazIpCi0gICAgdHJlZSA9IF9GaWVsZE1hc2tUcmVlKG1hc2sxKQotICAgIHRyZWUuTWVyZ2VGcm9tRmllbGRNYXNrKG1hc2syKQotICAgIHRyZWUuVG9GaWVsZE1hc2soc2VsZikKLQotICBkZWYgSW50ZXJzZWN0KHNlbGYsIG1hc2sxLCBtYXNrMik6Ci0gICAgIiIiSW50ZXJzZWN0cyBtYXNrMSBhbmQgbWFzazIgaW50byB0aGlzIEZpZWxkTWFzay4iIiIKLSAgICBfQ2hlY2tGaWVsZE1hc2tNZXNzYWdlKG1hc2sxKQotICAgIF9DaGVja0ZpZWxkTWFza01lc3NhZ2UobWFzazIpCi0gICAgdHJlZSA9IF9GaWVsZE1hc2tUcmVlKG1hc2sxKQotICAgIGludGVyc2VjdGlvbiA9IF9GaWVsZE1hc2tUcmVlKCkKLSAgICBmb3IgcGF0aCBpbiBtYXNrMi5wYXRoczoKLSAgICAgIHRyZWUuSW50ZXJzZWN0UGF0aChwYXRoLCBpbnRlcnNlY3Rpb24pCi0gICAgaW50ZXJzZWN0aW9uLlRvRmllbGRNYXNrKHNlbGYpCi0KLSAgZGVmIE1lcmdlTWVzc2FnZSgKLSAgICAgIHNlbGYsIHNvdXJjZSwgZGVzdGluYXRpb24sCi0gICAgICByZXBsYWNlX21lc3NhZ2VfZmllbGQ9RmFsc2UsIHJlcGxhY2VfcmVwZWF0ZWRfZmllbGQ9RmFsc2UpOgotICAgICIiIk1lcmdlcyBmaWVsZHMgc3BlY2lmaWVkIGluIEZpZWxkTWFzayBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4KLQotICAgIEFyZ3M6Ci0gICAgICBzb3VyY2U6IFNvdXJjZSBtZXNzYWdlLgotICAgICAgZGVzdGluYXRpb246IFRoZSBkZXN0aW5hdGlvbiBtZXNzYWdlIHRvIGJlIG1lcmdlZCBpbnRvLgotICAgICAgcmVwbGFjZV9tZXNzYWdlX2ZpZWxkOiBSZXBsYWNlIG1lc3NhZ2UgZmllbGQgaWYgVHJ1ZS4gTWVyZ2UgbWVzc2FnZQotICAgICAgICAgIGZpZWxkIGlmIEZhbHNlLgotICAgICAgcmVwbGFjZV9yZXBlYXRlZF9maWVsZDogUmVwbGFjZSByZXBlYXRlZCBmaWVsZCBpZiBUcnVlLiBBcHBlbmQKLSAgICAgICAgICBlbGVtZW50cyBvZiByZXBlYXRlZCBmaWVsZCBpZiBGYWxzZS4KLSAgICAiIiIKLSAgICB0cmVlID0gX0ZpZWxkTWFza1RyZWUoc2VsZikKLSAgICB0cmVlLk1lcmdlTWVzc2FnZSgKLSAgICAgICAgc291cmNlLCBkZXN0aW5hdGlvbiwgcmVwbGFjZV9tZXNzYWdlX2ZpZWxkLCByZXBsYWNlX3JlcGVhdGVkX2ZpZWxkKQotCi0KLWRlZiBfSXNWYWxpZFBhdGgobWVzc2FnZV9kZXNjcmlwdG9yLCBwYXRoKToKLSAgIiIiQ2hlY2tzIHdoZXRoZXIgdGhlIHBhdGggaXMgdmFsaWQgZm9yIE1lc3NhZ2UgRGVzY3JpcHRvci4iIiIKLSAgcGFydHMgPSBwYXRoLnNwbGl0KCcuJykKLSAgbGFzdCA9IHBhcnRzLnBvcCgpCi0gIGZvciBuYW1lIGluIHBhcnRzOgotICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW25hbWVdCi0gICAgaWYgKGZpZWxkIGlzIE5vbmUgb3IKLSAgICAgICAgZmllbGQubGFiZWwgPT0gRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEIG9yCi0gICAgICAgIGZpZWxkLnR5cGUgIT0gRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSk6Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBmaWVsZC5tZXNzYWdlX3R5cGUKLSAgcmV0dXJuIGxhc3QgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lCi0KLQotZGVmIF9DaGVja0ZpZWxkTWFza01lc3NhZ2UobWVzc2FnZSk6Ci0gICIiIlJhaXNlcyBWYWx1ZUVycm9yIGlmIG1lc3NhZ2UgaXMgbm90IGEgRmllbGRNYXNrLiIiIgotICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBtZXNzYWdlLkRFU0NSSVBUT1IKLSAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lICE9ICdGaWVsZE1hc2snIG9yCi0gICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZmlsZS5uYW1lICE9ICdnb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wcm90bycpOgotICAgIHJhaXNlIFZhbHVlRXJyb3IoJ01lc3NhZ2UgezB9IGlzIG5vdCBhIEZpZWxkTWFzay4nLmZvcm1hdCgKLSAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkpCi0KLQotY2xhc3MgX0ZpZWxkTWFza1RyZWUob2JqZWN0KToKLSAgIiIiUmVwcmVzZW50cyBhIEZpZWxkTWFzayBpbiBhIHRyZWUgc3RydWN0dXJlLgotCi0gIEZvciBleGFtcGxlLCBnaXZlbiBhIEZpZWxkTWFzayAiZm9vLmJhcixmb28uYmF6LGJhci5iYXoiLAotICB0aGUgRmllbGRNYXNrVHJlZSB3aWxsIGJlOgotICAgICAgW19yb290XSAtKy0gZm9vIC0rLSBiYXIKLSAgICAgICAgICAgIHwgICAgICAgfAotICAgICAgICAgICAgfCAgICAgICArLSBiYXoKLSAgICAgICAgICAgIHwKLSAgICAgICAgICAgICstIGJhciAtLS0gYmF6Ci0gIEluIHRoZSB0cmVlLCBlYWNoIGxlYWYgbm9kZSByZXByZXNlbnRzIGEgZmllbGQgcGF0aC4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGZpZWxkX21hc2s9Tm9uZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZXMgdGhlIHRyZWUgYnkgRmllbGRNYXNrLiIiIgotICAgIHNlbGYuX3Jvb3QgPSB7fQotICAgIGlmIGZpZWxkX21hc2s6Ci0gICAgICBzZWxmLk1lcmdlRnJvbUZpZWxkTWFzayhmaWVsZF9tYXNrKQotCi0gIGRlZiBNZXJnZUZyb21GaWVsZE1hc2soc2VsZiwgZmllbGRfbWFzayk6Ci0gICAgIiIiTWVyZ2VzIGEgRmllbGRNYXNrIHRvIHRoZSB0cmVlLiIiIgotICAgIGZvciBwYXRoIGluIGZpZWxkX21hc2sucGF0aHM6Ci0gICAgICBzZWxmLkFkZFBhdGgocGF0aCkKLQotICBkZWYgQWRkUGF0aChzZWxmLCBwYXRoKToKLSAgICAiIiJBZGRzIGEgZmllbGQgcGF0aCBpbnRvIHRoZSB0cmVlLgotCi0gICAgSWYgdGhlIGZpZWxkIHBhdGggdG8gYWRkIGlzIGEgc3ViLXBhdGggb2YgYW4gZXhpc3RpbmcgZmllbGQgcGF0aAotICAgIGluIHRoZSB0cmVlIChpLmUuLCBhIGxlYWYgbm9kZSksIGl0IG1lYW5zIHRoZSB0cmVlIGFscmVhZHkgbWF0Y2hlcwotICAgIHRoZSBnaXZlbiBwYXRoIHNvIG5vdGhpbmcgd2lsbCBiZSBhZGRlZCB0byB0aGUgdHJlZS4gSWYgdGhlIHBhdGgKLSAgICBtYXRjaGVzIGFuIGV4aXN0aW5nIG5vbi1sZWFmIG5vZGUgaW4gdGhlIHRyZWUsIHRoYXQgbm9uLWxlYWYgbm9kZQotICAgIHdpbGwgYmUgdHVybmVkIGludG8gYSBsZWFmIG5vZGUgd2l0aCBhbGwgaXRzIGNoaWxkcmVuIHJlbW92ZWQgYmVjYXVzZQotICAgIHRoZSBwYXRoIG1hdGNoZXMgYWxsIHRoZSBub2RlJ3MgY2hpbGRyZW4uIE90aGVyd2lzZSwgYSBuZXcgcGF0aCB3aWxsCi0gICAgYmUgYWRkZWQuCi0KLSAgICBBcmdzOgotICAgICAgcGF0aDogVGhlIGZpZWxkIHBhdGggdG8gYWRkLgotICAgICIiIgotICAgIG5vZGUgPSBzZWxmLl9yb290Ci0gICAgZm9yIG5hbWUgaW4gcGF0aC5zcGxpdCgnLicpOgotICAgICAgaWYgbmFtZSBub3QgaW4gbm9kZToKLSAgICAgICAgbm9kZVtuYW1lXSA9IHt9Ci0gICAgICBlbGlmIG5vdCBub2RlW25hbWVdOgotICAgICAgICAjIFByZS1leGlzdGluZyBlbXB0eSBub2RlIGltcGxpZXMgd2UgYWxyZWFkeSBoYXZlIHRoaXMgZW50aXJlIHRyZWUuCi0gICAgICAgIHJldHVybgotICAgICAgbm9kZSA9IG5vZGVbbmFtZV0KLSAgICAjIFJlbW92ZSBhbnkgc3ViLXRyZWVzIHdlIG1pZ2h0IGhhdmUgaGFkLgotICAgIG5vZGUuY2xlYXIoKQotCi0gIGRlZiBUb0ZpZWxkTWFzayhzZWxmLCBmaWVsZF9tYXNrKToKLSAgICAiIiJDb252ZXJ0cyB0aGUgdHJlZSB0byBhIEZpZWxkTWFzay4iIiIKLSAgICBmaWVsZF9tYXNrLkNsZWFyKCkKLSAgICBfQWRkRmllbGRQYXRocyhzZWxmLl9yb290LCAnJywgZmllbGRfbWFzaykKLQotICBkZWYgSW50ZXJzZWN0UGF0aChzZWxmLCBwYXRoLCBpbnRlcnNlY3Rpb24pOgotICAgICIiIkNhbGN1bGF0ZXMgdGhlIGludGVyc2VjdGlvbiBwYXJ0IG9mIGEgZmllbGQgcGF0aCB3aXRoIHRoaXMgdHJlZS4KLQotICAgIEFyZ3M6Ci0gICAgICBwYXRoOiBUaGUgZmllbGQgcGF0aCB0byBjYWxjdWxhdGVzLgotICAgICAgaW50ZXJzZWN0aW9uOiBUaGUgb3V0IHRyZWUgdG8gcmVjb3JkIHRoZSBpbnRlcnNlY3Rpb24gcGFydC4KLSAgICAiIiIKLSAgICBub2RlID0gc2VsZi5fcm9vdAotICAgIGZvciBuYW1lIGluIHBhdGguc3BsaXQoJy4nKToKLSAgICAgIGlmIG5hbWUgbm90IGluIG5vZGU6Ci0gICAgICAgIHJldHVybgotICAgICAgZWxpZiBub3Qgbm9kZVtuYW1lXToKLSAgICAgICAgaW50ZXJzZWN0aW9uLkFkZFBhdGgocGF0aCkKLSAgICAgICAgcmV0dXJuCi0gICAgICBub2RlID0gbm9kZVtuYW1lXQotICAgIGludGVyc2VjdGlvbi5BZGRMZWFmTm9kZXMocGF0aCwgbm9kZSkKLQotICBkZWYgQWRkTGVhZk5vZGVzKHNlbGYsIHByZWZpeCwgbm9kZSk6Ci0gICAgIiIiQWRkcyBsZWFmIG5vZGVzIGJlZ2luIHdpdGggcHJlZml4IHRvIHRoaXMgdHJlZS4iIiIKLSAgICBpZiBub3Qgbm9kZToKLSAgICAgIHNlbGYuQWRkUGF0aChwcmVmaXgpCi0gICAgZm9yIG5hbWUgaW4gbm9kZToKLSAgICAgIGNoaWxkX3BhdGggPSBwcmVmaXggKyAnLicgKyBuYW1lCi0gICAgICBzZWxmLkFkZExlYWZOb2RlcyhjaGlsZF9wYXRoLCBub2RlW25hbWVdKQotCi0gIGRlZiBNZXJnZU1lc3NhZ2UoCi0gICAgICBzZWxmLCBzb3VyY2UsIGRlc3RpbmF0aW9uLAotICAgICAgcmVwbGFjZV9tZXNzYWdlLCByZXBsYWNlX3JlcGVhdGVkKToKLSAgICAiIiJNZXJnZSBhbGwgZmllbGRzIHNwZWNpZmllZCBieSB0aGlzIHRyZWUgZnJvbSBzb3VyY2UgdG8gZGVzdGluYXRpb24uIiIiCi0gICAgX01lcmdlTWVzc2FnZSgKLSAgICAgICAgc2VsZi5fcm9vdCwgc291cmNlLCBkZXN0aW5hdGlvbiwgcmVwbGFjZV9tZXNzYWdlLCByZXBsYWNlX3JlcGVhdGVkKQotCi0KLWRlZiBfU3RyQ29udmVydCh2YWx1ZSk6Ci0gICIiIkNvbnZlcnRzIHZhbHVlIHRvIHN0ciBpZiBpdCBpcyBub3QuIiIiCi0gICMgVGhpcyBmaWxlIGlzIGltcG9ydGVkIGJ5IGMgZXh0ZW5zaW9uIGFuZCBzb21lIG1ldGhvZHMgbGlrZSBDbGVhckZpZWxkCi0gICMgcmVxdWlyZXMgc3RyaW5nIGZvciB0aGUgZmllbGQgbmFtZS4gcHkyL3B5MyBoYXMgZGlmZmVyZW50IHRleHQKLSAgIyB0eXBlIGFuZCBtYXkgdXNlIHVuaWNvZGUuCi0gIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBzdHIpOgotICAgIHJldHVybiB2YWx1ZS5lbmNvZGUoJ3V0Zi04JykKLSAgcmV0dXJuIHZhbHVlCi0KLQotZGVmIF9NZXJnZU1lc3NhZ2UoCi0gICAgbm9kZSwgc291cmNlLCBkZXN0aW5hdGlvbiwgcmVwbGFjZV9tZXNzYWdlLCByZXBsYWNlX3JlcGVhdGVkKToKLSAgIiIiTWVyZ2UgYWxsIGZpZWxkcyBzcGVjaWZpZWQgYnkgYSBzdWItdHJlZSBmcm9tIHNvdXJjZSB0byBkZXN0aW5hdGlvbi4iIiIKLSAgc291cmNlX2Rlc2NyaXB0b3IgPSBzb3VyY2UuREVTQ1JJUFRPUgotICBmb3IgbmFtZSBpbiBub2RlOgotICAgIGNoaWxkID0gbm9kZVtuYW1lXQotICAgIGZpZWxkID0gc291cmNlX2Rlc2NyaXB0b3IuZmllbGRzX2J5X25hbWVbbmFtZV0KLSAgICBpZiBmaWVsZCBpcyBOb25lOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcignRXJyb3I6IENhblwndCBmaW5kIGZpZWxkIHswfSBpbiBtZXNzYWdlIHsxfS4nLmZvcm1hdCgKLSAgICAgICAgICBuYW1lLCBzb3VyY2VfZGVzY3JpcHRvci5mdWxsX25hbWUpKQotICAgIGlmIGNoaWxkOgotICAgICAgIyBTdWItcGF0aHMgYXJlIG9ubHkgYWxsb3dlZCBmb3Igc2luZ3VsYXIgbWVzc2FnZSBmaWVsZHMuCi0gICAgICBpZiAoZmllbGQubGFiZWwgPT0gRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEIG9yCi0gICAgICAgICAgZmllbGQuY3BwX3R5cGUgIT0gRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSk6Ci0gICAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ0Vycm9yOiBGaWVsZCB7MH0gaW4gbWVzc2FnZSB7MX0gaXMgbm90IGEgc2luZ3VsYXIgJwotICAgICAgICAgICAgICAgICAgICAgICAgICdtZXNzYWdlIGZpZWxkIGFuZCBjYW5ub3QgaGF2ZSBzdWItZmllbGRzLicuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBzb3VyY2VfZGVzY3JpcHRvci5mdWxsX25hbWUpKQotICAgICAgX01lcmdlTWVzc2FnZSgKLSAgICAgICAgICBjaGlsZCwgZ2V0YXR0cihzb3VyY2UsIG5hbWUpLCBnZXRhdHRyKGRlc3RpbmF0aW9uLCBuYW1lKSwKLSAgICAgICAgICByZXBsYWNlX21lc3NhZ2UsIHJlcGxhY2VfcmVwZWF0ZWQpCi0gICAgICBjb250aW51ZQotICAgIGlmIGZpZWxkLmxhYmVsID09IEZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgIGlmIHJlcGxhY2VfcmVwZWF0ZWQ6Ci0gICAgICAgIGRlc3RpbmF0aW9uLkNsZWFyRmllbGQoX1N0ckNvbnZlcnQobmFtZSkpCi0gICAgICByZXBlYXRlZF9zb3VyY2UgPSBnZXRhdHRyKHNvdXJjZSwgbmFtZSkKLSAgICAgIHJlcGVhdGVkX2Rlc3RpbmF0aW9uID0gZ2V0YXR0cihkZXN0aW5hdGlvbiwgbmFtZSkKLSAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IEZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGZvciBpdGVtIGluIHJlcGVhdGVkX3NvdXJjZToKLSAgICAgICAgICByZXBlYXRlZF9kZXN0aW5hdGlvbi5hZGQoKS5NZXJnZUZyb20oaXRlbSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJlcGVhdGVkX2Rlc3RpbmF0aW9uLmV4dGVuZChyZXBlYXRlZF9zb3VyY2UpCi0gICAgZWxzZToKLSAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IEZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGlmIHJlcGxhY2VfbWVzc2FnZToKLSAgICAgICAgICBkZXN0aW5hdGlvbi5DbGVhckZpZWxkKF9TdHJDb252ZXJ0KG5hbWUpKQotICAgICAgICBpZiBzb3VyY2UuSGFzRmllbGQobmFtZSk6Ci0gICAgICAgICAgZ2V0YXR0cihkZXN0aW5hdGlvbiwgbmFtZSkuTWVyZ2VGcm9tKGdldGF0dHIoc291cmNlLCBuYW1lKSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNldGF0dHIoZGVzdGluYXRpb24sIG5hbWUsIGdldGF0dHIoc291cmNlLCBuYW1lKSkKLQotCi1kZWYgX0FkZEZpZWxkUGF0aHMobm9kZSwgcHJlZml4LCBmaWVsZF9tYXNrKToKLSAgIiIiQWRkcyB0aGUgZmllbGQgcGF0aHMgZGVzY2VuZGVkIGZyb20gbm9kZSB0byBmaWVsZF9tYXNrLiIiIgotICBpZiBub3Qgbm9kZToKLSAgICBmaWVsZF9tYXNrLnBhdGhzLmFwcGVuZChwcmVmaXgpCi0gICAgcmV0dXJuCi0gIGZvciBuYW1lIGluIHNvcnRlZChub2RlKToKLSAgICBpZiBwcmVmaXg6Ci0gICAgICBjaGlsZF9wYXRoID0gcHJlZml4ICsgJy4nICsgbmFtZQotICAgIGVsc2U6Ci0gICAgICBjaGlsZF9wYXRoID0gbmFtZQotICAgIF9BZGRGaWVsZFBhdGhzKG5vZGVbbmFtZV0sIGNoaWxkX3BhdGgsIGZpZWxkX21hc2spCi0KLQotX0lOVF9PUl9GTE9BVCA9IHNpeC5pbnRlZ2VyX3R5cGVzICsgKGZsb2F0LCkKLQotCi1kZWYgX1NldFN0cnVjdFZhbHVlKHN0cnVjdF92YWx1ZSwgdmFsdWUpOgotICBpZiB2YWx1ZSBpcyBOb25lOgotICAgIHN0cnVjdF92YWx1ZS5udWxsX3ZhbHVlID0gMAotICBlbGlmIGlzaW5zdGFuY2UodmFsdWUsIGJvb2wpOgotICAgICMgTm90ZTogdGhpcyBjaGVjayBtdXN0IGNvbWUgYmVmb3JlIHRoZSBudW1iZXIgY2hlY2sgYmVjYXVzZSBpbiBQeXRob24KLSAgICAjIFRydWUgYW5kIEZhbHNlIGFyZSBhbHNvIGNvbnNpZGVyZWQgbnVtYmVycy4KLSAgICBzdHJ1Y3RfdmFsdWUuYm9vbF92YWx1ZSA9IHZhbHVlCi0gIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgc2l4LnN0cmluZ190eXBlcyk6Ci0gICAgc3RydWN0X3ZhbHVlLnN0cmluZ192YWx1ZSA9IHZhbHVlCi0gIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgX0lOVF9PUl9GTE9BVCk6Ci0gICAgc3RydWN0X3ZhbHVlLm51bWJlcl92YWx1ZSA9IHZhbHVlCi0gIGVsc2U6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcignVW5leHBlY3RlZCB0eXBlJykKLQotCi1kZWYgX0dldFN0cnVjdFZhbHVlKHN0cnVjdF92YWx1ZSk6Ci0gIHdoaWNoID0gc3RydWN0X3ZhbHVlLldoaWNoT25lb2YoJ2tpbmQnKQotICBpZiB3aGljaCA9PSAnc3RydWN0X3ZhbHVlJzoKLSAgICByZXR1cm4gc3RydWN0X3ZhbHVlLnN0cnVjdF92YWx1ZQotICBlbGlmIHdoaWNoID09ICdudWxsX3ZhbHVlJzoKLSAgICByZXR1cm4gTm9uZQotICBlbGlmIHdoaWNoID09ICdudW1iZXJfdmFsdWUnOgotICAgIHJldHVybiBzdHJ1Y3RfdmFsdWUubnVtYmVyX3ZhbHVlCi0gIGVsaWYgd2hpY2ggPT0gJ3N0cmluZ192YWx1ZSc6Ci0gICAgcmV0dXJuIHN0cnVjdF92YWx1ZS5zdHJpbmdfdmFsdWUKLSAgZWxpZiB3aGljaCA9PSAnYm9vbF92YWx1ZSc6Ci0gICAgcmV0dXJuIHN0cnVjdF92YWx1ZS5ib29sX3ZhbHVlCi0gIGVsaWYgd2hpY2ggPT0gJ2xpc3RfdmFsdWUnOgotICAgIHJldHVybiBzdHJ1Y3RfdmFsdWUubGlzdF92YWx1ZQotICBlbGlmIHdoaWNoIGlzIE5vbmU6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcignVmFsdWUgbm90IHNldCcpCi0KLQotY2xhc3MgU3RydWN0KG9iamVjdCk6Ci0gICIiIkNsYXNzIGZvciBTdHJ1Y3QgbWVzc2FnZSB0eXBlLiIiIgotCi0gIF9fc2xvdHNfXyA9IFtdCi0KLSAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGtleSk6Ci0gICAgcmV0dXJuIF9HZXRTdHJ1Y3RWYWx1ZShzZWxmLmZpZWxkc1trZXldKQotCi0gIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKLSAgICBfU2V0U3RydWN0VmFsdWUoc2VsZi5maWVsZHNba2V5XSwgdmFsdWUpCi0KLSAgZGVmIGdldF9vcl9jcmVhdGVfbGlzdChzZWxmLCBrZXkpOgotICAgICIiIlJldHVybnMgYSBsaXN0IGZvciB0aGlzIGtleSwgY3JlYXRpbmcgaWYgaXQgZGlkbid0IGV4aXN0IGFscmVhZHkuIiIiCi0gICAgcmV0dXJuIHNlbGYuZmllbGRzW2tleV0ubGlzdF92YWx1ZQotCi0gIGRlZiBnZXRfb3JfY3JlYXRlX3N0cnVjdChzZWxmLCBrZXkpOgotICAgICIiIlJldHVybnMgYSBzdHJ1Y3QgZm9yIHRoaXMga2V5LCBjcmVhdGluZyBpZiBpdCBkaWRuJ3QgZXhpc3QgYWxyZWFkeS4iIiIKLSAgICByZXR1cm4gc2VsZi5maWVsZHNba2V5XS5zdHJ1Y3RfdmFsdWUKLQotICAjIFRPRE8oaGFiZXJtYW4pOiBhbGxvdyBjb25zdHJ1Y3RpbmcvbWVyZ2luZyBmcm9tIGRpY3QuCi0KLQotY2xhc3MgTGlzdFZhbHVlKG9iamVjdCk6Ci0gICIiIkNsYXNzIGZvciBMaXN0VmFsdWUgbWVzc2FnZSB0eXBlLiIiIgotCi0gIGRlZiBfX2xlbl9fKHNlbGYpOgotICAgIHJldHVybiBsZW4oc2VsZi52YWx1ZXMpCi0KLSAgZGVmIGFwcGVuZChzZWxmLCB2YWx1ZSk6Ci0gICAgX1NldFN0cnVjdFZhbHVlKHNlbGYudmFsdWVzLmFkZCgpLCB2YWx1ZSkKLQotICBkZWYgZXh0ZW5kKHNlbGYsIGVsZW1fc2VxKToKLSAgICBmb3IgdmFsdWUgaW4gZWxlbV9zZXE6Ci0gICAgICBzZWxmLmFwcGVuZCh2YWx1ZSkKLQotICBkZWYgX19nZXRpdGVtX18oc2VsZiwgaW5kZXgpOgotICAgICIiIlJldHJpZXZlcyBpdGVtIGJ5IHRoZSBzcGVjaWZpZWQgaW5kZXguIiIiCi0gICAgcmV0dXJuIF9HZXRTdHJ1Y3RWYWx1ZShzZWxmLnZhbHVlcy5fX2dldGl0ZW1fXyhpbmRleCkpCi0KLSAgZGVmIF9fc2V0aXRlbV9fKHNlbGYsIGluZGV4LCB2YWx1ZSk6Ci0gICAgX1NldFN0cnVjdFZhbHVlKHNlbGYudmFsdWVzLl9fZ2V0aXRlbV9fKGluZGV4KSwgdmFsdWUpCi0KLSAgZGVmIGl0ZW1zKHNlbGYpOgotICAgIGZvciBpIGluIHJhbmdlKGxlbihzZWxmKSk6Ci0gICAgICB5aWVsZCBzZWxmW2ldCi0KLSAgZGVmIGFkZF9zdHJ1Y3Qoc2VsZik6Ci0gICAgIiIiQXBwZW5kcyBhbmQgcmV0dXJucyBhIHN0cnVjdCB2YWx1ZSBhcyB0aGUgbmV4dCB2YWx1ZSBpbiB0aGUgbGlzdC4iIiIKLSAgICByZXR1cm4gc2VsZi52YWx1ZXMuYWRkKCkuc3RydWN0X3ZhbHVlCi0KLSAgZGVmIGFkZF9saXN0KHNlbGYpOgotICAgICIiIkFwcGVuZHMgYW5kIHJldHVybnMgYSBsaXN0IHZhbHVlIGFzIHRoZSBuZXh0IHZhbHVlIGluIHRoZSBsaXN0LiIiIgotICAgIHJldHVybiBzZWxmLnZhbHVlcy5hZGQoKS5saXN0X3ZhbHVlCi0KLQotV0tUQkFTRVMgPSB7Ci0gICAgJ2dvb2dsZS5wcm90b2J1Zi5BbnknOiBBbnksCi0gICAgJ2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbic6IER1cmF0aW9uLAotICAgICdnb29nbGUucHJvdG9idWYuRmllbGRNYXNrJzogRmllbGRNYXNrLAotICAgICdnb29nbGUucHJvdG9idWYuTGlzdFZhbHVlJzogTGlzdFZhbHVlLAotICAgICdnb29nbGUucHJvdG9idWYuU3RydWN0JzogU3RydWN0LAotICAgICdnb29nbGUucHJvdG9idWYuVGltZXN0YW1wJzogVGltZXN0YW1wLAotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93ZWxsX2tub3duX3R5cGVzX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXNfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmYzMmFjOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dlbGxfa25vd25fdHlwZXNfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDY0NCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53ZWxsX2tub3duX3R5cGVzLiIiIgotCi1fX2F1dGhvcl9fID0gJ2ppZWx1b0Bnb29nbGUuY29tIChKaWUgTHVvKScKLQotZnJvbSBkYXRldGltZSBpbXBvcnQgZGF0ZXRpbWUKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGFueV9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkdXJhdGlvbl9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBmaWVsZF9tYXNrX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN0cnVjdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0aW1lc3RhbXBfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYW55X3Rlc3RfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2VsbF9rbm93bl90eXBlcwotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAotCi0KLWNsYXNzIFRpbWVVdGlsVGVzdEJhc2UodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBDaGVja1RpbWVzdGFtcENvbnZlcnNpb24oc2VsZiwgbWVzc2FnZSwgdGV4dCk6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBtZXNzYWdlLlRvSnNvblN0cmluZygpKQotICAgIHBhcnNlZF9tZXNzYWdlID0gdGltZXN0YW1wX3BiMi5UaW1lc3RhbXAoKQotICAgIHBhcnNlZF9tZXNzYWdlLkZyb21Kc29uU3RyaW5nKHRleHQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLQotICBkZWYgQ2hlY2tEdXJhdGlvbkNvbnZlcnNpb24oc2VsZiwgbWVzc2FnZSwgdGV4dCk6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCh0ZXh0LCBtZXNzYWdlLlRvSnNvblN0cmluZygpKQotICAgIHBhcnNlZF9tZXNzYWdlID0gZHVyYXRpb25fcGIyLkR1cmF0aW9uKCkKLSAgICBwYXJzZWRfbWVzc2FnZS5Gcm9tSnNvblN0cmluZyh0ZXh0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLQotY2xhc3MgVGltZVV0aWxUZXN0KFRpbWVVdGlsVGVzdEJhc2UpOgotCi0gIGRlZiB0ZXN0VGltZXN0YW1wU2VyaWFsaXplQW5kUGFyc2Uoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHRpbWVzdGFtcF9wYjIuVGltZXN0YW1wKCkKLSAgICAjIEdlbmVyYXRlZCBvdXRwdXQgc2hvdWxkIGNvbnRhaW4gMywgNiwgb3IgOSBmcmFjdGlvbmFsIGRpZ2l0cy4KLSAgICBtZXNzYWdlLnNlY29uZHMgPSAwCi0gICAgbWVzc2FnZS5uYW5vcyA9IDAKLSAgICBzZWxmLkNoZWNrVGltZXN0YW1wQ29udmVyc2lvbihtZXNzYWdlLCAnMTk3MC0wMS0wMVQwMDowMDowMFonKQotICAgIG1lc3NhZ2UubmFub3MgPSAxMDAwMDAwMAotICAgIHNlbGYuQ2hlY2tUaW1lc3RhbXBDb252ZXJzaW9uKG1lc3NhZ2UsICcxOTcwLTAxLTAxVDAwOjAwOjAwLjAxMFonKQotICAgIG1lc3NhZ2UubmFub3MgPSAxMDAwMAotICAgIHNlbGYuQ2hlY2tUaW1lc3RhbXBDb252ZXJzaW9uKG1lc3NhZ2UsICcxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAxMFonKQotICAgIG1lc3NhZ2UubmFub3MgPSAxMAotICAgIHNlbGYuQ2hlY2tUaW1lc3RhbXBDb252ZXJzaW9uKG1lc3NhZ2UsICcxOTcwLTAxLTAxVDAwOjAwOjAwLjAwMDAwMDAxMFonKQotICAgICMgVGVzdCBtaW4gdGltZXN0YW1wcy4KLSAgICBtZXNzYWdlLnNlY29uZHMgPSAtNjIxMzU1OTY4MDAKLSAgICBtZXNzYWdlLm5hbm9zID0gMAotICAgIHNlbGYuQ2hlY2tUaW1lc3RhbXBDb252ZXJzaW9uKG1lc3NhZ2UsICcwMDAxLTAxLTAxVDAwOjAwOjAwWicpCi0gICAgIyBUZXN0IG1heCB0aW1lc3RhbXBzLgotICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IDI1MzQwMjMwMDc5OQotICAgIG1lc3NhZ2UubmFub3MgPSA5OTk5OTk5OTkKLSAgICBzZWxmLkNoZWNrVGltZXN0YW1wQ29udmVyc2lvbihtZXNzYWdlLCAnOTk5OS0xMi0zMVQyMzo1OTo1OS45OTk5OTk5OTlaJykKLSAgICAjIFRlc3QgbmVnYXRpdmUgdGltZXN0YW1wcy4KLSAgICBtZXNzYWdlLnNlY29uZHMgPSAtMQotICAgIHNlbGYuQ2hlY2tUaW1lc3RhbXBDb252ZXJzaW9uKG1lc3NhZ2UsICcxOTY5LTEyLTMxVDIzOjU5OjU5Ljk5OTk5OTk5OVonKQotCi0gICAgIyBQYXJzaW5nIGFjY2VwdHMgYW4gZnJhY3Rpb25hbCBkaWdpdHMgYXMgbG9uZyBhcyB0aGV5IGZpdCBpbnRvIG5hbm8KLSAgICAjIHByZWNpc2lvbi4KLSAgICBtZXNzYWdlLkZyb21Kc29uU3RyaW5nKCcxOTcwLTAxLTAxVDAwOjAwOjAwLjFaJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2Uuc2Vjb25kcykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDAwMDAwMCwgbWVzc2FnZS5uYW5vcykKLSAgICAjIFBhcnNpbmcgYWNjcGV0cyBvZmZzZXRzLgotICAgIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcoJzE5NzAtMDEtMDFUMDA6MDA6MDAtMDg6MDAnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCAqIDM2MDAsIG1lc3NhZ2Uuc2Vjb25kcykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG1lc3NhZ2UubmFub3MpCi0KLSAgZGVmIHRlc3REdXJhdGlvblNlcmlhbGl6ZUFuZFBhcnNlKHNlbGYpOgotICAgIG1lc3NhZ2UgPSBkdXJhdGlvbl9wYjIuRHVyYXRpb24oKQotICAgICMgR2VuZXJhdGVkIG91dHB1dCBzaG91bGQgY29udGFpbiAzLCA2LCBvciA5IGZyYWN0aW9uYWwgZGlnaXRzLgotICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IDAKLSAgICBtZXNzYWdlLm5hbm9zID0gMAotICAgIHNlbGYuQ2hlY2tEdXJhdGlvbkNvbnZlcnNpb24obWVzc2FnZSwgJzBzJykKLSAgICBtZXNzYWdlLm5hbm9zID0gMTAwMDAwMDAKLSAgICBzZWxmLkNoZWNrRHVyYXRpb25Db252ZXJzaW9uKG1lc3NhZ2UsICcwLjAxMHMnKQotICAgIG1lc3NhZ2UubmFub3MgPSAxMDAwMAotICAgIHNlbGYuQ2hlY2tEdXJhdGlvbkNvbnZlcnNpb24obWVzc2FnZSwgJzAuMDAwMDEwcycpCi0gICAgbWVzc2FnZS5uYW5vcyA9IDEwCi0gICAgc2VsZi5DaGVja0R1cmF0aW9uQ29udmVyc2lvbihtZXNzYWdlLCAnMC4wMDAwMDAwMTBzJykKLQotICAgICMgVGVzdCBtaW4gYW5kIG1heAotICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IDMxNTU3NjAwMDAwMAotICAgIG1lc3NhZ2UubmFub3MgPSA5OTk5OTk5OTkKLSAgICBzZWxmLkNoZWNrRHVyYXRpb25Db252ZXJzaW9uKG1lc3NhZ2UsICczMTU1NzYwMDAwMDAuOTk5OTk5OTk5cycpCi0gICAgbWVzc2FnZS5zZWNvbmRzID0gLTMxNTU3NjAwMDAwMAotICAgIG1lc3NhZ2UubmFub3MgPSAtOTk5OTk5OTk5Ci0gICAgc2VsZi5DaGVja0R1cmF0aW9uQ29udmVyc2lvbihtZXNzYWdlLCAnLTMxNTU3NjAwMDAwMC45OTk5OTk5OTlzJykKLQotICAgICMgUGFyc2luZyBhY2NlcHRzIGFuIGZyYWN0aW9uYWwgZGlnaXRzIGFzIGxvbmcgYXMgdGhleSBmaXQgaW50byBuYW5vCi0gICAgIyBwcmVjaXNpb24uCi0gICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZygnMC4xcycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAwMDAwMDAsIG1lc3NhZ2UubmFub3MpCi0gICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZygnMC4wMDAwMDAxcycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMDAsIG1lc3NhZ2UubmFub3MpCi0KLSAgZGVmIHRlc3RUaW1lc3RhbXBJbnRlZ2VyQ29udmVyc2lvbihzZWxmKToKLSAgICBtZXNzYWdlID0gdGltZXN0YW1wX3BiMi5UaW1lc3RhbXAoKQotICAgIG1lc3NhZ2UuRnJvbU5hbm9zZWNvbmRzKDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMTk3MC0wMS0wMVQwMDowMDowMC4wMDAwMDAwMDFaJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvTmFub3NlY29uZHMoKSkKLQotICAgIG1lc3NhZ2UuRnJvbU5hbm9zZWNvbmRzKC0xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE5NjktMTItMzFUMjM6NTk6NTkuOTk5OTk5OTk5WicsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIG1lc3NhZ2UuVG9OYW5vc2Vjb25kcygpKQotCi0gICAgbWVzc2FnZS5Gcm9tTWljcm9zZWNvbmRzKDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMTk3MC0wMS0wMVQwMDowMDowMC4wMDAwMDFaJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvTWljcm9zZWNvbmRzKCkpCi0KLSAgICBtZXNzYWdlLkZyb21NaWNyb3NlY29uZHMoLTEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMTk2OS0xMi0zMVQyMzo1OTo1OS45OTk5OTlaJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgbWVzc2FnZS5Ub01pY3Jvc2Vjb25kcygpKQotCi0gICAgbWVzc2FnZS5Gcm9tTWlsbGlzZWNvbmRzKDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMTk3MC0wMS0wMVQwMDowMDowMC4wMDFaJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvTWlsbGlzZWNvbmRzKCkpCi0KLSAgICBtZXNzYWdlLkZyb21NaWxsaXNlY29uZHMoLTEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMTk2OS0xMi0zMVQyMzo1OTo1OS45OTlaJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgbWVzc2FnZS5Ub01pbGxpc2Vjb25kcygpKQotCi0gICAgbWVzc2FnZS5Gcm9tU2Vjb25kcygxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzE5NzAtMDEtMDFUMDA6MDA6MDFaJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvU2Vjb25kcygpKQotCi0gICAgbWVzc2FnZS5Gcm9tU2Vjb25kcygtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcxOTY5LTEyLTMxVDIzOjU5OjU5WicsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIG1lc3NhZ2UuVG9TZWNvbmRzKCkpCi0KLSAgICBtZXNzYWdlLkZyb21OYW5vc2Vjb25kcygxOTk5KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub01pY3Jvc2Vjb25kcygpKQotICAgICMgRm9yIG5lZ2F0aXZlIHZhbHVlcywgVGltZXN0YW1wIHdpbGwgYmUgcm91bmRlZCBkb3duLgotICAgICMgRm9yIGV4YW1wbGUsICIxOTY5LTEyLTMxVDIzOjU5OjU5LjVaIiAoaS5lLiwgLTAuNXMpIHJvdW5kZWQgdG8gc2Vjb25kcwotICAgICMgd2lsbCBiZSAiMTk2OS0xMi0zMVQyMzo1OTo1OVoiIChpLmUuLCAtMXMpIHJhdGhlciB0aGFuCi0gICAgIyAiMTk3MC0wMS0wMVQwMDowMDowMFoiIChpLmUuLCAwcykuCi0gICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoLTE5OTkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMiwgbWVzc2FnZS5Ub01pY3Jvc2Vjb25kcygpKQotCi0gIGRlZiB0ZXN0RHVyYXRpb25JbnRlZ2VyQ29udmVyc2lvbihzZWxmKToKLSAgICBtZXNzYWdlID0gZHVyYXRpb25fcGIyLkR1cmF0aW9uKCkKLSAgICBtZXNzYWdlLkZyb21OYW5vc2Vjb25kcygxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJzAuMDAwMDAwMDAxcycsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbWVzc2FnZS5Ub05hbm9zZWNvbmRzKCkpCi0KLSAgICBtZXNzYWdlLkZyb21OYW5vc2Vjb25kcygtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCctMC4wMDAwMDAwMDFzJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgbWVzc2FnZS5Ub05hbm9zZWNvbmRzKCkpCi0KLSAgICBtZXNzYWdlLkZyb21NaWNyb3NlY29uZHMoMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcwLjAwMDAwMXMnLAotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0pzb25TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG1lc3NhZ2UuVG9NaWNyb3NlY29uZHMoKSkKLQotICAgIG1lc3NhZ2UuRnJvbU1pY3Jvc2Vjb25kcygtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCctMC4wMDAwMDFzJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMSwgbWVzc2FnZS5Ub01pY3Jvc2Vjb25kcygpKQotCi0gICAgbWVzc2FnZS5Gcm9tTWlsbGlzZWNvbmRzKDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnMC4wMDFzJywKLSAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvTWlsbGlzZWNvbmRzKCkpCi0KLSAgICBtZXNzYWdlLkZyb21NaWxsaXNlY29uZHMoLTEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnLTAuMDAxcycsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIG1lc3NhZ2UuVG9NaWxsaXNlY29uZHMoKSkKLQotICAgIG1lc3NhZ2UuRnJvbVNlY29uZHMoMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcxcycsIG1lc3NhZ2UuVG9Kc29uU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBtZXNzYWdlLlRvU2Vjb25kcygpKQotCi0gICAgbWVzc2FnZS5Gcm9tU2Vjb25kcygtMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCctMXMnLAotICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5Ub0pzb25TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBtZXNzYWdlLlRvU2Vjb25kcygpKQotCi0gICAgIyBUZXN0IHRydW5jYXRpb24gYmVoYXZpb3IuCi0gICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoMTk5OSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG1lc3NhZ2UuVG9NaWNyb3NlY29uZHMoKSkKLQotICAgICMgRm9yIG5lZ2F0aXZlIHZhbHVlcywgRHVyYXRpb24gd2lsbCBiZSByb3VuZGVkIHRvd2FyZHMgMC4KLSAgICBtZXNzYWdlLkZyb21OYW5vc2Vjb25kcygtMTk5OSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBtZXNzYWdlLlRvTWljcm9zZWNvbmRzKCkpCi0KLSAgZGVmIHRlc3REYXRldGltZUNvbnZlcmlzb24oc2VsZik6Ci0gICAgbWVzc2FnZSA9IHRpbWVzdGFtcF9wYjIuVGltZXN0YW1wKCkKLSAgICBkdCA9IGRhdGV0aW1lKDE5NzAsIDEsIDEpCi0gICAgbWVzc2FnZS5Gcm9tRGF0ZXRpbWUoZHQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChkdCwgbWVzc2FnZS5Ub0RhdGV0aW1lKCkpCi0KLSAgICBtZXNzYWdlLkZyb21NaWxsaXNlY29uZHMoMTk5OSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGRhdGV0aW1lKDE5NzAsIDEsIDEsIDAsIDAsIDEsIDk5OTAwMCksCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLlRvRGF0ZXRpbWUoKSkKLQotICBkZWYgdGVzdFRpbWVkZWx0YUNvbnZlcnNpb24oc2VsZik6Ci0gICAgbWVzc2FnZSA9IGR1cmF0aW9uX3BiMi5EdXJhdGlvbigpCi0gICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoMTk5OTk5OTk5OSkKLSAgICB0ZCA9IG1lc3NhZ2UuVG9UaW1lZGVsdGEoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgdGQuc2Vjb25kcykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDk5OTk5OSwgdGQubWljcm9zZWNvbmRzKQotCi0gICAgbWVzc2FnZS5Gcm9tTmFub3NlY29uZHMoLTE5OTk5OTk5OTkpCi0gICAgdGQgPSBtZXNzYWdlLlRvVGltZWRlbHRhKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCB0ZC5kYXlzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoODYzOTgsIHRkLnNlY29uZHMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCB0ZC5taWNyb3NlY29uZHMpCi0KLSAgICBtZXNzYWdlLkZyb21NaWNyb3NlY29uZHMoLTEpCi0gICAgdGQgPSBtZXNzYWdlLlRvVGltZWRlbHRhKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCB0ZC5kYXlzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoODYzOTksIHRkLnNlY29uZHMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg5OTk5OTksIHRkLm1pY3Jvc2Vjb25kcykKLSAgICBjb252ZXJ0ZWRfbWVzc2FnZSA9IGR1cmF0aW9uX3BiMi5EdXJhdGlvbigpCi0gICAgY29udmVydGVkX21lc3NhZ2UuRnJvbVRpbWVkZWx0YSh0ZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIGNvbnZlcnRlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0SW52YWxpZFRpbWVzdGFtcChzZWxmKToKLSAgICBtZXNzYWdlID0gdGltZXN0YW1wX3BiMi5UaW1lc3RhbXAoKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBWYWx1ZUVycm9yLAotICAgICAgICAndGltZSBkYXRhIFwnMTAwMDAtMDEtMDFUMDA6MDA6MDBcJyBkb2VzIG5vdCBtYXRjaCcKLSAgICAgICAgJyBmb3JtYXQgXCclWS0lbS0lZFQlSDolTTolU1wnJywKLSAgICAgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgJzEwMDAwLTAxLTAxVDAwOjAwOjAwLjAwWicpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNSZWdleHAoCi0gICAgICAgIHdlbGxfa25vd25fdHlwZXMuUGFyc2VFcnJvciwKLSAgICAgICAgJ25hbm9zIDAxMjM0NTY3ODkwMTIgbW9yZSB0aGFuIDkgZnJhY3Rpb25hbCBkaWdpdHMuJywKLSAgICAgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywKLSAgICAgICAgJzE5NzAtMDEtMDFUMDA6MDA6MDAuMDEyMzQ1Njc4OTAxMlonKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICB3ZWxsX2tub3duX3R5cGVzLlBhcnNlRXJyb3IsCi0gICAgICAgIChyJ0ludmFsaWQgdGltZXpvbmUgb2Zmc2V0IHZhbHVlOiBcKzA4LicpLAotICAgICAgICBtZXNzYWdlLkZyb21Kc29uU3RyaW5nLAotICAgICAgICAnMTk3Mi0wMS0wMVQwMTowMDowMC4wMSswOCcsKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBWYWx1ZUVycm9yLAotICAgICAgICAneWVhciBpcyBvdXQgb2YgcmFuZ2UnLAotICAgICAgICBtZXNzYWdlLkZyb21Kc29uU3RyaW5nLAotICAgICAgICAnMDAwMC0wMS0wMVQwMDowMDowMFonKQotICAgIG1lc3NhZ2Uuc2Vjb25kcyA9IDI1MzQwMjMwMDgwMAotICAgIHNlbGYuYXNzZXJ0UmFpc2VzUmVnZXhwKAotICAgICAgICBPdmVyZmxvd0Vycm9yLAotICAgICAgICAnZGF0ZSB2YWx1ZSBvdXQgb2YgcmFuZ2UnLAotICAgICAgICBtZXNzYWdlLlRvSnNvblN0cmluZykKLQotICBkZWYgdGVzdEludmFsaWREdXJhdGlvbihzZWxmKToKLSAgICBtZXNzYWdlID0gZHVyYXRpb25fcGIyLkR1cmF0aW9uKCkKLSAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKLSAgICAgICAgd2VsbF9rbm93bl90eXBlcy5QYXJzZUVycm9yLAotICAgICAgICAnRHVyYXRpb24gbXVzdCBlbmQgd2l0aCBsZXR0ZXIgInMiOiAxLicsCi0gICAgICAgIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcsICcxJykKLSAgICBzZWxmLmFzc2VydFJhaXNlc1JlZ2V4cCgKLSAgICAgICAgd2VsbF9rbm93bl90eXBlcy5QYXJzZUVycm9yLAotICAgICAgICAnQ291bGRuXCd0IHBhcnNlIGR1cmF0aW9uOiAxLi4uMnMuJywKLSAgICAgICAgbWVzc2FnZS5Gcm9tSnNvblN0cmluZywgJzEuLi4ycycpCi0KLQotY2xhc3MgRmllbGRNYXNrVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RTdHJpbmdGb3JtYXQoc2VsZik6Ci0gICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgbWFzay5Ub0pzb25TdHJpbmcoKSkKLSAgICBtYXNrLnBhdGhzLmFwcGVuZCgnZm9vJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28nLCBtYXNrLlRvSnNvblN0cmluZygpKQotICAgIG1hc2sucGF0aHMuYXBwZW5kKCdiYXInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbyxiYXInLCBtYXNrLlRvSnNvblN0cmluZygpKQotCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygnJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCcnLCBtYXNrLlRvSnNvblN0cmluZygpKQotICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2ZvbycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbJ2ZvbyddLCBtYXNrLnBhdGhzKQotICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2ZvbyxiYXInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWydmb28nLCAnYmFyJ10sIG1hc2sucGF0aHMpCi0KLSAgZGVmIHRlc3REZXNjcmlwdG9yVG9GaWVsZE1hc2soc2VsZik6Ci0gICAgbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCi0gICAgbXNnX2Rlc2NyaXB0b3IgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKLSAgICBtYXNrLkFsbEZpZWxkc0Zyb21EZXNjcmlwdG9yKG1zZ19kZXNjcmlwdG9yKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNzUsIGxlbihtYXNrLnBhdGhzKSkKLSAgICBzZWxmLmFzc2VydFRydWUobWFzay5Jc1ZhbGlkRm9yRGVzY3JpcHRvcihtc2dfZGVzY3JpcHRvcikpCi0gICAgZm9yIGZpZWxkIGluIG1zZ19kZXNjcmlwdG9yLmZpZWxkczoKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShmaWVsZC5uYW1lIGluIG1hc2sucGF0aHMpCi0gICAgbWFzay5wYXRocy5hcHBlbmQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiJykKLSAgICBzZWxmLmFzc2VydFRydWUobWFzay5Jc1ZhbGlkRm9yRGVzY3JpcHRvcihtc2dfZGVzY3JpcHRvcikpCi0gICAgbWFzay5wYXRocy5hcHBlbmQoJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmJiJykKLSAgICBzZWxmLmFzc2VydEZhbHNlKG1hc2suSXNWYWxpZEZvckRlc2NyaXB0b3IobXNnX2Rlc2NyaXB0b3IpKQotCi0gIGRlZiB0ZXN0Q2Fub25pY2FsRnJvbShzZWxmKToKLSAgICBtYXNrID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKLSAgICBvdXRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCi0gICAgIyBQYXRocyB3aWxsIGJlIHNvcnRlZC4KLSAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdiYXoucXV6LGJhcixmb28nKQotICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2JhcixiYXoucXV6LGZvbycsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQotICAgICMgRHVwbGljYXRlZCBwYXRocyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygnZm9vLGJhcixmb28nKQotICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Jhcixmb28nLCBvdXRfbWFzay5Ub0pzb25TdHJpbmcoKSkKLSAgICAjIFN1Yi1wYXRocyBvZiBvdGhlciBwYXRocyB3aWxsIGJlIHJlbW92ZWQuCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygnZm9vLmIxLGJhci5iMSxmb28uYjIsYmFyJykKLSAgICBvdXRfbWFzay5DYW5vbmljYWxGb3JtRnJvbU1hc2sobWFzaykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXIsZm9vLmIxLGZvby5iMicsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQotCi0gICAgIyBUZXN0IG1vcmUgZGVlcGx5IG5lc3RlZCBjYXNlcy4KLSAgICBtYXNrLkZyb21Kc29uU3RyaW5nKAotICAgICAgICAnZm9vLmJhci5iYXoxLGZvby5iYXIuYmF6Mi5xdXosZm9vLmJhci5iYXoyJykKLSAgICBvdXRfbWFzay5DYW5vbmljYWxGb3JtRnJvbU1hc2sobWFzaykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28uYmFyLmJhejEsZm9vLmJhci5iYXoyJywKLSAgICAgICAgICAgICAgICAgICAgIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQotICAgIG1hc2suRnJvbUpzb25TdHJpbmcoCi0gICAgICAgICdmb28uYmFyLmJhejEsZm9vLmJhci5iYXoyLGZvby5iYXIuYmF6Mi5xdXonKQotICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Zvby5iYXIuYmF6MSxmb28uYmFyLmJhejInLAotICAgICAgICAgICAgICAgICAgICAgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygKLSAgICAgICAgJ2Zvby5iYXIuYmF6MSxmb28uYmFyLmJhejIsZm9vLmJhci5iYXoyLnF1eixmb28uYmFyJykKLSAgICBvdXRfbWFzay5DYW5vbmljYWxGb3JtRnJvbU1hc2sobWFzaykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdmb28uYmFyJywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygKLSAgICAgICAgJ2Zvby5iYXIuYmF6MSxmb28uYmFyLmJhejIsZm9vLmJhci5iYXoyLnF1eixmb28nKQotICAgIG91dF9tYXNrLkNhbm9uaWNhbEZvcm1Gcm9tTWFzayhtYXNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQotCi0gIGRlZiB0ZXN0VW5pb24oc2VsZik6Ci0gICAgbWFzazEgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQotICAgIG1hc2syID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKLSAgICBvdXRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCi0gICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2ZvbyxiYXonKQotICAgIG1hc2syLkZyb21Kc29uU3RyaW5nKCdiYXIscXV6JykKLSAgICBvdXRfbWFzay5VbmlvbihtYXNrMSwgbWFzazIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyLGJheixmb28scXV6Jywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCi0gICAgIyBPdmVybGFwIHdpdGggZHVwbGljYXRlZCBwYXRocy4KLSAgICBtYXNrMS5Gcm9tSnNvblN0cmluZygnZm9vLGJhei5iYicpCi0gICAgbWFzazIuRnJvbUpzb25TdHJpbmcoJ2Jhei5iYixxdXonKQotICAgIG91dF9tYXNrLlVuaW9uKG1hc2sxLCBtYXNrMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdiYXouYmIsZm9vLHF1eicsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQotICAgICMgT3ZlcmxhcCB3aXRoIHBhdGhzIGNvdmVyaW5nIHNvbWUgb3RoZXIgcGF0aHMuCi0gICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIuYmF6LHF1eicpCi0gICAgbWFzazIuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIsYmFyJykKLSAgICBvdXRfbWFzay5VbmlvbihtYXNrMSwgbWFzazIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyLGZvby5iYXIscXV6Jywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCi0KLSAgZGVmIHRlc3RJbnRlcnNlY3Qoc2VsZik6Ci0gICAgbWFzazEgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQotICAgIG1hc2syID0gZmllbGRfbWFza19wYjIuRmllbGRNYXNrKCkKLSAgICBvdXRfbWFzayA9IGZpZWxkX21hc2tfcGIyLkZpZWxkTWFzaygpCi0gICAgIyBUZXN0IGNhc2VzIHdpdGhvdXQgb3ZlcmxhcHBpbmcuCi0gICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2ZvbyxiYXonKQotICAgIG1hc2syLkZyb21Kc29uU3RyaW5nKCdiYXIscXV6JykKLSAgICBvdXRfbWFzay5JbnRlcnNlY3QobWFzazEsIG1hc2syKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQotICAgICMgT3ZlcmxhcCB3aXRoIGR1cGxpY2F0ZWQgcGF0aHMuCi0gICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2ZvbyxiYXouYmInKQotICAgIG1hc2syLkZyb21Kc29uU3RyaW5nKCdiYXouYmIscXV6JykKLSAgICBvdXRfbWFzay5JbnRlcnNlY3QobWFzazEsIG1hc2syKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Jhei5iYicsIG91dF9tYXNrLlRvSnNvblN0cmluZygpKQotICAgICMgT3ZlcmxhcCB3aXRoIHBhdGhzIGNvdmVyaW5nIHNvbWUgb3RoZXIgcGF0aHMuCi0gICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIuYmF6LHF1eicpCi0gICAgbWFzazIuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIsYmFyJykKLSAgICBvdXRfbWFzay5JbnRlcnNlY3QobWFzazEsIG1hc2syKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Zvby5iYXIuYmF6Jywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCi0gICAgbWFzazEuRnJvbUpzb25TdHJpbmcoJ2Zvby5iYXIsYmFyJykKLSAgICBtYXNrMi5Gcm9tSnNvblN0cmluZygnZm9vLmJhci5iYXoscXV6JykKLSAgICBvdXRfbWFzay5JbnRlcnNlY3QobWFzazEsIG1hc2syKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2Zvby5iYXIuYmF6Jywgb3V0X21hc2suVG9Kc29uU3RyaW5nKCkpCi0KLSAgZGVmIHRlc3RNZXJnZU1lc3NhZ2Uoc2VsZik6Ci0gICAgIyBUZXN0IG1lcmdlIG9uZSBmaWVsZC4KLSAgICBzcmMgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHNyYykKLSAgICBmb3IgZmllbGQgaW4gc3JjLkRFU0NSSVBUT1IuZmllbGRzOgotICAgICAgaWYgZmllbGQuY29udGFpbmluZ19vbmVvZjoKLSAgICAgICAgY29udGludWUKLSAgICAgIGZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCi0gICAgICBkc3QgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICAgICMgT25seSBzZXQgb25lIHBhdGggdG8gbWFzay4KLSAgICAgIG1hc2sgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQotICAgICAgbWFzay5wYXRocy5hcHBlbmQoZmllbGRfbmFtZSkKLSAgICAgIG1hc2suTWVyZ2VNZXNzYWdlKHNyYywgZHN0KQotICAgICAgIyBUaGUgZXhwZWN0ZWQgcmVzdWx0IG1lc3NhZ2UuCi0gICAgICBtc2cgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICAgIGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgICAgICByZXBlYXRlZF9zcmMgPSBnZXRhdHRyKHNyYywgZmllbGRfbmFtZSkKLSAgICAgICAgcmVwZWF0ZWRfbXNnID0gZ2V0YXR0cihtc2csIGZpZWxkX25hbWUpCi0gICAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICBmb3IgaXRlbSBpbiByZXBlYXRlZF9zcmM6Ci0gICAgICAgICAgICByZXBlYXRlZF9tc2cuYWRkKCkuQ29weUZyb20oaXRlbSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICByZXBlYXRlZF9tc2cuZXh0ZW5kKHJlcGVhdGVkX3NyYykKLSAgICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBnZXRhdHRyKG1zZywgZmllbGRfbmFtZSkuQ29weUZyb20oZ2V0YXR0cihzcmMsIGZpZWxkX25hbWUpKQotICAgICAgZWxzZToKLSAgICAgICAgc2V0YXR0cihtc2csIGZpZWxkX25hbWUsIGdldGF0dHIoc3JjLCBmaWVsZF9uYW1lKSkKLSAgICAgICMgT25seSBmaWVsZCBzcGVjaWZpZWQgaW4gbWFzayBpcyBtZXJnZWQuCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKG1zZywgZHN0KQotCi0gICAgIyBUZXN0IG1lcmdlIG5lc3RlZCBmaWVsZHMuCi0gICAgbmVzdGVkX3NyYyA9IHVuaXR0ZXN0X3BiMi5OZXN0ZWRUZXN0QWxsVHlwZXMoKQotICAgIG5lc3RlZF9kc3QgPSB1bml0dGVzdF9wYjIuTmVzdGVkVGVzdEFsbFR5cGVzKCkKLSAgICBuZXN0ZWRfc3JjLmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIgPSAxMjM0Ci0gICAgbmVzdGVkX3NyYy5jaGlsZC5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyID0gNTY3OAotICAgIG1hc2sgPSBmaWVsZF9tYXNrX3BiMi5GaWVsZE1hc2soKQotICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2NoaWxkLnBheWxvYWQnKQotICAgIG1hc2suTWVyZ2VNZXNzYWdlKG5lc3RlZF9zcmMsIG5lc3RlZF9kc3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMjM0LCBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBuZXN0ZWRfZHN0LmNoaWxkLmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCi0KLSAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdjaGlsZC5jaGlsZC5wYXlsb2FkJykKLSAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXN0ZWRfc3JjLCBuZXN0ZWRfZHN0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNCwgbmVzdGVkX2RzdC5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTY3OCwgbmVzdGVkX2RzdC5jaGlsZC5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyKQotCi0gICAgbmVzdGVkX2RzdC5DbGVhcigpCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygnY2hpbGQuY2hpbGQucGF5bG9hZCcpCi0gICAgbWFzay5NZXJnZU1lc3NhZ2UobmVzdGVkX3NyYywgbmVzdGVkX2RzdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG5lc3RlZF9kc3QuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDU2NzgsIG5lc3RlZF9kc3QuY2hpbGQuY2hpbGQucGF5bG9hZC5vcHRpb25hbF9pbnQzMikKLQotICAgIG5lc3RlZF9kc3QuQ2xlYXIoKQotICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2NoaWxkJykKLSAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXN0ZWRfc3JjLCBuZXN0ZWRfZHN0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNCwgbmVzdGVkX2RzdC5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTY3OCwgbmVzdGVkX2RzdC5jaGlsZC5jaGlsZC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyKQotCi0gICAgIyBUZXN0IE1lcmdlT3B0aW9ucy4KLSAgICBuZXN0ZWRfZHN0LkNsZWFyKCkKLSAgICBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50NjQgPSA0MzIxCi0gICAgIyBNZXNzYWdlIGZpZWxkcyB3aWxsIGJlIG1lcmdlZCBieSBkZWZhdWx0LgotICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ2NoaWxkLnBheWxvYWQnKQotICAgIG1hc2suTWVyZ2VNZXNzYWdlKG5lc3RlZF9zcmMsIG5lc3RlZF9kc3QpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMjM0LCBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0MzIxLCBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50NjQpCi0gICAgIyBDaGFuZ2UgdGhlIGJlaGF2aW9yIHRvIHJlcGxhY2UgbWVzc2FnZSBmaWVsZHMuCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygnY2hpbGQucGF5bG9hZCcpCi0gICAgbWFzay5NZXJnZU1lc3NhZ2UobmVzdGVkX3NyYywgbmVzdGVkX2RzdCwgVHJ1ZSwgRmFsc2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMjM0LCBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBuZXN0ZWRfZHN0LmNoaWxkLnBheWxvYWQub3B0aW9uYWxfaW50NjQpCi0KLSAgICAjIEJ5IGRlZmF1bHQsIGZpZWxkcyBtaXNzaW5nIGluIHNvdXJjZSBhcmUgbm90IGNsZWFyZWQgaW4gZGVzdGluYXRpb24uCi0gICAgbmVzdGVkX2RzdC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyID0gMTIzNAotICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXN0ZWRfZHN0Lkhhc0ZpZWxkKCdwYXlsb2FkJykpCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygncGF5bG9hZCcpCi0gICAgbWFzay5NZXJnZU1lc3NhZ2UobmVzdGVkX3NyYywgbmVzdGVkX2RzdCkKLSAgICBzZWxmLmFzc2VydFRydWUobmVzdGVkX2RzdC5IYXNGaWVsZCgncGF5bG9hZCcpKQotICAgICMgQnV0IHRoZXkgYXJlIGNsZWFyZWQgd2hlbiByZXBsYWNpbmcgbWVzc2FnZSBmaWVsZHMuCi0gICAgbmVzdGVkX2RzdC5DbGVhcigpCi0gICAgbmVzdGVkX2RzdC5wYXlsb2FkLm9wdGlvbmFsX2ludDMyID0gMTIzNAotICAgIG1hc2suRnJvbUpzb25TdHJpbmcoJ3BheWxvYWQnKQotICAgIG1hc2suTWVyZ2VNZXNzYWdlKG5lc3RlZF9zcmMsIG5lc3RlZF9kc3QsIFRydWUsIEZhbHNlKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobmVzdGVkX2RzdC5IYXNGaWVsZCgncGF5bG9hZCcpKQotCi0gICAgbmVzdGVkX3NyYy5wYXlsb2FkLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMjM0KQotICAgIG5lc3RlZF9kc3QucGF5bG9hZC5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNTY3OCkKLSAgICAjIFJlcGVhdGVkIGZpZWxkcyB3aWxsIGJlIGFwcGVuZGVkIGJ5IGRlZmF1bHQuCi0gICAgbWFzay5Gcm9tSnNvblN0cmluZygncGF5bG9hZC5yZXBlYXRlZF9pbnQzMicpCi0gICAgbWFzay5NZXJnZU1lc3NhZ2UobmVzdGVkX3NyYywgbmVzdGVkX2RzdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihuZXN0ZWRfZHN0LnBheWxvYWQucmVwZWF0ZWRfaW50MzIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTY3OCwgbmVzdGVkX2RzdC5wYXlsb2FkLnJlcGVhdGVkX2ludDMyWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNCwgbmVzdGVkX2RzdC5wYXlsb2FkLnJlcGVhdGVkX2ludDMyWzFdKQotICAgICMgQ2hhbmdlIHRoZSBiZWhhdmlvciB0byByZXBsYWNlIHJlcGVhdGVkIGZpZWxkcy4KLSAgICBtYXNrLkZyb21Kc29uU3RyaW5nKCdwYXlsb2FkLnJlcGVhdGVkX2ludDMyJykKLSAgICBtYXNrLk1lcmdlTWVzc2FnZShuZXN0ZWRfc3JjLCBuZXN0ZWRfZHN0LCBGYWxzZSwgVHJ1ZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihuZXN0ZWRfZHN0LnBheWxvYWQucmVwZWF0ZWRfaW50MzIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzNCwgbmVzdGVkX2RzdC5wYXlsb2FkLnJlcGVhdGVkX2ludDMyWzBdKQotCi0KLWNsYXNzIFN0cnVjdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0U3RydWN0KHNlbGYpOgotICAgIHN0cnVjdCA9IHN0cnVjdF9wYjIuU3RydWN0KCkKLSAgICBzdHJ1Y3RfY2xhc3MgPSBzdHJ1Y3QuX19jbGFzc19fCi0KLSAgICBzdHJ1Y3RbJ2tleTEnXSA9IDUKLSAgICBzdHJ1Y3RbJ2tleTInXSA9ICdhYmMnCi0gICAgc3RydWN0WydrZXkzJ10gPSBUcnVlCi0gICAgc3RydWN0LmdldF9vcl9jcmVhdGVfc3RydWN0KCdrZXk0JylbJ3N1YmtleSddID0gMTEuMAotICAgIHN0cnVjdF9saXN0ID0gc3RydWN0LmdldF9vcl9jcmVhdGVfbGlzdCgna2V5NScpCi0gICAgc3RydWN0X2xpc3QuZXh0ZW5kKFs2LCAnc2V2ZW4nLCBUcnVlLCBGYWxzZSwgTm9uZV0pCi0gICAgc3RydWN0X2xpc3QuYWRkX3N0cnVjdCgpWydzdWJrZXkyJ10gPSA5Ci0KLSAgICBzZWxmLmFzc2VydFRydWUoaXNpbnN0YW5jZShzdHJ1Y3QsIHdlbGxfa25vd25fdHlwZXMuU3RydWN0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyg1LCBzdHJ1Y3RbJ2tleTEnXSkKLSAgICBzZWxmLmFzc2VydEVxdWFscygnYWJjJywgc3RydWN0WydrZXkyJ10pCi0gICAgc2VsZi5hc3NlcnRJcyhUcnVlLCBzdHJ1Y3RbJ2tleTMnXSkKLSAgICBzZWxmLmFzc2VydEVxdWFscygxMSwgc3RydWN0WydrZXk0J11bJ3N1YmtleSddKQotICAgIGlubmVyX3N0cnVjdCA9IHN0cnVjdF9jbGFzcygpCi0gICAgaW5uZXJfc3RydWN0WydzdWJrZXkyJ10gPSA5Ci0gICAgc2VsZi5hc3NlcnRFcXVhbHMoWzYsICdzZXZlbicsIFRydWUsIEZhbHNlLCBOb25lLCBpbm5lcl9zdHJ1Y3RdLAotICAgICAgICAgICAgICAgICAgICAgIGxpc3Qoc3RydWN0WydrZXk1J10uaXRlbXMoKSkpCi0KLSAgICBzZXJpYWxpemVkID0gc3RydWN0LlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgIHN0cnVjdDIgPSBzdHJ1Y3RfcGIyLlN0cnVjdCgpCi0gICAgc3RydWN0Mi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHN0cnVjdCwgc3RydWN0MikKLQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luc3RhbmNlKHN0cnVjdDIsIHdlbGxfa25vd25fdHlwZXMuU3RydWN0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyg1LCBzdHJ1Y3QyWydrZXkxJ10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2FiYycsIHN0cnVjdDJbJ2tleTInXSkKLSAgICBzZWxmLmFzc2VydElzKFRydWUsIHN0cnVjdDJbJ2tleTMnXSkKLSAgICBzZWxmLmFzc2VydEVxdWFscygxMSwgc3RydWN0Mlsna2V5NCddWydzdWJrZXknXSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhbNiwgJ3NldmVuJywgVHJ1ZSwgRmFsc2UsIE5vbmUsIGlubmVyX3N0cnVjdF0sCi0gICAgICAgICAgICAgICAgICAgICAgbGlzdChzdHJ1Y3QyWydrZXk1J10uaXRlbXMoKSkpCi0KLSAgICBzdHJ1Y3RfbGlzdCA9IHN0cnVjdDJbJ2tleTUnXQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDYsIHN0cnVjdF9saXN0WzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKCdzZXZlbicsIHN0cnVjdF9saXN0WzFdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFRydWUsIHN0cnVjdF9saXN0WzJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKEZhbHNlLCBzdHJ1Y3RfbGlzdFszXSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhOb25lLCBzdHJ1Y3RfbGlzdFs0XSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhpbm5lcl9zdHJ1Y3QsIHN0cnVjdF9saXN0WzVdKQotCi0gICAgc3RydWN0X2xpc3RbMV0gPSA3Ci0gICAgc2VsZi5hc3NlcnRFcXVhbHMoNywgc3RydWN0X2xpc3RbMV0pCi0KLSAgICBzdHJ1Y3RfbGlzdC5hZGRfbGlzdCgpLmV4dGVuZChbMSwgJ3R3bycsIFRydWUsIEZhbHNlLCBOb25lXSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhbMSwgJ3R3bycsIFRydWUsIEZhbHNlLCBOb25lXSwKLSAgICAgICAgICAgICAgICAgICAgICBsaXN0KHN0cnVjdF9saXN0WzZdLml0ZW1zKCkpKQotCi0gICAgdGV4dF9zZXJpYWxpemVkID0gc3RyKHN0cnVjdCkKLSAgICBzdHJ1Y3QzID0gc3RydWN0X3BiMi5TdHJ1Y3QoKQotICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHRfc2VyaWFsaXplZCwgc3RydWN0MykKLSAgICBzZWxmLmFzc2VydEVxdWFscyhzdHJ1Y3QsIHN0cnVjdDMpCi0KLSAgICBzdHJ1Y3QuZ2V0X29yX2NyZWF0ZV9zdHJ1Y3QoJ2tleTMnKVsncmVwbGFjZSddID0gMTIKLSAgICBzZWxmLmFzc2VydEVxdWFscygxMiwgc3RydWN0WydrZXkzJ11bJ3JlcGxhY2UnXSkKLQotCi1jbGFzcyBBbnlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgdGVzdEFueU1lc3NhZ2Uoc2VsZik6Ci0gICAgIyBDcmVhdGVzIGFuZCBzZXRzIG1lc3NhZ2UuCi0gICAgbXNnID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQotICAgIG1zZ19kZXNjcmlwdG9yID0gbXNnLkRFU0NSSVBUT1IKLSAgICBhbGxfdHlwZXMgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBhbGxfZGVzY3JpcHRvciA9IGFsbF90eXBlcy5ERVNDUklQVE9SCi0gICAgYWxsX3R5cGVzLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQotICAgICMgUGFja3MgdG8gQW55LgotICAgIG1zZy52YWx1ZS5QYWNrKGFsbF90eXBlcykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy52YWx1ZS50eXBlX3VybCwKLSAgICAgICAgICAgICAgICAgICAgICd0eXBlLmdvb2dsZWFwaXMuY29tLyVzJyAlIGFsbF9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy52YWx1ZS52YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgIGFsbF90eXBlcy5TZXJpYWxpemVUb1N0cmluZygpKQotICAgICMgVGVzdHMgSXMoKSBtZXRob2QuCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1zZy52YWx1ZS5JcyhhbGxfZGVzY3JpcHRvcikpCi0gICAgc2VsZi5hc3NlcnRGYWxzZShtc2cudmFsdWUuSXMobXNnX2Rlc2NyaXB0b3IpKQotICAgICMgVW5wYWNrcyBBbnkuCi0gICAgdW5wYWNrZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cudmFsdWUuVW5wYWNrKHVucGFja2VkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoYWxsX3R5cGVzLCB1bnBhY2tlZF9tZXNzYWdlKQotICAgICMgVW5wYWNrcyB0byBkaWZmZXJlbnQgdHlwZS4KLSAgICBzZWxmLmFzc2VydEZhbHNlKG1zZy52YWx1ZS5VbnBhY2sobXNnKSkKLSAgICAjIE9ubHkgQW55IG1lc3NhZ2VzIGhhdmUgUGFjayBtZXRob2QuCi0gICAgdHJ5OgotICAgICAgbXNnLlBhY2soYWxsX3R5cGVzKQotICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgIHBhc3MKLSAgICBlbHNlOgotICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJyVzIHNob3VsZCBub3QgaGF2ZSBQYWNrIG1ldGhvZC4nICUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ19kZXNjcmlwdG9yLmZ1bGxfbmFtZSkKLQotICBkZWYgdGVzdE1lc3NhZ2VOYW1lKHNlbGYpOgotICAgICMgQ3JlYXRlcyBhbmQgc2V0cyBtZXNzYWdlLgotICAgIHN1Ym1lc3NhZ2UgPSBhbnlfdGVzdF9wYjIuVGVzdEFueSgpCi0gICAgc3VibWVzc2FnZS5pbnRfdmFsdWUgPSAxMjM0NQotICAgIG1zZyA9IGFueV9wYjIuQW55KCkKLSAgICBtc2cuUGFjayhzdWJtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobXNnLlR5cGVOYW1lKCksICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuVGVzdEFueScpCi0KLSAgZGVmIHRlc3RQYWNrV2l0aEN1c3RvbVR5cGVVcmwoc2VsZik6Ci0gICAgc3VibWVzc2FnZSA9IGFueV90ZXN0X3BiMi5UZXN0QW55KCkKLSAgICBzdWJtZXNzYWdlLmludF92YWx1ZSA9IDEyMzQ1Ci0gICAgbXNnID0gYW55X3BiMi5BbnkoKQotICAgICMgUGFjayB3aXRoIGEgY3VzdG9tIHR5cGUgVVJMIHByZWZpeC4KLSAgICBtc2cuUGFjayhzdWJtZXNzYWdlLCAndHlwZS5teXNlcnZpY2UuY29tJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy50eXBlX3VybCwKLSAgICAgICAgICAgICAgICAgICAgICd0eXBlLm15c2VydmljZS5jb20vJXMnICUgc3VibWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkKLSAgICAjIFBhY2sgd2l0aCBhIGN1c3RvbSB0eXBlIFVSTCBwcmVmaXggZW5kaW5nIHdpdGggJy8nLgotICAgIG1zZy5QYWNrKHN1Ym1lc3NhZ2UsICd0eXBlLm15c2VydmljZS5jb20vJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1zZy50eXBlX3VybCwKLSAgICAgICAgICAgICAgICAgICAgICd0eXBlLm15c2VydmljZS5jb20vJXMnICUgc3VibWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkKLSAgICAjIFBhY2sgd2l0aCBhbiBlbXB0eSB0eXBlIFVSTCBwcmVmaXguCi0gICAgbXNnLlBhY2soc3VibWVzc2FnZSwgJycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtc2cudHlwZV91cmwsCi0gICAgICAgICAgICAgICAgICAgICAnLyVzJyAlIHN1Ym1lc3NhZ2UuREVTQ1JJUFRPUi5mdWxsX25hbWUpCi0gICAgIyBUZXN0IHVucGFja2luZyB0aGUgdHlwZS4KLSAgICB1bnBhY2tlZF9tZXNzYWdlID0gYW55X3Rlc3RfcGIyLlRlc3RBbnkoKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtc2cuVW5wYWNrKHVucGFja2VkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc3VibWVzc2FnZSwgdW5wYWNrZWRfbWVzc2FnZSkKLQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICB1bml0dGVzdC5tYWluKCkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ODNmNTI1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJDb25zdGFudHMgYW5kIHN0YXRpYyBmdW5jdGlvbnMgdG8gc3VwcG9ydCBwcm90b2NvbCBidWZmZXIgd2lyZSBmb3JtYXQuIiIiCi0KLV9fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCi0KLWltcG9ydCBzdHJ1Y3QKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQotCi0KLVRBR19UWVBFX0JJVFMgPSAzICAjIE51bWJlciBvZiBiaXRzIHVzZWQgdG8gaG9sZCB0eXBlIGluZm8gaW4gYSBwcm90byB0YWcuCi1UQUdfVFlQRV9NQVNLID0gKDEgPDwgVEFHX1RZUEVfQklUUykgLSAxICAjIDB4NwotCi0jIFRoZXNlIG51bWJlcnMgaWRlbnRpZnkgdGhlIHdpcmUgdHlwZSBvZiBhIHByb3RvY29sIGJ1ZmZlciB2YWx1ZS4KLSMgV2UgdXNlIHRoZSBsZWFzdC1zaWduaWZpY2FudCBUQUdfVFlQRV9CSVRTIGJpdHMgb2YgdGhlIHZhcmludC1lbmNvZGVkCi0jIHRhZy1hbmQtdHlwZSB0byBzdG9yZSBvbmUgb2YgdGhlc2UgV0lSRVRZUEVfKiBjb25zdGFudHMuCi0jIFRoZXNlIHZhbHVlcyBtdXN0IG1hdGNoIFdpcmVUeXBlIGVudW0gaW4gZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmguCi1XSVJFVFlQRV9WQVJJTlQgPSAwCi1XSVJFVFlQRV9GSVhFRDY0ID0gMQotV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCA9IDIKLVdJUkVUWVBFX1NUQVJUX0dST1VQID0gMwotV0lSRVRZUEVfRU5EX0dST1VQID0gNAotV0lSRVRZUEVfRklYRUQzMiA9IDUKLV9XSVJFVFlQRV9NQVggPSA1Ci0KLQotIyBCb3VuZHMgZm9yIHZhcmlvdXMgaW50ZWdlciB0eXBlcy4KLUlOVDMyX01BWCA9IGludCgoMSA8PCAzMSkgLSAxKQotSU5UMzJfTUlOID0gaW50KC0oMSA8PCAzMSkpCi1VSU5UMzJfTUFYID0gKDEgPDwgMzIpIC0gMQotCi1JTlQ2NF9NQVggPSAoMSA8PCA2MykgLSAxCi1JTlQ2NF9NSU4gPSAtKDEgPDwgNjMpCi1VSU5UNjRfTUFYID0gKDEgPDwgNjQpIC0gMQotCi0jICJzdHJ1Y3QiIGZvcm1hdCBzdHJpbmdzIHRoYXQgd2lsbCBlbmNvZGUvZGVjb2RlIHRoZSBzcGVjaWZpZWQgZm9ybWF0cy4KLUZPUk1BVF9VSU5UMzJfTElUVExFX0VORElBTiA9ICc8SScKLUZPUk1BVF9VSU5UNjRfTElUVExFX0VORElBTiA9ICc8UScKLUZPUk1BVF9GTE9BVF9MSVRUTEVfRU5ESUFOID0gJzxmJwotRk9STUFUX0RPVUJMRV9MSVRUTEVfRU5ESUFOID0gJzxkJwotCi0KLSMgV2UnbGwgaGF2ZSB0byBwcm92aWRlIGFsdGVybmF0ZSBpbXBsZW1lbnRhdGlvbnMgb2YgQXBwZW5kTGl0dGxlRW5kaWFuKigpIG9uCi0jIGFueSBhcmNoaXRlY3R1cmVzIHdoZXJlIHRoZXNlIGNoZWNrcyBmYWlsLgotaWYgc3RydWN0LmNhbGNzaXplKEZPUk1BVF9VSU5UMzJfTElUVExFX0VORElBTikgIT0gNDoKLSAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Zvcm1hdCAiSSIgaXMgbm90IGEgMzItYml0IG51bWJlci4nKQotaWYgc3RydWN0LmNhbGNzaXplKEZPUk1BVF9VSU5UNjRfTElUVExFX0VORElBTikgIT0gODoKLSAgcmFpc2UgQXNzZXJ0aW9uRXJyb3IoJ0Zvcm1hdCAiUSIgaXMgbm90IGEgNjQtYml0IG51bWJlci4nKQotCi0KLWRlZiBQYWNrVGFnKGZpZWxkX251bWJlciwgd2lyZV90eXBlKToKLSAgIiIiUmV0dXJucyBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB0aGF0IGVuY29kZXMgdGhlIGZpZWxkIG51bWJlciBhbmQKLSAgd2lyZSB0eXBlIGluZm9ybWF0aW9uIGluIHN0YW5kYXJkIHByb3RvY29sIG1lc3NhZ2Ugd2lyZSBmb3JtYXQuCi0KLSAgQXJnczoKLSAgICBmaWVsZF9udW1iZXI6IEV4cGVjdGVkIHRvIGJlIGFuIGludGVnZXIgaW4gdGhlIHJhbmdlIFsxLCAxIDw8IDI5KQotICAgIHdpcmVfdHlwZTogT25lIG9mIHRoZSBXSVJFVFlQRV8qIGNvbnN0YW50cy4KLSAgIiIiCi0gIGlmIG5vdCAwIDw9IHdpcmVfdHlwZSA8PSBfV0lSRVRZUEVfTUFYOgotICAgIHJhaXNlIG1lc3NhZ2UuRW5jb2RlRXJyb3IoJ1Vua25vd24gd2lyZSB0eXBlOiAlZCcgJSB3aXJlX3R5cGUpCi0gIHJldHVybiAoZmllbGRfbnVtYmVyIDw8IFRBR19UWVBFX0JJVFMpIHwgd2lyZV90eXBlCi0KLQotZGVmIFVucGFja1RhZyh0YWcpOgotICAiIiJUaGUgaW52ZXJzZSBvZiBQYWNrVGFnKCkuICBHaXZlbiBhbiB1bnNpZ25lZCAzMi1iaXQgbnVtYmVyLAotICByZXR1cm5zIGEgKGZpZWxkX251bWJlciwgd2lyZV90eXBlKSB0dXBsZS4KLSAgIiIiCi0gIHJldHVybiAodGFnID4+IFRBR19UWVBFX0JJVFMpLCAodGFnICYgVEFHX1RZUEVfTUFTSykKLQotCi1kZWYgWmlnWmFnRW5jb2RlKHZhbHVlKToKLSAgIiIiWmlnWmFnIFRyYW5zZm9ybTogIEVuY29kZXMgc2lnbmVkIGludGVnZXJzIHNvIHRoYXQgdGhleSBjYW4gYmUKLSAgZWZmZWN0aXZlbHkgdXNlZCB3aXRoIHZhcmludCBlbmNvZGluZy4gIFNlZSB3aXJlX2Zvcm1hdC5oIGZvcgotICBtb3JlIGRldGFpbHMuCi0gICIiIgotICBpZiB2YWx1ZSA+PSAwOgotICAgIHJldHVybiB2YWx1ZSA8PCAxCi0gIHJldHVybiAodmFsdWUgPDwgMSkgXiAofjApCi0KLQotZGVmIFppZ1phZ0RlY29kZSh2YWx1ZSk6Ci0gICIiIkludmVyc2Ugb2YgWmlnWmFnRW5jb2RlKCkuIiIiCi0gIGlmIG5vdCB2YWx1ZSAmIDB4MToKLSAgICByZXR1cm4gdmFsdWUgPj4gMQotICByZXR1cm4gKHZhbHVlID4+IDEpIF4gKH4wKQotCi0KLQotIyBUaGUgKkJ5dGVTaXplKCkgZnVuY3Rpb25zIGJlbG93IHJldHVybiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvCi0jIHNlcmlhbGl6ZSAiZmllbGQgbnVtYmVyICsgdHlwZSIgaW5mb3JtYXRpb24gYW5kIHRoZW4gc2VyaWFsaXplIHRoZSB2YWx1ZS4KLQotCi1kZWYgSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKToKLSAgcmV0dXJuIEludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQzMikKLQotCi1kZWYgSW50MzJCeXRlU2l6ZU5vVGFnKGludDMyKToKLSAgcmV0dXJuIF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKDB4ZmZmZmZmZmZmZmZmZmZmZiAmIGludDMyKQotCi0KLWRlZiBJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgaW50NjQpOgotICAjIEhhdmUgdG8gY29udmVydCB0byB1aW50IGJlZm9yZSBjYWxsaW5nIFVJbnQ2NEJ5dGVTaXplKCkuCi0gIHJldHVybiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIDB4ZmZmZmZmZmZmZmZmZmZmZiAmIGludDY0KQotCi0KLWRlZiBVSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHVpbnQzMik6Ci0gIHJldHVybiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHVpbnQzMikKLQotCi1kZWYgVUludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCB1aW50NjQpOgotICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKHVpbnQ2NCkKLQotCi1kZWYgU0ludDMyQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQzMik6Ci0gIHJldHVybiBVSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIFppZ1phZ0VuY29kZShpbnQzMikpCi0KLQotZGVmIFNJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgaW50NjQpOgotICByZXR1cm4gVUludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBaaWdaYWdFbmNvZGUoaW50NjQpKQotCi0KLWRlZiBGaXhlZDMyQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBmaXhlZDMyKToKLSAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA0Ci0KLQotZGVmIEZpeGVkNjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGZpeGVkNjQpOgotICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDgKLQotCi1kZWYgU0ZpeGVkMzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHNmaXhlZDMyKToKLSAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA0Ci0KLQotZGVmIFNGaXhlZDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBzZml4ZWQ2NCk6Ci0gIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgOAotCi0KLWRlZiBGbG9hdEJ5dGVTaXplKGZpZWxkX251bWJlciwgZmx0KToKLSAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA0Ci0KLQotZGVmIERvdWJsZUJ5dGVTaXplKGZpZWxkX251bWJlciwgZG91YmxlKToKLSAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA4Ci0KLQotZGVmIEJvb2xCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGIpOgotICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDEKLQotCi1kZWYgRW51bUJ5dGVTaXplKGZpZWxkX251bWJlciwgZW51bSk6Ci0gIHJldHVybiBVSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGVudW0pCi0KLQotZGVmIFN0cmluZ0J5dGVTaXplKGZpZWxkX251bWJlciwgc3RyaW5nKToKLSAgcmV0dXJuIEJ5dGVzQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBzdHJpbmcuZW5jb2RlKCd1dGYtOCcpKQotCi0KLWRlZiBCeXRlc0J5dGVTaXplKGZpZWxkX251bWJlciwgYik6Ci0gIHJldHVybiAoVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKQotICAgICAgICAgICsgX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcobGVuKGIpKQotICAgICAgICAgICsgbGVuKGIpKQotCi0KLWRlZiBHcm91cEJ5dGVTaXplKGZpZWxkX251bWJlciwgbWVzc2FnZSk6Ci0gIHJldHVybiAoMiAqIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgICMgU1RBUlQgYW5kIEVORCBncm91cC4KLSAgICAgICAgICArIG1lc3NhZ2UuQnl0ZVNpemUoKSkKLQotCi1kZWYgTWVzc2FnZUJ5dGVTaXplKGZpZWxkX251bWJlciwgbWVzc2FnZSk6Ci0gIHJldHVybiAoVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKQotICAgICAgICAgICsgX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcobWVzc2FnZS5CeXRlU2l6ZSgpKQotICAgICAgICAgICsgbWVzc2FnZS5CeXRlU2l6ZSgpKQotCi0KLWRlZiBNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGZpZWxkX251bWJlciwgbXNnKToKLSAgIyBGaXJzdCBjb21wdXRlIHRoZSBzaXplcyBvZiB0aGUgdGFncy4KLSAgIyBUaGVyZSBhcmUgMiB0YWdzIGZvciB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgb2YgdGhlIHJlcGVhdGVkIGdyb3VwLCB0aGF0Ci0gICMgaXMgZmllbGQgbnVtYmVyIDEsIG9uZSB3aXRoIGZpZWxkIG51bWJlciAyICh0eXBlX2lkKSBhbmQgb25lIHdpdGggZmllbGQKLSAgIyBudW1iZXIgMyAobWVzc2FnZSkuCi0gIHRvdGFsX3NpemUgPSAoMiAqIFRhZ0J5dGVTaXplKDEpICsgVGFnQnl0ZVNpemUoMikgKyBUYWdCeXRlU2l6ZSgzKSkKLQotICAjIEFkZCB0aGUgbnVtYmVyIG9mIGJ5dGVzIGZvciB0eXBlX2lkLgotICB0b3RhbF9zaXplICs9IF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKGZpZWxkX251bWJlcikKLQotICBtZXNzYWdlX3NpemUgPSBtc2cuQnl0ZVNpemUoKQotCi0gICMgVGhlIG51bWJlciBvZiBieXRlcyBmb3IgZW5jb2RpbmcgdGhlIGxlbmd0aCBvZiB0aGUgbWVzc2FnZS4KLSAgdG90YWxfc2l6ZSArPSBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhtZXNzYWdlX3NpemUpCi0KLSAgIyBUaGUgc2l6ZSBvZiB0aGUgbWVzc2FnZS4KLSAgdG90YWxfc2l6ZSArPSBtZXNzYWdlX3NpemUKLSAgcmV0dXJuIHRvdGFsX3NpemUKLQotCi1kZWYgVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKToKLSAgIiIiUmV0dXJucyB0aGUgYnl0ZXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGEgdGFnIHdpdGggdGhpcyBmaWVsZCBudW1iZXIuIiIiCi0gICMgSnVzdCBwYXNzIGluIHR5cGUgMCwgc2luY2UgdGhlIHR5cGUgd29uJ3QgYWZmZWN0IHRoZSB0YWcrdHlwZSBzaXplLgotICByZXR1cm4gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoUGFja1RhZyhmaWVsZF9udW1iZXIsIDApKQotCi0KLSMgUHJpdmF0ZSBoZWxwZXIgZnVuY3Rpb24gZm9yIHRoZSAqQnl0ZVNpemUoKSBmdW5jdGlvbnMgYWJvdmUuCi0KLWRlZiBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyh1aW50NjQpOgotICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGEgc2luZ2xlIHZhcmludAotICB1c2luZyBib3VuZGFyeSB2YWx1ZSBjb21wYXJpc29ucy4gKHVucm9sbGVkIGxvb3Agb3B0aW1pemF0aW9uIC1XUGllcmNlKQotICB1aW50NjQgbXVzdCBiZSB1bnNpZ25lZC4KLSAgIiIiCi0gIGlmIHVpbnQ2NCA8PSAweDdmOiByZXR1cm4gMQotICBpZiB1aW50NjQgPD0gMHgzZmZmOiByZXR1cm4gMgotICBpZiB1aW50NjQgPD0gMHgxZmZmZmY6IHJldHVybiAzCi0gIGlmIHVpbnQ2NCA8PSAweGZmZmZmZmY6IHJldHVybiA0Ci0gIGlmIHVpbnQ2NCA8PSAweDdmZmZmZmZmZjogcmV0dXJuIDUKLSAgaWYgdWludDY0IDw9IDB4M2ZmZmZmZmZmZmY6IHJldHVybiA2Ci0gIGlmIHVpbnQ2NCA8PSAweDFmZmZmZmZmZmZmZmY6IHJldHVybiA3Ci0gIGlmIHVpbnQ2NCA8PSAweGZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOAotICBpZiB1aW50NjQgPD0gMHg3ZmZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOQotICBpZiB1aW50NjQgPiBVSU5UNjRfTUFYOgotICAgIHJhaXNlIG1lc3NhZ2UuRW5jb2RlRXJyb3IoJ1ZhbHVlIG91dCBvZiByYW5nZTogJWQnICUgdWludDY0KQotICByZXR1cm4gMTAKLQotCi1OT05fUEFDS0FCTEVfVFlQRVMgPSAoCi0gIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HLAotICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQLAotICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UsCi0gIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVMKLSkKLQotCi1kZWYgSXNUeXBlUGFja2FibGUoZmllbGRfdHlwZSk6Ci0gICIiIlJldHVybiB0cnVlIGlmZiBwYWNrYWJsZSA9IHRydWUgaXMgdmFsaWQgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCi0KLSAgQXJnczoKLSAgICBmaWVsZF90eXBlOiBhIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB2YWx1ZS4KLQotICBSZXR1cm5zOgotICAgIFRydWUgaWZmIGZpZWxkcyBvZiB0aGlzIHR5cGUgYXJlIHBhY2thYmxlLgotICAiIiIKLSAgcmV0dXJuIGZpZWxkX3R5cGUgbm90IGluIE5PTl9QQUNLQUJMRV9UWVBFUwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdF90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBkYTEyMGYzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI1NyArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53aXJlX2Zvcm1hdC4iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotdHJ5OgotICBpbXBvcnQgdW5pdHRlc3QyIGFzIHVuaXR0ZXN0ICAjUFkyNgotZXhjZXB0IEltcG9ydEVycm9yOgotICBpbXBvcnQgdW5pdHRlc3QKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3aXJlX2Zvcm1hdAotCi0KLWNsYXNzIFdpcmVGb3JtYXRUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgdGVzdFBhY2tUYWcoc2VsZik6Ci0gICAgZmllbGRfbnVtYmVyID0gMHhhYmMKLSAgICB0YWdfdHlwZSA9IDIKLSAgICBzZWxmLmFzc2VydEVxdWFsKChmaWVsZF9udW1iZXIgPDwgMykgfCB0YWdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LlBhY2tUYWcoZmllbGRfbnVtYmVyLCB0YWdfdHlwZSkpCi0gICAgUGFja1RhZyA9IHdpcmVfZm9ybWF0LlBhY2tUYWcKLSAgICAjIE51bWJlciB0b28gaGlnaC4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLCBQYWNrVGFnLCBmaWVsZF9udW1iZXIsIDYpCi0gICAgIyBOdW1iZXIgdG9vIGxvdy4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkVuY29kZUVycm9yLCBQYWNrVGFnLCBmaWVsZF9udW1iZXIsIC0xKQotCi0gIGRlZiB0ZXN0VW5wYWNrVGFnKHNlbGYpOgotICAgICMgVGVzdCBmaWVsZCBudW1iZXJzIHRoYXQgd2lsbCByZXF1aXJlIHZhcmlvdXMgdmFyaW50IHNpemVzLgotICAgIGZvciBleHBlY3RlZF9maWVsZF9udW1iZXIgaW4gKDEsIDE1LCAxNiwgMjA0NywgMjA0OCk6Ci0gICAgICBmb3IgZXhwZWN0ZWRfd2lyZV90eXBlIGluIHJhbmdlKDYpOiAgIyBIaWdoZXN0LW51bWJlcmVkIHdpcmV0eXBlIGlzIDUuCi0gICAgICAgIGZpZWxkX251bWJlciwgd2lyZV90eXBlID0gd2lyZV9mb3JtYXQuVW5wYWNrVGFnKAotICAgICAgICAgICAgd2lyZV9mb3JtYXQuUGFja1RhZyhleHBlY3RlZF9maWVsZF9udW1iZXIsIGV4cGVjdGVkX3dpcmVfdHlwZSkpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfZmllbGRfbnVtYmVyLCBmaWVsZF9udW1iZXIpCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfd2lyZV90eXBlLCB3aXJlX3R5cGUpCi0KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpcmVfZm9ybWF0LlVucGFja1RhZywgTm9uZSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpcmVfZm9ybWF0LlVucGFja1RhZywgJ2FiYycpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcsIDAuMCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpcmVfZm9ybWF0LlVucGFja1RhZywgb2JqZWN0KCkpCi0KLSAgZGVmIHRlc3RaaWdaYWdFbmNvZGUoc2VsZik6Ci0gICAgWiA9IHdpcmVfZm9ybWF0LlppZ1phZ0VuY29kZQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgWigwKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIFooLTEpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgWigxKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIFooLTIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgWigyKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmUsIFooMHg3ZmZmZmZmZikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmLCBaKC0weDgwMDAwMDAwKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmZmZmZmZmZmZSwgWigweDdmZmZmZmZmZmZmZmZmZmYpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZmZmZmZmZmZmLCBaKC0weDgwMDAwMDAwMDAwMDAwMDApKQotCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCBOb25lKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgJ2FiY2QnKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgMC4wKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgb2JqZWN0KCkpCi0KLSAgZGVmIHRlc3RaaWdaYWdEZWNvZGUoc2VsZik6Ci0gICAgWiA9IHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgWigwKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCBaKDEpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgWigyKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0yLCBaKDMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgWig0KSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDB4N2ZmZmZmZmYsIFooMHhmZmZmZmZmZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMHg4MDAwMDAwMCwgWigweGZmZmZmZmZmKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDB4N2ZmZmZmZmZmZmZmZmZmZiwgWigweGZmZmZmZmZmZmZmZmZmZmUpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTB4ODAwMDAwMDAwMDAwMDAwMCwgWigweGZmZmZmZmZmZmZmZmZmZmYpKQotCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCBOb25lKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgJ2FiY2QnKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgMC4wKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgWiwgb2JqZWN0KCkpCi0KLSAgZGVmIE51bWVyaWNCeXRlU2l6ZVRlc3RIZWxwZXIoc2VsZiwgYnl0ZV9zaXplX2ZuLCB2YWx1ZSwgZXhwZWN0ZWRfdmFsdWVfc2l6ZSk6Ci0gICAgIyBVc2UgZmllbGQgbnVtYmVycyB0aGF0IGNhdXNlIHZhcmlvdXMgYnl0ZSBzaXplcyBmb3IgdGhlIHRhZyBpbmZvcm1hdGlvbi4KLSAgICBmb3IgZmllbGRfbnVtYmVyLCB0YWdfYnl0ZXMgaW4gKCgxNSwgMSksICgxNiwgMiksICgyMDQ3LCAyKSwgKDIwNDgsIDMpKToKLSAgICAgIGV4cGVjdGVkX3NpemUgPSBleHBlY3RlZF92YWx1ZV9zaXplICsgdGFnX2J5dGVzCi0gICAgICBhY3R1YWxfc2l6ZSA9IGJ5dGVfc2l6ZV9mbihmaWVsZF9udW1iZXIsIHZhbHVlKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9zaXplLCBhY3R1YWxfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgJ2J5dGVfc2l6ZV9mbjogJXMsIGZpZWxkX251bWJlcjogJWQsIHZhbHVlOiAlclxuJwotICAgICAgICAgICAgICAgICAgICAgICAnRXhwZWN0ZWQ6ICVkLCBBY3R1YWw6ICVkJyUgKAotICAgICAgICAgIGJ5dGVfc2l6ZV9mbiwgZmllbGRfbnVtYmVyLCB2YWx1ZSwgZXhwZWN0ZWRfc2l6ZSwgYWN0dWFsX3NpemUpKQotCi0gIGRlZiB0ZXN0Qnl0ZVNpemVGdW5jdGlvbnMoc2VsZik6Ci0gICAgIyBUZXN0IGFsbCBudW1lcmljICpCeXRlU2l6ZSgpIGZ1bmN0aW9ucy4KLSAgICBOVU1FUklDX0FSR1MgPSBbCi0gICAgICAgICMgSW50MzJCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwgMCwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLCAxMjcsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwgMTI4LCAyXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsIC0xLCAxMF0sCi0gICAgICAgICMgSW50NjRCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuSW50NjRCeXRlU2l6ZSwgMCwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLCAxMjcsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuSW50NjRCeXRlU2l6ZSwgMTI4LCAyXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsIC0xLCAxMF0sCi0gICAgICAgICMgVUludDMyQnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQzMkJ5dGVTaXplLCAwLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQzMkJ5dGVTaXplLCAxMjcsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsIDEyOCwgMl0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuVUlOVDMyX01BWCwgNV0sCi0gICAgICAgICMgVUludDY0Qnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCAwLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCAxMjcsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsIDEyOCwgMl0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuVUlOVDY0X01BWCwgMTBdLAotICAgICAgICAjIFNJbnQzMkJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgMCwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgLTEsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIDEsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIC02MywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgNjMsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsIC02NCwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgNjQsIDJdLAotICAgICAgICAjIFNJbnQ2NEJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgMCwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgLTEsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIDEsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIC02MywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgNjMsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUsIC02NCwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgNjQsIDJdLAotICAgICAgICAjIEZpeGVkMzJCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuRml4ZWQzMkJ5dGVTaXplLCAwLCA0XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkZpeGVkMzJCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuVUlOVDMyX01BWCwgNF0sCi0gICAgICAgICMgRml4ZWQ2NEJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5GaXhlZDY0Qnl0ZVNpemUsIDAsIDhdLAotICAgICAgICBbd2lyZV9mb3JtYXQuRml4ZWQ2NEJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UNjRfTUFYLCA4XSwKLSAgICAgICAgIyBTRml4ZWQzMkJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQzMkJ5dGVTaXplLCAwLCA0XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDMyQnl0ZVNpemUsIHdpcmVfZm9ybWF0LklOVDMyX01JTiwgNF0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQzMkJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5JTlQzMl9NQVgsIDRdLAotICAgICAgICAjIFNGaXhlZDY0Qnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDY0Qnl0ZVNpemUsIDAsIDhdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkNjRCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuSU5UNjRfTUlOLCA4XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDY0Qnl0ZVNpemUsIHdpcmVfZm9ybWF0LklOVDY0X01BWCwgOF0sCi0gICAgICAgICMgRmxvYXRCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuRmxvYXRCeXRlU2l6ZSwgMC4wLCA0XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkZsb2F0Qnl0ZVNpemUsIDEwMDAwMDAwMDAuMCwgNF0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5GbG9hdEJ5dGVTaXplLCAtMTAwMDAwMDAwMC4wLCA0XSwKLSAgICAgICAgIyBEb3VibGVCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuRG91YmxlQnl0ZVNpemUsIDAuMCwgOF0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5Eb3VibGVCeXRlU2l6ZSwgMTAwMDAwMDAwMC4wLCA4XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkRvdWJsZUJ5dGVTaXplLCAtMTAwMDAwMDAwMC4wLCA4XSwKLSAgICAgICAgIyBCb29sQnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LkJvb2xCeXRlU2l6ZSwgRmFsc2UsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuQm9vbEJ5dGVTaXplLCBUcnVlLCAxXSwKLSAgICAgICAgIyBFbnVtQnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwgMCwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5FbnVtQnl0ZVNpemUsIDEyNywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5FbnVtQnl0ZVNpemUsIDEyOCwgMl0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5FbnVtQnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQzMl9NQVgsIDVdLAotICAgICAgICBdCi0gICAgZm9yIGFyZ3MgaW4gTlVNRVJJQ19BUkdTOgotICAgICAgc2VsZi5OdW1lcmljQnl0ZVNpemVUZXN0SGVscGVyKCphcmdzKQotCi0gICAgIyBUZXN0IHN0cmluZ3MgYW5kIGJ5dGVzLgotICAgIGZvciBieXRlX3NpemVfZm4gaW4gKHdpcmVfZm9ybWF0LlN0cmluZ0J5dGVTaXplLCB3aXJlX2Zvcm1hdC5CeXRlc0J5dGVTaXplKToKLSAgICAgICMgMSBieXRlIGZvciB0YWcsIDEgYnl0ZSBmb3IgbGVuZ3RoLCAzIGJ5dGVzIGZvciBjb250ZW50cy4KLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgYnl0ZV9zaXplX2ZuKDEwLCAnYWJjJykpCi0gICAgICAjIDIgYnl0ZXMgZm9yIHRhZywgMSBieXRlIGZvciBsZW5ndGgsIDMgYnl0ZXMgZm9yIGNvbnRlbnRzLgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBieXRlX3NpemVfZm4oMTYsICdhYmMnKSkKLSAgICAgICMgMiBieXRlcyBmb3IgdGFnLCAyIGJ5dGVzIGZvciBsZW5ndGgsIDEyOCBieXRlcyBmb3IgY29udGVudHMuCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKDEzMiwgYnl0ZV9zaXplX2ZuKDE2LCAnYScgKiAxMjgpKQotCi0gICAgIyBUZXN0IFVURi04IHN0cmluZyBieXRlIHNpemUgY2FsY3VsYXRpb24uCi0gICAgIyAxIGJ5dGUgZm9yIHRhZywgMSBieXRlIGZvciBsZW5ndGgsIDggYnl0ZXMgZm9yIGNvbnRlbnQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgd2lyZV9mb3JtYXQuU3RyaW5nQnl0ZVNpemUoCi0gICAgICAgIDUsIGInXHhkMFx4YTJceGQwXHhiNVx4ZDFceDgxXHhkMVx4ODInLmRlY29kZSgndXRmLTgnKSkpCi0KLSAgICBjbGFzcyBNb2NrTWVzc2FnZShvYmplY3QpOgotICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ5dGVfc2l6ZSk6Ci0gICAgICAgIHNlbGYuYnl0ZV9zaXplID0gYnl0ZV9zaXplCi0gICAgICBkZWYgQnl0ZVNpemUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmJ5dGVfc2l6ZQotCi0gICAgbWVzc2FnZV9ieXRlX3NpemUgPSAxMAotICAgIG1vY2tfbWVzc2FnZSA9IE1vY2tNZXNzYWdlKGJ5dGVfc2l6ZT1tZXNzYWdlX2J5dGVfc2l6ZSkKLSAgICAjIFRlc3QgZ3JvdXBzLgotICAgICMgKDIgKiAxKSBieXRlcyBmb3IgYmVnaW4gYW5kIGVuZCB0YWdzLCBwbHVzIG1lc3NhZ2VfYnl0ZV9zaXplLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIG1lc3NhZ2VfYnl0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuR3JvdXBCeXRlU2l6ZSgxLCBtb2NrX21lc3NhZ2UpKQotICAgICMgKDIgKiAyKSBieXRlcyBmb3IgYmVnaW4gYW5kIGVuZCB0YWdzLCBwbHVzIG1lc3NhZ2VfYnl0ZV9zaXplLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCArIG1lc3NhZ2VfYnl0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuR3JvdXBCeXRlU2l6ZSgxNiwgbW9ja19tZXNzYWdlKSkKLQotICAgICMgVGVzdCBtZXNzYWdlcy4KLSAgICAjIDEgYnl0ZSBmb3IgdGFnLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKLSAgICAjIDIgYnl0ZXMgZm9yIHRhZywgcGx1cyAxIGJ5dGUgZm9yIGxlbmd0aCwgcGx1cyBjb250ZW50cy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZUJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQotICAgICMgMiBieXRlcyBmb3IgdGFnLCBwbHVzIDIgYnl0ZXMgZm9yIGxlbmd0aCwgcGx1cyBjb250ZW50cy4KLSAgICBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplID0gMTI4Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCg0ICsgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VCeXRlU2l6ZSgxNiwgbW9ja19tZXNzYWdlKSkKLQotCi0gICAgIyBUZXN0IG1lc3NhZ2Ugc2V0IGl0ZW0gYnl0ZSBzaXplLgotICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAxIGJ5dGUgZm9yIGxlbmd0aCwgcGx1cyAxIGJ5dGUgZm9yIHR5cGVfaWQsCi0gICAgIyBwbHVzIGNvbnRlbnRzLgotICAgIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgPSAxMAotICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSArIDYsCi0gICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKDEsIG1vY2tfbWVzc2FnZSkpCi0KLSAgICAjIDQgYnl0ZXMgZm9yIHRhZ3MsIHBsdXMgMiBieXRlcyBmb3IgbGVuZ3RoLCBwbHVzIDEgYnl0ZSBmb3IgdHlwZV9pZCwKLSAgICAjIHBsdXMgY29udGVudHMuCi0gICAgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSA9IDEyOAotICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSArIDcsCi0gICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKDEsIG1vY2tfbWVzc2FnZSkpCi0KLSAgICAjIDQgYnl0ZXMgZm9yIHRhZ3MsIHBsdXMgMiBieXRlcyBmb3IgbGVuZ3RoLCBwbHVzIDIgYnl0ZSBmb3IgdHlwZV9pZCwKLSAgICAjIHBsdXMgY29udGVudHMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgOCwKLSAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMTI4LCBtb2NrX21lc3NhZ2UpKQotCi0gICAgIyBUb28tbG9uZyB2YXJpbnQuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMSwgMSA8PCAxMjgpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2pzb25fZm9ybWF0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9qc29uX2Zvcm1hdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzkyMTU1Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2pzb25fZm9ybWF0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNjQ1ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiQ29udGFpbnMgcm91dGluZXMgZm9yIHByaW50aW5nIHByb3RvY29sIG1lc3NhZ2VzIGluIEpTT04gZm9ybWF0LgotCi1TaW1wbGUgdXNhZ2UgZXhhbXBsZToKLQotICAjIENyZWF0ZSBhIHByb3RvIG9iamVjdCBhbmQgc2VyaWFsaXplIGl0IHRvIGEganNvbiBmb3JtYXQgc3RyaW5nLgotICBtZXNzYWdlID0gbXlfcHJvdG9fcGIyLk15TWVzc2FnZShmb289J2JhcicpCi0gIGpzb25fc3RyaW5nID0ganNvbl9mb3JtYXQuTWVzc2FnZVRvSnNvbihtZXNzYWdlKQotCi0gICMgUGFyc2UgYSBqc29uIGZvcm1hdCBzdHJpbmcgdG8gcHJvdG8gb2JqZWN0LgotICBtZXNzYWdlID0ganNvbl9mb3JtYXQuUGFyc2UoanNvbl9zdHJpbmcsIG15X3Byb3RvX3BiMi5NeU1lc3NhZ2UoKSkKLSIiIgotCi1fX2F1dGhvcl9fID0gJ2ppZWx1b0Bnb29nbGUuY29tIChKaWUgTHVvKScKLQotaW1wb3J0IGJhc2U2NAotaW1wb3J0IGpzb24KLWltcG9ydCBtYXRoCi1pbXBvcnQgc2l4Ci1pbXBvcnQgc3lzCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlCi0KLV9USU1FU1RBTVBGT01BVCA9ICclWS0lbS0lZFQlSDolTTolUycKLV9JTlRfVFlQRVMgPSBmcm96ZW5zZXQoW2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UMzIsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1VJTlQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1VJTlQ2NF0pCi1fSU5UNjRfVFlQRVMgPSBmcm96ZW5zZXQoW2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfVUlOVDY0XSkKLV9GTE9BVF9UWVBFUyA9IGZyb3plbnNldChbZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9GTE9BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9ET1VCTEVdKQotX0lORklOSVRZID0gJ0luZmluaXR5JwotX05FR19JTkZJTklUWSA9ICctSW5maW5pdHknCi1fTkFOID0gJ05hTicKLQotCi1jbGFzcyBFcnJvcihFeGNlcHRpb24pOgotICAiIiJUb3AtbGV2ZWwgbW9kdWxlIGVycm9yIGZvciBqc29uX2Zvcm1hdC4iIiIKLQotCi1jbGFzcyBTZXJpYWxpemVUb0pzb25FcnJvcihFcnJvcik6Ci0gICIiIlRocm93biBpZiBzZXJpYWxpemF0aW9uIHRvIEpTT04gZmFpbHMuIiIiCi0KLQotY2xhc3MgUGFyc2VFcnJvcihFcnJvcik6Ci0gICIiIlRocm93biBpbiBjYXNlIG9mIHBhcnNpbmcgZXJyb3IuIiIiCi0KLQotZGVmIE1lc3NhZ2VUb0pzb24obWVzc2FnZSwgaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzPUZhbHNlKToKLSAgIiIiQ29udmVydHMgcHJvdG9idWYgbWVzc2FnZSB0byBKU09OIGZvcm1hdC4KLQotICBBcmdzOgotICAgIG1lc3NhZ2U6IFRoZSBwcm90b2NvbCBidWZmZXJzIG1lc3NhZ2UgaW5zdGFuY2UgdG8gc2VyaWFsaXplLgotICAgIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkczogSWYgVHJ1ZSwgc2luZ3VsYXIgcHJpbWl0aXZlIGZpZWxkcywKLSAgICAgICAgcmVwZWF0ZWQgZmllbGRzLCBhbmQgbWFwIGZpZWxkcyB3aWxsIGFsd2F5cyBiZSBzZXJpYWxpemVkLiAgSWYKLSAgICAgICAgRmFsc2UsIG9ubHkgc2VyaWFsaXplIG5vbi1lbXB0eSBmaWVsZHMuICBTaW5ndWxhciBtZXNzYWdlIGZpZWxkcwotICAgICAgICBhbmQgb25lb2YgZmllbGRzIGFyZSBub3QgYWZmZWN0ZWQgYnkgdGhpcyBvcHRpb24uCi0KLSAgUmV0dXJuczoKLSAgICBBIHN0cmluZyBjb250YWluaW5nIHRoZSBKU09OIGZvcm1hdHRlZCBwcm90b2NvbCBidWZmZXIgbWVzc2FnZS4KLSAgIiIiCi0gIGpzID0gX01lc3NhZ2VUb0pzb25PYmplY3QobWVzc2FnZSwgaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzKQotICByZXR1cm4ganNvbi5kdW1wcyhqcywgaW5kZW50PTIpCi0KLQotZGVmIF9NZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UsIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcyk6Ci0gICIiIkNvbnZlcnRzIG1lc3NhZ2UgdG8gYW4gb2JqZWN0IGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgotICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBtZXNzYWdlLkRFU0NSSVBUT1IKLSAgZnVsbF9uYW1lID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZQotICBpZiBfSXNXcmFwcGVyTWVzc2FnZShtZXNzYWdlX2Rlc2NyaXB0b3IpOgotICAgIHJldHVybiBfV3JhcHBlck1lc3NhZ2VUb0pzb25PYmplY3QobWVzc2FnZSkKLSAgaWYgZnVsbF9uYW1lIGluIF9XS1RKU09OTUVUSE9EUzoKLSAgICByZXR1cm4gX1dLVEpTT05NRVRIT0RTW2Z1bGxfbmFtZV1bMF0oCi0gICAgICAgIG1lc3NhZ2UsIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcykKLSAganMgPSB7fQotICByZXR1cm4gX1JlZ3VsYXJNZXNzYWdlVG9Kc29uT2JqZWN0KAotICAgICAgbWVzc2FnZSwganMsIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcykKLQotCi1kZWYgX0lzTWFwRW50cnkoZmllbGQpOgotICByZXR1cm4gKGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFIGFuZAotICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZS5oYXNfb3B0aW9ucyBhbmQKLSAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUuR2V0T3B0aW9ucygpLm1hcF9lbnRyeSkKLQotCi1kZWYgX1JlZ3VsYXJNZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UsIGpzLCBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHMpOgotICAiIiJDb252ZXJ0cyBub3JtYWwgbWVzc2FnZSBhY2NvcmRpbmcgdG8gUHJvdG8zIEpTT04gU3BlY2lmaWNhdGlvbi4iIiIKLSAgZmllbGRzID0gbWVzc2FnZS5MaXN0RmllbGRzKCkKLSAgaW5jbHVkZV9kZWZhdWx0ID0gaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzCi0KLSAgdHJ5OgotICAgIGZvciBmaWVsZCwgdmFsdWUgaW4gZmllbGRzOgotICAgICAgbmFtZSA9IGZpZWxkLmNhbWVsY2FzZV9uYW1lCi0gICAgICBpZiBfSXNNYXBFbnRyeShmaWVsZCk6Ci0gICAgICAgICMgQ29udmVydCBhIG1hcCBmaWVsZC4KLSAgICAgICAgdl9maWVsZCA9IGZpZWxkLm1lc3NhZ2VfdHlwZS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXQotICAgICAgICBqc19tYXAgPSB7fQotICAgICAgICBmb3Iga2V5IGluIHZhbHVlOgotICAgICAgICAgIGlmIGlzaW5zdGFuY2Uoa2V5LCBib29sKToKLSAgICAgICAgICAgIGlmIGtleToKLSAgICAgICAgICAgICAgcmVjb3JkZWRfa2V5ID0gJ3RydWUnCi0gICAgICAgICAgICBlbHNlOgotICAgICAgICAgICAgICByZWNvcmRlZF9rZXkgPSAnZmFsc2UnCi0gICAgICAgICAgZWxzZToKLSAgICAgICAgICAgIHJlY29yZGVkX2tleSA9IGtleQotICAgICAgICAgIGpzX21hcFtyZWNvcmRlZF9rZXldID0gX0ZpZWxkVG9Kc29uT2JqZWN0KAotICAgICAgICAgICAgICB2X2ZpZWxkLCB2YWx1ZVtrZXldLCBpbmNsdWRpbmdfZGVmYXVsdF92YWx1ZV9maWVsZHMpCi0gICAgICAgIGpzW25hbWVdID0ganNfbWFwCi0gICAgICBlbGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgICAgICAjIENvbnZlcnQgYSByZXBlYXRlZCBmaWVsZC4KLSAgICAgICAganNbbmFtZV0gPSBbX0ZpZWxkVG9Kc29uT2JqZWN0KGZpZWxkLCBrLCBpbmNsdWRlX2RlZmF1bHQpCi0gICAgICAgICAgICAgICAgICAgIGZvciBrIGluIHZhbHVlXQotICAgICAgZWxzZToKLSAgICAgICAganNbbmFtZV0gPSBfRmllbGRUb0pzb25PYmplY3QoZmllbGQsIHZhbHVlLCBpbmNsdWRlX2RlZmF1bHQpCi0KLSAgICAjIFNlcmlhbGl6ZSBkZWZhdWx0IHZhbHVlIGlmIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcyBpcyBUcnVlLgotICAgIGlmIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkczoKLSAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2UuREVTQ1JJUFRPUgotICAgICAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6Ci0gICAgICAgICMgU2luZ3VsYXIgbWVzc2FnZSBmaWVsZHMgYW5kIG9uZW9mIGZpZWxkcyB3aWxsIG5vdCBiZSBhZmZlY3RlZC4KLSAgICAgICAgaWYgKChmaWVsZC5sYWJlbCAhPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRCBhbmQKLSAgICAgICAgICAgICBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0UpIG9yCi0gICAgICAgICAgICBmaWVsZC5jb250YWluaW5nX29uZW9mKToKLSAgICAgICAgICBjb250aW51ZQotICAgICAgICBuYW1lID0gZmllbGQuY2FtZWxjYXNlX25hbWUKLSAgICAgICAgaWYgbmFtZSBpbiBqczoKLSAgICAgICAgICAjIFNraXAgdGhlIGZpZWxkIHdoaWNoIGhhcyBiZWVuIHNlcmFpbGl6ZWQgYWxyZWFkeS4KLSAgICAgICAgICBjb250aW51ZQotICAgICAgICBpZiBfSXNNYXBFbnRyeShmaWVsZCk6Ci0gICAgICAgICAganNbbmFtZV0gPSB7fQotICAgICAgICBlbGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgICAgICAgIGpzW25hbWVdID0gW10KLSAgICAgICAgZWxzZToKLSAgICAgICAgICBqc1tuYW1lXSA9IF9GaWVsZFRvSnNvbk9iamVjdChmaWVsZCwgZmllbGQuZGVmYXVsdF92YWx1ZSkKLQotICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgIHJhaXNlIFNlcmlhbGl6ZVRvSnNvbkVycm9yKAotICAgICAgICAnRmFpbGVkIHRvIHNlcmlhbGl6ZSB7MH0gZmllbGQ6IHsxfS4nLmZvcm1hdChmaWVsZC5uYW1lLCBlKSkKLQotICByZXR1cm4ganMKLQotCi1kZWYgX0ZpZWxkVG9Kc29uT2JqZWN0KAotICAgIGZpZWxkLCB2YWx1ZSwgaW5jbHVkaW5nX2RlZmF1bHRfdmFsdWVfZmllbGRzPUZhbHNlKToKLSAgIiIiQ29udmVydHMgZmllbGQgdmFsdWUgYWNjb3JkaW5nIHRvIFByb3RvMyBKU09OIFNwZWNpZmljYXRpb24uIiIiCi0gIGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICByZXR1cm4gX01lc3NhZ2VUb0pzb25PYmplY3QodmFsdWUsIGluY2x1ZGluZ19kZWZhdWx0X3ZhbHVlX2ZpZWxkcykKLSAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0VOVU06Ci0gICAgZW51bV92YWx1ZSA9IGZpZWxkLmVudW1fdHlwZS52YWx1ZXNfYnlfbnVtYmVyLmdldCh2YWx1ZSwgTm9uZSkKLSAgICBpZiBlbnVtX3ZhbHVlIGlzIG5vdCBOb25lOgotICAgICAgcmV0dXJuIGVudW1fdmFsdWUubmFtZQotICAgIGVsc2U6Ci0gICAgICByYWlzZSBTZXJpYWxpemVUb0pzb25FcnJvcignRW51bSBmaWVsZCBjb250YWlucyBhbiBpbnRlZ2VyIHZhbHVlICcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICd3aGljaCBjYW4gbm90IG1hcHBlZCB0byBhbiBlbnVtIHZhbHVlLicpCi0gIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9TVFJJTkc6Ci0gICAgaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgotICAgICAgIyBVc2UgYmFzZTY0IERhdGEgZW5jb2RpbmcgZm9yIGJ5dGVzCi0gICAgICByZXR1cm4gYmFzZTY0LmI2NGVuY29kZSh2YWx1ZSkuZGVjb2RlKCd1dGYtOCcpCi0gICAgZWxzZToKLSAgICAgIHJldHVybiB2YWx1ZQotICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfQk9PTDoKLSAgICByZXR1cm4gYm9vbCh2YWx1ZSkKLSAgZWxpZiBmaWVsZC5jcHBfdHlwZSBpbiBfSU5UNjRfVFlQRVM6Ci0gICAgcmV0dXJuIHN0cih2YWx1ZSkKLSAgZWxpZiBmaWVsZC5jcHBfdHlwZSBpbiBfRkxPQVRfVFlQRVM6Ci0gICAgaWYgbWF0aC5pc2luZih2YWx1ZSk6Ci0gICAgICBpZiB2YWx1ZSA8IDAuMDoKLSAgICAgICAgcmV0dXJuIF9ORUdfSU5GSU5JVFkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBfSU5GSU5JVFkKLSAgICBpZiBtYXRoLmlzbmFuKHZhbHVlKToKLSAgICAgIHJldHVybiBfTkFOCi0gIHJldHVybiB2YWx1ZQotCi0KLWRlZiBfQW55TWVzc2FnZVRvSnNvbk9iamVjdChtZXNzYWdlLCBpbmNsdWRpbmdfZGVmYXVsdCk6Ci0gICIiIkNvbnZlcnRzIEFueSBtZXNzYWdlIGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgotICBpZiBub3QgbWVzc2FnZS5MaXN0RmllbGRzKCk6Ci0gICAgcmV0dXJuIHt9Ci0gIGpzID0ge30KLSAgdHlwZV91cmwgPSBtZXNzYWdlLnR5cGVfdXJsCi0gIGpzWydAdHlwZSddID0gdHlwZV91cmwKLSAgc3ViX21lc3NhZ2UgPSBfQ3JlYXRlTWVzc2FnZUZyb21UeXBlVXJsKHR5cGVfdXJsKQotICBzdWJfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS52YWx1ZSkKLSAgbWVzc2FnZV9kZXNjcmlwdG9yID0gc3ViX21lc3NhZ2UuREVTQ1JJUFRPUgotICBmdWxsX25hbWUgPSBtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lCi0gIGlmIF9Jc1dyYXBwZXJNZXNzYWdlKG1lc3NhZ2VfZGVzY3JpcHRvcik6Ci0gICAganNbJ3ZhbHVlJ10gPSBfV3JhcHBlck1lc3NhZ2VUb0pzb25PYmplY3Qoc3ViX21lc3NhZ2UpCi0gICAgcmV0dXJuIGpzCi0gIGlmIGZ1bGxfbmFtZSBpbiBfV0tUSlNPTk1FVEhPRFM6Ci0gICAganNbJ3ZhbHVlJ10gPSBfV0tUSlNPTk1FVEhPRFNbZnVsbF9uYW1lXVswXShzdWJfbWVzc2FnZSwgaW5jbHVkaW5nX2RlZmF1bHQpCi0gICAgcmV0dXJuIGpzCi0gIHJldHVybiBfUmVndWxhck1lc3NhZ2VUb0pzb25PYmplY3Qoc3ViX21lc3NhZ2UsIGpzLCBpbmNsdWRpbmdfZGVmYXVsdCkKLQotCi1kZWYgX0NyZWF0ZU1lc3NhZ2VGcm9tVHlwZVVybCh0eXBlX3VybCk6Ci0gICMgVE9ETyhqaWVsdW8pOiBTaG91bGQgYWRkIGEgd2F5IHRoYXQgdXNlcnMgY2FuIHJlZ2lzdGVyIHRoZSB0eXBlIHJlc29sdmVyCi0gICMgaW5zdGVhZCBvZiB0aGUgZGVmYXVsdCBvbmUuCi0gIGRiID0gc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKQotICB0eXBlX25hbWUgPSB0eXBlX3VybC5zcGxpdCgnLycpWy0xXQotICB0cnk6Ci0gICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gZGIucG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUodHlwZV9uYW1lKQotICBleGNlcHQgS2V5RXJyb3I6Ci0gICAgcmFpc2UgVHlwZUVycm9yKAotICAgICAgICAnQ2FuIG5vdCBmaW5kIG1lc3NhZ2UgZGVzY3JpcHRvciBieSB0eXBlX3VybDogezB9LicuZm9ybWF0KHR5cGVfdXJsKSkKLSAgbWVzc2FnZV9jbGFzcyA9IGRiLkdldFByb3RvdHlwZShtZXNzYWdlX2Rlc2NyaXB0b3IpCi0gIHJldHVybiBtZXNzYWdlX2NsYXNzKCkKLQotCi1kZWYgX0dlbmVyaWNNZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UsIHVudXNlZF9pbmNsdWRpbmdfZGVmYXVsdCk6Ci0gICIiIkNvbnZlcnRzIG1lc3NhZ2UgYnkgVG9Kc29uU3RyaW5nIGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgotICAjIER1cmF0aW9uLCBUaW1lc3RhbXAgYW5kIEZpZWxkTWFzayBoYXZlIFRvSnNvblN0cmluZyBtZXRob2QgdG8gZG8gdGhlCi0gICMgY29udmVydC4gVXNlcnMgY2FuIGFsc28gY2FsbCB0aGUgbWV0aG9kIGRpcmVjdGx5LgotICByZXR1cm4gbWVzc2FnZS5Ub0pzb25TdHJpbmcoKQotCi0KLWRlZiBfVmFsdWVNZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UsIHVudXNlZF9pbmNsdWRpbmdfZGVmYXVsdD1GYWxzZSk6Ci0gICIiIkNvbnZlcnRzIFZhbHVlIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFByb3RvMyBKU09OIFNwZWNpZmljYXRpb24uIiIiCi0gIHdoaWNoID0gbWVzc2FnZS5XaGljaE9uZW9mKCdraW5kJykKLSAgIyBJZiB0aGUgVmFsdWUgbWVzc2FnZSBpcyBub3Qgc2V0IHRyZWF0IGFzIG51bGxfdmFsdWUgd2hlbiBzZXJpYWxpemUKLSAgIyB0byBKU09OLiBUaGUgcGFyc2UgYmFjayByZXN1bHQgd2lsbCBiZSBkaWZmZXJlbnQgZnJvbSBvcmlnaW5hbCBtZXNzYWdlLgotICBpZiB3aGljaCBpcyBOb25lIG9yIHdoaWNoID09ICdudWxsX3ZhbHVlJzoKLSAgICByZXR1cm4gTm9uZQotICBpZiB3aGljaCA9PSAnbGlzdF92YWx1ZSc6Ci0gICAgcmV0dXJuIF9MaXN0VmFsdWVNZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UubGlzdF92YWx1ZSkKLSAgaWYgd2hpY2ggPT0gJ3N0cnVjdF92YWx1ZSc6Ci0gICAgdmFsdWUgPSBtZXNzYWdlLnN0cnVjdF92YWx1ZQotICBlbHNlOgotICAgIHZhbHVlID0gZ2V0YXR0cihtZXNzYWdlLCB3aGljaCkKLSAgb25lb2ZfZGVzY3JpcHRvciA9IG1lc3NhZ2UuREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVt3aGljaF0KLSAgcmV0dXJuIF9GaWVsZFRvSnNvbk9iamVjdChvbmVvZl9kZXNjcmlwdG9yLCB2YWx1ZSkKLQotCi1kZWYgX0xpc3RWYWx1ZU1lc3NhZ2VUb0pzb25PYmplY3QobWVzc2FnZSwgdW51c2VkX2luY2x1ZGluZ19kZWZhdWx0PUZhbHNlKToKLSAgIiIiQ29udmVydHMgTGlzdFZhbHVlIG1lc3NhZ2UgYWNjb3JkaW5nIHRvIFByb3RvMyBKU09OIFNwZWNpZmljYXRpb24uIiIiCi0gIHJldHVybiBbX1ZhbHVlTWVzc2FnZVRvSnNvbk9iamVjdCh2YWx1ZSkKLSAgICAgICAgICBmb3IgdmFsdWUgaW4gbWVzc2FnZS52YWx1ZXNdCi0KLQotZGVmIF9TdHJ1Y3RNZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UsIHVudXNlZF9pbmNsdWRpbmdfZGVmYXVsdD1GYWxzZSk6Ci0gICIiIkNvbnZlcnRzIFN0cnVjdCBtZXNzYWdlIGFjY29yZGluZyB0byBQcm90bzMgSlNPTiBTcGVjaWZpY2F0aW9uLiIiIgotICBmaWVsZHMgPSBtZXNzYWdlLmZpZWxkcwotICByZXQgPSB7fQotICBmb3Iga2V5IGluIGZpZWxkczoKLSAgICByZXRba2V5XSA9IF9WYWx1ZU1lc3NhZ2VUb0pzb25PYmplY3QoZmllbGRzW2tleV0pCi0gIHJldHVybiByZXQKLQotCi1kZWYgX0lzV3JhcHBlck1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yKToKLSAgcmV0dXJuIG1lc3NhZ2VfZGVzY3JpcHRvci5maWxlLm5hbWUgPT0gJ2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wcm90bycKLQotCi1kZWYgX1dyYXBwZXJNZXNzYWdlVG9Kc29uT2JqZWN0KG1lc3NhZ2UpOgotICByZXR1cm4gX0ZpZWxkVG9Kc29uT2JqZWN0KAotICAgICAgbWVzc2FnZS5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLCBtZXNzYWdlLnZhbHVlKQotCi0KLWRlZiBfRHVwbGljYXRlQ2hlY2tlcihqcyk6Ci0gIHJlc3VsdCA9IHt9Ci0gIGZvciBuYW1lLCB2YWx1ZSBpbiBqczoKLSAgICBpZiBuYW1lIGluIHJlc3VsdDoKLSAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0ZhaWxlZCB0byBsb2FkIEpTT046IGR1cGxpY2F0ZSBrZXkgezB9LicuZm9ybWF0KG5hbWUpKQotICAgIHJlc3VsdFtuYW1lXSA9IHZhbHVlCi0gIHJldHVybiByZXN1bHQKLQotCi1kZWYgUGFyc2UodGV4dCwgbWVzc2FnZSk6Ci0gICIiIlBhcnNlcyBhIEpTT04gcmVwcmVzZW50YXRpb24gb2YgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gYSBtZXNzYWdlLgotCi0gIEFyZ3M6Ci0gICAgdGV4dDogTWVzc2FnZSBKU09OIHJlcHJlc2VudGF0aW9uLgotICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgYmVmZmVyIG1lc3NhZ2UgdG8gbWVyZ2UgaW50by4KLQotICBSZXR1cm5zOgotICAgIFRoZSBzYW1lIG1lc3NhZ2UgcGFzc2VkIGFzIGFyZ3VtZW50LgotCi0gIFJhaXNlczo6Ci0gICAgUGFyc2VFcnJvcjogT24gSlNPTiBwYXJzaW5nIHByb2JsZW1zLgotICAiIiIKLSAgaWYgbm90IGlzaW5zdGFuY2UodGV4dCwgc2l4LnRleHRfdHlwZSk6IHRleHQgPSB0ZXh0LmRlY29kZSgndXRmLTgnKQotICB0cnk6Ci0gICAgaWYgc3lzLnZlcnNpb25faW5mbyA8ICgyLCA3KToKLSAgICAgICMgb2JqZWN0X3BhaXJfaG9vayBpcyBub3Qgc3VwcG9ydGVkIGJlZm9yZSBweXRob24yLjcKLSAgICAgIGpzID0ganNvbi5sb2Fkcyh0ZXh0KQotICAgIGVsc2U6Ci0gICAgICBqcyA9IGpzb24ubG9hZHModGV4dCwgb2JqZWN0X3BhaXJzX2hvb2s9X0R1cGxpY2F0ZUNoZWNrZXIpCi0gIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6Ci0gICAgcmFpc2UgUGFyc2VFcnJvcignRmFpbGVkIHRvIGxvYWQgSlNPTjogezB9LicuZm9ybWF0KHN0cihlKSkpCi0gIF9Db252ZXJ0TWVzc2FnZShqcywgbWVzc2FnZSkKLSAgcmV0dXJuIG1lc3NhZ2UKLQotCi1kZWYgX0NvbnZlcnRGaWVsZFZhbHVlUGFpcihqcywgbWVzc2FnZSk6Ci0gICIiIkNvbnZlcnQgZmllbGQgdmFsdWUgcGFpcnMgaW50byByZWd1bGFyIG1lc3NhZ2UuCi0KLSAgQXJnczoKLSAgICBqczogQSBKU09OIG9iamVjdCB0byBjb252ZXJ0IHRoZSBmaWVsZCB2YWx1ZSBwYWlycy4KLSAgICBtZXNzYWdlOiBBIHJlZ3VsYXIgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGRhdGEuCi0KLSAgUmFpc2VzOgotICAgIFBhcnNlRXJyb3I6IEluIGNhc2Ugb2YgcHJvYmxlbXMgY29udmVydGluZy4KLSAgIiIiCi0gIG5hbWVzID0gW10KLSAgbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZS5ERVNDUklQVE9SCi0gIGZvciBuYW1lIGluIGpzOgotICAgIHRyeToKLSAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZS5nZXQobmFtZSwgTm9uZSkKLSAgICAgIGlmIG5vdCBmaWVsZDoKLSAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigKLSAgICAgICAgICAgICdNZXNzYWdlIHR5cGUgInswfSIgaGFzIG5vIGZpZWxkIG5hbWVkICJ7MX0iLicuZm9ybWF0KAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUsIG5hbWUpKQotICAgICAgaWYgbmFtZSBpbiBuYW1lczoKLSAgICAgICAgcmFpc2UgUGFyc2VFcnJvcigKLSAgICAgICAgICAgICdNZXNzYWdlIHR5cGUgInswfSIgc2hvdWxkIG5vdCBoYXZlIG11bHRpcGxlICJ7MX0iIGZpZWxkcy4nLmZvcm1hdCgKLSAgICAgICAgICAgICAgICBtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lLCBuYW1lKSkKLSAgICAgIG5hbWVzLmFwcGVuZChuYW1lKQotICAgICAgIyBDaGVjayBubyBvdGhlciBvbmVvZiBmaWVsZCBpcyBwYXJzZWQuCi0gICAgICBpZiBmaWVsZC5jb250YWluaW5nX29uZW9mIGlzIG5vdCBOb25lOgotICAgICAgICBvbmVvZl9uYW1lID0gZmllbGQuY29udGFpbmluZ19vbmVvZi5uYW1lCi0gICAgICAgIGlmIG9uZW9mX25hbWUgaW4gbmFtZXM6Ci0gICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignTWVzc2FnZSB0eXBlICJ7MH0iIHNob3VsZCBub3QgaGF2ZSBtdWx0aXBsZSAiezF9IiAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnb25lb2YgZmllbGRzLicuZm9ybWF0KAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuREVTQ1JJUFRPUi5mdWxsX25hbWUsIG9uZW9mX25hbWUpKQotICAgICAgICBuYW1lcy5hcHBlbmQob25lb2ZfbmFtZSkKLQotICAgICAgdmFsdWUgPSBqc1tuYW1lXQotICAgICAgaWYgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgbWVzc2FnZS5DbGVhckZpZWxkKGZpZWxkLm5hbWUpCi0gICAgICAgIGNvbnRpbnVlCi0KLSAgICAgICMgUGFyc2UgZmllbGQgdmFsdWUuCi0gICAgICBpZiBfSXNNYXBFbnRyeShmaWVsZCk6Ci0gICAgICAgIG1lc3NhZ2UuQ2xlYXJGaWVsZChmaWVsZC5uYW1lKQotICAgICAgICBfQ29udmVydE1hcEZpZWxkVmFsdWUodmFsdWUsIG1lc3NhZ2UsIGZpZWxkKQotICAgICAgZWxpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgICAgbWVzc2FnZS5DbGVhckZpZWxkKGZpZWxkLm5hbWUpCi0gICAgICAgIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBsaXN0KToKLSAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCdyZXBlYXRlZCBmaWVsZCB7MH0gbXVzdCBiZSBpbiBbXSB3aGljaCBpcyAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAnezF9LicuZm9ybWF0KG5hbWUsIHZhbHVlKSkKLSAgICAgICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgICMgUmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4KLSAgICAgICAgICBmb3IgaXRlbSBpbiB2YWx1ZToKLSAgICAgICAgICAgIHN1Yl9tZXNzYWdlID0gZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKS5hZGQoKQotICAgICAgICAgICAgIyBOb25lIGlzIGEgbnVsbF92YWx1ZSBpbiBWYWx1ZS4KLSAgICAgICAgICAgIGlmIChpdGVtIGlzIE5vbmUgYW5kCi0gICAgICAgICAgICAgICAgc3ViX21lc3NhZ2UuREVTQ1JJUFRPUi5mdWxsX25hbWUgIT0gJ2dvb2dsZS5wcm90b2J1Zi5WYWx1ZScpOgotICAgICAgICAgICAgICByYWlzZSBQYXJzZUVycm9yKCdudWxsIGlzIG5vdCBhbGxvd2VkIHRvIGJlIHVzZWQgYXMgYW4gZWxlbWVudCcKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnIGluIGEgcmVwZWF0ZWQgZmllbGQuJykKLSAgICAgICAgICAgIF9Db252ZXJ0TWVzc2FnZShpdGVtLCBzdWJfbWVzc2FnZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICAjIFJlcGVhdGVkIHNjYWxhciBmaWVsZC4KLSAgICAgICAgICBmb3IgaXRlbSBpbiB2YWx1ZToKLSAgICAgICAgICAgIGlmIGl0ZW0gaXMgTm9uZToKLSAgICAgICAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignbnVsbCBpcyBub3QgYWxsb3dlZCB0byBiZSB1c2VkIGFzIGFuIGVsZW1lbnQnCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJyBpbiBhIHJlcGVhdGVkIGZpZWxkLicpCi0gICAgICAgICAgICBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpLmFwcGVuZCgKLSAgICAgICAgICAgICAgICBfQ29udmVydFNjYWxhckZpZWxkVmFsdWUoaXRlbSwgZmllbGQpKQotICAgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIHN1Yl9tZXNzYWdlID0gZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKQotICAgICAgICBfQ29udmVydE1lc3NhZ2UodmFsdWUsIHN1Yl9tZXNzYWdlKQotICAgICAgZWxzZToKLSAgICAgICAgc2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lLCBfQ29udmVydFNjYWxhckZpZWxkVmFsdWUodmFsdWUsIGZpZWxkKSkKLSAgICBleGNlcHQgUGFyc2VFcnJvciBhcyBlOgotICAgICAgaWYgZmllbGQgYW5kIGZpZWxkLmNvbnRhaW5pbmdfb25lb2YgaXMgTm9uZToKLSAgICAgICAgcmFpc2UgUGFyc2VFcnJvcignRmFpbGVkIHRvIHBhcnNlIHswfSBmaWVsZDogezF9Jy5mb3JtYXQobmFtZSwgZSkpCi0gICAgICBlbHNlOgotICAgICAgICByYWlzZSBQYXJzZUVycm9yKHN0cihlKSkKLSAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgICAgcmFpc2UgUGFyc2VFcnJvcignRmFpbGVkIHRvIHBhcnNlIHswfSBmaWVsZDogezF9LicuZm9ybWF0KG5hbWUsIGUpKQotICAgIGV4Y2VwdCBUeXBlRXJyb3IgYXMgZToKLSAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0ZhaWxlZCB0byBwYXJzZSB7MH0gZmllbGQ6IHsxfS4nLmZvcm1hdChuYW1lLCBlKSkKLQotCi1kZWYgX0NvbnZlcnRNZXNzYWdlKHZhbHVlLCBtZXNzYWdlKToKLSAgIiIiQ29udmVydCBhIEpTT04gb2JqZWN0IGludG8gYSBtZXNzYWdlLgotCi0gIEFyZ3M6Ci0gICAgdmFsdWU6IEEgSlNPTiBvYmplY3QuCi0gICAgbWVzc2FnZTogQSBXS1Qgb3IgcmVndWxhciBwcm90b2NvbCBtZXNzYWdlIHRvIHJlY29yZCB0aGUgZGF0YS4KLQotICBSYWlzZXM6Ci0gICAgUGFyc2VFcnJvcjogSW4gY2FzZSBvZiBjb252ZXJ0IHByb2JsZW1zLgotICAiIiIKLSAgbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZS5ERVNDUklQVE9SCi0gIGZ1bGxfbmFtZSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUKLSAgaWYgX0lzV3JhcHBlck1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yKToKLSAgICBfQ29udmVydFdyYXBwZXJNZXNzYWdlKHZhbHVlLCBtZXNzYWdlKQotICBlbGlmIGZ1bGxfbmFtZSBpbiBfV0tUSlNPTk1FVEhPRFM6Ci0gICAgX1dLVEpTT05NRVRIT0RTW2Z1bGxfbmFtZV1bMV0odmFsdWUsIG1lc3NhZ2UpCi0gIGVsc2U6Ci0gICAgX0NvbnZlcnRGaWVsZFZhbHVlUGFpcih2YWx1ZSwgbWVzc2FnZSkKLQotCi1kZWYgX0NvbnZlcnRBbnlNZXNzYWdlKHZhbHVlLCBtZXNzYWdlKToKLSAgIiIiQ29udmVydCBhIEpTT04gcmVwcmVzZW50YXRpb24gaW50byBBbnkgbWVzc2FnZS4iIiIKLSAgaWYgaXNpbnN0YW5jZSh2YWx1ZSwgZGljdCkgYW5kIG5vdCB2YWx1ZToKLSAgICByZXR1cm4KLSAgdHJ5OgotICAgIHR5cGVfdXJsID0gdmFsdWVbJ0B0eXBlJ10KLSAgZXhjZXB0IEtleUVycm9yOgotICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0B0eXBlIGlzIG1pc3Npbmcgd2hlbiBwYXJzaW5nIGFueSBtZXNzYWdlLicpCi0KLSAgc3ViX21lc3NhZ2UgPSBfQ3JlYXRlTWVzc2FnZUZyb21UeXBlVXJsKHR5cGVfdXJsKQotICBtZXNzYWdlX2Rlc2NyaXB0b3IgPSBzdWJfbWVzc2FnZS5ERVNDUklQVE9SCi0gIGZ1bGxfbmFtZSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUKLSAgaWYgX0lzV3JhcHBlck1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yKToKLSAgICBfQ29udmVydFdyYXBwZXJNZXNzYWdlKHZhbHVlWyd2YWx1ZSddLCBzdWJfbWVzc2FnZSkKLSAgZWxpZiBmdWxsX25hbWUgaW4gX1dLVEpTT05NRVRIT0RTOgotICAgIF9XS1RKU09OTUVUSE9EU1tmdWxsX25hbWVdWzFdKHZhbHVlWyd2YWx1ZSddLCBzdWJfbWVzc2FnZSkKLSAgZWxzZToKLSAgICBkZWwgdmFsdWVbJ0B0eXBlJ10KLSAgICBfQ29udmVydEZpZWxkVmFsdWVQYWlyKHZhbHVlLCBzdWJfbWVzc2FnZSkKLSAgIyBTZXRzIEFueSBtZXNzYWdlCi0gIG1lc3NhZ2UudmFsdWUgPSBzdWJfbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpCi0gIG1lc3NhZ2UudHlwZV91cmwgPSB0eXBlX3VybAotCi0KLWRlZiBfQ29udmVydEdlbmVyaWNNZXNzYWdlKHZhbHVlLCBtZXNzYWdlKToKLSAgIiIiQ29udmVydCBhIEpTT04gcmVwcmVzZW50YXRpb24gaW50byBtZXNzYWdlIHdpdGggRnJvbUpzb25TdHJpbmcuIiIiCi0gICMgRHVyYW50aW9uLCBUaW1lc3RhbXAsIEZpZWxkTWFzayBoYXZlIEZyb21Kc29uU3RyaW5nIG1ldGhvZCB0byBkbyB0aGUKLSAgIyBjb252ZXJ0LiBVc2VycyBjYW4gYWxzbyBjYWxsIHRoZSBtZXRob2QgZGlyZWN0bHkuCi0gIG1lc3NhZ2UuRnJvbUpzb25TdHJpbmcodmFsdWUpCi0KLQotX0lOVF9PUl9GTE9BVCA9IHNpeC5pbnRlZ2VyX3R5cGVzICsgKGZsb2F0LCkKLQotCi1kZWYgX0NvbnZlcnRWYWx1ZU1lc3NhZ2UodmFsdWUsIG1lc3NhZ2UpOgotICAiIiJDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBpbnRvIFZhbHVlIG1lc3NhZ2UuIiIiCi0gIGlmIGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgotICAgIF9Db252ZXJ0U3RydWN0TWVzc2FnZSh2YWx1ZSwgbWVzc2FnZS5zdHJ1Y3RfdmFsdWUpCi0gIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6Ci0gICAgX0NvbnZlcnRMaXN0VmFsdWVNZXNzYWdlKHZhbHVlLCBtZXNzYWdlLmxpc3RfdmFsdWUpCi0gIGVsaWYgdmFsdWUgaXMgTm9uZToKLSAgICBtZXNzYWdlLm51bGxfdmFsdWUgPSAwCi0gIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6Ci0gICAgbWVzc2FnZS5ib29sX3ZhbHVlID0gdmFsdWUKLSAgZWxpZiBpc2luc3RhbmNlKHZhbHVlLCBzaXguc3RyaW5nX3R5cGVzKToKLSAgICBtZXNzYWdlLnN0cmluZ192YWx1ZSA9IHZhbHVlCi0gIGVsaWYgaXNpbnN0YW5jZSh2YWx1ZSwgX0lOVF9PUl9GTE9BVCk6Ci0gICAgbWVzc2FnZS5udW1iZXJfdmFsdWUgPSB2YWx1ZQotICBlbHNlOgotICAgIHJhaXNlIFBhcnNlRXJyb3IoJ1VuZXhwZWN0ZWQgdHlwZSBmb3IgVmFsdWUgbWVzc2FnZS4nKQotCi0KLWRlZiBfQ29udmVydExpc3RWYWx1ZU1lc3NhZ2UodmFsdWUsIG1lc3NhZ2UpOgotICAiIiJDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBpbnRvIExpc3RWYWx1ZSBtZXNzYWdlLiIiIgotICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgbGlzdCk6Ci0gICAgcmFpc2UgUGFyc2VFcnJvcigKLSAgICAgICAgJ0xpc3RWYWx1ZSBtdXN0IGJlIGluIFtdIHdoaWNoIGlzIHswfS4nLmZvcm1hdCh2YWx1ZSkpCi0gIG1lc3NhZ2UuQ2xlYXJGaWVsZCgndmFsdWVzJykKLSAgZm9yIGl0ZW0gaW4gdmFsdWU6Ci0gICAgX0NvbnZlcnRWYWx1ZU1lc3NhZ2UoaXRlbSwgbWVzc2FnZS52YWx1ZXMuYWRkKCkpCi0KLQotZGVmIF9Db252ZXJ0U3RydWN0TWVzc2FnZSh2YWx1ZSwgbWVzc2FnZSk6Ci0gICIiIkNvbnZlcnQgYSBKU09OIHJlcHJlc2VudGF0aW9uIGludG8gU3RydWN0IG1lc3NhZ2UuIiIiCi0gIGlmIG5vdCBpc2luc3RhbmNlKHZhbHVlLCBkaWN0KToKLSAgICByYWlzZSBQYXJzZUVycm9yKAotICAgICAgICAnU3RydWN0IG11c3QgYmUgaW4gYSBkaWN0IHdoaWNoIGlzIHswfS4nLmZvcm1hdCh2YWx1ZSkpCi0gIGZvciBrZXkgaW4gdmFsdWU6Ci0gICAgX0NvbnZlcnRWYWx1ZU1lc3NhZ2UodmFsdWVba2V5XSwgbWVzc2FnZS5maWVsZHNba2V5XSkKLSAgcmV0dXJuCi0KLQotZGVmIF9Db252ZXJ0V3JhcHBlck1lc3NhZ2UodmFsdWUsIG1lc3NhZ2UpOgotICAiIiJDb252ZXJ0IGEgSlNPTiByZXByZXNlbnRhdGlvbiBpbnRvIFdyYXBwZXIgbWVzc2FnZS4iIiIKLSAgZmllbGQgPSBtZXNzYWdlLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ3ZhbHVlJ10KLSAgc2V0YXR0cihtZXNzYWdlLCAndmFsdWUnLCBfQ29udmVydFNjYWxhckZpZWxkVmFsdWUodmFsdWUsIGZpZWxkKSkKLQotCi1kZWYgX0NvbnZlcnRNYXBGaWVsZFZhbHVlKHZhbHVlLCBtZXNzYWdlLCBmaWVsZCk6Ci0gICIiIkNvbnZlcnQgbWFwIGZpZWxkIHZhbHVlIGZvciBhIG1lc3NhZ2UgbWFwIGZpZWxkLgotCi0gIEFyZ3M6Ci0gICAgdmFsdWU6IEEgSlNPTiBvYmplY3QgdG8gY29udmVydCB0aGUgbWFwIGZpZWxkIHZhbHVlLgotICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGNvbnZlcnRlZCBkYXRhLgotICAgIGZpZWxkOiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgbWFwIGZpZWxkIHRvIGJlIGNvbnZlcnRlZC4KLQotICBSYWlzZXM6Ci0gICAgUGFyc2VFcnJvcjogSW4gY2FzZSBvZiBjb252ZXJ0IHByb2JsZW1zLgotICAiIiIKLSAgaWYgbm90IGlzaW5zdGFuY2UodmFsdWUsIGRpY3QpOgotICAgIHJhaXNlIFBhcnNlRXJyb3IoCi0gICAgICAgICdNYXAgZmllbGQgezB9IG11c3QgYmUgaW4gYSBkaWN0IHdoaWNoIGlzIHsxfS4nLmZvcm1hdCgKLSAgICAgICAgICAgIGZpZWxkLm5hbWUsIHZhbHVlKSkKLSAga2V5X2ZpZWxkID0gZmllbGQubWVzc2FnZV90eXBlLmZpZWxkc19ieV9uYW1lWydrZXknXQotICB2YWx1ZV9maWVsZCA9IGZpZWxkLm1lc3NhZ2VfdHlwZS5maWVsZHNfYnlfbmFtZVsndmFsdWUnXQotICBmb3Iga2V5IGluIHZhbHVlOgotICAgIGtleV92YWx1ZSA9IF9Db252ZXJ0U2NhbGFyRmllbGRWYWx1ZShrZXksIGtleV9maWVsZCwgVHJ1ZSkKLSAgICBpZiB2YWx1ZV9maWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgICBfQ29udmVydE1lc3NhZ2UodmFsdWVba2V5XSwgZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKVtrZXlfdmFsdWVdKQotICAgIGVsc2U6Ci0gICAgICBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpW2tleV92YWx1ZV0gPSBfQ29udmVydFNjYWxhckZpZWxkVmFsdWUoCi0gICAgICAgICAgdmFsdWVba2V5XSwgdmFsdWVfZmllbGQpCi0KLQotZGVmIF9Db252ZXJ0U2NhbGFyRmllbGRWYWx1ZSh2YWx1ZSwgZmllbGQsIHJlcXVpcmVfc3RyPUZhbHNlKToKLSAgIiIiQ29udmVydCBhIHNpbmdsZSBzY2FsYXIgZmllbGQgdmFsdWUuCi0KLSAgQXJnczoKLSAgICB2YWx1ZTogQSBzY2FsYXIgdmFsdWUgdG8gY29udmVydCB0aGUgc2NhbGFyIGZpZWxkIHZhbHVlLgotICAgIGZpZWxkOiBUaGUgZGVzY3JpcHRvciBvZiB0aGUgZmllbGQgdG8gY29udmVydC4KLSAgICByZXF1aXJlX3N0cjogSWYgVHJ1ZSwgdGhlIGZpZWxkIHZhbHVlIG11c3QgYmUgYSBzdHIuCi0KLSAgUmV0dXJuczoKLSAgICBUaGUgY29udmVydGVkIHNjYWxhciBmaWVsZCB2YWx1ZQotCi0gIFJhaXNlczoKLSAgICBQYXJzZUVycm9yOiBJbiBjYXNlIG9mIGNvbnZlcnQgcHJvYmxlbXMuCi0gICIiIgotICBpZiBmaWVsZC5jcHBfdHlwZSBpbiBfSU5UX1RZUEVTOgotICAgIHJldHVybiBfQ29udmVydEludGVnZXIodmFsdWUpCi0gIGVsaWYgZmllbGQuY3BwX3R5cGUgaW4gX0ZMT0FUX1RZUEVTOgotICAgIHJldHVybiBfQ29udmVydEZsb2F0KHZhbHVlKQotICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfQk9PTDoKLSAgICByZXR1cm4gX0NvbnZlcnRCb29sKHZhbHVlLCByZXF1aXJlX3N0cikKLSAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORzoKLSAgICBpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6Ci0gICAgICByZXR1cm4gYmFzZTY0LmI2NGRlY29kZSh2YWx1ZSkKLSAgICBlbHNlOgotICAgICAgcmV0dXJuIHZhbHVlCi0gIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgotICAgICMgQ29udmVydCBhbiBlbnVtIHZhbHVlLgotICAgIGVudW1fdmFsdWUgPSBmaWVsZC5lbnVtX3R5cGUudmFsdWVzX2J5X25hbWUuZ2V0KHZhbHVlLCBOb25lKQotICAgIGlmIGVudW1fdmFsdWUgaXMgTm9uZToKLSAgICAgIHJhaXNlIFBhcnNlRXJyb3IoCi0gICAgICAgICAgJ0VudW0gdmFsdWUgbXVzdCBiZSBhIHN0cmluZyBsaXRlcmFsIHdpdGggZG91YmxlIHF1b3Rlcy4gJwotICAgICAgICAgICdUeXBlICJ7MH0iIGhhcyBubyB2YWx1ZSBuYW1lZCB7MX0uJy5mb3JtYXQoCi0gICAgICAgICAgICAgIGZpZWxkLmVudW1fdHlwZS5mdWxsX25hbWUsIHZhbHVlKSkKLSAgICByZXR1cm4gZW51bV92YWx1ZS5udW1iZXIKLQotCi1kZWYgX0NvbnZlcnRJbnRlZ2VyKHZhbHVlKToKLSAgIiIiQ29udmVydCBhbiBpbnRlZ2VyLgotCi0gIEFyZ3M6Ci0gICAgdmFsdWU6IEEgc2NhbGFyIHZhbHVlIHRvIGNvbnZlcnQuCi0KLSAgUmV0dXJuczoKLSAgICBUaGUgaW50ZWdlciB2YWx1ZS4KLQotICBSYWlzZXM6Ci0gICAgUGFyc2VFcnJvcjogSWYgYW4gaW50ZWdlciBjb3VsZG4ndCBiZSBjb25zdW1lZC4KLSAgIiIiCi0gIGlmIGlzaW5zdGFuY2UodmFsdWUsIGZsb2F0KToKLSAgICByYWlzZSBQYXJzZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogezB9LicuZm9ybWF0KHZhbHVlKSkKLQotICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzaXgudGV4dF90eXBlKSBhbmQgdmFsdWUuZmluZCgnICcpICE9IC0xOgotICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAiezB9Ii4nLmZvcm1hdCh2YWx1ZSkpCi0KLSAgcmV0dXJuIGludCh2YWx1ZSkKLQotCi1kZWYgX0NvbnZlcnRGbG9hdCh2YWx1ZSk6Ci0gICIiIkNvbnZlcnQgYW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLiIiIgotICBpZiB2YWx1ZSA9PSAnbmFuJzoKLSAgICByYWlzZSBQYXJzZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgZmxvYXQgIm5hbiIsIHVzZSAiTmFOIiBpbnN0ZWFkLicpCi0gIHRyeToKLSAgICAjIEFzc3VtZSBQeXRob24gY29tcGF0aWJsZSBzeW50YXguCi0gICAgcmV0dXJuIGZsb2F0KHZhbHVlKQotICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAjIENoZWNrIGFsdGVybmF0aXZlIHNwZWxsaW5ncy4KLSAgICBpZiB2YWx1ZSA9PSBfTkVHX0lORklOSVRZOgotICAgICAgcmV0dXJuIGZsb2F0KCctaW5mJykKLSAgICBlbGlmIHZhbHVlID09IF9JTkZJTklUWToKLSAgICAgIHJldHVybiBmbG9hdCgnaW5mJykKLSAgICBlbGlmIHZhbHVlID09IF9OQU46Ci0gICAgICByZXR1cm4gZmxvYXQoJ25hbicpCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBmbG9hdDogezB9LicuZm9ybWF0KHZhbHVlKSkKLQotCi1kZWYgX0NvbnZlcnRCb29sKHZhbHVlLCByZXF1aXJlX3N0cik6Ci0gICIiIkNvbnZlcnQgYSBib29sZWFuIHZhbHVlLgotCi0gIEFyZ3M6Ci0gICAgdmFsdWU6IEEgc2NhbGFyIHZhbHVlIHRvIGNvbnZlcnQuCi0gICAgcmVxdWlyZV9zdHI6IElmIFRydWUsIHZhbHVlIG11c3QgYmUgYSBzdHIuCi0KLSAgUmV0dXJuczoKLSAgICBUaGUgYm9vbCBwYXJzZWQuCi0KLSAgUmFpc2VzOgotICAgIFBhcnNlRXJyb3I6IElmIGEgYm9vbGVhbiB2YWx1ZSBjb3VsZG4ndCBiZSBjb25zdW1lZC4KLSAgIiIiCi0gIGlmIHJlcXVpcmVfc3RyOgotICAgIGlmIHZhbHVlID09ICd0cnVlJzoKLSAgICAgIHJldHVybiBUcnVlCi0gICAgZWxpZiB2YWx1ZSA9PSAnZmFsc2UnOgotICAgICAgcmV0dXJuIEZhbHNlCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0V4cGVjdGVkICJ0cnVlIiBvciAiZmFsc2UiLCBub3QgezB9LicuZm9ybWF0KHZhbHVlKSkKLQotICBpZiBub3QgaXNpbnN0YW5jZSh2YWx1ZSwgYm9vbCk6Ci0gICAgcmFpc2UgUGFyc2VFcnJvcignRXhwZWN0ZWQgdHJ1ZSBvciBmYWxzZSB3aXRob3V0IHF1b3Rlcy4nKQotICByZXR1cm4gdmFsdWUKLQotX1dLVEpTT05NRVRIT0RTID0gewotICAgICdnb29nbGUucHJvdG9idWYuQW55JzogW19BbnlNZXNzYWdlVG9Kc29uT2JqZWN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9Db252ZXJ0QW55TWVzc2FnZV0sCi0gICAgJ2dvb2dsZS5wcm90b2J1Zi5EdXJhdGlvbic6IFtfR2VuZXJpY01lc3NhZ2VUb0pzb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29udmVydEdlbmVyaWNNZXNzYWdlXSwKLSAgICAnZ29vZ2xlLnByb3RvYnVmLkZpZWxkTWFzayc6IFtfR2VuZXJpY01lc3NhZ2VUb0pzb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnZlcnRHZW5lcmljTWVzc2FnZV0sCi0gICAgJ2dvb2dsZS5wcm90b2J1Zi5MaXN0VmFsdWUnOiBbX0xpc3RWYWx1ZU1lc3NhZ2VUb0pzb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX0NvbnZlcnRMaXN0VmFsdWVNZXNzYWdlXSwKLSAgICAnZ29vZ2xlLnByb3RvYnVmLlN0cnVjdCc6IFtfU3RydWN0TWVzc2FnZVRvSnNvbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29udmVydFN0cnVjdE1lc3NhZ2VdLAotICAgICdnb29nbGUucHJvdG9idWYuVGltZXN0YW1wJzogW19HZW5lcmljTWVzc2FnZVRvSnNvbk9iamVjdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29udmVydEdlbmVyaWNNZXNzYWdlXSwKLSAgICAnZ29vZ2xlLnByb3RvYnVmLlZhbHVlJzogW19WYWx1ZU1lc3NhZ2VUb0pzb25PYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfQ29udmVydFZhbHVlTWVzc2FnZV0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjA2ZjczNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyOTUgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jIFRPRE8ocm9iaW5zb24pOiBXZSBzaG91bGQganVzdCBtYWtlIHRoZXNlIG1ldGhvZHMgYWxsICJwdXJlLXZpcnR1YWwiIGFuZCBtb3ZlCi0jIGFsbCBpbXBsZW1lbnRhdGlvbiBvdXQsIGludG8gcmVmbGVjdGlvbi5weSBmb3Igbm93LgotCi0KLSIiIkNvbnRhaW5zIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2VzLiIiIgotCi1fX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJwotCi1jbGFzcyBFcnJvcihFeGNlcHRpb24pOiBwYXNzCi1jbGFzcyBEZWNvZGVFcnJvcihFcnJvcik6IHBhc3MKLWNsYXNzIEVuY29kZUVycm9yKEVycm9yKTogcGFzcwotCi0KLWNsYXNzIE1lc3NhZ2Uob2JqZWN0KToKLQotICAiIiJBYnN0cmFjdCBiYXNlIGNsYXNzIGZvciBwcm90b2NvbCBtZXNzYWdlcy4KLQotICBQcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgYXJlIGFsbW9zdCBhbHdheXMgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbAotICBjb21waWxlci4gIFRoZXNlIGdlbmVyYXRlZCB0eXBlcyBzdWJjbGFzcyBNZXNzYWdlIGFuZCBpbXBsZW1lbnQgdGhlIG1ldGhvZHMKLSAgc2hvd24gYmVsb3cuCi0KLSAgVE9ETyhyb2JpbnNvbik6IExpbmsgdG8gYW4gSFRNTCBkb2N1bWVudCBoZXJlLgotCi0gIFRPRE8ocm9iaW5zb24pOiBEb2N1bWVudCB0aGF0IGluc3RhbmNlcyBvZiB0aGlzIGNsYXNzIHdpbGwgYWxzbwotICBoYXZlIGFuIEV4dGVuc2lvbnMgYXR0cmlidXRlIHdpdGggX19nZXRpdGVtX18gYW5kIF9fc2V0aXRlbV9fLgotICBBZ2Fpbiwgbm90IHN1cmUgaG93IHRvIGJlc3QgY29udmV5IHRoaXMuCi0KLSAgVE9ETyhyb2JpbnNvbik6IERvY3VtZW50IHRoYXQgdGhlIGNsYXNzIG11c3QgYWxzbyBoYXZlIGEgc3RhdGljCi0gICAgUmVnaXN0ZXJFeHRlbnNpb24oZXh0ZW5zaW9uX2ZpZWxkKSBtZXRob2QuCi0gICAgTm90IHN1cmUgaG93IHRvIGJlc3QgZXhwcmVzcyBhdCB0aGlzIHBvaW50LgotICAiIiIKLQotICAjIFRPRE8ocm9iaW5zb24pOiBEb2N1bWVudCB0aGVzZSBmaWVsZHMgYW5kIG1ldGhvZHMuCi0KLSAgX19zbG90c19fID0gW10KLQotICBERVNDUklQVE9SID0gTm9uZQotCi0gIGRlZiBfX2RlZXBjb3B5X18oc2VsZiwgbWVtbz1Ob25lKToKLSAgICBjbG9uZSA9IHR5cGUoc2VsZikoKQotICAgIGNsb25lLk1lcmdlRnJvbShzZWxmKQotICAgIHJldHVybiBjbG9uZQotCi0gIGRlZiBfX2VxX18oc2VsZiwgb3RoZXJfbXNnKToKLSAgICAiIiJSZWN1cnNpdmVseSBjb21wYXJlcyB0d28gbWVzc2FnZXMgYnkgdmFsdWUgYW5kIHN0cnVjdHVyZS4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcl9tc2cpOgotICAgICMgQ2FuJ3QganVzdCBzYXkgc2VsZiAhPSBvdGhlcl9tc2csIHNpbmNlIHRoYXQgd291bGQgaW5maW5pdGVseSByZWN1cnNlLiA6KQotICAgIHJldHVybiBub3Qgc2VsZiA9PSBvdGhlcl9tc2cKLQotICBkZWYgX19oYXNoX18oc2VsZik6Ci0gICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCi0KLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgIiIiT3V0cHV0cyBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgX191bmljb2RlX18oc2VsZik6Ci0gICAgIiIiT3V0cHV0cyBhIGh1bWFuLXJlYWRhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyX21zZyk6Ci0gICAgIiIiTWVyZ2VzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaW50byBjdXJyZW50IG1lc3NhZ2UuCi0KLSAgICBUaGlzIG1ldGhvZCBtZXJnZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpbnRvIHRoZSBjdXJyZW50Ci0gICAgbWVzc2FnZS4gU2luZ3VsYXIgZmllbGRzIHRoYXQgYXJlIHNldCBpbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugb3ZlcndyaXRlCi0gICAgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFJlcGVhdGVkIGZpZWxkcyBhcmUKLSAgICBhcHBlbmRlZC4gU2luZ3VsYXIgc3ViLW1lc3NhZ2VzIGFuZCBncm91cHMgYXJlIHJlY3Vyc2l2ZWx5IG1lcmdlZC4KLQotICAgIEFyZ3M6Ci0gICAgICBvdGhlcl9tc2c6IE1lc3NhZ2UgdG8gbWVyZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgQ29weUZyb20oc2VsZiwgb3RoZXJfbXNnKToKLSAgICAiIiJDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4KLQotICAgIFRoZSBtZXRob2QgY2xlYXJzIHRoZSBjdXJyZW50IG1lc3NhZ2UgYW5kIHRoZW4gbWVyZ2VzIHRoZSBzcGVjaWZpZWQKLSAgICBtZXNzYWdlIHVzaW5nIE1lcmdlRnJvbS4KLQotICAgIEFyZ3M6Ci0gICAgICBvdGhlcl9tc2c6IE1lc3NhZ2UgdG8gY29weSBpbnRvIHRoZSBjdXJyZW50IG9uZS4KLSAgICAiIiIKLSAgICBpZiBzZWxmIGlzIG90aGVyX21zZzoKLSAgICAgIHJldHVybgotICAgIHNlbGYuQ2xlYXIoKQotICAgIHNlbGYuTWVyZ2VGcm9tKG90aGVyX21zZykKLQotICBkZWYgQ2xlYXIoc2VsZik6Ci0gICAgIiIiQ2xlYXJzIGFsbCBkYXRhIHRoYXQgd2FzIHNldCBpbiB0aGUgbWVzc2FnZS4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIFNldEluUGFyZW50KHNlbGYpOgotICAgICIiIk1hcmsgdGhpcyBhcyBwcmVzZW50IGluIHRoZSBwYXJlbnQuCi0KLSAgICBUaGlzIG5vcm1hbGx5IGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIHlvdSBhc3NpZ24gYSBmaWVsZCBvZiBhCi0gICAgc3ViLW1lc3NhZ2UsIGJ1dCBzb21ldGltZXMgeW91IHdhbnQgdG8gbWFrZSB0aGUgc3ViLW1lc3NhZ2UKLSAgICBwcmVzZW50IHdoaWxlIGtlZXBpbmcgaXQgZW1wdHkuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiB1c2luZyB0aGlzLAotICAgIHlvdSBtYXkgd2FudCB0byByZWNvbnNpZGVyIHlvdXIgZGVzaWduLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgSXNJbml0aWFsaXplZChzZWxmKToKLSAgICAiIiJDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIG1ldGhvZCByZXR1cm5zIFRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQgKGkuZS4gYWxsIG9mIGl0cwotICAgICAgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICAjIFRPRE8ocm9iaW5zb24pOiBNZXJnZUZyb21TdHJpbmcoKSBzaG91bGQgcHJvYmFibHkgcmV0dXJuIE5vbmUgYW5kIGJlCi0gICMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYSBoZWxwZXIgdGhhdCByZXR1cm5zIHRoZSAjIG9mIGJ5dGVzIHJlYWQuICBPdXIKLSAgIyBkZXNlcmlhbGl6YXRpb24gcm91dGluZXMgd291bGQgdXNlIHRoZSBoZWxwZXIgd2hlbiByZWN1cnNpdmVseQotICAjIGRlc2VyaWFsaXppbmcsIGJ1dCB0aGUgZW5kIHVzZXIgd291bGQgYWxtb3N0IGFsd2F5cyBqdXN0IHdhbnQgdGhlIG5vLXJldHVybgotICAjIE1lcmdlRnJvbVN0cmluZygpLgotCi0gIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6Ci0gICAgIiIiTWVyZ2VzIHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIGRhdGEgaW50byB0aGlzIG1lc3NhZ2UuCi0KLSAgICBXaGVuIHdlIGZpbmQgYSBmaWVsZCBpbiB8c2VyaWFsaXplZHwgdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQKLSAgICBpbiB0aGlzIG1lc3NhZ2U6Ci0gICAgICAtIElmIGl0J3MgYSAicmVwZWF0ZWQiIGZpZWxkLCB3ZSBhcHBlbmQgdG8gdGhlIGVuZCBvZiBvdXIgbGlzdC4KLSAgICAgIC0gRWxzZSwgaWYgaXQncyBhIHNjYWxhciwgd2Ugb3ZlcndyaXRlIG91ciBmaWVsZC4KLSAgICAgIC0gRWxzZSwgKGl0J3MgYSBub25yZXBlYXRlZCBjb21wb3NpdGUpLCB3ZSByZWN1cnNpdmVseSBtZXJnZQotICAgICAgICBpbnRvIHRoZSBleGlzdGluZyBjb21wb3NpdGUuCi0KLSAgICBUT0RPKHJvYmluc29uKTogRG9jdW1lbnQgaGFuZGxpbmcgb2YgdW5rbm93biBmaWVsZHMuCi0KLSAgICBBcmdzOgotICAgICAgc2VyaWFsaXplZDogQW55IG9iamVjdCB0aGF0IGFsbG93cyB1cyB0byBjYWxsIGJ1ZmZlcihzZXJpYWxpemVkKQotICAgICAgICB0byBhY2Nlc3MgYSBzdHJpbmcgb2YgYnl0ZXMgdXNpbmcgdGhlIGJ1ZmZlciBpbnRlcmZhY2UuCi0KLSAgICBUT0RPKHJvYmluc29uKTogV2hlbiB3ZSBzd2l0Y2ggdG8gYSBoZWxwZXIsIHRoaXMgd2lsbCByZXR1cm4gTm9uZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB8c2VyaWFsaXplZHwuCi0gICAgICBGb3Igbm9uLWdyb3VwIG1lc3NhZ2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGxlbihzZXJpYWxpemVkKSwKLSAgICAgIGJ1dCBmb3IgbWVzc2FnZXMgd2hpY2ggYXJlIGFjdHVhbGx5IGdyb3VwcywgdGhpcyB3aWxsCi0gICAgICBnZW5lcmFsbHkgYmUgbGVzcyB0aGFuIGxlbihzZXJpYWxpemVkKSwgc2luY2Ugd2UgbXVzdAotICAgICAgc3RvcCB3aGVuIHdlIHJlYWNoIGFuIEVORF9HUk9VUCB0YWcuICBOb3RlIHRoYXQgaWYKLSAgICAgIHdlICpkbyogc3RvcCBiZWNhdXNlIG9mIGFuIEVORF9HUk9VUCB0YWcsIHRoZSBudW1iZXIKLSAgICAgIG9mIGJ5dGVzIHJldHVybmVkIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJ5dGVzCi0gICAgICBmb3IgdGhlIEVORF9HUk9VUCB0YWcgaW5mb3JtYXRpb24uCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBQYXJzZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6Ci0gICAgIiIiUGFyc2Ugc2VyaWFsaXplZCBwcm90b2NvbCBidWZmZXIgZGF0YSBpbnRvIHRoaXMgbWVzc2FnZS4KLQotICAgIExpa2UgTWVyZ2VGcm9tU3RyaW5nKCksIGV4Y2VwdCB3ZSBjbGVhciB0aGUgb2JqZWN0IGZpcnN0IGFuZAotICAgIGRvIG5vdCByZXR1cm4gdGhlIHZhbHVlIHRoYXQgTWVyZ2VGcm9tU3RyaW5nIHJldHVybnMuCi0gICAgIiIiCi0gICAgc2VsZi5DbGVhcigpCi0gICAgc2VsZi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICBkZWYgU2VyaWFsaXplVG9TdHJpbmcoc2VsZik6Ci0gICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGlmIGFsbCBvZiB0aGUgcmVxdWlyZWQKLSAgICAgIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhcmUgc2V0IChpLmUuIHRoZSBtZXNzYWdlIGlzIGluaXRpYWxpemVkKS4KLQotICAgIFJhaXNlczoKLSAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IgaWYgdGhlIG1lc3NhZ2UgaXNuJ3QgaW5pdGlhbGl6ZWQuCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc2VsZik6Ci0gICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCi0KLSAgICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIFNlcmlhbGl6ZVRvU3RyaW5nIGJ1dCBkb2Vzbid0IGNoZWNrIGlmIHRoZQotICAgIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcnRpYWwgbWVzc2FnZS4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgIyBUT0RPKHJvYmluc29uKTogRGVjaWRlIHdoZXRoZXIgd2UgbGlrZSB0aGVzZSBiZXR0ZXIKLSAgIyB0aGFuIGF1dG8tZ2VuZXJhdGVkIGhhc19mb28oKSBhbmQgY2xlYXJfZm9vKCkgbWV0aG9kcwotICAjIG9uIHRoZSBpbnN0YW5jZXMgdGhlbXNlbHZlcy4gIFRoaXMgd2F5IGlzIGxlc3MgY29uc2lzdGVudAotICAjIHdpdGggQysrLCBidXQgaXQgbWFrZXMgcmVmbGVjdGlvbi10eXBlIGFjY2VzcyBlYXNpZXIgYW5kCi0gICMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIG1hZ2ljYWxseSBhdXRvZ2VuZXJhdGVkIHRoaW5ncy4KLSAgIwotICAjIFRPRE8ocm9iaW5zb24pOiBCZSBzdXJlIHRvIGRvY3VtZW50IChhbmQgdGVzdCkgZXhhY3RseQotICAjIHdoaWNoIGZpZWxkIG5hbWVzIGFyZSBhY2NlcHRlZCBoZXJlLiAgQXJlIHdlIGNhc2Utc2Vuc2l0aXZlPwotICAjIFdoYXQgZG8gd2UgZG8gd2l0aCBmaWVsZHMgdGhhdCBzaGFyZSBuYW1lcyB3aXRoIFB5dGhvbiBrZXl3b3JkcwotICAjIGxpa2UgJ2xhbWJkYScgYW5kICd5aWVsZCc/Ci0gICMKLSAgIyBubm9yd2l0eiBzYXlzOgotICAjICIiIgotICAjIFR5cGljYWxseSAoaW4gcHl0aG9uKSwgYW4gdW5kZXJzY29yZSBpcyBhcHBlbmRlZCB0byBuYW1lcyB0aGF0IGFyZQotICAjIGtleXdvcmRzLiBTbyB0aGV5IHdvdWxkIGJlY29tZSBsYW1iZGFfIG9yIHlpZWxkXy4KLSAgIyAiIiIKLSAgZGVmIExpc3RGaWVsZHMoc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgKEZpZWxkRGVzY3JpcHRvciwgdmFsdWUpIHR1cGxlcyBmb3IgYWxsCi0gICAgZmllbGRzIGluIHRoZSBtZXNzYWdlIHdoaWNoIGFyZSBub3QgZW1wdHkuICBBIHNpbmd1bGFyIGZpZWxkIGlzIG5vbi1lbXB0eQotICAgIGlmIEhhc0ZpZWxkKCkgd291bGQgcmV0dXJuIHRydWUsIGFuZCBhIHJlcGVhdGVkIGZpZWxkIGlzIG5vbi1lbXB0eSBpZgotICAgIGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50LiAgVGhlIGZpZWxkcyBhcmUgb3JkZXJlZCBieSBmaWVsZAotICAgIG51bWJlciIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgSGFzRmllbGQoc2VsZiwgZmllbGRfbmFtZSk6Ci0gICAgIiIiQ2hlY2tzIGlmIGEgY2VydGFpbiBmaWVsZCBpcyBzZXQgZm9yIHRoZSBtZXNzYWdlLCBvciBpZiBhbnkgZmllbGQgaW5zaWRlCi0gICAgYSBvbmVvZiBncm91cCBpcyBzZXQuICBOb3RlIHRoYXQgaWYgdGhlIGZpZWxkX25hbWUgaXMgbm90IGRlZmluZWQgaW4gdGhlCi0gICAgbWVzc2FnZSBkZXNjcmlwdG9yLCBWYWx1ZUVycm9yIHdpbGwgYmUgcmFpc2VkLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgQ2xlYXJGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKLSAgICAiIiJDbGVhcnMgdGhlIGNvbnRlbnRzIG9mIGEgZ2l2ZW4gZmllbGQsIG9yIHRoZSBmaWVsZCBzZXQgaW5zaWRlIGEgb25lb2YKLSAgICBncm91cC4gIElmIHRoZSBuYW1lIG5laXRoZXIgcmVmZXJzIHRvIGEgZGVmaW5lZCBmaWVsZCBvciBvbmVvZiBncm91cCwKLSAgICBWYWx1ZUVycm9yIGlzIHJhaXNlZC4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIFdoaWNoT25lb2Yoc2VsZiwgb25lb2ZfZ3JvdXApOgotICAgICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRoYXQgaXMgc2V0IGluc2lkZSBhIG9uZW9mIGdyb3VwLCBvcgotICAgIE5vbmUgaWYgbm8gZmllbGQgaXMgc2V0LiAgSWYgbm8gZ3JvdXAgd2l0aCB0aGUgZ2l2ZW4gbmFtZSBleGlzdHMsIFZhbHVlRXJyb3IKLSAgICB3aWxsIGJlIHJhaXNlZC4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIEhhc0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgRGlzY2FyZFVua25vd25GaWVsZHMoc2VsZik6Ci0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBCeXRlU2l6ZShzZWxmKToKLSAgICAiIiJSZXR1cm5zIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgdGhpcyBtZXNzYWdlLgotICAgIFJlY3Vyc2l2ZWx5IGNhbGxzIEJ5dGVTaXplKCkgb24gYWxsIGNvbnRhaW5lZCBtZXNzYWdlcy4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIF9TZXRMaXN0ZW5lcihzZWxmLCBtZXNzYWdlX2xpc3RlbmVyKToKLSAgICAiIiJJbnRlcm5hbCBtZXRob2QgdXNlZCBieSB0aGUgcHJvdG9jb2wgbWVzc2FnZSBpbXBsZW1lbnRhdGlvbi4KLSAgICBDbGllbnRzIHNob3VsZCBub3QgY2FsbCB0aGlzIGRpcmVjdGx5LgotCi0gICAgU2V0cyBhIGxpc3RlbmVyIHRoYXQgdGhpcyBtZXNzYWdlIHdpbGwgY2FsbCBvbiBjZXJ0YWluIHN0YXRlIHRyYW5zaXRpb25zLgotCi0gICAgVGhlIHB1cnBvc2Ugb2YgdGhpcyBtZXRob2QgaXMgdG8gcmVnaXN0ZXIgYmFjay1lZGdlcyBmcm9tIGNoaWxkcmVuIHRvCi0gICAgcGFyZW50cyBhdCBydW50aW1lLCBmb3IgdGhlIHB1cnBvc2Ugb2Ygc2V0dGluZyAiaGFzIiBiaXRzIGFuZAotICAgIGJ5dGUtc2l6ZS1kaXJ0eSBiaXRzIGluIHRoZSBwYXJlbnQgYW5kIGFuY2VzdG9yIG9iamVjdHMgd2hlbmV2ZXIgYSBjaGlsZCBvcgotICAgIGRlc2NlbmRhbnQgb2JqZWN0IGlzIG1vZGlmaWVkLgotCi0gICAgSWYgdGhlIGNsaWVudCB3YW50cyB0byBkaXNjb25uZWN0IHRoaXMgTWVzc2FnZSBmcm9tIHRoZSBvYmplY3QgdHJlZSwgc2hlCi0gICAgZXhwbGljaXRseSBzZXRzIGNhbGxiYWNrIHRvIE5vbmUuCi0KLSAgICBJZiBtZXNzYWdlX2xpc3RlbmVyIGlzIE5vbmUsIHVucmVnaXN0ZXJzIGFueSBleGlzdGluZyBsaXN0ZW5lci4gIE90aGVyd2lzZSwKLSAgICBtZXNzYWdlX2xpc3RlbmVyIG11c3QgaW1wbGVtZW50IHRoZSBNZXNzYWdlTGlzdGVuZXIgaW50ZXJmYWNlIGluCi0gICAgaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weSwgYW5kIHdlIGRpc2NhcmQgYW55IGxpc3RlbmVyIHJlZ2lzdGVyZWQKLSAgICB2aWEgYSBwcmV2aW91cyBfU2V0TGlzdGVuZXIoKSBjYWxsLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgX19nZXRzdGF0ZV9fKHNlbGYpOgotICAgICIiIlN1cHBvcnQgdGhlIHBpY2tsZSBwcm90b2NvbC4iIiIKLSAgICByZXR1cm4gZGljdChzZXJpYWxpemVkPXNlbGYuU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkpCi0KLSAgZGVmIF9fc2V0c3RhdGVfXyhzZWxmLCBzdGF0ZSk6Ci0gICAgIiIiU3VwcG9ydCB0aGUgcGlja2xlIHByb3RvY29sLiIiIgotICAgIHNlbGYuX19pbml0X18oKQotICAgIHNlbGYuUGFyc2VGcm9tU3RyaW5nKHN0YXRlWydzZXJpYWxpemVkJ10pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfZmFjdG9yeS5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9mYWN0b3J5LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjA1OWQxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9mYWN0b3J5LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTQ3ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiUHJvdmlkZXMgYSBmYWN0b3J5IGNsYXNzIGZvciBnZW5lcmF0aW5nIGR5bmFtaWMgbWVzc2FnZXMuCi0KLVRoZSBlYXNpZXN0IHdheSB0byB1c2UgdGhpcyBjbGFzcyBpcyBpZiB5b3UgaGF2ZSBhY2Nlc3MgdG8gdGhlIEZpbGVEZXNjcmlwdG9yCi1wcm90b3MgY29udGFpbmluZyB0aGUgbWVzc2FnZXMgeW91IHdhbnQgdG8gY3JlYXRlIHlvdSBjYW4ganVzdCBkbyB0aGUgZm9sbG93aW5nOgotCi1tZXNzYWdlX2NsYXNzZXMgPSBtZXNzYWdlX2ZhY3RvcnkuR2V0TWVzc2FnZXMoaXRlcmFibGVfb2ZfZmlsZV9kZXNjcmlwdG9ycykKLW15X3Byb3RvX2luc3RhbmNlID0gbWVzc2FnZV9jbGFzc2VzWydzb21lLnByb3RvLnBhY2thZ2UuTWVzc2FnZU5hbWUnXSgpCi0iIiIKLQotX19hdXRob3JfXyA9ICdtYXR0aGV3dG9pYUBnb29nbGUuY29tIChNYXR0IFRvaWEpJwotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wb29sCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24KLQotCi1jbGFzcyBNZXNzYWdlRmFjdG9yeShvYmplY3QpOgotICAiIiJGYWN0b3J5IGZvciBjcmVhdGluZyBQcm90bzIgbWVzc2FnZXMgZnJvbSBkZXNjcmlwdG9ycyBpbiBhIHBvb2wuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBvb2w9Tm9uZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZXMgYSBuZXcgZmFjdG9yeS4iIiIKLSAgICBzZWxmLnBvb2wgPSBwb29sIG9yIGRlc2NyaXB0b3JfcG9vbC5EZXNjcmlwdG9yUG9vbCgpCi0KLSAgICAjIGxvY2FsIGNhY2hlIG9mIGFsbCBjbGFzc2VzIGJ1aWx0IGZyb20gcHJvdG9idWYgZGVzY3JpcHRvcnMKLSAgICBzZWxmLl9jbGFzc2VzID0ge30KLQotICBkZWYgR2V0UHJvdG90eXBlKHNlbGYsIGRlc2NyaXB0b3IpOgotICAgICIiIkJ1aWxkcyBhIHByb3RvMiBtZXNzYWdlIGNsYXNzIGJhc2VkIG9uIHRoZSBwYXNzZWQgaW4gZGVzY3JpcHRvci4KLQotICAgIFBhc3NpbmcgYSBkZXNjcmlwdG9yIHdpdGggYSBmdWxseSBxdWFsaWZpZWQgbmFtZSBtYXRjaGluZyBhIHByZXZpb3VzCi0gICAgaW52b2NhdGlvbiB3aWxsIGNhdXNlIHRoZSBzYW1lIGNsYXNzIHRvIGJlIHJldHVybmVkLgotCi0gICAgQXJnczoKLSAgICAgIGRlc2NyaXB0b3I6IFRoZSBkZXNjcmlwdG9yIHRvIGJ1aWxkIGZyb20uCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBjbGFzcyBkZXNjcmliaW5nIHRoZSBwYXNzZWQgaW4gZGVzY3JpcHRvci4KLSAgICAiIiIKLSAgICBpZiBkZXNjcmlwdG9yLmZ1bGxfbmFtZSBub3QgaW4gc2VsZi5fY2xhc3NlczoKLSAgICAgIGRlc2NyaXB0b3JfbmFtZSA9IGRlc2NyaXB0b3IubmFtZQotICAgICAgaWYgc3RyIGlzIGJ5dGVzOiAgIyBQWTIKLSAgICAgICAgZGVzY3JpcHRvcl9uYW1lID0gZGVzY3JpcHRvci5uYW1lLmVuY29kZSgnYXNjaWknLCAnaWdub3JlJykKLSAgICAgIHJlc3VsdF9jbGFzcyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZSgKLSAgICAgICAgICBkZXNjcmlwdG9yX25hbWUsCi0gICAgICAgICAgKG1lc3NhZ2UuTWVzc2FnZSwpLAotICAgICAgICAgIHsnREVTQ1JJUFRPUic6IGRlc2NyaXB0b3IsICdfX21vZHVsZV9fJzogTm9uZX0pCi0gICAgICAgICAgIyBJZiBtb2R1bGUgbm90IHNldCwgaXQgd3JvbmdseSBwb2ludHMgdG8gdGhlIHJlZmxlY3Rpb24ucHkgbW9kdWxlLgotICAgICAgc2VsZi5fY2xhc3Nlc1tkZXNjcmlwdG9yLmZ1bGxfbmFtZV0gPSByZXN1bHRfY2xhc3MKLSAgICAgIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKLSAgICAgICAgaWYgZmllbGQubWVzc2FnZV90eXBlOgotICAgICAgICAgIHNlbGYuR2V0UHJvdG90eXBlKGZpZWxkLm1lc3NhZ2VfdHlwZSkKLSAgICAgIGZvciBleHRlbnNpb24gaW4gcmVzdWx0X2NsYXNzLkRFU0NSSVBUT1IuZXh0ZW5zaW9uczoKLSAgICAgICAgaWYgZXh0ZW5zaW9uLmNvbnRhaW5pbmdfdHlwZS5mdWxsX25hbWUgbm90IGluIHNlbGYuX2NsYXNzZXM6Ci0gICAgICAgICAgc2VsZi5HZXRQcm90b3R5cGUoZXh0ZW5zaW9uLmNvbnRhaW5pbmdfdHlwZSkKLSAgICAgICAgZXh0ZW5kZWRfY2xhc3MgPSBzZWxmLl9jbGFzc2VzW2V4dGVuc2lvbi5jb250YWluaW5nX3R5cGUuZnVsbF9uYW1lXQotICAgICAgICBleHRlbmRlZF9jbGFzcy5SZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgcmV0dXJuIHNlbGYuX2NsYXNzZXNbZGVzY3JpcHRvci5mdWxsX25hbWVdCi0KLSAgZGVmIEdldE1lc3NhZ2VzKHNlbGYsIGZpbGVzKToKLSAgICAiIiJHZXRzIGFsbCB0aGUgbWVzc2FnZXMgZnJvbSBhIHNwZWNpZmllZCBmaWxlLgotCi0gICAgVGhpcyB3aWxsIGZpbmQgYW5kIHJlc29sdmUgZGVwZW5kZW5jaWVzLCBmYWlsaW5nIGlmIHRoZSBkZXNjcmlwdG9yCi0gICAgcG9vbCBjYW5ub3Qgc2F0aXNmeSB0aGVtLgotCi0gICAgQXJnczoKLSAgICAgIGZpbGVzOiBUaGUgZmlsZSBuYW1lcyB0byBleHRyYWN0IG1lc3NhZ2VzIGZyb20uCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBkaWN0aW9uYXJ5IG1hcHBpbmcgcHJvdG8gbmFtZXMgdG8gdGhlIG1lc3NhZ2UgY2xhc3Nlcy4gVGhpcyB3aWxsIGluY2x1ZGUKLSAgICAgIGFueSBkZXBlbmRlbnQgbWVzc2FnZXMgYXMgd2VsbCBhcyBhbnkgbWVzc2FnZXMgZGVmaW5lZCBpbiB0aGUgc2FtZSBmaWxlIGFzCi0gICAgICBhIHNwZWNpZmllZCBtZXNzYWdlLgotICAgICIiIgotICAgIHJlc3VsdCA9IHt9Ci0gICAgZm9yIGZpbGVfbmFtZSBpbiBmaWxlczoKLSAgICAgIGZpbGVfZGVzYyA9IHNlbGYucG9vbC5GaW5kRmlsZUJ5TmFtZShmaWxlX25hbWUpCi0gICAgICBmb3IgbmFtZSwgbXNnIGluIGZpbGVfZGVzYy5tZXNzYWdlX3R5cGVzX2J5X25hbWUuaXRlbXMoKToKLSAgICAgICAgaWYgZmlsZV9kZXNjLnBhY2thZ2U6Ci0gICAgICAgICAgZnVsbF9uYW1lID0gJy4nLmpvaW4oW2ZpbGVfZGVzYy5wYWNrYWdlLCBuYW1lXSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBmdWxsX25hbWUgPSBtc2cubmFtZQotICAgICAgICByZXN1bHRbZnVsbF9uYW1lXSA9IHNlbGYuR2V0UHJvdG90eXBlKAotICAgICAgICAgICAgc2VsZi5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShmdWxsX25hbWUpKQotCi0gICAgICAjIFdoaWxlIHRoZSBleHRlbnNpb24gRmllbGREZXNjcmlwdG9ycyBhcmUgY3JlYXRlZCBieSB0aGUgZGVzY3JpcHRvciBwb29sLAotICAgICAgIyB0aGUgcHl0aG9uIGNsYXNzZXMgY3JlYXRlZCBpbiB0aGUgZmFjdG9yeSBuZWVkIHRoZW0gdG8gYmUgcmVnaXN0ZXJlZAotICAgICAgIyBleHBsaWNpdGx5LCB3aGljaCBpcyBkb25lIGJlbG93LgotICAgICAgIwotICAgICAgIyBUaGUgY2FsbCB0byBSZWdpc3RlckV4dGVuc2lvbiB3aWxsIHNwZWNpZmljYWxseSBjaGVjayBpZiB0aGUKLSAgICAgICMgZXh0ZW5zaW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgb24gdGhlIG9iamVjdCBhbmQgZWl0aGVyCi0gICAgICAjIGlnbm9yZSB0aGUgcmVnaXN0cmF0aW9uIGlmIHRoZSBvcmlnaW5hbCB3YXMgdGhlIHNhbWUsIG9yIHJhaXNlCi0gICAgICAjIGFuIGVycm9yIGlmIHRoZXkgd2VyZSBkaWZmZXJlbnQuCi0KLSAgICAgIGZvciBuYW1lLCBleHRlbnNpb24gaW4gZmlsZV9kZXNjLmV4dGVuc2lvbnNfYnlfbmFtZS5pdGVtcygpOgotICAgICAgICBpZiBleHRlbnNpb24uY29udGFpbmluZ190eXBlLmZ1bGxfbmFtZSBub3QgaW4gc2VsZi5fY2xhc3NlczoKLSAgICAgICAgICBzZWxmLkdldFByb3RvdHlwZShleHRlbnNpb24uY29udGFpbmluZ190eXBlKQotICAgICAgICBleHRlbmRlZF9jbGFzcyA9IHNlbGYuX2NsYXNzZXNbZXh0ZW5zaW9uLmNvbnRhaW5pbmdfdHlwZS5mdWxsX25hbWVdCi0gICAgICAgIGV4dGVuZGVkX2NsYXNzLlJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICByZXR1cm4gcmVzdWx0Ci0KLQotX0ZBQ1RPUlkgPSBNZXNzYWdlRmFjdG9yeSgpCi0KLQotZGVmIEdldE1lc3NhZ2VzKGZpbGVfcHJvdG9zKToKLSAgIiIiQnVpbGRzIGEgZGljdGlvbmFyeSBvZiBhbGwgdGhlIG1lc3NhZ2VzIGF2YWlsYWJsZSBpbiBhIHNldCBvZiBmaWxlcy4KLQotICBBcmdzOgotICAgIGZpbGVfcHJvdG9zOiBBIHNlcXVlbmNlIG9mIGZpbGUgcHJvdG9zIHRvIGJ1aWxkIG1lc3NhZ2VzIG91dCBvZi4KLQotICBSZXR1cm5zOgotICAgIEEgZGljdGlvbmFyeSBtYXBwaW5nIHByb3RvIG5hbWVzIHRvIHRoZSBtZXNzYWdlIGNsYXNzZXMuIFRoaXMgd2lsbCBpbmNsdWRlCi0gICAgYW55IGRlcGVuZGVudCBtZXNzYWdlcyBhcyB3ZWxsIGFzIGFueSBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSBzYW1lIGZpbGUgYXMKLSAgICBhIHNwZWNpZmllZCBtZXNzYWdlLgotICAiIiIKLSAgZm9yIGZpbGVfcHJvdG8gaW4gZmlsZV9wcm90b3M6Ci0gICAgX0ZBQ1RPUlkucG9vbC5BZGQoZmlsZV9wcm90bykKLSAgcmV0dXJuIF9GQUNUT1JZLkdldE1lc3NhZ2VzKFtmaWxlX3Byb3RvLm5hbWUgZm9yIGZpbGVfcHJvdG8gaW4gZmlsZV9wcm90b3NdKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9wcm90b19idWlsZGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9wcm90b19idWlsZGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MzZjYWVkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHJvdG9fYnVpbGRlci5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzMCArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkR5bmFtaWMgUHJvdG9idWYgY2xhc3MgY3JlYXRvci4iIiIKLQotdHJ5OgotICAgIGZyb20gY29sbGVjdGlvbnMgaW1wb3J0IE9yZGVyZWREaWN0Ci1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgZnJvbSBvcmRlcmVkZGljdCBpbXBvcnQgT3JkZXJlZERpY3QgICNQWTI2Ci1pbXBvcnQgaGFzaGxpYgotaW1wb3J0IG9zCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2VfZmFjdG9yeQotCi0KLWRlZiBfR2V0TWVzc2FnZUZyb21GYWN0b3J5KGZhY3RvcnksIGZ1bGxfbmFtZSk6Ci0gICIiIkdldCBhIHByb3RvIGNsYXNzIGZyb20gdGhlIE1lc3NhZ2VGYWN0b3J5IGJ5IG5hbWUuCi0KLSAgQXJnczoKLSAgICBmYWN0b3J5OiBhIE1lc3NhZ2VGYWN0b3J5IGluc3RhbmNlLgotICAgIGZ1bGxfbmFtZTogc3RyLCB0aGUgZnVsbHkgcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByb3RvIHR5cGUuCi0gIFJldHVybnM6Ci0gICAgQSBjbGFzcywgZm9yIHRoZSB0eXBlIGlkZW50aWZpZWQgYnkgZnVsbF9uYW1lLgotICBSYWlzZXM6Ci0gICAgS2V5RXJyb3IsIGlmIHRoZSBwcm90byBpcyBub3QgZm91bmQgaW4gdGhlIGZhY3RvcnkncyBkZXNjcmlwdG9yIHBvb2wuCi0gICIiIgotICBwcm90b19kZXNjcmlwdG9yID0gZmFjdG9yeS5wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShmdWxsX25hbWUpCi0gIHByb3RvX2NscyA9IGZhY3RvcnkuR2V0UHJvdG90eXBlKHByb3RvX2Rlc2NyaXB0b3IpCi0gIHJldHVybiBwcm90b19jbHMKLQotCi1kZWYgTWFrZVNpbXBsZVByb3RvQ2xhc3MoZmllbGRzLCBmdWxsX25hbWU9Tm9uZSwgcG9vbD1Ob25lKToKLSAgIiIiQ3JlYXRlIGEgUHJvdG9idWYgY2xhc3Mgd2hvc2UgZmllbGRzIGFyZSBiYXNpYyB0eXBlcy4KLQotICBOb3RlOiB0aGlzIGRvZXNuJ3QgdmFsaWRhdGUgZmllbGQgbmFtZXMhCi0KLSAgQXJnczoKLSAgICBmaWVsZHM6IGRpY3Qgb2Yge25hbWU6IGZpZWxkX3R5cGV9IG1hcHBpbmdzIGZvciBlYWNoIGZpZWxkIGluIHRoZSBwcm90by4gSWYKLSAgICAgICAgdGhpcyBpcyBhbiBPcmRlcmVkRGljdCB0aGUgb3JkZXIgd2lsbCBiZSBtYWludGFpbmVkLCBvdGhlcndpc2UgdGhlCi0gICAgICAgIGZpZWxkcyB3aWxsIGJlIHNvcnRlZCBieSBuYW1lLgotICAgIGZ1bGxfbmFtZTogb3B0aW9uYWwgc3RyLCB0aGUgZnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIHByb3RvIHR5cGUuCi0gICAgcG9vbDogb3B0aW9uYWwgRGVzY3JpcHRvclBvb2wgaW5zdGFuY2UuCi0gIFJldHVybnM6Ci0gICAgYSBjbGFzcywgdGhlIG5ldyBwcm90b2J1ZiBjbGFzcyB3aXRoIGEgRmlsZURlc2NyaXB0b3IuCi0gICIiIgotICBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5Lk1lc3NhZ2VGYWN0b3J5KHBvb2w9cG9vbCkKLQotICBpZiBmdWxsX25hbWUgaXMgbm90IE5vbmU6Ci0gICAgdHJ5OgotICAgICAgcHJvdG9fY2xzID0gX0dldE1lc3NhZ2VGcm9tRmFjdG9yeShmYWN0b3J5LCBmdWxsX25hbWUpCi0gICAgICByZXR1cm4gcHJvdG9fY2xzCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgIyBUaGUgZmFjdG9yeSdzIERlc2NyaXB0b3JQb29sIGRvZXNuJ3Qga25vdyBhYm91dCB0aGlzIGNsYXNzIHlldC4KLSAgICAgIHBhc3MKLQotICAjIEdldCBhIGxpc3Qgb2YgKG5hbWUsIGZpZWxkX3R5cGUpIHR1cGxlcyBmcm9tIHRoZSBmaWVsZHMgZGljdC4gSWYgZmllbGRzIHdhcwotICAjIGFuIE9yZGVyZWREaWN0IHdlIGtlZXAgdGhlIG9yZGVyLCBidXQgb3RoZXJ3aXNlIHdlIHNvcnQgdGhlIGZpZWxkIHRvIGVuc3VyZQotICAjIGNvbnNpc3RlbnQgb3JkZXJpbmcuCi0gIGZpZWxkX2l0ZW1zID0gZmllbGRzLml0ZW1zKCkKLSAgaWYgbm90IGlzaW5zdGFuY2UoZmllbGRzLCBPcmRlcmVkRGljdCk6Ci0gICAgZmllbGRfaXRlbXMgPSBzb3J0ZWQoZmllbGRfaXRlbXMpCi0KLSAgIyBVc2UgYSBjb25zaXN0ZW50IGZpbGUgbmFtZSB0aGF0IGlzIHVubGlrZWx5IHRvIGNvbmZsaWN0IHdpdGggYW55IGltcG9ydGVkCi0gICMgcHJvdG8gZmlsZXMuCi0gIGZpZWxkc19oYXNoID0gaGFzaGxpYi5zaGExKCkKLSAgZm9yIGZfbmFtZSwgZl90eXBlIGluIGZpZWxkX2l0ZW1zOgotICAgIGZpZWxkc19oYXNoLnVwZGF0ZShmX25hbWUuZW5jb2RlKCd1dGYtOCcpKQotICAgIGZpZWxkc19oYXNoLnVwZGF0ZShzdHIoZl90eXBlKS5lbmNvZGUoJ3V0Zi04JykpCi0gIHByb3RvX2ZpbGVfbmFtZSA9IGZpZWxkc19oYXNoLmhleGRpZ2VzdCgpICsgJy5wcm90bycKLQotICAjIElmIHRoZSBwcm90byBpcyBhbm9ueW1vdXMsIHVzZSB0aGUgc2FtZSBoYXNoIHRvIG5hbWUgaXQuCi0gIGlmIGZ1bGxfbmFtZSBpcyBOb25lOgotICAgIGZ1bGxfbmFtZSA9ICgnbmV0LnByb3RvMi5weXRob24ucHVibGljLnByb3RvX2J1aWxkZXIuQW5vbnltb3VzUHJvdG9fJyArCi0gICAgICAgICAgICAgICAgIGZpZWxkc19oYXNoLmhleGRpZ2VzdCgpKQotICAgIHRyeToKLSAgICAgIHByb3RvX2NscyA9IF9HZXRNZXNzYWdlRnJvbUZhY3RvcnkoZmFjdG9yeSwgZnVsbF9uYW1lKQotICAgICAgcmV0dXJuIHByb3RvX2NscwotICAgIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICAgICMgVGhlIGZhY3RvcnkncyBEZXNjcmlwdG9yUG9vbCBkb2Vzbid0IGtub3cgYWJvdXQgdGhpcyBjbGFzcyB5ZXQuCi0gICAgICBwYXNzCi0KLSAgIyBUaGlzIGlzIHRoZSBmaXJzdCB0aW1lIHdlIHNlZSB0aGlzIHByb3RvOiBhZGQgYSBuZXcgZGVzY3JpcHRvciB0byB0aGUgcG9vbC4KLSAgZmFjdG9yeS5wb29sLkFkZCgKLSAgICAgIF9NYWtlRmlsZURlc2NyaXB0b3JQcm90byhwcm90b19maWxlX25hbWUsIGZ1bGxfbmFtZSwgZmllbGRfaXRlbXMpKQotICByZXR1cm4gX0dldE1lc3NhZ2VGcm9tRmFjdG9yeShmYWN0b3J5LCBmdWxsX25hbWUpCi0KLQotZGVmIF9NYWtlRmlsZURlc2NyaXB0b3JQcm90byhwcm90b19maWxlX25hbWUsIGZ1bGxfbmFtZSwgZmllbGRfaXRlbXMpOgotICAiIiJQb3B1bGF0ZSBGaWxlRGVzY3JpcHRvclByb3RvIGZvciBNZXNzYWdlRmFjdG9yeSdzIERlc2NyaXB0b3JQb29sLiIiIgotICBwYWNrYWdlLCBuYW1lID0gZnVsbF9uYW1lLnJzcGxpdCgnLicsIDEpCi0gIGZpbGVfcHJvdG8gPSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvKCkKLSAgZmlsZV9wcm90by5uYW1lID0gb3MucGF0aC5qb2luKHBhY2thZ2UucmVwbGFjZSgnLicsICcvJyksIHByb3RvX2ZpbGVfbmFtZSkKLSAgZmlsZV9wcm90by5wYWNrYWdlID0gcGFja2FnZQotICBkZXNjX3Byb3RvID0gZmlsZV9wcm90by5tZXNzYWdlX3R5cGUuYWRkKCkKLSAgZGVzY19wcm90by5uYW1lID0gbmFtZQotICBmb3IgZl9udW1iZXIsIChmX25hbWUsIGZfdHlwZSkgaW4gZW51bWVyYXRlKGZpZWxkX2l0ZW1zLCAxKToKLSAgICBmaWVsZF9wcm90byA9IGRlc2NfcHJvdG8uZmllbGQuYWRkKCkKLSAgICBmaWVsZF9wcm90by5uYW1lID0gZl9uYW1lCi0gICAgZmllbGRfcHJvdG8ubnVtYmVyID0gZl9udW1iZXIKLSAgICBmaWVsZF9wcm90by5sYWJlbCA9IGRlc2NyaXB0b3JfcGIyLkZpZWxkRGVzY3JpcHRvclByb3RvLkxBQkVMX09QVElPTkFMCi0gICAgZmllbGRfcHJvdG8udHlwZSA9IGZfdHlwZQotICByZXR1cm4gZmlsZV9wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9SRUFETUUgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L1JFQURNRQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmQ2MWNiNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L1JFQURNRQorKysgL2Rldi9udWxsCkBAIC0xLDYgKzAsMCBAQAotVGhpcyBpcyB0aGUgJ3YyJyBDKysgaW1wbGVtZW50YXRpb24gZm9yIHB5dGhvbiBwcm90bzIuCi0KLUl0IGlzIGFjdGl2ZSB3aGVuOgotCi1QUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTj1jcHAKLVBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OX1ZFUlNJT049MgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9fX2luaXRfXy5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvX19pbml0X18ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1ODU2MTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9fX2luaXRfXy5weQorKysgL2Rldi9udWxsCkBAIC0xLDQgKzAsMCBAQAotdHJ5OgotICBfX2ltcG9ydF9fKCdwa2dfcmVzb3VyY2VzJykuZGVjbGFyZV9uYW1lc3BhY2UoX19uYW1lX18pCi1leGNlcHQgSW1wb3J0RXJyb3I6Ci0gIF9fcGF0aF9fID0gX19pbXBvcnRfXygncGtndXRpbCcpLmV4dGVuZF9wYXRoKF9fcGF0aF9fLCBfX25hbWVfXykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvY3BwX21lc3NhZ2UucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2NwcF9tZXNzYWdlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMjE1MjExLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvY3BwX21lc3NhZ2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2NSArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlByb3RvY29sIG1lc3NhZ2UgaW1wbGVtZW50YXRpb24gaG9va3MgZm9yIEMrKyBpbXBsZW1lbnRhdGlvbi4KLQotQ29udGFpbnMgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIHRvIGNyZWF0ZSBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZnJvbQotRGVzY3JpcHRvciBvYmplY3RzIGF0IHJ1bnRpbWUgYmFja2VkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgQysrIEFQSS4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3RpYmVsbEBnb29nbGUuY29tIChKb2hhbiBUaWJlbGwpJwotCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5weWV4dCBpbXBvcnQgX21lc3NhZ2UKLQotCi1jbGFzcyBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKF9tZXNzYWdlLk1lc3NhZ2VNZXRhKToKLQotICAiIiJNZXRhY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBEZXNjcmlwdG9ycy4KLQotICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY3VycmVudGx5IHVzZXMgdGhpcyBtZXRhY2xhc3MgdG8gY3JlYXRlIHByb3RvY29sCi0gIG1lc3NhZ2UgY2xhc3NlcyBhdCBydW50aW1lLiAgQ2xpZW50cyBjYW4gYWxzbyBtYW51YWxseSBjcmVhdGUgdGhlaXIgb3duCi0gIGNsYXNzZXMgYXQgcnVudGltZSwgYXMgaW4gdGhpcyBleGFtcGxlOgotCi0gIG15ZGVzY3JpcHRvciA9IERlc2NyaXB0b3IoLi4uLi4pCi0gIGNsYXNzIE15UHJvdG9DbGFzcyhNZXNzYWdlKToKLSAgICBfX21ldGFjbGFzc19fID0gR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICAgIERFU0NSSVBUT1IgPSBteWRlc2NyaXB0b3IKLSAgbXlwcm90b19pbnN0YW5jZSA9IE15UHJvdG9DbGFzcygpCi0gIG15cHJvdG8uZm9vX2ZpZWxkID0gMjMKLSAgLi4uCi0KLSAgVGhlIGFib3ZlIGV4YW1wbGUgd2lsbCBub3Qgd29yayBmb3IgbmVzdGVkIHR5cGVzLiBJZiB5b3Ugd2lzaCB0byBpbmNsdWRlIHRoZW0sCi0gIHVzZSByZWZsZWN0aW9uLk1ha2VDbGFzcygpIGluc3RlYWQgb2YgbWFudWFsbHkgaW5zdGFudGlhdGluZyB0aGUgY2xhc3MgaW4KLSAgb3JkZXIgdG8gY3JlYXRlIHRoZSBhcHByb3ByaWF0ZSBjbGFzcyBzdHJ1Y3R1cmUuCi0gICIiIgotCi0gICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggdGhlIHByb3RvY29sLWNvbXBpbGVyIGNvZGUgaW4KLSAgIyBwcm90bzIvY29tcGlsZXIvaW50ZXJuYWwvZ2VuZXJhdG9yLiouCi0gIF9ERVNDUklQVE9SX0tFWSA9ICdERVNDUklQVE9SJwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMzU1NzUzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE1ODQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogcGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KQotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0jaW5jbHVkZSA8ZnJhbWVvYmplY3QuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9jb250YWluZXJzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaD4KLQotI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMwotICAjZGVmaW5lIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZQotICAjZGVmaW5lIFB5U3RyaW5nX0NoZWNrIFB5VW5pY29kZV9DaGVjawotICAjZGVmaW5lIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcgUHlVbmljb2RlX0ludGVybkZyb21TdHJpbmcKLSAgI2RlZmluZSBQeUludF9Gcm9tTG9uZyBQeUxvbmdfRnJvbUxvbmcKLSAgI2RlZmluZSBQeUludF9Gcm9tU2l6ZV90IFB5TG9uZ19Gcm9tU2l6ZV90Ci0gICNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMzAwMDAKLSAgICAjZXJyb3IgIlB5dGhvbiAzLjAgLSAzLjIgYXJlIG5vdCBzdXBwb3J0ZWQuIgotICAjZW5kaWYKLSAgI2RlZmluZSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob2IsIGNoYXJwcCwgc2l6ZXApIFwKLSAgICAoUHlVbmljb2RlX0NoZWNrKG9iKT8gXAotICAgICAgICgoKihjaGFycHApID0gUHlVbmljb2RlX0FzVVRGOEFuZFNpemUob2IsIChzaXplcCkpKSA9PSBOVUxMPyAtMTogMCk6IFwKLSAgICAgICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShvYiwgKGNoYXJwcCksIChzaXplcCkpKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi0vLyBTdG9yZSBpbnRlcm5lZCBkZXNjcmlwdG9ycywgc28gdGhhdCB0aGUgc2FtZSBDKysgZGVzY3JpcHRvciB5aWVsZHMgdGhlIHNhbWUKLS8vIFB5dGhvbiBvYmplY3QuIE9iamVjdHMgYXJlIG5vdCBpbW1vcnRhbDogdGhpcyBtYXAgZG9lcyBub3Qgb3duIHRoZQotLy8gcmVmZXJlbmNlcywgYW5kIGl0ZW1zIGFyZSBkZWxldGVkIHdoZW4gdGhlIGxhc3QgcmVmZXJlbmNlIHRvIHRoZSBvYmplY3QgaXMKLS8vIHJlbGVhc2VkLgotLy8gVGhpcyBpcyBlbm91Z2ggdG8gc3VwcG9ydCB0aGUgImlzIiBvcGVyYXRvciBvbiBsaXZlIG9iamVjdHMuCi0vLyBBbGwgZGVzY3JpcHRvcnMgYXJlIHN0b3JlZCBoZXJlLgotaGFzaF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj4gaW50ZXJuZWRfZGVzY3JpcHRvcnM7Ci0KLVB5T2JqZWN0KiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzdHIuY19zdHIoKSwgc3RyLnNpemUoKSk7Ci19Ci0KLS8vIENoZWNrIHRoYXQgdGhlIGNhbGxpbmcgUHl0aG9uIGNvZGUgaXMgdGhlIGdsb2JhbCBzY29wZSBvZiBhIF9wYjIucHkgbW9kdWxlLgotLy8gVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIHN1cHBvcnQgdGhlIGN1cnJlbnQgY29kZSBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvCi0vLyBjb21waWxlciwgd2hpY2ggY3JlYXRlcyBkZXNjcmlwdG9ycywgdGhlbiB1cGRhdGUgc29tZSBwcm9wZXJ0aWVzLgotLy8gRm9yIGV4YW1wbGU6Ci0vLyAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IERlc2NyaXB0b3IoCi0vLyAgICAgICBuYW1lPSdNZXNzYWdlJywKLS8vICAgICAgIGZpZWxkcyA9IFtGaWVsZERlc2NyaXB0b3IobmFtZT0nZmllbGQnKV0KLS8vICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc1swXS5jb250YWluaW5nX3R5cGUgPSBtZXNzYWdlX2Rlc2NyaXB0b3IKLS8vCi0vLyBUaGlzIGNvZGUgaXMgc3RpbGwgZXhlY3V0ZWQsIGJ1dCB0aGUgZGVzY3JpcHRvcnMgbm93IGhhdmUgbm8gb3RoZXIgc3RvcmFnZQotLy8gdGhhbiB0aGUgKGNvbnN0KSBDKysgcG9pbnRlciwgYW5kIGFyZSBpbW11dGFibGUuCi0vLyBTbyB3ZSBsZXQgdGhpcyBjb2RlIHBhc3MsIGJ5IHNpbXBseSBpZ25vcmluZyB0aGUgbmV3IHZhbHVlLgotLy8KLS8vIEZyb20gdXNlciBjb2RlLCBkZXNjcmlwdG9ycyBzdGlsbCBsb29rIGltbXV0YWJsZS4KLS8vCi0vLyBUT0RPKGFtYXVyeWZhKTogQ2hhbmdlIHRoZSBwcm90bzIgY29tcGlsZXIgdG8gcmVtb3ZlIHRoZSBhc3NpZ25tZW50cywgYW5kCi0vLyByZW1vdmUgdGhpcyBoYWNrLgotYm9vbCBfQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoaW50IHN0YWNrbGV2ZWwpIHsKLSNpZm5kZWYgUFlQWV9WRVJTSU9OCi0gIC8vIFRoaXMgY2hlY2sgaXMgbm90IGNyaXRpY2FsIGFuZCBpcyBzb21ld2hhdCBkaWZmaWN1bHQgdG8gaW1wbGVtZW50IGNvcnJlY3RseQotICAvLyBpbiBQeVB5LgotICBQeUZyYW1lT2JqZWN0KiBmcmFtZSA9IFB5RXZhbF9HZXRGcmFtZSgpOwotICBpZiAoZnJhbWUgPT0gTlVMTCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB3aGlsZSAoc3RhY2tsZXZlbC0tID4gMCkgewotICAgIGZyYW1lID0gZnJhbWUtPmZfYmFjazsKLSAgICBpZiAoZnJhbWUgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICBpZiAoZnJhbWUtPmZfZ2xvYmFscyAhPSBmcmFtZS0+Zl9sb2NhbHMpIHsKLSAgICAvLyBOb3QgYXQgZ2xvYmFsIG1vZHVsZSBzY29wZQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChmcmFtZS0+Zl9jb2RlLT5jb19maWxlbmFtZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNoYXIqIGZpbGVuYW1lOwotICBQeV9zc2l6ZV90IGZpbGVuYW1lX3NpemU7Ci0gIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoZnJhbWUtPmZfY29kZS0+Y29fZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVuYW1lLCAmZmlsZW5hbWVfc2l6ZSkgPCAwKSB7Ci0gICAgLy8gZmlsZW5hbWUgaXMgbm90IGEgc3RyaW5nLgotICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChmaWxlbmFtZV9zaXplIDwgNykgewotICAgIC8vIGZpbGVuYW1lIGlzIHRvbyBzaG9ydC4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHN0cmNtcCgmZmlsZW5hbWVbZmlsZW5hbWVfc2l6ZSAtIDddLCAiX3BiMi5weSIpICE9IDApIHsKLSAgICAvLyBGaWxlbmFtZSBpcyBub3QgZW5kaW5nIHdpdGggX3BiMi4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSNlbmRpZgotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gSWYgdGhlIGNhbGxpbmcgY29kZSBpcyBub3QgYSBfcGIyLnB5IGZpbGUsIHJhaXNlIEF0dHJpYnV0ZUVycm9yLgotLy8gVG8gYmUgdXNlZCBpbiBhdHRyaWJ1dGUgc2V0dGVycy4KLXN0YXRpYyBpbnQgQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZShjb25zdCBjaGFyKiBhdHRyX25hbWUpIHsKLSAgaWYgKF9DYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgwKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIFB5RXJyX0Zvcm1hdChQeUV4Y19BdHRyaWJ1dGVFcnJvciwKLSAgICAgICAgICAgICAgICJhdHRyaWJ1dGUgaXMgbm90IHdyaXRhYmxlOiAlcyIsIGF0dHJfbmFtZSk7Ci0gIHJldHVybiAtMTsKLX0KLQotCi0jaWZuZGVmIFB5VmFyT2JqZWN0X0hFQURfSU5JVAotI2RlZmluZSBQeVZhck9iamVjdF9IRUFEX0lOSVQodHlwZSwgc2l6ZSkgUHlPYmplY3RfSEVBRF9JTklUKHR5cGUpIHNpemUsCi0jZW5kaWYKLSNpZm5kZWYgUHlfVFlQRQotI2RlZmluZSBQeV9UWVBFKG9iKSAoKChQeU9iamVjdCopKG9iKSktPm9iX3R5cGUpCi0jZW5kaWYKLQotCi0vLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBkZXNjcmlwdG9yIG9iamVjdHMuCi0KLS8vIEEgc2V0IG9mIHRlbXBsYXRlcyB0byByZXRyaWV2ZSB0aGUgQysrIEZpbGVEZXNjcmlwdG9yIG9mIGFueSBkZXNjcmlwdG9yLgotdGVtcGxhdGU8Y2xhc3MgRGVzY3JpcHRvckNsYXNzPgotY29uc3QgRmlsZURlc2NyaXB0b3IqIEdldEZpbGVEZXNjcmlwdG9yKGNvbnN0IERlc2NyaXB0b3JDbGFzcyogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpOwotfQotdGVtcGxhdGU8PgotY29uc3QgRmlsZURlc2NyaXB0b3IqIEdldEZpbGVEZXNjcmlwdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yOwotfQotdGVtcGxhdGU8PgotY29uc3QgRmlsZURlc2NyaXB0b3IqIEdldEZpbGVEZXNjcmlwdG9yKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3ItPnR5cGUoKS0+ZmlsZSgpOwotfQotdGVtcGxhdGU8PgotY29uc3QgRmlsZURlc2NyaXB0b3IqIEdldEZpbGVEZXNjcmlwdG9yKGNvbnN0IE9uZW9mRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCktPmZpbGUoKTsKLX0KLQotLy8gQ29udmVydHMgb3B0aW9ucyBpbnRvIGEgUHl0aG9uIHByb3RvYnVmLCBhbmQgY2FjaGUgdGhlIHJlc3VsdC4KLS8vCi0vLyBUaGlzIGlzIGEgYml0IHRyaWNreSBiZWNhdXNlIG9wdGlvbnMgY2FuIGNvbnRhaW4gZXh0ZW5zaW9uIGZpZWxkcyBkZWZpbmVkIGluCi0vLyB0aGUgc2FtZSBwcm90byBmaWxlLiBJbiB0aGlzIGNhc2UgdGhlIG9wdGlvbnMgcGFyc2VkIGZyb20gdGhlIHNlcmlhbGl6ZWRfcGIKLS8vIGhhdmUgdW5rb3duIGZpZWxkcywgYW5kIHdlIG5lZWQgdG8gcGFyc2UgdGhlbSBhZ2Fpbi4KLS8vCi0vLyBBbHdheXMgcmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCi10ZW1wbGF0ZTxjbGFzcyBEZXNjcmlwdG9yQ2xhc3M+Ci1zdGF0aWMgUHlPYmplY3QqIEdldE9yQnVpbGRPcHRpb25zKGNvbnN0IERlc2NyaXB0b3JDbGFzcyAqZGVzY3JpcHRvcikgewotICAvLyBPcHRpb25zIChhbmQgdGhlaXIgZXh0ZW5zaW9ucykgYXJlIGNvbXBsZXRlbHkgcmVzb2x2ZWQgaW4gdGhlIHByb3RvIGZpbGUKLSAgLy8gY29udGFpbmluZyB0aGUgZGVzY3JpcHRvci4KLSAgUHlEZXNjcmlwdG9yUG9vbCogcG9vbCA9IEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKAotICAgICAgR2V0RmlsZURlc2NyaXB0b3IoZGVzY3JpcHRvciktPnBvb2woKSk7Ci0KLSAgaGFzaF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj4qIGRlc2NyaXB0b3Jfb3B0aW9ucyA9Ci0gICAgICBwb29sLT5kZXNjcmlwdG9yX29wdGlvbnM7Ci0gIC8vIEZpcnN0IHNlYXJjaCBpbiB0aGUgY2FjaGUuCi0gIGlmIChkZXNjcmlwdG9yX29wdGlvbnMtPmZpbmQoZGVzY3JpcHRvcikgIT0gZGVzY3JpcHRvcl9vcHRpb25zLT5lbmQoKSkgewotICAgIFB5T2JqZWN0ICp2YWx1ZSA9ICgqZGVzY3JpcHRvcl9vcHRpb25zKVtkZXNjcmlwdG9yXTsKLSAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIC8vIEJ1aWxkIHRoZSBPcHRpb25zIG9iamVjdDogZ2V0IGl0cyBQeXRob24gY2xhc3MsIGFuZCBtYWtlIGEgY29weSBvZiB0aGUgQysrCi0gIC8vIHJlYWQtb25seSBpbnN0YW5jZS4KLSAgY29uc3QgTWVzc2FnZSYgb3B0aW9ucyhkZXNjcmlwdG9yLT5vcHRpb25zKCkpOwotICBjb25zdCBEZXNjcmlwdG9yICptZXNzYWdlX3R5cGUgPSBvcHRpb25zLkdldERlc2NyaXB0b3IoKTsKLSAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcygKLSAgICAgIGNkZXNjcmlwdG9yX3Bvb2w6OkdldE1lc3NhZ2VDbGFzcyhwb29sLCBtZXNzYWdlX3R5cGUpKTsKLSAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gTlVMTCkgewotICAgIC8vIFRoZSBPcHRpb25zIG1lc3NhZ2Ugd2FzIG5vdCBmb3VuZCBpbiB0aGUgY3VycmVudCBEZXNjcmlwdG9yUG9vbC4KLSAgICAvLyBJbiB0aGlzIGNhc2UsIHRoZXJlIGNhbm5vdCBiZSBleHRlbnNpb25zIHRvIHRoZXNlIG9wdGlvbnMsIGFuZCB3ZSBjYW4KLSAgICAvLyB0cnkgdG8gdXNlIHRoZSBiYXNpYyBwb29sIGluc3RlYWQuCi0gICAgUHlFcnJfQ2xlYXIoKTsKLSAgICBtZXNzYWdlX2NsYXNzID0gY2Rlc2NyaXB0b3JfcG9vbDo6R2V0TWVzc2FnZUNsYXNzKAotICAgICAgR2V0RGVmYXVsdERlc2NyaXB0b3JQb29sKCksIG1lc3NhZ2VfdHlwZSk7Ci0gIH0KLSAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gTlVMTCkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJDb3VsZCBub3QgcmV0cmlldmUgY2xhc3MgZm9yIE9wdGlvbnM6ICVzIiwKLSAgICAgICAgICAgICAgICAgbWVzc2FnZV90eXBlLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBTY29wZWRQeU9iamVjdFB0ciB2YWx1ZSgKLSAgICAgIFB5RXZhbF9DYWxsT2JqZWN0KG1lc3NhZ2VfY2xhc3MtPkFzUHlPYmplY3QoKSwgTlVMTCkpOwotICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHZhbHVlLmdldCgpLCAmQ01lc3NhZ2VfVHlwZSkpIHsKLSAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJJbnZhbGlkIGNsYXNzIGZvciAlczogJXMiLAotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBQeV9UWVBFKHZhbHVlLmdldCgpKS0+dHBfbmFtZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgfQotICBDTWVzc2FnZSogY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPih2YWx1ZS5nZXQoKSk7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMuR2V0UmVmbGVjdGlvbigpOwotICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKHJlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMob3B0aW9ucykpOwotICBpZiAodW5rbm93bl9maWVsZHMuZW1wdHkoKSkgewotICAgIGNtc2ctPm1lc3NhZ2UtPkNvcHlGcm9tKG9wdGlvbnMpOwotICB9IGVsc2UgewotICAgIC8vIFJlcGFyc2Ugb3B0aW9ucyBzdHJpbmchICBYWFggY2FsbCBjbWVzc2FnZTo6TWVyZ2VGcm9tU3RyaW5nCi0gICAgc3RyaW5nIHNlcmlhbGl6ZWQ7Ci0gICAgb3B0aW9ucy5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7Ci0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihzZXJpYWxpemVkLmNfc3RyKCkpLCBzZXJpYWxpemVkLnNpemUoKSk7Ci0gICAgaW5wdXQuU2V0RXh0ZW5zaW9uUmVnaXN0cnkocG9vbC0+cG9vbCwgcG9vbC0+bWVzc2FnZV9mYWN0b3J5KTsKLSAgICBib29sIHN1Y2Nlc3MgPSBjbXNnLT5tZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0KTsKLSAgICBpZiAoIXN1Y2Nlc3MpIHsKLSAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiRXJyb3IgcGFyc2luZyBPcHRpb25zIG1lc3NhZ2UiKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotCi0gIC8vIENhY2hlIHRoZSByZXN1bHQuCi0gIFB5X0lOQ1JFRih2YWx1ZS5nZXQoKSk7Ci0gICgqcG9vbC0+ZGVzY3JpcHRvcl9vcHRpb25zKVtkZXNjcmlwdG9yXSA9IHZhbHVlLmdldCgpOwotCi0gIHJldHVybiB2YWx1ZS5yZWxlYXNlKCk7Ci19Ci0KLS8vIENvcHkgdGhlIEMrKyBkZXNjcmlwdG9yIHRvIGEgUHl0aG9uIG1lc3NhZ2UuCi0vLyBUaGUgUHl0aG9uIG1lc3NhZ2UgaXMgYW4gaW5zdGFuY2Ugb2YgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvCi0vLyBvciBzaW1pbGFyLgotdGVtcGxhdGU8Y2xhc3MgRGVzY3JpcHRvclByb3RvQ2xhc3MsIGNsYXNzIERlc2NyaXB0b3JDbGFzcz4KLXN0YXRpYyBQeU9iamVjdCogQ29weVRvUHl0aG9uUHJvdG8oY29uc3QgRGVzY3JpcHRvckNsYXNzICpkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCAqdGFyZ2V0KSB7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIHNlbGZfZGVzY3JpcHRvciA9Ci0gICAgICBEZXNjcmlwdG9yUHJvdG9DbGFzczo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldERlc2NyaXB0b3IoKTsKLSAgQ01lc3NhZ2UqIG1lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4odGFyZ2V0KTsKLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sodGFyZ2V0LCAmQ01lc3NhZ2VfVHlwZSkgfHwKLSAgICAgIG1lc3NhZ2UtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSAhPSBzZWxmX2Rlc2NyaXB0b3IpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiTm90IGEgJXMgbWVzc2FnZSIsCi0gICAgICAgICAgICAgICAgIHNlbGZfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgY21lc3NhZ2U6OkFzc3VyZVdyaXRhYmxlKG1lc3NhZ2UpOwotICBEZXNjcmlwdG9yUHJvdG9DbGFzcyogZGVzY3JpcHRvcl9tZXNzYWdlID0KLSAgICAgIHN0YXRpY19jYXN0PERlc2NyaXB0b3JQcm90b0NsYXNzKj4obWVzc2FnZS0+bWVzc2FnZSk7Ci0gIGRlc2NyaXB0b3ItPkNvcHlUbyhkZXNjcmlwdG9yX21lc3NhZ2UpOwotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotLy8gQWxsIERlc2NyaXB0b3JzIGNsYXNzZXMgc2hhcmUgdGhlIHNhbWUgbWVtb3J5IGxheW91dC4KLXR5cGVkZWYgc3RydWN0IFB5QmFzZURlc2NyaXB0b3IgewotICBQeU9iamVjdF9IRUFECi0KLSAgLy8gUG9pbnRlciB0byB0aGUgQysrIHByb3RvMiBkZXNjcmlwdG9yLgotICAvLyBMaWtlIGFsbCBkZXNjcmlwdG9ycywgaXQgaXMgb3duZWQgYnkgdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbC4KLSAgY29uc3Qgdm9pZCogZGVzY3JpcHRvcjsKLQotICAvLyBPd25lZCByZWZlcmVuY2UgdG8gdGhlIERlc2NyaXB0b3JQb29sLCB0byBlbnN1cmUgaXQgaXMga2VwdCBhbGl2ZS4KLSAgUHlEZXNjcmlwdG9yUG9vbCogcG9vbDsKLX0gUHlCYXNlRGVzY3JpcHRvcjsKLQotCi0vLyBGaWxlRGVzY3JpcHRvciBzdHJ1Y3R1cmUgImluaGVyaXRzIiBmcm9tIHRoZSBiYXNlIGRlc2NyaXB0b3IuCi10eXBlZGVmIHN0cnVjdCBQeUZpbGVEZXNjcmlwdG9yIHsKLSAgUHlCYXNlRGVzY3JpcHRvciBiYXNlOwotCi0gIC8vIFRoZSBjYWNoZWQgdmVyc2lvbiBvZiBzZXJpYWxpemVkIHBiLiBFaXRoZXIgTlVMTCwgb3IgYSBCeXRlcyBzdHJpbmcuCi0gIC8vIFdlIG93biB0aGUgcmVmZXJlbmNlLgotICBQeU9iamVjdCAqc2VyaWFsaXplZF9wYjsKLX0gUHlGaWxlRGVzY3JpcHRvcjsKLQotCi1uYW1lc3BhY2UgZGVzY3JpcHRvciB7Ci0KLS8vIENyZWF0ZXMgb3IgcmV0cmlldmUgYSBQeXRob24gZGVzY3JpcHRvciBvZiB0aGUgc3BlY2lmaWVkIHR5cGUuCi0vLyBPYmplY3RzIGFyZSBpbnRlcm5lZDogdGhlIHNhbWUgZGVzY3JpcHRvciB3aWxsIHJldHVybiB0aGUgc2FtZSBvYmplY3QgaWYgaXQKLS8vIHdhcyBrZXB0IGFsaXZlLgotLy8gJ3dhc19jcmVhdGVkJyBpcyBhbiBvcHRpb25hbCBwb2ludGVyIHRvIGEgYm9vbCwgYW5kIGlzIHNldCB0byB0cnVlIGlmIGEgbmV3Ci0vLyBvYmplY3Qgd2FzIGFsbG9jYXRlZC4KLS8vIEFsd2F5cyByZXR1cm4gYSBuZXcgcmVmZXJlbmNlLgotdGVtcGxhdGU8Y2xhc3MgRGVzY3JpcHRvckNsYXNzPgotUHlPYmplY3QqIE5ld0ludGVybmVkRGVzY3JpcHRvcihQeVR5cGVPYmplY3QqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JDbGFzcyogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FzX2NyZWF0ZWQpIHsKLSAgaWYgKHdhc19jcmVhdGVkKSB7Ci0gICAgKndhc19jcmVhdGVkID0gZmFsc2U7Ci0gIH0KLSAgaWYgKGRlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIFB5RXJyX0JhZEludGVybmFsQ2FsbCgpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gU2VlIGlmIHRoZSBvYmplY3QgaXMgaW4gdGhlIG1hcCBvZiBpbnRlcm5lZCBkZXNjcmlwdG9ycwotICBoYXNoX21hcDxjb25zdCB2b2lkKiwgUHlPYmplY3QqPjo6aXRlcmF0b3IgaXQgPQotICAgICAgaW50ZXJuZWRfZGVzY3JpcHRvcnMuZmluZChkZXNjcmlwdG9yKTsKLSAgaWYgKGl0ICE9IGludGVybmVkX2Rlc2NyaXB0b3JzLmVuZCgpKSB7Ci0gICAgR09PR0xFX0RDSEVDSyhQeV9UWVBFKGl0LT5zZWNvbmQpID09IHR5cGUpOwotICAgIFB5X0lOQ1JFRihpdC0+c2Vjb25kKTsKLSAgICByZXR1cm4gaXQtPnNlY29uZDsKLSAgfQotICAvLyBDcmVhdGUgYSBuZXcgZGVzY3JpcHRvciBvYmplY3QKLSAgUHlCYXNlRGVzY3JpcHRvciogcHlfZGVzY3JpcHRvciA9IFB5T2JqZWN0X05ldygKLSAgICAgIFB5QmFzZURlc2NyaXB0b3IsIHR5cGUpOwotICBpZiAocHlfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcHlfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0KLSAgLy8gYW5kIGNhY2hlIGl0LgotICBpbnRlcm5lZF9kZXNjcmlwdG9ycy5pbnNlcnQoCi0gICAgICBzdGQ6Om1ha2VfcGFpcihkZXNjcmlwdG9yLCByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4ocHlfZGVzY3JpcHRvcikpKTsKLQotICAvLyBFbnN1cmVzIHRoYXQgdGhlIERlc2NyaXB0b3JQb29sIHN0YXlzIGFsaXZlLgotICBQeURlc2NyaXB0b3JQb29sKiBwb29sID0gR2V0RGVzY3JpcHRvclBvb2xfRnJvbVBvb2woCi0gICAgICBHZXRGaWxlRGVzY3JpcHRvcihkZXNjcmlwdG9yKS0+cG9vbCgpKTsKLSAgaWYgKHBvb2wgPT0gTlVMTCkgewotICAgIC8vIERvbid0IERFQ1JFRiwgdGhlIG9iamVjdCBpcyBub3QgZnVsbHkgaW5pdGlhbGl6ZWQuCi0gICAgUHlPYmplY3RfRGVsKHB5X2Rlc2NyaXB0b3IpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5X0lOQ1JFRihwb29sKTsKLSAgcHlfZGVzY3JpcHRvci0+cG9vbCA9IHBvb2w7Ci0KLSAgaWYgKHdhc19jcmVhdGVkKSB7Ci0gICAgKndhc19jcmVhdGVkID0gdHJ1ZTsKLSAgfQotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Rlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgdm9pZCBEZWFsbG9jKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYpIHsKLSAgLy8gUmVtb3ZlIGZyb20gaW50ZXJuZWQgZGljdGlvbmFyeQotICBpbnRlcm5lZF9kZXNjcmlwdG9ycy5lcmFzZShzZWxmLT5kZXNjcmlwdG9yKTsKLSAgUHlfQ0xFQVIoc2VsZi0+cG9vbCk7Ci0gIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKLX0KLQotc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKLSAge05VTEx9Ci19OwotCi1QeVR5cGVPYmplY3QgUHlCYXNlRGVzY3JpcHRvcl9UeXBlID0gewotICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotICBGVUxMX01PRFVMRV9OQU1FICIuRGVzY3JpcHRvckJhc2UiLCAgIC8vIHRwX25hbWUKLSAgc2l6ZW9mKFB5QmFzZURlc2NyaXB0b3IpLCAgICAgICAgICAgICAvLyB0cF9iYXNpY3NpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQotICAoZGVzdHJ1Y3RvcilEZWFsbG9jLCAgICAgICAgICAgICAgICAgIC8vIHRwX2RlYWxsb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9wcmludAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKLSAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncwotICAiRGVzY3JpcHRvcnMgYmFzZSBjbGFzcyIsICAgICAgICAgICAgIC8vIHRwX2RvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWV0aG9kcwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKLSAgR2V0dGVycywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRzZXQKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXNjcmlwdG9yCi0KLWNvbnN0IHZvaWQqIFB5RGVzY3JpcHRvcl9Bc1ZvaWRQdHIoUHlPYmplY3QqIG9iaikgewotICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5vdCBhIEJhc2VEZXNjcmlwdG9yIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KG9iaiktPmRlc2NyaXB0b3I7Ci19Ci0KLW5hbWVzcGFjZSBtZXNzYWdlX2Rlc2NyaXB0b3IgewotCi0vLyBVbmNoZWNrZWQgYWNjZXNzb3IgdG8gdGhlIEMrKyBwb2ludGVyLgotc3RhdGljIGNvbnN0IERlc2NyaXB0b3IqIF9HZXREZXNjcmlwdG9yKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRGVzY3JpcHRvcio+KHNlbGYtPmRlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldE5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+bmFtZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRGdWxsTmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5mdWxsX25hbWUoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RmlsZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5maWxlKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldENvbmNyZXRlQ2xhc3MoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICAvLyBSZXR1bnMgdGhlIGNhbm9uaWNhbCBjbGFzcyBmb3IgdGhlIGdpdmVuIGRlc2NyaXB0b3IuCi0gIC8vIFRoaXMgaXMgdGhlIGNsYXNzIHRoYXQgd2FzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgcHJpbWFyeSBkZXNjcmlwdG9yIHBvb2wKLSAgLy8gd2hpY2ggY29udGFpbnMgdGhpcyBkZXNjcmlwdG9yLgotICAvLyBUaGlzIG1pZ2h0IG5vdCBiZSB0aGUgb25lIHlvdSBleHBlY3QhIEZvciBleGFtcGxlIHRoZSByZXR1cm5lZCBvYmplY3QgZG9lcwotICAvLyBub3Qga25vdyBhYm91dCBleHRlbnNpb25zIGRlZmluZWQgaW4gYSBjdXN0b20gcG9vbC4KLSAgQ01lc3NhZ2VDbGFzcyogY29uY3JldGVfY2xhc3MoY2Rlc2NyaXB0b3JfcG9vbDo6R2V0TWVzc2FnZUNsYXNzKAotICAgICAgR2V0RGVzY3JpcHRvclBvb2xfRnJvbVBvb2woX0dldERlc2NyaXB0b3Ioc2VsZiktPmZpbGUoKS0+cG9vbCgpKSwKLSAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpKSk7Ci0gIFB5X1hJTkNSRUYoY29uY3JldGVfY2xhc3MpOwotICByZXR1cm4gY29uY3JldGVfY2xhc3MtPkFzUHlPYmplY3QoKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRGaWVsZHNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gTmV3TWVzc2FnZUZpZWxkc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RmllbGRzQnlDYW1lbGNhc2VOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdNZXNzYWdlRmllbGRzQnlDYW1lbGNhc2VOYW1lKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRGaWVsZHNCeU51bWJlcihQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdNZXNzYWdlRmllbGRzQnlOdW1iZXIoX0dldERlc2NyaXB0b3Ioc2VsZikpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEZpZWxkc1NlcShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdNZXNzYWdlRmllbGRzU2VxKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXROZXN0ZWRUeXBlc0J5TmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdNZXNzYWdlTmVzdGVkVHlwZXNCeU5hbWUoX0dldERlc2NyaXB0b3Ioc2VsZikpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldE5lc3RlZFR5cGVzU2VxKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIE5ld01lc3NhZ2VOZXN0ZWRUeXBlc1NlcShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9uc0J5TmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdNZXNzYWdlRXh0ZW5zaW9uc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9ucyhQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdNZXNzYWdlRXh0ZW5zaW9uc1NlcShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RW51bXNTZXEoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gTmV3TWVzc2FnZUVudW1zU2VxKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRFbnVtVHlwZXNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gTmV3TWVzc2FnZUVudW1zQnlOYW1lKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRFbnVtVmFsdWVzQnlOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIE5ld01lc3NhZ2VFbnVtVmFsdWVzQnlOYW1lKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRPbmVvZnNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gTmV3TWVzc2FnZU9uZW9mc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0T25lb2ZzU2VxKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIE5ld01lc3NhZ2VPbmVvZnNTZXEoX0dldERlc2NyaXB0b3Ioc2VsZikpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIElzRXh0ZW5kYWJsZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIGlmIChfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgUHlfUkVUVVJOX1RSVUU7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX0ZBTFNFOwotICB9Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9uUmFuZ2VzKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IF9HZXREZXNjcmlwdG9yKHNlbGYpOwotICBQeU9iamVjdCogcmFuZ2VfbGlzdCA9IFB5TGlzdF9OZXcoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9IGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZShpKTsKLSAgICBQeU9iamVjdCogc3RhcnQgPSBQeUludF9Gcm9tTG9uZyhyYW5nZS0+c3RhcnQpOwotICAgIFB5T2JqZWN0KiBlbmQgPSBQeUludF9Gcm9tTG9uZyhyYW5nZS0+ZW5kKTsKLSAgICBQeUxpc3RfU2V0SXRlbShyYW5nZV9saXN0LCBpLCBQeVR1cGxlX1BhY2soMiwgc3RhcnQsIGVuZCkpOwotICB9Ci0KLSAgcmV0dXJuIHJhbmdlX2xpc3Q7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0Q29udGFpbmluZ1R5cGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUgPQotICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPmNvbnRhaW5pbmdfdHlwZSgpOwotICBpZiAoY29udGFpbmluZ190eXBlKSB7Ci0gICAgcmV0dXJuIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoY29udGFpbmluZ190eXBlKTsKLSAgfSBlbHNlIHsKLSAgICBQeV9SRVRVUk5fTk9ORTsKLSAgfQotfQotCi1zdGF0aWMgaW50IFNldENvbnRhaW5pbmdUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiY29udGFpbmluZ190eXBlIik7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0SGFzT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5vcHRpb25zKCkpOwotICBpZiAoJm9wdGlvbnMgIT0gJk1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKLSAgICBQeV9SRVRVUk5fVFJVRTsKLSAgfSBlbHNlIHsKLSAgICBQeV9SRVRVUk5fRkFMU0U7Ci0gIH0KLX0KLXN0YXRpYyBpbnQgU2V0SGFzT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoImhhc19vcHRpb25zIik7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmKSB7Ci0gIHJldHVybiBHZXRPckJ1aWxkT3B0aW9ucyhfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBpbnQgU2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiX29wdGlvbnMiKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDb3B5VG9Qcm90byhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdGFyZ2V0KSB7Ci0gIHJldHVybiBDb3B5VG9QeXRob25Qcm90bzxEZXNjcmlwdG9yUHJvdG8+KF9HZXREZXNjcmlwdG9yKHNlbGYpLCB0YXJnZXQpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEVudW1WYWx1ZU5hbWUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKmFyZ3MpIHsKLSAgY29uc3QgY2hhciAqZW51bV9uYW1lOwotICBpbnQgbnVtYmVyOwotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgInNpIiwgJmVudW1fbmFtZSwgJm51bWJlcikpCi0gICAgcmV0dXJuIE5VTEw7Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yICplbnVtX3R5cGUgPQotICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRFbnVtVHlwZUJ5TmFtZShlbnVtX25hbWUpOwotICBpZiAoZW51bV90eXBlID09IE5VTEwpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsIGVudW1fbmFtZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciAqZW51bV92YWx1ZSA9Ci0gICAgICBlbnVtX3R5cGUtPkZpbmRWYWx1ZUJ5TnVtYmVyKG51bWJlcik7Ci0gIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICIlZCIsIG51bWJlcik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoZW51bV92YWx1ZS0+bmFtZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRTeW50YXgoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlTdHJpbmdfSW50ZXJuRnJvbVN0cmluZygKLSAgICAgIEZpbGVEZXNjcmlwdG9yOjpTeW50YXhOYW1lKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5maWxlKCktPnN5bnRheCgpKSk7Ci19Ci0KLXN0YXRpYyBQeUdldFNldERlZiBHZXR0ZXJzW10gPSB7Ci0gIHsgIm5hbWUiLCAoZ2V0dGVyKUdldE5hbWUsIE5VTEwsICJMYXN0IG5hbWUifSwKLSAgeyAiZnVsbF9uYW1lIiwgKGdldHRlcilHZXRGdWxsTmFtZSwgTlVMTCwgIkZ1bGwgbmFtZSJ9LAotICB7ICJfY29uY3JldGVfY2xhc3MiLCAoZ2V0dGVyKUdldENvbmNyZXRlQ2xhc3MsIE5VTEwsICJjb25jcmV0ZSBjbGFzcyJ9LAotICB7ICJmaWxlIiwgKGdldHRlcilHZXRGaWxlLCBOVUxMLCAiRmlsZSBkZXNjcmlwdG9yIn0sCi0KLSAgeyAiZmllbGRzIiwgKGdldHRlcilHZXRGaWVsZHNTZXEsIE5VTEwsICJGaWVsZHMgc2VxdWVuY2UifSwKLSAgeyAiZmllbGRzX2J5X25hbWUiLCAoZ2V0dGVyKUdldEZpZWxkc0J5TmFtZSwgTlVMTCwgIkZpZWxkcyBieSBuYW1lIn0sCi0gIHsgImZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZSIsIChnZXR0ZXIpR2V0RmllbGRzQnlDYW1lbGNhc2VOYW1lLCBOVUxMLAotICAgICJGaWVsZHMgYnkgY2FtZWxDYXNlIG5hbWUifSwKLSAgeyAiZmllbGRzX2J5X251bWJlciIsIChnZXR0ZXIpR2V0RmllbGRzQnlOdW1iZXIsIE5VTEwsICJGaWVsZHMgYnkgbnVtYmVyIn0sCi0gIHsgIm5lc3RlZF90eXBlcyIsIChnZXR0ZXIpR2V0TmVzdGVkVHlwZXNTZXEsIE5VTEwsICJOZXN0ZWQgdHlwZXMgc2VxdWVuY2UifSwKLSAgeyAibmVzdGVkX3R5cGVzX2J5X25hbWUiLCAoZ2V0dGVyKUdldE5lc3RlZFR5cGVzQnlOYW1lLCBOVUxMLAotICAgICJOZXN0ZWQgdHlwZXMgYnkgbmFtZSJ9LAotICB7ICJleHRlbnNpb25zIiwgKGdldHRlcilHZXRFeHRlbnNpb25zLCBOVUxMLCAiRXh0ZW5zaW9ucyBTZXF1ZW5jZSJ9LAotICB7ICJleHRlbnNpb25zX2J5X25hbWUiLCAoZ2V0dGVyKUdldEV4dGVuc2lvbnNCeU5hbWUsIE5VTEwsCi0gICAgIkV4dGVuc2lvbnMgYnkgbmFtZSJ9LAotICB7ICJleHRlbnNpb25fcmFuZ2VzIiwgKGdldHRlcilHZXRFeHRlbnNpb25SYW5nZXMsIE5VTEwsICJFeHRlbnNpb24gcmFuZ2VzIn0sCi0gIHsgImVudW1fdHlwZXMiLCAoZ2V0dGVyKUdldEVudW1zU2VxLCBOVUxMLCAiRW51bSBzZXF1ZW5jZSJ9LAotICB7ICJlbnVtX3R5cGVzX2J5X25hbWUiLCAoZ2V0dGVyKUdldEVudW1UeXBlc0J5TmFtZSwgTlVMTCwKLSAgICAiRW51bSB0eXBlcyBieSBuYW1lIn0sCi0gIHsgImVudW1fdmFsdWVzX2J5X25hbWUiLCAoZ2V0dGVyKUdldEVudW1WYWx1ZXNCeU5hbWUsIE5VTEwsCi0gICAgIkVudW0gdmFsdWVzIGJ5IG5hbWUifSwKLSAgeyAib25lb2ZzX2J5X25hbWUiLCAoZ2V0dGVyKUdldE9uZW9mc0J5TmFtZSwgTlVMTCwgIk9uZW9mcyBieSBuYW1lIn0sCi0gIHsgIm9uZW9mcyIsIChnZXR0ZXIpR2V0T25lb2ZzU2VxLCBOVUxMLCAiT25lb2ZzIGJ5IG5hbWUifSwKLSAgeyAiY29udGFpbmluZ190eXBlIiwgKGdldHRlcilHZXRDb250YWluaW5nVHlwZSwgKHNldHRlcilTZXRDb250YWluaW5nVHlwZSwKLSAgICAiQ29udGFpbmluZyB0eXBlIn0sCi0gIHsgImlzX2V4dGVuZGFibGUiLCAoZ2V0dGVyKUlzRXh0ZW5kYWJsZSwgKHNldHRlcilOVUxMfSwKLSAgeyAiaGFzX29wdGlvbnMiLCAoZ2V0dGVyKUdldEhhc09wdGlvbnMsIChzZXR0ZXIpU2V0SGFzT3B0aW9ucywgIkhhcyBPcHRpb25zIn0sCi0gIHsgIl9vcHRpb25zIiwgKGdldHRlcilOVUxMLCAoc2V0dGVyKVNldE9wdGlvbnMsICJPcHRpb25zIn0sCi0gIHsgInN5bnRheCIsIChnZXR0ZXIpR2V0U3ludGF4LCAoc2V0dGVyKU5VTEwsICJTeW50YXgifSwKLSAge05VTEx9Ci19OwotCi1zdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0gewotICB7ICJHZXRPcHRpb25zIiwgKFB5Q0Z1bmN0aW9uKUdldE9wdGlvbnMsIE1FVEhfTk9BUkdTLCB9LAotICB7ICJDb3B5VG9Qcm90byIsIChQeUNGdW5jdGlvbilDb3B5VG9Qcm90bywgTUVUSF9PLCB9LAotICB7ICJFbnVtVmFsdWVOYW1lIiwgKFB5Q0Z1bmN0aW9uKUVudW1WYWx1ZU5hbWUsIE1FVEhfVkFSQVJHUywgfSwKLSAge05VTEx9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVzc2FnZV9kZXNjcmlwdG9yCi0KLVB5VHlwZU9iamVjdCBQeU1lc3NhZ2VEZXNjcmlwdG9yX1R5cGUgPSB7Ci0gIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gIEZVTExfTU9EVUxFX05BTUUgIi5NZXNzYWdlRGVzY3JpcHRvciIsICAvLyB0cF9uYW1lCi0gIHNpemVvZihQeUJhc2VEZXNjcmlwdG9yKSwgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKLSAgIkEgTWVzc2FnZSBEZXNjcmlwdG9yIiwgICAgICAgICAgICAgICAvLyB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAotICBtZXNzYWdlX2Rlc2NyaXB0b3I6Ok1ldGhvZHMsICAgICAgICAgIC8vIHRwX21ldGhvZHMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCi0gIG1lc3NhZ2VfZGVzY3JpcHRvcjo6R2V0dGVycywgICAgICAgICAgLy8gdHBfZ2V0c2V0Ci0gICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUsICAgLy8gdHBfYmFzZQotfTsKLQotUHlPYmplY3QqIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoCi0gICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV9kZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yOjpOZXdJbnRlcm5lZERlc2NyaXB0b3IoCi0gICAgICAmUHlNZXNzYWdlRGVzY3JpcHRvcl9UeXBlLCBtZXNzYWdlX2Rlc2NyaXB0b3IsIE5VTEwpOwotfQotCi1jb25zdCBEZXNjcmlwdG9yKiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihQeU9iamVjdCogb2JqKSB7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgJlB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTm90IGEgTWVzc2FnZURlc2NyaXB0b3IiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBEZXNjcmlwdG9yKj4oCi0gICAgICByZWludGVycHJldF9jYXN0PFB5QmFzZURlc2NyaXB0b3IqPihvYmopLT5kZXNjcmlwdG9yKTsKLX0KLQotbmFtZXNwYWNlIGZpZWxkX2Rlc2NyaXB0b3IgewotCi0vLyBVbmNoZWNrZWQgYWNjZXNzb3IgdG8gdGhlIEMrKyBwb2ludGVyLgotc3RhdGljIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogX0dldERlc2NyaXB0b3IoCi0gICAgUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGaWVsZERlc2NyaXB0b3IqPihzZWxmLT5kZXNjcmlwdG9yKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRGdWxsTmFtZShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5mdWxsX25hbWUoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0TmFtZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5uYW1lKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldENhbWVsY2FzZU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0VHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeUludF9Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+dHlwZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRDcHBUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5jcHBfdHlwZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRMYWJlbChQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeUludF9Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+bGFiZWwoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0TnVtYmVyKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5udW1iZXIoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0SW5kZXgoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPmluZGV4KCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldElEKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5TG9uZ19Gcm9tVm9pZFB0cihzZWxmKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBJc0V4dGVuc2lvbihQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPmlzX2V4dGVuc2lvbigpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBIYXNEZWZhdWx0VmFsdWUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXREZWZhdWx0VmFsdWUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBQeU9iamVjdCAqcmVzdWx0OwotCi0gIHN3aXRjaCAoX0dldERlc2NyaXB0b3Ioc2VsZiktPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogewotICAgICAgaW50MzIgdmFsdWUgPSBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpOwotICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7Ci0gICAgICBpbnQ2NCB2YWx1ZSA9IF9HZXREZXNjcmlwdG9yKHNlbGYpLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCk7Ci0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIHVpbnQzMiB2YWx1ZSA9IF9HZXREZXNjcmlwdG9yKHNlbGYpLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpOwotICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbVNpemVfdCh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7Ci0gICAgICB1aW50NjQgdmFsdWUgPSBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKTsKLSAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKLSAgICAgIGZsb2F0IHZhbHVlID0gX0dldERlc2NyaXB0b3Ioc2VsZiktPmRlZmF1bHRfdmFsdWVfZmxvYXQoKTsKLSAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7Ci0gICAgICBkb3VibGUgdmFsdWUgPSBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKTsKLSAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogewotICAgICAgYm9vbCB2YWx1ZSA9IF9HZXREZXNjcmlwdG9yKHNlbGYpLT5kZWZhdWx0X3ZhbHVlX2Jvb2woKTsKLSAgICAgIHJlc3VsdCA9IFB5Qm9vbF9Gcm9tTG9uZyh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICBzdHJpbmcgdmFsdWUgPSBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKTsKLSAgICAgIHJlc3VsdCA9IFRvU3RyaW5nT2JqZWN0KF9HZXREZXNjcmlwdG9yKHNlbGYpLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPQotICAgICAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5kZWZhdWx0X3ZhbHVlX2VudW0oKTsKLSAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKHZhbHVlLT5udW1iZXIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yLCAiZGVmYXVsdCB2YWx1ZSBmb3IgJXMiLAotICAgICAgICAgICAgICAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0Q0Rlc2NyaXB0b3IoUHlPYmplY3QgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgUHlfSU5DUkVGKHNlbGYpOwotICByZXR1cm4gc2VsZjsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICpHZXRFbnVtVHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZW51bV90eXBlKCk7Ci0gIGlmIChlbnVtX3R5cGUpIHsKLSAgICByZXR1cm4gUHlFbnVtRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihlbnVtX3R5cGUpOwotICB9IGVsc2UgewotICAgIFB5X1JFVFVSTl9OT05FOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgU2V0RW51bVR5cGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJlbnVtX3R5cGUiKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0ICpHZXRNZXNzYWdlVHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSA9IF9HZXREZXNjcmlwdG9yKHNlbGYpLT5tZXNzYWdlX3R5cGUoKTsKLSAgaWYgKG1lc3NhZ2VfdHlwZSkgewotICAgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKG1lc3NhZ2VfdHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLX0KLQotc3RhdGljIGludCBTZXRNZXNzYWdlVHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoIm1lc3NhZ2VfdHlwZSIpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldENvbnRhaW5pbmdUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlID0KLSAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5jb250YWluaW5nX3R5cGUoKTsKLSAgaWYgKGNvbnRhaW5pbmdfdHlwZSkgewotICAgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGNvbnRhaW5pbmdfdHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLX0KLQotc3RhdGljIGludCBTZXRDb250YWluaW5nVHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoImNvbnRhaW5pbmdfdHlwZSIpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEV4dGVuc2lvblNjb3BlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5zaW9uX3Njb3BlID0KLSAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5leHRlbnNpb25fc2NvcGUoKTsKLSAgaWYgKGV4dGVuc2lvbl9zY29wZSkgewotICAgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGV4dGVuc2lvbl9zY29wZSk7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRDb250YWluaW5nT25lb2YoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGNvbnRhaW5pbmdfb25lb2YgPQotICAgICAgX0dldERlc2NyaXB0b3Ioc2VsZiktPmNvbnRhaW5pbmdfb25lb2YoKTsKLSAgaWYgKGNvbnRhaW5pbmdfb25lb2YpIHsKLSAgICByZXR1cm4gUHlPbmVvZkRlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoY29udGFpbmluZ19vbmVvZik7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLX0KLQotc3RhdGljIGludCBTZXRDb250YWluaW5nT25lb2YoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiY29udGFpbmluZ19vbmVvZiIpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCBGaWVsZE9wdGlvbnMmIG9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZiktPm9wdGlvbnMoKSk7Ci0gIGlmICgmb3B0aW9ucyAhPSAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKLSAgICBQeV9SRVRVUk5fVFJVRTsKLSAgfSBlbHNlIHsKLSAgICBQeV9SRVRVUk5fRkFMU0U7Ci0gIH0KLX0KLXN0YXRpYyBpbnQgU2V0SGFzT3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiaGFzX29wdGlvbnMiKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYpIHsKLSAgcmV0dXJuIEdldE9yQnVpbGRPcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIGludCBTZXRPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJfb3B0aW9ucyIpOwotfQotCi0KLXN0YXRpYyBQeUdldFNldERlZiBHZXR0ZXJzW10gPSB7Ci0gIHsgImZ1bGxfbmFtZSIsIChnZXR0ZXIpR2V0RnVsbE5hbWUsIE5VTEwsICJGdWxsIG5hbWUifSwKLSAgeyAibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgTlVMTCwgIlVucXVhbGlmaWVkIG5hbWUifSwKLSAgeyAiY2FtZWxjYXNlX25hbWUiLCAoZ2V0dGVyKUdldENhbWVsY2FzZU5hbWUsIE5VTEwsICJDYW1lbGNhc2UgbmFtZSJ9LAotICB7ICJ0eXBlIiwgKGdldHRlcilHZXRUeXBlLCBOVUxMLCAiQysrIFR5cGUifSwKLSAgeyAiY3BwX3R5cGUiLCAoZ2V0dGVyKUdldENwcFR5cGUsIE5VTEwsICJDKysgVHlwZSJ9LAotICB7ICJsYWJlbCIsIChnZXR0ZXIpR2V0TGFiZWwsIE5VTEwsICJMYWJlbCJ9LAotICB7ICJudW1iZXIiLCAoZ2V0dGVyKUdldE51bWJlciwgTlVMTCwgIk51bWJlciJ9LAotICB7ICJpbmRleCIsIChnZXR0ZXIpR2V0SW5kZXgsIE5VTEwsICJJbmRleCJ9LAotICB7ICJkZWZhdWx0X3ZhbHVlIiwgKGdldHRlcilHZXREZWZhdWx0VmFsdWUsIE5VTEwsICJEZWZhdWx0IFZhbHVlIn0sCi0gIHsgImhhc19kZWZhdWx0X3ZhbHVlIiwgKGdldHRlcilIYXNEZWZhdWx0VmFsdWV9LAotICB7ICJpc19leHRlbnNpb24iLCAoZ2V0dGVyKUlzRXh0ZW5zaW9uLCBOVUxMLCAiSUQifSwKLSAgeyAiaWQiLCAoZ2V0dGVyKUdldElELCBOVUxMLCAiSUQifSwKLSAgeyAiX2NkZXNjcmlwdG9yIiwgKGdldHRlcilHZXRDRGVzY3JpcHRvciwgTlVMTCwgIkhBQUNLIFJFTU9WRSBNRSJ9LAotCi0gIHsgIm1lc3NhZ2VfdHlwZSIsIChnZXR0ZXIpR2V0TWVzc2FnZVR5cGUsIChzZXR0ZXIpU2V0TWVzc2FnZVR5cGUsCi0gICAgIk1lc3NhZ2UgdHlwZSJ9LAotICB7ICJlbnVtX3R5cGUiLCAoZ2V0dGVyKUdldEVudW1UeXBlLCAoc2V0dGVyKVNldEVudW1UeXBlLCAiRW51bSB0eXBlIn0sCi0gIHsgImNvbnRhaW5pbmdfdHlwZSIsIChnZXR0ZXIpR2V0Q29udGFpbmluZ1R5cGUsIChzZXR0ZXIpU2V0Q29udGFpbmluZ1R5cGUsCi0gICAgIkNvbnRhaW5pbmcgdHlwZSJ9LAotICB7ICJleHRlbnNpb25fc2NvcGUiLCAoZ2V0dGVyKUdldEV4dGVuc2lvblNjb3BlLCAoc2V0dGVyKU5VTEwsCi0gICAgIkV4dGVuc2lvbiBzY29wZSJ9LAotICB7ICJjb250YWluaW5nX29uZW9mIiwgKGdldHRlcilHZXRDb250YWluaW5nT25lb2YsIChzZXR0ZXIpU2V0Q29udGFpbmluZ09uZW9mLAotICAgICJDb250YWluaW5nIG9uZW9mIn0sCi0gIHsgImhhc19vcHRpb25zIiwgKGdldHRlcilHZXRIYXNPcHRpb25zLCAoc2V0dGVyKVNldEhhc09wdGlvbnMsICJIYXMgT3B0aW9ucyJ9LAotICB7ICJfb3B0aW9ucyIsIChnZXR0ZXIpTlVMTCwgKHNldHRlcilTZXRPcHRpb25zLCAiT3B0aW9ucyJ9LAotICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBNZXRob2RzW10gPSB7Ci0gIHsgIkdldE9wdGlvbnMiLCAoUHlDRnVuY3Rpb24pR2V0T3B0aW9ucywgTUVUSF9OT0FSR1MsIH0sCi0gIHtOVUxMfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGZpZWxkX2Rlc2NyaXB0b3IKLQotUHlUeXBlT2JqZWN0IFB5RmllbGREZXNjcmlwdG9yX1R5cGUgPSB7Ci0gIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gIEZVTExfTU9EVUxFX05BTUUgIi5GaWVsZERlc2NyaXB0b3IiLCAgLy8gdHBfbmFtZQotICBzaXplb2YoUHlCYXNlRGVzY3JpcHRvciksICAgICAgICAgICAgIC8vIHRwX2Jhc2ljc2l6ZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZW1zaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVhbGxvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3ByaW50Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgotICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZsYWdzCi0gICJBIEZpZWxkIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgICAgLy8gdHBfZG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKLSAgZmllbGRfZGVzY3JpcHRvcjo6TWV0aG9kcywgICAgICAgICAgICAvLyB0cF9tZXRob2RzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycwotICBmaWVsZF9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgICAgIC8vIHRwX2dldHNldAotICAmZGVzY3JpcHRvcjo6UHlCYXNlRGVzY3JpcHRvcl9UeXBlLCAgIC8vIHRwX2Jhc2UKLX07Ci0KLVB5T2JqZWN0KiBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld0ludGVybmVkRGVzY3JpcHRvcigKLSAgICAgICZQeUZpZWxkRGVzY3JpcHRvcl9UeXBlLCBmaWVsZF9kZXNjcmlwdG9yLCBOVUxMKTsKLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKiBQeUZpZWxkRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoUHlPYmplY3QqIG9iaikgewotICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhvYmosICZQeUZpZWxkRGVzY3JpcHRvcl9UeXBlKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOb3QgYSBGaWVsZERlc2NyaXB0b3IiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBGaWVsZERlc2NyaXB0b3IqPigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KG9iaiktPmRlc2NyaXB0b3IpOwotfQotCi1uYW1lc3BhY2UgZW51bV9kZXNjcmlwdG9yIHsKLQotLy8gVW5jaGVja2VkIGFjY2Vzc29yIHRvIHRoZSBDKysgcG9pbnRlci4KLXN0YXRpYyBjb25zdCBFbnVtRGVzY3JpcHRvciogX0dldERlc2NyaXB0b3IoCi0gICAgUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFbnVtRGVzY3JpcHRvcio+KHNlbGYtPmRlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEZ1bGxOYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPmZ1bGxfbmFtZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXROYW1lKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPm5hbWUoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RmlsZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5maWxlKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEVudW12YWx1ZXNCeU5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gTmV3RW51bVZhbHVlc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RW51bXZhbHVlc0J5TnVtYmVyKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIE5ld0VudW1WYWx1ZXNCeU51bWJlcihfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RW51bXZhbHVlc1NlcShQeUJhc2VEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdFbnVtVmFsdWVzU2VxKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRDb250YWluaW5nVHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSA9Ci0gICAgICBfR2V0RGVzY3JpcHRvcihzZWxmKS0+Y29udGFpbmluZ190eXBlKCk7Ci0gIGlmIChjb250YWluaW5nX3R5cGUpIHsKLSAgICByZXR1cm4gUHlNZXNzYWdlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihjb250YWluaW5nX3R5cGUpOwotICB9IGVsc2UgewotICAgIFB5X1JFVFVSTl9OT05FOwotICB9Ci19Ci0KLXN0YXRpYyBpbnQgU2V0Q29udGFpbmluZ1R5cGUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJjb250YWluaW5nX3R5cGUiKTsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCBFbnVtT3B0aW9ucyYgb3B0aW9ucyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+b3B0aW9ucygpKTsKLSAgaWYgKCZvcHRpb25zICE9ICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7Ci0gICAgUHlfUkVUVVJOX1RSVUU7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX0ZBTFNFOwotICB9Ci19Ci1zdGF0aWMgaW50IFNldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoImhhc19vcHRpb25zIik7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmKSB7Ci0gIHJldHVybiBHZXRPckJ1aWxkT3B0aW9ucyhfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBpbnQgU2V0T3B0aW9ucyhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gQ2hlY2tDYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgiX29wdGlvbnMiKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDb3B5VG9Qcm90byhQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdGFyZ2V0KSB7Ci0gIHJldHVybiBDb3B5VG9QeXRob25Qcm90bzxFbnVtRGVzY3JpcHRvclByb3RvPihfR2V0RGVzY3JpcHRvcihzZWxmKSwgdGFyZ2V0KTsKLX0KLQotc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKLSAgeyAiR2V0T3B0aW9ucyIsIChQeUNGdW5jdGlvbilHZXRPcHRpb25zLCBNRVRIX05PQVJHUywgfSwKLSAgeyAiQ29weVRvUHJvdG8iLCAoUHlDRnVuY3Rpb24pQ29weVRvUHJvdG8sIE1FVEhfTywgfSwKLSAge05VTEx9Ci19OwotCi1zdGF0aWMgUHlHZXRTZXREZWYgR2V0dGVyc1tdID0gewotICB7ICJmdWxsX25hbWUiLCAoZ2V0dGVyKUdldEZ1bGxOYW1lLCBOVUxMLCAiRnVsbCBuYW1lIn0sCi0gIHsgIm5hbWUiLCAoZ2V0dGVyKUdldE5hbWUsIE5VTEwsICJsYXN0IG5hbWUifSwKLSAgeyAiZmlsZSIsIChnZXR0ZXIpR2V0RmlsZSwgTlVMTCwgIkZpbGUgZGVzY3JpcHRvciJ9LAotICB7ICJ2YWx1ZXMiLCAoZ2V0dGVyKUdldEVudW12YWx1ZXNTZXEsIE5VTEwsICJ2YWx1ZXMifSwKLSAgeyAidmFsdWVzX2J5X25hbWUiLCAoZ2V0dGVyKUdldEVudW12YWx1ZXNCeU5hbWUsIE5VTEwsCi0gICAgIkVudW0gdmFsdWVzIGJ5IG5hbWUifSwKLSAgeyAidmFsdWVzX2J5X251bWJlciIsIChnZXR0ZXIpR2V0RW51bXZhbHVlc0J5TnVtYmVyLCBOVUxMLAotICAgICJFbnVtIHZhbHVlcyBieSBudW1iZXIifSwKLQotICB7ICJjb250YWluaW5nX3R5cGUiLCAoZ2V0dGVyKUdldENvbnRhaW5pbmdUeXBlLCAoc2V0dGVyKVNldENvbnRhaW5pbmdUeXBlLAotICAgICJDb250YWluaW5nIHR5cGUifSwKLSAgeyAiaGFzX29wdGlvbnMiLCAoZ2V0dGVyKUdldEhhc09wdGlvbnMsIChzZXR0ZXIpU2V0SGFzT3B0aW9ucywgIkhhcyBPcHRpb25zIn0sCi0gIHsgIl9vcHRpb25zIiwgKGdldHRlcilOVUxMLCAoc2V0dGVyKVNldE9wdGlvbnMsICJPcHRpb25zIn0sCi0gIHtOVUxMfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGVudW1fZGVzY3JpcHRvcgotCi1QeVR5cGVPYmplY3QgUHlFbnVtRGVzY3JpcHRvcl9UeXBlID0gewotICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotICBGVUxMX01PRFVMRV9OQU1FICIuRW51bURlc2NyaXB0b3IiLCAgIC8vIHRwX25hbWUKLSAgc2l6ZW9mKFB5QmFzZURlc2NyaXB0b3IpLCAgICAgICAgICAgICAvLyB0cF9iYXNpY3NpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RlYWxsb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9wcmludAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKLSAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncwotICAiQSBFbnVtIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgICAgIC8vIHRwX2RvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0Ci0gIGVudW1fZGVzY3JpcHRvcjo6TWV0aG9kcywgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycwotICBlbnVtX2Rlc2NyaXB0b3I6OkdldHRlcnMsICAgICAgICAgICAgIC8vIHRwX2dldHNldAotICAmZGVzY3JpcHRvcjo6UHlCYXNlRGVzY3JpcHRvcl9UeXBlLCAgIC8vIHRwX2Jhc2UKLX07Ci0KLVB5T2JqZWN0KiBQeUVudW1EZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKAotICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld0ludGVybmVkRGVzY3JpcHRvcigKLSAgICAgICZQeUVudW1EZXNjcmlwdG9yX1R5cGUsIGVudW1fZGVzY3JpcHRvciwgTlVMTCk7Ci19Ci0KLWNvbnN0IEVudW1EZXNjcmlwdG9yKiBQeUVudW1EZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihQeU9iamVjdCogb2JqKSB7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG9iaiwgJlB5RW51bURlc2NyaXB0b3JfVHlwZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTm90IGFuIEVudW1EZXNjcmlwdG9yIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRW51bURlc2NyaXB0b3IqPigKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlCYXNlRGVzY3JpcHRvcio+KG9iaiktPmRlc2NyaXB0b3IpOwotfQotCi1uYW1lc3BhY2UgZW51bXZhbHVlX2Rlc2NyaXB0b3IgewotCi0vLyBVbmNoZWNrZWQgYWNjZXNzb3IgdG8gdGhlIEMrKyBwb2ludGVyLgotc3RhdGljIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIF9HZXREZXNjcmlwdG9yKAotICAgIFB5QmFzZURlc2NyaXB0b3IgKnNlbGYpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcio+KHNlbGYtPmRlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldE5hbWUoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+bmFtZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXROdW1iZXIoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPm51bWJlcigpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRJbmRleChQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeUludF9Gcm9tTG9uZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+aW5kZXgoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0VHlwZShQeUJhc2VEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeUVudW1EZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKF9HZXREZXNjcmlwdG9yKHNlbGYpLT50eXBlKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEhhc09wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBvcHRpb25zKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5vcHRpb25zKCkpOwotICBpZiAoJm9wdGlvbnMgIT0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgewotICAgIFB5X1JFVFVSTl9UUlVFOwotICB9IGVsc2UgewotICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgfQotfQotc3RhdGljIGludCBTZXRIYXNPcHRpb25zKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJoYXNfb3B0aW9ucyIpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldE9wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgewotICByZXR1cm4gR2V0T3JCdWlsZE9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZikpOwotfQotCi1zdGF0aWMgaW50IFNldE9wdGlvbnMoUHlCYXNlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoIl9vcHRpb25zIik7Ci19Ci0KLQotc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKLSAgeyAibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgTlVMTCwgIm5hbWUifSwKLSAgeyAibnVtYmVyIiwgKGdldHRlcilHZXROdW1iZXIsIE5VTEwsICJudW1iZXIifSwKLSAgeyAiaW5kZXgiLCAoZ2V0dGVyKUdldEluZGV4LCBOVUxMLCAiaW5kZXgifSwKLSAgeyAidHlwZSIsIChnZXR0ZXIpR2V0VHlwZSwgTlVMTCwgImluZGV4In0sCi0KLSAgeyAiaGFzX29wdGlvbnMiLCAoZ2V0dGVyKUdldEhhc09wdGlvbnMsIChzZXR0ZXIpU2V0SGFzT3B0aW9ucywgIkhhcyBPcHRpb25zIn0sCi0gIHsgIl9vcHRpb25zIiwgKGdldHRlcilOVUxMLCAoc2V0dGVyKVNldE9wdGlvbnMsICJPcHRpb25zIn0sCi0gIHtOVUxMfQotfTsKLQotc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKLSAgeyAiR2V0T3B0aW9ucyIsIChQeUNGdW5jdGlvbilHZXRPcHRpb25zLCBNRVRIX05PQVJHUywgfSwKLSAge05VTEx9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZW51bXZhbHVlX2Rlc2NyaXB0b3IKLQotUHlUeXBlT2JqZWN0IFB5RW51bVZhbHVlRGVzY3JpcHRvcl9UeXBlID0gewotICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotICBGVUxMX01PRFVMRV9OQU1FICIuRW51bVZhbHVlRGVzY3JpcHRvciIsICAvLyB0cF9uYW1lCi0gIHNpemVvZihQeUJhc2VEZXNjcmlwdG9yKSwgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKLSAgIkEgRW51bVZhbHVlIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAvLyB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAotICBlbnVtdmFsdWVfZGVzY3JpcHRvcjo6TWV0aG9kcywgICAgICAgIC8vIHRwX21ldGhvZHMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCi0gIGVudW12YWx1ZV9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgLy8gdHBfZ2V0c2V0Ci0gICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUsICAgLy8gdHBfYmFzZQotfTsKLQotUHlPYmplY3QqIFB5RW51bVZhbHVlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtdmFsdWVfZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3SW50ZXJuZWREZXNjcmlwdG9yKAotICAgICAgJlB5RW51bVZhbHVlRGVzY3JpcHRvcl9UeXBlLCBlbnVtdmFsdWVfZGVzY3JpcHRvciwgTlVMTCk7Ci19Ci0KLW5hbWVzcGFjZSBmaWxlX2Rlc2NyaXB0b3IgewotCi0vLyBVbmNoZWNrZWQgYWNjZXNzb3IgdG8gdGhlIEMrKyBwb2ludGVyLgotc3RhdGljIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBfR2V0RGVzY3JpcHRvcihQeUZpbGVEZXNjcmlwdG9yICpzZWxmKSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4oc2VsZi0+YmFzZS5kZXNjcmlwdG9yKTsKLX0KLQotc3RhdGljIHZvaWQgRGVhbGxvYyhQeUZpbGVEZXNjcmlwdG9yKiBzZWxmKSB7Ci0gIFB5X1hERUNSRUYoc2VsZi0+c2VyaWFsaXplZF9wYik7Ci0gIGRlc2NyaXB0b3I6OkRlYWxsb2MoJnNlbGYtPmJhc2UpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldFBvb2woUHlGaWxlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBQeU9iamVjdCogcG9vbCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgIEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5wb29sKCkpKTsKLSAgUHlfWElOQ1JFRihwb29sKTsKLSAgcmV0dXJuIHBvb2w7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0TmFtZShQeUZpbGVEZXNjcmlwdG9yICpzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBQeVN0cmluZ19Gcm9tQ3BwU3RyaW5nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5uYW1lKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldFBhY2thZ2UoUHlGaWxlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+cGFja2FnZSgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRTZXJpYWxpemVkUGIoUHlGaWxlRGVzY3JpcHRvciAqc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBQeU9iamVjdCAqc2VyaWFsaXplZF9wYiA9IHNlbGYtPnNlcmlhbGl6ZWRfcGI7Ci0gIGlmIChzZXJpYWxpemVkX3BiICE9IE5VTEwpIHsKLSAgICBQeV9JTkNSRUYoc2VyaWFsaXplZF9wYik7Ci0gICAgcmV0dXJuIHNlcmlhbGl6ZWRfcGI7Ci0gIH0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBfR2V0RGVzY3JpcHRvcihzZWxmKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKLSAgc3RyaW5nIGNvbnRlbnRzOwotICBmaWxlX3Byb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygmY29udGVudHMpOwotICBzZWxmLT5zZXJpYWxpemVkX3BiID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgIGNvbnRlbnRzLmNfc3RyKCksIGNvbnRlbnRzLnNpemUoKSk7Ci0gIGlmIChzZWxmLT5zZXJpYWxpemVkX3BiID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9JTkNSRUYoc2VsZi0+c2VyaWFsaXplZF9wYik7Ci0gIHJldHVybiBzZWxmLT5zZXJpYWxpemVkX3BiOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldE1lc3NhZ2VUeXBlc0J5TmFtZShQeUZpbGVEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdGaWxlTWVzc2FnZVR5cGVzQnlOYW1lKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRFbnVtVHlwZXNCeU5hbWUoUHlGaWxlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gTmV3RmlsZUVudW1UeXBlc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RXh0ZW5zaW9uc0J5TmFtZShQeUZpbGVEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdGaWxlRXh0ZW5zaW9uc0J5TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RGVwZW5kZW5jaWVzKFB5RmlsZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIE5ld0ZpbGVEZXBlbmRlbmNpZXMoX0dldERlc2NyaXB0b3Ioc2VsZikpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldFB1YmxpY0RlcGVuZGVuY2llcyhQeUZpbGVEZXNjcmlwdG9yKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBOZXdGaWxlUHVibGljRGVwZW5kZW5jaWVzKF9HZXREZXNjcmlwdG9yKHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRIYXNPcHRpb25zKFB5RmlsZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgRmlsZU9wdGlvbnMmIG9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZiktPm9wdGlvbnMoKSk7Ci0gIGlmICgmb3B0aW9ucyAhPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgewotICAgIFB5X1JFVFVSTl9UUlVFOwotICB9IGVsc2UgewotICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgfQotfQotc3RhdGljIGludCBTZXRIYXNPcHRpb25zKFB5RmlsZURlc2NyaXB0b3IgKnNlbGYsIFB5T2JqZWN0ICp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIHJldHVybiBDaGVja0NhbGxlZEZyb21HZW5lcmF0ZWRGaWxlKCJoYXNfb3B0aW9ucyIpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldE9wdGlvbnMoUHlGaWxlRGVzY3JpcHRvciAqc2VsZikgewotICByZXR1cm4gR2V0T3JCdWlsZE9wdGlvbnMoX0dldERlc2NyaXB0b3Ioc2VsZikpOwotfQotCi1zdGF0aWMgaW50IFNldE9wdGlvbnMoUHlGaWxlRGVzY3JpcHRvciAqc2VsZiwgUHlPYmplY3QgKnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIENoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoIl9vcHRpb25zIik7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0U3ludGF4KFB5RmlsZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5U3RyaW5nX0ludGVybkZyb21TdHJpbmcoCi0gICAgICBGaWxlRGVzY3JpcHRvcjo6U3ludGF4TmFtZShfR2V0RGVzY3JpcHRvcihzZWxmKS0+c3ludGF4KCkpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDb3B5VG9Qcm90byhQeUZpbGVEZXNjcmlwdG9yICpzZWxmLCBQeU9iamVjdCAqdGFyZ2V0KSB7Ci0gIHJldHVybiBDb3B5VG9QeXRob25Qcm90bzxGaWxlRGVzY3JpcHRvclByb3RvPihfR2V0RGVzY3JpcHRvcihzZWxmKSwgdGFyZ2V0KTsKLX0KLQotc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKLSAgeyAicG9vbCIsIChnZXR0ZXIpR2V0UG9vbCwgTlVMTCwgInBvb2wifSwKLSAgeyAibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgTlVMTCwgIm5hbWUifSwKLSAgeyAicGFja2FnZSIsIChnZXR0ZXIpR2V0UGFja2FnZSwgTlVMTCwgInBhY2thZ2UifSwKLSAgeyAic2VyaWFsaXplZF9wYiIsIChnZXR0ZXIpR2V0U2VyaWFsaXplZFBifSwKLSAgeyAibWVzc2FnZV90eXBlc19ieV9uYW1lIiwgKGdldHRlcilHZXRNZXNzYWdlVHlwZXNCeU5hbWUsIE5VTEwsCi0gICAgIk1lc3NhZ2VzIGJ5IG5hbWUifSwKLSAgeyAiZW51bV90eXBlc19ieV9uYW1lIiwgKGdldHRlcilHZXRFbnVtVHlwZXNCeU5hbWUsIE5VTEwsICJFbnVtcyBieSBuYW1lIn0sCi0gIHsgImV4dGVuc2lvbnNfYnlfbmFtZSIsIChnZXR0ZXIpR2V0RXh0ZW5zaW9uc0J5TmFtZSwgTlVMTCwKLSAgICAiRXh0ZW5zaW9ucyBieSBuYW1lIn0sCi0gIHsgImRlcGVuZGVuY2llcyIsIChnZXR0ZXIpR2V0RGVwZW5kZW5jaWVzLCBOVUxMLCAiRGVwZW5kZW5jaWVzIn0sCi0gIHsgInB1YmxpY19kZXBlbmRlbmNpZXMiLCAoZ2V0dGVyKUdldFB1YmxpY0RlcGVuZGVuY2llcywgTlVMTCwgIkRlcGVuZGVuY2llcyJ9LAotCi0gIHsgImhhc19vcHRpb25zIiwgKGdldHRlcilHZXRIYXNPcHRpb25zLCAoc2V0dGVyKVNldEhhc09wdGlvbnMsICJIYXMgT3B0aW9ucyJ9LAotICB7ICJfb3B0aW9ucyIsIChnZXR0ZXIpTlVMTCwgKHNldHRlcilTZXRPcHRpb25zLCAiT3B0aW9ucyJ9LAotICB7ICJzeW50YXgiLCAoZ2V0dGVyKUdldFN5bnRheCwgKHNldHRlcilOVUxMLCAiU3ludGF4In0sCi0gIHtOVUxMfQotfTsKLQotc3RhdGljIFB5TWV0aG9kRGVmIE1ldGhvZHNbXSA9IHsKLSAgeyAiR2V0T3B0aW9ucyIsIChQeUNGdW5jdGlvbilHZXRPcHRpb25zLCBNRVRIX05PQVJHUywgfSwKLSAgeyAiQ29weVRvUHJvdG8iLCAoUHlDRnVuY3Rpb24pQ29weVRvUHJvdG8sIE1FVEhfTywgfSwKLSAge05VTEx9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZmlsZV9kZXNjcmlwdG9yCi0KLVB5VHlwZU9iamVjdCBQeUZpbGVEZXNjcmlwdG9yX1R5cGUgPSB7Ci0gIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gIEZVTExfTU9EVUxFX05BTUUgIi5GaWxlRGVzY3JpcHRvciIsICAgLy8gdHBfbmFtZQotICBzaXplb2YoUHlGaWxlRGVzY3JpcHRvciksICAgICAgICAgICAgIC8vIHRwX2Jhc2ljc2l6ZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZW1zaXplCi0gIChkZXN0cnVjdG9yKWZpbGVfZGVzY3JpcHRvcjo6RGVhbGxvYywgIC8vIHRwX2RlYWxsb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9wcmludAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKLSAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgICAvLyB0cF9mbGFncwotICAiQSBGaWxlIERlc2NyaXB0b3IiLCAgICAgICAgICAgICAgICAgIC8vIHRwX2RvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2xlYXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0Ci0gIGZpbGVfZGVzY3JpcHRvcjo6TWV0aG9kcywgICAgICAgICAgICAgLy8gdHBfbWV0aG9kcwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21lbWJlcnMKLSAgZmlsZV9kZXNjcmlwdG9yOjpHZXR0ZXJzLCAgICAgICAgICAgICAvLyB0cF9nZXRzZXQKLSAgJmRlc2NyaXB0b3I6OlB5QmFzZURlc2NyaXB0b3JfVHlwZSwgICAvLyB0cF9iYXNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX2dldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX3NldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pbml0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYWxsb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9uZXcKLSAgUHlPYmplY3RfRGVsLCAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9mcmVlCi19OwotCi1QeU9iamVjdCogUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yV2l0aFNlcmlhbGl6ZWRQYihmaWxlX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLX0KLQotUHlPYmplY3QqIFB5RmlsZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3JXaXRoU2VyaWFsaXplZFBiKAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2Rlc2NyaXB0b3IsIFB5T2JqZWN0ICpzZXJpYWxpemVkX3BiKSB7Ci0gIGJvb2wgd2FzX2NyZWF0ZWQ7Ci0gIFB5T2JqZWN0KiBweV9kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjo6TmV3SW50ZXJuZWREZXNjcmlwdG9yKAotICAgICAgJlB5RmlsZURlc2NyaXB0b3JfVHlwZSwgZmlsZV9kZXNjcmlwdG9yLCAmd2FzX2NyZWF0ZWQpOwotICBpZiAocHlfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKHdhc19jcmVhdGVkKSB7Ci0gICAgUHlGaWxlRGVzY3JpcHRvciogY2ZpbGVfZGVzY3JpcHRvciA9Ci0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlGaWxlRGVzY3JpcHRvcio+KHB5X2Rlc2NyaXB0b3IpOwotICAgIFB5X1hJTkNSRUYoc2VyaWFsaXplZF9wYik7Ci0gICAgY2ZpbGVfZGVzY3JpcHRvci0+c2VyaWFsaXplZF9wYiA9IHNlcmlhbGl6ZWRfcGI7Ci0gIH0KLSAgLy8gVE9ETyhhbWF1cnlmYSk6IEluIHRoZSBjYXNlIG9mIGEgY2FjaGVkIG9iamVjdCwgY2hlY2sgdGhhdCBzZXJpYWxpemVkX3BiCi0gIC8vIGlzIHRoZSBzYW1lIGFzIGJlZm9yZS4KLQotICByZXR1cm4gcHlfZGVzY3JpcHRvcjsKLX0KLQotY29uc3QgRmlsZURlc2NyaXB0b3IqIFB5RmlsZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopIHsKLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sob2JqLCAmUHlGaWxlRGVzY3JpcHRvcl9UeXBlKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJOb3QgYSBGaWxlRGVzY3JpcHRvciIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4oCi0gICAgICByZWludGVycHJldF9jYXN0PFB5QmFzZURlc2NyaXB0b3IqPihvYmopLT5kZXNjcmlwdG9yKTsKLX0KLQotbmFtZXNwYWNlIG9uZW9mX2Rlc2NyaXB0b3IgewotCi0vLyBVbmNoZWNrZWQgYWNjZXNzb3IgdG8gdGhlIEMrKyBwb2ludGVyLgotc3RhdGljIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogX0dldERlc2NyaXB0b3IoCi0gICAgUHlCYXNlRGVzY3JpcHRvciAqc2VsZikgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBPbmVvZkRlc2NyaXB0b3IqPihzZWxmLT5kZXNjcmlwdG9yKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXROYW1lKFB5QmFzZURlc2NyaXB0b3IqIHNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5U3RyaW5nX0Zyb21DcHBTdHJpbmcoX0dldERlc2NyaXB0b3Ioc2VsZiktPm5hbWUoKSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0RnVsbE5hbWUoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gUHlTdHJpbmdfRnJvbUNwcFN0cmluZyhfR2V0RGVzY3JpcHRvcihzZWxmKS0+ZnVsbF9uYW1lKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldEluZGV4KFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKF9HZXREZXNjcmlwdG9yKHNlbGYpLT5pbmRleCgpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRGaWVsZHMoUHlCYXNlRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICByZXR1cm4gTmV3T25lb2ZGaWVsZHNTZXEoX0dldERlc2NyaXB0b3Ioc2VsZikpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEdldENvbnRhaW5pbmdUeXBlKFB5QmFzZURlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlID0KLSAgICAgIF9HZXREZXNjcmlwdG9yKHNlbGYpLT5jb250YWluaW5nX3R5cGUoKTsKLSAgaWYgKGNvbnRhaW5pbmdfdHlwZSkgewotICAgIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGNvbnRhaW5pbmdfdHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLX0KLQotc3RhdGljIFB5R2V0U2V0RGVmIEdldHRlcnNbXSA9IHsKLSAgeyAibmFtZSIsIChnZXR0ZXIpR2V0TmFtZSwgTlVMTCwgIk5hbWUifSwKLSAgeyAiZnVsbF9uYW1lIiwgKGdldHRlcilHZXRGdWxsTmFtZSwgTlVMTCwgIkZ1bGwgbmFtZSJ9LAotICB7ICJpbmRleCIsIChnZXR0ZXIpR2V0SW5kZXgsIE5VTEwsICJJbmRleCJ9LAotCi0gIHsgImNvbnRhaW5pbmdfdHlwZSIsIChnZXR0ZXIpR2V0Q29udGFpbmluZ1R5cGUsIE5VTEwsICJDb250YWluaW5nIHR5cGUifSwKLSAgeyAiZmllbGRzIiwgKGdldHRlcilHZXRGaWVsZHMsIE5VTEwsICJGaWVsZHMifSwKLSAge05VTEx9Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugb25lb2ZfZGVzY3JpcHRvcgotCi1QeVR5cGVPYmplY3QgUHlPbmVvZkRlc2NyaXB0b3JfVHlwZSA9IHsKLSAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgRlVMTF9NT0RVTEVfTkFNRSAiLk9uZW9mRGVzY3JpcHRvciIsICAvLyB0cF9uYW1lCi0gIHNpemVvZihQeUJhc2VEZXNjcmlwdG9yKSwgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKLSAgIkEgT25lb2YgRGVzY3JpcHRvciIsICAgICAgICAgICAgICAgICAvLyB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCi0gIG9uZW9mX2Rlc2NyaXB0b3I6OkdldHRlcnMsICAgICAgICAgICAgLy8gdHBfZ2V0c2V0Ci0gICZkZXNjcmlwdG9yOjpQeUJhc2VEZXNjcmlwdG9yX1R5cGUsICAgLy8gdHBfYmFzZQotfTsKLQotUHlPYmplY3QqIFB5T25lb2ZEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKAotICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3SW50ZXJuZWREZXNjcmlwdG9yKAotICAgICAgJlB5T25lb2ZEZXNjcmlwdG9yX1R5cGUsIG9uZW9mX2Rlc2NyaXB0b3IsIE5VTEwpOwotfQotCi0vLyBBZGQgYSBlbnVtIHZhbHVlcyB0byBhIHR5cGUgZGljdGlvbmFyeS4KLXN0YXRpYyBib29sIEFkZEVudW1WYWx1ZXMoUHlUeXBlT2JqZWN0ICp0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV9kZXNjcmlwdG9yLT52YWx1ZV9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGVudW1fZGVzY3JpcHRvci0+dmFsdWUoaSk7Ci0gICAgU2NvcGVkUHlPYmplY3RQdHIgb2JqKFB5SW50X0Zyb21Mb25nKHZhbHVlLT5udW1iZXIoKSkpOwotICAgIGlmIChvYmogPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcodHlwZS0+dHBfZGljdCwgdmFsdWUtPm5hbWUoKS5jX3N0cigpLCBvYmouZ2V0KCkpIDwKLSAgICAgICAgMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgQWRkSW50Q29uc3RhbnQoUHlUeXBlT2JqZWN0ICp0eXBlLCBjb25zdCBjaGFyKiBuYW1lLCBpbnQgdmFsdWUpIHsKLSAgU2NvcGVkUHlPYmplY3RQdHIgb2JqKFB5SW50X0Zyb21Mb25nKHZhbHVlKSk7Ci0gIGlmIChQeURpY3RfU2V0SXRlbVN0cmluZyh0eXBlLT50cF9kaWN0LCBuYW1lLCBvYmouZ2V0KCkpIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1ib29sIEluaXREZXNjcmlwdG9yKCkgewotICBpZiAoUHlUeXBlX1JlYWR5KCZQeU1lc3NhZ2VEZXNjcmlwdG9yX1R5cGUpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGaWVsZERlc2NyaXB0b3JfVHlwZSkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLQotICBpZiAoIUFkZEVudW1WYWx1ZXMoJlB5RmllbGREZXNjcmlwdG9yX1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfZGVzY3JpcHRvcigpKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIUFkZEVudW1WYWx1ZXMoJlB5RmllbGREZXNjcmlwdG9yX1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZV9kZXNjcmlwdG9yKCkpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0jZGVmaW5lIEFERF9GSUVMRERFU0NfQ09OU1RBTlQoTkFNRSkgQWRkSW50Q29uc3RhbnQoIFwKLSAgICAmUHlGaWVsZERlc2NyaXB0b3JfVHlwZSwgI05BTUUsIEZpZWxkRGVzY3JpcHRvcjo6TkFNRSkKLSAgaWYgKCFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfSU5UMzIpIHx8Ci0gICAgICAhQUREX0ZJRUxEREVTQ19DT05TVEFOVChDUFBUWVBFX0lOVDY0KSB8fAotICAgICAgIUFERF9GSUVMRERFU0NfQ09OU1RBTlQoQ1BQVFlQRV9VSU5UMzIpIHx8Ci0gICAgICAhQUREX0ZJRUxEREVTQ19DT05TVEFOVChDUFBUWVBFX1VJTlQ2NCkgfHwKLSAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfRE9VQkxFKSB8fAotICAgICAgIUFERF9GSUVMRERFU0NfQ09OU1RBTlQoQ1BQVFlQRV9GTE9BVCkgfHwKLSAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfQk9PTCkgfHwKLSAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfRU5VTSkgfHwKLSAgICAgICFBRERfRklFTERERVNDX0NPTlNUQU5UKENQUFRZUEVfU1RSSU5HKSB8fAotICAgICAgIUFERF9GSUVMRERFU0NfQ09OU1RBTlQoQ1BQVFlQRV9NRVNTQUdFKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotI3VuZGVmIEFERF9GSUVMRERFU0NfQ09OU1RBTlQKLQotICBpZiAoUHlUeXBlX1JlYWR5KCZQeUVudW1EZXNjcmlwdG9yX1R5cGUpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKFB5VHlwZV9SZWFkeSgmUHlFbnVtVmFsdWVEZXNjcmlwdG9yX1R5cGUpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKFB5VHlwZV9SZWFkeSgmUHlGaWxlRGVzY3JpcHRvcl9UeXBlKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChQeVR5cGVfUmVhZHkoJlB5T25lb2ZEZXNjcmlwdG9yX1R5cGUpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFJbml0RGVzY3JpcHRvck1hcHBpbmdUeXBlcygpKQotICAgIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlYjk5ZGYxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogcGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KQotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfSF9fCi0KLSNpbmNsdWRlIDxQeXRob24uaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi1leHRlcm4gUHlUeXBlT2JqZWN0IFB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZTsKLWV4dGVybiBQeVR5cGVPYmplY3QgUHlGaWVsZERlc2NyaXB0b3JfVHlwZTsKLWV4dGVybiBQeVR5cGVPYmplY3QgUHlFbnVtRGVzY3JpcHRvcl9UeXBlOwotZXh0ZXJuIFB5VHlwZU9iamVjdCBQeUVudW1WYWx1ZURlc2NyaXB0b3JfVHlwZTsKLWV4dGVybiBQeVR5cGVPYmplY3QgUHlGaWxlRGVzY3JpcHRvcl9UeXBlOwotZXh0ZXJuIFB5VHlwZU9iamVjdCBQeU9uZW9mRGVzY3JpcHRvcl9UeXBlOwotCi0vLyBXcmFwcyBhIERlc2NyaXB0b3IgaW4gYSBQeXRob24gb2JqZWN0LgotLy8gVGhlIEMrKyBwb2ludGVyIGlzIHVzdWFsbHkgYm9ycm93ZWQgZnJvbSB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sLgotLy8gSW4gYW55IGNhc2UsIGl0IG11c3Qgc3RheSBhbGl2ZSBhcyBsb25nIGFzIHRoZSBQeXRob24gb2JqZWN0LgotLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCi1QeU9iamVjdCogUHlNZXNzYWdlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLVB5T2JqZWN0KiBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotUHlPYmplY3QqIFB5RW51bURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotUHlPYmplY3QqIFB5RW51bVZhbHVlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcigKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLVB5T2JqZWN0KiBQeU9uZW9mRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotUHlPYmplY3QqIFB5RmlsZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzY3JpcHRvcik7Ci0KLS8vIEFsdGVybmF0ZSBjb25zdHJ1Y3RvciBvZiBQeUZpbGVEZXNjcmlwdG9yLCB1c2VkIHdoZW4gd2UgYWxyZWFkeSBoYXZlIGEKLS8vIHNlcmlhbGl6ZWQgRmlsZURlc2NyaXB0b3JQcm90byB0aGF0IGNhbiBiZSBjYWNoZWQuCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yV2l0aFNlcmlhbGl6ZWRQYigKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjcmlwdG9yLCBQeU9iamVjdCogc2VyaWFsaXplZF9wYik7Ci0KLS8vIFJldHVybiB0aGUgQysrIGRlc2NyaXB0b3IgcG9pbnRlci4KLS8vIFRoaXMgZnVuY3Rpb24gY2hlY2tzIHRoZSBwYXJhbWV0ZXIgdHlwZTsgb24gZXJyb3IsIHJldHVybiBOVUxMIHdpdGggYSBQeXRob24KLS8vIGV4Y2VwdGlvbiBzZXQuCi1jb25zdCBEZXNjcmlwdG9yKiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihQeU9iamVjdCogb2JqKTsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvciogUHlGaWVsZERlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopOwotY29uc3QgRW51bURlc2NyaXB0b3IqIFB5RW51bURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopOwotY29uc3QgRmlsZURlc2NyaXB0b3IqIFB5RmlsZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKFB5T2JqZWN0KiBvYmopOwotCi0vLyBSZXR1cm5zIHRoZSByYXcgQysrIHBvaW50ZXIuCi1jb25zdCB2b2lkKiBQeURlc2NyaXB0b3JfQXNWb2lkUHRyKFB5T2JqZWN0KiBvYmopOwotCi0vLyBDaGVjayB0aGF0IHRoZSBjYWxsaW5nIFB5dGhvbiBjb2RlIGlzIHRoZSBnbG9iYWwgc2NvcGUgb2YgYSBfcGIyLnB5IG1vZHVsZS4KLS8vIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCB0byBzdXBwb3J0IHRoZSBjdXJyZW50IGNvZGUgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90bwotLy8gY29tcGlsZXIsIHdoaWNoIGluc2lzdHMgb24gbW9kaWZ5aW5nIGRlc2NyaXB0b3JzIGFmdGVyIHRoZXkgaGF2ZSBiZWVuCi0vLyBjcmVhdGVkLgotLy8KLS8vIHN0YWNrbGV2ZWwgaW5kaWNhdGVzIHdoaWNoIFB5dGhvbiBmcmFtZSBzaG91bGQgYmUgdGhlIF9wYjIucHkgbW9kdWxlLgotLy8KLS8vIERvbid0IHVzZSB0aGlzIGZ1bmN0aW9uIG91dHNpZGUgZGVzY3JpcHRvciBjbGFzc2VzLgotYm9vbCBfQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoaW50IHN0YWNrbGV2ZWwpOwotCi1ib29sIEluaXREZXNjcmlwdG9yKCk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfY29udGFpbmVycy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9jb250YWluZXJzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTA1ZDgxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9jb250YWluZXJzLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY1MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gTWFwcGluZ3MgYW5kIFNlcXVlbmNlcyBvZiBkZXNjcmlwdG9ycy4KLS8vIFVzZWQgYnkgRGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZSwgRW51bURlc2NyaXB0b3IudmFsdWVzLi4uCi0vLwotLy8gVGhleSBhdm9pZCB0aGUgYWxsb2NhdGlvbiBvZiBhIGZ1bGwgZGljdGlvbmFyeSBvciBhIGZ1bGwgbGlzdDogdGhleSBzaW1wbHkKLS8vIHN0b3JlIGEgcG9pbnRlciB0byB0aGUgcGFyZW50IGRlc2NyaXB0b3IsIHVzZSB0aGUgQysrIERlc2NyaXB0b3IgbWV0aG9kcyAoc2VlCi0vLyBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oKSB0byByZXRyaWV2ZSBvdGhlciBkZXNjcmlwdG9ycywgYW5kIGNyZWF0ZQotLy8gUHl0aG9uIG9iamVjdHMgb24gdGhlIGZseS4KLS8vCi0vLyBUaGUgY29udGFpbmVycyBmdWxseSBjb25mb3JtIHRvIGFiYy5NYXBwaW5nIGFuZCBhYmMuU2VxdWVuY2UsIGFuZCBiZWhhdmUganVzdAotLy8gbGlrZSByZWFkLW9ubHkgZGljdGlvbmFyaWVzIGFuZCBsaXN0cy4KLS8vCi0vLyBCZWNhdXNlIHRoZSBpbnRlcmZhY2Ugb2YgQysrIERlc2NyaXB0b3JzIGlzIHF1aXRlIHJlZ3VsYXIsIHRoaXMgZmlsZSBhY3R1YWxseQotLy8gZGVmaW5lcyBvbmx5IHRocmVlIHR5cGVzLCB0aGUgZXhhY3QgYmVoYXZpb3Igb2YgYSBjb250YWluZXIgaXMgY29udHJvbGxlZCBieQotLy8gYSBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIHN0cnVjdHVyZSwgd2hpY2ggY29udGFpbnMgZnVuY3Rpb25zIHRoYXQgdXNlcyB0aGUKLS8vIHB1YmxpYyBEZXNjcmlwdG9yIEFQSS4KLS8vCi0vLyBOb3RlOiBUaGlzIERlc2NyaXB0b3JDb250YWluZXJEZWYgaXMgc2ltaWxhciB0byB0aGUgInZpcnR1YWwgbWV0aG9kcyB0YWJsZSIKLS8vIHRoYXQgYSBDKysgY29tcGlsZXIgZ2VuZXJhdGVzIGZvciBhIGNsYXNzLiBXZSBoYXZlIHRvIG1ha2UgaXQgZXhwbGljaXQKLS8vIGJlY2F1c2UgdGhlIFB5dGhvbiBBUEkgaXMgYmFzZWQgb24gQywgYW5kIGRvZXMgbm90IHBsYXkgd2VsbCB3aXRoIEMrKwotLy8gaW5oZXJpdGFuY2UuCi0KLSNpbmNsdWRlIDxQeXRob24uaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfY29udGFpbmVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+Ci0KLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLSAgI2RlZmluZSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUKLSAgI2RlZmluZSBQeVN0cmluZ19Gcm9tRm9ybWF0IFB5VW5pY29kZV9Gcm9tRm9ybWF0Ci0gICNkZWZpbmUgUHlJbnRfRnJvbUxvbmcgUHlMb25nX0Zyb21Mb25nCi0gICNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMzAwMDAKLSAgICAjZXJyb3IgIlB5dGhvbiAzLjAgLSAzLjIgYXJlIG5vdCBzdXBwb3J0ZWQuIgotICAjZW5kaWYKLSAgI2RlZmluZSBQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUob2IsIGNoYXJwcCwgc2l6ZXApIFwKLSAgICAoUHlVbmljb2RlX0NoZWNrKG9iKT8gXAotICAgICAgICgoKihjaGFycHApID0gUHlVbmljb2RlX0FzVVRGOEFuZFNpemUob2IsIChzaXplcCkpKSA9PSBOVUxMPyAtMTogMCk6IFwKLSAgICAgICBQeUJ5dGVzX0FzU3RyaW5nQW5kU2l6ZShvYiwgKGNoYXJwcCksIChzaXplcCkpKQotI2VuZGlmCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi1zdHJ1Y3QgUHlDb250YWluZXI7Ci0KLXR5cGVkZWYgaW50ICgqQ291bnRNZXRob2QpKFB5Q29udGFpbmVyKiBzZWxmKTsKLXR5cGVkZWYgY29uc3Qgdm9pZCogKCpHZXRCeUluZGV4TWV0aG9kKShQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KTsKLXR5cGVkZWYgY29uc3Qgdm9pZCogKCpHZXRCeU5hbWVNZXRob2QpKFB5Q29udGFpbmVyKiBzZWxmLCBjb25zdCBzdHJpbmcmIG5hbWUpOwotdHlwZWRlZiBjb25zdCB2b2lkKiAoKkdldEJ5Q2FtZWxjYXNlTmFtZU1ldGhvZCkoUHlDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpOwotdHlwZWRlZiBjb25zdCB2b2lkKiAoKkdldEJ5TnVtYmVyTWV0aG9kKShQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KTsKLXR5cGVkZWYgUHlPYmplY3QqICgqTmV3T2JqZWN0RnJvbUl0ZW1NZXRob2QpKGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpOwotdHlwZWRlZiBjb25zdCBzdHJpbmcmICgqR2V0SXRlbU5hbWVNZXRob2QpKGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpOwotdHlwZWRlZiBjb25zdCBzdHJpbmcmICgqR2V0SXRlbUNhbWVsY2FzZU5hbWVNZXRob2QpKGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpOwotdHlwZWRlZiBpbnQgKCpHZXRJdGVtTnVtYmVyTWV0aG9kKShjb25zdCB2b2lkKiBkZXNjcmlwdG9yKTsKLXR5cGVkZWYgaW50ICgqR2V0SXRlbUluZGV4TWV0aG9kKShjb25zdCB2b2lkKiBkZXNjcmlwdG9yKTsKLQotc3RydWN0IERlc2NyaXB0b3JDb250YWluZXJEZWYgewotICBjb25zdCBjaGFyKiBtYXBwaW5nX25hbWU7Ci0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBpdGVtcyBpbiB0aGUgY29udGFpbmVyLgotICBDb3VudE1ldGhvZCBjb3VudF9mbjsKLSAgLy8gUmV0cmlldmUgaXRlbSBieSBpbmRleCAodXN1YWxseSB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb24gaW4gdGhlIHByb3RvIGZpbGUpCi0gIC8vIFVzZWQgYnkgc2VxdWVuY2VzLCBidXQgYWxzbyBpdGVyYXRvcnMuIDAgPD0gaW5kZXggPCBDb3VudCgpLgotICBHZXRCeUluZGV4TWV0aG9kIGdldF9ieV9pbmRleF9mbjsKLSAgLy8gUmV0cmlldmUgaXRlbSBieSBuYW1lICh1c3VhbGx5IGEgY2FsbCB0byBzb21lICdGaW5kQnlOYW1lJyBtZXRob2QpLgotICAvLyBVc2VkIGJ5ICJieV9uYW1lIiBtYXBwaW5ncy4KLSAgR2V0QnlOYW1lTWV0aG9kIGdldF9ieV9uYW1lX2ZuOwotICAvLyBSZXRyaWV2ZSBpdGVtIGJ5IGNhbWVsY2FzZSBuYW1lICh1c3VhbGx5IGEgY2FsbCB0byBzb21lCi0gIC8vICdGaW5kQnlDYW1lbGNhc2VOYW1lJyBtZXRob2QpLiBVc2VkIGJ5ICJieV9jYW1lbGNhc2VfbmFtZSIgbWFwcGluZ3MuCi0gIEdldEJ5Q2FtZWxjYXNlTmFtZU1ldGhvZCBnZXRfYnlfY2FtZWxjYXNlX25hbWVfZm47Ci0gIC8vIFJldHJpZXZlIGl0ZW0gYnkgZGVjbGFyZWQgbnVtYmVyIChmaWVsZCB0YWcsIG9yIGVudW0gdmFsdWUpLgotICAvLyBVc2VkIGJ5ICJieV9udW1iZXIiIG1hcHBpbmdzLgotICBHZXRCeU51bWJlck1ldGhvZCBnZXRfYnlfbnVtYmVyX2ZuOwotICAvLyBDb252ZXJ0cyBhIGl0ZW0gQysrIGRlc2NyaXB0b3IgdG8gYSBQeXRob24gb2JqZWN0LiBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLSAgTmV3T2JqZWN0RnJvbUl0ZW1NZXRob2QgbmV3X29iamVjdF9mcm9tX2l0ZW1fZm47Ci0gIC8vIFJldHJpZXZlIHRoZSBuYW1lIG9mIGFuIGl0ZW0uIFVzZWQgYnkgaXRlcmF0b3JzIG9uICJieV9uYW1lIiBtYXBwaW5ncy4KLSAgR2V0SXRlbU5hbWVNZXRob2QgZ2V0X2l0ZW1fbmFtZV9mbjsKLSAgLy8gUmV0cmlldmUgdGhlIGNhbWVsY2FzZSBuYW1lIG9mIGFuIGl0ZW0uIFVzZWQgYnkgaXRlcmF0b3JzIG9uCi0gIC8vICJieV9jYW1lbGNhc2VfbmFtZSIgbWFwcGluZ3MuCi0gIEdldEl0ZW1DYW1lbGNhc2VOYW1lTWV0aG9kIGdldF9pdGVtX2NhbWVsY2FzZV9uYW1lX2ZuOwotICAvLyBSZXRyaWV2ZSB0aGUgbnVtYmVyIG9mIGFuIGl0ZW0uIFVzZWQgYnkgaXRlcmF0b3JzIG9uICJieV9udW1iZXIiIG1hcHBpbmdzLgotICBHZXRJdGVtTnVtYmVyTWV0aG9kIGdldF9pdGVtX251bWJlcl9mbjsKLSAgLy8gUmV0cmlldmUgdGhlIGluZGV4IG9mIGFuIGl0ZW0gZm9yIHRoZSBjb250YWluZXIgdHlwZS4KLSAgLy8gVXNlZCBieSAiX19jb250YWluc19fIi4KLSAgLy8gSWYgbm90IHNldCwgInggaW4gc2VxdWVuY2UiIHdpbGwgZG8gYSBsaW5lYXIgc2VhcmNoLgotICBHZXRJdGVtSW5kZXhNZXRob2QgZ2V0X2l0ZW1faW5kZXhfZm47Ci19OwotCi1zdHJ1Y3QgUHlDb250YWluZXIgewotICBQeU9iamVjdF9IRUFECi0KLSAgLy8gVGhlIHByb3RvMiBkZXNjcmlwdG9yIHRoaXMgY29udGFpbmVyIGJlbG9uZ3MgdG8gdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbC4KLSAgY29uc3Qgdm9pZCogZGVzY3JpcHRvcjsKLQotICAvLyBBIHBvaW50ZXIgdG8gYSBzdGF0aWMgc3RydWN0dXJlIHdpdGggZnVuY3Rpb24gcG9pbnRlcnMgdGhhdCBjb250cm9sIHRoZQotICAvLyBiZWhhdmlvciBvZiB0aGUgY29udGFpbmVyLiBWZXJ5IHNpbWlsYXIgdG8gdGhlIHRhYmxlIG9mIHZpcnR1YWwgZnVuY3Rpb25zCi0gIC8vIG9mIGEgQysrIGNsYXNzLgotICBjb25zdCBEZXNjcmlwdG9yQ29udGFpbmVyRGVmKiBjb250YWluZXJfZGVmOwotCi0gIC8vIFRoZSBraW5kIG9mIGNvbnRhaW5lcjogbGlzdCwgb3IgZGljdCBieSBuYW1lIG9yIHZhbHVlLgotICBlbnVtIENvbnRhaW5lcktpbmQgewotICAgIEtJTkRfU0VRVUVOQ0UsCi0gICAgS0lORF9CWU5BTUUsCi0gICAgS0lORF9CWUNBTUVMQ0FTRU5BTUUsCi0gICAgS0lORF9CWU5VTUJFUiwKLSAgfSBraW5kOwotfTsKLQotc3RydWN0IFB5Q29udGFpbmVySXRlcmF0b3IgewotICBQeU9iamVjdF9IRUFECi0KLSAgLy8gVGhlIGNvbnRhaW5lciB3ZSBhcmUgaXRlcmF0aW5nIG92ZXIuIE93biBhIHJlZmVyZW5jZS4KLSAgUHlDb250YWluZXIqIGNvbnRhaW5lcjsKLQotICAvLyBUaGUgY3VycmVudCBpbmRleCBpbiB0aGUgaXRlcmF0b3IuCi0gIGludCBpbmRleDsKLQotICAvLyBUaGUga2luZCBvZiBjb250YWluZXI6IGxpc3QsIG9yIGRpY3QgYnkgbmFtZSBvciB2YWx1ZS4KLSAgZW51bSBJdGVyS2luZCB7Ci0gICAgS0lORF9JVEVSS0VZLAotICAgIEtJTkRfSVRFUlZBTFVFLAotICAgIEtJTkRfSVRFUklURU0sCi0gICAgS0lORF9JVEVSVkFMVUVfUkVWRVJTRUQsICAvLyBGb3Igc2VxdWVuY2VzCi0gIH0ga2luZDsKLX07Ci0KLW5hbWVzcGFjZSBkZXNjcmlwdG9yIHsKLQotLy8gUmV0dXJucyB0aGUgQysrIGl0ZW0gZGVzY3JpcHRvciBmb3IgYSBnaXZlbiBQeXRob24ga2V5LgotLy8gV2hlbiB0aGUgZGVzY3JpcHRvciBpcyBmb3VuZCwgcmV0dXJuIHRydWUgYW5kIHNldCAqaXRlbS4KLS8vIFdoZW4gdGhlIGRlc2NyaXB0b3IgaXMgbm90IGZvdW5kLCByZXR1cm4gdHJ1ZSwgYnV0IHNldCAqaXRlbSB0byBOVUxMLgotLy8gT24gZXJyb3IsIHJldHVybnMgZmFsc2Ugd2l0aCBhbiBleGNlcHRpb24gc2V0Lgotc3RhdGljIGJvb2wgX0dldEl0ZW1CeUtleShQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGtleSwgY29uc3Qgdm9pZCoqIGl0ZW0pIHsKLSAgc3dpdGNoIChzZWxmLT5raW5kKSB7Ci0gICAgY2FzZSBQeUNvbnRhaW5lcjo6S0lORF9CWU5BTUU6Ci0gICAgICB7Ci0gICAgICAgIGNoYXIqIG5hbWU7Ci0gICAgICAgIFB5X3NzaXplX3QgbmFtZV9zaXplOwotICAgICAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGtleSwgJm5hbWUsICZuYW1lX3NpemUpIDwgMCkgewotICAgICAgICAgIGlmIChQeUVycl9FeGNlcHRpb25NYXRjaGVzKFB5RXhjX1R5cGVFcnJvcikpIHsKLSAgICAgICAgICAgIC8vIE5vdCBhIHN0cmluZywgY2Fubm90IGJlIGluIHRoZSBjb250YWluZXIuCi0gICAgICAgICAgICBQeUVycl9DbGVhcigpOwotICAgICAgICAgICAgKml0ZW0gPSBOVUxMOwotICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAqaXRlbSA9IHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9ieV9uYW1lX2ZuKAotICAgICAgICAgICAgc2VsZiwgc3RyaW5nKG5hbWUsIG5hbWVfc2l6ZSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX0JZQ0FNRUxDQVNFTkFNRToKLSAgICAgIHsKLSAgICAgICAgY2hhciogY2FtZWxjYXNlX25hbWU7Ci0gICAgICAgIFB5X3NzaXplX3QgbmFtZV9zaXplOwotICAgICAgICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGtleSwgJmNhbWVsY2FzZV9uYW1lLCAmbmFtZV9zaXplKSA8IDApIHsKLSAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7Ci0gICAgICAgICAgICAvLyBOb3QgYSBzdHJpbmcsIGNhbm5vdCBiZSBpbiB0aGUgY29udGFpbmVyLgotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgICppdGVtID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgKml0ZW0gPSBzZWxmLT5jb250YWluZXJfZGVmLT5nZXRfYnlfY2FtZWxjYXNlX25hbWVfZm4oCi0gICAgICAgICAgICBzZWxmLCBzdHJpbmcoY2FtZWxjYXNlX25hbWUsIG5hbWVfc2l6ZSkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX0JZTlVNQkVSOgotICAgICAgewotICAgICAgICBQeV9zc2l6ZV90IG51bWJlciA9IFB5TnVtYmVyX0FzU3NpemVfdChrZXksIE5VTEwpOwotICAgICAgICBpZiAobnVtYmVyID09IC0xICYmIFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19UeXBlRXJyb3IpKSB7Ci0gICAgICAgICAgICAvLyBOb3QgYSBudW1iZXIsIGNhbm5vdCBiZSBpbiB0aGUgY29udGFpbmVyLgotICAgICAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgICAgICppdGVtID0gTlVMTDsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgKml0ZW0gPSBzZWxmLT5jb250YWluZXJfZGVmLT5nZXRfYnlfbnVtYmVyX2ZuKHNlbGYsIG51bWJlcik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9TZXROb25lKFB5RXhjX05vdEltcGxlbWVudGVkRXJyb3IpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8vIFJldHVybnMgdGhlIGtleSBvZiB0aGUgb2JqZWN0IGF0IHRoZSBnaXZlbiBpbmRleC4KLS8vIFVzZWQgd2hlbiBpdGVyYXRpbmcgb3ZlciBtYXBwaW5ncy4KLXN0YXRpYyBQeU9iamVjdCogX05ld0tleV9CeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7Ci0gIGNvbnN0IHZvaWQqIGl0ZW0gPSBzZWxmLT5jb250YWluZXJfZGVmLT5nZXRfYnlfaW5kZXhfZm4oc2VsZiwgaW5kZXgpOwotICBzd2l0Y2ggKHNlbGYtPmtpbmQpIHsKLSAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX0JZTkFNRToKLSAgICAgIHsKLSAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9pdGVtX25hbWVfZm4oaXRlbSkpOwotICAgICAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmFtZS5jX3N0cigpLCBuYW1lLnNpemUoKSk7Ci0gICAgICB9Ci0gICAgY2FzZSBQeUNvbnRhaW5lcjo6S0lORF9CWUNBTUVMQ0FTRU5BTUU6Ci0gICAgICB7Ci0gICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSgKLSAgICAgICAgICAgIHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9pdGVtX2NhbWVsY2FzZV9uYW1lX2ZuKGl0ZW0pKTsKLSAgICAgICAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKG5hbWUuY19zdHIoKSwgbmFtZS5zaXplKCkpOwotICAgICAgfQotICAgIGNhc2UgUHlDb250YWluZXI6OktJTkRfQllOVU1CRVI6Ci0gICAgICB7Ci0gICAgICAgIGludCB2YWx1ZSA9IHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9pdGVtX251bWJlcl9mbihpdGVtKTsKLSAgICAgICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLS8vIFJldHVybnMgdGhlIG9iamVjdCBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0vLyBBbHNvIHVzZWQgd2hlbiBpdGVyYXRpbmcgb3ZlciBtYXBwaW5ncy4KLXN0YXRpYyBQeU9iamVjdCogX05ld09ial9CeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7Ci0gIHJldHVybiBzZWxmLT5jb250YWluZXJfZGVmLT5uZXdfb2JqZWN0X2Zyb21faXRlbV9mbigKLSAgICAgIHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9ieV9pbmRleF9mbihzZWxmLCBpbmRleCkpOwotfQotCi1zdGF0aWMgUHlfc3NpemVfdCBMZW5ndGgoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIHNlbGYtPmNvbnRhaW5lcl9kZWYtPmNvdW50X2ZuKHNlbGYpOwotfQotCi0vLyBUaGUgRGVzY3JpcHRvck1hcHBpbmcgdHlwZS4KLQotc3RhdGljIFB5T2JqZWN0KiBTdWJzY3JpcHQoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBrZXkpIHsKLSAgY29uc3Qgdm9pZCogaXRlbSA9IE5VTEw7Ci0gIGlmICghX0dldEl0ZW1CeUtleShzZWxmLCBrZXksICZpdGVtKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmICghaXRlbSkgewotICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwga2V5KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gc2VsZi0+Y29udGFpbmVyX2RlZi0+bmV3X29iamVjdF9mcm9tX2l0ZW1fZm4oaXRlbSk7Ci19Ci0KLXN0YXRpYyBpbnQgQXNzU3Vic2NyaXB0KFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCoga2V5LCBQeU9iamVjdCogdmFsdWUpIHsKLSAgaWYgKF9DYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgwKSkgewotICAgIHJldHVybiAwOwotICB9Ci0gIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50IiwKLSAgICAgICAgICAgICAgIFB5X1RZUEUoc2VsZiktPnRwX25hbWUpOwotICByZXR1cm4gLTE7Ci19Ci0KLXN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIE1hcHBpbmdNYXBwaW5nTWV0aG9kcyA9IHsKLSAgKGxlbmZ1bmMpTGVuZ3RoLCAgICAgICAgICAgICAgIC8vIG1wX2xlbmd0aAotICAoYmluYXJ5ZnVuYylTdWJzY3JpcHQsICAgICAgICAgLy8gbXBfc3Vic2NyaXB0Ci0gIChvYmpvYmphcmdwcm9jKUFzc1N1YnNjcmlwdCwgICAvLyBtcF9hc3Nfc3Vic2NyaXB0Ci19OwotCi1zdGF0aWMgaW50IENvbnRhaW5zKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCoga2V5KSB7Ci0gIGNvbnN0IHZvaWQqIGl0ZW0gPSBOVUxMOwotICBpZiAoIV9HZXRJdGVtQnlLZXkoc2VsZiwga2V5LCAmaXRlbSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKGl0ZW0pIHsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gMDsKLSAgfQotfQotCi1zdGF0aWMgUHlPYmplY3QqIENvbnRhaW5lclJlcHIoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgY29uc3QgY2hhcioga2luZCA9ICIiOwotICBzd2l0Y2ggKHNlbGYtPmtpbmQpIHsKLSAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX1NFUVVFTkNFOgotICAgICAga2luZCA9ICJzZXF1ZW5jZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFB5Q29udGFpbmVyOjpLSU5EX0JZTkFNRToKLSAgICAgIGtpbmQgPSAibWFwcGluZyBieSBuYW1lIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUHlDb250YWluZXI6OktJTkRfQllDQU1FTENBU0VOQU1FOgotICAgICAga2luZCA9ICJtYXBwaW5nIGJ5IGNhbWVsQ2FzZSBuYW1lIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgUHlDb250YWluZXI6OktJTkRfQllOVU1CRVI6Ci0gICAgICBraW5kID0gIm1hcHBpbmcgYnkgbnVtYmVyIjsKLSAgICAgIGJyZWFrOwotICB9Ci0gIHJldHVybiBQeVN0cmluZ19Gcm9tRm9ybWF0KAotICAgICAgIjwlcyAlcz4iLCBzZWxmLT5jb250YWluZXJfZGVmLT5tYXBwaW5nX25hbWUsIGtpbmQpOwotfQotCi1leHRlcm4gUHlUeXBlT2JqZWN0IERlc2NyaXB0b3JNYXBwaW5nX1R5cGU7Ci1leHRlcm4gUHlUeXBlT2JqZWN0IERlc2NyaXB0b3JTZXF1ZW5jZV9UeXBlOwotCi0vLyBBIHNlcXVlbmNlIGNvbnRhaW5lciBjYW4gb25seSBiZSBlcXVhbCB0byBhbm90aGVyIHNlcXVlbmNlIGNvbnRhaW5lciwgb3IgKGZvcgotLy8gYmFja3dhcmQgY29tcGF0aWJpbGl0eSkgdG8gYSBsaXN0IGNvbnRhaW5pbmcgdGhlIHNhbWUgaXRlbXMuCi0vLyBSZXR1cm5zIDEgaWYgZXF1YWwsIDAgaWYgdW5lcXVhbCwgLTEgb24gZXJyb3IuCi1zdGF0aWMgaW50IERlc2NyaXB0b3JTZXF1ZW5jZV9FcXVhbChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIG90aGVyKSB7Ci0gIC8vIENoZWNrIHRoZSBpZGVudGl0eSBvZiBDKysgcG9pbnRlcnMuCi0gIGlmIChQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsICZEZXNjcmlwdG9yU2VxdWVuY2VfVHlwZSkpIHsKLSAgICBQeUNvbnRhaW5lciogb3RoZXJfY29udGFpbmVyID0gcmVpbnRlcnByZXRfY2FzdDxQeUNvbnRhaW5lcio+KG90aGVyKTsKLSAgICBpZiAoc2VsZi0+ZGVzY3JpcHRvciA9PSBvdGhlcl9jb250YWluZXItPmRlc2NyaXB0b3IgJiYKLSAgICAgICAgc2VsZi0+Y29udGFpbmVyX2RlZiA9PSBvdGhlcl9jb250YWluZXItPmNvbnRhaW5lcl9kZWYgJiYKLSAgICAgICAgc2VsZi0+a2luZCA9PSBvdGhlcl9jb250YWluZXItPmtpbmQpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gIH0KLQotICAvLyBJZiBvdGhlciBpcyBhIGxpc3QKLSAgaWYgKFB5TGlzdF9DaGVjayhvdGhlcikpIHsKLSAgICAvLyByZXR1cm4gbGlzdChzZWxmKSA9PSBvdGhlcgotICAgIGludCBzaXplID0gTGVuZ3RoKHNlbGYpOwotICAgIGlmIChzaXplICE9IFB5TGlzdF9TaXplKG90aGVyKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBmb3IgKGludCBpbmRleCA9IDA7IGluZGV4IDwgc2l6ZTsgaW5kZXgrKykgewotICAgICAgU2NvcGVkUHlPYmplY3RQdHIgdmFsdWUxKF9OZXdPYmpfQnlJbmRleChzZWxmLCBpbmRleCkpOwotICAgICAgaWYgKHZhbHVlMSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIFB5T2JqZWN0KiB2YWx1ZTIgPSBQeUxpc3RfR2V0SXRlbShvdGhlciwgaW5kZXgpOwotICAgICAgaWYgKHZhbHVlMiA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGludCBjbXAgPSBQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2wodmFsdWUxLmdldCgpLCB2YWx1ZTIsIFB5X0VRKTsKLSAgICAgIGlmIChjbXAgIT0gMSkgIC8vIGVycm9yIG9yIG5vdCBlcXVhbAotICAgICAgICAgIHJldHVybiBjbXA7Ci0gICAgfQotICAgIC8vIEFsbCBpdGVtcyB3ZXJlIGZvdW5kIGFuZCBlcXVhbAotICAgIHJldHVybiAxOwotICB9Ci0KLSAgLy8gQW55IG90aGVyIG9iamVjdCBpcyBkaWZmZXJlbnQuCi0gIHJldHVybiAwOwotfQotCi0vLyBBIG1hcHBpbmcgY29udGFpbmVyIGNhbiBvbmx5IGJlIGVxdWFsIHRvIGFub3RoZXIgbWFwcGluZyBjb250YWluZXIsIG9yIChmb3IKLS8vIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkpIHRvIGEgZGljdCBjb250YWluaW5nIHRoZSBzYW1lIGl0ZW1zLgotLy8gUmV0dXJucyAxIGlmIGVxdWFsLCAwIGlmIHVuZXF1YWwsIC0xIG9uIGVycm9yLgotc3RhdGljIGludCBEZXNjcmlwdG9yTWFwcGluZ19FcXVhbChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIG90aGVyKSB7Ci0gIC8vIENoZWNrIHRoZSBpZGVudGl0eSBvZiBDKysgcG9pbnRlcnMuCi0gIGlmIChQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsICZEZXNjcmlwdG9yTWFwcGluZ19UeXBlKSkgewotICAgIFB5Q29udGFpbmVyKiBvdGhlcl9jb250YWluZXIgPSByZWludGVycHJldF9jYXN0PFB5Q29udGFpbmVyKj4ob3RoZXIpOwotICAgIGlmIChzZWxmLT5kZXNjcmlwdG9yID09IG90aGVyX2NvbnRhaW5lci0+ZGVzY3JpcHRvciAmJgotICAgICAgICBzZWxmLT5jb250YWluZXJfZGVmID09IG90aGVyX2NvbnRhaW5lci0+Y29udGFpbmVyX2RlZiAmJgotICAgICAgICBzZWxmLT5raW5kID09IG90aGVyX2NvbnRhaW5lci0+a2luZCkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIC8vIElmIG90aGVyIGlzIGEgZGljdAotICBpZiAoUHlEaWN0X0NoZWNrKG90aGVyKSkgewotICAgIC8vIGVxdWl2YWxlbnQgdG8gZGljdChzZWxmLml0ZW1zKCkpID09IG90aGVyCi0gICAgaW50IHNpemUgPSBMZW5ndGgoc2VsZik7Ci0gICAgaWYgKHNpemUgIT0gUHlEaWN0X1NpemUob3RoZXIpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZvciAoaW50IGluZGV4ID0gMDsgaW5kZXggPCBzaXplOyBpbmRleCsrKSB7Ci0gICAgICBTY29wZWRQeU9iamVjdFB0ciBrZXkoX05ld0tleV9CeUluZGV4KHNlbGYsIGluZGV4KSk7Ci0gICAgICBpZiAoa2V5ID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgU2NvcGVkUHlPYmplY3RQdHIgdmFsdWUxKF9OZXdPYmpfQnlJbmRleChzZWxmLCBpbmRleCkpOwotICAgICAgaWYgKHZhbHVlMSA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIFB5T2JqZWN0KiB2YWx1ZTIgPSBQeURpY3RfR2V0SXRlbShvdGhlciwga2V5LmdldCgpKTsKLSAgICAgIGlmICh2YWx1ZTIgPT0gTlVMTCkgewotICAgICAgICAvLyBOb3QgZm91bmQgaW4gdGhlIG90aGVyIGRpY3Rpb25hcnkKLSAgICAgICAgcmV0dXJuIDA7Ci0gICAgICB9Ci0gICAgICBpbnQgY21wID0gUHlPYmplY3RfUmljaENvbXBhcmVCb29sKHZhbHVlMS5nZXQoKSwgdmFsdWUyLCBQeV9FUSk7Ci0gICAgICBpZiAoY21wICE9IDEpICAvLyBlcnJvciBvciBub3QgZXF1YWwKLSAgICAgICAgICByZXR1cm4gY21wOwotICAgIH0KLSAgICAvLyBBbGwgaXRlbXMgd2VyZSBmb3VuZCBhbmQgZXF1YWwKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8vIEFueSBvdGhlciBvYmplY3QgaXMgZGlmZmVyZW50LgotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBSaWNoQ29tcGFyZShQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIG90aGVyLCBpbnQgb3BpZCkgewotICBpZiAob3BpZCAhPSBQeV9FUSAmJiBvcGlkICE9IFB5X05FKSB7Ci0gICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLSAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0gIH0KLQotICBpbnQgcmVzdWx0OwotCi0gIGlmIChzZWxmLT5raW5kID09IFB5Q29udGFpbmVyOjpLSU5EX1NFUVVFTkNFKSB7Ci0gICAgcmVzdWx0ID0gRGVzY3JpcHRvclNlcXVlbmNlX0VxdWFsKHNlbGYsIG90aGVyKTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPSBEZXNjcmlwdG9yTWFwcGluZ19FcXVhbChzZWxmLCBvdGhlcik7Ci0gIH0KLSAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAocmVzdWx0IF4gKG9waWQgPT0gUHlfTkUpKSB7Ci0gICAgUHlfUkVUVVJOX1RSVUU7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX0ZBTFNFOwotICB9Ci19Ci0KLXN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBNYXBwaW5nU2VxdWVuY2VNZXRob2RzID0gewotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIHNxX2xlbmd0aAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIHNxX2NvbmNhdAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIHNxX3JlcGVhdAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIHNxX2l0ZW0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvLyBzcV9zbGljZQotICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIHNxX2Fzc19pdGVtCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgLy8gc3FfYXNzX3NsaWNlCi0gICAgKG9iam9ianByb2MpQ29udGFpbnMsICAgLy8gc3FfY29udGFpbnMKLX07Ci0KLXN0YXRpYyBQeU9iamVjdCogR2V0KFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBQeU9iamVjdCoga2V5OwotICBQeU9iamVjdCogZGVmYXVsdF92YWx1ZSA9IFB5X05vbmU7Ci0gIGlmICghUHlBcmdfVW5wYWNrVHVwbGUoYXJncywgImdldCIsIDEsIDIsICZrZXksICZkZWZhdWx0X3ZhbHVlKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY29uc3Qgdm9pZCogaXRlbTsKLSAgaWYgKCFfR2V0SXRlbUJ5S2V5KHNlbGYsIGtleSwgJml0ZW0pKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgIFB5X0lOQ1JFRihkZWZhdWx0X3ZhbHVlKTsKLSAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgfQotICByZXR1cm4gc2VsZi0+Y29udGFpbmVyX2RlZi0+bmV3X29iamVjdF9mcm9tX2l0ZW1fZm4oaXRlbSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogS2V5cyhQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgUHlfc3NpemVfdCBjb3VudCA9IExlbmd0aChzZWxmKTsKLSAgU2NvcGVkUHlPYmplY3RQdHIgbGlzdChQeUxpc3RfTmV3KGNvdW50KSk7Ci0gIGlmIChsaXN0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBmb3IgKFB5X3NzaXplX3QgaW5kZXggPSAwOyBpbmRleCA8IGNvdW50OyArK2luZGV4KSB7Ci0gICAgUHlPYmplY3QqIGtleSA9IF9OZXdLZXlfQnlJbmRleChzZWxmLCBpbmRleCk7Ci0gICAgaWYgKGtleSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QuZ2V0KCksIGluZGV4LCBrZXkpOwotICB9Ci0gIHJldHVybiBsaXN0LnJlbGVhc2UoKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBWYWx1ZXMoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIFB5X3NzaXplX3QgY291bnQgPSBMZW5ndGgoc2VsZik7Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoUHlMaXN0X05ldyhjb3VudCkpOwotICBpZiAobGlzdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZm9yIChQeV9zc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkgewotICAgIFB5T2JqZWN0KiB2YWx1ZSA9IF9OZXdPYmpfQnlJbmRleChzZWxmLCBpbmRleCk7Ci0gICAgaWYgKHZhbHVlID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeUxpc3RfU0VUX0lURU0obGlzdC5nZXQoKSwgaW5kZXgsIHZhbHVlKTsKLSAgfQotICByZXR1cm4gbGlzdC5yZWxlYXNlKCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogSXRlbXMoUHlDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIFB5X3NzaXplX3QgY291bnQgPSBMZW5ndGgoc2VsZik7Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoUHlMaXN0X05ldyhjb3VudCkpOwotICBpZiAobGlzdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZm9yIChQeV9zc2l6ZV90IGluZGV4ID0gMDsgaW5kZXggPCBjb3VudDsgKytpbmRleCkgewotICAgIFNjb3BlZFB5T2JqZWN0UHRyIG9iaihQeVR1cGxlX05ldygyKSk7Ci0gICAgaWYgKG9iaiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlPYmplY3QqIGtleSA9IF9OZXdLZXlfQnlJbmRleChzZWxmLCBpbmRleCk7Ci0gICAgaWYgKGtleSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShvYmouZ2V0KCksIDAsIGtleSk7Ci0gICAgUHlPYmplY3QqIHZhbHVlID0gX05ld09ial9CeUluZGV4KHNlbGYsIGluZGV4KTsKLSAgICBpZiAodmFsdWUgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFB5VHVwbGVfU0VUX0lURU0ob2JqLmdldCgpLCAxLCB2YWx1ZSk7Ci0gICAgUHlMaXN0X1NFVF9JVEVNKGxpc3QuZ2V0KCksIGluZGV4LCBvYmoucmVsZWFzZSgpKTsKLSAgfQotICByZXR1cm4gbGlzdC5yZWxlYXNlKCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTmV3Q29udGFpbmVySXRlcmF0b3IoUHlDb250YWluZXIqIG1hcHBpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29udGFpbmVySXRlcmF0b3I6Okl0ZXJLaW5kIGtpbmQpOwotCi1zdGF0aWMgUHlPYmplY3QqIEl0ZXIoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIE5ld0NvbnRhaW5lckl0ZXJhdG9yKHNlbGYsIFB5Q29udGFpbmVySXRlcmF0b3I6OktJTkRfSVRFUktFWSk7Ci19Ci1zdGF0aWMgUHlPYmplY3QqIEl0ZXJLZXlzKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICByZXR1cm4gTmV3Q29udGFpbmVySXRlcmF0b3Ioc2VsZiwgUHlDb250YWluZXJJdGVyYXRvcjo6S0lORF9JVEVSS0VZKTsKLX0KLXN0YXRpYyBQeU9iamVjdCogSXRlclZhbHVlcyhQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgcmV0dXJuIE5ld0NvbnRhaW5lckl0ZXJhdG9yKHNlbGYsIFB5Q29udGFpbmVySXRlcmF0b3I6OktJTkRfSVRFUlZBTFVFKTsKLX0KLXN0YXRpYyBQeU9iamVjdCogSXRlckl0ZW1zKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICByZXR1cm4gTmV3Q29udGFpbmVySXRlcmF0b3Ioc2VsZiwgUHlDb250YWluZXJJdGVyYXRvcjo6S0lORF9JVEVSSVRFTSk7Ci19Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBNYXBwaW5nTWV0aG9kc1tdID0gewotICB7ICJnZXQiLCAoUHlDRnVuY3Rpb24pR2V0LCBNRVRIX1ZBUkFSR1MsIH0sCi0gIHsgImtleXMiLCAoUHlDRnVuY3Rpb24pS2V5cywgTUVUSF9OT0FSR1MsIH0sCi0gIHsgInZhbHVlcyIsIChQeUNGdW5jdGlvbilWYWx1ZXMsIE1FVEhfTk9BUkdTLCB9LAotICB7ICJpdGVtcyIsIChQeUNGdW5jdGlvbilJdGVtcywgTUVUSF9OT0FSR1MsIH0sCi0gIHsgIml0ZXJrZXlzIiwgKFB5Q0Z1bmN0aW9uKUl0ZXJLZXlzLCBNRVRIX05PQVJHUywgfSwKLSAgeyAiaXRlcnZhbHVlcyIsIChQeUNGdW5jdGlvbilJdGVyVmFsdWVzLCBNRVRIX05PQVJHUywgfSwKLSAgeyAiaXRlcml0ZW1zIiwgKFB5Q0Z1bmN0aW9uKUl0ZXJJdGVtcywgTUVUSF9OT0FSR1MsIH0sCi0gIHtOVUxMfQotfTsKLQotUHlUeXBlT2JqZWN0IERlc2NyaXB0b3JNYXBwaW5nX1R5cGUgPSB7Ci0gIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gICJEZXNjcmlwdG9yTWFwcGluZyIsICAgICAgICAgICAgICAgICAgLy8gdHBfbmFtZQotICBzaXplb2YoUHlDb250YWluZXIpLCAgICAgICAgICAgICAgICAgIC8vIHRwX2Jhc2ljc2l6ZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZW1zaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVhbGxvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3ByaW50Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCi0gIChyZXByZnVuYylDb250YWluZXJSZXByLCAgICAgICAgICAgICAgLy8gdHBfcmVwcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgotICAmTWFwcGluZ1NlcXVlbmNlTWV0aG9kcywgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCi0gICZNYXBwaW5nTWFwcGluZ01ldGhvZHMsICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgotICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZsYWdzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgotICAocmljaGNtcGZ1bmMpUmljaENvbXBhcmUsICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKLSAgKGdldGl0ZXJmdW5jKUl0ZXIsICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKLSAgTWFwcGluZ01ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZXRob2RzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldHNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Jhc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3JfZ2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3Jfc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2luaXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hbGxvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX25ldwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZyZWUKLX07Ci0KLS8vIFRoZSBEZXNjcmlwdG9yU2VxdWVuY2UgdHlwZS4KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRJdGVtKFB5Q29udGFpbmVyKiBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7Ci0gIGlmIChpbmRleCA8IDApIHsKLSAgICBpbmRleCArPSBMZW5ndGgoc2VsZik7Ci0gIH0KLSAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBMZW5ndGgoc2VsZikpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfSW5kZXhFcnJvciwgImluZGV4IG91dCBvZiByYW5nZSIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBfTmV3T2JqX0J5SW5kZXgoc2VsZiwgaW5kZXgpOwotfQotCi0vLyBSZXR1cm5zIHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpbiB0aGUgc2VxdWVuY2UsIG9mIC0xIGlmIG5vdCBmb3VuZC4KLS8vIFRoaXMgZnVuY3Rpb24gbmV2ZXIgZmFpbHMuCi1pbnQgRmluZChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGl0ZW0pIHsKLSAgLy8gVGhlIGl0ZW0gY2FuIG9ubHkgYmUgaW4gb25lIHBvc2l0aW9uOiBpdGVtLmluZGV4LgotICAvLyBDaGVjayB0aGF0IHNlbGZbaXRlbS5pbmRleF0gPT0gaXRlbSwgaXQncyBmYXN0ZXIgdGhhbiBhIGxpbmVhciBzZWFyY2guCi0gIC8vCi0gIC8vIFRoaXMgYXNzdW1lcyB0aGF0IHNlcXVlbmNlcyBhcmUgb25seSBkZWZpbmVkIGJ5IHN5bnRheCBvZiB0aGUgLnByb3RvIGZpbGU6Ci0gIC8vIGEgc3BlY2lmaWMgaXRlbSBiZWxvbmdzIHRvIG9ubHkgb25lIHNlcXVlbmNlLCBkZXBlbmRpbmcgb24gaXRzIHBvc2l0aW9uIGluCi0gIC8vIHRoZSAucHJvdG8gZmlsZSBkZWZpbml0aW9uLgotICBjb25zdCB2b2lkKiBkZXNjcmlwdG9yX3B0ciA9IFB5RGVzY3JpcHRvcl9Bc1ZvaWRQdHIoaXRlbSk7Ci0gIGlmIChkZXNjcmlwdG9yX3B0ciA9PSBOVUxMKSB7Ci0gICAgLy8gTm90IGEgZGVzY3JpcHRvciwgaXQgY2Fubm90IGJlIGluIHRoZSBsaXN0LgotICAgIHJldHVybiAtMTsKLSAgfQotICBpZiAoc2VsZi0+Y29udGFpbmVyX2RlZi0+Z2V0X2l0ZW1faW5kZXhfZm4pIHsKLSAgICBpbnQgaW5kZXggPSBzZWxmLT5jb250YWluZXJfZGVmLT5nZXRfaXRlbV9pbmRleF9mbihkZXNjcmlwdG9yX3B0cik7Ci0gICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBMZW5ndGgoc2VsZikpIHsKLSAgICAgIC8vIFRoaXMgaW5kZXggaXMgbm90IGZyb20gdGhpcyBjb2xsZWN0aW9uLgotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoc2VsZi0+Y29udGFpbmVyX2RlZi0+Z2V0X2J5X2luZGV4X2ZuKHNlbGYsIGluZGV4KSAhPSBkZXNjcmlwdG9yX3B0cikgewotICAgICAgLy8gVGhlIGRlc2NyaXB0b3IgYXQgdGhpcyBpbmRleCBpcyBub3QgdGhlIHNhbWUuCi0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIC8vIHNlbGZbaXRlbS5pbmRleF0gPT0gaXRlbSwgc28gcmV0dXJuIHRoZSBpbmRleC4KLSAgICByZXR1cm4gaW5kZXg7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gRmFsbCBiYWNrIHRvIGxpbmVhciBzZWFyY2guCi0gICAgaW50IGxlbmd0aCA9IExlbmd0aChzZWxmKTsKLSAgICBmb3IgKGludCBpbmRleD0wOyBpbmRleCA8IGxlbmd0aDsgaW5kZXgrKykgewotICAgICAgaWYgKHNlbGYtPmNvbnRhaW5lcl9kZWYtPmdldF9ieV9pbmRleF9mbihzZWxmLCBpbmRleCkgPT0gZGVzY3JpcHRvcl9wdHIpIHsKLSAgICAgICAgcmV0dXJuIGluZGV4OwotICAgICAgfQotICAgIH0KLSAgICAvLyBOb3QgZm91bmQKLSAgICByZXR1cm4gLTE7Ci0gIH0KLX0KLQotLy8gSW1wbGVtZW50cyBsaXN0LmluZGV4KCk6IHRoZSBwb3NpdGlvbiBvZiB0aGUgaXRlbSBpcyBpbiB0aGUgc2VxdWVuY2UuCi1zdGF0aWMgUHlPYmplY3QqIEluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSkgewotICBpbnQgcG9zaXRpb24gPSBGaW5kKHNlbGYsIGl0ZW0pOwotICBpZiAocG9zaXRpb24gPCAwKSB7Ci0gICAgLy8gTm90IGZvdW5kCi0gICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19WYWx1ZUVycm9yKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcocG9zaXRpb24pOwotICB9Ci19Ci0vLyBJbXBsZW1lbnRzICJsaXN0Ll9fY29udGFpbnNfXygpIjogaXMgdGhlIG9iamVjdCBpbiB0aGUgc2VxdWVuY2UuCi1zdGF0aWMgaW50IFNlcUNvbnRhaW5zKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSkgewotICBpbnQgcG9zaXRpb24gPSBGaW5kKHNlbGYsIGl0ZW0pOwotICBpZiAocG9zaXRpb24gPCAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLX0KLQotLy8gSW1wbGVtZW50cyBsaXN0LmNvdW50KCk6IG51bWJlciBvZiBvY2N1cnJlbmNlcyBvZiB0aGUgaXRlbSBpbiB0aGUgc2VxdWVuY2UuCi0vLyBBbiBpdGVtIGNhbiBvbmx5IGFwcGVhciBvbmNlIGluIGEgc2VxdWVuY2UuIElmIGl0IGV4aXN0cywgcmV0dXJuIDEuCi1zdGF0aWMgUHlPYmplY3QqIENvdW50KFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogaXRlbSkgewotICBpbnQgcG9zaXRpb24gPSBGaW5kKHNlbGYsIGl0ZW0pOwotICBpZiAocG9zaXRpb24gPCAwKSB7Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKDApOwotICB9IGVsc2UgewotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZygxKTsKLSAgfQotfQotCi1zdGF0aWMgUHlPYmplY3QqIEFwcGVuZChQeUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgaWYgKF9DYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgwKSkgewotICAgIFB5X1JFVFVSTl9OT05FOwotICB9Ci0gIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAiJyUuMjAwcycgb2JqZWN0IGlzIG5vdCBhIG11dGFibGUgc2VxdWVuY2UiLAotICAgICAgICAgICAgICAgUHlfVFlQRShzZWxmKS0+dHBfbmFtZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFJldmVyc2VkKFB5Q29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICByZXR1cm4gTmV3Q29udGFpbmVySXRlcmF0b3Ioc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5Q29udGFpbmVySXRlcmF0b3I6OktJTkRfSVRFUlZBTFVFX1JFVkVSU0VEKTsKLX0KLQotc3RhdGljIFB5TWV0aG9kRGVmIFNlcU1ldGhvZHNbXSA9IHsKLSAgeyAiaW5kZXgiLCAoUHlDRnVuY3Rpb24pSW5kZXgsIE1FVEhfTywgfSwKLSAgeyAiY291bnQiLCAoUHlDRnVuY3Rpb24pQ291bnQsIE1FVEhfTywgfSwKLSAgeyAiYXBwZW5kIiwgKFB5Q0Z1bmN0aW9uKUFwcGVuZCwgTUVUSF9PLCB9LAotICB7ICJfX3JldmVyc2VkX18iLCAoUHlDRnVuY3Rpb24pUmV2ZXJzZWQsIE1FVEhfTk9BUkdTLCB9LAotICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBQeVNlcXVlbmNlTWV0aG9kcyBTZXFTZXF1ZW5jZU1ldGhvZHMgPSB7Ci0gICAgKGxlbmZ1bmMpTGVuZ3RoLCAgICAgICAgICAvLyBzcV9sZW5ndGgKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNxX2NvbmNhdAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3FfcmVwZWF0Ci0gICAgKHNzaXplYXJnZnVuYylHZXRJdGVtLCAgICAvLyBzcV9pdGVtCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAvLyBzcV9zbGljZQotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3FfYXNzX2l0ZW0KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNxX2Fzc19zbGljZQotICAgIChvYmpvYmpwcm9jKVNlcUNvbnRhaW5zLCAgLy8gc3FfY29udGFpbnMKLX07Ci0KLVB5VHlwZU9iamVjdCBEZXNjcmlwdG9yU2VxdWVuY2VfVHlwZSA9IHsKLSAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgIkRlc2NyaXB0b3JTZXF1ZW5jZSIsICAgICAgICAgICAgICAgICAvLyB0cF9uYW1lCi0gIHNpemVvZihQeUNvbnRhaW5lciksICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKLSAgKHJlcHJmdW5jKUNvbnRhaW5lclJlcHIsICAgICAgICAgICAgICAvLyB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCi0gICZTZXFTZXF1ZW5jZU1ldGhvZHMsICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCi0gIChyaWNoY21wZnVuYylSaWNoQ29tcGFyZSwgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAotICBTZXFNZXRob2RzLCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9zZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZnJlZQotfTsKLQotc3RhdGljIFB5T2JqZWN0KiBOZXdNYXBwaW5nQnlOYW1lKAotICAgIERlc2NyaXB0b3JDb250YWluZXJEZWYqIGNvbnRhaW5lcl9kZWYsIGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpIHsKLSAgUHlDb250YWluZXIqIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlDb250YWluZXIsICZEZXNjcmlwdG9yTWFwcGluZ19UeXBlKTsKLSAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHNlbGYtPmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICBzZWxmLT5jb250YWluZXJfZGVmID0gY29udGFpbmVyX2RlZjsKLSAgc2VsZi0+a2luZCA9IFB5Q29udGFpbmVyOjpLSU5EX0JZTkFNRTsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBOZXdNYXBwaW5nQnlDYW1lbGNhc2VOYW1lKAotICAgIERlc2NyaXB0b3JDb250YWluZXJEZWYqIGNvbnRhaW5lcl9kZWYsIGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpIHsKLSAgUHlDb250YWluZXIqIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlDb250YWluZXIsICZEZXNjcmlwdG9yTWFwcGluZ19UeXBlKTsKLSAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHNlbGYtPmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICBzZWxmLT5jb250YWluZXJfZGVmID0gY29udGFpbmVyX2RlZjsKLSAgc2VsZi0+a2luZCA9IFB5Q29udGFpbmVyOjpLSU5EX0JZQ0FNRUxDQVNFTkFNRTsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBOZXdNYXBwaW5nQnlOdW1iZXIoCi0gICAgRGVzY3JpcHRvckNvbnRhaW5lckRlZiogY29udGFpbmVyX2RlZiwgY29uc3Qgdm9pZCogZGVzY3JpcHRvcikgewotICBpZiAoY29udGFpbmVyX2RlZi0+Z2V0X2J5X251bWJlcl9mbiA9PSBOVUxMIHx8Ci0gICAgICBjb250YWluZXJfZGVmLT5nZXRfaXRlbV9udW1iZXJfZm4gPT0gTlVMTCkgewotICAgIFB5RXJyX1NldE5vbmUoUHlFeGNfTm90SW1wbGVtZW50ZWRFcnJvcik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlDb250YWluZXIqIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlDb250YWluZXIsICZEZXNjcmlwdG9yTWFwcGluZ19UeXBlKTsKLSAgaWYgKHNlbGYgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHNlbGYtPmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICBzZWxmLT5jb250YWluZXJfZGVmID0gY29udGFpbmVyX2RlZjsKLSAgc2VsZi0+a2luZCA9IFB5Q29udGFpbmVyOjpLSU5EX0JZTlVNQkVSOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIE5ld1NlcXVlbmNlKAotICAgIERlc2NyaXB0b3JDb250YWluZXJEZWYqIGNvbnRhaW5lcl9kZWYsIGNvbnN0IHZvaWQqIGRlc2NyaXB0b3IpIHsKLSAgUHlDb250YWluZXIqIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlDb250YWluZXIsICZEZXNjcmlwdG9yU2VxdWVuY2VfVHlwZSk7Ci0gIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBzZWxmLT5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgc2VsZi0+Y29udGFpbmVyX2RlZiA9IGNvbnRhaW5lcl9kZWY7Ci0gIHNlbGYtPmtpbmQgPSBQeUNvbnRhaW5lcjo6S0lORF9TRVFVRU5DRTsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKTsKLX0KLQotLy8gSW1wbGVtZW50IGl0ZXJhdG9ycyBvdmVyIFB5Q29udGFpbmVycy4KLQotc3RhdGljIHZvaWQgSXRlcmF0b3JfRGVhbGxvYyhQeUNvbnRhaW5lckl0ZXJhdG9yKiBzZWxmKSB7Ci0gIFB5X0NMRUFSKHNlbGYtPmNvbnRhaW5lcik7Ci0gIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBJdGVyYXRvcl9OZXh0KFB5Q29udGFpbmVySXRlcmF0b3IqIHNlbGYpIHsKLSAgaW50IGNvdW50ID0gc2VsZi0+Y29udGFpbmVyLT5jb250YWluZXJfZGVmLT5jb3VudF9mbihzZWxmLT5jb250YWluZXIpOwotICBpZiAoc2VsZi0+aW5kZXggPj0gY291bnQpIHsKLSAgICAvLyBSZXR1cm4gTlVMTCB3aXRoIG5vIGV4Y2VwdGlvbiB0byBpbmRpY2F0ZSB0aGUgZW5kLgotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGludCBpbmRleCA9IHNlbGYtPmluZGV4OwotICBzZWxmLT5pbmRleCArPSAxOwotICBzd2l0Y2ggKHNlbGYtPmtpbmQpIHsKLSAgICBjYXNlIFB5Q29udGFpbmVySXRlcmF0b3I6OktJTkRfSVRFUktFWToKLSAgICAgIHJldHVybiBfTmV3S2V5X0J5SW5kZXgoc2VsZi0+Y29udGFpbmVyLCBpbmRleCk7Ci0gICAgY2FzZSBQeUNvbnRhaW5lckl0ZXJhdG9yOjpLSU5EX0lURVJWQUxVRToKLSAgICAgIHJldHVybiBfTmV3T2JqX0J5SW5kZXgoc2VsZi0+Y29udGFpbmVyLCBpbmRleCk7Ci0gICAgY2FzZSBQeUNvbnRhaW5lckl0ZXJhdG9yOjpLSU5EX0lURVJWQUxVRV9SRVZFUlNFRDoKLSAgICAgIHJldHVybiBfTmV3T2JqX0J5SW5kZXgoc2VsZi0+Y29udGFpbmVyLCBjb3VudCAtIGluZGV4IC0gMSk7Ci0gICAgY2FzZSBQeUNvbnRhaW5lckl0ZXJhdG9yOjpLSU5EX0lURVJJVEVNOgotICAgICAgewotICAgICAgICBQeU9iamVjdCogb2JqID0gUHlUdXBsZV9OZXcoMik7Ci0gICAgICAgIGlmIChvYmogPT0gTlVMTCkgewotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFB5T2JqZWN0KiBrZXkgPSBfTmV3S2V5X0J5SW5kZXgoc2VsZi0+Y29udGFpbmVyLCBpbmRleCk7Ci0gICAgICAgIGlmIChrZXkgPT0gTlVMTCkgewotICAgICAgICAgIFB5X0RFQ1JFRihvYmopOwotICAgICAgICAgIHJldHVybiBOVUxMOwotICAgICAgICB9Ci0gICAgICAgIFB5VHVwbGVfU0VUX0lURU0ob2JqLCAwLCBrZXkpOwotICAgICAgICBQeU9iamVjdCogdmFsdWUgPSBfTmV3T2JqX0J5SW5kZXgoc2VsZi0+Y29udGFpbmVyLCBpbmRleCk7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgUHlfREVDUkVGKG9iaik7Ci0gICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgUHlUdXBsZV9TRVRfSVRFTShvYmosIDEsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIG9iajsKLSAgICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgUHlFcnJfU2V0Tm9uZShQeUV4Y19Ob3RJbXBsZW1lbnRlZEVycm9yKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyBQeVR5cGVPYmplY3QgQ29udGFpbmVySXRlcmF0b3JfVHlwZSA9IHsKLSAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgIkRlc2NyaXB0b3JDb250YWluZXJJdGVyYXRvciIsICAgICAgICAvLyB0cF9uYW1lCi0gIHNpemVvZihQeUNvbnRhaW5lckl0ZXJhdG9yKSwgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKLSAgKGRlc3RydWN0b3IpSXRlcmF0b3JfRGVhbGxvYywgICAgICAgICAvLyB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF93ZWFrbGlzdG9mZnNldAotICBQeU9iamVjdF9TZWxmSXRlciwgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKLSAgKGl0ZXJuZXh0ZnVuYylJdGVyYXRvcl9OZXh0LCAgICAgICAgICAvLyB0cF9pdGVybmV4dAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX21ldGhvZHMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9zZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZnJlZQotfTsKLQotc3RhdGljIFB5T2JqZWN0KiBOZXdDb250YWluZXJJdGVyYXRvcihQeUNvbnRhaW5lciogY29udGFpbmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeUNvbnRhaW5lckl0ZXJhdG9yOjpJdGVyS2luZCBraW5kKSB7Ci0gIFB5Q29udGFpbmVySXRlcmF0b3IqIHNlbGYgPSBQeU9iamVjdF9OZXcoUHlDb250YWluZXJJdGVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ29udGFpbmVySXRlcmF0b3JfVHlwZSk7Ci0gIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9JTkNSRUYoY29udGFpbmVyKTsKLSAgc2VsZi0+Y29udGFpbmVyID0gY29udGFpbmVyOwotICBzZWxmLT5raW5kID0ga2luZDsKLSAgc2VsZi0+aW5kZXggPSAwOwotCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXNjcmlwdG9yCi0KLS8vIE5vdyBkZWZpbmUgdGhlIHJlYWwgY29sbGVjdGlvbnMhCi0KLW5hbWVzcGFjZSBtZXNzYWdlX2Rlc2NyaXB0b3IgewotCi10eXBlZGVmIGNvbnN0IERlc2NyaXB0b3IqIFBhcmVudERlc2NyaXB0b3I7Ci0KLXN0YXRpYyBQYXJlbnREZXNjcmlwdG9yIEdldERlc2NyaXB0b3IoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyZW50RGVzY3JpcHRvcj4oc2VsZi0+ZGVzY3JpcHRvcik7Ci19Ci0KLW5hbWVzcGFjZSBmaWVsZHMgewotCi10eXBlZGVmIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7Ci0KLXN0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmZpZWxkX2NvdW50KCk7Ci19Ci0KLXN0YXRpYyBJdGVtRGVzY3JpcHRvciBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZEZpZWxkQnlOYW1lKG5hbWUpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlDYW1lbGNhc2VOYW1lKFB5Q29udGFpbmVyKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZShuYW1lKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5TnVtYmVyKFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgbnVtYmVyKSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kRmllbGRCeU51bWJlcihudW1iZXIpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5maWVsZChpbmRleCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoaXRlbSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcmIEdldEl0ZW1OYW1lKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPm5hbWUoKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cmluZyYgR2V0SXRlbUNhbWVsY2FzZU5hbWUoSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gaXRlbS0+Y2FtZWxjYXNlX25hbWUoKTsKLX0KLQotc3RhdGljIGludCBHZXRJdGVtTnVtYmVyKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPm51bWJlcigpOwotfQotCi1zdGF0aWMgaW50IEdldEl0ZW1JbmRleChJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBpdGVtLT5pbmRleCgpOwotfQotCi1zdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7Ci0gICJNZXNzYWdlRmllbGRzIiwKLSAgKENvdW50TWV0aG9kKUNvdW50LAotICAoR2V0QnlJbmRleE1ldGhvZClHZXRCeUluZGV4LAotICAoR2V0QnlOYW1lTWV0aG9kKUdldEJ5TmFtZSwKLSAgKEdldEJ5Q2FtZWxjYXNlTmFtZU1ldGhvZClHZXRCeUNhbWVsY2FzZU5hbWUsCi0gIChHZXRCeU51bWJlck1ldGhvZClHZXRCeU51bWJlciwKLSAgKE5ld09iamVjdEZyb21JdGVtTWV0aG9kKU5ld09iamVjdEZyb21JdGVtLAotICAoR2V0SXRlbU5hbWVNZXRob2QpR2V0SXRlbU5hbWUsCi0gIChHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZClHZXRJdGVtQ2FtZWxjYXNlTmFtZSwKLSAgKEdldEl0ZW1OdW1iZXJNZXRob2QpR2V0SXRlbU51bWJlciwKLSAgKEdldEl0ZW1JbmRleE1ldGhvZClHZXRJdGVtSW5kZXgsCi19OwotCi19ICAvLyBuYW1lc3BhY2UgZmllbGRzCi0KLVB5T2JqZWN0KiBOZXdNZXNzYWdlRmllbGRzQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZmllbGRzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1QeU9iamVjdCogTmV3TWVzc2FnZUZpZWxkc0J5Q2FtZWxjYXNlTmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeUNhbWVsY2FzZU5hbWUoJmZpZWxkczo6Q29udGFpbmVyRGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yKTsKLX0KLQotUHlPYmplY3QqIE5ld01lc3NhZ2VGaWVsZHNCeU51bWJlcihQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU51bWJlcigmZmllbGRzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1QeU9iamVjdCogTmV3TWVzc2FnZUZpZWxkc1NlcShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZmaWVsZHM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Ci19Ci0KLW5hbWVzcGFjZSBuZXN0ZWRfdHlwZXMgewotCi10eXBlZGVmIGNvbnN0IERlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOwotCi1zdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5uZXN0ZWRfdHlwZV9jb3VudCgpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmROZXN0ZWRUeXBlQnlOYW1lKG5hbWUpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5uZXN0ZWRfdHlwZShpbmRleCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gUHlNZXNzYWdlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihpdGVtKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cmluZyYgR2V0SXRlbU5hbWUoSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gaXRlbS0+bmFtZSgpOwotfQotCi1zdGF0aWMgaW50IEdldEl0ZW1JbmRleChJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBpdGVtLT5pbmRleCgpOwotfQotCi1zdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7Ci0gICJNZXNzYWdlTmVzdGVkVHlwZXMiLAotICAoQ291bnRNZXRob2QpQ291bnQsCi0gIChHZXRCeUluZGV4TWV0aG9kKUdldEJ5SW5kZXgsCi0gIChHZXRCeU5hbWVNZXRob2QpR2V0QnlOYW1lLAotICAoR2V0QnlDYW1lbGNhc2VOYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRCeU51bWJlck1ldGhvZClOVUxMLAotICAoTmV3T2JqZWN0RnJvbUl0ZW1NZXRob2QpTmV3T2JqZWN0RnJvbUl0ZW0sCi0gIChHZXRJdGVtTmFtZU1ldGhvZClHZXRJdGVtTmFtZSwKLSAgKEdldEl0ZW1DYW1lbGNhc2VOYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRJdGVtTnVtYmVyTWV0aG9kKU5VTEwsCi0gIChHZXRJdGVtSW5kZXhNZXRob2QpR2V0SXRlbUluZGV4LAotfTsKLQotfSAgLy8gbmFtZXNwYWNlIG5lc3RlZF90eXBlcwotCi1QeU9iamVjdCogTmV3TWVzc2FnZU5lc3RlZFR5cGVzU2VxKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3U2VxdWVuY2UoJm5lc3RlZF90eXBlczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotUHlPYmplY3QqIE5ld01lc3NhZ2VOZXN0ZWRUeXBlc0J5TmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJm5lc3RlZF90eXBlczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotbmFtZXNwYWNlIGVudW1zIHsKLQotdHlwZWRlZiBjb25zdCBFbnVtRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7Ci0KLXN0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmVudW1fdHlwZV9jb3VudCgpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRFbnVtVHlwZUJ5TmFtZShuYW1lKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZW51bV90eXBlKGluZGV4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBQeUVudW1EZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGl0ZW0pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RyaW5nJiBHZXRJdGVtTmFtZShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBpdGVtLT5uYW1lKCk7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0SXRlbUluZGV4KEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPmluZGV4KCk7Ci19Ci0KLXN0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKLSAgIk1lc3NhZ2VOZXN0ZWRFbnVtcyIsCi0gIChDb3VudE1ldGhvZClDb3VudCwKLSAgKEdldEJ5SW5kZXhNZXRob2QpR2V0QnlJbmRleCwKLSAgKEdldEJ5TmFtZU1ldGhvZClHZXRCeU5hbWUsCi0gIChHZXRCeUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEJ5TnVtYmVyTWV0aG9kKU5VTEwsCi0gIChOZXdPYmplY3RGcm9tSXRlbU1ldGhvZClOZXdPYmplY3RGcm9tSXRlbSwKLSAgKEdldEl0ZW1OYW1lTWV0aG9kKUdldEl0ZW1OYW1lLAotICAoR2V0SXRlbUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1OdW1iZXJNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1JbmRleE1ldGhvZClHZXRJdGVtSW5kZXgsCi19OwotCi19ICAvLyBuYW1lc3BhY2UgZW51bXMKLQotUHlPYmplY3QqIE5ld01lc3NhZ2VFbnVtc0J5TmFtZShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJmVudW1zOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1QeU9iamVjdCogTmV3TWVzc2FnZUVudW1zU2VxKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3U2VxdWVuY2UoJmVudW1zOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1uYW1lc3BhY2UgZW51bXZhbHVlcyB7Ci0KLS8vIFRoaXMgaXMgdGhlICJlbnVtX3ZhbHVlc19ieV9uYW1lIiBtYXBwaW5nLCB3aGljaCBjb2xsZWN0cyB2YWx1ZXMgZnJvbSBhbGwKLS8vIGVudW0gdHlwZXMgaW4gYSBtZXNzYWdlLgotLy8KLS8vIE5vdGUgdGhhdCB0aGUgYmVoYXZpb3Igb2YgdGhlIEMrKyBkZXNjcmlwdG9yIGlzIGRpZmZlcmVudDogaXQgd2lsbCBzZWFyY2ggYW5kCi0vLyByZXR1cm4gdGhlIGZpcnN0IHZhbHVlIHRoYXQgbWF0Y2hlcyB0aGUgbmFtZSwgd2hlcmVhcyB0aGUgUHl0aG9uCi0vLyBpbXBsZW1lbnRhdGlvbiByZXRyaWV2ZXMgdGhlIGxhc3Qgb25lLgotCi10eXBlZGVmIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOwotCi1zdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgR2V0RGVzY3JpcHRvcihzZWxmKS0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgewotICAgIGNvdW50ICs9IEdldERlc2NyaXB0b3Ioc2VsZiktPmVudW1fdHlwZShpKS0+dmFsdWVfY291bnQoKTsKLSAgfQotICByZXR1cm4gY291bnQ7Ci19Ci0KLXN0YXRpYyBJdGVtRGVzY3JpcHRvciBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZEVudW1WYWx1ZUJ5TmFtZShuYW1lKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgewotICAvLyBUaGlzIGlzIG5vdCBvcHRpbWFsLCBidXQgdGhlIG51bWJlciBvZiBlbnVtcyAqdHlwZXMqIGluIGEgZ2l2ZW4gbWVzc2FnZQotICAvLyBpcyBzbWFsbC4gIFRoaXMgZnVuY3Rpb24gaXMgb25seSB1c2VkIHdoZW4gaXRlcmF0aW5nIG92ZXIgdGhlIG1hcHBpbmcuCi0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBOVUxMOwotICBpbnQgZW51bV90eXBlX2NvdW50ID0gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZW51bV90eXBlX2NvdW50KCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX2NvdW50OyArK2kpIHsKLSAgICBlbnVtX3R5cGUgPSBHZXREZXNjcmlwdG9yKHNlbGYpLT5lbnVtX3R5cGUoaSk7Ci0gICAgaW50IGVudW1fdmFsdWVfY291bnQgPSBlbnVtX3R5cGUtPnZhbHVlX2NvdW50KCk7Ci0gICAgaWYgKGluZGV4IDwgZW51bV92YWx1ZV9jb3VudCkgewotICAgICAgLy8gRm91bmQgaXQhCi0gICAgICBicmVhazsKLSAgICB9Ci0gICAgaW5kZXggLT0gZW51bV92YWx1ZV9jb3VudDsKLSAgfQotICAvLyBUaGUgbmV4dCBzdGF0ZW1lbnQgY2Fubm90IG92ZXJmbG93LCBiZWNhdXNlIHRoaXMgZnVuY3Rpb24gaXMgb25seSBjYWxsZWQgYnkKLSAgLy8gaW50ZXJuYWwgaXRlcmF0b3JzIHdoaWNoIGVuc3VyZSB0aGF0IDAgPD0gaW5kZXggPCBDb3VudCgpLgotICByZXR1cm4gZW51bV90eXBlLT52YWx1ZShpbmRleCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gUHlFbnVtVmFsdWVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGl0ZW0pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RyaW5nJiBHZXRJdGVtTmFtZShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBpdGVtLT5uYW1lKCk7Ci19Ci0KLXN0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKLSAgIk1lc3NhZ2VFbnVtVmFsdWVzIiwKLSAgKENvdW50TWV0aG9kKUNvdW50LAotICAoR2V0QnlJbmRleE1ldGhvZClHZXRCeUluZGV4LAotICAoR2V0QnlOYW1lTWV0aG9kKUdldEJ5TmFtZSwKLSAgKEdldEJ5Q2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0QnlOdW1iZXJNZXRob2QpTlVMTCwKLSAgKE5ld09iamVjdEZyb21JdGVtTWV0aG9kKU5ld09iamVjdEZyb21JdGVtLAotICAoR2V0SXRlbU5hbWVNZXRob2QpR2V0SXRlbU5hbWUsCi0gIChHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0SXRlbU51bWJlck1ldGhvZClOVUxMLAotICAoR2V0SXRlbUluZGV4TWV0aG9kKU5VTEwsCi19OwotCi19ICAvLyBuYW1lc3BhY2UgZW51bXZhbHVlcwotCi1QeU9iamVjdCogTmV3TWVzc2FnZUVudW1WYWx1ZXNCeU5hbWUoUGFyZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yOjpOZXdNYXBwaW5nQnlOYW1lKCZlbnVtdmFsdWVzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1uYW1lc3BhY2UgZXh0ZW5zaW9ucyB7Ci0KLXR5cGVkZWYgY29uc3QgRmllbGREZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKLQotc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZXh0ZW5zaW9uX2NvdW50KCk7Ci19Ci0KLXN0YXRpYyBJdGVtRGVzY3JpcHRvciBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZXh0ZW5zaW9uKGluZGV4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihpdGVtKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cmluZyYgR2V0SXRlbU5hbWUoSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gaXRlbS0+bmFtZSgpOwotfQotCi1zdGF0aWMgaW50IEdldEl0ZW1JbmRleChJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBpdGVtLT5pbmRleCgpOwotfQotCi1zdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7Ci0gICJNZXNzYWdlRXh0ZW5zaW9ucyIsCi0gIChDb3VudE1ldGhvZClDb3VudCwKLSAgKEdldEJ5SW5kZXhNZXRob2QpR2V0QnlJbmRleCwKLSAgKEdldEJ5TmFtZU1ldGhvZClHZXRCeU5hbWUsCi0gIChHZXRCeUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEJ5TnVtYmVyTWV0aG9kKU5VTEwsCi0gIChOZXdPYmplY3RGcm9tSXRlbU1ldGhvZClOZXdPYmplY3RGcm9tSXRlbSwKLSAgKEdldEl0ZW1OYW1lTWV0aG9kKUdldEl0ZW1OYW1lLAotICAoR2V0SXRlbUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1OdW1iZXJNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1JbmRleE1ldGhvZClHZXRJdGVtSW5kZXgsCi19OwotCi19ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9ucwotCi1QeU9iamVjdCogTmV3TWVzc2FnZUV4dGVuc2lvbnNCeU5hbWUoUGFyZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yOjpOZXdNYXBwaW5nQnlOYW1lKCZleHRlbnNpb25zOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1QeU9iamVjdCogTmV3TWVzc2FnZUV4dGVuc2lvbnNTZXEoUGFyZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yOjpOZXdTZXF1ZW5jZSgmZXh0ZW5zaW9uczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotbmFtZXNwYWNlIG9uZW9mcyB7Ci0KLXR5cGVkZWYgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKLQotc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+b25lb2ZfZGVjbF9jb3VudCgpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRPbmVvZkJ5TmFtZShuYW1lKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+b25lb2ZfZGVjbChpbmRleCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gUHlPbmVvZkRlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoaXRlbSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcmIEdldEl0ZW1OYW1lKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPm5hbWUoKTsKLX0KLQotc3RhdGljIGludCBHZXRJdGVtSW5kZXgoSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gaXRlbS0+aW5kZXgoKTsKLX0KLQotc3RhdGljIERlc2NyaXB0b3JDb250YWluZXJEZWYgQ29udGFpbmVyRGVmID0gewotICAiTWVzc2FnZU9uZW9mcyIsCi0gIChDb3VudE1ldGhvZClDb3VudCwKLSAgKEdldEJ5SW5kZXhNZXRob2QpR2V0QnlJbmRleCwKLSAgKEdldEJ5TmFtZU1ldGhvZClHZXRCeU5hbWUsCi0gIChHZXRCeUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEJ5TnVtYmVyTWV0aG9kKU5VTEwsCi0gIChOZXdPYmplY3RGcm9tSXRlbU1ldGhvZClOZXdPYmplY3RGcm9tSXRlbSwKLSAgKEdldEl0ZW1OYW1lTWV0aG9kKUdldEl0ZW1OYW1lLAotICAoR2V0SXRlbUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1OdW1iZXJNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1JbmRleE1ldGhvZClHZXRJdGVtSW5kZXgsCi19OwotCi19ICAvLyBuYW1lc3BhY2Ugb25lb2ZzCi0KLVB5T2JqZWN0KiBOZXdNZXNzYWdlT25lb2ZzQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmb25lb2ZzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1QeU9iamVjdCogTmV3TWVzc2FnZU9uZW9mc1NlcShQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZvbmVvZnM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZXNzYWdlX2Rlc2NyaXB0b3IKLQotbmFtZXNwYWNlIGVudW1fZGVzY3JpcHRvciB7Ci0KLXR5cGVkZWYgY29uc3QgRW51bURlc2NyaXB0b3IqIFBhcmVudERlc2NyaXB0b3I7Ci0KLXN0YXRpYyBQYXJlbnREZXNjcmlwdG9yIEdldERlc2NyaXB0b3IoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyZW50RGVzY3JpcHRvcj4oc2VsZi0+ZGVzY3JpcHRvcik7Ci19Ci0KLW5hbWVzcGFjZSBlbnVtdmFsdWVzIHsKLQotdHlwZWRlZiBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKLQotc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+dmFsdWVfY291bnQoKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+dmFsdWUoaW5kZXgpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRWYWx1ZUJ5TmFtZShuYW1lKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5TnVtYmVyKFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgbnVtYmVyKSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kVmFsdWVCeU51bWJlcihudW1iZXIpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIFB5RW51bVZhbHVlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihpdGVtKTsKLX0KLQotc3RhdGljIGNvbnN0IHN0cmluZyYgR2V0SXRlbU5hbWUoSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gaXRlbS0+bmFtZSgpOwotfQotCi1zdGF0aWMgaW50IEdldEl0ZW1OdW1iZXIoSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gaXRlbS0+bnVtYmVyKCk7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0SXRlbUluZGV4KEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPmluZGV4KCk7Ci19Ci0KLXN0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKLSAgIkVudW1WYWx1ZXMiLAotICAoQ291bnRNZXRob2QpQ291bnQsCi0gIChHZXRCeUluZGV4TWV0aG9kKUdldEJ5SW5kZXgsCi0gIChHZXRCeU5hbWVNZXRob2QpR2V0QnlOYW1lLAotICAoR2V0QnlDYW1lbGNhc2VOYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRCeU51bWJlck1ldGhvZClHZXRCeU51bWJlciwKLSAgKE5ld09iamVjdEZyb21JdGVtTWV0aG9kKU5ld09iamVjdEZyb21JdGVtLAotICAoR2V0SXRlbU5hbWVNZXRob2QpR2V0SXRlbU5hbWUsCi0gIChHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0SXRlbU51bWJlck1ldGhvZClHZXRJdGVtTnVtYmVyLAotICAoR2V0SXRlbUluZGV4TWV0aG9kKUdldEl0ZW1JbmRleCwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBlbnVtdmFsdWVzCi0KLVB5T2JqZWN0KiBOZXdFbnVtVmFsdWVzQnlOYW1lKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZW51bXZhbHVlczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotUHlPYmplY3QqIE5ld0VudW1WYWx1ZXNCeU51bWJlcihQYXJlbnREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU51bWJlcigmZW51bXZhbHVlczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotUHlPYmplY3QqIE5ld0VudW1WYWx1ZXNTZXEoUGFyZW50RGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yOjpOZXdTZXF1ZW5jZSgmZW51bXZhbHVlczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGVudW1fZGVzY3JpcHRvcgotCi1uYW1lc3BhY2Ugb25lb2ZfZGVzY3JpcHRvciB7Ci0KLXR5cGVkZWYgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBQYXJlbnREZXNjcmlwdG9yOwotCi1zdGF0aWMgUGFyZW50RGVzY3JpcHRvciBHZXREZXNjcmlwdG9yKFB5Q29udGFpbmVyKiBzZWxmKSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFBhcmVudERlc2NyaXB0b3I+KHNlbGYtPmRlc2NyaXB0b3IpOwotfQotCi1uYW1lc3BhY2UgZmllbGRzIHsKLQotdHlwZWRlZiBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOwotCi1zdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5maWVsZF9jb3VudCgpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5maWVsZChpbmRleCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTmV3T2JqZWN0RnJvbUl0ZW0oSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoaXRlbSk7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0SXRlbUluZGV4KEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPmluZGV4X2luX29uZW9mKCk7Ci19Ci0KLXN0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKLSAgIk9uZW9mRmllbGRzIiwKLSAgKENvdW50TWV0aG9kKUNvdW50LAotICAoR2V0QnlJbmRleE1ldGhvZClHZXRCeUluZGV4LAotICAoR2V0QnlOYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRCeUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEJ5TnVtYmVyTWV0aG9kKU5VTEwsCi0gIChOZXdPYmplY3RGcm9tSXRlbU1ldGhvZClOZXdPYmplY3RGcm9tSXRlbSwKLSAgKEdldEl0ZW1OYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0SXRlbU51bWJlck1ldGhvZClOVUxMLAotICAoR2V0SXRlbUluZGV4TWV0aG9kKUdldEl0ZW1JbmRleCwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBmaWVsZHMKLQotUHlPYmplY3QqIE5ld09uZW9mRmllbGRzU2VxKFBhcmVudERlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3U2VxdWVuY2UoJmZpZWxkczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIG9uZW9mX2Rlc2NyaXB0b3IKLQotbmFtZXNwYWNlIGZpbGVfZGVzY3JpcHRvciB7Ci0KLXR5cGVkZWYgY29uc3QgRmlsZURlc2NyaXB0b3IqIFBhcmVudERlc2NyaXB0b3I7Ci0KLXN0YXRpYyBQYXJlbnREZXNjcmlwdG9yIEdldERlc2NyaXB0b3IoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UGFyZW50RGVzY3JpcHRvcj4oc2VsZi0+ZGVzY3JpcHRvcik7Ci19Ci0KLW5hbWVzcGFjZSBtZXNzYWdlcyB7Ci0KLXR5cGVkZWYgY29uc3QgRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7Ci0KLXN0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPm1lc3NhZ2VfdHlwZV9jb3VudCgpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlOYW1lKFB5Q29udGFpbmVyKiBzZWxmLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShuYW1lKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5SW5kZXgoUHlDb250YWluZXIqIHNlbGYsIGludCBpbmRleCkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+bWVzc2FnZV90eXBlKGluZGV4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBQeU1lc3NhZ2VEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGl0ZW0pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RyaW5nJiBHZXRJdGVtTmFtZShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBpdGVtLT5uYW1lKCk7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0SXRlbUluZGV4KEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPmluZGV4KCk7Ci19Ci0KLXN0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKLSAgIkZpbGVNZXNzYWdlcyIsCi0gIChDb3VudE1ldGhvZClDb3VudCwKLSAgKEdldEJ5SW5kZXhNZXRob2QpR2V0QnlJbmRleCwKLSAgKEdldEJ5TmFtZU1ldGhvZClHZXRCeU5hbWUsCi0gIChHZXRCeUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEJ5TnVtYmVyTWV0aG9kKU5VTEwsCi0gIChOZXdPYmplY3RGcm9tSXRlbU1ldGhvZClOZXdPYmplY3RGcm9tSXRlbSwKLSAgKEdldEl0ZW1OYW1lTWV0aG9kKUdldEl0ZW1OYW1lLAotICAoR2V0SXRlbUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1OdW1iZXJNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1JbmRleE1ldGhvZClHZXRJdGVtSW5kZXgsCi19OwotCi19ICAvLyBuYW1lc3BhY2UgbWVzc2FnZXMKLQotUHlPYmplY3QqIE5ld0ZpbGVNZXNzYWdlVHlwZXNCeU5hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld01hcHBpbmdCeU5hbWUoJm1lc3NhZ2VzOjpDb250YWluZXJEZWYsIGRlc2NyaXB0b3IpOwotfQotCi1uYW1lc3BhY2UgZW51bXMgewotCi10eXBlZGVmIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBJdGVtRGVzY3JpcHRvcjsKLQotc3RhdGljIGludCBDb3VudChQeUNvbnRhaW5lciogc2VsZikgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+ZW51bV90eXBlX2NvdW50KCk7Ci19Ci0KLXN0YXRpYyBJdGVtRGVzY3JpcHRvciBHZXRCeU5hbWUoUHlDb250YWluZXIqIHNlbGYsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcihzZWxmKS0+RmluZEVudW1UeXBlQnlOYW1lKG5hbWUpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5lbnVtX3R5cGUoaW5kZXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIFB5RW51bURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoaXRlbSk7Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJpbmcmIEdldEl0ZW1OYW1lKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPm5hbWUoKTsKLX0KLQotc3RhdGljIGludCBHZXRJdGVtSW5kZXgoSXRlbURlc2NyaXB0b3IgaXRlbSkgewotICByZXR1cm4gaXRlbS0+aW5kZXgoKTsKLX0KLQotc3RhdGljIERlc2NyaXB0b3JDb250YWluZXJEZWYgQ29udGFpbmVyRGVmID0gewotICAiRmlsZUVudW1zIiwKLSAgKENvdW50TWV0aG9kKUNvdW50LAotICAoR2V0QnlJbmRleE1ldGhvZClHZXRCeUluZGV4LAotICAoR2V0QnlOYW1lTWV0aG9kKUdldEJ5TmFtZSwKLSAgKEdldEJ5Q2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0QnlOdW1iZXJNZXRob2QpTlVMTCwKLSAgKE5ld09iamVjdEZyb21JdGVtTWV0aG9kKU5ld09iamVjdEZyb21JdGVtLAotICAoR2V0SXRlbU5hbWVNZXRob2QpR2V0SXRlbU5hbWUsCi0gIChHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0SXRlbU51bWJlck1ldGhvZClOVUxMLAotICAoR2V0SXRlbUluZGV4TWV0aG9kKUdldEl0ZW1JbmRleCwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBlbnVtcwotCi1QeU9iamVjdCogTmV3RmlsZUVudW1UeXBlc0J5TmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZW51bXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Ci19Ci0KLW5hbWVzcGFjZSBleHRlbnNpb25zIHsKLQotdHlwZWRlZiBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOwotCi1zdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5leHRlbnNpb25fY291bnQoKTsKLX0KLQotc3RhdGljIEl0ZW1EZXNjcmlwdG9yIEdldEJ5TmFtZShQeUNvbnRhaW5lciogc2VsZiwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUpOwotfQotCi1zdGF0aWMgSXRlbURlc2NyaXB0b3IgR2V0QnlJbmRleChQeUNvbnRhaW5lciogc2VsZiwgaW50IGluZGV4KSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5leHRlbnNpb24oaW5kZXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGl0ZW0pOwotfQotCi1zdGF0aWMgY29uc3Qgc3RyaW5nJiBHZXRJdGVtTmFtZShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBpdGVtLT5uYW1lKCk7Ci19Ci0KLXN0YXRpYyBpbnQgR2V0SXRlbUluZGV4KEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIGl0ZW0tPmluZGV4KCk7Ci19Ci0KLXN0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKLSAgIkZpbGVFeHRlbnNpb25zIiwKLSAgKENvdW50TWV0aG9kKUNvdW50LAotICAoR2V0QnlJbmRleE1ldGhvZClHZXRCeUluZGV4LAotICAoR2V0QnlOYW1lTWV0aG9kKUdldEJ5TmFtZSwKLSAgKEdldEJ5Q2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0QnlOdW1iZXJNZXRob2QpTlVMTCwKLSAgKE5ld09iamVjdEZyb21JdGVtTWV0aG9kKU5ld09iamVjdEZyb21JdGVtLAotICAoR2V0SXRlbU5hbWVNZXRob2QpR2V0SXRlbU5hbWUsCi0gIChHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0SXRlbU51bWJlck1ldGhvZClOVUxMLAotICAoR2V0SXRlbUluZGV4TWV0aG9kKUdldEl0ZW1JbmRleCwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBleHRlbnNpb25zCi0KLVB5T2JqZWN0KiBOZXdGaWxlRXh0ZW5zaW9uc0J5TmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3TWFwcGluZ0J5TmFtZSgmZXh0ZW5zaW9uczo6Q29udGFpbmVyRGVmLCBkZXNjcmlwdG9yKTsKLX0KLQotbmFtZXNwYWNlIGRlcGVuZGVuY2llcyB7Ci0KLXR5cGVkZWYgY29uc3QgRmlsZURlc2NyaXB0b3IqIEl0ZW1EZXNjcmlwdG9yOwotCi1zdGF0aWMgaW50IENvdW50KFB5Q29udGFpbmVyKiBzZWxmKSB7Ci0gIHJldHVybiBHZXREZXNjcmlwdG9yKHNlbGYpLT5kZXBlbmRlbmN5X2NvdW50KCk7Ci19Ci0KLXN0YXRpYyBJdGVtRGVzY3JpcHRvciBHZXRCeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgaW5kZXgpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPmRlcGVuZGVuY3koaW5kZXgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIE5ld09iamVjdEZyb21JdGVtKEl0ZW1EZXNjcmlwdG9yIGl0ZW0pIHsKLSAgcmV0dXJuIFB5RmlsZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoaXRlbSk7Ci19Ci0KLXN0YXRpYyBEZXNjcmlwdG9yQ29udGFpbmVyRGVmIENvbnRhaW5lckRlZiA9IHsKLSAgIkZpbGVEZXBlbmRlbmNpZXMiLAotICAoQ291bnRNZXRob2QpQ291bnQsCi0gIChHZXRCeUluZGV4TWV0aG9kKUdldEJ5SW5kZXgsCi0gIChHZXRCeU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEJ5Q2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0QnlOdW1iZXJNZXRob2QpTlVMTCwKLSAgKE5ld09iamVjdEZyb21JdGVtTWV0aG9kKU5ld09iamVjdEZyb21JdGVtLAotICAoR2V0SXRlbU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEl0ZW1DYW1lbGNhc2VOYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRJdGVtTnVtYmVyTWV0aG9kKU5VTEwsCi0gIChHZXRJdGVtSW5kZXhNZXRob2QpTlVMTCwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBkZXBlbmRlbmNpZXMKLQotUHlPYmplY3QqIE5ld0ZpbGVEZXBlbmRlbmNpZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3I6Ok5ld1NlcXVlbmNlKCZkZXBlbmRlbmNpZXM6OkNvbnRhaW5lckRlZiwgZGVzY3JpcHRvcik7Ci19Ci0KLW5hbWVzcGFjZSBwdWJsaWNfZGVwZW5kZW5jaWVzIHsKLQotdHlwZWRlZiBjb25zdCBGaWxlRGVzY3JpcHRvciogSXRlbURlc2NyaXB0b3I7Ci0KLXN0YXRpYyBpbnQgQ291bnQoUHlDb250YWluZXIqIHNlbGYpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7Ci19Ci0KLXN0YXRpYyBJdGVtRGVzY3JpcHRvciBHZXRCeUluZGV4KFB5Q29udGFpbmVyKiBzZWxmLCBpbnQgaW5kZXgpIHsKLSAgcmV0dXJuIEdldERlc2NyaXB0b3Ioc2VsZiktPnB1YmxpY19kZXBlbmRlbmN5KGluZGV4KTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBOZXdPYmplY3RGcm9tSXRlbShJdGVtRGVzY3JpcHRvciBpdGVtKSB7Ci0gIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGl0ZW0pOwotfQotCi1zdGF0aWMgRGVzY3JpcHRvckNvbnRhaW5lckRlZiBDb250YWluZXJEZWYgPSB7Ci0gICJGaWxlUHVibGljRGVwZW5kZW5jaWVzIiwKLSAgKENvdW50TWV0aG9kKUNvdW50LAotICAoR2V0QnlJbmRleE1ldGhvZClHZXRCeUluZGV4LAotICAoR2V0QnlOYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRCeUNhbWVsY2FzZU5hbWVNZXRob2QpTlVMTCwKLSAgKEdldEJ5TnVtYmVyTWV0aG9kKU5VTEwsCi0gIChOZXdPYmplY3RGcm9tSXRlbU1ldGhvZClOZXdPYmplY3RGcm9tSXRlbSwKLSAgKEdldEl0ZW1OYW1lTWV0aG9kKU5VTEwsCi0gIChHZXRJdGVtQ2FtZWxjYXNlTmFtZU1ldGhvZClOVUxMLAotICAoR2V0SXRlbU51bWJlck1ldGhvZClOVUxMLAotICAoR2V0SXRlbUluZGV4TWV0aG9kKU5VTEwsCi19OwotCi19ICAvLyBuYW1lc3BhY2UgcHVibGljX2RlcGVuZGVuY2llcwotCi1QeU9iamVjdCogTmV3RmlsZVB1YmxpY0RlcGVuZGVuY2llcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvcjo6TmV3U2VxdWVuY2UoJnB1YmxpY19kZXBlbmRlbmNpZXM6OkNvbnRhaW5lckRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgZmlsZV9kZXNjcmlwdG9yCi0KLQotLy8gUmVnaXN0ZXIgYWxsIGltcGxlbWVudGF0aW9ucwotCi1ib29sIEluaXREZXNjcmlwdG9yTWFwcGluZ1R5cGVzKCkgewotICBpZiAoUHlUeXBlX1JlYWR5KCZkZXNjcmlwdG9yOjpEZXNjcmlwdG9yTWFwcGluZ19UeXBlKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoUHlUeXBlX1JlYWR5KCZkZXNjcmlwdG9yOjpEZXNjcmlwdG9yU2VxdWVuY2VfVHlwZSkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKFB5VHlwZV9SZWFkeSgmZGVzY3JpcHRvcjo6Q29udGFpbmVySXRlcmF0b3JfVHlwZSkgPCAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX2NvbnRhaW5lcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9jb250YWluZXJzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlNDA3NDcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX2NvbnRhaW5lcnMuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0NPTlRBSU5FUlNfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfQ09OVEFJTkVSU19IX18KLQotLy8gTWFwcGluZ3MgYW5kIFNlcXVlbmNlcyBvZiBkZXNjcmlwdG9ycy4KLS8vIFRoZXkgaW1wbGVtZW50IGNvbnRhaW5lcnMgbGlrZSBmaWVsZHNfYnlfbmFtZSwgRW51bURlc2NyaXB0b3IudmFsdWVzLi4uCi0vLyBTZWUgZGVzY3JpcHRvcl9jb250YWluZXJzLmNjIGZvciBtb3JlIGRlc2NyaXB0aW9uLgotI2luY2x1ZGUgPFB5dGhvbi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLWNsYXNzIERlc2NyaXB0b3I7Ci1jbGFzcyBGaWxlRGVzY3JpcHRvcjsKLWNsYXNzIEVudW1EZXNjcmlwdG9yOwotY2xhc3MgT25lb2ZEZXNjcmlwdG9yOwotCi1uYW1lc3BhY2UgcHl0aG9uIHsKLQotLy8gSW5pdGlhbGl6ZSB0aGUgdmFyaW91cyB0eXBlcyBhbmQgb2JqZWN0cy4KLWJvb2wgSW5pdERlc2NyaXB0b3JNYXBwaW5nVHlwZXMoKTsKLQotLy8gRWFjaCBmdW5jdGlvbiBiZWxvdyByZXR1cm5zIGEgTWFwcGluZywgb3IgYSBTZXF1ZW5jZSBvZiBkZXNjcmlwdG9ycy4KLS8vIFRoZXkgYWxsIHJldHVybiBhIG5ldyByZWZlcmVuY2UuCi0KLW5hbWVzcGFjZSBtZXNzYWdlX2Rlc2NyaXB0b3IgewotUHlPYmplY3QqIE5ld01lc3NhZ2VGaWVsZHNCeU5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci1QeU9iamVjdCogTmV3TWVzc2FnZUZpZWxkc0J5Q2FtZWxjYXNlTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLVB5T2JqZWN0KiBOZXdNZXNzYWdlRmllbGRzQnlOdW1iZXIoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci1QeU9iamVjdCogTmV3TWVzc2FnZUZpZWxkc1NlcShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLQotUHlPYmplY3QqIE5ld01lc3NhZ2VOZXN0ZWRUeXBlc1NlcShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLVB5T2JqZWN0KiBOZXdNZXNzYWdlTmVzdGVkVHlwZXNCeU5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0KLVB5T2JqZWN0KiBOZXdNZXNzYWdlRW51bXNCeU5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci1QeU9iamVjdCogTmV3TWVzc2FnZUVudW1zU2VxKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotUHlPYmplY3QqIE5ld01lc3NhZ2VFbnVtVmFsdWVzQnlOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi1QeU9iamVjdCogTmV3TWVzc2FnZUV4dGVuc2lvbnNCeU5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci1QeU9iamVjdCogTmV3TWVzc2FnZUV4dGVuc2lvbnNTZXEoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0KLVB5T2JqZWN0KiBOZXdNZXNzYWdlT25lb2ZzQnlOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotUHlPYmplY3QqIE5ld01lc3NhZ2VPbmVvZnNTZXEoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci19ICAvLyBuYW1lc3BhY2UgbWVzc2FnZV9kZXNjcmlwdG9yCi0KLW5hbWVzcGFjZSBlbnVtX2Rlc2NyaXB0b3IgewotUHlPYmplY3QqIE5ld0VudW1WYWx1ZXNCeU5hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotUHlPYmplY3QqIE5ld0VudW1WYWx1ZXNCeU51bWJlcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci1QeU9iamVjdCogTmV3RW51bVZhbHVlc1NlcShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci19ICAvLyBuYW1lc3BhY2UgZW51bV9kZXNjcmlwdG9yCi0KLW5hbWVzcGFjZSBvbmVvZl9kZXNjcmlwdG9yIHsKLVB5T2JqZWN0KiBOZXdPbmVvZkZpZWxkc1NlcShjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotfSAgLy8gbmFtZXNwYWNlIG9uZW9mX2Rlc2NyaXB0b3IKLQotbmFtZXNwYWNlIGZpbGVfZGVzY3JpcHRvciB7Ci1QeU9iamVjdCogTmV3RmlsZU1lc3NhZ2VUeXBlc0J5TmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0KLVB5T2JqZWN0KiBOZXdGaWxlRW51bVR5cGVzQnlOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLQotUHlPYmplY3QqIE5ld0ZpbGVFeHRlbnNpb25zQnlOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLQotUHlPYmplY3QqIE5ld0ZpbGVEZXBlbmRlbmNpZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotUHlPYmplY3QqIE5ld0ZpbGVQdWJsaWNEZXBlbmRlbmNpZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotfSAgLy8gbmFtZXNwYWNlIGZpbGVfZGVzY3JpcHRvcgotCi0KLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0RFU0NSSVBUT1JfQ09OVEFJTkVSU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZGFhNDBjYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgZmlsZSBkZWZpbmVzIGEgQysrIERlc2NyaXB0b3JEYXRhYmFzZSwgd2hpY2ggd3JhcHMgYSBQeXRob24gRGF0YWJhc2UKLS8vIGFuZCBkZWxlZ2F0ZSBhbGwgaXRzIG9wZXJhdGlvbnMgdG8gUHl0aG9uIG1ldGhvZHMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi1QeURlc2NyaXB0b3JEYXRhYmFzZTo6UHlEZXNjcmlwdG9yRGF0YWJhc2UoUHlPYmplY3QqIHB5X2RhdGFiYXNlKQotICAgIDogcHlfZGF0YWJhc2VfKHB5X2RhdGFiYXNlKSB7Ci0gIFB5X0lOQ1JFRihweV9kYXRhYmFzZV8pOwotfQotCi1QeURlc2NyaXB0b3JEYXRhYmFzZTo6flB5RGVzY3JpcHRvckRhdGFiYXNlKCkgeyBQeV9ERUNSRUYocHlfZGF0YWJhc2VfKTsgfQotCi0vLyBDb252ZXJ0IGEgUHl0aG9uIG9iamVjdCB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gcG9pbnRlci4KLS8vIEhhbmRsZXMgYWxsIGtpbmRzIG9mIFB5dGhvbiBlcnJvcnMsIHdoaWNoIGFyZSBzaW1wbHkgbG9nZ2VkLgotc3RhdGljIGJvb2wgR2V0RmlsZURlc2NyaXB0b3JQcm90byhQeU9iamVjdCogcHlfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIGlmIChweV9kZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICBpZiAoUHlFcnJfRXhjZXB0aW9uTWF0Y2hlcyhQeUV4Y19LZXlFcnJvcikpIHsKLSAgICAgIC8vIEV4cGVjdGVkIGVycm9yOiBpdGVtIHdhcyBzaW1wbHkgbm90IGZvdW5kLgotICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICB9IGVsc2UgewotICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkRlc2NyaXB0b3JEYXRhYmFzZSBtZXRob2QgcmFpc2VkIGFuIGVycm9yIjsKLSAgICAgIFB5RXJyX1ByaW50KCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAocHlfZGVzY3JpcHRvciA9PSBQeV9Ob25lKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGZpbGVkZXNjcmlwdG9yX2Rlc2NyaXB0b3IgPQotICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldERlc2NyaXB0b3IoKTsKLSAgQ01lc3NhZ2UqIG1lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4ocHlfZGVzY3JpcHRvcik7Ci0gIGlmIChQeU9iamVjdF9UeXBlQ2hlY2socHlfZGVzY3JpcHRvciwgJkNNZXNzYWdlX1R5cGUpICYmCi0gICAgICBtZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgPT0gZmlsZWRlc2NyaXB0b3JfZGVzY3JpcHRvcikgewotICAgIC8vIEZhc3QgcGF0aDogSnVzdCB1c2UgdGhlIHBvaW50ZXIuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9wcm90byA9Ci0gICAgICAgIHN0YXRpY19jYXN0PEZpbGVEZXNjcmlwdG9yUHJvdG8qPihtZXNzYWdlLT5tZXNzYWdlKTsKLSAgICAqb3V0cHV0ID0gKmZpbGVfcHJvdG87Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gU2xvdyBwYXRoOiBzZXJpYWxpemUgdGhlIG1lc3NhZ2UuIFRoaXMgYWxsb3dzIHRvIHVzZSBkYXRhYmFzZXMgd2hpY2gKLSAgICAvLyB1c2UgYSBkaWZmZXJlbnQgaW1wbGVtZW50YXRpb24gb2YgRmlsZURlc2NyaXB0b3JQcm90by4KLSAgICBTY29wZWRQeU9iamVjdFB0ciBzZXJpYWxpemVkX3BiKAotICAgICAgICBQeU9iamVjdF9DYWxsTWV0aG9kKHB5X2Rlc2NyaXB0b3IsICJTZXJpYWxpemVUb1N0cmluZyIsIE5VTEwpKTsKLSAgICBpZiAoc2VyaWFsaXplZF9wYiA9PSBOVUxMKSB7Ci0gICAgICBHT09HTEVfTE9HKEVSUk9SKQotICAgICAgICAgIDw8ICJEZXNjcmlwdG9yRGF0YWJhc2UgbWV0aG9kIGRpZCBub3QgcmV0dXJuIGEgRmlsZURlc2NyaXB0b3JQcm90byI7Ci0gICAgICBQeUVycl9QcmludCgpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjaGFyKiBzdHI7Ci0gICAgUHlfc3NpemVfdCBsZW47Ci0gICAgaWYgKFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKHNlcmlhbGl6ZWRfcGIuZ2V0KCksICZzdHIsICZsZW4pIDwgMCkgewotICAgICAgR09PR0xFX0xPRyhFUlJPUikKLSAgICAgICAgICA8PCAiRGVzY3JpcHRvckRhdGFiYXNlIG1ldGhvZCBkaWQgbm90IHJldHVybiBhIEZpbGVEZXNjcmlwdG9yUHJvdG8iOwotICAgICAgUHlFcnJfUHJpbnQoKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICAgIGlmICghZmlsZV9wcm90by5QYXJzZUZyb21BcnJheShzdHIsIGxlbikpIHsKLSAgICAgIEdPT0dMRV9MT0coRVJST1IpCi0gICAgICAgICAgPDwgIkRlc2NyaXB0b3JEYXRhYmFzZSBtZXRob2QgZGlkIG5vdCByZXR1cm4gYSBGaWxlRGVzY3JpcHRvclByb3RvIjsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgKm91dHB1dCA9IGZpbGVfcHJvdG87Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotLy8gRmluZCBhIGZpbGUgYnkgZmlsZSBuYW1lLgotYm9vbCBQeURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICBTY29wZWRQeU9iamVjdFB0ciBweV9kZXNjcmlwdG9yKFB5T2JqZWN0X0NhbGxNZXRob2QoCi0gICAgICBweV9kYXRhYmFzZV8sICJGaW5kRmlsZUJ5TmFtZSIsICJzIyIsIGZpbGVuYW1lLmNfc3RyKCksIGZpbGVuYW1lLnNpemUoKSkpOwotICByZXR1cm4gR2V0RmlsZURlc2NyaXB0b3JQcm90byhweV9kZXNjcmlwdG9yLmdldCgpLCBvdXRwdXQpOwotfQotCi0vLyBGaW5kIHRoZSBmaWxlIHRoYXQgZGVjbGFyZXMgdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBzeW1ib2wgbmFtZS4KLWJvb2wgUHlEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLCBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgU2NvcGVkUHlPYmplY3RQdHIgcHlfZGVzY3JpcHRvcigKLSAgICAgIFB5T2JqZWN0X0NhbGxNZXRob2QocHlfZGF0YWJhc2VfLCAiRmluZEZpbGVDb250YWluaW5nU3ltYm9sIiwgInMjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc3ltYm9sX25hbWUuY19zdHIoKSwgc3ltYm9sX25hbWUuc2l6ZSgpKSk7Ci0gIHJldHVybiBHZXRGaWxlRGVzY3JpcHRvclByb3RvKHB5X2Rlc2NyaXB0b3IuZ2V0KCksIG91dHB1dCk7Ci19Ci0KLS8vIEZpbmQgdGhlIGZpbGUgd2hpY2ggZGVmaW5lcyBhbiBleHRlbnNpb24gZXh0ZW5kaW5nIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUKLS8vIHdpdGggdGhlIGdpdmVuIGZpZWxkIG51bWJlci4KLS8vIFB5dGhvbiBEZXNjcmlwdG9yRGF0YWJhc2VzIGFyZSBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotYm9vbCBQeURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAotICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLCBpbnQgZmllbGRfbnVtYmVyLAotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICBTY29wZWRQeU9iamVjdFB0ciBweV9tZXRob2QoCi0gICAgICBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHB5X2RhdGFiYXNlXywgIkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbiIpKTsKLSAgaWYgKHB5X21ldGhvZCA9PSBOVUxMKSB7Ci0gICAgLy8gVGhpcyBtZXRob2QgaXMgbm90IGltcGxlbWVudGVkLCByZXR1cm5zIHdpdGhvdXQgZXJyb3IuCi0gICAgUHlFcnJfQ2xlYXIoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU2NvcGVkUHlPYmplY3RQdHIgcHlfZGVzY3JpcHRvcigKLSAgICAgIFB5T2JqZWN0X0NhbGxGdW5jdGlvbihweV9tZXRob2QuZ2V0KCksICJzI2kiLCBjb250YWluaW5nX3R5cGUuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUuc2l6ZSgpLCBmaWVsZF9udW1iZXIpKTsKLSAgcmV0dXJuIEdldEZpbGVEZXNjcmlwdG9yUHJvdG8ocHlfZGVzY3JpcHRvci5nZXQoKSwgb3V0cHV0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfZGF0YWJhc2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYzcxYzRiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNzUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfREVTQ1JJUFRPUl9EQVRBQkFTRV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfREVTQ1JJUFRPUl9EQVRBQkFTRV9IX18KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLWNsYXNzIFB5RGVzY3JpcHRvckRhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQeURlc2NyaXB0b3JEYXRhYmFzZShQeU9iamVjdCogcHlfZGF0YWJhc2UpOwotICB+UHlEZXNjcmlwdG9yRGF0YWJhc2UoKTsKLQotICAvLyBJbXBsZW1lbnQgdGhlIGFic3RyYWN0IGludGVyZmFjZS4gQWxsIHRoZXNlIGZ1bmN0aW9ucyBmaWxsIHRoZSBvdXRwdXQKLSAgLy8gd2l0aCBhIGNvcHkgb2YgRmlsZURlc2NyaXB0b3JQcm90by4KLQotICAvLyBGaW5kIGEgZmlsZSBieSBmaWxlIG5hbWUuCi0gIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOwotCi0gIC8vIEZpbmQgdGhlIGZpbGUgdGhhdCBkZWNsYXJlcyB0aGUgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIHN5bWJvbCBuYW1lLgotICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOwotCi0gIC8vIEZpbmQgdGhlIGZpbGUgd2hpY2ggZGVmaW5lcyBhbiBleHRlbnNpb24gZXh0ZW5kaW5nIHRoZSBnaXZlbiBtZXNzYWdlIHR5cGUKLSAgLy8gd2l0aCB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyLgotICAvLyBDb250YWluaW5nX3R5cGUgbXVzdCBiZSBhIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUuCi0gIC8vIFB5dGhvbiBvYmplY3RzIGFyZSBub3QgcmVxdWlyZWQgdG8gaW1wbGVtZW50IHRoaXMgbWV0aG9kLgotICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLQotIHByaXZhdGU6Ci0gIC8vIFRoZSBweXRob24gb2JqZWN0IHRoYXQgaW1wbGVtZW50cyB0aGUgZGF0YWJhc2UuIFRoZSByZWZlcmVuY2UgaXMgb3duZWQuCi0gIFB5T2JqZWN0KiBweV9kYXRhYmFzZV87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX0RBVEFCQVNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZhZmY5Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDU5MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gSW1wbGVtZW50cyB0aGUgRGVzY3JpcHRvclBvb2wsIHdoaWNoIGNvbGxlY3RzIGFsbCBkZXNjcmlwdG9ycy4KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+Ci0KLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLSAgI2RlZmluZSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSBQeVVuaWNvZGVfRnJvbVN0cmluZ0FuZFNpemUKLSAgI2lmIFBZX1ZFUlNJT05fSEVYIDwgMHgwMzAzMDAwMAotICAgICNlcnJvciAiUHl0aG9uIDMuMCAtIDMuMiBhcmUgbm90IHN1cHBvcnRlZC4iCi0gICNlbmRpZgotICAjZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShvYiwgY2hhcnBwLCBzaXplcCkgXAotICAgIChQeVVuaWNvZGVfQ2hlY2sob2IpPyBcCi0gICAgICAgKCgqKGNoYXJwcCkgPSBQeVVuaWNvZGVfQXNVVEY4QW5kU2l6ZShvYiwgKHNpemVwKSkpID09IE5VTEw/IC0xOiAwKTogXAotICAgICAgIFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKG9iLCAoY2hhcnBwKSwgKHNpemVwKSkpCi0jZW5kaWYKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLS8vIEEgbWFwIHRvIGNhY2hlIFB5dGhvbiBQb29scyBwZXIgQysrIHBvaW50ZXIuCi0vLyBQb2ludGVycyBhcmUgbm90IG93bmVkIGhlcmUsIGFuZCBiZWxvbmcgdG8gdGhlIFB5RGVzY3JpcHRvclBvb2wuCi1zdGF0aWMgaGFzaF9tYXA8Y29uc3QgRGVzY3JpcHRvclBvb2wqLCBQeURlc2NyaXB0b3JQb29sKj4gZGVzY3JpcHRvcl9wb29sX21hcDsKLQotbmFtZXNwYWNlIGNkZXNjcmlwdG9yX3Bvb2wgewotCi0vLyBDcmVhdGUgYSBQeXRob24gRGVzY3JpcHRvclBvb2wgb2JqZWN0LCBidXQgZG9lcyBub3QgZmlsbCB0aGUgInBvb2wiCi0vLyBhdHRyaWJ1dGUuCi1zdGF0aWMgUHlEZXNjcmlwdG9yUG9vbCogX0NyZWF0ZURlc2NyaXB0b3JQb29sKCkgewotICBQeURlc2NyaXB0b3JQb29sKiBjcG9vbCA9IFB5T2JqZWN0X05ldygKLSAgICAgIFB5RGVzY3JpcHRvclBvb2wsICZQeURlc2NyaXB0b3JQb29sX1R5cGUpOwotICBpZiAoY3Bvb2wgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY3Bvb2wtPnVuZGVybGF5ID0gTlVMTDsKLSAgY3Bvb2wtPmRhdGFiYXNlID0gTlVMTDsKLQotICBEeW5hbWljTWVzc2FnZUZhY3RvcnkqIG1lc3NhZ2VfZmFjdG9yeSA9IG5ldyBEeW5hbWljTWVzc2FnZUZhY3RvcnkoKTsKLSAgLy8gVGhpcyBvcHRpb24gbWlnaHQgYmUgdGhlIGRlZmF1bHQgc29tZSBkYXkuCi0gIG1lc3NhZ2VfZmFjdG9yeS0+U2V0RGVsZWdhdGVUb0dlbmVyYXRlZEZhY3RvcnkodHJ1ZSk7Ci0gIGNwb29sLT5tZXNzYWdlX2ZhY3RvcnkgPSBtZXNzYWdlX2ZhY3Rvcnk7Ci0KLSAgLy8gVE9ETyhhbWF1cnlmYSk6IFJld3JpdGUgdGhlIFN5bWJvbERhdGFiYXNlIGluIEMgc28gdGhhdCBpdCB1c2VzIHRoZSBzYW1lCi0gIC8vIHN0b3JhZ2UuCi0gIGNwb29sLT5jbGFzc2VzX2J5X2Rlc2NyaXB0b3IgPQotICAgICAgbmV3IFB5RGVzY3JpcHRvclBvb2w6OkNsYXNzZXNCeU1lc3NhZ2VNYXAoKTsKLSAgY3Bvb2wtPmRlc2NyaXB0b3Jfb3B0aW9ucyA9Ci0gICAgICBuZXcgaGFzaF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0ICo+KCk7Ci0KLSAgcmV0dXJuIGNwb29sOwotfQotCi0vLyBDcmVhdGUgYSBQeXRob24gRGVzY3JpcHRvclBvb2wsIHVzaW5nIHRoZSBnaXZlbiBwb29sIGFzIGFuIHVuZGVybGF5OgotLy8gbmV3IG1lc3NhZ2VzIHdpbGwgYmUgYWRkZWQgdG8gYSBjdXN0b20gcG9vbCwgbm90IHRvIHRoZSB1bmRlcmxheS4KLS8vCi0vLyBPd25lcnNoaXAgb2YgdGhlIHVuZGVybGF5IGlzIG5vdCB0cmFuc2ZlcnJlZCwgaXRzIHBvaW50ZXIgc2hvdWxkCi0vLyBzdGF5IGFsaXZlLgotc3RhdGljIFB5RGVzY3JpcHRvclBvb2wqIFB5RGVzY3JpcHRvclBvb2xfTmV3V2l0aFVuZGVybGF5KAotICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkgewotICBQeURlc2NyaXB0b3JQb29sKiBjcG9vbCA9IF9DcmVhdGVEZXNjcmlwdG9yUG9vbCgpOwotICBpZiAoY3Bvb2wgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNwb29sLT5wb29sID0gbmV3IERlc2NyaXB0b3JQb29sKHVuZGVybGF5KTsKLSAgY3Bvb2wtPnVuZGVybGF5ID0gdW5kZXJsYXk7Ci0KLSAgaWYgKCFkZXNjcmlwdG9yX3Bvb2xfbWFwLmluc2VydCgKLSAgICAgIHN0ZDo6bWFrZV9wYWlyKGNwb29sLT5wb29sLCBjcG9vbCkpLnNlY29uZCkgewotICAgIC8vIFNob3VsZCBuZXZlciBoYXBwZW4gLS0gd291bGQgaW5kaWNhdGUgYW4gaW50ZXJuYWwgZXJyb3IgLyBidWcuCi0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJEZXNjcmlwdG9yUG9vbCBhbHJlYWR5IHJlZ2lzdGVyZWQiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBjcG9vbDsKLX0KLQotc3RhdGljIFB5RGVzY3JpcHRvclBvb2wqIFB5RGVzY3JpcHRvclBvb2xfTmV3V2l0aERhdGFiYXNlKAotICAgIERlc2NyaXB0b3JEYXRhYmFzZSogZGF0YWJhc2UpIHsKLSAgUHlEZXNjcmlwdG9yUG9vbCogY3Bvb2wgPSBfQ3JlYXRlRGVzY3JpcHRvclBvb2woKTsKLSAgaWYgKGNwb29sID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoZGF0YWJhc2UgIT0gTlVMTCkgewotICAgIGNwb29sLT5wb29sID0gbmV3IERlc2NyaXB0b3JQb29sKGRhdGFiYXNlKTsKLSAgICBjcG9vbC0+ZGF0YWJhc2UgPSBkYXRhYmFzZTsKLSAgfSBlbHNlIHsKLSAgICBjcG9vbC0+cG9vbCA9IG5ldyBEZXNjcmlwdG9yUG9vbCgpOwotICB9Ci0KLSAgaWYgKCFkZXNjcmlwdG9yX3Bvb2xfbWFwLmluc2VydChzdGQ6Om1ha2VfcGFpcihjcG9vbC0+cG9vbCwgY3Bvb2wpKS5zZWNvbmQpIHsKLSAgICAvLyBTaG91bGQgbmV2ZXIgaGFwcGVuIC0tIHdvdWxkIGluZGljYXRlIGFuIGludGVybmFsIGVycm9yIC8gYnVnLgotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiRGVzY3JpcHRvclBvb2wgYWxyZWFkeSByZWdpc3RlcmVkIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gY3Bvb2w7Ci19Ci0KLS8vIFRoZSBwdWJsaWMgRGVzY3JpcHRvclBvb2wgY29uc3RydWN0b3IuCi1zdGF0aWMgUHlPYmplY3QqIE5ldyhQeVR5cGVPYmplY3QqIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogYXJncywgUHlPYmplY3QqIGt3YXJncykgewotICBzdGF0aWMgY2hhcioga3dsaXN0W10gPSB7ImRlc2NyaXB0b3JfZGIiLCAwfTsKLSAgUHlPYmplY3QqIHB5X2RhdGFiYXNlID0gTlVMTDsKLSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlQW5kS2V5d29yZHMoYXJncywga3dhcmdzLCAifE8iLCBrd2xpc3QsICZweV9kYXRhYmFzZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlID0gTlVMTDsKLSAgaWYgKHB5X2RhdGFiYXNlICYmIHB5X2RhdGFiYXNlICE9IFB5X05vbmUpIHsKLSAgICBkYXRhYmFzZSA9IG5ldyBQeURlc2NyaXB0b3JEYXRhYmFzZShweV9kYXRhYmFzZSk7Ci0gIH0KLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgIFB5RGVzY3JpcHRvclBvb2xfTmV3V2l0aERhdGFiYXNlKGRhdGFiYXNlKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIERlYWxsb2MoUHlEZXNjcmlwdG9yUG9vbCogc2VsZikgewotICB0eXBlZGVmIFB5RGVzY3JpcHRvclBvb2w6OkNsYXNzZXNCeU1lc3NhZ2VNYXA6Oml0ZXJhdG9yIGl0ZXJhdG9yOwotICBkZXNjcmlwdG9yX3Bvb2xfbWFwLmVyYXNlKHNlbGYtPnBvb2wpOwotICBmb3IgKGl0ZXJhdG9yIGl0ID0gc2VsZi0+Y2xhc3Nlc19ieV9kZXNjcmlwdG9yLT5iZWdpbigpOwotICAgICAgIGl0ICE9IHNlbGYtPmNsYXNzZXNfYnlfZGVzY3JpcHRvci0+ZW5kKCk7ICsraXQpIHsKLSAgICBQeV9ERUNSRUYoaXQtPnNlY29uZCk7Ci0gIH0KLSAgZGVsZXRlIHNlbGYtPmNsYXNzZXNfYnlfZGVzY3JpcHRvcjsKLSAgZm9yIChoYXNoX21hcDxjb25zdCB2b2lkKiwgUHlPYmplY3QqPjo6aXRlcmF0b3IgaXQgPQotICAgICAgICAgICBzZWxmLT5kZXNjcmlwdG9yX29wdGlvbnMtPmJlZ2luKCk7Ci0gICAgICAgaXQgIT0gc2VsZi0+ZGVzY3JpcHRvcl9vcHRpb25zLT5lbmQoKTsgKytpdCkgewotICAgIFB5X0RFQ1JFRihpdC0+c2Vjb25kKTsKLSAgfQotICBkZWxldGUgc2VsZi0+ZGVzY3JpcHRvcl9vcHRpb25zOwotICBkZWxldGUgc2VsZi0+bWVzc2FnZV9mYWN0b3J5OwotICBkZWxldGUgc2VsZi0+ZGF0YWJhc2U7Ci0gIGRlbGV0ZSBzZWxmLT5wb29sOwotICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Ci19Ci0KLVB5T2JqZWN0KiBGaW5kTWVzc2FnZUJ5TmFtZShQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIFB5X3NzaXplX3QgbmFtZV9zaXplOwotICBjaGFyKiBuYW1lOwotICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJm5hbWUsICZuYW1lX3NpemUpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV9kZXNjcmlwdG9yID0KLSAgICAgIHNlbGYtPnBvb2wtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShzdHJpbmcobmFtZSwgbmFtZV9zaXplKSk7Ci0KLSAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiQ291bGRuJ3QgZmluZCBtZXNzYWdlICUuMjAwcyIsIG5hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIFB5TWVzc2FnZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IobWVzc2FnZV9kZXNjcmlwdG9yKTsKLX0KLQotLy8gQWRkIGEgbWVzc2FnZSBjbGFzcyB0byBvdXIgZGF0YWJhc2UuCi1pbnQgUmVnaXN0ZXJNZXNzYWdlQ2xhc3MoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcykgewotICBQeV9JTkNSRUYobWVzc2FnZV9jbGFzcyk7Ci0gIHR5cGVkZWYgUHlEZXNjcmlwdG9yUG9vbDo6Q2xhc3Nlc0J5TWVzc2FnZU1hcDo6aXRlcmF0b3IgaXRlcmF0b3I7Ci0gIHN0ZDo6cGFpcjxpdGVyYXRvciwgYm9vbD4gcmV0ID0gc2VsZi0+Y2xhc3Nlc19ieV9kZXNjcmlwdG9yLT5pbnNlcnQoCi0gICAgICBzdGQ6Om1ha2VfcGFpcihtZXNzYWdlX2Rlc2NyaXB0b3IsIG1lc3NhZ2VfY2xhc3MpKTsKLSAgaWYgKCFyZXQuc2Vjb25kKSB7Ci0gICAgLy8gVXBkYXRlIGNhc2U6IERFQ1JFRiB0aGUgcHJldmlvdXMgdmFsdWUuCi0gICAgUHlfREVDUkVGKHJldC5maXJzdC0+c2Vjb25kKTsKLSAgICByZXQuZmlyc3QtPnNlY29uZCA9IG1lc3NhZ2VfY2xhc3M7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFJldHJpZXZlIHRoZSBtZXNzYWdlIGNsYXNzIGFkZGVkIHRvIG91ciBkYXRhYmFzZS4KLUNNZXNzYWdlQ2xhc3MqIEdldE1lc3NhZ2VDbGFzcyhQeURlc2NyaXB0b3JQb29sKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvcikgewotICB0eXBlZGVmIFB5RGVzY3JpcHRvclBvb2w6OkNsYXNzZXNCeU1lc3NhZ2VNYXA6Oml0ZXJhdG9yIGl0ZXJhdG9yOwotICBpdGVyYXRvciByZXQgPSBzZWxmLT5jbGFzc2VzX2J5X2Rlc2NyaXB0b3ItPmZpbmQobWVzc2FnZV9kZXNjcmlwdG9yKTsKLSAgaWYgKHJldCA9PSBzZWxmLT5jbGFzc2VzX2J5X2Rlc2NyaXB0b3ItPmVuZCgpKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIk5vIG1lc3NhZ2UgY2xhc3MgcmVnaXN0ZXJlZCBmb3IgJyVzJyIsCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHJldC0+c2Vjb25kOwotICB9Ci19Ci0KLVB5T2JqZWN0KiBGaW5kRmlsZUJ5TmFtZShQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIFB5X3NzaXplX3QgbmFtZV9zaXplOwotICBjaGFyKiBuYW1lOwotICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJm5hbWUsICZuYW1lX3NpemUpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzY3JpcHRvciA9Ci0gICAgICBzZWxmLT5wb29sLT5GaW5kRmlsZUJ5TmFtZShzdHJpbmcobmFtZSwgbmFtZV9zaXplKSk7Ci0gIGlmIChmaWxlX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkNvdWxkbid0IGZpbmQgZmlsZSAlLjIwMHMiLAotICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGZpbGVfZGVzY3JpcHRvcik7Ci19Ci0KLVB5T2JqZWN0KiBGaW5kRmllbGRCeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZykgewotICBQeV9zc2l6ZV90IG5hbWVfc2l6ZTsKLSAgY2hhciogbmFtZTsKLSAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZuYW1lLCAmbmFtZV9zaXplKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgICBzZWxmLT5wb29sLT5GaW5kRmllbGRCeU5hbWUoc3RyaW5nKG5hbWUsIG5hbWVfc2l6ZSkpOwotICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiQ291bGRuJ3QgZmluZCBmaWVsZCAlLjIwMHMiLAotICAgICAgICAgICAgICAgICBuYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihmaWVsZF9kZXNjcmlwdG9yKTsKLX0KLQotUHlPYmplY3QqIEZpbmRFeHRlbnNpb25CeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZykgewotICBQeV9zc2l6ZV90IG5hbWVfc2l6ZTsKLSAgY2hhciogbmFtZTsKLSAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZuYW1lLCAmbmFtZV9zaXplKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgICBzZWxmLT5wb29sLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKHN0cmluZyhuYW1lLCBuYW1lX3NpemUpKTsKLSAgaWYgKGZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkNvdWxkbid0IGZpbmQgZXh0ZW5zaW9uIGZpZWxkICUuMjAwcyIsIG5hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIFB5RmllbGREZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGZpZWxkX2Rlc2NyaXB0b3IpOwotfQotCi1QeU9iamVjdCogRmluZEVudW1UeXBlQnlOYW1lKFB5RGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgUHlfc3NpemVfdCBuYW1lX3NpemU7Ci0gIGNoYXIqIG5hbWU7Ci0gIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmbmFtZSwgJm5hbWVfc2l6ZSkgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0KLSAgICAgIHNlbGYtPnBvb2wtPkZpbmRFbnVtVHlwZUJ5TmFtZShzdHJpbmcobmFtZSwgbmFtZV9zaXplKSk7Ci0gIGlmIChlbnVtX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkNvdWxkbid0IGZpbmQgZW51bSAlLjIwMHMiLCBuYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBQeUVudW1EZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGVudW1fZGVzY3JpcHRvcik7Ci19Ci0KLVB5T2JqZWN0KiBGaW5kT25lb2ZCeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZykgewotICBQeV9zc2l6ZV90IG5hbWVfc2l6ZTsKLSAgY2hhciogbmFtZTsKLSAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZuYW1lLCAmbmFtZV9zaXplKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvciA9Ci0gICAgICBzZWxmLT5wb29sLT5GaW5kT25lb2ZCeU5hbWUoc3RyaW5nKG5hbWUsIG5hbWVfc2l6ZSkpOwotICBpZiAob25lb2ZfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX0tleUVycm9yLCAiQ291bGRuJ3QgZmluZCBvbmVvZiAlLjIwMHMiLCBuYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBQeU9uZW9mRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihvbmVvZl9kZXNjcmlwdG9yKTsKLX0KLQotUHlPYmplY3QqIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIFB5X3NzaXplX3QgbmFtZV9zaXplOwotICBjaGFyKiBuYW1lOwotICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJm5hbWUsICZuYW1lX3NpemUpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzY3JpcHRvciA9Ci0gICAgICBzZWxmLT5wb29sLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3RyaW5nKG5hbWUsIG5hbWVfc2l6ZSkpOwotICBpZiAoZmlsZV9kZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJDb3VsZG4ndCBmaW5kIHN5bWJvbCAlLjIwMHMiLCBuYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBQeUZpbGVEZXNjcmlwdG9yX0Zyb21EZXNjcmlwdG9yKGZpbGVfZGVzY3JpcHRvcik7Ci19Ci0KLS8vIFRoZXNlIGZ1bmN0aW9ucyBzaG91bGQgbm90IGV4aXN0IC0tIHRoZSBvbmx5IHZhbGlkIHdheSB0byBjcmVhdGUKLS8vIGRlc2NyaXB0b3JzIGlzIHRvIGNhbGwgQWRkKCkgb3IgQWRkU2VyaWFsaXplZEZpbGUoKS4KLS8vIEJ1dCB0aGVzZSBBZGREZXNjcmlwdG9yKCkgZnVuY3Rpb25zIHdlcmUgY3JlYXRlZCBpbiBQeXRob24gYW5kIHNvbWUgcGVvcGxlCi0vLyBjYWxsIHRoZW0sIHNvIHdlIHN1cHBvcnQgdGhlbSBmb3Igbm93IGZvciBjb21wYXRpYmlsaXR5LgotLy8gSG93ZXZlciB3ZSBkbyBjaGVjayB0aGF0IHRoZSBleGlzdGluZyBkZXNjcmlwdG9yIGFscmVhZHkgZXhpc3RzIGluIHRoZSBwb29sLAotLy8gd2hpY2ggYXBwZWFycyB0byBhbHdheXMgYmUgdHJ1ZSBmb3IgZXhpc3RpbmcgY2FsbHMgLS0gYnV0IHRoZW4gd2h5IGRvIHBlb3BsZQotLy8gY2FsbCBhIGZ1bmN0aW9uIHRoYXQgd2lsbCBqdXN0IGJlIGEgbm8tb3A/Ci0vLyBUT0RPKGFtYXVyeWZhKTogTmVlZCB0byBpbnZlc3RpZ2F0ZSBmdXJ0aGVyLgotCi1QeU9iamVjdCogQWRkRmlsZURlc2NyaXB0b3IoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGRlc2NyaXB0b3IpIHsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzY3JpcHRvciA9Ci0gICAgICBQeUZpbGVEZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgaWYgKCFmaWxlX2Rlc2NyaXB0b3IpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoZmlsZV9kZXNjcmlwdG9yICE9Ci0gICAgICBzZWxmLT5wb29sLT5GaW5kRmlsZUJ5TmFtZShmaWxlX2Rlc2NyaXB0b3ItPm5hbWUoKSkpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgIlRoZSBmaWxlIGRlc2NyaXB0b3IgJXMgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgcG9vbCIsCi0gICAgICAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1QeU9iamVjdCogQWRkRGVzY3JpcHRvcihQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogZGVzY3JpcHRvcikgewotICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3IgPQotICAgICAgUHlNZXNzYWdlRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gIGlmICghbWVzc2FnZV9kZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKG1lc3NhZ2VfZGVzY3JpcHRvciAhPQotICAgICAgc2VsZi0+cG9vbC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKG1lc3NhZ2VfZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkpKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJUaGUgbWVzc2FnZSBkZXNjcmlwdG9yICVzIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIHBvb2wiLAotICAgICAgICAgICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1QeU9iamVjdCogQWRkRW51bURlc2NyaXB0b3IoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGRlc2NyaXB0b3IpIHsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9Ci0gICAgICBQeUVudW1EZXNjcmlwdG9yX0FzRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgaWYgKCFlbnVtX2Rlc2NyaXB0b3IpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoZW51bV9kZXNjcmlwdG9yICE9Ci0gICAgICBzZWxmLT5wb29sLT5GaW5kRW51bVR5cGVCeU5hbWUoZW51bV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSkpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgIlRoZSBlbnVtIGRlc2NyaXB0b3IgJXMgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgcG9vbCIsCi0gICAgICAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLS8vIFRoZSBjb2RlIGJlbG93IGxvYWRzIG5ldyBEZXNjcmlwdG9ycyBmcm9tIGEgc2VyaWFsaXplZCBGaWxlRGVzY3JpcHRvclByb3RvLgotCi0KLS8vIENvbGxlY3RzIGVycm9ycyB0aGF0IG9jY3VyIGR1cmluZyBwcm90byBmaWxlIGJ1aWxkaW5nIHRvIGFsbG93IHRoZW0gdG8gYmUKLS8vIHByb3BhZ2F0ZWQgaW4gdGhlIHB5dGhvbiBleGNlcHRpb24gaW5zdGVhZCBvZiBvbmx5IGxpdmluZyBpbiBFUlJPUiBsb2dzLgotY2xhc3MgQnVpbGRGaWxlRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKLSBwdWJsaWM6Ci0gIEJ1aWxkRmlsZUVycm9yQ29sbGVjdG9yKCkgOiBlcnJvcl9tZXNzYWdlKCIiKSwgaGFkX2Vycm9ycyhmYWxzZSkge30KLQotICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgLy8gUmVwbGljYXRlcyB0aGUgbG9nZ2luZyBiZWhhdmlvciB0aGF0IGhhcHBlbnMgaW4gdGhlIEMrKyBpbXBsZW1lbnRhdGlvbgotICAgIC8vIHdoZW4gYW4gZXJyb3IgY29sbGVjdG9yIGlzIG5vdCBwYXNzZWQgaW4uCi0gICAgaWYgKCFoYWRfZXJyb3JzKSB7Ci0gICAgICBlcnJvcl9tZXNzYWdlICs9Ci0gICAgICAgICAgKCJJbnZhbGlkIHByb3RvIGRlc2NyaXB0b3IgZm9yIGZpbGUgXCIiICsgZmlsZW5hbWUgKyAiXCI6XG4iKTsKLSAgICAgIGhhZF9lcnJvcnMgPSB0cnVlOwotICAgIH0KLSAgICAvLyBBcyB0aGlzIG9ubHkgaGFwcGVucyBvbiBmYWlsdXJlIGFuZCB3aWxsIHJlc3VsdCBpbiB0aGUgcHJvZ3JhbSBub3QKLSAgICAvLyBydW5uaW5nIGF0IGFsbCwgbm8gZWZmb3J0IGlzIG1hZGUgdG8gb3B0aW1pemUgdGhpcyBzdHJpbmcgbWFuaXB1bGF0aW9uLgotICAgIGVycm9yX21lc3NhZ2UgKz0gKCIgICIgKyBlbGVtZW50X25hbWUgKyAiOiAiICsgbWVzc2FnZSArICJcbiIpOwotICB9Ci0KLSAgc3RyaW5nIGVycm9yX21lc3NhZ2U7Ci0gIGJvb2wgaGFkX2Vycm9yczsKLX07Ci0KLVB5T2JqZWN0KiBBZGRTZXJpYWxpemVkRmlsZShQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogc2VyaWFsaXplZF9wYikgewotICBjaGFyKiBtZXNzYWdlX3R5cGU7Ci0gIFB5X3NzaXplX3QgbWVzc2FnZV9sZW47Ci0KLSAgaWYgKHNlbGYtPmRhdGFiYXNlICE9IE5VTEwpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoCi0gICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICJDYW5ub3QgY2FsbCBBZGQgb24gYSBEZXNjcmlwdG9yUG9vbCB0aGF0IHVzZXMgYSBEZXNjcmlwdG9yRGF0YWJhc2UuICIKLSAgICAgICAgIkFkZCB5b3VyIGZpbGUgdG8gdGhlIHVuZGVybHlpbmcgZGF0YWJhc2UuIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUoc2VyaWFsaXplZF9wYiwgJm1lc3NhZ2VfdHlwZSwgJm1lc3NhZ2VfbGVuKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgaWYgKCFmaWxlX3Byb3RvLlBhcnNlRnJvbUFycmF5KG1lc3NhZ2VfdHlwZSwgbWVzc2FnZV9sZW4pKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNvdWxkbid0IHBhcnNlIGZpbGUgY29udGVudCEiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIElmIHRoZSBmaWxlIHdhcyBhbHJlYWR5IHBhcnQgb2YgYSBDKysgbGlicmFyeSwgYWxsIGl0cyBkZXNjcmlwdG9ycyBhcmUgaW4KLSAgLy8gdGhlIHVuZGVybHlpbmcgcG9vbC4gIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcgZWxzZS4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGdlbmVyYXRlZF9maWxlID0gTlVMTDsKLSAgaWYgKHNlbGYtPnVuZGVybGF5KSB7Ci0gICAgZ2VuZXJhdGVkX2ZpbGUgPSBzZWxmLT51bmRlcmxheS0+RmluZEZpbGVCeU5hbWUoZmlsZV9wcm90by5uYW1lKCkpOwotICB9Ci0gIGlmIChnZW5lcmF0ZWRfZmlsZSAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIFB5RmlsZURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3JXaXRoU2VyaWFsaXplZFBiKAotICAgICAgICBnZW5lcmF0ZWRfZmlsZSwgc2VyaWFsaXplZF9wYik7Ci0gIH0KLQotICBCdWlsZEZpbGVFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0KLSAgICAgIHNlbGYtPnBvb2wtPkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVycm9yX2NvbGxlY3Rvcik7Ci0gIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAiQ291bGRuJ3QgYnVpbGQgcHJvdG8gZmlsZSBpbnRvIGRlc2NyaXB0b3IgcG9vbCFcbiVzIiwKLSAgICAgICAgICAgICAgICAgZXJyb3JfY29sbGVjdG9yLmVycm9yX21lc3NhZ2UuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gUHlGaWxlRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcldpdGhTZXJpYWxpemVkUGIoCi0gICAgICBkZXNjcmlwdG9yLCBzZXJpYWxpemVkX3BiKTsKLX0KLQotUHlPYmplY3QqIEFkZChQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogZmlsZV9kZXNjcmlwdG9yX3Byb3RvKSB7Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIHNlcmlhbGl6ZWRfcGIoCi0gICAgICBQeU9iamVjdF9DYWxsTWV0aG9kKGZpbGVfZGVzY3JpcHRvcl9wcm90bywgIlNlcmlhbGl6ZVRvU3RyaW5nIiwgTlVMTCkpOwotICBpZiAoc2VyaWFsaXplZF9wYiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIEFkZFNlcmlhbGl6ZWRGaWxlKHNlbGYsIHNlcmlhbGl6ZWRfcGIuZ2V0KCkpOwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0gewotICB7ICJBZGQiLCAoUHlDRnVuY3Rpb24pQWRkLCBNRVRIX08sCi0gICAgIkFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW5kIGl0cyB0eXBlcyB0byB0aGlzIHBvb2wuIiB9LAotICB7ICJBZGRTZXJpYWxpemVkRmlsZSIsIChQeUNGdW5jdGlvbilBZGRTZXJpYWxpemVkRmlsZSwgTUVUSF9PLAotICAgICJBZGRzIGEgc2VyaWFsaXplZCBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoaXMgcG9vbC4iIH0sCi0KLSAgLy8gVE9ETyhhbWF1cnlmYSk6IFVuZGVyc3RhbmQgd2h5IHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gZGlmZmVycyBmcm9tCi0gIC8vIHRoaXMgb25lLCBhc2sgdXNlcnMgdG8gdXNlIGFub3RoZXIgQVBJIGFuZCBkZXByZWNhdGUgdGhlc2UgZnVuY3Rpb25zLgotICB7ICJBZGRGaWxlRGVzY3JpcHRvciIsIChQeUNGdW5jdGlvbilBZGRGaWxlRGVzY3JpcHRvciwgTUVUSF9PLAotICAgICJOby1vcC4gQWRkKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZS4iIH0sCi0gIHsgIkFkZERlc2NyaXB0b3IiLCAoUHlDRnVuY3Rpb24pQWRkRGVzY3JpcHRvciwgTUVUSF9PLAotICAgICJOby1vcC4gQWRkKCkgbXVzdCBoYXZlIGJlZW4gY2FsbGVkIGJlZm9yZS4iIH0sCi0gIHsgIkFkZEVudW1EZXNjcmlwdG9yIiwgKFB5Q0Z1bmN0aW9uKUFkZEVudW1EZXNjcmlwdG9yLCBNRVRIX08sCi0gICAgIk5vLW9wLiBBZGQoKSBtdXN0IGhhdmUgYmVlbiBjYWxsZWQgYmVmb3JlLiIgfSwKLQotICB7ICJGaW5kRmlsZUJ5TmFtZSIsIChQeUNGdW5jdGlvbilGaW5kRmlsZUJ5TmFtZSwgTUVUSF9PLAotICAgICJTZWFyY2hlcyBmb3IgYSBmaWxlIGRlc2NyaXB0b3IgYnkgaXRzIC5wcm90byBuYW1lLiIgfSwKLSAgeyAiRmluZE1lc3NhZ2VUeXBlQnlOYW1lIiwgKFB5Q0Z1bmN0aW9uKUZpbmRNZXNzYWdlQnlOYW1lLCBNRVRIX08sCi0gICAgIlNlYXJjaGVzIGZvciBhIG1lc3NhZ2UgZGVzY3JpcHRvciBieSBmdWxsIG5hbWUuIiB9LAotICB7ICJGaW5kRmllbGRCeU5hbWUiLCAoUHlDRnVuY3Rpb24pRmluZEZpZWxkQnlOYW1lLCBNRVRIX08sCi0gICAgIlNlYXJjaGVzIGZvciBhIGZpZWxkIGRlc2NyaXB0b3IgYnkgZnVsbCBuYW1lLiIgfSwKLSAgeyAiRmluZEV4dGVuc2lvbkJ5TmFtZSIsIChQeUNGdW5jdGlvbilGaW5kRXh0ZW5zaW9uQnlOYW1lLCBNRVRIX08sCi0gICAgIlNlYXJjaGVzIGZvciBleHRlbnNpb24gZGVzY3JpcHRvciBieSBmdWxsIG5hbWUuIiB9LAotICB7ICJGaW5kRW51bVR5cGVCeU5hbWUiLCAoUHlDRnVuY3Rpb24pRmluZEVudW1UeXBlQnlOYW1lLCBNRVRIX08sCi0gICAgIlNlYXJjaGVzIGZvciBlbnVtIHR5cGUgZGVzY3JpcHRvciBieSBmdWxsIG5hbWUuIiB9LAotICB7ICJGaW5kT25lb2ZCeU5hbWUiLCAoUHlDRnVuY3Rpb24pRmluZE9uZW9mQnlOYW1lLCBNRVRIX08sCi0gICAgIlNlYXJjaGVzIGZvciBvbmVvZiBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4iIH0sCi0KLSAgeyAiRmluZEZpbGVDb250YWluaW5nU3ltYm9sIiwgKFB5Q0Z1bmN0aW9uKUZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCwgTUVUSF9PLAotICAgICJHZXRzIHRoZSBGaWxlRGVzY3JpcHRvciBjb250YWluaW5nIHRoZSBzcGVjaWZpZWQgc3ltYm9sLiIgfSwKLSAge05VTEx9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY2Rlc2NyaXB0b3JfcG9vbAotCi1QeVR5cGVPYmplY3QgUHlEZXNjcmlwdG9yUG9vbF9UeXBlID0gewotICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotICBGVUxMX01PRFVMRV9OQU1FICIuRGVzY3JpcHRvclBvb2wiLCAgLy8gdHBfbmFtZQotICBzaXplb2YoUHlEZXNjcmlwdG9yUG9vbCksICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVtc2l6ZQotICAoZGVzdHJ1Y3RvciljZGVzY3JpcHRvcl9wb29sOjpEZWFsbG9jLCAgLy8gdHBfZGVhbGxvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JlcHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX21hcHBpbmcKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NhbGwKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3N0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19idWZmZXIKLSAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgIC8vIHRwX2ZsYWdzCi0gICJBIERlc2NyaXB0b3IgUG9vbCIsICAgICAgICAgICAgICAgICAvLyB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3RyYXZlcnNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3dlYWtsaXN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVybmV4dAotICBjZGVzY3JpcHRvcl9wb29sOjpNZXRob2RzLCAgICAgICAgICAgLy8gdHBfbWV0aG9kcwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0c2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9iYXNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kZXNjcl9nZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX3NldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaW5pdAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYWxsb2MKLSAgY2Rlc2NyaXB0b3JfcG9vbDo6TmV3LCAgICAgICAgICAgICAgIC8vIHRwX25ldwotICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZnJlZQotfTsKLQotLy8gVGhpcyBpcyB0aGUgRGVzY3JpcHRvclBvb2wgd2hpY2ggY29udGFpbnMgYWxsIHRoZSBkZWZpbml0aW9ucyBmcm9tIHRoZQotLy8gZ2VuZXJhdGVkIF9wYjIucHkgbW9kdWxlcy4KLXN0YXRpYyBQeURlc2NyaXB0b3JQb29sKiBweXRob25fZ2VuZXJhdGVkX3Bvb2wgPSBOVUxMOwotCi1ib29sIEluaXREZXNjcmlwdG9yUG9vbCgpIHsKLSAgaWYgKFB5VHlwZV9SZWFkeSgmUHlEZXNjcmlwdG9yUG9vbF9UeXBlKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIC8vIFRoZSBQb29sIG9mIG1lc3NhZ2VzIGRlY2xhcmVkIGluIFB5dGhvbiBsaWJyYXJpZXMuCi0gIC8vIGdlbmVyYXRlZF9wb29sKCkgY29udGFpbnMgYWxsIG1lc3NhZ2VzIGFscmVhZHkgbGlua2VkIGluIEMrKyBsaWJyYXJpZXMsIGFuZAotICAvLyBpcyB1c2VkIGFzIHVuZGVybGF5LgotICBweXRob25fZ2VuZXJhdGVkX3Bvb2wgPSBjZGVzY3JpcHRvcl9wb29sOjpQeURlc2NyaXB0b3JQb29sX05ld1dpdGhVbmRlcmxheSgKLSAgICAgIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKLSAgaWYgKHB5dGhvbl9nZW5lcmF0ZWRfcG9vbCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIC8vIFJlZ2lzdGVyIHRoaXMgcG9vbCB0byBiZSBmb3VuZCBmb3IgQysrLWdlbmVyYXRlZCBkZXNjcmlwdG9ycy4KLSAgZGVzY3JpcHRvcl9wb29sX21hcC5pbnNlcnQoCi0gICAgICBzdGQ6Om1ha2VfcGFpcihEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgICAgICAgICAgICAgICAgIHB5dGhvbl9nZW5lcmF0ZWRfcG9vbCkpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUaGUgZGVmYXVsdCBEZXNjcmlwdG9yUG9vbCB1c2VkIGV2ZXJ5d2hlcmUgaW4gdGhpcyBtb2R1bGUuCi0vLyBUb2RheSBpdCdzIHRoZSBweXRob25fZ2VuZXJhdGVkX3Bvb2wuCi0vLyBUT0RPKGFtYXVyeWZhKTogUmVtb3ZlIGFsbCB1c2FnZXMgb2YgdGhpcyBmdW5jdGlvbjogdGhlIHBvb2wgc2hvdWxkIGJlCi0vLyBkZXJpdmVkIGZyb20gdGhlIGNvbnRleHQuCi1QeURlc2NyaXB0b3JQb29sKiBHZXREZWZhdWx0RGVzY3JpcHRvclBvb2woKSB7Ci0gIHJldHVybiBweXRob25fZ2VuZXJhdGVkX3Bvb2w7Ci19Ci0KLVB5RGVzY3JpcHRvclBvb2wqIEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7Ci0gIC8vIEZhc3QgcGF0aCBmb3Igc3RhbmRhcmQgZGVzY3JpcHRvcnMuCi0gIGlmIChwb29sID09IHB5dGhvbl9nZW5lcmF0ZWRfcG9vbC0+cG9vbCB8fAotICAgICAgcG9vbCA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSkgewotICAgIHJldHVybiBweXRob25fZ2VuZXJhdGVkX3Bvb2w7Ci0gIH0KLSAgaGFzaF9tYXA8Y29uc3QgRGVzY3JpcHRvclBvb2wqLCBQeURlc2NyaXB0b3JQb29sKj46Oml0ZXJhdG9yIGl0ID0KLSAgICAgIGRlc2NyaXB0b3JfcG9vbF9tYXAuZmluZChwb29sKTsKLSAgaWYgKGl0ID09IGRlc2NyaXB0b3JfcG9vbF9tYXAuZW5kKCkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsICJVbmtub3duIGRlc2NyaXB0b3IgcG9vbCIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBpdC0+c2Vjb25kOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3JfcG9vbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYTQyYzExLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfREVTQ1JJUFRPUl9QT09MX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9ERVNDUklQVE9SX1BPT0xfSF9fCi0KLSNpbmNsdWRlIDxQeXRob24uaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotY2xhc3MgTWVzc2FnZUZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBweXRob24gewotCi0vLyBUaGUgKG1ldGEpIHR5cGUgb2YgYWxsIE1lc3NhZ2VzIGNsYXNzZXMuCi1zdHJ1Y3QgQ01lc3NhZ2VDbGFzczsKLQotLy8gV3JhcHMgb3BlcmF0aW9ucyB0byB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0vLyBhYm91dCBhbGwgbWVzc2FnZXMgYW5kIGZpZWxkcy4KLS8vCi0vLyBUaGVyZSBpcyBub3JtYWxseSBvbmUgcG9vbCBwZXIgcHJvY2Vzcy4gV2UgbWFrZSBpdCBhIFB5dGhvbiBvYmplY3Qgb25seQotLy8gYmVjYXVzZSBpdCBjb250YWlucyBtYW55IFB5dGhvbiByZWZlcmVuY2VzLgotLy8gVE9ETyhhbWF1cnlmYSk6IFNlZSB3aGV0aGVyIHN1Y2ggb2JqZWN0cyBjYW4gYXBwZWFyIGluIHJlZmVyZW5jZSBjeWNsZXMsIGFuZAotLy8gY29uc2lkZXIgYWRkaW5nIHN1cHBvcnQgZm9yIHRoZSBjeWNsaWMgR0MuCi0vLwotLy8gIk1ldGhvZHMiIHRoYXQgaW50ZXJhY3RzIHdpdGggdGhpcyBEZXNjcmlwdG9yUG9vbCBhcmUgaW4gdGhlIGNkZXNjcmlwdG9yX3Bvb2wKLS8vIG5hbWVzcGFjZS4KLXR5cGVkZWYgc3RydWN0IFB5RGVzY3JpcHRvclBvb2wgewotICBQeU9iamVjdF9IRUFECi0KLSAgLy8gVGhlIEMrKyBwb29sIGNvbnRhaW5pbmcgRGVzY3JpcHRvcnMuCi0gIERlc2NyaXB0b3JQb29sKiBwb29sOwotCi0gIC8vIFRoZSBDKysgcG9vbCBhY3RpbmcgYXMgYW4gdW5kZXJsYXkuIENhbiBiZSBOVUxMLgotICAvLyBUaGlzIHBvaW50ZXIgaXMgbm90IG93bmVkIGFuZCBtdXN0IHN0YXkgYWxpdmUuCi0gIGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheTsKLQotICAvLyBUaGUgQysrIGRlc2NyaXB0b3IgZGF0YWJhc2UgdXNlZCB0byBmZXRjaCB1bmtub3duIHByb3Rvcy4gQ2FuIGJlIE5VTEwuCi0gIC8vIFRoaXMgcG9pbnRlciBpcyBvd25lZC4KLSAgY29uc3QgRGVzY3JpcHRvckRhdGFiYXNlKiBkYXRhYmFzZTsKLQotICAvLyBEeW5hbWljTWVzc2FnZUZhY3RvcnkgdXNlZCB0byBjcmVhdGUgQysrIGluc3RhbmNlcyBvZiBtZXNzYWdlcy4KLSAgLy8gVGhpcyBvYmplY3QgY2FjaGUgdGhlIGRlc2NyaXB0b3JzIHRoYXQgd2VyZSB1c2VkLCBzbyB0aGUgRGVzY3JpcHRvclBvb2wKLSAgLy8gbmVlZHMgdG8gZ2V0IHJpZCBvZiBpdCBiZWZvcmUgaXQgY2FuIGRlbGV0ZSBpdHNlbGYuCi0gIC8vCi0gIC8vIE5vdGU6IEEgQysrIE1lc3NhZ2VGYWN0b3J5IGlzIGRpZmZlcmVudCBmcm9tIHRoZSBQeXRob24gTWVzc2FnZUZhY3RvcnkuCi0gIC8vIFRoZSBDKysgb25lIGNyZWF0ZXMgbWVzc2FnZXMsIHdoZW4gdGhlIFB5dGhvbiBvbmUgY3JlYXRlcyBjbGFzc2VzLgotICBNZXNzYWdlRmFjdG9yeSogbWVzc2FnZV9mYWN0b3J5OwotCi0gIC8vIE1ha2Ugb3VyIG93biBtYXBwaW5nIHRvIHJldHJpZXZlIFB5dGhvbiBjbGFzc2VzIGZyb20gQysrIGRlc2NyaXB0b3JzLgotICAvLwotICAvLyBEZXNjcmlwdG9yIHBvaW50ZXJzIHN0b3JlZCBoZXJlIGFyZSBvd25lZCBieSB0aGUgRGVzY3JpcHRvclBvb2wgYWJvdmUuCi0gIC8vIFB5dGhvbiByZWZlcmVuY2VzIHRvIGNsYXNzZXMgYXJlIG93bmVkIGJ5IHRoaXMgUHlEZXNjcmlwdG9yUG9vbC4KLSAgdHlwZWRlZiBoYXNoX21hcDxjb25zdCBEZXNjcmlwdG9yKiwgQ01lc3NhZ2VDbGFzcyo+IENsYXNzZXNCeU1lc3NhZ2VNYXA7Ci0gIENsYXNzZXNCeU1lc3NhZ2VNYXAqIGNsYXNzZXNfYnlfZGVzY3JpcHRvcjsKLQotICAvLyBDYWNoZSB0aGUgb3B0aW9ucyBmb3IgYW55IGtpbmQgb2YgZGVzY3JpcHRvci4KLSAgLy8gRGVzY3JpcHRvciBwb2ludGVycyBhcmUgb3duZWQgYnkgdGhlIERlc2NyaXB0b3JQb29sIGFib3ZlLgotICAvLyBQeXRob24gb2JqZWN0cyBhcmUgb3duZWQgYnkgdGhlIG1hcC4KLSAgaGFzaF9tYXA8Y29uc3Qgdm9pZCosIFB5T2JqZWN0Kj4qIGRlc2NyaXB0b3Jfb3B0aW9uczsKLX0gUHlEZXNjcmlwdG9yUG9vbDsKLQotCi1leHRlcm4gUHlUeXBlT2JqZWN0IFB5RGVzY3JpcHRvclBvb2xfVHlwZTsKLQotbmFtZXNwYWNlIGNkZXNjcmlwdG9yX3Bvb2wgewotCi0vLyBMb29rcyB1cCBhIG1lc3NhZ2UgYnkgbmFtZS4KLS8vIFJldHVybnMgYSBtZXNzYWdlIERlc2NyaXB0b3IsIG9yIE5VTEwgaWYgbm90IGZvdW5kLgotY29uc3QgRGVzY3JpcHRvciogRmluZE1lc3NhZ2VUeXBlQnlOYW1lKFB5RGVzY3JpcHRvclBvb2wqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKTsKLQotLy8gUmVnaXN0ZXJzIGEgbmV3IFB5dGhvbiBjbGFzcyBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UgZGVzY3JpcHRvci4KLS8vIE9uIGVycm9yLCByZXR1cm5zIC0xIHdpdGggYSBQeXRob24gZXhjZXB0aW9uIHNldC4KLWludCBSZWdpc3Rlck1lc3NhZ2VDbGFzcyhQeURlc2NyaXB0b3JQb29sKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDTWVzc2FnZUNsYXNzKiBtZXNzYWdlX2NsYXNzKTsKLQotLy8gUmV0cmlldmVzIHRoZSBQeXRob24gY2xhc3MgcmVnaXN0ZXJlZCB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIGRlc2NyaXB0b3IuCi0vLwotLy8gUmV0dXJucyBhICpib3Jyb3dlZCogcmVmZXJlbmNlIGlmIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyBOVUxMIHdpdGggYW4KLS8vIGV4Y2VwdGlvbiBzZXQuCi1DTWVzc2FnZUNsYXNzKiBHZXRNZXNzYWdlQ2xhc3MoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3IpOwotCi0vLyBUaGUgZnVuY3Rpb25zIGJlbG93IGFyZSBhbHNvIGV4cG9zZWQgYXMgbWV0aG9kcyBvZiB0aGUgRGVzY3JpcHRvclBvb2wgdHlwZS4KLQotLy8gTG9va3MgdXAgYSBtZXNzYWdlIGJ5IG5hbWUuIFJldHVybnMgYSBQeU1lc3NhZ2VEZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8KLS8vIHRoZSBmaWVsZCBvbiBzdWNjZXNzLCBvciBOVUxMIG9uIGZhaWx1cmUuCi0vLwotLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UuCi1QeU9iamVjdCogRmluZE1lc3NhZ2VCeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIG5hbWUpOwotCi0vLyBMb29rcyB1cCBhIGZpZWxkIGJ5IG5hbWUuIFJldHVybnMgYSBQeUZpZWxkRGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvCi0vLyB0aGUgZmllbGQgb24gc3VjY2Vzcywgb3IgTlVMTCBvbiBmYWlsdXJlLgotLy8KLS8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgotUHlPYmplY3QqIEZpbmRGaWVsZEJ5TmFtZShQeURlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogbmFtZSk7Ci0KLS8vIExvb2tzIHVwIGFuIGV4dGVuc2lvbiBieSBuYW1lLiBSZXR1cm5zIGEgUHlGaWVsZERlc2NyaXB0b3IgY29ycmVzcG9uZGluZwotLy8gdG8gdGhlIGZpZWxkIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KLS8vCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBGaW5kRXh0ZW5zaW9uQnlOYW1lKFB5RGVzY3JpcHRvclBvb2wqIHNlbGYsIFB5T2JqZWN0KiBhcmcpOwotCi0vLyBMb29rcyB1cCBhbiBlbnVtIHR5cGUgYnkgbmFtZS4gUmV0dXJucyBhIFB5RW51bURlc2NyaXB0b3IgY29ycmVzcG9uZGluZwotLy8gdG8gdGhlIGZpZWxkIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KLS8vCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBGaW5kRW51bVR5cGVCeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZyk7Ci0KLS8vIExvb2tzIHVwIGEgb25lb2YgYnkgbmFtZS4gUmV0dXJucyBhIENPbmVvZkRlc2NyaXB0b3IgY29ycmVzcG9uZGluZwotLy8gdG8gdGhlIG9uZW9mIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KLS8vCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBGaW5kT25lb2ZCeU5hbWUoUHlEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZyk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBjZGVzY3JpcHRvcl9wb29sCi0KLS8vIFJldHJpZXZlIHRoZSBnbG9iYWwgZGVzY3JpcHRvciBwb29sIG93bmVkIGJ5IHRoZSBfbWVzc2FnZSBtb2R1bGUuCi0vLyBUaGlzIGlzIHRoZSBvbmUgdXNlZCBieSBwYjIucHkgZ2VuZXJhdGVkIG1vZHVsZXMuCi0vLyBSZXR1cm5zIGEgKmJvcnJvd2VkKiByZWZlcmVuY2UuCi0vLyAiRGVmYXVsdCIgcG9vbCB1c2VkIHRvIHJlZ2lzdGVyIG1lc3NhZ2VzIGZyb20gX3BiMi5weSBtb2R1bGVzLgotUHlEZXNjcmlwdG9yUG9vbCogR2V0RGVmYXVsdERlc2NyaXB0b3JQb29sKCk7Ci0KLS8vIFJldHJpZXZlIHRoZSBweXRob24gZGVzY3JpcHRvciBwb29sIG93bmluZyBhIEMrKyBkZXNjcmlwdG9yIHBvb2wuCi0vLyBSZXR1cm5zIGEgKmJvcnJvd2VkKiByZWZlcmVuY2UuCi1QeURlc2NyaXB0b3JQb29sKiBHZXREZXNjcmlwdG9yUG9vbF9Gcm9tUG9vbChjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCk7Ci0KLS8vIEluaXRpYWxpemUgb2JqZWN0cyB1c2VkIGJ5IHRoaXMgbW9kdWxlLgotYm9vbCBJbml0RGVzY3JpcHRvclBvb2woKTsKLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfREVTQ1JJUFRPUl9QT09MX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9leHRlbnNpb25fZGljdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvZXh0ZW5zaW9uX2RpY3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIxYmJiOGMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9leHRlbnNpb25fZGljdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBhbnVyYWFnQGdvb2dsZS5jb20gKEFudXJhYWcgQWdyYXdhbCkKLS8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9leHRlbnNpb25fZGljdC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX3NjYWxhcl9jb250YWluZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi1uYW1lc3BhY2UgZXh0ZW5zaW9uX2RpY3QgewotCi1QeU9iamVjdCogbGVuKEV4dGVuc2lvbkRpY3QqIHNlbGYpIHsKLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLSAgcmV0dXJuIFB5TG9uZ19Gcm9tTG9uZyhQeURpY3RfU2l6ZShzZWxmLT52YWx1ZXMpKTsKLSNlbHNlCi0gIHJldHVybiBQeUludF9Gcm9tTG9uZyhQeURpY3RfU2l6ZShzZWxmLT52YWx1ZXMpKTsKLSNlbmRpZgotfQotCi0vLyBUT0RPKHRpYmVsbCk6IFVzZSBWaXNpdENvbXBvc2l0ZUZpZWxkLgotaW50IFJlbGVhc2VFeHRlbnNpb24oRXh0ZW5zaW9uRGljdCogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgaWYgKGRlc2NyaXB0b3ItPmxhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCkgewotICAgIGlmIChkZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBpZiAocmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lcjo6UmVsZWFzZSgKLSAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcio+KAotICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uKSkgPCAwKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6OlJlbGVhc2UoCi0gICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPigKLSAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbikpIDwgMCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICBpZiAoY21lc3NhZ2U6OlJlbGVhc2VTdWJNZXNzYWdlKAotICAgICAgICAgICAgc2VsZi0+cGFyZW50LCBkZXNjcmlwdG9yLAotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGV4dGVuc2lvbikpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotCi0gIHJldHVybiAwOwotfQotCi1QeU9iamVjdCogc3Vic2NyaXB0KEV4dGVuc2lvbkRpY3QqIHNlbGYsIFB5T2JqZWN0KiBrZXkpIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gY21lc3NhZ2U6OkdldEV4dGVuc2lvbkRlc2NyaXB0b3Ioa2V5KTsKLSAgaWYgKGRlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoZGVzY3JpcHRvciwgc2VsZi0+bWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yLT5sYWJlbCgpICE9IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQgJiYKLSAgICAgIGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICByZXR1cm4gY21lc3NhZ2U6OkludGVybmFsR2V0U2NhbGFyKHNlbGYtPm1lc3NhZ2UsIGRlc2NyaXB0b3IpOwotICB9Ci0KLSAgUHlPYmplY3QqIHZhbHVlID0gUHlEaWN0X0dldEl0ZW0oc2VsZi0+dmFsdWVzLCBrZXkpOwotICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgIFB5X0lOQ1JFRih2YWx1ZSk7Ci0gICAgcmV0dXJuIHZhbHVlOwotICB9Ci0KLSAgaWYgKHNlbGYtPnBhcmVudCA9PSBOVUxMKSB7Ci0gICAgLy8gV2UgYXJlIGluICJkZXRhY2hlZCIgc3RhdGUuIERvbid0IGFsbG93IGZ1cnRoZXIgbW9kaWZpY2F0aW9ucy4KLSAgICAvLyBUT0RPKGFtYXVyeWZhKTogU3VwcG9ydCBhZGRpbmcgbm9uLXNjYWxhcnMgdG8gYSBkZXRhY2hlZCBleHRlbnNpb24gZGljdC4KLSAgICAvLyBUaGlzIHByb2JhYmx5IHJlcXVpcmVzIHRvIHN0b3JlIHRoZSB0eXBlIG9mIHRoZSBtYWluIG1lc3NhZ2UuCi0gICAgUHlFcnJfU2V0T2JqZWN0KFB5RXhjX0tleUVycm9yLCBrZXkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKGRlc2NyaXB0b3ItPmxhYmVsKCkgIT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCAmJgotICAgICAgZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgIFB5T2JqZWN0KiBzdWJfbWVzc2FnZSA9IGNtZXNzYWdlOjpJbnRlcm5hbEdldFN1Yk1lc3NhZ2UoCi0gICAgICAgIHNlbGYtPnBhcmVudCwgZGVzY3JpcHRvcik7Ci0gICAgaWYgKHN1Yl9tZXNzYWdlID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeURpY3RfU2V0SXRlbShzZWxmLT52YWx1ZXMsIGtleSwgc3ViX21lc3NhZ2UpOwotICAgIHJldHVybiBzdWJfbWVzc2FnZTsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQpIHsKLSAgICBpZiAoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcyA9IGNkZXNjcmlwdG9yX3Bvb2w6OkdldE1lc3NhZ2VDbGFzcygKLSAgICAgICAgICBjbWVzc2FnZTo6R2V0RGVzY3JpcHRvclBvb2xGb3JNZXNzYWdlKHNlbGYtPnBhcmVudCksCi0gICAgICAgICAgZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOwotICAgICAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIFB5T2JqZWN0KiBweV9jb250YWluZXIgPSByZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyOjpOZXdDb250YWluZXIoCi0gICAgICAgICAgc2VsZi0+cGFyZW50LCBkZXNjcmlwdG9yLCBtZXNzYWdlX2NsYXNzKTsKLSAgICAgIGlmIChweV9jb250YWluZXIgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIFB5RGljdF9TZXRJdGVtKHNlbGYtPnZhbHVlcywga2V5LCBweV9jb250YWluZXIpOwotICAgICAgcmV0dXJuIHB5X2NvbnRhaW5lcjsKLSAgICB9IGVsc2UgewotICAgICAgUHlPYmplY3QqIHB5X2NvbnRhaW5lciA9IHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6Ok5ld0NvbnRhaW5lcigKLSAgICAgICAgICBzZWxmLT5wYXJlbnQsIGRlc2NyaXB0b3IpOwotICAgICAgaWYgKHB5X2NvbnRhaW5lciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgICAgUHlEaWN0X1NldEl0ZW0oc2VsZi0+dmFsdWVzLCBrZXksIHB5X2NvbnRhaW5lcik7Ci0gICAgICByZXR1cm4gcHlfY29udGFpbmVyOwotICAgIH0KLSAgfQotICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgImNvbnRyb2wgcmVhY2hlZCB1bmV4cGVjdGVkIGxpbmUiKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWludCBhc3Nfc3Vic2NyaXB0KEV4dGVuc2lvbkRpY3QqIHNlbGYsIFB5T2JqZWN0KiBrZXksIFB5T2JqZWN0KiB2YWx1ZSkgewotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBjbWVzc2FnZTo6R2V0RXh0ZW5zaW9uRGVzY3JpcHRvcihrZXkpOwotICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoZGVzY3JpcHRvciwgc2VsZi0+bWVzc2FnZSkpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvci0+bGFiZWwoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMIHx8Ci0gICAgICBkZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkV4dGVuc2lvbiBpcyByZXBlYXRlZCBhbmQvb3IgY29tcG9zaXRlICIKLSAgICAgICAgICAgICAgICAgICAgInR5cGUiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKHNlbGYtPnBhcmVudCkgewotICAgIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpOwotICAgIGlmIChjbWVzc2FnZTo6SW50ZXJuYWxTZXRTY2FsYXIoc2VsZi0+cGFyZW50LCBkZXNjcmlwdG9yLCB2YWx1ZSkgPCAwKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0gIC8vIFRPRE8odGliZWxsKTogV2Ugc2hvdWxkbid0IHdyaXRlIHNjYWxhcnMgdG8gdGhlIGNhY2hlLgotICBQeURpY3RfU2V0SXRlbShzZWxmLT52YWx1ZXMsIGtleSwgdmFsdWUpOwotICByZXR1cm4gMDsKLX0KLQotUHlPYmplY3QqIENsZWFyRXh0ZW5zaW9uKEV4dGVuc2lvbkRpY3QqIHNlbGYsIFB5T2JqZWN0KiBleHRlbnNpb24pIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0KLSAgICAgIGNtZXNzYWdlOjpHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbik7Ci0gIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeU9iamVjdCogdmFsdWUgPSBQeURpY3RfR2V0SXRlbShzZWxmLT52YWx1ZXMsIGV4dGVuc2lvbik7Ci0gIGlmIChzZWxmLT5wYXJlbnQpIHsKLSAgICBpZiAodmFsdWUgIT0gTlVMTCkgewotICAgICAgaWYgKFJlbGVhc2VFeHRlbnNpb24oc2VsZiwgdmFsdWUsIGRlc2NyaXB0b3IpIDwgMCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICB9Ci0gICAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKGNtZXNzYWdlOjpDbGVhckZpZWxkQnlEZXNjcmlwdG9yKAotICAgICAgICAgICAgc2VsZi0+cGFyZW50LCBkZXNjcmlwdG9yKSkgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIGlmIChQeURpY3RfRGVsSXRlbShzZWxmLT52YWx1ZXMsIGV4dGVuc2lvbikgPCAwKSB7Ci0gICAgUHlFcnJfQ2xlYXIoKTsKLSAgfQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotUHlPYmplY3QqIEhhc0V4dGVuc2lvbihFeHRlbnNpb25EaWN0KiBzZWxmLCBQeU9iamVjdCogZXh0ZW5zaW9uKSB7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9Ci0gICAgICBjbWVzc2FnZTo6R2V0RXh0ZW5zaW9uRGVzY3JpcHRvcihleHRlbnNpb24pOwotICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKHNlbGYtPnBhcmVudCkgewotICAgIHJldHVybiBjbWVzc2FnZTo6SGFzRmllbGRCeURlc2NyaXB0b3Ioc2VsZi0+cGFyZW50LCBkZXNjcmlwdG9yKTsKLSAgfSBlbHNlIHsKLSAgICBpbnQgZXhpc3RzID0gUHlEaWN0X0NvbnRhaW5zKHNlbGYtPnZhbHVlcywgZXh0ZW5zaW9uKTsKLSAgICBpZiAoZXhpc3RzIDwgMCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoZXhpc3RzKTsKLSAgfQotfQotCi1QeU9iamVjdCogX0ZpbmRFeHRlbnNpb25CeU5hbWUoRXh0ZW5zaW9uRGljdCogc2VsZiwgUHlPYmplY3QqIG5hbWUpIHsKLSAgU2NvcGVkUHlPYmplY3RQdHIgZXh0ZW5zaW9uc19ieV9uYW1lKFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoCi0gICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZi0+cGFyZW50KSwgIl9leHRlbnNpb25zX2J5X25hbWUiKSk7Ci0gIGlmIChleHRlbnNpb25zX2J5X25hbWUgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5T2JqZWN0KiByZXN1bHQgPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25zX2J5X25hbWUuZ2V0KCksIG5hbWUpOwotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICBQeV9SRVRVUk5fTk9ORTsKLSAgfSBlbHNlIHsKLSAgICBQeV9JTkNSRUYocmVzdWx0KTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLVB5T2JqZWN0KiBfRmluZEV4dGVuc2lvbkJ5TnVtYmVyKEV4dGVuc2lvbkRpY3QqIHNlbGYsIFB5T2JqZWN0KiBudW1iZXIpIHsKLSAgU2NvcGVkUHlPYmplY3RQdHIgZXh0ZW5zaW9uc19ieV9udW1iZXIoUHlPYmplY3RfR2V0QXR0clN0cmluZygKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmLT5wYXJlbnQpLCAiX2V4dGVuc2lvbnNfYnlfbnVtYmVyIikpOwotICBpZiAoZXh0ZW5zaW9uc19ieV9udW1iZXIgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5T2JqZWN0KiByZXN1bHQgPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25zX2J5X251bWJlci5nZXQoKSwgbnVtYmVyKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfSU5DUkVGKHJlc3VsdCk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi1FeHRlbnNpb25EaWN0KiBOZXdFeHRlbnNpb25EaWN0KENNZXNzYWdlICpwYXJlbnQpIHsKLSAgRXh0ZW5zaW9uRGljdCogc2VsZiA9IHJlaW50ZXJwcmV0X2Nhc3Q8RXh0ZW5zaW9uRGljdCo+KAotICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmRXh0ZW5zaW9uRGljdF9UeXBlLCAwKSk7Ci0gIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHNlbGYtPnBhcmVudCA9IHBhcmVudDsgIC8vIFN0b3JlIGEgYm9ycm93ZWQgcmVmZXJlbmNlLgotICBzZWxmLT5tZXNzYWdlID0gcGFyZW50LT5tZXNzYWdlOwotICBzZWxmLT5vd25lciA9IHBhcmVudC0+b3duZXI7Ci0gIHNlbGYtPnZhbHVlcyA9IFB5RGljdF9OZXcoKTsKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLXZvaWQgZGVhbGxvYyhFeHRlbnNpb25EaWN0KiBzZWxmKSB7Ci0gIFB5X0NMRUFSKHNlbGYtPnZhbHVlcyk7Ci0gIHNlbGYtPm93bmVyLnJlc2V0KCk7Ci0gIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKLX0KLQotc3RhdGljIFB5TWFwcGluZ01ldGhvZHMgTXBNZXRob2RzID0gewotICAobGVuZnVuYylsZW4sICAgICAgICAgICAgICAgLyogbXBfbGVuZ3RoICovCi0gIChiaW5hcnlmdW5jKXN1YnNjcmlwdCwgICAgICAvKiBtcF9zdWJzY3JpcHQgKi8KLSAgKG9iam9iamFyZ3Byb2MpYXNzX3N1YnNjcmlwdCwvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCi19OwotCi0jZGVmaW5lIEVETUVUSE9EKG5hbWUsIGFyZ3MsIGRvYykgeyAjbmFtZSwgKFB5Q0Z1bmN0aW9uKW5hbWUsIGFyZ3MsIGRvYyB9Ci1zdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0gewotICBFRE1FVEhPRChDbGVhckV4dGVuc2lvbiwgTUVUSF9PLCAiQ2xlYXJzIGFuIGV4dGVuc2lvbiBmcm9tIHRoZSBvYmplY3QuIiksCi0gIEVETUVUSE9EKEhhc0V4dGVuc2lvbiwgTUVUSF9PLCAiQ2hlY2tzIGlmIHRoZSBvYmplY3QgaGFzIGFuIGV4dGVuc2lvbi4iKSwKLSAgRURNRVRIT0QoX0ZpbmRFeHRlbnNpb25CeU5hbWUsIE1FVEhfTywKLSAgICAgICAgICAgIkZpbmRzIGFuIGV4dGVuc2lvbiBieSBuYW1lLiIpLAotICBFRE1FVEhPRChfRmluZEV4dGVuc2lvbkJ5TnVtYmVyLCBNRVRIX08sCi0gICAgICAgICAgICJGaW5kcyBhbiBleHRlbnNpb24gYnkgZmllbGQgbnVtYmVyLiIpLAotICB7IE5VTEwsIE5VTEwgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGV4dGVuc2lvbl9kaWN0Ci0KLVB5VHlwZU9iamVjdCBFeHRlbnNpb25EaWN0X1R5cGUgPSB7Ci0gIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gIEZVTExfTU9EVUxFX05BTUUgIi5FeHRlbnNpb25EaWN0IiwgICAvLyB0cF9uYW1lCi0gIHNpemVvZihFeHRlbnNpb25EaWN0KSwgICAgICAgICAgICAgICAvLyB0cF9iYXNpY3NpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQotICAoZGVzdHJ1Y3RvcilleHRlbnNpb25fZGljdDo6ZGVhbGxvYywgIC8vICB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKLSAgJmV4dGVuc2lvbl9kaWN0OjpNcE1ldGhvZHMsICAgICAgICAgIC8vICB0cF9hc19tYXBwaW5nCi0gIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAgICAvLyAgdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAvLyAgdHBfZmxhZ3MKLSAgIkFuIGV4dGVuc2lvbiBkaWN0IiwgICAgICAgICAgICAgICAgIC8vICB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAotICBleHRlbnNpb25fZGljdDo6TWV0aG9kcywgICAgICAgICAgICAgLy8gIHRwX21ldGhvZHMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9zZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2V4dGVuc2lvbl9kaWN0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2V4dGVuc2lvbl9kaWN0LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI0NTZlZGEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9leHRlbnNpb25fZGljdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTM3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGFudXJhYWdAZ29vZ2xlLmNvbSAoQW51cmFhZyBBZ3Jhd2FsKQotLy8gQXV0aG9yOiB0aWJlbGxAZ29vZ2xlLmNvbSAoSm9oYW4gVGliZWxsKQotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0VYVEVOU0lPTl9ESUNUX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9FWFRFTlNJT05fRElDVF9IX18KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLWNsYXNzIE1lc3NhZ2U7Ci1jbGFzcyBGaWVsZERlc2NyaXB0b3I7Ci0KLSNpZmRlZiBfU0hBUkVEX1BUUl9ICi11c2luZyBzdGQ6OnNoYXJlZF9wdHI7Ci0jZWxzZQotdXNpbmcgaW50ZXJuYWw6OnNoYXJlZF9wdHI7Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLXN0cnVjdCBDTWVzc2FnZTsKLQotdHlwZWRlZiBzdHJ1Y3QgRXh0ZW5zaW9uRGljdCB7Ci0gIFB5T2JqZWN0X0hFQUQ7Ci0KLSAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIEMrKyBNZXNzYWdlIG9iamVjdCB0aGF0IG93bnMgdGhlIHdob2xlCi0gIC8vIHByb3RvIHRyZWUuICBFdmVyeSBQeXRob24gY29udGFpbmVyIGNsYXNzIGhvbGRzIGEKLSAgLy8gcmVmZXJlbmNlIHRvIGl0IGluIG9yZGVyIHRvIGtlZXAgaXQgYWxpdmUgYXMgbG9uZyBhcyB0aGVyZSdzIGEKLSAgLy8gUHl0aG9uIG9iamVjdCB0aGF0IHJlZmVyZW5jZXMgYW55IHBhcnQgb2YgdGhlIHRyZWUuCi0gIHNoYXJlZF9wdHI8TWVzc2FnZT4gb3duZXI7Ci0KLSAgLy8gV2VhayByZWZlcmVuY2UgdG8gcGFyZW50IG1lc3NhZ2UuIFVzZWQgdG8gbWFrZSBzdXJlCi0gIC8vIHRoZSBwYXJlbnQgaXMgd3JpdGFibGUgd2hlbiBhbiBleHRlbnNpb24gZmllbGQgaXMgbW9kaWZpZWQuCi0gIENNZXNzYWdlKiBwYXJlbnQ7Ci0KLSAgLy8gUG9pbnRlciB0byB0aGUgQysrIE1lc3NhZ2UgdGhhdCB0aGlzIEV4dGVuc2lvbkRpY3QgZXh0ZW5kcy4KLSAgLy8gTm90IG93bmVkIGJ5IHVzLgotICBNZXNzYWdlKiBtZXNzYWdlOwotCi0gIC8vIEEgZGljdCBvZiBjaGlsZCBtZXNzYWdlcywgaW5kZXhlZCBieSBFeHRlbnNpb24gZGVzY3JpcHRvcnMuCi0gIC8vIFNpbWlsYXIgdG8gQ01lc3NhZ2U6OmNvbXBvc2l0ZV9maWVsZHMuCi0gIFB5T2JqZWN0KiB2YWx1ZXM7Ci19IEV4dGVuc2lvbkRpY3Q7Ci0KLWV4dGVybiBQeVR5cGVPYmplY3QgRXh0ZW5zaW9uRGljdF9UeXBlOwotCi1uYW1lc3BhY2UgZXh0ZW5zaW9uX2RpY3QgewotCi0vLyBCdWlsZHMgYW4gRXh0ZW5zaW9ucyBkaWN0IGZvciBhIHNwZWNpZmljIG1lc3NhZ2UuCi1FeHRlbnNpb25EaWN0KiBOZXdFeHRlbnNpb25EaWN0KENNZXNzYWdlICpwYXJlbnQpOwotCi0vLyBHZXRzIHRoZSBudW1iZXIgb2YgZXh0ZW5zaW9uIHZhbHVlcyBpbiB0aGlzIEV4dGVuc2lvbkRpY3QgYXMgYSBweXRob24gb2JqZWN0LgotLy8KLS8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgotUHlPYmplY3QqIGxlbihFeHRlbnNpb25EaWN0KiBzZWxmKTsKLQotLy8gUmVsZWFzZXMgZXh0ZW5zaW9ucyByZWZlcmVuY2VkIG91dHNpZGUgdGhpcyBkaWN0aW9uYXJ5IHRvIGtlZXAgb3V0c2lkZQotLy8gcmVmZXJlbmNlcyBhbGl2ZS4KLS8vCi0vLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLWludCBSZWxlYXNlRXh0ZW5zaW9uKEV4dGVuc2lvbkRpY3QqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLQotLy8gR2V0cyBhbiBleHRlbnNpb24gZnJvbSB0aGUgZGljdCBmb3IgdGhlIGdpdmVuIGV4dGVuc2lvbiBkZXNjcmlwdG9yLgotLy8KLS8vIFJldHVybnMgYSBuZXcgcmVmZXJlbmNlLgotUHlPYmplY3QqIHN1YnNjcmlwdChFeHRlbnNpb25EaWN0KiBzZWxmLCBQeU9iamVjdCoga2V5KTsKLQotLy8gQXNzaWducyBhIHZhbHVlIHRvIGFuIGV4dGVuc2lvbiBpbiB0aGUgZGljdC4gQ2FuIG9ubHkgYmUgdXNlZCBmb3Igc2luZ3VsYXIKLS8vIHNpbXBsZSB0eXBlcy4KLS8vCi0vLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLWludCBhc3Nfc3Vic2NyaXB0KEV4dGVuc2lvbkRpY3QqIHNlbGYsIFB5T2JqZWN0KiBrZXksIFB5T2JqZWN0KiB2YWx1ZSk7Ci0KLS8vIENsZWFycyBhbiBleHRlbnNpb24gZnJvbSB0aGUgZGljdC4gV2lsbCByZWxlYXNlIHRoZSBleHRlbnNpb24gaWYgdGhlcmUKLS8vIGlzIHN0aWxsIGFuIGV4dGVybmFsIHJlZmVyZW5jZSBsZWZ0IHRvIGl0LgotLy8KLS8vIFJldHVybnMgTm9uZSBvbiBzdWNjZXNzLgotUHlPYmplY3QqIENsZWFyRXh0ZW5zaW9uKEV4dGVuc2lvbkRpY3QqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogZXh0ZW5zaW9uKTsKLQotLy8gR2V0cyBhbiBleHRlbnNpb24gZnJvbSB0aGUgZGljdCBnaXZlbiB0aGUgZXh0ZW5zaW9uIG5hbWUgYXMgb3Bwb3NlZCB0bwotLy8gZGVzY3JpcHRvci4KLS8vCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBfRmluZEV4dGVuc2lvbkJ5TmFtZShFeHRlbnNpb25EaWN0KiBzZWxmLCBQeU9iamVjdCogbmFtZSk7Ci0KLS8vIEdldHMgYW4gZXh0ZW5zaW9uIGZyb20gdGhlIGRpY3QgZ2l2ZW4gdGhlIGV4dGVuc2lvbiBmaWVsZCBudW1iZXIgYXMKLS8vIG9wcG9zZWQgdG8gZGVzY3JpcHRvci4KLS8vCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBfRmluZEV4dGVuc2lvbkJ5TnVtYmVyKEV4dGVuc2lvbkRpY3QqIHNlbGYsIFB5T2JqZWN0KiBudW1iZXIpOwotCi19ICAvLyBuYW1lc3BhY2UgZXh0ZW5zaW9uX2RpY3QKLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX0VYVEVOU0lPTl9ESUNUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tYXBfY29udGFpbmVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tYXBfY29udGFpbmVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMDIyNDA2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWFwX2NvbnRhaW5lci5jYworKysgL2Rldi9udWxsCkBAIC0xLDk3MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBoYWJlcm1hbkBnb29nbGUuY29tIChKb3NoIEhhYmVybWFuKQotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21hcF9jb250YWluZXIuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zY29wZWRfcHRyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXAuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaD4KLQotI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMwotICAjZGVmaW5lIFB5SW50X0Zyb21Mb25nIFB5TG9uZ19Gcm9tTG9uZwotICAjZGVmaW5lIFB5SW50X0Zyb21TaXplX3QgUHlMb25nX0Zyb21TaXplX3QKLSNlbmRpZgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgcHl0aG9uIHsKLQotLy8gRnVuY3Rpb25zIHRoYXQgbmVlZCBhY2Nlc3MgdG8gbWFwIHJlZmxlY3Rpb24gZnVuY3Rpb25hbGl0eS4KLS8vIFRoZXkgbmVlZCB0byBiZSBjb250YWluZWQgaW4gdGhpcyBjbGFzcyBiZWNhdXNlIGl0IGlzIGZyaWVuZGVkLgotY2xhc3MgTWFwUmVmbGVjdGlvbkZyaWVuZCB7Ci0gcHVibGljOgotICAvLyBNZXRob2RzIHRoYXQgYXJlIGluIGNvbW1vbiBiZXR3ZWVuIHRoZSBtYXAgdHlwZXMuCi0gIHN0YXRpYyBQeU9iamVjdCogQ29udGFpbnMoUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCoga2V5KTsKLSAgc3RhdGljIFB5X3NzaXplX3QgTGVuZ3RoKFB5T2JqZWN0KiBfc2VsZik7Ci0gIHN0YXRpYyBQeU9iamVjdCogR2V0SXRlcmF0b3IoUHlPYmplY3QgKl9zZWxmKTsKLSAgc3RhdGljIFB5T2JqZWN0KiBJdGVyTmV4dChQeU9iamVjdCogX3NlbGYpOwotCi0gIC8vIE1ldGhvZHMgdGhhdCBkaWZmZXIgYmV0d2VlbiB0aGUgbWFwIHR5cGVzLgotICBzdGF0aWMgUHlPYmplY3QqIFNjYWxhck1hcEdldEl0ZW0oUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCoga2V5KTsKLSAgc3RhdGljIFB5T2JqZWN0KiBNZXNzYWdlTWFwR2V0SXRlbShQeU9iamVjdCogX3NlbGYsIFB5T2JqZWN0KiBrZXkpOwotICBzdGF0aWMgaW50IFNjYWxhck1hcFNldEl0ZW0oUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCoga2V5LCBQeU9iamVjdCogdik7Ci0gIHN0YXRpYyBpbnQgTWVzc2FnZU1hcFNldEl0ZW0oUHlPYmplY3QqIF9zZWxmLCBQeU9iamVjdCoga2V5LCBQeU9iamVjdCogdik7Ci19OwotCi1zdHJ1Y3QgTWFwSXRlcmF0b3IgewotICBQeU9iamVjdF9IRUFEOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWFwSXRlcmF0b3I+IGl0ZXI7Ci0KLSAgLy8gQSBwb2ludGVyIGJhY2sgdG8gdGhlIGNvbnRhaW5lciwgc28gd2UgY2FuIG5vdGljZSBjaGFuZ2VzIHRvIHRoZSB2ZXJzaW9uLgotICAvLyBXZSBvd24gYSByZWYgb24gdGhpcy4KLSAgTWFwQ29udGFpbmVyKiBjb250YWluZXI7Ci0KLSAgLy8gV2UgbmVlZCB0byBrZWVwIGEgcmVmIG9uIHRoZSBNZXNzYWdlKiB0b28sIGJlY2F1c2UKLSAgLy8gTWFwSXRlcmF0b3I6On5NYXBJdGVyYXRvcigpIGFjY2Vzc2VzIGl0LiAgTm9ybWFsbHkgdGhpcyB3b3VsZCBiZSBvayBiZWNhdXNlCi0gIC8vIHRoZSByZWYgb24gY29udGFpbmVyIChhYm92ZSkgd291bGQgZ3VhcmFudGVlIG91dGxpdmUgc2VtYW50aWNzLiAgSG93ZXZlciBpbgotICAvLyB0aGUgY2FzZSBvZiBDbGVhckZpZWxkKCksIEluaXRpYWxpemVBbmRDb3B5VG9QYXJlbnRDb250YWluZXIoKSByZXNldHMgdGhlCi0gIC8vIG1lc3NhZ2UgcG9pbnRlciAoYW5kIHRoZSBvd25lcikgdG8gYSBkaWZmZXJlbnQgbWVzc2FnZSwgYSBjb3B5IG9mIHRoZQotICAvLyBvcmlnaW5hbC4gIEJ1dCBvdXIgaXRlcmF0b3Igc3RpbGwgcG9pbnRzIHRvIHRoZSBvcmlnaW5hbCwgd2hpY2ggY291bGQgbm93Ci0gIC8vIGdldCBkZWxldGVkIGJlZm9yZSB1cy4KLSAgLy8KLSAgLy8gVG8gcHJldmVudCB0aGlzLCB3ZSBlbnN1cmUgdGhhdCB0aGUgTWVzc2FnZSB3aWxsIGFsd2F5cyBzdGF5IGFsaXZlIGFzIGxvbmcKLSAgLy8gYXMgdGhpcyBpdGVyYXRvciBkb2VzLiAgVGhpcyBpcyBzb2xlbHkgZm9yIHRoZSBiZW5lZml0IG9mIHRoZSBNYXBJdGVyYXRvcgotICAvLyBkZXN0cnVjdG9yIC0tIHdlIHNob3VsZCBuZXZlciBhY3R1YWxseSBhY2Nlc3MgdGhlIGl0ZXJhdG9yIGluIHRoaXMgc3RhdGUKLSAgLy8gZXhjZXB0IHRvIGRlbGV0ZSBpdC4KLSAgc2hhcmVkX3B0cjxNZXNzYWdlPiBvd25lcjsKLQotICAvLyBUaGUgdmVyc2lvbiBvZiB0aGUgbWFwIHdoZW4gd2UgdG9vayB0aGUgaXRlcmF0b3IgdG8gaXQuCi0gIC8vCi0gIC8vIFdlIHN0b3JlIHRoaXMgc28gdGhhdCBpZiB0aGUgbWFwIGlzIG1vZGlmaWVkIGR1cmluZyBpdGVyYXRpb24gd2UgY2FuIHRocm93Ci0gIC8vIGFuIGVycm9yLgotICB1aW50NjQgdmVyc2lvbjsKLQotICAvLyBUcnVlIGlmIHRoZSBjb250YWluZXIgaXMgZW1wdHkuICBXZSBzaWduYWwgdGhpcyBzZXBhcmF0ZWx5IHRvIGF2b2lkIGNhbGxpbmcKLSAgLy8gYW55IG9mIHRoZSBpdGVyYXRpb24gbWV0aG9kcywgd2hpY2ggYXJlIG5vbi1jb25zdC4KLSAgYm9vbCBlbXB0eTsKLX07Ci0KLU1lc3NhZ2UqIE1hcENvbnRhaW5lcjo6R2V0TXV0YWJsZU1lc3NhZ2UoKSB7Ci0gIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShwYXJlbnQpOwotICByZXR1cm4gY29uc3RfY2FzdDxNZXNzYWdlKj4obWVzc2FnZSk7Ci19Ci0KLS8vIENvbnN1bWVzIGEgcmVmZXJlbmNlIG9uIHRoZSBQeXRob24gc3RyaW5nIG9iamVjdC4KLXN0YXRpYyBib29sIFB5U3RyaW5nVG9TVEwoUHlPYmplY3QqIHB5X3N0cmluZywgc3RyaW5nKiBzdGxfc3RyaW5nKSB7Ci0gIGNoYXIgKnZhbHVlOwotICBQeV9zc2l6ZV90IHZhbHVlX2xlbjsKLQotICBpZiAoIXB5X3N0cmluZykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUocHlfc3RyaW5nLCAmdmFsdWUsICZ2YWx1ZV9sZW4pIDwgMCkgewotICAgIFB5X0RFQ1JFRihweV9zdHJpbmcpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICBzdGxfc3RyaW5nLT5hc3NpZ24odmFsdWUsIHZhbHVlX2xlbik7Ci0gICAgUHlfREVDUkVGKHB5X3N0cmluZyk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgUHl0aG9uVG9NYXBLZXkoUHlPYmplY3QqIG9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcEtleSoga2V5KSB7Ci0gIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKG9iaiwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIGtleS0+U2V0SW50MzJWYWx1ZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UNjQob2JqLCB2YWx1ZSwgZmFsc2UpOwotICAgICAga2V5LT5TZXRJbnQ2NFZhbHVlKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKG9iaiwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIGtleS0+U2V0VUludDMyVmFsdWUodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UNjQob2JqLCB2YWx1ZSwgZmFsc2UpOwotICAgICAga2V5LT5TZXRVSW50NjRWYWx1ZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKG9iaiwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIGtleS0+U2V0Qm9vbFZhbHVlKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKLSAgICAgIHN0cmluZyBzdHI7Ci0gICAgICBpZiAoIVB5U3RyaW5nVG9TVEwoQ2hlY2tTdHJpbmcob2JqLCBmaWVsZF9kZXNjcmlwdG9yKSwgJnN0cikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAga2V5LT5TZXRTdHJpbmdWYWx1ZShzdHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJUeXBlICVkIGNhbm5vdCBiZSBhIG1hcCBrZXkiLAotICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIE1hcEtleVRvUHl0aG9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiBrZXkpIHsKLSAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoa2V5LkdldEludDMyVmFsdWUoKSk7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6Ci0gICAgICByZXR1cm4gUHlMb25nX0Zyb21Mb25nTG9uZyhrZXkuR2V0SW50NjRWYWx1ZSgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbVNpemVfdChrZXkuR2V0VUludDMyVmFsdWUoKSk7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgotICAgICAgcmV0dXJuIFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyhrZXkuR2V0VUludDY0VmFsdWUoKSk7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKLSAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoa2V5LkdldEJvb2xWYWx1ZSgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwga2V5LkdldFN0cmluZ1ZhbHVlKCkpOwotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJDb3VsZG4ndCBjb252ZXJ0IHR5cGUgJWQgdG8gdmFsdWUiLAotICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotLy8gVGhpcyBpcyBvbmx5IHVzZWQgZm9yIFNjYWxhck1hcCwgc28gd2UgZG9uJ3QgbmVlZCB0byBoYW5kbGUgdGhlCi0vLyBDUFBUWVBFX01FU1NBR0UgY2FzZS4KLVB5T2JqZWN0KiBNYXBWYWx1ZVJlZlRvUHl0aG9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcFZhbHVlUmVmKiB2YWx1ZSkgewotICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKLSAgICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyh2YWx1ZS0+R2V0SW50MzJWYWx1ZSgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKLSAgICAgIHJldHVybiBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlLT5HZXRJbnQ2NFZhbHVlKCkpOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKLSAgICAgIHJldHVybiBQeUludF9Gcm9tU2l6ZV90KHZhbHVlLT5HZXRVSW50MzJWYWx1ZSgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICByZXR1cm4gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbHVlLT5HZXRVSW50NjRWYWx1ZSgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKLSAgICAgIHJldHVybiBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUtPkdldEZsb2F0VmFsdWUoKSk7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuIFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZS0+R2V0RG91YmxlVmFsdWUoKSk7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKLSAgICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcodmFsdWUtPkdldEJvb2xWYWx1ZSgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwgdmFsdWUtPkdldFN0cmluZ1ZhbHVlKCkpOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06Ci0gICAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcodmFsdWUtPkdldEVudW1WYWx1ZSgpKTsKLSAgICBkZWZhdWx0OgotICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiQ291bGRuJ3QgY29udmVydCB0eXBlICVkIHRvIHZhbHVlIiwKLSAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLS8vIFRoaXMgaXMgb25seSB1c2VkIGZvciBTY2FsYXJNYXAsIHNvIHdlIGRvbid0IG5lZWQgdG8gaGFuZGxlIHRoZQotLy8gQ1BQVFlQRV9NRVNTQUdFIGNhc2UuCi1zdGF0aWMgYm9vbCBQeXRob25Ub01hcFZhbHVlUmVmKFB5T2JqZWN0KiBvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBhbGxvd191bmtub3duX2VudW1fdmFsdWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZVJlZiogdmFsdWVfcmVmKSB7Ci0gIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKG9iaiwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIHZhbHVlX3JlZi0+U2V0SW50MzJWYWx1ZSh2YWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UNjQob2JqLCB2YWx1ZSwgZmFsc2UpOwotICAgICAgdmFsdWVfcmVmLT5TZXRJbnQ2NFZhbHVlKHZhbHVlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKG9iaiwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIHZhbHVlX3JlZi0+U2V0VUludDMyVmFsdWUodmFsdWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UNjQob2JqLCB2YWx1ZSwgZmFsc2UpOwotICAgICAgdmFsdWVfcmVmLT5TZXRVSW50NjRWYWx1ZSh2YWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfRkxPQVQob2JqLCB2YWx1ZSwgZmFsc2UpOwotICAgICAgdmFsdWVfcmVmLT5TZXRGbG9hdFZhbHVlKHZhbHVlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfRE9VQkxFKG9iaiwgdmFsdWUsIGZhbHNlKTsKLSAgICAgIHZhbHVlX3JlZi0+U2V0RG91YmxlVmFsdWUodmFsdWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfQk9PTChvYmosIHZhbHVlLCBmYWxzZSk7Ci0gICAgICB2YWx1ZV9yZWYtPlNldEJvb2xWYWx1ZSh2YWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogewotICAgICAgc3RyaW5nIHN0cjsKLSAgICAgIGlmICghUHlTdHJpbmdUb1NUTChDaGVja1N0cmluZyhvYmosIGZpZWxkX2Rlc2NyaXB0b3IpLCAmc3RyKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICB2YWx1ZV9yZWYtPlNldFN0cmluZ1ZhbHVlKHN0cik7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihvYmosIHZhbHVlLCBmYWxzZSk7Ci0gICAgICBpZiAoYWxsb3dfdW5rbm93bl9lbnVtX3ZhbHVlcykgewotICAgICAgICB2YWx1ZV9yZWYtPlNldEVudW1WYWx1ZSh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9IGZpZWxkX2Rlc2NyaXB0b3ItPmVudW1fdHlwZSgpOwotICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KLSAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICAgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgdmFsdWVfcmVmLT5TZXRFbnVtVmFsdWUodmFsdWUpOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biBlbnVtIHZhbHVlOiAlZCIsIHZhbHVlKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiU2V0dGluZyB2YWx1ZSB0byBhIGZpZWxkIG9mIHVua25vd24gdHlwZSAlZCIsCi0gICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLy8gTWFwIG1ldGhvZHMgY29tbW9uIHRvIFNjYWxhck1hcCBhbmQgTWVzc2FnZU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIE1hcENvbnRhaW5lciogR2V0TWFwKFB5T2JqZWN0KiBvYmopIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TWFwQ29udGFpbmVyKj4ob2JqKTsKLX0KLQotUHlfc3NpemVfdCBNYXBSZWZsZWN0aW9uRnJpZW5kOjpMZW5ndGgoUHlPYmplY3QqIF9zZWxmKSB7Ci0gIE1hcENvbnRhaW5lciogc2VsZiA9IEdldE1hcChfc2VsZik7Ci0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICByZXR1cm4gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NYXBTaXplKCptZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKLX0KLQotUHlPYmplY3QqIENsZWFyKFB5T2JqZWN0KiBfc2VsZikgewotICBNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNYXAoX3NlbGYpOwotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+R2V0TXV0YWJsZU1lc3NhZ2UoKTsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKLQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotUHlPYmplY3QqIE1hcFJlZmxlY3Rpb25GcmllbmQ6OkNvbnRhaW5zKFB5T2JqZWN0KiBfc2VsZiwgUHlPYmplY3QqIGtleSkgewotICBNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNYXAoX3NlbGYpOwotCi0gIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBNYXBLZXkgbWFwX2tleTsKLQotICBpZiAoIVB5dGhvblRvTWFwS2V5KGtleSwgc2VsZi0+a2V5X2ZpZWxkX2Rlc2NyaXB0b3IsICZtYXBfa2V5KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKHJlZmxlY3Rpb24tPkNvbnRhaW5zTWFwS2V5KCptZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXkpKSB7Ci0gICAgUHlfUkVUVVJOX1RSVUU7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX0ZBTFNFOwotICB9Ci19Ci0KLS8vIEluaXRpYWxpemVzIHRoZSB1bmRlcmx5aW5nIE1lc3NhZ2Ugb2JqZWN0IG9mICJ0byIgc28gaXQgYmVjb21lcyBhIG5ldyBwYXJlbnQKLS8vIHJlcGVhdGVkIHNjYWxhciwgYW5kIGNvcGllcyBhbGwgdGhlIHZhbHVlcyBmcm9tICJmcm9tIiB0byBpdC4gQSBjaGlsZCBzY2FsYXIKLS8vIGNvbnRhaW5lciBjYW4gYmUgcmVsZWFzZWQgYnkgcGFzc2luZyBpdCBhcyBib3RoIGZyb20gYW5kIHRvIChlLmcuIG1ha2luZyBpdAotLy8gdGhlIHJlY2lwaWVudCBvZiB0aGUgbmV3IHBhcmVudCBtZXNzYWdlIGFuZCBjb3B5aW5nIHRoZSB2YWx1ZXMgZnJvbSBpdHNlbGYpLgotc3RhdGljIGludCBJbml0aWFsaXplQW5kQ29weVRvUGFyZW50Q29udGFpbmVyKE1hcENvbnRhaW5lciogZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBDb250YWluZXIqIHRvKSB7Ci0gIC8vIEZvciBub3cgd2UgcmVxdWlyZSBmcm9tID09IHRvLCByZS1ldmFsdWF0ZSBpZiB3ZSB3YW50IHRvIHN1cHBvcnQgZGVlcCBjb3B5Ci0gIC8vIGFzIGluIHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXIuY2MuCi0gIEdPT0dMRV9EQ0hFQ0soZnJvbSA9PSB0byk7Ci0gIE1lc3NhZ2UqIG5ld19tZXNzYWdlID0gZnJvbS0+bWVzc2FnZS0+TmV3KCk7Ci0KLSAgaWYgKE1hcFJlZmxlY3Rpb25GcmllbmQ6Okxlbmd0aChyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oZnJvbSkpID4gMCkgewotICAgIC8vIEEgc29tZXdoYXQgcm91bmRhYm91dCB3YXkgb2YgY29weWluZyBqdXN0IG9uZSBmaWVsZCBmcm9tIG9sZF9tZXNzYWdlIHRvCi0gICAgLy8gbmV3X21lc3NhZ2UuICBUaGlzIGlzIHRoZSBiZXN0IHdlIGNhbiBkbyB3aXRoIHdoYXQgUmVmbGVjdGlvbiBnaXZlcyB1cy4KLSAgICBNZXNzYWdlKiBtdXRhYmxlX29sZCA9IGZyb20tPkdldE11dGFibGVNZXNzYWdlKCk7Ci0gICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgICBmaWVsZHMucHVzaF9iYWNrKGZyb20tPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKLQotICAgIC8vIE1vdmUgdGhlIG1hcCBmaWVsZCBpbnRvIHRoZSBuZXcgbWVzc2FnZS4KLSAgICBtdXRhYmxlX29sZC0+R2V0UmVmbGVjdGlvbigpLT5Td2FwRmllbGRzKG11dGFibGVfb2xkLCBuZXdfbWVzc2FnZSwgZmllbGRzKTsKLQotICAgIC8vIElmL3doZW4gd2Ugc3VwcG9ydCBmcm9tICE9IHRvLCB0aGlzIHdpbGwgYmUgcmVxdWlyZWQgYWxzbyB0byBjb3B5IHRoZQotICAgIC8vIG1hcCBmaWVsZCBiYWNrIGludG8gdGhlIGV4aXN0aW5nIG1lc3NhZ2U6Ci0gICAgLy8gbXV0YWJsZV9vbGQtPk1lcmdlRnJvbSgqbmV3X21lc3NhZ2UpOwotICB9Ci0KLSAgLy8gSWYgZnJvbSA9PSB0byB0aGlzIGNvdWxkIGRlbGV0ZSBvbGRfbWVzc2FnZS4KLSAgdG8tPm93bmVyLnJlc2V0KG5ld19tZXNzYWdlKTsKLQotICB0by0+cGFyZW50ID0gTlVMTDsKLSAgdG8tPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yID0gZnJvbS0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIHRvLT5tZXNzYWdlID0gbmV3X21lc3NhZ2U7Ci0KLSAgLy8gSW52YWxpZGF0ZSBpdGVyYXRvcnMsIHNpbmNlIHRoZXkgcG9pbnQgdG8gdGhlIG9sZCBjb3B5IG9mIHRoZSBmaWVsZC4KLSAgdG8tPnZlcnNpb24rKzsKLQotICByZXR1cm4gMDsKLX0KLQotaW50IE1hcENvbnRhaW5lcjo6UmVsZWFzZSgpIHsKLSAgcmV0dXJuIEluaXRpYWxpemVBbmRDb3B5VG9QYXJlbnRDb250YWluZXIodGhpcywgdGhpcyk7Ci19Ci0KLQotLy8gU2NhbGFyTWFwIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotUHlPYmplY3QgKk5ld1NjYWxhck1hcENvbnRhaW5lcigKLSAgICBDTWVzc2FnZSogcGFyZW50LCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yKSB7Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UocGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsIHBhcmVudC0+bWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gIFNjb3BlZFB5T2JqZWN0UHRyIG9iaihQeVR5cGVfR2VuZXJpY0FsbG9jKAotICAgICAgICByZWludGVycHJldF9jYXN0PFB5VHlwZU9iamVjdCAqPihTY2FsYXJNYXBDb250YWluZXJfVHlwZSksIDApKTsKLSNlbHNlCi0gIFNjb3BlZFB5T2JqZWN0UHRyIG9iaihQeVR5cGVfR2VuZXJpY0FsbG9jKCZTY2FsYXJNYXBDb250YWluZXJfVHlwZSwgMCkpOwotI2VuZGlmCi0gIGlmIChvYmouZ2V0KCkgPT0gTlVMTCkgewotICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgY29udGFpbmVyLiIpOwotICB9Ci0KLSAgTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWFwKG9iai5nZXQoKSk7Ci0KLSAgc2VsZi0+bWVzc2FnZSA9IHBhcmVudC0+bWVzc2FnZTsKLSAgc2VsZi0+cGFyZW50ID0gcGFyZW50OwotICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciA9IHBhcmVudF9maWVsZF9kZXNjcmlwdG9yOwotICBzZWxmLT5vd25lciA9IHBhcmVudC0+b3duZXI7Ci0gIHNlbGYtPnZlcnNpb24gPSAwOwotCi0gIHNlbGYtPmtleV9maWVsZF9kZXNjcmlwdG9yID0KLSAgICAgIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+RmluZEZpZWxkQnlOYW1lKCJrZXkiKTsKLSAgc2VsZi0+dmFsdWVfZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgICBwYXJlbnRfZmllbGRfZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPkZpbmRGaWVsZEJ5TmFtZSgidmFsdWUiKTsKLQotICBpZiAoc2VsZi0+a2V5X2ZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCB8fAotICAgICAgc2VsZi0+dmFsdWVfZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNYXAgZW50cnkgZGVzY3JpcHRvciBkaWQgbm90IGhhdmUga2V5L3ZhbHVlIGZpZWxkcyIpOwotICB9Ci0KLSAgcmV0dXJuIG9iai5yZWxlYXNlKCk7Ci19Ci0KLVB5T2JqZWN0KiBNYXBSZWZsZWN0aW9uRnJpZW5kOjpTY2FsYXJNYXBHZXRJdGVtKFB5T2JqZWN0KiBfc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBrZXkpIHsKLSAgTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWFwKF9zZWxmKTsKLQotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+R2V0TXV0YWJsZU1lc3NhZ2UoKTsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgTWFwS2V5IG1hcF9rZXk7Ci0gIE1hcFZhbHVlUmVmIHZhbHVlOwotCi0gIGlmICghUHl0aG9uVG9NYXBLZXkoa2V5LCBzZWxmLT5rZXlfZmllbGRfZGVzY3JpcHRvciwgJm1hcF9rZXkpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAocmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSwgJnZhbHVlKSkgewotICAgIHNlbGYtPnZlcnNpb24rKzsKLSAgfQotCi0gIHJldHVybiBNYXBWYWx1ZVJlZlRvUHl0aG9uKHNlbGYtPnZhbHVlX2ZpZWxkX2Rlc2NyaXB0b3IsICZ2YWx1ZSk7Ci19Ci0KLWludCBNYXBSZWZsZWN0aW9uRnJpZW5kOjpTY2FsYXJNYXBTZXRJdGVtKFB5T2JqZWN0KiBfc2VsZiwgUHlPYmplY3QqIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB2KSB7Ci0gIE1hcENvbnRhaW5lciogc2VsZiA9IEdldE1hcChfc2VsZik7Ci0KLSAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPkdldE11dGFibGVNZXNzYWdlKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIE1hcEtleSBtYXBfa2V5OwotICBNYXBWYWx1ZVJlZiB2YWx1ZTsKLQotICBpZiAoIVB5dGhvblRvTWFwS2V5KGtleSwgc2VsZi0+a2V5X2ZpZWxkX2Rlc2NyaXB0b3IsICZtYXBfa2V5KSkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHNlbGYtPnZlcnNpb24rKzsKLQotICBpZiAodikgewotICAgIC8vIFNldCBpdGVtIHRvIHYuCi0gICAgcmVmbGVjdGlvbi0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZShtZXNzYWdlLCBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZ2YWx1ZSk7Ci0KLSAgICByZXR1cm4gUHl0aG9uVG9NYXBWYWx1ZVJlZih2LCBzZWxmLT52YWx1ZV9maWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPlN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSwgJnZhbHVlKQotICAgICAgICAgICAgICAgPyAwCi0gICAgICAgICAgICAgICA6IC0xOwotICB9IGVsc2UgewotICAgIC8vIERlbGV0ZSBrZXkgZnJvbSBtYXAuCi0gICAgaWYgKHJlZmxlY3Rpb24tPkRlbGV0ZU1hcFZhbHVlKG1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXBfa2V5KSkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIktleSBub3QgcHJlc2VudCBpbiBtYXAiKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIFB5T2JqZWN0KiBTY2FsYXJNYXBHZXQoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIFB5T2JqZWN0KiBrZXk7Ci0gIFB5T2JqZWN0KiBkZWZhdWx0X3ZhbHVlID0gTlVMTDsKLSAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyIsICZrZXksICZkZWZhdWx0X3ZhbHVlKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFNjb3BlZFB5T2JqZWN0UHRyIGlzX3ByZXNlbnQoTWFwUmVmbGVjdGlvbkZyaWVuZDo6Q29udGFpbnMoc2VsZiwga2V5KSk7Ci0gIGlmIChpc19wcmVzZW50LmdldCgpID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChQeU9iamVjdF9Jc1RydWUoaXNfcHJlc2VudC5nZXQoKSkpIHsKLSAgICByZXR1cm4gTWFwUmVmbGVjdGlvbkZyaWVuZDo6U2NhbGFyTWFwR2V0SXRlbShzZWxmLCBrZXkpOwotICB9IGVsc2UgewotICAgIGlmIChkZWZhdWx0X3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgIFB5X0lOQ1JFRihkZWZhdWx0X3ZhbHVlKTsKLSAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICAgIH0gZWxzZSB7Ci0gICAgICBQeV9SRVRVUk5fTk9ORTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgU2NhbGFyTWFwRGVhbGxvYyhQeU9iamVjdCogX3NlbGYpIHsKLSAgTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWFwKF9zZWxmKTsKLSAgc2VsZi0+b3duZXIucmVzZXQoKTsKLSAgUHlfVFlQRShfc2VsZiktPnRwX2ZyZWUoX3NlbGYpOwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgU2NhbGFyTWFwTWV0aG9kc1tdID0gewotICB7ICJfX2NvbnRhaW5zX18iLCBNYXBSZWZsZWN0aW9uRnJpZW5kOjpDb250YWlucywgTUVUSF9PLAotICAgICJUZXN0cyB3aGV0aGVyIGEga2V5IGlzIGEgbWVtYmVyIG9mIHRoZSBtYXAuIiB9LAotICB7ICJjbGVhciIsIChQeUNGdW5jdGlvbilDbGVhciwgTUVUSF9OT0FSR1MsCi0gICAgIlJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIG1hcC4iIH0sCi0gIHsgImdldCIsIFNjYWxhck1hcEdldCwgTUVUSF9WQVJBUkdTLAotICAgICJHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpZiBwcmVzZW50LCBvciBvdGhlcndpc2UgYSBkZWZhdWx0IiB9LAotICAvKgotICB7ICJfX2RlZXBjb3B5X18iLCAoUHlDRnVuY3Rpb24pRGVlcENvcHksIE1FVEhfVkFSQVJHUywKLSAgICAiTWFrZXMgYSBkZWVwIGNvcHkgb2YgdGhlIGNsYXNzLiIgfSwKLSAgeyAiX19yZWR1Y2VfXyIsIChQeUNGdW5jdGlvbilSZWR1Y2UsIE1FVEhfTk9BUkdTLAotICAgICJPdXRwdXRzIHBpY2tsYWJsZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgcmVwZWF0ZWQgZmllbGQuIiB9LAotICAqLwotICB7TlVMTCwgTlVMTH0sCi19OwotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gIHN0YXRpYyBQeVR5cGVfU2xvdCBTY2FsYXJNYXBDb250YWluZXJfVHlwZV9zbG90c1tdID0gewotICAgICAge1B5X3RwX2RlYWxsb2MsICh2b2lkICopU2NhbGFyTWFwRGVhbGxvY30sCi0gICAgICB7UHlfbXBfbGVuZ3RoLCAodm9pZCAqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Okxlbmd0aH0sCi0gICAgICB7UHlfbXBfc3Vic2NyaXB0LCAodm9pZCAqKU1hcFJlZmxlY3Rpb25GcmllbmQ6OlNjYWxhck1hcEdldEl0ZW19LAotICAgICAge1B5X21wX2Fzc19zdWJzY3JpcHQsICh2b2lkICopTWFwUmVmbGVjdGlvbkZyaWVuZDo6U2NhbGFyTWFwU2V0SXRlbX0sCi0gICAgICB7UHlfdHBfbWV0aG9kcywgKHZvaWQgKilTY2FsYXJNYXBNZXRob2RzfSwKLSAgICAgIHtQeV90cF9pdGVyLCAodm9pZCAqKU1hcFJlZmxlY3Rpb25GcmllbmQ6OkdldEl0ZXJhdG9yfSwKLSAgICAgIHswLCAwfSwKLSAgfTsKLQotICBQeVR5cGVfU3BlYyBTY2FsYXJNYXBDb250YWluZXJfVHlwZV9zcGVjID0gewotICAgICAgRlVMTF9NT0RVTEVfTkFNRSAiLlNjYWxhck1hcENvbnRhaW5lciIsCi0gICAgICBzaXplb2YoTWFwQ29udGFpbmVyKSwKLSAgICAgIDAsCi0gICAgICBQeV9UUEZMQUdTX0RFRkFVTFQsCi0gICAgICBTY2FsYXJNYXBDb250YWluZXJfVHlwZV9zbG90cwotICB9OwotICBQeU9iamVjdCAqU2NhbGFyTWFwQ29udGFpbmVyX1R5cGU7Ci0jZWxzZQotICBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBTY2FsYXJNYXBNYXBwaW5nTWV0aG9kcyA9IHsKLSAgICBNYXBSZWZsZWN0aW9uRnJpZW5kOjpMZW5ndGgsICAgICAgICAgICAgIC8vIG1wX2xlbmd0aAotICAgIE1hcFJlZmxlY3Rpb25GcmllbmQ6OlNjYWxhck1hcEdldEl0ZW0sICAgLy8gbXBfc3Vic2NyaXB0Ci0gICAgTWFwUmVmbGVjdGlvbkZyaWVuZDo6U2NhbGFyTWFwU2V0SXRlbSwgICAvLyBtcF9hc3Nfc3Vic2NyaXB0Ci0gIH07Ci0KLSAgUHlUeXBlT2JqZWN0IFNjYWxhck1hcENvbnRhaW5lcl9UeXBlID0gewotICAgIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gICAgRlVMTF9NT0RVTEVfTkFNRSAiLlNjYWxhck1hcENvbnRhaW5lciIsICAvLyAgdHBfbmFtZQotICAgIHNpemVvZihNYXBDb250YWluZXIpLCAgICAgICAgICAgICAgICAvLyAgdHBfYmFzaWNzaXplCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQotICAgIFNjYWxhck1hcERlYWxsb2MsICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVhbGxvYwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHIKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3JlcHIKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX251bWJlcgotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKLSAgICAmU2NhbGFyTWFwTWFwcGluZ01ldGhvZHMsICAgICAgICAgICAgLy8gIHRwX2FzX21hcHBpbmcKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2hhc2gKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3N0cgotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0YXR0cm8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gIHRwX2ZsYWdzCi0gICAgIkEgc2NhbGFyIG1hcCBjb250YWluZXIiLCAgICAgICAgICAgIC8vICB0cF9kb2MKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jbGVhcgotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0Ci0gICAgTWFwUmVmbGVjdGlvbkZyaWVuZDo6R2V0SXRlcmF0b3IsICAgIC8vICB0cF9pdGVyCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAotICAgIFNjYWxhck1hcE1ldGhvZHMsICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWV0aG9kcwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWVtYmVycwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdG9mZnNldAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAotICB9OwotI2VuZGlmCi0KLQotLy8gTWVzc2FnZU1hcCAvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KLQotc3RhdGljIE1lc3NhZ2VNYXBDb250YWluZXIqIEdldE1lc3NhZ2VNYXAoUHlPYmplY3QqIG9iaikgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlTWFwQ29udGFpbmVyKj4ob2JqKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRDTWVzc2FnZShNZXNzYWdlTWFwQ29udGFpbmVyKiBzZWxmLCBNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gIC8vIEdldCBvciBjcmVhdGUgdGhlIENNZXNzYWdlIG9iamVjdCBjb3JyZXNwb25kaW5nIHRvIHRoaXMgbWVzc2FnZS4KLSAgU2NvcGVkUHlPYmplY3RQdHIga2V5KFB5TG9uZ19Gcm9tVm9pZFB0cihtZXNzYWdlKSk7Ci0gIFB5T2JqZWN0KiByZXQgPSBQeURpY3RfR2V0SXRlbShzZWxmLT5tZXNzYWdlX2RpY3QsIGtleS5nZXQoKSk7Ci0KLSAgaWYgKHJldCA9PSBOVUxMKSB7Ci0gICAgQ01lc3NhZ2UqIGNtc2cgPSBjbWVzc2FnZTo6TmV3RW1wdHlNZXNzYWdlKHNlbGYtPm1lc3NhZ2VfY2xhc3MpOwotICAgIHJldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihjbXNnKTsKLQotICAgIGlmIChjbXNnID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBjbXNnLT5vd25lciA9IHNlbGYtPm93bmVyOwotICAgIGNtc2ctPm1lc3NhZ2UgPSBtZXNzYWdlOwotICAgIGNtc2ctPnBhcmVudCA9IHNlbGYtPnBhcmVudDsKLQotICAgIGlmIChQeURpY3RfU2V0SXRlbShzZWxmLT5tZXNzYWdlX2RpY3QsIGtleS5nZXQoKSwgcmV0KSA8IDApIHsKLSAgICAgIFB5X0RFQ1JFRihyZXQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9IGVsc2UgewotICAgIFB5X0lOQ1JFRihyZXQpOwotICB9Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotUHlPYmplY3QqIE5ld01lc3NhZ2VNYXBDb250YWluZXIoCi0gICAgQ01lc3NhZ2UqIHBhcmVudCwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGRfZGVzY3JpcHRvciwKLSAgICBDTWVzc2FnZUNsYXNzKiBtZXNzYWdlX2NsYXNzKSB7Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UocGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsIHBhcmVudC0+bWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gIFB5T2JqZWN0KiBvYmogPSBQeVR5cGVfR2VuZXJpY0FsbG9jKAotICAgICAgICByZWludGVycHJldF9jYXN0PFB5VHlwZU9iamVjdCAqPihNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGUpLCAwKTsKLSNlbHNlCi0gIFB5T2JqZWN0KiBvYmogPSBQeVR5cGVfR2VuZXJpY0FsbG9jKCZNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGUsIDApOwotI2VuZGlmCi0gIGlmIChvYmogPT0gTlVMTCkgewotICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfUnVudGltZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIkNvdWxkIG5vdCBhbGxvY2F0ZSBuZXcgY29udGFpbmVyLiIpOwotICB9Ci0KLSAgTWVzc2FnZU1hcENvbnRhaW5lciogc2VsZiA9IEdldE1lc3NhZ2VNYXAob2JqKTsKLQotICBzZWxmLT5tZXNzYWdlID0gcGFyZW50LT5tZXNzYWdlOwotICBzZWxmLT5wYXJlbnQgPSBwYXJlbnQ7Ci0gIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yID0gcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIHNlbGYtPm93bmVyID0gcGFyZW50LT5vd25lcjsKLSAgc2VsZi0+dmVyc2lvbiA9IDA7Ci0KLSAgc2VsZi0+a2V5X2ZpZWxkX2Rlc2NyaXB0b3IgPQotICAgICAgcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5GaW5kRmllbGRCeU5hbWUoImtleSIpOwotICBzZWxmLT52YWx1ZV9maWVsZF9kZXNjcmlwdG9yID0KLSAgICAgIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+RmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOwotCi0gIHNlbGYtPm1lc3NhZ2VfZGljdCA9IFB5RGljdF9OZXcoKTsKLSAgaWYgKHNlbGYtPm1lc3NhZ2VfZGljdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIFB5RXJyX0Zvcm1hdChQeUV4Y19SdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiQ291bGQgbm90IGFsbG9jYXRlIG1lc3NhZ2UgZGljdC4iKTsKLSAgfQotCi0gIFB5X0lOQ1JFRihtZXNzYWdlX2NsYXNzKTsKLSAgc2VsZi0+bWVzc2FnZV9jbGFzcyA9IG1lc3NhZ2VfY2xhc3M7Ci0KLSAgaWYgKHNlbGYtPmtleV9maWVsZF9kZXNjcmlwdG9yID09IE5VTEwgfHwKLSAgICAgIHNlbGYtPnZhbHVlX2ZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIFB5X0RFQ1JFRihvYmopOwotICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiTWFwIGVudHJ5IGRlc2NyaXB0b3IgZGlkIG5vdCBoYXZlIGtleS92YWx1ZSBmaWVsZHMiKTsKLSAgfQotCi0gIHJldHVybiBvYmo7Ci19Ci0KLWludCBNYXBSZWZsZWN0aW9uRnJpZW5kOjpNZXNzYWdlTWFwU2V0SXRlbShQeU9iamVjdCogX3NlbGYsIFB5T2JqZWN0KiBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHYpIHsKLSAgaWYgKHYpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgIkRpcmVjdCBhc3NpZ25tZW50IG9mIHN1Ym1lc3NhZ2Ugbm90IGFsbG93ZWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICAvLyBOb3cgd2Uga25vdyB0aGF0IHRoaXMgaXMgYSBkZWxldGUsIG5vdCBhIHNldC4KLQotICBNZXNzYWdlTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWVzc2FnZU1hcChfc2VsZik7Ci0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5HZXRNdXRhYmxlTWVzc2FnZSgpOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBNYXBLZXkgbWFwX2tleTsKLSAgTWFwVmFsdWVSZWYgdmFsdWU7Ci0KLSAgc2VsZi0+dmVyc2lvbisrOwotCi0gIGlmICghUHl0aG9uVG9NYXBLZXkoa2V5LCBzZWxmLT5rZXlfZmllbGRfZGVzY3JpcHRvciwgJm1hcF9rZXkpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gRGVsZXRlIGtleSBmcm9tIG1hcC4KLSAgaWYgKHJlZmxlY3Rpb24tPkRlbGV0ZU1hcFZhbHVlKG1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwX2tleSkpIHsKLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJLZXkgbm90IHByZXNlbnQgaW4gbWFwIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci19Ci0KLVB5T2JqZWN0KiBNYXBSZWZsZWN0aW9uRnJpZW5kOjpNZXNzYWdlTWFwR2V0SXRlbShQeU9iamVjdCogX3NlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIGtleSkgewotICBNZXNzYWdlTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWVzc2FnZU1hcChfc2VsZik7Ci0KLSAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPkdldE11dGFibGVNZXNzYWdlKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIE1hcEtleSBtYXBfa2V5OwotICBNYXBWYWx1ZVJlZiB2YWx1ZTsKLQotICBpZiAoIVB5dGhvblRvTWFwS2V5KGtleSwgc2VsZi0+a2V5X2ZpZWxkX2Rlc2NyaXB0b3IsICZtYXBfa2V5KSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKHJlZmxlY3Rpb24tPkluc2VydE9yTG9va3VwTWFwVmFsdWUobWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcF9rZXksICZ2YWx1ZSkpIHsKLSAgICBzZWxmLT52ZXJzaW9uKys7Ci0gIH0KLQotICByZXR1cm4gR2V0Q01lc3NhZ2Uoc2VsZiwgdmFsdWUuTXV0YWJsZU1lc3NhZ2VWYWx1ZSgpKTsKLX0KLQotUHlPYmplY3QqIE1lc3NhZ2VNYXBHZXQoUHlPYmplY3QqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIFB5T2JqZWN0KiBrZXk7Ci0gIFB5T2JqZWN0KiBkZWZhdWx0X3ZhbHVlID0gTlVMTDsKLSAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgIk98TyIsICZrZXksICZkZWZhdWx0X3ZhbHVlKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFNjb3BlZFB5T2JqZWN0UHRyIGlzX3ByZXNlbnQoTWFwUmVmbGVjdGlvbkZyaWVuZDo6Q29udGFpbnMoc2VsZiwga2V5KSk7Ci0gIGlmIChpc19wcmVzZW50LmdldCgpID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChQeU9iamVjdF9Jc1RydWUoaXNfcHJlc2VudC5nZXQoKSkpIHsKLSAgICByZXR1cm4gTWFwUmVmbGVjdGlvbkZyaWVuZDo6TWVzc2FnZU1hcEdldEl0ZW0oc2VsZiwga2V5KTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZGVmYXVsdF92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICBQeV9JTkNSRUYoZGVmYXVsdF92YWx1ZSk7Ci0gICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgUHlfUkVUVVJOX05PTkU7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIE1lc3NhZ2VNYXBEZWFsbG9jKFB5T2JqZWN0KiBfc2VsZikgewotICBNZXNzYWdlTWFwQ29udGFpbmVyKiBzZWxmID0gR2V0TWVzc2FnZU1hcChfc2VsZik7Ci0gIHNlbGYtPm93bmVyLnJlc2V0KCk7Ci0gIFB5X0RFQ1JFRihzZWxmLT5tZXNzYWdlX2RpY3QpOwotICBQeV9ERUNSRUYoc2VsZi0+bWVzc2FnZV9jbGFzcyk7Ci0gIFB5X1RZUEUoX3NlbGYpLT50cF9mcmVlKF9zZWxmKTsKLX0KLQotc3RhdGljIFB5TWV0aG9kRGVmIE1lc3NhZ2VNYXBNZXRob2RzW10gPSB7Ci0gIHsgIl9fY29udGFpbnNfXyIsIChQeUNGdW5jdGlvbilNYXBSZWZsZWN0aW9uRnJpZW5kOjpDb250YWlucywgTUVUSF9PLAotICAgICJUZXN0cyB3aGV0aGVyIHRoZSBtYXAgY29udGFpbnMgdGhpcyBlbGVtZW50LiJ9LAotICB7ICJjbGVhciIsIChQeUNGdW5jdGlvbilDbGVhciwgTUVUSF9OT0FSR1MsCi0gICAgIlJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20gdGhlIG1hcC4ifSwKLSAgeyAiZ2V0IiwgTWVzc2FnZU1hcEdldCwgTUVUSF9WQVJBUkdTLAotICAgICJHZXRzIHRoZSB2YWx1ZSBmb3IgdGhlIGdpdmVuIGtleSBpZiBwcmVzZW50LCBvciBvdGhlcndpc2UgYSBkZWZhdWx0IiB9LAotICB7ICJnZXRfb3JfY3JlYXRlIiwgTWFwUmVmbGVjdGlvbkZyaWVuZDo6TWVzc2FnZU1hcEdldEl0ZW0sIE1FVEhfTywKLSAgICAiQWxpYXMgZm9yIGdldGl0ZW0sIHVzZWZ1bCB0byBtYWtlIGV4cGxpY2l0IHRoYXQgdGhlIG1hcCBpcyBtdXRhdGVkLiIgfSwKLSAgLyoKLSAgeyAiX19kZWVwY29weV9fIiwgKFB5Q0Z1bmN0aW9uKURlZXBDb3B5LCBNRVRIX1ZBUkFSR1MsCi0gICAgIk1ha2VzIGEgZGVlcCBjb3B5IG9mIHRoZSBjbGFzcy4iIH0sCi0gIHsgIl9fcmVkdWNlX18iLCAoUHlDRnVuY3Rpb24pUmVkdWNlLCBNRVRIX05PQVJHUywKLSAgICAiT3V0cHV0cyBwaWNrbGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIHJlcGVhdGVkIGZpZWxkLiIgfSwKLSAgKi8KLSAge05VTEwsIE5VTEx9LAotfTsKLQotI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMwotICBzdGF0aWMgUHlUeXBlX1Nsb3QgTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlX3Nsb3RzW10gPSB7Ci0gICAgICB7UHlfdHBfZGVhbGxvYywgKHZvaWQgKilNZXNzYWdlTWFwRGVhbGxvY30sCi0gICAgICB7UHlfbXBfbGVuZ3RoLCAodm9pZCAqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Okxlbmd0aH0sCi0gICAgICB7UHlfbXBfc3Vic2NyaXB0LCAodm9pZCAqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Ok1lc3NhZ2VNYXBHZXRJdGVtfSwKLSAgICAgIHtQeV9tcF9hc3Nfc3Vic2NyaXB0LCAodm9pZCAqKU1hcFJlZmxlY3Rpb25GcmllbmQ6Ok1lc3NhZ2VNYXBTZXRJdGVtfSwKLSAgICAgIHtQeV90cF9tZXRob2RzLCAodm9pZCAqKU1lc3NhZ2VNYXBNZXRob2RzfSwKLSAgICAgIHtQeV90cF9pdGVyLCAodm9pZCAqKU1hcFJlZmxlY3Rpb25GcmllbmQ6OkdldEl0ZXJhdG9yfSwKLSAgICAgIHswLCAwfQotICB9OwotCi0gIFB5VHlwZV9TcGVjIE1lc3NhZ2VNYXBDb250YWluZXJfVHlwZV9zcGVjID0gewotICAgICAgRlVMTF9NT0RVTEVfTkFNRSAiLk1lc3NhZ2VNYXBDb250YWluZXIiLAotICAgICAgc2l6ZW9mKE1lc3NhZ2VNYXBDb250YWluZXIpLAotICAgICAgMCwKLSAgICAgIFB5X1RQRkxBR1NfREVGQVVMVCwKLSAgICAgIE1lc3NhZ2VNYXBDb250YWluZXJfVHlwZV9zbG90cwotICB9OwotCi0gIFB5T2JqZWN0ICpNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGU7Ci0jZWxzZQotICBzdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBNZXNzYWdlTWFwTWFwcGluZ01ldGhvZHMgPSB7Ci0gICAgTWFwUmVmbGVjdGlvbkZyaWVuZDo6TGVuZ3RoLCAgICAgICAgICAgICAgLy8gbXBfbGVuZ3RoCi0gICAgTWFwUmVmbGVjdGlvbkZyaWVuZDo6TWVzc2FnZU1hcEdldEl0ZW0sICAgLy8gbXBfc3Vic2NyaXB0Ci0gICAgTWFwUmVmbGVjdGlvbkZyaWVuZDo6TWVzc2FnZU1hcFNldEl0ZW0sICAgLy8gbXBfYXNzX3N1YnNjcmlwdAotICB9OwotCi0gIFB5VHlwZU9iamVjdCBNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGUgPSB7Ci0gICAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgICBGVUxMX01PRFVMRV9OQU1FICIuTWVzc2FnZU1hcENvbnRhaW5lciIsICAvLyAgdHBfbmFtZQotICAgIHNpemVvZihNZXNzYWdlTWFwQ29udGFpbmVyKSwgICAgICAgICAvLyAgdHBfYmFzaWNzaXplCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQotICAgIE1lc3NhZ2VNYXBEZWFsbG9jLCAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVhbGxvYwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHIKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3JlcHIKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX251bWJlcgotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKLSAgICAmTWVzc2FnZU1hcE1hcHBpbmdNZXRob2RzLCAgICAgICAgICAgLy8gIHRwX2FzX21hcHBpbmcKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2hhc2gKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3N0cgotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0YXR0cm8KLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKLSAgICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gIHRwX2ZsYWdzCi0gICAgIkEgbWFwIGNvbnRhaW5lciBmb3IgbWVzc2FnZSIsICAgICAgIC8vICB0cF9kb2MKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jbGVhcgotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0Ci0gICAgTWFwUmVmbGVjdGlvbkZyaWVuZDo6R2V0SXRlcmF0b3IsICAgIC8vICB0cF9pdGVyCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAotICAgIE1lc3NhZ2VNYXBNZXRob2RzLCAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWV0aG9kcwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWVtYmVycwotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCi0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0Ci0gICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKLSAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdG9mZnNldAotICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaW5pdAotICB9OwotI2VuZGlmCi0KLS8vIE1hcEl0ZXJhdG9yIC8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCi0KLXN0YXRpYyBNYXBJdGVyYXRvciogR2V0SXRlcihQeU9iamVjdCogb2JqKSB7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PE1hcEl0ZXJhdG9yKj4ob2JqKTsKLX0KLQotUHlPYmplY3QqIE1hcFJlZmxlY3Rpb25GcmllbmQ6OkdldEl0ZXJhdG9yKFB5T2JqZWN0ICpfc2VsZikgewotICBNYXBDb250YWluZXIqIHNlbGYgPSBHZXRNYXAoX3NlbGYpOwotCi0gIFNjb3BlZFB5T2JqZWN0UHRyIG9iaihQeVR5cGVfR2VuZXJpY0FsbG9jKCZNYXBJdGVyYXRvcl9UeXBlLCAwKSk7Ci0gIGlmIChvYmogPT0gTlVMTCkgewotICAgIHJldHVybiBQeUVycl9Gb3JtYXQoUHlFeGNfS2V5RXJyb3IsICJDb3VsZCBub3QgYWxsb2NhdGUgaXRlcmF0b3IiKTsKLSAgfQotCi0gIE1hcEl0ZXJhdG9yKiBpdGVyID0gR2V0SXRlcihvYmouZ2V0KCkpOwotCi0gIFB5X0lOQ1JFRihzZWxmKTsKLSAgaXRlci0+Y29udGFpbmVyID0gc2VsZjsKLSAgaXRlci0+dmVyc2lvbiA9IHNlbGYtPnZlcnNpb247Ci0gIGl0ZXItPm93bmVyID0gc2VsZi0+b3duZXI7Ci0KLSAgaWYgKE1hcFJlZmxlY3Rpb25GcmllbmQ6Okxlbmd0aChfc2VsZikgPiAwKSB7Ci0gICAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPkdldE11dGFibGVNZXNzYWdlKCk7Ci0gICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICAgIGl0ZXItPml0ZXIucmVzZXQobmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWFwSXRlcmF0b3IoCi0gICAgICAgIHJlZmxlY3Rpb24tPk1hcEJlZ2luKG1lc3NhZ2UsIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKSkpOwotICB9Ci0KLSAgcmV0dXJuIG9iai5yZWxlYXNlKCk7Ci19Ci0KLVB5T2JqZWN0KiBNYXBSZWZsZWN0aW9uRnJpZW5kOjpJdGVyTmV4dChQeU9iamVjdCogX3NlbGYpIHsKLSAgTWFwSXRlcmF0b3IqIHNlbGYgPSBHZXRJdGVyKF9zZWxmKTsKLQotICAvLyBUaGlzIHdvbid0IGNhdGNoIG11dGF0aW9ucyB0byB0aGUgbWFwIHBlcmZvcm1lZCBieSBNZXJnZUZyb20oKTsgbm8gZWFzeSB3YXkKLSAgLy8gdG8gYWRkcmVzcyB0aGF0LgotICBpZiAoc2VsZi0+dmVyc2lvbiAhPSBzZWxmLT5jb250YWluZXItPnZlcnNpb24pIHsKLSAgICByZXR1cm4gUHlFcnJfRm9ybWF0KFB5RXhjX1J1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJNYXAgbW9kaWZpZWQgZHVyaW5nIGl0ZXJhdGlvbi4iKTsKLSAgfQotCi0gIGlmIChzZWxmLT5pdGVyLmdldCgpID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5jb250YWluZXItPkdldE11dGFibGVNZXNzYWdlKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgaWYgKCpzZWxmLT5pdGVyID09Ci0gICAgICByZWZsZWN0aW9uLT5NYXBFbmQobWVzc2FnZSwgc2VsZi0+Y29udGFpbmVyLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcikpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFB5T2JqZWN0KiByZXQgPSBNYXBLZXlUb1B5dGhvbihzZWxmLT5jb250YWluZXItPmtleV9maWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+aXRlci0+R2V0S2V5KCkpOwotCi0gICsrKCpzZWxmLT5pdGVyKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBEZWFsbG9jTWFwSXRlcmF0b3IoUHlPYmplY3QqIF9zZWxmKSB7Ci0gIE1hcEl0ZXJhdG9yKiBzZWxmID0gR2V0SXRlcihfc2VsZik7Ci0gIHNlbGYtPml0ZXIucmVzZXQoKTsKLSAgc2VsZi0+b3duZXIucmVzZXQoKTsKLSAgUHlfWERFQ1JFRihzZWxmLT5jb250YWluZXIpOwotICBQeV9UWVBFKF9zZWxmKS0+dHBfZnJlZShfc2VsZik7Ci19Ci0KLVB5VHlwZU9iamVjdCBNYXBJdGVyYXRvcl9UeXBlID0gewotICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotICBGVUxMX01PRFVMRV9OQU1FICIuTWFwSXRlcmF0b3IiLCAgICAgLy8gIHRwX25hbWUKLSAgc2l6ZW9mKE1hcEl0ZXJhdG9yKSwgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNpY3NpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQotICBEZWFsbG9jTWFwSXRlcmF0b3IsICAgICAgICAgICAgICAgICAgLy8gIHRwX2RlYWxsb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9wcmludAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3JlcHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19udW1iZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19zZXF1ZW5jZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX21hcHBpbmcKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9oYXNoCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2FsbAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3N0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKLSAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgIC8vICB0cF9mbGFncwotICAiQSBzY2FsYXIgbWFwIGl0ZXJhdG9yIiwgICAgICAgICAgICAgLy8gIHRwX2RvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2xlYXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yaWNoY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3dlYWtsaXN0b2Zmc2V0Ci0gIFB5T2JqZWN0X1NlbGZJdGVyLCAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcgotICBNYXBSZWZsZWN0aW9uRnJpZW5kOjpJdGVyTmV4dCwgICAgICAgLy8gIHRwX2l0ZXJuZXh0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWV0aG9kcwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21lbWJlcnMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX2dldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pbml0Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWFwX2NvbnRhaW5lci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tYXBfY29udGFpbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZiZDY3MTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tYXBfY29udGFpbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNDIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfTUFQX0NPTlRBSU5FUl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfTUFQX0NPTlRBSU5FUl9IX18KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLWNsYXNzIE1lc3NhZ2U7Ci0KLSNpZmRlZiBfU0hBUkVEX1BUUl9ICi11c2luZyBzdGQ6OnNoYXJlZF9wdHI7Ci0jZWxzZQotdXNpbmcgaW50ZXJuYWw6OnNoYXJlZF9wdHI7Ci0jZW5kaWYKLQotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLXN0cnVjdCBDTWVzc2FnZTsKLXN0cnVjdCBDTWVzc2FnZUNsYXNzOwotCi0vLyBUaGlzIHN0cnVjdCBpcyB1c2VkIGRpcmVjdGx5IGZvciBTY2FsYXJNYXAsIGFuZCBpcyB0aGUgYmFzZSBjbGFzcyBvZgotLy8gTWVzc2FnZU1hcENvbnRhaW5lciwgd2hpY2ggaXMgdXNlZCBmb3IgTWVzc2FnZU1hcC4KLXN0cnVjdCBNYXBDb250YWluZXIgewotICBQeU9iamVjdF9IRUFEOwotCi0gIC8vIFRoaXMgaXMgdGhlIHRvcC1sZXZlbCBDKysgTWVzc2FnZSBvYmplY3QgdGhhdCBvd25zIHRoZSB3aG9sZQotICAvLyBwcm90byB0cmVlLiAgRXZlcnkgUHl0aG9uIE1hcENvbnRhaW5lciBob2xkcyBhCi0gIC8vIHJlZmVyZW5jZSB0byBpdCBpbiBvcmRlciB0byBrZWVwIGl0IGFsaXZlIGFzIGxvbmcgYXMgdGhlcmUncyBhCi0gIC8vIFB5dGhvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFueSBwYXJ0IG9mIHRoZSB0cmVlLgotICBzaGFyZWRfcHRyPE1lc3NhZ2U+IG93bmVyOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIEMrKyBNZXNzYWdlIHRoYXQgY29udGFpbnMgdGhpcyBjb250YWluZXIuICBUaGUKLSAgLy8gTWFwQ29udGFpbmVyIGRvZXMgbm90IG93biB0aGlzIHBvaW50ZXIuCi0gIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2U7Ci0KLSAgLy8gVXNlIHRvIGdldCBhIG11dGFibGUgbWVzc2FnZSB3aGVuIG5lY2Vzc2FyeS4KLSAgTWVzc2FnZSogR2V0TXV0YWJsZU1lc3NhZ2UoKTsKLQotICAvLyBXZWFrIHJlZmVyZW5jZSB0byBhIHBhcmVudCBDTWVzc2FnZSBvYmplY3QgKGkuZS4gbWF5IGJlIE5VTEwuKQotICAvLwotICAvLyBVc2VkIHRvIG1ha2Ugc3VyZSBhbGwgYW5jZXN0b3JzIGFyZSBhbHNvIG11dGFibGUgd2hlbiBmaXJzdAotICAvLyBtb2RpZnlpbmcgdGhlIGNvbnRhaW5lci4KLSAgQ01lc3NhZ2UqIHBhcmVudDsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yIHRoYXQgZGVzY3JpYmVzIHRoaXMKLSAgLy8gZmllbGQuICBVc2VkIHRvZ2V0aGVyIHdpdGggdGhlIHBhcmVudCdzIG1lc3NhZ2Ugd2hlbiBtYWtpbmcgYQotICAvLyBkZWZhdWx0IG1lc3NhZ2UgaW5zdGFuY2UgbXV0YWJsZS4KLSAgLy8gVGhlIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbC4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZmllbGRfZGVzY3JpcHRvcjsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWx1ZV9maWVsZF9kZXNjcmlwdG9yOwotCi0gIC8vIFdlIGJ1bXAgdGhpcyB3aGVuZXZlciB3ZSBwZXJmb3JtIGEgbXV0YXRpb24sIHRvIGludmFsaWRhdGUgZXhpc3RpbmcKLSAgLy8gaXRlcmF0b3JzLgotICB1aW50NjQgdmVyc2lvbjsKLQotICAvLyBSZWxlYXNlcyB0aGUgbWVzc2FnZXMgaW4gdGhlIGNvbnRhaW5lciB0byBhIG5ldyBtZXNzYWdlLgotICAvLwotICAvLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLSAgaW50IFJlbGVhc2UoKTsKLQotICAvLyBTZXQgdGhlIG93bmVyIGZpZWxkIG9mIHNlbGYgYW5kIGFueSBjaGlsZHJlbiBvZiBzZWxmLgotICB2b2lkIFNldE93bmVyKGNvbnN0IHNoYXJlZF9wdHI8TWVzc2FnZT4mIG5ld19vd25lcikgewotICAgIG93bmVyID0gbmV3X293bmVyOwotICB9Ci19OwotCi1zdHJ1Y3QgTWVzc2FnZU1hcENvbnRhaW5lciA6IHB1YmxpYyBNYXBDb250YWluZXIgewotICAvLyBUaGUgdHlwZSB1c2VkIHRvIGNyZWF0ZSBuZXcgY2hpbGQgbWVzc2FnZXMuCi0gIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3M7Ci0KLSAgLy8gQSBkaWN0IG1hcHBpbmcgTWVzc2FnZSogLT4gQ01lc3NhZ2UuCi0gIFB5T2JqZWN0KiBtZXNzYWdlX2RpY3Q7Ci19OwotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gIGV4dGVybiBQeU9iamVjdCAqTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlOwotICBleHRlcm4gUHlUeXBlX1NwZWMgTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlX3NwZWM7Ci0gIGV4dGVybiBQeU9iamVjdCAqU2NhbGFyTWFwQ29udGFpbmVyX1R5cGU7Ci0gIGV4dGVybiBQeVR5cGVfU3BlYyBTY2FsYXJNYXBDb250YWluZXJfVHlwZV9zcGVjOwotI2Vsc2UKLSAgZXh0ZXJuIFB5VHlwZU9iamVjdCBNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGU7Ci0gIGV4dGVybiBQeVR5cGVPYmplY3QgU2NhbGFyTWFwQ29udGFpbmVyX1R5cGU7Ci0jZW5kaWYKLQotZXh0ZXJuIFB5VHlwZU9iamVjdCBNYXBJdGVyYXRvcl9UeXBlOyAgLy8gQm90aCBtYXAgdHlwZXMgdXNlIHRoZSBzYW1lIGl0ZXJhdG9yLgotCi0vLyBCdWlsZHMgYSBNYXBDb250YWluZXIgb2JqZWN0LCBmcm9tIGEgcGFyZW50IG1lc3NhZ2UgYW5kIGEKLS8vIGZpZWxkIGRlc2NyaXB0b3IuCi1leHRlcm4gUHlPYmplY3QqIE5ld1NjYWxhck1hcENvbnRhaW5lcigKLSAgICBDTWVzc2FnZSogcGFyZW50LCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKLQotLy8gQnVpbGRzIGEgTWVzc2FnZU1hcCBvYmplY3QsIGZyb20gYSBwYXJlbnQgbWVzc2FnZSBhbmQgYQotLy8gZmllbGQgZGVzY3JpcHRvci4KLWV4dGVybiBQeU9iamVjdCogTmV3TWVzc2FnZU1hcENvbnRhaW5lcigKLSAgICBDTWVzc2FnZSogcGFyZW50LCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yLAotICAgIENNZXNzYWdlQ2xhc3MqIG1lc3NhZ2VfY2xhc3MpOwotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NQVBfQ09OVEFJTkVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2MxNTFmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxMzMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogYW51cmFhZ0Bnb29nbGUuY29tIChBbnVyYWFnIEFncmF3YWwpCi0vLyBBdXRob3I6IHRpYmVsbEBnb29nbGUuY29tIChKb2hhbiBUaWJlbGwpCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cnVjdG1lbWJlci5oPiAgLy8gQSBQeXRob24gaGVhZGVyIGZpbGUuCi0KLSNpZm5kZWYgUHlWYXJPYmplY3RfSEVBRF9JTklUCi0jZGVmaW5lIFB5VmFyT2JqZWN0X0hFQURfSU5JVCh0eXBlLCBzaXplKSBQeU9iamVjdF9IRUFEX0lOSVQodHlwZSkgc2l6ZSwKLSNlbmRpZgotI2lmbmRlZiBQeV9UWVBFCi0jZGVmaW5lIFB5X1RZUEUob2IpICgoKFB5T2JqZWN0Kikob2IpKS0+b2JfdHlwZSkKLSNlbmRpZgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2V4dGVuc2lvbl9kaWN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9tYXBfY29udGFpbmVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gICNkZWZpbmUgUHlJbnRfQ2hlY2sgUHlMb25nX0NoZWNrCi0gICNkZWZpbmUgUHlJbnRfQXNMb25nIFB5TG9uZ19Bc0xvbmcKLSAgI2RlZmluZSBQeUludF9Gcm9tTG9uZyBQeUxvbmdfRnJvbUxvbmcKLSAgI2RlZmluZSBQeUludF9Gcm9tU2l6ZV90IFB5TG9uZ19Gcm9tU2l6ZV90Ci0gICNkZWZpbmUgUHlTdHJpbmdfQ2hlY2sgUHlVbmljb2RlX0NoZWNrCi0gICNkZWZpbmUgUHlTdHJpbmdfRnJvbVN0cmluZyBQeVVuaWNvZGVfRnJvbVN0cmluZwotICAjZGVmaW5lIFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplIFB5VW5pY29kZV9Gcm9tU3RyaW5nQW5kU2l6ZQotICAjaWYgUFlfVkVSU0lPTl9IRVggPCAweDAzMDMwMDAwCi0gICAgI2Vycm9yICJQeXRob24gMy4wIC0gMy4yIGFyZSBub3Qgc3VwcG9ydGVkLiIKLSAgI2Vsc2UKLSAgI2RlZmluZSBQeVN0cmluZ19Bc1N0cmluZyhvYikgXAotICAgIChQeVVuaWNvZGVfQ2hlY2sob2IpPyBQeVVuaWNvZGVfQXNVVEY4KG9iKTogUHlCeXRlc19Bc1N0cmluZyhvYikpCi0gICNkZWZpbmUgUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKG9iLCBjaGFycHAsIHNpemVwKSBcCi0gICAgKFB5VW5pY29kZV9DaGVjayhvYik/IFwKLSAgICAgICAoKCooY2hhcnBwKSA9IFB5VW5pY29kZV9Bc1VURjhBbmRTaXplKG9iLCAoc2l6ZXApKSkgPT0gTlVMTD8gLTE6IDApOiBcCi0gICAgICAgUHlCeXRlc19Bc1N0cmluZ0FuZFNpemUob2IsIChjaGFycHApLCAoc2l6ZXApKSkKLSAgI2VuZGlmCi0jZW5kaWYKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLXN0YXRpYyBQeU9iamVjdCoga0RFU0NSSVBUT1I7Ci1zdGF0aWMgUHlPYmplY3QqIGtfZXh0ZW5zaW9uc19ieV9uYW1lOwotc3RhdGljIFB5T2JqZWN0KiBrX2V4dGVuc2lvbnNfYnlfbnVtYmVyOwotUHlPYmplY3QqIEVudW1UeXBlV3JhcHBlcl9jbGFzczsKLXN0YXRpYyBQeU9iamVjdCogUHl0aG9uTWVzc2FnZV9jbGFzczsKLXN0YXRpYyBQeU9iamVjdCoga0VtcHR5V2Vha3JlZjsKLXN0YXRpYyBQeU9iamVjdCogV0tUX2NsYXNzZXMgPSBOVUxMOwotCi1uYW1lc3BhY2UgbWVzc2FnZV9tZXRhIHsKLQotc3RhdGljIGludCBJbnNlcnRFbXB0eVdlYWtyZWYoUHlUeXBlT2JqZWN0KiBiYXNlKTsKLQotLy8gQWRkIHRoZSBudW1iZXIgb2YgYSBmaWVsZCBkZXNjcmlwdG9yIHRvIHRoZSBjb250YWluaW5nIG1lc3NhZ2UgY2xhc3MuCi0vLyBFcXVpdmFsZW50IHRvOgotLy8gICBfY2xzLjxmaWVsZD5fRklFTERfTlVNQkVSID0gPG51bWJlcj4KLXN0YXRpYyBib29sIEFkZEZpZWxkTnVtYmVyVG9DbGFzcygKLSAgICBQeU9iamVjdCogY2xzLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKLSAgc3RyaW5nIGNvbnN0YW50X25hbWUgPSBmaWVsZF9kZXNjcmlwdG9yLT5uYW1lKCkgKyAiX0ZJRUxEX05VTUJFUiI7Ci0gIFVwcGVyU3RyaW5nKCZjb25zdGFudF9uYW1lKTsKLSAgU2NvcGVkUHlPYmplY3RQdHIgYXR0cl9uYW1lKFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKAotICAgICAgY29uc3RhbnRfbmFtZS5jX3N0cigpLCBjb25zdGFudF9uYW1lLnNpemUoKSkpOwotICBpZiAoYXR0cl9uYW1lID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgU2NvcGVkUHlPYmplY3RQdHIgbnVtYmVyKFB5SW50X0Zyb21Mb25nKGZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpKSk7Ci0gIGlmIChudW1iZXIgPT0gTlVMTCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoUHlPYmplY3RfU2V0QXR0cihjbHMsIGF0dHJfbmFtZS5nZXQoKSwgbnVtYmVyLmdldCgpKSA9PSAtMSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vLyBGaW5hbGl6ZSB0aGUgY3JlYXRpb24gb2YgdGhlIE1lc3NhZ2UgY2xhc3MuCi1zdGF0aWMgaW50IEFkZERlc2NyaXB0b3JzKFB5T2JqZWN0KiBjbHMsIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgLy8gSWYgdGhlcmUgYXJlIGV4dGVuc2lvbl9yYW5nZXMsIHRoZSBtZXNzYWdlIGlzICJleHRlbmRhYmxlIiwgYW5kIGV4dGVuc2lvbgotICAvLyBjbGFzc2VzIHdpbGwgcmVnaXN0ZXIgdGhlbXNlbHZlcyBpbiB0aGlzIGNsYXNzLgotICBpZiAoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgU2NvcGVkUHlPYmplY3RQdHIgYnlfbmFtZShQeURpY3RfTmV3KCkpOwotICAgIGlmIChQeU9iamVjdF9TZXRBdHRyKGNscywga19leHRlbnNpb25zX2J5X25hbWUsIGJ5X25hbWUuZ2V0KCkpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBTY29wZWRQeU9iamVjdFB0ciBieV9udW1iZXIoUHlEaWN0X05ldygpKTsKLSAgICBpZiAoUHlPYmplY3RfU2V0QXR0cihjbHMsIGtfZXh0ZW5zaW9uc19ieV9udW1iZXIsIGJ5X251bWJlci5nZXQoKSkgPCAwKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9yIGVhY2ggZmllbGQgc2V0OiBjbHMuPGZpZWxkPl9GSUVMRF9OVU1CRVIgPSA8bnVtYmVyPgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7ICsraSkgewotICAgIGlmICghQWRkRmllbGROdW1iZXJUb0NsYXNzKGNscywgZGVzY3JpcHRvci0+ZmllbGQoaSkpKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9yIGVhY2ggZW51bSBzZXQgY2xzLjxlbnVtIG5hbWU+ID0gRW51bVR5cGVXcmFwcGVyKDxlbnVtIGRlc2NyaXB0b3I+KS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9IGRlc2NyaXB0b3ItPmVudW1fdHlwZShpKTsKLSAgICBTY29wZWRQeU9iamVjdFB0ciBlbnVtX3R5cGUoCi0gICAgICAgIFB5RW51bURlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZW51bV9kZXNjcmlwdG9yKSk7Ci0gICAgaWYgKGVudW1fdHlwZSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgIH0KLSAgICAvLyBBZGQgd3JhcHBlZCBlbnVtIHR5cGUgdG8gbWVzc2FnZSBjbGFzcy4KLSAgICBTY29wZWRQeU9iamVjdFB0ciB3cmFwcGVkKFB5T2JqZWN0X0NhbGxGdW5jdGlvbk9iakFyZ3MoCi0gICAgICAgIEVudW1UeXBlV3JhcHBlcl9jbGFzcywgZW51bV90eXBlLmdldCgpLCBOVUxMKSk7Ci0gICAgaWYgKHdyYXBwZWQgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgICBpZiAoUHlPYmplY3RfU2V0QXR0clN0cmluZygKLSAgICAgICAgICAgIGNscywgZW51bV9kZXNjcmlwdG9yLT5uYW1lKCkuY19zdHIoKSwgd3JhcHBlZC5nZXQoKSkgPT0gLTEpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvLyBGb3IgZWFjaCBlbnVtIHZhbHVlIGFkZCBjbHMuPG5hbWU+ID0gPG51bWJlcj4KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudW1fZGVzY3JpcHRvci0+dmFsdWVfY291bnQoKTsgKytqKSB7Ci0gICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgPQotICAgICAgICAgIGVudW1fZGVzY3JpcHRvci0+dmFsdWUoaik7Ci0gICAgICBTY29wZWRQeU9iamVjdFB0ciB2YWx1ZV9udW1iZXIoUHlJbnRfRnJvbUxvbmcoCi0gICAgICAgICAgZW51bV92YWx1ZV9kZXNjcmlwdG9yLT5udW1iZXIoKSkpOwotICAgICAgaWYgKHZhbHVlX251bWJlciA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKGNscywgZW51bV92YWx1ZV9kZXNjcmlwdG9yLT5uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX251bWJlci5nZXQoKSkgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIEZvciBlYWNoIGV4dGVuc2lvbiBzZXQgY2xzLjxleHRlbnNpb24gbmFtZT4gPSA8ZXh0ZW5zaW9uIGRlc2NyaXB0b3I+LgotICAvLwotICAvLyBFeHRlbnNpb24gZGVzY3JpcHRvcnMgY29tZSBmcm9tCi0gIC8vIDxtZXNzYWdlIGRlc2NyaXB0b3I+LmV4dGVuc2lvbnNfYnlfbmFtZVtuYW1lXQotICAvLyB3aGljaCB3YXMgZGVmaW5lZCBwcmV2aW91c2x5LgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvci0+ZXh0ZW5zaW9uKGkpOwotICAgIFNjb3BlZFB5T2JqZWN0UHRyIGV4dGVuc2lvbl9maWVsZChQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihmaWVsZCkpOwotICAgIGlmIChleHRlbnNpb25fZmllbGQgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLQotICAgIC8vIEFkZCB0aGUgZXh0ZW5zaW9uIGZpZWxkIHRvIHRoZSBtZXNzYWdlIGNsYXNzLgotICAgIGlmIChQeU9iamVjdF9TZXRBdHRyU3RyaW5nKAotICAgICAgICAgICAgY2xzLCBmaWVsZC0+bmFtZSgpLmNfc3RyKCksIGV4dGVuc2lvbl9maWVsZC5nZXQoKSkgPT0gLTEpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICAvLyBGb3IgZWFjaCBleHRlbnNpb24gc2V0IGNscy48ZXh0ZW5zaW9uIG5hbWU+X0ZJRUxEX05VTUJFUiA9IDxudW1iZXI+LgotICAgIGlmICghQWRkRmllbGROdW1iZXJUb0NsYXNzKGNscywgZmllbGQpKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTmV3KFB5VHlwZU9iamVjdCogdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBhcmdzLCBQeU9iamVjdCoga3dhcmdzKSB7Ci0gIHN0YXRpYyBjaGFyICprd2xpc3RbXSA9IHsibmFtZSIsICJiYXNlcyIsICJkaWN0IiwgMH07Ci0gIFB5T2JqZWN0ICpiYXNlcywgKmRpY3Q7Ci0gIGNvbnN0IGNoYXIqIG5hbWU7Ci0KLSAgLy8gQ2hlY2sgYXJndW1lbnRzOiAobmFtZSwgYmFzZXMsIGRpY3QpCi0gIGlmICghUHlBcmdfUGFyc2VUdXBsZUFuZEtleXdvcmRzKGFyZ3MsIGt3YXJncywgInNPIU8hOnR5cGUiLCBrd2xpc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmUHlUdXBsZV9UeXBlLCAmYmFzZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZQeURpY3RfVHlwZSwgJmRpY3QpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDaGVjayBiYXNlczogb25seSAoKSwgb3IgKG1lc3NhZ2UuTWVzc2FnZSwpIGFyZSBhbGxvd2VkCi0gIGlmICghKFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpID09IDAgfHwKLSAgICAgICAgKFB5VHVwbGVfR0VUX1NJWkUoYmFzZXMpID09IDEgJiYKLSAgICAgICAgIFB5VHVwbGVfR0VUX0lURU0oYmFzZXMsIDApID09IFB5dGhvbk1lc3NhZ2VfY2xhc3MpKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJBIE1lc3NhZ2UgY2xhc3MgY2FuIG9ubHkgaW5oZXJpdCBmcm9tIE1lc3NhZ2UiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIENoZWNrIGRpY3RbJ0RFU0NSSVBUT1InXQotICBQeU9iamVjdCogcHlfZGVzY3JpcHRvciA9IFB5RGljdF9HZXRJdGVtKGRpY3QsIGtERVNDUklQVE9SKTsKLSAgaWYgKHB5X2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNZXNzYWdlIGNsYXNzIGhhcyBubyBERVNDUklQVE9SIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socHlfZGVzY3JpcHRvciwgJlB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZSkpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLCAiRXhwZWN0ZWQgYSBtZXNzYWdlIERlc2NyaXB0b3IsIGdvdCAlcyIsCi0gICAgICAgICAgICAgICAgIHB5X2Rlc2NyaXB0b3ItPm9iX3R5cGUtPnRwX25hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gQnVpbGQgdGhlIGFyZ3VtZW50cyB0byB0aGUgYmFzZSBtZXRhY2xhc3MuCi0gIC8vIFdlIGNoYW5nZSB0aGUgX19iYXNlc19fIGNsYXNzZXMuCi0gIFNjb3BlZFB5T2JqZWN0UHRyIG5ld19hcmdzOwotICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3IgPQotICAgICAgUHlNZXNzYWdlRGVzY3JpcHRvcl9Bc0Rlc2NyaXB0b3IocHlfZGVzY3JpcHRvcik7Ci0gIGlmIChtZXNzYWdlX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgaWYgKFdLVF9jbGFzc2VzID09IE5VTEwpIHsKLSAgICBTY29wZWRQeU9iamVjdFB0ciB3ZWxsX2tub3duX3R5cGVzKFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgKLSAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53ZWxsX2tub3duX3R5cGVzIikpOwotICAgIEdPT0dMRV9EQ0hFQ0sod2VsbF9rbm93bl90eXBlcyAhPSBOVUxMKTsKLQotICAgIFdLVF9jbGFzc2VzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyh3ZWxsX2tub3duX3R5cGVzLmdldCgpLCAiV0tUQkFTRVMiKTsKLSAgICBHT09HTEVfRENIRUNLKFdLVF9jbGFzc2VzICE9IE5VTEwpOwotICB9Ci0KLSAgUHlPYmplY3QqIHdlbGxfa25vd25fY2xhc3MgPSBQeURpY3RfR2V0SXRlbVN0cmluZygKLSAgICAgIFdLVF9jbGFzc2VzLCBtZXNzYWdlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICBpZiAod2VsbF9rbm93bl9jbGFzcyA9PSBOVUxMKSB7Ci0gICAgbmV3X2FyZ3MucmVzZXQoUHlfQnVpbGRWYWx1ZSgicyhPTylPIiwgbmFtZSwgJkNNZXNzYWdlX1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeXRob25NZXNzYWdlX2NsYXNzLCBkaWN0KSk7Ci0gIH0gZWxzZSB7Ci0gICAgbmV3X2FyZ3MucmVzZXQoUHlfQnVpbGRWYWx1ZSgicyhPT08pTyIsIG5hbWUsICZDTWVzc2FnZV9UeXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHl0aG9uTWVzc2FnZV9jbGFzcywgd2VsbF9rbm93bl9jbGFzcywgZGljdCkpOwotICB9Ci0KLSAgaWYgKG5ld19hcmdzID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICAvLyBDYWxsIHRoZSBiYXNlIG1ldGFjbGFzcy4KLSAgU2NvcGVkUHlPYmplY3RQdHIgcmVzdWx0KFB5VHlwZV9UeXBlLnRwX25ldyh0eXBlLCBuZXdfYXJncy5nZXQoKSwgTlVMTCkpOwotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBDTWVzc2FnZUNsYXNzKiBuZXd0eXBlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZUNsYXNzKj4ocmVzdWx0LmdldCgpKTsKLQotICAvLyBJbnNlcnQgdGhlIGVtcHR5IHdlYWtyZWYgaW50byB0aGUgYmFzZSBjbGFzc2VzLgotICBpZiAoSW5zZXJ0RW1wdHlXZWFrcmVmKAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlUeXBlT2JqZWN0Kj4oUHl0aG9uTWVzc2FnZV9jbGFzcykpIDwgMCB8fAotICAgICAgSW5zZXJ0RW1wdHlXZWFrcmVmKCZDTWVzc2FnZV9UeXBlKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIENhY2hlIHRoZSBkZXNjcmlwdG9yLCBib3RoIGFzIFB5dGhvbiBvYmplY3QgYW5kIGFzIEMrKyBwb2ludGVyLgotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0KLSAgICAgIFB5TWVzc2FnZURlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKHB5X2Rlc2NyaXB0b3IpOwotICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlfSU5DUkVGKHB5X2Rlc2NyaXB0b3IpOwotICBuZXd0eXBlLT5weV9tZXNzYWdlX2Rlc2NyaXB0b3IgPSBweV9kZXNjcmlwdG9yOwotICBuZXd0eXBlLT5tZXNzYWdlX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAvLyBUT0RPKGFtYXVyeWZhKTogRG9uJ3QgYWx3YXlzIHVzZSB0aGUgY2Fub25pY2FsIHBvb2wgb2YgdGhlIGRlc2NyaXB0b3IsCi0gIC8vIHVzZSB0aGUgTWVzc2FnZUZhY3Rvcnkgb3B0aW9uYWxseSBwYXNzZWQgaW4gdGhlIGNsYXNzIGRpY3QuCi0gIG5ld3R5cGUtPnB5X2Rlc2NyaXB0b3JfcG9vbCA9IEdldERlc2NyaXB0b3JQb29sX0Zyb21Qb29sKAotICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5wb29sKCkpOwotICBpZiAobmV3dHlwZS0+cHlfZGVzY3JpcHRvcl9wb29sID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9JTkNSRUYobmV3dHlwZS0+cHlfZGVzY3JpcHRvcl9wb29sKTsKLQotICAvLyBBZGQgdGhlIG1lc3NhZ2UgdG8gdGhlIERlc2NyaXB0b3JQb29sLgotICBpZiAoY2Rlc2NyaXB0b3JfcG9vbDo6UmVnaXN0ZXJNZXNzYWdlQ2xhc3MobmV3dHlwZS0+cHlfZGVzY3JpcHRvcl9wb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgbmV3dHlwZSkgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDb250aW51ZSB3aXRoIHR5cGUgaW5pdGlhbGl6YXRpb246IGFkZCBvdGhlciBkZXNjcmlwdG9ycywgZW51bSB2YWx1ZXMuLi4KLSAgaWYgKEFkZERlc2NyaXB0b3JzKHJlc3VsdC5nZXQoKSwgZGVzY3JpcHRvcikgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdC5yZWxlYXNlKCk7Ci19Ci0KLXN0YXRpYyB2b2lkIERlYWxsb2MoQ01lc3NhZ2VDbGFzcyAqc2VsZikgewotICBQeV9ERUNSRUYoc2VsZi0+cHlfbWVzc2FnZV9kZXNjcmlwdG9yKTsKLSAgUHlfREVDUkVGKHNlbGYtPnB5X2Rlc2NyaXB0b3JfcG9vbCk7Ci0gIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKLX0KLQotCi0vLyBUaGlzIGZ1bmN0aW9uIGluc2VydHMgYW5kIGVtcHR5IHdlYWtyZWYgYXQgdGhlIGVuZCBvZiB0aGUgbGlzdCBvZgotLy8gc3ViY2xhc3NlcyBmb3IgdGhlIG1haW4gcHJvdG9jb2wgYnVmZmVyIE1lc3NhZ2UgY2xhc3MuCi0vLwotLy8gVGhpcyBlbGltaW5hdGVzIGEgTyhuXjIpIGJlaGF2aW91ciBpbiB0aGUgaW50ZXJuYWwgYWRkX3N1YmNsYXNzCi0vLyByb3V0aW5lLgotc3RhdGljIGludCBJbnNlcnRFbXB0eVdlYWtyZWYoUHlUeXBlT2JqZWN0ICpiYXNlX3R5cGUpIHsKLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLSAgLy8gUHl0aG9uIDMuNCBoYXMgYWxyZWFkeSBpbmNsdWRlZCB0aGUgZml4IGZvciB0aGUgaXNzdWUgdGhhdCB0aGlzCi0gIC8vIGhhY2sgYWRkcmVzc2VzLiBGb3IgZnVydGhlciBiYWNrZ3JvdW5kIGFuZCB0aGUgZml4IHBsZWFzZSBzZWUKLSAgLy8gaHR0cHM6Ly9idWdzLnB5dGhvbi5vcmcvaXNzdWUxNzkzNi4KLSAgcmV0dXJuIDA7Ci0jZWxzZQotICBQeU9iamVjdCAqc3ViY2xhc3NlcyA9IGJhc2VfdHlwZS0+dHBfc3ViY2xhc3NlczsKLSAgaWYgKHN1YmNsYXNzZXMgJiYgUHlMaXN0X0NoZWNrRXhhY3Qoc3ViY2xhc3NlcykpIHsKLSAgICByZXR1cm4gUHlMaXN0X0FwcGVuZChzdWJjbGFzc2VzLCBrRW1wdHlXZWFrcmVmKTsKLSAgfQotICByZXR1cm4gMDsKLSNlbmRpZiAgLy8gUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBtZXNzYWdlX21ldGEKLQotUHlUeXBlT2JqZWN0IENNZXNzYWdlQ2xhc3NfVHlwZSA9IHsKLSAgUHlWYXJPYmplY3RfSEVBRF9JTklUKCZQeVR5cGVfVHlwZSwgMCkKLSAgRlVMTF9NT0RVTEVfTkFNRSAiLk1lc3NhZ2VNZXRhIiwgICAgIC8vIHRwX25hbWUKLSAgc2l6ZW9mKENNZXNzYWdlQ2xhc3MpLCAgICAgICAgICAgICAgIC8vIHRwX2Jhc2ljc2l6ZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlbXNpemUKLSAgKGRlc3RydWN0b3IpbWVzc2FnZV9tZXRhOjpEZWFsbG9jLCAgIC8vIHRwX2RlYWxsb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3ByaW50Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19udW1iZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19tYXBwaW5nCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9oYXNoCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2dldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsICAvLyB0cF9mbGFncwotICAiVGhlIG1ldGFjbGFzcyBvZiBQcm90b2NvbE1lc3NhZ2VzIiwgIC8vIHRwX2RvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZXRob2RzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Jhc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX2dldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3Jfc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pbml0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hbGxvYwotICBtZXNzYWdlX21ldGE6Ok5ldywgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3Ci19OwotCi1zdGF0aWMgQ01lc3NhZ2VDbGFzcyogQ2hlY2tNZXNzYWdlQ2xhc3MoUHlUeXBlT2JqZWN0KiBjbHMpIHsKLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soY2xzLCAmQ01lc3NhZ2VDbGFzc19UeXBlKSkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJDbGFzcyAlcyBpcyBub3QgYSBNZXNzYWdlIiwgY2xzLT50cF9uYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZUNsYXNzKj4oY2xzKTsKLX0KLQotc3RhdGljIGNvbnN0IERlc2NyaXB0b3IqIEdldE1lc3NhZ2VEZXNjcmlwdG9yKFB5VHlwZU9iamVjdCogY2xzKSB7Ci0gIENNZXNzYWdlQ2xhc3MqIHR5cGUgPSBDaGVja01lc3NhZ2VDbGFzcyhjbHMpOwotICBpZiAodHlwZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHR5cGUtPm1lc3NhZ2VfZGVzY3JpcHRvcjsKLX0KLQotLy8gRm9yd2FyZCBkZWNsYXJhdGlvbnMKLW5hbWVzcGFjZSBjbWVzc2FnZSB7Ci1pbnQgSW50ZXJuYWxSZWxlYXNlRmllbGRCeURlc2NyaXB0b3IoCi0gICAgQ01lc3NhZ2UqIHNlbGYsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAotICAgIFB5T2JqZWN0KiBjb21wb3NpdGVfZmllbGQpOwotfSAgLy8gbmFtZXNwYWNlIGNtZXNzYWdlCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVmlzaXRpbmcgdGhlIGNvbXBvc2l0ZSBjaGlsZHJlbiBvZiBhIENNZXNzYWdlCi0KLXN0cnVjdCBDaGlsZFZpc2l0b3IgewotICAvLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLSAgaW50IFZpc2l0UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIGNvbnRhaW5lcikgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCi0gIGludCBWaXNpdFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBjb250YWluZXIpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIC8vIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgotICBpbnQgVmlzaXRDTWVzc2FnZShDTWVzc2FnZSogY21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgewotICAgIHJldHVybiAwOwotICB9Ci19OwotCi0vLyBBcHBseSBhIGZ1bmN0aW9uIHRvIGEgY29tcG9zaXRlIGZpZWxkLiAgRG9lcyBub3RoaW5nIGlmIGNoaWxkIGlzIG9mCi0vLyBub24tY29tcG9zaXRlIHR5cGUuCi10ZW1wbGF0ZTxjbGFzcyBWaXNpdG9yPgotc3RhdGljIGludCBWaXNpdENvbXBvc2l0ZUZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogY2hpbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVmlzaXRvciB2aXNpdG9yKSB7Ci0gIGlmIChkZXNjcmlwdG9yLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQpIHsKLSAgICBpZiAoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgaWYgKGRlc2NyaXB0b3ItPmlzX21hcCgpKSB7Ci0gICAgICAgIE1hcENvbnRhaW5lciogY29udGFpbmVyID0gcmVpbnRlcnByZXRfY2FzdDxNYXBDb250YWluZXIqPihjaGlsZCk7Ci0gICAgICAgIGlmICh2aXNpdG9yLlZpc2l0TWFwQ29udGFpbmVyKGNvbnRhaW5lcikgPT0gLTEpIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBjb250YWluZXIgPQotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihjaGlsZCk7Ci0gICAgICAgIGlmICh2aXNpdG9yLlZpc2l0UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIoY29udGFpbmVyKSA9PSAtMSkKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBjb250YWluZXIgPQotICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKj4oY2hpbGQpOwotICAgICAgaWYgKHZpc2l0b3IuVmlzaXRSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihjb250YWluZXIpID09IC0xKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9IGVsc2UgaWYgKGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICBDTWVzc2FnZSogY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihjaGlsZCk7Ci0gICAgaWYgKHZpc2l0b3IuVmlzaXRDTWVzc2FnZShjbXNnLCBkZXNjcmlwdG9yKSA9PSAtMSkKLSAgICAgIHJldHVybiAtMTsKLSAgfQotICAvLyBUaGUgRXh0ZW5zaW9uRGljdCBtaWdodCBjb250YWluIG5vbi1jb21wb3NpdGUgZmllbGRzLCB3aGljaCB3ZQotICAvLyBza2lwIGhlcmUuCi0gIHJldHVybiAwOwotfQotCi0vLyBWaXNpdCBlYWNoIGNvbXBvc2l0ZSBmaWVsZCBhbmQgZXh0ZW5zaW9uIGZpZWxkIG9mIHRoaXMgQ01lc3NhZ2UuCi0vLyBSZXR1cm5zIC0xIG9uIGVycm9yIGFuZCAwIG9uIHN1Y2Nlc3MuCi10ZW1wbGF0ZTxjbGFzcyBWaXNpdG9yPgotaW50IEZvckVhY2hDb21wb3NpdGVGaWVsZChDTWVzc2FnZSogc2VsZiwgVmlzaXRvciB2aXNpdG9yKSB7Ci0gIFB5X3NzaXplX3QgcG9zID0gMDsKLSAgUHlPYmplY3QqIGtleTsKLSAgUHlPYmplY3QqIGZpZWxkOwotCi0gIC8vIFZpc2l0IG5vcm1hbCBmaWVsZHMuCi0gIGlmIChzZWxmLT5jb21wb3NpdGVfZmllbGRzKSB7Ci0gICAgLy8gTmV2ZXIgdXNlIHNlbGYtPm1lc3NhZ2UgaW4gdGhpcyBmdW5jdGlvbiwgaXQgbWF5IGJlIGFscmVhZHkgZnJlZWQuCi0gICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV9kZXNjcmlwdG9yID0KLSAgICAgICAgR2V0TWVzc2FnZURlc2NyaXB0b3IoUHlfVFlQRShzZWxmKSk7Ci0gICAgd2hpbGUgKFB5RGljdF9OZXh0KHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMsICZwb3MsICZrZXksICZmaWVsZCkpIHsKLSAgICAgIFB5X3NzaXplX3Qga2V5X3N0cl9zaXplOwotICAgICAgY2hhciAqa2V5X3N0cl9kYXRhOwotICAgICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShrZXksICZrZXlfc3RyX2RhdGEsICZrZXlfc3RyX3NpemUpICE9IDApCi0gICAgICAgIHJldHVybiAtMTsKLSAgICAgIGNvbnN0IHN0cmluZyBrZXlfc3RyKGtleV9zdHJfZGF0YSwga2V5X3N0cl9zaXplKTsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9Ci0gICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGtleV9zdHIpOwotICAgICAgaWYgKGRlc2NyaXB0b3IgIT0gTlVMTCkgewotICAgICAgICBpZiAoVmlzaXRDb21wb3NpdGVGaWVsZChkZXNjcmlwdG9yLCBmaWVsZCwgdmlzaXRvcikgPT0gLTEpCi0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIFZpc2l0IGV4dGVuc2lvbiBmaWVsZHMuCi0gIGlmIChzZWxmLT5leHRlbnNpb25zICE9IE5VTEwpIHsKLSAgICBwb3MgPSAwOwotICAgIHdoaWxlIChQeURpY3RfTmV4dChzZWxmLT5leHRlbnNpb25zLT52YWx1ZXMsICZwb3MsICZrZXksICZmaWVsZCkpIHsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IGNtZXNzYWdlOjpHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGtleSk7Ci0gICAgICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKQotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICBpZiAoVmlzaXRDb21wb3NpdGVGaWVsZChkZXNjcmlwdG9yLCBmaWVsZCwgdmlzaXRvcikgPT0gLTEpCi0gICAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENvbnN0YW50cyB1c2VkIGZvciBpbnRlZ2VyIHR5cGUgcmFuZ2UgY2hlY2tpbmcuCi1QeU9iamVjdCoga1B5dGhvblplcm87Ci1QeU9iamVjdCoga2ludDMybWluX3B5OwotUHlPYmplY3QqIGtpbnQzMm1heF9weTsKLVB5T2JqZWN0KiBrdWludDMybWF4X3B5OwotUHlPYmplY3QqIGtpbnQ2NG1pbl9weTsKLVB5T2JqZWN0KiBraW50NjRtYXhfcHk7Ci1QeU9iamVjdCoga3VpbnQ2NG1heF9weTsKLQotUHlPYmplY3QqIEVuY29kZUVycm9yX2NsYXNzOwotUHlPYmplY3QqIERlY29kZUVycm9yX2NsYXNzOwotUHlPYmplY3QqIFBpY2tsZUVycm9yX2NsYXNzOwotCi0vLyBDb25zdGFudCBQeVN0cmluZyB2YWx1ZXMgdXNlZCBmb3IgR2V0QXR0ci9HZXRJdGVtLgotc3RhdGljIFB5T2JqZWN0KiBrX2NkZXNjcmlwdG9yOwotc3RhdGljIFB5T2JqZWN0KiBrZnVsbF9uYW1lOwotCi0vKiBJcyA2NGJpdCAqLwotdm9pZCBGb3JtYXRUeXBlRXJyb3IoUHlPYmplY3QqIGFyZywgY2hhciogZXhwZWN0ZWRfdHlwZXMpIHsKLSAgUHlPYmplY3QqIHJlcHIgPSBQeU9iamVjdF9SZXByKGFyZyk7Ci0gIGlmIChyZXByKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgIiUuMTAwcyBoYXMgdHlwZSAlLjEwMHMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzIiwKLSAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcocmVwciksCi0gICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSwKLSAgICAgICAgICAgICAgICAgZXhwZWN0ZWRfdHlwZXMpOwotICAgIFB5X0RFQ1JFRihyZXByKTsKLSAgfQotfQotCi10ZW1wbGF0ZTxjbGFzcyBUPgotYm9vbCBDaGVja0FuZEdldEludGVnZXIoCi0gICAgUHlPYmplY3QqIGFyZywgVCogdmFsdWUsIFB5T2JqZWN0KiBtaW4sIFB5T2JqZWN0KiBtYXgpIHsKLSAgYm9vbCBpc19sb25nID0gUHlMb25nX0NoZWNrKGFyZyk7Ci0jaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKLSAgaWYgKCFQeUludF9DaGVjayhhcmcpICYmICFpc19sb25nKSB7Ci0gICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImludCwgbG9uZyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoUHlPYmplY3RfQ29tcGFyZShtaW4sIGFyZykgPiAwIHx8IFB5T2JqZWN0X0NvbXBhcmUobWF4LCBhcmcpIDwgMCkgewotI2Vsc2UKLSAgaWYgKCFpc19sb25nKSB7Ci0gICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImludCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoUHlPYmplY3RfUmljaENvbXBhcmVCb29sKG1pbiwgYXJnLCBQeV9MRSkgIT0gMSB8fAotICAgICAgUHlPYmplY3RfUmljaENvbXBhcmVCb29sKG1heCwgYXJnLCBQeV9HRSkgIT0gMSkgewotI2VuZGlmCi0gICAgaWYgKCFQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgICBQeU9iamVjdCAqcyA9IFB5T2JqZWN0X1N0cihhcmcpOwotICAgICAgaWYgKHMpIHsKLSAgICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAiVmFsdWUgb3V0IG9mIHJhbmdlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhzKSk7Ci0gICAgICAgIFB5X0RFQ1JFRihzKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0jaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKLSAgaWYgKCFpc19sb25nKSB7Ci0gICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8VD4oUHlJbnRfQXNMb25nKGFyZykpOwotICB9IGVsc2UgIC8vIE5PTElOVAotI2VuZGlmCi0gIHsKLSAgICBpZiAobWluID09IGtQeXRob25aZXJvKSB7Ci0gICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKGFyZykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNMb25nTG9uZyhhcmcpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFRoZXNlIGFyZSByZWZlcmVuY2VkIGJ5IHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXIsIGFuZCBtdXN0Ci0vLyBiZSBleHBsaWNpdGx5IGluc3RhbnRpYXRlZC4KLXRlbXBsYXRlIGJvb2wgQ2hlY2tBbmRHZXRJbnRlZ2VyPGludDMyPigKLSAgICBQeU9iamVjdCosIGludDMyKiwgUHlPYmplY3QqLCBQeU9iamVjdCopOwotdGVtcGxhdGUgYm9vbCBDaGVja0FuZEdldEludGVnZXI8aW50NjQ+KAotICAgIFB5T2JqZWN0KiwgaW50NjQqLCBQeU9iamVjdCosIFB5T2JqZWN0Kik7Ci10ZW1wbGF0ZSBib29sIENoZWNrQW5kR2V0SW50ZWdlcjx1aW50MzI+KAotICAgIFB5T2JqZWN0KiwgdWludDMyKiwgUHlPYmplY3QqLCBQeU9iamVjdCopOwotdGVtcGxhdGUgYm9vbCBDaGVja0FuZEdldEludGVnZXI8dWludDY0PigKLSAgICBQeU9iamVjdCosIHVpbnQ2NCosIFB5T2JqZWN0KiwgUHlPYmplY3QqKTsKLQotYm9vbCBDaGVja0FuZEdldERvdWJsZShQeU9iamVjdCogYXJnLCBkb3VibGUqIHZhbHVlKSB7Ci0gIGlmICghUHlJbnRfQ2hlY2soYXJnKSAmJiAhUHlMb25nX0NoZWNrKGFyZykgJiYKLSAgICAgICFQeUZsb2F0X0NoZWNrKGFyZykpIHsKLSAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBsb25nLCBmbG9hdCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENoZWNrQW5kR2V0RmxvYXQoUHlPYmplY3QqIGFyZywgZmxvYXQqIHZhbHVlKSB7Ci0gIGRvdWJsZSBkb3VibGVfdmFsdWU7Ci0gIGlmICghQ2hlY2tBbmRHZXREb3VibGUoYXJnLCAmZG91YmxlX3ZhbHVlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxmbG9hdD4oZG91YmxlX3ZhbHVlKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgQ2hlY2tBbmRHZXRCb29sKFB5T2JqZWN0KiBhcmcsIGJvb2wqIHZhbHVlKSB7Ci0gIGlmICghUHlJbnRfQ2hlY2soYXJnKSAmJiAhUHlCb29sX0NoZWNrKGFyZykgJiYgIVB5TG9uZ19DaGVjayhhcmcpKSB7Ci0gICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImludCwgbG9uZywgYm9vbCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxib29sPihQeUludF9Bc0xvbmcoYXJnKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBDaGVja3Mgd2hldGhlciB0aGUgZ2l2ZW4gb2JqZWN0ICh3aGljaCBtdXN0IGJlICJieXRlcyIgb3IgInVuaWNvZGUiKSBjb250YWlucwotLy8gdmFsaWQgVVRGLTguCi1ib29sIElzVmFsaWRVVEY4KFB5T2JqZWN0KiBvYmopIHsKLSAgaWYgKFB5Qnl0ZXNfQ2hlY2sob2JqKSkgewotICAgIFB5T2JqZWN0KiB1bmljb2RlID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KG9iaiwgInV0Zi04IiwgTlVMTCk7Ci0KLSAgICAvLyBDbGVhciB0aGUgZXJyb3IgaW5kaWNhdG9yOyB3ZSByZXBvcnQgb3VyIG93biBlcnJvciB3aGVuIGRlc2lyZWQuCi0gICAgUHlFcnJfQ2xlYXIoKTsKLQotICAgIGlmICh1bmljb2RlKSB7Ci0gICAgICBQeV9ERUNSRUYodW5pY29kZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBVbmljb2RlIG9iamVjdCwga25vd24gdG8gYmUgdmFsaWQgVVRGLTguCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotYm9vbCBBbGxvd0ludmFsaWRVVEY4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLVB5T2JqZWN0KiBDaGVja1N0cmluZyhQeU9iamVjdCogYXJnLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgR09PR0xFX0RDSEVDSyhkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyB8fAotICAgICAgICAgZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyk7Ci0gIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIGlmICghUHlCeXRlc19DaGVjayhhcmcpICYmICFQeVVuaWNvZGVfQ2hlY2soYXJnKSkgewotICAgICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImJ5dGVzLCB1bmljb2RlIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBpZiAoIUlzVmFsaWRVVEY4KGFyZykgJiYgIUFsbG93SW52YWxpZFVURjgoZGVzY3JpcHRvcikpIHsKLSAgICAgIFB5T2JqZWN0KiByZXByID0gUHlPYmplY3RfUmVwcihhcmcpOwotICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgIiVzIGhhcyB0eXBlIHN0ciwgYnV0IGlzbid0IHZhbGlkIFVURi04ICIKLSAgICAgICAgICAgICAgICAgICAiZW5jb2RpbmcuIE5vbi1VVEYtOCBzdHJpbmdzIG11c3QgYmUgY29udmVydGVkIHRvICIKLSAgICAgICAgICAgICAgICAgICAidW5pY29kZSBvYmplY3RzIGJlZm9yZSBiZWluZyBhZGRlZC4iLAotICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHJlcHIpKTsKLSAgICAgIFB5X0RFQ1JFRihyZXByKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfSBlbHNlIGlmICghUHlCeXRlc19DaGVjayhhcmcpKSB7Ci0gICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImJ5dGVzIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBQeU9iamVjdCogZW5jb2RlZF9zdHJpbmcgPSBOVUxMOwotICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKLSAgICBpZiAoUHlCeXRlc19DaGVjayhhcmcpKSB7Ci0gICAgICAvLyBUaGUgYnl0ZXMgd2VyZSBhbHJlYWR5IHZhbGlkYXRlZCBhcyBjb3JyZWN0bHkgZW5jb2RlZCBVVEYtOCBhYm92ZS4KLSAgICAgIGVuY29kZWRfc3RyaW5nID0gYXJnOyAgLy8gQWxyZWFkeSBlbmNvZGVkLgotICAgICAgUHlfSU5DUkVGKGVuY29kZWRfc3RyaW5nKTsKLSAgICB9IGVsc2UgewotICAgICAgZW5jb2RlZF9zdHJpbmcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0KGFyZywgInV0Zi04IiwgTlVMTCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEluIHRoaXMgY2FzZSBmaWVsZCB0eXBlIGlzICJieXRlcyIuCi0gICAgZW5jb2RlZF9zdHJpbmcgPSBhcmc7Ci0gICAgUHlfSU5DUkVGKGVuY29kZWRfc3RyaW5nKTsKLSAgfQotCi0gIHJldHVybiBlbmNvZGVkX3N0cmluZzsKLX0KLQotYm9vbCBDaGVja0FuZFNldFN0cmluZygKLSAgICBQeU9iamVjdCogYXJnLCBNZXNzYWdlKiBtZXNzYWdlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAotICAgIGJvb2wgYXBwZW5kLAotICAgIGludCBpbmRleCkgewotICBTY29wZWRQeU9iamVjdFB0ciBlbmNvZGVkX3N0cmluZyhDaGVja1N0cmluZyhhcmcsIGRlc2NyaXB0b3IpKTsKLQotICBpZiAoZW5jb2RlZF9zdHJpbmcuZ2V0KCkgPT0gTlVMTCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNoYXIqIHZhbHVlOwotICBQeV9zc2l6ZV90IHZhbHVlX2xlbjsKLSAgaWYgKFB5Qnl0ZXNfQXNTdHJpbmdBbmRTaXplKGVuY29kZWRfc3RyaW5nLmdldCgpLCAmdmFsdWUsICZ2YWx1ZV9sZW4pIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0cmluZyB2YWx1ZV9zdHJpbmcodmFsdWUsIHZhbHVlX2xlbik7Ci0gIGlmIChhcHBlbmQpIHsKLSAgICByZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgZGVzY3JpcHRvciwgdmFsdWVfc3RyaW5nKTsKLSAgfSBlbHNlIGlmIChpbmRleCA8IDApIHsKLSAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZGVzY3JpcHRvciwgdmFsdWVfc3RyaW5nKTsKLSAgfSBlbHNlIHsKLSAgICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCBpbmRleCwgdmFsdWVfc3RyaW5nKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotUHlPYmplY3QqIFRvU3RyaW5nT2JqZWN0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgc3RyaW5nIHZhbHVlKSB7Ci0gIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIHJldHVybiBQeUJ5dGVzX0Zyb21TdHJpbmdBbmRTaXplKHZhbHVlLmNfc3RyKCksIHZhbHVlLmxlbmd0aCgpKTsKLSAgfQotCi0gIFB5T2JqZWN0KiByZXN1bHQgPSBQeVVuaWNvZGVfRGVjb2RlVVRGOCh2YWx1ZS5jX3N0cigpLCB2YWx1ZS5sZW5ndGgoKSwgTlVMTCk7Ci0gIC8vIElmIHRoZSBzdHJpbmcgY2FuJ3QgYmUgZGVjb2RlZCBpbiBVVEYtOCwganVzdCByZXR1cm4gYSBzdHJpbmcgb2JqZWN0IHRoYXQKLSAgLy8gY29udGFpbnMgdGhlIHJhdyBieXRlcy4gVGhpcyBjYW4ndCBoYXBwZW4gaWYgdGhlIHZhbHVlIHdhcyBhc3NpZ25lZCB1c2luZwotICAvLyB0aGUgbWVtYmVycyBvZiB0aGUgUHl0aG9uIG1lc3NhZ2Ugb2JqZWN0LCBidXQgY2FuIGhhcHBlbiBpZiB0aGUgdmFsdWVzIHdlcmUKLSAgLy8gcGFyc2VkIGZyb20gdGhlIHdpcmUgKGJpbmFyeSkuCi0gIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWx1ZS5jX3N0cigpLCB2YWx1ZS5sZW5ndGgoKSk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotYm9vbCBDaGVja0ZpZWxkQmVsb25nc1RvTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UpIHsKLSAgaWYgKG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSA9PSBmaWVsZF9kZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIFB5RXJyX0Zvcm1hdChQeUV4Y19LZXlFcnJvciwgIkZpZWxkICclcycgZG9lcyBub3QgYmVsb25nIHRvIG1lc3NhZ2UgJyVzJyIsCi0gICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1uYW1lc3BhY2UgY21lc3NhZ2UgewotCi1QeURlc2NyaXB0b3JQb29sKiBHZXREZXNjcmlwdG9yUG9vbEZvck1lc3NhZ2UoQ01lc3NhZ2UqIG1lc3NhZ2UpIHsKLSAgLy8gTm8gbmVlZCB0byBjaGVjayB0aGUgdHlwZTogdGhlIHR5cGUgb2YgaW5zdGFuY2VzIG9mIENNZXNzYWdlIGlzIGFsd2F5cwotICAvLyBhbiBpbnN0YW5jZSBvZiBDTWVzc2FnZUNsYXNzLiBMZXQncyBwcm92ZSBpdCB3aXRoIGEgZGVidWctb25seSBjaGVjay4KLSAgR09PR0xFX0RDSEVDSyhQeU9iamVjdF9UeXBlQ2hlY2sobWVzc2FnZSwgJkNNZXNzYWdlX1R5cGUpKTsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2VDbGFzcyo+KFB5X1RZUEUobWVzc2FnZSkpLT5weV9kZXNjcmlwdG9yX3Bvb2w7Ci19Ci0KLU1lc3NhZ2VGYWN0b3J5KiBHZXRGYWN0b3J5Rm9yTWVzc2FnZShDTWVzc2FnZSogbWVzc2FnZSkgewotICByZXR1cm4gR2V0RGVzY3JpcHRvclBvb2xGb3JNZXNzYWdlKG1lc3NhZ2UpLT5tZXNzYWdlX2ZhY3Rvcnk7Ci19Ci0KLXN0YXRpYyBpbnQgTWF5YmVSZWxlYXNlT3ZlcmxhcHBpbmdPbmVvZkZpZWxkKAotICAgIENNZXNzYWdlKiBjbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0jaWZkZWYgR09PR0xFX1BST1RPQlVGX0hBU19PTkVPRgotICBNZXNzYWdlKiBtZXNzYWdlID0gY21lc3NhZ2UtPm1lc3NhZ2U7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIGlmICghZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSB8fAotICAgICAgIXJlZmxlY3Rpb24tPkhhc09uZW9mKCptZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB8fAotICAgICAgcmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgewotICAgIC8vIE5vIG90aGVyIGZpZWxkIGluIHRoaXMgb25lb2YsIG5vIG5lZWQgdG8gcmVsZWFzZS4KLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2YgPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4aXN0aW5nX2ZpZWxkID0KLSAgICAgIHJlZmxlY3Rpb24tPkdldE9uZW9mRmllbGREZXNjcmlwdG9yKCptZXNzYWdlLCBvbmVvZik7Ci0gIGlmIChleGlzdGluZ19maWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgIC8vIE5vbi1tZXNzYWdlIGZpZWxkcyBkb24ndCBuZWVkIHRvIGJlIHJlbGVhc2VkLgotICAgIHJldHVybiAwOwotICB9Ci0gIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUgPSBleGlzdGluZ19maWVsZC0+bmFtZSgpLmNfc3RyKCk7Ci0gIFB5T2JqZWN0KiBjaGlsZF9tZXNzYWdlID0gY21lc3NhZ2UtPmNvbXBvc2l0ZV9maWVsZHMgPwotICAgICAgUHlEaWN0X0dldEl0ZW1TdHJpbmcoY21lc3NhZ2UtPmNvbXBvc2l0ZV9maWVsZHMsIGZpZWxkX25hbWUpIDogTlVMTDsKLSAgaWYgKGNoaWxkX21lc3NhZ2UgPT0gTlVMTCkgewotICAgIC8vIE5vIHB5dGhvbiByZWZlcmVuY2UgdG8gdGhpcyBmaWVsZCBzbyBubyBuZWVkIHRvIHJlbGVhc2UuCi0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoSW50ZXJuYWxSZWxlYXNlRmllbGRCeURlc2NyaXB0b3IoCi0gICAgICAgICAgY21lc3NhZ2UsIGV4aXN0aW5nX2ZpZWxkLCBjaGlsZF9tZXNzYWdlKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgcmV0dXJuIFB5RGljdF9EZWxJdGVtU3RyaW5nKGNtZXNzYWdlLT5jb21wb3NpdGVfZmllbGRzLCBmaWVsZF9uYW1lKTsKLSNlbHNlCi0gIHJldHVybiAwOwotI2VuZGlmCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFraW5nIGEgbWVzc2FnZSB3cml0YWJsZQotCi1zdGF0aWMgTWVzc2FnZSogR2V0TXV0YWJsZU1lc3NhZ2UoCi0gICAgQ01lc3NhZ2UqIHBhcmVudCwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZCkgewotICBNZXNzYWdlKiBwYXJlbnRfbWVzc2FnZSA9IHBhcmVudC0+bWVzc2FnZTsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHBhcmVudF9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIGlmIChNYXliZVJlbGVhc2VPdmVybGFwcGluZ09uZW9mRmllbGQocGFyZW50LCBwYXJlbnRfZmllbGQpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKLSAgICAgIHBhcmVudF9tZXNzYWdlLCBwYXJlbnRfZmllbGQsIEdldEZhY3RvcnlGb3JNZXNzYWdlKHBhcmVudCkpOwotfQotCi1zdHJ1Y3QgRml4dXBNZXNzYWdlUmVmZXJlbmNlIDogcHVibGljIENoaWxkVmlzaXRvciB7Ci0gIC8vIG1lc3NhZ2UgbXVzdCBvdXRsaXZlIHRoaXMgb2JqZWN0LgotICBleHBsaWNpdCBGaXh1cE1lc3NhZ2VSZWZlcmVuY2UoTWVzc2FnZSogbWVzc2FnZSkgOgotICAgICAgbWVzc2FnZV8obWVzc2FnZSkge30KLQotICBpbnQgVmlzaXRSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcihSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogY29udGFpbmVyKSB7Ci0gICAgY29udGFpbmVyLT5tZXNzYWdlID0gbWVzc2FnZV87Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpbnQgVmlzaXRSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogY29udGFpbmVyKSB7Ci0gICAgY29udGFpbmVyLT5tZXNzYWdlID0gbWVzc2FnZV87Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpbnQgVmlzaXRNYXBDb250YWluZXIoTWFwQ29udGFpbmVyKiBjb250YWluZXIpIHsKLSAgICBjb250YWluZXItPm1lc3NhZ2UgPSBtZXNzYWdlXzsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gcHJpdmF0ZToKLSAgTWVzc2FnZSogbWVzc2FnZV87Ci19OwotCi1pbnQgQXNzdXJlV3JpdGFibGUoQ01lc3NhZ2UqIHNlbGYpIHsKLSAgaWYgKHNlbGYgPT0gTlVMTCB8fCAhc2VsZi0+cmVhZF9vbmx5KSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpZiAoc2VsZi0+cGFyZW50ID09IE5VTEwpIHsKLSAgICAvLyBJZiBwYXJlbnQgaXMgTlVMTCBidXQgd2UgYXJlIHRyeWluZyB0byBtb2RpZnkgYSByZWFkLW9ubHkgbWVzc2FnZSwgdGhpcwotICAgIC8vIGlzIGEgcmVmZXJlbmNlIHRvIGEgY29uc3RhbnQgZGVmYXVsdCBpbnN0YW5jZSB0aGF0IG5lZWRzIHRvIGJlIHJlcGxhY2VkCi0gICAgLy8gd2l0aCBhIG11dGFibGUgdG9wLWxldmVsIG1lc3NhZ2UuCi0gICAgc2VsZi0+bWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2UtPk5ldygpOwotICAgIHNlbGYtPm93bmVyLnJlc2V0KHNlbGYtPm1lc3NhZ2UpOwotICAgIC8vIENhc2NhZGUgdGhlIG5ldyBvd25lciB0byBldmVudHVhbCBjaGlsZHJlbjogZXZlbiBpZiB0aGlzIG1lc3NhZ2UgaXMKLSAgICAvLyBlbXB0eSwgc29tZSBzdWJtZXNzYWdlcyBvciByZXBlYXRlZCBjb250YWluZXJzIG1pZ2h0IGV4aXN0IGFscmVhZHkuCi0gICAgU2V0T3duZXIoc2VsZiwgc2VsZi0+b3duZXIpOwotICB9IGVsc2UgewotICAgIC8vIE90aGVyd2lzZSwgd2UgbmVlZCBhIG11dGFibGUgY2hpbGQgbWVzc2FnZS4KLSAgICBpZiAoQXNzdXJlV3JpdGFibGUoc2VsZi0+cGFyZW50KSA9PSAtMSkKLSAgICAgIHJldHVybiAtMTsKLQotICAgIC8vIE1ha2Ugc2VsZi0+bWVzc2FnZSB3cml0YWJsZS4KLSAgICBNZXNzYWdlKiBtdXRhYmxlX21lc3NhZ2UgPSBHZXRNdXRhYmxlTWVzc2FnZSgKLSAgICAgICAgc2VsZi0+cGFyZW50LAotICAgICAgICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgaWYgKG11dGFibGVfbWVzc2FnZSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIHNlbGYtPm1lc3NhZ2UgPSBtdXRhYmxlX21lc3NhZ2U7Ci0gIH0KLSAgc2VsZi0+cmVhZF9vbmx5ID0gZmFsc2U7Ci0KLSAgLy8gV2hlbiBhIENNZXNzYWdlIGlzIG1hZGUgd3JpdGFibGUgaXRzIE1lc3NhZ2UgcG9pbnRlciBpcyB1cGRhdGVkCi0gIC8vIHRvIHBvaW50IHRvIGEgbmV3IG11dGFibGUgTWVzc2FnZS4gIFdoZW4gdGhhdCBoYXBwZW5zIHdlIG5lZWQgdG8KLSAgLy8gdXBkYXRlIGFueSByZWZlcmVuY2VzIHRvIHRoZSBvbGQsIHJlYWQtb25seSBDTWVzc2FnZS4gIFRoZXJlIGFyZQotICAvLyBmb3VyIHBsYWNlcyBzdWNoIHJlZmVyZW5jZXMgb2NjdXI6IFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyLAotICAvLyBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciwgTWFwQ29udGFpbmVyLCBhbmQgRXh0ZW5zaW9uRGljdC4KLSAgaWYgKHNlbGYtPmV4dGVuc2lvbnMgIT0gTlVMTCkKLSAgICBzZWxmLT5leHRlbnNpb25zLT5tZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgaWYgKEZvckVhY2hDb21wb3NpdGVGaWVsZChzZWxmLCBGaXh1cE1lc3NhZ2VSZWZlcmVuY2Uoc2VsZi0+bWVzc2FnZSkpID09IC0xKQotICAgIHJldHVybiAtMTsKLQotICByZXR1cm4gMDsKLX0KLQotLy8gLS0tIEdsb2JhbHM6Ci0KLS8vIFJldHJpZXZlIGEgQysrIEZpZWxkRGVzY3JpcHRvciBmb3IgYSBtZXNzYWdlIGF0dHJpYnV0ZS4KLS8vIFRoZSBDKysgbWVzc2FnZSBtdXN0IGJlIHZhbGlkLgotLy8gVE9ETyhhbWF1cnlmYSk6IFRoaXMgZnVuY3Rpb24gc2hvdWxkIHN0YXkgaW50ZXJuYWwsIGJlY2F1c2UgZXhjZXB0aW9uCi0vLyBoYW5kbGluZyBpcyBub3QgY29uc2lzdGVudC4KLXN0YXRpYyBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEdldEZpZWxkRGVzY3JpcHRvcigKLSAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIG5hbWUpIHsKLSAgY29uc3QgRGVzY3JpcHRvciAqbWVzc2FnZV9kZXNjcmlwdG9yID0gc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOwotICBjaGFyKiBmaWVsZF9uYW1lOwotICBQeV9zc2l6ZV90IHNpemU7Ci0gIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUobmFtZSwgJmZpZWxkX25hbWUsICZzaXplKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjb25zdCBGaWVsZERlc2NyaXB0b3IgKmZpZWxkX2Rlc2NyaXB0b3IgPQotICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoc3RyaW5nKGZpZWxkX25hbWUsIHNpemUpKTsKLSAgaWYgKGZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIC8vIE5vdGU6IE5vIGV4Y2VwdGlvbiBpcyBzZXQhCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGZpZWxkX2Rlc2NyaXB0b3I7Ci19Ci0KLS8vIFJldHJpZXZlIGEgQysrIEZpZWxkRGVzY3JpcHRvciBmb3IgYW4gZXh0ZW5zaW9uIGhhbmRsZS4KLWNvbnN0IEZpZWxkRGVzY3JpcHRvciogR2V0RXh0ZW5zaW9uRGVzY3JpcHRvcihQeU9iamVjdCogZXh0ZW5zaW9uKSB7Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGNkZXNjcmlwdG9yOwotICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhleHRlbnNpb24sICZQeUZpZWxkRGVzY3JpcHRvcl9UeXBlKSkgewotICAgIC8vIE1vc3QgY2FsbGVycyBjb25zaWRlciBleHRlbnNpb25zIGFzIGEgcGxhaW4gZGljdGlvbmFyeS4gIFdlIHNob3VsZAotICAgIC8vIGFsbG93IGlucHV0IHdoaWNoIGlzIG5vdCBhIGZpZWxkIGRlc2NyaXB0b3IsIGFuZCBzaW1wbHkgcHJldGVuZCBpdCBkb2VzCi0gICAgLy8gbm90IGV4aXN0LgotICAgIFB5RXJyX1NldE9iamVjdChQeUV4Y19LZXlFcnJvciwgZXh0ZW5zaW9uKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gUHlGaWVsZERlc2NyaXB0b3JfQXNEZXNjcmlwdG9yKGV4dGVuc2lvbik7Ci19Ci0KLS8vIElmIHZhbHVlIGlzIGEgc3RyaW5nLCBjb252ZXJ0IGl0IGludG8gYW4gZW51bSB2YWx1ZSBiYXNlZCBvbiB0aGUgbGFiZWxzIGluCi0vLyBkZXNjcmlwdG9yLCBvdGhlcndpc2Ugc2ltcGx5IHJldHVybiB2YWx1ZS4gIEFsd2F5cyByZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLXN0YXRpYyBQeU9iamVjdCogR2V0SW50ZWdlckVudW1WYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHZhbHVlKSB7Ci0gIGlmIChQeVN0cmluZ19DaGVjayh2YWx1ZSkgfHwgUHlVbmljb2RlX0NoZWNrKHZhbHVlKSkgewotICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IgPSBkZXNjcmlwdG9yLmVudW1fdHlwZSgpOwotICAgIGlmIChlbnVtX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm5vdCBhbiBlbnVtIGZpZWxkIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgY2hhciogZW51bV9sYWJlbDsKLSAgICBQeV9zc2l6ZV90IHNpemU7Ci0gICAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZSh2YWx1ZSwgJmVudW1fbGFiZWwsICZzaXplKSA8IDApIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgPQotICAgICAgICBlbnVtX2Rlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TmFtZShzdHJpbmcoZW51bV9sYWJlbCwgc2l6ZSkpOwotICAgIGlmIChlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJ1bmtub3duIGVudW0gbGFiZWwiKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoZW51bV92YWx1ZV9kZXNjcmlwdG9yLT5udW1iZXIoKSk7Ci0gIH0KLSAgUHlfSU5DUkVGKHZhbHVlKTsKLSAgcmV0dXJuIHZhbHVlOwotfQotCi0vLyBJZiBjbWVzc2FnZV9saXN0IGlzIG5vdCBOVUxMLCB0aGlzIGZ1bmN0aW9uIHJlbGVhc2VzIHZhbHVlcyBpbnRvIHRoZQotLy8gY29udGFpbmVyIENNZXNzYWdlcyBpbnN0ZWFkIG9mIGp1c3QgcmVtb3ZpbmcuIFJlcGVhdGVkIGNvbXBvc2l0ZSBjb250YWluZXIKLS8vIG5lZWRzIHRvIGRvIHRoaXMgdG8gbWFrZSBzdXJlIENNZXNzYWdlcyBzdGF5IGFsaXZlIGlmIHRoZXkncmUgc3RpbGwKLS8vIHJlZmVyZW5jZWQgYWZ0ZXIgZGVsZXRpb24uIFJlcGVhdGVkIHNjYWxhciBjb250YWluZXIgZG9lc24ndCBuZWVkIHRvIHdvcnJ5LgotaW50IEludGVybmFsRGVsZXRlUmVwZWF0ZWRGaWVsZCgKLSAgICBDTWVzc2FnZSogc2VsZiwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgUHlPYmplY3QqIHNsaWNlLAotICAgIFB5T2JqZWN0KiBjbWVzc2FnZV9saXN0KSB7Ci0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBQeV9zc2l6ZV90IGxlbmd0aCwgZnJvbSwgdG8sIHN0ZXAsIHNsaWNlX2xlbmd0aDsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgaW50IG1pbiwgbWF4OwotICBsZW5ndGggPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotCi0gIGlmIChQeUludF9DaGVjayhzbGljZSkgfHwgUHlMb25nX0NoZWNrKHNsaWNlKSkgewotICAgIGZyb20gPSB0byA9IFB5TG9uZ19Bc0xvbmcoc2xpY2UpOwotICAgIGlmIChmcm9tIDwgMCkgewotICAgICAgZnJvbSA9IHRvID0gbGVuZ3RoICsgZnJvbTsKLSAgICB9Ci0gICAgc3RlcCA9IDE7Ci0gICAgbWluID0gbWF4ID0gZnJvbTsKLQotICAgIC8vIFJhbmdlIGNoZWNrLgotICAgIGlmIChmcm9tIDwgMCB8fCBmcm9tID49IGxlbmd0aCkgewotICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICB9IGVsc2UgaWYgKFB5U2xpY2VfQ2hlY2soc2xpY2UpKSB7Ci0gICAgZnJvbSA9IHRvID0gc3RlcCA9IHNsaWNlX2xlbmd0aCA9IDA7Ci0gICAgUHlTbGljZV9HZXRJbmRpY2VzRXgoCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeVNsaWNlT2JqZWN0Kj4oc2xpY2UpLAotI2Vsc2UKLSAgICAgICAgc2xpY2UsCi0jZW5kaWYKLSAgICAgICAgbGVuZ3RoLCAmZnJvbSwgJnRvLCAmc3RlcCwgJnNsaWNlX2xlbmd0aCk7Ci0gICAgaWYgKGZyb20gPCB0bykgewotICAgICAgbWluID0gZnJvbTsKLSAgICAgIG1heCA9IHRvIC0gMTsKLSAgICB9IGVsc2UgewotICAgICAgbWluID0gdG8gKyAxOwotICAgICAgbWF4ID0gZnJvbTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgUHlfc3NpemVfdCBpID0gZnJvbTsKLSAgc3RkOjp2ZWN0b3I8Ym9vbD4gdG9fZGVsZXRlKGxlbmd0aCwgZmFsc2UpOwotICB3aGlsZSAoaSA+PSBtaW4gJiYgaSA8PSBtYXgpIHsKLSAgICB0b19kZWxldGVbaV0gPSB0cnVlOwotICAgIGkgKz0gc3RlcDsKLSAgfQotCi0gIHRvID0gMDsKLSAgZm9yIChpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgaWYgKCF0b19kZWxldGVbaV0pIHsKLSAgICAgIGlmIChpICE9IHRvKSB7Ci0gICAgICAgIHJlZmxlY3Rpb24tPlN3YXBFbGVtZW50cyhtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpLCB0byk7Ci0gICAgICAgIGlmIChjbWVzc2FnZV9saXN0ICE9IE5VTEwpIHsKLSAgICAgICAgICAvLyBJZiBhIGxpc3Qgb2YgY21lc3NhZ2VzIGlzIHBhc3NlZCBpbiAoaS5lLiBmcm9tIGEgcmVwZWF0ZWQKLSAgICAgICAgICAvLyBjb21wb3NpdGUgY29udGFpbmVyKSwgc3dhcCB0aG9zZSBhcyB3ZWxsIHRvIGNvcnJlc3BvbmQgdG8gdGhlCi0gICAgICAgICAgLy8gc3dhcHMgaW4gdGhlIHVuZGVybHlpbmcgbWVzc2FnZSBzbyB0aGV5J3JlIGluIHRoZSByaWdodCBvcmRlcgotICAgICAgICAgIC8vIHdoZW4gd2Ugc3RhcnQgcmVsZWFzaW5nLgotICAgICAgICAgIFB5T2JqZWN0KiB0bXAgPSBQeUxpc3RfR0VUX0lURU0oY21lc3NhZ2VfbGlzdCwgaSk7Ci0gICAgICAgICAgUHlMaXN0X1NFVF9JVEVNKGNtZXNzYWdlX2xpc3QsIGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIFB5TGlzdF9HRVRfSVRFTShjbWVzc2FnZV9saXN0LCB0bykpOwotICAgICAgICAgIFB5TGlzdF9TRVRfSVRFTShjbWVzc2FnZV9saXN0LCB0bywgdG1wKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgKyt0bzsKLSAgICB9Ci0gIH0KLQotICB3aGlsZSAoaSA+IHRvKSB7Ci0gICAgaWYgKGNtZXNzYWdlX2xpc3QgPT0gTlVMTCkgewotICAgICAgcmVmbGVjdGlvbi0+UmVtb3ZlTGFzdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgICB9IGVsc2UgewotICAgICAgQ01lc3NhZ2UqIGxhc3RfY21lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oCi0gICAgICAgICAgUHlMaXN0X0dFVF9JVEVNKGNtZXNzYWdlX2xpc3QsIFB5TGlzdF9HRVRfU0laRShjbWVzc2FnZV9saXN0KSAtIDEpKTsKLSAgICAgIHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6OlJlbGVhc2VMYXN0VG8oCi0gICAgICAgICAgc2VsZiwgZmllbGRfZGVzY3JpcHRvciwgbGFzdF9jbWVzc2FnZSk7Ci0gICAgICBpZiAoUHlTZXF1ZW5jZV9EZWxJdGVtKGNtZXNzYWdlX2xpc3QsIC0xKSA8IDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgICAtLWk7Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotLy8gSW5pdGlhbGl6ZXMgZmllbGRzIG9mIGEgbWVzc2FnZS4gVXNlZCBpbiBjb25zdHJ1Y3RvcnMuCi1pbnQgSW5pdEF0dHJpYnV0ZXMoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBrd2FyZ3MpIHsKLSAgaWYgKGt3YXJncyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBQeV9zc2l6ZV90IHBvcyA9IDA7Ci0gIFB5T2JqZWN0KiBuYW1lOwotICBQeU9iamVjdCogdmFsdWU7Ci0gIHdoaWxlIChQeURpY3RfTmV4dChrd2FyZ3MsICZwb3MsICZuYW1lLCAmdmFsdWUpKSB7Ci0gICAgaWYgKCFQeVN0cmluZ19DaGVjayhuYW1lKSkgewotICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJGaWVsZCBuYW1lIG11c3QgYmUgYSBzdHJpbmciKTsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0RmllbGREZXNjcmlwdG9yKHNlbGYsIG5hbWUpOwotICAgIGlmIChkZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiUHJvdG9jb2wgbWVzc2FnZSAlcyBoYXMgbm8gXCIlc1wiIGZpZWxkLiIsCi0gICAgICAgICAgICAgICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19Bc1N0cmluZyhuYW1lKSk7Ci0gICAgICByZXR1cm4gLTE7Ci0gICAgfQotICAgIGlmICh2YWx1ZSA9PSBQeV9Ob25lKSB7Ci0gICAgICAvLyBmaWVsZD1Ob25lIGlzIHRoZSBzYW1lIGFzIG5vIGZpZWxkIGF0IGFsbC4KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICBpZiAoZGVzY3JpcHRvci0+aXNfbWFwKCkpIHsKLSAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG1hcChHZXRBdHRyKHNlbGYsIG5hbWUpKTsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZGVzY3JpcHRvciA9Ci0gICAgICAgICAgZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCktPkZpbmRGaWVsZEJ5TmFtZSgidmFsdWUiKTsKLSAgICAgIGlmICh2YWx1ZV9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICAgIFB5X3NzaXplX3QgbWFwX3BvcyA9IDA7Ci0gICAgICAgIFB5T2JqZWN0KiBtYXBfa2V5OwotICAgICAgICBQeU9iamVjdCogbWFwX3ZhbHVlOwotICAgICAgICB3aGlsZSAoUHlEaWN0X05leHQodmFsdWUsICZtYXBfcG9zLCAmbWFwX2tleSwgJm1hcF92YWx1ZSkpIHsKLSAgICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBmdW5jdGlvbl9yZXR1cm47Ci0gICAgICAgICAgZnVuY3Rpb25fcmV0dXJuLnJlc2V0KFB5T2JqZWN0X0dldEl0ZW0obWFwLmdldCgpLCBtYXBfa2V5KSk7Ci0gICAgICAgICAgaWYgKGZ1bmN0aW9uX3JldHVybi5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgfQotICAgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG9rKFB5T2JqZWN0X0NhbGxNZXRob2QoCi0gICAgICAgICAgICAgIGZ1bmN0aW9uX3JldHVybi5nZXQoKSwgIk1lcmdlRnJvbSIsICJPIiwgbWFwX3ZhbHVlKSk7Ci0gICAgICAgICAgaWYgKG9rLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bmN0aW9uX3JldHVybjsKLSAgICAgICAgZnVuY3Rpb25fcmV0dXJuLnJlc2V0KAotICAgICAgICAgICAgUHlPYmplY3RfQ2FsbE1ldGhvZChtYXAuZ2V0KCksICJ1cGRhdGUiLCAiTyIsIHZhbHVlKSk7Ci0gICAgICAgIGlmIChmdW5jdGlvbl9yZXR1cm4uZ2V0KCkgPT0gTlVMTCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZGVzY3JpcHRvci0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKSB7Ci0gICAgICBTY29wZWRQeU9iamVjdFB0ciBjb250YWluZXIoR2V0QXR0cihzZWxmLCBuYW1lKSk7Ci0gICAgICBpZiAoY29udGFpbmVyID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgaWYgKGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgICAgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHJjX2NvbnRhaW5lciA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKj4oY29udGFpbmVyLmdldCgpKTsKLSAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgaXRlcihQeU9iamVjdF9HZXRJdGVyKHZhbHVlKSk7Ci0gICAgICAgIGlmIChpdGVyID09IE5VTEwpIHsKLSAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVmFsdWUgbXVzdCBiZSBpdGVyYWJsZSIpOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBuZXh0OwotICAgICAgICB3aGlsZSAoKG5leHQucmVzZXQoUHlJdGVyX05leHQoaXRlci5nZXQoKSkpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgUHlPYmplY3QqIGt3YXJncyA9IChQeURpY3RfQ2hlY2sobmV4dC5nZXQoKSkgPyBuZXh0LmdldCgpIDogTlVMTCk7Ci0gICAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgbmV3X21zZygKLSAgICAgICAgICAgICAgcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lcjo6QWRkKHJjX2NvbnRhaW5lciwgTlVMTCwga3dhcmdzKSk7Ci0gICAgICAgICAgaWYgKG5ld19tc2cgPT0gTlVMTCkgewotICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoa3dhcmdzID09IE5VTEwpIHsKLSAgICAgICAgICAgIC8vIG5leHQgd2FzIG5vdCBhIGRpY3QsIGl0J3MgYSBtZXNzYWdlIHdlIG5lZWQgdG8gbWVyZ2UKLSAgICAgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG1lcmdlZChNZXJnZUZyb20oCi0gICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KG5ld19tc2cuZ2V0KCkpLCBuZXh0LmdldCgpKSk7Ci0gICAgICAgICAgICBpZiAobWVyZ2VkLmdldCgpID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgICAgICAgIC8vIENoZWNrIHRvIHNlZSBob3cgUHlJdGVyX05leHQoKSBleGl0ZWQuCi0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pIHsKLSAgICAgICAgUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHJzX2NvbnRhaW5lciA9Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKj4oY29udGFpbmVyLmdldCgpKTsKLSAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgaXRlcihQeU9iamVjdF9HZXRJdGVyKHZhbHVlKSk7Ci0gICAgICAgIGlmIChpdGVyID09IE5VTEwpIHsKLSAgICAgICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVmFsdWUgbXVzdCBiZSBpdGVyYWJsZSIpOwotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgICBTY29wZWRQeU9iamVjdFB0ciBuZXh0OwotICAgICAgICB3aGlsZSAoKG5leHQucmVzZXQoUHlJdGVyX05leHQoaXRlci5nZXQoKSkpKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgZW51bV92YWx1ZSgKLSAgICAgICAgICAgICAgR2V0SW50ZWdlckVudW1WYWx1ZSgqZGVzY3JpcHRvciwgbmV4dC5nZXQoKSkpOwotICAgICAgICAgIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgU2NvcGVkUHlPYmplY3RQdHIgbmV3X21zZyhyZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyOjpBcHBlbmQoCi0gICAgICAgICAgICAgIHJzX2NvbnRhaW5lciwgZW51bV92YWx1ZS5nZXQoKSkpOwotICAgICAgICAgIGlmIChuZXdfbXNnID09IE5VTEwpIHsKLSAgICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKFB5RXJyX09jY3VycmVkKCkpIHsKLSAgICAgICAgICAvLyBDaGVjayB0byBzZWUgaG93IFB5SXRlcl9OZXh0KCkgZXhpdGVkLgotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6OkV4dGVuZCgKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKj4oY29udGFpbmVyLmdldCgpKSwKLSAgICAgICAgICAgICAgICB2YWx1ZSkpID09Ci0gICAgICAgICAgICBOVUxMKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChkZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBTY29wZWRQeU9iamVjdFB0ciBtZXNzYWdlKEdldEF0dHIoc2VsZiwgbmFtZSkpOwotICAgICAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBDTWVzc2FnZSogY21lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4obWVzc2FnZS5nZXQoKSk7Ci0gICAgICBpZiAoUHlEaWN0X0NoZWNrKHZhbHVlKSkgewotICAgICAgICBpZiAoSW5pdEF0dHJpYnV0ZXMoY21lc3NhZ2UsIHZhbHVlKSA8IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIG1lcmdlZChNZXJnZUZyb20oY21lc3NhZ2UsIHZhbHVlKSk7Ci0gICAgICAgIGlmIChtZXJnZWQgPT0gTlVMTCkgewotICAgICAgICAgIHJldHVybiAtMTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBTY29wZWRQeU9iamVjdFB0ciBuZXdfdmFsOwotICAgICAgaWYgKGRlc2NyaXB0b3ItPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0pIHsKLSAgICAgICAgbmV3X3ZhbC5yZXNldChHZXRJbnRlZ2VyRW51bVZhbHVlKCpkZXNjcmlwdG9yLCB2YWx1ZSkpOwotICAgICAgICBpZiAobmV3X3ZhbCA9PSBOVUxMKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBpZiAoU2V0QXR0cihzZWxmLCBuYW1lLCAobmV3X3ZhbC5nZXQoKSA9PSBOVUxMKSA/IHZhbHVlIDogbmV3X3ZhbC5nZXQoKSkgPAotICAgICAgICAgIDApIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8gQWxsb2NhdGVzIGFuIGluY29tcGxldGUgUHl0aG9uIE1lc3NhZ2U6IHRoZSBjYWxsZXIgbXVzdCBmaWxsIHNlbGYtPm1lc3NhZ2UsCi0vLyBzZWxmLT5vd25lciBhbmQgZXZlbnR1YWxseSBzZWxmLT5wYXJlbnQuCi1DTWVzc2FnZSogTmV3RW1wdHlNZXNzYWdlKENNZXNzYWdlQ2xhc3MqIHR5cGUpIHsKLSAgQ01lc3NhZ2UqIHNlbGYgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oCi0gICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jKCZ0eXBlLT5zdXBlci5odF90eXBlLCAwKSk7Ci0gIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHNlbGYtPm1lc3NhZ2UgPSBOVUxMOwotICBzZWxmLT5wYXJlbnQgPSBOVUxMOwotICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciA9IE5VTEw7Ci0gIHNlbGYtPnJlYWRfb25seSA9IGZhbHNlOwotICBzZWxmLT5leHRlbnNpb25zID0gTlVMTDsKLQotICBzZWxmLT5jb21wb3NpdGVfZmllbGRzID0gTlVMTDsKLQotICByZXR1cm4gc2VsZjsKLX0KLQotLy8gVGhlIF9fbmV3X18gbWV0aG9kIG9mIE1lc3NhZ2UgY2xhc3Nlcy4KLS8vIENyZWF0ZXMgYSBuZXcgQysrIG1lc3NhZ2UgYW5kIHRha2VzIG93bmVyc2hpcC4KLXN0YXRpYyBQeU9iamVjdCogTmV3KFB5VHlwZU9iamVjdCogY2xzLAotICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHVudXNlZF9hcmdzLCBQeU9iamVjdCogdW51c2VkX2t3YXJncykgewotICBDTWVzc2FnZUNsYXNzKiB0eXBlID0gQ2hlY2tNZXNzYWdlQ2xhc3MoY2xzKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIC8vIFJldHJpZXZlIHRoZSBtZXNzYWdlIGRlc2NyaXB0b3IgYW5kIHRoZSBkZWZhdWx0IGluc3RhbmNlICg9cHJvdG90eXBlKS4KLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV9kZXNjcmlwdG9yID0gdHlwZS0+bWVzc2FnZV9kZXNjcmlwdG9yOwotICBpZiAobWVzc2FnZV9kZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X21lc3NhZ2UgPSB0eXBlLT5weV9kZXNjcmlwdG9yX3Bvb2wtPm1lc3NhZ2VfZmFjdG9yeQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkdldFByb3RvdHlwZShtZXNzYWdlX2Rlc2NyaXB0b3IpOwotICBpZiAoZGVmYXVsdF9tZXNzYWdlID09IE5VTEwpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCBtZXNzYWdlX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgQ01lc3NhZ2UqIHNlbGYgPSBOZXdFbXB0eU1lc3NhZ2UodHlwZSk7Ci0gIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBzZWxmLT5tZXNzYWdlID0gZGVmYXVsdF9tZXNzYWdlLT5OZXcoKTsKLSAgc2VsZi0+b3duZXIucmVzZXQoc2VsZi0+bWVzc2FnZSk7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZik7Ci19Ci0KLS8vIFRoZSBfX2luaXRfXyBtZXRob2Qgb2YgTWVzc2FnZSBjbGFzc2VzLgotLy8gSXQgaW5pdGlhbGl6ZXMgZmllbGRzIGZyb20ga2V5d29yZHMgcGFzc2VkIHRvIHRoZSBjb25zdHJ1Y3Rvci4KLXN0YXRpYyBpbnQgSW5pdChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MsIFB5T2JqZWN0KiBrd2FyZ3MpIHsKLSAgaWYgKFB5VHVwbGVfU2l6ZShhcmdzKSAhPSAwKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk5vIHBvc2l0aW9uYWwgYXJndW1lbnRzIGFsbG93ZWQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gSW5pdEF0dHJpYnV0ZXMoc2VsZiwga3dhcmdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWFsbG9jYXRpbmcgYSBDTWVzc2FnZQotLy8KLS8vIERlYWxsb2NhdGluZyBhIENNZXNzYWdlIHJlcXVpcmVzIHRoYXQgd2UgY2xlYXIgYW55IHdlYWsgcmVmZXJlbmNlcwotLy8gZnJvbSBjaGlsZHJlbiB0byB0aGUgbWVzc2FnZSBiZWluZyBkZWFsbG9jYXRlZC4KLQotLy8gQ2xlYXIgdGhlIHdlYWsgcmVmZXJlbmNlIGZyb20gdGhlIGNoaWxkIHRvIHRoZSBwYXJlbnQuCi1zdHJ1Y3QgQ2xlYXJXZWFrUmVmZXJlbmNlcyA6IHB1YmxpYyBDaGlsZFZpc2l0b3IgewotICBpbnQgVmlzaXRSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcihSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogY29udGFpbmVyKSB7Ci0gICAgY29udGFpbmVyLT5wYXJlbnQgPSBOVUxMOwotICAgIC8vIFRoZSBlbGVtZW50cyBpbiB0aGUgY29udGFpbmVyIGhhdmUgdGhlIHNhbWUgcGFyZW50IGFzIHRoZQotICAgIC8vIGNvbnRhaW5lciBpdHNlbGYsIHNvIE5VTEwgb3V0IHRoYXQgcG9pbnRlciBhcyB3ZWxsLgotICAgIGNvbnN0IFB5X3NzaXplX3QgbiA9IFB5TGlzdF9HRVRfU0laRShjb250YWluZXItPmNoaWxkX21lc3NhZ2VzKTsKLSAgICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBuOyArK2kpIHsKLSAgICAgIENNZXNzYWdlKiBjaGlsZF9jbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPigKLSAgICAgICAgICBQeUxpc3RfR0VUX0lURU0oY29udGFpbmVyLT5jaGlsZF9tZXNzYWdlcywgaSkpOwotICAgICAgY2hpbGRfY21lc3NhZ2UtPnBhcmVudCA9IE5VTEw7Ci0gICAgfQotICAgIHJldHVybiAwOwotICB9Ci0KLSAgaW50IFZpc2l0UmVwZWF0ZWRTY2FsYXJDb250YWluZXIoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIGNvbnRhaW5lcikgewotICAgIGNvbnRhaW5lci0+cGFyZW50ID0gTlVMTDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGludCBWaXNpdE1hcENvbnRhaW5lcihNYXBDb250YWluZXIqIGNvbnRhaW5lcikgewotICAgIGNvbnRhaW5lci0+cGFyZW50ID0gTlVMTDsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGludCBWaXNpdENNZXNzYWdlKENNZXNzYWdlKiBjbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKSB7Ci0gICAgY21lc3NhZ2UtPnBhcmVudCA9IE5VTEw7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX07Ci0KLXN0YXRpYyB2b2lkIERlYWxsb2MoQ01lc3NhZ2UqIHNlbGYpIHsKLSAgLy8gTnVsbCBvdXQgYWxsIHdlYWsgcmVmZXJlbmNlcyBmcm9tIGNoaWxkcmVuIHRvIHRoaXMgbWVzc2FnZS4KLSAgR09PR0xFX0NIRUNLX0VRKDAsIEZvckVhY2hDb21wb3NpdGVGaWVsZChzZWxmLCBDbGVhcldlYWtSZWZlcmVuY2VzKCkpKTsKLSAgaWYgKHNlbGYtPmV4dGVuc2lvbnMpIHsKLSAgICBzZWxmLT5leHRlbnNpb25zLT5wYXJlbnQgPSBOVUxMOwotICB9Ci0KLSAgUHlfQ0xFQVIoc2VsZi0+ZXh0ZW5zaW9ucyk7Ci0gIFB5X0NMRUFSKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMpOwotICBzZWxmLT5vd25lci5yZXNldCgpOwotICBQeV9UWVBFKHNlbGYpLT50cF9mcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLVB5T2JqZWN0KiBJc0luaXRpYWxpemVkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBQeU9iamVjdCogZXJyb3JzID0gTlVMTDsKLSAgaWYgKFB5QXJnX1BhcnNlVHVwbGUoYXJncywgInxPIiwgJmVycm9ycykgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKHNlbGYtPm1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSkgewotICAgIFB5X1JFVFVSTl9UUlVFOwotICB9Ci0gIGlmIChlcnJvcnMgIT0gTlVMTCkgewotICAgIFNjb3BlZFB5T2JqZWN0UHRyIGluaXRpYWxpemF0aW9uX2Vycm9ycygKLSAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHNlbGYpKTsKLSAgICBpZiAoaW5pdGlhbGl6YXRpb25fZXJyb3JzID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBTY29wZWRQeU9iamVjdFB0ciBleHRlbmRfbmFtZShQeVN0cmluZ19Gcm9tU3RyaW5nKCJleHRlbmQiKSk7Ci0gICAgaWYgKGV4dGVuZF9uYW1lID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBTY29wZWRQeU9iamVjdFB0ciByZXN1bHQoUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoCi0gICAgICAgIGVycm9ycywKLSAgICAgICAgZXh0ZW5kX25hbWUuZ2V0KCksCi0gICAgICAgIGluaXRpYWxpemF0aW9uX2Vycm9ycy5nZXQoKSwKLSAgICAgICAgTlVMTCkpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIFB5X1JFVFVSTl9GQUxTRTsKLX0KLQotUHlPYmplY3QqIEhhc0ZpZWxkQnlEZXNjcmlwdG9yKAotICAgIENNZXNzYWdlKiBzZWxmLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKLSAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoZmllbGRfZGVzY3JpcHRvci0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotICAgICAgICAgICAgICAgICAgICAiRmllbGQgaXMgcmVwZWF0ZWQuIEEgc2luZ3VsYXIgbWV0aG9kIGlzIHJlcXVpcmVkLiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGJvb2wgaGFzX2ZpZWxkID0KLSAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGhhc19maWVsZCA/IDEgOiAwKTsKLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRXaXRoT25lb2ZzKAotICAgIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSwgYm9vbCogaW5fb25lb2YpIHsKLSAgKmluX29uZW9mID0gZmFsc2U7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7Ci0gIGlmIChmaWVsZF9kZXNjcmlwdG9yICE9IE5VTEwpIHsKLSAgICByZXR1cm4gZmllbGRfZGVzY3JpcHRvcjsKLSAgfQotICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2MgPQotICAgICAgZGVzY3JpcHRvci0+RmluZE9uZW9mQnlOYW1lKGZpZWxkX25hbWUpOwotICBpZiAob25lb2ZfZGVzYyAhPSBOVUxMKSB7Ci0gICAgKmluX29uZW9mID0gdHJ1ZTsKLSAgICByZXR1cm4gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigqbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVvZl9kZXNjKTsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotYm9vbCBDaGVja0hhc1ByZXNlbmNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwgYm9vbCBpbl9vbmVvZikgewotICBpZiAoZmllbGRfZGVzY3JpcHRvci0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIGhhcyBubyBzaW5ndWxhciBcIiVzXCIgZmllbGQuIiwKLSAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5maWxlKCktPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zKSB7Ci0gICAgLy8gSGFzRmllbGQoKSBmb3IgYSBvbmVvZiAqaXRzZWxmKiBpc24ndCBzdXBwb3J0ZWQuCi0gICAgaWYgKGluX29uZW9mKSB7Ci0gICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAiQ2FuJ3QgdGVzdCBvbmVvZiBmaWVsZCBcIiVzXCIgZm9yIHByZXNlbmNlIGluIHByb3RvMywgdXNlICIKLSAgICAgICAgICAgICAgICAgICAiV2hpY2hPbmVvZiBpbnN0ZWFkLiIsCi0gICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpLT5uYW1lKCkuY19zdHIoKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gLi4uYnV0IEhhc0ZpZWxkKCkgZm9yIGZpZWxkcyAqaW4qIGEgb25lb2YgaXMgc3VwcG9ydGVkLgotICAgIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgIFB5RXJyX0Zvcm1hdCgKLSAgICAgICAgICBQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICJDYW4ndCB0ZXN0IG5vbi1zdWJtZXNzYWdlIGZpZWxkIFwiJXNcIiBmb3IgcHJlc2VuY2UgaW4gcHJvdG8zLiIsCi0gICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1QeU9iamVjdCogSGFzRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgY2hhciogZmllbGRfbmFtZTsKLSAgUHlfc3NpemVfdCBzaXplOwotI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCi0gIGlmIChQeVN0cmluZ19Bc1N0cmluZ0FuZFNpemUoYXJnLCAmZmllbGRfbmFtZSwgJnNpemUpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0jZWxzZQotICBmaWVsZF9uYW1lID0gUHlVbmljb2RlX0FzVVRGOEFuZFNpemUoYXJnLCAmc2l6ZSk7Ci0gIGlmICghZmllbGRfbmFtZSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0jZW5kaWYKLQotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgYm9vbCBpc19pbl9vbmVvZjsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KLSAgICAgIEZpbmRGaWVsZFdpdGhPbmVvZnMobWVzc2FnZSwgc3RyaW5nKGZpZWxkX25hbWUsIHNpemUpLCAmaXNfaW5fb25lb2YpOwotICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgaWYgKCFpc19pbl9vbmVvZikgewotICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIGZpZWxkICVzLiIsIGZpZWxkX25hbWUpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIFB5X1JFVFVSTl9GQUxTRTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIUNoZWNrSGFzUHJlc2VuY2UoZmllbGRfZGVzY3JpcHRvciwgaXNfaW5fb25lb2YpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAobWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcikpIHsKLSAgICBQeV9SRVRVUk5fVFJVRTsKLSAgfQotICBpZiAoIW1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpICYmCi0gICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7Ci0gICAgLy8gU3BlY2lhbCBjYXNlOiBQeXRob24gSGFzRmllbGQoKSBkaWZmZXJzIGluIHNlbWFudGljcyBmcm9tIEMrKwotICAgIC8vIHNsaWdodGx5OiB3ZSByZXR1cm4gSGFzRmllbGQoJ2VudW1fZmllbGQnKSA9PSB0cnVlIGlmIHRoZXJlIGlzCi0gICAgLy8gYW4gdW5rbm93biBlbnVtIHZhbHVlIHByZXNlbnQuIFRvIGltcGxlbWVudCB0aGlzIHdlIGhhdmUgdG8KLSAgICAvLyBsb29rIGluIHRoZSBVbmtub3duRmllbGRTZXQuCi0gICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkX3NldCA9Ci0gICAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0VW5rbm93bkZpZWxkcygqbWVzc2FnZSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkX3NldC5maWVsZF9jb3VudCgpOyArK2kpIHsKLSAgICAgIGlmICh1bmtub3duX2ZpZWxkX3NldC5maWVsZChpKS5udW1iZXIoKSA9PSBmaWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKSkgewotICAgICAgICBQeV9SRVRVUk5fVFJVRTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgUHlfUkVUVVJOX0ZBTFNFOwotfQotCi1QeU9iamVjdCogQ2xlYXJFeHRlbnNpb24oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBleHRlbnNpb24pIHsKLSAgaWYgKHNlbGYtPmV4dGVuc2lvbnMgIT0gTlVMTCkgewotICAgIHJldHVybiBleHRlbnNpb25fZGljdDo6Q2xlYXJFeHRlbnNpb24oc2VsZi0+ZXh0ZW5zaW9ucywgZXh0ZW5zaW9uKTsKLSAgfSBlbHNlIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbik7Ci0gICAgaWYgKGRlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmIChTY29wZWRQeU9iamVjdFB0cihDbGVhckZpZWxkQnlEZXNjcmlwdG9yKHNlbGYsIGRlc2NyaXB0b3IpKSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLVB5T2JqZWN0KiBIYXNFeHRlbnNpb24oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBleHRlbnNpb24pIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0RXh0ZW5zaW9uRGVzY3JpcHRvcihleHRlbnNpb24pOwotICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIEhhc0ZpZWxkQnlEZXNjcmlwdG9yKHNlbGYsIGRlc2NyaXB0b3IpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJlbGVhc2luZyBtZXNzYWdlcwotLy8KLS8vIFRoZSBQeXRob24gQVBJJ3MgQ2xlYXJGaWVsZCgpIGFuZCBDbGVhcigpIG1ldGhvZHMgYmVoYXZlCi0vLyBkaWZmZXJlbnRseSB0aGFuIHRoZWlyIEMrKyBjb3VudGVycGFydHMuICBXaGlsZSB0aGUgQysrIHZlcnNpb25zCi0vLyBjbGVhcnMgdGhlIGNoaWxkcmVuIHRoZSBQeXRob24gdmVyc2lvbnMgZGV0YWNoZXMgdGhlIGNoaWxkcmVuLAotLy8gd2l0aG91dCB0b3VjaGluZyB0aGVpciBjb250ZW50LiAgVGhpcyBpbXBlZGFuY2UgbWlzbWF0Y2ggY2F1c2VzCi0vLyBzb21lIGNvbXBsZXhpdHkgaW4gdGhlIGltcGxlbWVudGF0aW9uLCB3aGljaCBpcyBjYXB0dXJlZCBpbiB0aGlzCi0vLyBzZWN0aW9uLgotLy8KLS8vIFdoZW4gYSBDTWVzc2FnZSBmaWVsZCBpcyBjbGVhcmVkIHdlIG5lZWQgdG86Ci0vLwotLy8gKiBSZWxlYXNlIHRoZSBNZXNzYWdlIHVzZWQgYXMgdGhlIGJhY2tpbmcgc3RvcmUgZm9yIHRoZSBDTWVzc2FnZQotLy8gICBmcm9tIGl0cyBwYXJlbnQuCi0vLwotLy8gKiBDaGFuZ2UgdGhlIG93bmVyIGZpZWxkIG9mIHRoZSByZWxlYXNlZCBDTWVzc2FnZSBhbmQgYWxsIG9mIGl0cwotLy8gICBjaGlsZHJlbiB0byBwb2ludCB0byB0aGUgbmV3bHkgcmVsZWFzZWQgTWVzc2FnZS4KLS8vCi0vLyAqIENsZWFyIHRoZSB3ZWFrIHJlZmVyZW5jZXMgZnJvbSB0aGUgcmVsZWFzZWQgQ01lc3NhZ2UgdG8gdGhlCi0vLyAgIHBhcmVudC4KLS8vCi0vLyBXaGVuIGEgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIgZmllbGQgaXMgY2xlYXJlZCB3ZSBuZWVkIHRvOgotLy8KLS8vICogUmVsZWFzZSBhbGwgdGhlIE1lc3NhZ2UgdXNlZCBhcyB0aGUgYmFja2luZyBzdG9yZSBmb3IgdGhlCi0vLyAgIENNZXNzYWdlcyBzdG9yZWQgaW4gdGhlIGNvbnRhaW5lci4KLS8vCi0vLyAqIENoYW5nZSB0aGUgb3duZXIgZmllbGQgb2YgYWxsIHRoZSByZWxlYXNlZCBDTWVzc2FnZSBhbmQgYWxsIG9mCi0vLyAgIHRoZWlyIGNoaWxkcmVuIHRvIHBvaW50IHRvIHRoZSBuZXdseSByZWxlYXNlZCBNZXNzYWdlcy4KLS8vCi0vLyAqIENsZWFyIHRoZSB3ZWFrIHJlZmVyZW5jZXMgZnJvbSB0aGUgcmVsZWFzZWQgY29udGFpbmVyIHRvIHRoZQotLy8gICBwYXJlbnQuCi0KLXN0cnVjdCBTZXRPd25lclZpc2l0b3IgOiBwdWJsaWMgQ2hpbGRWaXNpdG9yIHsKLSAgLy8gbmV3X293bmVyIG11c3Qgb3V0bGl2ZSB0aGlzIG9iamVjdC4KLSAgZXhwbGljaXQgU2V0T3duZXJWaXNpdG9yKGNvbnN0IHNoYXJlZF9wdHI8TWVzc2FnZT4mIG5ld19vd25lcikKLSAgICAgIDogbmV3X293bmVyXyhuZXdfb3duZXIpIHt9Ci0KLSAgaW50IFZpc2l0UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIGNvbnRhaW5lcikgewotICAgIHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6OlNldE93bmVyKGNvbnRhaW5lciwgbmV3X293bmVyXyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpbnQgVmlzaXRSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogY29udGFpbmVyKSB7Ci0gICAgcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcjo6U2V0T3duZXIoY29udGFpbmVyLCBuZXdfb3duZXJfKTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGludCBWaXNpdE1hcENvbnRhaW5lcihNYXBDb250YWluZXIqIGNvbnRhaW5lcikgewotICAgIGNvbnRhaW5lci0+U2V0T3duZXIobmV3X293bmVyXyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICBpbnQgVmlzaXRDTWVzc2FnZShDTWVzc2FnZSogY21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgewotICAgIHJldHVybiBTZXRPd25lcihjbWVzc2FnZSwgbmV3X293bmVyXyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IHNoYXJlZF9wdHI8TWVzc2FnZT4mIG5ld19vd25lcl87Ci19OwotCi0vLyBDaGFuZ2UgdGhlIG93bmVyIG9mIHRoaXMgQ01lc3NhZ2UgYW5kIGFsbCBpdHMgY2hpbGRyZW4sIHJlY3Vyc2l2ZWx5LgotaW50IFNldE93bmVyKENNZXNzYWdlKiBzZWxmLCBjb25zdCBzaGFyZWRfcHRyPE1lc3NhZ2U+JiBuZXdfb3duZXIpIHsKLSAgc2VsZi0+b3duZXIgPSBuZXdfb3duZXI7Ci0gIGlmIChGb3JFYWNoQ29tcG9zaXRlRmllbGQoc2VsZiwgU2V0T3duZXJWaXNpdG9yKG5ld19vd25lcikpID09IC0xKQotICAgIHJldHVybiAtMTsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFJlbGVhc2VzIHRoZSBtZXNzYWdlIHNwZWNpZmllZCBieSAnZmllbGQnIGFuZCByZXR1cm5zIHRoZQotLy8gcG9pbnRlci4gSWYgdGhlIGZpZWxkIGRvZXMgbm90IGV4aXN0IGEgbmV3IG1lc3NhZ2UgaXMgY3JlYXRlZCB1c2luZwotLy8gJ2Rlc2NyaXB0b3InLiBUaGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgcG9pbnRlci4KLU1lc3NhZ2UqIFJlbGVhc2VNZXNzYWdlKENNZXNzYWdlKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgewotICBNZXNzYWdlRmFjdG9yeSogbWVzc2FnZV9mYWN0b3J5ID0gR2V0RmFjdG9yeUZvck1lc3NhZ2Uoc2VsZik7Ci0gIE1lc3NhZ2UqIHJlbGVhc2VkX21lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VNZXNzYWdlKAotICAgICAgc2VsZi0+bWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZV9mYWN0b3J5KTsKLSAgLy8gUmVsZWFzZU1lc3NhZ2Ugd2lsbCByZXR1cm4gTlVMTCB3aGljaCBkaWZmZXJzIGZyb20KLSAgLy8gY2hpbGRfY21lc3NhZ2UtPm1lc3NhZ2UsIGlmIHRoZSBmaWVsZCBkb2VzIG5vdCBleGlzdC4gIEluIHRoaXMgY2FzZSwKLSAgLy8gdGhlIGxhdHRlciBwb2ludHMgdG8gdGhlIGRlZmF1bHQgaW5zdGFuY2UgdmlhIGEgY29uc3RfY2FzdDw+LCBzbyB3ZQotICAvLyBoYXZlIHRvIHJlc2V0IGl0IHRvIGEgbmV3IG11dGFibGUgb2JqZWN0IHNpbmNlIHdlIGFyZSB0YWtpbmcgb3duZXJzaGlwLgotICBpZiAocmVsZWFzZWRfbWVzc2FnZSA9PSBOVUxMKSB7Ci0gICAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlID0gbWVzc2FnZV9mYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvcik7Ci0gICAgR09PR0xFX0RDSEVDSyhwcm90b3R5cGUgIT0gTlVMTCk7Ci0gICAgcmVsZWFzZWRfbWVzc2FnZSA9IHByb3RvdHlwZS0+TmV3KCk7Ci0gIH0KLQotICByZXR1cm4gcmVsZWFzZWRfbWVzc2FnZTsKLX0KLQotaW50IFJlbGVhc2VTdWJNZXNzYWdlKENNZXNzYWdlKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICBDTWVzc2FnZSogY2hpbGRfY21lc3NhZ2UpIHsKLSAgLy8gUmVsZWFzZSB0aGUgTWVzc2FnZQotICBzaGFyZWRfcHRyPE1lc3NhZ2U+IHJlbGVhc2VkX21lc3NhZ2UoUmVsZWFzZU1lc3NhZ2UoCi0gICAgICBzZWxmLCBjaGlsZF9jbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLCBmaWVsZF9kZXNjcmlwdG9yKSk7Ci0gIGNoaWxkX2NtZXNzYWdlLT5tZXNzYWdlID0gcmVsZWFzZWRfbWVzc2FnZS5nZXQoKTsKLSAgY2hpbGRfY21lc3NhZ2UtPm93bmVyLnN3YXAocmVsZWFzZWRfbWVzc2FnZSk7Ci0gIGNoaWxkX2NtZXNzYWdlLT5wYXJlbnQgPSBOVUxMOwotICBjaGlsZF9jbWVzc2FnZS0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBOVUxMOwotICBjaGlsZF9jbWVzc2FnZS0+cmVhZF9vbmx5ID0gZmFsc2U7Ci0gIHJldHVybiBGb3JFYWNoQ29tcG9zaXRlRmllbGQoY2hpbGRfY21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2V0T3duZXJWaXNpdG9yKGNoaWxkX2NtZXNzYWdlLT5vd25lcikpOwotfQotCi1zdHJ1Y3QgUmVsZWFzZUNoaWxkIDogcHVibGljIENoaWxkVmlzaXRvciB7Ci0gIC8vIG1lc3NhZ2UgbXVzdCBvdXRsaXZlIHRoaXMgb2JqZWN0LgotICBleHBsaWNpdCBSZWxlYXNlQ2hpbGQoQ01lc3NhZ2UqIHBhcmVudCkgOgotICAgICAgcGFyZW50XyhwYXJlbnQpIHt9Ci0KLSAgaW50IFZpc2l0UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIGNvbnRhaW5lcikgewotICAgIHJldHVybiByZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyOjpSZWxlYXNlKAotICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKj4oY29udGFpbmVyKSk7Ci0gIH0KLQotICBpbnQgVmlzaXRSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogY29udGFpbmVyKSB7Ci0gICAgcmV0dXJuIHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6OlJlbGVhc2UoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPihjb250YWluZXIpKTsKLSAgfQotCi0gIGludCBWaXNpdE1hcENvbnRhaW5lcihNYXBDb250YWluZXIqIGNvbnRhaW5lcikgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE1hcENvbnRhaW5lcio+KGNvbnRhaW5lciktPlJlbGVhc2UoKTsKLSAgfQotCi0gIGludCBWaXNpdENNZXNzYWdlKENNZXNzYWdlKiBjbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuIFJlbGVhc2VTdWJNZXNzYWdlKHBhcmVudF8sIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihjbWVzc2FnZSkpOwotICB9Ci0KLSAgQ01lc3NhZ2UqIHBhcmVudF87Ci19OwotCi1pbnQgSW50ZXJuYWxSZWxlYXNlRmllbGRCeURlc2NyaXB0b3IoCi0gICAgQ01lc3NhZ2UqIHNlbGYsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAotICAgIFB5T2JqZWN0KiBjb21wb3NpdGVfZmllbGQpIHsKLSAgcmV0dXJuIFZpc2l0Q29tcG9zaXRlRmllbGQoCi0gICAgICBmaWVsZF9kZXNjcmlwdG9yLAotICAgICAgY29tcG9zaXRlX2ZpZWxkLAotICAgICAgUmVsZWFzZUNoaWxkKHNlbGYpKTsKLX0KLQotUHlPYmplY3QqIENsZWFyRmllbGRCeURlc2NyaXB0b3IoCi0gICAgQ01lc3NhZ2UqIHNlbGYsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoZGVzY3JpcHRvciwgc2VsZi0+bWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBBc3N1cmVXcml0YWJsZShzZWxmKTsKLSAgc2VsZi0+bWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKHNlbGYtPm1lc3NhZ2UsIGRlc2NyaXB0b3IpOwotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotUHlPYmplY3QqIENsZWFyRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgaWYgKCFQeVN0cmluZ19DaGVjayhhcmcpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImZpZWxkIG5hbWUgbXVzdCBiZSBhIHN0cmluZyIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0jaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKLSAgY29uc3QgY2hhciogZmllbGRfbmFtZSA9IFB5U3RyaW5nX0FTX1NUUklORyhhcmcpOwotICBQeV9zc2l6ZV90IHNpemUgPSBQeVN0cmluZ19HRVRfU0laRShhcmcpOwotI2Vsc2UKLSAgUHlfc3NpemVfdCBzaXplOwotICBjb25zdCBjaGFyKiBmaWVsZF9uYW1lID0gUHlVbmljb2RlX0FzVVRGOEFuZFNpemUoYXJnLCAmc2l6ZSk7Ci0jZW5kaWYKLSAgQXNzdXJlV3JpdGFibGUoc2VsZik7Ci0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBTY29wZWRQeU9iamVjdFB0ciBhcmdfaW5fb25lb2Y7Ci0gIGJvb2wgaXNfaW5fb25lb2Y7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgICBGaW5kRmllbGRXaXRoT25lb2ZzKG1lc3NhZ2UsIHN0cmluZyhmaWVsZF9uYW1lLCBzaXplKSwgJmlzX2luX29uZW9mKTsKLSAgaWYgKGZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIGlmICghaXNfaW5fb25lb2YpIHsKLSAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICJQcm90b2NvbCBtZXNzYWdlIGhhcyBubyBcIiVzXCIgZmllbGQuIiwgZmllbGRfbmFtZSk7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9IGVsc2UgewotICAgICAgUHlfUkVUVVJOX05PTkU7Ci0gICAgfQotICB9IGVsc2UgaWYgKGlzX2luX29uZW9mKSB7Ci0gICAgY29uc3Qgc3RyaW5nJiBuYW1lID0gZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpOwotICAgIGFyZ19pbl9vbmVvZi5yZXNldChQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShuYW1lLmNfc3RyKCksIG5hbWUuc2l6ZSgpKSk7Ci0gICAgYXJnID0gYXJnX2luX29uZW9mLmdldCgpOwotICB9Ci0KLSAgUHlPYmplY3QqIGNvbXBvc2l0ZV9maWVsZCA9IHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMgPwotICAgICAgUHlEaWN0X0dldEl0ZW0oc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcywgYXJnKSA6IE5VTEw7Ci0KLSAgLy8gT25seSByZWxlYXNlIHRoZSBmaWVsZCBpZiB0aGVyZSdzIGEgcG9zc2liaWxpdHkgdGhhdCB0aGVyZSBhcmUKLSAgLy8gcmVmZXJlbmNlcyB0byBpdC4KLSAgaWYgKGNvbXBvc2l0ZV9maWVsZCAhPSBOVUxMKSB7Ci0gICAgaWYgKEludGVybmFsUmVsZWFzZUZpZWxkQnlEZXNjcmlwdG9yKHNlbGYsIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbXBvc2l0ZV9maWVsZCkgPCAwKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlEaWN0X0RlbEl0ZW0oc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcywgYXJnKTsKLSAgfQotICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkNsZWFyRmllbGQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNICYmCi0gICAgICAhbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCkpIHsKLSAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRfc2V0ID0KLSAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKTsKLSAgICB1bmtub3duX2ZpZWxkX3NldC0+RGVsZXRlQnlOdW1iZXIoZmllbGRfZGVzY3JpcHRvci0+bnVtYmVyKCkpOwotICB9Ci0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLVB5T2JqZWN0KiBDbGVhcihDTWVzc2FnZSogc2VsZikgewotICBBc3N1cmVXcml0YWJsZShzZWxmKTsKLSAgaWYgKEZvckVhY2hDb21wb3NpdGVGaWVsZChzZWxmLCBSZWxlYXNlQ2hpbGQoc2VsZikpID09IC0xKQotICAgIHJldHVybiBOVUxMOwotICBQeV9DTEVBUihzZWxmLT5leHRlbnNpb25zKTsKLSAgaWYgKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMpIHsKLSAgICBQeURpY3RfQ2xlYXIoc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcyk7Ci0gIH0KLSAgc2VsZi0+bWVzc2FnZS0+Q2xlYXIoKTsKLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgc3RyaW5nIEdldE1lc3NhZ2VOYW1lKENNZXNzYWdlKiBzZWxmKSB7Ci0gIGlmIChzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKLSAgfQotfQotCi1zdGF0aWMgUHlPYmplY3QqIFNlcmlhbGl6ZVRvU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBpZiAoIXNlbGYtPm1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSkgewotICAgIFNjb3BlZFB5T2JqZWN0UHRyIGVycm9ycyhGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc2VsZikpOwotICAgIGlmIChlcnJvcnMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFNjb3BlZFB5T2JqZWN0UHRyIGNvbW1hKFB5U3RyaW5nX0Zyb21TdHJpbmcoIiwiKSk7Ci0gICAgaWYgKGNvbW1hID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBTY29wZWRQeU9iamVjdFB0ciBqb2luZWQoCi0gICAgICAgIFB5T2JqZWN0X0NhbGxNZXRob2QoY29tbWEuZ2V0KCksICJqb2luIiwgIk8iLCBlcnJvcnMuZ2V0KCkpKTsKLSAgICBpZiAoam9pbmVkID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIC8vIFRPRE8oaGFiZXJtYW4pOiB0aGlzIGlzIGEgKGhvcGVmdWxseSB0ZW1wb3JhcnkpIGhhY2suICBUaGUgdW5pdCB0ZXN0aW5nCi0gICAgLy8gaW5mcmFzdHJ1Y3R1cmUgcmVsb2FkcyBhbGwgcHVyZS1QeXRob24gbW9kdWxlcyBmb3IgZXZlcnkgdGVzdCwgYnV0IG5vdAotICAgIC8vIEMrKyBtb2R1bGVzIChiZWNhdXNlIHRoYXQncyBnZW5lcmFsbHkgaW1wb3NzaWJsZToKLSAgICAvLyBodHRwOi8vYnVncy5weXRob24ub3JnL2lzc3VlMTE0NDI2MykuICBCdXQgaWYgd2UgY2FjaGUgRW5jb2RlRXJyb3IsIHdlJ2xsCi0gICAgLy8gcmV0dXJuIHRoZSBFbmNvZGVFcnJvciBmcm9tIGEgcHJldmlvdXMgbG9hZCBvZiB0aGUgbW9kdWxlLCB3aGljaCB3b24ndAotICAgIC8vIG1hdGNoIGEgdXNlcidzIGF0dGVtcHQgdG8gY2F0Y2ggRW5jb2RlRXJyb3IuICBTbyB3ZSBoYXZlIHRvIGxvb2sgaXQgdXAKLSAgICAvLyBhZ2FpbiBldmVyeSB0aW1lLgotICAgIFNjb3BlZFB5T2JqZWN0UHRyIG1lc3NhZ2VfbW9kdWxlKFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgKLSAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5tZXNzYWdlIikpOwotICAgIGlmIChtZXNzYWdlX21vZHVsZS5nZXQoKSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0KLSAgICBTY29wZWRQeU9iamVjdFB0ciBlbmNvZGVfZXJyb3IoCi0gICAgICAgIFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobWVzc2FnZV9tb2R1bGUuZ2V0KCksICJFbmNvZGVFcnJvciIpKTsKLSAgICBpZiAoZW5jb2RlX2Vycm9yLmdldCgpID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBQeUVycl9Gb3JtYXQoZW5jb2RlX2Vycm9yLmdldCgpLAotICAgICAgICAgICAgICAgICAiTWVzc2FnZSAlcyBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogJXMiLAotICAgICAgICAgICAgICAgICBHZXRNZXNzYWdlTmFtZShzZWxmKS5jX3N0cigpLCBQeVN0cmluZ19Bc1N0cmluZyhqb2luZWQuZ2V0KCkpKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpbnQgc2l6ZSA9IHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplKCk7Ci0gIGlmIChzaXplIDw9IDApIHsKLSAgICByZXR1cm4gUHlCeXRlc19Gcm9tU3RyaW5nKCIiKTsKLSAgfQotICBQeU9iamVjdCogcmVzdWx0ID0gUHlCeXRlc19Gcm9tU3RyaW5nQW5kU2l6ZShOVUxMLCBzaXplKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgY2hhciogYnVmZmVyID0gUHlCeXRlc19BU19TVFJJTkcocmVzdWx0KTsKLSAgc2VsZi0+bWVzc2FnZS0+U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihidWZmZXIpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoQ01lc3NhZ2UqIHNlbGYpIHsKLSAgc3RyaW5nIGNvbnRlbnRzOwotICBzZWxmLT5tZXNzYWdlLT5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoJmNvbnRlbnRzKTsKLSAgcmV0dXJuIFB5Qnl0ZXNfRnJvbVN0cmluZ0FuZFNpemUoY29udGVudHMuY19zdHIoKSwgY29udGVudHMuc2l6ZSgpKTsKLX0KLQotLy8gRm9ybWF0cyBwcm90byBmaWVsZHMgZm9yIGFzY2lpIGR1bXBzIHVzaW5nIHB5dGhvbiBmb3JtYXR0aW5nIGZ1bmN0aW9ucyB3aGVyZQotLy8gYXBwcm9wcmlhdGUuCi1jbGFzcyBQeXRob25GaWVsZFZhbHVlUHJpbnRlciA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlciB7Ci0gcHVibGljOgotICAvLyBQeXRob24gaGFzIHNvbWUgZGlmZmVyZW5jZXMgZnJvbSBDKysgd2hlbiBwcmludGluZyBmbG9hdGluZyBwb2ludCBudW1iZXJzLgotICAvLwotICAvLyAxKSBUcmFpbGluZyAuMCBpcyBhbHdheXMgcHJpbnRlZC4KLSAgLy8gMikgKFB5dGhvbjIpIE91dHB1dCBpcyByb3VuZGVkIHRvIDEyIGRpZ2l0cy4KLSAgLy8gMykgKFB5dGhvbjMpIFRoZSBmdWxsIHByZWNpc2lvbiBvZiB0aGUgZG91YmxlIGlzIHByZXNlcnZlZCAoYW5kIFB5dGhvbiB1c2VzCi0gIC8vICAgIERhdmlkIE0uIEdheSdzIGR0b2EoKSwgd2hlbiB0aGUgQysrIGNvZGUgdXNlcyBTaW1wbGVEdG9hLiBUaGVyZSBhcmUgc29tZQotICAvLyAgICBkaWZmZXJlbmNlcywgYnV0IHRoZXkgcmFyZWx5IGhhcHBlbikKLSAgLy8KLSAgLy8gV2Ugb3ZlcnJpZGUgZmxvYXRpbmcgcG9pbnQgcHJpbnRpbmcgd2l0aCB0aGUgQy1BUEkgZnVuY3Rpb24gZm9yIHByaW50aW5nCi0gIC8vIFB5dGhvbiBmbG9hdHMgdG8gZW5zdXJlIGNvbnNpc3RlbmN5LgotICBzdHJpbmcgUHJpbnRGbG9hdChmbG9hdCB2YWx1ZSkgY29uc3QgeyByZXR1cm4gUHJpbnREb3VibGUodmFsdWUpOyB9Ci0gIHN0cmluZyBQcmludERvdWJsZShkb3VibGUgdmFsdWUpIGNvbnN0IHsKLSAgICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIGlzIG5vdCBoaWdobHkgb3B0aW1pemVkIChpdCBhbGxvY2F0ZXMgdHdvIHRlbXBvcmFyeQotICAgIC8vIFB5dGhvbiBvYmplY3RzKSBidXQgaXQgaXMgc2ltcGxlIGFuZCBwb3J0YWJsZS4gIElmIHRoaXMgaXMgc2hvd24gdG8gYmUgYQotICAgIC8vIHBlcmZvcm1hbmNlIGJvdHRsZW5lY2ssIHdlIGNhbiBvcHRpbWl6ZSBpdCwgYnV0IHRoZSByZXN1bHRzIHdpbGwgbGlrZWx5Ci0gICAgLy8gYmUgbW9yZSBjb21wbGljYXRlZCB0byBhY2NvbW1vZGF0ZSB0aGUgZGlmZmVyaW5nIGJlaGF2aW9yIG9mIGRvdWJsZQotICAgIC8vIGZvcm1hdHRpbmcgYmV0d2VlbiBQeXRob24gMiBhbmQgUHl0aG9uIDMuCi0gICAgLy8KLSAgICAvLyAoVGhvdWdoIGEgdmFsaWQgcXVlc3Rpb24gaXM6IGRvIHdlIHJlYWxseSB3YW50IHRvIG1ha2Ugb3V0IG91dHB1dAotICAgIC8vIGRlcGVuZGVudCBvbiB0aGUgUHl0aG9uIHZlcnNpb24/KQotICAgIFNjb3BlZFB5T2JqZWN0UHRyIHB5X3ZhbHVlKFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSkpOwotICAgIGlmICghcHlfdmFsdWUuZ2V0KCkpIHsKLSAgICAgIHJldHVybiBzdHJpbmcoKTsKLSAgICB9Ci0KLSAgICBTY29wZWRQeU9iamVjdFB0ciBweV9zdHIoUHlPYmplY3RfU3RyKHB5X3ZhbHVlLmdldCgpKSk7Ci0gICAgaWYgKCFweV9zdHIuZ2V0KCkpIHsKLSAgICAgIHJldHVybiBzdHJpbmcoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gc3RyaW5nKFB5U3RyaW5nX0FzU3RyaW5nKHB5X3N0ci5nZXQoKSkpOwotICB9Ci19OwotCi1zdGF0aWMgUHlPYmplY3QqIFRvU3RyKENNZXNzYWdlKiBzZWxmKSB7Ci0gIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKLSAgLy8gUGFzc2VzIG93bmVyc2hpcAotICBwcmludGVyLlNldERlZmF1bHRGaWVsZFZhbHVlUHJpbnRlcihuZXcgUHl0aG9uRmllbGRWYWx1ZVByaW50ZXIoKSk7Ci0gIHByaW50ZXIuU2V0SGlkZVVua25vd25GaWVsZHModHJ1ZSk7Ci0gIHN0cmluZyBvdXRwdXQ7Ci0gIGlmICghcHJpbnRlci5QcmludFRvU3RyaW5nKCpzZWxmLT5tZXNzYWdlLCAmb3V0cHV0KSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAiVW5hYmxlIHRvIGNvbnZlcnQgbWVzc2FnZSB0byBzdHIiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhvdXRwdXQuY19zdHIoKSk7Ci19Ci0KLVB5T2JqZWN0KiBNZXJnZUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ01lc3NhZ2UqIG90aGVyX21lc3NhZ2U7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGFyZywgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgIlBhcmFtZXRlciB0byBNZXJnZUZyb20oKSBtdXN0IGJlIGluc3RhbmNlIG9mIHNhbWUgY2xhc3M6ICIKLSAgICAgICAgICAgICAgICAgImV4cGVjdGVkICVzIGdvdCAlcy4iLAotICAgICAgICAgICAgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIFB5X1RZUEUoYXJnKS0+dHBfbmFtZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7Ci0gIGlmIChvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgIT0KLSAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJQYXJhbWV0ZXIgdG8gTWVyZ2VGcm9tKCkgbXVzdCBiZSBpbnN0YW5jZSBvZiBzYW1lIGNsYXNzOiAiCi0gICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBnb3QgJXMuIiwKLSAgICAgICAgICAgICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICBvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotCi0gIC8vIFRPRE8odGliZWxsKTogTWVzc2FnZTo6TWVyZ2VGcm9tIG1pZ2h0IHR1cm4gc29tZSBjaGlsZCBNZXNzYWdlcwotICAvLyBpbnRvIG11dGFibGUgbWVzc2FnZXMsIGludmFsaWRhdGluZyB0aGUgbWVzc2FnZSBmaWVsZCBpbiB0aGUKLSAgLy8gY29ycmVzcG9uZGluZyBDTWVzc2FnZXMuICBXZSBzaG91bGQgcnVuIGEgRml4dXBNZXNzYWdlUmVmZXJlbmNlcwotICAvLyBwYXNzIGhlcmUuCi0KLSAgc2VsZi0+bWVzc2FnZS0+TWVyZ2VGcm9tKCpvdGhlcl9tZXNzYWdlLT5tZXNzYWdlKTsKLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ29weUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ01lc3NhZ2UqIG90aGVyX21lc3NhZ2U7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGFyZywgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgIlBhcmFtZXRlciB0byBDb3B5RnJvbSgpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzczogIgotICAgICAgICAgICAgICAgICAiZXhwZWN0ZWQgJXMgZ290ICVzLiIsCi0gICAgICAgICAgICAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgUHlfVFlQRShhcmcpLT50cF9uYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIG90aGVyX21lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oYXJnKTsKLQotICBpZiAoc2VsZiA9PSBvdGhlcl9tZXNzYWdlKSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLQotICBpZiAob3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9Ci0gICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVHlwZUVycm9yLAotICAgICAgICAgICAgICAgICAiUGFyYW1ldGVyIHRvIENvcHlGcm9tKCkgbXVzdCBiZSBpbnN0YW5jZSBvZiBzYW1lIGNsYXNzOiAiCi0gICAgICAgICAgICAgICAgICJleHBlY3RlZCAlcyBnb3QgJXMuIiwKLSAgICAgICAgICAgICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICBvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgQXNzdXJlV3JpdGFibGUoc2VsZik7Ci0KLSAgLy8gQ29weUZyb20gb24gdGhlIG1lc3NhZ2Ugd2lsbCBub3QgY2xlYW4gdXAgc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcywKLSAgLy8gd2hpY2ggY2FuIGxlYXZlIHVzIGluIGFuIGluY29uc2lzdGVudCBzdGF0ZSwgc28gY2xlYXIgaXQgb3V0IGhlcmUuCi0gICh2b2lkKVNjb3BlZFB5T2JqZWN0UHRyKENsZWFyKHNlbGYpKTsKLQotICBzZWxmLT5tZXNzYWdlLT5Db3B5RnJvbSgqb3RoZXJfbWVzc2FnZS0+bWVzc2FnZSk7Ci0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLS8vIFByb3RvYnVmIGhhcyBhIDY0TUIgbGltaXQgYnVpbHQgaW4sIHRoaXMgdmFyaWFibGUgd2lsbCBvdmVycmlkZSB0aGlzLiBQbGVhc2UKLS8vIGRvIG5vdCBlbmFibGUgdGhpcyB1bmxlc3MgeW91IGZ1bGx5IHVuZGVyc3RhbmQgdGhlIGltcGxpY2F0aW9uczogcHJvdG9idWZzCi0vLyBtdXN0IGFsbCBiZSBrZXB0IGluIG1lbW9yeSBhdCB0aGUgc2FtZSB0aW1lLCBzbyBpZiB0aGV5IGdyb3cgdG9vIGJpZyB5b3UgbWF5Ci0vLyBnZXQgT09NIGVycm9ycy4gVGhlIHByb3RvYnVmIEFQSXMgZG8gbm90IHByb3ZpZGUgYW55IHRvb2xzIGZvciBwcm9jZXNzaW5nCi0vLyBwcm90b2J1ZnMgaW4gY2h1bmtzLiAgSWYgeW91IGhhdmUgcHJvdG9zIHRoaXMgYmlnIHlvdSBzaG91bGQgYnJlYWsgdGhlbSB1cCBpZgotLy8gaXQgaXMgYXQgYWxsIGNvbnZlbmllbnQgdG8gZG8gc28uCi1zdGF0aWMgYm9vbCBhbGxvd19vdmVyc2l6ZV9wcm90b3MgPSBmYWxzZTsKLQotLy8gUHJvdmlkZSBhIG1ldGhvZCBpbiB0aGUgbW9kdWxlIHRvIHNldCBhbGxvd19vdmVyc2l6ZV9wcm90b3MgdG8gYSBib29sZWFuCi0vLyB2YWx1ZS4gVGhpcyBtZXRob2QgcmV0dXJucyB0aGUgbmV3bHkgdmFsdWUgb2YgYWxsb3dfb3ZlcnNpemVfcHJvdG9zLgotc3RhdGljIFB5T2JqZWN0KiBTZXRBbGxvd092ZXJzaXplUHJvdG9zKFB5T2JqZWN0KiBtLCBQeU9iamVjdCogYXJnKSB7Ci0gIGlmICghYXJnIHx8ICFQeUJvb2xfQ2hlY2soYXJnKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJBcmd1bWVudCB0byBTZXRBbGxvd092ZXJzaXplUHJvdG9zIG11c3QgYmUgYm9vbGVhbiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGFsbG93X292ZXJzaXplX3Byb3RvcyA9IFB5T2JqZWN0X0lzVHJ1ZShhcmcpOwotICBpZiAoYWxsb3dfb3ZlcnNpemVfcHJvdG9zKSB7Ci0gICAgUHlfUkVUVVJOX1RSVUU7Ci0gIH0gZWxzZSB7Ci0gICAgUHlfUkVUVVJOX0ZBTFNFOwotICB9Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogTWVyZ2VGcm9tU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIGNvbnN0IHZvaWQqIGRhdGE7Ci0gIFB5X3NzaXplX3QgZGF0YV9sZW5ndGg7Ci0gIGlmIChQeU9iamVjdF9Bc1JlYWRCdWZmZXIoYXJnLCAmZGF0YSwgJmRhdGFfbGVuZ3RoKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSwgZGF0YV9sZW5ndGgpOwotICBpZiAoYWxsb3dfb3ZlcnNpemVfcHJvdG9zKSB7Ci0gICAgaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KElOVF9NQVgsIElOVF9NQVgpOwotICB9Ci0gIFB5RGVzY3JpcHRvclBvb2wqIHBvb2wgPSBHZXREZXNjcmlwdG9yUG9vbEZvck1lc3NhZ2Uoc2VsZik7Ci0gIGlucHV0LlNldEV4dGVuc2lvblJlZ2lzdHJ5KHBvb2wtPnBvb2wsIHBvb2wtPm1lc3NhZ2VfZmFjdG9yeSk7Ci0gIGJvb2wgc3VjY2VzcyA9IHNlbGYtPm1lc3NhZ2UtPk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgmaW5wdXQpOwotICBpZiAoc3VjY2VzcykgewotICAgIHJldHVybiBQeUludF9Gcm9tTG9uZyhpbnB1dC5DdXJyZW50UG9zaXRpb24oKSk7Ci0gIH0gZWxzZSB7Ci0gICAgUHlFcnJfRm9ybWF0KERlY29kZUVycm9yX2NsYXNzLCAiRXJyb3IgcGFyc2luZyBtZXNzYWdlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotc3RhdGljIFB5T2JqZWN0KiBQYXJzZUZyb21TdHJpbmcoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKENsZWFyKHNlbGYpKSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIE1lcmdlRnJvbVN0cmluZyhzZWxmLCBhcmcpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEJ5dGVTaXplKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFJlZ2lzdGVyRXh0ZW5zaW9uKFB5T2JqZWN0KiBjbHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBleHRlbnNpb25faGFuZGxlKSB7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9Ci0gICAgICBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGV4dGVuc2lvbl9oYW5kbGUpOwotICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBTY29wZWRQeU9iamVjdFB0ciBleHRlbnNpb25zX2J5X25hbWUoCi0gICAgICBQeU9iamVjdF9HZXRBdHRyKGNscywga19leHRlbnNpb25zX2J5X25hbWUpKTsKLSAgaWYgKGV4dGVuc2lvbnNfYnlfbmFtZSA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIm5vIGV4dGVuc2lvbnNfYnlfbmFtZSBvbiBjbGFzcyIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfbmFtZShQeU9iamVjdF9HZXRBdHRyKGV4dGVuc2lvbl9oYW5kbGUsIGtmdWxsX25hbWUpKTsKLSAgaWYgKGZ1bGxfbmFtZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBJZiB0aGUgZXh0ZW5zaW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQsIGNoZWNrIHRoYXQgaXQgaXMgdGhlIHNhbWUuCi0gIFB5T2JqZWN0KiBleGlzdGluZ19leHRlbnNpb24gPQotICAgICAgUHlEaWN0X0dldEl0ZW0oZXh0ZW5zaW9uc19ieV9uYW1lLmdldCgpLCBmdWxsX25hbWUuZ2V0KCkpOwotICBpZiAoZXhpc3RpbmdfZXh0ZW5zaW9uICE9IE5VTEwpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4aXN0aW5nX2V4dGVuc2lvbl9kZXNjcmlwdG9yID0KLSAgICAgICAgR2V0RXh0ZW5zaW9uRGVzY3JpcHRvcihleGlzdGluZ19leHRlbnNpb24pOwotICAgIGlmIChleGlzdGluZ19leHRlbnNpb25fZGVzY3JpcHRvciAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVmFsdWVFcnJvciwgIkRvdWJsZSByZWdpc3RyYXRpb24gb2YgRXh0ZW5zaW9ucyIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIC8vIE5vdGhpbmcgZWxzZSB0byBkby4KLSAgICBQeV9SRVRVUk5fTk9ORTsKLSAgfQotCi0gIGlmIChQeURpY3RfU2V0SXRlbShleHRlbnNpb25zX2J5X25hbWUuZ2V0KCksIGZ1bGxfbmFtZS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gQWxzbyBzdG9yZSBhIG1hcHBpbmcgZnJvbSBleHRlbnNpb24gbnVtYmVyIHRvIGltcGxlbWVudGluZyBjbGFzcy4KLSAgU2NvcGVkUHlPYmplY3RQdHIgZXh0ZW5zaW9uc19ieV9udW1iZXIoCi0gICAgICBQeU9iamVjdF9HZXRBdHRyKGNscywga19leHRlbnNpb25zX2J5X251bWJlcikpOwotICBpZiAoZXh0ZW5zaW9uc19ieV9udW1iZXIgPT0gTlVMTCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJubyBleHRlbnNpb25zX2J5X251bWJlciBvbiBjbGFzcyIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgU2NvcGVkUHlPYmplY3RQdHIgbnVtYmVyKFB5T2JqZWN0X0dldEF0dHJTdHJpbmcoZXh0ZW5zaW9uX2hhbmRsZSwgIm51bWJlciIpKTsKLSAgaWYgKG51bWJlciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBJZiB0aGUgZXh0ZW5zaW9uIHdhcyBhbHJlYWR5IHJlZ2lzdGVyZWQgYnkgbnVtYmVyLCBjaGVjayB0aGF0IGl0IGlzIHRoZQotICAvLyBzYW1lLgotICBleGlzdGluZ19leHRlbnNpb24gPSBQeURpY3RfR2V0SXRlbShleHRlbnNpb25zX2J5X251bWJlci5nZXQoKSwgbnVtYmVyLmdldCgpKTsKLSAgaWYgKGV4aXN0aW5nX2V4dGVuc2lvbiAhPSBOVUxMKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleGlzdGluZ19leHRlbnNpb25fZGVzY3JpcHRvciA9Ci0gICAgICAgIEdldEV4dGVuc2lvbkRlc2NyaXB0b3IoZXhpc3RpbmdfZXh0ZW5zaW9uKTsKLSAgICBpZiAoZXhpc3RpbmdfZXh0ZW5zaW9uX2Rlc2NyaXB0b3IgIT0gZGVzY3JpcHRvcikgewotICAgICAgY29uc3QgRGVzY3JpcHRvciogbXNnX2Rlc2MgPSBHZXRNZXNzYWdlRGVzY3JpcHRvcigKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PFB5VHlwZU9iamVjdCo+KGNscykpOwotICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgIFB5RXhjX1ZhbHVlRXJyb3IsCi0gICAgICAgICAgIkV4dGVuc2lvbnMgXCIlc1wiIGFuZCBcIiVzXCIgYm90aCB0cnkgdG8gZXh0ZW5kIG1lc3NhZ2UgdHlwZSAiCi0gICAgICAgICAgIlwiJXNcIiB3aXRoIGZpZWxkIG51bWJlciAlbGQuIiwKLSAgICAgICAgICBleGlzdGluZ19leHRlbnNpb25fZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKS5jX3N0cigpLAotICAgICAgICAgIG1zZ19kZXNjLT5mdWxsX25hbWUoKS5jX3N0cigpLAotICAgICAgICAgIFB5SW50X0FzTG9uZyhudW1iZXIuZ2V0KCkpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICAvLyBOb3RoaW5nIGVsc2UgdG8gZG8uCi0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLSAgaWYgKFB5RGljdF9TZXRJdGVtKGV4dGVuc2lvbnNfYnlfbnVtYmVyLmdldCgpLCBudW1iZXIuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25faGFuZGxlKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIENoZWNrIGlmIGl0J3MgYSBtZXNzYWdlIHNldAotICBpZiAoZGVzY3JpcHRvci0+aXNfZXh0ZW5zaW9uKCkgJiYKLSAgICAgIGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSAmJgotICAgICAgZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCi0gICAgICBkZXNjcmlwdG9yLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwpIHsKLSAgICBTY29wZWRQeU9iamVjdFB0ciBtZXNzYWdlX25hbWUoUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUoCi0gICAgICAgIGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKS5jX3N0cigpLAotICAgICAgICBkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCkuc2l6ZSgpKSk7Ci0gICAgaWYgKG1lc3NhZ2VfbmFtZSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlEaWN0X1NldEl0ZW0oZXh0ZW5zaW9uc19ieV9uYW1lLmdldCgpLCBtZXNzYWdlX25hbWUuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZSk7Ci0gIH0KLQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBTZXRJblBhcmVudChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgQXNzdXJlV3JpdGFibGUoc2VsZik7Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFdoaWNoT25lb2YoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgUHlfc3NpemVfdCBuYW1lX3NpemU7Ci0gIGNoYXIgKm5hbWVfZGF0YTsKLSAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZuYW1lX2RhdGEsICZuYW1lX3NpemUpIDwgMCkKLSAgICByZXR1cm4gTlVMTDsKLSAgc3RyaW5nIG9uZW9mX25hbWUgPSBzdHJpbmcobmFtZV9kYXRhLCBuYW1lX3NpemUpOwotICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2MgPQotICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kT25lb2ZCeU5hbWUob25lb2ZfbmFtZSk7Ci0gIGlmIChvbmVvZl9kZXNjID09IE5VTEwpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgIlByb3RvY29sIG1lc3NhZ2UgaGFzIG5vIG9uZW9mIFwiJXNcIiBmaWVsZC4iLAotICAgICAgICAgICAgICAgICBvbmVvZl9uYW1lLmNfc3RyKCkpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfaW5fb25lb2YgPQotICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigKLSAgICAgICAgICAqc2VsZi0+bWVzc2FnZSwgb25lb2ZfZGVzYyk7Ci0gIGlmIChmaWVsZF9pbl9vbmVvZiA9PSBOVUxMKSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0gZWxzZSB7Ci0gICAgY29uc3Qgc3RyaW5nJiBuYW1lID0gZmllbGRfaW5fb25lb2YtPm5hbWUoKTsKLSAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZ0FuZFNpemUobmFtZS5jX3N0cigpLCBuYW1lLnNpemUoKSk7Ci0gIH0KLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRFeHRlbnNpb25EaWN0KENNZXNzYWdlKiBzZWxmLCB2b2lkICpjbG9zdXJlKTsKLQotc3RhdGljIFB5T2JqZWN0KiBMaXN0RmllbGRzKENNZXNzYWdlKiBzZWxmKSB7Ci0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0gIHNlbGYtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcygqc2VsZi0+bWVzc2FnZSwgJmZpZWxkcyk7Ci0KLSAgLy8gTm9ybWFsbHksIHRoZSBsaXN0IHdpbGwgYmUgZXhhY3RseSB0aGUgc2l6ZSBvZiB0aGUgZmllbGRzLgotICBTY29wZWRQeU9iamVjdFB0ciBhbGxfZmllbGRzKFB5TGlzdF9OZXcoZmllbGRzLnNpemUoKSkpOwotICBpZiAoYWxsX2ZpZWxkcyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBXaGVuIHRoZXJlIGFyZSB1bmtub3duIGV4dGVuc2lvbnMsIHRoZSBweSBsaXN0IHdpbGwgKm5vdCogY29udGFpbgotICAvLyB0aGUgZmllbGQgaW5mb3JtYXRpb24uICBUaHVzIHRoZSBhY3R1YWwgc2l6ZSBvZiB0aGUgcHkgbGlzdCB3aWxsIGJlCi0gIC8vIHNtYWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBmaWVsZHMuICBTZXQgdGhlIGFjdHVhbCBzaXplIGF0IHRoZSBlbmQuCi0gIFB5X3NzaXplX3QgYWN0dWFsX3NpemUgPSAwOwotICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgewotICAgIFNjb3BlZFB5T2JqZWN0UHRyIHQoUHlUdXBsZV9OZXcoMikpOwotICAgIGlmICh0ID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIGlmIChmaWVsZHNbaV0tPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgICBTY29wZWRQeU9iamVjdFB0ciBleHRlbnNpb25fZmllbGQoCi0gICAgICAgICAgUHlGaWVsZERlc2NyaXB0b3JfRnJvbURlc2NyaXB0b3IoZmllbGRzW2ldKSk7Ci0gICAgICBpZiAoZXh0ZW5zaW9uX2ZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICAvLyBXaXRoIEMrKyBkZXNjcmlwdG9ycywgdGhlIGZpZWxkIGNhbiBhbHdheXMgYmUgcmV0cmlldmVkLCBidXQgZm9yCi0gICAgICAvLyB1bmtub3duIGV4dGVuc2lvbnMgd2hpY2ggaGF2ZSBub3QgYmVlbiBpbXBvcnRlZCBpbiBQeXRob24gY29kZSwgdGhlcmUKLSAgICAgIC8vIGlzIG5vIG1lc3NhZ2UgY2xhc3MgYW5kIHdlIGNhbm5vdCByZXRyaWV2ZSB0aGUgdmFsdWUuCi0gICAgICAvLyBUT0RPKGFtYXVyeWZhKTogY29uc2lkZXIgYnVpbGRpbmcgdGhlIGNsYXNzIG9uIHRoZSBmbHkhCi0gICAgICBpZiAoZmllbGRzW2ldLT5tZXNzYWdlX3R5cGUoKSAhPSBOVUxMICYmCi0gICAgICAgICAgY2Rlc2NyaXB0b3JfcG9vbDo6R2V0TWVzc2FnZUNsYXNzKAotICAgICAgICAgICAgICBHZXREZXNjcmlwdG9yUG9vbEZvck1lc3NhZ2Uoc2VsZiksCi0gICAgICAgICAgICAgIGZpZWxkc1tpXS0+bWVzc2FnZV90eXBlKCkpID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfQ2xlYXIoKTsKLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0gICAgICBTY29wZWRQeU9iamVjdFB0ciBleHRlbnNpb25zKEdldEV4dGVuc2lvbkRpY3Qoc2VsZiwgTlVMTCkpOwotICAgICAgaWYgKGV4dGVuc2lvbnMgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIC8vICdleHRlbnNpb24nIHJlZmVyZW5jZSBsYXRlciBzdG9sZW4gYnkgUHlUdXBsZV9TRVRfSVRFTS4KLSAgICAgIFB5T2JqZWN0KiBleHRlbnNpb24gPSBQeU9iamVjdF9HZXRJdGVtKAotICAgICAgICAgIGV4dGVuc2lvbnMuZ2V0KCksIGV4dGVuc2lvbl9maWVsZC5nZXQoKSk7Ci0gICAgICBpZiAoZXh0ZW5zaW9uID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBQeVR1cGxlX1NFVF9JVEVNKHQuZ2V0KCksIDAsIGV4dGVuc2lvbl9maWVsZC5yZWxlYXNlKCkpOwotICAgICAgLy8gU3RlYWxzIHJlZmVyZW5jZSB0byAnZXh0ZW5zaW9uJwotICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0LmdldCgpLCAxLCBleHRlbnNpb24pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBOb3JtYWwgZmllbGQKLSAgICAgIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSA9IGZpZWxkc1tpXS0+bmFtZSgpOwotICAgICAgU2NvcGVkUHlPYmplY3RQdHIgcHlfZmllbGRfbmFtZShQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgICAgICBmaWVsZF9uYW1lLmNfc3RyKCksIGZpZWxkX25hbWUubGVuZ3RoKCkpKTsKLSAgICAgIGlmIChweV9maWVsZF9uYW1lID09IE5VTEwpIHsKLSAgICAgICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1ZhbHVlRXJyb3IsICJiYWQgc3RyaW5nIik7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgICAgU2NvcGVkUHlPYmplY3RQdHIgZmllbGRfZGVzY3JpcHRvcigKLSAgICAgICAgICBQeUZpZWxkRGVzY3JpcHRvcl9Gcm9tRGVzY3JpcHRvcihmaWVsZHNbaV0pKTsKLSAgICAgIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0KLSAgICAgIFB5T2JqZWN0KiBmaWVsZF92YWx1ZSA9IEdldEF0dHIoc2VsZiwgcHlfZmllbGRfbmFtZS5nZXQoKSk7Ci0gICAgICBpZiAoZmllbGRfdmFsdWUgPT0gTlVMTCkgewotICAgICAgICBQeUVycl9TZXRPYmplY3QoUHlFeGNfVmFsdWVFcnJvciwgcHlfZmllbGRfbmFtZS5nZXQoKSk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgICAgUHlUdXBsZV9TRVRfSVRFTSh0LmdldCgpLCAwLCBmaWVsZF9kZXNjcmlwdG9yLnJlbGVhc2UoKSk7Ci0gICAgICBQeVR1cGxlX1NFVF9JVEVNKHQuZ2V0KCksIDEsIGZpZWxkX3ZhbHVlKTsKLSAgICB9Ci0gICAgUHlMaXN0X1NFVF9JVEVNKGFsbF9maWVsZHMuZ2V0KCksIGFjdHVhbF9zaXplLCB0LnJlbGVhc2UoKSk7Ci0gICAgKythY3R1YWxfc2l6ZTsKLSAgfQotICBpZiAoc3RhdGljX2Nhc3Q8c2l6ZV90PihhY3R1YWxfc2l6ZSkgIT0gZmllbGRzLnNpemUoKSAmJgotICAgICAgKFB5TGlzdF9TZXRTbGljZShhbGxfZmllbGRzLmdldCgpLCBhY3R1YWxfc2l6ZSwgZmllbGRzLnNpemUoKSwgTlVMTCkgPAotICAgICAgIDApKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGFsbF9maWVsZHMucmVsZWFzZSgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIERpc2NhcmRVbmtub3duRmllbGRzKENNZXNzYWdlKiBzZWxmKSB7Ci0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotICBzZWxmLT5tZXNzYWdlLT5EaXNjYXJkVW5rbm93bkZpZWxkcygpOwotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotUHlPYmplY3QqIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhDTWVzc2FnZSogc2VsZikgewotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotICBtZXNzYWdlLT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7Ci0KLSAgUHlPYmplY3QqIGVycm9yX2xpc3QgPSBQeUxpc3RfTmV3KGVycm9ycy5zaXplKCkpOwotICBpZiAoZXJyb3JfbGlzdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZm9yIChzaXplX3QgaSA9IDA7IGkgPCBlcnJvcnMuc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBzdHJpbmcmIGVycm9yID0gZXJyb3JzW2ldOwotICAgIFB5T2JqZWN0KiBlcnJvcl9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgICAgZXJyb3IuY19zdHIoKSwgZXJyb3IubGVuZ3RoKCkpOwotICAgIGlmIChlcnJvcl9zdHJpbmcgPT0gTlVMTCkgewotICAgICAgUHlfREVDUkVGKGVycm9yX2xpc3QpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFB5TGlzdF9TRVRfSVRFTShlcnJvcl9saXN0LCBpLCBlcnJvcl9zdHJpbmcpOwotICB9Ci0gIHJldHVybiBlcnJvcl9saXN0OwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFJpY2hDb21wYXJlKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogb3RoZXIsIGludCBvcGlkKSB7Ci0gIC8vIE9ubHkgZXF1YWxpdHkgY29tcGFyaXNvbnMgYXJlIGltcGxlbWVudGVkLgotICBpZiAob3BpZCAhPSBQeV9FUSAmJiBvcGlkICE9IFB5X05FKSB7Ci0gICAgUHlfSU5DUkVGKFB5X05vdEltcGxlbWVudGVkKTsKLSAgICByZXR1cm4gUHlfTm90SW1wbGVtZW50ZWQ7Ci0gIH0KLSAgYm9vbCBlcXVhbHMgPSB0cnVlOwotICAvLyBJZiBvdGhlciBpcyBub3QgYSBtZXNzYWdlLCBpdCBjYW5ub3QgYmUgZXF1YWwuCi0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG90aGVyLCAmQ01lc3NhZ2VfVHlwZSkpIHsKLSAgICBlcXVhbHMgPSBmYWxzZTsKLSAgfQotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBvdGhlcl9tZXNzYWdlID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihvdGhlciktPm1lc3NhZ2U7Ci0gIC8vIElmIG1lc3NhZ2VzIGRvbid0IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvcnMsIHRoZXkgYXJlIG5vdCBlcXVhbC4KLSAgaWYgKGVxdWFscyAmJgotICAgICAgc2VsZi0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9IG90aGVyX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSkgewotICAgIGVxdWFscyA9IGZhbHNlOwotICB9Ci0gIC8vIENoZWNrIHRoZSBtZXNzYWdlIGNvbnRlbnRzLgotICBpZiAoZXF1YWxzICYmICFnb29nbGU6OnByb3RvYnVmOjp1dGlsOjpNZXNzYWdlRGlmZmVyZW5jZXI6OkVxdWFscygKLSAgICAgICAgICAqc2VsZi0+bWVzc2FnZSwKLSAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KG90aGVyKS0+bWVzc2FnZSkpIHsKLSAgICBlcXVhbHMgPSBmYWxzZTsKLSAgfQotICBpZiAoZXF1YWxzIF4gKG9waWQgPT0gUHlfRVEpKSB7Ci0gICAgUHlfUkVUVVJOX0ZBTFNFOwotICB9IGVsc2UgewotICAgIFB5X1JFVFVSTl9UUlVFOwotICB9Ci19Ci0KLVB5T2JqZWN0KiBJbnRlcm5hbEdldFNjYWxhcihjb25zdCBNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgewotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFB5T2JqZWN0KiByZXN1bHQgPSBOVUxMOwotICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogewotICAgICAgaW50MzIgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRJbnQzMigqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKLSAgICAgIGludDY0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0SW50NjQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7Ci0gICAgICB1aW50MzIgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRVSW50MzIoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbVNpemVfdCh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7Ci0gICAgICB1aW50NjQgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRVSW50NjQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDogewotICAgICAgZmxvYXQgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRGbG9hdCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogewotICAgICAgZG91YmxlIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0RG91YmxlKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogewotICAgICAgYm9vbCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldEJvb2woKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgICAgcmVzdWx0ID0gUHlCb29sX0Zyb21Mb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKLSAgICAgIHN0cmluZyB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFN0cmluZygqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgICByZXN1bHQgPSBUb1N0cmluZ09iamVjdChmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgaWYgKCFtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSAmJgotICAgICAgICAgICFtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKSkgewotICAgICAgICAvLyBMb29rIGZvciB0aGUgdmFsdWUgaW4gdGhlIHVua25vd24gZmllbGRzLgotICAgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRfc2V0ID0KLSAgICAgICAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0VW5rbm93bkZpZWxkcygqbWVzc2FnZSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZF9zZXQuZmllbGRfY291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgaWYgKHVua25vd25fZmllbGRfc2V0LmZpZWxkKGkpLm51bWJlcigpID09Ci0gICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpICYmCi0gICAgICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LmZpZWxkKGkpLnR5cGUoKSA9PQotICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh1bmtub3duX2ZpZWxkX3NldC5maWVsZChpKS52YXJpbnQoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQotICAgICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRFbnVtKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgICAgICAgcmVzdWx0ID0gUHlJbnRfRnJvbUxvbmcoZW51bV92YWx1ZS0+bnVtYmVyKCkpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJHZXR0aW5nIGEgdmFsdWUgZnJvbSBhIGZpZWxkIG9mIHVua25vd24gdHlwZSAlZCIsCi0gICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1QeU9iamVjdCogSW50ZXJuYWxHZXRTdWJNZXNzYWdlKAotICAgIENNZXNzYWdlKiBzZWxmLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHNlbGYtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgUHlEZXNjcmlwdG9yUG9vbCogcG9vbCA9IEdldERlc2NyaXB0b3JQb29sRm9yTWVzc2FnZShzZWxmKTsKLSAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAotICAgICAgKnNlbGYtPm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHBvb2wtPm1lc3NhZ2VfZmFjdG9yeSk7Ci0KLSAgQ01lc3NhZ2VDbGFzcyogbWVzc2FnZV9jbGFzcyA9IGNkZXNjcmlwdG9yX3Bvb2w6OkdldE1lc3NhZ2VDbGFzcygKLSAgICAgIHBvb2wsIGZpZWxkX2Rlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKLSAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgQ01lc3NhZ2UqIGNtc2cgPSBjbWVzc2FnZTo6TmV3RW1wdHlNZXNzYWdlKG1lc3NhZ2VfY2xhc3MpOwotICBpZiAoY21zZyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBjbXNnLT5vd25lciA9IHNlbGYtPm93bmVyOwotICBjbXNnLT5wYXJlbnQgPSBzZWxmOwotICBjbXNnLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciA9IGZpZWxkX2Rlc2NyaXB0b3I7Ci0gIGNtc2ctPnJlYWRfb25seSA9ICFyZWZsZWN0aW9uLT5IYXNGaWVsZCgqc2VsZi0+bWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gIGNtc2ctPm1lc3NhZ2UgPSBjb25zdF9jYXN0PE1lc3NhZ2UqPigmc3ViX21lc3NhZ2UpOwotCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oY21zZyk7Ci19Ci0KLWludCBJbnRlcm5hbFNldE5vbk9uZW9mU2NhbGFyKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAotICAgIFB5T2JqZWN0KiBhcmcpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSwgLTEpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0SW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUsIC0xKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldEludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGFyZywgdmFsdWUsIC0xKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChhcmcsIHZhbHVlLCAtMSk7Ci0gICAgICByZWZsZWN0aW9uLT5TZXRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUsIC0xKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldEZsb2F0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfRE9VQkxFKGFyZywgdmFsdWUsIC0xKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKGFyZywgdmFsdWUsIC0xKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldEJvb2wobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogewotICAgICAgaWYgKCFDaGVja0FuZFNldFN0cmluZygKLSAgICAgICAgICBhcmcsIG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHJlZmxlY3Rpb24sIGZhbHNlLCAtMSkpIHsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSwgLTEpOwotICAgICAgaWYgKHJlZmxlY3Rpb24tPlN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSkgewotICAgICAgICByZWZsZWN0aW9uLT5TZXRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9IGZpZWxkX2Rlc2NyaXB0b3ItPmVudW1fdHlwZSgpOwotICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KLSAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICAgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBlbnVtX3ZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZW51bSB2YWx1ZTogJWQiLCB2YWx1ZSk7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIFB5RXJyX0Zvcm1hdCgKLSAgICAgICAgICBQeUV4Y19TeXN0ZW1FcnJvciwgIlNldHRpbmcgdmFsdWUgdG8gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAotICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOwotICAgICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBJbnRlcm5hbFNldFNjYWxhcigKLSAgICBDTWVzc2FnZSogc2VsZiwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgUHlPYmplY3QqIGFyZykgewotICBpZiAoIUNoZWNrRmllbGRCZWxvbmdzVG9NZXNzYWdlKGZpZWxkX2Rlc2NyaXB0b3IsIHNlbGYtPm1lc3NhZ2UpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgaWYgKE1heWJlUmVsZWFzZU92ZXJsYXBwaW5nT25lb2ZGaWVsZChzZWxmLCBmaWVsZF9kZXNjcmlwdG9yKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICByZXR1cm4gSW50ZXJuYWxTZXROb25PbmVvZlNjYWxhcihzZWxmLT5tZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBhcmcpOwotfQotCi1QeU9iamVjdCogRnJvbVN0cmluZyhQeVR5cGVPYmplY3QqIGNscywgUHlPYmplY3QqIHNlcmlhbGl6ZWQpIHsKLSAgUHlPYmplY3QqIHB5X2Ntc2cgPSBQeU9iamVjdF9DYWxsT2JqZWN0KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KGNscyksIE5VTEwpOwotICBpZiAocHlfY21zZyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ01lc3NhZ2UqIGNtc2cgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4ocHlfY21zZyk7Ci0KLSAgU2NvcGVkUHlPYmplY3RQdHIgcHlfbGVuZ3RoKE1lcmdlRnJvbVN0cmluZyhjbXNnLCBzZXJpYWxpemVkKSk7Ci0gIGlmIChweV9sZW5ndGggPT0gTlVMTCkgewotICAgIFB5X0RFQ1JFRihweV9jbXNnKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBweV9jbXNnOwotfQotCi1QeU9iamVjdCogRGVlcENvcHkoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgUHlPYmplY3QqIGNsb25lID0gUHlPYmplY3RfQ2FsbE9iamVjdCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihQeV9UWVBFKHNlbGYpKSwgTlVMTCk7Ci0gIGlmIChjbG9uZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2soY2xvbmUsICZDTWVzc2FnZV9UeXBlKSkgewotICAgIFB5X0RFQ1JFRihjbG9uZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKE1lcmdlRnJvbSgKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oY2xvbmUpLAotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSkpID09IE5VTEwpIHsKLSAgICBQeV9ERUNSRUYoY2xvbmUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBjbG9uZTsKLX0KLQotUHlPYmplY3QqIFRvVW5pY29kZShDTWVzc2FnZSogc2VsZikgewotICAvLyBMYXp5IGltcG9ydCB0byBwcmV2ZW50IGNpcmN1bGFyIGRlcGVuZGVuY2llcwotICBTY29wZWRQeU9iamVjdFB0ciB0ZXh0X2Zvcm1hdCgKLSAgICAgIFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgiZ29vZ2xlLnByb3RvYnVmLnRleHRfZm9ybWF0IikpOwotICBpZiAodGV4dF9mb3JtYXQgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIG1ldGhvZF9uYW1lKFB5U3RyaW5nX0Zyb21TdHJpbmcoIk1lc3NhZ2VUb1N0cmluZyIpKTsKLSAgaWYgKG1ldGhvZF9uYW1lID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9JTkNSRUYoUHlfVHJ1ZSk7Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGVuY29kZWQoUHlPYmplY3RfQ2FsbE1ldGhvZE9iakFyZ3MoCi0gICAgICB0ZXh0X2Zvcm1hdC5nZXQoKSwgbWV0aG9kX25hbWUuZ2V0KCksIHNlbGYsIFB5X1RydWUsIE5VTEwpKTsKLSAgUHlfREVDUkVGKFB5X1RydWUpOwotICBpZiAoZW5jb2RlZCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSNpZiBQWV9NQUpPUl9WRVJTSU9OIDwgMwotICBQeU9iamVjdCogZGVjb2RlZCA9IFB5U3RyaW5nX0FzRGVjb2RlZE9iamVjdChlbmNvZGVkLmdldCgpLCAidXRmLTgiLCBOVUxMKTsKLSNlbHNlCi0gIFB5T2JqZWN0KiBkZWNvZGVkID0gUHlVbmljb2RlX0Zyb21FbmNvZGVkT2JqZWN0KGVuY29kZWQuZ2V0KCksICJ1dGYtOCIsIE5VTEwpOwotI2VuZGlmCi0gIGlmIChkZWNvZGVkID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gZGVjb2RlZDsKLX0KLQotUHlPYmplY3QqIFJlZHVjZShDTWVzc2FnZSogc2VsZikgewotICBTY29wZWRQeU9iamVjdFB0ciBjb25zdHJ1Y3RvcihyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oUHlfVFlQRShzZWxmKSkpOwotICBjb25zdHJ1Y3Rvci5pbmMoKTsKLSAgU2NvcGVkUHlPYmplY3RQdHIgYXJncyhQeVR1cGxlX05ldygwKSk7Ci0gIGlmIChhcmdzID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBTY29wZWRQeU9iamVjdFB0ciBzdGF0ZShQeURpY3RfTmV3KCkpOwotICBpZiAoc3RhdGUgPT0gTlVMTCkgewotICAgIHJldHVybiAgTlVMTDsKLSAgfQotICBTY29wZWRQeU9iamVjdFB0ciBzZXJpYWxpemVkKFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyhzZWxmKSk7Ci0gIGlmIChzZXJpYWxpemVkID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoUHlEaWN0X1NldEl0ZW1TdHJpbmcoc3RhdGUuZ2V0KCksICJzZXJpYWxpemVkIiwgc2VyaWFsaXplZC5nZXQoKSkgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIFB5X0J1aWxkVmFsdWUoIk9PTyIsIGNvbnN0cnVjdG9yLmdldCgpLCBhcmdzLmdldCgpLCBzdGF0ZS5nZXQoKSk7Ci19Ci0KLVB5T2JqZWN0KiBTZXRTdGF0ZShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIHN0YXRlKSB7Ci0gIGlmICghUHlEaWN0X0NoZWNrKHN0YXRlKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJzdGF0ZSBub3QgYSBkaWN0Iik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlPYmplY3QqIHNlcmlhbGl6ZWQgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhzdGF0ZSwgInNlcmlhbGl6ZWQiKTsKLSAgaWYgKHNlcmlhbGl6ZWQgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmIChTY29wZWRQeU9iamVjdFB0cihQYXJzZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCkpID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotLy8gQ01lc3NhZ2Ugc3RhdGljIG1ldGhvZHM6Ci1QeU9iamVjdCogX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUoUHlPYmplY3QqIHVudXNlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogdW51c2VkX2FyZykgewotICBpZiAoIV9DYWxsZWRGcm9tR2VuZXJhdGVkRmlsZSgxKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJEZXNjcmlwdG9ycyBzaG91bGQgbm90IGJlIGNyZWF0ZWQgZGlyZWN0bHksICIKLSAgICAgICAgICAgICAgICAgICAgImJ1dCBvbmx5IHJldHJpZXZlZCBmcm9tIHRoZWlyIHBhcmVudC4iKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBHZXRFeHRlbnNpb25EaWN0KENNZXNzYWdlKiBzZWxmLCB2b2lkICpjbG9zdXJlKSB7Ci0gIGlmIChzZWxmLT5leHRlbnNpb25zKSAgewotICAgIFB5X0lOQ1JFRihzZWxmLT5leHRlbnNpb25zKTsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYtPmV4dGVuc2lvbnMpOwotICB9Ci0KLSAgLy8gSWYgdGhlcmUgYXJlIGV4dGVuc2lvbl9yYW5nZXMsIHRoZSBtZXNzYWdlIGlzICJleHRlbmRhYmxlIi4gQWxsb2NhdGUgYQotICAvLyBkaWN0aW9uYXJ5IHRvIHN0b3JlIHRoZSBleHRlbnNpb24gZmllbGRzLgotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0TWVzc2FnZURlc2NyaXB0b3IoUHlfVFlQRShzZWxmKSk7Ci0gIGlmIChkZXNjcmlwdG9yLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICBFeHRlbnNpb25EaWN0KiBleHRlbnNpb25fZGljdCA9IGV4dGVuc2lvbl9kaWN0OjpOZXdFeHRlbnNpb25EaWN0KHNlbGYpOwotICAgIGlmIChleHRlbnNpb25fZGljdCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc2VsZi0+ZXh0ZW5zaW9ucyA9IGV4dGVuc2lvbl9kaWN0OwotICAgIFB5X0lOQ1JFRihzZWxmLT5leHRlbnNpb25zKTsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYtPmV4dGVuc2lvbnMpOwotICB9Ci0KLSAgUHlFcnJfU2V0Tm9uZShQeUV4Y19BdHRyaWJ1dGVFcnJvcik7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgUHlHZXRTZXREZWYgR2V0dGVyc1tdID0gewotICB7IkV4dGVuc2lvbnMiLCAoZ2V0dGVyKUdldEV4dGVuc2lvbkRpY3QsIE5VTEwsICJFeHRlbnNpb24gZGljdCJ9LAotICB7TlVMTH0KLX07Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBNZXRob2RzW10gPSB7Ci0gIHsgIl9fZGVlcGNvcHlfXyIsIChQeUNGdW5jdGlvbilEZWVwQ29weSwgTUVUSF9WQVJBUkdTLAotICAgICJNYWtlcyBhIGRlZXAgY29weSBvZiB0aGUgY2xhc3MuIiB9LAotICB7ICJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKVJlZHVjZSwgTUVUSF9OT0FSR1MsCi0gICAgIk91dHB1dHMgcGlja2xhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlLiIgfSwKLSAgeyAiX19zZXRzdGF0ZV9fIiwgKFB5Q0Z1bmN0aW9uKVNldFN0YXRlLCBNRVRIX08sCi0gICAgIklucHV0cyBwaWNrbGFibGUgcmVwcmVzZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UuIiB9LAotICB7ICJfX3VuaWNvZGVfXyIsIChQeUNGdW5jdGlvbilUb1VuaWNvZGUsIE1FVEhfTk9BUkdTLAotICAgICJPdXRwdXRzIGEgdW5pY29kZSByZXByZXNlbnRhdGlvbiBvZiB0aGUgbWVzc2FnZS4iIH0sCi0gIHsgIkJ5dGVTaXplIiwgKFB5Q0Z1bmN0aW9uKUJ5dGVTaXplLCBNRVRIX05PQVJHUywKLSAgICAiUmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgbWVzc2FnZSBpbiBieXRlcy4iIH0sCi0gIHsgIkNsZWFyIiwgKFB5Q0Z1bmN0aW9uKUNsZWFyLCBNRVRIX05PQVJHUywKLSAgICAiQ2xlYXJzIHRoZSBtZXNzYWdlLiIgfSwKLSAgeyAiQ2xlYXJFeHRlbnNpb24iLCAoUHlDRnVuY3Rpb24pQ2xlYXJFeHRlbnNpb24sIE1FVEhfTywKLSAgICAiQ2xlYXJzIGEgbWVzc2FnZSBmaWVsZC4iIH0sCi0gIHsgIkNsZWFyRmllbGQiLCAoUHlDRnVuY3Rpb24pQ2xlYXJGaWVsZCwgTUVUSF9PLAotICAgICJDbGVhcnMgYSBtZXNzYWdlIGZpZWxkLiIgfSwKLSAgeyAiQ29weUZyb20iLCAoUHlDRnVuY3Rpb24pQ29weUZyb20sIE1FVEhfTywKLSAgICAiQ29waWVzIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIHRoZSBjdXJyZW50IG1lc3NhZ2UuIiB9LAotICB7ICJEaXNjYXJkVW5rbm93bkZpZWxkcyIsIChQeUNGdW5jdGlvbilEaXNjYXJkVW5rbm93bkZpZWxkcywgTUVUSF9OT0FSR1MsCi0gICAgIkRpc2NhcmRzIHRoZSB1bmtub3duIGZpZWxkcy4iIH0sCi0gIHsgIkZpbmRJbml0aWFsaXphdGlvbkVycm9ycyIsIChQeUNGdW5jdGlvbilGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMsCi0gICAgTUVUSF9OT0FSR1MsCi0gICAgIkZpbmRzIHVuc2V0IHJlcXVpcmVkIGZpZWxkcy4iIH0sCi0gIHsgIkZyb21TdHJpbmciLCAoUHlDRnVuY3Rpb24pRnJvbVN0cmluZywgTUVUSF9PIHwgTUVUSF9DTEFTUywKLSAgICAiQ3JlYXRlcyBuZXcgbWV0aG9kIGluc3RhbmNlIGZyb20gZ2l2ZW4gc2VyaWFsaXplZCBkYXRhLiIgfSwKLSAgeyAiSGFzRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKUhhc0V4dGVuc2lvbiwgTUVUSF9PLAotICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldC4iIH0sCi0gIHsgIkhhc0ZpZWxkIiwgKFB5Q0Z1bmN0aW9uKUhhc0ZpZWxkLCBNRVRIX08sCi0gICAgIkNoZWNrcyBpZiBhIG1lc3NhZ2UgZmllbGQgaXMgc2V0LiIgfSwKLSAgeyAiSXNJbml0aWFsaXplZCIsIChQeUNGdW5jdGlvbilJc0luaXRpYWxpemVkLCBNRVRIX1ZBUkFSR1MsCi0gICAgIkNoZWNrcyBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBhcmUgc2V0LiIgfSwKLSAgeyAiTGlzdEZpZWxkcyIsIChQeUNGdW5jdGlvbilMaXN0RmllbGRzLCBNRVRIX05PQVJHUywKLSAgICAiTGlzdHMgYWxsIHNldCBmaWVsZHMgb2YgYSBtZXNzYWdlLiIgfSwKLSAgeyAiTWVyZ2VGcm9tIiwgKFB5Q0Z1bmN0aW9uKU1lcmdlRnJvbSwgTUVUSF9PLAotICAgICJNZXJnZXMgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iIH0sCi0gIHsgIk1lcmdlRnJvbVN0cmluZyIsIChQeUNGdW5jdGlvbilNZXJnZUZyb21TdHJpbmcsIE1FVEhfTywKLSAgICAiTWVyZ2VzIGEgc2VyaWFsaXplZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iIH0sCi0gIHsgIlBhcnNlRnJvbVN0cmluZyIsIChQeUNGdW5jdGlvbilQYXJzZUZyb21TdHJpbmcsIE1FVEhfTywKLSAgICAiUGFyc2VzIGEgc2VyaWFsaXplZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iIH0sCi0gIHsgIlJlZ2lzdGVyRXh0ZW5zaW9uIiwgKFB5Q0Z1bmN0aW9uKVJlZ2lzdGVyRXh0ZW5zaW9uLCBNRVRIX08gfCBNRVRIX0NMQVNTLAotICAgICJSZWdpc3RlcnMgYW4gZXh0ZW5zaW9uIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4iIH0sCi0gIHsgIlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyIsIChQeUNGdW5jdGlvbilTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcsCi0gICAgTUVUSF9OT0FSR1MsCi0gICAgIlNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBzdHJpbmcsIGV2ZW4gaWYgaXQgaXNuJ3QgaW5pdGlhbGl6ZWQuIiB9LAotICB7ICJTZXJpYWxpemVUb1N0cmluZyIsIChQeUNGdW5jdGlvbilTZXJpYWxpemVUb1N0cmluZywgTUVUSF9OT0FSR1MsCi0gICAgIlNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBzdHJpbmcsIG9ubHkgZm9yIGluaXRpYWxpemVkIG1lc3NhZ2VzLiIgfSwKLSAgeyAiU2V0SW5QYXJlbnQiLCAoUHlDRnVuY3Rpb24pU2V0SW5QYXJlbnQsIE1FVEhfTk9BUkdTLAotICAgICJTZXRzIHRoZSBoYXMgYml0IG9mIHRoZSBnaXZlbiBmaWVsZCBpbiBpdHMgcGFyZW50IG1lc3NhZ2UuIiB9LAotICB7ICJXaGljaE9uZW9mIiwgKFB5Q0Z1bmN0aW9uKVdoaWNoT25lb2YsIE1FVEhfTywKLSAgICAiUmV0dXJucyB0aGUgbmFtZSBvZiB0aGUgZmllbGQgc2V0IGluc2lkZSBhIG9uZW9mLCAiCi0gICAgIm9yIE5vbmUgaWYgbm8gZmllbGQgaXMgc2V0LiIgfSwKLQotICAvLyBTdGF0aWMgTWV0aG9kcy4KLSAgeyAiX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUiLCAoUHlDRnVuY3Rpb24pX0NoZWNrQ2FsbGVkRnJvbUdlbmVyYXRlZEZpbGUsCi0gICAgTUVUSF9OT0FSR1MgfCBNRVRIX1NUQVRJQywKLSAgICAiUmFpc2VzIFR5cGVFcnJvciBpZiB0aGUgY2FsbGVyIGlzIG5vdCBpbiBhIF9wYjIucHkgZmlsZS4ifSwKLSAgeyBOVUxMLCBOVUxMfQotfTsKLQotc3RhdGljIGJvb2wgU2V0Q29tcG9zaXRlRmllbGQoCi0gICAgQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBuYW1lLCBQeU9iamVjdCogdmFsdWUpIHsKLSAgaWYgKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMgPT0gTlVMTCkgewotICAgIHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMgPSBQeURpY3RfTmV3KCk7Ci0gICAgaWYgKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gUHlEaWN0X1NldEl0ZW0oc2VsZi0+Y29tcG9zaXRlX2ZpZWxkcywgbmFtZSwgdmFsdWUpID09IDA7Ci19Ci0KLVB5T2JqZWN0KiBHZXRBdHRyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogbmFtZSkgewotICBQeU9iamVjdCogdmFsdWUgPSBzZWxmLT5jb21wb3NpdGVfZmllbGRzID8KLSAgICAgIFB5RGljdF9HZXRJdGVtKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMsIG5hbWUpIDogTlVMTDsKLSAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICBQeV9JTkNSRUYodmFsdWUpOwotICAgIHJldHVybiB2YWx1ZTsKLSAgfQotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9IEdldEZpZWxkRGVzY3JpcHRvcihzZWxmLCBuYW1lKTsKLSAgaWYgKGZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIHJldHVybiBDTWVzc2FnZV9UeXBlLnRwX2Jhc2UtPnRwX2dldGF0dHJvKAotICAgICAgICByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZiksIG5hbWUpOwotICB9Ci0KLSAgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmlzX21hcCgpKSB7Ci0gICAgUHlPYmplY3QqIHB5X2NvbnRhaW5lciA9IE5VTEw7Ci0gICAgY29uc3QgRGVzY3JpcHRvciogZW50cnlfdHlwZSA9IGZpZWxkX2Rlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpOwotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfdHlwZSA9IGVudHJ5X3R5cGUtPkZpbmRGaWVsZEJ5TmFtZSgidmFsdWUiKTsKLSAgICBpZiAodmFsdWVfdHlwZS0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgQ01lc3NhZ2VDbGFzcyogdmFsdWVfY2xhc3MgPSBjZGVzY3JpcHRvcl9wb29sOjpHZXRNZXNzYWdlQ2xhc3MoCi0gICAgICAgICAgR2V0RGVzY3JpcHRvclBvb2xGb3JNZXNzYWdlKHNlbGYpLCB2YWx1ZV90eXBlLT5tZXNzYWdlX3R5cGUoKSk7Ci0gICAgICBpZiAodmFsdWVfY2xhc3MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIHB5X2NvbnRhaW5lciA9Ci0gICAgICAgICAgTmV3TWVzc2FnZU1hcENvbnRhaW5lcihzZWxmLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZV9jbGFzcyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB5X2NvbnRhaW5lciA9IE5ld1NjYWxhck1hcENvbnRhaW5lcihzZWxmLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgICB9Ci0gICAgaWYgKHB5X2NvbnRhaW5lciA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgaWYgKCFTZXRDb21wb3NpdGVGaWVsZChzZWxmLCBuYW1lLCBweV9jb250YWluZXIpKSB7Ci0gICAgICBQeV9ERUNSRUYocHlfY29udGFpbmVyKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm4gcHlfY29udGFpbmVyOwotICB9Ci0KLSAgaWYgKGZpZWxkX2Rlc2NyaXB0b3ItPmxhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCkgewotICAgIFB5T2JqZWN0KiBweV9jb250YWluZXIgPSBOVUxMOwotICAgIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBDTWVzc2FnZUNsYXNzKiBtZXNzYWdlX2NsYXNzID0gY2Rlc2NyaXB0b3JfcG9vbDo6R2V0TWVzc2FnZUNsYXNzKAotICAgICAgICAgIEdldERlc2NyaXB0b3JQb29sRm9yTWVzc2FnZShzZWxmKSwgZmllbGRfZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOwotICAgICAgaWYgKG1lc3NhZ2VfY2xhc3MgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIHB5X2NvbnRhaW5lciA9IHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6Ok5ld0NvbnRhaW5lcigKLSAgICAgICAgICBzZWxmLCBmaWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlX2NsYXNzKTsKLSAgICB9IGVsc2UgewotICAgICAgcHlfY29udGFpbmVyID0gcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcjo6TmV3Q29udGFpbmVyKAotICAgICAgICAgIHNlbGYsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgIH0KLSAgICBpZiAocHlfY29udGFpbmVyID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBpZiAoIVNldENvbXBvc2l0ZUZpZWxkKHNlbGYsIG5hbWUsIHB5X2NvbnRhaW5lcikpIHsKLSAgICAgIFB5X0RFQ1JFRihweV9jb250YWluZXIpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBweV9jb250YWluZXI7Ci0gIH0KLQotICBpZiAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgIFB5T2JqZWN0KiBzdWJfbWVzc2FnZSA9IEludGVybmFsR2V0U3ViTWVzc2FnZShzZWxmLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgICBpZiAoc3ViX21lc3NhZ2UgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIGlmICghU2V0Q29tcG9zaXRlRmllbGQoc2VsZiwgbmFtZSwgc3ViX21lc3NhZ2UpKSB7Ci0gICAgICBQeV9ERUNSRUYoc3ViX21lc3NhZ2UpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBzdWJfbWVzc2FnZTsKLSAgfQotCi0gIHJldHVybiBJbnRlcm5hbEdldFNjYWxhcihzZWxmLT5tZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLX0KLQotaW50IFNldEF0dHIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBuYW1lLCBQeU9iamVjdCogdmFsdWUpIHsKLSAgaWYgKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMgJiYgUHlEaWN0X0NvbnRhaW5zKHNlbGYtPmNvbXBvc2l0ZV9maWVsZHMsIG5hbWUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIkNhbid0IHNldCBjb21wb3NpdGUgZmllbGQiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPSBHZXRGaWVsZERlc2NyaXB0b3Ioc2VsZiwgbmFtZSk7Ci0gIGlmIChmaWVsZF9kZXNjcmlwdG9yICE9IE5VTEwpIHsKLSAgICBBc3N1cmVXcml0YWJsZShzZWxmKTsKLSAgICBpZiAoZmllbGRfZGVzY3JpcHRvci0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKSB7Ci0gICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJBc3NpZ25tZW50IG5vdCBhbGxvd2VkIHRvIHJlcGVhdGVkICIKLSAgICAgICAgICAgICAgICAgICAiZmllbGQgXCIlc1wiIGluIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LiIsCi0gICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+bmFtZSgpLmNfc3RyKCkpOwotICAgICAgcmV0dXJuIC0xOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsICJBc3NpZ25tZW50IG5vdCBhbGxvd2VkIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICJmaWVsZCBcIiVzXCIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuIiwKLSAgICAgICAgICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPm5hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgcmV0dXJuIC0xOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEludGVybmFsU2V0U2NhbGFyKHNlbGYsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBQeUVycl9Gb3JtYXQoUHlFeGNfQXR0cmlidXRlRXJyb3IsCi0gICAgICAgICAgICAgICAiQXNzaWdubWVudCBub3QgYWxsb3dlZCAiCi0gICAgICAgICAgICAgICAiKG5vIGZpZWxkIFwiJXNcIiBpbiBwcm90b2NvbCBtZXNzYWdlIG9iamVjdCkuIiwKLSAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKG5hbWUpKTsKLSAgcmV0dXJuIC0xOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY21lc3NhZ2UKLQotUHlUeXBlT2JqZWN0IENNZXNzYWdlX1R5cGUgPSB7Ci0gIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmQ01lc3NhZ2VDbGFzc19UeXBlLCAwKQotICBGVUxMX01PRFVMRV9OQU1FICIuQ01lc3NhZ2UiLCAgICAgICAgLy8gdHBfbmFtZQotICBzaXplb2YoQ01lc3NhZ2UpLCAgICAgICAgICAgICAgICAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlbXNpemUKLSAgKGRlc3RydWN0b3IpY21lc3NhZ2U6OkRlYWxsb2MsICAgICAgIC8vICB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKLSAgKHJlcHJmdW5jKWNtZXNzYWdlOjpUb1N0ciwgICAgICAgICAgIC8vICB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19tYXBwaW5nCi0gIFB5T2JqZWN0X0hhc2hOb3RJbXBsZW1lbnRlZCwgICAgICAgICAvLyAgdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKLSAgKHJlcHJmdW5jKWNtZXNzYWdlOjpUb1N0ciwgICAgICAgICAgIC8vICB0cF9zdHIKLSAgKGdldGF0dHJvZnVuYyljbWVzc2FnZTo6R2V0QXR0ciwgICAgIC8vICB0cF9nZXRhdHRybwotICAoc2V0YXR0cm9mdW5jKWNtZXNzYWdlOjpTZXRBdHRyLCAgICAgLy8gIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCB8IFB5X1RQRkxBR1NfQkFTRVRZUEUsICAvLyAgdHBfZmxhZ3MKLSAgIkEgUHJvdG9jb2xNZXNzYWdlIiwgICAgICAgICAgICAgICAgIC8vICB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCi0gIChyaWNoY21wZnVuYyljbWVzc2FnZTo6UmljaENvbXBhcmUsICAvLyAgdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAotICBjbWVzc2FnZTo6TWV0aG9kcywgICAgICAgICAgICAgICAgICAgLy8gIHRwX21ldGhvZHMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCi0gIGNtZXNzYWdlOjpHZXR0ZXJzLCAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9zZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0Ci0gIChpbml0cHJvYyljbWVzc2FnZTo6SW5pdCwgICAgICAgICAgICAvLyAgdHBfaW5pdAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FsbG9jCi0gIGNtZXNzYWdlOjpOZXcsICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbmV3Ci19OwotCi0vLyAtLS0gRXhwb3NpbmcgdGhlIEMgcHJvdG8gbGl2aW5nIGluc2lkZSBQeXRob24gcHJvdG8gdG8gQyBjb2RlOgotCi1jb25zdCBNZXNzYWdlKiAoKkdldENQcm90b0luc2lkZVB5UHJvdG9QdHIpKFB5T2JqZWN0KiBtc2cpOwotTWVzc2FnZSogKCpNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7Ci0KLXN0YXRpYyBjb25zdCBNZXNzYWdlKiBHZXRDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKG1zZywgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ01lc3NhZ2UqIGNtc2cgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4obXNnKTsKLSAgcmV0dXJuIGNtc2ctPm1lc3NhZ2U7Ci19Ci0KLXN0YXRpYyBNZXNzYWdlKiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b0ltcGwoUHlPYmplY3QqIG1zZykgewotICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhtc2csICZDTWVzc2FnZV9UeXBlKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIENNZXNzYWdlKiBjbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KG1zZyk7Ci0gIGlmICgoY21zZy0+Y29tcG9zaXRlX2ZpZWxkcyAmJiBQeURpY3RfU2l6ZShjbXNnLT5jb21wb3NpdGVfZmllbGRzKSAhPSAwKSB8fAotICAgICAgKGNtc2ctPmV4dGVuc2lvbnMgIT0gTlVMTCAmJgotICAgICAgIFB5RGljdF9TaXplKGNtc2ctPmV4dGVuc2lvbnMtPnZhbHVlcykgIT0gMCkpIHsKLSAgICAvLyBUaGVyZSBpcyBjdXJyZW50bHkgbm8gd2F5IG9mIGFjY3VyYXRlbHkgc3luY2luZyBhcmJpdHJhcnkgY2hhbmdlcyB0bwotICAgIC8vIHRoZSB1bmRlcmx5aW5nIEMrKyBtZXNzYWdlIGJhY2sgdG8gdGhlIENNZXNzYWdlIChlLmcuIHJlbW92ZWQgcmVwZWF0ZWQKLSAgICAvLyBjb21wb3NpdGUgY29udGFpbmVycykuIFdlIG9ubHkgYWxsb3cgZGlyZWN0IG11dGF0aW9uIG9mIHRoZSB1bmRlcmx5aW5nCi0gICAgLy8gQysrIG1lc3NhZ2UgaWYgdGhlcmUgaXMgbm8gY2hpbGQgZGF0YSBpbiB0aGUgQ01lc3NhZ2UuCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgY21lc3NhZ2U6OkFzc3VyZVdyaXRhYmxlKGNtc2cpOwotICByZXR1cm4gY21zZy0+bWVzc2FnZTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgbW9kdWxlX2RvY3N0cmluZ1tdID0KLSJweXRob24tcHJvdG8yIGlzIGEgbW9kdWxlIHRoYXQgY2FuIGJlIHVzZWQgdG8gZW5oYW5jZSBwcm90bzIgUHl0aG9uIEFQSVxuIgotInBlcmZvcm1hbmNlLlxuIgotIlxuIgotIkl0IHByb3ZpZGVzIGFjY2VzcyB0byB0aGUgcHJvdG9jb2wgYnVmZmVycyBDKysgcmVmbGVjdGlvbiBBUEkgdGhhdFxuIgotImltcGxlbWVudHMgdGhlIGJhc2ljIHByb3RvY29sIGJ1ZmZlciBmdW5jdGlvbnMuIjsKLQotdm9pZCBJbml0R2xvYmFscygpIHsKLSAgLy8gVE9ETyhncHMpOiBDaGVjayBhbGwgcmV0dXJuIHZhbHVlcyBpbiB0aGlzIGZ1bmN0aW9uIGZvciBOVUxMIGFuZCBwcm9wYWdhdGUKLSAgLy8gdGhlIGVycm9yIChNZW1vcnlFcnJvcikgb24gdXAgdG8gcmVzdWx0IGluIGFuIGltcG9ydCBmYWlsdXJlLiAgVGhlc2Ugc2hvdWxkCi0gIC8vIGFsc28gYmUgZnJlZWQgYW5kIHJlc2V0IHRvIE5VTEwgZHVyaW5nIGZpbmFsaXphdGlvbi4KLSAga1B5dGhvblplcm8gPSBQeUludF9Gcm9tTG9uZygwKTsKLSAga2ludDMybWluX3B5ID0gUHlJbnRfRnJvbUxvbmcoa2ludDMybWluKTsKLSAga2ludDMybWF4X3B5ID0gUHlJbnRfRnJvbUxvbmcoa2ludDMybWF4KTsKLSAga3VpbnQzMm1heF9weSA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoa3VpbnQzMm1heCk7Ci0gIGtpbnQ2NG1pbl9weSA9IFB5TG9uZ19Gcm9tTG9uZ0xvbmcoa2ludDY0bWluKTsKLSAga2ludDY0bWF4X3B5ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhraW50NjRtYXgpOwotICBrdWludDY0bWF4X3B5ID0gUHlMb25nX0Zyb21VbnNpZ25lZExvbmdMb25nKGt1aW50NjRtYXgpOwotCi0gIGtERVNDUklQVE9SID0gUHlTdHJpbmdfRnJvbVN0cmluZygiREVTQ1JJUFRPUiIpOwotICBrX2NkZXNjcmlwdG9yID0gUHlTdHJpbmdfRnJvbVN0cmluZygiX2NkZXNjcmlwdG9yIik7Ci0gIGtmdWxsX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJmdWxsX25hbWUiKTsKLSAga19leHRlbnNpb25zX2J5X25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfZXh0ZW5zaW9uc19ieV9uYW1lIik7Ci0gIGtfZXh0ZW5zaW9uc19ieV9udW1iZXIgPSBQeVN0cmluZ19Gcm9tU3RyaW5nKCJfZXh0ZW5zaW9uc19ieV9udW1iZXIiKTsKLQotICBQeU9iamVjdCAqZHVtbXlfb2JqID0gUHlTZXRfTmV3KE5VTEwpOwotICBrRW1wdHlXZWFrcmVmID0gUHlXZWFrcmVmX05ld1JlZihkdW1teV9vYmosIE5VTEwpOwotICBQeV9ERUNSRUYoZHVtbXlfb2JqKTsKLX0KLQotYm9vbCBJbml0UHJvdG8yTWVzc2FnZU1vZHVsZShQeU9iamVjdCAqbSkgewotICAvLyBJbml0aWFsaXplIHR5cGVzIGFuZCBnbG9iYWxzIGluIGRlc2NyaXB0b3IuY2MKLSAgaWYgKCFJbml0RGVzY3JpcHRvcigpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0eXBlcyBhbmQgZ2xvYmFscyBpbiBkZXNjcmlwdG9yX3Bvb2wuY2MKLSAgaWYgKCFJbml0RGVzY3JpcHRvclBvb2woKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgY29uc3RhbnRzIGRlZmluZWQgaW4gdGhpcyBmaWxlLgotICBJbml0R2xvYmFscygpOwotCi0gIENNZXNzYWdlQ2xhc3NfVHlwZS50cF9iYXNlID0gJlB5VHlwZV9UeXBlOwotICBpZiAoUHlUeXBlX1JlYWR5KCZDTWVzc2FnZUNsYXNzX1R5cGUpIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1lc3NhZ2VNZXRhIiwKLSAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigmQ01lc3NhZ2VDbGFzc19UeXBlKSk7Ci0KLSAgaWYgKFB5VHlwZV9SZWFkeSgmQ01lc3NhZ2VfVHlwZSkgPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gREVTQ1JJUFRPUiBpcyBzZXQgb24gZWFjaCBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSBjbGFzcyBlbHNld2hlcmUsIGJ1dCBzZXQKLSAgLy8gaXQgaGVyZSBhcyB3ZWxsIHRvIGRvY3VtZW50IHRoYXQgc3ViY2xhc3NlcyBuZWVkIHRvIHNldCBpdC4KLSAgUHlEaWN0X1NldEl0ZW0oQ01lc3NhZ2VfVHlwZS50cF9kaWN0LCBrREVTQ1JJUFRPUiwgUHlfTm9uZSk7Ci0gIC8vIFN1YmNsYXNzZXMgd2l0aCBtZXNzYWdlIGV4dGVuc2lvbnMgd2lsbCBvdmVycmlkZSBfZXh0ZW5zaW9uc19ieV9uYW1lIGFuZAotICAvLyBfZXh0ZW5zaW9uc19ieV9udW1iZXIgd2l0aCBmcmVzaCBtdXRhYmxlIGRpY3Rpb25hcmllcyBpbiBBZGREZXNjcmlwdG9ycy4KLSAgLy8gQWxsIG90aGVyIGNsYXNzZXMgY2FuIHNoYXJlIHRoaXMgc2FtZSBpbW11dGFibGUgbWFwcGluZy4KLSAgU2NvcGVkUHlPYmplY3RQdHIgZW1wdHlfZGljdChQeURpY3RfTmV3KCkpOwotICBpZiAoZW1wdHlfZGljdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGltbXV0YWJsZV9kaWN0KFB5RGljdFByb3h5X05ldyhlbXB0eV9kaWN0LmdldCgpKSk7Ci0gIGlmIChpbW11dGFibGVfZGljdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChQeURpY3RfU2V0SXRlbShDTWVzc2FnZV9UeXBlLnRwX2RpY3QsCi0gICAgICAgICAgICAgICAgICAgICBrX2V4dGVuc2lvbnNfYnlfbmFtZSwgaW1tdXRhYmxlX2RpY3QuZ2V0KCkpIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoUHlEaWN0X1NldEl0ZW0oQ01lc3NhZ2VfVHlwZS50cF9kaWN0LAotICAgICAgICAgICAgICAgICAgICAga19leHRlbnNpb25zX2J5X251bWJlciwgaW1tdXRhYmxlX2RpY3QuZ2V0KCkpIDwgMCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVzc2FnZSIsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigmQ01lc3NhZ2VfVHlwZSkpOwotCi0gIC8vIEluaXRpYWxpemUgUmVwZWF0ZWQgY29udGFpbmVyIHR5cGVzLgotICB7Ci0gICAgaWYgKFB5VHlwZV9SZWFkeSgmUmVwZWF0ZWRTY2FsYXJDb250YWluZXJfVHlwZSkgPCAwKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJSZXBlYXRlZFNjYWxhckNvbnRhaW5lciIsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZXBlYXRlZFNjYWxhckNvbnRhaW5lcl9UeXBlKSk7Ci0KLSAgICBpZiAoUHlUeXBlX1JlYWR5KCZSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcl9UeXBlKSA8IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBQeU1vZHVsZV9BZGRPYmplY3QoCi0gICAgICAgIG0sICJSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciIsCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgICAgICAgICZSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcl9UeXBlKSk7Ci0KLSAgICAvLyBSZWdpc3RlciB0aGVtIGFzIGNvbGxlY3Rpb25zLlNlcXVlbmNlCi0gICAgU2NvcGVkUHlPYmplY3RQdHIgY29sbGVjdGlvbnMoUHlJbXBvcnRfSW1wb3J0TW9kdWxlKCJjb2xsZWN0aW9ucyIpKTsKLSAgICBpZiAoY29sbGVjdGlvbnMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBTY29wZWRQeU9iamVjdFB0ciBtdXRhYmxlX3NlcXVlbmNlKAotICAgICAgICBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKGNvbGxlY3Rpb25zLmdldCgpLCAiTXV0YWJsZVNlcXVlbmNlIikpOwotICAgIGlmIChtdXRhYmxlX3NlcXVlbmNlID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKAotICAgICAgICAgICAgUHlPYmplY3RfQ2FsbE1ldGhvZChtdXRhYmxlX3NlcXVlbmNlLmdldCgpLCAicmVnaXN0ZXIiLCAiTyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZSZXBlYXRlZFNjYWxhckNvbnRhaW5lcl9UeXBlKSkgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoU2NvcGVkUHlPYmplY3RQdHIoCi0gICAgICAgICAgICBQeU9iamVjdF9DYWxsTWV0aG9kKG11dGFibGVfc2VxdWVuY2UuZ2V0KCksICJyZWdpc3RlciIsICJPIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyX1R5cGUpKSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZSBNYXAgY29udGFpbmVyIHR5cGVzLgotICB7Ci0gICAgLy8gU2NhbGFyTWFwQ29udGFpbmVyX1R5cGUgZGVyaXZlcyBmcm9tIG91ciBNdXRhYmxlTWFwcGluZyB0eXBlLgotICAgIFNjb3BlZFB5T2JqZWN0UHRyIGNvbnRhaW5lcnMoUHlJbXBvcnRfSW1wb3J0TW9kdWxlKAotICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmNvbnRhaW5lcnMiKSk7Ci0gICAgaWYgKGNvbnRhaW5lcnMgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFNjb3BlZFB5T2JqZWN0UHRyIG11dGFibGVfbWFwcGluZygKLSAgICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhjb250YWluZXJzLmdldCgpLCAiTXV0YWJsZU1hcHBpbmciKSk7Ci0gICAgaWYgKG11dGFibGVfbWFwcGluZyA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sobXV0YWJsZV9tYXBwaW5nLmdldCgpLCAmUHlUeXBlX1R5cGUpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgUHlfSU5DUkVGKG11dGFibGVfbWFwcGluZy5nZXQoKSk7Ci0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gICAgUHlPYmplY3QqIGJhc2VzID0gUHlUdXBsZV9OZXcoMSk7Ci0gICAgUHlUdXBsZV9TRVRfSVRFTShiYXNlcywgMCwgbXV0YWJsZV9tYXBwaW5nLmdldCgpKTsKLQotICAgIFNjYWxhck1hcENvbnRhaW5lcl9UeXBlID0gCi0gICAgICAgIFB5VHlwZV9Gcm9tU3BlY1dpdGhCYXNlcygmU2NhbGFyTWFwQ29udGFpbmVyX1R5cGVfc3BlYywgYmFzZXMpOwotICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU2NhbGFyTWFwQ29udGFpbmVyIiwgU2NhbGFyTWFwQ29udGFpbmVyX1R5cGUpOwotI2Vsc2UKLSAgICBTY2FsYXJNYXBDb250YWluZXJfVHlwZS50cF9iYXNlID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeVR5cGVPYmplY3QqPihtdXRhYmxlX21hcHBpbmcuZ2V0KCkpOwotCi0gICAgaWYgKFB5VHlwZV9SZWFkeSgmU2NhbGFyTWFwQ29udGFpbmVyX1R5cGUpIDwgMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiU2NhbGFyTWFwQ29udGFpbmVyIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZTY2FsYXJNYXBDb250YWluZXJfVHlwZSkpOwotI2VuZGlmCi0KLSAgICBpZiAoUHlUeXBlX1JlYWR5KCZNYXBJdGVyYXRvcl9UeXBlKSA8IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk1hcEl0ZXJhdG9yIiwKLSAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KCZNYXBJdGVyYXRvcl9UeXBlKSk7Ci0KLQotI2lmIFBZX01BSk9SX1ZFUlNJT04gPj0gMwotICAgIE1lc3NhZ2VNYXBDb250YWluZXJfVHlwZSA9IAotICAgICAgICBQeVR5cGVfRnJvbVNwZWNXaXRoQmFzZXMoJk1lc3NhZ2VNYXBDb250YWluZXJfVHlwZV9zcGVjLCBiYXNlcyk7Ci0gICAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJNZXNzYWdlTWFwQ29udGFpbmVyIiwgTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlKTsKLSNlbHNlCi0gICAgUHlfSU5DUkVGKG11dGFibGVfbWFwcGluZy5nZXQoKSk7Ci0gICAgTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlLnRwX2Jhc2UgPQotICAgICAgICByZWludGVycHJldF9jYXN0PFB5VHlwZU9iamVjdCo+KG11dGFibGVfbWFwcGluZy5nZXQoKSk7Ci0KLSAgICBpZiAoUHlUeXBlX1JlYWR5KCZNZXNzYWdlTWFwQ29udGFpbmVyX1R5cGUpIDwgMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiTWVzc2FnZU1hcENvbnRhaW5lciIsCi0gICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigmTWVzc2FnZU1hcENvbnRhaW5lcl9UeXBlKSk7Ci0jZW5kaWYKLSAgfQotCi0gIGlmIChQeVR5cGVfUmVhZHkoJkV4dGVuc2lvbkRpY3RfVHlwZSkgPCAwKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFB5TW9kdWxlX0FkZE9iamVjdCgKLSAgICAgIG0sICJFeHRlbnNpb25EaWN0IiwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigmRXh0ZW5zaW9uRGljdF9UeXBlKSk7Ci0KLSAgLy8gRXhwb3NlIHRoZSBEZXNjcmlwdG9yUG9vbCB1c2VkIHRvIGhvbGQgYWxsIGRlc2NyaXB0b3JzIGFkZGVkIGZyb20gZ2VuZXJhdGVkCi0gIC8vIHBiMi5weSBmaWxlcy4KLSAgLy8gUHlNb2R1bGVfQWRkT2JqZWN0IHN0ZWFscyBhIHJlZmVyZW5jZS4KLSAgUHlfSU5DUkVGKEdldERlZmF1bHREZXNjcmlwdG9yUG9vbCgpKTsKLSAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJkZWZhdWx0X3Bvb2wiLAotICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KEdldERlZmF1bHREZXNjcmlwdG9yUG9vbCgpKSk7Ci0KLSAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEZXNjcmlwdG9yUG9vbCIsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgICZQeURlc2NyaXB0b3JQb29sX1R5cGUpKTsKLQotICAvLyBUaGlzIGltcGxlbWVudGF0aW9uIHByb3ZpZGVzIGZ1bGwgRGVzY3JpcHRvciB0eXBlcywgd2UgYWR2ZXJ0aXNlIGl0IHNvIHRoYXQKLSAgLy8gZGVzY3JpcHRvci5weSBjYW4gdXNlIHRoZW0gaW4gcmVwbGFjZW1lbnQgb2YgdGhlIFB5dGhvbiBjbGFzc2VzLgotICBQeU1vZHVsZV9BZGRJbnRDb25zdGFudChtLCAiX1VTRV9DX0RFU0NSSVBUT1JTIiwgMSk7Ci0KLSAgUHlNb2R1bGVfQWRkT2JqZWN0KG0sICJEZXNjcmlwdG9yIiwgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KAotICAgICAgJlB5TWVzc2FnZURlc2NyaXB0b3JfVHlwZSkpOwotICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZpZWxkRGVzY3JpcHRvciIsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgICZQeUZpZWxkRGVzY3JpcHRvcl9UeXBlKSk7Ci0gIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRW51bURlc2NyaXB0b3IiLCByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oCi0gICAgICAmUHlFbnVtRGVzY3JpcHRvcl9UeXBlKSk7Ci0gIFB5TW9kdWxlX0FkZE9iamVjdChtLCAiRW51bVZhbHVlRGVzY3JpcHRvciIsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgICZQeUVudW1WYWx1ZURlc2NyaXB0b3JfVHlwZSkpOwotICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIkZpbGVEZXNjcmlwdG9yIiwgcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KAotICAgICAgJlB5RmlsZURlc2NyaXB0b3JfVHlwZSkpOwotICBQeU1vZHVsZV9BZGRPYmplY3QobSwgIk9uZW9mRGVzY3JpcHRvciIsIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPigKLSAgICAgICZQeU9uZW9mRGVzY3JpcHRvcl9UeXBlKSk7Ci0KLSAgUHlPYmplY3QqIGVudW1fdHlwZV93cmFwcGVyID0gUHlJbXBvcnRfSW1wb3J0TW9kdWxlKAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5lbnVtX3R5cGVfd3JhcHBlciIpOwotICBpZiAoZW51bV90eXBlX3dyYXBwZXIgPT0gTlVMTCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBFbnVtVHlwZVdyYXBwZXJfY2xhc3MgPQotICAgICAgUHlPYmplY3RfR2V0QXR0clN0cmluZyhlbnVtX3R5cGVfd3JhcHBlciwgIkVudW1UeXBlV3JhcHBlciIpOwotICBQeV9ERUNSRUYoZW51bV90eXBlX3dyYXBwZXIpOwotCi0gIFB5T2JqZWN0KiBtZXNzYWdlX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgKLSAgICAgICJnb29nbGUucHJvdG9idWYubWVzc2FnZSIpOwotICBpZiAobWVzc2FnZV9tb2R1bGUgPT0gTlVMTCkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBFbmNvZGVFcnJvcl9jbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobWVzc2FnZV9tb2R1bGUsICJFbmNvZGVFcnJvciIpOwotICBEZWNvZGVFcnJvcl9jbGFzcyA9IFB5T2JqZWN0X0dldEF0dHJTdHJpbmcobWVzc2FnZV9tb2R1bGUsICJEZWNvZGVFcnJvciIpOwotICBQeXRob25NZXNzYWdlX2NsYXNzID0gUHlPYmplY3RfR2V0QXR0clN0cmluZyhtZXNzYWdlX21vZHVsZSwgIk1lc3NhZ2UiKTsKLSAgUHlfREVDUkVGKG1lc3NhZ2VfbW9kdWxlKTsKLQotICBQeU9iamVjdCogcGlja2xlX21vZHVsZSA9IFB5SW1wb3J0X0ltcG9ydE1vZHVsZSgicGlja2xlIik7Ci0gIGlmIChwaWNrbGVfbW9kdWxlID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgUGlja2xlRXJyb3JfY2xhc3MgPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKHBpY2tsZV9tb2R1bGUsICJQaWNrbGVFcnJvciIpOwotICBQeV9ERUNSRUYocGlja2xlX21vZHVsZSk7Ci0KLSAgLy8gT3ZlcnJpZGUge0dldCxNdXRhYmxlfUNQcm90b0luc2lkZVB5UHJvdG8uCi0gIEdldENQcm90b0luc2lkZVB5UHJvdG9QdHIgPSBHZXRDUHJvdG9JbnNpZGVQeVByb3RvSW1wbDsKLSAgTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9QdHIgPSBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b0ltcGw7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi1zdGF0aWMgUHlNZXRob2REZWYgTW9kdWxlTWV0aG9kc1tdID0gewotICB7IlNldEFsbG93T3ZlcnNpemVQcm90b3MiLAotICAgIChQeUNGdW5jdGlvbilnb29nbGU6OnByb3RvYnVmOjpweXRob246OmNtZXNzYWdlOjpTZXRBbGxvd092ZXJzaXplUHJvdG9zLAotICAgIE1FVEhfTywgIkVuYWJsZS9kaXNhYmxlIG92ZXJzaXplIHByb3RvIHBhcnNpbmcuIn0sCi0gIHsgTlVMTCwgTlVMTH0KLX07Ci0KLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLXN0YXRpYyBzdHJ1Y3QgUHlNb2R1bGVEZWYgX21vZHVsZSA9IHsKLSAgUHlNb2R1bGVEZWZfSEVBRF9JTklULAotICAiX21lc3NhZ2UiLAotICBnb29nbGU6OnByb3RvYnVmOjpweXRob246Om1vZHVsZV9kb2NzdHJpbmcsCi0gIC0xLAotICBNb2R1bGVNZXRob2RzLCAgLyogbV9tZXRob2RzICovCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwsCi0gIE5VTEwKLX07Ci0jZGVmaW5lIElOSVRGVU5DIFB5SW5pdF9fbWVzc2FnZQotI2RlZmluZSBJTklURlVOQ19FUlJPUlZBTCBOVUxMCi0jZWxzZSAgLy8gUHl0aG9uIDIKLSNkZWZpbmUgSU5JVEZVTkMgaW5pdF9tZXNzYWdlCi0jZGVmaW5lIElOSVRGVU5DX0VSUk9SVkFMCi0jZW5kaWYKLQotZXh0ZXJuICJDIiB7Ci0gIFB5TU9ESU5JVF9GVU5DIElOSVRGVU5DKHZvaWQpIHsKLSAgICBQeU9iamVjdCogbTsKLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLSAgICBtID0gUHlNb2R1bGVfQ3JlYXRlKCZfbW9kdWxlKTsKLSNlbHNlCi0gICAgbSA9IFB5X0luaXRNb2R1bGUzKCJfbWVzc2FnZSIsIE1vZHVsZU1ldGhvZHMsCi0gICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OnB5dGhvbjo6bW9kdWxlX2RvY3N0cmluZyk7Ci0jZW5kaWYKLSAgICBpZiAobSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gSU5JVEZVTkNfRVJST1JWQUw7Ci0gICAgfQotCi0gICAgaWYgKCFnb29nbGU6OnByb3RvYnVmOjpweXRob246OkluaXRQcm90bzJNZXNzYWdlTW9kdWxlKG0pKSB7Ci0gICAgICBQeV9ERUNSRUYobSk7Ci0gICAgICByZXR1cm4gSU5JVEZVTkNfRVJST1JWQUw7Ci0gICAgfQotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gICAgcmV0dXJuIG07Ci0jZW5kaWYKLSAgfQotfQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9tZXNzYWdlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2E0YmVjOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBhbnVyYWFnQGdvb2dsZS5jb20gKEFudXJhYWcgQWdyYXdhbCkKLS8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NRVNTQUdFX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9NRVNTQUdFX0hfXwotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RyaW5nPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLWNsYXNzIE1lc3NhZ2U7Ci1jbGFzcyBSZWZsZWN0aW9uOwotY2xhc3MgRmllbGREZXNjcmlwdG9yOwotY2xhc3MgRGVzY3JpcHRvcjsKLWNsYXNzIERlc2NyaXB0b3JQb29sOwotY2xhc3MgTWVzc2FnZUZhY3Rvcnk7Ci0KLSNpZmRlZiBfU0hBUkVEX1BUUl9ICi11c2luZyBzdGQ6OnNoYXJlZF9wdHI7Ci11c2luZyA6OnN0ZDo6c3RyaW5nOwotI2Vsc2UKLXVzaW5nIGludGVybmFsOjpzaGFyZWRfcHRyOwotI2VuZGlmCi0KLW5hbWVzcGFjZSBweXRob24gewotCi1zdHJ1Y3QgRXh0ZW5zaW9uRGljdDsKLXN0cnVjdCBQeURlc2NyaXB0b3JQb29sOwotCi10eXBlZGVmIHN0cnVjdCBDTWVzc2FnZSB7Ci0gIFB5T2JqZWN0X0hFQUQ7Ci0KLSAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIEMrKyBNZXNzYWdlIG9iamVjdCB0aGF0IG93bnMgdGhlIHdob2xlCi0gIC8vIHByb3RvIHRyZWUuICBFdmVyeSBQeXRob24gQ01lc3NhZ2UgaG9sZHMgYSByZWZlcmVuY2UgdG8gaXQgaW4KLSAgLy8gb3JkZXIgdG8ga2VlcCBpdCBhbGl2ZSBhcyBsb25nIGFzIHRoZXJlJ3MgYSBQeXRob24gb2JqZWN0IHRoYXQKLSAgLy8gcmVmZXJlbmNlcyBhbnkgcGFydCBvZiB0aGUgdHJlZS4KLSAgc2hhcmVkX3B0cjxNZXNzYWdlPiBvd25lcjsKLQotICAvLyBXZWFrIHJlZmVyZW5jZSB0byBhIHBhcmVudCBDTWVzc2FnZSBvYmplY3QuIFRoaXMgaXMgTlVMTCBmb3IgYW55IHRvcC1sZXZlbAotICAvLyBtZXNzYWdlIGFuZCBpcyBzZXQgZm9yIGFueSBjaGlsZCBtZXNzYWdlIChpLmUuIGEgY2hpbGQgc3VibWVzc2FnZSBvciBhCi0gIC8vIHBhcnQgb2YgYSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQpLgotICAvLwotICAvLyBVc2VkIHRvIG1ha2Ugc3VyZSBhbGwgYW5jZXN0b3JzIGFyZSBhbHNvIG11dGFibGUgd2hlbiBmaXJzdCBtb2RpZnlpbmcKLSAgLy8gYSBjaGlsZCBzdWJtZXNzYWdlIChpbiBvdGhlciB3b3JkcywgdHVybmluZyBhIGRlZmF1bHQgbWVzc2FnZSBpbnN0YW5jZQotICAvLyBpbnRvIGEgbXV0YWJsZSBvbmUpLgotICAvLwotICAvLyBJZiBhIHN1Ym1lc3NhZ2UgaXMgcmVsZWFzZWQgKGJlY29tZXMgYSBuZXcgdG9wLWxldmVsIG1lc3NhZ2UpLCB0aGlzIGZpZWxkCi0gIC8vIE1VU1QgYmUgc2V0IHRvIE5VTEwuIFRoZSBwYXJlbnQgbWF5IGdldCBkZWFsbG9jYXRlZCBhbmQgZnVydGhlciBhdHRlbXB0cwotICAvLyB0byB1c2UgdGhpcyBwb2ludGVyIHdpbGwgcmVzdWx0IGluIGEgY3Jhc2guCi0gIHN0cnVjdCBDTWVzc2FnZSogcGFyZW50OwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIHBhcmVudCdzIGRlc2NyaXB0b3IgdGhhdCBkZXNjcmliZXMgdGhpcyBzdWJtZXNzYWdlLgotICAvLyBVc2VkIHRvZ2V0aGVyIHdpdGggdGhlIHBhcmVudCdzIG1lc3NhZ2Ugd2hlbiBtYWtpbmcgYSBkZWZhdWx0IG1lc3NhZ2UKLSAgLy8gaW5zdGFuY2UgbXV0YWJsZS4KLSAgLy8gVGhlIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbC4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBDKysgTWVzc2FnZSBvYmplY3QgZm9yIHRoaXMgQ01lc3NhZ2UuICBUaGUKLSAgLy8gQ01lc3NhZ2UgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KLSAgTWVzc2FnZSogbWVzc2FnZTsKLQotICAvLyBJbmRpY2F0ZXMgdGhpcyBzdWJtZXNzYWdlIGlzIHBvaW50aW5nIHRvIGEgZGVmYXVsdCBpbnN0YW5jZSBvZiBhIG1lc3NhZ2UuCi0gIC8vIFN1Ym1lc3NhZ2VzIGFyZSBhbHdheXMgZmlyc3QgY3JlYXRlZCBhcyByZWFkIG9ubHkgbWVzc2FnZXMgYW5kIGFyZSB0aGVuCi0gIC8vIG1hZGUgd3JpdGFibGUsIGF0IHdoaWNoIHBvaW50IHRoaXMgZmllbGQgaXMgc2V0IHRvIGZhbHNlLgotICBib29sIHJlYWRfb25seTsKLQotICAvLyBBIHJlZmVyZW5jZSB0byBhIFB5dGhvbiBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgQ01lc3NhZ2UsCi0gIC8vIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyLCBhbmQgUmVwZWF0ZWRTY2FsYXJDb250YWluZXIKLSAgLy8gb2JqZWN0cy4gVXNlZCBhcyBhIGNhY2hlIHRvIG1ha2Ugc3VyZSB3ZSBkb24ndCBoYXZlIHRvIG1ha2UgYQotICAvLyBQeXRob24gd3JhcHBlciBmb3IgdGhlIEMrKyBNZXNzYWdlIG9iamVjdHMgb24gZXZlcnkgYWNjZXNzLCBvcgotICAvLyBkZWFsIHdpdGggdGhlIHN5bmNocm9uaXphdGlvbiBuaWdodG1hcmUgdGhhdCBjb3VsZCBjcmVhdGUuCi0gIFB5T2JqZWN0KiBjb21wb3NpdGVfZmllbGRzOwotCi0gIC8vIEEgcmVmZXJlbmNlIHRvIHRoZSBkaWN0aW9uYXJ5IGNvbnRhaW5pbmcgdGhlIG1lc3NhZ2UncyBleHRlbnNpb25zLgotICAvLyBTaW1pbGFyIHRvIGNvbXBvc2l0ZV9maWVsZHMsIGFjdGluZyBhcyBhIGNhY2hlLCBidXQgYWxzbyBjb250YWlucyB0aGUKLSAgLy8gcmVxdWlyZWQgZXh0ZW5zaW9uIGRpY3QgbG9naWMuCi0gIEV4dGVuc2lvbkRpY3QqIGV4dGVuc2lvbnM7Ci19IENNZXNzYWdlOwotCi1leHRlcm4gUHlUeXBlT2JqZWN0IENNZXNzYWdlX1R5cGU7Ci0KLQotLy8gVGhlIChtZXRhKSB0eXBlIG9mIGFsbCBNZXNzYWdlcyBjbGFzc2VzLgotLy8gSXQgYWxsb3dzIHVzIHRvIGNhY2hlIHNvbWUgQysrIHBvaW50ZXJzIGluIHRoZSBjbGFzcyBvYmplY3QgaXRzZWxmLCB0aGV5IGFyZQotLy8gZmFzdGVyIHRvIGV4dHJhY3QgdGhhbiBmcm9tIHRoZSB0eXBlJ3MgZGljdGlvbmFyeS4KLQotc3RydWN0IENNZXNzYWdlQ2xhc3MgewotICAvLyBUaGlzIGlzIGhvdyBDUHl0aG9uIHN1YmNsYXNzZXMgQyBzdHJ1Y3R1cmVzOiB0aGUgYmFzZSBzdHJ1Y3R1cmUgbXVzdCBiZQotICAvLyB0aGUgZmlyc3QgbWVtYmVyIG9mIHRoZSBvYmplY3QuCi0gIFB5SGVhcFR5cGVPYmplY3Qgc3VwZXI7Ci0KLSAgLy8gQysrIGRlc2NyaXB0b3Igb2YgdGhpcyBtZXNzYWdlLgotICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX2Rlc2NyaXB0b3I7Ci0KLSAgLy8gT3duZWQgcmVmZXJlbmNlLCB1c2VkIHRvIGtlZXAgdGhlIHBvaW50ZXIgYWJvdmUgYWxpdmUuCi0gIFB5T2JqZWN0KiBweV9tZXNzYWdlX2Rlc2NyaXB0b3I7Ci0KLSAgLy8gVGhlIFB5dGhvbiBEZXNjcmlwdG9yUG9vbCB1c2VkIHRvIGNyZWF0ZSB0aGUgY2xhc3MuIEl0IGlzIG5lZWRlZCB0byByZXNvbHZlCi0gIC8vIGZpZWxkcyBkZXNjcmlwdG9ycywgaW5jbHVkaW5nIGV4dGVuc2lvbnMgZmllbGRzOyBpdHMgQysrIE1lc3NhZ2VGYWN0b3J5IGlzCi0gIC8vIHVzZWQgdG8gaW5zdGFudGlhdGUgc3VibWVzc2FnZXMuCi0gIC8vIFRoaXMgY2FuIGJlIGRpZmZlcmVudCBmcm9tIERFU0NSSVBUT1IuZmlsZS5wb29sLCBpbiB0aGUgY2FzZSBvZiBhIGN1c3RvbQotICAvLyBEZXNjcmlwdG9yUG9vbCB3aGljaCBkZWZpbmVzIG5ldyBleHRlbnNpb25zLgotICAvLyBXZSBvd24gdGhlIHJlZmVyZW5jZSwgYmVjYXVzZSBpdCdzIGltcG9ydGFudCB0byBrZWVwIHRoZSBkZXNjcmlwdG9ycyBhbmQKLSAgLy8gZmFjdG9yeSBhbGl2ZS4KLSAgUHlEZXNjcmlwdG9yUG9vbCogcHlfZGVzY3JpcHRvcl9wb29sOwotCi0gIFB5T2JqZWN0KiBBc1B5T2JqZWN0KCkgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4odGhpcyk7Ci0gIH0KLX07Ci0KLQotbmFtZXNwYWNlIGNtZXNzYWdlIHsKLQotLy8gSW50ZXJuYWwgZnVuY3Rpb24gdG8gY3JlYXRlIGEgbmV3IGVtcHR5IE1lc3NhZ2UgUHl0aG9uIG9iamVjdCwgYnV0IHdpdGggZW1wdHkKLS8vIHBvaW50ZXJzIHRvIHRoZSBDKysgb2JqZWN0cy4KLS8vIFRoZSBjYWxsZXIgbXVzdCBmaWxsIHNlbGYtPm1lc3NhZ2UsIHNlbGYtPm93bmVyIGFuZCBldmVudHVhbGx5IHNlbGYtPnBhcmVudC4KLUNNZXNzYWdlKiBOZXdFbXB0eU1lc3NhZ2UoQ01lc3NhZ2VDbGFzcyogdHlwZSk7Ci0KLS8vIFJlbGVhc2UgYSBzdWJtZXNzYWdlIGZyb20gaXRzIHByb3RvIHRyZWUsIG1ha2luZyBpdCBhIG5ldyB0b3AtbGV2ZWwgbWVzc2dhZS4KLS8vIEEgbmV3IG1lc3NhZ2Ugd2lsbCBiZSBjcmVhdGVkIGlmIHRoaXMgaXMgYSByZWFkLW9ubHkgZGVmYXVsdCBpbnN0YW5jZS4KLS8vCi0vLyBDb3JyZXNwb25kcyB0byByZWZsZWN0aW9uIGFwaSBtZXRob2QgUmVsZWFzZU1lc3NhZ2UuCi1pbnQgUmVsZWFzZVN1Yk1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgIENNZXNzYWdlKiBjaGlsZF9jbWVzc2FnZSk7Ci0KLS8vIFJldHJpZXZlcyB0aGUgQysrIGRlc2NyaXB0b3Igb2YgYSBQeXRob24gRXh0ZW5zaW9uIGRlc2NyaXB0b3IuCi0vLyBPbiBlcnJvciwgcmV0dXJuIE5VTEwgd2l0aCBhbiBleGNlcHRpb24gc2V0LgotY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKFB5T2JqZWN0KiBleHRlbnNpb24pOwotCi0vLyBJbml0aWFsaXplcyBhIG5ldyBDTWVzc2FnZSBpbnN0YW5jZSBmb3IgYSBzdWJtZXNzYWdlLiBPbmx5IGNhbGxlZCBvbmNlIHBlcgotLy8gc3VibWVzc2FnZSBhcyB0aGUgcmVzdWx0IGlzIGNhY2hlZCBpbiBjb21wb3NpdGVfZmllbGRzLgotLy8KLS8vIENvcnJlc3BvbmRzIHRvIHJlZmxlY3Rpb24gYXBpIG1ldGhvZCBHZXRNZXNzYWdlLgotUHlPYmplY3QqIEludGVybmFsR2V0U3ViTWVzc2FnZSgKLSAgICBDTWVzc2FnZSogc2VsZiwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yKTsKLQotLy8gRGVsZXRlcyBhIHJhbmdlIG9mIEMrKyBzdWJtZXNzYWdlcyBpbiBhIHJlcGVhdGVkIGZpZWxkIChmb2xsb3dpbmcgYQotLy8gcmVtb3ZhbCBpbiBhIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKS4KLS8vCi0vLyBSZWxlYXNlcyBtZXNzYWdlcyB0byB0aGUgcHJvdmlkZWQgY21lc3NhZ2VfbGlzdCBpZiBpdCBpcyBub3QgTlVMTCByYXRoZXIKLS8vIHRoYW4ganVzdCByZW1vdmluZyB0aGVtIGZyb20gdGhlIHVuZGVybHlpbmcgcHJvdG8uIFRoaXMgY21lc3NhZ2VfbGlzdCBtdXN0Ci0vLyBoYXZlIGEgQ01lc3NhZ2UgZm9yIGVhY2ggdW5kZXJseWluZyBzdWJtZXNzYWdlLiBUaGUgQ01lc3NhZ2VzIHJlZmVycmVkIHRvCi0vLyBieSBzbGljZSB3aWxsIGJlIHJlbW92ZWQgZnJvbSBjbWVzc2FnZV9saXN0IGJ5IHRoaXMgZnVuY3Rpb24uCi0vLwotLy8gQ29ycmVzcG9uZHMgdG8gcmVmbGVjdGlvbiBhcGkgbWV0aG9kIFJlbW92ZUxhc3QuCi1pbnQgSW50ZXJuYWxEZWxldGVSZXBlYXRlZEZpZWxkKENNZXNzYWdlKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBzbGljZSwgUHlPYmplY3QqIGNtZXNzYWdlX2xpc3QpOwotCi0vLyBTZXRzIHRoZSBzcGVjaWZpZWQgc2NhbGFyIHZhbHVlIHRvIHRoZSBtZXNzYWdlLgotaW50IEludGVybmFsU2V0U2NhbGFyKENNZXNzYWdlKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogdmFsdWUpOwotCi0vLyBTZXRzIHRoZSBzcGVjaWZpZWQgc2NhbGFyIHZhbHVlIHRvIHRoZSBtZXNzYWdlLiAgUmVxdWlyZXMgaXQgaXMgbm90IGEgT25lb2YuCi1pbnQgSW50ZXJuYWxTZXROb25PbmVvZlNjYWxhcihNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIGFyZyk7Ci0KLS8vIFJldHJpZXZlcyB0aGUgc3BlY2lmaWVkIHNjYWxhciB2YWx1ZSBmcm9tIHRoZSBtZXNzYWdlLgotLy8KLS8vIFJldHVybnMgYSBuZXcgcHl0aG9uIHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBJbnRlcm5hbEdldFNjYWxhcihjb25zdCBNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcik7Ci0KLS8vIENsZWFycyB0aGUgbWVzc2FnZSwgcmVtb3ZpbmcgYWxsIGNvbnRhaW5lZCBkYXRhLiBFeHRlbnNpb24gZGljdGlvbmFyeSBhbmQKLS8vIHN1Ym1lc3NhZ2VzIGFyZSByZWxlYXNlZCBmaXJzdCBpZiB0aGVyZSBhcmUgcmVtYWluaW5nIGV4dGVybmFsIHJlZmVyZW5jZXMuCi0vLwotLy8gQ29ycmVzcG9uZHMgdG8gbWVzc2FnZSBhcGkgbWV0aG9kIENsZWFyLgotUHlPYmplY3QqIENsZWFyKENNZXNzYWdlKiBzZWxmKTsKLQotLy8gQ2xlYXJzIHRoZSBkYXRhIGRlc2NyaWJlZCBieSB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gVXNlZCB0byBjbGVhciBleHRlbnNpb25zCi0vLyAod2hpY2ggZG9uJ3QgaGF2ZSBuYW1lcykuIEV4dGVuc2lvbiByZWxlYXNlIGlzIGhhbmRsZWQgYnkgRXh0ZW5zaW9uRGljdAotLy8gY2xhc3MsIG5vdCB0aGlzIGZ1bmN0aW9uLgotLy8gVE9ETyhhbnVyYWFnKTogVHJ5IHRvIG1ha2UgdGhpcyBkaXNjcmVwYW5jeSBpbiByZWxlYXNlIHNlbWFudGljcyB3aXRoCi0vLyAgICAgICAgICAgICAgICBDbGVhckZpZWxkIGxlc3MgY29uZnVzaW5nLgotLy8KLS8vIENvcnJlc3BvbmRzIHRvIHJlZmxlY3Rpb24gYXBpIG1ldGhvZCBDbGVhckZpZWxkLgotUHlPYmplY3QqIENsZWFyRmllbGRCeURlc2NyaXB0b3IoCi0gICAgQ01lc3NhZ2UqIHNlbGYsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0KLS8vIENsZWFycyB0aGUgZGF0YSBmb3IgdGhlIGdpdmVuIGZpZWxkIG5hbWUuIFRoZSBtZXNzYWdlIGlzIHJlbGVhc2VkIGlmIHRoZXJlCi0vLyBhcmUgYW55IGV4dGVybmFsIHJlZmVyZW5jZXMuCi0vLwotLy8gQ29ycmVzcG9uZHMgdG8gcmVmbGVjdGlvbiBhcGkgbWV0aG9kIENsZWFyRmllbGQuCi1QeU9iamVjdCogQ2xlYXJGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZyk7Ci0KLS8vIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIGZpZWxkIGRlc2NyaWJlZCBieSB0aGUgZGVzY3JpcHRvci4gVXNlZCBmb3IKLS8vIGV4dGVuc2lvbnMgKHdoaWNoIGhhdmUgbm8gbmFtZSkuCi0vLwotLy8gQ29ycmVzcG9uZHMgdG8gcmVmbGVjdGlvbiBhcGkgbWV0aG9kIEhhc0ZpZWxkCi1QeU9iamVjdCogSGFzRmllbGRCeURlc2NyaXB0b3IoCi0gICAgQ01lc3NhZ2UqIHNlbGYsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcik7Ci0KLS8vIENoZWNrcyBpZiB0aGUgbWVzc2FnZSBoYXMgdGhlIG5hbWVkIGZpZWxkLgotLy8KLS8vIENvcnJlc3BvbmRzIHRvIHJlZmxlY3Rpb24gYXBpIG1ldGhvZCBIYXNGaWVsZC4KLVB5T2JqZWN0KiBIYXNGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZyk7Ci0KLS8vIEluaXRpYWxpemVzIHZhbHVlcyBvZiBmaWVsZHMgb24gYSBuZXdseSBjb25zdHJ1Y3RlZCBtZXNzYWdlLgotaW50IEluaXRBdHRyaWJ1dGVzKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCoga3dhcmdzKTsKLQotUHlPYmplY3QqIE1lcmdlRnJvbShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZyk7Ci0KLS8vIFJldHJpZXZlcyBhbiBhdHRyaWJ1dGUgbmFtZWQgJ25hbWUnIGZyb20gQ01lc3NhZ2UgJ3NlbGYnLiBSZXR1cm5zCi0vLyB0aGUgYXR0cmlidXRlIHZhbHVlIG9uIHN1Y2Nlc3MsIG9yIE5VTEwgb24gZmFpbHVyZS4KLS8vCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZS4KLVB5T2JqZWN0KiBHZXRBdHRyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogbmFtZSk7Ci0KLS8vIFNldCB0aGUgdmFsdWUgb2YgdGhlIGF0dHJpYnV0ZSBuYW1lZCAnbmFtZScsIGZvciBDTWVzc2FnZSAnc2VsZicsCi0vLyB0byB0aGUgdmFsdWUgJ3ZhbHVlJy4gUmV0dXJucyAtMSBvbiBmYWlsdXJlLgotaW50IFNldEF0dHIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBuYW1lLCBQeU9iamVjdCogdmFsdWUpOwotCi1QeU9iamVjdCogRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKENNZXNzYWdlKiBzZWxmKTsKLQotLy8gU2V0IHRoZSBvd25lciBmaWVsZCBvZiBzZWxmIGFuZCBhbnkgY2hpbGRyZW4gb2Ygc2VsZiwgcmVjdXJzaXZlbHkuCi0vLyBVc2VkIHdoZW4gc2VsZiBpcyBiZWluZyByZWxlYXNlZCBhbmQgdGh1cyBoYXMgYSBuZXcgb3duZXIgKHRoZQotLy8gcmVsZWFzZWQgTWVzc2FnZS4pCi1pbnQgU2V0T3duZXIoQ01lc3NhZ2UqIHNlbGYsIGNvbnN0IHNoYXJlZF9wdHI8TWVzc2FnZT4mIG5ld19vd25lcik7Ci0KLWludCBBc3N1cmVXcml0YWJsZShDTWVzc2FnZSogc2VsZik7Ci0KLS8vIFJldHVybnMgdGhlICJiZXN0IiBEZXNjcmlwdG9yUG9vbCBmb3IgdGhlIGdpdmVuIG1lc3NhZ2UuCi0vLyBUaGlzIGlzIG9mdGVuIGVxdWl2YWxlbnQgdG8gbWVzc2FnZS5ERVNDUklQVE9SLnBvb2wsIGJ1dCBub3QgYWx3YXlzLCB3aGVuCi0vLyB0aGUgbWVzc2FnZSBjbGFzcyB3YXMgY3JlYXRlZCBmcm9tIGEgTWVzc2FnZUZhY3RvcnkgdXNpbmcgYSBjdXN0b20gcG9vbCB3aGljaAotLy8gdXNlcyB0aGUgZ2VuZXJhdGVkIHBvb2wgYXMgYW4gdW5kZXJsYXkuCi0vLwotLy8gVGhlIHJldHVybmVkIHBvb2wgaXMgc3VpdGFibGUgZm9yIGZpbmRpbmcgZmllbGRzIGFuZCBidWlsZGluZyBzdWJtZXNzYWdlcywKLS8vIGV2ZW4gaW4gdGhlIGNhc2Ugb2YgZXh0ZW5zaW9ucy4KLVB5RGVzY3JpcHRvclBvb2wqIEdldERlc2NyaXB0b3JQb29sRm9yTWVzc2FnZShDTWVzc2FnZSogbWVzc2FnZSk7Ci0KLX0gIC8vIG5hbWVzcGFjZSBjbWVzc2FnZQotCi0KLS8qIElzIDY0Yml0ICovCi0jZGVmaW5lIElTXzY0QklUIChTSVpFT0ZfTE9ORyA9PSA4KQotCi0jZGVmaW5lIEZJRUxEX0lTX1JFUEVBVEVEKGZpZWxkX2Rlc2NyaXB0b3IpICAgICAgICAgICAgICAgICBcCi0gICAgKChmaWVsZF9kZXNjcmlwdG9yKS0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKQotCi0jZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSwgZXJyKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQzMiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSwga2ludDMybWluX3B5LCBraW50MzJtYXhfcHkpKSB7IFwKLSAgICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUsIGVycikgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50NjQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFDaGVja0FuZEdldEludGVnZXIoYXJnLCAmdmFsdWUsIGtpbnQ2NG1pbl9weSwga2ludDY0bWF4X3B5KSkgeyBcCi0gICAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9VSU5UMzIoYXJnLCB2YWx1ZSwgZXJyKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQzMiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghQ2hlY2tBbmRHZXRJbnRlZ2VyKGFyZywgJnZhbHVlLCBrUHl0aG9uWmVybywga3VpbnQzMm1heF9weSkpIHsgXAotICAgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0jZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfVUlOVDY0KGFyZywgdmFsdWUsIGVycikgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50NjQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSwga1B5dGhvblplcm8sIGt1aW50NjRtYXhfcHkpKSB7IFwKLSAgICAgIHJldHVybiBlcnI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUsIGVycikgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmxvYXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFDaGVja0FuZEdldEZsb2F0KGFyZywgJnZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0RPVUJMRShhcmcsIHZhbHVlLCBlcnIpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG91YmxlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFDaGVja0FuZEdldERvdWJsZShhcmcsICZ2YWx1ZSkpIHsgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gZXJyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9CT09MKGFyZywgdmFsdWUsIGVycikgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJvb2wgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghQ2hlY2tBbmRHZXRCb29sKGFyZywgJnZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIGVycjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0KLWV4dGVybiBQeU9iamVjdCoga1B5dGhvblplcm87Ci1leHRlcm4gUHlPYmplY3QqIGtpbnQzMm1pbl9weTsKLWV4dGVybiBQeU9iamVjdCoga2ludDMybWF4X3B5OwotZXh0ZXJuIFB5T2JqZWN0KiBrdWludDMybWF4X3B5OwotZXh0ZXJuIFB5T2JqZWN0KiBraW50NjRtaW5fcHk7Ci1leHRlcm4gUHlPYmplY3QqIGtpbnQ2NG1heF9weTsKLWV4dGVybiBQeU9iamVjdCoga3VpbnQ2NG1heF9weTsKLQotI2RlZmluZSBGVUxMX01PRFVMRV9OQU1FICJnb29nbGUucHJvdG9idWYucHlleHQuX21lc3NhZ2UiCi0KLXZvaWQgRm9ybWF0VHlwZUVycm9yKFB5T2JqZWN0KiBhcmcsIGNoYXIqIGV4cGVjdGVkX3R5cGVzKTsKLXRlbXBsYXRlPGNsYXNzIFQ+Ci1ib29sIENoZWNrQW5kR2V0SW50ZWdlcigKLSAgICBQeU9iamVjdCogYXJnLCBUKiB2YWx1ZSwgUHlPYmplY3QqIG1pbiwgUHlPYmplY3QqIG1heCk7Ci1ib29sIENoZWNrQW5kR2V0RG91YmxlKFB5T2JqZWN0KiBhcmcsIGRvdWJsZSogdmFsdWUpOwotYm9vbCBDaGVja0FuZEdldEZsb2F0KFB5T2JqZWN0KiBhcmcsIGZsb2F0KiB2YWx1ZSk7Ci1ib29sIENoZWNrQW5kR2V0Qm9vbChQeU9iamVjdCogYXJnLCBib29sKiB2YWx1ZSk7Ci1QeU9iamVjdCogQ2hlY2tTdHJpbmcoUHlPYmplY3QqIGFyZywgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLWJvb2wgQ2hlY2tBbmRTZXRTdHJpbmcoCi0gICAgUHlPYmplY3QqIGFyZywgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICBib29sIGFwcGVuZCwKLSAgICBpbnQgaW5kZXgpOwotUHlPYmplY3QqIFRvU3RyaW5nT2JqZWN0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgc3RyaW5nIHZhbHVlKTsKLQotLy8gQ2hlY2sgaWYgdGhlIHBhc3NlZCBmaWVsZCBkZXNjcmlwdG9yIGJlbG9uZ3MgdG8gdGhlIGdpdmVuIG1lc3NhZ2UuCi0vLyBJZiBub3QsIHJldHVybiBmYWxzZSBhbmQgc2V0IGEgUHl0aG9uIGV4Y2VwdGlvbiAoYSBLZXlFcnJvcikKLWJvb2wgQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBtZXNzYWdlKTsKLQotZXh0ZXJuIFB5T2JqZWN0KiBQaWNrbGVFcnJvcl9jbGFzczsKLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHJvdG8yX2FwaV90ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9wcm90bzJfYXBpX3Rlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4YWVjZmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9wcm90bzJfYXBpX3Rlc3QucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NwcC9wcm90bzFfYXBpX3Rlc3QucHJvdG8iOwotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWw7Ci0KLW1lc3NhZ2UgVGVzdE5lc3RlZFByb3RvMUFQSU1lc3NhZ2UgewotICBvcHRpb25hbCBpbnQzMiBhID0gMTsKLSAgb3B0aW9uYWwgVGVzdE1lc3NhZ2UuTmVzdGVkTWVzc2FnZSBiID0gMjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjZTY0NWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiB0aWJlbGxAZ29vZ2xlLmNvbSAoSm9oYW4gVGliZWxsKQotLy8KLS8vIFRoZXNlIG1lc3NhZ2UgZGVmaW5pdGlvbnMgYXJlIHVzZWQgdG8gZXhlcmNpc2VzIGtub3duIGNvcm5lciBjYXNlcwotLy8gaW4gdGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHl0aG9uIEFQSS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLXBhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLnB5dGhvbi5pbnRlcm5hbDsKLQotLy8gUHJvdG9zIG9wdGltaXplZCBmb3IgU1BFRUQgdXNlIGEgc3RyaWN0IHN1cGVyc2V0IG9mIHRoZSBnZW5lcmF0ZWQgY29kZQotLy8gb2YgZXF1aXZhbGVudCBvbmVzIG9wdGltaXplZCBmb3IgQ09ERV9TSVpFLCBzbyB3ZSBzaG91bGQgb3B0aW1pemUgYWxsIG91cgotLy8gdGVzdHMgZm9yIHNwZWVkIHVubGVzcyBleHBsaWNpdGx5IHRlc3RpbmcgY29kZSBzaXplIG9wdGltaXphdGlvbi4KLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKLQotbWVzc2FnZSBUZXN0QWxsVHlwZXMgewotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKLSAgICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBjYyA9IDI7Ci0gIH0KLQotICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlID0gMTsKLSAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSA9IDI7Ci0gIG9wdGlvbmFsIGludDMyIG9wdGlvbmFsX2ludDMyID0gMzsKLX0KLQotbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIGludDMyIGMgPSAxOwotICByZXBlYXRlZCBpbnQzMiBkID0gMjsKLX0KLQotbWVzc2FnZSBUZXN0QWxsRXh0ZW5zaW9ucyB7Ci0gIGV4dGVuc2lvbnMgMSB0byBtYXg7Ci19Ci0KLWV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7Ci0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiA9IDE7Ci0gIHJlcGVhdGVkIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcHJvdG9idWYuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYmViNmU0Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5oCisrKyAvZGV2L251bGwKQEAgLTEsNTcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogcXJjemFrQGdvb2dsZS5jb20gKE1hcmNpbiBLb3dhbGN6eWspCi0vLwotLy8gVGhpcyBtb2R1bGUgZXhwb3NlcyB0aGUgQyBwcm90byBpbnNpZGUgdGhlIGdpdmVuIFB5dGhvbiBwcm90bywgaW4KLS8vIGNhc2UgdGhlIFB5dGhvbiBwcm90byBpcyBpbXBsZW1lbnRlZCB3aXRoIGEgQyBwcm90by4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX1BZVEhPTl9QUk9UT0JVRl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QWVRIT05fUFJPVE9CVUZfSF9fCi0KLSNpbmNsdWRlIDxQeXRob24uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1jbGFzcyBNZXNzYWdlOwotCi1uYW1lc3BhY2UgcHl0aG9uIHsKLQotLy8gUmV0dXJuIHRoZSBwb2ludGVyIHRvIHRoZSBDIHByb3RvIGluc2lkZSB0aGUgZ2l2ZW4gUHl0aG9uIHByb3RvLAotLy8gb3IgTlVMTCB3aGVuIHRoaXMgaXMgbm90IGEgUHl0aG9uIHByb3RvIGltcGxlbWVudGVkIHdpdGggYSBDIHByb3RvLgotY29uc3QgTWVzc2FnZSogR2V0Q1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKTsKLU1lc3NhZ2UqIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvKFB5T2JqZWN0KiBtc2cpOwotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX1BZVEhPTl9QUk9UT0JVRl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGYzMzllNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw2MTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogYW51cmFhZ0Bnb29nbGUuY29tIChBbnVyYWFnIEFncmF3YWwpCi0vLyBBdXRob3I6IHRpYmVsbEBnb29nbGUuY29tIChKb2hhbiBUaWJlbGwpCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lci5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9kZXNjcmlwdG9yX3Bvb2wuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9zY29wZWRfcHlvYmplY3RfcHRyLmg+Ci0KLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLSAgI2RlZmluZSBQeUludF9DaGVjayBQeUxvbmdfQ2hlY2sKLSAgI2RlZmluZSBQeUludF9Bc0xvbmcgUHlMb25nX0FzTG9uZwotICAjZGVmaW5lIFB5SW50X0Zyb21Mb25nIFB5TG9uZ19Gcm9tTG9uZwotI2VuZGlmCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi1uYW1lc3BhY2UgcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lciB7Ci0KLS8vIFRPRE8odGliZWxsKTogV2UgbWlnaHQgYWxzbyB3YW50IHRvIGNoZWNrOgotLy8gICBHT09HTEVfQ0hFQ0tfTk9UTlVMTCgoc2VsZiktPm93bmVyLmdldCgpKTsKLSNkZWZpbmUgR09PR0xFX0NIRUNLX0FUVEFDSEVEKHNlbGYpICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKChzZWxmKS0+bWVzc2FnZSk7ICAgICAgXAotICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKChzZWxmKS0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOyBcCi0gIH0gd2hpbGUgKDApOwotCi0jZGVmaW5lIEdPT0dMRV9DSEVDS19SRUxFQVNFRChzZWxmKSAgICAgICAgICAgICBcCi0gIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHT09HTEVfQ0hFQ0soKHNlbGYpLT5vd25lci5nZXQoKSA9PSBOVUxMKTsgIFwKLSAgICBHT09HTEVfQ0hFQ0soKHNlbGYpLT5tZXNzYWdlID09IE5VTEwpOyAgICAgIFwKLSAgICBHT09HTEVfQ0hFQ0soKHNlbGYpLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKTsgXAotICAgIEdPT0dMRV9DSEVDSygoc2VsZiktPnBhcmVudCA9PSBOVUxMKTsgICAgICAgXAotICB9IHdoaWxlICgwKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBsZW4oKQotCi1zdGF0aWMgUHlfc3NpemVfdCBMZW5ndGgoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYpIHsKLSAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7Ci0gIGlmIChtZXNzYWdlICE9IE5VTEwpIHsKLSAgICByZXR1cm4gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoKm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBUaGUgY29udGFpbmVyIGhhcyBiZWVuIHJlbGVhc2VkIChpLmUuIGJ5IGEgY2FsbCB0byBDbGVhcigpIG9yCi0gICAgLy8gQ2xlYXJGaWVsZCgpIG9uIHRoZSBwYXJlbnQpIGFuZCB0aHVzIHRoZXJlJ3Mgbm8gbWVzc2FnZS4KLSAgICByZXR1cm4gUHlMaXN0X0dFVF9TSVpFKHNlbGYtPmNoaWxkX21lc3NhZ2VzKTsKLSAgfQotfQotCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bDsgcmV0dXJucyAtMSBhbmQgc2V0cyBhbiBleGNlcHRpb24gaWYKLS8vIHVuc3VjY2Vzc2Z1bC4KLXN0YXRpYyBpbnQgVXBkYXRlQ2hpbGRNZXNzYWdlcyhSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZikgewotICBpZiAoc2VsZi0+bWVzc2FnZSA9PSBOVUxMKQotICAgIHJldHVybiAwOwotCi0gIC8vIEEgTWVyZ2VGcm9tIG9uIGEgcGFyZW50IG1lc3NhZ2UgY291bGQgaGF2ZSBjYXVzZWQgZXh0cmEgbWVzc2FnZXMgdG8gYmUKLSAgLy8gYWRkZWQgaW4gdGhlIHVuZGVybHlpbmcgcHJvdG9idWYgc28gYWRkIHRoZW0gdG8gb3VyIGxpc3QuIFRoZXkgY2FuIG5ldmVyCi0gIC8vIGJlIHJlbW92ZWQgaW4gc3VjaCBhIHdheSBzbyB0aGVyZSdzIG5vIG5lZWQgdG8gd29ycnkgYWJvdXQgdGhhdC4KLSAgUHlfc3NpemVfdCBtZXNzYWdlX2xlbmd0aCA9IExlbmd0aChzZWxmKTsKLSAgUHlfc3NpemVfdCBjaGlsZF9sZW5ndGggPSBQeUxpc3RfR0VUX1NJWkUoc2VsZi0+Y2hpbGRfbWVzc2FnZXMpOwotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgZm9yIChQeV9zc2l6ZV90IGkgPSBjaGlsZF9sZW5ndGg7IGkgPCBtZXNzYWdlX2xlbmd0aDsgKytpKSB7Ci0gICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UoCi0gICAgICAgICooc2VsZi0+bWVzc2FnZSksIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yLCBpKTsKLSAgICBDTWVzc2FnZSogY21zZyA9IGNtZXNzYWdlOjpOZXdFbXB0eU1lc3NhZ2Uoc2VsZi0+Y2hpbGRfbWVzc2FnZV9jbGFzcyk7Ci0gICAgU2NvcGVkUHlPYmplY3RQdHIgcHlfY21zZyhyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oY21zZykpOwotICAgIGlmIChjbXNnID09IE5VTEwpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgY21zZy0+b3duZXIgPSBzZWxmLT5vd25lcjsKLSAgICBjbXNnLT5tZXNzYWdlID0gY29uc3RfY2FzdDxNZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKLSAgICBjbXNnLT5wYXJlbnQgPSBzZWxmLT5wYXJlbnQ7Ci0gICAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+Y2hpbGRfbWVzc2FnZXMsIHB5X2Ntc2cuZ2V0KCkpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBhZGQoKQotCi1zdGF0aWMgUHlPYmplY3QqIEFkZFRvQXR0YWNoZWQoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIGt3YXJncykgewotICBHT09HTEVfQ0hFQ0tfQVRUQUNIRUQoc2VsZik7Ci0KLSAgaWYgKFVwZGF0ZUNoaWxkTWVzc2FnZXMoc2VsZikgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpID09IC0xKQotICAgIHJldHVybiBOVUxMOwotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPQotICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5BZGRNZXNzYWdlKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOwotICBDTWVzc2FnZSogY21zZyA9IGNtZXNzYWdlOjpOZXdFbXB0eU1lc3NhZ2Uoc2VsZi0+Y2hpbGRfbWVzc2FnZV9jbGFzcyk7Ci0gIGlmIChjbXNnID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgY21zZy0+b3duZXIgPSBzZWxmLT5vd25lcjsKLSAgY21zZy0+bWVzc2FnZSA9IHN1Yl9tZXNzYWdlOwotICBjbXNnLT5wYXJlbnQgPSBzZWxmLT5wYXJlbnQ7Ci0gIGlmIChjbWVzc2FnZTo6SW5pdEF0dHJpYnV0ZXMoY21zZywga3dhcmdzKSA8IDApIHsKLSAgICBQeV9ERUNSRUYoY21zZyk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBQeU9iamVjdCogcHlfY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihjbXNnKTsKLSAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+Y2hpbGRfbWVzc2FnZXMsIHB5X2Ntc2cpIDwgMCkgewotICAgIFB5X0RFQ1JFRihweV9jbXNnKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcHlfY21zZzsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBBZGRUb1JlbGVhc2VkKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBrd2FyZ3MpIHsKLSAgR09PR0xFX0NIRUNLX1JFTEVBU0VEKHNlbGYpOwotCi0gIC8vIENyZWF0ZSBhIG5ldyBNZXNzYWdlIGRldGFjaGVkIGZyb20gdGhlIHJlc3QuCi0gIFB5T2JqZWN0KiBweV9jbXNnID0gUHlFdmFsX0NhbGxPYmplY3RXaXRoS2V5d29yZHMoCi0gICAgICBzZWxmLT5jaGlsZF9tZXNzYWdlX2NsYXNzLT5Bc1B5T2JqZWN0KCksIE5VTEwsIGt3YXJncyk7Ci0gIGlmIChweV9jbXNnID09IE5VTEwpCi0gICAgcmV0dXJuIE5VTEw7Ci0KLSAgaWYgKFB5TGlzdF9BcHBlbmQoc2VsZi0+Y2hpbGRfbWVzc2FnZXMsIHB5X2Ntc2cpIDwgMCkgewotICAgIFB5X0RFQ1JFRihweV9jbXNnKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gcHlfY21zZzsKLX0KLQotUHlPYmplY3QqIEFkZChSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiwKLSAgICAgICAgICAgICAgUHlPYmplY3QqIGFyZ3MsCi0gICAgICAgICAgICAgIFB5T2JqZWN0KiBrd2FyZ3MpIHsKLSAgaWYgKHNlbGYtPm1lc3NhZ2UgPT0gTlVMTCkKLSAgICByZXR1cm4gQWRkVG9SZWxlYXNlZChzZWxmLCBhcmdzLCBrd2FyZ3MpOwotICBlbHNlCi0gICAgcmV0dXJuIEFkZFRvQXR0YWNoZWQoc2VsZiwgYXJncywga3dhcmdzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBleHRlbmQoKQotCi1QeU9iamVjdCogRXh0ZW5kKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogdmFsdWUpIHsKLSAgY21lc3NhZ2U6OkFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCk7Ci0gIGlmIChVcGRhdGVDaGlsZE1lc3NhZ2VzKHNlbGYpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGl0ZXIoUHlPYmplY3RfR2V0SXRlcih2YWx1ZSkpOwotICBpZiAoaXRlciA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIlZhbHVlIG11c3QgYmUgaXRlcmFibGUiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBTY29wZWRQeU9iamVjdFB0ciBuZXh0OwotICB3aGlsZSAoKG5leHQucmVzZXQoUHlJdGVyX05leHQoaXRlci5nZXQoKSkpKSAhPSBOVUxMKSB7Ci0gICAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sobmV4dC5nZXQoKSwgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTm90IGEgY21lc3NhZ2UiKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICBTY29wZWRQeU9iamVjdFB0ciBuZXdfbWVzc2FnZShBZGQoc2VsZiwgTlVMTCwgTlVMTCkpOwotICAgIGlmIChuZXdfbWVzc2FnZSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgQ01lc3NhZ2UqIG5ld19jbWVzc2FnZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihuZXdfbWVzc2FnZS5nZXQoKSk7Ci0gICAgaWYgKFNjb3BlZFB5T2JqZWN0UHRyKGNtZXNzYWdlOjpNZXJnZUZyb20obmV3X2NtZXNzYWdlLCBuZXh0LmdldCgpKSkgPT0KLSAgICAgICAgTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0gIGlmIChQeUVycl9PY2N1cnJlZCgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLVB5T2JqZWN0KiBNZXJnZUZyb20oUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBvdGhlcikgewotICBpZiAoVXBkYXRlQ2hpbGRNZXNzYWdlcyhzZWxmKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gRXh0ZW5kKHNlbGYsIG90aGVyKTsKLX0KLQotUHlPYmplY3QqIFN1YnNjcmlwdChSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIHNsaWNlKSB7Ci0gIGlmIChVcGRhdGVDaGlsZE1lc3NhZ2VzKHNlbGYpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIC8vIEp1c3QgZm9yd2FyZCB0aGUgY2FsbCB0byB0aGUgc3Vic2NyaXB0LWhhbmRsaW5nIGZ1bmN0aW9uIG9mIHRoZQotICAvLyBsaXN0IGNvbnRhaW5pbmcgdGhlIGNoaWxkIG1lc3NhZ2VzLgotICByZXR1cm4gUHlPYmplY3RfR2V0SXRlbShzZWxmLT5jaGlsZF9tZXNzYWdlcywgc2xpY2UpOwotfQotCi1pbnQgQXNzaWduU3Vic2NyaXB0KFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogc2xpY2UsCi0gICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiB2YWx1ZSkgewotICBpZiAoVXBkYXRlQ2hpbGRNZXNzYWdlcyhzZWxmKSA8IDApIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgaWYgKHZhbHVlICE9IE5VTEwpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiZG9lcyBub3Qgc3VwcG9ydCBhc3NpZ25tZW50Iik7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0KLSAgLy8gRGVsZXRlIGZyb20gdGhlIHVuZGVybHlpbmcgTWVzc2FnZSwgaWYgYW55LgotICBpZiAoc2VsZi0+cGFyZW50ICE9IE5VTEwpIHsKLSAgICBpZiAoY21lc3NhZ2U6OkludGVybmFsRGVsZXRlUmVwZWF0ZWRGaWVsZChzZWxmLT5wYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2xpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+Y2hpbGRfbWVzc2FnZXMpIDwgMCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBQeV9zc2l6ZV90IGZyb207Ci0gICAgUHlfc3NpemVfdCB0bzsKLSAgICBQeV9zc2l6ZV90IHN0ZXA7Ci0gICAgUHlfc3NpemVfdCBsZW5ndGggPSBMZW5ndGgoc2VsZik7Ci0gICAgUHlfc3NpemVfdCBzbGljZWxlbmd0aDsKLSAgICBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKLSNpZiBQWV9NQUpPUl9WRVJTSU9OID49IDMKLSAgICAgIGlmIChQeVNsaWNlX0dldEluZGljZXNFeChzbGljZSwKLSNlbHNlCi0gICAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgocmVpbnRlcnByZXRfY2FzdDxQeVNsaWNlT2JqZWN0Kj4oc2xpY2UpLAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuZ3RoLCAmZnJvbSwgJnRvLCAmc3RlcCwgJnNsaWNlbGVuZ3RoKSA9PSAtMSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gUHlTZXF1ZW5jZV9EZWxTbGljZShzZWxmLT5jaGlsZF9tZXNzYWdlcywgZnJvbSwgdG8pOwotICAgIH0gZWxzZSBpZiAoUHlJbnRfQ2hlY2soc2xpY2UpIHx8IFB5TG9uZ19DaGVjayhzbGljZSkpIHsKLSAgICAgIGZyb20gPSB0byA9IFB5TG9uZ19Bc0xvbmcoc2xpY2UpOwotICAgICAgaWYgKGZyb20gPCAwKSB7Ci0gICAgICAgIGZyb20gPSB0byA9IGxlbmd0aCArIGZyb207Ci0gICAgICB9Ci0gICAgICByZXR1cm4gUHlTZXF1ZW5jZV9EZWxJdGVtKHNlbGYtPmNoaWxkX21lc3NhZ2VzLCBmcm9tKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBSZW1vdmUoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiB2YWx1ZSkgewotICBpZiAoVXBkYXRlQ2hpbGRNZXNzYWdlcyhzZWxmKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9zc2l6ZV90IGluZGV4ID0gUHlTZXF1ZW5jZV9JbmRleChzZWxmLT5jaGlsZF9tZXNzYWdlcywgdmFsdWUpOwotICBpZiAoaW5kZXggPT0gLTEpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBTY29wZWRQeU9iamVjdFB0ciBweV9pbmRleChQeUxvbmdfRnJvbUxvbmcoaW5kZXgpKTsKLSAgaWYgKEFzc2lnblN1YnNjcmlwdChzZWxmLCBweV9pbmRleC5nZXQoKSwgTlVMTCkgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogUmljaENvbXBhcmUoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBvdGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9waWQpIHsKLSAgaWYgKFVwZGF0ZUNoaWxkTWVzc2FnZXMoc2VsZikgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsICZSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcl9UeXBlKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJDYW4gb25seSBjb21wYXJlIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMgIgotICAgICAgICAgICAgICAgICAgICAiYWdhaW5zdCBvdGhlciByZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLiIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGlmIChvcGlkID09IFB5X0VRIHx8IG9waWQgPT0gUHlfTkUpIHsKLSAgICAvLyBUT0RPKGFudXJhYWcpOiBEb24ndCBtYWtlIG5ldyBsaXN0cyBqdXN0IGZvciB0aGlzLi4uCi0gICAgU2NvcGVkUHlPYmplY3RQdHIgZnVsbF9zbGljZShQeVNsaWNlX05ldyhOVUxMLCBOVUxMLCBOVUxMKSk7Ci0gICAgaWYgKGZ1bGxfc2xpY2UgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoU3Vic2NyaXB0KHNlbGYsIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKLSAgICBpZiAobGlzdCA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgU2NvcGVkUHlPYmplY3RQdHIgb3RoZXJfbGlzdCgKLSAgICAgICAgU3Vic2NyaXB0KHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPihvdGhlciksCi0gICAgICAgICAgICAgICAgICBmdWxsX3NsaWNlLmdldCgpKSk7Ci0gICAgaWYgKG90aGVyX2xpc3QgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShsaXN0LmdldCgpLCBvdGhlcl9saXN0LmdldCgpLCBvcGlkKTsKLSAgfSBlbHNlIHsKLSAgICBQeV9JTkNSRUYoUHlfTm90SW1wbGVtZW50ZWQpOwotICAgIHJldHVybiBQeV9Ob3RJbXBsZW1lbnRlZDsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHNvcnQoKQotCi1zdGF0aWMgdm9pZCBSZW9yZGVyQXR0YWNoZWQoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYpIHsKLSAgTWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yOwotICBjb25zdCBQeV9zc2l6ZV90IGxlbmd0aCA9IExlbmd0aChzZWxmKTsKLQotICAvLyBTaW5jZSBQeXRob24gcHJvdG9idWYgb2JqZWN0cyBhcmUgbmV2ZXIgYXJlbmEtYWxsb2NhdGVkLCBhZGRpbmcgYW5kCi0gIC8vIHJlbW92aW5nIG1lc3NhZ2UgcG9pbnRlcnMgdG8gdGhlIHVuZGVybHlpbmcgYXJyYXkgaXMganVzdCB1cGRhdGluZwotICAvLyBwb2ludGVycy4KLSAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpCi0gICAgcmVmbGVjdGlvbi0+UmVsZWFzZUxhc3QobWVzc2FnZSwgZGVzY3JpcHRvcik7Ci0KLSAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgbGVuZ3RoOyArK2kpIHsKLSAgICBDTWVzc2FnZSogcHlfY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPigKLSAgICAgICAgUHlMaXN0X0dFVF9JVEVNKHNlbGYtPmNoaWxkX21lc3NhZ2VzLCBpKSk7Ci0gICAgcmVmbGVjdGlvbi0+QWRkQWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBkZXNjcmlwdG9yLCBweV9jbXNnLT5tZXNzYWdlKTsKLSAgfQotfQotCi0vLyBSZXR1cm5zIDAgaWYgc3VjY2Vzc2Z1bDsgcmV0dXJucyAtMSBhbmQgc2V0cyBhbiBleGNlcHRpb24gaWYKLS8vIHVuc3VjY2Vzc2Z1bC4KLXN0YXRpYyBpbnQgU29ydFB5dGhvbk1lc3NhZ2VzKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBrd2RzKSB7Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIG0oUHlPYmplY3RfR2V0QXR0clN0cmluZyhzZWxmLT5jaGlsZF9tZXNzYWdlcywgInNvcnQiKSk7Ci0gIGlmIChtID09IE5VTEwpCi0gICAgcmV0dXJuIC0xOwotICBpZiAoUHlPYmplY3RfQ2FsbChtLmdldCgpLCBhcmdzLCBrd2RzKSA9PSBOVUxMKQotICAgIHJldHVybiAtMTsKLSAgaWYgKHNlbGYtPm1lc3NhZ2UgIT0gTlVMTCkgewotICAgIFJlb3JkZXJBdHRhY2hlZChzZWxmKTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBTb3J0KFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBhcmdzLAotICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBrd2RzKSB7Ci0gIC8vIFN1cHBvcnQgdGhlIG9sZCBzb3J0X2Z1bmN0aW9uIGFyZ3VtZW50IGZvciBiYWNrd2FyZHMKLSAgLy8gY29tcGF0aWJpbGl0eS4KLSAgaWYgKGt3ZHMgIT0gTlVMTCkgewotICAgIFB5T2JqZWN0KiBzb3J0X2Z1bmMgPSBQeURpY3RfR2V0SXRlbVN0cmluZyhrd2RzLCAic29ydF9mdW5jdGlvbiIpOwotICAgIGlmIChzb3J0X2Z1bmMgIT0gTlVMTCkgewotICAgICAgLy8gTXVzdCBzZXQgYmVmb3JlIGRlbGV0aW5nIGFzIHNvcnRfZnVuYyBpcyBhIGJvcnJvd2VkIHJlZmVyZW5jZQotICAgICAgLy8gYW5kIGt3ZHMgbWlnaHQgYmUgdGhlIG9ubHkgdGhpbmcga2VlcGluZyBpdCBhbGl2ZS4KLSAgICAgIFB5RGljdF9TZXRJdGVtU3RyaW5nKGt3ZHMsICJjbXAiLCBzb3J0X2Z1bmMpOwotICAgICAgUHlEaWN0X0RlbEl0ZW1TdHJpbmcoa3dkcywgInNvcnRfZnVuY3Rpb24iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoVXBkYXRlQ2hpbGRNZXNzYWdlcyhzZWxmKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoU29ydFB5dGhvbk1lc3NhZ2VzKHNlbGYsIGFyZ3MsIGt3ZHMpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RhdGljIFB5T2JqZWN0KiBJdGVtKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7Ci0gIGlmIChVcGRhdGVDaGlsZE1lc3NhZ2VzKHNlbGYpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5X3NzaXplX3QgbGVuZ3RoID0gTGVuZ3RoKHNlbGYpOwotICBpZiAoaW5kZXggPCAwKSB7Ci0gICAgaW5kZXggPSBsZW5ndGggKyBpbmRleDsKLSAgfQotICBQeU9iamVjdCogaXRlbSA9IFB5TGlzdF9HZXRJdGVtKHNlbGYtPmNoaWxkX21lc3NhZ2VzLCBpbmRleCk7Ci0gIGlmIChpdGVtID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9JTkNSRUYoaXRlbSk7Ci0gIHJldHVybiBpdGVtOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFBvcChSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIFB5X3NzaXplX3QgaW5kZXggPSAtMTsKLSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsICJ8biIsICZpbmRleCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeU9iamVjdCogaXRlbSA9IEl0ZW0oc2VsZiwgaW5kZXgpOwotICBpZiAoaXRlbSA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsCi0gICAgICAgICAgICAgICAgICJsaXN0IGluZGV4ICglemQpIG91dCBvZiByYW5nZSIsCi0gICAgICAgICAgICAgICAgIGluZGV4KTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBTY29wZWRQeU9iamVjdFB0ciBweV9pbmRleChQeUxvbmdfRnJvbVNzaXplX3QoaW5kZXgpKTsKLSAgaWYgKEFzc2lnblN1YnNjcmlwdChzZWxmLCBweV9pbmRleC5nZXQoKSwgTlVMTCkgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGl0ZW07Ci19Ci0KLS8vIFJlbGVhc2UgZmllbGQgb2YgcGFyZW50IG1lc3NhZ2UgYW5kIHRyYW5zZmVyIHRoZSBvd25lcnNoaXAgdG8gdGFyZ2V0Lgotdm9pZCBSZWxlYXNlTGFzdFRvKENNZXNzYWdlKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICBDTWVzc2FnZSogdGFyZ2V0KSB7Ci0gIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBhcmVudCk7Ci0gIEdPT0dMRV9DSEVDS19OT1ROVUxMKGZpZWxkKTsKLSAgR09PR0xFX0NIRUNLX05PVE5VTEwodGFyZ2V0KTsKLQotICBzaGFyZWRfcHRyPE1lc3NhZ2U+IHJlbGVhc2VkX21lc3NhZ2UoCi0gICAgICBwYXJlbnQtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+UmVsZWFzZUxhc3QocGFyZW50LT5tZXNzYWdlLCBmaWVsZCkpOwotICAvLyBUT0RPKHRpYmVsbCk6IERlYWwgd2l0aCBwcm90bzEuCi0KLSAgdGFyZ2V0LT5wYXJlbnQgPSBOVUxMOwotICB0YXJnZXQtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yID0gTlVMTDsKLSAgdGFyZ2V0LT5tZXNzYWdlID0gcmVsZWFzZWRfbWVzc2FnZS5nZXQoKTsKLSAgdGFyZ2V0LT5yZWFkX29ubHkgPSBmYWxzZTsKLSAgY21lc3NhZ2U6OlNldE93bmVyKHRhcmdldCwgcmVsZWFzZWRfbWVzc2FnZSk7Ci19Ci0KLS8vIENhbGxlZCB0byByZWxlYXNlIGEgY29udGFpbmVyIHVzaW5nCi0vLyBDbGVhckZpZWxkKCdjb250YWluZXJfZmllbGRfbmFtZScpIG9uIHRoZSBwYXJlbnQuCi1pbnQgUmVsZWFzZShSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZikgewotICBpZiAoVXBkYXRlQ2hpbGRNZXNzYWdlcyhzZWxmKSA8IDApIHsKLSAgICBQeUVycl9Xcml0ZVVucmFpc2FibGUoUHlCeXRlc19Gcm9tU3RyaW5nKCJGYWlsZWQgdG8gdXBkYXRlIHJlbGVhc2VkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlcyIpKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yOwotCi0gIC8vIFRoZSByZWZsZWN0aW9uIEFQSSBvbmx5IGxldHMgdXMgcmVsZWFzZSB0aGUgbGFzdCBtZXNzYWdlIGluIGEKLSAgLy8gcmVwZWF0ZWQgZmllbGQuICBUaGVyZWZvcmUgd2UgaXRlcmF0ZSB0aHJvdWdoIHRoZSBjaGlsZHJlbgotICAvLyBzdGFydGluZyB3aXRoIHRoZSBsYXN0IG9uZS4KLSAgY29uc3QgUHlfc3NpemVfdCBzaXplID0gUHlMaXN0X0dFVF9TSVpFKHNlbGYtPmNoaWxkX21lc3NhZ2VzKTsKLSAgR09PR0xFX0RDSEVDS19FUShzaXplLCBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGQpKTsKLSAgZm9yIChQeV9zc2l6ZV90IGkgPSBzaXplIC0gMTsgaSA+PSAwOyAtLWkpIHsKLSAgICBDTWVzc2FnZSogY2hpbGRfY21lc3NhZ2UgPSByZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4oCi0gICAgICAgIFB5TGlzdF9HRVRfSVRFTShzZWxmLT5jaGlsZF9tZXNzYWdlcywgaSkpOwotICAgIFJlbGVhc2VMYXN0VG8oc2VsZi0+cGFyZW50LCBmaWVsZCwgY2hpbGRfY21lc3NhZ2UpOwotICB9Ci0KLSAgLy8gRGV0YWNoIGZyb20gY29udGFpbmluZyBtZXNzYWdlLgotICBzZWxmLT5wYXJlbnQgPSBOVUxMOwotICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvciA9IE5VTEw7Ci0gIHNlbGYtPm1lc3NhZ2UgPSBOVUxMOwotICBzZWxmLT5vd25lci5yZXNldCgpOwotCi0gIHJldHVybiAwOwotfQotCi1pbnQgU2V0T3duZXIoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxNZXNzYWdlPiYgbmV3X293bmVyKSB7Ci0gIEdPT0dMRV9DSEVDS19BVFRBQ0hFRChzZWxmKTsKLQotICBzZWxmLT5vd25lciA9IG5ld19vd25lcjsKLSAgY29uc3QgUHlfc3NpemVfdCBuID0gUHlMaXN0X0dFVF9TSVpFKHNlbGYtPmNoaWxkX21lc3NhZ2VzKTsKLSAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgbjsgKytpKSB7Ci0gICAgUHlPYmplY3QqIG1zZyA9IFB5TGlzdF9HRVRfSVRFTShzZWxmLT5jaGlsZF9tZXNzYWdlcywgaSk7Ci0gICAgaWYgKGNtZXNzYWdlOjpTZXRPd25lcihyZWludGVycHJldF9jYXN0PENNZXNzYWdlKj4obXNnKSwgbmV3X293bmVyKSA9PSAtMSkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8gVGhlIHByaXZhdGUgY29uc3RydWN0b3Igb2YgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIgb2JqZWN0cy4KLVB5T2JqZWN0ICpOZXdDb250YWluZXIoCi0gICAgQ01lc3NhZ2UqIHBhcmVudCwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yLAotICAgIENNZXNzYWdlQ2xhc3MqIGNvbmNyZXRlX2NsYXNzKSB7Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UocGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsIHBhcmVudC0+bWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmID0KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqPigKLSAgICAgICAgICBQeVR5cGVfR2VuZXJpY0FsbG9jKCZSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcl9UeXBlLCAwKSk7Ci0gIGlmIChzZWxmID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHNlbGYtPm1lc3NhZ2UgPSBwYXJlbnQtPm1lc3NhZ2U7Ci0gIHNlbGYtPnBhcmVudCA9IHBhcmVudDsKLSAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IgPSBwYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKLSAgc2VsZi0+b3duZXIgPSBwYXJlbnQtPm93bmVyOwotICBQeV9JTkNSRUYoY29uY3JldGVfY2xhc3MpOwotICBzZWxmLT5jaGlsZF9tZXNzYWdlX2NsYXNzID0gY29uY3JldGVfY2xhc3M7Ci0gIHNlbGYtPmNoaWxkX21lc3NhZ2VzID0gUHlMaXN0X05ldygwKTsKLQotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpOwotfQotCi1zdGF0aWMgdm9pZCBEZWFsbG9jKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmKSB7Ci0gIFB5X0NMRUFSKHNlbGYtPmNoaWxkX21lc3NhZ2VzKTsKLSAgUHlfQ0xFQVIoc2VsZi0+Y2hpbGRfbWVzc2FnZV9jbGFzcyk7Ci0gIC8vIFRPRE8odGliZWxsKTogRG8gd2UgbmVlZCB0byBjYWxsIGRlbGV0ZSBvbiB0aGVzZSBvYmplY3RzIHRvIG1ha2UKLSAgLy8gc3VyZSB0aGVpciBkZXN0cnVjdG9ycyBhcmUgY2FsbGVkPwotICBzZWxmLT5vd25lci5yZXNldCgpOwotCi0gIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKLX0KLQotc3RhdGljIFB5U2VxdWVuY2VNZXRob2RzIFNxTWV0aG9kcyA9IHsKLSAgKGxlbmZ1bmMpTGVuZ3RoLCAgICAgICAgLyogc3FfbGVuZ3RoICovCi0gIDAsIC8qIHNxX2NvbmNhdCAqLwotICAwLCAvKiBzcV9yZXBlYXQgKi8KLSAgKHNzaXplYXJnZnVuYylJdGVtIC8qIHNxX2l0ZW0gKi8KLX07Ci0KLXN0YXRpYyBQeU1hcHBpbmdNZXRob2RzIE1wTWV0aG9kcyA9IHsKLSAgKGxlbmZ1bmMpTGVuZ3RoLCAgICAgICAgICAgICAgIC8qIG1wX2xlbmd0aCAqLwotICAoYmluYXJ5ZnVuYylTdWJzY3JpcHQsICAgICAgLyogbXBfc3Vic2NyaXB0ICovCi0gIChvYmpvYmphcmdwcm9jKUFzc2lnblN1YnNjcmlwdCwvKiBtcF9hc3Nfc3Vic2NyaXB0ICovCi19OwotCi1zdGF0aWMgUHlNZXRob2REZWYgTWV0aG9kc1tdID0gewotICB7ICJhZGQiLCAoUHlDRnVuY3Rpb24pIEFkZCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLSAgICAiQWRkcyBhbiBvYmplY3QgdG8gdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4iIH0sCi0gIHsgImV4dGVuZCIsIChQeUNGdW5jdGlvbikgRXh0ZW5kLCBNRVRIX08sCi0gICAgIkFkZHMgb2JqZWN0cyB0byB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiIgfSwKLSAgeyAicG9wIiwgKFB5Q0Z1bmN0aW9uKVBvcCwgTUVUSF9WQVJBUkdTLAotICAgICJSZW1vdmVzIGFuIG9iamVjdCBmcm9tIHRoZSByZXBlYXRlZCBjb250YWluZXIgYW5kIHJldHVybnMgaXQuIiB9LAotICB7ICJyZW1vdmUiLCAoUHlDRnVuY3Rpb24pIFJlbW92ZSwgTUVUSF9PLAotICAgICJSZW1vdmVzIGFuIG9iamVjdCBmcm9tIHRoZSByZXBlYXRlZCBjb250YWluZXIuIiB9LAotICB7ICJzb3J0IiwgKFB5Q0Z1bmN0aW9uKSBTb3J0LCBNRVRIX1ZBUkFSR1MgfCBNRVRIX0tFWVdPUkRTLAotICAgICJTb3J0cyB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiIgfSwKLSAgeyAiTWVyZ2VGcm9tIiwgKFB5Q0Z1bmN0aW9uKSBNZXJnZUZyb20sIE1FVEhfTywKLSAgICAiQWRkcyBvYmplY3RzIHRvIHRoZSByZXBlYXRlZCBjb250YWluZXIuIiB9LAotICB7IE5VTEwsIE5VTEwgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXIKLQotUHlUeXBlT2JqZWN0IFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyX1R5cGUgPSB7Ci0gIFB5VmFyT2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUsIDApCi0gIEZVTExfTU9EVUxFX05BTUUgIi5SZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciIsICAvLyB0cF9uYW1lCi0gIHNpemVvZihSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciksICAvLyB0cF9iYXNpY3NpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVtc2l6ZQotICAoZGVzdHJ1Y3RvcilyZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyOjpEZWFsbG9jLCAgLy8gIHRwX2RlYWxsb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9wcmludAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3JlcHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19udW1iZXIKLSAgJnJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6OlNxTWV0aG9kcywgICAvLyAgdHBfYXNfc2VxdWVuY2UKLSAgJnJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXI6Ok1wTWV0aG9kcywgICAvLyAgdHBfYXNfbWFwcGluZwotICBQeU9iamVjdF9IYXNoTm90SW1wbGVtZW50ZWQsICAgICAgICAgLy8gIHRwX2hhc2gKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jYWxsCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc3RyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9zZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2FzX2J1ZmZlcgotICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gIHRwX2ZsYWdzCi0gICJBIFJlcGVhdGVkIHNjYWxhciBjb250YWluZXIiLCAgICAgICAvLyAgdHBfZG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfdHJhdmVyc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9jbGVhcgotICAocmljaGNtcGZ1bmMpcmVwZWF0ZWRfY29tcG9zaXRlX2NvbnRhaW5lcjo6UmljaENvbXBhcmUsICAvLyAgdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAotICByZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyOjpNZXRob2RzLCAgIC8vICB0cF9tZXRob2RzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfbWVtYmVycwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldHNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Jhc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVzY3JfZ2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGVzY3Jfc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2luaXQKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9jb21wb3NpdGVfY29udGFpbmVyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdiNTZiNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXIuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBhbnVyYWFnQGdvb2dsZS5jb20gKEFudXJhYWcgQWdyYXdhbCkKLS8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9SRVBFQVRFRF9DT01QT1NJVEVfQ09OVEFJTkVSX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9SRVBFQVRFRF9DT01QT1NJVEVfQ09OVEFJTkVSX0hfXwotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1jbGFzcyBGaWVsZERlc2NyaXB0b3I7Ci1jbGFzcyBNZXNzYWdlOwotCi0jaWZkZWYgX1NIQVJFRF9QVFJfSAotdXNpbmcgc3RkOjpzaGFyZWRfcHRyOwotI2Vsc2UKLXVzaW5nIGludGVybmFsOjpzaGFyZWRfcHRyOwotI2VuZGlmCi0KLW5hbWVzcGFjZSBweXRob24gewotCi1zdHJ1Y3QgQ01lc3NhZ2U7Ci1zdHJ1Y3QgQ01lc3NhZ2VDbGFzczsKLQotLy8gQSBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciBjYW4gYmUgaW4gb25lIG9mIHR3byBzdGF0ZXM6IGF0dGFjaGVkCi0vLyBvciByZWxlYXNlZC4KLS8vCi0vLyBXaGVuIGluIHRoZSBhdHRhY2hlZCBzdGF0ZSBhbGwgbW9kaWZpY2F0aW9ucyB0byB0aGUgY29udGFpbmVyIGFyZQotLy8gZG9uZSBib3RoIG9uIHRoZSAnbWVzc2FnZScgYW5kIG9uIHRoZSAnY2hpbGRfbWVzc2FnZXMnCi0vLyBsaXN0LiAgSW4gdGhpcyBzdGF0ZSBhbGwgTWVzc2FnZXMgcmVmZXJyZWQgdG8gYnkgdGhlIGNoaWxkcmVuIGluCi0vLyAnY2hpbGRfbWVzc2FnZXMnIGFyZSBvd25lciBieSB0aGUgJ293bmVyJy4KLS8vCi0vLyBXaGVuIGluIHRoZSByZWxlYXNlZCBzdGF0ZSAnbWVzc2FnZScsICdvd25lcicsICdwYXJlbnQnLCBhbmQKLS8vICdwYXJlbnRfZmllbGRfZGVzY3JpcHRvcicgYXJlIE5VTEwuCi10eXBlZGVmIHN0cnVjdCBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciB7Ci0gIFB5T2JqZWN0X0hFQUQ7Ci0KLSAgLy8gVGhpcyBpcyB0aGUgdG9wLWxldmVsIEMrKyBNZXNzYWdlIG9iamVjdCB0aGF0IG93bnMgdGhlIHdob2xlCi0gIC8vIHByb3RvIHRyZWUuICBFdmVyeSBQeXRob24gUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIgaG9sZHMgYQotICAvLyByZWZlcmVuY2UgdG8gaXQgaW4gb3JkZXIgdG8ga2VlcCBpdCBhbGl2ZSBhcyBsb25nIGFzIHRoZXJlJ3MgYQotICAvLyBQeXRob24gb2JqZWN0IHRoYXQgcmVmZXJlbmNlcyBhbnkgcGFydCBvZiB0aGUgdHJlZS4KLSAgc2hhcmVkX3B0cjxNZXNzYWdlPiBvd25lcjsKLQotICAvLyBXZWFrIHJlZmVyZW5jZSB0byBwYXJlbnQgb2JqZWN0LiBNYXkgYmUgTlVMTC4gVXNlZCB0byBtYWtlIHN1cmUKLSAgLy8gdGhlIHBhcmVudCBpcyB3cml0YWJsZSBiZWZvcmUgbW9kaWZ5aW5nIHRoZQotICAvLyBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lci4KLSAgQ01lc3NhZ2UqIHBhcmVudDsKLQotICAvLyBBIGRlc2NyaXB0b3IgdXNlZCB0byBtb2RpZnkgdGhlIHVuZGVybHlpbmcgJ21lc3NhZ2UnLgotICAvLyBUaGUgcG9pbnRlciBpcyBvd25lZCBieSB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIEMrKyBNZXNzYWdlIHRoYXQgY29udGFpbnMgdGhpcyBjb250YWluZXIuICBUaGUKLSAgLy8gUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KLSAgLy8KLSAgLy8gSWYgTlVMTCwgdGhpcyBtZXNzYWdlIGhhcyBiZWVuIHJlbGVhc2VkIGZyb20gaXRzIHBhcmVudCAoYnkKLSAgLy8gY2FsbGluZyBDbGVhcigpIG9yIENsZWFyRmllbGQoKSBvbiB0aGUgcGFyZW50LgotICBNZXNzYWdlKiBtZXNzYWdlOwotCi0gIC8vIFRoZSB0eXBlIHVzZWQgdG8gY3JlYXRlIG5ldyBjaGlsZCBtZXNzYWdlcy4KLSAgQ01lc3NhZ2VDbGFzcyogY2hpbGRfbWVzc2FnZV9jbGFzczsKLQotICAvLyBBIGxpc3Qgb2YgY2hpbGQgbWVzc2FnZXMuCi0gIFB5T2JqZWN0KiBjaGlsZF9tZXNzYWdlczsKLX0gUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXI7Ci0KLWV4dGVybiBQeVR5cGVPYmplY3QgUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXJfVHlwZTsKLQotbmFtZXNwYWNlIHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXIgewotCi0vLyBCdWlsZHMgYSBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciBvYmplY3QsIGZyb20gYSBwYXJlbnQgbWVzc2FnZSBhbmQgYQotLy8gZmllbGQgZGVzY3JpcHRvci4KLVB5T2JqZWN0ICpOZXdDb250YWluZXIoCi0gICAgQ01lc3NhZ2UqIHBhcmVudCwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yLAotICAgIENNZXNzYWdlQ2xhc3MgKmNoaWxkX21lc3NhZ2VfY2xhc3MpOwotCi0vLyBBcHBlbmRzIGEgbmV3IENNZXNzYWdlIHRvIHRoZSBjb250YWluZXIgYW5kIHJldHVybnMgaXQuICBUaGUKLS8vIENNZXNzYWdlIGlzIGluaXRpYWxpemVkIHVzaW5nIHRoZSBjb250ZW50IG9mIGt3YXJncy4KLS8vCi0vLyBSZXR1cm5zIGEgbmV3IHJlZmVyZW5jZSBpZiBzdWNjZXNzZnVsOyByZXR1cm5zIE5VTEwgYW5kIHNldHMgYW4KLS8vIGV4Y2VwdGlvbiBpZiB1bnN1Y2Nlc3NmdWwuCi1QeU9iamVjdCogQWRkKFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKiBzZWxmLAotICAgICAgICAgICAgICBQeU9iamVjdCogYXJncywKLSAgICAgICAgICAgICAgUHlPYmplY3QqIGt3YXJncyk7Ci0KLS8vIEFwcGVuZHMgYWxsIHRoZSBDTWVzc2FnZXMgaW4gdGhlIGlucHV0IGl0ZXJhdG9yIHRvIHRoZSBjb250YWluZXIuCi0vLwotLy8gUmV0dXJucyBOb25lIGlmIHN1Y2Nlc3NmdWw7IHJldHVybnMgTlVMTCBhbmQgc2V0cyBhbiBleGNlcHRpb24gaWYKLS8vIHVuc3VjY2Vzc2Z1bC4KLVB5T2JqZWN0KiBFeHRlbmQoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiB2YWx1ZSk7Ci0KLS8vIEFwcGVuZHMgYSBuZXcgbWVzc2FnZSB0byB0aGUgY29udGFpbmVyIGZvciBlYWNoIG1lc3NhZ2UgaW4gdGhlCi0vLyBpbnB1dCBpdGVyYXRvciwgbWVyZ2luZyBlYWNoIGRhdGEgZWxlbWVudCBpbi4gRXF1aXZhbGVudCB0byBleHRlbmQuCi0vLwotLy8gUmV0dXJucyBOb25lIGlmIHN1Y2Nlc3NmdWw7IHJldHVybnMgTlVMTCBhbmQgc2V0cyBhbiBleGNlcHRpb24gaWYKLS8vIHVuc3VjY2Vzc2Z1bC4KLVB5T2JqZWN0KiBNZXJnZUZyb20oUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBvdGhlcik7Ci0KLS8vIEFjY2Vzc2VzIG1lc3NhZ2VzIGluIHRoZSBjb250YWluZXIuCi0vLwotLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UgdG8gdGhlIG1lc3NhZ2UgZm9yIGFuIGludGVnZXIgcGFyYW1ldGVyLgotLy8gUmV0dXJucyBhIG5ldyByZWZlcmVuY2UgdG8gYSBsaXN0IG9mIG1lc3NhZ2VzIGZvciBhIHNsaWNlLgotUHlPYmplY3QqIFN1YnNjcmlwdChSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIHNsaWNlKTsKLQotLy8gRGVsZXRlcyBpdGVtcyBmcm9tIHRoZSBjb250YWluZXIgKGNhbm5vdCBiZSB1c2VkIGZvciBhc3NpZ25tZW50KS4KLS8vCi0vLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLWludCBBc3NpZ25TdWJzY3JpcHQoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBzbGljZSwKLSAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHZhbHVlKTsKLQotLy8gUmVsZWFzZXMgdGhlIG1lc3NhZ2VzIGluIHRoZSBjb250YWluZXIgdG8gdGhlIGdpdmVuIG1lc3NhZ2UuCi0vLwotLy8gUmV0dXJucyAwIG9uIHN1Y2Nlc3MsIC0xIG9uIGZhaWx1cmUuCi1pbnQgUmVsZWFzZVRvTWVzc2FnZShSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiwgTWVzc2FnZSogbmV3X21lc3NhZ2UpOwotCi0vLyBSZWxlYXNlcyB0aGUgbWVzc2FnZXMgaW4gdGhlIGNvbnRhaW5lciB0byBhIG5ldyBtZXNzYWdlLgotLy8KLS8vIFJldHVybnMgMCBvbiBzdWNjZXNzLCAtMSBvbiBmYWlsdXJlLgotaW50IFJlbGVhc2UoUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIqIHNlbGYpOwotCi0vLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLWludCBTZXRPd25lcihSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lciogc2VsZiwKLSAgICAgICAgICAgICBjb25zdCBzaGFyZWRfcHRyPE1lc3NhZ2U+JiBuZXdfb3duZXIpOwotCi0vLyBSZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQgb2YgdGhlIHJlcGVhdGVkIG1lc3NhZ2UgZmllbGQgJ2ZpZWxkJyBvbgotLy8gdGhlIE1lc3NhZ2UgJ3BhcmVudCcsIGFuZCB0cmFuc2ZlcnMgdGhlIG93bmVyc2hpcCBvZiB0aGUgcmVsZWFzZWQKLS8vIE1lc3NhZ2UgdG8gJ3RhcmdldCcuCi0vLwotLy8gQ29ycmVzcG9uZHMgdG8gcmVmbGVjdGlvbiBhcGkgbWV0aG9kIFJlbGVhc2VNZXNzYWdlLgotdm9pZCBSZWxlYXNlTGFzdFRvKENNZXNzYWdlKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICBDTWVzc2FnZSogdGFyZ2V0KTsKLQotfSAgLy8gbmFtZXNwYWNlIHJlcGVhdGVkX2NvbXBvc2l0ZV9jb250YWluZXIKLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1JFUEVBVEVEX0NPTVBPU0lURV9DT05UQUlORVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX3NjYWxhcl9jb250YWluZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX3NjYWxhcl9jb250YWluZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk1ZGE4NWYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODEyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGFudXJhYWdAZ29vZ2xlLmNvbSAoQW51cmFhZyBBZ3Jhd2FsKQotLy8gQXV0aG9yOiB0aWJlbGxAZ29vZ2xlLmNvbSAoSm9oYW4gVGliZWxsKQotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3JlcGVhdGVkX3NjYWxhcl9jb250YWluZXIuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvZGVzY3JpcHRvcl9wb29sLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oPgotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gICNkZWZpbmUgUHlJbnRfRnJvbUxvbmcgUHlMb25nX0Zyb21Mb25nCi0gICNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDMwMzAwMDAKLSAgICAjZXJyb3IgIlB5dGhvbiAzLjAgLSAzLjIgYXJlIG5vdCBzdXBwb3J0ZWQuIgotICAjZWxzZQotICAjZGVmaW5lIFB5U3RyaW5nX0FzU3RyaW5nKG9iKSBcCi0gICAgKFB5VW5pY29kZV9DaGVjayhvYik/IFB5VW5pY29kZV9Bc1VURjgob2IpOiBQeUJ5dGVzX0FzU3RyaW5nKG9iKSkKLSAgI2VuZGlmCi0jZW5kaWYKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLW5hbWVzcGFjZSByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyIHsKLQotc3RhdGljIGludCBJbnRlcm5hbEFzc2lnblJlcGVhdGVkRmllbGQoCi0gICAgUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBsaXN0KSB7Ci0gIHNlbGYtPm1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+Q2xlYXJGaWVsZChzZWxmLT5tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOwotICBmb3IgKFB5X3NzaXplX3QgaSA9IDA7IGkgPCBQeUxpc3RfR0VUX1NJWkUobGlzdCk7ICsraSkgewotICAgIFB5T2JqZWN0KiB2YWx1ZSA9IFB5TGlzdF9HRVRfSVRFTShsaXN0LCBpKTsKLSAgICBpZiAoU2NvcGVkUHlPYmplY3RQdHIoQXBwZW5kKHNlbGYsIHZhbHVlKSkgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIC0xOwotICAgIH0KLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFB5X3NzaXplX3QgTGVuKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmKSB7Ci0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICByZXR1cm4gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5GaWVsZFNpemUoKm1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcik7Ci19Ci0KLXN0YXRpYyBpbnQgQXNzaWduSXRlbShSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICBQeV9zc2l6ZV90IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBhcmcpIHsKLSAgY21lc3NhZ2U6OkFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCk7Ci0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKLQotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBpbnQgZmllbGRfc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gIGlmIChpbmRleCA8IDApIHsKLSAgICBpbmRleCA9IGZpZWxkX3NpemUgKyBpbmRleDsKLSAgfQotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZpZWxkX3NpemUpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKLSAgICAgICAgICAgICAgICAgImxpc3QgYXNzaWdubWVudCBpbmRleCAoJWQpIG91dCBvZiByYW5nZSIsCi0gICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGludD4oaW5kZXgpKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBpZiAoYXJnID09IE5VTEwpIHsKLSAgICBTY29wZWRQeU9iamVjdFB0ciBweV9pbmRleChQeUxvbmdfRnJvbUxvbmcoaW5kZXgpKTsKLSAgICByZXR1cm4gY21lc3NhZ2U6OkludGVybmFsRGVsZXRlUmVwZWF0ZWRGaWVsZChzZWxmLT5wYXJlbnQsIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHlfaW5kZXguZ2V0KCksIE5VTEwpOwotICB9Ci0KLSAgaWYgKFB5U2VxdWVuY2VfQ2hlY2soYXJnKSAmJiAhKFB5Qnl0ZXNfQ2hlY2soYXJnKSB8fCBQeVVuaWNvZGVfQ2hlY2soYXJnKSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiVmFsdWUgbXVzdCBiZSBzY2FsYXIiKTsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLQotICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlLCAtMSk7Ci0gICAgICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDMyKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UNjQoYXJnLCB2YWx1ZSwgLTEpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQ2NChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UMzIoYXJnLCB2YWx1ZSwgLTEpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgsIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDY0KGFyZywgdmFsdWUsIC0xKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfRkxPQVQoYXJnLCB2YWx1ZSwgLTEpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRGbG9hdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSwgLTEpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgsIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0JPT0woYXJnLCB2YWx1ZSwgLTEpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRCb29sKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICBpZiAoIUNoZWNrQW5kU2V0U3RyaW5nKAotICAgICAgICAgIGFyZywgbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgcmVmbGVjdGlvbiwgZmFsc2UsIGluZGV4KSkgewotICAgICAgICByZXR1cm4gLTE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihhcmcsIHZhbHVlLCAtMSk7Ci0gICAgICBpZiAocmVmbGVjdGlvbi0+U3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpKSB7Ci0gICAgICAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7Ci0gICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQotICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7Ci0gICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIHMoUHlPYmplY3RfU3RyKGFyZykpOwotICAgICAgICAgIGlmIChzICE9IE5VTEwpIHsKLSAgICAgICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biBlbnVtIHZhbHVlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgUHlTdHJpbmdfQXNTdHJpbmcocy5nZXQoKSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiQWRkaW5nIHZhbHVlIHRvIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKLSAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKLSAgICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBJdGVtKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmLCBQeV9zc2l6ZV90IGluZGV4KSB7Ci0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPSBzZWxmLT5wYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICBpbnQgZmllbGRfc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gIGlmIChpbmRleCA8IDApIHsKLSAgICBpbmRleCA9IGZpZWxkX3NpemUgKyBpbmRleDsKLSAgfQotICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGZpZWxkX3NpemUpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfSW5kZXhFcnJvciwKLSAgICAgICAgICAgICAgICAgImxpc3QgaW5kZXggKCV6ZCkgb3V0IG9mIHJhbmdlIiwKLSAgICAgICAgICAgICAgICAgaW5kZXgpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7Ci0gIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7Ci0gICAgICBpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoCi0gICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKLSAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDogewotICAgICAgaW50NjQgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKLSAgICAgIHVpbnQ2NCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBmbG9hdCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRmxvYXQoCi0gICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKLSAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7Ci0gICAgICBkb3VibGUgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZSgKLSAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOwotICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7Ci0gICAgICBib29sIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sKAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodmFsdWUgPyAxIDogMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9Ci0gICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZEVudW0oCi0gICAgICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhlbnVtX3ZhbHVlLT5udW1iZXIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICBzdHJpbmcgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZygKLSAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOwotICAgICAgcmVzdWx0ID0gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKLSAgICAgIFB5T2JqZWN0KiBweV9jbXNnID0gUHlPYmplY3RfQ2FsbE9iamVjdChyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oCi0gICAgICAgICAgJkNNZXNzYWdlX1R5cGUpLCBOVUxMKTsKLSAgICAgIGlmIChweV9jbXNnID09IE5VTEwpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBDTWVzc2FnZSogY21zZyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q01lc3NhZ2UqPihweV9jbXNnKTsKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1zZyA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZSgKLSAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOwotICAgICAgY21zZy0+b3duZXIgPSBzZWxmLT5vd25lcjsKLSAgICAgIGNtc2ctPnBhcmVudCA9IHNlbGYtPnBhcmVudDsKLSAgICAgIGNtc2ctPm1lc3NhZ2UgPSBjb25zdF9jYXN0PE1lc3NhZ2UqPigmbXNnKTsKLSAgICAgIGNtc2ctPnJlYWRfb25seSA9IGZhbHNlOwotICAgICAgcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsCi0gICAgICAgICAgIkdldHRpbmcgdmFsdWUgZnJvbSBhIHJlcGVhdGVkIGZpZWxkIG9mIHVua25vd24gdHlwZSAlZCIsCi0gICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFN1YnNjcmlwdChSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIHNsaWNlKSB7Ci0gIFB5X3NzaXplX3QgZnJvbTsKLSAgUHlfc3NpemVfdCB0bzsKLSAgUHlfc3NpemVfdCBzdGVwOwotICBQeV9zc2l6ZV90IGxlbmd0aDsKLSAgUHlfc3NpemVfdCBzbGljZWxlbmd0aDsKLSAgYm9vbCByZXR1cm5fbGlzdCA9IGZhbHNlOwotI2lmIFBZX01BSk9SX1ZFUlNJT04gPCAzCi0gIGlmIChQeUludF9DaGVjayhzbGljZSkpIHsKLSAgICBmcm9tID0gdG8gPSBQeUludF9Bc0xvbmcoc2xpY2UpOwotICB9IGVsc2UgIC8vIE5PTElOVAotI2VuZGlmCi0gIGlmIChQeUxvbmdfQ2hlY2soc2xpY2UpKSB7Ci0gICAgZnJvbSA9IHRvID0gUHlMb25nX0FzTG9uZyhzbGljZSk7Ci0gIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKLSAgICBsZW5ndGggPSBMZW4oc2VsZik7Ci0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KHNsaWNlLAotI2Vsc2UKLSAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgocmVpbnRlcnByZXRfY2FzdDxQeVNsaWNlT2JqZWN0Kj4oc2xpY2UpLAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgJmZyb20sICZ0bywgJnN0ZXAsICZzbGljZWxlbmd0aCkgPT0gLTEpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgICByZXR1cm5fbGlzdCA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgImxpc3QgaW5kaWNlcyBtdXN0IGJlIGludGVnZXJzIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAoIXJldHVybl9saXN0KSB7Ci0gICAgcmV0dXJuIEl0ZW0oc2VsZiwgZnJvbSk7Ci0gIH0KLQotICBQeU9iamVjdCogbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0gIGlmIChsaXN0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoZnJvbSA8PSB0bykgewotICAgIGlmIChzdGVwIDwgMCkgewotICAgICAgcmV0dXJuIGxpc3Q7Ci0gICAgfQotICAgIGZvciAoUHlfc3NpemVfdCBpbmRleCA9IGZyb207IGluZGV4IDwgdG87IGluZGV4ICs9IHN0ZXApIHsKLSAgICAgIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gbGVuZ3RoKSB7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgU2NvcGVkUHlPYmplY3RQdHIgcyhJdGVtKHNlbGYsIGluZGV4KSk7Ci0gICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIHMuZ2V0KCkpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoc3RlcCA+IDApIHsKLSAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLSAgICBmb3IgKFB5X3NzaXplX3QgaW5kZXggPSBmcm9tOyBpbmRleCA+IHRvOyBpbmRleCArPSBzdGVwKSB7Ci0gICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIHMoSXRlbShzZWxmLCBpbmRleCkpOwotICAgICAgUHlMaXN0X0FwcGVuZChsaXN0LCBzLmdldCgpKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGxpc3Q7Ci19Ci0KLVB5T2JqZWN0KiBBcHBlbmQoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKSB7Ci0gIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpOwotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0gc2VsZi0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoaXRlbSwgdmFsdWUsIE5VTEwpOwotICAgICAgcmVmbGVjdGlvbi0+QWRkSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGl0ZW0sIHZhbHVlLCBOVUxMKTsKLSAgICAgIHJlZmxlY3Rpb24tPkFkZEludDY0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGl0ZW0sIHZhbHVlLCBOVUxMKTsKLSAgICAgIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChpdGVtLCB2YWx1ZSwgTlVMTCk7Ci0gICAgICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGl0ZW0sIHZhbHVlLCBOVUxMKTsKLSAgICAgIHJlZmxlY3Rpb24tPkFkZEZsb2F0KG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfRE9VQkxFKGl0ZW0sIHZhbHVlLCBOVUxMKTsKLSAgICAgIHJlZmxlY3Rpb24tPkFkZERvdWJsZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKGl0ZW0sIHZhbHVlLCBOVUxMKTsKLSAgICAgIHJlZmxlY3Rpb24tPkFkZEJvb2wobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogewotICAgICAgaWYgKCFDaGVja0FuZFNldFN0cmluZygKLSAgICAgICAgICBpdGVtLCBtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCByZWZsZWN0aW9uLCB0cnVlLCAtMSkpIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9JTlQzMihpdGVtLCB2YWx1ZSwgTlVMTCk7Ci0gICAgICBpZiAocmVmbGVjdGlvbi0+U3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpKSB7Ci0gICAgICAgIHJlZmxlY3Rpb24tPkFkZEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7Ci0gICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPQotICAgICAgICAgICAgZW51bV9kZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7Ci0gICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICByZWZsZWN0aW9uLT5BZGRFbnVtKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGVudW1fdmFsdWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNjb3BlZFB5T2JqZWN0UHRyIHMoUHlPYmplY3RfU3RyKGl0ZW0pKTsKLSAgICAgICAgICBpZiAocyAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZW51bSB2YWx1ZTogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FzU3RyaW5nKHMuZ2V0KCkpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiQWRkaW5nIHZhbHVlIHRvIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKLSAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKLSAgICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBpbnQgQXNzU3Vic2NyaXB0KFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHNsaWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIHZhbHVlKSB7Ci0gIFB5X3NzaXplX3QgZnJvbTsKLSAgUHlfc3NpemVfdCB0bzsKLSAgUHlfc3NpemVfdCBzdGVwOwotICBQeV9zc2l6ZV90IGxlbmd0aDsKLSAgUHlfc3NpemVfdCBzbGljZWxlbmd0aDsKLSAgYm9vbCBjcmVhdGVfbGlzdCA9IGZhbHNlOwotCi0gIGNtZXNzYWdlOjpBc3N1cmVXcml0YWJsZShzZWxmLT5wYXJlbnQpOwotICBNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KLSAgICAgIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yOwotCi0jaWYgUFlfTUFKT1JfVkVSU0lPTiA8IDMKLSAgaWYgKFB5SW50X0NoZWNrKHNsaWNlKSkgewotICAgIGZyb20gPSB0byA9IFB5SW50X0FzTG9uZyhzbGljZSk7Ci0gIH0gZWxzZQotI2VuZGlmCi0gIGlmIChQeUxvbmdfQ2hlY2soc2xpY2UpKSB7Ci0gICAgZnJvbSA9IHRvID0gUHlMb25nX0FzTG9uZyhzbGljZSk7Ci0gIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKLSAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICAgIGxlbmd0aCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0jaWYgUFlfTUFKT1JfVkVSU0lPTiA+PSAzCi0gICAgaWYgKFB5U2xpY2VfR2V0SW5kaWNlc0V4KHNsaWNlLAotI2Vsc2UKLSAgICBpZiAoUHlTbGljZV9HZXRJbmRpY2VzRXgocmVpbnRlcnByZXRfY2FzdDxQeVNsaWNlT2JqZWN0Kj4oc2xpY2UpLAotI2VuZGlmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlbmd0aCwgJmZyb20sICZ0bywgJnN0ZXAsICZzbGljZWxlbmd0aCkgPT0gLTEpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0gICAgY3JlYXRlX2xpc3QgPSB0cnVlOwotICB9IGVsc2UgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJsaXN0IGluZGljZXMgbXVzdCBiZSBpbnRlZ2VycyIpOwotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIGlmICh2YWx1ZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGNtZXNzYWdlOjpJbnRlcm5hbERlbGV0ZVJlcGVhdGVkRmllbGQoCi0gICAgICAgIHNlbGYtPnBhcmVudCwgZmllbGRfZGVzY3JpcHRvciwgc2xpY2UsIE5VTEwpOwotICB9Ci0KLSAgaWYgKCFjcmVhdGVfbGlzdCkgewotICAgIHJldHVybiBBc3NpZ25JdGVtKHNlbGYsIGZyb20sIHZhbHVlKTsKLSAgfQotCi0gIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcoTlVMTCwgTlVMTCwgTlVMTCkpOwotICBpZiAoZnVsbF9zbGljZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIG5ld19saXN0KFN1YnNjcmlwdChzZWxmLCBmdWxsX3NsaWNlLmdldCgpKSk7Ci0gIGlmIChuZXdfbGlzdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmIChQeVNlcXVlbmNlX1NldFNsaWNlKG5ld19saXN0LmdldCgpLCBmcm9tLCB0bywgdmFsdWUpIDwgMCkgewotICAgIHJldHVybiAtMTsKLSAgfQotCi0gIHJldHVybiBJbnRlcm5hbEFzc2lnblJlcGVhdGVkRmllbGQoc2VsZiwgbmV3X2xpc3QuZ2V0KCkpOwotfQotCi1QeU9iamVjdCogRXh0ZW5kKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogdmFsdWUpIHsKLSAgY21lc3NhZ2U6OkFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCk7Ci0KLSAgLy8gVE9ETyhwdHVja2VyKTogRGVwcmVjYXRlIHRoaXMgYmVoYXZpb3IuIGIvMTg0MTM4NjIKLSAgaWYgKHZhbHVlID09IFB5X05vbmUpIHsKLSAgICBQeV9SRVRVUk5fTk9ORTsKLSAgfQotICBpZiAoKFB5X1RZUEUodmFsdWUpLT50cF9hc19zZXF1ZW5jZSA9PSBOVUxMKSAmJiBQeU9iamVjdF9Ob3QodmFsdWUpKSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLQotICBTY29wZWRQeU9iamVjdFB0ciBpdGVyKFB5T2JqZWN0X0dldEl0ZXIodmFsdWUpKTsKLSAgaWYgKGl0ZXIgPT0gTlVMTCkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJWYWx1ZSBtdXN0IGJlIGl0ZXJhYmxlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgU2NvcGVkUHlPYmplY3RQdHIgbmV4dDsKLSAgd2hpbGUgKChuZXh0LnJlc2V0KFB5SXRlcl9OZXh0KGl0ZXIuZ2V0KCkpKSkgIT0gTlVMTCkgewotICAgIGlmIChTY29wZWRQeU9iamVjdFB0cihBcHBlbmQoc2VsZiwgbmV4dC5nZXQoKSkpID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotICBpZiAoUHlFcnJfT2NjdXJyZWQoKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEluc2VydChSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgUHlfc3NpemVfdCBpbmRleDsKLSAgUHlPYmplY3QqIHZhbHVlOwotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgImxPIiwgJmluZGV4LCAmdmFsdWUpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgU2NvcGVkUHlPYmplY3RQdHIgZnVsbF9zbGljZShQeVNsaWNlX05ldyhOVUxMLCBOVUxMLCBOVUxMKSk7Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIG5ld19saXN0KFN1YnNjcmlwdChzZWxmLCBmdWxsX3NsaWNlLmdldCgpKSk7Ci0gIGlmIChQeUxpc3RfSW5zZXJ0KG5ld19saXN0LmdldCgpLCBpbmRleCwgdmFsdWUpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGludCByZXQgPSBJbnRlcm5hbEFzc2lnblJlcGVhdGVkRmllbGQoc2VsZiwgbmV3X2xpc3QuZ2V0KCkpOwotICBpZiAocmV0IDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFJlbW92ZShSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwgUHlPYmplY3QqIHZhbHVlKSB7Ci0gIFB5X3NzaXplX3QgbWF0Y2hfaW5kZXggPSAtMTsKLSAgZm9yIChQeV9zc2l6ZV90IGkgPSAwOyBpIDwgTGVuKHNlbGYpOyArK2kpIHsKLSAgICBTY29wZWRQeU9iamVjdFB0ciBlbGVtKEl0ZW0oc2VsZiwgaSkpOwotICAgIGlmIChQeU9iamVjdF9SaWNoQ29tcGFyZUJvb2woZWxlbS5nZXQoKSwgdmFsdWUsIFB5X0VRKSkgewotICAgICAgbWF0Y2hfaW5kZXggPSBpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIGlmIChtYXRjaF9pbmRleCA9PSAtMSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19WYWx1ZUVycm9yLCAicmVtb3ZlKHgpOiB4IG5vdCBpbiBjb250YWluZXIiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoQXNzaWduSXRlbShzZWxmLCBtYXRjaF9pbmRleCwgTlVMTCkgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogUmljaENvbXBhcmUoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFB5T2JqZWN0KiBvdGhlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9waWQpIHsKLSAgaWYgKG9waWQgIT0gUHlfRVEgJiYgb3BpZCAhPSBQeV9ORSkgewotICAgIFB5X0lOQ1JFRihQeV9Ob3RJbXBsZW1lbnRlZCk7Ci0gICAgcmV0dXJuIFB5X05vdEltcGxlbWVudGVkOwotICB9Ci0KLSAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgdGhpcyByZXBlYXRlZCBzY2FsYXIgY29udGFpbmVyLCBhbmQgb3RoZXIgaWYgaXQgaXMKLSAgLy8gYWxzbyBhIHJlcGVhdGVkIHNjYWxhciBjb250YWluZXIsIGludG8gUHl0aG9uIGxpc3RzIHNvIHdlIGNhbiBkZWxlZ2F0ZQotICAvLyB0byB0aGUgbGlzdCdzIGNvbXBhcmUgbWV0aG9kLgotCi0gIFNjb3BlZFB5T2JqZWN0UHRyIGZ1bGxfc2xpY2UoUHlTbGljZV9OZXcoTlVMTCwgTlVMTCwgTlVMTCkpOwotICBpZiAoZnVsbF9zbGljZSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBTY29wZWRQeU9iamVjdFB0ciBvdGhlcl9saXN0X2RlbGV0ZXI7Ci0gIGlmIChQeU9iamVjdF9UeXBlQ2hlY2sob3RoZXIsICZSZXBlYXRlZFNjYWxhckNvbnRhaW5lcl9UeXBlKSkgewotICAgIG90aGVyX2xpc3RfZGVsZXRlci5yZXNldChTdWJzY3JpcHQoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPihvdGhlciksIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKLSAgICBvdGhlciA9IG90aGVyX2xpc3RfZGVsZXRlci5nZXQoKTsKLSAgfQotCi0gIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoU3Vic2NyaXB0KHNlbGYsIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKLSAgaWYgKGxpc3QgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBQeU9iamVjdF9SaWNoQ29tcGFyZShsaXN0LmdldCgpLCBvdGhlciwgb3BpZCk7Ci19Ci0KLVB5T2JqZWN0KiBSZWR1Y2UoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHVudXNlZF9zZWxmKSB7Ci0gIFB5RXJyX0Zvcm1hdCgKLSAgICAgIFBpY2tsZUVycm9yX2NsYXNzLAotICAgICAgImNhbid0IHBpY2tsZSByZXBlYXRlZCBtZXNzYWdlIGZpZWxkcywgY29udmVydCB0byBsaXN0IGZpcnN0Iik7Ci0gIHJldHVybiBOVUxMOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFNvcnQoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIGFyZ3MsCi0gICAgICAgICAgICAgICAgICAgICAgUHlPYmplY3QqIGt3ZHMpIHsKLSAgLy8gU3VwcG9ydCB0aGUgb2xkIHNvcnRfZnVuY3Rpb24gYXJndW1lbnQgZm9yIGJhY2t3YXJkcwotICAvLyBjb21wYXRpYmlsaXR5LgotICBpZiAoa3dkcyAhPSBOVUxMKSB7Ci0gICAgUHlPYmplY3QqIHNvcnRfZnVuYyA9IFB5RGljdF9HZXRJdGVtU3RyaW5nKGt3ZHMsICJzb3J0X2Z1bmN0aW9uIik7Ci0gICAgaWYgKHNvcnRfZnVuYyAhPSBOVUxMKSB7Ci0gICAgICAvLyBNdXN0IHNldCBiZWZvcmUgZGVsZXRpbmcgYXMgc29ydF9mdW5jIGlzIGEgYm9ycm93ZWQgcmVmZXJlbmNlCi0gICAgICAvLyBhbmQga3dkcyBtaWdodCBiZSB0aGUgb25seSB0aGluZyBrZWVwaW5nIGl0IGFsaXZlLgotICAgICAgaWYgKFB5RGljdF9TZXRJdGVtU3RyaW5nKGt3ZHMsICJjbXAiLCBzb3J0X2Z1bmMpID09IC0xKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIGlmIChQeURpY3RfRGVsSXRlbVN0cmluZyhrd2RzLCAic29ydF9mdW5jdGlvbiIpID09IC0xKQotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLQotICBTY29wZWRQeU9iamVjdFB0ciBmdWxsX3NsaWNlKFB5U2xpY2VfTmV3KE5VTEwsIE5VTEwsIE5VTEwpKTsKLSAgaWYgKGZ1bGxfc2xpY2UgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIGxpc3QoU3Vic2NyaXB0KHNlbGYsIGZ1bGxfc2xpY2UuZ2V0KCkpKTsKLSAgaWYgKGxpc3QgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIG0oUHlPYmplY3RfR2V0QXR0clN0cmluZyhsaXN0LmdldCgpLCAic29ydCIpKTsKLSAgaWYgKG0gPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIFNjb3BlZFB5T2JqZWN0UHRyIHJlcyhQeU9iamVjdF9DYWxsKG0uZ2V0KCksIGFyZ3MsIGt3ZHMpKTsKLSAgaWYgKHJlcyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaW50IHJldCA9IEludGVybmFsQXNzaWduUmVwZWF0ZWRGaWVsZChzZWxmLCBsaXN0LmdldCgpKTsKLSAgaWYgKHJldCA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBQb3AoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYsCi0gICAgICAgICAgICAgICAgICAgICBQeU9iamVjdCogYXJncykgewotICBQeV9zc2l6ZV90IGluZGV4ID0gLTE7Ci0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCAifG4iLCAmaW5kZXgpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlPYmplY3QqIGl0ZW0gPSBJdGVtKHNlbGYsIGluZGV4KTsKLSAgaWYgKGl0ZW0gPT0gTlVMTCkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAotICAgICAgICAgICAgICAgICAibGlzdCBpbmRleCAoJXpkKSBvdXQgb2YgcmFuZ2UiLAotICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgaWYgKEFzc2lnbkl0ZW0oc2VsZiwgaW5kZXgsIE5VTEwpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiBpdGVtOwotfQotCi0vLyBUaGUgcHJpdmF0ZSBjb25zdHJ1Y3RvciBvZiBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciBvYmplY3RzLgotUHlPYmplY3QgKk5ld0NvbnRhaW5lcigKLSAgICBDTWVzc2FnZSogcGFyZW50LCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHBhcmVudF9maWVsZF9kZXNjcmlwdG9yKSB7Ci0gIGlmICghQ2hlY2tGaWVsZEJlbG9uZ3NUb01lc3NhZ2UocGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IsIHBhcmVudC0+bWVzc2FnZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmID0gcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFNjYWxhckNvbnRhaW5lcio+KAotICAgICAgUHlUeXBlX0dlbmVyaWNBbGxvYygmUmVwZWF0ZWRTY2FsYXJDb250YWluZXJfVHlwZSwgMCkpOwotICBpZiAoc2VsZiA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBzZWxmLT5tZXNzYWdlID0gcGFyZW50LT5tZXNzYWdlOwotICBzZWxmLT5wYXJlbnQgPSBwYXJlbnQ7Ci0gIHNlbGYtPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yID0gcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIHNlbGYtPm93bmVyID0gcGFyZW50LT5vd25lcjsKLQotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpOwotfQotCi0vLyBJbml0aWFsaXplcyB0aGUgdW5kZXJseWluZyBNZXNzYWdlIG9iamVjdCBvZiAidG8iIHNvIGl0IGJlY29tZXMgYSBuZXcgcGFyZW50Ci0vLyByZXBlYXRlZCBzY2FsYXIsIGFuZCBjb3BpZXMgYWxsIHRoZSB2YWx1ZXMgZnJvbSAiZnJvbSIgdG8gaXQuIEEgY2hpbGQgc2NhbGFyCi0vLyBjb250YWluZXIgY2FuIGJlIHJlbGVhc2VkIGJ5IHBhc3NpbmcgaXQgYXMgYm90aCBmcm9tIGFuZCB0byAoZS5nLiBtYWtpbmcgaXQKLS8vIHRoZSByZWNpcGllbnQgb2YgdGhlIG5ldyBwYXJlbnQgbWVzc2FnZSBhbmQgY29weWluZyB0aGUgdmFsdWVzIGZyb20gaXRzZWxmKS4KLXN0YXRpYyBpbnQgSW5pdGlhbGl6ZUFuZENvcHlUb1BhcmVudENvbnRhaW5lcigKLSAgICBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogZnJvbSwKLSAgICBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogdG8pIHsKLSAgU2NvcGVkUHlPYmplY3RQdHIgZnVsbF9zbGljZShQeVNsaWNlX05ldyhOVUxMLCBOVUxMLCBOVUxMKSk7Ci0gIGlmIChmdWxsX3NsaWNlID09IE5VTEwpIHsKLSAgICByZXR1cm4gLTE7Ci0gIH0KLSAgU2NvcGVkUHlPYmplY3RQdHIgdmFsdWVzKFN1YnNjcmlwdChmcm9tLCBmdWxsX3NsaWNlLmdldCgpKSk7Ci0gIGlmICh2YWx1ZXMgPT0gTlVMTCkgewotICAgIHJldHVybiAtMTsKLSAgfQotICBNZXNzYWdlKiBuZXdfbWVzc2FnZSA9IGZyb20tPm1lc3NhZ2UtPk5ldygpOwotICB0by0+cGFyZW50ID0gTlVMTDsKLSAgdG8tPnBhcmVudF9maWVsZF9kZXNjcmlwdG9yID0gZnJvbS0+cGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIHRvLT5tZXNzYWdlID0gbmV3X21lc3NhZ2U7Ci0gIHRvLT5vd25lci5yZXNldChuZXdfbWVzc2FnZSk7Ci0gIGlmIChJbnRlcm5hbEFzc2lnblJlcGVhdGVkRmllbGQodG8sIHZhbHVlcy5nZXQoKSkgPCAwKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbnQgUmVsZWFzZShSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZikgewotICByZXR1cm4gSW5pdGlhbGl6ZUFuZENvcHlUb1BhcmVudENvbnRhaW5lcihzZWxmLCBzZWxmKTsKLX0KLQotUHlPYmplY3QqIERlZXBDb3B5KFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBjbG9uZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRTY2FsYXJDb250YWluZXIqPigKLSAgICAgIFB5VHlwZV9HZW5lcmljQWxsb2MoJlJlcGVhdGVkU2NhbGFyQ29udGFpbmVyX1R5cGUsIDApKTsKLSAgaWYgKGNsb25lID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChJbml0aWFsaXplQW5kQ29weVRvUGFyZW50Q29udGFpbmVyKHNlbGYsIGNsb25lKSA8IDApIHsKLSAgICBQeV9ERUNSRUYoY2xvbmUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oY2xvbmUpOwotfQotCi1zdGF0aWMgdm9pZCBEZWFsbG9jKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmKSB7Ci0gIHNlbGYtPm93bmVyLnJlc2V0KCk7Ci0gIFB5X1RZUEUoc2VsZiktPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKLX0KLQotdm9pZCBTZXRPd25lcihSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwKLSAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxNZXNzYWdlPiYgbmV3X293bmVyKSB7Ci0gIHNlbGYtPm93bmVyID0gbmV3X293bmVyOwotfQotCi1zdGF0aWMgUHlTZXF1ZW5jZU1ldGhvZHMgU3FNZXRob2RzID0gewotICAobGVuZnVuYylMZW4sICAgICAgICAgICAvKiBzcV9sZW5ndGggKi8KLSAgMCwgLyogc3FfY29uY2F0ICovCi0gIDAsIC8qIHNxX3JlcGVhdCAqLwotICAoc3NpemVhcmdmdW5jKUl0ZW0sIC8qIHNxX2l0ZW0gKi8KLSAgMCwgLyogc3Ffc2xpY2UgKi8KLSAgKHNzaXplb2JqYXJncHJvYylBc3NpZ25JdGVtIC8qIHNxX2Fzc19pdGVtICovCi19OwotCi1zdGF0aWMgUHlNYXBwaW5nTWV0aG9kcyBNcE1ldGhvZHMgPSB7Ci0gIChsZW5mdW5jKUxlbiwgICAgICAgICAgICAgICAvKiBtcF9sZW5ndGggKi8KLSAgKGJpbmFyeWZ1bmMpU3Vic2NyaXB0LCAgICAgIC8qIG1wX3N1YnNjcmlwdCAqLwotICAob2Jqb2JqYXJncHJvYylBc3NTdWJzY3JpcHQsIC8qIG1wX2Fzc19zdWJzY3JpcHQgKi8KLX07Ci0KLXN0YXRpYyBQeU1ldGhvZERlZiBNZXRob2RzW10gPSB7Ci0gIHsgIl9fZGVlcGNvcHlfXyIsIChQeUNGdW5jdGlvbilEZWVwQ29weSwgTUVUSF9WQVJBUkdTLAotICAgICJNYWtlcyBhIGRlZXAgY29weSBvZiB0aGUgY2xhc3MuIiB9LAotICB7ICJfX3JlZHVjZV9fIiwgKFB5Q0Z1bmN0aW9uKVJlZHVjZSwgTUVUSF9OT0FSR1MsCi0gICAgIk91dHB1dHMgcGlja2xhYmxlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSByZXBlYXRlZCBmaWVsZC4iIH0sCi0gIHsgImFwcGVuZCIsIChQeUNGdW5jdGlvbilBcHBlbmQsIE1FVEhfTywKLSAgICAiQXBwZW5kcyBhbiBvYmplY3QgdG8gdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4iIH0sCi0gIHsgImV4dGVuZCIsIChQeUNGdW5jdGlvbilFeHRlbmQsIE1FVEhfTywKLSAgICAiQXBwZW5kcyBvYmplY3RzIHRvIHRoZSByZXBlYXRlZCBjb250YWluZXIuIiB9LAotICB7ICJpbnNlcnQiLCAoUHlDRnVuY3Rpb24pSW5zZXJ0LCBNRVRIX1ZBUkFSR1MsCi0gICAgIkFwcGVuZHMgb2JqZWN0cyB0byB0aGUgcmVwZWF0ZWQgY29udGFpbmVyLiIgfSwKLSAgeyAicG9wIiwgKFB5Q0Z1bmN0aW9uKVBvcCwgTUVUSF9WQVJBUkdTLAotICAgICJSZW1vdmVzIGFuIG9iamVjdCBmcm9tIHRoZSByZXBlYXRlZCBjb250YWluZXIgYW5kIHJldHVybnMgaXQuIiB9LAotICB7ICJyZW1vdmUiLCAoUHlDRnVuY3Rpb24pUmVtb3ZlLCBNRVRIX08sCi0gICAgIlJlbW92ZXMgYW4gb2JqZWN0IGZyb20gdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4iIH0sCi0gIHsgInNvcnQiLCAoUHlDRnVuY3Rpb24pU29ydCwgTUVUSF9WQVJBUkdTIHwgTUVUSF9LRVlXT1JEUywKLSAgICAiU29ydHMgdGhlIHJlcGVhdGVkIGNvbnRhaW5lci4ifSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSByZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyCi0KLVB5VHlwZU9iamVjdCBSZXBlYXRlZFNjYWxhckNvbnRhaW5lcl9UeXBlID0gewotICBQeVZhck9iamVjdF9IRUFEX0lOSVQoJlB5VHlwZV9UeXBlLCAwKQotICBGVUxMX01PRFVMRV9OQU1FICIuUmVwZWF0ZWRTY2FsYXJDb250YWluZXIiLCAgLy8gdHBfbmFtZQotICBzaXplb2YoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIpLCAgICAgLy8gdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlbXNpemUKLSAgKGRlc3RydWN0b3IpcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcjo6RGVhbGxvYywgIC8vICB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCi0gICZyZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyOjpTcU1ldGhvZHMsICAgLy8gIHRwX2FzX3NlcXVlbmNlCi0gICZyZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyOjpNcE1ldGhvZHMsICAgLy8gIHRwX2FzX21hcHBpbmcKLSAgUHlPYmplY3RfSGFzaE5vdEltcGxlbWVudGVkLCAgICAgICAgIC8vICB0cF9oYXNoCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2FsbAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3N0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2dldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19idWZmZXIKLSAgUHlfVFBGTEFHU19ERUZBVUxULCAgICAgICAgICAgICAgICAgIC8vICB0cF9mbGFncwotICAiQSBSZXBlYXRlZCBzY2FsYXIgY29udGFpbmVyIiwgICAgICAgLy8gIHRwX2RvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3RyYXZlcnNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfY2xlYXIKLSAgKHJpY2hjbXBmdW5jKXJlcGVhdGVkX3NjYWxhcl9jb250YWluZXI6OlJpY2hDb21wYXJlLCAgLy8gIHRwX3JpY2hjb21wYXJlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfd2Vha2xpc3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlcm5leHQKLSAgcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lcjo6TWV0aG9kcywgICAgICAvLyAgdHBfbWV0aG9kcwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21lbWJlcnMKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9iYXNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZGljdAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX2dldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2Rlc2NyX3NldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pbml0Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcmVwZWF0ZWRfc2NhbGFyX2NvbnRhaW5lci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU1NWU2MjEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9yZXBlYXRlZF9zY2FsYXJfY29udGFpbmVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogYW51cmFhZ0Bnb29nbGUuY29tIChBbnVyYWFnIEFncmF3YWwpCi0vLyBBdXRob3I6IHRpYmVsbEBnb29nbGUuY29tIChKb2hhbiBUaWJlbGwpCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfUkVQRUFURURfU0NBTEFSX0NPTlRBSU5FUl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9DUFBfUkVQRUFURURfU0NBTEFSX0NPTlRBSU5FUl9IX18KLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1jbGFzcyBNZXNzYWdlOwotCi0jaWZkZWYgX1NIQVJFRF9QVFJfSAotdXNpbmcgc3RkOjpzaGFyZWRfcHRyOwotI2Vsc2UKLXVzaW5nIGludGVybmFsOjpzaGFyZWRfcHRyOwotI2VuZGlmCi0KLW5hbWVzcGFjZSBweXRob24gewotCi1zdHJ1Y3QgQ01lc3NhZ2U7Ci0KLXR5cGVkZWYgc3RydWN0IFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyIHsKLSAgUHlPYmplY3RfSEVBRDsKLQotICAvLyBUaGlzIGlzIHRoZSB0b3AtbGV2ZWwgQysrIE1lc3NhZ2Ugb2JqZWN0IHRoYXQgb3ducyB0aGUgd2hvbGUKLSAgLy8gcHJvdG8gdHJlZS4gIEV2ZXJ5IFB5dGhvbiBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciBob2xkcyBhCi0gIC8vIHJlZmVyZW5jZSB0byBpdCBpbiBvcmRlciB0byBrZWVwIGl0IGFsaXZlIGFzIGxvbmcgYXMgdGhlcmUncyBhCi0gIC8vIFB5dGhvbiBvYmplY3QgdGhhdCByZWZlcmVuY2VzIGFueSBwYXJ0IG9mIHRoZSB0cmVlLgotICBzaGFyZWRfcHRyPE1lc3NhZ2U+IG93bmVyOwotCi0gIC8vIFBvaW50ZXIgdG8gdGhlIEMrKyBNZXNzYWdlIHRoYXQgY29udGFpbnMgdGhpcyBjb250YWluZXIuICBUaGUKLSAgLy8gUmVwZWF0ZWRTY2FsYXJDb250YWluZXIgZG9lcyBub3Qgb3duIHRoaXMgcG9pbnRlci4KLSAgTWVzc2FnZSogbWVzc2FnZTsKLQotICAvLyBXZWFrIHJlZmVyZW5jZSB0byBhIHBhcmVudCBDTWVzc2FnZSBvYmplY3QgKGkuZS4gbWF5IGJlIE5VTEwuKQotICAvLwotICAvLyBVc2VkIHRvIG1ha2Ugc3VyZSBhbGwgYW5jZXN0b3JzIGFyZSBhbHNvIG11dGFibGUgd2hlbiBmaXJzdAotICAvLyBtb2RpZnlpbmcgdGhlIGNvbnRhaW5lci4KLSAgQ01lc3NhZ2UqIHBhcmVudDsKLQotICAvLyBQb2ludGVyIHRvIHRoZSBwYXJlbnQncyBkZXNjcmlwdG9yIHRoYXQgZGVzY3JpYmVzIHRoaXMKLSAgLy8gZmllbGQuICBVc2VkIHRvZ2V0aGVyIHdpdGggdGhlIHBhcmVudCdzIG1lc3NhZ2Ugd2hlbiBtYWtpbmcgYQotICAvLyBkZWZhdWx0IG1lc3NhZ2UgaW5zdGFuY2UgbXV0YWJsZS4KLSAgLy8gVGhlIHBvaW50ZXIgaXMgb3duZWQgYnkgdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbC4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGRfZGVzY3JpcHRvcjsKLX0gUmVwZWF0ZWRTY2FsYXJDb250YWluZXI7Ci0KLWV4dGVybiBQeVR5cGVPYmplY3QgUmVwZWF0ZWRTY2FsYXJDb250YWluZXJfVHlwZTsKLQotbmFtZXNwYWNlIHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXIgewotCi0vLyBCdWlsZHMgYSBSZXBlYXRlZFNjYWxhckNvbnRhaW5lciBvYmplY3QsIGZyb20gYSBwYXJlbnQgbWVzc2FnZSBhbmQgYQotLy8gZmllbGQgZGVzY3JpcHRvci4KLWV4dGVybiBQeU9iamVjdCAqTmV3Q29udGFpbmVyKAotICAgIENNZXNzYWdlKiBwYXJlbnQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcGFyZW50X2ZpZWxkX2Rlc2NyaXB0b3IpOwotCi0vLyBBcHBlbmRzIHRoZSBzY2FsYXIgJ2l0ZW0nIHRvIHRoZSBlbmQgb2YgdGhlIGNvbnRhaW5lciAnc2VsZicuCi0vLwotLy8gUmV0dXJucyBOb25lIGlmIHN1Y2Nlc3NmdWw7IHJldHVybnMgTlVMTCBhbmQgc2V0cyBhbiBleGNlcHRpb24gaWYKLS8vIHVuc3VjY2Vzc2Z1bC4KLVB5T2JqZWN0KiBBcHBlbmQoUmVwZWF0ZWRTY2FsYXJDb250YWluZXIqIHNlbGYsIFB5T2JqZWN0KiBpdGVtKTsKLQotLy8gUmVsZWFzZXMgdGhlIG1lc3NhZ2VzIGluIHRoZSBjb250YWluZXIgdG8gYSBuZXcgbWVzc2FnZS4KLS8vCi0vLyBSZXR1cm5zIDAgb24gc3VjY2VzcywgLTEgb24gZmFpbHVyZS4KLWludCBSZWxlYXNlKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmKTsKLQotLy8gQXBwZW5kcyBhbGwgdGhlIGVsZW1lbnRzIGluIHRoZSBpbnB1dCBpdGVyYXRvciB0byB0aGUgY29udGFpbmVyLgotLy8KLS8vIFJldHVybnMgTm9uZSBpZiBzdWNjZXNzZnVsOyByZXR1cm5zIE5VTEwgYW5kIHNldHMgYW4gZXhjZXB0aW9uIGlmCi0vLyB1bnN1Y2Nlc3NmdWwuCi1QeU9iamVjdCogRXh0ZW5kKFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKiBzZWxmLCBQeU9iamVjdCogdmFsdWUpOwotCi0vLyBTZXQgdGhlIG93bmVyIGZpZWxkIG9mIHNlbGYgYW5kIGFueSBjaGlsZHJlbiBvZiBzZWxmLgotdm9pZCBTZXRPd25lcihSZXBlYXRlZFNjYWxhckNvbnRhaW5lciogc2VsZiwKLSAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX3B0cjxNZXNzYWdlPiYgbmV3X293bmVyKTsKLQotfSAgLy8gbmFtZXNwYWNlIHJlcGVhdGVkX3NjYWxhcl9jb250YWluZXIKLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1JFUEVBVEVEX1NDQUxBUl9DT05UQUlORVJfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3Njb3BlZF9weW9iamVjdF9wdHIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhMTI4Y2Q0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvc2NvcGVkX3B5b2JqZWN0X3B0ci5oCisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogdGliZWxsQGdvb2dsZS5jb20gKEpvaGFuIFRpYmVsbCkKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9TQ09QRURfUFlPQkpFQ1RfUFRSX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0NQUF9TQ09QRURfUFlPQkpFQ1RfUFRSX0hfXwotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotY2xhc3MgU2NvcGVkUHlPYmplY3RQdHIgewotIHB1YmxpYzoKLSAgLy8gQ29uc3RydWN0b3IuICBEZWZhdWx0cyB0byBpbml0aWFsaXppbmcgd2l0aCBOVUxMLgotICAvLyBUaGVyZSBpcyBubyB3YXkgdG8gY3JlYXRlIGFuIHVuaW5pdGlhbGl6ZWQgU2NvcGVkUHlPYmplY3RQdHIuCi0gIGV4cGxpY2l0IFNjb3BlZFB5T2JqZWN0UHRyKFB5T2JqZWN0KiBwID0gTlVMTCkgOiBwdHJfKHApIHsgfQotCi0gIC8vIERlc3RydWN0b3IuICBJZiB0aGVyZSBpcyBhIFB5T2JqZWN0IG9iamVjdCwgZGVsZXRlIGl0LgotICB+U2NvcGVkUHlPYmplY3RQdHIoKSB7Ci0gICAgUHlfWERFQ1JFRihwdHJfKTsKLSAgfQotCi0gIC8vIFJlc2V0LiAgRGVsZXRlcyB0aGUgY3VycmVudCBvd25lZCBvYmplY3QsIGlmIGFueS4KLSAgLy8gVGhlbiB0YWtlcyBvd25lcnNoaXAgb2YgYSBuZXcgb2JqZWN0LCBpZiBnaXZlbi4KLSAgLy8gVGhpcyBmdW5jdGlvbiBtdXN0IGJlIGNhbGxlZCB3aXRoIGEgcmVmZXJlbmNlIHRoYXQgeW91IG93bi4KLSAgLy8gICB0aGlzLT5yZXNldCh0aGlzLT5nZXQoKSkgaXMgd3JvbmchCi0gIC8vICAgdGhpcy0+cmVzZXQodGhpcy0+cmVsZWFzZSgpKSBpcyBPSy4KLSAgUHlPYmplY3QqIHJlc2V0KFB5T2JqZWN0KiBwID0gTlVMTCkgewotICAgIFB5X1hERUNSRUYocHRyXyk7Ci0gICAgcHRyXyA9IHA7Ci0gICAgcmV0dXJuIHB0cl87Ci0gIH0KLQotICAvLyBSZWxlYXNlcyBvd25lcnNoaXAgb2YgdGhlIG9iamVjdC4KLSAgLy8gVGhlIGNhbGxlciBub3cgb3ducyB0aGUgcmV0dXJuZWQgcmVmZXJlbmNlLgotICBQeU9iamVjdCogcmVsZWFzZSgpIHsKLSAgICBQeU9iamVjdCogcCA9IHB0cl87Ci0gICAgcHRyXyA9IE5VTEw7Ci0gICAgcmV0dXJuIHA7Ci0gIH0KLQotICBQeU9iamVjdCogb3BlcmF0b3ItPigpIGNvbnN0ICB7Ci0gICAgYXNzZXJ0KHB0cl8gIT0gTlVMTCk7Ci0gICAgcmV0dXJuIHB0cl87Ci0gIH0KLQotICBQeU9iamVjdCogZ2V0KCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotCi0gIFB5X3NzaXplX3QgcmVmY250KCkgY29uc3QgeyByZXR1cm4gUHlfUkVGQ05UKHB0cl8pOyB9Ci0KLSAgdm9pZCBpbmMoKSBjb25zdCB7IFB5X0lOQ1JFRihwdHJfKTsgfQotCi0gIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgotICAvLyBUaGVzZSByZXR1cm4gd2hldGhlciBhIFNjb3BlZFB5T2JqZWN0UHRyIGFuZCBhIHJhdyBwb2ludGVyCi0gIC8vIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwKLSAgLy8gb2JqZWN0cy4KLSAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IFB5T2JqZWN0KiBwKSBjb25zdCB7IHJldHVybiBwdHJfID09IHA7IH0KLSAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IFB5T2JqZWN0KiBwKSBjb25zdCB7IHJldHVybiBwdHJfICE9IHA7IH0KLQotIHByaXZhdGU6Ci0gIFB5T2JqZWN0KiBwdHJfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTY29wZWRQeU9iamVjdFB0cik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fQ1BQX1NDT1BFRF9QWU9CSkVDVF9QVFJfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDBjNzU3MjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIyBUaGlzIGNvZGUgaXMgbWVhbnQgdG8gd29yayBvbiBQeXRob24gMi40IGFuZCBhYm92ZSBvbmx5LgotCi0iIiJDb250YWlucyBhIG1ldGFjbGFzcyBhbmQgaGVscGVyIGZ1bmN0aW9ucyB1c2VkIHRvIGNyZWF0ZQotcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGZyb20gRGVzY3JpcHRvciBvYmplY3RzIGF0IHJ1bnRpbWUuCi0KLVJlY2FsbCB0aGF0IGEgbWV0YWNsYXNzIGlzIHRoZSAidHlwZSIgb2YgYSBjbGFzcy4KLShBIGNsYXNzIGlzIHRvIGEgbWV0YWNsYXNzIHdoYXQgYW4gaW5zdGFuY2UgaXMgdG8gYSBjbGFzcy4pCi0KLUluIHRoaXMgY2FzZSwgd2UgdXNlIHRoZSBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlIG1ldGFjbGFzcwotdG8gaW5qZWN0IGFsbCB0aGUgdXNlZnVsIGZ1bmN0aW9uYWxpdHkgaW50byB0aGUgY2xhc3Nlcwotb3V0cHV0IGJ5IHRoZSBwcm90b2NvbCBjb21waWxlciBhdCBjb21waWxlLXRpbWUuCi0KLVRoZSB1cHNob3Qgb2YgYWxsIHRoaXMgaXMgdGhhdCB0aGUgcmVhbCBpbXBsZW1lbnRhdGlvbgotZGV0YWlscyBmb3IgQUxMIHB1cmUtUHl0aG9uIHByb3RvY29sIGJ1ZmZlcnMgYXJlICpoZXJlIGluCi10aGlzIGZpbGUqLgotIiIiCi0KLV9fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCi0KLQotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGFwaV9pbXBsZW1lbnRhdGlvbgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKLQotCi1pZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgotICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5weWV4dCBpbXBvcnQgY3BwX21lc3NhZ2UgYXMgbWVzc2FnZV9pbXBsCi1lbHNlOgotICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgcHl0aG9uX21lc3NhZ2UgYXMgbWVzc2FnZV9pbXBsCi0KLSMgVGhlIHR5cGUgb2YgYWxsIE1lc3NhZ2UgY2xhc3Nlcy4KLSMgUGFydCBvZiB0aGUgcHVibGljIGludGVyZmFjZS4KLSMKLSMgVXNlZCBieSBnZW5lcmF0ZWQgZmlsZXMsIGJ1dCBjbGllbnRzIGNhbiBhbHNvIHVzZSBpdCBhdCBydW50aW1lOgotIyAgIG15ZGVzY3JpcHRvciA9IHBvb2wuRmluZERlc2NyaXB0b3IoLi4uLi4pCi0jICAgY2xhc3MgTXlQcm90b0NsYXNzKE1lc3NhZ2UpOgotIyAgICAgX19tZXRhY2xhc3NfXyA9IEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSMgICAgIERFU0NSSVBUT1IgPSBteWRlc2NyaXB0b3IKLUdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgPSBtZXNzYWdlX2ltcGwuR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotCi0KLWRlZiBQYXJzZU1lc3NhZ2UoZGVzY3JpcHRvciwgYnl0ZV9zdHIpOgotICAiIiJHZW5lcmF0ZSBhIG5ldyBNZXNzYWdlIGluc3RhbmNlIGZyb20gdGhpcyBEZXNjcmlwdG9yIGFuZCBhIGJ5dGUgc3RyaW5nLgotCi0gIEFyZ3M6Ci0gICAgZGVzY3JpcHRvcjogUHJvdG9idWYgRGVzY3JpcHRvciBvYmplY3QKLSAgICBieXRlX3N0cjogU2VyaWFsaXplZCBwcm90b2NvbCBidWZmZXIgYnl0ZSBzdHJpbmcKLQotICBSZXR1cm5zOgotICAgIE5ld2x5IGNyZWF0ZWQgcHJvdG9idWYgTWVzc2FnZSBvYmplY3QuCi0gICIiIgotICByZXN1bHRfY2xhc3MgPSBNYWtlQ2xhc3MoZGVzY3JpcHRvcikKLSAgbmV3X21zZyA9IHJlc3VsdF9jbGFzcygpCi0gIG5ld19tc2cuUGFyc2VGcm9tU3RyaW5nKGJ5dGVfc3RyKQotICByZXR1cm4gbmV3X21zZwotCi0KLWRlZiBNYWtlQ2xhc3MoZGVzY3JpcHRvcik6Ci0gICIiIkNvbnN0cnVjdCBhIGNsYXNzIG9iamVjdCBmb3IgYSBwcm90b2J1ZiBkZXNjcmliZWQgYnkgZGVzY3JpcHRvci4KLQotICBDb21wb3NpdGUgZGVzY3JpcHRvcnMgYXJlIGhhbmRsZWQgYnkgZGVmaW5pbmcgdGhlIG5ldyBjbGFzcyBhcyBhIG1lbWJlciBvZiB0aGUKLSAgcGFyZW50IGNsYXNzLCByZWN1cnNpbmcgYXMgZGVlcCBhcyBuZWNlc3NhcnkuCi0gIFRoaXMgaXMgdGhlIGR5bmFtaWMgZXF1aXZhbGVudCB0bzoKLQotICBjbGFzcyBQYXJlbnQobWVzc2FnZS5NZXNzYWdlKToKLSAgICBfX21ldGFjbGFzc19fID0gR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICAgIERFU0NSSVBUT1IgPSBkZXNjcmlwdG9yCi0gICAgY2xhc3MgQ2hpbGQobWVzc2FnZS5NZXNzYWdlKToKLSAgICAgIF9fbWV0YWNsYXNzX18gPSBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gICAgICBERVNDUklQVE9SID0gZGVzY3JpcHRvci5uZXN0ZWRfdHlwZXNbMF0KLQotICBTYW1wbGUgdXNhZ2U6Ci0gICAgZmlsZV9kZXNjcmlwdG9yID0gZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bygpCi0gICAgZmlsZV9kZXNjcmlwdG9yLlBhcnNlRnJvbVN0cmluZyhwcm90bzJfc3RyaW5nKQotICAgIG1zZ19kZXNjcmlwdG9yID0gZGVzY3JpcHRvci5NYWtlRGVzY3JpcHRvcihmaWxlX2Rlc2NyaXB0b3IubWVzc2FnZV90eXBlWzBdKQotICAgIG1zZ19jbGFzcyA9IHJlZmxlY3Rpb24uTWFrZUNsYXNzKG1zZ19kZXNjcmlwdG9yKQotICAgIG1zZyA9IG1zZ19jbGFzcygpCi0KLSAgQXJnczoKLSAgICBkZXNjcmlwdG9yOiBBIGRlc2NyaXB0b3IuRGVzY3JpcHRvciBvYmplY3QgZGVzY3JpYmluZyB0aGUgcHJvdG9idWYuCi0gIFJldHVybnM6Ci0gICAgVGhlIE1lc3NhZ2UgY2xhc3Mgb2JqZWN0IGRlc2NyaWJlZCBieSB0aGUgZGVzY3JpcHRvci4KLSAgIiIiCi0gIGF0dHJpYnV0ZXMgPSB7fQotICBmb3IgbmFtZSwgbmVzdGVkX3R5cGUgaW4gZGVzY3JpcHRvci5uZXN0ZWRfdHlwZXNfYnlfbmFtZS5pdGVtcygpOgotICAgIGF0dHJpYnV0ZXNbbmFtZV0gPSBNYWtlQ2xhc3MobmVzdGVkX3R5cGUpCi0KLSAgYXR0cmlidXRlc1tHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlLl9ERVNDUklQVE9SX0tFWV0gPSBkZXNjcmlwdG9yCi0KLSAgcmV0dXJuIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoc3RyKGRlc2NyaXB0b3IubmFtZSksIChtZXNzYWdlLk1lc3NhZ2UsKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXR0cmlidXRlcykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZS5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggOWUwMGRlNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJERVBSRUNBVEVEOiAgRGVjbGFyZXMgdGhlIFJQQyBzZXJ2aWNlIGludGVyZmFjZXMuCi0KLVRoaXMgbW9kdWxlIGRlY2xhcmVzIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2VzIHVuZGVybHlpbmcgcHJvdG8yIFJQQwotc2VydmljZXMuICBUaGVzZSBhcmUgaW50ZW5kZWQgdG8gYmUgaW5kZXBlbmRlbnQgb2YgYW55IHBhcnRpY3VsYXIgUlBDCi1pbXBsZW1lbnRhdGlvbiwgc28gdGhhdCBwcm90bzIgc2VydmljZXMgY2FuIGJlIHVzZWQgb24gdG9wIG9mIGEgdmFyaWV0eQotb2YgaW1wbGVtZW50YXRpb25zLiAgU3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZAotbm90IHRyeSB0byBidWlsZCBvbiB0aGVzZSwgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucwotd2hpY2ggZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheQotdGhlIGdlbmVyYXRlZCBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlCi1hbmQgY2FuIGF2b2lkIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCi0KLQotY2xhc3MgUnBjRXhjZXB0aW9uKEV4Y2VwdGlvbik6Ci0gICIiIkV4Y2VwdGlvbiByYWlzZWQgb24gZmFpbGVkIGJsb2NraW5nIFJQQyBtZXRob2QgY2FsbC4iIiIKLSAgcGFzcwotCi0KLWNsYXNzIFNlcnZpY2Uob2JqZWN0KToKLQotICAiIiJBYnN0cmFjdCBiYXNlIGludGVyZmFjZSBmb3IgcHJvdG9jb2wtYnVmZmVyLWJhc2VkIFJQQyBzZXJ2aWNlcy4KLQotICBTZXJ2aWNlcyB0aGVtc2VsdmVzIGFyZSBhYnN0cmFjdCBjbGFzc2VzIChpbXBsZW1lbnRlZCBlaXRoZXIgYnkgc2VydmVycyBvciBhcwotICBzdHVicyksIGJ1dCB0aGV5IHN1YmNsYXNzIHRoaXMgYmFzZSBpbnRlcmZhY2UuIFRoZSBtZXRob2RzIG9mIHRoaXMKLSAgaW50ZXJmYWNlIGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhlIG1ldGhvZHMgb2YgdGhlIHNlcnZpY2Ugd2l0aG91dCBrbm93aW5nCi0gIGl0cyBleGFjdCB0eXBlIGF0IGNvbXBpbGUgdGltZSAoYW5hbG9nb3VzIHRvIHRoZSBNZXNzYWdlIGludGVyZmFjZSkuCi0gICIiIgotCi0gIGRlZiBHZXREZXNjcmlwdG9yKCk6Ci0gICAgIiIiUmV0cmlldmVzIHRoaXMgc2VydmljZSdzIGRlc2NyaXB0b3IuIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBDYWxsTWV0aG9kKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yLCBycGNfY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgcmVxdWVzdCwgZG9uZSk6Ci0gICAgIiIiQ2FsbHMgYSBtZXRob2Qgb2YgdGhlIHNlcnZpY2Ugc3BlY2lmaWVkIGJ5IG1ldGhvZF9kZXNjcmlwdG9yLgotCi0gICAgSWYgImRvbmUiIGlzIE5vbmUgdGhlbiB0aGUgY2FsbCBpcyBibG9ja2luZyBhbmQgdGhlIHJlc3BvbnNlCi0gICAgbWVzc2FnZSB3aWxsIGJlIHJldHVybmVkIGRpcmVjdGx5LiAgT3RoZXJ3aXNlIHRoZSBjYWxsIGlzIGFzeW5jaHJvbm91cwotICAgIGFuZCAiZG9uZSIgd2lsbCBsYXRlciBiZSBjYWxsZWQgd2l0aCB0aGUgcmVzcG9uc2UgdmFsdWUuCi0KLSAgICBJbiB0aGUgYmxvY2tpbmcgY2FzZSwgUnBjRXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkIG9uIGVycm9yLgotCi0gICAgUHJlY29uZGl0aW9uczoKLSAgICAqIG1ldGhvZF9kZXNjcmlwdG9yLnNlcnZpY2UgPT0gR2V0RGVzY3JpcHRvcgotICAgICogcmVxdWVzdCBpcyBvZiB0aGUgZXhhY3Qgc2FtZSBjbGFzc2VzIGFzIHJldHVybmVkIGJ5Ci0gICAgICBHZXRSZXF1ZXN0Q2xhc3MobWV0aG9kKS4KLSAgICAqIEFmdGVyIHRoZSBjYWxsIGhhcyBzdGFydGVkLCB0aGUgcmVxdWVzdCBtdXN0IG5vdCBiZSBtb2RpZmllZC4KLSAgICAqICJycGNfY29udHJvbGxlciIgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSBmb3IgdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBiZWluZwotICAgICAgdXNlZCBieSB0aGlzIFNlcnZpY2UuICBGb3Igc3R1YnMsIHRoZSAiY29ycmVjdCB0eXBlIiBkZXBlbmRzIG9uIHRoZQotICAgICAgUnBjQ2hhbm5lbCB3aGljaCB0aGUgc3R1YiBpcyB1c2luZy4KLQotICAgIFBvc3Rjb25kaXRpb25zOgotICAgICogImRvbmUiIHdpbGwgYmUgY2FsbGVkIHdoZW4gdGhlIG1ldGhvZCBpcyBjb21wbGV0ZS4gIFRoaXMgbWF5IGJlCi0gICAgICBiZWZvcmUgQ2FsbE1ldGhvZCgpIHJldHVybnMgb3IgaXQgbWF5IGJlIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4KLSAgICAqIElmIHRoZSBSUEMgZmFpbGVkLCB0aGUgcmVzcG9uc2UgdmFsdWUgcGFzc2VkIHRvICJkb25lIiB3aWxsIGJlIE5vbmUuCi0gICAgICBGdXJ0aGVyIGRldGFpbHMgYWJvdXQgdGhlIGZhaWx1cmUgY2FuIGJlIGZvdW5kIGJ5IHF1ZXJ5aW5nIHRoZQotICAgICAgUnBjQ29udHJvbGxlci4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIEdldFJlcXVlc3RDbGFzcyhzZWxmLCBtZXRob2RfZGVzY3JpcHRvcik6Ci0gICAgIiIiUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIHJlcXVlc3QgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0KLSAgICBDYWxsTWV0aG9kKCkgcmVxdWlyZXMgdGhhdCB0aGUgcmVxdWVzdCBpcyBvZiBhIHBhcnRpY3VsYXIgc3ViY2xhc3Mgb2YKLSAgICBNZXNzYWdlLiBHZXRSZXF1ZXN0Q2xhc3MoKSBnZXRzIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoaXMgcmVxdWlyZWQKLSAgICB0eXBlLgotCi0gICAgRXhhbXBsZToKLSAgICAgIG1ldGhvZCA9IHNlcnZpY2UuR2V0RGVzY3JpcHRvcigpLkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpCi0gICAgICByZXF1ZXN0ID0gc3R1Yi5HZXRSZXF1ZXN0Q2xhc3MobWV0aG9kKSgpCi0gICAgICByZXF1ZXN0LlBhcnNlRnJvbVN0cmluZyhpbnB1dCkKLSAgICAgIHNlcnZpY2UuQ2FsbE1ldGhvZChtZXRob2QsIHJlcXVlc3QsIGNhbGxiYWNrKQotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgR2V0UmVzcG9uc2VDbGFzcyhzZWxmLCBtZXRob2RfZGVzY3JpcHRvcik6Ci0gICAgIiIiUmV0dXJucyB0aGUgY2xhc3Mgb2YgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLgotCi0gICAgVGhpcyBtZXRob2QgaXNuJ3QgcmVhbGx5IG5lZWRlZCwgYXMgdGhlIFJwY0NoYW5uZWwncyBDYWxsTWV0aG9kIGNvbnN0cnVjdHMKLSAgICB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgbWVzc2FnZS4gSXQncyBwcm92aWRlZCBhbnl3YXkgaW4gY2FzZSBpdCBpcyB1c2VmdWwKLSAgICBmb3IgdGhlIGNhbGxlciB0byBrbm93IHRoZSByZXNwb25zZSB0eXBlIGluIGFkdmFuY2UuCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0KLWNsYXNzIFJwY0NvbnRyb2xsZXIob2JqZWN0KToKLQotICAiIiJBbiBScGNDb250cm9sbGVyIG1lZGlhdGVzIGEgc2luZ2xlIG1ldGhvZCBjYWxsLgotCi0gIFRoZSBwcmltYXJ5IHB1cnBvc2Ugb2YgdGhlIGNvbnRyb2xsZXIgaXMgdG8gcHJvdmlkZSBhIHdheSB0byBtYW5pcHVsYXRlCi0gIHNldHRpbmdzIHNwZWNpZmljIHRvIHRoZSBSUEMgaW1wbGVtZW50YXRpb24gYW5kIHRvIGZpbmQgb3V0IGFib3V0IFJQQy1sZXZlbAotICBlcnJvcnMuIFRoZSBtZXRob2RzIHByb3ZpZGVkIGJ5IHRoZSBScGNDb250cm9sbGVyIGludGVyZmFjZSBhcmUgaW50ZW5kZWQKLSAgdG8gYmUgYSAibGVhc3QgY29tbW9uIGRlbm9taW5hdG9yIiBzZXQgb2YgZmVhdHVyZXMgd2hpY2ggd2UgZXhwZWN0IGFsbAotICBpbXBsZW1lbnRhdGlvbnMgdG8gc3VwcG9ydC4gIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSBtb3JlCi0gIGFkdmFuY2VkIGZlYXR1cmVzIChlLmcuIGRlYWRsaW5lIHByb3BhZ2F0aW9uKS4KLSAgIiIiCi0KLSAgIyBDbGllbnQtc2lkZSBtZXRob2RzIGJlbG93Ci0KLSAgZGVmIFJlc2V0KHNlbGYpOgotICAgICIiIlJlc2V0cyB0aGUgUnBjQ29udHJvbGxlciB0byBpdHMgaW5pdGlhbCBzdGF0ZS4KLQotICAgIEFmdGVyIHRoZSBScGNDb250cm9sbGVyIGhhcyBiZWVuIHJlc2V0LCBpdCBtYXkgYmUgcmV1c2VkIGluCi0gICAgYSBuZXcgY2FsbC4gTXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIGFuIFJQQyBpcyBpbiBwcm9ncmVzcy4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIEZhaWxlZChzZWxmKToKLSAgICAiIiJSZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZmFpbGVkLgotCi0gICAgQWZ0ZXIgYSBjYWxsIGhhcyBmaW5pc2hlZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZhaWxlZC4gIFRoZSBwb3NzaWJsZQotICAgIHJlYXNvbnMgZm9yIGZhaWx1cmUgZGVwZW5kIG9uIHRoZSBSUEMgaW1wbGVtZW50YXRpb24uICBGYWlsZWQoKSBtdXN0IG5vdAotICAgIGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIGhhcyBmaW5pc2hlZC4gIElmIEZhaWxlZCgpIHJldHVybnMgdHJ1ZSwgdGhlCi0gICAgY29udGVudHMgb2YgdGhlIHJlc3BvbnNlIG1lc3NhZ2UgYXJlIHVuZGVmaW5lZC4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIEVycm9yVGV4dChzZWxmKToKLSAgICAiIiJJZiBGYWlsZWQgaXMgdHJ1ZSwgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIFN0YXJ0Q2FuY2VsKHNlbGYpOgotICAgICIiIkluaXRpYXRlIGNhbmNlbGxhdGlvbi4KLQotICAgIEFkdmlzZXMgdGhlIFJQQyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGRlc2lyZXMgdGhhdCB0aGUgUlBDIGNhbGwgYmUKLSAgICBjYW5jZWxlZC4gIFRoZSBSUEMgc3lzdGVtIG1heSBjYW5jZWwgaXQgaW1tZWRpYXRlbHksIG1heSB3YWl0IGF3aGlsZSBhbmQKLSAgICB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuICBJZiB0aGUgY2FsbCBpcwotICAgIGNhbmNlbGVkLCB0aGUgImRvbmUiIGNhbGxiYWNrIHdpbGwgc3RpbGwgYmUgY2FsbGVkIGFuZCB0aGUgUnBjQ29udHJvbGxlcgotICAgIHdpbGwgaW5kaWNhdGUgdGhhdCB0aGUgY2FsbCBmYWlsZWQgYXQgdGhhdCB0aW1lLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICAjIFNlcnZlci1zaWRlIG1ldGhvZHMgYmVsb3cKLQotICBkZWYgU2V0RmFpbGVkKHNlbGYsIHJlYXNvbik6Ci0gICAgIiIiU2V0cyBhIGZhaWx1cmUgcmVhc29uLgotCi0gICAgQ2F1c2VzIEZhaWxlZCgpIHRvIHJldHVybiB0cnVlIG9uIHRoZSBjbGllbnQgc2lkZS4gICJyZWFzb24iIHdpbGwgYmUKLSAgICBpbmNvcnBvcmF0ZWQgaW50byB0aGUgbWVzc2FnZSByZXR1cm5lZCBieSBFcnJvclRleHQoKS4gIElmIHlvdSBmaW5kCi0gICAgeW91IG5lZWQgdG8gcmV0dXJuIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMsIHlvdQotICAgIHNob3VsZCBpbmNvcnBvcmF0ZSBpdCBpbnRvIHlvdXIgcmVzcG9uc2UgcHJvdG9jb2wgYnVmZmVyIGFuZCBzaG91bGQKLSAgICBOT1QgY2FsbCBTZXRGYWlsZWQoKS4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIElzQ2FuY2VsZWQoc2VsZik6Ci0gICAgIiIiQ2hlY2tzIGlmIHRoZSBjbGllbnQgY2FuY2VsbGVkIHRoZSBSUEMuCi0KLSAgICBJZiB0cnVlLCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50IGNhbmNlbGVkIHRoZSBSUEMsIHNvIHRoZSBzZXJ2ZXIgbWF5Ci0gICAgYXMgd2VsbCBnaXZlIHVwIG9uIHJlcGx5aW5nIHRvIGl0LiAgVGhlIHNlcnZlciBzaG91bGQgc3RpbGwgY2FsbCB0aGUKLSAgICBmaW5hbCAiZG9uZSIgY2FsbGJhY2suCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBOb3RpZnlPbkNhbmNlbChzZWxmLCBjYWxsYmFjayk6Ci0gICAgIiIiU2V0cyBhIGNhbGxiYWNrIHRvIGludm9rZSBvbiBjYW5jZWwuCi0KLSAgICBBc2tzIHRoYXQgdGhlIGdpdmVuIGNhbGxiYWNrIGJlIGNhbGxlZCB3aGVuIHRoZSBSUEMgaXMgY2FuY2VsZWQuICBUaGUKLSAgICBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLiAgSWYgdGhlIFJQQyBjb21wbGV0ZXMgd2l0aG91dAotICAgIGJlaW5nIGNhbmNlbGVkLCB0aGUgY2FsbGJhY2sgd2lsbCBiZSBjYWxsZWQgYWZ0ZXIgY29tcGxldGlvbi4gIElmIHRoZSBSUEMKLSAgICBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkIHdoZW4gTm90aWZ5T25DYW5jZWwoKSBpcyBjYWxsZWQsIHRoZSBjYWxsYmFjawotICAgIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5LgotCi0gICAgTm90aWZ5T25DYW5jZWwoKSBtdXN0IGJlIGNhbGxlZCBubyBtb3JlIHRoYW4gb25jZSBwZXIgcmVxdWVzdC4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLQotY2xhc3MgUnBjQ2hhbm5lbChvYmplY3QpOgotCi0gICIiIkFic3RyYWN0IGludGVyZmFjZSBmb3IgYW4gUlBDIGNoYW5uZWwuCi0KLSAgQW4gUnBjQ2hhbm5lbCByZXByZXNlbnRzIGEgY29tbXVuaWNhdGlvbiBsaW5lIHRvIGEgc2VydmljZSB3aGljaCBjYW4gYmUgdXNlZAotICB0byBjYWxsIHRoYXQgc2VydmljZSdzIG1ldGhvZHMuICBUaGUgc2VydmljZSBtYXkgYmUgcnVubmluZyBvbiBhbm90aGVyCi0gIG1hY2hpbmUuIE5vcm1hbGx5LCB5b3Ugc2hvdWxkIG5vdCB1c2UgYW4gUnBjQ2hhbm5lbCBkaXJlY3RseSwgYnV0IGluc3RlYWQKLSAgY29uc3RydWN0IGEgc3R1YiB7QGxpbmsgU2VydmljZX0gd3JhcHBpbmcgaXQuICBFeGFtcGxlOgotCi0gIEV4YW1wbGU6Ci0gICAgUnBjQ2hhbm5lbCBjaGFubmVsID0gcnBjSW1wbC5DaGFubmVsKCJyZW1vdGVob3N0LmV4YW1wbGUuY29tOjEyMzQiKQotICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IHJwY0ltcGwuQ29udHJvbGxlcigpCi0gICAgTXlTZXJ2aWNlIHNlcnZpY2UgPSBNeVNlcnZpY2VfU3R1YihjaGFubmVsKQotICAgIHNlcnZpY2UuTXlNZXRob2QoY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spCi0gICIiIgotCi0gIGRlZiBDYWxsTWV0aG9kKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yLCBycGNfY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgcmVxdWVzdCwgcmVzcG9uc2VfY2xhc3MsIGRvbmUpOgotICAgICIiIkNhbGxzIHRoZSBtZXRob2QgaWRlbnRpZmllZCBieSB0aGUgZGVzY3JpcHRvci4KLQotICAgIENhbGwgdGhlIGdpdmVuIG1ldGhvZCBvZiB0aGUgcmVtb3RlIHNlcnZpY2UuICBUaGUgc2lnbmF0dXJlIG9mIHRoaXMKLSAgICBwcm9jZWR1cmUgbG9va3MgdGhlIHNhbWUgYXMgU2VydmljZS5DYWxsTWV0aG9kKCksIGJ1dCB0aGUgcmVxdWlyZW1lbnRzCi0gICAgYXJlIGxlc3Mgc3RyaWN0IGluIG9uZSBpbXBvcnRhbnQgd2F5OiAgdGhlIHJlcXVlc3Qgb2JqZWN0IGRvZXNuJ3QgaGF2ZSB0bwotICAgIGJlIG9mIGFueSBzcGVjaWZpYyBjbGFzcyBhcyBsb25nIGFzIGl0cyBkZXNjcmlwdG9yIGlzIG1ldGhvZC5pbnB1dF90eXBlLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlX3JlZmxlY3Rpb24ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDFjMzYzNmEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlX3JlZmxlY3Rpb24ucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyODQgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJDb250YWlucyBtZXRhY2xhc3NlcyB1c2VkIHRvIGNyZWF0ZSBwcm90b2NvbCBzZXJ2aWNlIGFuZCBzZXJ2aWNlIHN0dWIKLWNsYXNzZXMgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvciBvYmplY3RzIGF0IHJ1bnRpbWUuCi0KLVRoZSBHZW5lcmF0ZWRTZXJ2aWNlVHlwZSBhbmQgR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlIG1ldGFjbGFzc2VzIGFyZSB1c2VkIHRvCi1pbmplY3QgYWxsIHVzZWZ1bCBmdW5jdGlvbmFsaXR5IGludG8gdGhlIGNsYXNzZXMgb3V0cHV0IGJ5IHRoZSBwcm90b2NvbAotY29tcGlsZXIgYXQgY29tcGlsZS10aW1lLgotIiIiCi0KLV9fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKLQotCi1jbGFzcyBHZW5lcmF0ZWRTZXJ2aWNlVHlwZSh0eXBlKToKLQotICAiIiJNZXRhY2xhc3MgZm9yIHNlcnZpY2UgY2xhc3NlcyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvcnMuCi0KLSAgSW1wbGVtZW50YXRpb25zIGZvciBhbGwgbWV0aG9kcyBkZXNjcmliZWQgaW4gdGhlIFNlcnZpY2UgY2xhc3MgYXJlIGFkZGVkIGhlcmUKLSAgYnkgdGhpcyBjbGFzcy4gV2UgYWxzbyBjcmVhdGUgcHJvcGVydGllcyB0byBhbGxvdyBnZXR0aW5nL3NldHRpbmcgYWxsIGZpZWxkcwotICBpbiB0aGUgcHJvdG9jb2wgbWVzc2FnZS4KLQotICBUaGUgcHJvdG9jb2wgY29tcGlsZXIgY3VycmVudGx5IHVzZXMgdGhpcyBtZXRhY2xhc3MgdG8gY3JlYXRlIHByb3RvY29sIHNlcnZpY2UKLSAgY2xhc3NlcyBhdCBydW50aW1lLiBDbGllbnRzIGNhbiBhbHNvIG1hbnVhbGx5IGNyZWF0ZSB0aGVpciBvd24gY2xhc3NlcyBhdAotICBydW50aW1lLCBhcyBpbiB0aGlzIGV4YW1wbGU6Ci0KLSAgbXlkZXNjcmlwdG9yID0gU2VydmljZURlc2NyaXB0b3IoLi4uLi4pCi0gIGNsYXNzIE15UHJvdG9TZXJ2aWNlKHNlcnZpY2UuU2VydmljZSk6Ci0gICAgX19tZXRhY2xhc3NfXyA9IEdlbmVyYXRlZFNlcnZpY2VUeXBlCi0gICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgotICBteXNlcnZpY2VfaW5zdGFuY2UgPSBNeVByb3RvU2VydmljZSgpCi0gIC4uLgotICAiIiIKLQotICBfREVTQ1JJUFRPUl9LRVkgPSAnREVTQ1JJUFRPUicKLQotICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6Ci0gICAgIiIiQ3JlYXRlcyBhIG1lc3NhZ2Ugc2VydmljZSBjbGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZSBtZXRhY2xhc3MKLSAgICAgICAgcHJvdG9jb2wpLgotICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCi0gICAgICBkaWN0aW9uYXJ5OiBUaGUgY2xhc3MgZGljdGlvbmFyeSBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCi0gICAgICAgIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4gYSBTZXJ2aWNlRGVzY3JpcHRvciBvYmplY3QKLSAgICAgICAgZGVzY3JpYmluZyB0aGlzIHByb3RvY29sIHNlcnZpY2UgdHlwZS4KLSAgICAiIiIKLSAgICAjIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGEgZGVzY3JpcHRvci4gVGhpcyBoYXBwZW5zCi0gICAgIyB3aGVuIGEgc2VydmljZSBjbGFzcyBpcyBzdWJjbGFzc2VkLgotICAgIGlmIEdlbmVyYXRlZFNlcnZpY2VUeXBlLl9ERVNDUklQVE9SX0tFWSBub3QgaW4gZGljdGlvbmFyeToKLSAgICAgIHJldHVybgotICAgIGRlc2NyaXB0b3IgPSBkaWN0aW9uYXJ5W0dlbmVyYXRlZFNlcnZpY2VUeXBlLl9ERVNDUklQVE9SX0tFWV0KLSAgICBzZXJ2aWNlX2J1aWxkZXIgPSBfU2VydmljZUJ1aWxkZXIoZGVzY3JpcHRvcikKLSAgICBzZXJ2aWNlX2J1aWxkZXIuQnVpbGRTZXJ2aWNlKGNscykKLQotCi1jbGFzcyBHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUoR2VuZXJhdGVkU2VydmljZVR5cGUpOgotCi0gICIiIk1ldGFjbGFzcyBmb3Igc2VydmljZSBzdHVicyBjcmVhdGVkIGF0IHJ1bnRpbWUgZnJvbSBTZXJ2aWNlRGVzY3JpcHRvcnMuCi0KLSAgVGhpcyBjbGFzcyBoYXMgc2ltaWxhciByZXNwb25zaWJpbGl0aWVzIGFzIEdlbmVyYXRlZFNlcnZpY2VUeXBlLCBleGNlcHQgdGhhdAotICBpdCBjcmVhdGVzIHRoZSBzZXJ2aWNlIHN0dWIgY2xhc3Nlcy4KLSAgIiIiCi0KLSAgX0RFU0NSSVBUT1JfS0VZID0gJ0RFU0NSSVBUT1InCi0KLSAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgotICAgICIiIkNyZWF0ZXMgYSBtZXNzYWdlIHNlcnZpY2Ugc3R1YiBjbGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgaGVyZSkuCi0gICAgICBiYXNlczogQmFzZSBjbGFzc2VzIG9mIHRoZSBjbGFzcyBiZWluZyBjb25zdHJ1Y3RlZC4KLSAgICAgIGRpY3Rpb25hcnk6IFRoZSBjbGFzcyBkaWN0aW9uYXJ5IG9mIHRoZSBjbGFzcyBiZWluZyBjb25zdHJ1Y3RlZC4KLSAgICAgICAgZGljdGlvbmFyeVtfREVTQ1JJUFRPUl9LRVldIG11c3QgY29udGFpbiBhIFNlcnZpY2VEZXNjcmlwdG9yIG9iamVjdAotICAgICAgICBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgc2VydmljZSB0eXBlLgotICAgICIiIgotICAgIHN1cGVyKEdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZSwgY2xzKS5fX2luaXRfXyhuYW1lLCBiYXNlcywgZGljdGlvbmFyeSkKLSAgICAjIERvbid0IGRvIGFueXRoaW5nIGlmIHRoaXMgY2xhc3MgZG9lc24ndCBoYXZlIGEgZGVzY3JpcHRvci4gVGhpcyBoYXBwZW5zCi0gICAgIyB3aGVuIGEgc2VydmljZSBzdHViIGlzIHN1YmNsYXNzZWQuCi0gICAgaWYgR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlLl9ERVNDUklQVE9SX0tFWSBub3QgaW4gZGljdGlvbmFyeToKLSAgICAgIHJldHVybgotICAgIGRlc2NyaXB0b3IgPSBkaWN0aW9uYXJ5W0dlbmVyYXRlZFNlcnZpY2VTdHViVHlwZS5fREVTQ1JJUFRPUl9LRVldCi0gICAgc2VydmljZV9zdHViX2J1aWxkZXIgPSBfU2VydmljZVN0dWJCdWlsZGVyKGRlc2NyaXB0b3IpCi0gICAgc2VydmljZV9zdHViX2J1aWxkZXIuQnVpbGRTZXJ2aWNlU3R1YihjbHMpCi0KLQotY2xhc3MgX1NlcnZpY2VCdWlsZGVyKG9iamVjdCk6Ci0KLSAgIiIiVGhpcyBjbGFzcyBjb25zdHJ1Y3RzIGEgcHJvdG9jb2wgc2VydmljZSBjbGFzcyB1c2luZyBhIHNlcnZpY2UgZGVzY3JpcHRvci4KLQotICBHaXZlbiBhIHNlcnZpY2UgZGVzY3JpcHRvciwgdGhpcyBjbGFzcyBjb25zdHJ1Y3RzIGEgY2xhc3MgdGhhdCByZXByZXNlbnRzCi0gIHRoZSBzcGVjaWZpZWQgc2VydmljZSBkZXNjcmlwdG9yLiBPbmUgc2VydmljZSBidWlsZGVyIGluc3RhbmNlIGNvbnN0cnVjdHMKLSAgZXhhY3RseSBvbmUgc2VydmljZSBjbGFzcy4gVGhhdCBtZWFucyBhbGwgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3Mgc2hhcmUgdGhlCi0gIHNhbWUgYnVpbGRlci4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZpY2VfZGVzY3JpcHRvcik6Ci0gICAgIiIiSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2UgY2xhc3MgYnVpbGRlci4KLQotICAgIEFyZ3M6Ci0gICAgICBzZXJ2aWNlX2Rlc2NyaXB0b3I6IFNlcnZpY2VEZXNjcmlwdG9yIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgICAgICAgc2VydmljZSBjbGFzcy4KLSAgICAiIiIKLSAgICBzZWxmLmRlc2NyaXB0b3IgPSBzZXJ2aWNlX2Rlc2NyaXB0b3IKLQotICBkZWYgQnVpbGRTZXJ2aWNlKHNlbGYsIGNscyk6Ci0gICAgIiIiQ29uc3RydWN0cyB0aGUgc2VydmljZSBjbGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBjbHM6IFRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQuCi0gICAgIiIiCi0KLSAgICAjIENhbGxNZXRob2QgbmVlZHMgdG8gb3BlcmF0ZSB3aXRoIGFuIGluc3RhbmNlIG9mIHRoZSBTZXJ2aWNlIGNsYXNzLiBUaGlzCi0gICAgIyBpbnRlcm5hbCB3cmFwcGVyIGZ1bmN0aW9uIGV4aXN0cyBvbmx5IHRvIGJlIGFibGUgdG8gcGFzcyB0aGUgc2VydmljZQotICAgICMgaW5zdGFuY2UgdG8gdGhlIG1ldGhvZCB0aGF0IGRvZXMgdGhlIHJlYWwgQ2FsbE1ldGhvZCB3b3JrLgotICAgIGRlZiBfV3JhcENhbGxNZXRob2Qoc3J2YywgbWV0aG9kX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOgotICAgICAgcmV0dXJuIHNlbGYuX0NhbGxNZXRob2Qoc3J2YywgbWV0aG9kX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaykKLSAgICBzZWxmLmNscyA9IGNscwotICAgIGNscy5DYWxsTWV0aG9kID0gX1dyYXBDYWxsTWV0aG9kCi0gICAgY2xzLkdldERlc2NyaXB0b3IgPSBzdGF0aWNtZXRob2QobGFtYmRhOiBzZWxmLmRlc2NyaXB0b3IpCi0gICAgY2xzLkdldERlc2NyaXB0b3IuX19kb2NfXyA9ICJSZXR1cm5zIHRoZSBzZXJ2aWNlIGRlc2NyaXB0b3IuIgotICAgIGNscy5HZXRSZXF1ZXN0Q2xhc3MgPSBzZWxmLl9HZXRSZXF1ZXN0Q2xhc3MKLSAgICBjbHMuR2V0UmVzcG9uc2VDbGFzcyA9IHNlbGYuX0dldFJlc3BvbnNlQ2xhc3MKLSAgICBmb3IgbWV0aG9kIGluIHNlbGYuZGVzY3JpcHRvci5tZXRob2RzOgotICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZC5uYW1lLCBzZWxmLl9HZW5lcmF0ZU5vbkltcGxlbWVudGVkTWV0aG9kKG1ldGhvZCkpCi0KLSAgZGVmIF9DYWxsTWV0aG9kKHNlbGYsIHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKToKLSAgICAiIiJDYWxscyB0aGUgbWV0aG9kIGRlc2NyaWJlZCBieSBhIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yLgotCi0gICAgQXJnczoKLSAgICAgIHNydmM6IEluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGZvciB3aGljaCB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciB0aGF0IHJlcHJlc2VudCB0aGUgbWV0aG9kIHRvIGNhbGwuCi0gICAgICBycGNfY29udHJvbGxlcjogUlBDIGNvbnRyb2xsZXIgdG8gdXNlIGZvciB0aGlzIG1ldGhvZCdzIGV4ZWN1dGlvbi4KLSAgICAgIHJlcXVlc3Q6IFJlcXVlc3QgcHJvdG9jb2wgbWVzc2FnZS4KLSAgICAgIGNhbGxiYWNrOiBBIGNhbGxiYWNrIHRvIGludm9rZSBhZnRlciB0aGUgbWV0aG9kIGhhcyBjb21wbGV0ZWQuCi0gICAgIiIiCi0gICAgaWYgbWV0aG9kX2Rlc2NyaXB0b3IuY29udGFpbmluZ19zZXJ2aWNlICE9IHNlbGYuZGVzY3JpcHRvcjoKLSAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcigKLSAgICAgICAgICAnQ2FsbE1ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuJykKLSAgICBtZXRob2QgPSBnZXRhdHRyKHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLm5hbWUpCi0gICAgcmV0dXJuIG1ldGhvZChycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spCi0KLSAgZGVmIF9HZXRSZXF1ZXN0Q2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgotICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UuCi0KLSAgICBBcmdzOgotICAgICAgbWV0aG9kX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3Igb2YgdGhlIG1ldGhvZCBmb3Igd2hpY2ggdG8gcmV0dXJuIHRoZQotICAgICAgICByZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIGlucHV0IHByb3RvY29sIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZAotICAgICAgbWV0aG9kLgotICAgICIiIgotICAgIGlmIG1ldGhvZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfc2VydmljZSAhPSBzZWxmLmRlc2NyaXB0b3I6Ci0gICAgICByYWlzZSBSdW50aW1lRXJyb3IoCi0gICAgICAgICAgJ0dldFJlcXVlc3RDbGFzcygpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuJykKLSAgICByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3IuaW5wdXRfdHlwZS5fY29uY3JldGVfY2xhc3MKLQotICBkZWYgX0dldFJlc3BvbnNlQ2xhc3Moc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IpOgotICAgICIiIlJldHVybnMgdGhlIGNsYXNzIG9mIHRoZSByZXNwb25zZSBwcm90b2NvbCBtZXNzYWdlLgotCi0gICAgQXJnczoKLSAgICAgIG1ldGhvZF9kZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUKLSAgICAgICAgcmVzcG9uc2UgcHJvdG9jb2wgbWVzc2FnZSBjbGFzcy4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIGNsYXNzIHRoYXQgcmVwcmVzZW50cyB0aGUgb3V0cHV0IHByb3RvY29sIG1lc3NhZ2Ugb2YgdGhlIHNwZWNpZmllZAotICAgICAgbWV0aG9kLgotICAgICIiIgotICAgIGlmIG1ldGhvZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfc2VydmljZSAhPSBzZWxmLmRlc2NyaXB0b3I6Ci0gICAgICByYWlzZSBSdW50aW1lRXJyb3IoCi0gICAgICAgICAgJ0dldFJlc3BvbnNlQ2xhc3MoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3Jvbmcgc2VydmljZSB0eXBlLicpCi0gICAgcmV0dXJuIG1ldGhvZF9kZXNjcmlwdG9yLm91dHB1dF90eXBlLl9jb25jcmV0ZV9jbGFzcwotCi0gIGRlZiBfR2VuZXJhdGVOb25JbXBsZW1lbnRlZE1ldGhvZChzZWxmLCBtZXRob2QpOgotICAgICIiIkdlbmVyYXRlcyBhbmQgcmV0dXJucyBhIG1ldGhvZCB0aGF0IGNhbiBiZSBzZXQgZm9yIGEgc2VydmljZSBtZXRob2RzLgotCi0gICAgQXJnczoKLSAgICAgIG1ldGhvZDogRGVzY3JpcHRvciBvZiB0aGUgc2VydmljZSBtZXRob2QgZm9yIHdoaWNoIGEgbWV0aG9kIGlzIHRvIGJlCi0gICAgICAgIGdlbmVyYXRlZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIG1ldGhvZCB0aGF0IGNhbiBiZSBhZGRlZCB0byB0aGUgc2VydmljZSBjbGFzcy4KLSAgICAiIiIKLSAgICByZXR1cm4gbGFtYmRhIGluc3QsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjazogKAotICAgICAgICBzZWxmLl9Ob25JbXBsZW1lbnRlZE1ldGhvZChtZXRob2QubmFtZSwgcnBjX2NvbnRyb2xsZXIsIGNhbGxiYWNrKSkKLQotICBkZWYgX05vbkltcGxlbWVudGVkTWV0aG9kKHNlbGYsIG1ldGhvZF9uYW1lLCBycGNfY29udHJvbGxlciwgY2FsbGJhY2spOgotICAgICIiIlRoZSBib2R5IG9mIGFsbCBtZXRob2RzIGluIHRoZSBnZW5lcmF0ZWQgc2VydmljZSBjbGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBtZXRob2RfbmFtZTogTmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGV4ZWN1dGVkLgotICAgICAgcnBjX2NvbnRyb2xsZXI6IFJQQyBjb250cm9sbGVyIHVzZWQgdG8gZXhlY3V0ZSB0aGlzIG1ldGhvZC4KLSAgICAgIGNhbGxiYWNrOiBBIGNhbGxiYWNrIHdoaWNoIHdpbGwgYmUgaW52b2tlZCB3aGVuIHRoZSBtZXRob2QgZmluaXNoZXMuCi0gICAgIiIiCi0gICAgcnBjX2NvbnRyb2xsZXIuU2V0RmFpbGVkKCdNZXRob2QgJXMgbm90IGltcGxlbWVudGVkLicgJSBtZXRob2RfbmFtZSkKLSAgICBjYWxsYmFjayhOb25lKQotCi0KLWNsYXNzIF9TZXJ2aWNlU3R1YkJ1aWxkZXIob2JqZWN0KToKLQotICAiIiJDb25zdHJ1Y3RzIGEgcHJvdG9jb2wgc2VydmljZSBzdHViIGNsYXNzIHVzaW5nIGEgc2VydmljZSBkZXNjcmlwdG9yLgotCi0gIEdpdmVuIGEgc2VydmljZSBkZXNjcmlwdG9yLCB0aGlzIGNsYXNzIGNvbnN0cnVjdHMgYSBzdWl0YWJsZSBzdHViIGNsYXNzLgotICBBIHN0dWIgaXMganVzdCBhIHR5cGUtc2FmZSB3cmFwcGVyIGFyb3VuZCBhbiBScGNDaGFubmVsIHdoaWNoIGVtdWxhdGVzIGEKLSAgbG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCi0KLSAgT25lIHNlcnZpY2Ugc3R1YiBidWlsZGVyIGluc3RhbmNlIGNvbnN0cnVjdHMgZXhhY3RseSBvbmUgY2xhc3MuIEl0IG1lYW5zIGFsbAotICBpbnN0YW5jZXMgb2YgdGhhdCBjbGFzcyBzaGFyZSB0aGUgc2FtZSBzZXJ2aWNlIHN0dWIgYnVpbGRlci4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHNlcnZpY2VfZGVzY3JpcHRvcik6Ci0gICAgIiIiSW5pdGlhbGl6ZXMgYW4gaW5zdGFuY2Ugb2YgdGhlIHNlcnZpY2Ugc3R1YiBjbGFzcyBidWlsZGVyLgotCi0gICAgQXJnczoKLSAgICAgIHNlcnZpY2VfZGVzY3JpcHRvcjogU2VydmljZURlc2NyaXB0b3IgdG8gdXNlIHdoZW4gY29uc3RydWN0aW5nIHRoZQotICAgICAgICBzdHViIGNsYXNzLgotICAgICIiIgotICAgIHNlbGYuZGVzY3JpcHRvciA9IHNlcnZpY2VfZGVzY3JpcHRvcgotCi0gIGRlZiBCdWlsZFNlcnZpY2VTdHViKHNlbGYsIGNscyk6Ci0gICAgIiIiQ29uc3RydWN0cyB0aGUgc3R1YiBjbGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBjbHM6IFRoZSBjbGFzcyB0aGF0IHdpbGwgYmUgY29uc3RydWN0ZWQuCi0gICAgIiIiCi0KLSAgICBkZWYgX1NlcnZpY2VTdHViSW5pdChzdHViLCBycGNfY2hhbm5lbCk6Ci0gICAgICBzdHViLnJwY19jaGFubmVsID0gcnBjX2NoYW5uZWwKLSAgICBzZWxmLmNscyA9IGNscwotICAgIGNscy5fX2luaXRfXyA9IF9TZXJ2aWNlU3R1YkluaXQKLSAgICBmb3IgbWV0aG9kIGluIHNlbGYuZGVzY3JpcHRvci5tZXRob2RzOgotICAgICAgc2V0YXR0cihjbHMsIG1ldGhvZC5uYW1lLCBzZWxmLl9HZW5lcmF0ZVN0dWJNZXRob2QobWV0aG9kKSkKLQotICBkZWYgX0dlbmVyYXRlU3R1Yk1ldGhvZChzZWxmLCBtZXRob2QpOgotICAgIHJldHVybiAobGFtYmRhIGluc3QsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaz1Ob25lOgotICAgICAgICBzZWxmLl9TdHViTWV0aG9kKGluc3QsIG1ldGhvZCwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKSkKLQotICBkZWYgX1N0dWJNZXRob2Qoc2VsZiwgc3R1YiwgbWV0aG9kX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spOgotICAgICIiIlRoZSBib2R5IG9mIGFsbCBzZXJ2aWNlIG1ldGhvZHMgaW4gdGhlIGdlbmVyYXRlZCBzdHViIGNsYXNzLgotCi0gICAgQXJnczoKLSAgICAgIHN0dWI6IFN0dWIgaW5zdGFuY2UuCi0gICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciBvZiB0aGUgaW52b2tlZCBtZXRob2QuCi0gICAgICBycGNfY29udHJvbGxlcjogUnBjIGNvbnRyb2xsZXIgdG8gZXhlY3V0ZSB0aGUgbWV0aG9kLgotICAgICAgcmVxdWVzdDogUmVxdWVzdCBwcm90b2NvbCBtZXNzYWdlLgotICAgICAgY2FsbGJhY2s6IEEgY2FsbGJhY2sgdG8gZXhlY3V0ZSB3aGVuIHRoZSBtZXRob2QgZmluaXNoZXMuCi0gICAgUmV0dXJuczoKLSAgICAgIFJlc3BvbnNlIG1lc3NhZ2UgKGluIGNhc2Ugb2YgYmxvY2tpbmcgY2FsbCkuCi0gICAgIiIiCi0gICAgcmV0dXJuIHN0dWIucnBjX2NoYW5uZWwuQ2FsbE1ldGhvZCgKLSAgICAgICAgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LAotICAgICAgICBtZXRob2RfZGVzY3JpcHRvci5vdXRwdXRfdHlwZS5fY29uY3JldGVfY2xhc3MsIGNhbGxiYWNrKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zeW1ib2xfZGF0YWJhc2UucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3N5bWJvbF9kYXRhYmFzZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc3NjBmMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3N5bWJvbF9kYXRhYmFzZS5weQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkEgZGF0YWJhc2Ugb2YgUHl0aG9uIHByb3RvY29sIGJ1ZmZlciBnZW5lcmF0ZWQgc3ltYm9scy4KLQotU3ltYm9sRGF0YWJhc2UgbWFrZXMgaXQgZWFzeSB0byBjcmVhdGUgbmV3IGluc3RhbmNlcyBvZiBhIHJlZ2lzdGVyZWQgdHlwZSwgZ2l2ZW4KLW9ubHkgdGhlIHR5cGUncyBwcm90b2NvbCBidWZmZXIgc3ltYm9sIG5hbWUuIE9uY2UgYWxsIHN5bWJvbHMgYXJlIHJlZ2lzdGVyZWQsCi10aGV5IGNhbiBiZSBhY2Nlc3NlZCB1c2luZyBlaXRoZXIgdGhlIE1lc3NhZ2VGYWN0b3J5IGludGVyZmFjZSB3aGljaAotU3ltYm9sRGF0YWJhc2UgZXhwb3Nlcywgb3IgdGhlIERlc2NyaXB0b3JQb29sIGludGVyZmFjZSBvZiB0aGUgdW5kZXJseWluZwotcG9vbC4KLQotRXhhbXBsZSB1c2FnZToKLQotICBkYiA9IHN5bWJvbF9kYXRhYmFzZS5TeW1ib2xEYXRhYmFzZSgpCi0KLSAgIyBSZWdpc3RlciBzeW1ib2xzIG9mIGludGVyZXN0LCBmcm9tIG9uZSBvciBtdWx0aXBsZSBmaWxlcy4KLSAgZGIuUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihteV9wcm90b19wYjIuREVTQ1JJUFRPUikKLSAgZGIuUmVnaXN0ZXJNZXNzYWdlKG15X3Byb3RvX3BiMi5NeU1lc3NhZ2UpCi0gIGRiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IobXlfcHJvdG9fcGIyLk15RW51bS5ERVNDUklQVE9SKQotCi0gICMgVGhlIGRhdGFiYXNlIGNhbiBiZSB1c2VkIGFzIGEgTWVzc2FnZUZhY3RvcnksIHRvIGdlbmVyYXRlIHR5cGVzIGJhc2VkIG9uCi0gICMgdGhlaXIgbmFtZToKLSAgdHlwZXMgPSBkYi5HZXRNZXNzYWdlcyhbJ215X3Byb3RvLnByb3RvJ10pCi0gIG15X21lc3NhZ2VfaW5zdGFuY2UgPSB0eXBlc1snTXlNZXNzYWdlJ10oKQotCi0gICMgVGhlIGRhdGFiYXNlJ3MgdW5kZXJseWluZyBkZXNjcmlwdG9yIHBvb2wgY2FuIGJlIHF1ZXJpZWQsIHNvIGl0J3Mgbm90Ci0gICMgbmVjZXNzYXJ5IHRvIGtub3cgYSB0eXBlJ3MgZmlsZW5hbWUgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBpdDoKLSAgZmlsZW5hbWUgPSBkYi5wb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgnTXlNZXNzYWdlJykKLSAgbXlfbWVzc2FnZV9pbnN0YW5jZSA9IGRiLkdldE1lc3NhZ2VzKFtmaWxlbmFtZV0pWydNeU1lc3NhZ2UnXSgpCi0KLSAgIyBUaGlzIGZ1bmN0aW9uYWxpdHkgaXMgYWxzbyBwcm92aWRlZCBkaXJlY3RseSB2aWEgYSBjb252ZW5pZW5jZSBtZXRob2Q6Ci0gIG15X21lc3NhZ2VfaW5zdGFuY2UgPSBkYi5HZXRTeW1ib2woJ015TWVzc2FnZScpKCkKLSIiIgotCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yX3Bvb2wKLQotCi1jbGFzcyBTeW1ib2xEYXRhYmFzZShvYmplY3QpOgotICAiIiJBIGRhdGFiYXNlIG9mIFB5dGhvbiBnZW5lcmF0ZWQgc3ltYm9scy4KLQotICBTeW1ib2xEYXRhYmFzZSBhbHNvIG1vZGVscyBtZXNzYWdlX2ZhY3RvcnkuTWVzc2FnZUZhY3RvcnkuCi0KLSAgVGhlIHN5bWJvbCBkYXRhYmFzZSBjYW4gYmUgdXNlZCB0byBrZWVwIGEgZ2xvYmFsIHJlZ2lzdHJ5IG9mIGFsbCBwcm90b2NvbAotICBidWZmZXIgdHlwZXMgdXNlZCB3aXRoaW4gYSBwcm9ncmFtLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgcG9vbD1Ob25lKToKLSAgICAiIiJDb25zdHJ1Y3Rvci4iIiIKLQotICAgIHNlbGYuX3N5bWJvbHMgPSB7fQotICAgIHNlbGYuX3N5bWJvbHNfYnlfZmlsZSA9IHt9Ci0gICAgc2VsZi5wb29sID0gcG9vbCBvciBkZXNjcmlwdG9yX3Bvb2wuRGVmYXVsdCgpCi0KLSAgZGVmIFJlZ2lzdGVyTWVzc2FnZShzZWxmLCBtZXNzYWdlKToKLSAgICAiIiJSZWdpc3RlcnMgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZSBpbiB0aGUgbG9jYWwgZGF0YWJhc2UuCi0KLSAgICBBcmdzOgotICAgICAgbWVzc2FnZTogYSBtZXNzYWdlLk1lc3NhZ2UsIHRvIGJlIHJlZ2lzdGVyZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIHByb3ZpZGVkIG1lc3NhZ2UuCi0gICAgIiIiCi0KLSAgICBkZXNjID0gbWVzc2FnZS5ERVNDUklQVE9SCi0gICAgc2VsZi5fc3ltYm9sc1tkZXNjLmZ1bGxfbmFtZV0gPSBtZXNzYWdlCi0gICAgaWYgZGVzYy5maWxlLm5hbWUgbm90IGluIHNlbGYuX3N5bWJvbHNfYnlfZmlsZToKLSAgICAgIHNlbGYuX3N5bWJvbHNfYnlfZmlsZVtkZXNjLmZpbGUubmFtZV0gPSB7fQotICAgIHNlbGYuX3N5bWJvbHNfYnlfZmlsZVtkZXNjLmZpbGUubmFtZV1bZGVzYy5mdWxsX25hbWVdID0gbWVzc2FnZQotICAgIHNlbGYucG9vbC5BZGREZXNjcmlwdG9yKGRlc2MpCi0gICAgcmV0dXJuIG1lc3NhZ2UKLQotICBkZWYgUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcihzZWxmLCBlbnVtX2Rlc2NyaXB0b3IpOgotICAgICIiIlJlZ2lzdGVycyB0aGUgZ2l2ZW4gZW51bSBkZXNjcmlwdG9yIGluIHRoZSBsb2NhbCBkYXRhYmFzZS4KLQotICAgIEFyZ3M6Ci0gICAgICBlbnVtX2Rlc2NyaXB0b3I6IGEgZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgcHJvdmlkZWQgZGVzY3JpcHRvci4KLSAgICAiIiIKLSAgICBzZWxmLnBvb2wuQWRkRW51bURlc2NyaXB0b3IoZW51bV9kZXNjcmlwdG9yKQotICAgIHJldHVybiBlbnVtX2Rlc2NyaXB0b3IKLQotICBkZWYgUmVnaXN0ZXJGaWxlRGVzY3JpcHRvcihzZWxmLCBmaWxlX2Rlc2NyaXB0b3IpOgotICAgICIiIlJlZ2lzdGVycyB0aGUgZ2l2ZW4gZmlsZSBkZXNjcmlwdG9yIGluIHRoZSBsb2NhbCBkYXRhYmFzZS4KLQotICAgIEFyZ3M6Ci0gICAgICBmaWxlX2Rlc2NyaXB0b3I6IGEgZGVzY3JpcHRvci5GaWxlRGVzY3JpcHRvci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgcHJvdmlkZWQgZGVzY3JpcHRvci4KLSAgICAiIiIKLSAgICBzZWxmLnBvb2wuQWRkRmlsZURlc2NyaXB0b3IoZmlsZV9kZXNjcmlwdG9yKQotCi0gIGRlZiBHZXRTeW1ib2woc2VsZiwgc3ltYm9sKToKLSAgICAiIiJUcmllcyB0byBmaW5kIGEgc3ltYm9sIGluIHRoZSBsb2NhbCBkYXRhYmFzZS4KLQotICAgIEN1cnJlbnRseSwgdGhpcyBtZXRob2Qgb25seSByZXR1cm5zIG1lc3NhZ2UuTWVzc2FnZSBpbnN0YW5jZXMsIGhvd2V2ZXIsIGlmCi0gICAgbWF5IGJlIGV4dGVuZGVkIGluIGZ1dHVyZSB0byBzdXBwb3J0IG90aGVyIHN5bWJvbCB0eXBlcy4KLQotICAgIEFyZ3M6Ci0gICAgICBzeW1ib2w6IEEgc3RyLCBhIHByb3RvY29sIGJ1ZmZlciBzeW1ib2wuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBQeXRob24gY2xhc3MgY29ycmVzcG9uZGluZyB0byB0aGUgc3ltYm9sLgotCi0gICAgUmFpc2VzOgotICAgICAgS2V5RXJyb3I6IGlmIHRoZSBzeW1ib2wgY291bGQgbm90IGJlIGZvdW5kLgotICAgICIiIgotCi0gICAgcmV0dXJuIHNlbGYuX3N5bWJvbHNbc3ltYm9sXQotCi0gIGRlZiBHZXRQcm90b3R5cGUoc2VsZiwgZGVzY3JpcHRvcik6Ci0gICAgIiIiQnVpbGRzIGEgcHJvdG8yIG1lc3NhZ2UgY2xhc3MgYmFzZWQgb24gdGhlIHBhc3NlZCBpbiBkZXNjcmlwdG9yLgotCi0gICAgUGFzc2luZyBhIGRlc2NyaXB0b3Igd2l0aCBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lIG1hdGNoaW5nIGEgcHJldmlvdXMKLSAgICBpbnZvY2F0aW9uIHdpbGwgY2F1c2UgdGhlIHNhbWUgY2xhc3MgdG8gYmUgcmV0dXJuZWQuCi0KLSAgICBBcmdzOgotICAgICAgZGVzY3JpcHRvcjogVGhlIGRlc2NyaXB0b3IgdG8gYnVpbGQgZnJvbS4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIGNsYXNzIGRlc2NyaWJpbmcgdGhlIHBhc3NlZCBpbiBkZXNjcmlwdG9yLgotICAgICIiIgotCi0gICAgcmV0dXJuIHNlbGYuR2V0U3ltYm9sKGRlc2NyaXB0b3IuZnVsbF9uYW1lKQotCi0gIGRlZiBHZXRNZXNzYWdlcyhzZWxmLCBmaWxlcyk6Ci0gICAgIiIiR2V0cyBhbGwgdGhlIG1lc3NhZ2VzIGZyb20gYSBzcGVjaWZpZWQgZmlsZS4KLQotICAgIFRoaXMgd2lsbCBmaW5kIGFuZCByZXNvbHZlIGRlcGVuZGVuY2llcywgZmFpbGluZyBpZiB0aGV5IGFyZSBub3QgcmVnaXN0ZXJlZAotICAgIGluIHRoZSBzeW1ib2wgZGF0YWJhc2UuCi0KLQotICAgIEFyZ3M6Ci0gICAgICBmaWxlczogVGhlIGZpbGUgbmFtZXMgdG8gZXh0cmFjdCBtZXNzYWdlcyBmcm9tLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgZGljdGlvbmFyeSBtYXBwaW5nIHByb3RvIG5hbWVzIHRvIHRoZSBtZXNzYWdlIGNsYXNzZXMuIFRoaXMgd2lsbCBpbmNsdWRlCi0gICAgICBhbnkgZGVwZW5kZW50IG1lc3NhZ2VzIGFzIHdlbGwgYXMgYW55IG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhlIHNhbWUgZmlsZSBhcwotICAgICAgYSBzcGVjaWZpZWQgbWVzc2FnZS4KLQotICAgIFJhaXNlczoKLSAgICAgIEtleUVycm9yOiBpZiBhIGZpbGUgY291bGQgbm90IGJlIGZvdW5kLgotICAgICIiIgotCi0gICAgcmVzdWx0ID0ge30KLSAgICBmb3IgZiBpbiBmaWxlczoKLSAgICAgIHJlc3VsdC51cGRhdGUoc2VsZi5fc3ltYm9sc19ieV9maWxlW2ZdKQotICAgIHJldHVybiByZXN1bHQKLQotX0RFRkFVTFQgPSBTeW1ib2xEYXRhYmFzZShwb29sPWRlc2NyaXB0b3JfcG9vbC5EZWZhdWx0KCkpCi0KLQotZGVmIERlZmF1bHQoKToKLSAgIiIiUmV0dXJucyB0aGUgZGVmYXVsdCBTeW1ib2xEYXRhYmFzZS4iIiIKLSAgcmV0dXJuIF9ERUZBVUxUCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZW5jb2RpbmcucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZW5jb2RpbmcucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTk1NjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2VuY29kaW5nLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTA3ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiRW5jb2RpbmcgcmVsYXRlZCB1dGlsaXRpZXMuIiIiCi1pbXBvcnQgcmUKLQotaW1wb3J0IHNpeAotCi0jIExvb2t1cCB0YWJsZSBmb3IgdXRmOAotX2Nlc2NhcGVfdXRmOF90b19zdHIgPSBbY2hyKGkpIGZvciBpIGluIHJhbmdlKDAsIDI1NildCi1fY2VzY2FwZV91dGY4X3RvX3N0cls5XSA9IHInXHQnICAjIG9wdGlvbmFsIGVzY2FwZQotX2Nlc2NhcGVfdXRmOF90b19zdHJbMTBdID0gcidcbicgICMgb3B0aW9uYWwgZXNjYXBlCi1fY2VzY2FwZV91dGY4X3RvX3N0clsxM10gPSByJ1xyJyAgIyBvcHRpb25hbCBlc2NhcGUKLV9jZXNjYXBlX3V0ZjhfdG9fc3RyWzM5XSA9IHIiXCciICAjIG9wdGlvbmFsIGVzY2FwZQotCi1fY2VzY2FwZV91dGY4X3RvX3N0clszNF0gPSByJ1wiJyAgIyBuZWNlc3NhcnkgZXNjYXBlCi1fY2VzY2FwZV91dGY4X3RvX3N0cls5Ml0gPSByJ1xcJyAgIyBuZWNlc3NhcnkgZXNjYXBlCi0KLSMgTG9va3VwIHRhYmxlIGZvciBub24tdXRmOCwgd2l0aCBuZWNlc3NhcnkgZXNjYXBlcyBhdCAobyA+PSAxMjcgb3IgbyA8IDMyKQotX2Nlc2NhcGVfYnl0ZV90b19zdHIgPSAoW3InXCUwM28nICUgaSBmb3IgaSBpbiByYW5nZSgwLCAzMildICsKLSAgICAgICAgICAgICAgICAgICAgICAgIFtjaHIoaSkgZm9yIGkgaW4gcmFuZ2UoMzIsIDEyNyldICsKLSAgICAgICAgICAgICAgICAgICAgICAgIFtyJ1wlMDNvJyAlIGkgZm9yIGkgaW4gcmFuZ2UoMTI3LCAyNTYpXSkKLV9jZXNjYXBlX2J5dGVfdG9fc3RyWzldID0gcidcdCcgICMgb3B0aW9uYWwgZXNjYXBlCi1fY2VzY2FwZV9ieXRlX3RvX3N0clsxMF0gPSByJ1xuJyAgIyBvcHRpb25hbCBlc2NhcGUKLV9jZXNjYXBlX2J5dGVfdG9fc3RyWzEzXSA9IHInXHInICAjIG9wdGlvbmFsIGVzY2FwZQotX2Nlc2NhcGVfYnl0ZV90b19zdHJbMzldID0gciJcJyIgICMgb3B0aW9uYWwgZXNjYXBlCi0KLV9jZXNjYXBlX2J5dGVfdG9fc3RyWzM0XSA9IHInXCInICAjIG5lY2Vzc2FyeSBlc2NhcGUKLV9jZXNjYXBlX2J5dGVfdG9fc3RyWzkyXSA9IHInXFwnICAjIG5lY2Vzc2FyeSBlc2NhcGUKLQotCi1kZWYgQ0VzY2FwZSh0ZXh0LCBhc191dGY4KToKLSAgIiIiRXNjYXBlIGEgYnl0ZXMgc3RyaW5nIGZvciB1c2UgaW4gYW4gYXNjaWkgcHJvdG9jb2wgYnVmZmVyLgotCi0gIHRleHQuZW5jb2RlKCdzdHJpbmdfZXNjYXBlJykgZG9lcyBub3Qgc2VlbSB0byBzYXRpc2Z5IG91ciBuZWVkcyBhcyBpdAotICBlbmNvZGVzIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMgdXNpbmcgdHdvLWRpZ2l0IGhleCBlc2NhcGVzIHdoZXJlYXMgb3VyCi0gIEMrKyB1bmVzY2FwaW5nIGZ1bmN0aW9uIGFsbG93cyBoZXggZXNjYXBlcyB0byBiZSBhbnkgbGVuZ3RoLiAgU28sCi0gICJcMDAxMSIuZW5jb2RlKCdzdHJpbmdfZXNjYXBlJykgZW5kcyB1cCBiZWluZyAiXFx4MDExIiwgd2hpY2ggd2lsbCBiZQotICBkZWNvZGVkIGluIEMrKyBhcyBhIHNpbmdsZS1jaGFyYWN0ZXIgc3RyaW5nIHdpdGggY2hhciBjb2RlIDB4MTEuCi0KLSAgQXJnczoKLSAgICB0ZXh0OiBBIGJ5dGUgc3RyaW5nIHRvIGJlIGVzY2FwZWQKLSAgICBhc191dGY4OiBTcGVjaWZpZXMgaWYgcmVzdWx0IHNob3VsZCBiZSByZXR1cm5lZCBpbiBVVEYtOCBlbmNvZGluZwotICBSZXR1cm5zOgotICAgIEVzY2FwZWQgc3RyaW5nCi0gICIiIgotICAjIFBZMyBoYWNrOiBtYWtlIE9yZCB3b3JrIGZvciBzdHIgYW5kIGJ5dGVzOgotICAjIC8vcGxhdGZvcm1zL25ldHdvcmtpbmcvZGF0YSB1c2VzIHVuaWNvZGUgaGVyZSwgaGVuY2UgYmFzZXN0cmluZy4KLSAgT3JkID0gb3JkIGlmIGlzaW5zdGFuY2UodGV4dCwgc2l4LnN0cmluZ190eXBlcykgZWxzZSBsYW1iZGEgeDogeAotICBpZiBhc191dGY4OgotICAgIHJldHVybiAnJy5qb2luKF9jZXNjYXBlX3V0ZjhfdG9fc3RyW09yZChjKV0gZm9yIGMgaW4gdGV4dCkKLSAgcmV0dXJuICcnLmpvaW4oX2Nlc2NhcGVfYnl0ZV90b19zdHJbT3JkKGMpXSBmb3IgYyBpbiB0ZXh0KQotCi0KLV9DVU5FU0NBUEVfSEVYID0gcmUuY29tcGlsZShyJyhcXCspeChbMC05YS1mQS1GXSkoPyFbMC05YS1mQS1GXSknKQotX2Nlc2NhcGVfaGlnaGJpdF90b19zdHIgPSAoW2NocihpKSBmb3IgaSBpbiByYW5nZSgwLCAxMjcpXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBbcidcJTAzbycgJSBpIGZvciBpIGluIHJhbmdlKDEyNywgMjU2KV0pCi0KLQotZGVmIENVbmVzY2FwZSh0ZXh0KToKLSAgIiIiVW5lc2NhcGUgYSB0ZXh0IHN0cmluZyB3aXRoIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcyB0byBVVEYtOCBieXRlcy4iIiIKLQotICBkZWYgUmVwbGFjZUhleChtKToKLSAgICAjIE9ubHkgcmVwbGFjZSB0aGUgbWF0Y2ggaWYgdGhlIG51bWJlciBvZiBsZWFkaW5nIGJhY2sgc2xhc2hlcyBpcyBvZGQuIGkuZS4KLSAgICAjIHRoZSBzbGFzaCBpdHNlbGYgaXMgbm90IGVzY2FwZWQuCi0gICAgaWYgbGVuKG0uZ3JvdXAoMSkpICYgMToKLSAgICAgIHJldHVybiBtLmdyb3VwKDEpICsgJ3gwJyArIG0uZ3JvdXAoMikKLSAgICByZXR1cm4gbS5ncm91cCgwKQotCi0gICMgVGhpcyBpcyByZXF1aXJlZCBiZWNhdXNlIHRoZSAnc3RyaW5nX2VzY2FwZScgZW5jb2RpbmcgZG9lc24ndAotICAjIGFsbG93IHNpbmdsZS1kaWdpdCBoZXggZXNjYXBlcyAobGlrZSAnXHhmJykuCi0gIHJlc3VsdCA9IF9DVU5FU0NBUEVfSEVYLnN1YihSZXBsYWNlSGV4LCB0ZXh0KQotCi0gIGlmIHN0ciBpcyBieXRlczogICMgUFkyCi0gICAgcmV0dXJuIHJlc3VsdC5kZWNvZGUoJ3N0cmluZ19lc2NhcGUnKQotICByZXN1bHQgPSAnJy5qb2luKF9jZXNjYXBlX2hpZ2hiaXRfdG9fc3RyW29yZChjKV0gZm9yIGMgaW4gcmVzdWx0KQotICByZXR1cm4gKHJlc3VsdC5lbmNvZGUoJ2FzY2lpJykgICMgTWFrZSBpdCBieXRlcyB0byBhbGxvdyBkZWNvZGUuCi0gICAgICAgICAgLmRlY29kZSgndW5pY29kZV9lc2NhcGUnKQotICAgICAgICAgICMgTWFrZSBpdCBieXRlcyBhZ2FpbiB0byByZXR1cm4gdGhlIHByb3BlciB0eXBlLgotICAgICAgICAgIC5lbmNvZGUoJ3Jhd191bmljb2RlX2VzY2FwZScpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmMWUzYzguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEyMTkgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJDb250YWlucyByb3V0aW5lcyBmb3IgcHJpbnRpbmcgcHJvdG9jb2wgbWVzc2FnZXMgaW4gdGV4dCBmb3JtYXQuCi0KLVNpbXBsZSB1c2FnZSBleGFtcGxlOgotCi0gICMgQ3JlYXRlIGEgcHJvdG8gb2JqZWN0IGFuZCBzZXJpYWxpemUgaXQgdG8gYSB0ZXh0IHByb3RvIHN0cmluZy4KLSAgbWVzc2FnZSA9IG15X3Byb3RvX3BiMi5NeU1lc3NhZ2UoZm9vPSdiYXInKQotICB0ZXh0X3Byb3RvID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpCi0KLSAgIyBQYXJzZSBhIHRleHQgcHJvdG8gc3RyaW5nLgotICBtZXNzYWdlID0gdGV4dF9mb3JtYXQuUGFyc2UodGV4dF9wcm90bywgbXlfcHJvdG9fcGIyLk15TWVzc2FnZSgpKQotIiIiCi0KLV9fYXV0aG9yX18gPSAna2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSknCi0KLWltcG9ydCBpbwotaW1wb3J0IHJlCi0KLWltcG9ydCBzaXgKLQotaWYgc2l4LlBZMzoKLSAgbG9uZyA9IGludAotCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdHlwZV9jaGVja2VycwotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2VuY29kaW5nCi0KLV9fYWxsX18gPSBbJ01lc3NhZ2VUb1N0cmluZycsICdQcmludE1lc3NhZ2UnLCAnUHJpbnRGaWVsZCcsCi0gICAgICAgICAgICdQcmludEZpZWxkVmFsdWUnLCAnTWVyZ2UnXQotCi0KLV9JTlRFR0VSX0NIRUNLRVJTID0gKHR5cGVfY2hlY2tlcnMuVWludDMyVmFsdWVDaGVja2VyKCksCi0gICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrZXJzLkludDMyVmFsdWVDaGVja2VyKCksCi0gICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrZXJzLlVpbnQ2NFZhbHVlQ2hlY2tlcigpLAotICAgICAgICAgICAgICAgICAgICAgdHlwZV9jaGVja2Vycy5JbnQ2NFZhbHVlQ2hlY2tlcigpKQotX0ZMT0FUX0lORklOSVRZID0gcmUuY29tcGlsZSgnLT9pbmYoPzppbml0eSk/Zj8nLCByZS5JR05PUkVDQVNFKQotX0ZMT0FUX05BTiA9IHJlLmNvbXBpbGUoJ25hbmY/JywgcmUuSUdOT1JFQ0FTRSkKLV9GTE9BVF9UWVBFUyA9IGZyb3plbnNldChbZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9GTE9BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9ET1VCTEVdKQotX1FVT1RFUyA9IGZyb3plbnNldCgoIiciLCAnIicpKQotCi0KLWNsYXNzIEVycm9yKEV4Y2VwdGlvbik6Ci0gICIiIlRvcC1sZXZlbCBtb2R1bGUgZXJyb3IgZm9yIHRleHRfZm9ybWF0LiIiIgotCi0KLWNsYXNzIFBhcnNlRXJyb3IoRXJyb3IpOgotICAiIiJUaHJvd24gaW4gY2FzZSBvZiB0ZXh0IHBhcnNpbmcgZXJyb3IuIiIiCi0KLQotY2xhc3MgVGV4dFdyaXRlcihvYmplY3QpOgotICBkZWYgX19pbml0X18oc2VsZiwgYXNfdXRmOCk6Ci0gICAgaWYgc2l4LlBZMjoKLSAgICAgIHNlbGYuX3dyaXRlciA9IGlvLkJ5dGVzSU8oKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl93cml0ZXIgPSBpby5TdHJpbmdJTygpCi0KLSAgZGVmIHdyaXRlKHNlbGYsIHZhbCk6Ci0gICAgaWYgc2l4LlBZMjoKLSAgICAgIGlmIGlzaW5zdGFuY2UodmFsLCBzaXgudGV4dF90eXBlKToKLSAgICAgICAgdmFsID0gdmFsLmVuY29kZSgndXRmLTgnKQotICAgIHJldHVybiBzZWxmLl93cml0ZXIud3JpdGUodmFsKQotCi0gIGRlZiBjbG9zZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fd3JpdGVyLmNsb3NlKCkKLQotICBkZWYgZ2V0dmFsdWUoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX3dyaXRlci5nZXR2YWx1ZSgpCi0KLQotZGVmIE1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc191dGY4PUZhbHNlLCBhc19vbmVfbGluZT1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgcG9pbnR5X2JyYWNrZXRzPUZhbHNlLCB1c2VfaW5kZXhfb3JkZXI9RmFsc2UsCi0gICAgICAgICAgICAgICAgICAgIGZsb2F0X2Zvcm1hdD1Ob25lLCB1c2VfZmllbGRfbnVtYmVyPUZhbHNlKToKLSAgIiIiQ29udmVydCBwcm90b2J1ZiBtZXNzYWdlIHRvIHRleHQgZm9ybWF0LgotCi0gIEZsb2F0aW5nIHBvaW50IHZhbHVlcyBjYW4gYmUgZm9ybWF0dGVkIGNvbXBhY3RseSB3aXRoIDE1IGRpZ2l0cyBvZgotICBwcmVjaXNpb24gKHdoaWNoIGlzIHRoZSBtb3N0IHRoYXQgSUVFRSA3NTQgImRvdWJsZSIgY2FuIGd1YXJhbnRlZSkKLSAgdXNpbmcgZmxvYXRfZm9ybWF0PScuMTVnJy4gVG8gZW5zdXJlIHRoYXQgY29udmVydGluZyB0byB0ZXh0IGFuZCBiYWNrIHRvIGEKLSAgcHJvdG8gd2lsbCByZXN1bHQgaW4gYW4gaWRlbnRpY2FsIHZhbHVlLCBmbG9hdF9mb3JtYXQ9Jy4xN2cnIHNob3VsZCBiZSB1c2VkLgotCi0gIEFyZ3M6Ci0gICAgbWVzc2FnZTogVGhlIHByb3RvY29sIGJ1ZmZlcnMgbWVzc2FnZS4KLSAgICBhc191dGY4OiBQcm9kdWNlIHRleHQgb3V0cHV0IGluIFVURjggZm9ybWF0LgotICAgIGFzX29uZV9saW5lOiBEb24ndCBpbnRyb2R1Y2UgbmV3bGluZXMgYmV0d2VlbiBmaWVsZHMuCi0gICAgcG9pbnR5X2JyYWNrZXRzOiBJZiBUcnVlLCB1c2UgYW5nbGUgYnJhY2tldHMgaW5zdGVhZCBvZiBjdXJseSBicmFjZXMgZm9yCi0gICAgICBuZXN0aW5nLgotICAgIHVzZV9pbmRleF9vcmRlcjogSWYgVHJ1ZSwgcHJpbnQgZmllbGRzIG9mIGEgcHJvdG8gbWVzc2FnZSB1c2luZyB0aGUgb3JkZXIKLSAgICAgIGRlZmluZWQgaW4gc291cmNlIGNvZGUgaW5zdGVhZCBvZiB0aGUgZmllbGQgbnVtYmVyLiBCeSBkZWZhdWx0LCB1c2UgdGhlCi0gICAgICBmaWVsZCBudW1iZXIgb3JkZXIuCi0gICAgZmxvYXRfZm9ybWF0OiBJZiBzZXQsIHVzZSB0aGlzIHRvIHNwZWNpZnkgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGZvcm1hdHRpbmcKLSAgICAgIChwZXIgdGhlICJGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIik7IG90aGVyd2lzZSwgc3RyKCkgaXMgdXNlZC4KLSAgICB1c2VfZmllbGRfbnVtYmVyOiBJZiBUcnVlLCBwcmludCBmaWVsZCBudW1iZXJzIGluc3RlYWQgb2YgbmFtZXMuCi0KLSAgUmV0dXJuczoKLSAgICBBIHN0cmluZyBvZiB0aGUgdGV4dCBmb3JtYXR0ZWQgcHJvdG9jb2wgYnVmZmVyIG1lc3NhZ2UuCi0gICIiIgotICBvdXQgPSBUZXh0V3JpdGVyKGFzX3V0ZjgpCi0gIHByaW50ZXIgPSBfUHJpbnRlcihvdXQsIDAsIGFzX3V0ZjgsIGFzX29uZV9saW5lLAotICAgICAgICAgICAgICAgICAgICAgcG9pbnR5X2JyYWNrZXRzLCB1c2VfaW5kZXhfb3JkZXIsIGZsb2F0X2Zvcm1hdCwKLSAgICAgICAgICAgICAgICAgICAgIHVzZV9maWVsZF9udW1iZXIpCi0gIHByaW50ZXIuUHJpbnRNZXNzYWdlKG1lc3NhZ2UpCi0gIHJlc3VsdCA9IG91dC5nZXR2YWx1ZSgpCi0gIG91dC5jbG9zZSgpCi0gIGlmIGFzX29uZV9saW5lOgotICAgIHJldHVybiByZXN1bHQucnN0cmlwKCkKLSAgcmV0dXJuIHJlc3VsdAotCi0KLWRlZiBfSXNNYXBFbnRyeShmaWVsZCk6Ci0gIHJldHVybiAoZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0UgYW5kCi0gICAgICAgICAgZmllbGQubWVzc2FnZV90eXBlLmhhc19vcHRpb25zIGFuZAotICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZS5HZXRPcHRpb25zKCkubWFwX2VudHJ5KQotCi0KLWRlZiBQcmludE1lc3NhZ2UobWVzc2FnZSwgb3V0LCBpbmRlbnQ9MCwgYXNfdXRmOD1GYWxzZSwgYXNfb25lX2xpbmU9RmFsc2UsCi0gICAgICAgICAgICAgICAgIHBvaW50eV9icmFja2V0cz1GYWxzZSwgdXNlX2luZGV4X29yZGVyPUZhbHNlLAotICAgICAgICAgICAgICAgICBmbG9hdF9mb3JtYXQ9Tm9uZSwgdXNlX2ZpZWxkX251bWJlcj1GYWxzZSk6Ci0gIHByaW50ZXIgPSBfUHJpbnRlcihvdXQsIGluZGVudCwgYXNfdXRmOCwgYXNfb25lX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICBwb2ludHlfYnJhY2tldHMsIHVzZV9pbmRleF9vcmRlciwgZmxvYXRfZm9ybWF0LAotICAgICAgICAgICAgICAgICAgICAgdXNlX2ZpZWxkX251bWJlcikKLSAgcHJpbnRlci5QcmludE1lc3NhZ2UobWVzc2FnZSkKLQotCi1kZWYgUHJpbnRGaWVsZChmaWVsZCwgdmFsdWUsIG91dCwgaW5kZW50PTAsIGFzX3V0Zjg9RmFsc2UsIGFzX29uZV9saW5lPUZhbHNlLAotICAgICAgICAgICAgICAgcG9pbnR5X2JyYWNrZXRzPUZhbHNlLCB1c2VfaW5kZXhfb3JkZXI9RmFsc2UsIGZsb2F0X2Zvcm1hdD1Ob25lKToKLSAgIiIiUHJpbnQgYSBzaW5nbGUgZmllbGQgbmFtZS92YWx1ZSBwYWlyLiIiIgotICBwcmludGVyID0gX1ByaW50ZXIob3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lLAotICAgICAgICAgICAgICAgICAgICAgcG9pbnR5X2JyYWNrZXRzLCB1c2VfaW5kZXhfb3JkZXIsIGZsb2F0X2Zvcm1hdCkKLSAgcHJpbnRlci5QcmludEZpZWxkKGZpZWxkLCB2YWx1ZSkKLQotCi1kZWYgUHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQ9MCwgYXNfdXRmOD1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgYXNfb25lX2xpbmU9RmFsc2UsIHBvaW50eV9icmFja2V0cz1GYWxzZSwKLSAgICAgICAgICAgICAgICAgICAgdXNlX2luZGV4X29yZGVyPUZhbHNlLAotICAgICAgICAgICAgICAgICAgICBmbG9hdF9mb3JtYXQ9Tm9uZSk6Ci0gICIiIlByaW50IGEgc2luZ2xlIGZpZWxkIHZhbHVlIChub3QgaW5jbHVkaW5nIG5hbWUpLiIiIgotICBwcmludGVyID0gX1ByaW50ZXIob3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lLAotICAgICAgICAgICAgICAgICAgICAgcG9pbnR5X2JyYWNrZXRzLCB1c2VfaW5kZXhfb3JkZXIsIGZsb2F0X2Zvcm1hdCkKLSAgcHJpbnRlci5QcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlKQotCi0KLWNsYXNzIF9QcmludGVyKG9iamVjdCk6Ci0gICIiIlRleHQgZm9ybWF0IHByaW50ZXIgZm9yIHByb3RvY29sIG1lc3NhZ2UuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG91dCwgaW5kZW50PTAsIGFzX3V0Zjg9RmFsc2UsIGFzX29uZV9saW5lPUZhbHNlLAotICAgICAgICAgICAgICAgcG9pbnR5X2JyYWNrZXRzPUZhbHNlLCB1c2VfaW5kZXhfb3JkZXI9RmFsc2UsIGZsb2F0X2Zvcm1hdD1Ob25lLAotICAgICAgICAgICAgICAgdXNlX2ZpZWxkX251bWJlcj1GYWxzZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZSB0aGUgUHJpbnRlci4KLQotICAgIEZsb2F0aW5nIHBvaW50IHZhbHVlcyBjYW4gYmUgZm9ybWF0dGVkIGNvbXBhY3RseSB3aXRoIDE1IGRpZ2l0cyBvZgotICAgIHByZWNpc2lvbiAod2hpY2ggaXMgdGhlIG1vc3QgdGhhdCBJRUVFIDc1NCAiZG91YmxlIiBjYW4gZ3VhcmFudGVlKQotICAgIHVzaW5nIGZsb2F0X2Zvcm1hdD0nLjE1ZycuIFRvIGVuc3VyZSB0aGF0IGNvbnZlcnRpbmcgdG8gdGV4dCBhbmQgYmFjayB0byBhCi0gICAgcHJvdG8gd2lsbCByZXN1bHQgaW4gYW4gaWRlbnRpY2FsIHZhbHVlLCBmbG9hdF9mb3JtYXQ9Jy4xN2cnIHNob3VsZCBiZSB1c2VkLgotCi0gICAgQXJnczoKLSAgICAgIG91dDogVG8gcmVjb3JkIHRoZSB0ZXh0IGZvcm1hdCByZXN1bHQuCi0gICAgICBpbmRlbnQ6IFRoZSBpbmRlbnQgbGV2ZWwgZm9yIHByZXR0eSBwcmludC4KLSAgICAgIGFzX3V0Zjg6IFByb2R1Y2UgdGV4dCBvdXRwdXQgaW4gVVRGOCBmb3JtYXQuCi0gICAgICBhc19vbmVfbGluZTogRG9uJ3QgaW50cm9kdWNlIG5ld2xpbmVzIGJldHdlZW4gZmllbGRzLgotICAgICAgcG9pbnR5X2JyYWNrZXRzOiBJZiBUcnVlLCB1c2UgYW5nbGUgYnJhY2tldHMgaW5zdGVhZCBvZiBjdXJseSBicmFjZXMgZm9yCi0gICAgICAgIG5lc3RpbmcuCi0gICAgICB1c2VfaW5kZXhfb3JkZXI6IElmIFRydWUsIHByaW50IGZpZWxkcyBvZiBhIHByb3RvIG1lc3NhZ2UgdXNpbmcgdGhlIG9yZGVyCi0gICAgICAgIGRlZmluZWQgaW4gc291cmNlIGNvZGUgaW5zdGVhZCBvZiB0aGUgZmllbGQgbnVtYmVyLiBCeSBkZWZhdWx0LCB1c2UgdGhlCi0gICAgICAgIGZpZWxkIG51bWJlciBvcmRlci4KLSAgICAgIGZsb2F0X2Zvcm1hdDogSWYgc2V0LCB1c2UgdGhpcyB0byBzcGVjaWZ5IGZsb2F0aW5nIHBvaW50IG51bWJlciBmb3JtYXR0aW5nCi0gICAgICAgIChwZXIgdGhlICJGb3JtYXQgU3BlY2lmaWNhdGlvbiBNaW5pLUxhbmd1YWdlIik7IG90aGVyd2lzZSwgc3RyKCkgaXMKLSAgICAgICAgdXNlZC4KLSAgICAgIHVzZV9maWVsZF9udW1iZXI6IElmIFRydWUsIHByaW50IGZpZWxkIG51bWJlcnMgaW5zdGVhZCBvZiBuYW1lcy4KLSAgICAiIiIKLSAgICBzZWxmLm91dCA9IG91dAotICAgIHNlbGYuaW5kZW50ID0gaW5kZW50Ci0gICAgc2VsZi5hc191dGY4ID0gYXNfdXRmOAotICAgIHNlbGYuYXNfb25lX2xpbmUgPSBhc19vbmVfbGluZQotICAgIHNlbGYucG9pbnR5X2JyYWNrZXRzID0gcG9pbnR5X2JyYWNrZXRzCi0gICAgc2VsZi51c2VfaW5kZXhfb3JkZXIgPSB1c2VfaW5kZXhfb3JkZXIKLSAgICBzZWxmLmZsb2F0X2Zvcm1hdCA9IGZsb2F0X2Zvcm1hdAotICAgIHNlbGYudXNlX2ZpZWxkX251bWJlciA9IHVzZV9maWVsZF9udW1iZXIKLQotICBkZWYgUHJpbnRNZXNzYWdlKHNlbGYsIG1lc3NhZ2UpOgotICAgICIiIkNvbnZlcnQgcHJvdG9idWYgbWVzc2FnZSB0byB0ZXh0IGZvcm1hdC4KLQotICAgIEFyZ3M6Ci0gICAgICBtZXNzYWdlOiBUaGUgcHJvdG9jb2wgYnVmZmVycyBtZXNzYWdlLgotICAgICIiIgotICAgIGZpZWxkcyA9IG1lc3NhZ2UuTGlzdEZpZWxkcygpCi0gICAgaWYgc2VsZi51c2VfaW5kZXhfb3JkZXI6Ci0gICAgICBmaWVsZHMuc29ydChrZXk9bGFtYmRhIHg6IHhbMF0uaW5kZXgpCi0gICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBmaWVsZHM6Ci0gICAgICBpZiBfSXNNYXBFbnRyeShmaWVsZCk6Ci0gICAgICAgIGZvciBrZXkgaW4gc29ydGVkKHZhbHVlKToKLSAgICAgICAgICAjIFRoaXMgaXMgc2xvdyBmb3IgbWFwcyB3aXRoIHN1Ym1lc3NhZ2UgZW50aXJlcyBiZWNhdXNlIGl0IGNvcGllcyB0aGUKLSAgICAgICAgICAjIGVudGlyZSB0cmVlLiAgVW5mb3J0dW5hdGVseSB0aGlzIHdvdWxkIHRha2Ugc2lnbmlmaWNhbnQgcmVmYWN0b3JpbmcKLSAgICAgICAgICAjIG9mIHRoaXMgZmlsZSB0byB3b3JrIGFyb3VuZC4KLSAgICAgICAgICAjCi0gICAgICAgICAgIyBUT0RPKGhhYmVybWFuKTogcmVmYWN0b3IgYW5kIG9wdGltaXplIGlmIHRoaXMgYmVjb21lcyBhbiBpc3N1ZS4KLSAgICAgICAgICBlbnRyeV9zdWJtc2cgPSBmaWVsZC5tZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKAotICAgICAgICAgICAgICBrZXk9a2V5LCB2YWx1ZT12YWx1ZVtrZXldKQotICAgICAgICAgIHNlbGYuUHJpbnRGaWVsZChmaWVsZCwgZW50cnlfc3VibXNnKQotICAgICAgZWxpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgc2VsZi5QcmludEZpZWxkKGZpZWxkLCBlbGVtZW50KQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5QcmludEZpZWxkKGZpZWxkLCB2YWx1ZSkKLQotICBkZWYgUHJpbnRGaWVsZChzZWxmLCBmaWVsZCwgdmFsdWUpOgotICAgICIiIlByaW50IGEgc2luZ2xlIGZpZWxkIG5hbWUvdmFsdWUgcGFpci4iIiIKLSAgICBvdXQgPSBzZWxmLm91dAotICAgIG91dC53cml0ZSgnICcgKiBzZWxmLmluZGVudCkKLSAgICBpZiBzZWxmLnVzZV9maWVsZF9udW1iZXI6Ci0gICAgICBvdXQud3JpdGUoc3RyKGZpZWxkLm51bWJlcikpCi0gICAgZWxzZToKLSAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKLSAgICAgICAgb3V0LndyaXRlKCdbJykKLSAgICAgICAgaWYgKGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgYW5kCi0gICAgICAgICAgICBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSBhbmQKLSAgICAgICAgICAgIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX09QVElPTkFMKToKLSAgICAgICAgICBvdXQud3JpdGUoZmllbGQubWVzc2FnZV90eXBlLmZ1bGxfbmFtZSkKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBvdXQud3JpdGUoZmllbGQuZnVsbF9uYW1lKQotICAgICAgICBvdXQud3JpdGUoJ10nKQotICAgICAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6Ci0gICAgICAgICMgRm9yIGdyb3VwcywgdXNlIHRoZSBjYXBpdGFsaXplZCBuYW1lLgotICAgICAgICBvdXQud3JpdGUoZmllbGQubWVzc2FnZV90eXBlLm5hbWUpCi0gICAgICBlbHNlOgotICAgICAgICBvdXQud3JpdGUoZmllbGQubmFtZSkKLQotICAgIGlmIGZpZWxkLmNwcF90eXBlICE9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICMgVGhlIGNvbG9uIGlzIG9wdGlvbmFsIGluIHRoaXMgY2FzZSwgYnV0IG91ciBjcm9zcy1sYW5ndWFnZSBnb2xkZW4gZmlsZXMKLSAgICAgICMgZG9uJ3QgaW5jbHVkZSBpdC4KLSAgICAgIG91dC53cml0ZSgnOiAnKQotCi0gICAgc2VsZi5QcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlKQotICAgIGlmIHNlbGYuYXNfb25lX2xpbmU6Ci0gICAgICBvdXQud3JpdGUoJyAnKQotICAgIGVsc2U6Ci0gICAgICBvdXQud3JpdGUoJ1xuJykKLQotICBkZWYgUHJpbnRGaWVsZFZhbHVlKHNlbGYsIGZpZWxkLCB2YWx1ZSk6Ci0gICAgIiIiUHJpbnQgYSBzaW5nbGUgZmllbGQgdmFsdWUgKG5vdCBpbmNsdWRpbmcgbmFtZSkuCi0KLSAgICBGb3IgcmVwZWF0ZWQgZmllbGRzLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGEgc2luZ2xlIGVsZW1lbnQuCi0KLSAgICBBcmdzOgotICAgICAgZmllbGQ6IFRoZSBkZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCB0byBiZSBwcmludGVkLgotICAgICAgdmFsdWU6IFRoZSB2YWx1ZSBvZiB0aGUgZmllbGQuCi0gICAgIiIiCi0gICAgb3V0ID0gc2VsZi5vdXQKLSAgICBpZiBzZWxmLnBvaW50eV9icmFja2V0czoKLSAgICAgIG9wZW5iID0gJzwnCi0gICAgICBjbG9zZWIgPSAnPicKLSAgICBlbHNlOgotICAgICAgb3BlbmIgPSAneycKLSAgICAgIGNsb3NlYiA9ICd9JwotCi0gICAgaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgaWYgc2VsZi5hc19vbmVfbGluZToKLSAgICAgICAgb3V0LndyaXRlKCcgJXMgJyAlIG9wZW5iKQotICAgICAgICBzZWxmLlByaW50TWVzc2FnZSh2YWx1ZSkKLSAgICAgICAgb3V0LndyaXRlKGNsb3NlYikKLSAgICAgIGVsc2U6Ci0gICAgICAgIG91dC53cml0ZSgnICVzXG4nICUgb3BlbmIpCi0gICAgICAgIHNlbGYuaW5kZW50ICs9IDIKLSAgICAgICAgc2VsZi5QcmludE1lc3NhZ2UodmFsdWUpCi0gICAgICAgIHNlbGYuaW5kZW50IC09IDIKLSAgICAgICAgb3V0LndyaXRlKCcgJyAqIHNlbGYuaW5kZW50ICsgY2xvc2ViKQotICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgotICAgICAgZW51bV92YWx1ZSA9IGZpZWxkLmVudW1fdHlwZS52YWx1ZXNfYnlfbnVtYmVyLmdldCh2YWx1ZSwgTm9uZSkKLSAgICAgIGlmIGVudW1fdmFsdWUgaXMgbm90IE5vbmU6Ci0gICAgICAgIG91dC53cml0ZShlbnVtX3ZhbHVlLm5hbWUpCi0gICAgICBlbHNlOgotICAgICAgICBvdXQud3JpdGUoc3RyKHZhbHVlKSkKLSAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HOgotICAgICAgb3V0LndyaXRlKCdcIicpCi0gICAgICBpZiBpc2luc3RhbmNlKHZhbHVlLCBzaXgudGV4dF90eXBlKToKLSAgICAgICAgb3V0X3ZhbHVlID0gdmFsdWUuZW5jb2RlKCd1dGYtOCcpCi0gICAgICBlbHNlOgotICAgICAgICBvdXRfdmFsdWUgPSB2YWx1ZQotICAgICAgaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOgotICAgICAgICAjIFdlIG5lZWQgdG8gZXNjYXBlIG5vbi1VVEY4IGNoYXJzIGluIFRZUEVfQllURVMgZmllbGQuCi0gICAgICAgIG91dF9hc191dGY4ID0gRmFsc2UKLSAgICAgIGVsc2U6Ci0gICAgICAgIG91dF9hc191dGY4ID0gc2VsZi5hc191dGY4Ci0gICAgICBvdXQud3JpdGUodGV4dF9lbmNvZGluZy5DRXNjYXBlKG91dF92YWx1ZSwgb3V0X2FzX3V0ZjgpKQotICAgICAgb3V0LndyaXRlKCdcIicpCi0gICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0JPT0w6Ci0gICAgICBpZiB2YWx1ZToKLSAgICAgICAgb3V0LndyaXRlKCd0cnVlJykKLSAgICAgIGVsc2U6Ci0gICAgICAgIG91dC53cml0ZSgnZmFsc2UnKQotICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgaW4gX0ZMT0FUX1RZUEVTIGFuZCBzZWxmLmZsb2F0X2Zvcm1hdCBpcyBub3QgTm9uZToKLSAgICAgIG91dC53cml0ZSgnezE6ezB9fScuZm9ybWF0KHNlbGYuZmxvYXRfZm9ybWF0LCB2YWx1ZSkpCi0gICAgZWxzZToKLSAgICAgIG91dC53cml0ZShzdHIodmFsdWUpKQotCi0KLWRlZiBQYXJzZSh0ZXh0LCBtZXNzYWdlLAotICAgICAgICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPUZhbHNlLCBhbGxvd19maWVsZF9udW1iZXI9RmFsc2UpOgotICAiIiJQYXJzZXMgYW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuCi0KLSAgQXJnczoKLSAgICB0ZXh0OiBNZXNzYWdlIHRleHQgcmVwcmVzZW50YXRpb24uCi0gICAgbWVzc2FnZTogQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0byBtZXJnZSBpbnRvLgotICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uOiBpZiBUcnVlLCBza2lwIG92ZXIgbWlzc2luZyBleHRlbnNpb25zIGFuZCBrZWVwCi0gICAgICBwYXJzaW5nCi0gICAgYWxsb3dfZmllbGRfbnVtYmVyOiBpZiBUcnVlLCBib3RoIGZpZWxkIG51bWJlciBhbmQgZmllbGQgbmFtZSBhcmUgYWxsb3dlZC4KLQotICBSZXR1cm5zOgotICAgIFRoZSBzYW1lIG1lc3NhZ2UgcGFzc2VkIGFzIGFyZ3VtZW50LgotCi0gIFJhaXNlczoKLSAgICBQYXJzZUVycm9yOiBPbiB0ZXh0IHBhcnNpbmcgcHJvYmxlbXMuCi0gICIiIgotICBpZiBub3QgaXNpbnN0YW5jZSh0ZXh0LCBzdHIpOgotICAgIHRleHQgPSB0ZXh0LmRlY29kZSgndXRmLTgnKQotICByZXR1cm4gUGFyc2VMaW5lcyh0ZXh0LnNwbGl0KCdcbicpLCBtZXNzYWdlLCBhbGxvd191bmtub3duX2V4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dfZmllbGRfbnVtYmVyKQotCi0KLWRlZiBNZXJnZSh0ZXh0LCBtZXNzYWdlLCBhbGxvd191bmtub3duX2V4dGVuc2lvbj1GYWxzZSwKLSAgICAgICAgICBhbGxvd19maWVsZF9udW1iZXI9RmFsc2UpOgotICAiIiJQYXJzZXMgYW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuCi0KLSAgTGlrZSBQYXJzZSgpLCBidXQgYWxsb3dzIHJlcGVhdGVkIHZhbHVlcyBmb3IgYSBub24tcmVwZWF0ZWQgZmllbGQsIGFuZCB1c2VzCi0gIHRoZSBsYXN0IG9uZS4KLQotICBBcmdzOgotICAgIHRleHQ6IE1lc3NhZ2UgdGV4dCByZXByZXNlbnRhdGlvbi4KLSAgICBtZXNzYWdlOiBBIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIHRvIG1lcmdlIGludG8uCi0gICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb246IGlmIFRydWUsIHNraXAgb3ZlciBtaXNzaW5nIGV4dGVuc2lvbnMgYW5kIGtlZXAKLSAgICAgIHBhcnNpbmcKLSAgICBhbGxvd19maWVsZF9udW1iZXI6IGlmIFRydWUsIGJvdGggZmllbGQgbnVtYmVyIGFuZCBmaWVsZCBuYW1lIGFyZSBhbGxvd2VkLgotCi0gIFJldHVybnM6Ci0gICAgVGhlIHNhbWUgbWVzc2FnZSBwYXNzZWQgYXMgYXJndW1lbnQuCi0KLSAgUmFpc2VzOgotICAgIFBhcnNlRXJyb3I6IE9uIHRleHQgcGFyc2luZyBwcm9ibGVtcy4KLSAgIiIiCi0gIHJldHVybiBNZXJnZUxpbmVzKHRleHQuc3BsaXQoJ1xuJyksIG1lc3NhZ2UsIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICBhbGxvd19maWVsZF9udW1iZXIpCi0KLQotZGVmIFBhcnNlTGluZXMobGluZXMsIG1lc3NhZ2UsIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uPUZhbHNlLAotICAgICAgICAgICAgICAgYWxsb3dfZmllbGRfbnVtYmVyPUZhbHNlKToKLSAgIiIiUGFyc2VzIGFuIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gYSBtZXNzYWdlLgotCi0gIEFyZ3M6Ci0gICAgbGluZXM6IEFuIGl0ZXJhYmxlIG9mIGxpbmVzIG9mIGEgbWVzc2FnZSdzIHRleHQgcmVwcmVzZW50YXRpb24uCi0gICAgbWVzc2FnZTogQSBwcm90b2NvbCBidWZmZXIgbWVzc2FnZSB0byBtZXJnZSBpbnRvLgotICAgIGFsbG93X3Vua25vd25fZXh0ZW5zaW9uOiBpZiBUcnVlLCBza2lwIG92ZXIgbWlzc2luZyBleHRlbnNpb25zIGFuZCBrZWVwCi0gICAgICBwYXJzaW5nCi0gICAgYWxsb3dfZmllbGRfbnVtYmVyOiBpZiBUcnVlLCBib3RoIGZpZWxkIG51bWJlciBhbmQgZmllbGQgbmFtZSBhcmUgYWxsb3dlZC4KLQotICBSZXR1cm5zOgotICAgIFRoZSBzYW1lIG1lc3NhZ2UgcGFzc2VkIGFzIGFyZ3VtZW50LgotCi0gIFJhaXNlczoKLSAgICBQYXJzZUVycm9yOiBPbiB0ZXh0IHBhcnNpbmcgcHJvYmxlbXMuCi0gICIiIgotICBwYXJzZXIgPSBfUGFyc2VyKGFsbG93X3Vua25vd25fZXh0ZW5zaW9uLCBhbGxvd19maWVsZF9udW1iZXIpCi0gIHJldHVybiBwYXJzZXIuUGFyc2VMaW5lcyhsaW5lcywgbWVzc2FnZSkKLQotCi1kZWYgTWVyZ2VMaW5lcyhsaW5lcywgbWVzc2FnZSwgYWxsb3dfdW5rbm93bl9leHRlbnNpb249RmFsc2UsCi0gICAgICAgICAgICAgICBhbGxvd19maWVsZF9udW1iZXI9RmFsc2UpOgotICAiIiJQYXJzZXMgYW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuCi0KLSAgQXJnczoKLSAgICBsaW5lczogQW4gaXRlcmFibGUgb2YgbGluZXMgb2YgYSBtZXNzYWdlJ3MgdGV4dCByZXByZXNlbnRhdGlvbi4KLSAgICBtZXNzYWdlOiBBIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIHRvIG1lcmdlIGludG8uCi0gICAgYWxsb3dfdW5rbm93bl9leHRlbnNpb246IGlmIFRydWUsIHNraXAgb3ZlciBtaXNzaW5nIGV4dGVuc2lvbnMgYW5kIGtlZXAKLSAgICAgIHBhcnNpbmcKLSAgICBhbGxvd19maWVsZF9udW1iZXI6IGlmIFRydWUsIGJvdGggZmllbGQgbnVtYmVyIGFuZCBmaWVsZCBuYW1lIGFyZSBhbGxvd2VkLgotCi0gIFJldHVybnM6Ci0gICAgVGhlIHNhbWUgbWVzc2FnZSBwYXNzZWQgYXMgYXJndW1lbnQuCi0KLSAgUmFpc2VzOgotICAgIFBhcnNlRXJyb3I6IE9uIHRleHQgcGFyc2luZyBwcm9ibGVtcy4KLSAgIiIiCi0gIHBhcnNlciA9IF9QYXJzZXIoYWxsb3dfdW5rbm93bl9leHRlbnNpb24sIGFsbG93X2ZpZWxkX251bWJlcikKLSAgcmV0dXJuIHBhcnNlci5NZXJnZUxpbmVzKGxpbmVzLCBtZXNzYWdlKQotCi0KLWNsYXNzIF9QYXJzZXIob2JqZWN0KToKLSAgIiIiVGV4dCBmb3JtYXQgcGFyc2VyIGZvciBwcm90b2NvbCBtZXNzYWdlLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBhbGxvd191bmtub3duX2V4dGVuc2lvbj1GYWxzZSwgYWxsb3dfZmllbGRfbnVtYmVyPUZhbHNlKToKLSAgICBzZWxmLmFsbG93X3Vua25vd25fZXh0ZW5zaW9uID0gYWxsb3dfdW5rbm93bl9leHRlbnNpb24KLSAgICBzZWxmLmFsbG93X2ZpZWxkX251bWJlciA9IGFsbG93X2ZpZWxkX251bWJlcgotCi0gIGRlZiBQYXJzZUZyb21TdHJpbmcoc2VsZiwgdGV4dCwgbWVzc2FnZSk6Ci0gICAgIiIiUGFyc2VzIGFuIHRleHQgcmVwcmVzZW50YXRpb24gb2YgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gYSBtZXNzYWdlLiIiIgotICAgIGlmIG5vdCBpc2luc3RhbmNlKHRleHQsIHN0cik6Ci0gICAgICB0ZXh0ID0gdGV4dC5kZWNvZGUoJ3V0Zi04JykKLSAgICByZXR1cm4gc2VsZi5QYXJzZUxpbmVzKHRleHQuc3BsaXQoJ1xuJyksIG1lc3NhZ2UpCi0KLSAgZGVmIFBhcnNlTGluZXMoc2VsZiwgbGluZXMsIG1lc3NhZ2UpOgotICAgICIiIlBhcnNlcyBhbiB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIGEgbWVzc2FnZS4iIiIKLSAgICBzZWxmLl9hbGxvd19tdWx0aXBsZV9zY2FsYXJzID0gRmFsc2UKLSAgICBzZWxmLl9QYXJzZU9yTWVyZ2UobGluZXMsIG1lc3NhZ2UpCi0gICAgcmV0dXJuIG1lc3NhZ2UKLQotICBkZWYgTWVyZ2VGcm9tU3RyaW5nKHNlbGYsIHRleHQsIG1lc3NhZ2UpOgotICAgICIiIk1lcmdlcyBhbiB0ZXh0IHJlcHJlc2VudGF0aW9uIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBpbnRvIGEgbWVzc2FnZS4iIiIKLSAgICByZXR1cm4gc2VsZi5fTWVyZ2VMaW5lcyh0ZXh0LnNwbGl0KCdcbicpLCBtZXNzYWdlKQotCi0gIGRlZiBNZXJnZUxpbmVzKHNlbGYsIGxpbmVzLCBtZXNzYWdlKToKLSAgICAiIiJNZXJnZXMgYW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuIiIiCi0gICAgc2VsZi5fYWxsb3dfbXVsdGlwbGVfc2NhbGFycyA9IFRydWUKLSAgICBzZWxmLl9QYXJzZU9yTWVyZ2UobGluZXMsIG1lc3NhZ2UpCi0gICAgcmV0dXJuIG1lc3NhZ2UKLQotICBkZWYgX1BhcnNlT3JNZXJnZShzZWxmLCBsaW5lcywgbWVzc2FnZSk6Ci0gICAgIiIiQ29udmVydHMgYW4gdGV4dCByZXByZXNlbnRhdGlvbiBvZiBhIHByb3RvY29sIG1lc3NhZ2UgaW50byBhIG1lc3NhZ2UuCi0KLSAgICBBcmdzOgotICAgICAgbGluZXM6IExpbmVzIG9mIGEgbWVzc2FnZSdzIHRleHQgcmVwcmVzZW50YXRpb24uCi0gICAgICBtZXNzYWdlOiBBIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIHRvIG1lcmdlIGludG8uCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBPbiB0ZXh0IHBhcnNpbmcgcHJvYmxlbXMuCi0gICAgIiIiCi0gICAgdG9rZW5pemVyID0gX1Rva2VuaXplcihsaW5lcykKLSAgICB3aGlsZSBub3QgdG9rZW5pemVyLkF0RW5kKCk6Ci0gICAgICBzZWxmLl9NZXJnZUZpZWxkKHRva2VuaXplciwgbWVzc2FnZSkKLQotICBkZWYgX01lcmdlRmllbGQoc2VsZiwgdG9rZW5pemVyLCBtZXNzYWdlKToKLSAgICAiIiJNZXJnZXMgYSBzaW5nbGUgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBpbnRvIGEgbWVzc2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZXMuCi0gICAgICBtZXNzYWdlOiBBIHByb3RvY29sIG1lc3NhZ2UgdG8gcmVjb3JkIHRoZSBkYXRhLgotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogSW4gY2FzZSBvZiB0ZXh0IHBhcnNpbmcgcHJvYmxlbXMuCi0gICAgIiIiCi0gICAgbWVzc2FnZV9kZXNjcmlwdG9yID0gbWVzc2FnZS5ERVNDUklQVE9SCi0gICAgaWYgKGhhc2F0dHIobWVzc2FnZV9kZXNjcmlwdG9yLCAnc3ludGF4JykgYW5kCi0gICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5zeW50YXggPT0gJ3Byb3RvMycpOgotICAgICAgIyBQcm90bzMgZG9lc24ndCByZXByZXNlbnQgcHJlc2VuY2Ugc28gd2UgY2FuJ3QgdGVzdCBpZiBtdWx0aXBsZQotICAgICAgIyBzY2FsYXJzIGhhdmUgb2NjdXJyZWQuICBXZSBoYXZlIHRvIGFsbG93IHRoZW0uCi0gICAgICBzZWxmLl9hbGxvd19tdWx0aXBsZV9zY2FsYXJzID0gVHJ1ZQotICAgIGlmIHRva2VuaXplci5UcnlDb25zdW1lKCdbJyk6Ci0gICAgICBuYW1lID0gW3Rva2VuaXplci5Db25zdW1lSWRlbnRpZmllcigpXQotICAgICAgd2hpbGUgdG9rZW5pemVyLlRyeUNvbnN1bWUoJy4nKToKLSAgICAgICAgbmFtZS5hcHBlbmQodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCkpCi0gICAgICBuYW1lID0gJy4nLmpvaW4obmFtZSkKLQotICAgICAgaWYgbm90IG1lc3NhZ2VfZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgotICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCi0gICAgICAgICAgICAnTWVzc2FnZSB0eXBlICIlcyIgZG9lcyBub3QgaGF2ZSBleHRlbnNpb25zLicgJQotICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkKLSAgICAgICMgcHlsaW50OiBkaXNhYmxlPXByb3RlY3RlZC1hY2Nlc3MKLSAgICAgIGZpZWxkID0gbWVzc2FnZS5FeHRlbnNpb25zLl9GaW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUpCi0gICAgICAjIHB5bGludDogZW5hYmxlPXByb3RlY3RlZC1hY2Nlc3MKLSAgICAgIGlmIG5vdCBmaWVsZDoKLSAgICAgICAgaWYgc2VsZi5hbGxvd191bmtub3duX2V4dGVuc2lvbjoKLSAgICAgICAgICBmaWVsZCA9IE5vbmUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCi0gICAgICAgICAgICAgICdFeHRlbnNpb24gIiVzIiBub3QgcmVnaXN0ZXJlZC4nICUgbmFtZSkKLSAgICAgIGVsaWYgbWVzc2FnZV9kZXNjcmlwdG9yICE9IGZpZWxkLmNvbnRhaW5pbmdfdHlwZToKLSAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICAgJ0V4dGVuc2lvbiAiJXMiIGRvZXMgbm90IGV4dGVuZCBtZXNzYWdlIHR5cGUgIiVzIi4nICUgKAotICAgICAgICAgICAgICAgIG5hbWUsIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUpKQotCi0gICAgICB0b2tlbml6ZXIuQ29uc3VtZSgnXScpCi0KLSAgICBlbHNlOgotICAgICAgbmFtZSA9IHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllcigpCi0gICAgICBpZiBzZWxmLmFsbG93X2ZpZWxkX251bWJlciBhbmQgbmFtZS5pc2RpZ2l0KCk6Ci0gICAgICAgIG51bWJlciA9IFBhcnNlSW50ZWdlcihuYW1lLCBUcnVlLCBUcnVlKQotICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbnVtYmVyLmdldChudW1iZXIsIE5vbmUpCi0gICAgICAgIGlmIG5vdCBmaWVsZCBhbmQgbWVzc2FnZV9kZXNjcmlwdG9yLmlzX2V4dGVuZGFibGU6Ci0gICAgICAgICAgZmllbGQgPSBtZXNzYWdlLkV4dGVuc2lvbnMuX0ZpbmRFeHRlbnNpb25CeU51bWJlcihudW1iZXIpCi0gICAgICBlbHNlOgotICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZS5nZXQobmFtZSwgTm9uZSkKLQotICAgICAgICAjIEdyb3VwIG5hbWVzIGFyZSBleHBlY3RlZCB0byBiZSBjYXBpdGFsaXplZCBhcyB0aGV5IGFwcGVhciBpbiB0aGUKLSAgICAgICAgIyAucHJvdG8gZmlsZSwgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGVpciB0eXBlIG5hbWVzLCBub3QgdGhlaXIgZmllbGQKLSAgICAgICAgIyBuYW1lcy4KLSAgICAgICAgaWYgbm90IGZpZWxkOgotICAgICAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLmdldChuYW1lLmxvd2VyKCksIE5vbmUpCi0gICAgICAgICAgaWYgZmllbGQgYW5kIGZpZWxkLnR5cGUgIT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDoKLSAgICAgICAgICAgIGZpZWxkID0gTm9uZQotCi0gICAgICAgIGlmIChmaWVsZCBhbmQgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQIGFuZAotICAgICAgICAgICAgZmllbGQubWVzc2FnZV90eXBlLm5hbWUgIT0gbmFtZSk6Ci0gICAgICAgICAgZmllbGQgPSBOb25lCi0KLSAgICAgIGlmIG5vdCBmaWVsZDoKLSAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICAgJ01lc3NhZ2UgdHlwZSAiJXMiIGhhcyBubyBmaWVsZCBuYW1lZCAiJXMiLicgJSAoCi0gICAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSwgbmFtZSkpCi0KLSAgICBpZiBmaWVsZDoKLSAgICAgIGlmIG5vdCBzZWxmLl9hbGxvd19tdWx0aXBsZV9zY2FsYXJzIGFuZCBmaWVsZC5jb250YWluaW5nX29uZW9mOgotICAgICAgICAjIENoZWNrIGlmIHRoZXJlJ3MgYSBkaWZmZXJlbnQgZmllbGQgc2V0IGluIHRoaXMgb25lb2YuCi0gICAgICAgICMgTm90ZSB0aGF0IHdlIGlnbm9yZSB0aGUgY2FzZSBpZiB0aGUgc2FtZSBmaWVsZCB3YXMgc2V0IGJlZm9yZSwgYW5kIHdlCi0gICAgICAgICMgYXBwbHkgX2FsbG93X211bHRpcGxlX3NjYWxhcnMgdG8gbm9uLXNjYWxhciBmaWVsZHMgYXMgd2VsbC4KLSAgICAgICAgd2hpY2hfb25lb2YgPSBtZXNzYWdlLldoaWNoT25lb2YoZmllbGQuY29udGFpbmluZ19vbmVvZi5uYW1lKQotICAgICAgICBpZiB3aGljaF9vbmVvZiBpcyBub3QgTm9uZSBhbmQgd2hpY2hfb25lb2YgIT0gZmllbGQubmFtZToKLSAgICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oCi0gICAgICAgICAgICAgICdGaWVsZCAiJXMiIGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoIGZpZWxkICIlcyIsIGFub3RoZXIgbWVtYmVyICcKLSAgICAgICAgICAgICAgJ29mIG9uZW9mICIlcyIgZm9yIG1lc3NhZ2UgdHlwZSAiJXMiLicgJSAoCi0gICAgICAgICAgICAgICAgICBmaWVsZC5uYW1lLCB3aGljaF9vbmVvZiwgZmllbGQuY29udGFpbmluZ19vbmVvZi5uYW1lLAotICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkpCi0KLSAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzonKQotICAgICAgICBtZXJnZXIgPSBzZWxmLl9NZXJnZU1lc3NhZ2VGaWVsZAotICAgICAgZWxzZToKLSAgICAgICAgdG9rZW5pemVyLkNvbnN1bWUoJzonKQotICAgICAgICBtZXJnZXIgPSBzZWxmLl9NZXJnZVNjYWxhckZpZWxkCi0KLSAgICAgIGlmIChmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRAotICAgICAgICAgIGFuZCB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnWycpKToKLSAgICAgICAgIyBTaG9ydCByZXBlYXRlZCBmb3JtYXQsIGUuZy4gImZvbzogWzEsIDIsIDNdIgotICAgICAgICB3aGlsZSBUcnVlOgotICAgICAgICAgIG1lcmdlcih0b2tlbml6ZXIsIG1lc3NhZ2UsIGZpZWxkKQotICAgICAgICAgIGlmIHRva2VuaXplci5UcnlDb25zdW1lKCddJyk6IGJyZWFrCi0gICAgICAgICAgdG9rZW5pemVyLkNvbnN1bWUoJywnKQotCi0gICAgICBlbHNlOgotICAgICAgICBtZXJnZXIodG9rZW5pemVyLCBtZXNzYWdlLCBmaWVsZCkKLQotICAgIGVsc2U6ICAjIFByb3RvIGZpZWxkIGlzIHVua25vd24uCi0gICAgICBhc3NlcnQgc2VsZi5hbGxvd191bmtub3duX2V4dGVuc2lvbgotICAgICAgX1NraXBGaWVsZENvbnRlbnRzKHRva2VuaXplcikKLQotICAgICMgRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZmllbGRzIG1heSBvcHRpb25hbGx5IGJlIHNlcGFyYXRlZCBieSBjb21tYXMgb3IKLSAgICAjIHNlbWljb2xvbnMuCi0gICAgaWYgbm90IHRva2VuaXplci5UcnlDb25zdW1lKCcsJyk6Ci0gICAgICB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnOycpCi0KLSAgZGVmIF9NZXJnZU1lc3NhZ2VGaWVsZChzZWxmLCB0b2tlbml6ZXIsIG1lc3NhZ2UsIGZpZWxkKToKLSAgICAiIiJNZXJnZXMgYSBzaW5nbGUgc2NhbGFyIGZpZWxkIGludG8gYSBtZXNzYWdlLgotCi0gICAgQXJnczoKLSAgICAgIHRva2VuaXplcjogQSB0b2tlbml6ZXIgdG8gcGFyc2UgdGhlIGZpZWxkIHZhbHVlLgotICAgICAgbWVzc2FnZTogVGhlIG1lc3NhZ2Ugb2Ygd2hpY2ggZmllbGQgaXMgYSBtZW1iZXIuCi0gICAgICBmaWVsZDogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIHRvIGJlIG1lcmdlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IEluIGNhc2Ugb2YgdGV4dCBwYXJzaW5nIHByb2JsZW1zLgotICAgICIiIgotICAgIGlzX21hcF9lbnRyeSA9IF9Jc01hcEVudHJ5KGZpZWxkKQotCi0gICAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzwnKToKLSAgICAgIGVuZF90b2tlbiA9ICc+JwotICAgIGVsc2U6Ci0gICAgICB0b2tlbml6ZXIuQ29uc3VtZSgneycpCi0gICAgICBlbmRfdG9rZW4gPSAnfScKLQotICAgIGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgotICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0uYWRkKCkKLSAgICAgIGVsaWYgaXNfbWFwX2VudHJ5OgotICAgICAgICAjIHB5bGludDogZGlzYWJsZT1wcm90ZWN0ZWQtYWNjZXNzCi0gICAgICAgIHN1Yl9tZXNzYWdlID0gZmllbGQubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpCi0gICAgICBlbHNlOgotICAgICAgICBzdWJfbWVzc2FnZSA9IGdldGF0dHIobWVzc2FnZSwgZmllbGQubmFtZSkuYWRkKCkKLSAgICBlbHNlOgotICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgotICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0KLSAgICAgIGVsc2U6Ci0gICAgICAgIHN1Yl9tZXNzYWdlID0gZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKQotICAgICAgc3ViX21lc3NhZ2UuU2V0SW5QYXJlbnQoKQotCi0gICAgd2hpbGUgbm90IHRva2VuaXplci5UcnlDb25zdW1lKGVuZF90b2tlbik6Ci0gICAgICBpZiB0b2tlbml6ZXIuQXRFbmQoKToKLSAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKCdFeHBlY3RlZCAiJXMiLicgJSAoZW5kX3Rva2VuLCkpCi0gICAgICBzZWxmLl9NZXJnZUZpZWxkKHRva2VuaXplciwgc3ViX21lc3NhZ2UpCi0KLSAgICBpZiBpc19tYXBfZW50cnk6Ci0gICAgICB2YWx1ZV9jcHB0eXBlID0gZmllbGQubWVzc2FnZV90eXBlLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLmNwcF90eXBlCi0gICAgICBpZiB2YWx1ZV9jcHB0eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgdmFsdWUgPSBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpW3N1Yl9tZXNzYWdlLmtleV0KLSAgICAgICAgdmFsdWUuTWVyZ2VGcm9tKHN1Yl9tZXNzYWdlLnZhbHVlKQotICAgICAgZWxzZToKLSAgICAgICAgZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKVtzdWJfbWVzc2FnZS5rZXldID0gc3ViX21lc3NhZ2UudmFsdWUKLQotICBkZWYgX01lcmdlU2NhbGFyRmllbGQoc2VsZiwgdG9rZW5pemVyLCBtZXNzYWdlLCBmaWVsZCk6Ci0gICAgIiIiTWVyZ2VzIGEgc2luZ2xlIHNjYWxhciBmaWVsZCBpbnRvIGEgbWVzc2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCB2YWx1ZS4KLSAgICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGRhdGEuCi0gICAgICBmaWVsZDogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIHRvIGJlIG1lcmdlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IEluIGNhc2Ugb2YgdGV4dCBwYXJzaW5nIHByb2JsZW1zLgotICAgICAgUnVudGltZUVycm9yOiBPbiBydW50aW1lIGVycm9ycy4KLSAgICAiIiIKLSAgICBfID0gc2VsZi5hbGxvd191bmtub3duX2V4dGVuc2lvbgotICAgIHZhbHVlID0gTm9uZQotCi0gICAgaWYgZmllbGQudHlwZSBpbiAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQzMiwKLSAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMiwKLSAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyKToKLSAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVJbnQzMigpCi0gICAgZWxpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0KToKLSAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVJbnQ2NCgpCi0gICAgZWxpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMik6Ci0gICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lVWludDMyKCkKLSAgICBlbGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0LAotICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0KToKLSAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVVaW50NjQoKQotICAgIGVsaWYgZmllbGQudHlwZSBpbiAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFKToKLSAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVGbG9hdCgpCi0gICAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDoKLSAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVCb29sKCkKLSAgICBlbGlmIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6Ci0gICAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lU3RyaW5nKCkKLSAgICBlbGlmIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzoKLSAgICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKCkKLSAgICBlbGlmIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOgotICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUVudW0oZmllbGQpCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIFJ1bnRpbWVFcnJvcignVW5rbm93biBmaWVsZCB0eXBlICVkJyAlIGZpZWxkLnR5cGUpCi0KLSAgICBpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKLSAgICAgICAgbWVzc2FnZS5FeHRlbnNpb25zW2ZpZWxkXS5hcHBlbmQodmFsdWUpCi0gICAgICBlbHNlOgotICAgICAgICBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpLmFwcGVuZCh2YWx1ZSkKLSAgICBlbHNlOgotICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgotICAgICAgICBpZiBub3Qgc2VsZi5fYWxsb3dfbXVsdGlwbGVfc2NhbGFycyBhbmQgbWVzc2FnZS5IYXNFeHRlbnNpb24oZmllbGQpOgotICAgICAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKLSAgICAgICAgICAgICAgJ01lc3NhZ2UgdHlwZSAiJXMiIHNob3VsZCBub3QgaGF2ZSBtdWx0aXBsZSAiJXMiIGV4dGVuc2lvbnMuJyAlCi0gICAgICAgICAgICAgIChtZXNzYWdlLkRFU0NSSVBUT1IuZnVsbF9uYW1lLCBmaWVsZC5mdWxsX25hbWUpKQotICAgICAgICBlbHNlOgotICAgICAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0gPSB2YWx1ZQotICAgICAgZWxzZToKLSAgICAgICAgaWYgbm90IHNlbGYuX2FsbG93X211bHRpcGxlX3NjYWxhcnMgYW5kIG1lc3NhZ2UuSGFzRmllbGQoZmllbGQubmFtZSk6Ci0gICAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICAgICAnTWVzc2FnZSB0eXBlICIlcyIgc2hvdWxkIG5vdCBoYXZlIG11bHRpcGxlICIlcyIgZmllbGRzLicgJQotICAgICAgICAgICAgICAobWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgZmllbGQubmFtZSkpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgc2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lLCB2YWx1ZSkKLQotCi1kZWYgX1NraXBGaWVsZENvbnRlbnRzKHRva2VuaXplcik6Ci0gICIiIlNraXBzIG92ZXIgY29udGVudHMgKHZhbHVlIG9yIG1lc3NhZ2UpIG9mIGEgZmllbGQuCi0KLSAgQXJnczoKLSAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZXMuCi0gICIiIgotICAjIFRyeSB0byBndWVzcyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkLgotICAjIElmIHRoaXMgZmllbGQgaXMgbm90IGEgbWVzc2FnZSwgdGhlcmUgc2hvdWxkIGJlIGEgIjoiIGJldHdlZW4gdGhlCi0gICMgZmllbGQgbmFtZSBhbmQgdGhlIGZpZWxkIHZhbHVlIGFuZCBhbHNvIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgbm90Ci0gICMgc3RhcnQgd2l0aCAieyIgb3IgIjwiIHdoaWNoIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZSBib2R5LgotICAjIElmIHRoZXJlIGlzIG5vICI6IiBvciB0aGVyZSBpcyBhICJ7IiBvciAiPCIgYWZ0ZXIgIjoiLCB0aGlzIGZpZWxkIGhhcwotICAjIHRvIGJlIGEgbWVzc2FnZSBvciB0aGUgaW5wdXQgaXMgaWxsLWZvcm1lZC4KLSAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzonKSBhbmQgbm90IHRva2VuaXplci5Mb29raW5nQXQoCi0gICAgICAneycpIGFuZCBub3QgdG9rZW5pemVyLkxvb2tpbmdBdCgnPCcpOgotICAgIF9Ta2lwRmllbGRWYWx1ZSh0b2tlbml6ZXIpCi0gIGVsc2U6Ci0gICAgX1NraXBGaWVsZE1lc3NhZ2UodG9rZW5pemVyKQotCi0KLWRlZiBfU2tpcEZpZWxkKHRva2VuaXplcik6Ci0gICIiIlNraXBzIG92ZXIgYSBjb21wbGV0ZSBmaWVsZCAobmFtZSBhbmQgdmFsdWUvbWVzc2FnZSkuCi0KLSAgQXJnczoKLSAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZXMuCi0gICIiIgotICBpZiB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnWycpOgotICAgICMgQ29uc3VtZSBleHRlbnNpb24gbmFtZS4KLSAgICB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKQotICAgIHdoaWxlIHRva2VuaXplci5UcnlDb25zdW1lKCcuJyk6Ci0gICAgICB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKQotICAgIHRva2VuaXplci5Db25zdW1lKCddJykKLSAgZWxzZToKLSAgICB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKQotCi0gIF9Ta2lwRmllbGRDb250ZW50cyh0b2tlbml6ZXIpCi0KLSAgIyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmaWVsZHMgbWF5IG9wdGlvbmFsbHkgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvcgotICAjIHNlbWljb2xvbnMuCi0gIGlmIG5vdCB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnLCcpOgotICAgIHRva2VuaXplci5UcnlDb25zdW1lKCc7JykKLQotCi1kZWYgX1NraXBGaWVsZE1lc3NhZ2UodG9rZW5pemVyKToKLSAgIiIiU2tpcHMgb3ZlciBhIGZpZWxkIG1lc3NhZ2UuCi0KLSAgQXJnczoKLSAgICB0b2tlbml6ZXI6IEEgdG9rZW5pemVyIHRvIHBhcnNlIHRoZSBmaWVsZCBuYW1lIGFuZCB2YWx1ZXMuCi0gICIiIgotCi0gIGlmIHRva2VuaXplci5UcnlDb25zdW1lKCc8Jyk6Ci0gICAgZGVsaW1pdGVyID0gJz4nCi0gIGVsc2U6Ci0gICAgdG9rZW5pemVyLkNvbnN1bWUoJ3snKQotICAgIGRlbGltaXRlciA9ICd9JwotCi0gIHdoaWxlIG5vdCB0b2tlbml6ZXIuTG9va2luZ0F0KCc+JykgYW5kIG5vdCB0b2tlbml6ZXIuTG9va2luZ0F0KCd9Jyk6Ci0gICAgX1NraXBGaWVsZCh0b2tlbml6ZXIpCi0KLSAgdG9rZW5pemVyLkNvbnN1bWUoZGVsaW1pdGVyKQotCi0KLWRlZiBfU2tpcEZpZWxkVmFsdWUodG9rZW5pemVyKToKLSAgIiIiU2tpcHMgb3ZlciBhIGZpZWxkIHZhbHVlLgotCi0gIEFyZ3M6Ci0gICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgbmFtZSBhbmQgdmFsdWVzLgotCi0gIFJhaXNlczoKLSAgICBQYXJzZUVycm9yOiBJbiBjYXNlIGFuIGludmFsaWQgZmllbGQgdmFsdWUgaXMgZm91bmQuCi0gICIiIgotICAjIFN0cmluZy9ieXRlcyB0b2tlbnMgY2FuIGNvbWUgaW4gbXVsdGlwbGUgYWRqYWNlbnQgc3RyaW5nIGxpdGVyYWxzLgotICAjIElmIHdlIGNhbiBjb25zdW1lIG9uZSwgY29uc3VtZSBhcyBtYW55IGFzIHdlIGNhbi4KLSAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWVCeXRlU3RyaW5nKCk6Ci0gICAgd2hpbGUgdG9rZW5pemVyLlRyeUNvbnN1bWVCeXRlU3RyaW5nKCk6Ci0gICAgICBwYXNzCi0gICAgcmV0dXJuCi0KLSAgaWYgKG5vdCB0b2tlbml6ZXIuVHJ5Q29uc3VtZUlkZW50aWZpZXIoKSBhbmQKLSAgICAgIG5vdCB0b2tlbml6ZXIuVHJ5Q29uc3VtZUludDY0KCkgYW5kCi0gICAgICBub3QgdG9rZW5pemVyLlRyeUNvbnN1bWVVaW50NjQoKSBhbmQKLSAgICAgIG5vdCB0b2tlbml6ZXIuVHJ5Q29uc3VtZUZsb2F0KCkpOgotICAgIHJhaXNlIFBhcnNlRXJyb3IoJ0ludmFsaWQgZmllbGQgdmFsdWU6ICcgKyB0b2tlbml6ZXIudG9rZW4pCi0KLQotY2xhc3MgX1Rva2VuaXplcihvYmplY3QpOgotICAiIiJQcm90b2NvbCBidWZmZXIgdGV4dCByZXByZXNlbnRhdGlvbiB0b2tlbml6ZXIuCi0KLSAgVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBsb3dlciBsZXZlbCBzdHJpbmcgcGFyc2luZyBieSBzcGxpdHRpbmcgaXQgaW50bwotICBtZWFuaW5nZnVsIHRva2Vucy4KLQotICBJdCB3YXMgZGlyZWN0bHkgcG9ydGVkIGZyb20gdGhlIEphdmEgcHJvdG9jb2wgYnVmZmVyIEFQSS4KLSAgIiIiCi0KLSAgX1dISVRFU1BBQ0UgPSByZS5jb21waWxlKCcoXFxzfCgjLiokKSkrJywgcmUuTVVMVElMSU5FKQotICBfVE9LRU4gPSByZS5jb21waWxlKCd8Jy5qb2luKFsKLSAgICAgIHInW2EtekEtWl9dWzAtOWEtekEtWl8rLV0qJywgICAgICAgICAgICAgIyBhbiBpZGVudGlmaWVyCi0gICAgICByJyhbMC05Ky1dfChcLlswLTldKSlbMC05YS16QS1aXy4rLV0qJywgICMgYSBudW1iZXIKLSAgXSArIFsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIyBxdW90ZWQgc3RyIGZvciBlYWNoIHF1b3RlIG1hcmsKLSAgICAgIHIne3F0fShbXntxdH1cblxcXXxcXC4pKih7cXR9fFxcPyQpJy5mb3JtYXQocXQ9bWFyaykgZm9yIG1hcmsgaW4gX1FVT1RFUwotICBdKSkKLQotICBfSURFTlRJRklFUiA9IHJlLmNvbXBpbGUocidcdysnKQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBsaW5lcyk6Ci0gICAgc2VsZi5fcG9zaXRpb24gPSAwCi0gICAgc2VsZi5fbGluZSA9IC0xCi0gICAgc2VsZi5fY29sdW1uID0gMAotICAgIHNlbGYuX3Rva2VuX3N0YXJ0ID0gTm9uZQotICAgIHNlbGYudG9rZW4gPSAnJwotICAgIHNlbGYuX2xpbmVzID0gaXRlcihsaW5lcykKLSAgICBzZWxmLl9jdXJyZW50X2xpbmUgPSAnJwotICAgIHNlbGYuX3ByZXZpb3VzX2xpbmUgPSAwCi0gICAgc2VsZi5fcHJldmlvdXNfY29sdW1uID0gMAotICAgIHNlbGYuX21vcmVfbGluZXMgPSBUcnVlCi0gICAgc2VsZi5fU2tpcFdoaXRlc3BhY2UoKQotICAgIHNlbGYuTmV4dFRva2VuKCkKLQotICBkZWYgTG9va2luZ0F0KHNlbGYsIHRva2VuKToKLSAgICByZXR1cm4gc2VsZi50b2tlbiA9PSB0b2tlbgotCi0gIGRlZiBBdEVuZChzZWxmKToKLSAgICAiIiJDaGVja3MgdGhlIGVuZCBvZiB0aGUgdGV4dCB3YXMgcmVhY2hlZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlIGlmZiB0aGUgZW5kIHdhcyByZWFjaGVkLgotICAgICIiIgotICAgIHJldHVybiBub3Qgc2VsZi50b2tlbgotCi0gIGRlZiBfUG9wTGluZShzZWxmKToKLSAgICB3aGlsZSBsZW4oc2VsZi5fY3VycmVudF9saW5lKSA8PSBzZWxmLl9jb2x1bW46Ci0gICAgICB0cnk6Ci0gICAgICAgIHNlbGYuX2N1cnJlbnRfbGluZSA9IG5leHQoc2VsZi5fbGluZXMpCi0gICAgICBleGNlcHQgU3RvcEl0ZXJhdGlvbjoKLSAgICAgICAgc2VsZi5fY3VycmVudF9saW5lID0gJycKLSAgICAgICAgc2VsZi5fbW9yZV9saW5lcyA9IEZhbHNlCi0gICAgICAgIHJldHVybgotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fbGluZSArPSAxCi0gICAgICAgIHNlbGYuX2NvbHVtbiA9IDAKLQotICBkZWYgX1NraXBXaGl0ZXNwYWNlKHNlbGYpOgotICAgIHdoaWxlIFRydWU6Ci0gICAgICBzZWxmLl9Qb3BMaW5lKCkKLSAgICAgIG1hdGNoID0gc2VsZi5fV0hJVEVTUEFDRS5tYXRjaChzZWxmLl9jdXJyZW50X2xpbmUsIHNlbGYuX2NvbHVtbikKLSAgICAgIGlmIG5vdCBtYXRjaDoKLSAgICAgICAgYnJlYWsKLSAgICAgIGxlbmd0aCA9IGxlbihtYXRjaC5ncm91cCgwKSkKLSAgICAgIHNlbGYuX2NvbHVtbiArPSBsZW5ndGgKLQotICBkZWYgVHJ5Q29uc3VtZShzZWxmLCB0b2tlbik6Ci0gICAgIiIiVHJpZXMgdG8gY29uc3VtZSBhIGdpdmVuIHBpZWNlIG9mIHRleHQuCi0KLSAgICBBcmdzOgotICAgICAgdG9rZW46IFRleHQgdG8gY29uc3VtZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlIGlmZiB0aGUgdGV4dCB3YXMgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgaWYgc2VsZi50b2tlbiA9PSB0b2tlbjoKLSAgICAgIHNlbGYuTmV4dFRva2VuKCkKLSAgICAgIHJldHVybiBUcnVlCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIENvbnN1bWUoc2VsZiwgdG9rZW4pOgotICAgICIiIkNvbnN1bWVzIGEgcGllY2Ugb2YgdGV4dC4KLQotICAgIEFyZ3M6Ci0gICAgICB0b2tlbjogVGV4dCB0byBjb25zdW1lLgotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogSWYgdGhlIHRleHQgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgaWYgbm90IHNlbGYuVHJ5Q29uc3VtZSh0b2tlbik6Ci0gICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHBlY3RlZCAiJXMiLicgJSB0b2tlbikKLQotICBkZWYgVHJ5Q29uc3VtZUlkZW50aWZpZXIoc2VsZik6Ci0gICAgdHJ5OgotICAgICAgc2VsZi5Db25zdW1lSWRlbnRpZmllcigpCi0gICAgICByZXR1cm4gVHJ1ZQotICAgIGV4Y2VwdCBQYXJzZUVycm9yOgotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIENvbnN1bWVJZGVudGlmaWVyKHNlbGYpOgotICAgICIiIkNvbnN1bWVzIHByb3RvY29sIG1lc3NhZ2UgZmllbGQgaWRlbnRpZmllci4KLQotICAgIFJldHVybnM6Ci0gICAgICBJZGVudGlmaWVyIHN0cmluZy4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IElmIGFuIGlkZW50aWZpZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgcmVzdWx0ID0gc2VsZi50b2tlbgotICAgIGlmIG5vdCBzZWxmLl9JREVOVElGSUVSLm1hdGNoKHJlc3VsdCk6Ci0gICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHBlY3RlZCBpZGVudGlmaWVyLicpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgQ29uc3VtZUludDMyKHNlbGYpOgotICAgICIiIkNvbnN1bWVzIGEgc2lnbmVkIDMyYml0IGludGVnZXIgbnVtYmVyLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IElmIGEgc2lnbmVkIDMyYml0IGludGVnZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gUGFyc2VJbnRlZ2VyKHNlbGYudG9rZW4sIGlzX3NpZ25lZD1UcnVlLCBpc19sb25nPUZhbHNlKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yIGFzIGU6Ci0gICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKHN0cihlKSkKLSAgICBzZWxmLk5leHRUb2tlbigpCi0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBDb25zdW1lVWludDMyKHNlbGYpOgotICAgICIiIkNvbnN1bWVzIGFuIHVuc2lnbmVkIDMyYml0IGludGVnZXIgbnVtYmVyLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IElmIGFuIHVuc2lnbmVkIDMyYml0IGludGVnZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gUGFyc2VJbnRlZ2VyKHNlbGYudG9rZW4sIGlzX3NpZ25lZD1GYWxzZSwgaXNfbG9uZz1GYWxzZSkKLSAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgVHJ5Q29uc3VtZUludDY0KHNlbGYpOgotICAgIHRyeToKLSAgICAgIHNlbGYuQ29uc3VtZUludDY0KCkKLSAgICAgIHJldHVybiBUcnVlCi0gICAgZXhjZXB0IFBhcnNlRXJyb3I6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgQ29uc3VtZUludDY0KHNlbGYpOgotICAgICIiIkNvbnN1bWVzIGEgc2lnbmVkIDY0Yml0IGludGVnZXIgbnVtYmVyLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IElmIGEgc2lnbmVkIDY0Yml0IGludGVnZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gUGFyc2VJbnRlZ2VyKHNlbGYudG9rZW4sIGlzX3NpZ25lZD1UcnVlLCBpc19sb25nPVRydWUpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3IgYXMgZToKLSAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3Ioc3RyKGUpKQotICAgIHNlbGYuTmV4dFRva2VuKCkKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIFRyeUNvbnN1bWVVaW50NjQoc2VsZik6Ci0gICAgdHJ5OgotICAgICAgc2VsZi5Db25zdW1lVWludDY0KCkKLSAgICAgIHJldHVybiBUcnVlCi0gICAgZXhjZXB0IFBhcnNlRXJyb3I6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgQ29uc3VtZVVpbnQ2NChzZWxmKToKLSAgICAiIiJDb25zdW1lcyBhbiB1bnNpZ25lZCA2NGJpdCBpbnRlZ2VyIG51bWJlci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgaW50ZWdlciBwYXJzZWQuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBJZiBhbiB1bnNpZ25lZCA2NGJpdCBpbnRlZ2VyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IFBhcnNlSW50ZWdlcihzZWxmLnRva2VuLCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9VHJ1ZSkKLSAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgVHJ5Q29uc3VtZUZsb2F0KHNlbGYpOgotICAgIHRyeToKLSAgICAgIHNlbGYuQ29uc3VtZUZsb2F0KCkKLSAgICAgIHJldHVybiBUcnVlCi0gICAgZXhjZXB0IFBhcnNlRXJyb3I6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgQ29uc3VtZUZsb2F0KHNlbGYpOgotICAgICIiIkNvbnN1bWVzIGFuIGZsb2F0aW5nIHBvaW50IG51bWJlci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgbnVtYmVyIHBhcnNlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IElmIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IFBhcnNlRmxvYXQoc2VsZi50b2tlbikKLSAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgQ29uc3VtZUJvb2woc2VsZik6Ci0gICAgIiIiQ29uc3VtZXMgYSBib29sZWFuIHZhbHVlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBib29sIHBhcnNlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IElmIGEgYm9vbGVhbiB2YWx1ZSBjb3VsZG4ndCBiZSBjb25zdW1lZC4KLSAgICAiIiIKLSAgICB0cnk6Ci0gICAgICByZXN1bHQgPSBQYXJzZUJvb2woc2VsZi50b2tlbikKLSAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgVHJ5Q29uc3VtZUJ5dGVTdHJpbmcoc2VsZik6Ci0gICAgdHJ5OgotICAgICAgc2VsZi5Db25zdW1lQnl0ZVN0cmluZygpCi0gICAgICByZXR1cm4gVHJ1ZQotICAgIGV4Y2VwdCBQYXJzZUVycm9yOgotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIENvbnN1bWVTdHJpbmcoc2VsZik6Ci0gICAgIiIiQ29uc3VtZXMgYSBzdHJpbmcgdmFsdWUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIHN0cmluZyBwYXJzZWQuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBJZiBhIHN0cmluZyB2YWx1ZSBjb3VsZG4ndCBiZSBjb25zdW1lZC4KLSAgICAiIiIKLSAgICB0aGVfYnl0ZXMgPSBzZWxmLkNvbnN1bWVCeXRlU3RyaW5nKCkKLSAgICB0cnk6Ci0gICAgICByZXR1cm4gc2l4LnRleHRfdHlwZSh0aGVfYnl0ZXMsICd1dGYtOCcpCi0gICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvciBhcyBlOgotICAgICAgcmFpc2Ugc2VsZi5fU3RyaW5nUGFyc2VFcnJvcihlKQotCi0gIGRlZiBDb25zdW1lQnl0ZVN0cmluZyhzZWxmKToKLSAgICAiIiJDb25zdW1lcyBhIGJ5dGUgYXJyYXkgdmFsdWUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGFycmF5IHBhcnNlZCAoYXMgYSBzdHJpbmcpLgotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogSWYgYSBieXRlIGFycmF5IHZhbHVlIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIHRoZV9saXN0ID0gW3NlbGYuX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKCldCi0gICAgd2hpbGUgc2VsZi50b2tlbiBhbmQgc2VsZi50b2tlblswXSBpbiBfUVVPVEVTOgotICAgICAgdGhlX2xpc3QuYXBwZW5kKHNlbGYuX0NvbnN1bWVTaW5nbGVCeXRlU3RyaW5nKCkpCi0gICAgcmV0dXJuIGInJy5qb2luKHRoZV9saXN0KQotCi0gIGRlZiBfQ29uc3VtZVNpbmdsZUJ5dGVTdHJpbmcoc2VsZik6Ci0gICAgIiIiQ29uc3VtZSBvbmUgdG9rZW4gb2YgYSBzdHJpbmcgbGl0ZXJhbC4KLQotICAgIFN0cmluZyBsaXRlcmFscyAod2hldGhlciBieXRlcyBvciB0ZXh0KSBjYW4gY29tZSBpbiBtdWx0aXBsZSBhZGphY2VudAotICAgIHRva2VucyB3aGljaCBhcmUgYXV0b21hdGljYWxseSBjb25jYXRlbmF0ZWQsIGxpa2UgaW4gQyBvciBQeXRob24uICBUaGlzCi0gICAgbWV0aG9kIG9ubHkgY29uc3VtZXMgb25lIHRva2VuLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSB0b2tlbiBwYXJzZWQuCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogV2hlbiB0aGUgd3JvbmcgZm9ybWF0IGRhdGEgaXMgZm91bmQuCi0gICAgIiIiCi0gICAgdGV4dCA9IHNlbGYudG9rZW4KLSAgICBpZiBsZW4odGV4dCkgPCAxIG9yIHRleHRbMF0gbm90IGluIF9RVU9URVM6Ci0gICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHBlY3RlZCBzdHJpbmcgYnV0IGZvdW5kOiAlcicgJSAodGV4dCwpKQotCi0gICAgaWYgbGVuKHRleHQpIDwgMiBvciB0ZXh0Wy0xXSAhPSB0ZXh0WzBdOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcignU3RyaW5nIG1pc3NpbmcgZW5kaW5nIHF1b3RlOiAlcicgJSAodGV4dCwpKQotCi0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gdGV4dF9lbmNvZGluZy5DVW5lc2NhcGUodGV4dFsxOi0xXSkKLSAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgQ29uc3VtZUVudW0oc2VsZiwgZmllbGQpOgotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IFBhcnNlRW51bShmaWVsZCwgc2VsZi50b2tlbikKLSAgICBleGNlcHQgVmFsdWVFcnJvciBhcyBlOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oc2VsZiwgbWVzc2FnZSk6Ci0gICAgIiIiQ3JlYXRlcyBhbmQgKnJldHVybnMqIGEgUGFyc2VFcnJvciBmb3IgdGhlIHByZXZpb3VzbHkgcmVhZCB0b2tlbi4KLQotICAgIEFyZ3M6Ci0gICAgICBtZXNzYWdlOiBBIG1lc3NhZ2UgdG8gc2V0IGZvciB0aGUgZXhjZXB0aW9uLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgUGFyc2VFcnJvciBpbnN0YW5jZS4KLSAgICAiIiIKLSAgICByZXR1cm4gUGFyc2VFcnJvcignJWQ6JWQgOiAlcycgJSAoCi0gICAgICAgIHNlbGYuX3ByZXZpb3VzX2xpbmUgKyAxLCBzZWxmLl9wcmV2aW91c19jb2x1bW4gKyAxLCBtZXNzYWdlKSkKLQotICBkZWYgX1BhcnNlRXJyb3Ioc2VsZiwgbWVzc2FnZSk6Ci0gICAgIiIiQ3JlYXRlcyBhbmQgKnJldHVybnMqIGEgUGFyc2VFcnJvciBmb3IgdGhlIGN1cnJlbnQgdG9rZW4uIiIiCi0gICAgcmV0dXJuIFBhcnNlRXJyb3IoJyVkOiVkIDogJXMnICUgKAotICAgICAgICBzZWxmLl9saW5lICsgMSwgc2VsZi5fY29sdW1uICsgMSwgbWVzc2FnZSkpCi0KLSAgZGVmIF9TdHJpbmdQYXJzZUVycm9yKHNlbGYsIGUpOgotICAgIHJldHVybiBzZWxmLl9QYXJzZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2Ugc3RyaW5nOiAnICsgc3RyKGUpKQotCi0gIGRlZiBOZXh0VG9rZW4oc2VsZik6Ci0gICAgIiIiUmVhZHMgdGhlIG5leHQgbWVhbmluZ2Z1bCB0b2tlbi4iIiIKLSAgICBzZWxmLl9wcmV2aW91c19saW5lID0gc2VsZi5fbGluZQotICAgIHNlbGYuX3ByZXZpb3VzX2NvbHVtbiA9IHNlbGYuX2NvbHVtbgotCi0gICAgc2VsZi5fY29sdW1uICs9IGxlbihzZWxmLnRva2VuKQotICAgIHNlbGYuX1NraXBXaGl0ZXNwYWNlKCkKLQotICAgIGlmIG5vdCBzZWxmLl9tb3JlX2xpbmVzOgotICAgICAgc2VsZi50b2tlbiA9ICcnCi0gICAgICByZXR1cm4KLQotICAgIG1hdGNoID0gc2VsZi5fVE9LRU4ubWF0Y2goc2VsZi5fY3VycmVudF9saW5lLCBzZWxmLl9jb2x1bW4pCi0gICAgaWYgbWF0Y2g6Ci0gICAgICB0b2tlbiA9IG1hdGNoLmdyb3VwKDApCi0gICAgICBzZWxmLnRva2VuID0gdG9rZW4KLSAgICBlbHNlOgotICAgICAgc2VsZi50b2tlbiA9IHNlbGYuX2N1cnJlbnRfbGluZVtzZWxmLl9jb2x1bW5dCi0KLQotZGVmIFBhcnNlSW50ZWdlcih0ZXh0LCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9RmFsc2UpOgotICAiIiJQYXJzZXMgYW4gaW50ZWdlci4KLQotICBBcmdzOgotICAgIHRleHQ6IFRoZSB0ZXh0IHRvIHBhcnNlLgotICAgIGlzX3NpZ25lZDogVHJ1ZSBpZiBhIHNpZ25lZCBpbnRlZ2VyIG11c3QgYmUgcGFyc2VkLgotICAgIGlzX2xvbmc6IFRydWUgaWYgYSBsb25nIGludGVnZXIgbXVzdCBiZSBwYXJzZWQuCi0KLSAgUmV0dXJuczoKLSAgICBUaGUgaW50ZWdlciB2YWx1ZS4KLQotICBSYWlzZXM6Ci0gICAgVmFsdWVFcnJvcjogVGhyb3duIElmZiB0aGUgdGV4dCBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyLgotICAiIiIKLSAgIyBEbyB0aGUgYWN0dWFsIHBhcnNpbmcuIEV4Y2VwdGlvbiBoYW5kbGluZyBpcyBwcm9wYWdhdGVkIHRvIGNhbGxlci4KLSAgdHJ5OgotICAgICMgV2UgZm9yY2UgMzItYml0IHZhbHVlcyB0byBpbnQgYW5kIDY0LWJpdCB2YWx1ZXMgdG8gbG9uZyB0byBtYWtlCi0gICAgIyBhbHRlcm5hdGUgaW1wbGVtZW50YXRpb25zIHdoZXJlIHRoZSBkaXN0aW5jdGlvbiBpcyBtb3JlIHNpZ25pZmljYW50Ci0gICAgIyAoZS5nLiB0aGUgQysrIGltcGxlbWVudGF0aW9uKSBzaW1wbGVyLgotICAgIGlmIGlzX2xvbmc6Ci0gICAgICByZXN1bHQgPSBsb25nKHRleHQsIDApCi0gICAgZWxzZToKLSAgICAgIHJlc3VsdCA9IGludCh0ZXh0LCAwKQotICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgaW50ZWdlcjogJXMnICUgdGV4dCkKLQotICAjIENoZWNrIGlmIHRoZSBpbnRlZ2VyIGlzIHNhbmUuIEV4Y2VwdGlvbnMgaGFuZGxlZCBieSBjYWxsZXJzLgotICBjaGVja2VyID0gX0lOVEVHRVJfQ0hFQ0tFUlNbMiAqIGludChpc19sb25nKSArIGludChpc19zaWduZWQpXQotICBjaGVja2VyLkNoZWNrVmFsdWUocmVzdWx0KQotICByZXR1cm4gcmVzdWx0Ci0KLQotZGVmIFBhcnNlRmxvYXQodGV4dCk6Ci0gICIiIlBhcnNlIGEgZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotCi0gIEFyZ3M6Ci0gICAgdGV4dDogVGV4dCB0byBwYXJzZS4KLQotICBSZXR1cm5zOgotICAgIFRoZSBudW1iZXIgcGFyc2VkLgotCi0gIFJhaXNlczoKLSAgICBWYWx1ZUVycm9yOiBJZiBhIGZsb2F0aW5nIHBvaW50IG51bWJlciBjb3VsZG4ndCBiZSBwYXJzZWQuCi0gICIiIgotICB0cnk6Ci0gICAgIyBBc3N1bWUgUHl0aG9uIGNvbXBhdGlibGUgc3ludGF4LgotICAgIHJldHVybiBmbG9hdCh0ZXh0KQotICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAjIENoZWNrIGFsdGVybmF0aXZlIHNwZWxsaW5ncy4KLSAgICBpZiBfRkxPQVRfSU5GSU5JVFkubWF0Y2godGV4dCk6Ci0gICAgICBpZiB0ZXh0WzBdID09ICctJzoKLSAgICAgICAgcmV0dXJuIGZsb2F0KCctaW5mJykKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBmbG9hdCgnaW5mJykKLSAgICBlbGlmIF9GTE9BVF9OQU4ubWF0Y2godGV4dCk6Ci0gICAgICByZXR1cm4gZmxvYXQoJ25hbicpCi0gICAgZWxzZToKLSAgICAgICMgYXNzdW1lICcxLjBmJyBmb3JtYXQKLSAgICAgIHRyeToKLSAgICAgICAgcmV0dXJuIGZsb2F0KHRleHQucnN0cmlwKCdmJykpCi0gICAgICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignQ291bGRuXCd0IHBhcnNlIGZsb2F0OiAlcycgJSB0ZXh0KQotCi0KLWRlZiBQYXJzZUJvb2wodGV4dCk6Ci0gICIiIlBhcnNlIGEgYm9vbGVhbiB2YWx1ZS4KLQotICBBcmdzOgotICAgIHRleHQ6IFRleHQgdG8gcGFyc2UuCi0KLSAgUmV0dXJuczoKLSAgICBCb29sZWFuIHZhbHVlcyBwYXJzZWQKLQotICBSYWlzZXM6Ci0gICAgVmFsdWVFcnJvcjogSWYgdGV4dCBpcyBub3QgYSB2YWxpZCBib29sZWFuLgotICAiIiIKLSAgaWYgdGV4dCBpbiAoJ3RydWUnLCAndCcsICcxJyk6Ci0gICAgcmV0dXJuIFRydWUKLSAgZWxpZiB0ZXh0IGluICgnZmFsc2UnLCAnZicsICcwJyk6Ci0gICAgcmV0dXJuIEZhbHNlCi0gIGVsc2U6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcignRXhwZWN0ZWQgInRydWUiIG9yICJmYWxzZSIuJykKLQotCi1kZWYgUGFyc2VFbnVtKGZpZWxkLCB2YWx1ZSk6Ci0gICIiIlBhcnNlIGFuIGVudW0gdmFsdWUuCi0KLSAgVGhlIHZhbHVlIGNhbiBiZSBzcGVjaWZpZWQgYnkgYSBudW1iZXIgKHRoZSBlbnVtIHZhbHVlKSwgb3IgYnkKLSAgYSBzdHJpbmcgbGl0ZXJhbCAodGhlIGVudW0gbmFtZSkuCi0KLSAgQXJnczoKLSAgICBmaWVsZDogRW51bSBmaWVsZCBkZXNjcmlwdG9yLgotICAgIHZhbHVlOiBTdHJpbmcgdmFsdWUuCi0KLSAgUmV0dXJuczoKLSAgICBFbnVtIHZhbHVlIG51bWJlci4KLQotICBSYWlzZXM6Ci0gICAgVmFsdWVFcnJvcjogSWYgdGhlIGVudW0gdmFsdWUgY291bGQgbm90IGJlIHBhcnNlZC4KLSAgIiIiCi0gIGVudW1fZGVzY3JpcHRvciA9IGZpZWxkLmVudW1fdHlwZQotICB0cnk6Ci0gICAgbnVtYmVyID0gaW50KHZhbHVlLCAwKQotICBleGNlcHQgVmFsdWVFcnJvcjoKLSAgICAjIElkZW50aWZpZXIuCi0gICAgZW51bV92YWx1ZSA9IGVudW1fZGVzY3JpcHRvci52YWx1ZXNfYnlfbmFtZS5nZXQodmFsdWUsIE5vbmUpCi0gICAgaWYgZW51bV92YWx1ZSBpcyBOb25lOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcigKLSAgICAgICAgICAnRW51bSB0eXBlICIlcyIgaGFzIG5vIHZhbHVlIG5hbWVkICVzLicgJSAoCi0gICAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci5mdWxsX25hbWUsIHZhbHVlKSkKLSAgZWxzZToKLSAgICAjIE51bWVyaWMgdmFsdWUuCi0gICAgZW51bV92YWx1ZSA9IGVudW1fZGVzY3JpcHRvci52YWx1ZXNfYnlfbnVtYmVyLmdldChudW1iZXIsIE5vbmUpCi0gICAgaWYgZW51bV92YWx1ZSBpcyBOb25lOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcigKLSAgICAgICAgICAnRW51bSB0eXBlICIlcyIgaGFzIG5vIHZhbHVlIHdpdGggbnVtYmVyICVkLicgJSAoCi0gICAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci5mdWxsX25hbWUsIG51bWJlcikpCi0gIHJldHVybiBlbnVtX3ZhbHVlLm51bWJlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL21veC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9tb3gucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDI1NzQ2OGUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL21veC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDEgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24yLjQKLSMKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIHRlc3RpbmcuICBUaGUgb3JpZ2luYWwgaXMgYXQ6Ci0jICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3B5bW94LwotCi0iIiJNb3gsIGFuIG9iamVjdC1tb2NraW5nIGZyYW1ld29yayBmb3IgUHl0aG9uLgotCi1Nb3ggd29ya3MgaW4gdGhlIHJlY29yZC1yZXBsYXktdmVyaWZ5IHBhcmFkaWdtLiAgV2hlbiB5b3UgZmlyc3QgY3JlYXRlCi1hIG1vY2sgb2JqZWN0LCBpdCBpcyBpbiByZWNvcmQgbW9kZS4gIFlvdSB0aGVuIHByb2dyYW1tYXRpY2FsbHkgc2V0Ci10aGUgZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIG1vY2sgb2JqZWN0ICh3aGF0IG1ldGhvZHMgYXJlIHRvIGJlCi1jYWxsZWQgb24gaXQsIHdpdGggd2hhdCBwYXJhbWV0ZXJzLCB3aGF0IHRoZXkgc2hvdWxkIHJldHVybiwgYW5kIGluCi13aGF0IG9yZGVyKS4KLQotT25jZSB5b3UgaGF2ZSBzZXQgdXAgdGhlIGV4cGVjdGVkIG1vY2sgYmVoYXZpb3IsIHlvdSBwdXQgaXQgaW4gcmVwbGF5Ci1tb2RlLiAgTm93IHRoZSBtb2NrIHJlc3BvbmRzIHRvIG1ldGhvZCBjYWxscyBqdXN0IGFzIHlvdSB0b2xkIGl0IHRvLgotSWYgYW4gdW5leHBlY3RlZCBtZXRob2QgKG9yIGFuIGV4cGVjdGVkIG1ldGhvZCB3aXRoIHVuZXhwZWN0ZWQKLXBhcmFtZXRlcnMpIGlzIGNhbGxlZCwgdGhlbiBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCi0KLU9uY2UgeW91IGFyZSBkb25lIGludGVyYWN0aW5nIHdpdGggdGhlIG1vY2ssIHlvdSBuZWVkIHRvIHZlcmlmeSB0aGF0Ci1hbGwgdGhlIGV4cGVjdGVkIGludGVyYWN0aW9ucyBvY2N1cnJlZC4gIChNYXliZSB5b3VyIGNvZGUgZXhpdGVkCi1wcmVtYXR1cmVseSB3aXRob3V0IGNhbGxpbmcgc29tZSBjbGVhbnVwIG1ldGhvZCEpICBUaGUgdmVyaWZ5IHBoYXNlCi1lbnN1cmVzIHRoYXQgZXZlcnkgZXhwZWN0ZWQgbWV0aG9kIHdhcyBjYWxsZWQ7IG90aGVyd2lzZSwgYW4gZXhjZXB0aW9uCi13aWxsIGJlIHJhaXNlZC4KLQotU3VnZ2VzdGVkIHVzYWdlIC8gd29ya2Zsb3c6Ci0KLSAgIyBDcmVhdGUgTW94IGZhY3RvcnkKLSAgbXlfbW94ID0gTW94KCkKLQotICAjIENyZWF0ZSBhIG1vY2sgZGF0YSBhY2Nlc3Mgb2JqZWN0Ci0gIG1vY2tfZGFvID0gbXlfbW94LkNyZWF0ZU1vY2soREFPQ2xhc3MpCi0KLSAgIyBTZXQgdXAgZXhwZWN0ZWQgYmVoYXZpb3IKLSAgbW9ja19kYW8uUmV0cmlldmVQZXJzb25XaXRoSWRlbnRpZmllcignMScpLkFuZFJldHVybihwZXJzb24pCi0gIG1vY2tfZGFvLkRlbGV0ZVBlcnNvbihwZXJzb24pCi0KLSAgIyBQdXQgbW9ja3MgaW4gcmVwbGF5IG1vZGUKLSAgbXlfbW94LlJlcGxheUFsbCgpCi0KLSAgIyBJbmplY3QgbW9jayBvYmplY3QgYW5kIHJ1biB0ZXN0Ci0gIGNvbnRyb2xsZXIuU2V0RGFvKG1vY2tfZGFvKQotICBjb250cm9sbGVyLkRlbGV0ZVBlcnNvbkJ5SWQoJzEnKQotCi0gICMgVmVyaWZ5IGFsbCBtZXRob2RzIHdlcmUgY2FsbGVkIGFzIGV4cGVjdGVkCi0gIG15X21veC5WZXJpZnlBbGwoKQotIiIiCi0KLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCi1pbXBvcnQgcmUKLWltcG9ydCB0eXBlcwotaW1wb3J0IHVuaXR0ZXN0Ci0KLWltcG9ydCBzdHVib3V0Ci0KLWNsYXNzIEVycm9yKEFzc2VydGlvbkVycm9yKToKLSAgIiIiQmFzZSBleGNlcHRpb24gZm9yIHRoaXMgbW9kdWxlLiIiIgotCi0gIHBhc3MKLQotCi1jbGFzcyBFeHBlY3RlZE1ldGhvZENhbGxzRXJyb3IoRXJyb3IpOgotICAiIiJSYWlzZWQgd2hlbiBWZXJpZnkoKSBpcyBjYWxsZWQgYmVmb3JlIGFsbCBleHBlY3RlZCBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQKLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkX21ldGhvZHMpOgotICAgICIiIkluaXQgZXhjZXB0aW9uLgotCi0gICAgQXJnczoKLSAgICAgICMgZXhwZWN0ZWRfbWV0aG9kczogQSBzZXF1ZW5jZSBvZiBNb2NrTWV0aG9kIG9iamVjdHMgdGhhdCBzaG91bGQgaGF2ZSBiZWVuCi0gICAgICAjICAgY2FsbGVkLgotICAgICAgZXhwZWN0ZWRfbWV0aG9kczogW01vY2tNZXRob2RdCi0KLSAgICBSYWlzZXM6Ci0gICAgICBWYWx1ZUVycm9yOiBpZiBleHBlY3RlZF9tZXRob2RzIGNvbnRhaW5zIG5vIG1ldGhvZHMuCi0gICAgIiIiCi0KLSAgICBpZiBub3QgZXhwZWN0ZWRfbWV0aG9kczoKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoIlRoZXJlIG11c3QgYmUgYXQgbGVhc3Qgb25lIGV4cGVjdGVkIG1ldGhvZCIpCi0gICAgRXJyb3IuX19pbml0X18oc2VsZikKLSAgICBzZWxmLl9leHBlY3RlZF9tZXRob2RzID0gZXhwZWN0ZWRfbWV0aG9kcwotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIGNhbGxzID0gIlxuIi5qb2luKFsiJTNkLiAgJXMiICUgKGksIG0pCi0gICAgICAgICAgICAgICAgICAgICAgIGZvciBpLCBtIGluIGVudW1lcmF0ZShzZWxmLl9leHBlY3RlZF9tZXRob2RzKV0pCi0gICAgcmV0dXJuICJWZXJpZnk6IEV4cGVjdGVkIG1ldGhvZHMgbmV2ZXIgY2FsbGVkOlxuJXMiICUgKGNhbGxzLCkKLQotCi1jbGFzcyBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKEVycm9yKToKLSAgIiIiUmFpc2VkIHdoZW4gYW4gdW5leHBlY3RlZCBtZXRob2QgaXMgY2FsbGVkLgotCi0gIFRoaXMgY2FuIG9jY3VyIGlmIGEgbWV0aG9kIGlzIGNhbGxlZCB3aXRoIGluY29ycmVjdCBwYXJhbWV0ZXJzLCBvciBvdXQgb2YgdGhlCi0gIHNwZWNpZmllZCBvcmRlci4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHVuZXhwZWN0ZWRfbWV0aG9kLCBleHBlY3RlZCk6Ci0gICAgIiIiSW5pdCBleGNlcHRpb24uCi0KLSAgICBBcmdzOgotICAgICAgIyB1bmV4cGVjdGVkX21ldGhvZDogTW9ja01ldGhvZCB0aGF0IHdhcyBjYWxsZWQgYnV0IHdhcyBub3QgYXQgdGhlIGhlYWQgb2YKLSAgICAgICMgICB0aGUgZXhwZWN0ZWRfbWV0aG9kIHF1ZXVlLgotICAgICAgIyBleHBlY3RlZDogTW9ja01ldGhvZCBvciBVbm9yZGVyZWRHcm91cCB0aGUgbWV0aG9kIHNob3VsZCBoYXZlCi0gICAgICAjICAgYmVlbiBpbi4KLSAgICAgIHVuZXhwZWN0ZWRfbWV0aG9kOiBNb2NrTWV0aG9kCi0gICAgICBleHBlY3RlZDogTW9ja01ldGhvZCBvciBVbm9yZGVyZWRHcm91cAotICAgICIiIgotCi0gICAgRXJyb3IuX19pbml0X18oc2VsZikKLSAgICBzZWxmLl91bmV4cGVjdGVkX21ldGhvZCA9IHVuZXhwZWN0ZWRfbWV0aG9kCi0gICAgc2VsZi5fZXhwZWN0ZWQgPSBleHBlY3RlZAotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiAiVW5leHBlY3RlZCBtZXRob2QgY2FsbDogJXMuICBFeHBlY3Rpbmc6ICVzIiAlIFwKLSAgICAgIChzZWxmLl91bmV4cGVjdGVkX21ldGhvZCwgc2VsZi5fZXhwZWN0ZWQpCi0KLQotY2xhc3MgVW5rbm93bk1ldGhvZENhbGxFcnJvcihFcnJvcik6Ci0gICIiIlJhaXNlZCBpZiBhbiB1bmtub3duIG1ldGhvZCBpcyByZXF1ZXN0ZWQgb2YgdGhlIG1vY2sgb2JqZWN0LiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCB1bmtub3duX21ldGhvZF9uYW1lKToKLSAgICAiIiJJbml0IGV4Y2VwdGlvbi4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHVua25vd25fbWV0aG9kX25hbWU6IE1ldGhvZCBjYWxsIHRoYXQgaXMgbm90IHBhcnQgb2YgdGhlIG1vY2tlZCBjbGFzcydzCi0gICAgICAjICAgcHVibGljIGludGVyZmFjZS4KLSAgICAgIHVua25vd25fbWV0aG9kX25hbWU6IHN0cgotICAgICIiIgotCi0gICAgRXJyb3IuX19pbml0X18oc2VsZikKLSAgICBzZWxmLl91bmtub3duX21ldGhvZF9uYW1lID0gdW5rbm93bl9tZXRob2RfbmFtZQotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiAiTWV0aG9kIGNhbGxlZCBpcyBub3QgYSBtZW1iZXIgb2YgdGhlIG9iamVjdDogJXMiICUgXAotICAgICAgc2VsZi5fdW5rbm93bl9tZXRob2RfbmFtZQotCi0KLWNsYXNzIE1veChvYmplY3QpOgotICAiIiJNb3g6IGEgZmFjdG9yeSBmb3IgY3JlYXRpbmcgbW9jayBvYmplY3RzLiIiIgotCi0gICMgQSBsaXN0IG9mIHR5cGVzIHRoYXQgc2hvdWxkIGJlIHN0dWJiZWQgb3V0IHdpdGggTW9ja09iamVjdHMgKGFzCi0gICMgb3Bwb3NlZCB0byBNb2NrQW55dGhpbmdzKS4KLSAgX1VTRV9NT0NLX09CSkVDVCA9IFt0eXBlcy5DbGFzc1R5cGUsIHR5cGVzLkluc3RhbmNlVHlwZSwgdHlwZXMuTW9kdWxlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlcy5PYmplY3RUeXBlLCB0eXBlcy5UeXBlVHlwZV0KLQotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgIiIiSW5pdGlhbGl6ZSBhIG5ldyBNb3guIiIiCi0KLSAgICBzZWxmLl9tb2NrX29iamVjdHMgPSBbXQotICAgIHNlbGYuc3R1YnMgPSBzdHVib3V0LlN0dWJPdXRGb3JUZXN0aW5nKCkKLQotICBkZWYgQ3JlYXRlTW9jayhzZWxmLCBjbGFzc190b19tb2NrKToKLSAgICAiIiJDcmVhdGUgYSBuZXcgbW9jayBvYmplY3QuCi0KLSAgICBBcmdzOgotICAgICAgIyBjbGFzc190b19tb2NrOiB0aGUgY2xhc3MgdG8gYmUgbW9ja2VkCi0gICAgICBjbGFzc190b19tb2NrOiBjbGFzcwotCi0gICAgUmV0dXJuczoKLSAgICAgIE1vY2tPYmplY3QgdGhhdCBjYW4gYmUgdXNlZCBhcyB0aGUgY2xhc3NfdG9fbW9jayB3b3VsZCBiZS4KLSAgICAiIiIKLQotICAgIG5ld19tb2NrID0gTW9ja09iamVjdChjbGFzc190b19tb2NrKQotICAgIHNlbGYuX21vY2tfb2JqZWN0cy5hcHBlbmQobmV3X21vY2spCi0gICAgcmV0dXJuIG5ld19tb2NrCi0KLSAgZGVmIENyZWF0ZU1vY2tBbnl0aGluZyhzZWxmKToKLSAgICAiIiJDcmVhdGUgYSBtb2NrIHRoYXQgd2lsbCBhY2NlcHQgYW55IG1ldGhvZCBjYWxscy4KLQotICAgIFRoaXMgZG9lcyBub3QgZW5mb3JjZSBhbiBpbnRlcmZhY2UuCi0gICAgIiIiCi0KLSAgICBuZXdfbW9jayA9IE1vY2tBbnl0aGluZygpCi0gICAgc2VsZi5fbW9ja19vYmplY3RzLmFwcGVuZChuZXdfbW9jaykKLSAgICByZXR1cm4gbmV3X21vY2sKLQotICBkZWYgUmVwbGF5QWxsKHNlbGYpOgotICAgICIiIlNldCBhbGwgbW9jayBvYmplY3RzIHRvIHJlcGxheSBtb2RlLiIiIgotCi0gICAgZm9yIG1vY2tfb2JqIGluIHNlbGYuX21vY2tfb2JqZWN0czoKLSAgICAgIG1vY2tfb2JqLl9SZXBsYXkoKQotCi0KLSAgZGVmIFZlcmlmeUFsbChzZWxmKToKLSAgICAiIiJDYWxsIHZlcmlmeSBvbiBhbGwgbW9jayBvYmplY3RzIGNyZWF0ZWQuIiIiCi0KLSAgICBmb3IgbW9ja19vYmogaW4gc2VsZi5fbW9ja19vYmplY3RzOgotICAgICAgbW9ja19vYmouX1ZlcmlmeSgpCi0KLSAgZGVmIFJlc2V0QWxsKHNlbGYpOgotICAgICIiIkNhbGwgcmVzZXQgb24gYWxsIG1vY2sgb2JqZWN0cy4gIFRoaXMgZG9lcyBub3QgdW5zZXQgc3R1YnMuIiIiCi0KLSAgICBmb3IgbW9ja19vYmogaW4gc2VsZi5fbW9ja19vYmplY3RzOgotICAgICAgbW9ja19vYmouX1Jlc2V0KCkKLQotICBkZWYgU3R1Yk91dFdpdGhNb2NrKHNlbGYsIG9iaiwgYXR0cl9uYW1lLCB1c2VfbW9ja19hbnl0aGluZz1GYWxzZSk6Ci0gICAgIiIiUmVwbGFjZSBhIG1ldGhvZCwgYXR0cmlidXRlLCBldGMuIHdpdGggYSBNb2NrLgotCi0gICAgVGhpcyB3aWxsIHJlcGxhY2UgYSBjbGFzcyBvciBtb2R1bGUgd2l0aCBhIE1vY2tPYmplY3QsIGFuZCBldmVyeXRoaW5nIGVsc2UKLSAgICAobWV0aG9kLCBmdW5jdGlvbiwgZXRjKSB3aXRoIGEgTW9ja0FueXRoaW5nLiAgVGhpcyBjYW4gYmUgb3ZlcnJpZGRlbiB0bwotICAgIGFsd2F5cyB1c2UgYSBNb2NrQW55dGhpbmcgYnkgc2V0dGluZyB1c2VfbW9ja19hbnl0aGluZyB0byBUcnVlLgotCi0gICAgQXJnczoKLSAgICAgIG9iajogQSBQeXRob24gb2JqZWN0IChjbGFzcywgbW9kdWxlLCBpbnN0YW5jZSwgY2FsbGFibGUpLgotICAgICAgYXR0cl9uYW1lOiBzdHIuICBUaGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIHRvIHJlcGxhY2Ugd2l0aCBhIG1vY2suCi0gICAgICB1c2VfbW9ja19hbnl0aGluZzogYm9vbC4gVHJ1ZSBpZiBhIE1vY2tBbnl0aGluZyBzaG91bGQgYmUgdXNlZCByZWdhcmRsZXNzCi0gICAgICAgIG9mIHRoZSB0eXBlIG9mIGF0dHJpYnV0ZS4KLSAgICAiIiIKLQotICAgIGF0dHJfdG9fcmVwbGFjZSA9IGdldGF0dHIob2JqLCBhdHRyX25hbWUpCi0gICAgaWYgdHlwZShhdHRyX3RvX3JlcGxhY2UpIGluIHNlbGYuX1VTRV9NT0NLX09CSkVDVCBhbmQgbm90IHVzZV9tb2NrX2FueXRoaW5nOgotICAgICAgc3R1YiA9IHNlbGYuQ3JlYXRlTW9jayhhdHRyX3RvX3JlcGxhY2UpCi0gICAgZWxzZToKLSAgICAgIHN0dWIgPSBzZWxmLkNyZWF0ZU1vY2tBbnl0aGluZygpCi0KLSAgICBzZWxmLnN0dWJzLlNldChvYmosIGF0dHJfbmFtZSwgc3R1YikKLQotICBkZWYgVW5zZXRTdHVicyhzZWxmKToKLSAgICAiIiJSZXN0b3JlIHN0dWJzIHRvIHRoZWlyIG9yaWdpbmFsIHN0YXRlLiIiIgotCi0gICAgc2VsZi5zdHVicy5VbnNldEFsbCgpCi0KLWRlZiBSZXBsYXkoKmFyZ3MpOgotICAiIiJQdXQgbW9ja3MgaW50byBSZXBsYXkgbW9kZS4KLQotICBBcmdzOgotICAgICMgYXJncyBpcyBhbnkgbnVtYmVyIG9mIG1vY2tzIHRvIHB1dCBpbnRvIHJlcGxheSBtb2RlLgotICAiIiIKLQotICBmb3IgbW9jayBpbiBhcmdzOgotICAgIG1vY2suX1JlcGxheSgpCi0KLQotZGVmIFZlcmlmeSgqYXJncyk6Ci0gICIiIlZlcmlmeSBtb2Nrcy4KLQotICBBcmdzOgotICAgICMgYXJncyBpcyBhbnkgbnVtYmVyIG9mIG1vY2tzIHRvIGJlIHZlcmlmaWVkLgotICAiIiIKLQotICBmb3IgbW9jayBpbiBhcmdzOgotICAgIG1vY2suX1ZlcmlmeSgpCi0KLQotZGVmIFJlc2V0KCphcmdzKToKLSAgIiIiUmVzZXQgbW9ja3MuCi0KLSAgQXJnczoKLSAgICAjIGFyZ3MgaXMgYW55IG51bWJlciBvZiBtb2NrcyB0byBiZSByZXNldC4KLSAgIiIiCi0KLSAgZm9yIG1vY2sgaW4gYXJnczoKLSAgICBtb2NrLl9SZXNldCgpCi0KLQotY2xhc3MgTW9ja0FueXRoaW5nOgotICAiIiJBIG1vY2sgdGhhdCBjYW4gYmUgdXNlZCB0byBtb2NrIGFueXRoaW5nLgotCi0gIFRoaXMgaXMgaGVscGZ1bCBmb3IgbW9ja2luZyBjbGFzc2VzIHRoYXQgZG8gbm90IHByb3ZpZGUgYSBwdWJsaWMgaW50ZXJmYWNlLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZik6Ci0gICAgIiIiICIiIgotICAgIHNlbGYuX1Jlc2V0KCkKLQotICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbWV0aG9kX25hbWUpOgotICAgICIiIkludGVyY2VwdCBtZXRob2QgY2FsbHMgb24gdGhpcyBvYmplY3QuCi0KLSAgICAgQSBuZXcgTW9ja01ldGhvZCBpcyByZXR1cm5lZCB0aGF0IGlzIGF3YXJlIG9mIHRoZSBNb2NrQW55dGhpbmcncwotICAgICBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuICBUaGUgY2FsbCB3aWxsIGJlIHJlY29yZGVkIG9yIHJlcGxheWVkCi0gICAgIGJ5IHRoZSBNb2NrTWV0aG9kJ3MgX19jYWxsX18uCi0KLSAgICBBcmdzOgotICAgICAgIyBtZXRob2QgbmFtZTogdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICBtZXRob2RfbmFtZTogc3RyCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBuZXcgTW9ja01ldGhvZCBhd2FyZSBvZiBNb2NrQW55dGhpbmcncyBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuCi0gICAgIiIiCi0KLSAgICByZXR1cm4gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZChtZXRob2RfbmFtZSkKLQotICBkZWYgX0NyZWF0ZU1vY2tNZXRob2Qoc2VsZiwgbWV0aG9kX25hbWUpOgotICAgICIiIkNyZWF0ZSBhIG5ldyBtb2NrIG1ldGhvZCBjYWxsIGFuZCByZXR1cm4gaXQuCi0KLSAgICBBcmdzOgotICAgICAgIyBtZXRob2QgbmFtZTogdGhlIG5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBjYWxsZWQuCi0gICAgICBtZXRob2RfbmFtZTogc3RyCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBuZXcgTW9ja01ldGhvZCBhd2FyZSBvZiBNb2NrQW55dGhpbmcncyBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuCi0gICAgIiIiCi0KLSAgICByZXR1cm4gTW9ja01ldGhvZChtZXRob2RfbmFtZSwgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUpCi0KLSAgZGVmIF9fbm9uemVyb19fKHNlbGYpOgotICAgICIiIlJldHVybiAxIGZvciBub256ZXJvIHNvIHRoZSBtb2NrIGNhbiBiZSB1c2VkIGFzIGEgY29uZGl0aW9uYWwuIiIiCi0KLSAgICByZXR1cm4gMQotCi0gIGRlZiBfX2VxX18oc2VsZiwgcmhzKToKLSAgICAiIiJQcm92aWRlIGN1c3RvbSBsb2dpYyB0byBjb21wYXJlIG9iamVjdHMuIiIiCi0KLSAgICByZXR1cm4gKGlzaW5zdGFuY2UocmhzLCBNb2NrQW55dGhpbmcpIGFuZAotICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUgPT0gcmhzLl9yZXBsYXlfbW9kZSBhbmQKLSAgICAgICAgICAgIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlID09IHJocy5fZXhwZWN0ZWRfY2FsbHNfcXVldWUpCi0KLSAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgotICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIHRvIGNvbXBhcmUgb2JqZWN0cy4iIiIKLQotICAgIHJldHVybiBub3Qgc2VsZiA9PSByaHMKLQotICBkZWYgX1JlcGxheShzZWxmKToKLSAgICAiIiJTdGFydCByZXBsYXlpbmcgZXhwZWN0ZWQgbWV0aG9kIGNhbGxzLiIiIgotCi0gICAgc2VsZi5fcmVwbGF5X21vZGUgPSBUcnVlCi0KLSAgZGVmIF9WZXJpZnkoc2VsZik6Ci0gICAgIiIiVmVyaWZ5IHRoYXQgYWxsIG9mIHRoZSBleHBlY3RlZCBjYWxscyBoYXZlIGJlZW4gbWFkZS4KLQotICAgIFJhaXNlczoKLSAgICAgIEV4cGVjdGVkTWV0aG9kQ2FsbHNFcnJvcjogaWYgdGhlcmUgYXJlIHN0aWxsIG1vcmUgbWV0aG9kIGNhbGxzIGluIHRoZQotICAgICAgICBleHBlY3RlZCBxdWV1ZS4KLSAgICAiIiIKLQotICAgICMgSWYgdGhlIGxpc3Qgb2YgZXhwZWN0ZWQgY2FsbHMgaXMgbm90IGVtcHR5LCByYWlzZSBhbiBleGNlcHRpb24KLSAgICBpZiBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZToKLSAgICAgICMgVGhlIGxhc3QgTXVsdGlwbGVUaW1lc0dyb3VwIGlzIG5vdCBwb3BwZWQgZnJvbSB0aGUgcXVldWUuCi0gICAgICBpZiAobGVuKHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKSA9PSAxIGFuZAotICAgICAgICAgIGlzaW5zdGFuY2Uoc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWVbMF0sIE11bHRpcGxlVGltZXNHcm91cCkgYW5kCi0gICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWVbMF0uSXNTYXRpc2ZpZWQoKSk6Ci0gICAgICAgIHBhc3MKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlIEV4cGVjdGVkTWV0aG9kQ2FsbHNFcnJvcihzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSkKLQotICBkZWYgX1Jlc2V0KHNlbGYpOgotICAgICIiIlJlc2V0IHRoZSBzdGF0ZSBvZiB0aGlzIG1vY2sgdG8gcmVjb3JkIG1vZGUgd2l0aCBhbiBlbXB0eSBxdWV1ZS4iIiIKLQotICAgICMgTWFpbnRhaW4gYSBsaXN0IG9mIG1ldGhvZCBjYWxscyB3ZSBhcmUgZXhwZWN0aW5nCi0gICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUgPSBkZXF1ZSgpCi0KLSAgICAjIE1ha2Ugc3VyZSB3ZSBhcmUgaW4gc2V0dXAgbW9kZSwgbm90IHJlcGxheSBtb2RlCi0gICAgc2VsZi5fcmVwbGF5X21vZGUgPSBGYWxzZQotCi0KLWNsYXNzIE1vY2tPYmplY3QoTW9ja0FueXRoaW5nLCBvYmplY3QpOgotICAiIiJBIG1vY2sgb2JqZWN0IHRoYXQgc2ltdWxhdGVzIHRoZSBwdWJsaWMvcHJvdGVjdGVkIGludGVyZmFjZSBvZiBhIGNsYXNzLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBjbGFzc190b19tb2NrKToKLSAgICAiIiJJbml0aWFsaXplIGEgbW9jayBvYmplY3QuCi0KLSAgICBUaGlzIGRldGVybWluZXMgdGhlIG1ldGhvZHMgYW5kIHByb3BlcnRpZXMgb2YgdGhlIGNsYXNzIGFuZCBzdG9yZXMgdGhlbS4KLQotICAgIEFyZ3M6Ci0gICAgICAjIGNsYXNzX3RvX21vY2s6IGNsYXNzIHRvIGJlIG1vY2tlZAotICAgICAgY2xhc3NfdG9fbW9jazogY2xhc3MKLSAgICAiIiIKLQotICAgICMgVGhpcyBpcyB1c2VkIHRvIGhhY2sgYXJvdW5kIHRoZSBtaXhpbi9pbmhlcml0YW5jZSBvZiBNb2NrQW55dGhpbmcsIHdoaWNoCi0gICAgIyBpcyBub3QgYSBwcm9wZXIgb2JqZWN0IChpdCBjYW4gYmUgYW55dGhpbmcuIDotKQotICAgIE1vY2tBbnl0aGluZy5fX2RpY3RfX1snX19pbml0X18nXShzZWxmKQotCi0gICAgIyBHZXQgYSBsaXN0IG9mIGFsbCB0aGUgcHVibGljIGFuZCBzcGVjaWFsIG1ldGhvZHMgd2Ugc2hvdWxkIG1vY2suCi0gICAgc2VsZi5fa25vd25fbWV0aG9kcyA9IHNldCgpCi0gICAgc2VsZi5fa25vd25fdmFycyA9IHNldCgpCi0gICAgc2VsZi5fY2xhc3NfdG9fbW9jayA9IGNsYXNzX3RvX21vY2sKLSAgICBmb3IgbWV0aG9kIGluIGRpcihjbGFzc190b19tb2NrKToKLSAgICAgIGlmIGNhbGxhYmxlKGdldGF0dHIoY2xhc3NfdG9fbW9jaywgbWV0aG9kKSk6Ci0gICAgICAgIHNlbGYuX2tub3duX21ldGhvZHMuYWRkKG1ldGhvZCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuX2tub3duX3ZhcnMuYWRkKG1ldGhvZCkKLQotICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6Ci0gICAgIiIiSW50ZXJjZXB0IGF0dHJpYnV0ZSByZXF1ZXN0IG9uIHRoaXMgb2JqZWN0LgotCi0gICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBhIHB1YmxpYyBjbGFzcyB2YXJpYWJsZSwgaXQgd2lsbCBiZSByZXR1cm5lZCBhbmQgbm90Ci0gICAgcmVjb3JkZWQgYXMgYSBjYWxsLgotCi0gICAgSWYgdGhlIGF0dHJpYnV0ZSBpcyBub3QgYSB2YXJpYWJsZSwgaXQgaXMgaGFuZGxlZCBsaWtlIGEgbWV0aG9kCi0gICAgY2FsbC4gVGhlIG1ldGhvZCBuYW1lIGlzIGNoZWNrZWQgYWdhaW5zdCB0aGUgc2V0IG9mIG1vY2thYmxlCi0gICAgbWV0aG9kcywgYW5kIGEgbmV3IE1vY2tNZXRob2QgaXMgcmV0dXJuZWQgdGhhdCBpcyBhd2FyZSBvZiB0aGUKLSAgICBNb2NrT2JqZWN0J3Mgc3RhdGUgKHJlY29yZCBvciByZXBsYXkpLiAgVGhlIGNhbGwgd2lsbCBiZSByZWNvcmRlZAotICAgIG9yIHJlcGxheWVkIGJ5IHRoZSBNb2NrTWV0aG9kJ3MgX19jYWxsX18uCi0KLSAgICBBcmdzOgotICAgICAgIyBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgYXR0cmlidXRlIGJlaW5nIHJlcXVlc3RlZC4KLSAgICAgIG5hbWU6IHN0cgotCi0gICAgUmV0dXJuczoKLSAgICAgIEVpdGhlciBhIGNsYXNzIHZhcmlhYmxlIG9yIGEgbmV3IE1vY2tNZXRob2QgdGhhdCBpcyBhd2FyZSBvZiB0aGUgc3RhdGUKLSAgICAgIG9mIHRoZSBtb2NrIChyZWNvcmQgb3IgcmVwbGF5KS4KLQotICAgIFJhaXNlczoKLSAgICAgIFVua25vd25NZXRob2RDYWxsRXJyb3IgaWYgdGhlIE1vY2tPYmplY3QgZG9lcyBub3QgbW9jayB0aGUgcmVxdWVzdGVkCi0gICAgICAgICAgbWV0aG9kLgotICAgICIiIgotCi0gICAgaWYgbmFtZSBpbiBzZWxmLl9rbm93bl92YXJzOgotICAgICAgcmV0dXJuIGdldGF0dHIoc2VsZi5fY2xhc3NfdG9fbW9jaywgbmFtZSkKLQotICAgIGlmIG5hbWUgaW4gc2VsZi5fa25vd25fbWV0aG9kczoKLSAgICAgIHJldHVybiBzZWxmLl9DcmVhdGVNb2NrTWV0aG9kKG5hbWUpCi0KLSAgICByYWlzZSBVbmtub3duTWV0aG9kQ2FsbEVycm9yKG5hbWUpCi0KLSAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgotICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIHRvIGNvbXBhcmUgb2JqZWN0cy4iIiIKLQotICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tPYmplY3QpIGFuZAotICAgICAgICAgICAgc2VsZi5fY2xhc3NfdG9fbW9jayA9PSByaHMuX2NsYXNzX3RvX21vY2sgYW5kCi0gICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSA9PSByaHMuX3JlcGxheV9tb2RlIGFuZAotICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUgPT0gcmhzLl9leHBlY3RlZF9jYWxsc19xdWV1ZSkKLQotICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6Ci0gICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgZm9yIG1vY2tpbmcgY2xhc3NlcyB0aGF0IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50LgotCi0gICAgQXJnczoKLSAgICAgIGtleTogS2V5IHRvIHNldCB0aGUgdmFsdWUgZm9yLgotICAgICAgdmFsdWU6IFZhbHVlIHRvIHNldC4KLQotICAgIFJldHVybnM6Ci0gICAgICBFeHBlY3RlZCByZXR1cm4gdmFsdWUgaW4gcmVwbGF5IG1vZGUuICBBIE1vY2tNZXRob2Qgb2JqZWN0IGZvciB0aGUKLSAgICAgIF9fc2V0aXRlbV9fIG1ldGhvZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGlmIG5vdCBpbiByZXBsYXkgbW9kZS4KLQotICAgIFJhaXNlczoKLSAgICAgIFR5cGVFcnJvciBpZiB0aGUgdW5kZXJseWluZyBjbGFzcyBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudC4KLSAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBleHBlY3QgdGhlIGNhbGwgdG8KLSAgICAgICAgX19zZXRpdGVtX18uCi0KLSAgICAiIiIKLSAgICBzZXRpdGVtID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fc2V0aXRlbV9fJywgTm9uZSkKLQotICAgICMgVmVyaWZ5IHRoZSBjbGFzcyBzdXBwb3J0cyBpdGVtIGFzc2lnbm1lbnQuCi0gICAgaWYgc2V0aXRlbSBpcyBOb25lOgotICAgICAgcmFpc2UgVHlwZUVycm9yKCdvYmplY3QgZG9lcyBub3Qgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQnKQotCi0gICAgIyBJZiB3ZSBhcmUgaW4gcmVwbGF5IG1vZGUgdGhlbiBzaW1wbHkgY2FsbCB0aGUgbW9jayBfX3NldGl0ZW1fXyBtZXRob2QuCi0gICAgaWYgc2VsZi5fcmVwbGF5X21vZGU6Ci0gICAgICByZXR1cm4gTW9ja01ldGhvZCgnX19zZXRpdGVtX18nLCBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYuX3JlcGxheV9tb2RlKShrZXksIHZhbHVlKQotCi0KLSAgICAjIE90aGVyd2lzZSwgY3JlYXRlIGEgbW9jayBtZXRob2QgX19zZXRpdGVtX18uCi0gICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QoJ19fc2V0aXRlbV9fJykoa2V5LCB2YWx1ZSkKLQotICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKLSAgICAiIiJQcm92aWRlIGN1c3RvbSBsb2dpYyBmb3IgbW9ja2luZyBjbGFzc2VzIHRoYXQgYXJlIHN1YnNjcmlwdGFibGUuCi0KLSAgICBBcmdzOgotICAgICAga2V5OiBLZXkgdG8gcmV0dXJuIHRoZSB2YWx1ZSBmb3IuCi0KLSAgICBSZXR1cm5zOgotICAgICAgRXhwZWN0ZWQgcmV0dXJuIHZhbHVlIGluIHJlcGxheSBtb2RlLiAgQSBNb2NrTWV0aG9kIG9iamVjdCBmb3IgdGhlCi0gICAgICBfX2dldGl0ZW1fXyBtZXRob2QgdGhhdCBoYXMgYWxyZWFkeSBiZWVuIGNhbGxlZCBpZiBub3QgaW4gcmVwbGF5IG1vZGUuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBUeXBlRXJyb3IgaWYgdGhlIHVuZGVybHlpbmcgY2xhc3MgaXMgbm90IHN1YnNjcmlwdGFibGUuCi0gICAgICBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIGlmIHRoZSBvYmplY3QgZG9lcyBub3QgZXhwZWN0IHRoZSBjYWxsIHRvCi0gICAgICAgIF9fc2V0aXRlbV9fLgotCi0gICAgIiIiCi0gICAgZ2V0aXRlbSA9IHNlbGYuX2NsYXNzX3RvX21vY2suX19kaWN0X18uZ2V0KCdfX2dldGl0ZW1fXycsIE5vbmUpCi0KLSAgICAjIFZlcmlmeSB0aGUgY2xhc3Mgc3VwcG9ydHMgaXRlbSBhc3NpZ25tZW50LgotICAgIGlmIGdldGl0ZW0gaXMgTm9uZToKLSAgICAgIHJhaXNlIFR5cGVFcnJvcigndW5zdWJzY3JpcHRhYmxlIG9iamVjdCcpCi0KLSAgICAjIElmIHdlIGFyZSBpbiByZXBsYXkgbW9kZSB0aGVuIHNpbXBseSBjYWxsIHRoZSBtb2NrIF9fZ2V0aXRlbV9fIG1ldGhvZC4KLSAgICBpZiBzZWxmLl9yZXBsYXlfbW9kZToKLSAgICAgIHJldHVybiBNb2NrTWV0aG9kKCdfX2dldGl0ZW1fXycsIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUpKGtleSkKLQotCi0gICAgIyBPdGhlcndpc2UsIGNyZWF0ZSBhIG1vY2sgbWV0aG9kIF9fZ2V0aXRlbV9fLgotICAgIHJldHVybiBzZWxmLl9DcmVhdGVNb2NrTWV0aG9kKCdfX2dldGl0ZW1fXycpKGtleSkKLQotICBkZWYgX19jYWxsX18oc2VsZiwgKnBhcmFtcywgKipuYW1lZF9wYXJhbXMpOgotICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBhcmUgY2FsbGFibGUuIiIiCi0KLSAgICAjIFZlcmlmeSB0aGUgY2xhc3Mgd2UgYXJlIG1vY2tpbmcgaXMgY2FsbGFibGUKLSAgICBjYWxsYWJsZSA9IHNlbGYuX2NsYXNzX3RvX21vY2suX19kaWN0X18uZ2V0KCdfX2NhbGxfXycsIE5vbmUpCi0gICAgaWYgY2FsbGFibGUgaXMgTm9uZToKLSAgICAgIHJhaXNlIFR5cGVFcnJvcignTm90IGNhbGxhYmxlJykKLQotICAgICMgQmVjYXVzZSB0aGUgY2FsbCBpcyBoYXBwZW5pbmcgZGlyZWN0bHkgb24gdGhpcyBvYmplY3QgaW5zdGVhZCBvZiBhIG1ldGhvZCwKLSAgICAjIHRoZSBjYWxsIG9uIHRoZSBtb2NrIG1ldGhvZCBpcyBtYWRlIHJpZ2h0IGhlcmUKLSAgICBtb2NrX21ldGhvZCA9IHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QoJ19fY2FsbF9fJykKLSAgICByZXR1cm4gbW9ja19tZXRob2QoKnBhcmFtcywgKipuYW1lZF9wYXJhbXMpCi0KLSAgQHByb3BlcnR5Ci0gIGRlZiBfX2NsYXNzX18oc2VsZik6Ci0gICAgIiIiUmV0dXJuIHRoZSBjbGFzcyB0aGF0IGlzIGJlaW5nIG1vY2tlZC4iIiIKLQotICAgIHJldHVybiBzZWxmLl9jbGFzc190b19tb2NrCi0KLQotY2xhc3MgTW9ja01ldGhvZChvYmplY3QpOgotICAiIiJDYWxsYWJsZSBtb2NrIG1ldGhvZC4KLQotICBBIE1vY2tNZXRob2Qgc2hvdWxkIGFjdCBleGFjdGx5IGxpa2UgdGhlIG1ldGhvZCBpdCBtb2NrcywgYWNjZXB0aW5nIHBhcmFtZXRlcnMKLSAgYW5kIHJldHVybmluZyBhIHZhbHVlLCBvciB0aHJvd2luZyBhbiBleGNlcHRpb24gKGFzIHNwZWNpZmllZCkuICBXaGVuIHRoaXMKLSAgbWV0aG9kIGlzIGNhbGxlZCwgaXQgY2FuIG9wdGlvbmFsbHkgdmVyaWZ5IHdoZXRoZXIgdGhlIGNhbGxlZCBtZXRob2QgKG5hbWUgYW5kCi0gIHNpZ25hdHVyZSkgbWF0Y2hlcyB0aGUgZXhwZWN0ZWQgbWV0aG9kLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgbWV0aG9kX25hbWUsIGNhbGxfcXVldWUsIHJlcGxheV9tb2RlKToKLSAgICAiIiJDb25zdHJ1Y3QgYSBuZXcgbW9jayBtZXRob2QuCi0KLSAgICBBcmdzOgotICAgICAgIyBtZXRob2RfbmFtZTogdGhlIG5hbWUgb2YgdGhlIG1ldGhvZAotICAgICAgIyBjYWxsX3F1ZXVlOiBkZXF1ZSBvZiBjYWxscywgdmVyaWZ5IHRoaXMgY2FsbCBhZ2FpbnN0IHRoZSBoZWFkLCBvciBhZGQKLSAgICAgICMgICAgIHRoaXMgY2FsbCB0byB0aGUgcXVldWUuCi0gICAgICAjIHJlcGxheV9tb2RlOiBGYWxzZSBpZiB3ZSBhcmUgcmVjb3JkaW5nLCBUcnVlIGlmIHdlIGFyZSB2ZXJpZnlpbmcgY2FsbHMKLSAgICAgICMgICAgIGFnYWluc3QgdGhlIGNhbGwgcXVldWUuCi0gICAgICBtZXRob2RfbmFtZTogc3RyCi0gICAgICBjYWxsX3F1ZXVlOiBsaXN0IG9yIGRlcXVlCi0gICAgICByZXBsYXlfbW9kZTogYm9vbAotICAgICIiIgotCi0gICAgc2VsZi5fbmFtZSA9IG1ldGhvZF9uYW1lCi0gICAgc2VsZi5fY2FsbF9xdWV1ZSA9IGNhbGxfcXVldWUKLSAgICBpZiBub3QgaXNpbnN0YW5jZShjYWxsX3F1ZXVlLCBkZXF1ZSk6Ci0gICAgICBzZWxmLl9jYWxsX3F1ZXVlID0gZGVxdWUoc2VsZi5fY2FsbF9xdWV1ZSkKLSAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IHJlcGxheV9tb2RlCi0KLSAgICBzZWxmLl9wYXJhbXMgPSBOb25lCi0gICAgc2VsZi5fbmFtZWRfcGFyYW1zID0gTm9uZQotICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IE5vbmUKLSAgICBzZWxmLl9leGNlcHRpb24gPSBOb25lCi0gICAgc2VsZi5fc2lkZV9lZmZlY3RzID0gTm9uZQotCi0gIGRlZiBfX2NhbGxfXyhzZWxmLCAqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcyk6Ci0gICAgIiIiTG9nIHBhcmFtZXRlcnMgYW5kIHJldHVybiB0aGUgc3BlY2lmaWVkIHJldHVybiB2YWx1ZS4KLQotICAgIElmIHRoZSBNb2NrKEFueXRoaW5nL09iamVjdCkgYXNzb2NpYXRlZCB3aXRoIHRoaXMgY2FsbCBpcyBpbiByZWNvcmQgbW9kZSwKLSAgICB0aGlzIE1vY2tNZXRob2Qgd2lsbCBiZSBwdXNoZWQgb250byB0aGUgZXhwZWN0ZWQgY2FsbCBxdWV1ZS4gIElmIHRoZSBtb2NrCi0gICAgaXMgaW4gcmVwbGF5IG1vZGUsIHRoaXMgd2lsbCBwb3AgYSBNb2NrTWV0aG9kIG9mZiB0aGUgdG9wIG9mIHRoZSBxdWV1ZSBhbmQKLSAgICB2ZXJpZnkgdGhpcyBjYWxsIGlzIGVxdWFsIHRvIHRoZSBleHBlY3RlZCBjYWxsLgotCi0gICAgUmFpc2VzOgotICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGwgaWYgdGhpcyBjYWxsIGlzIHN1cHBvc2VkIHRvIG1hdGNoIGFuIGV4cGVjdGVkIG1ldGhvZAotICAgICAgICBjYWxsIGFuZCBpdCBkb2VzIG5vdC4KLSAgICAiIiIKLQotICAgIHNlbGYuX3BhcmFtcyA9IHBhcmFtcwotICAgIHNlbGYuX25hbWVkX3BhcmFtcyA9IG5hbWVkX3BhcmFtcwotCi0gICAgaWYgbm90IHNlbGYuX3JlcGxheV9tb2RlOgotICAgICAgc2VsZi5fY2FsbF9xdWV1ZS5hcHBlbmQoc2VsZikKLSAgICAgIHJldHVybiBzZWxmCi0KLSAgICBleHBlY3RlZF9tZXRob2QgPSBzZWxmLl9WZXJpZnlNZXRob2RDYWxsKCkKLQotICAgIGlmIGV4cGVjdGVkX21ldGhvZC5fc2lkZV9lZmZlY3RzOgotICAgICAgZXhwZWN0ZWRfbWV0aG9kLl9zaWRlX2VmZmVjdHMoKnBhcmFtcywgKipuYW1lZF9wYXJhbXMpCi0KLSAgICBpZiBleHBlY3RlZF9tZXRob2QuX2V4Y2VwdGlvbjoKLSAgICAgIHJhaXNlIGV4cGVjdGVkX21ldGhvZC5fZXhjZXB0aW9uCi0KLSAgICByZXR1cm4gZXhwZWN0ZWRfbWV0aG9kLl9yZXR1cm5fdmFsdWUKLQotICBkZWYgX19nZXRhdHRyX18oc2VsZiwgbmFtZSk6Ci0gICAgIiIiUmFpc2UgYW4gQXR0cmlidXRlRXJyb3Igd2l0aCBhIGhlbHBmdWwgbWVzc2FnZS4iIiIKLQotICAgIHJhaXNlIEF0dHJpYnV0ZUVycm9yKCdNb2NrTWV0aG9kIGhhcyBubyBhdHRyaWJ1dGUgIiVzIi4gJwotICAgICAgICAnRGlkIHlvdSByZW1lbWJlciB0byBwdXQgeW91ciBtb2NrcyBpbiByZXBsYXkgbW9kZT8nICUgbmFtZSkKLQotICBkZWYgX1BvcE5leHRNZXRob2Qoc2VsZik6Ci0gICAgIiIiUG9wIHRoZSBuZXh0IG1ldGhvZCBmcm9tIG91ciBjYWxsIHF1ZXVlLiIiIgotICAgIHRyeToKLSAgICAgIHJldHVybiBzZWxmLl9jYWxsX3F1ZXVlLnBvcGxlZnQoKQotICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihzZWxmLCBOb25lKQotCi0gIGRlZiBfVmVyaWZ5TWV0aG9kQ2FsbChzZWxmKToKLSAgICAiIiJWZXJpZnkgdGhlIGNhbGxlZCBtZXRob2QgaXMgZXhwZWN0ZWQuCi0KLSAgICBUaGlzIGNhbiBiZSBhbiBvcmRlcmVkIG1ldGhvZCwgb3IgcGFydCBvZiBhbiB1bm9yZGVyZWQgc2V0LgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBleHBlY3RlZCBtb2NrIG1ldGhvZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsIGlmIHRoZSBtZXRob2QgY2FsbGVkIHdhcyBub3QgZXhwZWN0ZWQuCi0gICAgIiIiCi0KLSAgICBleHBlY3RlZCA9IHNlbGYuX1BvcE5leHRNZXRob2QoKQotCi0gICAgIyBMb29wIGhlcmUsIGJlY2F1c2Ugd2UgbWlnaHQgaGF2ZSBhIE1ldGhvZEdyb3VwIGZvbGxvd2VkIGJ5IGFub3RoZXIKLSAgICAjIGdyb3VwLgotICAgIHdoaWxlIGlzaW5zdGFuY2UoZXhwZWN0ZWQsIE1ldGhvZEdyb3VwKToKLSAgICAgIGV4cGVjdGVkLCBtZXRob2QgPSBleHBlY3RlZC5NZXRob2RDYWxsZWQoc2VsZikKLSAgICAgIGlmIG1ldGhvZCBpcyBub3QgTm9uZToKLSAgICAgICAgcmV0dXJuIG1ldGhvZAotCi0gICAgIyBUaGlzIGlzIGEgbW9jayBtZXRob2QsIHNvIGp1c3QgY2hlY2sgZXF1YWxpdHkuCi0gICAgaWYgZXhwZWN0ZWQgIT0gc2VsZjoKLSAgICAgIHJhaXNlIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3Ioc2VsZiwgZXhwZWN0ZWQpCi0KLSAgICByZXR1cm4gZXhwZWN0ZWQKLQotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICBwYXJhbXMgPSAnLCAnLmpvaW4oCi0gICAgICAgIFtyZXByKHApIGZvciBwIGluIHNlbGYuX3BhcmFtcyBvciBbXV0gKwotICAgICAgICBbJyVzPSVyJyAlIHggZm9yIHggaW4gc29ydGVkKChzZWxmLl9uYW1lZF9wYXJhbXMgb3Ige30pLml0ZW1zKCkpXSkKLSAgICBkZXNjID0gIiVzKCVzKSAtPiAlciIgJSAoc2VsZi5fbmFtZSwgcGFyYW1zLCBzZWxmLl9yZXR1cm5fdmFsdWUpCi0gICAgcmV0dXJuIGRlc2MKLQotICBkZWYgX19lcV9fKHNlbGYsIHJocyk6Ci0gICAgIiIiVGVzdCB3aGV0aGVyIHRoaXMgTW9ja01ldGhvZCBpcyBlcXVpdmFsZW50IHRvIGFub3RoZXIgTW9ja01ldGhvZC4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAotICAgICAgcmhzOiBNb2NrTWV0aG9kCi0gICAgIiIiCi0KLSAgICByZXR1cm4gKGlzaW5zdGFuY2UocmhzLCBNb2NrTWV0aG9kKSBhbmQKLSAgICAgICAgICAgIHNlbGYuX25hbWUgPT0gcmhzLl9uYW1lIGFuZAotICAgICAgICAgICAgc2VsZi5fcGFyYW1zID09IHJocy5fcGFyYW1zIGFuZAotICAgICAgICAgICAgc2VsZi5fbmFtZWRfcGFyYW1zID09IHJocy5fbmFtZWRfcGFyYW1zKQotCi0gIGRlZiBfX25lX18oc2VsZiwgcmhzKToKLSAgICAiIiJUZXN0IHdoZXRoZXIgdGhpcyBNb2NrTWV0aG9kIGlzIG5vdCBlcXVpdmFsZW50IHRvIGFub3RoZXIgTW9ja01ldGhvZC4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAotICAgICAgcmhzOiBNb2NrTWV0aG9kCi0gICAgIiIiCi0KLSAgICByZXR1cm4gbm90IHNlbGYgPT0gcmhzCi0KLSAgZGVmIEdldFBvc3NpYmxlR3JvdXAoc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhIHBvc3NpYmxlIGdyb3VwIGZyb20gdGhlIGVuZCBvZiB0aGUgY2FsbCBxdWV1ZSBvciBOb25lIGlmIG5vCi0gICAgb3RoZXIgbWV0aG9kcyBhcmUgb24gdGhlIHN0YWNrLgotICAgICIiIgotCi0gICAgIyBSZW1vdmUgdGhpcyBtZXRob2QgZnJvbSB0aGUgdGFpbCBvZiB0aGUgcXVldWUgc28gd2UgY2FuIGFkZCBpdCB0byBhIGdyb3VwLgotICAgIHRoaXNfbWV0aG9kID0gc2VsZi5fY2FsbF9xdWV1ZS5wb3AoKQotICAgIGFzc2VydCB0aGlzX21ldGhvZCA9PSBzZWxmCi0KLSAgICAjIERldGVybWluZSBpZiB0aGUgdGFpbCBvZiB0aGUgcXVldWUgaXMgYSBncm91cCwgb3IganVzdCBhIHJlZ3VsYXIgb3JkZXJlZAotICAgICMgbW9jayBtZXRob2QuCi0gICAgZ3JvdXAgPSBOb25lCi0gICAgdHJ5OgotICAgICAgZ3JvdXAgPSBzZWxmLl9jYWxsX3F1ZXVlWy0xXQotICAgIGV4Y2VwdCBJbmRleEVycm9yOgotICAgICAgcGFzcwotCi0gICAgcmV0dXJuIGdyb3VwCi0KLSAgZGVmIF9DaGVja0FuZENyZWF0ZU5ld0dyb3VwKHNlbGYsIGdyb3VwX25hbWUsIGdyb3VwX2NsYXNzKToKLSAgICAiIiJDaGVja3MgaWYgdGhlIGxhc3QgbWV0aG9kIChhIHBvc3NpYmxlIGdyb3VwKSBpcyBhbiBpbnN0YW5jZSBvZiBvdXIKLSAgICBncm91cF9jbGFzcy4gQWRkcyB0aGUgY3VycmVudCBtZXRob2QgdG8gdGhpcyBncm91cCBvciBjcmVhdGVzIGEgbmV3IG9uZS4KLQotICAgIEFyZ3M6Ci0KLSAgICAgIGdyb3VwX25hbWU6IHRoZSBuYW1lIG9mIHRoZSBncm91cC4KLSAgICAgIGdyb3VwX2NsYXNzOiB0aGUgY2xhc3MgdXNlZCB0byBjcmVhdGUgaW5zdGFuY2Ugb2YgdGhpcyBuZXcgZ3JvdXAKLSAgICAiIiIKLSAgICBncm91cCA9IHNlbGYuR2V0UG9zc2libGVHcm91cCgpCi0KLSAgICAjIElmIHRoaXMgaXMgYSBncm91cCwgYW5kIGl0IGlzIHRoZSBjb3JyZWN0IGdyb3VwLCBhZGQgdGhlIG1ldGhvZC4KLSAgICBpZiBpc2luc3RhbmNlKGdyb3VwLCBncm91cF9jbGFzcykgYW5kIGdyb3VwLmdyb3VwX25hbWUoKSA9PSBncm91cF9uYW1lOgotICAgICAgZ3JvdXAuQWRkTWV0aG9kKHNlbGYpCi0gICAgICByZXR1cm4gc2VsZgotCi0gICAgIyBDcmVhdGUgYSBuZXcgZ3JvdXAgYW5kIGFkZCB0aGUgbWV0aG9kLgotICAgIG5ld19ncm91cCA9IGdyb3VwX2NsYXNzKGdyb3VwX25hbWUpCi0gICAgbmV3X2dyb3VwLkFkZE1ldGhvZChzZWxmKQotICAgIHNlbGYuX2NhbGxfcXVldWUuYXBwZW5kKG5ld19ncm91cCkKLSAgICByZXR1cm4gc2VsZgotCi0gIGRlZiBJbkFueU9yZGVyKHNlbGYsIGdyb3VwX25hbWU9ImRlZmF1bHQiKToKLSAgICAiIiJNb3ZlIHRoaXMgbWV0aG9kIGludG8gYSBncm91cCBvZiB1bm9yZGVyZWQgY2FsbHMuCi0KLSAgICBBIGdyb3VwIG9mIHVub3JkZXJlZCBjYWxscyBtdXN0IGJlIGRlZmluZWQgdG9nZXRoZXIsIGFuZCBtdXN0IGJlIGV4ZWN1dGVkCi0gICAgaW4gZnVsbCBiZWZvcmUgdGhlIG5leHQgZXhwZWN0ZWQgbWV0aG9kIGNhbiBiZSBjYWxsZWQuICBUaGVyZSBjYW4gYmUKLSAgICBtdWx0aXBsZSBncm91cHMgdGhhdCBhcmUgZXhwZWN0ZWQgc2VyaWFsbHksIGlmIHRoZXkgYXJlIGdpdmVuCi0gICAgZGlmZmVyZW50IGdyb3VwIG5hbWVzLiAgVGhlIHNhbWUgZ3JvdXAgbmFtZSBjYW4gYmUgcmV1c2VkIGlmIHRoZXJlIGlzIGEKLSAgICBzdGFuZGFyZCBtZXRob2QgY2FsbCwgb3IgYSBncm91cCB3aXRoIGEgZGlmZmVyZW50IG5hbWUsIHNwbGljZWQgYmV0d2VlbgotICAgIHVzYWdlcy4KLQotICAgIEFyZ3M6Ci0gICAgICBncm91cF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgdW5vcmRlcmVkIGdyb3VwLgotCi0gICAgUmV0dXJuczoKLSAgICAgIHNlbGYKLSAgICAiIiIKLSAgICByZXR1cm4gc2VsZi5fQ2hlY2tBbmRDcmVhdGVOZXdHcm91cChncm91cF9uYW1lLCBVbm9yZGVyZWRHcm91cCkKLQotICBkZWYgTXVsdGlwbGVUaW1lcyhzZWxmLCBncm91cF9uYW1lPSJkZWZhdWx0Iik6Ci0gICAgIiIiTW92ZSB0aGlzIG1ldGhvZCBpbnRvIGdyb3VwIG9mIGNhbGxzIHdoaWNoIG1heSBiZSBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0KLSAgICBBIGdyb3VwIG9mIHJlcGVhdGluZyBjYWxscyBtdXN0IGJlIGRlZmluZWQgdG9nZXRoZXIsIGFuZCBtdXN0IGJlIGV4ZWN1dGVkIGluCi0gICAgZnVsbCBiZWZvcmUgdGhlIG5leHQgZXhwZWN0ZWQgbWVodG9kIGNhbiBiZSBjYWxsZWQuCi0KLSAgICBBcmdzOgotICAgICAgZ3JvdXBfbmFtZTogdGhlIG5hbWUgb2YgdGhlIHVub3JkZXJlZCBncm91cC4KLQotICAgIFJldHVybnM6Ci0gICAgICBzZWxmCi0gICAgIiIiCi0gICAgcmV0dXJuIHNlbGYuX0NoZWNrQW5kQ3JlYXRlTmV3R3JvdXAoZ3JvdXBfbmFtZSwgTXVsdGlwbGVUaW1lc0dyb3VwKQotCi0gIGRlZiBBbmRSZXR1cm4oc2VsZiwgcmV0dXJuX3ZhbHVlKToKLSAgICAiIiJTZXQgdGhlIHZhbHVlIHRvIHJldHVybiB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHJldHVybl92YWx1ZSBjYW4gYmUgYW55dGhpbmcuCi0gICAgIiIiCi0KLSAgICBzZWxmLl9yZXR1cm5fdmFsdWUgPSByZXR1cm5fdmFsdWUKLSAgICByZXR1cm4gcmV0dXJuX3ZhbHVlCi0KLSAgZGVmIEFuZFJhaXNlKHNlbGYsIGV4Y2VwdGlvbik6Ci0gICAgIiIiU2V0IHRoZSBleGNlcHRpb24gdG8gcmFpc2Ugd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0KLSAgICBBcmdzOgotICAgICAgIyBleGNlcHRpb246IHRoZSBleGNlcHRpb24gdG8gcmFpc2Ugd2hlbiB0aGlzIG1ldGhvZCBpcyBjYWxsZWQuCi0gICAgICBleGNlcHRpb246IEV4Y2VwdGlvbgotICAgICIiIgotCi0gICAgc2VsZi5fZXhjZXB0aW9uID0gZXhjZXB0aW9uCi0KLSAgZGVmIFdpdGhTaWRlRWZmZWN0cyhzZWxmLCBzaWRlX2VmZmVjdHMpOgotICAgICIiIlNldCB0aGUgc2lkZSBlZmZlY3RzIHRoYXQgYXJlIHNpbXVsYXRlZCB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQotICAgIEFyZ3M6Ci0gICAgICBzaWRlX2VmZmVjdHM6IEEgY2FsbGFibGUgd2hpY2ggbW9kaWZpZXMgdGhlIHBhcmFtZXRlcnMgb3Igb3RoZXIgcmVsZXZhbnQKLSAgICAgICAgc3RhdGUgd2hpY2ggYSBnaXZlbiB0ZXN0IGNhc2UgZGVwZW5kcyBvbi4KLQotICAgIFJldHVybnM6Ci0gICAgICBTZWxmIGZvciBjaGFpbmluZyB3aXRoIEFuZFJldHVybiBhbmQgQW5kUmFpc2UuCi0gICAgIiIiCi0gICAgc2VsZi5fc2lkZV9lZmZlY3RzID0gc2lkZV9lZmZlY3RzCi0gICAgcmV0dXJuIHNlbGYKLQotY2xhc3MgQ29tcGFyYXRvcjoKLSAgIiIiQmFzZSBjbGFzcyBmb3IgYWxsIE1veCBjb21wYXJhdG9ycy4KLQotICBBIENvbXBhcmF0b3IgY2FuIGJlIHVzZWQgYXMgYSBwYXJhbWV0ZXIgdG8gYSBtb2NrZWQgbWV0aG9kIHdoZW4gdGhlIGV4YWN0Ci0gIHZhbHVlIGlzIG5vdCBrbm93bi4gIEZvciBleGFtcGxlLCB0aGUgY29kZSB5b3UgYXJlIHRlc3RpbmcgbWlnaHQgYnVpbGQgdXAgYQotICBsb25nIFNRTCBzdHJpbmcgdGhhdCBpcyBwYXNzZWQgdG8geW91ciBtb2NrIERBTy4gWW91J3JlIG9ubHkgaW50ZXJlc3RlZCB0aGF0Ci0gIHRoZSBJTiBjbGF1c2UgY29udGFpbnMgdGhlIHByb3BlciBwcmltYXJ5IGtleXMsIHNvIHlvdSBjYW4gc2V0IHlvdXIgbW9jawotICB1cCBhcyBmb2xsb3dzOgotCi0gIG1vY2tfZGFvLlJ1blF1ZXJ5KFN0ckNvbnRhaW5zKCdJTiAoMSwgMiwgNCwgNSknKSkuQW5kUmV0dXJuKG1vY2tfcmVzdWx0KQotCi0gIE5vdyB3aGF0ZXZlciBxdWVyeSBpcyBwYXNzZWQgaW4gbXVzdCBjb250YWluIHRoZSBzdHJpbmcgJ0lOICgxLCAyLCA0LCA1KScuCi0KLSAgQSBDb21wYXJhdG9yIG1heSByZXBsYWNlIG9uZSBvciBtb3JlIHBhcmFtZXRlcnMsIGZvciBleGFtcGxlOgotICAjIHJldHVybiBhdCBtb3N0IDEwIHJvd3MKLSAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ1NFTEVDVCcpLCAxMCkKLQotICBvcgotCi0gICMgUmV0dXJuIHNvbWUgbm9uLWRldGVybWluaXN0aWMgbnVtYmVyIG9mIHJvd3MKLSAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ1NFTEVDVCcpLCBJc0EoaW50KSkKLSAgIiIiCi0KLSAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgotICAgICIiIlNwZWNpYWwgZXF1YWxzIG1ldGhvZCB0aGF0IGFsbCBjb21wYXJhdG9ycyBtdXN0IGltcGxlbWVudC4KLQotICAgIEFyZ3M6Ci0gICAgICByaHM6IGFueSBweXRob24gb2JqZWN0Ci0gICAgIiIiCi0KLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yLCAnbWV0aG9kIG11c3QgYmUgaW1wbGVtZW50ZWQgYnkgYSBzdWJjbGFzcy4nCi0KLSAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgotICAgIHJldHVybiBzZWxmLmVxdWFscyhyaHMpCi0KLSAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgotICAgIHJldHVybiBub3Qgc2VsZi5lcXVhbHMocmhzKQotCi0KLWNsYXNzIElzQShDb21wYXJhdG9yKToKLSAgIiIiVGhpcyBjbGFzcyB3cmFwcyBhIGJhc2ljIFB5dGhvbiB0eXBlIG9yIGNsYXNzLiAgSXQgaXMgdXNlZCB0byB2ZXJpZnkKLSAgdGhhdCBhIHBhcmFtZXRlciBpcyBvZiB0aGUgZ2l2ZW4gdHlwZSBvciBjbGFzcy4KLQotICBFeGFtcGxlOgotICBtb2NrX2Rhby5Db25uZWN0KElzQShEYkNvbm5lY3RJbmZvKSkKLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGNsYXNzX25hbWUpOgotICAgICIiIkluaXRpYWxpemUgSXNBCi0KLSAgICBBcmdzOgotICAgICAgY2xhc3NfbmFtZTogYmFzaWMgcHl0aG9uIHR5cGUgb3IgYSBjbGFzcwotICAgICIiIgotCi0gICAgc2VsZi5fY2xhc3NfbmFtZSA9IGNsYXNzX25hbWUKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiQ2hlY2sgdG8gc2VlIGlmIHRoZSBSSFMgaXMgYW4gaW5zdGFuY2Ugb2YgY2xhc3NfbmFtZS4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAotICAgICAgcmhzOiBvYmplY3QKLQotICAgIFJldHVybnM6Ci0gICAgICBib29sCi0gICAgIiIiCi0KLSAgICB0cnk6Ci0gICAgICByZXR1cm4gaXNpbnN0YW5jZShyaHMsIHNlbGYuX2NsYXNzX25hbWUpCi0gICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICMgQ2hlY2sgcmF3IHR5cGVzIGlmIHRoZXJlIHdhcyBhIHR5cGUgZXJyb3IuICBUaGlzIGlzIGhlbHBmdWwgZm9yCi0gICAgICAjIHRoaW5ncyBsaWtlIGNTdHJpbmdJTy5TdHJpbmdJTy4KLSAgICAgIHJldHVybiB0eXBlKHJocykgPT0gdHlwZShzZWxmLl9jbGFzc19uYW1lKQotCi0gIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICByZXR1cm4gc3RyKHNlbGYuX2NsYXNzX25hbWUpCi0KLWNsYXNzIElzQWxtb3N0KENvbXBhcmF0b3IpOgotICAiIiJDb21wYXJpc29uIGNsYXNzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHBhcmFtZXRlciBpcyBuZWFybHkgZXF1YWwKLSAgdG8gYSBnaXZlbiB2YWx1ZS4gIEdlbmVyYWxseSB1c2VmdWwgZm9yIGZsb2F0aW5nIHBvaW50IG51bWJlcnMuCi0KLSAgRXhhbXBsZSBtb2NrX2Rhby5TZXRUaW1lb3V0KChJc0FsbW9zdCgzLjkpKSkKLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGZsb2F0X3ZhbHVlLCBwbGFjZXM9Nyk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBJc0FsbW9zdC4KLQotICAgIEFyZ3M6Ci0gICAgICBmbG9hdF92YWx1ZTogVGhlIHZhbHVlIGZvciBtYWtpbmcgdGhlIGNvbXBhcmlzb24uCi0gICAgICBwbGFjZXM6IFRoZSBudW1iZXIgb2YgZGVjaW1hbCBwbGFjZXMgdG8gcm91bmQgdG8uCi0gICAgIiIiCi0KLSAgICBzZWxmLl9mbG9hdF92YWx1ZSA9IGZsb2F0X3ZhbHVlCi0gICAgc2VsZi5fcGxhY2VzID0gcGxhY2VzCi0KLSAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgotICAgICIiIkNoZWNrIHRvIHNlZSBpZiBSSFMgaXMgYWxtb3N0IGVxdWFsIHRvIGZsb2F0X3ZhbHVlCi0KLSAgICBBcmdzOgotICAgICAgcmhzOiB0aGUgdmFsdWUgdG8gY29tcGFyZSB0byBmbG9hdF92YWx1ZQotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIHRyeToKLSAgICAgIHJldHVybiByb3VuZChyaHMtc2VsZi5fZmxvYXRfdmFsdWUsIHNlbGYuX3BsYWNlcykgPT0gMAotICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAjIFRoaXMgaXMgcHJvYmFibHkgYmVjYXVzZSBlaXRoZXIgZmxvYXRfdmFsdWUgb3IgcmhzIGlzIG5vdCBhIG51bWJlci4KLSAgICAgIHJldHVybiBGYWxzZQotCi0gIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICByZXR1cm4gc3RyKHNlbGYuX2Zsb2F0X3ZhbHVlKQotCi1jbGFzcyBTdHJDb250YWlucyhDb21wYXJhdG9yKToKLSAgIiIiQ29tcGFyaXNvbiBjbGFzcyB1c2VkIHRvIGNoZWNrIHdoZXRoZXIgYSBzdWJzdHJpbmcgZXhpc3RzIGluIGEKLSAgc3RyaW5nIHBhcmFtZXRlci4gIFRoaXMgY2FuIGJlIHVzZWZ1bCBpbiBtb2NraW5nIGEgZGF0YWJhc2Ugd2l0aCBTUUwKLSAgcGFzc2VkIGluIGFzIGEgc3RyaW5nIHBhcmFtZXRlciwgZm9yIGV4YW1wbGUuCi0KLSAgRXhhbXBsZToKLSAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ0lOICgxLCAyLCA0LCA1KScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBzZWFyY2hfc3RyaW5nKToKLSAgICAiIiJJbml0aWFsaXplLgotCi0gICAgQXJnczoKLSAgICAgICMgc2VhcmNoX3N0cmluZzogdGhlIHN0cmluZyB5b3UgYXJlIHNlYXJjaGluZyBmb3IKLSAgICAgIHNlYXJjaF9zdHJpbmc6IHN0cgotICAgICIiIgotCi0gICAgc2VsZi5fc2VhcmNoX3N0cmluZyA9IHNlYXJjaF9zdHJpbmcKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiQ2hlY2sgdG8gc2VlIGlmIHRoZSBzZWFyY2hfc3RyaW5nIGlzIGNvbnRhaW5lZCBpbiB0aGUgcmhzIHN0cmluZy4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHJoczogdGhlIHJpZ2h0IGhhbmQgc2lkZSBvZiB0aGUgdGVzdAotICAgICAgcmhzOiBvYmplY3QKLQotICAgIFJldHVybnM6Ci0gICAgICBib29sCi0gICAgIiIiCi0KLSAgICB0cnk6Ci0gICAgICByZXR1cm4gcmhzLmZpbmQoc2VsZi5fc2VhcmNoX3N0cmluZykgPiAtMQotICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuICc8c3RyIGNvbnRhaW5pbmcgXCclc1wnPicgJSBzZWxmLl9zZWFyY2hfc3RyaW5nCi0KLQotY2xhc3MgUmVnZXgoQ29tcGFyYXRvcik6Ci0gICIiIkNoZWNrcyBpZiBhIHN0cmluZyBtYXRjaGVzIGEgcmVndWxhciBleHByZXNzaW9uLgotCi0gIFRoaXMgdXNlcyBhIGdpdmVuIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBkZXRlcm1pbmUgZXF1YWxpdHkuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwYXR0ZXJuLCBmbGFncz0wKToKLSAgICAiIiJJbml0aWFsaXplLgotCi0gICAgQXJnczoKLSAgICAgICMgcGF0dGVybiBpcyB0aGUgcmVndWxhciBleHByZXNzaW9uIHRvIHNlYXJjaCBmb3IKLSAgICAgIHBhdHRlcm46IHN0cgotICAgICAgIyBmbGFncyBwYXNzZWQgdG8gcmUuY29tcGlsZSBmdW5jdGlvbiBhcyB0aGUgc2Vjb25kIGFyZ3VtZW50Ci0gICAgICBmbGFnczogaW50Ci0gICAgIiIiCi0KLSAgICBzZWxmLnJlZ2V4ID0gcmUuY29tcGlsZShwYXR0ZXJuLCBmbGFncz1mbGFncykKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiQ2hlY2sgdG8gc2VlIGlmIHJocyBtYXRjaGVzIHJlZ3VsYXIgZXhwcmVzc2lvbiBwYXR0ZXJuLgotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIHJldHVybiBzZWxmLnJlZ2V4LnNlYXJjaChyaHMpIGlzIG5vdCBOb25lCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHMgPSAnPHJlZ3VsYXIgZXhwcmVzc2lvbiBcJyVzXCcnICUgc2VsZi5yZWdleC5wYXR0ZXJuCi0gICAgaWYgc2VsZi5yZWdleC5mbGFnczoKLSAgICAgIHMgKz0gJywgZmxhZ3M9JWQnICUgc2VsZi5yZWdleC5mbGFncwotICAgIHMgKz0gJz4nCi0gICAgcmV0dXJuIHMKLQotCi1jbGFzcyBJbihDb21wYXJhdG9yKToKLSAgIiIiQ2hlY2tzIHdoZXRoZXIgYW4gaXRlbSAob3Iga2V5KSBpcyBpbiBhIGxpc3QgKG9yIGRpY3QpIHBhcmFtZXRlci4KLQotICBFeGFtcGxlOgotICBtb2NrX2Rhby5HZXRVc2Vyc0luZm8oSW4oJ2V4cGVjdGVkVXNlck5hbWUnKSkuQW5kUmV0dXJuKG1vY2tfcmVzdWx0KQotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwga2V5KToKLSAgICAiIiJJbml0aWFsaXplLgotCi0gICAgQXJnczoKLSAgICAgICMga2V5IGlzIGFueSB0aGluZyB0aGF0IGNvdWxkIGJlIGluIGEgbGlzdCBvciBhIGtleSBpbiBhIGRpY3QKLSAgICAiIiIKLQotICAgIHNlbGYuX2tleSA9IGtleQotCi0gIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKLSAgICAiIiJDaGVjayB0byBzZWUgd2hldGhlciBrZXkgaXMgaW4gcmhzLgotCi0gICAgQXJnczoKLSAgICAgIHJoczogZGljdAotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIHJldHVybiBzZWxmLl9rZXkgaW4gcmhzCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiAnPHNlcXVlbmNlIG9yIG1hcCBjb250YWluaW5nIFwnJXNcJz4nICUgc2VsZi5fa2V5Ci0KLQotY2xhc3MgQ29udGFpbnNLZXlWYWx1ZShDb21wYXJhdG9yKToKLSAgIiIiQ2hlY2tzIHdoZXRoZXIgYSBrZXkvdmFsdWUgcGFpciBpcyBpbiBhIGRpY3QgcGFyYW1ldGVyLgotCi0gIEV4YW1wbGU6Ci0gIG1vY2tfZGFvLlVwZGF0ZVVzZXJzKENvbnRhaW5zS2V5VmFsdWUoJ3N0ZXZlcG0nLCBzdGV2ZXBtX3VzZXJfaW5mbykpCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBrZXksIHZhbHVlKToKLSAgICAiIiJJbml0aWFsaXplLgotCi0gICAgQXJnczoKLSAgICAgICMga2V5OiBhIGtleSBpbiBhIGRpY3QKLSAgICAgICMgdmFsdWU6IHRoZSBjb3JyZXNwb25kaW5nIHZhbHVlCi0gICAgIiIiCi0KLSAgICBzZWxmLl9rZXkgPSBrZXkKLSAgICBzZWxmLl92YWx1ZSA9IHZhbHVlCi0KLSAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgotICAgICIiIkNoZWNrIHdoZXRoZXIgdGhlIGdpdmVuIGtleS92YWx1ZSBwYWlyIGlzIGluIHRoZSByaHMgZGljdC4KLQotICAgIFJldHVybnM6Ci0gICAgICBib29sCi0gICAgIiIiCi0KLSAgICB0cnk6Ci0gICAgICByZXR1cm4gcmhzW3NlbGYuX2tleV0gPT0gc2VsZi5fdmFsdWUKLSAgICBleGNlcHQgRXhjZXB0aW9uOgotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiAnPG1hcCBjb250YWluaW5nIHRoZSBlbnRyeSBcJyVzOiAlc1wnPicgJSAoc2VsZi5fa2V5LCBzZWxmLl92YWx1ZSkKLQotCi1jbGFzcyBTYW1lRWxlbWVudHNBcyhDb21wYXJhdG9yKToKLSAgIiIiQ2hlY2tzIHdoZXRoZXIgaXRlcmFibGVzIGNvbnRhaW4gdGhlIHNhbWUgZWxlbWVudHMgKGlnbm9yaW5nIG9yZGVyKS4KLQotICBFeGFtcGxlOgotICBtb2NrX2Rhby5Qcm9jZXNzVXNlcnMoU2FtZUVsZW1lbnRzQXMoJ3N0ZXZlcG0nLCAnc2Fsb21ha2knKSkKLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGV4cGVjdGVkX3NlcSk6Ci0gICAgIiIiSW5pdGlhbGl6ZS4KLQotICAgIEFyZ3M6Ci0gICAgICBleHBlY3RlZF9zZXE6IGEgc2VxdWVuY2UKLSAgICAiIiIKLQotICAgIHNlbGYuX2V4cGVjdGVkX3NlcSA9IGV4cGVjdGVkX3NlcQotCi0gIGRlZiBlcXVhbHMoc2VsZiwgYWN0dWFsX3NlcSk6Ci0gICAgIiIiQ2hlY2sgdG8gc2VlIHdoZXRoZXIgYWN0dWFsX3NlcSBoYXMgc2FtZSBlbGVtZW50cyBhcyBleHBlY3RlZF9zZXEuCi0KLSAgICBBcmdzOgotICAgICAgYWN0dWFsX3NlcTogc2VxdWVuY2UKLQotICAgIFJldHVybnM6Ci0gICAgICBib29sCi0gICAgIiIiCi0KLSAgICB0cnk6Ci0gICAgICBleHBlY3RlZCA9IGRpY3QoWyhlbGVtZW50LCBOb25lKSBmb3IgZWxlbWVudCBpbiBzZWxmLl9leHBlY3RlZF9zZXFdKQotICAgICAgYWN0dWFsID0gZGljdChbKGVsZW1lbnQsIE5vbmUpIGZvciBlbGVtZW50IGluIGFjdHVhbF9zZXFdKQotICAgIGV4Y2VwdCBUeXBlRXJyb3I6Ci0gICAgICAjIEZhbGwgYmFjayB0byBzbG93ZXIgbGlzdC1jb21wYXJlIGlmIGFueSBvZiB0aGUgb2JqZWN0cyBhcmUgdW5oYXNoYWJsZS4KLSAgICAgIGV4cGVjdGVkID0gbGlzdChzZWxmLl9leHBlY3RlZF9zZXEpCi0gICAgICBhY3R1YWwgPSBsaXN0KGFjdHVhbF9zZXEpCi0gICAgICBleHBlY3RlZC5zb3J0KCkKLSAgICAgIGFjdHVhbC5zb3J0KCkKLSAgICByZXR1cm4gZXhwZWN0ZWQgPT0gYWN0dWFsCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiAnPHNlcXVlbmNlIHdpdGggc2FtZSBlbGVtZW50cyBhcyBcJyVzXCc+JyAlIHNlbGYuX2V4cGVjdGVkX3NlcQotCi0KLWNsYXNzIEFuZChDb21wYXJhdG9yKToKLSAgIiIiRXZhbHVhdGVzIG9uZSBvciBtb3JlIENvbXBhcmF0b3JzIG9uIFJIUyBhbmQgcmV0dXJucyBhbiBBTkQgb2YgdGhlIHJlc3VsdHMuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgIiIiSW5pdGlhbGl6ZS4KLQotICAgIEFyZ3M6Ci0gICAgICAqYXJnczogT25lIG9yIG1vcmUgQ29tcGFyYXRvcgotICAgICIiIgotCi0gICAgc2VsZi5fY29tcGFyYXRvcnMgPSBhcmdzCi0KLSAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgotICAgICIiIkNoZWNrcyB3aGV0aGVyIGFsbCBDb21wYXJhdG9ycyBhcmUgZXF1YWwgdG8gcmhzLgotCi0gICAgQXJnczoKLSAgICAgICMgcmhzOiBjYW4gYmUgYW55dGhpbmcKLQotICAgIFJldHVybnM6Ci0gICAgICBib29sCi0gICAgIiIiCi0KLSAgICBmb3IgY29tcGFyYXRvciBpbiBzZWxmLl9jb21wYXJhdG9yczoKLSAgICAgIGlmIG5vdCBjb21wYXJhdG9yLmVxdWFscyhyaHMpOgotICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIHJldHVybiBUcnVlCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiAnPEFORCAlcz4nICUgc3RyKHNlbGYuX2NvbXBhcmF0b3JzKQotCi0KLWNsYXNzIE9yKENvbXBhcmF0b3IpOgotICAiIiJFdmFsdWF0ZXMgb25lIG9yIG1vcmUgQ29tcGFyYXRvcnMgb24gUkhTIGFuZCByZXR1cm5zIGFuIE9SIG9mIHRoZSByZXN1bHRzLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgKmFyZ3MpOgotICAgICIiIkluaXRpYWxpemUuCi0KLSAgICBBcmdzOgotICAgICAgKmFyZ3M6IE9uZSBvciBtb3JlIE1veCBjb21wYXJhdG9ycwotICAgICIiIgotCi0gICAgc2VsZi5fY29tcGFyYXRvcnMgPSBhcmdzCi0KLSAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgotICAgICIiIkNoZWNrcyB3aGV0aGVyIGFueSBDb21wYXJhdG9yIGlzIGVxdWFsIHRvIHJocy4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHJoczogY2FuIGJlIGFueXRoaW5nCi0KLSAgICBSZXR1cm5zOgotICAgICAgYm9vbAotICAgICIiIgotCi0gICAgZm9yIGNvbXBhcmF0b3IgaW4gc2VsZi5fY29tcGFyYXRvcnM6Ci0gICAgICBpZiBjb21wYXJhdG9yLmVxdWFscyhyaHMpOgotICAgICAgICByZXR1cm4gVHJ1ZQotCi0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiAnPE9SICVzPicgJSBzdHIoc2VsZi5fY29tcGFyYXRvcnMpCi0KLQotY2xhc3MgRnVuYyhDb21wYXJhdG9yKToKLSAgIiIiQ2FsbCBhIGZ1bmN0aW9uIHRoYXQgc2hvdWxkIHZlcmlmeSB0aGUgcGFyYW1ldGVyIHBhc3NlZCBpbiBpcyBjb3JyZWN0LgotCi0gIFlvdSBtYXkgbmVlZCB0aGUgYWJpbGl0eSB0byBwZXJmb3JtIG1vcmUgYWR2YW5jZWQgb3BlcmF0aW9ucyBvbiB0aGUgcGFyYW1ldGVyCi0gIGluIG9yZGVyIHRvIHZhbGlkYXRlIGl0LiAgWW91IGNhbiB1c2UgdGhpcyB0byBoYXZlIGEgY2FsbGFibGUgdmFsaWRhdGUgYW55Ci0gIHBhcmFtZXRlci4gVGhlIGNhbGxhYmxlIHNob3VsZCByZXR1cm4gZWl0aGVyIFRydWUgb3IgRmFsc2UuCi0KLQotICBFeGFtcGxlOgotCi0gIGRlZiBteVBhcmFtVmFsaWRhdG9yKHBhcmFtKToKLSAgICAjIEFkdmFuY2VkIGxvZ2ljIGhlcmUKLSAgICByZXR1cm4gVHJ1ZQotCi0gIG1vY2tfZGFvLkRvU29tZXRoaW5nKEZ1bmMobXlQYXJhbVZhbGlkYXRvciksIHRydWUpCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBmdW5jKToKLSAgICAiIiJJbml0aWFsaXplLgotCi0gICAgQXJnczoKLSAgICAgIGZ1bmM6IGNhbGxhYmxlIHRoYXQgdGFrZXMgb25lIHBhcmFtZXRlciBhbmQgcmV0dXJucyBhIGJvb2wKLSAgICAiIiIKLQotICAgIHNlbGYuX2Z1bmMgPSBmdW5jCi0KLSAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgotICAgICIiIlRlc3Qgd2hldGhlciByaHMgcGFzc2VzIHRoZSBmdW5jdGlvbiB0ZXN0LgotCi0gICAgcmhzIGlzIHBhc3NlZCBpbnRvIGZ1bmMuCi0KLSAgICBBcmdzOgotICAgICAgcmhzOiBhbnkgcHl0aG9uIG9iamVjdAotCi0gICAgUmV0dXJuczoKLSAgICAgIHRoZSByZXN1bHQgb2YgZnVuYyhyaHMpCi0gICAgIiIiCi0KLSAgICByZXR1cm4gc2VsZi5fZnVuYyhyaHMpCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiBzdHIoc2VsZi5fZnVuYykKLQotCi1jbGFzcyBJZ25vcmVBcmcoQ29tcGFyYXRvcik6Ci0gICIiIklnbm9yZSBhbiBhcmd1bWVudC4KLQotICBUaGlzIGNhbiBiZSB1c2VkIHdoZW4gd2UgZG9uJ3QgY2FyZSBhYm91dCBhbiBhcmd1bWVudCBvZiBhIG1ldGhvZCBjYWxsLgotCi0gIEV4YW1wbGU6Ci0gICMgQ2hlY2sgaWYgQ2FzdE1hZ2ljIGlzIGNhbGxlZCB3aXRoIDMgYXMgZmlyc3QgYXJnIGFuZCAnZGlzYXBwZWFyJyBhcyB0aGlyZC4KLSAgbXltb2NrLkNhc3RNYWdpYygzLCBJZ25vcmVBcmcoKSwgJ2Rpc2FwcGVhcicpCi0gICIiIgotCi0gIGRlZiBlcXVhbHMoc2VsZiwgdW51c2VkX3Jocyk6Ci0gICAgIiIiSWdub3JlcyBhcmd1bWVudHMgYW5kIHJldHVybnMgVHJ1ZS4KLQotICAgIEFyZ3M6Ci0gICAgICB1bnVzZWRfcmhzOiBhbnkgcHl0aG9uIG9iamVjdAotCi0gICAgUmV0dXJuczoKLSAgICAgIGFsd2F5cyByZXR1cm5zIFRydWUKLSAgICAiIiIKLQotICAgIHJldHVybiBUcnVlCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiAnPElnbm9yZUFyZz4nCi0KLQotY2xhc3MgTWV0aG9kR3JvdXAob2JqZWN0KToKLSAgIiIiQmFzZSBjbGFzcyBjb250YWluaW5nIGNvbW1vbiBiZWhhdmlvdXIgZm9yIE1ldGhvZEdyb3Vwcy4iIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXBfbmFtZSk6Ci0gICAgc2VsZi5fZ3JvdXBfbmFtZSA9IGdyb3VwX25hbWUKLQotICBkZWYgZ3JvdXBfbmFtZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fZ3JvdXBfbmFtZQotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiAnPCVzICIlcyI+JyAlIChzZWxmLl9fY2xhc3NfXy5fX25hbWVfXywgc2VsZi5fZ3JvdXBfbmFtZSkKLQotICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6Ci0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBJc1NhdGlzZmllZChzZWxmKToKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLWNsYXNzIFVub3JkZXJlZEdyb3VwKE1ldGhvZEdyb3VwKToKLSAgIiIiVW5vcmRlcmVkR3JvdXAgaG9sZHMgYSBzZXQgb2YgbWV0aG9kIGNhbGxzIHRoYXQgbWF5IG9jY3VyIGluIGFueSBvcmRlci4KLQotICBUaGlzIGNvbnN0cnVjdCBpcyBoZWxwZnVsIGZvciBub24tZGV0ZXJtaW5pc3RpYyBldmVudHMsIHN1Y2ggYXMgaXRlcmF0aW5nCi0gIG92ZXIgdGhlIGtleXMgb2YgYSBkaWN0LgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXBfbmFtZSk6Ci0gICAgc3VwZXIoVW5vcmRlcmVkR3JvdXAsIHNlbGYpLl9faW5pdF9fKGdyb3VwX25hbWUpCi0gICAgc2VsZi5fbWV0aG9kcyA9IFtdCi0KLSAgZGVmIEFkZE1ldGhvZChzZWxmLCBtb2NrX21ldGhvZCk6Ci0gICAgIiIiQWRkIGEgbWV0aG9kIHRvIHRoaXMgZ3JvdXAuCi0KLSAgICBBcmdzOgotICAgICAgbW9ja19tZXRob2Q6IEEgbW9jayBtZXRob2QgdG8gYmUgYWRkZWQgdG8gdGhpcyBncm91cC4KLSAgICAiIiIKLQotICAgIHNlbGYuX21ldGhvZHMuYXBwZW5kKG1vY2tfbWV0aG9kKQotCi0gIGRlZiBNZXRob2RDYWxsZWQoc2VsZiwgbW9ja19tZXRob2QpOgotICAgICIiIlJlbW92ZSBhIG1ldGhvZCBjYWxsIGZyb20gdGhlIGdyb3VwLgotCi0gICAgSWYgdGhlIG1ldGhvZCBpcyBub3QgaW4gdGhlIHNldCwgYW4gVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciB3aWxsIGJlCi0gICAgcmFpc2VkLgotCi0gICAgQXJnczoKLSAgICAgIG1vY2tfbWV0aG9kOiBhIG1vY2sgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGVxdWFsIHRvIGEgbWV0aG9kIGluIHRoZSBncm91cC4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgbW9jayBtZXRob2QgZnJvbSB0aGUgZ3JvdXAKLQotICAgIFJhaXNlczoKLSAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG1vY2tfbWV0aG9kIHdhcyBub3QgaW4gdGhlIGdyb3VwLgotICAgICIiIgotCi0gICAgIyBDaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgZXhpc3RzLCBhbmQgaWYgc28sIHJlbW92ZSBpdCBmcm9tIHRoZSBzZXQKLSAgICAjIGFuZCByZXR1cm4gaXQuCi0gICAgZm9yIG1ldGhvZCBpbiBzZWxmLl9tZXRob2RzOgotICAgICAgaWYgbWV0aG9kID09IG1vY2tfbWV0aG9kOgotICAgICAgICAjIFJlbW92ZSB0aGUgY2FsbGVkIG1vY2tfbWV0aG9kIGluc3RlYWQgb2YgdGhlIG1ldGhvZCBpbiB0aGUgZ3JvdXAuCi0gICAgICAgICMgVGhlIGNhbGxlZCBtZXRob2Qgd2lsbCBtYXRjaCBhbnkgY29tcGFyYXRvcnMgd2hlbiBlcXVhbGl0eSBpcyBjaGVja2VkCi0gICAgICAgICMgZHVyaW5nIHJlbW92YWwuICBUaGUgbWV0aG9kIGluIHRoZSBncm91cCBjb3VsZCBwYXNzIGEgY29tcGFyYXRvciB0bwotICAgICAgICAjIGFub3RoZXIgY29tcGFyYXRvciBkdXJpbmcgdGhlIGVxdWFsaXR5IGNoZWNrLgotICAgICAgICBzZWxmLl9tZXRob2RzLnJlbW92ZShtb2NrX21ldGhvZCkKLQotICAgICAgICAjIElmIHRoaXMgZ3JvdXAgaXMgbm90IGVtcHR5LCBwdXQgaXQgYmFjayBhdCB0aGUgaGVhZCBvZiB0aGUgcXVldWUuCi0gICAgICAgIGlmIG5vdCBzZWxmLklzU2F0aXNmaWVkKCk6Ci0gICAgICAgICAgbW9ja19tZXRob2QuX2NhbGxfcXVldWUuYXBwZW5kbGVmdChzZWxmKQotCi0gICAgICAgIHJldHVybiBzZWxmLCBtZXRob2QKLQotICAgIHJhaXNlIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IobW9ja19tZXRob2QsIHNlbGYpCi0KLSAgZGVmIElzU2F0aXNmaWVkKHNlbGYpOgotICAgICIiIlJldHVybiBUcnVlIGlmIHRoZXJlIGFyZSBub3QgYW55IG1ldGhvZHMgaW4gdGhpcyBncm91cC4iIiIKLQotICAgIHJldHVybiBsZW4oc2VsZi5fbWV0aG9kcykgPT0gMAotCi0KLWNsYXNzIE11bHRpcGxlVGltZXNHcm91cChNZXRob2RHcm91cCk6Ci0gICIiIk11bHRpcGxlVGltZXNHcm91cCBob2xkcyBtZXRob2RzIHRoYXQgbWF5IGJlIGNhbGxlZCBhbnkgbnVtYmVyIG9mIHRpbWVzLgotCi0gIE5vdGU6IEVhY2ggbWV0aG9kIG11c3QgYmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuCi0KLSAgVGhpcyBpcyBoZWxwZnVsLCBpZiB5b3UgZG9uJ3Qga25vdyBvciBjYXJlIGhvdyBtYW55IHRpbWVzIGEgbWV0aG9kIGlzIGNhbGxlZC4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGdyb3VwX25hbWUpOgotICAgIHN1cGVyKE11bHRpcGxlVGltZXNHcm91cCwgc2VsZikuX19pbml0X18oZ3JvdXBfbmFtZSkKLSAgICBzZWxmLl9tZXRob2RzID0gc2V0KCkKLSAgICBzZWxmLl9tZXRob2RzX2NhbGxlZCA9IHNldCgpCi0KLSAgZGVmIEFkZE1ldGhvZChzZWxmLCBtb2NrX21ldGhvZCk6Ci0gICAgIiIiQWRkIGEgbWV0aG9kIHRvIHRoaXMgZ3JvdXAuCi0KLSAgICBBcmdzOgotICAgICAgbW9ja19tZXRob2Q6IEEgbW9jayBtZXRob2QgdG8gYmUgYWRkZWQgdG8gdGhpcyBncm91cC4KLSAgICAiIiIKLQotICAgIHNlbGYuX21ldGhvZHMuYWRkKG1vY2tfbWV0aG9kKQotCi0gIGRlZiBNZXRob2RDYWxsZWQoc2VsZiwgbW9ja19tZXRob2QpOgotICAgICIiIlJlbW92ZSBhIG1ldGhvZCBjYWxsIGZyb20gdGhlIGdyb3VwLgotCi0gICAgSWYgdGhlIG1ldGhvZCBpcyBub3QgaW4gdGhlIHNldCwgYW4gVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciB3aWxsIGJlCi0gICAgcmFpc2VkLgotCi0gICAgQXJnczoKLSAgICAgIG1vY2tfbWV0aG9kOiBhIG1vY2sgbWV0aG9kIHRoYXQgc2hvdWxkIGJlIGVxdWFsIHRvIGEgbWV0aG9kIGluIHRoZSBncm91cC4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgbW9jayBtZXRob2QgZnJvbSB0aGUgZ3JvdXAKLQotICAgIFJhaXNlczoKLSAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG1vY2tfbWV0aG9kIHdhcyBub3QgaW4gdGhlIGdyb3VwLgotICAgICIiIgotCi0gICAgIyBDaGVjayB0byBzZWUgaWYgdGhpcyBtZXRob2QgZXhpc3RzLCBhbmQgaWYgc28gYWRkIGl0IHRvIHRoZSBzZXQgb2YKLSAgICAjIGNhbGxlZCBtZXRob2RzLgotCi0gICAgZm9yIG1ldGhvZCBpbiBzZWxmLl9tZXRob2RzOgotICAgICAgaWYgbWV0aG9kID09IG1vY2tfbWV0aG9kOgotICAgICAgICBzZWxmLl9tZXRob2RzX2NhbGxlZC5hZGQobW9ja19tZXRob2QpCi0gICAgICAgICMgQWx3YXlzIHB1dCB0aGlzIGdyb3VwIGJhY2sgb24gdG9wIG9mIHRoZSBxdWV1ZSwgYmVjYXVzZSB3ZSBkb24ndCBrbm93Ci0gICAgICAgICMgd2hlbiB3ZSBhcmUgZG9uZS4KLSAgICAgICAgbW9ja19tZXRob2QuX2NhbGxfcXVldWUuYXBwZW5kbGVmdChzZWxmKQotICAgICAgICByZXR1cm4gc2VsZiwgbWV0aG9kCi0KLSAgICBpZiBzZWxmLklzU2F0aXNmaWVkKCk6Ci0gICAgICBuZXh0X21ldGhvZCA9IG1vY2tfbWV0aG9kLl9Qb3BOZXh0TWV0aG9kKCk7Ci0gICAgICByZXR1cm4gbmV4dF9tZXRob2QsIE5vbmUKLSAgICBlbHNlOgotICAgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihtb2NrX21ldGhvZCwgc2VsZikKLQotICBkZWYgSXNTYXRpc2ZpZWQoc2VsZik6Ci0gICAgIiIiUmV0dXJuIFRydWUgaWYgYWxsIG1ldGhvZHMgaW4gdGhpcyBncm91cCBhcmUgY2FsbGVkIGF0IGxlYXN0IG9uY2UuIiIiCi0gICAgIyBOT1RFKHBzeWNobyk6IFdlIGNhbid0IHVzZSB0aGUgc2ltcGxlIHNldCBkaWZmZXJlbmNlIGhlcmUgYmVjYXVzZSB3ZSB3YW50Ci0gICAgIyB0byBtYXRjaCBkaWZmZXJlbnQgcGFyYW1ldGVycyB3aGljaCBhcmUgY29uc2lkZXJlZCB0aGUgc2FtZSBlLmcuIElzQShzdHIpCi0gICAgIyBhbmQgc29tZSBzdHJpbmcuIFRoaXMgc29sdXRpb24gaXMgTyhuXjIpIGJ1dCBuIHNob3VsZCBiZSBzbWFsbC4KLSAgICB0bXAgPSBzZWxmLl9tZXRob2RzLmNvcHkoKQotICAgIGZvciBjYWxsZWQgaW4gc2VsZi5fbWV0aG9kc19jYWxsZWQ6Ci0gICAgICBmb3IgZXhwZWN0ZWQgaW4gdG1wOgotICAgICAgICBpZiBjYWxsZWQgPT0gZXhwZWN0ZWQ6Ci0gICAgICAgICAgdG1wLnJlbW92ZShleHBlY3RlZCkKLSAgICAgICAgICBpZiBub3QgdG1wOgotICAgICAgICAgICAgcmV0dXJuIFRydWUKLSAgICAgICAgICBicmVhawotICAgIHJldHVybiBGYWxzZQotCi0KLWNsYXNzIE1veE1ldGFUZXN0QmFzZSh0eXBlKToKLSAgIiIiTWV0YWNsYXNzIHRvIGFkZCBtb3ggY2xlYW51cCBhbmQgdmVyaWZpY2F0aW9uIHRvIGV2ZXJ5IHRlc3QuCi0KLSAgQXMgdGhlIG1veCB1bml0IHRlc3RpbmcgY2xhc3MgaXMgYmVpbmcgY29uc3RydWN0ZWQgKE1veFRlc3RCYXNlIG9yIGEKLSAgc3ViY2xhc3MpLCB0aGlzIG1ldGFjbGFzcyB3aWxsIG1vZGlmeSBhbGwgdGVzdCBmdW5jdGlvbnMgdG8gY2FsbCB0aGUKLSAgQ2xlYW5VcE1veCBtZXRob2Qgb2YgdGhlIHRlc3QgY2xhc3MgYWZ0ZXIgdGhleSBmaW5pc2guIFRoaXMgbWVhbnMgdGhhdAotICB1bnN0dWJiaW5nIGFuZCB2ZXJpZnlpbmcgd2lsbCBoYXBwZW4gZm9yIGV2ZXJ5IHRlc3Qgd2l0aCBubyBhZGRpdGlvbmFsIGNvZGUsCi0gIGFuZCBhbnkgZmFpbHVyZXMgd2lsbCByZXN1bHQgaW4gdGVzdCBmYWlsdXJlcyBhcyBvcHBvc2VkIHRvIGVycm9ycy4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGQpOgotICAgIHR5cGUuX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZCkKLQotICAgICMgYWxzbyBnZXQgYWxsIHRoZSBhdHRyaWJ1dGVzIGZyb20gdGhlIGJhc2UgY2xhc3NlcyB0byBhY2NvdW50Ci0gICAgIyBmb3IgYSBjYXNlIHdoZW4gdGVzdCBjbGFzcyBpcyBub3QgdGhlIGltbWVkaWF0ZSBjaGlsZCBvZiBNb3hUZXN0QmFzZQotICAgIGZvciBiYXNlIGluIGJhc2VzOgotICAgICAgZm9yIGF0dHJfbmFtZSBpbiBkaXIoYmFzZSk6Ci0gICAgICAgIGRbYXR0cl9uYW1lXSA9IGdldGF0dHIoYmFzZSwgYXR0cl9uYW1lKQotCi0gICAgZm9yIGZ1bmNfbmFtZSwgZnVuYyBpbiBkLml0ZW1zKCk6Ci0gICAgICBpZiBmdW5jX25hbWUuc3RhcnRzd2l0aCgndGVzdCcpIGFuZCBjYWxsYWJsZShmdW5jKToKLSAgICAgICAgc2V0YXR0cihjbHMsIGZ1bmNfbmFtZSwgTW94TWV0YVRlc3RCYXNlLkNsZWFuVXBUZXN0KGNscywgZnVuYykpCi0KLSAgQHN0YXRpY21ldGhvZAotICBkZWYgQ2xlYW5VcFRlc3QoY2xzLCBmdW5jKToKLSAgICAiIiJBZGRzIE1veCBjbGVhbnVwIGNvZGUgdG8gYW55IE1veFRlc3RCYXNlIG1ldGhvZC4KLQotICAgIEFsd2F5cyB1bnNldHMgc3R1YnMgYWZ0ZXIgYSB0ZXN0LiBXaWxsIHZlcmlmeSBhbGwgbW9ja3MgZm9yIHRlc3RzIHRoYXQKLSAgICBvdGhlcndpc2UgcGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBjbHM6IE1veFRlc3RCYXNlIG9yIHN1YmNsYXNzOyB0aGUgY2xhc3Mgd2hvc2UgdGVzdCBtZXRob2Qgd2UgYXJlIGFsdGVyaW5nLgotICAgICAgZnVuYzogbWV0aG9kOyB0aGUgbWV0aG9kIG9mIHRoZSBNb3hUZXN0QmFzZSB0ZXN0IGNsYXNzIHdlIHdpc2ggdG8gYWx0ZXIuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIG1vZGlmaWVkIG1ldGhvZC4KLSAgICAiIiIKLSAgICBkZWYgbmV3X21ldGhvZChzZWxmLCAqYXJncywgKiprd2FyZ3MpOgotICAgICAgbW94X29iaiA9IGdldGF0dHIoc2VsZiwgJ21veCcsIE5vbmUpCi0gICAgICBjbGVhbnVwX21veCA9IEZhbHNlCi0gICAgICBpZiBtb3hfb2JqIGFuZCBpc2luc3RhbmNlKG1veF9vYmosIE1veCk6Ci0gICAgICAgIGNsZWFudXBfbW94ID0gVHJ1ZQotICAgICAgdHJ5OgotICAgICAgICBmdW5jKHNlbGYsICphcmdzLCAqKmt3YXJncykKLSAgICAgIGZpbmFsbHk6Ci0gICAgICAgIGlmIGNsZWFudXBfbW94OgotICAgICAgICAgIG1veF9vYmouVW5zZXRTdHVicygpCi0gICAgICBpZiBjbGVhbnVwX21veDoKLSAgICAgICAgbW94X29iai5WZXJpZnlBbGwoKQotICAgIG5ld19tZXRob2QuX19uYW1lX18gPSBmdW5jLl9fbmFtZV9fCi0gICAgbmV3X21ldGhvZC5fX2RvY19fID0gZnVuYy5fX2RvY19fCi0gICAgbmV3X21ldGhvZC5fX21vZHVsZV9fID0gZnVuYy5fX21vZHVsZV9fCi0gICAgcmV0dXJuIG5ld19tZXRob2QKLQotCi1jbGFzcyBNb3hUZXN0QmFzZSh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0gICIiIkNvbnZlbmllbmNlIHRlc3QgY2xhc3MgdG8gbWFrZSBzdHViYmluZyBlYXNpZXIuCi0KLSAgU2V0cyB1cCBhICJtb3giIGF0dHJpYnV0ZSB3aGljaCBpcyBhbiBpbnN0YW5jZSBvZiBNb3ggLSBhbnkgbW94IHRlc3RzIHdpbGwKLSAgd2FudCB0aGlzLiBBbHNvIGF1dG9tYXRpY2FsbHkgdW5zZXRzIGFueSBzdHVicyBhbmQgdmVyaWZpZXMgdGhhdCBhbGwgbW9jawotICBtZXRob2RzIGhhdmUgYmVlbiBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIHRlc3QsIGVsaW1pbmF0aW5nIGJvaWxlcnBsYXRlCi0gIGNvZGUuCi0gICIiIgotCi0gIF9fbWV0YWNsYXNzX18gPSBNb3hNZXRhVGVzdEJhc2UKLQotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgc2VsZi5tb3ggPSBNb3goKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL3NldHVwLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL3NldHVwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwZjRiNTNjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3B5dGhvbi9zZXR1cC5weQorKysgL2Rldi9udWxsCkBAIC0xLDI1MCArMCwwIEBACi0jISAvdXNyL2Jpbi9lbnYgcHl0aG9uCi0jCi0jIFNlZSBSRUFETUUgZm9yIHVzYWdlIGluc3RydWN0aW9ucy4KLWltcG9ydCBnbG9iCi1pbXBvcnQgb3MKLWltcG9ydCBzdWJwcm9jZXNzCi1pbXBvcnQgc3lzCi0KLSMgV2UgbXVzdCB1c2Ugc2V0dXB0b29scywgbm90IGRpc3R1dGlscywgYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSB0aGUKLSMgbmFtZXNwYWNlX3BhY2thZ2VzIG9wdGlvbiBmb3IgdGhlICJnb29nbGUiIHBhY2thZ2UuCi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24sIGZpbmRfcGFja2FnZXMKLQotZnJvbSBkaXN0dXRpbHMuY29tbWFuZC5jbGVhbiBpbXBvcnQgY2xlYW4gYXMgX2NsZWFuCi0KLWlmIHN5cy52ZXJzaW9uX2luZm9bMF0gPT0gMzoKLSAgIyBQeXRob24gMwotICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGltcG9ydCBidWlsZF9weV8ydG8zIGFzIF9idWlsZF9weQotZWxzZToKLSAgIyBQeXRob24gMgotICBmcm9tIGRpc3R1dGlscy5jb21tYW5kLmJ1aWxkX3B5IGltcG9ydCBidWlsZF9weSBhcyBfYnVpbGRfcHkKLWZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKLQotIyBGaW5kIHRoZSBQcm90b2NvbCBDb21waWxlci4KLWlmICdQUk9UT0MnIGluIG9zLmVudmlyb24gYW5kIG9zLnBhdGguZXhpc3RzKG9zLmVudmlyb25bJ1BST1RPQyddKToKLSAgcHJvdG9jID0gb3MuZW52aXJvblsnUFJPVE9DJ10KLWVsaWYgb3MucGF0aC5leGlzdHMoIi4uL3NyYy9wcm90b2MiKToKLSAgcHJvdG9jID0gIi4uL3NyYy9wcm90b2MiCi1lbGlmIG9zLnBhdGguZXhpc3RzKCIuLi9zcmMvcHJvdG9jLmV4ZSIpOgotICBwcm90b2MgPSAiLi4vc3JjL3Byb3RvYy5leGUiCi1lbGlmIG9zLnBhdGguZXhpc3RzKCIuLi92c3Byb2plY3RzL0RlYnVnL3Byb3RvYy5leGUiKToKLSAgcHJvdG9jID0gIi4uL3ZzcHJvamVjdHMvRGVidWcvcHJvdG9jLmV4ZSIKLWVsaWYgb3MucGF0aC5leGlzdHMoIi4uL3ZzcHJvamVjdHMvUmVsZWFzZS9wcm90b2MuZXhlIik6Ci0gIHByb3RvYyA9ICIuLi92c3Byb2plY3RzL1JlbGVhc2UvcHJvdG9jLmV4ZSIKLWVsc2U6Ci0gIHByb3RvYyA9IGZpbmRfZXhlY3V0YWJsZSgicHJvdG9jIikKLQotCi1kZWYgR2V0VmVyc2lvbigpOgotICAiIiJHZXRzIHRoZSB2ZXJzaW9uIGZyb20gZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5Ci0KLSAgRG8gbm90IGltcG9ydCBnb29nbGUucHJvdG9idWYuX19pbml0X18gZGlyZWN0bHksIGJlY2F1c2UgYW4gaW5zdGFsbGVkCi0gIHByb3RvYnVmIGxpYnJhcnkgbWF5IGJlIGxvYWRlZCBpbnN0ZWFkLiIiIgotCi0gIHdpdGggb3Blbihvcy5wYXRoLmpvaW4oJ2dvb2dsZScsICdwcm90b2J1ZicsICdfX2luaXRfXy5weScpKSBhcyB2ZXJzaW9uX2ZpbGU6Ci0gICAgZXhlYyh2ZXJzaW9uX2ZpbGUucmVhZCgpLCBnbG9iYWxzKCkpCi0gICAgcmV0dXJuIF9fdmVyc2lvbl9fCi0KLQotZGVmIGdlbmVyYXRlX3Byb3RvKHNvdXJjZSwgcmVxdWlyZSA9IFRydWUpOgotICAiIiJJbnZva2VzIHRoZSBQcm90b2NvbCBDb21waWxlciB0byBnZW5lcmF0ZSBhIF9wYjIucHkgZnJvbSB0aGUgZ2l2ZW4KLSAgLnByb3RvIGZpbGUuICBEb2VzIG5vdGhpbmcgaWYgdGhlIG91dHB1dCBhbHJlYWR5IGV4aXN0cyBhbmQgaXMgbmV3ZXIgdGhhbgotICB0aGUgaW5wdXQuIiIiCi0KLSAgaWYgbm90IHJlcXVpcmUgYW5kIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2UpOgotICAgIHJldHVybgotCi0gIG91dHB1dCA9IHNvdXJjZS5yZXBsYWNlKCIucHJvdG8iLCAiX3BiMi5weSIpLnJlcGxhY2UoIi4uL3NyYy8iLCAiIikKLQotICBpZiAobm90IG9zLnBhdGguZXhpc3RzKG91dHB1dCkgb3IKLSAgICAgIChvcy5wYXRoLmV4aXN0cyhzb3VyY2UpIGFuZAotICAgICAgIG9zLnBhdGguZ2V0bXRpbWUoc291cmNlKSA+IG9zLnBhdGguZ2V0bXRpbWUob3V0cHV0KSkpOgotICAgIHByaW50KCJHZW5lcmF0aW5nICVzLi4uIiAlIG91dHB1dCkKLQotICAgIGlmIG5vdCBvcy5wYXRoLmV4aXN0cyhzb3VyY2UpOgotICAgICAgc3lzLnN0ZGVyci53cml0ZSgiQ2FuJ3QgZmluZCByZXF1aXJlZCBmaWxlOiAlc1xuIiAlIHNvdXJjZSkKLSAgICAgIHN5cy5leGl0KC0xKQotCi0gICAgaWYgcHJvdG9jIGlzIE5vbmU6Ci0gICAgICBzeXMuc3RkZXJyLndyaXRlKAotICAgICAgICAgICJwcm90b2MgaXMgbm90IGluc3RhbGxlZCBub3IgZm91bmQgaW4gLi4vc3JjLiAgUGxlYXNlIGNvbXBpbGUgaXQgIgotICAgICAgICAgICJvciBpbnN0YWxsIHRoZSBiaW5hcnkgcGFja2FnZS5cbiIpCi0gICAgICBzeXMuZXhpdCgtMSkKLQotICAgIHByb3RvY19jb21tYW5kID0gWyBwcm90b2MsICItSS4uL3NyYyIsICItSS4iLCAiLS1weXRob25fb3V0PS4iLCBzb3VyY2UgXQotICAgIGlmIHN1YnByb2Nlc3MuY2FsbChwcm90b2NfY29tbWFuZCkgIT0gMDoKLSAgICAgIHN5cy5leGl0KC0xKQotCi1kZWYgR2VuZXJhdGVVbml0dGVzdFByb3RvcygpOgotICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmEucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfaW1wb3J0LnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byIsIEZhbHNlKQotICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wcm90byIsIEZhbHNlKQotICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wcm90byIsIEZhbHNlKQotICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wcm90byIsIEZhbHNlKQotICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FueV90ZXN0LnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QxLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl9wb29sX3Rlc3QyLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZmFjdG9yeV90ZXN0MS5wcm90byIsIEZhbHNlKQotICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2ZhY3RvcnlfdGVzdDIucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9pbXBvcnRfdGVzdF9wYWNrYWdlL2lubmVyLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvaW1wb3J0X3Rlc3RfcGFja2FnZS9vdXRlci5wcm90byIsIEZhbHNlKQotICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21pc3NpbmdfZW51bV92YWx1ZXMucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3NldF9leHRlbnNpb25zLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zX2R5bmFtaWMucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvIiwgRmFsc2UpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcGFja2VkX2ZpZWxkX3Rlc3QucHJvdG8iLCBGYWxzZSkKLSAgZ2VuZXJhdGVfcHJvdG8oImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byIsIEZhbHNlKQotICBnZW5lcmF0ZV9wcm90bygiZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbi5wcm90byIsIEZhbHNlKQotCi0KLWNsYXNzIGNsZWFuKF9jbGVhbik6Ci0gIGRlZiBydW4oc2VsZik6Ci0gICAgIyBEZWxldGUgZ2VuZXJhdGVkIGZpbGVzIGluIHRoZSBjb2RlIHRyZWUuCi0gICAgZm9yIChkaXJwYXRoLCBkaXJuYW1lcywgZmlsZW5hbWVzKSBpbiBvcy53YWxrKCIuIik6Ci0gICAgICBmb3IgZmlsZW5hbWUgaW4gZmlsZW5hbWVzOgotICAgICAgICBmaWxlcGF0aCA9IG9zLnBhdGguam9pbihkaXJwYXRoLCBmaWxlbmFtZSkKLSAgICAgICAgaWYgZmlsZXBhdGguZW5kc3dpdGgoIl9wYjIucHkiKSBvciBmaWxlcGF0aC5lbmRzd2l0aCgiLnB5YyIpIG9yIFwKLSAgICAgICAgICBmaWxlcGF0aC5lbmRzd2l0aCgiLnNvIikgb3IgZmlsZXBhdGguZW5kc3dpdGgoIi5vIikgb3IgXAotICAgICAgICAgIGZpbGVwYXRoLmVuZHN3aXRoKCdnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvX19pbml0X18ucHknKSBvciBcCi0gICAgICAgICAgZmlsZXBhdGguZW5kc3dpdGgoJ2dvb2dsZS9wcm90b2J1Zi91dGlsL19faW5pdF9fLnB5Jyk6Ci0gICAgICAgICAgb3MucmVtb3ZlKGZpbGVwYXRoKQotICAgICMgX2NsZWFuIGlzIGFuIG9sZC1zdHlsZSBjbGFzcywgc28gc3VwZXIoKSBkb2Vzbid0IHdvcmsuCi0gICAgX2NsZWFuLnJ1bihzZWxmKQotCi1jbGFzcyBidWlsZF9weShfYnVpbGRfcHkpOgotICBkZWYgcnVuKHNlbGYpOgotICAgICMgR2VuZXJhdGUgbmVjZXNzYXJ5IC5wcm90byBmaWxlIGlmIGl0IGRvZXNuJ3QgZXhpc3QuCi0gICAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpCi0gICAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIikKLSAgICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iKQotICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byIpCi0gICAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8iKQotICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIikKLSAgICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvIikKLSAgICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90byIpCi0gICAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvIikKLSAgICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8iKQotICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8iKQotICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIikKLSAgICBHZW5lcmF0ZVVuaXR0ZXN0UHJvdG9zKCkKLQotICAgICMgTWFrZSBzdXJlIGdvb2dsZS5wcm90b2J1Zi8qKiBhcmUgdmFsaWQgcGFja2FnZXMuCi0gICAgZm9yIHBhdGggaW4gWycnLCAnaW50ZXJuYWwvJywgJ2NvbXBpbGVyLycsICdweWV4dC8nLCAndXRpbC8nXToKLSAgICAgIHRyeToKLSAgICAgICAgb3BlbignZ29vZ2xlL3Byb3RvYnVmLyVzX19pbml0X18ucHknICUgcGF0aCwgJ2EnKS5jbG9zZSgpCi0gICAgICBleGNlcHQgRW52aXJvbm1lbnRFcnJvcjoKLSAgICAgICAgcGFzcwotICAgICMgX2J1aWxkX3B5IGlzIGFuIG9sZC1zdHlsZSBjbGFzcywgc28gc3VwZXIoKSBkb2Vzbid0IHdvcmsuCi0gICAgX2J1aWxkX3B5LnJ1bihzZWxmKQotCi1jbGFzcyB0ZXN0X2NvbmZvcm1hbmNlKF9idWlsZF9weSk6Ci0gIHRhcmdldCA9ICd0ZXN0X3B5dGhvbicKLSAgZGVmIHJ1bihzZWxmKToKLSAgICBpZiBzeXMudmVyc2lvbl9pbmZvID49ICgyLCA3KToKLSAgICAgICMgUHl0aG9uIDIuNiBkb2RnZXMgdGhlc2UgZXh0cmEgZmFpbHVyZXMuCi0gICAgICBvcy5lbnZpcm9uWyJDT05GT1JNQU5DRV9QWVRIT05fRVhUUkFfRkFJTFVSRVMiXSA9ICgKLSAgICAgICAgICAiLS1mYWlsdXJlX2xpc3QgZmFpbHVyZV9saXN0X3B5dGhvbi1wb3N0MjYudHh0IikKLSAgICBjbWQgPSAnY2QgLi4vY29uZm9ybWFuY2UgJiYgbWFrZSAlcycgJSAodGVzdF9jb25mb3JtYW5jZS50YXJnZXQpCi0gICAgc3RhdHVzID0gc3VicHJvY2Vzcy5jaGVja19jYWxsKGNtZCwgc2hlbGw9VHJ1ZSkKLQotCi1kZWYgZ2V0X29wdGlvbl9mcm9tX3N5c19hcmd2KG9wdGlvbl9zdHIpOgotICBpZiBvcHRpb25fc3RyIGluIHN5cy5hcmd2OgotICAgIHN5cy5hcmd2LnJlbW92ZShvcHRpb25fc3RyKQotICAgIHJldHVybiBUcnVlCi0gIHJldHVybiBGYWxzZQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIGV4dF9tb2R1bGVfbGlzdCA9IFtdCi0gIHdhcm5pbmdzX2FzX2Vycm9ycyA9ICctLXdhcm5pbmdzX2FzX2Vycm9ycycKLSAgaWYgZ2V0X29wdGlvbl9mcm9tX3N5c19hcmd2KCctLWNwcF9pbXBsZW1lbnRhdGlvbicpOgotICAgICMgTGluayBsaWJwcm90b2J1Zi5hIGFuZCBsaWJwcm90b2J1Zi1saXRlLmEgc3RhdGljYWxseSB3aXRoIHRoZQotICAgICMgZXh0ZW5zaW9uLiBOb3RlIHRoYXQgdGhvc2UgbGlicmFyaWVzIGhhdmUgdG8gYmUgY29tcGlsZWQgd2l0aAotICAgICMgLWZQSUMgZm9yIHRoaXMgdG8gd29yay4KLSAgICBjb21waWxlX3N0YXRpY19leHQgPSBnZXRfb3B0aW9uX2Zyb21fc3lzX2FyZ3YoJy0tY29tcGlsZV9zdGF0aWNfZXh0ZW5zaW9uJykKLSAgICBleHRyYV9jb21waWxlX2FyZ3MgPSBbJy1Xbm8td3JpdGUtc3RyaW5ncycsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICctV25vLWludmFsaWQtb2Zmc2V0b2YnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAnLVduby1zaWduLWNvbXBhcmUnXQotICAgIGxpYnJhcmllcyA9IFsncHJvdG9idWYnXQotICAgIGV4dHJhX29iamVjdHMgPSBOb25lCi0gICAgaWYgY29tcGlsZV9zdGF0aWNfZXh0OgotICAgICAgbGlicmFyaWVzID0gTm9uZQotICAgICAgZXh0cmFfb2JqZWN0cyA9IFsnLi4vc3JjLy5saWJzL2xpYnByb3RvYnVmLmEnLAotICAgICAgICAgICAgICAgICAgICAgICAnLi4vc3JjLy5saWJzL2xpYnByb3RvYnVmLWxpdGUuYSddCi0gICAgdGVzdF9jb25mb3JtYW5jZS50YXJnZXQgPSAndGVzdF9weXRob25fY3BwJwotCi0gICAgaWYgImNsYW5nIiBpbiBvcy5wb3BlbignJENDIC0tdmVyc2lvbiAyPiAvZGV2L251bGwnKS5yZWFkKCk6Ci0gICAgICBleHRyYV9jb21waWxlX2FyZ3MuYXBwZW5kKCctV25vLXNob3J0ZW4tNjQtdG8tMzInKQotCi0gICAgaWYgd2FybmluZ3NfYXNfZXJyb3JzIGluIHN5cy5hcmd2OgotICAgICAgZXh0cmFfY29tcGlsZV9hcmdzLmFwcGVuZCgnLVdlcnJvcicpCi0gICAgICBzeXMuYXJndi5yZW1vdmUod2FybmluZ3NfYXNfZXJyb3JzKQotCi0gICAgIyBDKysgaW1wbGVtZW50YXRpb24gZXh0ZW5zaW9uCi0gICAgZXh0X21vZHVsZV9saXN0LmV4dGVuZChbCi0gICAgICAgIEV4dGVuc2lvbigKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYucHlleHQuX21lc3NhZ2UiLAotICAgICAgICAgICAgZ2xvYi5nbG9iKCdnb29nbGUvcHJvdG9idWYvcHlleHQvKi5jYycpLAotICAgICAgICAgICAgaW5jbHVkZV9kaXJzPVsiLiIsICIuLi9zcmMiXSwKLSAgICAgICAgICAgIGxpYnJhcmllcz1saWJyYXJpZXMsCi0gICAgICAgICAgICBleHRyYV9vYmplY3RzPWV4dHJhX29iamVjdHMsCi0gICAgICAgICAgICBsaWJyYXJ5X2RpcnM9WycuLi9zcmMvLmxpYnMnXSwKLSAgICAgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncz1leHRyYV9jb21waWxlX2FyZ3MsCi0gICAgICAgICksCi0gICAgICAgIEV4dGVuc2lvbigKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuX2FwaV9pbXBsZW1lbnRhdGlvbiIsCi0gICAgICAgICAgICBnbG9iLmdsb2IoJ2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9hcGlfaW1wbGVtZW50YXRpb24uY2MnKSwKLSAgICAgICAgICAgIGV4dHJhX2NvbXBpbGVfYXJncz1bJy1EUFlUSE9OX1BST1RPMl9DUFBfSU1QTF9WMiddLAotICAgICAgICApLAotICAgIF0pCi0gICAgb3MuZW52aXJvblsnUFJPVE9DT0xfQlVGRkVSU19QWVRIT05fSU1QTEVNRU5UQVRJT04nXSA9ICdjcHAnCi0KLSAgIyBLZWVwIHRoaXMgbGlzdCBvZiBkZXBlbmRlbmNpZXMgaW4gc3luYyB3aXRoIHRveC5pbmkuCi0gIGluc3RhbGxfcmVxdWlyZXMgPSBbJ3NpeD49MS45JywgJ3NldHVwdG9vbHMnXQotICBpZiBzeXMudmVyc2lvbl9pbmZvIDw9ICgyLDcpOgotICAgIGluc3RhbGxfcmVxdWlyZXMuYXBwZW5kKCdvcmRlcmVkZGljdCcpCi0gICAgaW5zdGFsbF9yZXF1aXJlcy5hcHBlbmQoJ3VuaXR0ZXN0MicpCi0KLSAgc2V0dXAoCi0gICAgICBuYW1lPSdwcm90b2J1ZicsCi0gICAgICB2ZXJzaW9uPUdldFZlcnNpb24oKSwKLSAgICAgIGRlc2NyaXB0aW9uPSdQcm90b2NvbCBCdWZmZXJzJywKLSAgICAgIGxvbmdfZGVzY3JpcHRpb249IlByb3RvY29sIEJ1ZmZlcnMgYXJlIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0IiwKLSAgICAgIHVybD0naHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8nLAotICAgICAgbWFpbnRhaW5lcj0ncHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbScsCi0gICAgICBtYWludGFpbmVyX2VtYWlsPSdwcm90b2J1ZkBnb29nbGVncm91cHMuY29tJywKLSAgICAgIGxpY2Vuc2U9J05ldyBCU0QgTGljZW5zZScsCi0gICAgICBjbGFzc2lmaWVycz1bCi0gICAgICAgICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24iLAotICAgICAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIiLAotICAgICAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDIuNiIsCi0gICAgICAgICJQcm9ncmFtbWluZyBMYW5ndWFnZSA6OiBQeXRob24gOjogMi43IiwKLSAgICAgICAgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzIiwKLSAgICAgICAgIlByb2dyYW1taW5nIExhbmd1YWdlIDo6IFB5dGhvbiA6OiAzLjMiLAotICAgICAgICAiUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgOjogUHl0aG9uIDo6IDMuNCIsCi0gICAgICAgIF0sCi0gICAgICBuYW1lc3BhY2VfcGFja2FnZXM9Wydnb29nbGUnXSwKLSAgICAgIHBhY2thZ2VzPWZpbmRfcGFja2FnZXMoCi0gICAgICAgICAgZXhjbHVkZT1bCi0gICAgICAgICAgICAgICdpbXBvcnRfdGVzdF9wYWNrYWdlJywKLSAgICAgICAgICBdLAotICAgICAgKSwKLSAgICAgIHRlc3Rfc3VpdGU9J2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCcsCi0gICAgICBjbWRjbGFzcz17Ci0gICAgICAgICAgJ2NsZWFuJzogY2xlYW4sCi0gICAgICAgICAgJ2J1aWxkX3B5JzogYnVpbGRfcHksCi0gICAgICAgICAgJ3Rlc3RfY29uZm9ybWFuY2UnOiB0ZXN0X2NvbmZvcm1hbmNlLAotICAgICAgfSwKLSAgICAgIGluc3RhbGxfcmVxdWlyZXM9aW5zdGFsbF9yZXF1aXJlcywKLSAgICAgIGV4dF9tb2R1bGVzPWV4dF9tb2R1bGVfbGlzdCwKLSAgKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL3N0dWJvdXQucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vc3R1Ym91dC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWVlNGYyZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vc3R1Ym91dC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE0MCArMCwwIEBACi0jIS91c3IvYmluL3B5dGhvbjIuNAotIwotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotIwotIyBMaWNlbnNlZCB1bmRlciB0aGUgQXBhY2hlIExpY2Vuc2UsIFZlcnNpb24gMi4wICh0aGUgIkxpY2Vuc2UiKTsKLSMgeW91IG1heSBub3QgdXNlIHRoaXMgZmlsZSBleGNlcHQgaW4gY29tcGxpYW5jZSB3aXRoIHRoZSBMaWNlbnNlLgotIyBZb3UgbWF5IG9idGFpbiBhIGNvcHkgb2YgdGhlIExpY2Vuc2UgYXQKLSMKLSMgICAgICBodHRwOi8vd3d3LmFwYWNoZS5vcmcvbGljZW5zZXMvTElDRU5TRS0yLjAKLSMKLSMgVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCBzb2Z0d2FyZQotIyBkaXN0cmlidXRlZCB1bmRlciB0aGUgTGljZW5zZSBpcyBkaXN0cmlidXRlZCBvbiBhbiAiQVMgSVMiIEJBU0lTLAotIyBXSVRIT1VUIFdBUlJBTlRJRVMgT1IgQ09ORElUSU9OUyBPRiBBTlkgS0lORCwgZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZC4KLSMgU2VlIHRoZSBMaWNlbnNlIGZvciB0aGUgc3BlY2lmaWMgbGFuZ3VhZ2UgZ292ZXJuaW5nIHBlcm1pc3Npb25zIGFuZAotIyBsaW1pdGF0aW9ucyB1bmRlciB0aGUgTGljZW5zZS4KLQotIyBUaGlzIGZpbGUgaXMgdXNlZCBmb3IgdGVzdGluZy4gIFRoZSBvcmlnaW5hbCBpcyBhdDoKLSMgICBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHltb3gvCi0KLWNsYXNzIFN0dWJPdXRGb3JUZXN0aW5nOgotICAiIiJTYW1wbGUgVXNhZ2U6Ci0gICAgIFlvdSB3YW50IG9zLnBhdGguZXhpc3RzKCkgdG8gYWx3YXlzIHJldHVybiB0cnVlIGR1cmluZyB0ZXN0aW5nLgotCi0gICAgIHN0dWJzID0gU3R1Yk91dEZvclRlc3RpbmcoKQotICAgICBzdHVicy5TZXQob3MucGF0aCwgJ2V4aXN0cycsIGxhbWJkYSB4OiAxKQotICAgICAgIC4uLgotICAgICBzdHVicy5VbnNldEFsbCgpCi0KLSAgICAgVGhlIGFib3ZlIGNoYW5nZXMgb3MucGF0aC5leGlzdHMgaW50byBhIGxhbWJkYSB0aGF0IHJldHVybnMgMS4gIE9uY2UKLSAgICAgdGhlIC4uLiBwYXJ0IG9mIHRoZSBjb2RlIGZpbmlzaGVzLCB0aGUgVW5zZXRBbGwoKSBsb29rcyB1cCB0aGUgb2xkIHZhbHVlCi0gICAgIG9mIG9zLnBhdGguZXhpc3RzIGFuZCByZXN0b3JlcyBpdC4KLQotICAiIiIKLSAgZGVmIF9faW5pdF9fKHNlbGYpOgotICAgIHNlbGYuY2FjaGUgPSBbXQotICAgIHNlbGYuc3R1YnMgPSBbXQotCi0gIGRlZiBfX2RlbF9fKHNlbGYpOgotICAgIHNlbGYuU21hcnRVbnNldEFsbCgpCi0gICAgc2VsZi5VbnNldEFsbCgpCi0KLSAgZGVmIFNtYXJ0U2V0KHNlbGYsIG9iaiwgYXR0cl9uYW1lLCBuZXdfYXR0cik6Ci0gICAgIiIiUmVwbGFjZSBvYmouYXR0cl9uYW1lIHdpdGggbmV3X2F0dHIuIFRoaXMgbWV0aG9kIGlzIHNtYXJ0IGFuZCB3b3JrcwotICAgICAgIGF0IHRoZSBtb2R1bGUsIGNsYXNzLCBhbmQgaW5zdGFuY2UgbGV2ZWwgd2hpbGUgcHJlc2VydmluZyBwcm9wZXIKLSAgICAgICBpbmhlcml0YW5jZS4gSXQgd2lsbCBub3Qgc3R1YiBvdXQgQyB0eXBlcyBob3dldmVyIHVubGVzcyB0aGF0IGhhcyBiZWVuCi0gICAgICAgZXhwbGljaXRseSBhbGxvd2VkIGJ5IHRoZSB0eXBlLgotCi0gICAgICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGNhc2Ugd2hlcmUgYXR0cl9uYW1lIGlzIGEgc3RhdGljbWV0aG9kIG9yIGEKLSAgICAgICBjbGFzc21ldGhvZCBvZiBvYmouCi0KLSAgICAgICBOb3RlczoKLSAgICAgIC0gSWYgb2JqIGlzIGFuIGluc3RhbmNlLCB0aGVuIGl0IGlzIGl0cyBjbGFzcyB0aGF0IHdpbGwgYWN0dWFsbHkgYmUKLSAgICAgICAgc3R1YmJlZC4gTm90ZSB0aGF0IHRoZSBtZXRob2QgU2V0KCkgZG9lcyBub3QgZG8gdGhhdDogaWYgb2JqIGlzCi0gICAgICAgIGFuIGluc3RhbmNlLCBpdCAoYW5kIG5vdCBpdHMgY2xhc3MpIHdpbGwgYmUgc3R1YmJlZC4KLSAgICAgIC0gVGhlIHN0dWJiaW5nIGlzIHVzaW5nIHRoZSBidWlsdGluIGdldGF0dHIgYW5kIHNldGF0dHIuIFNvLCB0aGUgX19nZXRfXwotICAgICAgICBhbmQgX19zZXRfXyB3aWxsIGJlIGNhbGxlZCB3aGVuIHN0dWJiaW5nIChUT0RPOiBBIGJldHRlciBpZGVhIHdvdWxkCi0gICAgICAgIHByb2JhYmx5IGJlIHRvIG1hbmlwdWxhdGUgb2JqLl9fZGljdF9fIGluc3RlYWQgb2YgZ2V0YXR0cigpIGFuZAotICAgICAgICBzZXRhdHRyKCkpLgotCi0gICAgICAgUmFpc2VzIEF0dHJpYnV0ZUVycm9yIGlmIHRoZSBhdHRyaWJ1dGUgY2Fubm90IGJlIGZvdW5kLgotICAgICIiIgotICAgIGlmIChpbnNwZWN0LmlzbW9kdWxlKG9iaikgb3IKLSAgICAgICAgKG5vdCBpbnNwZWN0LmlzY2xhc3Mob2JqKSBhbmQgb2JqLl9fZGljdF9fLmhhc19rZXkoYXR0cl9uYW1lKSkpOgotICAgICAgb3JpZ19vYmogPSBvYmoKLSAgICAgIG9yaWdfYXR0ciA9IGdldGF0dHIob2JqLCBhdHRyX25hbWUpCi0KLSAgICBlbHNlOgotICAgICAgaWYgbm90IGluc3BlY3QuaXNjbGFzcyhvYmopOgotICAgICAgICBtcm8gPSBsaXN0KGluc3BlY3QuZ2V0bXJvKG9iai5fX2NsYXNzX18pKQotICAgICAgZWxzZToKLSAgICAgICAgbXJvID0gbGlzdChpbnNwZWN0LmdldG1ybyhvYmopKQotCi0gICAgICBtcm8ucmV2ZXJzZSgpCi0KLSAgICAgIG9yaWdfYXR0ciA9IE5vbmUKLQotICAgICAgZm9yIGNscyBpbiBtcm86Ci0gICAgICAgIHRyeToKLSAgICAgICAgICBvcmlnX29iaiA9IGNscwotICAgICAgICAgIG9yaWdfYXR0ciA9IGdldGF0dHIob2JqLCBhdHRyX25hbWUpCi0gICAgICAgIGV4Y2VwdCBBdHRyaWJ1dGVFcnJvcjoKLSAgICAgICAgICBjb250aW51ZQotCi0gICAgaWYgb3JpZ19hdHRyIGlzIE5vbmU6Ci0gICAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcigiQXR0cmlidXRlIG5vdCBmb3VuZC4iKQotCi0gICAgIyBDYWxsaW5nIGdldGF0dHIoKSBvbiBhIHN0YXRpY21ldGhvZCB0cmFuc2Zvcm1zIGl0IHRvIGEgJ25vcm1hbCcgZnVuY3Rpb24uCi0gICAgIyBXZSBuZWVkIHRvIGVuc3VyZSB0aGF0IHdlIHB1dCBpdCBiYWNrIGFzIGEgc3RhdGljbWV0aG9kLgotICAgIG9sZF9hdHRyaWJ1dGUgPSBvYmouX19kaWN0X18uZ2V0KGF0dHJfbmFtZSkKLSAgICBpZiBvbGRfYXR0cmlidXRlIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKG9sZF9hdHRyaWJ1dGUsIHN0YXRpY21ldGhvZCk6Ci0gICAgICBvcmlnX2F0dHIgPSBzdGF0aWNtZXRob2Qob3JpZ19hdHRyKQotCi0gICAgc2VsZi5zdHVicy5hcHBlbmQoKG9yaWdfb2JqLCBhdHRyX25hbWUsIG9yaWdfYXR0cikpCi0gICAgc2V0YXR0cihvcmlnX29iaiwgYXR0cl9uYW1lLCBuZXdfYXR0cikKLQotICBkZWYgU21hcnRVbnNldEFsbChzZWxmKToKLSAgICAiIiJSZXZlcnNlcyBhbGwgdGhlIFNtYXJ0U2V0KCkgY2FsbHMsIHJlc3RvcmluZyB0aGluZ3MgdG8gdGhlaXIgb3JpZ2luYWwKLSAgICBkZWZpbml0aW9uLiAgSXRzIG9rYXkgdG8gY2FsbCBTbWFydFVuc2V0QWxsKCkgcmVwZWF0ZWRseSwgYXMgbGF0ZXIgY2FsbHMKLSAgICBoYXZlIG5vIGVmZmVjdCBpZiBubyBTbWFydFNldCgpIGNhbGxzIGhhdmUgYmVlbiBtYWRlLgotCi0gICAgIiIiCi0gICAgc2VsZi5zdHVicy5yZXZlcnNlKCkKLQotICAgIGZvciBhcmdzIGluIHNlbGYuc3R1YnM6Ci0gICAgICBzZXRhdHRyKCphcmdzKQotCi0gICAgc2VsZi5zdHVicyA9IFtdCi0KLSAgZGVmIFNldChzZWxmLCBwYXJlbnQsIGNoaWxkX25hbWUsIG5ld19jaGlsZCk6Ci0gICAgIiIiUmVwbGFjZSBjaGlsZF9uYW1lJ3Mgb2xkIGRlZmluaXRpb24gd2l0aCBuZXdfY2hpbGQsIGluIHRoZSBjb250ZXh0Ci0gICAgb2YgdGhlIGdpdmVuIHBhcmVudC4gIFRoZSBwYXJlbnQgY291bGQgYmUgYSBtb2R1bGUgd2hlbiB0aGUgY2hpbGQgaXMgYQotICAgIGZ1bmN0aW9uIGF0IG1vZHVsZSBzY29wZS4gIE9yIHRoZSBwYXJlbnQgY291bGQgYmUgYSBjbGFzcyB3aGVuIGEgY2xhc3MnCi0gICAgbWV0aG9kIGlzIGJlaW5nIHJlcGxhY2VkLiAgVGhlIG5hbWVkIGNoaWxkIGlzIHNldCB0byBuZXdfY2hpbGQsIHdoaWxlCi0gICAgdGhlIHByaW9yIGRlZmluaXRpb24gaXMgc2F2ZWQgYXdheSBmb3IgbGF0ZXIsIHdoZW4gVW5zZXRBbGwoKSBpcyBjYWxsZWQuCi0KLSAgICBUaGlzIG1ldGhvZCBzdXBwb3J0cyB0aGUgY2FzZSB3aGVyZSBjaGlsZF9uYW1lIGlzIGEgc3RhdGljbWV0aG9kIG9yIGEKLSAgICBjbGFzc21ldGhvZCBvZiBwYXJlbnQuCi0gICAgIiIiCi0gICAgb2xkX2NoaWxkID0gZ2V0YXR0cihwYXJlbnQsIGNoaWxkX25hbWUpCi0KLSAgICBvbGRfYXR0cmlidXRlID0gcGFyZW50Ll9fZGljdF9fLmdldChjaGlsZF9uYW1lKQotICAgIGlmIG9sZF9hdHRyaWJ1dGUgaXMgbm90IE5vbmUgYW5kIGlzaW5zdGFuY2Uob2xkX2F0dHJpYnV0ZSwgc3RhdGljbWV0aG9kKToKLSAgICAgIG9sZF9jaGlsZCA9IHN0YXRpY21ldGhvZChvbGRfY2hpbGQpCi0KLSAgICBzZWxmLmNhY2hlLmFwcGVuZCgocGFyZW50LCBvbGRfY2hpbGQsIGNoaWxkX25hbWUpKQotICAgIHNldGF0dHIocGFyZW50LCBjaGlsZF9uYW1lLCBuZXdfY2hpbGQpCi0KLSAgZGVmIFVuc2V0QWxsKHNlbGYpOgotICAgICIiIlJldmVyc2VzIGFsbCB0aGUgU2V0KCkgY2FsbHMsIHJlc3RvcmluZyB0aGluZ3MgdG8gdGhlaXIgb3JpZ2luYWwKLSAgICBkZWZpbml0aW9uLiAgSXRzIG9rYXkgdG8gY2FsbCBVbnNldEFsbCgpIHJlcGVhdGVkbHksIGFzIGxhdGVyIGNhbGxzIGhhdmUKLSAgICBubyBlZmZlY3QgaWYgbm8gU2V0KCkgY2FsbHMgaGF2ZSBiZWVuIG1hZGUuCi0KLSAgICAiIiIKLSAgICAjIFVuZG8gY2FsbHMgdG8gU2V0KCkgaW4gcmV2ZXJzZSBvcmRlciwgaW4gY2FzZSBTZXQoKSB3YXMgY2FsbGVkIG9uIHRoZQotICAgICMgc2FtZSBhcmd1bWVudHMgcmVwZWF0ZWRseSAod2FudCB0aGUgb3JpZ2luYWwgY2FsbCB0byBiZSBsYXN0IG9uZSB1bmRvbmUpCi0gICAgc2VsZi5jYWNoZS5yZXZlcnNlKCkKLQotICAgIGZvciAocGFyZW50LCBvbGRfY2hpbGQsIGNoaWxkX25hbWUpIGluIHNlbGYuY2FjaGU6Ci0gICAgICBzZXRhdHRyKHBhcmVudCwgY2hpbGRfbmFtZSwgb2xkX2NoaWxkKQotICAgIHNlbGYuY2FjaGUgPSBbXQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHl0aG9uL3RveC5pbmkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vdG94LmluaQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2Y4ZDU0MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9weXRob24vdG94LmluaQorKysgL2Rldi9udWxsCkBAIC0xLDI0ICswLDAgQEAKLVt0b3hdCi1lbnZsaXN0ID0KLSAgICBweXsyNiwyNywzMywzNH0te2NwcCxweXRob259Ci0KLVt0ZXN0ZW52XQotdXNlZGV2ZWxvcD10cnVlCi1wYXNzZW52ID0gQ0MKLXNldGVudiA9Ci0gICAgY3BwOiBMRF9MSUJSQVJZX1BBVEg9e3RveGluaWRpcn0vLi4vc3JjLy5saWJzCi0gICAgY3BwOiBEWUxEX0xJQlJBUllfUEFUSD17dG94aW5pZGlyfS8uLi9zcmMvLmxpYnMKLSAgICBjcHA6IFBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OPWNwcAotY29tbWFuZHMgPQotICAgIHB5dGhvbiBzZXR1cC5weSAtcSBidWlsZF9weQotICAgIHB5dGhvbjogcHl0aG9uIHNldHVwLnB5IC1xIGJ1aWxkCi0gICAgY3BwOiBweXRob24gc2V0dXAucHkgLXEgYnVpbGQgLS1jcHBfaW1wbGVtZW50YXRpb24gLS13YXJuaW5nc19hc19lcnJvcnMKLSAgICBweXRob246IHB5dGhvbiBzZXR1cC5weSAtcSB0ZXN0IC1xCi0gICAgY3BwOiBweXRob24gc2V0dXAucHkgLXEgdGVzdCAtcSAtLWNwcF9pbXBsZW1lbnRhdGlvbgotICAgIHB5dGhvbjogcHl0aG9uIHNldHVwLnB5IC1xIHRlc3RfY29uZm9ybWFuY2UKLSAgICBjcHA6IHB5dGhvbiBzZXR1cC5weSAtcSB0ZXN0X2NvbmZvcm1hbmNlIC0tY3BwX2ltcGxlbWVudGF0aW9uCi1kZXBzID0KLSAgICAjIEtlZXAgdGhpcyBsaXN0IG9mIGRlcGVuZGVuY2llcyBpbiBzeW5jIHdpdGggc2V0dXAucHkuCi0gICAgc2l4Pj0xLjkKLSAgICBweTI2OiBvcmRlcmVkZGljdAotICAgIHB5MjY6IHVuaXR0ZXN0MgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9HZW1maWxlIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9HZW1maWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTc1ZGYxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvR2VtZmlsZQorKysgL2Rldi9udWxsCkBAIC0xLDMgKzAsMCBAQAotc291cmNlICdodHRwczovL3J1YnlnZW1zLm9yZycKLQotZ2Vtc3BlYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9HZW1maWxlLmxvY2sgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L0dlbWZpbGUubG9jawpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDBlYjljYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L0dlbWZpbGUubG9jaworKysgL2Rldi9udWxsCkBAIC0xLDMwICswLDAgQEAKLVBBVEgKLSAgcmVtb3RlOiAuCi0gIHNwZWNzOgotICAgIGdvb2dsZS1wcm90b2J1ZiAoMy4wLjAuYWxwaGEuNS4wLjUpCi0KLUdFTQotICByZW1vdGU6IGh0dHBzOi8vcnVieWdlbXMub3JnLwotICBzcGVjczoKLSAgICBwb3dlcl9hc3NlcnQgKDAuMi4yKQotICAgIHJha2UgKDEwLjQuMikKLSAgICByYWtlLWNvbXBpbGVyICgwLjkuNSkKLSAgICAgIHJha2UKLSAgICByYWtlLWNvbXBpbGVyLWRvY2sgKDAuNS4xKQotICAgIHJ1YnlnZW1zLXRhc2tzICgwLjIuNCkKLSAgICB0ZXN0LXVuaXQgKDMuMC45KQotICAgICAgcG93ZXJfYXNzZXJ0Ci0KLVBMQVRGT1JNUwotICBqYXZhCi0gIHJ1YnkKLQotREVQRU5ERU5DSUVTCi0gIGdvb2dsZS1wcm90b2J1ZiEKLSAgcmFrZS1jb21waWxlcgotICByYWtlLWNvbXBpbGVyLWRvY2sKLSAgcnVieWdlbXMtdGFza3MKLSAgdGVzdC11bml0Ci0KLUJVTkRMRUQgV0lUSAotICAgMS4xMS4yCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvUkVBRE1FLm1kCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjhlMDVhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvUkVBRE1FLm1kCisrKyAvZGV2L251bGwKQEAgLTEsMTE0ICswLDAgQEAKLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBSdWJ5IGV4dGVuc2lvbiB0aGF0IGltcGxlbWVudHMgUHJvdG9jb2wgQnVmZmVycwotZnVuY3Rpb25hbGl0eSBpbiBSdWJ5LgotCi1UaGUgUnVieSBleHRlbnNpb24gbWFrZXMgdXNlIG9mIGdlbmVyYXRlZCBSdWJ5IGNvZGUgdGhhdCBkZWZpbmVzIG1lc3NhZ2UgYW5kCi1lbnVtIHR5cGVzIGluIGEgUnVieSBEU0wuIFlvdSBtYXkgd3JpdGUgZGVmaW5pdGlvbnMgaW4gdGhpcyBEU0wgZGlyZWN0bHksIGJ1dAotd2UgcmVjb21tZW5kIHVzaW5nIHByb3RvYydzIFJ1YnkgZ2VuZXJhdGlvbiBzdXBwb3J0IHdpdGggLnByb3RvIGZpbGVzLiBUaGUKLWJ1aWxkIHByb2Nlc3MgaW4gdGhpcyBkaXJlY3Rvcnkgb25seSBpbnN0YWxscyB0aGUgZXh0ZW5zaW9uOyB5b3UgbmVlZCB0bwotaW5zdGFsbCBwcm90b2MgYXMgd2VsbCB0byBoYXZlIFJ1YnkgY29kZSBnZW5lcmF0aW9uIGZ1bmN0aW9uYWxpdHkuCi0KLUluc3RhbGxhdGlvbiBmcm9tIEdlbQotLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVdoZW4gd2UgcmVsZWFzZSBhIHZlcnNpb24gb2YgUHJvdG9jb2wgQnVmZmVycywgd2Ugd2lsbCB1cGxvYWQgYSBHZW0gdG8KLVtSdWJ5R2Vtc10oaHR0cHM6Ly93d3cucnVieWdlbXMub3JnLykuIFRvIHVzZSB0aGlzIHByZS1wYWNrYWdlZCBnZW0sIHNpbXBseQotaW5zdGFsbCBpdCBhcyB5b3Ugd291bGQgYW55IG90aGVyIGdlbToKLQotICAgICQgZ2VtIGluc3RhbGwgWy0tcHJlcmVsZWFzZV0gZ29vZ2xlLXByb3RvYnVmCi0KLVRoZSBgLS1wcmVgIGZsYWcgaXMgbmVjZXNzYXJ5IGlmIHdlIGhhdmUgbm90IHlldCBtYWRlIGEgbm9uLWFscGhhL2JldGEgcmVsZWFzZQotb2YgdGhlIFJ1YnkgZXh0ZW5zaW9uOyBpdCBhbGxvd3MgYGdlbWAgdG8gY29uc2lkZXIgdGhlc2UgInByZS1yZWxlYXNlIgotYWxwaGEvYmV0YSB2ZXJzaW9ucy4KLQotT25jZSB0aGUgZ2VtIGlzIGluc3RhbGxlZCwgeW91IG1heSBvciBtYXkgbm90IG5lZWQgYHByb3RvY2AuIElmIHlvdSB3cml0ZSB5b3VyCi1tZXNzYWdlIHR5cGUgZGVzY3JpcHRpb25zIGRpcmVjdGx5IGluIHRoZSBSdWJ5IERTTCwgeW91IGRvIG5vdCBuZWVkIGl0LgotSG93ZXZlciwgaWYgeW91IHdpc2ggdG8gZ2VuZXJhdGUgdGhlIFJ1YnkgRFNMIGZyb20gYSBgLnByb3RvYCBmaWxlLCB5b3Ugd2lsbAotYWxzbyB3YW50IHRvIGluc3RhbGwgUHJvdG9jb2wgQnVmZmVycyBpdHNlbGYsIGFzIGRlc2NyaWJlZCBpbiB0aGlzIHJlcG9zaXRvcnkncwotbWFpbiBgUkVBRE1FYCBmaWxlLiBUaGUgdmVyc2lvbiBvZiBgcHJvdG9jYCBpbmNsdWRlZCBpbiB0aGUgbGF0ZXN0IHJlbGVhc2UKLXN1cHBvcnRzIHRoZSBgLS1ydWJ5X291dGAgb3B0aW9uIHRvIGdlbmVyYXRlIFJ1YnkgY29kZS4KLQotQSBzaW1wbGUgZXhhbXBsZSBvZiB1c2luZyB0aGUgUnVieSBleHRlbnNpb24gZm9sbG93cy4gTW9yZSBleHRlbnNpdmUKLWRvY3VtZW50YXRpb24gbWF5IGJlIGZvdW5kIGluIHRoZSBSdWJ5RG9jIGNvbW1lbnRzIChgY2FsbC1zZXFgIHRhZ3MpIGluIHRoZQotc291cmNlLCBhbmQgd2UgcGxhbiB0byByZWxlYXNlIHNlcGFyYXRlLCBtb3JlIGRldGFpbGVkLCBkb2N1bWVudGF0aW9uIGF0IGEKLWxhdGVyIGRhdGUuCi0KLWBgYHJ1YnkKLXJlcXVpcmUgJ2dvb2dsZS9wcm90b2J1ZicKLQotIyBnZW5lcmF0ZWQgZnJvbSBteV9wcm90b190eXBlcy5wcm90byB3aXRoIHByb3RvYzoKLSMgICQgcHJvdG9jIC0tcnVieV9vdXQ9LiBteV9wcm90b190eXBlcy5wcm90bwotcmVxdWlyZSAnbXlfcHJvdG9fdHlwZXMnCi0KLW15bWVzc2FnZSA9IE15VGVzdE1lc3NhZ2UubmV3KDpmaWVsZDEgPT4gNDIsIDpmaWVsZDIgPT4gWyJhIiwgImIiLCAiYyJdKQotbXltZXNzYWdlLmZpZWxkMSA9IDQzCi1teW1lc3NhZ2UuZmllbGQyLnB1c2goImQiKQotbXltZXNzYWdlLmZpZWxkMyA9IFN1Yk1lc3NhZ2UubmV3KDpmb28gPT4gMTAwKQotCi1lbmNvZGVkX2RhdGEgPSBNeVRlc3RNZXNzYWdlLmVuY29kZShteW1lc3NhZ2UpCi1kZWNvZGVkID0gTXlUZXN0TWVzc2FnZS5kZWNvZGUoZW5jb2RlZF9kYXRhKQotYXNzZXJ0IGRlY29kZWQgPT0gbXltZXNzYWdlCi0KLXB1dHMgIkpTT046IgotcHV0cyBNeVRlc3RNZXNzYWdlLmVuY29kZV9qc29uKG15bWVzc2FnZSkKLWBgYAotCi1JbnN0YWxsYXRpb24gZnJvbSBTb3VyY2UgKEJ1aWxkaW5nIEdlbSkKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1UbyBidWlsZCB0aGlzIFJ1YnkgZXh0ZW5zaW9uLCB5b3Ugd2lsbCBuZWVkOgotCi0qIFJha2UKLSogQnVuZGxlcgotKiBSdWJ5IGRldmVsb3BtZW50IGhlYWRlcnMKLSogYSBDIGNvbXBpbGVyCi0KLVRvIEJ1aWxkIHRoZSBKUnVieSBleHRlbnNpb24sIHlvdSB3aWxsIG5lZWQ6Ci0KLSogTWF2ZW4KLSogVGhlIGxhdGVzdCB2ZXJzaW9uIG9mIHRoZSBwcm90b2J1ZiBqYXZhIGxpYnJhcnkgKHNlZSAuLi9qYXZhL1JFQURNRS5tZCkKLSogSW5zdGFsbCBKUnVieSB2aWEgcmJlbnYgb3IgUlZNCi0KLUZpcnN0IHN3aXRjaCB0byB0aGUgZGVzaXJlZCBwbGF0Zm9ybSB3aXRoIHJiZW52IG9yIFJWTS4KLQotVGhlbiBpbnN0YWxsIHRoZSByZXF1aXJlZCBSdWJ5IGdlbXM6Ci0KLSAgICAkIGdlbSBpbnN0YWxsIGJ1bmRsZXIKLSAgICAkIGJ1bmRsZQotCi1UaGVuIGJ1aWxkIHRoZSBHZW06Ci0KLSAgICAkIHJha2UKLSAgICAkIHJha2UgY2xvYmJlcl9wYWNrYWdlIGdlbQotICAgICQgZ2VtIGluc3RhbGwgYGxzIHBrZy9nb29nbGUtcHJvdG9idWYtKi5nZW1gCi0KLVRvIHJ1biB0aGUgc3BlY3M6Ci0KLSAgICAkIHJha2UgdGVzdAotCi1UaGlzIGdlbSBpbmNsdWRlcyB0aGUgdXBiIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gbGlicmFyeSBhcyBhIHNpbmdsZS1maWxlCi1hbWFsZ2FtYXRpb24uIEl0IGlzIHVwLXRvLWRhdGUgd2l0aCB1cGIgZ2l0IGNvbW1pdAotYDUzNWJjMmZlMmYyYjQ2N2Y1OTM0N2ZmYzk0NDllMTFlNDc3OTEyNTdgLgotCi1WZXJzaW9uIE51bWJlciBTY2hlbWUKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1XZSBhcmUgdXNpbmcgYSB2ZXJzaW9uIG51bWJlciBzY2hlbWUgdGhhdCBpcyBhIGh5YnJpZCBvZiBQcm90b2NvbCBCdWZmZXJzJwotb3ZlcmFsbCB2ZXJzaW9uIG51bWJlciBhbmQgc29tZSBSdWJ5LXNwZWNpZmljIHJ1bGVzLiBHZW0gZG9lcyBub3QgYWxsb3cKLXJlLXVwbG9hZHMgb2YgYSBnZW0gd2l0aCB0aGUgc2FtZSB2ZXJzaW9uIG51bWJlciwgc28gd2UgYWRkIGEgc2VxdWVuY2UgbnVtYmVyCi0oInVwbG9hZCB2ZXJzaW9uIikgdG8gdGhlIHZlcnNpb24uIFdlIGFsc28gZm9ybWF0IGFscGhhYmV0aWNhbCB0YWdzIChhbHBoYSwKLXByZSwgLi4uKSBzbGlnaHRseSBkaWZmZXJlbnRseSwgYW5kIHdlIGF2b2lkIGh5cGhlbnMuIEluIG1vcmUgZGV0YWlsOgotCi0qIEZpcnN0LCB3ZSBkZXRlcm1pbmUgdGhlIHByZWZpeDogYSBQcm90b2NvbCBCdWZmZXJzIHZlcnNpb24gIjMuMC4wLWFscGhhLTIiCi0gIGJlY29tZXMgIjMuMC4wLmFscGhhLjIiLiBXaGVuIHdlIHJlbGVhc2UgMy4wLjAsIHRoaXMgcHJlZml4IHdpbGwgYmUgc2ltcGx5Ci0gICIzLjAuMCIuCi0qIFdlIHRoZW4gYXBwZW5kIHRoZSB1cGxvYWQgdmVyc2lvbjogIjMuMC4wLmFscGhhLjIuMCIgb3IgIjMuMC4wLjAiLiBJZiB3ZSBuZWVkCi0gIHRvIHVwbG9hZCBhIG5ldyB2ZXJzaW9uIG9mIHRoZSBnZW0gdG8gZml4IGFuIGlzc3VlLCB0aGUgdmVyc2lvbiBiZWNvbWVzCi0gICIzLjAuMC5hbHBoYS4yLjEiIG9yICIzLjAuMC4xIi4KLSogSWYgd2UgYXJlIHdvcmtpbmcgb24gYSBwcmVyZWxlYXNlIHZlcnNpb24sIHdlIGFwcGVuZCBhIHByZXJlbGVhc2UgdGFnOgotICAiMy4wLjAuYWxwaGEuMy4wLnByZSIuIFRoZSBwcmVyZWxlYXNlIHRhZyBjb21lcyBhdCB0aGUgZW5kIHNvIHRoYXQgd2hlbgotICB2ZXJzaW9uIG51bWJlcnMgYXJlIHNvcnRlZCwgYW55IHByZXJlbGVhc2UgYnVpbGRzIGFyZSBvcmRlcmVkIGJldHdlZW4gdGhlCi0gIHByaW9yIHZlcnNpb24gYW5kIGN1cnJlbnQgdmVyc2lvbi4KLQotVGhlc2UgcnVsZXMgYXJlIGRlc2lnbmVkIHRvIHdvcmsgd2l0aCB0aGUgc29ydGluZyBydWxlcyBmb3IKLVtHZW06OlZlcnNpb25dKGh0dHA6Ly9ydWJ5LWRvYy5vcmcvc3RkbGliLTIuMC9saWJkb2MvcnVieWdlbXMvcmRvYy9HZW0vVmVyc2lvbi5odG1sKToKLXJlbGVhc2UgbnVtYmVycyBzaG91bGQgc29ydCBpbiBhY3R1YWwgcmVsZWFzZSBvcmRlci4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvUmFrZWZpbGUgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L1Jha2VmaWxlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmYTI5YzMxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvUmFrZWZpbGUKKysrIC9kZXYvbnVsbApAQCAtMSwxMDMgKzAsMCBAQAotcmVxdWlyZSAicnVieWdlbXMiCi1yZXF1aXJlICJydWJ5Z2Vtcy9wYWNrYWdlX3Rhc2siCi1yZXF1aXJlICJyYWtlL2V4dGVuc2lvbnRhc2siIHVubGVzcyBSVUJZX1BMQVRGT1JNID09ICJqYXZhIgotcmVxdWlyZSAicmFrZS90ZXN0dGFzayIKLQotc3BlYyA9IEdlbTo6U3BlY2lmaWNhdGlvbi5sb2FkKCJnb29nbGUtcHJvdG9idWYuZ2Vtc3BlYyIpCi0KLXdlbGxfa25vd25fcHJvdG9zID0gJXdbCi0gIGdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8KLSAgZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bwotICBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KLSAgZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvCi0gIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCi0gIGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wcm90bwotICBnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvCi0gIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8KLSAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8KLSAgZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvCi1dCi0KLSMgVGhlc2UgYXJlIG9taXR0ZWQgZm9yIG5vdyBiZWNhdXNlIHdlIGRvbid0IHN1cHBvcnQgcHJvdG8yLgotcHJvdG8yX3Byb3RvcyA9ICV3WwotICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvCi1dCi0KLWdlbnByb3RvX291dHB1dCA9IFtdCi0KLSMgV2Ugd29uJ3QgaGF2ZSBhY2Nlc3MgdG8gLi4gZnJvbSB3aXRoaW4gZG9ja2VyLCBidXQgdGhlIHByb3RvIGZpbGVzCi0jIHdpbGwgYmUgdGhlcmUsIHRoYW5rcyB0byB0aGUgOmdlbnByb3RvIHJ1bGUgZGVwZW5kZW5jeSBmb3IgZ2VtOm5hdGl2ZS4KLXVubGVzcyBFTlZbJ0lOX0RPQ0tFUiddID09ICd0cnVlJwotICB3ZWxsX2tub3duX3Byb3Rvcy5lYWNoIGRvIHxwcm90b19maWxlfAotICAgIGlucHV0X2ZpbGUgPSAiLi4vc3JjLyIgKyBwcm90b19maWxlCi0gICAgb3V0cHV0X2ZpbGUgPSAibGliLyIgKyBwcm90b19maWxlLnN1YigvXC5wcm90byQvLCAiLnJiIikKLSAgICBnZW5wcm90b19vdXRwdXQgPDwgb3V0cHV0X2ZpbGUKLSAgICBmaWxlIG91dHB1dF9maWxlID0+IGlucHV0X2ZpbGUgZG8gfGZpbGVfdGFza3wKLSAgICAgIHNoICIuLi9zcmMvcHJvdG9jIC1JLi4vc3JjIC0tcnVieV9vdXQ9bGliICN7aW5wdXRfZmlsZX0iCi0gICAgZW5kCi0gIGVuZAotZW5kCi0KLWlmIFJVQllfUExBVEZPUk0gPT0gImphdmEiCi0gIGlmIGB3aGljaCBtdm5gID09ICcnCi0gICAgcmFpc2UgQXJndW1lbnRFcnJvciwgIm1hdmVuIG5lZWRzIHRvIGJlIGluc3RhbGxlZCIKLSAgZW5kCi0gIHRhc2sgOmNsZWFuIGRvCi0gICAgc3lzdGVtKCJtdm4gY2xlYW4iKQotICBlbmQKLQotICB0YXNrIDpjb21waWxlIGRvCi0gICAgc3lzdGVtKCJtdm4gcGFja2FnZSIpCi0gIGVuZAotZWxzZQotICBSYWtlOjpFeHRlbnNpb25UYXNrLm5ldygicHJvdG9idWZfYyIsIHNwZWMpIGRvIHxleHR8Ci0gICAgZXh0LmV4dF9kaXIgPSAiZXh0L2dvb2dsZS9wcm90b2J1Zl9jIgotICAgIGV4dC5saWJfZGlyID0gImxpYi9nb29nbGUiCi0gICAgZXh0LmNyb3NzX2NvbXBpbGUgPSB0cnVlCi0gICAgZXh0LmNyb3NzX3BsYXRmb3JtID0gWwotICAgICAgJ3g4Ni1taW5ndzMyJywgJ3g2NC1taW5ndzMyJywKLSAgICAgICd4ODZfNjQtbGludXgnLCAneDg2LWxpbnV4JywKLSAgICAgICd1bml2ZXJzYWwtZGFyd2luJwotICAgIF0KLSAgZW5kCi0KLSAgdGFzayAnZ2VtOndpbmRvd3MnIGRvCi0gICAgcmVxdWlyZSAncmFrZV9jb21waWxlcl9kb2NrJwotICAgIFJha2VDb21waWxlckRvY2suc2ggImJ1bmRsZSAmJiBJTl9ET0NLRVI9dHJ1ZSByYWtlIGNyb3NzIG5hdGl2ZSBnZW0gUlVCWV9DQ19WRVJTSU9OPTIuMy4wOjIuMi4yOjIuMS41OjIuMC4wIgotICBlbmQKLQotICBpZiBSVUJZX1BMQVRGT1JNID1+IC9kYXJ3aW4vCi0gICAgdGFzayAnZ2VtOm5hdGl2ZScgZG8KLSAgICAgIHN5c3RlbSAicmFrZSBnZW5wcm90byIKLSAgICAgIHN5c3RlbSAicmFrZSBjcm9zcyBuYXRpdmUgZ2VtIFJVQllfQ0NfVkVSU0lPTj0yLjMuMDoyLjIuMjoyLjEuNToyLjAuMCIKLSAgICBlbmQKLSAgZWxzZQotICAgIHRhc2sgJ2dlbTpuYXRpdmUnID0+IFs6Z2VucHJvdG8sICdnZW06d2luZG93cyddCi0gIGVuZAotZW5kCi0KLQotIyBQcm90byBmb3IgdGVzdHMuCi1nZW5wcm90b19vdXRwdXQgPDwgInRlc3RzL2dlbmVyYXRlZF9jb2RlLnJiIgotZmlsZSAidGVzdHMvZ2VuZXJhdGVkX2NvZGUucmIiID0+ICJ0ZXN0cy9nZW5lcmF0ZWRfY29kZS5wcm90byIgZG8gfGZpbGVfdGFza3wKLSAgc2ggIi4uL3NyYy9wcm90b2MgLS1ydWJ5X291dD0uIHRlc3RzL2dlbmVyYXRlZF9jb2RlLnByb3RvIgotZW5kCi0KLXRhc2sgOmdlbnByb3RvID0+IGdlbnByb3RvX291dHB1dAotCi10YXNrIDpjbGVhbiBkbwotICBzaCAicm0gLWYgI3tnZW5wcm90b19vdXRwdXQuam9pbignICcpfSIKLWVuZAotCi1HZW06OlBhY2thZ2VUYXNrLm5ldyhzcGVjKSBkbyB8cGtnfAotZW5kCi0KLVJha2U6OlRlc3RUYXNrLm5ldyg6dGVzdCA9PiA6YnVpbGQpIGRvIHx0fAotICB0LnRlc3RfZmlsZXMgPSBGaWxlTGlzdFsidGVzdHMvKi5yYiJdCi1lbmQKLQotdGFzayA6YnVpbGQgPT4gWzpjbGVhbiwgOmNvbXBpbGUsIDpnZW5wcm90b10KLXRhc2sgOmRlZmF1bHQgPT4gWzpidWlsZF0KLQotIyB2aW06c3c9MjpldApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvZGVmcy5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvZGVmcy5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZTkzYmFmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL2RlZnMuYworKysgL2Rldi9udWxsCkBAIC0xLDE3NjMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbmNsdWRlICJwcm90b2J1Zi5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ29tbW9uIHV0aWxpdGllcy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0YXRpYyBjb25zdCBjaGFyKiBnZXRfc3RyKFZBTFVFIHN0cikgewotICBDaGVja19UeXBlKHN0ciwgVF9TVFJJTkcpOwotICByZXR1cm4gUlNUUklOR19QVFIoc3RyKTsKLX0KLQotc3RhdGljIFZBTFVFIHJiX3N0cl9tYXliZV9udWxsKGNvbnN0IGNoYXIqIHMpIHsKLSAgaWYgKHMgPT0gTlVMTCkgewotICAgIHMgPSAiIjsKLSAgfQotICByZXR1cm4gcmJfc3RyX25ldzIocyk7Ci19Ci0KLXN0YXRpYyB1cGJfZGVmKiBjaGVja19ub3Rmcm96ZW4oY29uc3QgdXBiX2RlZiogZGVmKSB7Ci0gIGlmICh1cGJfZGVmX2lzZnJvemVuKGRlZikpIHsKLSAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLAotICAgICAgICAgICAgICJBdHRlbXB0IHRvIG1vZGlmeSBhIGZyb3plbiBkZXNjcmlwdG9yLiBPbmNlIGRlc2NyaXB0b3JzIGFyZSAiCi0gICAgICAgICAgICAgImFkZGVkIHRvIHRoZSBkZXNjcmlwdG9yIHBvb2wsIHRoZXkgbWF5IG5vdCBiZSBtb2RpZmllZC4iKTsKLSAgfQotICByZXR1cm4gKHVwYl9kZWYqKWRlZjsKLX0KLQotc3RhdGljIHVwYl9tc2dkZWYqIGNoZWNrX21zZ19ub3Rmcm96ZW4oY29uc3QgdXBiX21zZ2RlZiogZGVmKSB7Ci0gIHJldHVybiB1cGJfZG93bmNhc3RfbXNnZGVmX211dGFibGUoY2hlY2tfbm90ZnJvemVuKChjb25zdCB1cGJfZGVmKilkZWYpKTsKLX0KLQotc3RhdGljIHVwYl9maWVsZGRlZiogY2hlY2tfZmllbGRfbm90ZnJvemVuKGNvbnN0IHVwYl9maWVsZGRlZiogZGVmKSB7Ci0gIHJldHVybiB1cGJfZG93bmNhc3RfZmllbGRkZWZfbXV0YWJsZShjaGVja19ub3Rmcm96ZW4oKGNvbnN0IHVwYl9kZWYqKWRlZikpOwotfQotCi1zdGF0aWMgdXBiX29uZW9mZGVmKiBjaGVja19vbmVvZl9ub3Rmcm96ZW4oY29uc3QgdXBiX29uZW9mZGVmKiBkZWYpIHsKLSAgcmV0dXJuICh1cGJfb25lb2ZkZWYqKWNoZWNrX25vdGZyb3plbigoY29uc3QgdXBiX2RlZiopZGVmKTsKLX0KLQotc3RhdGljIHVwYl9lbnVtZGVmKiBjaGVja19lbnVtX25vdGZyb3plbihjb25zdCB1cGJfZW51bWRlZiogZGVmKSB7Ci0gIHJldHVybiAodXBiX2VudW1kZWYqKWNoZWNrX25vdGZyb3plbigoY29uc3QgdXBiX2RlZiopZGVmKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlc2NyaXB0b3JQb29sLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotI2RlZmluZSBERUZJTkVfQ0xBU1MobmFtZSwgc3RyaW5nX25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVkFMVUUgYyAjIyBuYW1lOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCByYl9kYXRhX3R5cGVfdCBfICMjIG5hbWUgIyMgX3R5cGUgPSB7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgc3RyaW5nX25hbWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB7IG5hbWUgIyMgX21hcmssIG5hbWUgIyMgX2ZyZWUsIE5VTEwgfSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIG5hbWUqIHJ1YnlfdG9fICMjIG5hbWUoVkFMVUUgdmFsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBuYW1lKiByZXQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFR5cGVkRGF0YV9HZXRfU3RydWN0KHZhbCwgbmFtZSwgJl8gIyMgbmFtZSAjIyBfdHlwZSwgcmV0KTsgICAgXAotICAgICAgcmV0dXJuIHJldDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLQotI2RlZmluZSBERUZJTkVfU0VMRih0eXBlLCB2YXIsIHJiX3ZhcikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHlwZSogdmFyID0gcnVieV90b18gIyMgdHlwZShyYl92YXIpCi0KLS8vIEdsb2JhbCBzaW5nbGV0b24gRGVzY3JpcHRvclBvb2wuIFRoZSB1c2VyIGlzIGZyZWUgdG8gY3JlYXRlIG90aGVycywgYnV0IHRoaXMKLS8vIGlzIHVzZWQgYnkgZ2VuZXJhdGVkIGNvZGUuCi1WQUxVRSBnZW5lcmF0ZWRfcG9vbDsKLQotREVGSU5FX0NMQVNTKERlc2NyaXB0b3JQb29sLCAiR29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wiKTsKLQotdm9pZCBEZXNjcmlwdG9yUG9vbF9tYXJrKHZvaWQqIF9zZWxmKSB7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclBvb2xfZnJlZSh2b2lkKiBfc2VsZikgewotICBEZXNjcmlwdG9yUG9vbCogc2VsZiA9IF9zZWxmOwotICB1cGJfc3ltdGFiX3VucmVmKHNlbGYtPnN5bXRhYiwgJnNlbGYtPnN5bXRhYik7Ci0gIHhmcmVlKHNlbGYpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRGVzY3JpcHRvclBvb2wubmV3ID0+IHBvb2wKLSAqCi0gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSwgZGVzY3JpcHRvciBwb29sLgotICovCi1WQUxVRSBEZXNjcmlwdG9yUG9vbF9hbGxvYyhWQUxVRSBrbGFzcykgewotICBEZXNjcmlwdG9yUG9vbCogc2VsZiA9IEFMTE9DKERlc2NyaXB0b3JQb29sKTsKLSAgc2VsZi0+c3ltdGFiID0gdXBiX3N5bXRhYl9uZXcoJnNlbGYtPnN5bXRhYik7Ci0gIHJldHVybiBUeXBlZERhdGFfV3JhcF9TdHJ1Y3Qoa2xhc3MsICZfRGVzY3JpcHRvclBvb2xfdHlwZSwgc2VsZik7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclBvb2xfcmVnaXN0ZXIoVkFMVUUgbW9kdWxlKSB7Ci0gIFZBTFVFIGtsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKAotICAgICAgbW9kdWxlLCAiRGVzY3JpcHRvclBvb2wiLCByYl9jT2JqZWN0KTsKLSAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMoa2xhc3MsIERlc2NyaXB0b3JQb29sX2FsbG9jKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImFkZCIsIERlc2NyaXB0b3JQb29sX2FkZCwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJidWlsZCIsIERlc2NyaXB0b3JQb29sX2J1aWxkLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImxvb2t1cCIsIERlc2NyaXB0b3JQb29sX2xvb2t1cCwgMSk7Ci0gIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKGtsYXNzLCAiZ2VuZXJhdGVkX3Bvb2wiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbF9nZW5lcmF0ZWRfcG9vbCwgMCk7Ci0gIGNEZXNjcmlwdG9yUG9vbCA9IGtsYXNzOwotICByYl9nY19yZWdpc3Rlcl9hZGRyZXNzKCZjRGVzY3JpcHRvclBvb2wpOwotCi0gIGdlbmVyYXRlZF9wb29sID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIGtsYXNzKTsKLSAgcmJfZ2NfcmVnaXN0ZXJfYWRkcmVzcygmZ2VuZXJhdGVkX3Bvb2wpOwotfQotCi1zdGF0aWMgdm9pZCBhZGRfZGVzY3JpcHRvcl90b19wb29sKERlc2NyaXB0b3JQb29sKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIENIRUNLX1VQQigKLSAgICAgIHVwYl9zeW10YWJfYWRkKHNlbGYtPnN5bXRhYiwgKHVwYl9kZWYqKikmZGVzY3JpcHRvci0+bXNnZGVmLCAxLAotICAgICAgICAgICAgICAgICAgICAgTlVMTCwgJnN0YXR1cyksCi0gICAgICAiQWRkaW5nIERlc2NyaXB0b3IgdG8gRGVzY3JpcHRvclBvb2wgZmFpbGVkIik7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF9lbnVtZGVzY190b19wb29sKERlc2NyaXB0b3JQb29sKiBzZWxmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3IqIGVudW1kZXNjKSB7Ci0gIENIRUNLX1VQQigKLSAgICAgIHVwYl9zeW10YWJfYWRkKHNlbGYtPnN5bXRhYiwgKHVwYl9kZWYqKikmZW51bWRlc2MtPmVudW1kZWYsIDEsCi0gICAgICAgICAgICAgICAgICAgICBOVUxMLCAmc3RhdHVzKSwKLSAgICAgICJBZGRpbmcgRW51bURlc2NyaXB0b3IgdG8gRGVzY3JpcHRvclBvb2wgZmFpbGVkIik7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBEZXNjcmlwdG9yUG9vbC5hZGQoZGVzY3JpcHRvcikKLSAqCi0gKiBBZGRzIHRoZSBnaXZlbiBEZXNjcmlwdG9yIG9yIEVudW1EZXNjcmlwdG9yIHRvIHRoaXMgcG9vbC4gQWxsIHJlZmVyZW5jZXMgdG8KLSAqIG90aGVyIHR5cGVzIGluIGEgRGVzY3JpcHRvcidzIGZpZWxkcyBtdXN0IGJlIHJlc29sdmFibGUgd2l0aGluIHRoaXMgcG9vbCBvcgotICogYW4gZXhjZXB0aW9uIHdpbGwgYmUgcmFpc2VkLgotICovCi1WQUxVRSBEZXNjcmlwdG9yUG9vbF9hZGQoVkFMVUUgX3NlbGYsIFZBTFVFIGRlZikgewotICBERUZJTkVfU0VMRihEZXNjcmlwdG9yUG9vbCwgc2VsZiwgX3NlbGYpOwotICBWQUxVRSBkZWZfa2xhc3MgPSByYl9vYmpfY2xhc3MoZGVmKTsKLSAgaWYgKGRlZl9rbGFzcyA9PSBjRGVzY3JpcHRvcikgewotICAgIGFkZF9kZXNjcmlwdG9yX3RvX3Bvb2woc2VsZiwgcnVieV90b19EZXNjcmlwdG9yKGRlZikpOwotICB9IGVsc2UgaWYgKGRlZl9rbGFzcyA9PSBjRW51bURlc2NyaXB0b3IpIHsKLSAgICBhZGRfZW51bWRlc2NfdG9fcG9vbChzZWxmLCBydWJ5X3RvX0VudW1EZXNjcmlwdG9yKGRlZikpOwotICB9IGVsc2UgewotICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwKLSAgICAgICAgICAgICAiU2Vjb25kIGFyZ3VtZW50IG11c3QgYmUgYSBEZXNjcmlwdG9yIG9yIEVudW1EZXNjcmlwdG9yLiIpOwotICB9Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRGVzY3JpcHRvclBvb2wuYnVpbGQoJmJsb2NrKQotICoKLSAqIEludm9rZXMgdGhlIGJsb2NrIHdpdGggYSBCdWlsZGVyIGluc3RhbmNlIGFzIHNlbGYuIEFsbCBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzCi0gKiBhZGRlZCB3aXRoaW4gdGhlIGJsb2NrIGFyZSBjb21taXR0ZWQgdG8gdGhlIHBvb2wgYXRvbWljYWxseSwgYW5kIG1heSByZWZlcgotICogKGNvKXJlY3Vyc2l2ZWx5IHRvIGVhY2ggb3RoZXIuIFRoZSB1c2VyIHNob3VsZCBjYWxsIEJ1aWxkZXIjYWRkX21lc3NhZ2UgYW5kCi0gKiBCdWlsZGVyI2FkZF9lbnVtIHdpdGhpbiB0aGUgYmxvY2sgYXMgYXBwcm9wcmlhdGUuICBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCwKLSAqIGlkaW9tYXRpYyB3YXkgdG8gZGVmaW5lIG5ldyBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzLgotICovCi1WQUxVRSBEZXNjcmlwdG9yUG9vbF9idWlsZChWQUxVRSBfc2VsZikgewotICBWQUxVRSBjdHggPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMCwgTlVMTCwgY0J1aWxkZXIpOwotICBWQUxVRSBibG9jayA9IHJiX2Jsb2NrX3Byb2MoKTsKLSAgcmJfZnVuY2FsbF93aXRoX2Jsb2NrKGN0eCwgcmJfaW50ZXJuKCJpbnN0YW5jZV9ldmFsIiksIDAsIE5VTEwsIGJsb2NrKTsKLSAgcmJfZnVuY2FsbChjdHgsIHJiX2ludGVybigiZmluYWxpemVfdG9fcG9vbCIpLCAxLCBfc2VsZik7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRGVzY3JpcHRvclBvb2wubG9va3VwKG5hbWUpID0+IGRlc2NyaXB0b3IKLSAqCi0gKiBGaW5kcyBhIERlc2NyaXB0b3Igb3IgRW51bURlc2NyaXB0b3IgYnkgbmFtZSBhbmQgcmV0dXJucyBpdCwgb3IgbmlsIGlmIG5vbmUKLSAqIGV4aXN0cyB3aXRoIHRoZSBnaXZlbiBuYW1lLgotICovCi1WQUxVRSBEZXNjcmlwdG9yUG9vbF9sb29rdXAoVkFMVUUgX3NlbGYsIFZBTFVFIG5hbWUpIHsKLSAgREVGSU5FX1NFTEYoRGVzY3JpcHRvclBvb2wsIHNlbGYsIF9zZWxmKTsKLSAgY29uc3QgY2hhciogbmFtZV9zdHIgPSBnZXRfc3RyKG5hbWUpOwotICBjb25zdCB1cGJfZGVmKiBkZWYgPSB1cGJfc3ltdGFiX2xvb2t1cChzZWxmLT5zeW10YWIsIG5hbWVfc3RyKTsKLSAgaWYgKCFkZWYpIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfQotICByZXR1cm4gZ2V0X2RlZl9vYmooZGVmKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIERlc2NyaXB0b3JQb29sLmdlbmVyYXRlZF9wb29sID0+IGRlc2NyaXB0b3JfcG9vbAotICoKLSAqIENsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIGdsb2JhbCBEZXNjcmlwdG9yUG9vbC4gVGhpcyBpcyBhIHNpbmdsZXRvbiBpbnRvCi0gKiB3aGljaCBnZW5lcmF0ZWQtY29kZSBtZXNzYWdlIGFuZCBlbnVtIHR5cGVzIGFyZSByZWdpc3RlcmVkLiBUaGUgdXNlciBtYXkgYWxzbwotICogcmVnaXN0ZXIgdHlwZXMgaW4gdGhpcyBwb29sIGZvciBjb252ZW5pZW5jZSBzbyB0aGF0IHRoZXkgZG8gbm90IGhhdmUgdG8gaG9sZAotICogYSByZWZlcmVuY2UgdG8gYSBwcml2YXRlIHBvb2wgaW5zdGFuY2UuCi0gKi8KLVZBTFVFIERlc2NyaXB0b3JQb29sX2dlbmVyYXRlZF9wb29sKFZBTFVFIF9zZWxmKSB7Ci0gIHJldHVybiBnZW5lcmF0ZWRfcG9vbDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIERlc2NyaXB0b3IuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ERUZJTkVfQ0xBU1MoRGVzY3JpcHRvciwgIkdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3IiKTsKLQotdm9pZCBEZXNjcmlwdG9yX21hcmsodm9pZCogX3NlbGYpIHsKLSAgRGVzY3JpcHRvciogc2VsZiA9IF9zZWxmOwotICByYl9nY19tYXJrKHNlbGYtPmtsYXNzKTsKLSAgcmJfZ2NfbWFyayhzZWxmLT50eXBlY2xhc3NfcmVmZXJlbmNlcyk7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvcl9mcmVlKHZvaWQqIF9zZWxmKSB7Ci0gIERlc2NyaXB0b3IqIHNlbGYgPSBfc2VsZjsKLSAgdXBiX21zZ2RlZl91bnJlZihzZWxmLT5tc2dkZWYsICZzZWxmLT5tc2dkZWYpOwotICBpZiAoc2VsZi0+bGF5b3V0KSB7Ci0gICAgZnJlZV9sYXlvdXQoc2VsZi0+bGF5b3V0KTsKLSAgfQotICBpZiAoc2VsZi0+ZmlsbF9oYW5kbGVycykgewotICAgIHVwYl9oYW5kbGVyc191bnJlZihzZWxmLT5maWxsX2hhbmRsZXJzLCAmc2VsZi0+ZmlsbF9oYW5kbGVycyk7Ci0gIH0KLSAgaWYgKHNlbGYtPmZpbGxfbWV0aG9kKSB7Ci0gICAgdXBiX3BiZGVjb2Rlcm1ldGhvZF91bnJlZihzZWxmLT5maWxsX21ldGhvZCwgJnNlbGYtPmZpbGxfbWV0aG9kKTsKLSAgfQotICBpZiAoc2VsZi0+anNvbl9maWxsX21ldGhvZCkgewotICAgIHVwYl9qc29uX3BhcnNlcm1ldGhvZF91bnJlZihzZWxmLT5qc29uX2ZpbGxfbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmc2VsZi0+anNvbl9maWxsX21ldGhvZCk7Ci0gIH0KLSAgaWYgKHNlbGYtPnBiX3NlcmlhbGl6ZV9oYW5kbGVycykgewotICAgIHVwYl9oYW5kbGVyc191bnJlZihzZWxmLT5wYl9zZXJpYWxpemVfaGFuZGxlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5wYl9zZXJpYWxpemVfaGFuZGxlcnMpOwotICB9Ci0gIGlmIChzZWxmLT5qc29uX3NlcmlhbGl6ZV9oYW5kbGVycykgewotICAgIHVwYl9oYW5kbGVyc191bnJlZihzZWxmLT5qc29uX3NlcmlhbGl6ZV9oYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgJnNlbGYtPmpzb25fc2VyaWFsaXplX2hhbmRsZXJzKTsKLSAgfQotICBpZiAoc2VsZi0+anNvbl9zZXJpYWxpemVfaGFuZGxlcnNfcHJlc2VydmUpIHsKLSAgICB1cGJfaGFuZGxlcnNfdW5yZWYoc2VsZi0+anNvbl9zZXJpYWxpemVfaGFuZGxlcnNfcHJlc2VydmUsCi0gICAgICAgICAgICAgICAgICAgICAgICZzZWxmLT5qc29uX3NlcmlhbGl6ZV9oYW5kbGVyc19wcmVzZXJ2ZSk7Ci0gIH0KLSAgeGZyZWUoc2VsZik7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBEZXNjcmlwdG9yLm5ldyA9PiBkZXNjcmlwdG9yCi0gKgotICogQ3JlYXRlcyBhIG5ldywgZW1wdHksIG1lc3NhZ2UgdHlwZSBkZXNjcmlwdG9yLiBBdCBhIG1pbmltdW0sIGl0cyBuYW1lIG11c3QgYmUKLSAqIHNldCBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gYSBwb29sLiBJdCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgbWVzc2FnZXMgdW50aWwKLSAqIGl0IGlzIGFkZGVkIHRvIGEgcG9vbCwgYWZ0ZXIgd2hpY2ggaXQgYmVjb21lcyBpbW11dGFibGUgKGFzIHBhcnQgb2YgYQotICogZmluYWxpemF0aW9uIHByb2Nlc3MpLgotICovCi1WQUxVRSBEZXNjcmlwdG9yX2FsbG9jKFZBTFVFIGtsYXNzKSB7Ci0gIERlc2NyaXB0b3IqIHNlbGYgPSBBTExPQyhEZXNjcmlwdG9yKTsKLSAgVkFMVUUgcmV0ID0gVHlwZWREYXRhX1dyYXBfU3RydWN0KGtsYXNzLCAmX0Rlc2NyaXB0b3JfdHlwZSwgc2VsZik7Ci0gIHNlbGYtPm1zZ2RlZiA9IHVwYl9tc2dkZWZfbmV3KCZzZWxmLT5tc2dkZWYpOwotICBzZWxmLT5rbGFzcyA9IFFuaWw7Ci0gIHNlbGYtPmxheW91dCA9IE5VTEw7Ci0gIHNlbGYtPmZpbGxfaGFuZGxlcnMgPSBOVUxMOwotICBzZWxmLT5maWxsX21ldGhvZCA9IE5VTEw7Ci0gIHNlbGYtPmpzb25fZmlsbF9tZXRob2QgPSBOVUxMOwotICBzZWxmLT5wYl9zZXJpYWxpemVfaGFuZGxlcnMgPSBOVUxMOwotICBzZWxmLT5qc29uX3NlcmlhbGl6ZV9oYW5kbGVycyA9IE5VTEw7Ci0gIHNlbGYtPmpzb25fc2VyaWFsaXplX2hhbmRsZXJzX3ByZXNlcnZlID0gTlVMTDsKLSAgc2VsZi0+dHlwZWNsYXNzX3JlZmVyZW5jZXMgPSByYl9hcnlfbmV3KCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvcl9yZWdpc3RlcihWQUxVRSBtb2R1bGUpIHsKLSAgVkFMVUUga2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIoCi0gICAgICBtb2R1bGUsICJEZXNjcmlwdG9yIiwgcmJfY09iamVjdCk7Ci0gIHJiX2RlZmluZV9hbGxvY19mdW5jKGtsYXNzLCBEZXNjcmlwdG9yX2FsbG9jKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImVhY2giLCBEZXNjcmlwdG9yX2VhY2gsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibG9va3VwIiwgRGVzY3JpcHRvcl9sb29rdXAsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiYWRkX2ZpZWxkIiwgRGVzY3JpcHRvcl9hZGRfZmllbGQsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiYWRkX29uZW9mIiwgRGVzY3JpcHRvcl9hZGRfb25lb2YsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiZWFjaF9vbmVvZiIsIERlc2NyaXB0b3JfZWFjaF9vbmVvZiwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJsb29rdXBfb25lb2YiLCBEZXNjcmlwdG9yX2xvb2t1cF9vbmVvZiwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJtc2djbGFzcyIsIERlc2NyaXB0b3JfbXNnY2xhc3MsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibmFtZSIsIERlc2NyaXB0b3JfbmFtZSwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJuYW1lPSIsIERlc2NyaXB0b3JfbmFtZV9zZXQsIDEpOwotICByYl9pbmNsdWRlX21vZHVsZShrbGFzcywgcmJfbUVudW1lcmFibGUpOwotICBjRGVzY3JpcHRvciA9IGtsYXNzOwotICByYl9nY19yZWdpc3Rlcl9hZGRyZXNzKCZjRGVzY3JpcHRvcik7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBEZXNjcmlwdG9yLm5hbWUgPT4gbmFtZQotICoKLSAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBtZXNzYWdlIHR5cGUgYXMgYSBmdWxseS1xdWFsZmllZCBzdHJpbmcgKGUuZy4sCi0gKiBNeS5QYWNrYWdlLk1lc3NhZ2VUeXBlKS4KLSAqLwotVkFMVUUgRGVzY3JpcHRvcl9uYW1lKFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKERlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgcmV0dXJuIHJiX3N0cl9tYXliZV9udWxsKHVwYl9tc2dkZWZfZnVsbG5hbWUoc2VsZi0+bXNnZGVmKSk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgIERlc2NyaXB0b3IubmFtZSA9IG5hbWUKLSAqCi0gKiBBc3NpZ25zIGEgbmFtZSB0byB0aGlzIG1lc3NhZ2UgdHlwZS4gVGhlIGRlc2NyaXB0b3IgbXVzdCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0gKiB0byBhIHBvb2wgeWV0LgotICovCi1WQUxVRSBEZXNjcmlwdG9yX25hbWVfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBzdHIpIHsKLSAgREVGSU5FX1NFTEYoRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICB1cGJfbXNnZGVmKiBtdXRfZGVmID0gY2hlY2tfbXNnX25vdGZyb3plbihzZWxmLT5tc2dkZWYpOwotICBjb25zdCBjaGFyKiBuYW1lID0gZ2V0X3N0cihzdHIpOwotICBDSEVDS19VUEIoCi0gICAgICB1cGJfbXNnZGVmX3NldGZ1bGxuYW1lKG11dF9kZWYsIG5hbWUsICZzdGF0dXMpLAotICAgICAgIkVycm9yIHNldHRpbmcgRGVzY3JpcHRvciBuYW1lIik7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRGVzY3JpcHRvci5lYWNoKCZibG9jaykKLSAqCi0gKiBJdGVyYXRlcyBvdmVyIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZSwgeWllbGRpbmcgdG8gdGhlIGJsb2NrIG9uIGVhY2ggb25lLgotICovCi1WQUxVRSBEZXNjcmlwdG9yX2VhY2goVkFMVUUgX3NlbGYpIHsKLSAgREVGSU5FX1NFTEYoRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotCi0gIHVwYl9tc2dfZmllbGRfaXRlciBpdDsKLSAgZm9yICh1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpdCwgc2VsZi0+bXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpdCk7Ci0gICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpdCkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdCk7Ci0gICAgVkFMVUUgb2JqID0gZ2V0X2RlZl9vYmooZmllbGQpOwotICAgIHJiX3lpZWxkKG9iaik7Ci0gIH0KLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBEZXNjcmlwdG9yLmxvb2t1cChuYW1lKSA9PiBGaWVsZERlc2NyaXB0b3IKLSAqCi0gKiBSZXR1cm5zIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGZvciB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaWYgcHJlc2VudCwKLSAqIG9yIG5pbCBpZiBub25lLgotICovCi1WQUxVRSBEZXNjcmlwdG9yX2xvb2t1cChWQUxVRSBfc2VsZiwgVkFMVUUgbmFtZSkgewotICBERUZJTkVfU0VMRihEZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIGNvbnN0IGNoYXIqIHMgPSBnZXRfc3RyKG5hbWUpOwotICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX21zZ2RlZl9udG9meihzZWxmLT5tc2dkZWYsIHMpOwotICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgIHJldHVybiBRbmlsOwotICB9Ci0gIHJldHVybiBnZXRfZGVmX29iaihmaWVsZCk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBEZXNjcmlwdG9yLmFkZF9maWVsZChmaWVsZCkgPT4gbmlsCi0gKgotICogQWRkcyB0aGUgZ2l2ZW4gRmllbGREZXNjcmlwdG9yIHRvIHRoaXMgbWVzc2FnZSB0eXBlLiBUaGlzIGRlc2NyaXB0b3IgbXVzdCBub3QKLSAqIGhhdmUgYmVlbiBhZGRlZCB0byBhIHBvb2wgeWV0LiBSYWlzZXMgYW4gZXhjZXB0aW9uIGlmIGEgZmllbGQgd2l0aCB0aGUgc2FtZQotICogbmFtZSBvciBudW1iZXIgYWxyZWFkeSBleGlzdHMuIFN1Yi10eXBlIHJlZmVyZW5jZXMgKGUuZy4gZm9yIGZpZWxkcyBvZiB0eXBlCi0gKiBtZXNzYWdlKSBhcmUgbm90IHJlc29sdmVkIGF0IHRoaXMgcG9pbnQuCi0gKi8KLVZBTFVFIERlc2NyaXB0b3JfYWRkX2ZpZWxkKFZBTFVFIF9zZWxmLCBWQUxVRSBvYmopIHsKLSAgREVGSU5FX1NFTEYoRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICB1cGJfbXNnZGVmKiBtdXRfZGVmID0gY2hlY2tfbXNnX25vdGZyb3plbihzZWxmLT5tc2dkZWYpOwotICBGaWVsZERlc2NyaXB0b3IqIGRlZiA9IHJ1YnlfdG9fRmllbGREZXNjcmlwdG9yKG9iaik7Ci0gIHVwYl9maWVsZGRlZiogbXV0X2ZpZWxkX2RlZiA9IGNoZWNrX2ZpZWxkX25vdGZyb3plbihkZWYtPmZpZWxkZGVmKTsKLSAgQ0hFQ0tfVVBCKAotICAgICAgdXBiX21zZ2RlZl9hZGRmaWVsZChtdXRfZGVmLCBtdXRfZmllbGRfZGVmLCBOVUxMLCAmc3RhdHVzKSwKLSAgICAgICJBZGRpbmcgZmllbGQgdG8gRGVzY3JpcHRvciBmYWlsZWQiKTsKLSAgYWRkX2RlZl9vYmooZGVmLT5maWVsZGRlZiwgb2JqKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBEZXNjcmlwdG9yLmFkZF9vbmVvZihvbmVvZikgPT4gbmlsCi0gKgotICogQWRkcyB0aGUgZ2l2ZW4gT25lb2ZEZXNjcmlwdG9yIHRvIHRoaXMgbWVzc2FnZSB0eXBlLiBUaGlzIGRlc2NyaXB0b3IgbXVzdCBub3QKLSAqIGhhdmUgYmVlbiBhZGRlZCB0byBhIHBvb2wgeWV0LiBSYWlzZXMgYW4gZXhjZXB0aW9uIGlmIGEgb25lb2Ygd2l0aCB0aGUgc2FtZQotICogbmFtZSBhbHJlYWR5IGV4aXN0cywgb3IgaWYgYW55IG9mIHRoZSBvbmVvZidzIGZpZWxkcycgbmFtZXMgb3IgbnVtYmVycwotICogY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBmaWVsZCBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4gQWxsIGZpZWxkcyBpbiB0aGUgb25lb2YKLSAqIGFyZSBhZGRlZCB0byB0aGUgbWVzc2FnZSBkZXNjcmlwdG9yLiBTdWItdHlwZSByZWZlcmVuY2VzIChlLmcuIGZvciBmaWVsZHMgb2YKLSAqIHR5cGUgbWVzc2FnZSkgYXJlIG5vdCByZXNvbHZlZCBhdCB0aGlzIHBvaW50LgotICovCi1WQUxVRSBEZXNjcmlwdG9yX2FkZF9vbmVvZihWQUxVRSBfc2VsZiwgVkFMVUUgb2JqKSB7Ci0gIERFRklORV9TRUxGKERlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgdXBiX21zZ2RlZiogbXV0X2RlZiA9IGNoZWNrX21zZ19ub3Rmcm96ZW4oc2VsZi0+bXNnZGVmKTsKLSAgT25lb2ZEZXNjcmlwdG9yKiBkZWYgPSBydWJ5X3RvX09uZW9mRGVzY3JpcHRvcihvYmopOwotICB1cGJfb25lb2ZkZWYqIG11dF9vbmVvZl9kZWYgPSBjaGVja19vbmVvZl9ub3Rmcm96ZW4oZGVmLT5vbmVvZmRlZik7Ci0gIENIRUNLX1VQQigKLSAgICAgIHVwYl9tc2dkZWZfYWRkb25lb2YobXV0X2RlZiwgbXV0X29uZW9mX2RlZiwgTlVMTCwgJnN0YXR1cyksCi0gICAgICAiQWRkaW5nIG9uZW9mIHRvIERlc2NyaXB0b3IgZmFpbGVkIik7Ci0gIGFkZF9kZWZfb2JqKGRlZi0+b25lb2ZkZWYsIG9iaik7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRGVzY3JpcHRvci5lYWNoX29uZW9mKCZibG9jaykgPT4gbmlsCi0gKgotICogSW52b2tlcyB0aGUgZ2l2ZW4gYmxvY2sgZm9yIGVhY2ggb25lb2YgaW4gdGhpcyBtZXNzYWdlIHR5cGUsIHBhc3NpbmcgdGhlCi0gKiBjb3JyZXNwb25kaW5nIE9uZW9mRGVzY3JpcHRvci4KLSAqLwotVkFMVUUgRGVzY3JpcHRvcl9lYWNoX29uZW9mKFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKERlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLQotICB1cGJfbXNnX29uZW9mX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX21zZ19vbmVvZl9iZWdpbigmaXQsIHNlbGYtPm1zZ2RlZik7Ci0gICAgICAgIXVwYl9tc2dfb25lb2ZfZG9uZSgmaXQpOwotICAgICAgIHVwYl9tc2dfb25lb2ZfbmV4dCgmaXQpKSB7Ci0gICAgY29uc3QgdXBiX29uZW9mZGVmKiBvbmVvZiA9IHVwYl9tc2dfaXRlcl9vbmVvZigmaXQpOwotICAgIFZBTFVFIG9iaiA9IGdldF9kZWZfb2JqKG9uZW9mKTsKLSAgICByYl95aWVsZChvYmopOwotICB9Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRGVzY3JpcHRvci5sb29rdXBfb25lb2YobmFtZSkgPT4gT25lb2ZEZXNjcmlwdG9yCi0gKgotICogUmV0dXJucyB0aGUgb25lb2YgZGVzY3JpcHRvciBmb3IgdGhlIG9uZW9mIHdpdGggdGhlIGdpdmVuIG5hbWUsIGlmIHByZXNlbnQsCi0gKiBvciBuaWwgaWYgbm9uZS4KLSAqLwotVkFMVUUgRGVzY3JpcHRvcl9sb29rdXBfb25lb2YoVkFMVUUgX3NlbGYsIFZBTFVFIG5hbWUpIHsKLSAgREVGSU5FX1NFTEYoRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICBjb25zdCBjaGFyKiBzID0gZ2V0X3N0cihuYW1lKTsKLSAgY29uc3QgdXBiX29uZW9mZGVmKiBvbmVvZiA9IHVwYl9tc2dkZWZfbnRvb3ooc2VsZi0+bXNnZGVmLCBzKTsKLSAgaWYgKG9uZW9mID09IE5VTEwpIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfQotICByZXR1cm4gZ2V0X2RlZl9vYmoob25lb2YpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRGVzY3JpcHRvci5tc2djbGFzcyA9PiBtZXNzYWdlX2tsYXNzCi0gKgotICogUmV0dXJucyB0aGUgUnVieSBjbGFzcyBjcmVhdGVkIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4gVmFsaWQgb25seSBvbmNlIHRoZQotICogbWVzc2FnZSB0eXBlIGhhcyBiZWVuIGFkZGVkIHRvIGEgcG9vbC4KLSAqLwotVkFMVUUgRGVzY3JpcHRvcl9tc2djbGFzcyhWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihEZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIGlmICghdXBiX2RlZl9pc2Zyb3plbigoY29uc3QgdXBiX2RlZiopc2VsZi0+bXNnZGVmKSkgewotICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsCi0gICAgICAgICAgICAgIkNhbm5vdCBmZXRjaCBtZXNzYWdlIGNsYXNzIGZyb20gYSBEZXNjcmlwdG9yIG5vdCB5ZXQgaW4gYSBwb29sLiIpOwotICB9Ci0gIGlmIChzZWxmLT5rbGFzcyA9PSBRbmlsKSB7Ci0gICAgc2VsZi0+a2xhc3MgPSBidWlsZF9jbGFzc19mcm9tX2Rlc2NyaXB0b3Ioc2VsZik7Ci0gIH0KLSAgcmV0dXJuIHNlbGYtPmtsYXNzOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmllbGREZXNjcmlwdG9yLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotREVGSU5FX0NMQVNTKEZpZWxkRGVzY3JpcHRvciwgIkdvb2dsZTo6UHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciIpOwotCi12b2lkIEZpZWxkRGVzY3JpcHRvcl9tYXJrKHZvaWQqIF9zZWxmKSB7Ci19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yX2ZyZWUodm9pZCogX3NlbGYpIHsKLSAgRmllbGREZXNjcmlwdG9yKiBzZWxmID0gX3NlbGY7Ci0gIHVwYl9maWVsZGRlZl91bnJlZihzZWxmLT5maWVsZGRlZiwgJnNlbGYtPmZpZWxkZGVmKTsKLSAgeGZyZWUoc2VsZik7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBGaWVsZERlc2NyaXB0b3IubmV3ID0+IGZpZWxkCi0gKgotICogUmV0dXJucyBhIG5ldyBmaWVsZCBkZXNjcmlwdG9yLiBJdHMgbmFtZSwgdHlwZSwgZXRjLiBtdXN0IGJlIHNldCBiZWZvcmUgaXQgaXMKLSAqIGFkZGVkIHRvIGEgbWVzc2FnZSB0eXBlLgotICovCi1WQUxVRSBGaWVsZERlc2NyaXB0b3JfYWxsb2MoVkFMVUUga2xhc3MpIHsKLSAgRmllbGREZXNjcmlwdG9yKiBzZWxmID0gQUxMT0MoRmllbGREZXNjcmlwdG9yKTsKLSAgVkFMVUUgcmV0ID0gVHlwZWREYXRhX1dyYXBfU3RydWN0KGtsYXNzLCAmX0ZpZWxkRGVzY3JpcHRvcl90eXBlLCBzZWxmKTsKLSAgdXBiX2ZpZWxkZGVmKiBmaWVsZGRlZiA9IHVwYl9maWVsZGRlZl9uZXcoJnNlbGYtPmZpZWxkZGVmKTsKLSAgdXBiX2ZpZWxkZGVmX3NldHBhY2tlZChmaWVsZGRlZiwgZmFsc2UpOwotICBzZWxmLT5maWVsZGRlZiA9IGZpZWxkZGVmOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIEZpZWxkRGVzY3JpcHRvcl9yZWdpc3RlcihWQUxVRSBtb2R1bGUpIHsKLSAgVkFMVUUga2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIoCi0gICAgICBtb2R1bGUsICJGaWVsZERlc2NyaXB0b3IiLCByYl9jT2JqZWN0KTsKLSAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMoa2xhc3MsIEZpZWxkRGVzY3JpcHRvcl9hbGxvYyk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJuYW1lIiwgRmllbGREZXNjcmlwdG9yX25hbWUsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibmFtZT0iLCBGaWVsZERlc2NyaXB0b3JfbmFtZV9zZXQsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAidHlwZSIsIEZpZWxkRGVzY3JpcHRvcl90eXBlLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgInR5cGU9IiwgRmllbGREZXNjcmlwdG9yX3R5cGVfc2V0LCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImxhYmVsIiwgRmllbGREZXNjcmlwdG9yX2xhYmVsLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImxhYmVsPSIsIEZpZWxkRGVzY3JpcHRvcl9sYWJlbF9zZXQsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibnVtYmVyIiwgRmllbGREZXNjcmlwdG9yX251bWJlciwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJudW1iZXI9IiwgRmllbGREZXNjcmlwdG9yX251bWJlcl9zZXQsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAic3VibXNnX25hbWUiLCBGaWVsZERlc2NyaXB0b3Jfc3VibXNnX25hbWUsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAic3VibXNnX25hbWU9IiwgRmllbGREZXNjcmlwdG9yX3N1Ym1zZ19uYW1lX3NldCwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJzdWJ0eXBlIiwgRmllbGREZXNjcmlwdG9yX3N1YnR5cGUsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiZ2V0IiwgRmllbGREZXNjcmlwdG9yX2dldCwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJzZXQiLCBGaWVsZERlc2NyaXB0b3Jfc2V0LCAyKTsKLSAgY0ZpZWxkRGVzY3JpcHRvciA9IGtsYXNzOwotICByYl9nY19yZWdpc3Rlcl9hZGRyZXNzKCZjRmllbGREZXNjcmlwdG9yKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEZpZWxkRGVzY3JpcHRvci5uYW1lID0+IG5hbWUKLSAqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQuCi0gKi8KLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9uYW1lKFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKEZpZWxkRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICByZXR1cm4gcmJfc3RyX21heWJlX251bGwodXBiX2ZpZWxkZGVmX25hbWUoc2VsZi0+ZmllbGRkZWYpKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEZpZWxkRGVzY3JpcHRvci5uYW1lID0gbmFtZQotICoKLSAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBmaWVsZC4gQ2Fubm90IGJlIGNhbGxlZCBvbmNlIHRoZSBjb250YWluaW5nIG1lc3NhZ2UKLSAqIHR5cGUsIGlmIGFueSwgaXMgYWRkZWQgdG8gYSBwb29sLgotICovCi1WQUxVRSBGaWVsZERlc2NyaXB0b3JfbmFtZV9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIHN0cikgewotICBERUZJTkVfU0VMRihGaWVsZERlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgdXBiX2ZpZWxkZGVmKiBtdXRfZGVmID0gY2hlY2tfZmllbGRfbm90ZnJvemVuKHNlbGYtPmZpZWxkZGVmKTsKLSAgY29uc3QgY2hhciogbmFtZSA9IGdldF9zdHIoc3RyKTsKLSAgQ0hFQ0tfVVBCKHVwYl9maWVsZGRlZl9zZXRuYW1lKG11dF9kZWYsIG5hbWUsICZzdGF0dXMpLAotICAgICAgICAgICAgIkVycm9yIHNldHRpbmcgRmllbGREZXNjcmlwdG9yIG5hbWUiKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLXVwYl9maWVsZHR5cGVfdCBydWJ5X3RvX2ZpZWxkdHlwZShWQUxVRSB0eXBlKSB7Ci0gIGlmIChUWVBFKHR5cGUpICE9IFRfU1lNQk9MKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgc3ltYm9sIGZvciBmaWVsZCB0eXBlLiIpOwotICB9Ci0KLSNkZWZpbmUgQ09OVkVSVCh1cGIsIHJ1YnkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKFNZTTJJRCh0eXBlKSA9PSByYl9pbnRlcm4oICMgcnVieSApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gVVBCX1RZUEVfICMjIHVwYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0gIENPTlZFUlQoRkxPQVQsIGZsb2F0KTsKLSAgQ09OVkVSVChET1VCTEUsIGRvdWJsZSk7Ci0gIENPTlZFUlQoQk9PTCwgYm9vbCk7Ci0gIENPTlZFUlQoU1RSSU5HLCBzdHJpbmcpOwotICBDT05WRVJUKEJZVEVTLCBieXRlcyk7Ci0gIENPTlZFUlQoTUVTU0FHRSwgbWVzc2FnZSk7Ci0gIENPTlZFUlQoRU5VTSwgZW51bSk7Ci0gIENPTlZFUlQoSU5UMzIsIGludDMyKTsKLSAgQ09OVkVSVChJTlQ2NCwgaW50NjQpOwotICBDT05WRVJUKFVJTlQzMiwgdWludDMyKTsKLSAgQ09OVkVSVChVSU5UNjQsIHVpbnQ2NCk7Ci0KLSN1bmRlZiBDT05WRVJUCi0KLSAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiVW5rbm93biBmaWVsZCB0eXBlLiIpOwotICByZXR1cm4gMDsKLX0KLQotVkFMVUUgZmllbGR0eXBlX3RvX3J1YnkodXBiX2ZpZWxkdHlwZV90IHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0jZGVmaW5lIENPTlZFUlQodXBiLCBydWJ5KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSBVUEJfVFlQRV8gIyMgdXBiIDogcmV0dXJuIElEMlNZTShyYl9pbnRlcm4oICMgcnVieSApKTsKLSAgICBDT05WRVJUKEZMT0FULCBmbG9hdCk7Ci0gICAgQ09OVkVSVChET1VCTEUsIGRvdWJsZSk7Ci0gICAgQ09OVkVSVChCT09MLCBib29sKTsKLSAgICBDT05WRVJUKFNUUklORywgc3RyaW5nKTsKLSAgICBDT05WRVJUKEJZVEVTLCBieXRlcyk7Ci0gICAgQ09OVkVSVChNRVNTQUdFLCBtZXNzYWdlKTsKLSAgICBDT05WRVJUKEVOVU0sIGVudW0pOwotICAgIENPTlZFUlQoSU5UMzIsIGludDMyKTsKLSAgICBDT05WRVJUKElOVDY0LCBpbnQ2NCk7Ci0gICAgQ09OVkVSVChVSU5UMzIsIHVpbnQzMik7Ci0gICAgQ09OVkVSVChVSU5UNjQsIHVpbnQ2NCk7Ci0jdW5kZWYgQ09OVkVSVAotICB9Ci0gIHJldHVybiBRbmlsOwotfQotCi11cGJfZGVzY3JpcHRvcnR5cGVfdCBydWJ5X3RvX2Rlc2NyaXB0b3J0eXBlKFZBTFVFIHR5cGUpIHsKLSAgaWYgKFRZUEUodHlwZSkgIT0gVF9TWU1CT0wpIHsKLSAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJFeHBlY3RlZCBzeW1ib2wgZm9yIGZpZWxkIHR5cGUuIik7Ci0gIH0KLQotI2RlZmluZSBDT05WRVJUKHVwYiwgcnVieSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoU1lNMklEKHR5cGUpID09IHJiX2ludGVybiggIyBydWJ5ICkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFXyAjIyB1cGI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgQ09OVkVSVChGTE9BVCwgZmxvYXQpOwotICBDT05WRVJUKERPVUJMRSwgZG91YmxlKTsKLSAgQ09OVkVSVChCT09MLCBib29sKTsKLSAgQ09OVkVSVChTVFJJTkcsIHN0cmluZyk7Ci0gIENPTlZFUlQoQllURVMsIGJ5dGVzKTsKLSAgQ09OVkVSVChNRVNTQUdFLCBtZXNzYWdlKTsKLSAgQ09OVkVSVChHUk9VUCwgZ3JvdXApOwotICBDT05WRVJUKEVOVU0sIGVudW0pOwotICBDT05WRVJUKElOVDMyLCBpbnQzMik7Ci0gIENPTlZFUlQoSU5UNjQsIGludDY0KTsKLSAgQ09OVkVSVChVSU5UMzIsIHVpbnQzMik7Ci0gIENPTlZFUlQoVUlOVDY0LCB1aW50NjQpOwotICBDT05WRVJUKFNJTlQzMiwgc2ludDMyKTsKLSAgQ09OVkVSVChTSU5UNjQsIHNpbnQ2NCk7Ci0gIENPTlZFUlQoRklYRUQzMiwgZml4ZWQzMik7Ci0gIENPTlZFUlQoRklYRUQ2NCwgZml4ZWQ2NCk7Ci0gIENPTlZFUlQoU0ZJWEVEMzIsIHNmaXhlZDMyKTsKLSAgQ09OVkVSVChTRklYRUQ2NCwgc2ZpeGVkNjQpOwotCi0jdW5kZWYgQ09OVkVSVAotCi0gIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIlVua25vd24gZmllbGQgdHlwZS4iKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLVZBTFVFIGRlc2NyaXB0b3J0eXBlX3RvX3J1YnkodXBiX2Rlc2NyaXB0b3J0eXBlX3QgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSNkZWZpbmUgQ09OVkVSVCh1cGIsIHJ1YnkpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfICMjIHVwYiA6IHJldHVybiBJRDJTWU0ocmJfaW50ZXJuKCAjIHJ1YnkgKSk7Ci0gICAgQ09OVkVSVChGTE9BVCwgZmxvYXQpOwotICAgIENPTlZFUlQoRE9VQkxFLCBkb3VibGUpOwotICAgIENPTlZFUlQoQk9PTCwgYm9vbCk7Ci0gICAgQ09OVkVSVChTVFJJTkcsIHN0cmluZyk7Ci0gICAgQ09OVkVSVChCWVRFUywgYnl0ZXMpOwotICAgIENPTlZFUlQoTUVTU0FHRSwgbWVzc2FnZSk7Ci0gICAgQ09OVkVSVChHUk9VUCwgZ3JvdXApOwotICAgIENPTlZFUlQoRU5VTSwgZW51bSk7Ci0gICAgQ09OVkVSVChJTlQzMiwgaW50MzIpOwotICAgIENPTlZFUlQoSU5UNjQsIGludDY0KTsKLSAgICBDT05WRVJUKFVJTlQzMiwgdWludDMyKTsKLSAgICBDT05WRVJUKFVJTlQ2NCwgdWludDY0KTsKLSAgICBDT05WRVJUKFNJTlQzMiwgc2ludDMyKTsKLSAgICBDT05WRVJUKFNJTlQ2NCwgc2ludDY0KTsKLSAgICBDT05WRVJUKEZJWEVEMzIsIGZpeGVkMzIpOwotICAgIENPTlZFUlQoRklYRUQ2NCwgZml4ZWQ2NCk7Ci0gICAgQ09OVkVSVChTRklYRUQzMiwgc2ZpeGVkMzIpOwotICAgIENPTlZFUlQoU0ZJWEVENjQsIHNmaXhlZDY0KTsKLSN1bmRlZiBDT05WRVJUCi0gIH0KLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBGaWVsZERlc2NyaXB0b3IudHlwZSA9PiB0eXBlCi0gKgotICogUmV0dXJucyB0aGlzIGZpZWxkJ3MgdHlwZSwgYXMgYSBSdWJ5IHN5bWJvbCwgb3IgbmlsIGlmIG5vdCB5ZXQgc2V0LgotICoKLSAqIFZhbGlkIGZpZWxkIHR5cGVzIGFyZToKLSAqICAgICA6aW50MzIsIDppbnQ2NCwgOnVpbnQzMiwgOnVpbnQ2NCwgOmZsb2F0LCA6ZG91YmxlLCA6Ym9vbCwgOnN0cmluZywKLSAqICAgICA6Ynl0ZXMsIDptZXNzYWdlLgotICovCi1WQUxVRSBGaWVsZERlc2NyaXB0b3JfdHlwZShWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihGaWVsZERlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgaWYgKCF1cGJfZmllbGRkZWZfdHlwZWlzc2V0KHNlbGYtPmZpZWxkZGVmKSkgewotICAgIHJldHVybiBRbmlsOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9ydHlwZV90b19ydWJ5KHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShzZWxmLT5maWVsZGRlZikpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRmllbGREZXNjcmlwdG9yLnR5cGUgPSB0eXBlCi0gKgotICogU2V0cyB0aGlzIGZpZWxkJ3MgdHlwZS4gQ2Fubm90IGJlIGNhbGxlZCBpZiBmaWVsZCBpcyBwYXJ0IG9mIGEgbWVzc2FnZSB0eXBlCi0gKiBhbHJlYWR5IGluIGEgcG9vbC4KLSAqLwotVkFMVUUgRmllbGREZXNjcmlwdG9yX3R5cGVfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSB0eXBlKSB7Ci0gIERFRklORV9TRUxGKEZpZWxkRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICB1cGJfZmllbGRkZWYqIG11dF9kZWYgPSBjaGVja19maWVsZF9ub3Rmcm96ZW4oc2VsZi0+ZmllbGRkZWYpOwotICB1cGJfZmllbGRkZWZfc2V0ZGVzY3JpcHRvcnR5cGUobXV0X2RlZiwgcnVieV90b19kZXNjcmlwdG9ydHlwZSh0eXBlKSk7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRmllbGREZXNjcmlwdG9yLmxhYmVsID0+IGxhYmVsCi0gKgotICogUmV0dXJucyB0aGlzIGZpZWxkJ3MgbGFiZWwgKGkuZS4sIHBsdXJhbGl0eSksIGFzIGEgUnVieSBzeW1ib2wuCi0gKgotICogVmFsaWQgZmllbGQgbGFiZWxzIGFyZToKLSAqICAgICA6b3B0aW9uYWwsIDpyZXBlYXRlZAotICovCi1WQUxVRSBGaWVsZERlc2NyaXB0b3JfbGFiZWwoVkFMVUUgX3NlbGYpIHsKLSAgREVGSU5FX1NFTEYoRmllbGREZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2xhYmVsKHNlbGYtPmZpZWxkZGVmKSkgewotI2RlZmluZSBDT05WRVJUKHVwYiwgcnVieSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgVVBCX0xBQkVMXyAjIyB1cGIgOiByZXR1cm4gSUQyU1lNKHJiX2ludGVybiggIyBydWJ5ICkpOwotCi0gICAgQ09OVkVSVChPUFRJT05BTCwgb3B0aW9uYWwpOwotICAgIENPTlZFUlQoUkVRVUlSRUQsIHJlcXVpcmVkKTsKLSAgICBDT05WRVJUKFJFUEVBVEVELCByZXBlYXRlZCk7Ci0KLSN1bmRlZiBDT05WRVJUCi0gIH0KLQotICByZXR1cm4gUW5pbDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEZpZWxkRGVzY3JpcHRvci5sYWJlbCA9IGxhYmVsCi0gKgotICogU2V0cyB0aGUgbGFiZWwgb24gdGhpcyBmaWVsZC4gQ2Fubm90IGJlIGNhbGxlZCBpZiBmaWVsZCBpcyBwYXJ0IG9mIGEgbWVzc2FnZQotICogdHlwZSBhbHJlYWR5IGluIGEgcG9vbC4KLSAqLwotVkFMVUUgRmllbGREZXNjcmlwdG9yX2xhYmVsX3NldChWQUxVRSBfc2VsZiwgVkFMVUUgbGFiZWwpIHsKLSAgREVGSU5FX1NFTEYoRmllbGREZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIHVwYl9maWVsZGRlZiogbXV0X2RlZiA9IGNoZWNrX2ZpZWxkX25vdGZyb3plbihzZWxmLT5maWVsZGRlZik7Ci0gIHVwYl9sYWJlbF90IHVwYl9sYWJlbCA9IC0xOwotICBib29sIGNvbnZlcnRlZCA9IGZhbHNlOwotCi0gIGlmIChUWVBFKGxhYmVsKSAhPSBUX1NZTUJPTCkgewotICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkV4cGVjdGVkIHN5bWJvbCBmb3IgZmllbGQgbGFiZWwuIik7Ci0gIH0KLQotI2RlZmluZSBDT05WRVJUKHVwYiwgcnVieSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoU1lNMklEKGxhYmVsKSA9PSByYl9pbnRlcm4oICMgcnVieSApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVwYl9sYWJlbCA9IFVQQl9MQUJFTF8gIyMgdXBiOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnZlcnRlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLSAgQ09OVkVSVChPUFRJT05BTCwgb3B0aW9uYWwpOwotICBDT05WRVJUKFJFUVVJUkVELCByZXF1aXJlZCk7Ci0gIENPTlZFUlQoUkVQRUFURUQsIHJlcGVhdGVkKTsKLQotI3VuZGVmIENPTlZFUlQKLQotICBpZiAoIWNvbnZlcnRlZCkgewotICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIlVua25vd24gZmllbGQgbGFiZWwuIik7Ci0gIH0KLQotICB1cGJfZmllbGRkZWZfc2V0bGFiZWwobXV0X2RlZiwgdXBiX2xhYmVsKTsKLQotICByZXR1cm4gUW5pbDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEZpZWxkRGVzY3JpcHRvci5udW1iZXIgPT4gbnVtYmVyCi0gKgotICogUmV0dXJucyB0aGUgdGFnIG51bWJlciBmb3IgdGhpcyBmaWVsZC4KLSAqLwotVkFMVUUgRmllbGREZXNjcmlwdG9yX251bWJlcihWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihGaWVsZERlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgcmV0dXJuIElOVDJOVU0odXBiX2ZpZWxkZGVmX251bWJlcihzZWxmLT5maWVsZGRlZikpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRmllbGREZXNjcmlwdG9yLm51bWJlciA9IG51bWJlcgotICoKLSAqIFNldHMgdGhlIHRhZyBudW1iZXIgZm9yIHRoaXMgZmllbGQuIENhbm5vdCBiZSBjYWxsZWQgaWYgZmllbGQgaXMgcGFydCBvZiBhCi0gKiBtZXNzYWdlIHR5cGUgYWxyZWFkeSBpbiBhIHBvb2wuCi0gKi8KLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9udW1iZXJfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBudW1iZXIpIHsKLSAgREVGSU5FX1NFTEYoRmllbGREZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIHVwYl9maWVsZGRlZiogbXV0X2RlZiA9IGNoZWNrX2ZpZWxkX25vdGZyb3plbihzZWxmLT5maWVsZGRlZik7Ci0gIENIRUNLX1VQQih1cGJfZmllbGRkZWZfc2V0bnVtYmVyKG11dF9kZWYsIE5VTTJJTlQobnVtYmVyKSwgJnN0YXR1cyksCi0gICAgICAgICAgICAiRXJyb3Igc2V0dGluZyBmaWVsZCBudW1iZXIiKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBGaWVsZERlc2NyaXB0b3Iuc3VibXNnX25hbWUgPT4gc3VibXNnX25hbWUKLSAqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIG9yIGVudW0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZmllbGQsIGlmCi0gKiBpdCBpcyBhIG1lc3NhZ2Ugb3IgZW51bSBmaWVsZCAocmVzcGVjdGl2ZWx5KSwgb3IgbmlsIG90aGVyd2lzZS4gVGhpcyB0eXBlCi0gKiBuYW1lIHdpbGwgYmUgcmVzb2x2ZWQgd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBwb29sIHRvIHdoaWNoIHRoZSBjb250YWluaW5nCi0gKiBtZXNzYWdlIHR5cGUgaXMgYWRkZWQuCi0gKi8KLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9zdWJtc2dfbmFtZShWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihGaWVsZERlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgaWYgKCF1cGJfZmllbGRkZWZfaGFzc3ViZGVmKHNlbGYtPmZpZWxkZGVmKSkgewotICAgIHJldHVybiBRbmlsOwotICB9Ci0gIHJldHVybiByYl9zdHJfbWF5YmVfbnVsbCh1cGJfZmllbGRkZWZfc3ViZGVmbmFtZShzZWxmLT5maWVsZGRlZikpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRmllbGREZXNjcmlwdG9yLnN1Ym1zZ19uYW1lID0gc3VibXNnX25hbWUKLSAqCi0gKiBTZXRzIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIG9yIGVudW0gdHlwZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZmllbGQsIGlmIGl0Ci0gKiBpcyBhIG1lc3NhZ2Ugb3IgZW51bSBmaWVsZCAocmVzcGVjdGl2ZWx5KS4gVGhpcyB0eXBlIG5hbWUgd2lsbCBiZSByZXNvbHZlZAotICogd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBwb29sIHRvIHdoaWNoIHRoZSBjb250YWluaW5nIG1lc3NhZ2UgdHlwZSBpcyBhZGRlZC4KLSAqIENhbm5vdCBiZSBjYWxsZWQgb24gZmllbGQgdGhhdCBhcmUgbm90IG9mIG1lc3NhZ2Ugb3IgZW51bSB0eXBlLCBvciBvbiBmaWVsZHMKLSAqIHRoYXQgYXJlIHBhcnQgb2YgYSBtZXNzYWdlIHR5cGUgYWxyZWFkeSBhZGRlZCB0byBhIHBvb2wuCi0gKi8KLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9zdWJtc2dfbmFtZV9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIHZhbHVlKSB7Ci0gIERFRklORV9TRUxGKEZpZWxkRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICB1cGJfZmllbGRkZWYqIG11dF9kZWYgPSBjaGVja19maWVsZF9ub3Rmcm96ZW4oc2VsZi0+ZmllbGRkZWYpOwotICBjb25zdCBjaGFyKiBzdHIgPSBnZXRfc3RyKHZhbHVlKTsKLSAgaWYgKCF1cGJfZmllbGRkZWZfaGFzc3ViZGVmKHNlbGYtPmZpZWxkZGVmKSkgewotICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJGaWVsZERlc2NyaXB0b3IgZG9lcyBub3QgaGF2ZSBzdWJkZWYuIik7Ci0gIH0KLSAgQ0hFQ0tfVVBCKHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKG11dF9kZWYsIHN0ciwgJnN0YXR1cyksCi0gICAgICAgICAgICAiRXJyb3Igc2V0dGluZyBzdWJtZXNzYWdlIG5hbWUiKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBGaWVsZERlc2NyaXB0b3Iuc3VidHlwZSA9PiBtZXNzYWdlX29yX2VudW1fZGVzY3JpcHRvcgotICoKLSAqIFJldHVybnMgdGhlIG1lc3NhZ2Ugb3IgZW51bSBkZXNjcmlwdG9yIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBmaWVsZCdzIHR5cGUgaWYKLSAqIGl0IGlzIGEgbWVzc2FnZSBvciBlbnVtIGZpZWxkLCByZXNwZWN0aXZlbHksIG9yIG5pbCBvdGhlcndpc2UuIENhbm5vdCBiZQotICogY2FsbGVkICp1bnRpbCogdGhlIGNvbnRhaW5pbmcgbWVzc2FnZSB0eXBlIGlzIGFkZGVkIHRvIGEgcG9vbCAoYW5kIHRodXMKLSAqIHJlc29sdmVkKS4KLSAqLwotVkFMVUUgRmllbGREZXNjcmlwdG9yX3N1YnR5cGUoVkFMVUUgX3NlbGYpIHsKLSAgREVGSU5FX1NFTEYoRmllbGREZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIGNvbnN0IHVwYl9kZWYqIGRlZjsKLQotICBpZiAoIXVwYl9maWVsZGRlZl9oYXNzdWJkZWYoc2VsZi0+ZmllbGRkZWYpKSB7Ci0gICAgcmV0dXJuIFFuaWw7Ci0gIH0KLSAgZGVmID0gdXBiX2ZpZWxkZGVmX3N1YmRlZihzZWxmLT5maWVsZGRlZik7Ci0gIGlmIChkZWYgPT0gTlVMTCkgewotICAgIHJldHVybiBRbmlsOwotICB9Ci0gIHJldHVybiBnZXRfZGVmX29iaihkZWYpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRmllbGREZXNjcmlwdG9yLmdldChtZXNzYWdlKSA9PiB2YWx1ZQotICoKLSAqIFJldHVybnMgdGhlIHZhbHVlIHNldCBmb3IgdGhpcyBmaWVsZCBvbiB0aGUgZ2l2ZW4gbWVzc2FnZS4gUmFpc2VzIGFuCi0gKiBleGNlcHRpb24gaWYgbWVzc2FnZSBpcyBvZiB0aGUgd3JvbmcgdHlwZS4KLSAqLwotVkFMVUUgRmllbGREZXNjcmlwdG9yX2dldChWQUxVRSBfc2VsZiwgVkFMVUUgbXNnX3JiKSB7Ci0gIERFRklORV9TRUxGKEZpZWxkRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICBNZXNzYWdlSGVhZGVyKiBtc2c7Ci0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KG1zZ19yYiwgTWVzc2FnZUhlYWRlciwgJk1lc3NhZ2VfdHlwZSwgbXNnKTsKLSAgaWYgKG1zZy0+ZGVzY3JpcHRvci0+bXNnZGVmICE9IHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShzZWxmLT5maWVsZGRlZikpIHsKLSAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAiZ2V0IG1ldGhvZCBjYWxsZWQgb24gd3JvbmcgbWVzc2FnZSB0eXBlIik7Ci0gIH0KLSAgcmV0dXJuIGxheW91dF9nZXQobXNnLT5kZXNjcmlwdG9yLT5sYXlvdXQsIE1lc3NhZ2VfZGF0YShtc2cpLCBzZWxmLT5maWVsZGRlZik7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBGaWVsZERlc2NyaXB0b3Iuc2V0KG1lc3NhZ2UsIHZhbHVlKQotICoKLSAqIFNldHMgdGhlIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBmaWVsZCB0byB0aGUgZ2l2ZW4gdmFsdWUgb24gdGhlIGdpdmVuCi0gKiBtZXNzYWdlLiBSYWlzZXMgYW4gZXhjZXB0aW9uIGlmIG1lc3NhZ2UgaXMgb2YgdGhlIHdyb25nIHR5cGUuIFBlcmZvcm1zIHRoZQotICogb3JkaW5hcnkgdHlwZS1jaGVja3MgZm9yIGZpZWxkIHNldHRpbmcuCi0gKi8KLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIG1zZ19yYiwgVkFMVUUgdmFsdWUpIHsKLSAgREVGSU5FX1NFTEYoRmllbGREZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIE1lc3NhZ2VIZWFkZXIqIG1zZzsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QobXNnX3JiLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBtc2cpOwotICBpZiAobXNnLT5kZXNjcmlwdG9yLT5tc2dkZWYgIT0gdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKHNlbGYtPmZpZWxkZGVmKSkgewotICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJzZXQgbWV0aG9kIGNhbGxlZCBvbiB3cm9uZyBtZXNzYWdlIHR5cGUiKTsKLSAgfQotICBsYXlvdXRfc2V0KG1zZy0+ZGVzY3JpcHRvci0+bGF5b3V0LCBNZXNzYWdlX2RhdGEobXNnKSwgc2VsZi0+ZmllbGRkZWYsIHZhbHVlKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBPbmVvZkRlc2NyaXB0b3IuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ERUZJTkVfQ0xBU1MoT25lb2ZEZXNjcmlwdG9yLCAiR29vZ2xlOjpQcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yIik7Ci0KLXZvaWQgT25lb2ZEZXNjcmlwdG9yX21hcmsodm9pZCogX3NlbGYpIHsKLX0KLQotdm9pZCBPbmVvZkRlc2NyaXB0b3JfZnJlZSh2b2lkKiBfc2VsZikgewotICBPbmVvZkRlc2NyaXB0b3IqIHNlbGYgPSBfc2VsZjsKLSAgdXBiX29uZW9mZGVmX3VucmVmKHNlbGYtPm9uZW9mZGVmLCAmc2VsZi0+b25lb2ZkZWYpOwotICB4ZnJlZShzZWxmKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE9uZW9mRGVzY3JpcHRvci5uZXcgPT4gb25lb2ZfZGVzY3JpcHRvcgotICoKLSAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5LCBvbmVvZiBkZXNjcmlwdG9yLiBUaGUgb25lb2YgbWF5IG9ubHkgYmUgbW9kaWZpZWQgcHJpb3IKLSAqIHRvIGJlaW5nIGFkZGVkIHRvIGEgbWVzc2FnZSBkZXNjcmlwdG9yIHdoaWNoIGlzIHN1YnNlcXVlbnRseSBhZGRlZCB0byBhIHBvb2wuCi0gKi8KLVZBTFVFIE9uZW9mRGVzY3JpcHRvcl9hbGxvYyhWQUxVRSBrbGFzcykgewotICBPbmVvZkRlc2NyaXB0b3IqIHNlbGYgPSBBTExPQyhPbmVvZkRlc2NyaXB0b3IpOwotICBWQUxVRSByZXQgPSBUeXBlZERhdGFfV3JhcF9TdHJ1Y3Qoa2xhc3MsICZfT25lb2ZEZXNjcmlwdG9yX3R5cGUsIHNlbGYpOwotICBzZWxmLT5vbmVvZmRlZiA9IHVwYl9vbmVvZmRlZl9uZXcoJnNlbGYtPm9uZW9mZGVmKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBPbmVvZkRlc2NyaXB0b3JfcmVnaXN0ZXIoVkFMVUUgbW9kdWxlKSB7Ci0gIFZBTFVFIGtsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKAotICAgICAgbW9kdWxlLCAiT25lb2ZEZXNjcmlwdG9yIiwgcmJfY09iamVjdCk7Ci0gIHJiX2RlZmluZV9hbGxvY19mdW5jKGtsYXNzLCBPbmVvZkRlc2NyaXB0b3JfYWxsb2MpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibmFtZSIsIE9uZW9mRGVzY3JpcHRvcl9uYW1lLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgIm5hbWU9IiwgT25lb2ZEZXNjcmlwdG9yX25hbWVfc2V0LCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImFkZF9maWVsZCIsIE9uZW9mRGVzY3JpcHRvcl9hZGRfZmllbGQsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiZWFjaCIsIE9uZW9mRGVzY3JpcHRvcl9lYWNoLCAwKTsKLSAgcmJfaW5jbHVkZV9tb2R1bGUoa2xhc3MsIHJiX21FbnVtZXJhYmxlKTsKLSAgY09uZW9mRGVzY3JpcHRvciA9IGtsYXNzOwotICByYl9nY19yZWdpc3Rlcl9hZGRyZXNzKCZjT25lb2ZEZXNjcmlwdG9yKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE9uZW9mRGVzY3JpcHRvci5uYW1lID0+IG5hbWUKLSAqCi0gKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgb25lb2YuCi0gKi8KLVZBTFVFIE9uZW9mRGVzY3JpcHRvcl9uYW1lKFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKE9uZW9mRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICByZXR1cm4gcmJfc3RyX21heWJlX251bGwodXBiX29uZW9mZGVmX25hbWUoc2VsZi0+b25lb2ZkZWYpKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE9uZW9mRGVzY3JpcHRvci5uYW1lID0gbmFtZQotICoKLSAqIFNldHMgYSBuZXcgbmFtZSBmb3IgdGhpcyBvbmVvZi4gVGhlIG9uZW9mIG11c3Qgbm90IGhhdmUgYmVlbiBhZGRlZCB0byBhCi0gKiBtZXNzYWdlIGRlc2NyaXB0b3IgeWV0LgotICovCi1WQUxVRSBPbmVvZkRlc2NyaXB0b3JfbmFtZV9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIHZhbHVlKSB7Ci0gIERFRklORV9TRUxGKE9uZW9mRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICB1cGJfb25lb2ZkZWYqIG11dF9kZWYgPSBjaGVja19vbmVvZl9ub3Rmcm96ZW4oc2VsZi0+b25lb2ZkZWYpOwotICBjb25zdCBjaGFyKiBzdHIgPSBnZXRfc3RyKHZhbHVlKTsKLSAgQ0hFQ0tfVVBCKHVwYl9vbmVvZmRlZl9zZXRuYW1lKG11dF9kZWYsIHN0ciwgJnN0YXR1cyksCi0gICAgICAgICAgICAiRXJyb3Igc2V0dGluZyBvbmVvZiBuYW1lIik7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgT25lb2ZEZXNjcmlwdG9yLmFkZF9maWVsZChmaWVsZCkgPT4gbmlsCi0gKgotICogQWRkcyBhIGZpZWxkIHRvIHRoaXMgb25lb2YuIFRoZSBmaWVsZCBtYXkgaGF2ZSBiZWVuIGFkZGVkIHRvIHRoaXMgb25lb2YgaW4KLSAqIHRoZSBwYXN0LCBvciB0aGUgbWVzc2FnZSB0byB3aGljaCB0aGlzIG9uZW9mIGJlbG9uZ3MgKGlmIGFueSksIGJ1dCBtYXkgbm90Ci0gKiBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byBhbnkgb3RoZXIgb25lb2Ygb3IgbWVzc2FnZS4gT3RoZXJ3aXNlLCBhbgotICogZXhjZXB0aW9uIGlzIHJhaXNlZC4KLSAqCi0gKiBBbGwgZmllbGRzIGFkZGVkIHRvIHRoZSBvbmVvZiB2aWEgdGhpcyBtZXRob2Qgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvCi0gKiB0aGUgbWVzc2FnZSB0byB3aGljaCB0aGlzIG9uZW9mIGJlbG9uZ3MsIGlmIGl0IGJlbG9uZ3MgdG8gb25lIGN1cnJlbnRseSwgb3IKLSAqIGVsc2Ugd2lsbCBiZSBhZGRlZCB0byBhbnkgbWVzc2FnZSB0byB3aGljaCB0aGUgb25lb2YgaXMgbGF0ZXIgYWRkZWQgYXQgdGhlCi0gKiB0aW1lIHRoYXQgaXQgaXMgYWRkZWQuCi0gKi8KLVZBTFVFIE9uZW9mRGVzY3JpcHRvcl9hZGRfZmllbGQoVkFMVUUgX3NlbGYsIFZBTFVFIG9iaikgewotICBERUZJTkVfU0VMRihPbmVvZkRlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgdXBiX29uZW9mZGVmKiBtdXRfZGVmID0gY2hlY2tfb25lb2Zfbm90ZnJvemVuKHNlbGYtPm9uZW9mZGVmKTsKLSAgRmllbGREZXNjcmlwdG9yKiBkZWYgPSBydWJ5X3RvX0ZpZWxkRGVzY3JpcHRvcihvYmopOwotICB1cGJfZmllbGRkZWYqIG11dF9maWVsZF9kZWYgPSBjaGVja19maWVsZF9ub3Rmcm96ZW4oZGVmLT5maWVsZGRlZik7Ci0gIENIRUNLX1VQQigKLSAgICAgIHVwYl9vbmVvZmRlZl9hZGRmaWVsZChtdXRfZGVmLCBtdXRfZmllbGRfZGVmLCBOVUxMLCAmc3RhdHVzKSwKLSAgICAgICJBZGRpbmcgZmllbGQgdG8gT25lb2ZEZXNjcmlwdG9yIGZhaWxlZCIpOwotICBhZGRfZGVmX29iaihkZWYtPmZpZWxkZGVmLCBvYmopOwotICByZXR1cm4gUW5pbDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE9uZW9mRGVzY3JpcHRvci5lYWNoKCZibG9jaykgPT4gbmlsCi0gKgotICogSXRlcmF0ZXMgdGhyb3VnaCBmaWVsZHMgaW4gdGhpcyBvbmVvZiwgeWllbGRpbmcgdG8gdGhlIGJsb2NrIG9uIGVhY2ggb25lLgotICovCi1WQUxVRSBPbmVvZkRlc2NyaXB0b3JfZWFjaChWQUxVRSBfc2VsZiwgVkFMVUUgZmllbGQpIHsKLSAgREVGSU5FX1NFTEYoT25lb2ZEZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIHVwYl9vbmVvZl9pdGVyIGl0OwotICBmb3IgKHVwYl9vbmVvZl9iZWdpbigmaXQsIHNlbGYtPm9uZW9mZGVmKTsKLSAgICAgICAhdXBiX29uZW9mX2RvbmUoJml0KTsKLSAgICAgICB1cGJfb25lb2ZfbmV4dCgmaXQpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmID0gdXBiX29uZW9mX2l0ZXJfZmllbGQoJml0KTsKLSAgICBWQUxVRSBvYmogPSBnZXRfZGVmX29iaihmKTsKLSAgICByYl95aWVsZChvYmopOwotICB9Ci0gIHJldHVybiBRbmlsOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW51bURlc2NyaXB0b3IuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ERUZJTkVfQ0xBU1MoRW51bURlc2NyaXB0b3IsICJHb29nbGU6OlByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciIpOwotCi12b2lkIEVudW1EZXNjcmlwdG9yX21hcmsodm9pZCogX3NlbGYpIHsKLSAgRW51bURlc2NyaXB0b3IqIHNlbGYgPSBfc2VsZjsKLSAgcmJfZ2NfbWFyayhzZWxmLT5tb2R1bGUpOwotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yX2ZyZWUodm9pZCogX3NlbGYpIHsKLSAgRW51bURlc2NyaXB0b3IqIHNlbGYgPSBfc2VsZjsKLSAgdXBiX2VudW1kZWZfdW5yZWYoc2VsZi0+ZW51bWRlZiwgJnNlbGYtPmVudW1kZWYpOwotICB4ZnJlZShzZWxmKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEVudW1EZXNjcmlwdG9yLm5ldyA9PiBlbnVtX2Rlc2NyaXB0b3IKLSAqCi0gKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSwgZW51bSBkZXNjcmlwdG9yLiBNdXN0IGJlIGFkZGVkIHRvIGEgcG9vbCBiZWZvcmUgdGhlCi0gKiBlbnVtIHR5cGUgY2FuIGJlIHVzZWQuIFRoZSBlbnVtIHR5cGUgbWF5IG9ubHkgYmUgbW9kaWZpZWQgcHJpb3IgdG8gYWRkaW5nIHRvCi0gKiBhIHBvb2wuCi0gKi8KLVZBTFVFIEVudW1EZXNjcmlwdG9yX2FsbG9jKFZBTFVFIGtsYXNzKSB7Ci0gIEVudW1EZXNjcmlwdG9yKiBzZWxmID0gQUxMT0MoRW51bURlc2NyaXB0b3IpOwotICBWQUxVRSByZXQgPSBUeXBlZERhdGFfV3JhcF9TdHJ1Y3Qoa2xhc3MsICZfRW51bURlc2NyaXB0b3JfdHlwZSwgc2VsZik7Ci0gIHNlbGYtPmVudW1kZWYgPSB1cGJfZW51bWRlZl9uZXcoJnNlbGYtPmVudW1kZWYpOwotICBzZWxmLT5tb2R1bGUgPSBRbmlsOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yX3JlZ2lzdGVyKFZBTFVFIG1vZHVsZSkgewotICBWQUxVRSBrbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcigKLSAgICAgIG1vZHVsZSwgIkVudW1EZXNjcmlwdG9yIiwgcmJfY09iamVjdCk7Ci0gIHJiX2RlZmluZV9hbGxvY19mdW5jKGtsYXNzLCBFbnVtRGVzY3JpcHRvcl9hbGxvYyk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJuYW1lIiwgRW51bURlc2NyaXB0b3JfbmFtZSwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJuYW1lPSIsIEVudW1EZXNjcmlwdG9yX25hbWVfc2V0LCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImFkZF92YWx1ZSIsIEVudW1EZXNjcmlwdG9yX2FkZF92YWx1ZSwgMik7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJsb29rdXBfbmFtZSIsIEVudW1EZXNjcmlwdG9yX2xvb2t1cF9uYW1lLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImxvb2t1cF92YWx1ZSIsIEVudW1EZXNjcmlwdG9yX2xvb2t1cF92YWx1ZSwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJlYWNoIiwgRW51bURlc2NyaXB0b3JfZWFjaCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJlbnVtbW9kdWxlIiwgRW51bURlc2NyaXB0b3JfZW51bW1vZHVsZSwgMCk7Ci0gIHJiX2luY2x1ZGVfbW9kdWxlKGtsYXNzLCByYl9tRW51bWVyYWJsZSk7Ci0gIGNFbnVtRGVzY3JpcHRvciA9IGtsYXNzOwotICByYl9nY19yZWdpc3Rlcl9hZGRyZXNzKCZjRW51bURlc2NyaXB0b3IpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRW51bURlc2NyaXB0b3IubmFtZSA9PiBuYW1lCi0gKgotICogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIGVudW0gdHlwZS4KLSAqLwotVkFMVUUgRW51bURlc2NyaXB0b3JfbmFtZShWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihFbnVtRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICByZXR1cm4gcmJfc3RyX21heWJlX251bGwodXBiX2VudW1kZWZfZnVsbG5hbWUoc2VsZi0+ZW51bWRlZikpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRW51bURlc2NyaXB0b3IubmFtZSA9IG5hbWUKLSAqCi0gKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgZW51bSB0eXBlLiBDYW5ub3QgYmUgY2FsbGVkIGlmIHRoZSBlbnVtIHR5cGUgaGFzCi0gKiBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gYSBwb29sLgotICovCi1WQUxVRSBFbnVtRGVzY3JpcHRvcl9uYW1lX3NldChWQUxVRSBfc2VsZiwgVkFMVUUgc3RyKSB7Ci0gIERFRklORV9TRUxGKEVudW1EZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0gIHVwYl9lbnVtZGVmKiBtdXRfZGVmID0gY2hlY2tfZW51bV9ub3Rmcm96ZW4oc2VsZi0+ZW51bWRlZik7Ci0gIGNvbnN0IGNoYXIqIG5hbWUgPSBnZXRfc3RyKHN0cik7Ci0gIENIRUNLX1VQQih1cGJfZW51bWRlZl9zZXRmdWxsbmFtZShtdXRfZGVmLCBuYW1lLCAmc3RhdHVzKSwKLSAgICAgICAgICAgICJFcnJvciBzZXR0aW5nIEVudW1EZXNjcmlwdG9yIG5hbWUiKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBFbnVtRGVzY3JpcHRvci5hZGRfdmFsdWUoa2V5LCB2YWx1ZSkKLSAqCi0gKiBBZGRzIGEgbmV3IGtleSA9PiB2YWx1ZSBtYXBwaW5nIHRvIHRoaXMgZW51bSB0eXBlLiBLZXkgbXVzdCBiZSBnaXZlbiBhcyBhCi0gKiBSdWJ5IHN5bWJvbC4gQ2Fubm90IGJlIGNhbGxlZCBpZiB0aGUgZW51bSB0eXBlIGhhcyBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gYQotICogcG9vbC4gV2lsbCByYWlzZSBhbiBleGNlcHRpb24gaWYgdGhlIGtleSBvciB2YWx1ZSBpcyBhbHJlYWR5IGluIHVzZS4KLSAqLwotVkFMVUUgRW51bURlc2NyaXB0b3JfYWRkX3ZhbHVlKFZBTFVFIF9zZWxmLCBWQUxVRSBuYW1lLCBWQUxVRSBudW1iZXIpIHsKLSAgREVGSU5FX1NFTEYoRW51bURlc2NyaXB0b3IsIHNlbGYsIF9zZWxmKTsKLSAgdXBiX2VudW1kZWYqIG11dF9kZWYgPSBjaGVja19lbnVtX25vdGZyb3plbihzZWxmLT5lbnVtZGVmKTsKLSAgY29uc3QgY2hhciogbmFtZV9zdHIgPSByYl9pZDJuYW1lKFNZTTJJRChuYW1lKSk7Ci0gIGludDMyX3QgdmFsID0gTlVNMklOVChudW1iZXIpOwotICBDSEVDS19VUEIodXBiX2VudW1kZWZfYWRkdmFsKG11dF9kZWYsIG5hbWVfc3RyLCB2YWwsICZzdGF0dXMpLAotICAgICAgICAgICAgIkVycm9yIGFkZGluZyB2YWx1ZSB0byBlbnVtIik7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRW51bURlc2NyaXB0b3IubG9va3VwX25hbWUobmFtZSkgPT4gdmFsdWUKLSAqCi0gKiBSZXR1cm5zIHRoZSBudW1lcmljIHZhbHVlIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGdpdmVuIGtleSBuYW1lIChhcyBhIFJ1YnkKLSAqIHN5bWJvbCksIG9yIG5pbCBpZiBub25lLgotICovCi1WQUxVRSBFbnVtRGVzY3JpcHRvcl9sb29rdXBfbmFtZShWQUxVRSBfc2VsZiwgVkFMVUUgbmFtZSkgewotICBERUZJTkVfU0VMRihFbnVtRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICBjb25zdCBjaGFyKiBuYW1lX3N0cj0gcmJfaWQybmFtZShTWU0ySUQobmFtZSkpOwotICBpbnQzMl90IHZhbCA9IDA7Ci0gIGlmICh1cGJfZW51bWRlZl9udG9peihzZWxmLT5lbnVtZGVmLCBuYW1lX3N0ciwgJnZhbCkpIHsKLSAgICByZXR1cm4gSU5UMk5VTSh2YWwpOwotICB9IGVsc2UgewotICAgIHJldHVybiBRbmlsOwotICB9Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBFbnVtRGVzY3JpcHRvci5sb29rdXBfdmFsdWUobmFtZSkgPT4gdmFsdWUKLSAqCi0gKiBSZXR1cm5zIHRoZSBrZXkgbmFtZSAoYXMgYSBSdWJ5IHN5bWJvbCkgY29ycmVzcG9uZGluZyB0byB0aGUgaW50ZWdlciB2YWx1ZSwKLSAqIG9yIG5pbCBpZiBub25lLgotICovCi1WQUxVRSBFbnVtRGVzY3JpcHRvcl9sb29rdXBfdmFsdWUoVkFMVUUgX3NlbGYsIFZBTFVFIG51bWJlcikgewotICBERUZJTkVfU0VMRihFbnVtRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICBpbnQzMl90IHZhbCA9IE5VTTJJTlQobnVtYmVyKTsKLSAgY29uc3QgY2hhciogbmFtZSA9IHVwYl9lbnVtZGVmX2l0b24oc2VsZi0+ZW51bWRlZiwgdmFsKTsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHJldHVybiBJRDJTWU0ocmJfaW50ZXJuKG5hbWUpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfQotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRW51bURlc2NyaXB0b3IuZWFjaCgmYmxvY2spCi0gKgotICogSXRlcmF0ZXMgb3ZlciBrZXkgPT4gdmFsdWUgbWFwcGluZ3MgaW4gdGhpcyBlbnVtJ3MgZGVmaW5pdGlvbiwgeWllbGRpbmcgdG8KLSAqIHRoZSBibG9jayB3aXRoIChrZXksIHZhbHVlKSBhcmd1bWVudHMgZm9yIGVhY2ggb25lLgotICovCi1WQUxVRSBFbnVtRGVzY3JpcHRvcl9lYWNoKFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKEVudW1EZXNjcmlwdG9yLCBzZWxmLCBfc2VsZik7Ci0KLSAgdXBiX2VudW1faXRlciBpdDsKLSAgZm9yICh1cGJfZW51bV9iZWdpbigmaXQsIHNlbGYtPmVudW1kZWYpOwotICAgICAgICF1cGJfZW51bV9kb25lKCZpdCk7Ci0gICAgICAgdXBiX2VudW1fbmV4dCgmaXQpKSB7Ci0gICAgVkFMVUUga2V5ID0gSUQyU1lNKHJiX2ludGVybih1cGJfZW51bV9pdGVyX25hbWUoJml0KSkpOwotICAgIFZBTFVFIG51bWJlciA9IElOVDJOVU0odXBiX2VudW1faXRlcl9udW1iZXIoJml0KSk7Ci0gICAgcmJfeWllbGRfdmFsdWVzKDIsIGtleSwgbnVtYmVyKTsKLSAgfQotCi0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRW51bURlc2NyaXB0b3IuZW51bW1vZHVsZSA9PiBtb2R1bGUKLSAqCi0gKiBSZXR1cm5zIHRoZSBSdWJ5IG1vZHVsZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW51bSB0eXBlLiBDYW5ub3QgYmUgY2FsbGVkCi0gKiB1bnRpbCB0aGUgZW51bSBkZXNjcmlwdG9yIGhhcyBiZWVuIGFkZGVkIHRvIGEgcG9vbC4KLSAqLwotVkFMVUUgRW51bURlc2NyaXB0b3JfZW51bW1vZHVsZShWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihFbnVtRGVzY3JpcHRvciwgc2VsZiwgX3NlbGYpOwotICBpZiAoIXVwYl9kZWZfaXNmcm96ZW4oKGNvbnN0IHVwYl9kZWYqKXNlbGYtPmVudW1kZWYpKSB7Ci0gICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICAiQ2Fubm90IGZldGNoIGVudW0gbW9kdWxlIGZyb20gYW4gRW51bURlc2NyaXB0b3Igbm90IHlldCAiCi0gICAgICAgICAgICAgImluIGEgcG9vbC4iKTsKLSAgfQotICBpZiAoc2VsZi0+bW9kdWxlID09IFFuaWwpIHsKLSAgICBzZWxmLT5tb2R1bGUgPSBidWlsZF9tb2R1bGVfZnJvbV9lbnVtZGVzYyhzZWxmKTsKLSAgfQotICByZXR1cm4gc2VsZi0+bW9kdWxlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWVzc2FnZUJ1aWxkZXJDb250ZXh0LgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotREVGSU5FX0NMQVNTKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwKLSAgICAiR29vZ2xlOjpQcm90b2J1Zjo6SW50ZXJuYWw6Ok1lc3NhZ2VCdWlsZGVyQ29udGV4dCIpOwotCi12b2lkIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9tYXJrKHZvaWQqIF9zZWxmKSB7Ci0gIE1lc3NhZ2VCdWlsZGVyQ29udGV4dCogc2VsZiA9IF9zZWxmOwotICByYl9nY19tYXJrKHNlbGYtPmRlc2NyaXB0b3IpOwotICByYl9nY19tYXJrKHNlbGYtPmJ1aWxkZXIpOwotfQotCi12b2lkIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9mcmVlKHZvaWQqIF9zZWxmKSB7Ci0gIE1lc3NhZ2VCdWlsZGVyQ29udGV4dCogc2VsZiA9IF9zZWxmOwotICB4ZnJlZShzZWxmKTsKLX0KLQotVkFMVUUgTWVzc2FnZUJ1aWxkZXJDb250ZXh0X2FsbG9jKFZBTFVFIGtsYXNzKSB7Ci0gIE1lc3NhZ2VCdWlsZGVyQ29udGV4dCogc2VsZiA9IEFMTE9DKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCk7Ci0gIFZBTFVFIHJldCA9IFR5cGVkRGF0YV9XcmFwX1N0cnVjdCgKLSAgICAgIGtsYXNzLCAmX01lc3NhZ2VCdWlsZGVyQ29udGV4dF90eXBlLCBzZWxmKTsKLSAgc2VsZi0+ZGVzY3JpcHRvciA9IFFuaWw7Ci0gIHNlbGYtPmJ1aWxkZXIgPSBRbmlsOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9yZWdpc3RlcihWQUxVRSBtb2R1bGUpIHsKLSAgVkFMVUUga2xhc3MgPSByYl9kZWZpbmVfY2xhc3NfdW5kZXIoCi0gICAgICBtb2R1bGUsICJNZXNzYWdlQnVpbGRlckNvbnRleHQiLCByYl9jT2JqZWN0KTsKLSAgcmJfZGVmaW5lX2FsbG9jX2Z1bmMoa2xhc3MsIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9hbGxvYyk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJpbml0aWFsaXplIiwKLSAgICAgICAgICAgICAgICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHRfaW5pdGlhbGl6ZSwgMik7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJvcHRpb25hbCIsIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9vcHRpb25hbCwgLTEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAicmVxdWlyZWQiLCBNZXNzYWdlQnVpbGRlckNvbnRleHRfcmVxdWlyZWQsIC0xKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgInJlcGVhdGVkIiwgTWVzc2FnZUJ1aWxkZXJDb250ZXh0X3JlcGVhdGVkLCAtMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJtYXAiLCBNZXNzYWdlQnVpbGRlckNvbnRleHRfbWFwLCAtMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJvbmVvZiIsIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9vbmVvZiwgMSk7Ci0gIGNNZXNzYWdlQnVpbGRlckNvbnRleHQgPSBrbGFzczsKLSAgcmJfZ2NfcmVnaXN0ZXJfYWRkcmVzcygmY01lc3NhZ2VCdWlsZGVyQ29udGV4dCk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHQubmV3KGRlc2MsIGJ1aWxkZXIpID0+IGNvbnRleHQKLSAqCi0gKiBDcmVhdGUgYSBuZXcgbWVzc2FnZSBidWlsZGVyIGNvbnRleHQgYXJvdW5kIHRoZSBnaXZlbiBtZXNzYWdlIGRlc2NyaXB0b3IgYW5kCi0gKiBidWlsZGVyIGNvbnRleHQuIFRoaXMgY2xhc3MgaXMgaW50ZW5kZWQgdG8gc2VydmUgYXMgYSBEU0wgY29udGV4dCB0byBiZSB1c2VkCi0gKiB3aXRoICNpbnN0YW5jZV9ldmFsLgotICovCi1WQUxVRSBNZXNzYWdlQnVpbGRlckNvbnRleHRfaW5pdGlhbGl6ZShWQUxVRSBfc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFIG1zZ2RlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFIGJ1aWxkZXIpIHsKLSAgREVGSU5FX1NFTEYoTWVzc2FnZUJ1aWxkZXJDb250ZXh0LCBzZWxmLCBfc2VsZik7Ci0gIHNlbGYtPmRlc2NyaXB0b3IgPSBtc2dkZWY7Ci0gIHNlbGYtPmJ1aWxkZXIgPSBidWlsZGVyOwotICByZXR1cm4gUW5pbDsKLX0KLQotc3RhdGljIFZBTFVFIG1zZ2RlZl9hZGRfZmllbGQoVkFMVUUgbXNnZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogbGFiZWwsIFZBTFVFIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSB0eXBlLCBWQUxVRSBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSB0eXBlX2NsYXNzKSB7Ci0gIFZBTFVFIGZpZWxkZGVmID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIGNGaWVsZERlc2NyaXB0b3IpOwotICBWQUxVRSBuYW1lX3N0ciA9IHJiX3N0cl9uZXcyKHJiX2lkMm5hbWUoU1lNMklEKG5hbWUpKSk7Ci0KLSAgcmJfZnVuY2FsbChmaWVsZGRlZiwgcmJfaW50ZXJuKCJsYWJlbD0iKSwgMSwgSUQyU1lNKHJiX2ludGVybihsYWJlbCkpKTsKLSAgcmJfZnVuY2FsbChmaWVsZGRlZiwgcmJfaW50ZXJuKCJuYW1lPSIpLCAxLCBuYW1lX3N0cik7Ci0gIHJiX2Z1bmNhbGwoZmllbGRkZWYsIHJiX2ludGVybigidHlwZT0iKSwgMSwgdHlwZSk7Ci0gIHJiX2Z1bmNhbGwoZmllbGRkZWYsIHJiX2ludGVybigibnVtYmVyPSIpLCAxLCBudW1iZXIpOwotCi0gIGlmICh0eXBlX2NsYXNzICE9IFFuaWwpIHsKLSAgICBpZiAoVFlQRSh0eXBlX2NsYXNzKSAhPSBUX1NUUklORykgewotICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgc3RyaW5nIGZvciB0eXBlIGNsYXNzIik7Ci0gICAgfQotICAgIC8vIE1ha2UgaXQgYW4gYWJzb2x1dGUgdHlwZSBuYW1lIGJ5IHByZXBlbmRpbmcgYSBkb3QuCi0gICAgdHlwZV9jbGFzcyA9IHJiX3N0cl9hcHBlbmQocmJfc3RyX25ldzIoIi4iKSwgdHlwZV9jbGFzcyk7Ci0gICAgcmJfZnVuY2FsbChmaWVsZGRlZiwgcmJfaW50ZXJuKCJzdWJtc2dfbmFtZT0iKSwgMSwgdHlwZV9jbGFzcyk7Ci0gIH0KLQotICByYl9mdW5jYWxsKG1zZ2RlZiwgcmJfaW50ZXJuKCJhZGRfZmllbGQiKSwgMSwgZmllbGRkZWYpOwotICByZXR1cm4gZmllbGRkZWY7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHQub3B0aW9uYWwobmFtZSwgdHlwZSwgbnVtYmVyLCB0eXBlX2NsYXNzID0gbmlsKQotICoKLSAqIERlZmluZXMgYSBuZXcgb3B0aW9uYWwgZmllbGQgb24gdGhpcyBtZXNzYWdlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgdGFnCi0gKiBudW1iZXIsIGFuZCB0eXBlIGNsYXNzIChmb3IgbWVzc2FnZSBhbmQgZW51bSBmaWVsZHMpLiBUaGUgdHlwZSBtdXN0IGJlIGEgUnVieQotICogc3ltYm9sIChhcyBhY2NlcHRlZCBieSBGaWVsZERlc2NyaXB0b3IjdHlwZT0pIGFuZCB0aGUgdHlwZV9jbGFzcyBtdXN0IGJlIGEKLSAqIHN0cmluZywgaWYgcHJlc2VudCAoYXMgYWNjZXB0ZWQgYnkgRmllbGREZXNjcmlwdG9yI3N1Ym1zZ19uYW1lPSkuCi0gKi8KLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9vcHRpb25hbChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwgc2VsZiwgX3NlbGYpOwotICBWQUxVRSBuYW1lLCB0eXBlLCBudW1iZXIsIHR5cGVfY2xhc3M7Ci0KLSAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMuIik7Ci0gIH0KLSAgbmFtZSA9IGFyZ3ZbMF07Ci0gIHR5cGUgPSBhcmd2WzFdOwotICBudW1iZXIgPSBhcmd2WzJdOwotICB0eXBlX2NsYXNzID0gKGFyZ2MgPiAzKSA/IGFyZ3ZbM10gOiBRbmlsOwotCi0gIHJldHVybiBtc2dkZWZfYWRkX2ZpZWxkKHNlbGYtPmRlc2NyaXB0b3IsICJvcHRpb25hbCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHR5cGUsIG51bWJlciwgdHlwZV9jbGFzcyk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHQucmVxdWlyZWQobmFtZSwgdHlwZSwgbnVtYmVyLCB0eXBlX2NsYXNzID0gbmlsKQotICoKLSAqIERlZmluZXMgYSBuZXcgcmVxdWlyZWQgZmllbGQgb24gdGhpcyBtZXNzYWdlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgdGFnCi0gKiBudW1iZXIsIGFuZCB0eXBlIGNsYXNzIChmb3IgbWVzc2FnZSBhbmQgZW51bSBmaWVsZHMpLiBUaGUgdHlwZSBtdXN0IGJlIGEgUnVieQotICogc3ltYm9sIChhcyBhY2NlcHRlZCBieSBGaWVsZERlc2NyaXB0b3IjdHlwZT0pIGFuZCB0aGUgdHlwZV9jbGFzcyBtdXN0IGJlIGEKLSAqIHN0cmluZywgaWYgcHJlc2VudCAoYXMgYWNjZXB0ZWQgYnkgRmllbGREZXNjcmlwdG9yI3N1Ym1zZ19uYW1lPSkuCi0gKgotICogUHJvdG8zIGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgZmllbGRzLCBidXQgdGhpcyBtZXRob2QgZXhpc3RzIGZvcgotICogY29tcGxldGVuZXNzLiBBbnkgYXR0ZW1wdCB0byBhZGQgYSBtZXNzYWdlIHR5cGUgd2l0aCByZXF1aXJlZCBmaWVsZHMgdG8gYQotICogcG9vbCB3aWxsIGN1cnJlbnRseSByZXN1bHQgaW4gYW4gZXJyb3IuCi0gKi8KLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9yZXF1aXJlZChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwgc2VsZiwgX3NlbGYpOwotICBWQUxVRSBuYW1lLCB0eXBlLCBudW1iZXIsIHR5cGVfY2xhc3M7Ci0KLSAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMuIik7Ci0gIH0KLSAgbmFtZSA9IGFyZ3ZbMF07Ci0gIHR5cGUgPSBhcmd2WzFdOwotICBudW1iZXIgPSBhcmd2WzJdOwotICB0eXBlX2NsYXNzID0gKGFyZ2MgPiAzKSA/IGFyZ3ZbM10gOiBRbmlsOwotCi0gIHJldHVybiBtc2dkZWZfYWRkX2ZpZWxkKHNlbGYtPmRlc2NyaXB0b3IsICJyZXF1aXJlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHR5cGUsIG51bWJlciwgdHlwZV9jbGFzcyk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHQucmVwZWF0ZWQobmFtZSwgdHlwZSwgbnVtYmVyLCB0eXBlX2NsYXNzID0gbmlsKQotICoKLSAqIERlZmluZXMgYSBuZXcgcmVwZWF0ZWQgZmllbGQgb24gdGhpcyBtZXNzYWdlIHR5cGUgd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgdGFnCi0gKiBudW1iZXIsIGFuZCB0eXBlIGNsYXNzIChmb3IgbWVzc2FnZSBhbmQgZW51bSBmaWVsZHMpLiBUaGUgdHlwZSBtdXN0IGJlIGEgUnVieQotICogc3ltYm9sIChhcyBhY2NlcHRlZCBieSBGaWVsZERlc2NyaXB0b3IjdHlwZT0pIGFuZCB0aGUgdHlwZV9jbGFzcyBtdXN0IGJlIGEKLSAqIHN0cmluZywgaWYgcHJlc2VudCAoYXMgYWNjZXB0ZWQgYnkgRmllbGREZXNjcmlwdG9yI3N1Ym1zZ19uYW1lPSkuCi0gKi8KLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9yZXBlYXRlZChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKSB7Ci0gIERFRklORV9TRUxGKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwgc2VsZiwgX3NlbGYpOwotICBWQUxVRSBuYW1lLCB0eXBlLCBudW1iZXIsIHR5cGVfY2xhc3M7Ci0KLSAgaWYgKGFyZ2MgPCAzKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgYXQgbGVhc3QgMyBhcmd1bWVudHMuIik7Ci0gIH0KLSAgbmFtZSA9IGFyZ3ZbMF07Ci0gIHR5cGUgPSBhcmd2WzFdOwotICBudW1iZXIgPSBhcmd2WzJdOwotICB0eXBlX2NsYXNzID0gKGFyZ2MgPiAzKSA/IGFyZ3ZbM10gOiBRbmlsOwotCi0gIHJldHVybiBtc2dkZWZfYWRkX2ZpZWxkKHNlbGYtPmRlc2NyaXB0b3IsICJyZXBlYXRlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUsIHR5cGUsIG51bWJlciwgdHlwZV9jbGFzcyk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHQubWFwKG5hbWUsIGtleV90eXBlLCB2YWx1ZV90eXBlLCBudW1iZXIsCi0gKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZV90eXBlX2NsYXNzID0gbmlsKQotICoKLSAqIERlZmluZXMgYSBuZXcgbWFwIGZpZWxkIG9uIHRoaXMgbWVzc2FnZSB0eXBlIHdpdGggdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUKLSAqIHR5cGVzLCB0YWcgbnVtYmVyLCBhbmQgdHlwZSBjbGFzcyAoZm9yIG1lc3NhZ2UgYW5kIGVudW0gdmFsdWUgdHlwZXMpLiBUaGUga2V5Ci0gKiB0eXBlIG11c3QgYmUgOmludDMyLzp1aW50MzIvOmludDY0Lzp1aW50NjQsIDpib29sLCBvciA6c3RyaW5nLiBUaGUgdmFsdWUgdHlwZQotICogdHlwZSBtdXN0IGJlIGEgUnVieSBzeW1ib2wgKGFzIGFjY2VwdGVkIGJ5IEZpZWxkRGVzY3JpcHRvciN0eXBlPSkgYW5kIHRoZQotICogdHlwZV9jbGFzcyBtdXN0IGJlIGEgc3RyaW5nLCBpZiBwcmVzZW50IChhcyBhY2NlcHRlZCBieQotICogRmllbGREZXNjcmlwdG9yI3N1Ym1zZ19uYW1lPSkuCi0gKi8KLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9tYXAoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihNZXNzYWdlQnVpbGRlckNvbnRleHQsIHNlbGYsIF9zZWxmKTsKLSAgVkFMVUUgbmFtZSwga2V5X3R5cGUsIHZhbHVlX3R5cGUsIG51bWJlciwgdHlwZV9jbGFzczsKLSAgVkFMVUUgbWFwZW50cnlfZGVzYywgbWFwZW50cnlfZGVzY19uYW1lOwotCi0gIGlmIChhcmdjIDwgNCkgewotICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkV4cGVjdGVkIGF0IGxlYXN0IDQgYXJndW1lbnRzLiIpOwotICB9Ci0gIG5hbWUgPSBhcmd2WzBdOwotICBrZXlfdHlwZSA9IGFyZ3ZbMV07Ci0gIHZhbHVlX3R5cGUgPSBhcmd2WzJdOwotICBudW1iZXIgPSBhcmd2WzNdOwotICB0eXBlX2NsYXNzID0gKGFyZ2MgPiA0KSA/IGFyZ3ZbNF0gOiBRbmlsOwotCi0gIC8vIFZhbGlkYXRlIHRoZSBrZXkgdHlwZS4gV2UgY2FuJ3QgYWNjZXB0IGVudW1zLCBtZXNzYWdlcywgb3IgZmxvYXRzL2RvdWJsZXMKLSAgLy8gYXMgbWFwIGtleXMuIChXZSBleGNsdWRlIHRoZXNlIGV4cGxpY2l0bHksIGFuZCB0aGUgZmllbGQtZGVzY3JpcHRvciBzZXR0ZXIKLSAgLy8gYmVsb3cgdGhlbiBlbnN1cmVzIHRoYXQgdGhlIHR5cGUgaXMgb25lIG9mIHRoZSByZW1haW5pbmcgdmFsaWQgb3B0aW9ucy4pCi0gIGlmIChTWU0ySUQoa2V5X3R5cGUpID09IHJiX2ludGVybigiZmxvYXQiKSB8fAotICAgICAgU1lNMklEKGtleV90eXBlKSA9PSByYl9pbnRlcm4oImRvdWJsZSIpIHx8Ci0gICAgICBTWU0ySUQoa2V5X3R5cGUpID09IHJiX2ludGVybigiZW51bSIpIHx8Ci0gICAgICBTWU0ySUQoa2V5X3R5cGUpID09IHJiX2ludGVybigibWVzc2FnZSIpKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLAotICAgICAgICAgICAgICJDYW5ub3QgYWRkIGEgbWFwIGZpZWxkIHdpdGggYSBmbG9hdCwgZG91YmxlLCBlbnVtLCBvciBtZXNzYWdlICIKLSAgICAgICAgICAgICAidHlwZS4iKTsKLSAgfQotCi0gIC8vIENyZWF0ZSBhIG5ldyBtZXNzYWdlIGRlc2NyaXB0b3IgZm9yIHRoZSBtYXAgZW50cnkgbWVzc2FnZSwgYW5kIGNyZWF0ZSBhCi0gIC8vIHJlcGVhdGVkIHN1Ym1lc3NhZ2UgZmllbGQgaGVyZSB3aXRoIHRoYXQgdHlwZS4KLSAgbWFwZW50cnlfZGVzYyA9IHJiX2NsYXNzX25ld19pbnN0YW5jZSgwLCBOVUxMLCBjRGVzY3JpcHRvcik7Ci0gIG1hcGVudHJ5X2Rlc2NfbmFtZSA9IHJiX2Z1bmNhbGwoc2VsZi0+ZGVzY3JpcHRvciwgcmJfaW50ZXJuKCJuYW1lIiksIDApOwotICBtYXBlbnRyeV9kZXNjX25hbWUgPSByYl9zdHJfY2F0MihtYXBlbnRyeV9kZXNjX25hbWUsICJfTWFwRW50cnlfIik7Ci0gIG1hcGVudHJ5X2Rlc2NfbmFtZSA9IHJiX3N0cl9jYXQyKG1hcGVudHJ5X2Rlc2NfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmJfaWQybmFtZShTWU0ySUQobmFtZSkpKTsKLSAgRGVzY3JpcHRvcl9uYW1lX3NldChtYXBlbnRyeV9kZXNjLCBtYXBlbnRyeV9kZXNjX25hbWUpOwotCi0gIHsKLSAgICAvLyBUaGUgJ21hcGVudHJ5JyBhdHRyaWJ1dGUgaGFzIG5vIFJ1Ynkgc2V0dGVyIGJlY2F1c2Ugd2UgZG8gbm90IHdhbnQgdGhlCi0gICAgLy8gdXNlciBhdHRlbXB0aW5nIHRvIERJWSB0aGUgc2V0dXAgYmVsb3c7IHdlIHdhbnQgdG8gZW5zdXJlIHRoYXQgdGhlIGZpZWxkcwotICAgIC8vIGFyZSBjb3JyZWN0LiBTbyB3ZSByZWFjaCBpbnRvIHRoZSBtc2dkZWYgaGVyZSB0byBzZXQgdGhlIGJpdCBtYW51YWxseS4KLSAgICBEZXNjcmlwdG9yKiBtYXBlbnRyeV9kZXNjX3NlbGYgPSBydWJ5X3RvX0Rlc2NyaXB0b3IobWFwZW50cnlfZGVzYyk7Ci0gICAgdXBiX21zZ2RlZl9zZXRtYXBlbnRyeSgodXBiX21zZ2RlZiopbWFwZW50cnlfZGVzY19zZWxmLT5tc2dkZWYsIHRydWUpOwotICB9Ci0KLSAgewotICAgIC8vIG9wdGlvbmFsIDx0eXBlPiBrZXkgPSAxOwotICAgIFZBTFVFIGtleV9maWVsZCA9IHJiX2NsYXNzX25ld19pbnN0YW5jZSgwLCBOVUxMLCBjRmllbGREZXNjcmlwdG9yKTsKLSAgICBGaWVsZERlc2NyaXB0b3JfbmFtZV9zZXQoa2V5X2ZpZWxkLCByYl9zdHJfbmV3Migia2V5IikpOwotICAgIEZpZWxkRGVzY3JpcHRvcl9sYWJlbF9zZXQoa2V5X2ZpZWxkLCBJRDJTWU0ocmJfaW50ZXJuKCJvcHRpb25hbCIpKSk7Ci0gICAgRmllbGREZXNjcmlwdG9yX251bWJlcl9zZXQoa2V5X2ZpZWxkLCBJTlQyTlVNKDEpKTsKLSAgICBGaWVsZERlc2NyaXB0b3JfdHlwZV9zZXQoa2V5X2ZpZWxkLCBrZXlfdHlwZSk7Ci0gICAgRGVzY3JpcHRvcl9hZGRfZmllbGQobWFwZW50cnlfZGVzYywga2V5X2ZpZWxkKTsKLSAgfQotCi0gIHsKLSAgICAvLyBvcHRpb25hbCA8dHlwZT4gdmFsdWUgPSAyOwotICAgIFZBTFVFIHZhbHVlX2ZpZWxkID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIGNGaWVsZERlc2NyaXB0b3IpOwotICAgIEZpZWxkRGVzY3JpcHRvcl9uYW1lX3NldCh2YWx1ZV9maWVsZCwgcmJfc3RyX25ldzIoInZhbHVlIikpOwotICAgIEZpZWxkRGVzY3JpcHRvcl9sYWJlbF9zZXQodmFsdWVfZmllbGQsIElEMlNZTShyYl9pbnRlcm4oIm9wdGlvbmFsIikpKTsKLSAgICBGaWVsZERlc2NyaXB0b3JfbnVtYmVyX3NldCh2YWx1ZV9maWVsZCwgSU5UMk5VTSgyKSk7Ci0gICAgRmllbGREZXNjcmlwdG9yX3R5cGVfc2V0KHZhbHVlX2ZpZWxkLCB2YWx1ZV90eXBlKTsKLSAgICBpZiAodHlwZV9jbGFzcyAhPSBRbmlsKSB7Ci0gICAgICBWQUxVRSBzdWJtc2dfbmFtZSA9IHJiX3N0cl9uZXcyKCIuIik7IC8vIHByZXBlbmQgJy4nIHRvIG1ha2UgYWJzb2x1dGUuCi0gICAgICBzdWJtc2dfbmFtZSA9IHJiX3N0cl9hcHBlbmQoc3VibXNnX25hbWUsIHR5cGVfY2xhc3MpOwotICAgICAgRmllbGREZXNjcmlwdG9yX3N1Ym1zZ19uYW1lX3NldCh2YWx1ZV9maWVsZCwgc3VibXNnX25hbWUpOwotICAgIH0KLSAgICBEZXNjcmlwdG9yX2FkZF9maWVsZChtYXBlbnRyeV9kZXNjLCB2YWx1ZV9maWVsZCk7Ci0gIH0KLQotICB7Ci0gICAgLy8gQWRkIHRoZSBtYXAtZW50cnkgbWVzc2FnZSB0eXBlIHRvIHRoZSBjdXJyZW50IGJ1aWxkZXIsIGFuZCB1c2UgdGhlIHR5cGUKLSAgICAvLyB0byBjcmVhdGUgdGhlIG1hcCBmaWVsZCBpdHNlbGYuCi0gICAgQnVpbGRlciogYnVpbGRlcl9zZWxmID0gcnVieV90b19CdWlsZGVyKHNlbGYtPmJ1aWxkZXIpOwotICAgIHJiX2FyeV9wdXNoKGJ1aWxkZXJfc2VsZi0+cGVuZGluZ19saXN0LCBtYXBlbnRyeV9kZXNjKTsKLSAgfQotCi0gIHsKLSAgICBWQUxVRSBtYXBfZmllbGQgPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMCwgTlVMTCwgY0ZpZWxkRGVzY3JpcHRvcik7Ci0gICAgVkFMVUUgbmFtZV9zdHIgPSByYl9zdHJfbmV3MihyYl9pZDJuYW1lKFNZTTJJRChuYW1lKSkpOwotICAgIFZBTFVFIHN1Ym1zZ19uYW1lOwotCi0gICAgRmllbGREZXNjcmlwdG9yX25hbWVfc2V0KG1hcF9maWVsZCwgbmFtZV9zdHIpOwotICAgIEZpZWxkRGVzY3JpcHRvcl9udW1iZXJfc2V0KG1hcF9maWVsZCwgbnVtYmVyKTsKLSAgICBGaWVsZERlc2NyaXB0b3JfbGFiZWxfc2V0KG1hcF9maWVsZCwgSUQyU1lNKHJiX2ludGVybigicmVwZWF0ZWQiKSkpOwotICAgIEZpZWxkRGVzY3JpcHRvcl90eXBlX3NldChtYXBfZmllbGQsIElEMlNZTShyYl9pbnRlcm4oIm1lc3NhZ2UiKSkpOwotICAgIHN1Ym1zZ19uYW1lID0gcmJfc3RyX25ldzIoIi4iKTsgLy8gcHJlcGVuZCAnLicgdG8gbWFrZSBuYW1lIGFic29sdXRlLgotICAgIHN1Ym1zZ19uYW1lID0gcmJfc3RyX2FwcGVuZChzdWJtc2dfbmFtZSwgbWFwZW50cnlfZGVzY19uYW1lKTsKLSAgICBGaWVsZERlc2NyaXB0b3Jfc3VibXNnX25hbWVfc2V0KG1hcF9maWVsZCwgc3VibXNnX25hbWUpOwotICAgIERlc2NyaXB0b3JfYWRkX2ZpZWxkKHNlbGYtPmRlc2NyaXB0b3IsIG1hcF9maWVsZCk7Ci0gIH0KLQotICByZXR1cm4gUW5pbDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1lc3NhZ2VCdWlsZGVyQ29udGV4dC5vbmVvZihuYW1lLCAmYmxvY2spID0+IG5pbAotICoKLSAqIENyZWF0ZXMgYSBuZXcgT25lb2ZEZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIG5hbWUsIGNyZWF0ZXMgYQotICogT25lb2ZCdWlsZGVyQ29udGV4dCBhdHRhY2hlZCB0byB0aGF0IE9uZW9mRGVzY3JpcHRvciwgZXZhbHVhdGVzIHRoZSBnaXZlbgotICogYmxvY2sgaW4gdGhlIGNvbnRleHQgb2YgdGhhdCBPbmVvZkJ1aWxkZXJDb250ZXh0IHdpdGggI2luc3RhbmNlX2V2YWwsIGFuZAotICogdGhlbiBhZGRzIHRoZSBvbmVvZiB0byB0aGUgbWVzc2FnZS4KLSAqCi0gKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCwgaWRpb21hdGljIHdheSB0byBidWlsZCBvbmVvZiBkZWZpbml0aW9ucy4KLSAqLwotVkFMVUUgTWVzc2FnZUJ1aWxkZXJDb250ZXh0X29uZW9mKFZBTFVFIF9zZWxmLCBWQUxVRSBuYW1lKSB7Ci0gIERFRklORV9TRUxGKE1lc3NhZ2VCdWlsZGVyQ29udGV4dCwgc2VsZiwgX3NlbGYpOwotICBWQUxVRSBvbmVvZmRlZiA9IHJiX2NsYXNzX25ld19pbnN0YW5jZSgwLCBOVUxMLCBjT25lb2ZEZXNjcmlwdG9yKTsKLSAgVkFMVUUgYXJnc1syXSA9IHsgb25lb2ZkZWYsIHNlbGYtPmJ1aWxkZXIgfTsKLSAgVkFMVUUgY3R4ID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDIsIGFyZ3MsIGNPbmVvZkJ1aWxkZXJDb250ZXh0KTsKLSAgVkFMVUUgYmxvY2sgPSByYl9ibG9ja19wcm9jKCk7Ci0gIFZBTFVFIG5hbWVfc3RyID0gcmJfc3RyX25ldzIocmJfaWQybmFtZShTWU0ySUQobmFtZSkpKTsKLSAgcmJfZnVuY2FsbChvbmVvZmRlZiwgcmJfaW50ZXJuKCJuYW1lPSIpLCAxLCBuYW1lX3N0cik7Ci0gIHJiX2Z1bmNhbGxfd2l0aF9ibG9jayhjdHgsIHJiX2ludGVybigiaW5zdGFuY2VfZXZhbCIpLCAwLCBOVUxMLCBibG9jayk7Ci0gIERlc2NyaXB0b3JfYWRkX29uZW9mKHNlbGYtPmRlc2NyaXB0b3IsIG9uZW9mZGVmKTsKLQotICByZXR1cm4gUW5pbDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE9uZW9mQnVpbGRlckNvbnRleHQuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ERUZJTkVfQ0xBU1MoT25lb2ZCdWlsZGVyQ29udGV4dCwKLSAgICAiR29vZ2xlOjpQcm90b2J1Zjo6SW50ZXJuYWw6Ok9uZW9mQnVpbGRlckNvbnRleHQiKTsKLQotdm9pZCBPbmVvZkJ1aWxkZXJDb250ZXh0X21hcmsodm9pZCogX3NlbGYpIHsKLSAgT25lb2ZCdWlsZGVyQ29udGV4dCogc2VsZiA9IF9zZWxmOwotICByYl9nY19tYXJrKHNlbGYtPmRlc2NyaXB0b3IpOwotICByYl9nY19tYXJrKHNlbGYtPmJ1aWxkZXIpOwotfQotCi12b2lkIE9uZW9mQnVpbGRlckNvbnRleHRfZnJlZSh2b2lkKiBfc2VsZikgewotICBPbmVvZkJ1aWxkZXJDb250ZXh0KiBzZWxmID0gX3NlbGY7Ci0gIHhmcmVlKHNlbGYpOwotfQotCi1WQUxVRSBPbmVvZkJ1aWxkZXJDb250ZXh0X2FsbG9jKFZBTFVFIGtsYXNzKSB7Ci0gIE9uZW9mQnVpbGRlckNvbnRleHQqIHNlbGYgPSBBTExPQyhPbmVvZkJ1aWxkZXJDb250ZXh0KTsKLSAgVkFMVUUgcmV0ID0gVHlwZWREYXRhX1dyYXBfU3RydWN0KAotICAgICAga2xhc3MsICZfT25lb2ZCdWlsZGVyQ29udGV4dF90eXBlLCBzZWxmKTsKLSAgc2VsZi0+ZGVzY3JpcHRvciA9IFFuaWw7Ci0gIHNlbGYtPmJ1aWxkZXIgPSBRbmlsOwotICByZXR1cm4gcmV0OwotfQotCi12b2lkIE9uZW9mQnVpbGRlckNvbnRleHRfcmVnaXN0ZXIoVkFMVUUgbW9kdWxlKSB7Ci0gIFZBTFVFIGtsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKAotICAgICAgbW9kdWxlLCAiT25lb2ZCdWlsZGVyQ29udGV4dCIsIHJiX2NPYmplY3QpOwotICByYl9kZWZpbmVfYWxsb2NfZnVuYyhrbGFzcywgT25lb2ZCdWlsZGVyQ29udGV4dF9hbGxvYyk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJpbml0aWFsaXplIiwKLSAgICAgICAgICAgICAgICAgICBPbmVvZkJ1aWxkZXJDb250ZXh0X2luaXRpYWxpemUsIDIpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAib3B0aW9uYWwiLCBPbmVvZkJ1aWxkZXJDb250ZXh0X29wdGlvbmFsLCAtMSk7Ci0gIGNPbmVvZkJ1aWxkZXJDb250ZXh0ID0ga2xhc3M7Ci0gIHJiX2djX3JlZ2lzdGVyX2FkZHJlc3MoJmNPbmVvZkJ1aWxkZXJDb250ZXh0KTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE9uZW9mQnVpbGRlckNvbnRleHQubmV3KGRlc2MsIGJ1aWxkZXIpID0+IGNvbnRleHQKLSAqCi0gKiBDcmVhdGUgYSBuZXcgb25lb2YgYnVpbGRlciBjb250ZXh0IGFyb3VuZCB0aGUgZ2l2ZW4gb25lb2YgZGVzY3JpcHRvciBhbmQKLSAqIGJ1aWxkZXIgY29udGV4dC4gVGhpcyBjbGFzcyBpcyBpbnRlbmRlZCB0byBzZXJ2ZSBhcyBhIERTTCBjb250ZXh0IHRvIGJlIHVzZWQKLSAqIHdpdGggI2luc3RhbmNlX2V2YWwuCi0gKi8KLVZBTFVFIE9uZW9mQnVpbGRlckNvbnRleHRfaW5pdGlhbGl6ZShWQUxVRSBfc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSBvbmVvZmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSBidWlsZGVyKSB7Ci0gIERFRklORV9TRUxGKE9uZW9mQnVpbGRlckNvbnRleHQsIHNlbGYsIF9zZWxmKTsKLSAgc2VsZi0+ZGVzY3JpcHRvciA9IG9uZW9mZGVmOwotICBzZWxmLT5idWlsZGVyID0gYnVpbGRlcjsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBPbmVvZkJ1aWxkZXJDb250ZXh0Lm9wdGlvbmFsKG5hbWUsIHR5cGUsIG51bWJlciwgdHlwZV9jbGFzcyA9IG5pbCkKLSAqCi0gKiBEZWZpbmVzIGEgbmV3IG9wdGlvbmFsIGZpZWxkIGluIHRoaXMgb25lb2Ygd2l0aCB0aGUgZ2l2ZW4gdHlwZSwgdGFnIG51bWJlciwKLSAqIGFuZCB0eXBlIGNsYXNzIChmb3IgbWVzc2FnZSBhbmQgZW51bSBmaWVsZHMpLiBUaGUgdHlwZSBtdXN0IGJlIGEgUnVieSBzeW1ib2wKLSAqIChhcyBhY2NlcHRlZCBieSBGaWVsZERlc2NyaXB0b3IjdHlwZT0pIGFuZCB0aGUgdHlwZV9jbGFzcyBtdXN0IGJlIGEgc3RyaW5nLAotICogaWYgcHJlc2VudCAoYXMgYWNjZXB0ZWQgYnkgRmllbGREZXNjcmlwdG9yI3N1Ym1zZ19uYW1lPSkuCi0gKi8KLVZBTFVFIE9uZW9mQnVpbGRlckNvbnRleHRfb3B0aW9uYWwoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBfc2VsZikgewotICBERUZJTkVfU0VMRihPbmVvZkJ1aWxkZXJDb250ZXh0LCBzZWxmLCBfc2VsZik7Ci0gIFZBTFVFIG5hbWUsIHR5cGUsIG51bWJlciwgdHlwZV9jbGFzczsKLQotICBpZiAoYXJnYyA8IDMpIHsKLSAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJFeHBlY3RlZCBhdCBsZWFzdCAzIGFyZ3VtZW50cy4iKTsKLSAgfQotICBuYW1lID0gYXJndlswXTsKLSAgdHlwZSA9IGFyZ3ZbMV07Ci0gIG51bWJlciA9IGFyZ3ZbMl07Ci0gIHR5cGVfY2xhc3MgPSAoYXJnYyA+IDMpID8gYXJndlszXSA6IFFuaWw7Ci0KLSAgcmV0dXJuIG1zZ2RlZl9hZGRfZmllbGQoc2VsZi0+ZGVzY3JpcHRvciwgIm9wdGlvbmFsIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgdHlwZSwgbnVtYmVyLCB0eXBlX2NsYXNzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVudW1CdWlsZGVyQ29udGV4dC4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURFRklORV9DTEFTUyhFbnVtQnVpbGRlckNvbnRleHQsCi0gICAgIkdvb2dsZTo6UHJvdG9idWY6OkludGVybmFsOjpFbnVtQnVpbGRlckNvbnRleHQiKTsKLQotdm9pZCBFbnVtQnVpbGRlckNvbnRleHRfbWFyayh2b2lkKiBfc2VsZikgewotICBFbnVtQnVpbGRlckNvbnRleHQqIHNlbGYgPSBfc2VsZjsKLSAgcmJfZ2NfbWFyayhzZWxmLT5lbnVtZGVzYyk7Ci19Ci0KLXZvaWQgRW51bUJ1aWxkZXJDb250ZXh0X2ZyZWUodm9pZCogX3NlbGYpIHsKLSAgRW51bUJ1aWxkZXJDb250ZXh0KiBzZWxmID0gX3NlbGY7Ci0gIHhmcmVlKHNlbGYpOwotfQotCi1WQUxVRSBFbnVtQnVpbGRlckNvbnRleHRfYWxsb2MoVkFMVUUga2xhc3MpIHsKLSAgRW51bUJ1aWxkZXJDb250ZXh0KiBzZWxmID0gQUxMT0MoRW51bUJ1aWxkZXJDb250ZXh0KTsKLSAgVkFMVUUgcmV0ID0gVHlwZWREYXRhX1dyYXBfU3RydWN0KAotICAgICAga2xhc3MsICZfRW51bUJ1aWxkZXJDb250ZXh0X3R5cGUsIHNlbGYpOwotICBzZWxmLT5lbnVtZGVzYyA9IFFuaWw7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXZvaWQgRW51bUJ1aWxkZXJDb250ZXh0X3JlZ2lzdGVyKFZBTFVFIG1vZHVsZSkgewotICBWQUxVRSBrbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcigKLSAgICAgIG1vZHVsZSwgIkVudW1CdWlsZGVyQ29udGV4dCIsIHJiX2NPYmplY3QpOwotICByYl9kZWZpbmVfYWxsb2NfZnVuYyhrbGFzcywgRW51bUJ1aWxkZXJDb250ZXh0X2FsbG9jKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImluaXRpYWxpemUiLAotICAgICAgICAgICAgICAgICAgIEVudW1CdWlsZGVyQ29udGV4dF9pbml0aWFsaXplLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgInZhbHVlIiwgRW51bUJ1aWxkZXJDb250ZXh0X3ZhbHVlLCAyKTsKLSAgY0VudW1CdWlsZGVyQ29udGV4dCA9IGtsYXNzOwotICByYl9nY19yZWdpc3Rlcl9hZGRyZXNzKCZjRW51bUJ1aWxkZXJDb250ZXh0KTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEVudW1CdWlsZGVyQ29udGV4dC5uZXcoZW51bWRlc2MpID0+IGNvbnRleHQKLSAqCi0gKiBDcmVhdGUgYSBuZXcgYnVpbGRlciBjb250ZXh0IGFyb3VuZCB0aGUgZ2l2ZW4gZW51bSBkZXNjcmlwdG9yLiBUaGlzIGNsYXNzIGlzCi0gKiBpbnRlbmRlZCB0byBzZXJ2ZSBhcyBhIERTTCBjb250ZXh0IHRvIGJlIHVzZWQgd2l0aCAjaW5zdGFuY2VfZXZhbC4KLSAqLwotVkFMVUUgRW51bUJ1aWxkZXJDb250ZXh0X2luaXRpYWxpemUoVkFMVUUgX3NlbGYsIFZBTFVFIGVudW1kZWYpIHsKLSAgREVGSU5FX1NFTEYoRW51bUJ1aWxkZXJDb250ZXh0LCBzZWxmLCBfc2VsZik7Ci0gIHNlbGYtPmVudW1kZXNjID0gZW51bWRlZjsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLXN0YXRpYyBWQUxVRSBlbnVtZGVmX2FkZF92YWx1ZShWQUxVRSBlbnVtZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFIG5hbWUsIFZBTFVFIG51bWJlcikgewotICByYl9mdW5jYWxsKGVudW1kZWYsIHJiX2ludGVybigiYWRkX3ZhbHVlIiksIDIsIG5hbWUsIG51bWJlcik7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRW51bUJ1aWxkZXIuYWRkX3ZhbHVlKG5hbWUsIG51bWJlcikKLSAqCi0gKiBBZGRzIHRoZSBnaXZlbiBuYW1lID0+IG51bWJlciBtYXBwaW5nIHRvIHRoZSBlbnVtIHR5cGUuIE5hbWUgbXVzdCBiZSBhIFJ1YnkKLSAqIHN5bWJvbC4KLSAqLwotVkFMVUUgRW51bUJ1aWxkZXJDb250ZXh0X3ZhbHVlKFZBTFVFIF9zZWxmLCBWQUxVRSBuYW1lLCBWQUxVRSBudW1iZXIpIHsKLSAgREVGSU5FX1NFTEYoRW51bUJ1aWxkZXJDb250ZXh0LCBzZWxmLCBfc2VsZik7Ci0gIHJldHVybiBlbnVtZGVmX2FkZF92YWx1ZShzZWxmLT5lbnVtZGVzYywgbmFtZSwgbnVtYmVyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEJ1aWxkZXIuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ERUZJTkVfQ0xBU1MoQnVpbGRlciwgIkdvb2dsZTo6UHJvdG9idWY6OkludGVybmFsOjpCdWlsZGVyIik7Ci0KLXZvaWQgQnVpbGRlcl9tYXJrKHZvaWQqIF9zZWxmKSB7Ci0gIEJ1aWxkZXIqIHNlbGYgPSBfc2VsZjsKLSAgcmJfZ2NfbWFyayhzZWxmLT5wZW5kaW5nX2xpc3QpOwotfQotCi12b2lkIEJ1aWxkZXJfZnJlZSh2b2lkKiBfc2VsZikgewotICBCdWlsZGVyKiBzZWxmID0gX3NlbGY7Ci0gIHhmcmVlKHNlbGYtPmRlZnMpOwotICB4ZnJlZShzZWxmKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEJ1aWxkZXIubmV3ID0+IGJ1aWxkZXIKLSAqCi0gKiBDcmVhdGVzIGEgbmV3IEJ1aWxkZXIuIEEgQnVpbGRlciBjYW4gYWNjdW11bGF0ZSBhIHNldCBvZiBuZXcgbWVzc2FnZSBhbmQgZW51bQotICogZGVzY3JpcHRvcnMgYW5kIGF0b21pY2FsbHkgcmVnaXN0ZXIgdGhlbSBpbnRvIGEgcG9vbCBpbiBhIHdheSB0aGF0IGFsbG93cyBmb3IKLSAqIChjbylyZWN1cnNpdmUgdHlwZSByZWZlcmVuY2VzLgotICovCi1WQUxVRSBCdWlsZGVyX2FsbG9jKFZBTFVFIGtsYXNzKSB7Ci0gIEJ1aWxkZXIqIHNlbGYgPSBBTExPQyhCdWlsZGVyKTsKLSAgVkFMVUUgcmV0ID0gVHlwZWREYXRhX1dyYXBfU3RydWN0KAotICAgICAga2xhc3MsICZfQnVpbGRlcl90eXBlLCBzZWxmKTsKLSAgc2VsZi0+cGVuZGluZ19saXN0ID0gcmJfYXJ5X25ldygpOwotICBzZWxmLT5kZWZzID0gTlVMTDsKLSAgcmV0dXJuIHJldDsKLX0KLQotdm9pZCBCdWlsZGVyX3JlZ2lzdGVyKFZBTFVFIG1vZHVsZSkgewotICBWQUxVRSBrbGFzcyA9IHJiX2RlZmluZV9jbGFzc191bmRlcihtb2R1bGUsICJCdWlsZGVyIiwgcmJfY09iamVjdCk7Ci0gIHJiX2RlZmluZV9hbGxvY19mdW5jKGtsYXNzLCBCdWlsZGVyX2FsbG9jKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImFkZF9tZXNzYWdlIiwgQnVpbGRlcl9hZGRfbWVzc2FnZSwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJhZGRfZW51bSIsIEJ1aWxkZXJfYWRkX2VudW0sIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiZmluYWxpemVfdG9fcG9vbCIsIEJ1aWxkZXJfZmluYWxpemVfdG9fcG9vbCwgMSk7Ci0gIGNCdWlsZGVyID0ga2xhc3M7Ci0gIHJiX2djX3JlZ2lzdGVyX2FkZHJlc3MoJmNCdWlsZGVyKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEJ1aWxkZXIuYWRkX21lc3NhZ2UobmFtZSwgJmJsb2NrKQotICoKLSAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IGRlc2NyaXB0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgYW5kIGludm9rZXMgdGhlIGJsb2NrIGluCi0gKiB0aGUgY29udGV4dCBvZiBhIE1lc3NhZ2VCdWlsZGVyQ29udGV4dCBvbiB0aGF0IGRlc2NyaXB0b3IuIFRoZSBibG9jayBjYW4gdGhlbgotICogY2FsbCwgZS5nLiwgTWVzc2FnZUJ1aWxkZXJDb250ZXh0I29wdGlvbmFsIGFuZCBNZXNzYWdlQnVpbGRlckNvbnRleHQjcmVwZWF0ZWQKLSAqIG1ldGhvZHMgdG8gZGVmaW5lIHRoZSBtZXNzYWdlIGZpZWxkcy4KLSAqCi0gKiBUaGlzIGlzIHRoZSByZWNvbW1lbmRlZCwgaWRpb21hdGljIHdheSB0byBidWlsZCBtZXNzYWdlIGRlZmluaXRpb25zLgotICovCi1WQUxVRSBCdWlsZGVyX2FkZF9tZXNzYWdlKFZBTFVFIF9zZWxmLCBWQUxVRSBuYW1lKSB7Ci0gIERFRklORV9TRUxGKEJ1aWxkZXIsIHNlbGYsIF9zZWxmKTsKLSAgVkFMVUUgbXNnZGVmID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIGNEZXNjcmlwdG9yKTsKLSAgVkFMVUUgYXJnc1syXSA9IHsgbXNnZGVmLCBfc2VsZiB9OwotICBWQUxVRSBjdHggPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMiwgYXJncywgY01lc3NhZ2VCdWlsZGVyQ29udGV4dCk7Ci0gIFZBTFVFIGJsb2NrID0gcmJfYmxvY2tfcHJvYygpOwotICByYl9mdW5jYWxsKG1zZ2RlZiwgcmJfaW50ZXJuKCJuYW1lPSIpLCAxLCBuYW1lKTsKLSAgcmJfZnVuY2FsbF93aXRoX2Jsb2NrKGN0eCwgcmJfaW50ZXJuKCJpbnN0YW5jZV9ldmFsIiksIDAsIE5VTEwsIGJsb2NrKTsKLSAgcmJfYXJ5X3B1c2goc2VsZi0+cGVuZGluZ19saXN0LCBtc2dkZWYpOwotICByZXR1cm4gUW5pbDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEJ1aWxkZXIuYWRkX2VudW0obmFtZSwgJmJsb2NrKQotICoKLSAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5IGVudW0gZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQgaW52b2tlcyB0aGUKLSAqIGJsb2NrIGluIHRoZSBjb250ZXh0IG9mIGFuIEVudW1CdWlsZGVyQ29udGV4dCBvbiB0aGF0IGRlc2NyaXB0b3IuIFRoZSBibG9jawotICogY2FuIHRoZW4gY2FsbCBFbnVtQnVpbGRlckNvbnRleHQjYWRkX3ZhbHVlIHRvIGRlZmluZSB0aGUgZW51bSB2YWx1ZXMuCi0gKgotICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQsIGlkaW9tYXRpYyB3YXkgdG8gYnVpbGQgZW51bSBkZWZpbml0aW9ucy4KLSAqLwotVkFMVUUgQnVpbGRlcl9hZGRfZW51bShWQUxVRSBfc2VsZiwgVkFMVUUgbmFtZSkgewotICBERUZJTkVfU0VMRihCdWlsZGVyLCBzZWxmLCBfc2VsZik7Ci0gIFZBTFVFIGVudW1kZWYgPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMCwgTlVMTCwgY0VudW1EZXNjcmlwdG9yKTsKLSAgVkFMVUUgY3R4ID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDEsICZlbnVtZGVmLCBjRW51bUJ1aWxkZXJDb250ZXh0KTsKLSAgVkFMVUUgYmxvY2sgPSByYl9ibG9ja19wcm9jKCk7Ci0gIHJiX2Z1bmNhbGwoZW51bWRlZiwgcmJfaW50ZXJuKCJuYW1lPSIpLCAxLCBuYW1lKTsKLSAgcmJfZnVuY2FsbF93aXRoX2Jsb2NrKGN0eCwgcmJfaW50ZXJuKCJpbnN0YW5jZV9ldmFsIiksIDAsIE5VTEwsIGJsb2NrKTsKLSAgcmJfYXJ5X3B1c2goc2VsZi0+cGVuZGluZ19saXN0LCBlbnVtZGVmKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLXN0YXRpYyB2b2lkIHZhbGlkYXRlX21zZ2RlZihjb25zdCB1cGJfbXNnZGVmKiBtc2dkZWYpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgbm8gcmVxdWlyZWQgZmllbGRzIGV4aXN0LiBwcm90bzMgZG9lcyBub3Qgc3VwcG9ydCB0aGVzZS4KLSAgdXBiX21zZ19maWVsZF9pdGVyIGl0OwotICBmb3IgKHVwYl9tc2dfZmllbGRfYmVnaW4oJml0LCBtc2dkZWYpOwotICAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJml0KTsKLSAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJml0KSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJml0KTsKLSAgICBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVRVUlSRUQpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJSZXF1aXJlZCBmaWVsZHMgYXJlIHVuc3VwcG9ydGVkIGluIHByb3RvMy4iKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgdmFsaWRhdGVfZW51bWRlZihjb25zdCB1cGJfZW51bWRlZiogZW51bWRlZikgewotICAvLyBWZXJpZnkgdGhhdCBhbiBlbnRyeSBleGlzdHMgd2l0aCBpbnRlZ2VyIHZhbHVlIDAuIChUaGlzIGlzIHRoZSBkZWZhdWx0Ci0gIC8vIHZhbHVlLikKLSAgY29uc3QgY2hhciogbG9va3VwID0gdXBiX2VudW1kZWZfaXRvbihlbnVtZGVmLCAwKTsKLSAgaWYgKGxvb2t1cCA9PSBOVUxMKSB7Ci0gICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwKLSAgICAgICAgICAgICAiRW51bSBkZWZpbml0aW9uIGRvZXMgbm90IGNvbnRhaW4gYSB2YWx1ZSBmb3IgJzAnLiIpOwotICB9Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBCdWlsZGVyLmZpbmFsaXplX3RvX3Bvb2wocG9vbCkKLSAqCi0gKiBBZGRzIGFsbCBhY2N1bXVsYXRlZCBtZXNzYWdlIGFuZCBlbnVtIGRlc2NyaXB0b3JzIGNyZWF0ZWQgaW4gdGhpcyBidWlsZGVyCi0gKiBjb250ZXh0IHRvIHRoZSBnaXZlbiBwb29sLiBUaGUgb3BlcmF0aW9uIG9jY3VycyBhdG9taWNhbGx5LCBhbmQgYWxsCi0gKiBkZXNjcmlwdG9ycyBjYW4gcmVmZXIgdG8gZWFjaCBvdGhlciAoaW5jbHVkaW5nIGluIGN5Y2xlcykuIFRoaXMgaXMgdGhlIG9ubHkKLSAqIHdheSB0byBidWlsZCAoY28pcmVjdXJzaXZlIG1lc3NhZ2UgZGVmaW5pdGlvbnMuCi0gKgotICogVGhpcyBtZXRob2QgaXMgdXN1YWxseSBjYWxsZWQgYXV0b21hdGljYWxseSBieSBEZXNjcmlwdG9yUG9vbCNidWlsZCBhZnRlciBpdAotICogaW52b2tlcyB0aGUgZ2l2ZW4gdXNlciBibG9jayBpbiB0aGUgY29udGV4dCBvZiB0aGUgYnVpbGRlci4gVGhlIHVzZXIgc2hvdWxkCi0gKiBub3Qgbm9ybWFsbHkgbmVlZCB0byBjYWxsIHRoaXMgbWFudWFsbHkgYmVjYXVzZSBhIEJ1aWxkZXIgaXMgbm90IG5vcm1hbGx5Ci0gKiBjcmVhdGVkIG1hbnVhbGx5LgotICovCi1WQUxVRSBCdWlsZGVyX2ZpbmFsaXplX3RvX3Bvb2woVkFMVUUgX3NlbGYsIFZBTFVFIHBvb2xfcmIpIHsKLSAgREVGSU5FX1NFTEYoQnVpbGRlciwgc2VsZiwgX3NlbGYpOwotCi0gIERlc2NyaXB0b3JQb29sKiBwb29sID0gcnVieV90b19EZXNjcmlwdG9yUG9vbChwb29sX3JiKTsKLQotICBSRUFMTE9DX04oc2VsZi0+ZGVmcywgdXBiX2RlZiosIFJBUlJBWV9MRU4oc2VsZi0+cGVuZGluZ19saXN0KSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBSQVJSQVlfTEVOKHNlbGYtPnBlbmRpbmdfbGlzdCk7IGkrKykgewotICAgIFZBTFVFIGRlZl9yYiA9IHJiX2FyeV9lbnRyeShzZWxmLT5wZW5kaW5nX2xpc3QsIGkpOwotICAgIGlmIChDTEFTU19PRihkZWZfcmIpID09IGNEZXNjcmlwdG9yKSB7Ci0gICAgICBzZWxmLT5kZWZzW2ldID0gKHVwYl9kZWYqKXJ1YnlfdG9fRGVzY3JpcHRvcihkZWZfcmIpLT5tc2dkZWY7Ci0gICAgICB2YWxpZGF0ZV9tc2dkZWYoKGNvbnN0IHVwYl9tc2dkZWYqKXNlbGYtPmRlZnNbaV0pOwotICAgIH0gZWxzZSBpZiAoQ0xBU1NfT0YoZGVmX3JiKSA9PSBjRW51bURlc2NyaXB0b3IpIHsKLSAgICAgIHNlbGYtPmRlZnNbaV0gPSAodXBiX2RlZiopcnVieV90b19FbnVtRGVzY3JpcHRvcihkZWZfcmIpLT5lbnVtZGVmOwotICAgICAgdmFsaWRhdGVfZW51bWRlZigoY29uc3QgdXBiX2VudW1kZWYqKXNlbGYtPmRlZnNbaV0pOwotICAgIH0KLSAgfQotCi0gIENIRUNLX1VQQih1cGJfc3ltdGFiX2FkZChwb29sLT5zeW10YWIsICh1cGJfZGVmKiopc2VsZi0+ZGVmcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIFJBUlJBWV9MRU4oc2VsZi0+cGVuZGluZ19saXN0KSwgTlVMTCwgJnN0YXR1cyksCi0gICAgICAgICAgICAiVW5hYmxlIHRvIGFkZCBkZWZzIHRvIERlc2NyaXB0b3JQb29sIik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBSQVJSQVlfTEVOKHNlbGYtPnBlbmRpbmdfbGlzdCk7IGkrKykgewotICAgIFZBTFVFIGRlZl9yYiA9IHJiX2FyeV9lbnRyeShzZWxmLT5wZW5kaW5nX2xpc3QsIGkpOwotICAgIGFkZF9kZWZfb2JqKHNlbGYtPmRlZnNbaV0sIGRlZl9yYik7Ci0gIH0KLQotICBzZWxmLT5wZW5kaW5nX2xpc3QgPSByYl9hcnlfbmV3KCk7Ci0gIHJldHVybiBRbmlsOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvZW5jb2RlX2RlY29kZS5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvZW5jb2RlX2RlY29kZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNmJlYTUwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL2VuY29kZV9kZWNvZGUuYworKysgL2Rldi9udWxsCkBAIC0xLDEyMzMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbmNsdWRlICJwcm90b2J1Zi5oIgotCi0vLyBUaGlzIGZ1bmN0aW9uIGlzIGVxdWl2YWxlbnQgdG8gcmJfc3RyX2NhdCgpLCBidXQgdW5saWtlIHRoZSByZWFsCi0vLyByYl9zdHJfY2F0KCksIGl0IGRvZXNuJ3QgbGVhayBtZW1vcnkgaW4gc29tZSB2ZXJzaW9ucyBvZiBSdWJ5LgotLy8gRm9yIG1vcmUgaW5mb3JtYXRpb24sIHNlZToKLS8vICAgaHR0cHM6Ly9idWdzLnJ1YnktbGFuZy5vcmcvaXNzdWVzLzExMzI4Ci1WQUxVRSBub2xlYWtfcmJfc3RyX2NhdChWQUxVRSByYl9zdHIsIGNvbnN0IGNoYXIgKnN0ciwgbG9uZyBsZW4pIHsKLSAgY2hhciAqcDsKLSAgc2l6ZV90IG9sZGxlbiA9IFJTVFJJTkdfTEVOKHJiX3N0cik7Ci0gIHJiX3N0cl9tb2RpZnlfZXhwYW5kKHJiX3N0ciwgbGVuKTsKLSAgcCA9IFJTVFJJTkdfUFRSKHJiX3N0cik7Ci0gIG1lbWNweShwICsgb2xkbGVuLCBzdHIsIGxlbik7Ci0gIHJiX3N0cl9zZXRfbGVuKHJiX3N0ciwgb2xkbGVuICsgbGVuKTsKLSAgcmV0dXJuIHJiX3N0cjsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFBhcnNpbmcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIERFUkVGKG1zZywgb2ZzLCB0eXBlKSAqKHR5cGUqKSgoKHVpbnQ4X3QgKiltc2cpICsgb2ZzKQotCi0vLyBDcmVhdGVzIGEgaGFuZGxlcmRhdGEgdGhhdCBzaW1wbHkgY29udGFpbnMgdGhlIG9mZnNldCBmb3IgdGhpcyBmaWVsZC4KLXN0YXRpYyBjb25zdCB2b2lkKiBuZXdoYW5kbGVyZGF0YSh1cGJfaGFuZGxlcnMqIGgsIHVpbnQzMl90IG9mcykgewotICBzaXplX3QqIGhkX29mcyA9IEFMTE9DKHNpemVfdCk7Ci0gICpoZF9vZnMgPSBvZnM7Ci0gIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKGgsIGhkX29mcywgZnJlZSk7Ci0gIHJldHVybiBoZF9vZnM7Ci19Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc2l6ZV90IG9mczsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbWQ7Ci19IHN1Ym1zZ19oYW5kbGVyZGF0YV90OwotCi0vLyBDcmVhdGVzIGEgaGFuZGxlcmRhdGEgdGhhdCBjb250YWlucyBvZmZzZXQgYW5kIHN1Ym1lc3NhZ2UgdHlwZSBpbmZvcm1hdGlvbi4KLXN0YXRpYyBjb25zdCB2b2lkICpuZXdzdWJtc2doYW5kbGVyZGF0YSh1cGJfaGFuZGxlcnMqIGgsIHVpbnQzMl90IG9mcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYqIGYpIHsKLSAgc3VibXNnX2hhbmRsZXJkYXRhX3QgKmhkID0gQUxMT0Moc3VibXNnX2hhbmRsZXJkYXRhX3QpOwotICBoZC0+b2ZzID0gb2ZzOwotICBoZC0+bWQgPSB1cGJfZmllbGRkZWZfbXNnc3ViZGVmKGYpOwotICB1cGJfaGFuZGxlcnNfYWRkY2xlYW51cChoLCBoZCwgZnJlZSk7Ci0gIHJldHVybiBoZDsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3Qgb2ZzOyAgICAgICAgICAgICAgLy8gdW5pb24gZGF0YSBzbG90Ci0gIHNpemVfdCBjYXNlX29mczsgICAgICAgICAvLyBvbmVvZl9jYXNlIGZpZWxkCi0gIHVpbnQzMl90IG9uZW9mX2Nhc2VfbnVtOyAvLyBvbmVvZi1jYXNlIG51bWJlciB0byBwbGFjZSBpbiBvbmVvZl9jYXNlIGZpZWxkCi0gIGNvbnN0IHVwYl9tc2dkZWYgKm1kOyAgICAvLyBtc2dkZWYsIGZvciBvbmVvZiBzdWJtZXNzYWdlIGhhbmRsZXIKLX0gb25lb2ZfaGFuZGxlcmRhdGFfdDsKLQotc3RhdGljIGNvbnN0IHZvaWQgKm5ld29uZW9maGFuZGxlcmRhdGEodXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3Qgb2ZzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgY2FzZV9vZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgb25lb2ZfaGFuZGxlcmRhdGFfdCAqaGQgPSBBTExPQyhvbmVvZl9oYW5kbGVyZGF0YV90KTsKLSAgaGQtPm9mcyA9IG9mczsKLSAgaGQtPmNhc2Vfb2ZzID0gY2FzZV9vZnM7Ci0gIC8vIFdlIHJldXNlIHRoZSBmaWVsZCB0YWcgbnVtYmVyIGFzIGEgb25lb2YgdW5pb24gZGlzY3JpbWluYW50IHRhZy4gTm90ZSB0aGF0Ci0gIC8vIHdlIGRvbid0IGV4cG9zZSB0aGVzZSBudW1iZXJzIHRvIHRoZSB1c2VyLCBzbyB0aGUgb25seSByZXF1aXJlbWVudCBpcyB0aGF0Ci0gIC8vIHdlIGhhdmUgc29tZSB1bmlxdWUgSUQgZm9yIGVhY2ggdW5pb24gY2FzZS9wb3NzaWJpbGl0eS4gVGhlIGZpZWxkIHRhZwotICAvLyBudW1iZXJzIGFyZSBhbHJlYWR5IHByZXNlbnQgYW5kIGFyZSBlYXN5IHRvIHVzZSBzbyB0aGVyZSdzIG5vIHJlYXNvbiB0bwotICAvLyBjcmVhdGUgYSBzZXBhcmF0ZSBJRCBzcGFjZS4gSW4gYWRkaXRpb24sIHVzaW5nIHRoZSBmaWVsZCB0YWcgbnVtYmVyIGhlcmUKLSAgLy8gbGV0cyB1cyBlYXNpbHkgbG9vayB1cCB0aGUgZmllbGQgaW4gdGhlIG9uZW9mIGFjY2Vzc29yLgotICBoZC0+b25lb2ZfY2FzZV9udW0gPSB1cGJfZmllbGRkZWZfbnVtYmVyKGYpOwotICBpZiAodXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfTUVTU0FHRSkgewotICAgIGhkLT5tZCA9IHVwYl9maWVsZGRlZl9tc2dzdWJkZWYoZik7Ci0gIH0gZWxzZSB7Ci0gICAgaGQtPm1kID0gTlVMTDsKLSAgfQotICB1cGJfaGFuZGxlcnNfYWRkY2xlYW51cChoLCBoZCwgZnJlZSk7Ci0gIHJldHVybiBoZDsKLX0KLQotLy8gQSBoYW5kbGVyIHRoYXQgc3RhcnRzIGEgcmVwZWF0ZWQgZmllbGQuICBHZXRzIHRoZSBSZXBlYXRlZCpGaWVsZCBpbnN0YW5jZSBmb3IKLS8vIHRoaXMgZmllbGQgKHN1Y2ggYW4gaW5zdGFuY2UgYWx3YXlzIGV4aXN0cyBldmVuIGluIGFuIGVtcHR5IG1lc3NhZ2UpLgotc3RhdGljIHZvaWQgKnN0YXJ0c2VxX2hhbmRsZXIodm9pZCogY2xvc3VyZSwgY29uc3Qgdm9pZCogaGQpIHsKLSAgTWVzc2FnZUhlYWRlciogbXNnID0gY2xvc3VyZTsKLSAgY29uc3Qgc2l6ZV90ICpvZnMgPSBoZDsKLSAgcmV0dXJuICh2b2lkKilERVJFRihtc2csICpvZnMsIFZBTFVFKTsKLX0KLQotLy8gSGFuZGxlcnMgdGhhdCBhcHBlbmQgcHJpbWl0aXZlIHZhbHVlcyB0byBhIHJlcGVhdGVkIGZpZWxkLgotI2RlZmluZSBERUZJTkVfQVBQRU5EX0hBTkRMRVIodHlwZSwgY3R5cGUpICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBib29sIGFwcGVuZCMjdHlwZSMjX2hhbmRsZXIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZSB2YWwpIHsgICAgICAgICAgICAgICAgICAgXAotICAgIFZBTFVFIGFyeSA9IChWQUxVRSljbG9zdXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUmVwZWF0ZWRGaWVsZF9wdXNoX25hdGl2ZShhcnksICZ2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLURFRklORV9BUFBFTkRfSEFORExFUihib29sLCAgIGJvb2wpCi1ERUZJTkVfQVBQRU5EX0hBTkRMRVIoaW50MzIsICBpbnQzMl90KQotREVGSU5FX0FQUEVORF9IQU5ETEVSKHVpbnQzMiwgdWludDMyX3QpCi1ERUZJTkVfQVBQRU5EX0hBTkRMRVIoZmxvYXQsICBmbG9hdCkKLURFRklORV9BUFBFTkRfSEFORExFUihpbnQ2NCwgIGludDY0X3QpCi1ERUZJTkVfQVBQRU5EX0hBTkRMRVIodWludDY0LCB1aW50NjRfdCkKLURFRklORV9BUFBFTkRfSEFORExFUihkb3VibGUsIGRvdWJsZSkKLQotLy8gQXBwZW5kcyBhIHN0cmluZyB0byBhIHJlcGVhdGVkIGZpZWxkLgotc3RhdGljIHZvaWQqIGFwcGVuZHN0cl9oYW5kbGVyKHZvaWQgKmNsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCkgewotICBWQUxVRSBhcnkgPSAoVkFMVUUpY2xvc3VyZTsKLSAgVkFMVUUgc3RyID0gcmJfc3RyX25ldzIoIiIpOwotICByYl9lbmNfYXNzb2NpYXRlKHN0ciwga1J1YnlTdHJpbmdVdGY4RW5jb2RpbmcpOwotICBSZXBlYXRlZEZpZWxkX3B1c2goYXJ5LCBzdHIpOwotICByZXR1cm4gKHZvaWQqKXN0cjsKLX0KLQotLy8gQXBwZW5kcyBhICdieXRlcycgc3RyaW5nIHRvIGEgcmVwZWF0ZWQgZmllbGQuCi1zdGF0aWMgdm9pZCogYXBwZW5kYnl0ZXNfaGFuZGxlcih2b2lkICpjbG9zdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqaGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIFZBTFVFIGFyeSA9IChWQUxVRSljbG9zdXJlOwotICBWQUxVRSBzdHIgPSByYl9zdHJfbmV3MigiIik7Ci0gIHJiX2VuY19hc3NvY2lhdGUoc3RyLCBrUnVieVN0cmluZzhiaXRFbmNvZGluZyk7Ci0gIFJlcGVhdGVkRmllbGRfcHVzaChhcnksIHN0cik7Ci0gIHJldHVybiAodm9pZCopc3RyOwotfQotCi0vLyBTZXRzIGEgbm9uLXJlcGVhdGVkIHN0cmluZyBmaWVsZCBpbiBhIG1lc3NhZ2UuCi1zdGF0aWMgdm9pZCogc3RyX2hhbmRsZXIodm9pZCAqY2xvc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpoZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIE1lc3NhZ2VIZWFkZXIqIG1zZyA9IGNsb3N1cmU7Ci0gIGNvbnN0IHNpemVfdCAqb2ZzID0gaGQ7Ci0gIFZBTFVFIHN0ciA9IHJiX3N0cl9uZXcyKCIiKTsKLSAgcmJfZW5jX2Fzc29jaWF0ZShzdHIsIGtSdWJ5U3RyaW5nVXRmOEVuY29kaW5nKTsKLSAgREVSRUYobXNnLCAqb2ZzLCBWQUxVRSkgPSBzdHI7Ci0gIHJldHVybiAodm9pZCopc3RyOwotfQotCi0vLyBTZXRzIGEgbm9uLXJlcGVhdGVkICdieXRlcycgZmllbGQgaW4gYSBtZXNzYWdlLgotc3RhdGljIHZvaWQqIGJ5dGVzX2hhbmRsZXIodm9pZCAqY2xvc3VyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKmhkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCkgewotICBNZXNzYWdlSGVhZGVyKiBtc2cgPSBjbG9zdXJlOwotICBjb25zdCBzaXplX3QgKm9mcyA9IGhkOwotICBWQUxVRSBzdHIgPSByYl9zdHJfbmV3MigiIik7Ci0gIHJiX2VuY19hc3NvY2lhdGUoc3RyLCBrUnVieVN0cmluZzhiaXRFbmNvZGluZyk7Ci0gIERFUkVGKG1zZywgKm9mcywgVkFMVUUpID0gc3RyOwotICByZXR1cm4gKHZvaWQqKXN0cjsKLX0KLQotc3RhdGljIHNpemVfdCBzdHJpbmdkYXRhX2hhbmRsZXIodm9pZCogY2xvc3VyZSwgY29uc3Qgdm9pZCogaGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHIsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfYnVmaGFuZGxlKiBoYW5kbGUpIHsKLSAgVkFMVUUgcmJfc3RyID0gKFZBTFVFKWNsb3N1cmU7Ci0gIG5vbGVha19yYl9zdHJfY2F0KHJiX3N0ciwgc3RyLCBsZW4pOwotICByZXR1cm4gbGVuOwotfQotCi0vLyBBcHBlbmRzIGEgc3VibWVzc2FnZSB0byBhIHJlcGVhdGVkIGZpZWxkIChhIHJlZ3VsYXIgUnVieSBhcnJheSBmb3Igbm93KS4KLXN0YXRpYyB2b2lkICphcHBlbmRzdWJtc2dfaGFuZGxlcih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICBWQUxVRSBhcnkgPSAoVkFMVUUpY2xvc3VyZTsKLSAgY29uc3Qgc3VibXNnX2hhbmRsZXJkYXRhX3QgKnN1Ym1zZ2RhdGEgPSBoZDsKLSAgVkFMVUUgc3ViZGVzYyA9Ci0gICAgICBnZXRfZGVmX29iaigodm9pZCopc3VibXNnZGF0YS0+bWQpOwotICBWQUxVRSBzdWJrbGFzcyA9IERlc2NyaXB0b3JfbXNnY2xhc3Moc3ViZGVzYyk7Ci0gIE1lc3NhZ2VIZWFkZXIqIHN1Ym1zZzsKLQotICBWQUxVRSBzdWJtc2dfcmIgPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMCwgTlVMTCwgc3Via2xhc3MpOwotICBSZXBlYXRlZEZpZWxkX3B1c2goYXJ5LCBzdWJtc2dfcmIpOwotCi0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KHN1Ym1zZ19yYiwgTWVzc2FnZUhlYWRlciwgJk1lc3NhZ2VfdHlwZSwgc3VibXNnKTsKLSAgcmV0dXJuIHN1Ym1zZzsKLX0KLQotLy8gU2V0cyBhIG5vbi1yZXBlYXRlZCBzdWJtZXNzYWdlIGZpZWxkIGluIGEgbWVzc2FnZS4KLXN0YXRpYyB2b2lkICpzdWJtc2dfaGFuZGxlcih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICBNZXNzYWdlSGVhZGVyKiBtc2cgPSBjbG9zdXJlOwotICBjb25zdCBzdWJtc2dfaGFuZGxlcmRhdGFfdCogc3VibXNnZGF0YSA9IGhkOwotICBWQUxVRSBzdWJkZXNjID0KLSAgICAgIGdldF9kZWZfb2JqKCh2b2lkKilzdWJtc2dkYXRhLT5tZCk7Ci0gIFZBTFVFIHN1YmtsYXNzID0gRGVzY3JpcHRvcl9tc2djbGFzcyhzdWJkZXNjKTsKLSAgVkFMVUUgc3VibXNnX3JiOwotICBNZXNzYWdlSGVhZGVyKiBzdWJtc2c7Ci0KLSAgaWYgKERFUkVGKG1zZywgc3VibXNnZGF0YS0+b2ZzLCBWQUxVRSkgPT0gUW5pbCkgewotICAgIERFUkVGKG1zZywgc3VibXNnZGF0YS0+b2ZzLCBWQUxVRSkgPQotICAgICAgICByYl9jbGFzc19uZXdfaW5zdGFuY2UoMCwgTlVMTCwgc3Via2xhc3MpOwotICB9Ci0KLSAgc3VibXNnX3JiID0gREVSRUYobXNnLCBzdWJtc2dkYXRhLT5vZnMsIFZBTFVFKTsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3Qoc3VibXNnX3JiLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBzdWJtc2cpOwotICByZXR1cm4gc3VibXNnOwotfQotCi0vLyBIYW5kbGVyIGRhdGEgZm9yIHN0YXJ0bWFwL2VuZG1hcCBoYW5kbGVycy4KLXR5cGVkZWYgc3RydWN0IHsKLSAgc2l6ZV90IG9mczsKLSAgdXBiX2ZpZWxkdHlwZV90IGtleV9maWVsZF90eXBlOwotICB1cGJfZmllbGR0eXBlX3QgdmFsdWVfZmllbGRfdHlwZTsKLQotICAvLyBXZSBrbm93IHRoYXQgd2UgY2FuIGhvbGQgdGhpcyByZWZlcmVuY2UgYmVjYXVzZSB0aGUgaGFuZGxlcmRhdGEgaGFzIHRoZQotICAvLyBzYW1lIGxpZmV0aW1lIGFzIHRoZSB1cGJfaGFuZGxlcnMgc3RydWN0LCBhbmQgdGhlIHVwYl9oYW5kbGVycyBzdHJ1Y3QgaG9sZHMKLSAgLy8gYSByZWZlcmVuY2UgdG8gdGhlIHVwYl9tc2dkZWYsIHdoaWNoIGluIHR1cm4gaGFzIHJlZmVyZW5jZXMgdG8gaXRzIHN1YmRlZnMuCi0gIGNvbnN0IHVwYl9kZWYqIHZhbHVlX2ZpZWxkX3N1YmRlZjsKLX0gbWFwX2hhbmRsZXJkYXRhX3Q7Ci0KLS8vIFRlbXBvcmFyeSBmcmFtZSBmb3IgbWFwIHBhcnNpbmc6IGF0IHRoZSBiZWdpbm5pbmcgb2YgYSBtYXAgZW50cnkgbWVzc2FnZSwgYQotLy8gc3VibXNnIGhhbmRsZXIgYWxsb2NhdGVzIGEgZnJhbWUgdG8gaG9sZCAoaSkgYSByZWZlcmVuY2UgdG8gdGhlIE1hcCBvYmplY3QKLS8vIGludG8gd2hpY2ggdGhpcyBtZXNzYWdlIHdpbGwgYmUgaW5zZXJ0ZWQgYW5kIChpaSkgc3RvcmFnZSBzbG90cyB0bwotLy8gdGVtcG9yYXJpbHkgaG9sZCB0aGUga2V5IGFuZCB2YWx1ZSBmb3IgdGhpcyBtYXAgZW50cnkgdW50aWwgdGhlIGVuZCBvZiB0aGUKLS8vIHN1Ym1lc3NhZ2UuIFdoZW4gdGhlIHN1Ym1lc3NhZ2UgZW5kcywgYW5vdGhlciBoYW5kbGVyIGlzIGNhbGxlZCB0byBpbnNlcnQgdGhlCi0vLyB2YWx1ZSBpbnRvIHRoZSBtYXAuCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFZBTFVFIG1hcDsKLSAgY2hhciBrZXlfc3RvcmFnZVtOQVRJVkVfU0xPVF9NQVhfU0laRV07Ci0gIGNoYXIgdmFsdWVfc3RvcmFnZVtOQVRJVkVfU0xPVF9NQVhfU0laRV07Ci19IG1hcF9wYXJzZV9mcmFtZV90OwotCi0vLyBIYW5kbGVyIHRvIGJlZ2luIGEgbWFwIGVudHJ5OiBhbGxvY2F0ZXMgYSB0ZW1wb3JhcnkgZnJhbWUuIFRoaXMgaXMgdGhlCi0vLyAnc3RhcnRzdWJtc2cnIGhhbmRsZXIgb24gdGhlIG1zZ2RlZiB0aGF0IGNvbnRhaW5zIHRoZSBtYXAgZmllbGQuCi1zdGF0aWMgdm9pZCAqc3RhcnRtYXBlbnRyeV9oYW5kbGVyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIE1lc3NhZ2VIZWFkZXIqIG1zZyA9IGNsb3N1cmU7Ci0gIGNvbnN0IG1hcF9oYW5kbGVyZGF0YV90KiBtYXBkYXRhID0gaGQ7Ci0gIFZBTFVFIG1hcF9yYiA9IERFUkVGKG1zZywgbWFwZGF0YS0+b2ZzLCBWQUxVRSk7Ci0KLSAgbWFwX3BhcnNlX2ZyYW1lX3QqIGZyYW1lID0gQUxMT0MobWFwX3BhcnNlX2ZyYW1lX3QpOwotICBmcmFtZS0+bWFwID0gbWFwX3JiOwotCi0gIG5hdGl2ZV9zbG90X2luaXQobWFwZGF0YS0+a2V5X2ZpZWxkX3R5cGUsICZmcmFtZS0+a2V5X3N0b3JhZ2UpOwotICBuYXRpdmVfc2xvdF9pbml0KG1hcGRhdGEtPnZhbHVlX2ZpZWxkX3R5cGUsICZmcmFtZS0+dmFsdWVfc3RvcmFnZSk7Ci0KLSAgcmV0dXJuIGZyYW1lOwotfQotCi0vLyBIYW5kbGVyIHRvIGVuZCBhIG1hcCBlbnRyeTogaW5zZXJ0cyB0aGUgdmFsdWUgZGVmaW5lZCBkdXJpbmcgdGhlIG1lc3NhZ2UgaW50bwotLy8gdGhlIG1hcC4gVGhpcyBpcyB0aGUgJ2VuZG1zZycgaGFuZGxlciBvbiB0aGUgbWFwIGVudHJ5IG1zZ2RlZi4KLXN0YXRpYyBib29sIGVuZG1hcF9oYW5kbGVyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCB1cGJfc3RhdHVzKiBzKSB7Ci0gIG1hcF9wYXJzZV9mcmFtZV90KiBmcmFtZSA9IGNsb3N1cmU7Ci0gIGNvbnN0IG1hcF9oYW5kbGVyZGF0YV90KiBtYXBkYXRhID0gaGQ7Ci0KLSAgVkFMVUUga2V5ID0gbmF0aXZlX3Nsb3RfZ2V0KAotICAgICAgbWFwZGF0YS0+a2V5X2ZpZWxkX3R5cGUsIFFuaWwsCi0gICAgICAmZnJhbWUtPmtleV9zdG9yYWdlKTsKLQotICBWQUxVRSB2YWx1ZV9maWVsZF90eXBlY2xhc3MgPSBRbmlsOwotICBWQUxVRSB2YWx1ZTsKLQotICBpZiAobWFwZGF0YS0+dmFsdWVfZmllbGRfdHlwZSA9PSBVUEJfVFlQRV9NRVNTQUdFIHx8Ci0gICAgICBtYXBkYXRhLT52YWx1ZV9maWVsZF90eXBlID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICB2YWx1ZV9maWVsZF90eXBlY2xhc3MgPSBnZXRfZGVmX29iaihtYXBkYXRhLT52YWx1ZV9maWVsZF9zdWJkZWYpOwotICB9Ci0KLSAgdmFsdWUgPSBuYXRpdmVfc2xvdF9nZXQoCi0gICAgICBtYXBkYXRhLT52YWx1ZV9maWVsZF90eXBlLCB2YWx1ZV9maWVsZF90eXBlY2xhc3MsCi0gICAgICAmZnJhbWUtPnZhbHVlX3N0b3JhZ2UpOwotCi0gIE1hcF9pbmRleF9zZXQoZnJhbWUtPm1hcCwga2V5LCB2YWx1ZSk7Ci0gIGZyZWUoZnJhbWUpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vLyBBbGxvY2F0ZXMgYSBuZXcgbWFwX2hhbmRsZXJkYXRhX3QgZ2l2ZW4gdGhlIG1hcCBlbnRyeSBtZXNzYWdlIGRlZmluaXRpb24uIElmCi0vLyB0aGUgb2Zmc2V0IG9mIHRoZSBmaWVsZCB3aXRoaW4gdGhlIHBhcmVudCBtZXNzYWdlIGlzIGFsc28gZ2l2ZW4sIHRoYXQgaXMKLS8vIGFkZGVkIHRvIHRoZSBoYW5kbGVyIGRhdGEgYXMgd2VsbC4gTm90ZSB0aGF0IHRoaXMgaXMgY2FsbGVkICp0d2ljZSogcGVyIG1hcAotLy8gZmllbGQ6IG9uY2UgaW4gdGhlIHBhcmVudCBtZXNzYWdlIGhhbmRsZXIgc2V0dXAgd2hlbiBzZXR0aW5nIHRoZSBzdGFydHN1Ym1zZwotLy8gaGFuZGxlciBhbmQgb25jZSBpbiB0aGUgbWFwIGVudHJ5IG1lc3NhZ2UgaGFuZGxlciBzZXR1cCB3aGVuIHNldHRpbmcgdGhlCi0vLyBrZXkvdmFsdWUgYW5kIGVuZG1zZyBoYW5kbGVycy4gVGhlIHJlYXNvbiBpcyB0aGF0IHRoZXJlIGlzIG5vIGVhc3kgd2F5IHRvCi0vLyBwYXNzIHRoZSBoYW5kbGVyZGF0YSBkb3duIHRvIHRoZSBzdWItbWVzc2FnZSBoYW5kbGVyIHNldHVwLgotc3RhdGljIG1hcF9oYW5kbGVyZGF0YV90KiBuZXdfbWFwX2hhbmRsZXJkYXRhKAotICAgIHNpemVfdCBvZnMsCi0gICAgY29uc3QgdXBiX21zZ2RlZiogbWFwZW50cnlfZGVmLAotICAgIERlc2NyaXB0b3IqIGRlc2MpIHsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmKiBrZXlfZmllbGQ7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogdmFsdWVfZmllbGQ7Ci0gIG1hcF9oYW5kbGVyZGF0YV90KiBoZCA9IEFMTE9DKG1hcF9oYW5kbGVyZGF0YV90KTsKLSAgaGQtPm9mcyA9IG9mczsKLSAga2V5X2ZpZWxkID0gdXBiX21zZ2RlZl9pdG9mKG1hcGVudHJ5X2RlZiwgTUFQX0tFWV9GSUVMRCk7Ci0gIGFzc2VydChrZXlfZmllbGQgIT0gTlVMTCk7Ci0gIGhkLT5rZXlfZmllbGRfdHlwZSA9IHVwYl9maWVsZGRlZl90eXBlKGtleV9maWVsZCk7Ci0gIHZhbHVlX2ZpZWxkID0gdXBiX21zZ2RlZl9pdG9mKG1hcGVudHJ5X2RlZiwgTUFQX1ZBTFVFX0ZJRUxEKTsKLSAgYXNzZXJ0KHZhbHVlX2ZpZWxkICE9IE5VTEwpOwotICBoZC0+dmFsdWVfZmllbGRfdHlwZSA9IHVwYl9maWVsZGRlZl90eXBlKHZhbHVlX2ZpZWxkKTsKLSAgaGQtPnZhbHVlX2ZpZWxkX3N1YmRlZiA9IHVwYl9maWVsZGRlZl9zdWJkZWYodmFsdWVfZmllbGQpOwotCi0gIHJldHVybiBoZDsKLX0KLQotLy8gSGFuZGxlcnMgdGhhdCBzZXQgcHJpbWl0aXZlIHZhbHVlcyBpbiBvbmVvZnMuCi0jZGVmaW5lIERFRklORV9PTkVPRl9IQU5ETEVSKHR5cGUsIGN0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGJvb2wgb25lb2YjI3R5cGUjI19oYW5kbGVyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN0eXBlIHZhbCkgeyAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3Qgb25lb2ZfaGFuZGxlcmRhdGFfdCAqb25lb2ZkYXRhID0gaGQ7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBERVJFRihjbG9zdXJlLCBvbmVvZmRhdGEtPmNhc2Vfb2ZzLCB1aW50MzJfdCkgPSAgICAgICAgICAgICAgICAgXAotICAgICAgICBvbmVvZmRhdGEtPm9uZW9mX2Nhc2VfbnVtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgREVSRUYoY2xvc3VyZSwgb25lb2ZkYXRhLT5vZnMsIGN0eXBlKSA9IHZhbDsgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLURFRklORV9PTkVPRl9IQU5ETEVSKGJvb2wsICAgYm9vbCkKLURFRklORV9PTkVPRl9IQU5ETEVSKGludDMyLCAgaW50MzJfdCkKLURFRklORV9PTkVPRl9IQU5ETEVSKHVpbnQzMiwgdWludDMyX3QpCi1ERUZJTkVfT05FT0ZfSEFORExFUihmbG9hdCwgIGZsb2F0KQotREVGSU5FX09ORU9GX0hBTkRMRVIoaW50NjQsICBpbnQ2NF90KQotREVGSU5FX09ORU9GX0hBTkRMRVIodWludDY0LCB1aW50NjRfdCkKLURFRklORV9PTkVPRl9IQU5ETEVSKGRvdWJsZSwgZG91YmxlKQotCi0jdW5kZWYgREVGSU5FX09ORU9GX0hBTkRMRVIKLQotLy8gSGFuZGxlcnMgZm9yIHN0cmluZ3MgaW4gYSBvbmVvZi4KLXN0YXRpYyB2b2lkICpvbmVvZnN0cl9oYW5kbGVyKHZvaWQgKmNsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpoZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX2hpbnQpIHsKLSAgTWVzc2FnZUhlYWRlciogbXNnID0gY2xvc3VyZTsKLSAgY29uc3Qgb25lb2ZfaGFuZGxlcmRhdGFfdCAqb25lb2ZkYXRhID0gaGQ7Ci0gIFZBTFVFIHN0ciA9IHJiX3N0cl9uZXcyKCIiKTsKLSAgcmJfZW5jX2Fzc29jaWF0ZShzdHIsIGtSdWJ5U3RyaW5nVXRmOEVuY29kaW5nKTsKLSAgREVSRUYobXNnLCBvbmVvZmRhdGEtPmNhc2Vfb2ZzLCB1aW50MzJfdCkgPQotICAgICAgb25lb2ZkYXRhLT5vbmVvZl9jYXNlX251bTsKLSAgREVSRUYobXNnLCBvbmVvZmRhdGEtPm9mcywgVkFMVUUpID0gc3RyOwotICByZXR1cm4gKHZvaWQqKXN0cjsKLX0KLQotc3RhdGljIHZvaWQgKm9uZW9mYnl0ZXNfaGFuZGxlcih2b2lkICpjbG9zdXJlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpoZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCkgewotICBNZXNzYWdlSGVhZGVyKiBtc2cgPSBjbG9zdXJlOwotICBjb25zdCBvbmVvZl9oYW5kbGVyZGF0YV90ICpvbmVvZmRhdGEgPSBoZDsKLSAgVkFMVUUgc3RyID0gcmJfc3RyX25ldzIoIiIpOwotICByYl9lbmNfYXNzb2NpYXRlKHN0ciwga1J1YnlTdHJpbmc4Yml0RW5jb2RpbmcpOwotICBERVJFRihtc2csIG9uZW9mZGF0YS0+Y2FzZV9vZnMsIHVpbnQzMl90KSA9Ci0gICAgICBvbmVvZmRhdGEtPm9uZW9mX2Nhc2VfbnVtOwotICBERVJFRihtc2csIG9uZW9mZGF0YS0+b2ZzLCBWQUxVRSkgPSBzdHI7Ci0gIHJldHVybiAodm9pZCopc3RyOwotfQotCi0vLyBIYW5kbGVyIGZvciBhIHN1Ym1lc3NhZ2UgZmllbGQgaW4gYSBvbmVvZi4KLXN0YXRpYyB2b2lkICpvbmVvZnN1Ym1zZ19oYW5kbGVyKHZvaWQgKmNsb3N1cmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpoZCkgewotICBNZXNzYWdlSGVhZGVyKiBtc2cgPSBjbG9zdXJlOwotICBjb25zdCBvbmVvZl9oYW5kbGVyZGF0YV90ICpvbmVvZmRhdGEgPSBoZDsKLSAgdWludDMyX3Qgb2xkY2FzZSA9IERFUkVGKG1zZywgb25lb2ZkYXRhLT5jYXNlX29mcywgdWludDMyX3QpOwotCi0gIFZBTFVFIHN1YmRlc2MgPQotICAgICAgZ2V0X2RlZl9vYmooKHZvaWQqKW9uZW9mZGF0YS0+bWQpOwotICBWQUxVRSBzdWJrbGFzcyA9IERlc2NyaXB0b3JfbXNnY2xhc3Moc3ViZGVzYyk7Ci0gIFZBTFVFIHN1Ym1zZ19yYjsKLSAgTWVzc2FnZUhlYWRlciogc3VibXNnOwotCi0gIGlmIChvbGRjYXNlICE9IG9uZW9mZGF0YS0+b25lb2ZfY2FzZV9udW0gfHwKLSAgICAgIERFUkVGKG1zZywgb25lb2ZkYXRhLT5vZnMsIFZBTFVFKSA9PSBRbmlsKSB7Ci0gICAgREVSRUYobXNnLCBvbmVvZmRhdGEtPm9mcywgVkFMVUUpID0KLSAgICAgICAgcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIHN1YmtsYXNzKTsKLSAgfQotICAvLyBTZXQgdGhlIG9uZW9mIGNhc2UgKmFmdGVyKiBhbGxvY2F0aW5nIHRoZSBuZXcgY2xhc3MgaW5zdGFuY2UgLS0gb3RoZXJ3aXNlLAotICAvLyBpZiB0aGUgUnVieSBHQyBpcyBpbnZva2VkIGFzIHBhcnQgb2YgYSBjYWxsIGludG8gdGhlIFZNLCBpdCBtaWdodCBpbnZva2UKLSAgLy8gb3VyIG1hcmsgcm91dGluZXMsIGFuZCBvdXIgbWFyayByb3V0aW5lcyBtaWdodCBzZWUgdGhlIGNhc2UgdmFsdWUKLSAgLy8gaW5kaWNhdGluZyBhIFZBTFVFIGlzIHByZXNlbnQgYW5kIGV4cGVjdCBhIHZhbGlkIFZBTFVFLiBTZWUgY29tbWVudCBpbgotICAvLyBsYXlvdXRfc2V0KCkgZm9yIG1vcmUgZGV0YWlsOiBiYXNpY2FsbHksIHRoZSBjaGFuZ2UgdG8gdGhlIHZhbHVlIGFuZCB0aGUKLSAgLy8gY2FzZSBtdXN0IGJlIGF0b21pYyB3LnIudC4gdGhlIFJ1YnkgVk0uCi0gIERFUkVGKG1zZywgb25lb2ZkYXRhLT5jYXNlX29mcywgdWludDMyX3QpID0KLSAgICAgIG9uZW9mZGF0YS0+b25lb2ZfY2FzZV9udW07Ci0KLSAgc3VibXNnX3JiID0gREVSRUYobXNnLCBvbmVvZmRhdGEtPm9mcywgVkFMVUUpOwotICBUeXBlZERhdGFfR2V0X1N0cnVjdChzdWJtc2dfcmIsIE1lc3NhZ2VIZWFkZXIsICZNZXNzYWdlX3R5cGUsIHN1Ym1zZyk7Ci0gIHJldHVybiBzdWJtc2c7Ci19Ci0KLS8vIFNldCB1cCBoYW5kbGVycyBmb3IgYSByZXBlYXRlZCBmaWVsZC4KLXN0YXRpYyB2b2lkIGFkZF9oYW5kbGVyc19mb3JfcmVwZWF0ZWRfZmllbGQodXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQpIHsKLSAgdXBiX2hhbmRsZXJhdHRyIGF0dHIgPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0gIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmYXR0ciwgbmV3aGFuZGxlcmRhdGEoaCwgb2Zmc2V0KSk7Ci0gIHVwYl9oYW5kbGVyc19zZXRzdGFydHNlcShoLCBmLCBzdGFydHNlcV9oYW5kbGVyLCAmYXR0cik7Ci0gIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmF0dHIpOwotCi0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLQotI2RlZmluZSBTRVRfSEFORExFUih1dHlwZSwgbHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjYXNlIHV0eXBlOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVwYl9oYW5kbGVyc19zZXQjI2x0eXBlKGgsIGYsIGFwcGVuZCMjbHR5cGUjI19oYW5kbGVyLCBOVUxMKTsgXAotICAgIGJyZWFrOwotCi0gICAgU0VUX0hBTkRMRVIoVVBCX1RZUEVfQk9PTCwgICBib29sKTsKLSAgICBTRVRfSEFORExFUihVUEJfVFlQRV9JTlQzMiwgIGludDMyKTsKLSAgICBTRVRfSEFORExFUihVUEJfVFlQRV9VSU5UMzIsIHVpbnQzMik7Ci0gICAgU0VUX0hBTkRMRVIoVVBCX1RZUEVfRU5VTSwgICBpbnQzMik7Ci0gICAgU0VUX0hBTkRMRVIoVVBCX1RZUEVfRkxPQVQsICBmbG9hdCk7Ci0gICAgU0VUX0hBTkRMRVIoVVBCX1RZUEVfSU5UNjQsICBpbnQ2NCk7Ci0gICAgU0VUX0hBTkRMRVIoVVBCX1RZUEVfVUlOVDY0LCB1aW50NjQpOwotICAgIFNFVF9IQU5ETEVSKFVQQl9UWVBFX0RPVUJMRSwgZG91YmxlKTsKLQotI3VuZGVmIFNFVF9IQU5ETEVSCi0KLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOiB7Ci0gICAgICBib29sIGlzX2J5dGVzID0gdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfQllURVM7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgZiwgaXNfYnl0ZXMgPwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFwcGVuZGJ5dGVzX2hhbmRsZXIgOiBhcHBlbmRzdHJfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgZiwgc3RyaW5nZGF0YV9oYW5kbGVyLCBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6IHsKLSAgICAgIHVwYl9oYW5kbGVyYXR0ciBhdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICAgICAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKCZhdHRyLCBuZXdzdWJtc2doYW5kbGVyZGF0YShoLCAwLCBmKSk7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2coaCwgZiwgYXBwZW5kc3VibXNnX2hhbmRsZXIsICZhdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmF0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8vIFNldCB1cCBoYW5kbGVycyBmb3IgYSBzaW5ndWxhciBmaWVsZC4KLXN0YXRpYyB2b2lkIGFkZF9oYW5kbGVyc19mb3Jfc2luZ3VsYXJfZmllbGQodXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQpIHsKLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShmKSkgewotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDoKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOgotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgIGNhc2UgVVBCX1RZUEVfRU5VTToKLSAgICBjYXNlIFVQQl9UWVBFX0ZMT0FUOgotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgY2FzZSBVUEJfVFlQRV9ET1VCTEU6Ci0gICAgICB1cGJfc2hpbV9zZXQoaCwgZiwgb2Zmc2V0LCAtMSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOiB7Ci0gICAgICBib29sIGlzX2J5dGVzID0gdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfQllURVM7Ci0gICAgICB1cGJfaGFuZGxlcmF0dHIgYXR0ciA9IFVQQl9IQU5ETEVSQVRUUl9JTklUSUFMSVpFUjsKLSAgICAgIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmYXR0ciwgbmV3aGFuZGxlcmRhdGEoaCwgb2Zmc2V0KSk7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19ieXRlcyA/IGJ5dGVzX2hhbmRsZXIgOiBzdHJfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cik7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIGYsIHN0cmluZ2RhdGFfaGFuZGxlciwgJmF0dHIpOwotICAgICAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmYXR0cik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOiB7Ci0gICAgICB1cGJfaGFuZGxlcmF0dHIgYXR0ciA9IFVQQl9IQU5ETEVSQVRUUl9JTklUSUFMSVpFUjsKLSAgICAgIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmYXR0ciwgbmV3c3VibXNnaGFuZGxlcmRhdGEoaCwgb2Zmc2V0LCBmKSk7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2coaCwgZiwgc3VibXNnX2hhbmRsZXIsICZhdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmF0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEFkZHMgaGFuZGxlcnMgdG8gYSBtYXAgZmllbGQuCi1zdGF0aWMgdm9pZCBhZGRfaGFuZGxlcnNfZm9yX21hcGZpZWxkKHVwYl9oYW5kbGVycyogaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZGRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciogZGVzYykgewotICBjb25zdCB1cGJfbXNnZGVmKiBtYXBfbXNnZGVmID0gdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihmaWVsZGRlZik7Ci0gIG1hcF9oYW5kbGVyZGF0YV90KiBoZCA9IG5ld19tYXBfaGFuZGxlcmRhdGEob2Zmc2V0LCBtYXBfbXNnZGVmLCBkZXNjKTsKLSAgdXBiX2hhbmRsZXJhdHRyIGF0dHIgPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0KLSAgdXBiX2hhbmRsZXJzX2FkZGNsZWFudXAoaCwgaGQsIGZyZWUpOwotICB1cGJfaGFuZGxlcmF0dHJfc2V0aGFuZGxlcmRhdGEoJmF0dHIsIGhkKTsKLSAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3VibXNnKGgsIGZpZWxkZGVmLCBzdGFydG1hcGVudHJ5X2hhbmRsZXIsICZhdHRyKTsKLSAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmYXR0cik7Ci19Ci0KLS8vIEFkZHMgaGFuZGxlcnMgdG8gYSBtYXAtZW50cnkgbXNnZGVmLgotc3RhdGljIHZvaWQgYWRkX2hhbmRsZXJzX2Zvcl9tYXBlbnRyeShjb25zdCB1cGJfbXNnZGVmKiBtc2dkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVycyogaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciogZGVzYykgewotICBjb25zdCB1cGJfZmllbGRkZWYqIGtleV9maWVsZCA9IG1hcF9lbnRyeV9rZXkobXNnZGVmKTsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmKiB2YWx1ZV9maWVsZCA9IG1hcF9lbnRyeV92YWx1ZShtc2dkZWYpOwotICBtYXBfaGFuZGxlcmRhdGFfdCogaGQgPSBuZXdfbWFwX2hhbmRsZXJkYXRhKDAsIG1zZ2RlZiwgZGVzYyk7Ci0gIHVwYl9oYW5kbGVyYXR0ciBhdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotCi0gIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKGgsIGhkLCBmcmVlKTsKLSAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKCZhdHRyLCBoZCk7Ci0gIHVwYl9oYW5kbGVyc19zZXRlbmRtc2coaCwgZW5kbWFwX2hhbmRsZXIsICZhdHRyKTsKLQotICBhZGRfaGFuZGxlcnNfZm9yX3Npbmd1bGFyX2ZpZWxkKAotICAgICAgaCwga2V5X2ZpZWxkLAotICAgICAgb2Zmc2V0b2YobWFwX3BhcnNlX2ZyYW1lX3QsIGtleV9zdG9yYWdlKSk7Ci0gIGFkZF9oYW5kbGVyc19mb3Jfc2luZ3VsYXJfZmllbGQoCi0gICAgICBoLCB2YWx1ZV9maWVsZCwKLSAgICAgIG9mZnNldG9mKG1hcF9wYXJzZV9mcmFtZV90LCB2YWx1ZV9zdG9yYWdlKSk7Ci19Ci0KLS8vIFNldCB1cCBoYW5kbGVycyBmb3IgYSBvbmVvZiBmaWVsZC4KLXN0YXRpYyB2b2lkIGFkZF9oYW5kbGVyc19mb3Jfb25lb2ZfZmllbGQodXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBvbmVvZl9jYXNlX29mZnNldCkgewotCi0gIHVwYl9oYW5kbGVyYXR0ciBhdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICB1cGJfaGFuZGxlcmF0dHJfc2V0aGFuZGxlcmRhdGEoCi0gICAgICAmYXR0ciwgbmV3b25lb2ZoYW5kbGVyZGF0YShoLCBvZmZzZXQsIG9uZW9mX2Nhc2Vfb2Zmc2V0LCBmKSk7Ci0KLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShmKSkgewotCi0jZGVmaW5lIFNFVF9IQU5ETEVSKHV0eXBlLCBsdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgdXR5cGU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdXBiX2hhbmRsZXJzX3NldCMjbHR5cGUoaCwgZiwgb25lb2YjI2x0eXBlIyNfaGFuZGxlciwgJmF0dHIpOyBcCi0gICAgYnJlYWs7Ci0KLSAgICBTRVRfSEFORExFUihVUEJfVFlQRV9CT09MLCAgIGJvb2wpOwotICAgIFNFVF9IQU5ETEVSKFVQQl9UWVBFX0lOVDMyLCAgaW50MzIpOwotICAgIFNFVF9IQU5ETEVSKFVQQl9UWVBFX1VJTlQzMiwgdWludDMyKTsKLSAgICBTRVRfSEFORExFUihVUEJfVFlQRV9FTlVNLCAgIGludDMyKTsKLSAgICBTRVRfSEFORExFUihVUEJfVFlQRV9GTE9BVCwgIGZsb2F0KTsKLSAgICBTRVRfSEFORExFUihVUEJfVFlQRV9JTlQ2NCwgIGludDY0KTsKLSAgICBTRVRfSEFORExFUihVUEJfVFlQRV9VSU5UNjQsIHVpbnQ2NCk7Ci0gICAgU0VUX0hBTkRMRVIoVVBCX1RZUEVfRE9VQkxFLCBkb3VibGUpOwotCi0jdW5kZWYgU0VUX0hBTkRMRVIKLQotICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOgotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6IHsKLSAgICAgIGJvb2wgaXNfYnl0ZXMgPSB1cGJfZmllbGRkZWZfdHlwZShmKSA9PSBVUEJfVFlQRV9CWVRFUzsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN0cihoLCBmLCBpc19ieXRlcyA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb25lb2ZieXRlc19oYW5kbGVyIDogb25lb2ZzdHJfaGFuZGxlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYXR0cik7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIGYsIHN0cmluZ2RhdGFfaGFuZGxlciwgTlVMTCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOiB7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2coaCwgZiwgb25lb2ZzdWJtc2dfaGFuZGxlciwgJmF0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmYXR0cik7Ci19Ci0KLQotc3RhdGljIHZvaWQgYWRkX2hhbmRsZXJzX2Zvcl9tZXNzYWdlKGNvbnN0IHZvaWQgKmNsb3N1cmUsIHVwYl9oYW5kbGVycyAqaCkgewotICBjb25zdCB1cGJfbXNnZGVmKiBtc2dkZWYgPSB1cGJfaGFuZGxlcnNfbXNnZGVmKGgpOwotICBEZXNjcmlwdG9yKiBkZXNjID0gcnVieV90b19EZXNjcmlwdG9yKGdldF9kZWZfb2JqKCh2b2lkKiltc2dkZWYpKTsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0KLSAgLy8gSWYgdGhpcyBpcyBhIG1hcGVudHJ5IG1lc3NhZ2UgdHlwZSwgc2V0IHVwIGEgc3BlY2lhbCBzZXQgb2YgaGFuZGxlcnMgYW5kCi0gIC8vIGJhaWwgb3V0IG9mIHRoZSBub3JtYWwgKHVzZXItZGVmaW5lZCkgbWVzc2FnZSB0eXBlIGhhbmRsaW5nLgotICBpZiAodXBiX21zZ2RlZl9tYXBlbnRyeShtc2dkZWYpKSB7Ci0gICAgYWRkX2hhbmRsZXJzX2Zvcl9tYXBlbnRyeShtc2dkZWYsIGgsIGRlc2MpOwotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIEVuc3VyZSBsYXlvdXQgZXhpc3RzLiBXZSBtYXkgYmUgaW52b2tlZCB0byBjcmVhdGUgaGFuZGxlcnMgZm9yIGEgZ2l2ZW4KLSAgLy8gbWVzc2FnZSBpZiB3ZSBhcmUgaW5jbHVkZWQgYXMgYSBzdWJtc2cgb2YgYW5vdGhlciBtZXNzYWdlIHR5cGUgYmVmb3JlIG91cgotICAvLyBjbGFzcyBpcyBhY3R1YWxseSBidWlsdCwgc28gdG8gd29yayBhcm91bmQgdGhpcywgd2UganVzdCBjcmVhdGUgdGhlIGxheW91dAotICAvLyAoYW5kIGhhbmRsZXJzLCBpbiB0aGUgY2xhc3MtYnVpbGRpbmcgZnVuY3Rpb24pIG9uLWRlbWFuZC4KLSAgaWYgKGRlc2MtPmxheW91dCA9PSBOVUxMKSB7Ci0gICAgZGVzYy0+bGF5b3V0ID0gY3JlYXRlX2xheW91dChkZXNjLT5tc2dkZWYpOwotICB9Ci0KLSAgZm9yICh1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBkZXNjLT5tc2dkZWYpOwotICAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaSkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmkpOwotICAgIHNpemVfdCBvZmZzZXQgPSBkZXNjLT5sYXlvdXQtPmZpZWxkc1t1cGJfZmllbGRkZWZfaW5kZXgoZildLm9mZnNldCArCi0gICAgICAgIHNpemVvZihNZXNzYWdlSGVhZGVyKTsKLQotICAgIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGYpKSB7Ci0gICAgICBzaXplX3Qgb25lb2ZfY2FzZV9vZmZzZXQgPQotICAgICAgICAgIGRlc2MtPmxheW91dC0+ZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmKV0uY2FzZV9vZmZzZXQgKwotICAgICAgICAgIHNpemVvZihNZXNzYWdlSGVhZGVyKTsKLSAgICAgIGFkZF9oYW5kbGVyc19mb3Jfb25lb2ZfZmllbGQoaCwgZiwgb2Zmc2V0LCBvbmVvZl9jYXNlX29mZnNldCk7Ci0gICAgfSBlbHNlIGlmIChpc19tYXBfZmllbGQoZikpIHsKLSAgICAgIGFkZF9oYW5kbGVyc19mb3JfbWFwZmllbGQoaCwgZiwgb2Zmc2V0LCBkZXNjKTsKLSAgICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgewotICAgICAgYWRkX2hhbmRsZXJzX2Zvcl9yZXBlYXRlZF9maWVsZChoLCBmLCBvZmZzZXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhZGRfaGFuZGxlcnNfZm9yX3Npbmd1bGFyX2ZpZWxkKGgsIGYsIG9mZnNldCk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIENyZWF0ZXMgdXBiIGhhbmRsZXJzIGZvciBwb3B1bGF0aW5nIGEgbWVzc2FnZS4KLXN0YXRpYyBjb25zdCB1cGJfaGFuZGxlcnMgKm5ld19maWxsX2hhbmRsZXJzKERlc2NyaXB0b3IqIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBvd25lcikgewotICAvLyBUT0RPKGNmYWxsaW4sIGhhYmVybWFuKTogb25jZSB1cGIgZ2V0cyBhIGNhY2hpbmcvbWVtb2l6YXRpb24gbGF5ZXIgZm9yCi0gIC8vIGhhbmRsZXJzLCByZXVzZSBzdWJkZWYgaGFuZGxlcnMgc28gdGhhdCBlLmcuIGlmIHdlIGFscmVhZHkgcGFyc2UKLSAgLy8gQi13aXRoLWZpZWxkLW9mLXR5cGUtQywgd2UgZG9uJ3QgaGF2ZSB0byByZWJ1aWxkIHRoZSB3aG9sZSBoaWVyYXJjaHkgdG8KLSAgLy8gcGFyc2UgQS13aXRoLWZpZWxkLW9mLXR5cGUtQi13aXRoLWZpZWxkLW9mLXR5cGUtQy4KLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19uZXdmcm96ZW4oZGVzYy0+bXNnZGVmLCBvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX2hhbmRsZXJzX2Zvcl9tZXNzYWdlLCBOVUxMKTsKLX0KLQotLy8gQ29uc3RydWN0cyB0aGUgaGFuZGxlcnMgZm9yIGZpbGxpbmcgYSBtZXNzYWdlJ3MgZGF0YSBpbnRvIGFuIGluLW1lbW9yeQotLy8gb2JqZWN0LgotY29uc3QgdXBiX2hhbmRsZXJzKiBnZXRfZmlsbF9oYW5kbGVycyhEZXNjcmlwdG9yKiBkZXNjKSB7Ci0gIGlmICghZGVzYy0+ZmlsbF9oYW5kbGVycykgewotICAgIGRlc2MtPmZpbGxfaGFuZGxlcnMgPQotICAgICAgICBuZXdfZmlsbF9oYW5kbGVycyhkZXNjLCAmZGVzYy0+ZmlsbF9oYW5kbGVycyk7Ci0gIH0KLSAgcmV0dXJuIGRlc2MtPmZpbGxfaGFuZGxlcnM7Ci19Ci0KLS8vIENvbnN0cnVjdHMgdGhlIHVwYiBkZWNvZGVyIG1ldGhvZCBmb3IgcGFyc2luZyBtZXNzYWdlcyBvZiB0aGlzIHR5cGUuCi0vLyBUaGlzIGlzIGNhbGxlZCBmcm9tIHRoZSBtZXNzYWdlIGNsYXNzIGNyZWF0aW9uIGNvZGUuCi1jb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICpuZXdfZmlsbG1zZ19kZWNvZGVybWV0aG9kKERlc2NyaXB0b3IqIGRlc2MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIG93bmVyKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyogaGFuZGxlcnMgPSBnZXRfZmlsbF9oYW5kbGVycyhkZXNjKTsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgb3B0czsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHNfaW5pdCgmb3B0cywgaGFuZGxlcnMpOwotCi0gIHJldHVybiB1cGJfcGJkZWNvZGVybWV0aG9kX25ldygmb3B0cywgb3duZXIpOwotfQotCi1zdGF0aWMgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbXNnZGVmX2RlY29kZXJtZXRob2QoRGVzY3JpcHRvciogZGVzYykgewotICBpZiAoZGVzYy0+ZmlsbF9tZXRob2QgPT0gTlVMTCkgewotICAgIGRlc2MtPmZpbGxfbWV0aG9kID0gbmV3X2ZpbGxtc2dfZGVjb2Rlcm1ldGhvZCgKLSAgICAgICAgZGVzYywgJmRlc2MtPmZpbGxfbWV0aG9kKTsKLSAgfQotICByZXR1cm4gZGVzYy0+ZmlsbF9tZXRob2Q7Ci19Ci0KLXN0YXRpYyBjb25zdCB1cGJfanNvbl9wYXJzZXJtZXRob2QgKm1zZ2RlZl9qc29ucGFyc2VybWV0aG9kKERlc2NyaXB0b3IqIGRlc2MpIHsKLSAgaWYgKGRlc2MtPmpzb25fZmlsbF9tZXRob2QgPT0gTlVMTCkgewotICAgIGRlc2MtPmpzb25fZmlsbF9tZXRob2QgPQotICAgICAgICB1cGJfanNvbl9wYXJzZXJtZXRob2RfbmV3KGRlc2MtPm1zZ2RlZiwgJmRlc2MtPmpzb25fZmlsbF9tZXRob2QpOwotICB9Ci0gIHJldHVybiBkZXNjLT5qc29uX2ZpbGxfbWV0aG9kOwotfQotCi0KLS8vIFN0YWNrLWFsbG9jYXRlZCBjb250ZXh0IGR1cmluZyBhbiBlbmNvZGUvZGVjb2RlIG9wZXJhdGlvbi4gQ29udGFpbnMgdGhlIHVwYgotLy8gZW52aXJvbm1lbnQgYW5kIGl0cyBzdGFjay1iYXNlZCBhbGxvY2F0b3IsIGFuIGluaXRpYWwgYnVmZmVyIGZvciBhbGxvY2F0aW9ucwotLy8gdG8gYXZvaWQgbWFsbG9jKCkgd2hlbiBwb3NzaWJsZSwgYW5kIGEgdGVtcGxhdGUgZm9yIFJ1YnkgZXhjZXB0aW9uIG1lc3NhZ2VzCi0vLyBpZiBhbnkgZXJyb3Igb2NjdXJzLgotI2RlZmluZSBTVEFDS19FTlZfU1RBQ0tCWVRFUyA0MDk2Ci10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9lbnYgZW52OwotICBjb25zdCBjaGFyKiBydWJ5X2Vycm9yX3RlbXBsYXRlOwotICBjaGFyIGFsbG9jYnVmW1NUQUNLX0VOVl9TVEFDS0JZVEVTXTsKLX0gc3RhY2tlbnY7Ci0KLXN0YXRpYyB2b2lkIHN0YWNrZW52X2luaXQoc3RhY2tlbnYqIHNlLCBjb25zdCBjaGFyKiBlcnJtc2cpOwotc3RhdGljIHZvaWQgc3RhY2tlbnZfdW5pbml0KHN0YWNrZW52KiBzZSk7Ci0KLS8vIENhbGxiYWNrIGludm9rZWQgYnkgdXBiIGlmIGFueSBlcnJvciBvY2N1cnMgZHVyaW5nIHBhcnNpbmcgb3Igc2VyaWFsaXphdGlvbi4KLXN0YXRpYyBib29sIGVudl9lcnJvcl9mdW5jKHZvaWQqIHVkLCBjb25zdCB1cGJfc3RhdHVzKiBzdGF0dXMpIHsKLSAgc3RhY2tlbnYqIHNlID0gdWQ7Ci0gIC8vIEZyZWUgdGhlIGVudiAtLSByYl9yYWlzZSB3aWxsIGxvbmdqbXAgdXAgdGhlIHN0YWNrIHBhc3QgdGhlIGVuY29kZS9kZWNvZGUKLSAgLy8gZnVuY3Rpb24gc28gaXQgd291bGQgbm90IG90aGVyd2lzZSBoYXZlIGJlZW4gZnJlZWQuCi0gIHN0YWNrZW52X3VuaW5pdChzZSk7Ci0KLSAgLy8gVE9ETyhoYWJlcm1hbik6IGhhdmUgYSB3YXkgdG8gdmVyaWZ5IHRoYXQgdGhpcyBpcyBhY3R1YWxseSBhIHBhcnNlIGVycm9yLAotICAvLyBpbnN0ZWFkIG9mIGp1c3QgdGhyb3dpbmcgInBhcnNlIGVycm9yIiB1bmNvbmRpdGlvbmFsbHkuCi0gIHJiX3JhaXNlKGNQYXJzZUVycm9yLCBzZS0+cnVieV9lcnJvcl90ZW1wbGF0ZSwgdXBiX3N0YXR1c19lcnJtc2coc3RhdHVzKSk7Ci0gIC8vIE5ldmVyIHJlYWNoZWQ6IHJiX3JhaXNlKCkgYWx3YXlzIGxvbmdqbXAoKXMgdXAgdGhlIHN0YWNrLCBwYXN0IGFsbCBvZiBvdXIKLSAgLy8gY29kZSwgYmFjayB0byBSdWJ5LgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YWNrZW52X2luaXQoc3RhY2tlbnYqIHNlLCBjb25zdCBjaGFyKiBlcnJtc2cpIHsKLSAgc2UtPnJ1YnlfZXJyb3JfdGVtcGxhdGUgPSBlcnJtc2c7Ci0gIHVwYl9lbnZfaW5pdDIoJnNlLT5lbnYsIHNlLT5hbGxvY2J1Ziwgc2l6ZW9mKHNlLT5hbGxvY2J1ZiksIE5VTEwpOwotICB1cGJfZW52X3NldGVycm9yZnVuYygmc2UtPmVudiwgZW52X2Vycm9yX2Z1bmMsIHNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhY2tlbnZfdW5pbml0KHN0YWNrZW52KiBzZSkgewotICB1cGJfZW52X3VuaW5pdCgmc2UtPmVudik7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlQ2xhc3MuZGVjb2RlKGRhdGEpID0+IG1lc3NhZ2UKLSAqCi0gKiBEZWNvZGVzIHRoZSBnaXZlbiBkYXRhIChhcyBhIHN0cmluZyBjb250YWluaW5nIGJ5dGVzIGluIHByb3RvY29sIGJ1ZmZlcnMgd2lyZQotICogZm9ybWF0KSB1bmRlciB0aGUgaW50ZXJwcmV0cmF0aW9uIGdpdmVuIGJ5IHRoaXMgbWVzc2FnZSBjbGFzcydzIGRlZmluaXRpb24KLSAqIGFuZCByZXR1cm5zIGEgbWVzc2FnZSBvYmplY3Qgd2l0aCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZCB2YWx1ZXMuCi0gKi8KLVZBTFVFIE1lc3NhZ2VfZGVjb2RlKFZBTFVFIGtsYXNzLCBWQUxVRSBkYXRhKSB7Ci0gIFZBTFVFIGRlc2NyaXB0b3IgPSByYl9pdmFyX2dldChrbGFzcywgZGVzY3JpcHRvcl9pbnN0YW5jZXZhcl9pbnRlcm5lZCk7Ci0gIERlc2NyaXB0b3IqIGRlc2MgPSBydWJ5X3RvX0Rlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gIFZBTFVFIG1zZ2tsYXNzID0gRGVzY3JpcHRvcl9tc2djbGFzcyhkZXNjcmlwdG9yKTsKLSAgVkFMVUUgbXNnX3JiOwotICBNZXNzYWdlSGVhZGVyKiBtc2c7Ci0KLSAgaWYgKFRZUEUoZGF0YSkgIT0gVF9TVFJJTkcpIHsKLSAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJFeHBlY3RlZCBzdHJpbmcgZm9yIGJpbmFyeSBwcm90b2J1ZiBkYXRhLiIpOwotICB9Ci0KLSAgbXNnX3JiID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIG1zZ2tsYXNzKTsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QobXNnX3JiLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBtc2cpOwotCi0gIHsKLSAgICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kKiBtZXRob2QgPSBtc2dkZWZfZGVjb2Rlcm1ldGhvZChkZXNjKTsKLSAgICBjb25zdCB1cGJfaGFuZGxlcnMqIGggPSB1cGJfcGJkZWNvZGVybWV0aG9kX2Rlc3RoYW5kbGVycyhtZXRob2QpOwotICAgIHN0YWNrZW52IHNlOwotICAgIHVwYl9zaW5rIHNpbms7Ci0gICAgdXBiX3BiZGVjb2RlciogZGVjb2RlcjsKLSAgICBzdGFja2Vudl9pbml0KCZzZSwgIkVycm9yIG9jY3VycmVkIGR1cmluZyBwYXJzaW5nOiAlcyIpOwotCi0gICAgdXBiX3NpbmtfcmVzZXQoJnNpbmssIGgsIG1zZyk7Ci0gICAgZGVjb2RlciA9IHVwYl9wYmRlY29kZXJfY3JlYXRlKCZzZS5lbnYsIG1ldGhvZCwgJnNpbmspOwotICAgIHVwYl9idWZzcmNfcHV0YnVmKFJTVFJJTkdfUFRSKGRhdGEpLCBSU1RSSU5HX0xFTihkYXRhKSwKLSAgICAgICAgICAgICAgICAgICAgICB1cGJfcGJkZWNvZGVyX2lucHV0KGRlY29kZXIpKTsKLQotICAgIHN0YWNrZW52X3VuaW5pdCgmc2UpOwotICB9Ci0KLSAgcmV0dXJuIG1zZ19yYjsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1lc3NhZ2VDbGFzcy5kZWNvZGVfanNvbihkYXRhKSA9PiBtZXNzYWdlCi0gKgotICogRGVjb2RlcyB0aGUgZ2l2ZW4gZGF0YSAoYXMgYSBzdHJpbmcgY29udGFpbmluZyBieXRlcyBpbiBwcm90b2NvbCBidWZmZXJzIHdpcmUKLSAqIGZvcm1hdCkgdW5kZXIgdGhlIGludGVycHJldHJhdGlvbiBnaXZlbiBieSB0aGlzIG1lc3NhZ2UgY2xhc3MncyBkZWZpbml0aW9uCi0gKiBhbmQgcmV0dXJucyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgdmFsdWVzLgotICovCi1WQUxVRSBNZXNzYWdlX2RlY29kZV9qc29uKFZBTFVFIGtsYXNzLCBWQUxVRSBkYXRhKSB7Ci0gIFZBTFVFIGRlc2NyaXB0b3IgPSByYl9pdmFyX2dldChrbGFzcywgZGVzY3JpcHRvcl9pbnN0YW5jZXZhcl9pbnRlcm5lZCk7Ci0gIERlc2NyaXB0b3IqIGRlc2MgPSBydWJ5X3RvX0Rlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0gIFZBTFVFIG1zZ2tsYXNzID0gRGVzY3JpcHRvcl9tc2djbGFzcyhkZXNjcmlwdG9yKTsKLSAgVkFMVUUgbXNnX3JiOwotICBNZXNzYWdlSGVhZGVyKiBtc2c7Ci0KLSAgaWYgKFRZUEUoZGF0YSkgIT0gVF9TVFJJTkcpIHsKLSAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJFeHBlY3RlZCBzdHJpbmcgZm9yIEpTT04gZGF0YS4iKTsKLSAgfQotICAvLyBUT0RPKGNmYWxsaW4pOiBDaGVjayBhbmQgcmVzcGVjdCBzdHJpbmcgZW5jb2RpbmcuIElmIG5vdCBVVEYtOCwgd2UgbmVlZCB0bwotICAvLyBjb252ZXJ0LCBiZWNhdXNlIHN0cmluZyBoYW5kbGVycyBwYXNzIGRhdGEgZGlyZWN0bHkgdG8gbWVzc2FnZSBzdHJpbmcKLSAgLy8gZmllbGRzLgotCi0gIG1zZ19yYiA9IHJiX2NsYXNzX25ld19pbnN0YW5jZSgwLCBOVUxMLCBtc2drbGFzcyk7Ci0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KG1zZ19yYiwgTWVzc2FnZUhlYWRlciwgJk1lc3NhZ2VfdHlwZSwgbXNnKTsKLQotICB7Ci0gICAgY29uc3QgdXBiX2pzb25fcGFyc2VybWV0aG9kKiBtZXRob2QgPSBtc2dkZWZfanNvbnBhcnNlcm1ldGhvZChkZXNjKTsKLSAgICBzdGFja2VudiBzZTsKLSAgICB1cGJfc2luayBzaW5rOwotICAgIHVwYl9qc29uX3BhcnNlciogcGFyc2VyOwotICAgIHN0YWNrZW52X2luaXQoJnNlLCAiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIHBhcnNpbmc6ICVzIik7Ci0KLSAgICB1cGJfc2lua19yZXNldCgmc2luaywgZ2V0X2ZpbGxfaGFuZGxlcnMoZGVzYyksIG1zZyk7Ci0gICAgcGFyc2VyID0gdXBiX2pzb25fcGFyc2VyX2NyZWF0ZSgmc2UuZW52LCBtZXRob2QsICZzaW5rKTsKLSAgICB1cGJfYnVmc3JjX3B1dGJ1ZihSU1RSSU5HX1BUUihkYXRhKSwgUlNUUklOR19MRU4oZGF0YSksCi0gICAgICAgICAgICAgICAgICAgICAgdXBiX2pzb25fcGFyc2VyX2lucHV0KHBhcnNlcikpOwotCi0gICAgc3RhY2tlbnZfdW5pbml0KCZzZSk7Ci0gIH0KLQotICByZXR1cm4gbXNnX3JiOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2VyaWFsaXppbmcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8KLS8vIFRoZSBjb2RlIGJlbG93IGFsc28gY29tZXMgZnJvbSB1cGIncyBwcm90b3R5cGUgUnVieSBiaW5kaW5nLCBkZXZlbG9wZWQgYnkKLS8vIGhhYmVybWFuQC4KLQotLyogc3RyaW5nc2luayAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLy8gVGhpcyBzaG91bGQgcHJvYmFibHkgYmUgZmFjdG9yZWQgaW50byBhIGNvbW1vbiB1cGIgY29tcG9uZW50LgotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9ieXRlc2hhbmRsZXIgaGFuZGxlcjsKLSAgdXBiX2J5dGVzc2luayBzaW5rOwotICBjaGFyICpwdHI7Ci0gIHNpemVfdCBsZW4sIHNpemU7Ci19IHN0cmluZ3Npbms7Ci0KLXN0YXRpYyB2b2lkICpzdHJpbmdzaW5rX3N0YXJ0KHZvaWQgKl9zaW5rLCBjb25zdCB2b2lkICpoZCwgc2l6ZV90IHNpemVfaGludCkgewotICBzdHJpbmdzaW5rICpzaW5rID0gX3Npbms7Ci0gIHNpbmstPmxlbiA9IDA7Ci0gIHJldHVybiBzaW5rOwotfQotCi1zdGF0aWMgc2l6ZV90IHN0cmluZ3Npbmtfc3RyaW5nKHZvaWQgKl9zaW5rLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgc3RyaW5nc2luayAqc2luayA9IF9zaW5rOwotICBzaXplX3QgbmV3X3NpemUgPSBzaW5rLT5zaXplOwotCi0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgd2hpbGUgKHNpbmstPmxlbiArIGxlbiA+IG5ld19zaXplKSB7Ci0gICAgbmV3X3NpemUgKj0gMjsKLSAgfQotCi0gIGlmIChuZXdfc2l6ZSAhPSBzaW5rLT5zaXplKSB7Ci0gICAgc2luay0+cHRyID0gcmVhbGxvYyhzaW5rLT5wdHIsIG5ld19zaXplKTsKLSAgICBzaW5rLT5zaXplID0gbmV3X3NpemU7Ci0gIH0KLQotICBtZW1jcHkoc2luay0+cHRyICsgc2luay0+bGVuLCBwdHIsIGxlbik7Ci0gIHNpbmstPmxlbiArPSBsZW47Ci0KLSAgcmV0dXJuIGxlbjsKLX0KLQotdm9pZCBzdHJpbmdzaW5rX2luaXQoc3RyaW5nc2luayAqc2luaykgewotICB1cGJfYnl0ZXNoYW5kbGVyX2luaXQoJnNpbmstPmhhbmRsZXIpOwotICB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0YXJ0c3RyKCZzaW5rLT5oYW5kbGVyLCBzdHJpbmdzaW5rX3N0YXJ0LCBOVUxMKTsKLSAgdXBiX2J5dGVzaGFuZGxlcl9zZXRzdHJpbmcoJnNpbmstPmhhbmRsZXIsIHN0cmluZ3Npbmtfc3RyaW5nLCBOVUxMKTsKLQotICB1cGJfYnl0ZXNzaW5rX3Jlc2V0KCZzaW5rLT5zaW5rLCAmc2luay0+aGFuZGxlciwgc2luayk7Ci0KLSAgc2luay0+c2l6ZSA9IDMyOwotICBzaW5rLT5wdHIgPSBtYWxsb2Moc2luay0+c2l6ZSk7Ci0gIHNpbmstPmxlbiA9IDA7Ci19Ci0KLXZvaWQgc3RyaW5nc2lua191bmluaXQoc3RyaW5nc2luayAqc2luaykgewotICBmcmVlKHNpbmstPnB0cik7Ci19Ci0KLS8qIG1zZ3Zpc2l0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8vIFRPRE86IElmL3doZW4gd2Ugc3VwcG9ydCBwcm90bzIgc2VtYW50aWNzIGluIGFkZGl0aW9uIHRvIHRoZSBjdXJyZW50IHByb3RvMwotLy8gc2VtYW50aWNzLCB3aGljaCBtZWFucyB0aGF0IHdlIGhhdmUgdHJ1ZSBmaWVsZCBwcmVzZW5jZSwgd2Ugd2lsbCB3YW50IHRvCi0vLyBtb2RpZnkgbXNndmlzaXRvciBzbyB0aGF0IGl0IGVtaXRzIGFsbCBwcmVzZW50IGZpZWxkcyByYXRoZXIgdGhhbiBhbGwKLS8vIG5vbi1kZWZhdWx0LXZhbHVlIGZpZWxkcy4KLS8vCi0vLyBMaWtld2lzZSwgd2hlbiBpbXBsZW1lbnRpbmcgSlNPTiBzZXJpYWxpemF0aW9uLCB3ZSBtYXkgbmVlZCB0byBoYXZlIGEKLS8vICd2ZXJib3NlJyBtb2RlIHRoYXQgb3V0cHV0cyBhbGwgZmllbGRzIGFuZCBhICdjb25jaXNlJyBtb2RlIHRoYXQgb3V0cHV0cyBvbmx5Ci0vLyB0aG9zZSB3aXRoIG5vbi1kZWZhdWx0IHZhbHVlcy4KLQotc3RhdGljIHZvaWQgcHV0bXNnKFZBTFVFIG1zZywgY29uc3QgRGVzY3JpcHRvciogZGVzYywKLSAgICAgICAgICAgICAgICAgICB1cGJfc2luayAqc2luaywgaW50IGRlcHRoKTsKLQotc3RhdGljIHVwYl9zZWxlY3Rvcl90IGdldHNlbChjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUpIHsKLSAgdXBiX3NlbGVjdG9yX3QgcmV0OwotICBib29sIG9rID0gdXBiX2hhbmRsZXJzX2dldHNlbGVjdG9yKGYsIHR5cGUsICZyZXQpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgdm9pZCBwdXRzdHIoVkFMVUUgc3RyLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9zaW5rICpzaW5rKSB7Ci0gIHVwYl9zaW5rIHN1YnNpbms7Ci0KLSAgaWYgKHN0ciA9PSBRbmlsKSByZXR1cm47Ci0KLSAgYXNzZXJ0KEJVSUxUSU5fVFlQRShzdHIpID09IFJVQllfVF9TVFJJTkcpOwotCi0gIC8vIEVuc3VyZSB0aGF0IHRoZSBzdHJpbmcgaGFzIHRoZSBjb3JyZWN0IGVuY29kaW5nLiBXZSBhbHNvIGNoZWNrIGF0IGZpZWxkLXNldAotICAvLyB0aW1lLCBidXQgdGhlIHVzZXIgbWF5IGhhdmUgbXV0YXRlZCB0aGUgc3RyaW5nIG9iamVjdCBzaW5jZSB0aGVuLgotICBuYXRpdmVfc2xvdF92YWxpZGF0ZV9zdHJpbmdfZW5jb2RpbmcodXBiX2ZpZWxkZGVmX3R5cGUoZiksIHN0cik7Ci0KLSAgdXBiX3Npbmtfc3RhcnRzdHIoc2luaywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU1RSKSwgUlNUUklOR19MRU4oc3RyKSwKLSAgICAgICAgICAgICAgICAgICAgJnN1YnNpbmspOwotICB1cGJfc2lua19wdXRzdHJpbmcoJnN1YnNpbmssIGdldHNlbChmLCBVUEJfSEFORExFUl9TVFJJTkcpLCBSU1RSSU5HX1BUUihzdHIpLAotICAgICAgICAgICAgICAgICAgICAgUlNUUklOR19MRU4oc3RyKSwgTlVMTCk7Ci0gIHVwYl9zaW5rX2VuZHN0cihzaW5rLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfRU5EU1RSKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dHN1Ym1zZyhWQUxVRSBzdWJtc2csIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgdXBiX3NpbmsgKnNpbmssCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGRlcHRoKSB7Ci0gIHVwYl9zaW5rIHN1YnNpbms7Ci0gIFZBTFVFIGRlc2NyaXB0b3I7Ci0gIERlc2NyaXB0b3IqIHN1YmRlc2M7Ci0KLSAgaWYgKHN1Ym1zZyA9PSBRbmlsKSByZXR1cm47Ci0KLSAgZGVzY3JpcHRvciA9IHJiX2l2YXJfZ2V0KHN1Ym1zZywgZGVzY3JpcHRvcl9pbnN0YW5jZXZhcl9pbnRlcm5lZCk7Ci0gIHN1YmRlc2MgPSBydWJ5X3RvX0Rlc2NyaXB0b3IoZGVzY3JpcHRvcik7Ci0KLSAgdXBiX3Npbmtfc3RhcnRzdWJtc2coc2luaywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKSwgJnN1YnNpbmspOwotICBwdXRtc2coc3VibXNnLCBzdWJkZXNjLCAmc3Vic2luaywgZGVwdGggKyAxKTsKLSAgdXBiX3NpbmtfZW5kc3VibXNnKHNpbmssIGdldHNlbChmLCBVUEJfSEFORExFUl9FTkRTVUJNU0cpKTsKLX0KLQotc3RhdGljIHZvaWQgcHV0YXJ5KFZBTFVFIGFyeSwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLCB1cGJfc2luayAqc2luaywKLSAgICAgICAgICAgICAgICAgICBpbnQgZGVwdGgpIHsKLSAgdXBiX3Npbmsgc3Vic2luazsKLSAgdXBiX2ZpZWxkdHlwZV90IHR5cGUgPSB1cGJfZmllbGRkZWZfdHlwZShmKTsKLSAgdXBiX3NlbGVjdG9yX3Qgc2VsID0gMDsKLSAgaW50IHNpemU7Ci0KLSAgaWYgKGFyeSA9PSBRbmlsKSByZXR1cm47Ci0KLSAgdXBiX3Npbmtfc3RhcnRzZXEoc2luaywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRKSwgJnN1YnNpbmspOwotCi0gIGlmICh1cGJfZmllbGRkZWZfaXNwcmltaXRpdmUoZikpIHsKLSAgICBzZWwgPSBnZXRzZWwoZiwgdXBiX2hhbmRsZXJzX2dldHByaW1pdGl2ZWhhbmRsZXJ0eXBlKGYpKTsKLSAgfQotCi0gIHNpemUgPSBOVU0ySU5UKFJlcGVhdGVkRmllbGRfbGVuZ3RoKGFyeSkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgIHZvaWQqIG1lbW9yeSA9IFJlcGVhdGVkRmllbGRfaW5kZXhfbmF0aXZlKGFyeSwgaSk7Ci0gICAgc3dpdGNoICh0eXBlKSB7Ci0jZGVmaW5lIFQodXBidHlwZWNvbnN0LCB1cGJ0eXBlLCBjdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBjYXNlIHVwYnR5cGVjb25zdDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1cGJfc2lua19wdXQjI3VwYnR5cGUoJnN1YnNpbmssIHNlbCwgKigoY3R5cGUgKiltZW1vcnkpKTsgICBcCi0gICAgYnJlYWs7Ci0KLSAgICAgIFQoVVBCX1RZUEVfRkxPQVQsICBmbG9hdCwgIGZsb2F0KQotICAgICAgVChVUEJfVFlQRV9ET1VCTEUsIGRvdWJsZSwgZG91YmxlKQotICAgICAgVChVUEJfVFlQRV9CT09MLCAgIGJvb2wsICAgaW50OF90KQotICAgICAgY2FzZSBVUEJfVFlQRV9FTlVNOgotICAgICAgVChVUEJfVFlQRV9JTlQzMiwgIGludDMyLCAgaW50MzJfdCkKLSAgICAgIFQoVVBCX1RZUEVfVUlOVDMyLCB1aW50MzIsIHVpbnQzMl90KQotICAgICAgVChVUEJfVFlQRV9JTlQ2NCwgIGludDY0LCAgaW50NjRfdCkKLSAgICAgIFQoVVBCX1RZUEVfVUlOVDY0LCB1aW50NjQsIHVpbnQ2NF90KQotCi0gICAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICAgIGNhc2UgVVBCX1RZUEVfQllURVM6Ci0gICAgICAgIHB1dHN0cigqKChWQUxVRSAqKW1lbW9yeSksIGYsICZzdWJzaW5rKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6Ci0gICAgICAgIHB1dHN1Ym1zZygqKChWQUxVRSAqKW1lbW9yeSksIGYsICZzdWJzaW5rLCBkZXB0aCk7Ci0gICAgICAgIGJyZWFrOwotCi0jdW5kZWYgVAotCi0gICAgfQotICB9Ci0gIHVwYl9zaW5rX2VuZHNlcShzaW5rLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfRU5EU0VRKSk7Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dF9ydWJ5X3ZhbHVlKFZBTFVFIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUgdHlwZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zaW5rICpzaW5rKSB7Ci0gIHVwYl9zZWxlY3Rvcl90IHNlbCA9IDA7Ci0gIGlmICh1cGJfZmllbGRkZWZfaXNwcmltaXRpdmUoZikpIHsKLSAgICBzZWwgPSBnZXRzZWwoZiwgdXBiX2hhbmRsZXJzX2dldHByaW1pdGl2ZWhhbmRsZXJ0eXBlKGYpKTsKLSAgfQotCi0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOgotICAgICAgdXBiX3NpbmtfcHV0aW50MzIoc2luaywgc2VsLCBOVU0ySU5UKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDY0OgotICAgICAgdXBiX3NpbmtfcHV0aW50NjQoc2luaywgc2VsLCBOVU0yTEwodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgICAgdXBiX3NpbmtfcHV0dWludDMyKHNpbmssIHNlbCwgTlVNMlVJTlQodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgdXBiX3NpbmtfcHV0dWludDY0KHNpbmssIHNlbCwgTlVNMlVMTCh2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDoKLSAgICAgIHVwYl9zaW5rX3B1dGZsb2F0KHNpbmssIHNlbCwgTlVNMkRCTCh2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9ET1VCTEU6Ci0gICAgICB1cGJfc2lua19wdXRkb3VibGUoc2luaywgc2VsLCBOVU0yREJMKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06IHsKLSAgICAgIGlmIChUWVBFKHZhbHVlKSA9PSBUX1NZTUJPTCkgewotICAgICAgICB2YWx1ZSA9IHJiX2Z1bmNhbGwodHlwZV9jbGFzcywgcmJfaW50ZXJuKCJyZXNvbHZlIiksIDEsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHVwYl9zaW5rX3B1dGludDMyKHNpbmssIHNlbCwgTlVNMklOVCh2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDoKLSAgICAgIHVwYl9zaW5rX3B1dGJvb2woc2luaywgc2VsLCB2YWx1ZSA9PSBRdHJ1ZSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgcHV0c3RyKHZhbHVlLCBmLCBzaW5rKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfTUVTU0FHRToKLSAgICAgIHB1dHN1Ym1zZyh2YWx1ZSwgZiwgc2luaywgZGVwdGgpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHB1dG1hcChWQUxVRSBtYXAsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgdXBiX3NpbmsgKnNpbmssCi0gICAgICAgICAgICAgICAgICAgaW50IGRlcHRoKSB7Ci0gIE1hcCogc2VsZjsKLSAgdXBiX3Npbmsgc3Vic2luazsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmKiBrZXlfZmllbGQ7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogdmFsdWVfZmllbGQ7Ci0gIE1hcF9pdGVyIGl0OwotCi0gIGlmIChtYXAgPT0gUW5pbCkgcmV0dXJuOwotICBzZWxmID0gcnVieV90b19NYXAobWFwKTsKLQotICB1cGJfc2lua19zdGFydHNlcShzaW5rLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RBUlRTRVEpLCAmc3Vic2luayk7Ci0KLSAgYXNzZXJ0KHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX01FU1NBR0UpOwotICBrZXlfZmllbGQgPSBtYXBfZmllbGRfa2V5KGYpOwotICB2YWx1ZV9maWVsZCA9IG1hcF9maWVsZF92YWx1ZShmKTsKLQotICBmb3IgKE1hcF9iZWdpbihtYXAsICZpdCk7ICFNYXBfZG9uZSgmaXQpOyBNYXBfbmV4dCgmaXQpKSB7Ci0gICAgVkFMVUUga2V5ID0gTWFwX2l0ZXJfa2V5KCZpdCk7Ci0gICAgVkFMVUUgdmFsdWUgPSBNYXBfaXRlcl92YWx1ZSgmaXQpOwotICAgIHVwYl9zdGF0dXMgc3RhdHVzOwotCi0gICAgdXBiX3NpbmsgZW50cnlfc2luazsKLSAgICB1cGJfc2lua19zdGFydHN1Ym1zZygmc3Vic2luaywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAmZW50cnlfc2luayk7Ci0gICAgdXBiX3Npbmtfc3RhcnRtc2coJmVudHJ5X3NpbmspOwotCi0gICAgcHV0X3J1YnlfdmFsdWUoa2V5LCBrZXlfZmllbGQsIFFuaWwsIGRlcHRoICsgMSwgJmVudHJ5X3NpbmspOwotICAgIHB1dF9ydWJ5X3ZhbHVlKHZhbHVlLCB2YWx1ZV9maWVsZCwgc2VsZi0+dmFsdWVfdHlwZV9jbGFzcywgZGVwdGggKyAxLAotICAgICAgICAgICAgICAgICAgICZlbnRyeV9zaW5rKTsKLQotICAgIHVwYl9zaW5rX2VuZG1zZygmZW50cnlfc2luaywgJnN0YXR1cyk7Ci0gICAgdXBiX3NpbmtfZW5kc3VibXNnKCZzdWJzaW5rLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfRU5EU1VCTVNHKSk7Ci0gIH0KLQotICB1cGJfc2lua19lbmRzZXEoc2luaywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX0VORFNFUSkpOwotfQotCi1zdGF0aWMgdm9pZCBwdXRtc2coVkFMVUUgbXNnX3JiLCBjb25zdCBEZXNjcmlwdG9yKiBkZXNjLAotICAgICAgICAgICAgICAgICAgIHVwYl9zaW5rICpzaW5rLCBpbnQgZGVwdGgpIHsKLSAgTWVzc2FnZUhlYWRlciogbXNnOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLSAgdXBiX3N0YXR1cyBzdGF0dXM7Ci0KLSAgdXBiX3Npbmtfc3RhcnRtc2coc2luayk7Ci0KLSAgLy8gUHJvdGVjdCBhZ2FpbnN0IGN5Y2xlcyAocG9zc2libGUgYmVjYXVzZSB1c2VycyBtYXkgZnJlZWx5IHJlYXNzaWduIG1lc3NhZ2UKLSAgLy8gYW5kIHJlcGVhdGVkIGZpZWxkcykgYnkgaW1wb3NpbmcgYSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC4KLSAgaWYgKGRlcHRoID4gRU5DT0RFX01BWF9ORVNUSU5HKSB7Ci0gICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwKLSAgICAgICAgICAgICAiTWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQgZHVyaW5nIGVuY29kaW5nLiIpOwotICB9Ci0KLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QobXNnX3JiLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBtc2cpOwotCi0gIGZvciAodXBiX21zZ19maWVsZF9iZWdpbigmaSwgZGVzYy0+bXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpKTsKLSAgICBib29sIGlzX21hdGNoaW5nX29uZW9mID0gZmFsc2U7Ci0gICAgdWludDMyX3Qgb2Zmc2V0ID0KLSAgICAgICAgZGVzYy0+bGF5b3V0LT5maWVsZHNbdXBiX2ZpZWxkZGVmX2luZGV4KGYpXS5vZmZzZXQgKwotICAgICAgICBzaXplb2YoTWVzc2FnZUhlYWRlcik7Ci0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSkgewotICAgICAgdWludDMyX3Qgb25lb2ZfY2FzZV9vZmZzZXQgPQotICAgICAgICAgIGRlc2MtPmxheW91dC0+ZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmKV0uY2FzZV9vZmZzZXQgKwotICAgICAgICAgIHNpemVvZihNZXNzYWdlSGVhZGVyKTsKLSAgICAgIC8vIEZvciBhIG9uZW9mLCBjaGVjayB0aGF0IHRoaXMgZmllbGQgaXMgYWN0dWFsbHkgcHJlc2VudCAtLSBza2lwIGFsbCB0aGUKLSAgICAgIC8vIGJlbG93IGlmIG5vdC4KLSAgICAgIGlmIChERVJFRihtc2csIG9uZW9mX2Nhc2Vfb2Zmc2V0LCB1aW50MzJfdCkgIT0KLSAgICAgICAgICB1cGJfZmllbGRkZWZfbnVtYmVyKGYpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgLy8gT3RoZXJ3aXNlLCBmYWxsIHRocm91Z2ggdG8gdGhlIGFwcHJvcHJpYXRlIHNpbmd1bGFyLWZpZWxkIGhhbmRsZXIKLSAgICAgIC8vIGJlbG93LgotICAgICAgaXNfbWF0Y2hpbmdfb25lb2YgPSB0cnVlOwotICAgIH0KLQotICAgIGlmIChpc19tYXBfZmllbGQoZikpIHsKLSAgICAgIFZBTFVFIG1hcCA9IERFUkVGKG1zZywgb2Zmc2V0LCBWQUxVRSk7Ci0gICAgICBpZiAobWFwICE9IFFuaWwpIHsKLSAgICAgICAgcHV0bWFwKG1hcCwgZiwgc2luaywgZGVwdGgpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgICBWQUxVRSBhcnkgPSBERVJFRihtc2csIG9mZnNldCwgVkFMVUUpOwotICAgICAgaWYgKGFyeSAhPSBRbmlsKSB7Ci0gICAgICAgIHB1dGFyeShhcnksIGYsIHNpbmssIGRlcHRoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9pc3N0cmluZyhmKSkgewotICAgICAgVkFMVUUgc3RyID0gREVSRUYobXNnLCBvZmZzZXQsIFZBTFVFKTsKLSAgICAgIGlmIChpc19tYXRjaGluZ19vbmVvZiB8fCBSU1RSSU5HX0xFTihzdHIpID4gMCkgewotICAgICAgICBwdXRzdHIoc3RyLCBmLCBzaW5rKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgewotICAgICAgcHV0c3VibXNnKERFUkVGKG1zZywgb2Zmc2V0LCBWQUxVRSksIGYsIHNpbmssIGRlcHRoKTsKLSAgICB9IGVsc2UgewotICAgICAgdXBiX3NlbGVjdG9yX3Qgc2VsID0gZ2V0c2VsKGYsIHVwYl9oYW5kbGVyc19nZXRwcmltaXRpdmVoYW5kbGVydHlwZShmKSk7Ci0KLSNkZWZpbmUgVCh1cGJ0eXBlY29uc3QsIHVwYnR5cGUsIGN0eXBlLCBkZWZhdWx0X3ZhbHVlKSAgICAgICAgICAgICAgICBcCi0gIGNhc2UgdXBidHlwZWNvbnN0OiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY3R5cGUgdmFsdWUgPSBERVJFRihtc2csIG9mZnNldCwgY3R5cGUpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGlmIChpc19tYXRjaGluZ19vbmVvZiB8fCB2YWx1ZSAhPSBkZWZhdWx0X3ZhbHVlKSB7ICAgICAgICAgICAgICBcCi0gICAgICAgIHVwYl9zaW5rX3B1dCMjdXBidHlwZShzaW5rLCBzZWwsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYnJlYWs7Ci0KLSAgICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLSAgICAgICAgVChVUEJfVFlQRV9GTE9BVCwgIGZsb2F0LCAgZmxvYXQsIDAuMCkKLSAgICAgICAgVChVUEJfVFlQRV9ET1VCTEUsIGRvdWJsZSwgZG91YmxlLCAwLjApCi0gICAgICAgIFQoVVBCX1RZUEVfQk9PTCwgICBib29sLCAgIHVpbnQ4X3QsIDApCi0gICAgICAgIGNhc2UgVVBCX1RZUEVfRU5VTToKLSAgICAgICAgVChVUEJfVFlQRV9JTlQzMiwgIGludDMyLCAgaW50MzJfdCwgMCkKLSAgICAgICAgVChVUEJfVFlQRV9VSU5UMzIsIHVpbnQzMiwgdWludDMyX3QsIDApCi0gICAgICAgIFQoVVBCX1RZUEVfSU5UNjQsICBpbnQ2NCwgIGludDY0X3QsIDApCi0gICAgICAgIFQoVVBCX1RZUEVfVUlOVDY0LCB1aW50NjQsIHVpbnQ2NF90LCAwKQotCi0gICAgICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOgotICAgICAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6IHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJJbnRlcm5hbCBlcnJvci4iKTsKLSAgICAgIH0KLQotI3VuZGVmIFQKLQotICAgIH0KLSAgfQotCi0gIHVwYl9zaW5rX2VuZG1zZyhzaW5rLCAmc3RhdHVzKTsKLX0KLQotc3RhdGljIGNvbnN0IHVwYl9oYW5kbGVycyogbXNnZGVmX3BiX3NlcmlhbGl6ZV9oYW5kbGVycyhEZXNjcmlwdG9yKiBkZXNjKSB7Ci0gIGlmIChkZXNjLT5wYl9zZXJpYWxpemVfaGFuZGxlcnMgPT0gTlVMTCkgewotICAgIGRlc2MtPnBiX3NlcmlhbGl6ZV9oYW5kbGVycyA9Ci0gICAgICAgIHVwYl9wYl9lbmNvZGVyX25ld2hhbmRsZXJzKGRlc2MtPm1zZ2RlZiwgJmRlc2MtPnBiX3NlcmlhbGl6ZV9oYW5kbGVycyk7Ci0gIH0KLSAgcmV0dXJuIGRlc2MtPnBiX3NlcmlhbGl6ZV9oYW5kbGVyczsKLX0KLQotc3RhdGljIGNvbnN0IHVwYl9oYW5kbGVycyogbXNnZGVmX2pzb25fc2VyaWFsaXplX2hhbmRsZXJzKAotICAgIERlc2NyaXB0b3IqIGRlc2MsIGJvb2wgcHJlc2VydmVfcHJvdG9fZmllbGRuYW1lcykgewotICBpZiAocHJlc2VydmVfcHJvdG9fZmllbGRuYW1lcykgewotICAgIGlmIChkZXNjLT5qc29uX3NlcmlhbGl6ZV9oYW5kbGVycyA9PSBOVUxMKSB7Ci0gICAgICBkZXNjLT5qc29uX3NlcmlhbGl6ZV9oYW5kbGVycyA9Ci0gICAgICAgICAgdXBiX2pzb25fcHJpbnRlcl9uZXdoYW5kbGVycygKLSAgICAgICAgICAgICAgZGVzYy0+bXNnZGVmLCB0cnVlLCAmZGVzYy0+anNvbl9zZXJpYWxpemVfaGFuZGxlcnMpOwotICAgIH0KLSAgICByZXR1cm4gZGVzYy0+anNvbl9zZXJpYWxpemVfaGFuZGxlcnM7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGRlc2MtPmpzb25fc2VyaWFsaXplX2hhbmRsZXJzX3ByZXNlcnZlID09IE5VTEwpIHsKLSAgICAgIGRlc2MtPmpzb25fc2VyaWFsaXplX2hhbmRsZXJzX3ByZXNlcnZlID0KLSAgICAgICAgICB1cGJfanNvbl9wcmludGVyX25ld2hhbmRsZXJzKAotICAgICAgICAgICAgICBkZXNjLT5tc2dkZWYsIGZhbHNlLCAmZGVzYy0+anNvbl9zZXJpYWxpemVfaGFuZGxlcnNfcHJlc2VydmUpOwotICAgIH0KLSAgICByZXR1cm4gZGVzYy0+anNvbl9zZXJpYWxpemVfaGFuZGxlcnNfcHJlc2VydmU7Ci0gIH0KLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1lc3NhZ2VDbGFzcy5lbmNvZGUobXNnKSA9PiBieXRlcwotICoKLSAqIEVuY29kZXMgdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0IHRvIGl0cyBzZXJpYWxpemVkIGZvcm0gaW4gcHJvdG9jb2wgYnVmZmVycwotICogd2lyZSBmb3JtYXQuCi0gKi8KLVZBTFVFIE1lc3NhZ2VfZW5jb2RlKFZBTFVFIGtsYXNzLCBWQUxVRSBtc2dfcmIpIHsKLSAgVkFMVUUgZGVzY3JpcHRvciA9IHJiX2l2YXJfZ2V0KGtsYXNzLCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkKTsKLSAgRGVzY3JpcHRvciogZGVzYyA9IHJ1YnlfdG9fRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLQotICBzdHJpbmdzaW5rIHNpbms7Ci0gIHN0cmluZ3NpbmtfaW5pdCgmc2luayk7Ci0KLSAgewotICAgIGNvbnN0IHVwYl9oYW5kbGVycyogc2VyaWFsaXplX2hhbmRsZXJzID0KLSAgICAgICAgbXNnZGVmX3BiX3NlcmlhbGl6ZV9oYW5kbGVycyhkZXNjKTsKLQotICAgIHN0YWNrZW52IHNlOwotICAgIHVwYl9wYl9lbmNvZGVyKiBlbmNvZGVyOwotICAgIFZBTFVFIHJldDsKLQotICAgIHN0YWNrZW52X2luaXQoJnNlLCAiRXJyb3Igb2NjdXJyZWQgZHVyaW5nIGVuY29kaW5nOiAlcyIpOwotICAgIGVuY29kZXIgPSB1cGJfcGJfZW5jb2Rlcl9jcmVhdGUoJnNlLmVudiwgc2VyaWFsaXplX2hhbmRsZXJzLCAmc2luay5zaW5rKTsKLQotICAgIHB1dG1zZyhtc2dfcmIsIGRlc2MsIHVwYl9wYl9lbmNvZGVyX2lucHV0KGVuY29kZXIpLCAwKTsKLQotICAgIHJldCA9IHJiX3N0cl9uZXcoc2luay5wdHIsIHNpbmsubGVuKTsKLQotICAgIHN0YWNrZW52X3VuaW5pdCgmc2UpOwotICAgIHN0cmluZ3NpbmtfdW5pbml0KCZzaW5rKTsKLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1lc3NhZ2VDbGFzcy5lbmNvZGVfanNvbihtc2cpID0+IGpzb25fc3RyaW5nCi0gKgotICogRW5jb2RlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QgaW50byBpdHMgc2VyaWFsaXplZCBKU09OIHJlcHJlc2VudGF0aW9uLgotICovCi1WQUxVRSBNZXNzYWdlX2VuY29kZV9qc29uKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUga2xhc3MpIHsKLSAgVkFMVUUgZGVzY3JpcHRvciA9IHJiX2l2YXJfZ2V0KGtsYXNzLCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkKTsKLSAgRGVzY3JpcHRvciogZGVzYyA9IHJ1YnlfdG9fRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgVkFMVUUgbXNnX3JiOwotICBWQUxVRSBwcmVzZXJ2ZV9wcm90b19maWVsZG5hbWVzID0gUWZhbHNlOwotICBzdHJpbmdzaW5rIHNpbms7Ci0KLSAgaWYgKGFyZ2MgPCAxIHx8IGFyZ2MgPiAyKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgMSBvciAyIGFyZ3VtZW50cy4iKTsKLSAgfQotCi0gIG1zZ19yYiA9IGFyZ3ZbMF07Ci0KLSAgaWYgKGFyZ2MgPT0gMikgewotICAgIFZBTFVFIGhhc2hfYXJncyA9IGFyZ3ZbMV07Ci0gICAgaWYgKFRZUEUoaGFzaF9hcmdzKSAhPSBUX0hBU0gpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkV4cGVjdGVkIGhhc2ggYXJndW1lbnRzLiIpOwotICAgIH0KLSAgICBwcmVzZXJ2ZV9wcm90b19maWVsZG5hbWVzID0gcmJfaGFzaF9sb29rdXAyKAotICAgICAgICBoYXNoX2FyZ3MsIElEMlNZTShyYl9pbnRlcm4oInByZXNlcnZlX3Byb3RvX2ZpZWxkbmFtZXMiKSksIFFmYWxzZSk7Ci0gIH0KLQotICBzdHJpbmdzaW5rX2luaXQoJnNpbmspOwotCi0gIHsKLSAgICBjb25zdCB1cGJfaGFuZGxlcnMqIHNlcmlhbGl6ZV9oYW5kbGVycyA9Ci0gICAgICAgIG1zZ2RlZl9qc29uX3NlcmlhbGl6ZV9oYW5kbGVycyhkZXNjLCBSVEVTVChwcmVzZXJ2ZV9wcm90b19maWVsZG5hbWVzKSk7Ci0gICAgdXBiX2pzb25fcHJpbnRlciogcHJpbnRlcjsKLSAgICBzdGFja2VudiBzZTsKLSAgICBWQUxVRSByZXQ7Ci0KLSAgICBzdGFja2Vudl9pbml0KCZzZSwgIkVycm9yIG9jY3VycmVkIGR1cmluZyBlbmNvZGluZzogJXMiKTsKLSAgICBwcmludGVyID0gdXBiX2pzb25fcHJpbnRlcl9jcmVhdGUoJnNlLmVudiwgc2VyaWFsaXplX2hhbmRsZXJzLCAmc2luay5zaW5rKTsKLQotICAgIHB1dG1zZyhtc2dfcmIsIGRlc2MsIHVwYl9qc29uX3ByaW50ZXJfaW5wdXQocHJpbnRlciksIDApOwotCi0gICAgcmV0ID0gcmJfZW5jX3N0cl9uZXcoc2luay5wdHIsIHNpbmsubGVuLCByYl91dGY4X2VuY29kaW5nKCkpOwotCi0gICAgc3RhY2tlbnZfdW5pbml0KCZzZSk7Ci0gICAgc3RyaW5nc2lua191bmluaXQoJnNpbmspOwotCi0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9leHRjb25mLnJiIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvZXh0Y29uZi5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjM2OGRjYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9leHRjb25mLnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTAgKzAsMCBAQAotIyEvdXNyL2Jpbi9ydWJ5Ci0KLXJlcXVpcmUgJ21rbWYnCi0KLSRDRkxBR1MgKz0gIiAtc3RkPWM5OSAtTzMgLUROREVCVUciCi0KLSRvYmpzID0gWyJwcm90b2J1Zi5vIiwgImRlZnMubyIsICJzdG9yYWdlLm8iLCAibWVzc2FnZS5vIiwKLSAgICAgICAgICJyZXBlYXRlZF9maWVsZC5vIiwgIm1hcC5vIiwgImVuY29kZV9kZWNvZGUubyIsICJ1cGIubyJdCi0KLWNyZWF0ZV9tYWtlZmlsZSgiZ29vZ2xlL3Byb3RvYnVmX2MiKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvbWFwLmMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9tYXAuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJmYzcyOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9tYXAuYworKysgL2Rldi9udWxsCkBAIC0xLDgwOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2luY2x1ZGUgInByb3RvYnVmLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCYXNpYyBtYXAgb3BlcmF0aW9ucyBvbiB0b3Agb2YgdXBiJ3Mgc3RydGFibGUuCi0vLwotLy8gTm90ZSB0aGF0IHdlIHJvbGwgb3VyIG93biBgTWFwYCBjb250YWluZXIgaGVyZSBiZWNhdXNlLCBhcyBmb3IKLS8vIGBSZXBlYXRlZEZpZWxkYCwgd2Ugd2FudCBhIHN0cm9uZ2x5LXR5cGVkIGNvbnRhaW5lci4gVGhpcyBpcyBzbyB0aGF0IGFueSB1c2VyCi0vLyBlcnJvcnMgZHVlIHRvIGluY29ycmVjdCBtYXAga2V5IG9yIHZhbHVlIHR5cGVzIGFyZSByYWlzZWQgYXMgY2xvc2UgYXMKLS8vIHBvc3NpYmxlIHRvIHRoZSBlcnJvciBzaXRlLCByYXRoZXIgdGhhbiBhdCBzb21lIGRlZmVycmVkIHBvaW50IChlLmcuLAotLy8gc2VyaWFsaXphdGlvbikuCi0vLwotLy8gV2UgYnVpbGQgb3VyIGBNYXBgIG9uIHRvcCBvZiB1cGJfc3RydGFibGUgc28gdGhhdCB3ZSdyZSBhYmxlIHRvIHRha2UKLS8vIGFkdmFudGFnZSBvZiB0aGUgbmF0aXZlX3Nsb3Qgc3RvcmFnZSBhYnN0cmFjdGlvbiwgYXMgUmVwZWF0ZWRGaWVsZCBkb2VzLgotLy8gKFRoaXMgaXMgbm90IHF1aXRlIGEgcGVyZmVjdCBtYXBwaW5nIC0tIHNlZSB0aGUga2V5IGNvbnZlcnNpb25zIGJlbG93IC0tIGJ1dAotLy8gZ2l2ZXMgdXMgZnVsbCBzdXBwb3J0IGFuZCBlcnJvci1jaGVja2luZyBmb3IgYWxsIHZhbHVlIHR5cGVzIGZvciBmcmVlLikKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE1hcCB2YWx1ZXMgYXJlIHN0b3JlZCB1c2luZyB0aGUgbmF0aXZlX3Nsb3QgYWJzdHJhY3Rpb24gKGFzIHdpdGggcmVwZWF0ZWQKLS8vIGZpZWxkIHZhbHVlcyksIGJ1dCBrZXlzIGFyZSBhIGJpdCBzcGVjaWFsLiBTaW5jZSB3ZSB1c2UgYSBzdHJ0YWJsZSwgd2UgbmVlZAotLy8gdG8gc3RvcmUga2V5cyBhcyBzZXF1ZW5jZXMgb2YgYnl0ZXMgc3VjaCB0aGF0IGVxdWFsaXR5IG9mIHRob3NlIGJ5dGVzIG1hcHMKLS8vIG9uZS10by1vbmUgdG8gZXF1YWxpdHkgb2Yga2V5cy4gV2Ugc3RvcmUgc3RyaW5ncyBkaXJlY3RseSAoaS5lLiwgdGhleSBtYXAgdG8KLS8vIHRoZWlyIG93biBieXRlcykgYW5kIGludGVnZXJzIGFzIG5hdGl2ZSBpbnRlZ2VycyAodXNpbmcgdGhlIG5hdGl2ZV9zbG90Ci0vLyBhYnN0cmFjdGlvbikuCi0KLS8vIE5vdGUgdGhhdCB0aGVyZSBpcyBhbm90aGVyIHRyYWRlb2ZmIGhlcmUgaW4ga2VlcGluZyBzdHJpbmcga2V5cyBhcyBuYXRpdmUKLS8vIHN0cmluZ3MgcmF0aGVyIHRoYW4gUnVieSBzdHJpbmdzOiB0cmF2ZXJzaW5nIHRoZSBNYXAgcmVxdWlyZXMgY29udmVyc2lvbiB0bwotLy8gUnVieSBzdHJpbmcgdmFsdWVzIG9uIGV2ZXJ5IHRyYXZlcnNhbCwgcG90ZW50aWFsbHkgY3JlYXRpbmcgbW9yZSBnYXJiYWdlLiBXZQotLy8gc2hvdWxkIGNvbnNpZGVyIHdheXMgdG8gY2FjaGUgYSBSdWJ5IHZlcnNpb24gb2YgdGhlIGtleSBpZiB0aGlzIGJlY29tZXMgYW4KLS8vIGlzc3VlIGxhdGVyLgotCi0vLyBGb3JtcyBhIGtleSB0byB1c2Ugd2l0aCB0aGUgdW5kZXJseWluZyBzdHJ0YWJsZSBmcm9tIGEgUnVieSBrZXkgdmFsdWUuIHxidWZ8Ci0vLyBtdXN0IHBvaW50IHRvIFRBQkxFX0tFWV9CVUZfTEVOR1RIIGJ5dGVzIG9mIHRlbXBvcmFyeSBzcGFjZSwgdXNlZCB0bwotLy8gY29uc3RydWN0IGEga2V5IGJ5dGUgc2VxdWVuY2UgaWYgbmVlZGVkLiB8b3V0X2tleXwgYW5kIHxvdXRfbGVuZ3RofCBwcm92aWRlCi0vLyB0aGUgcmVzdWx0aW5nIGtleSBkYXRhL2xlbmd0aC4KLSNkZWZpbmUgVEFCTEVfS0VZX0JVRl9MRU5HVEggOCAgLy8gc2l6ZW9mKHVpbnQ2NF90KQotc3RhdGljIHZvaWQgdGFibGVfa2V5KE1hcCogc2VsZiwgVkFMVUUga2V5LAotICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiogb3V0X2tleSwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QqIG91dF9sZW5ndGgpIHsKLSAgc3dpdGNoIChzZWxmLT5rZXlfdHlwZSkgewotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6Ci0gICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgICAvLyBTdHJpbmdzOiB1c2Ugc3RyaW5nIGNvbnRlbnQgZGlyZWN0bHkuCi0gICAgICBDaGVja19UeXBlKGtleSwgVF9TVFJJTkcpOwotICAgICAgbmF0aXZlX3Nsb3RfdmFsaWRhdGVfc3RyaW5nX2VuY29kaW5nKHNlbGYtPmtleV90eXBlLCBrZXkpOwotICAgICAgKm91dF9rZXkgPSBSU1RSSU5HX1BUUihrZXkpOwotICAgICAgKm91dF9sZW5ndGggPSBSU1RSSU5HX0xFTihrZXkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIFVQQl9UWVBFX0JPT0w6Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDY0OgotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgbmF0aXZlX3Nsb3Rfc2V0KHNlbGYtPmtleV90eXBlLCBRbmlsLCBidWYsIGtleSk7Ci0gICAgICAqb3V0X2tleSA9IGJ1ZjsKLSAgICAgICpvdXRfbGVuZ3RoID0gbmF0aXZlX3Nsb3Rfc2l6ZShzZWxmLT5rZXlfdHlwZSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICAvLyBNYXAgY29uc3RydWN0b3Igc2hvdWxkIG5vdCBhbGxvdyBhIE1hcCB3aXRoIGFub3RoZXIga2V5IHR5cGUgdG8gYmUKLSAgICAgIC8vIGNvbnN0cnVjdGVkLgotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXN0YXRpYyBWQUxVRSB0YWJsZV9rZXlfdG9fcnVieShNYXAqIHNlbGYsIGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbmd0aCkgewotICBzd2l0Y2ggKHNlbGYtPmtleV90eXBlKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzoKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzogewotICAgICAgVkFMVUUgcmV0ID0gcmJfc3RyX25ldyhidWYsIGxlbmd0aCk7Ci0gICAgICByYl9lbmNfYXNzb2NpYXRlKHJldCwKLSAgICAgICAgICAgICAgICAgICAgICAgKHNlbGYtPmtleV90eXBlID09IFVQQl9UWVBFX0JZVEVTKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgIGtSdWJ5U3RyaW5nOGJpdEVuY29kaW5nIDoga1J1YnlTdHJpbmdVdGY4RW5jb2RpbmcpOwotICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBjYXNlIFVQQl9UWVBFX0JPT0w6Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDY0OgotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgcmV0dXJuIG5hdGl2ZV9zbG90X2dldChzZWxmLT5rZXlfdHlwZSwgUW5pbCwgYnVmKTsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgcmV0dXJuIFFuaWw7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQqIHZhbHVlX21lbW9yeSh1cGJfdmFsdWUqIHYpIHsKLSAgcmV0dXJuICh2b2lkKikoJnYtPnZhbCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNYXAgY29udGFpbmVyIHR5cGUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCByYl9kYXRhX3R5cGVfdCBNYXBfdHlwZSA9IHsKLSAgIkdvb2dsZTo6UHJvdG9idWY6Ok1hcCIsCi0gIHsgTWFwX21hcmssIE1hcF9mcmVlLCBOVUxMIH0sCi19OwotCi1WQUxVRSBjTWFwOwotCi1NYXAqIHJ1YnlfdG9fTWFwKFZBTFVFIF9zZWxmKSB7Ci0gIE1hcCogc2VsZjsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QoX3NlbGYsIE1hcCwgJk1hcF90eXBlLCBzZWxmKTsKLSAgcmV0dXJuIHNlbGY7Ci19Ci0KLXZvaWQgTWFwX21hcmsodm9pZCogX3NlbGYpIHsKLSAgTWFwKiBzZWxmID0gX3NlbGY7Ci0KLSAgcmJfZ2NfbWFyayhzZWxmLT52YWx1ZV90eXBlX2NsYXNzKTsKLQotICBpZiAoc2VsZi0+dmFsdWVfdHlwZSA9PSBVUEJfVFlQRV9TVFJJTkcgfHwKLSAgICAgIHNlbGYtPnZhbHVlX3R5cGUgPT0gVVBCX1RZUEVfQllURVMgfHwKLSAgICAgIHNlbGYtPnZhbHVlX3R5cGUgPT0gVVBCX1RZUEVfTUVTU0FHRSkgewotICAgIHVwYl9zdHJ0YWJsZV9pdGVyIGl0OwotICAgIGZvciAodXBiX3N0cnRhYmxlX2JlZ2luKCZpdCwgJnNlbGYtPnRhYmxlKTsKLSAgICAgICAgICF1cGJfc3RydGFibGVfZG9uZSgmaXQpOwotICAgICAgICAgdXBiX3N0cnRhYmxlX25leHQoJml0KSkgewotICAgICAgdXBiX3ZhbHVlIHYgPSB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXQpOwotICAgICAgdm9pZCogbWVtID0gdmFsdWVfbWVtb3J5KCZ2KTsKLSAgICAgIG5hdGl2ZV9zbG90X21hcmsoc2VsZi0+dmFsdWVfdHlwZSwgbWVtKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBNYXBfZnJlZSh2b2lkKiBfc2VsZikgewotICBNYXAqIHNlbGYgPSBfc2VsZjsKLSAgdXBiX3N0cnRhYmxlX3VuaW5pdCgmc2VsZi0+dGFibGUpOwotICB4ZnJlZShzZWxmKTsKLX0KLQotVkFMVUUgTWFwX2FsbG9jKFZBTFVFIGtsYXNzKSB7Ci0gIE1hcCogc2VsZiA9IEFMTE9DKE1hcCk7Ci0gIG1lbXNldChzZWxmLCAwLCBzaXplb2YoTWFwKSk7Ci0gIHNlbGYtPnZhbHVlX3R5cGVfY2xhc3MgPSBRbmlsOwotICByZXR1cm4gVHlwZWREYXRhX1dyYXBfU3RydWN0KGtsYXNzLCAmTWFwX3R5cGUsIHNlbGYpOwotfQotCi1zdGF0aWMgYm9vbCBuZWVkc190eXBlY2xhc3ModXBiX2ZpZWxkdHlwZV90IHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOgotICAgIGNhc2UgVVBCX1RZUEVfRU5VTToKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGRlZmF1bHQ6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1hcC5uZXcoa2V5X3R5cGUsIHZhbHVlX3R5cGUsIHZhbHVlX3R5cGVjbGFzcyA9IG5pbCwgaW5pdF9oYXNobWFwID0ge30pCi0gKiAgICAgPT4gbmV3IG1hcAotICoKLSAqIEFsbG9jYXRlcyBhIG5ldyBNYXAgY29udGFpbmVyLiBUaGlzIGNvbnN0cnVjdG9yIG1heSBiZSBjYWxsZWQgd2l0aCAyLCAzLCBvciA0Ci0gKiBhcmd1bWVudHMuIFRoZSBmaXJzdCB0d28gYXJndW1lbnRzIGFyZSBhbHdheXMgcHJlc2VudCBhbmQgYXJlIHN5bWJvbHMgKHRha2luZwotICogb24gdGhlIHNhbWUgdmFsdWVzIGFzIGZpZWxkLXR5cGUgc3ltYm9scyBpbiBtZXNzYWdlIGRlc2NyaXB0b3JzKSB0aGF0Ci0gKiBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgbWFwIGtleSBhbmQgdmFsdWUgZmllbGRzLgotICoKLSAqIFRoZSBzdXBwb3J0ZWQga2V5IHR5cGVzIGFyZTogOmludDMyLCA6aW50NjQsIDp1aW50MzIsIDp1aW50NjQsIDpib29sLAotICogOnN0cmluZywgOmJ5dGVzLgotICoKLSAqIFRoZSBzdXBwb3J0ZWQgdmFsdWUgdHlwZXMgYXJlOiA6aW50MzIsIDppbnQ2NCwgOnVpbnQzMiwgOnVpbnQ2NCwgOmJvb2wsCi0gKiA6c3RyaW5nLCA6Ynl0ZXMsIDplbnVtLCA6bWVzc2FnZS4KLSAqCi0gKiBUaGUgdGhpcmQgYXJndW1lbnQsIHZhbHVlX3R5cGVjbGFzcywgbXVzdCBiZSBwcmVzZW50IGlmIHZhbHVlX3R5cGUgaXMgOmVudW0KLSAqIG9yIDptZXNzYWdlLiBBcyBpbiBSZXBlYXRlZEZpZWxkI25ldywgdGhpcyBhcmd1bWVudCBtdXN0IGJlIGEgbWVzc2FnZSBjbGFzcwotICogKGZvciA6bWVzc2FnZSkgb3IgZW51bSBtb2R1bGUgKGZvciA6ZW51bSkuCi0gKgotICogVGhlIGxhc3QgYXJndW1lbnQsIGlmIHByZXNlbnQsIHByb3ZpZGVzIGluaXRpYWwgY29udGVudCBmb3IgbWFwLiBOb3RlIHRoYXQKLSAqIHRoaXMgbWF5IGJlIGFuIG9yZGluYXJ5IFJ1YnkgaGFzaG1hcCBvciBhbm90aGVyIE1hcCBpbnN0YW5jZSB3aXRoIGlkZW50aWNhbAotICoga2V5IGFuZCB2YWx1ZSB0eXBlcy4gQWxzbyBub3RlIHRoYXQgdGhpcyBhcmd1bWVudCBtYXkgYmUgcHJlc2VudCB3aGV0aGVyIG9yCi0gKiBub3QgdmFsdWVfdHlwZWNsYXNzIGlzIHByZXNlbnQgKGFuZCBpdCBpcyB1bmFtYmlndW91c2x5IHNlcGFyYXRlIGZyb20KLSAqIHZhbHVlX3R5cGVjbGFzcyBiZWNhdXNlIHZhbHVlX3R5cGVjbGFzcydzIHByZXNlbmNlIGlzIHN0cmljdGx5IGRldGVybWluZWQgYnkKLSAqIHZhbHVlX3R5cGUpLiBUaGUgY29udGVudHMgb2YgdGhpcyBpbml0aWFsIGhhc2htYXAgb3IgTWFwIGluc3RhbmNlIGFyZQotICogc2hhbGxvdy1jb3BpZWQgaW50byB0aGUgbmV3IE1hcDogdGhlIG9yaWdpbmFsIG1hcCBpcyB1bm1vZGlmaWVkLCBidXQKLSAqIHJlZmVyZW5jZXMgdG8gdW5kZXJseWluZyBvYmplY3RzIHdpbGwgYmUgc2hhcmVkIGlmIHRoZSB2YWx1ZSB0eXBlIGlzIGEKLSAqIG1lc3NhZ2UgdHlwZS4KLSAqLwotVkFMVUUgTWFwX2luaXQoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBfc2VsZikgewotICBNYXAqIHNlbGYgPSBydWJ5X3RvX01hcChfc2VsZik7Ci0gIGludCBpbml0X3ZhbHVlX2FyZzsKLQotICAvLyBXZSB0YWtlIGVpdGhlciB0d28gYXJncyAoOmtleV90eXBlLCA6dmFsdWVfdHlwZSksIHRocmVlIGFyZ3MgKDprZXlfdHlwZSwKLSAgLy8gOnZhbHVlX3R5cGUsICJWYWx1ZU1lc3NhZ2VUeXBlIiksIG9yIGZvdXIgYXJncyAodGhlIGFib3ZlIHBsdXMgYW4gaW5pdGlhbAotICAvLyBoYXNobWFwKS4KLSAgaWYgKGFyZ2MgPCAyIHx8IGFyZ2MgPiA0KSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiTWFwIGNvbnN0cnVjdG9yIGV4cGVjdHMgMiwgMyBvciA0IGFyZ3VtZW50cy4iKTsKLSAgfQotCi0gIHNlbGYtPmtleV90eXBlID0gcnVieV90b19maWVsZHR5cGUoYXJndlswXSk7Ci0gIHNlbGYtPnZhbHVlX3R5cGUgPSBydWJ5X3RvX2ZpZWxkdHlwZShhcmd2WzFdKTsKLQotICAvLyBDaGVjayB0aGF0IHRoZSBrZXkgdHlwZSBpcyBhbiBhbGxvd2VkIHR5cGUuCi0gIHN3aXRjaCAoc2VsZi0+a2V5X3R5cGUpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOgotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOgotICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOgotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6Ci0gICAgICAvLyBUaGVzZSBhcmUgT0suCi0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiSW52YWxpZCBrZXkgdHlwZSBmb3IgbWFwLiIpOwotICB9Ci0KLSAgaW5pdF92YWx1ZV9hcmcgPSAyOwotICBpZiAobmVlZHNfdHlwZWNsYXNzKHNlbGYtPnZhbHVlX3R5cGUpICYmIGFyZ2MgPiAyKSB7Ci0gICAgc2VsZi0+dmFsdWVfdHlwZV9jbGFzcyA9IGFyZ3ZbMl07Ci0gICAgdmFsaWRhdGVfdHlwZV9jbGFzcyhzZWxmLT52YWx1ZV90eXBlLCBzZWxmLT52YWx1ZV90eXBlX2NsYXNzKTsKLSAgICBpbml0X3ZhbHVlX2FyZyA9IDM7Ci0gIH0KLQotICAvLyBUYWJsZSB2YWx1ZSB0eXBlIGlzIGFsd2F5cyBVSU5UNjQ6IHRoaXMgZW5zdXJlcyBlbm91Z2ggc3BhY2UgdG8gc3RvcmUgdGhlCi0gIC8vIG5hdGl2ZV9zbG90IHZhbHVlLgotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbml0KCZzZWxmLT50YWJsZSwgVVBCX0NUWVBFX1VJTlQ2NCkpIHsKLSAgICByYl9yYWlzZShyYl9lUnVudGltZUVycm9yLCAiQ291bGQgbm90IGFsbG9jYXRlIHRhYmxlLiIpOwotICB9Ci0KLSAgaWYgKGFyZ2MgPiBpbml0X3ZhbHVlX2FyZykgewotICAgIE1hcF9tZXJnZV9pbnRvX3NlbGYoX3NlbGYsIGFyZ3ZbaW5pdF92YWx1ZV9hcmddKTsKLSAgfQotCi0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWFwLmVhY2goJmJsb2NrKQotICoKLSAqIEludm9rZXMgJmJsb2NrIG9uIGVhY2ggfGtleSwgdmFsdWV8IHBhaXIgaW4gdGhlIG1hcCwgaW4gdW5zcGVjaWZpZWQgb3JkZXIuCi0gKiBOb3RlIHRoYXQgTWFwIGFsc28gaW5jbHVkZXMgRW51bWVyYWJsZTsgbWFwIHRodXMgYWN0cyBsaWtlIGEgbm9ybWFsIFJ1YnkKLSAqIHNlcXVlbmNlLgotICovCi1WQUxVRSBNYXBfZWFjaChWQUxVRSBfc2VsZikgewotICBNYXAqIHNlbGYgPSBydWJ5X3RvX01hcChfc2VsZik7Ci0KLSAgdXBiX3N0cnRhYmxlX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX3N0cnRhYmxlX2JlZ2luKCZpdCwgJnNlbGYtPnRhYmxlKTsKLSAgICAgICAhdXBiX3N0cnRhYmxlX2RvbmUoJml0KTsKLSAgICAgICB1cGJfc3RydGFibGVfbmV4dCgmaXQpKSB7Ci0KLSAgICBWQUxVRSBrZXkgPSB0YWJsZV9rZXlfdG9fcnVieSgKLSAgICAgICAgc2VsZiwgdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KCZpdCksIHVwYl9zdHJ0YWJsZV9pdGVyX2tleWxlbmd0aCgmaXQpKTsKLQotICAgIHVwYl92YWx1ZSB2ID0gdXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoJml0KTsKLSAgICB2b2lkKiBtZW0gPSB2YWx1ZV9tZW1vcnkoJnYpOwotICAgIFZBTFVFIHZhbHVlID0gbmF0aXZlX3Nsb3RfZ2V0KHNlbGYtPnZhbHVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi0+dmFsdWVfdHlwZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW0pOwotCi0gICAgcmJfeWllbGRfdmFsdWVzKDIsIGtleSwgdmFsdWUpOwotICB9Ci0KLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNYXAua2V5cyA9PiBbbGlzdF9vZl9rZXlzXQotICoKLSAqIFJldHVybnMgdGhlIGxpc3Qgb2Yga2V5cyBjb250YWluZWQgaW4gdGhlIG1hcCwgaW4gdW5zcGVjaWZpZWQgb3JkZXIuCi0gKi8KLVZBTFVFIE1hcF9rZXlzKFZBTFVFIF9zZWxmKSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLQotICBWQUxVRSByZXQgPSByYl9hcnlfbmV3KCk7Ci0gIHVwYl9zdHJ0YWJsZV9pdGVyIGl0OwotICBmb3IgKHVwYl9zdHJ0YWJsZV9iZWdpbigmaXQsICZzZWxmLT50YWJsZSk7Ci0gICAgICAgIXVwYl9zdHJ0YWJsZV9kb25lKCZpdCk7Ci0gICAgICAgdXBiX3N0cnRhYmxlX25leHQoJml0KSkgewotCi0gICAgVkFMVUUga2V5ID0gdGFibGVfa2V5X3RvX3J1YnkoCi0gICAgICAgIHNlbGYsIHVwYl9zdHJ0YWJsZV9pdGVyX2tleSgmaXQpLCB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJml0KSk7Ci0KLSAgICByYl9hcnlfcHVzaChyZXQsIGtleSk7Ci0gIH0KLQotICByZXR1cm4gcmV0OwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWFwLnZhbHVlcyA9PiBbbGlzdF9vZl92YWx1ZXNdCi0gKgotICogUmV0dXJucyB0aGUgbGlzdCBvZiB2YWx1ZXMgY29udGFpbmVkIGluIHRoZSBtYXAsIGluIHVuc3BlY2lmaWVkIG9yZGVyLgotICovCi1WQUxVRSBNYXBfdmFsdWVzKFZBTFVFIF9zZWxmKSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLQotICBWQUxVRSByZXQgPSByYl9hcnlfbmV3KCk7Ci0gIHVwYl9zdHJ0YWJsZV9pdGVyIGl0OwotICBmb3IgKHVwYl9zdHJ0YWJsZV9iZWdpbigmaXQsICZzZWxmLT50YWJsZSk7Ci0gICAgICAgIXVwYl9zdHJ0YWJsZV9kb25lKCZpdCk7Ci0gICAgICAgdXBiX3N0cnRhYmxlX25leHQoJml0KSkgewotCi0gICAgdXBiX3ZhbHVlIHYgPSB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXQpOwotICAgIHZvaWQqIG1lbSA9IHZhbHVlX21lbW9yeSgmdik7Ci0gICAgVkFMVUUgdmFsdWUgPSBuYXRpdmVfc2xvdF9nZXQoc2VsZi0+dmFsdWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZWxmLT52YWx1ZV90eXBlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbSk7Ci0KLSAgICByYl9hcnlfcHVzaChyZXQsIHZhbHVlKTsKLSAgfQotCi0gIHJldHVybiByZXQ7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNYXAuW10oa2V5KSA9PiB2YWx1ZQotICoKLSAqIEFjY2Vzc2VzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBrZXkuIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGtleSB0eXBlIGlzCi0gKiBpbmNvcnJlY3QuIFJldHVybnMgbmlsIHdoZW4gdGhlIGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWFwLgotICovCi1WQUxVRSBNYXBfaW5kZXgoVkFMVUUgX3NlbGYsIFZBTFVFIGtleSkgewotICBNYXAqIHNlbGYgPSBydWJ5X3RvX01hcChfc2VsZik7Ci0KLSAgY2hhciBrZXlidWZbVEFCTEVfS0VZX0JVRl9MRU5HVEhdOwotICBjb25zdCBjaGFyKiBrZXl2YWwgPSBOVUxMOwotICBzaXplX3QgbGVuZ3RoID0gMDsKLSAgdXBiX3ZhbHVlIHY7Ci0gIHRhYmxlX2tleShzZWxmLCBrZXksIGtleWJ1ZiwgJmtleXZhbCwgJmxlbmd0aCk7Ci0KLSAgaWYgKHVwYl9zdHJ0YWJsZV9sb29rdXAyKCZzZWxmLT50YWJsZSwga2V5dmFsLCBsZW5ndGgsICZ2KSkgewotICAgIHZvaWQqIG1lbSA9IHZhbHVlX21lbW9yeSgmdik7Ci0gICAgcmV0dXJuIG5hdGl2ZV9zbG90X2dldChzZWxmLT52YWx1ZV90eXBlLCBzZWxmLT52YWx1ZV90eXBlX2NsYXNzLCBtZW0pOwotICB9IGVsc2UgewotICAgIHJldHVybiBRbmlsOwotICB9Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNYXAuW109KGtleSwgdmFsdWUpID0+IHZhbHVlCi0gKgotICogSW5zZXJ0cyBvciBvdmVyd3JpdGVzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGggdGhlIGdpdmVuIG5ldyB2YWx1ZS4KLSAqIFRocm93cyBhbiBleGNlcHRpb24gaWYgdGhlIGtleSB0eXBlIGlzIGluY29ycmVjdC4gUmV0dXJucyB0aGUgbmV3IHZhbHVlIHRoYXQKLSAqIHdhcyBqdXN0IGluc2VydGVkLgotICovCi1WQUxVRSBNYXBfaW5kZXhfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBrZXksIFZBTFVFIHZhbHVlKSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLQotICBjaGFyIGtleWJ1ZltUQUJMRV9LRVlfQlVGX0xFTkdUSF07Ci0gIGNvbnN0IGNoYXIqIGtleXZhbCA9IE5VTEw7Ci0gIHNpemVfdCBsZW5ndGggPSAwOwotICB1cGJfdmFsdWUgdjsKLSAgdm9pZCogbWVtOwotICB0YWJsZV9rZXkoc2VsZiwga2V5LCBrZXlidWYsICZrZXl2YWwsICZsZW5ndGgpOwotCi0gIG1lbSA9IHZhbHVlX21lbW9yeSgmdik7Ci0gIG5hdGl2ZV9zbG90X3NldChzZWxmLT52YWx1ZV90eXBlLCBzZWxmLT52YWx1ZV90eXBlX2NsYXNzLCBtZW0sIHZhbHVlKTsKLQotICAvLyBSZXBsYWNlIGFueSBleGlzdGluZyB2YWx1ZSBieSBpc3N1aW5nIGEgJ3JlbW92ZScgb3BlcmF0aW9uIGZpcnN0LgotICB1cGJfc3RydGFibGVfcmVtb3ZlMigmc2VsZi0+dGFibGUsIGtleXZhbCwgbGVuZ3RoLCBOVUxMKTsKLSAgaWYgKCF1cGJfc3RydGFibGVfaW5zZXJ0Migmc2VsZi0+dGFibGUsIGtleXZhbCwgbGVuZ3RoLCB2KSkgewotICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJDb3VsZCBub3QgaW5zZXJ0IGludG8gdGFibGUiKTsKLSAgfQotCi0gIC8vIFJ1YnkgaGFzaG1hcCdzIDpbXT0gbWV0aG9kIGFsc28gcmV0dXJucyB0aGUgaW5zZXJ0ZWQgdmFsdWUuCi0gIHJldHVybiB2YWx1ZTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1hcC5oYXNfa2V5PyhrZXkpID0+IGJvb2wKLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGtleSBpcyBwcmVzZW50IGluIHRoZSBtYXAuIFRocm93cyBhbiBleGNlcHRpb24gaWYKLSAqIHRoZSBrZXkgaGFzIHRoZSB3cm9uZyB0eXBlLgotICovCi1WQUxVRSBNYXBfaGFzX2tleShWQUxVRSBfc2VsZiwgVkFMVUUga2V5KSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLQotICBjaGFyIGtleWJ1ZltUQUJMRV9LRVlfQlVGX0xFTkdUSF07Ci0gIGNvbnN0IGNoYXIqIGtleXZhbCA9IE5VTEw7Ci0gIHNpemVfdCBsZW5ndGggPSAwOwotICB0YWJsZV9rZXkoc2VsZiwga2V5LCBrZXlidWYsICZrZXl2YWwsICZsZW5ndGgpOwotCi0gIGlmICh1cGJfc3RydGFibGVfbG9va3VwMigmc2VsZi0+dGFibGUsIGtleXZhbCwgbGVuZ3RoLCBOVUxMKSkgewotICAgIHJldHVybiBRdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gUWZhbHNlOwotICB9Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNYXAuZGVsZXRlKGtleSkgPT4gb2xkX3ZhbHVlCi0gKgotICogRGVsZXRlcyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGtleSwgaWYgYW55LCByZXR1cm5pbmcgZWl0aGVyIHRoZSBvbGQgdmFsdWUgb3IKLSAqIG5pbCBpZiBub25lIHdhcyBwcmVzZW50LiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBrZXkgaXMgb2YgdGhlIHdyb25nIHR5cGUuCi0gKi8KLVZBTFVFIE1hcF9kZWxldGUoVkFMVUUgX3NlbGYsIFZBTFVFIGtleSkgewotICBNYXAqIHNlbGYgPSBydWJ5X3RvX01hcChfc2VsZik7Ci0KLSAgY2hhciBrZXlidWZbVEFCTEVfS0VZX0JVRl9MRU5HVEhdOwotICBjb25zdCBjaGFyKiBrZXl2YWwgPSBOVUxMOwotICBzaXplX3QgbGVuZ3RoID0gMDsKLSAgdXBiX3ZhbHVlIHY7Ci0gIHRhYmxlX2tleShzZWxmLCBrZXksIGtleWJ1ZiwgJmtleXZhbCwgJmxlbmd0aCk7Ci0KLSAgaWYgKHVwYl9zdHJ0YWJsZV9yZW1vdmUyKCZzZWxmLT50YWJsZSwga2V5dmFsLCBsZW5ndGgsICZ2KSkgewotICAgIHZvaWQqIG1lbSA9IHZhbHVlX21lbW9yeSgmdik7Ci0gICAgcmV0dXJuIG5hdGl2ZV9zbG90X2dldChzZWxmLT52YWx1ZV90eXBlLCBzZWxmLT52YWx1ZV90eXBlX2NsYXNzLCBtZW0pOwotICB9IGVsc2UgewotICAgIHJldHVybiBRbmlsOwotICB9Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNYXAuY2xlYXIKLSAqCi0gKiBSZW1vdmVzIGFsbCBlbnRyaWVzIGZyb20gdGhlIG1hcC4KLSAqLwotVkFMVUUgTWFwX2NsZWFyKFZBTFVFIF9zZWxmKSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLQotICAvLyBVbmluaXQgYW5kIHJlaW5pdCB0aGUgdGFibGUgLS0gdGhpcyBpcyBmYXN0ZXIgdGhhbiBpdGVyYXRpbmcgYW5kIGRvaW5nIGEKLSAgLy8gZGVsZXRlLWxvb2t1cCBvbiBlYWNoIGtleS4KLSAgdXBiX3N0cnRhYmxlX3VuaW5pdCgmc2VsZi0+dGFibGUpOwotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbml0KCZzZWxmLT50YWJsZSwgVVBCX0NUWVBFX0lOVDY0KSkgewotICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJVbmFibGUgdG8gcmUtaW5pdGlhbGl6ZSB0YWJsZSIpOwotICB9Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWFwLmxlbmd0aAotICoKLSAqIFJldHVybnMgdGhlIG51bWJlciBvZiBlbnRyaWVzIChrZXktdmFsdWUgcGFpcnMpIGluIHRoZSBtYXAuCi0gKi8KLVZBTFVFIE1hcF9sZW5ndGgoVkFMVUUgX3NlbGYpIHsKLSAgTWFwKiBzZWxmID0gcnVieV90b19NYXAoX3NlbGYpOwotICByZXR1cm4gVUxMMk5VTSh1cGJfc3RydGFibGVfY291bnQoJnNlbGYtPnRhYmxlKSk7Ci19Ci0KLXN0YXRpYyBWQUxVRSBNYXBfbmV3X3RoaXNfdHlwZShWQUxVRSBfc2VsZikgewotICBNYXAqIHNlbGYgPSBydWJ5X3RvX01hcChfc2VsZik7Ci0gIFZBTFVFIG5ld19tYXAgPSBRbmlsOwotICBWQUxVRSBrZXlfdHlwZSA9IGZpZWxkdHlwZV90b19ydWJ5KHNlbGYtPmtleV90eXBlKTsKLSAgVkFMVUUgdmFsdWVfdHlwZSA9IGZpZWxkdHlwZV90b19ydWJ5KHNlbGYtPnZhbHVlX3R5cGUpOwotICBpZiAoc2VsZi0+dmFsdWVfdHlwZV9jbGFzcyAhPSBRbmlsKSB7Ci0gICAgbmV3X21hcCA9IHJiX2Z1bmNhbGwoQ0xBU1NfT0YoX3NlbGYpLCByYl9pbnRlcm4oIm5ldyIpLCAzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGtleV90eXBlLCB2YWx1ZV90eXBlLCBzZWxmLT52YWx1ZV90eXBlX2NsYXNzKTsKLSAgfSBlbHNlIHsKLSAgICBuZXdfbWFwID0gcmJfZnVuY2FsbChDTEFTU19PRihfc2VsZiksIHJiX2ludGVybigibmV3IiksIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAga2V5X3R5cGUsIHZhbHVlX3R5cGUpOwotICB9Ci0gIHJldHVybiBuZXdfbWFwOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWFwLmR1cCA9PiBuZXdfbWFwCi0gKgotICogRHVwbGljYXRlcyB0aGlzIG1hcCB3aXRoIGEgc2hhbGxvdyBjb3B5LiBSZWZlcmVuY2VzIHRvIGFsbCBub24tcHJpbWl0aXZlCi0gKiBlbGVtZW50IG9iamVjdHMgKGUuZy4sIHN1Ym1lc3NhZ2VzKSBhcmUgc2hhcmVkLgotICovCi1WQUxVRSBNYXBfZHVwKFZBTFVFIF9zZWxmKSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLSAgVkFMVUUgbmV3X21hcCA9IE1hcF9uZXdfdGhpc190eXBlKF9zZWxmKTsKLSAgTWFwKiBuZXdfc2VsZiA9IHJ1YnlfdG9fTWFwKG5ld19tYXApOwotCi0gIHVwYl9zdHJ0YWJsZV9pdGVyIGl0OwotICBmb3IgKHVwYl9zdHJ0YWJsZV9iZWdpbigmaXQsICZzZWxmLT50YWJsZSk7Ci0gICAgICAgIXVwYl9zdHJ0YWJsZV9kb25lKCZpdCk7Ci0gICAgICAgdXBiX3N0cnRhYmxlX25leHQoJml0KSkgewotCi0gICAgdXBiX3ZhbHVlIHYgPSB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXQpOwotICAgIHZvaWQqIG1lbSA9IHZhbHVlX21lbW9yeSgmdik7Ci0gICAgdXBiX3ZhbHVlIGR1cDsKLSAgICB2b2lkKiBkdXBfbWVtID0gdmFsdWVfbWVtb3J5KCZkdXApOwotICAgIG5hdGl2ZV9zbG90X2R1cChzZWxmLT52YWx1ZV90eXBlLCBkdXBfbWVtLCBtZW0pOwotCi0gICAgaWYgKCF1cGJfc3RydGFibGVfaW5zZXJ0MigmbmV3X3NlbGYtPnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KCZpdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cCkpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJFcnJvciBpbnNlcnRpbmcgdmFsdWUgaW50byBuZXcgdGFibGUiKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbmV3X21hcDsKLX0KLQotLy8gVXNlZCBieSBHb29nbGU6OlByb3RvYnVmLmRlZXBfY29weSBidXQgbm90IGV4cG9zZWQgZGlyZWN0bHkuCi1WQUxVRSBNYXBfZGVlcF9jb3B5KFZBTFVFIF9zZWxmKSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLSAgVkFMVUUgbmV3X21hcCA9IE1hcF9uZXdfdGhpc190eXBlKF9zZWxmKTsKLSAgTWFwKiBuZXdfc2VsZiA9IHJ1YnlfdG9fTWFwKG5ld19tYXApOwotCi0gIHVwYl9zdHJ0YWJsZV9pdGVyIGl0OwotICBmb3IgKHVwYl9zdHJ0YWJsZV9iZWdpbigmaXQsICZzZWxmLT50YWJsZSk7Ci0gICAgICAgIXVwYl9zdHJ0YWJsZV9kb25lKCZpdCk7Ci0gICAgICAgdXBiX3N0cnRhYmxlX25leHQoJml0KSkgewotCi0gICAgdXBiX3ZhbHVlIHYgPSB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXQpOwotICAgIHZvaWQqIG1lbSA9IHZhbHVlX21lbW9yeSgmdik7Ci0gICAgdXBiX3ZhbHVlIGR1cDsKLSAgICB2b2lkKiBkdXBfbWVtID0gdmFsdWVfbWVtb3J5KCZkdXApOwotICAgIG5hdGl2ZV9zbG90X2RlZXBfY29weShzZWxmLT52YWx1ZV90eXBlLCBkdXBfbWVtLCBtZW0pOwotCi0gICAgaWYgKCF1cGJfc3RydGFibGVfaW5zZXJ0MigmbmV3X3NlbGYtPnRhYmxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KCZpdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1cCkpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJFcnJvciBpbnNlcnRpbmcgdmFsdWUgaW50byBuZXcgdGFibGUiKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gbmV3X21hcDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1hcC49PShvdGhlcikgPT4gYm9vbGVhbgotICoKLSAqIENvbXBhcmVzIHRoaXMgbWFwIHRvIGFub3RoZXIuIE1hcHMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSBpZGVudGljYWwga2V5IHNldHMsCi0gKiBhbmQgZm9yIGVhY2gga2V5LCB0aGUgdmFsdWVzIGluIGJvdGggbWFwcyBjb21wYXJlIGVxdWFsLiBFbGVtZW50cyBhcmUKLSAqIGNvbXBhcmVkIGFzIHBlciBub3JtYWwgUnVieSBzZW1hbnRpY3MsIGJ5IGNhbGxpbmcgdGhlaXIgOj09IG1ldGhvZHMgKG9yCi0gKiBwZXJmb3JtaW5nIGEgbW9yZSBlZmZpY2llbnQgY29tcGFyaXNvbiBmb3IgcHJpbWl0aXZlIHR5cGVzKS4KLSAqCi0gKiBNYXBzIHdpdGggZGlzc2ltaWxhciBrZXkgdHlwZXMgb3IgdmFsdWUgdHlwZXMvdHlwZWNsYXNzZXMgYXJlIG5ldmVyIGVxdWFsLAotICogZXZlbiBpZiB2YWx1ZSBjb21wYXJpc29uIChmb3IgZXhhbXBsZSwgYmV0d2VlbiBpbnRlZ2VycyBhbmQgZmxvYXRzKSB3b3VsZAotICogaGF2ZSBvdGhlcndpc2UgaW5kaWNhdGVkIHRoYXQgZXZlcnkgZWxlbWVudCBoYXMgZXF1YWwgdmFsdWUuCi0gKi8KLVZBTFVFIE1hcF9lcShWQUxVRSBfc2VsZiwgVkFMVUUgX290aGVyKSB7Ci0gIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLSAgTWFwKiBvdGhlcjsKLSAgdXBiX3N0cnRhYmxlX2l0ZXIgaXQ7Ci0KLSAgLy8gQWxsb3cgY29tcGFyaXNvbnMgdG8gUnVieSBoYXNobWFwcyBieSBjb252ZXJ0aW5nIHRvIGEgdGVtcG9yYXJ5IE1hcAotICAvLyBpbnN0YW5jZS4gU2xvdywgYnV0IHdvcmthYmxlLgotICBpZiAoVFlQRShfb3RoZXIpID09IFRfSEFTSCkgewotICAgIFZBTFVFIG90aGVyX21hcCA9IE1hcF9uZXdfdGhpc190eXBlKF9zZWxmKTsKLSAgICBNYXBfbWVyZ2VfaW50b19zZWxmKG90aGVyX21hcCwgX290aGVyKTsKLSAgICBfb3RoZXIgPSBvdGhlcl9tYXA7Ci0gIH0KLQotICBvdGhlciA9IHJ1YnlfdG9fTWFwKF9vdGhlcik7Ci0KLSAgaWYgKHNlbGYgPT0gb3RoZXIpIHsKLSAgICByZXR1cm4gUXRydWU7Ci0gIH0KLSAgaWYgKHNlbGYtPmtleV90eXBlICE9IG90aGVyLT5rZXlfdHlwZSB8fAotICAgICAgc2VsZi0+dmFsdWVfdHlwZSAhPSBvdGhlci0+dmFsdWVfdHlwZSB8fAotICAgICAgc2VsZi0+dmFsdWVfdHlwZV9jbGFzcyAhPSBvdGhlci0+dmFsdWVfdHlwZV9jbGFzcykgewotICAgIHJldHVybiBRZmFsc2U7Ci0gIH0KLSAgaWYgKHVwYl9zdHJ0YWJsZV9jb3VudCgmc2VsZi0+dGFibGUpICE9IHVwYl9zdHJ0YWJsZV9jb3VudCgmb3RoZXItPnRhYmxlKSkgewotICAgIHJldHVybiBRZmFsc2U7Ci0gIH0KLQotICAvLyBGb3IgZWFjaCBtZW1iZXIgb2Ygc2VsZiwgY2hlY2sgdGhhdCBhbiBlcXVhbCBtZW1iZXIgZXhpc3RzIGF0IHRoZSBzYW1lIGtleQotICAvLyBpbiBvdGhlci4KLSAgZm9yICh1cGJfc3RydGFibGVfYmVnaW4oJml0LCAmc2VsZi0+dGFibGUpOwotICAgICAgICF1cGJfc3RydGFibGVfZG9uZSgmaXQpOwotICAgICAgIHVwYl9zdHJ0YWJsZV9uZXh0KCZpdCkpIHsKLQotICAgIHVwYl92YWx1ZSB2ID0gdXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoJml0KTsKLSAgICB2b2lkKiBtZW0gPSB2YWx1ZV9tZW1vcnkoJnYpOwotICAgIHVwYl92YWx1ZSBvdGhlcl92OwotICAgIHZvaWQqIG90aGVyX21lbSA9IHZhbHVlX21lbW9yeSgmb3RoZXJfdik7Ci0KLSAgICBpZiAoIXVwYl9zdHJ0YWJsZV9sb29rdXAyKCZvdGhlci0+dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXkoJml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdHJ0YWJsZV9pdGVyX2tleWxlbmd0aCgmaXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3YpKSB7Ci0gICAgICAvLyBOb3QgcHJlc2VudCBpbiBvdGhlciBtYXAuCi0gICAgICByZXR1cm4gUWZhbHNlOwotICAgIH0KLQotICAgIGlmICghbmF0aXZlX3Nsb3RfZXEoc2VsZi0+dmFsdWVfdHlwZSwgbWVtLCBvdGhlcl9tZW0pKSB7Ci0gICAgICAvLyBQcmVzZW50LCBidXQgdmFsdWUgbm90IGVxdWFsLgotICAgICAgcmV0dXJuIFFmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gUXRydWU7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNYXAuaGFzaCA9PiBoYXNoX3ZhbHVlCi0gKgotICogUmV0dXJucyBhIGhhc2ggdmFsdWUgYmFzZWQgb24gdGhpcyBtYXAncyBjb250ZW50cy4KLSAqLwotVkFMVUUgTWFwX2hhc2goVkFMVUUgX3NlbGYpIHsKLSAgTWFwKiBzZWxmID0gcnVieV90b19NYXAoX3NlbGYpOwotCi0gIHN0X2luZGV4X3QgaCA9IHJiX2hhc2hfc3RhcnQoMCk7Ci0gIFZBTFVFIGhhc2hfc3ltID0gcmJfaW50ZXJuKCJoYXNoIik7Ci0KLSAgdXBiX3N0cnRhYmxlX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX3N0cnRhYmxlX2JlZ2luKCZpdCwgJnNlbGYtPnRhYmxlKTsKLSAgICAgICAhdXBiX3N0cnRhYmxlX2RvbmUoJml0KTsKLSAgICAgICB1cGJfc3RydGFibGVfbmV4dCgmaXQpKSB7Ci0gICAgVkFMVUUga2V5ID0gdGFibGVfa2V5X3RvX3J1YnkoCi0gICAgICAgIHNlbGYsIHVwYl9zdHJ0YWJsZV9pdGVyX2tleSgmaXQpLCB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJml0KSk7Ci0KLSAgICB1cGJfdmFsdWUgdiA9IHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKCZpdCk7Ci0gICAgdm9pZCogbWVtID0gdmFsdWVfbWVtb3J5KCZ2KTsKLSAgICBWQUxVRSB2YWx1ZSA9IG5hdGl2ZV9zbG90X2dldChzZWxmLT52YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnZhbHVlX3R5cGVfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtKTsKLQotICAgIGggPSByYl9oYXNoX3VpbnQoaCwgTlVNMkxPTkcocmJfZnVuY2FsbChrZXksIGhhc2hfc3ltLCAwKSkpOwotICAgIGggPSByYl9oYXNoX3VpbnQoaCwgTlVNMkxPTkcocmJfZnVuY2FsbCh2YWx1ZSwgaGFzaF9zeW0sIDApKSk7Ci0gIH0KLQotICByZXR1cm4gSU5UMkZJWChoKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1hcC5pbnNwZWN0ID0+IHN0cmluZwotICoKLSAqIFJldHVybnMgYSBzdHJpbmcgcmVwcmVzZW50aW5nIHRoaXMgbWFwJ3MgZWxlbWVudHMuIEl0IHdpbGwgYmUgZm9ybWF0dGVkIGFzCi0gKiAie2tleSA9PiB2YWx1ZSwga2V5ID0+IHZhbHVlLCAuLi59Iiwgd2l0aCBlYWNoIGtleSBhbmQgdmFsdWUgc3RyaW5nCi0gKiByZXByZXNlbnRhdGlvbiBjb21wdXRlZCBieSBpdHMgb3duICNpbnNwZWN0IG1ldGhvZC4KLSAqLwotVkFMVUUgTWFwX2luc3BlY3QoVkFMVUUgX3NlbGYpIHsKLSAgTWFwKiBzZWxmID0gcnVieV90b19NYXAoX3NlbGYpOwotCi0gIFZBTFVFIHN0ciA9IHJiX3N0cl9uZXcyKCJ7Iik7Ci0KLSAgYm9vbCBmaXJzdCA9IHRydWU7Ci0gIFZBTFVFIGluc3BlY3Rfc3ltID0gcmJfaW50ZXJuKCJpbnNwZWN0Iik7Ci0KLSAgdXBiX3N0cnRhYmxlX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX3N0cnRhYmxlX2JlZ2luKCZpdCwgJnNlbGYtPnRhYmxlKTsKLSAgICAgICAhdXBiX3N0cnRhYmxlX2RvbmUoJml0KTsKLSAgICAgICB1cGJfc3RydGFibGVfbmV4dCgmaXQpKSB7Ci0gICAgVkFMVUUga2V5ID0gdGFibGVfa2V5X3RvX3J1YnkoCi0gICAgICAgIHNlbGYsIHVwYl9zdHJ0YWJsZV9pdGVyX2tleSgmaXQpLCB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJml0KSk7Ci0KLSAgICB1cGJfdmFsdWUgdiA9IHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKCZpdCk7Ci0gICAgdm9pZCogbWVtID0gdmFsdWVfbWVtb3J5KCZ2KTsKLSAgICBWQUxVRSB2YWx1ZSA9IG5hdGl2ZV9zbG90X2dldChzZWxmLT52YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlbGYtPnZhbHVlX3R5cGVfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVtKTsKLQotICAgIGlmICghZmlyc3QpIHsKLSAgICAgIHN0ciA9IHJiX3N0cl9jYXQyKHN0ciwgIiwgIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgfQotICAgIHN0ciA9IHJiX3N0cl9hcHBlbmQoc3RyLCByYl9mdW5jYWxsKGtleSwgaW5zcGVjdF9zeW0sIDApKTsKLSAgICBzdHIgPSByYl9zdHJfY2F0MihzdHIsICI9PiIpOwotICAgIHN0ciA9IHJiX3N0cl9hcHBlbmQoc3RyLCByYl9mdW5jYWxsKHZhbHVlLCBpbnNwZWN0X3N5bSwgMCkpOwotICB9Ci0KLSAgc3RyID0gcmJfc3RyX2NhdDIoc3RyLCAifSIpOwotICByZXR1cm4gc3RyOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWFwLm1lcmdlKG90aGVyX21hcCkgPT4gbWFwCi0gKgotICogQ29waWVzIGtleS92YWx1ZSBwYWlycyBmcm9tIG90aGVyX21hcCBpbnRvIGEgY29weSBvZiB0aGlzIG1hcC4gSWYgYSBrZXkgaXMKLSAqIHNldCBpbiBvdGhlcl9tYXAgYW5kIHRoaXMgbWFwLCB0aGUgdmFsdWUgZnJvbSBvdGhlcl9tYXAgb3ZlcndyaXRlcyB0aGUgdmFsdWUKLSAqIGluIHRoZSBuZXcgY29weSBvZiB0aGlzIG1hcC4gUmV0dXJucyB0aGUgbmV3IGNvcHkgb2YgdGhpcyBtYXAgd2l0aCBtZXJnZWQKLSAqIGNvbnRlbnRzLgotICovCi1WQUxVRSBNYXBfbWVyZ2UoVkFMVUUgX3NlbGYsIFZBTFVFIGhhc2htYXApIHsKLSAgVkFMVUUgZHVwcGVkID0gTWFwX2R1cChfc2VsZik7Ci0gIHJldHVybiBNYXBfbWVyZ2VfaW50b19zZWxmKGR1cHBlZCwgaGFzaG1hcCk7Ci19Ci0KLXN0YXRpYyBpbnQgbWVyZ2VfaW50b19zZWxmX2NhbGxiYWNrKFZBTFVFIGtleSwgVkFMVUUgdmFsdWUsIFZBTFVFIHNlbGYpIHsKLSAgTWFwX2luZGV4X3NldChzZWxmLCBrZXksIHZhbHVlKTsKLSAgcmV0dXJuIFNUX0NPTlRJTlVFOwotfQotCi0vLyBVc2VkIG9ubHkgaW50ZXJuYWxseSAtLSBzaGFyZWQgYnkgI21lcmdlIGFuZCAjaW5pdGlhbGl6ZS4KLVZBTFVFIE1hcF9tZXJnZV9pbnRvX3NlbGYoVkFMVUUgX3NlbGYsIFZBTFVFIGhhc2htYXApIHsKLSAgaWYgKFRZUEUoaGFzaG1hcCkgPT0gVF9IQVNIKSB7Ci0gICAgcmJfaGFzaF9mb3JlYWNoKGhhc2htYXAsIG1lcmdlX2ludG9fc2VsZl9jYWxsYmFjaywgX3NlbGYpOwotICB9IGVsc2UgaWYgKFJCX1RZUEVfUChoYXNobWFwLCBUX0RBVEEpICYmIFJUWVBFRERBVEFfUChoYXNobWFwKSAmJgotICAgICAgICAgICAgIFJUWVBFRERBVEFfVFlQRShoYXNobWFwKSA9PSAmTWFwX3R5cGUpIHsKLQotICAgIE1hcCogc2VsZiA9IHJ1YnlfdG9fTWFwKF9zZWxmKTsKLSAgICBNYXAqIG90aGVyID0gcnVieV90b19NYXAoaGFzaG1hcCk7Ci0gICAgdXBiX3N0cnRhYmxlX2l0ZXIgaXQ7Ci0KLSAgICBpZiAoc2VsZi0+a2V5X3R5cGUgIT0gb3RoZXItPmtleV90eXBlIHx8Ci0gICAgICAgIHNlbGYtPnZhbHVlX3R5cGUgIT0gb3RoZXItPnZhbHVlX3R5cGUgfHwKLSAgICAgICAgc2VsZi0+dmFsdWVfdHlwZV9jbGFzcyAhPSBvdGhlci0+dmFsdWVfdHlwZV9jbGFzcykgewotICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiQXR0ZW1wdCB0byBtZXJnZSBNYXAgd2l0aCBtaXNtYXRjaGluZyB0eXBlcyIpOwotICAgIH0KLQotICAgIGZvciAodXBiX3N0cnRhYmxlX2JlZ2luKCZpdCwgJm90aGVyLT50YWJsZSk7Ci0gICAgICAgICAhdXBiX3N0cnRhYmxlX2RvbmUoJml0KTsKLSAgICAgICAgIHVwYl9zdHJ0YWJsZV9uZXh0KCZpdCkpIHsKLQotICAgICAgLy8gUmVwbGFjZSBhbnkgZXhpc3RpbmcgdmFsdWUgYnkgaXNzdWluZyBhICdyZW1vdmUnIG9wZXJhdGlvbiBmaXJzdC4KLSAgICAgIHVwYl92YWx1ZSB2OwotICAgICAgdXBiX3ZhbHVlIG9sZHY7Ci0gICAgICB1cGJfc3RydGFibGVfcmVtb3ZlMigmc2VsZi0+dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXkoJml0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdHJ0YWJsZV9pdGVyX2tleWxlbmd0aCgmaXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9sZHYpOwotCi0gICAgICB2ID0gdXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoJml0KTsKLSAgICAgIHVwYl9zdHJ0YWJsZV9pbnNlcnQyKCZzZWxmLT50YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdHJ0YWJsZV9pdGVyX2tleSgmaXQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0cnRhYmxlX2l0ZXJfa2V5bGVuZ3RoKCZpdCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiVW5rbm93biB0eXBlIG1lcmdpbmcgaW50byBNYXAiKTsKLSAgfQotICByZXR1cm4gX3NlbGY7Ci19Ci0KLS8vIEludGVybmFsIG1ldGhvZDogbWFwIGl0ZXJhdG9yIGluaXRpYWxpemF0aW9uICh1c2VkIGZvciBzZXJpYWxpemF0aW9uKS4KLXZvaWQgTWFwX2JlZ2luKFZBTFVFIF9zZWxmLCBNYXBfaXRlciogaXRlcikgewotICBNYXAqIHNlbGYgPSBydWJ5X3RvX01hcChfc2VsZik7Ci0gIGl0ZXItPnNlbGYgPSBzZWxmOwotICB1cGJfc3RydGFibGVfYmVnaW4oJml0ZXItPml0LCAmc2VsZi0+dGFibGUpOwotfQotCi12b2lkIE1hcF9uZXh0KE1hcF9pdGVyKiBpdGVyKSB7Ci0gIHVwYl9zdHJ0YWJsZV9uZXh0KCZpdGVyLT5pdCk7Ci19Ci0KLWJvb2wgTWFwX2RvbmUoTWFwX2l0ZXIqIGl0ZXIpIHsKLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9kb25lKCZpdGVyLT5pdCk7Ci19Ci0KLVZBTFVFIE1hcF9pdGVyX2tleShNYXBfaXRlciogaXRlcikgewotICByZXR1cm4gdGFibGVfa2V5X3RvX3J1YnkoCi0gICAgICBpdGVyLT5zZWxmLAotICAgICAgdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KCZpdGVyLT5pdCksCi0gICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJml0ZXItPml0KSk7Ci19Ci0KLVZBTFVFIE1hcF9pdGVyX3ZhbHVlKE1hcF9pdGVyKiBpdGVyKSB7Ci0gIHVwYl92YWx1ZSB2ID0gdXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoJml0ZXItPml0KTsKLSAgdm9pZCogbWVtID0gdmFsdWVfbWVtb3J5KCZ2KTsKLSAgcmV0dXJuIG5hdGl2ZV9zbG90X2dldChpdGVyLT5zZWxmLT52YWx1ZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXItPnNlbGYtPnZhbHVlX3R5cGVfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWVtKTsKLX0KLQotdm9pZCBNYXBfcmVnaXN0ZXIoVkFMVUUgbW9kdWxlKSB7Ci0gIFZBTFVFIGtsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKG1vZHVsZSwgIk1hcCIsIHJiX2NPYmplY3QpOwotICByYl9kZWZpbmVfYWxsb2NfZnVuYyhrbGFzcywgTWFwX2FsbG9jKTsKLSAgY01hcCA9IGtsYXNzOwotICByYl9nY19yZWdpc3Rlcl9hZGRyZXNzKCZjTWFwKTsKLQotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiaW5pdGlhbGl6ZSIsIE1hcF9pbml0LCAtMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJlYWNoIiwgTWFwX2VhY2gsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAia2V5cyIsIE1hcF9rZXlzLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgInZhbHVlcyIsIE1hcF92YWx1ZXMsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiW10iLCBNYXBfaW5kZXgsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiW109IiwgTWFwX2luZGV4X3NldCwgMik7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJoYXNfa2V5PyIsIE1hcF9oYXNfa2V5LCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImRlbGV0ZSIsIE1hcF9kZWxldGUsIDEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiY2xlYXIiLCBNYXBfY2xlYXIsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibGVuZ3RoIiwgTWFwX2xlbmd0aCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJkdXAiLCBNYXBfZHVwLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgIj09IiwgTWFwX2VxLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImhhc2giLCBNYXBfaGFzaCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJpbnNwZWN0IiwgTWFwX2luc3BlY3QsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibWVyZ2UiLCBNYXBfbWVyZ2UsIDEpOwotICByYl9pbmNsdWRlX21vZHVsZShrbGFzcywgcmJfbUVudW1lcmFibGUpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvbWVzc2FnZS5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvbWVzc2FnZS5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTYyNTBmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL21lc3NhZ2UuYworKysgL2Rldi9udWxsCkBAIC0xLDU3OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2luY2x1ZGUgInByb3RvYnVmLmgiCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDbGFzcy9tb2R1bGUgY3JlYXRpb24gZnJvbSBtc2dkZWZzIGFuZCBlbnVtZGVmcywgcmVzcGVjdGl2ZWx5LgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCogTWVzc2FnZV9kYXRhKHZvaWQqIG1zZykgewotICByZXR1cm4gKCh1aW50OF90ICopbXNnKSArIHNpemVvZihNZXNzYWdlSGVhZGVyKTsKLX0KLQotdm9pZCBNZXNzYWdlX21hcmsodm9pZCogX3NlbGYpIHsKLSAgTWVzc2FnZUhlYWRlciogc2VsZiA9IChNZXNzYWdlSGVhZGVyICopX3NlbGY7Ci0gIGxheW91dF9tYXJrKHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwgTWVzc2FnZV9kYXRhKHNlbGYpKTsKLX0KLQotdm9pZCBNZXNzYWdlX2ZyZWUodm9pZCogc2VsZikgewotICB4ZnJlZShzZWxmKTsKLX0KLQotcmJfZGF0YV90eXBlX3QgTWVzc2FnZV90eXBlID0gewotICAiTWVzc2FnZSIsCi0gIHsgTWVzc2FnZV9tYXJrLCBNZXNzYWdlX2ZyZWUsIE5VTEwgfSwKLX07Ci0KLVZBTFVFIE1lc3NhZ2VfYWxsb2MoVkFMVUUga2xhc3MpIHsKLSAgVkFMVUUgZGVzY3JpcHRvciA9IHJiX2l2YXJfZ2V0KGtsYXNzLCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkKTsKLSAgRGVzY3JpcHRvciogZGVzYyA9IHJ1YnlfdG9fRGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgTWVzc2FnZUhlYWRlciogbXNnID0gKE1lc3NhZ2VIZWFkZXIqKUFMTE9DX04oCi0gICAgICB1aW50OF90LCBzaXplb2YoTWVzc2FnZUhlYWRlcikgKyBkZXNjLT5sYXlvdXQtPnNpemUpOwotICBWQUxVRSByZXQ7Ci0KLSAgbWVtc2V0KE1lc3NhZ2VfZGF0YShtc2cpLCAwLCBkZXNjLT5sYXlvdXQtPnNpemUpOwotCi0gIC8vIFdlIHdyYXAgZmlyc3Qgc28gdGhhdCBldmVyeXRoaW5nIGluIHRoZSBtZXNzYWdlIG9iamVjdCBpcyBHQy1yb290ZWQgaW4gY2FzZQotICAvLyBhIGNvbGxlY3Rpb24gaGFwcGVucyBkdXJpbmcgb2JqZWN0IGNyZWF0aW9uIGluIGxheW91dF9pbml0KCkuCi0gIHJldCA9IFR5cGVkRGF0YV9XcmFwX1N0cnVjdChrbGFzcywgJk1lc3NhZ2VfdHlwZSwgbXNnKTsKLSAgbXNnLT5kZXNjcmlwdG9yID0gZGVzYzsKLSAgcmJfaXZhcl9zZXQocmV0LCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkLCBkZXNjcmlwdG9yKTsKLQotICBsYXlvdXRfaW5pdChkZXNjLT5sYXlvdXQsIE1lc3NhZ2VfZGF0YShtc2cpKTsKLQotICByZXR1cm4gcmV0OwotfQotCi1zdGF0aWMgVkFMVUUgd2hpY2hfb25lb2ZfZmllbGQoTWVzc2FnZUhlYWRlciogc2VsZiwgY29uc3QgdXBiX29uZW9mZGVmKiBvKSB7Ci0gIHVwYl9vbmVvZl9pdGVyIGl0OwotICBzaXplX3QgY2FzZV9vZnM7Ci0gIHVpbnQzMl90IG9uZW9mX2Nhc2U7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogZmlyc3RfZmllbGQ7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogZjsKLQotICAvLyBJZiBubyBmaWVsZHMgaW4gdGhlIG9uZW9mLCBhbHdheXMgbmlsLgotICBpZiAodXBiX29uZW9mZGVmX251bWZpZWxkcyhvKSA9PSAwKSB7Ci0gICAgcmV0dXJuIFFuaWw7Ci0gIH0KLSAgLy8gR3JhYiB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIG9uZW9mIHNvIHdlIGNhbiBnZXQgaXRzIGxheW91dCBpbmZvIHRvIGZpbmQgdGhlCi0gIC8vIG9uZW9mX2Nhc2UgZmllbGQuCi0gIHVwYl9vbmVvZl9iZWdpbigmaXQsIG8pOwotICBhc3NlcnQoIXVwYl9vbmVvZl9kb25lKCZpdCkpOwotICBmaXJzdF9maWVsZCA9IHVwYl9vbmVvZl9pdGVyX2ZpZWxkKCZpdCk7Ci0gIGFzc2VydCh1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGZpcnN0X2ZpZWxkKSAhPSBOVUxMKTsKLQotICBjYXNlX29mcyA9Ci0gICAgICBzZWxmLT5kZXNjcmlwdG9yLT5sYXlvdXQtPgotICAgICAgZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmaXJzdF9maWVsZCldLmNhc2Vfb2Zmc2V0OwotICBvbmVvZl9jYXNlID0gKigodWludDMyX3QqKSgoY2hhciopTWVzc2FnZV9kYXRhKHNlbGYpICsgY2FzZV9vZnMpKTsKLQotICBpZiAob25lb2ZfY2FzZSA9PSBPTkVPRl9DQVNFX05PTkUpIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfQotCi0gIC8vIG9uZW9mX2Nhc2UgaXMgYSBmaWVsZCBpbmRleCwgc28gZmluZCB0aGF0IGZpZWxkLgotICBmID0gdXBiX29uZW9mZGVmX2l0b2Yobywgb25lb2ZfY2FzZSk7Ci0gIGFzc2VydChmICE9IE5VTEwpOwotCi0gIHJldHVybiBJRDJTWU0ocmJfaW50ZXJuKHVwYl9maWVsZGRlZl9uYW1lKGYpKSk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlLm1ldGhvZF9taXNzaW5nKCphcmdzKQotICoKLSAqIFByb3ZpZGVzIGFjY2Vzc29ycyBhbmQgc2V0dGVycyBmb3IgbWVzc2FnZSBmaWVsZHMgYWNjb3JkaW5nIHRvIHRoZWlyIGZpZWxkCi0gKiBuYW1lcy4gRm9yIGFueSBmaWVsZCB3aG9zZSBuYW1lIGRvZXMgbm90IGNvbmZsaWN0IHdpdGggYSBidWlsdC1pbiBtZXRob2QsIGFuCi0gKiBhY2Nlc3NvciBpcyBwcm92aWRlZCB3aXRoIHRoZSBzYW1lIG5hbWUgYXMgdGhlIGZpZWxkLCBhbmQgYSBzZXR0ZXIgaXMKLSAqIHByb3ZpZGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHBsdXMgdGhlICc9JyBzdWZmaXguIFRodXMsIGdpdmVuIGEKLSAqIG1lc3NhZ2UgaW5zdGFuY2UgJ21zZycgd2l0aCBmaWVsZCAnZm9vJywgdGhlIGZvbGxvd2luZyBjb2RlIGlzIHZhbGlkOgotICoKLSAqICAgICBtc2cuZm9vID0gNDIKLSAqICAgICBwdXRzIG1zZy5mb28KLSAqCi0gKiBUaGlzIG1ldGhvZCBhbHNvIHByb3ZpZGVzIHJlYWQtb25seSBhY2Nlc3NvcnMgZm9yIG9uZW9mcy4gSWYgYSBvbmVvZiBleGlzdHMKLSAqIHdpdGggbmFtZSAnbXlfb25lb2YnLCB0aGVuIG1zZy5teV9vbmVvZiB3aWxsIHJldHVybiBhIFJ1Ynkgc3ltYm9sIGVxdWFsIHRvCi0gKiB0aGUgbmFtZSBvZiB0aGUgZmllbGQgaW4gdGhhdCBvbmVvZiB0aGF0IGlzIGN1cnJlbnRseSBzZXQsIG9yIG5pbCBpZiBub25lLgotICovCi1WQUxVRSBNZXNzYWdlX21ldGhvZF9taXNzaW5nKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgX3NlbGYpIHsKLSAgTWVzc2FnZUhlYWRlciogc2VsZjsKLSAgVkFMVUUgbWV0aG9kX25hbWUsIG1ldGhvZF9zdHI7Ci0gIGNoYXIqIG5hbWU7Ci0gIHNpemVfdCBuYW1lX2xlbjsKLSAgYm9vbCBzZXR0ZXI7Ci0gIGNvbnN0IHVwYl9vbmVvZmRlZiogbzsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmOwotCi0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KF9zZWxmLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBzZWxmKTsKLSAgaWYgKGFyZ2MgPCAxKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgbWV0aG9kIG5hbWUgYXMgZmlyc3QgYXJndW1lbnQuIik7Ci0gIH0KLSAgbWV0aG9kX25hbWUgPSBhcmd2WzBdOwotICBpZiAoIVNZTUJPTF9QKG1ldGhvZF9uYW1lKSkgewotICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkV4cGVjdGVkIHN5bWJvbCBhcyBtZXRob2QgbmFtZS4iKTsKLSAgfQotICBtZXRob2Rfc3RyID0gcmJfaWQyc3RyKFNZTTJJRChtZXRob2RfbmFtZSkpOwotICBuYW1lID0gUlNUUklOR19QVFIobWV0aG9kX3N0cik7Ci0gIG5hbWVfbGVuID0gUlNUUklOR19MRU4obWV0aG9kX3N0cik7Ci0gIHNldHRlciA9IGZhbHNlOwotCi0gIC8vIFNldHRlcnMgaGF2ZSBuYW1lcyB0aGF0IGVuZCBpbiAnPScuCi0gIGlmIChuYW1lW25hbWVfbGVuIC0gMV0gPT0gJz0nKSB7Ci0gICAgc2V0dGVyID0gdHJ1ZTsKLSAgICBuYW1lX2xlbi0tOwotICB9Ci0KLSAgLy8gU2VlIGlmIHRoaXMgbmFtZSBjb3JyZXNwb25kcyB0byBlaXRoZXIgYSBvbmVvZiBvciBmaWVsZCBpbiB0aGlzIG1lc3NhZ2UuCi0gIGlmICghdXBiX21zZ2RlZl9sb29rdXBuYW1lKHNlbGYtPmRlc2NyaXB0b3ItPm1zZ2RlZiwgbmFtZSwgbmFtZV9sZW4sICZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbykpIHsKLSAgICByZXR1cm4gcmJfY2FsbF9zdXBlcihhcmdjLCBhcmd2KTsKLSAgfQotCi0gIGlmIChvICE9IE5VTEwpIHsKLSAgICAvLyBUaGlzIGlzIGEgb25lb2YgLS0gcmV0dXJuIHdoaWNoIGZpZWxkIGluc2lkZSB0aGUgb25lb2YgaXMgc2V0LgotICAgIGlmIChzZXR0ZXIpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJPbmVvZiBhY2Nlc3NvcnMgYXJlIHJlYWQtb25seS4iKTsKLSAgICB9Ci0gICAgcmV0dXJuIHdoaWNoX29uZW9mX2ZpZWxkKHNlbGYsIG8pOwotICB9IGVsc2UgewotICAgIC8vIFRoaXMgaXMgYSBmaWVsZCAtLSBnZXQgb3Igc2V0IHRoZSBmaWVsZCdzIHZhbHVlLgotICAgIGFzc2VydChmKTsKLSAgICBpZiAoc2V0dGVyKSB7Ci0gICAgICBpZiAoYXJnYyA8IDIpIHsKLSAgICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiTm8gdmFsdWUgcHJvdmlkZWQgdG8gc2V0dGVyLiIpOwotICAgICAgfQotICAgICAgbGF5b3V0X3NldChzZWxmLT5kZXNjcmlwdG9yLT5sYXlvdXQsIE1lc3NhZ2VfZGF0YShzZWxmKSwgZiwgYXJndlsxXSk7Ci0gICAgICByZXR1cm4gUW5pbDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGxheW91dF9nZXQoc2VsZi0+ZGVzY3JpcHRvci0+bGF5b3V0LCBNZXNzYWdlX2RhdGEoc2VsZiksIGYpOwotICAgIH0KLSAgfQotfQotCi1pbnQgTWVzc2FnZV9pbml0aWFsaXplX2t3YXJnKFZBTFVFIGtleSwgVkFMVUUgdmFsLCBWQUxVRSBfc2VsZikgewotICBNZXNzYWdlSGVhZGVyKiBzZWxmOwotICBWQUxVRSBtZXRob2Rfc3RyOwotICBjaGFyKiBuYW1lOwotICBjb25zdCB1cGJfZmllbGRkZWYqIGY7Ci0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KF9zZWxmLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBzZWxmKTsKLQotICBpZiAoIVNZTUJPTF9QKGtleSkpIHsKLSAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsCi0gICAgICAgICAgICAgIkV4cGVjdGVkIHN5bWJvbHMgYXMgaGFzaCBrZXlzIGluIGluaXRpYWxpemF0aW9uIG1hcC4iKTsKLSAgfQotCi0gIG1ldGhvZF9zdHIgPSByYl9pZDJzdHIoU1lNMklEKGtleSkpOwotICBuYW1lID0gUlNUUklOR19QVFIobWV0aG9kX3N0cik7Ci0gIGYgPSB1cGJfbXNnZGVmX250b2Z6KHNlbGYtPmRlc2NyaXB0b3ItPm1zZ2RlZiwgbmFtZSk7Ci0gIGlmIChmID09IE5VTEwpIHsKLSAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsCi0gICAgICAgICAgICAgIlVua25vd24gZmllbGQgbmFtZSAnJXMnIGluIGluaXRpYWxpemF0aW9uIG1hcCBlbnRyeS4iLCBuYW1lKTsKLSAgfQotCi0gIGlmIChpc19tYXBfZmllbGQoZikpIHsKLSAgICBWQUxVRSBtYXA7Ci0KLSAgICBpZiAoVFlQRSh2YWwpICE9IFRfSEFTSCkgewotICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLAotICAgICAgICAgICAgICAgIkV4cGVjdGVkIEhhc2ggb2JqZWN0IGFzIGluaXRpYWxpemVyIHZhbHVlIGZvciBtYXAgZmllbGQgJyVzJy4iLCBuYW1lKTsKLSAgICB9Ci0gICAgbWFwID0gbGF5b3V0X2dldChzZWxmLT5kZXNjcmlwdG9yLT5sYXlvdXQsIE1lc3NhZ2VfZGF0YShzZWxmKSwgZik7Ci0gICAgTWFwX21lcmdlX2ludG9fc2VsZihtYXAsIHZhbCk7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGYpID09IFVQQl9MQUJFTF9SRVBFQVRFRCkgewotICAgIFZBTFVFIGFyeTsKLQotICAgIGlmIChUWVBFKHZhbCkgIT0gVF9BUlJBWSkgewotICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLAotICAgICAgICAgICAgICAgIkV4cGVjdGVkIGFycmF5IGFzIGluaXRpYWxpemVyIHZhbHVlIGZvciByZXBlYXRlZCBmaWVsZCAnJXMnLiIsIG5hbWUpOwotICAgIH0KLSAgICBhcnkgPSBsYXlvdXRfZ2V0KHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwgTWVzc2FnZV9kYXRhKHNlbGYpLCBmKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFJBUlJBWV9MRU4odmFsKTsgaSsrKSB7Ci0gICAgICBSZXBlYXRlZEZpZWxkX3B1c2goYXJ5LCByYl9hcnlfZW50cnkodmFsLCBpKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGxheW91dF9zZXQoc2VsZi0+ZGVzY3JpcHRvci0+bGF5b3V0LCBNZXNzYWdlX2RhdGEoc2VsZiksIGYsIHZhbCk7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlLm5ldyhrd2FyZ3MpID0+IG5ld19tZXNzYWdlCi0gKgotICogQ3JlYXRlcyBhIG5ldyBpbnN0YW5jZSBvZiB0aGUgZ2l2ZW4gbWVzc2FnZSBjbGFzcy4gS2V5d29yZCBhcmd1bWVudHMgbWF5IGJlCi0gKiBwcm92aWRlZCB3aXRoIGtleXdvcmRzIGNvcnJlc3BvbmRpbmcgdG8gZmllbGQgbmFtZXMuCi0gKgotICogTm90ZSB0aGF0IG5vIGxpdGVyYWwgTWVzc2FnZSBjbGFzcyBleGlzdHMuIE9ubHkgY29uY3JldGUgY2xhc3NlcyBwZXIgbWVzc2FnZQotICogdHlwZSBleGlzdCwgYXMgcHJvdmlkZWQgYnkgdGhlICNtc2djbGFzcyBtZXRob2Qgb24gRGVzY3JpcHRvcnMgYWZ0ZXIgdGhleQotICogaGF2ZSBiZWVuIGFkZGVkIHRvIGEgcG9vbC4gVGhlIG1ldGhvZCBkZWZpbml0aW9ucyBkZXNjcmliZWQgaGVyZSBvbiB0aGUKLSAqIE1lc3NhZ2UgY2xhc3MgYXJlIHByb3ZpZGVkIG9uIGVhY2ggY29uY3JldGUgbWVzc2FnZSBjbGFzcy4KLSAqLwotVkFMVUUgTWVzc2FnZV9pbml0aWFsaXplKGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgX3NlbGYpIHsKLSAgVkFMVUUgaGFzaF9hcmdzOwotCi0gIGlmIChhcmdjID09IDApIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfQotICBpZiAoYXJnYyAhPSAxKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgMCBvciAxIGFyZ3VtZW50cy4iKTsKLSAgfQotICBoYXNoX2FyZ3MgPSBhcmd2WzBdOwotICBpZiAoVFlQRShoYXNoX2FyZ3MpICE9IFRfSEFTSCkgewotICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkV4cGVjdGVkIGhhc2ggYXJndW1lbnRzLiIpOwotICB9Ci0KLSAgcmJfaGFzaF9mb3JlYWNoKGhhc2hfYXJncywgTWVzc2FnZV9pbml0aWFsaXplX2t3YXJnLCBfc2VsZik7Ci0gIHJldHVybiBRbmlsOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWVzc2FnZS5kdXAgPT4gbmV3X21lc3NhZ2UKLSAqCi0gKiBQZXJmb3JtcyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG1lc3NhZ2UgYW5kIHJldHVybnMgdGhlIG5ldyBjb3B5LgotICovCi1WQUxVRSBNZXNzYWdlX2R1cChWQUxVRSBfc2VsZikgewotICBNZXNzYWdlSGVhZGVyKiBzZWxmOwotICBWQUxVRSBuZXdfbXNnOwotICBNZXNzYWdlSGVhZGVyKiBuZXdfbXNnX3NlbGY7Ci0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KF9zZWxmLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBzZWxmKTsKLQotICBuZXdfbXNnID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDAsIE5VTEwsIENMQVNTX09GKF9zZWxmKSk7Ci0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KG5ld19tc2csIE1lc3NhZ2VIZWFkZXIsICZNZXNzYWdlX3R5cGUsIG5ld19tc2dfc2VsZik7Ci0KLSAgbGF5b3V0X2R1cChzZWxmLT5kZXNjcmlwdG9yLT5sYXlvdXQsCi0gICAgICAgICAgICAgTWVzc2FnZV9kYXRhKG5ld19tc2dfc2VsZiksCi0gICAgICAgICAgICAgTWVzc2FnZV9kYXRhKHNlbGYpKTsKLQotICByZXR1cm4gbmV3X21zZzsKLX0KLQotLy8gSW50ZXJuYWwgb25seTsgdXNlZCBieSBHb29nbGU6OlByb3RvYnVmLmRlZXBfY29weS4KLVZBTFVFIE1lc3NhZ2VfZGVlcF9jb3B5KFZBTFVFIF9zZWxmKSB7Ci0gIE1lc3NhZ2VIZWFkZXIqIHNlbGY7Ci0gIE1lc3NhZ2VIZWFkZXIqIG5ld19tc2dfc2VsZjsKLSAgVkFMVUUgbmV3X21zZzsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QoX3NlbGYsIE1lc3NhZ2VIZWFkZXIsICZNZXNzYWdlX3R5cGUsIHNlbGYpOwotCi0gIG5ld19tc2cgPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMCwgTlVMTCwgQ0xBU1NfT0YoX3NlbGYpKTsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QobmV3X21zZywgTWVzc2FnZUhlYWRlciwgJk1lc3NhZ2VfdHlwZSwgbmV3X21zZ19zZWxmKTsKLQotICBsYXlvdXRfZGVlcF9jb3B5KHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwKLSAgICAgICAgICAgICAgICAgICBNZXNzYWdlX2RhdGEobmV3X21zZ19zZWxmKSwKLSAgICAgICAgICAgICAgICAgICBNZXNzYWdlX2RhdGEoc2VsZikpOwotCi0gIHJldHVybiBuZXdfbXNnOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWVzc2FnZS49PShvdGhlcikgPT4gYm9vbGVhbgotICoKLSAqIFBlcmZvcm1zIGEgZGVlcCBjb21wYXJpc29uIG9mIHRoaXMgbWVzc2FnZSB3aXRoIGFub3RoZXIuIE1lc3NhZ2VzIGFyZSBlcXVhbAotICogaWYgdGhleSBoYXZlIHRoZSBzYW1lIHR5cGUgYW5kIGlmIGVhY2ggZmllbGQgaXMgZXF1YWwgYWNjb3JkaW5nIHRvIHRoZSA6PT0KLSAqIG1ldGhvZCdzIHNlbWFudGljcyAoYSBtb3JlIGVmZmljaWVudCBjb21wYXJpc29uIG1heSBhY3R1YWxseSBiZSBkb25lIGlmIHRoZQotICogZmllbGQgaXMgb2YgYSBwcmltaXRpdmUgdHlwZSkuCi0gKi8KLVZBTFVFIE1lc3NhZ2VfZXEoVkFMVUUgX3NlbGYsIFZBTFVFIF9vdGhlcikgewotICBNZXNzYWdlSGVhZGVyKiBzZWxmOwotICBNZXNzYWdlSGVhZGVyKiBvdGhlcjsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QoX3NlbGYsIE1lc3NhZ2VIZWFkZXIsICZNZXNzYWdlX3R5cGUsIHNlbGYpOwotICBUeXBlZERhdGFfR2V0X1N0cnVjdChfb3RoZXIsIE1lc3NhZ2VIZWFkZXIsICZNZXNzYWdlX3R5cGUsIG90aGVyKTsKLQotICBpZiAoc2VsZi0+ZGVzY3JpcHRvciAhPSBvdGhlci0+ZGVzY3JpcHRvcikgewotICAgIHJldHVybiBRZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gbGF5b3V0X2VxKHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwKLSAgICAgICAgICAgICAgICAgICBNZXNzYWdlX2RhdGEoc2VsZiksCi0gICAgICAgICAgICAgICAgICAgTWVzc2FnZV9kYXRhKG90aGVyKSk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlLmhhc2ggPT4gaGFzaF92YWx1ZQotICoKLSAqIFJldHVybnMgYSBoYXNoIHZhbHVlIHRoYXQgcmVwcmVzZW50cyB0aGlzIG1lc3NhZ2UncyBmaWVsZCB2YWx1ZXMuCi0gKi8KLVZBTFVFIE1lc3NhZ2VfaGFzaChWQUxVRSBfc2VsZikgewotICBNZXNzYWdlSGVhZGVyKiBzZWxmOwotICBUeXBlZERhdGFfR2V0X1N0cnVjdChfc2VsZiwgTWVzc2FnZUhlYWRlciwgJk1lc3NhZ2VfdHlwZSwgc2VsZik7Ci0KLSAgcmV0dXJuIGxheW91dF9oYXNoKHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwgTWVzc2FnZV9kYXRhKHNlbGYpKTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIE1lc3NhZ2UuaW5zcGVjdCA9PiBzdHJpbmcKLSAqCi0gKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIG1lc3NhZ2UuIEl0IHdpbGwgYmUKLSAqIGZvcm1hdHRlZCBhcyAiPE1lc3NhZ2VUeXBlOiBmaWVsZDE6IHZhbHVlMSwgZmllbGQyOiB2YWx1ZTIsIC4uLj4iLiBFYWNoCi0gKiBmaWVsZCdzIHZhbHVlIGlzIHJlcHJlc2VudGVkIGFjY29yZGluZyB0byBpdHMgb3duICNpbnNwZWN0IG1ldGhvZC4KLSAqLwotVkFMVUUgTWVzc2FnZV9pbnNwZWN0KFZBTFVFIF9zZWxmKSB7Ci0gIE1lc3NhZ2VIZWFkZXIqIHNlbGY7Ci0gIFZBTFVFIHN0cjsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QoX3NlbGYsIE1lc3NhZ2VIZWFkZXIsICZNZXNzYWdlX3R5cGUsIHNlbGYpOwotCi0gIHN0ciA9IHJiX3N0cl9uZXcyKCI8Iik7Ci0gIHN0ciA9IHJiX3N0cl9hcHBlbmQoc3RyLCByYl9zdHJfbmV3MihyYl9jbGFzczJuYW1lKENMQVNTX09GKF9zZWxmKSkpKTsKLSAgc3RyID0gcmJfc3RyX2NhdDIoc3RyLCAiOiAiKTsKLSAgc3RyID0gcmJfc3RyX2FwcGVuZChzdHIsIGxheW91dF9pbnNwZWN0KAotICAgICAgc2VsZi0+ZGVzY3JpcHRvci0+bGF5b3V0LCBNZXNzYWdlX2RhdGEoc2VsZikpKTsKLSAgc3RyID0gcmJfc3RyX2NhdDIoc3RyLCAiPiIpOwotICByZXR1cm4gc3RyOwotfQotCi0KLVZBTFVFIE1lc3NhZ2VfdG9faChWQUxVRSBfc2VsZikgewotICBNZXNzYWdlSGVhZGVyKiBzZWxmOwotICBWQUxVRSBoYXNoOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaXQ7Ci0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KF9zZWxmLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBzZWxmKTsKLQotICBoYXNoID0gcmJfaGFzaF9uZXcoKTsKLQotICBmb3IgKHVwYl9tc2dfZmllbGRfYmVnaW4oJml0LCBzZWxmLT5kZXNjcmlwdG9yLT5tc2dkZWYpOwotICAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJml0KTsKLSAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJml0KSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJml0KTsKLSAgICBWQUxVRSBtc2dfdmFsdWUgPSBsYXlvdXRfZ2V0KHNlbGYtPmRlc2NyaXB0b3ItPmxheW91dCwgTWVzc2FnZV9kYXRhKHNlbGYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQpOwotICAgIFZBTFVFIG1zZ19rZXkgICA9IElEMlNZTShyYl9pbnRlcm4odXBiX2ZpZWxkZGVmX25hbWUoZmllbGQpKSk7Ci0gICAgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgPT0gVVBCX0xBQkVMX1JFUEVBVEVEKSB7Ci0gICAgICBtc2dfdmFsdWUgPSBSZXBlYXRlZEZpZWxkX3RvX2FyeShtc2dfdmFsdWUpOwotICAgIH0KLSAgICByYl9oYXNoX2FzZXQoaGFzaCwgbXNnX2tleSwgbXNnX3ZhbHVlKTsKLSAgfQotICByZXR1cm4gaGFzaDsKLX0KLQotCi0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlLltdKGluZGV4KSA9PiB2YWx1ZQotICoKLSAqIEFjY2Vzc2VzIGEgZmllbGQncyB2YWx1ZSBieSBmaWVsZCBuYW1lLiBUaGUgcHJvdmlkZWQgZmllbGQgbmFtZSBzaG91bGQgYmUgYQotICogc3RyaW5nLgotICovCi1WQUxVRSBNZXNzYWdlX2luZGV4KFZBTFVFIF9zZWxmLCBWQUxVRSBmaWVsZF9uYW1lKSB7Ci0gIE1lc3NhZ2VIZWFkZXIqIHNlbGY7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQ7Ci0gIFR5cGVkRGF0YV9HZXRfU3RydWN0KF9zZWxmLCBNZXNzYWdlSGVhZGVyLCAmTWVzc2FnZV90eXBlLCBzZWxmKTsKLSAgQ2hlY2tfVHlwZShmaWVsZF9uYW1lLCBUX1NUUklORyk7Ci0gIGZpZWxkID0gdXBiX21zZ2RlZl9udG9meihzZWxmLT5kZXNjcmlwdG9yLT5tc2dkZWYsIFJTVFJJTkdfUFRSKGZpZWxkX25hbWUpKTsKLSAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfQotICByZXR1cm4gbGF5b3V0X2dldChzZWxmLT5kZXNjcmlwdG9yLT5sYXlvdXQsIE1lc3NhZ2VfZGF0YShzZWxmKSwgZmllbGQpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgTWVzc2FnZS5bXT0oaW5kZXgsIHZhbHVlKQotICoKLSAqIFNldHMgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIG5hbWUuIFRoZSBwcm92aWRlZCBmaWVsZCBuYW1lIHNob3VsZCBiZSBhCi0gKiBzdHJpbmcuCi0gKi8KLVZBTFVFIE1lc3NhZ2VfaW5kZXhfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBmaWVsZF9uYW1lLCBWQUxVRSB2YWx1ZSkgewotICBNZXNzYWdlSGVhZGVyKiBzZWxmOwotICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkOwotICBUeXBlZERhdGFfR2V0X1N0cnVjdChfc2VsZiwgTWVzc2FnZUhlYWRlciwgJk1lc3NhZ2VfdHlwZSwgc2VsZik7Ci0gIENoZWNrX1R5cGUoZmllbGRfbmFtZSwgVF9TVFJJTkcpOwotICBmaWVsZCA9IHVwYl9tc2dkZWZfbnRvZnooc2VsZi0+ZGVzY3JpcHRvci0+bXNnZGVmLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSk7Ci0gIGlmIChmaWVsZCA9PSBOVUxMKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiVW5rbm93biBmaWVsZDogJXMiLCBSU1RSSU5HX1BUUihmaWVsZF9uYW1lKSk7Ci0gIH0KLSAgbGF5b3V0X3NldChzZWxmLT5kZXNjcmlwdG9yLT5sYXlvdXQsIE1lc3NhZ2VfZGF0YShzZWxmKSwgZmllbGQsIHZhbHVlKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBNZXNzYWdlLmRlc2NyaXB0b3IgPT4gZGVzY3JpcHRvcgotICoKLSAqIENsYXNzIG1ldGhvZCB0aGF0IHJldHVybnMgdGhlIERlc2NyaXB0b3IgaW5zdGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGlzCi0gKiBtZXNzYWdlIGNsYXNzJ3MgdHlwZS4KLSAqLwotVkFMVUUgTWVzc2FnZV9kZXNjcmlwdG9yKFZBTFVFIGtsYXNzKSB7Ci0gIHJldHVybiByYl9pdmFyX2dldChrbGFzcywgZGVzY3JpcHRvcl9pbnN0YW5jZXZhcl9pbnRlcm5lZCk7Ci19Ci0KLVZBTFVFIGJ1aWxkX2NsYXNzX2Zyb21fZGVzY3JpcHRvcihEZXNjcmlwdG9yKiBkZXNjKSB7Ci0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIFZBTFVFIGtsYXNzOwotCi0gIGlmIChkZXNjLT5sYXlvdXQgPT0gTlVMTCkgewotICAgIGRlc2MtPmxheW91dCA9IGNyZWF0ZV9sYXlvdXQoZGVzYy0+bXNnZGVmKTsKLSAgfQotICBpZiAoZGVzYy0+ZmlsbF9tZXRob2QgPT0gTlVMTCkgewotICAgIGRlc2MtPmZpbGxfbWV0aG9kID0gbmV3X2ZpbGxtc2dfZGVjb2Rlcm1ldGhvZChkZXNjLCAmZGVzYy0+ZmlsbF9tZXRob2QpOwotICB9Ci0KLSAgbmFtZSA9IHVwYl9tc2dkZWZfZnVsbG5hbWUoZGVzYy0+bXNnZGVmKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgIHJiX3JhaXNlKHJiX2VSdW50aW1lRXJyb3IsICJEZXNjcmlwdG9yIGRvZXMgbm90IGhhdmUgYXNzaWduZWQgbmFtZS4iKTsKLSAgfQotCi0gIGtsYXNzID0gcmJfZGVmaW5lX2NsYXNzX2lkKAotICAgICAgLy8gRG9jcyBzYXkgdGhpcyBwYXJhbWV0ZXIgaXMgaWdub3JlZC4gVXNlciB3aWxsIGFzc2lnbiByZXR1cm4gdmFsdWUgdG8KLSAgICAgIC8vIHRoZWlyIG93biB0b3BsZXZlbCBjb25zdGFudCBjbGFzcyBuYW1lLgotICAgICAgcmJfaW50ZXJuKCJNZXNzYWdlIiksCi0gICAgICByYl9jT2JqZWN0KTsKLSAgcmJfaXZhcl9zZXQoa2xhc3MsIGRlc2NyaXB0b3JfaW5zdGFuY2V2YXJfaW50ZXJuZWQsCi0gICAgICAgICAgICAgIGdldF9kZWZfb2JqKGRlc2MtPm1zZ2RlZikpOwotICByYl9kZWZpbmVfYWxsb2NfZnVuYyhrbGFzcywgTWVzc2FnZV9hbGxvYyk7Ci0gIHJiX3JlcXVpcmUoImdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2V4dHMiKTsKLSAgcmJfaW5jbHVkZV9tb2R1bGUoa2xhc3MsIHJiX2V2YWxfc3RyaW5nKCJHb29nbGU6OlByb3RvYnVmOjpNZXNzYWdlRXh0cyIpKTsKLSAgcmJfZXh0ZW5kX29iamVjdCgKLSAgICAgIGtsYXNzLCByYl9ldmFsX3N0cmluZygiR29vZ2xlOjpQcm90b2J1Zjo6TWVzc2FnZUV4dHM6OkNsYXNzTWV0aG9kcyIpKTsKLQotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAibWV0aG9kX21pc3NpbmciLAotICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VfbWV0aG9kX21pc3NpbmcsIC0xKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImluaXRpYWxpemUiLCBNZXNzYWdlX2luaXRpYWxpemUsIC0xKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImR1cCIsIE1lc3NhZ2VfZHVwLCAwKTsKLSAgLy8gQWxzbyBkZWZpbmUgI2Nsb25lIHNvIHRoYXQgd2UgZG9uJ3QgaW5oZXJpdCBPYmplY3QjY2xvbmUuCi0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJjbG9uZSIsIE1lc3NhZ2VfZHVwLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgIj09IiwgTWVzc2FnZV9lcSwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJoYXNoIiwgTWVzc2FnZV9oYXNoLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgInRvX2giLCBNZXNzYWdlX3RvX2gsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAidG9faGFzaCIsIE1lc3NhZ2VfdG9faCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJpbnNwZWN0IiwgTWVzc2FnZV9pbnNwZWN0LCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgIltdIiwgTWVzc2FnZV9pbmRleCwgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJbXT0iLCBNZXNzYWdlX2luZGV4X3NldCwgMik7Ci0gIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKGtsYXNzLCAiZGVjb2RlIiwgTWVzc2FnZV9kZWNvZGUsIDEpOwotICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChrbGFzcywgImVuY29kZSIsIE1lc3NhZ2VfZW5jb2RlLCAxKTsKLSAgcmJfZGVmaW5lX3NpbmdsZXRvbl9tZXRob2Qoa2xhc3MsICJkZWNvZGVfanNvbiIsIE1lc3NhZ2VfZGVjb2RlX2pzb24sIDEpOwotICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChrbGFzcywgImVuY29kZV9qc29uIiwgTWVzc2FnZV9lbmNvZGVfanNvbiwgLTEpOwotICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChrbGFzcywgImRlc2NyaXB0b3IiLCBNZXNzYWdlX2Rlc2NyaXB0b3IsIDApOwotCi0gIHJldHVybiBrbGFzczsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEVudW0ubG9va3VwKG51bWJlcikgPT4gbmFtZQotICoKLSAqIFRoaXMgbW9kdWxlIG1ldGhvZCwgcHJvdmlkZWQgb24gZWFjaCBnZW5lcmF0ZWQgZW51bSBtb2R1bGUsIGxvb2tzIHVwIGFuIGVudW0KLSAqIHZhbHVlIGJ5IG51bWJlciBhbmQgcmV0dXJucyBpdHMgbmFtZSBhcyBhIFJ1Ynkgc3ltYm9sLCBvciBuaWwgaWYgbm90IGZvdW5kLgotICovCi1WQUxVRSBlbnVtX2xvb2t1cChWQUxVRSBzZWxmLCBWQUxVRSBudW1iZXIpIHsKLSAgaW50MzJfdCBudW0gPSBOVU0ySU5UKG51bWJlcik7Ci0gIFZBTFVFIGRlc2MgPSByYl9pdmFyX2dldChzZWxmLCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkKTsKLSAgRW51bURlc2NyaXB0b3IqIGVudW1kZXNjID0gcnVieV90b19FbnVtRGVzY3JpcHRvcihkZXNjKTsKLQotICBjb25zdCBjaGFyKiBuYW1lID0gdXBiX2VudW1kZWZfaXRvbihlbnVtZGVzYy0+ZW51bWRlZiwgbnVtKTsKLSAgaWYgKG5hbWUgPT0gTlVMTCkgewotICAgIHJldHVybiBRbmlsOwotICB9IGVsc2UgewotICAgIHJldHVybiBJRDJTWU0ocmJfaW50ZXJuKG5hbWUpKTsKLSAgfQotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgRW51bS5yZXNvbHZlKG5hbWUpID0+IG51bWJlcgotICoKLSAqIFRoaXMgbW9kdWxlIG1ldGhvZCwgcHJvdmlkZWQgb24gZWFjaCBnZW5lcmF0ZWQgZW51bSBtb2R1bGUsIGxvb2tzIHVwIGFuIGVudW0KLSAqIHZhbHVlIGJ5IG5hbWUgKGFzIGEgUnVieSBzeW1ib2wpIGFuZCByZXR1cm5zIGl0cyBuYW1lLCBvciBuaWwgaWYgbm90IGZvdW5kLgotICovCi1WQUxVRSBlbnVtX3Jlc29sdmUoVkFMVUUgc2VsZiwgVkFMVUUgc3ltKSB7Ci0gIGNvbnN0IGNoYXIqIG5hbWUgPSByYl9pZDJuYW1lKFNZTTJJRChzeW0pKTsKLSAgVkFMVUUgZGVzYyA9IHJiX2l2YXJfZ2V0KHNlbGYsIGRlc2NyaXB0b3JfaW5zdGFuY2V2YXJfaW50ZXJuZWQpOwotICBFbnVtRGVzY3JpcHRvciogZW51bWRlc2MgPSBydWJ5X3RvX0VudW1EZXNjcmlwdG9yKGRlc2MpOwotCi0gIGludDMyX3QgbnVtID0gMDsKLSAgYm9vbCBmb3VuZCA9IHVwYl9lbnVtZGVmX250b2l6KGVudW1kZXNjLT5lbnVtZGVmLCBuYW1lLCAmbnVtKTsKLSAgaWYgKCFmb3VuZCkgewotICAgIHJldHVybiBRbmlsOwotICB9IGVsc2UgewotICAgIHJldHVybiBJTlQyTlVNKG51bSk7Ci0gIH0KLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIEVudW0uZGVzY3JpcHRvcgotICoKLSAqIFRoaXMgbW9kdWxlIG1ldGhvZCwgcHJvdmlkZWQgb24gZWFjaCBnZW5lcmF0ZWQgZW51bSBtb2R1bGUsIHJldHVybnMgdGhlCi0gKiBFbnVtRGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW51bSB0eXBlLgotICovCi1WQUxVRSBlbnVtX2Rlc2NyaXB0b3IoVkFMVUUgc2VsZikgewotICByZXR1cm4gcmJfaXZhcl9nZXQoc2VsZiwgZGVzY3JpcHRvcl9pbnN0YW5jZXZhcl9pbnRlcm5lZCk7Ci19Ci0KLVZBTFVFIGJ1aWxkX21vZHVsZV9mcm9tX2VudW1kZXNjKEVudW1EZXNjcmlwdG9yKiBlbnVtZGVzYykgewotICBWQUxVRSBtb2QgPSByYl9kZWZpbmVfbW9kdWxlX2lkKAotICAgICAgcmJfaW50ZXJuKHVwYl9lbnVtZGVmX2Z1bGxuYW1lKGVudW1kZXNjLT5lbnVtZGVmKSkpOwotCi0gIHVwYl9lbnVtX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX2VudW1fYmVnaW4oJml0LCBlbnVtZGVzYy0+ZW51bWRlZik7Ci0gICAgICAgIXVwYl9lbnVtX2RvbmUoJml0KTsKLSAgICAgICB1cGJfZW51bV9uZXh0KCZpdCkpIHsKLSAgICBjb25zdCBjaGFyKiBuYW1lID0gdXBiX2VudW1faXRlcl9uYW1lKCZpdCk7Ci0gICAgaW50MzJfdCB2YWx1ZSA9IHVwYl9lbnVtX2l0ZXJfbnVtYmVyKCZpdCk7Ci0gICAgaWYgKG5hbWVbMF0gPCAnQScgfHwgbmFtZVswXSA+ICdaJykgewotICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICJFbnVtIHZhbHVlICclcycgZG9lcyBub3Qgc3RhcnQgd2l0aCBhbiB1cHBlcmNhc2UgbGV0dGVyICIKLSAgICAgICAgICAgICAgICJhcyBpcyByZXF1aXJlZCBmb3IgUnVieSBjb25zdGFudHMuIiwKLSAgICAgICAgICAgICAgIG5hbWUpOwotICAgIH0KLSAgICByYl9kZWZpbmVfY29uc3QobW9kLCBuYW1lLCBJTlQyTlVNKHZhbHVlKSk7Ci0gIH0KLQotICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChtb2QsICJsb29rdXAiLCBlbnVtX2xvb2t1cCwgMSk7Ci0gIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKG1vZCwgInJlc29sdmUiLCBlbnVtX3Jlc29sdmUsIDEpOwotICByYl9kZWZpbmVfc2luZ2xldG9uX21ldGhvZChtb2QsICJkZXNjcmlwdG9yIiwgZW51bV9kZXNjcmlwdG9yLCAwKTsKLSAgcmJfaXZhcl9zZXQobW9kLCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkLAotICAgICAgICAgICAgICBnZXRfZGVmX29iaihlbnVtZGVzYy0+ZW51bWRlZikpOwotCi0gIHJldHVybiBtb2Q7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBHb29nbGU6OlByb3RvYnVmLmRlZXBfY29weShvYmopID0+IGNvcHlfb2Zfb2JqCi0gKgotICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb2YgYSBSZXBlYXRlZEZpZWxkIGluc3RhbmNlLCBhIE1hcCBpbnN0YW5jZSwgb3IgYQotICogbWVzc2FnZSBvYmplY3QsIHJlY3Vyc2l2ZWx5IGNvcHlpbmcgaXRzIG1lbWJlcnMuCi0gKi8KLVZBTFVFIEdvb2dsZV9Qcm90b2J1Zl9kZWVwX2NvcHkoVkFMVUUgc2VsZiwgVkFMVUUgb2JqKSB7Ci0gIFZBTFVFIGtsYXNzID0gQ0xBU1NfT0Yob2JqKTsKLSAgaWYgKGtsYXNzID09IGNSZXBlYXRlZEZpZWxkKSB7Ci0gICAgcmV0dXJuIFJlcGVhdGVkRmllbGRfZGVlcF9jb3B5KG9iaik7Ci0gIH0gZWxzZSBpZiAoa2xhc3MgPT0gY01hcCkgewotICAgIHJldHVybiBNYXBfZGVlcF9jb3B5KG9iaik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE1lc3NhZ2VfZGVlcF9jb3B5KG9iaik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL3Byb3RvYnVmLmMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9wcm90b2J1Zi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3Y2RlNGFlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL3Byb3RvYnVmLmMKKysrIC9kZXYvbnVsbApAQCAtMSwxMTUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpbmNsdWRlICJwcm90b2J1Zi5oIgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gR2xvYmFsIG1hcCBmcm9tIHVwYiB7bXNnLGVudW19ZGVmcyB0byB3cmFwcGVyIERlc2NyaXB0b3IvRW51bURlc2NyaXB0b3IKLS8vIGluc3RhbmNlcy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFRoaXMgaXMgYSBoYXNoIHRhYmxlIGZyb20gZGVmIG9iamVjdHMgKGVuY29kZWQgYnkgY29udmVydGluZyBwb2ludGVycyB0bwotLy8gUnVieSBpbnRlZ2VycykgdG8gTWVzc2FnZURlZi9FbnVtRGVmIGluc3RhbmNlcyAoYXMgUnVieSB2YWx1ZXMpLgotVkFMVUUgdXBiX2RlZl90b19ydWJ5X29ial9tYXA7Ci0KLVZBTFVFIGNFcnJvcjsKLVZBTFVFIGNQYXJzZUVycm9yOwotCi12b2lkIGFkZF9kZWZfb2JqKGNvbnN0IHZvaWQqIGRlZiwgVkFMVUUgdmFsdWUpIHsKLSAgcmJfaGFzaF9hc2V0KHVwYl9kZWZfdG9fcnVieV9vYmpfbWFwLCBVTEwyTlVNKChpbnRwdHJfdClkZWYpLCB2YWx1ZSk7Ci19Ci0KLVZBTFVFIGdldF9kZWZfb2JqKGNvbnN0IHZvaWQqIGRlZikgewotICByZXR1cm4gcmJfaGFzaF9hcmVmKHVwYl9kZWZfdG9fcnVieV9vYmpfbWFwLCBVTEwyTlVNKChpbnRwdHJfdClkZWYpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFV0aWxpdGllcy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFJhaXNlcyBhIFJ1YnkgZXJyb3IgaWYgfHN0YXR1c3wgaXMgbm90IE9LLCB1c2luZyBpdHMgZXJyb3IgbWVzc2FnZS4KLXZvaWQgY2hlY2tfdXBiX3N0YXR1cyhjb25zdCB1cGJfc3RhdHVzKiBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZykgewotICBpZiAoIXVwYl9vayhzdGF0dXMpKSB7Ci0gICAgcmJfcmFpc2UocmJfZVJ1bnRpbWVFcnJvciwgIiVzOiAlc1xuIiwgbXNnLCB1cGJfc3RhdHVzX2Vycm1zZyhzdGF0dXMpKTsKLSAgfQotfQotCi0vLyBTdHJpbmcgZW5jb2RpbmdzOiB3ZSBsb29rIHRoZXNlIHVwIG9uY2UsIGF0IGxvYWQgdGltZSwgYW5kIHRoZW4gY2FjaGUgdGhlbQotLy8gaGVyZS4KLXJiX2VuY29kaW5nKiBrUnVieVN0cmluZ1V0ZjhFbmNvZGluZzsKLXJiX2VuY29kaW5nKiBrUnVieVN0cmluZ0FTQ0lJRW5jb2Rpbmc7Ci1yYl9lbmNvZGluZyoga1J1YnlTdHJpbmc4Yml0RW5jb2Rpbmc7Ci0KLS8vIFJ1YnktaW50ZXJuZWQgc3RyaW5nOiAiZGVzY3JpcHRvciIuIFdlIHVzZSB0aGlzIGlkZW50aWZpZXIgdG8gc3RvcmUgYW4KLS8vIGluc3RhbmNlIHZhcmlhYmxlIG9uIG1lc3NhZ2UgY2xhc3NlcyB3ZSBjcmVhdGUgaW4gb3JkZXIgdG8gbGluayB0aGVtIGJhY2sgdG8KLS8vIHRoZWlyIGRlc2NyaXB0b3JzLgotLy8KLS8vIFdlIGludGVybiB0aGlzIG9uY2UgYXQgbW9kdWxlIGxvYWQgdGltZSB0aGVuIHVzZSB0aGUgaW50ZXJuZWQgaWRlbnRpZmllciBhdAotLy8gcnVudGltZSBpbiBvcmRlciB0byBhdm9pZCB0aGUgY29zdCBvZiByZXBlYXRlZGx5IGludGVybmluZyBpbiBob3QgcGF0aHMuCi1jb25zdCBjaGFyKiBrRGVzY3JpcHRvckluc3RhbmNlVmFyID0gImRlc2NyaXB0b3IiOwotSUQgZGVzY3JpcHRvcl9pbnN0YW5jZXZhcl9pbnRlcm5lZDsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEluaXRpYWxpemF0aW9uL2VudHJ5IHBvaW50LgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVGhpcyBtdXN0IGJlIG5hbWVkICJJbml0X3Byb3RvYnVmX2MiIGJlY2F1c2UgdGhlIFJ1YnkgbW9kdWxlIGlzIG5hbWVkCi0vLyAicHJvdG9idWZfYyIgLS0gdGhlIFZNIGxvb2tzIGZvciB0aGlzIHN5bWJvbCBpbiBvdXIgLnNvLgotdm9pZCBJbml0X3Byb3RvYnVmX2MoKSB7Ci0gIFZBTFVFIGdvb2dsZSA9IHJiX2RlZmluZV9tb2R1bGUoIkdvb2dsZSIpOwotICBWQUxVRSBwcm90b2J1ZiA9IHJiX2RlZmluZV9tb2R1bGVfdW5kZXIoZ29vZ2xlLCAiUHJvdG9idWYiKTsKLSAgVkFMVUUgaW50ZXJuYWwgPSByYl9kZWZpbmVfbW9kdWxlX3VuZGVyKHByb3RvYnVmLCAiSW50ZXJuYWwiKTsKLQotICBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkID0gcmJfaW50ZXJuKGtEZXNjcmlwdG9ySW5zdGFuY2VWYXIpOwotICBEZXNjcmlwdG9yUG9vbF9yZWdpc3Rlcihwcm90b2J1Zik7Ci0gIERlc2NyaXB0b3JfcmVnaXN0ZXIocHJvdG9idWYpOwotICBGaWVsZERlc2NyaXB0b3JfcmVnaXN0ZXIocHJvdG9idWYpOwotICBPbmVvZkRlc2NyaXB0b3JfcmVnaXN0ZXIocHJvdG9idWYpOwotICBFbnVtRGVzY3JpcHRvcl9yZWdpc3Rlcihwcm90b2J1Zik7Ci0gIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9yZWdpc3RlcihpbnRlcm5hbCk7Ci0gIE9uZW9mQnVpbGRlckNvbnRleHRfcmVnaXN0ZXIoaW50ZXJuYWwpOwotICBFbnVtQnVpbGRlckNvbnRleHRfcmVnaXN0ZXIoaW50ZXJuYWwpOwotICBCdWlsZGVyX3JlZ2lzdGVyKGludGVybmFsKTsKLSAgUmVwZWF0ZWRGaWVsZF9yZWdpc3Rlcihwcm90b2J1Zik7Ci0gIE1hcF9yZWdpc3Rlcihwcm90b2J1Zik7Ci0KLSAgY0Vycm9yID0gcmJfY29uc3RfZ2V0KHByb3RvYnVmLCByYl9pbnRlcm4oIkVycm9yIikpOwotICBjUGFyc2VFcnJvciA9IHJiX2NvbnN0X2dldChwcm90b2J1ZiwgcmJfaW50ZXJuKCJQYXJzZUVycm9yIikpOwotCi0gIHJiX2RlZmluZV9zaW5nbGV0b25fbWV0aG9kKHByb3RvYnVmLCAiZGVlcF9jb3B5IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR29vZ2xlX1Byb3RvYnVmX2RlZXBfY29weSwgMSk7Ci0KLSAga1J1YnlTdHJpbmdVdGY4RW5jb2RpbmcgPSByYl91dGY4X2VuY29kaW5nKCk7Ci0gIGtSdWJ5U3RyaW5nQVNDSUlFbmNvZGluZyA9IHJiX3VzYXNjaWlfZW5jb2RpbmcoKTsKLSAga1J1YnlTdHJpbmc4Yml0RW5jb2RpbmcgPSByYl9hc2NpaThiaXRfZW5jb2RpbmcoKTsKLQotICB1cGJfZGVmX3RvX3J1Ynlfb2JqX21hcCA9IHJiX2hhc2hfbmV3KCk7Ci0gIHJiX2djX3JlZ2lzdGVyX2FkZHJlc3MoJnVwYl9kZWZfdG9fcnVieV9vYmpfbWFwKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL3Byb3RvYnVmLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9wcm90b2J1Zi5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODM0Yzg5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL3Byb3RvYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1MzggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpZm5kZWYgX19HT09HTEVfUFJPVE9CVUZfUlVCWV9QUk9UT0JVRl9IX18KLSNkZWZpbmUgX19HT09HTEVfUFJPVE9CVUZfUlVCWV9QUk9UT0JVRl9IX18KLQotI2luY2x1ZGUgPHJ1YnkvcnVieS5oPgotI2luY2x1ZGUgPHJ1Ynkvdm0uaD4KLSNpbmNsdWRlIDxydWJ5L2VuY29kaW5nLmg+Ci0KLSNpbmNsdWRlICJ1cGIuaCIKLQotLy8gRm9yd2FyZCBkZWNscy4KLXN0cnVjdCBEZXNjcmlwdG9yUG9vbDsKLXN0cnVjdCBEZXNjcmlwdG9yOwotc3RydWN0IEZpZWxkRGVzY3JpcHRvcjsKLXN0cnVjdCBFbnVtRGVzY3JpcHRvcjsKLXN0cnVjdCBNZXNzYWdlTGF5b3V0Owotc3RydWN0IE1lc3NhZ2VGaWVsZDsKLXN0cnVjdCBNZXNzYWdlSGVhZGVyOwotc3RydWN0IE1lc3NhZ2VCdWlsZGVyQ29udGV4dDsKLXN0cnVjdCBFbnVtQnVpbGRlckNvbnRleHQ7Ci1zdHJ1Y3QgQnVpbGRlcjsKLQotdHlwZWRlZiBzdHJ1Y3QgRGVzY3JpcHRvclBvb2wgRGVzY3JpcHRvclBvb2w7Ci10eXBlZGVmIHN0cnVjdCBEZXNjcmlwdG9yIERlc2NyaXB0b3I7Ci10eXBlZGVmIHN0cnVjdCBGaWVsZERlc2NyaXB0b3IgRmllbGREZXNjcmlwdG9yOwotdHlwZWRlZiBzdHJ1Y3QgT25lb2ZEZXNjcmlwdG9yIE9uZW9mRGVzY3JpcHRvcjsKLXR5cGVkZWYgc3RydWN0IEVudW1EZXNjcmlwdG9yIEVudW1EZXNjcmlwdG9yOwotdHlwZWRlZiBzdHJ1Y3QgTWVzc2FnZUxheW91dCBNZXNzYWdlTGF5b3V0OwotdHlwZWRlZiBzdHJ1Y3QgTWVzc2FnZUZpZWxkIE1lc3NhZ2VGaWVsZDsKLXR5cGVkZWYgc3RydWN0IE1lc3NhZ2VIZWFkZXIgTWVzc2FnZUhlYWRlcjsKLXR5cGVkZWYgc3RydWN0IE1lc3NhZ2VCdWlsZGVyQ29udGV4dCBNZXNzYWdlQnVpbGRlckNvbnRleHQ7Ci10eXBlZGVmIHN0cnVjdCBPbmVvZkJ1aWxkZXJDb250ZXh0IE9uZW9mQnVpbGRlckNvbnRleHQ7Ci10eXBlZGVmIHN0cnVjdCBFbnVtQnVpbGRlckNvbnRleHQgRW51bUJ1aWxkZXJDb250ZXh0OwotdHlwZWRlZiBzdHJ1Y3QgQnVpbGRlciBCdWlsZGVyOwotCi0vKgotIEl0IGNhbiBiZSBhIGJpdCBjb25mdXNpbmcgaG93IHRoZSBDIHN0cnVjdHMgZGVmaW5lZCBiZWxvdyBhbmQgdGhlIFJ1YnkKLSBvYmplY3RzIGludGVyYWN0IGFuZCBob2xkIHJlZmVyZW5jZXMgdG8gZWFjaCBvdGhlci4gRmlyc3QsIGEgZmV3IHByaW5jaXBsZXM6Ci0KLSAtIFJ1YnkncyAiVHlwZWREYXRhIiBhYnN0cmFjdGlvbiBsZXRzIGEgUnVieSBWQUxVRSBob2xkIGEgcG9pbnRlciB0byBhIEMKLSAgIHN0cnVjdCAob3IgYXJiaXRyYXJ5IG1lbW9yeSBjaHVuayksIG93biBpdCwgYW5kIGZyZWUgaXQgd2hlbiBjb2xsZWN0ZWQuCi0gICBUaHVzLCBlYWNoIHN0cnVjdCBiZWxvdyB3aWxsIGhhdmUgYSBjb3JyZXNwb25kaW5nIFJ1Ynkgb2JqZWN0Ci0gICB3cmFwcGluZy9vd25pbmcgaXQuCi0KLSAtIFRvIGdldCBiYWNrIGZyb20gYW4gdW5kZXJseWluZyB1cGIge21zZyxlbnVtfWRlZiB0byB0aGUgUnVieSBvYmplY3QsIHdlCi0gICBrZWVwIGEgZ2xvYmFsIGhhc2htYXAsIGFjY2Vzc2VkIGJ5IGdldF9kZWZfb2JqL2FkZF9kZWZfb2JqIGJlbG93LgotCi0gVGhlIGluLW1lbW9yeSBzdHJ1Y3R1cmUgaXMgdGhlbiBzb21ldGhpbmcgbGlrZToKLQotICAgUnVieSAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICB1cGIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICBEZXNjcmlwdG9yUG9vbCAgLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tPiB1cGJfc3ltdGFiX19fX19fX19fX19fX19fX19fX18KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHwgKG1lc3NhZ2UgdHlwZXMpICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8ICAgICAgICAgICAgICAgIHYgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBEZXNjcmlwdG9yICAgLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tPiB1cGJfbXNnZGVmICAgICAgICAgKGVudW0gdHlwZXMpfAotICAgIHwtLT4gbXNnY2xhc3MgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgfCAgIF4gICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICB8ICAgIChkeW5hbWljYWxseSBidWlsdCkgICB8ICAgICAgICAgICAgICAgIHwgICB8IChzdWJtc2cgZmllbGRzKSAgICAgICB8Ci0gICAgfC0tPiBNZXNzYWdlTGF5b3V0ICAgICAgICAgfCAgICAgICAgICAgICAgICB8ICAgfCAgICAgICAgICAgICAgICAgICAgICAgLwotICAgIHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw+IGRlY29kZXIgbWV0aG9kfCAgIHwgICAgICAgICAgICAgICAgICAgICAgLwotICAgIFwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXw+IHNlcmlhbGl6ZSAgICAgfCAgIHwgICAgICAgICAgICAgICAgICAgICAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgaGFuZGxlcnMgICAgICB2ICAgfCAgICAgICAgICAgICAgICAgICAgLwotICAgRmllbGREZXNjcmlwdG9yICAtLS0tLS0tLS0tLXwtLS0tLS0tLS0tLT4gdXBiX2ZpZWxkZGVmICAgICAgICAgICAgICAgLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAvCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgdiAoZW51bSBmaWVsZHMpICAgLwotICAgRW51bURlc2NyaXB0b3IgIC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLT4gdXBiX2VudW1kZWYgIDwtLS0tLS0tLS0tJwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8Ci0gICAgICAgICAgICAgICBeICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgIFxfX18vCi0gICAgICAgICAgICAgICBgLS0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tJyAgICAoZ2V0X2RlZl9vYmogbWFwKQotICovCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSdWJ5IGNsYXNzIHN0cnVjdHVyZSBkZWZpbml0aW9ucy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXN0cnVjdCBEZXNjcmlwdG9yUG9vbCB7Ci0gIHVwYl9zeW10YWIqIHN5bXRhYjsKLX07Ci0KLXN0cnVjdCBEZXNjcmlwdG9yIHsKLSAgY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmOwotICBNZXNzYWdlTGF5b3V0KiBsYXlvdXQ7Ci0gIFZBTFVFIGtsYXNzOyAgLy8gYmVnaW5zIGFzIG5pbAotICBjb25zdCB1cGJfaGFuZGxlcnMqIGZpbGxfaGFuZGxlcnM7Ci0gIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QqIGZpbGxfbWV0aG9kOwotICBjb25zdCB1cGJfanNvbl9wYXJzZXJtZXRob2QqIGpzb25fZmlsbF9tZXRob2Q7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyogcGJfc2VyaWFsaXplX2hhbmRsZXJzOwotICBjb25zdCB1cGJfaGFuZGxlcnMqIGpzb25fc2VyaWFsaXplX2hhbmRsZXJzOwotICBjb25zdCB1cGJfaGFuZGxlcnMqIGpzb25fc2VyaWFsaXplX2hhbmRsZXJzX3ByZXNlcnZlOwotICAvLyBIYW5kbGVycyBob2xkIHR5cGUgY2xhc3MgcmVmZXJlbmNlcyBmb3Igc3ViLW1lc3NhZ2UgZmllbGRzIGRpcmVjdGx5IGluIHNvbWUKLSAgLy8gY2FzZXMuIFdlIG5lZWQgdG8ga2VlcCB0aGVzZSByb290ZWQgYmVjYXVzZSB0aGV5IG1pZ2h0IG90aGVyd2lzZSBiZQotICAvLyBjb2xsZWN0ZWQuCi0gIFZBTFVFIHR5cGVjbGFzc19yZWZlcmVuY2VzOwotfTsKLQotc3RydWN0IEZpZWxkRGVzY3JpcHRvciB7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGRkZWY7Ci19OwotCi1zdHJ1Y3QgT25lb2ZEZXNjcmlwdG9yIHsKLSAgY29uc3QgdXBiX29uZW9mZGVmKiBvbmVvZmRlZjsKLX07Ci0KLXN0cnVjdCBFbnVtRGVzY3JpcHRvciB7Ci0gIGNvbnN0IHVwYl9lbnVtZGVmKiBlbnVtZGVmOwotICBWQUxVRSBtb2R1bGU7ICAvLyBiZWdpbnMgYXMgbmlsCi19OwotCi1zdHJ1Y3QgTWVzc2FnZUJ1aWxkZXJDb250ZXh0IHsKLSAgVkFMVUUgZGVzY3JpcHRvcjsKLSAgVkFMVUUgYnVpbGRlcjsKLX07Ci0KLXN0cnVjdCBPbmVvZkJ1aWxkZXJDb250ZXh0IHsKLSAgVkFMVUUgZGVzY3JpcHRvcjsKLSAgVkFMVUUgYnVpbGRlcjsKLX07Ci0KLXN0cnVjdCBFbnVtQnVpbGRlckNvbnRleHQgewotICBWQUxVRSBlbnVtZGVzYzsKLX07Ci0KLXN0cnVjdCBCdWlsZGVyIHsKLSAgVkFMVUUgcGVuZGluZ19saXN0OwotICB1cGJfZGVmKiogZGVmczsgIC8vIHVzZWQgb25seSB3aGlsZSBmaW5hbGl6aW5nCi19OwotCi1leHRlcm4gVkFMVUUgY0Rlc2NyaXB0b3JQb29sOwotZXh0ZXJuIFZBTFVFIGNEZXNjcmlwdG9yOwotZXh0ZXJuIFZBTFVFIGNGaWVsZERlc2NyaXB0b3I7Ci1leHRlcm4gVkFMVUUgY0VudW1EZXNjcmlwdG9yOwotZXh0ZXJuIFZBTFVFIGNNZXNzYWdlQnVpbGRlckNvbnRleHQ7Ci1leHRlcm4gVkFMVUUgY09uZW9mQnVpbGRlckNvbnRleHQ7Ci1leHRlcm4gVkFMVUUgY0VudW1CdWlsZGVyQ29udGV4dDsKLWV4dGVybiBWQUxVRSBjQnVpbGRlcjsKLQotZXh0ZXJuIFZBTFVFIGNFcnJvcjsKLWV4dGVybiBWQUxVRSBjUGFyc2VFcnJvcjsKLQotLy8gV2UgZm9yd2FyZC1kZWNsYXJlIGFsbCBvZiB0aGUgUnVieSBtZXRob2QgaW1wbGVtZW50YXRpb25zIGhlcmUgYmVjYXVzZSB3ZQotLy8gc29tZXRpbWVzIGNhbGwgdGhlIG1ldGhvZHMgZGlyZWN0bHkgYWNyb3NzIC5jIGZpbGVzLCByYXRoZXIgdGhhbiBnb2luZwotLy8gdGhyb3VnaCBSdWJ5J3MgbWV0aG9kIGRpc3BhdGNoaW5nIChlLmcuIGR1cmluZyBtZXNzYWdlIHBhcnNlKS4gSXQncyBjbGVhbmVyCi0vLyB0byBrZWVwIHRoZSBsaXN0IG9mIG9iamVjdCBtZXRob2RzIHRvZ2V0aGVyIHRoYW4gdG8gc3BsaXQgdGhlbSBiZXR3ZWVuCi0vLyBzdGF0aWMtaW4tZmlsZSBkZWZpbml0aW9ucyBhbmQgaGVhZGVyIGRlY2xhcmF0aW9ucy4KLQotdm9pZCBEZXNjcmlwdG9yUG9vbF9tYXJrKHZvaWQqIF9zZWxmKTsKLXZvaWQgRGVzY3JpcHRvclBvb2xfZnJlZSh2b2lkKiBfc2VsZik7Ci1WQUxVRSBEZXNjcmlwdG9yUG9vbF9hbGxvYyhWQUxVRSBrbGFzcyk7Ci12b2lkIERlc2NyaXB0b3JQb29sX3JlZ2lzdGVyKFZBTFVFIG1vZHVsZSk7Ci1EZXNjcmlwdG9yUG9vbCogcnVieV90b19EZXNjcmlwdG9yUG9vbChWQUxVRSB2YWx1ZSk7Ci1WQUxVRSBEZXNjcmlwdG9yUG9vbF9hZGQoVkFMVUUgX3NlbGYsIFZBTFVFIGRlZik7Ci1WQUxVRSBEZXNjcmlwdG9yUG9vbF9idWlsZChWQUxVRSBfc2VsZik7Ci1WQUxVRSBEZXNjcmlwdG9yUG9vbF9sb29rdXAoVkFMVUUgX3NlbGYsIFZBTFVFIG5hbWUpOwotVkFMVUUgRGVzY3JpcHRvclBvb2xfZ2VuZXJhdGVkX3Bvb2woVkFMVUUgX3NlbGYpOwotCi12b2lkIERlc2NyaXB0b3JfbWFyayh2b2lkKiBfc2VsZik7Ci12b2lkIERlc2NyaXB0b3JfZnJlZSh2b2lkKiBfc2VsZik7Ci1WQUxVRSBEZXNjcmlwdG9yX2FsbG9jKFZBTFVFIGtsYXNzKTsKLXZvaWQgRGVzY3JpcHRvcl9yZWdpc3RlcihWQUxVRSBtb2R1bGUpOwotRGVzY3JpcHRvciogcnVieV90b19EZXNjcmlwdG9yKFZBTFVFIHZhbHVlKTsKLVZBTFVFIERlc2NyaXB0b3JfbmFtZShWQUxVRSBfc2VsZik7Ci1WQUxVRSBEZXNjcmlwdG9yX25hbWVfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBzdHIpOwotVkFMVUUgRGVzY3JpcHRvcl9lYWNoKFZBTFVFIF9zZWxmKTsKLVZBTFVFIERlc2NyaXB0b3JfbG9va3VwKFZBTFVFIF9zZWxmLCBWQUxVRSBuYW1lKTsKLVZBTFVFIERlc2NyaXB0b3JfYWRkX2ZpZWxkKFZBTFVFIF9zZWxmLCBWQUxVRSBvYmopOwotVkFMVUUgRGVzY3JpcHRvcl9hZGRfb25lb2YoVkFMVUUgX3NlbGYsIFZBTFVFIG9iaik7Ci1WQUxVRSBEZXNjcmlwdG9yX2VhY2hfb25lb2YoVkFMVUUgX3NlbGYpOwotVkFMVUUgRGVzY3JpcHRvcl9sb29rdXBfb25lb2YoVkFMVUUgX3NlbGYsIFZBTFVFIG5hbWUpOwotVkFMVUUgRGVzY3JpcHRvcl9tc2djbGFzcyhWQUxVRSBfc2VsZik7Ci1leHRlcm4gY29uc3QgcmJfZGF0YV90eXBlX3QgX0Rlc2NyaXB0b3JfdHlwZTsKLQotdm9pZCBGaWVsZERlc2NyaXB0b3JfbWFyayh2b2lkKiBfc2VsZik7Ci12b2lkIEZpZWxkRGVzY3JpcHRvcl9mcmVlKHZvaWQqIF9zZWxmKTsKLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9hbGxvYyhWQUxVRSBrbGFzcyk7Ci12b2lkIEZpZWxkRGVzY3JpcHRvcl9yZWdpc3RlcihWQUxVRSBtb2R1bGUpOwotRmllbGREZXNjcmlwdG9yKiBydWJ5X3RvX0ZpZWxkRGVzY3JpcHRvcihWQUxVRSB2YWx1ZSk7Ci1WQUxVRSBGaWVsZERlc2NyaXB0b3JfbmFtZShWQUxVRSBfc2VsZik7Ci1WQUxVRSBGaWVsZERlc2NyaXB0b3JfbmFtZV9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIHN0cik7Ci1WQUxVRSBGaWVsZERlc2NyaXB0b3JfdHlwZShWQUxVRSBfc2VsZik7Ci1WQUxVRSBGaWVsZERlc2NyaXB0b3JfdHlwZV9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIHR5cGUpOwotVkFMVUUgRmllbGREZXNjcmlwdG9yX2xhYmVsKFZBTFVFIF9zZWxmKTsKLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9sYWJlbF9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIGxhYmVsKTsKLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9udW1iZXIoVkFMVUUgX3NlbGYpOwotVkFMVUUgRmllbGREZXNjcmlwdG9yX251bWJlcl9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIG51bWJlcik7Ci1WQUxVRSBGaWVsZERlc2NyaXB0b3Jfc3VibXNnX25hbWUoVkFMVUUgX3NlbGYpOwotVkFMVUUgRmllbGREZXNjcmlwdG9yX3N1Ym1zZ19uYW1lX3NldChWQUxVRSBfc2VsZiwgVkFMVUUgdmFsdWUpOwotVkFMVUUgRmllbGREZXNjcmlwdG9yX3N1YnR5cGUoVkFMVUUgX3NlbGYpOwotVkFMVUUgRmllbGREZXNjcmlwdG9yX2dldChWQUxVRSBfc2VsZiwgVkFMVUUgbXNnX3JiKTsKLVZBTFVFIEZpZWxkRGVzY3JpcHRvcl9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIG1zZ19yYiwgVkFMVUUgdmFsdWUpOwotdXBiX2ZpZWxkdHlwZV90IHJ1YnlfdG9fZmllbGR0eXBlKFZBTFVFIHR5cGUpOwotVkFMVUUgZmllbGR0eXBlX3RvX3J1YnkodXBiX2ZpZWxkdHlwZV90IHR5cGUpOwotCi12b2lkIE9uZW9mRGVzY3JpcHRvcl9tYXJrKHZvaWQqIF9zZWxmKTsKLXZvaWQgT25lb2ZEZXNjcmlwdG9yX2ZyZWUodm9pZCogX3NlbGYpOwotVkFMVUUgT25lb2ZEZXNjcmlwdG9yX2FsbG9jKFZBTFVFIGtsYXNzKTsKLXZvaWQgT25lb2ZEZXNjcmlwdG9yX3JlZ2lzdGVyKFZBTFVFIG1vZHVsZSk7Ci1PbmVvZkRlc2NyaXB0b3IqIHJ1YnlfdG9fT25lb2ZEZXNjcmlwdG9yKFZBTFVFIHZhbHVlKTsKLVZBTFVFIE9uZW9mRGVzY3JpcHRvcl9uYW1lKFZBTFVFIF9zZWxmKTsKLVZBTFVFIE9uZW9mRGVzY3JpcHRvcl9uYW1lX3NldChWQUxVRSBfc2VsZiwgVkFMVUUgdmFsdWUpOwotVkFMVUUgT25lb2ZEZXNjcmlwdG9yX2FkZF9maWVsZChWQUxVRSBfc2VsZiwgVkFMVUUgZmllbGQpOwotVkFMVUUgT25lb2ZEZXNjcmlwdG9yX2VhY2goVkFMVUUgX3NlbGYsIFZBTFVFIGZpZWxkKTsKLQotdm9pZCBFbnVtRGVzY3JpcHRvcl9tYXJrKHZvaWQqIF9zZWxmKTsKLXZvaWQgRW51bURlc2NyaXB0b3JfZnJlZSh2b2lkKiBfc2VsZik7Ci1WQUxVRSBFbnVtRGVzY3JpcHRvcl9hbGxvYyhWQUxVRSBrbGFzcyk7Ci12b2lkIEVudW1EZXNjcmlwdG9yX3JlZ2lzdGVyKFZBTFVFIG1vZHVsZSk7Ci1FbnVtRGVzY3JpcHRvciogcnVieV90b19FbnVtRGVzY3JpcHRvcihWQUxVRSB2YWx1ZSk7Ci1WQUxVRSBFbnVtRGVzY3JpcHRvcl9uYW1lKFZBTFVFIF9zZWxmKTsKLVZBTFVFIEVudW1EZXNjcmlwdG9yX25hbWVfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBzdHIpOwotVkFMVUUgRW51bURlc2NyaXB0b3JfYWRkX3ZhbHVlKFZBTFVFIF9zZWxmLCBWQUxVRSBuYW1lLCBWQUxVRSBudW1iZXIpOwotVkFMVUUgRW51bURlc2NyaXB0b3JfbG9va3VwX25hbWUoVkFMVUUgX3NlbGYsIFZBTFVFIG5hbWUpOwotVkFMVUUgRW51bURlc2NyaXB0b3JfbG9va3VwX3ZhbHVlKFZBTFVFIF9zZWxmLCBWQUxVRSBudW1iZXIpOwotVkFMVUUgRW51bURlc2NyaXB0b3JfZWFjaChWQUxVRSBfc2VsZik7Ci1WQUxVRSBFbnVtRGVzY3JpcHRvcl9lbnVtbW9kdWxlKFZBTFVFIF9zZWxmKTsKLWV4dGVybiBjb25zdCByYl9kYXRhX3R5cGVfdCBfRW51bURlc2NyaXB0b3JfdHlwZTsKLQotdm9pZCBNZXNzYWdlQnVpbGRlckNvbnRleHRfbWFyayh2b2lkKiBfc2VsZik7Ci12b2lkIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9mcmVlKHZvaWQqIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9hbGxvYyhWQUxVRSBrbGFzcyk7Ci12b2lkIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9yZWdpc3RlcihWQUxVRSBtb2R1bGUpOwotTWVzc2FnZUJ1aWxkZXJDb250ZXh0KiBydWJ5X3RvX01lc3NhZ2VCdWlsZGVyQ29udGV4dChWQUxVRSB2YWx1ZSk7Ci1WQUxVRSBNZXNzYWdlQnVpbGRlckNvbnRleHRfaW5pdGlhbGl6ZShWQUxVRSBfc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSBidWlsZGVyKTsKLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9vcHRpb25hbChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9yZXF1aXJlZChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9yZXBlYXRlZChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VCdWlsZGVyQ29udGV4dF9tYXAoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBfc2VsZik7Ci1WQUxVRSBNZXNzYWdlQnVpbGRlckNvbnRleHRfb25lb2YoVkFMVUUgX3NlbGYsIFZBTFVFIG5hbWUpOwotCi12b2lkIE9uZW9mQnVpbGRlckNvbnRleHRfbWFyayh2b2lkKiBfc2VsZik7Ci12b2lkIE9uZW9mQnVpbGRlckNvbnRleHRfZnJlZSh2b2lkKiBfc2VsZik7Ci1WQUxVRSBPbmVvZkJ1aWxkZXJDb250ZXh0X2FsbG9jKFZBTFVFIGtsYXNzKTsKLXZvaWQgT25lb2ZCdWlsZGVyQ29udGV4dF9yZWdpc3RlcihWQUxVRSBtb2R1bGUpOwotT25lb2ZCdWlsZGVyQ29udGV4dCogcnVieV90b19PbmVvZkJ1aWxkZXJDb250ZXh0KFZBTFVFIHZhbHVlKTsKLVZBTFVFIE9uZW9mQnVpbGRlckNvbnRleHRfaW5pdGlhbGl6ZShWQUxVRSBfc2VsZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBTFVFIGJ1aWxkZXIpOwotVkFMVUUgT25lb2ZCdWlsZGVyQ29udGV4dF9vcHRpb25hbChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKTsKLQotdm9pZCBFbnVtQnVpbGRlckNvbnRleHRfbWFyayh2b2lkKiBfc2VsZik7Ci12b2lkIEVudW1CdWlsZGVyQ29udGV4dF9mcmVlKHZvaWQqIF9zZWxmKTsKLVZBTFVFIEVudW1CdWlsZGVyQ29udGV4dF9hbGxvYyhWQUxVRSBrbGFzcyk7Ci12b2lkIEVudW1CdWlsZGVyQ29udGV4dF9yZWdpc3RlcihWQUxVRSBtb2R1bGUpOwotRW51bUJ1aWxkZXJDb250ZXh0KiBydWJ5X3RvX0VudW1CdWlsZGVyQ29udGV4dChWQUxVRSB2YWx1ZSk7Ci1WQUxVRSBFbnVtQnVpbGRlckNvbnRleHRfaW5pdGlhbGl6ZShWQUxVRSBfc2VsZiwgVkFMVUUgZW51bWRlc2MpOwotVkFMVUUgRW51bUJ1aWxkZXJDb250ZXh0X3ZhbHVlKFZBTFVFIF9zZWxmLCBWQUxVRSBuYW1lLCBWQUxVRSBudW1iZXIpOwotCi12b2lkIEJ1aWxkZXJfbWFyayh2b2lkKiBfc2VsZik7Ci12b2lkIEJ1aWxkZXJfZnJlZSh2b2lkKiBfc2VsZik7Ci1WQUxVRSBCdWlsZGVyX2FsbG9jKFZBTFVFIGtsYXNzKTsKLXZvaWQgQnVpbGRlcl9yZWdpc3RlcihWQUxVRSBtb2R1bGUpOwotQnVpbGRlciogcnVieV90b19CdWlsZGVyKFZBTFVFIHZhbHVlKTsKLVZBTFVFIEJ1aWxkZXJfYWRkX21lc3NhZ2UoVkFMVUUgX3NlbGYsIFZBTFVFIG5hbWUpOwotVkFMVUUgQnVpbGRlcl9hZGRfZW51bShWQUxVRSBfc2VsZiwgVkFMVUUgbmFtZSk7Ci1WQUxVRSBCdWlsZGVyX2ZpbmFsaXplX3RvX3Bvb2woVkFMVUUgX3NlbGYsIFZBTFVFIHBvb2xfcmIpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTmF0aXZlIHNsb3Qgc3RvcmFnZSBhYnN0cmFjdGlvbi4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgTkFUSVZFX1NMT1RfTUFYX1NJWkUgc2l6ZW9mKHVpbnQ2NF90KQotCi1zaXplX3QgbmF0aXZlX3Nsb3Rfc2l6ZSh1cGJfZmllbGR0eXBlX3QgdHlwZSk7Ci12b2lkIG5hdGl2ZV9zbG90X3NldCh1cGJfZmllbGR0eXBlX3QgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIFZBTFVFIHR5cGVfY2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICB2b2lkKiBtZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICBWQUxVRSB2YWx1ZSk7Ci0vLyBBdG9taWNhbGx5ICh3aXRoIHJlc3BlY3QgdG8gUnVieSBWTSBjYWxscykgZWl0aGVyIHVwZGF0ZSB0aGUgdmFsdWUgYW5kIHNldCBhCi0vLyBvbmVvZiBjYXNlLCBvciBkbyBuZWl0aGVyLiBJZiB8Y2FzZV9tZW1vcnl8IGlzIG51bGwsIHRoZW4gbm8gY2FzZSB2YWx1ZSBpcwotLy8gc2V0Lgotdm9pZCBuYXRpdmVfc2xvdF9zZXRfdmFsdWVfYW5kX2Nhc2UodXBiX2ZpZWxkdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSB0eXBlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbWVtb3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVkFMVUUgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCogY2FzZV9tZW1vcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBjYXNlX251bWJlcik7Ci1WQUxVRSBuYXRpdmVfc2xvdF9nZXQodXBiX2ZpZWxkdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUUgdHlwZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtZW1vcnkpOwotdm9pZCBuYXRpdmVfc2xvdF9pbml0KHVwYl9maWVsZHR5cGVfdCB0eXBlLCB2b2lkKiBtZW1vcnkpOwotdm9pZCBuYXRpdmVfc2xvdF9tYXJrKHVwYl9maWVsZHR5cGVfdCB0eXBlLCB2b2lkKiBtZW1vcnkpOwotdm9pZCBuYXRpdmVfc2xvdF9kdXAodXBiX2ZpZWxkdHlwZV90IHR5cGUsIHZvaWQqIHRvLCB2b2lkKiBmcm9tKTsKLXZvaWQgbmF0aXZlX3Nsb3RfZGVlcF9jb3B5KHVwYl9maWVsZHR5cGVfdCB0eXBlLCB2b2lkKiB0bywgdm9pZCogZnJvbSk7Ci1ib29sIG5hdGl2ZV9zbG90X2VxKHVwYl9maWVsZHR5cGVfdCB0eXBlLCB2b2lkKiBtZW0xLCB2b2lkKiBtZW0yKTsKLQotdm9pZCBuYXRpdmVfc2xvdF92YWxpZGF0ZV9zdHJpbmdfZW5jb2RpbmcodXBiX2ZpZWxkdHlwZV90IHR5cGUsIFZBTFVFIHZhbHVlKTsKLXZvaWQgbmF0aXZlX3Nsb3RfY2hlY2tfaW50X3JhbmdlX3ByZWNpc2lvbih1cGJfZmllbGR0eXBlX3QgdHlwZSwgVkFMVUUgdmFsdWUpOwotCi1leHRlcm4gcmJfZW5jb2RpbmcqIGtSdWJ5U3RyaW5nVXRmOEVuY29kaW5nOwotZXh0ZXJuIHJiX2VuY29kaW5nKiBrUnVieVN0cmluZ0FTQ0lJRW5jb2Rpbmc7Ci1leHRlcm4gcmJfZW5jb2RpbmcqIGtSdWJ5U3RyaW5nOGJpdEVuY29kaW5nOwotCi1WQUxVRSBmaWVsZF90eXBlX2NsYXNzKGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQpOwotCi0jZGVmaW5lIE1BUF9LRVlfRklFTEQgMQotI2RlZmluZSBNQVBfVkFMVUVfRklFTEQgMgotCi0vLyBPbmVvZiBjYXNlIHNsb3QgdmFsdWUgdG8gaW5kaWNhdGUgdGhhdCBubyBvbmVvZiBjYXNlIGlzIHNldC4gVGhlIHZhbHVlIGAwYCBpcwotLy8gc2FmZSBiZWNhdXNlIGZpZWxkIG51bWJlcnMgYXJlIHVzZWQgYXMgY2FzZSBpZGVudGlmaWVycywgYW5kIG5vIGZpZWxkIGNhbgotLy8gaGF2ZSBhIG51bWJlciBvZiAwLgotI2RlZmluZSBPTkVPRl9DQVNFX05PTkUgMAotCi0vLyBUaGVzZSBvcGVyYXRlIG9uIGEgbWFwIGZpZWxkIChpLmUuLCBhIHJlcGVhdGVkIGZpZWxkIG9mIHN1Ym1lc3NhZ2VzIHdob3NlCi0vLyBzdWJtZXNzYWdlIHR5cGUgaXMgYSBtYXAtZW50cnkgbXNnZGVmKS4KLWJvb2wgaXNfbWFwX2ZpZWxkKGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQpOwotY29uc3QgdXBiX2ZpZWxkZGVmKiBtYXBfZmllbGRfa2V5KGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQpOwotY29uc3QgdXBiX2ZpZWxkZGVmKiBtYXBfZmllbGRfdmFsdWUoY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCk7Ci0KLS8vIFRoZXNlIG9wZXJhdGUgb24gYSBtYXAtZW50cnkgbXNnZGVmLgotY29uc3QgdXBiX2ZpZWxkZGVmKiBtYXBfZW50cnlfa2V5KGNvbnN0IHVwYl9tc2dkZWYqIG1zZ2RlZik7Ci1jb25zdCB1cGJfZmllbGRkZWYqIG1hcF9lbnRyeV92YWx1ZShjb25zdCB1cGJfbXNnZGVmKiBtc2dkZWYpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUmVwZWF0ZWQgZmllbGQgY29udGFpbmVyIHR5cGUuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlOwotICBWQUxVRSBmaWVsZF90eXBlX2NsYXNzOwotICB2b2lkKiBlbGVtZW50czsKLSAgaW50IHNpemU7Ci0gIGludCBjYXBhY2l0eTsKLX0gUmVwZWF0ZWRGaWVsZDsKLQotdm9pZCBSZXBlYXRlZEZpZWxkX21hcmsodm9pZCogc2VsZik7Ci12b2lkIFJlcGVhdGVkRmllbGRfZnJlZSh2b2lkKiBzZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfYWxsb2MoVkFMVUUga2xhc3MpOwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9pbml0KGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgc2VsZik7Ci12b2lkIFJlcGVhdGVkRmllbGRfcmVnaXN0ZXIoVkFMVUUgbW9kdWxlKTsKLQotZXh0ZXJuIGNvbnN0IHJiX2RhdGFfdHlwZV90IFJlcGVhdGVkRmllbGRfdHlwZTsKLWV4dGVybiBWQUxVRSBjUmVwZWF0ZWRGaWVsZDsKLQotUmVwZWF0ZWRGaWVsZCogcnVieV90b19SZXBlYXRlZEZpZWxkKFZBTFVFIHZhbHVlKTsKLQotVkFMVUUgUmVwZWF0ZWRGaWVsZF9lYWNoKFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfaW5kZXgoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBfc2VsZik7Ci12b2lkKiBSZXBlYXRlZEZpZWxkX2luZGV4X25hdGl2ZShWQUxVRSBfc2VsZiwgaW50IGluZGV4KTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfaW5kZXhfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBfaW5kZXgsIFZBTFVFIHZhbCk7Ci12b2lkIFJlcGVhdGVkRmllbGRfcmVzZXJ2ZShSZXBlYXRlZEZpZWxkKiBzZWxmLCBpbnQgbmV3X3NpemUpOwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9wdXNoKFZBTFVFIF9zZWxmLCBWQUxVRSB2YWwpOwotdm9pZCBSZXBlYXRlZEZpZWxkX3B1c2hfbmF0aXZlKFZBTFVFIF9zZWxmLCB2b2lkKiBkYXRhKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfcG9wX29uZShWQUxVRSBfc2VsZik7Ci1WQUxVRSBSZXBlYXRlZEZpZWxkX2luc2VydChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfcmVwbGFjZShWQUxVRSBfc2VsZiwgVkFMVUUgbGlzdCk7Ci1WQUxVRSBSZXBlYXRlZEZpZWxkX2NsZWFyKFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfbGVuZ3RoKFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfZHVwKFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfZGVlcF9jb3B5KFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfdG9fYXJ5KFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfZXEoVkFMVUUgX3NlbGYsIFZBTFVFIF9vdGhlcik7Ci1WQUxVRSBSZXBlYXRlZEZpZWxkX2hhc2goVkFMVUUgX3NlbGYpOwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9pbnNwZWN0KFZBTFVFIF9zZWxmKTsKLVZBTFVFIFJlcGVhdGVkRmllbGRfcGx1cyhWQUxVRSBfc2VsZiwgVkFMVUUgbGlzdCk7Ci0KLS8vIERlZmluZWQgaW4gcmVwZWF0ZWRfZmllbGQuYzsgYWxzbyB1c2VkIGJ5IE1hcC4KLXZvaWQgdmFsaWRhdGVfdHlwZV9jbGFzcyh1cGJfZmllbGR0eXBlX3QgdHlwZSwgVkFMVUUga2xhc3MpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWFwIGNvbnRhaW5lciB0eXBlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1cGJfZmllbGR0eXBlX3Qga2V5X3R5cGU7Ci0gIHVwYl9maWVsZHR5cGVfdCB2YWx1ZV90eXBlOwotICBWQUxVRSB2YWx1ZV90eXBlX2NsYXNzOwotICB1cGJfc3RydGFibGUgdGFibGU7Ci19IE1hcDsKLQotdm9pZCBNYXBfbWFyayh2b2lkKiBzZWxmKTsKLXZvaWQgTWFwX2ZyZWUodm9pZCogc2VsZik7Ci1WQUxVRSBNYXBfYWxsb2MoVkFMVUUga2xhc3MpOwotVkFMVUUgTWFwX2luaXQoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LCBWQUxVRSBzZWxmKTsKLXZvaWQgTWFwX3JlZ2lzdGVyKFZBTFVFIG1vZHVsZSk7Ci0KLWV4dGVybiBjb25zdCByYl9kYXRhX3R5cGVfdCBNYXBfdHlwZTsKLWV4dGVybiBWQUxVRSBjTWFwOwotCi1NYXAqIHJ1YnlfdG9fTWFwKFZBTFVFIHZhbHVlKTsKLQotVkFMVUUgTWFwX2VhY2goVkFMVUUgX3NlbGYpOwotVkFMVUUgTWFwX2tleXMoVkFMVUUgX3NlbGYpOwotVkFMVUUgTWFwX3ZhbHVlcyhWQUxVRSBfc2VsZik7Ci1WQUxVRSBNYXBfaW5kZXgoVkFMVUUgX3NlbGYsIFZBTFVFIGtleSk7Ci1WQUxVRSBNYXBfaW5kZXhfc2V0KFZBTFVFIF9zZWxmLCBWQUxVRSBrZXksIFZBTFVFIHZhbHVlKTsKLVZBTFVFIE1hcF9oYXNfa2V5KFZBTFVFIF9zZWxmLCBWQUxVRSBrZXkpOwotVkFMVUUgTWFwX2RlbGV0ZShWQUxVRSBfc2VsZiwgVkFMVUUga2V5KTsKLVZBTFVFIE1hcF9jbGVhcihWQUxVRSBfc2VsZik7Ci1WQUxVRSBNYXBfbGVuZ3RoKFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1hcF9kdXAoVkFMVUUgX3NlbGYpOwotVkFMVUUgTWFwX2RlZXBfY29weShWQUxVRSBfc2VsZik7Ci1WQUxVRSBNYXBfZXEoVkFMVUUgX3NlbGYsIFZBTFVFIF9vdGhlcik7Ci1WQUxVRSBNYXBfaGFzaChWQUxVRSBfc2VsZik7Ci1WQUxVRSBNYXBfaW5zcGVjdChWQUxVRSBfc2VsZik7Ci1WQUxVRSBNYXBfbWVyZ2UoVkFMVUUgX3NlbGYsIFZBTFVFIGhhc2htYXApOwotVkFMVUUgTWFwX21lcmdlX2ludG9fc2VsZihWQUxVRSBfc2VsZiwgVkFMVUUgaGFzaG1hcCk7Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgTWFwKiBzZWxmOwotICB1cGJfc3RydGFibGVfaXRlciBpdDsKLX0gTWFwX2l0ZXI7Ci0KLXZvaWQgTWFwX2JlZ2luKFZBTFVFIF9zZWxmLCBNYXBfaXRlciogaXRlcik7Ci12b2lkIE1hcF9uZXh0KE1hcF9pdGVyKiBpdGVyKTsKLWJvb2wgTWFwX2RvbmUoTWFwX2l0ZXIqIGl0ZXIpOwotVkFMVUUgTWFwX2l0ZXJfa2V5KE1hcF9pdGVyKiBpdGVyKTsKLVZBTFVFIE1hcF9pdGVyX3ZhbHVlKE1hcF9pdGVyKiBpdGVyKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lc3NhZ2UgbGF5b3V0IC8gc3RvcmFnZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgTUVTU0FHRV9GSUVMRF9OT19DQVNFICgoc2l6ZV90KS0xKQotCi1zdHJ1Y3QgTWVzc2FnZUZpZWxkIHsKLSAgc2l6ZV90IG9mZnNldDsKLSAgc2l6ZV90IGNhc2Vfb2Zmc2V0OyAgLy8gZm9yIG9uZW9mcywgYSB1aW50MzIuIEVsc2UsIE1FU1NBR0VfRklFTERfTk9fQ0FTRS4KLX07Ci0KLXN0cnVjdCBNZXNzYWdlTGF5b3V0IHsKLSAgY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmOwotICBNZXNzYWdlRmllbGQqIGZpZWxkczsKLSAgc2l6ZV90IHNpemU7Ci19OwotCi1NZXNzYWdlTGF5b3V0KiBjcmVhdGVfbGF5b3V0KGNvbnN0IHVwYl9tc2dkZWYqIG1zZ2RlZik7Ci12b2lkIGZyZWVfbGF5b3V0KE1lc3NhZ2VMYXlvdXQqIGxheW91dCk7Ci1WQUxVRSBsYXlvdXRfZ2V0KE1lc3NhZ2VMYXlvdXQqIGxheW91dCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCk7Ci12b2lkIGxheW91dF9zZXQoTWVzc2FnZUxheW91dCogbGF5b3V0LAotICAgICAgICAgICAgICAgIHZvaWQqIHN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCwKLSAgICAgICAgICAgICAgICBWQUxVRSB2YWwpOwotdm9pZCBsYXlvdXRfaW5pdChNZXNzYWdlTGF5b3V0KiBsYXlvdXQsIHZvaWQqIHN0b3JhZ2UpOwotdm9pZCBsYXlvdXRfbWFyayhNZXNzYWdlTGF5b3V0KiBsYXlvdXQsIHZvaWQqIHN0b3JhZ2UpOwotdm9pZCBsYXlvdXRfZHVwKE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgdm9pZCogdG8sIHZvaWQqIGZyb20pOwotdm9pZCBsYXlvdXRfZGVlcF9jb3B5KE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgdm9pZCogdG8sIHZvaWQqIGZyb20pOwotVkFMVUUgbGF5b3V0X2VxKE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgdm9pZCogbXNnMSwgdm9pZCogbXNnMik7Ci1WQUxVRSBsYXlvdXRfaGFzaChNZXNzYWdlTGF5b3V0KiBsYXlvdXQsIHZvaWQqIHN0b3JhZ2UpOwotVkFMVUUgbGF5b3V0X2luc3BlY3QoTWVzc2FnZUxheW91dCogbGF5b3V0LCB2b2lkKiBzdG9yYWdlKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1lc3NhZ2UgY2xhc3MgY3JlYXRpb24uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJ1Y3QgTWVzc2FnZUhlYWRlciB7Ci0gIERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7ICAvLyBrZXB0IGFsaXZlIGJ5IHNlbGYuY2xhc3MuZGVzY3JpcHRvciByZWZlcmVuY2UuCi0gIC8vIERhdGEgY29tZXMgYWZ0ZXIgdGhpcy4KLX07Ci0KLWV4dGVybiByYl9kYXRhX3R5cGVfdCBNZXNzYWdlX3R5cGU7Ci0KLVZBTFVFIGJ1aWxkX2NsYXNzX2Zyb21fZGVzY3JpcHRvcihEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLXZvaWQqIE1lc3NhZ2VfZGF0YSh2b2lkKiBtc2cpOwotdm9pZCBNZXNzYWdlX21hcmsodm9pZCogc2VsZik7Ci12b2lkIE1lc3NhZ2VfZnJlZSh2b2lkKiBzZWxmKTsKLVZBTFVFIE1lc3NhZ2VfYWxsb2MoVkFMVUUga2xhc3MpOwotVkFMVUUgTWVzc2FnZV9tZXRob2RfbWlzc2luZyhpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VfaW5pdGlhbGl6ZShpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VfZHVwKFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VfZGVlcF9jb3B5KFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VfZXEoVkFMVUUgX3NlbGYsIFZBTFVFIF9vdGhlcik7Ci1WQUxVRSBNZXNzYWdlX2hhc2goVkFMVUUgX3NlbGYpOwotVkFMVUUgTWVzc2FnZV9pbnNwZWN0KFZBTFVFIF9zZWxmKTsKLVZBTFVFIE1lc3NhZ2VfaW5kZXgoVkFMVUUgX3NlbGYsIFZBTFVFIGZpZWxkX25hbWUpOwotVkFMVUUgTWVzc2FnZV9pbmRleF9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIGZpZWxkX25hbWUsIFZBTFVFIHZhbHVlKTsKLVZBTFVFIE1lc3NhZ2VfZGVzY3JpcHRvcihWQUxVRSBrbGFzcyk7Ci1WQUxVRSBNZXNzYWdlX2RlY29kZShWQUxVRSBrbGFzcywgVkFMVUUgZGF0YSk7Ci1WQUxVRSBNZXNzYWdlX2VuY29kZShWQUxVRSBrbGFzcywgVkFMVUUgbXNnX3JiKTsKLVZBTFVFIE1lc3NhZ2VfZGVjb2RlX2pzb24oVkFMVUUga2xhc3MsIFZBTFVFIGRhdGEpOwotVkFMVUUgTWVzc2FnZV9lbmNvZGVfanNvbihpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIGtsYXNzKTsKLQotVkFMVUUgR29vZ2xlX1Byb3RvYnVmX2RlZXBfY29weShWQUxVRSBzZWxmLCBWQUxVRSBvYmopOwotCi1WQUxVRSBidWlsZF9tb2R1bGVfZnJvbV9lbnVtZGVzYyhFbnVtRGVzY3JpcHRvciogZW51bWRlZik7Ci1WQUxVRSBlbnVtX2xvb2t1cChWQUxVRSBzZWxmLCBWQUxVRSBudW1iZXIpOwotVkFMVUUgZW51bV9yZXNvbHZlKFZBTFVFIHNlbGYsIFZBTFVFIHN5bSk7Ci0KLWNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKm5ld19maWxsbXNnX2RlY29kZXJtZXRob2QoCi0gICAgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3Qgdm9pZCAqb3duZXIpOwotCi0vLyBNYXhpbXVtIGRlcHRoIGFsbG93ZWQgZHVyaW5nIGVuY29kaW5nLCB0byBhdm9pZCBzdGFjayBvdmVyZmxvd3MgZHVlIHRvCi0vLyBjeWNsZXMuCi0jZGVmaW5lIEVOQ09ERV9NQVhfTkVTVElORyA2MwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gR2xvYmFsIG1hcCBmcm9tIHVwYiB7bXNnLGVudW19ZGVmcyB0byB3cmFwcGVyIERlc2NyaXB0b3IvRW51bURlc2NyaXB0b3IKLS8vIGluc3RhbmNlcy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIGFkZF9kZWZfb2JqKGNvbnN0IHZvaWQqIGRlZiwgVkFMVUUgdmFsdWUpOwotVkFMVUUgZ2V0X2RlZl9vYmooY29uc3Qgdm9pZCogZGVmKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFV0aWxpdGllcy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgY2hlY2tfdXBiX3N0YXR1cyhjb25zdCB1cGJfc3RhdHVzKiBzdGF0dXMsIGNvbnN0IGNoYXIqIG1zZyk7Ci0KLSNkZWZpbmUgQ0hFQ0tfVVBCKGNvZGUsIG1zZykgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1cGJfc3RhdHVzIHN0YXR1cyA9IFVQQl9TVEFUVVNfSU5JVDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb2RlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjaGVja191cGJfc3RhdHVzKCZzdGF0dXMsIG1zZyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gd2hpbGUgKDApCi0KLWV4dGVybiBJRCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkOwotCi0jZW5kaWYgIC8vIF9fR09PR0xFX1BST1RPQlVGX1JVQllfUFJPVE9CVUZfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9yZXBlYXRlZF9maWVsZC5jIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvcmVwZWF0ZWRfZmllbGQuYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODNhZmJjOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9yZXBlYXRlZF9maWVsZC5jCisrKyAvZGV2L251bGwKQEAgLTEsNjUxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSAicHJvdG9idWYuaCIKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJlcGVhdGVkIGZpZWxkIGNvbnRhaW5lciB0eXBlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgcmJfZGF0YV90eXBlX3QgUmVwZWF0ZWRGaWVsZF90eXBlID0gewotICAiR29vZ2xlOjpQcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZCIsCi0gIHsgUmVwZWF0ZWRGaWVsZF9tYXJrLCBSZXBlYXRlZEZpZWxkX2ZyZWUsIE5VTEwgfSwKLX07Ci0KLVZBTFVFIGNSZXBlYXRlZEZpZWxkOwotCi1SZXBlYXRlZEZpZWxkKiBydWJ5X3RvX1JlcGVhdGVkRmllbGQoVkFMVUUgX3NlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZjsKLSAgVHlwZWREYXRhX0dldF9TdHJ1Y3QoX3NlbGYsIFJlcGVhdGVkRmllbGQsICZSZXBlYXRlZEZpZWxkX3R5cGUsIHNlbGYpOwotICByZXR1cm4gc2VsZjsKLX0KLQotdm9pZCogUmVwZWF0ZWRGaWVsZF9tZW1vcnlhdChSZXBlYXRlZEZpZWxkKiBzZWxmLCBpbnQgaW5kZXgsIGludCBlbGVtZW50X3NpemUpIHsKLSAgcmV0dXJuICgodWludDhfdCAqKXNlbGYtPmVsZW1lbnRzKSArIGluZGV4ICogZWxlbWVudF9zaXplOwotfQotCi1zdGF0aWMgaW50IGluZGV4X3Bvc2l0aW9uKFZBTFVFIF9pbmRleCwgUmVwZWF0ZWRGaWVsZCogcmVwZWF0ZWRfZmllbGQpIHsKLSAgaW50IGluZGV4ID0gTlVNMklOVChfaW5kZXgpOwotICBpZiAoaW5kZXggPCAwICYmIHJlcGVhdGVkX2ZpZWxkLT5zaXplID4gMCkgewotICAgIGluZGV4ID0gcmVwZWF0ZWRfZmllbGQtPnNpemUgKyBpbmRleDsKLSAgfQotICByZXR1cm4gaW5kZXg7Ci19Ci0KLVZBTFVFIFJlcGVhdGVkRmllbGRfc3ViYXJyYXkoVkFMVUUgX3NlbGYsIGxvbmcgYmVnLCBsb25nIGxlbikgewotICBSZXBlYXRlZEZpZWxkKiBzZWxmID0gcnVieV90b19SZXBlYXRlZEZpZWxkKF9zZWxmKTsKLSAgaW50IGVsZW1lbnRfc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUoc2VsZi0+ZmllbGRfdHlwZSk7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlID0gc2VsZi0+ZmllbGRfdHlwZTsKLSAgVkFMVUUgZmllbGRfdHlwZV9jbGFzcyA9IHNlbGYtPmZpZWxkX3R5cGVfY2xhc3M7Ci0KLSAgc2l6ZV90IG9mZiA9IGJlZyAqIGVsZW1lbnRfc2l6ZTsKLSAgVkFMVUUgYXJ5ID0gcmJfYXJ5X25ldzIobGVuKTsKLSAgZm9yIChpbnQgaSA9IGJlZzsgaSA8IGJlZyArIGxlbjsgaSsrLCBvZmYgKz0gZWxlbWVudF9zaXplKSB7Ci0gICAgdm9pZCogbWVtID0gKCh1aW50OF90ICopc2VsZi0+ZWxlbWVudHMpICsgb2ZmOwotICAgIFZBTFVFIGVsZW0gPSBuYXRpdmVfc2xvdF9nZXQoZmllbGRfdHlwZSwgZmllbGRfdHlwZV9jbGFzcywgbWVtKTsKLSAgICByYl9hcnlfcHVzaChhcnksIGVsZW0pOwotICB9Ci0gIHJldHVybiBhcnk7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBSZXBlYXRlZEZpZWxkLmVhY2goJmJsb2NrKQotICoKLSAqIEludm9rZXMgdGhlIGJsb2NrIG9uY2UgZm9yIGVhY2ggZWxlbWVudCBvZiB0aGUgcmVwZWF0ZWQgZmllbGQuIFJlcGVhdGVkRmllbGQKLSAqIGFsc28gaW5jbHVkZXMgRW51bWVyYWJsZTsgY29tYmluZWQgd2l0aCB0aGlzIG1ldGhvZCwgdGhlIHJlcGVhdGVkIGZpZWxkIHRodXMKLSAqIGFjdHMgbGlrZSBhbiBvcmRpbmFyeSBSdWJ5IHNlcXVlbmNlLgotICovCi1WQUxVRSBSZXBlYXRlZEZpZWxkX2VhY2goVkFMVUUgX3NlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlID0gc2VsZi0+ZmllbGRfdHlwZTsKLSAgVkFMVUUgZmllbGRfdHlwZV9jbGFzcyA9IHNlbGYtPmZpZWxkX3R5cGVfY2xhc3M7Ci0gIGludCBlbGVtZW50X3NpemUgPSBuYXRpdmVfc2xvdF9zaXplKGZpZWxkX3R5cGUpOwotCi0gIHNpemVfdCBvZmYgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGYtPnNpemU7IGkrKywgb2ZmICs9IGVsZW1lbnRfc2l6ZSkgewotICAgIHZvaWQqIG1lbW9yeSA9ICh2b2lkICopICgoKHVpbnQ4X3QgKilzZWxmLT5lbGVtZW50cykgKyBvZmYpOwotICAgIFZBTFVFIHZhbCA9IG5hdGl2ZV9zbG90X2dldChmaWVsZF90eXBlLCBmaWVsZF90eXBlX2NsYXNzLCBtZW1vcnkpOwotICAgIHJiX3lpZWxkKHZhbCk7Ci0gIH0KLSAgcmV0dXJuIF9zZWxmOwotfQotCi0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBSZXBlYXRlZEZpZWxkLltdKGluZGV4KSA9PiB2YWx1ZQotICoKLSAqIEFjY2Vzc2VzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4gUmV0dXJucyBuaWwgb24gb3V0LW9mLWJvdW5kcwotICovCi1WQUxVRSBSZXBlYXRlZEZpZWxkX2luZGV4KGludCBhcmdjLCBWQUxVRSogYXJndiwgVkFMVUUgX3NlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIGludCBlbGVtZW50X3NpemUgPSBuYXRpdmVfc2xvdF9zaXplKHNlbGYtPmZpZWxkX3R5cGUpOwotICB1cGJfZmllbGR0eXBlX3QgZmllbGRfdHlwZSA9IHNlbGYtPmZpZWxkX3R5cGU7Ci0gIFZBTFVFIGZpZWxkX3R5cGVfY2xhc3MgPSBzZWxmLT5maWVsZF90eXBlX2NsYXNzOwotCi0gIFZBTFVFIGFyZyA9IGFyZ3ZbMF07Ci0gIGxvbmcgYmVnLCBsZW47Ci0KLSAgaWYgKGFyZ2MgPT0gMSl7Ci0gICAgaWYgKEZJWE5VTV9QKGFyZykpIHsKLSAgICAgIC8qIHN0YW5kYXJkIGNhc2UgKi8KLSAgICAgIHZvaWQqIG1lbW9yeTsKLSAgICAgIGludCBpbmRleCA9IGluZGV4X3Bvc2l0aW9uKGFyZ3ZbMF0sIHNlbGYpOwotICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBzZWxmLT5zaXplKSB7Ci0gICAgICAgIHJldHVybiBRbmlsOwotICAgICAgfQotICAgICAgbWVtb3J5ID0gUmVwZWF0ZWRGaWVsZF9tZW1vcnlhdChzZWxmLCBpbmRleCwgZWxlbWVudF9zaXplKTsKLSAgICAgIHJldHVybiBuYXRpdmVfc2xvdF9nZXQoZmllbGRfdHlwZSwgZmllbGRfdHlwZV9jbGFzcywgbWVtb3J5KTsKLSAgICB9ZWxzZXsKLSAgICAgIC8qIGNoZWNrIGlmIGlkeCBpcyBSYW5nZSAqLwotICAgICAgc3dpdGNoIChyYl9yYW5nZV9iZWdfbGVuKGFyZywgJmJlZywgJmxlbiwgc2VsZi0+c2l6ZSwgMCkpIHsKLSAgICAgICAgY2FzZSBRZmFsc2U6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgUW5pbDoKLSAgICAgICAgICByZXR1cm4gUW5pbDsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZF9zdWJhcnJheShfc2VsZiwgYmVnLCBsZW4pOwotICAgICAgfQotICAgIH0KLSAgfQotICAvKiBhc3N1bWUgMiBhcmd1bWVudHMgKi8KLSAgYmVnID0gTlVNMkxPTkcoYXJndlswXSk7Ci0gIGxlbiA9IE5VTTJMT05HKGFyZ3ZbMV0pOwotICBpZiAoYmVnIDwgMCkgewotICAgIGJlZyArPSBzZWxmLT5zaXplOwotICB9Ci0gIGlmIChiZWcgPj0gc2VsZi0+c2l6ZSkgewotICAgIHJldHVybiBRbmlsOwotICB9Ci0gIHJldHVybiBSZXBlYXRlZEZpZWxkX3N1YmFycmF5KF9zZWxmLCBiZWcsIGxlbik7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBSZXBlYXRlZEZpZWxkLltdPShpbmRleCwgdmFsdWUpCi0gKgotICogU2V0cyB0aGUgZWxlbWVudCBhdCB0aGUgZ2l2ZW4gaW5kZXguIE9uIG91dC1vZi1ib3VuZHMgYXNzaWdubWVudHMsIGV4dGVuZHMKLSAqIHRoZSBhcnJheSBhbmQgZmlsbHMgdGhlIGhvbGUgKGlmIGFueSkgd2l0aCBkZWZhdWx0IHZhbHVlcy4KLSAqLwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9pbmRleF9zZXQoVkFMVUUgX3NlbGYsIFZBTFVFIF9pbmRleCwgVkFMVUUgdmFsKSB7Ci0gIFJlcGVhdGVkRmllbGQqIHNlbGYgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQoX3NlbGYpOwotICB1cGJfZmllbGR0eXBlX3QgZmllbGRfdHlwZSA9IHNlbGYtPmZpZWxkX3R5cGU7Ci0gIFZBTFVFIGZpZWxkX3R5cGVfY2xhc3MgPSBzZWxmLT5maWVsZF90eXBlX2NsYXNzOwotICBpbnQgZWxlbWVudF9zaXplID0gbmF0aXZlX3Nsb3Rfc2l6ZShmaWVsZF90eXBlKTsKLSAgdm9pZCogbWVtb3J5OwotCi0gIGludCBpbmRleCA9IGluZGV4X3Bvc2l0aW9uKF9pbmRleCwgc2VsZik7Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gKElOVF9NQVggLSAxKSkgewotICAgIHJldHVybiBRbmlsOwotICB9Ci0gIGlmIChpbmRleCA+PSBzZWxmLT5zaXplKSB7Ci0gICAgdXBiX2ZpZWxkdHlwZV90IGZpZWxkX3R5cGUgPSBzZWxmLT5maWVsZF90eXBlOwotICAgIGludCBlbGVtZW50X3NpemUgPSBuYXRpdmVfc2xvdF9zaXplKGZpZWxkX3R5cGUpOwotICAgIFJlcGVhdGVkRmllbGRfcmVzZXJ2ZShzZWxmLCBpbmRleCArIDEpOwotICAgIGZvciAoaW50IGkgPSBzZWxmLT5zaXplOyBpIDw9IGluZGV4OyBpKyspIHsKLSAgICAgIHZvaWQqIGVsZW0gPSBSZXBlYXRlZEZpZWxkX21lbW9yeWF0KHNlbGYsIGksIGVsZW1lbnRfc2l6ZSk7Ci0gICAgICBuYXRpdmVfc2xvdF9pbml0KGZpZWxkX3R5cGUsIGVsZW0pOwotICAgIH0KLSAgICBzZWxmLT5zaXplID0gaW5kZXggKyAxOwotICB9Ci0KLSAgbWVtb3J5ID0gUmVwZWF0ZWRGaWVsZF9tZW1vcnlhdChzZWxmLCBpbmRleCwgZWxlbWVudF9zaXplKTsKLSAgbmF0aXZlX3Nsb3Rfc2V0KGZpZWxkX3R5cGUsIGZpZWxkX3R5cGVfY2xhc3MsIG1lbW9yeSwgdmFsKTsKLSAgcmV0dXJuIFFuaWw7Ci19Ci0KLXN0YXRpYyBpbnQga0luaXRpYWxTaXplID0gODsKLQotdm9pZCBSZXBlYXRlZEZpZWxkX3Jlc2VydmUoUmVwZWF0ZWRGaWVsZCogc2VsZiwgaW50IG5ld19zaXplKSB7Ci0gIHZvaWQqIG9sZF9lbGVtcyA9IHNlbGYtPmVsZW1lbnRzOwotICBpbnQgZWxlbV9zaXplID0gbmF0aXZlX3Nsb3Rfc2l6ZShzZWxmLT5maWVsZF90eXBlKTsKLSAgaWYgKG5ld19zaXplIDw9IHNlbGYtPmNhcGFjaXR5KSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGlmIChzZWxmLT5jYXBhY2l0eSA9PSAwKSB7Ci0gICAgc2VsZi0+Y2FwYWNpdHkgPSBrSW5pdGlhbFNpemU7Ci0gIH0KLSAgd2hpbGUgKHNlbGYtPmNhcGFjaXR5IDwgbmV3X3NpemUpIHsKLSAgICBzZWxmLT5jYXBhY2l0eSAqPSAyOwotICB9Ci0gIHNlbGYtPmVsZW1lbnRzID0gQUxMT0NfTih1aW50OF90LCBlbGVtX3NpemUgKiBzZWxmLT5jYXBhY2l0eSk7Ci0gIGlmIChvbGRfZWxlbXMgIT0gTlVMTCkgewotICAgIG1lbWNweShzZWxmLT5lbGVtZW50cywgb2xkX2VsZW1zLCBzZWxmLT5zaXplICogZWxlbV9zaXplKTsKLSAgICB4ZnJlZShvbGRfZWxlbXMpOwotICB9Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBSZXBlYXRlZEZpZWxkLnB1c2godmFsdWUpCi0gKgotICogQWRkcyBhIG5ldyBlbGVtZW50IHRvIHRoZSByZXBlYXRlZCBmaWVsZC4KLSAqLwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9wdXNoKFZBTFVFIF9zZWxmLCBWQUxVRSB2YWwpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlID0gc2VsZi0+ZmllbGRfdHlwZTsKLSAgaW50IGVsZW1lbnRfc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUoZmllbGRfdHlwZSk7Ci0gIHZvaWQqIG1lbW9yeTsKLQotICBSZXBlYXRlZEZpZWxkX3Jlc2VydmUoc2VsZiwgc2VsZi0+c2l6ZSArIDEpOwotICBtZW1vcnkgPSAodm9pZCAqKSAoKCh1aW50OF90ICopc2VsZi0+ZWxlbWVudHMpICsgc2VsZi0+c2l6ZSAqIGVsZW1lbnRfc2l6ZSk7Ci0gIG5hdGl2ZV9zbG90X3NldChmaWVsZF90eXBlLCBzZWxmLT5maWVsZF90eXBlX2NsYXNzLCBtZW1vcnksIHZhbCk7Ci0gIC8vIG5hdGl2ZV9zbG90X3NldCBtYXkgcmFpc2UgYW4gZXJyb3I7IGJ1bXAgc2l6ZSBvbmx5IGFmdGVyIHNldC4KLSAgc2VsZi0+c2l6ZSsrOwotICByZXR1cm4gX3NlbGY7Ci19Ci0KLQotLy8gVXNlZCBieSBwYXJzaW5nIGhhbmRsZXJzLgotdm9pZCBSZXBlYXRlZEZpZWxkX3B1c2hfbmF0aXZlKFZBTFVFIF9zZWxmLCB2b2lkKiBkYXRhKSB7Ci0gIFJlcGVhdGVkRmllbGQqIHNlbGYgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQoX3NlbGYpOwotICB1cGJfZmllbGR0eXBlX3QgZmllbGRfdHlwZSA9IHNlbGYtPmZpZWxkX3R5cGU7Ci0gIGludCBlbGVtZW50X3NpemUgPSBuYXRpdmVfc2xvdF9zaXplKGZpZWxkX3R5cGUpOwotICB2b2lkKiBtZW1vcnk7Ci0KLSAgUmVwZWF0ZWRGaWVsZF9yZXNlcnZlKHNlbGYsIHNlbGYtPnNpemUgKyAxKTsKLSAgbWVtb3J5ID0gKHZvaWQgKikgKCgodWludDhfdCAqKXNlbGYtPmVsZW1lbnRzKSArIHNlbGYtPnNpemUgKiBlbGVtZW50X3NpemUpOwotICBtZW1jcHkobWVtb3J5LCBkYXRhLCBlbGVtZW50X3NpemUpOwotICBzZWxmLT5zaXplKys7Ci19Ci0KLXZvaWQqIFJlcGVhdGVkRmllbGRfaW5kZXhfbmF0aXZlKFZBTFVFIF9zZWxmLCBpbnQgaW5kZXgpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlID0gc2VsZi0+ZmllbGRfdHlwZTsKLSAgaW50IGVsZW1lbnRfc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUoZmllbGRfdHlwZSk7Ci0gIHJldHVybiBSZXBlYXRlZEZpZWxkX21lbW9yeWF0KHNlbGYsIGluZGV4LCBlbGVtZW50X3NpemUpOwotfQotCi0vKgotICogUHJpdmF0ZSBydWJ5IG1ldGhvZCwgdXNlZCBieSBSZXBlYXRlZEZpZWxkLnBvcAotICovCi1WQUxVRSBSZXBlYXRlZEZpZWxkX3BvcF9vbmUoVkFMVUUgX3NlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlID0gc2VsZi0+ZmllbGRfdHlwZTsKLSAgVkFMVUUgZmllbGRfdHlwZV9jbGFzcyA9IHNlbGYtPmZpZWxkX3R5cGVfY2xhc3M7Ci0gIGludCBlbGVtZW50X3NpemUgPSBuYXRpdmVfc2xvdF9zaXplKGZpZWxkX3R5cGUpOwotICBpbnQgaW5kZXg7Ci0gIHZvaWQqIG1lbW9yeTsKLSAgVkFMVUUgcmV0OwotCi0gIGlmIChzZWxmLT5zaXplID09IDApIHsKLSAgICByZXR1cm4gUW5pbDsKLSAgfQotICBpbmRleCA9IHNlbGYtPnNpemUgLSAxOwotICBtZW1vcnkgPSBSZXBlYXRlZEZpZWxkX21lbW9yeWF0KHNlbGYsIGluZGV4LCBlbGVtZW50X3NpemUpOwotICByZXQgPSBuYXRpdmVfc2xvdF9nZXQoZmllbGRfdHlwZSwgZmllbGRfdHlwZV9jbGFzcywgbWVtb3J5KTsKLSAgc2VsZi0+c2l6ZS0tOwotICByZXR1cm4gcmV0OwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgUmVwZWF0ZWRGaWVsZC5yZXBsYWNlKGxpc3QpCi0gKgotICogUmVwbGFjZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSByZXBlYXRlZCBmaWVsZCB3aXRoIHRoZSBnaXZlbiBsaXN0IG9mIGVsZW1lbnRzLgotICovCi1WQUxVRSBSZXBlYXRlZEZpZWxkX3JlcGxhY2UoVkFMVUUgX3NlbGYsIFZBTFVFIGxpc3QpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIENoZWNrX1R5cGUobGlzdCwgVF9BUlJBWSk7Ci0gIHNlbGYtPnNpemUgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IFJBUlJBWV9MRU4obGlzdCk7IGkrKykgewotICAgIFJlcGVhdGVkRmllbGRfcHVzaChfc2VsZiwgcmJfYXJ5X2VudHJ5KGxpc3QsIGkpKTsKLSAgfQotICByZXR1cm4gbGlzdDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIFJlcGVhdGVkRmllbGQuY2xlYXIKLSAqCi0gKiBDbGVhcnMgKHJlbW92ZXMgYWxsIGVsZW1lbnRzIGZyb20pIHRoaXMgcmVwZWF0ZWQgZmllbGQuCi0gKi8KLVZBTFVFIFJlcGVhdGVkRmllbGRfY2xlYXIoVkFMVUUgX3NlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIHNlbGYtPnNpemUgPSAwOwotICByZXR1cm4gX3NlbGY7Ci19Ci0KLS8qCi0gKiBjYWxsLXNlcToKLSAqICAgICBSZXBlYXRlZEZpZWxkLmxlbmd0aAotICoKLSAqIFJldHVybnMgdGhlIGxlbmd0aCBvZiB0aGlzIHJlcGVhdGVkIGZpZWxkLgotICovCi1WQUxVRSBSZXBlYXRlZEZpZWxkX2xlbmd0aChWQUxVRSBfc2VsZikgewotICBSZXBlYXRlZEZpZWxkKiBzZWxmID0gcnVieV90b19SZXBlYXRlZEZpZWxkKF9zZWxmKTsKLSAgcmV0dXJuIElOVDJOVU0oc2VsZi0+c2l6ZSk7Ci19Ci0KLXN0YXRpYyBWQUxVRSBSZXBlYXRlZEZpZWxkX25ld190aGlzX3R5cGUoVkFMVUUgX3NlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIFZBTFVFIG5ld19ycHRmaWVsZCA9IFFuaWw7Ci0gIFZBTFVFIGVsZW1lbnRfdHlwZSA9IGZpZWxkdHlwZV90b19ydWJ5KHNlbGYtPmZpZWxkX3R5cGUpOwotICBpZiAoc2VsZi0+ZmllbGRfdHlwZV9jbGFzcyAhPSBRbmlsKSB7Ci0gICAgbmV3X3JwdGZpZWxkID0gcmJfZnVuY2FsbChDTEFTU19PRihfc2VsZiksIHJiX2ludGVybigibmV3IiksIDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbGVtZW50X3R5cGUsIHNlbGYtPmZpZWxkX3R5cGVfY2xhc3MpOwotICB9IGVsc2UgewotICAgIG5ld19ycHRmaWVsZCA9IHJiX2Z1bmNhbGwoQ0xBU1NfT0YoX3NlbGYpLCByYl9pbnRlcm4oIm5ldyIpLCAxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxlbWVudF90eXBlKTsKLSAgfQotICByZXR1cm4gbmV3X3JwdGZpZWxkOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgUmVwZWF0ZWRGaWVsZC5kdXAgPT4gcmVwZWF0ZWRfZmllbGQKLSAqCi0gKiBEdXBsaWNhdGVzIHRoaXMgcmVwZWF0ZWQgZmllbGQgd2l0aCBhIHNoYWxsb3cgY29weS4gUmVmZXJlbmNlcyB0byBhbGwKLSAqIG5vbi1wcmltaXRpdmUgZWxlbWVudCBvYmplY3RzIChlLmcuLCBzdWJtZXNzYWdlcykgYXJlIHNoYXJlZC4KLSAqLwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9kdXAoVkFMVUUgX3NlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfc2VsZik7Ci0gIFZBTFVFIG5ld19ycHRmaWVsZCA9IFJlcGVhdGVkRmllbGRfbmV3X3RoaXNfdHlwZShfc2VsZik7Ci0gIFJlcGVhdGVkRmllbGQqIG5ld19ycHRmaWVsZF9zZWxmID0gcnVieV90b19SZXBlYXRlZEZpZWxkKG5ld19ycHRmaWVsZCk7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlID0gc2VsZi0+ZmllbGRfdHlwZTsKLSAgc2l6ZV90IGVsZW1fc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUoZmllbGRfdHlwZSk7Ci0gIHNpemVfdCBvZmYgPSAwOwotICBSZXBlYXRlZEZpZWxkX3Jlc2VydmUobmV3X3JwdGZpZWxkX3NlbGYsIHNlbGYtPnNpemUpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGYtPnNpemU7IGkrKywgb2ZmICs9IGVsZW1fc2l6ZSkgewotICAgIHZvaWQqIHRvX21lbSA9ICh1aW50OF90ICopbmV3X3JwdGZpZWxkX3NlbGYtPmVsZW1lbnRzICsgb2ZmOwotICAgIHZvaWQqIGZyb21fbWVtID0gKHVpbnQ4X3QgKilzZWxmLT5lbGVtZW50cyArIG9mZjsKLSAgICBuYXRpdmVfc2xvdF9kdXAoZmllbGRfdHlwZSwgdG9fbWVtLCBmcm9tX21lbSk7Ci0gICAgbmV3X3JwdGZpZWxkX3NlbGYtPnNpemUrKzsKLSAgfQotCi0gIHJldHVybiBuZXdfcnB0ZmllbGQ7Ci19Ci0KLS8vIEludGVybmFsIG9ubHk6IHVzZWQgYnkgR29vZ2xlOjpQcm90b2J1Zi5kZWVwX2NvcHkuCi1WQUxVRSBSZXBlYXRlZEZpZWxkX2RlZXBfY29weShWQUxVRSBfc2VsZikgewotICBSZXBlYXRlZEZpZWxkKiBzZWxmID0gcnVieV90b19SZXBlYXRlZEZpZWxkKF9zZWxmKTsKLSAgVkFMVUUgbmV3X3JwdGZpZWxkID0gUmVwZWF0ZWRGaWVsZF9uZXdfdGhpc190eXBlKF9zZWxmKTsKLSAgUmVwZWF0ZWRGaWVsZCogbmV3X3JwdGZpZWxkX3NlbGYgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQobmV3X3JwdGZpZWxkKTsKLSAgdXBiX2ZpZWxkdHlwZV90IGZpZWxkX3R5cGUgPSBzZWxmLT5maWVsZF90eXBlOwotICBzaXplX3QgZWxlbV9zaXplID0gbmF0aXZlX3Nsb3Rfc2l6ZShmaWVsZF90eXBlKTsKLSAgc2l6ZV90IG9mZiA9IDA7Ci0gIFJlcGVhdGVkRmllbGRfcmVzZXJ2ZShuZXdfcnB0ZmllbGRfc2VsZiwgc2VsZi0+c2l6ZSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZi0+c2l6ZTsgaSsrLCBvZmYgKz0gZWxlbV9zaXplKSB7Ci0gICAgdm9pZCogdG9fbWVtID0gKHVpbnQ4X3QgKiluZXdfcnB0ZmllbGRfc2VsZi0+ZWxlbWVudHMgKyBvZmY7Ci0gICAgdm9pZCogZnJvbV9tZW0gPSAodWludDhfdCAqKXNlbGYtPmVsZW1lbnRzICsgb2ZmOwotICAgIG5hdGl2ZV9zbG90X2RlZXBfY29weShmaWVsZF90eXBlLCB0b19tZW0sIGZyb21fbWVtKTsKLSAgICBuZXdfcnB0ZmllbGRfc2VsZi0+c2l6ZSsrOwotICB9Ci0KLSAgcmV0dXJuIG5ld19ycHRmaWVsZDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIFJlcGVhdGVkRmllbGQudG9fYXJ5ID0+IGFycmF5Ci0gKgotICogVXNlZCB3aGVuIGNvbnZlcnRlZCBpbXBsaWNpdGx5IGludG8gYXJyYXksIGUuZy4gY29tcGFyZWQgdG8gYW4gQXJyYXkuCi0gKiBBbHNvIGNhbGxlZCBhcyBhIGZhbGxiYWNrIG9mIE9iamVjdCN0b19hCi0gKi8KLVZBTFVFIFJlcGVhdGVkRmllbGRfdG9fYXJ5KFZBTFVFIF9zZWxmKSB7Ci0gIFJlcGVhdGVkRmllbGQqIHNlbGYgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQoX3NlbGYpOwotICB1cGJfZmllbGR0eXBlX3QgZmllbGRfdHlwZSA9IHNlbGYtPmZpZWxkX3R5cGU7Ci0KLSAgc2l6ZV90IGVsZW1fc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUoZmllbGRfdHlwZSk7Ci0gIHNpemVfdCBvZmYgPSAwOwotICBWQUxVRSBhcnkgPSByYl9hcnlfbmV3MihzZWxmLT5zaXplKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZWxmLT5zaXplOyBpKyssIG9mZiArPSBlbGVtX3NpemUpIHsKLSAgICB2b2lkKiBtZW0gPSAoKHVpbnQ4X3QgKilzZWxmLT5lbGVtZW50cykgKyBvZmY7Ci0gICAgVkFMVUUgZWxlbSA9IG5hdGl2ZV9zbG90X2dldChmaWVsZF90eXBlLCBzZWxmLT5maWVsZF90eXBlX2NsYXNzLCBtZW0pOwotICAgIHJiX2FyeV9wdXNoKGFyeSwgZWxlbSk7Ci0gIH0KLSAgcmV0dXJuIGFyeTsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIFJlcGVhdGVkRmllbGQuPT0ob3RoZXIpID0+IGJvb2xlYW4KLSAqCi0gKiBDb21wYXJlcyB0aGlzIHJlcGVhdGVkIGZpZWxkIHRvIGFub3RoZXIuIFJlcGVhdGVkIGZpZWxkcyBhcmUgZXF1YWwgaWYgdGhlaXIKLSAqIGVsZW1lbnQgdHlwZXMgYXJlIGVxdWFsLCB0aGVpciBsZW5ndGhzIGFyZSBlcXVhbCwgYW5kIGVhY2ggZWxlbWVudCBpcyBlcXVhbC4KLSAqIEVsZW1lbnRzIGFyZSBjb21wYXJlZCBhcyBwZXIgbm9ybWFsIFJ1Ynkgc2VtYW50aWNzLCBieSBjYWxsaW5nIHRoZWlyIDo9PQotICogbWV0aG9kcyAob3IgcGVyZm9ybWluZyBhIG1vcmUgZWZmaWNpZW50IGNvbXBhcmlzb24gZm9yIHByaW1pdGl2ZSB0eXBlcykuCi0gKgotICogUmVwZWF0ZWQgZmllbGRzIHdpdGggZGlzc2ltaWxhciBlbGVtZW50IHR5cGVzIGFyZSBuZXZlciBlcXVhbCwgZXZlbiBpZiB2YWx1ZQotICogY29tcGFyaXNvbiAoZm9yIGV4YW1wbGUsIGJldHdlZW4gaW50ZWdlcnMgYW5kIGZsb2F0cykgd291bGQgaGF2ZSBvdGhlcndpc2UKLSAqIGluZGljYXRlZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGVxdWFsIHZhbHVlLgotICovCi1WQUxVRSBSZXBlYXRlZEZpZWxkX2VxKFZBTFVFIF9zZWxmLCBWQUxVRSBfb3RoZXIpIHsKLSAgUmVwZWF0ZWRGaWVsZCogc2VsZjsKLSAgUmVwZWF0ZWRGaWVsZCogb3RoZXI7Ci0KLSAgaWYgKF9zZWxmID09IF9vdGhlcikgewotICAgIHJldHVybiBRdHJ1ZTsKLSAgfQotCi0gIGlmIChUWVBFKF9vdGhlcikgPT0gVF9BUlJBWSkgewotICAgIFZBTFVFIHNlbGZfYXJ5ID0gUmVwZWF0ZWRGaWVsZF90b19hcnkoX3NlbGYpOwotICAgIHJldHVybiByYl9lcXVhbChzZWxmX2FyeSwgX290aGVyKTsKLSAgfQotCi0gIHNlbGYgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQoX3NlbGYpOwotICBvdGhlciA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZChfb3RoZXIpOwotICBpZiAoc2VsZi0+ZmllbGRfdHlwZSAhPSBvdGhlci0+ZmllbGRfdHlwZSB8fAotICAgICAgc2VsZi0+ZmllbGRfdHlwZV9jbGFzcyAhPSBvdGhlci0+ZmllbGRfdHlwZV9jbGFzcyB8fAotICAgICAgc2VsZi0+c2l6ZSAhPSBvdGhlci0+c2l6ZSkgewotICAgIHJldHVybiBRZmFsc2U7Ci0gIH0KLQotICB7Ci0gICAgdXBiX2ZpZWxkdHlwZV90IGZpZWxkX3R5cGUgPSBzZWxmLT5maWVsZF90eXBlOwotICAgIHNpemVfdCBlbGVtX3NpemUgPSBuYXRpdmVfc2xvdF9zaXplKGZpZWxkX3R5cGUpOwotICAgIHNpemVfdCBvZmYgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZi0+c2l6ZTsgaSsrLCBvZmYgKz0gZWxlbV9zaXplKSB7Ci0gICAgICB2b2lkKiBzZWxmX21lbSA9ICgodWludDhfdCAqKXNlbGYtPmVsZW1lbnRzKSArIG9mZjsKLSAgICAgIHZvaWQqIG90aGVyX21lbSA9ICgodWludDhfdCAqKW90aGVyLT5lbGVtZW50cykgKyBvZmY7Ci0gICAgICBpZiAoIW5hdGl2ZV9zbG90X2VxKGZpZWxkX3R5cGUsIHNlbGZfbWVtLCBvdGhlcl9tZW0pKSB7Ci0gICAgICAgIHJldHVybiBRZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICAgIHJldHVybiBRdHJ1ZTsKLSAgfQotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgUmVwZWF0ZWRGaWVsZC5oYXNoID0+IGhhc2hfdmFsdWUKLSAqCi0gKiBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoaXMgcmVwZWF0ZWQgZmllbGQncyBlbGVtZW50cy4KLSAqLwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9oYXNoKFZBTFVFIF9zZWxmKSB7Ci0gIFJlcGVhdGVkRmllbGQqIHNlbGYgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQoX3NlbGYpOwotCi0gIFZBTFVFIGhhc2ggPSBMTDJOVU0oMCk7Ci0KLSAgdXBiX2ZpZWxkdHlwZV90IGZpZWxkX3R5cGUgPSBzZWxmLT5maWVsZF90eXBlOwotICBWQUxVRSBmaWVsZF90eXBlX2NsYXNzID0gc2VsZi0+ZmllbGRfdHlwZV9jbGFzczsKLSAgc2l6ZV90IGVsZW1fc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUoZmllbGRfdHlwZSk7Ci0gIHNpemVfdCBvZmYgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNlbGYtPnNpemU7IGkrKywgb2ZmICs9IGVsZW1fc2l6ZSkgewotICAgIHZvaWQqIG1lbSA9ICgodWludDhfdCAqKXNlbGYtPmVsZW1lbnRzKSArIG9mZjsKLSAgICBWQUxVRSBlbGVtID0gbmF0aXZlX3Nsb3RfZ2V0KGZpZWxkX3R5cGUsIGZpZWxkX3R5cGVfY2xhc3MsIG1lbSk7Ci0gICAgaGFzaCA9IHJiX2Z1bmNhbGwoaGFzaCwgcmJfaW50ZXJuKCI8PCIpLCAxLCBJTlQyTlVNKDIpKTsKLSAgICBoYXNoID0gcmJfZnVuY2FsbChoYXNoLCByYl9pbnRlcm4oIl4iKSwgMSwKLSAgICAgICAgICAgICAgICAgICAgICByYl9mdW5jYWxsKGVsZW0sIHJiX2ludGVybigiaGFzaCIpLCAwKSk7Ci0gIH0KLQotICByZXR1cm4gaGFzaDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIFJlcGVhdGVkRmllbGQuKyhvdGhlcikgPT4gcmVwZWF0ZWQgZmllbGQKLSAqCi0gKiBSZXR1cm5zIGEgbmV3IHJlcGVhdGVkIGZpZWxkIHRoYXQgY29udGFpbnMgdGhlIGNvbmNhdGVuYXRlZCBsaXN0IG9mIHRoaXMKLSAqIHJlcGVhdGVkIGZpZWxkJ3MgZWxlbWVudHMgYW5kIG90aGVyJ3MgZWxlbWVudHMuIFRoZSBvdGhlciAoc2Vjb25kKSBsaXN0IG1heQotICogYmUgZWl0aGVyIGFub3RoZXIgcmVwZWF0ZWQgZmllbGQgb3IgYSBSdWJ5IGFycmF5LgotICovCi1WQUxVRSBSZXBlYXRlZEZpZWxkX3BsdXMoVkFMVUUgX3NlbGYsIFZBTFVFIGxpc3QpIHsKLSAgVkFMVUUgZHVwcGVkID0gUmVwZWF0ZWRGaWVsZF9kdXAoX3NlbGYpOwotCi0gIGlmIChUWVBFKGxpc3QpID09IFRfQVJSQVkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IFJBUlJBWV9MRU4obGlzdCk7IGkrKykgewotICAgICAgVkFMVUUgZWxlbSA9IHJiX2FyeV9lbnRyeShsaXN0LCBpKTsKLSAgICAgIFJlcGVhdGVkRmllbGRfcHVzaChkdXBwZWQsIGVsZW0pOwotICAgIH0KLSAgfSBlbHNlIGlmIChSQl9UWVBFX1AobGlzdCwgVF9EQVRBKSAmJiBSVFlQRUREQVRBX1AobGlzdCkgJiYKLSAgICAgICAgICAgICBSVFlQRUREQVRBX1RZUEUobGlzdCkgPT0gJlJlcGVhdGVkRmllbGRfdHlwZSkgewotICAgIFJlcGVhdGVkRmllbGQqIHNlbGYgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQoX3NlbGYpOwotICAgIFJlcGVhdGVkRmllbGQqIGxpc3RfcnB0ZmllbGQgPSBydWJ5X3RvX1JlcGVhdGVkRmllbGQobGlzdCk7Ci0gICAgaWYgKHNlbGYtPmZpZWxkX3R5cGUgIT0gbGlzdF9ycHRmaWVsZC0+ZmllbGRfdHlwZSB8fAotICAgICAgICBzZWxmLT5maWVsZF90eXBlX2NsYXNzICE9IGxpc3RfcnB0ZmllbGQtPmZpZWxkX3R5cGVfY2xhc3MpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwKLSAgICAgICAgICAgICAgICJBdHRlbXB0IHRvIGFwcGVuZCBSZXBlYXRlZEZpZWxkIHdpdGggZGlmZmVyZW50IGVsZW1lbnQgdHlwZS4iKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaXN0X3JwdGZpZWxkLT5zaXplOyBpKyspIHsKLSAgICAgIHZvaWQqIG1lbSA9IFJlcGVhdGVkRmllbGRfaW5kZXhfbmF0aXZlKGxpc3QsIGkpOwotICAgICAgUmVwZWF0ZWRGaWVsZF9wdXNoX25hdGl2ZShkdXBwZWQsIG1lbSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIlVua25vd24gdHlwZSBhcHBlbmRpbmcgdG8gUmVwZWF0ZWRGaWVsZCIpOwotICB9Ci0KLSAgcmV0dXJuIGR1cHBlZDsKLX0KLQotLyoKLSAqIGNhbGwtc2VxOgotICogICAgIFJlcGVhdGVkRmllbGQuY29uY2F0KG90aGVyKSA9PiBzZWxmCi0gKgotICogY29uY2F0cyB0aGUgcGFzc2VkIGluIGFycmF5IHRvIHNlbGYuICBSZXR1cm5zIGEgUnVieSBhcnJheS4KLSAqLwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9jb25jYXQoVkFMVUUgX3NlbGYsIFZBTFVFIGxpc3QpIHsKLSAgQ2hlY2tfVHlwZShsaXN0LCBUX0FSUkFZKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBSQVJSQVlfTEVOKGxpc3QpOyBpKyspIHsKLSAgICBSZXBlYXRlZEZpZWxkX3B1c2goX3NlbGYsIHJiX2FyeV9lbnRyeShsaXN0LCBpKSk7Ci0gIH0KLSAgcmV0dXJuIF9zZWxmOwotfQotCi0KLXZvaWQgdmFsaWRhdGVfdHlwZV9jbGFzcyh1cGJfZmllbGR0eXBlX3QgdHlwZSwgVkFMVUUga2xhc3MpIHsKLSAgaWYgKHJiX2l2YXJfZ2V0KGtsYXNzLCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkKSA9PSBRbmlsKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLAotICAgICAgICAgICAgICJUeXBlIGNsYXNzIGhhcyBubyBkZXNjcmlwdG9yLiBQbGVhc2UgcGFzcyBhICIKLSAgICAgICAgICAgICAiY2xhc3Mgb3IgZW51bSBhcyByZXR1cm5lZCBieSB0aGUgRGVzY3JpcHRvclBvb2wuIik7Ci0gIH0KLSAgaWYgKHR5cGUgPT0gVVBCX1RZUEVfTUVTU0FHRSkgewotICAgIFZBTFVFIGRlc2MgPSByYl9pdmFyX2dldChrbGFzcywgZGVzY3JpcHRvcl9pbnN0YW5jZXZhcl9pbnRlcm5lZCk7Ci0gICAgaWYgKCFSQl9UWVBFX1AoZGVzYywgVF9EQVRBKSB8fCAhUlRZUEVEREFUQV9QKGRlc2MpIHx8Ci0gICAgICAgIFJUWVBFRERBVEFfVFlQRShkZXNjKSAhPSAmX0Rlc2NyaXB0b3JfdHlwZSkgewotICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRGVzY3JpcHRvciBoYXMgYW4gaW5jb3JyZWN0IHR5cGUuIik7Ci0gICAgfQotICAgIGlmIChyYl9nZXRfYWxsb2NfZnVuYyhrbGFzcykgIT0gJk1lc3NhZ2VfYWxsb2MpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwKLSAgICAgICAgICAgICAgICJNZXNzYWdlIGNsYXNzIHdhcyBub3QgcmV0dXJuZWQgYnkgdGhlIERlc2NyaXB0b3JQb29sLiIpOwotICAgIH0KLSAgfSBlbHNlIGlmICh0eXBlID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICBWQUxVRSBlbnVtZGVzYyA9IHJiX2l2YXJfZ2V0KGtsYXNzLCBkZXNjcmlwdG9yX2luc3RhbmNldmFyX2ludGVybmVkKTsKLSAgICBpZiAoIVJCX1RZUEVfUChlbnVtZGVzYywgVF9EQVRBKSB8fCAhUlRZUEVEREFUQV9QKGVudW1kZXNjKSB8fAotICAgICAgICBSVFlQRUREQVRBX1RZUEUoZW51bWRlc2MpICE9ICZfRW51bURlc2NyaXB0b3JfdHlwZSkgewotICAgICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRGVzY3JpcHRvciBoYXMgYW4gaW5jb3JyZWN0IHR5cGUuIik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgUmVwZWF0ZWRGaWVsZF9pbml0X2FyZ3MoaW50IGFyZ2MsIFZBTFVFKiBhcmd2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBWQUxVRSBfc2VsZikgewotICBSZXBlYXRlZEZpZWxkKiBzZWxmID0gcnVieV90b19SZXBlYXRlZEZpZWxkKF9zZWxmKTsKLSAgVkFMVUUgYXJ5ID0gUW5pbDsKLSAgaWYgKGFyZ2MgPCAxKSB7Ci0gICAgcmJfcmFpc2UocmJfZUFyZ0Vycm9yLCAiRXhwZWN0ZWQgYXQgbGVhc3QgMSBhcmd1bWVudC4iKTsKLSAgfQotICBzZWxmLT5maWVsZF90eXBlID0gcnVieV90b19maWVsZHR5cGUoYXJndlswXSk7Ci0KLSAgaWYgKHNlbGYtPmZpZWxkX3R5cGUgPT0gVVBCX1RZUEVfTUVTU0FHRSB8fAotICAgICAgc2VsZi0+ZmllbGRfdHlwZSA9PSBVUEJfVFlQRV9FTlVNKSB7Ci0gICAgaWYgKGFyZ2MgPCAyKSB7Ci0gICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJFeHBlY3RlZCBhdCBsZWFzdCAyIGFyZ3VtZW50cyBmb3IgbWVzc2FnZS9lbnVtLiIpOwotICAgIH0KLSAgICBzZWxmLT5maWVsZF90eXBlX2NsYXNzID0gYXJndlsxXTsKLSAgICBpZiAoYXJnYyA+IDIpIHsKLSAgICAgIGFyeSA9IGFyZ3ZbMl07Ci0gICAgfQotICAgIHZhbGlkYXRlX3R5cGVfY2xhc3Moc2VsZi0+ZmllbGRfdHlwZSwgc2VsZi0+ZmllbGRfdHlwZV9jbGFzcyk7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGFyZ2MgPiAyKSB7Ci0gICAgICByYl9yYWlzZShyYl9lQXJnRXJyb3IsICJUb28gbWFueSBhcmd1bWVudHM6IGV4cGVjdGVkIDEgb3IgMi4iKTsKLSAgICB9Ci0gICAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgICBhcnkgPSBhcmd2WzFdOwotICAgIH0KLSAgfQotCi0gIGlmIChhcnkgIT0gUW5pbCkgewotICAgIGlmICghUkJfVFlQRV9QKGFyeSwgVF9BUlJBWSkpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VBcmdFcnJvciwgIkV4cGVjdGVkIGFycmF5IGFzIGluaXRpYWxpemUgYXJndW1lbnQiKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBSQVJSQVlfTEVOKGFyeSk7IGkrKykgewotICAgICAgUmVwZWF0ZWRGaWVsZF9wdXNoKF9zZWxmLCByYl9hcnlfZW50cnkoYXJ5LCBpKSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIE1hcmssIGZyZWUsIGFsbG9jLCBpbml0IGFuZCBjbGFzcyBzZXR1cCBmdW5jdGlvbnMuCi0KLXZvaWQgUmVwZWF0ZWRGaWVsZF9tYXJrKHZvaWQqIF9zZWxmKSB7Ci0gIFJlcGVhdGVkRmllbGQqIHNlbGYgPSAoUmVwZWF0ZWRGaWVsZCopX3NlbGY7Ci0gIHVwYl9maWVsZHR5cGVfdCBmaWVsZF90eXBlID0gc2VsZi0+ZmllbGRfdHlwZTsKLSAgaW50IGVsZW1lbnRfc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUoZmllbGRfdHlwZSk7Ci0gIHJiX2djX21hcmsoc2VsZi0+ZmllbGRfdHlwZV9jbGFzcyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2VsZi0+c2l6ZTsgaSsrKSB7Ci0gICAgdm9pZCogbWVtb3J5ID0gKCgodWludDhfdCAqKXNlbGYtPmVsZW1lbnRzKSArIGkgKiBlbGVtZW50X3NpemUpOwotICAgIG5hdGl2ZV9zbG90X21hcmsoc2VsZi0+ZmllbGRfdHlwZSwgbWVtb3J5KTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkRmllbGRfZnJlZSh2b2lkKiBfc2VsZikgewotICBSZXBlYXRlZEZpZWxkKiBzZWxmID0gKFJlcGVhdGVkRmllbGQqKV9zZWxmOwotICB4ZnJlZShzZWxmLT5lbGVtZW50cyk7Ci0gIHhmcmVlKHNlbGYpOwotfQotCi0vKgotICogY2FsbC1zZXE6Ci0gKiAgICAgUmVwZWF0ZWRGaWVsZC5uZXcodHlwZSwgdHlwZV9jbGFzcyA9IG5pbCwgaW5pdGlhbF9lbGVtcyA9IFtdKQotICoKLSAqIENyZWF0ZXMgYSBuZXcgcmVwZWF0ZWQgZmllbGQuIFRoZSBwcm92aWRlZCB0eXBlIG11c3QgYmUgYSBSdWJ5IHN5bWJvbCwgYW5kCi0gKiBjYW4gdGFrZSBvbiB0aGUgc2FtZSB2YWx1ZXMgYXMgdGhvc2UgYWNjZXB0ZWQgYnkgRmllbGREZXNjcmlwdG9yI3R5cGU9LiBJZgotICogdGhlIHR5cGUgaXMgOm1lc3NhZ2Ugb3IgOmVudW0sIHR5cGVfY2xhc3MgbXVzdCBiZSBub24tbmlsLCBhbmQgbXVzdCBiZSB0aGUKLSAqIFJ1YnkgY2xhc3Mgb3IgbW9kdWxlIHJldHVybmVkIGJ5IERlc2NyaXB0b3IjbXNnY2xhc3Mgb3IKLSAqIEVudW1EZXNjcmlwdG9yI2VudW1tb2R1bGUsIHJlc3BlY3RpdmVseS4gQW4gaW5pdGlhbCBsaXN0IG9mIGVsZW1lbnRzIG1heSBhbHNvCi0gKiBiZSBwcm92aWRlZC4KLSAqLwotVkFMVUUgUmVwZWF0ZWRGaWVsZF9hbGxvYyhWQUxVRSBrbGFzcykgewotICBSZXBlYXRlZEZpZWxkKiBzZWxmID0gQUxMT0MoUmVwZWF0ZWRGaWVsZCk7Ci0gIHNlbGYtPmVsZW1lbnRzID0gTlVMTDsKLSAgc2VsZi0+c2l6ZSA9IDA7Ci0gIHNlbGYtPmNhcGFjaXR5ID0gMDsKLSAgc2VsZi0+ZmllbGRfdHlwZSA9IC0xOwotICBzZWxmLT5maWVsZF90eXBlX2NsYXNzID0gUW5pbDsKLSAgcmV0dXJuIFR5cGVkRGF0YV9XcmFwX1N0cnVjdChrbGFzcywgJlJlcGVhdGVkRmllbGRfdHlwZSwgc2VsZik7Ci19Ci0KLVZBTFVFIFJlcGVhdGVkRmllbGRfaW5pdChpbnQgYXJnYywgVkFMVUUqIGFyZ3YsIFZBTFVFIHNlbGYpIHsKLSAgUmVwZWF0ZWRGaWVsZF9pbml0X2FyZ3MoYXJnYywgYXJndiwgc2VsZik7Ci0gIHJldHVybiBRbmlsOwotfQotCi12b2lkIFJlcGVhdGVkRmllbGRfcmVnaXN0ZXIoVkFMVUUgbW9kdWxlKSB7Ci0gIFZBTFVFIGtsYXNzID0gcmJfZGVmaW5lX2NsYXNzX3VuZGVyKAotICAgICAgbW9kdWxlLCAiUmVwZWF0ZWRGaWVsZCIsIHJiX2NPYmplY3QpOwotICByYl9kZWZpbmVfYWxsb2NfZnVuYyhrbGFzcywgUmVwZWF0ZWRGaWVsZF9hbGxvYyk7Ci0gIGNSZXBlYXRlZEZpZWxkID0ga2xhc3M7Ci0gIHJiX2djX3JlZ2lzdGVyX2FkZHJlc3MoJmNSZXBlYXRlZEZpZWxkKTsKLQotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiaW5pdGlhbGl6ZSIsCi0gICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZF9pbml0LCAtMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJlYWNoIiwgUmVwZWF0ZWRGaWVsZF9lYWNoLCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgIltdIiwgUmVwZWF0ZWRGaWVsZF9pbmRleCwgLTEpOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiYXQiLCBSZXBlYXRlZEZpZWxkX2luZGV4LCAtMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJbXT0iLCBSZXBlYXRlZEZpZWxkX2luZGV4X3NldCwgMik7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJwdXNoIiwgUmVwZWF0ZWRGaWVsZF9wdXNoLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgIjw8IiwgUmVwZWF0ZWRGaWVsZF9wdXNoLCAxKTsKLSAgcmJfZGVmaW5lX3ByaXZhdGVfbWV0aG9kKGtsYXNzLCAicG9wX29uZSIsIFJlcGVhdGVkRmllbGRfcG9wX29uZSwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJyZXBsYWNlIiwgUmVwZWF0ZWRGaWVsZF9yZXBsYWNlLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImNsZWFyIiwgUmVwZWF0ZWRGaWVsZF9jbGVhciwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJsZW5ndGgiLCBSZXBlYXRlZEZpZWxkX2xlbmd0aCwgMCk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJzaXplIiwgUmVwZWF0ZWRGaWVsZF9sZW5ndGgsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiZHVwIiwgUmVwZWF0ZWRGaWVsZF9kdXAsIDApOwotICAvLyBBbHNvIGRlZmluZSAjY2xvbmUgc28gdGhhdCB3ZSBkb24ndCBpbmhlcml0IE9iamVjdCNjbG9uZS4KLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImNsb25lIiwgUmVwZWF0ZWRGaWVsZF9kdXAsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiPT0iLCBSZXBlYXRlZEZpZWxkX2VxLCAxKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgInRvX2FyeSIsIFJlcGVhdGVkRmllbGRfdG9fYXJ5LCAwKTsKLSAgcmJfZGVmaW5lX21ldGhvZChrbGFzcywgImhhc2giLCBSZXBlYXRlZEZpZWxkX2hhc2gsIDApOwotICByYl9kZWZpbmVfbWV0aG9kKGtsYXNzLCAiKyIsIFJlcGVhdGVkRmllbGRfcGx1cywgMSk7Ci0gIHJiX2RlZmluZV9tZXRob2Qoa2xhc3MsICJjb25jYXQiLCBSZXBlYXRlZEZpZWxkX2NvbmNhdCwgMSk7Ci0gIHJiX2luY2x1ZGVfbW9kdWxlKGtsYXNzLCByYl9tRW51bWVyYWJsZSk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9zdG9yYWdlLmMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy9zdG9yYWdlLmMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGIxZjY1ZjQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2Mvc3RvcmFnZS5jCisrKyAvZGV2L251bGwKQEAgLTEsODYzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaW5jbHVkZSAicHJvdG9idWYuaCIKLQotI2luY2x1ZGUgPG1hdGguaD4KLQotI2luY2x1ZGUgPHJ1YnkvZW5jb2RpbmcuaD4KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFJ1YnkgPC0+IG5hdGl2ZSBzbG90IG1hbmFnZW1lbnQuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIERFUkVGKG1lbW9yeSwgdHlwZSkgKih0eXBlKikobWVtb3J5KQotCi1zaXplX3QgbmF0aXZlX3Nsb3Rfc2l6ZSh1cGJfZmllbGR0eXBlX3QgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0ZMT0FUOiAgIHJldHVybiA0OwotICAgIGNhc2UgVVBCX1RZUEVfRE9VQkxFOiAgcmV0dXJuIDg7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOiAgICByZXR1cm4gMTsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzogIHJldHVybiBzaXplb2YoVkFMVUUpOwotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6ICAgcmV0dXJuIHNpemVvZihWQUxVRSk7Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOiByZXR1cm4gc2l6ZW9mKFZBTFVFKTsKLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06ICAgIHJldHVybiA0OwotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6ICAgcmV0dXJuIDQ7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDogICByZXR1cm4gODsKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjogIHJldHVybiA0OwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OiAgcmV0dXJuIDg7Ci0gICAgZGVmYXVsdDogcmV0dXJuIDA7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgaXNfcnVieV9udW0oVkFMVUUgdmFsdWUpIHsKLSAgcmV0dXJuIChUWVBFKHZhbHVlKSA9PSBUX0ZMT0FUIHx8Ci0gICAgICAgICAgVFlQRSh2YWx1ZSkgPT0gVF9GSVhOVU0gfHwKLSAgICAgICAgICBUWVBFKHZhbHVlKSA9PSBUX0JJR05VTSk7Ci19Ci0KLXZvaWQgbmF0aXZlX3Nsb3RfY2hlY2tfaW50X3JhbmdlX3ByZWNpc2lvbih1cGJfZmllbGR0eXBlX3QgdHlwZSwgVkFMVUUgdmFsKSB7Ci0gIGlmICghaXNfcnVieV9udW0odmFsKSkgewotICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJFeHBlY3RlZCBudW1iZXIgdHlwZSBmb3IgaW50ZWdyYWwgZmllbGQuIik7Ci0gIH0KLQotICAvLyBOVU0ye0lOVCxVSU5ULExMLFVMTH0gbWFjcm9zIGRvIHRoZSBhcHByb3ByaWF0ZSByYW5nZSBjaGVja3Mgb24gdXBwZXIKLSAgLy8gYm91bmQ7IHdlIGp1c3QgbmVlZCB0byBkbyBwcmVjaXNpb24gY2hlY2tzIChpLmUuLCBkaXNhbGxvdyByb3VuZGluZykgYW5kCi0gIC8vIGNoZWNrIGZvciA8IDAgb24gdW5zaWduZWQgdHlwZXMuCi0gIGlmIChUWVBFKHZhbCkgPT0gVF9GTE9BVCkgewotICAgIGRvdWJsZSBkYmxfdmFsID0gTlVNMkRCTCh2YWwpOwotICAgIGlmIChmbG9vcihkYmxfdmFsKSAhPSBkYmxfdmFsKSB7Ci0gICAgICByYl9yYWlzZShyYl9lUmFuZ2VFcnJvciwKLSAgICAgICAgICAgICAgICJOb24taW50ZWdyYWwgZmxvYXRpbmcgcG9pbnQgdmFsdWUgYXNzaWduZWQgdG8gaW50ZWdlciBmaWVsZC4iKTsKLSAgICB9Ci0gIH0KLSAgaWYgKHR5cGUgPT0gVVBCX1RZUEVfVUlOVDMyIHx8IHR5cGUgPT0gVVBCX1RZUEVfVUlOVDY0KSB7Ci0gICAgaWYgKE5VTTJEQkwodmFsKSA8IDApIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VSYW5nZUVycm9yLAotICAgICAgICAgICAgICAgIkFzc2lnbmluZyBuZWdhdGl2ZSB2YWx1ZSB0byB1bnNpZ25lZCBpbnRlZ2VyIGZpZWxkLiIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIG5hdGl2ZV9zbG90X3ZhbGlkYXRlX3N0cmluZ19lbmNvZGluZyh1cGJfZmllbGR0eXBlX3QgdHlwZSwgVkFMVUUgdmFsdWUpIHsKLSAgYm9vbCBiYWRfZW5jb2RpbmcgPSBmYWxzZTsKLSAgcmJfZW5jb2RpbmcqIHN0cmluZ19lbmNvZGluZyA9IHJiX2VuY19mcm9tX2luZGV4KEVOQ09ESU5HX0dFVCh2YWx1ZSkpOwotICBpZiAodHlwZSA9PSBVUEJfVFlQRV9TVFJJTkcpIHsKLSAgICBiYWRfZW5jb2RpbmcgPQotICAgICAgICBzdHJpbmdfZW5jb2RpbmcgIT0ga1J1YnlTdHJpbmdVdGY4RW5jb2RpbmcgJiYKLSAgICAgICAgc3RyaW5nX2VuY29kaW5nICE9IGtSdWJ5U3RyaW5nQVNDSUlFbmNvZGluZzsKLSAgfSBlbHNlIHsKLSAgICBiYWRfZW5jb2RpbmcgPQotICAgICAgICBzdHJpbmdfZW5jb2RpbmcgIT0ga1J1YnlTdHJpbmc4Yml0RW5jb2Rpbmc7Ci0gIH0KLSAgLy8gQ2hlY2sgdGhhdCBlbmNvZGluZyBpcyBVVEYtOCBvciBBU0NJSSAoZm9yIHN0cmluZyBmaWVsZHMpIG9yIEFTQ0lJLThCSVQKLSAgLy8gKGZvciBieXRlcyBmaWVsZHMpLgotICBpZiAoYmFkX2VuY29kaW5nKSB7Ci0gICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIkVuY29kaW5nIGZvciAnJXMnIGZpZWxkcyBtdXN0IGJlICVzICh3YXMgJXMpIiwKLSAgICAgICAgICAgICAodHlwZSA9PSBVUEJfVFlQRV9TVFJJTkcpID8gInN0cmluZyIgOiAiYnl0ZXMiLAotICAgICAgICAgICAgICh0eXBlID09IFVQQl9UWVBFX1NUUklORykgPyAiVVRGLTggb3IgQVNDSUkiIDogIkFTQ0lJLThCSVQiLAotICAgICAgICAgICAgIHJiX2VuY19uYW1lKHN0cmluZ19lbmNvZGluZykpOwotICB9Ci19Ci0KLXZvaWQgbmF0aXZlX3Nsb3Rfc2V0KHVwYl9maWVsZHR5cGVfdCB0eXBlLCBWQUxVRSB0eXBlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCogbWVtb3J5LCBWQUxVRSB2YWx1ZSkgewotICBuYXRpdmVfc2xvdF9zZXRfdmFsdWVfYW5kX2Nhc2UodHlwZSwgdHlwZV9jbGFzcywgbWVtb3J5LCB2YWx1ZSwgTlVMTCwgMCk7Ci19Ci0KLXZvaWQgbmF0aXZlX3Nsb3Rfc2V0X3ZhbHVlX2FuZF9jYXNlKHVwYl9maWVsZHR5cGVfdCB0eXBlLCBWQUxVRSB0eXBlX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogbWVtb3J5LCBWQUxVRSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KiBjYXNlX21lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGNhc2VfbnVtYmVyKSB7Ci0gIC8vIE5vdGUgdGhhdCBpbiBvcmRlciB0byBhdG9taWNhbGx5IGNoYW5nZSB0aGUgdmFsdWUgaW4gbWVtb3J5IGFuZCB0aGUgY2FzZQotICAvLyB2YWx1ZSAody5yLnQuIFJ1YnkgVk0gY2FsbHMpLCB3ZSBtdXN0IHNldCB0aGUgdmFsdWUgYXQgfG1lbW9yeXwgb25seSBhZnRlcgotICAvLyBhbGwgUnVieSBWTSBjYWxscyBhcmUgY29tcGxldGUuIFRoZSBjYXNlIGlzIHRoZW4gc2V0IGF0IHRoZSBib3R0b20gb2YgdGhpcwotICAvLyBmdW5jdGlvbi4KLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDoKLSAgICAgIGlmICghaXNfcnVieV9udW0odmFsdWUpKSB7Ci0gICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJFeHBlY3RlZCBudW1iZXIgdHlwZSBmb3IgZmxvYXQgZmllbGQuIik7Ci0gICAgICB9Ci0gICAgICBERVJFRihtZW1vcnksIGZsb2F0KSA9IE5VTTJEQkwodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9ET1VCTEU6Ci0gICAgICBpZiAoIWlzX3J1YnlfbnVtKHZhbHVlKSkgewotICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAiRXhwZWN0ZWQgbnVtYmVyIHR5cGUgZm9yIGRvdWJsZSBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIERFUkVGKG1lbW9yeSwgZG91YmxlKSA9IE5VTTJEQkwodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOiB7Ci0gICAgICBpbnQ4X3QgdmFsID0gLTE7Ci0gICAgICBpZiAodmFsdWUgPT0gUXRydWUpIHsKLSAgICAgICAgdmFsID0gMTsKLSAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gUWZhbHNlKSB7Ci0gICAgICAgIHZhbCA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAiSW52YWxpZCBhcmd1bWVudCBmb3IgYm9vbGVhbiBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIERFUkVGKG1lbW9yeSwgaW50OF90KSA9IHZhbDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOiB7Ci0gICAgICBpZiAoQ0xBU1NfT0YodmFsdWUpICE9IHJiX2NTdHJpbmcpIHsKLSAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIkludmFsaWQgYXJndW1lbnQgZm9yIHN0cmluZyBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIG5hdGl2ZV9zbG90X3ZhbGlkYXRlX3N0cmluZ19lbmNvZGluZyh0eXBlLCB2YWx1ZSk7Ci0gICAgICBERVJFRihtZW1vcnksIFZBTFVFKSA9IHZhbHVlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfTUVTU0FHRTogewotICAgICAgaWYgKENMQVNTX09GKHZhbHVlKSA9PSBDTEFTU19PRihRbmlsKSkgewotICAgICAgICB2YWx1ZSA9IFFuaWw7Ci0gICAgICB9IGVsc2UgaWYgKENMQVNTX09GKHZhbHVlKSAhPSB0eXBlX2NsYXNzKSB7Ci0gICAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJJbnZhbGlkIHR5cGUgJXMgdG8gYXNzaWduIHRvIHN1Ym1lc3NhZ2UgZmllbGQuIiwKLSAgICAgICAgICAgICAgICAgcmJfY2xhc3MybmFtZShDTEFTU19PRih2YWx1ZSkpKTsKLSAgICAgIH0KLSAgICAgIERFUkVGKG1lbW9yeSwgVkFMVUUpID0gdmFsdWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9FTlVNOiB7Ci0gICAgICBpbnQzMl90IGludF92YWwgPSAwOwotICAgICAgaWYgKCFpc19ydWJ5X251bSh2YWx1ZSkgJiYgVFlQRSh2YWx1ZSkgIT0gVF9TWU1CT0wpIHsKLSAgICAgICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIG51bWJlciBvciBzeW1ib2wgdHlwZSBmb3IgZW51bSBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIGlmIChUWVBFKHZhbHVlKSA9PSBUX1NZTUJPTCkgewotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZ2l2ZW4gc3ltYm9sIGV4aXN0cyBpbiB0aGUgZW51bSBtb2R1bGUuCi0gICAgICAgIFZBTFVFIGxvb2t1cCA9IHJiX2Z1bmNhbGwodHlwZV9jbGFzcywgcmJfaW50ZXJuKCJyZXNvbHZlIiksIDEsIHZhbHVlKTsKLSAgICAgICAgaWYgKGxvb2t1cCA9PSBRbmlsKSB7Ci0gICAgICAgICAgcmJfcmFpc2UocmJfZVJhbmdlRXJyb3IsICJVbmtub3duIHN5bWJvbCB2YWx1ZSBmb3IgZW51bSBmaWVsZC4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpbnRfdmFsID0gTlVNMklOVChsb29rdXApOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBuYXRpdmVfc2xvdF9jaGVja19pbnRfcmFuZ2VfcHJlY2lzaW9uKFVQQl9UWVBFX0lOVDMyLCB2YWx1ZSk7Ci0gICAgICAgIGludF92YWwgPSBOVU0ySU5UKHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIERFUkVGKG1lbW9yeSwgaW50MzJfdCkgPSBpbnRfdmFsOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjoKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAgIG5hdGl2ZV9zbG90X2NoZWNrX2ludF9yYW5nZV9wcmVjaXNpb24odHlwZSwgdmFsdWUpOwotICAgICAgc3dpdGNoICh0eXBlKSB7Ci0gICAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOgotICAgICAgICBERVJFRihtZW1vcnksIGludDMyX3QpID0gTlVNMklOVCh2YWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgICAgREVSRUYobWVtb3J5LCBpbnQ2NF90KSA9IE5VTTJMTCh2YWx1ZSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgICAgIERFUkVGKG1lbW9yeSwgdWludDMyX3QpID0gTlVNMlVJTlQodmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgICBERVJFRihtZW1vcnksIHVpbnQ2NF90KSA9IE5VTTJVTEwodmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgaWYgKGNhc2VfbWVtb3J5ICE9IE5VTEwpIHsKLSAgICAqY2FzZV9tZW1vcnkgPSBjYXNlX251bWJlcjsKLSAgfQotfQotCi1WQUxVRSBuYXRpdmVfc2xvdF9nZXQodXBiX2ZpZWxkdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgVkFMVUUgdHlwZV9jbGFzcywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBtZW1vcnkpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDoKLSAgICAgIHJldHVybiBEQkwyTlVNKERFUkVGKG1lbW9yeSwgZmxvYXQpKTsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiBEQkwyTlVNKERFUkVGKG1lbW9yeSwgZG91YmxlKSk7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOgotICAgICAgcmV0dXJuIERFUkVGKG1lbW9yeSwgaW50OF90KSA/IFF0cnVlIDogUWZhbHNlOwotICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOgotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuIERFUkVGKG1lbW9yeSwgVkFMVUUpOwotICAgIGNhc2UgVVBCX1RZUEVfRU5VTTogewotICAgICAgaW50MzJfdCB2YWwgPSBERVJFRihtZW1vcnksIGludDMyX3QpOwotICAgICAgVkFMVUUgc3ltYm9sID0gZW51bV9sb29rdXAodHlwZV9jbGFzcywgSU5UMk5VTSh2YWwpKTsKLSAgICAgIGlmIChzeW1ib2wgPT0gUW5pbCkgewotICAgICAgICByZXR1cm4gSU5UMk5VTSh2YWwpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN5bWJvbDsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICAgIHJldHVybiBJTlQyTlVNKERFUkVGKG1lbW9yeSwgaW50MzJfdCkpOwotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6Ci0gICAgICByZXR1cm4gTEwyTlVNKERFUkVGKG1lbW9yeSwgaW50NjRfdCkpOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgICAgcmV0dXJuIFVJTlQyTlVNKERFUkVGKG1lbW9yeSwgdWludDMyX3QpKTsKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAgIHJldHVybiBVTEwyTlVNKERFUkVGKG1lbW9yeSwgdWludDY0X3QpKTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIFFuaWw7Ci0gIH0KLX0KLQotdm9pZCBuYXRpdmVfc2xvdF9pbml0KHVwYl9maWVsZHR5cGVfdCB0eXBlLCB2b2lkKiBtZW1vcnkpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDoKLSAgICAgIERFUkVGKG1lbW9yeSwgZmxvYXQpID0gMC4wOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9ET1VCTEU6Ci0gICAgICBERVJFRihtZW1vcnksIGRvdWJsZSkgPSAwLjA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0JPT0w6Ci0gICAgICBERVJFRihtZW1vcnksIGludDhfdCkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzoKLSAgICAgIERFUkVGKG1lbW9yeSwgVkFMVUUpID0gcmJfc3RyX25ldzIoIiIpOwotICAgICAgcmJfZW5jX2Fzc29jaWF0ZShERVJFRihtZW1vcnksIFZBTFVFKSwgKHR5cGUgPT0gVVBCX1RZUEVfQllURVMpID8KLSAgICAgICAgICAgICAgICAgICAgICAga1J1YnlTdHJpbmc4Yml0RW5jb2RpbmcgOiBrUnVieVN0cmluZ1V0ZjhFbmNvZGluZyk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6Ci0gICAgICBERVJFRihtZW1vcnksIFZBTFVFKSA9IFFuaWw7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICAgIERFUkVGKG1lbW9yeSwgaW50MzJfdCkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgIERFUkVGKG1lbW9yeSwgaW50NjRfdCkgPSAwOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgICBERVJFRihtZW1vcnksIHVpbnQzMl90KSA9IDA7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAgIERFUkVGKG1lbW9yeSwgdWludDY0X3QpID0gMDsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIG5hdGl2ZV9zbG90X21hcmsodXBiX2ZpZWxkdHlwZV90IHR5cGUsIHZvaWQqIG1lbW9yeSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgIGNhc2UgVVBCX1RZUEVfTUVTU0FHRToKLSAgICAgIHJiX2djX21hcmsoREVSRUYobWVtb3J5LCBWQUxVRSkpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgbmF0aXZlX3Nsb3RfZHVwKHVwYl9maWVsZHR5cGVfdCB0eXBlLCB2b2lkKiB0bywgdm9pZCogZnJvbSkgewotICBtZW1jcHkodG8sIGZyb20sIG5hdGl2ZV9zbG90X3NpemUodHlwZSkpOwotfQotCi12b2lkIG5hdGl2ZV9zbG90X2RlZXBfY29weSh1cGJfZmllbGR0eXBlX3QgdHlwZSwgdm9pZCogdG8sIHZvaWQqIGZyb20pIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzogewotICAgICAgVkFMVUUgZnJvbV92YWwgPSBERVJFRihmcm9tLCBWQUxVRSk7Ci0gICAgICBERVJFRih0bywgVkFMVUUpID0gKGZyb21fdmFsICE9IFFuaWwpID8KLSAgICAgICAgICByYl9mdW5jYWxsKGZyb21fdmFsLCByYl9pbnRlcm4oImR1cCIpLCAwKSA6IFFuaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOiB7Ci0gICAgICBWQUxVRSBmcm9tX3ZhbCA9IERFUkVGKGZyb20sIFZBTFVFKTsKLSAgICAgIERFUkVGKHRvLCBWQUxVRSkgPSAoZnJvbV92YWwgIT0gUW5pbCkgPwotICAgICAgICAgIE1lc3NhZ2VfZGVlcF9jb3B5KGZyb21fdmFsKSA6IFFuaWw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIG1lbWNweSh0bywgZnJvbSwgbmF0aXZlX3Nsb3Rfc2l6ZSh0eXBlKSk7Ci0gIH0KLX0KLQotYm9vbCBuYXRpdmVfc2xvdF9lcSh1cGJfZmllbGR0eXBlX3QgdHlwZSwgdm9pZCogbWVtMSwgdm9pZCogbWVtMikgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgIGNhc2UgVVBCX1RZUEVfTUVTU0FHRTogewotICAgICAgVkFMVUUgdmFsMSA9IERFUkVGKG1lbTEsIFZBTFVFKTsKLSAgICAgIFZBTFVFIHZhbDIgPSBERVJFRihtZW0yLCBWQUxVRSk7Ci0gICAgICBWQUxVRSByZXQgPSByYl9mdW5jYWxsKHZhbDEsIHJiX2ludGVybigiPT0iKSwgMSwgdmFsMik7Ci0gICAgICByZXR1cm4gcmV0ID09IFF0cnVlOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuICFtZW1jbXAobWVtMSwgbWVtMiwgbmF0aXZlX3Nsb3Rfc2l6ZSh0eXBlKSk7Ci0gIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIE1hcCBmaWVsZCB1dGlsaXRpZXMuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCB1cGJfbXNnZGVmKiB0cnlnZXRfbWFwX2VudHJ5X21zZ2RlZihjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYqIHN1YmRlZjsKLSAgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgIT0gVVBCX0xBQkVMX1JFUEVBVEVEIHx8Ci0gICAgICB1cGJfZmllbGRkZWZfdHlwZShmaWVsZCkgIT0gVVBCX1RZUEVfTUVTU0FHRSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIHN1YmRlZiA9IHVwYl9maWVsZGRlZl9tc2dzdWJkZWYoZmllbGQpOwotICByZXR1cm4gdXBiX21zZ2RlZl9tYXBlbnRyeShzdWJkZWYpID8gc3ViZGVmIDogTlVMTDsKLX0KLQotY29uc3QgdXBiX21zZ2RlZiAqbWFwX2VudHJ5X21zZ2RlZihjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYqIHN1YmRlZiA9IHRyeWdldF9tYXBfZW50cnlfbXNnZGVmKGZpZWxkKTsKLSAgYXNzZXJ0KHN1YmRlZik7Ci0gIHJldHVybiBzdWJkZWY7Ci19Ci0KLWJvb2wgaXNfbWFwX2ZpZWxkKGNvbnN0IHVwYl9maWVsZGRlZiAqZmllbGQpIHsKLSAgcmV0dXJuIHRyeWdldF9tYXBfZW50cnlfbXNnZGVmKGZpZWxkKSAhPSBOVUxMOwotfQotCi1jb25zdCB1cGJfZmllbGRkZWYqIG1hcF9maWVsZF9rZXkoY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCkgewotICBjb25zdCB1cGJfbXNnZGVmKiBzdWJkZWYgPSBtYXBfZW50cnlfbXNnZGVmKGZpZWxkKTsKLSAgcmV0dXJuIG1hcF9lbnRyeV9rZXkoc3ViZGVmKTsKLX0KLQotY29uc3QgdXBiX2ZpZWxkZGVmKiBtYXBfZmllbGRfdmFsdWUoY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCkgewotICBjb25zdCB1cGJfbXNnZGVmKiBzdWJkZWYgPSBtYXBfZW50cnlfbXNnZGVmKGZpZWxkKTsKLSAgcmV0dXJuIG1hcF9lbnRyeV92YWx1ZShzdWJkZWYpOwotfQotCi1jb25zdCB1cGJfZmllbGRkZWYqIG1hcF9lbnRyeV9rZXkoY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmKSB7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZioga2V5X2ZpZWxkID0gdXBiX21zZ2RlZl9pdG9mKG1zZ2RlZiwgTUFQX0tFWV9GSUVMRCk7Ci0gIGFzc2VydChrZXlfZmllbGQgIT0gTlVMTCk7Ci0gIHJldHVybiBrZXlfZmllbGQ7Ci19Ci0KLWNvbnN0IHVwYl9maWVsZGRlZiogbWFwX2VudHJ5X3ZhbHVlKGNvbnN0IHVwYl9tc2dkZWYqIG1zZ2RlZikgewotICBjb25zdCB1cGJfZmllbGRkZWYqIHZhbHVlX2ZpZWxkID0gdXBiX21zZ2RlZl9pdG9mKG1zZ2RlZiwgTUFQX1ZBTFVFX0ZJRUxEKTsKLSAgYXNzZXJ0KHZhbHVlX2ZpZWxkICE9IE5VTEwpOwotICByZXR1cm4gdmFsdWVfZmllbGQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNZW1vcnkgbGF5b3V0IG1hbmFnZW1lbnQuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgc2l6ZV90IGFsaWduX3VwX3RvKHNpemVfdCBvZmZzZXQsIHNpemVfdCBncmFudWxhcml0eSkgewotICAvLyBHcmFudWxhcml0eSBtdXN0IGJlIGEgcG93ZXIgb2YgdHdvLgotICByZXR1cm4gKG9mZnNldCArIGdyYW51bGFyaXR5IC0gMSkgJiB+KGdyYW51bGFyaXR5IC0gMSk7Ci19Ci0KLU1lc3NhZ2VMYXlvdXQqIGNyZWF0ZV9sYXlvdXQoY29uc3QgdXBiX21zZ2RlZiogbXNnZGVmKSB7Ci0gIE1lc3NhZ2VMYXlvdXQqIGxheW91dCA9IEFMTE9DKE1lc3NhZ2VMYXlvdXQpOwotICBpbnQgbmZpZWxkcyA9IHVwYl9tc2dkZWZfbnVtZmllbGRzKG1zZ2RlZik7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpdDsKLSAgdXBiX21zZ19vbmVvZl9pdGVyIG9pdDsKLSAgc2l6ZV90IG9mZiA9IDA7Ci0KLSAgbGF5b3V0LT5maWVsZHMgPSBBTExPQ19OKE1lc3NhZ2VGaWVsZCwgbmZpZWxkcyk7Ci0KLSAgZm9yICh1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpdCwgbXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpdCk7Ci0gICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpdCkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdCk7Ci0gICAgc2l6ZV90IGZpZWxkX3NpemU7Ci0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmaWVsZCkpIHsKLSAgICAgIC8vIE9uZW9mcyBhcmUgaGFuZGxlZCBzZXBhcmF0ZWx5IGJlbG93LgotICAgICAgY29udGludWU7Ci0gICAgfQotCi0gICAgLy8gQWxsb2NhdGUgfGZpZWxkX3NpemV8IGJ5dGVzIGZvciB0aGlzIGZpZWxkIGluIHRoZSBsYXlvdXQuCi0gICAgZmllbGRfc2l6ZSA9IDA7Ci0gICAgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgPT0gVVBCX0xBQkVMX1JFUEVBVEVEKSB7Ci0gICAgICBmaWVsZF9zaXplID0gc2l6ZW9mKFZBTFVFKTsKLSAgICB9IGVsc2UgewotICAgICAgZmllbGRfc2l6ZSA9IG5hdGl2ZV9zbG90X3NpemUodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpKTsKLSAgICB9Ci0gICAgLy8gQWxpZ24gY3VycmVudCBvZmZzZXQgdXAgdG8gfHNpemV8IGdyYW51bGFyaXR5LgotICAgIG9mZiA9IGFsaWduX3VwX3RvKG9mZiwgZmllbGRfc2l6ZSk7Ci0gICAgbGF5b3V0LT5maWVsZHNbdXBiX2ZpZWxkZGVmX2luZGV4KGZpZWxkKV0ub2Zmc2V0ID0gb2ZmOwotICAgIGxheW91dC0+ZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmaWVsZCldLmNhc2Vfb2Zmc2V0ID0KLSAgICAgICAgTUVTU0FHRV9GSUVMRF9OT19DQVNFOwotICAgIG9mZiArPSBmaWVsZF9zaXplOwotICB9Ci0KLSAgLy8gSGFuZGxlIG9uZW9mcyBub3cgLS0gd2UgaXRlcmF0ZSBvdmVyIG9uZW9mcyBzcGVjaWZpY2FsbHkgYW5kIGFsbG9jYXRlIG9ubHkKLSAgLy8gb25lIHNsb3QgcGVyIG9uZW9mLgotICAvLwotICAvLyBXZSBhc3NpZ24gYWxsIHZhbHVlIHNsb3RzIGZpcnN0LCB0aGVuIHBhY2sgdGhlICdjYXNlJyBmaWVsZHMgYXQgdGhlIGVuZCwKLSAgLy8gc2luY2UgaW4gdGhlIGNvbW1vbiBjYXNlIChtb2Rlcm4gNjQtYml0IHBsYXRmb3JtKSB0aGVzZSBhcmUgOCBieXRlcyBhbmQgNAotICAvLyBieXRlcyByZXNwZWN0aXZlbHkgYW5kIHdlIHdhbnQgdG8gYXZvaWQgYWxpZ25tZW50IG92ZXJoZWFkLgotICAvLwotICAvLyBOb3RlIHRoYXQgd2UgcmVzZXJ2ZSA0IGJ5dGVzIChhIHVpbnQzMikgcGVyICdjYXNlJyBzbG90IGJlY2F1c2UgdGhlIHZhbHVlCi0gIC8vIHNwYWNlIGZvciBvbmVvZiBjYXNlcyBpcyBjb25jZXB0dWFsbHkgYXMgd2lkZSBhcyBmaWVsZCB0YWcgbnVtYmVycy4gSW4KLSAgLy8gcHJhY3RpY2UsIGl0J3MgdW5saWtlbHkgdGhhdCBhIG9uZW9mIHdvdWxkIGhhdmUgbW9yZSB0aGFuIGUuZy4gMjU2IG9yIDY0SwotICAvLyBtZW1iZXJzICg4IG9yIDE2IGJpdHMgcmVzcGVjdGl2ZWx5KSwgc28gY29uY2VpdmFibHkgd2UgY291bGQgYXNzaWduCi0gIC8vIGNvbnNlY3V0aXZlIGNhc2UgbnVtYmVycyBhbmQgdGhlbiBwaWNrIGEgc21hbGxlciBvbmVvZiBjYXNlIHNsb3Qgc2l6ZSwgYnV0Ci0gIC8vIHRoZSBjb21wbGV4aXR5IHRvIGltcGxlbWVudCB0aGlzIGluZGlyZWN0aW9uIGlzIHByb2JhYmx5IG5vdCB3b3J0aHdoaWxlLgotICBmb3IgKHVwYl9tc2dfb25lb2ZfYmVnaW4oJm9pdCwgbXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19vbmVvZl9kb25lKCZvaXQpOwotICAgICAgIHVwYl9tc2dfb25lb2ZfbmV4dCgmb2l0KSkgewotICAgIGNvbnN0IHVwYl9vbmVvZmRlZiogb25lb2YgPSB1cGJfbXNnX2l0ZXJfb25lb2YoJm9pdCk7Ci0gICAgdXBiX29uZW9mX2l0ZXIgZml0OwotCi0gICAgLy8gQWx3YXlzIGFsbG9jYXRlIE5BVElWRV9TTE9UX01BWF9TSVpFIGJ5dGVzLCBidXQgc2hhcmUgdGhlIHNsb3QgYmV0d2VlbgotICAgIC8vIGFsbCBmaWVsZHMuCi0gICAgc2l6ZV90IGZpZWxkX3NpemUgPSBOQVRJVkVfU0xPVF9NQVhfU0laRTsKLSAgICAvLyBBbGlnbiB0aGUgb2Zmc2V0LgotICAgIG9mZiA9IGFsaWduX3VwX3RvKG9mZiwgZmllbGRfc2l6ZSk7Ci0gICAgLy8gQXNzaWduIGFsbCBmaWVsZHMgaW4gdGhlIG9uZW9mIHRoaXMgc2FtZSBvZmZzZXQuCi0gICAgZm9yICh1cGJfb25lb2ZfYmVnaW4oJmZpdCwgb25lb2YpOwotICAgICAgICAgIXVwYl9vbmVvZl9kb25lKCZmaXQpOwotICAgICAgICAgdXBiX29uZW9mX25leHQoJmZpdCkpIHsKLSAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQgPSB1cGJfb25lb2ZfaXRlcl9maWVsZCgmZml0KTsKLSAgICAgIGxheW91dC0+ZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmaWVsZCldLm9mZnNldCA9IG9mZjsKLSAgICB9Ci0gICAgb2ZmICs9IGZpZWxkX3NpemU7Ci0gIH0KLQotICAvLyBOb3cgdGhlIGNhc2UgZmllbGRzLgotICBmb3IgKHVwYl9tc2dfb25lb2ZfYmVnaW4oJm9pdCwgbXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19vbmVvZl9kb25lKCZvaXQpOwotICAgICAgIHVwYl9tc2dfb25lb2ZfbmV4dCgmb2l0KSkgewotICAgIGNvbnN0IHVwYl9vbmVvZmRlZiogb25lb2YgPSB1cGJfbXNnX2l0ZXJfb25lb2YoJm9pdCk7Ci0gICAgdXBiX29uZW9mX2l0ZXIgZml0OwotCi0gICAgc2l6ZV90IGZpZWxkX3NpemUgPSBzaXplb2YodWludDMyX3QpOwotICAgIC8vIEFsaWduIHRoZSBvZmZzZXQuCi0gICAgb2ZmID0gKG9mZiArIGZpZWxkX3NpemUgLSAxKSAmIH4oZmllbGRfc2l6ZSAtIDEpOwotICAgIC8vIEFzc2lnbiBhbGwgZmllbGRzIGluIHRoZSBvbmVvZiB0aGlzIHNhbWUgb2Zmc2V0LgotICAgIGZvciAodXBiX29uZW9mX2JlZ2luKCZmaXQsIG9uZW9mKTsKLSAgICAgICAgICF1cGJfb25lb2ZfZG9uZSgmZml0KTsKLSAgICAgICAgIHVwYl9vbmVvZl9uZXh0KCZmaXQpKSB7Ci0gICAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX29uZW9mX2l0ZXJfZmllbGQoJmZpdCk7Ci0gICAgICBsYXlvdXQtPmZpZWxkc1t1cGJfZmllbGRkZWZfaW5kZXgoZmllbGQpXS5jYXNlX29mZnNldCA9IG9mZjsKLSAgICB9Ci0gICAgb2ZmICs9IGZpZWxkX3NpemU7Ci0gIH0KLQotICBsYXlvdXQtPnNpemUgPSBvZmY7Ci0KLSAgbGF5b3V0LT5tc2dkZWYgPSBtc2dkZWY7Ci0gIHVwYl9tc2dkZWZfcmVmKGxheW91dC0+bXNnZGVmLCAmbGF5b3V0LT5tc2dkZWYpOwotCi0gIHJldHVybiBsYXlvdXQ7Ci19Ci0KLXZvaWQgZnJlZV9sYXlvdXQoTWVzc2FnZUxheW91dCogbGF5b3V0KSB7Ci0gIHhmcmVlKGxheW91dC0+ZmllbGRzKTsKLSAgdXBiX21zZ2RlZl91bnJlZihsYXlvdXQtPm1zZ2RlZiwgJmxheW91dC0+bXNnZGVmKTsKLSAgeGZyZWUobGF5b3V0KTsKLX0KLQotVkFMVUUgZmllbGRfdHlwZV9jbGFzcyhjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0gIFZBTFVFIHR5cGVfY2xhc3MgPSBRbmlsOwotICBpZiAodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpID09IFVQQl9UWVBFX01FU1NBR0UpIHsKLSAgICBWQUxVRSBzdWJtc2dkZXNjID0KLSAgICAgICAgZ2V0X2RlZl9vYmoodXBiX2ZpZWxkZGVmX3N1YmRlZihmaWVsZCkpOwotICAgIHR5cGVfY2xhc3MgPSBEZXNjcmlwdG9yX21zZ2NsYXNzKHN1Ym1zZ2Rlc2MpOwotICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSA9PSBVUEJfVFlQRV9FTlVNKSB7Ci0gICAgVkFMVUUgc3ViZW51bWRlc2MgPQotICAgICAgICBnZXRfZGVmX29iaih1cGJfZmllbGRkZWZfc3ViZGVmKGZpZWxkKSk7Ci0gICAgdHlwZV9jbGFzcyA9IEVudW1EZXNjcmlwdG9yX2VudW1tb2R1bGUoc3ViZW51bWRlc2MpOwotICB9Ci0gIHJldHVybiB0eXBlX2NsYXNzOwotfQotCi1zdGF0aWMgdm9pZCogc2xvdF9tZW1vcnkoTWVzc2FnZUxheW91dCogbGF5b3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIHN0b3JhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCkgewotICByZXR1cm4gKCh1aW50OF90ICopc3RvcmFnZSkgKwotICAgICAgbGF5b3V0LT5maWVsZHNbdXBiX2ZpZWxkZGVmX2luZGV4KGZpZWxkKV0ub2Zmc2V0OwotfQotCi1zdGF0aWMgdWludDMyX3QqIHNsb3Rfb25lb2ZfY2FzZShNZXNzYWdlTGF5b3V0KiBsYXlvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBzdG9yYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCkgewotICByZXR1cm4gKHVpbnQzMl90ICopKCgodWludDhfdCAqKXN0b3JhZ2UpICsKLSAgICAgIGxheW91dC0+ZmllbGRzW3VwYl9maWVsZGRlZl9pbmRleChmaWVsZCldLmNhc2Vfb2Zmc2V0KTsKLX0KLQotCi1WQUxVRSBsYXlvdXRfZ2V0KE1lc3NhZ2VMYXlvdXQqIGxheW91dCwKLSAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogc3RvcmFnZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCkgewotICB2b2lkKiBtZW1vcnkgPSBzbG90X21lbW9yeShsYXlvdXQsIHN0b3JhZ2UsIGZpZWxkKTsKLSAgdWludDMyX3QqIG9uZW9mX2Nhc2UgPSBzbG90X29uZW9mX2Nhc2UobGF5b3V0LCBzdG9yYWdlLCBmaWVsZCk7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZmllbGQpKSB7Ci0gICAgaWYgKCpvbmVvZl9jYXNlICE9IHVwYl9maWVsZGRlZl9udW1iZXIoZmllbGQpKSB7Ci0gICAgICByZXR1cm4gUW5pbDsKLSAgICB9Ci0gICAgcmV0dXJuIG5hdGl2ZV9zbG90X2dldCh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF90eXBlX2NsYXNzKGZpZWxkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lbW9yeSk7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICByZXR1cm4gKigoVkFMVUUgKiltZW1vcnkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBuYXRpdmVfc2xvdF9nZXQodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZV9jbGFzcyhmaWVsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrX3JlcGVhdGVkX2ZpZWxkX3R5cGUoVkFMVUUgdmFsLCBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0gIFJlcGVhdGVkRmllbGQqIHNlbGY7Ci0gIGFzc2VydCh1cGJfZmllbGRkZWZfbGFiZWwoZmllbGQpID09IFVQQl9MQUJFTF9SRVBFQVRFRCk7Ci0KLSAgaWYgKCFSQl9UWVBFX1AodmFsLCBUX0RBVEEpIHx8ICFSVFlQRUREQVRBX1AodmFsKSB8fAotICAgICAgUlRZUEVEREFUQV9UWVBFKHZhbCkgIT0gJlJlcGVhdGVkRmllbGRfdHlwZSkgewotICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsICJFeHBlY3RlZCByZXBlYXRlZCBmaWVsZCBhcnJheSIpOwotICB9Ci0KLSAgc2VsZiA9IHJ1YnlfdG9fUmVwZWF0ZWRGaWVsZCh2YWwpOwotICBpZiAoc2VsZi0+ZmllbGRfdHlwZSAhPSB1cGJfZmllbGRkZWZfdHlwZShmaWVsZCkpIHsKLSAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLCAiUmVwZWF0ZWQgZmllbGQgYXJyYXkgaGFzIHdyb25nIGVsZW1lbnQgdHlwZSIpOwotICB9Ci0KLSAgaWYgKHNlbGYtPmZpZWxkX3R5cGUgPT0gVVBCX1RZUEVfTUVTU0FHRSB8fAotICAgICAgc2VsZi0+ZmllbGRfdHlwZSA9PSBVUEJfVFlQRV9FTlVNKSB7Ci0gICAgaWYgKHNlbGYtPmZpZWxkX3R5cGVfY2xhc3MgIT0KLSAgICAgICAgZ2V0X2RlZl9vYmoodXBiX2ZpZWxkZGVmX3N1YmRlZihmaWVsZCkpKSB7Ci0gICAgICByYl9yYWlzZShyYl9lVHlwZUVycm9yLAotICAgICAgICAgICAgICAgIlJlcGVhdGVkIGZpZWxkIGFycmF5IGhhcyB3cm9uZyBtZXNzYWdlL2VudW0gY2xhc3MiKTsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgY2hlY2tfbWFwX2ZpZWxkX3R5cGUoVkFMVUUgdmFsLCBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkKSB7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZioga2V5X2ZpZWxkID0gbWFwX2ZpZWxkX2tleShmaWVsZCk7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiogdmFsdWVfZmllbGQgPSBtYXBfZmllbGRfdmFsdWUoZmllbGQpOwotICBNYXAqIHNlbGY7Ci0KLSAgaWYgKCFSQl9UWVBFX1AodmFsLCBUX0RBVEEpIHx8ICFSVFlQRUREQVRBX1AodmFsKSB8fAotICAgICAgUlRZUEVEREFUQV9UWVBFKHZhbCkgIT0gJk1hcF90eXBlKSB7Ci0gICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIkV4cGVjdGVkIE1hcCBpbnN0YW5jZSIpOwotICB9Ci0KLSAgc2VsZiA9IHJ1YnlfdG9fTWFwKHZhbCk7Ci0gIGlmIChzZWxmLT5rZXlfdHlwZSAhPSB1cGJfZmllbGRkZWZfdHlwZShrZXlfZmllbGQpKSB7Ci0gICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIk1hcCBrZXkgdHlwZSBkb2VzIG5vdCBtYXRjaCBmaWVsZCdzIGtleSB0eXBlIik7Ci0gIH0KLSAgaWYgKHNlbGYtPnZhbHVlX3R5cGUgIT0gdXBiX2ZpZWxkZGVmX3R5cGUodmFsdWVfZmllbGQpKSB7Ci0gICAgcmJfcmFpc2UocmJfZVR5cGVFcnJvciwgIk1hcCB2YWx1ZSB0eXBlIGRvZXMgbm90IG1hdGNoIGZpZWxkJ3MgdmFsdWUgdHlwZSIpOwotICB9Ci0gIGlmICh1cGJfZmllbGRkZWZfdHlwZSh2YWx1ZV9maWVsZCkgPT0gVVBCX1RZUEVfTUVTU0FHRSB8fAotICAgICAgdXBiX2ZpZWxkZGVmX3R5cGUodmFsdWVfZmllbGQpID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICBpZiAoc2VsZi0+dmFsdWVfdHlwZV9jbGFzcyAhPQotICAgICAgICBnZXRfZGVmX29iaih1cGJfZmllbGRkZWZfc3ViZGVmKHZhbHVlX2ZpZWxkKSkpIHsKLSAgICAgIHJiX3JhaXNlKHJiX2VUeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAiTWFwIHZhbHVlIHR5cGUgaGFzIHdyb25nIG1lc3NhZ2UvZW51bSBjbGFzcyIpOwotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgbGF5b3V0X3NldChNZXNzYWdlTGF5b3V0KiBsYXlvdXQsCi0gICAgICAgICAgICAgICAgdm9pZCogc3RvcmFnZSwKLSAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkLAotICAgICAgICAgICAgICAgIFZBTFVFIHZhbCkgewotICB2b2lkKiBtZW1vcnkgPSBzbG90X21lbW9yeShsYXlvdXQsIHN0b3JhZ2UsIGZpZWxkKTsKLSAgdWludDMyX3QqIG9uZW9mX2Nhc2UgPSBzbG90X29uZW9mX2Nhc2UobGF5b3V0LCBzdG9yYWdlLCBmaWVsZCk7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZmllbGQpKSB7Ci0gICAgaWYgKHZhbCA9PSBRbmlsKSB7Ci0gICAgICAvLyBBc3NpZ25pbmcgbmlsIHRvIGEgb25lb2YgZmllbGQgY2xlYXJzIHRoZSBvbmVvZiBjb21wbGV0ZWx5LgotICAgICAgKm9uZW9mX2Nhc2UgPSBPTkVPRl9DQVNFX05PTkU7Ci0gICAgICBtZW1zZXQobWVtb3J5LCAwLCBOQVRJVkVfU0xPVF9NQVhfU0laRSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZmllbGQgdHlwZXMgZm9yIGEgc2luZ2xlIG9uZW9mICh1bmlvbikgc2xvdCBpcwotICAgICAgLy8gc29tZXdoYXQgY29tcGxleCBiZWNhdXNlIHdlIG5lZWQgdG8gZW5zdXJlIHRoYXQgYSBHQyB0cmlnZ2VyZWQgYXQgYW55Ci0gICAgICAvLyBwb2ludCBieSBhIGNhbGwgaW50byB0aGUgUnVieSBWTSBzZWVzIGEgdmFsaWQgc3RhdGUgZm9yIHRoaXMgZmllbGQgYW5kCi0gICAgICAvLyBkb2VzIG5vdCBlaXRoZXIgZ28gb2ZmIGludG8gdGhlIHdlZWRzIChmb2xsb3dpbmcgd2hhdCBpdCB0aGlua3MgaXMgYQotICAgICAgLy8gVkFMVUUgYnV0IGlzIGFjdHVhbGx5IGEgZGlmZmVyZW50IGZpZWxkIHR5cGUpIG9yIG1pc3MgYW4gb2JqZWN0IChzZWVpbmcKLSAgICAgIC8vIHdoYXQgaXQgdGhpbmtzIGlzIGEgcHJpbWl0aXZlIGZpZWxkIGJ1dCBpcyBhY3R1YWxseSBhIFZBTFVFIGZvciB0aGUgbmV3Ci0gICAgICAvLyBmaWVsZCB0eXBlKS4KLSAgICAgIC8vCi0gICAgICAvLyBJbiBvcmRlciBmb3IgdGhlIHRyYW5zaXRpb24gdG8gYmUgc2FmZSwgdGhlIG9uZW9mIGNhc2Ugc2xvdCBtdXN0IGJlIGluCi0gICAgICAvLyBzeW5jIHdpdGggdGhlIHZhbHVlIHNsb3Qgd2hlbmV2ZXIgdGhlIFJ1YnkgVk0gaGFzIGJlZW4gY2FsbGVkLiBUaHVzLCB3ZQotICAgICAgLy8gdXNlIG5hdGl2ZV9zbG90X3NldF92YWx1ZV9hbmRfY2FzZSgpLCB3aGljaCBlbnN1cmVzIHRoYXQgYm90aCB0aGUgdmFsdWUKLSAgICAgIC8vIGFuZCBjYXNlIG51bWJlciBhcmUgYWx0ZXJlZCBhdG9taWNhbGx5ICh3LnIudC4gdGhlIFJ1YnkgVk0pLgotICAgICAgbmF0aXZlX3Nsb3Rfc2V0X3ZhbHVlX2FuZF9jYXNlKAotICAgICAgICAgIHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSwgZmllbGRfdHlwZV9jbGFzcyhmaWVsZCksCi0gICAgICAgICAgbWVtb3J5LCB2YWwsCi0gICAgICAgICAgb25lb2ZfY2FzZSwgdXBiX2ZpZWxkZGVmX251bWJlcihmaWVsZCkpOwotICAgIH0KLSAgfSBlbHNlIGlmIChpc19tYXBfZmllbGQoZmllbGQpKSB7Ci0gICAgY2hlY2tfbWFwX2ZpZWxkX3R5cGUodmFsLCBmaWVsZCk7Ci0gICAgREVSRUYobWVtb3J5LCBWQUxVRSkgPSB2YWw7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICBjaGVja19yZXBlYXRlZF9maWVsZF90eXBlKHZhbCwgZmllbGQpOwotICAgIERFUkVGKG1lbW9yeSwgVkFMVUUpID0gdmFsOwotICB9IGVsc2UgewotICAgIG5hdGl2ZV9zbG90X3NldCh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksIGZpZWxkX3R5cGVfY2xhc3MoZmllbGQpLAotICAgICAgICAgICAgICAgICAgICBtZW1vcnksIHZhbCk7Ci0gIH0KLX0KLQotdm9pZCBsYXlvdXRfaW5pdChNZXNzYWdlTGF5b3V0KiBsYXlvdXQsCi0gICAgICAgICAgICAgICAgIHZvaWQqIHN0b3JhZ2UpIHsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGl0OwotICBmb3IgKHVwYl9tc2dfZmllbGRfYmVnaW4oJml0LCBsYXlvdXQtPm1zZ2RlZik7Ci0gICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaXQpOwotICAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaXQpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaXQpOwotICAgIHZvaWQqIG1lbW9yeSA9IHNsb3RfbWVtb3J5KGxheW91dCwgc3RvcmFnZSwgZmllbGQpOwotICAgIHVpbnQzMl90KiBvbmVvZl9jYXNlID0gc2xvdF9vbmVvZl9jYXNlKGxheW91dCwgc3RvcmFnZSwgZmllbGQpOwotCi0gICAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZmllbGQpKSB7Ci0gICAgICBtZW1zZXQobWVtb3J5LCAwLCBOQVRJVkVfU0xPVF9NQVhfU0laRSk7Ci0gICAgICAqb25lb2ZfY2FzZSA9IE9ORU9GX0NBU0VfTk9ORTsKLSAgICB9IGVsc2UgaWYgKGlzX21hcF9maWVsZChmaWVsZCkpIHsKLSAgICAgIFZBTFVFIG1hcCA9IFFuaWw7Ci0KLSAgICAgIGNvbnN0IHVwYl9maWVsZGRlZioga2V5X2ZpZWxkID0gbWFwX2ZpZWxkX2tleShmaWVsZCk7Ci0gICAgICBjb25zdCB1cGJfZmllbGRkZWYqIHZhbHVlX2ZpZWxkID0gbWFwX2ZpZWxkX3ZhbHVlKGZpZWxkKTsKLSAgICAgIFZBTFVFIHR5cGVfY2xhc3MgPSBmaWVsZF90eXBlX2NsYXNzKHZhbHVlX2ZpZWxkKTsKLQotICAgICAgaWYgKHR5cGVfY2xhc3MgIT0gUW5pbCkgewotICAgICAgICBWQUxVRSBhcmdzWzNdID0gewotICAgICAgICAgIGZpZWxkdHlwZV90b19ydWJ5KHVwYl9maWVsZGRlZl90eXBlKGtleV9maWVsZCkpLAotICAgICAgICAgIGZpZWxkdHlwZV90b19ydWJ5KHVwYl9maWVsZGRlZl90eXBlKHZhbHVlX2ZpZWxkKSksCi0gICAgICAgICAgdHlwZV9jbGFzcywKLSAgICAgICAgfTsKLSAgICAgICAgbWFwID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDMsIGFyZ3MsIGNNYXApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgVkFMVUUgYXJnc1syXSA9IHsKLSAgICAgICAgICBmaWVsZHR5cGVfdG9fcnVieSh1cGJfZmllbGRkZWZfdHlwZShrZXlfZmllbGQpKSwKLSAgICAgICAgICBmaWVsZHR5cGVfdG9fcnVieSh1cGJfZmllbGRkZWZfdHlwZSh2YWx1ZV9maWVsZCkpLAotICAgICAgICB9OwotICAgICAgICBtYXAgPSByYl9jbGFzc19uZXdfaW5zdGFuY2UoMiwgYXJncywgY01hcCk7Ci0gICAgICB9Ci0KLSAgICAgIERFUkVGKG1lbW9yeSwgVkFMVUUpID0gbWFwOwotICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICAgIFZBTFVFIGFyeSA9IFFuaWw7Ci0KLSAgICAgIFZBTFVFIHR5cGVfY2xhc3MgPSBmaWVsZF90eXBlX2NsYXNzKGZpZWxkKTsKLQotICAgICAgaWYgKHR5cGVfY2xhc3MgIT0gUW5pbCkgewotICAgICAgICBWQUxVRSBhcmdzWzJdID0gewotICAgICAgICAgIGZpZWxkdHlwZV90b19ydWJ5KHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSksCi0gICAgICAgICAgdHlwZV9jbGFzcywKLSAgICAgICAgfTsKLSAgICAgICAgYXJ5ID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDIsIGFyZ3MsIGNSZXBlYXRlZEZpZWxkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFZBTFVFIGFyZ3NbMV0gPSB7IGZpZWxkdHlwZV90b19ydWJ5KHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSkgfTsKLSAgICAgICAgYXJ5ID0gcmJfY2xhc3NfbmV3X2luc3RhbmNlKDEsIGFyZ3MsIGNSZXBlYXRlZEZpZWxkKTsKLSAgICAgIH0KLQotICAgICAgREVSRUYobWVtb3J5LCBWQUxVRSkgPSBhcnk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5hdGl2ZV9zbG90X2luaXQodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpLCBtZW1vcnkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGxheW91dF9tYXJrKE1lc3NhZ2VMYXlvdXQqIGxheW91dCwgdm9pZCogc3RvcmFnZSkgewotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX21zZ19maWVsZF9iZWdpbigmaXQsIGxheW91dC0+bXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpdCk7Ci0gICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpdCkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdCk7Ci0gICAgdm9pZCogbWVtb3J5ID0gc2xvdF9tZW1vcnkobGF5b3V0LCBzdG9yYWdlLCBmaWVsZCk7Ci0gICAgdWludDMyX3QqIG9uZW9mX2Nhc2UgPSBzbG90X29uZW9mX2Nhc2UobGF5b3V0LCBzdG9yYWdlLCBmaWVsZCk7Ci0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmaWVsZCkpIHsKLSAgICAgIGlmICgqb25lb2ZfY2FzZSA9PSB1cGJfZmllbGRkZWZfbnVtYmVyKGZpZWxkKSkgewotICAgICAgICBuYXRpdmVfc2xvdF9tYXJrKHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSwgbWVtb3J5KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9sYWJlbChmaWVsZCkgPT0gVVBCX0xBQkVMX1JFUEVBVEVEKSB7Ci0gICAgICByYl9nY19tYXJrKERFUkVGKG1lbW9yeSwgVkFMVUUpKTsKLSAgICB9IGVsc2UgewotICAgICAgbmF0aXZlX3Nsb3RfbWFyayh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksIG1lbW9yeSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgbGF5b3V0X2R1cChNZXNzYWdlTGF5b3V0KiBsYXlvdXQsIHZvaWQqIHRvLCB2b2lkKiBmcm9tKSB7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpdDsKLSAgZm9yICh1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpdCwgbGF5b3V0LT5tc2dkZWYpOwotICAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJml0KTsKLSAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJml0KSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJml0KTsKLQotICAgIHZvaWQqIHRvX21lbW9yeSA9IHNsb3RfbWVtb3J5KGxheW91dCwgdG8sIGZpZWxkKTsKLSAgICB1aW50MzJfdCogdG9fb25lb2ZfY2FzZSA9IHNsb3Rfb25lb2ZfY2FzZShsYXlvdXQsIHRvLCBmaWVsZCk7Ci0gICAgdm9pZCogZnJvbV9tZW1vcnkgPSBzbG90X21lbW9yeShsYXlvdXQsIGZyb20sIGZpZWxkKTsKLSAgICB1aW50MzJfdCogZnJvbV9vbmVvZl9jYXNlID0gc2xvdF9vbmVvZl9jYXNlKGxheW91dCwgZnJvbSwgZmllbGQpOwotCi0gICAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZmllbGQpKSB7Ci0gICAgICBpZiAoKmZyb21fb25lb2ZfY2FzZSA9PSB1cGJfZmllbGRkZWZfbnVtYmVyKGZpZWxkKSkgewotICAgICAgICAqdG9fb25lb2ZfY2FzZSA9ICpmcm9tX29uZW9mX2Nhc2U7Ci0gICAgICAgIG5hdGl2ZV9zbG90X2R1cCh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksIHRvX21lbW9yeSwgZnJvbV9tZW1vcnkpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaXNfbWFwX2ZpZWxkKGZpZWxkKSkgewotICAgICAgREVSRUYodG9fbWVtb3J5LCBWQUxVRSkgPSBNYXBfZHVwKERFUkVGKGZyb21fbWVtb3J5LCBWQUxVRSkpOwotICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICAgIERFUkVGKHRvX21lbW9yeSwgVkFMVUUpID0gUmVwZWF0ZWRGaWVsZF9kdXAoREVSRUYoZnJvbV9tZW1vcnksIFZBTFVFKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5hdGl2ZV9zbG90X2R1cCh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksIHRvX21lbW9yeSwgZnJvbV9tZW1vcnkpOwotICAgIH0KLSAgfQotfQotCi12b2lkIGxheW91dF9kZWVwX2NvcHkoTWVzc2FnZUxheW91dCogbGF5b3V0LCB2b2lkKiB0bywgdm9pZCogZnJvbSkgewotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaXQ7Ci0gIGZvciAodXBiX21zZ19maWVsZF9iZWdpbigmaXQsIGxheW91dC0+bXNnZGVmKTsKLSAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpdCk7Ci0gICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpdCkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYqIGZpZWxkID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdCk7Ci0KLSAgICB2b2lkKiB0b19tZW1vcnkgPSBzbG90X21lbW9yeShsYXlvdXQsIHRvLCBmaWVsZCk7Ci0gICAgdWludDMyX3QqIHRvX29uZW9mX2Nhc2UgPSBzbG90X29uZW9mX2Nhc2UobGF5b3V0LCB0bywgZmllbGQpOwotICAgIHZvaWQqIGZyb21fbWVtb3J5ID0gc2xvdF9tZW1vcnkobGF5b3V0LCBmcm9tLCBmaWVsZCk7Ci0gICAgdWludDMyX3QqIGZyb21fb25lb2ZfY2FzZSA9IHNsb3Rfb25lb2ZfY2FzZShsYXlvdXQsIGZyb20sIGZpZWxkKTsKLQotICAgIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGZpZWxkKSkgewotICAgICAgaWYgKCpmcm9tX29uZW9mX2Nhc2UgPT0gdXBiX2ZpZWxkZGVmX251bWJlcihmaWVsZCkpIHsKLSAgICAgICAgKnRvX29uZW9mX2Nhc2UgPSAqZnJvbV9vbmVvZl9jYXNlOwotICAgICAgICBuYXRpdmVfc2xvdF9kZWVwX2NvcHkodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpLCB0b19tZW1vcnksIGZyb21fbWVtb3J5KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzX21hcF9maWVsZChmaWVsZCkpIHsKLSAgICAgIERFUkVGKHRvX21lbW9yeSwgVkFMVUUpID0KLSAgICAgICAgICBNYXBfZGVlcF9jb3B5KERFUkVGKGZyb21fbWVtb3J5LCBWQUxVRSkpOwotICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICAgIERFUkVGKHRvX21lbW9yeSwgVkFMVUUpID0KLSAgICAgICAgICBSZXBlYXRlZEZpZWxkX2RlZXBfY29weShERVJFRihmcm9tX21lbW9yeSwgVkFMVUUpKTsKLSAgICB9IGVsc2UgewotICAgICAgbmF0aXZlX3Nsb3RfZGVlcF9jb3B5KHVwYl9maWVsZGRlZl90eXBlKGZpZWxkKSwgdG9fbWVtb3J5LCBmcm9tX21lbW9yeSk7Ci0gICAgfQotICB9Ci19Ci0KLVZBTFVFIGxheW91dF9lcShNZXNzYWdlTGF5b3V0KiBsYXlvdXQsIHZvaWQqIG1zZzEsIHZvaWQqIG1zZzIpIHsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGl0OwotICBmb3IgKHVwYl9tc2dfZmllbGRfYmVnaW4oJml0LCBsYXlvdXQtPm1zZ2RlZik7Ci0gICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaXQpOwotICAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaXQpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaXQpOwotCi0gICAgdm9pZCogbXNnMV9tZW1vcnkgPSBzbG90X21lbW9yeShsYXlvdXQsIG1zZzEsIGZpZWxkKTsKLSAgICB1aW50MzJfdCogbXNnMV9vbmVvZl9jYXNlID0gc2xvdF9vbmVvZl9jYXNlKGxheW91dCwgbXNnMSwgZmllbGQpOwotICAgIHZvaWQqIG1zZzJfbWVtb3J5ID0gc2xvdF9tZW1vcnkobGF5b3V0LCBtc2cyLCBmaWVsZCk7Ci0gICAgdWludDMyX3QqIG1zZzJfb25lb2ZfY2FzZSA9IHNsb3Rfb25lb2ZfY2FzZShsYXlvdXQsIG1zZzIsIGZpZWxkKTsKLQotICAgIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGZpZWxkKSkgewotICAgICAgaWYgKCptc2cxX29uZW9mX2Nhc2UgIT0gKm1zZzJfb25lb2ZfY2FzZSB8fAotICAgICAgICAgICgqbXNnMV9vbmVvZl9jYXNlID09IHVwYl9maWVsZGRlZl9udW1iZXIoZmllbGQpICYmCi0gICAgICAgICAgICFuYXRpdmVfc2xvdF9lcSh1cGJfZmllbGRkZWZfdHlwZShmaWVsZCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cxX21lbW9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1zZzJfbWVtb3J5KSkpIHsKLSAgICAgICAgcmV0dXJuIFFmYWxzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGlzX21hcF9maWVsZChmaWVsZCkpIHsKLSAgICAgIGlmICghTWFwX2VxKERFUkVGKG1zZzFfbWVtb3J5LCBWQUxVRSksCi0gICAgICAgICAgICAgICAgICBERVJFRihtc2cyX21lbW9yeSwgVkFMVUUpKSkgewotICAgICAgICByZXR1cm4gUWZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2xhYmVsKGZpZWxkKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQpIHsKLSAgICAgIGlmICghUmVwZWF0ZWRGaWVsZF9lcShERVJFRihtc2cxX21lbW9yeSwgVkFMVUUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIERFUkVGKG1zZzJfbWVtb3J5LCBWQUxVRSkpKSB7Ci0gICAgICAgIHJldHVybiBRZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmICghbmF0aXZlX3Nsb3RfZXEodXBiX2ZpZWxkZGVmX3R5cGUoZmllbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtc2cxX21lbW9yeSwgbXNnMl9tZW1vcnkpKSB7Ci0gICAgICAgIHJldHVybiBRZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiBRdHJ1ZTsKLX0KLQotVkFMVUUgbGF5b3V0X2hhc2goTWVzc2FnZUxheW91dCogbGF5b3V0LCB2b2lkKiBzdG9yYWdlKSB7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpdDsKLSAgc3RfaW5kZXhfdCBoID0gcmJfaGFzaF9zdGFydCgwKTsKLSAgVkFMVUUgaGFzaF9zeW0gPSByYl9pbnRlcm4oImhhc2giKTsKLSAgZm9yICh1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpdCwgbGF5b3V0LT5tc2dkZWYpOwotICAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJml0KTsKLSAgICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJml0KSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiogZmllbGQgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJml0KTsKLSAgICBWQUxVRSBmaWVsZF92YWwgPSBsYXlvdXRfZ2V0KGxheW91dCwgc3RvcmFnZSwgZmllbGQpOwotICAgIGggPSByYl9oYXNoX3VpbnQoaCwgTlVNMkxPTkcocmJfZnVuY2FsbChmaWVsZF92YWwsIGhhc2hfc3ltLCAwKSkpOwotICB9Ci0gIGggPSByYl9oYXNoX2VuZChoKTsKLQotICByZXR1cm4gSU5UMkZJWChoKTsKLX0KLQotVkFMVUUgbGF5b3V0X2luc3BlY3QoTWVzc2FnZUxheW91dCogbGF5b3V0LCB2b2lkKiBzdG9yYWdlKSB7Ci0gIFZBTFVFIHN0ciA9IHJiX3N0cl9uZXcyKCIiKTsKLQotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaXQ7Ci0gIGJvb2wgZmlyc3QgPSB0cnVlOwotICBmb3IgKHVwYl9tc2dfZmllbGRfYmVnaW4oJml0LCBsYXlvdXQtPm1zZ2RlZik7Ci0gICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaXQpOwotICAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaXQpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmKiBmaWVsZCA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaXQpOwotICAgIFZBTFVFIGZpZWxkX3ZhbCA9IGxheW91dF9nZXQobGF5b3V0LCBzdG9yYWdlLCBmaWVsZCk7Ci0KLSAgICBpZiAoIWZpcnN0KSB7Ci0gICAgICBzdHIgPSByYl9zdHJfY2F0MihzdHIsICIsICIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBmaXJzdCA9IGZhbHNlOwotICAgIH0KLSAgICBzdHIgPSByYl9zdHJfY2F0MihzdHIsIHVwYl9maWVsZGRlZl9uYW1lKGZpZWxkKSk7Ci0gICAgc3RyID0gcmJfc3RyX2NhdDIoc3RyLCAiOiAiKTsKLQotICAgIHN0ciA9IHJiX3N0cl9hcHBlbmQoc3RyLCByYl9mdW5jYWxsKGZpZWxkX3ZhbCwgcmJfaW50ZXJuKCJpbnNwZWN0IiksIDApKTsKLSAgfQotCi0gIHJldHVybiBzdHI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy91cGIuYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL3VwYi5jCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NGEyYTFkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvZXh0L2dvb2dsZS9wcm90b2J1Zl9jL3VwYi5jCisrKyAvZGV2L251bGwKQEAgLTEsMTI4MTIgKzAsMCBAQAotLy8gQW1hbGdhbWF0ZWQgc291cmNlIGZpbGUKLSNpbmNsdWRlICJ1cGIuaCIKLQotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBzaXplX3QgbGVuOwotICBjaGFyIHN0clsxXTsgIC8qIE51bGwtdGVybWluYXRlZCBzdHJpbmcgZGF0YSBmb2xsb3dzLiAqLwotfSBzdHJfdDsKLQotc3RhdGljIHN0cl90ICpuZXdzdHIoY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbikgewotICBzdHJfdCAqcmV0ID0gdXBiX2dtYWxsb2Moc2l6ZW9mKCpyZXQpICsgbGVuKTsKLSAgaWYgKCFyZXQpIHJldHVybiBOVUxMOwotICByZXQtPmxlbiA9IGxlbjsKLSAgbWVtY3B5KHJldC0+c3RyLCBkYXRhLCBsZW4pOwotICByZXQtPnN0cltsZW5dID0gJ1wwJzsKLSAgcmV0dXJuIHJldDsKLX0KLQotc3RhdGljIHZvaWQgZnJlZXN0cihzdHJfdCAqcykgeyB1cGJfZ2ZyZWUocyk7IH0KLQotLyogaXNhbHBoYSgpIGV0Yy4gZnJvbSA8Y3R5cGUuaD4gYXJlIGxvY2FsZS1kZXBlbmRlbnQsIHdoaWNoIHdlIGRvbid0IHdhbnQuICovCi1zdGF0aWMgYm9vbCB1cGJfaXNiZXR3ZWVuKGNoYXIgYywgY2hhciBsb3csIGNoYXIgaGlnaCkgewotICByZXR1cm4gYyA+PSBsb3cgJiYgYyA8PSBoaWdoOwotfQotCi1zdGF0aWMgYm9vbCB1cGJfaXNsZXR0ZXIoY2hhciBjKSB7Ci0gIHJldHVybiB1cGJfaXNiZXR3ZWVuKGMsICdBJywgJ1onKSB8fCB1cGJfaXNiZXR3ZWVuKGMsICdhJywgJ3onKSB8fCBjID09ICdfJzsKLX0KLQotc3RhdGljIGJvb2wgdXBiX2lzYWxwaGFudW0oY2hhciBjKSB7Ci0gIHJldHVybiB1cGJfaXNsZXR0ZXIoYykgfHwgdXBiX2lzYmV0d2VlbihjLCAnMCcsICc5Jyk7Ci19Ci0KLXN0YXRpYyBib29sIHVwYl9pc2lkZW50KGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwgYm9vbCBmdWxsLCB1cGJfc3RhdHVzICpzKSB7Ci0gIGJvb2wgc3RhcnQgPSB0cnVlOwotICBzaXplX3QgaTsKLSAgZm9yIChpID0gMDsgaSA8IGxlbjsgaSsrKSB7Ci0gICAgY2hhciBjID0gc3RyW2ldOwotICAgIGlmIChjID09ICcuJykgewotICAgICAgaWYgKHN0YXJ0IHx8ICFmdWxsKSB7Ci0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLCAiaW52YWxpZCBuYW1lOiB1bmV4cGVjdGVkICcuJyAoJXMpIiwgc3RyKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgc3RhcnQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoc3RhcnQpIHsKLSAgICAgIGlmICghdXBiX2lzbGV0dGVyKGMpKSB7Ci0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigKLSAgICAgICAgICAgIHMsICJpbnZhbGlkIG5hbWU6IHBhdGggY29tcG9uZW50cyBtdXN0IHN0YXJ0IHdpdGggYSBsZXR0ZXIgKCVzKSIsCi0gICAgICAgICAgICBzdHIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBzdGFydCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoIXVwYl9pc2FscGhhbnVtKGMpKSB7Ci0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLCAiaW52YWxpZCBuYW1lOiBub24tYWxwaGFudW1lcmljIGNoYXJhY3RlciAoJXMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuICFzdGFydDsKLX0KLQotc3RhdGljIGJvb2wgdXBiX2lzb25lb2YoY29uc3QgdXBiX3JlZmNvdW50ZWQgKmRlZikgewotICByZXR1cm4gZGVmLT52dGJsID09ICZ1cGJfb25lb2ZkZWZfdnRibDsKLX0KLQotc3RhdGljIGJvb2wgdXBiX2lzZmllbGQoY29uc3QgdXBiX3JlZmNvdW50ZWQgKmRlZikgewotICByZXR1cm4gZGVmLT52dGJsID09ICZ1cGJfZmllbGRkZWZfdnRibDsKLX0KLQotc3RhdGljIGNvbnN0IHVwYl9vbmVvZmRlZiAqdXBiX3RyeWdldG9uZW9mKGNvbnN0IHVwYl9yZWZjb3VudGVkICpkZWYpIHsKLSAgcmV0dXJuIHVwYl9pc29uZW9mKGRlZikgPyAoY29uc3QgdXBiX29uZW9mZGVmKilkZWYgOiBOVUxMOwotfQotCi1zdGF0aWMgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJfdHJ5Z2V0ZmllbGQoY29uc3QgdXBiX3JlZmNvdW50ZWQgKmRlZikgewotICByZXR1cm4gdXBiX2lzZmllbGQoZGVmKSA/IChjb25zdCB1cGJfZmllbGRkZWYqKWRlZiA6IE5VTEw7Ci19Ci0KLQotLyogdXBiX2RlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdXBiX2RlZnR5cGVfdCB1cGJfZGVmX3R5cGUoY29uc3QgdXBiX2RlZiAqZCkgeyByZXR1cm4gZC0+dHlwZTsgfQotCi1jb25zdCBjaGFyICp1cGJfZGVmX2Z1bGxuYW1lKGNvbnN0IHVwYl9kZWYgKmQpIHsgcmV0dXJuIGQtPmZ1bGxuYW1lOyB9Ci0KLWNvbnN0IGNoYXIgKnVwYl9kZWZfbmFtZShjb25zdCB1cGJfZGVmICpkKSB7Ci0gIGNvbnN0IGNoYXIgKnA7Ci0KLSAgaWYgKGQtPmZ1bGxuYW1lID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIGlmICgocCA9IHN0cnJjaHIoZC0+ZnVsbG5hbWUsICcuJykpID09IE5VTEwpIHsKLSAgICAvKiBObyAnLicgaW4gdGhlIG5hbWUsIHJldHVybiB0aGUgZnVsbCBzdHJpbmcuICovCi0gICAgcmV0dXJuIGQtPmZ1bGxuYW1lOwotICB9IGVsc2UgewotICAgIC8qIFJldHVybiBvbmUgcGFzdCB0aGUgbGFzdCAnLicuICovCi0gICAgcmV0dXJuIHAgKyAxOwotICB9Ci19Ci0KLWJvb2wgdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfZGVmICpkZWYsIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLCB1cGJfc3RhdHVzICpzKSB7Ci0gIGFzc2VydCghdXBiX2RlZl9pc2Zyb3plbihkZWYpKTsKLSAgaWYgKCF1cGJfaXNpZGVudChmdWxsbmFtZSwgc3RybGVuKGZ1bGxuYW1lKSwgdHJ1ZSwgcykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBmdWxsbmFtZSA9IHVwYl9nc3RyZHVwKGZ1bGxuYW1lKTsKLSAgaWYgKCFmdWxsbmFtZSkgewotICAgIHVwYl91cGJlcnJfc2V0b29tKHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVwYl9nZnJlZSgodm9pZCopZGVmLT5mdWxsbmFtZSk7Ci0gIGRlZi0+ZnVsbG5hbWUgPSBmdWxsbmFtZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHVwYl9maWxlZGVmICp1cGJfZGVmX2ZpbGUoY29uc3QgdXBiX2RlZiAqZCkgeyByZXR1cm4gZC0+ZmlsZTsgfQotCi11cGJfZGVmICp1cGJfZGVmX2R1cChjb25zdCB1cGJfZGVmICpkZWYsIGNvbnN0IHZvaWQgKm8pIHsKLSAgc3dpdGNoIChkZWYtPnR5cGUpIHsKLSAgICBjYXNlIFVQQl9ERUZfTVNHOgotICAgICAgcmV0dXJuIHVwYl9tc2dkZWZfdXBjYXN0X211dGFibGUoCi0gICAgICAgICAgdXBiX21zZ2RlZl9kdXAodXBiX2Rvd25jYXN0X21zZ2RlZihkZWYpLCBvKSk7Ci0gICAgY2FzZSBVUEJfREVGX0ZJRUxEOgotICAgICAgcmV0dXJuIHVwYl9maWVsZGRlZl91cGNhc3RfbXV0YWJsZSgKLSAgICAgICAgICB1cGJfZmllbGRkZWZfZHVwKHVwYl9kb3duY2FzdF9maWVsZGRlZihkZWYpLCBvKSk7Ci0gICAgY2FzZSBVUEJfREVGX0VOVU06Ci0gICAgICByZXR1cm4gdXBiX2VudW1kZWZfdXBjYXN0X211dGFibGUoCi0gICAgICAgICAgdXBiX2VudW1kZWZfZHVwKHVwYl9kb3duY2FzdF9lbnVtZGVmKGRlZiksIG8pKTsKLSAgICBkZWZhdWx0OiBhc3NlcnQoZmFsc2UpOyByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCB1cGJfZGVmX2luaXQodXBiX2RlZiAqZGVmLCB1cGJfZGVmdHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgKnZ0YmwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgaWYgKCF1cGJfcmVmY291bnRlZF9pbml0KHVwYl9kZWZfdXBjYXN0X211dGFibGUoZGVmKSwgdnRibCwgb3duZXIpKSByZXR1cm4gZmFsc2U7Ci0gIGRlZi0+dHlwZSA9IHR5cGU7Ci0gIGRlZi0+ZnVsbG5hbWUgPSBOVUxMOwotICBkZWYtPmNhbWVfZnJvbV91c2VyID0gZmFsc2U7Ci0gIGRlZi0+ZmlsZSA9IE5VTEw7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCB1cGJfZGVmX3VuaW5pdCh1cGJfZGVmICpkZWYpIHsKLSAgdXBiX2dmcmVlKCh2b2lkKilkZWYtPmZ1bGxuYW1lKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKm1zZ2RlZl9uYW1lKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgY29uc3QgY2hhciAqbmFtZSA9IHVwYl9kZWZfZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3QobSkpOwotICByZXR1cm4gbmFtZSA/IG5hbWUgOiAiKGFub255bW91cykiOwotfQotCi1zdGF0aWMgYm9vbCB1cGJfdmFsaWRhdGVfZmllbGQodXBiX2ZpZWxkZGVmICpmLCB1cGJfc3RhdHVzICpzKSB7Ci0gIGlmICh1cGJfZmllbGRkZWZfbmFtZShmKSA9PSBOVUxMIHx8IHVwYl9maWVsZGRlZl9udW1iZXIoZikgPT0gMCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZGRlZiBtdXN0IGhhdmUgbmFtZSBhbmQgbnVtYmVyIHNldCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghZi0+dHlwZV9pc19zZXRfKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgImZpZWxkZGVmIHR5cGUgd2FzIG5vdCBpbml0aWFsaXplZCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICh1cGJfZmllbGRkZWZfbGF6eShmKSAmJgotICAgICAgdXBiX2ZpZWxkZGVmX2Rlc2NyaXB0b3J0eXBlKGYpICE9IFVQQl9ERVNDUklQVE9SX1RZUEVfTUVTU0FHRSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIm9ubHkgbGVuZ3RoLWRlbGltaXRlZCBzdWJtZXNzYWdlIGZpZWxkcyBtYXkgYmUgbGF6eSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICh1cGJfZmllbGRkZWZfaGFzc3ViZGVmKGYpKSB7Ci0gICAgY29uc3QgdXBiX2RlZiAqc3ViZGVmOwotCi0gICAgaWYgKGYtPnN1YmRlZl9pc19zeW1ib2xpYykgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsICJmaWVsZCAnJXMuJXMnIGhhcyBub3QgYmVlbiByZXNvbHZlZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXNnZGVmX25hbWUoZi0+bXNnLmRlZiksIHVwYl9maWVsZGRlZl9uYW1lKGYpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBzdWJkZWYgPSB1cGJfZmllbGRkZWZfc3ViZGVmKGYpOwotICAgIGlmIChzdWJkZWYgPT0gTlVMTCkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsICJmaWVsZCAlcy4lcyBpcyBtaXNzaW5nIHJlcXVpcmVkIHN1YmRlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXNnZGVmX25hbWUoZi0+bXNnLmRlZiksIHVwYl9maWVsZGRlZl9uYW1lKGYpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIXVwYl9kZWZfaXNmcm96ZW4oc3ViZGVmKSAmJiAhc3ViZGVmLT5jYW1lX2Zyb21fdXNlcikgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgInN1YmRlZiBvZiBmaWVsZCAlcy4lcyBpcyBub3QgZnJvemVuIG9yIGJlaW5nIGZyb3plbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbXNnZGVmX25hbWUoZi0+bXNnLmRlZiksIHVwYl9maWVsZGRlZl9uYW1lKGYpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICBpZiAodXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSkgewotICAgIGJvb2wgaGFzX2RlZmF1bHRfbmFtZSA9IHVwYl9maWVsZGRlZl9lbnVtaGFzZGVmYXVsdHN0cihmKTsKLSAgICBib29sIGhhc19kZWZhdWx0X251bWJlciA9IHVwYl9maWVsZGRlZl9lbnVtaGFzZGVmYXVsdGludDMyKGYpOwotCi0gICAgLyogUHJldmlvdXNseSB2ZXJpZmllZCBieSB1cGJfdmFsaWRhdGVfZW51bWRlZigpLiAqLwotICAgIGFzc2VydCh1cGJfZW51bWRlZl9udW12YWxzKHVwYl9maWVsZGRlZl9lbnVtc3ViZGVmKGYpKSA+IDApOwotCi0gICAgLyogV2UndmUgYWxyZWFkeSB2YWxpZGF0ZWQgdGhhdCB3ZSBoYXZlIGFuIGFzc29jaWF0ZWQgZW51bWRlZiBhbmQgdGhhdCBpdAotICAgICAqIGhhcyBhdCBsZWFzdCBvbmUgbWVtYmVyLCBzbyBhdCBsZWFzdCBvbmUgb2YgdGhlc2Ugc2hvdWxkIGJlIHRydWUuCi0gICAgICogQmVjYXVzZSBpZiB0aGUgdXNlciBkaWRuJ3Qgc2V0IGFueXRoaW5nLCB3ZSdsbCBwaWNrIHVwIHRoZSBlbnVtJ3MKLSAgICAgKiBkZWZhdWx0LCBidXQgaWYgdGhlIHVzZXIgKmRpZCogc2V0IHNvbWV0aGluZyB3ZSBzaG91bGQgYXQgbGVhc3QgcGljayB1cAotICAgICAqIHRoZSBvbmUgdGhleSBzZXQgKGludDMyIG9yIHN0cmluZykuICovCi0gICAgYXNzZXJ0KGhhc19kZWZhdWx0X25hbWUgfHwgaGFzX2RlZmF1bHRfbnVtYmVyKTsKLQotICAgIGlmICghaGFzX2RlZmF1bHRfbmFtZSkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImVudW0gZGVmYXVsdCBmb3IgZmllbGQgJXMuJXMgKCVkKSBpcyBub3QgaW4gdGhlIGVudW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2RlZl9uYW1lKGYtPm1zZy5kZWYpLCB1cGJfZmllbGRkZWZfbmFtZShmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfZGVmYXVsdGludDMyKGYpKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIWhhc19kZWZhdWx0X251bWJlcikgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgImVudW0gZGVmYXVsdCBmb3IgZmllbGQgJXMuJXMgKCVzKSBpcyBub3QgaW4gdGhlIGVudW0iLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1zZ2RlZl9uYW1lKGYtPm1zZy5kZWYpLCB1cGJfZmllbGRkZWZfbmFtZShmKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfZGVmYXVsdHN0cihmLCBOVUxMKSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLyogTGlmdCB0aGUgZWZmZWN0aXZlIG51bWVyaWMgZGVmYXVsdCBpbnRvIHRoZSBmaWVsZCdzIGRlZmF1bHQgc2xvdCwgaW4gY2FzZQotICAgICAqIHdlIHdlcmUgb25seSBnZXR0aW5nIGl0ICJieSByZWZlcmVuY2UiIGZyb20gdGhlIGVudW1kZWYuICovCi0gICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQzMihmLCB1cGJfZmllbGRkZWZfZGVmYXVsdGludDMyKGYpKTsKLSAgfQotCi0gIC8qIEVuc3VyZSB0aGF0IE1hcEVudHJ5IHN1Ym1lc3NhZ2VzIG9ubHkgYXBwZWFyIGFzIHJlcGVhdGVkIGZpZWxkcywgbm90Ci0gICAqIG9wdGlvbmFsL3JlcXVpcmVkIChzaW5ndWxhcikgZmllbGRzLiAqLwotICBpZiAodXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfTUVTU0FHRSAmJgotICAgICAgdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihmKSAhPSBOVUxMKSB7Ci0gICAgY29uc3QgdXBiX21zZ2RlZiAqc3ViZGVmID0gdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihmKTsKLSAgICBpZiAodXBiX21zZ2RlZl9tYXBlbnRyeShzdWJkZWYpICYmICF1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZihzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJGaWVsZCAlcyByZWZlcnMgdG8gbWFwZW50cnkgbWVzc2FnZSBidXQgaXMgbm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiYSByZXBlYXRlZCBmaWVsZCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ZpZWxkZGVmX25hbWUoZikgPyB1cGJfZmllbGRkZWZfbmFtZShmKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIih1bm5hbWVkKSIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCB1cGJfdmFsaWRhdGVfZW51bWRlZihjb25zdCB1cGJfZW51bWRlZiAqZSwgdXBiX3N0YXR1cyAqcykgewotICBpZiAodXBiX2VudW1kZWZfbnVtdmFscyhlKSA9PSAwKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsICJlbnVtICVzIGhhcyBubyBtZW1iZXJzIChtdXN0IGhhdmUgYXQgbGVhc3Qgb25lKSIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVwYl9lbnVtZGVmX2Z1bGxuYW1lKGUpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQWxsIHN1Ym1lc3NhZ2UgZmllbGRzIGFyZSBsb3dlciB0aGFuIGFsbCBvdGhlciBmaWVsZHMuCi0gKiBTZWNvbmRseSwgZmllbGRzIGFyZSBpbmNyZWFzaW5nIGluIG9yZGVyLiAqLwotdWludDMyX3QgZmllbGRfcmFuayhjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgdWludDMyX3QgcmV0ID0gdXBiX2ZpZWxkZGVmX251bWJlcihmKTsKLSAgY29uc3QgdWludDMyX3QgaGlnaF9iaXQgPSAxIDw8IDMwOwotICBhc3NlcnQocmV0IDwgaGlnaF9iaXQpOwotICBpZiAoIXVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkKLSAgICByZXQgfD0gaGlnaF9iaXQ7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWludCBjbXBfZmllbGRzKGNvbnN0IHZvaWQgKnAxLCBjb25zdCB2b2lkICpwMikgewotICBjb25zdCB1cGJfZmllbGRkZWYgKmYxID0gKih1cGJfZmllbGRkZWYqY29uc3QqKXAxOwotICBjb25zdCB1cGJfZmllbGRkZWYgKmYyID0gKih1cGJfZmllbGRkZWYqY29uc3QqKXAyOwotICByZXR1cm4gZmllbGRfcmFuayhmMSkgLSBmaWVsZF9yYW5rKGYyKTsKLX0KLQotc3RhdGljIGJvb2wgYXNzaWduX21zZ19pbmRpY2VzKHVwYl9tc2dkZWYgKm0sIHVwYl9zdGF0dXMgKnMpIHsKLSAgLyogU29ydCBmaWVsZHMuICB1cGIgaW50ZXJuYWxseSByZWxpZXMgb24gVVBCX1RZUEVfTUVTU0FHRSBmaWVsZHMgaGF2aW5nIHRoZQotICAgKiBsb3dlc3QgaW5kZXhlcywgYnV0IHdlIGRvIG5vdCBwdWJsaWNseSBndWFyYW50ZWUgdGhpcy4gKi8KLSAgdXBiX21zZ19maWVsZF9pdGVyIGo7Ci0gIGludCBpOwotICB1aW50MzJfdCBzZWxlY3RvcjsKLSAgaW50IG4gPSB1cGJfbXNnZGVmX251bWZpZWxkcyhtKTsKLSAgdXBiX2ZpZWxkZGVmICoqZmllbGRzOwotCi0gIGlmIChuID09IDApIHsKLSAgICBtLT5zZWxlY3Rvcl9jb3VudCA9IFVQQl9TVEFUSUNfU0VMRUNUT1JfQ09VTlQ7Ci0gICAgbS0+c3VibXNnX2ZpZWxkX2NvdW50ID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGZpZWxkcyA9IHVwYl9nbWFsbG9jKG4gKiBzaXplb2YoKmZpZWxkcykpOwotICBpZiAoIWZpZWxkcykgewotICAgIHVwYl91cGJlcnJfc2V0b29tKHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG0tPnN1Ym1zZ19maWVsZF9jb3VudCA9IDA7Ci0gIGZvcihpID0gMCwgdXBiX21zZ19maWVsZF9iZWdpbigmaiwgbSk7Ci0gICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZqKTsKLSAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaiksIGkrKykgewotICAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaik7Ci0gICAgYXNzZXJ0KGYtPm1zZy5kZWYgPT0gbSk7Ci0gICAgaWYgKCF1cGJfdmFsaWRhdGVfZmllbGQoZiwgcykpIHsKLSAgICAgIHVwYl9nZnJlZShmaWVsZHMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpKSB7Ci0gICAgICBtLT5zdWJtc2dfZmllbGRfY291bnQrKzsKLSAgICB9Ci0gICAgZmllbGRzW2ldID0gZjsKLSAgfQotCi0gIHFzb3J0KGZpZWxkcywgbiwgc2l6ZW9mKCpmaWVsZHMpLCBjbXBfZmllbGRzKTsKLQotICBzZWxlY3RvciA9IFVQQl9TVEFUSUNfU0VMRUNUT1JfQ09VTlQgKyBtLT5zdWJtc2dfZmllbGRfY291bnQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICB1cGJfZmllbGRkZWYgKmYgPSBmaWVsZHNbaV07Ci0gICAgZi0+aW5kZXhfID0gaTsKLSAgICBmLT5zZWxlY3Rvcl9iYXNlID0gc2VsZWN0b3IgKyB1cGJfaGFuZGxlcnNfc2VsZWN0b3JiYXNlb2Zmc2V0KGYpOwotICAgIHNlbGVjdG9yICs9IHVwYl9oYW5kbGVyc19zZWxlY3RvcmNvdW50KGYpOwotICB9Ci0gIG0tPnNlbGVjdG9yX2NvdW50ID0gc2VsZWN0b3I7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gIHsKLSAgICAvKiBWZXJpZnkgdGhhdCBhbGwgc2VsZWN0b3JzIGZvciB0aGUgbWVzc2FnZSBhcmUgZGlzdGluY3QuICovCi0jZGVmaW5lIFRSWSh0eXBlKSBcCi0gICAgaWYgKHVwYl9oYW5kbGVyc19nZXRzZWxlY3RvcihmLCB0eXBlLCAmc2VsKSkgdXBiX2ludHRhYmxlX2luc2VydCgmdCwgc2VsLCB2KTsKLQotICAgIHVwYl9pbnR0YWJsZSB0OwotICAgIHVwYl92YWx1ZSB2OwotICAgIHVwYl9zZWxlY3Rvcl90IHNlbDsKLQotICAgIHVwYl9pbnR0YWJsZV9pbml0KCZ0LCBVUEJfQ1RZUEVfQk9PTCk7Ci0gICAgdiA9IHVwYl92YWx1ZV9ib29sKHRydWUpOwotICAgIHVwYl9pbnR0YWJsZV9pbnNlcnQoJnQsIFVQQl9TVEFSVE1TR19TRUxFQ1RPUiwgdik7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydCgmdCwgVVBCX0VORE1TR19TRUxFQ1RPUiwgdik7Ci0gICAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmosIG0pOwotICAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZqKTsKLSAgICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZqKSkgewotICAgICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZqKTsKLSAgICAgIC8qIFRoZXNlIGNhbGxzIHdpbGwgYXNzZXJ0LWZhaWwgaW4gdXBiX3RhYmxlIGlmIHRoZSB2YWx1ZSBhbHJlYWR5Ci0gICAgICAgKiBleGlzdHMuICovCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfSU5UMzIpOwotICAgICAgVFJZKFVQQl9IQU5ETEVSX0lOVDY0KQotICAgICAgVFJZKFVQQl9IQU5ETEVSX1VJTlQzMikKLSAgICAgIFRSWShVUEJfSEFORExFUl9VSU5UNjQpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfRkxPQVQpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfRE9VQkxFKQotICAgICAgVFJZKFVQQl9IQU5ETEVSX0JPT0wpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfU1RBUlRTVFIpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfU1RSSU5HKQotICAgICAgVFJZKFVQQl9IQU5ETEVSX0VORFNUUikKLSAgICAgIFRSWShVUEJfSEFORExFUl9TVEFSVFNVQk1TRykKLSAgICAgIFRSWShVUEJfSEFORExFUl9FTkRTVUJNU0cpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfU1RBUlRTRVEpCi0gICAgICBUUlkoVVBCX0hBTkRMRVJfRU5EU0VRKQotICAgIH0KLSAgICB1cGJfaW50dGFibGVfdW5pbml0KCZ0KTsKLSAgfQotI3VuZGVmIFRSWQotI2VuZGlmCi0KLSAgdXBiX2dmcmVlKGZpZWxkcyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIF91cGJfZGVmX3ZhbGlkYXRlKHVwYl9kZWYgKmNvbnN0KmRlZnMsIHNpemVfdCBuLCB1cGJfc3RhdHVzICpzKSB7Ci0gIHNpemVfdCBpOwotCi0gIC8qIEZpcnN0IHBlcmZvcm0gdmFsaWRhdGlvbiwgaW4gdHdvIHBhc3NlcyBzbyB3ZSBjYW4gY2hlY2sgdGhhdCB3ZSBoYXZlIGEKLSAgICogdHJhbnNpdGl2ZSBjbG9zdXJlIHdpdGhvdXQgbmVlZGluZyB0byBzZWFyY2guICovCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICB1cGJfZGVmICpkZWYgPSBkZWZzW2ldOwotICAgIGlmICh1cGJfZGVmX2lzZnJvemVuKGRlZikpIHsKLSAgICAgIC8qIENvdWxkIHJlbGF4IHRoaXMgcmVxdWlyZW1lbnQgaWYgaXQncyBhbm5veWluZy4gKi8KLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJkZWYgaXMgYWxyZWFkeSBmcm96ZW4iKTsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0gZWxzZSBpZiAoZGVmLT50eXBlID09IFVQQl9ERUZfRklFTEQpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJzdGFuZGFsb25lIGZpZWxkZGVmcyBjYW4gbm90IGJlIGZyb3plbiIpOwotICAgICAgZ290byBlcnI7Ci0gICAgfSBlbHNlIGlmIChkZWYtPnR5cGUgPT0gVVBCX0RFRl9FTlVNKSB7Ci0gICAgICBpZiAoIXVwYl92YWxpZGF0ZV9lbnVtZGVmKHVwYl9keW5jYXN0X2VudW1kZWYoZGVmKSwgcykpIHsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIFNldCBub3cgdG8gZGV0ZWN0IHRyYW5zaXRpdmUgY2xvc3VyZSBpbiB0aGUgc2Vjb25kIHBhc3MuICovCi0gICAgICBkZWYtPmNhbWVfZnJvbV91c2VyID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKiBTZWNvbmQgcGFzcyBvZiB2YWxpZGF0aW9uLiAgQWxzbyBhc3NpZ24gc2VsZWN0b3IgYmFzZXMgYW5kIGluZGV4ZXMsIGFuZAotICAgKiBjb21wYWN0IHRhYmxlcy4gKi8KLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIHVwYl9kZWYgKmRlZiA9IGRlZnNbaV07Ci0gICAgdXBiX21zZ2RlZiAqbSA9IHVwYl9keW5jYXN0X21zZ2RlZl9tdXRhYmxlKGRlZik7Ci0gICAgdXBiX2VudW1kZWYgKmUgPSB1cGJfZHluY2FzdF9lbnVtZGVmX211dGFibGUoZGVmKTsKLSAgICBpZiAobSkgewotICAgICAgdXBiX2ludHRhYmxlX2NvbXBhY3QoJm0tPml0b2YpOwotICAgICAgaWYgKCFhc3NpZ25fbXNnX2luZGljZXMobSwgcykpIHsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChlKSB7Ci0gICAgICB1cGJfaW50dGFibGVfY29tcGFjdCgmZS0+aXRvbik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLWVycjoKLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIHVwYl9kZWYgKmRlZiA9IGRlZnNbaV07Ci0gICAgZGVmLT5jYW1lX2Zyb21fdXNlciA9IGZhbHNlOwotICB9Ci0gIGFzc2VydCghKHMgJiYgdXBiX29rKHMpKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCB1cGJfZGVmX2ZyZWV6ZSh1cGJfZGVmICpjb25zdCogZGVmcywgc2l6ZV90IG4sIHVwYl9zdGF0dXMgKnMpIHsKLSAgLyogRGVmIGdyYXBoIGNvbnRhaW5zIEZpZWxkRGVmcyBiZXR3ZWVuIGVhY2ggTWVzc2FnZURlZiwgc28gZG91YmxlIHRoZQotICAgKiBsaW1pdC4gKi8KLSAgY29uc3Qgc2l6ZV90IG1heGRlcHRoID0gVVBCX01BWF9NRVNTQUdFX0RFUFRIICogMjsKLQotICBpZiAoIV91cGJfZGVmX3ZhbGlkYXRlKGRlZnMsIG4sIHMpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotICAvKiBWYWxpZGF0aW9uIGFsbCBwYXNzZWQ7IGZyZWV6ZSB0aGUgb2JqZWN0cy4gKi8KLSAgcmV0dXJuIHVwYl9yZWZjb3VudGVkX2ZyZWV6ZSgodXBiX3JlZmNvdW50ZWQgKmNvbnN0KilkZWZzLCBuLCBzLCBtYXhkZXB0aCk7Ci19Ci0KLQotLyogdXBiX2VudW1kZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdXBiX2VudW1kZWZfZnJlZSh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfZW51bWRlZiAqZSA9ICh1cGJfZW51bWRlZiopcjsKLSAgdXBiX2ludHRhYmxlX2l0ZXIgaTsKLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCAmZS0+aXRvbik7Ci0gIGZvciggOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICAvKiBUbyBjbGVhbiB1cCB0aGUgdXBiX2dzdHJkdXAoKSBmcm9tIHVwYl9lbnVtZGVmX2FkZHZhbCgpLiAqLwotICAgIHVwYl9nZnJlZSh1cGJfdmFsdWVfZ2V0Y3N0cih1cGJfaW50dGFibGVfaXRlcl92YWx1ZSgmaSkpKTsKLSAgfQotICB1cGJfc3RydGFibGVfdW5pbml0KCZlLT5udG9pKTsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmZS0+aXRvbik7Ci0gIHVwYl9kZWZfdW5pbml0KHVwYl9lbnVtZGVmX3VwY2FzdF9tdXRhYmxlKGUpKTsKLSAgdXBiX2dmcmVlKGUpOwotfQotCi1jb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB1cGJfZW51bWRlZl92dGJsID0ge05VTEwsICZ1cGJfZW51bWRlZl9mcmVlfTsKLQotdXBiX2VudW1kZWYgKnVwYl9lbnVtZGVmX25ldyhjb25zdCB2b2lkICpvd25lcikgewotICB1cGJfZW51bWRlZiAqZSA9IHVwYl9nbWFsbG9jKHNpemVvZigqZSkpOwotICBpZiAoIWUpIHJldHVybiBOVUxMOwotCi0gIGlmICghdXBiX2RlZl9pbml0KHVwYl9lbnVtZGVmX3VwY2FzdF9tdXRhYmxlKGUpLCBVUEJfREVGX0VOVU0sCi0gICAgICAgICAgICAgICAgICAgICZ1cGJfZW51bWRlZl92dGJsLCBvd25lcikpIHsKLSAgICBnb3RvIGVycjI7Ci0gIH0KLQotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbml0KCZlLT5udG9pLCBVUEJfQ1RZUEVfSU5UMzIpKSBnb3RvIGVycjI7Ci0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoJmUtPml0b24sIFVQQl9DVFlQRV9DU1RSKSkgZ290byBlcnIxOwotICByZXR1cm4gZTsKLQotZXJyMToKLSAgdXBiX3N0cnRhYmxlX3VuaW5pdCgmZS0+bnRvaSk7Ci1lcnIyOgotICB1cGJfZ2ZyZWUoZSk7Ci0gIHJldHVybiBOVUxMOwotfQotCi11cGJfZW51bWRlZiAqdXBiX2VudW1kZWZfZHVwKGNvbnN0IHVwYl9lbnVtZGVmICplLCBjb25zdCB2b2lkICpvd25lcikgewotICB1cGJfZW51bV9pdGVyIGk7Ci0gIHVwYl9lbnVtZGVmICpuZXdfZSA9IHVwYl9lbnVtZGVmX25ldyhvd25lcik7Ci0gIGlmICghbmV3X2UpIHJldHVybiBOVUxMOwotICBmb3IodXBiX2VudW1fYmVnaW4oJmksIGUpOyAhdXBiX2VudW1fZG9uZSgmaSk7IHVwYl9lbnVtX25leHQoJmkpKSB7Ci0gICAgYm9vbCBzdWNjZXNzID0gdXBiX2VudW1kZWZfYWRkdmFsKAotICAgICAgICBuZXdfZSwgdXBiX2VudW1faXRlcl9uYW1lKCZpKSx1cGJfZW51bV9pdGVyX251bWJlcigmaSksIE5VTEwpOwotICAgIGlmICghc3VjY2VzcykgewotICAgICAgdXBiX2VudW1kZWZfdW5yZWYobmV3X2UsIG93bmVyKTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLSAgfQotICByZXR1cm4gbmV3X2U7Ci19Ci0KLWJvb2wgdXBiX2VudW1kZWZfZnJlZXplKHVwYl9lbnVtZGVmICplLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgdXBiX2RlZiAqZCA9IHVwYl9lbnVtZGVmX3VwY2FzdF9tdXRhYmxlKGUpOwotICByZXR1cm4gdXBiX2RlZl9mcmVlemUoJmQsIDEsIHN0YXR1cyk7Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9lbnVtZGVmX2Z1bGxuYW1lKGNvbnN0IHVwYl9lbnVtZGVmICplKSB7Ci0gIHJldHVybiB1cGJfZGVmX2Z1bGxuYW1lKHVwYl9lbnVtZGVmX3VwY2FzdChlKSk7Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9lbnVtZGVmX25hbWUoY29uc3QgdXBiX2VudW1kZWYgKmUpIHsKLSAgcmV0dXJuIHVwYl9kZWZfbmFtZSh1cGJfZW51bWRlZl91cGNhc3QoZSkpOwotfQotCi1ib29sIHVwYl9lbnVtZGVmX3NldGZ1bGxuYW1lKHVwYl9lbnVtZGVmICplLCBjb25zdCBjaGFyICpmdWxsbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfZW51bWRlZl91cGNhc3RfbXV0YWJsZShlKSwgZnVsbG5hbWUsIHMpOwotfQotCi1ib29sIHVwYl9lbnVtZGVmX2FkZHZhbCh1cGJfZW51bWRlZiAqZSwgY29uc3QgY2hhciAqbmFtZSwgaW50MzJfdCBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgY2hhciAqbmFtZTI7Ci0KLSAgaWYgKCF1cGJfaXNpZGVudChuYW1lLCBzdHJsZW4obmFtZSksIGZhbHNlLCBzdGF0dXMpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHVwYl9lbnVtZGVmX250b2l6KGUsIG5hbWUsIE5VTEwpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKHN0YXR1cywgIm5hbWUgJyVzJyBpcyBhbHJlYWR5IGRlZmluZWQiLCBuYW1lKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbnNlcnQoJmUtPm50b2ksIG5hbWUsIHVwYl92YWx1ZV9pbnQzMihudW0pKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIm91dCBvZiBtZW1vcnkiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIXVwYl9pbnR0YWJsZV9sb29rdXAoJmUtPml0b24sIG51bSwgTlVMTCkpIHsKLSAgICBuYW1lMiA9IHVwYl9nc3RyZHVwKG5hbWUpOwotICAgIGlmICghbmFtZTIgfHwgIXVwYl9pbnR0YWJsZV9pbnNlcnQoJmUtPml0b24sIG51bSwgdXBiX3ZhbHVlX2NzdHIobmFtZTIpKSkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJtc2coc3RhdHVzLCAib3V0IG9mIG1lbW9yeSIpOwotICAgICAgdXBiX3N0cnRhYmxlX3JlbW92ZSgmZS0+bnRvaSwgbmFtZSwgTlVMTCk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHVwYl9lbnVtZGVmX251bXZhbHMoZSkgPT0gMSkgewotICAgIGJvb2wgb2sgPSB1cGJfZW51bWRlZl9zZXRkZWZhdWx0KGUsIG51bSwgTlVMTCk7Ci0gICAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1pbnQzMl90IHVwYl9lbnVtZGVmX2RlZmF1bHQoY29uc3QgdXBiX2VudW1kZWYgKmUpIHsKLSAgYXNzZXJ0KHVwYl9lbnVtZGVmX2l0b24oZSwgZS0+ZGVmYXVsdHZhbCkpOwotICByZXR1cm4gZS0+ZGVmYXVsdHZhbDsKLX0KLQotYm9vbCB1cGJfZW51bWRlZl9zZXRkZWZhdWx0KHVwYl9lbnVtZGVmICplLCBpbnQzMl90IHZhbCwgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoIXVwYl9lbnVtZGVmX2lzZnJvemVuKGUpKTsKLSAgaWYgKCF1cGJfZW51bWRlZl9pdG9uKGUsIHZhbCkpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYocywgIm51bWJlciAnJWQnIGlzIG5vdCBpbiB0aGUgZW51bS4iLCB2YWwpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBlLT5kZWZhdWx0dmFsID0gdmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW50IHVwYl9lbnVtZGVmX251bXZhbHMoY29uc3QgdXBiX2VudW1kZWYgKmUpIHsKLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9jb3VudCgmZS0+bnRvaSk7Ci19Ci0KLXZvaWQgdXBiX2VudW1fYmVnaW4odXBiX2VudW1faXRlciAqaSwgY29uc3QgdXBiX2VudW1kZWYgKmUpIHsKLSAgLyogV2UgaXRlcmF0ZSBvdmVyIHRoZSBudG9pIHRhYmxlLCB0byBhY2NvdW50IGZvciBkdXBsaWNhdGUgbnVtYmVycy4gKi8KLSAgdXBiX3N0cnRhYmxlX2JlZ2luKGksICZlLT5udG9pKTsKLX0KLQotdm9pZCB1cGJfZW51bV9uZXh0KHVwYl9lbnVtX2l0ZXIgKml0ZXIpIHsgdXBiX3N0cnRhYmxlX25leHQoaXRlcik7IH0KLWJvb2wgdXBiX2VudW1fZG9uZSh1cGJfZW51bV9pdGVyICppdGVyKSB7IHJldHVybiB1cGJfc3RydGFibGVfZG9uZShpdGVyKTsgfQotCi1ib29sIHVwYl9lbnVtZGVmX250b2koY29uc3QgdXBiX2VudW1kZWYgKmRlZiwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBpbnQzMl90ICpudW0pIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIGlmICghdXBiX3N0cnRhYmxlX2xvb2t1cDIoJmRlZi0+bnRvaSwgbmFtZSwgbGVuLCAmdikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKG51bSkgKm51bSA9IHVwYl92YWx1ZV9nZXRpbnQzMih2KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9lbnVtZGVmX2l0b24oY29uc3QgdXBiX2VudW1kZWYgKmRlZiwgaW50MzJfdCBudW0pIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfbG9va3VwMzIoJmRlZi0+aXRvbiwgbnVtLCAmdikgPwotICAgICAgdXBiX3ZhbHVlX2dldGNzdHIodikgOiBOVUxMOwotfQotCi1jb25zdCBjaGFyICp1cGJfZW51bV9pdGVyX25hbWUodXBiX2VudW1faXRlciAqaXRlcikgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KGl0ZXIpOwotfQotCi1pbnQzMl90IHVwYl9lbnVtX2l0ZXJfbnVtYmVyKHVwYl9lbnVtX2l0ZXIgKml0ZXIpIHsKLSAgcmV0dXJuIHVwYl92YWx1ZV9nZXRpbnQzMih1cGJfc3RydGFibGVfaXRlcl92YWx1ZShpdGVyKSk7Ci19Ci0KLQotLyogdXBiX2ZpZWxkZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdXBiX2ZpZWxkZGVmX2luaXRfZGVmYXVsdCh1cGJfZmllbGRkZWYgKmYpOwotCi1zdGF0aWMgdm9pZCB1cGJfZmllbGRkZWZfdW5pbml0X2RlZmF1bHQodXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGlmIChmLT50eXBlX2lzX3NldF8gJiYgZi0+ZGVmYXVsdF9pc19zdHJpbmcgJiYgZi0+ZGVmYXVsdHZhbC5ieXRlcykKLSAgICBmcmVlc3RyKGYtPmRlZmF1bHR2YWwuYnl0ZXMpOwotfQotCi1jb25zdCBjaGFyICp1cGJfZmllbGRkZWZfZnVsbG5hbWUoY29uc3QgdXBiX2ZpZWxkZGVmICplKSB7Ci0gIHJldHVybiB1cGJfZGVmX2Z1bGxuYW1lKHVwYl9maWVsZGRlZl91cGNhc3QoZSkpOwotfQotCi1zdGF0aWMgdm9pZCB2aXNpdGZpZWxkKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZF92aXNpdCAqdmlzaXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gKGNvbnN0IHVwYl9maWVsZGRlZiopcjsKLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKSkgewotICAgIHZpc2l0KHIsIHVwYl9tc2dkZWZfdXBjYXN0Mih1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikpLCBjbG9zdXJlKTsKLSAgfQotICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSkgewotICAgIHZpc2l0KHIsIHVwYl9vbmVvZmRlZl91cGNhc3QodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSksIGNsb3N1cmUpOwotICB9Ci0gIGlmICh1cGJfZmllbGRkZWZfc3ViZGVmKGYpKSB7Ci0gICAgdmlzaXQociwgdXBiX2RlZl91cGNhc3QodXBiX2ZpZWxkZGVmX3N1YmRlZihmKSksIGNsb3N1cmUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVmaWVsZCh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfZmllbGRkZWYgKmYgPSAodXBiX2ZpZWxkZGVmKilyOwotICB1cGJfZmllbGRkZWZfdW5pbml0X2RlZmF1bHQoZik7Ci0gIGlmIChmLT5zdWJkZWZfaXNfc3ltYm9saWMpCi0gICAgdXBiX2dmcmVlKGYtPnN1Yi5uYW1lKTsKLSAgdXBiX2RlZl91bmluaXQodXBiX2ZpZWxkZGVmX3VwY2FzdF9tdXRhYmxlKGYpKTsKLSAgdXBiX2dmcmVlKGYpOwotfQotCi1zdGF0aWMgY29uc3QgY2hhciAqZW51bWRlZmF1bHRzdHIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGNvbnN0IHVwYl9lbnVtZGVmICplOwotICBhc3NlcnQoZi0+dHlwZV9pc19zZXRfICYmIGYtPnR5cGVfID09IFVQQl9UWVBFX0VOVU0pOwotICBlID0gdXBiX2ZpZWxkZGVmX2VudW1zdWJkZWYoZik7Ci0gIGlmIChmLT5kZWZhdWx0X2lzX3N0cmluZyAmJiBmLT5kZWZhdWx0dmFsLmJ5dGVzKSB7Ci0gICAgLyogRGVmYXVsdCB3YXMgZXhwbGljaXRseSBzZXQgYXMgYSBzdHJpbmcuICovCi0gICAgc3RyX3QgKnMgPSBmLT5kZWZhdWx0dmFsLmJ5dGVzOwotICAgIHJldHVybiBzLT5zdHI7Ci0gIH0gZWxzZSBpZiAoZSkgewotICAgIGlmICghZi0+ZGVmYXVsdF9pc19zdHJpbmcpIHsKLSAgICAgIC8qIERlZmF1bHQgd2FzIGV4cGxpY2l0bHkgc2V0IGFzIGFuIGludGVnZXI7IGxvb2sgaXQgdXAgaW4gZW51bWRlZi4gKi8KLSAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB1cGJfZW51bWRlZl9pdG9uKGUsIGYtPmRlZmF1bHR2YWwuc2ludCk7Ci0gICAgICBpZiAobmFtZSkgewotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogRGVmYXVsdCBpcyBjb21wbGV0ZWx5IHVuc2V0OyBwdWxsIGVudW1kZWYgZGVmYXVsdC4gKi8KLSAgICAgIGlmICh1cGJfZW51bWRlZl9udW12YWxzKGUpID4gMCkgewotICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gdXBiX2VudW1kZWZfaXRvbihlLCB1cGJfZW51bWRlZl9kZWZhdWx0KGUpKTsKLSAgICAgICAgYXNzZXJ0KG5hbWUpOwotICAgICAgICByZXR1cm4gbmFtZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyBib29sIGVudW1kZWZhdWx0aW50MzIoY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBpbnQzMl90ICp2YWwpIHsKLSAgY29uc3QgdXBiX2VudW1kZWYgKmU7Ci0gIGFzc2VydChmLT50eXBlX2lzX3NldF8gJiYgZi0+dHlwZV8gPT0gVVBCX1RZUEVfRU5VTSk7Ci0gIGUgPSB1cGJfZmllbGRkZWZfZW51bXN1YmRlZihmKTsKLSAgaWYgKCFmLT5kZWZhdWx0X2lzX3N0cmluZykgewotICAgIC8qIERlZmF1bHQgd2FzIGV4cGxpY2l0bHkgc2V0IGFzIGFuIGludGVnZXIuICovCi0gICAgKnZhbCA9IGYtPmRlZmF1bHR2YWwuc2ludDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChlKSB7Ci0gICAgaWYgKGYtPmRlZmF1bHR2YWwuYnl0ZXMpIHsKLSAgICAgIC8qIERlZmF1bHQgd2FzIGV4cGxpY2l0bHkgc2V0IGFzIGEgc3RyOyB0cnkgdG8gbG9va3VwIGNvcnJlc3BvbmRpbmcgaW50LiAqLwotICAgICAgc3RyX3QgKnMgPSBmLT5kZWZhdWx0dmFsLmJ5dGVzOwotICAgICAgaWYgKHVwYl9lbnVtZGVmX250b2l6KGUsIHMtPnN0ciwgdmFsKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgLyogRGVmYXVsdCBpcyB1bnNldDsgdHJ5IHRvIHB1bGwgaW4gZW51bWRlZiBkZWZhdWx0LiAqLwotICAgICAgaWYgKHVwYl9lbnVtZGVmX251bXZhbHMoZSkgPiAwKSB7Ci0gICAgICAgICp2YWwgPSB1cGJfZW51bWRlZl9kZWZhdWx0KGUpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB1cGJfZmllbGRkZWZfdnRibCA9IHt2aXNpdGZpZWxkLCBmcmVlZmllbGR9OwotCi11cGJfZmllbGRkZWYgKnVwYl9maWVsZGRlZl9uZXcoY29uc3Qgdm9pZCAqbykgewotICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfZ21hbGxvYyhzaXplb2YoKmYpKTsKLSAgaWYgKCFmKSByZXR1cm4gTlVMTDsKLSAgaWYgKCF1cGJfZGVmX2luaXQodXBiX2ZpZWxkZGVmX3VwY2FzdF9tdXRhYmxlKGYpLCBVUEJfREVGX0ZJRUxELAotICAgICAgICAgICAgICAgICAgICAmdXBiX2ZpZWxkZGVmX3Z0YmwsIG8pKSB7Ci0gICAgdXBiX2dmcmVlKGYpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGYtPm1zZy5kZWYgPSBOVUxMOwotICBmLT5zdWIuZGVmID0gTlVMTDsKLSAgZi0+b25lb2YgPSBOVUxMOwotICBmLT5zdWJkZWZfaXNfc3ltYm9saWMgPSBmYWxzZTsKLSAgZi0+bXNnX2lzX3N5bWJvbGljID0gZmFsc2U7Ci0gIGYtPmxhYmVsXyA9IFVQQl9MQUJFTF9PUFRJT05BTDsKLSAgZi0+dHlwZV8gPSBVUEJfVFlQRV9JTlQzMjsKLSAgZi0+bnVtYmVyXyA9IDA7Ci0gIGYtPnR5cGVfaXNfc2V0XyA9IGZhbHNlOwotICBmLT50YWdkZWxpbSA9IGZhbHNlOwotICBmLT5pc19leHRlbnNpb25fID0gZmFsc2U7Ci0gIGYtPmxhenlfID0gZmFsc2U7Ci0gIGYtPnBhY2tlZF8gPSB0cnVlOwotCi0gIC8qIEZvciB0aGUgbW9tZW50IHdlIGRlZmF1bHQgdGhpcyB0byBVUEJfSU5URk1UX1ZBUklBQkxFLCBzaW5jZSBpdCB3aWxsIHdvcmsKLSAgICogd2l0aCBhbGwgaW50ZWdlciB0eXBlcyBhbmQgaXMgaW4gc29tZSBzaW5jZSBtb3JlICJkZWZhdWx0IiBzaW5jZSB0aGUgbW9zdAotICAgKiBub3JtYWwtbG9va2luZyBwcm90bzIgdHlwZXMgaW50MzIvaW50NjQvdWludDMyL3VpbnQ2NCB1c2UgdmFyaWFibGUuCi0gICAqCi0gICAqIE90aGVyIG9wdGlvbnMgdG8gY29uc2lkZXI6Ci0gICAqIC0gdGhlcmUgaXMgbm8gZGVmYXVsdDsgdXNlcnMgbXVzdCBzZXQgdGhpcyBtYW51YWxseSAobGlrZSB0eXBlKS4KLSAgICogLSBkZWZhdWx0IHNpZ25lZCBpbnRlZ2VycyB0byBVUEJfSU5URk1UX1pJR1pBRywgc2luY2UgaXQncyBtb3JlIGxpa2VseSB0bwotICAgKiAgIGJlIGFuIG9wdGltYWwgZGVmYXVsdCBmb3Igc2lnbmVkIGludGVnZXJzLiAqLwotICBmLT5pbnRmbXQgPSBVUEJfSU5URk1UX1ZBUklBQkxFOwotICByZXR1cm4gZjsKLX0KLQotdXBiX2ZpZWxkZGVmICp1cGJfZmllbGRkZWZfZHVwKGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgY29uc3QgY2hhciAqc3JjbmFtZTsKLSAgdXBiX2ZpZWxkZGVmICpuZXdmID0gdXBiX2ZpZWxkZGVmX25ldyhvd25lcik7Ci0gIGlmICghbmV3ZikgcmV0dXJuIE5VTEw7Ci0gIHVwYl9maWVsZGRlZl9zZXR0eXBlKG5ld2YsIHVwYl9maWVsZGRlZl90eXBlKGYpKTsKLSAgdXBiX2ZpZWxkZGVmX3NldGxhYmVsKG5ld2YsIHVwYl9maWVsZGRlZl9sYWJlbChmKSk7Ci0gIHVwYl9maWVsZGRlZl9zZXRudW1iZXIobmV3ZiwgdXBiX2ZpZWxkZGVmX251bWJlcihmKSwgTlVMTCk7Ci0gIHVwYl9maWVsZGRlZl9zZXRuYW1lKG5ld2YsIHVwYl9maWVsZGRlZl9uYW1lKGYpLCBOVUxMKTsKLSAgaWYgKGYtPmRlZmF1bHRfaXNfc3RyaW5nICYmIGYtPmRlZmF1bHR2YWwuYnl0ZXMpIHsKLSAgICBzdHJfdCAqcyA9IGYtPmRlZmF1bHR2YWwuYnl0ZXM7Ci0gICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRzdHIobmV3Ziwgcy0+c3RyLCBzLT5sZW4sIE5VTEwpOwotICB9IGVsc2UgewotICAgIG5ld2YtPmRlZmF1bHRfaXNfc3RyaW5nID0gZi0+ZGVmYXVsdF9pc19zdHJpbmc7Ci0gICAgbmV3Zi0+ZGVmYXVsdHZhbCA9IGYtPmRlZmF1bHR2YWw7Ci0gIH0KLQotICBpZiAoZi0+c3ViZGVmX2lzX3N5bWJvbGljKSB7Ci0gICAgc3JjbmFtZSA9IGYtPnN1Yi5uYW1lOyAgLyogTWlnaHQgYmUgTlVMTC4gKi8KLSAgfSBlbHNlIHsKLSAgICBzcmNuYW1lID0gZi0+c3ViLmRlZiA/IHVwYl9kZWZfZnVsbG5hbWUoZi0+c3ViLmRlZikgOiBOVUxMOwotICB9Ci0gIGlmIChzcmNuYW1lKSB7Ci0gICAgY2hhciAqbmV3bmFtZSA9IHVwYl9nbWFsbG9jKHN0cmxlbihmLT5zdWIuZGVmLT5mdWxsbmFtZSkgKyAyKTsKLSAgICBpZiAoIW5ld25hbWUpIHsKLSAgICAgIHVwYl9maWVsZGRlZl91bnJlZihuZXdmLCBvd25lcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgc3RyY3B5KG5ld25hbWUsICIuIik7Ci0gICAgc3RyY2F0KG5ld25hbWUsIGYtPnN1Yi5kZWYtPmZ1bGxuYW1lKTsKLSAgICB1cGJfZmllbGRkZWZfc2V0c3ViZGVmbmFtZShuZXdmLCBuZXduYW1lLCBOVUxMKTsKLSAgICB1cGJfZ2ZyZWUobmV3bmFtZSk7Ci0gIH0KLQotICByZXR1cm4gbmV3ZjsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfdHlwZWlzc2V0KGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+dHlwZV9pc19zZXRfOwotfQotCi11cGJfZmllbGR0eXBlX3QgdXBiX2ZpZWxkZGVmX3R5cGUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGFzc2VydChmLT50eXBlX2lzX3NldF8pOwotICByZXR1cm4gZi0+dHlwZV87Ci19Ci0KLXVpbnQzMl90IHVwYl9maWVsZGRlZl9pbmRleChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIGYtPmluZGV4XzsKLX0KLQotdXBiX2xhYmVsX3QgdXBiX2ZpZWxkZGVmX2xhYmVsKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+bGFiZWxfOwotfQotCi11cGJfaW50Zm10X3QgdXBiX2ZpZWxkZGVmX2ludGZtdChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIGYtPmludGZtdDsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfaXN0YWdkZWxpbShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIGYtPnRhZ2RlbGltOwotfQotCi11aW50MzJfdCB1cGJfZmllbGRkZWZfbnVtYmVyKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+bnVtYmVyXzsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfaXNleHRlbnNpb24oY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiBmLT5pc19leHRlbnNpb25fOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9sYXp5KGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+bGF6eV87Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX3BhY2tlZChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIGYtPnBhY2tlZF87Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9maWVsZGRlZl9uYW1lKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gdXBiX2RlZl9mdWxsbmFtZSh1cGJfZmllbGRkZWZfdXBjYXN0KGYpKTsKLX0KLQotc2l6ZV90IHVwYl9maWVsZGRlZl9nZXRqc29ubmFtZShjb25zdCB1cGJfZmllbGRkZWYgKmYsIGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbikgewotICBjb25zdCBjaGFyICpuYW1lID0gdXBiX2ZpZWxkZGVmX25hbWUoZik7Ci0gIHNpemVfdCBzcmMsIGRzdCA9IDA7Ci0gIGJvb2wgdWNhc2VfbmV4dCA9IGZhbHNlOwotCi0jZGVmaW5lIFdSSVRFKGJ5dGUpIFwKLSAgKytkc3Q7IFwKLSAgaWYgKGRzdCA8IGxlbikgYnVmW2RzdCAtIDFdID0gYnl0ZTsgXAotICBlbHNlIGlmIChkc3QgPT0gbGVuKSBidWZbZHN0IC0gMV0gPSAnXDAnCi0KLSAgaWYgKCFuYW1lKSB7Ci0gICAgV1JJVEUoJ1wwJyk7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLQotICAvKiBJbXBsZW1lbnQgdGhlIHRyYW5zZm9ybWF0aW9uIGFzIGRlc2NyaWJlZCBpbiB0aGUgc3BlYzoKLSAgICogICAxLiB1cHBlciBjYXNlIGFsbCBsZXR0ZXJzIGFmdGVyIGFuIHVuZGVyc2NvcmUuCi0gICAqICAgMi4gcmVtb3ZlIGFsbCB1bmRlcnNjb3Jlcy4KLSAgICovCi0gIGZvciAoc3JjID0gMDsgbmFtZVtzcmNdOyBzcmMrKykgewotICAgIGlmIChuYW1lW3NyY10gPT0gJ18nKSB7Ci0gICAgICB1Y2FzZV9uZXh0ID0gdHJ1ZTsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLQotICAgIGlmICh1Y2FzZV9uZXh0KSB7Ci0gICAgICBXUklURSh0b3VwcGVyKG5hbWVbc3JjXSkpOwotICAgICAgdWNhc2VfbmV4dCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICBXUklURShuYW1lW3NyY10pOwotICAgIH0KLSAgfQotCi0gIFdSSVRFKCdcMCcpOwotICByZXR1cm4gZHN0OwotCi0jdW5kZWYgV1JJVEUKLX0KLQotY29uc3QgdXBiX21zZ2RlZiAqdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+bXNnX2lzX3N5bWJvbGljID8gTlVMTCA6IGYtPm1zZy5kZWY7Ci19Ci0KLWNvbnN0IHVwYl9vbmVvZmRlZiAqdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIGYtPm9uZW9mOwotfQotCi11cGJfbXNnZGVmICp1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGVfbXV0YWJsZSh1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuICh1cGJfbXNnZGVmKil1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZik7Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZW5hbWUodXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiBmLT5tc2dfaXNfc3ltYm9saWMgPyBmLT5tc2cubmFtZSA6IE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfY29udGFpbmluZ3R5cGUodXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGlmIChmLT5tc2dfaXNfc3ltYm9saWMpIHVwYl9nZnJlZShmLT5tc2cubmFtZSk7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX3NldGNvbnRhaW5pbmd0eXBlbmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBjaGFyICpuYW1lX2NvcHk7Ci0gIGFzc2VydCghdXBiX2ZpZWxkZGVmX2lzZnJvemVuKGYpKTsKLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZCBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIGEgbWVzc2FnZS4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgLyogVE9ETzogdmFsaWRhdGUgbmFtZSAodXBiX2lzaWRlbnQoKSBkb2Vzbid0IHF1aXRlIHdvcmsgYXRtIGJlY2F1c2UgdGhpcyBuYW1lCi0gICAqIG1heSBoYXZlIGEgbGVhZGluZyAiLiIpLiAqLwotCi0gIG5hbWVfY29weSA9IHVwYl9nc3RyZHVwKG5hbWUpOwotICBpZiAoIW5hbWVfY29weSkgewotICAgIHVwYl91cGJlcnJfc2V0b29tKHMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJlbGVhc2VfY29udGFpbmluZ3R5cGUoZik7Ci0gIGYtPm1zZy5uYW1lID0gbmFtZV9jb3B5OwotICBmLT5tc2dfaXNfc3ltYm9saWMgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0bmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsIHVwYl9zdGF0dXMgKnMpIHsKLSAgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKSB8fCB1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGYpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgIkFscmVhZHkgYWRkZWQgdG8gbWVzc2FnZSBvciBvbmVvZiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfZmllbGRkZWZfdXBjYXN0X211dGFibGUoZiksIG5hbWUsIHMpOwotfQotCi1zdGF0aWMgdm9pZCBjaGtkZWZhdWx0dHlwZShjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9maWVsZHR5cGVfdCB0eXBlKSB7Ci0gIFVQQl9VTlVTRUQoZik7Ci0gIFVQQl9VTlVTRUQodHlwZSk7Ci0gIGFzc2VydChmLT50eXBlX2lzX3NldF8gJiYgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gdHlwZSk7Ci19Ci0KLWludDY0X3QgdXBiX2ZpZWxkZGVmX2RlZmF1bHRpbnQ2NChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfSU5UNjQpOwotICByZXR1cm4gZi0+ZGVmYXVsdHZhbC5zaW50OwotfQotCi1pbnQzMl90IHVwYl9maWVsZGRlZl9kZWZhdWx0aW50MzIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGlmIChmLT50eXBlX2lzX3NldF8gJiYgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSkgewotICAgIGludDMyX3QgdmFsOwotICAgIGJvb2wgb2sgPSBlbnVtZGVmYXVsdGludDMyKGYsICZ2YWwpOwotICAgIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gICAgcmV0dXJuIHZhbDsKLSAgfSBlbHNlIHsKLSAgICBjaGtkZWZhdWx0dHlwZShmLCBVUEJfVFlQRV9JTlQzMik7Ci0gICAgcmV0dXJuIGYtPmRlZmF1bHR2YWwuc2ludDsKLSAgfQotfQotCi11aW50NjRfdCB1cGJfZmllbGRkZWZfZGVmYXVsdHVpbnQ2NChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfVUlOVDY0KTsKLSAgcmV0dXJuIGYtPmRlZmF1bHR2YWwudWludDsKLX0KLQotdWludDMyX3QgdXBiX2ZpZWxkZGVmX2RlZmF1bHR1aW50MzIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGNoa2RlZmF1bHR0eXBlKGYsIFVQQl9UWVBFX1VJTlQzMik7Ci0gIHJldHVybiBmLT5kZWZhdWx0dmFsLnVpbnQ7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2RlZmF1bHRib29sKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBjaGtkZWZhdWx0dHlwZShmLCBVUEJfVFlQRV9CT09MKTsKLSAgcmV0dXJuIGYtPmRlZmF1bHR2YWwudWludDsKLX0KLQotZmxvYXQgdXBiX2ZpZWxkZGVmX2RlZmF1bHRmbG9hdChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfRkxPQVQpOwotICByZXR1cm4gZi0+ZGVmYXVsdHZhbC5mbHQ7Ci19Ci0KLWRvdWJsZSB1cGJfZmllbGRkZWZfZGVmYXVsdGRvdWJsZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY2hrZGVmYXVsdHR5cGUoZiwgVVBCX1RZUEVfRE9VQkxFKTsKLSAgcmV0dXJuIGYtPmRlZmF1bHR2YWwuZGJsOwotfQotCi1jb25zdCBjaGFyICp1cGJfZmllbGRkZWZfZGVmYXVsdHN0cihjb25zdCB1cGJfZmllbGRkZWYgKmYsIHNpemVfdCAqbGVuKSB7Ci0gIGFzc2VydChmLT50eXBlX2lzX3NldF8pOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfU1RSSU5HIHx8Ci0gICAgICAgICB1cGJfZmllbGRkZWZfdHlwZShmKSA9PSBVUEJfVFlQRV9CWVRFUyB8fAotICAgICAgICAgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSk7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICBjb25zdCBjaGFyICpyZXQgPSBlbnVtZGVmYXVsdHN0cihmKTsKLSAgICBhc3NlcnQocmV0KTsKLSAgICAvKiBFbnVtIGRlZmF1bHRzIGNhbid0IGhhdmUgZW1iZWRkZWQgTlVMTHMuICovCi0gICAgaWYgKGxlbikgKmxlbiA9IHN0cmxlbihyZXQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLQotICBpZiAoZi0+ZGVmYXVsdF9pc19zdHJpbmcpIHsKLSAgICBzdHJfdCAqc3RyID0gZi0+ZGVmYXVsdHZhbC5ieXRlczsKLSAgICBpZiAobGVuKSAqbGVuID0gc3RyLT5sZW47Ci0gICAgcmV0dXJuIHN0ci0+c3RyOwotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXN0YXRpYyB2b2lkIHVwYl9maWVsZGRlZl9pbml0X2RlZmF1bHQodXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGYtPmRlZmF1bHRfaXNfc3RyaW5nID0gZmFsc2U7Ci0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogZi0+ZGVmYXVsdHZhbC5kYmwgPSAwOyBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0ZMT0FUOiBmLT5kZWZhdWx0dmFsLmZsdCA9IDA7IGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDogZi0+ZGVmYXVsdHZhbC5zaW50ID0gMDsgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOiBmLT5kZWZhdWx0dmFsLnVpbnQgPSAwOyBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgZi0+ZGVmYXVsdHZhbC5ieXRlcyA9IG5ld3N0cigiIiwgMCk7Ci0gICAgICBmLT5kZWZhdWx0X2lzX3N0cmluZyA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6IGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfRU5VTToKLSAgICAgIC8qIFRoaXMgaXMgb3VyIHNwZWNpYWwgc2VudGluZWwgdGhhdCBpbmRpY2F0ZXMgIm5vdCBzZXQiIGZvciBhbiBlbnVtLiAqLwotICAgICAgZi0+ZGVmYXVsdF9pc19zdHJpbmcgPSB0cnVlOwotICAgICAgZi0+ZGVmYXVsdHZhbC5ieXRlcyA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1jb25zdCB1cGJfZGVmICp1cGJfZmllbGRkZWZfc3ViZGVmKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gZi0+c3ViZGVmX2lzX3N5bWJvbGljID8gTlVMTCA6IGYtPnN1Yi5kZWY7Ci19Ci0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYl9maWVsZGRlZl9tc2dzdWJkZWYoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIGNvbnN0IHVwYl9kZWYgKmRlZiA9IHVwYl9maWVsZGRlZl9zdWJkZWYoZik7Ci0gIHJldHVybiBkZWYgPyB1cGJfZHluY2FzdF9tc2dkZWYoZGVmKSA6IE5VTEw7Ci19Ci0KLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJfZmllbGRkZWZfZW51bXN1YmRlZihjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgY29uc3QgdXBiX2RlZiAqZGVmID0gdXBiX2ZpZWxkZGVmX3N1YmRlZihmKTsKLSAgcmV0dXJuIGRlZiA/IHVwYl9keW5jYXN0X2VudW1kZWYoZGVmKSA6IE5VTEw7Ci19Ci0KLXVwYl9kZWYgKnVwYl9maWVsZGRlZl9zdWJkZWZfbXV0YWJsZSh1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuICh1cGJfZGVmKil1cGJfZmllbGRkZWZfc3ViZGVmKGYpOwotfQotCi1jb25zdCBjaGFyICp1cGJfZmllbGRkZWZfc3ViZGVmbmFtZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKGYtPnN1YmRlZl9pc19zeW1ib2xpYykgewotICAgIHJldHVybiBmLT5zdWIubmFtZTsKLSAgfSBlbHNlIGlmIChmLT5zdWIuZGVmKSB7Ci0gICAgcmV0dXJuIHVwYl9kZWZfZnVsbG5hbWUoZi0+c3ViLmRlZik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0bnVtYmVyKHVwYl9maWVsZGRlZiAqZiwgdWludDMyX3QgbnVtYmVyLCB1cGJfc3RhdHVzICpzKSB7Ci0gIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZygKLSAgICAgICAgcywgImNhbm5vdCBjaGFuZ2UgZmllbGQgbnVtYmVyIGFmdGVyIGFkZGluZyB0byBhIG1lc3NhZ2UiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKG51bWJlciA9PSAwIHx8IG51bWJlciA+IFVQQl9NQVhfRklFTEROVU1CRVIpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYocywgImludmFsaWQgZmllbGQgbnVtYmVyICgldSkiLCBudW1iZXIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBmLT5udW1iZXJfID0gbnVtYmVyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0dHlwZSh1cGJfZmllbGRkZWYgKmYsIHVwYl9maWVsZHR5cGVfdCB0eXBlKSB7Ci0gIGFzc2VydCghdXBiX2ZpZWxkZGVmX2lzZnJvemVuKGYpKTsKLSAgYXNzZXJ0KHVwYl9maWVsZGRlZl9jaGVja3R5cGUodHlwZSkpOwotICB1cGJfZmllbGRkZWZfdW5pbml0X2RlZmF1bHQoZik7Ci0gIGYtPnR5cGVfID0gdHlwZTsKLSAgZi0+dHlwZV9pc19zZXRfID0gdHJ1ZTsKLSAgdXBiX2ZpZWxkZGVmX2luaXRfZGVmYXVsdChmKTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVzY3JpcHRvcnR5cGUodXBiX2ZpZWxkZGVmICpmLCBpbnQgdHlwZSkgewotICBhc3NlcnQoIXVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSk7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9ET1VCTEU6Ci0gICAgICB1cGJfZmllbGRkZWZfc2V0dHlwZShmLCBVUEJfVFlQRV9ET1VCTEUpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0ZMT0FUOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfRkxPQVQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0lOVDY0OgotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9TRklYRUQ2NDoKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfU0lOVDY0OgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfSU5UNjQpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX1VJTlQ2NDoKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfRklYRUQ2NDoKLSAgICAgIHVwYl9maWVsZGRlZl9zZXR0eXBlKGYsIFVQQl9UWVBFX1VJTlQ2NCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfSU5UMzI6Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX1NGSVhFRDMyOgotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzI6Ci0gICAgICB1cGJfZmllbGRkZWZfc2V0dHlwZShmLCBVUEJfVFlQRV9JTlQzMik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfVUlOVDMyOgotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDMyOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfVUlOVDMyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9CT09MOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfQk9PTCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfU1RSSU5HOgotICAgICAgdXBiX2ZpZWxkZGVmX3NldHR5cGUoZiwgVVBCX1RZUEVfU1RSSU5HKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9CWVRFUzoKLSAgICAgIHVwYl9maWVsZGRlZl9zZXR0eXBlKGYsIFVQQl9UWVBFX0JZVEVTKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0RFU0NSSVBUT1JfVFlQRV9HUk9VUDoKLSAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfTUVTU0FHRToKLSAgICAgIHVwYl9maWVsZGRlZl9zZXR0eXBlKGYsIFVQQl9UWVBFX01FU1NBR0UpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0VOVU06Ci0gICAgICB1cGJfZmllbGRkZWZfc2V0dHlwZShmLCBVUEJfVFlQRV9FTlVNKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7Ci0gIH0KLQotICBpZiAodHlwZSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX0ZJWEVENjQgfHwKLSAgICAgIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDMyIHx8Ci0gICAgICB0eXBlID09IFVQQl9ERVNDUklQVE9SX1RZUEVfU0ZJWEVENjQgfHwKLSAgICAgIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9TRklYRUQzMikgewotICAgIHVwYl9maWVsZGRlZl9zZXRpbnRmbXQoZiwgVVBCX0lOVEZNVF9GSVhFRCk7Ci0gIH0gZWxzZSBpZiAodHlwZSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX1NJTlQ2NCB8fAotICAgICAgICAgICAgIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzIpIHsKLSAgICB1cGJfZmllbGRkZWZfc2V0aW50Zm10KGYsIFVQQl9JTlRGTVRfWklHWkFHKTsKLSAgfSBlbHNlIHsKLSAgICB1cGJfZmllbGRkZWZfc2V0aW50Zm10KGYsIFVQQl9JTlRGTVRfVkFSSUFCTEUpOwotICB9Ci0KLSAgdXBiX2ZpZWxkZGVmX3NldHRhZ2RlbGltKGYsIHR5cGUgPT0gVVBCX0RFU0NSSVBUT1JfVFlQRV9HUk9VUCk7Ci19Ci0KLXVwYl9kZXNjcmlwdG9ydHlwZV90IHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShmKSkgewotICAgIGNhc2UgVVBCX1RZUEVfRkxPQVQ6ICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9GTE9BVDsKLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogcmV0dXJuIFVQQl9ERVNDUklQVE9SX1RZUEVfRE9VQkxFOwotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDogICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9CT09MOwotICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOiByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9TVFJJTkc7Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzogIHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX0JZVEVTOwotICAgIGNhc2UgVVBCX1RZUEVfRU5VTTogICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9FTlVNOwotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgICBzd2l0Y2ggKHVwYl9maWVsZGRlZl9pbnRmbXQoZikpIHsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX1ZBUklBQkxFOiByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9JTlQzMjsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX0ZJWEVEOiAgICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9TRklYRUQzMjsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX1pJR1pBRzogICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzI7Ci0gICAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2ludGZtdChmKSkgewotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfVkFSSUFCTEU6IHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX0lOVDY0OwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfRklYRUQ6ICAgIHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1NGSVhFRDY0OwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfWklHWkFHOiAgIHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1NJTlQ2NDsKLSAgICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjoKLSAgICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2ludGZtdChmKSkgewotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfVkFSSUFCTEU6IHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1VJTlQzMjsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX0ZJWEVEOiAgICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDMyOwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfWklHWkFHOiAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDoKLSAgICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2ludGZtdChmKSkgewotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfVkFSSUFCTEU6IHJldHVybiBVUEJfREVTQ1JJUFRPUl9UWVBFX1VJTlQ2NDsKLSAgICAgICAgY2FzZSBVUEJfSU5URk1UX0ZJWEVEOiAgICByZXR1cm4gVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDY0OwotICAgICAgICBjYXNlIFVQQl9JTlRGTVRfWklHWkFHOiAgIHJldHVybiAtMTsKLSAgICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6Ci0gICAgICByZXR1cm4gdXBiX2ZpZWxkZGVmX2lzdGFnZGVsaW0oZikgPwotICAgICAgICAgIFVQQl9ERVNDUklQVE9SX1RZUEVfR1JPVVAgOiBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0U7Ci0gIH0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGlzZXh0ZW5zaW9uKHVwYl9maWVsZGRlZiAqZiwgYm9vbCBpc19leHRlbnNpb24pIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBmLT5pc19leHRlbnNpb25fID0gaXNfZXh0ZW5zaW9uOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRsYXp5KHVwYl9maWVsZGRlZiAqZiwgYm9vbCBsYXp5KSB7Ci0gIGFzc2VydCghdXBiX2ZpZWxkZGVmX2lzZnJvemVuKGYpKTsKLSAgZi0+bGF6eV8gPSBsYXp5OwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRwYWNrZWQodXBiX2ZpZWxkZGVmICpmLCBib29sIHBhY2tlZCkgewotICBhc3NlcnQoIXVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSk7Ci0gIGYtPnBhY2tlZF8gPSBwYWNrZWQ7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGxhYmVsKHVwYl9maWVsZGRlZiAqZiwgdXBiX2xhYmVsX3QgbGFiZWwpIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX2NoZWNrbGFiZWwobGFiZWwpKTsKLSAgZi0+bGFiZWxfID0gbGFiZWw7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGludGZtdCh1cGJfZmllbGRkZWYgKmYsIHVwYl9pbnRmbXRfdCBmbXQpIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX2NoZWNraW50Zm10KGZtdCkpOwotICBmLT5pbnRmbXQgPSBmbXQ7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldHRhZ2RlbGltKHVwYl9maWVsZGRlZiAqZiwgYm9vbCB0YWdfZGVsaW0pIHsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBmLT50YWdkZWxpbSA9IHRhZ19kZWxpbTsKLSAgZi0+dGFnZGVsaW0gPSB0YWdfZGVsaW07Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrc2V0ZGVmYXVsdCh1cGJfZmllbGRkZWYgKmYsIHVwYl9maWVsZHR5cGVfdCB0eXBlKSB7Ci0gIGlmICghZi0+dHlwZV9pc19zZXRfIHx8IHVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSB8fAotICAgICAgdXBiX2ZpZWxkZGVmX3R5cGUoZikgIT0gdHlwZSkgewotICAgIGFzc2VydChmYWxzZSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChmLT5kZWZhdWx0X2lzX3N0cmluZykgewotICAgIHN0cl90ICpzID0gZi0+ZGVmYXVsdHZhbC5ieXRlczsKLSAgICBhc3NlcnQocyB8fCB0eXBlID09IFVQQl9UWVBFX0VOVU0pOwotICAgIGlmIChzKSBmcmVlc3RyKHMpOwotICB9Ci0gIGYtPmRlZmF1bHRfaXNfc3RyaW5nID0gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0aW50NjQodXBiX2ZpZWxkZGVmICpmLCBpbnQ2NF90IHZhbHVlKSB7Ci0gIGlmIChjaGVja3NldGRlZmF1bHQoZiwgVVBCX1RZUEVfSU5UNjQpKQotICAgIGYtPmRlZmF1bHR2YWwuc2ludCA9IHZhbHVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0aW50MzIodXBiX2ZpZWxkZGVmICpmLCBpbnQzMl90IHZhbHVlKSB7Ci0gIGlmICgodXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSAmJgotICAgICAgIGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9FTlVNKSkgfHwKLSAgICAgIGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9JTlQzMikpIHsKLSAgICBmLT5kZWZhdWx0dmFsLnNpbnQgPSB2YWx1ZTsKLSAgfQotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0dWludDY0KHVwYl9maWVsZGRlZiAqZiwgdWludDY0X3QgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9VSU5UNjQpKQotICAgIGYtPmRlZmF1bHR2YWwudWludCA9IHZhbHVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0dWludDMyKHVwYl9maWVsZGRlZiAqZiwgdWludDMyX3QgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9VSU5UMzIpKQotICAgIGYtPmRlZmF1bHR2YWwudWludCA9IHZhbHVlOwotfQotCi12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbCh1cGJfZmllbGRkZWYgKmYsIGJvb2wgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9CT09MKSkKLSAgICBmLT5kZWZhdWx0dmFsLnVpbnQgPSB2YWx1ZTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGZsb2F0KHVwYl9maWVsZGRlZiAqZiwgZmxvYXQgdmFsdWUpIHsKLSAgaWYgKGNoZWNrc2V0ZGVmYXVsdChmLCBVUEJfVFlQRV9GTE9BVCkpCi0gICAgZi0+ZGVmYXVsdHZhbC5mbHQgPSB2YWx1ZTsKLX0KLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGRvdWJsZSh1cGJfZmllbGRkZWYgKmYsIGRvdWJsZSB2YWx1ZSkgewotICBpZiAoY2hlY2tzZXRkZWZhdWx0KGYsIFVQQl9UWVBFX0RPVUJMRSkpCi0gICAgZi0+ZGVmYXVsdHZhbC5kYmwgPSB2YWx1ZTsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdHN0cih1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHZvaWQgKnN0ciwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBzdHJfdCAqc3RyMjsKLSAgYXNzZXJ0KHVwYl9maWVsZGRlZl9pc3N0cmluZyhmKSB8fCBmLT50eXBlXyA9PSBVUEJfVFlQRV9FTlVNKTsKLSAgaWYgKGYtPnR5cGVfID09IFVQQl9UWVBFX0VOVU0gJiYgIXVwYl9pc2lkZW50KHN0ciwgbGVuLCBmYWxzZSwgcykpCi0gICAgcmV0dXJuIGZhbHNlOwotCi0gIGlmIChmLT5kZWZhdWx0X2lzX3N0cmluZykgewotICAgIHN0cl90ICpzID0gZi0+ZGVmYXVsdHZhbC5ieXRlczsKLSAgICBhc3NlcnQocyB8fCBmLT50eXBlXyA9PSBVUEJfVFlQRV9FTlVNKTsKLSAgICBpZiAocykgZnJlZXN0cihzKTsKLSAgfSBlbHNlIHsKLSAgICBhc3NlcnQoZi0+dHlwZV8gPT0gVVBCX1RZUEVfRU5VTSk7Ci0gIH0KLQotICBzdHIyID0gbmV3c3RyKHN0ciwgbGVuKTsKLSAgZi0+ZGVmYXVsdHZhbC5ieXRlcyA9IHN0cjI7Ci0gIGYtPmRlZmF1bHRfaXNfc3RyaW5nID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRjc3RyKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoZi0+dHlwZV9pc19zZXRfKTsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRzdHIoZiwgc3RyLCBzdHIgPyBzdHJsZW4oc3RyKSA6IDAsIHMpOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9lbnVtaGFzZGVmYXVsdGludDMyKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBpbnQzMl90IHZhbDsKLSAgYXNzZXJ0KGYtPnR5cGVfaXNfc2V0XyAmJiBmLT50eXBlXyA9PSBVUEJfVFlQRV9FTlVNKTsKLSAgcmV0dXJuIGVudW1kZWZhdWx0aW50MzIoZiwgJnZhbCk7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2VudW1oYXNkZWZhdWx0c3RyKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBhc3NlcnQoZi0+dHlwZV9pc19zZXRfICYmIGYtPnR5cGVfID09IFVQQl9UWVBFX0VOVU0pOwotICByZXR1cm4gZW51bWRlZmF1bHRzdHIoZikgIT0gTlVMTDsKLX0KLQotc3RhdGljIGJvb2wgdXBiX3N1YmRlZl90eXBlY2hlY2sodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIGlmIChmLT50eXBlXyA9PSBVUEJfVFlQRV9NRVNTQUdFKSB7Ci0gICAgaWYgKHVwYl9keW5jYXN0X21zZ2RlZihzdWJkZWYpKSByZXR1cm4gdHJ1ZTsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiaW52YWxpZCBzdWJkZWYgdHlwZSBmb3IgdGhpcyBzdWJtZXNzYWdlIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKGYtPnR5cGVfID09IFVQQl9UWVBFX0VOVU0pIHsKLSAgICBpZiAodXBiX2R5bmNhc3RfZW51bWRlZihzdWJkZWYpKSByZXR1cm4gdHJ1ZTsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiaW52YWxpZCBzdWJkZWYgdHlwZSBmb3IgdGhpcyBlbnVtIGZpZWxkIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJvbmx5IG1lc3NhZ2UgYW5kIGVudW0gZmllbGRzIGNhbiBoYXZlIGEgc3ViZGVmIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2Vfc3ViZGVmKHVwYl9maWVsZGRlZiAqZikgewotICBpZiAoZi0+c3ViZGVmX2lzX3N5bWJvbGljKSB7Ci0gICAgdXBiX2dmcmVlKGYtPnN1Yi5uYW1lKTsKLSAgfSBlbHNlIGlmIChmLT5zdWIuZGVmKSB7Ci0gICAgdXBiX3VucmVmMihmLT5zdWIuZGVmLCBmKTsKLSAgfQotfQotCi1ib29sIHVwYl9maWVsZGRlZl9zZXRzdWJkZWYodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoIXVwYl9maWVsZGRlZl9pc2Zyb3plbihmKSk7Ci0gIGFzc2VydCh1cGJfZmllbGRkZWZfaGFzc3ViZGVmKGYpKTsKLSAgaWYgKHN1YmRlZiAmJiAhdXBiX3N1YmRlZl90eXBlY2hlY2soZiwgc3ViZGVmLCBzKSkgcmV0dXJuIGZhbHNlOwotICByZWxlYXNlX3N1YmRlZihmKTsKLSAgZi0+c3ViLmRlZiA9IHN1YmRlZjsKLSAgZi0+c3ViZGVmX2lzX3N5bWJvbGljID0gZmFsc2U7Ci0gIGlmIChmLT5zdWIuZGVmKSB1cGJfcmVmMihmLT5zdWIuZGVmLCBmKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX3NldG1zZ3N1YmRlZih1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHVwYl9tc2dkZWYgKnN1YmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0c3ViZGVmKGYsIHVwYl9tc2dkZWZfdXBjYXN0KHN1YmRlZiksIHMpOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9zZXRlbnVtc3ViZGVmKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgdXBiX2VudW1kZWYgKnN1YmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldHN1YmRlZihmLCB1cGJfZW51bWRlZl91cGNhc3Qoc3ViZGVmKSwgcyk7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX3NldHN1YmRlZm5hbWUodXBiX2ZpZWxkZGVmICpmLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIGNoYXIgKm5hbWVfY29weTsKLSAgYXNzZXJ0KCF1cGJfZmllbGRkZWZfaXNmcm96ZW4oZikpOwotICBpZiAoIXVwYl9maWVsZGRlZl9oYXNzdWJkZWYoZikpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGQgdHlwZSBkb2VzIG5vdCBhY2NlcHQgYSBzdWJkZWYiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBuYW1lX2NvcHkgPSB1cGJfZ3N0cmR1cChuYW1lKTsKLSAgaWYgKCFuYW1lX2NvcHkpIHsKLSAgICB1cGJfdXBiZXJyX3NldG9vbShzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBUT0RPOiB2YWxpZGF0ZSBuYW1lICh1cGJfaXNpZGVudCgpIGRvZXNuJ3QgcXVpdGUgd29yayBhdG0gYmVjYXVzZSB0aGlzIG5hbWUKLSAgICogbWF5IGhhdmUgYSBsZWFkaW5nICIuIikuICovCi0gIHJlbGVhc2Vfc3ViZGVmKGYpOwotICBmLT5zdWIubmFtZSA9IG5hbWVfY29weTsKLSAgZi0+c3ViZGVmX2lzX3N5bWJvbGljID0gdHJ1ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2lzc3VibXNnKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfTUVTU0FHRTsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfaXNzdHJpbmcoY29uc3QgdXBiX2ZpZWxkZGVmICpmKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfdHlwZShmKSA9PSBVUEJfVFlQRV9TVFJJTkcgfHwKLSAgICAgICAgIHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX0JZVEVTOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9pc3NlcShjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9sYWJlbChmKSA9PSBVUEJfTEFCRUxfUkVQRUFURUQ7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2lzcHJpbWl0aXZlKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gIXVwYl9maWVsZGRlZl9pc3N0cmluZyhmKSAmJiAhdXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpOwotfQotCi1ib29sIHVwYl9maWVsZGRlZl9pc21hcChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9pc3NlcShmKSAmJiB1cGJfZmllbGRkZWZfaXNzdWJtc2coZikgJiYKLSAgICAgICAgIHVwYl9tc2dkZWZfbWFwZW50cnkodXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihmKSk7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2hhc3ByZXNlbmNlKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSByZXR1cm4gZmFsc2U7Ci0gIGlmICh1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpIHJldHVybiB0cnVlOwotCi0gIC8qIFByaW1pdGl2ZSBmaWVsZDogcmV0dXJuIHRydWUgdW5sZXNzIHRoZXJlIGlzIGEgbWVzc2FnZSB0aGF0IHNwZWNpZmllcwotICAgKiBwcmVzZW5jZSBzaG91bGQgbm90IGV4aXN0LiAqLwotICBpZiAoZi0+bXNnX2lzX3N5bWJvbGljIHx8ICFmLT5tc2cuZGVmKSByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGYtPm1zZy5kZWYtPnN5bnRheCA9PSBVUEJfU1lOVEFYX1BST1RPMjsKLX0KLQotYm9vbCB1cGJfZmllbGRkZWZfaGFzc3ViZGVmKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpIHx8IHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX0VOVU07Ci19Ci0KLXN0YXRpYyBib29sIGJldHdlZW4oaW50MzJfdCB4LCBpbnQzMl90IGxvdywgaW50MzJfdCBoaWdoKSB7Ci0gIHJldHVybiB4ID49IGxvdyAmJiB4IDw9IGhpZ2g7Ci19Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNrbGFiZWwoaW50MzJfdCBsYWJlbCkgeyByZXR1cm4gYmV0d2VlbihsYWJlbCwgMSwgMyk7IH0KLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNrdHlwZShpbnQzMl90IHR5cGUpIHsgcmV0dXJuIGJldHdlZW4odHlwZSwgMSwgMTEpOyB9Ci1ib29sIHVwYl9maWVsZGRlZl9jaGVja2ludGZtdChpbnQzMl90IGZtdCkgeyByZXR1cm4gYmV0d2VlbihmbXQsIDEsIDMpOyB9Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNrZGVzY3JpcHRvcnR5cGUoaW50MzJfdCB0eXBlKSB7Ci0gIHJldHVybiBiZXR3ZWVuKHR5cGUsIDEsIDE4KTsKLX0KLQotLyogdXBiX21zZ2RlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdmlzaXRtc2coY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkX3Zpc2l0ICp2aXNpdCwKLSAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgdXBiX21zZ19vbmVvZl9pdGVyIG87Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm0gPSAoY29uc3QgdXBiX21zZ2RlZiopcjsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0gIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBtKTsKLSAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0gICAgdmlzaXQociwgdXBiX2ZpZWxkZGVmX3VwY2FzdDIoZiksIGNsb3N1cmUpOwotICB9Ci0gIGZvcih1cGJfbXNnX29uZW9mX2JlZ2luKCZvLCBtKTsKLSAgICAgICF1cGJfbXNnX29uZW9mX2RvbmUoJm8pOwotICAgICAgdXBiX21zZ19vbmVvZl9uZXh0KCZvKSkgewotICAgIHVwYl9vbmVvZmRlZiAqZiA9IHVwYl9tc2dfaXRlcl9vbmVvZigmbyk7Ci0gICAgdmlzaXQociwgdXBiX29uZW9mZGVmX3VwY2FzdChmKSwgY2xvc3VyZSk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZnJlZW1zZyh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfbXNnZGVmICptID0gKHVwYl9tc2dkZWYqKXI7Ci0gIHVwYl9zdHJ0YWJsZV91bmluaXQoJm0tPm50b2YpOwotICB1cGJfaW50dGFibGVfdW5pbml0KCZtLT5pdG9mKTsKLSAgdXBiX2RlZl91bmluaXQodXBiX21zZ2RlZl91cGNhc3RfbXV0YWJsZShtKSk7Ci0gIHVwYl9nZnJlZShtKTsKLX0KLQotY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdXBiX21zZ2RlZl92dGJsID0ge3Zpc2l0bXNnLCBmcmVlbXNnfTsKLQotdXBiX21zZ2RlZiAqdXBiX21zZ2RlZl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgdXBiX21zZ2RlZiAqbSA9IHVwYl9nbWFsbG9jKHNpemVvZigqbSkpOwotICBpZiAoIW0pIHJldHVybiBOVUxMOwotCi0gIGlmICghdXBiX2RlZl9pbml0KHVwYl9tc2dkZWZfdXBjYXN0X211dGFibGUobSksIFVQQl9ERUZfTVNHLCAmdXBiX21zZ2RlZl92dGJsLAotICAgICAgICAgICAgICAgICAgICBvd25lcikpIHsKLSAgICBnb3RvIGVycjI7Ci0gIH0KLQotICBpZiAoIXVwYl9pbnR0YWJsZV9pbml0KCZtLT5pdG9mLCBVUEJfQ1RZUEVfUFRSKSkgZ290byBlcnIyOwotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbml0KCZtLT5udG9mLCBVUEJfQ1RZUEVfUFRSKSkgZ290byBlcnIxOwotICBtLT5tYXBfZW50cnkgPSBmYWxzZTsKLSAgbS0+c3ludGF4ID0gVVBCX1NZTlRBWF9QUk9UTzI7Ci0gIHJldHVybiBtOwotCi1lcnIxOgotICB1cGJfaW50dGFibGVfdW5pbml0KCZtLT5pdG9mKTsKLWVycjI6Ci0gIHVwYl9nZnJlZShtKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXVwYl9tc2dkZWYgKnVwYl9tc2dkZWZfZHVwKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIGJvb2wgb2s7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICB1cGJfbXNnX29uZW9mX2l0ZXIgbzsKLQotICB1cGJfbXNnZGVmICpuZXdtID0gdXBiX21zZ2RlZl9uZXcob3duZXIpOwotICBpZiAoIW5ld20pIHJldHVybiBOVUxMOwotICBvayA9IHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3RfbXV0YWJsZShuZXdtKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9kZWZfZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3QobSkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gIG5ld20tPm1hcF9lbnRyeSA9IG0tPm1hcF9lbnRyeTsKLSAgbmV3bS0+c3ludGF4ID0gbS0+c3ludGF4OwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaSwgbSk7Ci0gICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaSkpIHsKLSAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfZmllbGRkZWZfZHVwKHVwYl9tc2dfaXRlcl9maWVsZCgmaSksICZmKTsKLSAgICAvKiBGaWVsZHMgaW4gb25lb2ZzIGFyZSBkdXAnZCBiZWxvdy4gKi8KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSkgY29udGludWU7Ci0gICAgaWYgKCFmIHx8ICF1cGJfbXNnZGVmX2FkZGZpZWxkKG5ld20sIGYsICZmLCBOVUxMKSkgewotICAgICAgdXBiX21zZ2RlZl91bnJlZihuZXdtLCBvd25lcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLSAgZm9yKHVwYl9tc2dfb25lb2ZfYmVnaW4oJm8sIG0pOwotICAgICAgIXVwYl9tc2dfb25lb2ZfZG9uZSgmbyk7Ci0gICAgICB1cGJfbXNnX29uZW9mX25leHQoJm8pKSB7Ci0gICAgdXBiX29uZW9mZGVmICpmID0gdXBiX29uZW9mZGVmX2R1cCh1cGJfbXNnX2l0ZXJfb25lb2YoJm8pLCAmZik7Ci0gICAgaWYgKCFmIHx8ICF1cGJfbXNnZGVmX2FkZG9uZW9mKG5ld20sIGYsICZmLCBOVUxMKSkgewotICAgICAgdXBiX21zZ2RlZl91bnJlZihuZXdtLCBvd25lcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5ld207Ci19Ci0KLWJvb2wgdXBiX21zZ2RlZl9mcmVlemUodXBiX21zZ2RlZiAqbSwgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIHVwYl9kZWYgKmQgPSB1cGJfbXNnZGVmX3VwY2FzdF9tdXRhYmxlKG0pOwotICByZXR1cm4gdXBiX2RlZl9mcmVlemUoJmQsIDEsIHN0YXR1cyk7Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9tc2dkZWZfZnVsbG5hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gdXBiX2RlZl9mdWxsbmFtZSh1cGJfbXNnZGVmX3VwY2FzdChtKSk7Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9tc2dkZWZfbmFtZShjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiB1cGJfZGVmX25hbWUodXBiX21zZ2RlZl91cGNhc3QobSkpOwotfQotCi1ib29sIHVwYl9tc2dkZWZfc2V0ZnVsbG5hbWUodXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqZnVsbG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfbXNnZGVmX3VwY2FzdF9tdXRhYmxlKG0pLCBmdWxsbmFtZSwgcyk7Ci19Ci0KLWJvb2wgdXBiX21zZ2RlZl9zZXRzeW50YXgodXBiX21zZ2RlZiAqbSwgdXBiX3N5bnRheF90IHN5bnRheCkgewotICBpZiAoc3ludGF4ICE9IFVQQl9TWU5UQVhfUFJPVE8yICYmIHN5bnRheCAhPSBVUEJfU1lOVEFYX1BST1RPMykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG0tPnN5bnRheCA9IHN5bnRheDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXVwYl9zeW50YXhfdCB1cGJfbXNnZGVmX3N5bnRheChjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBtLT5zeW50YXg7Ci19Ci0KLS8qIEhlbHBlcjogY2hlY2sgdGhhdCB0aGUgZmllbGQgfGZ8IGlzIHNhZmUgdG8gYWRkIHRvIG1zZ2RlZiB8bXwuIFNldCBhbiBlcnJvcgotICogb24gc3RhdHVzIHxzfCBhbmQgcmV0dXJuIGZhbHNlIGlmIG5vdC4gKi8KLXN0YXRpYyBib29sIGNoZWNrX2ZpZWxkX2FkZChjb25zdCB1cGJfbXNnZGVmICptLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpICE9IE5VTEwpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGRkZWYgYWxyZWFkeSBiZWxvbmdzIHRvIGEgbWVzc2FnZSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICh1cGJfZmllbGRkZWZfbmFtZShmKSA9PSBOVUxMIHx8IHVwYl9maWVsZGRlZl9udW1iZXIoZikgPT0gMCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZCBuYW1lIG9yIG51bWJlciB3ZXJlIG5vdCBzZXQiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodXBiX21zZ2RlZl9pdG9mKG0sIHVwYl9maWVsZGRlZl9udW1iZXIoZikpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgImR1cGxpY2F0ZSBmaWVsZCBudW1iZXIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodXBiX3N0cnRhYmxlX2xvb2t1cCgmbS0+bnRvZiwgdXBiX2ZpZWxkZGVmX25hbWUoZiksIE5VTEwpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgIm5hbWUgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgZmllbGQgb3Igb25lb2YiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF9maWVsZCh1cGJfbXNnZGVmICptLCB1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHZvaWQgKnJlZl9kb25vcikgewotICByZWxlYXNlX2NvbnRhaW5pbmd0eXBlKGYpOwotICBmLT5tc2cuZGVmID0gbTsKLSAgZi0+bXNnX2lzX3N5bWJvbGljID0gZmFsc2U7Ci0gIHVwYl9pbnR0YWJsZV9pbnNlcnQoJm0tPml0b2YsIHVwYl9maWVsZGRlZl9udW1iZXIoZiksIHVwYl92YWx1ZV9wdHIoZikpOwotICB1cGJfc3RydGFibGVfaW5zZXJ0KCZtLT5udG9mLCB1cGJfZmllbGRkZWZfbmFtZShmKSwgdXBiX3ZhbHVlX3B0cihmKSk7Ci0gIHVwYl9yZWYyKGYsIG0pOwotICB1cGJfcmVmMihtLCBmKTsKLSAgaWYgKHJlZl9kb25vcikgdXBiX2ZpZWxkZGVmX3VucmVmKGYsIHJlZl9kb25vcik7Ci19Ci0KLWJvb2wgdXBiX21zZ2RlZl9hZGRmaWVsZCh1cGJfbXNnZGVmICptLCB1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIC8qIFRPRE86IGV4dGVuc2lvbnMgbmVlZCB0byBoYXZlIGEgc2VwYXJhdGUgbmFtZXNwYWNlLCBiZWNhdXNlIHByb3RvMiBhbGxvd3MgYQotICAgKiB0b3AtbGV2ZWwgZXh0ZW5zaW9uIChpZS4gb25lIG5vdCBpbiBhbnkgcGFja2FnZSkgdG8gaGF2ZSB0aGUgc2FtZSBuYW1lIGFzIGEKLSAgICogZmllbGQgZnJvbSB0aGUgbWVzc2FnZS4KLSAgICoKLSAgICogVGhpcyBhbHNvIGltcGxpZXMgdGhhdCB0aGVyZSBuZWVkcyB0byBiZSBhIHNlcGFyYXRlIGxvb2t1cC1ieS1uYW1lIG1ldGhvZAotICAgKiBmb3IgZXh0ZW5zaW9ucy4gIEl0IHNlZW1zIGRlc2lyYWJsZSBmb3IgaXRlcmF0aW9uIHRvIHJldHVybiBib3RoIGV4dGVuc2lvbnMKLSAgICogYW5kIG5vbi1leHRlbnNpb25zIHRob3VnaC4KLSAgICoKLSAgICogV2UgYWxzbyBuZWVkIHRvIHZhbGlkYXRlIHRoYXQgdGhlIGZpZWxkIG51bWJlciBpcyBpbiBhbiBleHRlbnNpb24gcmFuZ2UgaWZmCi0gICAqIGl0IGlzIGFuIGV4dGVuc2lvbi4KLSAgICoKLSAgICogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gQ2hlY2sgaWYgfGZ8IGlzIGFscmVhZHkgcGFydCBvZiB0aGlzIG1zZ2RlZiBhbmQKLSAgICogcmV0dXJuIGltbWVkaWF0ZWx5IGlmIHNvLiAqLwotICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpID09IG0pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIENoZWNrIGNvbnN0cmFpbnRzIGZvciBhbGwgZmllbGRzIGJlZm9yZSBwZXJmb3JtaW5nIGFueSBhY3Rpb24uICovCi0gIGlmICghY2hlY2tfZmllbGRfYWRkKG0sIGYsIHMpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoZikgIT0gTlVMTCkgewotICAgIC8qIEZpZWxkcyBpbiBhIG9uZW9mIGNhbiBvbmx5IGJlIGFkZGVkIGJ5IGFkZGluZyB0aGUgb25lb2YgdG8gdGhlIG1zZ2RlZi4gKi8KLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGRkZWYgaXMgcGFydCBvZiBhIG9uZW9mIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogQ29uc3RyYWludCBjaGVja3Mgb2ssIHBlcmZvcm0gdGhlIGFjdGlvbi4gKi8KLSAgYWRkX2ZpZWxkKG0sIGYsIHJlZl9kb25vcik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9tc2dkZWZfYWRkb25lb2YodXBiX21zZ2RlZiAqbSwgdXBiX29uZW9mZGVmICpvLCBjb25zdCB2b2lkICpyZWZfZG9ub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICB1cGJfb25lb2ZfaXRlciBpdDsKLQotICAvKiBDaGVjayB2YXJpb3VzIGNvbmRpdGlvbnMgdGhhdCB3b3VsZCBwcmV2ZW50IHRoaXMgb25lb2YgZnJvbSBiZWluZyBhZGRlZC4gKi8KLSAgaWYgKHVwYl9vbmVvZmRlZl9jb250YWluaW5ndHlwZShvKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJvbmVvZmRlZiBhbHJlYWR5IGJlbG9uZ3MgdG8gYSBtZXNzYWdlIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHVwYl9vbmVvZmRlZl9uYW1lKG8pID09IE5VTEwpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAib25lb2ZkZWYgbmFtZSB3YXMgbm90IHNldCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmICh1cGJfc3RydGFibGVfbG9va3VwKCZtLT5udG9mLCB1cGJfb25lb2ZkZWZfbmFtZShvKSwgTlVMTCkpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAibmFtZSBjb25mbGljdHMgd2l0aCBleGlzdGluZyBmaWVsZCBvciBvbmVvZiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIENoZWNrIHRoYXQgYWxsIG9mIHRoZSBvbmVvZidzIGZpZWxkcyBkbyBub3QgY29uZmxpY3Qgd2l0aCBuYW1lcyBvciBudW1iZXJzCi0gICAqIG9mIGZpZWxkcyBhbHJlYWR5IGluIHRoZSBtZXNzYWdlLiAqLwotICBmb3IgKHVwYl9vbmVvZl9iZWdpbigmaXQsIG8pOyAhdXBiX29uZW9mX2RvbmUoJml0KTsgdXBiX29uZW9mX25leHQoJml0KSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9vbmVvZl9pdGVyX2ZpZWxkKCZpdCk7Ci0gICAgaWYgKCFjaGVja19maWVsZF9hZGQobSwgZiwgcykpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvKiBFdmVyeXRoaW5nIGNoZWNrcyBvdXQgLS0gY29tbWl0IG5vdy4gKi8KLQotICAvKiBBZGQgb25lb2YgaXRzZWxmIGZpcnN0LiAqLwotICBvLT5wYXJlbnQgPSBtOwotICB1cGJfc3RydGFibGVfaW5zZXJ0KCZtLT5udG9mLCB1cGJfb25lb2ZkZWZfbmFtZShvKSwgdXBiX3ZhbHVlX3B0cihvKSk7Ci0gIHVwYl9yZWYyKG8sIG0pOwotICB1cGJfcmVmMihtLCBvKTsKLQotICAvKiBBZGQgZWFjaCBmaWVsZCBvZiB0aGUgb25lb2YgZGlyZWN0bHkgdG8gdGhlIG1zZ2RlZi4gKi8KLSAgZm9yICh1cGJfb25lb2ZfYmVnaW4oJml0LCBvKTsgIXVwYl9vbmVvZl9kb25lKCZpdCk7IHVwYl9vbmVvZl9uZXh0KCZpdCkpIHsKLSAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfb25lb2ZfaXRlcl9maWVsZCgmaXQpOwotICAgIGFkZF9maWVsZChtLCBmLCBOVUxMKTsKLSAgfQotCi0gIGlmIChyZWZfZG9ub3IpIHVwYl9vbmVvZmRlZl91bnJlZihvLCByZWZfZG9ub3IpOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCB1cGJfZmllbGRkZWYgKnVwYl9tc2dkZWZfaXRvZihjb25zdCB1cGJfbXNnZGVmICptLCB1aW50MzJfdCBpKSB7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfbG9va3VwMzIoJm0tPml0b2YsIGksICZ2YWwpID8KLSAgICAgIHVwYl92YWx1ZV9nZXRwdHIodmFsKSA6IE5VTEw7Ci19Ci0KLWNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX21zZ2RlZl9udG9mKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSB7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0KLSAgaWYgKCF1cGJfc3RydGFibGVfbG9va3VwMigmbS0+bnRvZiwgbmFtZSwgbGVuLCAmdmFsKSkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgcmV0dXJuIHVwYl90cnlnZXRmaWVsZCh1cGJfdmFsdWVfZ2V0cHRyKHZhbCkpOwotfQotCi1jb25zdCB1cGJfb25lb2ZkZWYgKnVwYl9tc2dkZWZfbnRvbyhjb25zdCB1cGJfbXNnZGVmICptLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgewotICB1cGJfdmFsdWUgdmFsOwotCi0gIGlmICghdXBiX3N0cnRhYmxlX2xvb2t1cDIoJm0tPm50b2YsIG5hbWUsIGxlbiwgJnZhbCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiB1cGJfdHJ5Z2V0b25lb2YodXBiX3ZhbHVlX2dldHB0cih2YWwpKTsKLX0KLQotYm9vbCB1cGJfbXNnZGVmX2xvb2t1cG5hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqKmYsIGNvbnN0IHVwYl9vbmVvZmRlZiAqKm8pIHsKLSAgdXBiX3ZhbHVlIHZhbDsKLQotICBpZiAoIXVwYl9zdHJ0YWJsZV9sb29rdXAyKCZtLT5udG9mLCBuYW1lLCBsZW4sICZ2YWwpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgKm8gPSB1cGJfdHJ5Z2V0b25lb2YodXBiX3ZhbHVlX2dldHB0cih2YWwpKTsKLSAgKmYgPSB1cGJfdHJ5Z2V0ZmllbGQodXBiX3ZhbHVlX2dldHB0cih2YWwpKTsKLSAgYXNzZXJ0KCgqbyAhPSBOVUxMKSBeICgqZiAhPSBOVUxMKSk7ICAvKiBFeGFjdGx5IG9uZSBvZiB0aGUgdHdvIHNob3VsZCBiZSBzZXQuICovCi0gIHJldHVybiB0cnVlOwotfQotCi1pbnQgdXBiX21zZ2RlZl9udW1maWVsZHMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICAvKiBUaGUgbnVtYmVyIHRhYmxlIGNvbnRhaW5zIG9ubHkgZmllbGRzLiAqLwotICByZXR1cm4gdXBiX2ludHRhYmxlX2NvdW50KCZtLT5pdG9mKTsKLX0KLQotaW50IHVwYl9tc2dkZWZfbnVtb25lb2ZzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgLyogVGhlIG5hbWUgdGFibGUgaW5jbHVkZXMgb25lb2ZzLCBhbmQgdGhlIG51bWJlciB0YWJsZSBkb2VzIG5vdC4gKi8KLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9jb3VudCgmbS0+bnRvZikgLSB1cGJfaW50dGFibGVfY291bnQoJm0tPml0b2YpOwotfQotCi12b2lkIHVwYl9tc2dkZWZfc2V0bWFwZW50cnkodXBiX21zZ2RlZiAqbSwgYm9vbCBtYXBfZW50cnkpIHsKLSAgYXNzZXJ0KCF1cGJfbXNnZGVmX2lzZnJvemVuKG0pKTsKLSAgbS0+bWFwX2VudHJ5ID0gbWFwX2VudHJ5OwotfQotCi1ib29sIHVwYl9tc2dkZWZfbWFwZW50cnkoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gbS0+bWFwX2VudHJ5OwotfQotCi12b2lkIHVwYl9tc2dfZmllbGRfYmVnaW4odXBiX21zZ19maWVsZF9pdGVyICppdGVyLCBjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbihpdGVyLCAmbS0+aXRvZik7Ci19Ci0KLXZvaWQgdXBiX21zZ19maWVsZF9uZXh0KHVwYl9tc2dfZmllbGRfaXRlciAqaXRlcikgeyB1cGJfaW50dGFibGVfbmV4dChpdGVyKTsgfQotCi1ib29sIHVwYl9tc2dfZmllbGRfZG9uZShjb25zdCB1cGJfbXNnX2ZpZWxkX2l0ZXIgKml0ZXIpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9kb25lKGl0ZXIpOwotfQotCi11cGJfZmllbGRkZWYgKnVwYl9tc2dfaXRlcl9maWVsZChjb25zdCB1cGJfbXNnX2ZpZWxkX2l0ZXIgKml0ZXIpIHsKLSAgcmV0dXJuICh1cGJfZmllbGRkZWYqKXVwYl92YWx1ZV9nZXRwdHIodXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoaXRlcikpOwotfQotCi12b2lkIHVwYl9tc2dfZmllbGRfaXRlcl9zZXRkb25lKHVwYl9tc2dfZmllbGRfaXRlciAqaXRlcikgewotICB1cGJfaW50dGFibGVfaXRlcl9zZXRkb25lKGl0ZXIpOwotfQotCi12b2lkIHVwYl9tc2dfb25lb2ZfYmVnaW4odXBiX21zZ19vbmVvZl9pdGVyICppdGVyLCBjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHVwYl9zdHJ0YWJsZV9iZWdpbihpdGVyLCAmbS0+bnRvZik7Ci0gIC8qIFdlIG5lZWQgdG8gc2tpcCBwYXN0IGFueSBpbml0aWFsIGZpZWxkcy4gKi8KLSAgd2hpbGUgKCF1cGJfc3RydGFibGVfZG9uZShpdGVyKSAmJgotICAgICAgICAgIXVwYl9pc29uZW9mKHVwYl92YWx1ZV9nZXRwdHIodXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoaXRlcikpKSkgewotICAgIHVwYl9zdHJ0YWJsZV9uZXh0KGl0ZXIpOwotICB9Ci19Ci0KLXZvaWQgdXBiX21zZ19vbmVvZl9uZXh0KHVwYl9tc2dfb25lb2ZfaXRlciAqaXRlcikgewotICAvKiBXZSBuZWVkIHRvIHNraXAgcGFzdCBmaWVsZHMgdG8gcmV0dXJuIG9ubHkgb25lb2ZzLiAqLwotICBkbyB7Ci0gICAgdXBiX3N0cnRhYmxlX25leHQoaXRlcik7Ci0gIH0gd2hpbGUgKCF1cGJfc3RydGFibGVfZG9uZShpdGVyKSAmJgotICAgICAgICAgICAhdXBiX2lzb25lb2YodXBiX3ZhbHVlX2dldHB0cih1cGJfc3RydGFibGVfaXRlcl92YWx1ZShpdGVyKSkpKTsKLX0KLQotYm9vbCB1cGJfbXNnX29uZW9mX2RvbmUoY29uc3QgdXBiX21zZ19vbmVvZl9pdGVyICppdGVyKSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfZG9uZShpdGVyKTsKLX0KLQotdXBiX29uZW9mZGVmICp1cGJfbXNnX2l0ZXJfb25lb2YoY29uc3QgdXBiX21zZ19vbmVvZl9pdGVyICppdGVyKSB7Ci0gIHJldHVybiAodXBiX29uZW9mZGVmKil1cGJfdmFsdWVfZ2V0cHRyKHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKGl0ZXIpKTsKLX0KLQotdm9pZCB1cGJfbXNnX29uZW9mX2l0ZXJfc2V0ZG9uZSh1cGJfbXNnX29uZW9mX2l0ZXIgKml0ZXIpIHsKLSAgdXBiX3N0cnRhYmxlX2l0ZXJfc2V0ZG9uZShpdGVyKTsKLX0KLQotLyogdXBiX29uZW9mZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgdmlzaXRvbmVvZihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWRfdmlzaXQgKnZpc2l0LAotICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IHVwYl9vbmVvZmRlZiAqbyA9IChjb25zdCB1cGJfb25lb2ZkZWYqKXI7Ci0gIHVwYl9vbmVvZl9pdGVyIGk7Ci0gIGZvciAodXBiX29uZW9mX2JlZ2luKCZpLCBvKTsgIXVwYl9vbmVvZl9kb25lKCZpKTsgdXBiX29uZW9mX25leHQoJmkpKSB7Ci0gICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gdXBiX29uZW9mX2l0ZXJfZmllbGQoJmkpOwotICAgIHZpc2l0KHIsIHVwYl9maWVsZGRlZl91cGNhc3QyKGYpLCBjbG9zdXJlKTsKLSAgfQotICBpZiAoby0+cGFyZW50KSB7Ci0gICAgdmlzaXQociwgdXBiX21zZ2RlZl91cGNhc3QyKG8tPnBhcmVudCksIGNsb3N1cmUpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVvbmVvZih1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfb25lb2ZkZWYgKm8gPSAodXBiX29uZW9mZGVmKilyOwotICB1cGJfc3RydGFibGVfdW5pbml0KCZvLT5udG9mKTsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmby0+aXRvZik7Ci0gIHVwYl9nZnJlZSgodm9pZCopby0+bmFtZSk7Ci0gIHVwYl9nZnJlZShvKTsKLX0KLQotY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdXBiX29uZW9mZGVmX3Z0YmwgPSB7dmlzaXRvbmVvZiwgZnJlZW9uZW9mfTsKLQotdXBiX29uZW9mZGVmICp1cGJfb25lb2ZkZWZfbmV3KGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIHVwYl9vbmVvZmRlZiAqbyA9IHVwYl9nbWFsbG9jKHNpemVvZigqbykpOwotCi0gIGlmICghbykgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgby0+cGFyZW50ID0gTlVMTDsKLSAgby0+bmFtZSA9IE5VTEw7Ci0KLSAgaWYgKCF1cGJfcmVmY291bnRlZF9pbml0KHVwYl9vbmVvZmRlZl91cGNhc3RfbXV0YWJsZShvKSwgJnVwYl9vbmVvZmRlZl92dGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIpKSB7Ci0gICAgZ290byBlcnIyOwotICB9Ci0KLSAgaWYgKCF1cGJfaW50dGFibGVfaW5pdCgmby0+aXRvZiwgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMjsKLSAgaWYgKCF1cGJfc3RydGFibGVfaW5pdCgmby0+bnRvZiwgVVBCX0NUWVBFX1BUUikpIGdvdG8gZXJyMTsKLQotICByZXR1cm4gbzsKLQotZXJyMToKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmby0+aXRvZik7Ci1lcnIyOgotICB1cGJfZ2ZyZWUobyk7Ci0gIHJldHVybiBOVUxMOwotfQotCi11cGJfb25lb2ZkZWYgKnVwYl9vbmVvZmRlZl9kdXAoY29uc3QgdXBiX29uZW9mZGVmICpvLCBjb25zdCB2b2lkICpvd25lcikgewotICBib29sIG9rOwotICB1cGJfb25lb2ZfaXRlciBpOwotICB1cGJfb25lb2ZkZWYgKm5ld28gPSB1cGJfb25lb2ZkZWZfbmV3KG93bmVyKTsKLSAgaWYgKCFuZXdvKSByZXR1cm4gTlVMTDsKLSAgb2sgPSB1cGJfb25lb2ZkZWZfc2V0bmFtZShuZXdvLCB1cGJfb25lb2ZkZWZfbmFtZShvKSwgTlVMTCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gIGZvciAodXBiX29uZW9mX2JlZ2luKCZpLCBvKTsgIXVwYl9vbmVvZl9kb25lKCZpKTsgdXBiX29uZW9mX25leHQoJmkpKSB7Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX2ZpZWxkZGVmX2R1cCh1cGJfb25lb2ZfaXRlcl9maWVsZCgmaSksICZmKTsKLSAgICBpZiAoIWYgfHwgIXVwYl9vbmVvZmRlZl9hZGRmaWVsZChuZXdvLCBmLCAmZiwgTlVMTCkpIHsKLSAgICAgIHVwYl9vbmVvZmRlZl91bnJlZihuZXdvLCBvd25lcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5ld287Ci19Ci0KLWNvbnN0IGNoYXIgKnVwYl9vbmVvZmRlZl9uYW1lKGNvbnN0IHVwYl9vbmVvZmRlZiAqbykgeyByZXR1cm4gby0+bmFtZTsgfQotCi1ib29sIHVwYl9vbmVvZmRlZl9zZXRuYW1lKHVwYl9vbmVvZmRlZiAqbywgY29uc3QgY2hhciAqbmFtZSwgdXBiX3N0YXR1cyAqcykgewotICBhc3NlcnQoIXVwYl9vbmVvZmRlZl9pc2Zyb3plbihvKSk7Ci0gIGlmICh1cGJfb25lb2ZkZWZfY29udGFpbmluZ3R5cGUobykpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAib25lb2YgYWxyZWFkeSBhZGRlZCB0byBhIG1lc3NhZ2UiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIXVwYl9pc2lkZW50KG5hbWUsIHN0cmxlbihuYW1lKSwgdHJ1ZSwgcykpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBuYW1lID0gdXBiX2dzdHJkdXAobmFtZSk7Ci0gIGlmICghbmFtZSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJPbmUgb2YgbWVtb3J5Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdXBiX2dmcmVlKCh2b2lkKilvLT5uYW1lKTsKLSAgby0+bmFtZSA9IG5hbWU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCB1cGJfbXNnZGVmICp1cGJfb25lb2ZkZWZfY29udGFpbmluZ3R5cGUoY29uc3QgdXBiX29uZW9mZGVmICpvKSB7Ci0gIHJldHVybiBvLT5wYXJlbnQ7Ci19Ci0KLWludCB1cGJfb25lb2ZkZWZfbnVtZmllbGRzKGNvbnN0IHVwYl9vbmVvZmRlZiAqbykgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2NvdW50KCZvLT5udG9mKTsKLX0KLQotYm9vbCB1cGJfb25lb2ZkZWZfYWRkZmllbGQodXBiX29uZW9mZGVmICpvLCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpyZWZfZG9ub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIGFzc2VydCghdXBiX29uZW9mZGVmX2lzZnJvemVuKG8pKTsKLSAgYXNzZXJ0KCFvLT5wYXJlbnQgfHwgIXVwYl9tc2dkZWZfaXNmcm96ZW4oby0+cGFyZW50KSk7Ci0KLSAgLyogVGhpcyBtZXRob2QgaXMgaWRlbXBvdGVudC4gQ2hlY2sgaWYgfGZ8IGlzIGFscmVhZHkgcGFydCBvZiB0aGlzIG9uZW9mZGVmCi0gICAqIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgaWYgc28uICovCi0gIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ29uZW9mKGYpID09IG8pIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qIFRoZSBmaWVsZCBtdXN0IGhhdmUgYW4gT1BUSU9OQUwgbGFiZWwuICovCi0gIGlmICh1cGJfZmllbGRkZWZfbGFiZWwoZikgIT0gVVBCX0xBQkVMX09QVElPTkFMKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgImZpZWxkcyBpbiBvbmVvZiBtdXN0IGhhdmUgT1BUSU9OQUwgbGFiZWwiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvKiBDaGVjayB0aGF0IG5vIGZpZWxkIHdpdGggdGhpcyBuYW1lIG9yIG51bWJlciBleGlzdHMgYWxyZWFkeSBpbiB0aGUgb25lb2YuCi0gICAqIEFsc28gY2hlY2sgdGhhdCB0aGUgZmllbGQgaXMgbm90IGFscmVhZHkgcGFydCBvZiBhIG9uZW9mLiAqLwotICBpZiAodXBiX2ZpZWxkZGVmX25hbWUoZikgPT0gTlVMTCB8fCB1cGJfZmllbGRkZWZfbnVtYmVyKGYpID09IDApIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGQgbmFtZSBvciBudW1iZXIgd2VyZSBub3Qgc2V0Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgaWYgKHVwYl9vbmVvZmRlZl9pdG9mKG8sIHVwYl9maWVsZGRlZl9udW1iZXIoZikpIHx8Ci0gICAgICAgICAgICAgdXBiX29uZW9mZGVmX250b2Z6KG8sIHVwYl9maWVsZGRlZl9uYW1lKGYpKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJkdXBsaWNhdGUgZmllbGQgbmFtZSBvciBudW1iZXIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZihmKSAhPSBOVUxMKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2cocywgImZpZWxkZGVmIGFscmVhZHkgYmVsb25ncyB0byBhIG9uZW9mIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogV2UgYWxsb3cgYWRkaW5nIGEgZmllbGQgdG8gdGhlIG9uZW9mIGVpdGhlciBpZiB0aGUgZmllbGQgaXMgbm90IHBhcnQgb2YgYQotICAgKiBtc2dkZWYsIG9yIGlmIGl0IGlzIGFuZCB3ZSBhcmUgYWxzbyBwYXJ0IG9mIHRoZSBzYW1lIG1zZ2RlZi4gKi8KLSAgaWYgKG8tPnBhcmVudCA9PSBOVUxMKSB7Ci0gICAgLyogSWYgd2UncmUgbm90IGluIGEgbXNnZGVmLCB0aGUgZmllbGQgY2Fubm90IGJlIGVpdGhlci4gT3RoZXJ3aXNlIHdlIHdvdWxkCi0gICAgICogbmVlZCB0byBtYWdpY2FsbHkgYWRkIHRoaXMgb25lb2YgdG8gYSBtc2dkZWYgdG8gcmVtYWluIGNvbnNpc3RlbnQsIHdoaWNoCi0gICAgICogaXMgc3VycHJpc2luZyBiZWhhdmlvci4gKi8KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGYpICE9IE5VTEwpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJmaWVsZGRlZiBhbHJlYWR5IGJlbG9uZ3MgdG8gYSBtZXNzYWdlLCBidXQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9uZW9mIGRvZXMgbm90Iik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8qIElmIHdlJ3JlIGluIGEgbXNnZGVmLCB0aGUgdXNlciBjYW4gYWRkIGZpZWxkcyB0aGF0IGVpdGhlciBhcmVuJ3QgaW4gYW55Ci0gICAgICogbXNnZGVmIChpbiB3aGljaCBjYXNlIHRoZXkncmUgYWRkZWQgdG8gb3VyIG1zZ2RlZikgb3IgYWxyZWFkeSBhIHBhcnQgb2YKLSAgICAgKiBvdXIgbXNnZGVmLiAqLwotICAgIGlmICh1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikgIT0gTlVMTCAmJgotICAgICAgICB1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikgIT0gby0+cGFyZW50KSB7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiZmllbGRkZWYgYmVsb25ncyB0byBhIGRpZmZlcmVudCBtZXNzYWdlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aGFuIG9uZW9mIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLyogQ29tbWl0IHBoYXNlLiBGaXJzdCBhZGQgdGhlIGZpZWxkIHRvIG91ciBwYXJlbnQgbXNnZGVmLCBpZiBhbnksIGJlY2F1c2UKLSAgICogdGhhdCBtYXkgZmFpbDsgdGhlbiBhZGQgdGhlIGZpZWxkIHRvIG91ciBvd24gdGFibGVzLiAqLwotCi0gIGlmIChvLT5wYXJlbnQgIT0gTlVMTCAmJiB1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikgPT0gTlVMTCkgewotICAgIGlmICghdXBiX21zZ2RlZl9hZGRmaWVsZCgodXBiX21zZ2RlZiopby0+cGFyZW50LCBmLCBOVUxMLCBzKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJlbGVhc2VfY29udGFpbmluZ3R5cGUoZik7Ci0gIGYtPm9uZW9mID0gbzsKLSAgdXBiX2ludHRhYmxlX2luc2VydCgmby0+aXRvZiwgdXBiX2ZpZWxkZGVmX251bWJlcihmKSwgdXBiX3ZhbHVlX3B0cihmKSk7Ci0gIHVwYl9zdHJ0YWJsZV9pbnNlcnQoJm8tPm50b2YsIHVwYl9maWVsZGRlZl9uYW1lKGYpLCB1cGJfdmFsdWVfcHRyKGYpKTsKLSAgdXBiX3JlZjIoZiwgbyk7Ci0gIHVwYl9yZWYyKG8sIGYpOwotICBpZiAocmVmX2Rvbm9yKSB1cGJfZmllbGRkZWZfdW5yZWYoZiwgcmVmX2Rvbm9yKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJfb25lb2ZkZWZfbnRvZihjb25zdCB1cGJfb25lb2ZkZWYgKm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW5ndGgpIHsKLSAgdXBiX3ZhbHVlIHZhbDsKLSAgcmV0dXJuIHVwYl9zdHJ0YWJsZV9sb29rdXAyKCZvLT5udG9mLCBuYW1lLCBsZW5ndGgsICZ2YWwpID8KLSAgICAgIHVwYl92YWx1ZV9nZXRwdHIodmFsKSA6IE5VTEw7Ci19Ci0KLWNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX29uZW9mZGVmX2l0b2YoY29uc3QgdXBiX29uZW9mZGVmICpvLCB1aW50MzJfdCBudW0pIHsKLSAgdXBiX3ZhbHVlIHZhbDsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9sb29rdXAzMigmby0+aXRvZiwgbnVtLCAmdmFsKSA/Ci0gICAgICB1cGJfdmFsdWVfZ2V0cHRyKHZhbCkgOiBOVUxMOwotfQotCi12b2lkIHVwYl9vbmVvZl9iZWdpbih1cGJfb25lb2ZfaXRlciAqaXRlciwgY29uc3QgdXBiX29uZW9mZGVmICpvKSB7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbihpdGVyLCAmby0+aXRvZik7Ci19Ci0KLXZvaWQgdXBiX29uZW9mX25leHQodXBiX29uZW9mX2l0ZXIgKml0ZXIpIHsKLSAgdXBiX2ludHRhYmxlX25leHQoaXRlcik7Ci19Ci0KLWJvb2wgdXBiX29uZW9mX2RvbmUodXBiX29uZW9mX2l0ZXIgKml0ZXIpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9kb25lKGl0ZXIpOwotfQotCi11cGJfZmllbGRkZWYgKnVwYl9vbmVvZl9pdGVyX2ZpZWxkKGNvbnN0IHVwYl9vbmVvZl9pdGVyICppdGVyKSB7Ci0gIHJldHVybiAodXBiX2ZpZWxkZGVmKil1cGJfdmFsdWVfZ2V0cHRyKHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKGl0ZXIpKTsKLX0KLQotdm9pZCB1cGJfb25lb2ZfaXRlcl9zZXRkb25lKHVwYl9vbmVvZl9pdGVyICppdGVyKSB7Ci0gIHVwYl9pbnR0YWJsZV9pdGVyX3NldGRvbmUoaXRlcik7Ci19Ci0KLS8qIHVwYl9maWxlZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIHZpc2l0ZmlsZWRlZihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWRfdmlzaXQgKnZpc2l0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgdXBiX2ZpbGVkZWYgKmYgPSAoY29uc3QgdXBiX2ZpbGVkZWYqKXI7Ci0gIHNpemVfdCBpOwotCi0gIGZvcihpID0gMDsgaSA8IHVwYl9maWxlZGVmX2RlZmNvdW50KGYpOyBpKyspIHsKLSAgICB2aXNpdChyLCB1cGJfZGVmX3VwY2FzdCh1cGJfZmlsZWRlZl9kZWYoZiwgaSkpLCBjbG9zdXJlKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBmcmVlZmlsZWRlZih1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfZmlsZWRlZiAqZiA9ICh1cGJfZmlsZWRlZiopcjsKLSAgc2l6ZV90IGk7Ci0KLSAgZm9yKGkgPSAwOyBpIDwgdXBiX2ZpbGVkZWZfZGVwY291bnQoZik7IGkrKykgewotICAgIHVwYl9maWxlZGVmX3VucmVmKHVwYl9maWxlZGVmX2RlcChmLCBpKSwgZik7Ci0gIH0KLQotICB1cGJfaW50dGFibGVfdW5pbml0KCZmLT5kZWZzKTsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmZi0+ZGVwcyk7Ci0gIHVwYl9nZnJlZSgodm9pZCopZi0+bmFtZSk7Ci0gIHVwYl9nZnJlZSgodm9pZCopZi0+cGFja2FnZSk7Ci0gIHVwYl9nZnJlZShmKTsKLX0KLQotY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdXBiX2ZpbGVkZWZfdnRibCA9IHt2aXNpdGZpbGVkZWYsIGZyZWVmaWxlZGVmfTsKLQotdXBiX2ZpbGVkZWYgKnVwYl9maWxlZGVmX25ldyhjb25zdCB2b2lkICpvd25lcikgewotICB1cGJfZmlsZWRlZiAqZiA9IHVwYl9nbWFsbG9jKHNpemVvZigqZikpOwotCi0gIGlmICghZikgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZi0+cGFja2FnZSA9IE5VTEw7Ci0gIGYtPm5hbWUgPSBOVUxMOwotICBmLT5zeW50YXggPSBVUEJfU1lOVEFYX1BST1RPMjsKLQotICBpZiAoIXVwYl9yZWZjb3VudGVkX2luaXQodXBiX2ZpbGVkZWZfdXBjYXN0X211dGFibGUoZiksICZ1cGJfZmlsZWRlZl92dGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3duZXIpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBpZiAoIXVwYl9pbnR0YWJsZV9pbml0KCZmLT5kZWZzLCBVUEJfQ1RZUEVfQ09OU1RQVFIpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICBpZiAoIXVwYl9pbnR0YWJsZV9pbml0KCZmLT5kZXBzLCBVUEJfQ1RZUEVfQ09OU1RQVFIpKSB7Ci0gICAgZ290byBlcnIyOwotICB9Ci0KLSAgcmV0dXJuIGY7Ci0KLQotZXJyMjoKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmZi0+ZGVmcyk7Ci0KLWVycjoKLSAgdXBiX2dmcmVlKGYpOwotICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgY2hhciAqdXBiX2ZpbGVkZWZfbmFtZShjb25zdCB1cGJfZmlsZWRlZiAqZikgewotICByZXR1cm4gZi0+bmFtZTsKLX0KLQotY29uc3QgY2hhciAqdXBiX2ZpbGVkZWZfcGFja2FnZShjb25zdCB1cGJfZmlsZWRlZiAqZikgewotICByZXR1cm4gZi0+cGFja2FnZTsKLX0KLQotdXBiX3N5bnRheF90IHVwYl9maWxlZGVmX3N5bnRheChjb25zdCB1cGJfZmlsZWRlZiAqZikgewotICByZXR1cm4gZi0+c3ludGF4OwotfQotCi1zaXplX3QgdXBiX2ZpbGVkZWZfZGVmY291bnQoY29uc3QgdXBiX2ZpbGVkZWYgKmYpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9jb3VudCgmZi0+ZGVmcyk7Ci19Ci0KLXNpemVfdCB1cGJfZmlsZWRlZl9kZXBjb3VudChjb25zdCB1cGJfZmlsZWRlZiAqZikgewotICByZXR1cm4gdXBiX2ludHRhYmxlX2NvdW50KCZmLT5kZXBzKTsKLX0KLQotY29uc3QgdXBiX2RlZiAqdXBiX2ZpbGVkZWZfZGVmKGNvbnN0IHVwYl9maWxlZGVmICpmLCBzaXplX3QgaSkgewotICB1cGJfdmFsdWUgdjsKLQotICBpZiAodXBiX2ludHRhYmxlX2xvb2t1cDMyKCZmLT5kZWZzLCBpLCAmdikpIHsKLSAgICByZXR1cm4gdXBiX3ZhbHVlX2dldGNvbnN0cHRyKHYpOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLWNvbnN0IHVwYl9maWxlZGVmICp1cGJfZmlsZWRlZl9kZXAoY29uc3QgdXBiX2ZpbGVkZWYgKmYsIHNpemVfdCBpKSB7Ci0gIHVwYl92YWx1ZSB2OwotCi0gIGlmICh1cGJfaW50dGFibGVfbG9va3VwMzIoJmYtPmRlcHMsIGksICZ2KSkgewotICAgIHJldHVybiB1cGJfdmFsdWVfZ2V0Y29uc3RwdHIodik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotYm9vbCB1cGJfZmlsZWRlZl9zZXRuYW1lKHVwYl9maWxlZGVmICpmLCBjb25zdCBjaGFyICpuYW1lLCB1cGJfc3RhdHVzICpzKSB7Ci0gIG5hbWUgPSB1cGJfZ3N0cmR1cChuYW1lKTsKLSAgaWYgKCFuYW1lKSB7Ci0gICAgdXBiX3VwYmVycl9zZXRvb20ocyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVwYl9nZnJlZSgodm9pZCopZi0+bmFtZSk7Ci0gIGYtPm5hbWUgPSBuYW1lOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfZmlsZWRlZl9zZXRwYWNrYWdlKHVwYl9maWxlZGVmICpmLCBjb25zdCBjaGFyICpwYWNrYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnMpIHsKLSAgaWYgKCF1cGJfaXNpZGVudChwYWNrYWdlLCBzdHJsZW4ocGFja2FnZSksIHRydWUsIHMpKSByZXR1cm4gZmFsc2U7Ci0gIHBhY2thZ2UgPSB1cGJfZ3N0cmR1cChwYWNrYWdlKTsKLSAgaWYgKCFwYWNrYWdlKSB7Ci0gICAgdXBiX3VwYmVycl9zZXRvb20ocyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHVwYl9nZnJlZSgodm9pZCopZi0+cGFja2FnZSk7Ci0gIGYtPnBhY2thZ2UgPSBwYWNrYWdlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfZmlsZWRlZl9zZXRzeW50YXgodXBiX2ZpbGVkZWYgKmYsIHVwYl9zeW50YXhfdCBzeW50YXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIFVQQl9VTlVTRUQocyk7Ci0gIGlmIChzeW50YXggIT0gVVBCX1NZTlRBWF9QUk9UTzIgJiYKLSAgICAgIHN5bnRheCAhPSBVUEJfU1lOVEFYX1BST1RPMykgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHMsICJVbmtub3duIHN5bnRheCB2YWx1ZS4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZi0+c3ludGF4ID0gc3ludGF4OwotCi0gIHsKLSAgICAvKiBTZXQgYWxsIG1lc3NhZ2VzIGluIHRoaXMgZmlsZSB0byBtYXRjaC4gKi8KLSAgICBzaXplX3QgaTsKLSAgICBmb3IgKGkgPSAwOyBpIDwgdXBiX2ZpbGVkZWZfZGVmY291bnQoZik7IGkrKykgewotICAgICAgLyogQ2FzdGluZyBjb25zdCBhd2F5IGlzIHNhZmUgc2luY2UgYWxsIGRlZnMgaW4gbXV0YWJsZSBmaWxlZGVmIG11c3QKLSAgICAgICAqIGFsc28gYmUgbXV0YWJsZS4gKi8KLSAgICAgIHVwYl9kZWYgKmRlZiA9ICh1cGJfZGVmKil1cGJfZmlsZWRlZl9kZWYoZiwgaSk7Ci0KLSAgICAgIHVwYl9tc2dkZWYgKm0gPSB1cGJfZHluY2FzdF9tc2dkZWZfbXV0YWJsZShkZWYpOwotICAgICAgaWYgKG0pIHsKLSAgICAgICAgbS0+c3ludGF4ID0gc3ludGF4OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9maWxlZGVmX2FkZGRlZih1cGJfZmlsZWRlZiAqZiwgdXBiX2RlZiAqZGVmLCBjb25zdCB2b2lkICpyZWZfZG9ub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKSB7Ci0gIGlmIChkZWYtPmZpbGUpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAiRGVmIGlzIGFscmVhZHkgcGFydCBvZiBhbm90aGVyIGZpbGVkZWYuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKHVwYl9pbnR0YWJsZV9wdXNoKCZmLT5kZWZzLCB1cGJfdmFsdWVfY29uc3RwdHIoZGVmKSkpIHsKLSAgICBkZWYtPmZpbGUgPSBmOwotICAgIHVwYl9yZWYyKGRlZiwgZik7Ci0gICAgaWYgKHJlZl9kb25vcikgdXBiX2RlZl91bnJlZihkZWYsIHJlZl9kb25vcik7Ci0gICAgaWYgKGRlZi0+dHlwZSA9PSBVUEJfREVGX01TRykgewotICAgICAgdXBiX2Rvd25jYXN0X21zZ2RlZl9tdXRhYmxlKGRlZiktPnN5bnRheCA9IGYtPnN5bnRheDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgdXBiX3VwYmVycl9zZXRvb20ocyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgdXBiX2ZpbGVkZWZfYWRkZGVwKHVwYl9maWxlZGVmICpmLCBjb25zdCB1cGJfZmlsZWRlZiAqZGVwKSB7Ci0gIGlmICh1cGJfaW50dGFibGVfcHVzaCgmZi0+ZGVwcywgdXBiX3ZhbHVlX2NvbnN0cHRyKGRlcCkpKSB7Ci0gICAgLyogUmVndWxhciByZWYgaW5zdGVhZCBvZiByZWYyIGJlY2F1c2UgZmlsZXMgY2FuJ3QgZm9ybSBjeWNsZXMuICovCi0gICAgdXBiX2ZpbGVkZWZfcmVmKGRlcCwgZik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0vKgotKiogVE9ETyhoYWJlcm1hbik6IGl0J3MgdW5jbGVhciB3aGV0aGVyIGEgbG90IG9mIHRoZSBjb25zaXN0ZW5jeSBjaGVja3Mgc2hvdWxkCi0qKiBhc3NlcnQoKSBvciByZXR1cm4gZmFsc2UuCi0qLwotCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi1zdGF0aWMgdm9pZCAqdXBiX2NhbGxvYyhzaXplX3Qgc2l6ZSkgewotICB2b2lkICptZW0gPSB1cGJfZ21hbGxvYyhzaXplKTsKLSAgaWYgKG1lbSkgewotICAgIG1lbXNldChtZW0sIDAsIHNpemUpOwotICB9Ci0gIHJldHVybiBtZW07Ci19Ci0KLS8qIERlZmluZWQgZm9yIHRoZSBzb2xlIHB1cnBvc2Ugb2YgaGF2aW5nIGEgdW5pcXVlIHBvaW50ZXIgdmFsdWUgZm9yCi0gKiBVUEJfTk9fQ0xPU1VSRS4gKi8KLWNoYXIgX3VwYl9ub2Nsb3N1cmU7Ci0KLXN0YXRpYyB2b2lkIGZyZWVoYW5kbGVycyh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfaGFuZGxlcnMgKmggPSAodXBiX2hhbmRsZXJzKilyOwotCi0gIHVwYl9pbnR0YWJsZV9pdGVyIGk7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgJmgtPmNsZWFudXBfKTsKLSAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpKTsgdXBiX2ludHRhYmxlX25leHQoJmkpKSB7Ci0gICAgdm9pZCAqdmFsID0gKHZvaWQqKXVwYl9pbnR0YWJsZV9pdGVyX2tleSgmaSk7Ci0gICAgdXBiX3ZhbHVlIGZ1bmNfdmFsID0gdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpOwotICAgIHVwYl9oYW5kbGVyZnJlZSAqZnVuYyA9IHVwYl92YWx1ZV9nZXRmcHRyKGZ1bmNfdmFsKTsKLSAgICBmdW5jKHZhbCk7Ci0gIH0KLQotICB1cGJfaW50dGFibGVfdW5pbml0KCZoLT5jbGVhbnVwXyk7Ci0gIHVwYl9tc2dkZWZfdW5yZWYoaC0+bXNnLCBoKTsKLSAgdXBiX2dmcmVlKGgtPnN1Yik7Ci0gIHVwYl9nZnJlZShoKTsKLX0KLQotc3RhdGljIHZvaWQgdmlzaXRoYW5kbGVycyhjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWRfdmlzaXQgKnZpc2l0LAotICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaCA9IChjb25zdCB1cGJfaGFuZGxlcnMqKXI7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaSwgaC0+bXNnKTsKLSAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0gICAgY29uc3QgdXBiX2hhbmRsZXJzICpzdWI7Ci0gICAgaWYgKCF1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpIGNvbnRpbnVlOwotICAgIHN1YiA9IHVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVycyhoLCBmKTsKLSAgICBpZiAoc3ViKSB2aXNpdChyLCB1cGJfaGFuZGxlcnNfdXBjYXN0KHN1YiksIGNsb3N1cmUpOwotICB9Ci19Ci0KLXN0YXRpYyBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB2dGJsID0ge3Zpc2l0aGFuZGxlcnMsIGZyZWVoYW5kbGVyc307Ci0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdXBiX2ludHRhYmxlIHRhYjsgIC8qIG1hcHMgdXBiX21zZ2RlZiogLT4gdXBiX2hhbmRsZXJzKi4gKi8KLSAgdXBiX2hhbmRsZXJzX2NhbGxiYWNrICpjYWxsYmFjazsKLSAgY29uc3Qgdm9pZCAqY2xvc3VyZTsKLX0gZGZzX3N0YXRlOwotCi0vKiBUT0RPKGhhYmVybWFuKTogZGlzY2FyZCB1cGJfaGFuZGxlcnMqIG9iamVjdHMgdGhhdCBkbyBub3QgYWN0dWFsbHkgaGF2ZSBhbnkKLSAqIGhhbmRsZXJzIHNldCBhbmQgY2Fubm90IHJlYWNoIGFueSB1cGJfaGFuZGxlcnMqIG9iamVjdCB0aGF0IGRvZXMuICBUaGlzIGlzCi0gKiBzbGlnaHRseSB0cmlja3kgdG8gZG8gY29ycmVjdGx5LiAqLwotc3RhdGljIHVwYl9oYW5kbGVycyAqbmV3Zm9ybXNnKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IHZvaWQgKm93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRmc19zdGF0ZSAqcykgewotICB1cGJfbXNnX2ZpZWxkX2l0ZXIgaTsKLSAgdXBiX2hhbmRsZXJzICpoID0gdXBiX2hhbmRsZXJzX25ldyhtLCBvd25lcik7Ci0gIGlmICghaCkgcmV0dXJuIE5VTEw7Ci0gIGlmICghdXBiX2ludHRhYmxlX2luc2VydHB0cigmcy0+dGFiLCBtLCB1cGJfdmFsdWVfcHRyKGgpKSkgZ290byBvb207Ci0KLSAgcy0+Y2FsbGJhY2socy0+Y2xvc3VyZSwgaCk7Ci0KLSAgLyogRm9yIGVhY2ggc3VibWVzc2FnZSBmaWVsZCwgZ2V0IG9yIGNyZWF0ZSBhIGhhbmRsZXJzIG9iamVjdCBhbmQgc2V0IGl0IGFzCi0gICAqIHRoZSBzdWJoYW5kbGVycy4gKi8KLSAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmksIG0pOwotICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaSk7Ci0gICAgICB1cGJfbXNnX2ZpZWxkX25leHQoJmkpKSB7Ci0gICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpKTsKLSAgICBjb25zdCB1cGJfbXNnZGVmICpzdWJkZWY7Ci0gICAgdXBiX3ZhbHVlIHN1Ym1fZW50OwotCi0gICAgaWYgKCF1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpIGNvbnRpbnVlOwotCi0gICAgc3ViZGVmID0gdXBiX2Rvd25jYXN0X21zZ2RlZih1cGJfZmllbGRkZWZfc3ViZGVmKGYpKTsKLSAgICBpZiAodXBiX2ludHRhYmxlX2xvb2t1cHB0cigmcy0+dGFiLCBzdWJkZWYsICZzdWJtX2VudCkpIHsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdWJoYW5kbGVycyhoLCBmLCB1cGJfdmFsdWVfZ2V0cHRyKHN1Ym1fZW50KSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVwYl9oYW5kbGVycyAqc3ViX21oID0gbmV3Zm9ybXNnKHN1YmRlZiwgJnN1Yl9taCwgcyk7Ci0gICAgICBpZiAoIXN1Yl9taCkgZ290byBvb207Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3ViaGFuZGxlcnMoaCwgZiwgc3ViX21oKTsKLSAgICAgIHVwYl9oYW5kbGVyc191bnJlZihzdWJfbWgsICZzdWJfbWgpOwotICAgIH0KLSAgfQotICByZXR1cm4gaDsKLQotb29tOgotICB1cGJfaGFuZGxlcnNfdW5yZWYoaCwgb3duZXIpOwotICByZXR1cm4gTlVMTDsKLX0KLQotLyogR2l2ZW4gYSBzZWxlY3RvciBmb3IgYSBTVEFSVFNVQk1TRyBoYW5kbGVyLCByZXNvbHZlcyB0byBhIHBvaW50ZXIgdG8gdGhlCi0gKiBzdWJoYW5kbGVycyBmb3IgdGhpcyBzdWJtZXNzYWdlIGZpZWxkLiAqLwotI2RlZmluZSBTVUJIKGgsIHNlbGVjdG9yKSAoaC0+c3ViW3NlbGVjdG9yXSkKLQotLyogVGhlIHNlbGVjdG9yIGZvciBhIHN1Ym1lc3NhZ2UgZmllbGQgaXMgdGhlIGZpZWxkIGluZGV4LiAqLwotI2RlZmluZSBTVUJIX0YoaCwgZikgU1VCSChoLCBmLT5pbmRleF8pCi0KLXN0YXRpYyBpbnQzMl90IHRyeWdldHNlbCh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnR5cGVfdCB0eXBlKSB7Ci0gIHVwYl9zZWxlY3Rvcl90IHNlbDsKLSAgYXNzZXJ0KCF1cGJfaGFuZGxlcnNfaXNmcm96ZW4oaCkpOwotICBpZiAodXBiX2hhbmRsZXJzX21zZ2RlZihoKSAhPSB1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUoZikpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYoCi0gICAgICAgICZoLT5zdGF0dXNfLCAidHlwZSBtaXNtYXRjaDogZmllbGQgJXMgZG9lcyBub3QgYmVsb25nIHRvIG1lc3NhZ2UgJXMiLAotICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShmKSwgdXBiX21zZ2RlZl9mdWxsbmFtZSh1cGJfaGFuZGxlcnNfbXNnZGVmKGgpKSk7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIGlmICghdXBiX2hhbmRsZXJzX2dldHNlbGVjdG9yKGYsIHR5cGUsICZzZWwpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKAotICAgICAgICAmaC0+c3RhdHVzXywKLSAgICAgICAgInR5cGUgbWlzbWF0Y2g6IGNhbm5vdCByZWdpc3RlciBoYW5kbGVyIHR5cGUgJWQgZm9yIGZpZWxkICVzIiwKLSAgICAgICAgdHlwZSwgdXBiX2ZpZWxkZGVmX25hbWUoZikpOwotICAgIHJldHVybiAtMTsKLSAgfQotICByZXR1cm4gc2VsOwotfQotCi1zdGF0aWMgdXBiX3NlbGVjdG9yX3QgaGFuZGxlcnNfZ2V0c2VsKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnR5cGVfdCB0eXBlKSB7Ci0gIGludDMyX3Qgc2VsID0gdHJ5Z2V0c2VsKGgsIGYsIHR5cGUpOwotICBhc3NlcnQoc2VsID49IDApOwotICByZXR1cm4gc2VsOwotfQotCi1zdGF0aWMgY29uc3Qgdm9pZCAqKnJldHVybnR5cGUodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJ0eXBlX3QgdHlwZSkgewotICByZXR1cm4gJmgtPnRhYmxlW2hhbmRsZXJzX2dldHNlbChoLCBmLCB0eXBlKV0uYXR0ci5yZXR1cm5fY2xvc3VyZV90eXBlXzsKLX0KLQotc3RhdGljIGJvb2wgZG9zZXQodXBiX2hhbmRsZXJzICpoLCBpbnQzMl90IHNlbCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJ0eXBlX3QgdHlwZSwgdXBiX2Z1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgdXBiX2hhbmRsZXJhdHRyIHNldF9hdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICBjb25zdCB2b2lkICpjbG9zdXJlX3R5cGU7Ci0gIGNvbnN0IHZvaWQgKipjb250ZXh0X2Nsb3N1cmVfdHlwZTsKLQotICBhc3NlcnQoIXVwYl9oYW5kbGVyc19pc2Zyb3plbihoKSk7Ci0KLSAgaWYgKHNlbCA8IDApIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZygmaC0+c3RhdHVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAiaW5jb3JyZWN0IGhhbmRsZXIgdHlwZSBmb3IgdGhpcyBmaWVsZC4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoaC0+dGFibGVbc2VsXS5mdW5jKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2coJmgtPnN0YXR1c18sCi0gICAgICAgICAgICAgICAgICAgICAgICAgImNhbm5vdCBjaGFuZ2UgaGFuZGxlciBvbmNlIGl0IGhhcyBiZWVuIHNldC4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYXR0cikgewotICAgIHNldF9hdHRyID0gKmF0dHI7Ci0gIH0KLQotICAvKiBDaGVjayB0aGF0IHRoZSBnaXZlbiBjbG9zdXJlIHR5cGUgbWF0Y2hlcyB0aGUgY2xvc3VyZSB0eXBlIHRoYXQgaGFzIGJlZW4KLSAgICogZXN0YWJsaXNoZWQgZm9yIHRoaXMgY29udGV4dCAoaWYgYW55KS4gKi8KLSAgY2xvc3VyZV90eXBlID0gdXBiX2hhbmRsZXJhdHRyX2Nsb3N1cmV0eXBlKCZzZXRfYXR0cik7Ci0KLSAgaWYgKHR5cGUgPT0gVVBCX0hBTkRMRVJfU1RSSU5HKSB7Ci0gICAgY29udGV4dF9jbG9zdXJlX3R5cGUgPSByZXR1cm50eXBlKGgsIGYsIFVQQl9IQU5ETEVSX1NUQVJUU1RSKTsKLSAgfSBlbHNlIGlmIChmICYmIHVwYl9maWVsZGRlZl9pc3NlcShmKSAmJgotICAgICAgICAgICAgIHR5cGUgIT0gVVBCX0hBTkRMRVJfU1RBUlRTRVEgJiYKLSAgICAgICAgICAgICB0eXBlICE9IFVQQl9IQU5ETEVSX0VORFNFUSkgewotICAgIGNvbnRleHRfY2xvc3VyZV90eXBlID0gcmV0dXJudHlwZShoLCBmLCBVUEJfSEFORExFUl9TVEFSVFNFUSk7Ci0gIH0gZWxzZSB7Ci0gICAgY29udGV4dF9jbG9zdXJlX3R5cGUgPSAmaC0+dG9wX2Nsb3N1cmVfdHlwZTsKLSAgfQotCi0gIGlmIChjbG9zdXJlX3R5cGUgJiYgKmNvbnRleHRfY2xvc3VyZV90eXBlICYmCi0gICAgICBjbG9zdXJlX3R5cGUgIT0gKmNvbnRleHRfY2xvc3VyZV90eXBlKSB7Ci0gICAgLyogVE9ETyhoYWJlcm1hbik6IGJldHRlciBtZXNzYWdlIGZvciBkZWJ1Z2dpbmcuICovCi0gICAgaWYgKGYpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmaC0+c3RhdHVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY2xvc3VyZSB0eXBlIGRvZXMgbm90IG1hdGNoIGZvciBmaWVsZCAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ZpZWxkZGVmX25hbWUoZikpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZygKLSAgICAgICAgICAmaC0+c3RhdHVzXywgImNsb3N1cmUgdHlwZSBkb2VzIG5vdCBtYXRjaCBmb3IgbWVzc2FnZS1sZXZlbCBoYW5kbGVyIik7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChjbG9zdXJlX3R5cGUpCi0gICAgKmNvbnRleHRfY2xvc3VyZV90eXBlID0gY2xvc3VyZV90eXBlOwotCi0gIC8qIElmIHRoaXMgaXMgYSBTVEFSVFNFUSBvciBTVEFSVFNUUiBoYW5kbGVyLCBjaGVjayB0aGF0IHRoZSByZXR1cm5lZCBwb2ludGVyCi0gICAqIG1hdGNoZXMgYW55IHByZS1leGlzdGluZyBleHBlY3RhdGlvbnMgYWJvdXQgd2hhdCB0eXBlIGlzIGV4cGVjdGVkLiAqLwotICBpZiAodHlwZSA9PSBVUEJfSEFORExFUl9TVEFSVFNFUSB8fCB0eXBlID09IFVQQl9IQU5ETEVSX1NUQVJUU1RSKSB7Ci0gICAgY29uc3Qgdm9pZCAqcmV0dXJuX3R5cGUgPSB1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUoJnNldF9hdHRyKTsKLSAgICBjb25zdCB2b2lkICp0YWJsZV9yZXR1cm5fdHlwZSA9Ci0gICAgICAgIHVwYl9oYW5kbGVyYXR0cl9yZXR1cm5jbG9zdXJldHlwZSgmaC0+dGFibGVbc2VsXS5hdHRyKTsKLSAgICBpZiAocmV0dXJuX3R5cGUgJiYgdGFibGVfcmV0dXJuX3R5cGUgJiYgcmV0dXJuX3R5cGUgIT0gdGFibGVfcmV0dXJuX3R5cGUpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZoLT5zdGF0dXNfLCAiY2xvc3VyZSByZXR1cm4gdHlwZSBkb2VzIG5vdCBtYXRjaCIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICh0YWJsZV9yZXR1cm5fdHlwZSAmJiAhcmV0dXJuX3R5cGUpCi0gICAgICB1cGJfaGFuZGxlcmF0dHJfc2V0cmV0dXJuY2xvc3VyZXR5cGUoJnNldF9hdHRyLCB0YWJsZV9yZXR1cm5fdHlwZSk7Ci0gIH0KLQotICBoLT50YWJsZVtzZWxdLmZ1bmMgPSAodXBiX2Z1bmMqKWZ1bmM7Ci0gIGgtPnRhYmxlW3NlbF0uYXR0ciA9IHNldF9hdHRyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyB0aGUgZWZmZWN0aXZlIGNsb3N1cmUgdHlwZSBmb3IgdGhpcyBoYW5kbGVyICh3aGljaCB3aWxsIHByb3BhZ2F0ZQotICogZnJvbSBvdXRlciBmcmFtZXMgaWYgdGhpcyBmcmFtZSBoYXMgbm8gU1RBUlQqIGhhbmRsZXIpLiAgTm90IGltcGxlbWVudGVkIGZvcgotICogVVBCX0hBTkRMRVJfU1RSSU5HIGF0IHRoZSBtb21lbnQgc2luY2UgdGhpcyBpcyBub3QgbmVlZGVkLiAgUmV0dXJucyBOVUxMIGlzCi0gKiB0aGUgZWZmZWN0aXZlIGNsb3N1cmUgdHlwZSBpcyB1bnNwZWNpZmllZCAoZWl0aGVyIG5vIGhhbmRsZXIgd2FzIHJlZ2lzdGVyZWQKLSAqIHRvIHNwZWNpZnkgaXQgb3IgdGhlIGhhbmRsZXIgdGhhdCB3YXMgcmVnaXN0ZXJlZCBkaWQgbm90IHNwZWNpZnkgdGhlIGNsb3N1cmUKLSAqIHR5cGUpLiAqLwotY29uc3Qgdm9pZCAqZWZmZWN0aXZlX2Nsb3N1cmVfdHlwZSh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJ0eXBlX3QgdHlwZSkgewotICBjb25zdCB2b2lkICpyZXQ7Ci0gIHVwYl9zZWxlY3Rvcl90IHNlbDsKLQotICBhc3NlcnQodHlwZSAhPSBVUEJfSEFORExFUl9TVFJJTkcpOwotICByZXQgPSBoLT50b3BfY2xvc3VyZV90eXBlOwotCi0gIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikgJiYKLSAgICAgIHR5cGUgIT0gVVBCX0hBTkRMRVJfU1RBUlRTRVEgJiYKLSAgICAgIHR5cGUgIT0gVVBCX0hBTkRMRVJfRU5EU0VRICYmCi0gICAgICBoLT50YWJsZVtzZWwgPSBoYW5kbGVyc19nZXRzZWwoaCwgZiwgVVBCX0hBTkRMRVJfU1RBUlRTRVEpXS5mdW5jKSB7Ci0gICAgcmV0ID0gdXBiX2hhbmRsZXJhdHRyX3JldHVybmNsb3N1cmV0eXBlKCZoLT50YWJsZVtzZWxdLmF0dHIpOwotICB9Ci0KLSAgaWYgKHR5cGUgPT0gVVBCX0hBTkRMRVJfU1RSSU5HICYmCi0gICAgICBoLT50YWJsZVtzZWwgPSBoYW5kbGVyc19nZXRzZWwoaCwgZiwgVVBCX0hBTkRMRVJfU1RBUlRTVFIpXS5mdW5jKSB7Ci0gICAgcmV0ID0gdXBiX2hhbmRsZXJhdHRyX3JldHVybmNsb3N1cmV0eXBlKCZoLT50YWJsZVtzZWxdLmF0dHIpOwotICB9Ci0KLSAgLyogVGhlIGVmZmVjdGl2ZSB0eXBlIG9mIHRoZSBzdWJtZXNzYWdlOyBub3QgdXNlZCB5ZXQuCi0gICAqIGlmICh0eXBlID09IFNVQk1FU1NBR0UgJiYKLSAgICogICAgIGgtPnRhYmxlW3NlbCA9IGhhbmRsZXJzX2dldHNlbChoLCBmLCBVUEJfSEFORExFUl9TVEFSVFNVQk1TRyldLmZ1bmMpIHsKLSAgICogICByZXQgPSB1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUoJmgtPnRhYmxlW3NlbF0uYXR0cik7Ci0gICAqIH0gKi8KLQotICByZXR1cm4gcmV0OwotfQotCi0vKiBDaGVja3Mgd2hldGhlciB0aGUgU1RBUlQqIGhhbmRsZXIgc3BlY2lmaWVkIGJ5IGYgJiB0eXBlIGlzIG1pc3NpbmcgZXZlbgotICogdGhvdWdoIGl0IGlzIHJlcXVpcmVkIHRvIGNvbnZlcnQgdGhlIGVzdGFibGlzaGVkIHR5cGUgb2YgYW4gb3V0ZXIgZnJhbWUKLSAqICgiY2xvc3VyZV90eXBlIikgaW50byB0aGUgZXN0YWJsaXNoZWQgdHlwZSBvZiBhbiBpbm5lciBmcmFtZSAocmVwcmVzZW50ZWQgaW4KLSAqIHRoZSByZXR1cm4gY2xvc3VyZSB0eXBlIG9mIHRoaXMgaGFuZGxlcidzIGF0dHIuICovCi1ib29sIGNoZWNrc3RhcnQodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIGNvbnN0IHZvaWQgKmNsb3N1cmVfdHlwZTsKLSAgY29uc3QgdXBiX2hhbmRsZXJhdHRyICphdHRyOwotICBjb25zdCB2b2lkICpyZXR1cm5fY2xvc3VyZV90eXBlOwotCi0gIHVwYl9zZWxlY3Rvcl90IHNlbCA9IGhhbmRsZXJzX2dldHNlbChoLCBmLCB0eXBlKTsKLSAgaWYgKGgtPnRhYmxlW3NlbF0uZnVuYykgcmV0dXJuIHRydWU7Ci0gIGNsb3N1cmVfdHlwZSA9IGVmZmVjdGl2ZV9jbG9zdXJlX3R5cGUoaCwgZiwgdHlwZSk7Ci0gIGF0dHIgPSAmaC0+dGFibGVbc2VsXS5hdHRyOwotICByZXR1cm5fY2xvc3VyZV90eXBlID0gdXBiX2hhbmRsZXJhdHRyX3JldHVybmNsb3N1cmV0eXBlKGF0dHIpOwotICBpZiAoY2xvc3VyZV90eXBlICYmIHJldHVybl9jbG9zdXJlX3R5cGUgJiYKLSAgICAgIGNsb3N1cmVfdHlwZSAhPSByZXR1cm5fY2xvc3VyZV90eXBlKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgImV4cGVjdGVkIHN0YXJ0IGhhbmRsZXIgdG8gcmV0dXJuIHN1YiB0eXBlIGZvciBmaWVsZCAlZiIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKGYpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFB1YmxpYyBpbnRlcmZhY2UgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVwYl9oYW5kbGVycyAqdXBiX2hhbmRsZXJzX25ldyhjb25zdCB1cGJfbXNnZGVmICptZCwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgaW50IGV4dHJhOwotICB1cGJfaGFuZGxlcnMgKmg7Ci0KLSAgYXNzZXJ0KHVwYl9tc2dkZWZfaXNmcm96ZW4obWQpKTsKLQotICBleHRyYSA9IHNpemVvZih1cGJfaGFuZGxlcnNfdGFiZW50KSAqIChtZC0+c2VsZWN0b3JfY291bnQgLSAxKTsKLSAgaCA9IHVwYl9jYWxsb2Moc2l6ZW9mKCpoKSArIGV4dHJhKTsKLSAgaWYgKCFoKSByZXR1cm4gTlVMTDsKLQotICBoLT5tc2cgPSBtZDsKLSAgdXBiX21zZ2RlZl9yZWYoaC0+bXNnLCBoKTsKLSAgdXBiX3N0YXR1c19jbGVhcigmaC0+c3RhdHVzXyk7Ci0KLSAgaWYgKG1kLT5zdWJtc2dfZmllbGRfY291bnQgPiAwKSB7Ci0gICAgaC0+c3ViID0gdXBiX2NhbGxvYyhtZC0+c3VibXNnX2ZpZWxkX2NvdW50ICogc2l6ZW9mKCpoLT5zdWIpKTsKLSAgICBpZiAoIWgtPnN1YikgZ290byBvb207Ci0gIH0gZWxzZSB7Ci0gICAgaC0+c3ViID0gMDsKLSAgfQotCi0gIGlmICghdXBiX3JlZmNvdW50ZWRfaW5pdCh1cGJfaGFuZGxlcnNfdXBjYXN0X211dGFibGUoaCksICZ2dGJsLCBvd25lcikpCi0gICAgZ290byBvb207Ci0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoJmgtPmNsZWFudXBfLCBVUEJfQ1RZUEVfRlBUUikpIGdvdG8gb29tOwotCi0gIC8qIGNhbGxvYygpIGFib3ZlIGluaXRpYWxpemVkIGFsbCBoYW5kbGVycyB0byBOVUxMLiAqLwotICByZXR1cm4gaDsKLQotb29tOgotICBmcmVlaGFuZGxlcnModXBiX2hhbmRsZXJzX3VwY2FzdF9tdXRhYmxlKGgpKTsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX2hhbmRsZXJzX25ld2Zyb3plbihjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyc19jYWxsYmFjayAqY2FsbGJhY2ssCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqY2xvc3VyZSkgewotICBkZnNfc3RhdGUgc3RhdGU7Ci0gIHVwYl9oYW5kbGVycyAqcmV0OwotICBib29sIG9rOwotICB1cGJfcmVmY291bnRlZCAqcjsKLQotICBzdGF0ZS5jYWxsYmFjayA9IGNhbGxiYWNrOwotICBzdGF0ZS5jbG9zdXJlID0gY2xvc3VyZTsKLSAgaWYgKCF1cGJfaW50dGFibGVfaW5pdCgmc3RhdGUudGFiLCBVUEJfQ1RZUEVfUFRSKSkgcmV0dXJuIE5VTEw7Ci0KLSAgcmV0ID0gbmV3Zm9ybXNnKG0sIG93bmVyLCAmc3RhdGUpOwotCi0gIHVwYl9pbnR0YWJsZV91bmluaXQoJnN0YXRlLnRhYik7Ci0gIGlmICghcmV0KSByZXR1cm4gTlVMTDsKLQotICByID0gdXBiX2hhbmRsZXJzX3VwY2FzdF9tdXRhYmxlKHJldCk7Ci0gIG9rID0gdXBiX3JlZmNvdW50ZWRfZnJlZXplKCZyLCAxLCBOVUxMLCBVUEJfTUFYX0hBTkRMRVJfREVQVEgpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotCi0gIHJldHVybiByZXQ7Ci19Ci0KLWNvbnN0IHVwYl9zdGF0dXMgKnVwYl9oYW5kbGVyc19zdGF0dXModXBiX2hhbmRsZXJzICpoKSB7Ci0gIGFzc2VydCghdXBiX2hhbmRsZXJzX2lzZnJvemVuKGgpKTsKLSAgcmV0dXJuICZoLT5zdGF0dXNfOwotfQotCi12b2lkIHVwYl9oYW5kbGVyc19jbGVhcmVycih1cGJfaGFuZGxlcnMgKmgpIHsKLSAgYXNzZXJ0KCF1cGJfaGFuZGxlcnNfaXNmcm96ZW4oaCkpOwotICB1cGJfc3RhdHVzX2NsZWFyKCZoLT5zdGF0dXNfKTsKLX0KLQotI2RlZmluZSBTRVRURVIobmFtZSwgaGFuZGxlcmN0eXBlLCBoYW5kbGVydHlwZSkgXAotICBib29sIHVwYl9oYW5kbGVyc19zZXQgIyMgbmFtZSh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYW5kbGVyY3R5cGUgZnVuYywgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7IFwKLSAgICBpbnQzMl90IHNlbCA9IHRyeWdldHNlbChoLCBmLCBoYW5kbGVydHlwZSk7IFwKLSAgICByZXR1cm4gZG9zZXQoaCwgc2VsLCBmLCBoYW5kbGVydHlwZSwgKHVwYl9mdW5jKilmdW5jLCBhdHRyKTsgXAotICB9Ci0KLVNFVFRFUihpbnQzMiwgICAgICAgdXBiX2ludDMyX2hhbmRsZXJmdW5jKiwgICAgICAgVVBCX0hBTkRMRVJfSU5UMzIpCi1TRVRURVIoaW50NjQsICAgICAgIHVwYl9pbnQ2NF9oYW5kbGVyZnVuYyosICAgICAgIFVQQl9IQU5ETEVSX0lOVDY0KQotU0VUVEVSKHVpbnQzMiwgICAgICB1cGJfdWludDMyX2hhbmRsZXJmdW5jKiwgICAgICBVUEJfSEFORExFUl9VSU5UMzIpCi1TRVRURVIodWludDY0LCAgICAgIHVwYl91aW50NjRfaGFuZGxlcmZ1bmMqLCAgICAgIFVQQl9IQU5ETEVSX1VJTlQ2NCkKLVNFVFRFUihmbG9hdCwgICAgICAgdXBiX2Zsb2F0X2hhbmRsZXJmdW5jKiwgICAgICAgVVBCX0hBTkRMRVJfRkxPQVQpCi1TRVRURVIoZG91YmxlLCAgICAgIHVwYl9kb3VibGVfaGFuZGxlcmZ1bmMqLCAgICAgIFVQQl9IQU5ETEVSX0RPVUJMRSkKLVNFVFRFUihib29sLCAgICAgICAgdXBiX2Jvb2xfaGFuZGxlcmZ1bmMqLCAgICAgICAgVVBCX0hBTkRMRVJfQk9PTCkKLVNFVFRFUihzdGFydHN0ciwgICAgdXBiX3N0YXJ0c3RyX2hhbmRsZXJmdW5jKiwgICAgVVBCX0hBTkRMRVJfU1RBUlRTVFIpCi1TRVRURVIoc3RyaW5nLCAgICAgIHVwYl9zdHJpbmdfaGFuZGxlcmZ1bmMqLCAgICAgIFVQQl9IQU5ETEVSX1NUUklORykKLVNFVFRFUihlbmRzdHIsICAgICAgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jKiwgICAgVVBCX0hBTkRMRVJfRU5EU1RSKQotU0VUVEVSKHN0YXJ0c2VxLCAgICB1cGJfc3RhcnRmaWVsZF9oYW5kbGVyZnVuYyosICBVUEJfSEFORExFUl9TVEFSVFNFUSkKLVNFVFRFUihzdGFydHN1Ym1zZywgdXBiX3N0YXJ0ZmllbGRfaGFuZGxlcmZ1bmMqLCAgVVBCX0hBTkRMRVJfU1RBUlRTVUJNU0cpCi1TRVRURVIoZW5kc3VibXNnLCAgIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyosICAgIFVQQl9IQU5ETEVSX0VORFNVQk1TRykKLVNFVFRFUihlbmRzZXEsICAgICAgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jKiwgICAgVVBCX0hBTkRMRVJfRU5EU0VRKQotCi0jdW5kZWYgU0VUVEVSCi0KLWJvb2wgdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKHVwYl9oYW5kbGVycyAqaCwgdXBiX3N0YXJ0bXNnX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIHJldHVybiBkb3NldChoLCBVUEJfU1RBUlRNU0dfU0VMRUNUT1IsIE5VTEwsIFVQQl9IQU5ETEVSX0lOVDMyLAotICAgICAgICAgICAgICAgKHVwYl9mdW5jICopZnVuYywgYXR0cik7Ci19Ci0KLWJvb2wgdXBiX2hhbmRsZXJzX3NldGVuZG1zZyh1cGJfaGFuZGxlcnMgKmgsIHVwYl9lbmRtc2dfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIGFzc2VydCghdXBiX2hhbmRsZXJzX2lzZnJvemVuKGgpKTsKLSAgcmV0dXJuIGRvc2V0KGgsIFVQQl9FTkRNU0dfU0VMRUNUT1IsIE5VTEwsIFVQQl9IQU5ETEVSX0lOVDMyLAotICAgICAgICAgICAgICAgKHVwYl9mdW5jICopZnVuYywgYXR0cik7Ci19Ci0KLWJvb2wgdXBiX2hhbmRsZXJzX3NldHN1YmhhbmRsZXJzKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2hhbmRsZXJzICpzdWIpIHsKLSAgYXNzZXJ0KHN1Yik7Ci0gIGFzc2VydCghdXBiX2hhbmRsZXJzX2lzZnJvemVuKGgpKTsKLSAgYXNzZXJ0KHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSk7Ci0gIGlmIChTVUJIX0YoaCwgZikpIHJldHVybiBmYWxzZTsgIC8qIENhbid0IHJlc2V0LiAqLwotICBpZiAodXBiX21zZ2RlZl91cGNhc3QodXBiX2hhbmRsZXJzX21zZ2RlZihzdWIpKSAhPSB1cGJfZmllbGRkZWZfc3ViZGVmKGYpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIFNVQkhfRihoLCBmKSA9IHN1YjsKLSAgdXBiX3JlZjIoc3ViLCBoKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX2hhbmRsZXJzX2dldHN1YmhhbmRsZXJzKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBhc3NlcnQodXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpKTsKLSAgcmV0dXJuIFNVQkhfRihoLCBmKTsKLX0KLQotYm9vbCB1cGJfaGFuZGxlcnNfZ2V0YXR0cihjb25zdCB1cGJfaGFuZGxlcnMgKmgsIHVwYl9zZWxlY3Rvcl90IHNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIGlmICghdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoaCwgc2VsKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gICphdHRyID0gaC0+dGFibGVbc2VsXS5hdHRyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnNfc2VsKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2VsZWN0b3JfdCBzZWwpIHsKLSAgLyogU1RBUlRTVUJNU0cgc2VsZWN0b3IgaW4gc2VsIGlzIHRoZSBmaWVsZCdzIHNlbGVjdG9yIGJhc2UuICovCi0gIHJldHVybiBTVUJIKGgsIHNlbCAtIFVQQl9TVEFUSUNfU0VMRUNUT1JfQ09VTlQpOwotfQotCi1jb25zdCB1cGJfbXNnZGVmICp1cGJfaGFuZGxlcnNfbXNnZGVmKGNvbnN0IHVwYl9oYW5kbGVycyAqaCkgeyByZXR1cm4gaC0+bXNnOyB9Ci0KLWJvb2wgdXBiX2hhbmRsZXJzX2FkZGNsZWFudXAodXBiX2hhbmRsZXJzICpoLCB2b2lkICpwLCB1cGJfaGFuZGxlcmZyZWUgKmZ1bmMpIHsKLSAgYm9vbCBvazsKLSAgaWYgKHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoJmgtPmNsZWFudXBfLCBwLCBOVUxMKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBvayA9IHVwYl9pbnR0YWJsZV9pbnNlcnRwdHIoJmgtPmNsZWFudXBfLCBwLCB1cGJfdmFsdWVfZnB0cihmdW5jKSk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLS8qICJTdGF0aWMiIG1ldGhvZHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLWJvb2wgdXBiX2hhbmRsZXJzX2ZyZWV6ZSh1cGJfaGFuZGxlcnMgKmNvbnN0KmhhbmRsZXJzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcykgewotICAvKiBUT0RPOiB2ZXJpZnkgd2UgaGF2ZSBhIHRyYW5zaXRpdmUgY2xvc3VyZS4gKi8KLSAgaW50IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICB1cGJfbXNnX2ZpZWxkX2l0ZXIgajsKLSAgICB1cGJfaGFuZGxlcnMgKmggPSBoYW5kbGVyc1tpXTsKLQotICAgIGlmICghdXBiX29rKCZoLT5zdGF0dXNfKSkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHMsICJoYW5kbGVycyBmb3IgbWVzc2FnZSAlcyBoYWQgZXJyb3Igc3RhdHVzOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX21zZ2RlZl9mdWxsbmFtZSh1cGJfaGFuZGxlcnNfbXNnZGVmKGgpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzX2Vycm1zZygmaC0+c3RhdHVzXykpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIC8qIENoZWNrIHRoYXQgdGhlcmUgYXJlIG5vIGNsb3N1cmUgbWlzbWF0Y2hlcyBkdWUgdG8gbWlzc2luZyBTdGFydCogaGFuZGxlcnMKLSAgICAgKiBvciBzdWJoYW5kbGVycyB3aXRoIGRpZmZlcmVudCB0eXBlLWxldmVsIHR5cGVzLiAqLwotICAgIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZqLCBoLT5tc2cpOwotICAgICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZqKTsKLSAgICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZqKSkgewotCi0gICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmopOwotICAgICAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgewotICAgICAgICBpZiAoIWNoZWNrc3RhcnQoaCwgZiwgVVBCX0hBTkRMRVJfU1RBUlRTRVEsIHMpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVwYl9maWVsZGRlZl9pc3N0cmluZyhmKSkgewotICAgICAgICBpZiAoIWNoZWNrc3RhcnQoaCwgZiwgVVBCX0hBTkRMRVJfU1RBUlRTVFIsIHMpKQotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLQotICAgICAgaWYgKHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgewotICAgICAgICBib29sIGhhc2hhbmRsZXIgPSBmYWxzZTsKLSAgICAgICAgaWYgKHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKAotICAgICAgICAgICAgICAgIGgsIGhhbmRsZXJzX2dldHNlbChoLCBmLCBVUEJfSEFORExFUl9TVEFSVFNVQk1TRykpIHx8Ci0gICAgICAgICAgICB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcigKLSAgICAgICAgICAgICAgICBoLCBoYW5kbGVyc19nZXRzZWwoaCwgZiwgVVBCX0hBTkRMRVJfRU5EU1VCTVNHKSkpIHsKLSAgICAgICAgICBoYXNoYW5kbGVyID0gdHJ1ZTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikgJiYKLSAgICAgICAgICAgICh1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcigKLSAgICAgICAgICAgICAgICAgaCwgaGFuZGxlcnNfZ2V0c2VsKGgsIGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRKSkgfHwKLSAgICAgICAgICAgICB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcigKLSAgICAgICAgICAgICAgICAgaCwgaGFuZGxlcnNfZ2V0c2VsKGgsIGYsIFVQQl9IQU5ETEVSX0VORFNFUSkpKSkgewotICAgICAgICAgIGhhc2hhbmRsZXIgPSB0cnVlOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKGhhc2hhbmRsZXIgJiYgIXVwYl9oYW5kbGVyc19nZXRzdWJoYW5kbGVycyhoLCBmKSkgewotICAgICAgICAgIC8qIEZvciBub3cgd2UgYWRkIGFuIGVtcHR5IHN1YmhhbmRsZXJzIGluIHRoaXMgY2FzZS4gIEl0IG1ha2VzIHRoZQotICAgICAgICAgICAqIGRlY29kZXIgY29kZSBnZW5lcmF0b3Igc2ltcGxlciwgYmVjYXVzZSBpdCBvbmx5IGhhcyB0byBoYW5kbGUgdHdvCi0gICAgICAgICAgICogY2FzZXMgKHN1Ym1lc3NhZ2UgaGFzIGhhbmRsZXJzIG9yIG5vdCkgYXMgb3Bwb3NlZCB0byB0aHJlZQotICAgICAgICAgICAqIChzdWJtZXNzYWdlIGhhcyBoYW5kbGVycyBpbiBlbmNsb3NpbmcgbWVzc2FnZSBidXQgbm8gc3ViaGFuZGxlcnMpLgotICAgICAgICAgICAqCi0gICAgICAgICAgICogVGhpcyBtYWtlcyBwYXJzaW5nIGxlc3MgZWZmaWNpZW50IGluIHRoZSBjYXNlIHRoYXQgd2Ugd2FudCB0bwotICAgICAgICAgICAqIG5vdGljZSBhIHN1Ym1lc3NhZ2UgYnV0IHNraXAgaXRzIGNvbnRlbnRzIChsaWtlIGlmIHdlJ3JlIHRlc3RpbmcKLSAgICAgICAgICAgKiBmb3Igc3VibWVzc2FnZSBwcmVzZW5jZSBvciBjb3VudGluZyB0aGUgbnVtYmVyIG9mIHJlcGVhdGVkCi0gICAgICAgICAgICogc3VibWVzc2FnZXMpLiAgSW4gdGhpcyBjYXNlIHdlIHdpbGwgZW5kIHVwIHBhcnNpbmcgdGhlIHN1Ym1lc3NhZ2UKLSAgICAgICAgICAgKiBmaWVsZCBieSBmaWVsZCBhbmQgdGhyb3dpbmcgYXdheSB0aGUgcmVzdWx0cyBmb3IgZWFjaCwgaW5zdGVhZCBvZgotICAgICAgICAgICAqIHNraXBwaW5nIHRoZSB3aG9sZSBkZWxpbWl0ZWQgdGhpbmcgYXQgb25jZS4gIElmIHRoaXMgaXMgYW4gaXNzdWUgd2UKLSAgICAgICAgICAgKiBjYW4gcmV2aXNpdCBpdCwgYnV0IGRvIHJlbWVtYmVyIHRoYXQgdGhpcyBvbmx5IGFyaXNlcyB3aGVuIHlvdSBoYXZlCi0gICAgICAgICAgICogaGFuZGxlcnMgKHN0YXJ0c2VxL3N0YXJ0c3VibXNnL2VuZHN1Ym1zZy9lbmRzZXEpIHNldCBmb3IgdGhlCi0gICAgICAgICAgICogc3VibWVzc2FnZSBidXQgbm8gc3ViaGFuZGxlcnMuICBUaGUgdXNlcyBjYXNlcyBmb3IgdGhpcyBhcmUKLSAgICAgICAgICAgKiBsaW1pdGVkLiAqLwotICAgICAgICAgIHVwYl9oYW5kbGVycyAqc3ViID0gdXBiX2hhbmRsZXJzX25ldyh1cGJfZmllbGRkZWZfbXNnc3ViZGVmKGYpLCAmc3ViKTsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3ViaGFuZGxlcnMoaCwgZiwgc3ViKTsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfdW5yZWYoc3ViLCAmc3ViKTsKLSAgICAgICAgfQotCi0gICAgICAgIC8qIFRPRE8oaGFiZXJtYW4pOiBjaGVjayB0eXBlIG9mIHN1Ym1lc3NhZ2UuCi0gICAgICAgICAqIFRoaXMgaXMgc2xpZ2h0bHkgdHJpY2t5OyBhbHNvIGNvbnNpZGVyIHdoZXRoZXIgd2Ugc2hvdWxkIGNoZWNrIHRoYXQKLSAgICAgICAgICogdGhleSBtYXRjaCBhdCBzZXRzdWJoYW5kbGVycyB0aW1lLiAqLwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmICghdXBiX3JlZmNvdW50ZWRfZnJlZXplKCh1cGJfcmVmY291bnRlZCpjb25zdCopaGFuZGxlcnMsIG4sIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVQQl9NQVhfSEFORExFUl9ERVBUSCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdXBiX2hhbmRsZXJ0eXBlX3QgdXBiX2hhbmRsZXJzX2dldHByaW1pdGl2ZWhhbmRsZXJ0eXBlKGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKGYpKSB7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06IHJldHVybiBVUEJfSEFORExFUl9JTlQzMjsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDY0OiByZXR1cm4gVVBCX0hBTkRMRVJfSU5UNjQ7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6IHJldHVybiBVUEJfSEFORExFUl9VSU5UMzI7Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6IHJldHVybiBVUEJfSEFORExFUl9VSU5UNjQ7Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDogcmV0dXJuIFVQQl9IQU5ETEVSX0ZMT0FUOwotICAgIGNhc2UgVVBCX1RZUEVfRE9VQkxFOiByZXR1cm4gVVBCX0hBTkRMRVJfRE9VQkxFOwotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDogcmV0dXJuIFVQQl9IQU5ETEVSX0JPT0w7Ci0gICAgZGVmYXVsdDogYXNzZXJ0KGZhbHNlKTsgcmV0dXJuIC0xOyAgLyogSW52YWxpZCBpbnB1dC4gKi8KLSAgfQotfQotCi1ib29sIHVwYl9oYW5kbGVyc19nZXRzZWxlY3Rvcihjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2VsZWN0b3JfdCAqcykgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIFVQQl9IQU5ETEVSX0lOVDMyOgotICAgIGNhc2UgVVBCX0hBTkRMRVJfSU5UNjQ6Ci0gICAgY2FzZSBVUEJfSEFORExFUl9VSU5UMzI6Ci0gICAgY2FzZSBVUEJfSEFORExFUl9VSU5UNjQ6Ci0gICAgY2FzZSBVUEJfSEFORExFUl9GTE9BVDoKLSAgICBjYXNlIFVQQl9IQU5ETEVSX0RPVUJMRToKLSAgICBjYXNlIFVQQl9IQU5ETEVSX0JPT0w6Ci0gICAgICBpZiAoIXVwYl9maWVsZGRlZl9pc3ByaW1pdGl2ZShmKSB8fAotICAgICAgICAgIHVwYl9oYW5kbGVyc19nZXRwcmltaXRpdmVoYW5kbGVydHlwZShmKSAhPSB0eXBlKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAqcyA9IGYtPnNlbGVjdG9yX2Jhc2U7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9IQU5ETEVSX1NUUklORzoKLSAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdHJpbmcoZikpIHsKLSAgICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlOwotICAgICAgfSBlbHNlIGlmICh1cGJfZmllbGRkZWZfbGF6eShmKSkgewotICAgICAgICAqcyA9IGYtPnNlbGVjdG9yX2Jhc2UgKyAzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfSEFORExFUl9TVEFSVFNUUjoKLSAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdHJpbmcoZikgfHwgdXBiX2ZpZWxkZGVmX2xhenkoZikpIHsKLSAgICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlICsgMTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0hBTkRMRVJfRU5EU1RSOgotICAgICAgaWYgKHVwYl9maWVsZGRlZl9pc3N0cmluZyhmKSB8fCB1cGJfZmllbGRkZWZfbGF6eShmKSkgewotICAgICAgICAqcyA9IGYtPnNlbGVjdG9yX2Jhc2UgKyAyOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfSEFORExFUl9TVEFSVFNFUToKLSAgICAgIGlmICghdXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAqcyA9IGYtPnNlbGVjdG9yX2Jhc2UgLSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfSEFORExFUl9FTkRTRVE6Ci0gICAgICBpZiAoIXVwYl9maWVsZGRlZl9pc3NlcShmKSkgcmV0dXJuIGZhbHNlOwotICAgICAgKnMgPSBmLT5zZWxlY3Rvcl9iYXNlIC0gMTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX0hBTkRMRVJfU1RBUlRTVUJNU0c6Ci0gICAgICBpZiAoIXVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgcmV0dXJuIGZhbHNlOwotICAgICAgLyogU2VsZWN0b3JzIGZvciBTVEFSVFNVQk1TRyBhcmUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgdGFibGUgc28gdGhhdCB0aGUKLSAgICAgICAqIHNlbGVjdG9yIGNhbiBhbHNvIGJlIHVzZWQgYXMgYW4gaW5kZXggaW50byB0aGUgInN1YiIgYXJyYXkgb2YKLSAgICAgICAqIHN1YmhhbmRsZXJzLiAgVGhlIGluZGV4ZXMgZm9yIHRoZSB0d28gaW50byB0aGVzZSB0d28gdGFibGVzIGFyZSB0aGUKLSAgICAgICAqIHNhbWUsIGV4Y2VwdCB0aGF0IGluIHRoZSBoYW5kbGVyIHRhYmxlIHRoZSBzdGF0aWMgc2VsZWN0b3JzIGNvbWUgZmlyc3QuICovCi0gICAgICAqcyA9IGYtPmluZGV4XyArIFVQQl9TVEFUSUNfU0VMRUNUT1JfQ09VTlQ7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9IQU5ETEVSX0VORFNVQk1TRzoKLSAgICAgIGlmICghdXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAqcyA9IGYtPnNlbGVjdG9yX2Jhc2U7Ci0gICAgICBicmVhazsKLSAgfQotICBhc3NlcnQoKHNpemVfdCkqcyA8IHVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZShmKS0+c2VsZWN0b3JfY291bnQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdWludDMyX3QgdXBiX2hhbmRsZXJzX3NlbGVjdG9yYmFzZW9mZnNldChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9pc3NlcShmKSA/IDIgOiAwOwotfQotCi11aW50MzJfdCB1cGJfaGFuZGxlcnNfc2VsZWN0b3Jjb3VudChjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgdWludDMyX3QgcmV0ID0gMTsKLSAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgcmV0ICs9IDI7ICAgIC8qIFNUQVJUU0VRL0VORFNFUSAqLwotICBpZiAodXBiX2ZpZWxkZGVmX2lzc3RyaW5nKGYpKSByZXQgKz0gMjsgLyogW1NUUklOR10vU1RBUlRTVFIvRU5EU1RSICovCi0gIGlmICh1cGJfZmllbGRkZWZfaXNzdWJtc2coZikpIHsKLSAgICAvKiBFTkRTVUJNU0cgKFNUQVJUU1VCTVNHIGlzIGF0IHRhYmxlIGJlZ2lubmluZykgKi8KLSAgICByZXQgKz0gMDsKLSAgICBpZiAodXBiX2ZpZWxkZGVmX2xhenkoZikpIHsKLSAgICAgIC8qIFNUQVJUU1RSL0VORFNUUi9TVFJJTkcgKGZvciBsYXp5KSAqLwotICAgICAgcmV0ICs9IDM7Ci0gICAgfQotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLQotLyogdXBiX2hhbmRsZXJhdHRyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCB1cGJfaGFuZGxlcmF0dHJfaW5pdCh1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgdXBiX2hhbmRsZXJhdHRyIGZyb20gPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0gIG1lbWNweShhdHRyLCAmZnJvbSwgc2l6ZW9mKCphdHRyKSk7Ci19Ci0KLXZvaWQgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCh1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgVVBCX1VOVVNFRChhdHRyKTsKLX0KLQotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0aGFuZGxlcmRhdGEodXBiX2hhbmRsZXJhdHRyICphdHRyLCBjb25zdCB2b2lkICpoZCkgewotICBhdHRyLT5oYW5kbGVyX2RhdGFfID0gaGQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9oYW5kbGVyYXR0cl9zZXRjbG9zdXJldHlwZSh1cGJfaGFuZGxlcmF0dHIgKmF0dHIsIGNvbnN0IHZvaWQgKnR5cGUpIHsKLSAgYXR0ci0+Y2xvc3VyZV90eXBlXyA9IHR5cGU7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCB2b2lkICp1cGJfaGFuZGxlcmF0dHJfY2xvc3VyZXR5cGUoY29uc3QgdXBiX2hhbmRsZXJhdHRyICphdHRyKSB7Ci0gIHJldHVybiBhdHRyLT5jbG9zdXJlX3R5cGVfOwotfQotCi1ib29sIHVwYl9oYW5kbGVyYXR0cl9zZXRyZXR1cm5jbG9zdXJldHlwZSh1cGJfaGFuZGxlcmF0dHIgKmF0dHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0eXBlKSB7Ci0gIGF0dHItPnJldHVybl9jbG9zdXJlX3R5cGVfID0gdHlwZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHZvaWQgKnVwYl9oYW5kbGVyYXR0cl9yZXR1cm5jbG9zdXJldHlwZShjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgcmV0dXJuIGF0dHItPnJldHVybl9jbG9zdXJlX3R5cGVfOwotfQotCi1ib29sIHVwYl9oYW5kbGVyYXR0cl9zZXRhbHdheXNvayh1cGJfaGFuZGxlcmF0dHIgKmF0dHIsIGJvb2wgYWx3YXlzb2spIHsKLSAgYXR0ci0+YWx3YXlzb2tfID0gYWx3YXlzb2s7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9oYW5kbGVyYXR0cl9hbHdheXNvayhjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgcmV0dXJuIGF0dHItPmFsd2F5c29rXzsKLX0KLQotLyogdXBiX2J1ZmhhbmRsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc2l6ZV90IHVwYl9idWZoYW5kbGVfb2Jqb2ZzKGNvbnN0IHVwYl9idWZoYW5kbGUgKmgpIHsKLSAgcmV0dXJuIGgtPm9iam9mc187Ci19Ci0KLS8qIHVwYl9ieXRlc2hhbmRsZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgdXBiX2J5dGVzaGFuZGxlcl9pbml0KHVwYl9ieXRlc2hhbmRsZXIqIGgpIHsKLSAgbWVtc2V0KGgsIDAsIHNpemVvZigqaCkpOwotfQotCi0vKiBGb3Igd2hlbiB3ZSBzdXBwb3J0IGhhbmRsZXJmcmVlIGNhbGxiYWNrcy4gKi8KLXZvaWQgdXBiX2J5dGVzaGFuZGxlcl91bmluaXQodXBiX2J5dGVzaGFuZGxlciogaCkgewotICBVUEJfVU5VU0VEKGgpOwotfQotCi1ib29sIHVwYl9ieXRlc2hhbmRsZXJfc2V0c3RhcnRzdHIodXBiX2J5dGVzaGFuZGxlciAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhcnRzdHJfaGFuZGxlcmZ1bmMgKmZ1bmMsIHZvaWQgKmQpIHsKLSAgaC0+dGFibGVbVVBCX1NUQVJUU1RSX1NFTEVDVE9SXS5mdW5jID0gKHVwYl9mdW5jKilmdW5jOwotICBoLT50YWJsZVtVUEJfU1RBUlRTVFJfU0VMRUNUT1JdLmF0dHIuaGFuZGxlcl9kYXRhXyA9IGQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9ieXRlc2hhbmRsZXJfc2V0c3RyaW5nKHVwYl9ieXRlc2hhbmRsZXIgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdHJpbmdfaGFuZGxlcmZ1bmMgKmZ1bmMsIHZvaWQgKmQpIHsKLSAgaC0+dGFibGVbVVBCX1NUUklOR19TRUxFQ1RPUl0uZnVuYyA9ICh1cGJfZnVuYyopZnVuYzsKLSAgaC0+dGFibGVbVVBCX1NUUklOR19TRUxFQ1RPUl0uYXR0ci5oYW5kbGVyX2RhdGFfID0gZDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdXBiX2J5dGVzaGFuZGxlcl9zZXRlbmRzdHIodXBiX2J5dGVzaGFuZGxlciAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jICpmdW5jLCB2b2lkICpkKSB7Ci0gIGgtPnRhYmxlW1VQQl9FTkRTVFJfU0VMRUNUT1JdLmZ1bmMgPSAodXBiX2Z1bmMqKWZ1bmM7Ci0gIGgtPnRhYmxlW1VQQl9FTkRTVFJfU0VMRUNUT1JdLmF0dHIuaGFuZGxlcl9kYXRhXyA9IGQ7Ci0gIHJldHVybiB0cnVlOwotfQotLyoKLSoqIHVwYjo6UmVmQ291bnRlZCBJbXBsZW1lbnRhdGlvbgotKioKLSoqIE91ciBrZXkgaW52YXJpYW50cyBhcmU6Ci0qKiAxLiByZWZlcmVuY2UgY3ljbGVzIG5ldmVyIHNwYW4gZ3JvdXBzCi0qKiAyLiBmb3IgcmVmMih0bywgZnJvbSksIHdlIGluY3JlbWVudCB0bydzIGNvdW50IGlmZiBncm91cChmcm9tKSAhPSBncm91cCh0bykKLSoqCi0qKiBUaGUgcHJldmlvdXMgdHdvIGFyZSBob3cgd2UgYXZvaWQgbGVha2luZyBjeWNsZXMuICBPdGhlciBpbXBvcnRhbnQKLSoqIGludmFyaWFudHMgYXJlOgotKiogMy4gZm9yIG11dGFibGUgb2JqZWN0cyAiZnJvbSIgYW5kICJ0byIsIGlmIHRoZXJlIGV4aXN0cyBhIHJlZjIodG8sIGZyb20pCi0qKiAgICB0aGlzIGltcGxpZXMgZ3JvdXAoZnJvbSkgPT0gZ3JvdXAodG8pLiAgKEluIHByYWN0aWNlLCB3aGF0IHdlIGltcGxlbWVudAotKiogICAgaXMgZXZlbiBzdHJvbmdlcjsgImZyb20iIGFuZCAidG8iIHdpbGwgc2hhcmUgYSBncm91cCBpZiB0aGVyZSBoYXMgKmV2ZXIqCi0qKiAgICBiZWVuIGEgcmVmMih0bywgZnJvbSksIGJ1dCBhbGwgdGhhdCBpcyBuZWNlc3NhcnkgZm9yIGNvcnJlY3RuZXNzIGlzIHRoZQotKiogICAgd2Vha2VyIG9uZSkuCi0qKiA0LiBtdXRhYmxlIGFuZCBpbW11dGFibGUgb2JqZWN0cyBhcmUgbmV2ZXIgaW4gdGhlIHNhbWUgZ3JvdXAuCi0qLwotCi0KLSNpbmNsdWRlIDxzZXRqbXAuaD4KLQotc3RhdGljIHZvaWQgZnJlZW9iaih1cGJfcmVmY291bnRlZCAqbyk7Ci0KLWNvbnN0IGNoYXIgdW50cmFja2VkX3ZhbDsKLWNvbnN0IHZvaWQgKlVQQl9VTlRSQUNLRURfUkVGID0gJnVudHJhY2tlZF92YWw7Ci0KLS8qIGFyY2gtc3BlY2lmaWMgYXRvbWljIHByaW1pdGl2ZXMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBVUEJfVEhSRUFEX1VOU0FGRSAvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIGF0b21pY19pbmModWludDMyX3QgKmEpIHsgKCphKSsrOyB9Ci1zdGF0aWMgYm9vbCBhdG9taWNfZGVjKHVpbnQzMl90ICphKSB7IHJldHVybiAtLSgqYSkgPT0gMDsgfQotCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKSB8fCBkZWZpbmVkKF9fY2xhbmdfXykgLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi1zdGF0aWMgdm9pZCBhdG9taWNfaW5jKHVpbnQzMl90ICphKSB7IF9fc3luY19mZXRjaF9hbmRfYWRkKGEsIDEpOyB9Ci1zdGF0aWMgYm9vbCBhdG9taWNfZGVjKHVpbnQzMl90ICphKSB7IHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaChhLCAxKSA9PSAwOyB9Ci0KLSNlbGlmIGRlZmluZWQoV0lOMzIpIC8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLSNpbmNsdWRlIDxXaW5kb3dzLmg+Ci0KLXN0YXRpYyB2b2lkIGF0b21pY19pbmModXBiX2F0b21pY190ICphKSB7IEludGVybG9ja2VkSW5jcmVtZW50KCZhLT52YWwpOyB9Ci1zdGF0aWMgYm9vbCBhdG9taWNfZGVjKHVwYl9hdG9taWNfdCAqYSkgewotICByZXR1cm4gSW50ZXJsb2NrZWREZWNyZW1lbnQoJmEtPnZhbCkgPT0gMDsKLX0KLQotI2Vsc2UKLSNlcnJvciBBdG9taWMgcHJpbWl0aXZlcyBub3QgZGVmaW5lZCBmb3IgeW91ciBwbGF0Zm9ybS9DUFUuICBcCi0gICAgICAgSW1wbGVtZW50IHRoZW0gb3IgY29tcGlsZSB3aXRoIFVQQl9USFJFQURfVU5TQUZFLgotI2VuZGlmCi0KLS8qIEFsbCBzdGF0aWMgb2JqZWN0cyBwb2ludCB0byB0aGlzIHJlZmNvdW50LgotICogSXQgaXMgc3BlY2lhbC1jYXNlZCBpbiByZWYvdW5yZWYgYmVsb3cuICAqLwotdWludDMyX3Qgc3RhdGljX3JlZmNvdW50ID0gLTE7Ci0KLS8qIFdlIGNhbiBhdm9pZCBhdG9taWMgb3BzIGZvciBzdGF0aWNhbGx5LWRlY2xhcmVkIG9iamVjdHMuCi0gKiBUaGlzIGlzIGEgbWlub3Igb3B0aW1pemF0aW9uIGJ1dCBuaWNlIHNpbmNlIHdlIGNhbiBhdm9pZCBkZWdyYWRpbmcgdW5kZXIKLSAqIGNvbnRlbnRpb24gaW4gdGhpcyBjYXNlLiAqLwotCi1zdGF0aWMgdm9pZCByZWZncm91cCh1aW50MzJfdCAqZ3JvdXApIHsKLSAgaWYgKGdyb3VwICE9ICZzdGF0aWNfcmVmY291bnQpCi0gICAgYXRvbWljX2luYyhncm91cCk7Ci19Ci0KLXN0YXRpYyBib29sIHVucmVmZ3JvdXAodWludDMyX3QgKmdyb3VwKSB7Ci0gIGlmIChncm91cCA9PSAmc3RhdGljX3JlZmNvdW50KSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiBhdG9taWNfZGVjKGdyb3VwKTsKLSAgfQotfQotCi0KLS8qIFJlZmVyZW5jZSB0cmFja2luZyAoZGVidWcgb25seSkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBVUEJfREVCVUdfUkVGUwotCi0jaWZkZWYgVVBCX1RIUkVBRF9VTlNBRkUKLQotc3RhdGljIHZvaWQgdXBiX2xvY2soKSB7fQotc3RhdGljIHZvaWQgdXBiX3VubG9jaygpIHt9Ci0KLSNlbHNlCi0KLS8qIFVzZXIgbXVzdCBkZWZpbmUgZnVuY3Rpb25zIHRoYXQgbG9jay91bmxvY2sgYSBnbG9iYWwgbXV0ZXggYW5kIGxpbmsgdGhpcwotICogZmlsZSBhZ2FpbnN0IHRoZW0uICovCi12b2lkIHVwYl9sb2NrKCk7Ci12b2lkIHVwYl91bmxvY2soKTsKLQotI2VuZGlmCi0KLS8qIFVQQl9ERUJVR19SRUZTIG1vZGUgY291bnRzIG9uIGJlaW5nIGFibGUgdG8gbWFsbG9jKCkgbWVtb3J5IGluIHNvbWUKLSAqIGNvZGUtcGF0aHMgdGhhdCBjYW4gbm9ybWFsbHkgbmV2ZXIgZmFpbCwgbGlrZSB1cGJfcmVmY291bnRlZF9yZWYoKS4gIFNpbmNlCi0gKiB3ZSBoYXZlIG5vIHdheSB0byBwcm9wYWdhZ2Ugb3V0LW9mLW1lbW9yeSBlcnJvcnMgYmFjayB0byB0aGUgdXNlciwgYW5kIHNpbmNlCi0gKiB0aGVzZSBlcnJvcnMgY2FuIG9ubHkgb2NjdXIgaW4gVVBCX0RFQlVHX1JFRlMgbW9kZSwgd2UgdXNlIGFuIGFsbG9jYXRvciB0aGF0Ci0gKiBpbW1lZGlhdGVseSBhYm9ydHMgb24gZmFpbHVyZSAoYXZvaWRpbmcgdGhlIGdsb2JhbCBhbGxvY2F0b3IsIHdoaWNoIG1pZ2h0Ci0gKiBpbmplY3QgZmFpbHVyZXMpLiAqLwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0KLXN0YXRpYyB2b2lkICp1cGJfZGVidWdyZWZzX2FsbG9jZnVuYyh1cGJfYWxsb2MgKmFsbG9jLCB2b2lkICpwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplKSB7Ci0gIFVQQl9VTlVTRUQoYWxsb2MpOwotICBVUEJfVU5VU0VEKG9sZHNpemUpOwotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgZnJlZShwdHIpOwotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHZvaWQgKnJldCA9IHJlYWxsb2MocHRyLCBzaXplKTsKLQotICAgIGlmICghcmV0KSB7Ci0gICAgICBhYm9ydCgpOwotICAgIH0KLQotICAgIHJldHVybiByZXQ7Ci0gIH0KLX0KLQotdXBiX2FsbG9jIHVwYl9hbGxvY19kZWJ1Z3JlZnMgPSB7JnVwYl9kZWJ1Z3JlZnNfYWxsb2NmdW5jfTsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBpbnQgY291bnQ7ICAvKiBIb3cgbWFueSByZWZzIHRoZXJlIGFyZSAoZHVwbGljYXRlcyBvbmx5IGFsbG93ZWQgZm9yIHJlZjIpLiAqLwotICBib29sIGlzX3JlZjI7Ci19IHRyYWNrZWRyZWY7Ci0KLXN0YXRpYyB0cmFja2VkcmVmICp0cmFja2VkcmVmX25ldyhib29sIGlzX3JlZjIpIHsKLSAgdHJhY2tlZHJlZiAqcmV0ID0gdXBiX21hbGxvYygmdXBiX2FsbG9jX2RlYnVncmVmcywgc2l6ZW9mKCpyZXQpKTsKLSAgcmV0LT5jb3VudCA9IDE7Ci0gIHJldC0+aXNfcmVmMiA9IGlzX3JlZjI7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYWNrKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lciwgYm9vbCByZWYyKSB7Ci0gIHVwYl92YWx1ZSB2OwotCi0gIGFzc2VydChvd25lcik7Ci0gIGlmIChvd25lciA9PSBVUEJfVU5UUkFDS0VEX1JFRikgcmV0dXJuOwotCi0gIHVwYl9sb2NrKCk7Ci0gIGlmICh1cGJfaW50dGFibGVfbG9va3VwcHRyKHItPnJlZnMsIG93bmVyLCAmdikpIHsKLSAgICB0cmFja2VkcmVmICpyZWYgPSB1cGJfdmFsdWVfZ2V0cHRyKHYpOwotICAgIC8qIFNpbmNlIHdlIGFsbG93IG11bHRpcGxlIHJlZjIncyBmb3IgdGhlIHNhbWUgdG8vZnJvbSBwYWlyIHdpdGhvdXQKLSAgICAgKiBhbGxvY2F0aW5nIHNlcGFyYXRlIG1lbW9yeSBmb3IgZWFjaCBvbmUsIHdlIGxvc2UgdGhlIGZpbmUtZ3JhaW5lZAotICAgICAqIHRyYWNraW5nIGJlaGF2aW9yIHdlIGdldCB3aXRoIHJlZ3VsYXIgcmVmcy4gIFNpbmNlIHJlZjJzIG9ubHkgaGFwcGVuCi0gICAgICogaW5zaWRlIHVwYiwgd2UnbGwgYWNjZXB0IHRoaXMgbGltaXRhdGlvbiB1bnRpbC91bmxlc3MgdGhlcmUgaXMgYSByZWFsbHkKLSAgICAgKiBkaWZmaWN1bHQgdXBiLWludGVybmFsIGJ1ZyB0aGF0IGNhbid0IGJlIGZpZ3VyZWQgb3V0IHdpdGhvdXQgaXQuICovCi0gICAgYXNzZXJ0KHJlZjIpOwotICAgIGFzc2VydChyZWYtPmlzX3JlZjIpOwotICAgIHJlZi0+Y291bnQrKzsKLSAgfSBlbHNlIHsKLSAgICB0cmFja2VkcmVmICpyZWYgPSB0cmFja2VkcmVmX25ldyhyZWYyKTsKLSAgICB1cGJfaW50dGFibGVfaW5zZXJ0cHRyMihyLT5yZWZzLCBvd25lciwgdXBiX3ZhbHVlX3B0cihyZWYpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGJfYWxsb2NfZGVidWdyZWZzKTsKLSAgICBpZiAocmVmMikgewotICAgICAgLyogV2Uga25vdyB0aGlzIGNhc3QgaXMgc2FmZSB3aGVuIGl0IGlzIGEgcmVmMiwgYmVjYXVzZSBpdCdzIGNvbWluZyBmcm9tCi0gICAgICAgKiBhbm90aGVyIHJlZmNvdW50ZWQgb2JqZWN0LiAqLwotICAgICAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKmZyb20gPSBvd25lcjsKLSAgICAgIGFzc2VydCghdXBiX2ludHRhYmxlX2xvb2t1cHB0cihmcm9tLT5yZWYycywgciwgTlVMTCkpOwotICAgICAgdXBiX2ludHRhYmxlX2luc2VydHB0cjIoZnJvbS0+cmVmMnMsIHIsIHVwYl92YWx1ZV9wdHIoTlVMTCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBiX2FsbG9jX2RlYnVncmVmcyk7Ci0gICAgfQotICB9Ci0gIHVwYl91bmxvY2soKTsKLX0KLQotc3RhdGljIHZvaWQgdW50cmFjayhjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIsIGJvb2wgcmVmMikgewotICB1cGJfdmFsdWUgdjsKLSAgYm9vbCBmb3VuZDsKLSAgdHJhY2tlZHJlZiAqcmVmOwotCi0gIGFzc2VydChvd25lcik7Ci0gIGlmIChvd25lciA9PSBVUEJfVU5UUkFDS0VEX1JFRikgcmV0dXJuOwotCi0gIHVwYl9sb2NrKCk7Ci0gIGZvdW5kID0gdXBiX2ludHRhYmxlX2xvb2t1cHB0cihyLT5yZWZzLCBvd25lciwgJnYpOwotICAvKiBUaGlzIGFzc2VydCB3aWxsIGZhaWwgaWYgYW4gb3duZXIgYXR0ZW1wdHMgdG8gcmVsZWFzZSBhIHJlZiBpdCBkaWRuJ3QgaGF2ZS4gKi8KLSAgVVBCX0FTU0VSVF9WQVIoZm91bmQsIGZvdW5kKTsKLSAgcmVmID0gdXBiX3ZhbHVlX2dldHB0cih2KTsKLSAgYXNzZXJ0KHJlZi0+aXNfcmVmMiA9PSByZWYyKTsKLSAgaWYgKC0tcmVmLT5jb3VudCA9PSAwKSB7Ci0gICAgZnJlZShyZWYpOwotICAgIHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIoci0+cmVmcywgb3duZXIsIE5VTEwpOwotICAgIGlmIChyZWYyKSB7Ci0gICAgICAvKiBXZSBrbm93IHRoaXMgY2FzdCBpcyBzYWZlIHdoZW4gaXQgaXMgYSByZWYyLCBiZWNhdXNlIGl0J3MgY29taW5nIGZyb20KLSAgICAgICAqIGFub3RoZXIgcmVmY291bnRlZCBvYmplY3QuICovCi0gICAgICBjb25zdCB1cGJfcmVmY291bnRlZCAqZnJvbSA9IG93bmVyOwotICAgICAgYm9vbCByZW1vdmVkID0gdXBiX2ludHRhYmxlX3JlbW92ZXB0cihmcm9tLT5yZWYycywgciwgTlVMTCk7Ci0gICAgICBhc3NlcnQocmVtb3ZlZCk7Ci0gICAgfQotICB9Ci0gIHVwYl91bmxvY2soKTsKLX0KLQotc3RhdGljIHZvaWQgY2hlY2tyZWYoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyLCBib29sIHJlZjIpIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIGJvb2wgZm91bmQ7Ci0gIHRyYWNrZWRyZWYgKnJlZjsKLQotICB1cGJfbG9jaygpOwotICBmb3VuZCA9IHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoci0+cmVmcywgb3duZXIsICZ2KTsKLSAgVVBCX0FTU0VSVF9WQVIoZm91bmQsIGZvdW5kKTsKLSAgcmVmID0gdXBiX3ZhbHVlX2dldHB0cih2KTsKLSAgYXNzZXJ0KHJlZi0+aXNfcmVmMiA9PSByZWYyKTsKLSAgdXBiX3VubG9jaygpOwotfQotCi0vKiBQb3B1bGF0ZXMgdGhlIGdpdmVuIFVQQl9DVFlQRV9JTlQzMiBpbnR0YWJsZSB3aXRoIGNvdW50cyBvZiByZWYyJ3MgdGhhdAotICogb3JpZ2luYXRlIGZyb20gdGhlIGdpdmVuIG93bmVyLiAqLwotc3RhdGljIHZvaWQgZ2V0cmVmMnMoY29uc3QgdXBiX3JlZmNvdW50ZWQgKm93bmVyLCB1cGJfaW50dGFibGUgKnRhYikgewotICB1cGJfaW50dGFibGVfaXRlciBpOwotCi0gIHVwYl9sb2NrKCk7Ci0gIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgb3duZXItPnJlZjJzKTsKLSAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpKTsgdXBiX2ludHRhYmxlX25leHQoJmkpKSB7Ci0gICAgdXBiX3ZhbHVlIHY7Ci0gICAgdXBiX3ZhbHVlIGNvdW50OwotICAgIHRyYWNrZWRyZWYgKnJlZjsKLSAgICBib29sIGZvdW5kOwotCi0gICAgdXBiX3JlZmNvdW50ZWQgKnRvID0gKHVwYl9yZWZjb3VudGVkKil1cGJfaW50dGFibGVfaXRlcl9rZXkoJmkpOwotCi0gICAgLyogVG8gZ2V0IHRoZSBjb3VudCB3ZSBuZWVkIHRvIGxvb2sgaW4gdGhlIHRhcmdldCdzIHRhYmxlLiAqLwotICAgIGZvdW5kID0gdXBiX2ludHRhYmxlX2xvb2t1cHB0cih0by0+cmVmcywgb3duZXIsICZ2KTsKLSAgICBhc3NlcnQoZm91bmQpOwotICAgIHJlZiA9IHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gICAgY291bnQgPSB1cGJfdmFsdWVfaW50MzIocmVmLT5jb3VudCk7Ci0KLSAgICB1cGJfaW50dGFibGVfaW5zZXJ0cHRyMih0YWIsIHRvLCBjb3VudCwgJnVwYl9hbGxvY19kZWJ1Z3JlZnMpOwotICB9Ci0gIHVwYl91bmxvY2soKTsKLX0KLQotdHlwZWRlZiBzdHJ1Y3QgewotICB1cGJfaW50dGFibGUgcmVmMjsKLSAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKm9iajsKLX0gY2hlY2tfc3RhdGU7Ci0KLXN0YXRpYyB2b2lkIHZpc2l0X2NoZWNrKGNvbnN0IHVwYl9yZWZjb3VudGVkICpvYmosIGNvbnN0IHVwYl9yZWZjb3VudGVkICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIGNoZWNrX3N0YXRlICpzID0gY2xvc3VyZTsKLSAgdXBiX2ludHRhYmxlICpyZWYyID0gJnMtPnJlZjI7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIHJlbW92ZWQ7Ci0gIGludDMyX3QgbmV3Y291bnQ7Ci0KLSAgYXNzZXJ0KG9iaiA9PSBzLT5vYmopOwotICBhc3NlcnQoc3Vib2JqKTsKLSAgcmVtb3ZlZCA9IHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIocmVmMiwgc3Vib2JqLCAmdik7Ci0gIC8qIFRoZSBmb2xsb3dpbmcgYXNzZXJ0aW9uIHdpbGwgZmFpbCBpZiB0aGUgdmlzaXQoKSBmdW5jdGlvbiB2aXNpdHMgYSBzdWJvYmoKLSAgICogdGhhdCBpdCBkaWQgbm90IGhhdmUgYSByZWYyIG9uLCBvciB2aXNpdHMgdGhlIHNhbWUgc3Vib2JqIHRvbyBtYW55IHRpbWVzLiAqLwotICBhc3NlcnQocmVtb3ZlZCk7Ci0gIG5ld2NvdW50ID0gdXBiX3ZhbHVlX2dldGludDMyKHYpIC0gMTsKLSAgaWYgKG5ld2NvdW50ID4gMCkgewotICAgIHVwYl9pbnR0YWJsZV9pbnNlcnQyKHJlZjIsICh1aW50cHRyX3Qpc3Vib2JqLCB1cGJfdmFsdWVfaW50MzIobmV3Y291bnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICZ1cGJfYWxsb2NfZGVidWdyZWZzKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCB2aXNpdChjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWRfdmlzaXQgKnYsCi0gICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKSB7Ci0gIC8qIEluIERFQlVHX1JFRlMgbW9kZSB3ZSBrbm93IHdoYXQgZXhpc3RpbmcgcmVmMiByZWZzIHRoZXJlIGFyZSwgc28gd2Uga25vdwotICAgKiBleGFjdGx5IHRoZSBzZXQgb2Ygbm9kZXMgdGhhdCB2aXNpdCgpIHNob3VsZCB2aXNpdC4gIFNvIHdlIHZlcmlmeSB2aXNpdCgpJ3MKLSAgICogY29ycmVjdG5lc3MgaGVyZS4gKi8KLSAgY2hlY2tfc3RhdGUgc3RhdGU7Ci0gIHN0YXRlLm9iaiA9IHI7Ci0gIHVwYl9pbnR0YWJsZV9pbml0Migmc3RhdGUucmVmMiwgVVBCX0NUWVBFX0lOVDMyLCAmdXBiX2FsbG9jX2RlYnVncmVmcyk7Ci0gIGdldHJlZjJzKHIsICZzdGF0ZS5yZWYyKTsKLQotICAvKiBUaGlzIHNob3VsZCB2aXNpdCBhbnkgY2hpbGRyZW4gaW4gdGhlIHJlZjIgdGFibGUuICovCi0gIGlmIChyLT52dGJsLT52aXNpdCkgci0+dnRibC0+dmlzaXQociwgdmlzaXRfY2hlY2ssICZzdGF0ZSk7Ci0KLSAgLyogVGhpcyBhc3NlcnRpb24gd2lsbCBmYWlsIGlmIHRoZSB2aXNpdCgpIGZ1bmN0aW9uIG1pc3NlZCBhbnkgY2hpbGRyZW4uICovCi0gIGFzc2VydCh1cGJfaW50dGFibGVfY291bnQoJnN0YXRlLnJlZjIpID09IDApOwotICB1cGJfaW50dGFibGVfdW5pbml0Migmc3RhdGUucmVmMiwgJnVwYl9hbGxvY19kZWJ1Z3JlZnMpOwotICBpZiAoci0+dnRibC0+dmlzaXQpIHItPnZ0YmwtPnZpc2l0KHIsIHYsIGNsb3N1cmUpOwotfQotCi1zdGF0aWMgdm9pZCB0cmFja2luaXQodXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgci0+cmVmcyA9IHVwYl9tYWxsb2MoJnVwYl9hbGxvY19kZWJ1Z3JlZnMsIHNpemVvZigqci0+cmVmcykpOwotICByLT5yZWYycyA9IHVwYl9tYWxsb2MoJnVwYl9hbGxvY19kZWJ1Z3JlZnMsIHNpemVvZigqci0+cmVmMnMpKTsKLSAgdXBiX2ludHRhYmxlX2luaXQyKHItPnJlZnMsIFVQQl9DVFlQRV9QVFIsICZ1cGJfYWxsb2NfZGVidWdyZWZzKTsKLSAgdXBiX2ludHRhYmxlX2luaXQyKHItPnJlZjJzLCBVUEJfQ1RZUEVfUFRSLCAmdXBiX2FsbG9jX2RlYnVncmVmcyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHRyYWNrZnJlZShjb25zdCB1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfaW50dGFibGVfdW5pbml0MihyLT5yZWZzLCAmdXBiX2FsbG9jX2RlYnVncmVmcyk7Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQyKHItPnJlZjJzLCAmdXBiX2FsbG9jX2RlYnVncmVmcyk7Ci0gIHVwYl9mcmVlKCZ1cGJfYWxsb2NfZGVidWdyZWZzLCByLT5yZWZzKTsKLSAgdXBiX2ZyZWUoJnVwYl9hbGxvY19kZWJ1Z3JlZnMsIHItPnJlZjJzKTsKLX0KLQotI2Vsc2UKLQotc3RhdGljIHZvaWQgdHJhY2soY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyLCBib29sIHJlZjIpIHsKLSAgVVBCX1VOVVNFRChyKTsKLSAgVVBCX1VOVVNFRChvd25lcik7Ci0gIFVQQl9VTlVTRUQocmVmMik7Ci19Ci0KLXN0YXRpYyB2b2lkIHVudHJhY2soY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyLCBib29sIHJlZjIpIHsKLSAgVVBCX1VOVVNFRChyKTsKLSAgVVBCX1VOVVNFRChvd25lcik7Ci0gIFVQQl9VTlVTRUQocmVmMik7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrcmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lciwgYm9vbCByZWYyKSB7Ci0gIFVQQl9VTlVTRUQocik7Ci0gIFVQQl9VTlVTRUQob3duZXIpOwotICBVUEJfVU5VU0VEKHJlZjIpOwotfQotCi1zdGF0aWMgdm9pZCB0cmFja2luaXQodXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgVVBCX1VOVVNFRChyKTsKLX0KLQotc3RhdGljIHZvaWQgdHJhY2tmcmVlKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIFVQQl9VTlVTRUQocik7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpc2l0KGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZF92aXNpdCAqdiwKLSAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgaWYgKHItPnZ0YmwtPnZpc2l0KSByLT52dGJsLT52aXNpdChyLCB2LCBjbG9zdXJlKTsKLX0KLQotI2VuZGlmICAvKiBVUEJfREVCVUdfUkVGUyAqLwotCi0KLS8qIGZyZWV6ZSgpICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFRoZSBmcmVlemUoKSBvcGVyYXRpb24gaXMgYnkgZmFyIHRoZSBtb3N0IGNvbXBsaWNhdGVkIHBhcnQgb2YgdGhpcyBzY2hlbWUuCi0gKiBXZSBjb21wdXRlIHN0cm9uZ2x5LWNvbm5lY3RlZCBjb21wb25lbnRzIGFuZCB0aGVuIG11dGF0ZSB0aGUgZ3JhcGggc3VjaCB0aGF0Ci0gKiB3ZSBwcmVzZXJ2ZSB0aGUgaW52YXJpYW50cyBkb2N1bWVudGVkIGF0IHRoZSB0b3Agb2YgdGhpcyBmaWxlLiAgQW5kIHdlIG11c3QKLSAqIGhhbmRsZSBvdXQtb2YtbWVtb3J5IGVycm9ycyBncmFjZWZ1bGx5ICh3aXRob3V0IGxlYXZpbmcgdGhlIGdyYXBoCi0gKiBpbmNvbnNpc3RlbnQpLCB3aGljaCBhZGRzIHRvIHRoZSBmdW4uICovCi0KLS8qIFRoZSBzdGF0ZSB1c2VkIGJ5IHRoZSBmcmVlemUgb3BlcmF0aW9uIChzaGFyZWQgYWNyb3NzIG1hbnkgZnVuY3Rpb25zKS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgaW50IGRlcHRoOwotICBpbnQgbWF4ZGVwdGg7Ci0gIHVpbnQ2NF90IGluZGV4OwotICAvKiBNYXBzIHVwYl9yZWZjb3VudGVkKiAtPiBhdHRyaWJ1dGVzIChjb2xvciwgZXRjKS4gIGF0dHIgbGF5b3V0IHZhcmllcyBieQotICAgKiBjb2xvci4gKi8KLSAgdXBiX2ludHRhYmxlIG9iamF0dHI7Ci0gIHVwYl9pbnR0YWJsZSBzdGFjazsgICAvKiBzdGFjayBvZiB1cGJfcmVmY291bnRlZCogZm9yIFRhcmphbidzIGFsZ29yaXRobS4gKi8KLSAgdXBiX2ludHRhYmxlIGdyb3VwczsgIC8qIGFycmF5IG9mIHVpbnQzMl90KiwgbWFsbG9jJ2QgcmVmY291bnRzIGZvciBuZXcgZ3JvdXBzICovCi0gIHVwYl9zdGF0dXMgKnN0YXR1czsKLSAgam1wX2J1ZiBlcnI7Ci19IHRhcmphbjsKLQotc3RhdGljIHZvaWQgcmVsZWFzZV9yZWYyKGNvbnN0IHVwYl9yZWZjb3VudGVkICpvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnN1Ym9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICpjbG9zdXJlKTsKLQotLyogTm9kZSBhdHRyaWJ1dGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KLQotLyogQWZ0ZXIgb3VyIGFuYWx5c2lzIHBoYXNlIGFsbCBub2RlcyB3aWxsIGJlIGVpdGhlciBHUkFZIG9yIFdISVRFLiAqLwotCi10eXBlZGVmIGVudW0gewotICBCTEFDSyA9IDAsICAvKiBPYmplY3QgaGFzIG5vdCBiZWVuIHNlZW4uICovCi0gIEdSQVksICAgLyogT2JqZWN0IGhhcyBiZWVuIGZvdW5kIHZpYSBhIHJlZmdyb3VwIGJ1dCBtYXkgbm90IGJlIHJlYWNoYWJsZS4gKi8KLSAgR1JFRU4sICAvKiBPYmplY3QgaXMgcmVhY2hhYmxlIGFuZCBpcyBjdXJyZW50bHkgb24gdGhlIFRhcmphbiBzdGFjay4gKi8KLSAgV0hJVEUgICAvKiBPYmplY3QgaXMgcmVhY2hhYmxlIGFuZCBoYXMgYmVlbiBhc3NpZ25lZCBhIGdyb3VwIChTQ0MpLiAqLwotfSBjb2xvcl90OwotCi1VUEJfTk9SRVRVUk4gc3RhdGljIHZvaWQgZXJyKHRhcmphbiAqdCkgeyBsb25nam1wKHQtPmVyciwgMSk7IH0KLVVQQl9OT1JFVFVSTiBzdGF0aWMgdm9pZCBvb20odGFyamFuICp0KSB7Ci0gIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHQtPnN0YXR1cywgIm91dCBvZiBtZW1vcnkiKTsKLSAgZXJyKHQpOwotfQotCi1zdGF0aWMgdWludDY0X3QgdHJ5Z2V0YXR0cihjb25zdCB0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHVwYl92YWx1ZSB2OwotICByZXR1cm4gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmdC0+b2JqYXR0ciwgciwgJnYpID8KLSAgICAgIHVwYl92YWx1ZV9nZXR1aW50NjQodikgOiAwOwotfQotCi1zdGF0aWMgdWludDY0X3QgZ2V0YXR0cihjb25zdCB0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIGZvdW5kID0gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmdC0+b2JqYXR0ciwgciwgJnYpOwotICBVUEJfQVNTRVJUX1ZBUihmb3VuZCwgZm91bmQpOwotICByZXR1cm4gdXBiX3ZhbHVlX2dldHVpbnQ2NCh2KTsKLX0KLQotc3RhdGljIHZvaWQgc2V0YXR0cih0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1aW50NjRfdCBhdHRyKSB7Ci0gIHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIoJnQtPm9iamF0dHIsIHIsIE5VTEwpOwotICB1cGJfaW50dGFibGVfaW5zZXJ0cHRyKCZ0LT5vYmphdHRyLCByLCB1cGJfdmFsdWVfdWludDY0KGF0dHIpKTsKLX0KLQotc3RhdGljIGNvbG9yX3QgY29sb3IodGFyamFuICp0LCBjb25zdCB1cGJfcmVmY291bnRlZCAqcikgewotICByZXR1cm4gdHJ5Z2V0YXR0cih0LCByKSAmIDB4MzsgIC8qIENvbG9yIGlzIGFsd2F5cyBzdG9yZWQgaW4gdGhlIGxvdyAyIGJpdHMuICovCi19Ci0KLXN0YXRpYyB2b2lkIHNldF9ncmF5KHRhcmphbiAqdCwgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IEJMQUNLKTsKLSAgc2V0YXR0cih0LCByLCBHUkFZKTsKLX0KLQotLyogUHVzaGVzIGFuIG9iaiBvbnRvIHRoZSBUYXJqYW4gc3RhY2sgYW5kIHNldHMgaXQgdG8gR1JFRU4uICovCi1zdGF0aWMgdm9pZCBwdXNoKHRhcmphbiAqdCwgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IEJMQUNLIHx8IGNvbG9yKHQsIHIpID09IEdSQVkpOwotICAvKiBUaGlzIGRlZmluZXMgdGhlIGF0dHIgbGF5b3V0IGZvciB0aGUgR1JFRU4gc3RhdGUuICAiaW5kZXgiIGFuZCAibG93bGluayIKLSAgICogZ2V0IDMxIGJpdHMsIHdoaWNoIGlzIHBsZW50eSAobGltaXQgb2YgMkIgb2JqZWN0cyBmcm96ZW4gYXQgYSB0aW1lKS4gKi8KLSAgc2V0YXR0cih0LCByLCBHUkVFTiB8ICh0LT5pbmRleCA8PCAyKSB8ICh0LT5pbmRleCA8PCAzMykpOwotICBpZiAoKyt0LT5pbmRleCA9PSAweDgwMDAwMDAwKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2codC0+c3RhdHVzLCAidG9vIG1hbnkgb2JqZWN0cyB0byBmcmVlemUiKTsKLSAgICBlcnIodCk7Ci0gIH0KLSAgdXBiX2ludHRhYmxlX3B1c2goJnQtPnN0YWNrLCB1cGJfdmFsdWVfcHRyKCh2b2lkKilyKSk7Ci19Ci0KLS8qIFBvcHMgYW4gb2JqIGZyb20gdGhlIFRhcmphbiBzdGFjayBhbmQgc2V0cyBpdCB0byBXSElURSwgd2l0aCBhIHB0ciB0byBpdHMKLSAqIFNDQyBncm91cC4gKi8KLXN0YXRpYyB1cGJfcmVmY291bnRlZCAqcG9wKHRhcmphbiAqdCkgewotICB1cGJfcmVmY291bnRlZCAqciA9IHVwYl92YWx1ZV9nZXRwdHIodXBiX2ludHRhYmxlX3BvcCgmdC0+c3RhY2spKTsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IEdSRUVOKTsKLSAgLyogVGhpcyBkZWZpbmVzIHRoZSBhdHRyIGxheW91dCBmb3Igbm9kZXMgaW4gdGhlIFdISVRFIHN0YXRlLgotICAgKiBUb3Agb2YgZ3JvdXAgc3RhY2sgaXMgW2dyb3VwLCBOVUxMXTsgd2UgcG9pbnQgYXQgZ3JvdXAuICovCi0gIHNldGF0dHIodCwgciwgV0hJVEUgfCAodXBiX2ludHRhYmxlX2NvdW50KCZ0LT5ncm91cHMpIC0gMikgPDwgOCk7Ci0gIHJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCB0YXJqYW5fbmV3Z3JvdXAodGFyamFuICp0KSB7Ci0gIHVpbnQzMl90ICpncm91cCA9IHVwYl9nbWFsbG9jKHNpemVvZigqZ3JvdXApKTsKLSAgaWYgKCFncm91cCkgb29tKHQpOwotICAvKiBQdXNoIGdyb3VwIGFuZCBlbXB0eSBncm91cCBsZWFkZXIgKHdlJ2xsIGZpbGwgaW4gbGVhZGVyIGxhdGVyKS4gKi8KLSAgaWYgKCF1cGJfaW50dGFibGVfcHVzaCgmdC0+Z3JvdXBzLCB1cGJfdmFsdWVfcHRyKGdyb3VwKSkgfHwKLSAgICAgICF1cGJfaW50dGFibGVfcHVzaCgmdC0+Z3JvdXBzLCB1cGJfdmFsdWVfcHRyKE5VTEwpKSkgewotICAgIHVwYl9nZnJlZShncm91cCk7Ci0gICAgb29tKHQpOwotICB9Ci0gICpncm91cCA9IDA7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBpZHgodGFyamFuICp0LCBjb25zdCB1cGJfcmVmY291bnRlZCAqcikgewotICBhc3NlcnQoY29sb3IodCwgcikgPT0gR1JFRU4pOwotICByZXR1cm4gKGdldGF0dHIodCwgcikgPj4gMikgJiAweDdGRkZGRkZGOwotfQotCi1zdGF0aWMgdWludDMyX3QgbG93bGluayh0YXJqYW4gKnQsIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIGlmIChjb2xvcih0LCByKSA9PSBHUkVFTikgewotICAgIHJldHVybiBnZXRhdHRyKHQsIHIpID4+IDMzOwotICB9IGVsc2UgewotICAgIHJldHVybiBVSU5UMzJfTUFYOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9sb3dsaW5rKHRhcmphbiAqdCwgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVpbnQzMl90IGxvd2xpbmspIHsKLSAgYXNzZXJ0KGNvbG9yKHQsIHIpID09IEdSRUVOKTsKLSAgc2V0YXR0cih0LCByLCAoKHVpbnQ2NF90KWxvd2xpbmsgPDwgMzMpIHwgKGdldGF0dHIodCwgcikgJiAweDFGRkZGRkZGRikpOwotfQotCi1zdGF0aWMgdWludDMyX3QgKmdyb3VwKHRhcmphbiAqdCwgdXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgdWludDY0X3QgZ3JvdXBudW07Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIGZvdW5kOwotCi0gIGFzc2VydChjb2xvcih0LCByKSA9PSBXSElURSk7Ci0gIGdyb3VwbnVtID0gZ2V0YXR0cih0LCByKSA+PiA4OwotICBmb3VuZCA9IHVwYl9pbnR0YWJsZV9sb29rdXAoJnQtPmdyb3VwcywgZ3JvdXBudW0sICZ2KTsKLSAgVVBCX0FTU0VSVF9WQVIoZm91bmQsIGZvdW5kKTsKLSAgcmV0dXJuIHVwYl92YWx1ZV9nZXRwdHIodik7Ci19Ci0KLS8qIElmIHRoZSBncm91cCBsZWFkZXIgZm9yIHRoaXMgb2JqZWN0J3MgZ3JvdXAgaGFzIG5vdCBwcmV2aW91c2x5IGJlZW4gc2V0LAotICogdGhlIGdpdmVuIG9iamVjdCBpcyBhc3NpZ25lZCB0byBiZSBpdHMgbGVhZGVyLiAqLwotc3RhdGljIHVwYl9yZWZjb3VudGVkICpncm91cGxlYWRlcih0YXJqYW4gKnQsIHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHVpbnQ2NF90IGxlYWRlcl9zbG90OwotICB1cGJfdmFsdWUgdjsKLSAgYm9vbCBmb3VuZDsKLQotICBhc3NlcnQoY29sb3IodCwgcikgPT0gV0hJVEUpOwotICBsZWFkZXJfc2xvdCA9IChnZXRhdHRyKHQsIHIpID4+IDgpICsgMTsKLSAgZm91bmQgPSB1cGJfaW50dGFibGVfbG9va3VwKCZ0LT5ncm91cHMsIGxlYWRlcl9zbG90LCAmdik7Ci0gIFVQQl9BU1NFUlRfVkFSKGZvdW5kLCBmb3VuZCk7Ci0gIGlmICh1cGJfdmFsdWVfZ2V0cHRyKHYpKSB7Ci0gICAgcmV0dXJuIHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gIH0gZWxzZSB7Ci0gICAgdXBiX2ludHRhYmxlX3JlbW92ZSgmdC0+Z3JvdXBzLCBsZWFkZXJfc2xvdCwgTlVMTCk7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydCgmdC0+Z3JvdXBzLCBsZWFkZXJfc2xvdCwgdXBiX3ZhbHVlX3B0cihyKSk7Ci0gICAgcmV0dXJuIHI7Ci0gIH0KLX0KLQotCi0vKiBUYXJqYW4ncyBhbGdvcml0aG0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwotCi0vKiBTZWU6Ci0gKiAgIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvVGFyamFuJTI3c19zdHJvbmdseV9jb25uZWN0ZWRfY29tcG9uZW50c19hbGdvcml0aG0gKi8KLXN0YXRpYyB2b2lkIGRvX3Rhcmphbihjb25zdCB1cGJfcmVmY291bnRlZCAqb2JqLCB0YXJqYW4gKnQpOwotCi1zdGF0aWMgdm9pZCB0YXJqYW5fdmlzaXQoY29uc3QgdXBiX3JlZmNvdW50ZWQgKm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfcmVmY291bnRlZCAqc3Vib2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgdGFyamFuICp0ID0gY2xvc3VyZTsKLSAgaWYgKCsrdC0+ZGVwdGggPiB0LT5tYXhkZXB0aCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZih0LT5zdGF0dXMsICJncmFwaCB0b28gZGVlcCB0byBmcmVlemUgKCVkKSIsIHQtPm1heGRlcHRoKTsKLSAgICBlcnIodCk7Ci0gIH0gZWxzZSBpZiAoc3Vib2JqLT5pc19mcm96ZW4gfHwgY29sb3IodCwgc3Vib2JqKSA9PSBXSElURSkgewotICAgIC8qIERvIG5vdGhpbmc6IHdlIGRvbid0IHdhbnQgdG8gdmlzaXQgb3IgY29sb3IgYWxyZWFkeS1mcm96ZW4gbm9kZXMsCi0gICAgICogYW5kIFdISVRFIG5vZGVzIGhhdmUgYWxyZWFkeSBiZWVuIGFzc2lnbmVkIGEgU0NDLiAqLwotICB9IGVsc2UgaWYgKGNvbG9yKHQsIHN1Ym9iaikgPCBHUkVFTikgewotICAgIC8qIFN1YmRlZiBoYXMgbm90IHlldCBiZWVuIHZpc2l0ZWQ7IHJlY3Vyc2Ugb24gaXQuICovCi0gICAgZG9fdGFyamFuKHN1Ym9iaiwgdCk7Ci0gICAgc2V0X2xvd2xpbmsodCwgb2JqLCBVUEJfTUlOKGxvd2xpbmsodCwgb2JqKSwgbG93bGluayh0LCBzdWJvYmopKSk7Ci0gIH0gZWxzZSBpZiAoY29sb3IodCwgc3Vib2JqKSA9PSBHUkVFTikgewotICAgIC8qIFN1YmRlZiBpcyBpbiB0aGUgc3RhY2sgYW5kIGhlbmNlIGluIHRoZSBjdXJyZW50IFNDQy4gKi8KLSAgICBzZXRfbG93bGluayh0LCBvYmosIFVQQl9NSU4obG93bGluayh0LCBvYmopLCBpZHgodCwgc3Vib2JqKSkpOwotICB9Ci0gIC0tdC0+ZGVwdGg7Ci19Ci0KLXN0YXRpYyB2b2lkIGRvX3Rhcmphbihjb25zdCB1cGJfcmVmY291bnRlZCAqb2JqLCB0YXJqYW4gKnQpIHsKLSAgaWYgKGNvbG9yKHQsIG9iaikgPT0gQkxBQ0spIHsKLSAgICAvKiBXZSBoYXZlbid0IHNlZW4gdGhpcyBvYmplY3QncyBncm91cDsgbWFyayB0aGUgd2hvbGUgZ3JvdXAgR1JBWS4gKi8KLSAgICBjb25zdCB1cGJfcmVmY291bnRlZCAqbyA9IG9iajsKLSAgICBkbyB7IHNldF9ncmF5KHQsIG8pOyB9IHdoaWxlICgobyA9IG8tPm5leHQpICE9IG9iaik7Ci0gIH0KLQotICBwdXNoKHQsIG9iaik7Ci0gIHZpc2l0KG9iaiwgdGFyamFuX3Zpc2l0LCB0KTsKLSAgaWYgKGxvd2xpbmsodCwgb2JqKSA9PSBpZHgodCwgb2JqKSkgewotICAgIHRhcmphbl9uZXdncm91cCh0KTsKLSAgICB3aGlsZSAocG9wKHQpICE9IG9iaikKLSAgICAgIDsKLSAgfQotfQotCi0KLS8qIGZyZWV6ZSgpIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCi0KLXN0YXRpYyB2b2lkIGNyb3NzcmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB1cGJfcmVmY291bnRlZCAqc3Vib2JqLAotICAgICAgICAgICAgICAgICAgICAgdm9pZCAqX3QpIHsKLSAgdGFyamFuICp0ID0gX3Q7Ci0gIGFzc2VydChjb2xvcih0LCByKSA+IEJMQUNLKTsKLSAgaWYgKGNvbG9yKHQsIHN1Ym9iaikgPiBCTEFDSyAmJiByLT5ncm91cCAhPSBzdWJvYmotPmdyb3VwKSB7Ci0gICAgLyogUHJldmlvdXNseSB0aGlzIHJlZiB3YXMgbm90IHJlZmxlY3RlZCBpbiBzdWJvYmotPmdyb3VwIGJlY2F1c2UgdGhleQotICAgICAqIHdlcmUgaW4gdGhlIHNhbWUgZ3JvdXA7IG5vdyB0aGF0IHRoZXkgYXJlIHNwbGl0IGEgcmVmIG11c3QgYmUgdGFrZW4uICovCi0gICAgcmVmZ3JvdXAoc3Vib2JqLT5ncm91cCk7Ci0gIH0KLX0KLQotc3RhdGljIGJvb2wgZnJlZXplKHVwYl9yZWZjb3VudGVkICpjb25zdCpyb290cywgaW50IG4sIHVwYl9zdGF0dXMgKnMsCi0gICAgICAgICAgICAgICAgICAgaW50IG1heGRlcHRoKSB7Ci0gIHZvbGF0aWxlIGJvb2wgcmV0ID0gZmFsc2U7Ci0gIGludCBpOwotICB1cGJfaW50dGFibGVfaXRlciBpdGVyOwotCi0gIC8qIFdlIHJ1biBpbiB0d28gcGFzc2VzIHNvIHRoYXQgd2UgY2FuIGFsbG9jYXRlIGFsbCBtZW1vcnkgYmVmb3JlIHBlcmZvcm1pbmcKLSAgICogYW55IG11dGF0aW9uIG9mIHRoZSBpbnB1dCAtLSB0aGlzIGFsbG93cyB1cyB0byBsZWF2ZSB0aGUgaW5wdXQgdW5jaGFuZ2VkCi0gICAqIGluIHRoZSBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWx1cmUuICovCi0gIHRhcmphbiB0OwotICB0LmluZGV4ID0gMDsKLSAgdC5kZXB0aCA9IDA7Ci0gIHQubWF4ZGVwdGggPSBtYXhkZXB0aDsKLSAgdC5zdGF0dXMgPSBzOwotICBpZiAoIXVwYl9pbnR0YWJsZV9pbml0KCZ0Lm9iamF0dHIsIFVQQl9DVFlQRV9VSU5UNjQpKSBnb3RvIGVycjE7Ci0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoJnQuc3RhY2ssIFVQQl9DVFlQRV9QVFIpKSBnb3RvIGVycjI7Ci0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoJnQuZ3JvdXBzLCBVUEJfQ1RZUEVfUFRSKSkgZ290byBlcnIzOwotICBpZiAoc2V0am1wKHQuZXJyKSAhPSAwKSBnb3RvIGVycjQ7Ci0KLQotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgaWYgKGNvbG9yKCZ0LCByb290c1tpXSkgPCBHUkVFTikgewotICAgICAgZG9fdGFyamFuKHJvb3RzW2ldLCAmdCk7Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgd2UndmUgbWFkZSBpdCB0aGlzIGZhciwgbm8gZnVydGhlciBlcnJvcnMgYXJlIHBvc3NpYmxlIHNvIGl0J3Mgc2FmZSB0bwotICAgKiBtdXRhdGUgdGhlIG9iamVjdHMgd2l0aG91dCByaXNrIG9mIGxlYXZpbmcgdGhlbSBpbiBhbiBpbmNvbnNpc3RlbnQgc3RhdGUuICovCi0gIHJldCA9IHRydWU7Ci0KLSAgLyogVGhlIHRyYW5zZm9ybWF0aW9uIHRoYXQgZm9sbG93cyByZXF1aXJlcyBjYXJlLiAgVGhlIHByZWNvbmRpdGlvbnMgYXJlOgotICAgKiAtIGFsbCBvYmplY3RzIGluIGF0dHIgbWFwIGFyZSBXSElURSBvciBHUkFZLCBhbmQgYXJlIGluIG11dGFibGUgZ3JvdXBzCi0gICAqICAgKGdyb3VwcyBvZiBhbGwgbXV0YWJsZSBvYmpzKQotICAgKiAtIG5vIHJlZjIodG8sIGZyb20pIHJlZnMgaGF2ZSBpbmNyZW1lbnRlZCBjb3VudCh0bykgaWYgYm90aCAidG8iIGFuZAotICAgKiAgICJmcm9tIiBhcmUgaW4gb3VyIGF0dHIgbWFwICh0aGlzIGZvbGxvd3MgZnJvbSBpbnZhcmlhbnRzICgyKSBhbmQgKDMpKSAqLwotCi0gIC8qIFBhc3MgMTogd2UgcmVtb3ZlIFdISVRFIG9iamVjdHMgZnJvbSB0aGVpciBtdXRhYmxlIGdyb3VwcywgYW5kIGFkZCB0aGVtIHRvCi0gICAqIG5ldyBncm91cHMgIGFjY29yZGluZyB0byB0aGUgU0NDJ3Mgd2UgY29tcHV0ZWQuICBUaGVzZSBuZXcgZ3JvdXBzIHdpbGwKLSAgICogY29uc2lzdCBvZiBvbmx5IGZyb3plbiBvYmplY3RzLiAgTm9uZSB3aWxsIGJlIGltbWVkaWF0ZWx5IGNvbGxlY3RpYmxlLAotICAgKiBiZWNhdXNlIFdISVRFIG9iamVjdHMgYXJlIGJ5IGRlZmluaXRpb24gcmVhY2hhYmxlIGZyb20gb25lIG9mICJyb290cyIsCi0gICAqIHdoaWNoIHRoZSBjYWxsZXIgbXVzdCBvd24gcmVmcyBvbi4gKi8KLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpdGVyLCAmdC5vYmphdHRyKTsKLSAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpdGVyKTsgdXBiX2ludHRhYmxlX25leHQoJml0ZXIpKSB7Ci0gICAgdXBiX3JlZmNvdW50ZWQgKm9iaiA9ICh1cGJfcmVmY291bnRlZCopdXBiX2ludHRhYmxlX2l0ZXJfa2V5KCZpdGVyKTsKLSAgICAvKiBTaW5jZSByZW1vdmFsIGZyb20gYSBzaW5nbHktbGlua2VkIGxpc3QgcmVxdWlyZXMgYWNjZXNzIHRvIHRoZSBvYmplY3QncwotICAgICAqIHByZWRlY2Vzc29yLCB3ZSBjb25zaWRlciBvYmotPm5leHQgaW5zdGVhZCBvZiBvYmogZm9yIG1vdmluZy4gIFdpdGggdGhlCi0gICAgICogd2hpbGUoKSBsb29wIHdlIGd1YXJhbnRlZSB0aGF0IHdlIHdpbGwgdmlzaXQgZXZlcnkgbm9kZSdzIHByZWRlY2Vzc29yLgotICAgICAqIFByb29mOgotICAgICAqICAxLiBldmVyeSBub2RlJ3MgcHJlZGVjZXNzb3IgaXMgaW4gb3VyIGF0dHIgbWFwLgotICAgICAqICAyLiB0aG91Z2ggdGhlIGxvb3AgYm9keSBtYXkgY2hhbmdlIGEgbm9kZSdzIHByZWRlY2Vzc29yLCBpdCB3aWxsIG9ubHkKLSAgICAgKiAgICAgY2hhbmdlIGl0IHRvIGJlIHRoZSBub2RlIHdlIGFyZSBjdXJyZW50bHkgb3BlcmF0aW5nIG9uLCBzbyB3aXRoIGEKLSAgICAgKiAgICAgd2hpbGUoKSBsb29wIHdlIGd1YXJhbnRlZSBvdXJzZWx2ZXMgdGhlIGNoYW5jZSB0byByZW1vdmUgZWFjaCBub2RlLiAqLwotICAgIHdoaWxlIChjb2xvcigmdCwgb2JqLT5uZXh0KSA9PSBXSElURSAmJgotICAgICAgICAgICBncm91cCgmdCwgb2JqLT5uZXh0KSAhPSBvYmotPm5leHQtPmdyb3VwKSB7Ci0gICAgICB1cGJfcmVmY291bnRlZCAqbGVhZGVyOwotCi0gICAgICAvKiBSZW1vdmUgZnJvbSBvbGQgZ3JvdXAuICovCi0gICAgICB1cGJfcmVmY291bnRlZCAqbW92ZSA9IG9iai0+bmV4dDsKLSAgICAgIGlmIChvYmogPT0gbW92ZSkgewotICAgICAgICAvKiBSZW1vdmluZyB0aGUgbGFzdCBvYmplY3QgZnJvbSBhIGdyb3VwLiAqLwotICAgICAgICBhc3NlcnQoKm9iai0+Z3JvdXAgPT0gb2JqLT5pbmRpdmlkdWFsX2NvdW50KTsKLSAgICAgICAgdXBiX2dmcmVlKG9iai0+Z3JvdXApOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgb2JqLT5uZXh0ID0gbW92ZS0+bmV4dDsKLSAgICAgICAgLyogVGhpcyBtYXkgZGVjcmVhc2UgdG8gemVybzsgd2UnbGwgY29sbGVjdCBHUkFZIG9iamVjdHMgKGlmIGFueSkgdGhhdAotICAgICAgICAgKiByZW1haW4gaW4gdGhlIGdyb3VwIGluIHRoZSB0aGlyZCBwYXNzLiAqLwotICAgICAgICBhc3NlcnQoKm1vdmUtPmdyb3VwID49IG1vdmUtPmluZGl2aWR1YWxfY291bnQpOwotICAgICAgICAqbW92ZS0+Z3JvdXAgLT0gbW92ZS0+aW5kaXZpZHVhbF9jb3VudDsKLSAgICAgIH0KLQotICAgICAgLyogQWRkIHRvIG5ldyBncm91cC4gKi8KLSAgICAgIGxlYWRlciA9IGdyb3VwbGVhZGVyKCZ0LCBtb3ZlKTsKLSAgICAgIGlmIChtb3ZlID09IGxlYWRlcikgewotICAgICAgICAvKiBGaXJzdCBvYmplY3QgYWRkZWQgdG8gbmV3IGdyb3VwIGlzIGl0cyBsZWFkZXIuICovCi0gICAgICAgIG1vdmUtPmdyb3VwID0gZ3JvdXAoJnQsIG1vdmUpOwotICAgICAgICBtb3ZlLT5uZXh0ID0gbW92ZTsKLSAgICAgICAgKm1vdmUtPmdyb3VwID0gbW92ZS0+aW5kaXZpZHVhbF9jb3VudDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8qIEdyb3VwIGFscmVhZHkgaGFzIGF0IGxlYXN0IG9uZSBvYmplY3QgaW4gaXQuICovCi0gICAgICAgIGFzc2VydChsZWFkZXItPmdyb3VwID09IGdyb3VwKCZ0LCBtb3ZlKSk7Ci0gICAgICAgIG1vdmUtPmdyb3VwID0gZ3JvdXAoJnQsIG1vdmUpOwotICAgICAgICBtb3ZlLT5uZXh0ID0gbGVhZGVyLT5uZXh0OwotICAgICAgICBsZWFkZXItPm5leHQgPSBtb3ZlOwotICAgICAgICAqbW92ZS0+Z3JvdXAgKz0gbW92ZS0+aW5kaXZpZHVhbF9jb3VudDsKLSAgICAgIH0KLQotICAgICAgbW92ZS0+aXNfZnJvemVuID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICAvKiBQYXNzIDI6IEdSQVkgYW5kIFdISVRFIG9iamVjdHMgIm9iaiIgd2l0aCByZWYyKHRvLCBvYmopIHJlZmVyZW5jZXMgbXVzdAotICAgKiBpbmNyZW1lbnQgY291bnQodG8pIGlmIGdyb3VwKG9iaikgIT0gZ3JvdXAodG8pICh3aGljaCBjb3VsZCBub3cgYmUgdGhlCi0gICAqIGNhc2UgaWYgInRvIiB3YXMganVzdCBmcm96ZW4pLiAqLwotICB1cGJfaW50dGFibGVfYmVnaW4oJml0ZXIsICZ0Lm9iamF0dHIpOwotICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJml0ZXIpOyB1cGJfaW50dGFibGVfbmV4dCgmaXRlcikpIHsKLSAgICB1cGJfcmVmY291bnRlZCAqb2JqID0gKHVwYl9yZWZjb3VudGVkKil1cGJfaW50dGFibGVfaXRlcl9rZXkoJml0ZXIpOwotICAgIHZpc2l0KG9iaiwgY3Jvc3NyZWYsICZ0KTsKLSAgfQotCi0gIC8qIFBhc3MgMzogR1JBWSBvYmplY3RzIGFyZSBjb2xsZWN0ZWQgaWYgdGhlaXIgZ3JvdXAncyByZWZjb3VudCBkcm9wcGVkIHRvCi0gICAqIHplcm8gd2hlbiB3ZSByZW1vdmVkIGl0cyB3aGl0ZSBub2Rlcy4gIFRoaXMgY2FuIGhhcHBlbiBpZiB0aGV5IGhhZCBvbmx5Ci0gICAqIGJlZW4ga2VwdCBhbGl2ZSBieSB2aXJ0dWUgb2Ygc2hhcmluZyBhIGdyb3VwIHdpdGggYW4gb2JqZWN0IHRoYXQgd2FzIGp1c3QKLSAgICogZnJvemVuLgotICAgKgotICAgKiBJdCBpcyBpbXBvcnRhbnQgdGhhdCB3ZSBkbyB0aGlzIGxhc3QsIHNpbmNlIHRoZSBHUkFZIG9iamVjdCdzIGZyZWUoKQotICAgKiBmdW5jdGlvbiBjb3VsZCBjYWxsIHVucmVmMigpIG9uIGp1c3QtZnJvemVuIG9iamVjdHMsIHdoaWNoIHdpbGwgZGVjcmVtZW50Ci0gICAqIHJlZnMgdGhhdCB3ZXJlIGFkZGVkIGluIHBhc3MgMi4gKi8KLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpdGVyLCAmdC5vYmphdHRyKTsKLSAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpdGVyKTsgdXBiX2ludHRhYmxlX25leHQoJml0ZXIpKSB7Ci0gICAgdXBiX3JlZmNvdW50ZWQgKm9iaiA9ICh1cGJfcmVmY291bnRlZCopdXBiX2ludHRhYmxlX2l0ZXJfa2V5KCZpdGVyKTsKLSAgICBpZiAob2JqLT5ncm91cCA9PSBOVUxMIHx8ICpvYmotPmdyb3VwID09IDApIHsKLSAgICAgIGlmIChvYmotPmdyb3VwKSB7Ci0gICAgICAgIHVwYl9yZWZjb3VudGVkICpvOwotCi0gICAgICAgIC8qIFdlIGVhZ2VybHkgZnJlZSgpIHRoZSBncm91cCdzIGNvdW50IChzaW5jZSB3ZSBjYW4ndCBlYXNpbHkgZGV0ZXJtaW5lCi0gICAgICAgICAqIHRoZSBncm91cCdzIHJlbWFpbmluZyBzaXplIGl0J3MgdGhlIGVhc2llc3Qgd2F5IHRvIGVuc3VyZSBpdCBnZXRzCi0gICAgICAgICAqIGRvbmUpLiAqLwotICAgICAgICB1cGJfZ2ZyZWUob2JqLT5ncm91cCk7Ci0KLSAgICAgICAgLyogVmlzaXQgdG8gcmVsZWFzZSByZWYyJ3MgKGRvbmUgaW4gYSBzZXBhcmF0ZSBwYXNzIHNpbmNlIHJlbGVhc2VfcmVmMgotICAgICAgICAgKiBkZXBlbmRzIG9uIG8tPmdyb3VwIGJlaW5nIHVubW9kaWZpZWQgc28gaXQgY2FuIHRlc3QgbWVyZ2VkKCkpLiAqLwotICAgICAgICBvID0gb2JqOwotICAgICAgICBkbyB7IHZpc2l0KG8sIHJlbGVhc2VfcmVmMiwgTlVMTCk7IH0gd2hpbGUgKChvID0gby0+bmV4dCkgIT0gb2JqKTsKLQotICAgICAgICAvKiBNYXJrICJncm91cCIgZmllbGRzIGFzIE5VTEwgc28gd2Uga25vdyB0byBmcmVlIHRoZSBvYmplY3RzIGxhdGVyIGluCi0gICAgICAgICAqIHRoaXMgbG9vcCwgYnV0IGFsc28gZG9uJ3QgdHJ5IHRvIGRlbGV0ZSB0aGUgZ3JvdXAgdHdpY2UuICovCi0gICAgICAgIG8gPSBvYmo7Ci0gICAgICAgIGRvIHsgby0+Z3JvdXAgPSBOVUxMOyB9IHdoaWxlICgobyA9IG8tPm5leHQpICE9IG9iaik7Ci0gICAgICB9Ci0gICAgICBmcmVlb2JqKG9iaik7Ci0gICAgfQotICB9Ci0KLWVycjQ6Ci0gIGlmICghcmV0KSB7Ci0gICAgdXBiX2ludHRhYmxlX2JlZ2luKCZpdGVyLCAmdC5ncm91cHMpOwotICAgIGZvcig7ICF1cGJfaW50dGFibGVfZG9uZSgmaXRlcik7IHVwYl9pbnR0YWJsZV9uZXh0KCZpdGVyKSkKLSAgICAgIHVwYl9nZnJlZSh1cGJfdmFsdWVfZ2V0cHRyKHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKCZpdGVyKSkpOwotICB9Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoJnQuZ3JvdXBzKTsKLWVycjM6Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoJnQuc3RhY2spOwotZXJyMjoKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmdC5vYmphdHRyKTsKLWVycjE6Ci0gIHJldHVybiByZXQ7Ci19Ci0KLQotLyogTWlzYyBpbnRlcm5hbCBmdW5jdGlvbnMgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgbWVyZ2VkKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB1cGJfcmVmY291bnRlZCAqcjIpIHsKLSAgcmV0dXJuIHItPmdyb3VwID09IHIyLT5ncm91cDsKLX0KLQotc3RhdGljIHZvaWQgbWVyZ2UodXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkICpmcm9tKSB7Ci0gIHVwYl9yZWZjb3VudGVkICpiYXNlOwotICB1cGJfcmVmY291bnRlZCAqdG1wOwotCi0gIGlmIChtZXJnZWQociwgZnJvbSkpIHJldHVybjsKLSAgKnItPmdyb3VwICs9ICpmcm9tLT5ncm91cDsKLSAgdXBiX2dmcmVlKGZyb20tPmdyb3VwKTsKLSAgYmFzZSA9IGZyb207Ci0KLSAgLyogU2V0IGFsbCByZWZjb3VudCBwb2ludGVycyBpbiB0aGUgImZyb20iIGNoYWluIHRvIHRoZSBtZXJnZWQgcmVmY291bnQuCi0gICAqCi0gICAqIFRPRE8oaGFiZXJtYW4pOiB0aGlzIGxpbmVhciBhbGdvcml0aG0gY2FuIHJlc3VsdCBpbiBhbiBvdmVyYWxsIE8obl4yKSBib3VuZAotICAgKiBpZiB0aGUgdXNlciBjb250aW51b3VzbHkgZXh0ZW5kcyBhIGdyb3VwIGJ5IG9uZSBvYmplY3QuICBQcmV2ZW50IHRoaXMgYnkKLSAgICogdXNpbmcgb25lIG9mIHRoZSB0ZWNobmlxdWVzIGluIHRoaXMgcGFwZXI6Ci0gICAqICAgICBmdHA6Ly93d3cubmNlZGMub3JnL291dGdvaW5nL2dlb21vcnBoL2Rpbm8vb3JhbHMvcDI0NS10YXJqYW4ucGRmICovCi0gIGRvIHsgZnJvbS0+Z3JvdXAgPSByLT5ncm91cDsgfSB3aGlsZSAoKGZyb20gPSBmcm9tLT5uZXh0KSAhPSBiYXNlKTsKLQotICAvKiBNZXJnZSB0aGUgdHdvIGNpcmN1bGFybHkgbGlua2VkIGxpc3RzIGJ5IHN3YXBwaW5nIHRoZWlyIG5leHQgcG9pbnRlcnMuICovCi0gIHRtcCA9IHItPm5leHQ7Ci0gIHItPm5leHQgPSBiYXNlLT5uZXh0OwotICBiYXNlLT5uZXh0ID0gdG1wOwotfQotCi1zdGF0aWMgdm9pZCB1bnJlZihjb25zdCB1cGJfcmVmY291bnRlZCAqcik7Ci0KLXN0YXRpYyB2b2lkIHJlbGVhc2VfcmVmMihjb25zdCB1cGJfcmVmY291bnRlZCAqb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICBVUEJfVU5VU0VEKGNsb3N1cmUpOwotICB1bnRyYWNrKHN1Ym9iaiwgb2JqLCB0cnVlKTsKLSAgaWYgKCFtZXJnZWQob2JqLCBzdWJvYmopKSB7Ci0gICAgYXNzZXJ0KHN1Ym9iai0+aXNfZnJvemVuKTsKLSAgICB1bnJlZihzdWJvYmopOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHVucmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIGlmICh1bnJlZmdyb3VwKHItPmdyb3VwKSkgewotICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpvOwotCi0gICAgdXBiX2dmcmVlKHItPmdyb3VwKTsKLQotICAgIC8qIEluIHR3byBwYXNzZXMsIHNpbmNlIHJlbGVhc2VfcmVmMiBuZWVkcyBhIGd1YXJhbnRlZSB0aGF0IGFueSBzdWJvYmpzCi0gICAgICogYXJlIGFsaXZlLiAqLwotICAgIG8gPSByOwotICAgIGRvIHsgdmlzaXQobywgcmVsZWFzZV9yZWYyLCBOVUxMKTsgfSB3aGlsZSgobyA9IG8tPm5leHQpICE9IHIpOwotCi0gICAgbyA9IHI7Ci0gICAgZG8gewotICAgICAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKm5leHQgPSBvLT5uZXh0OwotICAgICAgYXNzZXJ0KG8tPmlzX2Zyb3plbiB8fCBvLT5pbmRpdmlkdWFsX2NvdW50ID09IDApOwotICAgICAgZnJlZW9iaigodXBiX3JlZmNvdW50ZWQqKW8pOwotICAgICAgbyA9IG5leHQ7Ci0gICAgfSB3aGlsZShvICE9IHIpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVvYmoodXBiX3JlZmNvdW50ZWQgKm8pIHsKLSAgdHJhY2tmcmVlKG8pOwotICBvLT52dGJsLT5mcmVlKCh1cGJfcmVmY291bnRlZCopbyk7Ci19Ci0KLQotLyogUHVibGljIGludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotYm9vbCB1cGJfcmVmY291bnRlZF9pbml0KHVwYl9yZWZjb3VudGVkICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsICp2dGJsLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0jaWZuZGVmIE5ERUJVRwotICAvKiBFbmRpYW5uZXNzIGNoZWNrLiAgVGhpcyBpcyB1bnJlbGF0ZWQgdG8gdXBiX3JlZmNvdW50ZWQsIGl0J3MganVzdCBhCi0gICAqIGNvbnZlbmllbnQgcGxhY2UgdG8gcHV0IHRoZSBjaGVjayB0aGF0IHdlIGNhbiBiZSBhc3N1cmVkIHdpbGwgcnVuIGZvcgotICAgKiBiYXNpY2FsbHkgZXZlcnkgcHJvZ3JhbSB1c2luZyB1cGIuICovCi0gIGNvbnN0IGludCB4ID0gMTsKLSNpZmRlZiBVUEJfQklHX0VORElBTgotICBhc3NlcnQoKihjaGFyKikmeCAhPSAxKTsKLSNlbHNlCi0gIGFzc2VydCgqKGNoYXIqKSZ4ID09IDEpOwotI2VuZGlmCi0jZW5kaWYKLQotICByLT5uZXh0ID0gcjsKLSAgci0+dnRibCA9IHZ0Ymw7Ci0gIHItPmluZGl2aWR1YWxfY291bnQgPSAwOwotICByLT5pc19mcm96ZW4gPSBmYWxzZTsKLSAgci0+Z3JvdXAgPSB1cGJfZ21hbGxvYyhzaXplb2YoKnItPmdyb3VwKSk7Ci0gIGlmICghci0+Z3JvdXApIHJldHVybiBmYWxzZTsKLSAgKnItPmdyb3VwID0gMDsKLSAgdHJhY2tpbml0KHIpOwotICB1cGJfcmVmY291bnRlZF9yZWYociwgb3duZXIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfcmVmY291bnRlZF9pc2Zyb3plbihjb25zdCB1cGJfcmVmY291bnRlZCAqcikgewotICByZXR1cm4gci0+aXNfZnJvemVuOwotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3JlZihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgdHJhY2sociwgb3duZXIsIGZhbHNlKTsKLSAgaWYgKCFyLT5pc19mcm96ZW4pCi0gICAgKCh1cGJfcmVmY291bnRlZCopciktPmluZGl2aWR1YWxfY291bnQrKzsKLSAgcmVmZ3JvdXAoci0+Z3JvdXApOwotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3VucmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lcikgewotICB1bnRyYWNrKHIsIG93bmVyLCBmYWxzZSk7Ci0gIGlmICghci0+aXNfZnJvemVuKQotICAgICgodXBiX3JlZmNvdW50ZWQqKXIpLT5pbmRpdmlkdWFsX2NvdW50LS07Ci0gIHVucmVmKHIpOwotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3JlZjIoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkICpmcm9tKSB7Ci0gIGFzc2VydCghZnJvbS0+aXNfZnJvemVuKTsgIC8qIE5vbi1jb25zdCBwb2ludGVyIGltcGxpZXMgdGhpcy4gKi8KLSAgdHJhY2sociwgZnJvbSwgdHJ1ZSk7Ci0gIGlmIChyLT5pc19mcm96ZW4pIHsKLSAgICByZWZncm91cChyLT5ncm91cCk7Ci0gIH0gZWxzZSB7Ci0gICAgbWVyZ2UoKHVwYl9yZWZjb3VudGVkKilyLCBmcm9tKTsKLSAgfQotfQotCi12b2lkIHVwYl9yZWZjb3VudGVkX3VucmVmMihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgdXBiX3JlZmNvdW50ZWQgKmZyb20pIHsKLSAgYXNzZXJ0KCFmcm9tLT5pc19mcm96ZW4pOyAgLyogTm9uLWNvbnN0IHBvaW50ZXIgaW1wbGllcyB0aGlzLiAqLwotICB1bnRyYWNrKHIsIGZyb20sIHRydWUpOwotICBpZiAoci0+aXNfZnJvemVuKSB7Ci0gICAgdW5yZWYocik7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KG1lcmdlZChyLCBmcm9tKSk7Ci0gIH0KLX0KLQotdm9pZCB1cGJfcmVmY291bnRlZF9kb25hdGVyZWYoCi0gICAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvKSB7Ci0gIGFzc2VydChmcm9tICE9IHRvKTsKLSAgaWYgKHRvICE9IE5VTEwpCi0gICAgdXBiX3JlZmNvdW50ZWRfcmVmKHIsIHRvKTsKLSAgaWYgKGZyb20gIT0gTlVMTCkKLSAgICB1cGJfcmVmY291bnRlZF91bnJlZihyLCBmcm9tKTsKLX0KLQotdm9pZCB1cGJfcmVmY291bnRlZF9jaGVja3JlZihjb25zdCB1cGJfcmVmY291bnRlZCAqciwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgY2hlY2tyZWYociwgb3duZXIsIGZhbHNlKTsKLX0KLQotYm9vbCB1cGJfcmVmY291bnRlZF9mcmVlemUodXBiX3JlZmNvdW50ZWQgKmNvbnN0KnJvb3RzLCBpbnQgbiwgdXBiX3N0YXR1cyAqcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtYXhkZXB0aCkgewotICBpbnQgaTsKLSAgYm9vbCByZXQ7Ci0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICBhc3NlcnQoIXJvb3RzW2ldLT5pc19mcm96ZW4pOwotICB9Ci0gIHJldCA9IGZyZWV6ZShyb290cywgbiwgcywgbWF4ZGVwdGgpOwotICBhc3NlcnQoIXMgfHwgcmV0ID09IHVwYl9vayhzKSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLQotLyogRmFsbGJhY2sgaW1wbGVtZW50YXRpb24gaWYgdGhlIHNoaW0gaXMgbm90IHNwZWNpYWxpemVkIGJ5IHRoZSBKSVQuICovCi0jZGVmaW5lIFNISU1fV1JJVEVSKHR5cGUsIGN0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGJvb2wgdXBiX3NoaW1fc2V0ICMjIHR5cGUgKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCBjdHlwZSB2YWwpIHsgICAgICAgICAgICBcCi0gICAgdWludDhfdCAqbSA9IGM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY29uc3QgdXBiX3NoaW1fZGF0YSAqZCA9IGhkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGQtPmhhc2JpdCA+IDApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAqKHVpbnQ4X3QqKSZtW2QtPmhhc2JpdCAvIDhdIHw9IDEgPDwgKGQtPmhhc2JpdCAlIDgpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgKihjdHlwZSopJm1bZC0+b2Zmc2V0XSA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLVNISU1fV1JJVEVSKGRvdWJsZSwgZG91YmxlKQotU0hJTV9XUklURVIoZmxvYXQsICBmbG9hdCkKLVNISU1fV1JJVEVSKGludDMyLCAgaW50MzJfdCkKLVNISU1fV1JJVEVSKGludDY0LCAgaW50NjRfdCkKLVNISU1fV1JJVEVSKHVpbnQzMiwgdWludDMyX3QpCi1TSElNX1dSSVRFUih1aW50NjQsIHVpbnQ2NF90KQotU0hJTV9XUklURVIoYm9vbCwgICBib29sKQotI3VuZGVmIFNISU1fV1JJVEVSCi0KLWJvb2wgdXBiX3NoaW1fc2V0KHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBzaXplX3Qgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgaW50MzJfdCBoYXNiaXQpIHsKLSAgdXBiX2hhbmRsZXJhdHRyIGF0dHIgPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0gIGJvb2wgb2s7Ci0KLSAgdXBiX3NoaW1fZGF0YSAqZCA9IHVwYl9nbWFsbG9jKHNpemVvZigqZCkpOwotICBpZiAoIWQpIHJldHVybiBmYWxzZTsKLSAgZC0+b2Zmc2V0ID0gb2Zmc2V0OwotICBkLT5oYXNiaXQgPSBoYXNiaXQ7Ci0KLSAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKCZhdHRyLCBkKTsKLSAgdXBiX2hhbmRsZXJhdHRyX3NldGFsd2F5c29rKCZhdHRyLCB0cnVlKTsKLSAgdXBiX2hhbmRsZXJzX2FkZGNsZWFudXAoaCwgZCwgdXBiX2dmcmVlKTsKLQotI2RlZmluZSBUWVBFKHUsIGwpIFwKLSAgY2FzZSBVUEJfVFlQRV8jI3U6IFwKLSAgICBvayA9IHVwYl9oYW5kbGVyc19zZXQjI2woaCwgZiwgdXBiX3NoaW1fc2V0IyNsLCAmYXR0cik7IGJyZWFrOwotCi0gIG9rID0gZmFsc2U7Ci0KLSAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShmKSkgewotICAgIFRZUEUoSU5UNjQsICBpbnQ2NCk7Ci0gICAgVFlQRShJTlQzMiwgIGludDMyKTsKLSAgICBUWVBFKEVOVU0sICAgaW50MzIpOwotICAgIFRZUEUoVUlOVDY0LCB1aW50NjQpOwotICAgIFRZUEUoVUlOVDMyLCB1aW50MzIpOwotICAgIFRZUEUoRE9VQkxFLCBkb3VibGUpOwotICAgIFRZUEUoRkxPQVQsICBmbG9hdCk7Ci0gICAgVFlQRShCT09MLCAgIGJvb2wpOwotICAgIGRlZmF1bHQ6IGFzc2VydChmYWxzZSk7IGJyZWFrOwotICB9Ci0jdW5kZWYgVFlQRQotCi0gIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmF0dHIpOwotICByZXR1cm4gb2s7Ci19Ci0KLWNvbnN0IHVwYl9zaGltX2RhdGEgKnVwYl9zaGltX2dldGRhdGEoY29uc3QgdXBiX2hhbmRsZXJzICpoLCB1cGJfc2VsZWN0b3JfdCBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGR0eXBlX3QgKnR5cGUpIHsKLSAgdXBiX2Z1bmMgKmYgPSB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihoLCBzKTsKLQotICBpZiAoKHVwYl9pbnQ2NF9oYW5kbGVyZnVuYyopZiA9PSB1cGJfc2hpbV9zZXRpbnQ2NCkgewotICAgICp0eXBlID0gVVBCX1RZUEVfSU5UNjQ7Ci0gIH0gZWxzZSBpZiAoKHVwYl9pbnQzMl9oYW5kbGVyZnVuYyopZiA9PSB1cGJfc2hpbV9zZXRpbnQzMikgewotICAgICp0eXBlID0gVVBCX1RZUEVfSU5UMzI7Ci0gIH0gZWxzZSBpZiAoKHVwYl91aW50NjRfaGFuZGxlcmZ1bmMqKWYgPT0gdXBiX3NoaW1fc2V0dWludDY0KSB7Ci0gICAgKnR5cGUgPSBVUEJfVFlQRV9VSU5UNjQ7Ci0gIH0gZWxzZSBpZiAoKHVwYl91aW50MzJfaGFuZGxlcmZ1bmMqKWYgPT0gdXBiX3NoaW1fc2V0dWludDMyKSB7Ci0gICAgKnR5cGUgPSBVUEJfVFlQRV9VSU5UMzI7Ci0gIH0gZWxzZSBpZiAoKHVwYl9kb3VibGVfaGFuZGxlcmZ1bmMqKWYgPT0gdXBiX3NoaW1fc2V0ZG91YmxlKSB7Ci0gICAgKnR5cGUgPSBVUEJfVFlQRV9ET1VCTEU7Ci0gIH0gZWxzZSBpZiAoKHVwYl9mbG9hdF9oYW5kbGVyZnVuYyopZiA9PSB1cGJfc2hpbV9zZXRmbG9hdCkgewotICAgICp0eXBlID0gVVBCX1RZUEVfRkxPQVQ7Ci0gIH0gZWxzZSBpZiAoKHVwYl9ib29sX2hhbmRsZXJmdW5jKilmID09IHVwYl9zaGltX3NldGJvb2wpIHsKLSAgICAqdHlwZSA9IFVQQl9UWVBFX0JPT0w7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gKGNvbnN0IHVwYl9zaGltX2RhdGEqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShoLCBzKTsKLX0KLQotCi0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLXN0YXRpYyB2b2lkIHVwYl9zeW10YWJfZnJlZSh1cGJfcmVmY291bnRlZCAqcikgewotICB1cGJfc3ltdGFiICpzID0gKHVwYl9zeW10YWIqKXI7Ci0gIHVwYl9zdHJ0YWJsZV9pdGVyIGk7Ci0gIHVwYl9zdHJ0YWJsZV9iZWdpbigmaSwgJnMtPnN5bXRhYik7Ci0gIGZvciAoOyAhdXBiX3N0cnRhYmxlX2RvbmUoJmkpOyB1cGJfc3RydGFibGVfbmV4dCgmaSkpIHsKLSAgICBjb25zdCB1cGJfZGVmICpkZWYgPSB1cGJfdmFsdWVfZ2V0cHRyKHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKCZpKSk7Ci0gICAgdXBiX2RlZl91bnJlZihkZWYsIHMpOwotICB9Ci0gIHVwYl9zdHJ0YWJsZV91bmluaXQoJnMtPnN5bXRhYik7Ci0gIHVwYl9nZnJlZShzKTsKLX0KLQotdXBiX3N5bXRhYiAqdXBiX3N5bXRhYl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsIHZ0YmwgPSB7TlVMTCwgJnVwYl9zeW10YWJfZnJlZX07Ci0KLSAgdXBiX3N5bXRhYiAqcyA9IHVwYl9nbWFsbG9jKHNpemVvZigqcykpOwotICBpZiAoIXMpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHVwYl9yZWZjb3VudGVkX2luaXQodXBiX3N5bXRhYl91cGNhc3RfbXV0YWJsZShzKSwgJnZ0YmwsIG93bmVyKTsKLSAgdXBiX3N0cnRhYmxlX2luaXQoJnMtPnN5bXRhYiwgVVBCX0NUWVBFX1BUUik7Ci0gIHJldHVybiBzOwotfQotCi12b2lkIHVwYl9zeW10YWJfZnJlZXplKHVwYl9zeW10YWIgKnMpIHsKLSAgdXBiX3JlZmNvdW50ZWQgKnI7Ci0gIGJvb2wgb2s7Ci0KLSAgYXNzZXJ0KCF1cGJfc3ltdGFiX2lzZnJvemVuKHMpKTsKLSAgciA9IHVwYl9zeW10YWJfdXBjYXN0X211dGFibGUocyk7Ci0gIC8qIFRoZSBzeW10YWIgZG9lcyBub3QgdGFrZSByZWYyJ3MgKHNlZSByZWZjb3VudGVkLmgpIG9uIHRoZSBkZWZzLCBiZWNhdXNlCi0gICAqIGRlZnMgY2Fubm90IHJlZmVyIGJhY2sgdG8gdGhlIHRhYmxlIGFuZCB0aGVyZWZvcmUgY2Fubm90IGNyZWF0ZSBjeWNsZXMuICBTbwotICAgKiAwIHdpbGwgc3VmZmljZSBmb3IgbWF4ZGVwdGggaGVyZS4gKi8KLSAgb2sgPSB1cGJfcmVmY291bnRlZF9mcmVlemUoJnIsIDEsIE5VTEwsIDApOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotfQotCi1jb25zdCB1cGJfZGVmICp1cGJfc3ltdGFiX2xvb2t1cChjb25zdCB1cGJfc3ltdGFiICpzLCBjb25zdCBjaGFyICpzeW0pIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIHVwYl9kZWYgKnJldCA9IHVwYl9zdHJ0YWJsZV9sb29rdXAoJnMtPnN5bXRhYiwgc3ltLCAmdikgPwotICAgICAgdXBiX3ZhbHVlX2dldHB0cih2KSA6IE5VTEw7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYl9zeW10YWJfbG9va3VwbXNnKGNvbnN0IHVwYl9zeW10YWIgKnMsIGNvbnN0IGNoYXIgKnN5bSkgewotICB1cGJfdmFsdWUgdjsKLSAgdXBiX2RlZiAqZGVmID0gdXBiX3N0cnRhYmxlX2xvb2t1cCgmcy0+c3ltdGFiLCBzeW0sICZ2KSA/Ci0gICAgICB1cGJfdmFsdWVfZ2V0cHRyKHYpIDogTlVMTDsKLSAgcmV0dXJuIGRlZiA/IHVwYl9keW5jYXN0X21zZ2RlZihkZWYpIDogTlVMTDsKLX0KLQotY29uc3QgdXBiX2VudW1kZWYgKnVwYl9zeW10YWJfbG9va3VwZW51bShjb25zdCB1cGJfc3ltdGFiICpzLCBjb25zdCBjaGFyICpzeW0pIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIHVwYl9kZWYgKmRlZiA9IHVwYl9zdHJ0YWJsZV9sb29rdXAoJnMtPnN5bXRhYiwgc3ltLCAmdikgPwotICAgICAgdXBiX3ZhbHVlX2dldHB0cih2KSA6IE5VTEw7Ci0gIHJldHVybiBkZWYgPyB1cGJfZHluY2FzdF9lbnVtZGVmKGRlZikgOiBOVUxMOwotfQotCi0vKiBHaXZlbiBhIHN5bWJvbCBhbmQgdGhlIGJhc2Ugc3ltYm9sIGluc2lkZSB3aGljaCBpdCBpcyBkZWZpbmVkLCBmaW5kIHRoZQotICogc3ltYm9sJ3MgZGVmaW5pdGlvbiBpbiB0LiAqLwotc3RhdGljIHVwYl9kZWYgKnVwYl9yZXNvbHZlbmFtZShjb25zdCB1cGJfc3RydGFibGUgKnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJhc2UsIGNvbnN0IGNoYXIgKnN5bSkgewotICBpZihzdHJsZW4oc3ltKSA9PSAwKSByZXR1cm4gTlVMTDsKLSAgaWYoc3ltWzBdID09ICcuJykgewotICAgIC8qIFN5bWJvbHMgc3RhcnRpbmcgd2l0aCAnLicgYXJlIGFic29sdXRlLCBzbyB3ZSBkbyBhIHNpbmdsZSBsb29rdXAuCi0gICAgICogU2xpY2UgdG8gb21pdCB0aGUgbGVhZGluZyAnLicgKi8KLSAgICB1cGJfdmFsdWUgdjsKLSAgICByZXR1cm4gdXBiX3N0cnRhYmxlX2xvb2t1cCh0LCBzeW0gKyAxLCAmdikgPyB1cGJfdmFsdWVfZ2V0cHRyKHYpIDogTlVMTDsKLSAgfSBlbHNlIHsKLSAgICAvKiBSZW1vdmUgY29tcG9uZW50cyBmcm9tIGJhc2UgdW50aWwgd2UgZmluZCBhbiBlbnRyeSBvciBydW4gb3V0LgotICAgICAqIFRPRE86IFRoaXMgYnJhbmNoIGlzIHRvdGFsbHkgYnJva2VuLCBidXQgY3VycmVudGx5IG5vdCB1c2VkLiAqLwotICAgICh2b2lkKWJhc2U7Ci0gICAgYXNzZXJ0KGZhbHNlKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jb25zdCB1cGJfZGVmICp1cGJfc3ltdGFiX3Jlc29sdmUoY29uc3QgdXBiX3N5bXRhYiAqcywgY29uc3QgY2hhciAqYmFzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzeW0pIHsKLSAgdXBiX2RlZiAqcmV0ID0gdXBiX3Jlc29sdmVuYW1lKCZzLT5zeW10YWIsIGJhc2UsIHN5bSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIFN0YXJ0cyBhIGRlcHRoLWZpcnN0IHRyYXZlcnNhbCBhdCAiZGVmIiwgcmVjdXJzaW5nIGludG8gYW55IHN1YmRlZnMKLSAqIChpZS4gc3VibWVzc2FnZSB0eXBlcykuICBBZGRzIGR1cGxpY2F0ZXMgb2YgZXhpc3RpbmcgZGVmcyB0byBhZGR0YWIKLSAqIHdoZXJldmVyIG5lY2Vzc2FyeSwgc28gdGhhdCB0aGUgcmVzdWx0aW5nIHN5bXRhYiB3aWxsIGJlIGNvbnNpc3RlbnQgb25jZQotICogYWRkdGFiIGlzIGFkZGVkLgotICoKLSAqIE1vcmUgc3BlY2lmaWNhbGx5LCBpZiBhbnkgZGVmIEQgaXMgZm91bmQgaW4gdGhlIERGUyB0aGF0OgotICoKLSAqICAgMS4gY2FuIHJlYWNoIGEgZGVmIHRoYXQgaXMgYmVpbmcgcmVwbGFjZWQgYnkgc29tZXRoaW5nIGluIGFkZHRhYiwgQU5ECi0gKgotICogICAyLiBpcyBub3QgaXRzZWxmIGJlaW5nIHJlcGxhY2VkIGFscmVhZHkgKGllLiB0aGlzIG5hbWUgZG9lc24ndCBhbHJlYWR5Ci0gKiAgICAgIGV4aXN0IGluIGFkZHRhYikKLSAqCi0gKiAuLi50aGVuIGEgZHVwbGljYXRlIChuZXcgY29weSkgb2YgRCB3aWxsIGJlIGFkZGVkIHRvIGFkZHRhYi4KLSAqCi0gKiBSZXR1cm5zIHRydWUgaWYgdGhpcyBoYXBwZW5lZCBmb3IgYW55IGRlZiByZWFjaGFibGUgZnJvbSAiZGVmLiIKLSAqCi0gKiBJdCBpcyBzbGlnaHRseSB0cmlja3kgdG8gZG8gdGhpcyBjb3JyZWN0bHkgaW4gdGhlIHByZXNlbmNlIG9mIGN5Y2xlcy4gIElmIHdlCi0gKiBkZXRlY3QgdGhhdCBvdXIgREZTIGhhcyBoaXQgYSBjeWNsZSwgd2UgbWlnaHQgbm90IHlldCBrbm93IGlmIGFueSBTQ0NzIG9uCi0gKiBvdXIgc3RhY2sgY2FuIHJlYWNoIGEgZGVmIGluIGFkZHRhYiBvciBub3QuICBPbmNlIHdlIGZpZ3VyZSB0aGlzIG91dCwgdGhhdAotICogYW5zd2VyIG5lZWRzIHRvIGFwcGx5IHRvICphbGwqIGRlZnMgaW4gdGhlc2UgU0NDcywgZXZlbiBpZiB3ZSB2aXNpdGVkIHRoZW0KLSAqIGFscmVhZHkuICBTbyBhIHN0cmFpZ2h0IHVwIG9uZS1wYXNzIGN5Y2xlLWRldGVjdGluZyBERlMgd29uJ3Qgd29yay4KLSAqCi0gKiBUbyB3b3JrIGFyb3VuZCB0aGlzIHByb2JsZW0sIHdlIHRyYXZlcnNlIGVhY2ggU0NDICh3aGljaCB3ZSBhbHJlYWR5Ci0gKiBjb21wdXRlZCwgc2luY2UgdGhlc2UgZGVmcyBhcmUgZnJvemVuKSBhcyBhIHNpbmdsZSBub2RlLiAgV2UgZmlyc3QgY29tcHV0ZQotICogd2hldGhlciB0aGUgU0NDIGFzIGEgd2hvbGUgY2FuIHJlYWNoIGFueSBkZWYgaW4gYWRkdGFiLCB0aGVuIHdlIGR1cCAob3Igbm90KQotICogdGhlIGVudGlyZSBTQ0MuICBUaGlzIHJlcXVpcmVzIGJyZWFraW5nIHRoZSBlbmNhcHN1bGF0aW9uIG9mIHVwYl9yZWZjb3VudGVkLAotICogc2luY2UgdGhhdCBpcyB3aGVyZSB3ZSBnZXQgdGhlIGRhdGEgYWJvdXQgd2hhdCBTQ0Mgd2UgYXJlIGluLiAqLwotc3RhdGljIGJvb2wgdXBiX3Jlc29sdmVfZGZzKGNvbnN0IHVwYl9kZWYgKmRlZiwgdXBiX3N0cnRhYmxlICphZGR0YWIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqbmV3X293bmVyLCB1cGJfaW50dGFibGUgKnNlZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcykgewotICB1cGJfdmFsdWUgdjsKLSAgYm9vbCBuZWVkX2R1cDsKLSAgY29uc3QgdXBiX2RlZiAqYmFzZTsKLSAgY29uc3Qgdm9pZCogbWVtb2l6ZV9rZXk7Ci0KLSAgLyogTWVtb2l6ZSByZXN1bHRzIG9mIHRoaXMgZnVuY3Rpb24gZm9yIGVmZmljaWVuY3kgKHNpbmNlIHdlJ3JlIHRyYXZlcnNpbmcgYQotICAgKiBEQUcgdGhpcyBpcyBub3QgbmVlZGVkIHRvIGxpbWl0IHRoZSBkZXB0aCBvZiB0aGUgc2VhcmNoKS4KLSAgICoKLSAgICogV2UgbWVtb2l6ZSBieSBTQ0MgaW5zdGVhZCBvZiBieSBpbmRpdmlkdWFsIGRlZi4gKi8KLSAgbWVtb2l6ZV9rZXkgPSBkZWYtPmJhc2UuZ3JvdXA7Ci0KLSAgaWYgKHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoc2VlbiwgbWVtb2l6ZV9rZXksICZ2KSkKLSAgICByZXR1cm4gdXBiX3ZhbHVlX2dldGJvb2wodik7Ci0KLSAgLyogVmlzaXQgc3VibWVzc2FnZXMgZm9yIGFsbCBtZXNzYWdlcyBpbiB0aGUgU0NDLiAqLwotICBuZWVkX2R1cCA9IGZhbHNlOwotICBiYXNlID0gZGVmOwotICBkbyB7Ci0gICAgdXBiX3ZhbHVlIHY7Ci0gICAgY29uc3QgdXBiX21zZ2RlZiAqbTsKLQotICAgIGFzc2VydCh1cGJfZGVmX2lzZnJvemVuKGRlZikpOwotICAgIGlmIChkZWYtPnR5cGUgPT0gVVBCX0RFRl9GSUVMRCkgY29udGludWU7Ci0gICAgaWYgKHVwYl9zdHJ0YWJsZV9sb29rdXAoYWRkdGFiLCB1cGJfZGVmX2Z1bGxuYW1lKGRlZiksICZ2KSkgewotICAgICAgbmVlZF9kdXAgPSB0cnVlOwotICAgIH0KLQotICAgIC8qIEZvciBtZXNzYWdlcywgY29udGludWUgdGhlIHJlY3Vyc2lvbiBieSB2aXNpdGluZyBhbGwgc3ViZGVmcywgYnV0IG9ubHkKLSAgICAgKiBvbmVzIGluIGRpZmZlcmVudCBTQ0NzLiAqLwotICAgIG0gPSB1cGJfZHluY2FzdF9tc2dkZWYoZGVmKTsKLSAgICBpZiAobSkgewotICAgICAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0gICAgICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaSwgbSk7Ci0gICAgICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaSk7Ci0gICAgICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgICAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmkpOwotICAgICAgICBjb25zdCB1cGJfZGVmICpzdWJkZWY7Ci0KLSAgICAgICAgaWYgKCF1cGJfZmllbGRkZWZfaGFzc3ViZGVmKGYpKSBjb250aW51ZTsKLSAgICAgICAgc3ViZGVmID0gdXBiX2ZpZWxkZGVmX3N1YmRlZihmKTsKLQotICAgICAgICAvKiBTa2lwIHN1YmRlZnMgaW4gdGhpcyBTQ0MuICovCi0gICAgICAgIGlmIChkZWYtPmJhc2UuZ3JvdXAgPT0gc3ViZGVmLT5iYXNlLmdyb3VwKSBjb250aW51ZTsKLQotICAgICAgICAvKiB8PSB0byBhdm9pZCBzaG9ydC1jaXJjdWl0OyB3ZSBuZWVkIGl0cyBzaWRlLWVmZmVjdHMuICovCi0gICAgICAgIG5lZWRfZHVwIHw9IHVwYl9yZXNvbHZlX2RmcyhzdWJkZWYsIGFkZHRhYiwgbmV3X293bmVyLCBzZWVuLCBzKTsKLSAgICAgICAgaWYgKCF1cGJfb2socykpIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0gd2hpbGUgKChkZWYgPSAodXBiX2RlZiopZGVmLT5iYXNlLm5leHQpICE9IGJhc2UpOwotCi0gIGlmIChuZWVkX2R1cCkgewotICAgIC8qIER1cCBhbGwgZGVmcyBpbiB0aGlzIFNDQyB0aGF0IGRvbid0IGFscmVhZHkgaGF2ZSBlbnRyaWVzIGluIGFkZHRhYi4gKi8KLSAgICBkZWYgPSBiYXNlOwotICAgIGRvIHsKLSAgICAgIGNvbnN0IGNoYXIgKm5hbWU7Ci0KLSAgICAgIGlmIChkZWYtPnR5cGUgPT0gVVBCX0RFRl9GSUVMRCkgY29udGludWU7Ci0gICAgICBuYW1lID0gdXBiX2RlZl9mdWxsbmFtZShkZWYpOwotICAgICAgaWYgKCF1cGJfc3RydGFibGVfbG9va3VwKGFkZHRhYiwgbmFtZSwgTlVMTCkpIHsKLSAgICAgICAgdXBiX2RlZiAqbmV3ZGVmID0gdXBiX2RlZl9kdXAoZGVmLCBuZXdfb3duZXIpOwotICAgICAgICBpZiAoIW5ld2RlZikgZ290byBvb207Ci0gICAgICAgIG5ld2RlZi0+Y2FtZV9mcm9tX3VzZXIgPSBmYWxzZTsKLSAgICAgICAgaWYgKCF1cGJfc3RydGFibGVfaW5zZXJ0KGFkZHRhYiwgbmFtZSwgdXBiX3ZhbHVlX3B0cihuZXdkZWYpKSkKLSAgICAgICAgICBnb3RvIG9vbTsKLSAgICAgIH0KLSAgICB9IHdoaWxlICgoZGVmID0gKHVwYl9kZWYqKWRlZi0+YmFzZS5uZXh0KSAhPSBiYXNlKTsKLSAgfQotCi0gIHVwYl9pbnR0YWJsZV9pbnNlcnRwdHIoc2VlbiwgbWVtb2l6ZV9rZXksIHVwYl92YWx1ZV9ib29sKG5lZWRfZHVwKSk7Ci0gIHJldHVybiBuZWVkX2R1cDsKLQotb29tOgotICB1cGJfc3RhdHVzX3NldGVycm1zZyhzLCAib3V0IG9mIG1lbW9yeSIpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8qIFRPRE8oaGFiZXJtYW4pOiB3ZSBuZWVkIGEgbG90IG1vcmUgdGVzdGluZyBvZiBlcnJvciBjb25kaXRpb25zLgotICogVGhlIGNhbWVfZnJvbV91c2VyIHN0dWZmIGluIHBhcnRpY3VsYXIgaXMgbm90IHRlc3RlZC4gKi8KLXN0YXRpYyBib29sIHN5bXRhYl9hZGQodXBiX3N5bXRhYiAqcywgdXBiX2RlZiAqY29uc3QqZGVmcywgc2l6ZV90IG4sCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZl9kb25vciwgdXBiX3JlZmNvdW50ZWQgKmZyZWV6ZV9hbHNvLAotICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgc2l6ZV90IGk7Ci0gIHNpemVfdCBhZGRfbjsKLSAgc2l6ZV90IGZyZWV6ZV9uOwotICB1cGJfc3RydGFibGVfaXRlciBpdGVyOwotICB1cGJfcmVmY291bnRlZCAqKmFkZF9vYmpzID0gTlVMTDsKLSAgdXBiX2RlZiAqKmFkZF9kZWZzID0gTlVMTDsKLSAgc2l6ZV90IGFkZF9vYmpzX3NpemU7Ci0gIHVwYl9zdHJ0YWJsZSBhZGR0YWI7Ci0gIHVwYl9pbnR0YWJsZSBzZWVuOwotCi0gIGlmIChuID09IDAgJiYgIWZyZWV6ZV9hbHNvKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBhc3NlcnQoIXVwYl9zeW10YWJfaXNmcm96ZW4ocykpOwotICBpZiAoIXVwYl9zdHJ0YWJsZV9pbml0KCZhZGR0YWIsIFVQQl9DVFlQRV9QVFIpKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2coc3RhdHVzLCAib3V0IG9mIG1lbW9yeSIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8qIEFkZCBuZXcgZGVmcyB0byBvdXIgImFkZCIgc2V0LiAqLwotICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7Ci0gICAgdXBiX2RlZiAqZGVmID0gZGVmc1tpXTsKLSAgICBjb25zdCBjaGFyICpmdWxsbmFtZTsKLSAgICB1cGJfZmllbGRkZWYgKmY7Ci0KLSAgICBpZiAodXBiX2RlZl9pc2Zyb3plbihkZWYpKSB7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJhZGRlZCBkZWZzIG11c3QgYmUgbXV0YWJsZSIpOwotICAgICAgZ290byBlcnI7Ci0gICAgfQotICAgIGFzc2VydCghdXBiX2RlZl9pc2Zyb3plbihkZWYpKTsKLSAgICBmdWxsbmFtZSA9IHVwYl9kZWZfZnVsbG5hbWUoZGVmKTsKLSAgICBpZiAoIWZ1bGxuYW1lKSB7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZygKLSAgICAgICAgICBzdGF0dXMsICJBbm9ueW1vdXMgZGVmcyBjYW5ub3QgYmUgYWRkZWQgdG8gYSBzeW10YWIiKTsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLQotICAgIGYgPSB1cGJfZHluY2FzdF9maWVsZGRlZl9tdXRhYmxlKGRlZik7Ci0KLSAgICBpZiAoZikgewotICAgICAgaWYgKCF1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGVuYW1lKGYpKSB7Ci0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YW5kYWxvbmUgZmllbGRkZWZzIG11c3QgaGF2ZSBhIGNvbnRhaW5pbmcgdHlwZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIoZXh0ZW5kZWUpIG5hbWUgc2V0Iik7Ci0gICAgICAgIGdvdG8gZXJyOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAodXBiX3N0cnRhYmxlX2xvb2t1cCgmYWRkdGFiLCBmdWxsbmFtZSwgTlVMTCkpIHsKLSAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHN0YXR1cywgIkNvbmZsaWN0aW5nIGRlZnMgbmFtZWQgJyVzJyIsIGZ1bGxuYW1lKTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgICAvKiBXZSBuZWVkIHRoaXMgdG8gYmFjayBvdXQgcHJvcGVybHksIGJlY2F1c2UgaWYgdGhlcmUgaXMgYSBmYWlsdXJlIHdlCi0gICAgICAgKiBuZWVkIHRvIGRvbmF0ZSB0aGUgcmVmIGJhY2sgdG8gdGhlIGNhbGxlci4gKi8KLSAgICAgIGRlZi0+Y2FtZV9mcm9tX3VzZXIgPSB0cnVlOwotICAgICAgdXBiX2RlZl9kb25hdGVyZWYoZGVmLCByZWZfZG9ub3IsIHMpOwotICAgICAgaWYgKCF1cGJfc3RydGFibGVfaW5zZXJ0KCZhZGR0YWIsIGZ1bGxuYW1lLCB1cGJfdmFsdWVfcHRyKGRlZikpKQotICAgICAgICBnb3RvIG9vbV9lcnI7Ci0gICAgfQotICB9Ci0KLSAgLyogQWRkIHN0YW5kYWxvbmUgZmllbGRkZWZzIChpZS4gZXh0ZW5zaW9ucykgdG8gdGhlIGFwcHJvcHJpYXRlIG1lc3NhZ2VzLgotICAgKiBJZiB0aGUgYXBwcm9wcmlhdGUgbWVzc2FnZSBvbmx5IGV4aXN0cyBpbiB0aGUgZXhpc3Rpbmcgc3ltdGFiLCBkdXBsaWNhdGUKLSAgICogaXQgc28gd2UgaGF2ZSBhIG11dGFibGUgY29weSB3ZSBjYW4gYWRkIHRoZSBmaWVsZHMgdG8uICovCi0gIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIHsKLSAgICB1cGJfZGVmICpkZWYgPSBkZWZzW2ldOwotICAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9keW5jYXN0X2ZpZWxkZGVmX211dGFibGUoZGVmKTsKLSAgICBjb25zdCBjaGFyICptc2duYW1lOwotICAgIHVwYl92YWx1ZSB2OwotICAgIHVwYl9tc2dkZWYgKm07Ci0KLSAgICBpZiAoIWYpIGNvbnRpbnVlOwotICAgIG1zZ25hbWUgPSB1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGVuYW1lKGYpOwotICAgIC8qIFdlIHZhbGlkYXRlZCB0aGlzIGVhcmxpZXIgaW4gdGhpcyBmdW5jdGlvbi4gKi8KLSAgICBhc3NlcnQobXNnbmFtZSk7Ci0KLSAgICAvKiBJZiB0aGUgZXh0ZW5kZWUgbmFtZSBpcyBhYnNvbHV0ZWx5IHF1YWxpZmllZCwgbW92ZSBwYXN0IHRoZSBpbml0aWFsICIuIi4KLSAgICAgKiBUT0RPKGhhYmVybWFuKTogaXQgaXMgbm90IG9idmlvdXMgd2hhdCBpdCB3b3VsZCBtZWFuIGlmIHRoaXMgd2FzIG5vdAotICAgICAqIGFic29sdXRlbHkgcXVhbGlmaWVkLiAqLwotICAgIGlmIChtc2duYW1lWzBdID09ICcuJykgewotICAgICAgbXNnbmFtZSsrOwotICAgIH0KLQotICAgIGlmICh1cGJfc3RydGFibGVfbG9va3VwKCZhZGR0YWIsIG1zZ25hbWUsICZ2KSkgewotICAgICAgLyogRXh0ZW5kZWUgaXMgaW4gdGhlIHNldCBvZiBkZWZzIHRoZSB1c2VyIGFza2VkIHVzIHRvIGFkZC4gKi8KLSAgICAgIG0gPSB1cGJfdmFsdWVfZ2V0cHRyKHYpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvKiBOZWVkIHRvIGZpbmQgYW5kIGR1cCB0aGUgZXh0ZW5kZWUgZnJvbSB0aGUgZXhpc3Rpbmcgc3ltdGFiLiAqLwotICAgICAgY29uc3QgdXBiX21zZ2RlZiAqZnJvemVuX20gPSB1cGJfc3ltdGFiX2xvb2t1cG1zZyhzLCBtc2duYW1lKTsKLSAgICAgIGlmICghZnJvemVuX20pIHsKLSAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJUcmllZCB0byBleHRlbmQgbWVzc2FnZSAlcyB0aGF0IGRvZXMgbm90IGV4aXN0ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICJpbiB0aGlzIFN5bWJvbFRhYmxlLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtc2duYW1lKTsKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICB9Ci0gICAgICBtID0gdXBiX21zZ2RlZl9kdXAoZnJvemVuX20sIHMpOwotICAgICAgaWYgKCFtKSBnb3RvIG9vbV9lcnI7Ci0gICAgICBpZiAoIXVwYl9zdHJ0YWJsZV9pbnNlcnQoJmFkZHRhYiwgbXNnbmFtZSwgdXBiX3ZhbHVlX3B0cihtKSkpIHsKLSAgICAgICAgdXBiX21zZ2RlZl91bnJlZihtLCBzKTsKLSAgICAgICAgZ290byBvb21fZXJyOwotICAgICAgfQotICAgIH0KLQotICAgIGlmICghdXBiX21zZ2RlZl9hZGRmaWVsZChtLCBmLCByZWZfZG9ub3IsIHN0YXR1cykpIHsKLSAgICAgIGdvdG8gZXJyOwotICAgIH0KLSAgfQotCi0gIC8qIEFkZCBkdXBzIG9mIGFueSBleGlzdGluZyBkZWYgdGhhdCBjYW4gcmVhY2ggYSBkZWYgd2l0aCB0aGUgc2FtZSBuYW1lIGFzCi0gICAqIGFueXRoaW5nIGluIG91ciAiYWRkIiBzZXQuICovCi0gIGlmICghdXBiX2ludHRhYmxlX2luaXQoJnNlZW4sIFVQQl9DVFlQRV9CT09MKSkgZ290byBvb21fZXJyOwotICB1cGJfc3RydGFibGVfYmVnaW4oJml0ZXIsICZzLT5zeW10YWIpOwotICBmb3IgKDsgIXVwYl9zdHJ0YWJsZV9kb25lKCZpdGVyKTsgdXBiX3N0cnRhYmxlX25leHQoJml0ZXIpKSB7Ci0gICAgdXBiX2RlZiAqZGVmID0gdXBiX3ZhbHVlX2dldHB0cih1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXRlcikpOwotICAgIHVwYl9yZXNvbHZlX2RmcyhkZWYsICZhZGR0YWIsIHMsICZzZWVuLCBzdGF0dXMpOwotICAgIGlmICghdXBiX29rKHN0YXR1cykpIGdvdG8gZXJyOwotICB9Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoJnNlZW4pOwotCi0gIC8qIE5vdyB1c2luZyB0aGUgdGFibGUsIHJlc29sdmUgc3ltYm9saWMgcmVmZXJlbmNlcyBmb3Igc3ViZGVmcy4gKi8KLSAgdXBiX3N0cnRhYmxlX2JlZ2luKCZpdGVyLCAmYWRkdGFiKTsKLSAgZm9yICg7ICF1cGJfc3RydGFibGVfZG9uZSgmaXRlcik7IHVwYl9zdHJ0YWJsZV9uZXh0KCZpdGVyKSkgewotICAgIGNvbnN0IGNoYXIgKmJhc2U7Ci0gICAgdXBiX2RlZiAqZGVmID0gdXBiX3ZhbHVlX2dldHB0cih1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXRlcikpOwotICAgIHVwYl9tc2dkZWYgKm0gPSB1cGJfZHluY2FzdF9tc2dkZWZfbXV0YWJsZShkZWYpOwotICAgIHVwYl9tc2dfZmllbGRfaXRlciBqOwotCi0gICAgaWYgKCFtKSBjb250aW51ZTsKLSAgICAvKiBUeXBlIG5hbWVzIGFyZSByZXNvbHZlZCByZWxhdGl2ZSB0byB0aGUgbWVzc2FnZSBpbiB3aGljaCB0aGV5IGFwcGVhci4gKi8KLSAgICBiYXNlID0gdXBiX21zZ2RlZl9mdWxsbmFtZShtKTsKLQotICAgIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZqLCBtKTsKLSAgICAgICAgIXVwYl9tc2dfZmllbGRfZG9uZSgmaik7Ci0gICAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaikpIHsKLSAgICAgIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaik7Ci0gICAgICBjb25zdCBjaGFyICpuYW1lID0gdXBiX2ZpZWxkZGVmX3N1YmRlZm5hbWUoZik7Ci0gICAgICBpZiAobmFtZSAmJiAhdXBiX2ZpZWxkZGVmX3N1YmRlZihmKSkgewotICAgICAgICAvKiBUcnkgdGhlIGxvb2t1cCBpbiB0aGUgY3VycmVudCBzZXQgb2YgdG8tYmUtYWRkZWQgZGVmcyBmaXJzdC4gSWYgbm90Ci0gICAgICAgICAqIHRoZXJlLCB0cnkgZXhpc3RpbmcgZGVmcy4gKi8KLSAgICAgICAgdXBiX2RlZiAqc3ViZGVmID0gdXBiX3Jlc29sdmVuYW1lKCZhZGR0YWIsIGJhc2UsIG5hbWUpOwotICAgICAgICBpZiAoc3ViZGVmID09IE5VTEwpIHsKLSAgICAgICAgICBzdWJkZWYgPSB1cGJfcmVzb2x2ZW5hbWUoJnMtPnN5bXRhYiwgYmFzZSwgbmFtZSk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHN1YmRlZiA9PSBOVUxMKSB7Ci0gICAgICAgICAgdXBiX3N0YXR1c19zZXRlcnJmKAotICAgICAgICAgICAgICBzdGF0dXMsICJjb3VsZG4ndCByZXNvbHZlIG5hbWUgJyVzJyBpbiBtZXNzYWdlICclcyciLCBuYW1lLCBiYXNlKTsKLSAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfSBlbHNlIGlmICghdXBiX2ZpZWxkZGVmX3NldHN1YmRlZihmLCBzdWJkZWYsIHN0YXR1cykpIHsKLSAgICAgICAgICBnb3RvIGVycjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qIFdlIG5lZWQgYW4gYXJyYXkgb2YgdGhlIGRlZnMgaW4gYWRkdGFiLCBmb3IgcGFzc2luZyB0bwotICAgKiB1cGJfcmVmY291bnRlZF9mcmVlemUoKS4gKi8KLSAgYWRkX29ianNfc2l6ZSA9IHVwYl9zdHJ0YWJsZV9jb3VudCgmYWRkdGFiKTsKLSAgaWYgKGZyZWV6ZV9hbHNvKSB7Ci0gICAgYWRkX29ianNfc2l6ZSsrOwotICB9Ci0KLSAgYWRkX2RlZnMgPSB1cGJfZ21hbGxvYyhzaXplb2Yodm9pZCopICogYWRkX29ianNfc2l6ZSk7Ci0gIGlmIChhZGRfZGVmcyA9PSBOVUxMKSBnb3RvIG9vbV9lcnI7Ci0gIHVwYl9zdHJ0YWJsZV9iZWdpbigmaXRlciwgJmFkZHRhYik7Ci0gIGZvciAoYWRkX24gPSAwOyAhdXBiX3N0cnRhYmxlX2RvbmUoJml0ZXIpOyB1cGJfc3RydGFibGVfbmV4dCgmaXRlcikpIHsKLSAgICBhZGRfZGVmc1thZGRfbisrXSA9IHVwYl92YWx1ZV9nZXRwdHIodXBiX3N0cnRhYmxlX2l0ZXJfdmFsdWUoJml0ZXIpKTsKLSAgfQotCi0gIC8qIFZhbGlkYXRlIGRlZnMuICovCi0gIGlmICghX3VwYl9kZWZfdmFsaWRhdGUoYWRkX2RlZnMsIGFkZF9uLCBzdGF0dXMpKSB7Ci0gICAgZ290byBlcnI7Ci0gIH0KLQotICAvKiBDaGVhdCBhIGxpdHRsZSBhbmQgZ2l2ZSB0aGUgYXJyYXkgYSBuZXcgdHlwZS4KLSAgICogVGhpcyBpcyBwcm9iYWJseSB1bmRlZmluZWQgYmVoYXZpb3IsIGJ1dCB0aGlzIGNvZGUgd2lsbCBiZSBkZWxldGVkIHNvb24uICovCi0gIGFkZF9vYmpzID0gKHVwYl9yZWZjb3VudGVkKiopYWRkX2RlZnM7Ci0KLSAgZnJlZXplX24gPSBhZGRfbjsKLSAgaWYgKGZyZWV6ZV9hbHNvKSB7Ci0gICAgYWRkX29ianNbZnJlZXplX24rK10gPSBmcmVlemVfYWxzbzsKLSAgfQotCi0gIGlmICghdXBiX3JlZmNvdW50ZWRfZnJlZXplKGFkZF9vYmpzLCBmcmVlemVfbiwgc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVUEJfTUFYX01FU1NBR0VfREVQVEggKiAyKSkgewotICAgIGdvdG8gZXJyOwotICB9Ci0KLSAgLyogVGhpcyBtdXN0IGJlIGRlbGF5ZWQgdW50aWwgYWxsIGVycm9ycyBoYXZlIGJlZW4gZGV0ZWN0ZWQsIHNpbmNlIGVycm9yCi0gICAqIHJlY292ZXJ5IGNvZGUgdXNlcyB0aGlzIHRhYmxlIHRvIGNsZWFudXAgZGVmcy4gKi8KLSAgdXBiX3N0cnRhYmxlX3VuaW5pdCgmYWRkdGFiKTsKLQotICAvKiBUT0RPKGhhYmVybWFuKSB3ZSBkb24ndCBwcm9wZXJseSBoYW5kbGUgZXJyb3JzIGFmdGVyIHRoaXMgcG9pbnQgKGxpa2UKLSAgICogT09NIGluIHVwYl9zdHJ0YWJsZV9pbnNlcnQoKSBiZWxvdykuICovCi0gIGZvciAoaSA9IDA7IGkgPCBhZGRfbjsgaSsrKSB7Ci0gICAgdXBiX2RlZiAqZGVmID0gKHVwYl9kZWYqKWFkZF9vYmpzW2ldOwotICAgIGNvbnN0IGNoYXIgKm5hbWUgPSB1cGJfZGVmX2Z1bGxuYW1lKGRlZik7Ci0gICAgdXBiX3ZhbHVlIHY7Ci0gICAgYm9vbCBzdWNjZXNzOwotCi0gICAgaWYgKHVwYl9zdHJ0YWJsZV9yZW1vdmUoJnMtPnN5bXRhYiwgbmFtZSwgJnYpKSB7Ci0gICAgICBjb25zdCB1cGJfZGVmICpkZWYgPSB1cGJfdmFsdWVfZ2V0cHRyKHYpOwotICAgICAgdXBiX2RlZl91bnJlZihkZWYsIHMpOwotICAgIH0KLSAgICBzdWNjZXNzID0gdXBiX3N0cnRhYmxlX2luc2VydCgmcy0+c3ltdGFiLCBuYW1lLCB1cGJfdmFsdWVfcHRyKGRlZikpOwotICAgIFVQQl9BU1NFUlRfVkFSKHN1Y2Nlc3MsIHN1Y2Nlc3MgPT0gdHJ1ZSk7Ci0gIH0KLSAgdXBiX2dmcmVlKGFkZF9kZWZzKTsKLSAgcmV0dXJuIHRydWU7Ci0KLW9vbV9lcnI6Ci0gIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIm91dCBvZiBtZW1vcnkiKTsKLWVycjogewotICAgIC8qIEZvciBkZWZzIHRoZSB1c2VyIHBhc3NlZCBpbiwgd2UgbmVlZCB0byBkb25hdGUgdGhlIHJlZnMgYmFjay4gIEZvciBkZWZzCi0gICAgICogd2UgZHVwJ2QsIHdlIG5lZWQgdG8ganVzdCB1bnJlZiB0aGVtLiAqLwotICAgIHVwYl9zdHJ0YWJsZV9iZWdpbigmaXRlciwgJmFkZHRhYik7Ci0gICAgZm9yICg7ICF1cGJfc3RydGFibGVfZG9uZSgmaXRlcik7IHVwYl9zdHJ0YWJsZV9uZXh0KCZpdGVyKSkgewotICAgICAgdXBiX2RlZiAqZGVmID0gdXBiX3ZhbHVlX2dldHB0cih1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXRlcikpOwotICAgICAgYm9vbCBjYW1lX2Zyb21fdXNlciA9IGRlZi0+Y2FtZV9mcm9tX3VzZXI7Ci0gICAgICBkZWYtPmNhbWVfZnJvbV91c2VyID0gZmFsc2U7Ci0gICAgICBpZiAoY2FtZV9mcm9tX3VzZXIpIHsKLSAgICAgICAgdXBiX2RlZl9kb25hdGVyZWYoZGVmLCBzLCByZWZfZG9ub3IpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXBiX2RlZl91bnJlZihkZWYsIHMpOwotICAgICAgfQotICAgIH0KLSAgfQotICB1cGJfc3RydGFibGVfdW5pbml0KCZhZGR0YWIpOwotICB1cGJfZ2ZyZWUoYWRkX2RlZnMpOwotICBhc3NlcnQoIXVwYl9vayhzdGF0dXMpKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIHVwYl9zeW10YWJfYWRkKHVwYl9zeW10YWIgKnMsIHVwYl9kZWYgKmNvbnN0KmRlZnMsIHNpemVfdCBuLAotICAgICAgICAgICAgICAgICAgICB2b2lkICpyZWZfZG9ub3IsIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICByZXR1cm4gc3ltdGFiX2FkZChzLCBkZWZzLCBuLCByZWZfZG9ub3IsIE5VTEwsIHN0YXR1cyk7Ci19Ci0KLWJvb2wgdXBiX3N5bXRhYl9hZGRmaWxlKHVwYl9zeW10YWIgKnMsIHVwYl9maWxlZGVmICpmaWxlLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgc2l6ZV90IG47Ci0gIHNpemVfdCBpOwotICB1cGJfZGVmICoqZGVmczsKLSAgYm9vbCByZXQ7Ci0KLSAgbiA9IHVwYl9maWxlZGVmX2RlZmNvdW50KGZpbGUpOwotICBkZWZzID0gdXBiX2dtYWxsb2Moc2l6ZW9mKCpkZWZzKSAqIG4pOwotCi0gIGlmIChkZWZzID09IE5VTEwpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJPdXQgb2YgbWVtb3J5Iik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IG47IGkrKykgewotICAgIGRlZnNbaV0gPSB1cGJfZmlsZWRlZl9tdXRhYmxlZGVmKGZpbGUsIGkpOwotICB9Ci0KLSAgcmV0ID0gc3ltdGFiX2FkZChzLCBkZWZzLCBuLCBOVUxMLCB1cGJfZmlsZWRlZl91cGNhc3RfbXV0YWJsZShmaWxlKSwgc3RhdHVzKTsKLQotICB1cGJfZ2ZyZWUoZGVmcyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIEl0ZXJhdGlvbi4gKi8KLQotc3RhdGljIHZvaWQgYWR2YW5jZV90b19tYXRjaGluZyh1cGJfc3ltdGFiX2l0ZXIgKml0ZXIpIHsKLSAgaWYgKGl0ZXItPnR5cGUgPT0gVVBCX0RFRl9BTlkpCi0gICAgcmV0dXJuOwotCi0gIHdoaWxlICghdXBiX3N0cnRhYmxlX2RvbmUoJml0ZXItPml0ZXIpICYmCi0gICAgICAgICBpdGVyLT50eXBlICE9IHVwYl9zeW10YWJfaXRlcl9kZWYoaXRlciktPnR5cGUpIHsKLSAgICB1cGJfc3RydGFibGVfbmV4dCgmaXRlci0+aXRlcik7Ci0gIH0KLX0KLQotdm9pZCB1cGJfc3ltdGFiX2JlZ2luKHVwYl9zeW10YWJfaXRlciAqaXRlciwgY29uc3QgdXBiX3N5bXRhYiAqcywKLSAgICAgICAgICAgICAgICAgICAgICB1cGJfZGVmdHlwZV90IHR5cGUpIHsKLSAgdXBiX3N0cnRhYmxlX2JlZ2luKCZpdGVyLT5pdGVyLCAmcy0+c3ltdGFiKTsKLSAgaXRlci0+dHlwZSA9IHR5cGU7Ci0gIGFkdmFuY2VfdG9fbWF0Y2hpbmcoaXRlcik7Ci19Ci0KLXZvaWQgdXBiX3N5bXRhYl9uZXh0KHVwYl9zeW10YWJfaXRlciAqaXRlcikgewotICB1cGJfc3RydGFibGVfbmV4dCgmaXRlci0+aXRlcik7Ci0gIGFkdmFuY2VfdG9fbWF0Y2hpbmcoaXRlcik7Ci19Ci0KLWJvb2wgdXBiX3N5bXRhYl9kb25lKGNvbnN0IHVwYl9zeW10YWJfaXRlciAqaXRlcikgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2RvbmUoJml0ZXItPml0ZXIpOwotfQotCi1jb25zdCB1cGJfZGVmICp1cGJfc3ltdGFiX2l0ZXJfZGVmKGNvbnN0IHVwYl9zeW10YWJfaXRlciAqaXRlcikgewotICByZXR1cm4gdXBiX3ZhbHVlX2dldHB0cih1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaXRlci0+aXRlcikpOwotfQotLyoKLSoqIHVwYl90YWJsZSBJbXBsZW1lbnRhdGlvbgotKioKLSoqIEltcGxlbWVudGF0aW9uIGlzIGhlYXZpbHkgaW5zcGlyZWQgYnkgTHVhJ3MgbHRhYmxlLmMuCi0qLwotCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotI2RlZmluZSBVUEJfTUFYQVJSU0laRSAxNiAgLyogNjRrLiAqLwotCi0vKiBGcm9tIENocm9taXVtLiAqLwotI2RlZmluZSBBUlJBWV9TSVpFKHgpIFwKLSAgICAoKHNpemVvZih4KS9zaXplb2YoMFt4XSkpIC8gKChzaXplX3QpKCEoc2l6ZW9mKHgpICUgc2l6ZW9mKDBbeF0pKSkpKQotCi0jaWZkZWYgTkRFQlVHCi1zdGF0aWMgdm9pZCB1cGJfY2hlY2tfYWxsb2ModXBiX3RhYmxlICp0LCB1cGJfYWxsb2MgKmEpIHsKLSAgVVBCX1VOVVNFRCh0KTsKLSAgVVBCX1VOVVNFRChhKTsKLX0KLSNlbHNlCi1zdGF0aWMgdm9pZCB1cGJfY2hlY2tfYWxsb2ModXBiX3RhYmxlICp0LCB1cGJfYWxsb2MgKmEpIHsKLSAgYXNzZXJ0KHQtPmFsbG9jID09IGEpOwotfQotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCBkb3VibGUgTUFYX0xPQUQgPSAwLjg1OwotCi0vKiBUaGUgbWluaW11bSB1dGlsaXphdGlvbiBvZiB0aGUgYXJyYXkgcGFydCBvZiBhIG1peGVkIGhhc2gvYXJyYXkgdGFibGUuICBUaGlzCi0gKiBpcyBhIHNwZWVkL21lbW9yeS11c2FnZSB0cmFkZW9mZiAodGhvdWdoIGl0J3Mgbm90IHN0cmFpZ2h0Zm9yd2FyZCBiZWNhdXNlIG9mCi0gKiBjYWNoZSBlZmZlY3RzKS4gIFRoZSBsb3dlciB0aGlzIGlzLCB0aGUgbW9yZSBtZW1vcnkgd2UnbGwgdXNlLiAqLwotc3RhdGljIGNvbnN0IGRvdWJsZSBNSU5fREVOU0lUWSA9IDAuMTsKLQotYm9vbCBpc19wb3cyKHVpbnQ2NF90IHYpIHsgcmV0dXJuIHYgPT0gMCB8fCAodiAmICh2IC0gMSkpID09IDA7IH0KLQotaW50IGxvZzJjZWlsKHVpbnQ2NF90IHYpIHsKLSAgaW50IHJldCA9IDA7Ci0gIGJvb2wgcG93MiA9IGlzX3BvdzIodik7Ci0gIHdoaWxlICh2ID4+PSAxKSByZXQrKzsKLSAgcmV0ID0gcG93MiA/IHJldCA6IHJldCArIDE7ICAvKiBDZWlsaW5nLiAqLwotICByZXR1cm4gVVBCX01JTihVUEJfTUFYQVJSU0laRSwgcmV0KTsKLX0KLQotY2hhciAqdXBiX3N0cmR1cChjb25zdCBjaGFyICpzLCB1cGJfYWxsb2MgKmEpIHsKLSAgcmV0dXJuIHVwYl9zdHJkdXAyKHMsIHN0cmxlbihzKSwgYSk7Ci19Ci0KLWNoYXIgKnVwYl9zdHJkdXAyKGNvbnN0IGNoYXIgKnMsIHNpemVfdCBsZW4sIHVwYl9hbGxvYyAqYSkgewotICBzaXplX3QgbjsKLSAgY2hhciAqcDsKLQotICAvKiBQcmV2ZW50IG92ZXJmbG93IGVycm9ycy4gKi8KLSAgaWYgKGxlbiA9PSBTSVpFX01BWCkgcmV0dXJuIE5VTEw7Ci0gIC8qIEFsd2F5cyBudWxsLXRlcm1pbmF0ZSwgZXZlbiBpZiBiaW5hcnkgZGF0YTsgYnV0IGRvbid0IHJlbHkgb24gdGhlIGlucHV0IHRvCi0gICAqIGhhdmUgYSBudWxsLXRlcm1pbmF0aW5nIGJ5dGUgc2luY2UgaXQgbWF5IGJlIGEgcmF3IGJpbmFyeSBidWZmZXIuICovCi0gIG4gPSBsZW4gKyAxOwotICBwID0gdXBiX21hbGxvYyhhLCBuKTsKLSAgaWYgKHApIHsKLSAgICBtZW1jcHkocCwgcywgbGVuKTsKLSAgICBwW2xlbl0gPSAwOwotICB9Ci0gIHJldHVybiBwOwotfQotCi0vKiBBIHR5cGUgdG8gcmVwcmVzZW50IHRoZSBsb29rdXAga2V5IG9mIGVpdGhlciBhIHN0cnRhYmxlIG9yIGFuIGludHRhYmxlLiAqLwotdHlwZWRlZiB1bmlvbiB7Ci0gIHVpbnRwdHJfdCBudW07Ci0gIHN0cnVjdCB7Ci0gICAgY29uc3QgY2hhciAqc3RyOwotICAgIHNpemVfdCBsZW47Ci0gIH0gc3RyOwotfSBsb29rdXBrZXlfdDsKLQotc3RhdGljIGxvb2t1cGtleV90IHN0cmtleTIoY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuKSB7Ci0gIGxvb2t1cGtleV90IGs7Ci0gIGsuc3RyLnN0ciA9IHN0cjsKLSAgay5zdHIubGVuID0gbGVuOwotICByZXR1cm4gazsKLX0KLQotc3RhdGljIGxvb2t1cGtleV90IGludGtleSh1aW50cHRyX3Qga2V5KSB7Ci0gIGxvb2t1cGtleV90IGs7Ci0gIGsubnVtID0ga2V5OwotICByZXR1cm4gazsKLX0KLQotdHlwZWRlZiB1aW50MzJfdCBoYXNoZnVuY190KHVwYl90YWJrZXkga2V5KTsKLXR5cGVkZWYgYm9vbCBlcWxmdW5jX3QodXBiX3RhYmtleSBrMSwgbG9va3Vwa2V5X3QgazIpOwotCi0vKiBCYXNlIHRhYmxlIChzaGFyZWQgY29kZSkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGb3Igd2hlbiB3ZSBuZWVkIHRvIGNhc3QgYXdheSBjb25zdC4gKi8KLXN0YXRpYyB1cGJfdGFiZW50ICptdXRhYmxlX2VudHJpZXModXBiX3RhYmxlICp0KSB7Ci0gIHJldHVybiAodXBiX3RhYmVudCopdC0+ZW50cmllczsKLX0KLQotc3RhdGljIGJvb2wgaXNmdWxsKHVwYl90YWJsZSAqdCkgewotICBpZiAodXBiX3RhYmxlX3NpemUodCkgPT0gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiAoKGRvdWJsZSkodC0+Y291bnQgKyAxKSAvIHVwYl90YWJsZV9zaXplKHQpKSA+IE1BWF9MT0FEOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGluaXQodXBiX3RhYmxlICp0LCB1cGJfY3R5cGVfdCBjdHlwZSwgdWludDhfdCBzaXplX2xnMiwKLSAgICAgICAgICAgICAgICAgdXBiX2FsbG9jICphKSB7Ci0gIHNpemVfdCBieXRlczsKLQotICB0LT5jb3VudCA9IDA7Ci0gIHQtPmN0eXBlID0gY3R5cGU7Ci0gIHQtPnNpemVfbGcyID0gc2l6ZV9sZzI7Ci0gIHQtPm1hc2sgPSB1cGJfdGFibGVfc2l6ZSh0KSA/IHVwYl90YWJsZV9zaXplKHQpIC0gMSA6IDA7Ci0jaWZuZGVmIE5ERUJVRwotICB0LT5hbGxvYyA9IGE7Ci0jZW5kaWYKLSAgYnl0ZXMgPSB1cGJfdGFibGVfc2l6ZSh0KSAqIHNpemVvZih1cGJfdGFiZW50KTsKLSAgaWYgKGJ5dGVzID4gMCkgewotICAgIHQtPmVudHJpZXMgPSB1cGJfbWFsbG9jKGEsIGJ5dGVzKTsKLSAgICBpZiAoIXQtPmVudHJpZXMpIHJldHVybiBmYWxzZTsKLSAgICBtZW1zZXQobXV0YWJsZV9lbnRyaWVzKHQpLCAwLCBieXRlcyk7Ci0gIH0gZWxzZSB7Ci0gICAgdC0+ZW50cmllcyA9IE5VTEw7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHVuaW5pdCh1cGJfdGFibGUgKnQsIHVwYl9hbGxvYyAqYSkgewotICB1cGJfY2hlY2tfYWxsb2ModCwgYSk7Ci0gIHVwYl9mcmVlKGEsIG11dGFibGVfZW50cmllcyh0KSk7Ci19Ci0KLXN0YXRpYyB1cGJfdGFiZW50ICplbXB0eWVudCh1cGJfdGFibGUgKnQpIHsKLSAgdXBiX3RhYmVudCAqZSA9IG11dGFibGVfZW50cmllcyh0KSArIHVwYl90YWJsZV9zaXplKHQpOwotICB3aGlsZSAoMSkgeyBpZiAodXBiX3RhYmVudF9pc2VtcHR5KC0tZSkpIHJldHVybiBlOyBhc3NlcnQoZSA+IHQtPmVudHJpZXMpOyB9Ci19Ci0KLXN0YXRpYyB1cGJfdGFiZW50ICpnZXRlbnRyeV9tdXRhYmxlKHVwYl90YWJsZSAqdCwgdWludDMyX3QgaGFzaCkgewotICByZXR1cm4gKHVwYl90YWJlbnQqKXVwYl9nZXRlbnRyeSh0LCBoYXNoKTsKLX0KLQotc3RhdGljIGNvbnN0IHVwYl90YWJlbnQgKmZpbmRlbnRyeShjb25zdCB1cGJfdGFibGUgKnQsIGxvb2t1cGtleV90IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzaCwgZXFsZnVuY190ICplcWwpIHsKLSAgY29uc3QgdXBiX3RhYmVudCAqZTsKLQotICBpZiAodC0+c2l6ZV9sZzIgPT0gMCkgcmV0dXJuIE5VTEw7Ci0gIGUgPSB1cGJfZ2V0ZW50cnkodCwgaGFzaCk7Ci0gIGlmICh1cGJfdGFiZW50X2lzZW1wdHkoZSkpIHJldHVybiBOVUxMOwotICB3aGlsZSAoMSkgewotICAgIGlmIChlcWwoZS0+a2V5LCBrZXkpKSByZXR1cm4gZTsKLSAgICBpZiAoKGUgPSBlLT5uZXh0KSA9PSBOVUxMKSByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1zdGF0aWMgdXBiX3RhYmVudCAqZmluZGVudHJ5X211dGFibGUodXBiX3RhYmxlICp0LCBsb29rdXBrZXlfdCBrZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QgaGFzaCwgZXFsZnVuY190ICplcWwpIHsKLSAgcmV0dXJuICh1cGJfdGFiZW50KilmaW5kZW50cnkodCwga2V5LCBoYXNoLCBlcWwpOwotfQotCi1zdGF0aWMgYm9vbCBsb29rdXAoY29uc3QgdXBiX3RhYmxlICp0LCBsb29rdXBrZXlfdCBrZXksIHVwYl92YWx1ZSAqdiwKLSAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBoYXNoLCBlcWxmdW5jX3QgKmVxbCkgewotICBjb25zdCB1cGJfdGFiZW50ICplID0gZmluZGVudHJ5KHQsIGtleSwgaGFzaCwgZXFsKTsKLSAgaWYgKGUpIHsKLSAgICBpZiAodikgewotICAgICAgX3VwYl92YWx1ZV9zZXR2YWwodiwgZS0+dmFsLnZhbCwgdC0+Y3R5cGUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLyogVGhlIGdpdmVuIGtleSBtdXN0IG5vdCBhbHJlYWR5IGV4aXN0IGluIHRoZSB0YWJsZS4gKi8KLXN0YXRpYyB2b2lkIGluc2VydCh1cGJfdGFibGUgKnQsIGxvb2t1cGtleV90IGtleSwgdXBiX3RhYmtleSB0YWJrZXksCi0gICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlIHZhbCwgdWludDMyX3QgaGFzaCwKLSAgICAgICAgICAgICAgICAgICBoYXNoZnVuY190ICpoYXNoZnVuYywgZXFsZnVuY190ICplcWwpIHsKLSAgdXBiX3RhYmVudCAqbWFpbnBvc19lOwotICB1cGJfdGFiZW50ICpvdXJfZTsKLQotICBVUEJfVU5VU0VEKGVxbCk7Ci0gIFVQQl9VTlVTRUQoa2V5KTsKLSAgYXNzZXJ0KGZpbmRlbnRyeSh0LCBrZXksIGhhc2gsIGVxbCkgPT0gTlVMTCk7Ci0gIGFzc2VydCh2YWwuY3R5cGUgPT0gdC0+Y3R5cGUpOwotCi0gIHQtPmNvdW50Kys7Ci0gIG1haW5wb3NfZSA9IGdldGVudHJ5X211dGFibGUodCwgaGFzaCk7Ci0gIG91cl9lID0gbWFpbnBvc19lOwotCi0gIGlmICh1cGJfdGFiZW50X2lzZW1wdHkobWFpbnBvc19lKSkgewotICAgIC8qIE91ciBtYWluIHBvc2l0aW9uIGlzIGVtcHR5OyB1c2UgaXQuICovCi0gICAgb3VyX2UtPm5leHQgPSBOVUxMOwotICB9IGVsc2UgewotICAgIC8qIENvbGxpc2lvbi4gKi8KLSAgICB1cGJfdGFiZW50ICpuZXdfZSA9IGVtcHR5ZW50KHQpOwotICAgIC8qIEhlYWQgb2YgY29sbGlkZXIncyBjaGFpbi4gKi8KLSAgICB1cGJfdGFiZW50ICpjaGFpbiA9IGdldGVudHJ5X211dGFibGUodCwgaGFzaGZ1bmMobWFpbnBvc19lLT5rZXkpKTsKLSAgICBpZiAoY2hhaW4gPT0gbWFpbnBvc19lKSB7Ci0gICAgICAvKiBFeGlzdGluZyBlbnQgaXMgaW4gaXRzIG1haW4gcG9zaXNpdG9uIChpdCBoYXMgdGhlIHNhbWUgaGFzaCBhcyB1cywgYW5kCi0gICAgICAgKiBpcyB0aGUgaGVhZCBvZiBvdXIgY2hhaW4pLiAgSW5zZXJ0IHRvIG5ldyBlbnQgYW5kIGFwcGVuZCB0byB0aGlzIGNoYWluLiAqLwotICAgICAgbmV3X2UtPm5leHQgPSBtYWlucG9zX2UtPm5leHQ7Ci0gICAgICBtYWlucG9zX2UtPm5leHQgPSBuZXdfZTsKLSAgICAgIG91cl9lID0gbmV3X2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8qIEV4aXN0aW5nIGVudCBpcyBub3QgaW4gaXRzIG1haW4gcG9zaXRpb24gKGl0IGlzIGEgbm9kZSBpbiBzb21lIG90aGVyCi0gICAgICAgKiBjaGFpbikuICBUaGlzIGltcGxpZXMgdGhhdCBubyBleGlzdGluZyBlbnQgaW4gdGhlIHRhYmxlIGhhcyBvdXIgaGFzaC4KLSAgICAgICAqIEV2aWN0IGl0ICh1cGRhdGluZyBpdHMgY2hhaW4pIGFuZCB1c2UgaXRzIGVudCBmb3IgaGVhZCBvZiBvdXIgY2hhaW4uICovCi0gICAgICAqbmV3X2UgPSAqbWFpbnBvc19lOyAgLyogY29waWVzIG5leHQuICovCi0gICAgICB3aGlsZSAoY2hhaW4tPm5leHQgIT0gbWFpbnBvc19lKSB7Ci0gICAgICAgIGNoYWluID0gKHVwYl90YWJlbnQqKWNoYWluLT5uZXh0OwotICAgICAgICBhc3NlcnQoY2hhaW4pOwotICAgICAgfQotICAgICAgY2hhaW4tPm5leHQgPSBuZXdfZTsKLSAgICAgIG91cl9lID0gbWFpbnBvc19lOwotICAgICAgb3VyX2UtPm5leHQgPSBOVUxMOwotICAgIH0KLSAgfQotICBvdXJfZS0+a2V5ID0gdGFia2V5OwotICBvdXJfZS0+dmFsLnZhbCA9IHZhbC52YWw7Ci0gIGFzc2VydChmaW5kZW50cnkodCwga2V5LCBoYXNoLCBlcWwpID09IG91cl9lKTsKLX0KLQotc3RhdGljIGJvb2wgcm0odXBiX3RhYmxlICp0LCBsb29rdXBrZXlfdCBrZXksIHVwYl92YWx1ZSAqdmFsLAotICAgICAgICAgICAgICAgdXBiX3RhYmtleSAqcmVtb3ZlZCwgdWludDMyX3QgaGFzaCwgZXFsZnVuY190ICplcWwpIHsKLSAgdXBiX3RhYmVudCAqY2hhaW4gPSBnZXRlbnRyeV9tdXRhYmxlKHQsIGhhc2gpOwotICBpZiAodXBiX3RhYmVudF9pc2VtcHR5KGNoYWluKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoZXFsKGNoYWluLT5rZXksIGtleSkpIHsKLSAgICAvKiBFbGVtZW50IHRvIHJlbW92ZSBpcyBhdCB0aGUgaGVhZCBvZiBpdHMgY2hhaW4uICovCi0gICAgdC0+Y291bnQtLTsKLSAgICBpZiAodmFsKSB7Ci0gICAgICBfdXBiX3ZhbHVlX3NldHZhbCh2YWwsIGNoYWluLT52YWwudmFsLCB0LT5jdHlwZSk7Ci0gICAgfQotICAgIGlmIChjaGFpbi0+bmV4dCkgewotICAgICAgdXBiX3RhYmVudCAqbW92ZSA9ICh1cGJfdGFiZW50KiljaGFpbi0+bmV4dDsKLSAgICAgICpjaGFpbiA9ICptb3ZlOwotICAgICAgaWYgKHJlbW92ZWQpICpyZW1vdmVkID0gbW92ZS0+a2V5OwotICAgICAgbW92ZS0+a2V5ID0gMDsgIC8qIE1ha2UgdGhlIHNsb3QgZW1wdHkuICovCi0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChyZW1vdmVkKSAqcmVtb3ZlZCA9IGNoYWluLT5rZXk7Ci0gICAgICBjaGFpbi0+a2V5ID0gMDsgIC8qIE1ha2UgdGhlIHNsb3QgZW1wdHkuICovCi0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIC8qIEVsZW1lbnQgdG8gcmVtb3ZlIGlzIGVpdGhlciBpbiBhIG5vbi1oZWFkIHBvc2l0aW9uIG9yIG5vdCBpbiB0aGUKLSAgICAgKiB0YWJsZS4gKi8KLSAgICB3aGlsZSAoY2hhaW4tPm5leHQgJiYgIWVxbChjaGFpbi0+bmV4dC0+a2V5LCBrZXkpKQotICAgICAgY2hhaW4gPSAodXBiX3RhYmVudCopY2hhaW4tPm5leHQ7Ci0gICAgaWYgKGNoYWluLT5uZXh0KSB7Ci0gICAgICAvKiBGb3VuZCBlbGVtZW50IHRvIHJlbW92ZS4gKi8KLSAgICAgIHVwYl90YWJlbnQgKnJtOwotCi0gICAgICBpZiAodmFsKSB7Ci0gICAgICAgIF91cGJfdmFsdWVfc2V0dmFsKHZhbCwgY2hhaW4tPm5leHQtPnZhbC52YWwsIHQtPmN0eXBlKTsKLSAgICAgIH0KLSAgICAgIHJtID0gKHVwYl90YWJlbnQqKWNoYWluLT5uZXh0OwotICAgICAgaWYgKHJlbW92ZWQpICpyZW1vdmVkID0gcm0tPmtleTsKLSAgICAgIHJtLT5rZXkgPSAwOwotICAgICAgY2hhaW4tPm5leHQgPSBybS0+bmV4dDsKLSAgICAgIHQtPmNvdW50LS07Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgc2l6ZV90IG5leHQoY29uc3QgdXBiX3RhYmxlICp0LCBzaXplX3QgaSkgewotICBkbyB7Ci0gICAgaWYgKCsraSA+PSB1cGJfdGFibGVfc2l6ZSh0KSkKLSAgICAgIHJldHVybiBTSVpFX01BWDsKLSAgfSB3aGlsZSh1cGJfdGFiZW50X2lzZW1wdHkoJnQtPmVudHJpZXNbaV0pKTsKLQotICByZXR1cm4gaTsKLX0KLQotc3RhdGljIHNpemVfdCBiZWdpbihjb25zdCB1cGJfdGFibGUgKnQpIHsKLSAgcmV0dXJuIG5leHQodCwgLTEpOwotfQotCi0KLS8qIHVwYl9zdHJ0YWJsZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEEgc2ltcGxlICJzdWJjbGFzcyIgb2YgdXBiX3RhYmxlIHRoYXQgb25seSBhZGRzIGEgaGFzaCBmdW5jdGlvbiBmb3Igc3RyaW5ncy4gKi8KLQotc3RhdGljIHVwYl90YWJrZXkgc3RyY29weShsb29rdXBrZXlfdCBrMiwgdXBiX2FsbG9jICphKSB7Ci0gIGNoYXIgKnN0ciA9IHVwYl9tYWxsb2MoYSwgazIuc3RyLmxlbiArIHNpemVvZih1aW50MzJfdCkgKyAxKTsKLSAgaWYgKHN0ciA9PSBOVUxMKSByZXR1cm4gMDsKLSAgbWVtY3B5KHN0ciwgJmsyLnN0ci5sZW4sIHNpemVvZih1aW50MzJfdCkpOwotICBtZW1jcHkoc3RyICsgc2l6ZW9mKHVpbnQzMl90KSwgazIuc3RyLnN0ciwgazIuc3RyLmxlbiArIDEpOwotICByZXR1cm4gKHVpbnRwdHJfdClzdHI7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBzdHJoYXNoKHVwYl90YWJrZXkga2V5KSB7Ci0gIHVpbnQzMl90IGxlbjsKLSAgY2hhciAqc3RyID0gdXBiX3RhYnN0cihrZXksICZsZW4pOwotICByZXR1cm4gTXVybXVySGFzaDIoc3RyLCBsZW4sIDApOwotfQotCi1zdGF0aWMgYm9vbCBzdHJlcWwodXBiX3RhYmtleSBrMSwgbG9va3Vwa2V5X3QgazIpIHsKLSAgdWludDMyX3QgbGVuOwotICBjaGFyICpzdHIgPSB1cGJfdGFic3RyKGsxLCAmbGVuKTsKLSAgcmV0dXJuIGxlbiA9PSBrMi5zdHIubGVuICYmIG1lbWNtcChzdHIsIGsyLnN0ci5zdHIsIGxlbikgPT0gMDsKLX0KLQotYm9vbCB1cGJfc3RydGFibGVfaW5pdDIodXBiX3N0cnRhYmxlICp0LCB1cGJfY3R5cGVfdCBjdHlwZSwgdXBiX2FsbG9jICphKSB7Ci0gIHJldHVybiBpbml0KCZ0LT50LCBjdHlwZSwgMiwgYSk7Ci19Ci0KLXZvaWQgdXBiX3N0cnRhYmxlX3VuaW5pdDIodXBiX3N0cnRhYmxlICp0LCB1cGJfYWxsb2MgKmEpIHsKLSAgc2l6ZV90IGk7Ci0gIGZvciAoaSA9IDA7IGkgPCB1cGJfdGFibGVfc2l6ZSgmdC0+dCk7IGkrKykKLSAgICB1cGJfZnJlZShhLCAodm9pZCopdC0+dC5lbnRyaWVzW2ldLmtleSk7Ci0gIHVuaW5pdCgmdC0+dCwgYSk7Ci19Ci0KLWJvb2wgdXBiX3N0cnRhYmxlX3Jlc2l6ZSh1cGJfc3RydGFibGUgKnQsIHNpemVfdCBzaXplX2xnMiwgdXBiX2FsbG9jICphKSB7Ci0gIHVwYl9zdHJ0YWJsZSBuZXdfdGFibGU7Ci0gIHVwYl9zdHJ0YWJsZV9pdGVyIGk7Ci0KLSAgdXBiX2NoZWNrX2FsbG9jKCZ0LT50LCBhKTsKLQotICBpZiAoIWluaXQoJm5ld190YWJsZS50LCB0LT50LmN0eXBlLCBzaXplX2xnMiwgYSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICB1cGJfc3RydGFibGVfYmVnaW4oJmksIHQpOwotICBmb3IgKCA7ICF1cGJfc3RydGFibGVfZG9uZSgmaSk7IHVwYl9zdHJ0YWJsZV9uZXh0KCZpKSkgewotICAgIHVwYl9zdHJ0YWJsZV9pbnNlcnQzKAotICAgICAgICAmbmV3X3RhYmxlLAotICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXkoJmkpLAotICAgICAgICB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoJmkpLAotICAgICAgICB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaSksCi0gICAgICAgIGEpOwotICB9Ci0gIHVwYl9zdHJ0YWJsZV91bmluaXQyKHQsIGEpOwotICAqdCA9IG5ld190YWJsZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgdXBiX3N0cnRhYmxlX2luc2VydDModXBiX3N0cnRhYmxlICp0LCBjb25zdCBjaGFyICprLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfdmFsdWUgdiwgdXBiX2FsbG9jICphKSB7Ci0gIGxvb2t1cGtleV90IGtleTsKLSAgdXBiX3RhYmtleSB0YWJrZXk7Ci0gIHVpbnQzMl90IGhhc2g7Ci0KLSAgdXBiX2NoZWNrX2FsbG9jKCZ0LT50LCBhKTsKLQotICBpZiAoaXNmdWxsKCZ0LT50KSkgewotICAgIC8qIE5lZWQgdG8gcmVzaXplLiAgTmV3IHRhYmxlIG9mIGRvdWJsZSB0aGUgc2l6ZSwgYWRkIG9sZCBlbGVtZW50cyB0byBpdC4gKi8KLSAgICBpZiAoIXVwYl9zdHJ0YWJsZV9yZXNpemUodCwgdC0+dC5zaXplX2xnMiArIDEsIGEpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAga2V5ID0gc3Rya2V5MihrLCBsZW4pOwotICB0YWJrZXkgPSBzdHJjb3B5KGtleSwgYSk7Ci0gIGlmICh0YWJrZXkgPT0gMCkgcmV0dXJuIGZhbHNlOwotCi0gIGhhc2ggPSBNdXJtdXJIYXNoMihrZXkuc3RyLnN0ciwga2V5LnN0ci5sZW4sIDApOwotICBpbnNlcnQoJnQtPnQsIGtleSwgdGFia2V5LCB2LCBoYXNoLCAmc3RyaGFzaCwgJnN0cmVxbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9zdHJ0YWJsZV9sb29rdXAyKGNvbnN0IHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfdmFsdWUgKnYpIHsKLSAgdWludDMyX3QgaGFzaCA9IE11cm11ckhhc2gyKGtleSwgbGVuLCAwKTsKLSAgcmV0dXJuIGxvb2t1cCgmdC0+dCwgc3Rya2V5MihrZXksIGxlbiksIHYsIGhhc2gsICZzdHJlcWwpOwotfQotCi1ib29sIHVwYl9zdHJ0YWJsZV9yZW1vdmUzKHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSAqdmFsLCB1cGJfYWxsb2MgKmFsbG9jKSB7Ci0gIHVpbnQzMl90IGhhc2ggPSBNdXJtdXJIYXNoMihrZXksIHN0cmxlbihrZXkpLCAwKTsKLSAgdXBiX3RhYmtleSB0YWJrZXk7Ci0gIGlmIChybSgmdC0+dCwgc3Rya2V5MihrZXksIGxlbiksIHZhbCwgJnRhYmtleSwgaGFzaCwgJnN0cmVxbCkpIHsKLSAgICB1cGJfZnJlZShhbGxvYywgKHZvaWQqKXRhYmtleSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLS8qIEl0ZXJhdGlvbiAqLwotCi1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCAqc3RyX3RhYmVudChjb25zdCB1cGJfc3RydGFibGVfaXRlciAqaSkgewotICByZXR1cm4gJmktPnQtPnQuZW50cmllc1tpLT5pbmRleF07Ci19Ci0KLXZvaWQgdXBiX3N0cnRhYmxlX2JlZ2luKHVwYl9zdHJ0YWJsZV9pdGVyICppLCBjb25zdCB1cGJfc3RydGFibGUgKnQpIHsKLSAgaS0+dCA9IHQ7Ci0gIGktPmluZGV4ID0gYmVnaW4oJnQtPnQpOwotfQotCi12b2lkIHVwYl9zdHJ0YWJsZV9uZXh0KHVwYl9zdHJ0YWJsZV9pdGVyICppKSB7Ci0gIGktPmluZGV4ID0gbmV4dCgmaS0+dC0+dCwgaS0+aW5kZXgpOwotfQotCi1ib29sIHVwYl9zdHJ0YWJsZV9kb25lKGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKSB7Ci0gIHJldHVybiBpLT5pbmRleCA+PSB1cGJfdGFibGVfc2l6ZSgmaS0+dC0+dCkgfHwKLSAgICAgICAgIHVwYl90YWJlbnRfaXNlbXB0eShzdHJfdGFiZW50KGkpKTsKLX0KLQotY29uc3QgY2hhciAqdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKSB7Ci0gIGFzc2VydCghdXBiX3N0cnRhYmxlX2RvbmUoaSkpOwotICByZXR1cm4gdXBiX3RhYnN0cihzdHJfdGFiZW50KGkpLT5rZXksIE5VTEwpOwotfQotCi1zaXplX3QgdXBiX3N0cnRhYmxlX2l0ZXJfa2V5bGVuZ3RoKGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKSB7Ci0gIHVpbnQzMl90IGxlbjsKLSAgYXNzZXJ0KCF1cGJfc3RydGFibGVfZG9uZShpKSk7Ci0gIHVwYl90YWJzdHIoc3RyX3RhYmVudChpKS0+a2V5LCAmbGVuKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotdXBiX3ZhbHVlIHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKSB7Ci0gIGFzc2VydCghdXBiX3N0cnRhYmxlX2RvbmUoaSkpOwotICByZXR1cm4gX3VwYl92YWx1ZV92YWwoc3RyX3RhYmVudChpKS0+dmFsLnZhbCwgaS0+dC0+dC5jdHlwZSk7Ci19Ci0KLXZvaWQgdXBiX3N0cnRhYmxlX2l0ZXJfc2V0ZG9uZSh1cGJfc3RydGFibGVfaXRlciAqaSkgewotICBpLT5pbmRleCA9IFNJWkVfTUFYOwotfQotCi1ib29sIHVwYl9zdHJ0YWJsZV9pdGVyX2lzZXF1YWwoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppMikgewotICBpZiAodXBiX3N0cnRhYmxlX2RvbmUoaTEpICYmIHVwYl9zdHJ0YWJsZV9kb25lKGkyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGkxLT50ID09IGkyLT50ICYmIGkxLT5pbmRleCA9PSBpMi0+aW5kZXg7Ci19Ci0KLQotLyogdXBiX2ludHRhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogRm9yIGludHRhYmxlcyB3ZSB1c2UgYSBoeWJyaWQgc3RydWN0dXJlIHdoZXJlIHNtYWxsIGtleXMgYXJlIGtlcHQgaW4gYW4KLSAqIGFycmF5IGFuZCBsYXJnZSBrZXlzIGFyZSBwdXQgaW4gdGhlIGhhc2ggdGFibGUuICovCi0KLXN0YXRpYyB1aW50MzJfdCBpbnRoYXNoKHVwYl90YWJrZXkga2V5KSB7IHJldHVybiB1cGJfaW50aGFzaChrZXkpOyB9Ci0KLXN0YXRpYyBib29sIGludGVxbCh1cGJfdGFia2V5IGsxLCBsb29rdXBrZXlfdCBrMikgewotICByZXR1cm4gazEgPT0gazIubnVtOwotfQotCi1zdGF0aWMgdXBiX3RhYnZhbCAqbXV0YWJsZV9hcnJheSh1cGJfaW50dGFibGUgKnQpIHsKLSAgcmV0dXJuICh1cGJfdGFidmFsKil0LT5hcnJheTsKLX0KLQotc3RhdGljIHVwYl90YWJ2YWwgKmludHRhYmxlX3ZhbCh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXkpIHsKLSAgaWYgKGtleSA8IHQtPmFycmF5X3NpemUpIHsKLSAgICByZXR1cm4gdXBiX2Fycmhhcyh0LT5hcnJheVtrZXldKSA/ICYobXV0YWJsZV9hcnJheSh0KVtrZXldKSA6IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgdXBiX3RhYmVudCAqZSA9Ci0gICAgICAgIGZpbmRlbnRyeV9tdXRhYmxlKCZ0LT50LCBpbnRrZXkoa2V5KSwgdXBiX2ludGhhc2goa2V5KSwgJmludGVxbCk7Ci0gICAgcmV0dXJuIGUgPyAmZS0+dmFsIDogTlVMTDsKLSAgfQotfQotCi1zdGF0aWMgY29uc3QgdXBiX3RhYnZhbCAqaW50dGFibGVfdmFsX2NvbnN0KGNvbnN0IHVwYl9pbnR0YWJsZSAqdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90IGtleSkgewotICByZXR1cm4gaW50dGFibGVfdmFsKCh1cGJfaW50dGFibGUqKXQsIGtleSk7Ci19Ci0KLXNpemVfdCB1cGJfaW50dGFibGVfY291bnQoY29uc3QgdXBiX2ludHRhYmxlICp0KSB7Ci0gIHJldHVybiB0LT50LmNvdW50ICsgdC0+YXJyYXlfY291bnQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGNoZWNrKHVwYl9pbnR0YWJsZSAqdCkgewotICBVUEJfVU5VU0VEKHQpOwotI2lmIGRlZmluZWQoVVBCX0RFQlVHX1RBQkxFKSAmJiAhZGVmaW5lZChOREVCVUcpCi0gIHsKLSAgICAvKiBUaGlzIGNoZWNrIGlzIHZlcnkgZXhwZW5zaXZlIChtYWtlcyBpbnNlcnRzL2RlbGV0ZXMgTyhOKSkuICovCi0gICAgc2l6ZV90IGNvdW50ID0gMDsKLSAgICB1cGJfaW50dGFibGVfaXRlciBpOwotICAgIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgdCk7Ci0gICAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpKTsgdXBiX2ludHRhYmxlX25leHQoJmkpLCBjb3VudCsrKSB7Ci0gICAgICBhc3NlcnQodXBiX2ludHRhYmxlX2xvb2t1cCh0LCB1cGJfaW50dGFibGVfaXRlcl9rZXkoJmkpLCBOVUxMKSk7Ci0gICAgfQotICAgIGFzc2VydChjb3VudCA9PSB1cGJfaW50dGFibGVfY291bnQodCkpOwotICB9Ci0jZW5kaWYKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfc2l6ZWRpbml0KHVwYl9pbnR0YWJsZSAqdCwgdXBiX2N0eXBlX3QgY3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGFzaXplLCBpbnQgaHNpemVfbGcyLCB1cGJfYWxsb2MgKmEpIHsKLSAgc2l6ZV90IGFycmF5X2J5dGVzOwotCi0gIGlmICghaW5pdCgmdC0+dCwgY3R5cGUsIGhzaXplX2xnMiwgYSkpIHJldHVybiBmYWxzZTsKLSAgLyogQWx3YXlzIG1ha2UgdGhlIGFycmF5IHBhcnQgYXQgbGVhc3QgMSBsb25nLCBzbyB0aGF0IHdlIGtub3cga2V5IDAKLSAgICogd29uJ3QgYmUgaW4gdGhlIGhhc2ggcGFydCwgd2hpY2ggc2ltcGxpZmllcyB0aGluZ3MuICovCi0gIHQtPmFycmF5X3NpemUgPSBVUEJfTUFYKDEsIGFzaXplKTsKLSAgdC0+YXJyYXlfY291bnQgPSAwOwotICBhcnJheV9ieXRlcyA9IHQtPmFycmF5X3NpemUgKiBzaXplb2YodXBiX3ZhbHVlKTsKLSAgdC0+YXJyYXkgPSB1cGJfbWFsbG9jKGEsIGFycmF5X2J5dGVzKTsKLSAgaWYgKCF0LT5hcnJheSkgewotICAgIHVuaW5pdCgmdC0+dCwgYSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIG1lbXNldChtdXRhYmxlX2FycmF5KHQpLCAweGZmLCBhcnJheV9ieXRlcyk7Ci0gIGNoZWNrKHQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfaW5pdDIodXBiX2ludHRhYmxlICp0LCB1cGJfY3R5cGVfdCBjdHlwZSwgdXBiX2FsbG9jICphKSB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfc2l6ZWRpbml0KHQsIGN0eXBlLCAwLCA0LCBhKTsKLX0KLQotdm9pZCB1cGJfaW50dGFibGVfdW5pbml0Mih1cGJfaW50dGFibGUgKnQsIHVwYl9hbGxvYyAqYSkgewotICB1bmluaXQoJnQtPnQsIGEpOwotICB1cGJfZnJlZShhLCBtdXRhYmxlX2FycmF5KHQpKTsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfaW5zZXJ0Mih1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9hbGxvYyAqYSkgewotICB1cGJfdGFidmFsIHRhYnZhbDsKLSAgdGFidmFsLnZhbCA9IHZhbC52YWw7Ci0gIFVQQl9VTlVTRUQodGFidmFsKTsKLSAgYXNzZXJ0KHVwYl9hcnJoYXModGFidmFsKSk7ICAvKiBUaGlzIHdpbGwgcmVqZWN0ICh1aW50NjRfdCktMS4gIEZpeCB0aGlzLiAqLwotCi0gIHVwYl9jaGVja19hbGxvYygmdC0+dCwgYSk7Ci0KLSAgaWYgKGtleSA8IHQtPmFycmF5X3NpemUpIHsKLSAgICBhc3NlcnQoIXVwYl9hcnJoYXModC0+YXJyYXlba2V5XSkpOwotICAgIHQtPmFycmF5X2NvdW50Kys7Ci0gICAgbXV0YWJsZV9hcnJheSh0KVtrZXldLnZhbCA9IHZhbC52YWw7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGlzZnVsbCgmdC0+dCkpIHsKLSAgICAgIC8qIE5lZWQgdG8gcmVzaXplIHRoZSBoYXNoIHBhcnQsIGJ1dCB3ZSByZS11c2UgdGhlIGFycmF5IHBhcnQuICovCi0gICAgICBzaXplX3QgaTsKLSAgICAgIHVwYl90YWJsZSBuZXdfdGFibGU7Ci0KLSAgICAgIGlmICghaW5pdCgmbmV3X3RhYmxlLCB0LT50LmN0eXBlLCB0LT50LnNpemVfbGcyICsgMSwgYSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBmb3IgKGkgPSBiZWdpbigmdC0+dCk7IGkgPCB1cGJfdGFibGVfc2l6ZSgmdC0+dCk7IGkgPSBuZXh0KCZ0LT50LCBpKSkgewotICAgICAgICBjb25zdCB1cGJfdGFiZW50ICplID0gJnQtPnQuZW50cmllc1tpXTsKLSAgICAgICAgdWludDMyX3QgaGFzaDsKLSAgICAgICAgdXBiX3ZhbHVlIHY7Ci0KLSAgICAgICAgX3VwYl92YWx1ZV9zZXR2YWwoJnYsIGUtPnZhbC52YWwsIHQtPnQuY3R5cGUpOwotICAgICAgICBoYXNoID0gdXBiX2ludGhhc2goZS0+a2V5KTsKLSAgICAgICAgaW5zZXJ0KCZuZXdfdGFibGUsIGludGtleShlLT5rZXkpLCBlLT5rZXksIHYsIGhhc2gsICZpbnRoYXNoLCAmaW50ZXFsKTsKLSAgICAgIH0KLQotICAgICAgYXNzZXJ0KHQtPnQuY291bnQgPT0gbmV3X3RhYmxlLmNvdW50KTsKLQotICAgICAgdW5pbml0KCZ0LT50LCBhKTsKLSAgICAgIHQtPnQgPSBuZXdfdGFibGU7Ci0gICAgfQotICAgIGluc2VydCgmdC0+dCwgaW50a2V5KGtleSksIGtleSwgdmFsLCB1cGJfaW50aGFzaChrZXkpLCAmaW50aGFzaCwgJmludGVxbCk7Ci0gIH0KLSAgY2hlY2sodCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9sb29rdXAoY29uc3QgdXBiX2ludHRhYmxlICp0LCB1aW50cHRyX3Qga2V5LCB1cGJfdmFsdWUgKnYpIHsKLSAgY29uc3QgdXBiX3RhYnZhbCAqdGFibGVfdiA9IGludHRhYmxlX3ZhbF9jb25zdCh0LCBrZXkpOwotICBpZiAoIXRhYmxlX3YpIHJldHVybiBmYWxzZTsKLSAgaWYgKHYpIF91cGJfdmFsdWVfc2V0dmFsKHYsIHRhYmxlX3YtPnZhbCwgdC0+dC5jdHlwZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9yZXBsYWNlKHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSwgdXBiX3ZhbHVlIHZhbCkgewotICB1cGJfdGFidmFsICp0YWJsZV92ID0gaW50dGFibGVfdmFsKHQsIGtleSk7Ci0gIGlmICghdGFibGVfdikgcmV0dXJuIGZhbHNlOwotICB0YWJsZV92LT52YWwgPSB2YWwudmFsOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfcmVtb3ZlKHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSwgdXBiX3ZhbHVlICp2YWwpIHsKLSAgYm9vbCBzdWNjZXNzOwotICBpZiAoa2V5IDwgdC0+YXJyYXlfc2l6ZSkgewotICAgIGlmICh1cGJfYXJyaGFzKHQtPmFycmF5W2tleV0pKSB7Ci0gICAgICB1cGJfdGFidmFsIGVtcHR5ID0gVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQ7Ci0gICAgICB0LT5hcnJheV9jb3VudC0tOwotICAgICAgaWYgKHZhbCkgewotICAgICAgICBfdXBiX3ZhbHVlX3NldHZhbCh2YWwsIHQtPmFycmF5W2tleV0udmFsLCB0LT50LmN0eXBlKTsKLSAgICAgIH0KLSAgICAgIG11dGFibGVfYXJyYXkodClba2V5XSA9IGVtcHR5OwotICAgICAgc3VjY2VzcyA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdXBiX3RhYmtleSByZW1vdmVkOwotICAgIHVpbnQzMl90IGhhc2ggPSB1cGJfaW50aGFzaChrZXkpOwotICAgIHN1Y2Nlc3MgPSBybSgmdC0+dCwgaW50a2V5KGtleSksIHZhbCwgJnJlbW92ZWQsIGhhc2gsICZpbnRlcWwpOwotICB9Ci0gIGNoZWNrKHQpOwotICByZXR1cm4gc3VjY2VzczsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfcHVzaDIodXBiX2ludHRhYmxlICp0LCB1cGJfdmFsdWUgdmFsLCB1cGJfYWxsb2MgKmEpIHsKLSAgdXBiX2NoZWNrX2FsbG9jKCZ0LT50LCBhKTsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9pbnNlcnQyKHQsIHVwYl9pbnR0YWJsZV9jb3VudCh0KSwgdmFsLCBhKTsKLX0KLQotdXBiX3ZhbHVlIHVwYl9pbnR0YWJsZV9wb3AodXBiX2ludHRhYmxlICp0KSB7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0gIGJvb2wgb2sgPSB1cGJfaW50dGFibGVfcmVtb3ZlKHQsIHVwYl9pbnR0YWJsZV9jb3VudCh0KSAtIDEsICZ2YWwpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gdmFsOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9pbnNlcnRwdHIyKHVwYl9pbnR0YWJsZSAqdCwgY29uc3Qgdm9pZCAqa2V5LCB1cGJfdmFsdWUgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfYWxsb2MgKmEpIHsKLSAgdXBiX2NoZWNrX2FsbG9jKCZ0LT50LCBhKTsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9pbnNlcnQyKHQsICh1aW50cHRyX3Qpa2V5LCB2YWwsIGEpOwotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoY29uc3QgdXBiX2ludHRhYmxlICp0LCBjb25zdCB2b2lkICprZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlICp2KSB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfbG9va3VwKHQsICh1aW50cHRyX3Qpa2V5LCB2KTsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfcmVtb3ZlcHRyKHVwYl9pbnR0YWJsZSAqdCwgY29uc3Qgdm9pZCAqa2V5LCB1cGJfdmFsdWUgKnZhbCkgewotICByZXR1cm4gdXBiX2ludHRhYmxlX3JlbW92ZSh0LCAodWludHB0cl90KWtleSwgdmFsKTsKLX0KLQotdm9pZCB1cGJfaW50dGFibGVfY29tcGFjdDIodXBiX2ludHRhYmxlICp0LCB1cGJfYWxsb2MgKmEpIHsKLSAgLyogQSBwb3dlci1vZi10d28gaGlzdG9ncmFtIG9mIHRoZSB0YWJsZSBrZXlzLiAqLwotICBzaXplX3QgY291bnRzW1VQQl9NQVhBUlJTSVpFICsgMV0gPSB7MH07Ci0KLSAgLyogVGhlIG1heCBrZXkgaW4gZWFjaCBidWNrZXQuICovCi0gIHVpbnRwdHJfdCBtYXhbVVBCX01BWEFSUlNJWkUgKyAxXSA9IHswfTsKLQotICB1cGJfaW50dGFibGVfaXRlciBpOwotICBzaXplX3QgYXJyX2NvdW50OwotICBpbnQgc2l6ZV9sZzI7Ci0gIHVwYl9pbnR0YWJsZSBuZXdfdDsKLQotICB1cGJfY2hlY2tfYWxsb2MoJnQtPnQsIGEpOwotCi0gIHVwYl9pbnR0YWJsZV9iZWdpbigmaSwgdCk7Ci0gIGZvciAoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICB1aW50cHRyX3Qga2V5ID0gdXBiX2ludHRhYmxlX2l0ZXJfa2V5KCZpKTsKLSAgICBpbnQgYnVja2V0ID0gbG9nMmNlaWwoa2V5KTsKLSAgICBtYXhbYnVja2V0XSA9IFVQQl9NQVgobWF4W2J1Y2tldF0sIGtleSk7Ci0gICAgY291bnRzW2J1Y2tldF0rKzsKLSAgfQotCi0gIC8qIEZpbmQgdGhlIGxhcmdlc3QgcG93ZXIgb2YgdHdvIHRoYXQgc2F0aXNmaWVzIHRoZSBNSU5fREVOU0lUWQotICAgKiBkZWZpbml0aW9uICh3aGlsZSBhY3R1YWxseSBoYXZpbmcgc29tZSBrZXlzKS4gKi8KLSAgYXJyX2NvdW50ID0gdXBiX2ludHRhYmxlX2NvdW50KHQpOwotCi0gIGZvciAoc2l6ZV9sZzIgPSBBUlJBWV9TSVpFKGNvdW50cykgLSAxOyBzaXplX2xnMiA+IDA7IHNpemVfbGcyLS0pIHsKLSAgICBpZiAoY291bnRzW3NpemVfbGcyXSA9PSAwKSB7Ci0gICAgICAvKiBXZSBjYW4gaGFsdmUgYWdhaW4gd2l0aG91dCBsb3NpbmcgYW55IGVudHJpZXMuICovCi0gICAgICBjb250aW51ZTsKLSAgICB9IGVsc2UgaWYgKGFycl9jb3VudCA+PSAoMSA8PCBzaXplX2xnMikgKiBNSU5fREVOU0lUWSkgewotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgYXJyX2NvdW50IC09IGNvdW50c1tzaXplX2xnMl07Ci0gIH0KLQotICBhc3NlcnQoYXJyX2NvdW50IDw9IHVwYl9pbnR0YWJsZV9jb3VudCh0KSk7Ci0KLSAgewotICAgIC8qIEluc2VydCBhbGwgZWxlbWVudHMgaW50byBuZXcsIHBlcmZlY3RseS1zaXplZCB0YWJsZS4gKi8KLSAgICBzaXplX3QgYXJyX3NpemUgPSBtYXhbc2l6ZV9sZzJdICsgMTsgIC8qICsxIHNvIGFyclttYXhdIHdpbGwgZml0LiAqLwotICAgIHNpemVfdCBoYXNoX2NvdW50ID0gdXBiX2ludHRhYmxlX2NvdW50KHQpIC0gYXJyX2NvdW50OwotICAgIHNpemVfdCBoYXNoX3NpemUgPSBoYXNoX2NvdW50ID8gKGhhc2hfY291bnQgLyBNQVhfTE9BRCkgKyAxIDogMDsKLSAgICBzaXplX3QgaGFzaHNpemVfbGcyID0gbG9nMmNlaWwoaGFzaF9zaXplKTsKLQotICAgIHVwYl9pbnR0YWJsZV9zaXplZGluaXQoJm5ld190LCB0LT50LmN0eXBlLCBhcnJfc2l6ZSwgaGFzaHNpemVfbGcyLCBhKTsKLSAgICB1cGJfaW50dGFibGVfYmVnaW4oJmksIHQpOwotICAgIGZvciAoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICAgIHVpbnRwdHJfdCBrID0gdXBiX2ludHRhYmxlX2l0ZXJfa2V5KCZpKTsKLSAgICAgIHVwYl9pbnR0YWJsZV9pbnNlcnQyKCZuZXdfdCwgaywgdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpLCBhKTsKLSAgICB9Ci0gICAgYXNzZXJ0KG5ld190LmFycmF5X3NpemUgPT0gYXJyX3NpemUpOwotICAgIGFzc2VydChuZXdfdC50LnNpemVfbGcyID09IGhhc2hzaXplX2xnMik7Ci0gIH0KLSAgdXBiX2ludHRhYmxlX3VuaW5pdDIodCwgYSk7Ci0gICp0ID0gbmV3X3Q7Ci19Ci0KLS8qIEl0ZXJhdGlvbi4gKi8KLQotc3RhdGljIGNvbnN0IHVwYl90YWJlbnQgKmludF90YWJlbnQoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpIHsKLSAgYXNzZXJ0KCFpLT5hcnJheV9wYXJ0KTsKLSAgcmV0dXJuICZpLT50LT50LmVudHJpZXNbaS0+aW5kZXhdOwotfQotCi1zdGF0aWMgdXBiX3RhYnZhbCBpbnRfYXJyZW50KGNvbnN0IHVwYl9pbnR0YWJsZV9pdGVyICppKSB7Ci0gIGFzc2VydChpLT5hcnJheV9wYXJ0KTsKLSAgcmV0dXJuIGktPnQtPmFycmF5W2ktPmluZGV4XTsKLX0KLQotdm9pZCB1cGJfaW50dGFibGVfYmVnaW4odXBiX2ludHRhYmxlX2l0ZXIgKmksIGNvbnN0IHVwYl9pbnR0YWJsZSAqdCkgewotICBpLT50ID0gdDsKLSAgaS0+aW5kZXggPSAtMTsKLSAgaS0+YXJyYXlfcGFydCA9IHRydWU7Ci0gIHVwYl9pbnR0YWJsZV9uZXh0KGkpOwotfQotCi12b2lkIHVwYl9pbnR0YWJsZV9uZXh0KHVwYl9pbnR0YWJsZV9pdGVyICppdGVyKSB7Ci0gIGNvbnN0IHVwYl9pbnR0YWJsZSAqdCA9IGl0ZXItPnQ7Ci0gIGlmIChpdGVyLT5hcnJheV9wYXJ0KSB7Ci0gICAgd2hpbGUgKCsraXRlci0+aW5kZXggPCB0LT5hcnJheV9zaXplKSB7Ci0gICAgICBpZiAodXBiX2FycmhhcyhpbnRfYXJyZW50KGl0ZXIpKSkgewotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotICAgIGl0ZXItPmFycmF5X3BhcnQgPSBmYWxzZTsKLSAgICBpdGVyLT5pbmRleCA9IGJlZ2luKCZ0LT50KTsKLSAgfSBlbHNlIHsKLSAgICBpdGVyLT5pbmRleCA9IG5leHQoJnQtPnQsIGl0ZXItPmluZGV4KTsKLSAgfQotfQotCi1ib29sIHVwYl9pbnR0YWJsZV9kb25lKGNvbnN0IHVwYl9pbnR0YWJsZV9pdGVyICppKSB7Ci0gIGlmIChpLT5hcnJheV9wYXJ0KSB7Ci0gICAgcmV0dXJuIGktPmluZGV4ID49IGktPnQtPmFycmF5X3NpemUgfHwKLSAgICAgICAgICAgIXVwYl9hcnJoYXMoaW50X2FycmVudChpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGktPmluZGV4ID49IHVwYl90YWJsZV9zaXplKCZpLT50LT50KSB8fAotICAgICAgICAgICB1cGJfdGFiZW50X2lzZW1wdHkoaW50X3RhYmVudChpKSk7Ci0gIH0KLX0KLQotdWludHB0cl90IHVwYl9pbnR0YWJsZV9pdGVyX2tleShjb25zdCB1cGJfaW50dGFibGVfaXRlciAqaSkgewotICBhc3NlcnQoIXVwYl9pbnR0YWJsZV9kb25lKGkpKTsKLSAgcmV0dXJuIGktPmFycmF5X3BhcnQgPyBpLT5pbmRleCA6IGludF90YWJlbnQoaSktPmtleTsKLX0KLQotdXBiX3ZhbHVlIHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKGNvbnN0IHVwYl9pbnR0YWJsZV9pdGVyICppKSB7Ci0gIGFzc2VydCghdXBiX2ludHRhYmxlX2RvbmUoaSkpOwotICByZXR1cm4gX3VwYl92YWx1ZV92YWwoCi0gICAgICBpLT5hcnJheV9wYXJ0ID8gaS0+dC0+YXJyYXlbaS0+aW5kZXhdLnZhbCA6IGludF90YWJlbnQoaSktPnZhbC52YWwsCi0gICAgICBpLT50LT50LmN0eXBlKTsKLX0KLQotdm9pZCB1cGJfaW50dGFibGVfaXRlcl9zZXRkb25lKHVwYl9pbnR0YWJsZV9pdGVyICppKSB7Ci0gIGktPmluZGV4ID0gU0laRV9NQVg7Ci0gIGktPmFycmF5X3BhcnQgPSBmYWxzZTsKLX0KLQotYm9vbCB1cGJfaW50dGFibGVfaXRlcl9pc2VxdWFsKGNvbnN0IHVwYl9pbnR0YWJsZV9pdGVyICppMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9pbnR0YWJsZV9pdGVyICppMikgewotICBpZiAodXBiX2ludHRhYmxlX2RvbmUoaTEpICYmIHVwYl9pbnR0YWJsZV9kb25lKGkyKSkKLSAgICByZXR1cm4gdHJ1ZTsKLSAgcmV0dXJuIGkxLT50ID09IGkyLT50ICYmIGkxLT5pbmRleCA9PSBpMi0+aW5kZXggJiYKLSAgICAgICAgIGkxLT5hcnJheV9wYXJ0ID09IGkyLT5hcnJheV9wYXJ0OwotfQotCi0jaWZkZWYgVVBCX1VOQUxJR05FRF9SRUFEU19PSwotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE11cm11ckhhc2gyLCBieSBBdXN0aW4gQXBwbGVieSAocmVsZWFzZWQgYXMgcHVibGljIGRvbWFpbikuCi0gKiBSZWZvcm1hdHRlZCBhbmQgQzk5LWlmaWVkIGJ5IEpvc2h1YSBIYWJlcm1hbi4KLSAqIE5vdGUgLSBUaGlzIGNvZGUgbWFrZXMgYSBmZXcgYXNzdW1wdGlvbnMgYWJvdXQgaG93IHlvdXIgbWFjaGluZSBiZWhhdmVzIC0KLSAqICAgMS4gV2UgY2FuIHJlYWQgYSA0LWJ5dGUgdmFsdWUgZnJvbSBhbnkgYWRkcmVzcyB3aXRob3V0IGNyYXNoaW5nCi0gKiAgIDIuIHNpemVvZihpbnQpID09IDQgKGluIHVwYiB0aGlzIGxpbWl0YXRpb24gaXMgcmVtb3ZlZCBieSB1c2luZyB1aW50MzJfdAotICogQW5kIGl0IGhhcyBhIGZldyBsaW1pdGF0aW9ucyAtCi0gKiAgIDEuIEl0IHdpbGwgbm90IHdvcmsgaW5jcmVtZW50YWxseS4KLSAqICAgMi4gSXQgd2lsbCBub3QgcHJvZHVjZSB0aGUgc2FtZSByZXN1bHRzIG9uIGxpdHRsZS1lbmRpYW4gYW5kIGJpZy1lbmRpYW4KLSAqICAgICAgbWFjaGluZXMuICovCi11aW50MzJfdCBNdXJtdXJIYXNoMihjb25zdCB2b2lkICprZXksIHNpemVfdCBsZW4sIHVpbnQzMl90IHNlZWQpIHsKLSAgLyogJ20nIGFuZCAncicgYXJlIG1peGluZyBjb25zdGFudHMgZ2VuZXJhdGVkIG9mZmxpbmUuCi0gICAqIFRoZXkncmUgbm90IHJlYWxseSAnbWFnaWMnLCB0aGV5IGp1c3QgaGFwcGVuIHRvIHdvcmsgd2VsbC4gKi8KLSAgY29uc3QgdWludDMyX3QgbSA9IDB4NWJkMWU5OTU7Ci0gIGNvbnN0IGludDMyX3QgciA9IDI0OwotCi0gIC8qIEluaXRpYWxpemUgdGhlIGhhc2ggdG8gYSAncmFuZG9tJyB2YWx1ZSAqLwotICB1aW50MzJfdCBoID0gc2VlZCBeIGxlbjsKLQotICAvKiBNaXggNCBieXRlcyBhdCBhIHRpbWUgaW50byB0aGUgaGFzaCAqLwotICBjb25zdCB1aW50OF90ICogZGF0YSA9IChjb25zdCB1aW50OF90ICopa2V5OwotICB3aGlsZShsZW4gPj0gNCkgewotICAgIHVpbnQzMl90IGsgPSAqKHVpbnQzMl90ICopZGF0YTsKLQotICAgIGsgKj0gbTsKLSAgICBrIF49IGsgPj4gcjsKLSAgICBrICo9IG07Ci0KLSAgICBoICo9IG07Ci0gICAgaCBePSBrOwotCi0gICAgZGF0YSArPSA0OwotICAgIGxlbiAtPSA0OwotICB9Ci0KLSAgLyogSGFuZGxlIHRoZSBsYXN0IGZldyBieXRlcyBvZiB0aGUgaW5wdXQgYXJyYXkgKi8KLSAgc3dpdGNoKGxlbikgewotICAgIGNhc2UgMzogaCBePSBkYXRhWzJdIDw8IDE2OwotICAgIGNhc2UgMjogaCBePSBkYXRhWzFdIDw8IDg7Ci0gICAgY2FzZSAxOiBoIF49IGRhdGFbMF07IGggKj0gbTsKLSAgfTsKLQotICAvKiBEbyBhIGZldyBmaW5hbCBtaXhlcyBvZiB0aGUgaGFzaCB0byBlbnN1cmUgdGhlIGxhc3QgZmV3Ci0gICAqIGJ5dGVzIGFyZSB3ZWxsLWluY29ycG9yYXRlZC4gKi8KLSAgaCBePSBoID4+IDEzOwotICBoICo9IG07Ci0gIGggXj0gaCA+PiAxNTsKLQotICByZXR1cm4gaDsKLX0KLQotI2Vsc2UgLyogIVVQQl9VTkFMSUdORURfUkVBRFNfT0sgKi8KLQotLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAqIE11cm11ckhhc2hBbGlnbmVkMiwgYnkgQXVzdGluIEFwcGxlYnkKLSAqIFNhbWUgYWxnb3JpdGhtIGFzIE11cm11ckhhc2gyLCBidXQgb25seSBkb2VzIGFsaWduZWQgcmVhZHMgLSBzaG91bGQgYmUgc2FmZXIKLSAqIG9uIGNlcnRhaW4gcGxhdGZvcm1zLgotICogUGVyZm9ybWFuY2Ugd2lsbCBiZSBsb3dlciB0aGFuIE11cm11ckhhc2gyICovCi0KLSNkZWZpbmUgTUlYKGgsayxtKSB7IGsgKj0gbTsgayBePSBrID4+IHI7IGsgKj0gbTsgaCAqPSBtOyBoIF49IGs7IH0KLQotdWludDMyX3QgTXVybXVySGFzaDIoY29uc3Qgdm9pZCAqIGtleSwgc2l6ZV90IGxlbiwgdWludDMyX3Qgc2VlZCkgewotICBjb25zdCB1aW50MzJfdCBtID0gMHg1YmQxZTk5NTsKLSAgY29uc3QgaW50MzJfdCByID0gMjQ7Ci0gIGNvbnN0IHVpbnQ4X3QgKiBkYXRhID0gKGNvbnN0IHVpbnQ4X3QgKilrZXk7Ci0gIHVpbnQzMl90IGggPSBzZWVkIF4gbGVuOwotICB1aW50OF90IGFsaWduID0gKHVpbnRwdHJfdClkYXRhICYgMzsKLQotICBpZihhbGlnbiAmJiAobGVuID49IDQpKSB7Ci0gICAgLyogUHJlLWxvYWQgdGhlIHRlbXAgcmVnaXN0ZXJzICovCi0gICAgdWludDMyX3QgdCA9IDAsIGQgPSAwOwotICAgIGludDMyX3Qgc2w7Ci0gICAgaW50MzJfdCBzcjsKLQotICAgIHN3aXRjaChhbGlnbikgewotICAgICAgY2FzZSAxOiB0IHw9IGRhdGFbMl0gPDwgMTY7Ci0gICAgICBjYXNlIDI6IHQgfD0gZGF0YVsxXSA8PCA4OwotICAgICAgY2FzZSAzOiB0IHw9IGRhdGFbMF07Ci0gICAgfQotCi0gICAgdCA8PD0gKDggKiBhbGlnbik7Ci0KLSAgICBkYXRhICs9IDQtYWxpZ247Ci0gICAgbGVuIC09IDQtYWxpZ247Ci0KLSAgICBzbCA9IDggKiAoNC1hbGlnbik7Ci0gICAgc3IgPSA4ICogYWxpZ247Ci0KLSAgICAvKiBNaXggKi8KLQotICAgIHdoaWxlKGxlbiA+PSA0KSB7Ci0gICAgICB1aW50MzJfdCBrOwotCi0gICAgICBkID0gKih1aW50MzJfdCAqKWRhdGE7Ci0gICAgICB0ID0gKHQgPj4gc3IpIHwgKGQgPDwgc2wpOwotCi0gICAgICBrID0gdDsKLQotICAgICAgTUlYKGgsayxtKTsKLQotICAgICAgdCA9IGQ7Ci0KLSAgICAgIGRhdGEgKz0gNDsKLSAgICAgIGxlbiAtPSA0OwotICAgIH0KLQotICAgIC8qIEhhbmRsZSBsZWZ0b3ZlciBkYXRhIGluIHRlbXAgcmVnaXN0ZXJzICovCi0KLSAgICBkID0gMDsKLQotICAgIGlmKGxlbiA+PSBhbGlnbikgewotICAgICAgdWludDMyX3QgazsKLQotICAgICAgc3dpdGNoKGFsaWduKSB7Ci0gICAgICAgIGNhc2UgMzogZCB8PSBkYXRhWzJdIDw8IDE2OwotICAgICAgICBjYXNlIDI6IGQgfD0gZGF0YVsxXSA8PCA4OwotICAgICAgICBjYXNlIDE6IGQgfD0gZGF0YVswXTsKLSAgICAgIH0KLQotICAgICAgayA9ICh0ID4+IHNyKSB8IChkIDw8IHNsKTsKLSAgICAgIE1JWChoLGssbSk7Ci0KLSAgICAgIGRhdGEgKz0gYWxpZ247Ci0gICAgICBsZW4gLT0gYWxpZ247Ci0KLSAgICAgIC8qIC0tLS0tLS0tLS0KLSAgICAgICAqIEhhbmRsZSB0YWlsIGJ5dGVzICovCi0KLSAgICAgIHN3aXRjaChsZW4pIHsKLSAgICAgICAgY2FzZSAzOiBoIF49IGRhdGFbMl0gPDwgMTY7Ci0gICAgICAgIGNhc2UgMjogaCBePSBkYXRhWzFdIDw8IDg7Ci0gICAgICAgIGNhc2UgMTogaCBePSBkYXRhWzBdOyBoICo9IG07Ci0gICAgICB9OwotICAgIH0gZWxzZSB7Ci0gICAgICBzd2l0Y2gobGVuKSB7Ci0gICAgICAgIGNhc2UgMzogZCB8PSBkYXRhWzJdIDw8IDE2OwotICAgICAgICBjYXNlIDI6IGQgfD0gZGF0YVsxXSA8PCA4OwotICAgICAgICBjYXNlIDE6IGQgfD0gZGF0YVswXTsKLSAgICAgICAgY2FzZSAwOiBoIF49ICh0ID4+IHNyKSB8IChkIDw8IHNsKTsgaCAqPSBtOwotICAgICAgfQotICAgIH0KLQotICAgIGggXj0gaCA+PiAxMzsKLSAgICBoICo9IG07Ci0gICAgaCBePSBoID4+IDE1OwotCi0gICAgcmV0dXJuIGg7Ci0gIH0gZWxzZSB7Ci0gICAgd2hpbGUobGVuID49IDQpIHsKLSAgICAgIHVpbnQzMl90IGsgPSAqKHVpbnQzMl90ICopZGF0YTsKLQotICAgICAgTUlYKGgsayxtKTsKLQotICAgICAgZGF0YSArPSA0OwotICAgICAgbGVuIC09IDQ7Ci0gICAgfQotCi0gICAgLyogLS0tLS0tLS0tLQotICAgICAqIEhhbmRsZSB0YWlsIGJ5dGVzICovCi0KLSAgICBzd2l0Y2gobGVuKSB7Ci0gICAgICBjYXNlIDM6IGggXj0gZGF0YVsyXSA8PCAxNjsKLSAgICAgIGNhc2UgMjogaCBePSBkYXRhWzFdIDw8IDg7Ci0gICAgICBjYXNlIDE6IGggXj0gZGF0YVswXTsgaCAqPSBtOwotICAgIH07Ci0KLSAgICBoIF49IGggPj4gMTM7Ci0gICAgaCAqPSBtOwotICAgIGggXj0gaCA+PiAxNTsKLQotICAgIHJldHVybiBoOwotICB9Ci19Ci0jdW5kZWYgTUlYCi0KLSNlbmRpZiAvKiBVUEJfVU5BTElHTkVEX1JFQURTX09LICovCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLWJvb2wgdXBiX2R1bXB0b3N0ZGVycih2b2lkICpjbG9zdXJlLCBjb25zdCB1cGJfc3RhdHVzKiBzdGF0dXMpIHsKLSAgVVBCX1VOVVNFRChjbG9zdXJlKTsKLSAgZnByaW50ZihzdGRlcnIsICIlc1xuIiwgdXBiX3N0YXR1c19lcnJtc2coc3RhdHVzKSk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLyogR3VhcmFudGVlIG51bGwtdGVybWluYXRpb24gYW5kIHByb3ZpZGUgZWxsaXBzaXMgdHJ1bmNhdGlvbi4KLSAqIEl0IG1heSBiZSB0ZW1wdGluZyB0byAib3B0aW1pemUiIHRoaXMgYnkgaW5pdGlhbGl6aW5nIHRoZXNlIGZpbmFsCi0gKiBmb3VyIGJ5dGVzIHVwLWZyb250IGFuZCB0aGVuIGJlaW5nIGNhcmVmdWwgbmV2ZXIgdG8gb3ZlcndyaXRlIHRoZW0sCi0gKiB0aGlzIGlzIHNhZmVyIGFuZCBzaW1wbGVyLiAqLwotc3RhdGljIHZvaWQgbnVsbHoodXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIGNvbnN0IGNoYXIgKmVsbGlwc2lzID0gIi4uLiI7Ci0gIHNpemVfdCBsZW4gPSBzdHJsZW4oZWxsaXBzaXMpOwotICBhc3NlcnQoc2l6ZW9mKHN0YXR1cy0+bXNnKSA+IGxlbik7Ci0gIG1lbWNweShzdGF0dXMtPm1zZyArIHNpemVvZihzdGF0dXMtPm1zZykgLSBsZW4sIGVsbGlwc2lzLCBsZW4pOwotfQotCi0KLS8qIHVwYl91cGJlcnIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVwYl9lcnJvcnNwYWNlIHVwYl91cGJlcnIgPSB7InVwYiBlcnJvciJ9OwotCi12b2lkIHVwYl91cGJlcnJfc2V0b29tKHVwYl9zdGF0dXMgKnN0YXR1cykgewotICBzdGF0dXMtPmVycm9yX3NwYWNlXyA9ICZ1cGJfdXBiZXJyOwotICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJPdXQgb2YgbWVtb3J5Iik7Ci19Ci0KLQotLyogdXBiX3N0YXR1cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCB1cGJfc3RhdHVzX2NsZWFyKHVwYl9zdGF0dXMgKnN0YXR1cykgewotICBpZiAoIXN0YXR1cykgcmV0dXJuOwotICBzdGF0dXMtPm9rXyA9IHRydWU7Ci0gIHN0YXR1cy0+Y29kZV8gPSAwOwotICBzdGF0dXMtPm1zZ1swXSA9ICdcMCc7Ci19Ci0KLWJvb2wgdXBiX29rKGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cykgeyByZXR1cm4gc3RhdHVzLT5va187IH0KLQotdXBiX2Vycm9yc3BhY2UgKnVwYl9zdGF0dXNfZXJyc3BhY2UoY29uc3QgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIHJldHVybiBzdGF0dXMtPmVycm9yX3NwYWNlXzsKLX0KLQotaW50IHVwYl9zdGF0dXNfZXJyY29kZShjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpIHsgcmV0dXJuIHN0YXR1cy0+Y29kZV87IH0KLQotY29uc3QgY2hhciAqdXBiX3N0YXR1c19lcnJtc2coY29uc3QgdXBiX3N0YXR1cyAqc3RhdHVzKSB7IHJldHVybiBzdGF0dXMtPm1zZzsgfQotCi12b2lkIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHVwYl9zdGF0dXMgKnN0YXR1cywgY29uc3QgY2hhciAqbXNnKSB7Ci0gIGlmICghc3RhdHVzKSByZXR1cm47Ci0gIHN0YXR1cy0+b2tfID0gZmFsc2U7Ci0gIHN0cm5jcHkoc3RhdHVzLT5tc2csIG1zZywgc2l6ZW9mKHN0YXR1cy0+bXNnKSk7Ci0gIG51bGx6KHN0YXR1cyk7Ci19Ci0KLXZvaWQgdXBiX3N0YXR1c19zZXRlcnJmKHVwYl9zdGF0dXMgKnN0YXR1cywgY29uc3QgY2hhciAqZm10LCAuLi4pIHsKLSAgdmFfbGlzdCBhcmdzOwotICB2YV9zdGFydChhcmdzLCBmbXQpOwotICB1cGJfc3RhdHVzX3ZzZXRlcnJmKHN0YXR1cywgZm10LCBhcmdzKTsKLSAgdmFfZW5kKGFyZ3MpOwotfQotCi12b2lkIHVwYl9zdGF0dXNfdnNldGVycmYodXBiX3N0YXR1cyAqc3RhdHVzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncykgewotICBpZiAoIXN0YXR1cykgcmV0dXJuOwotICBzdGF0dXMtPm9rXyA9IGZhbHNlOwotICBfdXBiX3ZzbnByaW50ZihzdGF0dXMtPm1zZywgc2l6ZW9mKHN0YXR1cy0+bXNnKSwgZm10LCBhcmdzKTsKLSAgbnVsbHooc3RhdHVzKTsKLX0KLQotdm9pZCB1cGJfc3RhdHVzX2NvcHkodXBiX3N0YXR1cyAqdG8sIGNvbnN0IHVwYl9zdGF0dXMgKmZyb20pIHsKLSAgaWYgKCF0bykgcmV0dXJuOwotICAqdG8gPSAqZnJvbTsKLX0KLQotCi0vKiB1cGJfYWxsb2MgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCAqdXBiX2dsb2JhbF9hbGxvY2Z1bmModXBiX2FsbG9jICphbGxvYywgdm9pZCAqcHRyLCBzaXplX3Qgb2xkc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewotICBVUEJfVU5VU0VEKGFsbG9jKTsKLSAgVVBCX1VOVVNFRChvbGRzaXplKTsKLSAgaWYgKHNpemUgPT0gMCkgewotICAgIGZyZWUocHRyKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcmVhbGxvYyhwdHIsIHNpemUpOwotICB9Ci19Ci0KLXVwYl9hbGxvYyB1cGJfYWxsb2NfZ2xvYmFsID0geyZ1cGJfZ2xvYmFsX2FsbG9jZnVuY307Ci0KLQotLyogdXBiX2FyZW5hICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQmUgY29uc2VydmF0aXZlIGFuZCBjaG9vc2UgMTYgaW4gY2FzZSBhbnlvbmUgaXMgdXNpbmcgU1NFLiAqLwotc3RhdGljIGNvbnN0IHNpemVfdCBtYXhhbGlnbiA9IDE2OwotCi1zdGF0aWMgc2l6ZV90IGFsaWduX3VwKHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiAoKHNpemUgKyBtYXhhbGlnbiAtIDEpIC8gbWF4YWxpZ24pICogbWF4YWxpZ247Ci19Ci0KLXR5cGVkZWYgc3RydWN0IG1lbV9ibG9jayB7Ci0gIHN0cnVjdCBtZW1fYmxvY2sgKm5leHQ7Ci0gIHNpemVfdCBzaXplOwotICBzaXplX3QgdXNlZDsKLSAgYm9vbCBvd25lZDsKLSAgLyogRGF0YSBmb2xsb3dzLiAqLwotfSBtZW1fYmxvY2s7Ci0KLXR5cGVkZWYgc3RydWN0IGNsZWFudXBfZW50IHsKLSAgc3RydWN0IGNsZWFudXBfZW50ICpuZXh0OwotICB1cGJfY2xlYW51cF9mdW5jICpjbGVhbnVwOwotICB2b2lkICp1ZDsKLX0gY2xlYW51cF9lbnQ7Ci0KLXN0YXRpYyB2b2lkIHVwYl9hcmVuYV9hZGRibG9jayh1cGJfYXJlbmEgKmEsIHZvaWQgKnB0ciwgc2l6ZV90IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBvd25lZCkgewotICBtZW1fYmxvY2sgKmJsb2NrID0gcHRyOwotCi0gIGJsb2NrLT5uZXh0ID0gYS0+YmxvY2tfaGVhZDsKLSAgYmxvY2stPnNpemUgPSBzaXplOwotICBibG9jay0+dXNlZCA9IGFsaWduX3VwKHNpemVvZihtZW1fYmxvY2spKTsKLSAgYmxvY2stPm93bmVkID0gb3duZWQ7Ci0KLSAgYS0+YmxvY2tfaGVhZCA9IGJsb2NrOwotCi0gIC8qIFRPRE8oaGFiZXJtYW4pOiBBU0FOIHBvaXNvbi4gKi8KLX0KLQotCi1zdGF0aWMgbWVtX2Jsb2NrICp1cGJfYXJlbmFfYWxsb2NibG9jayh1cGJfYXJlbmEgKmEsIHNpemVfdCBzaXplKSB7Ci0gIHNpemVfdCBibG9ja19zaXplID0gVVBCX01BWChzaXplLCBhLT5uZXh0X2Jsb2NrX3NpemUpICsgc2l6ZW9mKG1lbV9ibG9jayk7Ci0gIG1lbV9ibG9jayAqYmxvY2sgPSB1cGJfbWFsbG9jKGEtPmJsb2NrX2FsbG9jLCBibG9ja19zaXplKTsKLQotICBpZiAoIWJsb2NrKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB1cGJfYXJlbmFfYWRkYmxvY2soYSwgYmxvY2ssIGJsb2NrX3NpemUsIHRydWUpOwotICBhLT5uZXh0X2Jsb2NrX3NpemUgPSBVUEJfTUlOKGJsb2NrX3NpemUgKiAyLCBhLT5tYXhfYmxvY2tfc2l6ZSk7Ci0KLSAgcmV0dXJuIGJsb2NrOwotfQotCi1zdGF0aWMgdm9pZCAqdXBiX2FyZW5hX2RvYWxsb2ModXBiX2FsbG9jICphbGxvYywgdm9pZCAqcHRyLCBzaXplX3Qgb2xkc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewotICB1cGJfYXJlbmEgKmEgPSAodXBiX2FyZW5hKilhbGxvYzsgIC8qIHVwYl9hbGxvYyBpcyBpbml0aWFsIG1lbWJlci4gKi8KLSAgbWVtX2Jsb2NrICpibG9jayA9IGEtPmJsb2NrX2hlYWQ7Ci0gIHZvaWQgKnJldDsKLQotICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7ICAvKiBXZSBhcmUgYW4gYXJlbmEsIGRvbid0IG5lZWQgaW5kaXZpZHVhbCBmcmVlcy4gKi8KLSAgfQotCi0gIHNpemUgPSBhbGlnbl91cChzaXplKTsKLQotICAvKiBUT0RPKGhhYmVybWFuKTogc3BlY2lhbC1jYXNlIGlmIHRoaXMgaXMgYSByZWFsbG9jIG9mIHRoZSBsYXN0IGFsbG9jPyAqLwotCi0gIGlmICghYmxvY2sgfHwgYmxvY2stPnNpemUgLSBibG9jay0+dXNlZCA8IHNpemUpIHsKLSAgICAvKiBTbG93IHBhdGg6IGhhdmUgdG8gYWxsb2NhdGUgYSBuZXcgYmxvY2suICovCi0gICAgYmxvY2sgPSB1cGJfYXJlbmFfYWxsb2NibG9jayhhLCBzaXplKTsKLQotICAgIGlmICghYmxvY2spIHsKLSAgICAgIHJldHVybiBOVUxMOyAgLyogT3V0IG9mIG1lbW9yeS4gKi8KLSAgICB9Ci0gIH0KLQotICByZXQgPSAoY2hhciopYmxvY2sgKyBibG9jay0+dXNlZDsKLSAgYmxvY2stPnVzZWQgKz0gc2l6ZTsKLQotICBpZiAob2xkc2l6ZSA+IDApIHsKLSAgICBtZW1jcHkocmV0LCBwdHIsIG9sZHNpemUpOyAgLyogUHJlc2VydmUgZXhpc3RpbmcgZGF0YS4gKi8KLSAgfQotCi0gIC8qIFRPRE8oaGFiZXJtYW4pOiBBU0FOIHVucG9pc29uLiAqLwotCi0gIGEtPmJ5dGVzX2FsbG9jYXRlZCArPSBzaXplOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBQdWJsaWMgQXJlbmEgQVBJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHVwYl9hcmVuYV9pbml0KHVwYl9hcmVuYSAqYSkgewotICBhLT5hbGxvYy5mdW5jID0gJnVwYl9hcmVuYV9kb2FsbG9jOwotICBhLT5ibG9ja19hbGxvYyA9ICZ1cGJfYWxsb2NfZ2xvYmFsOwotICBhLT5ieXRlc19hbGxvY2F0ZWQgPSAwOwotICBhLT5uZXh0X2Jsb2NrX3NpemUgPSAyNTY7Ci0gIGEtPm1heF9ibG9ja19zaXplID0gMTYzODQ7Ci0gIGEtPmNsZWFudXBfaGVhZCA9IE5VTEw7Ci0gIGEtPmJsb2NrX2hlYWQgPSBOVUxMOwotfQotCi12b2lkIHVwYl9hcmVuYV9pbml0Mih1cGJfYXJlbmEgKmEsIHZvaWQgKm1lbSwgc2l6ZV90IHNpemUsIHVwYl9hbGxvYyAqYWxsb2MpIHsKLSAgdXBiX2FyZW5hX2luaXQoYSk7Ci0KLSAgaWYgKHNpemUgPiBzaXplb2YobWVtX2Jsb2NrKSkgewotICAgIHVwYl9hcmVuYV9hZGRibG9jayhhLCBtZW0sIHNpemUsIGZhbHNlKTsKLSAgfQotCi0gIGlmIChhbGxvYykgewotICAgIGEtPmJsb2NrX2FsbG9jID0gYWxsb2M7Ci0gIH0KLX0KLQotdm9pZCB1cGJfYXJlbmFfdW5pbml0KHVwYl9hcmVuYSAqYSkgewotICBjbGVhbnVwX2VudCAqZW50ID0gYS0+Y2xlYW51cF9oZWFkOwotICBtZW1fYmxvY2sgKmJsb2NrID0gYS0+YmxvY2tfaGVhZDsKLQotICB3aGlsZSAoZW50KSB7Ci0gICAgZW50LT5jbGVhbnVwKGVudC0+dWQpOwotICAgIGVudCA9IGVudC0+bmV4dDsKLSAgfQotCi0gIC8qIE11c3QgZG8gdGhpcyBhZnRlciBydW5uaW5nIGNsZWFudXAgZnVuY3Rpb25zLCBiZWNhdXNlIHRoaXMgd2lsbCBkZWxldGUKLSAgICogdGhlIG1lbW9yeSB3ZSBzdG9yZSBvdXIgY2xlYW51cCBlbnRyaWVzIGluISAqLwotICB3aGlsZSAoYmxvY2spIHsKLSAgICBtZW1fYmxvY2sgKm5leHQgPSBibG9jay0+bmV4dDsKLQotICAgIGlmIChibG9jay0+b3duZWQpIHsKLSAgICAgIHVwYl9mcmVlKGEtPmJsb2NrX2FsbG9jLCBibG9jayk7Ci0gICAgfQotCi0gICAgYmxvY2sgPSBuZXh0OwotICB9Ci19Ci0KLWJvb2wgdXBiX2FyZW5hX2FkZGNsZWFudXAodXBiX2FyZW5hICphLCB1cGJfY2xlYW51cF9mdW5jICpmdW5jLCB2b2lkICp1ZCkgewotICBjbGVhbnVwX2VudCAqZW50ID0gdXBiX21hbGxvYygmYS0+YWxsb2MsIHNpemVvZihjbGVhbnVwX2VudCkpOwotICBpZiAoIWVudCkgewotICAgIHJldHVybiBmYWxzZTsgIC8qIE91dCBvZiBtZW1vcnkuICovCi0gIH0KLQotICBlbnQtPmNsZWFudXAgPSBmdW5jOwotICBlbnQtPnVkID0gdWQ7Ci0gIGVudC0+bmV4dCA9IGEtPmNsZWFudXBfaGVhZDsKLSAgYS0+Y2xlYW51cF9oZWFkID0gZW50OwotCi0gIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgdXBiX2FyZW5hX2J5dGVzYWxsb2NhdGVkKGNvbnN0IHVwYl9hcmVuYSAqYSkgewotICByZXR1cm4gYS0+Ynl0ZXNfYWxsb2NhdGVkOwotfQotCi0KLS8qIFN0YW5kYXJkIGVycm9yIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIGRlZmF1bHRfZXJyKHZvaWQgKnVkLCBjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgVVBCX1VOVVNFRCh1ZCk7Ci0gIFVQQl9VTlVTRUQoc3RhdHVzKTsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCB3cml0ZV9lcnJfdG8odm9pZCAqdWQsIGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfc3RhdHVzICpjb3B5X3RvID0gdWQ7Ci0gIHVwYl9zdGF0dXNfY29weShjb3B5X3RvLCBzdGF0dXMpOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLQotLyogdXBiX2VudiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCB1cGJfZW52X2luaXRvbmx5KHVwYl9lbnYgKmUpIHsKLSAgZS0+b2tfID0gdHJ1ZTsKLSAgZS0+ZXJyb3JfZnVuY18gPSAmZGVmYXVsdF9lcnI7Ci0gIGUtPmVycm9yX3VkXyA9IE5VTEw7Ci19Ci0KLXZvaWQgdXBiX2Vudl9pbml0KHVwYl9lbnYgKmUpIHsKLSAgdXBiX2FyZW5hX2luaXQoJmUtPmFyZW5hXyk7Ci0gIHVwYl9lbnZfaW5pdG9ubHkoZSk7Ci19Ci0KLXZvaWQgdXBiX2Vudl9pbml0Mih1cGJfZW52ICplLCB2b2lkICptZW0sIHNpemVfdCBuLCB1cGJfYWxsb2MgKmFsbG9jKSB7Ci0gIHVwYl9hcmVuYV9pbml0MigmZS0+YXJlbmFfLCBtZW0sIG4sIGFsbG9jKTsKLSAgdXBiX2Vudl9pbml0b25seShlKTsKLX0KLQotdm9pZCB1cGJfZW52X3VuaW5pdCh1cGJfZW52ICplKSB7Ci0gIHVwYl9hcmVuYV91bmluaXQoJmUtPmFyZW5hXyk7Ci19Ci0KLXZvaWQgdXBiX2Vudl9zZXRlcnJvcmZ1bmModXBiX2VudiAqZSwgdXBiX2Vycm9yX2Z1bmMgKmZ1bmMsIHZvaWQgKnVkKSB7Ci0gIGUtPmVycm9yX2Z1bmNfID0gZnVuYzsKLSAgZS0+ZXJyb3JfdWRfID0gdWQ7Ci19Ci0KLXZvaWQgdXBiX2Vudl9yZXBvcnRlcnJvcnN0byh1cGJfZW52ICplLCB1cGJfc3RhdHVzICpzKSB7Ci0gIGUtPmVycm9yX2Z1bmNfID0gJndyaXRlX2Vycl90bzsKLSAgZS0+ZXJyb3JfdWRfID0gczsKLX0KLQotYm9vbCB1cGJfZW52X3JlcG9ydGVycm9yKHVwYl9lbnYgKmUsIGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cykgewotICBlLT5va18gPSBmYWxzZTsKLSAgcmV0dXJuIGUtPmVycm9yX2Z1bmNfKGUtPmVycm9yX3VkXywgc3RhdHVzKTsKLX0KLQotdm9pZCAqdXBiX2Vudl9tYWxsb2ModXBiX2VudiAqZSwgc2l6ZV90IHNpemUpIHsKLSAgcmV0dXJuIHVwYl9tYWxsb2MoJmUtPmFyZW5hXy5hbGxvYywgc2l6ZSk7Ci19Ci0KLXZvaWQgKnVwYl9lbnZfcmVhbGxvYyh1cGJfZW52ICplLCB2b2lkICpwdHIsIHNpemVfdCBvbGRzaXplLCBzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gdXBiX3JlYWxsb2MoJmUtPmFyZW5hXy5hbGxvYywgcHRyLCBvbGRzaXplLCBzaXplKTsKLX0KLQotdm9pZCB1cGJfZW52X2ZyZWUodXBiX2VudiAqZSwgdm9pZCAqcHRyKSB7Ci0gIHVwYl9mcmVlKCZlLT5hcmVuYV8uYWxsb2MsIHB0cik7Ci19Ci0KLWJvb2wgdXBiX2Vudl9hZGRjbGVhbnVwKHVwYl9lbnYgKmUsIHVwYl9jbGVhbnVwX2Z1bmMgKmZ1bmMsIHZvaWQgKnVkKSB7Ci0gIHJldHVybiB1cGJfYXJlbmFfYWRkY2xlYW51cCgmZS0+YXJlbmFfLCBmdW5jLCB1ZCk7Ci19Ci0KLXNpemVfdCB1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGNvbnN0IHVwYl9lbnYgKmUpIHsKLSAgcmV0dXJuIHVwYl9hcmVuYV9ieXRlc2FsbG9jYXRlZCgmZS0+YXJlbmFfKTsKLX0KLS8qIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IHVwYmMgKHRoZSB1cGIgY29tcGlsZXIpIGZyb20gdGhlIGlucHV0Ci0gKiBmaWxlOgotICoKLSAqICAgICB1cGIvZGVzY3JpcHRvci9kZXNjcmlwdG9yLnByb3RvCi0gKgotICogRG8gbm90IGVkaXQgLS0geW91ciBjaGFuZ2VzIHdpbGwgYmUgZGlzY2FyZGVkIHdoZW4gdGhlIGZpbGUgaXMKLSAqIHJlZ2VuZXJhdGVkLiAqLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0KLQotc3RhdGljIGNvbnN0IHVwYl9tc2dkZWYgbXNnc1syMl07Ci1zdGF0aWMgY29uc3QgdXBiX2ZpZWxkZGVmIGZpZWxkc1sxMDVdOwotc3RhdGljIGNvbnN0IHVwYl9lbnVtZGVmIGVudW1zWzVdOwotc3RhdGljIGNvbnN0IHVwYl90YWJlbnQgc3RyZW50cmllc1syMzZdOwotc3RhdGljIGNvbnN0IHVwYl90YWJlbnQgaW50ZW50cmllc1sxOF07Ci1zdGF0aWMgY29uc3QgdXBiX3RhYnZhbCBhcnJheXNbMTg0XTsKLQotI2lmZGVmIFVQQl9ERUJVR19SRUZTCi1zdGF0aWMgdXBiX2ludHRhYmxlIHJlZnRhYmxlc1syNjRdOwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCB1cGJfbXNnZGVmIG1zZ3NbMjJdID0gewotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8iLCA0MCwgOCwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1swXSwgMTEsIDEwKSwgVVBCX1NUUlRBQkxFX0lOSVQoMTAsIDE1LCBVUEJfQ1RZUEVfUFRSLCA0LCAmc3RyZW50cmllc1swXSksIGZhbHNlLCBVUEJfU1lOVEFYX1BST1RPMiwgJnJlZnRhYmxlc1swXSwgJnJlZnRhYmxlc1sxXSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSIsIDQsIDAsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbMTFdLCAzLCAyKSwgVVBCX1NUUlRBQkxFX0lOSVQoMiwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMTZdKSwgZmFsc2UsIFVQQl9TWU5UQVhfUFJPVE8yLCAmcmVmdGFibGVzWzJdLCAmcmVmdGFibGVzWzNdKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UiLCA0LCAwLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzE0XSwgMywgMiksIFVQQl9TVFJUQUJMRV9JTklUKDIsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZzdHJlbnRyaWVzWzIwXSksIGZhbHNlLCBVUEJfU1lOVEFYX1BST1RPMiwgJnJlZnRhYmxlc1s0XSwgJnJlZnRhYmxlc1s1XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8iLCAxMSwgMiwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1sxN10sIDQsIDMpLCBVUEJfU1RSVEFCTEVfSU5JVCgzLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1syNF0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbNl0sICZyZWZ0YWJsZXNbN10pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyIsIDgsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDEsIDEsIFVQQl9DVFlQRV9QVFIsIDEsICZpbnRlbnRyaWVzWzBdLCAmYXJyYXlzWzIxXSwgNCwgMiksIFVQQl9TVFJUQUJMRV9JTklUKDMsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZzdHJlbnRyaWVzWzI4XSksIGZhbHNlLCBVUEJfU1lOVEFYX1BST1RPMiwgJnJlZnRhYmxlc1s4XSwgJnJlZnRhYmxlc1s5XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byIsIDgsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbMjVdLCA0LCAzKSwgVVBCX1NUUlRBQkxFX0lOSVQoMywgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMzJdKSwgZmFsc2UsIFVQQl9TWU5UQVhfUFJPVE8yLCAmcmVmdGFibGVzWzEwXSwgJnJlZnRhYmxlc1sxMV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIiwgNywgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMSwgMSwgVVBCX0NUWVBFX1BUUiwgMSwgJmludGVudHJpZXNbMl0sICZhcnJheXNbMjldLCAyLCAxKSwgVVBCX1NUUlRBQkxFX0lOSVQoMiwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMzZdKSwgZmFsc2UsIFVQQl9TWU5UQVhfUFJPVE8yLCAmcmVmdGFibGVzWzEyXSwgJnJlZnRhYmxlc1sxM10pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byIsIDIzLCAxLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzMxXSwgMTEsIDEwKSwgVVBCX1NUUlRBQkxFX0lOSVQoMTAsIDE1LCBVUEJfQ1RZUEVfUFRSLCA0LCAmc3RyZW50cmllc1s0MF0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbMTRdLCAmcmVmdGFibGVzWzE1XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyIsIDEyLCAxLCBVUEJfSU5UVEFCTEVfSU5JVCgxLCAxLCBVUEJfQ1RZUEVfUFRSLCAxLCAmaW50ZW50cmllc1s0XSwgJmFycmF5c1s0Ml0sIDExLCA2KSwgVVBCX1NUUlRBQkxFX0lOSVQoNywgMTUsIFVQQl9DVFlQRV9QVFIsIDQsICZzdHJlbnRyaWVzWzU2XSksIGZhbHNlLCBVUEJfU1lOVEFYX1BST1RPMiwgJnJlZnRhYmxlc1sxNl0sICZyZWZ0YWJsZXNbMTddKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byIsIDQyLCA2LCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzUzXSwgMTMsIDEyKSwgVVBCX1NUUlRBQkxFX0lOSVQoMTIsIDE1LCBVUEJfQ1RZUEVfUFRSLCA0LCAmc3RyZW50cmllc1s3Ml0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbMThdLCAmcmVmdGFibGVzWzE5XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0IiwgNiwgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1s2Nl0sIDIsIDEpLCBVUEJfU1RSVEFCTEVfSU5JVCgxLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1s4OF0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbMjBdLCAmcmVmdGFibGVzWzIxXSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIiwgMzEsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDEsIDEsIFVQQl9DVFlQRV9QVFIsIDEsICZpbnRlbnRyaWVzWzZdLCAmYXJyYXlzWzY4XSwgMzksIDE1KSwgVVBCX1NUUlRBQkxFX0lOSVQoMTYsIDMxLCBVUEJfQ1RZUEVfUFRSLCA1LCAmc3RyZW50cmllc1s5Ml0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbMjJdLCAmcmVmdGFibGVzWzIzXSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIiwgMTAsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDEsIDEsIFVQQl9DVFlQRV9QVFIsIDEsICZpbnRlbnRyaWVzWzhdLCAmYXJyYXlzWzEwN10sIDgsIDQpLCBVUEJfU1RSVEFCTEVfSU5JVCg1LCA3LCBVUEJfQ1RZUEVfUFRSLCAzLCAmc3RyZW50cmllc1sxMjRdKSwgZmFsc2UsIFVQQl9TWU5UQVhfUFJPVE8yLCAmcmVmdGFibGVzWzI0XSwgJnJlZnRhYmxlc1syNV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8iLCAxNSwgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1sxMTVdLCA3LCA2KSwgVVBCX1NUUlRBQkxFX0lOSVQoNiwgNywgVVBCX0NUWVBFX1BUUiwgMywgJnN0cmVudHJpZXNbMTMyXSksIGZhbHNlLCBVUEJfU1lOVEFYX1BST1RPMiwgJnJlZnRhYmxlc1syNl0sICZyZWZ0YWJsZXNbMjddKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyIsIDcsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDIsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZpbnRlbnRyaWVzWzEwXSwgJmFycmF5c1sxMjJdLCAxLCAwKSwgVVBCX1NUUlRBQkxFX0lOSVQoMiwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJnN0cmVudHJpZXNbMTQwXSksIGZhbHNlLCBVUEJfU1lOVEFYX1BST1RPMiwgJnJlZnRhYmxlc1syOF0sICZyZWZ0YWJsZXNbMjldKSwKLSAgVVBCX01TR0RFRl9JTklUKCJnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8iLCA1LCAwLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzEyM10sIDIsIDEpLCBVUEJfU1RSVEFCTEVfSU5JVCgxLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1sxNDRdKSwgZmFsc2UsIFVQQl9TWU5UQVhfUFJPVE8yLCAmcmVmdGFibGVzWzMwXSwgJnJlZnRhYmxlc1szMV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIiwgMTEsIDIsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbMTI1XSwgNCwgMyksIFVQQl9TVFJUQUJMRV9JTklUKDMsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZzdHJlbnRyaWVzWzE0OF0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbMzJdLCAmcmVmdGFibGVzWzMzXSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIiwgNywgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMiwgMywgVVBCX0NUWVBFX1BUUiwgMiwgJmludGVudHJpZXNbMTRdLCAmYXJyYXlzWzEyOV0sIDEsIDApLCBVUEJfU1RSVEFCTEVfSU5JVCgyLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1sxNTJdKSwgZmFsc2UsIFVQQl9TWU5UQVhfUFJPVE8yLCAmcmVmdGFibGVzWzM0XSwgJnJlZnRhYmxlc1szNV0pLAotICBVUEJfTVNHREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyIsIDYsIDEsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbMTMwXSwgMiwgMSksIFVQQl9TVFJUQUJMRV9JTklUKDEsIDMsIFVQQl9DVFlQRV9QVFIsIDIsICZzdHJlbnRyaWVzWzE1Nl0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbMzZdLCAmcmVmdGFibGVzWzM3XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIiwgMTksIDAsIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9QVFIsIDAsIE5VTEwsICZhcnJheXNbMTMyXSwgNywgNSksIFVQQl9TVFJUQUJMRV9JTklUKDUsIDcsIFVQQl9DVFlQRV9QVFIsIDMsICZzdHJlbnRyaWVzWzE2MF0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbMzhdLCAmcmVmdGFibGVzWzM5XSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24iLCAxOCwgMSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX1BUUiwgMCwgTlVMTCwgJmFycmF5c1sxMzldLCA5LCA3KSwgVVBCX1NUUlRBQkxFX0lOSVQoNywgMTUsIFVQQl9DVFlQRV9QVFIsIDQsICZzdHJlbnRyaWVzWzE2OF0pLCBmYWxzZSwgVVBCX1NZTlRBWF9QUk9UTzIsICZyZWZ0YWJsZXNbNDBdLCAmcmVmdGFibGVzWzQxXSksCi0gIFVQQl9NU0dERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQiLCA2LCAwLCBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBVUEJfQ1RZUEVfUFRSLCAwLCBOVUxMLCAmYXJyYXlzWzE0OF0sIDMsIDIpLCBVUEJfU1RSVEFCTEVfSU5JVCgyLCAzLCBVUEJfQ1RZUEVfUFRSLCAyLCAmc3RyZW50cmllc1sxODRdKSwgZmFsc2UsIFVQQl9TWU5UQVhfUFJPVE8yLCAmcmVmdGFibGVzWzQyXSwgJnJlZnRhYmxlc1s0M10pLAotfTsKLQotc3RhdGljIGNvbnN0IHVwYl9maWVsZGRlZiBmaWVsZHNbMTA1XSA9IHsKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiYWdncmVnYXRlX3ZhbHVlIiwgOCwgJm1zZ3NbMjBdLCBOVUxMLCAxNSwgNiwgezB9LCZyZWZ0YWJsZXNbNDRdLCAmcmVmdGFibGVzWzQ1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJhbGxvd19hbGlhcyIsIDIsICZtc2dzWzRdLCBOVUxMLCA2LCAxLCB7MH0sJnJlZnRhYmxlc1s0Nl0sICZyZWZ0YWJsZXNbNDddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImNjX2VuYWJsZV9hcmVuYXMiLCAzMSwgJm1zZ3NbMTFdLCBOVUxMLCAyMywgMTIsIHswfSwmcmVmdGFibGVzWzQ4XSwgJnJlZnRhYmxlc1s0OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiY2NfZ2VuZXJpY19zZXJ2aWNlcyIsIDE2LCAmbXNnc1sxMV0sIE5VTEwsIDE3LCA2LCB7MH0sJnJlZnRhYmxlc1s1MF0sICZyZWZ0YWJsZXNbNTFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImNsaWVudF9zdHJlYW1pbmciLCA1LCAmbXNnc1sxM10sIE5VTEwsIDEzLCA0LCB7MH0sJnJlZnRhYmxlc1s1Ml0sICZyZWZ0YWJsZXNbNTNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiY3NoYXJwX25hbWVzcGFjZSIsIDM3LCAmbXNnc1sxMV0sIE5VTEwsIDI3LCAxNCwgezB9LCZyZWZ0YWJsZXNbNTRdLCAmcmVmdGFibGVzWzU1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfRU5VTSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJjdHlwZSIsIDEsICZtc2dzWzhdLCAoY29uc3QgdXBiX2RlZiopKCZlbnVtc1syXSksIDYsIDEsIHswfSwmcmVmdGFibGVzWzU2XSwgJnJlZnRhYmxlc1s1N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZWZhdWx0X3ZhbHVlIiwgNywgJm1zZ3NbN10sIE5VTEwsIDE2LCA3LCB7MH0sJnJlZnRhYmxlc1s1OF0sICZyZWZ0YWJsZXNbNTldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZGVwZW5kZW5jeSIsIDMsICZtc2dzWzldLCBOVUxMLCAzMCwgOCwgezB9LCZyZWZ0YWJsZXNbNjBdLCAmcmVmdGFibGVzWzYxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZXByZWNhdGVkIiwgMywgJm1zZ3NbMTJdLCBOVUxMLCA4LCAzLCB7MH0sJnJlZnRhYmxlc1s2Ml0sICZyZWZ0YWJsZXNbNjNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImRlcHJlY2F0ZWQiLCAzLCAmbXNnc1s4XSwgTlVMTCwgOCwgMywgezB9LCZyZWZ0YWJsZXNbNjRdLCAmcmVmdGFibGVzWzY1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZXByZWNhdGVkIiwgMzMsICZtc2dzWzE0XSwgTlVMTCwgNiwgMSwgezB9LCZyZWZ0YWJsZXNbNjZdLCAmcmVmdGFibGVzWzY3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZXByZWNhdGVkIiwgMjMsICZtc2dzWzExXSwgTlVMTCwgMjEsIDEwLCB7MH0sJnJlZnRhYmxlc1s2OF0sICZyZWZ0YWJsZXNbNjldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImRlcHJlY2F0ZWQiLCAzLCAmbXNnc1s0XSwgTlVMTCwgNywgMiwgezB9LCZyZWZ0YWJsZXNbNzBdLCAmcmVmdGFibGVzWzcxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZXByZWNhdGVkIiwgMzMsICZtc2dzWzE3XSwgTlVMTCwgNiwgMSwgezB9LCZyZWZ0YWJsZXNbNzJdLCAmcmVmdGFibGVzWzczXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkZXByZWNhdGVkIiwgMSwgJm1zZ3NbNl0sIE5VTEwsIDYsIDEsIHswfSwmcmVmdGFibGVzWzc0XSwgJnJlZnRhYmxlc1s3NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0RPVUJMRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJkb3VibGVfdmFsdWUiLCA2LCAmbXNnc1syMF0sIE5VTEwsIDExLCA0LCB7MH0sJnJlZnRhYmxlc1s3Nl0sICZyZWZ0YWJsZXNbNzddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9JTlQzMiwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJlbmQiLCAyLCAmbXNnc1syXSwgTlVMTCwgMywgMSwgezB9LCZyZWZ0YWJsZXNbNzhdLCAmcmVmdGFibGVzWzc5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfSU5UMzIsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZW5kIiwgMiwgJm1zZ3NbMV0sIE5VTEwsIDMsIDEsIHswfSwmcmVmdGFibGVzWzgwXSwgJnJlZnRhYmxlc1s4MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZW51bV90eXBlIiwgNCwgJm1zZ3NbMF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbM10pLCAxOCwgMiwgezB9LCZyZWZ0YWJsZXNbODJdLCAmcmVmdGFibGVzWzgzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJlbnVtX3R5cGUiLCA1LCAmbXNnc1s5XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1szXSksIDEzLCAxLCB7MH0sJnJlZnRhYmxlc1s4NF0sICZyZWZ0YWJsZXNbODVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZXh0ZW5kZWUiLCAyLCAmbXNnc1s3XSwgTlVMTCwgNywgMiwgezB9LCZyZWZ0YWJsZXNbODZdLCAmcmVmdGFibGVzWzg3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJleHRlbnNpb24iLCA2LCAmbXNnc1swXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s3XSksIDI0LCA0LCB7MH0sJnJlZnRhYmxlc1s4OF0sICZyZWZ0YWJsZXNbODldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImV4dGVuc2lvbiIsIDcsICZtc2dzWzldLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzddKSwgMTksIDMsIHswfSwmcmVmdGFibGVzWzkwXSwgJnJlZnRhYmxlc1s5MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZXh0ZW5zaW9uX3JhbmdlIiwgNSwgJm1zZ3NbMF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMV0pLCAyMSwgMywgezB9LCZyZWZ0YWJsZXNbOTJdLCAmcmVmdGFibGVzWzkzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJmaWVsZCIsIDIsICZtc2dzWzBdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzddKSwgMTIsIDAsIHswfSwmcmVmdGFibGVzWzk0XSwgJnJlZnRhYmxlc1s5NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiZmlsZSIsIDEsICZtc2dzWzEwXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s5XSksIDUsIDAsIHswfSwmcmVmdGFibGVzWzk2XSwgJnJlZnRhYmxlc1s5N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJnb19wYWNrYWdlIiwgMTEsICZtc2dzWzExXSwgTlVMTCwgMTQsIDUsIHswfSwmcmVmdGFibGVzWzk4XSwgJnJlZnRhYmxlc1s5OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJpZGVudGlmaWVyX3ZhbHVlIiwgMywgJm1zZ3NbMjBdLCBOVUxMLCA2LCAxLCB7MH0sJnJlZnRhYmxlc1sxMDBdLCAmcmVmdGFibGVzWzEwMV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJpbnB1dF90eXBlIiwgMiwgJm1zZ3NbMTNdLCBOVUxMLCA3LCAyLCB7MH0sJnJlZnRhYmxlc1sxMDJdLCAmcmVmdGFibGVzWzEwM10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVRVUlSRUQsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiaXNfZXh0ZW5zaW9uIiwgMiwgJm1zZ3NbMjFdLCBOVUxMLCA1LCAxLCB7MH0sJnJlZnRhYmxlc1sxMDRdLCAmcmVmdGFibGVzWzEwNV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2giLCAyMCwgJm1zZ3NbMTFdLCBOVUxMLCAyMCwgOSwgezB9LCZyZWZ0YWJsZXNbMTA2XSwgJnJlZnRhYmxlc1sxMDddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImphdmFfZ2VuZXJpY19zZXJ2aWNlcyIsIDE3LCAmbXNnc1sxMV0sIE5VTEwsIDE4LCA3LCB7MH0sJnJlZnRhYmxlc1sxMDhdLCAmcmVmdGFibGVzWzEwOV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiamF2YV9tdWx0aXBsZV9maWxlcyIsIDEwLCAmbXNnc1sxMV0sIE5VTEwsIDEzLCA0LCB7MH0sJnJlZnRhYmxlc1sxMTBdLCAmcmVmdGFibGVzWzExMV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJqYXZhX291dGVyX2NsYXNzbmFtZSIsIDgsICZtc2dzWzExXSwgTlVMTCwgOSwgMiwgezB9LCZyZWZ0YWJsZXNbMTEyXSwgJnJlZnRhYmxlc1sxMTNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiamF2YV9wYWNrYWdlIiwgMSwgJm1zZ3NbMTFdLCBOVUxMLCA2LCAxLCB7MH0sJnJlZnRhYmxlc1sxMTRdLCAmcmVmdGFibGVzWzExNV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAiamF2YV9zdHJpbmdfY2hlY2tfdXRmOCIsIDI3LCAmbXNnc1sxMV0sIE5VTEwsIDIyLCAxMSwgezB9LCZyZWZ0YWJsZXNbMTE2XSwgJnJlZnRhYmxlc1sxMTddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImphdmFuYW5vX3VzZV9kZXByZWNhdGVkX3BhY2thZ2UiLCAzOCwgJm1zZ3NbMTFdLCBOVUxMLCAzMCwgMTUsIHswfSwmcmVmdGFibGVzWzExOF0sICZyZWZ0YWJsZXNbMTE5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImpzb25fbmFtZSIsIDEwLCAmbXNnc1s3XSwgTlVMTCwgMjAsIDksIHswfSwmcmVmdGFibGVzWzEyMF0sICZyZWZ0YWJsZXNbMTIxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfRU5VTSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJqc3R5cGUiLCA2LCAmbXNnc1s4XSwgKGNvbnN0IHVwYl9kZWYqKSgmZW51bXNbM10pLCAxMCwgNSwgezB9LCZyZWZ0YWJsZXNbMTIyXSwgJnJlZnRhYmxlc1sxMjNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9FTlVNLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImxhYmVsIiwgNCwgJm1zZ3NbN10sIChjb25zdCB1cGJfZGVmKikoJmVudW1zWzBdKSwgMTEsIDQsIHswfSwmcmVmdGFibGVzWzEyNF0sICZyZWZ0YWJsZXNbMTI1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJsYXp5IiwgNSwgJm1zZ3NbOF0sIE5VTEwsIDksIDQsIHswfSwmcmVmdGFibGVzWzEyNl0sICZyZWZ0YWJsZXNbMTI3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImxlYWRpbmdfY29tbWVudHMiLCAzLCAmbXNnc1sxOV0sIE5VTEwsIDgsIDIsIHswfSwmcmVmdGFibGVzWzEyOF0sICZyZWZ0YWJsZXNbMTI5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgImxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMiLCA2LCAmbXNnc1sxOV0sIE5VTEwsIDE2LCA0LCB7MH0sJnJlZnRhYmxlc1sxMzBdLCAmcmVmdGFibGVzWzEzMV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibG9jYXRpb24iLCAxLCAmbXNnc1sxOF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMTldKSwgNSwgMCwgezB9LCZyZWZ0YWJsZXNbMTMyXSwgJnJlZnRhYmxlc1sxMzNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm1hcF9lbnRyeSIsIDcsICZtc2dzWzEyXSwgTlVMTCwgOSwgNCwgezB9LCZyZWZ0YWJsZXNbMTM0XSwgJnJlZnRhYmxlc1sxMzVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IiwgMSwgJm1zZ3NbMTJdLCBOVUxMLCA2LCAxLCB7MH0sJnJlZnRhYmxlc1sxMzZdLCAmcmVmdGFibGVzWzEzN10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibWVzc2FnZV90eXBlIiwgNCwgJm1zZ3NbOV0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMF0pLCAxMCwgMCwgezB9LCZyZWZ0YWJsZXNbMTM4XSwgJnJlZnRhYmxlc1sxMzldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm1ldGhvZCIsIDIsICZtc2dzWzE2XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxM10pLCA2LCAwLCB7MH0sJnJlZnRhYmxlc1sxNDBdLCAmcmVmdGFibGVzWzE0MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lIiwgMSwgJm1zZ3NbM10sIE5VTEwsIDgsIDIsIHswfSwmcmVmdGFibGVzWzE0Ml0sICZyZWZ0YWJsZXNbMTQzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5hbWUiLCAxLCAmbXNnc1sxNV0sIE5VTEwsIDIsIDAsIHswfSwmcmVmdGFibGVzWzE0NF0sICZyZWZ0YWJsZXNbMTQ1XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lIiwgMiwgJm1zZ3NbMjBdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzIxXSksIDUsIDAsIHswfSwmcmVmdGFibGVzWzE0Nl0sICZyZWZ0YWJsZXNbMTQ3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5hbWUiLCAxLCAmbXNnc1swXSwgTlVMTCwgMzIsIDgsIHswfSwmcmVmdGFibGVzWzE0OF0sICZyZWZ0YWJsZXNbMTQ5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5hbWUiLCAxLCAmbXNnc1s1XSwgTlVMTCwgNCwgMSwgezB9LCZyZWZ0YWJsZXNbMTUwXSwgJnJlZnRhYmxlc1sxNTFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibmFtZSIsIDEsICZtc2dzWzldLCBOVUxMLCAyMiwgNiwgezB9LCZyZWZ0YWJsZXNbMTUyXSwgJnJlZnRhYmxlc1sxNTNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibmFtZSIsIDEsICZtc2dzWzddLCBOVUxMLCA0LCAxLCB7MH0sJnJlZnRhYmxlc1sxNTRdLCAmcmVmdGFibGVzWzE1NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lIiwgMSwgJm1zZ3NbMTNdLCBOVUxMLCA0LCAxLCB7MH0sJnJlZnRhYmxlc1sxNTZdLCAmcmVmdGFibGVzWzE1N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lIiwgMSwgJm1zZ3NbMTZdLCBOVUxMLCA4LCAyLCB7MH0sJnJlZnRhYmxlc1sxNThdLCAmcmVmdGFibGVzWzE1OV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVRVUlSRUQsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJuYW1lX3BhcnQiLCAxLCAmbXNnc1syMV0sIE5VTEwsIDIsIDAsIHswfSwmcmVmdGFibGVzWzE2MF0sICZyZWZ0YWJsZXNbMTYxXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfSU5UNjQsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibmVnYXRpdmVfaW50X3ZhbHVlIiwgNSwgJm1zZ3NbMjBdLCBOVUxMLCAxMCwgMywgezB9LCZyZWZ0YWJsZXNbMTYyXSwgJnJlZnRhYmxlc1sxNjNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5lc3RlZF90eXBlIiwgMywgJm1zZ3NbMF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMF0pLCAxNSwgMSwgezB9LCZyZWZ0YWJsZXNbMTY0XSwgJnJlZnRhYmxlc1sxNjVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IiLCAyLCAmbXNnc1sxMl0sIE5VTEwsIDcsIDIsIHswfSwmcmVmdGFibGVzWzE2Nl0sICZyZWZ0YWJsZXNbMTY3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfSU5UMzIsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibnVtYmVyIiwgMiwgJm1zZ3NbNV0sIE5VTEwsIDcsIDIsIHswfSwmcmVmdGFibGVzWzE2OF0sICZyZWZ0YWJsZXNbMTY5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfSU5UMzIsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAibnVtYmVyIiwgMywgJm1zZ3NbN10sIE5VTEwsIDEwLCAzLCB7MH0sJnJlZnRhYmxlc1sxNzBdLCAmcmVmdGFibGVzWzE3MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJvYmpjX2NsYXNzX3ByZWZpeCIsIDM2LCAmbXNnc1sxMV0sIE5VTEwsIDI0LCAxMywgezB9LCZyZWZ0YWJsZXNbMTcyXSwgJnJlZnRhYmxlc1sxNzNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm9uZW9mX2RlY2wiLCA4LCAmbXNnc1swXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxNV0pLCAyOCwgNiwgezB9LCZyZWZ0YWJsZXNbMTc0XSwgJnJlZnRhYmxlc1sxNzVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9JTlQzMiwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJvbmVvZl9pbmRleCIsIDksICZtc2dzWzddLCBOVUxMLCAxOSwgOCwgezB9LCZyZWZ0YWJsZXNbMTc2XSwgJnJlZnRhYmxlc1sxNzddKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9FTlVNLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm9wdGltaXplX2ZvciIsIDksICZtc2dzWzExXSwgKGNvbnN0IHVwYl9kZWYqKSgmZW51bXNbNF0pLCAxMiwgMywgezB9LCZyZWZ0YWJsZXNbMTc4XSwgJnJlZnRhYmxlc1sxNzldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm9wdGlvbnMiLCA3LCAmbXNnc1swXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxMl0pLCAyNSwgNSwgezB9LCZyZWZ0YWJsZXNbMTgwXSwgJnJlZnRhYmxlc1sxODFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm9wdGlvbnMiLCA4LCAmbXNnc1s5XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1sxMV0pLCAyMCwgNCwgezB9LCZyZWZ0YWJsZXNbMTgyXSwgJnJlZnRhYmxlc1sxODNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm9wdGlvbnMiLCA0LCAmbXNnc1sxM10sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMTRdKSwgMywgMCwgezB9LCZyZWZ0YWJsZXNbMTg0XSwgJnJlZnRhYmxlc1sxODVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgIm9wdGlvbnMiLCA4LCAmbXNnc1s3XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s4XSksIDMsIDAsIHswfSwmcmVmdGFibGVzWzE4Nl0sICZyZWZ0YWJsZXNbMTg3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJvcHRpb25zIiwgMywgJm1zZ3NbMTZdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzE3XSksIDcsIDEsIHswfSwmcmVmdGFibGVzWzE4OF0sICZyZWZ0YWJsZXNbMTg5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJvcHRpb25zIiwgMywgJm1zZ3NbNV0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbNl0pLCAzLCAwLCB7MH0sJnJlZnRhYmxlc1sxOTBdLCAmcmVmdGFibGVzWzE5MV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3B0aW9ucyIsIDMsICZtc2dzWzNdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzRdKSwgNywgMSwgezB9LCZyZWZ0YWJsZXNbMTkyXSwgJnJlZnRhYmxlc1sxOTNdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAib3V0cHV0X3R5cGUiLCAzLCAmbXNnc1sxM10sIE5VTEwsIDEwLCAzLCB7MH0sJnJlZnRhYmxlc1sxOTRdLCAmcmVmdGFibGVzWzE5NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJwYWNrYWdlIiwgMiwgJm1zZ3NbOV0sIE5VTEwsIDI1LCA3LCB7MH0sJnJlZnRhYmxlc1sxOTZdLCAmcmVmdGFibGVzWzE5N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAicGFja2VkIiwgMiwgJm1zZ3NbOF0sIE5VTEwsIDcsIDIsIHswfSwmcmVmdGFibGVzWzE5OF0sICZyZWZ0YWJsZXNbMTk5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfSU5UMzIsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIHRydWUsICJwYXRoIiwgMSwgJm1zZ3NbMTldLCBOVUxMLCA0LCAwLCB7MH0sJnJlZnRhYmxlc1syMDBdLCAmcmVmdGFibGVzWzIwMV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX1VJTlQ2NCwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJwb3NpdGl2ZV9pbnRfdmFsdWUiLCA0LCAmbXNnc1syMF0sIE5VTEwsIDksIDIsIHswfSwmcmVmdGFibGVzWzIwMl0sICZyZWZ0YWJsZXNbMjAzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfSU5UMzIsIFVQQl9JTlRGTVRfVkFSSUFCTEUsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAicHVibGljX2RlcGVuZGVuY3kiLCAxMCwgJm1zZ3NbOV0sIE5VTEwsIDM1LCA5LCB7MH0sJnJlZnRhYmxlc1syMDRdLCAmcmVmdGFibGVzWzIwNV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0JPT0wsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAicHlfZ2VuZXJpY19zZXJ2aWNlcyIsIDE4LCAmbXNnc1sxMV0sIE5VTEwsIDE5LCA4LCB7MH0sJnJlZnRhYmxlc1syMDZdLCAmcmVmdGFibGVzWzIwN10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX1NUUklORywgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJyZXNlcnZlZF9uYW1lIiwgMTAsICZtc2dzWzBdLCBOVUxMLCAzNywgOSwgezB9LCZyZWZ0YWJsZXNbMjA4XSwgJnJlZnRhYmxlc1syMDldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInJlc2VydmVkX3JhbmdlIiwgOSwgJm1zZ3NbMF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMl0pLCAzMSwgNywgezB9LCZyZWZ0YWJsZXNbMjEwXSwgJnJlZnRhYmxlc1syMTFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9CT09MLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInNlcnZlcl9zdHJlYW1pbmciLCA2LCAmbXNnc1sxM10sIE5VTEwsIDE0LCA1LCB7MH0sJnJlZnRhYmxlc1syMTJdLCAmcmVmdGFibGVzWzIxM10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAic2VydmljZSIsIDYsICZtc2dzWzldLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzE2XSksIDE2LCAyLCB7MH0sJnJlZnRhYmxlc1syMTRdLCAmcmVmdGFibGVzWzIxNV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAic291cmNlX2NvZGVfaW5mbyIsIDksICZtc2dzWzldLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzE4XSksIDIxLCA1LCB7MH0sJnJlZnRhYmxlc1syMTZdLCAmcmVmdGFibGVzWzIxN10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX0lOVDMyLCBVUEJfSU5URk1UX1ZBUklBQkxFLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlLCAic3BhbiIsIDIsICZtc2dzWzE5XSwgTlVMTCwgNywgMSwgezB9LCZyZWZ0YWJsZXNbMjE4XSwgJnJlZnRhYmxlc1syMTldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9JTlQzMiwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJzdGFydCIsIDEsICZtc2dzWzJdLCBOVUxMLCAyLCAwLCB7MH0sJnJlZnRhYmxlc1syMjBdLCAmcmVmdGFibGVzWzIyMV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfT1BUSU9OQUwsIFVQQl9UWVBFX0lOVDMyLCBVUEJfSU5URk1UX1ZBUklBQkxFLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInN0YXJ0IiwgMSwgJm1zZ3NbMV0sIE5VTEwsIDIsIDAsIHswfSwmcmVmdGFibGVzWzIyMl0sICZyZWZ0YWJsZXNbMjIzXSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQllURVMsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAic3RyaW5nX3ZhbHVlIiwgNywgJm1zZ3NbMjBdLCBOVUxMLCAxMiwgNSwgezB9LCZyZWZ0YWJsZXNbMjI0XSwgJnJlZnRhYmxlc1syMjVdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAic3ludGF4IiwgMTIsICZtc2dzWzldLCBOVUxMLCAzOSwgMTEsIHswfSwmcmVmdGFibGVzWzIyNl0sICZyZWZ0YWJsZXNbMjI3XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfU1RSSU5HLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInRyYWlsaW5nX2NvbW1lbnRzIiwgNCwgJm1zZ3NbMTldLCBOVUxMLCAxMSwgMywgezB9LCZyZWZ0YWJsZXNbMjI4XSwgJnJlZnRhYmxlc1syMjldKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9FTlVNLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInR5cGUiLCA1LCAmbXNnc1s3XSwgKGNvbnN0IHVwYl9kZWYqKSgmZW51bXNbMV0pLCAxMiwgNSwgezB9LCZyZWZ0YWJsZXNbMjMwXSwgJnJlZnRhYmxlc1syMzFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX09QVElPTkFMLCBVUEJfVFlQRV9TVFJJTkcsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidHlwZV9uYW1lIiwgNiwgJm1zZ3NbN10sIE5VTEwsIDEzLCA2LCB7MH0sJnJlZnRhYmxlc1syMzJdLCAmcmVmdGFibGVzWzIzM10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzExXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1syMF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1syMzRdLCAmcmVmdGFibGVzWzIzNV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzEyXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1syMF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1syMzZdLCAmcmVmdGFibGVzWzIzN10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzZdLCAoY29uc3QgdXBiX2RlZiopKCZtc2dzWzIwXSksIDUsIDAsIHswfSwmcmVmdGFibGVzWzIzOF0sICZyZWZ0YWJsZXNbMjM5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9SRVBFQVRFRCwgVVBCX1RZUEVfTUVTU0FHRSwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJ1bmludGVycHJldGVkX29wdGlvbiIsIDk5OSwgJm1zZ3NbNF0sIChjb25zdCB1cGJfZGVmKikoJm1zZ3NbMjBdKSwgNSwgMCwgezB9LCZyZWZ0YWJsZXNbMjQwXSwgJnJlZnRhYmxlc1syNDFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9NRVNTQUdFLCAwLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiwgOTk5LCAmbXNnc1s4XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1syMF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1syNDJdLCAmcmVmdGFibGVzWzI0M10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzE0XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1syMF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1syNDRdLCAmcmVmdGFibGVzWzI0NV0pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidW5pbnRlcnByZXRlZF9vcHRpb24iLCA5OTksICZtc2dzWzE3XSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1syMF0pLCA1LCAwLCB7MH0sJnJlZnRhYmxlc1syNDZdLCAmcmVmdGFibGVzWzI0N10pLAotICBVUEJfRklFTERERUZfSU5JVChVUEJfTEFCRUxfUkVQRUFURUQsIFVQQl9UWVBFX01FU1NBR0UsIDAsIGZhbHNlLCBmYWxzZSwgZmFsc2UsIGZhbHNlLCAidmFsdWUiLCAyLCAmbXNnc1szXSwgKGNvbnN0IHVwYl9kZWYqKSgmbXNnc1s1XSksIDYsIDAsIHswfSwmcmVmdGFibGVzWzI0OF0sICZyZWZ0YWJsZXNbMjQ5XSksCi0gIFVQQl9GSUVMRERFRl9JTklUKFVQQl9MQUJFTF9PUFRJT05BTCwgVVBCX1RZUEVfQk9PTCwgMCwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJ3ZWFrIiwgMTAsICZtc2dzWzhdLCBOVUxMLCAxMSwgNiwgezB9LCZyZWZ0YWJsZXNbMjUwXSwgJnJlZnRhYmxlc1syNTFdKSwKLSAgVVBCX0ZJRUxEREVGX0lOSVQoVVBCX0xBQkVMX1JFUEVBVEVELCBVUEJfVFlQRV9JTlQzMiwgVVBCX0lOVEZNVF9WQVJJQUJMRSwgZmFsc2UsIGZhbHNlLCBmYWxzZSwgZmFsc2UsICJ3ZWFrX2RlcGVuZGVuY3kiLCAxMSwgJm1zZ3NbOV0sIE5VTEwsIDM4LCAxMCwgezB9LCZyZWZ0YWJsZXNbMjUyXSwgJnJlZnRhYmxlc1syNTNdKSwKLX07Ci0KLXN0YXRpYyBjb25zdCB1cGJfZW51bWRlZiBlbnVtc1s1XSA9IHsKLSAgVVBCX0VOVU1ERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIiwgVVBCX1NUUlRBQkxFX0lOSVQoMywgMywgVVBCX0NUWVBFX0lOVDMyLCAyLCAmc3RyZW50cmllc1sxODhdKSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX0NTVFIsIDAsIE5VTEwsICZhcnJheXNbMTUxXSwgNCwgMyksIDAsICZyZWZ0YWJsZXNbMjU0XSwgJnJlZnRhYmxlc1syNTVdKSwKLSAgVVBCX0VOVU1ERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUiLCBVUEJfU1RSVEFCTEVfSU5JVCgxOCwgMzEsIFVQQl9DVFlQRV9JTlQzMiwgNSwgJnN0cmVudHJpZXNbMTkyXSksIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9DU1RSLCAwLCBOVUxMLCAmYXJyYXlzWzE1NV0sIDE5LCAxOCksIDAsICZyZWZ0YWJsZXNbMjU2XSwgJnJlZnRhYmxlc1syNTddKSwKLSAgVVBCX0VOVU1ERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSIsIFVQQl9TVFJUQUJMRV9JTklUKDMsIDMsIFVQQl9DVFlQRV9JTlQzMiwgMiwgJnN0cmVudHJpZXNbMjI0XSksIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9DU1RSLCAwLCBOVUxMLCAmYXJyYXlzWzE3NF0sIDMsIDMpLCAwLCAmcmVmdGFibGVzWzI1OF0sICZyZWZ0YWJsZXNbMjU5XSksCi0gIFVQQl9FTlVNREVGX0lOSVQoImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlIiwgVVBCX1NUUlRBQkxFX0lOSVQoMywgMywgVVBCX0NUWVBFX0lOVDMyLCAyLCAmc3RyZW50cmllc1syMjhdKSwgVVBCX0lOVFRBQkxFX0lOSVQoMCwgMCwgVVBCX0NUWVBFX0NTVFIsIDAsIE5VTEwsICZhcnJheXNbMTc3XSwgMywgMyksIDAsICZyZWZ0YWJsZXNbMjYwXSwgJnJlZnRhYmxlc1syNjFdKSwKLSAgVVBCX0VOVU1ERUZfSU5JVCgiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSIsIFVQQl9TVFJUQUJMRV9JTklUKDMsIDMsIFVQQl9DVFlQRV9JTlQzMiwgMiwgJnN0cmVudHJpZXNbMjMyXSksIFVQQl9JTlRUQUJMRV9JTklUKDAsIDAsIFVQQl9DVFlQRV9DU1RSLCAwLCBOVUxMLCAmYXJyYXlzWzE4MF0sIDQsIDMpLCAwLCAmcmVmdGFibGVzWzI2Ml0sICZyZWZ0YWJsZXNbMjYzXSksCi19OwotCi1zdGF0aWMgY29uc3QgdXBiX3RhYmVudCBzdHJlbnRyaWVzWzIzNl0gPSB7Ci0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJleHRlbnNpb24iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjJdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInJlc2VydmVkX25hbWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODJdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJuYW1lIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzUyXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZmllbGQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjVdKSwgJnN0cmVudHJpZXNbMTJdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImV4dGVuc2lvbl9yYW5nZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syNF0pLCAmc3RyZW50cmllc1sxNF19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJuZXN0ZWRfdHlwZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2MF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTYiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAicmVzZXJ2ZWRfcmFuZ2UiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODNdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJvcHRpb25zIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY4XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib25lb2ZfZGVjbCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2NV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImVudW1fdHlwZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxOV0pLCAmc3RyZW50cmllc1sxM119LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAic3RhcnQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODldKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJlbmQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMThdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAic3RhcnQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODhdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJlbmQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTddKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ2YWx1ZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxMDJdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJvcHRpb25zIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0OV0pLCAmc3RyZW50cmllc1syNl19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAidW5pbnRlcnByZXRlZF9vcHRpb24iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOThdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJkZXByZWNhdGVkIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEzXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTMiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiYWxsb3dfYWxpYXMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDYiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibnVtYmVyIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzYyXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJvcHRpb25zIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzczXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1M10pLCAmc3RyZW50cmllc1szNF19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAidW5pbnRlcnByZXRlZF9vcHRpb24iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTddKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJkZXByZWNhdGVkIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE1XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm9uZW9mX2luZGV4IiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY2XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibGFiZWwiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDBdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm5hbWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTVdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm51bWJlciIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2M10pLCAmc3RyZW50cmllc1s1M119LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJleHRlbmRlZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syMV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInR5cGVfbmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s5NF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImpzb25fbmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szOF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInR5cGUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTNdKSwgJnN0cmVudHJpZXNbNTBdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImRlZmF1bHRfdmFsdWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbN10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm9wdGlvbnMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ1bmludGVycHJldGVkX29wdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s5OV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAid2VhayIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxMDNdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInBhY2tlZCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3N10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImxhenkiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImN0eXBlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImpzdHlwZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szOV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImRlcHJlY2F0ZWQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTBdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTEiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZXh0ZW5zaW9uIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzIzXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAid2Vha19kZXBlbmRlbmN5IiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEwNF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1NF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInNlcnZpY2UiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODVdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInNvdXJjZV9jb2RlX2luZm8iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDYiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAic3ludGF4IiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzkxXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZGVwZW5kZW5jeSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s4XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibWVzc2FnZV90eXBlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ3XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAicGFja2FnZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3Nl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm9wdGlvbnMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjldKSwgJnN0cmVudHJpZXNbODZdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImVudW1fdHlwZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syMF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIxIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInB1YmxpY19kZXBlbmRlbmN5IiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzgwXSksICZzdHJlbnRyaWVzWzg1XX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImZpbGUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImNjX2dlbmVyaWNfc2VydmljZXMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbM10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImNzaGFycF9uYW1lc3BhY2UiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZ29fcGFja2FnZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syN10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImphdmFfcGFja2FnZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szNV0pLCAmc3RyZW50cmllc1sxMjBdfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJqYXZhX291dGVyX2NsYXNzbmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szNF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDI0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzk1XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjMiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiamF2YV9tdWx0aXBsZV9maWxlcyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szM10pLCAmc3RyZW50cmllc1sxMTddfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiamF2YV9nZW5lcmljX3NlcnZpY2VzIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzMyXSksICZzdHJlbnRyaWVzWzExOF19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMzUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2giKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDM3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImphdmFuYW5vX3VzZV9kZXByZWNhdGVkX3BhY2thZ2UiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzddKSwgJnN0cmVudHJpZXNbMTIzXX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJweV9nZW5lcmljX3NlcnZpY2VzIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzgxXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib3B0aW1pemVfZm9yIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY3XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjYiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiamF2YV9zdHJpbmdfY2hlY2tfdXRmOCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szNl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImRlcHJlY2F0ZWQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTJdKSwgJnN0cmVudHJpZXNbMTE5XX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJvYmpjX2NsYXNzX3ByZWZpeCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2NF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImNjX2VuYWJsZV9hcmVuYXMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDI3IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ2XSksICZzdHJlbnRyaWVzWzEyOF19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAidW5pbnRlcnByZXRlZF9vcHRpb24iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTZdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJkZXByZWNhdGVkIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzldKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJtYXBfZW50cnkiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDVdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAzNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzYxXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJjbGllbnRfc3RyZWFtaW5nIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzRdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJzZXJ2ZXJfc3RyZWFtaW5nIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzg0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1Nl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImlucHV0X3R5cGUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjldKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm91dHB1dF90eXBlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc1XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3MF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDI0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEwMF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImRlcHJlY2F0ZWQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAibmFtZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1MF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDciLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAib3B0aW9ucyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3Ml0pLCAmc3RyZW50cmllc1sxNTBdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA2IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm1ldGhvZCIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0OF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm5hbWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTddKSwgJnN0cmVudHJpZXNbMTQ5XX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ1bmludGVycHJldGVkX29wdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxMDFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJkZXByZWNhdGVkIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJsb2NhdGlvbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0NF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMDQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAic3BhbiIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s4N10pLCAmc3RyZW50cmllc1sxNjddfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDMxIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDNdKSwgJnN0cmVudHJpZXNbMTY1XX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJ0cmFpbGluZ19jb21tZW50cyIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s5Ml0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDIwIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgImxlYWRpbmdfY29tbWVudHMiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDJdKSwgJnN0cmVudHJpZXNbMTY0XX0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJwYXRoIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc4XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTQiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiZG91YmxlX3ZhbHVlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE2XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIm5hbWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTFdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAyMiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJuZWdhdGl2ZV9pbnRfdmFsdWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTldKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJhZ2dyZWdhdGVfdmFsdWUiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAicG9zaXRpdmVfaW50X3ZhbHVlIiksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc5XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMjAiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiaWRlbnRpZmllcl92YWx1ZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1syOF0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgInN0cmluZ192YWx1ZSIpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s5MF0pLCAmc3RyZW50cmllc1sxODJdfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJpc19leHRlbnNpb24iKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzBdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJuYW1lX3BhcnQiKSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNThdKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJMQUJFTF9SRVFVSVJFRCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMiksICZzdHJlbnRyaWVzWzE5MF19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJMQUJFTF9SRVBFQVRFRCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMyksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTYiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiTEFCRUxfT1BUSU9OQUwiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDEpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfRklYRUQ2NCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoNiksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX1NUUklORyIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoOSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9GTE9BVCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMiksICZzdHJlbnRyaWVzWzIyMV19LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTMiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9ET1VCTEUiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDEpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9JTlQzMiIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoNSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9TRklYRUQzMiIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTUpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfRklYRUQzMiIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoNyksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX01FU1NBR0UiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDExKSwgJnN0cmVudHJpZXNbMjIyXX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9JTlQ2NCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMyksICZzdHJlbnRyaWVzWzIxOV19LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX0VOVU0iKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDE0KSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX1VJTlQzMiIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTMpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTMiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9VSU5UNjQiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDQpLCAmc3RyZW50cmllc1syMThdfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTUiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9TRklYRUQ2NCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTYpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEyIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfQllURVMiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDEyKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMyIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJUWVBFX1NJTlQ2NCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTgpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfQk9PTCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoOCksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTIiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiVFlQRV9HUk9VUCIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMTApLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDEzIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlRZUEVfU0lOVDMyIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxNyksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNCIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJDT1JEIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAwNiIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJTVFJJTkciKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDApLCAmc3RyZW50cmllc1syMjVdfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlNUUklOR19QSUVDRSIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMiksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJKU19OT1JNQUwiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDApLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDExIiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIkpTX05VTUJFUiIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMiksIE5VTEx9LAotICB7VVBCX1RBQktFWV9TVFIoIlwwMTEiLCAiXDAwMCIsICJcMDAwIiwgIlwwMDAiLCAiSlNfU1RSSU5HIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX1NUUigiXDAxMSIsICJcMDAwIiwgIlwwMDAiLCAiXDAwMCIsICJDT0RFX1NJWkUiKSwgVVBCX1RBQlZBTFVFX0lOVF9JTklUKDIpLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDA1IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIlNQRUVEIiksIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgxKSwgJnN0cmVudHJpZXNbMjM1XX0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfU1RSKCJcMDE0IiwgIlwwMDAiLCAiXDAwMCIsICJcMDAwIiwgIkxJVEVfUlVOVElNRSIpLCBVUEJfVEFCVkFMVUVfSU5UX0lOSVQoMyksIE5VTEx9LAotfTsKLQotc3RhdGljIGNvbnN0IHVwYl90YWJlbnQgaW50ZW50cmllc1sxOF0gPSB7Ci0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTlVNKDk5OSksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzk4XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05VTSg5OTkpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s5N10pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OVU0oOTk5KSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTldKSwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05PTkUsIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTlVNKDk5OSksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzk1XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05VTSg5OTkpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s5Nl0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OVU0oMzMpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxMV0pLCBOVUxMfSwKLSAge1VQQl9UQUJLRVlfTk9ORSwgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsIE5VTEx9LAotICB7VVBCX1RBQktFWV9OVU0oOTk5KSwgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTAwXSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05VTSgzMyksIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE0XSksIE5VTEx9LAotICB7VVBCX1RBQktFWV9OT05FLCBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwgTlVMTH0sCi0gIHtVUEJfVEFCS0VZX05VTSg5OTkpLCBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxMDFdKSwgTlVMTH0sCi19OwotCi1zdGF0aWMgY29uc3QgdXBiX3RhYnZhbCBhcnJheXNbMTg0XSA9IHsKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzUyXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzI1XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzYwXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzE5XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzI0XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzIyXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY4XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY1XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzgzXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzgyXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s4OV0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxOF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODhdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTddKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ5XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEwMl0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3NF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzFdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTNdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzUzXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzYyXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzczXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxNV0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTVdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjFdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNjNdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDBdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTNdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTRdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbN10pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3MV0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s2Nl0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szOF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNl0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3N10pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1sxMF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDFdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzldKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTAzXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1NF0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s3Nl0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s4XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ3XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzIwXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzg1XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzIzXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY5XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzg2XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzgwXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEwNF0pLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s5MV0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjZdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzM1XSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzM0XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY3XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzMzXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzI3XSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzMyXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzgxXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1szMV0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzEyXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzM2XSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzJdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzY0XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzVdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzddKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQ2XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzYxXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzldKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDVdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzU2XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzI5XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzc1XSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzcwXSksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzRdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODRdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s1MF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTddKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDhdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzJdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoJmZpZWxkc1s0NF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzhdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbODddKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNDJdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTJdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgmZmllbGRzWzQzXSksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTFdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMjhdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNzldKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNTldKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMTZdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbOTBdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMF0pLAotICBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbNThdKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCZmaWVsZHNbMzBdKSwKLSAgVVBCX1RBQlZBTFVFX0VNUFRZX0lOSVQsCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiTEFCRUxfT1BUSU9OQUwiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJMQUJFTF9SRVFVSVJFRCIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIkxBQkVMX1JFUEVBVEVEIiksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfRE9VQkxFIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9GTE9BVCIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfSU5UNjQiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX1VJTlQ2NCIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfSU5UMzIiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0ZJWEVENjQiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0ZJWEVEMzIiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0JPT0wiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX1NUUklORyIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfR1JPVVAiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX01FU1NBR0UiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0JZVEVTIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9VSU5UMzIiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX0VOVU0iKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJUWVBFX1NGSVhFRDMyIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9TRklYRUQ2NCIpLAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlRZUEVfU0lOVDMyIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiVFlQRV9TSU5UNjQiKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJTVFJJTkciKSwKLSAgVVBCX1RBQlZBTFVFX1BUUl9JTklUKCJDT1JEIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiU1RSSU5HX1BJRUNFIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiSlNfTk9STUFMIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiSlNfU1RSSU5HIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiSlNfTlVNQkVSIiksCi0gIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklULAotICBVUEJfVEFCVkFMVUVfUFRSX0lOSVQoIlNQRUVEIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiQ09ERV9TSVpFIiksCi0gIFVQQl9UQUJWQUxVRV9QVFJfSU5JVCgiTElURV9SVU5USU1FIiksCi19OwotCi0jaWZkZWYgVVBCX0RFQlVHX1JFRlMKLXN0YXRpYyB1cGJfaW50dGFibGUgcmVmdGFibGVzWzI2NF0gPSB7Ci0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi0gIFVQQl9FTVBUWV9JTlRUQUJMRV9JTklUKFVQQl9DVFlQRV9QVFIpLAotICBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChVUEJfQ1RZUEVfUFRSKSwKLSAgVVBCX0VNUFRZX0lOVFRBQkxFX0lOSVQoVVBCX0NUWVBFX1BUUiksCi19OwotI2VuZGlmCi0KLXN0YXRpYyBjb25zdCB1cGJfbXNnZGVmICpyZWZtKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIHVwYl9tc2dkZWZfcmVmKG0sIG93bmVyKTsKLSAgcmV0dXJuIG07Ci19Ci0KLXN0YXRpYyBjb25zdCB1cGJfZW51bWRlZiAqcmVmZShjb25zdCB1cGJfZW51bWRlZiAqZSwgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgdXBiX2VudW1kZWZfcmVmKGUsIG93bmVyKTsKLSAgcmV0dXJuIGU7Ci19Ci0KLS8qIFB1YmxpYyBBUEkuICovCi1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzBdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9nZXQoY29uc3Qgdm9pZCAqb3duZXIpIHsgcmV0dXJuIHJlZm0oJm1zZ3NbMV0sIG93bmVyKTsgfQotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzJdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1EZXNjcmlwdG9yUHJvdG9fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzNdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmbSgmbXNnc1s0XSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzVdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnNfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzZdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmbSgmbXNnc1s3XSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzhdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzldLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmbSgmbXNnc1sxMF0sIG93bmVyKTsgfQotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzExXSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19nZXQoY29uc3Qgdm9pZCAqb3duZXIpIHsgcmV0dXJuIHJlZm0oJm1zZ3NbMTJdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19nZXQoY29uc3Qgdm9pZCAqb3duZXIpIHsgcmV0dXJuIHJlZm0oJm1zZ3NbMTNdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnNfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzE0XSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9PbmVvZkRlc2NyaXB0b3JQcm90b19nZXQoY29uc3Qgdm9pZCAqb3duZXIpIHsgcmV0dXJuIHJlZm0oJm1zZ3NbMTVdLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG9fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzE2XSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlT3B0aW9uc19nZXQoY29uc3Qgdm9pZCAqb3duZXIpIHsgcmV0dXJuIHJlZm0oJm1zZ3NbMTddLCBvd25lcik7IH0KLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmbSgmbXNnc1sxOF0sIG93bmVyKTsgfQotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZtKCZtc2dzWzE5XSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmbSgmbXNnc1syMF0sIG93bmVyKTsgfQotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9nZXQoY29uc3Qgdm9pZCAqb3duZXIpIHsgcmV0dXJuIHJlZm0oJm1zZ3NbMjFdLCBvd25lcik7IH0KLQotY29uc3QgdXBiX2VudW1kZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmZSgmZW51bXNbMF0sIG93bmVyKTsgfQotY29uc3QgdXBiX2VudW1kZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZlKCZlbnVtc1sxXSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfZW51bWRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX0NUeXBlX2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmZSgmZW51bXNbMl0sIG93bmVyKTsgfQotY29uc3QgdXBiX2VudW1kZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19KU1R5cGVfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKSB7IHJldHVybiByZWZlKCZlbnVtc1szXSwgb3duZXIpOyB9Ci1jb25zdCB1cGJfZW51bWRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2dldChjb25zdCB2b2lkICpvd25lcikgeyByZXR1cm4gcmVmZSgmZW51bXNbNF0sIG93bmVyKTsgfQotLyoKLSoqIFhYWDogVGhlIHJvdXRpbmVzIGluIHRoaXMgZmlsZSB0aGF0IGNvbnN1bWUgYSBzdHJpbmcgZG8gbm90IGN1cnJlbnRseQotKiogc3VwcG9ydCBoYXZpbmcgdGhlIHN0cmluZyBzcGFuIGJ1ZmZlcnMuICBJbiB0aGUgZnV0dXJlLCBhcyB1cGJfc2luayBhbmQKLSoqIGl0cyBidWZmZXJpbmcvc2hhcmluZyBmdW5jdGlvbmFsaXR5IGV2b2x2ZSB0aGVyZSBzaG91bGQgYmUgYW4gZWFzeSBhbmQKLSoqIGlkaW9tYXRpYyB3YXkgb2YgY29ycmVjdGx5IGhhbmRsaW5nIHRoaXMgY2FzZS4gIEZvciBub3csIHdlIGFjY2VwdCB0aGlzCi0qKiBsaW1pdGF0aW9uIHNpbmNlIHdlIGN1cnJlbnRseSBvbmx5IHBhcnNlIGRlc2NyaXB0b3JzIGZyb20gc2luZ2xlIHN0cmluZ3MuCi0qLwotCi0KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0vKiBDb21wYXJlcyBhIE5VTEwtdGVybWluYXRlZCBzdHJpbmcgd2l0aCBhIG5vbi1OVUxMLXRlcm1pbmF0ZWQgc3RyaW5nLiAqLwotc3RhdGljIGJvb2wgdXBiX3N0cmVxKGNvbnN0IGNoYXIgKnN0ciwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbikgewotICByZXR1cm4gc3RybGVuKHN0cikgPT0gbiAmJiBtZW1jbXAoc3RyLCBidWYsIG4pID09IDA7Ci19Ci0KLS8qIFdlIGtlZXAgYSBzdGFjayBvZiBhbGwgdGhlIG1lc3NhZ2VzIHNjb3BlcyB3ZSBhcmUgY3VycmVudGx5IGluLCBhcyB3ZWxsIGFzCi0gKiB0aGUgdG9wLWxldmVsIGZpbGUgc2NvcGUuICBUaGlzIGlzIG5lY2Vzc2FyeSB0byBjb3JyZWN0bHkgcXVhbGlmeSB0aGUKLSAqIGRlZmluaXRpb25zIHRoYXQgYXJlIGNvbnRhaW5lZCBpbnNpZGUuICAibmFtZSIgdHJhY2tzIHRoZSBuYW1lIG9mIHRoZQotICogbWVzc2FnZSBvciBwYWNrYWdlIChhIGJhcmUgbmFtZSAtLSBub3QgcXVhbGlmaWVkIGJ5IGFueSBlbmNsb3Npbmcgc2NvcGVzKS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgY2hhciAqbmFtZTsKLSAgLyogSW5kZXggb2YgdGhlIGZpcnN0IGRlZiB0aGF0IGlzIHVuZGVyIHRoaXMgc2NvcGUuICBGb3IgbXNnZGVmcywgdGhlCi0gICAqIG1zZ2RlZiBpdHNlbGYgaXMgYXQgc3RhcnQtMS4gKi8KLSAgaW50IHN0YXJ0OwotfSB1cGJfZGVzY3JlYWRlcl9mcmFtZTsKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIG5lc3RlZCBkZWNsYXJhdGlvbnMgdGhhdCBhcmUgYWxsb3dlZCwgaWUuCi0gKiBtZXNzYWdlIEZvbyB7Ci0gKiAgIG1lc3NhZ2UgQmFyIHsKLSAqICAgICBtZXNzYWdlIEJheiB7Ci0gKiAgICAgfQotICogICB9Ci0gKiB9Ci0gKgotICogVGhpcyBpcyBhIHJlc291cmNlIGxpbWl0IHRoYXQgYWZmZWN0cyBob3cgYmlnIG91ciBydW50aW1lIHN0YWNrIGNhbiBncm93LgotICogVE9ETzogbWFrZSB0aGlzIGEgcnVudGltZS1zZXR0YWJsZSBwcm9wZXJ0eSBvZiB0aGUgUmVhZGVyIGluc3RhbmNlLiAqLwotI2RlZmluZSBVUEJfTUFYX01FU1NBR0VfTkVTVElORyA2NAotCi1zdHJ1Y3QgdXBiX2Rlc2NyZWFkZXIgewotICB1cGJfc2luayBzaW5rOwotICB1cGJfaW50dGFibGUgZmlsZXM7Ci0gIHVwYl9maWxlZGVmICpmaWxlOyAgLyogVGhlIGxhc3QgZmlsZSBpbiBmaWxlcy4gKi8KLSAgdXBiX2Rlc2NyZWFkZXJfZnJhbWUgc3RhY2tbVVBCX01BWF9NRVNTQUdFX05FU1RJTkddOwotICBpbnQgc3RhY2tfbGVuOwotCi0gIHVpbnQzMl90IG51bWJlcjsKLSAgY2hhciAqbmFtZTsKLSAgYm9vbCBzYXdfbnVtYmVyOwotICBib29sIHNhd19uYW1lOwotCi0gIGNoYXIgKmRlZmF1bHRfc3RyaW5nOwotCi0gIHVwYl9maWVsZGRlZiAqZjsKLX07Ci0KLXN0YXRpYyBjaGFyICp1cGJfc3RybmR1cChjb25zdCBjaGFyICpidWYsIHNpemVfdCBuKSB7Ci0gIGNoYXIgKnJldCA9IHVwYl9nbWFsbG9jKG4gKyAxKTsKLSAgaWYgKCFyZXQpIHJldHVybiBOVUxMOwotICBtZW1jcHkocmV0LCBidWYsIG4pOwotICByZXRbbl0gPSAnXDAnOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBSZXR1cm5zIGEgbmV3bHkgYWxsb2NhdGVkIHN0cmluZyB0aGF0IGpvaW5zIGlucHV0IHN0cmluZ3MgdG9nZXRoZXIsIGZvcgotICogZXhhbXBsZToKLSAqICAgam9pbigiRm9vLkJhciIsICJCYXoiKSAtPiAiRm9vLkJhci5CYXoiCi0gKiAgIGpvaW4oIiIsICJCYXoiKSAtPiAiQmF6IgotICogQ2FsbGVyIG93bnMgYSByZWYgb24gdGhlIHJldHVybmVkIHN0cmluZy4gKi8KLXN0YXRpYyBjaGFyICp1cGJfam9pbihjb25zdCBjaGFyICpiYXNlLCBjb25zdCBjaGFyICpuYW1lKSB7Ci0gIGlmICghYmFzZSB8fCBzdHJsZW4oYmFzZSkgPT0gMCkgewotICAgIHJldHVybiB1cGJfZ3N0cmR1cChuYW1lKTsKLSAgfSBlbHNlIHsKLSAgICBjaGFyICpyZXQgPSB1cGJfZ21hbGxvYyhzdHJsZW4oYmFzZSkgKyBzdHJsZW4obmFtZSkgKyAyKTsKLSAgICBpZiAoIXJldCkgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIHJldFswXSA9ICdcMCc7Ci0gICAgc3RyY2F0KHJldCwgYmFzZSk7Ci0gICAgc3RyY2F0KHJldCwgIi4iKTsKLSAgICBzdHJjYXQocmV0LCBuYW1lKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci19Ci0KLS8qIFF1YWxpZnkgdGhlIGRlZm5hbWUgZm9yIGFsbCBkZWZzIHN0YXJ0aW5nIHdpdGggb2Zmc2V0ICJzdGFydCIgd2l0aCAic3RyIi4gKi8KLXN0YXRpYyBib29sIHVwYl9kZXNjcmVhZGVyX3F1YWxpZnkodXBiX2ZpbGVkZWYgKmYsIGNoYXIgKnN0ciwgaW50MzJfdCBzdGFydCkgewotICBzaXplX3QgaTsKLSAgZm9yIChpID0gc3RhcnQ7IGkgPCB1cGJfZmlsZWRlZl9kZWZjb3VudChmKTsgaSsrKSB7Ci0gICAgdXBiX2RlZiAqZGVmID0gdXBiX2ZpbGVkZWZfbXV0YWJsZWRlZihmLCBpKTsKLSAgICBjaGFyICpuYW1lID0gdXBiX2pvaW4oc3RyLCB1cGJfZGVmX2Z1bGxuYW1lKGRlZikpOwotICAgIGlmICghbmFtZSkgewotICAgICAgLyogTmVlZCBiZXR0ZXIgbG9naWMgaGVyZTsgYXQgdGhpcyBwb2ludCB3ZSd2ZSBxdWFsaWZpZWQgc29tZSBuYW1lcyBidXQKLSAgICAgICAqIG5vdCBvdGhlcnMuICovCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHVwYl9kZWZfc2V0ZnVsbG5hbWUoZGVmLCBuYW1lLCBOVUxMKTsKLSAgICB1cGJfZ2ZyZWUobmFtZSk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotLyogdXBiX2Rlc2NyZWFkZXIgICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHVwYl9tc2dkZWYgKnVwYl9kZXNjcmVhZGVyX3RvcCh1cGJfZGVzY3JlYWRlciAqcikgewotICBpbnQgaW5kZXg7Ci0gIGFzc2VydChyLT5zdGFja19sZW4gPiAxKTsKLSAgaW5kZXggPSByLT5zdGFja1tyLT5zdGFja19sZW4tMV0uc3RhcnQgLSAxOwotICBhc3NlcnQoaW5kZXggPj0gMCk7Ci0gIHJldHVybiB1cGJfZG93bmNhc3RfbXNnZGVmX211dGFibGUodXBiX2ZpbGVkZWZfbXV0YWJsZWRlZihyLT5maWxlLCBpbmRleCkpOwotfQotCi1zdGF0aWMgdXBiX2RlZiAqdXBiX2Rlc2NyZWFkZXJfbGFzdCh1cGJfZGVzY3JlYWRlciAqcikgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfbXV0YWJsZWRlZihyLT5maWxlLCB1cGJfZmlsZWRlZl9kZWZjb3VudChyLT5maWxlKSAtIDEpOwotfQotCi0vKiBTdGFydC9lbmQgaGFuZGxlcnMgZm9yIEZpbGVEZXNjcmlwdG9yUHJvdG8gYW5kIERlc2NyaXB0b3JQcm90byAodGhlIHR3bwotICogZW50aXRpZXMgdGhhdCBoYXZlIG5hbWVzIGFuZCBjYW4gY29udGFpbiBzdWItZGVmaW5pdGlvbnMuICovCi12b2lkIHVwYl9kZXNjcmVhZGVyX3N0YXJ0Y29udGFpbmVyKHVwYl9kZXNjcmVhZGVyICpyKSB7Ci0gIHVwYl9kZXNjcmVhZGVyX2ZyYW1lICpmID0gJnItPnN0YWNrW3ItPnN0YWNrX2xlbisrXTsKLSAgZi0+c3RhcnQgPSB1cGJfZmlsZWRlZl9kZWZjb3VudChyLT5maWxlKTsKLSAgZi0+bmFtZSA9IE5VTEw7Ci19Ci0KLWJvb2wgdXBiX2Rlc2NyZWFkZXJfZW5kY29udGFpbmVyKHVwYl9kZXNjcmVhZGVyICpyKSB7Ci0gIHVwYl9kZXNjcmVhZGVyX2ZyYW1lICpmID0gJnItPnN0YWNrWy0tci0+c3RhY2tfbGVuXTsKLSAgaWYgKCF1cGJfZGVzY3JlYWRlcl9xdWFsaWZ5KHItPmZpbGUsIGYtPm5hbWUsIGYtPnN0YXJ0KSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICB1cGJfZ2ZyZWUoZi0+bmFtZSk7Ci0gIGYtPm5hbWUgPSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCB1cGJfZGVzY3JlYWRlcl9zZXRzY29wZW5hbWUodXBiX2Rlc2NyZWFkZXIgKnIsIGNoYXIgKnN0cikgewotICB1cGJfZGVzY3JlYWRlcl9mcmFtZSAqZiA9ICZyLT5zdGFja1tyLT5zdGFja19sZW4tMV07Ci0gIHVwYl9nZnJlZShmLT5uYW1lKTsKLSAgZi0+bmFtZSA9IHN0cjsKLX0KLQotLyoqIEhhbmRsZXJzIGZvciBnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuICoqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgKmZpbGVzZXRfc3RhcnRmaWxlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIHItPmZpbGUgPSB1cGJfZmlsZWRlZl9uZXcoJnItPmZpbGVzKTsKLSAgdXBiX2ludHRhYmxlX3B1c2goJnItPmZpbGVzLCB1cGJfdmFsdWVfcHRyKHItPmZpbGUpKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLS8qKiBIYW5kbGVycyBmb3IgZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uICoqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIGZpbGVfc3RhcnQodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgdXBiX2Rlc2NyZWFkZXJfc3RhcnRjb250YWluZXIocik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBmaWxlX2VuZCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoc3RhdHVzKTsKLSAgcmV0dXJuIHVwYl9kZXNjcmVhZGVyX2VuZGNvbnRhaW5lcihyKTsKLX0KLQotc3RhdGljIHNpemVfdCBmaWxlX29ubmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgY2hhciAqbmFtZTsKLSAgYm9vbCBvazsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLQotICBuYW1lID0gdXBiX3N0cm5kdXAoYnVmLCBuKTsKLSAgLyogWFhYOiBzZWUgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAqLwotICBvayA9IHVwYl9maWxlZGVmX3NldG5hbWUoci0+ZmlsZSwgbmFtZSwgTlVMTCk7Ci0gIHVwYl9nZnJlZShuYW1lKTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBzaXplX3QgZmlsZV9vbnBhY2thZ2Uodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIGNoYXIgKnBhY2thZ2U7Ci0gIGJvb2wgb2s7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgcGFja2FnZSA9IHVwYl9zdHJuZHVwKGJ1Ziwgbik7Ci0gIC8qIFhYWDogc2VlIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gKi8KLSAgdXBiX2Rlc2NyZWFkZXJfc2V0c2NvcGVuYW1lKHIsIHBhY2thZ2UpOwotICBvayA9IHVwYl9maWxlZGVmX3NldHBhY2thZ2Uoci0+ZmlsZSwgcGFja2FnZSwgTlVMTCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgc2l6ZV90IGZpbGVfb25zeW50YXgodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgYm9vbCBvazsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLSAgLyogWFhYOiBzZWUgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAqLwotICBpZiAodXBiX3N0cmVxKCJwcm90bzIiLCBidWYsIG4pKSB7Ci0gICAgb2sgPSB1cGJfZmlsZWRlZl9zZXRzeW50YXgoci0+ZmlsZSwgVVBCX1NZTlRBWF9QUk9UTzIsIE5VTEwpOwotICB9IGVsc2UgaWYgKHVwYl9zdHJlcSgicHJvdG8zIiwgYnVmLCBuKSkgewotICAgIG9rID0gdXBiX2ZpbGVkZWZfc2V0c3ludGF4KHItPmZpbGUsIFVQQl9TWU5UQVhfUFJPVE8zLCBOVUxMKTsKLSAgfSBlbHNlIHsKLSAgICBvayA9IGZhbHNlOwotICB9Ci0KLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB2b2lkICpmaWxlX3N0YXJ0bXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgdXBiX21zZ2RlZiAqbSA9IHVwYl9tc2dkZWZfbmV3KCZtKTsKLSAgYm9vbCBvayA9IHVwYl9maWxlZGVmX2FkZG1zZyhyLT5maWxlLCBtLCAmbSwgTlVMTCk7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gcjsKLX0KLQotc3RhdGljIHZvaWQgKmZpbGVfc3RhcnRlbnVtKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgdXBiX2VudW1kZWYgKmUgPSB1cGJfZW51bWRlZl9uZXcoJmUpOwotICBib29sIG9rID0gdXBiX2ZpbGVkZWZfYWRkZW51bShyLT5maWxlLCBlLCAmZSwgTlVMTCk7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gcjsKLX0KLQotc3RhdGljIHZvaWQgKmZpbGVfc3RhcnRleHQodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBib29sIG9rOwotICByLT5mID0gdXBiX2ZpZWxkZGVmX25ldyhyKTsKLSAgb2sgPSB1cGJfZmlsZWRlZl9hZGRleHQoci0+ZmlsZSwgci0+ZiwgciwgTlVMTCk7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gcjsKLX0KLQotLyoqIEhhbmRsZXJzIGZvciBnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLiAqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIGVudW12YWxfc3RhcnRtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgci0+c2F3X251bWJlciA9IGZhbHNlOwotICByLT5zYXdfbmFtZSA9IGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHNpemVfdCBlbnVtdmFsX29ubmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLSAgLyogWFhYOiBzZWUgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAqLwotICB1cGJfZ2ZyZWUoci0+bmFtZSk7Ci0gIHItPm5hbWUgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICByLT5zYXdfbmFtZSA9IHRydWU7Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgYm9vbCBlbnVtdmFsX29ubnVtYmVyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBpbnQzMl90IHZhbCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByLT5udW1iZXIgPSB2YWw7Ci0gIHItPnNhd19udW1iZXIgPSB0cnVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZW51bXZhbF9lbmRtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIHVwYl9lbnVtZGVmICplOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICBpZighci0+c2F3X251bWJlciB8fCAhci0+c2F3X25hbWUpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJFbnVtIHZhbHVlIG1pc3NpbmcgbmFtZSBvciBudW1iZXIuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGUgPSB1cGJfZG93bmNhc3RfZW51bWRlZl9tdXRhYmxlKHVwYl9kZXNjcmVhZGVyX2xhc3QocikpOwotICB1cGJfZW51bWRlZl9hZGR2YWwoZSwgci0+bmFtZSwgci0+bnVtYmVyLCBzdGF0dXMpOwotICB1cGJfZ2ZyZWUoci0+bmFtZSk7Ci0gIHItPm5hbWUgPSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyoqIEhhbmRsZXJzIGZvciBnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by4gKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgZW51bV9lbmRtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIHVwYl9lbnVtZGVmICplOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICBlID0gdXBiX2Rvd25jYXN0X2VudW1kZWZfbXV0YWJsZSh1cGJfZGVzY3JlYWRlcl9sYXN0KHIpKTsKLSAgaWYgKHVwYl9kZWZfZnVsbG5hbWUodXBiX2Rlc2NyZWFkZXJfbGFzdChyKSkgPT0gTlVMTCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIkVudW0gaGFkIG5vIG5hbWUuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh1cGJfZW51bWRlZl9udW12YWxzKGUpID09IDApIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZyhzdGF0dXMsICJFbnVtIGhhZCBubyB2YWx1ZXMuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc2l6ZV90IGVudW1fb25uYW1lKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBjaGFyICpmdWxsbmFtZSA9IHVwYl9zdHJuZHVwKGJ1Ziwgbik7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0gIC8qIFhYWDogc2VlIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gKi8KLSAgdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfZGVzY3JlYWRlcl9sYXN0KHIpLCBmdWxsbmFtZSwgTlVMTCk7Ci0gIHVwYl9nZnJlZShmdWxsbmFtZSk7Ci0gIHJldHVybiBuOwotfQotCi0vKiogSGFuZGxlcnMgZm9yIGdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byAqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgYm9vbCBmaWVsZF9zdGFydG1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBhc3NlcnQoci0+Zik7Ci0gIHVwYl9nZnJlZShyLT5kZWZhdWx0X3N0cmluZyk7Ci0gIHItPmRlZmF1bHRfc3RyaW5nID0gTlVMTDsKLQotICAvKiBmaWVsZGRlZnMgZGVmYXVsdCB0byBwYWNrZWQsIGJ1dCBkZXNjcmlwdG9ycyBkZWZhdWx0IHRvIG5vbi1wYWNrZWQuICovCi0gIHVwYl9maWVsZGRlZl9zZXRwYWNrZWQoci0+ZiwgZmFsc2UpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogQ29udmVydHMgdGhlIGRlZmF1bHQgdmFsdWUgaW4gc3RyaW5nICJzdHIiIGludG8gImQiLiAgUGFzc2VzIGEgcmVmIG9uIHN0ci4KLSAqIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiAqLwotc3RhdGljIGJvb2wgcGFyc2VfZGVmYXVsdChjaGFyICpzdHIsIHVwYl9maWVsZGRlZiAqZikgewotICBib29sIHN1Y2Nlc3MgPSB0cnVlOwotICBjaGFyICplbmQ7Ci0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOiB7Ci0gICAgICBsb25nIHZhbCA9IHN0cnRvbChzdHIsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4gfHwgZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQzMihmLCB2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6IHsKLSAgICAgIC8qIFhYWDogTmVlZCB0byB3cml0ZSBvdXIgb3duIHN0cnRvbGwsIHNpbmNlIGl0J3Mgbm90IGF2YWlsYWJsZSBpbiBjODkuICovCi0gICAgICBsb25nIGxvbmcgdmFsID0gc3RydG9sKHN0ciwgJmVuZCwgMCk7Ci0gICAgICBpZiAodmFsID4gSU5UNjRfTUFYIHx8IHZhbCA8IElOVDY0X01JTiB8fCBlcnJubyA9PSBFUkFOR0UgfHwgKmVuZCkKLSAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgZWxzZQotICAgICAgICB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGludDY0KGYsIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6IHsKLSAgICAgIHVuc2lnbmVkIGxvbmcgdmFsID0gc3RydG91bChzdHIsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IFVJTlQzMl9NQVggfHwgZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50MzIoZiwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDogewotICAgICAgLyogWFhYOiBOZWVkIHRvIHdyaXRlIG91ciBvd24gc3RydG91bGwsIHNpbmNlIGl0J3Mgbm90IGF2YWlsYWJsZSBpbiBjODkuICovCi0gICAgICB1bnNpZ25lZCBsb25nIGxvbmcgdmFsID0gc3RydG91bChzdHIsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IFVJTlQ2NF9NQVggfHwgZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50NjQoZiwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX0RPVUJMRTogewotICAgICAgZG91YmxlIHZhbCA9IHN0cnRvZChzdHIsICZlbmQpOwotICAgICAgaWYgKGVycm5vID09IEVSQU5HRSB8fCAqZW5kKQotICAgICAgICBzdWNjZXNzID0gZmFsc2U7Ci0gICAgICBlbHNlCi0gICAgICAgIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0ZG91YmxlKGYsIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDogewotICAgICAgLyogWFhYOiBOZWVkIHRvIHdyaXRlIG91ciBvd24gc3RydG9mLCBzaW5jZSBpdCdzIG5vdCBhdmFpbGFibGUgaW4gYzg5LiAqLwotICAgICAgZmxvYXQgdmFsID0gc3RydG9kKHN0ciwgJmVuZCk7Ci0gICAgICBpZiAoZXJybm8gPT0gRVJBTkdFIHx8ICplbmQpCi0gICAgICAgIHN1Y2Nlc3MgPSBmYWxzZTsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRmbG9hdChmLCB2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDogewotICAgICAgaWYgKHN0cmNtcChzdHIsICJmYWxzZSIpID09IDApCi0gICAgICAgIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbChmLCBmYWxzZSk7Ci0gICAgICBlbHNlIGlmIChzdHJjbXAoc3RyLCAidHJ1ZSIpID09IDApCi0gICAgICAgIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbChmLCB0cnVlKTsKLSAgICAgIGVsc2UKLSAgICAgICAgc3VjY2VzcyA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6IGFib3J0KCk7Ci0gIH0KLSAgcmV0dXJuIHN1Y2Nlc3M7Ci19Ci0KLXN0YXRpYyBib29sIGZpZWxkX2VuZG1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgdXBiX3N0YXR1cyAqc3RhdHVzKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgdXBiX2ZpZWxkZGVmICpmID0gci0+ZjsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgLyogVE9ETzogdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyB3ZXJlIHByZXNlbnQuICovCi0gIGFzc2VydCh1cGJfZmllbGRkZWZfbnVtYmVyKGYpICE9IDApOwotICBhc3NlcnQodXBiX2ZpZWxkZGVmX25hbWUoZikgIT0gTlVMTCk7Ci0gIGFzc2VydCgodXBiX2ZpZWxkZGVmX3N1YmRlZm5hbWUoZikgIT0gTlVMTCkgPT0gdXBiX2ZpZWxkZGVmX2hhc3N1YmRlZihmKSk7Ci0KLSAgaWYgKHItPmRlZmF1bHRfc3RyaW5nKSB7Ci0gICAgaWYgKHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhmKSkgewotICAgICAgdXBiX3N0YXR1c19zZXRlcnJtc2coc3RhdHVzLCAiU3VibWVzc2FnZXMgY2Fubm90IGhhdmUgZGVmYXVsdHMuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmICh1cGJfZmllbGRkZWZfaXNzdHJpbmcoZikgfHwgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfRU5VTSkgewotICAgICAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRjc3RyKGYsIHItPmRlZmF1bHRfc3RyaW5nLCBOVUxMKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKHItPmRlZmF1bHRfc3RyaW5nICYmICFwYXJzZV9kZWZhdWx0KHItPmRlZmF1bHRfc3RyaW5nLCBmKSkgewotICAgICAgICAvKiBXZSBkb24ndCB3b3JyeSB0b28gbXVjaCBhYm91dCBnaXZpbmcgYSBncmVhdCBlcnJvciBtZXNzYWdlIHNpbmNlIHRoZQotICAgICAgICAgKiBjb21waWxlciBzaG91bGQgaGF2ZSBlbnN1cmVkIHRoaXMgd2FzIGNvcnJlY3QuICovCi0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIkVycm9yIGNvbnZlcnRpbmcgZGVmYXVsdCB2YWx1ZS4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZmllbGRfb25sYXp5KHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBib29sIHZhbCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotCi0gIHVwYl9maWVsZGRlZl9zZXRsYXp5KHItPmYsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBmaWVsZF9vbnBhY2tlZCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgYm9vbCB2YWwpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICB1cGJfZmllbGRkZWZfc2V0cGFja2VkKHItPmYsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBmaWVsZF9vbnR5cGUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGludDMyX3QgdmFsKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgdXBiX2ZpZWxkZGVmX3NldGRlc2NyaXB0b3J0eXBlKHItPmYsIHZhbCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBmaWVsZF9vbmxhYmVsKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBpbnQzMl90IHZhbCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotCi0gIHVwYl9maWVsZGRlZl9zZXRsYWJlbChyLT5mLCB2YWwpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZmllbGRfb25udW1iZXIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGludDMyX3QgdmFsKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgYm9vbCBvazsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgb2sgPSB1cGJfZmllbGRkZWZfc2V0bnVtYmVyKHItPmYsIHZhbCwgTlVMTCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgc2l6ZV90IGZpZWxkX29ubmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIGNoYXIgKm5hbWUgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotCi0gIC8qIFhYWDogc2VlIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gKi8KLSAgdXBiX2ZpZWxkZGVmX3NldG5hbWUoci0+ZiwgbmFtZSwgTlVMTCk7Ci0gIHVwYl9nZnJlZShuYW1lKTsKLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyBzaXplX3QgZmllbGRfb250eXBlbmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICBjaGFyICpuYW1lID0gdXBiX3N0cm5kdXAoYnVmLCBuKTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLQotICAvKiBYWFg6IHNlZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICovCi0gIHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKHItPmYsIG5hbWUsIE5VTEwpOwotICB1cGJfZ2ZyZWUobmFtZSk7Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgc2l6ZV90IGZpZWxkX29uZXh0ZW5kZWUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbiwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgY2hhciAqbmFtZSA9IHVwYl9zdHJuZHVwKGJ1Ziwgbik7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgLyogWFhYOiBzZWUgY29tbWVudCBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlLiAqLwotICB1cGJfZmllbGRkZWZfc2V0Y29udGFpbmluZ3R5cGVuYW1lKHItPmYsIG5hbWUsIE5VTEwpOwotICB1cGJfZ2ZyZWUobmFtZSk7Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgc2l6ZV90IGZpZWxkX29uZGVmYXVsdHZhbCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG4sIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgLyogSGF2ZSB0byBjb252ZXJ0IGZyb20gc3RyaW5nIHRvIHRoZSBjb3JyZWN0IHR5cGUsIGJ1dCB3ZSBtaWdodCBub3Qga25vdyB0aGUKLSAgICogdHlwZSB5ZXQsIHNvIHdlIHNhdmUgaXQgYXMgYSBzdHJpbmcgdW50aWwgdGhlIGVuZCBvZiB0aGUgZmllbGQuCi0gICAqIFhYWDogc2VlIGNvbW1lbnQgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZS4gKi8KLSAgdXBiX2dmcmVlKHItPmRlZmF1bHRfc3RyaW5nKTsKLSAgci0+ZGVmYXVsdF9zdHJpbmcgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICByZXR1cm4gbjsKLX0KLQotLyoqIEhhbmRsZXJzIGZvciBnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgbXNnX3N0YXJ0KHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgdXBiX2Rlc2NyZWFkZXJfc3RhcnRjb250YWluZXIocik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBtc2dfZW5kKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICB1cGJfbXNnZGVmICptID0gdXBiX2Rlc2NyZWFkZXJfdG9wKHIpOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICBpZighdXBiX2RlZl9mdWxsbmFtZSh1cGJfbXNnZGVmX3VwY2FzdF9tdXRhYmxlKG0pKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKHN0YXR1cywgIkVuY291bnRlcmVkIG1lc3NhZ2Ugd2l0aCBubyBuYW1lLiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdXBiX2Rlc2NyZWFkZXJfZW5kY29udGFpbmVyKHIpOwotfQotCi1zdGF0aWMgc2l6ZV90IG1zZ19uYW1lKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICB1cGJfbXNnZGVmICptID0gdXBiX2Rlc2NyZWFkZXJfdG9wKHIpOwotICAvKiBYWFg6IHNlZSBjb21tZW50IGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICovCi0gIGNoYXIgKm5hbWUgPSB1cGJfc3RybmR1cChidWYsIG4pOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotCi0gIHVwYl9kZWZfc2V0ZnVsbG5hbWUodXBiX21zZ2RlZl91cGNhc3RfbXV0YWJsZShtKSwgbmFtZSwgTlVMTCk7Ci0gIHVwYl9kZXNjcmVhZGVyX3NldHNjb3BlbmFtZShyLCBuYW1lKTsgIC8qIFBhc3NlcyBvd25lcnNoaXAgb2YgbmFtZS4gKi8KLSAgcmV0dXJuIG47Ci19Ci0KLXN0YXRpYyB2b2lkICptc2dfc3RhcnRtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICB1cGJfbXNnZGVmICptID0gdXBiX21zZ2RlZl9uZXcoJm0pOwotICBib29sIG9rID0gdXBiX2ZpbGVkZWZfYWRkbXNnKHItPmZpbGUsIG0sICZtLCBOVUxMKTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gIHJldHVybiByOwotfQotCi1zdGF0aWMgdm9pZCAqbXNnX3N0YXJ0ZXh0KHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX2ZpZWxkZGVmX25ldygmZik7Ci0gIGJvb2wgb2sgPSB1cGJfZmlsZWRlZl9hZGRleHQoci0+ZmlsZSwgZiwgJmYsIE5VTEwpOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIHI7Ci19Ci0KLXN0YXRpYyB2b2lkICptc2dfc3RhcnRmaWVsZCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IGNsb3N1cmU7Ci0gIHItPmYgPSB1cGJfZmllbGRkZWZfbmV3KCZyLT5mKTsKLSAgLyogV2UgY2FuJ3QgYWRkIHRoZSBuZXcgZmllbGQgdG8gdGhlIG1lc3NhZ2UgdW50aWwgaXRzIG5hbWUvbnVtYmVyIGFyZQotICAgKiBmaWxsZWQgaW4uICovCi0gIFVQQl9VTlVTRUQoaGQpOwotICByZXR1cm4gcjsKLX0KLQotc3RhdGljIGJvb2wgbXNnX2VuZGZpZWxkKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9kZXNjcmVhZGVyICpyID0gY2xvc3VyZTsKLSAgdXBiX21zZ2RlZiAqbSA9IHVwYl9kZXNjcmVhZGVyX3RvcChyKTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0KLSAgdXBiX21zZ2RlZl9hZGRmaWVsZChtLCByLT5mLCAmci0+ZiwgTlVMTCk7Ci0gIHItPmYgPSBOVUxMOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgbXNnX29ubWFwZW50cnkodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGQsIGJvb2wgbWFwZW50cnkpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBjbG9zdXJlOwotICB1cGJfbXNnZGVmICptID0gdXBiX2Rlc2NyZWFkZXJfdG9wKHIpOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICB1cGJfbXNnZGVmX3NldG1hcGVudHJ5KG0sIG1hcGVudHJ5KTsKLSAgci0+ZiA9IE5VTEw7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLQotLyoqIENvZGUgdG8gcmVnaXN0ZXIgaGFuZGxlcnMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBGKG1zZywgZmllbGQpIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmXyAjIyBtc2cgIyMgX2ZfICMjIGZpZWxkKG0pCi0KLXN0YXRpYyB2b2lkIHJlZ2hhbmRsZXJzKGNvbnN0IHZvaWQgKmNsb3N1cmUsIHVwYl9oYW5kbGVycyAqaCkgewotICBjb25zdCB1cGJfbXNnZGVmICptID0gdXBiX2hhbmRsZXJzX21zZ2RlZihoKTsKLSAgVVBCX1VOVVNFRChjbG9zdXJlKTsKLQotICBpZiAodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JTZXRfaXMobSkpIHsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2coaCwgRihGaWxlRGVzY3JpcHRvclNldCwgZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlc2V0X3N0YXJ0ZmlsZSwgTlVMTCk7Ci0gIH0gZWxzZSBpZiAodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2lzKG0pKSB7Ci0gICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKGgsICZtc2dfc3RhcnQsIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRlbmRtc2coaCwgJm1zZ19lbmQsIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgRihEZXNjcmlwdG9yUHJvdG8sIG5hbWUpLCAmbXNnX25hbWUsIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBGKERlc2NyaXB0b3JQcm90bywgZXh0ZW5zaW9uKSwgJm1zZ19zdGFydGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3VibXNnKGgsIEYoRGVzY3JpcHRvclByb3RvLCBuZXN0ZWRfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dfc3RhcnRtc2csIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBGKERlc2NyaXB0b3JQcm90bywgZmllbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbXNnX3N0YXJ0ZmllbGQsIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2coaCwgRihEZXNjcmlwdG9yUHJvdG8sIGZpZWxkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtc2dfZW5kZmllbGQsIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBGKERlc2NyaXB0b3JQcm90bywgZW51bV90eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpbGVfc3RhcnRlbnVtLCBOVUxMKTsKLSAgfSBlbHNlIGlmICh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2lzKG0pKSB7Ci0gICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKGgsICZmaWxlX3N0YXJ0LCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0ZW5kbXNnKGgsICZmaWxlX2VuZCwgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBGKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG5hbWUpLCAmZmlsZV9vbm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEYoRmlsZURlc2NyaXB0b3JQcm90bywgcGFja2FnZSksICZmaWxlX29ucGFja2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgRihGaWxlRGVzY3JpcHRvclByb3RvLCBzeW50YXgpLCAmZmlsZV9vbnN5bnRheCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBGKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG1lc3NhZ2VfdHlwZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlX3N0YXJ0bXNnLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2coaCwgRihGaWxlRGVzY3JpcHRvclByb3RvLCBlbnVtX3R5cGUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZmlsZV9zdGFydGVudW0sIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBGKEZpbGVEZXNjcmlwdG9yUHJvdG8sIGV4dGVuc2lvbiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWxlX3N0YXJ0ZXh0LCBOVUxMKTsKLSAgfSBlbHNlIGlmICh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9faXMobSkpIHsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRtc2coaCwgJmVudW12YWxfc3RhcnRtc2csIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRlbmRtc2coaCwgJmVudW12YWxfZW5kbXNnLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEYoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBuYW1lKSwgJmVudW12YWxfb25uYW1lLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwgRihFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIG51bWJlciksICZlbnVtdmFsX29ubnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgfSBlbHNlIGlmICh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX2lzKG0pKSB7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGVuZG1zZyhoLCAmZW51bV9lbmRtc2csIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgRihFbnVtRGVzY3JpcHRvclByb3RvLCBuYW1lKSwgJmVudW1fb25uYW1lLCBOVUxMKTsKLSAgfSBlbHNlIGlmICh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19pcyhtKSkgewotICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydG1zZyhoLCAmZmllbGRfc3RhcnRtc2csIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRlbmRtc2coaCwgJmZpZWxkX2VuZG1zZywgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIEYoRmllbGREZXNjcmlwdG9yUHJvdG8sIHR5cGUpLCAmZmllbGRfb250eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwgRihGaWVsZERlc2NyaXB0b3JQcm90bywgbGFiZWwpLCAmZmllbGRfb25sYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIEYoRmllbGREZXNjcmlwdG9yUHJvdG8sIG51bWJlciksICZmaWVsZF9vbm51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCk7Ci0gICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBGKEZpZWxkRGVzY3JpcHRvclByb3RvLCBuYW1lKSwgJmZpZWxkX29ubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgRihGaWVsZERlc2NyaXB0b3JQcm90bywgdHlwZV9uYW1lKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9vbnR5cGVuYW1lLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEYoRmllbGREZXNjcmlwdG9yUHJvdG8sIGV4dGVuZGVlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmaWVsZF9vbmV4dGVuZGVlLCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIEYoRmllbGREZXNjcmlwdG9yUHJvdG8sIGRlZmF1bHRfdmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgJmZpZWxkX29uZGVmYXVsdHZhbCwgTlVMTCk7Ci0gIH0gZWxzZSBpZiAodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2lzKG0pKSB7Ci0gICAgdXBiX2hhbmRsZXJzX3NldGJvb2woaCwgRihGaWVsZE9wdGlvbnMsIGxhenkpLCAmZmllbGRfb25sYXp5LCBOVUxMKTsKLSAgICB1cGJfaGFuZGxlcnNfc2V0Ym9vbChoLCBGKEZpZWxkT3B0aW9ucywgcGFja2VkKSwgJmZpZWxkX29ucGFja2VkLCBOVUxMKTsKLSAgfSBlbHNlIGlmICh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19pcyhtKSkgewotICAgIHVwYl9oYW5kbGVyc19zZXRib29sKGgsIEYoTWVzc2FnZU9wdGlvbnMsIG1hcF9lbnRyeSksICZtc2dfb25tYXBlbnRyeSwgTlVMTCk7Ci0gIH0KLQotICBhc3NlcnQodXBiX29rKHVwYl9oYW5kbGVyc19zdGF0dXMoaCkpKTsKLX0KLQotI3VuZGVmIEYKLQotdm9pZCBkZXNjcmVhZGVyX2NsZWFudXAodm9pZCAqX3IpIHsKLSAgdXBiX2Rlc2NyZWFkZXIgKnIgPSBfcjsKLSAgc2l6ZV90IGk7Ci0KLSAgZm9yIChpID0gMDsgaSA8IHVwYl9kZXNjcmVhZGVyX2ZpbGVjb3VudChyKTsgaSsrKSB7Ci0gICAgdXBiX2ZpbGVkZWZfdW5yZWYodXBiX2Rlc2NyZWFkZXJfZmlsZShyLCBpKSwgJnItPmZpbGVzKTsKLSAgfQotCi0gIHVwYl9nZnJlZShyLT5uYW1lKTsKLSAgdXBiX2ludHRhYmxlX3VuaW5pdCgmci0+ZmlsZXMpOwotICB1cGJfZ2ZyZWUoci0+ZGVmYXVsdF9zdHJpbmcpOwotICB3aGlsZSAoci0+c3RhY2tfbGVuID4gMCkgewotICAgIHVwYl9kZXNjcmVhZGVyX2ZyYW1lICpmID0gJnItPnN0YWNrWy0tci0+c3RhY2tfbGVuXTsKLSAgICB1cGJfZ2ZyZWUoZi0+bmFtZSk7Ci0gIH0KLX0KLQotCi0vKiBQdWJsaWMgQVBJICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11cGJfZGVzY3JlYWRlciAqdXBiX2Rlc2NyZWFkZXJfY3JlYXRlKHVwYl9lbnYgKmUsIGNvbnN0IHVwYl9oYW5kbGVycyAqaCkgewotICB1cGJfZGVzY3JlYWRlciAqciA9IHVwYl9lbnZfbWFsbG9jKGUsIHNpemVvZih1cGJfZGVzY3JlYWRlcikpOwotICBpZiAoIXIgfHwgIXVwYl9lbnZfYWRkY2xlYW51cChlLCBkZXNjcmVhZGVyX2NsZWFudXAsIHIpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICB1cGJfaW50dGFibGVfaW5pdCgmci0+ZmlsZXMsIFVQQl9DVFlQRV9QVFIpOwotICB1cGJfc2lua19yZXNldCh1cGJfZGVzY3JlYWRlcl9pbnB1dChyKSwgaCwgcik7Ci0gIHItPnN0YWNrX2xlbiA9IDA7Ci0gIHItPm5hbWUgPSBOVUxMOwotICByLT5kZWZhdWx0X3N0cmluZyA9IE5VTEw7Ci0KLSAgcmV0dXJuIHI7Ci19Ci0KLXNpemVfdCB1cGJfZGVzY3JlYWRlcl9maWxlY291bnQoY29uc3QgdXBiX2Rlc2NyZWFkZXIgKnIpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9jb3VudCgmci0+ZmlsZXMpOwotfQotCi11cGJfZmlsZWRlZiAqdXBiX2Rlc2NyZWFkZXJfZmlsZShjb25zdCB1cGJfZGVzY3JlYWRlciAqciwgc2l6ZV90IGkpIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIGlmICh1cGJfaW50dGFibGVfbG9va3VwKCZyLT5maWxlcywgaSwgJnYpKSB7Ci0gICAgcmV0dXJuIHVwYl92YWx1ZV9nZXRwdHIodik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotdXBiX3NpbmsgKnVwYl9kZXNjcmVhZGVyX2lucHV0KHVwYl9kZXNjcmVhZGVyICpyKSB7Ci0gIHJldHVybiAmci0+c2luazsKLX0KLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfZGVzY3JlYWRlcl9uZXdoYW5kbGVycyhjb25zdCB2b2lkICpvd25lcikgewotICBjb25zdCB1cGJfbXNnZGVmICptID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JTZXRfZ2V0KCZtKTsKLSAgY29uc3QgdXBiX2hhbmRsZXJzICpoID0gdXBiX2hhbmRsZXJzX25ld2Zyb3plbihtLCBvd25lciwgcmVnaGFuZGxlcnMsIE5VTEwpOwotICB1cGJfbXNnZGVmX3VucmVmKG0sICZtKTsKLSAgcmV0dXJuIGg7Ci19Ci0vKgotKiogcHJvdG9idWYgZGVjb2RlciBieXRlY29kZSBjb21waWxlcgotKioKLSoqIENvZGUgdG8gY29tcGlsZSBhIHVwYjo6SGFuZGxlcnMgaW50byBieXRlY29kZSBmb3IgZGVjb2RpbmcgYSBwcm90b2J1ZgotKiogYWNjb3JkaW5nIHRvIHRoYXQgc3BlY2lmaWMgc2NoZW1hIGFuZCBkZXN0aW5hdGlvbiBoYW5kbGVycy4KLSoqCi0qKiBDb21waWxpbmcgdG8gYnl0ZWNvZGUgaXMgYWx3YXlzIHRoZSBmaXJzdCBzdGVwLiAgSWYgd2UgYXJlIHVzaW5nIHRoZQotKiogaW50ZXJwcmV0ZWQgZGVjb2RlciB3ZSBsZWF2ZSBpdCBhcyBieXRlY29kZSBhbmQgaW50ZXJwcmV0IHRoYXQuICBJZiB3ZSBhcmUKLSoqIHVzaW5nIGEgSklUIGRlY29kZXIgd2UgdXNlIGEgY29kZSBnZW5lcmF0b3IgdG8gdHVybiB0aGUgYnl0ZWNvZGUgaW50byBuYXRpdmUKLSoqIGNvZGUsIExMVk0gSVIsIGV0Yy4KLSoqCi0qKiBCeXRlY29kZSBkZWZpbml0aW9uIGlzIGluIGRlY29kZXIuaW50LmguCi0qLwotCi0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0KLSNpZmRlZiBVUEJfRFVNUF9CWVRFQ09ERQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jZW5kaWYKLQotI2RlZmluZSBNQVhMQUJFTCA1Ci0jZGVmaW5lIEVNUFRZTEFCRUwgLTEKLQotLyogbWdyb3VwICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIHZvaWQgZnJlZWdyb3VwKHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIG1ncm91cCAqZyA9IChtZ3JvdXAqKXI7Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQoJmctPm1ldGhvZHMpOwotI2lmZGVmIFVQQl9VU0VfSklUX1g2NAotICB1cGJfcGJkZWNvZGVyX2ZyZWVqaXQoZyk7Ci0jZW5kaWYKLSAgdXBiX2dmcmVlKGctPmJ5dGVjb2RlKTsKLSAgdXBiX2dmcmVlKGcpOwotfQotCi1zdGF0aWMgdm9pZCB2aXNpdGdyb3VwKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZF92aXNpdCAqdmlzaXQsCi0gICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgbWdyb3VwICpnID0gKGNvbnN0IG1ncm91cCopcjsKLSAgdXBiX2ludHRhYmxlX2l0ZXIgaTsKLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCAmZy0+bWV0aG9kcyk7Ci0gIGZvcig7ICF1cGJfaW50dGFibGVfZG9uZSgmaSk7IHVwYl9pbnR0YWJsZV9uZXh0KCZpKSkgewotICAgIHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZCA9IHVwYl92YWx1ZV9nZXRwdHIodXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpKTsKLSAgICB2aXNpdChyLCB1cGJfcGJkZWNvZGVybWV0aG9kX3VwY2FzdChtZXRob2QpLCBjbG9zdXJlKTsKLSAgfQotfQotCi1tZ3JvdXAgKm5ld2dyb3VwKGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIG1ncm91cCAqZyA9IHVwYl9nbWFsbG9jKHNpemVvZigqZykpOwotICBzdGF0aWMgY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdnRibCA9IHt2aXNpdGdyb3VwLCBmcmVlZ3JvdXB9OwotICB1cGJfcmVmY291bnRlZF9pbml0KG1ncm91cF91cGNhc3RfbXV0YWJsZShnKSwgJnZ0YmwsIG93bmVyKTsKLSAgdXBiX2ludHRhYmxlX2luaXQoJmctPm1ldGhvZHMsIFVQQl9DVFlQRV9QVFIpOwotICBnLT5ieXRlY29kZSA9IE5VTEw7Ci0gIGctPmJ5dGVjb2RlX2VuZCA9IE5VTEw7Ci0gIHJldHVybiBnOwotfQotCi0KLS8qIHVwYl9wYmRlY29kZXJtZXRob2QgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyB2b2lkIGZyZWVtZXRob2QodXBiX3JlZmNvdW50ZWQgKnIpIHsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kID0gKHVwYl9wYmRlY29kZXJtZXRob2QqKXI7Ci0KLSAgaWYgKG1ldGhvZC0+ZGVzdF9oYW5kbGVyc18pIHsKLSAgICB1cGJfaGFuZGxlcnNfdW5yZWYobWV0aG9kLT5kZXN0X2hhbmRsZXJzXywgbWV0aG9kKTsKLSAgfQotCi0gIHVwYl9pbnR0YWJsZV91bmluaXQoJm1ldGhvZC0+ZGlzcGF0Y2gpOwotICB1cGJfZ2ZyZWUobWV0aG9kKTsKLX0KLQotc3RhdGljIHZvaWQgdmlzaXRtZXRob2QoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkX3Zpc2l0ICp2aXNpdCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbSA9IChjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kKilyOwotICB2aXNpdChyLCBtLT5ncm91cCwgY2xvc3VyZSk7Ci19Ci0KLXN0YXRpYyB1cGJfcGJkZWNvZGVybWV0aG9kICpuZXdtZXRob2QoY29uc3QgdXBiX2hhbmRsZXJzICpkZXN0X2hhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZ3JvdXAgKmdyb3VwKSB7Ci0gIHN0YXRpYyBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB2dGJsID0ge3Zpc2l0bWV0aG9kLCBmcmVlbWV0aG9kfTsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqcmV0ID0gdXBiX2dtYWxsb2Moc2l6ZW9mKCpyZXQpKTsKLSAgdXBiX3JlZmNvdW50ZWRfaW5pdCh1cGJfcGJkZWNvZGVybWV0aG9kX3VwY2FzdF9tdXRhYmxlKHJldCksICZ2dGJsLCAmcmV0KTsKLSAgdXBiX2J5dGVzaGFuZGxlcl9pbml0KCZyZXQtPmlucHV0X2hhbmRsZXJfKTsKLQotICAvKiBUaGUgbWV0aG9kIHJlZmVyZW5jZXMgdGhlIGdyb3VwIGFuZCB2aWNlLXZlcnNhLCBpbiBhIGNpcmN1bGFyIHJlZmVyZW5jZS4gKi8KLSAgdXBiX3JlZjIocmV0LCBncm91cCk7Ci0gIHVwYl9yZWYyKGdyb3VwLCByZXQpOwotICB1cGJfaW50dGFibGVfaW5zZXJ0cHRyKCZncm91cC0+bWV0aG9kcywgZGVzdF9oYW5kbGVycywgdXBiX3ZhbHVlX3B0cihyZXQpKTsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZF91bnJlZihyZXQsICZyZXQpOwotCi0gIHJldC0+Z3JvdXAgPSBtZ3JvdXBfdXBjYXN0X211dGFibGUoZ3JvdXApOwotICByZXQtPmRlc3RfaGFuZGxlcnNfID0gZGVzdF9oYW5kbGVyczsKLSAgcmV0LT5pc19uYXRpdmVfID0gZmFsc2U7ICAvKiBJZiB3ZSBKSVQsIGl0IHdpbGwgdXBkYXRlIHRoaXMgbGF0ZXIuICovCi0gIHVwYl9pbnR0YWJsZV9pbml0KCZyZXQtPmRpc3BhdGNoLCBVUEJfQ1RZUEVfVUlOVDY0KTsKLQotICBpZiAocmV0LT5kZXN0X2hhbmRsZXJzXykgewotICAgIHVwYl9oYW5kbGVyc19yZWYocmV0LT5kZXN0X2hhbmRsZXJzXywgcmV0KTsKLSAgfQotICByZXR1cm4gcmV0OwotfQotCi1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9wYmRlY29kZXJtZXRob2RfZGVzdGhhbmRsZXJzKAotICAgIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKm0pIHsKLSAgcmV0dXJuIG0tPmRlc3RfaGFuZGxlcnNfOwotfQotCi1jb25zdCB1cGJfYnl0ZXNoYW5kbGVyICp1cGJfcGJkZWNvZGVybWV0aG9kX2lucHV0aGFuZGxlcigKLSAgICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptKSB7Ci0gIHJldHVybiAmbS0+aW5wdXRfaGFuZGxlcl87Ci19Ci0KLWJvb2wgdXBiX3BiZGVjb2Rlcm1ldGhvZF9pc25hdGl2ZShjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptKSB7Ci0gIHJldHVybiBtLT5pc19uYXRpdmVfOwotfQotCi1jb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICp1cGJfcGJkZWNvZGVybWV0aG9kX25ldygKLSAgICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyAqb3B0cywgY29uc3Qgdm9pZCAqb3duZXIpIHsKLSAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqcmV0OwotICB1cGJfcGJjb2RlY2FjaGUgY2FjaGU7Ci0KLSAgdXBiX3BiY29kZWNhY2hlX2luaXQoJmNhY2hlKTsKLSAgcmV0ID0gdXBiX3BiY29kZWNhY2hlX2dldGRlY29kZXJtZXRob2QoJmNhY2hlLCBvcHRzKTsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZF9yZWYocmV0LCBvd25lcik7Ci0gIHVwYl9wYmNvZGVjYWNoZV91bmluaXQoJmNhY2hlKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotCi0vKiBieXRlY29kZSBjb21waWxlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBEYXRhIHVzZWQgb25seSBhdCBjb21waWxhdGlvbiB0aW1lLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBtZ3JvdXAgKmdyb3VwOwotCi0gIHVpbnQzMl90ICpwYzsKLSAgaW50IGZ3ZF9sYWJlbHNbTUFYTEFCRUxdOwotICBpbnQgYmFja19sYWJlbHNbTUFYTEFCRUxdOwotCi0gIC8qIEZvciBmaWVsZHMgbWFya2VkICJsYXp5IiwgcGFyc2UgdGhlbSBsYXppbHkgb3IgZWFnZXJseT8gKi8KLSAgYm9vbCBsYXp5OwotfSBjb21waWxlcjsKLQotc3RhdGljIGNvbXBpbGVyICpuZXdjb21waWxlcihtZ3JvdXAgKmdyb3VwLCBib29sIGxhenkpIHsKLSAgY29tcGlsZXIgKnJldCA9IHVwYl9nbWFsbG9jKHNpemVvZigqcmV0KSk7Ci0gIGludCBpOwotCi0gIHJldC0+Z3JvdXAgPSBncm91cDsKLSAgcmV0LT5sYXp5ID0gbGF6eTsKLSAgZm9yIChpID0gMDsgaSA8IE1BWExBQkVMOyBpKyspIHsKLSAgICByZXQtPmZ3ZF9sYWJlbHNbaV0gPSBFTVBUWUxBQkVMOwotICAgIHJldC0+YmFja19sYWJlbHNbaV0gPSBFTVBUWUxBQkVMOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB2b2lkIGZyZWVjb21waWxlcihjb21waWxlciAqYykgewotICB1cGJfZ2ZyZWUoYyk7Ci19Ci0KLWNvbnN0IHNpemVfdCBwdHJfd29yZHMgPSBzaXplb2Yodm9pZCopIC8gc2l6ZW9mKHVpbnQzMl90KTsKLQotLyogSG93IG1hbnkgd29yZHMgYW4gaW5zdHJ1Y3Rpb24gaXMuICovCi1zdGF0aWMgaW50IGluc3RydWN0aW9uX2xlbih1aW50MzJfdCBpbnN0cikgewotICBzd2l0Y2ggKGdldG9wKGluc3RyKSkgewotICAgIGNhc2UgT1BfU0VURElTUEFUQ0g6IHJldHVybiAxICsgcHRyX3dvcmRzOwotICAgIGNhc2UgT1BfVEFHTjogcmV0dXJuIDM7Ci0gICAgY2FzZSBPUF9TRVRCSUdHUk9VUE5VTTogcmV0dXJuIDI7Ci0gICAgZGVmYXVsdDogcmV0dXJuIDE7Ci0gIH0KLX0KLQotYm9vbCBvcF9oYXNfbG9uZ29mcyhpbnQzMl90IGluc3RydWN0aW9uKSB7Ci0gIHN3aXRjaCAoZ2V0b3AoaW5zdHJ1Y3Rpb24pKSB7Ci0gICAgY2FzZSBPUF9DQUxMOgotICAgIGNhc2UgT1BfQlJBTkNIOgotICAgIGNhc2UgT1BfQ0hFQ0tERUxJTToKLSAgICAgIHJldHVybiB0cnVlOwotICAgIC8qIFRoZSAidGFnIiBpbnN0cnVjdGlvbnMgb25seSBoYXZlIDggYnl0ZXMgYXZhaWxhYmxlIGZvciB0aGUganVtcCB0YXJnZXQsCi0gICAgICogYnV0IHRoYXQgaXMgb2sgYmVjYXVzZSB0aGVzZSBvcGNvZGVzIG9ubHkgcmVxdWlyZSBzaG9ydCBqdW1wcy4gKi8KLSAgICBjYXNlIE9QX1RBRzE6Ci0gICAgY2FzZSBPUF9UQUcyOgotICAgIGNhc2UgT1BfVEFHTjoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1zdGF0aWMgaW50MzJfdCBnZXRvZnModWludDMyX3QgaW5zdHJ1Y3Rpb24pIHsKLSAgaWYgKG9wX2hhc19sb25nb2ZzKGluc3RydWN0aW9uKSkgewotICAgIHJldHVybiAoaW50MzJfdClpbnN0cnVjdGlvbiA+PiA4OwotICB9IGVsc2UgewotICAgIHJldHVybiAoaW50OF90KShpbnN0cnVjdGlvbiA+PiA4KTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBzZXRvZnModWludDMyX3QgKmluc3RydWN0aW9uLCBpbnQzMl90IG9mcykgewotICBpZiAob3BfaGFzX2xvbmdvZnMoKmluc3RydWN0aW9uKSkgewotICAgICppbnN0cnVjdGlvbiA9IGdldG9wKCppbnN0cnVjdGlvbikgfCBvZnMgPDwgODsKLSAgfSBlbHNlIHsKLSAgICAqaW5zdHJ1Y3Rpb24gPSAoKmluc3RydWN0aW9uICYgfjB4ZmYwMCkgfCAoKG9mcyAmIDB4ZmYpIDw8IDgpOwotICB9Ci0gIGFzc2VydChnZXRvZnMoKmluc3RydWN0aW9uKSA9PSBvZnMpOyAgLyogV291bGQgZmFpbCBpbiBjYXNlcyBvZiBvdmVyZmxvdy4gKi8KLX0KLQotc3RhdGljIHVpbnQzMl90IHBjb2ZzKGNvbXBpbGVyICpjKSB7IHJldHVybiBjLT5wYyAtIGMtPmdyb3VwLT5ieXRlY29kZTsgfQotCi0vKiBEZWZpbmVzIGEgbG9jYWwgbGFiZWwgYXQgdGhlIGN1cnJlbnQgUEMgbG9jYXRpb24uICBBbGwgcHJldmlvdXMgZm9yd2FyZAotICogcmVmZXJlbmNlcyBhcmUgdXBkYXRlZCB0byBwb2ludCB0byB0aGlzIGxvY2F0aW9uLiAgVGhlIGxvY2F0aW9uIGlzIG5vdGVkCi0gKiBmb3IgYW55IGZ1dHVyZSBiYWNrd2FyZCByZWZlcmVuY2VzLiAqLwotc3RhdGljIHZvaWQgbGFiZWwoY29tcGlsZXIgKmMsIHVuc2lnbmVkIGludCBsYWJlbCkgewotICBpbnQgdmFsOwotICB1aW50MzJfdCAqY29kZXA7Ci0KLSAgYXNzZXJ0KGxhYmVsIDwgTUFYTEFCRUwpOwotICB2YWwgPSBjLT5md2RfbGFiZWxzW2xhYmVsXTsKLSAgY29kZXAgPSAodmFsID09IEVNUFRZTEFCRUwpID8gTlVMTCA6IGMtPmdyb3VwLT5ieXRlY29kZSArIHZhbDsKLSAgd2hpbGUgKGNvZGVwKSB7Ci0gICAgaW50IG9mcyA9IGdldG9mcygqY29kZXApOwotICAgIHNldG9mcyhjb2RlcCwgYy0+cGMgLSBjb2RlcCAtIGluc3RydWN0aW9uX2xlbigqY29kZXApKTsKLSAgICBjb2RlcCA9IG9mcyA/IGNvZGVwICsgb2ZzIDogTlVMTDsKLSAgfQotICBjLT5md2RfbGFiZWxzW2xhYmVsXSA9IEVNUFRZTEFCRUw7Ci0gIGMtPmJhY2tfbGFiZWxzW2xhYmVsXSA9IHBjb2ZzKGMpOwotfQotCi0vKiBDcmVhdGVzIGEgcmVmZXJlbmNlIHRvIGEgbnVtYmVyZWQgbGFiZWw7IGVpdGhlciBhIGZvcndhcmQgcmVmZXJlbmNlCi0gKiAocG9zaXRpdmUgYXJnKSBvciBiYWNrd2FyZCByZWZlcmVuY2UgKG5lZ2F0aXZlIGFyZykuICBGb3IgZm9yd2FyZCByZWZlcmVuY2VzCi0gKiB0aGUgdmFsdWUgcmV0dXJuZWQgbm93IGlzIGFjdHVhbGx5IGEgIm5leHQiIHBvaW50ZXIgaW50byBhIGxpbmtlZCBsaXN0IG9mIGFsbAotICogaW5zdHJ1Y3Rpb25zIHRoYXQgdXNlIHRoaXMgbGFiZWwgYW5kIHdpbGwgYmUgcGF0Y2hlZCBsYXRlciB3aGVuIHRoZSBsYWJlbCBpcwotICogZGVmaW5lZCB3aXRoIGxhYmVsKCkuCi0gKgotICogVGhlIHJldHVybmVkIHZhbHVlIGlzIHRoZSBvZmZzZXQgdGhhdCBzaG91bGQgYmUgd3JpdHRlbiBpbnRvIHRoZSBpbnN0cnVjdGlvbi4KLSAqLwotc3RhdGljIGludDMyX3QgbGFiZWxyZWYoY29tcGlsZXIgKmMsIGludCBsYWJlbCkgewotICBhc3NlcnQobGFiZWwgPCBNQVhMQUJFTCk7Ci0gIGlmIChsYWJlbCA9PSBMQUJFTF9ESVNQQVRDSCkgewotICAgIC8qIE5vIHJlc29sdmluZyByZXF1aXJlZC4gKi8KLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIGlmIChsYWJlbCA8IDApIHsKLSAgICAvKiBCYWNrd2FyZCBsb2NhbCBsYWJlbC4gIFJlbGF0aXZlIHRvIHRoZSBuZXh0IGluc3RydWN0aW9uLiAqLwotICAgIHVpbnQzMl90IGZyb20gPSAoYy0+cGMgKyAxKSAtIGMtPmdyb3VwLT5ieXRlY29kZTsKLSAgICByZXR1cm4gYy0+YmFja19sYWJlbHNbLWxhYmVsXSAtIGZyb207Ci0gIH0gZWxzZSB7Ci0gICAgLyogRm9yd2FyZCBsb2NhbCBsYWJlbDogcHJlcGVuZCB0byAocG9zc2libHktZW1wdHkpIGxpbmtlZCBsaXN0LiAqLwotICAgIGludCAqbHB0ciA9ICZjLT5md2RfbGFiZWxzW2xhYmVsXTsKLSAgICBpbnQzMl90IHJldCA9ICgqbHB0ciA9PSBFTVBUWUxBQkVMKSA/IDAgOiAqbHB0ciAtIHBjb2ZzKGMpOwotICAgICpscHRyID0gcGNvZnMoYyk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXQzMihjb21waWxlciAqYywgdWludDMyX3QgdikgewotICBtZ3JvdXAgKmcgPSBjLT5ncm91cDsKLSAgaWYgKGMtPnBjID09IGctPmJ5dGVjb2RlX2VuZCkgewotICAgIGludCBvZnMgPSBwY29mcyhjKTsKLSAgICBzaXplX3Qgb2xkc2l6ZSA9IGctPmJ5dGVjb2RlX2VuZCAtIGctPmJ5dGVjb2RlOwotICAgIHNpemVfdCBuZXdzaXplID0gVVBCX01BWChvbGRzaXplICogMiwgNjQpOwotICAgIC8qIFRPRE8oaGFiZXJtYW4pOiBoYW5kbGUgT09NLiAqLwotICAgIGctPmJ5dGVjb2RlID0gdXBiX2dyZWFsbG9jKGctPmJ5dGVjb2RlLCBvbGRzaXplICogc2l6ZW9mKHVpbnQzMl90KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3c2l6ZSAqIHNpemVvZih1aW50MzJfdCkpOwotICAgIGctPmJ5dGVjb2RlX2VuZCA9IGctPmJ5dGVjb2RlICsgbmV3c2l6ZTsKLSAgICBjLT5wYyA9IGctPmJ5dGVjb2RlICsgb2ZzOwotICB9Ci0gICpjLT5wYysrID0gdjsKLX0KLQotc3RhdGljIHZvaWQgcHV0b3AoY29tcGlsZXIgKmMsIG9wY29kZSBvcCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBvcCk7Ci0KLSAgc3dpdGNoIChvcCkgewotICAgIGNhc2UgT1BfU0VURElTUEFUQ0g6IHsKLSAgICAgIHVpbnRwdHJfdCBwdHIgPSAodWludHB0cl90KXZhX2FyZyhhcCwgdm9pZCopOwotICAgICAgcHV0MzIoYywgT1BfU0VURElTUEFUQ0gpOwotICAgICAgcHV0MzIoYywgcHRyKTsKLSAgICAgIGlmIChzaXplb2YodWludHB0cl90KSA+IHNpemVvZih1aW50MzJfdCkpCi0gICAgICAgIHB1dDMyKGMsICh1aW50NjRfdClwdHIgPj4gMzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1BfU1RBUlRNU0c6Ci0gICAgY2FzZSBPUF9FTkRNU0c6Ci0gICAgY2FzZSBPUF9QVVNITEVOREVMSU06Ci0gICAgY2FzZSBPUF9QT1A6Ci0gICAgY2FzZSBPUF9TRVRERUxJTToKLSAgICBjYXNlIE9QX0hBTFQ6Ci0gICAgY2FzZSBPUF9SRVQ6Ci0gICAgY2FzZSBPUF9ESVNQQVRDSDoKLSAgICAgIHB1dDMyKGMsIG9wKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BfUEFSU0VfRE9VQkxFOgotICAgIGNhc2UgT1BfUEFSU0VfRkxPQVQ6Ci0gICAgY2FzZSBPUF9QQVJTRV9JTlQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX1VJTlQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX0lOVDMyOgotICAgIGNhc2UgT1BfUEFSU0VfRklYRUQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX0ZJWEVEMzI6Ci0gICAgY2FzZSBPUF9QQVJTRV9CT09MOgotICAgIGNhc2UgT1BfUEFSU0VfVUlOVDMyOgotICAgIGNhc2UgT1BfUEFSU0VfU0ZJWEVEMzI6Ci0gICAgY2FzZSBPUF9QQVJTRV9TRklYRUQ2NDoKLSAgICBjYXNlIE9QX1BBUlNFX1NJTlQzMjoKLSAgICBjYXNlIE9QX1BBUlNFX1NJTlQ2NDoKLSAgICBjYXNlIE9QX1NUQVJUU0VROgotICAgIGNhc2UgT1BfRU5EU0VROgotICAgIGNhc2UgT1BfU1RBUlRTVUJNU0c6Ci0gICAgY2FzZSBPUF9FTkRTVUJNU0c6Ci0gICAgY2FzZSBPUF9TVEFSVFNUUjoKLSAgICBjYXNlIE9QX1NUUklORzoKLSAgICBjYXNlIE9QX0VORFNUUjoKLSAgICBjYXNlIE9QX1BVU0hUQUdERUxJTToKLSAgICAgIHB1dDMyKGMsIG9wIHwgdmFfYXJnKGFwLCB1cGJfc2VsZWN0b3JfdCkgPDwgOCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIE9QX1NFVEJJR0dST1VQTlVNOgotICAgICAgcHV0MzIoYywgb3ApOwotICAgICAgcHV0MzIoYywgdmFfYXJnKGFwLCBpbnQpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgT1BfQ0FMTDogewotICAgICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kID0gdmFfYXJnKGFwLCB1cGJfcGJkZWNvZGVybWV0aG9kICopOwotICAgICAgcHV0MzIoYywgb3AgfCAobWV0aG9kLT5jb2RlX2Jhc2Uub2ZzIC0gKHBjb2ZzKGMpICsgMSkpIDw8IDgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1BfQ0hFQ0tERUxJTToKLSAgICBjYXNlIE9QX0JSQU5DSDogewotICAgICAgdWludDMyX3QgaW5zdHJ1Y3Rpb24gPSBvcDsKLSAgICAgIGludCBsYWJlbCA9IHZhX2FyZyhhcCwgaW50KTsKLSAgICAgIHNldG9mcygmaW5zdHJ1Y3Rpb24sIGxhYmVscmVmKGMsIGxhYmVsKSk7Ci0gICAgICBwdXQzMihjLCBpbnN0cnVjdGlvbik7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBPUF9UQUcxOgotICAgIGNhc2UgT1BfVEFHMjogewotICAgICAgaW50IGxhYmVsID0gdmFfYXJnKGFwLCBpbnQpOwotICAgICAgdWludDY0X3QgdGFnID0gdmFfYXJnKGFwLCB1aW50NjRfdCk7Ci0gICAgICB1aW50MzJfdCBpbnN0cnVjdGlvbiA9IG9wIHwgKHRhZyA8PCAxNik7Ci0gICAgICBhc3NlcnQodGFnIDw9IDB4ZmZmZik7Ci0gICAgICBzZXRvZnMoJmluc3RydWN0aW9uLCBsYWJlbHJlZihjLCBsYWJlbCkpOwotICAgICAgcHV0MzIoYywgaW5zdHJ1Y3Rpb24pOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgT1BfVEFHTjogewotICAgICAgaW50IGxhYmVsID0gdmFfYXJnKGFwLCBpbnQpOwotICAgICAgdWludDY0X3QgdGFnID0gdmFfYXJnKGFwLCB1aW50NjRfdCk7Ci0gICAgICB1aW50MzJfdCBpbnN0cnVjdGlvbiA9IG9wIHwgKHVwYl92YWx1ZV9zaXplKHRhZykgPDwgMTYpOwotICAgICAgc2V0b2ZzKCZpbnN0cnVjdGlvbiwgbGFiZWxyZWYoYywgbGFiZWwpKTsKLSAgICAgIHB1dDMyKGMsIGluc3RydWN0aW9uKTsKLSAgICAgIHB1dDMyKGMsIHRhZyk7Ci0gICAgICBwdXQzMihjLCB0YWcgPj4gMzIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgdmFfZW5kKGFwKTsKLX0KLQotI2lmIGRlZmluZWQoVVBCX1VTRV9KSVRfWDY0KSB8fCBkZWZpbmVkKFVQQl9EVU1QX0JZVEVDT0RFKQotCi1jb25zdCBjaGFyICp1cGJfcGJkZWNvZGVyX2dldG9wbmFtZSh1bnNpZ25lZCBpbnQgb3ApIHsKLSNkZWZpbmUgUVVPVEUoeCkgI3gKLSNkZWZpbmUgRVhQQU5EX0FORF9RVU9URSh4KSBRVU9URSh4KQotI2RlZmluZSBPUE5BTUUoeCkgT1BfIyN4Ci0jZGVmaW5lIE9QKHgpIGNhc2UgT1BOQU1FKHgpOiByZXR1cm4gRVhQQU5EX0FORF9RVU9URShPUE5BTUUoeCkpOwotI2RlZmluZSBUKHgpIE9QKFBBUlNFXyMjeCkKLSAgLyogS2VlcCBpbiBzeW5jIHdpdGggbGlzdCBpbiBkZWNvZGVyLmludC5oLiAqLwotICBzd2l0Y2ggKChvcGNvZGUpb3ApIHsKLSAgICBUKERPVUJMRSkgVChGTE9BVCkgVChJTlQ2NCkgVChVSU5UNjQpIFQoSU5UMzIpIFQoRklYRUQ2NCkgVChGSVhFRDMyKQotICAgIFQoQk9PTCkgVChVSU5UMzIpIFQoU0ZJWEVEMzIpIFQoU0ZJWEVENjQpIFQoU0lOVDMyKSBUKFNJTlQ2NCkKLSAgICBPUChTVEFSVE1TRykgT1AoRU5ETVNHKSBPUChTVEFSVFNFUSkgT1AoRU5EU0VRKSBPUChTVEFSVFNVQk1TRykKLSAgICBPUChFTkRTVUJNU0cpIE9QKFNUQVJUU1RSKSBPUChTVFJJTkcpIE9QKEVORFNUUikgT1AoQ0FMTCkgT1AoUkVUKQotICAgIE9QKFBVU0hMRU5ERUxJTSkgT1AoUFVTSFRBR0RFTElNKSBPUChTRVRERUxJTSkgT1AoQ0hFQ0tERUxJTSkKLSAgICBPUChCUkFOQ0gpIE9QKFRBRzEpIE9QKFRBRzIpIE9QKFRBR04pIE9QKFNFVERJU1BBVENIKSBPUChQT1ApCi0gICAgT1AoU0VUQklHR1JPVVBOVU0pIE9QKERJU1BBVENIKSBPUChIQUxUKQotICB9Ci0gIHJldHVybiAiPHVua25vd24gb3A+IjsKLSN1bmRlZiBPUAotI3VuZGVmIFQKLX0KLQotI2VuZGlmCi0KLSNpZmRlZiBVUEJfRFVNUF9CWVRFQ09ERQotCi1zdGF0aWMgdm9pZCBkdW1wYmModWludDMyX3QgKnAsIHVpbnQzMl90ICplbmQsIEZJTEUgKmYpIHsKLQotICB1aW50MzJfdCAqYmVnaW4gPSBwOwotCi0gIHdoaWxlIChwIDwgZW5kKSB7Ci0gICAgZnByaW50ZihmLCAiJXAgICU4dHgiLCBwLCBwIC0gYmVnaW4pOwotICAgIHVpbnQzMl90IGluc3RyID0gKnArKzsKLSAgICB1aW50OF90IG9wID0gZ2V0b3AoaW5zdHIpOwotICAgIGZwcmludGYoZiwgIiAlcyIsIHVwYl9wYmRlY29kZXJfZ2V0b3BuYW1lKG9wKSk7Ci0gICAgc3dpdGNoICgob3Bjb2RlKW9wKSB7Ci0gICAgICBjYXNlIE9QX1NFVERJU1BBVENIOiB7Ci0gICAgICAgIGNvbnN0IHVwYl9pbnR0YWJsZSAqZGlzcGF0Y2g7Ci0gICAgICAgIG1lbWNweSgmZGlzcGF0Y2gsIHAsIHNpemVvZih2b2lkKikpOwotICAgICAgICBwICs9IHB0cl93b3JkczsKLSAgICAgICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kID0KLSAgICAgICAgICAgICh2b2lkICopKChjaGFyICopZGlzcGF0Y2ggLQotICAgICAgICAgICAgICAgICAgICAgb2Zmc2V0b2YodXBiX3BiZGVjb2Rlcm1ldGhvZCwgZGlzcGF0Y2gpKTsKLSAgICAgICAgZnByaW50ZihmLCAiICVzIiwgdXBiX21zZ2RlZl9mdWxsbmFtZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyc19tc2dkZWYobWV0aG9kLT5kZXN0X2hhbmRsZXJzXykpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9QX0RJU1BBVENIOgotICAgICAgY2FzZSBPUF9TVEFSVE1TRzoKLSAgICAgIGNhc2UgT1BfRU5ETVNHOgotICAgICAgY2FzZSBPUF9QVVNITEVOREVMSU06Ci0gICAgICBjYXNlIE9QX1BPUDoKLSAgICAgIGNhc2UgT1BfU0VUREVMSU06Ci0gICAgICBjYXNlIE9QX0hBTFQ6Ci0gICAgICBjYXNlIE9QX1JFVDoKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX1BBUlNFX0RPVUJMRToKLSAgICAgIGNhc2UgT1BfUEFSU0VfRkxPQVQ6Ci0gICAgICBjYXNlIE9QX1BBUlNFX0lOVDY0OgotICAgICAgY2FzZSBPUF9QQVJTRV9VSU5UNjQ6Ci0gICAgICBjYXNlIE9QX1BBUlNFX0lOVDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9GSVhFRDY0OgotICAgICAgY2FzZSBPUF9QQVJTRV9GSVhFRDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9CT09MOgotICAgICAgY2FzZSBPUF9QQVJTRV9VSU5UMzI6Ci0gICAgICBjYXNlIE9QX1BBUlNFX1NGSVhFRDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9TRklYRUQ2NDoKLSAgICAgIGNhc2UgT1BfUEFSU0VfU0lOVDMyOgotICAgICAgY2FzZSBPUF9QQVJTRV9TSU5UNjQ6Ci0gICAgICBjYXNlIE9QX1NUQVJUU0VROgotICAgICAgY2FzZSBPUF9FTkRTRVE6Ci0gICAgICBjYXNlIE9QX1NUQVJUU1VCTVNHOgotICAgICAgY2FzZSBPUF9FTkRTVUJNU0c6Ci0gICAgICBjYXNlIE9QX1NUQVJUU1RSOgotICAgICAgY2FzZSBPUF9TVFJJTkc6Ci0gICAgICBjYXNlIE9QX0VORFNUUjoKLSAgICAgIGNhc2UgT1BfUFVTSFRBR0RFTElNOgotICAgICAgICBmcHJpbnRmKGYsICIgJWQiLCBpbnN0ciA+PiA4KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX1NFVEJJR0dST1VQTlVNOgotICAgICAgICBmcHJpbnRmKGYsICIgJWQiLCAqcCsrKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX0NIRUNLREVMSU06Ci0gICAgICBjYXNlIE9QX0NBTEw6Ci0gICAgICBjYXNlIE9QX0JSQU5DSDoKLSAgICAgICAgZnByaW50ZihmLCAiID0+MHgldHgiLCBwICsgZ2V0b2ZzKGluc3RyKSAtIGJlZ2luKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE9QX1RBRzE6Ci0gICAgICBjYXNlIE9QX1RBRzI6IHsKLSAgICAgICAgZnByaW50ZihmLCAiIHRhZzoweCV4IiwgaW5zdHIgPj4gMTYpOwotICAgICAgICBpZiAoZ2V0b2ZzKGluc3RyKSkgewotICAgICAgICAgIGZwcmludGYoZiwgIiA9PjB4JXR4IiwgcCArIGdldG9mcyhpbnN0cikgLSBiZWdpbik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIE9QX1RBR046IHsKLSAgICAgICAgdWludDY0X3QgdGFnID0gKnArKzsKLSAgICAgICAgdGFnIHw9ICh1aW50NjRfdCkqcCsrIDw8IDMyOwotICAgICAgICBmcHJpbnRmKGYsICIgdGFnOjB4JWxseCIsIChsb25nIGxvbmcpdGFnKTsKLSAgICAgICAgZnByaW50ZihmLCAiIG46JWQiLCBpbnN0ciA+PiAxNik7Ci0gICAgICAgIGlmIChnZXRvZnMoaW5zdHIpKSB7Ci0gICAgICAgICAgZnByaW50ZihmLCAiID0+MHgldHgiLCBwICsgZ2V0b2ZzKGluc3RyKSAtIGJlZ2luKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgZnB1dHMoIlxuIiwgZik7Ci0gIH0KLX0KLQotI2VuZGlmCi0KLXN0YXRpYyB1aW50NjRfdCBnZXRfZW5jb2RlZF90YWcoY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBpbnQgd2lyZV90eXBlKSB7Ci0gIHVpbnQzMl90IHRhZyA9ICh1cGJfZmllbGRkZWZfbnVtYmVyKGYpIDw8IDMpIHwgd2lyZV90eXBlOwotICB1aW50NjRfdCBlbmNvZGVkX3RhZyA9IHVwYl92ZW5jb2RlMzIodGFnKTsKLSAgLyogTm8gdGFnIHNob3VsZCBiZSBncmVhdGVyIHRoYW4gNSBieXRlcy4gKi8KLSAgYXNzZXJ0KGVuY29kZWRfdGFnIDw9IDB4ZmZmZmZmZmZmZik7Ci0gIHJldHVybiBlbmNvZGVkX3RhZzsKLX0KLQotc3RhdGljIHZvaWQgcHV0Y2hlY2t0YWcoY29tcGlsZXIgKmMsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCB3aXJlX3R5cGUsIGludCBkZXN0KSB7Ci0gIHVpbnQ2NF90IHRhZyA9IGdldF9lbmNvZGVkX3RhZyhmLCB3aXJlX3R5cGUpOwotICBzd2l0Y2ggKHVwYl92YWx1ZV9zaXplKHRhZykpIHsKLSAgICBjYXNlIDE6Ci0gICAgICBwdXRvcChjLCBPUF9UQUcxLCBkZXN0LCB0YWcpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSAyOgotICAgICAgcHV0b3AoYywgT1BfVEFHMiwgZGVzdCwgdGFnKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBwdXRvcChjLCBPUF9UQUdOLCBkZXN0LCB0YWcpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotc3RhdGljIHVwYl9zZWxlY3Rvcl90IGdldHNlbChjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUpIHsKLSAgdXBiX3NlbGVjdG9yX3Qgc2VsZWN0b3I7Ci0gIGJvb2wgb2sgPSB1cGJfaGFuZGxlcnNfZ2V0c2VsZWN0b3IoZiwgdHlwZSwgJnNlbGVjdG9yKTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIHNlbGVjdG9yOwotfQotCi0vKiBUYWtlcyBhbiBleGlzdGluZywgcHJpbWFyeSBkaXNwYXRjaCB0YWJsZSBlbnRyeSBhbmQgcmVwYWNrcyBpdCB3aXRoIGEKLSAqIGRpZmZlcmVudCBhbHRlcm5hdGUgd2lyZSB0eXBlLiAgQ2FsbGVkIHdoZW4gd2UgYXJlIGluc2VydGluZyBhIHNlY29uZGFyeQotICogZGlzcGF0Y2ggdGFibGUgZW50cnkgZm9yIGFuIGFsdGVybmF0ZSB3aXJlIHR5cGUuICovCi1zdGF0aWMgdWludDY0X3QgcmVwYWNrKHVpbnQ2NF90IGRpc3BhdGNoLCBpbnQgbmV3X3d0MikgewotICB1aW50NjRfdCBvZnM7Ci0gIHVpbnQ4X3Qgd3QxOwotICB1aW50OF90IG9sZF93dDI7Ci0gIHVwYl9wYmRlY29kZXJfdW5wYWNrZGlzcGF0Y2goZGlzcGF0Y2gsICZvZnMsICZ3dDEsICZvbGRfd3QyKTsKLSAgYXNzZXJ0KG9sZF93dDIgPT0gTk9fV0lSRV9UWVBFKTsgIC8qIHd0MiBzaG91bGQgbm90IGJlIHNldCB5ZXQuICovCi0gIHJldHVybiB1cGJfcGJkZWNvZGVyX3BhY2tkaXNwYXRjaChvZnMsIHd0MSwgbmV3X3d0Mik7Ci19Ci0KLS8qIE1hcmtzIHRoZSBjdXJyZW50IGJ5dGVjb2RlIHBvc2l0aW9uIGFzIHRoZSBkaXNwYXRjaCB0YXJnZXQgZm9yIHRoaXMgbWVzc2FnZSwKLSAqIGZpZWxkLCBhbmQgd2lyZSB0eXBlLiAqLwotc3RhdGljIHZvaWQgZGlzcGF0Y2h0YXJnZXQoY29tcGlsZXIgKmMsIHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwgaW50IHdpcmVfdHlwZSkgewotICAvKiBPZmZzZXQgaXMgcmVsYXRpdmUgdG8gbXNnIGJhc2UuICovCi0gIHVpbnQ2NF90IG9mcyA9IHBjb2ZzKGMpIC0gbWV0aG9kLT5jb2RlX2Jhc2Uub2ZzOwotICB1aW50MzJfdCBmbiA9IHVwYl9maWVsZGRlZl9udW1iZXIoZik7Ci0gIHVwYl9pbnR0YWJsZSAqZCA9ICZtZXRob2QtPmRpc3BhdGNoOwotICB1cGJfdmFsdWUgdjsKLSAgaWYgKHVwYl9pbnR0YWJsZV9yZW1vdmUoZCwgZm4sICZ2KSkgewotICAgIC8qIFRPRE86IHByaW9yaXRpemUgYmFzZWQgb24gcGFja2VkIHNldHRpbmcgaW4gLnByb3RvIGZpbGUuICovCi0gICAgdWludDY0X3QgcmVwYWNrZWQgPSByZXBhY2sodXBiX3ZhbHVlX2dldHVpbnQ2NCh2KSwgd2lyZV90eXBlKTsKLSAgICB1cGJfaW50dGFibGVfaW5zZXJ0KGQsIGZuLCB1cGJfdmFsdWVfdWludDY0KHJlcGFja2VkKSk7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydChkLCBmbiArIFVQQl9NQVhfRklFTEROVU1CRVIsIHVwYl92YWx1ZV91aW50NjQob2ZzKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdWludDY0X3QgdmFsID0gdXBiX3BiZGVjb2Rlcl9wYWNrZGlzcGF0Y2gob2ZzLCB3aXJlX3R5cGUsIE5PX1dJUkVfVFlQRSk7Ci0gICAgdXBiX2ludHRhYmxlX2luc2VydChkLCBmbiwgdXBiX3ZhbHVlX3VpbnQ2NCh2YWwpKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBwdXRwdXNoKGNvbXBpbGVyICpjLCBjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShmKSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0UpIHsKLSAgICBwdXRvcChjLCBPUF9QVVNITEVOREVMSU0pOwotICB9IGVsc2UgewotICAgIHVpbnQzMl90IGZuID0gdXBiX2ZpZWxkZGVmX251bWJlcihmKTsKLSAgICBpZiAoZm4gPj0gMSA8PCAyNCkgewotICAgICAgcHV0b3AoYywgT1BfUFVTSFRBR0RFTElNLCAwKTsKLSAgICAgIHB1dG9wKGMsIE9QX1NFVEJJR0dST1VQTlVNLCBmbik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHB1dG9wKGMsIE9QX1BVU0hUQUdERUxJTSwgZm4pOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqZmluZF9zdWJtZXRob2QoY29uc3QgY29tcGlsZXIgKmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZikgewotICBjb25zdCB1cGJfaGFuZGxlcnMgKnN1YiA9Ci0gICAgICB1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnMobWV0aG9kLT5kZXN0X2hhbmRsZXJzXywgZik7Ci0gIHVwYl92YWx1ZSB2OwotICByZXR1cm4gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmYy0+Z3JvdXAtPm1ldGhvZHMsIHN1YiwgJnYpCi0gICAgICAgICAgICAgPyB1cGJfdmFsdWVfZ2V0cHRyKHYpCi0gICAgICAgICAgICAgOiBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBwdXRzZWwoY29tcGlsZXIgKmMsIG9wY29kZSBvcCwgdXBiX3NlbGVjdG9yX3Qgc2VsLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9oYW5kbGVycyAqaCkgewotICBpZiAodXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoaCwgc2VsKSkgewotICAgIHB1dG9wKGMsIG9wLCBzZWwpOwotICB9Ci19Ci0KLS8qIFB1dHMgYW4gb3Bjb2RlIHRvIGNhbGwgYSBjYWxsYmFjaywgYnV0IG9ubHkgaWYgYSBjYWxsYmFjayBhY3R1YWxseSBleGlzdHMgZm9yCi0gKiB0aGlzIGZpZWxkIGFuZCBoYW5kbGVyIHR5cGUuICovCi1zdGF0aWMgdm9pZCBtYXliZXB1dChjb21waWxlciAqYywgb3Bjb2RlIG9wLCBjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUpIHsKLSAgcHV0c2VsKGMsIG9wLCBnZXRzZWwoZiwgdHlwZSksIGgpOwotfQotCi1zdGF0aWMgYm9vbCBoYXNsYXp5aGFuZGxlcnMoY29uc3QgdXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYpIHsKLSAgaWYgKCF1cGJfZmllbGRkZWZfbGF6eShmKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKGgsIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNUUikpIHx8Ci0gICAgICAgICB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihoLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RSSU5HKSkgfHwKLSAgICAgICAgIHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKGgsIGdldHNlbChmLCBVUEJfSEFORExFUl9FTkRTVFIpKTsKLX0KLQotCi0vKiBieXRlY29kZSBjb21waWxlciBjb2RlIGdlbmVyYXRpb24gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBTeW1ib2xpYyBuYW1lcyBmb3Igb3VyIGxvY2FsIGxhYmVscy4gKi8KLSNkZWZpbmUgTEFCRUxfTE9PUFNUQVJUIDEgIC8qIFRvcCBvZiBhIHJlcGVhdGVkIGZpZWxkIGxvb3AuICovCi0jZGVmaW5lIExBQkVMX0xPT1BCUkVBSyAyICAvKiBUbyBqdW1wIG91dCBvZiBhIHJlcGVhdGVkIGxvb3AgKi8KLSNkZWZpbmUgTEFCRUxfRklFTEQgICAgIDMgIC8qIEp1bXAgYmFja3dhcmQgdG8gZmluZCB0aGUgbW9zdCByZWNlbnQgZmllbGQuICovCi0jZGVmaW5lIExBQkVMX0VORE1TRyAgICA0ICAvKiBUbyByZWFjaCB0aGUgT1BfRU5ETVNHIGluc3RyIGZvciB0aGlzIG1zZy4gKi8KLQotLyogR2VuZXJhdGVzIGJ5dGVjb2RlIHRvIHBhcnNlIGEgc2luZ2xlIG5vbi1sYXp5IG1lc3NhZ2UgZmllbGQuICovCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9tc2dmaWVsZChjb21waWxlciAqYywgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaCA9IHVwYl9wYmRlY29kZXJtZXRob2RfZGVzdGhhbmRsZXJzKG1ldGhvZCk7Ci0gIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKnN1Yl9tID0gZmluZF9zdWJtZXRob2QoYywgbWV0aG9kLCBmKTsKLSAgaW50IHdpcmVfdHlwZTsKLQotICBpZiAoIXN1Yl9tKSB7Ci0gICAgLyogRG9uJ3QgZW1pdCBhbnkgY29kZSBmb3IgdGhpcyBmaWVsZCBhdCBhbGw7IGl0IHdpbGwgYmUgcGFyc2VkIGFzIGFuCi0gICAgICogdW5rbm93biBmaWVsZC4KLSAgICAgKgotICAgICAqIFRPRE8oaGFiZXJtYW4pOiB3ZSBzaG91bGQgY2hhbmdlIHRoaXMgdG8gcGFyc2UgaXQgYXMgYSBzdHJpbmcgZmllbGQKLSAgICAgKiBpbnN0ZWFkLiAgSXQgd2lsbCBwcm9iYWJseSBiZSBmYXN0ZXIsIGJ1dCBtb3JlIGltcG9ydGFudGx5LCBvbmNlIHdlCi0gICAgICogc3RhcnQgdmVuZGluZyB1bmtub3duIGZpZWxkcywgYSBmaWVsZCBzaG91bGRuJ3QgYmUgdHJlYXRlZCBhcyB1bmtub3duCi0gICAgICoganVzdCBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBzdWJoYW5kbGVycyByZWdpc3RlcmVkLiAqLwotICAgIHJldHVybjsKLSAgfQotCi0gIGxhYmVsKGMsIExBQkVMX0ZJRUxEKTsKLQotICB3aXJlX3R5cGUgPQotICAgICAgKHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShmKSA9PSBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0UpCi0gICAgICAgICAgPyBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRAotICAgICAgICAgIDogVVBCX1dJUkVfVFlQRV9TVEFSVF9HUk9VUDsKLQotICBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfRU5ETVNHKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCB3aXJlX3R5cGUsIExBQkVMX0RJU1BBVENIKTsKLSAgIGRpc3BhdGNodGFyZ2V0KGMsIG1ldGhvZCwgZiwgd2lyZV90eXBlKTsKLSAgICBwdXRvcChjLCBPUF9QVVNIVEFHREVMSU0sIDApOwotICAgIHB1dG9wKGMsIE9QX1NUQVJUU0VRLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RBUlRTRVEpKTsKLSAgIGxhYmVsKGMsIExBQkVMX0xPT1BTVEFSVCk7Ci0gICAgcHV0cHVzaChjLCBmKTsKLSAgICBwdXRvcChjLCBPUF9TVEFSVFNVQk1TRywgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU1VCTVNHKSk7Ci0gICAgcHV0b3AoYywgT1BfQ0FMTCwgc3ViX20pOwotICAgIHB1dG9wKGMsIE9QX1BPUCk7Ci0gICAgbWF5YmVwdXQoYywgT1BfRU5EU1VCTVNHLCBoLCBmLCBVUEJfSEFORExFUl9FTkRTVUJNU0cpOwotICAgIGlmICh3aXJlX3R5cGUgPT0gVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQpIHsKLSAgICAgIHB1dG9wKGMsIE9QX1NFVERFTElNKTsKLSAgICB9Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfTE9PUEJSRUFLKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCB3aXJlX3R5cGUsIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0b3AoYywgT1BfQlJBTkNILCAtTEFCRUxfTE9PUFNUQVJUKTsKLSAgIGxhYmVsKGMsIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0b3AoYywgT1BfUE9QKTsKLSAgICBtYXliZXB1dChjLCBPUF9FTkRTRVEsIGgsIGYsIFVQQl9IQU5ETEVSX0VORFNFUSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfRU5ETVNHKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCB3aXJlX3R5cGUsIExBQkVMX0RJU1BBVENIKTsKLSAgIGRpc3BhdGNodGFyZ2V0KGMsIG1ldGhvZCwgZiwgd2lyZV90eXBlKTsKLSAgICBwdXRwdXNoKGMsIGYpOwotICAgIHB1dG9wKGMsIE9QX1NUQVJUU1VCTVNHLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RBUlRTVUJNU0cpKTsKLSAgICBwdXRvcChjLCBPUF9DQUxMLCBzdWJfbSk7Ci0gICAgcHV0b3AoYywgT1BfUE9QKTsKLSAgICBtYXliZXB1dChjLCBPUF9FTkRTVUJNU0csIGgsIGYsIFVQQl9IQU5ETEVSX0VORFNVQk1TRyk7Ci0gICAgaWYgKHdpcmVfdHlwZSA9PSBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCkgewotICAgICAgcHV0b3AoYywgT1BfU0VUREVMSU0pOwotICAgIH0KLSAgfQotfQotCi0vKiBHZW5lcmF0ZXMgYnl0ZWNvZGUgdG8gcGFyc2UgYSBzaW5nbGUgc3RyaW5nIG9yIGxhenkgc3VibWVzc2FnZSBmaWVsZC4gKi8KLXN0YXRpYyB2b2lkIGdlbmVyYXRlX2RlbGltZmllbGQoY29tcGlsZXIgKmMsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaCA9IHVwYl9wYmRlY29kZXJtZXRob2RfZGVzdGhhbmRsZXJzKG1ldGhvZCk7Ci0KLSAgbGFiZWwoYywgTEFCRUxfRklFTEQpOwotICBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfRU5ETVNHKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCwgTEFCRUxfRElTUEFUQ0gpOwotICAgZGlzcGF0Y2h0YXJnZXQoYywgbWV0aG9kLCBmLCBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCk7Ci0gICAgcHV0b3AoYywgT1BfUFVTSFRBR0RFTElNLCAwKTsKLSAgICBwdXRvcChjLCBPUF9TVEFSVFNFUSwgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRKSk7Ci0gICBsYWJlbChjLCBMQUJFTF9MT09QU1RBUlQpOwotICAgIHB1dG9wKGMsIE9QX1BVU0hMRU5ERUxJTSk7Ci0gICAgcHV0b3AoYywgT1BfU1RBUlRTVFIsIGdldHNlbChmLCBVUEJfSEFORExFUl9TVEFSVFNUUikpOwotICAgIC8qIE5lZWQgdG8gZW1pdCBldmVuIGlmIG5vIGhhbmRsZXIgdG8gc2tpcCBwYXN0IHRoZSBzdHJpbmcuICovCi0gICAgcHV0b3AoYywgT1BfU1RSSU5HLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RSSU5HKSk7Ci0gICAgcHV0b3AoYywgT1BfUE9QKTsKLSAgICBtYXliZXB1dChjLCBPUF9FTkRTVFIsIGgsIGYsIFVQQl9IQU5ETEVSX0VORFNUUik7Ci0gICAgcHV0b3AoYywgT1BfU0VUREVMSU0pOwotICAgIHB1dG9wKGMsIE9QX0NIRUNLREVMSU0sIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0Y2hlY2t0YWcoYywgZiwgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQsIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0b3AoYywgT1BfQlJBTkNILCAtTEFCRUxfTE9PUFNUQVJUKTsKLSAgIGxhYmVsKGMsIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0b3AoYywgT1BfUE9QKTsKLSAgICBtYXliZXB1dChjLCBPUF9FTkRTRVEsIGgsIGYsIFVQQl9IQU5ETEVSX0VORFNFUSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfRU5ETVNHKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCwgTEFCRUxfRElTUEFUQ0gpOwotICAgZGlzcGF0Y2h0YXJnZXQoYywgbWV0aG9kLCBmLCBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCk7Ci0gICAgcHV0b3AoYywgT1BfUFVTSExFTkRFTElNKTsKLSAgICBwdXRvcChjLCBPUF9TVEFSVFNUUiwgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU1RSKSk7Ci0gICAgcHV0b3AoYywgT1BfU1RSSU5HLCBnZXRzZWwoZiwgVVBCX0hBTkRMRVJfU1RSSU5HKSk7Ci0gICAgcHV0b3AoYywgT1BfUE9QKTsKLSAgICBtYXliZXB1dChjLCBPUF9FTkRTVFIsIGgsIGYsIFVQQl9IQU5ETEVSX0VORFNUUik7Ci0gICAgcHV0b3AoYywgT1BfU0VUREVMSU0pOwotICB9Ci19Ci0KLS8qIEdlbmVyYXRlcyBieXRlY29kZSB0byBwYXJzZSBhIHNpbmdsZSBwcmltaXRpdmUgZmllbGQuICovCi1zdGF0aWMgdm9pZCBnZW5lcmF0ZV9wcmltaXRpdmVmaWVsZChjb21waWxlciAqYywgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaCA9IHVwYl9wYmRlY29kZXJtZXRob2RfZGVzdGhhbmRsZXJzKG1ldGhvZCk7Ci0gIHVwYl9kZXNjcmlwdG9ydHlwZV90IGRlc2NyaXB0b3JfdHlwZSA9IHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShmKTsKLSAgb3Bjb2RlIHBhcnNlX3R5cGU7Ci0gIHVwYl9zZWxlY3Rvcl90IHNlbDsKLSAgaW50IHdpcmVfdHlwZTsKLQotICBsYWJlbChjLCBMQUJFTF9GSUVMRCk7Ci0KLSAgLyogRnJvbSBhIGRlY29kaW5nIHBlcnNwZWN0aXZlLCBFTlVNIGlzIHRoZSBzYW1lIGFzIElOVDMyLiAqLwotICBpZiAoZGVzY3JpcHRvcl90eXBlID09IFVQQl9ERVNDUklQVE9SX1RZUEVfRU5VTSkKLSAgICBkZXNjcmlwdG9yX3R5cGUgPSBVUEJfREVTQ1JJUFRPUl9UWVBFX0lOVDMyOwotCi0gIHBhcnNlX3R5cGUgPSAob3Bjb2RlKWRlc2NyaXB0b3JfdHlwZTsKLQotICAvKiBUT0RPKGhhYmVybWFuKTogZ2VuZXJhdGUgcGFja2VkIG9yIG5vbi1wYWNrZWQgZmlyc3QgZGVwZW5kaW5nIG9uICJwYWNrZWQiCi0gICAqIHNldHRpbmcgaW4gdGhlIGZpZWxkZGVmLiAgVGhpcyB3aWxsIGZhdm9yIChpbiBzcGVlZCkgd2hpY2hldmVyIHdhcwotICAgKiBzcGVjaWZpZWQuICovCi0KLSAgYXNzZXJ0KChpbnQpcGFyc2VfdHlwZSA+PSAwICYmIHBhcnNlX3R5cGUgPD0gT1BfTUFYKTsKLSAgc2VsID0gZ2V0c2VsKGYsIHVwYl9oYW5kbGVyc19nZXRwcmltaXRpdmVoYW5kbGVydHlwZShmKSk7Ci0gIHdpcmVfdHlwZSA9IHVwYl9wYl9uYXRpdmVfd2lyZV90eXBlc1t1cGJfZmllbGRkZWZfZGVzY3JpcHRvcnR5cGUoZildOwotICBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfRU5ETVNHKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCwgTEFCRUxfRElTUEFUQ0gpOwotICAgZGlzcGF0Y2h0YXJnZXQoYywgbWV0aG9kLCBmLCBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCk7Ci0gICAgcHV0b3AoYywgT1BfUFVTSExFTkRFTElNKTsKLSAgICBwdXRvcChjLCBPUF9TVEFSVFNFUSwgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRKSk7ICAvKiBQYWNrZWQgKi8KLSAgIGxhYmVsKGMsIExBQkVMX0xPT1BTVEFSVCk7Ci0gICAgcHV0b3AoYywgcGFyc2VfdHlwZSwgc2VsKTsKLSAgICBwdXRvcChjLCBPUF9DSEVDS0RFTElNLCBMQUJFTF9MT09QQlJFQUspOwotICAgIHB1dG9wKGMsIE9QX0JSQU5DSCwgLUxBQkVMX0xPT1BTVEFSVCk7Ci0gICBkaXNwYXRjaHRhcmdldChjLCBtZXRob2QsIGYsIHdpcmVfdHlwZSk7Ci0gICAgcHV0b3AoYywgT1BfUFVTSFRBR0RFTElNLCAwKTsKLSAgICBwdXRvcChjLCBPUF9TVEFSVFNFUSwgZ2V0c2VsKGYsIFVQQl9IQU5ETEVSX1NUQVJUU0VRKSk7ICAvKiBOb24tcGFja2VkICovCi0gICBsYWJlbChjLCBMQUJFTF9MT09QU1RBUlQpOwotICAgIHB1dG9wKGMsIHBhcnNlX3R5cGUsIHNlbCk7Ci0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfTE9PUEJSRUFLKTsKLSAgICBwdXRjaGVja3RhZyhjLCBmLCB3aXJlX3R5cGUsIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0b3AoYywgT1BfQlJBTkNILCAtTEFCRUxfTE9PUFNUQVJUKTsKLSAgIGxhYmVsKGMsIExBQkVMX0xPT1BCUkVBSyk7Ci0gICAgcHV0b3AoYywgT1BfUE9QKTsgIC8qIFBhY2tlZCBhbmQgbm9uLXBhY2tlZCBqb2luLiAqLwotICAgIG1heWJlcHV0KGMsIE9QX0VORFNFUSwgaCwgZiwgVVBCX0hBTkRMRVJfRU5EU0VRKTsKLSAgICBwdXRvcChjLCBPUF9TRVRERUxJTSk7ICAvKiBDb3VsZCByZW1vdmUgZm9yIG5vbi1wYWNrZWQgYnkgZHVwIEVORFNFUS4gKi8KLSAgfSBlbHNlIHsKLSAgICBwdXRvcChjLCBPUF9DSEVDS0RFTElNLCBMQUJFTF9FTkRNU0cpOwotICAgIHB1dGNoZWNrdGFnKGMsIGYsIHdpcmVfdHlwZSwgTEFCRUxfRElTUEFUQ0gpOwotICAgZGlzcGF0Y2h0YXJnZXQoYywgbWV0aG9kLCBmLCB3aXJlX3R5cGUpOwotICAgIHB1dG9wKGMsIHBhcnNlX3R5cGUsIHNlbCk7Ci0gIH0KLX0KLQotLyogQWRkcyBieXRlY29kZSBmb3IgcGFyc2luZyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byB0aGUgZ2l2ZW4gZGVjb2RlcnBsYW4sCi0gKiB3aGlsZSBhZGRpbmcgYWxsIGRpc3BhdGNoIHRhcmdldHMgdG8gdGhpcyBtZXNzYWdlJ3MgZGlzcGF0Y2ggdGFibGUuICovCi1zdGF0aWMgdm9pZCBjb21waWxlX21ldGhvZChjb21waWxlciAqYywgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaDsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbWQ7Ci0gIHVpbnQzMl90KiBzdGFydF9wYzsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0gIHVwYl92YWx1ZSB2YWw7Ci0KLSAgYXNzZXJ0KG1ldGhvZCk7Ci0KLSAgLyogQ2xlYXIgYWxsIGVudHJpZXMgaW4gdGhlIGRpc3BhdGNoIHRhYmxlLiAqLwotICB1cGJfaW50dGFibGVfdW5pbml0KCZtZXRob2QtPmRpc3BhdGNoKTsKLSAgdXBiX2ludHRhYmxlX2luaXQoJm1ldGhvZC0+ZGlzcGF0Y2gsIFVQQl9DVFlQRV9VSU5UNjQpOwotCi0gIGggPSB1cGJfcGJkZWNvZGVybWV0aG9kX2Rlc3RoYW5kbGVycyhtZXRob2QpOwotICBtZCA9IHVwYl9oYW5kbGVyc19tc2dkZWYoaCk7Ci0KLSBtZXRob2QtPmNvZGVfYmFzZS5vZnMgPSBwY29mcyhjKTsKLSAgcHV0b3AoYywgT1BfU0VURElTUEFUQ0gsICZtZXRob2QtPmRpc3BhdGNoKTsKLSAgcHV0c2VsKGMsIE9QX1NUQVJUTVNHLCBVUEJfU1RBUlRNU0dfU0VMRUNUT1IsIGgpOwotIGxhYmVsKGMsIExBQkVMX0ZJRUxEKTsKLSAgc3RhcnRfcGMgPSBjLT5wYzsKLSAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmksIG1kKTsKLSAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0gICAgdXBiX2ZpZWxkdHlwZV90IHR5cGUgPSB1cGJfZmllbGRkZWZfdHlwZShmKTsKLQotICAgIGlmICh0eXBlID09IFVQQl9UWVBFX01FU1NBR0UgJiYgIShoYXNsYXp5aGFuZGxlcnMoaCwgZikgJiYgYy0+bGF6eSkpIHsKLSAgICAgIGdlbmVyYXRlX21zZ2ZpZWxkKGMsIGYsIG1ldGhvZCk7Ci0gICAgfSBlbHNlIGlmICh0eXBlID09IFVQQl9UWVBFX1NUUklORyB8fCB0eXBlID09IFVQQl9UWVBFX0JZVEVTIHx8Ci0gICAgICAgICAgICAgICB0eXBlID09IFVQQl9UWVBFX01FU1NBR0UpIHsKLSAgICAgIGdlbmVyYXRlX2RlbGltZmllbGQoYywgZiwgbWV0aG9kKTsKLSAgICB9IGVsc2UgewotICAgICAgZ2VuZXJhdGVfcHJpbWl0aXZlZmllbGQoYywgZiwgbWV0aG9kKTsKLSAgICB9Ci0gIH0KLQotICAvKiBJZiB0aGVyZSB3ZXJlIG5vIGZpZWxkcywgb3IgaWYgbm8gaGFuZGxlcnMgd2VyZSBkZWZpbmVkLCB3ZSBuZWVkIHRvCi0gICAqIGdlbmVyYXRlIGEgbm9uLWVtcHR5IGxvb3AgYm9keSBzbyB0aGF0IHdlIGNhbiBhdCBsZWFzdCBkaXNwYXRjaCBmb3IgdW5rbm93bgotICAgKiBmaWVsZHMgYW5kIGNoZWNrIGZvciB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLiAqLwotICBpZiAoYy0+cGMgPT0gc3RhcnRfcGMpIHsKLSAgICAvKiBDaGVjayBmb3IgZW5kLW9mLW1lc3NhZ2UuICovCi0gICAgcHV0b3AoYywgT1BfQ0hFQ0tERUxJTSwgTEFCRUxfRU5ETVNHKTsKLSAgICAvKiBVbmNvbmRpdGlvbmFsbHkgZGlzcGF0Y2guICovCi0gICAgcHV0b3AoYywgT1BfRElTUEFUQ0gsIDApOwotICB9Ci0KLSAgLyogRm9yIG5vdyB3ZSBqdXN0IGxvb3AgYmFjayB0byB0aGUgbGFzdCBmaWVsZCBvZiB0aGUgbWVzc2FnZSAob3IgaWYgbm9uZSwKLSAgICogdGhlIERJU1BBVENIIG9wY29kZSBmb3IgdGhlIG1lc3NhZ2UpLiAqLwotICBwdXRvcChjLCBPUF9CUkFOQ0gsIC1MQUJFTF9GSUVMRCk7Ci0KLSAgLyogSW5zZXJ0IGJvdGggYSBsYWJlbCBhbmQgYSBkaXNwYXRjaCB0YWJsZSBlbnRyeSBmb3IgdGhpcyBlbmQtb2YtbXNnLiAqLwotIGxhYmVsKGMsIExBQkVMX0VORE1TRyk7Ci0gIHZhbCA9IHVwYl92YWx1ZV91aW50NjQocGNvZnMoYykgLSBtZXRob2QtPmNvZGVfYmFzZS5vZnMpOwotICB1cGJfaW50dGFibGVfaW5zZXJ0KCZtZXRob2QtPmRpc3BhdGNoLCBESVNQQVRDSF9FTkRNU0csIHZhbCk7Ci0KLSAgcHV0c2VsKGMsIE9QX0VORE1TRywgVVBCX0VORE1TR19TRUxFQ1RPUiwgaCk7Ci0gIHB1dG9wKGMsIE9QX1JFVCk7Ci0KLSAgdXBiX2ludHRhYmxlX2NvbXBhY3QoJm1ldGhvZC0+ZGlzcGF0Y2gpOwotfQotCi0vKiBQb3B1bGF0ZSAibWV0aG9kcyIgd2l0aCBuZXcgdXBiX3BiZGVjb2Rlcm1ldGhvZCBvYmplY3RzIHJlYWNoYWJsZSBmcm9tICJoIi4KLSAqIFJldHVybnMgdGhlIG1ldGhvZCBmb3IgdGhlc2UgaGFuZGxlcnMuCi0gKgotICogR2VuZXJhdGVzIGEgbmV3IG1ldGhvZCBmb3IgZXZlcnkgZGVzdGluYXRpb24gaGFuZGxlcnMgcmVhY2hhYmxlIGZyb20gImgiLiAqLwotc3RhdGljIHZvaWQgZmluZF9tZXRob2RzKGNvbXBpbGVyICpjLCBjb25zdCB1cGJfaGFuZGxlcnMgKmgpIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICBjb25zdCB1cGJfbXNnZGVmICptZDsKLQotICBpZiAodXBiX2ludHRhYmxlX2xvb2t1cHB0cigmYy0+Z3JvdXAtPm1ldGhvZHMsIGgsICZ2KSkKLSAgICByZXR1cm47Ci0gIG5ld21ldGhvZChoLCBjLT5ncm91cCk7Ci0KLSAgLyogRmluZCBzdWJtZXRob2RzLiAqLwotICBtZCA9IHVwYl9oYW5kbGVyc19tc2dkZWYoaCk7Ci0gIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBtZCk7Ci0gICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaSkpIHsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmkpOwotICAgIGNvbnN0IHVwYl9oYW5kbGVycyAqc3ViX2g7Ci0gICAgaWYgKHVwYl9maWVsZGRlZl90eXBlKGYpID09IFVQQl9UWVBFX01FU1NBR0UgJiYKLSAgICAgICAgKHN1Yl9oID0gdXBiX2hhbmRsZXJzX2dldHN1YmhhbmRsZXJzKGgsIGYpKSAhPSBOVUxMKSB7Ci0gICAgICAvKiBXZSBvbmx5IGdlbmVyYXRlIGEgZGVjb2RlciBtZXRob2QgZm9yIHN1Ym1lc3NhZ2VzIHdpdGggaGFuZGxlcnMuCi0gICAgICAgKiBPdGhlcnMgd2lsbCBiZSBwYXJzZWQgYXMgdW5rbm93biBmaWVsZHMuICovCi0gICAgICBmaW5kX21ldGhvZHMoYywgc3ViX2gpOwotICAgIH0KLSAgfQotfQotCi0vKiAoUmUtKWNvbXBpbGUgYnl0ZWNvZGUgZm9yIGFsbCBtZXNzYWdlcyBpbiAibXNncy4iCi0gKiBPdmVyd3JpdGVzIGFueSBleGlzdGluZyBieXRlY29kZSBpbiAiYyIuICovCi1zdGF0aWMgdm9pZCBjb21waWxlX21ldGhvZHMoY29tcGlsZXIgKmMpIHsKLSAgdXBiX2ludHRhYmxlX2l0ZXIgaTsKLQotICAvKiBTdGFydCBvdmVyIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ5dGVjb2RlLiAqLwotICBjLT5wYyA9IGMtPmdyb3VwLT5ieXRlY29kZTsKLQotICB1cGJfaW50dGFibGVfYmVnaW4oJmksICZjLT5ncm91cC0+bWV0aG9kcyk7Ci0gIGZvcig7ICF1cGJfaW50dGFibGVfZG9uZSgmaSk7IHVwYl9pbnR0YWJsZV9uZXh0KCZpKSkgewotICAgIHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZCA9IHVwYl92YWx1ZV9nZXRwdHIodXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpKTsKLSAgICBjb21waWxlX21ldGhvZChjLCBtZXRob2QpOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9ieXRlY29kZV9oYW5kbGVycyhtZ3JvdXAgKmcpIHsKLSAgdXBiX2ludHRhYmxlX2l0ZXIgaTsKLSAgdXBiX2ludHRhYmxlX2JlZ2luKCZpLCAmZy0+bWV0aG9kcyk7Ci0gIGZvcig7ICF1cGJfaW50dGFibGVfZG9uZSgmaSk7IHVwYl9pbnR0YWJsZV9uZXh0KCZpKSkgewotICAgIHVwYl9wYmRlY29kZXJtZXRob2QgKm0gPSB1cGJfdmFsdWVfZ2V0cHRyKHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKCZpKSk7Ci0gICAgdXBiX2J5dGVzaGFuZGxlciAqaCA9ICZtLT5pbnB1dF9oYW5kbGVyXzsKLQotICAgIG0tPmNvZGVfYmFzZS5wdHIgPSBnLT5ieXRlY29kZSArIG0tPmNvZGVfYmFzZS5vZnM7Ci0KLSAgICB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0YXJ0c3RyKGgsIHVwYl9wYmRlY29kZXJfc3RhcnRiYywgbS0+Y29kZV9iYXNlLnB0cik7Ci0gICAgdXBiX2J5dGVzaGFuZGxlcl9zZXRzdHJpbmcoaCwgdXBiX3BiZGVjb2Rlcl9kZWNvZGUsIGcpOwotICAgIHVwYl9ieXRlc2hhbmRsZXJfc2V0ZW5kc3RyKGgsIHVwYl9wYmRlY29kZXJfZW5kLCBtKTsKLSAgfQotfQotCi0KLS8qIEpJVCBzZXR1cC4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBVUEJfVVNFX0pJVF9YNjQKLQotc3RhdGljIHZvaWQgc2V0aGFuZGxlcnMobWdyb3VwICpnLCBib29sIGFsbG93aml0KSB7Ci0gIGctPmppdF9jb2RlID0gTlVMTDsKLSAgaWYgKGFsbG93aml0KSB7Ci0gICAgLyogQ29tcGlsZSBieXRlLWNvZGUgaW50byBtYWNoaW5lIGNvZGUsIGNyZWF0ZSBoYW5kbGVycy4gKi8KLSAgICB1cGJfcGJkZWNvZGVyX2ppdChnKTsKLSAgfSBlbHNlIHsKLSAgICBzZXRfYnl0ZWNvZGVfaGFuZGxlcnMoZyk7Ci0gIH0KLX0KLQotI2Vsc2UgIC8qIFVQQl9VU0VfSklUX1g2NCAqLwotCi1zdGF0aWMgdm9pZCBzZXRoYW5kbGVycyhtZ3JvdXAgKmcsIGJvb2wgYWxsb3dqaXQpIHsKLSAgLyogTm8gSklUIGNvbXBpbGVkIGluOyB1c2UgYnl0ZWNvZGUgaGFuZGxlcnMgdW5jb25kaXRpb25hbGx5LiAqLwotICBVUEJfVU5VU0VEKGFsbG93aml0KTsKLSAgc2V0X2J5dGVjb2RlX2hhbmRsZXJzKGcpOwotfQotCi0jZW5kaWYgIC8qIFVQQl9VU0VfSklUX1g2NCAqLwotCi0KLS8qIFRPRE8oaGFiZXJtYW4pOiBhbGxvdyB0aGlzIHRvIGJlIGNvbnN0cnVjdGVkIGZvciBhbiBhcmJpdHJhcnkgc2V0IG9mIGRlc3QKLSAqIGhhbmRsZXJzIGFuZCBvdGhlciBtZ3JvdXBzIChidXQgdmVyaWZ5IHdlIGhhdmUgYSB0cmFuc2l0aXZlIGNsb3N1cmUpLiAqLwotY29uc3QgbWdyb3VwICptZ3JvdXBfbmV3KGNvbnN0IHVwYl9oYW5kbGVycyAqZGVzdCwgYm9vbCBhbGxvd2ppdCwgYm9vbCBsYXp5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm93bmVyKSB7Ci0gIG1ncm91cCAqZzsKLSAgY29tcGlsZXIgKmM7Ci0KLSAgVVBCX1VOVVNFRChhbGxvd2ppdCk7Ci0gIGFzc2VydCh1cGJfaGFuZGxlcnNfaXNmcm96ZW4oZGVzdCkpOwotCi0gIGcgPSBuZXdncm91cChvd25lcik7Ci0gIGMgPSBuZXdjb21waWxlcihnLCBsYXp5KTsKLSAgZmluZF9tZXRob2RzKGMsIGRlc3QpOwotCi0gIC8qIFdlIGNvbXBpbGUgaW4gdHdvIHBhc3NlczoKLSAgICogMS4gYWxsIG1lc3NhZ2VzIGFyZSBhc3NpZ25lZCByZWxhdGl2ZSBvZmZzZXRzIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgICogICAgYnl0ZWNvZGUgKHNhdmVkIGluIG1ldGhvZC0+Y29kZV9iYXNlKS4KLSAgICogMi4gZm9yd2FyZHMgT1BfQ0FMTCBpbnN0cnVjdGlvbnMgY2FuIGJlIGNvcnJlY3RseSBsaW5rZWQgc2luY2UgbWVzc2FnZQotICAgKiAgICBvZmZzZXRzIGhhdmUgYmVlbiBwcmV2aW91c2x5IGFzc2lnbmVkLgotICAgKgotICAgKiBDb3VsZCBhdm9pZCB0aGUgc2Vjb25kIHBhc3MgYnkgbGlua2luZyBPUF9DQUxMIGluc3RydWN0aW9ucyBzb21laG93LiAqLwotICBjb21waWxlX21ldGhvZHMoYyk7Ci0gIGNvbXBpbGVfbWV0aG9kcyhjKTsKLSAgZy0+Ynl0ZWNvZGVfZW5kID0gYy0+cGM7Ci0gIGZyZWVjb21waWxlcihjKTsKLQotI2lmZGVmIFVQQl9EVU1QX0JZVEVDT0RFCi0gIHsKLSAgICBGSUxFICpmID0gZm9wZW4oIi90bXAvdXBiLWJ5dGVjb2RlIiwgInciKTsKLSAgICBhc3NlcnQoZik7Ci0gICAgZHVtcGJjKGctPmJ5dGVjb2RlLCBnLT5ieXRlY29kZV9lbmQsIHN0ZGVycik7Ci0gICAgZHVtcGJjKGctPmJ5dGVjb2RlLCBnLT5ieXRlY29kZV9lbmQsIGYpOwotICAgIGZjbG9zZShmKTsKLQotICAgIGYgPSBmb3BlbigiL3RtcC91cGItYnl0ZWNvZGUuYmluIiwgIndiIik7Ci0gICAgYXNzZXJ0KGYpOwotICAgIGZ3cml0ZShnLT5ieXRlY29kZSwgMSwgZy0+Ynl0ZWNvZGVfZW5kIC0gZy0+Ynl0ZWNvZGUsIGYpOwotICAgIGZjbG9zZShmKTsKLSAgfQotI2VuZGlmCi0KLSAgc2V0aGFuZGxlcnMoZywgYWxsb3dqaXQpOwotICByZXR1cm4gZzsKLX0KLQotCi0vKiB1cGJfcGJjb2RlY2FjaGUgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi12b2lkIHVwYl9wYmNvZGVjYWNoZV9pbml0KHVwYl9wYmNvZGVjYWNoZSAqYykgewotICB1cGJfaW50dGFibGVfaW5pdCgmYy0+Z3JvdXBzLCBVUEJfQ1RZUEVfQ09OU1RQVFIpOwotICBjLT5hbGxvd19qaXRfID0gdHJ1ZTsKLX0KLQotdm9pZCB1cGJfcGJjb2RlY2FjaGVfdW5pbml0KHVwYl9wYmNvZGVjYWNoZSAqYykgewotICB1cGJfaW50dGFibGVfaXRlciBpOwotICB1cGJfaW50dGFibGVfYmVnaW4oJmksICZjLT5ncm91cHMpOwotICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAgICBjb25zdCBtZ3JvdXAgKmdyb3VwID0gdXBiX3ZhbHVlX2dldGNvbnN0cHRyKHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKCZpKSk7Ci0gICAgbWdyb3VwX3VucmVmKGdyb3VwLCBjKTsKLSAgfQotICB1cGJfaW50dGFibGVfdW5pbml0KCZjLT5ncm91cHMpOwotfQotCi1ib29sIHVwYl9wYmNvZGVjYWNoZV9hbGxvd2ppdChjb25zdCB1cGJfcGJjb2RlY2FjaGUgKmMpIHsKLSAgcmV0dXJuIGMtPmFsbG93X2ppdF87Ci19Ci0KLWJvb2wgdXBiX3BiY29kZWNhY2hlX3NldGFsbG93aml0KHVwYl9wYmNvZGVjYWNoZSAqYywgYm9vbCBhbGxvdykgewotICBpZiAodXBiX2ludHRhYmxlX2NvdW50KCZjLT5ncm91cHMpID4gMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIGMtPmFsbG93X2ppdF8gPSBhbGxvdzsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKnVwYl9wYmNvZGVjYWNoZV9nZXRkZWNvZGVybWV0aG9kKAotICAgIHVwYl9wYmNvZGVjYWNoZSAqYywgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKm9wdHMpIHsKLSAgdXBiX3ZhbHVlIHY7Ci0gIGJvb2wgb2s7Ci0KLSAgLyogUmlnaHQgbm93IHdlIGJ1aWxkIGEgbmV3IERlY29kZXJNZXRob2QgZXZlcnkgdGltZS4KLSAgICogVE9ETyhoYWJlcm1hbik6IHByb3Blcmx5IGNhY2hlIG1ldGhvZHMgYnkgdGhlaXIgdHJ1ZSBrZXkuICovCi0gIGNvbnN0IG1ncm91cCAqZyA9IG1ncm91cF9uZXcob3B0cy0+aGFuZGxlcnMsIGMtPmFsbG93X2ppdF8sIG9wdHMtPmxhenksIGMpOwotICB1cGJfaW50dGFibGVfcHVzaCgmYy0+Z3JvdXBzLCB1cGJfdmFsdWVfY29uc3RwdHIoZykpOwotCi0gIG9rID0gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmZy0+bWV0aG9kcywgb3B0cy0+aGFuZGxlcnMsICZ2KTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgcmV0dXJuIHVwYl92YWx1ZV9nZXRwdHIodik7Ci19Ci0KLQotLyogdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCB1cGJfcGJkZWNvZGVybWV0aG9kb3B0c19pbml0KHVwYl9wYmRlY29kZXJtZXRob2RvcHRzICpvcHRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9oYW5kbGVycyAqaCkgewotICBvcHRzLT5oYW5kbGVycyA9IGg7Ci0gIG9wdHMtPmxhenkgPSBmYWxzZTsKLX0KLQotdm9pZCB1cGJfcGJkZWNvZGVybWV0aG9kb3B0c19zZXRsYXp5KHVwYl9wYmRlY29kZXJtZXRob2RvcHRzICpvcHRzLCBib29sIGxhenkpIHsKLSAgb3B0cy0+bGF6eSA9IGxhenk7Ci19Ci0vKgotKiogdXBiOjpEZWNvZGVyIChCeXRlY29kZSBEZWNvZGVyIFZNKQotKioKLSoqIEJ5dGVjb2RlIG11c3QgcHJldmlvdXNseSBoYXZlIGJlZW4gZ2VuZXJhdGVkIHVzaW5nIHRoZSBieXRlY29kZSBjb21waWxlciBpbgotKiogY29tcGlsZV9kZWNvZGVyLmMuICBUaGlzIGRlY29kZXIgdGhlbiB3YWxrcyB0aHJvdWdoIHRoZSBieXRlY29kZSBvcC1ieS1vcCB0bwotKiogcGFyc2UgdGhlIGlucHV0LgotKioKLSoqIERlY29kaW5nIGlzIGZ1bGx5IHJlc3VtYWJsZTsgd2UganVzdCBrZWVwIGEgcG9pbnRlciB0byB0aGUgY3VycmVudCBieXRlY29kZQotKiogaW5zdHJ1Y3Rpb24gYW5kIHJlc3VtZSBmcm9tIHRoZXJlLiAgQSBmYWlyIGFtb3VudCBvZiB0aGUgbG9naWMgaGVyZSBpcyB0bwotKiogaGFuZGxlIHRoZSBmYWN0IHRoYXQgdmFsdWVzIGNhbiBzcGFuIGJ1ZmZlciBzZWFtcyBhbmQgd2UgaGF2ZSB0byBiZSBhYmxlIHRvCi0qKiBiZSBjYXBhYmxlIG9mIHN1c3BlbmRpbmcvcmVzdW1pbmcgZnJvbSBhbnkgYnl0ZSBpbiB0aGUgc3RyZWFtLiAgVGhpcwotKiogc29tZXRpbWVzIHJlcXVpcmVzIGtlZXBpbmcgYSBmZXcgdHJhaWxpbmcgYnl0ZXMgZnJvbSB0aGUgbGFzdCBidWZmZXIgYXJvdW5kCi0qKiBpbiB0aGUgInJlc2lkdWFsIiBidWZmZXIuCi0qLwotCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmZGVmIFVQQl9EVU1QX0JZVEVDT0RFCi0jaW5jbHVkZSA8c3RkaW8uaD4KLSNlbmRpZgotCi0jZGVmaW5lIENIRUNLX1NVU1BFTkQoeCkgaWYgKCEoeCkpIHJldHVybiB1cGJfcGJkZWNvZGVyX3N1c3BlbmQoZCk7Ci0KLS8qIEVycm9yIG1lc3NhZ2VzIHRoYXQgYXJlIHNoYXJlZCBiZXR3ZWVuIHRoZSBieXRlY29kZSBhbmQgSklUIGRlY29kZXJzLiAqLwotY29uc3QgY2hhciAqa1BiRGVjb2RlclN0YWNrT3ZlcmZsb3cgPSAiTmVzdGluZyB0b28gZGVlcC4iOwotY29uc3QgY2hhciAqa1BiRGVjb2RlclN1Ym1lc3NhZ2VUb29Mb25nID0KLSAgICAiU3VibWVzc2FnZSBlbmQgZXh0ZW5kcyBwYXN0IGVuY2xvc2luZyBzdWJtZXNzYWdlLiI7Ci0KLS8qIEVycm9yIG1lc3NhZ2VzIHNoYXJlZCB3aXRoaW4gdGhpcyBmaWxlLiAqLwotc3RhdGljIGNvbnN0IGNoYXIgKmtVbnRlcm1pbmF0ZWRWYXJpbnQgPSAiVW50ZXJtaW5hdGVkIHZhcmludC4iOwotCi0vKiB1cGJfcGJkZWNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgb3Bjb2RlIGhhbHQgPSBPUF9IQUxUOwotCi0vKiBBIGR1bW15IGNoYXJhY3RlciB3ZSBjYW4gcG9pbnQgdG8gd2hlbiB0aGUgdXNlciBwYXNzZXMgdXMgYSBOVUxMIGJ1ZmZlci4KLSAqIFdlIG5lZWQgdGhpcyBiZWNhdXNlIGluIEMgKE5VTEwgKyAwKSBhbmQgKE5VTEwgLSBOVUxMKSBhcmUgdW5kZWZpbmVkCi0gKiBiZWhhdmlvciwgd2hpY2ggd291bGQgaW52YWxpZGF0ZSBmdW5jdGlvbnMgbGlrZSBjdXJidWZsZWZ0KCkuICovCi1zdGF0aWMgY29uc3QgY2hhciBkdW1teV9jaGFyOwotCi0vKiBXaGV0aGVyIGFuIG9wIGNvbnN1bWVzIGFueSBvZiB0aGUgaW5wdXQgYnVmZmVyLiAqLwotc3RhdGljIGJvb2wgY29uc3VtZXNfaW5wdXQob3Bjb2RlIG9wKSB7Ci0gIHN3aXRjaCAob3ApIHsKLSAgICBjYXNlIE9QX1NFVERJU1BBVENIOgotICAgIGNhc2UgT1BfU1RBUlRNU0c6Ci0gICAgY2FzZSBPUF9FTkRNU0c6Ci0gICAgY2FzZSBPUF9TVEFSVFNFUToKLSAgICBjYXNlIE9QX0VORFNFUToKLSAgICBjYXNlIE9QX1NUQVJUU1VCTVNHOgotICAgIGNhc2UgT1BfRU5EU1VCTVNHOgotICAgIGNhc2UgT1BfU1RBUlRTVFI6Ci0gICAgY2FzZSBPUF9FTkRTVFI6Ci0gICAgY2FzZSBPUF9QVVNIVEFHREVMSU06Ci0gICAgY2FzZSBPUF9QT1A6Ci0gICAgY2FzZSBPUF9TRVRERUxJTToKLSAgICBjYXNlIE9QX1NFVEJJR0dST1VQTlVNOgotICAgIGNhc2UgT1BfQ0hFQ0tERUxJTToKLSAgICBjYXNlIE9QX0NBTEw6Ci0gICAgY2FzZSBPUF9SRVQ6Ci0gICAgY2FzZSBPUF9CUkFOQ0g6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLXN0YXRpYyBzaXplX3Qgc3RhY2tzaXplKHVwYl9wYmRlY29kZXIgKmQsIHNpemVfdCBlbnRyaWVzKSB7Ci0gIFVQQl9VTlVTRUQoZCk7Ci0gIHJldHVybiBlbnRyaWVzICogc2l6ZW9mKHVwYl9wYmRlY29kZXJfZnJhbWUpOwotfQotCi1zdGF0aWMgc2l6ZV90IGNhbGxzdGFja3NpemUodXBiX3BiZGVjb2RlciAqZCwgc2l6ZV90IGVudHJpZXMpIHsKLSAgVVBCX1VOVVNFRChkKTsKLQotI2lmZGVmIFVQQl9VU0VfSklUX1g2NAotICBpZiAoZC0+bWV0aG9kXy0+aXNfbmF0aXZlXykgewotICAgIC8qIEVhY2ggbmF0aXZlIHN0YWNrIGZyYW1lIG5lZWRzIHR3byBwb2ludGVycywgcGx1cyB3ZSBuZWVkIGEgZmV3IGZyYW1lcyBmb3IKLSAgICAgKiB0aGUgZW50ZXIvZXhpdCB0cmFtcG9saW5lcy4gKi8KLSAgICBzaXplX3QgcmV0ID0gZW50cmllcyAqIHNpemVvZih2b2lkKikgKiAyOwotICAgIHJldCArPSBzaXplb2Yodm9pZCopICogMTA7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotI2VuZGlmCi0KLSAgcmV0dXJuIGVudHJpZXMgKiBzaXplb2YodWludDMyX3QqKTsKLX0KLQotCi1zdGF0aWMgYm9vbCBpbl9yZXNpZHVhbF9idWYoY29uc3QgdXBiX3BiZGVjb2RlciAqZCwgY29uc3QgY2hhciAqcCk7Ci0KLS8qIEl0J3MgdW5mb3J0dW5hdGUgdGhhdCB3ZSBoYXZlIHRvIG1pY3JvLW1hbmFnZSB0aGUgY29tcGlsZXIgd2l0aAotICogVVBCX0ZPUkNFSU5MSU5FIGFuZCBVUEJfTk9JTkxJTkUsIGVzcGVjaWFsbHkgc2luY2UgdGhpcyB0dW5pbmcgaXMgbmVjZXNzYXJpbHkKLSAqIHNwZWNpZmljIHRvIG9uZSBoYXJkd2FyZSBjb25maWd1cmF0aW9uLiAgQnV0IGVtcGlyaWNhbGx5IG9uIGEgQ29yZSBpNywKLSAqIHBlcmZvcm1hbmNlIGluY3JlYXNlcyAzMC01MCUgd2l0aCB0aGVzZSBhbm5vdGF0aW9ucy4gIEV2ZXJ5IGluc3RhbmNlIHdoZXJlCi0gKiB0aGVzZSBhcHBlYXIsIGdjYyA0LjIuMSBtYWRlIHRoZSB3cm9uZyBkZWNpc2lvbiBhbmQgZGVncmFkZWQgcGVyZm9ybWFuY2UgaW4KLSAqIGJlbmNobWFya3MuICovCi0KLXN0YXRpYyB2b2lkIHNldGVycih1cGJfcGJkZWNvZGVyICpkLCBjb25zdCBjaGFyICptc2cpIHsKLSAgdXBiX3N0YXR1cyBzdGF0dXMgPSBVUEJfU1RBVFVTX0lOSVQ7Ci0gIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZzdGF0dXMsIG1zZyk7Ci0gIHVwYl9lbnZfcmVwb3J0ZXJyb3IoZC0+ZW52LCAmc3RhdHVzKTsKLX0KLQotdm9pZCB1cGJfcGJkZWNvZGVyX3NldGVycih1cGJfcGJkZWNvZGVyICpkLCBjb25zdCBjaGFyICptc2cpIHsKLSAgc2V0ZXJyKGQsIG1zZyk7Ci19Ci0KLQotLyogQnVmZmVyaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV2Ugb3BlcmF0ZSBvbiBvbmUgYnVmZmVyIGF0IGEgdGltZSwgd2hpY2ggaXMgZWl0aGVyIHRoZSB1c2VyJ3MgYnVmZmVyIHBhc3NlZAotICogdG8gb3VyICJkZWNvZGUiIGNhbGxiYWNrIG9yIHNvbWUgcmVzaWR1YWwgYnl0ZXMgZnJvbSB0aGUgcHJldmlvdXMgYnVmZmVyLiAqLwotCi0vKiBIb3cgbWFueSBieXRlcyBjYW4gYmUgc2FmZWx5IHJlYWQgZnJvbSBkLT5wdHIgd2l0aG91dCByZWFkaW5nIHBhc3QgZW5kLW9mLWJ1ZgotICogb3IgcGFzdCB0aGUgY3VycmVudCBkZWxpbWl0ZWQgZW5kLiAqLwotc3RhdGljIHNpemVfdCBjdXJidWZsZWZ0KGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgYXNzZXJ0KGQtPmRhdGFfZW5kID49IGQtPnB0cik7Ci0gIHJldHVybiBkLT5kYXRhX2VuZCAtIGQtPnB0cjsKLX0KLQotLyogSG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZSBiZWZvcmUgZW5kLW9mLWJ1ZmZlci4gKi8KLXN0YXRpYyBzaXplX3QgYnVmbGVmdChjb25zdCB1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHJldHVybiBkLT5lbmQgLSBkLT5wdHI7Ci19Ci0KLS8qIE92ZXJhbGwgc3RyZWFtIG9mZnNldCBvZiBkLT5wdHIuICovCi11aW50NjRfdCBvZmZzZXQoY29uc3QgdXBiX3BiZGVjb2RlciAqZCkgewotICByZXR1cm4gZC0+YnVmc3RhcnRfb2ZzICsgKGQtPnB0ciAtIGQtPmJ1Zik7Ci19Ci0KLS8qIEhvdyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgYmVmb3JlIHRoZSBlbmQgb2YgdGhpcyBkZWxpbWl0ZWQgcmVnaW9uLiAqLwotc2l6ZV90IGRlbGltX3JlbWFpbmluZyhjb25zdCB1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHJldHVybiBkLT50b3AtPmVuZF9vZnMgLSBvZmZzZXQoZCk7Ci19Ci0KLS8qIEFkdmFuY2VzIGQtPnB0ci4gKi8KLXN0YXRpYyB2b2lkIGFkdmFuY2UodXBiX3BiZGVjb2RlciAqZCwgc2l6ZV90IGxlbikgewotICBhc3NlcnQoY3VyYnVmbGVmdChkKSA+PSBsZW4pOwotICBkLT5wdHIgKz0gbGVuOwotfQotCi1zdGF0aWMgYm9vbCBpbl9idWYoY29uc3QgY2hhciAqcCwgY29uc3QgY2hhciAqYnVmLCBjb25zdCBjaGFyICplbmQpIHsKLSAgcmV0dXJuIHAgPj0gYnVmICYmIHAgPD0gZW5kOwotfQotCi1zdGF0aWMgYm9vbCBpbl9yZXNpZHVhbF9idWYoY29uc3QgdXBiX3BiZGVjb2RlciAqZCwgY29uc3QgY2hhciAqcCkgewotICByZXR1cm4gaW5fYnVmKHAsIGQtPnJlc2lkdWFsLCBkLT5yZXNpZHVhbF9lbmQpOwotfQotCi0vKiBDYWxjdWxhdGVzIHRoZSBkZWxpbV9lbmQgdmFsdWUsIHdoaWNoIGlzIGFmZmVjdGVkIGJ5IGJvdGggdGhlIGN1cnJlbnQgYnVmZmVyCi0gKiBhbmQgdGhlIHBhcnNpbmcgc3RhY2ssIHNvIG11c3QgYmUgY2FsbGVkIHdoZW5ldmVyIGVpdGhlciBpcyB1cGRhdGVkLiAqLwotc3RhdGljIHZvaWQgc2V0X2RlbGltX2VuZCh1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHNpemVfdCBkZWxpbV9vZnMgPSBkLT50b3AtPmVuZF9vZnMgLSBkLT5idWZzdGFydF9vZnM7Ci0gIGlmIChkZWxpbV9vZnMgPD0gKHNpemVfdCkoZC0+ZW5kIC0gZC0+YnVmKSkgewotICAgIGQtPmRlbGltX2VuZCA9IGQtPmJ1ZiArIGRlbGltX29mczsKLSAgICBkLT5kYXRhX2VuZCA9IGQtPmRlbGltX2VuZDsKLSAgfSBlbHNlIHsKLSAgICBkLT5kYXRhX2VuZCA9IGQtPmVuZDsKLSAgICBkLT5kZWxpbV9lbmQgPSBOVUxMOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIHN3aXRjaHRvYnVmKHVwYl9wYmRlY29kZXIgKmQsIGNvbnN0IGNoYXIgKmJ1ZiwgY29uc3QgY2hhciAqZW5kKSB7Ci0gIGQtPnB0ciA9IGJ1ZjsKLSAgZC0+YnVmID0gYnVmOwotICBkLT5lbmQgPSBlbmQ7Ci0gIHNldF9kZWxpbV9lbmQoZCk7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkdmFuY2V0b2J1Zih1cGJfcGJkZWNvZGVyICpkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKLSAgYXNzZXJ0KGN1cmJ1ZmxlZnQoZCkgPT0gMCk7Ci0gIGQtPmJ1ZnN0YXJ0X29mcyArPSAoZC0+ZW5kIC0gZC0+YnVmKTsKLSAgc3dpdGNodG9idWYoZCwgYnVmLCBidWYgKyBsZW4pOwotfQotCi1zdGF0aWMgdm9pZCBjaGVja3BvaW50KHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgLyogVGhlIGFzc2VydGlvbiBoZXJlIGlzIGluIHRoZSBpbnRlcmVzdHMgb2YgZWZmaWNpZW5jeSwgbm90IGNvcnJlY3RuZXNzLgotICAgKiBXZSBhcmUgdHJ5aW5nIHRvIGVuc3VyZSB0aGF0IHdlIGRvbid0IGNoZWNrcG9pbnQoKSBtb3JlIG9mdGVuIHRoYW4KLSAgICogbmVjZXNzYXJ5LiAqLwotICBhc3NlcnQoZC0+Y2hlY2twb2ludCAhPSBkLT5wdHIpOwotICBkLT5jaGVja3BvaW50ID0gZC0+cHRyOwotfQotCi0vKiBTa2lwcyAiYnl0ZXMiIGJ5dGVzIGluIHRoZSBzdHJlYW0sIHdoaWNoIG1heSBiZSBtb3JlIHRoYW4gYXZhaWxhYmxlLiAgSWYgd2UKLSAqIHNraXAgbW9yZSBieXRlcyB0aGFuIGFyZSBhdmFpbGFibGUsIHdlIHJldHVybiBhIGxvbmcgcmVhZCBjb3VudCB0byB0aGUgY2FsbGVyCi0gKiBpbmRpY2F0aW5nIGhvdyBtYW55IGJ5dGVzIGNhbiBiZSBza2lwcGVkIG92ZXIgYmVmb3JlIHBhc3NpbmcgYWN0dWFsIGRhdGEKLSAqIGFnYWluLiAgU2tpcHBlZCBieXRlcyBjYW4gcGFzcyBhIE5VTEwgYnVmZmVyIGFuZCB0aGUgZGVjb2RlciBndWFyYW50ZWVzIHRoZXkKLSAqIHdvbid0IGFjdHVhbGx5IGJlIHJlYWQuCi0gKi8KLXN0YXRpYyBpbnQzMl90IHNraXAodXBiX3BiZGVjb2RlciAqZCwgc2l6ZV90IGJ5dGVzKSB7Ci0gIGFzc2VydCghaW5fcmVzaWR1YWxfYnVmKGQsIGQtPnB0cikgfHwgZC0+c2l6ZV9wYXJhbSA9PSAwKTsKLSAgYXNzZXJ0KGQtPnNraXAgPT0gMCk7Ci0gIGlmIChieXRlcyA+IGRlbGltX3JlbWFpbmluZyhkKSkgewotICAgIHNldGVycihkLCAiU2tpcHBlZCB2YWx1ZSBleHRlbmRlZCBiZXlvbmQgZW5jbG9zaW5nIHN1Ym1lc3NhZ2UuIik7Ci0gICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgfSBlbHNlIGlmIChidWZsZWZ0KGQpID49IGJ5dGVzKSB7Ci0gICAgLyogU2tpcHBlZCBkYXRhIGlzIGFsbCBpbiBjdXJyZW50IGJ1ZmZlciwgYW5kIG1vcmUgaXMgc3RpbGwgYXZhaWxhYmxlLiAqLwotICAgIGFkdmFuY2UoZCwgYnl0ZXMpOwotICAgIGQtPnNraXAgPSAwOwotICAgIHJldHVybiBERUNPREVfT0s7Ci0gIH0gZWxzZSB7Ci0gICAgLyogU2tpcHBlZCBkYXRhIGV4dGVuZHMgYmV5b25kIGN1cnJlbnRseSBhdmFpbGFibGUgYnVmZmVycy4gKi8KLSAgICBkLT5wYyA9IGQtPmxhc3Q7Ci0gICAgZC0+c2tpcCA9IGJ5dGVzIC0gY3VyYnVmbGVmdChkKTsKLSAgICBkLT5idWZzdGFydF9vZnMgKz0gKGQtPmVuZCAtIGQtPmJ1Zik7Ci0gICAgZC0+cmVzaWR1YWxfZW5kID0gZC0+cmVzaWR1YWw7Ci0gICAgc3dpdGNodG9idWYoZCwgZC0+cmVzaWR1YWwsIGQtPnJlc2lkdWFsX2VuZCk7Ci0gICAgcmV0dXJuIGQtPnNpemVfcGFyYW0gKyBkLT5za2lwOwotICB9Ci19Ci0KLQotLyogUmVzdW1lcyB0aGUgZGVjb2RlciBmcm9tIGFuIGluaXRpYWwgc3RhdGUgb3IgZnJvbSBhIHByZXZpb3VzIHN1c3BlbmQuICovCi1pbnQzMl90IHVwYl9wYmRlY29kZXJfcmVzdW1lKHVwYl9wYmRlY29kZXIgKmQsIHZvaWQgKnAsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUsIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICBVUEJfVU5VU0VEKHApOyAgLyogVXNlbGVzczsganVzdCBmb3IgdGhlIGJlbmVmaXQgb2YgdGhlIEpJVC4gKi8KLQotICAvKiBkLT5za2lwIGFuZCBkLT5yZXNpZHVhbF9lbmQgY291bGQgcHJvYmFibHkgZWxlZ2FudGx5IGJlIHJlcHJlc2VudGVkCi0gICAqIGFzIGEgc2luZ2xlIHZhcmlhYmxlLCB0byBtb3JlIGVhc2lseSByZXByZXNlbnQgdGhpcyBpbnZhcmlhbnQuICovCi0gIGFzc2VydCghKGQtPnNraXAgJiYgZC0+cmVzaWR1YWxfZW5kID4gZC0+cmVzaWR1YWwpKTsKLQotICAvKiBXZSBuZWVkIHRvIHJlbWVtYmVyIHRoZSBvcmlnaW5hbCBzaXplX3BhcmFtLCBzbyB0aGF0IHRoZSB2YWx1ZSB3ZSByZXR1cm4KLSAgICogaXMgcmVsYXRpdmUgdG8gaXQsIGV2ZW4gaWYgd2UgZG8gc29tZSBza2lwcGluZyBmaXJzdC4gKi8KLSAgZC0+c2l6ZV9wYXJhbSA9IHNpemU7Ci0gIGQtPmhhbmRsZSA9IGhhbmRsZTsKLQotICAvKiBIYXZlIHRvIGhhbmRsZSB0aGlzIGNhc2Ugc3BlY2lhbGx5IChpZS4gbm90IHdpdGggc2tpcCgpKSBiZWNhdXNlIHRoZSB1c2VyCi0gICAqIGlzIGFsbG93ZWQgdG8gcGFzcyBhIE5VTEwgYnVmZmVyIGhlcmUsIHdoaWNoIHdvbid0IGFsbG93IHVzIHRvIHNhZmVseQotICAgKiBjYWxjdWxhdGUgYSBkLT5lbmQgb3IgdXNlIG91ciBub3JtYWwgZnVuY3Rpb25zIGxpa2UgY3VyYnVmbGVmdCgpLiAqLwotICBpZiAoZC0+c2tpcCAmJiBkLT5za2lwID49IHNpemUpIHsKLSAgICBkLT5za2lwIC09IHNpemU7Ci0gICAgZC0+YnVmc3RhcnRfb2ZzICs9IHNpemU7Ci0gICAgYnVmID0gJmR1bW15X2NoYXI7Ci0gICAgc2l6ZSA9IDA7Ci0KLSAgICAvKiBXZSBjYW4ndCBqdXN0IHJldHVybiBub3csIGJlY2F1c2Ugd2UgbWlnaHQgbmVlZCB0byBleGVjdXRlIHNvbWUgb3BzCi0gICAgICogbGlrZSBDSEVDS0RFTElNLCB3aGljaCBjb3VsZCBjYWxsIHNvbWUgY2FsbGJhY2tzIGFuZCBwb3AgdGhlIHN0YWNrLiAqLwotICB9Ci0KLSAgLyogV2UgbmVlZCB0byBwcmV0ZW5kIHRoYXQgdGhpcyB3YXMgdGhlIGFjdHVhbCBidWZmZXIgcGFyYW0sIHNpbmNlIHNvbWUgb2YgdGhlCi0gICAqIGNhbGN1bGF0aW9ucyBhc3N1bWUgdGhhdCBkLT5wdHIvZC0+YnVmIGlzIHJlbGF0aXZlIHRvIHRoaXMuICovCi0gIGQtPmJ1Zl9wYXJhbSA9IGJ1ZjsKLQotICBpZiAoIWJ1ZikgewotICAgIC8qIE5VTEwgYnVmIGlzIG9rIGlmIGl0cyBlbnRpcmUgc3BhbiBpcyBjb3ZlcmVkIGJ5IHRoZSAic2tpcCIgYWJvdmUsIGJ1dAotICAgICAqIGJ5IHRoaXMgcG9pbnQgd2Uga25vdyB0aGF0ICJza2lwIiBkb2Vzbid0IGNvdmVyIHRoZSBidWZmZXIuICovCi0gICAgc2V0ZXJyKGQsICJQYXNzZWQgTlVMTCBidWZmZXIgb3ZlciBub24tc2tpcHBhYmxlIHJlZ2lvbi4iKTsKLSAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICB9Ci0KLSAgaWYgKGQtPnJlc2lkdWFsX2VuZCA+IGQtPnJlc2lkdWFsKSB7Ci0gICAgLyogV2UgaGF2ZSByZXNpZHVhbCBieXRlcyBmcm9tIHRoZSBsYXN0IGJ1ZmZlci4gKi8KLSAgICBhc3NlcnQoZC0+cHRyID09IGQtPnJlc2lkdWFsKTsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2h0b2J1ZihkLCBidWYsIGJ1ZiArIHNpemUpOwotICB9Ci0KLSAgZC0+Y2hlY2twb2ludCA9IGQtPnB0cjsKLQotICAvKiBIYW5kbGUgc2tpcHMgdGhhdCBkb24ndCBjb3ZlciB0aGUgd2hvbGUgYnVmZmVyIChhcyBhYm92ZSkuICovCi0gIGlmIChkLT5za2lwKSB7Ci0gICAgc2l6ZV90IHNraXBfYnl0ZXMgPSBkLT5za2lwOwotICAgIGQtPnNraXAgPSAwOwotICAgIENIRUNLX1JFVFVSTihza2lwKGQsIHNraXBfYnl0ZXMpKTsKLSAgICBjaGVja3BvaW50KGQpOwotICB9Ci0KLSAgLyogSWYgd2UncmUgaW5zaWRlIGFuIHVua25vd24gZ3JvdXAsIGNvbnRpbnVlIHRvIHBhcnNlIHVua25vd24gdmFsdWVzLiAqLwotICBpZiAoZC0+dG9wLT5ncm91cG51bSA8IDApIHsKLSAgICBDSEVDS19SRVRVUk4odXBiX3BiZGVjb2Rlcl9za2lwdW5rbm93bihkLCAtMSwgMCkpOwotICAgIGNoZWNrcG9pbnQoZCk7Ci0gIH0KLQotICByZXR1cm4gREVDT0RFX09LOwotfQotCi0vKiBTdXNwZW5kcyB0aGUgZGVjb2RlciBhdCB0aGUgbGFzdCBjaGVja3BvaW50LCB3aXRob3V0IHNhdmluZyBhbnkgcmVzaWR1YWwKLSAqIGJ5dGVzLiAgSWYgdGhlcmUgYXJlIGFueSB1bmNvbnN1bWVkIGJ5dGVzLCByZXR1cm5zIGEgc2hvcnQgYnl0ZSBjb3VudC4gKi8KLXNpemVfdCB1cGJfcGJkZWNvZGVyX3N1c3BlbmQodXBiX3BiZGVjb2RlciAqZCkgewotICBkLT5wYyA9IGQtPmxhc3Q7Ci0gIGlmIChkLT5jaGVja3BvaW50ID09IGQtPnJlc2lkdWFsKSB7Ci0gICAgLyogQ2hlY2twb2ludCB3YXMgaW4gcmVzaWR1YWwgYnVmOyBubyB1c2VyIGJ5dGVzIHdlcmUgY29uc3VtZWQuICovCi0gICAgZC0+cHRyID0gZC0+cmVzaWR1YWw7Ci0gICAgcmV0dXJuIDA7Ci0gIH0gZWxzZSB7Ci0gICAgc2l6ZV90IHJldCA9IGQtPnNpemVfcGFyYW0gLSAoZC0+ZW5kIC0gZC0+Y2hlY2twb2ludCk7Ci0gICAgYXNzZXJ0KCFpbl9yZXNpZHVhbF9idWYoZCwgZC0+Y2hlY2twb2ludCkpOwotICAgIGFzc2VydChkLT5idWYgPT0gZC0+YnVmX3BhcmFtIHx8IGQtPmJ1ZiA9PSAmZHVtbXlfY2hhcik7Ci0KLSAgICBkLT5idWZzdGFydF9vZnMgKz0gKGQtPmNoZWNrcG9pbnQgLSBkLT5idWYpOwotICAgIGQtPnJlc2lkdWFsX2VuZCA9IGQtPnJlc2lkdWFsOwotICAgIHN3aXRjaHRvYnVmKGQsIGQtPnJlc2lkdWFsLCBkLT5yZXNpZHVhbF9lbmQpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLX0KLQotLyogU3VzcGVuZHMgdGhlIGRlY29kZXIgYXQgdGhlIGxhc3QgY2hlY2twb2ludCwgYW5kIHNhdmVzIGFueSB1bmNvbnN1bWVkCi0gKiBieXRlcyBpbiBvdXIgcmVzaWR1YWwgYnVmZmVyLiAgVGhpcyBpcyBuZWNlc3NhcnkgaWYgd2UgbmVlZCBtb3JlIHVzZXIKLSAqIGJ5dGVzIHRvIGZvcm0gYSBjb21wbGV0ZSB2YWx1ZSwgd2hpY2ggbWlnaHQgbm90IGJlIGNvbnRpZ3VvdXMgaW4gdGhlCi0gKiB1c2VyJ3MgYnVmZmVycy4gIEFsd2F5cyBjb25zdW1lcyBhbGwgdXNlciBieXRlcy4gKi8KLXN0YXRpYyBzaXplX3Qgc3VzcGVuZF9zYXZlKHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgLyogV2UgaGl0IGVuZC1vZi1idWZmZXIgYmVmb3JlIHdlIGNvdWxkIHBhcnNlIGEgZnVsbCB2YWx1ZS4KLSAgICogU2F2ZSBhbnkgdW5jb25zdW1lZCBieXRlcyAoaWYgYW55KSB0byB0aGUgcmVzaWR1YWwgYnVmZmVyLiAqLwotICBkLT5wYyA9IGQtPmxhc3Q7Ci0KLSAgaWYgKGQtPmNoZWNrcG9pbnQgPT0gZC0+cmVzaWR1YWwpIHsKLSAgICAvKiBDaGVja3BvaW50IHdhcyBpbiByZXNpZHVhbCBidWY7IGFwcGVuZCB1c2VyIGJ5dGUocykgdG8gcmVzaWR1YWwgYnVmLiAqLwotICAgIGFzc2VydCgoZC0+cmVzaWR1YWxfZW5kIC0gZC0+cmVzaWR1YWwpICsgZC0+c2l6ZV9wYXJhbSA8PQotICAgICAgICAgICBzaXplb2YoZC0+cmVzaWR1YWwpKTsKLSAgICBpZiAoIWluX3Jlc2lkdWFsX2J1ZihkLCBkLT5wdHIpKSB7Ci0gICAgICBkLT5idWZzdGFydF9vZnMgLT0gKGQtPnJlc2lkdWFsX2VuZCAtIGQtPnJlc2lkdWFsKTsKLSAgICB9Ci0gICAgbWVtY3B5KGQtPnJlc2lkdWFsX2VuZCwgZC0+YnVmX3BhcmFtLCBkLT5zaXplX3BhcmFtKTsKLSAgICBkLT5yZXNpZHVhbF9lbmQgKz0gZC0+c2l6ZV9wYXJhbTsKLSAgfSBlbHNlIHsKLSAgICAvKiBDaGVja3BvaW50IHdhcyBpbiB1c2VyIGJ1Zjsgb2xkIHJlc2lkdWFsIGJ5dGVzIG5vdCBuZWVkZWQuICovCi0gICAgc2l6ZV90IHNhdmU7Ci0gICAgYXNzZXJ0KCFpbl9yZXNpZHVhbF9idWYoZCwgZC0+Y2hlY2twb2ludCkpOwotCi0gICAgZC0+cHRyID0gZC0+Y2hlY2twb2ludDsKLSAgICBzYXZlID0gY3VyYnVmbGVmdChkKTsKLSAgICBhc3NlcnQoc2F2ZSA8PSBzaXplb2YoZC0+cmVzaWR1YWwpKTsKLSAgICBtZW1jcHkoZC0+cmVzaWR1YWwsIGQtPnB0ciwgc2F2ZSk7Ci0gICAgZC0+cmVzaWR1YWxfZW5kID0gZC0+cmVzaWR1YWwgKyBzYXZlOwotICAgIGQtPmJ1ZnN0YXJ0X29mcyA9IG9mZnNldChkKTsKLSAgfQotCi0gIHN3aXRjaHRvYnVmKGQsIGQtPnJlc2lkdWFsLCBkLT5yZXNpZHVhbF9lbmQpOwotICByZXR1cm4gZC0+c2l6ZV9wYXJhbTsKLX0KLQotLyogQ29waWVzIHRoZSBuZXh0ICJieXRlcyIgYnl0ZXMgaW50byAiYnVmIiBhbmQgYWR2YW5jZXMgdGhlIHN0cmVhbS4KLSAqIFJlcXVpcmVzIHRoYXQgdGhpcyBtYW55IGJ5dGVzIGFyZSBhdmFpbGFibGUgaW4gdGhlIGN1cnJlbnQgYnVmZmVyLiAqLwotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyB2b2lkIGNvbnN1bWVieXRlcyh1cGJfcGJkZWNvZGVyICpkLCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBieXRlcykgewotICBhc3NlcnQoYnl0ZXMgPD0gY3VyYnVmbGVmdChkKSk7Ci0gIG1lbWNweShidWYsIGQtPnB0ciwgYnl0ZXMpOwotICBhZHZhbmNlKGQsIGJ5dGVzKTsKLX0KLQotLyogU2xvdyBwYXRoIGZvciBnZXR0aW5nIHRoZSBuZXh0ICJieXRlcyIgYnl0ZXMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGV5IGFyZQotICogYXZhaWxhYmxlIGluIHRoZSBjdXJyZW50IGJ1ZmZlciBvciBub3QuICBSZXR1cm5zIGEgc3RhdHVzIGNvZGUgYXMgZGVzY3JpYmVkCi0gKiBpbiBkZWNvZGVyLmludC5oLiAqLwotVVBCX05PSU5MSU5FIHN0YXRpYyBpbnQzMl90IGdldGJ5dGVzX3Nsb3codXBiX3BiZGVjb2RlciAqZCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIGNvbnN0IHNpemVfdCBhdmFpbCA9IGN1cmJ1ZmxlZnQoZCk7Ci0gIGNvbnN1bWVieXRlcyhkLCBidWYsIGF2YWlsKTsKLSAgYnl0ZXMgLT0gYXZhaWw7Ci0gIGFzc2VydChieXRlcyA+IDApOwotICBpZiAoaW5fcmVzaWR1YWxfYnVmKGQsIGQtPnB0cikpIHsKLSAgICBhZHZhbmNldG9idWYoZCwgZC0+YnVmX3BhcmFtLCBkLT5zaXplX3BhcmFtKTsKLSAgfQotICBpZiAoY3VyYnVmbGVmdChkKSA+PSBieXRlcykgewotICAgIGNvbnN1bWVieXRlcyhkLCAoY2hhciAqKWJ1ZiArIGF2YWlsLCBieXRlcyk7Ci0gICAgcmV0dXJuIERFQ09ERV9PSzsKLSAgfSBlbHNlIGlmIChkLT5kYXRhX2VuZCA9PSBkLT5kZWxpbV9lbmQpIHsKLSAgICBzZXRlcnIoZCwgIlN1Ym1lc3NhZ2UgZW5kZWQgaW4gdGhlIG1pZGRsZSBvZiBhIHZhbHVlIG9yIGdyb3VwIik7Ci0gICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3VzcGVuZF9zYXZlKGQpOwotICB9Ci19Ci0KLS8qIEdldHMgdGhlIG5leHQgImJ5dGVzIiBieXRlcywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZXkgYXJlIGF2YWlsYWJsZSBpbiB0aGUKLSAqIGN1cnJlbnQgYnVmZmVyIG9yIG5vdC4gIFJldHVybnMgYSBzdGF0dXMgY29kZSBhcyBkZXNjcmliZWQgaW4gZGVjb2Rlci5pbnQuaC4KLSAqLwotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyBpbnQzMl90IGdldGJ5dGVzKHVwYl9wYmRlY29kZXIgKmQsIHZvaWQgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgYnl0ZXMpIHsKLSAgaWYgKGN1cmJ1ZmxlZnQoZCkgPj0gYnl0ZXMpIHsKLSAgICAvKiBCdWZmZXIgaGFzIGVub3VnaCBkYXRhIHRvIHNhdGlzZnkuICovCi0gICAgY29uc3VtZWJ5dGVzKGQsIGJ1ZiwgYnl0ZXMpOwotICAgIHJldHVybiBERUNPREVfT0s7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGdldGJ5dGVzX3Nsb3coZCwgYnVmLCBieXRlcyk7Ci0gIH0KLX0KLQotVVBCX05PSU5MSU5FIHN0YXRpYyBzaXplX3QgcGVla2J5dGVzX3Nsb3codXBiX3BiZGVjb2RlciAqZCwgdm9pZCAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIHNpemVfdCByZXQgPSBjdXJidWZsZWZ0KGQpOwotICBtZW1jcHkoYnVmLCBkLT5wdHIsIHJldCk7Ci0gIGlmIChpbl9yZXNpZHVhbF9idWYoZCwgZC0+cHRyKSkgewotICAgIHNpemVfdCBjb3B5ID0gVVBCX01JTihieXRlcyAtIHJldCwgZC0+c2l6ZV9wYXJhbSk7Ci0gICAgbWVtY3B5KChjaGFyICopYnVmICsgcmV0LCBkLT5idWZfcGFyYW0sIGNvcHkpOwotICAgIHJldCArPSBjb3B5OwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLVVQQl9GT1JDRUlOTElORSBzdGF0aWMgc2l6ZV90IHBlZWtieXRlcyh1cGJfcGJkZWNvZGVyICpkLCB2b2lkICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGJ5dGVzKSB7Ci0gIGlmIChjdXJidWZsZWZ0KGQpID49IGJ5dGVzKSB7Ci0gICAgbWVtY3B5KGJ1ZiwgZC0+cHRyLCBieXRlcyk7Ci0gICAgcmV0dXJuIGJ5dGVzOwotICB9IGVsc2UgewotICAgIHJldHVybiBwZWVrYnl0ZXNfc2xvdyhkLCBidWYsIGJ5dGVzKTsKLSAgfQotfQotCi0KLS8qIERlY29kaW5nIG9mIHdpcmUgdHlwZXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFNsb3cgcGF0aCBmb3IgZGVjb2RpbmcgYSB2YXJpbnQgZnJvbSB0aGUgY3VycmVudCBidWZmZXIgcG9zaXRpb24uCi0gKiBSZXR1cm5zIGEgc3RhdHVzIGNvZGUgYXMgZGVzY3JpYmVkIGluIGRlY29kZXIuaW50LmguICovCi1VUEJfTk9JTkxJTkUgaW50MzJfdCB1cGJfcGJkZWNvZGVyX2RlY29kZV92YXJpbnRfc2xvdyh1cGJfcGJkZWNvZGVyICpkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgKnU2NCkgewotICB1aW50OF90IGJ5dGUgPSAweDgwOwotICBpbnQgYml0cG9zOwotICAqdTY0ID0gMDsKLSAgZm9yKGJpdHBvcyA9IDA7IGJpdHBvcyA8IDcwICYmIChieXRlICYgMHg4MCk7IGJpdHBvcyArPSA3KSB7Ci0gICAgQ0hFQ0tfUkVUVVJOKGdldGJ5dGVzKGQsICZieXRlLCAxKSk7Ci0gICAgKnU2NCB8PSAodWludDY0X3QpKGJ5dGUgJiAweDdGKSA8PCBiaXRwb3M7Ci0gIH0KLSAgaWYoYml0cG9zID09IDcwICYmIChieXRlICYgMHg4MCkpIHsKLSAgICBzZXRlcnIoZCwga1VudGVybWluYXRlZFZhcmludCk7Ci0gICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgfQotICByZXR1cm4gREVDT0RFX09LOwotfQotCi0vKiBEZWNvZGVzIGEgdmFyaW50IGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgotICogUmV0dXJucyBhIHN0YXR1cyBjb2RlIGFzIGRlc2NyaWJlZCBpbiBkZWNvZGVyLmludC5oLiAqLwotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyBpbnQzMl90IGRlY29kZV92YXJpbnQodXBiX3BiZGVjb2RlciAqZCwgdWludDY0X3QgKnU2NCkgewotICBpZiAoY3VyYnVmbGVmdChkKSA+IDAgJiYgISgqZC0+cHRyICYgMHg4MCkpIHsKLSAgICAqdTY0ID0gKmQtPnB0cjsKLSAgICBhZHZhbmNlKGQsIDEpOwotICAgIHJldHVybiBERUNPREVfT0s7Ci0gIH0gZWxzZSBpZiAoY3VyYnVmbGVmdChkKSA+PSAxMCkgewotICAgIC8qIEZhc3QgY2FzZS4gKi8KLSAgICB1cGJfZGVjb2RlcmV0IHIgPSB1cGJfdmRlY29kZV9mYXN0KGQtPnB0cik7Ci0gICAgaWYgKHIucCA9PSBOVUxMKSB7Ci0gICAgICBzZXRlcnIoZCwga1VudGVybWluYXRlZFZhcmludCk7Ci0gICAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICAgIH0KLSAgICBhZHZhbmNlKGQsIHIucCAtIGQtPnB0cik7Ci0gICAgKnU2NCA9IHIudmFsOwotICAgIHJldHVybiBERUNPREVfT0s7Ci0gIH0gZWxzZSB7Ci0gICAgLyogU2xvdyBjYXNlIC0tIHZhcmludCBzcGFucyBidWZmZXIgc2VhbS4gKi8KLSAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9kZWNvZGVfdmFyaW50X3Nsb3coZCwgdTY0KTsKLSAgfQotfQotCi0vKiBEZWNvZGVzIGEgMzItYml0IHZhcmludCBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4KLSAqIFJldHVybnMgYSBzdGF0dXMgY29kZSBhcyBkZXNjcmliZWQgaW4gZGVjb2Rlci5pbnQuaC4gKi8KLVVQQl9GT1JDRUlOTElORSBzdGF0aWMgaW50MzJfdCBkZWNvZGVfdjMyKHVwYl9wYmRlY29kZXIgKmQsIHVpbnQzMl90ICp1MzIpIHsKLSAgdWludDY0X3QgdTY0OwotICBpbnQzMl90IHJldCA9IGRlY29kZV92YXJpbnQoZCwgJnU2NCk7Ci0gIGlmIChyZXQgPj0gMCkgcmV0dXJuIHJldDsKLSAgaWYgKHU2NCA+IFVJTlQzMl9NQVgpIHsKLSAgICBzZXRlcnIoZCwgIlVudGVybWluYXRlZCAzMi1iaXQgdmFyaW50Iik7Ci0gICAgLyogVE9ETyhoYWJlcm1hbikgZ3VhcmFudGVlIHRoYXQgdGhpcyBmdW5jdGlvbiByZXR1cm4gaXMgPj0gMCBzb21laG93LAotICAgICAqIHNvIHdlIGtub3cgdGhpcyBwYXRoIHdpbGwgYWx3YXlzIGJlIHRyZWF0ZWQgYXMgZXJyb3IgYnkgb3VyIGNhbGxlci4KLSAgICAgKiBSaWdodCBub3cgdGhlIHNpemVfdCAtPiBpbnQzMl90IGNhbiBvdmVyZmxvdyBhbmQgcHJvZHVjZSBuZWdhdGl2ZSB2YWx1ZXMuCi0gICAgICovCi0gICAgKnUzMiA9IDA7Ci0gICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgfQotICAqdTMyID0gdTY0OwotICByZXR1cm4gREVDT0RFX09LOwotfQotCi0vKiBEZWNvZGVzIGEgZml4ZWQzMiBmcm9tIHRoZSBjdXJyZW50IGJ1ZmZlciBwb3NpdGlvbi4KLSAqIFJldHVybnMgYSBzdGF0dXMgY29kZSBhcyBkZXNjcmliZWQgaW4gZGVjb2Rlci5pbnQuaC4KLSAqIFRPRE86IHByb3BlciBieXRlIHN3YXBwaW5nIGZvciBiaWctZW5kaWFuIG1hY2hpbmVzLiAqLwotVVBCX0ZPUkNFSU5MSU5FIHN0YXRpYyBpbnQzMl90IGRlY29kZV9maXhlZDMyKHVwYl9wYmRlY29kZXIgKmQsIHVpbnQzMl90ICp1MzIpIHsKLSAgcmV0dXJuIGdldGJ5dGVzKGQsIHUzMiwgNCk7Ci19Ci0KLS8qIERlY29kZXMgYSBmaXhlZDY0IGZyb20gdGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgotICogUmV0dXJucyBhIHN0YXR1cyBjb2RlIGFzIGRlc2NyaWJlZCBpbiBkZWNvZGVyLmludC5oLgotICogVE9ETzogcHJvcGVyIGJ5dGUgc3dhcHBpbmcgZm9yIGJpZy1lbmRpYW4gbWFjaGluZXMuICovCi1VUEJfRk9SQ0VJTkxJTkUgc3RhdGljIGludDMyX3QgZGVjb2RlX2ZpeGVkNjQodXBiX3BiZGVjb2RlciAqZCwgdWludDY0X3QgKnU2NCkgewotICByZXR1cm4gZ2V0Ynl0ZXMoZCwgdTY0LCA4KTsKLX0KLQotLyogTm9uLXN0YXRpYyB2ZXJzaW9ucyBvZiB0aGUgYWJvdmUgZnVuY3Rpb25zLgotICogVGhlc2UgYXJlIGNhbGxlZCBieSB0aGUgSklUIGZvciBmYWxsYmFjayBwYXRocy4gKi8KLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9kZWNvZGVfZjMyKHVwYl9wYmRlY29kZXIgKmQsIHVpbnQzMl90ICp1MzIpIHsKLSAgcmV0dXJuIGRlY29kZV9maXhlZDMyKGQsIHUzMik7Ci19Ci0KLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9kZWNvZGVfZjY0KHVwYl9wYmRlY29kZXIgKmQsIHVpbnQ2NF90ICp1NjQpIHsKLSAgcmV0dXJuIGRlY29kZV9maXhlZDY0KGQsIHU2NCk7Ci19Ci0KLXN0YXRpYyBkb3VibGUgYXNfZG91YmxlKHVpbnQ2NF90IG4pIHsgZG91YmxlIGQ7IG1lbWNweSgmZCwgJm4sIDgpOyByZXR1cm4gZDsgfQotc3RhdGljIGZsb2F0ICBhc19mbG9hdCh1aW50MzJfdCBuKSAgeyBmbG9hdCAgZjsgbWVtY3B5KCZmLCAmbiwgNCk7IHJldHVybiBmOyB9Ci0KLS8qIFB1c2hlcyBhIGZyYW1lIG9udG8gdGhlIGRlY29kZXIgc3RhY2suICovCi1zdGF0aWMgYm9vbCBkZWNvZGVyX3B1c2godXBiX3BiZGVjb2RlciAqZCwgdWludDY0X3QgZW5kKSB7Ci0gIHVwYl9wYmRlY29kZXJfZnJhbWUgKmZyID0gZC0+dG9wOwotCi0gIGlmIChlbmQgPiBmci0+ZW5kX29mcykgewotICAgIHNldGVycihkLCBrUGJEZWNvZGVyU3VibWVzc2FnZVRvb0xvbmcpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIGlmIChmciA9PSBkLT5saW1pdCkgewotICAgIHNldGVycihkLCBrUGJEZWNvZGVyU3RhY2tPdmVyZmxvdyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZnIrKzsKLSAgZnItPmVuZF9vZnMgPSBlbmQ7Ci0gIGZyLT5kaXNwYXRjaCA9IE5VTEw7Ci0gIGZyLT5ncm91cG51bSA9IDA7Ci0gIGQtPnRvcCA9IGZyOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgcHVzaHRhZ2RlbGltKHVwYl9wYmRlY29kZXIgKmQsIHVpbnQzMl90IGFyZykgewotICAvKiBXaGlsZSB3ZSBleHBlY3QgdG8gc2VlIGFuICJlbmQiIHRhZyAoZWl0aGVyIEVOREdST1VQIG9yIGEgbm9uLXNlcXVlbmNlCi0gICAqIGZpZWxkIG51bWJlcikgcHJpb3IgdG8gaGl0dGluZyBhbnkgZW5jbG9zaW5nIHN1Ym1lc3NhZ2UgZW5kLCBwdXNoaW5nIG91cgotICAgKiBleGlzdGluZyBkZWxpbSBlbmQgcHJldmVudHMgdXMgZnJvbSBjb250aW51aW5nIHRvIHBhcnNlIHZhbHVlcyBmcm9tIGEKLSAgICogY29ycnVwdCBwcm90byB0aGF0IGRvZXNuJ3QgZ2l2ZSB1cyBhbiBFTkQgdGFnIGluIHRpbWUuICovCi0gIGlmICghZGVjb2Rlcl9wdXNoKGQsIGQtPnRvcC0+ZW5kX29mcykpCi0gICAgcmV0dXJuIGZhbHNlOwotICBkLT50b3AtPmdyb3VwbnVtID0gYXJnOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUG9wcyBhIGZyYW1lIGZyb20gdGhlIGRlY29kZXIgc3RhY2suICovCi1zdGF0aWMgdm9pZCBkZWNvZGVyX3BvcCh1cGJfcGJkZWNvZGVyICpkKSB7IGQtPnRvcC0tOyB9Ci0KLVVQQl9OT0lOTElORSBpbnQzMl90IHVwYl9wYmRlY29kZXJfY2hlY2t0YWdfc2xvdyh1cGJfcGJkZWNvZGVyICpkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90IGV4cGVjdGVkKSB7Ci0gIHVpbnQ2NF90IGRhdGEgPSAwOwotICBzaXplX3QgYnl0ZXMgPSB1cGJfdmFsdWVfc2l6ZShleHBlY3RlZCk7Ci0gIHNpemVfdCByZWFkID0gcGVla2J5dGVzKGQsICZkYXRhLCBieXRlcyk7Ci0gIGlmIChyZWFkID09IGJ5dGVzICYmIGRhdGEgPT0gZXhwZWN0ZWQpIHsKLSAgICAvKiBBZHZhbmNlIHBhc3QgbWF0Y2hlZCBieXRlcy4gKi8KLSAgICBpbnQzMl90IG9rID0gZ2V0Ynl0ZXMoZCwgJmRhdGEsIHJlYWQpOwotICAgIFVQQl9BU1NFUlRfVkFSKG9rLCBvayA8IDApOwotICAgIHJldHVybiBERUNPREVfT0s7Ci0gIH0gZWxzZSBpZiAocmVhZCA8IGJ5dGVzICYmIG1lbWNtcCgmZGF0YSwgJmV4cGVjdGVkLCByZWFkKSA9PSAwKSB7Ci0gICAgcmV0dXJuIHN1c3BlbmRfc2F2ZShkKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gREVDT0RFX01JU01BVENIOwotICB9Ci19Ci0KLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9za2lwdW5rbm93bih1cGJfcGJkZWNvZGVyICpkLCBpbnQzMl90IGZpZWxkbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgd2lyZV90eXBlKSB7Ci0gIGlmIChmaWVsZG51bSA+PSAwKQotICAgIGdvdG8gaGF2ZV90YWc7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICB1aW50MzJfdCB0YWc7Ci0gICAgQ0hFQ0tfUkVUVVJOKGRlY29kZV92MzIoZCwgJnRhZykpOwotICAgIHdpcmVfdHlwZSA9IHRhZyAmIDB4NzsKLSAgICBmaWVsZG51bSA9IHRhZyA+PiAzOwotCi1oYXZlX3RhZzoKLSAgICBpZiAoZmllbGRudW0gPT0gMCkgewotICAgICAgc2V0ZXJyKGQsICJTYXcgaW52YWxpZCBmaWVsZCBudW1iZXIgKDApIik7Ci0gICAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICAgIH0KLQotICAgIC8qIFRPRE86IGRlbGl2ZXIgdG8gdW5rbm93biBmaWVsZCBjYWxsYmFjay4gKi8KLSAgICBzd2l0Y2ggKHdpcmVfdHlwZSkgewotICAgICAgY2FzZSBVUEJfV0lSRV9UWVBFXzMyQklUOgotICAgICAgICBDSEVDS19SRVRVUk4oc2tpcChkLCA0KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfV0lSRV9UWVBFXzY0QklUOgotICAgICAgICBDSEVDS19SRVRVUk4oc2tpcChkLCA4KSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfV0lSRV9UWVBFX1ZBUklOVDogewotICAgICAgICB1aW50NjRfdCB1NjQ7Ci0gICAgICAgIENIRUNLX1JFVFVSTihkZWNvZGVfdmFyaW50KGQsICZ1NjQpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFVQQl9XSVJFX1RZUEVfREVMSU1JVEVEOiB7Ci0gICAgICAgIHVpbnQzMl90IGxlbjsKLSAgICAgICAgQ0hFQ0tfUkVUVVJOKGRlY29kZV92MzIoZCwgJmxlbikpOwotICAgICAgICBDSEVDS19SRVRVUk4oc2tpcChkLCBsZW4pKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFVQQl9XSVJFX1RZUEVfU1RBUlRfR1JPVVA6Ci0gICAgICAgIENIRUNLX1NVU1BFTkQocHVzaHRhZ2RlbGltKGQsIC1maWVsZG51bSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVVBCX1dJUkVfVFlQRV9FTkRfR1JPVVA6Ci0gICAgICAgIGlmIChmaWVsZG51bSA9PSAtZC0+dG9wLT5ncm91cG51bSkgewotICAgICAgICAgIGRlY29kZXJfcG9wKGQpOwotICAgICAgICB9IGVsc2UgaWYgKGZpZWxkbnVtID09IGQtPnRvcC0+Z3JvdXBudW0pIHsKLSAgICAgICAgICByZXR1cm4gREVDT0RFX0VOREdST1VQOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNldGVycihkLCAiVW5tYXRjaGVkIEVOREdST1VQIHRhZy4iKTsKLSAgICAgICAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgc2V0ZXJyKGQsICJJbnZhbGlkIHdpcmUgdHlwZSIpOwotICAgICAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICAgIH0KLQotICAgIGlmIChkLT50b3AtPmdyb3VwbnVtID49IDApIHsKLSAgICAgIHJldHVybiBERUNPREVfT0s7Ci0gICAgfQotCi0gICAgLyogVW5rbm93biBncm91cCAtLSBjb250aW51ZSBsb29waW5nIG92ZXIgdW5rbm93biBmaWVsZHMuICovCi0gICAgY2hlY2twb2ludChkKTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBnb3RvX2VuZG1zZyh1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIGZvdW5kID0gdXBiX2ludHRhYmxlX2xvb2t1cDMyKGQtPnRvcC0+ZGlzcGF0Y2gsIERJU1BBVENIX0VORE1TRywgJnYpOwotICBVUEJfQVNTRVJUX1ZBUihmb3VuZCwgZm91bmQpOwotICBkLT5wYyA9IGQtPnRvcC0+YmFzZSArIHVwYl92YWx1ZV9nZXR1aW50NjQodik7Ci19Ci0KLS8qIFBhcnNlcyBhIHRhZyBhbmQganVtcHMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgYnl0ZWNvZGUgaW5zdHJ1Y3Rpb24gZm9yIHRoaXMKLSAqIGZpZWxkLgotICoKLSAqIElmIHRoZSB0YWcgaXMgdW5rbm93biAob3IgdGhlIHdpcmUgdHlwZSBkb2Vzbid0IG1hdGNoKSwgcGFyc2VzIHRoZSBmaWVsZCBhcwotICogdW5rbm93bi4gIElmIHRoZSB0YWcgaXMgYSB2YWxpZCBFTkRHUk9VUCB0YWcsIGp1bXBzIHRvIHRoZSBieXRlY29kZQotICogaW5zdHJ1Y3Rpb24gZm9yIHRoZSBlbmQgb2YgbWVzc2FnZS4gKi8KLXN0YXRpYyBpbnQzMl90IGRpc3BhdGNoKHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgdXBiX2ludHRhYmxlICpkaXNwYXRjaCA9IGQtPnRvcC0+ZGlzcGF0Y2g7Ci0gIHVpbnQzMl90IHRhZzsKLSAgdWludDhfdCB3aXJlX3R5cGU7Ci0gIHVpbnQzMl90IGZpZWxkbnVtOwotICB1cGJfdmFsdWUgdmFsOwotICBpbnQzMl90IHJldHZhbDsKLQotICAvKiBEZWNvZGUgdGFnLiAqLwotICBDSEVDS19SRVRVUk4oZGVjb2RlX3YzMihkLCAmdGFnKSk7Ci0gIHdpcmVfdHlwZSA9IHRhZyAmIDB4NzsKLSAgZmllbGRudW0gPSB0YWcgPj4gMzsKLQotICAvKiBMb29rdXAgdGFnLiAgQmVjYXVzZSBvZiBwYWNrZWQvbm9uLXBhY2tlZCBjb21wYXRpYmlsaXR5LCB3ZSBoYXZlIHRvCi0gICAqIGNoZWNrIHRoZSB3aXJlIHR5cGUgYWdhaW5zdCB0d28gcG9zc2liaWxpdGllcy4gKi8KLSAgaWYgKGZpZWxkbnVtICE9IERJU1BBVENIX0VORE1TRyAmJgotICAgICAgdXBiX2ludHRhYmxlX2xvb2t1cDMyKGRpc3BhdGNoLCBmaWVsZG51bSwgJnZhbCkpIHsKLSAgICB1aW50NjRfdCB2ID0gdXBiX3ZhbHVlX2dldHVpbnQ2NCh2YWwpOwotICAgIGlmICh3aXJlX3R5cGUgPT0gKHYgJiAweGZmKSkgewotICAgICAgZC0+cGMgPSBkLT50b3AtPmJhc2UgKyAodiA+PiAxNik7Ci0gICAgICByZXR1cm4gREVDT0RFX09LOwotICAgIH0gZWxzZSBpZiAod2lyZV90eXBlID09ICgodiA+PiA4KSAmIDB4ZmYpKSB7Ci0gICAgICBib29sIGZvdW5kID0KLSAgICAgICAgICB1cGJfaW50dGFibGVfbG9va3VwKGRpc3BhdGNoLCBmaWVsZG51bSArIFVQQl9NQVhfRklFTEROVU1CRVIsICZ2YWwpOwotICAgICAgVVBCX0FTU0VSVF9WQVIoZm91bmQsIGZvdW5kKTsKLSAgICAgIGQtPnBjID0gZC0+dG9wLT5iYXNlICsgdXBiX3ZhbHVlX2dldHVpbnQ2NCh2YWwpOwotICAgICAgcmV0dXJuIERFQ09ERV9PSzsKLSAgICB9Ci0gIH0KLQotICAvKiBXZSBoYXZlIHNvbWUgdW5rbm93biBmaWVsZHMgKG9yIEVOREdST1VQKSB0byBwYXJzZS4gIFRoZSBESVNQQVRDSCBvciBUQUcKLSAgICogYnl0ZWNvZGUgdGhhdCB0cmlnZ2VyZWQgdGhpcyBpcyBwcmVjZWRlZCBieSBhIENIRUNLREVMSU0gYnl0ZWNvZGUgd2hpY2gKLSAgICogd2UgbmVlZCB0byBiYWNrIHVwIHRvLCBzbyB0aGF0IHdoZW4gd2UncmUgZG9uZSBza2lwcGluZyB1bmtub3duIGRhdGEgd2UKLSAgICogY2FuIHJlLWNoZWNrIHRoZSBkZWxpbWl0ZWQgZW5kLiAqLwotICBkLT5sYXN0LS07ICAvKiBOZWNlc3NhcnkgaWYgd2UgZ2V0IHN1c3BlbmRlZCAqLwotICBkLT5wYyA9IGQtPmxhc3Q7Ci0gIGFzc2VydChnZXRvcCgqZC0+bGFzdCkgPT0gT1BfQ0hFQ0tERUxJTSk7Ci0KLSAgLyogVW5rbm93biBmaWVsZCBvciBFTkRHUk9VUC4gKi8KLSAgcmV0dmFsID0gdXBiX3BiZGVjb2Rlcl9za2lwdW5rbm93bihkLCBmaWVsZG51bSwgd2lyZV90eXBlKTsKLQotICBDSEVDS19SRVRVUk4ocmV0dmFsKTsKLQotICBpZiAocmV0dmFsID09IERFQ09ERV9FTkRHUk9VUCkgewotICAgIGdvdG9fZW5kbXNnKGQpOwotICAgIHJldHVybiBERUNPREVfT0s7Ci0gIH0KLQotICByZXR1cm4gREVDT0RFX09LOwotfQotCi0vKiBDYWxsZXJzIGtub3cgdGhhdCB0aGUgc3RhY2sgaXMgbW9yZSB0aGFuIG9uZSBkZWVwIGJlY2F1c2UgdGhlIG9wY29kZXMgdGhhdAotICogY2FsbCB0aGlzIG9ubHkgb2NjdXIgYWZ0ZXIgUFVTSCBvcGVyYXRpb25zLiAqLwotdXBiX3BiZGVjb2Rlcl9mcmFtZSAqb3V0ZXJfZnJhbWUodXBiX3BiZGVjb2RlciAqZCkgewotICBhc3NlcnQoZC0+dG9wICE9IGQtPnN0YWNrKTsKLSAgcmV0dXJuIGQtPnRvcCAtIDE7Ci19Ci0KLQotLyogVGhlIG1haW4gZGVjb2RpbmcgbG9vcCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIG1haW4gZGVjb2RlciBWTSBmdW5jdGlvbi4gIFVzZXMgdHJhZGl0aW9uYWwgYnl0ZWNvZGUgZGlzcGF0Y2ggbG9vcCB3aXRoIGEKLSAqIHN3aXRjaCgpIHN0YXRlbWVudC4gKi8KLXNpemVfdCBydW5fZGVjb2Rlcl92bSh1cGJfcGJkZWNvZGVyICpkLCBjb25zdCBtZ3JvdXAgKmdyb3VwLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUqIGhhbmRsZSkgewotCi0jZGVmaW5lIFZNQ0FTRShvcCwgY29kZSkgXAotICBjYXNlIG9wOiB7IGNvZGU7IGlmIChjb25zdW1lc19pbnB1dChvcCkpIGNoZWNrcG9pbnQoZCk7IGJyZWFrOyB9Ci0jZGVmaW5lIFBSSU1JVElWRV9PUCh0eXBlLCB3dCwgbmFtZSwgY29udmZ1bmMsIGN0eXBlKSBcCi0gIFZNQ0FTRShPUF9QQVJTRV8gIyMgdHlwZSwgeyBcCi0gICAgY3R5cGUgdmFsOyBcCi0gICAgQ0hFQ0tfUkVUVVJOKGRlY29kZV8gIyMgd3QoZCwgJnZhbCkpOyBcCi0gICAgdXBiX3NpbmtfcHV0ICMjIG5hbWUoJmQtPnRvcC0+c2luaywgYXJnLCAoY29udmZ1bmMpKHZhbCkpOyBcCi0gIH0pCi0KLSAgd2hpbGUoMSkgewotICAgIGludDMyX3QgaW5zdHJ1Y3Rpb247Ci0gICAgb3Bjb2RlIG9wOwotICAgIHVpbnQzMl90IGFyZzsKLSAgICBpbnQzMl90IGxvbmdvZnM7Ci0KLSAgICBkLT5sYXN0ID0gZC0+cGM7Ci0gICAgaW5zdHJ1Y3Rpb24gPSAqZC0+cGMrKzsKLSAgICBvcCA9IGdldG9wKGluc3RydWN0aW9uKTsKLSAgICBhcmcgPSBpbnN0cnVjdGlvbiA+PiA4OwotICAgIGxvbmdvZnMgPSBhcmc7Ci0gICAgYXNzZXJ0KGQtPnB0ciAhPSBkLT5yZXNpZHVhbF9lbmQpOwotICAgIFVQQl9VTlVTRUQoZ3JvdXApOwotI2lmZGVmIFVQQl9EVU1QX0JZVEVDT0RFCi0gICAgZnByaW50ZihzdGRlcnIsICJzX29mcz0lZCBidWZfb2ZzPSVkIGRhdGFfcmVtPSVkIGJ1Zl9yZW09JWQgZGVsaW1fcmVtPSVkICIKLSAgICAgICAgICAgICAgICAgICAgIiV4ICVzICglZClcbiIsCi0gICAgICAgICAgICAoaW50KW9mZnNldChkKSwKLSAgICAgICAgICAgIChpbnQpKGQtPnB0ciAtIGQtPmJ1ZiksCi0gICAgICAgICAgICAoaW50KShkLT5kYXRhX2VuZCAtIGQtPnB0ciksCi0gICAgICAgICAgICAoaW50KShkLT5lbmQgLSBkLT5wdHIpLAotICAgICAgICAgICAgKGludCkoKGQtPnRvcC0+ZW5kX29mcyAtIGQtPmJ1ZnN0YXJ0X29mcykgLSAoZC0+cHRyIC0gZC0+YnVmKSksCi0gICAgICAgICAgICAoaW50KShkLT5wYyAtIDEgLSBncm91cC0+Ynl0ZWNvZGUpLAotICAgICAgICAgICAgdXBiX3BiZGVjb2Rlcl9nZXRvcG5hbWUob3ApLAotICAgICAgICAgICAgYXJnKTsKLSNlbmRpZgotICAgIHN3aXRjaCAob3ApIHsKLSAgICAgIC8qIFRlY2huaWNhbGx5LCB3ZSBhcmUgbG9zaW5nIGRhdGEgaWYgd2Ugc2VlIGEgMzItYml0IHZhcmludCB0aGF0IGlzIG5vdAotICAgICAgICogcHJvcGVybHkgc2lnbi1leHRlbmRlZC4gIFdlIGNvdWxkIGRldGVjdCB0aGlzIGFuZCBlcnJvciBhYm91dCB0aGUgZGF0YQotICAgICAgICogbG9zcywgYnV0IHByb3RvMiBkb2VzIG5vdCBkbyB0aGlzLCBzbyB3ZSBwYXNzLiAqLwotICAgICAgUFJJTUlUSVZFX09QKElOVDMyLCAgICB2YXJpbnQsICBpbnQzMiwgIGludDMyX3QsICAgICAgdWludDY0X3QpCi0gICAgICBQUklNSVRJVkVfT1AoSU5UNjQsICAgIHZhcmludCwgIGludDY0LCAgaW50NjRfdCwgICAgICB1aW50NjRfdCkKLSAgICAgIFBSSU1JVElWRV9PUChVSU5UMzIsICAgdmFyaW50LCAgdWludDMyLCB1aW50MzJfdCwgICAgIHVpbnQ2NF90KQotICAgICAgUFJJTUlUSVZFX09QKFVJTlQ2NCwgICB2YXJpbnQsICB1aW50NjQsIHVpbnQ2NF90LCAgICAgdWludDY0X3QpCi0gICAgICBQUklNSVRJVkVfT1AoRklYRUQzMiwgIGZpeGVkMzIsIHVpbnQzMiwgdWludDMyX3QsICAgICB1aW50MzJfdCkKLSAgICAgIFBSSU1JVElWRV9PUChGSVhFRDY0LCAgZml4ZWQ2NCwgdWludDY0LCB1aW50NjRfdCwgICAgIHVpbnQ2NF90KQotICAgICAgUFJJTUlUSVZFX09QKFNGSVhFRDMyLCBmaXhlZDMyLCBpbnQzMiwgIGludDMyX3QsICAgICAgdWludDMyX3QpCi0gICAgICBQUklNSVRJVkVfT1AoU0ZJWEVENjQsIGZpeGVkNjQsIGludDY0LCAgaW50NjRfdCwgICAgICB1aW50NjRfdCkKLSAgICAgIFBSSU1JVElWRV9PUChCT09MLCAgICAgdmFyaW50LCAgYm9vbCwgICBib29sLCAgICAgICAgIHVpbnQ2NF90KQotICAgICAgUFJJTUlUSVZFX09QKERPVUJMRSwgICBmaXhlZDY0LCBkb3VibGUsIGFzX2RvdWJsZSwgICAgdWludDY0X3QpCi0gICAgICBQUklNSVRJVkVfT1AoRkxPQVQsICAgIGZpeGVkMzIsIGZsb2F0LCAgYXNfZmxvYXQsICAgICB1aW50MzJfdCkKLSAgICAgIFBSSU1JVElWRV9PUChTSU5UMzIsICAgdmFyaW50LCAgaW50MzIsICB1cGJfenpkZWNfMzIsIHVpbnQ2NF90KQotICAgICAgUFJJTUlUSVZFX09QKFNJTlQ2NCwgICB2YXJpbnQsICBpbnQ2NCwgIHVwYl96emRlY182NCwgdWludDY0X3QpCi0KLSAgICAgIFZNQ0FTRShPUF9TRVRESVNQQVRDSCwKLSAgICAgICAgZC0+dG9wLT5iYXNlID0gZC0+cGMgLSAxOwotICAgICAgICBtZW1jcHkoJmQtPnRvcC0+ZGlzcGF0Y2gsIGQtPnBjLCBzaXplb2Yodm9pZCopKTsKLSAgICAgICAgZC0+cGMgKz0gc2l6ZW9mKHZvaWQqKSAvIHNpemVvZih1aW50MzJfdCk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfU1RBUlRNU0csCi0gICAgICAgIENIRUNLX1NVU1BFTkQodXBiX3Npbmtfc3RhcnRtc2coJmQtPnRvcC0+c2luaykpOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX0VORE1TRywKLSAgICAgICAgQ0hFQ0tfU1VTUEVORCh1cGJfc2lua19lbmRtc2coJmQtPnRvcC0+c2luaywgZC0+c3RhdHVzKSk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfU1RBUlRTRVEsCi0gICAgICAgIHVwYl9wYmRlY29kZXJfZnJhbWUgKm91dGVyID0gb3V0ZXJfZnJhbWUoZCk7Ci0gICAgICAgIENIRUNLX1NVU1BFTkQodXBiX3Npbmtfc3RhcnRzZXEoJm91dGVyLT5zaW5rLCBhcmcsICZkLT50b3AtPnNpbmspKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9FTkRTRVEsCi0gICAgICAgIENIRUNLX1NVU1BFTkQodXBiX3NpbmtfZW5kc2VxKCZkLT50b3AtPnNpbmssIGFyZykpOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX1NUQVJUU1VCTVNHLAotICAgICAgICB1cGJfcGJkZWNvZGVyX2ZyYW1lICpvdXRlciA9IG91dGVyX2ZyYW1lKGQpOwotICAgICAgICBDSEVDS19TVVNQRU5EKHVwYl9zaW5rX3N0YXJ0c3VibXNnKCZvdXRlci0+c2luaywgYXJnLCAmZC0+dG9wLT5zaW5rKSk7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfRU5EU1VCTVNHLAotICAgICAgICBDSEVDS19TVVNQRU5EKHVwYl9zaW5rX2VuZHN1Ym1zZygmZC0+dG9wLT5zaW5rLCBhcmcpKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9TVEFSVFNUUiwKLSAgICAgICAgdWludDMyX3QgbGVuID0gZGVsaW1fcmVtYWluaW5nKGQpOwotICAgICAgICB1cGJfcGJkZWNvZGVyX2ZyYW1lICpvdXRlciA9IG91dGVyX2ZyYW1lKGQpOwotICAgICAgICBDSEVDS19TVVNQRU5EKHVwYl9zaW5rX3N0YXJ0c3RyKCZvdXRlci0+c2luaywgYXJnLCBsZW4sICZkLT50b3AtPnNpbmspKTsKLSAgICAgICAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgICAgICAgZC0+cGMrKzsgIC8qIFNraXAgT1BfU1RSSU5HLiAqLwotICAgICAgICB9Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfU1RSSU5HLAotICAgICAgICB1aW50MzJfdCBsZW4gPSBjdXJidWZsZWZ0KGQpOwotICAgICAgICBzaXplX3QgbiA9IHVwYl9zaW5rX3B1dHN0cmluZygmZC0+dG9wLT5zaW5rLCBhcmcsIGQtPnB0ciwgbGVuLCBoYW5kbGUpOwotICAgICAgICBpZiAobiA+IGxlbikgewotICAgICAgICAgIGlmIChuID4gZGVsaW1fcmVtYWluaW5nKGQpKSB7Ci0gICAgICAgICAgICBzZXRlcnIoZCwgIlRyaWVkIHRvIHNraXAgcGFzdCBlbmQgb2Ygc3RyaW5nLiIpOwotICAgICAgICAgICAgcmV0dXJuIHVwYl9wYmRlY29kZXJfc3VzcGVuZChkKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaW50MzJfdCByZXQgPSBza2lwKGQsIG4pOwotICAgICAgICAgICAgLyogVGhpcyBzaG91bGRuJ3QgcmV0dXJuIERFQ09ERV9PSywgYmVjYXVzZSBuID4gbGVuLiAqLwotICAgICAgICAgICAgYXNzZXJ0KHJldCA+PSAwKTsKLSAgICAgICAgICAgIHJldHVybiByZXQ7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGFkdmFuY2UoZCwgbik7Ci0gICAgICAgIGlmIChuIDwgbGVuIHx8IGQtPmRlbGltX2VuZCA9PSBOVUxMKSB7Ci0gICAgICAgICAgLyogV2UgYXJlbid0IGZpbmlzaGVkIHdpdGggdGhpcyBzdHJpbmcgeWV0LiAqLwotICAgICAgICAgIGQtPnBjLS07ICAvKiBSZXBlYXQgT1BfU1RSSU5HLiAqLwotICAgICAgICAgIGlmIChuID4gMCkgY2hlY2twb2ludChkKTsKLSAgICAgICAgICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9zdXNwZW5kKGQpOwotICAgICAgICB9Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfRU5EU1RSLAotICAgICAgICBDSEVDS19TVVNQRU5EKHVwYl9zaW5rX2VuZHN0cigmZC0+dG9wLT5zaW5rLCBhcmcpKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9QVVNIVEFHREVMSU0sCi0gICAgICAgIENIRUNLX1NVU1BFTkQocHVzaHRhZ2RlbGltKGQsIGFyZykpOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX1NFVEJJR0dST1VQTlVNLAotICAgICAgICBkLT50b3AtPmdyb3VwbnVtID0gKmQtPnBjKys7Ci0gICAgICApCi0gICAgICBWTUNBU0UoT1BfUE9QLAotICAgICAgICBhc3NlcnQoZC0+dG9wID4gZC0+c3RhY2spOwotICAgICAgICBkZWNvZGVyX3BvcChkKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9QVVNITEVOREVMSU0sCi0gICAgICAgIHVpbnQzMl90IGxlbjsKLSAgICAgICAgQ0hFQ0tfUkVUVVJOKGRlY29kZV92MzIoZCwgJmxlbikpOwotICAgICAgICBDSEVDS19TVVNQRU5EKGRlY29kZXJfcHVzaChkLCBvZmZzZXQoZCkgKyBsZW4pKTsKLSAgICAgICAgc2V0X2RlbGltX2VuZChkKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9TRVRERUxJTSwKLSAgICAgICAgc2V0X2RlbGltX2VuZChkKTsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9DSEVDS0RFTElNLAotICAgICAgICAvKiBXZSBhcmUgZ3VhcmFudGVlZCBvZiB0aGlzIGFzc2VydCBiZWNhdXNlIHdlIG5ldmVyIGFsbG93IG91cnNlbHZlcyB0bwotICAgICAgICAgKiBjb25zdW1lIGJ5dGVzIGJleW9uZCBkYXRhX2VuZCwgd2hpY2ggY292ZXJzIGRlbGltX2VuZCB3aGVuIG5vbi1OVUxMLgotICAgICAgICAgKi8KLSAgICAgICAgYXNzZXJ0KCEoZC0+ZGVsaW1fZW5kICYmIGQtPnB0ciA+IGQtPmRlbGltX2VuZCkpOwotICAgICAgICBpZiAoZC0+cHRyID09IGQtPmRlbGltX2VuZCkKLSAgICAgICAgICBkLT5wYyArPSBsb25nb2ZzOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX0NBTEwsCi0gICAgICAgIGQtPmNhbGxzdGFja1tkLT5jYWxsX2xlbisrXSA9IGQtPnBjOwotICAgICAgICBkLT5wYyArPSBsb25nb2ZzOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX1JFVCwKLSAgICAgICAgYXNzZXJ0KGQtPmNhbGxfbGVuID4gMCk7Ci0gICAgICAgIGQtPnBjID0gZC0+Y2FsbHN0YWNrWy0tZC0+Y2FsbF9sZW5dOwotICAgICAgKQotICAgICAgVk1DQVNFKE9QX0JSQU5DSCwKLSAgICAgICAgZC0+cGMgKz0gbG9uZ29mczsKLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9UQUcxLAotICAgICAgICB1aW50OF90IGV4cGVjdGVkOwotICAgICAgICBDSEVDS19TVVNQRU5EKGN1cmJ1ZmxlZnQoZCkgPiAwKTsKLSAgICAgICAgZXhwZWN0ZWQgPSAoYXJnID4+IDgpICYgMHhmZjsKLSAgICAgICAgaWYgKCpkLT5wdHIgPT0gZXhwZWN0ZWQpIHsKLSAgICAgICAgICBhZHZhbmNlKGQsIDEpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGludDhfdCBzaG9ydG9mczsKLSAgICAgICAgIGJhZHRhZzoKLSAgICAgICAgICBzaG9ydG9mcyA9IGFyZzsKLSAgICAgICAgICBpZiAoc2hvcnRvZnMgPT0gTEFCRUxfRElTUEFUQ0gpIHsKLSAgICAgICAgICAgIENIRUNLX1JFVFVSTihkaXNwYXRjaChkKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGQtPnBjICs9IHNob3J0b2ZzOwotICAgICAgICAgICAgYnJlYWs7IC8qIEF2b2lkIGNoZWNrcG9pbnQoKS4gKi8KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9UQUcyLAotICAgICAgICB1aW50MTZfdCBleHBlY3RlZDsKLSAgICAgICAgQ0hFQ0tfU1VTUEVORChjdXJidWZsZWZ0KGQpID4gMCk7Ci0gICAgICAgIGV4cGVjdGVkID0gKGFyZyA+PiA4KSAmIDB4ZmZmZjsKLSAgICAgICAgaWYgKGN1cmJ1ZmxlZnQoZCkgPj0gMikgewotICAgICAgICAgIHVpbnQxNl90IGFjdHVhbDsKLSAgICAgICAgICBtZW1jcHkoJmFjdHVhbCwgZC0+cHRyLCAyKTsKLSAgICAgICAgICBpZiAoZXhwZWN0ZWQgPT0gYWN0dWFsKSB7Ci0gICAgICAgICAgICBhZHZhbmNlKGQsIDIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnb3RvIGJhZHRhZzsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaW50MzJfdCByZXN1bHQgPSB1cGJfcGJkZWNvZGVyX2NoZWNrdGFnX3Nsb3coZCwgZXhwZWN0ZWQpOwotICAgICAgICAgIGlmIChyZXN1bHQgPT0gREVDT0RFX01JU01BVENIKSBnb3RvIGJhZHRhZzsKLSAgICAgICAgICBpZiAocmVzdWx0ID49IDApIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICkKLSAgICAgIFZNQ0FTRShPUF9UQUdOLCB7Ci0gICAgICAgIHVpbnQ2NF90IGV4cGVjdGVkOwotICAgICAgICBpbnQzMl90IHJlc3VsdDsKLSAgICAgICAgbWVtY3B5KCZleHBlY3RlZCwgZC0+cGMsIDgpOwotICAgICAgICBkLT5wYyArPSAyOwotICAgICAgICByZXN1bHQgPSB1cGJfcGJkZWNvZGVyX2NoZWNrdGFnX3Nsb3coZCwgZXhwZWN0ZWQpOwotICAgICAgICBpZiAocmVzdWx0ID09IERFQ09ERV9NSVNNQVRDSCkgZ290byBiYWR0YWc7Ci0gICAgICAgIGlmIChyZXN1bHQgPj0gMCkgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0pCi0gICAgICBWTUNBU0UoT1BfRElTUEFUQ0gsIHsKLSAgICAgICAgQ0hFQ0tfUkVUVVJOKGRpc3BhdGNoKGQpKTsKLSAgICAgIH0pCi0gICAgICBWTUNBU0UoT1BfSEFMVCwgewotICAgICAgICByZXR1cm4gZC0+c2l6ZV9wYXJhbTsKLSAgICAgIH0pCi0gICAgfQotICB9Ci19Ci0KLQotLyogQnl0ZXNIYW5kbGVyIGhhbmRsZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdm9pZCAqdXBiX3BiZGVjb2Rlcl9zdGFydGJjKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKnBjLCBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIHVwYl9wYmRlY29kZXIgKmQgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKHNpemVfaGludCk7Ci0gIGQtPnRvcC0+ZW5kX29mcyA9IFVJTlQ2NF9NQVg7Ci0gIGQtPmJ1ZnN0YXJ0X29mcyA9IDA7Ci0gIGQtPmNhbGxfbGVuID0gMTsKLSAgZC0+Y2FsbHN0YWNrWzBdID0gJmhhbHQ7Ci0gIGQtPnBjID0gcGM7Ci0gIGQtPnNraXAgPSAwOwotICByZXR1cm4gZDsKLX0KLQotdm9pZCAqdXBiX3BiZGVjb2Rlcl9zdGFydGppdCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgc2l6ZV90IHNpemVfaGludCkgewotICB1cGJfcGJkZWNvZGVyICpkID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoc2l6ZV9oaW50KTsKLSAgZC0+dG9wLT5lbmRfb2ZzID0gVUlOVDY0X01BWDsKLSAgZC0+YnVmc3RhcnRfb2ZzID0gMDsKLSAgZC0+Y2FsbF9sZW4gPSAwOwotICBkLT5za2lwID0gMDsKLSAgcmV0dXJuIGQ7Ci19Ci0KLWJvb2wgdXBiX3BiZGVjb2Rlcl9lbmQodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl9wYmRlY29kZXIgKmQgPSBjbG9zdXJlOwotICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptZXRob2QgPSBoYW5kbGVyX2RhdGE7Ci0gIHVpbnQ2NF90IGVuZDsKLSAgY2hhciBkdW1teTsKLQotICBpZiAoZC0+cmVzaWR1YWxfZW5kID4gZC0+cmVzaWR1YWwpIHsKLSAgICBzZXRlcnIoZCwgIlVuZXhwZWN0ZWQgRU9GOiBkZWNvZGVyIHN0aWxsIGhhcyBidWZmZXJlZCB1bnBhcnNlZCBkYXRhIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKGQtPnNraXApIHsKLSAgICBzZXRlcnIoZCwgIlVuZXhwZWN0ZWQgRU9GIGluc2lkZSBza2lwcGVkIGRhdGEiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZC0+dG9wLT5lbmRfb2ZzICE9IFVJTlQ2NF9NQVgpIHsKLSAgICBzZXRlcnIoZCwgIlVuZXhwZWN0ZWQgRU9GIGluc2lkZSBkZWxpbWl0ZWQgc3RyaW5nIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLyogVGhlIHVzZXIncyBlbmQoKSBjYWxsIGluZGljYXRlcyB0aGF0IHRoZSBtZXNzYWdlIGVuZHMgaGVyZS4gKi8KLSAgZW5kID0gb2Zmc2V0KGQpOwotICBkLT50b3AtPmVuZF9vZnMgPSBlbmQ7Ci0KLSNpZmRlZiBVUEJfVVNFX0pJVF9YNjQKLSAgaWYgKG1ldGhvZC0+aXNfbmF0aXZlXykgewotICAgIGNvbnN0IG1ncm91cCAqZ3JvdXAgPSAoY29uc3QgbWdyb3VwKiltZXRob2QtPmdyb3VwOwotICAgIGlmIChkLT50b3AgIT0gZC0+c3RhY2spCi0gICAgICBkLT5zdGFjay0+ZW5kX29mcyA9IDA7Ci0gICAgZ3JvdXAtPmppdF9jb2RlKGNsb3N1cmUsIG1ldGhvZC0+Y29kZV9iYXNlLnB0ciwgJmR1bW15LCAwLCBOVUxMKTsKLSAgfSBlbHNlCi0jZW5kaWYKLSAgewotICAgIGNvbnN0IHVpbnQzMl90ICpwID0gZC0+cGM7Ci0gICAgZC0+c3RhY2stPmVuZF9vZnMgPSBlbmQ7Ci0gICAgLyogQ2hlY2sgdGhlIHByZXZpb3VzIGJ5dGVjb2RlLCBidXQgZ3VhcmQgYWdhaW5zdCBiZWdpbm5pbmcuICovCi0gICAgaWYgKHAgIT0gbWV0aG9kLT5jb2RlX2Jhc2UucHRyKSBwLS07Ci0gICAgaWYgKGdldG9wKCpwKSA9PSBPUF9DSEVDS0RFTElNKSB7Ci0gICAgICAvKiBSZXdpbmQgZnJvbSBPUF9UQUcqIHRvIE9QX0NIRUNLREVMSU0uICovCi0gICAgICBhc3NlcnQoZ2V0b3AoKmQtPnBjKSA9PSBPUF9UQUcxIHx8Ci0gICAgICAgICAgICAgZ2V0b3AoKmQtPnBjKSA9PSBPUF9UQUcyIHx8Ci0gICAgICAgICAgICAgZ2V0b3AoKmQtPnBjKSA9PSBPUF9UQUdOIHx8Ci0gICAgICAgICAgICAgZ2V0b3AoKmQtPnBjKSA9PSBPUF9ESVNQQVRDSCk7Ci0gICAgICBkLT5wYyA9IHA7Ci0gICAgfQotICAgIHVwYl9wYmRlY29kZXJfZGVjb2RlKGNsb3N1cmUsIGhhbmRsZXJfZGF0YSwgJmR1bW15LCAwLCBOVUxMKTsKLSAgfQotCi0gIGlmIChkLT5jYWxsX2xlbiAhPSAwKSB7Ci0gICAgc2V0ZXJyKGQsICJVbmV4cGVjdGVkIEVPRiBpbnNpZGUgc3VibWVzc2FnZSBvciBncm91cCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zaXplX3QgdXBiX3BiZGVjb2Rlcl9kZWNvZGUodm9pZCAqZGVjb2RlciwgY29uc3Qgdm9pZCAqZ3JvdXAsIGNvbnN0IGNoYXIgKmJ1ZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSwgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIGludDMyX3QgcmVzdWx0ID0gdXBiX3BiZGVjb2Rlcl9yZXN1bWUoZGVjb2RlciwgTlVMTCwgYnVmLCBzaXplLCBoYW5kbGUpOwotCi0gIGlmIChyZXN1bHQgPT0gREVDT0RFX0VOREdST1VQKSBnb3RvX2VuZG1zZyhkZWNvZGVyKTsKLSAgQ0hFQ0tfUkVUVVJOKHJlc3VsdCk7Ci0KLSAgcmV0dXJuIHJ1bl9kZWNvZGVyX3ZtKGRlY29kZXIsIGdyb3VwLCBoYW5kbGUpOwotfQotCi0KLS8qIFB1YmxpYyBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXZvaWQgdXBiX3BiZGVjb2Rlcl9yZXNldCh1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIGQtPnRvcCA9IGQtPnN0YWNrOwotICBkLT50b3AtPmdyb3VwbnVtID0gMDsKLSAgZC0+cHRyID0gZC0+cmVzaWR1YWw7Ci0gIGQtPmJ1ZiA9IGQtPnJlc2lkdWFsOwotICBkLT5lbmQgPSBkLT5yZXNpZHVhbDsKLSAgZC0+cmVzaWR1YWxfZW5kID0gZC0+cmVzaWR1YWw7Ci19Ci0KLXVwYl9wYmRlY29kZXIgKnVwYl9wYmRlY29kZXJfY3JlYXRlKHVwYl9lbnYgKmUsIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2luayAqc2luaykgewotICBjb25zdCBzaXplX3QgZGVmYXVsdF9tYXhfbmVzdGluZyA9IDY0OwotI2lmbmRlZiBOREVCVUcKLSAgc2l6ZV90IHNpemVfYmVmb3JlID0gdXBiX2Vudl9ieXRlc2FsbG9jYXRlZChlKTsKLSNlbmRpZgotCi0gIHVwYl9wYmRlY29kZXIgKmQgPSB1cGJfZW52X21hbGxvYyhlLCBzaXplb2YodXBiX3BiZGVjb2RlcikpOwotICBpZiAoIWQpIHJldHVybiBOVUxMOwotCi0gIGQtPm1ldGhvZF8gPSBtOwotICBkLT5jYWxsc3RhY2sgPSB1cGJfZW52X21hbGxvYyhlLCBjYWxsc3RhY2tzaXplKGQsIGRlZmF1bHRfbWF4X25lc3RpbmcpKTsKLSAgZC0+c3RhY2sgPSB1cGJfZW52X21hbGxvYyhlLCBzdGFja3NpemUoZCwgZGVmYXVsdF9tYXhfbmVzdGluZykpOwotICBpZiAoIWQtPnN0YWNrIHx8ICFkLT5jYWxsc3RhY2spIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGQtPmVudiA9IGU7Ci0gIGQtPmxpbWl0ID0gZC0+c3RhY2sgKyBkZWZhdWx0X21heF9uZXN0aW5nIC0gMTsKLSAgZC0+c3RhY2tfc2l6ZSA9IGRlZmF1bHRfbWF4X25lc3Rpbmc7Ci0gIGQtPnN0YXR1cyA9IE5VTEw7Ci0KLSAgdXBiX3BiZGVjb2Rlcl9yZXNldChkKTsKLSAgdXBiX2J5dGVzc2lua19yZXNldCgmZC0+aW5wdXRfLCAmbS0+aW5wdXRfaGFuZGxlcl8sIGQpOwotCi0gIGFzc2VydChzaW5rKTsKLSAgaWYgKGQtPm1ldGhvZF8tPmRlc3RfaGFuZGxlcnNfKSB7Ci0gICAgaWYgKHNpbmstPmhhbmRsZXJzICE9IGQtPm1ldGhvZF8tPmRlc3RfaGFuZGxlcnNfKQotICAgICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgdXBiX3NpbmtfcmVzZXQoJmQtPnRvcC0+c2luaywgc2luay0+aGFuZGxlcnMsIHNpbmstPmNsb3N1cmUpOwotCi0gIC8qIElmIHRoaXMgZmFpbHMsIGluY3JlYXNlIHRoZSB2YWx1ZSBpbiBkZWNvZGVyLmguICovCi0gIGFzc2VydCh1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGUpIC0gc2l6ZV9iZWZvcmUgPD0gVVBCX1BCX0RFQ09ERVJfU0laRSk7Ci0gIHJldHVybiBkOwotfQotCi11aW50NjRfdCB1cGJfcGJkZWNvZGVyX2J5dGVzcGFyc2VkKGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgcmV0dXJuIG9mZnNldChkKTsKLX0KLQotY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqdXBiX3BiZGVjb2Rlcl9tZXRob2QoY29uc3QgdXBiX3BiZGVjb2RlciAqZCkgewotICByZXR1cm4gZC0+bWV0aG9kXzsKLX0KLQotdXBiX2J5dGVzc2luayAqdXBiX3BiZGVjb2Rlcl9pbnB1dCh1cGJfcGJkZWNvZGVyICpkKSB7Ci0gIHJldHVybiAmZC0+aW5wdXRfOwotfQotCi1zaXplX3QgdXBiX3BiZGVjb2Rlcl9tYXhuZXN0aW5nKGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpIHsKLSAgcmV0dXJuIGQtPnN0YWNrX3NpemU7Ci19Ci0KLWJvb2wgdXBiX3BiZGVjb2Rlcl9zZXRtYXhuZXN0aW5nKHVwYl9wYmRlY29kZXIgKmQsIHNpemVfdCBtYXgpIHsKLSAgYXNzZXJ0KGQtPnRvcCA+PSBkLT5zdGFjayk7Ci0KLSAgaWYgKG1heCA8IChzaXplX3QpKGQtPnRvcCAtIGQtPnN0YWNrKSkgewotICAgIC8qIENhbid0IHNldCBhIGxpbWl0IHNtYWxsZXIgdGhhbiB3aGF0IHdlIGFyZSBjdXJyZW50bHkgYXQuICovCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKG1heCA+IGQtPnN0YWNrX3NpemUpIHsKLSAgICAvKiBOZWVkIHRvIHJlYWxsb2NhdGUgc3RhY2sgYW5kIGNhbGxzdGFjayB0byBhY2NvbW1vZGF0ZS4gKi8KLSAgICBzaXplX3Qgb2xkX3NpemUgPSBzdGFja3NpemUoZCwgZC0+c3RhY2tfc2l6ZSk7Ci0gICAgc2l6ZV90IG5ld19zaXplID0gc3RhY2tzaXplKGQsIG1heCk7Ci0gICAgdm9pZCAqcCA9IHVwYl9lbnZfcmVhbGxvYyhkLT5lbnYsIGQtPnN0YWNrLCBvbGRfc2l6ZSwgbmV3X3NpemUpOwotICAgIGlmICghcCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBkLT5zdGFjayA9IHA7Ci0KLSAgICBvbGRfc2l6ZSA9IGNhbGxzdGFja3NpemUoZCwgZC0+c3RhY2tfc2l6ZSk7Ci0gICAgbmV3X3NpemUgPSBjYWxsc3RhY2tzaXplKGQsIG1heCk7Ci0gICAgcCA9IHVwYl9lbnZfcmVhbGxvYyhkLT5lbnYsIGQtPmNhbGxzdGFjaywgb2xkX3NpemUsIG5ld19zaXplKTsKLSAgICBpZiAoIXApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgZC0+Y2FsbHN0YWNrID0gcDsKLQotICAgIGQtPnN0YWNrX3NpemUgPSBtYXg7Ci0gIH0KLQotICBkLT5saW1pdCA9IGQtPnN0YWNrICsgbWF4IC0gMTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0vKgotKiogdXBiOjpFbmNvZGVyCi0qKgotKiogU2luY2Ugd2UgYXJlIGltcGxlbWVudGluZyBwdXJlIGhhbmRsZXJzIChpZS4gd2l0aG91dCBhbnkgb3V0LW9mLWJhbmQgYWNjZXNzCi0qKiB0byBwcmUtY29tcHV0ZWQgbGVuZ3RocyksIHdlIGhhdmUgdG8gYnVmZmVyIGFsbCBzdWJtZXNzYWdlcyBiZWZvcmUgd2UgY2FuCi0qKiBlbWl0IGV2ZW4gdGhlaXIgZmlyc3QgYnl0ZS4KLSoqCi0qKiBOb3Qga25vd2luZyB0aGUgc2l6ZSBvZiBzdWJtZXNzYWdlcyBhbHNvIG1lYW5zIHdlIGNhbid0IHdyaXRlIGEgcGVyZmVjdAotKiogemVyby1jb3B5IGltcGxlbWVudGF0aW9uLCBldmVuIHdpdGggYnVmZmVyaW5nLiAgTGVuZ3RocyBhcmUgc3RvcmVkIGFzCi0qKiB2YXJpbnRzLCB3aGljaCBtZWFucyB0aGF0IHdlIGRvbid0IGtub3cgaG93IG1hbnkgYnl0ZXMgdG8gcmVzZXJ2ZSBmb3IgdGhlCi0qKiBsZW5ndGggdW50aWwgd2Uga25vdyB3aGF0IHRoZSBsZW5ndGggaXMuCi0qKgotKiogVGhpcyBsZWF2ZXMgdXMgd2l0aCB0aHJlZSBtYWluIGNob2ljZXM6Ci0qKgotKiogMS4gYnVmZmVyIGFsbCBzdWJtZXNzYWdlIGRhdGEgaW4gYSB0ZW1wb3JhcnkgYnVmZmVyLCB0aGVuIGNvcHkgaXQgZXhhY3RseQotKiogICAgb25jZSBpbnRvIHRoZSBvdXRwdXQgYnVmZmVyLgotKioKLSoqIDIuIGF0dGVtcHQgdG8gYnVmZmVyIGRhdGEgZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwgZXN0aW1hdGluZyBob3cKLSoqICAgIG1hbnkgYnl0ZXMgZWFjaCBsZW5ndGggd2lsbCB0YWtlLiAgV2hlbiBvdXIgZ3Vlc3NlcyBhcmUgd3JvbmcsIHVzZQotKiogICAgbWVtbW92ZSgpIHRvIGdyb3cgb3Igc2hyaW5rIHRoZSBhbGxvdHRlZCBzcGFjZS4KLSoqCi0qKiAzLiBidWZmZXIgZGlyZWN0bHkgaW50byB0aGUgb3V0cHV0IGJ1ZmZlciwgYWxsb2NhdGluZyBhIG1heCBsZW5ndGgKLSoqICAgIGFoZWFkLW9mLXRpbWUgZm9yIGVhY2ggc3VibWVzc2FnZSBsZW5ndGguICBJZiB3ZSBvdmVyYWxsb2NhdGVkLCB3ZSB3YXN0ZQotKiogICAgc3BhY2UsIGJ1dCBubyBtZW1jcHkoKSBvciBtZW1tb3ZlKCkgaXMgcmVxdWlyZWQuICBUaGlzIGFwcHJvYWNoIHJlcXVpcmVzCi0qKiAgICBkZWZpbmluZyBhIG1heGltdW0gc2l6ZSBmb3Igc3VibWVzc2FnZXMgYW5kIHJlamVjdGluZyBzdWJtZXNzYWdlcyB0aGF0Ci0qKiAgICBleGNlZWQgdGhhdCBzaXplLgotKioKLSoqICgyKSBhbmQgKDMpIGhhdmUgdGhlIHBvdGVudGlhbCB0byBoYXZlIGJldHRlciBwZXJmb3JtYW5jZSwgYnV0IHRoZXkgYXJlIG1vcmUKLSoqIGNvbXBsaWNhdGVkIGFuZCBzdWJ0bGUgdG8gaW1wbGVtZW50OgotKioKLSoqICAgKDMpIHJlcXVpcmVzIG1ha2luZyBhbiBhcmJpdHJhcnkgY2hvaWNlIG9mIHRoZSBtYXhpbXVtIG1lc3NhZ2Ugc2l6ZTsgaXQKLSoqICAgICAgIHdhc3RlcyBzcGFjZSB3aGVuIHN1Ym1lc3NhZ2VzIGFyZSBzaG9ydGVyIHRoYW4gdGhpcyBhbmQgZmFpbHMKLSoqICAgICAgIGNvbXBsZXRlbHkgd2hlbiB0aGV5IGFyZSBsb25nZXIuICBUaGlzIG1ha2VzIGl0IG1vcmUgZmluaWNreSBhbmQKLSoqICAgICAgIHJlcXVpcmVzIGNvbmZpZ3VyYXRpb24gYmFzZWQgb24gdGhlIGlucHV0LiAgSXQgYWxzbyBtYWtlcyBpdCBpbXBvc3NpYmxlCi0qKiAgICAgICB0byBwZXJmZWN0bHkgbWF0Y2ggdGhlIG91dHB1dCBvZiByZWZlcmVuY2UgZW5jb2RlcnMgdGhhdCBhbHdheXMgdXNlIHRoZQotKiogICAgICAgb3B0aW1hbCBhbW91bnQgb2Ygc3BhY2UgZm9yIGVhY2ggbGVuZ3RoLgotKioKLSoqICAgKDIpIHJlcXVpcmVzIGd1ZXNzaW5nIHRoZSB0aGUgc2l6ZSB1cGZyb250LCBhbmQgaWYgbXVsdGlwbGUgbGVuZ3RocyBhcmUKLSoqICAgICAgIGd1ZXNzZWQgd3JvbmcgdGhlIG1pbmltdW0gcmVxdWlyZWQgbnVtYmVyIG9mIG1lbW1vdmUoKSBvcGVyYXRpb25zIG1heQotKiogICAgICAgYmUgY29tcGxpY2F0ZWQgdG8gY29tcHV0ZSBjb3JyZWN0bHkuICBJbXBsZW1lbnRlZCBwcm9wZXJseSwgaXQgbWF5IGhhdmUKLSoqICAgICAgIGEgdXNlZnVsIGFtb3J0aXplZCBvciBhdmVyYWdlIGNvc3QsIGJ1dCBtb3JlIGludmVzdGlnYXRpb24gaXMgcmVxdWlyZWQKLSoqICAgICAgIHRvIGRldGVybWluZSB0aGlzIGFuZCB3aGF0IHRoZSBvcHRpbWFsIGFsZ29yaXRobSBpcyB0byBhY2hpZXZlIGl0LgotKioKLSoqICAgKDEpIG1ha2VzIHlvdSBhbHdheXMgcGF5IGZvciBleGFjdGx5IG9uZSBjb3B5LCBidXQgaXRzIGltcGxlbWVudGF0aW9uIGlzCi0qKiAgICAgICB0aGUgc2ltcGxlc3QgYW5kIGl0cyBwZXJmb3JtYW5jZSBpcyBwcmVkaWN0YWJsZS4KLSoqCi0qKiBTbyBmb3Igbm93LCB3ZSBpbXBsZW1lbnQgKDEpIG9ubHkuICBJZiB3ZSB3aXNoIHRvIG9wdGltaXplIGxhdGVyLCB3ZSBzaG91bGQKLSoqIGJlIGFibGUgdG8gZG8gaXQgd2l0aG91dCBhZmZlY3RpbmcgdXNlcnMuCi0qKgotKiogVGhlIHN0cmF0ZWd5IGlzIHRvIGJ1ZmZlciB0aGUgc2VnbWVudHMgb2YgZGF0YSB0aGF0IGRvICpub3QqIGRlcGVuZCBvbgotKiogdW5rbm93biBsZW5ndGhzIGluIG9uZSBidWZmZXIsIGFuZCBrZWVwIGEgc2VwYXJhdGUgYnVmZmVyIG9mIHNlZ21lbnQgcG9pbnRlcnMKLSoqIGFuZCBsZW5ndGhzLiAgV2hlbiB0aGUgdG9wLWxldmVsIHN1Ym1lc3NhZ2UgZW5kcywgd2UgY2FuIGdvIGJlZ2lubmluZyB0byBlbmQsCi0qKiBhbHRlcm5hdGluZyB0aGUgd3JpdGluZyBvZiBsZW5ndGhzIHdpdGggbWVtY3B5KCkgb2YgdGhlIHJlc3Qgb2YgdGhlIGRhdGEuCi0qKiBBdCB0aGUgdG9wIGxldmVsIHRob3VnaCwgbm8gYnVmZmVyaW5nIGlzIHJlcXVpcmVkLgotKi8KLQotCi0KLS8qIFRoZSBvdXRwdXQgYnVmZmVyIGlzIGRpdmlkZWQgaW50byBzZWdtZW50czsgYSBzZWdtZW50IGlzIGEgc3RyaW5nIG9mIGRhdGEKLSAqIHRoYXQgaXMgInJlYWR5IHRvIGdvIiAtLSBpdCBkb2VzIG5vdCBuZWVkIGFueSB2YXJpbnQgbGVuZ3RocyBpbnNlcnRlZCBpbnRvCi0gKiB0aGUgbWlkZGxlLiAgVGhlIHNlYW1zIGJldHdlZW4gc2VnbWVudHMgYXJlIHdoZXJlIHZhcmludHMgd2lsbCBiZSBpbnNlcnRlZAotICogb25jZSB0aGV5IGFyZSBrbm93bi4KLSAqCi0gKiBXZSBhbHNvIHVzZSB0aGUgY29uY2VwdCBvZiBhICJydW4iLCB3aGljaCBpcyBhIHJhbmdlIG9mIGVuY29kZWQgYnl0ZXMgdGhhdAotICogb2NjdXIgYXQgYSBzaW5nbGUgc3VibWVzc2FnZSBsZXZlbC4gIEV2ZXJ5IHNlZ21lbnQgY29udGFpbnMgb25lIG9yIG1vcmUgcnVucy4KLSAqCi0gKiBBIHNlZ21lbnQgY2FuIHNwYW4gbWVzc2FnZXMuICBDb25zaWRlcjoKLSAqCi0gKiAgICAgICAgICAgICAgICAgIC4tLVN1Ym1lc3NhZ2UgbGVuZ3Rocy0tLS0tLS0tLS4KLSAqICAgICAgICAgICAgICAgICAgfCAgICAgICB8ICAgICAgICAgICAgICAgICAgICAgfAotICogICAgICAgICAgICAgICAgICB8ICAgICAgIFYgICAgICAgICAgICAgICAgICAgICBWCi0gKiAgICAgICAgICAgICAgICAgIFYgICAgICB8IHwtLS0tLS0tLS0tLS0tLS0gICAgfCB8LS0tLS0tLS0tLS0tLS0tLS0KLSAqIFN1Ym1lc3NhZ2VzOiAgICB8IHwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICogVG9wLWxldmVsIG1zZzogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gKgotICogU2VnbWVudHM6ICAgICAgICAgIC0tLS0tICAgLS0tLS0tLS0tLS0tLS0tLS0tLSAgIC0tLS0tLS0tLS0tLS0tLS0tCi0gKiBSdW5zOiAgICAgICAgICAgICAgKi0tLS0gICAqLS0tLS0tLS0tLS0tLS0qLS0tICAgKi0tLS0tLS0tLS0tLS0tLS0KLSAqICgqIG1hcmtzIHRoZSBzdGFydCkKLSAqCi0gKiBOb3RlIHRoYXQgdGhlIHRvcC1sZXZlbCBtZW5zc2FnZSBpcyBub3QgaW4gYW55IHNlZ21lbnQgYmVjYXVzZSBpdCBkb2VzIG5vdAotICogaGF2ZSBhbnkgbGVuZ3RoIHByZWNlZGluZyBpdC4KLSAqCi0gKiBBIHNlZ21lbnQgaXMgb25seSBpbnRlcnJ1cHRlZCB3aGVuIGFub3RoZXIgbGVuZ3RoIG5lZWRzIHRvIGJlIGluc2VydGVkLiAgU28KLSAqIG9ic2VydmUgaG93IHRoZSBzZWNvbmQgc2VnbWVudCBzcGFucyBib3RoIHRoZSBpbm5lciBzdWJtZXNzYWdlIGFuZCBwYXJ0IG9mCi0gKiB0aGUgbmV4dCBlbmNsb3NpbmcgbWVzc2FnZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDMyX3QgbXNnbGVuOyAgLyogVGhlIGxlbmd0aCB0byB2YXJpbnQtZW5jb2RlIGJlZm9yZSB0aGlzIHNlZ21lbnQuICovCi0gIHVpbnQzMl90IHNlZ2xlbjsgIC8qIExlbmd0aCBvZiB0aGUgc2VnbWVudC4gKi8KLX0gdXBiX3BiX2VuY29kZXJfc2VnbWVudDsKLQotc3RydWN0IHVwYl9wYl9lbmNvZGVyIHsKLSAgdXBiX2VudiAqZW52OwotCi0gIC8qIE91ciBpbnB1dCBhbmQgb3V0cHV0LiAqLwotICB1cGJfc2luayBpbnB1dF87Ci0gIHVwYl9ieXRlc3NpbmsgKm91dHB1dF87Ci0KLSAgLyogVGhlICJzdWJjbG9zdXJlIiAtLSB1c2VkIGFzIHRoZSBpbm5lciBjbG9zdXJlIGFzIHBhcnQgb2YgdGhlIGJ5dGVzc2luawotICAgKiBwcm90b2NvbC4gKi8KLSAgdm9pZCAqc3ViYzsKLQotICAvKiBUaGUgb3V0cHV0IGJ1ZmZlciBhbmQgbGltaXQsIGFuZCBvdXIgY3VycmVudCB3cml0ZSBwb3NpdGlvbi4gICJidWYiCi0gICAqIGluaXRpYWxseSBwb2ludHMgdG8gImluaXRidWYiLCBidXQgaXMgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGlmIHdlIG5lZWQgdG8KLSAgICogZ3JvdyBiZXlvbmQgdGhlIGluaXRpYWwgc2l6ZS4gKi8KLSAgY2hhciAqYnVmLCAqcHRyLCAqbGltaXQ7Ci0KLSAgLyogVGhlIGJlZ2lubmluZyBvZiB0aGUgY3VycmVudCBydW4sIG9yIHVuZGVmaW5lZCBpZiB3ZSBhcmUgYXQgdGhlIHRvcAotICAgKiBsZXZlbC4gKi8KLSAgY2hhciAqcnVuYmVnaW47Ci0KLSAgLyogVGhlIGxpc3Qgb2Ygc2VnbWVudHMgd2UgYXJlIGFjY3VtdWxhdGluZy4gKi8KLSAgdXBiX3BiX2VuY29kZXJfc2VnbWVudCAqc2VnYnVmLCAqc2VncHRyLCAqc2VnbGltaXQ7Ci0KLSAgLyogVGhlIHN0YWNrIG9mIGVuY2xvc2luZyBzdWJtZXNzYWdlcy4gIEVhY2ggZW50cnkgaW4gdGhlIHN0YWNrIHBvaW50cyB0byB0aGUKLSAgICogc2VnbWVudCB3aGVyZSB0aGlzIHN1Ym1lc3NhZ2UncyBsZW5ndGggaXMgYmVpbmcgYWNjdW11bGF0ZWQuICovCi0gIGludCAqc3RhY2ssICp0b3AsICpzdGFja2xpbWl0OwotCi0gIC8qIERlcHRoIG9mIHN0YXJ0bXNnL2VuZG1zZyBjYWxscy4gKi8KLSAgaW50IGRlcHRoOwotfTsKLQotLyogbG93LWxldmVsIGJ1ZmZlcmluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogTG93LWxldmVsIGZ1bmN0aW9ucyBmb3IgaW50ZXJhY3Rpbmcgd2l0aCB0aGUgb3V0cHV0IGJ1ZmZlci4gKi8KLQotLyogVE9ETyhoYWJlcm1hbik6IGhhbmRsZSBwdXNoYmFjayAqLwotc3RhdGljIHZvaWQgcHV0YnVmKHVwYl9wYl9lbmNvZGVyICplLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4pIHsKLSAgc2l6ZV90IG4gPSB1cGJfYnl0ZXNzaW5rX3B1dGJ1ZihlLT5vdXRwdXRfLCBlLT5zdWJjLCBidWYsIGxlbiwgTlVMTCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG4sIG4gPT0gbGVuKTsKLX0KLQotc3RhdGljIHVwYl9wYl9lbmNvZGVyX3NlZ21lbnQgKnRvcCh1cGJfcGJfZW5jb2RlciAqZSkgewotICByZXR1cm4gJmUtPnNlZ2J1ZlsqZS0+dG9wXTsKLX0KLQotLyogQ2FsbCB0byBlbnN1cmUgdGhhdCBhdCBsZWFzdCAiYnl0ZXMiIGJ5dGVzIGFyZSBhdmFpbGFibGUgZm9yIHdyaXRpbmcgYXQKLSAqIGUtPnB0ci4gIFJldHVybnMgZmFsc2UgaWYgdGhlIGJ5dGVzIGNvdWxkIG5vdCBiZSBhbGxvY2F0ZWQuICovCi1zdGF0aWMgYm9vbCByZXNlcnZlKHVwYl9wYl9lbmNvZGVyICplLCBzaXplX3QgYnl0ZXMpIHsKLSAgaWYgKChzaXplX3QpKGUtPmxpbWl0IC0gZS0+cHRyKSA8IGJ5dGVzKSB7Ci0gICAgLyogR3JvdyBidWZmZXIuICovCi0gICAgY2hhciAqbmV3X2J1ZjsKLSAgICBzaXplX3QgbmVlZGVkID0gYnl0ZXMgKyAoZS0+cHRyIC0gZS0+YnVmKTsKLSAgICBzaXplX3Qgb2xkX3NpemUgPSBlLT5saW1pdCAtIGUtPmJ1ZjsKLQotICAgIHNpemVfdCBuZXdfc2l6ZSA9IG9sZF9zaXplOwotCi0gICAgd2hpbGUgKG5ld19zaXplIDwgbmVlZGVkKSB7Ci0gICAgICBuZXdfc2l6ZSAqPSAyOwotICAgIH0KLQotICAgIG5ld19idWYgPSB1cGJfZW52X3JlYWxsb2MoZS0+ZW52LCBlLT5idWYsIG9sZF9zaXplLCBuZXdfc2l6ZSk7Ci0KLSAgICBpZiAobmV3X2J1ZiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZS0+cHRyID0gbmV3X2J1ZiArIChlLT5wdHIgLSBlLT5idWYpOwotICAgIGUtPnJ1bmJlZ2luID0gbmV3X2J1ZiArIChlLT5ydW5iZWdpbiAtIGUtPmJ1Zik7Ci0gICAgZS0+bGltaXQgPSBuZXdfYnVmICsgbmV3X3NpemU7Ci0gICAgZS0+YnVmID0gbmV3X2J1ZjsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsIHdoZW4gImJ5dGVzIiBieXRlcyBoYXZlIGJlZW4gd3JpdHRlIGF0IGUtPnB0ci4gIFRoZSBjYWxsZXIgKm11c3QqIGhhdmUKLSAqIHByZXZpb3VzbHkgY2FsbGVkIHJlc2VydmUoKSB3aXRoIGF0IGxlYXN0IHRoaXMgbWFueSBieXRlcy4gKi8KLXN0YXRpYyB2b2lkIGVuY29kZXJfYWR2YW5jZSh1cGJfcGJfZW5jb2RlciAqZSwgc2l6ZV90IGJ5dGVzKSB7Ci0gIGFzc2VydCgoc2l6ZV90KShlLT5saW1pdCAtIGUtPnB0cikgPj0gYnl0ZXMpOwotICBlLT5wdHIgKz0gYnl0ZXM7Ci19Ci0KLS8qIENhbGwgd2hlbiBhbGwgb2YgdGhlIGJ5dGVzIGZvciBhIGhhbmRsZXIgaGF2ZSBiZWVuIHdyaXR0ZW4uICBGbHVzaGVzIHRoZQotICogYnl0ZXMgaWYgcG9zc2libGUgYW5kIG5lY2Vzc2FyeSwgcmV0dXJuaW5nIGZhbHNlIGlmIHRoaXMgZmFpbGVkLiAqLwotc3RhdGljIGJvb2wgY29tbWl0KHVwYl9wYl9lbmNvZGVyICplKSB7Ci0gIGlmICghZS0+dG9wKSB7Ci0gICAgLyogV2UgYXJlbid0IGluc2lkZSBhIGRlbGltaXRlZCByZWdpb24uICBGbHVzaCBvdXIgYWNjdW11bGF0ZWQgYnl0ZXMgdG8KLSAgICAgKiB0aGUgb3V0cHV0LgotICAgICAqCi0gICAgICogVE9ETyhoYWJlcm1hbik6IGluIHRoZSBmdXR1cmUgd2UgbWF5IHdhbnQgdG8gZGVsYXkgZmx1c2hpbmcgZm9yCi0gICAgICogZWZmaWNpZW5jeSByZWFzb25zLiAqLwotICAgIHB1dGJ1ZihlLCBlLT5idWYsIGUtPnB0ciAtIGUtPmJ1Zik7Ci0gICAgZS0+cHRyID0gZS0+YnVmOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIFdyaXRlcyB0aGUgZ2l2ZW4gYnl0ZXMgdG8gdGhlIGJ1ZmZlciwgaGFuZGxpbmcgcmVzZXJ2ZS9hZHZhbmNlLiAqLwotc3RhdGljIGJvb2wgZW5jb2RlX2J5dGVzKHVwYl9wYl9lbmNvZGVyICplLCBjb25zdCB2b2lkICpkYXRhLCBzaXplX3QgbGVuKSB7Ci0gIGlmICghcmVzZXJ2ZShlLCBsZW4pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbWVtY3B5KGUtPnB0ciwgZGF0YSwgbGVuKTsKLSAgZW5jb2Rlcl9hZHZhbmNlKGUsIGxlbik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vKiBGaW5pc2ggdGhlIGN1cnJlbnQgcnVuIGJ5IGFkZGluZyB0aGUgcnVuIHRvdGFscyB0byB0aGUgc2VnbWVudCBhbmQgbWVzc2FnZQotICogbGVuZ3RoLiAqLwotc3RhdGljIHZvaWQgYWNjdW11bGF0ZSh1cGJfcGJfZW5jb2RlciAqZSkgewotICBzaXplX3QgcnVuX2xlbjsKLSAgYXNzZXJ0KGUtPnB0ciA+PSBlLT5ydW5iZWdpbik7Ci0gIHJ1bl9sZW4gPSBlLT5wdHIgLSBlLT5ydW5iZWdpbjsKLSAgZS0+c2VncHRyLT5zZWdsZW4gKz0gcnVuX2xlbjsKLSAgdG9wKGUpLT5tc2dsZW4gKz0gcnVuX2xlbjsKLSAgZS0+cnVuYmVnaW4gPSBlLT5wdHI7Ci19Ci0KLS8qIENhbGwgdG8gaW5kaWNhdGUgdGhlIHN0YXJ0IG9mIGRlbGltaXRlZCByZWdpb24gZm9yIHdoaWNoIHRoZSBmdWxsIGxlbmd0aCBpcwotICogbm90IHlldCBrbm93bi4gIEFsbCBkYXRhIHdpbGwgYmUgYnVmZmVyZWQgdW50aWwgdGhlIGxlbmd0aCBpcyBrbm93bi4KLSAqIERlbGltaXRlZCByZWdpb25zIG1heSBiZSBuZXN0ZWQ7IHRoZWlyIGxlbmd0aHMgd2lsbCBhbGwgYmUgdHJhY2tlZCBwcm9wZXJseS4gKi8KLXN0YXRpYyBib29sIHN0YXJ0X2RlbGltKHVwYl9wYl9lbmNvZGVyICplKSB7Ci0gIGlmIChlLT50b3ApIHsKLSAgICAvKiBXZSBhcmUgYWxyZWFkeSBidWZmZXJpbmcsIGFkdmFuY2UgdG8gdGhlIG5leHQgc2VnbWVudCBhbmQgcHVzaCBpdCBvbiB0aGUKLSAgICAgKiBzdGFjay4gKi8KLSAgICBhY2N1bXVsYXRlKGUpOwotCi0gICAgaWYgKCsrZS0+dG9wID09IGUtPnN0YWNrbGltaXQpIHsKLSAgICAgIC8qIFRPRE8oaGFiZXJtYW4pOiBncm93IHN0YWNrPyAqLwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICgrK2UtPnNlZ3B0ciA9PSBlLT5zZWdsaW1pdCkgewotICAgICAgLyogR3JvdyBzZWdtZW50IGJ1ZmZlci4gKi8KLSAgICAgIHNpemVfdCBvbGRfc2l6ZSA9Ci0gICAgICAgICAgKGUtPnNlZ2xpbWl0IC0gZS0+c2VnYnVmKSAqIHNpemVvZih1cGJfcGJfZW5jb2Rlcl9zZWdtZW50KTsKLSAgICAgIHNpemVfdCBuZXdfc2l6ZSA9IG9sZF9zaXplICogMjsKLSAgICAgIHVwYl9wYl9lbmNvZGVyX3NlZ21lbnQgKm5ld19idWYgPQotICAgICAgICAgIHVwYl9lbnZfcmVhbGxvYyhlLT5lbnYsIGUtPnNlZ2J1Ziwgb2xkX3NpemUsIG5ld19zaXplKTsKLQotICAgICAgaWYgKG5ld19idWYgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGUtPnNlZ3B0ciA9IG5ld19idWYgKyAoZS0+c2VncHRyIC0gZS0+c2VnYnVmKTsKLSAgICAgIGUtPnNlZ2xpbWl0ID0gbmV3X2J1ZiArIChuZXdfc2l6ZSAvIHNpemVvZih1cGJfcGJfZW5jb2Rlcl9zZWdtZW50KSk7Ci0gICAgICBlLT5zZWdidWYgPSBuZXdfYnVmOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvKiBXZSB3ZXJlIHByZXZpb3VzbHkgYXQgdGhlIHRvcCBsZXZlbCwgc3RhcnQgYnVmZmVyaW5nLiAqLwotICAgIGUtPnNlZ3B0ciA9IGUtPnNlZ2J1ZjsKLSAgICBlLT50b3AgPSBlLT5zdGFjazsKLSAgICBlLT5ydW5iZWdpbiA9IGUtPnB0cjsKLSAgfQotCi0gICplLT50b3AgPSBlLT5zZWdwdHIgLSBlLT5zZWdidWY7Ci0gIGUtPnNlZ3B0ci0+c2VnbGVuID0gMDsKLSAgZS0+c2VncHRyLT5tc2dsZW4gPSAwOwotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBDYWxsIHRvIGluZGljYXRlIHRoZSBlbmQgb2YgYSBkZWxpbWl0ZWQgcmVnaW9uLiAgV2Ugbm93IGtub3cgdGhlIGxlbmd0aCBvZgotICogdGhlIGRlbGltaXRlZCByZWdpb24uICBJZiB3ZSBhcmUgbm90IG5lc3RlZCBpbnNpZGUgYW55IG90aGVyIGRlbGltaXRlZAotICogcmVnaW9ucywgd2UgY2FuIG5vdyBlbWl0IGFsbCBvZiB0aGUgYnVmZmVyZWQgZGF0YSB3ZSBhY2N1bXVsYXRlZC4gKi8KLXN0YXRpYyBib29sIGVuZF9kZWxpbSh1cGJfcGJfZW5jb2RlciAqZSkgewotICBzaXplX3QgbXNnbGVuOwotICBhY2N1bXVsYXRlKGUpOwotICBtc2dsZW4gPSB0b3AoZSktPm1zZ2xlbjsKLQotICBpZiAoZS0+dG9wID09IGUtPnN0YWNrKSB7Ci0gICAgLyogQWxsIGxlbmd0aHMgYXJlIG5vdyBhdmFpbGFibGUsIGVtaXQgYWxsIGJ1ZmZlcmVkIGRhdGEuICovCi0gICAgY2hhciBidWZbVVBCX1BCX1ZBUklOVF9NQVhfTEVOXTsKLSAgICB1cGJfcGJfZW5jb2Rlcl9zZWdtZW50ICpzOwotICAgIGNvbnN0IGNoYXIgKnB0ciA9IGUtPmJ1ZjsKLSAgICBmb3IgKHMgPSBlLT5zZWdidWY7IHMgPD0gZS0+c2VncHRyOyBzKyspIHsKLSAgICAgIHNpemVfdCBsZW5ieXRlcyA9IHVwYl92ZW5jb2RlNjQocy0+bXNnbGVuLCBidWYpOwotICAgICAgcHV0YnVmKGUsIGJ1ZiwgbGVuYnl0ZXMpOwotICAgICAgcHV0YnVmKGUsIHB0ciwgcy0+c2VnbGVuKTsKLSAgICAgIHB0ciArPSBzLT5zZWdsZW47Ci0gICAgfQotCi0gICAgZS0+cHRyID0gZS0+YnVmOwotICAgIGUtPnRvcCA9IE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTmVlZCB0byBrZWVwIGJ1ZmZlcmluZzsgcHJvcGFnYXRlIGxlbmd0aCBpbmZvIGludG8gZW5jbG9zaW5nCi0gICAgICogc3VibWVzc2FnZXMuICovCi0gICAgLS1lLT50b3A7Ci0gICAgdG9wKGUpLT5tc2dsZW4gKz0gbXNnbGVuICsgdXBiX3ZhcmludF9zaXplKG1zZ2xlbik7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi0vKiB0YWdfdCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBBIHByZWNvbXB1dGVkIChwcmUtZW5jb2RlZCkgdGFnIGFuZCBsZW5ndGguICovCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDhfdCBieXRlczsKLSAgY2hhciB0YWdbN107Ci19IHRhZ190OwotCi0vKiBBbGxvY2F0ZXMgYSBuZXcgdGFnIGZvciB0aGlzIGZpZWxkLCBhbmQgc2V0cyBpdCBpbiB0aGVzZSBoYW5kbGVyYXR0ci4gKi8KLXN0YXRpYyB2b2lkIG5ld190YWcodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl93aXJldHlwZV90IHd0LAotICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgdWludDMyX3QgbiA9IHVwYl9maWVsZGRlZl9udW1iZXIoZik7Ci0KLSAgdGFnX3QgKnRhZyA9IHVwYl9nbWFsbG9jKHNpemVvZih0YWdfdCkpOwotICB0YWctPmJ5dGVzID0gdXBiX3ZlbmNvZGU2NCgobiA8PCAzKSB8IHd0LCB0YWctPnRhZyk7Ci0KLSAgdXBiX2hhbmRsZXJhdHRyX2luaXQoYXR0cik7Ci0gIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YShhdHRyLCB0YWcpOwotICB1cGJfaGFuZGxlcnNfYWRkY2xlYW51cChoLCB0YWcsIHVwYl9nZnJlZSk7Ci19Ci0KLXN0YXRpYyBib29sIGVuY29kZV90YWcodXBiX3BiX2VuY29kZXIgKmUsIGNvbnN0IHRhZ190ICp0YWcpIHsKLSAgcmV0dXJuIGVuY29kZV9ieXRlcyhlLCB0YWctPnRhZywgdGFnLT5ieXRlcyk7Ci19Ci0KLQotLyogZW5jb2Rpbmcgb2Ygd2lyZSB0eXBlcyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RhdGljIGJvb2wgZW5jb2RlX2ZpeGVkNjQodXBiX3BiX2VuY29kZXIgKmUsIHVpbnQ2NF90IHZhbCkgewotICAvKiBUT0RPKGhhYmVybWFuKTogYnl0ZS1zd2FwIGZvciBiaWcgZW5kaWFuLiAqLwotICByZXR1cm4gZW5jb2RlX2J5dGVzKGUsICZ2YWwsIHNpemVvZih1aW50NjRfdCkpOwotfQotCi1zdGF0aWMgYm9vbCBlbmNvZGVfZml4ZWQzMih1cGJfcGJfZW5jb2RlciAqZSwgdWludDMyX3QgdmFsKSB7Ci0gIC8qIFRPRE8oaGFiZXJtYW4pOiBieXRlLXN3YXAgZm9yIGJpZyBlbmRpYW4uICovCi0gIHJldHVybiBlbmNvZGVfYnl0ZXMoZSwgJnZhbCwgc2l6ZW9mKHVpbnQzMl90KSk7Ci19Ci0KLXN0YXRpYyBib29sIGVuY29kZV92YXJpbnQodXBiX3BiX2VuY29kZXIgKmUsIHVpbnQ2NF90IHZhbCkgewotICBpZiAoIXJlc2VydmUoZSwgVVBCX1BCX1ZBUklOVF9NQVhfTEVOKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGVuY29kZXJfYWR2YW5jZShlLCB1cGJfdmVuY29kZTY0KHZhbCwgZS0+cHRyKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdWludDY0X3QgZGJsMnVpbnQ2NChkb3VibGUgZCkgewotICB1aW50NjRfdCByZXQ7Ci0gIG1lbWNweSgmcmV0LCAmZCwgc2l6ZW9mKHVpbnQ2NF90KSk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLXN0YXRpYyB1aW50MzJfdCBmbHQydWludDMyKGZsb2F0IGQpIHsKLSAgdWludDMyX3QgcmV0OwotICBtZW1jcHkoJnJldCwgJmQsIHNpemVvZih1aW50MzJfdCkpOwotICByZXR1cm4gcmV0OwotfQotCi0KLS8qIGVuY29kaW5nIG9mIHByb3RvIHR5cGVzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIHN0YXJ0bXNnKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl9wYl9lbmNvZGVyICplID0gYzsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIGlmIChlLT5kZXB0aCsrID09IDApIHsKLSAgICB1cGJfYnl0ZXNzaW5rX3N0YXJ0KGUtPm91dHB1dF8sIDAsICZlLT5zdWJjKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZW5kbXNnKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgdXBiX3BiX2VuY29kZXIgKmUgPSBjOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChzdGF0dXMpOwotICBpZiAoLS1lLT5kZXB0aCA9PSAwKSB7Ci0gICAgdXBiX2J5dGVzc2lua19lbmQoZS0+b3V0cHV0Xyk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkICplbmNvZGVfc3RhcnRkZWxpbWZpZWxkKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIGJvb2wgb2sgPSBlbmNvZGVfdGFnKGMsIGhkKSAmJiBjb21taXQoYykgJiYgc3RhcnRfZGVsaW0oYyk7Ci0gIHJldHVybiBvayA/IGMgOiBVUEJfQlJFQUs7Ci19Ci0KLXN0YXRpYyBib29sIGVuY29kZV9lbmRkZWxpbWZpZWxkKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByZXR1cm4gZW5kX2RlbGltKGMpOwotfQotCi1zdGF0aWMgdm9pZCAqZW5jb2RlX3N0YXJ0Z3JvdXAodm9pZCAqYywgY29uc3Qgdm9pZCAqaGQpIHsKLSAgcmV0dXJuIChlbmNvZGVfdGFnKGMsIGhkKSAmJiBjb21taXQoYykpID8gYyA6IFVQQl9CUkVBSzsKLX0KLQotc3RhdGljIGJvb2wgZW5jb2RlX2VuZGdyb3VwKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHJldHVybiBlbmNvZGVfdGFnKGMsIGhkKSAmJiBjb21taXQoYyk7Ci19Ci0KLXN0YXRpYyB2b2lkICplbmNvZGVfc3RhcnRzdHIodm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIHNpemVfdCBzaXplX2hpbnQpIHsKLSAgVVBCX1VOVVNFRChzaXplX2hpbnQpOwotICByZXR1cm4gZW5jb2RlX3N0YXJ0ZGVsaW1maWVsZChjLCBoZCk7Ci19Ci0KLXN0YXRpYyBzaXplX3QgZW5jb2RlX3N0cmJ1Zih2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIGNvbnN0IHVwYl9idWZoYW5kbGUgKmgpIHsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIFVQQl9VTlVTRUQoaCk7Ci0gIHJldHVybiBlbmNvZGVfYnl0ZXMoYywgYnVmLCBsZW4pID8gbGVuIDogMDsKLX0KLQotI2RlZmluZSBUKHR5cGUsIGN0eXBlLCBjb252ZXJ0LCBlbmNvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGJvb2wgZW5jb2RlX3NjYWxhcl8jI3R5cGUodm9pZCAqZSwgY29uc3Qgdm9pZCAqaGQsIGN0eXBlIHZhbCkgeyBcCi0gICAgcmV0dXJuIGVuY29kZV90YWcoZSwgaGQpICYmIGVuY29kZShlLCAoY29udmVydCkodmFsKSkgJiYgY29tbWl0KGUpOyAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljIGJvb2wgZW5jb2RlX3BhY2tlZF8jI3R5cGUodm9pZCAqZSwgY29uc3Qgdm9pZCAqaGQsIGN0eXBlIHZhbCkgeyBcCi0gICAgVVBCX1VOVVNFRChoZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBlbmNvZGUoZSwgKGNvbnZlcnQpKHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1UKGRvdWJsZSwgICBkb3VibGUsICAgZGJsMnVpbnQ2NCwgICBlbmNvZGVfZml4ZWQ2NCkKLVQoZmxvYXQsICAgIGZsb2F0LCAgICBmbHQydWludDMyLCAgIGVuY29kZV9maXhlZDMyKQotVChpbnQ2NCwgICAgaW50NjRfdCwgIHVpbnQ2NF90LCAgICAgZW5jb2RlX3ZhcmludCkKLVQoaW50MzIsICAgIGludDMyX3QsICB1aW50MzJfdCwgICAgIGVuY29kZV92YXJpbnQpCi1UKGZpeGVkNjQsICB1aW50NjRfdCwgdWludDY0X3QsICAgICBlbmNvZGVfZml4ZWQ2NCkKLVQoZml4ZWQzMiwgIHVpbnQzMl90LCB1aW50MzJfdCwgICAgIGVuY29kZV9maXhlZDMyKQotVChib29sLCAgICAgYm9vbCwgICAgIGJvb2wsICAgICAgICAgZW5jb2RlX3ZhcmludCkKLVQodWludDMyLCAgIHVpbnQzMl90LCB1aW50MzJfdCwgICAgIGVuY29kZV92YXJpbnQpCi1UKHVpbnQ2NCwgICB1aW50NjRfdCwgdWludDY0X3QsICAgICBlbmNvZGVfdmFyaW50KQotVChlbnVtLCAgICAgaW50MzJfdCwgIHVpbnQzMl90LCAgICAgZW5jb2RlX3ZhcmludCkKLVQoc2ZpeGVkMzIsIGludDMyX3QsICB1aW50MzJfdCwgICAgIGVuY29kZV9maXhlZDMyKQotVChzZml4ZWQ2NCwgaW50NjRfdCwgIHVpbnQ2NF90LCAgICAgZW5jb2RlX2ZpeGVkNjQpCi1UKHNpbnQzMiwgICBpbnQzMl90LCAgdXBiX3p6ZW5jXzMyLCBlbmNvZGVfdmFyaW50KQotVChzaW50NjQsICAgaW50NjRfdCwgIHVwYl96emVuY182NCwgZW5jb2RlX3ZhcmludCkKLQotI3VuZGVmIFQKLQotCi0vKiBjb2RlIHRvIGJ1aWxkIHRoZSBoYW5kbGVycyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdGF0aWMgdm9pZCBuZXdoYW5kbGVyc19jYWxsYmFjayhjb25zdCB2b2lkICpjbG9zdXJlLCB1cGJfaGFuZGxlcnMgKmgpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbTsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0KLSAgVVBCX1VOVVNFRChjbG9zdXJlKTsKLQotICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRtc2coaCwgc3RhcnRtc2csIE5VTEwpOwotICB1cGJfaGFuZGxlcnNfc2V0ZW5kbXNnKGgsIGVuZG1zZywgTlVMTCk7Ci0KLSAgbSA9IHVwYl9oYW5kbGVyc19tc2dkZWYoaCk7Ci0gIGZvcih1cGJfbXNnX2ZpZWxkX2JlZ2luKCZpLCBtKTsKLSAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0gICAgYm9vbCBwYWNrZWQgPSB1cGJfZmllbGRkZWZfaXNzZXEoZikgJiYgdXBiX2ZpZWxkZGVmX2lzcHJpbWl0aXZlKGYpICYmCi0gICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfcGFja2VkKGYpOwotICAgIHVwYl9oYW5kbGVyYXR0ciBhdHRyOwotICAgIHVwYl93aXJldHlwZV90IHd0ID0KLSAgICAgICAgcGFja2VkID8gVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQKLSAgICAgICAgICAgICAgIDogdXBiX3BiX25hdGl2ZV93aXJlX3R5cGVzW3VwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZShmKV07Ci0KLSAgICAvKiBQcmUtZW5jb2RlIHRoZSB0YWcgZm9yIHRoaXMgZmllbGQuICovCi0gICAgbmV3X3RhZyhoLCBmLCB3dCwgJmF0dHIpOwotCi0gICAgaWYgKHBhY2tlZCkgewotICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c2VxKGgsIGYsIGVuY29kZV9zdGFydGRlbGltZmllbGQsICZhdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzZXEoaCwgZiwgZW5jb2RlX2VuZGRlbGltZmllbGQsICZhdHRyKTsKLSAgICB9Ci0KLSNkZWZpbmUgVCh1cHBlciwgbG93ZXIsIHVwYnR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFXyMjdXBwZXI6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAocGFja2VkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHVwYl9oYW5kbGVyc19zZXQjI3VwYnR5cGUoaCwgZiwgZW5jb2RlX3BhY2tlZF8jI2xvd2VyLCAmYXR0cik7IFwKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHVwYl9oYW5kbGVyc19zZXQjI3VwYnR5cGUoaCwgZiwgZW5jb2RlX3NjYWxhcl8jI2xvd2VyLCAmYXR0cik7IFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBicmVhazsKLQotICAgIHN3aXRjaCAodXBiX2ZpZWxkZGVmX2Rlc2NyaXB0b3J0eXBlKGYpKSB7Ci0gICAgICBUKERPVUJMRSwgICBkb3VibGUsICAgZG91YmxlKTsKLSAgICAgIFQoRkxPQVQsICAgIGZsb2F0LCAgICBmbG9hdCk7Ci0gICAgICBUKElOVDY0LCAgICBpbnQ2NCwgICAgaW50NjQpOwotICAgICAgVChJTlQzMiwgICAgaW50MzIsICAgIGludDMyKTsKLSAgICAgIFQoRklYRUQ2NCwgIGZpeGVkNjQsICB1aW50NjQpOwotICAgICAgVChGSVhFRDMyLCAgZml4ZWQzMiwgIHVpbnQzMik7Ci0gICAgICBUKEJPT0wsICAgICBib29sLCAgICAgYm9vbCk7Ci0gICAgICBUKFVJTlQzMiwgICB1aW50MzIsICAgdWludDMyKTsKLSAgICAgIFQoVUlOVDY0LCAgIHVpbnQ2NCwgICB1aW50NjQpOwotICAgICAgVChFTlVNLCAgICAgZW51bSwgICAgIGludDMyKTsKLSAgICAgIFQoU0ZJWEVEMzIsIHNmaXhlZDMyLCBpbnQzMik7Ci0gICAgICBUKFNGSVhFRDY0LCBzZml4ZWQ2NCwgaW50NjQpOwotICAgICAgVChTSU5UMzIsICAgc2ludDMyLCAgIGludDMyKTsKLSAgICAgIFQoU0lOVDY0LCAgIHNpbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfU1RSSU5HOgotICAgICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX0JZVEVTOgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgZiwgZW5jb2RlX3N0YXJ0c3RyLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdHIoaCwgZiwgZW5jb2RlX2VuZGRlbGltZmllbGQsICZhdHRyKTsKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBmLCBlbmNvZGVfc3RyYnVmLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfREVTQ1JJUFRPUl9UWVBFX01FU1NBR0U6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRzdGFydHN1Ym1zZyhoLCBmLCBlbmNvZGVfc3RhcnRkZWxpbWZpZWxkLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2coaCwgZiwgZW5jb2RlX2VuZGRlbGltZmllbGQsICZhdHRyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVQQl9ERVNDUklQVE9SX1RZUEVfR1JPVVA6IHsKLSAgICAgICAgLyogRW5kZ3JvdXAgdGFrZXMgYSBkaWZmZXJlbnQgdGFnICh3aXJlX3R5cGUgPSBFTkRfR1JPVVApLiAqLwotICAgICAgICB1cGJfaGFuZGxlcmF0dHIgYXR0cjI7Ci0gICAgICAgIG5ld190YWcoaCwgZiwgVVBCX1dJUkVfVFlQRV9FTkRfR1JPVVAsICZhdHRyMik7Ci0KLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3VibXNnKGgsIGYsIGVuY29kZV9zdGFydGdyb3VwLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2coaCwgZiwgZW5jb2RlX2VuZGdyb3VwLCAmYXR0cjIpOwotCi0gICAgICAgIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmF0dHIyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0jdW5kZWYgVAotCi0gICAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmYXR0cik7Ci0gIH0KLX0KLQotdm9pZCB1cGJfcGJfZW5jb2Rlcl9yZXNldCh1cGJfcGJfZW5jb2RlciAqZSkgewotICBlLT5zZWdwdHIgPSBOVUxMOwotICBlLT50b3AgPSBOVUxMOwotICBlLT5kZXB0aCA9IDA7Ci19Ci0KLQotLyogcHVibGljIEFQSSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfcGJfZW5jb2Rlcl9uZXdoYW5kbGVycyhjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcikgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX25ld2Zyb3plbihtLCBvd25lciwgbmV3aGFuZGxlcnNfY2FsbGJhY2ssIE5VTEwpOwotfQotCi11cGJfcGJfZW5jb2RlciAqdXBiX3BiX2VuY29kZXJfY3JlYXRlKHVwYl9lbnYgKmVudiwgY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfYnl0ZXNzaW5rICpvdXRwdXQpIHsKLSAgY29uc3Qgc2l6ZV90IGluaXRpYWxfYnVmc2l6ZSA9IDI1NjsKLSAgY29uc3Qgc2l6ZV90IGluaXRpYWxfc2VnYnVmc2l6ZSA9IDE2OwotICAvKiBUT0RPKGhhYmVybWFuKTogbWFrZSB0aGlzIGNvbmZpZ3VyYWJsZS4gKi8KLSAgY29uc3Qgc2l6ZV90IHN0YWNrX3NpemUgPSA2NDsKLSNpZm5kZWYgTkRFQlVHCi0gIGNvbnN0IHNpemVfdCBzaXplX2JlZm9yZSA9IHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQoZW52KTsKLSNlbmRpZgotCi0gIHVwYl9wYl9lbmNvZGVyICplID0gdXBiX2Vudl9tYWxsb2MoZW52LCBzaXplb2YodXBiX3BiX2VuY29kZXIpKTsKLSAgaWYgKCFlKSByZXR1cm4gTlVMTDsKLQotICBlLT5idWYgPSB1cGJfZW52X21hbGxvYyhlbnYsIGluaXRpYWxfYnVmc2l6ZSk7Ci0gIGUtPnNlZ2J1ZiA9IHVwYl9lbnZfbWFsbG9jKGVudiwgaW5pdGlhbF9zZWdidWZzaXplICogc2l6ZW9mKCplLT5zZWdidWYpKTsKLSAgZS0+c3RhY2sgPSB1cGJfZW52X21hbGxvYyhlbnYsIHN0YWNrX3NpemUgKiBzaXplb2YoKmUtPnN0YWNrKSk7Ci0KLSAgaWYgKCFlLT5idWYgfHwgIWUtPnNlZ2J1ZiB8fCAhZS0+c3RhY2spIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGUtPmxpbWl0ID0gZS0+YnVmICsgaW5pdGlhbF9idWZzaXplOwotICBlLT5zZWdsaW1pdCA9IGUtPnNlZ2J1ZiArIGluaXRpYWxfc2VnYnVmc2l6ZTsKLSAgZS0+c3RhY2tsaW1pdCA9IGUtPnN0YWNrICsgc3RhY2tfc2l6ZTsKLQotICB1cGJfcGJfZW5jb2Rlcl9yZXNldChlKTsKLSAgdXBiX3NpbmtfcmVzZXQoJmUtPmlucHV0XywgaCwgZSk7Ci0KLSAgZS0+ZW52ID0gZW52OwotICBlLT5vdXRwdXRfID0gb3V0cHV0OwotICBlLT5zdWJjID0gb3V0cHV0LT5jbG9zdXJlOwotICBlLT5wdHIgPSBlLT5idWY7Ci0KLSAgLyogSWYgdGhpcyBmYWlscywgaW5jcmVhc2UgdGhlIHZhbHVlIGluIGVuY29kZXIuaC4gKi8KLSAgYXNzZXJ0KHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQoZW52KSAtIHNpemVfYmVmb3JlIDw9IFVQQl9QQl9FTkNPREVSX1NJWkUpOwotICByZXR1cm4gZTsKLX0KLQotdXBiX3NpbmsgKnVwYl9wYl9lbmNvZGVyX2lucHV0KHVwYl9wYl9lbmNvZGVyICplKSB7IHJldHVybiAmZS0+aW5wdXRfOyB9Ci0KLQotCi11cGJfZmlsZWRlZiAqKnVwYl9sb2FkZGVzY3JpcHRvcihjb25zdCBjaGFyICpidWYsIHNpemVfdCBuLCBjb25zdCB2b2lkICpvd25lciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdGF0dXMgKnN0YXR1cykgewotICAvKiBDcmVhdGUgaGFuZGxlcnMuICovCi0gIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKmRlY29kZXJfbTsKLSAgY29uc3QgdXBiX2hhbmRsZXJzICpyZWFkZXJfaCA9IHVwYl9kZXNjcmVhZGVyX25ld2hhbmRsZXJzKCZyZWFkZXJfaCk7Ci0gIHVwYl9lbnYgZW52OwotICB1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyBvcHRzOwotICB1cGJfcGJkZWNvZGVyICpkZWNvZGVyOwotICB1cGJfZGVzY3JlYWRlciAqcmVhZGVyOwotICBib29sIG9rOwotICBzaXplX3QgaTsKLSAgdXBiX2ZpbGVkZWYgKipyZXQgPSBOVUxMOwotCi0gIHVwYl9wYmRlY29kZXJtZXRob2RvcHRzX2luaXQoJm9wdHMsIHJlYWRlcl9oKTsKLSAgZGVjb2Rlcl9tID0gdXBiX3BiZGVjb2Rlcm1ldGhvZF9uZXcoJm9wdHMsICZkZWNvZGVyX20pOwotCi0gIHVwYl9lbnZfaW5pdCgmZW52KTsKLSAgdXBiX2Vudl9yZXBvcnRlcnJvcnN0bygmZW52LCBzdGF0dXMpOwotCi0gIHJlYWRlciA9IHVwYl9kZXNjcmVhZGVyX2NyZWF0ZSgmZW52LCByZWFkZXJfaCk7Ci0gIGRlY29kZXIgPSB1cGJfcGJkZWNvZGVyX2NyZWF0ZSgmZW52LCBkZWNvZGVyX20sIHVwYl9kZXNjcmVhZGVyX2lucHV0KHJlYWRlcikpOwotCi0gIC8qIFB1c2ggaW5wdXQgZGF0YS4gKi8KLSAgb2sgPSB1cGJfYnVmc3JjX3B1dGJ1ZihidWYsIG4sIHVwYl9wYmRlY29kZXJfaW5wdXQoZGVjb2RlcikpOwotCi0gIGlmICghb2spIHsKLSAgICBnb3RvIGNsZWFudXA7Ci0gIH0KLQotICByZXQgPSB1cGJfZ21hbGxvYyhzaXplb2YgKCpyZXQpICogKHVwYl9kZXNjcmVhZGVyX2ZpbGVjb3VudChyZWFkZXIpICsgMSkpOwotCi0gIGlmICghcmV0KSB7Ci0gICAgZ290byBjbGVhbnVwOwotICB9Ci0KLSAgZm9yIChpID0gMDsgaSA8IHVwYl9kZXNjcmVhZGVyX2ZpbGVjb3VudChyZWFkZXIpOyBpKyspIHsKLSAgICByZXRbaV0gPSB1cGJfZGVzY3JlYWRlcl9maWxlKHJlYWRlciwgaSk7Ci0gICAgdXBiX2ZpbGVkZWZfcmVmKHJldFtpXSwgb3duZXIpOwotICB9Ci0KLSAgcmV0W2ldID0gTlVMTDsKLQotY2xlYW51cDoKLSAgdXBiX2Vudl91bmluaXQoJmVudik7Ci0gIHVwYl9oYW5kbGVyc191bnJlZihyZWFkZXJfaCwgJnJlYWRlcl9oKTsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZF91bnJlZihkZWNvZGVyX20sICZkZWNvZGVyX20pOwotICByZXR1cm4gcmV0OwotfQotLyoKLSAqIHVwYjo6cGI6OlRleHRQcmludGVyCi0gKgotICogT1BUOiBUaGlzIGlzIG5vdCBvcHRpbWl6ZWQgYXQgYWxsLiAgSXQgdXNlcyBwcmludGYoKSB3aGljaCBwYXJzZXMgdGhlIGZvcm1hdAotICogc3RyaW5nIGV2ZXJ5IHRpbWUsIGFuZCBpdCBhbGxvY2F0ZXMgbWVtb3J5IGZvciBldmVyeSBwdXQuCi0gKi8KLQotCi0jaW5jbHVkZSA8Y3R5cGUuaD4KLSNpbmNsdWRlIDxmbG9hdC5oPgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jaW5jbHVkZSA8c3RkYXJnLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi1zdHJ1Y3QgdXBiX3RleHRwcmludGVyIHsKLSAgdXBiX3NpbmsgaW5wdXRfOwotICB1cGJfYnl0ZXNzaW5rICpvdXRwdXRfOwotICBpbnQgaW5kZW50X2RlcHRoXzsKLSAgYm9vbCBzaW5nbGVfbGluZV87Ci0gIHZvaWQgKnN1YmM7Ci19OwotCi0jZGVmaW5lIENIRUNLKHgpIGlmICgoeCkgPCAwKSBnb3RvIGVycjsKLQotc3RhdGljIGNvbnN0IGNoYXIgKnNob3J0bmFtZShjb25zdCBjaGFyICpsb25nbmFtZSkgewotICBjb25zdCBjaGFyICpsYXN0ID0gc3RycmNocihsb25nbmFtZSwgJy4nKTsKLSAgcmV0dXJuIGxhc3QgPyBsYXN0ICsgMSA6IGxvbmduYW1lOwotfQotCi1zdGF0aWMgaW50IGluZGVudCh1cGJfdGV4dHByaW50ZXIgKnApIHsKLSAgaW50IGk7Ci0gIGlmICghcC0+c2luZ2xlX2xpbmVfKQotICAgIGZvciAoaSA9IDA7IGkgPCBwLT5pbmRlbnRfZGVwdGhfOyBpKyspCi0gICAgICB1cGJfYnl0ZXNzaW5rX3B1dGJ1ZihwLT5vdXRwdXRfLCBwLT5zdWJjLCAiICAiLCAyLCBOVUxMKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyBpbnQgZW5kZmllbGQodXBiX3RleHRwcmludGVyICpwKSB7Ci0gIGNvbnN0IGNoYXIgY2ggPSAocC0+c2luZ2xlX2xpbmVfID8gJyAnIDogJ1xuJyk7Ci0gIHVwYl9ieXRlc3NpbmtfcHV0YnVmKHAtPm91dHB1dF8sIHAtPnN1YmMsICZjaCwgMSwgTlVMTCk7Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgaW50IHB1dGVzY2FwZWQodXBiX3RleHRwcmludGVyICpwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmVzZXJ2ZV91dGY4KSB7Ci0gIC8qIEJhc2VkIG9uIENFc2NhcGVJbnRlcm5hbCgpIGZyb20gR29vZ2xlJ3MgcHJvdG9idWYgcmVsZWFzZS4gKi8KLSAgY2hhciBkc3RidWZbNDA5Nl0sICpkc3QgPSBkc3RidWYsICpkc3RlbmQgPSBkc3RidWYgKyBzaXplb2YoZHN0YnVmKTsKLSAgY29uc3QgY2hhciAqZW5kID0gYnVmICsgbGVuOwotCi0gIC8qIEkgdGhpbmsgaGV4IGlzIHByZXR0aWVyIGFuZCBtb3JlIHVzZWZ1bCwgYnV0IHByb3RvMiB1c2VzIG9jdGFsOyBzaG91bGQKLSAgICogaW52ZXN0aWdhdGUgd2hldGhlciBpdCBjYW4gcGFyc2UgaGV4IGFsc28uICovCi0gIGNvbnN0IGJvb2wgdXNlX2hleCA9IGZhbHNlOwotICBib29sIGxhc3RfaGV4X2VzY2FwZSA9IGZhbHNlOyAvKiB0cnVlIGlmIGxhc3Qgb3V0cHV0IGNoYXIgd2FzIFx4Tk4gKi8KLQotICBmb3IgKDsgYnVmIDwgZW5kOyBidWYrKykgewotICAgIGJvb2wgaXNfaGV4X2VzY2FwZTsKLQotICAgIGlmIChkc3RlbmQgLSBkc3QgPCA0KSB7Ci0gICAgICB1cGJfYnl0ZXNzaW5rX3B1dGJ1ZihwLT5vdXRwdXRfLCBwLT5zdWJjLCBkc3RidWYsIGRzdCAtIGRzdGJ1ZiwgTlVMTCk7Ci0gICAgICBkc3QgPSBkc3RidWY7Ci0gICAgfQotCi0gICAgaXNfaGV4X2VzY2FwZSA9IGZhbHNlOwotICAgIHN3aXRjaCAoKmJ1ZikgewotICAgICAgY2FzZSAnXG4nOiAqKGRzdCsrKSA9ICdcXCc7ICooZHN0KyspID0gJ24nOyAgYnJlYWs7Ci0gICAgICBjYXNlICdccic6ICooZHN0KyspID0gJ1xcJzsgKihkc3QrKykgPSAncic7ICBicmVhazsKLSAgICAgIGNhc2UgJ1x0JzogKihkc3QrKykgPSAnXFwnOyAqKGRzdCsrKSA9ICd0JzsgIGJyZWFrOwotICAgICAgY2FzZSAnXCInOiAqKGRzdCsrKSA9ICdcXCc7ICooZHN0KyspID0gJ1wiJzsgYnJlYWs7Ci0gICAgICBjYXNlICdcJyc6ICooZHN0KyspID0gJ1xcJzsgKihkc3QrKykgPSAnXCcnOyBicmVhazsKLSAgICAgIGNhc2UgJ1xcJzogKihkc3QrKykgPSAnXFwnOyAqKGRzdCsrKSA9ICdcXCc7IGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgLyogTm90ZSB0aGF0IGlmIHdlIGVtaXQgXHhOTiBhbmQgdGhlIGJ1ZiBjaGFyYWN0ZXIgYWZ0ZXIgdGhhdCBpcyBhIGhleAotICAgICAgICAgKiBkaWdpdCB0aGVuIHRoYXQgZGlnaXQgbXVzdCBiZSBlc2NhcGVkIHRvbyB0byBwcmV2ZW50IGl0IGJlaW5nCi0gICAgICAgICAqIGludGVycHJldGVkIGFzIHBhcnQgb2YgdGhlIGNoYXJhY3RlciBjb2RlIGJ5IEMuICovCi0gICAgICAgIGlmICgoIXByZXNlcnZlX3V0ZjggfHwgKHVpbnQ4X3QpKmJ1ZiA8IDB4ODApICYmCi0gICAgICAgICAgICAoIWlzcHJpbnQoKmJ1ZikgfHwgKGxhc3RfaGV4X2VzY2FwZSAmJiBpc3hkaWdpdCgqYnVmKSkpKSB7Ci0gICAgICAgICAgc3ByaW50Zihkc3QsICh1c2VfaGV4ID8gIlxceCUwMngiIDogIlxcJTAzbyIpLCAodWludDhfdCkqYnVmKTsKLSAgICAgICAgICBpc19oZXhfZXNjYXBlID0gdXNlX2hleDsKLSAgICAgICAgICBkc3QgKz0gNDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAqKGRzdCsrKSA9ICpidWY7IGJyZWFrOwotICAgICAgICB9Ci0gICAgfQotICAgIGxhc3RfaGV4X2VzY2FwZSA9IGlzX2hleF9lc2NhcGU7Ci0gIH0KLSAgLyogRmx1c2ggcmVtYWluaW5nIGRhdGEuICovCi0gIHVwYl9ieXRlc3NpbmtfcHV0YnVmKHAtPm91dHB1dF8sIHAtPnN1YmMsIGRzdGJ1ZiwgZHN0IC0gZHN0YnVmLCBOVUxMKTsKLSAgcmV0dXJuIDA7Ci19Ci0KLWJvb2wgcHV0Zih1cGJfdGV4dHByaW50ZXIgKnAsIGNvbnN0IGNoYXIgKmZtdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXJnczsKLSAgdmFfbGlzdCBhcmdzX2NvcHk7Ci0gIGNoYXIgKnN0cjsKLSAgaW50IHdyaXR0ZW47Ci0gIGludCBsZW47Ci0gIGJvb2wgb2s7Ci0KLSAgdmFfc3RhcnQoYXJncywgZm10KTsKLQotICAvKiBSdW4gb25jZSB0byBnZXQgdGhlIGxlbmd0aCBvZiB0aGUgc3RyaW5nLiAqLwotICBfdXBiX3ZhX2NvcHkoYXJnc19jb3B5LCBhcmdzKTsKLSAgbGVuID0gX3VwYl92c25wcmludGYoTlVMTCwgMCwgZm10LCBhcmdzX2NvcHkpOwotICB2YV9lbmQoYXJnc19jb3B5KTsKLQotICAvKiArIDEgZm9yIE5VTEwgdGVybWluYXRvciAodnNwcmludGYoKSByZXF1aXJlcyBpdCBldmVuIGlmIHdlIGRvbid0KS4gKi8KLSAgc3RyID0gdXBiX2dtYWxsb2MobGVuICsgMSk7Ci0gIGlmICghc3RyKSByZXR1cm4gZmFsc2U7Ci0gIHdyaXR0ZW4gPSB2c3ByaW50ZihzdHIsIGZtdCwgYXJncyk7Ci0gIHZhX2VuZChhcmdzKTsKLSAgVVBCX0FTU0VSVF9WQVIod3JpdHRlbiwgd3JpdHRlbiA9PSBsZW4pOwotCi0gIG9rID0gdXBiX2J5dGVzc2lua19wdXRidWYocC0+b3V0cHV0XywgcC0+c3ViYywgc3RyLCBsZW4sIE5VTEwpOwotICB1cGJfZ2ZyZWUoc3RyKTsKLSAgcmV0dXJuIG9rOwotfQotCi0KLS8qIGhhbmRsZXJzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0YXRpYyBib29sIHRleHRwcmludGVyX3N0YXJ0bXNnKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGM7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBpZiAocC0+aW5kZW50X2RlcHRoXyA9PSAwKSB7Ci0gICAgdXBiX2J5dGVzc2lua19zdGFydChwLT5vdXRwdXRfLCAwLCAmcC0+c3ViYyk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHRleHRwcmludGVyX2VuZG1zZyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgdXBiX3N0YXR1cyAqcykgewotICB1cGJfdGV4dHByaW50ZXIgKnAgPSBjOwotICBVUEJfVU5VU0VEKGhkKTsKLSAgVVBCX1VOVVNFRChzKTsKLSAgaWYgKHAtPmluZGVudF9kZXB0aF8gPT0gMCkgewotICAgIHVwYl9ieXRlc3NpbmtfZW5kKHAtPm91dHB1dF8pOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIFRZUEUobmFtZSwgY3R5cGUsIGZtdCkgXAotICBzdGF0aWMgYm9vbCB0ZXh0cHJpbnRlcl9wdXQgIyMgbmFtZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3R5cGUgdmFsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdXBiX3RleHRwcmludGVyICpwID0gY2xvc3VyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IGhhbmRsZXJfZGF0YTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDSEVDSyhpbmRlbnQocCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHV0ZihwLCAiJXM6ICIgZm10LCB1cGJfZmllbGRkZWZfbmFtZShmKSwgdmFsKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENIRUNLKGVuZGZpZWxkKHApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGVycjogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotc3RhdGljIGJvb2wgdGV4dHByaW50ZXJfcHV0Ym9vbCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgdmFsKSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IGhhbmRsZXJfZGF0YTsKLSAgQ0hFQ0soaW5kZW50KHApKTsKLSAgcHV0ZihwLCAiJXM6ICVzIiwgdXBiX2ZpZWxkZGVmX25hbWUoZiksIHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpOwotICBDSEVDSyhlbmRmaWVsZChwKSk7Ci0gIHJldHVybiB0cnVlOwotZXJyOgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLSNkZWZpbmUgU1RSSU5HSUZZX0hFTFBFUih4KSAjeAotI2RlZmluZSBTVFJJTkdJRllfTUFDUk9WQUwoeCkgU1RSSU5HSUZZX0hFTFBFUih4KQotCi1UWVBFKGludDMyLCAgaW50MzJfdCwgICIlIiBQUklkMzIpCi1UWVBFKGludDY0LCAgaW50NjRfdCwgICIlIiBQUklkNjQpCi1UWVBFKHVpbnQzMiwgdWludDMyX3QsICIlIiBQUkl1MzIpCi1UWVBFKHVpbnQ2NCwgdWludDY0X3QsICIlIiBQUkl1NjQpCi1UWVBFKGZsb2F0LCAgZmxvYXQsICAgICIlLiIgU1RSSU5HSUZZX01BQ1JPVkFMKEZMVF9ESUcpICJnIikKLVRZUEUoZG91YmxlLCBkb3VibGUsICAgIiUuIiBTVFJJTkdJRllfTUFDUk9WQUwoREJMX0RJRykgImciKQotCi0jdW5kZWYgVFlQRQotCi0vKiBPdXRwdXQgYSBzeW1ib2xpYyB2YWx1ZSBmcm9tIHRoZSBlbnVtIGlmIGZvdW5kLCBlbHNlIGp1c3QgcHJpbnQgYXMgaW50MzIuICovCi1zdGF0aWMgYm9vbCB0ZXh0cHJpbnRlcl9wdXRlbnVtKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwpIHsKLSAgdXBiX3RleHRwcmludGVyICpwID0gY2xvc3VyZTsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gaGFuZGxlcl9kYXRhOwotICBjb25zdCB1cGJfZW51bWRlZiAqZW51bV9kZWYgPSB1cGJfZG93bmNhc3RfZW51bWRlZih1cGJfZmllbGRkZWZfc3ViZGVmKGYpKTsKLSAgY29uc3QgY2hhciAqbGFiZWwgPSB1cGJfZW51bWRlZl9pdG9uKGVudW1fZGVmLCB2YWwpOwotICBpZiAobGFiZWwpIHsKLSAgICBpbmRlbnQocCk7Ci0gICAgcHV0ZihwLCAiJXM6ICVzIiwgdXBiX2ZpZWxkZGVmX25hbWUoZiksIGxhYmVsKTsKLSAgICBlbmRmaWVsZChwKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoIXRleHRwcmludGVyX3B1dGludDMyKGNsb3N1cmUsIGhhbmRsZXJfZGF0YSwgdmFsKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgKnRleHRwcmludGVyX3N0YXJ0c3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IGhhbmRsZXJfZGF0YTsKLSAgVVBCX1VOVVNFRChzaXplX2hpbnQpOwotICBpbmRlbnQocCk7Ci0gIHB1dGYocCwgIiVzOiBcIiIsIHVwYl9maWVsZGRlZl9uYW1lKGYpKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBib29sIHRleHRwcmludGVyX2VuZHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX3RleHRwcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBwdXRmKHAsICJcIiIpOwotICBlbmRmaWVsZChwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzaXplX3QgdGV4dHByaW50ZXJfcHV0c3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX3RleHRwcmludGVyICpwID0gY2xvc3VyZTsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmICpmID0gaGQ7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlKTsKLSAgQ0hFQ0socHV0ZXNjYXBlZChwLCBidWYsIGxlbiwgdXBiX2ZpZWxkZGVmX3R5cGUoZikgPT0gVVBCX1RZUEVfU1RSSU5HKSk7Ci0gIHJldHVybiBsZW47Ci1lcnI6Ci0gIHJldHVybiAwOwotfQotCi1zdGF0aWMgdm9pZCAqdGV4dHByaW50ZXJfc3RhcnRzdWJtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIGNvbnN0IGNoYXIgKm5hbWUgPSBoYW5kbGVyX2RhdGE7Ci0gIENIRUNLKGluZGVudChwKSk7Ci0gIHB1dGYocCwgIiVzIHslYyIsIG5hbWUsIHAtPnNpbmdsZV9saW5lXyA/ICcgJyA6ICdcbicpOwotICBwLT5pbmRlbnRfZGVwdGhfKys7Ci0gIHJldHVybiBwOwotZXJyOgotICByZXR1cm4gVVBCX0JSRUFLOwotfQotCi1zdGF0aWMgYm9vbCB0ZXh0cHJpbnRlcl9lbmRzdWJtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcC0+aW5kZW50X2RlcHRoXy0tOwotICBDSEVDSyhpbmRlbnQocCkpOwotICB1cGJfYnl0ZXNzaW5rX3B1dGJ1ZihwLT5vdXRwdXRfLCBwLT5zdWJjLCAifSIsIDEsIE5VTEwpOwotICBDSEVDSyhlbmRmaWVsZChwKSk7Ci0gIHJldHVybiB0cnVlOwotZXJyOgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0YXRpYyB2b2lkIG9ubXJlZyhjb25zdCB2b2lkICpjLCB1cGJfaGFuZGxlcnMgKmgpIHsKLSAgY29uc3QgdXBiX21zZ2RlZiAqbSA9IHVwYl9oYW5kbGVyc19tc2dkZWYoaCk7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICBVUEJfVU5VU0VEKGMpOwotCi0gIHVwYl9oYW5kbGVyc19zZXRzdGFydG1zZyhoLCB0ZXh0cHJpbnRlcl9zdGFydG1zZywgTlVMTCk7Ci0gIHVwYl9oYW5kbGVyc19zZXRlbmRtc2coaCwgdGV4dHByaW50ZXJfZW5kbXNnLCBOVUxMKTsKLQotICBmb3IodXBiX21zZ19maWVsZF9iZWdpbigmaSwgbSk7Ci0gICAgICAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsKLSAgICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaSkpIHsKLSAgICB1cGJfZmllbGRkZWYgKmYgPSB1cGJfbXNnX2l0ZXJfZmllbGQoJmkpOwotICAgIHVwYl9oYW5kbGVyYXR0ciBhdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICAgIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmYXR0ciwgZik7Ci0gICAgc3dpdGNoICh1cGJfZmllbGRkZWZfdHlwZShmKSkgewotICAgICAgY2FzZSBVUEJfVFlQRV9JTlQzMjoKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIGYsIHRleHRwcmludGVyX3B1dGludDMyLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldGludDY0KGgsIGYsIHRleHRwcmludGVyX3B1dGludDY0LCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXR1aW50MzIoaCwgZiwgdGV4dHByaW50ZXJfcHV0dWludDMyLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXR1aW50NjQoaCwgZiwgdGV4dHByaW50ZXJfcHV0dWludDY0LCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9GTE9BVDoKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldGZsb2F0KGgsIGYsIHRleHRwcmludGVyX3B1dGZsb2F0LCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9ET1VCTEU6Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRkb3VibGUoaCwgZiwgdGV4dHByaW50ZXJfcHV0ZG91YmxlLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9CT09MOgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0Ym9vbChoLCBmLCB0ZXh0cHJpbnRlcl9wdXRib29sLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgZiwgdGV4dHByaW50ZXJfc3RhcnRzdHIsICZhdHRyKTsKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBmLCB0ZXh0cHJpbnRlcl9wdXRzdHIsICZhdHRyKTsKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHN0cihoLCBmLCB0ZXh0cHJpbnRlcl9lbmRzdHIsICZhdHRyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVQQl9UWVBFX01FU1NBR0U6IHsKLSAgICAgICAgY29uc3QgY2hhciAqbmFtZSA9Ci0gICAgICAgICAgICB1cGJfZmllbGRkZWZfaXN0YWdkZWxpbShmKQotICAgICAgICAgICAgICAgID8gc2hvcnRuYW1lKHVwYl9tc2dkZWZfZnVsbG5hbWUodXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihmKSkpCi0gICAgICAgICAgICAgICAgOiB1cGJfZmllbGRkZWZfbmFtZShmKTsKLSAgICAgICAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKCZhdHRyLCBuYW1lKTsKLSAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3VibXNnKGgsIGYsIHRleHRwcmludGVyX3N0YXJ0c3VibXNnLCAmYXR0cik7Ci0gICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2coaCwgZiwgdGV4dHByaW50ZXJfZW5kc3VibXNnLCAmYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBVUEJfVFlQRV9FTlVNOgotICAgICAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwgZiwgdGV4dHByaW50ZXJfcHV0ZW51bSwgJmF0dHIpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgdGV4dHByaW50ZXJfcmVzZXQodXBiX3RleHRwcmludGVyICpwLCBib29sIHNpbmdsZV9saW5lKSB7Ci0gIHAtPnNpbmdsZV9saW5lXyA9IHNpbmdsZV9saW5lOwotICBwLT5pbmRlbnRfZGVwdGhfID0gMDsKLX0KLQotCi0vKiBQdWJsaWMgQVBJICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi11cGJfdGV4dHByaW50ZXIgKnVwYl90ZXh0cHJpbnRlcl9jcmVhdGUodXBiX2VudiAqZW52LCBjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2J5dGVzc2luayAqb3V0cHV0KSB7Ci0gIHVwYl90ZXh0cHJpbnRlciAqcCA9IHVwYl9lbnZfbWFsbG9jKGVudiwgc2l6ZW9mKHVwYl90ZXh0cHJpbnRlcikpOwotICBpZiAoIXApIHJldHVybiBOVUxMOwotCi0gIHAtPm91dHB1dF8gPSBvdXRwdXQ7Ci0gIHVwYl9zaW5rX3Jlc2V0KCZwLT5pbnB1dF8sIGgsIHApOwotICB0ZXh0cHJpbnRlcl9yZXNldChwLCBmYWxzZSk7Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX3RleHRwcmludGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcikgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX25ld2Zyb3plbihtLCBvd25lciwgJm9ubXJlZywgTlVMTCk7Ci19Ci0KLXVwYl9zaW5rICp1cGJfdGV4dHByaW50ZXJfaW5wdXQodXBiX3RleHRwcmludGVyICpwKSB7IHJldHVybiAmcC0+aW5wdXRfOyB9Ci0KLXZvaWQgdXBiX3RleHRwcmludGVyX3NldHNpbmdsZWxpbmUodXBiX3RleHRwcmludGVyICpwLCBib29sIHNpbmdsZV9saW5lKSB7Ci0gIHAtPnNpbmdsZV9saW5lXyA9IHNpbmdsZV9saW5lOwotfQotCi0KLS8qIEluZGV4IGlzIGRlc2NyaXB0b3IgdHlwZS4gKi8KLWNvbnN0IHVpbnQ4X3QgdXBiX3BiX25hdGl2ZV93aXJlX3R5cGVzW10gPSB7Ci0gIFVQQl9XSVJFX1RZUEVfRU5EX0dST1VQLCAgICAgLyogRU5ER1JPVVAgKi8KLSAgVVBCX1dJUkVfVFlQRV82NEJJVCwgICAgICAgICAvKiBET1VCTEUgKi8KLSAgVVBCX1dJUkVfVFlQRV8zMkJJVCwgICAgICAgICAvKiBGTE9BVCAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIElOVDY0ICovCi0gIFVQQl9XSVJFX1RZUEVfVkFSSU5ULCAgICAgICAgLyogVUlOVDY0ICovCi0gIFVQQl9XSVJFX1RZUEVfVkFSSU5ULCAgICAgICAgLyogSU5UMzIgKi8KLSAgVVBCX1dJUkVfVFlQRV82NEJJVCwgICAgICAgICAvKiBGSVhFRDY0ICovCi0gIFVQQl9XSVJFX1RZUEVfMzJCSVQsICAgICAgICAgLyogRklYRUQzMiAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIEJPT0wgKi8KLSAgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQsICAgICAvKiBTVFJJTkcgKi8KLSAgVVBCX1dJUkVfVFlQRV9TVEFSVF9HUk9VUCwgICAvKiBHUk9VUCAqLwotICBVUEJfV0lSRV9UWVBFX0RFTElNSVRFRCwgICAgIC8qIE1FU1NBR0UgKi8KLSAgVVBCX1dJUkVfVFlQRV9ERUxJTUlURUQsICAgICAvKiBCWVRFUyAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIFVJTlQzMiAqLwotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCwgICAgICAgIC8qIEVOVU0gKi8KLSAgVVBCX1dJUkVfVFlQRV8zMkJJVCwgICAgICAgICAvKiBTRklYRUQzMiAqLwotICBVUEJfV0lSRV9UWVBFXzY0QklULCAgICAgICAgIC8qIFNGSVhFRDY0ICovCi0gIFVQQl9XSVJFX1RZUEVfVkFSSU5ULCAgICAgICAgLyogU0lOVDMyICovCi0gIFVQQl9XSVJFX1RZUEVfVkFSSU5ULCAgICAgICAgLyogU0lOVDY0ICovCi19OwotCi0vKiBBIGJhc2ljIGJyYW5jaC1iYXNlZCBkZWNvZGVyLCB1c2VzIDMyLWJpdCB2YWx1ZXMgdG8gZ2V0IGdvb2QgcGVyZm9ybWFuY2UKLSAqIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzIChidXQgcGVyZm9ybXMgd2VsbCBvbiA2NC1iaXRzIGFsc28pLgotICogVGhpcyBzY2hlbWUgY29tZXMgZnJvbSB0aGUgb3JpZ2luYWwgR29vZ2xlIFByb3RvYnVmIGltcGxlbWVudGF0aW9uCi0gKiAocHJvdG8yKS4gKi8KLXVwYl9kZWNvZGVyZXQgdXBiX3ZkZWNvZGVfbWF4OF9icmFuY2gzMih1cGJfZGVjb2RlcmV0IHIpIHsKLSAgdXBiX2RlY29kZXJldCBlcnIgPSB7TlVMTCwgMH07Ci0gIGNvbnN0IGNoYXIgKnAgPSByLnA7Ci0gIHVpbnQzMl90IGxvdyA9ICh1aW50MzJfdClyLnZhbDsKLSAgdWludDMyX3QgaGlnaCA9IDA7Ci0gIHVpbnQzMl90IGI7Ci0gIGIgPSAqKHArKyk7IGxvdyAgfD0gKGIgJiAweDdmVSkgPDwgMTQ7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICBiID0gKihwKyspOyBsb3cgIHw9IChiICYgMHg3ZlUpIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgbG93ICB8PSAoYiAmIDB4N2ZVKSA8PCAyODsKLSAgICAgICAgICAgICAgaGlnaCAgPSAoYiAmIDB4N2ZVKSA+PiAgNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IGhpZ2ggfD0gKGIgJiAweDdmVSkgPDwgIDM7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICBiID0gKihwKyspOyBoaWdoIHw9IChiICYgMHg3ZlUpIDw8IDEwOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgaGlnaCB8PSAoYiAmIDB4N2ZVKSA8PCAxNzsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHArKyk7IGhpZ2ggfD0gKGIgJiAweDdmVSkgPDwgMjQ7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICBiID0gKihwKyspOyBoaWdoIHw9IChiICYgMHg3ZlUpIDw8IDMxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgcmV0dXJuIGVycjsKLQotZG9uZToKLSAgci52YWwgPSAoKHVpbnQ2NF90KWhpZ2ggPDwgMzIpIHwgbG93OwotICByLnAgPSBwOwotICByZXR1cm4gcjsKLX0KLQotLyogTGlrZSB0aGUgcHJldmlvdXMsIGJ1dCB1c2VzIDY0LWJpdCB2YWx1ZXMuICovCi11cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX21heDhfYnJhbmNoNjQodXBiX2RlY29kZXJldCByKSB7Ci0gIGNvbnN0IGNoYXIgKnAgPSByLnA7Ci0gIHVpbnQ2NF90IHZhbCA9IHIudmFsOwotICB1aW50NjRfdCBiOwotICB1cGJfZGVjb2RlcmV0IGVyciA9IHtOVUxMLCAwfTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDI4OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDM1OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDQyOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDQ5OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDU2OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocCsrKTsgdmFsIHw9IChiICYgMHg3ZlUpIDw8IDYzOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgcmV0dXJuIGVycjsKLQotZG9uZToKLSAgci52YWwgPSB2YWw7Ci0gIHIucCA9IHA7Ci0gIHJldHVybiByOwotfQotCi0vKiBHaXZlbiBhbiBlbmNvZGVkIHZhcmludCB2LCByZXR1cm5zIGFuIGludGVnZXIgd2l0aCBhIHNpbmdsZSBiaXQgc2V0IHRoYXQKLSAqIGluZGljYXRlcyB0aGUgZW5kIG9mIHRoZSB2YXJpbnQuICBTdWJ0cmFjdGluZyBvbmUgZnJvbSB0aGlzIHZhbHVlIHdpbGwKLSAqIHlpZWxkIGEgbWFzayB0aGF0IGxlYXZlcyBvbmx5IGJpdHMgdGhhdCBhcmUgcGFydCBvZiB0aGUgdmFyaW50LiAgUmV0dXJucwotICogMCBpZiB0aGUgdmFyaW50IGlzIHVudGVybWluYXRlZC4gKi8KLXN0YXRpYyB1aW50NjRfdCB1cGJfZ2V0X3ZzdG9wYml0KHVpbnQ2NF90IHYpIHsKLSAgdWludDY0X3QgY2JpdHMgPSB2IHwgMHg3ZjdmN2Y3ZjdmN2Y3ZjdmVUxMOwotICByZXR1cm4gfmNiaXRzICYgKGNiaXRzKzEpOwotfQotCi0vKiBBIGJyYW5jaGxlc3MgZGVjb2Rlci4gIENyZWRpdCB0byBQYXNjYWwgTWFzc2ltaW5vIGZvciB0aGUgYml0LXR3aWRkbGluZy4gKi8KLXVwYl9kZWNvZGVyZXQgdXBiX3ZkZWNvZGVfbWF4OF9tYXNzaW1pbm8odXBiX2RlY29kZXJldCByKSB7Ci0gIHVpbnQ2NF90IGI7Ci0gIHVpbnQ2NF90IHN0b3BfYml0OwotICB1cGJfZGVjb2RlcmV0IG15X3I7Ci0gIG1lbWNweSgmYiwgci5wLCBzaXplb2YoYikpOwotICBzdG9wX2JpdCA9IHVwYl9nZXRfdnN0b3BiaXQoYik7Ci0gIGIgPSAgKGIgJiAweDdmN2Y3ZjdmN2Y3ZjdmN2ZVTEwpICYgKHN0b3BfYml0IC0gMSk7Ci0gIGIgKz0gICAgICAgYiAmIDB4MDA3ZjAwN2YwMDdmMDA3ZlVMTDsKLSAgYiArPSAgMyAqIChiICYgMHgwMDAwZmZmZjAwMDBmZmZmVUxMKTsKLSAgYiArPSAxNSAqIChiICYgMHgwMDAwMDAwMGZmZmZmZmZmVUxMKTsKLSAgaWYgKHN0b3BfYml0ID09IDApIHsKLSAgICAvKiBFcnJvcjogdW50ZXJtaW5hdGVkIHZhcmludC4gKi8KLSAgICB1cGJfZGVjb2RlcmV0IGVycl9yID0geyh2b2lkKikwLCAwfTsKLSAgICByZXR1cm4gZXJyX3I7Ci0gIH0KLSAgbXlfciA9IHVwYl9kZWNvZGVyZXRfbWFrZShyLnAgKyAoKF9fYnVpbHRpbl9jdHpsbChzdG9wX2JpdCkgKyAxKSAvIDgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHIudmFsIHwgKGIgPDwgNykpOwotICByZXR1cm4gbXlfcjsKLX0KLQotLyogQSBicmFuY2hsZXNzIGRlY29kZXIuICBDcmVkaXQgdG8gRGFuaWVsIFdyaWdodCBmb3IgdGhlIGJpdC10d2lkZGxpbmcuICovCi11cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX21heDhfd3JpZ2h0KHVwYl9kZWNvZGVyZXQgcikgewotICB1aW50NjRfdCBiOwotICB1aW50NjRfdCBzdG9wX2JpdDsKLSAgdXBiX2RlY29kZXJldCBteV9yOwotICBtZW1jcHkoJmIsIHIucCwgc2l6ZW9mKGIpKTsKLSAgc3RvcF9iaXQgPSB1cGJfZ2V0X3ZzdG9wYml0KGIpOwotICBiICY9IChzdG9wX2JpdCAtIDEpOwotICBiID0gKChiICYgMHg3ZjAwN2YwMDdmMDA3ZjAwVUxMKSA+PiAxKSB8IChiICYgMHgwMDdmMDA3ZjAwN2YwMDdmVUxMKTsKLSAgYiA9ICgoYiAmIDB4ZmZmZjAwMDBmZmZmMDAwMFVMTCkgPj4gMikgfCAoYiAmIDB4MDAwMGZmZmYwMDAwZmZmZlVMTCk7Ci0gIGIgPSAoKGIgJiAweGZmZmZmZmZmMDAwMDAwMDBVTEwpID4+IDQpIHwgKGIgJiAweDAwMDAwMDAwZmZmZmZmZmZVTEwpOwotICBpZiAoc3RvcF9iaXQgPT0gMCkgewotICAgIC8qIEVycm9yOiB1bnRlcm1pbmF0ZWQgdmFyaW50LiAqLwotICAgIHVwYl9kZWNvZGVyZXQgZXJyX3IgPSB7KHZvaWQqKTAsIDB9OwotICAgIHJldHVybiBlcnJfcjsKLSAgfQotICBteV9yID0gdXBiX2RlY29kZXJldF9tYWtlKHIucCArICgoX19idWlsdGluX2N0emxsKHN0b3BfYml0KSArIDEpIC8gOCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgci52YWwgfCAoYiA8PCAxNCkpOwotICByZXR1cm4gbXlfcjsKLX0KLQotI2xpbmUgMSAidXBiL2pzb24vcGFyc2VyLnJsIgotLyoKLSoqIHVwYjo6anNvbjo6UGFyc2VyICh1cGJfanNvbl9wYXJzZXIpCi0qKgotKiogQSBwYXJzZXIgdGhhdCB1c2VzIHRoZSBSYWdlbCBTdGF0ZSBNYWNoaW5lIENvbXBpbGVyIHRvIGdlbmVyYXRlCi0qKiB0aGUgZmluaXRlIGF1dG9tYXRhLgotKioKLSoqIFJhZ2VsIG9ubHkgbmF0aXZlbHkgaGFuZGxlcyByZWd1bGFyIGxhbmd1YWdlcywgYnV0IHdlIGNhbiBtYW51YWxseQotKiogcHJvZ3JhbSBpdCBhIGJpdCB0byBoYW5kbGUgY29udGV4dC1mcmVlIGxhbmd1YWdlcyBsaWtlIEpTT04sIGJ5IHVzaW5nCi0qKiB0aGUgImZjYWxsIiBhbmQgImZyZXQiIGNvbnN0cnVjdHMuCi0qKgotKiogVGhpcyBwYXJzZXIgY2FuIGhhbmRsZSB0aGUgYmFzaWNzLCBidXQgbmVlZHMgc2V2ZXJhbCB0aGluZ3MgdG8gYmUgZmxlc2hlZAotKiogb3V0OgotKioKLSoqIC0gaGFuZGxpbmcgb2YgdW5pY29kZSBlc2NhcGUgc2VxdWVuY2VzIChpbmNsdWRpbmcgaGlnaCBzdXJyb2dhdGUgcGFpcnMpLgotKiogLSBwcm9wZXJseSBjaGVjayBhbmQgcmVwb3J0IGVycm9ycyBmb3IgdW5rbm93biBmaWVsZHMsIHN0YWNrIG92ZXJmbG93LAotKiogICBpbXByb3BlciBhcnJheSBuZXN0aW5nIChvciBsYWNrIG9mIG5lc3RpbmcpLgotKiogLSBoYW5kbGluZyBvZiBiYXNlNjQgc2VxdWVuY2VzIHdpdGggcGFkZGluZyBjaGFyYWN0ZXJzLgotKiogLSBoYW5kbGluZyBvZiBwdXNoLWJhY2sgKG5vbi1zdWNjZXNzIHJldHVybnMgZnJvbSBzaW5rIGZ1bmN0aW9ucykuCi0qKiAtIGhhbmRsaW5nIG9mIGtleXMvZXNjYXBlLXNlcXVlbmNlcy9ldGMgdGhhdCBzcGFuIGlucHV0IGJ1ZmZlcnMuCi0qLwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLQotCi0jZGVmaW5lIFVQQl9KU09OX01BWF9ERVBUSCA2NAotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9zaW5rIHNpbms7Ci0KLSAgLyogVGhlIGN1cnJlbnQgbWVzc2FnZSBpbiB3aGljaCB3ZSdyZSBwYXJzaW5nLCBhbmQgdGhlIGZpZWxkIHdob3NlIHZhbHVlIHdlJ3JlCi0gICAqIGV4cGVjdGluZyBuZXh0LiAqLwotICBjb25zdCB1cGJfbXNnZGVmICptOwotICBjb25zdCB1cGJfZmllbGRkZWYgKmY7Ci0KLSAgLyogVGhlIHRhYmxlIG1hcHBpbmcganNvbiBuYW1lIHRvIGZpZWxkZGVmIGZvciB0aGlzIG1lc3NhZ2UuICovCi0gIHVwYl9zdHJ0YWJsZSAqbmFtZV90YWJsZTsKLQotICAvKiBXZSBhcmUgaW4gYSByZXBlYXRlZC1maWVsZCBjb250ZXh0LCByZWFkeSB0byBlbWl0IG1hcGVudHJpZXMgYXMKLSAgICogc3VibWVzc2FnZXMuIFRoaXMgZmxhZyBhbHRlcnMgdGhlIHN0YXJ0LW9mLW9iamVjdCAob3Blbi1icmFjZSkgYmVoYXZpb3IgdG8KLSAgICogYmVnaW4gYSBzZXF1ZW5jZSBvZiBtYXBlbnRyeSBtZXNzYWdlcyByYXRoZXIgdGhhbiBhIHNpbmdsZSBzdWJtZXNzYWdlLiAqLwotICBib29sIGlzX21hcDsKLQotICAvKiBXZSBhcmUgaW4gYSBtYXAtZW50cnkgbWVzc2FnZSBjb250ZXh0LiBUaGlzIGZsYWcgaXMgc2V0IHdoZW4gcGFyc2luZyB0aGUKLSAgICogdmFsdWUgZmllbGQgb2YgYSBzaW5nbGUgbWFwIGVudHJ5IGFuZCBpbmRpY2F0ZXMgdG8gYWxsIHZhbHVlLWZpZWxkIHBhcnNlcnMKLSAgICogKHN1Ym9iamVjdHMsIHN0cmluZ3MsIG51bWJlcnMsIGFuZCBib29scykgdGhhdCB0aGUgbWFwLWVudHJ5IHN1Ym1lc3NhZ2UKLSAgICogc2hvdWxkIGVuZCBhcyBzb29uIGFzIHRoZSB2YWx1ZSBpcyBwYXJzZWQuICovCi0gIGJvb2wgaXNfbWFwZW50cnk7Ci0KLSAgLyogSWYgfGlzX21hcHwgb3IgfGlzX21hcGVudHJ5fCBpcyB0cnVlLCB8bWFwZmllbGR8IHJlZmVycyB0byB0aGUgcGFyZW50Ci0gICAqIG1lc3NhZ2UncyBtYXAgZmllbGQgdGhhdCB3ZSdyZSBjdXJyZW50bHkgcGFyc2luZy4gVGhpcyBkaWZmZXJzIGZyb20gfGZ8Ci0gICAqIGJlY2F1c2UgfGZ8IGlzIHRoZSBmaWVsZCBpbiB0aGUgKmN1cnJlbnQqIG1lc3NhZ2UgKGkuZS4sIHRoZSBtYXAtZW50cnkKLSAgICogbWVzc2FnZSBpdHNlbGYpLCBub3QgdGhlIHBhcmVudCdzIGZpZWxkIHRoYXQgbGVhZHMgdG8gdGhpcyBtYXAuICovCi0gIGNvbnN0IHVwYl9maWVsZGRlZiAqbWFwZmllbGQ7Ci19IHVwYl9qc29ucGFyc2VyX2ZyYW1lOwotCi1zdHJ1Y3QgdXBiX2pzb25fcGFyc2VyIHsKLSAgdXBiX2VudiAqZW52OwotICBjb25zdCB1cGJfanNvbl9wYXJzZXJtZXRob2QgKm1ldGhvZDsKLSAgdXBiX2J5dGVzc2luayBpbnB1dF87Ci0KLSAgLyogU3RhY2sgdG8gdHJhY2sgdGhlIEpTT04gc2NvcGVzIHdlIGFyZSBpbi4gKi8KLSAgdXBiX2pzb25wYXJzZXJfZnJhbWUgc3RhY2tbVVBCX0pTT05fTUFYX0RFUFRIXTsKLSAgdXBiX2pzb25wYXJzZXJfZnJhbWUgKnRvcDsKLSAgdXBiX2pzb25wYXJzZXJfZnJhbWUgKmxpbWl0OwotCi0gIHVwYl9zdGF0dXMgc3RhdHVzOwotCi0gIC8qIFJhZ2VsJ3MgaW50ZXJuYWwgcGFyc2luZyBzdGFjayBmb3IgdGhlIHBhcnNpbmcgc3RhdGUgbWFjaGluZS4gKi8KLSAgaW50IGN1cnJlbnRfc3RhdGU7Ci0gIGludCBwYXJzZXJfc3RhY2tbVVBCX0pTT05fTUFYX0RFUFRIXTsKLSAgaW50IHBhcnNlcl90b3A7Ci0KLSAgLyogVGhlIGhhbmRsZSBmb3IgdGhlIGN1cnJlbnQgYnVmZmVyLiAqLwotICBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGU7Ci0KLSAgLyogQWNjdW11bGF0ZSBidWZmZXIuICBTZWUgZGV0YWlscyBpbiBwYXJzZXIucmwuICovCi0gIGNvbnN0IGNoYXIgKmFjY3VtdWxhdGVkOwotICBzaXplX3QgYWNjdW11bGF0ZWRfbGVuOwotICBjaGFyICphY2N1bXVsYXRlX2J1ZjsKLSAgc2l6ZV90IGFjY3VtdWxhdGVfYnVmX3NpemU7Ci0KLSAgLyogTXVsdGktcGFydCB0ZXh0IGRhdGEuICBTZWUgZGV0YWlscyBpbiBwYXJzZXIucmwuICovCi0gIGludCBtdWx0aXBhcnRfc3RhdGU7Ci0gIHVwYl9zZWxlY3Rvcl90IHN0cmluZ19zZWxlY3RvcjsKLQotICAvKiBJbnB1dCBjYXB0dXJlLiAgU2VlIGRldGFpbHMgaW4gcGFyc2VyLnJsLiAqLwotICBjb25zdCBjaGFyICpjYXB0dXJlOwotCi0gIC8qIEludGVybWVkaWF0ZSByZXN1bHQgb2YgcGFyc2luZyBhIHVuaWNvZGUgZXNjYXBlIHNlcXVlbmNlLiAqLwotICB1aW50MzJfdCBkaWdpdDsKLX07Ci0KLXN0cnVjdCB1cGJfanNvbl9wYXJzZXJtZXRob2QgewotICB1cGJfcmVmY291bnRlZCBiYXNlOwotCi0gIHVwYl9ieXRlc2hhbmRsZXIgaW5wdXRfaGFuZGxlcl87Ci0KLSAgLyogTWFpbmx5IGZvciB0aGUgcHVycG9zZXMgb2YgcmVmY291bnRpbmcsIHNvIGFsbCB0aGUgZmllbGRkZWZzIHdlIHBvaW50Ci0gICAqIHRvIHN0YXkgYWxpdmUuICovCi0gIGNvbnN0IHVwYl9tc2dkZWYgKm1zZzsKLQotICAvKiBLZXlzIGFyZSB1cGJfbXNnZGVmKiwgdmFsdWVzIGFyZSB1cGJfc3RydGFibGUgKGpzb25fbmFtZSAtPiBmaWVsZGRlZikgKi8KLSAgdXBiX2ludHRhYmxlIG5hbWVfdGFibGVzOwotfTsKLQotI2RlZmluZSBQQVJTRVJfQ0hFQ0tfUkVUVVJOKHgpIGlmICghKHgpKSByZXR1cm4gZmFsc2UKLQotLyogVXNlZCB0byBzaWduYWwgdGhhdCBhIGNhcHR1cmUgaGFzIGJlZW4gc3VzcGVuZGVkLiAqLwotc3RhdGljIGNoYXIgc3VzcGVuZF9jYXB0dXJlOwotCi1zdGF0aWMgdXBiX3NlbGVjdG9yX3QgZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZSh1cGJfanNvbl9wYXJzZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcnR5cGVfdCB0eXBlKSB7Ci0gIHVwYl9zZWxlY3Rvcl90IHNlbDsKLSAgYm9vbCBvayA9IHVwYl9oYW5kbGVyc19nZXRzZWxlY3RvcihwLT50b3AtPmYsIHR5cGUsICZzZWwpOwotICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICByZXR1cm4gc2VsOwotfQotCi1zdGF0aWMgdXBiX3NlbGVjdG9yX3QgcGFyc2VyX2dldHNlbCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgcmV0dXJuIGdldHNlbF9mb3JfaGFuZGxlcnR5cGUoCi0gICAgICBwLCB1cGJfaGFuZGxlcnNfZ2V0cHJpbWl0aXZlaGFuZGxlcnR5cGUocC0+dG9wLT5mKSk7Ci19Ci0KLXN0YXRpYyBib29sIGNoZWNrX3N0YWNrKHVwYl9qc29uX3BhcnNlciAqcCkgewotICBpZiAoKHAtPnRvcCArIDEpID09IHAtPmxpbWl0KSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJtc2coJnAtPnN0YXR1cywgIk5lc3RpbmcgdG9vIGRlZXAiKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkIHNldF9uYW1lX3RhYmxlKHVwYl9qc29uX3BhcnNlciAqcCwgdXBiX2pzb25wYXJzZXJfZnJhbWUgKmZyYW1lKSB7Ci0gIHVwYl92YWx1ZSB2OwotICBib29sIG9rID0gdXBiX2ludHRhYmxlX2xvb2t1cHB0cigmcC0+bWV0aG9kLT5uYW1lX3RhYmxlcywgZnJhbWUtPm0sICZ2KTsKLSAgVVBCX0FTU0VSVF9WQVIob2ssIG9rKTsKLSAgZnJhbWUtPm5hbWVfdGFibGUgPSB1cGJfdmFsdWVfZ2V0cHRyKHYpOwotfQotCi0vKiBUaGVyZSBhcmUgR0NDL0NsYW5nIGJ1aWx0LWlucyBmb3Igb3ZlcmZsb3cgY2hlY2tpbmcgd2hpY2ggd2UgY291bGQgc3RhcnQKLSAqIHVzaW5nIGlmIHRoZXJlIHdhcyBhbnkgcGVyZm9ybWFuY2UgYmVuZWZpdCB0byBpdC4gKi8KLQotc3RhdGljIGJvb2wgY2hlY2tlZF9hZGQoc2l6ZV90IGEsIHNpemVfdCBiLCBzaXplX3QgKmMpIHsKLSAgaWYgKFNJWkVfTUFYIC0gYSA8IGIpIHJldHVybiBmYWxzZTsKLSAgKmMgPSBhICsgYjsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgc2F0dXJhdGluZ19tdWx0aXBseShzaXplX3QgYSwgc2l6ZV90IGIpIHsKLSAgLyogc2l6ZV90IGlzIHVuc2lnbmVkLCBzbyB0aGlzIGlzIGRlZmluZWQgYmVoYXZpb3IgZXZlbiBvbiBvdmVyZmxvdy4gKi8KLSAgc2l6ZV90IHJldCA9IGEgKiBiOwotICBpZiAoYiAhPSAwICYmIHJldCAvIGIgIT0gYSkgewotICAgIHJldCA9IFNJWkVfTUFYOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLQotLyogQmFzZTY0IGRlY29kaW5nICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVE9ETyhoYWJlcm1hbik6IG1ha2UgdGhpcyBzdHJlYW1pbmcuICovCi0KLXN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBiNjR0YWJsZVtdID0gewotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDYyLyorKi8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDYzLyovICovLAotICA1Mi8qMCovLCA1My8qMSovLCA1NC8qMiovLCA1NS8qMyovLCA1Ni8qNCovLCA1Ny8qNSovLCA1OC8qNiovLCA1OS8qNyovLAotICA2MC8qOCovLCA2MS8qOSovLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgIDAvKkEqLywgIDEvKkIqLywgIDIvKkMqLywgIDMvKkQqLywgIDQvKkUqLywgIDUvKkYqLywgIDYvKkcqLywKLSAgMDcvKkgqLywgIDgvKkkqLywgIDkvKkoqLywgMTAvKksqLywgMTEvKkwqLywgMTIvKk0qLywgMTMvKk4qLywgMTQvKk8qLywKLSAgMTUvKlAqLywgMTYvKlEqLywgMTcvKlIqLywgMTgvKlMqLywgMTkvKlQqLywgMjAvKlUqLywgMjEvKlYqLywgMjIvKlcqLywKLSAgMjMvKlgqLywgMjQvKlkqLywgMjUvKloqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIDI2LyphKi8sIDI3LypiKi8sIDI4LypjKi8sIDI5LypkKi8sIDMwLyplKi8sIDMxLypmKi8sIDMyLypnKi8sCi0gIDMzLypoKi8sIDM0LyppKi8sIDM1LypqKi8sIDM2LyprKi8sIDM3LypsKi8sIDM4LyptKi8sIDM5LypuKi8sIDQwLypvKi8sCi0gIDQxLypwKi8sIDQyLypxKi8sIDQzLypyKi8sIDQ0LypzKi8sIDQ1Lyp0Ki8sIDQ2Lyp1Ki8sIDQ3Lyp2Ki8sIDQ4Lyp3Ki8sCi0gIDQ5Lyp4Ki8sIDUwLyp5Ki8sIDUxLyp6Ki8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMQotfTsKLQotLyogUmV0dXJucyB0aGUgdGFibGUgdmFsdWUgc2lnbi1leHRlbmRlZCB0byAzMiBiaXRzLiAgS25vd2luZyB0aGF0IHRoZSB1cHBlcgotICogYml0cyB3aWxsIGJlIDEgZm9yIHVucmVjb2duaXplZCBjaGFyYWN0ZXJzIG1ha2VzIGl0IGVhc2llciB0byBjaGVjayBmb3IKLSAqIHRoaXMgZXJyb3IgY29uZGl0aW9uIGxhdGVyIChzZWUgYmVsb3cpLiAqLwotaW50MzJfdCBiNjRsb29rdXAodW5zaWduZWQgY2hhciBjaCkgeyByZXR1cm4gYjY0dGFibGVbY2hdOyB9Ci0KLS8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyIGlzIG5vdCBhIHZhbGlkIGJhc2U2NCBjaGFyYWN0ZXIgb3IKLSAqIHBhZGRpbmcuICovCi1ib29sIG5vbmJhc2U2NCh1bnNpZ25lZCBjaGFyIGNoKSB7IHJldHVybiBiNjRsb29rdXAoY2gpID09IC0xICYmIGNoICE9ICc9JzsgfQotCi1zdGF0aWMgYm9vbCBiYXNlNjRfcHVzaCh1cGJfanNvbl9wYXJzZXIgKnAsIHVwYl9zZWxlY3Rvcl90IHNlbCwgY29uc3QgY2hhciAqcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgewotICBjb25zdCBjaGFyICpsaW1pdCA9IHB0ciArIGxlbjsKLSAgZm9yICg7IHB0ciA8IGxpbWl0OyBwdHIgKz0gNCkgewotICAgIHVpbnQzMl90IHZhbDsKLSAgICBjaGFyIG91dHB1dFszXTsKLQotICAgIGlmIChsaW1pdCAtIHB0ciA8IDQpIHsKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICJCYXNlNjQgaW5wdXQgZm9yIGJ5dGVzIGZpZWxkIG5vdCBhIG11bHRpcGxlIG9mIDQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShwLT50b3AtPmYpKTsKLSAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB2YWwgPSBiNjRsb29rdXAocHRyWzBdKSA8PCAxOCB8Ci0gICAgICAgICAgYjY0bG9va3VwKHB0clsxXSkgPDwgMTIgfAotICAgICAgICAgIGI2NGxvb2t1cChwdHJbMl0pIDw8IDYgIHwKLSAgICAgICAgICBiNjRsb29rdXAocHRyWzNdKTsKLQotICAgIC8qIFRlc3QgdGhlIHVwcGVyIGJpdDsgcmV0dXJucyB0cnVlIGlmIGFueSBvZiB0aGUgY2hhcmFjdGVycyByZXR1cm5lZCAtMS4gKi8KLSAgICBpZiAodmFsICYgMHg4MDAwMDAwMCkgewotICAgICAgZ290byBvdGhlcmNoYXI7Ci0gICAgfQotCi0gICAgb3V0cHV0WzBdID0gdmFsID4+IDE2OwotICAgIG91dHB1dFsxXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotICAgIG91dHB1dFsyXSA9IHZhbCAmIDB4ZmY7Ci0gICAgdXBiX3NpbmtfcHV0c3RyaW5nKCZwLT50b3AtPnNpbmssIHNlbCwgb3V0cHV0LCAzLCBOVUxMKTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLQotb3RoZXJjaGFyOgotICBpZiAobm9uYmFzZTY0KHB0clswXSkgfHwgbm9uYmFzZTY0KHB0clsxXSkgfHwgbm9uYmFzZTY0KHB0clsyXSkgfHwKLSAgICAgIG5vbmJhc2U2NChwdHJbM10pICkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAiTm9uLWJhc2U2NCBjaGFyYWN0ZXJzIGluIGJ5dGVzIGZpZWxkOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKHAtPnRvcC0+ZikpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gaWYgKHB0clsyXSA9PSAnPScpIHsKLSAgICB1aW50MzJfdCB2YWw7Ci0gICAgY2hhciBvdXRwdXQ7Ci0KLSAgICAvKiBMYXN0IGdyb3VwIGNvbnRhaW5zIG9ubHkgdHdvIGlucHV0IGJ5dGVzLCBvbmUgb3V0cHV0IGJ5dGUuICovCi0gICAgaWYgKHB0clswXSA9PSAnPScgfHwgcHRyWzFdID09ICc9JyB8fCBwdHJbM10gIT0gJz0nKSB7Ci0gICAgICBnb3RvIGJhZHBhZGRpbmc7Ci0gICAgfQotCi0gICAgdmFsID0gYjY0bG9va3VwKHB0clswXSkgPDwgMTggfAotICAgICAgICAgIGI2NGxvb2t1cChwdHJbMV0pIDw8IDEyOwotCi0gICAgYXNzZXJ0KCEodmFsICYgMHg4MDAwMDAwMCkpOwotICAgIG91dHB1dCA9IHZhbCA+PiAxNjsKLSAgICB1cGJfc2lua19wdXRzdHJpbmcoJnAtPnRvcC0+c2luaywgc2VsLCAmb3V0cHV0LCAxLCBOVUxMKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICB1aW50MzJfdCB2YWw7Ci0gICAgY2hhciBvdXRwdXRbMl07Ci0KLSAgICAvKiBMYXN0IGdyb3VwIGNvbnRhaW5zIG9ubHkgdGhyZWUgaW5wdXQgYnl0ZXMsIHR3byBvdXRwdXQgYnl0ZXMuICovCi0gICAgaWYgKHB0clswXSA9PSAnPScgfHwgcHRyWzFdID09ICc9JyB8fCBwdHJbMl0gPT0gJz0nKSB7Ci0gICAgICBnb3RvIGJhZHBhZGRpbmc7Ci0gICAgfQotCi0gICAgdmFsID0gYjY0bG9va3VwKHB0clswXSkgPDwgMTggfAotICAgICAgICAgIGI2NGxvb2t1cChwdHJbMV0pIDw8IDEyIHwKLSAgICAgICAgICBiNjRsb29rdXAocHRyWzJdKSA8PCA2OwotCi0gICAgb3V0cHV0WzBdID0gdmFsID4+IDE2OwotICAgIG91dHB1dFsxXSA9ICh2YWwgPj4gOCkgJiAweGZmOwotICAgIHVwYl9zaW5rX3B1dHN0cmluZygmcC0+dG9wLT5zaW5rLCBzZWwsIG91dHB1dCwgMiwgTlVMTCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotYmFkcGFkZGluZzoKLSAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAiSW5jb3JyZWN0IGJhc2U2NCBwYWRkaW5nIGZvciBmaWVsZDogJXMgKCUuKnMpIiwKLSAgICAgICAgICAgICAgICAgICAgIHVwYl9maWVsZGRlZl9uYW1lKHAtPnRvcC0+ZiksCi0gICAgICAgICAgICAgICAgICAgICA0LCBwdHIpOwotICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotCi0vKiBBY2N1bXVsYXRlIGJ1ZmZlciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGdW5jdGlvbmFsaXR5IGZvciBhY2N1bXVsYXRpbmcgYSBidWZmZXIuCi0gKgotICogU29tZSBwYXJ0cyBvZiB0aGUgcGFyc2VyIG5lZWQgYW4gZW50aXJlIHZhbHVlIGFzIGEgY29udGlndW91cyBzdHJpbmcuICBGb3IKLSAqIGV4YW1wbGUsIHRvIGxvb2sgdXAgYSBtZW1iZXIgbmFtZSBpbiBhIGhhc2ggdGFibGUsIG9yIHRvIHR1cm4gYSBzdHJpbmcgaW50bwotICogYSBudW1iZXIsIHRoZSByZWxldmFudCBsaWJyYXJ5IHJvdXRpbmVzIG5lZWQgdGhlIGlucHV0IHN0cmluZyB0byBiZSBpbgotICogY29udGlndW91cyBtZW1vcnksIGV2ZW4gaWYgdGhlIHZhbHVlIHNwYW5uZWQgdHdvIG9yIG1vcmUgYnVmZmVycyBpbiB0aGUKLSAqIGlucHV0LiAgVGhlc2Ugcm91dGluZXMgaGFuZGxlIHRoYXQuCi0gKgotICogSW4gdGhlIGNvbW1vbiBjYXNlIHdlIGNhbiBqdXN0IHBvaW50IHRvIHRoZSBpbnB1dCBidWZmZXIgdG8gZ2V0IHRoaXMKLSAqIGNvbnRpZ3VvdXMgc3RyaW5nIGFuZCBhdm9pZCBhbnkgYWN0dWFsIGNvcHkuICBTbyB3ZSBvcHRpbWlzdGljYWxseSBiZWdpbgotICogdGhpcyB3YXkuICBCdXQgdGhlcmUgYXJlIGEgZmV3IGNhc2VzIHdoZXJlIHdlIG11c3QgaW5zdGVhZCBjb3B5IGludG8gYQotICogc2VwYXJhdGUgYnVmZmVyOgotICoKLSAqICAgMS4gVGhlIHN0cmluZyB3YXMgbm90IGNvbnRpZ3VvdXMgaW4gdGhlIGlucHV0IChpdCBzcGFubmVkIGJ1ZmZlcnMpLgotICoKLSAqICAgMi4gVGhlIHN0cmluZyBpbmNsdWRlZCBlc2NhcGUgc2VxdWVuY2VzIHRoYXQgbmVlZCB0byBiZSBpbnRlcnByZXRlZCB0byBnZXQKLSAqICAgICAgdGhlIHRydWUgdmFsdWUgaW4gYSBjb250aWd1b3VzIGJ1ZmZlci4gKi8KLQotc3RhdGljIHZvaWQgYXNzZXJ0X2FjY3VtdWxhdGVfZW1wdHkodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIFVQQl9VTlVTRUQocCk7Ci0gIGFzc2VydChwLT5hY2N1bXVsYXRlZCA9PSBOVUxMKTsKLSAgYXNzZXJ0KHAtPmFjY3VtdWxhdGVkX2xlbiA9PSAwKTsKLX0KLQotc3RhdGljIHZvaWQgYWNjdW11bGF0ZV9jbGVhcih1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgcC0+YWNjdW11bGF0ZWQgPSBOVUxMOwotICBwLT5hY2N1bXVsYXRlZF9sZW4gPSAwOwotfQotCi0vKiBVc2VkIGludGVybmFsbHkgYnkgYWNjdW11bGF0ZV9hcHBlbmQoKS4gKi8KLXN0YXRpYyBib29sIGFjY3VtdWxhdGVfcmVhbGxvYyh1cGJfanNvbl9wYXJzZXIgKnAsIHNpemVfdCBuZWVkKSB7Ci0gIHZvaWQgKm1lbTsKLSAgc2l6ZV90IG9sZF9zaXplID0gcC0+YWNjdW11bGF0ZV9idWZfc2l6ZTsKLSAgc2l6ZV90IG5ld19zaXplID0gVVBCX01BWChvbGRfc2l6ZSwgMTI4KTsKLSAgd2hpbGUgKG5ld19zaXplIDwgbmVlZCkgewotICAgIG5ld19zaXplID0gc2F0dXJhdGluZ19tdWx0aXBseShuZXdfc2l6ZSwgMik7Ci0gIH0KLQotICBtZW0gPSB1cGJfZW52X3JlYWxsb2MocC0+ZW52LCBwLT5hY2N1bXVsYXRlX2J1Ziwgb2xkX3NpemUsIG5ld19zaXplKTsKLSAgaWYgKCFtZW0pIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZygmcC0+c3RhdHVzLCAiT3V0IG9mIG1lbW9yeSBhbGxvY2F0aW5nIGJ1ZmZlci4iKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcC0+YWNjdW11bGF0ZV9idWYgPSBtZW07Ci0gIHAtPmFjY3VtdWxhdGVfYnVmX3NpemUgPSBuZXdfc2l6ZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8qIExvZ2ljYWxseSBhcHBlbmRzIHRoZSBnaXZlbiBkYXRhIHRvIHRoZSBhcHBlbmQgYnVmZmVyLgotICogSWYgImNhbl9hbGlhcyIgaXMgdHJ1ZSwgd2Ugd2lsbCB0cnkgdG8gYXZvaWQgYWN0dWFsbHkgY29weWluZywgYnV0IHRoZSBidWZmZXIKLSAqIG11c3QgYmUgdmFsaWQgdW50aWwgdGhlIG5leHQgYWNjdW11bGF0ZV9hcHBlbmQoKSBjYWxsIChpZiBhbnkpLiAqLwotc3RhdGljIGJvb2wgYWNjdW11bGF0ZV9hcHBlbmQodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGNhbl9hbGlhcykgewotICBzaXplX3QgbmVlZDsKLQotICBpZiAoIXAtPmFjY3VtdWxhdGVkICYmIGNhbl9hbGlhcykgewotICAgIHAtPmFjY3VtdWxhdGVkID0gYnVmOwotICAgIHAtPmFjY3VtdWxhdGVkX2xlbiA9IGxlbjsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGlmICghY2hlY2tlZF9hZGQocC0+YWNjdW11bGF0ZWRfbGVuLCBsZW4sICZuZWVkKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJJbnRlZ2VyIG92ZXJmbG93LiIpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAobmVlZCA+IHAtPmFjY3VtdWxhdGVfYnVmX3NpemUgJiYgIWFjY3VtdWxhdGVfcmVhbGxvYyhwLCBuZWVkKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChwLT5hY2N1bXVsYXRlZCAhPSBwLT5hY2N1bXVsYXRlX2J1ZikgewotICAgIG1lbWNweShwLT5hY2N1bXVsYXRlX2J1ZiwgcC0+YWNjdW11bGF0ZWQsIHAtPmFjY3VtdWxhdGVkX2xlbik7Ci0gICAgcC0+YWNjdW11bGF0ZWQgPSBwLT5hY2N1bXVsYXRlX2J1ZjsKLSAgfQotCi0gIG1lbWNweShwLT5hY2N1bXVsYXRlX2J1ZiArIHAtPmFjY3VtdWxhdGVkX2xlbiwgYnVmLCBsZW4pOwotICBwLT5hY2N1bXVsYXRlZF9sZW4gKz0gbGVuOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogUmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGRhdGEgYWNjdW11bGF0ZWQgc2luY2UgdGhlIGxhc3QgYWNjdW11bGF0ZV9jbGVhcigpCi0gKiBjYWxsLCBhbmQgd3JpdGVzIHRoZSBsZW5ndGggdG8gKmxlbi4gIFRoaXMgd2l0aCBwb2ludCBlaXRoZXIgdG8gdGhlIGlucHV0Ci0gKiBidWZmZXIgb3IgYSB0ZW1wb3JhcnkgYWNjdW11bGF0ZSBidWZmZXIuICovCi1zdGF0aWMgY29uc3QgY2hhciAqYWNjdW11bGF0ZV9nZXRwdHIodXBiX2pzb25fcGFyc2VyICpwLCBzaXplX3QgKmxlbikgewotICBhc3NlcnQocC0+YWNjdW11bGF0ZWQpOwotICAqbGVuID0gcC0+YWNjdW11bGF0ZWRfbGVuOwotICByZXR1cm4gcC0+YWNjdW11bGF0ZWQ7Ci19Ci0KLQotLyogTXVsdC1wYXJ0IHRleHQgZGF0YSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV2hlbiB3ZSBoYXZlIHRleHQgZGF0YSBpbiB0aGUgaW5wdXQsIGl0IGNhbiBvZnRlbiBjb21lIGluIG11bHRpcGxlIHNlZ21lbnRzLgotICogRm9yIGV4YW1wbGUsIHRoZXJlIG1heSBiZSBzb21lIHJhdyBzdHJpbmcgZGF0YSBmb2xsb3dlZCBieSBhbiBlc2NhcGUKLSAqIHNlcXVlbmNlLiAgVGhlIHR3byBzZWdtZW50cyBhcmUgcHJvY2Vzc2VkIHdpdGggZGlmZmVyZW50IGxvZ2ljLiAgQWxzbyBidWZmZXIKLSAqIHNlYW1zIGluIHRoZSBpbnB1dCBjYW4gY2F1c2UgbXVsdGlwbGUgc2VnbWVudHMuCi0gKgotICogQXMgd2Ugc2VlIHNlZ21lbnRzLCB0aGVyZSBhcmUgdHdvIG1haW4gY2FzZXMgZm9yIGhvdyB3ZSB3YW50IHRvIHByb2Nlc3MgdGhlbToKLSAqCi0gKiAgMS4gd2Ugd2FudCB0byBwdXNoIHRoZSBjYXB0dXJlZCBpbnB1dCBkaXJlY3RseSB0byBzdHJpbmcgaGFuZGxlcnMuCi0gKgotICogIDIuIHdlIG5lZWQgdG8gYWNjdW11bGF0ZSBhbGwgdGhlIHBhcnRzIGludG8gYSBjb250aWd1b3VzIGJ1ZmZlciBmb3IgZnVydGhlcgotICogICAgIHByb2Nlc3NpbmcgKGZpZWxkIG5hbWUgbG9va3VwLCBzdHJpbmctPm51bWJlciBjb252ZXJzaW9uLCBldGMpLiAqLwotCi0vKiBUaGlzIGlzIHRoZSBzZXQgb2Ygc3RhdGVzIGZvciBwLT5tdWx0aXBhcnRfc3RhdGUuICovCi1lbnVtIHsKLSAgLyogV2UgYXJlIG5vdCBjdXJyZW50bHkgcHJvY2Vzc2luZyBtdWx0aXBhcnQgZGF0YS4gKi8KLSAgTVVMVElQQVJUX0lOQUNUSVZFID0gMCwKLQotICAvKiBXZSBhcmUgcHJvY2Vzc2luZyBtdWx0aXBhcnQgZGF0YSBieSBhY2N1bXVsYXRpbmcgaXQgaW50byBhIGNvbnRpZ3VvdXMKLSAgICogYnVmZmVyLiAqLwotICBNVUxUSVBBUlRfQUNDVU1VTEFURSA9IDEsCi0KLSAgLyogV2UgYXJlIHByb2Nlc3NpbmcgbXVsdGlwYXJ0IGRhdGEgYnkgcHVzaGluZyBlYWNoIHBhcnQgZGlyZWN0bHkgdG8gdGhlCi0gICAqIGN1cnJlbnQgc3RyaW5nIGhhbmRsZXJzLiAqLwotICBNVUxUSVBBUlRfUFVTSEVBR0VSTFkgPSAyCi19OwotCi0vKiBTdGFydCBhIG11bHRpLXBhcnQgdGV4dCB2YWx1ZSB3aGVyZSB3ZSBhY2N1bXVsYXRlIHRoZSBkYXRhIGZvciBwcm9jZXNzaW5nIGF0Ci0gKiB0aGUgZW5kLiAqLwotc3RhdGljIHZvaWQgbXVsdGlwYXJ0X3N0YXJ0YWNjdW0odXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGFzc2VydF9hY2N1bXVsYXRlX2VtcHR5KHApOwotICBhc3NlcnQocC0+bXVsdGlwYXJ0X3N0YXRlID09IE1VTFRJUEFSVF9JTkFDVElWRSk7Ci0gIHAtPm11bHRpcGFydF9zdGF0ZSA9IE1VTFRJUEFSVF9BQ0NVTVVMQVRFOwotfQotCi0vKiBTdGFydCBhIG11bHRpLXBhcnQgdGV4dCB2YWx1ZSB3aGVyZSB3ZSBpbW1lZGlhdGVseSBwdXNoIHRleHQgZGF0YSB0byBhIHN0cmluZwotICogdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gc2VsZWN0b3IuICovCi1zdGF0aWMgdm9pZCBtdWx0aXBhcnRfc3RhcnQodXBiX2pzb25fcGFyc2VyICpwLCB1cGJfc2VsZWN0b3JfdCBzZWwpIHsKLSAgYXNzZXJ0X2FjY3VtdWxhdGVfZW1wdHkocCk7Ci0gIGFzc2VydChwLT5tdWx0aXBhcnRfc3RhdGUgPT0gTVVMVElQQVJUX0lOQUNUSVZFKTsKLSAgcC0+bXVsdGlwYXJ0X3N0YXRlID0gTVVMVElQQVJUX1BVU0hFQUdFUkxZOwotICBwLT5zdHJpbmdfc2VsZWN0b3IgPSBzZWw7Ci19Ci0KLXN0YXRpYyBib29sIG11bHRpcGFydF90ZXh0KHVwYl9qc29uX3BhcnNlciAqcCwgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBjYW5fYWxpYXMpIHsKLSAgc3dpdGNoIChwLT5tdWx0aXBhcnRfc3RhdGUpIHsKLSAgICBjYXNlIE1VTFRJUEFSVF9JTkFDVElWRToKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKAotICAgICAgICAgICZwLT5zdGF0dXMsICJJbnRlcm5hbCBlcnJvcjogdW5leHBlY3RlZCBzdGF0ZSBNVUxUSVBBUlRfSU5BQ1RJVkUiKTsKLSAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgTVVMVElQQVJUX0FDQ1VNVUxBVEU6Ci0gICAgICBpZiAoIWFjY3VtdWxhdGVfYXBwZW5kKHAsIGJ1ZiwgbGVuLCBjYW5fYWxpYXMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBNVUxUSVBBUlRfUFVTSEVBR0VSTFk6IHsKLSAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSA9IGNhbl9hbGlhcyA/IHAtPmhhbmRsZSA6IE5VTEw7Ci0gICAgICB1cGJfc2lua19wdXRzdHJpbmcoJnAtPnRvcC0+c2luaywgcC0+c3RyaW5nX3NlbGVjdG9yLCBidWYsIGxlbiwgaGFuZGxlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBOb3RlOiB0aGlzIGludmFsaWRhdGVzIHRoZSBhY2N1bXVsYXRlIGJ1ZmZlciEgIENhbGwgb25seSBhZnRlciByZWFkaW5nIGl0cwotICogY29udGVudHMuICovCi1zdGF0aWMgdm9pZCBtdWx0aXBhcnRfZW5kKHVwYl9qc29uX3BhcnNlciAqcCkgewotICBhc3NlcnQocC0+bXVsdGlwYXJ0X3N0YXRlICE9IE1VTFRJUEFSVF9JTkFDVElWRSk7Ci0gIHAtPm11bHRpcGFydF9zdGF0ZSA9IE1VTFRJUEFSVF9JTkFDVElWRTsKLSAgYWNjdW11bGF0ZV9jbGVhcihwKTsKLX0KLQotCi0vKiBJbnB1dCBjYXB0dXJlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGdW5jdGlvbmFsaXR5IGZvciBjYXB0dXJpbmcgYSByZWdpb24gb2YgdGhlIGlucHV0IGFzIHRleHQuICBHcmFjZWZ1bGx5Ci0gKiBoYW5kbGVzIHRoZSBjYXNlIHdoZXJlIGEgYnVmZmVyIHNlYW0gb2NjdXJzIGluIHRoZSBtaWRkbGUgb2YgdGhlIGNhcHR1cmVkCi0gKiByZWdpb24uICovCi0KLXN0YXRpYyB2b2lkIGNhcHR1cmVfYmVnaW4odXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgYXNzZXJ0KHAtPm11bHRpcGFydF9zdGF0ZSAhPSBNVUxUSVBBUlRfSU5BQ1RJVkUpOwotICBhc3NlcnQocC0+Y2FwdHVyZSA9PSBOVUxMKTsKLSAgcC0+Y2FwdHVyZSA9IHB0cjsKLX0KLQotc3RhdGljIGJvb2wgY2FwdHVyZV9lbmQodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgYXNzZXJ0KHAtPmNhcHR1cmUpOwotICBpZiAobXVsdGlwYXJ0X3RleHQocCwgcC0+Y2FwdHVyZSwgcHRyIC0gcC0+Y2FwdHVyZSwgdHJ1ZSkpIHsKLSAgICBwLT5jYXB0dXJlID0gTlVMTDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLyogVGhpcyBpcyBjYWxsZWQgYXQgdGhlIGVuZCBvZiBlYWNoIGlucHV0IGJ1ZmZlciAoaWUuIHdoZW4gd2UgaGF2ZSBoaXQgYQotICogYnVmZmVyIHNlYW0pLiAgSWYgd2UgYXJlIGluIHRoZSBtaWRkbGUgb2YgY2FwdHVyaW5nIHRoZSBpbnB1dCwgdGhpcwotICogcHJvY2Vzc2VzIHRoZSB1bnByb2Nlc3NlZCBjYXB0dXJlIHJlZ2lvbi4gKi8KLXN0YXRpYyB2b2lkIGNhcHR1cmVfc3VzcGVuZCh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKipwdHIpIHsKLSAgaWYgKCFwLT5jYXB0dXJlKSByZXR1cm47Ci0KLSAgaWYgKG11bHRpcGFydF90ZXh0KHAsIHAtPmNhcHR1cmUsICpwdHIgLSBwLT5jYXB0dXJlLCBmYWxzZSkpIHsKLSAgICAvKiBXZSB1c2UgdGhpcyBhcyBhIHNpZ25hbCB0aGF0IHdlIHdlcmUgaW4gdGhlIG1pZGRsZSBvZiBjYXB0dXJpbmcsIGFuZAotICAgICAqIHRoYXQgY2FwdHVyaW5nIHNob3VsZCByZXN1bWUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgbmV4dCBidWZmZXIuCi0gICAgICogCi0gICAgICogV2UgY2FuJ3QgdXNlICpwdHIgaGVyZSwgYmVjYXVzZSB3ZSBoYXZlIG5vIGd1YXJhbnRlZSB0aGF0IHRoaXMgcG9pbnRlcgotICAgICAqIHdpbGwgYmUgdmFsaWQgd2hlbiB3ZSByZXN1bWUgKGlmIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSBpcyBmcmVlZCwgdGhlbgotICAgICAqIHVzaW5nIHRoZSBwb2ludGVyIGF0IGFsbCwgZXZlbiB0byBjb21wYXJlIHRvIE5VTEwsIGlzIGxpa2VseSB1bmRlZmluZWQKLSAgICAgKiBiZWhhdmlvcikuICovCi0gICAgcC0+Y2FwdHVyZSA9ICZzdXNwZW5kX2NhcHR1cmU7Ci0gIH0gZWxzZSB7Ci0gICAgLyogTmVlZCB0byBiYWNrIHVwIHRoZSBwb2ludGVyIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGNhcHR1cmUsIHNpbmNlCi0gICAgICogd2Ugd2VyZSBub3QgYWJsZSB0byBhY3R1YWxseSBwcmVzZXJ2ZSBpdC4gKi8KLSAgICAqcHRyID0gcC0+Y2FwdHVyZTsKLSAgfQotfQotCi1zdGF0aWMgdm9pZCBjYXB0dXJlX3Jlc3VtZSh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKnB0cikgewotICBpZiAocC0+Y2FwdHVyZSkgewotICAgIGFzc2VydChwLT5jYXB0dXJlID09ICZzdXNwZW5kX2NhcHR1cmUpOwotICAgIHAtPmNhcHR1cmUgPSBwdHI7Ci0gIH0KLX0KLQotCi0vKiBDYWxsYmFja3MgZnJvbSB0aGUgcGFyc2VyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUaGVzZSBhcmUgdGhlIGZ1bmN0aW9ucyBjYWxsZWQgZGlyZWN0bHkgZnJvbSB0aGUgcGFyc2VyIGl0c2VsZi4KLSAqIFdlIGRlZmluZSB0aGVzZSBpbiB0aGUgc2FtZSBvcmRlciBhcyB0aGVpciBkZWNsYXJhdGlvbnMgaW4gdGhlIHBhcnNlci4gKi8KLQotc3RhdGljIGNoYXIgZXNjYXBlX2NoYXIoY2hhciBpbikgewotICBzd2l0Y2ggKGluKSB7Ci0gICAgY2FzZSAncic6IHJldHVybiAnXHInOwotICAgIGNhc2UgJ3QnOiByZXR1cm4gJ1x0JzsKLSAgICBjYXNlICduJzogcmV0dXJuICdcbic7Ci0gICAgY2FzZSAnZic6IHJldHVybiAnXGYnOwotICAgIGNhc2UgJ2InOiByZXR1cm4gJ1xiJzsKLSAgICBjYXNlICcvJzogcmV0dXJuICcvJzsKLSAgICBjYXNlICciJzogcmV0dXJuICciJzsKLSAgICBjYXNlICdcXCc6IHJldHVybiAnXFwnOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoMCk7Ci0gICAgICByZXR1cm4gJ3gnOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGVzY2FwZSh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKnB0cikgewotICBjaGFyIGNoID0gZXNjYXBlX2NoYXIoKnB0cik7Ci0gIHJldHVybiBtdWx0aXBhcnRfdGV4dChwLCAmY2gsIDEsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfaGV4KHVwYl9qc29uX3BhcnNlciAqcCkgewotICBwLT5kaWdpdCA9IDA7Ci19Ci0KLXN0YXRpYyB2b2lkIGhleGRpZ2l0KHVwYl9qc29uX3BhcnNlciAqcCwgY29uc3QgY2hhciAqcHRyKSB7Ci0gIGNoYXIgY2ggPSAqcHRyOwotCi0gIHAtPmRpZ2l0IDw8PSA0OwotCi0gIGlmIChjaCA+PSAnMCcgJiYgY2ggPD0gJzknKSB7Ci0gICAgcC0+ZGlnaXQgKz0gKGNoIC0gJzAnKTsKLSAgfSBlbHNlIGlmIChjaCA+PSAnYScgJiYgY2ggPD0gJ2YnKSB7Ci0gICAgcC0+ZGlnaXQgKz0gKChjaCAtICdhJykgKyAxMCk7Ci0gIH0gZWxzZSB7Ci0gICAgYXNzZXJ0KGNoID49ICdBJyAmJiBjaCA8PSAnRicpOwotICAgIHAtPmRpZ2l0ICs9ICgoY2ggLSAnQScpICsgMTApOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGVuZF9oZXgodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIHVpbnQzMl90IGNvZGVwb2ludCA9IHAtPmRpZ2l0OwotCi0gIC8qIGVtaXQgdGhlIGNvZGVwb2ludCBhcyBVVEYtOC4gKi8KLSAgY2hhciB1dGY4WzNdOyAvKiBzdXBwb3J0IFx1MDAwMCAtLSBcdUZGRkYgLS0gbmVlZCBvbmx5IHRocmVlIGJ5dGVzLiAqLwotICBpbnQgbGVuZ3RoID0gMDsKLSAgaWYgKGNvZGVwb2ludCA8PSAweDdGKSB7Ci0gICAgdXRmOFswXSA9IGNvZGVwb2ludDsKLSAgICBsZW5ndGggPSAxOwotICB9IGVsc2UgaWYgKGNvZGVwb2ludCA8PSAweDA3RkYpIHsKLSAgICB1dGY4WzFdID0gKGNvZGVwb2ludCAmIDB4M0YpIHwgMHg4MDsKLSAgICBjb2RlcG9pbnQgPj49IDY7Ci0gICAgdXRmOFswXSA9IChjb2RlcG9pbnQgJiAweDFGKSB8IDB4QzA7Ci0gICAgbGVuZ3RoID0gMjsKLSAgfSBlbHNlIC8qIGNvZGVwb2ludCA8PSAweEZGRkYgKi8gewotICAgIHV0ZjhbMl0gPSAoY29kZXBvaW50ICYgMHgzRikgfCAweDgwOwotICAgIGNvZGVwb2ludCA+Pj0gNjsKLSAgICB1dGY4WzFdID0gKGNvZGVwb2ludCAmIDB4M0YpIHwgMHg4MDsKLSAgICBjb2RlcG9pbnQgPj49IDY7Ci0gICAgdXRmOFswXSA9IChjb2RlcG9pbnQgJiAweDBGKSB8IDB4RTA7Ci0gICAgbGVuZ3RoID0gMzsKLSAgfQotICAvKiBUT0RPKGhhYmVybWFuKTogSGFuZGxlIGhpZ2ggc3Vycm9nYXRlczogaWYgY29kZXBvaW50IGlzIGEgaGlnaCBzdXJyb2dhdGUKLSAgICogd2UgaGF2ZSB0byB3YWl0IGZvciB0aGUgbmV4dCBlc2NhcGUgdG8gZ2V0IHRoZSBmdWxsIGNvZGUgcG9pbnQpLiAqLwotCi0gIHJldHVybiBtdWx0aXBhcnRfdGV4dChwLCB1dGY4LCBsZW5ndGgsIGZhbHNlKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfdGV4dCh1cGJfanNvbl9wYXJzZXIgKnAsIGNvbnN0IGNoYXIgKnB0cikgewotICBjYXB0dXJlX2JlZ2luKHAsIHB0cik7Ci19Ci0KLXN0YXRpYyBib29sIGVuZF90ZXh0KHVwYl9qc29uX3BhcnNlciAqcCwgY29uc3QgY2hhciAqcHRyKSB7Ci0gIHJldHVybiBjYXB0dXJlX2VuZChwLCBwdHIpOwotfQotCi1zdGF0aWMgdm9pZCBzdGFydF9udW1iZXIodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgbXVsdGlwYXJ0X3N0YXJ0YWNjdW0ocCk7Ci0gIGNhcHR1cmVfYmVnaW4ocCwgcHRyKTsKLX0KLQotc3RhdGljIGJvb2wgcGFyc2VfbnVtYmVyKHVwYl9qc29uX3BhcnNlciAqcCk7Ci0KLXN0YXRpYyBib29sIGVuZF9udW1iZXIodXBiX2pzb25fcGFyc2VyICpwLCBjb25zdCBjaGFyICpwdHIpIHsKLSAgaWYgKCFjYXB0dXJlX2VuZChwLCBwdHIpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHBhcnNlX251bWJlcihwKTsKLX0KLQotc3RhdGljIGJvb2wgcGFyc2VfbnVtYmVyKHVwYl9qc29uX3BhcnNlciAqcCkgewotICBzaXplX3QgbGVuOwotICBjb25zdCBjaGFyICpidWY7Ci0gIGNvbnN0IGNoYXIgKm15ZW5kOwotICBjaGFyICplbmQ7Ci0KLSAgLyogc3RydG9sKCkgYW5kIGZyaWVuZHMgdW5mb3J0dW5hdGVseSBkbyBub3Qgc3VwcG9ydCBzcGVjaWZ5aW5nIHRoZSBsZW5ndGggb2YKLSAgICogdGhlIGlucHV0IHN0cmluZywgc28gd2UgbmVlZCB0byBmb3JjZSBhIGNvcHkgaW50byBhIE5VTEwtdGVybWluYXRlZCBidWZmZXIuICovCi0gIGlmICghbXVsdGlwYXJ0X3RleHQocCwgIlwwIiwgMSwgZmFsc2UpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgYnVmID0gYWNjdW11bGF0ZV9nZXRwdHIocCwgJmxlbik7Ci0gIG15ZW5kID0gYnVmICsgbGVuIC0gMTsgIC8qIE9uZSBmb3IgTlVMTC4gKi8KLQotICAvKiBYWFg6IFdlIGFyZSB1c2luZyBzdHJ0b2wgdG8gcGFyc2UgaW50ZWdlcnMsIGJ1dCB0aGlzIGlzIHdyb25nIGFzIGV2ZW4KLSAgICogaW50ZWdlcnMgY2FuIGJlIHJlcHJlc2VudGVkIGFzIDFlNiAoZm9yIGV4YW1wbGUpLCB3aGljaCBzdHJ0b2wgY2FuJ3QKLSAgICogaGFuZGxlIGNvcnJlY3RseS4KLSAgICoKLSAgICogWFhYOiBBbHNvLCB3ZSBjYW4ndCBoYW5kbGUgbGFyZ2UgaW50ZWdlcnMgcHJvcGVybHkgYmVjYXVzZSBzdHJ0b1t1XWxsCi0gICAqIGlzbid0IGluIEM4OS4KLSAgICoKLSAgICogWFhYOiBBbHNvLCB3ZSBkb24ndCBwcm9wZXJseSBjaGVjayBmbG9hdHMgZm9yIG92ZXJmbG93LCBzaW5jZSBzdHJ0b2YKLSAgICogaXNuJ3QgaW4gQzg5LiAqLwotICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKHAtPnRvcC0+ZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQzMjogewotICAgICAgbG9uZyB2YWwgPSBzdHJ0b2wocC0+YWNjdW11bGF0ZWQsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IElOVDMyX01BWCB8fCB2YWwgPCBJTlQzMl9NSU4gfHwgZXJybm8gPT0gRVJBTkdFIHx8IGVuZCAhPSBteWVuZCkKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICBlbHNlCi0gICAgICAgIHVwYl9zaW5rX3B1dGludDMyKCZwLT50b3AtPnNpbmssIHBhcnNlcl9nZXRzZWwocCksIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDogewotICAgICAgbG9uZyBsb25nIHZhbCA9IHN0cnRvbChwLT5hY2N1bXVsYXRlZCwgJmVuZCwgMCk7Ci0gICAgICBpZiAodmFsID4gSU5UNjRfTUFYIHx8IHZhbCA8IElOVDY0X01JTiB8fCBlcnJubyA9PSBFUkFOR0UgfHwgZW5kICE9IG15ZW5kKQotICAgICAgICBnb3RvIGVycjsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX3NpbmtfcHV0aW50NjQoJnAtPnRvcC0+c2luaywgcGFyc2VyX2dldHNlbChwKSwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjogewotICAgICAgdW5zaWduZWQgbG9uZyB2YWwgPSBzdHJ0b3VsKHAtPmFjY3VtdWxhdGVkLCAmZW5kLCAwKTsKLSAgICAgIGlmICh2YWwgPiBVSU5UMzJfTUFYIHx8IGVycm5vID09IEVSQU5HRSB8fCBlbmQgIT0gbXllbmQpCi0gICAgICAgIGdvdG8gZXJyOwotICAgICAgZWxzZQotICAgICAgICB1cGJfc2lua19wdXR1aW50MzIoJnAtPnRvcC0+c2luaywgcGFyc2VyX2dldHNlbChwKSwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQ2NDogewotICAgICAgdW5zaWduZWQgbG9uZyBsb25nIHZhbCA9IHN0cnRvdWwocC0+YWNjdW11bGF0ZWQsICZlbmQsIDApOwotICAgICAgaWYgKHZhbCA+IFVJTlQ2NF9NQVggfHwgZXJybm8gPT0gRVJBTkdFIHx8IGVuZCAhPSBteWVuZCkKLSAgICAgICAgZ290byBlcnI7Ci0gICAgICBlbHNlCi0gICAgICAgIHVwYl9zaW5rX3B1dHVpbnQ2NCgmcC0+dG9wLT5zaW5rLCBwYXJzZXJfZ2V0c2VsKHApLCB2YWwpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfRE9VQkxFOiB7Ci0gICAgICBkb3VibGUgdmFsID0gc3RydG9kKHAtPmFjY3VtdWxhdGVkLCAmZW5kKTsKLSAgICAgIGlmIChlcnJubyA9PSBFUkFOR0UgfHwgZW5kICE9IG15ZW5kKQotICAgICAgICBnb3RvIGVycjsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX3NpbmtfcHV0ZG91YmxlKCZwLT50b3AtPnNpbmssIHBhcnNlcl9nZXRzZWwocCksIHZhbCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBVUEJfVFlQRV9GTE9BVDogewotICAgICAgZmxvYXQgdmFsID0gc3RydG9kKHAtPmFjY3VtdWxhdGVkLCAmZW5kKTsKLSAgICAgIGlmIChlcnJubyA9PSBFUkFOR0UgfHwgZW5kICE9IG15ZW5kKQotICAgICAgICBnb3RvIGVycjsKLSAgICAgIGVsc2UKLSAgICAgICAgdXBiX3NpbmtfcHV0ZmxvYXQoJnAtPnRvcC0+c2luaywgcGFyc2VyX2dldHNlbChwKSwgdmFsKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgYXNzZXJ0KGZhbHNlKTsKLSAgfQotCi0gIG11bHRpcGFydF9lbmQocCk7Ci0KLSAgcmV0dXJuIHRydWU7Ci0KLWVycjoKLSAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsICJlcnJvciBwYXJzaW5nIG51bWJlcjogJXMiLCBidWYpOwotICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gIG11bHRpcGFydF9lbmQocCk7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgcGFyc2VyX3B1dGJvb2wodXBiX2pzb25fcGFyc2VyICpwLCBib29sIHZhbCkgewotICBib29sIG9rOwotCi0gIGlmICh1cGJfZmllbGRkZWZfdHlwZShwLT50b3AtPmYpICE9IFVQQl9UWVBFX0JPT0wpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycmYoJnAtPnN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgIkJvb2xlYW4gdmFsdWUgc3BlY2lmaWVkIGZvciBub24tYm9vbCBmaWVsZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShwLT50b3AtPmYpKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgb2sgPSB1cGJfc2lua19wdXRib29sKCZwLT50b3AtPnNpbmssIHBhcnNlcl9nZXRzZWwocCksIHZhbCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHN0YXJ0X3N0cmluZ3ZhbCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgYXNzZXJ0KHAtPnRvcC0+Zik7Ci0KLSAgaWYgKHVwYl9maWVsZGRlZl9pc3N0cmluZyhwLT50b3AtPmYpKSB7Ci0gICAgdXBiX2pzb25wYXJzZXJfZnJhbWUgKmlubmVyOwotICAgIHVwYl9zZWxlY3Rvcl90IHNlbDsKLQotICAgIGlmICghY2hlY2tfc3RhY2socCkpIHJldHVybiBmYWxzZTsKLQotICAgIC8qIFN0YXJ0IGEgbmV3IHBhcnNlciBmcmFtZTogcGFyc2VyIGZyYW1lcyBjb3JyZXNwb25kIG9uZS10by1vbmUgd2l0aAotICAgICAqIGhhbmRsZXIgZnJhbWVzLCBhbmQgc3RyaW5nIGV2ZW50cyBvY2N1ciBpbiBhIHN1Yi1mcmFtZS4gKi8KLSAgICBpbm5lciA9IHAtPnRvcCArIDE7Ci0gICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNUUik7Ci0gICAgdXBiX3Npbmtfc3RhcnRzdHIoJnAtPnRvcC0+c2luaywgc2VsLCAwLCAmaW5uZXItPnNpbmspOwotICAgIGlubmVyLT5tID0gcC0+dG9wLT5tOwotICAgIGlubmVyLT5mID0gcC0+dG9wLT5mOwotICAgIGlubmVyLT5uYW1lX3RhYmxlID0gTlVMTDsKLSAgICBpbm5lci0+aXNfbWFwID0gZmFsc2U7Ci0gICAgaW5uZXItPmlzX21hcGVudHJ5ID0gZmFsc2U7Ci0gICAgcC0+dG9wID0gaW5uZXI7Ci0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX3R5cGUocC0+dG9wLT5mKSA9PSBVUEJfVFlQRV9TVFJJTkcpIHsKLSAgICAgIC8qIEZvciBTVFJJTkcgZmllbGRzIHdlIHB1c2ggZGF0YSBkaXJlY3RseSB0byB0aGUgaGFuZGxlcnMgYXMgaXQgaXMKLSAgICAgICAqIHBhcnNlZC4gIFdlIGRvbid0IGRvIHRoaXMgeWV0IGZvciBCWVRFUyBmaWVsZHMsIGJlY2F1c2Ugb3VyIGJhc2U2NAotICAgICAgICogZGVjb2RlciBpcyBub3Qgc3RyZWFtaW5nLgotICAgICAgICoKLSAgICAgICAqIFRPRE8oaGFiZXJtYW4pOiBtYWtlIGJhc2U2NCBkZWNvZGluZyBzdHJlYW1pbmcgYWxzby4gKi8KLSAgICAgIG11bHRpcGFydF9zdGFydChwLCBnZXRzZWxfZm9yX2hhbmRsZXJ0eXBlKHAsIFVQQl9IQU5ETEVSX1NUUklORykpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG11bHRpcGFydF9zdGFydGFjY3VtKHApOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9IGVsc2UgaWYgKHVwYl9maWVsZGRlZl90eXBlKHAtPnRvcC0+ZikgPT0gVVBCX1RZUEVfRU5VTSkgewotICAgIC8qIE5vIG5lZWQgdG8gcHVzaCBhIGZyYW1lIC0tIHN5bWJvbGljIGVudW0gbmFtZXMgaW4gcXVvdGVzIHJlbWFpbiBpbiB0aGUKLSAgICAgKiBjdXJyZW50IHBhcnNlciBmcmFtZS4KLSAgICAgKgotICAgICAqIEVudW0gc3RyaW5nIHZhbHVlcyBtdXN0IGFjY3VtdWxhdGUgc28gd2UgY2FuIGxvb2sgdXAgdGhlIHZhbHVlIGluIGEgdGFibGUKLSAgICAgKiBvbmNlIGl0IGlzIGNvbXBsZXRlLiAqLwotICAgIG11bHRpcGFydF9zdGFydGFjY3VtKHApOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIHNwZWNpZmllZCBmb3Igbm9uLXN0cmluZy9ub24tZW51bSBmaWVsZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShwLT50b3AtPmYpKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyBib29sIGVuZF9zdHJpbmd2YWwodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGJvb2wgb2sgPSB0cnVlOwotCi0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUocC0+dG9wLT5mKSkgewotICAgIGNhc2UgVVBCX1RZUEVfQllURVM6Ci0gICAgICBpZiAoIWJhc2U2NF9wdXNoKHAsIGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfU1RSSU5HKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcC0+YWNjdW11bGF0ZWQsIHAtPmFjY3VtdWxhdGVkX2xlbikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLyogRmFsbCB0aHJvdWdoLiAqLwotCi0gICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6IHsKLSAgICAgIHVwYl9zZWxlY3Rvcl90IHNlbCA9IGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfRU5EU1RSKTsKLSAgICAgIHVwYl9zaW5rX2VuZHN0cigmcC0+dG9wLT5zaW5rLCBzZWwpOwotICAgICAgcC0+dG9wLS07Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIFVQQl9UWVBFX0VOVU06IHsKLSAgICAgIC8qIFJlc29sdmUgZW51bSBzeW1ib2xpYyBuYW1lIHRvIGludGVnZXIgdmFsdWUuICovCi0gICAgICBjb25zdCB1cGJfZW51bWRlZiAqZW51bWRlZiA9Ci0gICAgICAgICAgKGNvbnN0IHVwYl9lbnVtZGVmKil1cGJfZmllbGRkZWZfc3ViZGVmKHAtPnRvcC0+Zik7Ci0KLSAgICAgIHNpemVfdCBsZW47Ci0gICAgICBjb25zdCBjaGFyICpidWYgPSBhY2N1bXVsYXRlX2dldHB0cihwLCAmbGVuKTsKLQotICAgICAgaW50MzJfdCBpbnRfdmFsID0gMDsKLSAgICAgIG9rID0gdXBiX2VudW1kZWZfbnRvaShlbnVtZGVmLCBidWYsIGxlbiwgJmludF92YWwpOwotCi0gICAgICBpZiAob2spIHsKLSAgICAgICAgdXBiX3NlbGVjdG9yX3Qgc2VsID0gcGFyc2VyX2dldHNlbChwKTsKLSAgICAgICAgdXBiX3NpbmtfcHV0aW50MzIoJnAtPnRvcC0+c2luaywgc2VsLCBpbnRfdmFsKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLCAiRW51bSB2YWx1ZSB1bmtub3duOiAnJS4qcyciLCBsZW4sIGJ1Zik7Ci0gICAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgIH0KLQotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgZGVmYXVsdDoKLSAgICAgIGFzc2VydChmYWxzZSk7Ci0gICAgICB1cGJfc3RhdHVzX3NldGVycm1zZygmcC0+c3RhdHVzLCAiSW50ZXJuYWwgZXJyb3IgaW4gSlNPTiBkZWNvZGVyIik7Ci0gICAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgICBvayA9IGZhbHNlOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBtdWx0aXBhcnRfZW5kKHApOwotCi0gIHJldHVybiBvazsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfbWVtYmVyKHVwYl9qc29uX3BhcnNlciAqcCkgewotICBhc3NlcnQoIXAtPnRvcC0+Zik7Ci0gIG11bHRpcGFydF9zdGFydGFjY3VtKHApOwotfQotCi0vKiBIZWxwZXI6IGludm9rZWQgZHVyaW5nIHBhcnNlX21hcGVudHJ5KCkgdG8gZW1pdCB0aGUgbWFwZW50cnkgbWVzc2FnZSdzIGtleQotICogZmllbGQgYmFzZWQgb24gdGhlIGN1cnJlbnQgY29udGVudHMgb2YgdGhlIGFjY3VtdWxhdGUgYnVmZmVyLiAqLwotc3RhdGljIGJvb2wgcGFyc2VfbWFwZW50cnlfa2V5KHVwYl9qc29uX3BhcnNlciAqcCkgewotCi0gIHNpemVfdCBsZW47Ci0gIGNvbnN0IGNoYXIgKmJ1ZiA9IGFjY3VtdWxhdGVfZ2V0cHRyKHAsICZsZW4pOwotCi0gIC8qIEVtaXQgdGhlIGtleSBmaWVsZC4gV2UgZG8gYSBiaXQgb2YgYWQtaG9jIHBhcnNpbmcgaGVyZSBiZWNhdXNlIHRoZQotICAgKiBwYXJzZXIgc3RhdGUgbWFjaGluZSBoYXMgYWxyZWFkeSBkZWNpZGVkIHRoYXQgdGhpcyBpcyBhIHN0cmluZyBmaWVsZAotICAgKiBuYW1lLCBhbmQgd2UgYXJlIHJlaW50ZXJwcmV0aW5nIGl0IGFzIHNvbWUgYXJiaXRyYXJ5IGtleSB0eXBlLiBJbgotICAgKiBwYXJ0aWN1bGFyLCBpbnRlZ2VyIGFuZCBib29sIGtleXMgYXJlIHF1b3RlZCwgc28gd2UgbmVlZCB0byBwYXJzZSB0aGUKLSAgICogcXVvdGVkIHN0cmluZyBjb250ZW50cyBoZXJlLiAqLwotCi0gIHAtPnRvcC0+ZiA9IHVwYl9tc2dkZWZfaXRvZihwLT50b3AtPm0sIFVQQl9NQVBFTlRSWV9LRVkpOwotICBpZiAocC0+dG9wLT5mID09IE5VTEwpIHsKLSAgICB1cGJfc3RhdHVzX3NldGVycm1zZygmcC0+c3RhdHVzLCAibWFwZW50cnkgbWVzc2FnZSBoYXMgbm8ga2V5Iik7Ci0gICAgdXBiX2Vudl9yZXBvcnRlcnJvcihwLT5lbnYsICZwLT5zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKHAtPnRvcC0+ZikpIHsKLSAgICBjYXNlIFVQQl9UWVBFX0lOVDMyOgotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UMzI6Ci0gICAgY2FzZSBVUEJfVFlQRV9VSU5UNjQ6Ci0gICAgICAvKiBJbnZva2UgZW5kX251bWJlci4gVGhlIGFjY3VtIGJ1ZmZlciBoYXMgdGhlIG51bWJlcidzIHRleHQgYWxyZWFkeS4gKi8KLSAgICAgIGlmICghcGFyc2VfbnVtYmVyKHApKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDoKLSAgICAgIGlmIChsZW4gPT0gNCAmJiAhc3RybmNtcChidWYsICJ0cnVlIiwgNCkpIHsKLSAgICAgICAgaWYgKCFwYXJzZXJfcHV0Ym9vbChwLCB0cnVlKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChsZW4gPT0gNSAmJiAhc3RybmNtcChidWYsICJmYWxzZSIsIDUpKSB7Ci0gICAgICAgIGlmICghcGFyc2VyX3B1dGJvb2wocCwgZmFsc2UpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICB1cGJfc3RhdHVzX3NldGVycm1zZygmcC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiTWFwIGJvb2wga2V5IG5vdCAndHJ1ZScgb3IgJ2ZhbHNlJyIpOwotICAgICAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIG11bHRpcGFydF9lbmQocCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1NUUklORzoKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOiB7Ci0gICAgICB1cGJfc2luayBzdWJzaW5rOwotICAgICAgdXBiX3NlbGVjdG9yX3Qgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNUUik7Ci0gICAgICB1cGJfc2lua19zdGFydHN0cigmcC0+dG9wLT5zaW5rLCBzZWwsIGxlbiwgJnN1YnNpbmspOwotICAgICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVFJJTkcpOwotICAgICAgdXBiX3NpbmtfcHV0c3RyaW5nKCZzdWJzaW5rLCBzZWwsIGJ1ZiwgbGVuLCBOVUxMKTsKLSAgICAgIHNlbCA9IGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfRU5EU1RSKTsKLSAgICAgIHVwYl9zaW5rX2VuZHN0cigmc3Vic2luaywgc2VsKTsKLSAgICAgIG11bHRpcGFydF9lbmQocCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJJbnZhbGlkIGZpZWxkIHR5cGUgZm9yIG1hcCBrZXkiKTsKLSAgICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0vKiBIZWxwZXI6IGVtaXQgb25lIG1hcCBlbnRyeSAoYXMgYSBzdWJtZXNzYWdlIGluIHRoZSBtYXAgZmllbGQgc2VxdWVuY2UpLiBUaGlzCi0gKiBpcyBpbnZva2VkIGZyb20gZW5kX21lbWJlcm5hbWUoKSwgYXQgdGhlIGVuZCBvZiB0aGUgbWFwIGVudHJ5J3Mga2V5IHN0cmluZywKLSAqIHdpdGggdGhlIG1hcCBrZXkgaW4gdGhlIGFjY3VtdWxhdGUgYnVmZmVyLiBJdCBwYXJzZXMgdGhlIGtleSBmcm9tIHRoYXQKLSAqIGJ1ZmZlciwgZW1pdHMgdGhlIGhhbmRsZXIgY2FsbHMgdG8gc3RhcnQgdGhlIG1hcGVudHJ5IHN1Ym1lc3NhZ2UgKHNldHRpbmcgdXAKLSAqIGl0cyBzdWJmcmFtZSBpbiB0aGUgcHJvY2VzcyksIGFuZCBzZXRzIHVwIHN0YXRlIGluIHRoZSBzdWJmcmFtZSBzbyB0aGF0IHRoZQotICogdmFsdWUgcGFyc2VyIChpbnZva2VkIG5leHQpIHdpbGwgZW1pdCB0aGUgbWFwZW50cnkncyB2YWx1ZSBmaWVsZCBhbmQgdGhlbgotICogZW5kIHRoZSBtYXBlbnRyeSBtZXNzYWdlLiAqLwotCi1zdGF0aWMgYm9vbCBoYW5kbGVfbWFwZW50cnkodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGNvbnN0IHVwYl9maWVsZGRlZiAqbWFwZmllbGQ7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm1hcGVudHJ5bXNnOwotICB1cGJfanNvbnBhcnNlcl9mcmFtZSAqaW5uZXI7Ci0gIHVwYl9zZWxlY3Rvcl90IHNlbDsKLQotICAvKiBNYXAgZW50cnk6IHAtPnRvcC0+c2luayBpcyB0aGUgc2VxIGZyYW1lLCBzbyB3ZSBuZWVkIHRvIHN0YXJ0IGEgZnJhbWUKLSAgICogZm9yIHRoZSBtYXBlbnRyeSBpdHNlbGYsIGFuZCB0aGVuIHNldCB8ZnwgaW4gdGhhdCBmcmFtZSBzbyB0aGF0IHRoZSBtYXAKLSAgICogdmFsdWUgZmllbGQgaXMgcGFyc2VkLCBhbmQgYWxzbyBzZXQgYSBmbGFnIHRvIGVuZCB0aGUgZnJhbWUgYWZ0ZXIgdGhlCi0gICAqIG1hcC1lbnRyeSB2YWx1ZSBpcyBwYXJzZWQuICovCi0gIGlmICghY2hlY2tfc3RhY2socCkpIHJldHVybiBmYWxzZTsKLQotICBtYXBmaWVsZCA9IHAtPnRvcC0+bWFwZmllbGQ7Ci0gIG1hcGVudHJ5bXNnID0gdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihtYXBmaWVsZCk7Ci0KLSAgaW5uZXIgPSBwLT50b3AgKyAxOwotICBwLT50b3AtPmYgPSBtYXBmaWVsZDsKLSAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNVQk1TRyk7Ci0gIHVwYl9zaW5rX3N0YXJ0c3VibXNnKCZwLT50b3AtPnNpbmssIHNlbCwgJmlubmVyLT5zaW5rKTsKLSAgaW5uZXItPm0gPSBtYXBlbnRyeW1zZzsKLSAgaW5uZXItPm5hbWVfdGFibGUgPSBOVUxMOwotICBpbm5lci0+bWFwZmllbGQgPSBtYXBmaWVsZDsKLSAgaW5uZXItPmlzX21hcCA9IGZhbHNlOwotCi0gIC8qIERvbid0IHNldCB0aGlzIHRvIHRydWUgKnlldCogLS0gd2UgcmV1c2UgcGFyc2luZyBoYW5kbGVycyBiZWxvdyB0byBwdXNoCi0gICAqIHRoZSBrZXkgZmllbGQgdmFsdWUgdG8gdGhlIHNpbmssIGFuZCB0aGVzZSBoYW5kbGVycyB3aWxsIHBvcCB0aGUgZnJhbWUKLSAgICogaWYgdGhleSBzZWUgaXNfbWFwZW50cnkgKHdoZW4gaW52b2tlZCBieSB0aGUgcGFyc2VyIHN0YXRlIG1hY2hpbmUsIHRoZXkKLSAgICogd291bGQgaGF2ZSBqdXN0IHNlZW4gdGhlIG1hcC1lbnRyeSB2YWx1ZSwgbm90IGtleSkuICovCi0gIGlubmVyLT5pc19tYXBlbnRyeSA9IGZhbHNlOwotICBwLT50b3AgPSBpbm5lcjsKLQotICAvKiBzZW5kIFNUQVJUTVNHIGluIHN1Ym1zZyBmcmFtZS4gKi8KLSAgdXBiX3Npbmtfc3RhcnRtc2coJnAtPnRvcC0+c2luayk7Ci0KLSAgcGFyc2VfbWFwZW50cnlfa2V5KHApOwotCi0gIC8qIFNldCB1cCB0aGUgdmFsdWUgZmllbGQgdG8gcmVjZWl2ZSB0aGUgbWFwLWVudHJ5IHZhbHVlLiAqLwotICBwLT50b3AtPmYgPSB1cGJfbXNnZGVmX2l0b2YocC0+dG9wLT5tLCBVUEJfTUFQRU5UUllfVkFMVUUpOwotICBwLT50b3AtPmlzX21hcGVudHJ5ID0gdHJ1ZTsgIC8qIHNldCB1cCB0byBwb3AgZnJhbWUgYWZ0ZXIgdmFsdWUgaXMgcGFyc2VkLiAqLwotICBwLT50b3AtPm1hcGZpZWxkID0gbWFwZmllbGQ7Ci0gIGlmIChwLT50b3AtPmYgPT0gTlVMTCkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJybXNnKCZwLT5zdGF0dXMsICJtYXBlbnRyeSBtZXNzYWdlIGhhcyBubyB2YWx1ZSIpOwotICAgIHVwYl9lbnZfcmVwb3J0ZXJyb3IocC0+ZW52LCAmcC0+c3RhdHVzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgZW5kX21lbWJlcm5hbWUodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGFzc2VydCghcC0+dG9wLT5mKTsKLQotICBpZiAocC0+dG9wLT5pc19tYXApIHsKLSAgICByZXR1cm4gaGFuZGxlX21hcGVudHJ5KHApOwotICB9IGVsc2UgewotICAgIHNpemVfdCBsZW47Ci0gICAgY29uc3QgY2hhciAqYnVmID0gYWNjdW11bGF0ZV9nZXRwdHIocCwgJmxlbik7Ci0gICAgdXBiX3ZhbHVlIHY7Ci0KLSAgICBpZiAodXBiX3N0cnRhYmxlX2xvb2t1cDIocC0+dG9wLT5uYW1lX3RhYmxlLCBidWYsIGxlbiwgJnYpKSB7Ci0gICAgICBwLT50b3AtPmYgPSB1cGJfdmFsdWVfZ2V0Y29uc3RwdHIodik7Ci0gICAgICBtdWx0aXBhcnRfZW5kKHApOwotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgLyogVE9ETyhoYWJlcm1hbik6IElnbm9yZSB1bmtub3duIGZpZWxkcyBpZiByZXF1ZXN0ZWQvY29uZmlndXJlZCB0byBkbwotICAgICAgICogc28uICovCi0gICAgICB1cGJfc3RhdHVzX3NldGVycmYoJnAtPnN0YXR1cywgIk5vIHN1Y2ggZmllbGQ6ICUuKnNcbiIsIChpbnQpbGVuLCBidWYpOwotICAgICAgdXBiX2Vudl9yZXBvcnRlcnJvcihwLT5lbnYsICZwLT5zdGF0dXMpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQotCi1zdGF0aWMgdm9pZCBlbmRfbWVtYmVyKHVwYl9qc29uX3BhcnNlciAqcCkgewotICAvKiBJZiB3ZSBqdXN0IHBhcnNlZCBhIG1hcC1lbnRyeSB2YWx1ZSwgZW5kIHRoYXQgZnJhbWUgdG9vLiAqLwotICBpZiAocC0+dG9wLT5pc19tYXBlbnRyeSkgewotICAgIHVwYl9zdGF0dXMgcyA9IFVQQl9TVEFUVVNfSU5JVDsKLSAgICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0gICAgYm9vbCBvazsKLSAgICBjb25zdCB1cGJfZmllbGRkZWYgKm1hcGZpZWxkOwotCi0gICAgYXNzZXJ0KHAtPnRvcCA+IHAtPnN0YWNrKTsKLSAgICAvKiBzZW5kIEVORE1TRyBvbiBzdWJtc2cuICovCi0gICAgdXBiX3NpbmtfZW5kbXNnKCZwLT50b3AtPnNpbmssICZzKTsKLSAgICBtYXBmaWVsZCA9IHAtPnRvcC0+bWFwZmllbGQ7Ci0KLSAgICAvKiBzZW5kIEVORFNVQk1TRyBpbiByZXBlYXRlZC1maWVsZC1vZi1tYXBlbnRyaWVzIGZyYW1lLiAqLwotICAgIHAtPnRvcC0tOwotICAgIG9rID0gdXBiX2hhbmRsZXJzX2dldHNlbGVjdG9yKG1hcGZpZWxkLCBVUEJfSEFORExFUl9FTkRTVUJNU0csICZzZWwpOwotICAgIFVQQl9BU1NFUlRfVkFSKG9rLCBvayk7Ci0gICAgdXBiX3NpbmtfZW5kc3VibXNnKCZwLT50b3AtPnNpbmssIHNlbCk7Ci0gIH0KLQotICBwLT50b3AtPmYgPSBOVUxMOwotfQotCi1zdGF0aWMgYm9vbCBzdGFydF9zdWJvYmplY3QodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGFzc2VydChwLT50b3AtPmYpOwotCi0gIGlmICh1cGJfZmllbGRkZWZfaXNtYXAocC0+dG9wLT5mKSkgewotICAgIHVwYl9qc29ucGFyc2VyX2ZyYW1lICppbm5lcjsKLSAgICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0KLSAgICAvKiBCZWdpbm5pbmcgb2YgYSBtYXAuIFN0YXJ0IGEgbmV3IHBhcnNlciBmcmFtZSBpbiBhIHJlcGVhdGVkLWZpZWxkCi0gICAgICogY29udGV4dC4gKi8KLSAgICBpZiAoIWNoZWNrX3N0YWNrKHApKSByZXR1cm4gZmFsc2U7Ci0KLSAgICBpbm5lciA9IHAtPnRvcCArIDE7Ci0gICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNFUSk7Ci0gICAgdXBiX3Npbmtfc3RhcnRzZXEoJnAtPnRvcC0+c2luaywgc2VsLCAmaW5uZXItPnNpbmspOwotICAgIGlubmVyLT5tID0gdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihwLT50b3AtPmYpOwotICAgIGlubmVyLT5uYW1lX3RhYmxlID0gTlVMTDsKLSAgICBpbm5lci0+bWFwZmllbGQgPSBwLT50b3AtPmY7Ci0gICAgaW5uZXItPmYgPSBOVUxMOwotICAgIGlubmVyLT5pc19tYXAgPSB0cnVlOwotICAgIGlubmVyLT5pc19tYXBlbnRyeSA9IGZhbHNlOwotICAgIHAtPnRvcCA9IGlubmVyOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2lzc3VibXNnKHAtPnRvcC0+ZikpIHsKLSAgICB1cGJfanNvbnBhcnNlcl9mcmFtZSAqaW5uZXI7Ci0gICAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotCi0gICAgLyogQmVnaW5uaW5nIG9mIGEgc3Vib2JqZWN0LiBTdGFydCBhIG5ldyBwYXJzZXIgZnJhbWUgaW4gdGhlIHN1Ym1zZwotICAgICAqIGNvbnRleHQuICovCi0gICAgaWYgKCFjaGVja19zdGFjayhwKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgaW5uZXIgPSBwLT50b3AgKyAxOwotCi0gICAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9TVEFSVFNVQk1TRyk7Ci0gICAgdXBiX3Npbmtfc3RhcnRzdWJtc2coJnAtPnRvcC0+c2luaywgc2VsLCAmaW5uZXItPnNpbmspOwotICAgIGlubmVyLT5tID0gdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihwLT50b3AtPmYpOwotICAgIHNldF9uYW1lX3RhYmxlKHAsIGlubmVyKTsKLSAgICBpbm5lci0+ZiA9IE5VTEw7Ci0gICAgaW5uZXItPmlzX21hcCA9IGZhbHNlOwotICAgIGlubmVyLT5pc19tYXBlbnRyeSA9IGZhbHNlOwotICAgIHAtPnRvcCA9IGlubmVyOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKCZwLT5zdGF0dXMsCi0gICAgICAgICAgICAgICAgICAgICAgICJPYmplY3Qgc3BlY2lmaWVkIGZvciBub24tbWVzc2FnZS9ncm91cCBmaWVsZDogJXMiLAotICAgICAgICAgICAgICAgICAgICAgICB1cGJfZmllbGRkZWZfbmFtZShwLT50b3AtPmYpKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnAtPnN0YXR1cyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9zdWJvYmplY3QodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIGlmIChwLT50b3AtPmlzX21hcCkgewotICAgIHVwYl9zZWxlY3Rvcl90IHNlbDsKLSAgICBwLT50b3AtLTsKLSAgICBzZWwgPSBnZXRzZWxfZm9yX2hhbmRsZXJ0eXBlKHAsIFVQQl9IQU5ETEVSX0VORFNFUSk7Ci0gICAgdXBiX3NpbmtfZW5kc2VxKCZwLT50b3AtPnNpbmssIHNlbCk7Ci0gIH0gZWxzZSB7Ci0gICAgdXBiX3NlbGVjdG9yX3Qgc2VsOwotICAgIHAtPnRvcC0tOwotICAgIHNlbCA9IGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfRU5EU1VCTVNHKTsKLSAgICB1cGJfc2lua19lbmRzdWJtc2coJnAtPnRvcC0+c2luaywgc2VsKTsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBzdGFydF9hcnJheSh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgdXBiX2pzb25wYXJzZXJfZnJhbWUgKmlubmVyOwotICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0KLSAgYXNzZXJ0KHAtPnRvcC0+Zik7Ci0KLSAgaWYgKCF1cGJfZmllbGRkZWZfaXNzZXEocC0+dG9wLT5mKSkgewotICAgIHVwYl9zdGF0dXNfc2V0ZXJyZigmcC0+c3RhdHVzLAotICAgICAgICAgICAgICAgICAgICAgICAiQXJyYXkgc3BlY2lmaWVkIGZvciBub24tcmVwZWF0ZWQgZmllbGQ6ICVzIiwKLSAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ZpZWxkZGVmX25hbWUocC0+dG9wLT5mKSk7Ci0gICAgdXBiX2Vudl9yZXBvcnRlcnJvcihwLT5lbnYsICZwLT5zdGF0dXMpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghY2hlY2tfc3RhY2socCkpIHJldHVybiBmYWxzZTsKLQotICBpbm5lciA9IHAtPnRvcCArIDE7Ci0gIHNlbCA9IGdldHNlbF9mb3JfaGFuZGxlcnR5cGUocCwgVVBCX0hBTkRMRVJfU1RBUlRTRVEpOwotICB1cGJfc2lua19zdGFydHNlcSgmcC0+dG9wLT5zaW5rLCBzZWwsICZpbm5lci0+c2luayk7Ci0gIGlubmVyLT5tID0gcC0+dG9wLT5tOwotICBpbm5lci0+bmFtZV90YWJsZSA9IE5VTEw7Ci0gIGlubmVyLT5mID0gcC0+dG9wLT5mOwotICBpbm5lci0+aXNfbWFwID0gZmFsc2U7Ci0gIGlubmVyLT5pc19tYXBlbnRyeSA9IGZhbHNlOwotICBwLT50b3AgPSBpbm5lcjsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgZW5kX2FycmF5KHVwYl9qc29uX3BhcnNlciAqcCkgewotICB1cGJfc2VsZWN0b3JfdCBzZWw7Ci0KLSAgYXNzZXJ0KHAtPnRvcCA+IHAtPnN0YWNrKTsKLQotICBwLT50b3AtLTsKLSAgc2VsID0gZ2V0c2VsX2Zvcl9oYW5kbGVydHlwZShwLCBVUEJfSEFORExFUl9FTkRTRVEpOwotICB1cGJfc2lua19lbmRzZXEoJnAtPnRvcC0+c2luaywgc2VsKTsKLX0KLQotc3RhdGljIHZvaWQgc3RhcnRfb2JqZWN0KHVwYl9qc29uX3BhcnNlciAqcCkgewotICBpZiAoIXAtPnRvcC0+aXNfbWFwKSB7Ci0gICAgdXBiX3Npbmtfc3RhcnRtc2coJnAtPnRvcC0+c2luayk7Ci0gIH0KLX0KLQotc3RhdGljIHZvaWQgZW5kX29iamVjdCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgaWYgKCFwLT50b3AtPmlzX21hcCkgewotICAgIHVwYl9zdGF0dXMgc3RhdHVzOwotICAgIHVwYl9zdGF0dXNfY2xlYXIoJnN0YXR1cyk7Ci0gICAgdXBiX3NpbmtfZW5kbXNnKCZwLT50b3AtPnNpbmssICZzdGF0dXMpOwotICAgIGlmICghdXBiX29rKCZzdGF0dXMpKSB7Ci0gICAgICB1cGJfZW52X3JlcG9ydGVycm9yKHAtPmVudiwgJnN0YXR1cyk7Ci0gICAgfQotICB9Ci19Ci0KLQotI2RlZmluZSBDSEVDS19SRVRVUk5fVE9QKHgpIGlmICghKHgpKSBnb3RvIGVycm9yCi0KLQotLyogVGhlIGFjdHVhbCBwYXJzZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogV2hhdCBmb2xsb3dzIGlzIHRoZSBSYWdlbCBwYXJzZXIgaXRzZWxmLiAgVGhlIGxhbmd1YWdlIGlzIHNwZWNpZmllZCBpbiBSYWdlbAotICogYW5kIHRoZSBhY3Rpb25zIGNhbGwgb3VyIEMgZnVuY3Rpb25zIGFib3ZlLgotICoKLSAqIFJhZ2VsIGhhcyBhbiBleHRlbnNpdmUgc2V0IG9mIGZ1bmN0aW9uYWxpdHksIGFuZCB3ZSB1c2Ugb25seSBhIHNtYWxsIHBhcnQgb2YKLSAqIGl0LiAgVGhlcmUgYXJlIG1hbnkgYWN0aW9uIHR5cGVzIGJ1dCB3ZSBvbmx5IHVzZSBhIGZldzoKLSAqCi0gKiAgICI+IiAtLSB0cmFuc2l0aW9uIGludG8gYSBtYWNoaW5lCi0gKiAgICIlIiAtLSB0cmFuc2l0aW9uIG91dCBvZiBhIG1hY2hpbmUKLSAqICAgIkAiIC0tIHRyYW5zaXRpb24gaW50byBhIGZpbmFsIHN0YXRlIG9mIGEgbWFjaGluZS4KLSAqCi0gKiAiQCIgdHJhbnNpdGlvbnMgYXJlIHRyaWNreSBiZWNhdXNlIGEgbWFjaGluZSBjYW4gdHJhbnNpdGlvbiBpbnRvIGEgZmluYWwKLSAqIHN0YXRlIHJlcGVhdGVkbHkuICBCdXQgaW4gc29tZSBjYXNlcyB3ZSBrbm93IHRoaXMgY2FuJ3QgaGFwcGVuLCBmb3IgZXhhbXBsZQotICogYSBzdHJpbmcgd2hpY2ggaXMgZGVsaW1pdGVkIGJ5IGEgZmluYWwgJyInIGNhbiBvbmx5IHRyYW5zaXRpb24gaW50byBpdHMKLSAqIGZpbmFsIHN0YXRlIG9uY2UsIHdoZW4gdGhlIGNsb3NpbmcgJyInIGlzIHNlZW4uICovCi0KLQotI2xpbmUgMTI0NSAidXBiL2pzb24vcGFyc2VyLnJsIgotCi0KLQotI2xpbmUgMTE1NyAidXBiL2pzb24vcGFyc2VyLmMiCi1zdGF0aWMgY29uc3QgY2hhciBfanNvbl9hY3Rpb25zW10gPSB7Ci0JMCwgMSwgMCwgMSwgMiwgMSwgMywgMSwgCi0JNSwgMSwgNiwgMSwgNywgMSwgOCwgMSwgCi0JMTAsIDEsIDEyLCAxLCAxMywgMSwgMTQsIDEsIAotCTE1LCAxLCAxNiwgMSwgMTcsIDEsIDIxLCAxLCAKLQkyNSwgMSwgMjcsIDIsIDMsIDgsIDIsIDQsIAotCTUsIDIsIDYsIDIsIDIsIDYsIDgsIDIsIAotCTExLCA5LCAyLCAxMywgMTUsIDIsIDE0LCAxNSwgCi0JMiwgMTgsIDEsIDIsIDE5LCAyNywgMiwgMjAsIAotCTksIDIsIDIyLCAyNywgMiwgMjMsIDI3LCAyLCAKLQkyNCwgMjcsIDIsIDI2LCAyNywgMywgMTQsIDExLCAKLQk5Ci19OwotCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBfanNvbl9rZXlfb2Zmc2V0c1tdID0gewotCTAsIDAsIDQsIDksIDE0LCAxNSwgMTksIDI0LCAKLQkyOSwgMzQsIDM4LCA0MiwgNDUsIDQ4LCA1MCwgNTQsIAotCTU4LCA2MCwgNjIsIDY3LCA2OSwgNzEsIDgwLCA4NiwgCi0JOTIsIDk4LCAxMDQsIDEwNiwgMTE1LCAxMTYsIDExNiwgMTE2LCAKLQkxMjEsIDEyNiwgMTMxLCAxMzIsIDEzMywgMTM0LCAxMzUsIDEzNSwgCi0JMTM2LCAxMzcsIDEzOCwgMTM4LCAxMzksIDE0MCwgMTQxLCAxNDEsIAotCTE0NiwgMTUxLCAxNTIsIDE1NiwgMTYxLCAxNjYsIDE3MSwgMTc1LCAKLQkxNzUsIDE3OCwgMTc4LCAxNzgKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIF9qc29uX3RyYW5zX2tleXNbXSA9IHsKLQkzMiwgMTIzLCA5LCAxMywgMzIsIDM0LCAxMjUsIDksIAotCTEzLCAzMiwgMzQsIDEyNSwgOSwgMTMsIDM0LCAzMiwgCi0JNTgsIDksIDEzLCAzMiwgOTMsIDEyNSwgOSwgMTMsIAotCTMyLCA0NCwgMTI1LCA5LCAxMywgMzIsIDQ0LCAxMjUsIAotCTksIDEzLCAzMiwgMzQsIDksIDEzLCA0NSwgNDgsIAotCTQ5LCA1NywgNDgsIDQ5LCA1NywgNDYsIDY5LCAxMDEsIAotCTQ4LCA1NywgNjksIDEwMSwgNDgsIDU3LCA0MywgNDUsIAotCTQ4LCA1NywgNDgsIDU3LCA0OCwgNTcsIDQ2LCA2OSwgCi0JMTAxLCA0OCwgNTcsIDM0LCA5MiwgMzQsIDkyLCAzNCwgCi0JNDcsIDkyLCA5OCwgMTAyLCAxMTAsIDExNCwgMTE2LCAxMTcsIAotCTQ4LCA1NywgNjUsIDcwLCA5NywgMTAyLCA0OCwgNTcsIAotCTY1LCA3MCwgOTcsIDEwMiwgNDgsIDU3LCA2NSwgNzAsIAotCTk3LCAxMDIsIDQ4LCA1NywgNjUsIDcwLCA5NywgMTAyLCAKLQkzNCwgOTIsIDM0LCA0NSwgOTEsIDEwMiwgMTEwLCAxMTYsIAotCTEyMywgNDgsIDU3LCAzNCwgMzIsIDkzLCAxMjUsIDksIAotCTEzLCAzMiwgNDQsIDkzLCA5LCAxMywgMzIsIDkzLCAKLQkxMjUsIDksIDEzLCA5NywgMTA4LCAxMTUsIDEwMSwgMTE3LCAKLQkxMDgsIDEwOCwgMTE0LCAxMTcsIDEwMSwgMzIsIDM0LCAxMjUsIAotCTksIDEzLCAzMiwgMzQsIDEyNSwgOSwgMTMsIDM0LCAKLQkzMiwgNTgsIDksIDEzLCAzMiwgOTMsIDEyNSwgOSwgCi0JMTMsIDMyLCA0NCwgMTI1LCA5LCAxMywgMzIsIDQ0LCAKLQkxMjUsIDksIDEzLCAzMiwgMzQsIDksIDEzLCAzMiwgCi0JOSwgMTMsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIF9qc29uX3NpbmdsZV9sZW5ndGhzW10gPSB7Ci0JMCwgMiwgMywgMywgMSwgMiwgMywgMywgCi0JMywgMiwgMiwgMSwgMywgMCwgMiwgMiwgCi0JMCwgMCwgMywgMiwgMiwgOSwgMCwgMCwgCi0JMCwgMCwgMiwgNywgMSwgMCwgMCwgMywgCi0JMywgMywgMSwgMSwgMSwgMSwgMCwgMSwgCi0JMSwgMSwgMCwgMSwgMSwgMSwgMCwgMywgCi0JMywgMSwgMiwgMywgMywgMywgMiwgMCwgCi0JMSwgMCwgMCwgMAotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2pzb25fcmFuZ2VfbGVuZ3Roc1tdID0gewotCTAsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIAotCTEsIDEsIDEsIDEsIDAsIDEsIDEsIDEsIAotCTEsIDEsIDEsIDAsIDAsIDAsIDMsIDMsIAotCTMsIDMsIDAsIDEsIDAsIDAsIDAsIDEsIAotCTEsIDEsIDAsIDAsIDAsIDAsIDAsIDAsIAotCTAsIDAsIDAsIDAsIDAsIDAsIDAsIDEsIAotCTEsIDAsIDEsIDEsIDEsIDEsIDEsIDAsIAotCTEsIDAsIDAsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBzaG9ydCBfanNvbl9pbmRleF9vZmZzZXRzW10gPSB7Ci0JMCwgMCwgNCwgOSwgMTQsIDE2LCAyMCwgMjUsIAotCTMwLCAzNSwgMzksIDQzLCA0NiwgNTAsIDUyLCA1NiwgCi0JNjAsIDYyLCA2NCwgNjksIDcyLCA3NSwgODUsIDg5LCAKLQk5MywgOTcsIDEwMSwgMTA0LCAxMTMsIDExNSwgMTE2LCAxMTcsIAotCTEyMiwgMTI3LCAxMzIsIDEzNCwgMTM2LCAxMzgsIDE0MCwgMTQxLCAKLQkxNDMsIDE0NSwgMTQ3LCAxNDgsIDE1MCwgMTUyLCAxNTQsIDE1NSwgCi0JMTYwLCAxNjUsIDE2NywgMTcxLCAxNzYsIDE4MSwgMTg2LCAxOTAsIAotCTE5MSwgMTk0LCAxOTUsIDE5NgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2pzb25faW5kaWNpZXNbXSA9IHsKLQkwLCAyLCAwLCAxLCAzLCA0LCA1LCAzLCAKLQkxLCA2LCA3LCA4LCA2LCAxLCA5LCAxLCAKLQkxMCwgMTEsIDEwLCAxLCAxMSwgMSwgMSwgMTEsIAotCTEyLCAxMywgMTQsIDE1LCAxMywgMSwgMTYsIDE3LCAKLQk4LCAxNiwgMSwgMTcsIDcsIDE3LCAxLCAxOCwgCi0JMTksIDIwLCAxLCAxOSwgMjAsIDEsIDIyLCAyMywgCi0JMjMsIDIxLCAyNCwgMSwgMjMsIDIzLCAyNCwgMjEsIAotCTI1LCAyNSwgMjYsIDEsIDI2LCAxLCAyNiwgMjEsIAotCTIyLCAyMywgMjMsIDIwLCAyMSwgMjgsIDI5LCAyNywgCi0JMzEsIDMyLCAzMCwgMzMsIDMzLCAzMywgMzMsIDMzLCAKLQkzMywgMzMsIDMzLCAzNCwgMSwgMzUsIDM1LCAzNSwgCi0JMSwgMzYsIDM2LCAzNiwgMSwgMzcsIDM3LCAzNywgCi0JMSwgMzgsIDM4LCAzOCwgMSwgNDAsIDQxLCAzOSwgCi0JNDIsIDQzLCA0NCwgNDUsIDQ2LCA0NywgNDgsIDQzLCAKLQkxLCA0OSwgMSwgNTAsIDUxLCA1MywgNTQsIDEsIAotCTUzLCA1MiwgNTUsIDU2LCA1NCwgNTUsIDEsIDU2LCAKLQkxLCAxLCA1NiwgNTIsIDU3LCAxLCA1OCwgMSwgCi0JNTksIDEsIDYwLCAxLCA2MSwgNjIsIDEsIDYzLCAKLQkxLCA2NCwgMSwgNjUsIDY2LCAxLCA2NywgMSwgCi0JNjgsIDEsIDY5LCA3MCwgNzEsIDcyLCA3MCwgMSwgCi0JNzMsIDc0LCA3NSwgNzMsIDEsIDc2LCAxLCA3NywgCi0JNzgsIDc3LCAxLCA3OCwgMSwgMSwgNzgsIDc5LCAKLQk4MCwgODEsIDgyLCA4MCwgMSwgODMsIDg0LCA3NSwgCi0JODMsIDEsIDg0LCA3NCwgODQsIDEsIDg1LCA4NiwgCi0JODYsIDEsIDEsIDEsIDEsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBjaGFyIF9qc29uX3RyYW5zX3RhcmdzW10gPSB7Ci0JMSwgMCwgMiwgMywgNCwgNTYsIDMsIDQsIAotCTU2LCA1LCA1LCA2LCA3LCA4LCA5LCA1NiwgCi0JOCwgOSwgMTEsIDEyLCAxOCwgNTcsIDEzLCAxNSwgCi0JMTQsIDE2LCAxNywgMjAsIDU4LCAyMSwgMjAsIDU4LCAKLQkyMSwgMTksIDIyLCAyMywgMjQsIDI1LCAyNiwgMjAsIAotCTU4LCAyMSwgMjgsIDMwLCAzMSwgMzQsIDM5LCA0MywgCi0JNDcsIDI5LCA1OSwgNTksIDMyLCAzMSwgMjksIDMyLCAKLQkzMywgMzUsIDM2LCAzNywgMzgsIDU5LCA0MCwgNDEsIAotCTQyLCA1OSwgNDQsIDQ1LCA0NiwgNTksIDQ4LCA0OSwgCi0JNTUsIDQ4LCA0OSwgNTUsIDUwLCA1MCwgNTEsIDUyLCAKLQk1MywgNTQsIDU1LCA1MywgNTQsIDU5LCA1NgotfTsKLQotc3RhdGljIGNvbnN0IGNoYXIgX2pzb25fdHJhbnNfYWN0aW9uc1tdID0gewotCTAsIDAsIDAsIDIxLCA3NywgNTMsIDAsIDQ3LCAKLQkyMywgMTcsIDAsIDAsIDE1LCAxOSwgMTksIDUwLCAKLQkwLCAwLCAwLCAwLCAwLCAxLCAwLCAwLCAKLQkwLCAwLCAwLCAzLCAxMywgMCwgMCwgMzUsIAotCTUsIDExLCAwLCAzOCwgNywgNywgNywgNDEsIAotCTQ0LCA5LCA2MiwgNTYsIDI1LCAwLCAwLCAwLCAKLQkzMSwgMjksIDMzLCA1OSwgMTUsIDAsIDI3LCAwLCAKLQkwLCAwLCAwLCAwLCAwLCA2OCwgMCwgMCwgCi0JMCwgNzEsIDAsIDAsIDAsIDY1LCAyMSwgNzcsIAotCTUzLCAwLCA0NywgMjMsIDE3LCAwLCAwLCAxNSwgCi0JMTksIDE5LCA1MCwgMCwgMCwgNzQsIDAKLX07Ci0KLXN0YXRpYyBjb25zdCBpbnQganNvbl9zdGFydCA9IDE7Ci0KLXN0YXRpYyBjb25zdCBpbnQganNvbl9lbl9udW1iZXJfbWFjaGluZSA9IDEwOwotc3RhdGljIGNvbnN0IGludCBqc29uX2VuX3N0cmluZ19tYWNoaW5lID0gMTk7Ci1zdGF0aWMgY29uc3QgaW50IGpzb25fZW5fdmFsdWVfbWFjaGluZSA9IDI3Owotc3RhdGljIGNvbnN0IGludCBqc29uX2VuX21haW4gPSAxOwotCi0KLSNsaW5lIDEyNDggInVwYi9qc29uL3BhcnNlci5ybCIKLQotc2l6ZV90IHBhcnNlKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBzaXplLAotICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICB1cGJfanNvbl9wYXJzZXIgKnBhcnNlciA9IGNsb3N1cmU7Ci0KLSAgLyogVmFyaWFibGVzIHVzZWQgYnkgUmFnZWwncyBnZW5lcmF0ZWQgY29kZS4gKi8KLSAgaW50IGNzID0gcGFyc2VyLT5jdXJyZW50X3N0YXRlOwotICBpbnQgKnN0YWNrID0gcGFyc2VyLT5wYXJzZXJfc3RhY2s7Ci0gIGludCB0b3AgPSBwYXJzZXItPnBhcnNlcl90b3A7Ci0KLSAgY29uc3QgY2hhciAqcCA9IGJ1ZjsKLSAgY29uc3QgY2hhciAqcGUgPSBidWYgKyBzaXplOwotCi0gIHBhcnNlci0+aGFuZGxlID0gaGFuZGxlOwotCi0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgY2FwdHVyZV9yZXN1bWUocGFyc2VyLCBidWYpOwotCi0gIAotI2xpbmUgMTMyOCAidXBiL2pzb24vcGFyc2VyLmMiCi0JewotCWludCBfa2xlbjsKLQl1bnNpZ25lZCBpbnQgX3RyYW5zOwotCWNvbnN0IGNoYXIgKl9hY3RzOwotCXVuc2lnbmVkIGludCBfbmFjdHM7Ci0JY29uc3QgY2hhciAqX2tleXM7Ci0KLQlpZiAoIHAgPT0gcGUgKQotCQlnb3RvIF90ZXN0X2VvZjsKLQlpZiAoIGNzID09IDAgKQotCQlnb3RvIF9vdXQ7Ci1fcmVzdW1lOgotCV9rZXlzID0gX2pzb25fdHJhbnNfa2V5cyArIF9qc29uX2tleV9vZmZzZXRzW2NzXTsKLQlfdHJhbnMgPSBfanNvbl9pbmRleF9vZmZzZXRzW2NzXTsKLQotCV9rbGVuID0gX2pzb25fc2luZ2xlX2xlbmd0aHNbY3NdOwotCWlmICggX2tsZW4gPiAwICkgewotCQljb25zdCBjaGFyICpfbG93ZXIgPSBfa2V5czsKLQkJY29uc3QgY2hhciAqX21pZDsKLQkJY29uc3QgY2hhciAqX3VwcGVyID0gX2tleXMgKyBfa2xlbiAtIDE7Ci0JCXdoaWxlICgxKSB7Ci0JCQlpZiAoIF91cHBlciA8IF9sb3dlciApCi0JCQkJYnJlYWs7Ci0KLQkJCV9taWQgPSBfbG93ZXIgKyAoKF91cHBlci1fbG93ZXIpID4+IDEpOwotCQkJaWYgKCAoKnApIDwgKl9taWQgKQotCQkJCV91cHBlciA9IF9taWQgLSAxOwotCQkJZWxzZSBpZiAoICgqcCkgPiAqX21pZCApCi0JCQkJX2xvd2VyID0gX21pZCArIDE7Ci0JCQllbHNlIHsKLQkJCQlfdHJhbnMgKz0gKHVuc2lnbmVkIGludCkoX21pZCAtIF9rZXlzKTsKLQkJCQlnb3RvIF9tYXRjaDsKLQkJCX0KLQkJfQotCQlfa2V5cyArPSBfa2xlbjsKLQkJX3RyYW5zICs9IF9rbGVuOwotCX0KLQotCV9rbGVuID0gX2pzb25fcmFuZ2VfbGVuZ3Roc1tjc107Ci0JaWYgKCBfa2xlbiA+IDAgKSB7Ci0JCWNvbnN0IGNoYXIgKl9sb3dlciA9IF9rZXlzOwotCQljb25zdCBjaGFyICpfbWlkOwotCQljb25zdCBjaGFyICpfdXBwZXIgPSBfa2V5cyArIChfa2xlbjw8MSkgLSAyOwotCQl3aGlsZSAoMSkgewotCQkJaWYgKCBfdXBwZXIgPCBfbG93ZXIgKQotCQkJCWJyZWFrOwotCi0JCQlfbWlkID0gX2xvd2VyICsgKCgoX3VwcGVyLV9sb3dlcikgPj4gMSkgJiB+MSk7Ci0JCQlpZiAoICgqcCkgPCBfbWlkWzBdICkKLQkJCQlfdXBwZXIgPSBfbWlkIC0gMjsKLQkJCWVsc2UgaWYgKCAoKnApID4gX21pZFsxXSApCi0JCQkJX2xvd2VyID0gX21pZCArIDI7Ci0JCQllbHNlIHsKLQkJCQlfdHJhbnMgKz0gKHVuc2lnbmVkIGludCkoKF9taWQgLSBfa2V5cyk+PjEpOwotCQkJCWdvdG8gX21hdGNoOwotCQkJfQotCQl9Ci0JCV90cmFucyArPSBfa2xlbjsKLQl9Ci0KLV9tYXRjaDoKLQlfdHJhbnMgPSBfanNvbl9pbmRpY2llc1tfdHJhbnNdOwotCWNzID0gX2pzb25fdHJhbnNfdGFyZ3NbX3RyYW5zXTsKLQotCWlmICggX2pzb25fdHJhbnNfYWN0aW9uc1tfdHJhbnNdID09IDAgKQotCQlnb3RvIF9hZ2FpbjsKLQotCV9hY3RzID0gX2pzb25fYWN0aW9ucyArIF9qc29uX3RyYW5zX2FjdGlvbnNbX3RyYW5zXTsKLQlfbmFjdHMgPSAodW5zaWduZWQgaW50KSAqX2FjdHMrKzsKLQl3aGlsZSAoIF9uYWN0cy0tID4gMCApCi0JewotCQlzd2l0Y2ggKCAqX2FjdHMrKyApCi0JCXsKLQljYXNlIDA6Ci0jbGluZSAxMTYwICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBwLS07IHtjcyA9IHN0YWNrWy0tdG9wXTsgZ290byBfYWdhaW47fSB9Ci0JYnJlYWs7Ci0JY2FzZSAxOgotI2xpbmUgMTE2MSAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgcC0tOyB7c3RhY2tbdG9wKytdID0gY3M7IGNzID0gMTA7IGdvdG8gX2FnYWluO30gfQotCWJyZWFrOwotCWNhc2UgMjoKLSNsaW5lIDExNjUgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X3RleHQocGFyc2VyLCBwKTsgfQotCWJyZWFrOwotCWNhc2UgMzoKLSNsaW5lIDExNjYgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IENIRUNLX1JFVFVSTl9UT1AoZW5kX3RleHQocGFyc2VyLCBwKSk7IH0KLQlicmVhazsKLQljYXNlIDQ6Ci0jbGluZSAxMTcyICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBzdGFydF9oZXgocGFyc2VyKTsgfQotCWJyZWFrOwotCWNhc2UgNToKLSNsaW5lIDExNzMgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IGhleGRpZ2l0KHBhcnNlciwgcCk7IH0KLQlicmVhazsKLQljYXNlIDY6Ci0jbGluZSAxMTc0ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKGVuZF9oZXgocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDc6Ci0jbGluZSAxMTgwICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKGVzY2FwZShwYXJzZXIsIHApKTsgfQotCWJyZWFrOwotCWNhc2UgODoKLSNsaW5lIDExODYgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHAtLTsge2NzID0gc3RhY2tbLS10b3BdOyBnb3RvIF9hZ2Fpbjt9IH0KLQlicmVhazsKLQljYXNlIDk6Ci0jbGluZSAxMTg5ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyB7c3RhY2tbdG9wKytdID0gY3M7IGNzID0gMTk7IGdvdG8gX2FnYWluO30gfQotCWJyZWFrOwotCWNhc2UgMTA6Ci0jbGluZSAxMTkxICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBwLS07IHtzdGFja1t0b3ArK10gPSBjczsgY3MgPSAyNzsgZ290byBfYWdhaW47fSB9Ci0JYnJlYWs7Ci0JY2FzZSAxMToKLSNsaW5lIDExOTYgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X21lbWJlcihwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxMjoKLSNsaW5lIDExOTcgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IENIRUNLX1JFVFVSTl9UT1AoZW5kX21lbWJlcm5hbWUocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDEzOgotI2xpbmUgMTIwMCAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgZW5kX21lbWJlcihwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxNDoKLSNsaW5lIDEyMDYgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X29iamVjdChwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxNToKLSNsaW5lIDEyMDkgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IGVuZF9vYmplY3QocGFyc2VyKTsgfQotCWJyZWFrOwotCWNhc2UgMTY6Ci0jbGluZSAxMjE1ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKHN0YXJ0X2FycmF5KHBhcnNlcikpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxNzoKLSNsaW5lIDEyMTkgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IGVuZF9hcnJheShwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxODoKLSNsaW5lIDEyMjQgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHN0YXJ0X251bWJlcihwYXJzZXIsIHApOyB9Ci0JYnJlYWs7Ci0JY2FzZSAxOToKLSNsaW5lIDEyMjUgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IENIRUNLX1JFVFVSTl9UT1AoZW5kX251bWJlcihwYXJzZXIsIHApKTsgfQotCWJyZWFrOwotCWNhc2UgMjA6Ci0jbGluZSAxMjI3ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKHN0YXJ0X3N0cmluZ3ZhbChwYXJzZXIpKTsgfQotCWJyZWFrOwotCWNhc2UgMjE6Ci0jbGluZSAxMjI4ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKGVuZF9zdHJpbmd2YWwocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDIyOgotI2xpbmUgMTIzMCAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgQ0hFQ0tfUkVUVVJOX1RPUChwYXJzZXJfcHV0Ym9vbChwYXJzZXIsIHRydWUpKTsgfQotCWJyZWFrOwotCWNhc2UgMjM6Ci0jbGluZSAxMjMyICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyBDSEVDS19SRVRVUk5fVE9QKHBhcnNlcl9wdXRib29sKHBhcnNlciwgZmFsc2UpKTsgfQotCWJyZWFrOwotCWNhc2UgMjQ6Ci0jbGluZSAxMjM0ICJ1cGIvanNvbi9wYXJzZXIucmwiCi0JeyAvKiBudWxsIHZhbHVlICovIH0KLQlicmVhazsKLQljYXNlIDI1OgotI2xpbmUgMTIzNiAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgQ0hFQ0tfUkVUVVJOX1RPUChzdGFydF9zdWJvYmplY3QocGFyc2VyKSk7IH0KLQlicmVhazsKLQljYXNlIDI2OgotI2xpbmUgMTIzNyAidXBiL2pzb24vcGFyc2VyLnJsIgotCXsgZW5kX3N1Ym9iamVjdChwYXJzZXIpOyB9Ci0JYnJlYWs7Ci0JY2FzZSAyNzoKLSNsaW5lIDEyNDIgInVwYi9qc29uL3BhcnNlci5ybCIKLQl7IHAtLTsge2NzID0gc3RhY2tbLS10b3BdOyBnb3RvIF9hZ2Fpbjt9IH0KLQlicmVhazsKLSNsaW5lIDE1MTQgInVwYi9qc29uL3BhcnNlci5jIgotCQl9Ci0JfQotCi1fYWdhaW46Ci0JaWYgKCBjcyA9PSAwICkKLQkJZ290byBfb3V0OwotCWlmICggKytwICE9IHBlICkKLQkJZ290byBfcmVzdW1lOwotCV90ZXN0X2VvZjoge30KLQlfb3V0OiB7fQotCX0KLQotI2xpbmUgMTI2OSAidXBiL2pzb24vcGFyc2VyLnJsIgotCi0gIGlmIChwICE9IHBlKSB7Ci0gICAgdXBiX3N0YXR1c19zZXRlcnJmKCZwYXJzZXItPnN0YXR1cywgIlBhcnNlIGVycm9yIGF0ICclLipzJ1xuIiwgcGUgLSBwLCBwKTsKLSAgICB1cGJfZW52X3JlcG9ydGVycm9yKHBhcnNlci0+ZW52LCAmcGFyc2VyLT5zdGF0dXMpOwotICB9IGVsc2UgewotICAgIGNhcHR1cmVfc3VzcGVuZChwYXJzZXIsICZwKTsKLSAgfQotCi1lcnJvcjoKLSAgLyogU2F2ZSBwYXJzaW5nIHN0YXRlIGJhY2sgdG8gcGFyc2VyLiAqLwotICBwYXJzZXItPmN1cnJlbnRfc3RhdGUgPSBjczsKLSAgcGFyc2VyLT5wYXJzZXJfdG9wID0gdG9wOwotCi0gIHJldHVybiBwIC0gYnVmOwotfQotCi1ib29sIGVuZCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCkgewotICBVUEJfVU5VU0VEKGNsb3N1cmUpOwotICBVUEJfVU5VU0VEKGhkKTsKLQotICAvKiBQcmV2ZW50IGNvbXBpbGUgd2FybmluZyBvbiB1bnVzZWQgc3RhdGljIGNvbnN0YW50cy4gKi8KLSAgVVBCX1VOVVNFRChqc29uX3N0YXJ0KTsKLSAgVVBCX1VOVVNFRChqc29uX2VuX251bWJlcl9tYWNoaW5lKTsKLSAgVVBCX1VOVVNFRChqc29uX2VuX3N0cmluZ19tYWNoaW5lKTsKLSAgVVBCX1VOVVNFRChqc29uX2VuX3ZhbHVlX21hY2hpbmUpOwotICBVUEJfVU5VU0VEKGpzb25fZW5fbWFpbik7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCBqc29uX3BhcnNlcl9yZXNldCh1cGJfanNvbl9wYXJzZXIgKnApIHsKLSAgaW50IGNzOwotICBpbnQgdG9wOwotCi0gIHAtPnRvcCA9IHAtPnN0YWNrOwotICBwLT50b3AtPmYgPSBOVUxMOwotICBwLT50b3AtPmlzX21hcCA9IGZhbHNlOwotICBwLT50b3AtPmlzX21hcGVudHJ5ID0gZmFsc2U7Ci0KLSAgLyogRW1pdCBSYWdlbCBpbml0aWFsaXphdGlvbiBvZiB0aGUgcGFyc2VyLiAqLwotICAKLSNsaW5lIDE1NjggInVwYi9qc29uL3BhcnNlci5jIgotCXsKLQljcyA9IGpzb25fc3RhcnQ7Ci0JdG9wID0gMDsKLQl9Ci0KLSNsaW5lIDEzMDkgInVwYi9qc29uL3BhcnNlci5ybCIKLSAgcC0+Y3VycmVudF9zdGF0ZSA9IGNzOwotICBwLT5wYXJzZXJfdG9wID0gdG9wOwotICBhY2N1bXVsYXRlX2NsZWFyKHApOwotICBwLT5tdWx0aXBhcnRfc3RhdGUgPSBNVUxUSVBBUlRfSU5BQ1RJVkU7Ci0gIHAtPmNhcHR1cmUgPSBOVUxMOwotICBwLT5hY2N1bXVsYXRlZCA9IE5VTEw7Ci0gIHVwYl9zdGF0dXNfY2xlYXIoJnAtPnN0YXR1cyk7Ci19Ci0KLXN0YXRpYyB2b2lkIHZpc2l0X2pzb25fcGFyc2VybWV0aG9kKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3JlZmNvdW50ZWRfdmlzaXQgKnZpc2l0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSkgewotICBjb25zdCB1cGJfanNvbl9wYXJzZXJtZXRob2QgKm1ldGhvZCA9ICh1cGJfanNvbl9wYXJzZXJtZXRob2QqKXI7Ci0gIHZpc2l0KHIsIHVwYl9tc2dkZWZfdXBjYXN0MihtZXRob2QtPm1zZyksIGNsb3N1cmUpOwotfQotCi1zdGF0aWMgdm9pZCBmcmVlX2pzb25fcGFyc2VybWV0aG9kKHVwYl9yZWZjb3VudGVkICpyKSB7Ci0gIHVwYl9qc29uX3BhcnNlcm1ldGhvZCAqbWV0aG9kID0gKHVwYl9qc29uX3BhcnNlcm1ldGhvZCopcjsKLQotICB1cGJfaW50dGFibGVfaXRlciBpOwotICB1cGJfaW50dGFibGVfYmVnaW4oJmksICZtZXRob2QtPm5hbWVfdGFibGVzKTsKLSAgZm9yKDsgIXVwYl9pbnR0YWJsZV9kb25lKCZpKTsgdXBiX2ludHRhYmxlX25leHQoJmkpKSB7Ci0gICAgdXBiX3ZhbHVlIHZhbCA9IHVwYl9pbnR0YWJsZV9pdGVyX3ZhbHVlKCZpKTsKLSAgICB1cGJfc3RydGFibGUgKnQgPSB1cGJfdmFsdWVfZ2V0cHRyKHZhbCk7Ci0gICAgdXBiX3N0cnRhYmxlX3VuaW5pdCh0KTsKLSAgICB1cGJfZ2ZyZWUodCk7Ci0gIH0KLQotICB1cGJfaW50dGFibGVfdW5pbml0KCZtZXRob2QtPm5hbWVfdGFibGVzKTsKLQotICB1cGJfZ2ZyZWUocik7Ci19Ci0KLXN0YXRpYyB2b2lkIGFkZF9qc29ubmFtZV90YWJsZSh1cGJfanNvbl9wYXJzZXJtZXRob2QgKm0sIGNvbnN0IHVwYl9tc2dkZWYqIG1kKSB7Ci0gIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICB1cGJfc3RydGFibGUgKnQ7Ci0KLSAgLyogSXQgd291bGQgYmUgbmljZSB0byBzdGFjay1hbGxvY2F0ZSB0aGlzLCBidXQgcHJvdG9idWZzIGRvIG5vdCBsaW1pdCB0aGUKLSAgICogbGVuZ3RoIG9mIGZpZWxkcyB0byBhbnkgcmVhc29uYWJsZSBsaW1pdC4gKi8KLSAgY2hhciAqYnVmID0gTlVMTDsKLSAgc2l6ZV90IGxlbiA9IDA7Ci0KLSAgaWYgKHVwYl9pbnR0YWJsZV9sb29rdXBwdHIoJm0tPm5hbWVfdGFibGVzLCBtZCwgTlVMTCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvKiBUT0RPKGhhYmVybWFuKTogaGFuZGxlIG1hbGxvYyBmYWlsdXJlLiAqLwotICB0ID0gdXBiX2dtYWxsb2Moc2l6ZW9mKCp0KSk7Ci0gIHVwYl9zdHJ0YWJsZV9pbml0KHQsIFVQQl9DVFlQRV9DT05TVFBUUik7Ci0gIHVwYl9pbnR0YWJsZV9pbnNlcnRwdHIoJm0tPm5hbWVfdGFibGVzLCBtZCwgdXBiX3ZhbHVlX3B0cih0KSk7Ci0KLSAgZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmksIG1kKTsKLSAgICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICAgICAgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0KLSAgICAvKiBBZGQgYW4gZW50cnkgZm9yIHRoZSBKU09OIG5hbWUuICovCi0gICAgc2l6ZV90IGZpZWxkX2xlbiA9IHVwYl9maWVsZGRlZl9nZXRqc29ubmFtZShmLCBidWYsIGxlbik7Ci0gICAgaWYgKGZpZWxkX2xlbiA+IGxlbikgewotICAgICAgc2l6ZV90IGxlbjI7Ci0gICAgICBidWYgPSB1cGJfZ3JlYWxsb2MoYnVmLCAwLCBmaWVsZF9sZW4pOwotICAgICAgbGVuID0gZmllbGRfbGVuOwotICAgICAgbGVuMiA9IHVwYl9maWVsZGRlZl9nZXRqc29ubmFtZShmLCBidWYsIGxlbik7Ci0gICAgICBVUEJfQVNTRVJUX1ZBUihsZW4yLCBsZW4gPT0gbGVuMik7Ci0gICAgfQotICAgIHVwYl9zdHJ0YWJsZV9pbnNlcnQodCwgYnVmLCB1cGJfdmFsdWVfY29uc3RwdHIoZikpOwotCi0gICAgaWYgKHN0cmNtcChidWYsIHVwYl9maWVsZGRlZl9uYW1lKGYpKSAhPSAwKSB7Ci0gICAgICAvKiBTaW5jZSB0aGUgSlNPTiBuYW1lIGlzIGRpZmZlcmVudCBmcm9tIHRoZSByZWd1bGFyIGZpZWxkIG5hbWUsIGFkZCBhbgotICAgICAgICogZW50cnkgZm9yIHRoZSByYXcgbmFtZSAoY29tcGxpYW50IHByb3RvMyBKU09OIHBhcnNlcnMgbXVzdCBhY2NlcHQKLSAgICAgICAqIGJvdGgpLiAqLwotICAgICAgdXBiX3N0cnRhYmxlX2luc2VydCh0LCB1cGJfZmllbGRkZWZfbmFtZShmKSwgdXBiX3ZhbHVlX2NvbnN0cHRyKGYpKTsKLSAgICB9Ci0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2lzc3VibXNnKGYpKSB7Ci0gICAgICBhZGRfanNvbm5hbWVfdGFibGUobSwgdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZihmKSk7Ci0gICAgfQotICB9Ci0KLSAgdXBiX2dmcmVlKGJ1Zik7Ci19Ci0KLS8qIFB1YmxpYyBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVwYl9qc29uX3BhcnNlciAqdXBiX2pzb25fcGFyc2VyX2NyZWF0ZSh1cGJfZW52ICplbnYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2pzb25fcGFyc2VybWV0aG9kICptZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NpbmsgKm91dHB1dCkgewotI2lmbmRlZiBOREVCVUcKLSAgY29uc3Qgc2l6ZV90IHNpemVfYmVmb3JlID0gdXBiX2Vudl9ieXRlc2FsbG9jYXRlZChlbnYpOwotI2VuZGlmCi0gIHVwYl9qc29uX3BhcnNlciAqcCA9IHVwYl9lbnZfbWFsbG9jKGVudiwgc2l6ZW9mKHVwYl9qc29uX3BhcnNlcikpOwotICBpZiAoIXApIHJldHVybiBmYWxzZTsKLQotICBwLT5lbnYgPSBlbnY7Ci0gIHAtPm1ldGhvZCA9IG1ldGhvZDsKLSAgcC0+bGltaXQgPSBwLT5zdGFjayArIFVQQl9KU09OX01BWF9ERVBUSDsKLSAgcC0+YWNjdW11bGF0ZV9idWYgPSBOVUxMOwotICBwLT5hY2N1bXVsYXRlX2J1Zl9zaXplID0gMDsKLSAgdXBiX2J5dGVzc2lua19yZXNldCgmcC0+aW5wdXRfLCAmbWV0aG9kLT5pbnB1dF9oYW5kbGVyXywgcCk7Ci0KLSAganNvbl9wYXJzZXJfcmVzZXQocCk7Ci0gIHVwYl9zaW5rX3Jlc2V0KCZwLT50b3AtPnNpbmssIG91dHB1dC0+aGFuZGxlcnMsIG91dHB1dC0+Y2xvc3VyZSk7Ci0gIHAtPnRvcC0+bSA9IHVwYl9oYW5kbGVyc19tc2dkZWYob3V0cHV0LT5oYW5kbGVycyk7Ci0gIHNldF9uYW1lX3RhYmxlKHAsIHAtPnRvcCk7Ci0KLSAgLyogSWYgdGhpcyBmYWlscywgdW5jb21tZW50IGFuZCBpbmNyZWFzZSB0aGUgdmFsdWUgaW4gcGFyc2VyLmguICovCi0gIC8qIGZwcmludGYoc3RkZXJyLCAiJXpkXG4iLCB1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGVudikgLSBzaXplX2JlZm9yZSk7ICovCi0gIGFzc2VydCh1cGJfZW52X2J5dGVzYWxsb2NhdGVkKGVudikgLSBzaXplX2JlZm9yZSA8PSBVUEJfSlNPTl9QQVJTRVJfU0laRSk7Ci0gIHJldHVybiBwOwotfQotCi11cGJfYnl0ZXNzaW5rICp1cGJfanNvbl9wYXJzZXJfaW5wdXQodXBiX2pzb25fcGFyc2VyICpwKSB7Ci0gIHJldHVybiAmcC0+aW5wdXRfOwotfQotCi11cGJfanNvbl9wYXJzZXJtZXRob2QgKnVwYl9qc29uX3BhcnNlcm1ldGhvZF9uZXcoY29uc3QgdXBiX21zZ2RlZiogbWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogb3duZXIpIHsKLSAgc3RhdGljIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsIHZ0YmwgPSB7dmlzaXRfanNvbl9wYXJzZXJtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWVfanNvbl9wYXJzZXJtZXRob2R9OwotICB1cGJfanNvbl9wYXJzZXJtZXRob2QgKnJldCA9IHVwYl9nbWFsbG9jKHNpemVvZigqcmV0KSk7Ci0gIHVwYl9yZWZjb3VudGVkX2luaXQodXBiX2pzb25fcGFyc2VybWV0aG9kX3VwY2FzdF9tdXRhYmxlKHJldCksICZ2dGJsLCBvd25lcik7Ci0KLSAgcmV0LT5tc2cgPSBtZDsKLSAgdXBiX3JlZjIobWQsIHJldCk7Ci0KLSAgdXBiX2J5dGVzaGFuZGxlcl9pbml0KCZyZXQtPmlucHV0X2hhbmRsZXJfKTsKLSAgdXBiX2J5dGVzaGFuZGxlcl9zZXRzdHJpbmcoJnJldC0+aW5wdXRfaGFuZGxlcl8sIHBhcnNlLCByZXQpOwotICB1cGJfYnl0ZXNoYW5kbGVyX3NldGVuZHN0cigmcmV0LT5pbnB1dF9oYW5kbGVyXywgZW5kLCByZXQpOwotCi0gIHVwYl9pbnR0YWJsZV9pbml0KCZyZXQtPm5hbWVfdGFibGVzLCBVUEJfQ1RZUEVfUFRSKTsKLQotICBhZGRfanNvbm5hbWVfdGFibGUocmV0LCBtZCk7Ci0KLSAgcmV0dXJuIHJldDsKLX0KLQotY29uc3QgdXBiX2J5dGVzaGFuZGxlciAqdXBiX2pzb25fcGFyc2VybWV0aG9kX2lucHV0aGFuZGxlcigKLSAgICBjb25zdCB1cGJfanNvbl9wYXJzZXJtZXRob2QgKm0pIHsKLSAgcmV0dXJuICZtLT5pbnB1dF9oYW5kbGVyXzsKLX0KLS8qCi0qKiBUaGlzIGN1cnJlbnRseSB1c2VzIHNucHJpbnRmKCkgdG8gZm9ybWF0IHByaW1pdGl2ZXMsIGFuZCBjb3VsZCBiZSBvcHRpbWl6ZWQKLSoqIGZ1cnRoZXIuCi0qLwotCi0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxzdGRpbnQuaD4KLQotc3RydWN0IHVwYl9qc29uX3ByaW50ZXIgewotICB1cGJfc2luayBpbnB1dF87Ci0gIC8qIEJ5dGVzU2luayBjbG9zdXJlLiAqLwotICB2b2lkICpzdWJjXzsKLSAgdXBiX2J5dGVzc2luayAqb3V0cHV0XzsKLQotICAvKiBXZSB0cmFjayB0aGUgZGVwdGggc28gdGhhdCB3ZSBrbm93IHdoZW4gdG8gZW1pdCBzdGFydHN0ci9lbmRzdHIgb24gdGhlCi0gICAqIG91dHB1dC4gKi8KLSAgaW50IGRlcHRoXzsKLQotICAvKiBIYXZlIHdlIGVtaXR0ZWQgdGhlIGZpcnN0IGVsZW1lbnQ/IFRoaXMgc3RhdGUgaXMgbmVjZXNzYXJ5IHRvIGVtaXQgY29tbWFzCi0gICAqIHdpdGhvdXQgbGVhdmluZyBhIHRyYWlsaW5nIGNvbW1hIGluIGFycmF5cy9tYXBzLiBXZSBrZWVwIHRoaXMgc3RhdGUgcGVyCi0gICAqIGZyYW1lIGRlcHRoLgotICAgKgotICAgKiBXaHkgbWF4X2RlcHRoICogMj8gVVBCX01BWF9IQU5ETEVSX0RFUFRIIGNvdW50cyBkZXB0aCBhcyBuZXN0ZWQgbWVzc2FnZXMuCi0gICAqIFdlIGNvdW50IGZyYW1lcyAoY29udGV4dHMgaW4gd2hpY2ggd2Ugc2VwYXJhdGUgZWxlbWVudHMgYnkgY29tbWFzKSBhcyBib3RoCi0gICAqIHJlcGVhdGVkIGZpZWxkcyBhbmQgbWVzc2FnZXMgKG1hcHMpLCBhbmQgdGhlIHdvcnN0IGNhc2UgaXMgYQotICAgKiBtZXNzYWdlLT5yZXBlYXRlZCBmaWVsZC0+c3VibWVzc2FnZS0+cmVwZWF0ZWQgZmllbGQtPi4uLiBuZXN0aW5nLiAqLwotICBib29sIGZpcnN0X2VsZW1fW1VQQl9NQVhfSEFORExFUl9ERVBUSCAqIDJdOwotfTsKLQotLyogU3RyaW5nUGllY2U7IGEgcG9pbnRlciBwbHVzIGEgbGVuZ3RoLiAqLwotdHlwZWRlZiBzdHJ1Y3QgewotICBjaGFyICpwdHI7Ci0gIHNpemVfdCBsZW47Ci19IHN0cnBjOwotCi12b2lkIGZyZWVzdHJwYyh2b2lkICpwdHIpIHsKLSAgc3RycGMgKnBjID0gcHRyOwotICB1cGJfZ2ZyZWUocGMtPnB0cik7Ci0gIHVwYl9nZnJlZShwYyk7Ci19Ci0KLS8qIENvbnZlcnQgZmllbGRkZWYgbmFtZSB0byBKU09OIG5hbWUgYW5kIHJldHVybiBhcyBhIHN0cmluZyBwaWVjZS4gKi8KLXN0cnBjICpuZXdzdHJwYyh1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICBib29sIHByZXNlcnZlX2ZpZWxkbmFtZXMpIHsKLSAgLyogVE9ETyhoYWJlcm1hbik6IGhhbmRsZSBtYWxsb2MgZmFpbHVyZS4gKi8KLSAgc3RycGMgKnJldCA9IHVwYl9nbWFsbG9jKHNpemVvZigqcmV0KSk7Ci0gIGlmIChwcmVzZXJ2ZV9maWVsZG5hbWVzKSB7Ci0gICAgcmV0LT5wdHIgPSB1cGJfZ3N0cmR1cCh1cGJfZmllbGRkZWZfbmFtZShmKSk7Ci0gICAgcmV0LT5sZW4gPSBzdHJsZW4ocmV0LT5wdHIpOwotICB9IGVsc2UgewotICAgIHNpemVfdCBsZW47Ci0gICAgcmV0LT5sZW4gPSB1cGJfZmllbGRkZWZfZ2V0anNvbm5hbWUoZiwgTlVMTCwgMCk7Ci0gICAgcmV0LT5wdHIgPSB1cGJfZ21hbGxvYyhyZXQtPmxlbik7Ci0gICAgbGVuID0gdXBiX2ZpZWxkZGVmX2dldGpzb25uYW1lKGYsIHJldC0+cHRyLCByZXQtPmxlbik7Ci0gICAgVVBCX0FTU0VSVF9WQVIobGVuLCBsZW4gPT0gcmV0LT5sZW4pOwotICAgIHJldC0+bGVuLS07ICAvKiBOVUxMICovCi0gIH0KLQotICB1cGJfaGFuZGxlcnNfYWRkY2xlYW51cChoLCByZXQsIGZyZWVzdHJwYyk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8qIC0tLS0tLS0tLS0tLSBKU09OIHN0cmluZyBwcmludGluZzogdmFsdWVzLCBtYXBzLCBhcnJheXMgLS0tLS0tLS0tLS0tLS0tLS0tICovCi0KLXN0YXRpYyB2b2lkIHByaW50X2RhdGEoCi0gICAgdXBiX2pzb25fcHJpbnRlciAqcCwgY29uc3QgY2hhciAqYnVmLCB1bnNpZ25lZCBpbnQgbGVuKSB7Ci0gIC8qIFRPRE86IFdpbGwgbmVlZCB0byBjaGFuZ2UgaWYgd2Ugc3VwcG9ydCBwdXNoYmFjayBmcm9tIHRoZSBzaW5rLiAqLwotICBzaXplX3QgbiA9IHVwYl9ieXRlc3NpbmtfcHV0YnVmKHAtPm91dHB1dF8sIHAtPnN1YmNfLCBidWYsIGxlbiwgTlVMTCk7Ci0gIFVQQl9BU1NFUlRfVkFSKG4sIG4gPT0gbGVuKTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfY29tbWEodXBiX2pzb25fcHJpbnRlciAqcCkgewotICBpZiAoIXAtPmZpcnN0X2VsZW1fW3AtPmRlcHRoX10pIHsKLSAgICBwcmludF9kYXRhKHAsICIsIiwgMSk7Ci0gIH0KLSAgcC0+Zmlyc3RfZWxlbV9bcC0+ZGVwdGhfXSA9IGZhbHNlOwotfQotCi0vKiBIZWxwZXJzIHRoYXQgcHJpbnQgcHJvcGVybHkgZm9ybWF0dGVkIGVsZW1lbnRzIHRvIHRoZSBKU09OIG91dHB1dCBzdHJlYW0uICovCi0KLS8qIFVzZWQgZm9yIGVzY2FwaW5nIGNvbnRyb2wgY2hhcnMgaW4gc3RyaW5ncy4gKi8KLXN0YXRpYyBjb25zdCBjaGFyIGtDb250cm9sQ2hhckxpbWl0ID0gMHgyMDsKLQotVVBCX0lOTElORSBib29sIGlzX2pzb25fZXNjYXBlZChjaGFyIGMpIHsKLSAgLyogU2VlIFJGQyA0NjI3LiAqLwotICB1bnNpZ25lZCBjaGFyIHVjID0gKHVuc2lnbmVkIGNoYXIpYzsKLSAgcmV0dXJuIHVjIDwga0NvbnRyb2xDaGFyTGltaXQgfHwgdWMgPT0gJyInIHx8IHVjID09ICdcXCc7Ci19Ci0KLVVQQl9JTkxJTkUgY29uc3QgY2hhcioganNvbl9uaWNlX2VzY2FwZShjaGFyIGMpIHsKLSAgc3dpdGNoIChjKSB7Ci0gICAgY2FzZSAnIic6ICByZXR1cm4gIlxcXCIiOwotICAgIGNhc2UgJ1xcJzogcmV0dXJuICJcXFxcIjsKLSAgICBjYXNlICdcYic6IHJldHVybiAiXFxiIjsKLSAgICBjYXNlICdcZic6IHJldHVybiAiXFxmIjsKLSAgICBjYXNlICdcbic6IHJldHVybiAiXFxuIjsKLSAgICBjYXNlICdccic6IHJldHVybiAiXFxyIjsKLSAgICBjYXNlICdcdCc6IHJldHVybiAiXFx0IjsKLSAgICBkZWZhdWx0OiAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLS8qIFdyaXRlIGEgcHJvcGVybHkgZXNjYXBlZCBzdHJpbmcgY2h1bmsuIFRoZSBzdXJyb3VuZGluZyBxdW90ZXMgYXJlICpub3QqCi0gKiBwcmludGVkOyB0aGlzIGlzIHNvIHRoYXQgdGhlIGNhbGxlciBoYXMgdGhlIG9wdGlvbiBvZiBlbWl0dGluZyB0aGUgc3RyaW5nCi0gKiBjb250ZW50IGluIGNodW5rcy4gKi8KLXN0YXRpYyB2b2lkIHB1dHN0cmluZyh1cGJfanNvbl9wcmludGVyICpwLCBjb25zdCBjaGFyICpidWYsIHVuc2lnbmVkIGludCBsZW4pIHsKLSAgY29uc3QgY2hhciogdW5lc2NhcGVkX3J1biA9IE5VTEw7Ci0gIHVuc2lnbmVkIGludCBpOwotICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKLSAgICBjaGFyIGMgPSBidWZbaV07Ci0gICAgLyogSGFuZGxlIGVzY2FwaW5nLiAqLwotICAgIGlmIChpc19qc29uX2VzY2FwZWQoYykpIHsKLSAgICAgIC8qIFVzZSBhICJuaWNlIiBlc2NhcGUsIGxpa2UgXG4sIGlmIG9uZSBleGlzdHMgZm9yIHRoaXMgY2hhcmFjdGVyLiAqLwotICAgICAgY29uc3QgY2hhciogZXNjYXBlID0ganNvbl9uaWNlX2VzY2FwZShjKTsKLSAgICAgIC8qIElmIHdlIGRvbid0IGhhdmUgYSBzcGVjaWZpYyAnbmljZScgZXNjYXBlIGNvZGUsIHVzZSBhIFx1WFhYWC1zdHlsZQotICAgICAgICogZXNjYXBlLiAqLwotICAgICAgY2hhciBlc2NhcGVfYnVmWzhdOwotICAgICAgaWYgKCFlc2NhcGUpIHsKLSAgICAgICAgdW5zaWduZWQgY2hhciBieXRlID0gKHVuc2lnbmVkIGNoYXIpYzsKLSAgICAgICAgX3VwYl9zbnByaW50Zihlc2NhcGVfYnVmLCBzaXplb2YoZXNjYXBlX2J1ZiksICJcXHUlMDR4IiwgKGludClieXRlKTsKLSAgICAgICAgZXNjYXBlID0gZXNjYXBlX2J1ZjsKLSAgICAgIH0KLQotICAgICAgLyogTi5CLiB0aGF0IHdlIGFzc3VtZSB0aGF0IHRoZSBpbnB1dCBlbmNvZGluZyBpcyBlcXVhbCB0byB0aGUgb3V0cHV0Ci0gICAgICAgKiBlbmNvZGluZyAoYm90aCBVVEYtOCBmb3IgIG5vdyksIHNvIGZvciBjaGFycyA+PSAweDIwIGFuZCAhPSBcLCAiLCB3ZQotICAgICAgICogY2FuIHNpbXBseSBwYXNzIHRoZSBieXRlcyB0aHJvdWdoLiAqLwotCi0gICAgICAvKiBJZiB0aGVyZSdzIGEgY3VycmVudCBydW4gb2YgdW5lc2NhcGVkIGNoYXJzLCBwcmludCB0aGF0IHJ1biBmaXJzdC4gKi8KLSAgICAgIGlmICh1bmVzY2FwZWRfcnVuKSB7Ci0gICAgICAgIHByaW50X2RhdGEocCwgdW5lc2NhcGVkX3J1biwgJmJ1ZltpXSAtIHVuZXNjYXBlZF9ydW4pOwotICAgICAgICB1bmVzY2FwZWRfcnVuID0gTlVMTDsKLSAgICAgIH0KLSAgICAgIC8qIFRoZW4gcHJpbnQgdGhlIGVzY2FwZSBjb2RlLiAqLwotICAgICAgcHJpbnRfZGF0YShwLCBlc2NhcGUsIHN0cmxlbihlc2NhcGUpKTsKLSAgICB9IGVsc2UgewotICAgICAgLyogQWRkIHRvIHRoZSBjdXJyZW50IHVuZXNjYXBlZCBydW4gb2YgY2hhcmFjdGVycy4gKi8KLSAgICAgIGlmICh1bmVzY2FwZWRfcnVuID09IE5VTEwpIHsKLSAgICAgICAgdW5lc2NhcGVkX3J1biA9ICZidWZbaV07Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyogSWYgdGhlIHN0cmluZyBlbmRlZCBpbiBhIHJ1biBvZiB1bmVzY2FwZWQgY2hhcmFjdGVycywgcHJpbnQgdGhhdCBsYXN0IHJ1bi4gKi8KLSAgaWYgKHVuZXNjYXBlZF9ydW4pIHsKLSAgICBwcmludF9kYXRhKHAsIHVuZXNjYXBlZF9ydW4sICZidWZbbGVuXSAtIHVuZXNjYXBlZF9ydW4pOwotICB9Ci19Ci0KLSNkZWZpbmUgQ0hLTEVOR1RIKHgpIGlmICghKHgpKSByZXR1cm4gLTE7Ci0KLS8qIEhlbHBlcnMgdGhhdCBmb3JtYXQgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGFjY29yZGluZyB0byBvdXIgY3VzdG9tIGZvcm1hdHMuCi0gKiBSaWdodCBub3cgd2UgdXNlICUuOGcgYW5kICUuMTdnIGZvciBmbG9hdC9kb3VibGUsIHJlc3BlY3RpdmVseSwgdG8gbWF0Y2gKLSAqIHByb3RvMjo6dXRpbDo6SnNvbkZvcm1hdCdzIGRlZmF1bHRzLiAgTWF5IHdhbnQgdG8gY2hhbmdlIHRoaXMgbGF0ZXIuICovCi0KLXN0YXRpYyBzaXplX3QgZm10X2RvdWJsZShkb3VibGUgdmFsLCBjaGFyKiBidWYsIHNpemVfdCBsZW5ndGgpIHsKLSAgc2l6ZV90IG4gPSBfdXBiX3NucHJpbnRmKGJ1ZiwgbGVuZ3RoLCAiJS4xN2ciLCB2YWwpOwotICBDSEtMRU5HVEgobiA+IDAgJiYgbiA8IGxlbmd0aCk7Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgc2l6ZV90IGZtdF9mbG9hdChmbG9hdCB2YWwsIGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbmd0aCkgewotICBzaXplX3QgbiA9IF91cGJfc25wcmludGYoYnVmLCBsZW5ndGgsICIlLjhnIiwgdmFsKTsKLSAgQ0hLTEVOR1RIKG4gPiAwICYmIG4gPCBsZW5ndGgpOwotICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHNpemVfdCBmbXRfYm9vbChib29sIHZhbCwgY2hhciogYnVmLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIHNpemVfdCBuID0gX3VwYl9zbnByaW50ZihidWYsIGxlbmd0aCwgIiVzIiwgKHZhbCA/ICJ0cnVlIiA6ICJmYWxzZSIpKTsKLSAgQ0hLTEVOR1RIKG4gPiAwICYmIG4gPCBsZW5ndGgpOwotICByZXR1cm4gbjsKLX0KLQotc3RhdGljIHNpemVfdCBmbXRfaW50NjQobG9uZyB2YWwsIGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbmd0aCkgewotICBzaXplX3QgbiA9IF91cGJfc25wcmludGYoYnVmLCBsZW5ndGgsICIlbGQiLCB2YWwpOwotICBDSEtMRU5HVEgobiA+IDAgJiYgbiA8IGxlbmd0aCk7Ci0gIHJldHVybiBuOwotfQotCi1zdGF0aWMgc2l6ZV90IGZtdF91aW50NjQodW5zaWduZWQgbG9uZyBsb25nIHZhbCwgY2hhciogYnVmLCBzaXplX3QgbGVuZ3RoKSB7Ci0gIHNpemVfdCBuID0gX3VwYl9zbnByaW50ZihidWYsIGxlbmd0aCwgIiVsbHUiLCB2YWwpOwotICBDSEtMRU5HVEgobiA+IDAgJiYgbiA8IGxlbmd0aCk7Ci0gIHJldHVybiBuOwotfQotCi0vKiBQcmludCBhIG1hcCBrZXkgZ2l2ZW4gYSBmaWVsZCBuYW1lLiBDYWxsZWQgYnkgc2NhbGFyIGZpZWxkIGhhbmRsZXJzIGFuZCBieQotICogc3RhcnRzZXEgZm9yIHJlcGVhdGVkIGZpZWxkcy4gKi8KLXN0YXRpYyBib29sIHB1dGtleSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIGNvbnN0IHN0cnBjICprZXkgPSBoYW5kbGVyX2RhdGE7Ci0gIHByaW50X2NvbW1hKHApOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICBwdXRzdHJpbmcocCwga2V5LT5wdHIsIGtleS0+bGVuKTsKLSAgcHJpbnRfZGF0YShwLCAiXCI6IiwgMik7Ci0gIHJldHVybiB0cnVlOwotfQotCi0jZGVmaW5lIENIS0ZNVCh2YWwpIGlmICgodmFsKSA9PSAoc2l6ZV90KS0xKSByZXR1cm4gZmFsc2U7Ci0jZGVmaW5lIENISyh2YWwpICAgIGlmICghKHZhbCkpIHJldHVybiBmYWxzZTsKLQotI2RlZmluZSBUWVBFX0hBTkRMRVJTKHR5cGUsIGZtdF9mdW5jKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBib29sIHB1dCMjdHlwZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsIHR5cGUgdmFsKSB7IFwKLSAgICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgZGF0YVs2NF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc2l6ZV90IGxlbmd0aCA9IGZtdF9mdW5jKHZhbCwgZGF0YSwgc2l6ZW9mKGRhdGEpKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENIS0ZNVChsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRfZGF0YShwLCBkYXRhLCBsZW5ndGgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBib29sIHNjYWxhcl8jI3R5cGUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIHZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENISyhwdXRrZXkoY2xvc3VyZSwgaGFuZGxlcl9kYXRhKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgQ0hLKHB1dCMjdHlwZShjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHZhbCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBib29sIHJlcGVhdGVkXyMjdHlwZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgdmFsKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRfY29tbWEocCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDSEsocHV0IyN0eXBlKGNsb3N1cmUsIGhhbmRsZXJfZGF0YSwgdmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2RlZmluZSBUWVBFX0hBTkRMRVJTX01BUEtFWSh0eXBlLCBmbXRfZnVuYykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHN0YXRpYyBib29sIHB1dG1hcGtleV8jI3R5cGUodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLCAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlIHZhbCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBDSEsocHV0IyN0eXBlKGNsb3N1cmUsIGhhbmRsZXJfZGF0YSwgdmFsKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHByaW50X2RhdGEocCwgIlwiOiIsIDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1UWVBFX0hBTkRMRVJTKGRvdWJsZSwgICBmbXRfZG91YmxlKQotVFlQRV9IQU5ETEVSUyhmbG9hdCwgICAgZm10X2Zsb2F0KQotVFlQRV9IQU5ETEVSUyhib29sLCAgICAgZm10X2Jvb2wpCi1UWVBFX0hBTkRMRVJTKGludDMyX3QsICBmbXRfaW50NjQpCi1UWVBFX0hBTkRMRVJTKHVpbnQzMl90LCBmbXRfaW50NjQpCi1UWVBFX0hBTkRMRVJTKGludDY0X3QsICBmbXRfaW50NjQpCi1UWVBFX0hBTkRMRVJTKHVpbnQ2NF90LCBmbXRfdWludDY0KQotCi0vKiBkb3VibGUgYW5kIGZsb2F0IGFyZSBub3QgYWxsb3dlZCB0byBiZSBtYXAga2V5cy4gKi8KLVRZUEVfSEFORExFUlNfTUFQS0VZKGJvb2wsICAgICBmbXRfYm9vbCkKLVRZUEVfSEFORExFUlNfTUFQS0VZKGludDMyX3QsICBmbXRfaW50NjQpCi1UWVBFX0hBTkRMRVJTX01BUEtFWSh1aW50MzJfdCwgZm10X2ludDY0KQotVFlQRV9IQU5ETEVSU19NQVBLRVkoaW50NjRfdCwgIGZtdF9pbnQ2NCkKLVRZUEVfSEFORExFUlNfTUFQS0VZKHVpbnQ2NF90LCBmbXRfdWludDY0KQotCi0jdW5kZWYgVFlQRV9IQU5ETEVSUwotI3VuZGVmIFRZUEVfSEFORExFUlNfTUFQS0VZCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdm9pZCAqa2V5bmFtZTsKLSAgY29uc3QgdXBiX2VudW1kZWYgKmVudW1kZWY7Ci19IEVudW1IYW5kbGVyRGF0YTsKLQotc3RhdGljIGJvb2wgc2NhbGFyX2VudW0odm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwpIHsKLSAgY29uc3QgRW51bUhhbmRsZXJEYXRhICpoZCA9IGhhbmRsZXJfZGF0YTsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIGNvbnN0IGNoYXIgKnN5bWJvbGljX25hbWU7Ci0KLSAgQ0hLKHB1dGtleShjbG9zdXJlLCBoZC0+a2V5bmFtZSkpOwotCi0gIHN5bWJvbGljX25hbWUgPSB1cGJfZW51bWRlZl9pdG9uKGhkLT5lbnVtZGVmLCB2YWwpOwotICBpZiAoc3ltYm9saWNfbmFtZSkgewotICAgIHByaW50X2RhdGEocCwgIlwiIiwgMSk7Ci0gICAgcHV0c3RyaW5nKHAsIHN5bWJvbGljX25hbWUsIHN0cmxlbihzeW1ib2xpY19uYW1lKSk7Ci0gICAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgfSBlbHNlIHsKLSAgICBwdXRpbnQzMl90KGNsb3N1cmUsIE5VTEwsIHZhbCk7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgcHJpbnRfZW51bV9zeW1ib2xpY19uYW1lKHVwYl9qc29uX3ByaW50ZXIgKnAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2VudW1kZWYgKmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IHZhbCkgewotICBjb25zdCBjaGFyICpzeW1ib2xpY19uYW1lID0gdXBiX2VudW1kZWZfaXRvbihkZWYsIHZhbCk7Ci0gIGlmIChzeW1ib2xpY19uYW1lKSB7Ci0gICAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgICBwdXRzdHJpbmcocCwgc3ltYm9saWNfbmFtZSwgc3RybGVuKHN5bWJvbGljX25hbWUpKTsKLSAgICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICB9IGVsc2UgewotICAgIHB1dGludDMyX3QocCwgTlVMTCwgdmFsKTsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCByZXBlYXRlZF9lbnVtKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgaW50MzJfdCB2YWwpIHsKLSAgY29uc3QgRW51bUhhbmRsZXJEYXRhICpoZCA9IGhhbmRsZXJfZGF0YTsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIHByaW50X2NvbW1hKHApOwotCi0gIHByaW50X2VudW1fc3ltYm9saWNfbmFtZShwLCBoZC0+ZW51bWRlZiwgdmFsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgbWFwdmFsdWVfZW51bSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyX3QgdmFsKSB7Ci0gIGNvbnN0IEVudW1IYW5kbGVyRGF0YSAqaGQgPSBoYW5kbGVyX2RhdGE7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotCi0gIHByaW50X2VudW1fc3ltYm9saWNfbmFtZShwLCBoZC0+ZW51bWRlZiwgdmFsKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgKnNjYWxhcl9zdGFydHN1Ym1zZyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgcmV0dXJuIHB1dGtleShjbG9zdXJlLCBoYW5kbGVyX2RhdGEpID8gY2xvc3VyZSA6IFVQQl9CUkVBSzsKLX0KLQotc3RhdGljIHZvaWQgKnJlcGVhdGVkX3N0YXJ0c3VibXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBwcmludF9jb21tYShwKTsKLSAgcmV0dXJuIGNsb3N1cmU7Ci19Ci0KLXN0YXRpYyB2b2lkIHN0YXJ0X2ZyYW1lKHVwYl9qc29uX3ByaW50ZXIgKnApIHsKLSAgcC0+ZGVwdGhfKys7Ci0gIHAtPmZpcnN0X2VsZW1fW3AtPmRlcHRoX10gPSB0cnVlOwotICBwcmludF9kYXRhKHAsICJ7IiwgMSk7Ci19Ci0KLXN0YXRpYyB2b2lkIGVuZF9mcmFtZSh1cGJfanNvbl9wcmludGVyICpwKSB7Ci0gIHByaW50X2RhdGEocCwgIn0iLCAxKTsKLSAgcC0+ZGVwdGhfLS07Ci19Ci0KLXN0YXRpYyBib29sIHByaW50ZXJfc3RhcnRtc2codm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIGlmIChwLT5kZXB0aF8gPT0gMCkgewotICAgIHVwYl9ieXRlc3Npbmtfc3RhcnQocC0+b3V0cHV0XywgMCwgJnAtPnN1YmNfKTsKLSAgfQotICBzdGFydF9mcmFtZShwKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyBib29sIHByaW50ZXJfZW5kbXNnKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwgdXBiX3N0YXR1cyAqcykgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBVUEJfVU5VU0VEKHMpOwotICBlbmRfZnJhbWUocCk7Ci0gIGlmIChwLT5kZXB0aF8gPT0gMCkgewotICAgIHVwYl9ieXRlc3NpbmtfZW5kKHAtPm91dHB1dF8pOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgdm9pZCAqc3RhcnRzZXEodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBDSEsocHV0a2V5KGNsb3N1cmUsIGhhbmRsZXJfZGF0YSkpOwotICBwLT5kZXB0aF8rKzsKLSAgcC0+Zmlyc3RfZWxlbV9bcC0+ZGVwdGhfXSA9IHRydWU7Ci0gIHByaW50X2RhdGEocCwgIlsiLCAxKTsKLSAgcmV0dXJuIGNsb3N1cmU7Ci19Ci0KLXN0YXRpYyBib29sIGVuZHNlcSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgcHJpbnRfZGF0YShwLCAiXSIsIDEpOwotICBwLT5kZXB0aF8tLTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0YXRpYyB2b2lkICpzdGFydG1hcCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIENISyhwdXRrZXkoY2xvc3VyZSwgaGFuZGxlcl9kYXRhKSk7Ci0gIHAtPmRlcHRoXysrOwotICBwLT5maXJzdF9lbGVtX1twLT5kZXB0aF9dID0gdHJ1ZTsKLSAgcHJpbnRfZGF0YShwLCAieyIsIDEpOwotICByZXR1cm4gY2xvc3VyZTsKLX0KLQotc3RhdGljIGJvb2wgZW5kbWFwKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBwcmludF9kYXRhKHAsICJ9IiwgMSk7Ci0gIHAtPmRlcHRoXy0tOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHNpemVfdCBwdXRzdHIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLCBjb25zdCBjaGFyICpzdHIsCi0gICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgVVBCX1VOVVNFRChoYW5kbGUpOwotICBwdXRzdHJpbmcocCwgc3RyLCBsZW4pOwotICByZXR1cm4gbGVuOwotfQotCi0vKiBUaGlzIGhhcyB0byBCYXNlNjQgZW5jb2RlIHRoZSBieXRlcywgYmVjYXVzZSBKU09OIGhhcyBubyAiYnl0ZXMiIHR5cGUuICovCi1zdGF0aWMgc2l6ZV90IHB1dGJ5dGVzKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwgY29uc3QgY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0KLSAgLyogVGhpcyBpcyB0aGUgcmVndWxhciBiYXNlNjQsIG5vdCB0aGUgIndlYi1zYWZlIiB2ZXJzaW9uLiAqLwotICBzdGF0aWMgY29uc3QgY2hhciBiYXNlNjRbXSA9Ci0gICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7Ci0KLSAgLyogQmFzZTY0LWVuY29kZS4gKi8KLSAgY2hhciBkYXRhWzE2MDAwXTsKLSAgY29uc3QgY2hhciAqbGltaXQgPSBkYXRhICsgc2l6ZW9mKGRhdGEpOwotICBjb25zdCB1bnNpZ25lZCBjaGFyICpmcm9tID0gKGNvbnN0IHVuc2lnbmVkIGNoYXIqKXN0cjsKLSAgY2hhciAqdG8gPSBkYXRhOwotICBzaXplX3QgcmVtYWluaW5nID0gbGVuOwotICBzaXplX3QgYnl0ZXM7Ci0KLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0KLSAgd2hpbGUgKHJlbWFpbmluZyA+IDIpIHsKLSAgICAvKiBUT0RPKGhhYmVybWFuKTogaGFuZGxlIGVuY29kZWQgbGVuZ3RocyA+IHNpemVvZihkYXRhKSAqLwotICAgIFVQQl9BU1NFUlRfVkFSKGxpbWl0LCAobGltaXQgLSB0bykgPj0gNCk7Ci0KLSAgICB0b1swXSA9IGJhc2U2NFtmcm9tWzBdID4+IDJdOwotICAgIHRvWzFdID0gYmFzZTY0WygoZnJvbVswXSAmIDB4MykgPDwgNCkgfCAoZnJvbVsxXSA+PiA0KV07Ci0gICAgdG9bMl0gPSBiYXNlNjRbKChmcm9tWzFdICYgMHhmKSA8PCAyKSB8IChmcm9tWzJdID4+IDYpXTsKLSAgICB0b1szXSA9IGJhc2U2NFtmcm9tWzJdICYgMHgzZl07Ci0KLSAgICByZW1haW5pbmcgLT0gMzsKLSAgICB0byArPSA0OwotICAgIGZyb20gKz0gMzsKLSAgfQotCi0gIHN3aXRjaCAocmVtYWluaW5nKSB7Ci0gICAgY2FzZSAyOgotICAgICAgdG9bMF0gPSBiYXNlNjRbZnJvbVswXSA+PiAyXTsKLSAgICAgIHRvWzFdID0gYmFzZTY0WygoZnJvbVswXSAmIDB4MykgPDwgNCkgfCAoZnJvbVsxXSA+PiA0KV07Ci0gICAgICB0b1syXSA9IGJhc2U2NFsoZnJvbVsxXSAmIDB4ZikgPDwgMl07Ci0gICAgICB0b1szXSA9ICc9JzsKLSAgICAgIHRvICs9IDQ7Ci0gICAgICBmcm9tICs9IDI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIDE6Ci0gICAgICB0b1swXSA9IGJhc2U2NFtmcm9tWzBdID4+IDJdOwotICAgICAgdG9bMV0gPSBiYXNlNjRbKChmcm9tWzBdICYgMHgzKSA8PCA0KV07Ci0gICAgICB0b1syXSA9ICc9JzsKLSAgICAgIHRvWzNdID0gJz0nOwotICAgICAgdG8gKz0gNDsKLSAgICAgIGZyb20gKz0gMTsKLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgYnl0ZXMgPSB0byAtIGRhdGE7Ci0gIHByaW50X2RhdGEocCwgIlwiIiwgMSk7Ci0gIHB1dHN0cmluZyhwLCBkYXRhLCBieXRlcyk7Ci0gIHByaW50X2RhdGEocCwgIlwiIiwgMSk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyB2b2lkICpzY2FsYXJfc3RhcnRzdHIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIFVQQl9VTlVTRUQoc2l6ZV9oaW50KTsKLSAgQ0hLKHB1dGtleShjbG9zdXJlLCBoYW5kbGVyX2RhdGEpKTsKLSAgcHJpbnRfZGF0YShwLCAiXCIiLCAxKTsKLSAgcmV0dXJuIHA7Ci19Ci0KLXN0YXRpYyBzaXplX3Qgc2NhbGFyX3N0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUgKmhhbmRsZSkgewotICBDSEsocHV0c3RyKGNsb3N1cmUsIGhhbmRsZXJfZGF0YSwgc3RyLCBsZW4sIGhhbmRsZSkpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgYm9vbCBzY2FsYXJfZW5kc3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgKnJlcGVhdGVkX3N0YXJ0c3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIFVQQl9VTlVTRUQoc2l6ZV9oaW50KTsKLSAgcHJpbnRfY29tbWEocCk7Ci0gIHByaW50X2RhdGEocCwgIlwiIiwgMSk7Ci0gIHJldHVybiBwOwotfQotCi1zdGF0aWMgc2l6ZV90IHJlcGVhdGVkX3N0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgQ0hLKHB1dHN0cihjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHN0ciwgbGVuLCBoYW5kbGUpKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIGJvb2wgcmVwZWF0ZWRfZW5kc3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHZvaWQgKm1hcGtleXZhbF9zdGFydHN0cih2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplX2hpbnQpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIFVQQl9VTlVTRUQoaGFuZGxlcl9kYXRhKTsKLSAgVVBCX1VOVVNFRChzaXplX2hpbnQpOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICByZXR1cm4gcDsKLX0KLQotc3RhdGljIHNpemVfdCBtYXBrZXlfc3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIENISyhwdXRzdHIoY2xvc3VyZSwgaGFuZGxlcl9kYXRhLCBzdHIsIGxlbiwgaGFuZGxlKSk7Ci0gIHJldHVybiBsZW47Ci19Ci0KLXN0YXRpYyBib29sIG1hcGtleV9lbmRzdHIodm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBVUEJfVU5VU0VEKGhhbmRsZXJfZGF0YSk7Ci0gIHByaW50X2RhdGEocCwgIlwiOiIsIDIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIGJvb2wgbWFwdmFsdWVfZW5kc3RyKHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhhbmRsZXJfZGF0YSkgewotICB1cGJfanNvbl9wcmludGVyICpwID0gY2xvc3VyZTsKLSAgVVBCX1VOVVNFRChoYW5kbGVyX2RhdGEpOwotICBwcmludF9kYXRhKHAsICJcIiIsIDEpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RhdGljIHNpemVfdCBzY2FsYXJfYnl0ZXModm9pZCAqY2xvc3VyZSwgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIENISyhwdXRrZXkoY2xvc3VyZSwgaGFuZGxlcl9kYXRhKSk7Ci0gIENISyhwdXRieXRlcyhjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHN0ciwgbGVuLCBoYW5kbGUpKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RhdGljIHNpemVfdCByZXBlYXRlZF9ieXRlcyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSBjbG9zdXJlOwotICBwcmludF9jb21tYShwKTsKLSAgQ0hLKHB1dGJ5dGVzKGNsb3N1cmUsIGhhbmRsZXJfZGF0YSwgc3RyLCBsZW4sIGhhbmRsZSkpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgc2l6ZV90IG1hcGtleV9ieXRlcyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpIHsKLSAgdXBiX2pzb25fcHJpbnRlciAqcCA9IGNsb3N1cmU7Ci0gIENISyhwdXRieXRlcyhjbG9zdXJlLCBoYW5kbGVyX2RhdGEsIHN0ciwgbGVuLCBoYW5kbGUpKTsKLSAgcHJpbnRfZGF0YShwLCAiOiIsIDEpOwotICByZXR1cm4gbGVuOwotfQotCi1zdGF0aWMgdm9pZCBzZXRfZW51bV9oZCh1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICBib29sIHByZXNlcnZlX2ZpZWxkbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgRW51bUhhbmRsZXJEYXRhICpoZCA9IHVwYl9nbWFsbG9jKHNpemVvZihFbnVtSGFuZGxlckRhdGEpKTsKLSAgaGQtPmVudW1kZWYgPSAoY29uc3QgdXBiX2VudW1kZWYgKil1cGJfZmllbGRkZWZfc3ViZGVmKGYpOwotICBoZC0+a2V5bmFtZSA9IG5ld3N0cnBjKGgsIGYsIHByZXNlcnZlX2ZpZWxkbmFtZXMpOwotICB1cGJfaGFuZGxlcnNfYWRkY2xlYW51cChoLCBoZCwgdXBiX2dmcmVlKTsKLSAgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKGF0dHIsIGhkKTsKLX0KLQotLyogU2V0IHVwIGhhbmRsZXJzIGZvciBhIG1hcGVudHJ5IHN1Ym1lc3NhZ2UgKGkuZS4sIGFuIGluZGl2aWR1YWwga2V5L3ZhbHVlIHBhaXIKLSAqIGluIGEgbWFwKS4KLSAqCi0gKiBUT0RPOiBIYW5kbGUgbWlzc2luZyBrZXksIG1pc3NpbmcgdmFsdWUsIG91dC1vZi1vcmRlciBrZXkvdmFsdWUsIG9yIHJlcGVhdGVkCi0gKiBrZXkgb3IgdmFsdWUgY2FzZXMgcHJvcGVybHkuIFRoZSByaWdodCB3YXkgdG8gZG8gdGhpcyBpcyB0byBhbGxvY2F0ZSBhCi0gKiB0ZW1wb3Jhcnkgc3RydWN0dXJlIGF0IHRoZSBzdGFydCBvZiBhIG1hcGVudHJ5IHN1Ym1lc3NhZ2UsIHN0b3JlIGtleSBhbmQKLSAqIHZhbHVlIGRhdGEgaW4gaXQgYXMga2V5IGFuZCB2YWx1ZSBoYW5kbGVycyBhcmUgY2FsbGVkLCBhbmQgdGhlbiBwcmludCB0aGUKLSAqIGtleS92YWx1ZSBwYWlyIG9uY2UgYXQgdGhlIGVuZCBvZiB0aGUgc3VibWVzc2FnZS4gSWYgd2UgZG9uJ3QgZG8gdGhpcywgd2UKLSAqIHNob3VsZCBhdCBsZWFzdCBkZXRlY3QgdGhlIGNhc2UgYW5kIHRocm93IGFuIGVycm9yLiBIb3dldmVyLCBzbyBmYXIgYWxsIG9mCi0gKiBvdXIgc291cmNlcyB0aGF0IGVtaXQgbWFwZW50cnkgbWVzc2FnZXMgZG8gc28gY2Fub25pY2FsbHkgKHdpdGggb25lIGtleQotICogZmllbGQsIGFuZCB0aGVuIG9uZSB2YWx1ZSBmaWVsZCksIHNvIHRoaXMgaXMgbm90IGEgcHJlc3NpbmcgY29uY2VybiBhdCB0aGUKLSAqIG1vbWVudC4gKi8KLXZvaWQgcHJpbnRlcl9zZXRoYW5kbGVyc19tYXBlbnRyeShjb25zdCB2b2lkICpjbG9zdXJlLCBib29sIHByZXNlcnZlX2ZpZWxkbmFtZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJzICpoKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm1kID0gdXBiX2hhbmRsZXJzX21zZ2RlZihoKTsKLQotICAvKiBBIG1hcGVudHJ5IG1lc3NhZ2UgaXMgcHJpbnRlZCBzaW1wbHkgYXMgJyJrZXkiOiB2YWx1ZScuIFJhdGhlciB0aGFuCi0gICAqIHNwZWNpYWwtY2FzZSBrZXkgYW5kIHZhbHVlIGZvciBldmVyeSB0eXBlIGJlbG93LCB3ZSBqdXN0IGhhbmRsZSBib3RoCi0gICAqIGZpZWxkcyBleHBsaWNpdGx5IGhlcmUuICovCi0gIGNvbnN0IHVwYl9maWVsZGRlZioga2V5X2ZpZWxkID0gdXBiX21zZ2RlZl9pdG9mKG1kLCBVUEJfTUFQRU5UUllfS0VZKTsKLSAgY29uc3QgdXBiX2ZpZWxkZGVmKiB2YWx1ZV9maWVsZCA9IHVwYl9tc2dkZWZfaXRvZihtZCwgVVBCX01BUEVOVFJZX1ZBTFVFKTsKLQotICB1cGJfaGFuZGxlcmF0dHIgZW1wdHlfYXR0ciA9IFVQQl9IQU5ETEVSQVRUUl9JTklUSUFMSVpFUjsKLQotICBVUEJfVU5VU0VEKGNsb3N1cmUpOwotCi0gIHN3aXRjaCAodXBiX2ZpZWxkZGVmX3R5cGUoa2V5X2ZpZWxkKSkgewotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwga2V5X2ZpZWxkLCBwdXRtYXBrZXlfaW50MzJfdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9JTlQ2NDoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRpbnQ2NChoLCBrZXlfZmllbGQsIHB1dG1hcGtleV9pbnQ2NF90LCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX1VJTlQzMjoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXR1aW50MzIoaCwga2V5X2ZpZWxkLCBwdXRtYXBrZXlfdWludDMyX3QsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgdXBiX2hhbmRsZXJzX3NldHVpbnQ2NChoLCBrZXlfZmllbGQsIHB1dG1hcGtleV91aW50NjRfdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9CT09MOgotICAgICAgdXBiX2hhbmRsZXJzX3NldGJvb2woaCwga2V5X2ZpZWxkLCBwdXRtYXBrZXlfYm9vbCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwga2V5X2ZpZWxkLCBtYXBrZXl2YWxfc3RhcnRzdHIsICZlbXB0eV9hdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwga2V5X2ZpZWxkLCBtYXBrZXlfc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0ZW5kc3RyKGgsIGtleV9maWVsZCwgbWFwa2V5X2VuZHN0ciwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9CWVRFUzoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwga2V5X2ZpZWxkLCBtYXBrZXlfYnl0ZXMsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBhc3NlcnQoZmFsc2UpOwotICAgICAgYnJlYWs7Ci0gIH0KLQotICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKHZhbHVlX2ZpZWxkKSkgewotICAgIGNhc2UgVVBCX1RZUEVfSU5UMzI6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwgdmFsdWVfZmllbGQsIHB1dGludDMyX3QsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfSU5UNjQ6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0aW50NjQoaCwgdmFsdWVfZmllbGQsIHB1dGludDY0X3QsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDMyOgotICAgICAgdXBiX2hhbmRsZXJzX3NldHVpbnQzMihoLCB2YWx1ZV9maWVsZCwgcHV0dWludDMyX3QsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfVUlOVDY0OgotICAgICAgdXBiX2hhbmRsZXJzX3NldHVpbnQ2NChoLCB2YWx1ZV9maWVsZCwgcHV0dWludDY0X3QsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfQk9PTDoKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRib29sKGgsIHZhbHVlX2ZpZWxkLCBwdXRib29sLCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0ZMT0FUOgotICAgICAgdXBiX2hhbmRsZXJzX3NldGZsb2F0KGgsIHZhbHVlX2ZpZWxkLCBwdXRmbG9hdCwgJmVtcHR5X2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVUEJfVFlQRV9ET1VCTEU6Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0ZG91YmxlKGgsIHZhbHVlX2ZpZWxkLCBwdXRkb3VibGUsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfU1RSSU5HOgotICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3RyKGgsIHZhbHVlX2ZpZWxkLCBtYXBrZXl2YWxfc3RhcnRzdHIsICZlbXB0eV9hdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRzdHJpbmcoaCwgdmFsdWVfZmllbGQsIHB1dHN0ciwgJmVtcHR5X2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHN0cihoLCB2YWx1ZV9maWVsZCwgbWFwdmFsdWVfZW5kc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCB2YWx1ZV9maWVsZCwgcHV0Ynl0ZXMsICZlbXB0eV9hdHRyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVVBCX1RZUEVfRU5VTTogewotICAgICAgdXBiX2hhbmRsZXJhdHRyIGVudW1fYXR0ciA9IFVQQl9IQU5ETEVSQVRUUl9JTklUSUFMSVpFUjsKLSAgICAgIHNldF9lbnVtX2hkKGgsIHZhbHVlX2ZpZWxkLCBwcmVzZXJ2ZV9maWVsZG5hbWVzLCAmZW51bV9hdHRyKTsKLSAgICAgIHVwYl9oYW5kbGVyc19zZXRpbnQzMihoLCB2YWx1ZV9maWVsZCwgbWFwdmFsdWVfZW51bSwgJmVudW1fYXR0cik7Ci0gICAgICB1cGJfaGFuZGxlcmF0dHJfdW5pbml0KCZlbnVtX2F0dHIpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVVBCX1RZUEVfTUVTU0FHRToKLSAgICAgIC8qIE5vIGhhbmRsZXIgbmVjZXNzYXJ5IC0tIHRoZSBzdWJtc2cgaGFuZGxlcnMgd2lsbCBwcmludCB0aGUgbWVzc2FnZQotICAgICAgICogYXMgYXBwcm9wcmlhdGUuICovCi0gICAgICBicmVhazsKLSAgfQotCi0gIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmVtcHR5X2F0dHIpOwotfQotCi12b2lkIHByaW50ZXJfc2V0aGFuZGxlcnMoY29uc3Qgdm9pZCAqY2xvc3VyZSwgdXBiX2hhbmRsZXJzICpoKSB7Ci0gIGNvbnN0IHVwYl9tc2dkZWYgKm1kID0gdXBiX2hhbmRsZXJzX21zZ2RlZihoKTsKLSAgYm9vbCBpc19tYXBlbnRyeSA9IHVwYl9tc2dkZWZfbWFwZW50cnkobWQpOwotICB1cGJfaGFuZGxlcmF0dHIgZW1wdHlfYXR0ciA9IFVQQl9IQU5ETEVSQVRUUl9JTklUSUFMSVpFUjsKLSAgdXBiX21zZ19maWVsZF9pdGVyIGk7Ci0gIGNvbnN0IGJvb2wgKnByZXNlcnZlX2ZpZWxkbmFtZXNfcHRyID0gY2xvc3VyZTsKLSAgY29uc3QgYm9vbCBwcmVzZXJ2ZV9maWVsZG5hbWVzID0gKnByZXNlcnZlX2ZpZWxkbmFtZXNfcHRyOwotCi0gIGlmIChpc19tYXBlbnRyeSkgewotICAgIC8qIG1hcGVudHJ5IG1lc3NhZ2VzIGFyZSBzdWZmaWNpZW50bHkgZGlmZmVyZW50IHRoYXQgd2UgaGFuZGxlIHRoZW0KLSAgICAgKiBzZXBhcmF0ZWx5LiAqLwotICAgIHByaW50ZXJfc2V0aGFuZGxlcnNfbWFwZW50cnkoY2xvc3VyZSwgcHJlc2VydmVfZmllbGRuYW1lcywgaCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKGgsIHByaW50ZXJfc3RhcnRtc2csICZlbXB0eV9hdHRyKTsKLSAgdXBiX2hhbmRsZXJzX3NldGVuZG1zZyhoLCBwcmludGVyX2VuZG1zZywgJmVtcHR5X2F0dHIpOwotCi0jZGVmaW5lIFRZUEUodHlwZSwgbmFtZSwgY3R5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNhc2UgdHlwZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKHVwYl9maWVsZGRlZl9pc3NlcShmKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB1cGJfaGFuZGxlcnNfc2V0IyNuYW1lKGgsIGYsIHJlcGVhdGVkXyMjY3R5cGUsICZlbXB0eV9hdHRyKTsgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB1cGJfaGFuZGxlcnNfc2V0IyNuYW1lKGgsIGYsIHNjYWxhcl8jI2N0eXBlLCAmbmFtZV9hdHRyKTsgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgYnJlYWs7Ci0KLSAgdXBiX21zZ19maWVsZF9iZWdpbigmaSwgbWQpOwotICBmb3IoOyAhdXBiX21zZ19maWVsZF9kb25lKCZpKTsgdXBiX21zZ19maWVsZF9uZXh0KCZpKSkgewotICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqZiA9IHVwYl9tc2dfaXRlcl9maWVsZCgmaSk7Ci0KLSAgICB1cGJfaGFuZGxlcmF0dHIgbmFtZV9hdHRyID0gVVBCX0hBTkRMRVJBVFRSX0lOSVRJQUxJWkVSOwotICAgIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmbmFtZV9hdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdzdHJwYyhoLCBmLCBwcmVzZXJ2ZV9maWVsZG5hbWVzKSk7Ci0KLSAgICBpZiAodXBiX2ZpZWxkZGVmX2lzbWFwKGYpKSB7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzZXEoaCwgZiwgc3RhcnRtYXAsICZuYW1lX2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHNlcShoLCBmLCBlbmRtYXAsICZuYW1lX2F0dHIpOwotICAgIH0gZWxzZSBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzZXEoaCwgZiwgc3RhcnRzZXEsICZuYW1lX2F0dHIpOwotICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHNlcShoLCBmLCBlbmRzZXEsICZlbXB0eV9hdHRyKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKHVwYl9maWVsZGRlZl90eXBlKGYpKSB7Ci0gICAgICBUWVBFKFVQQl9UWVBFX0ZMT0FULCAgZmxvYXQsICBmbG9hdCk7Ci0gICAgICBUWVBFKFVQQl9UWVBFX0RPVUJMRSwgZG91YmxlLCBkb3VibGUpOwotICAgICAgVFlQRShVUEJfVFlQRV9CT09MLCAgIGJvb2wsICAgYm9vbCk7Ci0gICAgICBUWVBFKFVQQl9UWVBFX0lOVDMyLCAgaW50MzIsICBpbnQzMl90KTsKLSAgICAgIFRZUEUoVVBCX1RZUEVfVUlOVDMyLCB1aW50MzIsIHVpbnQzMl90KTsKLSAgICAgIFRZUEUoVVBCX1RZUEVfSU5UNjQsICBpbnQ2NCwgIGludDY0X3QpOwotICAgICAgVFlQRShVUEJfVFlQRV9VSU5UNjQsIHVpbnQ2NCwgdWludDY0X3QpOwotICAgICAgY2FzZSBVUEJfVFlQRV9FTlVNOiB7Ci0gICAgICAgIC8qIEZvciBub3csIHdlIGFsd2F5cyBlbWl0IHN5bWJvbGljIG5hbWVzIGZvciBlbnVtcy4gV2UgbWF5IHdhbnQgYW4KLSAgICAgICAgICogb3B0aW9uIGxhdGVyIHRvIGNvbnRyb2wgdGhpcyBiZWhhdmlvciwgYnV0IHdlIHdpbGwgd2FpdCBmb3IgYSByZWFsCi0gICAgICAgICAqIG5lZWQgZmlyc3QuICovCi0gICAgICAgIHVwYl9oYW5kbGVyYXR0ciBlbnVtX2F0dHIgPSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVI7Ci0gICAgICAgIHNldF9lbnVtX2hkKGgsIGYsIHByZXNlcnZlX2ZpZWxkbmFtZXMsICZlbnVtX2F0dHIpOwotCi0gICAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0aW50MzIoaCwgZiwgcmVwZWF0ZWRfZW51bSwgJmVudW1fYXR0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldGludDMyKGgsIGYsIHNjYWxhcl9lbnVtLCAmZW51bV9hdHRyKTsKLSAgICAgICAgfQotCi0gICAgICAgIHVwYl9oYW5kbGVyYXR0cl91bmluaXQoJmVudW1fYXR0cik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgICAgY2FzZSBVUEJfVFlQRV9TVFJJTkc6Ci0gICAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIoaCwgZiwgcmVwZWF0ZWRfc3RhcnRzdHIsICZlbXB0eV9hdHRyKTsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIGYsIHJlcGVhdGVkX3N0ciwgJmVtcHR5X2F0dHIpOwotICAgICAgICAgIHVwYl9oYW5kbGVyc19zZXRlbmRzdHIoaCwgZiwgcmVwZWF0ZWRfZW5kc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3RyKGgsIGYsIHNjYWxhcl9zdGFydHN0ciwgJm5hbWVfYXR0cik7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBmLCBzY2FsYXJfc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldGVuZHN0cihoLCBmLCBzY2FsYXJfZW5kc3RyLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVQQl9UWVBFX0JZVEVTOgotICAgICAgICAvKiBYWFg6IHRoaXMgZG9lc24ndCBzdXBwb3J0IHN0cmluZ3MgdGhhdCBzcGFuIGJ1ZmZlcnMgeWV0LiBUaGUgYmFzZTY0Ci0gICAgICAgICAqIGVuY29kZXIgd2lsbCBuZWVkIHRvIGJlIG1hZGUgcmVzdW1hYmxlIGZvciB0aGlzIHRvIHdvcmsgcHJvcGVybHkuICovCi0gICAgICAgIGlmICh1cGJfZmllbGRkZWZfaXNzZXEoZikpIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKGgsIGYsIHJlcGVhdGVkX2J5dGVzLCAmZW1wdHlfYXR0cik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0cmluZyhoLCBmLCBzY2FsYXJfYnl0ZXMsICZuYW1lX2F0dHIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVUEJfVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAodXBiX2ZpZWxkZGVmX2lzc2VxKGYpKSB7Ci0gICAgICAgICAgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3VibXNnKGgsIGYsIHJlcGVhdGVkX3N0YXJ0c3VibXNnLCAmbmFtZV9hdHRyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2coaCwgZiwgc2NhbGFyX3N0YXJ0c3VibXNnLCAmbmFtZV9hdHRyKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICB1cGJfaGFuZGxlcmF0dHJfdW5pbml0KCZuYW1lX2F0dHIpOwotICB9Ci0KLSAgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCgmZW1wdHlfYXR0cik7Ci0jdW5kZWYgVFlQRQotfQotCi1zdGF0aWMgdm9pZCBqc29uX3ByaW50ZXJfcmVzZXQodXBiX2pzb25fcHJpbnRlciAqcCkgewotICBwLT5kZXB0aF8gPSAwOwotfQotCi0KLS8qIFB1YmxpYyBBUEkgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXVwYl9qc29uX3ByaW50ZXIgKnVwYl9qc29uX3ByaW50ZXJfY3JlYXRlKHVwYl9lbnYgKmUsIGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ieXRlc3NpbmsgKm91dHB1dCkgewotI2lmbmRlZiBOREVCVUcKLSAgc2l6ZV90IHNpemVfYmVmb3JlID0gdXBiX2Vudl9ieXRlc2FsbG9jYXRlZChlKTsKLSNlbmRpZgotCi0gIHVwYl9qc29uX3ByaW50ZXIgKnAgPSB1cGJfZW52X21hbGxvYyhlLCBzaXplb2YodXBiX2pzb25fcHJpbnRlcikpOwotICBpZiAoIXApIHJldHVybiBOVUxMOwotCi0gIHAtPm91dHB1dF8gPSBvdXRwdXQ7Ci0gIGpzb25fcHJpbnRlcl9yZXNldChwKTsKLSAgdXBiX3NpbmtfcmVzZXQoJnAtPmlucHV0XywgaCwgcCk7Ci0KLSAgLyogSWYgdGhpcyBmYWlscywgaW5jcmVhc2UgdGhlIHZhbHVlIGluIHByaW50ZXIuaC4gKi8KLSAgYXNzZXJ0KHVwYl9lbnZfYnl0ZXNhbGxvY2F0ZWQoZSkgLSBzaXplX2JlZm9yZSA8PSBVUEJfSlNPTl9QUklOVEVSX1NJWkUpOwotICByZXR1cm4gcDsKLX0KLQotdXBiX3NpbmsgKnVwYl9qc29uX3ByaW50ZXJfaW5wdXQodXBiX2pzb25fcHJpbnRlciAqcCkgewotICByZXR1cm4gJnAtPmlucHV0XzsKLX0KLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfanNvbl9wcmludGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm1kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlc2VydmVfZmllbGRuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcikgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX25ld2Zyb3plbigKLSAgICAgIG1kLCBvd25lciwgcHJpbnRlcl9zZXRoYW5kbGVycywgJnByZXNlcnZlX2ZpZWxkbmFtZXMpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9leHQvZ29vZ2xlL3Byb3RvYnVmX2MvdXBiLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy91cGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZhZjc0ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2V4dC9nb29nbGUvcHJvdG9idWZfYy91cGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDg1NjkgKzAsMCBAQAotLy8gQW1hbGdhbWF0ZWQgc291cmNlIGZpbGUKLS8qCi0qKiBEZWZzIGFyZSB1cGIncyBpbnRlcm5hbCByZXByZXNlbnRhdGlvbiBvZiB0aGUgY29uc3RydWN0cyB0aGF0IGNhbiBhcHBlYXIKLSoqIGluIGEgLnByb3RvIGZpbGU6Ci0qKgotKiogLSB1cGI6Ok1lc3NhZ2VEZWYgKHVwYl9tc2dkZWYpOiBkZXNjcmliZXMgYSAibWVzc2FnZSIgY29uc3RydWN0LgotKiogLSB1cGI6OkZpZWxkRGVmICh1cGJfZmllbGRkZWYpOiBkZXNjcmliZXMgYSBtZXNzYWdlIGZpZWxkLgotKiogLSB1cGI6OkZpbGVEZWYgKHVwYl9maWxlZGVmKTogZGVzY3JpYmVzIGEgLnByb3RvIGZpbGUgYW5kIGl0cyBkZWZzLgotKiogLSB1cGI6OkVudW1EZWYgKHVwYl9lbnVtZGVmKTogZGVzY3JpYmVzIGFuIGVudW0uCi0qKiAtIHVwYjo6T25lb2ZEZWYgKHVwYl9vbmVvZmRlZik6IGRlc2NyaWJlcyBhIG9uZW9mLgotKiogLSB1cGI6OkRlZiAodXBiX2RlZik6IGJhc2UgY2xhc3Mgb2YgYWxsIHRoZSBvdGhlcnMuCi0qKgotKiogVE9ETzogZGVmaW5pdGlvbnMgb2Ygc2VydmljZXMuCi0qKgotKiogTGlrZSB1cGJfcmVmY291bnRlZCBvYmplY3RzLCBkZWZzIGFyZSBtdXRhYmxlIG9ubHkgdW50aWwgZnJvemVuLCBhbmQgYXJlCi0qKiBvbmx5IHRocmVhZC1zYWZlIG9uY2UgZnJvemVuLgotKioKLSoqIFRoaXMgaXMgYSBtaXhlZCBDL0MrKyBpbnRlcmZhY2UgdGhhdCBvZmZlcnMgYSBmdWxsIEFQSSB0byBib3RoIGxhbmd1YWdlcy4KLSoqIFNlZSB0aGUgdG9wLWxldmVsIFJFQURNRSBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KLSovCi0KLSNpZm5kZWYgVVBCX0RFRl9IXwotI2RlZmluZSBVUEJfREVGX0hfCi0KLS8qCi0qKiB1cGI6OlJlZkNvdW50ZWQgKHVwYl9yZWZjb3VudGVkKQotKioKLSoqIEEgcmVmY291bnRpbmcgc2NoZW1lIHRoYXQgc3VwcG9ydHMgY2lyY3VsYXIgcmVmcy4gIEl0IGFjY29tcGxpc2hlcyB0aGlzIGJ5Ci0qKiBwYXJ0aXRpb25pbmcgdGhlIHNldCBvZiBvYmplY3RzIGludG8gZ3JvdXBzIHN1Y2ggdGhhdCBubyBjeWNsZSBzcGFucyBncm91cHM7Ci0qKiB3ZSBjYW4gdGhlbiByZWZlcmVuY2UtY291bnQgdGhlIGdyb3VwIGFzIGEgd2hvbGUgYW5kIGlnbm9yZSByZWZzIHdpdGhpbiB0aGUKLSoqIGdyb3VwLiAgV2hlbiBvYmplY3RzIGFyZSBtdXRhYmxlLCB0aGVzZSBncm91cHMgYXJlIGNvbXB1dGVkIHZlcnkKLSoqIGNvbnNlcnZhdGl2ZWx5OyB3ZSBncm91cCBhbnkgb2JqZWN0cyB0aGF0IGhhdmUgZXZlciBoYWQgYSBsaW5rIGJldHdlZW4gdGhlbS4KLSoqIFdoZW4gb2JqZWN0cyBhcmUgZnJvemVuLCB3ZSBjb21wdXRlIHN0cm9uZ2x5LWNvbm5lY3RlZCBjb21wb25lbnRzIHdoaWNoCi0qKiBhbGxvd3MgdXMgdG8gYmUgcHJlY2lzZSBhbmQgb25seSBncm91cCBvYmplY3RzIHRoYXQgYXJlIGFjdHVhbGx5IGN5Y2xpYy4KLSoqCi0qKiBUaGlzIGlzIGEgbWl4ZWQgQy9DKysgaW50ZXJmYWNlIHRoYXQgb2ZmZXJzIGEgZnVsbCBBUEkgdG8gYm90aCBsYW5ndWFnZXMuCi0qKiBTZWUgdGhlIHRvcC1sZXZlbCBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0qLwotCi0jaWZuZGVmIFVQQl9SRUZDT1VOVEVEX0hfCi0jZGVmaW5lIFVQQl9SRUZDT1VOVEVEX0hfCi0KLS8qCi0qKiB1cGJfdGFibGUKLSoqCi0qKiBUaGlzIGhlYWRlciBpcyBJTlRFUk5BTC1PTkxZISAgSXRzIGludGVyZmFjZXMgYXJlIG5vdCBwdWJsaWMgb3Igc3RhYmxlIQotKiogVGhpcyBmaWxlIGRlZmluZXMgdmVyeSBmYXN0IGludC0+dXBiX3ZhbHVlIChpbnR0YWJsZSkgYW5kIHN0cmluZy0+dXBiX3ZhbHVlCi0qKiAoc3RydGFibGUpIGhhc2ggdGFibGVzLgotKioKLSoqIFRoZSB0YWJsZSB1c2VzIGNoYWluZWQgc2NhdHRlciB3aXRoIEJyZW50J3MgdmFyaWF0aW9uIChpbnNwaXJlZCBieSB0aGUgTHVhCi0qKiBpbXBsZW1lbnRhdGlvbiBvZiBoYXNoIHRhYmxlcykuICBUaGUgaGFzaCBmdW5jdGlvbiBmb3Igc3RyaW5ncyBpcyBBdXN0aW4KLSoqIEFwcGxlYnkncyAiTXVybXVySGFzaC4iCi0qKgotKiogVGhlIGludHRhYmxlIHVzZXMgdWludHB0cl90IGFzIGl0cyBrZXksIHdoaWNoIGd1YXJhbnRlZXMgaXQgY2FuIGJlIHVzZWQgdG8KLSoqIHN0b3JlIHBvaW50ZXJzIG9yIGludGVnZXJzIG9mIGF0IGxlYXN0IDMyIGJpdHMgKHVwYiBpc24ndCByZWFsbHkgdXNlZnVsIG9uCi0qKiBzeXN0ZW1zIHdoZXJlIHNpemVvZih2b2lkKikgPCA0KS4KLSoqCi0qKiBUaGUgdGFibGUgbXVzdCBiZSBob21vZ2Vub3VzIChhbGwgdmFsdWVzIG9mIHRoZSBzYW1lIHR5cGUpLiAgSW4gZGVidWcKLSoqIG1vZGUsIHdlIGNoZWNrIHRoaXMgb24gaW5zZXJ0IGFuZCBsb29rdXAuCi0qLwotCi0jaWZuZGVmIFVQQl9UQUJMRV9IXwotI2RlZmluZSBVUEJfVEFCTEVfSF8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGludC5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotLyoKLSoqIFRoaXMgZmlsZSBjb250YWlucyBzaGFyZWQgZGVmaW5pdGlvbnMgdGhhdCBhcmUgd2lkZWx5IHVzZWQgYWNyb3NzIHVwYi4KLSoqCi0qKiBUaGlzIGlzIGEgbWl4ZWQgQy9DKysgaW50ZXJmYWNlIHRoYXQgb2ZmZXJzIGEgZnVsbCBBUEkgdG8gYm90aCBsYW5ndWFnZXMuCi0qKiBTZWUgdGhlIHRvcC1sZXZlbCBSRUFETUUgZm9yIG1vcmUgaW5mb3JtYXRpb24uCi0qLwotCi0jaWZuZGVmIFVQQl9IXwotI2RlZmluZSBVUEJfSF8KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGFyZy5oPgotI2luY2x1ZGUgPHN0ZGJvb2wuaD4KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgdXBiIHsKLWNsYXNzIEFsbG9jYXRvcjsKLWNsYXNzIEFyZW5hOwotY2xhc3MgRW52aXJvbm1lbnQ7Ci1jbGFzcyBFcnJvclNwYWNlOwotY2xhc3MgU3RhdHVzOwotdGVtcGxhdGUgPGludCBOPiBjbGFzcyBJbmxpbmVkQXJlbmE7Ci10ZW1wbGF0ZSA8aW50IE4+IGNsYXNzIElubGluZWRFbnZpcm9ubWVudDsKLX0KLSNlbmRpZgotCi0vKiBVUEJfSU5MSU5FOiBpbmxpbmUgaWYgcG9zc2libGUsIGVtaXQgc3RhbmRhbG9uZSBjb2RlIGlmIHJlcXVpcmVkLiAqLwotI2lmZGVmIF9fY3BsdXNwbHVzCi0jZGVmaW5lIFVQQl9JTkxJTkUgaW5saW5lCi0jZWxpZiBkZWZpbmVkIChfX0dOVUNfXykKLSNkZWZpbmUgVVBCX0lOTElORSBzdGF0aWMgX19pbmxpbmVfXwotI2Vsc2UKLSNkZWZpbmUgVVBCX0lOTElORSBzdGF0aWMKLSNlbmRpZgotCi0vKiBEZWZpbmUgVVBCX0JJR19FTkRJQU4gbWFudWFsbHkgaWYgeW91J3JlIG9uIGJpZyBlbmRpYW4gYW5kIHlvdXIgY29tcGlsZXIKLSAqIGRvZXNuJ3QgcHJvdmlkZSB0aGVzZSBwcmVwcm9jZXNzb3Igc3ltYm9scy4gKi8KLSNpZiBkZWZpbmVkKF9fQllURV9PUkRFUl9fKSAmJiAoX19CWVRFX09SREVSX18gPT0gX19PUkRFUl9CSUdfRU5ESUFOX18pCi0jZGVmaW5lIFVQQl9CSUdfRU5ESUFOCi0jZW5kaWYKLQotLyogTWFjcm9zIGZvciBmdW5jdGlvbiBhdHRyaWJ1dGVzIG9uIGNvbXBpbGVycyB0aGF0IHN1cHBvcnQgdGhlbS4gKi8KLSNpZmRlZiBfX0dOVUNfXwotI2RlZmluZSBVUEJfRk9SQ0VJTkxJTkUgX19pbmxpbmVfXyBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lKSkKLSNkZWZpbmUgVVBCX05PSU5MSU5FIF9fYXR0cmlidXRlX18oKG5vaW5saW5lKSkKLSNkZWZpbmUgVVBCX05PUkVUVVJOIF9fYXR0cmlidXRlX18oKF9fbm9yZXR1cm5fXykpCi0jZWxzZSAgLyogIWRlZmluZWQoX19HTlVDX18pICovCi0jZGVmaW5lIFVQQl9GT1JDRUlOTElORQotI2RlZmluZSBVUEJfTk9JTkxJTkUKLSNkZWZpbmUgVVBCX05PUkVUVVJOCi0jZW5kaWYKLQotLyogQSBmZXcgaGFja3kgd29ya2Fyb3VuZHMgZm9yIGZ1bmN0aW9ucyBub3QgaW4gQzg5LgotICogRm9yIGludGVybmFsIHVzZSBvbmx5IQotICogVE9ETyhoYWJlcm1hbik6IGZpeCB0aGVzZSBieSBpbmNsdWRpbmcgb3VyIG93biBpbXBsZW1lbnRhdGlvbnMsIG9yIGZpbmRpbmcKLSAqIGFub3RoZXIgd29ya2Fyb3VuZC4KLSAqLwotI2lmZGVmIF9fR05VQ19fCi0jZGVmaW5lIF91cGJfc25wcmludGYgX19idWlsdGluX3NucHJpbnRmCi0jZGVmaW5lIF91cGJfdnNucHJpbnRmIF9fYnVpbHRpbl92c25wcmludGYKLSNkZWZpbmUgX3VwYl92YV9jb3B5KGEsIGIpIF9fdmFfY29weShhLCBiKQotI2VsaWYgX19TVERDX1ZFUlNJT05fXyA+PSAxOTk5MDFMCi0vKiBDOTkgdmVyc2lvbnMuICovCi0jZGVmaW5lIF91cGJfc25wcmludGYgc25wcmludGYKLSNkZWZpbmUgX3VwYl92c25wcmludGYgdnNucHJpbnRmCi0jZGVmaW5lIF91cGJfdmFfY29weShhLCBiKSB2YV9jb3B5KGEsIGIpCi0jZWxzZQotI2Vycm9yIE5lZWQgaW1wbGVtZW50YXRpb25zIG9mIFt2XXNucHJpbnRmIGFuZCB2YV9jb3B5Ci0jZW5kaWYKLQotCi0jaWYgKChkZWZpbmVkKF9fY3BsdXNwbHVzKSAmJiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSB8fCBcCi0gICAgICBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWF9fKSkgJiYgIWRlZmluZWQoVVBCX05PX0NYWDExKQotI2RlZmluZSBVUEJfQ1hYMTEKLSNlbmRpZgotCi0vKiBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKCkKLSAqIFVQQl9ESVNBTExPV19QT0RfT1BTKCkKLSAqCi0gKiBEZWNsYXJlIHRoZXNlIGluIHRoZSAicHJpdmF0ZSIgc2VjdGlvbiBvZiBhIEMrKyBjbGFzcyB0byBmb3JiaWQgY29weS9hc3NpZ24KLSAqIG9yIGFsbCBQT0Qgb3BzIChjb25zdHJ1Y3QsIGRlc3RydWN0LCBjb3B5LCBhc3NpZ24pIG9uIHRoYXQgY2xhc3MuICovCi0jaWZkZWYgVVBCX0NYWDExCi0jaW5jbHVkZSA8dHlwZV90cmFpdHM+Ci0jZGVmaW5lIFVQQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oY2xhc3NfbmFtZSkgXAotICBjbGFzc19uYW1lKGNvbnN0IGNsYXNzX25hbWUmKSA9IGRlbGV0ZTsgXAotICB2b2lkIG9wZXJhdG9yPShjb25zdCBjbGFzc19uYW1lJikgPSBkZWxldGU7Ci0jZGVmaW5lIFVQQl9ESVNBTExPV19QT0RfT1BTKGNsYXNzX25hbWUsIGZ1bGxfY2xhc3NfbmFtZSkgXAotICBjbGFzc19uYW1lKCkgPSBkZWxldGU7IFwKLSAgfmNsYXNzX25hbWUoKSA9IGRlbGV0ZTsgXAotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKGNsYXNzX25hbWUpCi0jZGVmaW5lIFVQQl9BU1NFUlRfU1RETEFZT1VUKHR5cGUpIFwKLSAgc3RhdGljX2Fzc2VydChzdGQ6OmlzX3N0YW5kYXJkX2xheW91dDx0eXBlPjo6dmFsdWUsIFwKLSAgICAgICAgICAgICAgICAjdHlwZSAiIG11c3QgYmUgc3RhbmRhcmQgbGF5b3V0Iik7Ci0jZGVmaW5lIFVQQl9GSU5BTCBmaW5hbAotI2Vsc2UgIC8qICFkZWZpbmVkKFVQQl9DWFgxMSkgKi8KLSNkZWZpbmUgVVBCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihjbGFzc19uYW1lKSBcCi0gIGNsYXNzX25hbWUoY29uc3QgY2xhc3NfbmFtZSYpOyBcCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IGNsYXNzX25hbWUmKTsKLSNkZWZpbmUgVVBCX0RJU0FMTE9XX1BPRF9PUFMoY2xhc3NfbmFtZSwgZnVsbF9jbGFzc19uYW1lKSBcCi0gIGNsYXNzX25hbWUoKTsgXAotICB+Y2xhc3NfbmFtZSgpOyBcCi0gIFVQQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oY2xhc3NfbmFtZSkKLSNkZWZpbmUgVVBCX0FTU0VSVF9TVERMQVlPVVQodHlwZSkKLSNkZWZpbmUgVVBCX0ZJTkFMCi0jZW5kaWYKLQotLyogVVBCX0RFQ0xBUkVfVFlQRSgpCi0gKiBVUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUoKQotICogVVBCX0RFQ0xBUkVfREVSSVZFRF9UWVBFMigpCi0gKgotICogTWFjcm9zIGZvciBkZWNsYXJpbmcgQyBhbmQgQysrIHR5cGVzIGJvdGgsIGluY2x1ZGluZyBpbmhlcml0YW5jZS4KLSAqIFRoZSBpbmhlcml0YW5jZSBkb2Vzbid0IHVzZSByZWFsIEMrKyBpbmhlcml0YW5jZSwgdG8gc3RheSBjb21wYXRpYmxlIHdpdGggQy4KLSAqCi0gKiBUaGVzZSBtYWNyb3MgYWxzbyBwcm92aWRlIHVwY2FzdHM6Ci0gKiAgLSBpbiBDOiB0eXBlcy1zcGVjaWZpYyBmdW5jdGlvbnMgKGllLiB1cGJfZm9vX3VwY2FzdChmb28pKQotICogIC0gaW4gQysrOiB1cGI6OnVwY2FzdChmb28pIGFsb25nIHdpdGggaW1wbGljaXQgY29udmVyc2lvbnMKLSAqCi0gKiBEb3duY2FzdHMgYXJlIG5vdCBwcm92aWRlZCwgYnV0IHVwYi9kZWYuaCBkZWZpbmVzIGRvd25jYXN0cyBmb3IgdXBiOjpEZWYuICovCi0KLSNkZWZpbmUgVVBCX0NfVVBDQVNUUyh0eSwgYmFzZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSBiYXNlICp0eSAjIyBfdXBjYXN0X211dGFibGUodHkgKnApIHsgcmV0dXJuIChiYXNlKilwOyB9IFwKLSAgVVBCX0lOTElORSBjb25zdCBiYXNlICp0eSAjIyBfdXBjYXN0KGNvbnN0IHR5ICpwKSB7IHJldHVybiAoY29uc3QgYmFzZSopcDsgfQotCi0jZGVmaW5lIFVQQl9DX1VQQ0FTVFMyKHR5LCBiYXNlLCBiYXNlMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9DX1VQQ0FTVFModHksIGJhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9JTkxJTkUgYmFzZTIgKnR5ICMjIF91cGNhc3QyX211dGFibGUodHkgKnApIHsgcmV0dXJuIChiYXNlMiopcDsgfSBcCi0gIFVQQl9JTkxJTkUgY29uc3QgYmFzZTIgKnR5ICMjIF91cGNhc3QyKGNvbnN0IHR5ICpwKSB7IHJldHVybiAoY29uc3QgYmFzZTIqKXA7IH0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLSNkZWZpbmUgVVBCX0JFR0lOX0VYVEVSTl9DIGV4dGVybiAiQyIgewotI2RlZmluZSBVUEJfRU5EX0VYVEVSTl9DIH0KLSNkZWZpbmUgVVBCX1BSSVZBVEVfRk9SX0NQUCBwcml2YXRlOgotI2RlZmluZSBVUEJfREVDTEFSRV9UWVBFKGNwcG5hbWUsIGNuYW1lKSB0eXBlZGVmIGNwcG5hbWUgY25hbWU7Ci0KLSNkZWZpbmUgVVBCX0RFQ0xBUkVfREVSSVZFRF9UWVBFKGNwcG5hbWUsIGNwcGJhc2UsIGNuYW1lLCBjYmFzZSkgIFwKLSAgVVBCX0RFQ0xBUkVfVFlQRShjcHBuYW1lLCBjbmFtZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0NfVVBDQVNUUyhjbmFtZSwgY2Jhc2UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbmFtZXNwYWNlIHVwYiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgUG9pbnRlcjxjcHBuYW1lPiA6IHB1YmxpYyBQb2ludGVyQmFzZTxjcHBuYW1lLCBjcHBiYXNlPiB7IFwKLSAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBleHBsaWNpdCBQb2ludGVyKGNwcG5hbWUqIHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOiBQb2ludGVyQmFzZTxjcHBuYW1lLCBjcHBiYXNlPihwdHIpIHt9ICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgUG9pbnRlcjxjb25zdCBjcHBuYW1lPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogcHVibGljIFBvaW50ZXJCYXNlPGNvbnN0IGNwcG5hbWUsIGNvbnN0IGNwcGJhc2U+IHsgICAgICAgIFwKLSAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBleHBsaWNpdCBQb2ludGVyKGNvbnN0IGNwcG5hbWUqIHB0cikgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOiBQb2ludGVyQmFzZTxjb25zdCBjcHBuYW1lLCBjb25zdCBjcHBiYXNlPihwdHIpIHt9ICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0jZGVmaW5lIFVQQl9ERUNMQVJFX0RFUklWRURfVFlQRTIoY3BwbmFtZSwgY3BwYmFzZSwgY3BwYmFzZTIsIGNuYW1lLCBjYmFzZSwgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYmFzZTIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfREVDTEFSRV9UWVBFKGNwcG5hbWUsIGNuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9DX1VQQ0FTVFMyKGNuYW1lLCBjYmFzZSwgY2Jhc2UyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbmFtZXNwYWNlIHVwYiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIFBvaW50ZXI8Y3BwbmFtZT4gOiBwdWJsaWMgUG9pbnRlckJhc2UyPGNwcG5hbWUsIGNwcGJhc2UsIGNwcGJhc2UyPiB7IFwKLSAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGV4cGxpY2l0IFBvaW50ZXIoY3BwbmFtZSogcHRyKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIDogUG9pbnRlckJhc2UyPGNwcG5hbWUsIGNwcGJhc2UsIGNwcGJhc2UyPihwdHIpIHt9ICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIFBvaW50ZXI8Y29uc3QgY3BwbmFtZT4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDogcHVibGljIFBvaW50ZXJCYXNlMjxjb25zdCBjcHBuYW1lLCBjb25zdCBjcHBiYXNlLCBjb25zdCBjcHBiYXNlMj4geyAgXAotICAgcHVibGljOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXhwbGljaXQgUG9pbnRlcihjb25zdCBjcHBuYW1lKiBwdHIpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgOiBQb2ludGVyQmFzZTI8Y29uc3QgY3BwbmFtZSwgY29uc3QgY3BwYmFzZSwgY29uc3QgY3BwYmFzZTI+KHB0cikge30gXAotICB9OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotI2Vsc2UgIC8qICFkZWZpbmVkKF9fY3BsdXNwbHVzKSAqLwotCi0jZGVmaW5lIFVQQl9CRUdJTl9FWFRFUk5fQwotI2RlZmluZSBVUEJfRU5EX0VYVEVSTl9DCi0jZGVmaW5lIFVQQl9QUklWQVRFX0ZPUl9DUFAKLSNkZWZpbmUgVVBCX0RFQ0xBUkVfVFlQRShjcHBuYW1lLCBjbmFtZSkgXAotICBzdHJ1Y3QgY25hbWU7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHR5cGVkZWYgc3RydWN0IGNuYW1lIGNuYW1lOwotI2RlZmluZSBVUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUoY3BwbmFtZSwgY3BwYmFzZSwgY25hbWUsIGNiYXNlKSBcCi0gIFVQQl9ERUNMQVJFX1RZUEUoY3BwbmFtZSwgY25hbWUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0NfVVBDQVNUUyhjbmFtZSwgY2Jhc2UpCi0jZGVmaW5lIFVQQl9ERUNMQVJFX0RFUklWRURfVFlQRTIoY3BwbmFtZSwgY3BwYmFzZSwgY3BwYmFzZTIsICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbmFtZSwgY2Jhc2UsIGNiYXNlMikgICAgICAgICAgXAotICBVUEJfREVDTEFSRV9UWVBFKGNwcG5hbWUsIGNuYW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9DX1VQQ0FTVFMyKGNuYW1lLCBjYmFzZSwgY2Jhc2UyKQotCi0jZW5kaWYgIC8qIGRlZmluZWQoX19jcGx1c3BsdXMpICovCi0KLSNkZWZpbmUgVVBCX01BWCh4LCB5KSAoKHgpID4gKHkpID8gKHgpIDogKHkpKQotI2RlZmluZSBVUEJfTUlOKHgsIHkpICgoeCkgPCAoeSkgPyAoeCkgOiAoeSkpCi0KLSNkZWZpbmUgVVBCX1VOVVNFRCh2YXIpICh2b2lkKXZhcgotCi0vKiBGb3IgYXNzZXJ0aW5nIHNvbWV0aGluZyBhYm91dCBhIHZhcmlhYmxlIHdoZW4gdGhlIHZhcmlhYmxlIGlzIG5vdCB1c2VkIGZvcgotICogYW55dGhpbmcgZWxzZS4gIFRoaXMgcHJldmVudHMgInVudXNlZCB2YXJpYWJsZSIgd2FybmluZ3Mgd2hlbiBjb21waWxpbmcgaW4KLSAqIGRlYnVnIG1vZGUuICovCi0jZGVmaW5lIFVQQl9BU1NFUlRfVkFSKHZhciwgcHJlZGljYXRlKSBVUEJfVU5VU0VEKHZhcik7IGFzc2VydChwcmVkaWNhdGUpCi0KLS8qIEdlbmVyaWMgZnVuY3Rpb24gdHlwZS4gKi8KLXR5cGVkZWYgdm9pZCB1cGJfZnVuYygpOwotCi0KLS8qIEMrKyBDYXN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1uYW1lc3BhY2UgdXBiIHsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIFBvaW50ZXI7Ci0KLS8qIENhc3RzIHRvIGEgc3ViY2xhc3MuICBUaGUgY2FsbGVyIG11c3Qga25vdyB0aGF0IGNhc3QgaXMgY29ycmVjdDsgYW4KLSAqIGluY29ycmVjdCBjYXN0IHdpbGwgdGhyb3cgYW4gYXNzZXJ0aW9uIGZhaWx1cmUgaW4gZGVidWcgbW9kZS4KLSAqCi0gKiBFeGFtcGxlOgotICogICB1cGI6OkRlZiogZGVmID0gR2V0RGVmKCk7Ci0gKiAgIC8vIEFzc2VydC1mYWlscyBpZiB0aGlzIHdhcyBub3QgYWN0dWFsbHkgYSBNZXNzYWdlRGVmLgotICogICB1cGI6Ok1lc3NnZURlZiogbWQgPSB1cGI6OmRvd25fY2FzdDx1cGI6Ok1lc3NhZ2VEZWY+KGRlZik7Ci0gKgotICogTm90ZSB0aGF0IGRvd25jYXN0cyBhcmUgb25seSBkZWZpbmVkIGZvciBzb21lIHR5cGVzIChhdCB0aGUgbW9tZW50IHlvdSBjYW4KLSAqIG9ubHkgZG93bmNhc3QgZnJvbSBhIHVwYjo6RGVmIHRvIGEgc3BlY2lmaWMgRGVmIHR5cGUpLiAqLwotdGVtcGxhdGU8Y2xhc3MgVG8sIGNsYXNzIEZyb20+IFRvIGRvd25fY2FzdChGcm9tKiBmKTsKLQotLyogQ2FzdHMgdG8gYSBzdWJjbGFzcy4gIElmIHRoZSBjbGFzcyBkb2VzIG5vdCBhY3R1YWxseSBtYXRjaCB0aGUgZ2l2ZW4gVG8gdHlwZSwKLSAqIHJldHVybnMgTlVMTC4KLSAqCi0gKiBFeGFtcGxlOgotICogICB1cGI6OkRlZiogZGVmID0gR2V0RGVmKCk7Ci0gKiAgIC8vIG1kIHdpbGwgYmUgTlVMTCBpZiB0aGlzIHdhcyBub3QgYWN0dWFsbHkgYSBNZXNzYWdlRGVmLgotICogICB1cGI6Ok1lc3NnZURlZiogbWQgPSB1cGI6OmRvd25fY2FzdDx1cGI6Ok1lc3NhZ2VEZWY+KGRlZik7Ci0gKgotICogTm90ZSB0aGF0IGR5bmFtaWMgY2FzdHMgYXJlIG9ubHkgZGVmaW5lZCBmb3Igc29tZSB0eXBlcyAoYXQgdGhlIG1vbWVudCB5b3UKLSAqIGNhbiBvbmx5IGRvd25jYXN0IGZyb20gYSB1cGI6OkRlZiB0byBhIHNwZWNpZmljIERlZiB0eXBlKS4uICovCi10ZW1wbGF0ZTxjbGFzcyBUbywgY2xhc3MgRnJvbT4gVG8gZHluX2Nhc3QoRnJvbSogZik7Ci0KLS8qIENhc3RzIHRvIGFueSBiYXNlIGNsYXNzLCBvciB0aGUgdHlwZSBpdHNlbGYgKGllLiBjYW4gYmUgYSBuby1vcCkuCi0gKgotICogRXhhbXBsZToKLSAqICAgdXBiOjpNZXNzYWdlRGVmKiBtZCA9IEdldERlZigpOwotICogICAvLyBUaGlzIHdpbGwgZmFpbCB0byBjb21waWxlIGlmIHRoaXMgd2Fzbid0IGFjdHVhbGx5IGEgYmFzZSBjbGFzcy4KLSAqICAgdXBiOjpEZWYqIGRlZiA9IHVwYjo6dXBjYXN0KG1kKTsKLSAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+IGlubGluZSBQb2ludGVyPFQ+IHVwY2FzdChUICpmKSB7IHJldHVybiBQb2ludGVyPFQ+KGYpOyB9Ci0KLS8qIEF0dGVtcHQgdXBjYXN0IHRvIHNwZWNpZmljIGJhc2UgY2xhc3MuCi0gKgotICogRXhhbXBsZToKLSAqICAgdXBiOjpNZXNzYWdlRGVmKiBtZCA9IEdldERlZigpOwotICogICB1cGI6OnVwY2FzdF90bzx1cGI6OkRlZj4obWQpLT5NZXRob2RPbkRlZigpOwotICovCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgRj4gaW5saW5lIFQqIHVwY2FzdF90byhGICpmKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxUKj4odXBjYXN0KGYpKTsKLX0KLQotLyogUG9pbnRlckJhc2U8VD46IGltcGxlbWVudGF0aW9uIGRldGFpbCBvZiB1cGI6OnVwY2FzdCgpLgotICogSXQgaXMgaW1wbGljaXRseSBjb252ZXJ0YWJsZSB0byBwb2ludGVycyB0byB0aGUgQmFzZSBjbGFzcyhlcykuCi0gKi8KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCYXNlPgotY2xhc3MgUG9pbnRlckJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUG9pbnRlckJhc2UoVCogcHRyKSA6IHB0cl8ocHRyKSB7fQotICBvcGVyYXRvciBUKigpIHsgcmV0dXJuIHB0cl87IH0KLSAgb3BlcmF0b3IgQmFzZSooKSB7IHJldHVybiAoQmFzZSopcHRyXzsgfQotCi0gcHJpdmF0ZToKLSAgVCogcHRyXzsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBULCBjbGFzcyBCYXNlLCBjbGFzcyBCYXNlMj4KLWNsYXNzIFBvaW50ZXJCYXNlMiA6IHB1YmxpYyBQb2ludGVyQmFzZTxULCBCYXNlPiB7Ci0gcHVibGljOgotICBleHBsaWNpdCBQb2ludGVyQmFzZTIoVCogcHRyKSA6IFBvaW50ZXJCYXNlPFQsIEJhc2U+KHB0cikge30KLSAgb3BlcmF0b3IgQmFzZTIqKCkgeyByZXR1cm4gUG9pbnRlcjxCYXNlPigqdGhpcyk7IH0KLX07Ci0KLX0KLQotI2VuZGlmCi0KLQotLyogdXBiOjpFcnJvclNwYWNlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQSB1cGI6OkVycm9yU3BhY2UgcmVwcmVzZW50cyBzb21lIGRvbWFpbiBvZiBwb3NzaWJsZSBlcnJvciB2YWx1ZXMuICBUaGlzIGxldHMKLSAqIHVwYjo6U3RhdHVzIGF0dGFjaCBzcGVjaWZpYyBlcnJvciBjb2RlcyB0byBvcGVyYXRpb25zLCBsaWtlIFBPU0lYL0MgZXJybm8sCi0gKiBXaW4zMiBlcnJvciBjb2RlcywgZXRjLiAgQ2xpZW50cyB3aG8gd2FudCB0byBrbm93IHRoZSB2ZXJ5IHNwZWNpZmljIGVycm9yCi0gKiBjb2RlIGNhbiBjaGVjayB0aGUgZXJyb3Igc3BhY2UgYW5kIHRoZW4ga25vdyB0aGUgdHlwZSBvZiB0aGUgaW50ZWdlciBjb2RlLgotICoKLSAqIE5PVEU6IHVwYjo6RXJyb3JTcGFjZSBpcyBjdXJyZW50bHkgbm90IHVzZWQgYW5kIHNob3VsZCBiZSBjb25zaWRlcmVkCi0gKiBleHBlcmltZW50YWwuICBJdCBpcyBpbXBvcnRhbnQgcHJpbWFyaWx5IGluIGNhc2VzIHdoZXJlIHVwYiBpcyBwZXJmb3JtaW5nCi0gKiBJL08sIGJ1dCB1cGIgZG9lc24ndCBjdXJyZW50bHkgaGF2ZSBhbnkgY29tcG9uZW50cyB0aGF0IGRvIHRoaXMuICovCi0KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpFcnJvclNwYWNlLCB1cGJfZXJyb3JzcGFjZSkKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1jbGFzcyB1cGI6OkVycm9yU3BhY2UgewotI2Vsc2UKLXN0cnVjdCB1cGJfZXJyb3JzcGFjZSB7Ci0jZW5kaWYKLSAgY29uc3QgY2hhciAqbmFtZTsKLX07Ci0KLQotLyogdXBiOjpTdGF0dXMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdXBiOjpTdGF0dXMgcmVwcmVzZW50cyBhIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBzdGF0dXMgYW5kIGVycm9yIG1lc3NhZ2UuCi0gKiBJdCBvd25zIG5vIHJlc291cmNlcyBhbmQgYWxsb2NhdGVzIG5vIG1lbW9yeSwgc28gaXQgc2hvdWxkIHdvcmsKLSAqIGV2ZW4gaW4gT09NIHNpdHVhdGlvbnMuICovCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6U3RhdHVzLCB1cGJfc3RhdHVzKQotCi0vKiBUaGUgbWF4aW11bSBsZW5ndGggb2YgYW4gZXJyb3IgbWVzc2FnZSBiZWZvcmUgaXQgd2lsbCBnZXQgdHJ1bmNhdGVkLiAqLwotI2RlZmluZSBVUEJfU1RBVFVTX01BWF9NRVNTQUdFIDEyOAotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotY29uc3QgY2hhciAqdXBiX3N0YXR1c19lcnJtc2coY29uc3QgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLWJvb2wgdXBiX29rKGNvbnN0IHVwYl9zdGF0dXMgKnN0YXR1cyk7Ci11cGJfZXJyb3JzcGFjZSAqdXBiX3N0YXR1c19lcnJzcGFjZShjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpOwotaW50IHVwYl9zdGF0dXNfZXJyY29kZShjb25zdCB1cGJfc3RhdHVzICpzdGF0dXMpOwotCi0vKiBBbnkgb2YgdGhlIGZ1bmN0aW9ucyB0aGF0IHdyaXRlIHRvIGEgc3RhdHVzIG9iamVjdCBhbGxvdyBzdGF0dXMgdG8gYmUgTlVMTCwKLSAqIHRvIHN1cHBvcnQgdXNlIGNhc2VzIHdoZXJlIHRoZSBmdW5jdGlvbidzIGNhbGxlciBkb2VzIG5vdCBjYXJlIGFib3V0IHRoZQotICogc3RhdHVzIG1lc3NhZ2UuICovCi12b2lkIHVwYl9zdGF0dXNfY2xlYXIodXBiX3N0YXR1cyAqc3RhdHVzKTsKLXZvaWQgdXBiX3N0YXR1c19zZXRlcnJtc2codXBiX3N0YXR1cyAqc3RhdHVzLCBjb25zdCBjaGFyICptc2cpOwotdm9pZCB1cGJfc3RhdHVzX3NldGVycmYodXBiX3N0YXR1cyAqc3RhdHVzLCBjb25zdCBjaGFyICpmbXQsIC4uLik7Ci12b2lkIHVwYl9zdGF0dXNfdnNldGVycmYodXBiX3N0YXR1cyAqc3RhdHVzLCBjb25zdCBjaGFyICpmbXQsIHZhX2xpc3QgYXJncyk7Ci12b2lkIHVwYl9zdGF0dXNfY29weSh1cGJfc3RhdHVzICp0bywgY29uc3QgdXBiX3N0YXR1cyAqZnJvbSk7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLWNsYXNzIHVwYjo6U3RhdHVzIHsKLSBwdWJsaWM6Ci0gIFN0YXR1cygpIHsgdXBiX3N0YXR1c19jbGVhcih0aGlzKTsgfQotCi0gIC8qIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBpcyBubyBlcnJvci4gKi8KLSAgYm9vbCBvaygpIGNvbnN0IHsgcmV0dXJuIHVwYl9vayh0aGlzKTsgfQotCi0gIC8qIE9wdGlvbmFsIGVycm9yIHNwYWNlIGFuZCBjb2RlLCB1c2VmdWwgaWYgdGhlIGNhbGxlciB3YW50cyB0bwotICAgKiBwcm9ncmFtbWF0aWNhbGx5IGNoZWNrIHRoZSBzcGVjaWZpYyBraW5kIG9mIGVycm9yLiAqLwotICBFcnJvclNwYWNlKiBlcnJvcl9zcGFjZSgpIHsgcmV0dXJuIHVwYl9zdGF0dXNfZXJyc3BhY2UodGhpcyk7IH0KLSAgaW50IGVycm9yX2NvZGUoKSBjb25zdCB7IHJldHVybiB1cGJfc3RhdHVzX2VycmNvZGUodGhpcyk7IH0KLQotICAvKiBUaGUgcmV0dXJuZWQgc3RyaW5nIGlzIGludmFsaWRhdGVkIGJ5IGFueSBvdGhlciBjYWxsIGludG8gdGhlIHN0YXR1cy4gKi8KLSAgY29uc3QgY2hhciAqZXJyb3JfbWVzc2FnZSgpIGNvbnN0IHsgcmV0dXJuIHVwYl9zdGF0dXNfZXJybXNnKHRoaXMpOyB9Ci0KLSAgLyogVGhlIGVycm9yIG1lc3NhZ2Ugd2lsbCBiZSB0cnVuY2F0ZWQgaWYgaXQgaXMgbG9uZ2VyIHRoYW4KLSAgICogVVBCX1NUQVRVU19NQVhfTUVTU0FHRS00LiAqLwotICB2b2lkIFNldEVycm9yTWVzc2FnZShjb25zdCBjaGFyKiBtc2cpIHsgdXBiX3N0YXR1c19zZXRlcnJtc2codGhpcywgbXNnKTsgfQotICB2b2lkIFNldEZvcm1hdHRlZEVycm9yTWVzc2FnZShjb25zdCBjaGFyKiBmbXQsIC4uLikgewotICAgIHZhX2xpc3QgYXJnczsKLSAgICB2YV9zdGFydChhcmdzLCBmbXQpOwotICAgIHVwYl9zdGF0dXNfdnNldGVycmYodGhpcywgZm10LCBhcmdzKTsKLSAgICB2YV9lbmQoYXJncyk7Ci0gIH0KLQotICAvKiBSZXNldHMgdGhlIHN0YXR1cyB0byBhIHN1Y2Nlc3NmdWwgc3RhdGUgd2l0aCBubyBtZXNzYWdlLiAqLwotICB2b2lkIENsZWFyKCkgeyB1cGJfc3RhdHVzX2NsZWFyKHRoaXMpOyB9Ci0KLSAgdm9pZCBDb3B5RnJvbShjb25zdCBTdGF0dXMmIG90aGVyKSB7IHVwYl9zdGF0dXNfY29weSh0aGlzLCAmb3RoZXIpOyB9Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKFN0YXR1cykKLSNlbHNlCi1zdHJ1Y3QgdXBiX3N0YXR1cyB7Ci0jZW5kaWYKLSAgYm9vbCBva187Ci0KLSAgLyogU3BlY2lmaWMgc3RhdHVzIGNvZGUgZGVmaW5lZCBieSBzb21lIGVycm9yIHNwYWNlIChvcHRpb25hbCkuICovCi0gIGludCBjb2RlXzsKLSAgdXBiX2Vycm9yc3BhY2UgKmVycm9yX3NwYWNlXzsKLQotICAvKiBUT0RPKGhhYmVybWFuKTogYWRkIGZpbGUvbGluZSBvZiBlcnJvcj8gKi8KLQotICAvKiBFcnJvciBtZXNzYWdlOyBOVUxMLXRlcm1pbmF0ZWQuICovCi0gIGNoYXIgbXNnW1VQQl9TVEFUVVNfTUFYX01FU1NBR0VdOwotfTsKLQotI2RlZmluZSBVUEJfU1RBVFVTX0lOSVQge3RydWUsIDAsIE5VTEwsIHswfX0KLQotCi0vKiogQnVpbHQtaW4gZXJyb3Igc3BhY2VzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFcnJvcnMgcmFpc2VkIGJ5IHVwYiB0aGF0IHdlIHdhbnQgdG8gYmUgYWJsZSB0byBkZXRlY3QgcHJvZ3JhbW1hdGljYWxseS4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9OT01FTSAgIC8qIENhbid0IHJldXNlIEVOT01FTSBiZWNhdXNlIGl0IGlzIFBPU0lYLCBub3QgSVNPIEMuICovCi19IHVwYl9lcnJjb2RlX3Q7Ci0KLWV4dGVybiB1cGJfZXJyb3JzcGFjZSB1cGJfdXBiZXJyOwotCi12b2lkIHVwYl91cGJlcnJfc2V0b29tKHVwYl9zdGF0dXMgKnMpOwotCi0vKiBTaW5jZSBlcnJubyBpcyBkZWZpbmVkIGJ5IHN0YW5kYXJkIEMsIHdlIGRlZmluZSBhbiBlcnJvciBzcGFjZSBmb3IgaXQgaW4KLSAqIGNvcmUgdXBiLiAgT3RoZXIgZXJyb3Igc3BhY2VzIHNob3VsZCBiZSBkZWZpbmVkIGluIG90aGVyLCBwbGF0Zm9ybS1zcGVjaWZpYwotICogbW9kdWxlcy4gKi8KLQotZXh0ZXJuIHVwYl9lcnJvcnNwYWNlIHVwYl9lcnJub2VycjsKLQotCi0vKiogdXBiOjpBbGxvY2F0b3IgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBBIHVwYjo6QWxsb2NhdG9yIGlzIGEgcG9zc2libHktc3RhdGVmdWwgYWxsb2NhdG9yIG9iamVjdC4KLSAqCi0gKiBJdCBjb3VsZCBlaXRoZXIgYmUgYW4gYXJlbmEgYWxsb2NhdG9yICh3aGljaCBkb2Vzbid0IHJlcXVpcmUgaW5kaXZpZHVhbAotICogZnJlZSgpIGNhbGxzKSBvciBhIHJlZ3VsYXIgbWFsbG9jKCkgKHdoaWNoIGRvZXMpLiAgVGhlIGNsaWVudCBtdXN0IHRoZXJlZm9yZQotICogZnJlZSBtZW1vcnkgdW5sZXNzIGl0IGtub3dzIHRoYXQgdGhlIGFsbG9jYXRvciBpcyBhbiBhcmVuYSBhbGxvY2F0b3IuICovCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6QWxsb2NhdG9yLCB1cGJfYWxsb2MpCi0KLS8qIEEgbWFsbG9jKCkvZnJlZSgpIGZ1bmN0aW9uLgotICogSWYgInNpemUiIGlzIDAgdGhlbiB0aGUgZnVuY3Rpb24gYWN0cyBsaWtlIGZyZWUoKSwgb3RoZXJ3aXNlIGl0IGFjdHMgbGlrZQotICogcmVhbGxvYygpLiAgT25seSAib2xkc2l6ZSIgYnl0ZXMgZnJvbSBhIHByZXZpb3VzIGFsbG9jYXRpb24gYXJlIHByZXNlcnZlZC4gKi8KLXR5cGVkZWYgdm9pZCAqdXBiX2FsbG9jX2Z1bmModXBiX2FsbG9jICphbGxvYywgdm9pZCAqcHRyLCBzaXplX3Qgb2xkc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotY2xhc3MgdXBiOjpBbGxvY2F0b3IgVVBCX0ZJTkFMIHsKLSBwdWJsaWM6Ci0gIEFsbG9jYXRvcigpIHt9Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKEFsbG9jYXRvcikKLQotIHB1YmxpYzoKLSNlbHNlCi1zdHJ1Y3QgdXBiX2FsbG9jIHsKLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLSAgdXBiX2FsbG9jX2Z1bmMgKmZ1bmM7Ci19OwotCi1VUEJfSU5MSU5FIHZvaWQgKnVwYl9tYWxsb2ModXBiX2FsbG9jICphbGxvYywgc2l6ZV90IHNpemUpIHsKLSAgYXNzZXJ0KHNpemUgPiAwKTsKLSAgcmV0dXJuIGFsbG9jLT5mdW5jKGFsbG9jLCBOVUxMLCAwLCBzaXplKTsKLX0KLQotVVBCX0lOTElORSB2b2lkICp1cGJfcmVhbGxvYyh1cGJfYWxsb2MgKmFsbG9jLCB2b2lkICpwdHIsIHNpemVfdCBvbGRzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkgewotICBhc3NlcnQoc2l6ZSA+IDApOwotICByZXR1cm4gYWxsb2MtPmZ1bmMoYWxsb2MsIHB0ciwgb2xkc2l6ZSwgc2l6ZSk7Ci19Ci0KLVVQQl9JTkxJTkUgdm9pZCB1cGJfZnJlZSh1cGJfYWxsb2MgKmFsbG9jLCB2b2lkICpwdHIpIHsKLSAgYWxsb2MtPmZ1bmMoYWxsb2MsIHB0ciwgMCwgMCk7Ci19Ci0KLS8qIFRoZSBnbG9iYWwgYWxsb2NhdG9yIHVzZWQgYnkgdXBiLiAgVXNlcyB0aGUgc3RhbmRhcmQgbWFsbG9jKCkvZnJlZSgpLiAqLwotCi1leHRlcm4gdXBiX2FsbG9jIHVwYl9hbGxvY19nbG9iYWw7Ci0KLS8qIEZ1bmN0aW9ucyB0aGF0IGhhcmQtY29kZSB0aGUgZ2xvYmFsIG1hbGxvYy4KLSAqCi0gKiBXZSBzdGlsbCBnZXQgYmVuZWZpdCBiZWNhdXNlIHdlIGNhbiBwdXQgY3VzdG9tIGxvZ2ljIGludG8gb3VyIGdsb2JhbAotICogYWxsb2NhdG9yLCBsaWtlIGluamVjdGluZyBvdXQtb2YtbWVtb3J5IGZhdWx0cyBpbiBkZWJ1Zy90ZXN0aW5nIGJ1aWxkcy4gKi8KLQotVVBCX0lOTElORSB2b2lkICp1cGJfZ21hbGxvYyhzaXplX3Qgc2l6ZSkgewotICByZXR1cm4gdXBiX21hbGxvYygmdXBiX2FsbG9jX2dsb2JhbCwgc2l6ZSk7Ci19Ci0KLVVQQl9JTkxJTkUgdm9pZCAqdXBiX2dyZWFsbG9jKHZvaWQgKnB0ciwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplKSB7Ci0gIHJldHVybiB1cGJfcmVhbGxvYygmdXBiX2FsbG9jX2dsb2JhbCwgcHRyLCBvbGRzaXplLCBzaXplKTsKLX0KLQotVVBCX0lOTElORSB2b2lkIHVwYl9nZnJlZSh2b2lkICpwdHIpIHsKLSAgdXBiX2ZyZWUoJnVwYl9hbGxvY19nbG9iYWwsIHB0cik7Ci19Ci0KLS8qIHVwYjo6QXJlbmEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIHVwYjo6QXJlbmEgaXMgYSBzcGVjaWZpYyBhbGxvY2F0b3IgaW1wbGVtZW50YXRpb24gdGhhdCB1c2VzIGFyZW5hIGFsbG9jYXRpb24uCi0gKiBUaGUgdXNlciBwcm92aWRlcyBhbiBhbGxvY2F0b3IgdGhhdCB3aWxsIGJlIHVzZWQgdG8gYWxsb2NhdGUgdGhlIHVuZGVybHlpbmcKLSAqIGFyZW5hIGJsb2Nrcy4gIEFyZW5hcyBieSBuYXR1cmUgZG8gbm90IHJlcXVpcmUgdGhlIGluZGl2aWR1YWwgYWxsb2NhdGlvbnMKLSAqIHRvIGJlIGZyZWVkLiAgSG93ZXZlciB0aGUgQXJlbmEgZG9lcyBhbGxvdyB1c2VycyB0byByZWdpc3RlciBjbGVhbnVwCi0gKiBmdW5jdGlvbnMgdGhhdCB3aWxsIHJ1biB3aGVuIHRoZSBhcmVuYSBpcyBkZXN0cm95ZWQuCi0gKgotICogQSB1cGI6OkFyZW5hIGlzICpub3QqIHRocmVhZC1zYWZlLgotICoKLSAqIFlvdSBjb3VsZCB3cml0ZSBhIHRocmVhZC1zYWZlIGFyZW5hIGFsbG9jYXRvciB0aGF0IHNhdGlzZmllcyB0aGUKLSAqIHVwYjo6QWxsb2NhdG9yIGludGVyZmFjZSwgYnV0IGl0IHdvdWxkIG5vdCBiZSBhcyBlZmZpY2llbnQgZm9yIHRoZQotICogc2luZ2xlLXRocmVhZGVkIGNhc2UuICovCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6QXJlbmEsIHVwYl9hcmVuYSkKLQotdHlwZWRlZiB2b2lkIHVwYl9jbGVhbnVwX2Z1bmModm9pZCAqdWQpOwotCi0jZGVmaW5lIFVQQl9BUkVOQV9CTE9DS19PVkVSSEVBRCAoc2l6ZW9mKHNpemVfdCkqNCkKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLXZvaWQgdXBiX2FyZW5hX2luaXQodXBiX2FyZW5hICphKTsKLXZvaWQgdXBiX2FyZW5hX2luaXQyKHVwYl9hcmVuYSAqYSwgdm9pZCAqbWVtLCBzaXplX3QgbiwgdXBiX2FsbG9jICphbGxvYyk7Ci12b2lkIHVwYl9hcmVuYV91bmluaXQodXBiX2FyZW5hICphKTsKLXVwYl9hbGxvYyAqdXBiX2FyZW5hX2FsbG9jKHVwYl9hcmVuYSAqYSk7Ci1ib29sIHVwYl9hcmVuYV9hZGRjbGVhbnVwKHVwYl9hcmVuYSAqYSwgdXBiX2NsZWFudXBfZnVuYyAqZnVuYywgdm9pZCAqdWQpOwotc2l6ZV90IHVwYl9hcmVuYV9ieXRlc2FsbG9jYXRlZChjb25zdCB1cGJfYXJlbmEgKmEpOwotdm9pZCB1cGJfYXJlbmFfc2V0bmV4dGJsb2Nrc2l6ZSh1cGJfYXJlbmEgKmEsIHNpemVfdCBzaXplKTsKLXZvaWQgdXBiX2FyZW5hX3NldG1heGJsb2Nrc2l6ZSh1cGJfYXJlbmEgKmEsIHNpemVfdCBzaXplKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotY2xhc3MgdXBiOjpBcmVuYSB7Ci0gcHVibGljOgotICAvKiBBIHNpbXBsZSBhcmVuYSB3aXRoIG5vIGluaXRpYWwgbWVtb3J5IGJsb2NrIGFuZCB0aGUgZGVmYXVsdCBhbGxvY2F0b3IuICovCi0gIEFyZW5hKCkgeyB1cGJfYXJlbmFfaW5pdCh0aGlzKTsgfQotCi0gIC8qIENvbnN0cnVjdHMgYW4gYXJlbmEgd2l0aCB0aGUgZ2l2ZW4gaW5pdGlhbCBibG9jayB3aGljaCBhbGxvY2F0ZXMgYmxvY2tzCi0gICAqIHdpdGggdGhlIGdpdmVuIGFsbG9jYXRvci4gIFRoZSBnaXZlbiBhbGxvY2F0b3IgbXVzdCBvdXRsaXZlIHRoZSBBcmVuYS4KLSAgICoKLSAgICogSWYgeW91IHBhc3MgTlVMTCBmb3IgdGhlIGFsbG9jYXRvciBpdCB3aWxsIGRlZmF1bHQgdG8gdGhlIGdsb2JhbCBhbGxvY2F0b3IKLSAgICogdXBiX2FsbG9jX2dsb2JhbCwgYW5kIE5VTEwvMCBmb3IgdGhlIGluaXRpYWwgYmxvY2sgd2lsbCBjYXVzZSB0aGVyZSB0byBiZQotICAgKiBubyBpbml0aWFsIGJsb2NrLiAqLwotICBBcmVuYSh2b2lkICptZW0sIHNpemVfdCBsZW4sIEFsbG9jYXRvciogYSkgewotICAgIHVwYl9hcmVuYV9pbml0Mih0aGlzLCBtZW0sIGxlbiwgYSk7Ci0gIH0KLQotICB+QXJlbmEoKSB7IHVwYl9hcmVuYV91bmluaXQodGhpcyk7IH0KLQotICAvKiBTZXRzIHRoZSBzaXplIG9mIHRoZSBuZXh0IGJsb2NrIHRoZSBBcmVuYSB3aWxsIHJlcXVlc3QgKHVubGVzcyB0aGUKLSAgICogcmVxdWVzdGVkIGFsbG9jYXRpb24gaXMgbGFyZ2VyKS4gIEVhY2ggYmxvY2sgd2lsbCBkb3VibGUgaW4gc2l6ZSB1bnRpbCB0aGUKLSAgICogbWF4IGxpbWl0IGlzIHJlYWNoZWQuICovCi0gIHZvaWQgU2V0TmV4dEJsb2NrU2l6ZShzaXplX3Qgc2l6ZSkgeyB1cGJfYXJlbmFfc2V0bmV4dGJsb2Nrc2l6ZSh0aGlzLCBzaXplKTsgfQotCi0gIC8qIFNldHMgdGhlIG1heGltdW0gYmxvY2sgc2l6ZS4gIE5vIGJsb2NrcyBsYXJnZXIgdGhhbiB0aGlzIHdpbGwgYmUgcmVxdWVzdGVkCi0gICAqIGZyb20gdGhlIHVuZGVybHlpbmcgYWxsb2NhdG9yIHVubGVzcyBpbmRpdmlkdWFsIGFyZW5hIGFsbG9jYXRpb25zIGFyZQotICAgKiBsYXJnZXIuICovCi0gIHZvaWQgU2V0TWF4QmxvY2tTaXplKHNpemVfdCBzaXplKSB7IHVwYl9hcmVuYV9zZXRtYXhibG9ja3NpemUodGhpcywgc2l6ZSk7IH0KLQotICAvKiBBbGxvd3MgdGhpcyBhcmVuYSB0byBiZSB1c2VkIGFzIGEgZ2VuZXJpYyBhbGxvY2F0b3IuCi0gICAqCi0gICAqIFRoZSBhcmVuYSBkb2VzIG5vdCBuZWVkIGZyZWUoKSBjYWxscyBzbyB3aGVuIHVzaW5nIEFyZW5hIGFzIGFuIGFsbG9jYXRvcgotICAgKiBpdCBpcyBzYWZlIHRvIHNraXAgdGhlbS4gIEhvd2V2ZXIgdGhleSBhcmUgbm8tb3BzIHNvIHRoZXJlIGlzIG5vIGhhcm0gaW4KLSAgICogY2FsbGluZyBmcmVlKCkgZWl0aGVyLiAqLwotICBBbGxvY2F0b3IqIGFsbG9jYXRvcigpIHsgcmV0dXJuIHVwYl9hcmVuYV9hbGxvYyh0aGlzKTsgfQotCi0gIC8qIEFkZCBhIGNsZWFudXAgZnVuY3Rpb24gdG8gcnVuIHdoZW4gdGhlIGFyZW5hIGlzIGRlc3Ryb3llZC4KLSAgICogUmV0dXJucyBmYWxzZSBvbiBvdXQtb2YtbWVtb3J5LiAqLwotICBib29sIEFkZENsZWFudXAodXBiX2NsZWFudXBfZnVuYyogZnVuYywgdm9pZCogdWQpIHsKLSAgICByZXR1cm4gdXBiX2FyZW5hX2FkZGNsZWFudXAodGhpcywgZnVuYywgdWQpOwotICB9Ci0KLSAgLyogVG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIGFsbG9jYXRlZC4gIEl0IGlzIHVuZGVmaW5lZCB3aGF0Ci0gICAqIFJlYWxsb2MoKSBkb2VzIHRvIHRoaXMgY291bnRlci4gKi8KLSAgc2l6ZV90IEJ5dGVzQWxsb2NhdGVkKCkgY29uc3QgewotICAgIHJldHVybiB1cGJfYXJlbmFfYnl0ZXNhbGxvY2F0ZWQodGhpcyk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oQXJlbmEpCi0KLSNlbHNlCi1zdHJ1Y3QgdXBiX2FyZW5hIHsKLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLSAgLyogV2UgaW1wbGVtZW50IHRoZSBhbGxvY2F0b3IgaW50ZXJmYWNlLgotICAgKiBUaGlzIG11c3QgYmUgdGhlIGZpcnN0IG1lbWJlciBvZiB1cGJfYXJlbmEhICovCi0gIHVwYl9hbGxvYyBhbGxvYzsKLQotICAvKiBBbGxvY2F0b3IgdG8gYWxsb2NhdGUgYXJlbmEgYmxvY2tzLiAgV2UgYXJlIHJlc3BvbnNpYmxlIGZvciBmcmVlaW5nIHRoZXNlCi0gICAqIHdoZW4gd2UgYXJlIGRlc3Ryb3llZC4gKi8KLSAgdXBiX2FsbG9jICpibG9ja19hbGxvYzsKLQotICBzaXplX3QgYnl0ZXNfYWxsb2NhdGVkOwotICBzaXplX3QgbmV4dF9ibG9ja19zaXplOwotICBzaXplX3QgbWF4X2Jsb2NrX3NpemU7Ci0KLSAgLyogTGlua2VkIGxpc3Qgb2YgYmxvY2tzLiAgUG9pbnRzIHRvIGFuIGFyZW5hX2Jsb2NrLCBkZWZpbmVkIGluIGVudi5jICovCi0gIHZvaWQgKmJsb2NrX2hlYWQ7Ci0KLSAgLyogQ2xlYW51cCBlbnRyaWVzLiAgUG9pbnRlciB0byBhIGNsZWFudXBfZW50LCBkZWZpbmVkIGluIGVudi5jICovCi0gIHZvaWQgKmNsZWFudXBfaGVhZDsKLQotICAvKiBGb3IgZnV0dXJlIGV4cGFuc2lvbiwgc2luY2UgdGhlIHNpemUgb2YgdGhpcyBzdHJ1Y3QgaXMgZXhwb3NlZCB0byB1c2Vycy4gKi8KLSAgdm9pZCAqZnV0dXJlMTsKLSAgdm9pZCAqZnV0dXJlMjsKLX07Ci0KLQotLyogdXBiOjpFbnZpcm9ubWVudCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQSB1cGI6OkVudmlyb25tZW50IHByb3ZpZGVzIGEgbWVhbnMgZm9yIGluamVjdGluZyBtYWxsb2MgYW5kIGFuCi0gKiBlcnJvci1yZXBvcnRpbmcgY2FsbGJhY2sgaW50byBlbmNvZGVycy9kZWNvZGVycy4gIFRoaXMgYWxsb3dzIHRoZW0gdG8gYmUKLSAqIGluZGVwZW5kZW50IG9mIG5lYXJseSBhbGwgYXNzdW1wdGlvbnMgYWJvdXQgdGhlaXIgYWN0dWFsIGVudmlyb25tZW50LgotICoKLSAqIEl0IGlzIGFsc28gYSBjb250YWluZXIgZm9yIGFsbG9jYXRpbmcgdGhlIGVuY29kZXJzL2RlY29kZXJzIHRoZW1zZWx2ZXMgdGhhdAotICogaW5zdWxhdGVzIGNsaWVudHMgZnJvbSBrbm93aW5nIHRoZWlyIGFjdHVhbCBzaXplLiAgVGhpcyBwcm92aWRlcyBBQkkKLSAqIGNvbXBhdGliaWxpdHkgZXZlbiBpZiB0aGUgc2l6ZSBvZiB0aGUgb2JqZWN0cyBjaGFuZ2UuICBBbmQgdGhpcyBhbGxvd3MgdGhlCi0gKiBzdHJ1Y3R1cmUgZGVmaW5pdGlvbnMgdG8gYmUgaW4gdGhlIC5jIGZpbGVzIGluc3RlYWQgb2YgdGhlIC5oIGZpbGVzLCBtYWtpbmcKLSAqIHRoZSAuaCBmaWxlcyBzbWFsbGVyIGFuZCBtb3JlIHJlYWRhYmxlLgotICoKLSAqIFdlIG1pZ2h0IHdhbnQgdG8gY29uc2lkZXIgcmVuYW1pbmcgdGhpcyB0byAiUGlwZWxpbmUiIGlmL3doZW4gdGhlIGNvbmNlcHQgb2YKLSAqIGEgcGlwZWxpbmUgZWxlbWVudCBiZWNvbWVzIG1vcmUgZm9ybWFsaXplZC4gKi8KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpFbnZpcm9ubWVudCwgdXBiX2VudikKLQotLyogQSBmdW5jdGlvbiB0aGF0IHJlY2VpdmVzIGFuIGVycm9yIHJlcG9ydCBmcm9tIGFuIGVuY29kZXIgb3IgZGVjb2Rlci4gIFRoZQotICogY2FsbGJhY2sgY2FuIHJldHVybiB0cnVlIHRvIHJlcXVlc3QgdGhhdCB0aGUgZXJyb3Igc2hvdWxkIGJlIHJlY292ZXJlZCwgYnV0Ci0gKiBpZiB0aGUgZXJyb3IgaXMgbm90IHJlY292ZXJhYmxlIHRoaXMgaGFzIG5vIGVmZmVjdC4gKi8KLXR5cGVkZWYgYm9vbCB1cGJfZXJyb3JfZnVuYyh2b2lkICp1ZCwgY29uc3QgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLXZvaWQgdXBiX2Vudl9pbml0KHVwYl9lbnYgKmUpOwotdm9pZCB1cGJfZW52X2luaXQyKHVwYl9lbnYgKmUsIHZvaWQgKm1lbSwgc2l6ZV90IG4sIHVwYl9hbGxvYyAqYWxsb2MpOwotdm9pZCB1cGJfZW52X3VuaW5pdCh1cGJfZW52ICplKTsKLQotdm9pZCB1cGJfZW52X2luaXRvbmx5KHVwYl9lbnYgKmUpOwotCi11cGJfYXJlbmEgKnVwYl9lbnZfYXJlbmEodXBiX2VudiAqZSk7Ci1ib29sIHVwYl9lbnZfb2soY29uc3QgdXBiX2VudiAqZSk7Ci12b2lkIHVwYl9lbnZfc2V0ZXJyb3JmdW5jKHVwYl9lbnYgKmUsIHVwYl9lcnJvcl9mdW5jICpmdW5jLCB2b2lkICp1ZCk7Ci0KLS8qIENvbnZlbmllbmNlIHdyYXBwZXJzIGFyb3VuZCB0aGUgbWV0aG9kcyBvZiB0aGUgY29udGFpbmVkIGFyZW5hLiAqLwotdm9pZCB1cGJfZW52X3JlcG9ydGVycm9yc3RvKHVwYl9lbnYgKmUsIHVwYl9zdGF0dXMgKnMpOwotYm9vbCB1cGJfZW52X3JlcG9ydGVycm9yKHVwYl9lbnYgKmUsIGNvbnN0IHVwYl9zdGF0dXMgKnMpOwotdm9pZCAqdXBiX2Vudl9tYWxsb2ModXBiX2VudiAqZSwgc2l6ZV90IHNpemUpOwotdm9pZCAqdXBiX2Vudl9yZWFsbG9jKHVwYl9lbnYgKmUsIHZvaWQgKnB0ciwgc2l6ZV90IG9sZHNpemUsIHNpemVfdCBzaXplKTsKLXZvaWQgdXBiX2Vudl9mcmVlKHVwYl9lbnYgKmUsIHZvaWQgKnB0cik7Ci1ib29sIHVwYl9lbnZfYWRkY2xlYW51cCh1cGJfZW52ICplLCB1cGJfY2xlYW51cF9mdW5jICpmdW5jLCB2b2lkICp1ZCk7Ci1zaXplX3QgdXBiX2Vudl9ieXRlc2FsbG9jYXRlZChjb25zdCB1cGJfZW52ICplKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotY2xhc3MgdXBiOjpFbnZpcm9ubWVudCB7Ci0gcHVibGljOgotICAvKiBUaGUgZ2l2ZW4gQXJlbmEgbXVzdCBvdXRsaXZlIHRoaXMgZW52aXJvbm1lbnQuICovCi0gIEVudmlyb25tZW50KCkgeyB1cGJfZW52X2luaXRvbmx5KHRoaXMpOyB9Ci0KLSAgRW52aXJvbm1lbnQodm9pZCAqbWVtLCBzaXplX3QgbGVuLCBBbGxvY2F0b3IgKmEpIDogYXJlbmFfKG1lbSwgbGVuLCBhKSB7Ci0gICAgdXBiX2Vudl9pbml0b25seSh0aGlzKTsKLSAgfQotCi0gIEFyZW5hKiBhcmVuYSgpIHsgcmV0dXJuIHVwYl9lbnZfYXJlbmEodGhpcyk7IH0KLQotICAvKiBTZXQgYSBjdXN0b20gZXJyb3IgcmVwb3J0aW5nIGZ1bmN0aW9uLiAqLwotICB2b2lkIFNldEVycm9yRnVuY3Rpb24odXBiX2Vycm9yX2Z1bmMqIGZ1bmMsIHZvaWQqIHVkKSB7Ci0gICAgdXBiX2Vudl9zZXRlcnJvcmZ1bmModGhpcywgZnVuYywgdWQpOwotICB9Ci0KLSAgLyogU2V0IHRoZSBlcnJvciByZXBvcnRpbmcgZnVuY3Rpb24gdG8gc2ltcGx5IGNvcHkgdGhlIHN0YXR1cyB0byB0aGUgZ2l2ZW4KLSAgICogc3RhdHVzIGFuZCBhYm9ydC4gKi8KLSAgdm9pZCBSZXBvcnRFcnJvcnNUbyhTdGF0dXMqIHN0YXR1cykgeyB1cGJfZW52X3JlcG9ydGVycm9yc3RvKHRoaXMsIHN0YXR1cyk7IH0KLQotICAvKiBSZXR1cm5zIHRydWUgaWYgYWxsIGFsbG9jYXRpb25zIGFuZCBBZGRDbGVhbnVwKCkgY2FsbHMgaGF2ZSBzdWNjZWVkZWQsCi0gICAqIGFuZCBubyBlcnJvcnMgd2VyZSByZXBvcnRlZCB3aXRoIFJlcG9ydEVycm9yKCkgKGV4Y2VwdCBvbmVzIHRoYXQgcmVjb3ZlcmVkCi0gICAqIHN1Y2Nlc3NmdWxseSkuICovCi0gIGJvb2wgb2soKSBjb25zdCB7IHJldHVybiB1cGJfZW52X29rKHRoaXMpOyB9Ci0KLSAgLyogUmVwb3J0cyBhbiBlcnJvciB0byB0aGlzIGVudmlyb25tZW50J3MgY2FsbGJhY2ssIHJldHVybmluZyB0cnVlIGlmCi0gICAqIHRoZSBjYWxsZXIgc2hvdWxkIHRyeSB0byByZWNvdmVyLiAqLwotICBib29sIFJlcG9ydEVycm9yKGNvbnN0IFN0YXR1cyogc3RhdHVzKSB7Ci0gICAgcmV0dXJuIHVwYl9lbnZfcmVwb3J0ZXJyb3IodGhpcywgc3RhdHVzKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX0NPUFlfQU5EX0FTU0lHTihFbnZpcm9ubWVudCkKLQotI2Vsc2UKLXN0cnVjdCB1cGJfZW52IHsKLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLSAgdXBiX2FyZW5hIGFyZW5hXzsKLSAgdXBiX2Vycm9yX2Z1bmMgKmVycm9yX2Z1bmNfOwotICB2b2lkICplcnJvcl91ZF87Ci0gIGJvb2wgb2tfOwotfTsKLQotCi0vKiB1cGI6OklubGluZWRBcmVuYSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotLyogdXBiOjpJbmxpbmVkRW52aXJvbm1lbnQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogdXBiOjpJbmxpbmVkQXJlbmEgYW5kIHVwYjo6SW5saW5lZEVudmlyb25tZW50IHNlZWQgdGhlaXIgYXJlbmFzIHdpdGggYQotICogcHJlZGVmaW5lZCBhbW91bnQgb2YgbWVtb3J5LiAgTm8gaGVhcCBtZW1vcnkgd2lsbCBiZSBhbGxvY2F0ZWQgdW50aWwgdGhlCi0gKiBpbml0aWFsIGJsb2NrIGlzIGV4Y2VlZGVkLgotICoKLSAqIFRoZXNlIHR5cGVzIG9ubHkgZXhpc3QgaW4gQysrICovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi10ZW1wbGF0ZSA8aW50IE4+IGNsYXNzIHVwYjo6SW5saW5lZEFyZW5hIDogcHVibGljIHVwYjo6QXJlbmEgewotIHB1YmxpYzoKLSAgSW5saW5lZEFyZW5hKCkgOiBBcmVuYShpbml0aWFsX2Jsb2NrXywgTiwgTlVMTCkge30KLSAgZXhwbGljaXQgSW5saW5lZEFyZW5hKEFsbG9jYXRvciogYSkgOiBBcmVuYShpbml0aWFsX2Jsb2NrXywgTiwgYSkge30KLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSW5saW5lZEFyZW5hKQotCi0gIGNoYXIgaW5pdGlhbF9ibG9ja19bTiArIFVQQl9BUkVOQV9CTE9DS19PVkVSSEVBRF07Ci19OwotCi10ZW1wbGF0ZSA8aW50IE4+IGNsYXNzIHVwYjo6SW5saW5lZEVudmlyb25tZW50IDogcHVibGljIHVwYjo6RW52aXJvbm1lbnQgewotIHB1YmxpYzoKLSAgSW5saW5lZEVudmlyb25tZW50KCkgOiBFbnZpcm9ubWVudChpbml0aWFsX2Jsb2NrXywgTiwgTlVMTCkge30KLSAgZXhwbGljaXQgSW5saW5lZEVudmlyb25tZW50KEFsbG9jYXRvciAqYSkKLSAgICAgIDogRW52aXJvbm1lbnQoaW5pdGlhbF9ibG9ja18sIE4sIGEpIHt9Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKElubGluZWRFbnZpcm9ubWVudCkKLQotICBjaGFyIGluaXRpYWxfYmxvY2tfW04gKyBVUEJfQVJFTkFfQkxPQ0tfT1ZFUkhFQURdOwotfTsKLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0KLQotI2VuZGlmICAvKiBVUEJfSF8gKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1leHRlcm4gIkMiIHsKLSNlbmRpZgotCi0KLS8qIHVwYl92YWx1ZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEEgdGFnZ2VkIHVuaW9uIChzdG9yZWQgdW50YWdnZWQgaW5zaWRlIHRoZSB0YWJsZSkgc28gdGhhdCB3ZSBjYW4gY2hlY2sgdGhhdAotICogY2xpZW50cyBjYWxsaW5nIHRhYmxlIGFjY2Vzc29ycyBhcmUgY29ycmVjdGx5IHR5cGVkIHdpdGhvdXQgaGF2aW5nIHRvIGhhdmUKLSAqIGFuIGV4cGxvc2lvbiBvZiBhY2Nlc3NvcnMuICovCi10eXBlZGVmIGVudW0gewotICBVUEJfQ1RZUEVfSU5UMzIgICAgPSAxLAotICBVUEJfQ1RZUEVfSU5UNjQgICAgPSAyLAotICBVUEJfQ1RZUEVfVUlOVDMyICAgPSAzLAotICBVUEJfQ1RZUEVfVUlOVDY0ICAgPSA0LAotICBVUEJfQ1RZUEVfQk9PTCAgICAgPSA1LAotICBVUEJfQ1RZUEVfQ1NUUiAgICAgPSA2LAotICBVUEJfQ1RZUEVfUFRSICAgICAgPSA3LAotICBVUEJfQ1RZUEVfQ09OU1RQVFIgPSA4LAotICBVUEJfQ1RZUEVfRlBUUiAgICAgPSA5Ci19IHVwYl9jdHlwZV90OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVpbnQ2NF90IHZhbDsKLSNpZm5kZWYgTkRFQlVHCi0gIC8qIEluIGRlYnVnIG1vZGUgd2UgY2FycnkgdGhlIHZhbHVlIHR5cGUgYXJvdW5kIGFsc28gc28gd2UgY2FuIGNoZWNrIGFjY2Vzc2VzCi0gICAqIHRvIGJlIHN1cmUgdGhlIHJpZ2h0IG1lbWJlciBpcyBiZWluZyByZWFkLiAqLwotICB1cGJfY3R5cGVfdCBjdHlwZTsKLSNlbmRpZgotfSB1cGJfdmFsdWU7Ci0KLSNpZmRlZiBOREVCVUcKLSNkZWZpbmUgU0VUX1RZUEUoZGVzdCwgdmFsKSAgICAgIFVQQl9VTlVTRUQodmFsKQotI2Vsc2UKLSNkZWZpbmUgU0VUX1RZUEUoZGVzdCwgdmFsKSBkZXN0ID0gdmFsCi0jZW5kaWYKLQotLyogTGlrZSBzdHJkdXAoKSwgd2hpY2ggaXNuJ3QgYWx3YXlzIGF2YWlsYWJsZSBzaW5jZSBpdCdzIG5vdCBBTlNJIEMuICovCi1jaGFyICp1cGJfc3RyZHVwKGNvbnN0IGNoYXIgKnMsIHVwYl9hbGxvYyAqYSk7Ci0vKiBWYXJpYW50IHRoYXQgd29ya3Mgd2l0aCBhIGxlbmd0aC1kZWxpbWl0ZWQgcmF0aGVyIHRoYW4gTlVMTC1kZWxpbWl0ZWQgc3RyaW5nLAotICogYXMgc3VwcG9ydGVkIGJ5IHN0cnRhYmxlLiAqLwotY2hhciAqdXBiX3N0cmR1cDIoY29uc3QgY2hhciAqcywgc2l6ZV90IGxlbiwgdXBiX2FsbG9jICphKTsKLQotVVBCX0lOTElORSBjaGFyICp1cGJfZ3N0cmR1cChjb25zdCBjaGFyICpzKSB7Ci0gIHJldHVybiB1cGJfc3RyZHVwKHMsICZ1cGJfYWxsb2NfZ2xvYmFsKTsKLX0KLQotVVBCX0lOTElORSB2b2lkIF91cGJfdmFsdWVfc2V0dmFsKHVwYl92YWx1ZSAqdiwgdWludDY0X3QgdmFsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9jdHlwZV90IGN0eXBlKSB7Ci0gIHYtPnZhbCA9IHZhbDsKLSAgU0VUX1RZUEUodi0+Y3R5cGUsIGN0eXBlKTsKLX0KLQotVVBCX0lOTElORSB1cGJfdmFsdWUgX3VwYl92YWx1ZV92YWwodWludDY0X3QgdmFsLCB1cGJfY3R5cGVfdCBjdHlwZSkgewotICB1cGJfdmFsdWUgcmV0OwotICBfdXBiX3ZhbHVlX3NldHZhbCgmcmV0LCB2YWwsIGN0eXBlKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLyogRm9yIGVhY2ggdmFsdWUgY3R5cGUsIGRlZmluZSB0aGUgZm9sbG93aW5nIHNldCBvZiBmdW5jdGlvbnM6Ci0gKgotICogLy8gR2V0L3NldCBhbiBpbnQzMiBmcm9tIGEgdXBiX3ZhbHVlLgotICogaW50MzJfdCB1cGJfdmFsdWVfZ2V0aW50MzIodXBiX3ZhbHVlIHZhbCk7Ci0gKiB2b2lkIHVwYl92YWx1ZV9zZXRpbnQzMih1cGJfdmFsdWUgKnZhbCwgaW50MzJfdCBjdmFsKTsKLSAqCi0gKiAvLyBDb25zdHJ1Y3QgYSBuZXcgdXBiX3ZhbHVlIGZyb20gYW4gaW50MzIuCi0gKiB1cGJfdmFsdWUgdXBiX3ZhbHVlX2ludDMyKGludDMyX3QgdmFsKTsgKi8KLSNkZWZpbmUgRlVOQ1MobmFtZSwgbWVtYmVybmFtZSwgdHlwZV90LCBjb252ZXJ0ZXIsIHByb3RvX3R5cGUpIFwKLSAgVVBCX0lOTElORSB2b2lkIHVwYl92YWx1ZV9zZXQgIyMgbmFtZSh1cGJfdmFsdWUgKnZhbCwgdHlwZV90IGN2YWwpIHsgXAotICAgIHZhbC0+dmFsID0gKGNvbnZlcnRlciljdmFsOyBcCi0gICAgU0VUX1RZUEUodmFsLT5jdHlwZSwgcHJvdG9fdHlwZSk7IFwKLSAgfSBcCi0gIFVQQl9JTkxJTkUgdXBiX3ZhbHVlIHVwYl92YWx1ZV8gIyMgbmFtZSh0eXBlX3QgdmFsKSB7IFwKLSAgICB1cGJfdmFsdWUgcmV0OyBcCi0gICAgdXBiX3ZhbHVlX3NldCAjIyBuYW1lKCZyZXQsIHZhbCk7IFwKLSAgICByZXR1cm4gcmV0OyBcCi0gIH0gXAotICBVUEJfSU5MSU5FIHR5cGVfdCB1cGJfdmFsdWVfZ2V0ICMjIG5hbWUodXBiX3ZhbHVlIHZhbCkgeyBcCi0gICAgYXNzZXJ0KHZhbC5jdHlwZSA9PSBwcm90b190eXBlKTsgXAotICAgIHJldHVybiAodHlwZV90KShjb252ZXJ0ZXIpdmFsLnZhbDsgXAotICB9Ci0KLUZVTkNTKGludDMyLCAgICBpbnQzMiwgICAgICAgIGludDMyX3QsICAgICAgaW50MzJfdCwgICAgVVBCX0NUWVBFX0lOVDMyKQotRlVOQ1MoaW50NjQsICAgIGludDY0LCAgICAgICAgaW50NjRfdCwgICAgICBpbnQ2NF90LCAgICBVUEJfQ1RZUEVfSU5UNjQpCi1GVU5DUyh1aW50MzIsICAgdWludDMyLCAgICAgICB1aW50MzJfdCwgICAgIHVpbnQzMl90LCAgIFVQQl9DVFlQRV9VSU5UMzIpCi1GVU5DUyh1aW50NjQsICAgdWludDY0LCAgICAgICB1aW50NjRfdCwgICAgIHVpbnQ2NF90LCAgIFVQQl9DVFlQRV9VSU5UNjQpCi1GVU5DUyhib29sLCAgICAgX2Jvb2wsICAgICAgICBib29sLCAgICAgICAgIGJvb2wsICAgICAgIFVQQl9DVFlQRV9CT09MKQotRlVOQ1MoY3N0ciwgICAgIGNzdHIsICAgICAgICAgY2hhciosICAgICAgICB1aW50cHRyX3QsICBVUEJfQ1RZUEVfQ1NUUikKLUZVTkNTKHB0ciwgICAgICBwdHIsICAgICAgICAgIHZvaWQqLCAgICAgICAgdWludHB0cl90LCAgVVBCX0NUWVBFX1BUUikKLUZVTkNTKGNvbnN0cHRyLCBjb25zdHB0ciwgICAgIGNvbnN0IHZvaWQqLCAgdWludHB0cl90LCAgVVBCX0NUWVBFX0NPTlNUUFRSKQotRlVOQ1MoZnB0ciwgICAgIGZwdHIsICAgICAgICAgdXBiX2Z1bmMqLCAgICB1aW50cHRyX3QsICBVUEJfQ1RZUEVfRlBUUikKLQotI3VuZGVmIEZVTkNTCi0jdW5kZWYgU0VUX1RZUEUKLQotCi0vKiB1cGJfdGFia2V5ICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBFaXRoZXI6Ci0gKiAgIDEuIGFuIGFjdHVhbCBpbnRlZ2VyIGtleSwgb3IKLSAqICAgMi4gYSBwb2ludGVyIHRvIGEgc3RyaW5nIHByZWZpeGVkIGJ5IGl0cyB1aW50MzJfdCBsZW5ndGgsIG93bmVkIGJ5IHVzLgotICoKLSAqIC4uLmRlcGVuZGluZyBvbiB3aGV0aGVyIHRoaXMgaXMgYSBzdHJpbmcgdGFibGUgb3IgYW4gaW50IHRhYmxlLiAgV2Ugd291bGQKLSAqIG1ha2UgdGhpcyBhIHVuaW9uIG9mIHRob3NlIHR3byB0eXBlcywgYnV0IEM4OSBkb2Vzbid0IHN1cHBvcnQgc3RhdGljYWxseQotICogaW5pdGlhbGl6aW5nIGEgbm9uLWZpcnN0IHVuaW9uIG1lbWJlci4gKi8KLXR5cGVkZWYgdWludHB0cl90IHVwYl90YWJrZXk7Ci0KLSNkZWZpbmUgVVBCX1RBQktFWV9OVU0obikgbgotI2RlZmluZSBVUEJfVEFCS0VZX05PTkUgMAotLyogVGhlIHByZXByb2Nlc3NvciBpc24ndCBxdWl0ZSBwb3dlcmZ1bCBlbm91Z2ggdG8gdHVybiB0aGUgY29tcGlsZS10aW1lIHN0cmluZwotICogbGVuZ3RoIGludG8gYSBieXRlLXdpc2Ugc3RyaW5nIHJlcHJlc2VudGF0aW9uLCBzbyBjb2RlIGdlbmVyYXRpb24gbmVlZHMgdG8KLSAqIGhlbHAgaXQgYWxvbmcuCi0gKgotICogImxlbjEiIGlzIHRoZSBsb3cgYnl0ZSBhbmQgbGVuNCBpcyB0aGUgaGlnaCBieXRlLiAqLwotI2lmZGVmIFVQQl9CSUdfRU5ESUFOCi0jZGVmaW5lIFVQQl9UQUJLRVlfU1RSKGxlbjEsIGxlbjIsIGxlbjMsIGxlbjQsIHN0cnZhbCkgXAotICAgICh1aW50cHRyX3QpKGxlbjQgbGVuMyBsZW4yIGxlbjEgc3RydmFsKQotI2Vsc2UKLSNkZWZpbmUgVVBCX1RBQktFWV9TVFIobGVuMSwgbGVuMiwgbGVuMywgbGVuNCwgc3RydmFsKSBcCi0gICAgKHVpbnRwdHJfdCkobGVuMSBsZW4yIGxlbjMgbGVuNCBzdHJ2YWwpCi0jZW5kaWYKLQotVVBCX0lOTElORSBjaGFyICp1cGJfdGFic3RyKHVwYl90YWJrZXkga2V5LCB1aW50MzJfdCAqbGVuKSB7Ci0gIGNoYXIqIG1lbSA9IChjaGFyKilrZXk7Ci0gIGlmIChsZW4pIG1lbWNweShsZW4sIG1lbSwgc2l6ZW9mKCpsZW4pKTsKLSAgcmV0dXJuIG1lbSArIHNpemVvZigqbGVuKTsKLX0KLQotCi0vKiB1cGJfdGFidmFsICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogU3RhdHVzIGluaXRpYWxpemF0aW9uIG5vdCBzdXBwb3J0ZWQuCi0gKgotICogVGhpcyBzZXBhcmF0ZSBkZWZpbml0aW9uIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIGluIEMrKywgVUlOVFBUUl9NQVggaXNuJ3QKLSAqIHJlbGlhYmx5IGF2YWlsYWJsZS4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgdWludDY0X3QgdmFsOwotfSB1cGJfdGFidmFsOwotCi0jZWxzZQotCi0vKiBDIC0tIHN1cHBvcnRzIHN0YXRpYyBpbml0aWFsaXphdGlvbiwgYnV0IHRvIHN1cHBvcnQgc3RhdGljIGluaXRpYWxpemF0aW9uIG9mCi0gKiBib3RoIGludGVnZXJzIGFuZCBwb2ludHMgZm9yIGJvdGggMzIgYW5kIDY0IGJpdCB0YXJnZXRzLCBpdCB0YWtlcyBhIGxpdHRsZQotICogYml0IG9mIGRvaW5nLiAqLwotCi0jaWYgVUlOVFBUUl9NQVggPT0gMHhmZmZmZmZmZmZmZmZmZmZmVUxMCi0jZGVmaW5lIFVQQl9QVFJfSVNfNjRCSVRTCi0jZWxpZiBVSU5UUFRSX01BWCAhPSAweGZmZmZmZmZmCi0jZXJyb3IgQ291bGQgbm90IGRldGVybWluZSBob3cgbWFueSBiaXRzIHBvaW50ZXJzIGFyZS4KLSNlbmRpZgotCi10eXBlZGVmIHVuaW9uIHsKLSAgLyogRm9yIHN0YXRpYyBpbml0aWFsaXphdGlvbi4KLSAgICoKLSAgICogVW5mb3J0dW5hdGVseSB0aGlzIHVnbGluZXNzIGlzIG5lY2Vzc2FyeSAtLSBpdCBpcyB0aGUgb25seSB3YXkgdGhhdCB3ZSBjYW4sCi0gICAqIHdpdGggLXN0ZD1jODkgLXBlZGFudGljLCBzdGF0aWNhbGx5IGluaXRpYWxpemUgdGhpcyB0byBlaXRoZXIgYSBwb2ludGVyIG9yCi0gICAqIGFuIGludGVnZXIgb24gMzItYml0IHBsYXRmb3Jtcy4gKi8KLSAgc3RydWN0IHsKLSNpZmRlZiBVUEJfUFRSX0lTXzY0QklUUwotICAgIHVpbnRwdHJfdCB2YWw7Ci0jZWxzZQotICAgIHVpbnRwdHJfdCB2YWwxOwotICAgIHVpbnRwdHJfdCB2YWwyOwotI2VuZGlmCi0gIH0gc3RhdGljaW5pdDsKLQotICAvKiBUaGUgbm9ybWFsIGFjY2Vzc29yIHRoYXQgd2UgdXNlIGZvciBldmVyeXRoaW5nIGF0IHJ1bnRpbWUuICovCi0gIHVpbnQ2NF90IHZhbDsKLX0gdXBiX3RhYnZhbDsKLQotI2lmZGVmIFVQQl9QVFJfSVNfNjRCSVRTCi0jZGVmaW5lIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCh2KSB7e3Z9fQotI2RlZmluZSBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCAge3stMX19Ci0jZWxzZQotCi0vKiAzMi1iaXQgcG9pbnRlcnMgKi8KLQotI2lmZGVmIFVQQl9CSUdfRU5ESUFOCi0jZGVmaW5lIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCh2KSB7ezAsIHZ9fQotI2RlZmluZSBVUEJfVEFCVkFMVUVfRU1QVFlfSU5JVCAge3stMSwgLTF9fQotI2Vsc2UKLSNkZWZpbmUgVVBCX1RBQlZBTFVFX0lOVF9JTklUKHYpIHt7diwgMH19Ci0jZGVmaW5lIFVQQl9UQUJWQUxVRV9FTVBUWV9JTklUICB7ey0xLCAtMX19Ci0jZW5kaWYKLQotI2VuZGlmCi0KLSNkZWZpbmUgVVBCX1RBQlZBTFVFX1BUUl9JTklUKHYpIFVQQl9UQUJWQUxVRV9JTlRfSU5JVCgodWludHB0cl90KXYpCi0KLSN1bmRlZiBVUEJfUFRSX0lTXzY0QklUUwotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLQotLyogdXBiX3RhYmxlICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiBzdHJ1Y3QgX3VwYl90YWJlbnQgewotICB1cGJfdGFia2V5IGtleTsKLSAgdXBiX3RhYnZhbCB2YWw7Ci0KLSAgLyogSW50ZXJuYWwgY2hhaW5pbmcuICBUaGlzIGlzIGNvbnN0IHNvIHdlIGNhbiBjcmVhdGUgc3RhdGljIGluaXRpYWxpemVycyBmb3IKLSAgICogdGFibGVzLiAgV2UgY2FzdCBhd2F5IGNvbnN0IHNvbWV0aW1lcywgYnV0ICpvbmx5KiB3aGVuIHRoZSBjb250YWluaW5nCi0gICAqIHVwYl90YWJsZSBpcyBrbm93biB0byBiZSBub24tY29uc3QuICBUaGlzIHJlcXVpcmVzIGEgYml0IG9mIGNhcmUsIGJ1dAotICAgKiB0aGUgc3VidGxldHkgaXMgY29uZmluZWQgdG8gdGFibGUuYy4gKi8KLSAgY29uc3Qgc3RydWN0IF91cGJfdGFiZW50ICpuZXh0OwotfSB1cGJfdGFiZW50OwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHNpemVfdCBjb3VudDsgICAgICAgICAgLyogTnVtYmVyIG9mIGVudHJpZXMgaW4gdGhlIGhhc2ggcGFydC4gKi8KLSAgc2l6ZV90IG1hc2s7ICAgICAgICAgICAvKiBNYXNrIHRvIHR1cm4gaGFzaCB2YWx1ZSAtPiBidWNrZXQuICovCi0gIHVwYl9jdHlwZV90IGN0eXBlOyAgICAgLyogVHlwZSBvZiBhbGwgdmFsdWVzLiAqLwotICB1aW50OF90IHNpemVfbGcyOyAgICAgIC8qIFNpemUgb2YgdGhlIGhhc2h0YWJsZSBwYXJ0IGlzIDJec2l6ZV9sZzIgZW50cmllcy4gKi8KLQotICAvKiBIYXNoIHRhYmxlIGVudHJpZXMuCi0gICAqIE1ha2luZyB0aGlzIGNvbnN0IGlzbid0IGVudGlyZWx5IGFjY3VyYXRlOyB3aGF0IHdlIHJlYWxseSB3YW50IGlzIGZvciBpdCB0bwotICAgKiBoYXZlIHRoZSBzYW1lIGNvbnN0LW5lc3MgYXMgdGhlIHRhYmxlIGl0J3MgaW5zaWRlLiAgQnV0IHRoZXJlJ3Mgbm8gd2F5IHRvCi0gICAqIGRlY2xhcmUgdGhhdCBpbiBDLiAgU28gd2UgaGF2ZSB0byBtYWtlIGl0IGNvbnN0IHNvIHRoYXQgd2UgY2FuIHN0YXRpY2FsbHkKLSAgICogaW5pdGlhbGl6ZSBjb25zdCBoYXNoIHRhYmxlcy4gIFRoZW4gd2UgY2FzdCBhd2F5IGNvbnN0IHdoZW4gd2UgaGF2ZSB0by4KLSAgICovCi0gIGNvbnN0IHVwYl90YWJlbnQgKmVudHJpZXM7Ci0KLSNpZm5kZWYgTkRFQlVHCi0gIC8qIFRoaXMgdGFibGUncyBhbGxvY2F0b3IuICBXZSBtYWtlIHRoZSB1c2VyIHBhc3MgaXQgaW4gdG8gZXZlcnkgcmVsZXZhbnQKLSAgICogZnVuY3Rpb24gYW5kIG9ubHkgdXNlIHRoaXMgdG8gY2hlY2sgaXQgaW4gZGVidWcgbW9kZS4gIFdlIGRvIHRoaXMgc29sZWx5Ci0gICAqIHRvIGtlZXAgdXBiX3RhYmxlIGFzIHNtYWxsIGFzIHBvc3NpYmxlLiAgVGhpcyBtaWdodCBzZWVtIHNsaWdodGx5IHBhcmFub2lkCi0gICAqIGJ1dCB0aGUgcGxhbiBpcyB0byB1c2UgdXBiX3RhYmxlIGZvciBhbGwgbWFwIGZpZWxkcyBhbmQgZXh0ZW5zaW9uIHNldHMgaW4KLSAgICogYSBmb3J0aGNvbWluZyBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLCBzbyB0aGVyZSBjb3VsZCBiZSBhIGxvdCBvZiB0aGVzZS4KLSAgICogSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgdG9vIGFubm95aW5nIGxhdGVyLCB3ZSBjYW4gY2hhbmdlIGl0IChzaW5jZSB0aGlzCi0gICAqIGlzIGFuIGludGVybmFsLW9ubHkgaGVhZGVyIGZpbGUpLiAqLwotICB1cGJfYWxsb2MgKmFsbG9jOwotI2VuZGlmCi19IHVwYl90YWJsZTsKLQotI2lmZGVmIE5ERUJVRwotIyAgZGVmaW5lIFVQQl9UQUJMRV9JTklUKGNvdW50LCBtYXNrLCBjdHlwZSwgc2l6ZV9sZzIsIGVudHJpZXMpIFwKLSAgICAge2NvdW50LCBtYXNrLCBjdHlwZSwgc2l6ZV9sZzIsIGVudHJpZXN9Ci0jZWxzZQotIyAgaWZkZWYgVVBCX0RFQlVHX1JFRlMKLS8qIEF0IHRoZSBtb21lbnQgdGhlIG9ubHkgbXV0YWJsZSB0YWJsZXMgd2Ugc3RhdGljYWxseSBpbml0aWFsaXplIGFyZSBkZWJ1ZwotICogcmVmIHRhYmxlcy4gKi8KLSMgICAgZGVmaW5lIFVQQl9UQUJMRV9JTklUKGNvdW50LCBtYXNrLCBjdHlwZSwgc2l6ZV9sZzIsIGVudHJpZXMpIFwKLSAgICAgICB7Y291bnQsIG1hc2ssIGN0eXBlLCBzaXplX2xnMiwgZW50cmllcywgJnVwYl9hbGxvY19kZWJ1Z3JlZnN9Ci0jICBlbHNlCi0jICAgIGRlZmluZSBVUEJfVEFCTEVfSU5JVChjb3VudCwgbWFzaywgY3R5cGUsIHNpemVfbGcyLCBlbnRyaWVzKSBcCi0gICAgICAge2NvdW50LCBtYXNrLCBjdHlwZSwgc2l6ZV9sZzIsIGVudHJpZXMsIE5VTEx9Ci0jICBlbmRpZgotI2VuZGlmCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgdXBiX3RhYmxlIHQ7Ci19IHVwYl9zdHJ0YWJsZTsKLQotI2RlZmluZSBVUEJfU1RSVEFCTEVfSU5JVChjb3VudCwgbWFzaywgY3R5cGUsIHNpemVfbGcyLCBlbnRyaWVzKSBcCi0gIHtVUEJfVEFCTEVfSU5JVChjb3VudCwgbWFzaywgY3R5cGUsIHNpemVfbGcyLCBlbnRyaWVzKX0KLQotI2RlZmluZSBVUEJfRU1QVFlfU1RSVEFCTEVfSU5JVChjdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVQQl9TVFJUQUJMRV9JTklUKDAsIDAsIGN0eXBlLCAwLCBOVUxMKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl90YWJsZSB0OyAgICAgICAgICAgICAgLyogRm9yIGVudHJpZXMgdGhhdCBkb24ndCBmaXQgaW4gdGhlIGFycmF5IHBhcnQuICovCi0gIGNvbnN0IHVwYl90YWJ2YWwgKmFycmF5OyAgLyogQXJyYXkgcGFydCBvZiB0aGUgdGFibGUuIFNlZSBjb25zdCBub3RlIGFib3ZlLiAqLwotICBzaXplX3QgYXJyYXlfc2l6ZTsgICAgICAgIC8qIEFycmF5IHBhcnQgc2l6ZS4gKi8KLSAgc2l6ZV90IGFycmF5X2NvdW50OyAgICAgICAvKiBBcnJheSBwYXJ0IG51bWJlciBvZiBlbGVtZW50cy4gKi8KLX0gdXBiX2ludHRhYmxlOwotCi0jZGVmaW5lIFVQQl9JTlRUQUJMRV9JTklUKGNvdW50LCBtYXNrLCBjdHlwZSwgc2l6ZV9sZzIsIGVudCwgYSwgYXNpemUsIGFjb3VudCkgXAotICB7VVBCX1RBQkxFX0lOSVQoY291bnQsIG1hc2ssIGN0eXBlLCBzaXplX2xnMiwgZW50KSwgYSwgYXNpemUsIGFjb3VudH0KLQotI2RlZmluZSBVUEJfRU1QVFlfSU5UVEFCTEVfSU5JVChjdHlwZSkgXAotICBVUEJfSU5UVEFCTEVfSU5JVCgwLCAwLCBjdHlwZSwgMCwgTlVMTCwgTlVMTCwgMCwgMCkKLQotI2RlZmluZSBVUEJfQVJSQVlfRU1QVFlFTlQgLTEKLQotVVBCX0lOTElORSBzaXplX3QgdXBiX3RhYmxlX3NpemUoY29uc3QgdXBiX3RhYmxlICp0KSB7Ci0gIGlmICh0LT5zaXplX2xnMiA9PSAwKQotICAgIHJldHVybiAwOwotICBlbHNlCi0gICAgcmV0dXJuIDEgPDwgdC0+c2l6ZV9sZzI7Ci19Ci0KLS8qIEludGVybmFsLW9ubHkgZnVuY3Rpb25zLCBpbiAuaCBmaWxlIG9ubHkgb3V0IG9mIG5lY2Vzc2l0eS4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJfdGFiZW50X2lzZW1wdHkoY29uc3QgdXBiX3RhYmVudCAqZSkgewotICByZXR1cm4gZS0+a2V5ID09IDA7Ci19Ci0KLS8qIFVzZWQgYnkgc29tZSBvZiB0aGUgdW5pdCB0ZXN0cyBmb3IgZ2VuZXJpYyBoYXNoaW5nIGZ1bmN0aW9uYWxpdHkuICovCi11aW50MzJfdCBNdXJtdXJIYXNoMihjb25zdCB2b2lkICoga2V5LCBzaXplX3QgbGVuLCB1aW50MzJfdCBzZWVkKTsKLQotVVBCX0lOTElORSB1aW50cHRyX3QgdXBiX2ludGtleSh1aW50cHRyX3Qga2V5KSB7Ci0gIHJldHVybiBrZXk7Ci19Ci0KLVVQQl9JTkxJTkUgdWludDMyX3QgdXBiX2ludGhhc2godWludHB0cl90IGtleSkgewotICByZXR1cm4gKHVpbnQzMl90KWtleTsKLX0KLQotc3RhdGljIGNvbnN0IHVwYl90YWJlbnQgKnVwYl9nZXRlbnRyeShjb25zdCB1cGJfdGFibGUgKnQsIHVpbnQzMl90IGhhc2gpIHsKLSAgcmV0dXJuIHQtPmVudHJpZXMgKyAoaGFzaCAmIHQtPm1hc2spOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX2Fycmhhcyh1cGJfdGFidmFsIGtleSkgewotICByZXR1cm4ga2V5LnZhbCAhPSAodWludDY0X3QpLTE7Ci19Ci0KLS8qIEluaXRpYWxpemUgYW5kIHVuaW5pdGlhbGl6ZSBhIHRhYmxlLCByZXNwZWN0aXZlbHkuICBJZiBtZW1vcnkgYWxsb2NhdGlvbgotICogZmFpbGVkLCBmYWxzZSBpcyByZXR1cm5lZCB0aGF0IHRoZSB0YWJsZSBpcyB1bmluaXRpYWxpemVkLiAqLwotYm9vbCB1cGJfaW50dGFibGVfaW5pdDIodXBiX2ludHRhYmxlICp0YWJsZSwgdXBiX2N0eXBlX3QgY3R5cGUsIHVwYl9hbGxvYyAqYSk7Ci1ib29sIHVwYl9zdHJ0YWJsZV9pbml0Mih1cGJfc3RydGFibGUgKnRhYmxlLCB1cGJfY3R5cGVfdCBjdHlwZSwgdXBiX2FsbG9jICphKTsKLXZvaWQgdXBiX2ludHRhYmxlX3VuaW5pdDIodXBiX2ludHRhYmxlICp0YWJsZSwgdXBiX2FsbG9jICphKTsKLXZvaWQgdXBiX3N0cnRhYmxlX3VuaW5pdDIodXBiX3N0cnRhYmxlICp0YWJsZSwgdXBiX2FsbG9jICphKTsKLQotVVBCX0lOTElORSBib29sIHVwYl9pbnR0YWJsZV9pbml0KHVwYl9pbnR0YWJsZSAqdGFibGUsIHVwYl9jdHlwZV90IGN0eXBlKSB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfaW5pdDIodGFibGUsIGN0eXBlLCAmdXBiX2FsbG9jX2dsb2JhbCk7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc3RydGFibGVfaW5pdCh1cGJfc3RydGFibGUgKnRhYmxlLCB1cGJfY3R5cGVfdCBjdHlwZSkgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2luaXQyKHRhYmxlLCBjdHlwZSwgJnVwYl9hbGxvY19nbG9iYWwpOwotfQotCi1VUEJfSU5MSU5FIHZvaWQgdXBiX2ludHRhYmxlX3VuaW5pdCh1cGJfaW50dGFibGUgKnRhYmxlKSB7Ci0gIHVwYl9pbnR0YWJsZV91bmluaXQyKHRhYmxlLCAmdXBiX2FsbG9jX2dsb2JhbCk7Ci19Ci0KLVVQQl9JTkxJTkUgdm9pZCB1cGJfc3RydGFibGVfdW5pbml0KHVwYl9zdHJ0YWJsZSAqdGFibGUpIHsKLSAgdXBiX3N0cnRhYmxlX3VuaW5pdDIodGFibGUsICZ1cGJfYWxsb2NfZ2xvYmFsKTsKLX0KLQotLyogUmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgdGFibGUuICovCi1zaXplX3QgdXBiX2ludHRhYmxlX2NvdW50KGNvbnN0IHVwYl9pbnR0YWJsZSAqdCk7Ci1VUEJfSU5MSU5FIHNpemVfdCB1cGJfc3RydGFibGVfY291bnQoY29uc3QgdXBiX3N0cnRhYmxlICp0KSB7Ci0gIHJldHVybiB0LT50LmNvdW50OwotfQotCi0vKiBJbnNlcnRzIHRoZSBnaXZlbiBrZXkgaW50byB0aGUgaGFzaHRhYmxlIHdpdGggdGhlIGdpdmVuIHZhbHVlLiAgVGhlIGtleSBtdXN0Ci0gKiBub3QgYWxyZWFkeSBleGlzdCBpbiB0aGUgaGFzaCB0YWJsZS4gIEZvciBzdHJpbmcgdGFibGVzLCB0aGUga2V5IG11c3QgYmUKLSAqIE5VTEwtdGVybWluYXRlZCwgYW5kIHRoZSB0YWJsZSB3aWxsIG1ha2UgYW4gaW50ZXJuYWwgY29weSBvZiB0aGUga2V5LgotICogSW50dGFibGVzIG11c3Qgbm90IGluc2VydCBhIHZhbHVlIG9mIFVJTlRQVFJfTUFYLgotICoKLSAqIElmIGEgdGFibGUgcmVzaXplIHdhcyByZXF1aXJlZCBidXQgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLCBmYWxzZSBpcwotICogcmV0dXJuZWQgYW5kIHRoZSB0YWJsZSBpcyB1bmNoYW5nZWQuICovCi1ib29sIHVwYl9pbnR0YWJsZV9pbnNlcnQyKHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSwgdXBiX3ZhbHVlIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2FsbG9jICphKTsKLWJvb2wgdXBiX3N0cnRhYmxlX2luc2VydDModXBiX3N0cnRhYmxlICp0LCBjb25zdCBjaGFyICprZXksIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSB2YWwsIHVwYl9hbGxvYyAqYSk7Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfaW50dGFibGVfaW5zZXJ0KHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSB2YWwpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9pbnNlcnQyKHQsIGtleSwgdmFsLCAmdXBiX2FsbG9jX2dsb2JhbCk7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc3RydGFibGVfaW5zZXJ0Mih1cGJfc3RydGFibGUgKnQsIGNvbnN0IGNoYXIgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCB1cGJfdmFsdWUgdmFsKSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfaW5zZXJ0Myh0LCBrZXksIGxlbiwgdmFsLCAmdXBiX2FsbG9jX2dsb2JhbCk7Ci19Ci0KLS8qIEZvciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc3RydGFibGVfaW5zZXJ0KHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlIHZhbCkgewotICByZXR1cm4gdXBiX3N0cnRhYmxlX2luc2VydDIodCwga2V5LCBzdHJsZW4oa2V5KSwgdmFsKTsKLX0KLQotLyogTG9va3MgdXAga2V5IGluIHRoaXMgdGFibGUsIHJldHVybmluZyAidHJ1ZSIgaWYgdGhlIGtleSB3YXMgZm91bmQuCi0gKiBJZiB2IGlzIG5vbi1OVUxMLCBjb3BpZXMgdGhlIHZhbHVlIGZvciB0aGlzIGtleSBpbnRvICp2LiAqLwotYm9vbCB1cGJfaW50dGFibGVfbG9va3VwKGNvbnN0IHVwYl9pbnR0YWJsZSAqdCwgdWludHB0cl90IGtleSwgdXBiX3ZhbHVlICp2KTsKLWJvb2wgdXBiX3N0cnRhYmxlX2xvb2t1cDIoY29uc3QgdXBiX3N0cnRhYmxlICp0LCBjb25zdCBjaGFyICprZXksIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSAqdik7Ci0KLS8qIEZvciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc3RydGFibGVfbG9va3VwKGNvbnN0IHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlICp2KSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfbG9va3VwMih0LCBrZXksIHN0cmxlbihrZXkpLCB2KTsKLX0KLQotLyogUmVtb3ZlcyBhbiBpdGVtIGZyb20gdGhlIHRhYmxlLiAgUmV0dXJucyB0cnVlIGlmIHRoZSByZW1vdmUgd2FzIHN1Y2Nlc3NmdWwsCi0gKiBhbmQgc3RvcmVzIHRoZSByZW1vdmVkIGl0ZW0gaW4gKnZhbCBpZiBub24tTlVMTC4gKi8KLWJvb2wgdXBiX2ludHRhYmxlX3JlbW92ZSh1cGJfaW50dGFibGUgKnQsIHVpbnRwdHJfdCBrZXksIHVwYl92YWx1ZSAqdmFsKTsKLWJvb2wgdXBiX3N0cnRhYmxlX3JlbW92ZTModXBiX3N0cnRhYmxlICp0LCBjb25zdCBjaGFyICprZXksIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSAqdmFsLCB1cGJfYWxsb2MgKmFsbG9jKTsKLQotVVBCX0lOTElORSBib29sIHVwYl9zdHJ0YWJsZV9yZW1vdmUyKHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4sIHVwYl92YWx1ZSAqdmFsKSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfcmVtb3ZlMyh0LCBrZXksIGxlbiwgdmFsLCAmdXBiX2FsbG9jX2dsb2JhbCk7Ci19Ci0KLS8qIEZvciBOVUxMLXRlcm1pbmF0ZWQgc3RyaW5ncy4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc3RydGFibGVfcmVtb3ZlKHVwYl9zdHJ0YWJsZSAqdCwgY29uc3QgY2hhciAqa2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3ZhbHVlICp2KSB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfcmVtb3ZlMih0LCBrZXksIHN0cmxlbihrZXkpLCB2KTsKLX0KLQotLyogVXBkYXRlcyBhbiBleGlzdGluZyBlbnRyeSBpbiBhbiBpbnR0YWJsZS4gIElmIHRoZSBlbnRyeSBkb2VzIG5vdCBleGlzdCwKLSAqIHJldHVybnMgZmFsc2UgYW5kIGRvZXMgbm90aGluZy4gIFVubGlrZSBpbnNlcnQvcmVtb3ZlLCB0aGlzIGRvZXMgbm90Ci0gKiBpbnZhbGlkYXRlIGl0ZXJhdG9ycy4gKi8KLWJvb2wgdXBiX2ludHRhYmxlX3JlcGxhY2UodXBiX2ludHRhYmxlICp0LCB1aW50cHRyX3Qga2V5LCB1cGJfdmFsdWUgdmFsKTsKLQotLyogSGFuZHkgcm91dGluZXMgZm9yIHRyZWF0aW5nIGFuIGludHRhYmxlIGxpa2UgYSBzdGFjay4gIE1heSBub3QgYmUgbWl4ZWQgd2l0aAotICogb3RoZXIgaW5zZXJ0L3JlbW92ZSBjYWxscy4gKi8KLWJvb2wgdXBiX2ludHRhYmxlX3B1c2gyKHVwYl9pbnR0YWJsZSAqdCwgdXBiX3ZhbHVlIHZhbCwgdXBiX2FsbG9jICphKTsKLXVwYl92YWx1ZSB1cGJfaW50dGFibGVfcG9wKHVwYl9pbnR0YWJsZSAqdCk7Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfaW50dGFibGVfcHVzaCh1cGJfaW50dGFibGUgKnQsIHVwYl92YWx1ZSB2YWwpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9wdXNoMih0LCB2YWwsICZ1cGJfYWxsb2NfZ2xvYmFsKTsKLX0KLQotLyogQ29udmVuaWVuY2Ugcm91dGluZXMgZm9yIGludHRhYmxlcyB3aXRoIHBvaW50ZXIga2V5cy4gKi8KLWJvb2wgdXBiX2ludHRhYmxlX2luc2VydHB0cjIodXBiX2ludHRhYmxlICp0LCBjb25zdCB2b2lkICprZXksIHVwYl92YWx1ZSB2YWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9hbGxvYyAqYSk7Ci1ib29sIHVwYl9pbnR0YWJsZV9yZW1vdmVwdHIodXBiX2ludHRhYmxlICp0LCBjb25zdCB2b2lkICprZXksIHVwYl92YWx1ZSAqdmFsKTsKLWJvb2wgdXBiX2ludHRhYmxlX2xvb2t1cHB0cigKLSAgICBjb25zdCB1cGJfaW50dGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwgdXBiX3ZhbHVlICp2YWwpOwotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX2ludHRhYmxlX2luc2VydHB0cih1cGJfaW50dGFibGUgKnQsIGNvbnN0IHZvaWQgKmtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl92YWx1ZSB2YWwpIHsKLSAgcmV0dXJuIHVwYl9pbnR0YWJsZV9pbnNlcnRwdHIyKHQsIGtleSwgdmFsLCAmdXBiX2FsbG9jX2dsb2JhbCk7Ci19Ci0KLS8qIE9wdGltaXplcyB0aGUgdGFibGUgZm9yIHRoZSBjdXJyZW50IHNldCBvZiBlbnRyaWVzLCBmb3IgYm90aCBtZW1vcnkgdXNlIGFuZAotICogbG9va3VwIHRpbWUuICBDbGllbnQgc2hvdWxkIGNhbGwgdGhpcyBhZnRlciBhbGwgZW50cmllcyBoYXZlIGJlZW4gaW5zZXJ0ZWQ7Ci0gKiBpbnNlcnRpbmcgbW9yZSBlbnRyaWVzIGlzIGxlZ2FsLCBidXQgd2lsbCBsaWtlbHkgcmVxdWlyZSBhIHRhYmxlIHJlc2l6ZS4gKi8KLXZvaWQgdXBiX2ludHRhYmxlX2NvbXBhY3QyKHVwYl9pbnR0YWJsZSAqdCwgdXBiX2FsbG9jICphKTsKLQotVVBCX0lOTElORSB2b2lkIHVwYl9pbnR0YWJsZV9jb21wYWN0KHVwYl9pbnR0YWJsZSAqdCkgewotICB1cGJfaW50dGFibGVfY29tcGFjdDIodCwgJnVwYl9hbGxvY19nbG9iYWwpOwotfQotCi0vKiBBIHNwZWNpYWwtY2FzZSBpbmxpbmFibGUgdmVyc2lvbiBvZiB0aGUgbG9va3VwIHJvdXRpbmUgZm9yIDMyLWJpdAotICogaW50ZWdlcnMuICovCi1VUEJfSU5MSU5FIGJvb2wgdXBiX2ludHRhYmxlX2xvb2t1cDMyKGNvbnN0IHVwYl9pbnR0YWJsZSAqdCwgdWludDMyX3Qga2V5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfdmFsdWUgKnYpIHsKLSAgKnYgPSB1cGJfdmFsdWVfaW50MzIoMCk7ICAvKiBTaWxlbmNlIGNvbXBpbGVyIHdhcm5pbmdzLiAqLwotICBpZiAoa2V5IDwgdC0+YXJyYXlfc2l6ZSkgewotICAgIHVwYl90YWJ2YWwgYXJydmFsID0gdC0+YXJyYXlba2V5XTsKLSAgICBpZiAodXBiX2FycmhhcyhhcnJ2YWwpKSB7Ci0gICAgICBfdXBiX3ZhbHVlX3NldHZhbCh2LCBhcnJ2YWwudmFsLCB0LT50LmN0eXBlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvbnN0IHVwYl90YWJlbnQgKmU7Ci0gICAgaWYgKHQtPnQuZW50cmllcyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gICAgZm9yIChlID0gdXBiX2dldGVudHJ5KCZ0LT50LCB1cGJfaW50aGFzaChrZXkpKTsgdHJ1ZTsgZSA9IGUtPm5leHQpIHsKLSAgICAgIGlmICgodWludDMyX3QpZS0+a2V5ID09IGtleSkgewotICAgICAgICBfdXBiX3ZhbHVlX3NldHZhbCh2LCBlLT52YWwudmFsLCB0LT50LmN0eXBlKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgICBpZiAoZS0+bmV4dCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLS8qIEV4cG9zZWQgZm9yIHRlc3Rpbmcgb25seS4gKi8KLWJvb2wgdXBiX3N0cnRhYmxlX3Jlc2l6ZSh1cGJfc3RydGFibGUgKnQsIHNpemVfdCBzaXplX2xnMiwgdXBiX2FsbG9jICphKTsKLQotLyogSXRlcmF0b3JzICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSXRlcmF0b3JzIGZvciBpbnQgYW5kIHN0cmluZyB0YWJsZXMuICBXZSBhcmUgc3ViamVjdCB0byBzb21lIGtpbmQgb2YgdW51c3VhbAotICogZGVzaWduIGNvbnN0cmFpbnRzOgotICoKLSAqIEZvciBoaWdoLWxldmVsIGxhbmd1YWdlczoKLSAqICAtIHdlIG11c3QgYmUgYWJsZSB0byBndWFyYW50ZWUgdGhhdCB3ZSBkb24ndCBjcmFzaCBvciBjb3JydXB0IG1lbW9yeSBldmVuIGlmCi0gKiAgICB0aGUgcHJvZ3JhbSBhY2Nlc3NlcyBhbiBpbnZhbGlkYXRlZCBpdGVyYXRvci4KLSAqCi0gKiBGb3IgQysrMTEgcmFuZ2UtYmFzZWQgZm9yOgotICogIC0gaXRlcmF0b3JzIG11c3QgYmUgY29weWFibGUKLSAqICAtIGl0ZXJhdG9ycyBtdXN0IGJlIGNvbXBhcmFibGUKLSAqICAtIGl0IG11c3QgYmUgcG9zc2libGUgdG8gY29uc3RydWN0IGFuICJlbmQiIHZhbHVlLgotICoKLSAqIEl0ZXJhdGlvbiBvcmRlciBpcyB1bmRlZmluZWQuCi0gKgotICogTW9kaWZ5aW5nIHRoZSB0YWJsZSBpbnZhbGlkYXRlcyBpdGVyYXRvcnMuICB1cGJfe3N0cixpbnR9dGFibGVfZG9uZSgpIGlzCi0gKiBndWFyYW50ZWVkIHRvIHdvcmsgZXZlbiBvbiBhbiBpbnZhbGlkYXRlZCBpdGVyYXRvciwgYXMgbG9uZyBhcyB0aGUgdGFibGUgaXQKLSAqIGlzIGl0ZXJhdGluZyBvdmVyIGhhcyBub3QgYmVlbiBmcmVlZC4gIENhbGxpbmcgbmV4dCgpIG9yIGFjY2Vzc2luZyBkYXRhIGZyb20KLSAqIGFuIGludmFsaWRhdGVkIGl0ZXJhdG9yIHlpZWxkcyB1bnNwZWNpZmllZCBlbGVtZW50cyBmcm9tIHRoZSB0YWJsZSwgYnV0IGl0IGlzCi0gKiBndWFyYW50ZWVkIG5vdCB0byBjcmFzaCBhbmQgdG8gcmV0dXJuIHJlYWwgdGFibGUgZWxlbWVudHMgKGV4Y2VwdCB3aGVuIGRvbmUoKQotICogaXMgdHJ1ZSkuICovCi0KLQotLyogdXBiX3N0cnRhYmxlX2l0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICB1cGJfc3RydGFibGVfaXRlciBpOwotICogICB1cGJfc3RydGFibGVfYmVnaW4oJmksIHQpOwotICogICBmb3IoOyAhdXBiX3N0cnRhYmxlX2RvbmUoJmkpOyB1cGJfc3RydGFibGVfbmV4dCgmaSkpIHsKLSAqICAgICBjb25zdCBjaGFyICprZXkgPSB1cGJfc3RydGFibGVfaXRlcl9rZXkoJmkpOwotICogICAgIGNvbnN0IHVwYl92YWx1ZSB2YWwgPSB1cGJfc3RydGFibGVfaXRlcl92YWx1ZSgmaSk7Ci0gKiAgICAgLy8gLi4uCi0gKiAgIH0KLSAqLwotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IHVwYl9zdHJ0YWJsZSAqdDsKLSAgc2l6ZV90IGluZGV4OwotfSB1cGJfc3RydGFibGVfaXRlcjsKLQotdm9pZCB1cGJfc3RydGFibGVfYmVnaW4odXBiX3N0cnRhYmxlX2l0ZXIgKmksIGNvbnN0IHVwYl9zdHJ0YWJsZSAqdCk7Ci12b2lkIHVwYl9zdHJ0YWJsZV9uZXh0KHVwYl9zdHJ0YWJsZV9pdGVyICppKTsKLWJvb2wgdXBiX3N0cnRhYmxlX2RvbmUoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkpOwotY29uc3QgY2hhciAqdXBiX3N0cnRhYmxlX2l0ZXJfa2V5KGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKTsKLXNpemVfdCB1cGJfc3RydGFibGVfaXRlcl9rZXlsZW5ndGgoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkpOwotdXBiX3ZhbHVlIHVwYl9zdHJ0YWJsZV9pdGVyX3ZhbHVlKGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppKTsKLXZvaWQgdXBiX3N0cnRhYmxlX2l0ZXJfc2V0ZG9uZSh1cGJfc3RydGFibGVfaXRlciAqaSk7Ci1ib29sIHVwYl9zdHJ0YWJsZV9pdGVyX2lzZXF1YWwoY29uc3QgdXBiX3N0cnRhYmxlX2l0ZXIgKmkxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9zdHJ0YWJsZV9pdGVyICppMik7Ci0KLQotLyogdXBiX2ludHRhYmxlX2l0ZXIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogICB1cGJfaW50dGFibGVfaXRlciBpOwotICogICB1cGJfaW50dGFibGVfYmVnaW4oJmksIHQpOwotICogICBmb3IoOyAhdXBiX2ludHRhYmxlX2RvbmUoJmkpOyB1cGJfaW50dGFibGVfbmV4dCgmaSkpIHsKLSAqICAgICB1aW50cHRyX3Qga2V5ID0gdXBiX2ludHRhYmxlX2l0ZXJfa2V5KCZpKTsKLSAqICAgICB1cGJfdmFsdWUgdmFsID0gdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoJmkpOwotICogICAgIC8vIC4uLgotICogICB9Ci0gKi8KLQotdHlwZWRlZiBzdHJ1Y3QgewotICBjb25zdCB1cGJfaW50dGFibGUgKnQ7Ci0gIHNpemVfdCBpbmRleDsKLSAgYm9vbCBhcnJheV9wYXJ0OwotfSB1cGJfaW50dGFibGVfaXRlcjsKLQotdm9pZCB1cGJfaW50dGFibGVfYmVnaW4odXBiX2ludHRhYmxlX2l0ZXIgKmksIGNvbnN0IHVwYl9pbnR0YWJsZSAqdCk7Ci12b2lkIHVwYl9pbnR0YWJsZV9uZXh0KHVwYl9pbnR0YWJsZV9pdGVyICppKTsKLWJvb2wgdXBiX2ludHRhYmxlX2RvbmUoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpOwotdWludHB0cl90IHVwYl9pbnR0YWJsZV9pdGVyX2tleShjb25zdCB1cGJfaW50dGFibGVfaXRlciAqaSk7Ci11cGJfdmFsdWUgdXBiX2ludHRhYmxlX2l0ZXJfdmFsdWUoY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkpOwotdm9pZCB1cGJfaW50dGFibGVfaXRlcl9zZXRkb25lKHVwYl9pbnR0YWJsZV9pdGVyICppKTsKLWJvb2wgdXBiX2ludHRhYmxlX2l0ZXJfaXNlcXVhbChjb25zdCB1cGJfaW50dGFibGVfaXRlciAqaTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ludHRhYmxlX2l0ZXIgKmkyKTsKLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLX0gIC8qIGV4dGVybiAiQyIgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9UQUJMRV9IXyAqLwotCi0vKiBSZWZlcmVuY2UgdHJhY2tpbmcgd2lsbCBjaGVjayByZWYoKS91bnJlZigpIG9wZXJhdGlvbnMgdG8gbWFrZSBzdXJlIHRoZQotICogcmVmIG93bmVyc2hpcCBpcyBjb3JyZWN0LiAgV2hlcmUgcG9zc2libGUgaXQgd2lsbCBhbHNvIG1ha2UgdG9vbHMgbGlrZQotICogVmFsZ3JpbmQgYXR0cmlidXRlIHJlZiBsZWFrcyB0byB0aGUgY29kZSB0aGF0IHRvb2sgdGhlIGxlYWtlZCByZWYsIG5vdAotICogdGhlIGNvZGUgdGhhdCBvcmlnaW5hbGx5IGNyZWF0ZWQgdGhlIG9iamVjdC4KLSAqCi0gKiBFbmFibGluZyB0aGlzIHJlcXVpcmVzIHRoZSBhcHBsaWNhdGlvbiB0byBkZWZpbmUgdXBiX2xvY2soKS91cGJfdW5sb2NrKCkKLSAqIGZ1bmN0aW9ucyB0aGF0IGFjcXVpcmUvcmVsZWFzZSBhIGdsb2JhbCBtdXRleCAob3IgI2RlZmluZSBVUEJfVEhSRUFEX1VOU0FGRSkuCi0gKiBGb3IgdGhpcyByZWFzb24gd2UgZG9uJ3QgZW5hYmxlIGl0IGJ5IGRlZmF1bHQsIGV2ZW4gaW4gZGVidWcgYnVpbGRzLgotICovCi0KLS8qICNkZWZpbmUgVVBCX0RFQlVHX1JFRlMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgdXBiIHsKLWNsYXNzIFJlZkNvdW50ZWQ7Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gY2xhc3MgcmVmZmVkX3B0cjsKLX0KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6UmVmQ291bnRlZCwgdXBiX3JlZmNvdW50ZWQpCi0KLXN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotY2xhc3MgdXBiOjpSZWZDb3VudGVkIHsKLSBwdWJsaWM6Ci0gIC8qIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGZyb3plbi4gKi8KLSAgYm9vbCBJc0Zyb3plbigpIGNvbnN0OwotCi0gIC8qIEluY3JlYXNlcyB0aGUgcmVmIGNvdW50LCB0aGUgbmV3IHJlZiBpcyBvd25lZCBieSAib3duZXIiIHdoaWNoIG11c3Qgbm90Ci0gICAqIGFscmVhZHkgb3duIGEgcmVmIChhbmQgc2hvdWxkIG5vdCBpdHNlbGYgYmUgYSByZWZjb3VudGVkIG9iamVjdCBpZiB0aGUgcmVmCi0gICAqIGNvdWxkIHBvc3NpYmx5IGJlIGNpcmN1bGFyOyBzZWUgYmVsb3cpLgotICAgKiBUaHJlYWQtc2FmZSBpZmYgInRoaXMiIGlzIGZyb3plbi4gKi8KLSAgdm9pZCBSZWYoY29uc3Qgdm9pZCAqb3duZXIpIGNvbnN0OwotCi0gIC8qIFJlbGVhc2UgYSByZWYgdGhhdCB3YXMgYWNxdWlyZWQgZnJvbSB1cGJfcmVmY291bnRlZF9yZWYoKSBhbmQgY29sbGVjdHMgYW55Ci0gICAqIG9iamVjdHMgaXQgY2FuLiAqLwotICB2b2lkIFVucmVmKGNvbnN0IHZvaWQgKm93bmVyKSBjb25zdDsKLQotICAvKiBNb3ZlcyBhbiBleGlzdGluZyByZWYgZnJvbSAiZnJvbSIgdG8gInRvIiwgd2l0aG91dCBjaGFuZ2luZyB0aGUgb3ZlcmFsbAotICAgKiByZWYgY291bnQuICBEb25hdGVSZWYoZm9vLCBOVUxMLCBvd25lcikgaXMgdGhlIHNhbWUgYXMgUmVmKGZvbywgb3duZXIpLAotICAgKiBidXQgInRvIiBtYXkgbm90IGJlIE5VTEwuICovCi0gIHZvaWQgRG9uYXRlUmVmKGNvbnN0IHZvaWQgKmZyb20sIGNvbnN0IHZvaWQgKnRvKSBjb25zdDsKLQotICAvKiBWZXJpZmllcyB0aGF0IGEgcmVmIHRvIHRoZSBnaXZlbiBvYmplY3QgaXMgY3VycmVudGx5IGhlbGQgYnkgdGhlIGdpdmVuCi0gICAqIG93bmVyLiAgT25seSBlZmZlY3RpdmUgaW4gVVBCX0RFQlVHX1JFRlMgYnVpbGRzLiAqLwotICB2b2lkIENoZWNrUmVmKGNvbnN0IHZvaWQgKm93bmVyKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKFJlZkNvdW50ZWQsIHVwYjo6UmVmQ291bnRlZCkKLSNlbHNlCi1zdHJ1Y3QgdXBiX3JlZmNvdW50ZWQgewotI2VuZGlmCi0gIC8qIFRPRE8oaGFiZXJtYW4pOiBtb3ZlIHRoZSBhY3R1YWwgc3RydWN0dXJlIGRlZmluaXRpb24gdG8gc3RydWN0ZGVmcy5pbnQuaC4KLSAgICogVGhlIG9ubHkgcmVhc29uIHRoZXkgYXJlIGhlcmUgaXMgYmVjYXVzZSBpbmxpbmUgZnVuY3Rpb25zIG5lZWQgdG8gc2VlIHRoZQotICAgKiBkZWZpbml0aW9uIG9mIHVwYl9oYW5kbGVycywgd2hpY2ggbmVlZHMgdG8gc2VlIHRoaXMgZGVmaW5pdGlvbi4gIEJ1dCB3ZQotICAgKiBjYW4gY2hhbmdlIHRoZSB1cGJfaGFuZGxlcnMgaW5saW5lIGZ1bmN0aW9ucyB0byBkZWFsIGluIHJhdyBvZmZzZXRzCi0gICAqIGluc3RlYWQuCi0gICAqLwotCi0gIC8qIEEgc2luZ2xlIHJlZmVyZW5jZSBjb3VudCBzaGFyZWQgYnkgYWxsIG9iamVjdHMgaW4gdGhlIGdyb3VwLiAqLwotICB1aW50MzJfdCAqZ3JvdXA7Ci0KLSAgLyogQSBzaW5nbHktbGlua2VkIGxpc3Qgb2YgYWxsIG9iamVjdHMgaW4gdGhlIGdyb3VwLiAqLwotICB1cGJfcmVmY291bnRlZCAqbmV4dDsKLQotICAvKiBUYWJsZSBvZiBmdW5jdGlvbiBwb2ludGVycyBmb3IgdGhpcyB0eXBlLiAqLwotICBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCAqdnRibDsKLQotICAvKiBNYWludGFpbmVkIG9ubHkgd2hlbiBtdXRhYmxlLCB0aGlzIHRyYWNrcyB0aGUgbnVtYmVyIG9mIHJlZnMgKGJ1dCBub3QKLSAgICogcmVmMidzKSB0byB0aGlzIG9iamVjdC4gICpncm91cCBzaG91bGQgYmUgdGhlIHN1bSBvZiBhbGwgaW5kaXZpZHVhbF9jb3VudAotICAgKiBpbiB0aGUgZ3JvdXAuICovCi0gIHVpbnQzMl90IGluZGl2aWR1YWxfY291bnQ7Ci0KLSAgYm9vbCBpc19mcm96ZW47Ci0KLSNpZmRlZiBVUEJfREVCVUdfUkVGUwotICB1cGJfaW50dGFibGUgKnJlZnM7ICAvKiBNYXBzIG93bmVyIC0+IHRyYWNrZWRyZWYgZm9yIGluY29taW5nIHJlZnMuICovCi0gIHVwYl9pbnR0YWJsZSAqcmVmMnM7IC8qIFNldCBvZiB0YXJnZXRzIGZvciBvdXRnb2luZyByZWYycy4gKi8KLSNlbmRpZgotfTsKLQotI2lmZGVmIFVQQl9ERUJVR19SRUZTCi1leHRlcm4gdXBiX2FsbG9jIHVwYl9hbGxvY19kZWJ1Z3JlZnM7Ci0jZGVmaW5lIFVQQl9SRUZDT1VOVF9JTklUKHZ0YmwsIHJlZnMsIHJlZjJzKSBcCi0gICAgeyZzdGF0aWNfcmVmY291bnQsIE5VTEwsIHZ0YmwsIDAsIHRydWUsIHJlZnMsIHJlZjJzfQotI2Vsc2UKLSNkZWZpbmUgVVBCX1JFRkNPVU5UX0lOSVQodnRibCwgcmVmcywgcmVmMnMpIFwKLSAgICB7JnN0YXRpY19yZWZjb3VudCwgTlVMTCwgdnRibCwgMCwgdHJ1ZX0KLSNlbmRpZgotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogSXQgaXMgYmV0dGVyIHRvIHVzZSB0cmFja2VkIHJlZnMgd2hlbiBwb3NzaWJsZSwgZm9yIHRoZSBleHRyYSBkZWJ1Z2dpbmcKLSAqIGNhcGFiaWxpdHkuICBCdXQgaWYgdGhpcyBpcyBub3QgcG9zc2libGUgKGJlY2F1c2UgeW91IGRvbid0IGhhdmUgZWFzeSBhY2Nlc3MKLSAqIHRvIGEgc3RhYmxlIHBvaW50ZXIgdmFsdWUgdGhhdCBpcyBhc3NvY2lhdGVkIHdpdGggdGhlIHJlZiksIHlvdSBjYW4gcGFzcwotICogVVBCX1VOVFJBQ0tFRF9SRUYgaW5zdGVhZC4gICovCi1leHRlcm4gY29uc3Qgdm9pZCAqVVBCX1VOVFJBQ0tFRF9SRUY7Ci0KLS8qIE5hdGl2ZSBDIEFQSS4gKi8KLWJvb2wgdXBiX3JlZmNvdW50ZWRfaXNmcm96ZW4oY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIpOwotdm9pZCB1cGJfcmVmY291bnRlZF9yZWYoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyKTsKLXZvaWQgdXBiX3JlZmNvdW50ZWRfdW5yZWYoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIGNvbnN0IHZvaWQgKm93bmVyKTsKLXZvaWQgdXBiX3JlZmNvdW50ZWRfZG9uYXRlcmVmKAotICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpmcm9tLCBjb25zdCB2b2lkICp0byk7Ci12b2lkIHVwYl9yZWZjb3VudGVkX2NoZWNrcmVmKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCBjb25zdCB2b2lkICpvd25lcik7Ci0KLSNkZWZpbmUgVVBCX1JFRkNPVU5URURfQ01FVEhPRFModHlwZSwgdXBjYXN0ZnVuYykgXAotICBVUEJfSU5MSU5FIGJvb2wgdHlwZSAjIyBfaXNmcm96ZW4oY29uc3QgdHlwZSAqdikgeyBcCi0gICAgcmV0dXJuIHVwYl9yZWZjb3VudGVkX2lzZnJvemVuKHVwY2FzdGZ1bmModikpOyBcCi0gIH0gXAotICBVUEJfSU5MSU5FIHZvaWQgdHlwZSAjIyBfcmVmKGNvbnN0IHR5cGUgKnYsIGNvbnN0IHZvaWQgKm93bmVyKSB7IFwKLSAgICB1cGJfcmVmY291bnRlZF9yZWYodXBjYXN0ZnVuYyh2KSwgb3duZXIpOyBcCi0gIH0gXAotICBVUEJfSU5MSU5FIHZvaWQgdHlwZSAjIyBfdW5yZWYoY29uc3QgdHlwZSAqdiwgY29uc3Qgdm9pZCAqb3duZXIpIHsgXAotICAgIHVwYl9yZWZjb3VudGVkX3VucmVmKHVwY2FzdGZ1bmModiksIG93bmVyKTsgXAotICB9IFwKLSAgVVBCX0lOTElORSB2b2lkIHR5cGUgIyMgX2RvbmF0ZXJlZihjb25zdCB0eXBlICp2LCBjb25zdCB2b2lkICpmcm9tLCBjb25zdCB2b2lkICp0bykgeyBcCi0gICAgdXBiX3JlZmNvdW50ZWRfZG9uYXRlcmVmKHVwY2FzdGZ1bmModiksIGZyb20sIHRvKTsgXAotICB9IFwKLSAgVVBCX0lOTElORSB2b2lkIHR5cGUgIyMgX2NoZWNrcmVmKGNvbnN0IHR5cGUgKnYsIGNvbnN0IHZvaWQgKm93bmVyKSB7IFwKLSAgICB1cGJfcmVmY291bnRlZF9jaGVja3JlZih1cGNhc3RmdW5jKHYpLCBvd25lcik7IFwKLSAgfQotCi0jZGVmaW5lIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMgXAotICBib29sIElzRnJvemVuKCkgY29uc3QgeyBcCi0gICAgcmV0dXJuIHVwYjo6dXBjYXN0X3RvPGNvbnN0IHVwYjo6UmVmQ291bnRlZD4odGhpcyktPklzRnJvemVuKCk7IFwKLSAgfSBcCi0gIHZvaWQgUmVmKGNvbnN0IHZvaWQgKm93bmVyKSBjb25zdCB7IFwKLSAgICByZXR1cm4gdXBiOjp1cGNhc3RfdG88Y29uc3QgdXBiOjpSZWZDb3VudGVkPih0aGlzKS0+UmVmKG93bmVyKTsgXAotICB9IFwKLSAgdm9pZCBVbnJlZihjb25zdCB2b2lkICpvd25lcikgY29uc3QgeyBcCi0gICAgcmV0dXJuIHVwYjo6dXBjYXN0X3RvPGNvbnN0IHVwYjo6UmVmQ291bnRlZD4odGhpcyktPlVucmVmKG93bmVyKTsgXAotICB9IFwKLSAgdm9pZCBEb25hdGVSZWYoY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8pIGNvbnN0IHsgXAotICAgIHJldHVybiB1cGI6OnVwY2FzdF90bzxjb25zdCB1cGI6OlJlZkNvdW50ZWQ+KHRoaXMpLT5Eb25hdGVSZWYoZnJvbSwgdG8pOyBcCi0gIH0gXAotICB2b2lkIENoZWNrUmVmKGNvbnN0IHZvaWQgKm93bmVyKSBjb25zdCB7IFwKLSAgICByZXR1cm4gdXBiOjp1cGNhc3RfdG88Y29uc3QgdXBiOjpSZWZDb3VudGVkPih0aGlzKS0+Q2hlY2tSZWYob3duZXIpOyBcCi0gIH0KLQotLyogSW50ZXJuYWwtdG8tdXBiIEludGVyZmFjZSAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiB2b2lkIHVwYl9yZWZjb3VudGVkX3Zpc2l0KGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9yZWZjb3VudGVkICpzdWJvYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqY2xvc3VyZSk7Ci0KLXN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsIHsKLSAgLyogTXVzdCB2aXNpdCBhbGwgc3Vib2JqZWN0cyB0aGF0IGFyZSBjdXJyZW50bHkgcmVmJ2QgdmlhIHVwYl9yZWZjb3VudGVkX3JlZjIuCi0gICAqIE11c3QgYmUgbG9uZ2ptcCgpLXNhZmUuICovCi0gIHZvaWQgKCp2aXNpdCkoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkX3Zpc2l0ICp2aXNpdCwgdm9pZCAqYyk7Ci0KLSAgLyogTXVzdCBmcmVlIHRoZSBvYmplY3QgYW5kIHJlbGVhc2UgYWxsIHJlZmVyZW5jZXMgdG8gb3RoZXIgb2JqZWN0cy4gKi8KLSAgdm9pZCAoKmZyZWUpKHVwYl9yZWZjb3VudGVkICpyKTsKLX07Ci0KLS8qIEluaXRpYWxpemVzIHRoZSByZWZjb3VudGVkIHdpdGggYSBzaW5nbGUgcmVmIGZvciB0aGUgZ2l2ZW4gb3duZXIuICBSZXR1cm5zCi0gKiBmYWxzZSBpZiBtZW1vcnkgY291bGQgbm90IGJlIGFsbG9jYXRlZC4gKi8KLWJvb2wgdXBiX3JlZmNvdW50ZWRfaW5pdCh1cGJfcmVmY291bnRlZCAqciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCAqdnRibCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEFkZHMgYSByZWYgZnJvbSBvbmUgcmVmY291bnRlZCBvYmplY3QgdG8gYW5vdGhlciAoImZyb20iIG11c3Qgbm90IGFscmVhZHkKLSAqIG93biBhIHJlZikuICBUaGVzZSByZWZzIG1heSBiZSBjaXJjdWxhcjsgY3ljbGVzIHdpbGwgYmUgY29sbGVjdGVkIGNvcnJlY3RseQotICogKGlmIGNvbnNlcnZhdGl2ZWx5KS4gIFRoZXNlIHJlZnMgZG8gbm90IG5lZWQgdG8gYmUgZnJlZWQgaW4gZnJvbSdzIGZyZWUoKQotICogZnVuY3Rpb24uICovCi12b2lkIHVwYl9yZWZjb3VudGVkX3JlZjIoY29uc3QgdXBiX3JlZmNvdW50ZWQgKnIsIHVwYl9yZWZjb3VudGVkICpmcm9tKTsKLQotLyogUmVtb3ZlcyBhIHJlZiB0aGF0IHdhcyBhY3F1aXJlZCBmcm9tIHVwYl9yZWZjb3VudGVkX3JlZjIoKSwgYW5kIGNvbGxlY3RzIGFueQotICogb2JqZWN0IGl0IGNhbi4gIFRoaXMgaXMgb25seSBuZWNlc3Nhcnkgd2hlbiAiZnJvbSIgbm8gbG9uZ2VyIHBvaW50cyB0byAiciIsCi0gKiBhbmQgbm90IGZyb20gZnJvbSdzICJmcmVlIiBmdW5jdGlvbi4gKi8KLXZvaWQgdXBiX3JlZmNvdW50ZWRfdW5yZWYyKGNvbnN0IHVwYl9yZWZjb3VudGVkICpyLCB1cGJfcmVmY291bnRlZCAqZnJvbSk7Ci0KLSNkZWZpbmUgdXBiX3JlZjIociwgZnJvbSkgXAotICAgIHVwYl9yZWZjb3VudGVkX3JlZjIoKGNvbnN0IHVwYl9yZWZjb3VudGVkKilyLCAodXBiX3JlZmNvdW50ZWQqKWZyb20pCi0jZGVmaW5lIHVwYl91bnJlZjIociwgZnJvbSkgXAotICAgIHVwYl9yZWZjb3VudGVkX3VucmVmMigoY29uc3QgdXBiX3JlZmNvdW50ZWQqKXIsICh1cGJfcmVmY291bnRlZCopZnJvbSkKLQotLyogRnJlZXplcyBhbGwgbXV0YWJsZSBvYmplY3QgcmVhY2hhYmxlIGJ5IHJlZjIoKSByZWZzIGZyb20gdGhlIGdpdmVuIHJvb3RzLgotICogVGhpcyB3aWxsIHNwbGl0IHJlZmNvdW50aW5nIGdyb3VwcyBpbnRvIHByZWNpc2UgU0NDIGdyb3Vwcywgc28gdGhhdAotICogcmVmY291bnRpbmcgb2YgZnJvemVuIG9iamVjdHMgY2FuIGJlIG1vcmUgYWdncmVzc2l2ZS4gIElmIG1lbW9yeSBhbGxvY2F0aW9uCi0gKiBmYWlscywgb3IgaWYgbW9yZSB0aGFuIDIqKjMxIG11dGFibGUgb2JqZWN0cyBhcmUgcmVhY2hhYmxlIGZyb20gInJvb3RzIiwgb3IKLSAqIGlmIHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZSBncmFwaCBleGNlZWRzICJtYXhkZXB0aCIsIGZhbHNlIGlzIHJldHVybmVkIGFuZAotICogdGhlIG9iamVjdHMgYXJlIHVuY2hhbmdlZC4KLSAqCi0gKiBBZnRlciB0aGlzIG9wZXJhdGlvbiBzdWNjZWVkcywgdGhlIG9iamVjdHMgYXJlIGZyb3plbi9jb25zdCwgYW5kIG1heSBub3QgYmUKLSAqIHVzZWQgdGhyb3VnaCBub24tY29uc3QgcG9pbnRlcnMuICBJbiBwYXJ0aWN1bGFyLCB0aGV5IG1heSBub3QgYmUgcGFzc2VkIGFzCi0gKiB0aGUgc2Vjb25kIHBhcmFtZXRlciBvZiB1cGJfcmVmY291bnRlZF97cmVmLHVucmVmfTIoKS4gIE9uIHRoZSB1cHNpZGUsIGFsbAotICogb3BlcmF0aW9ucyBvbiBmcm96ZW4gcmVmY291bnRlZHMgYXJlIHRocmVhZHNhZmUsIGFuZCBvYmplY3RzIHdpbGwgYmUgZnJlZWQKLSAqIGF0IHRoZSBwcmVjaXNlIG1vbWVudCB0aGF0IHRoZXkgYmVjb21lIHVucmVhY2hhYmxlLgotICoKLSAqIENhbGxlciBtdXN0IG93biByZWZzIG9uIGVhY2ggb2JqZWN0IGluIHRoZSAicm9vdHMiIGxpc3QuICovCi1ib29sIHVwYl9yZWZjb3VudGVkX2ZyZWV6ZSh1cGJfcmVmY291bnRlZCAqY29uc3Qqcm9vdHMsIGludCBuLCB1cGJfc3RhdHVzICpzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1heGRlcHRoKTsKLQotLyogU2hhcmVkIGJ5IGFsbCBjb21waWxlZC1pbiByZWZjb3VudGVkIG9iamVjdHMuICovCi1leHRlcm4gdWludDMyX3Qgc3RhdGljX3JlZmNvdW50OwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotLyogQysrIFdyYXBwZXJzLiAqLwotbmFtZXNwYWNlIHVwYiB7Ci1pbmxpbmUgYm9vbCBSZWZDb3VudGVkOjpJc0Zyb3plbigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9yZWZjb3VudGVkX2lzZnJvemVuKHRoaXMpOwotfQotaW5saW5lIHZvaWQgUmVmQ291bnRlZDo6UmVmKGNvbnN0IHZvaWQgKm93bmVyKSBjb25zdCB7Ci0gIHVwYl9yZWZjb3VudGVkX3JlZih0aGlzLCBvd25lcik7Ci19Ci1pbmxpbmUgdm9pZCBSZWZDb3VudGVkOjpVbnJlZihjb25zdCB2b2lkICpvd25lcikgY29uc3QgewotICB1cGJfcmVmY291bnRlZF91bnJlZih0aGlzLCBvd25lcik7Ci19Ci1pbmxpbmUgdm9pZCBSZWZDb3VudGVkOjpEb25hdGVSZWYoY29uc3Qgdm9pZCAqZnJvbSwgY29uc3Qgdm9pZCAqdG8pIGNvbnN0IHsKLSAgdXBiX3JlZmNvdW50ZWRfZG9uYXRlcmVmKHRoaXMsIGZyb20sIHRvKTsKLX0KLWlubGluZSB2b2lkIFJlZkNvdW50ZWQ6OkNoZWNrUmVmKGNvbnN0IHZvaWQgKm93bmVyKSBjb25zdCB7Ci0gIHVwYl9yZWZjb3VudGVkX2NoZWNrcmVmKHRoaXMsIG93bmVyKTsKLX0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi0KLS8qIHVwYjo6cmVmZmVkX3B0ciAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPiAgLyogRm9yIHN0ZDo6c3dhcCgpLiAqLwotCi0vKiBQcm92aWRlcyBSQUlJIHNlbWFudGljcyBmb3IgdXBiIHJlZmNvdW50ZWQgb2JqZWN0cy4gIEVhY2ggcmVmZmVkX3B0ciBvd25zIGEKLSAqIHJlZiBvbiB3aGF0ZXZlciBvYmplY3QgaXQgcG9pbnRzIHRvIChpZiBhbnkpLiAqLwotdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIHVwYjo6cmVmZmVkX3B0ciB7Ci0gcHVibGljOgotICByZWZmZWRfcHRyKCkgOiBwdHJfKE5VTEwpIHt9Ci0KLSAgLyogSWYgcmVmX2Rvbm9yIGlzIE5VTEwsIHRha2VzIGEgbmV3IHJlZiwgb3RoZXJ3aXNlIGFkb3B0cyBmcm9tIHJlZl9kb25vci4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIHJlZmZlZF9wdHIoVSogdmFsLCBjb25zdCB2b2lkKiByZWZfZG9ub3IgPSBOVUxMKQotICAgICAgOiBwdHJfKHVwYjo6dXBjYXN0KHZhbCkpIHsKLSAgICBpZiAocmVmX2Rvbm9yKSB7Ci0gICAgICBhc3NlcnQocHRyXyk7Ci0gICAgICBwdHJfLT5Eb25hdGVSZWYocmVmX2Rvbm9yLCB0aGlzKTsKLSAgICB9IGVsc2UgaWYgKHB0cl8pIHsKLSAgICAgIHB0cl8tPlJlZih0aGlzKTsKLSAgICB9Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVT4KLSAgcmVmZmVkX3B0cihjb25zdCByZWZmZWRfcHRyPFU+JiBvdGhlcikKLSAgICAgIDogcHRyXyh1cGI6OnVwY2FzdChvdGhlci5nZXQoKSkpIHsKLSAgICBpZiAocHRyXykgcHRyXy0+UmVmKHRoaXMpOwotICB9Ci0KLSAgcmVmZmVkX3B0cihjb25zdCByZWZmZWRfcHRyJiBvdGhlcikKLSAgICAgIDogcHRyXyh1cGI6OnVwY2FzdChvdGhlci5nZXQoKSkpIHsKLSAgICBpZiAocHRyXykgcHRyXy0+UmVmKHRoaXMpOwotICB9Ci0KLSAgfnJlZmZlZF9wdHIoKSB7IGlmIChwdHJfKSBwdHJfLT5VbnJlZih0aGlzKTsgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBVPgotICByZWZmZWRfcHRyJiBvcGVyYXRvcj0oY29uc3QgcmVmZmVkX3B0cjxVPiYgb3RoZXIpIHsKLSAgICByZXNldChvdGhlci5nZXQoKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgcmVmZmVkX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHJlZmZlZF9wdHImIG90aGVyKSB7Ci0gICAgcmVzZXQob3RoZXIuZ2V0KCkpOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIC8qIFRPRE8oaGFiZXJtYW4pOiBhZGQgQysrMTEgbW92ZSBjb25zdHJ1Y3Rpb24vYXNzaWdubWVudCBmb3IgZ3JlYXRlcgotICAgKiBlZmZpY2llbmN5LiAqLwotCi0gIHZvaWQgc3dhcChyZWZmZWRfcHRyJiBvdGhlcikgewotICAgIGlmIChwdHJfID09IG90aGVyLnB0cl8pIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAocHRyXykgcHRyXy0+RG9uYXRlUmVmKHRoaXMsICZvdGhlcik7Ci0gICAgaWYgKG90aGVyLnB0cl8pIG90aGVyLnB0cl8tPkRvbmF0ZVJlZigmb3RoZXIsIHRoaXMpOwotICAgIHN0ZDo6c3dhcChwdHJfLCBvdGhlci5wdHJfKTsKLSAgfQotCi0gIFQmIG9wZXJhdG9yKigpIGNvbnN0IHsKLSAgICBhc3NlcnQocHRyXyk7Ci0gICAgcmV0dXJuICpwdHJfOwotICB9Ci0KLSAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsKLSAgICBhc3NlcnQocHRyXyk7Ci0gICAgcmV0dXJuIHB0cl87Ci0gIH0KLQotICBUKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9Ci0KLSAgLyogSWYgcmVmX2Rvbm9yIGlzIE5VTEwsIHRha2VzIGEgbmV3IHJlZiwgb3RoZXJ3aXNlIGFkb3B0cyBmcm9tIHJlZl9kb25vci4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIHZvaWQgcmVzZXQoVSogcHRyID0gTlVMTCwgY29uc3Qgdm9pZCogcmVmX2Rvbm9yID0gTlVMTCkgewotICAgIHJlZmZlZF9wdHIocHRyLCByZWZfZG9ub3IpLnN3YXAoKnRoaXMpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIHJlZmZlZF9wdHI8VT4gZG93bl9jYXN0KCkgewotICAgIHJldHVybiByZWZmZWRfcHRyPFU+KHVwYjo6ZG93bl9jYXN0PFUqPihnZXQoKSkpOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFU+Ci0gIHJlZmZlZF9wdHI8VT4gZHluX2Nhc3QoKSB7Ci0gICAgcmV0dXJuIHJlZmZlZF9wdHI8VT4odXBiOjpkeW5fY2FzdDxVKj4oZ2V0KCkpKTsKLSAgfQotCi0gIC8qIFBsYWluIHJlbGVhc2UoKSBpcyB1bnNhZmU7IGlmIHdlIHdlcmUgdGhlIG9ubHkgb3duZXIsIGl0IHdvdWxkIGxlYWsgdGhlCi0gICAqIG9iamVjdC4gIEluc3RlYWQgd2UgcHJvdmlkZSB0aGlzOiAqLwotICBUKiBSZWxlYXNlVG8oY29uc3Qgdm9pZCogbmV3X293bmVyKSB7Ci0gICAgVCogcmV0ID0gTlVMTDsKLSAgICBwdHJfLT5Eb25hdGVSZWYodGhpcywgbmV3X293bmVyKTsKLSAgICBzdGQ6OnN3YXAocmV0LCBwdHJfKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSBwcml2YXRlOgotICBUKiBwdHJfOwotfTsKLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIFVQQl9SRUZDT1VOVF9IXyAqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDxjc3RyaW5nPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLW5hbWVzcGFjZSB1cGIgewotY2xhc3MgRGVmOwotY2xhc3MgRW51bURlZjsKLWNsYXNzIEZpZWxkRGVmOwotY2xhc3MgRmlsZURlZjsKLWNsYXNzIE1lc3NhZ2VEZWY7Ci1jbGFzcyBPbmVvZkRlZjsKLX0KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUodXBiOjpEZWYsIHVwYjo6UmVmQ291bnRlZCwgdXBiX2RlZiwgdXBiX3JlZmNvdW50ZWQpCi1VUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUodXBiOjpPbmVvZkRlZiwgdXBiOjpSZWZDb3VudGVkLCB1cGJfb25lb2ZkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3JlZmNvdW50ZWQpCi1VUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUodXBiOjpGaWxlRGVmLCB1cGI6OlJlZkNvdW50ZWQsIHVwYl9maWxlZGVmLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9yZWZjb3VudGVkKQotCi0vKiBUaGUgbWF4aW11bSBtZXNzYWdlIGRlcHRoIHRoYXQgdGhlIHR5cGUgZ3JhcGggY2FuIGhhdmUuICBUaGlzIGlzIGEgcmVzb3VyY2UKLSAqIGxpbWl0IGZvciB0aGUgQyBzdGFjayBzaW5jZSB3ZSBzb21ldGltZXMgbmVlZCB0byByZWN1cnNpdmVseSB0cmF2ZXJzZSB0aGUKLSAqIGdyYXBoLiAgQ3ljbGVzIGFyZSBvazsgdGhlIHRyYXZlcnNhbCB3aWxsIHN0b3Agd2hlbiBpdCBkZXRlY3RzIGEgY3ljbGUsIGJ1dAotICogd2UgbXVzdCBoaXQgdGhlIGN5Y2xlIGJlZm9yZSB0aGUgbWF4aW11bSBkZXB0aCBpcyByZWFjaGVkLgotICoKLSAqIElmIGhhdmluZyBhIHNpbmdsZSBzdGF0aWMgbGltaXQgaXMgdG9vIGluZmxleGlibGUsIHdlIGNhbiBhZGQgYW5vdGhlciB2YXJpYW50Ci0gKiBvZiBEZWY6OkZyZWV6ZSB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIHRoaXMgYXMgYSBwYXJhbWV0ZXIuICovCi0jZGVmaW5lIFVQQl9NQVhfTUVTU0FHRV9ERVBUSCA2NAotCi0KLS8qIHVwYjo6RGVmOiBiYXNlIGNsYXNzIGZvciB0b3AtbGV2ZWwgZGVmcyAgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEFsbCB0aGUgZGlmZmVyZW50IGtpbmQgb2YgZGVmcyB0aGF0IGNhbiBiZSBkZWZpbmVkIGF0IHRoZSB0b3AtbGV2ZWwgYW5kIHB1dAotICogaW4gYSBTeW1ib2xUYWJsZSBvciBhcHBlYXIgaW4gYSBGaWxlRGVmOjpkZWZzKCkgbGlzdC4gIFRoaXMgZXhjbHVkZXMgc29tZQotICogZGVmcyAobGlrZSBvbmVvZnMgYW5kIGZpbGVzKS4gIEl0IG9ubHkgaW5jbHVkZXMgZmllbGRzIGJlY2F1c2UgdGhleSBjYW4gYmUKLSAqIGRlZmluZWQgYXMgZXh0ZW5zaW9ucy4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9ERUZfTVNHLAotICBVUEJfREVGX0ZJRUxELAotICBVUEJfREVGX0VOVU0sCi0gIFVQQl9ERUZfU0VSVklDRSwgICAvKiBOb3QgeWV0IGltcGxlbWVudGVkLiAqLwotICBVUEJfREVGX0FOWSA9IC0xICAgLyogV2lsZGNhcmQgZm9yIHVwYl9zeW10YWJfZ2V0KigpICovCi19IHVwYl9kZWZ0eXBlX3Q7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBUaGUgYmFzZSBjbGFzcyBvZiBhbGwgZGVmcy4gIEl0cyBiYXNlIGlzIHVwYjo6UmVmQ291bnRlZCAodXNlIHVwYjo6dXBjYXN0KCkKLSAqIHRvIGNvbnZlcnQpLiAqLwotY2xhc3MgdXBiOjpEZWYgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB1cGJfZGVmdHlwZV90IFR5cGU7Ci0KLSAgRGVmKiBEdXAoY29uc3Qgdm9pZCAqb3duZXIpIGNvbnN0OwotCi0gIC8qIHVwYjo6UmVmQ291bnRlZCBtZXRob2RzIGxpa2UgUmVmKCkvVW5yZWYoKS4gKi8KLSAgVVBCX1JFRkNPVU5URURfQ1BQTUVUSE9EUwotCi0gIFR5cGUgZGVmX3R5cGUoKSBjb25zdDsKLQotICAvKiAiZnVsbG5hbWUiIGlzIHRoZSBkZWYncyBmdWxseS1xdWFsaWZpZWQgbmFtZSAoZWcuIGZvby5iYXIuTWVzc2FnZSkuICovCi0gIGNvbnN0IGNoYXIgKmZ1bGxfbmFtZSgpIGNvbnN0OwotCi0gIC8qIFRoZSBmaW5hbCBwYXJ0IG9mIGEgZGVmJ3MgbmFtZSAoZWcuIE1lc3NhZ2UpLiAqLwotICBjb25zdCBjaGFyICpuYW1lKCkgY29uc3Q7Ci0KLSAgLyogVGhlIGRlZiBtdXN0IGJlIG11dGFibGUuICBDYWxsZXIgcmV0YWlucyBvd25lcnNoaXAgb2YgZnVsbG5hbWUuICBEZWZzIGFyZQotICAgKiBub3QgcmVxdWlyZWQgdG8gaGF2ZSBhIG5hbWU7IGlmIGEgZGVmIGhhcyBubyBuYW1lIHdoZW4gaXQgaXMgZnJvemVuLCBpdAotICAgKiB3aWxsIHJlbWFpbiBhbiBhbm9ueW1vdXMgZGVmLiAgT24gZmFpbHVyZSwgcmV0dXJucyBmYWxzZSBhbmQgZGV0YWlscyBpbiAicyIKLSAgICogaWYgbm9uLU5VTEwuICovCi0gIGJvb2wgc2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgdXBiOjpTdGF0dXMqIHMpOwotICBib29sIHNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJmZ1bGxuYW1lLCB1cGI6OlN0YXR1cyogcyk7Ci0KLSAgLyogVGhlIGZpbGUgaW4gd2hpY2ggdGhpcyBkZWYgYXBwZWFycy4gIEl0IGlzIG5vdCBuZWNlc3NhcnkgdG8gYWRkIGEgZGVmIHRvIGEKLSAgICogZmlsZSAoYW5kIGNvbnNlcXVlbnRseSB0aGUgYWNjZXNzb3IgbWF5IHJldHVybiBOVUxMKS4gIFNldCB0aGlzIGJ5IGNhbGxpbmcKLSAgICogZmlsZS0+QWRkKGRlZikuICovCi0gIEZpbGVEZWYqIGZpbGUoKSBjb25zdDsKLQotICAvKiBGcmVlemVzIHRoZSBnaXZlbiBkZWZzOyB0aGlzIHZhbGlkYXRlcyBhbGwgY29uc3RyYWludHMgYW5kIG1hcmtzIHRoZSBkZWZzCi0gICAqIGFzIGZyb3plbiAocmVhZC1vbmx5KS4gICJkZWZzIiBtYXkgbm90IGNvbnRhaW4gYW55IGZpZWxkZGVmcywgYnV0IGZpZWxkcwotICAgKiBvZiBhbnkgbXNnZGVmcyB3aWxsIGJlIGZyb3plbi4KLSAgICoKLSAgICogU3ltYm9saWMgcmVmZXJlbmNlcyB0byBzdWItdHlwZXMgYW5kIGVudW0gZGVmYXVsdHMgbXVzdCBoYXZlIGFscmVhZHkgYmVlbgotICAgKiByZXNvbHZlZC4gIEFueSBtdXRhYmxlIGRlZnMgcmVhY2hhYmxlIGZyb20gYW55IG9mICJkZWZzIiBtdXN0IGFsc28gYmUgaW4KLSAgICogdGhlIGxpc3Q7IG1vcmUgZm9ybWFsbHksICJkZWZzIiBtdXN0IGJlIGEgdHJhbnNpdGl2ZSBjbG9zdXJlIG9mIG11dGFibGUKLSAgICogZGVmcy4KLSAgICoKLSAgICogQWZ0ZXIgdGhpcyBvcGVyYXRpb24gc3VjY2VlZHMsIHRoZSBmaW5hbGl6ZWQgZGVmcyBtdXN0IG9ubHkgYmUgYWNjZXNzZWQKLSAgICogdGhyb3VnaCBhIGNvbnN0IHBvaW50ZXIhICovCi0gIHN0YXRpYyBib29sIEZyZWV6ZShEZWYqIGNvbnN0KiBkZWZzLCBzaXplX3QgbiwgU3RhdHVzKiBzdGF0dXMpOwotICBzdGF0aWMgYm9vbCBGcmVlemUoY29uc3Qgc3RkOjp2ZWN0b3I8RGVmKj4mIGRlZnMsIFN0YXR1cyogc3RhdHVzKTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKERlZiwgdXBiOjpEZWYpCi19OwotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBOYXRpdmUgQyBBUEkuICovCi11cGJfZGVmICp1cGJfZGVmX2R1cChjb25zdCB1cGJfZGVmICpkZWYsIGNvbnN0IHZvaWQgKm93bmVyKTsKLQotLyogSW5jbHVkZSB1cGJfcmVmY291bnRlZCBtZXRob2RzIGxpa2UgdXBiX2RlZl9yZWYoKS91cGJfZGVmX3VucmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfZGVmLCB1cGJfZGVmX3VwY2FzdCkKLQotdXBiX2RlZnR5cGVfdCB1cGJfZGVmX3R5cGUoY29uc3QgdXBiX2RlZiAqZCk7Ci1jb25zdCBjaGFyICp1cGJfZGVmX2Z1bGxuYW1lKGNvbnN0IHVwYl9kZWYgKmQpOwotY29uc3QgY2hhciAqdXBiX2RlZl9uYW1lKGNvbnN0IHVwYl9kZWYgKmQpOwotY29uc3QgdXBiX2ZpbGVkZWYgKnVwYl9kZWZfZmlsZShjb25zdCB1cGJfZGVmICpkKTsKLWJvb2wgdXBiX2RlZl9zZXRmdWxsbmFtZSh1cGJfZGVmICpkZWYsIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLCB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX2RlZl9mcmVlemUodXBiX2RlZiAqY29uc3QgKmRlZnMsIHNpemVfdCBuLCB1cGJfc3RhdHVzICpzKTsKLQotLyogVGVtcG9yYXJ5IEFQSTogZm9yIGludGVybmFsIHVzZSBvbmx5LiAqLwotYm9vbCBfdXBiX2RlZl92YWxpZGF0ZSh1cGJfZGVmICpjb25zdCpkZWZzLCBzaXplX3QgbiwgdXBiX3N0YXR1cyAqcyk7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotCi0vKiB1cGI6OkRlZiBjYXN0cyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNkZWZpbmUgVVBCX0NQUF9DQVNUUyhjbmFtZSwgY3BwdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIG5hbWVzcGFjZSB1cGIgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGNwcHR5cGUgKmRvd25fY2FzdDxjcHB0eXBlICosIERlZj4oRGVmICogZGVmKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHVwYl9kb3duY2FzdF8jI2NuYW1lIyNfbXV0YWJsZShkZWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBjcHB0eXBlICpkeW5fY2FzdDxjcHB0eXBlICosIERlZj4oRGVmICogZGVmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB1cGJfZHluY2FzdF8jI2NuYW1lIyNfbXV0YWJsZShkZWYpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3QgY3BwdHlwZSAqZG93bl9jYXN0PGNvbnN0IGNwcHR5cGUgKiwgY29uc3QgRGVmPiggICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IERlZiAqZGVmKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHVwYl9kb3duY2FzdF8jI2NuYW1lKGRlZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBjb25zdCBjcHB0eXBlICpkeW5fY2FzdDxjb25zdCBjcHB0eXBlICosIGNvbnN0IERlZj4oY29uc3QgRGVmICpkZWYpIHsgXAotICAgIHJldHVybiB1cGJfZHluY2FzdF8jI2NuYW1lKGRlZik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgY29uc3QgY3BwdHlwZSAqZG93bl9jYXN0PGNvbnN0IGNwcHR5cGUgKiwgRGVmPihEZWYgKiBkZWYpIHsgICAgICAgICAgIFwKLSAgICByZXR1cm4gdXBiX2Rvd25jYXN0XyMjY25hbWUoZGVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGNvbnN0IGNwcHR5cGUgKmR5bl9jYXN0PGNvbnN0IGNwcHR5cGUgKiwgRGVmPihEZWYgKiBkZWYpIHsgICAgICAgICAgICBcCi0gICAgcmV0dXJuIHVwYl9keW5jYXN0XyMjY25hbWUoZGVmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2Vsc2UKLSNkZWZpbmUgVVBCX0NQUF9DQVNUUyhjbmFtZSwgY3BwdHlwZSkKLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotLyogRHluYW1pYyBjYXN0cywgZm9yIGRldGVybWluaW5nIGlmIGEgZGVmIGlzIG9mIGEgcGFydGljdWxhciB0eXBlIGF0IHJ1bnRpbWUuCi0gKiBEb3duY2FzdHMsIGZvciB3aGVuIHNvbWUgd2FudHMgdG8gYXNzZXJ0IHRoYXQgYSBkZWYgaXMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuCi0gKiBUaGVzZSBhcmUgb25seSBjaGVja2VkIGlmIHdlIGFyZSBidWlsZGluZyBkZWJ1Zy4gKi8KLSNkZWZpbmUgVVBCX0RFRl9DQVNUUyhsb3dlciwgdXBwZXIsIGNwcHR5cGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSBjb25zdCB1cGJfIyNsb3dlciAqdXBiX2R5bmNhc3RfIyNsb3dlcihjb25zdCB1cGJfZGVmICpkZWYpIHsgIFwKLSAgICBpZiAodXBiX2RlZl90eXBlKGRlZikgIT0gVVBCX0RFRl8jI3VwcGVyKSByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gKHVwYl8jI2xvd2VyICopZGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSBjb25zdCB1cGJfIyNsb3dlciAqdXBiX2Rvd25jYXN0XyMjbG93ZXIoY29uc3QgdXBiX2RlZiAqZGVmKSB7IFwKLSAgICBhc3NlcnQodXBiX2RlZl90eXBlKGRlZikgPT0gVVBCX0RFRl8jI3VwcGVyKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gKGNvbnN0IHVwYl8jI2xvd2VyICopZGVmOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSB1cGJfIyNsb3dlciAqdXBiX2R5bmNhc3RfIyNsb3dlciMjX211dGFibGUodXBiX2RlZiAqZGVmKSB7ICAgIFwKLSAgICByZXR1cm4gKHVwYl8jI2xvd2VyICopdXBiX2R5bmNhc3RfIyNsb3dlcihkZWYpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0lOTElORSB1cGJfIyNsb3dlciAqdXBiX2Rvd25jYXN0XyMjbG93ZXIjI19tdXRhYmxlKHVwYl9kZWYgKmRlZikgeyAgIFwKLSAgICByZXR1cm4gKHVwYl8jI2xvd2VyICopdXBiX2Rvd25jYXN0XyMjbG93ZXIoZGVmKTsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVBCX0NQUF9DQVNUUyhsb3dlciwgY3BwdHlwZSkKLQotI2RlZmluZSBVUEJfREVGSU5FX0RFRihjcHBuYW1lLCBsb3dlciwgdXBwZXIsIGNwcG1ldGhvZHMsIG1lbWJlcnMpICAgICAgICAgICAgIFwKLSAgVVBCX0RFRklORV9DTEFTUzIoY3BwbmFtZSwgdXBiOjpEZWYsIHVwYjo6UmVmQ291bnRlZCwgY3BwbWV0aG9kcywgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgbWVtYmVycykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfREVGX0NBU1RTKGxvd2VyLCB1cHBlciwgY3BwbmFtZSkKLQotI2RlZmluZSBVUEJfREVDTEFSRV9ERUZfVFlQRShjcHBuYW1lLCBsb3dlciwgdXBwZXIpIFwKLSAgVVBCX0RFQ0xBUkVfREVSSVZFRF9UWVBFMihjcHBuYW1lLCB1cGI6OkRlZiwgdXBiOjpSZWZDb3VudGVkLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiXyAjIyBsb3dlciwgdXBiX2RlZiwgdXBiX3JlZmNvdW50ZWQpIFwKLSAgVVBCX0RFRl9DQVNUUyhsb3dlciwgdXBwZXIsIGNwcG5hbWUpCi0KLVVQQl9ERUNMQVJFX0RFRl9UWVBFKHVwYjo6RmllbGREZWYsIGZpZWxkZGVmLCBGSUVMRCkKLVVQQl9ERUNMQVJFX0RFRl9UWVBFKHVwYjo6TWVzc2FnZURlZiwgbXNnZGVmLCBNU0cpCi1VUEJfREVDTEFSRV9ERUZfVFlQRSh1cGI6OkVudW1EZWYsIGVudW1kZWYsIEVOVU0pCi0KLSN1bmRlZiBVUEJfREVDTEFSRV9ERUZfVFlQRQotI3VuZGVmIFVQQl9ERUZfQ0FTVFMKLSN1bmRlZiBVUEJfQ1BQX0NBU1RTCi0KLQotLyogdXBiOjpGaWVsZERlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogVGhlIHR5cGVzIGEgZmllbGQgY2FuIGhhdmUuICBOb3RlIHRoYXQgdGhpcyBsaXN0IGlzIG5vdCBpZGVudGljYWwgdG8gdGhlCi0gKiB0eXBlcyBkZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8sIHdoaWNoIGdpdmVzIElOVDMyIGFuZCBTSU5UMzIgc2VwYXJhdGUKLSAqIHR5cGVzICh3ZSBkaXN0aW5ndWlzaCB0aGUgdHdvIHdpdGggdGhlICJpbnRlZ2VyIGVuY29kaW5nIiBlbnVtIGJlbG93KS4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9UWVBFX0ZMT0FUICAgID0gMSwKLSAgVVBCX1RZUEVfRE9VQkxFICAgPSAyLAotICBVUEJfVFlQRV9CT09MICAgICA9IDMsCi0gIFVQQl9UWVBFX1NUUklORyAgID0gNCwKLSAgVVBCX1RZUEVfQllURVMgICAgPSA1LAotICBVUEJfVFlQRV9NRVNTQUdFICA9IDYsCi0gIFVQQl9UWVBFX0VOVU0gICAgID0gNywgIC8qIEVudW0gdmFsdWVzIGFyZSBpbnQzMi4gKi8KLSAgVVBCX1RZUEVfSU5UMzIgICAgPSA4LAotICBVUEJfVFlQRV9VSU5UMzIgICA9IDksCi0gIFVQQl9UWVBFX0lOVDY0ICAgID0gMTAsCi0gIFVQQl9UWVBFX1VJTlQ2NCAgID0gMTEKLX0gdXBiX2ZpZWxkdHlwZV90OwotCi0vKiBUaGUgcmVwZWF0ZWQtbmVzcyBvZiBlYWNoIGZpZWxkOyB0aGlzIG1hdGNoZXMgZGVzY3JpcHRvci5wcm90by4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9MQUJFTF9PUFRJT05BTCA9IDEsCi0gIFVQQl9MQUJFTF9SRVFVSVJFRCA9IDIsCi0gIFVQQl9MQUJFTF9SRVBFQVRFRCA9IDMKLX0gdXBiX2xhYmVsX3Q7Ci0KLS8qIEhvdyBpbnRlZ2VycyBzaG91bGQgYmUgZW5jb2RlZCBpbiBzZXJpYWxpemF0aW9ucyB0aGF0IG9mZmVyIG11bHRpcGxlCi0gKiBpbnRlZ2VyIGVuY29kaW5nIG1ldGhvZHMuICovCi10eXBlZGVmIGVudW0gewotICBVUEJfSU5URk1UX1ZBUklBQkxFID0gMSwKLSAgVVBCX0lOVEZNVF9GSVhFRCA9IDIsCi0gIFVQQl9JTlRGTVRfWklHWkFHID0gMyAgIC8qIE9ubHkgZm9yIHNpZ25lZCB0eXBlcyAoSU5UMzIvSU5UNjQpLiAqLwotfSB1cGJfaW50Zm10X3Q7Ci0KLS8qIERlc2NyaXB0b3IgdHlwZXMsIGFzIGRlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90by4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9ERVNDUklQVE9SX1RZUEVfRE9VQkxFICAgPSAxLAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0ZMT0FUICAgID0gMiwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9JTlQ2NCAgICA9IDMsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfVUlOVDY0ICAgPSA0LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0lOVDMyICAgID0gNSwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9GSVhFRDY0ICA9IDYsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfRklYRUQzMiAgPSA3LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0JPT0wgICAgID0gOCwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9TVFJJTkcgICA9IDksCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfR1JPVVAgICAgPSAxMCwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9NRVNTQUdFICA9IDExLAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX0JZVEVTICAgID0gMTIsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfVUlOVDMyICAgPSAxMywKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9FTlVNICAgICA9IDE0LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX1NGSVhFRDMyID0gMTUsCi0gIFVQQl9ERVNDUklQVE9SX1RZUEVfU0ZJWEVENjQgPSAxNiwKLSAgVVBCX0RFU0NSSVBUT1JfVFlQRV9TSU5UMzIgICA9IDE3LAotICBVUEJfREVTQ1JJUFRPUl9UWVBFX1NJTlQ2NCAgID0gMTgKLX0gdXBiX2Rlc2NyaXB0b3J0eXBlX3Q7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9TWU5UQVhfUFJPVE8yID0gMiwKLSAgVVBCX1NZTlRBWF9QUk9UTzMgPSAzCi19IHVwYl9zeW50YXhfdDsKLQotLyogTWF4aW11bSBmaWVsZCBudW1iZXIgYWxsb3dlZCBmb3IgRmllbGREZWZzLiAgVGhpcyBpcyBhbiBpbmhlcmVudCBsaW1pdCBvZiB0aGUKLSAqIHByb3RvYnVmIHdpcmUgZm9ybWF0LiAqLwotI2RlZmluZSBVUEJfTUFYX0ZJRUxETlVNQkVSICgoMSA8PCAyOSkgLSAxKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQSB1cGJfZmllbGRkZWYgZGVzY3JpYmVzIGEgc2luZ2xlIGZpZWxkIGluIGEgbWVzc2FnZS4gIEl0IGlzIG1vc3Qgb2Z0ZW4KLSAqIGZvdW5kIGFzIGEgcGFydCBvZiBhIHVwYl9tc2dkZWYsIGJ1dCBjYW4gYWxzbyBzdGFuZCBhbG9uZSB0byByZXByZXNlbnQKLSAqIGFuIGV4dGVuc2lvbi4KLSAqCi0gKiBJdHMgYmFzZSBjbGFzcyBpcyB1cGI6OkRlZiAodXNlIHVwYjo6dXBjYXN0KCkgdG8gY29udmVydCkuICovCi1jbGFzcyB1cGI6OkZpZWxkRGVmIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdXBiX2ZpZWxkdHlwZV90IFR5cGU7Ci0gIHR5cGVkZWYgdXBiX2xhYmVsX3QgTGFiZWw7Ci0gIHR5cGVkZWYgdXBiX2ludGZtdF90IEludGVnZXJGb3JtYXQ7Ci0gIHR5cGVkZWYgdXBiX2Rlc2NyaXB0b3J0eXBlX3QgRGVzY3JpcHRvclR5cGU7Ci0KLSAgLyogVGhlc2UgcmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIHZhbHVlIGlzIGEgdmFsaWQgbWVtYmVyIG9mIHRoZSBlbnVtZXJhdGlvbi4gKi8KLSAgc3RhdGljIGJvb2wgQ2hlY2tUeXBlKGludDMyX3QgdmFsKTsKLSAgc3RhdGljIGJvb2wgQ2hlY2tMYWJlbChpbnQzMl90IHZhbCk7Ci0gIHN0YXRpYyBib29sIENoZWNrRGVzY3JpcHRvclR5cGUoaW50MzJfdCB2YWwpOwotICBzdGF0aWMgYm9vbCBDaGVja0ludGVnZXJGb3JtYXQoaW50MzJfdCB2YWwpOwotCi0gIC8qIFRoZXNlIGNvbnZlcnQgdG8gdGhlIGdpdmVuIGVudW1lcmF0aW9uOyB0aGV5IHJlcXVpcmUgdGhhdCB0aGUgdmFsdWUgaXMKLSAgICogdmFsaWQuICovCi0gIHN0YXRpYyBUeXBlIENvbnZlcnRUeXBlKGludDMyX3QgdmFsKTsKLSAgc3RhdGljIExhYmVsIENvbnZlcnRMYWJlbChpbnQzMl90IHZhbCk7Ci0gIHN0YXRpYyBEZXNjcmlwdG9yVHlwZSBDb252ZXJ0RGVzY3JpcHRvclR5cGUoaW50MzJfdCB2YWwpOwotICBzdGF0aWMgSW50ZWdlckZvcm1hdCBDb252ZXJ0SW50ZWdlckZvcm1hdChpbnQzMl90IHZhbCk7Ci0KLSAgLyogUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KLSAgc3RhdGljIHJlZmZlZF9wdHI8RmllbGREZWY+IE5ldygpOwotCi0gIC8qIER1cGxpY2F0ZXMgdGhlIGdpdmVuIGZpZWxkLCByZXR1cm5pbmcgTlVMTCBpZiBtZW1vcnkgYWxsb2NhdGlvbiBmYWlsZWQuCi0gICAqIFdoZW4gYSBmaWVsZGRlZiBpcyBkdXBsaWNhdGVkLCB0aGUgc3ViZGVmIChpZiBhbnkpIGlzIG1hZGUgc3ltYm9saWMgaWYgaXQKLSAgICogd2Fzbid0IGFscmVhZHkuICBJZiB0aGUgc3ViZGVmIGlzIHNldCBidXQgaGFzIG5vIG5hbWUgKHdoaWNoIGlzIHBvc3NpYmxlCi0gICAqIHNpbmNlIG1zZ2RlZnMgYXJlIG5vdCByZXF1aXJlZCB0byBoYXZlIGEgbmFtZSkgdGhlIG5ldyBmaWVsZGRlZidzIHN1YmRlZgotICAgKiB3aWxsIGJlIHVuc2V0LiAqLwotICBGaWVsZERlZiogRHVwKGNvbnN0IHZvaWQqIG93bmVyKSBjb25zdDsKLQotICAvKiB1cGI6OlJlZkNvdW50ZWQgbWV0aG9kcyBsaWtlIFJlZigpL1VucmVmKCkuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBGdW5jdGlvbmFsaXR5IGZyb20gdXBiOjpEZWYuICovCi0gIGNvbnN0IGNoYXIqIGZ1bGxfbmFtZSgpIGNvbnN0OwotCi0gIGJvb2wgdHlwZV9pc19zZXQoKSBjb25zdDsgIC8qIHNldF9bZGVzY3JpcHRvcl9ddHlwZSgpIGhhcyBiZWVuIGNhbGxlZD8gKi8KLSAgVHlwZSB0eXBlKCkgY29uc3Q7ICAgICAgICAgLyogUmVxdWlyZXMgdGhhdCB0eXBlX2lzX3NldCgpID09IHRydWUuICovCi0gIExhYmVsIGxhYmVsKCkgY29uc3Q7ICAgICAgIC8qIERlZmF1bHRzIHRvIFVQQl9MQUJFTF9PUFRJT05BTC4gKi8KLSAgY29uc3QgY2hhciogbmFtZSgpIGNvbnN0OyAgLyogTlVMTCBpZiB1bmluaXRpYWxpemVkLiAqLwotICB1aW50MzJfdCBudW1iZXIoKSBjb25zdDsgICAvKiBSZXR1cm5zIDAgaWYgdW5pbml0aWFsaXplZC4gKi8KLSAgYm9vbCBpc19leHRlbnNpb24oKSBjb25zdDsKLQotICAvKiBDb3BpZXMgdGhlIEpTT04gbmFtZSBmb3IgdGhpcyBmaWVsZCBpbnRvIHRoZSBnaXZlbiBidWZmZXIuICBSZXR1cm5zIHRoZQotICAgKiBhY3R1YWwgc2l6ZSBvZiB0aGUgSlNPTiBuYW1lLCBpbmNsdWRpbmcgdGhlIE5VTEwgdGVybWluYXRvci4gIElmIHRoZQotICAgKiByZXR1cm4gdmFsdWUgaXMgMCwgdGhlIEpTT04gbmFtZSBpcyB1bnNldC4gIElmIHRoZSByZXR1cm4gdmFsdWUgaXMKLSAgICogZ3JlYXRlciB0aGFuIGxlbiwgdGhlIEpTT04gbmFtZSB3YXMgdHJ1bmNhdGVkLiAgVGhlIGJ1ZmZlciBpcyBhbHdheXMKLSAgICogTlVMTC10ZXJtaW5hdGVkIGlmIGxlbiA+IDAuCi0gICAqCi0gICAqIFRoZSBKU09OIG5hbWUgYWx3YXlzIGRlZmF1bHRzIHRvIGEgY2FtZWxDYXNlZCB2ZXJzaW9uIG9mIHRoZSByZWd1bGFyCi0gICAqIG5hbWUuICBIb3dldmVyIGlmIHRoZSByZWd1bGFyIG5hbWUgaXMgdW5zZXQsIHRoZSBKU09OIG5hbWUgd2lsbCBiZSB1bnNldAotICAgKiBhbHNvLgotICAgKi8KLSAgc2l6ZV90IEdldEpzb25OYW1lKGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikgY29uc3Q7Ci0KLSAgLyogQ29udmVuaWVuY2UgdmVyc2lvbiBvZiB0aGUgYWJvdmUgZnVuY3Rpb24gd2hpY2ggY29waWVzIHRoZSBKU09OIG5hbWUKLSAgICogaW50byB0aGUgZ2l2ZW4gc3RyaW5nLCByZXR1cm5pbmcgZmFsc2UgaWYgdGhlIG5hbWUgaXMgbm90IHNldC4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIGJvb2wgR2V0SnNvbk5hbWUoVCogc3RyKSB7Ci0gICAgc3RyLT5yZXNpemUoR2V0SnNvbk5hbWUoTlVMTCwgMCkpOwotICAgIEdldEpzb25OYW1lKCYoKnN0cilbMF0sIHN0ci0+c2l6ZSgpKTsKLSAgICByZXR1cm4gc3RyLT5zaXplKCkgPiAwOwotICB9Ci0KLSAgLyogRm9yIFVQQl9UWVBFX01FU1NBR0UgZmllbGRzIG9ubHkgd2hlcmUgaXNfdGFnX2RlbGltaXRlZCgpID09IGZhbHNlLAotICAgKiBpbmRpY2F0ZXMgd2hldGhlciB0aGlzIGZpZWxkIHNob3VsZCBoYXZlIGxhenkgcGFyc2luZyBoYW5kbGVycyB0aGF0IHlpZWxkCi0gICAqIHRoZSB1bnBhcnNlZCBzdHJpbmcgZm9yIHRoZSBzdWJtZXNzYWdlLgotICAgKgotICAgKiBUT0RPKGhhYmVybWFuKTogSSB0aGluayB3ZSB3YW50IHRvIG1vdmUgdGhpcyBpbnRvIGEgRmllbGRPcHRpb25zIGNvbnRhaW5lcgotICAgKiB3aGVuIHdlIGFkZCBzdXBwb3J0IGZvciBjdXN0b20gb3B0aW9ucyAodGhlIEZpZWxkT3B0aW9ucyBzdHJ1Y3Qgd2lsbAotICAgKiBjb250YWluIGJvdGggcmVndWxhciBGaWVsZE9wdGlvbnMgbGlrZSAibGF6eSIgKmFuZCogY3VzdG9tIG9wdGlvbnMpLiAqLwotICBib29sIGxhenkoKSBjb25zdDsKLQotICAvKiBGb3Igbm9uLXN0cmluZywgbm9uLXN1Ym1lc3NhZ2UgZmllbGRzLCB0aGlzIGluZGljYXRlcyB3aGV0aGVyIGJpbmFyeQotICAgKiBwcm90b2J1ZnMgYXJlIGVuY29kZWQgaW4gcGFja2VkIG9yIG5vbi1wYWNrZWQgZm9ybWF0LgotICAgKgotICAgKiBUT0RPKGhhYmVybWFuKTogc2VlIG5vdGUgYWJvdmUgYWJvdXQgcHV0dGluZyBvcHRpb25zIGxpa2UgdGhpcyBpbnRvIGEKLSAgICogRmllbGRPcHRpb25zIGNvbnRhaW5lci4gKi8KLSAgYm9vbCBwYWNrZWQoKSBjb25zdDsKLQotICAvKiBBbiBpbnRlZ2VyIHRoYXQgY2FuIGJlIHVzZWQgYXMgYW4gaW5kZXggaW50byBhbiBhcnJheSBvZiBmaWVsZHMgZm9yCi0gICAqIHdoYXRldmVyIG1lc3NhZ2UgdGhpcyBmaWVsZCBiZWxvbmdzIHRvLiAgR3VhcmFudGVlZCB0byBiZSBsZXNzIHRoYW4KLSAgICogZi0+Y29udGFpbmluZ190eXBlKCktPmZpZWxkX2NvdW50KCkuICBNYXkgb25seSBiZSBhY2Nlc3NlZCBvbmNlIHRoZSBkZWYgaGFzCi0gICAqIGJlZW4gZmluYWxpemVkLiAqLwotICB1aW50MzJfdCBpbmRleCgpIGNvbnN0OwotCi0gIC8qIFRoZSBNZXNzYWdlRGVmIHRvIHdoaWNoIHRoaXMgZmllbGQgYmVsb25ncy4KLSAgICoKLSAgICogSWYgdGhpcyBmaWVsZCBoYXMgYmVlbiBhZGRlZCB0byBhIE1lc3NhZ2VEZWYsIHRoYXQgbWVzc2FnZSBjYW4gYmUgcmV0cmlldmVkCi0gICAqIGRpcmVjdGx5ICh0aGlzIGlzIGFsd2F5cyB0aGUgY2FzZSBmb3IgZnJvemVuIEZpZWxkRGVmcykuCi0gICAqCi0gICAqIElmIHRoZSBmaWVsZCBoYXMgbm90IHlldCBiZWVuIGFkZGVkIHRvIGEgTWVzc2FnZURlZiwgeW91IGNhbiBzZXQgdGhlIG5hbWUKLSAgICogb2YgdGhlIGNvbnRhaW5pbmcgdHlwZSBzeW1ib2xpY2FsbHkgaW5zdGVhZC4gIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCBmb3IKLSAgICogZXh0ZW5zaW9ucywgd2hlcmUgdGhlIGV4dGVuc2lvbiBpcyBkZWNsYXJlZCBzZXBhcmF0ZWx5IGZyb20gdGhlIG1lc3NhZ2UuICovCi0gIGNvbnN0IE1lc3NhZ2VEZWYqIGNvbnRhaW5pbmdfdHlwZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBjb250YWluaW5nX3R5cGVfbmFtZSgpOwotCi0gIC8qIFRoZSBPbmVvZkRlZiB0byB3aGljaCB0aGlzIGZpZWxkIGJlbG9uZ3MsIG9yIE5VTEwgaWYgdGhpcyBmaWVsZCBpcyBub3QgcGFydAotICAgKiBvZiBhIG9uZW9mLiAqLwotICBjb25zdCBPbmVvZkRlZiogY29udGFpbmluZ19vbmVvZigpIGNvbnN0OwotCi0gIC8qIFRoZSBmaWVsZCdzIHR5cGUgYWNjb3JkaW5nIHRvIHRoZSBlbnVtIGluIGRlc2NyaXB0b3IucHJvdG8uICBUaGlzIGlzIG5vdAotICAgKiB0aGUgc2FtZSBhcyBVUEJfVFlQRV8qLCBiZWNhdXNlIGl0IGRpc3Rpbmd1aXNoZXMgYmV0d2VlbiAoZm9yIGV4YW1wbGUpCi0gICAqIElOVDMyIGFuZCBTSU5UMzIsIHdoZXJlYXMgb3VyICJ0eXBlIiBlbnVtIGRvZXMgbm90LiAgVGhpcyByZXR1cm4gb2YKLSAgICogZGVzY3JpcHRvcl90eXBlKCkgaXMgYSBmdW5jdGlvbiBvZiB0eXBlKCksIGludGVnZXJfZm9ybWF0KCksIGFuZAotICAgKiBpc190YWdfZGVsaW1pdGVkKCkuICBMaWtld2lzZSBzZXRfZGVzY3JpcHRvcl90eXBlKCkgc2V0cyBhbGwgdGhyZWUKLSAgICogYXBwcm9wcmlhdGVseS4gKi8KLSAgRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvcl90eXBlKCkgY29uc3Q7Ci0KLSAgLyogQ29udmVuaWVudCBmaWVsZCB0eXBlIHRlc3RzLiAqLwotICBib29sIElzU3ViTWVzc2FnZSgpIGNvbnN0OwotICBib29sIElzU3RyaW5nKCkgY29uc3Q7Ci0gIGJvb2wgSXNTZXF1ZW5jZSgpIGNvbnN0OwotICBib29sIElzUHJpbWl0aXZlKCkgY29uc3Q7Ci0gIGJvb2wgSXNNYXAoKSBjb25zdDsKLQotICAvKiBXaGV0aGVyIHRoaXMgZmllbGQgbXVzdCBiZSBhYmxlIHRvIGV4cGxpY2l0bHkgcmVwcmVzZW50IHByZXNlbmNlOgotICAgKgotICAgKiAqIFRoaXMgaXMgYWx3YXlzIGZhbHNlIGZvciByZXBlYXRlZCBmaWVsZHMgKGFuIGVtcHR5IHJlcGVhdGVkIGZpZWxkIGlzCi0gICAqICAgZXF1aXZhbGVudCB0byBhIHJlcGVhdGVkIGZpZWxkIHdpdGggemVybyBlbnRyaWVzKS4KLSAgICoKLSAgICogKiBUaGlzIGlzIGFsd2F5cyB0cnVlIGZvciBzdWJtZXNzYWdlcy4KLSAgICoKLSAgICogKiBGb3Igb3RoZXIgZmllbGRzLCBpdCBkZXBlbmRzIG9uIHRoZSBtZXNzYWdlIChzZWUKLSAgICogICBNZXNzYWdlRGVmOjpTZXRQcmltaXRpdmVzSGF2ZVByZXNlbmNlKCkpCi0gICAqLwotICBib29sIEhhc1ByZXNlbmNlKCkgY29uc3Q7Ci0KLSAgLyogSG93IGludGVnZXJzIGFyZSBlbmNvZGVkLiAgT25seSBtZWFuaW5nZnVsIGZvciBpbnRlZ2VyIHR5cGVzLgotICAgKiBEZWZhdWx0cyB0byBVUEJfSU5URk1UX1ZBUklBQkxFLCBhbmQgaXMgcmVzZXQgd2hlbiAidHlwZSIgY2hhbmdlcy4gKi8KLSAgSW50ZWdlckZvcm1hdCBpbnRlZ2VyX2Zvcm1hdCgpIGNvbnN0OwotCi0gIC8qIFdoZXRoZXIgYSBzdWJtZXNzYWdlIGZpZWxkIGlzIHRhZy1kZWxpbWl0ZWQgb3Igbm90IChpZiBmYWxzZSwgdGhlbgotICAgKiBsZW5ndGgtZGVsaW1pdGVkKS4gIE1heSBvbmx5IGJlIHNldCB3aGVuIHR5cGUoKSA9PSBVUEJfVFlQRV9NRVNTQUdFLiAqLwotICBib29sIGlzX3RhZ19kZWxpbWl0ZWQoKSBjb25zdDsKLQotICAvKiBSZXR1cm5zIHRoZSBub24tc3RyaW5nIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGRkZWYsIHdoaWNoIG1heSBlaXRoZXIKLSAgICogYmUgc29tZXRoaW5nIHRoZSBjbGllbnQgc2V0IGV4cGxpY2l0bHkgb3IgdGhlICJkZWZhdWx0IGRlZmF1bHQiICgwIGZvcgotICAgKiBudW1iZXJzLCBlbXB0eSBmb3Igc3RyaW5ncykuICBUaGUgZmllbGQncyB0eXBlIGluZGljYXRlcyB0aGUgdHlwZSBvZiB0aGUKLSAgICogcmV0dXJuZWQgdmFsdWUsIGV4Y2VwdCBmb3IgZW51bSBmaWVsZHMgdGhhdCBhcmUgc3RpbGwgbXV0YWJsZS4KLSAgICoKLSAgICogUmVxdWlyZXMgdGhhdCB0aGUgZ2l2ZW4gZnVuY3Rpb24gbWF0Y2hlcyB0aGUgZmllbGQncyBjdXJyZW50IHR5cGUuICovCi0gIGludDY0X3QgZGVmYXVsdF9pbnQ2NCgpIGNvbnN0OwotICBpbnQzMl90IGRlZmF1bHRfaW50MzIoKSBjb25zdDsKLSAgdWludDY0X3QgZGVmYXVsdF91aW50NjQoKSBjb25zdDsKLSAgdWludDMyX3QgZGVmYXVsdF91aW50MzIoKSBjb25zdDsKLSAgYm9vbCBkZWZhdWx0X2Jvb2woKSBjb25zdDsKLSAgZmxvYXQgZGVmYXVsdF9mbG9hdCgpIGNvbnN0OwotICBkb3VibGUgZGVmYXVsdF9kb3VibGUoKSBjb25zdDsKLQotICAvKiBUaGUgcmVzdWx0aW5nIHN0cmluZyBpcyBhbHdheXMgTlVMTC10ZXJtaW5hdGVkLiAgSWYgbm9uLU5VTEwsIHRoZSBsZW5ndGgKLSAgICogd2lsbCBiZSBzdG9yZWQgaW4gKmxlbi4gKi8KLSAgY29uc3QgY2hhciAqZGVmYXVsdF9zdHJpbmcoc2l6ZV90KiBsZW4pIGNvbnN0OwotCi0gIC8qIEZvciBmcm96ZW4gVVBCX1RZUEVfRU5VTSBmaWVsZHMsIGVudW0gZGVmYXVsdHMgY2FuIGFsd2F5cyBiZSByZWFkIGFzIGVpdGhlcgotICAgKiBzdHJpbmcgb3IgaW50MzIsIGFuZCBib3RoIG9mIHRoZXNlIG1ldGhvZHMgd2lsbCBhbHdheXMgcmV0dXJuIHRydWUuCi0gICAqCi0gICAqIEZvciBtdXRhYmxlIFVQQl9UWVBFX0VOVU0gZmllbGRzLCB0aGUgc3RvcnkgaXMgYSBiaXQgbW9yZSBjb21wbGljYXRlZC4KLSAgICogRW51bSBkZWZhdWx0cyBhcmUgdW51c3VhbC4gVGhleSBjYW4gYmUgc3BlY2lmaWVkIGVpdGhlciBhcyBzdHJpbmcgb3IgaW50MzIsCi0gICAqIGJ1dCB0byBiZSB2YWxpZCB0aGUgZW51bSBtdXN0IGhhdmUgdGhhdCB2YWx1ZSBhcyBhIG1lbWJlci4gIEFuZCBpZiBubwotICAgKiBkZWZhdWx0IGlzIHNwZWNpZmllZCwgdGhlICJkZWZhdWx0IGRlZmF1bHQiIGNvbWVzIGZyb20gdGhlIEVudW1EZWYuCi0gICAqCi0gICAqIFdlIGFsbG93IHJlYWRpbmcgdGhlIGRlZmF1bHQgYXMgZWl0aGVyIGFuIGludDMyIG9yIGEgc3RyaW5nLCBidXQgb25seSBpZgotICAgKiB3ZSBoYXZlIGEgbWVhbmluZ2Z1bCB2YWx1ZSB0byByZXBvcnQuICBXZSBoYXZlIGEgbWVhbmluZ2Z1bCB2YWx1ZSBpZiBpdCB3YXMKLSAgICogc2V0IGV4cGxpY2l0bHksIG9yIGlmIHdlIGNvdWxkIGdldCB0aGUgImRlZmF1bHQgZGVmYXVsdCIgZnJvbSB0aGUgRW51bURlZi4KLSAgICogQWxzbyBpZiB5b3UgZXhwbGljaXRseSBzZXQgdGhlIG5hbWUgYW5kIHdlIGZpbmQgdGhlIG51bWJlciBpbiB0aGUgRW51bURlZiAqLwotICBib29sIEVudW1IYXNTdHJpbmdEZWZhdWx0KCkgY29uc3Q7Ci0gIGJvb2wgRW51bUhhc0ludDMyRGVmYXVsdCgpIGNvbnN0OwotCi0gIC8qIFN1Ym1lc3NhZ2UgYW5kIGVudW0gZmllbGRzIG11c3QgcmVmZXJlbmNlIGEgInN1YmRlZiIsIHdoaWNoIGlzIHRoZQotICAgKiB1cGI6Ok1lc3NhZ2VEZWYgb3IgdXBiOjpFbnVtRGVmIHRoYXQgZGVmaW5lcyB0aGVpciB0eXBlLiAgTm90ZSB0aGF0IHdoZW4KLSAgICogdGhlIEZpZWxkRGVmIGlzIG11dGFibGUgaXQgbWF5IG5vdCBoYXZlIGEgc3ViZGVmICp5ZXQqLCBidXQgdGhpcyBmdW5jdGlvbgotICAgKiBzdGlsbCByZXR1cm5zIHRydWUgdG8gaW5kaWNhdGUgdGhhdCB0aGUgZmllbGQncyB0eXBlIHJlcXVpcmVzIGEgc3ViZGVmLiAqLwotICBib29sIEhhc1N1YkRlZigpIGNvbnN0OwotCi0gIC8qIFJldHVybnMgdGhlIGVudW0gb3Igc3VibWVzc2FnZSBkZWYgZm9yIHRoaXMgZmllbGQsIGlmIGFueS4gIFRoZSBmaWVsZCdzCi0gICAqIHR5cGUgbXVzdCBtYXRjaCAoaWUuIHlvdSBtYXkgb25seSBjYWxsIGVudW1fc3ViZGVmKCkgZm9yIGZpZWxkcyB3aGVyZQotICAgKiB0eXBlKCkgPT0gVVBCX1RZUEVfRU5VTSkuICBSZXR1cm5zIE5VTEwgaWYgdGhlIHN1YmRlZiBoYXMgbm90IGJlZW4gc2V0IG9yCi0gICAqIGlzIGN1cnJlbnRseSBzZXQgc3ltYm9saWNhbGx5LiAqLwotICBjb25zdCBFbnVtRGVmKiBlbnVtX3N1YmRlZigpIGNvbnN0OwotICBjb25zdCBNZXNzYWdlRGVmKiBtZXNzYWdlX3N1YmRlZigpIGNvbnN0OwotCi0gIC8qIFJldHVybnMgdGhlIGdlbmVyaWMgc3ViZGVmIGZvciB0aGlzIGZpZWxkLiAgUmVxdWlyZXMgdGhhdCBIYXNTdWJEZWYoKSAoaWUuCi0gICAqIG9ubHkgd29ya3MgZm9yIFVQQl9UWVBFX0VOVU0gYW5kIFVQQl9UWVBFX01FU1NBR0UgZmllbGRzKS4gKi8KLSAgY29uc3QgRGVmKiBzdWJkZWYoKSBjb25zdDsKLQotICAvKiBSZXR1cm5zIHRoZSBzeW1ib2xpYyBuYW1lIG9mIHRoZSBzdWJkZWYuICBJZiB0aGUgc3ViZGVmIGlzIGN1cnJlbnRseSBzZXQKLSAgICogdW5yZXNvbHZlZCAoaWUuIHNldCBzeW1ib2xpY2FsbHkpIHJldHVybnMgdGhlIHN5bWJvbGljIG5hbWUuICBJZiBpdCBoYXMKLSAgICogYmVlbiByZXNvbHZlZCB0byBhIHNwZWNpZmljIHN1YmRlZiwgcmV0dXJucyB0aGUgbmFtZSBmcm9tIHRoYXQgc3ViZGVmLiAqLwotICBjb25zdCBjaGFyKiBzdWJkZWZfbmFtZSgpIGNvbnN0OwotCi0gIC8qIFNldHRlcnMgKG5vbi1jb25zdCBtZXRob2RzKSwgb25seSB2YWxpZCBmb3IgbXV0YWJsZSBGaWVsZERlZnMhICoqKioqKioqKioqLwotCi0gIGJvb2wgc2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgdXBiOjpTdGF0dXMqIHMpOwotICBib29sIHNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxuYW1lLCB1cGI6OlN0YXR1cyogcyk7Ci0KLSAgLyogVGhpcyBtYXkgb25seSBiZSBjYWxsZWQgaWYgY29udGFpbmluZ190eXBlKCkgPT0gTlVMTCAoaWUuIHRoZSBmaWVsZCBoYXMgbm90Ci0gICAqIGJlZW4gYWRkZWQgdG8gYSBtZXNzYWdlIHlldCkuICovCi0gIGJvb2wgc2V0X2NvbnRhaW5pbmdfdHlwZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIFN0YXR1cyogc3RhdHVzKTsKLSAgYm9vbCBzZXRfY29udGFpbmluZ190eXBlX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFN0YXR1cyogc3RhdHVzKTsKLQotICAvKiBEZWZhdWx0cyB0byBmYWxzZS4gIFdoZW4gd2UgZnJlZXplLCB3ZSBlbnN1cmUgdGhhdCB0aGlzIGNhbiBvbmx5IGJlIHRydWUKLSAgICogZm9yIGxlbmd0aC1kZWxpbWl0ZWQgbWVzc2FnZSBmaWVsZHMuICBQcmlvciB0byBmcmVlemluZyB0aGlzIGNhbiBiZSB0cnVlIG9yCi0gICAqIGZhbHNlIHdpdGggbm8gcmVzdHJpY3Rpb25zLiAqLwotICB2b2lkIHNldF9sYXp5KGJvb2wgbGF6eSk7Ci0KLSAgLyogRGVmYXVsdHMgdG8gdHJ1ZS4gIFNldHMgd2hldGhlciB0aGlzIGZpZWxkIGlzIGVuY29kZWQgaW4gcGFja2VkIGZvcm1hdC4gKi8KLSAgdm9pZCBzZXRfcGFja2VkKGJvb2wgcGFja2VkKTsKLQotICAvKiAidHlwZSIgb3IgImRlc2NyaXB0b3JfdHlwZSIgTVVTVCBiZSBzZXQgZXhwbGljaXRseSBiZWZvcmUgdGhlIGZpZWxkZGVmIGlzCi0gICAqIGZpbmFsaXplZC4gIFRoZXNlIHNldHRlcnMgcmVxdWlyZSB0aGF0IHRoZSBlbnVtIHZhbHVlIGlzIHZhbGlkOyBpZiB0aGUKLSAgICogdmFsdWUgZGlkIG5vdCBjb21lIGRpcmVjdGx5IGZyb20gYW4gZW51bSBjb25zdGFudCwgdGhlIGNhbGxlciBzaG91bGQKLSAgICogdmFsaWRhdGUgaXQgZmlyc3Qgd2l0aCB0aGUgZnVuY3Rpb25zIGFib3ZlIChDaGVja0ZpZWxkVHlwZSgpLCBldGMpLiAqLwotICB2b2lkIHNldF90eXBlKFR5cGUgdHlwZSk7Ci0gIHZvaWQgc2V0X2xhYmVsKExhYmVsIGxhYmVsKTsKLSAgdm9pZCBzZXRfZGVzY3JpcHRvcl90eXBlKERlc2NyaXB0b3JUeXBlIHR5cGUpOwotICB2b2lkIHNldF9pc19leHRlbnNpb24oYm9vbCBpc19leHRlbnNpb24pOwotCi0gIC8qICJudW1iZXIiIGFuZCAibmFtZSIgbXVzdCBiZSBzZXQgYmVmb3JlIHRoZSBGaWVsZERlZiBpcyBhZGRlZCB0byBhCi0gICAqIE1lc3NhZ2VEZWYsIGFuZCBtYXkgbm90IGJlIHNldCBhZnRlciB0aGF0LgotICAgKgotICAgKiAibmFtZSIgaXMgdGhlIHNhbWUgYXMgZnVsbF9uYW1lKCkvc2V0X2Z1bGxfbmFtZSgpLCBidXQgc2luY2UgZmllbGRkZWZzCi0gICAqIG1vc3Qgb2Z0ZW4gdXNlIHNpbXBsZSwgbm9uLXF1YWxpZmllZCBuYW1lcywgd2UgcHJvdmlkZSB0aGlzIGFjY2Vzc29yCi0gICAqIGFsc28uICBHZW5lcmFsbHkgb25seSBleHRlbnNpb25zIHdpbGwgd2FudCB0byB0aGluayBvZiB0aGlzIG5hbWUgYXMKLSAgICogZnVsbHktcXVhbGlmaWVkLiAqLwotICBib29sIHNldF9udW1iZXIodWludDMyX3QgbnVtYmVyLCB1cGI6OlN0YXR1cyogcyk7Ci0gIGJvb2wgc2V0X25hbWUoY29uc3QgY2hhciogbmFtZSwgdXBiOjpTdGF0dXMqIHMpOwotICBib29sIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1cGI6OlN0YXR1cyogcyk7Ci0KLSAgLyogU2V0cyB0aGUgSlNPTiBuYW1lIHRvIHRoZSBnaXZlbiBzdHJpbmcuICovCi0gIC8qIFRPRE8oaGFiZXJtYW4pOiBpbXBsZW1lbnQuICBSaWdodCBub3cgb25seSBkZWZhdWx0IGpzb25fbmFtZSAoY2FtZWxDYXNlKQotICAgKiBpcyBzdXBwb3J0ZWQuICovCi0gIGJvb2wgc2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiBqc29uX25hbWUsIHVwYjo6U3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfanNvbl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCB1cGI6OlN0YXR1cyogcyk7Ci0KLSAgLyogQ2xlYXJzIHRoZSBKU09OIG5hbWUuIFRoaXMgd2lsbCBtYWtlIGl0IHJldmVydCB0byBpdHMgZGVmYXVsdCwgd2hpY2ggaXMKLSAgICogYSBjYW1lbENhc2VkIHZlcnNpb24gb2YgdGhlIHJlZ3VsYXIgZmllbGQgbmFtZS4gKi8KLSAgdm9pZCBjbGVhcl9qc29uX25hbWUoKTsKLQotICB2b2lkIHNldF9pbnRlZ2VyX2Zvcm1hdChJbnRlZ2VyRm9ybWF0IGZvcm1hdCk7Ci0gIGJvb2wgc2V0X3RhZ19kZWxpbWl0ZWQoYm9vbCB0YWdfZGVsaW1pdGVkLCB1cGI6OlN0YXR1cyogcyk7Ci0KLSAgLyogU2V0cyBkZWZhdWx0IHZhbHVlIGZvciB0aGUgZmllbGQuICBUaGUgY2FsbCBtdXN0IGV4YWN0bHkgbWF0Y2ggdGhlIHR5cGUKLSAgICogb2YgdGhlIGZpZWxkLiAgRW51bSBmaWVsZHMgbWF5IHVzZSBlaXRoZXIgc2V0aW50MzIgb3Igc2V0c3RyaW5nIHRvIHNldAotICAgKiB0aGUgZGVmYXVsdCBudW1lcmljYWxseSBvciBzeW1ib2xpY2FsbHksIHJlc3BlY3RpdmVseSwgYnV0IHN5bWJvbGljCi0gICAqIGRlZmF1bHRzIG11c3QgYmUgcmVzb2x2ZWQgYmVmb3JlIGZpbmFsaXppbmcgKHNlZSBSZXNvbHZlRW51bURlZmF1bHQoKSkuCi0gICAqCi0gICAqIENoYW5naW5nIHRoZSB0eXBlIG9mIGEgZmllbGQgd2lsbCByZXNldCBpdHMgZGVmYXVsdC4gKi8KLSAgdm9pZCBzZXRfZGVmYXVsdF9pbnQ2NChpbnQ2NF90IHZhbCk7Ci0gIHZvaWQgc2V0X2RlZmF1bHRfaW50MzIoaW50MzJfdCB2YWwpOwotICB2b2lkIHNldF9kZWZhdWx0X3VpbnQ2NCh1aW50NjRfdCB2YWwpOwotICB2b2lkIHNldF9kZWZhdWx0X3VpbnQzMih1aW50MzJfdCB2YWwpOwotICB2b2lkIHNldF9kZWZhdWx0X2Jvb2woYm9vbCB2YWwpOwotICB2b2lkIHNldF9kZWZhdWx0X2Zsb2F0KGZsb2F0IHZhbCk7Ci0gIHZvaWQgc2V0X2RlZmF1bHRfZG91YmxlKGRvdWJsZSB2YWwpOwotICBib29sIHNldF9kZWZhdWx0X3N0cmluZyhjb25zdCB2b2lkICpzdHIsIHNpemVfdCBsZW4sIFN0YXR1cyAqcyk7Ci0gIGJvb2wgc2V0X2RlZmF1bHRfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nICZzdHIsIFN0YXR1cyAqcyk7Ci0gIHZvaWQgc2V0X2RlZmF1bHRfY3N0cihjb25zdCBjaGFyICpzdHIsIFN0YXR1cyAqcyk7Ci0KLSAgLyogQmVmb3JlIGEgZmllbGRkZWYgaXMgZnJvemVuLCBpdHMgc3ViZGVmIG1heSBiZSBzZXQgZWl0aGVyIGRpcmVjdGx5ICh3aXRoIGEKLSAgICogdXBiOjpEZWYqKSBvciBzeW1ib2xpY2FsbHkuICBTeW1ib2xpYyByZWZzIG11c3QgYmUgcmVzb2x2ZWQgYmVmb3JlIHRoZQotICAgKiBjb250YWluaW5nIG1zZ2RlZiBjYW4gYmUgZnJvemVuIChzZWUgdXBiX3Jlc29sdmUoKSBhYm92ZSkuICB1cGIgYWx3YXlzCi0gICAqIGd1YXJhbnRlZXMgdGhhdCBhbnkgZGVmIHJlYWNoYWJsZSBmcm9tIGEgbGl2ZSBkZWYgd2lsbCBhbHNvIGJlIGtlcHQgYWxpdmUuCi0gICAqCi0gICAqIEJvdGggbWV0aG9kcyByZXF1aXJlIHRoYXQgdXBiX2hhc3N1YmRlZihmKSAoc28gdGhlIHR5cGUgbXVzdCBiZSBzZXQgcHJpb3IKLSAgICogdG8gY2FsbGluZyB0aGVzZSBtZXRob2RzKS4gIFJldHVybnMgZmFsc2UgaWYgdGhpcyBpcyBub3QgdGhlIGNhc2UsIG9yIGlmCi0gICAqIHRoZSBnaXZlbiBzdWJkZWYgaXMgbm90IG9mIHRoZSBjb3JyZWN0IHR5cGUuICBUaGUgc3ViZGVmIGlzIHJlc2V0IGlmIHRoZQotICAgKiBmaWVsZCdzIHR5cGUgaXMgY2hhbmdlZC4gIFRoZSBzdWJkZWYgY2FuIGJlIHNldCB0byBOVUxMIHRvIGNsZWFyIGl0LiAqLwotICBib29sIHNldF9zdWJkZWYoY29uc3QgRGVmKiBzdWJkZWYsIFN0YXR1cyogcyk7Ci0gIGJvb2wgc2V0X2VudW1fc3ViZGVmKGNvbnN0IEVudW1EZWYqIHN1YmRlZiwgU3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfbWVzc2FnZV9zdWJkZWYoY29uc3QgTWVzc2FnZURlZiogc3ViZGVmLCBTdGF0dXMqIHMpOwotICBib29sIHNldF9zdWJkZWZfbmFtZShjb25zdCBjaGFyKiBuYW1lLCBTdGF0dXMqIHMpOwotICBib29sIHNldF9zdWJkZWZfbmFtZShjb25zdCBzdGQ6OnN0cmluZyAmbmFtZSwgU3RhdHVzKiBzKTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKEZpZWxkRGVmLCB1cGI6OkZpZWxkRGVmKQotfTsKLQotIyBlbmRpZiAgLyogZGVmaW5lZChfX2NwbHVzcGx1cykgKi8KLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIE5hdGl2ZSBDIEFQSS4gKi8KLXVwYl9maWVsZGRlZiAqdXBiX2ZpZWxkZGVmX25ldyhjb25zdCB2b2lkICpvd25lcik7Ci11cGJfZmllbGRkZWYgKnVwYl9maWVsZGRlZl9kdXAoY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEluY2x1ZGUgdXBiX3JlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9maWVsZGRlZl9yZWYoKS4gKi8KLVVQQl9SRUZDT1VOVEVEX0NNRVRIT0RTKHVwYl9maWVsZGRlZiwgdXBiX2ZpZWxkZGVmX3VwY2FzdDIpCi0KLS8qIE1ldGhvZHMgZnJvbSB1cGJfZGVmLiAqLwotY29uc3QgY2hhciAqdXBiX2ZpZWxkZGVmX2Z1bGxuYW1lKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRmdWxsbmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX3R5cGVpc3NldChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotdXBiX2ZpZWxkdHlwZV90IHVwYl9maWVsZGRlZl90eXBlKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci11cGJfZGVzY3JpcHRvcnR5cGVfdCB1cGJfZmllbGRkZWZfZGVzY3JpcHRvcnR5cGUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLXVwYl9sYWJlbF90IHVwYl9maWVsZGRlZl9sYWJlbChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotdWludDMyX3QgdXBiX2ZpZWxkZGVmX251bWJlcihjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotY29uc3QgY2hhciAqdXBiX2ZpZWxkZGVmX25hbWUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2lzZXh0ZW5zaW9uKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9sYXp5KGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9wYWNrZWQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLXNpemVfdCB1cGJfZmllbGRkZWZfZ2V0anNvbm5hbWUoY29uc3QgdXBiX2ZpZWxkZGVmICpmLCBjaGFyICpidWYsIHNpemVfdCBsZW4pOwotY29uc3QgdXBiX21zZ2RlZiAqdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmd0eXBlKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1jb25zdCB1cGJfb25lb2ZkZWYgKnVwYl9maWVsZGRlZl9jb250YWluaW5nb25lb2YoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLXVwYl9tc2dkZWYgKnVwYl9maWVsZGRlZl9jb250YWluaW5ndHlwZV9tdXRhYmxlKHVwYl9maWVsZGRlZiAqZik7Ci1jb25zdCBjaGFyICp1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGVuYW1lKHVwYl9maWVsZGRlZiAqZik7Ci11cGJfaW50Zm10X3QgdXBiX2ZpZWxkZGVmX2ludGZtdChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotdWludDMyX3QgdXBiX2ZpZWxkZGVmX2luZGV4KGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9pc3RhZ2RlbGltKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9pc3N1Ym1zZyhjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfaXNzdHJpbmcoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2lzc2VxKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9pc3ByaW1pdGl2ZShjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotYm9vbCB1cGJfZmllbGRkZWZfaXNtYXAoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2hhc3ByZXNlbmNlKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1pbnQ2NF90IHVwYl9maWVsZGRlZl9kZWZhdWx0aW50NjQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWludDMyX3QgdXBiX2ZpZWxkZGVmX2RlZmF1bHRpbnQzMihjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotdWludDY0X3QgdXBiX2ZpZWxkZGVmX2RlZmF1bHR1aW50NjQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLXVpbnQzMl90IHVwYl9maWVsZGRlZl9kZWZhdWx0dWludDMyKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9kZWZhdWx0Ym9vbChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotZmxvYXQgdXBiX2ZpZWxkZGVmX2RlZmF1bHRmbG9hdChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotZG91YmxlIHVwYl9maWVsZGRlZl9kZWZhdWx0ZG91YmxlKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1jb25zdCBjaGFyICp1cGJfZmllbGRkZWZfZGVmYXVsdHN0cihjb25zdCB1cGJfZmllbGRkZWYgKmYsIHNpemVfdCAqbGVuKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2VudW1oYXNkZWZhdWx0aW50MzIoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2VudW1oYXNkZWZhdWx0c3RyKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9maWVsZGRlZl9oYXNzdWJkZWYoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IHVwYl9kZWYgKnVwYl9maWVsZGRlZl9zdWJkZWYoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IHVwYl9tc2dkZWYgKnVwYl9maWVsZGRlZl9tc2dzdWJkZWYoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJfZmllbGRkZWZfZW51bXN1YmRlZihjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotY29uc3QgY2hhciAqdXBiX2ZpZWxkZGVmX3N1YmRlZm5hbWUoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLQotdm9pZCB1cGJfZmllbGRkZWZfc2V0dHlwZSh1cGJfZmllbGRkZWYgKmYsIHVwYl9maWVsZHR5cGVfdCB0eXBlKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlc2NyaXB0b3J0eXBlKHVwYl9maWVsZGRlZiAqZiwgaW50IHR5cGUpOwotdm9pZCB1cGJfZmllbGRkZWZfc2V0bGFiZWwodXBiX2ZpZWxkZGVmICpmLCB1cGJfbGFiZWxfdCBsYWJlbCk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRudW1iZXIodXBiX2ZpZWxkZGVmICpmLCB1aW50MzJfdCBudW1iZXIsIHVwYl9zdGF0dXMgKnMpOwotYm9vbCB1cGJfZmllbGRkZWZfc2V0bmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsIHVwYl9zdGF0dXMgKnMpOwotYm9vbCB1cGJfZmllbGRkZWZfc2V0anNvbm5hbWUodXBiX2ZpZWxkZGVmICpmLCBjb25zdCBjaGFyICpuYW1lLCB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2NsZWFyanNvbm5hbWUodXBiX2ZpZWxkZGVmICpmKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX3NldGNvbnRhaW5pbmd0eXBlbmFtZSh1cGJfZmllbGRkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXRpc2V4dGVuc2lvbih1cGJfZmllbGRkZWYgKmYsIGJvb2wgaXNfZXh0ZW5zaW9uKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGxhenkodXBiX2ZpZWxkZGVmICpmLCBib29sIGxhenkpOwotdm9pZCB1cGJfZmllbGRkZWZfc2V0cGFja2VkKHVwYl9maWVsZGRlZiAqZiwgYm9vbCBwYWNrZWQpOwotdm9pZCB1cGJfZmllbGRkZWZfc2V0aW50Zm10KHVwYl9maWVsZGRlZiAqZiwgdXBiX2ludGZtdF90IGZtdCk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXR0YWdkZWxpbSh1cGJfZmllbGRkZWYgKmYsIGJvb2wgdGFnX2RlbGltKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQ2NCh1cGJfZmllbGRkZWYgKmYsIGludDY0X3QgdmFsKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQzMih1cGJfZmllbGRkZWYgKmYsIGludDMyX3QgdmFsKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50NjQodXBiX2ZpZWxkZGVmICpmLCB1aW50NjRfdCB2YWwpOwotdm9pZCB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdHVpbnQzMih1cGJfZmllbGRkZWYgKmYsIHVpbnQzMl90IHZhbCk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbCh1cGJfZmllbGRkZWYgKmYsIGJvb2wgdmFsKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRmbG9hdCh1cGJfZmllbGRkZWYgKmYsIGZsb2F0IHZhbCk7Ci12b2lkIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0ZG91YmxlKHVwYl9maWVsZGRlZiAqZiwgZG91YmxlIHZhbCk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0c3RyKHVwYl9maWVsZGRlZiAqZiwgY29uc3Qgdm9pZCAqc3RyLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLXZvaWQgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRjc3RyKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgY2hhciAqc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRzdWJkZWYodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRtc2dzdWJkZWYodXBiX2ZpZWxkZGVmICpmLCBjb25zdCB1cGJfbXNnZGVmICpzdWJkZWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRlbnVtc3ViZGVmKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgdXBiX2VudW1kZWYgKnN1YmRlZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKHVwYl9maWVsZGRlZiAqZiwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci0KLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNrbGFiZWwoaW50MzJfdCBsYWJlbCk7Ci1ib29sIHVwYl9maWVsZGRlZl9jaGVja3R5cGUoaW50MzJfdCB0eXBlKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNrZGVzY3JpcHRvcnR5cGUoaW50MzJfdCB0eXBlKTsKLWJvb2wgdXBiX2ZpZWxkZGVmX2NoZWNraW50Zm10KGludDMyX3QgZm10KTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0KLS8qIHVwYjo6TWVzc2FnZURlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXR5cGVkZWYgdXBiX2ludHRhYmxlX2l0ZXIgdXBiX21zZ19maWVsZF9pdGVyOwotdHlwZWRlZiB1cGJfc3RydGFibGVfaXRlciB1cGJfbXNnX29uZW9mX2l0ZXI7Ci0KLS8qIFdlbGwta25vd24gZmllbGQgdGFnIG51bWJlcnMgZm9yIG1hcC1lbnRyeSBtZXNzYWdlcy4gKi8KLSNkZWZpbmUgVVBCX01BUEVOVFJZX0tFWSAgIDEKLSNkZWZpbmUgVVBCX01BUEVOVFJZX1ZBTFVFIDIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyBhIHNpbmdsZSAucHJvdG8gbWVzc2FnZSB0eXBlLgotICoKLSAqIEl0cyBiYXNlIGNsYXNzIGlzIHVwYjo6RGVmICh1c2UgdXBiOjp1cGNhc3QoKSB0byBjb252ZXJ0KS4gKi8KLWNsYXNzIHVwYjo6TWVzc2FnZURlZiB7Ci0gcHVibGljOgotICAvKiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxNZXNzYWdlRGVmPiBOZXcoKTsKLQotICAvKiB1cGI6OlJlZkNvdW50ZWQgbWV0aG9kcyBsaWtlIFJlZigpL1VucmVmKCkuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBGdW5jdGlvbmFsaXR5IGZyb20gdXBiOjpEZWYuICovCi0gIGNvbnN0IGNoYXIqIGZ1bGxfbmFtZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGJvb2wgc2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgU3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfZnVsbF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsbmFtZSwgU3RhdHVzKiBzKTsKLQotICAvKiBDYWxsIHRvIGZyZWV6ZSB0aGlzIE1lc3NhZ2VEZWYuCi0gICAqIFdBUk5JTkc6IHRoaXMgd2lsbCBmYWlsIGlmIHRoaXMgbWVzc2FnZSBoYXMgYW55IHVuZnJvemVuIHN1Ym1lc3NhZ2VzIQotICAgKiBNZXNzYWdlcyB3aXRoIGN5Y2xlcyBtdXN0IGJlIGZyb3plbiBhcyBhIGJhdGNoIHVzaW5nIHVwYjo6RGVmOjpGcmVlemUoKS4gKi8KLSAgYm9vbCBGcmVlemUoU3RhdHVzKiBzKTsKLQotICAvKiBUaGUgbnVtYmVyIG9mIGZpZWxkcyB0aGF0IGJlbG9uZyB0byB0aGUgTWVzc2FnZURlZi4gKi8KLSAgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7Ci0KLSAgLyogVGhlIG51bWJlciBvZiBvbmVvZnMgdGhhdCBiZWxvbmcgdG8gdGhlIE1lc3NhZ2VEZWYuICovCi0gIGludCBvbmVvZl9jb3VudCgpIGNvbnN0OwotCi0gIC8qIEFkZHMgYSBmaWVsZCAodXBiX2ZpZWxkZGVmIG9iamVjdCkgdG8gYSBtc2dkZWYuICBSZXF1aXJlcyB0aGF0IHRoZSBtc2dkZWYKLSAgICogYW5kIHRoZSBmaWVsZGRlZnMgYXJlIG11dGFibGUuICBUaGUgZmllbGRkZWYncyBuYW1lIGFuZCBudW1iZXIgbXVzdCBiZQotICAgKiBzZXQsIGFuZCB0aGUgbWVzc2FnZSBtYXkgbm90IGFscmVhZHkgY29udGFpbiBhbnkgZmllbGQgd2l0aCB0aGlzIG5hbWUgb3IKLSAgICogbnVtYmVyLCBhbmQgdGhpcyBmaWVsZGRlZiBtYXkgbm90IGJlIHBhcnQgb2YgYW5vdGhlciBtZXNzYWdlLiAgSW4gZXJyb3IKLSAgICogY2FzZXMgZmFsc2UgaXMgcmV0dXJuZWQgYW5kIHRoZSBtc2dkZWYgaXMgdW5jaGFuZ2VkLgotICAgKgotICAgKiBJZiB0aGUgZ2l2ZW4gZmllbGQgaXMgcGFydCBvZiBhIG9uZW9mLCB0aGlzIGNhbGwgc3VjY2VlZHMgaWYgYW5kIG9ubHkgaWYKLSAgICogdGhhdCBvbmVvZiBpcyBhbHJlYWR5IHBhcnQgb2YgdGhpcyBtc2dkZWYuIChOb3RlIHRoYXQgYWRkaW5nIGEgb25lb2YgdG8gYQotICAgKiBtc2dkZWYgYXV0b21hdGljYWxseSBhZGRzIGFsbCBvZiBpdHMgZmllbGRzIHRvIHRoZSBtc2dkZWYgYXQgdGhlIHRpbWUgdGhhdAotICAgKiB0aGUgb25lb2YgaXMgYWRkZWQsIHNvIGl0IGlzIHVzdWFsbHkgbW9yZSBpZGlvbWF0aWMgdG8gYWRkIHRoZSBvbmVvZidzCi0gICAqIGZpZWxkcyBmaXJzdCB0aGVuIGFkZCB0aGUgb25lb2YgdG8gdGhlIG1zZ2RlZi4gVGhpcyBjYXNlIGlzIHN1cHBvcnRlZCBmb3IKLSAgICogY29udmVuaWVuY2UuKQotICAgKgotICAgKiBJZiB8ZnwgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoaXMgTWVzc2FnZURlZiwgdGhpcyBtZXRob2QgcGVyZm9ybXMgbm8gYWN0aW9uCi0gICAqIGFuZCByZXR1cm5zIHRydWUgKHN1Y2Nlc3MpLiBUaHVzLCB0aGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiAqLwotICBib29sIEFkZEZpZWxkKEZpZWxkRGVmKiBmLCBTdGF0dXMqIHMpOwotICBib29sIEFkZEZpZWxkKGNvbnN0IHJlZmZlZF9wdHI8RmllbGREZWY+JiBmLCBTdGF0dXMqIHMpOwotCi0gIC8qIEFkZHMgYSBvbmVvZiAodXBiX29uZW9mZGVmIG9iamVjdCkgdG8gYSBtc2dkZWYuIFJlcXVpcmVzIHRoYXQgdGhlIG1zZ2RlZiwKLSAgICogb25lb2YsIGFuZCBhbnkgZmllbGRkZWZzIGFyZSBtdXRhYmxlLCB0aGF0IHRoZSBmaWVsZGRlZnMgY29udGFpbmVkIGluIHRoZQotICAgKiBvbmVvZiBkbyBub3QgaGF2ZSBhbnkgbmFtZSBvciBudW1iZXIgY29uZmxpY3RzIHdpdGggZXhpc3RpbmcgZmllbGRzIGluIHRoZQotICAgKiBtc2dkZWYsIGFuZCB0aGF0IHRoZSBvbmVvZidzIG5hbWUgaXMgdW5pcXVlIGFtb25nIGFsbCBvbmVvZnMgaW4gdGhlIG1zZ2RlZi4KLSAgICogSWYgdGhlIG9uZW9mIGlzIGFkZGVkIHN1Y2Nlc3NmdWxseSwgYWxsIG9mIGl0cyBmaWVsZHMgd2lsbCBiZSBhZGRlZAotICAgKiBkaXJlY3RseSB0byB0aGUgbXNnZGVmIGFzIHdlbGwuIEluIGVycm9yIGNhc2VzLCBmYWxzZSBpcyByZXR1cm5lZCBhbmQgdGhlCi0gICAqIG1zZ2RlZiBpcyB1bmNoYW5nZWQuICovCi0gIGJvb2wgQWRkT25lb2YoT25lb2ZEZWYqIG8sIFN0YXR1cyogcyk7Ci0gIGJvb2wgQWRkT25lb2YoY29uc3QgcmVmZmVkX3B0cjxPbmVvZkRlZj4mIG8sIFN0YXR1cyogcyk7Ci0KLSAgdXBiX3N5bnRheF90IHN5bnRheCgpIGNvbnN0OwotCi0gIC8qIFJldHVybnMgZmFsc2UgaWYgd2UgZG9uJ3Qgc3VwcG9ydCB0aGlzIHN5bnRheCB2YWx1ZS4gKi8KLSAgYm9vbCBzZXRfc3ludGF4KHVwYl9zeW50YXhfdCBzeW50YXgpOwotCi0gIC8qIFNldCB0aGlzIHRvIGZhbHNlIHRvIGluZGljYXRlIHRoYXQgcHJpbWl0aXZlIGZpZWxkcyBzaG91bGQgbm90IGhhdmUKLSAgICogZXhwbGljaXQgcHJlc2VuY2UgaW5mb3JtYXRpb24gYXNzb2NpYXRlZCB3aXRoIHRoZW0uICBUaGlzIHdpbGwgYWZmZWN0IGFsbAotICAgKiBmaWVsZHMgYWRkZWQgdG8gdGhpcyBtZXNzYWdlLiAgRGVmYXVsdHMgdG8gdHJ1ZS4gKi8KLSAgdm9pZCBTZXRQcmltaXRpdmVzSGF2ZVByZXNlbmNlKGJvb2wgaGF2ZV9wcmVzZW5jZSk7Ci0KLSAgLyogVGhlc2UgcmV0dXJuIE5VTEwgaWYgdGhlIGZpZWxkIGlzIG5vdCBmb3VuZC4gKi8KLSAgRmllbGREZWYqIEZpbmRGaWVsZEJ5TnVtYmVyKHVpbnQzMl90IG51bWJlcik7Ci0gIEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbik7Ci0gIGNvbnN0IEZpZWxkRGVmKiBGaW5kRmllbGRCeU51bWJlcih1aW50MzJfdCBudW1iZXIpIGNvbnN0OwotICBjb25zdCBGaWVsZERlZiogRmluZEZpZWxkQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBsZW4pIGNvbnN0OwotCi0KLSAgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBjaGFyICpuYW1lKSB7Ci0gICAgcmV0dXJuIEZpbmRGaWVsZEJ5TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOwotICB9Ci0gIGNvbnN0IEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciAqbmFtZSkgY29uc3QgewotICAgIHJldHVybiBGaW5kRmllbGRCeU5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBGaWVsZERlZiogRmluZEZpZWxkQnlOYW1lKGNvbnN0IFQmIHN0cikgewotICAgIHJldHVybiBGaW5kRmllbGRCeU5hbWUoc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOwotICB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBjb25zdCBGaWVsZERlZiogRmluZEZpZWxkQnlOYW1lKGNvbnN0IFQmIHN0cikgY29uc3QgewotICAgIHJldHVybiBGaW5kRmllbGRCeU5hbWUoc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOwotICB9Ci0KLSAgT25lb2ZEZWYqIEZpbmRPbmVvZkJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbGVuKTsKLSAgY29uc3QgT25lb2ZEZWYqIEZpbmRPbmVvZkJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbGVuKSBjb25zdDsKLQotICBPbmVvZkRlZiogRmluZE9uZW9mQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUpIHsKLSAgICByZXR1cm4gRmluZE9uZW9mQnlOYW1lKG5hbWUsIHN0cmxlbihuYW1lKSk7Ci0gIH0KLSAgY29uc3QgT25lb2ZEZWYqIEZpbmRPbmVvZkJ5TmFtZShjb25zdCBjaGFyKiBuYW1lKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZpbmRPbmVvZkJ5TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOwotICB9Ci0KLSAgdGVtcGxhdGU8Y2xhc3MgVD4KLSAgT25lb2ZEZWYqIEZpbmRPbmVvZkJ5TmFtZShjb25zdCBUJiBzdHIpIHsKLSAgICByZXR1cm4gRmluZE9uZW9mQnlOYW1lKHN0ci5jX3N0cigpLCBzdHIuc2l6ZSgpKTsKLSAgfQotICB0ZW1wbGF0ZTxjbGFzcyBUPgotICBjb25zdCBPbmVvZkRlZiogRmluZE9uZW9mQnlOYW1lKGNvbnN0IFQmIHN0cikgY29uc3QgewotICAgIHJldHVybiBGaW5kT25lb2ZCeU5hbWUoc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOwotICB9Ci0KLSAgLyogUmV0dXJucyBhIG5ldyBtc2dkZWYgdGhhdCBpcyBhIGNvcHkgb2YgdGhlIGdpdmVuIG1zZ2RlZiAoYW5kIGEgY29weSBvZiBhbGwKLSAgICogdGhlIGZpZWxkcykgYnV0IHdpdGggYW55IHJlZmVyZW5jZXMgdG8gc3VibWVzc2FnZXMgYnJva2VuIGFuZCByZXBsYWNlZAotICAgKiB3aXRoIGp1c3QgdGhlIG5hbWUgb2YgdGhlIHN1Ym1lc3NhZ2UuICBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24KLSAgICogZmFpbGVkLgotICAgKgotICAgKiBUT0RPKGhhYmVybWFuKTogd2hpY2ggaXMgbW9yZSB1c2VmdWwsIGtlZXBpbmcgZmllbGRzIHJlc29sdmVkIG9yCi0gICAqIHVucmVzb2x2aW5nIHRoZW0/ICBJZiB0aGVyZSdzIG5vIG9idmlvdXMgYW5zd2VyLCBTaG91bGQgdGhpcyBmdW5jdGlvbmFsaXR5Ci0gICAqIGp1c3QgYmUgbW92ZWQgaW50byBzeW10YWIuYz8gKi8KLSAgTWVzc2FnZURlZiogRHVwKGNvbnN0IHZvaWQqIG93bmVyKSBjb25zdDsKLQotICAvKiBJcyB0aGlzIG1lc3NhZ2UgYSBtYXAgZW50cnk/ICovCi0gIHZvaWQgc2V0bWFwZW50cnkoYm9vbCBtYXBfZW50cnkpOwotICBib29sIG1hcGVudHJ5KCkgY29uc3Q7Ci0KLSAgLyogSXRlcmF0aW9uIG92ZXIgZmllbGRzLiAgVGhlIG9yZGVyIGlzIHVuZGVmaW5lZC4gKi8KLSAgY2xhc3MgZmllbGRfaXRlcmF0b3IKLSAgICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgRmllbGREZWYqPiB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgZmllbGRfaXRlcmF0b3IoTWVzc2FnZURlZiogbWQpOwotICAgIHN0YXRpYyBmaWVsZF9pdGVyYXRvciBlbmQoTWVzc2FnZURlZiogbWQpOwotCi0gICAgdm9pZCBvcGVyYXRvcisrKCk7Ci0gICAgRmllbGREZWYqIG9wZXJhdG9yKigpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBmaWVsZF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBmaWVsZF9pdGVyYXRvciYgb3RoZXIpIGNvbnN0OwotCi0gICBwcml2YXRlOgotICAgIHVwYl9tc2dfZmllbGRfaXRlciBpdGVyXzsKLSAgfTsKLQotICBjbGFzcyBjb25zdF9maWVsZF9pdGVyYXRvcgotICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb25zdCBGaWVsZERlZio+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBjb25zdF9maWVsZF9pdGVyYXRvcihjb25zdCBNZXNzYWdlRGVmKiBtZCk7Ci0gICAgc3RhdGljIGNvbnN0X2ZpZWxkX2l0ZXJhdG9yIGVuZChjb25zdCBNZXNzYWdlRGVmKiBtZCk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yKysoKTsKLSAgICBjb25zdCBGaWVsZERlZiogb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X2ZpZWxkX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X2ZpZWxkX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgdXBiX21zZ19maWVsZF9pdGVyIGl0ZXJfOwotICB9OwotCi0gIC8qIEl0ZXJhdGlvbiBvdmVyIG9uZW9mcy4gVGhlIG9yZGVyIGlzIHVuZGVmaW5lZC4gKi8KLSAgY2xhc3Mgb25lb2ZfaXRlcmF0b3IKLSAgICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZywgRmllbGREZWYqPiB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgb25lb2ZfaXRlcmF0b3IoTWVzc2FnZURlZiogbWQpOwotICAgIHN0YXRpYyBvbmVvZl9pdGVyYXRvciBlbmQoTWVzc2FnZURlZiogbWQpOwotCi0gICAgdm9pZCBvcGVyYXRvcisrKCk7Ci0gICAgT25lb2ZEZWYqIG9wZXJhdG9yKigpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBvbmVvZl9pdGVyYXRvciYgb3RoZXIpIGNvbnN0OwotICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBvbmVvZl9pdGVyYXRvciYgb3RoZXIpIGNvbnN0OwotCi0gICBwcml2YXRlOgotICAgIHVwYl9tc2dfb25lb2ZfaXRlciBpdGVyXzsKLSAgfTsKLQotICBjbGFzcyBjb25zdF9vbmVvZl9pdGVyYXRvcgotICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb25zdCBGaWVsZERlZio+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBjb25zdF9vbmVvZl9pdGVyYXRvcihjb25zdCBNZXNzYWdlRGVmKiBtZCk7Ci0gICAgc3RhdGljIGNvbnN0X29uZW9mX2l0ZXJhdG9yIGVuZChjb25zdCBNZXNzYWdlRGVmKiBtZCk7Ci0KLSAgICB2b2lkIG9wZXJhdG9yKysoKTsKLSAgICBjb25zdCBPbmVvZkRlZiogb3BlcmF0b3IqKCkgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IGNvbnN0X29uZW9mX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0gICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNvbnN0X29uZW9mX2l0ZXJhdG9yJiBvdGhlcikgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgdXBiX21zZ19vbmVvZl9pdGVyIGl0ZXJfOwotICB9OwotCi0gIGNsYXNzIEZpZWxkQWNjZXNzb3IgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IEZpZWxkQWNjZXNzb3IoTWVzc2FnZURlZiogbXNnKSA6IG1zZ18obXNnKSB7fQotICAgIGZpZWxkX2l0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbXNnXy0+ZmllbGRfYmVnaW4oKTsgfQotICAgIGZpZWxkX2l0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1zZ18tPmZpZWxkX2VuZCgpOyB9Ci0gICBwcml2YXRlOgotICAgIE1lc3NhZ2VEZWYqIG1zZ187Ci0gIH07Ci0KLSAgY2xhc3MgQ29uc3RGaWVsZEFjY2Vzc29yIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBDb25zdEZpZWxkQWNjZXNzb3IoY29uc3QgTWVzc2FnZURlZiogbXNnKSA6IG1zZ18obXNnKSB7fQotICAgIGNvbnN0X2ZpZWxkX2l0ZXJhdG9yIGJlZ2luKCkgeyByZXR1cm4gbXNnXy0+ZmllbGRfYmVnaW4oKTsgfQotICAgIGNvbnN0X2ZpZWxkX2l0ZXJhdG9yIGVuZCgpIHsgcmV0dXJuIG1zZ18tPmZpZWxkX2VuZCgpOyB9Ci0gICBwcml2YXRlOgotICAgIGNvbnN0IE1lc3NhZ2VEZWYqIG1zZ187Ci0gIH07Ci0KLSAgY2xhc3MgT25lb2ZBY2Nlc3NvciB7Ci0gICBwdWJsaWM6Ci0gICAgZXhwbGljaXQgT25lb2ZBY2Nlc3NvcihNZXNzYWdlRGVmKiBtc2cpIDogbXNnXyhtc2cpIHt9Ci0gICAgb25lb2ZfaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtc2dfLT5vbmVvZl9iZWdpbigpOyB9Ci0gICAgb25lb2ZfaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbXNnXy0+b25lb2ZfZW5kKCk7IH0KLSAgIHByaXZhdGU6Ci0gICAgTWVzc2FnZURlZiogbXNnXzsKLSAgfTsKLQotICBjbGFzcyBDb25zdE9uZW9mQWNjZXNzb3IgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IENvbnN0T25lb2ZBY2Nlc3Nvcihjb25zdCBNZXNzYWdlRGVmKiBtc2cpIDogbXNnXyhtc2cpIHt9Ci0gICAgY29uc3Rfb25lb2ZfaXRlcmF0b3IgYmVnaW4oKSB7IHJldHVybiBtc2dfLT5vbmVvZl9iZWdpbigpOyB9Ci0gICAgY29uc3Rfb25lb2ZfaXRlcmF0b3IgZW5kKCkgeyByZXR1cm4gbXNnXy0+b25lb2ZfZW5kKCk7IH0KLSAgIHByaXZhdGU6Ci0gICAgY29uc3QgTWVzc2FnZURlZiogbXNnXzsKLSAgfTsKLQotICBmaWVsZF9pdGVyYXRvciBmaWVsZF9iZWdpbigpOwotICBmaWVsZF9pdGVyYXRvciBmaWVsZF9lbmQoKTsKLSAgY29uc3RfZmllbGRfaXRlcmF0b3IgZmllbGRfYmVnaW4oKSBjb25zdDsKLSAgY29uc3RfZmllbGRfaXRlcmF0b3IgZmllbGRfZW5kKCkgY29uc3Q7Ci0KLSAgb25lb2ZfaXRlcmF0b3Igb25lb2ZfYmVnaW4oKTsKLSAgb25lb2ZfaXRlcmF0b3Igb25lb2ZfZW5kKCk7Ci0gIGNvbnN0X29uZW9mX2l0ZXJhdG9yIG9uZW9mX2JlZ2luKCkgY29uc3Q7Ci0gIGNvbnN0X29uZW9mX2l0ZXJhdG9yIG9uZW9mX2VuZCgpIGNvbnN0OwotCi0gIEZpZWxkQWNjZXNzb3IgZmllbGRzKCkgeyByZXR1cm4gRmllbGRBY2Nlc3Nvcih0aGlzKTsgfQotICBDb25zdEZpZWxkQWNjZXNzb3IgZmllbGRzKCkgY29uc3QgeyByZXR1cm4gQ29uc3RGaWVsZEFjY2Vzc29yKHRoaXMpOyB9Ci0gIE9uZW9mQWNjZXNzb3Igb25lb2ZzKCkgeyByZXR1cm4gT25lb2ZBY2Nlc3Nvcih0aGlzKTsgfQotICBDb25zdE9uZW9mQWNjZXNzb3Igb25lb2ZzKCkgY29uc3QgeyByZXR1cm4gQ29uc3RPbmVvZkFjY2Vzc29yKHRoaXMpOyB9Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhNZXNzYWdlRGVmLCB1cGI6Ok1lc3NhZ2VEZWYpCi19OwotCi0jZW5kaWYgIC8qIF9fY3BsdXNwbHVzICovCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotdXBiX21zZ2RlZiAqdXBiX21zZ2RlZl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpOwotCi0vKiBJbmNsdWRlIHVwYl9yZWZjb3VudGVkIG1ldGhvZHMgbGlrZSB1cGJfbXNnZGVmX3JlZigpLiAqLwotVVBCX1JFRkNPVU5URURfQ01FVEhPRFModXBiX21zZ2RlZiwgdXBiX21zZ2RlZl91cGNhc3QyKQotCi1ib29sIHVwYl9tc2dkZWZfZnJlZXplKHVwYl9tc2dkZWYgKm0sIHVwYl9zdGF0dXMgKnN0YXR1cyk7Ci0KLXVwYl9tc2dkZWYgKnVwYl9tc2dkZWZfZHVwKGNvbnN0IHVwYl9tc2dkZWYgKm0sIGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IGNoYXIgKnVwYl9tc2dkZWZfZnVsbG5hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSk7Ci1jb25zdCBjaGFyICp1cGJfbXNnZGVmX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSk7Ci1pbnQgdXBiX21zZ2RlZl9udW1vbmVvZnMoY29uc3QgdXBiX21zZ2RlZiAqbSk7Ci11cGJfc3ludGF4X3QgdXBiX21zZ2RlZl9zeW50YXgoY29uc3QgdXBiX21zZ2RlZiAqbSk7Ci0KLWJvb2wgdXBiX21zZ2RlZl9hZGRmaWVsZCh1cGJfbXNnZGVmICptLCB1cGJfZmllbGRkZWYgKmYsIGNvbnN0IHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX21zZ2RlZl9hZGRvbmVvZih1cGJfbXNnZGVmICptLCB1cGJfb25lb2ZkZWYgKm8sIGNvbnN0IHZvaWQgKnJlZl9kb25vciwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX21zZ2RlZl9zZXRmdWxsbmFtZSh1cGJfbXNnZGVmICptLCBjb25zdCBjaGFyICpmdWxsbmFtZSwgdXBiX3N0YXR1cyAqcyk7Ci12b2lkIHVwYl9tc2dkZWZfc2V0bWFwZW50cnkodXBiX21zZ2RlZiAqbSwgYm9vbCBtYXBfZW50cnkpOwotYm9vbCB1cGJfbXNnZGVmX21hcGVudHJ5KGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotYm9vbCB1cGJfbXNnZGVmX3NldHN5bnRheCh1cGJfbXNnZGVmICptLCB1cGJfc3ludGF4X3Qgc3ludGF4KTsKLQotLyogRmllbGQgbG9va3VwIGluIGEgY291cGxlIG9mIGRpZmZlcmVudCB2YXJpYXRpb25zOgotICogICAtIGl0b2YgPSBpbnQgdG8gZmllbGQKLSAqICAgLSBudG9mID0gbmFtZSB0byBmaWVsZAotICogICAtIG50b2Z6ID0gbmFtZSB0byBmaWVsZCwgbnVsbC10ZXJtaW5hdGVkIHN0cmluZy4gKi8KLWNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX21zZ2RlZl9pdG9mKGNvbnN0IHVwYl9tc2dkZWYgKm0sIHVpbnQzMl90IGkpOwotY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJfbXNnZGVmX250b2YoY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOwotaW50IHVwYl9tc2dkZWZfbnVtZmllbGRzKGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotCi1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiX21zZ2RlZl9udG9meihjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSkgewotICByZXR1cm4gdXBiX21zZ2RlZl9udG9mKG0sIG5hbWUsIHN0cmxlbihuYW1lKSk7Ci19Ci0KLVVQQl9JTkxJTkUgdXBiX2ZpZWxkZGVmICp1cGJfbXNnZGVmX2l0b2ZfbXV0YWJsZSh1cGJfbXNnZGVmICptLCB1aW50MzJfdCBpKSB7Ci0gIHJldHVybiAodXBiX2ZpZWxkZGVmKil1cGJfbXNnZGVmX2l0b2YobSwgaSk7Ci19Ci0KLVVQQl9JTkxJTkUgdXBiX2ZpZWxkZGVmICp1cGJfbXNnZGVmX250b2ZfbXV0YWJsZSh1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW4pIHsKLSAgcmV0dXJuICh1cGJfZmllbGRkZWYgKil1cGJfbXNnZGVmX250b2YobSwgbmFtZSwgbGVuKTsKLX0KLQotLyogT25lb2YgbG9va3VwOgotICogICAtIG50b28gPSBuYW1lIHRvIG9uZW9mCi0gKiAgIC0gbnRvb3ogPSBuYW1lIHRvIG9uZW9mLCBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLiAqLwotY29uc3QgdXBiX29uZW9mZGVmICp1cGJfbXNnZGVmX250b28oY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBsZW4pOwotaW50IHVwYl9tc2dkZWZfbnVtb25lb2ZzKGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotCi1VUEJfSU5MSU5FIGNvbnN0IHVwYl9vbmVvZmRlZiAqdXBiX21zZ2RlZl9udG9veihjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lKSB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX250b28obSwgbmFtZSwgc3RybGVuKG5hbWUpKTsKLX0KLQotVVBCX0lOTElORSB1cGJfb25lb2ZkZWYgKnVwYl9tc2dkZWZfbnRvb19tdXRhYmxlKHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbikgewotICByZXR1cm4gKHVwYl9vbmVvZmRlZiAqKXVwYl9tc2dkZWZfbnRvbyhtLCBuYW1lLCBsZW4pOwotfQotCi0vKiBMb29rdXAgb2YgZWl0aGVyIGZpZWxkIG9yIG9uZW9mIGJ5IG5hbWUuICBSZXR1cm5zIHdoZXRoZXIgZWl0aGVyIHdhcyBmb3VuZC4KLSAqIElmIHRoZSByZXR1cm4gaXMgdHJ1ZSwgdGhlbiB0aGUgZm91bmQgZGVmIHdpbGwgYmUgc2V0LCBhbmQgdGhlIG5vbi1mb3VuZAotICogb25lIHNldCB0byBOVUxMLiAqLwotYm9vbCB1cGJfbXNnZGVmX2xvb2t1cG5hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9maWVsZGRlZiAqKmYsIGNvbnN0IHVwYl9vbmVvZmRlZiAqKm8pOwotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX21zZ2RlZl9sb29rdXBuYW1leihjb25zdCB1cGJfbXNnZGVmICptLCBjb25zdCBjaGFyICpuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmICoqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9vbmVvZmRlZiAqKm8pIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfbG9va3VwbmFtZShtLCBuYW1lLCBzdHJsZW4obmFtZSksIGYsIG8pOwotfQotCi0vKiBJdGVyYXRpb24gb3ZlciBmaWVsZHMgYW5kIG9uZW9mcy4gIEZvciBleGFtcGxlOgotICoKLSAqIHVwYl9tc2dfZmllbGRfaXRlciBpOwotICogZm9yKHVwYl9tc2dfZmllbGRfYmVnaW4oJmksIG0pOwotICogICAgICF1cGJfbXNnX2ZpZWxkX2RvbmUoJmkpOwotICogICAgIHVwYl9tc2dfZmllbGRfbmV4dCgmaSkpIHsKLSAqICAgdXBiX2ZpZWxkZGVmICpmID0gdXBiX21zZ19pdGVyX2ZpZWxkKCZpKTsKLSAqICAgLy8gLi4uCi0gKiB9Ci0gKgotICogRm9yIEMgd2UgZG9uJ3QgaGF2ZSBzZXBhcmF0ZSBpdGVyYXRvcnMgZm9yIGNvbnN0IGFuZCBub24tY29uc3QuCi0gKiBJdCBpcyB0aGUgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gY2FzdCB0aGUgdXBiX2ZpZWxkZGVmKiB0bwotICogY29uc3QgaWYgdGhlIHVwYl9tc2dkZWYqIGlzIGNvbnN0LiAqLwotdm9pZCB1cGJfbXNnX2ZpZWxkX2JlZ2luKHVwYl9tc2dfZmllbGRfaXRlciAqaXRlciwgY29uc3QgdXBiX21zZ2RlZiAqbSk7Ci12b2lkIHVwYl9tc2dfZmllbGRfbmV4dCh1cGJfbXNnX2ZpZWxkX2l0ZXIgKml0ZXIpOwotYm9vbCB1cGJfbXNnX2ZpZWxkX2RvbmUoY29uc3QgdXBiX21zZ19maWVsZF9pdGVyICppdGVyKTsKLXVwYl9maWVsZGRlZiAqdXBiX21zZ19pdGVyX2ZpZWxkKGNvbnN0IHVwYl9tc2dfZmllbGRfaXRlciAqaXRlcik7Ci12b2lkIHVwYl9tc2dfZmllbGRfaXRlcl9zZXRkb25lKHVwYl9tc2dfZmllbGRfaXRlciAqaXRlcik7Ci0KLS8qIFNpbWlsYXIgdG8gYWJvdmUsIHdlIGFsc28gc3VwcG9ydCBpdGVyYXRpbmcgdGhyb3VnaCB0aGUgb25lb2ZzIGluIGEKLSAqIG1zZ2RlZi4gKi8KLXZvaWQgdXBiX21zZ19vbmVvZl9iZWdpbih1cGJfbXNnX29uZW9mX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9tc2dkZWYgKm0pOwotdm9pZCB1cGJfbXNnX29uZW9mX25leHQodXBiX21zZ19vbmVvZl9pdGVyICppdGVyKTsKLWJvb2wgdXBiX21zZ19vbmVvZl9kb25lKGNvbnN0IHVwYl9tc2dfb25lb2ZfaXRlciAqaXRlcik7Ci11cGJfb25lb2ZkZWYgKnVwYl9tc2dfaXRlcl9vbmVvZihjb25zdCB1cGJfbXNnX29uZW9mX2l0ZXIgKml0ZXIpOwotdm9pZCB1cGJfbXNnX29uZW9mX2l0ZXJfc2V0ZG9uZSh1cGJfbXNnX29uZW9mX2l0ZXIgKml0ZXIpOwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLQotLyogdXBiOjpFbnVtRGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiB1cGJfc3RydGFibGVfaXRlciB1cGJfZW51bV9pdGVyOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGFuIGVudW0uICBJdHMgYmFzZSBjbGFzcyBpcyB1cGI6OkRlZiAoY29udmVydCB3aXRoCi0gKiB1cGI6OnVwY2FzdCgpKS4gKi8KLWNsYXNzIHVwYjo6RW51bURlZiB7Ci0gcHVibGljOgotICAvKiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxFbnVtRGVmPiBOZXcoKTsKLQotICAvKiB1cGI6OlJlZkNvdW50ZWQgbWV0aG9kcyBsaWtlIFJlZigpL1VucmVmKCkuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBGdW5jdGlvbmFsaXR5IGZyb20gdXBiOjpEZWYuICovCi0gIGNvbnN0IGNoYXIqIGZ1bGxfbmFtZSgpIGNvbnN0OwotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGJvb2wgc2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgU3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfZnVsbF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsbmFtZSwgU3RhdHVzKiBzKTsKLQotICAvKiBDYWxsIHRvIGZyZWV6ZSB0aGlzIEVudW1EZWYuICovCi0gIGJvb2wgRnJlZXplKFN0YXR1cyogcyk7Ci0KLSAgLyogVGhlIHZhbHVlIHRoYXQgaXMgdXNlZCBhcyB0aGUgZGVmYXVsdCB3aGVuIG5vIGZpZWxkIGRlZmF1bHQgaXMgc3BlY2lmaWVkLgotICAgKiBJZiBub3Qgc2V0IGV4cGxpY2l0bHksIHRoZSBmaXJzdCB2YWx1ZSB0aGF0IHdhcyBhZGRlZCB3aWxsIGJlIHVzZWQuCi0gICAqIFRoZSBkZWZhdWx0IHZhbHVlIG11c3QgYmUgYSBtZW1iZXIgb2YgdGhlIGVudW0uCi0gICAqIFJlcXVpcmVzIHRoYXQgdmFsdWVfY291bnQoKSA+IDAuICovCi0gIGludDMyX3QgZGVmYXVsdF92YWx1ZSgpIGNvbnN0OwotCi0gIC8qIFNldHMgdGhlIGRlZmF1bHQgdmFsdWUuICBJZiB0aGlzIHZhbHVlIGlzIG5vdCB2YWxpZCwgcmV0dXJucyBmYWxzZSBhbmQgYW4KLSAgICogZXJyb3IgbWVzc2FnZSBpbiBzdGF0dXMuICovCi0gIGJvb2wgc2V0X2RlZmF1bHRfdmFsdWUoaW50MzJfdCB2YWwsIFN0YXR1cyogc3RhdHVzKTsKLQotICAvKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgdmFsdWVzIGN1cnJlbnRseSBkZWZpbmVkIGluIHRoZSBlbnVtLiAgTm90ZSB0aGF0Ci0gICAqIG11bHRpcGxlIG5hbWVzIGNhbiByZWZlciB0byB0aGUgc2FtZSBudW1iZXIsIHNvIHRoaXMgbWF5IGJlIGdyZWF0ZXIgdGhhbgotICAgKiB0aGUgdG90YWwgbnVtYmVyIG9mIHVuaXF1ZSBudW1iZXJzLiAqLwotICBpbnQgdmFsdWVfY291bnQoKSBjb25zdDsKLQotICAvKiBBZGRzIGEgc2luZ2xlIG5hbWUvbnVtYmVyIHBhaXIgdG8gdGhlIGVudW0uICBGYWlscyBpZiB0aGlzIG5hbWUgaGFzCi0gICAqIGFscmVhZHkgYmVlbiB1c2VkIGJ5IGFub3RoZXIgdmFsdWUuICovCi0gIGJvb2wgQWRkVmFsdWUoY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCBudW0sIFN0YXR1cyogc3RhdHVzKTsKLSAgYm9vbCBBZGRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50MzJfdCBudW0sIFN0YXR1cyogc3RhdHVzKTsKLQotICAvKiBMb29rdXBzIGZyb20gbmFtZSB0byBpbnRlZ2VyLCByZXR1cm5pbmcgdHJ1ZSBpZiBmb3VuZC4gKi8KLSAgYm9vbCBGaW5kVmFsdWVCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgaW50MzJfdCogbnVtKSBjb25zdDsKLQotICAvKiBGaW5kcyB0aGUgbmFtZSBjb3JyZXNwb25kaW5nIHRvIHRoZSBnaXZlbiBudW1iZXIsIG9yIE5VTEwgaWYgbm9uZSB3YXMKLSAgICogZm91bmQuICBJZiBtb3JlIHRoYW4gb25lIG5hbWUgY29ycmVzcG9uZHMgdG8gdGhpcyBudW1iZXIsIHJldHVybnMgdGhlCi0gICAqIGZpcnN0IG9uZSB0aGF0IHdhcyBhZGRlZC4gKi8KLSAgY29uc3QgY2hhciogRmluZFZhbHVlQnlOdW1iZXIoaW50MzJfdCBudW0pIGNvbnN0OwotCi0gIC8qIFJldHVybnMgYSBuZXcgRW51bURlZiB3aXRoIGFsbCB0aGUgc2FtZSB2YWx1ZXMuICBUaGUgbmV3IEVudW1EZWYgd2lsbCBiZQotICAgKiBvd25lZCBieSB0aGUgZ2l2ZW4gb3duZXIuICovCi0gIEVudW1EZWYqIER1cChjb25zdCB2b2lkKiBvd25lcikgY29uc3Q7Ci0KLSAgLyogSXRlcmF0aW9uIG92ZXIgbmFtZS92YWx1ZSBwYWlycy4gIFRoZSBvcmRlciBpcyB1bmRlZmluZWQuCi0gICAqIEFkZGluZyBhbiBlbnVtIHZhbCBpbnZhbGlkYXRlcyBhbnkgaXRlcmF0b3JzLgotICAgKgotICAgKiBUT0RPOiBtYWtlIGNvbXBhdGlibGUgd2l0aCByYW5nZS1mb3IsIHdpdGggZWxlbWVudHMgYXMgcGFpcnM/ICovCi0gIGNsYXNzIEl0ZXJhdG9yIHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBJdGVyYXRvcihjb25zdCBFbnVtRGVmKik7Ci0KLSAgICBpbnQzMl90IG51bWJlcigpOwotICAgIGNvbnN0IGNoYXIgKm5hbWUoKTsKLSAgICBib29sIERvbmUoKTsKLSAgICB2b2lkIE5leHQoKTsKLQotICAgcHJpdmF0ZToKLSAgICB1cGJfZW51bV9pdGVyIGl0ZXJfOwotICB9OwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoRW51bURlZiwgdXBiOjpFbnVtRGVmKQotfTsKLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogTmF0aXZlIEMgQVBJLiAqLwotdXBiX2VudW1kZWYgKnVwYl9lbnVtZGVmX25ldyhjb25zdCB2b2lkICpvd25lcik7Ci11cGJfZW51bWRlZiAqdXBiX2VudW1kZWZfZHVwKGNvbnN0IHVwYl9lbnVtZGVmICplLCBjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEluY2x1ZGUgdXBiX3JlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9lbnVtZGVmX3JlZigpLiAqLwotVVBCX1JFRkNPVU5URURfQ01FVEhPRFModXBiX2VudW1kZWYsIHVwYl9lbnVtZGVmX3VwY2FzdDIpCi0KLWJvb2wgdXBiX2VudW1kZWZfZnJlZXplKHVwYl9lbnVtZGVmICplLCB1cGJfc3RhdHVzICpzdGF0dXMpOwotCi0vKiBGcm9tIHVwYl9kZWYuICovCi1jb25zdCBjaGFyICp1cGJfZW51bWRlZl9mdWxsbmFtZShjb25zdCB1cGJfZW51bWRlZiAqZSk7Ci1jb25zdCBjaGFyICp1cGJfZW51bWRlZl9uYW1lKGNvbnN0IHVwYl9lbnVtZGVmICplKTsKLWJvb2wgdXBiX2VudW1kZWZfc2V0ZnVsbG5hbWUodXBiX2VudW1kZWYgKmUsIGNvbnN0IGNoYXIgKmZ1bGxuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLQotaW50MzJfdCB1cGJfZW51bWRlZl9kZWZhdWx0KGNvbnN0IHVwYl9lbnVtZGVmICplKTsKLWJvb2wgdXBiX2VudW1kZWZfc2V0ZGVmYXVsdCh1cGJfZW51bWRlZiAqZSwgaW50MzJfdCB2YWwsIHVwYl9zdGF0dXMgKnMpOwotaW50IHVwYl9lbnVtZGVmX251bXZhbHMoY29uc3QgdXBiX2VudW1kZWYgKmUpOwotYm9vbCB1cGJfZW51bWRlZl9hZGR2YWwodXBiX2VudW1kZWYgKmUsIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotLyogRW51bSBsb29rdXBzOgotICogLSBudG9pOiAgbG9vayB1cCBhIG5hbWUgd2l0aCBzcGVjaWZpZWQgbGVuZ3RoLgotICogLSBudG9pejogbG9vayB1cCBhIG5hbWUgcHJvdmlkZWQgYXMgYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nLgotICogLSBpdG9uOiAgbG9vayB1cCBhbiBpbnRlZ2VyLCByZXR1cm5pbmcgdGhlIG5hbWUgYXMgYSBudWxsLXRlcm1pbmF0ZWQKLSAqICAgICAgICAgIHN0cmluZy4gKi8KLWJvb2wgdXBiX2VudW1kZWZfbnRvaShjb25zdCB1cGJfZW51bWRlZiAqZSwgY29uc3QgY2hhciAqbmFtZSwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90ICpudW0pOwotVVBCX0lOTElORSBib29sIHVwYl9lbnVtZGVmX250b2l6KGNvbnN0IHVwYl9lbnVtZGVmICplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIGludDMyX3QgKm51bSkgewotICByZXR1cm4gdXBiX2VudW1kZWZfbnRvaShlLCBuYW1lLCBzdHJsZW4obmFtZSksIG51bSk7Ci19Ci1jb25zdCBjaGFyICp1cGJfZW51bWRlZl9pdG9uKGNvbnN0IHVwYl9lbnVtZGVmICplLCBpbnQzMl90IG51bSk7Ci0KLS8qICB1cGJfZW51bV9pdGVyIGk7Ci0gKiAgZm9yKHVwYl9lbnVtX2JlZ2luKCZpLCBlKTsgIXVwYl9lbnVtX2RvbmUoJmkpOyB1cGJfZW51bV9uZXh0KCZpKSkgewotICogICAgLy8gLi4uCi0gKiAgfQotICovCi12b2lkIHVwYl9lbnVtX2JlZ2luKHVwYl9lbnVtX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9lbnVtZGVmICplKTsKLXZvaWQgdXBiX2VudW1fbmV4dCh1cGJfZW51bV9pdGVyICppdGVyKTsKLWJvb2wgdXBiX2VudW1fZG9uZSh1cGJfZW51bV9pdGVyICppdGVyKTsKLWNvbnN0IGNoYXIgKnVwYl9lbnVtX2l0ZXJfbmFtZSh1cGJfZW51bV9pdGVyICppdGVyKTsKLWludDMyX3QgdXBiX2VudW1faXRlcl9udW1iZXIodXBiX2VudW1faXRlciAqaXRlcik7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotLyogdXBiOjpPbmVvZkRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotdHlwZWRlZiB1cGJfaW50dGFibGVfaXRlciB1cGJfb25lb2ZfaXRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIENsYXNzIHRoYXQgcmVwcmVzZW50cyBhIG9uZW9mLiAqLwotY2xhc3MgdXBiOjpPbmVvZkRlZiB7Ci0gcHVibGljOgotICAvKiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxPbmVvZkRlZj4gTmV3KCk7Ci0KLSAgLyogdXBiOjpSZWZDb3VudGVkIG1ldGhvZHMgbGlrZSBSZWYoKS9VbnJlZigpLiAqLwotICBVUEJfUkVGQ09VTlRFRF9DUFBNRVRIT0RTCi0KLSAgLyogUmV0dXJucyB0aGUgTWVzc2FnZURlZiB0aGF0IG93bnMgdGhpcyBPbmVvZkRlZi4gKi8KLSAgY29uc3QgTWVzc2FnZURlZiogY29udGFpbmluZ190eXBlKCkgY29uc3Q7Ci0KLSAgLyogUmV0dXJucyB0aGUgbmFtZSBvZiB0aGlzIG9uZW9mLiBUaGlzIGlzIHRoZSBuYW1lIHVzZWQgdG8gbG9vayB1cCB0aGUgb25lb2YKLSAgICogYnkgbmFtZSBvbmNlIGFkZGVkIHRvIGEgbWVzc2FnZSBkZWYuICovCi0gIGNvbnN0IGNoYXIqIG5hbWUoKSBjb25zdDsKLSAgYm9vbCBzZXRfbmFtZShjb25zdCBjaGFyKiBuYW1lLCBTdGF0dXMqIHMpOwotICBib29sIHNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTdGF0dXMqIHMpOwotCi0gIC8qIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgY3VycmVudGx5IGRlZmluZWQgaW4gdGhlIG9uZW9mLiAqLwotICBpbnQgZmllbGRfY291bnQoKSBjb25zdDsKLQotICAvKiBBZGRzIGEgZmllbGQgdG8gdGhlIG9uZW9mLiBUaGUgZmllbGQgbXVzdCBub3QgaGF2ZSBiZWVuIGFkZGVkIHRvIGFueSBvdGhlcgotICAgKiBvbmVvZiBvciBtc2dkZWYuIElmIHRoZSBvbmVvZiBpcyBub3QgeWV0IHBhcnQgb2YgYSBtc2dkZWYsIHRoZW4gd2hlbiB0aGUKLSAgICogb25lb2YgaXMgZXZlbnR1YWxseSBhZGRlZCB0byBhIG1zZ2RlZiwgYWxsIGZpZWxkcyBhZGRlZCB0byB0aGUgb25lb2Ygd2lsbAotICAgKiBhbHNvIGJlIGFkZGVkIHRvIHRoZSBtc2dkZWYgYXQgdGhhdCB0aW1lLiBJZiB0aGUgb25lb2YgaXMgYWxyZWFkeSBwYXJ0IG9mIGEKLSAgICogbXNnZGVmLCB0aGUgZmllbGQgbXVzdCBlaXRoZXIgYmUgYSBwYXJ0IG9mIHRoYXQgbXNnZGVmIGFscmVhZHksIG9yIG11c3Qgbm90Ci0gICAqIGJlIGEgcGFydCBvZiBhbnkgbXNnZGVmOyBpbiB0aGUgbGF0dGVyIGNhc2UsIHRoZSBmaWVsZCBpcyBhZGRlZCB0byB0aGUKLSAgICogbXNnZGVmIGFzIGEgcGFydCBvZiB0aGlzIG9wZXJhdGlvbi4KLSAgICoKLSAgICogVGhlIGZpZWxkIG1heSBvbmx5IGhhdmUgYW4gT1BUSU9OQUwgbGFiZWwsIG5ldmVyIFJFUVVJUkVEIG9yIFJFUEVBVEVELgotICAgKgotICAgKiBJZiB8ZnwgaXMgYWxyZWFkeSBwYXJ0IG9mIHRoaXMgTWVzc2FnZURlZiwgdGhpcyBtZXRob2QgcGVyZm9ybXMgbm8gYWN0aW9uCi0gICAqIGFuZCByZXR1cm5zIHRydWUgKHN1Y2Nlc3MpLiBUaHVzLCB0aGlzIG1ldGhvZCBpcyBpZGVtcG90ZW50LiAqLwotICBib29sIEFkZEZpZWxkKEZpZWxkRGVmKiBmaWVsZCwgU3RhdHVzKiBzKTsKLSAgYm9vbCBBZGRGaWVsZChjb25zdCByZWZmZWRfcHRyPEZpZWxkRGVmPiYgZmllbGQsIFN0YXR1cyogcyk7Ci0KLSAgLyogTG9va3MgdXAgYnkgbmFtZS4gKi8KLSAgY29uc3QgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbGVuKSBjb25zdDsKLSAgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLCBzaXplX3QgbGVuKTsKLSAgY29uc3QgRmllbGREZWYqIEZpbmRGaWVsZEJ5TmFtZShjb25zdCBjaGFyKiBuYW1lKSBjb25zdCB7Ci0gICAgcmV0dXJuIEZpbmRGaWVsZEJ5TmFtZShuYW1lLCBzdHJsZW4obmFtZSkpOwotICB9Ci0gIEZpZWxkRGVmKiBGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSkgewotICAgIHJldHVybiBGaW5kRmllbGRCeU5hbWUobmFtZSwgc3RybGVuKG5hbWUpKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBGaWVsZERlZiogRmluZEZpZWxkQnlOYW1lKGNvbnN0IFQmIHN0cikgewotICAgIHJldHVybiBGaW5kRmllbGRCeU5hbWUoc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOwotICB9Ci0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICBjb25zdCBGaWVsZERlZiogRmluZEZpZWxkQnlOYW1lKGNvbnN0IFQmIHN0cikgY29uc3QgewotICAgIHJldHVybiBGaW5kRmllbGRCeU5hbWUoc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpOwotICB9Ci0KLSAgLyogTG9va3MgdXAgYnkgdGFnIG51bWJlci4gKi8KLSAgY29uc3QgRmllbGREZWYqIEZpbmRGaWVsZEJ5TnVtYmVyKHVpbnQzMl90IG51bSkgY29uc3Q7Ci0KLSAgLyogUmV0dXJucyBhIG5ldyBPbmVvZkRlZiB3aXRoIGFsbCB0aGUgc2FtZSBmaWVsZHMuIFRoZSBPbmVvZkRlZiB3aWxsIGJlIG93bmVkCi0gICAqIGJ5IHRoZSBnaXZlbiBvd25lci4gKi8KLSAgT25lb2ZEZWYqIER1cChjb25zdCB2b2lkKiBvd25lcikgY29uc3Q7Ci0KLSAgLyogSXRlcmF0aW9uIG92ZXIgZmllbGRzLiAgVGhlIG9yZGVyIGlzIHVuZGVmaW5lZC4gKi8KLSAgY2xhc3MgaXRlcmF0b3IgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBGaWVsZERlZio+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBpdGVyYXRvcihPbmVvZkRlZiogbWQpOwotICAgIHN0YXRpYyBpdGVyYXRvciBlbmQoT25lb2ZEZWYqIG1kKTsKLQotICAgIHZvaWQgb3BlcmF0b3IrKygpOwotICAgIEZpZWxkRGVmKiBvcGVyYXRvciooKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLQotICAgcHJpdmF0ZToKLSAgICB1cGJfb25lb2ZfaXRlciBpdGVyXzsKLSAgfTsKLQotICBjbGFzcyBjb25zdF9pdGVyYXRvcgotICAgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6OmZvcndhcmRfaXRlcmF0b3JfdGFnLCBjb25zdCBGaWVsZERlZio+IHsKLSAgIHB1YmxpYzoKLSAgICBleHBsaWNpdCBjb25zdF9pdGVyYXRvcihjb25zdCBPbmVvZkRlZiogbWQpOwotICAgIHN0YXRpYyBjb25zdF9pdGVyYXRvciBlbmQoY29uc3QgT25lb2ZEZWYqIG1kKTsKLQotICAgIHZvaWQgb3BlcmF0b3IrKygpOwotICAgIGNvbnN0IEZpZWxkRGVmKiBvcGVyYXRvciooKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLSAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgY29uc3RfaXRlcmF0b3ImIG90aGVyKSBjb25zdDsKLQotICAgcHJpdmF0ZToKLSAgICB1cGJfb25lb2ZfaXRlciBpdGVyXzsKLSAgfTsKLQotICBpdGVyYXRvciBiZWdpbigpOwotICBpdGVyYXRvciBlbmQoKTsKLSAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhPbmVvZkRlZiwgdXBiOjpPbmVvZkRlZikKLX07Ci0KLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIE5hdGl2ZSBDIEFQSS4gKi8KLXVwYl9vbmVvZmRlZiAqdXBiX29uZW9mZGVmX25ldyhjb25zdCB2b2lkICpvd25lcik7Ci11cGJfb25lb2ZkZWYgKnVwYl9vbmVvZmRlZl9kdXAoY29uc3QgdXBiX29uZW9mZGVmICpvLCBjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEluY2x1ZGUgdXBiX3JlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9vbmVvZmRlZl9yZWYoKS4gKi8KLVVQQl9SRUZDT1VOVEVEX0NNRVRIT0RTKHVwYl9vbmVvZmRlZiwgdXBiX29uZW9mZGVmX3VwY2FzdCkKLQotY29uc3QgY2hhciAqdXBiX29uZW9mZGVmX25hbWUoY29uc3QgdXBiX29uZW9mZGVmICpvKTsKLWJvb2wgdXBiX29uZW9mZGVmX3NldG5hbWUodXBiX29uZW9mZGVmICpvLCBjb25zdCBjaGFyICpuYW1lLCB1cGJfc3RhdHVzICpzKTsKLQotY29uc3QgdXBiX21zZ2RlZiAqdXBiX29uZW9mZGVmX2NvbnRhaW5pbmd0eXBlKGNvbnN0IHVwYl9vbmVvZmRlZiAqbyk7Ci1pbnQgdXBiX29uZW9mZGVmX251bWZpZWxkcyhjb25zdCB1cGJfb25lb2ZkZWYgKm8pOwotYm9vbCB1cGJfb25lb2ZkZWZfYWRkZmllbGQodXBiX29uZW9mZGVmICpvLCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpyZWZfZG9ub3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhdHVzICpzKTsKLQotLyogT25lb2YgbG9va3VwczoKLSAqIC0gbnRvZjogIGxvb2sgdXAgYSBmaWVsZCBieSBuYW1lLgotICogLSBudG9mejogbG9vayB1cCBhIGZpZWxkIGJ5IG5hbWUgKGFzIGEgbnVsbC10ZXJtaW5hdGVkIHN0cmluZykuCi0gKiAtIGl0b2Y6ICBsb29rIHVwIGEgZmllbGQgYnkgbnVtYmVyLiAqLwotY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJfb25lb2ZkZWZfbnRvZihjb25zdCB1cGJfb25lb2ZkZWYgKm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBsZW5ndGgpOwotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYl9vbmVvZmRlZl9udG9meihjb25zdCB1cGJfb25lb2ZkZWYgKm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUpIHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9udG9mKG8sIG5hbWUsIHN0cmxlbihuYW1lKSk7Ci19Ci1jb25zdCB1cGJfZmllbGRkZWYgKnVwYl9vbmVvZmRlZl9pdG9mKGNvbnN0IHVwYl9vbmVvZmRlZiAqbywgdWludDMyX3QgbnVtKTsKLQotLyogIHVwYl9vbmVvZl9pdGVyIGk7Ci0gKiAgZm9yKHVwYl9vbmVvZl9iZWdpbigmaSwgZSk7ICF1cGJfb25lb2ZfZG9uZSgmaSk7IHVwYl9vbmVvZl9uZXh0KCZpKSkgewotICogICAgLy8gLi4uCi0gKiAgfQotICovCi12b2lkIHVwYl9vbmVvZl9iZWdpbih1cGJfb25lb2ZfaXRlciAqaXRlciwgY29uc3QgdXBiX29uZW9mZGVmICpvKTsKLXZvaWQgdXBiX29uZW9mX25leHQodXBiX29uZW9mX2l0ZXIgKml0ZXIpOwotYm9vbCB1cGJfb25lb2ZfZG9uZSh1cGJfb25lb2ZfaXRlciAqaXRlcik7Ci11cGJfZmllbGRkZWYgKnVwYl9vbmVvZl9pdGVyX2ZpZWxkKGNvbnN0IHVwYl9vbmVvZl9pdGVyICppdGVyKTsKLXZvaWQgdXBiX29uZW9mX2l0ZXJfc2V0ZG9uZSh1cGJfb25lb2ZfaXRlciAqaXRlcik7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotCi0vKiB1cGI6OkZpbGVEZWYgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQ2xhc3MgdGhhdCByZXByZXNlbnRzIGEgLnByb3RvIGZpbGUgd2l0aCBzb21lIHRoaW5ncyBkZWZpbmVkIGluIGl0LgotICoKLSAqIE1hbnkgdXNlcnMgd29uJ3QgY2FyZSBhYm91dCBGaWxlRGVmcywgYnV0IHRoZXkgYXJlIG5lY2Vzc2FyeSBpZiB5b3Ugd2FudCB0bwotICogcmVhZCB0aGUgdmFsdWVzIG9mIGZpbGUtbGV2ZWwgb3B0aW9ucy4gKi8KLWNsYXNzIHVwYjo6RmlsZURlZiB7Ci0gcHVibGljOgotICAvKiBSZXR1cm5zIE5VTEwgaWYgbWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxGaWxlRGVmPiBOZXcoKTsKLQotICAvKiB1cGI6OlJlZkNvdW50ZWQgbWV0aG9kcyBsaWtlIFJlZigpL1VucmVmKCkuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBHZXQvc2V0IG5hbWUgb2YgdGhlIGZpbGUgKGVnLiAiZm9vL2Jhci5wcm90byIpLiAqLwotICBjb25zdCBjaGFyKiBuYW1lKCkgY29uc3Q7Ci0gIGJvb2wgc2V0X25hbWUoY29uc3QgY2hhciogbmFtZSwgU3RhdHVzKiBzKTsKLSAgYm9vbCBzZXRfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgU3RhdHVzKiBzKTsKLQotICAvKiBQYWNrYWdlIG5hbWUgZm9yIGRlZmluaXRpb25zIGluc2lkZSB0aGUgZmlsZSAoZWcuICJmb28uYmFyIikuICovCi0gIGNvbnN0IGNoYXIqIHBhY2thZ2UoKSBjb25zdDsKLSAgYm9vbCBzZXRfcGFja2FnZShjb25zdCBjaGFyKiBwYWNrYWdlLCBTdGF0dXMqIHMpOwotCi0gIC8qIFN5bnRheCBmb3IgdGhlIGZpbGUuICBEZWZhdWx0cyB0byBwcm90bzIuICovCi0gIHVwYl9zeW50YXhfdCBzeW50YXgoKSBjb25zdDsKLSAgdm9pZCBzZXRfc3ludGF4KHVwYl9zeW50YXhfdCBzeW50YXgpOwotCi0gIC8qIEdldCB0aGUgbGlzdCBvZiBkZWZzIGZyb20gdGhlIGZpbGUuICBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoYXQKLSAgICogdGhleSB3ZXJlIGFkZGVkIHRvIHRoZSBGaWxlRGVmLiAqLwotICBpbnQgZGVmX2NvdW50KCkgY29uc3Q7Ci0gIGNvbnN0IERlZiogZGVmKGludCBpbmRleCkgY29uc3Q7Ci0gIERlZiogZGVmKGludCBpbmRleCk7Ci0KLSAgLyogR2V0IHRoZSBsaXN0IG9mIGRlcGVuZGVuY2llcyBmcm9tIHRoZSBmaWxlLiAgVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZQotICAgKiBvcmRlciB0aGF0IHRoZXkgd2VyZSBhZGRlZCB0byB0aGUgRmlsZURlZi4gKi8KLSAgaW50IGRlcGVuZGVuY3lfY291bnQoKSBjb25zdDsKLSAgY29uc3QgRmlsZURlZiogZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8qIEFkZHMgZGVmcyB0byB0aGlzIGZpbGUuICBUaGUgZGVmIG11c3Qgbm90IGFscmVhZHkgYmVsb25nIHRvIGFub3RoZXIKLSAgICogZmlsZS4KLSAgICoKLSAgICogTm90ZTogdGhpcyBkb2VzICpub3QqIGVuc3VyZSB0aGF0IHRoaXMgZGVmJ3MgbmFtZSBpcyB1bmlxdWUgaW4gdGhpcyBmaWxlIQotICAgKiBVc2UgYSBTeW1ib2xUYWJsZSBpZiB5b3Ugd2FudCB0byBjaGVjayB0aGlzIHByb3BlcnR5LiAgRXNwZWNpYWxseSBzaW5jZQotICAgKiBwcm9wZXJseSBjaGVja2luZyB1bmlxdWVuZXNzIHdvdWxkIHJlcXVpcmUgYSBjaGVjayBhY3Jvc3MgKmFsbCogZmlsZXMKLSAgICogKGluY2x1ZGluZyBkZXBlbmRlbmNpZXMpLiAqLwotICBib29sIEFkZERlZihEZWYqIGRlZiwgU3RhdHVzKiBzKTsKLSAgYm9vbCBBZGRNZXNzYWdlKE1lc3NhZ2VEZWYqIG0sIFN0YXR1cyogcyk7Ci0gIGJvb2wgQWRkRW51bShFbnVtRGVmKiBlLCBTdGF0dXMqIHMpOwotICBib29sIEFkZEV4dGVuc2lvbihGaWVsZERlZiogZiwgU3RhdHVzKiBzKTsKLQotICAvKiBBZGRzIGEgZGVwZW5kZW5jeSBvZiB0aGlzIGZpbGUuICovCi0gIGJvb2wgQWRkRGVwZW5kZW5jeShjb25zdCBGaWxlRGVmKiBmaWxlKTsKLQotICAvKiBGcmVlemVzIHRoaXMgRmlsZURlZiBhbmQgYWxsIG1lc3NhZ2VzL2VudW1zIHVuZGVyIGl0LiAgQWxsIHN1YmRlZnMgbXVzdCBiZQotICAgKiByZXNvbHZlZCBhbmQgYWxsIG1lc3NhZ2VzL2VudW1zIG11c3QgdmFsaWRhdGUuICBSZXR1cm5zIHRydWUgaWYgdGhpcwotICAgKiBzdWNjZWVkZWQuCi0gICAqCi0gICAqIFRPRE8oaGFiZXJtYW4pOiBzaG91bGQgd2UgY2FyZSB3aGV0aGVyIHRoZSBmaWxlJ3MgZGVwZW5kZW5jaWVzIGFyZSBmcm96ZW4KLSAgICogYWxyZWFkeT8gKi8KLSAgYm9vbCBGcmVlemUoU3RhdHVzKiBzKTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKEZpbGVEZWYsIHVwYjo6RmlsZURlZikKLX07Ci0KLSNlbmRpZgotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotdXBiX2ZpbGVkZWYgKnVwYl9maWxlZGVmX25ldyhjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEluY2x1ZGUgdXBiX3JlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9tc2dkZWZfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfZmlsZWRlZiwgdXBiX2ZpbGVkZWZfdXBjYXN0KQotCi1jb25zdCBjaGFyICp1cGJfZmlsZWRlZl9uYW1lKGNvbnN0IHVwYl9maWxlZGVmICpmKTsKLWNvbnN0IGNoYXIgKnVwYl9maWxlZGVmX3BhY2thZ2UoY29uc3QgdXBiX2ZpbGVkZWYgKmYpOwotdXBiX3N5bnRheF90IHVwYl9maWxlZGVmX3N5bnRheChjb25zdCB1cGJfZmlsZWRlZiAqZik7Ci1zaXplX3QgdXBiX2ZpbGVkZWZfZGVmY291bnQoY29uc3QgdXBiX2ZpbGVkZWYgKmYpOwotc2l6ZV90IHVwYl9maWxlZGVmX2RlcGNvdW50KGNvbnN0IHVwYl9maWxlZGVmICpmKTsKLWNvbnN0IHVwYl9kZWYgKnVwYl9maWxlZGVmX2RlZihjb25zdCB1cGJfZmlsZWRlZiAqZiwgc2l6ZV90IGkpOwotY29uc3QgdXBiX2ZpbGVkZWYgKnVwYl9maWxlZGVmX2RlcChjb25zdCB1cGJfZmlsZWRlZiAqZiwgc2l6ZV90IGkpOwotCi1ib29sIHVwYl9maWxlZGVmX2ZyZWV6ZSh1cGJfZmlsZWRlZiAqZiwgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWxlZGVmX3NldG5hbWUodXBiX2ZpbGVkZWYgKmYsIGNvbnN0IGNoYXIgKm5hbWUsIHVwYl9zdGF0dXMgKnMpOwotYm9vbCB1cGJfZmlsZWRlZl9zZXRwYWNrYWdlKHVwYl9maWxlZGVmICpmLCBjb25zdCBjaGFyICpwYWNrYWdlLCB1cGJfc3RhdHVzICpzKTsKLWJvb2wgdXBiX2ZpbGVkZWZfc2V0c3ludGF4KHVwYl9maWxlZGVmICpmLCB1cGJfc3ludGF4X3Qgc3ludGF4LCB1cGJfc3RhdHVzICpzKTsKLQotYm9vbCB1cGJfZmlsZWRlZl9hZGRkZWYodXBiX2ZpbGVkZWYgKmYsIHVwYl9kZWYgKmRlZiwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yLAotICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqcyk7Ci1ib29sIHVwYl9maWxlZGVmX2FkZGRlcCh1cGJfZmlsZWRlZiAqZiwgY29uc3QgdXBiX2ZpbGVkZWYgKmRlcCk7Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfZmlsZWRlZl9hZGRtc2codXBiX2ZpbGVkZWYgKmYsIHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnJlZl9kb25vciwgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfYWRkZGVmKGYsIHVwYl9tc2dkZWZfdXBjYXN0X211dGFibGUobSksIHJlZl9kb25vciwgcyk7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfZmlsZWRlZl9hZGRlbnVtKHVwYl9maWxlZGVmICpmLCB1cGJfZW51bWRlZiAqZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnJlZl9kb25vciwgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfYWRkZGVmKGYsIHVwYl9lbnVtZGVmX3VwY2FzdF9tdXRhYmxlKGUpLCByZWZfZG9ub3IsIHMpOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX2ZpbGVkZWZfYWRkZXh0KHVwYl9maWxlZGVmICpmaWxlLCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnJlZl9kb25vciwgdXBiX3N0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfYWRkZGVmKGZpbGUsIHVwYl9maWVsZGRlZl91cGNhc3RfbXV0YWJsZShmKSwgcmVmX2Rvbm9yLCBzKTsKLX0KLVVQQl9JTkxJTkUgdXBiX2RlZiAqdXBiX2ZpbGVkZWZfbXV0YWJsZWRlZih1cGJfZmlsZWRlZiAqZiwgaW50IGkpIHsKLSAgcmV0dXJuICh1cGJfZGVmKil1cGJfZmlsZWRlZl9kZWYoZiwgaSk7Ci19Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLVVQQl9JTkxJTkUgY29uc3QgY2hhciogdXBiX3NhZmVjc3RyKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIpIHsKLSAgYXNzZXJ0KHN0ci5zaXplKCkgPT0gc3RkOjpzdHJsZW4oc3RyLmNfc3RyKCkpKTsKLSAgcmV0dXJuIHN0ci5jX3N0cigpOwotfQotCi0vKiBJbmxpbmUgQysrIHdyYXBwZXJzLiAqLwotbmFtZXNwYWNlIHVwYiB7Ci0KLWlubGluZSBEZWYqIERlZjo6RHVwKGNvbnN0IHZvaWQqIG93bmVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZGVmX2R1cCh0aGlzLCBvd25lcik7Ci19Ci1pbmxpbmUgRGVmOjpUeXBlIERlZjo6ZGVmX3R5cGUoKSBjb25zdCB7IHJldHVybiB1cGJfZGVmX3R5cGUodGhpcyk7IH0KLWlubGluZSBjb25zdCBjaGFyKiBEZWY6OmZ1bGxfbmFtZSgpIGNvbnN0IHsgcmV0dXJuIHVwYl9kZWZfZnVsbG5hbWUodGhpcyk7IH0KLWlubGluZSBjb25zdCBjaGFyKiBEZWY6Om5hbWUoKSBjb25zdCB7IHJldHVybiB1cGJfZGVmX25hbWUodGhpcyk7IH0KLWlubGluZSBib29sIERlZjo6c2V0X2Z1bGxfbmFtZShjb25zdCBjaGFyKiBmdWxsbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZGVmX3NldGZ1bGxuYW1lKHRoaXMsIGZ1bGxuYW1lLCBzKTsKLX0KLWlubGluZSBib29sIERlZjo6c2V0X2Z1bGxfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZnVsbG5hbWUsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2RlZl9zZXRmdWxsbmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIoZnVsbG5hbWUpLCBzKTsKLX0KLWlubGluZSBib29sIERlZjo6RnJlZXplKERlZiogY29uc3QqIGRlZnMsIHNpemVfdCBuLCBTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2RlZl9mcmVlemUoZGVmcywgbiwgc3RhdHVzKTsKLX0KLWlubGluZSBib29sIERlZjo6RnJlZXplKGNvbnN0IHN0ZDo6dmVjdG9yPERlZio+JiBkZWZzLCBTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2RlZl9mcmVlemUoKERlZiogY29uc3QqKSZkZWZzWzBdLCBkZWZzLnNpemUoKSwgc3RhdHVzKTsKLX0KLQotaW5saW5lIGJvb2wgRmllbGREZWY6OkNoZWNrVHlwZShpbnQzMl90IHZhbCkgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2NoZWNrdHlwZSh2YWwpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OkNoZWNrTGFiZWwoaW50MzJfdCB2YWwpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9jaGVja2xhYmVsKHZhbCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6Q2hlY2tEZXNjcmlwdG9yVHlwZShpbnQzMl90IHZhbCkgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2NoZWNrZGVzY3JpcHRvcnR5cGUodmFsKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpDaGVja0ludGVnZXJGb3JtYXQoaW50MzJfdCB2YWwpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9jaGVja2ludGZtdCh2YWwpOwotfQotaW5saW5lIEZpZWxkRGVmOjpUeXBlIEZpZWxkRGVmOjpDb252ZXJ0VHlwZShpbnQzMl90IHZhbCkgewotICBhc3NlcnQoQ2hlY2tUeXBlKHZhbCkpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8RmllbGREZWY6OlR5cGU+KHZhbCk7Ci19Ci1pbmxpbmUgRmllbGREZWY6OkxhYmVsIEZpZWxkRGVmOjpDb252ZXJ0TGFiZWwoaW50MzJfdCB2YWwpIHsKLSAgYXNzZXJ0KENoZWNrTGFiZWwodmFsKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxGaWVsZERlZjo6TGFiZWw+KHZhbCk7Ci19Ci1pbmxpbmUgRmllbGREZWY6OkRlc2NyaXB0b3JUeXBlIEZpZWxkRGVmOjpDb252ZXJ0RGVzY3JpcHRvclR5cGUoaW50MzJfdCB2YWwpIHsKLSAgYXNzZXJ0KENoZWNrRGVzY3JpcHRvclR5cGUodmFsKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxGaWVsZERlZjo6RGVzY3JpcHRvclR5cGU+KHZhbCk7Ci19Ci1pbmxpbmUgRmllbGREZWY6OkludGVnZXJGb3JtYXQgRmllbGREZWY6OkNvbnZlcnRJbnRlZ2VyRm9ybWF0KGludDMyX3QgdmFsKSB7Ci0gIGFzc2VydChDaGVja0ludGVnZXJGb3JtYXQodmFsKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxGaWVsZERlZjo6SW50ZWdlckZvcm1hdD4odmFsKTsKLX0KLQotaW5saW5lIHJlZmZlZF9wdHI8RmllbGREZWY+IEZpZWxkRGVmOjpOZXcoKSB7Ci0gIHVwYl9maWVsZGRlZiAqZiA9IHVwYl9maWVsZGRlZl9uZXcoJmYpOwotICByZXR1cm4gcmVmZmVkX3B0cjxGaWVsZERlZj4oZiwgJmYpOwotfQotaW5saW5lIEZpZWxkRGVmKiBGaWVsZERlZjo6RHVwKGNvbnN0IHZvaWQqIG93bmVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfZHVwKHRoaXMsIG93bmVyKTsKLX0KLWlubGluZSBjb25zdCBjaGFyKiBGaWVsZERlZjo6ZnVsbF9uYW1lKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2Z1bGxuYW1lKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9mdWxsX25hbWUoY29uc3QgY2hhciogZnVsbG5hbWUsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldGZ1bGxuYW1lKHRoaXMsIGZ1bGxuYW1lLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfZnVsbF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBmdWxsbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0ZnVsbG5hbWUodGhpcywgdXBiX3NhZmVjc3RyKGZ1bGxuYW1lKSwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6dHlwZV9pc19zZXQoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfdHlwZWlzc2V0KHRoaXMpOwotfQotaW5saW5lIEZpZWxkRGVmOjpUeXBlIEZpZWxkRGVmOjp0eXBlKCkgY29uc3QgeyByZXR1cm4gdXBiX2ZpZWxkZGVmX3R5cGUodGhpcyk7IH0KLWlubGluZSBGaWVsZERlZjo6RGVzY3JpcHRvclR5cGUgRmllbGREZWY6OmRlc2NyaXB0b3JfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZXNjcmlwdG9ydHlwZSh0aGlzKTsKLX0KLWlubGluZSBGaWVsZERlZjo6TGFiZWwgRmllbGREZWY6OmxhYmVsKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2xhYmVsKHRoaXMpOwotfQotaW5saW5lIHVpbnQzMl90IEZpZWxkRGVmOjpudW1iZXIoKSBjb25zdCB7IHJldHVybiB1cGJfZmllbGRkZWZfbnVtYmVyKHRoaXMpOyB9Ci1pbmxpbmUgY29uc3QgY2hhciogRmllbGREZWY6Om5hbWUoKSBjb25zdCB7IHJldHVybiB1cGJfZmllbGRkZWZfbmFtZSh0aGlzKTsgfQotaW5saW5lIGJvb2wgRmllbGREZWY6OmlzX2V4dGVuc2lvbigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9pc2V4dGVuc2lvbih0aGlzKTsKLX0KLWlubGluZSBzaXplX3QgRmllbGREZWY6OkdldEpzb25OYW1lKGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbikgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2dldGpzb25uYW1lKHRoaXMsIGJ1ZiwgbGVuKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpsYXp5KCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2xhenkodGhpcyk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2xhenkoYm9vbCBsYXp5KSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRsYXp5KHRoaXMsIGxhenkpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnBhY2tlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9wYWNrZWQodGhpcyk7Ci19Ci1pbmxpbmUgdWludDMyX3QgRmllbGREZWY6OmluZGV4KCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2luZGV4KHRoaXMpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9wYWNrZWQoYm9vbCBwYWNrZWQpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldHBhY2tlZCh0aGlzLCBwYWNrZWQpOwotfQotaW5saW5lIGNvbnN0IE1lc3NhZ2VEZWYqIEZpZWxkRGVmOjpjb250YWluaW5nX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGUodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgT25lb2ZEZWYqIEZpZWxkRGVmOjpjb250YWluaW5nX29uZW9mKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2NvbnRhaW5pbmdvbmVvZih0aGlzKTsKLX0KLWlubGluZSBjb25zdCBjaGFyKiBGaWVsZERlZjo6Y29udGFpbmluZ190eXBlX25hbWUoKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfY29udGFpbmluZ3R5cGVuYW1lKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9udW1iZXIodWludDMyX3QgbnVtYmVyLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRudW1iZXIodGhpcywgbnVtYmVyLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfbmFtZShjb25zdCBjaGFyICpuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRuYW1lKHRoaXMsIG5hbWUsIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OnNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRuYW1lKHRoaXMsIHVwYl9zYWZlY3N0cihuYW1lKSwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X2pzb25fbmFtZShjb25zdCBjaGFyICpuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRqc29ubmFtZSh0aGlzLCBuYW1lLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfanNvbl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRqc29ubmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIobmFtZSksIHMpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OmNsZWFyX2pzb25fbmFtZSgpIHsKLSAgdXBiX2ZpZWxkZGVmX2NsZWFyanNvbm5hbWUodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X2NvbnRhaW5pbmdfdHlwZV9uYW1lKGNvbnN0IGNoYXIgKm5hbWUsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldGNvbnRhaW5pbmd0eXBlbmFtZSh0aGlzLCBuYW1lLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfY29udGFpbmluZ190eXBlX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcgJm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0YXR1cyAqcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldGNvbnRhaW5pbmd0eXBlbmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIobmFtZSksIHMpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF90eXBlKHVwYl9maWVsZHR5cGVfdCB0eXBlKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXR0eXBlKHRoaXMsIHR5cGUpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9pc19leHRlbnNpb24oYm9vbCBpc19leHRlbnNpb24pIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGlzZXh0ZW5zaW9uKHRoaXMsIGlzX2V4dGVuc2lvbik7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2Rlc2NyaXB0b3JfdHlwZShGaWVsZERlZjo6RGVzY3JpcHRvclR5cGUgdHlwZSkgewotICB1cGJfZmllbGRkZWZfc2V0ZGVzY3JpcHRvcnR5cGUodGhpcywgdHlwZSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2xhYmVsKHVwYl9sYWJlbF90IGxhYmVsKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRsYWJlbCh0aGlzLCBsYWJlbCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6SXNTdWJNZXNzYWdlKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2lzc3VibXNnKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6OklzU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gdXBiX2ZpZWxkZGVmX2lzc3RyaW5nKHRoaXMpOyB9Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6SXNTZXF1ZW5jZSgpIGNvbnN0IHsgcmV0dXJuIHVwYl9maWVsZGRlZl9pc3NlcSh0aGlzKTsgfQotaW5saW5lIGJvb2wgRmllbGREZWY6OklzTWFwKCkgY29uc3QgeyByZXR1cm4gdXBiX2ZpZWxkZGVmX2lzbWFwKHRoaXMpOyB9Ci1pbmxpbmUgaW50NjRfdCBGaWVsZERlZjo6ZGVmYXVsdF9pbnQ2NCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZWZhdWx0aW50NjQodGhpcyk7Ci19Ci1pbmxpbmUgaW50MzJfdCBGaWVsZERlZjo6ZGVmYXVsdF9pbnQzMigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9kZWZhdWx0aW50MzIodGhpcyk7Ci19Ci1pbmxpbmUgdWludDY0X3QgRmllbGREZWY6OmRlZmF1bHRfdWludDY0KCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2RlZmF1bHR1aW50NjQodGhpcyk7Ci19Ci1pbmxpbmUgdWludDMyX3QgRmllbGREZWY6OmRlZmF1bHRfdWludDMyKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2RlZmF1bHR1aW50MzIodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6ZGVmYXVsdF9ib29sKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2RlZmF1bHRib29sKHRoaXMpOwotfQotaW5saW5lIGZsb2F0IEZpZWxkRGVmOjpkZWZhdWx0X2Zsb2F0KCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2RlZmF1bHRmbG9hdCh0aGlzKTsKLX0KLWlubGluZSBkb3VibGUgRmllbGREZWY6OmRlZmF1bHRfZG91YmxlKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX2RlZmF1bHRkb3VibGUodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogRmllbGREZWY6OmRlZmF1bHRfc3RyaW5nKHNpemVfdCogbGVuKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfZGVmYXVsdHN0cih0aGlzLCBsZW4pOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZWZhdWx0X2ludDY0KGludDY0X3QgdmFsdWUpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRpbnQ2NCh0aGlzLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2RlZmF1bHRfaW50MzIoaW50MzJfdCB2YWx1ZSkgewotICB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGludDMyKHRoaXMsIHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVmOjpzZXRfZGVmYXVsdF91aW50NjQodWludDY0X3QgdmFsdWUpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHR1aW50NjQodGhpcywgdmFsdWUpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZWZhdWx0X3VpbnQzMih1aW50MzJfdCB2YWx1ZSkgewotICB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdHVpbnQzMih0aGlzLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2RlZmF1bHRfYm9vbChib29sIHZhbHVlKSB7Ci0gIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Ym9vbCh0aGlzLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2RlZmF1bHRfZmxvYXQoZmxvYXQgdmFsdWUpIHsKLSAgdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRmbG9hdCh0aGlzLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlZjo6c2V0X2RlZmF1bHRfZG91YmxlKGRvdWJsZSB2YWx1ZSkgewotICB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdGRvdWJsZSh0aGlzLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X2RlZmF1bHRfc3RyaW5nKGNvbnN0IHZvaWQgKnN0ciwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU3RhdHVzICpzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0ZGVmYXVsdHN0cih0aGlzLCBzdHIsIGxlbiwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X2RlZmF1bHRfc3RyaW5nKGNvbnN0IHN0ZDo6c3RyaW5nJiBzdHIsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldGRlZmF1bHRzdHIodGhpcywgc3RyLmNfc3RyKCksIHN0ci5zaXplKCksIHMpOwotfQotaW5saW5lIHZvaWQgRmllbGREZWY6OnNldF9kZWZhdWx0X2NzdHIoY29uc3QgY2hhciogc3RyLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRkZWZhdWx0Y3N0cih0aGlzLCBzdHIsIHMpOwotfQotaW5saW5lIGJvb2wgRmllbGREZWY6Okhhc1N1YkRlZigpIGNvbnN0IHsgcmV0dXJuIHVwYl9maWVsZGRlZl9oYXNzdWJkZWYodGhpcyk7IH0KLWlubGluZSBjb25zdCBEZWYqIEZpZWxkRGVmOjpzdWJkZWYoKSBjb25zdCB7IHJldHVybiB1cGJfZmllbGRkZWZfc3ViZGVmKHRoaXMpOyB9Ci1pbmxpbmUgY29uc3QgTWVzc2FnZURlZiAqRmllbGREZWY6Om1lc3NhZ2Vfc3ViZGVmKCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX21zZ3N1YmRlZih0aGlzKTsKLX0KLWlubGluZSBjb25zdCBFbnVtRGVmICpGaWVsZERlZjo6ZW51bV9zdWJkZWYoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfZW51bXN1YmRlZih0aGlzKTsKLX0KLWlubGluZSBjb25zdCBjaGFyKiBGaWVsZERlZjo6c3ViZGVmX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc3ViZGVmbmFtZSh0aGlzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfc3ViZGVmKGNvbnN0IERlZiogc3ViZGVmLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRzdWJkZWYodGhpcywgc3ViZGVmLCBzKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVmOjpzZXRfZW51bV9zdWJkZWYoY29uc3QgRW51bURlZiogc3ViZGVmLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRlbnVtc3ViZGVmKHRoaXMsIHN1YmRlZiwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X21lc3NhZ2Vfc3ViZGVmKGNvbnN0IE1lc3NhZ2VEZWYqIHN1YmRlZiwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmllbGRkZWZfc2V0bXNnc3ViZGVmKHRoaXMsIHN1YmRlZiwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X3N1YmRlZl9uYW1lKGNvbnN0IGNoYXIqIG5hbWUsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpZWxkZGVmX3NldHN1YmRlZm5hbWUodGhpcywgbmFtZSwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlZjo6c2V0X3N1YmRlZl9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWVsZGRlZl9zZXRzdWJkZWZuYW1lKHRoaXMsIHVwYl9zYWZlY3N0cihuYW1lKSwgcyk7Ci19Ci0KLWlubGluZSByZWZmZWRfcHRyPE1lc3NhZ2VEZWY+IE1lc3NhZ2VEZWY6Ok5ldygpIHsKLSAgdXBiX21zZ2RlZiAqbSA9IHVwYl9tc2dkZWZfbmV3KCZtKTsKLSAgcmV0dXJuIHJlZmZlZF9wdHI8TWVzc2FnZURlZj4obSwgJm0pOwotfQotaW5saW5lIGNvbnN0IGNoYXIgKk1lc3NhZ2VEZWY6OmZ1bGxfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfZnVsbG5hbWUodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciAqTWVzc2FnZURlZjo6bmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfbmFtZSh0aGlzKTsKLX0KLWlubGluZSB1cGJfc3ludGF4X3QgTWVzc2FnZURlZjo6c3ludGF4KCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ2RlZl9zeW50YXgodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjpzZXRfZnVsbF9uYW1lKGNvbnN0IGNoYXIqIGZ1bGxuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfc2V0ZnVsbG5hbWUodGhpcywgZnVsbG5hbWUsIHMpOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6c2V0X2Z1bGxfbmFtZShjb25zdCBzdGQ6OnN0cmluZyYgZnVsbG5hbWUsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX21zZ2RlZl9zZXRmdWxsbmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIoZnVsbG5hbWUpLCBzKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OnNldF9zeW50YXgodXBiX3N5bnRheF90IHN5bnRheCkgewotICByZXR1cm4gdXBiX21zZ2RlZl9zZXRzeW50YXgodGhpcywgc3ludGF4KTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OkZyZWV6ZShTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX21zZ2RlZl9mcmVlemUodGhpcywgc3RhdHVzKTsKLX0KLWlubGluZSBpbnQgTWVzc2FnZURlZjo6ZmllbGRfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX251bWZpZWxkcyh0aGlzKTsKLX0KLWlubGluZSBpbnQgTWVzc2FnZURlZjo6b25lb2ZfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX251bW9uZW9mcyh0aGlzKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OkFkZEZpZWxkKHVwYl9maWVsZGRlZiogZiwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX2FkZGZpZWxkKHRoaXMsIGYsIE5VTEwsIHMpOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6QWRkRmllbGQoY29uc3QgcmVmZmVkX3B0cjxGaWVsZERlZj4mIGYsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX21zZ2RlZl9hZGRmaWVsZCh0aGlzLCBmLmdldCgpLCBOVUxMLCBzKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OkFkZE9uZW9mKHVwYl9vbmVvZmRlZiogbywgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX2FkZG9uZW9mKHRoaXMsIG8sIE5VTEwsIHMpOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6QWRkT25lb2YoY29uc3QgcmVmZmVkX3B0cjxPbmVvZkRlZj4mIG8sIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX21zZ2RlZl9hZGRvbmVvZih0aGlzLCBvLmdldCgpLCBOVUxMLCBzKTsKLX0KLWlubGluZSBGaWVsZERlZiogTWVzc2FnZURlZjo6RmluZEZpZWxkQnlOdW1iZXIodWludDMyX3QgbnVtYmVyKSB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX2l0b2ZfbXV0YWJsZSh0aGlzLCBudW1iZXIpOwotfQotaW5saW5lIEZpZWxkRGVmKiBNZXNzYWdlRGVmOjpGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwgc2l6ZV90IGxlbikgewotICByZXR1cm4gdXBiX21zZ2RlZl9udG9mX211dGFibGUodGhpcywgbmFtZSwgbGVuKTsKLX0KLWlubGluZSBjb25zdCBGaWVsZERlZiogTWVzc2FnZURlZjo6RmluZEZpZWxkQnlOdW1iZXIodWludDMyX3QgbnVtYmVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX2l0b2YodGhpcywgbnVtYmVyKTsKLX0KLWlubGluZSBjb25zdCBGaWVsZERlZiAqTWVzc2FnZURlZjo6RmluZEZpZWxkQnlOYW1lKGNvbnN0IGNoYXIgKm5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX250b2YodGhpcywgbmFtZSwgbGVuKTsKLX0KLWlubGluZSBPbmVvZkRlZiogTWVzc2FnZURlZjo6RmluZE9uZW9mQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIHNpemVfdCBsZW4pIHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfbnRvb19tdXRhYmxlKHRoaXMsIG5hbWUsIGxlbik7Ci19Ci1pbmxpbmUgY29uc3QgT25lb2ZEZWYqIE1lc3NhZ2VEZWY6OkZpbmRPbmVvZkJ5TmFtZShjb25zdCBjaGFyKiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbikgY29uc3QgewotICByZXR1cm4gdXBiX21zZ2RlZl9udG9vKHRoaXMsIG5hbWUsIGxlbik7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZiogTWVzc2FnZURlZjo6RHVwKGNvbnN0IHZvaWQgKm93bmVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfbXNnZGVmX2R1cCh0aGlzLCBvd25lcik7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlRGVmOjpzZXRtYXBlbnRyeShib29sIG1hcF9lbnRyeSkgewotICB1cGJfbXNnZGVmX3NldG1hcGVudHJ5KHRoaXMsIG1hcF9lbnRyeSk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlRGVmOjptYXBlbnRyeSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9tc2dkZWZfbWFwZW50cnkodGhpcyk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3IgTWVzc2FnZURlZjo6ZmllbGRfYmVnaW4oKSB7Ci0gIHJldHVybiBmaWVsZF9pdGVyYXRvcih0aGlzKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvciBNZXNzYWdlRGVmOjpmaWVsZF9lbmQoKSB7Ci0gIHJldHVybiBmaWVsZF9pdGVyYXRvcjo6ZW5kKHRoaXMpOwotfQotaW5saW5lIE1lc3NhZ2VEZWY6OmNvbnN0X2ZpZWxkX2l0ZXJhdG9yIE1lc3NhZ2VEZWY6OmZpZWxkX2JlZ2luKCkgY29uc3QgewotICByZXR1cm4gY29uc3RfZmllbGRfaXRlcmF0b3IodGhpcyk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6Y29uc3RfZmllbGRfaXRlcmF0b3IgTWVzc2FnZURlZjo6ZmllbGRfZW5kKCkgY29uc3QgewotICByZXR1cm4gY29uc3RfZmllbGRfaXRlcmF0b3I6OmVuZCh0aGlzKTsKLX0KLQotaW5saW5lIE1lc3NhZ2VEZWY6Om9uZW9mX2l0ZXJhdG9yIE1lc3NhZ2VEZWY6Om9uZW9mX2JlZ2luKCkgewotICByZXR1cm4gb25lb2ZfaXRlcmF0b3IodGhpcyk7Ci19Ci1pbmxpbmUgTWVzc2FnZURlZjo6b25lb2ZfaXRlcmF0b3IgTWVzc2FnZURlZjo6b25lb2ZfZW5kKCkgewotICByZXR1cm4gb25lb2ZfaXRlcmF0b3I6OmVuZCh0aGlzKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvciBNZXNzYWdlRGVmOjpvbmVvZl9iZWdpbigpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X29uZW9mX2l0ZXJhdG9yKHRoaXMpOwotfQotaW5saW5lIE1lc3NhZ2VEZWY6OmNvbnN0X29uZW9mX2l0ZXJhdG9yIE1lc3NhZ2VEZWY6Om9uZW9mX2VuZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X29uZW9mX2l0ZXJhdG9yOjplbmQodGhpcyk7Ci19Ci0KLWlubGluZSBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvcjo6ZmllbGRfaXRlcmF0b3IoTWVzc2FnZURlZiogbWQpIHsKLSAgdXBiX21zZ19maWVsZF9iZWdpbigmaXRlcl8sIG1kKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvciBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvcjo6ZW5kKAotICAgIE1lc3NhZ2VEZWYqIG1kKSB7Ci0gIE1lc3NhZ2VEZWY6OmZpZWxkX2l0ZXJhdG9yIGl0ZXIobWQpOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXJfc2V0ZG9uZSgmaXRlci5pdGVyXyk7Ci0gIHJldHVybiBpdGVyOwotfQotaW5saW5lIEZpZWxkRGVmKiBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlRGVmOjpmaWVsZF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgcmV0dXJuIHVwYl9tc2dfZmllbGRfbmV4dCgmaXRlcl8pOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6ZmllbGRfaXRlcmF0b3I6Om9wZXJhdG9yPT0oCi0gICAgY29uc3QgZmllbGRfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfaXRlcl9pc2VxdWFsKCZpdGVyXywgJm90aGVyLml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OmZpZWxkX2l0ZXJhdG9yOjpvcGVyYXRvciE9KAotICAgIGNvbnN0IGZpZWxkX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci19Ci0KLWlubGluZSBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvcjo6Y29uc3RfZmllbGRfaXRlcmF0b3IoCi0gICAgY29uc3QgTWVzc2FnZURlZiogbWQpIHsKLSAgdXBiX21zZ19maWVsZF9iZWdpbigmaXRlcl8sIG1kKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvciBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvcjo6ZW5kKAotICAgIGNvbnN0IE1lc3NhZ2VEZWYgKm1kKSB7Ci0gIE1lc3NhZ2VEZWY6OmNvbnN0X2ZpZWxkX2l0ZXJhdG9yIGl0ZXIobWQpOwotICB1cGJfbXNnX2ZpZWxkX2l0ZXJfc2V0ZG9uZSgmaXRlci5pdGVyXyk7Ci0gIHJldHVybiBpdGVyOwotfQotaW5saW5lIGNvbnN0IEZpZWxkRGVmKiBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlRGVmOjpjb25zdF9maWVsZF9pdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgcmV0dXJuIHVwYl9tc2dfZmllbGRfbmV4dCgmaXRlcl8pOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6Y29uc3RfZmllbGRfaXRlcmF0b3I6Om9wZXJhdG9yPT0oCi0gICAgY29uc3QgY29uc3RfZmllbGRfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfaXRlcl9pc2VxdWFsKCZpdGVyXywgJm90aGVyLml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OmNvbnN0X2ZpZWxkX2l0ZXJhdG9yOjpvcGVyYXRvciE9KAotICAgIGNvbnN0IGNvbnN0X2ZpZWxkX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci19Ci0KLWlubGluZSBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvcjo6b25lb2ZfaXRlcmF0b3IoTWVzc2FnZURlZiogbWQpIHsKLSAgdXBiX21zZ19vbmVvZl9iZWdpbigmaXRlcl8sIG1kKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvciBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvcjo6ZW5kKAotICAgIE1lc3NhZ2VEZWYqIG1kKSB7Ci0gIE1lc3NhZ2VEZWY6Om9uZW9mX2l0ZXJhdG9yIGl0ZXIobWQpOwotICB1cGJfbXNnX29uZW9mX2l0ZXJfc2V0ZG9uZSgmaXRlci5pdGVyXyk7Ci0gIHJldHVybiBpdGVyOwotfQotaW5saW5lIE9uZW9mRGVmKiBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ19pdGVyX29uZW9mKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlRGVmOjpvbmVvZl9pdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgcmV0dXJuIHVwYl9tc2dfb25lb2ZfbmV4dCgmaXRlcl8pOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6b25lb2ZfaXRlcmF0b3I6Om9wZXJhdG9yPT0oCi0gICAgY29uc3Qgb25lb2ZfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfaXRlcl9pc2VxdWFsKCZpdGVyXywgJm90aGVyLml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6Om9uZW9mX2l0ZXJhdG9yOjpvcGVyYXRvciE9KAotICAgIGNvbnN0IG9uZW9mX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci19Ci0KLWlubGluZSBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvcjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3IoCi0gICAgY29uc3QgTWVzc2FnZURlZiogbWQpIHsKLSAgdXBiX21zZ19vbmVvZl9iZWdpbigmaXRlcl8sIG1kKTsKLX0KLWlubGluZSBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvciBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvcjo6ZW5kKAotICAgIGNvbnN0IE1lc3NhZ2VEZWYgKm1kKSB7Ci0gIE1lc3NhZ2VEZWY6OmNvbnN0X29uZW9mX2l0ZXJhdG9yIGl0ZXIobWQpOwotICB1cGJfbXNnX29uZW9mX2l0ZXJfc2V0ZG9uZSgmaXRlci5pdGVyXyk7Ci0gIHJldHVybiBpdGVyOwotfQotaW5saW5lIGNvbnN0IE9uZW9mRGVmKiBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ19pdGVyX29uZW9mKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlRGVmOjpjb25zdF9vbmVvZl9pdGVyYXRvcjo6b3BlcmF0b3IrKygpIHsKLSAgcmV0dXJuIHVwYl9tc2dfb25lb2ZfbmV4dCgmaXRlcl8pOwotfQotaW5saW5lIGJvb2wgTWVzc2FnZURlZjo6Y29uc3Rfb25lb2ZfaXRlcmF0b3I6Om9wZXJhdG9yPT0oCi0gICAgY29uc3QgY29uc3Rfb25lb2ZfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfc3RydGFibGVfaXRlcl9pc2VxdWFsKCZpdGVyXywgJm90aGVyLml0ZXJfKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VEZWY6OmNvbnN0X29uZW9mX2l0ZXJhdG9yOjpvcGVyYXRvciE9KAotICAgIGNvbnN0IGNvbnN0X29uZW9mX2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gISgqdGhpcyA9PSBvdGhlcik7Ci19Ci0KLWlubGluZSByZWZmZWRfcHRyPEVudW1EZWY+IEVudW1EZWY6Ok5ldygpIHsKLSAgdXBiX2VudW1kZWYgKmUgPSB1cGJfZW51bWRlZl9uZXcoJmUpOwotICByZXR1cm4gcmVmZmVkX3B0cjxFbnVtRGVmPihlLCAmZSk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogRW51bURlZjo6ZnVsbF9uYW1lKCkgY29uc3QgewotICByZXR1cm4gdXBiX2VudW1kZWZfZnVsbG5hbWUodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogRW51bURlZjo6bmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX25hbWUodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBFbnVtRGVmOjpzZXRfZnVsbF9uYW1lKGNvbnN0IGNoYXIqIGZ1bGxuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX3NldGZ1bGxuYW1lKHRoaXMsIGZ1bGxuYW1lLCBzKTsKLX0KLWlubGluZSBib29sIEVudW1EZWY6OnNldF9mdWxsX25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIGZ1bGxuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX3NldGZ1bGxuYW1lKHRoaXMsIHVwYl9zYWZlY3N0cihmdWxsbmFtZSksIHMpOwotfQotaW5saW5lIGJvb2wgRW51bURlZjo6RnJlZXplKFN0YXR1cyogc3RhdHVzKSB7Ci0gIHJldHVybiB1cGJfZW51bWRlZl9mcmVlemUodGhpcywgc3RhdHVzKTsKLX0KLWlubGluZSBpbnQzMl90IEVudW1EZWY6OmRlZmF1bHRfdmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZW51bWRlZl9kZWZhdWx0KHRoaXMpOwotfQotaW5saW5lIGJvb2wgRW51bURlZjo6c2V0X2RlZmF1bHRfdmFsdWUoaW50MzJfdCB2YWwsIFN0YXR1cyogc3RhdHVzKSB7Ci0gIHJldHVybiB1cGJfZW51bWRlZl9zZXRkZWZhdWx0KHRoaXMsIHZhbCwgc3RhdHVzKTsKLX0KLWlubGluZSBpbnQgRW51bURlZjo6dmFsdWVfY291bnQoKSBjb25zdCB7IHJldHVybiB1cGJfZW51bWRlZl9udW12YWxzKHRoaXMpOyB9Ci1pbmxpbmUgYm9vbCBFbnVtRGVmOjpBZGRWYWx1ZShjb25zdCBjaGFyKiBuYW1lLCBpbnQzMl90IG51bSwgU3RhdHVzKiBzdGF0dXMpIHsKLSAgcmV0dXJuIHVwYl9lbnVtZGVmX2FkZHZhbCh0aGlzLCBuYW1lLCBudW0sIHN0YXR1cyk7Ci19Ci1pbmxpbmUgYm9vbCBFbnVtRGVmOjpBZGRWYWx1ZShjb25zdCBzdGQ6OnN0cmluZyYgbmFtZSwgaW50MzJfdCBudW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX2VudW1kZWZfYWRkdmFsKHRoaXMsIHVwYl9zYWZlY3N0cihuYW1lKSwgbnVtLCBzdGF0dXMpOwotfQotaW5saW5lIGJvb2wgRW51bURlZjo6RmluZFZhbHVlQnlOYW1lKGNvbnN0IGNoYXIqIG5hbWUsIGludDMyX3QgKm51bSkgY29uc3QgewotICByZXR1cm4gdXBiX2VudW1kZWZfbnRvaXoodGhpcywgbmFtZSwgbnVtKTsKLX0KLWlubGluZSBjb25zdCBjaGFyKiBFbnVtRGVmOjpGaW5kVmFsdWVCeU51bWJlcihpbnQzMl90IG51bSkgY29uc3QgewotICByZXR1cm4gdXBiX2VudW1kZWZfaXRvbih0aGlzLCBudW0pOwotfQotaW5saW5lIEVudW1EZWYqIEVudW1EZWY6OkR1cChjb25zdCB2b2lkKiBvd25lcikgY29uc3QgewotICByZXR1cm4gdXBiX2VudW1kZWZfZHVwKHRoaXMsIG93bmVyKTsKLX0KLQotaW5saW5lIEVudW1EZWY6Okl0ZXJhdG9yOjpJdGVyYXRvcihjb25zdCBFbnVtRGVmKiBlKSB7Ci0gIHVwYl9lbnVtX2JlZ2luKCZpdGVyXywgZSk7Ci19Ci1pbmxpbmUgaW50MzJfdCBFbnVtRGVmOjpJdGVyYXRvcjo6bnVtYmVyKCkgewotICByZXR1cm4gdXBiX2VudW1faXRlcl9udW1iZXIoJml0ZXJfKTsKLX0KLWlubGluZSBjb25zdCBjaGFyKiBFbnVtRGVmOjpJdGVyYXRvcjo6bmFtZSgpIHsKLSAgcmV0dXJuIHVwYl9lbnVtX2l0ZXJfbmFtZSgmaXRlcl8pOwotfQotaW5saW5lIGJvb2wgRW51bURlZjo6SXRlcmF0b3I6OkRvbmUoKSB7IHJldHVybiB1cGJfZW51bV9kb25lKCZpdGVyXyk7IH0KLWlubGluZSB2b2lkIEVudW1EZWY6Okl0ZXJhdG9yOjpOZXh0KCkgeyByZXR1cm4gdXBiX2VudW1fbmV4dCgmaXRlcl8pOyB9Ci0KLWlubGluZSByZWZmZWRfcHRyPE9uZW9mRGVmPiBPbmVvZkRlZjo6TmV3KCkgewotICB1cGJfb25lb2ZkZWYgKm8gPSB1cGJfb25lb2ZkZWZfbmV3KCZvKTsKLSAgcmV0dXJuIHJlZmZlZF9wdHI8T25lb2ZEZWY+KG8sICZvKTsKLX0KLQotaW5saW5lIGNvbnN0IE1lc3NhZ2VEZWYqIE9uZW9mRGVmOjpjb250YWluaW5nX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfb25lb2ZkZWZfY29udGFpbmluZ3R5cGUodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgY2hhciogT25lb2ZEZWY6Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfb25lb2ZkZWZfbmFtZSh0aGlzKTsKLX0KLWlubGluZSBib29sIE9uZW9mRGVmOjpzZXRfbmFtZShjb25zdCBjaGFyKiBuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9zZXRuYW1lKHRoaXMsIG5hbWUsIHMpOwotfQotaW5saW5lIGJvb2wgT25lb2ZEZWY6OnNldF9uYW1lKGNvbnN0IHN0ZDo6c3RyaW5nJiBuYW1lLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9zZXRuYW1lKHRoaXMsIHVwYl9zYWZlY3N0cihuYW1lKSwgcyk7Ci19Ci1pbmxpbmUgaW50IE9uZW9mRGVmOjpmaWVsZF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9udW1maWVsZHModGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6QWRkRmllbGQoRmllbGREZWYqIGZpZWxkLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9hZGRmaWVsZCh0aGlzLCBmaWVsZCwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6QWRkRmllbGQoY29uc3QgcmVmZmVkX3B0cjxGaWVsZERlZj4mIGZpZWxkLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9vbmVvZmRlZl9hZGRmaWVsZCh0aGlzLCBmaWVsZC5nZXQoKSwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgY29uc3QgRmllbGREZWYqIE9uZW9mRGVmOjpGaW5kRmllbGRCeU5hbWUoY29uc3QgY2hhciogbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfb25lb2ZkZWZfbnRvZih0aGlzLCBuYW1lLCBsZW4pOwotfQotaW5saW5lIGNvbnN0IEZpZWxkRGVmKiBPbmVvZkRlZjo6RmluZEZpZWxkQnlOdW1iZXIodWludDMyX3QgbnVtKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfb25lb2ZkZWZfaXRvZih0aGlzLCBudW0pOwotfQotaW5saW5lIE9uZW9mRGVmOjppdGVyYXRvciBPbmVvZkRlZjo6YmVnaW4oKSB7IHJldHVybiBpdGVyYXRvcih0aGlzKTsgfQotaW5saW5lIE9uZW9mRGVmOjppdGVyYXRvciBPbmVvZkRlZjo6ZW5kKCkgeyByZXR1cm4gaXRlcmF0b3I6OmVuZCh0aGlzKTsgfQotaW5saW5lIE9uZW9mRGVmOjpjb25zdF9pdGVyYXRvciBPbmVvZkRlZjo6YmVnaW4oKSBjb25zdCB7Ci0gIHJldHVybiBjb25zdF9pdGVyYXRvcih0aGlzKTsKLX0KLWlubGluZSBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3IgT25lb2ZEZWY6OmVuZCgpIGNvbnN0IHsKLSAgcmV0dXJuIGNvbnN0X2l0ZXJhdG9yOjplbmQodGhpcyk7Ci19Ci0KLWlubGluZSBPbmVvZkRlZjo6aXRlcmF0b3I6Oml0ZXJhdG9yKE9uZW9mRGVmKiBvKSB7Ci0gIHVwYl9vbmVvZl9iZWdpbigmaXRlcl8sIG8pOwotfQotaW5saW5lIE9uZW9mRGVmOjppdGVyYXRvciBPbmVvZkRlZjo6aXRlcmF0b3I6OmVuZChPbmVvZkRlZiogbykgewotICBPbmVvZkRlZjo6aXRlcmF0b3IgaXRlcihvKTsKLSAgdXBiX29uZW9mX2l0ZXJfc2V0ZG9uZSgmaXRlci5pdGVyXyk7Ci0gIHJldHVybiBpdGVyOwotfQotaW5saW5lIEZpZWxkRGVmKiBPbmVvZkRlZjo6aXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9vbmVvZl9pdGVyX2ZpZWxkKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBPbmVvZkRlZjo6aXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7IHJldHVybiB1cGJfb25lb2ZfbmV4dCgmaXRlcl8pOyB9Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6aXRlcmF0b3I6Om9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaW50dGFibGVfaXRlcl9pc2VxdWFsKCZpdGVyXywgJm90aGVyLml0ZXJfKTsKLX0KLWlubGluZSBib29sIE9uZW9mRGVmOjppdGVyYXRvcjo6b3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKLSAgcmV0dXJuICEoKnRoaXMgPT0gb3RoZXIpOwotfQotCi1pbmxpbmUgT25lb2ZEZWY6OmNvbnN0X2l0ZXJhdG9yOjpjb25zdF9pdGVyYXRvcihjb25zdCBPbmVvZkRlZiogbWQpIHsKLSAgdXBiX29uZW9mX2JlZ2luKCZpdGVyXywgbWQpOwotfQotaW5saW5lIE9uZW9mRGVmOjpjb25zdF9pdGVyYXRvciBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3I6OmVuZCgKLSAgICBjb25zdCBPbmVvZkRlZiAqbWQpIHsKLSAgT25lb2ZEZWY6OmNvbnN0X2l0ZXJhdG9yIGl0ZXIobWQpOwotICB1cGJfb25lb2ZfaXRlcl9zZXRkb25lKCZpdGVyLml0ZXJfKTsKLSAgcmV0dXJuIGl0ZXI7Ci19Ci1pbmxpbmUgY29uc3QgRmllbGREZWYqIE9uZW9mRGVmOjpjb25zdF9pdGVyYXRvcjo6b3BlcmF0b3IqKCkgY29uc3QgewotICByZXR1cm4gdXBiX21zZ19pdGVyX2ZpZWxkKCZpdGVyXyk7Ci19Ci1pbmxpbmUgdm9pZCBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7Ci0gIHJldHVybiB1cGJfb25lb2ZfbmV4dCgmaXRlcl8pOwotfQotaW5saW5lIGJvb2wgT25lb2ZEZWY6OmNvbnN0X2l0ZXJhdG9yOjpvcGVyYXRvcj09KAotICAgIGNvbnN0IGNvbnN0X2l0ZXJhdG9yICZvdGhlcikgY29uc3QgewotICByZXR1cm4gdXBiX2ludHRhYmxlX2l0ZXJfaXNlcXVhbCgmaXRlcl8sICZvdGhlci5pdGVyXyk7Ci19Ci1pbmxpbmUgYm9vbCBPbmVvZkRlZjo6Y29uc3RfaXRlcmF0b3I6Om9wZXJhdG9yIT0oCi0gICAgY29uc3QgY29uc3RfaXRlcmF0b3IgJm90aGVyKSBjb25zdCB7Ci0gIHJldHVybiAhKCp0aGlzID09IG90aGVyKTsKLX0KLQotaW5saW5lIHJlZmZlZF9wdHI8RmlsZURlZj4gRmlsZURlZjo6TmV3KCkgewotICB1cGJfZmlsZWRlZiAqZiA9IHVwYl9maWxlZGVmX25ldygmZik7Ci0gIHJldHVybiByZWZmZWRfcHRyPEZpbGVEZWY+KGYsICZmKTsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIqIEZpbGVEZWY6Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmlsZWRlZl9uYW1lKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRmlsZURlZjo6c2V0X25hbWUoY29uc3QgY2hhciogbmFtZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmlsZWRlZl9zZXRuYW1lKHRoaXMsIG5hbWUsIHMpOwotfQotaW5saW5lIGJvb2wgRmlsZURlZjo6c2V0X25hbWUoY29uc3Qgc3RkOjpzdHJpbmcmIG5hbWUsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfc2V0bmFtZSh0aGlzLCB1cGJfc2FmZWNzdHIobmFtZSksIHMpOwotfQotaW5saW5lIGNvbnN0IGNoYXIqIEZpbGVEZWY6OnBhY2thZ2UoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmlsZWRlZl9wYWNrYWdlKHRoaXMpOwotfQotaW5saW5lIGJvb2wgRmlsZURlZjo6c2V0X3BhY2thZ2UoY29uc3QgY2hhciogcGFja2FnZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfZmlsZWRlZl9zZXRwYWNrYWdlKHRoaXMsIHBhY2thZ2UsIHMpOwotfQotaW5saW5lIGludCBGaWxlRGVmOjpkZWZfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZmlsZWRlZl9kZWZjb3VudCh0aGlzKTsKLX0KLWlubGluZSBjb25zdCBEZWYqIEZpbGVEZWY6OmRlZihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWxlZGVmX2RlZih0aGlzLCBpbmRleCk7Ci19Ci1pbmxpbmUgRGVmKiBGaWxlRGVmOjpkZWYoaW50IGluZGV4KSB7Ci0gIHJldHVybiBjb25zdF9jYXN0PERlZio+KHVwYl9maWxlZGVmX2RlZih0aGlzLCBpbmRleCkpOwotfQotaW5saW5lIGludCBGaWxlRGVmOjpkZXBlbmRlbmN5X2NvdW50KCkgY29uc3QgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfZGVwY291bnQodGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgRmlsZURlZiogRmlsZURlZjo6ZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9maWxlZGVmX2RlcCh0aGlzLCBpbmRleCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlRGVmOjpBZGREZWYoRGVmKiBkZWYsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfYWRkZGVmKHRoaXMsIGRlZiwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlRGVmOjpBZGRNZXNzYWdlKE1lc3NhZ2VEZWYqIG0sIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfYWRkbXNnKHRoaXMsIG0sIE5VTEwsIHMpOwotfQotaW5saW5lIGJvb2wgRmlsZURlZjo6QWRkRW51bShFbnVtRGVmKiBlLCBTdGF0dXMqIHMpIHsKLSAgcmV0dXJuIHVwYl9maWxlZGVmX2FkZGVudW0odGhpcywgZSwgTlVMTCwgcyk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlRGVmOjpBZGRFeHRlbnNpb24oRmllbGREZWYqIGYsIFN0YXR1cyogcykgewotICByZXR1cm4gdXBiX2ZpbGVkZWZfYWRkZXh0KHRoaXMsIGYsIE5VTEwsIHMpOwotfQotaW5saW5lIGJvb2wgRmlsZURlZjo6QWRkRGVwZW5kZW5jeShjb25zdCBGaWxlRGVmKiBmaWxlKSB7Ci0gIHJldHVybiB1cGJfZmlsZWRlZl9hZGRkZXAodGhpcywgZmlsZSk7Ci19Ci0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi0jZW5kaWYgLyogVVBCX0RFRl9IXyAqLwotLyoKLSoqIFRoaXMgZmlsZSBjb250YWlucyBkZWZpbml0aW9ucyBvZiBzdHJ1Y3RzIHRoYXQgc2hvdWxkIGJlIGNvbnNpZGVyZWQgcHJpdmF0ZQotKiogYW5kIE5PVCBzdGFibGUgYWNyb3NzIHZlcnNpb25zIG9mIHVwYi4KLSoqCi0qKiBUaGUgb25seSByZWFzb24gdGhleSBhcmUgZGVjbGFyZWQgaGVyZSBhbmQgbm90IGluIC5jIGZpbGVzIGlzIHRvIGFsbG93IHVwYgotKiogYW5kIHRoZSBhcHBsaWNhdGlvbiAoaWYgZGVzaXJlZCkgdG8gZW1iZWQgc3RhdGljYWxseS1pbml0aWFsaXplZCBpbnN0YW5jZXMKLSoqIG9mIHN0cnVjdHVyZXMgbGlrZSBkZWZzLgotKioKLSoqIElmIHlvdSBpbmNsdWRlIHRoaXMgZmlsZSwgYWxsIGd1YXJhbnRlZXMgb2YgQUJJIGNvbXBhdGliaWxpdHkgZ28gb3V0IHRoZQotKiogd2luZG93ISAgQW55IGNvZGUgdGhhdCBpbmNsdWRlcyB0aGlzIGZpbGUgbmVlZHMgdG8gcmVjb21waWxlIGFnYWluc3QgdGhlCi0qKiBleGFjdCBzYW1lIHZlcnNpb24gb2YgdXBiIHRoYXQgdGhleSBhcmUgbGlua2luZyBhZ2FpbnN0LgotKioKLSoqIFlvdSBhbHNvIG5lZWQgdG8gcmVjb21waWxlIGlmIHlvdSBjaGFuZ2UgdGhlIHZhbHVlIG9mIHRoZSBVUEJfREVCVUdfUkVGUwotKiogZmxhZy4KLSovCi0KLQotI2lmbmRlZiBVUEJfU1RBVElDSU5JVF9IXwotI2RlZmluZSBVUEJfU1RBVElDSU5JVF9IXwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLS8qIEJlY2F1c2Ugb2YgaG93IHdlIGRvIG91ciB0eXBlZGVmcywgdGhpcyBoZWFkZXIgY2FuJ3QgYmUgaW5jbHVkZWQgZnJvbSBDKysuICovCi0jZXJyb3IgVGhpcyBmaWxlIGNhbm5vdCBiZSBpbmNsdWRlZCBmcm9tIEMrKwotI2VuZGlmCi0KLS8qIHVwYl9yZWZjb3VudGVkICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLQotLyogdXBiX2RlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHVwYl9kZWYgewotICB1cGJfcmVmY291bnRlZCBiYXNlOwotCi0gIGNvbnN0IGNoYXIgKmZ1bGxuYW1lOwotICBjb25zdCB1cGJfZmlsZWRlZiogZmlsZTsKLSAgY2hhciB0eXBlOyAgLyogQSB1cGJfZGVmdHlwZV90IChjaGFyIHRvIHNhdmUgc3BhY2UpICovCi0KLSAgLyogVXNlZCBhcyBhIGZsYWcgZHVyaW5nIHRoZSBkZWYncyBtdXRhYmxlIHN0YWdlLiAgTXVzdCBiZSBmYWxzZSB1bmxlc3MKLSAgICogaXQgaXMgY3VycmVudGx5IGJlaW5nIHVzZWQgYnkgYSBmdW5jdGlvbiBvbiB0aGUgc3RhY2suICBUaGlzIGFsbG93cwotICAgKiB1cyB0byBlYXNpbHkgZGV0ZXJtaW5lIHdoaWNoIGRlZnMgd2VyZSBwYXNzZWQgaW50byB0aGUgZnVuY3Rpb24ncwotICAgKiBjdXJyZW50IGludm9jYXRpb24uICovCi0gIGJvb2wgY2FtZV9mcm9tX3VzZXI7Ci19OwotCi0jZGVmaW5lIFVQQl9ERUZfSU5JVChuYW1lLCB0eXBlLCB2dGJsLCByZWZzLCByZWYycykgXAotICAgIHsgVVBCX1JFRkNPVU5UX0lOSVQodnRibCwgcmVmcywgcmVmMnMpLCBuYW1lLCBOVUxMLCB0eXBlLCBmYWxzZSB9Ci0KLQotLyogdXBiX2ZpZWxkZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotc3RydWN0IHVwYl9maWVsZGRlZiB7Ci0gIHVwYl9kZWYgYmFzZTsKLQotICB1bmlvbiB7Ci0gICAgaW50NjRfdCBzaW50OwotICAgIHVpbnQ2NF90IHVpbnQ7Ci0gICAgZG91YmxlIGRibDsKLSAgICBmbG9hdCBmbHQ7Ci0gICAgdm9pZCAqYnl0ZXM7Ci0gIH0gZGVmYXVsdHZhbDsKLSAgdW5pb24gewotICAgIGNvbnN0IHVwYl9tc2dkZWYgKmRlZjsgIC8qIElmICFtc2dfaXNfc3ltYm9saWMuICovCi0gICAgY2hhciAqbmFtZTsgICAgICAgICAgICAgLyogSWYgbXNnX2lzX3N5bWJvbGljLiAqLwotICB9IG1zZzsKLSAgdW5pb24gewotICAgIGNvbnN0IHVwYl9kZWYgKmRlZjsgIC8qIElmICFzdWJkZWZfaXNfc3ltYm9saWMuICovCi0gICAgY2hhciAqbmFtZTsgICAgICAgICAgLyogSWYgc3ViZGVmX2lzX3N5bWJvbGljLiAqLwotICB9IHN1YjsgIC8qIFRoZSBtc2dkZWYgb3IgZW51bWRlZiBmb3IgdGhpcyBmaWVsZCwgaWYgdXBiX2hhc3N1YmRlZihmKS4gKi8KLSAgYm9vbCBzdWJkZWZfaXNfc3ltYm9saWM7Ci0gIGJvb2wgbXNnX2lzX3N5bWJvbGljOwotICBjb25zdCB1cGJfb25lb2ZkZWYgKm9uZW9mOwotICBib29sIGRlZmF1bHRfaXNfc3RyaW5nOwotICBib29sIHR5cGVfaXNfc2V0XzsgICAgIC8qIEZhbHNlIHVudGlsIHR5cGUgaXMgZXhwbGljaXRseSBzZXQuICovCi0gIGJvb2wgaXNfZXh0ZW5zaW9uXzsKLSAgYm9vbCBsYXp5XzsKLSAgYm9vbCBwYWNrZWRfOwotICB1cGJfaW50Zm10X3QgaW50Zm10OwotICBib29sIHRhZ2RlbGltOwotICB1cGJfZmllbGR0eXBlX3QgdHlwZV87Ci0gIHVwYl9sYWJlbF90IGxhYmVsXzsKLSAgdWludDMyX3QgbnVtYmVyXzsKLSAgdWludDMyX3Qgc2VsZWN0b3JfYmFzZTsgIC8qIFVzZWQgdG8gaW5kZXggaW50byBhIHVwYjo6SGFuZGxlcnMgdGFibGUuICovCi0gIHVpbnQzMl90IGluZGV4XzsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB1cGJfZmllbGRkZWZfdnRibDsKLQotI2RlZmluZSBVUEJfRklFTERERUZfSU5JVChsYWJlbCwgdHlwZSwgaW50Zm10LCB0YWdkZWxpbSwgaXNfZXh0ZW5zaW9uLCBsYXp5LCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgcGFja2VkLCBuYW1lLCBudW0sIG1zZ2RlZiwgc3ViZGVmLCBzZWxlY3Rvcl9iYXNlLCAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluZGV4LCBkZWZhdWx0dmFsLCByZWZzLCByZWYycykgICAgICAgICAgICAgICAgICAgICAgXAotICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVUEJfREVGX0lOSVQobmFtZSwgVVBCX0RFRl9GSUVMRCwgJnVwYl9maWVsZGRlZl92dGJsLCByZWZzLCByZWYycyksICAgICAgICBcCi0gICAgICAgIGRlZmF1bHR2YWwsIHttc2dkZWZ9LCB7c3ViZGVmfSwgTlVMTCwgZmFsc2UsIGZhbHNlLCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB0eXBlID09IFVQQl9UWVBFX1NUUklORyB8fCB0eXBlID09IFVQQl9UWVBFX0JZVEVTLCB0cnVlLCBpc19leHRlbnNpb24sIFwKLSAgICAgICAgbGF6eSwgcGFja2VkLCBpbnRmbXQsIHRhZ2RlbGltLCB0eXBlLCBsYWJlbCwgbnVtLCBzZWxlY3Rvcl9iYXNlLCBpbmRleCBcCi0gIH0KLQotCi0vKiB1cGJfbXNnZGVmICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdXBiX21zZ2RlZiB7Ci0gIHVwYl9kZWYgYmFzZTsKLQotICBzaXplX3Qgc2VsZWN0b3JfY291bnQ7Ci0gIHVpbnQzMl90IHN1Ym1zZ19maWVsZF9jb3VudDsKLQotICAvKiBUYWJsZXMgZm9yIGxvb2tpbmcgdXAgZmllbGRzIGJ5IG51bWJlciBhbmQgbmFtZS4gKi8KLSAgdXBiX2ludHRhYmxlIGl0b2Y7ICAvKiBpbnQgdG8gZmllbGQgKi8KLSAgdXBiX3N0cnRhYmxlIG50b2Y7ICAvKiBuYW1lIHRvIGZpZWxkL29uZW9mICovCi0KLSAgLyogSXMgdGhpcyBhIG1hcC1lbnRyeSBtZXNzYWdlPyAqLwotICBib29sIG1hcF9lbnRyeTsKLQotICAvKiBXaGV0aGVyIHRoaXMgbWVzc2FnZSBoYXMgcHJvdG8yIG9yIHByb3RvMyBzZW1hbnRpY3MuICovCi0gIHVwYl9zeW50YXhfdCBzeW50YXg7Ci0KLSAgLyogVE9ETyhoYWJlcm1hbik6IHByb3BlciBleHRlbnNpb24gcmFuZ2VzICh0aGVyZSBjYW4gYmUgbXVsdGlwbGUpLiAqLwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsIHVwYl9tc2dkZWZfdnRibDsKLQotLyogVE9ETzogYWxzbyBzdXBwb3J0IHN0YXRpYyBpbml0aWFsaXphdGlvbiBvZiB0aGUgb25lb2ZzIHRhYmxlLiBUaGlzIHdpbGwgYmUKLSAqIG5lZWRlZCBpZiB3ZSBjb21waWxlIGluIGRlc2NyaXB0b3JzIHRoYXQgY29udGFpbiBvbmVvZnMuICovCi0jZGVmaW5lIFVQQl9NU0dERUZfSU5JVChuYW1lLCBzZWxlY3Rvcl9jb3VudCwgc3VibXNnX2ZpZWxkX2NvdW50LCBpdG9mLCBudG9mLCBcCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXBfZW50cnksIHN5bnRheCwgcmVmcywgcmVmMnMpICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVBCX0RFRl9JTklUKG5hbWUsIFVQQl9ERUZfTVNHLCAmdXBiX2ZpZWxkZGVmX3Z0YmwsIHJlZnMsIHJlZjJzKSwgICAgICAgICBcCi0gICAgICAgIHNlbGVjdG9yX2NvdW50LCBzdWJtc2dfZmllbGRfY291bnQsIGl0b2YsIG50b2YsIG1hcF9lbnRyeSwgc3ludGF4ICAgICBcCi0gIH0KLQotCi0vKiB1cGJfZW51bWRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1zdHJ1Y3QgdXBiX2VudW1kZWYgewotICB1cGJfZGVmIGJhc2U7Ci0KLSAgdXBiX3N0cnRhYmxlIG50b2k7Ci0gIHVwYl9pbnR0YWJsZSBpdG9uOwotICBpbnQzMl90IGRlZmF1bHR2YWw7Ci19OwotCi1leHRlcm4gY29uc3Qgc3RydWN0IHVwYl9yZWZjb3VudGVkX3Z0YmwgdXBiX2VudW1kZWZfdnRibDsKLQotI2RlZmluZSBVUEJfRU5VTURFRl9JTklUKG5hbWUsIG50b2ksIGl0b24sIGRlZmF1bHR2YWwsIHJlZnMsIHJlZjJzKSBcCi0gIHsgVVBCX0RFRl9JTklUKG5hbWUsIFVQQl9ERUZfRU5VTSwgJnVwYl9lbnVtZGVmX3Z0YmwsIHJlZnMsIHJlZjJzKSwgbnRvaSwgICAgXAotICAgIGl0b24sIGRlZmF1bHR2YWwgfQotCi0KLS8qIHVwYl9vbmVvZmRlZiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCB1cGJfb25lb2ZkZWYgewotICB1cGJfcmVmY291bnRlZCBiYXNlOwotCi0gIGNvbnN0IGNoYXIgKm5hbWU7Ci0gIHVwYl9zdHJ0YWJsZSBudG9mOwotICB1cGJfaW50dGFibGUgaXRvZjsKLSAgY29uc3QgdXBiX21zZ2RlZiAqcGFyZW50OwotfTsKLQotZXh0ZXJuIGNvbnN0IHN0cnVjdCB1cGJfcmVmY291bnRlZF92dGJsIHVwYl9vbmVvZmRlZl92dGJsOwotCi0jZGVmaW5lIFVQQl9PTkVPRkRFRl9JTklUKG5hbWUsIG50b2YsIGl0b2YsIHJlZnMsIHJlZjJzKSBcCi0gIHsgVVBCX1JFRkNPVU5UX0lOSVQoJnVwYl9vbmVvZmRlZl92dGJsLCByZWZzLCByZWYycyksIG5hbWUsIG50b2YsIGl0b2YgfQotCi0KLS8qIHVwYl9zeW10YWIgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLXN0cnVjdCB1cGJfc3ltdGFiIHsKLSAgdXBiX3JlZmNvdW50ZWQgYmFzZTsKLQotICB1cGJfc3RydGFibGUgc3ltdGFiOwotfTsKLQotc3RydWN0IHVwYl9maWxlZGVmIHsKLSAgdXBiX3JlZmNvdW50ZWQgYmFzZTsKLQotICBjb25zdCBjaGFyICpuYW1lOwotICBjb25zdCBjaGFyICpwYWNrYWdlOwotICB1cGJfc3ludGF4X3Qgc3ludGF4OwotCi0gIHVwYl9pbnR0YWJsZSBkZWZzOwotICB1cGJfaW50dGFibGUgZGVwczsKLX07Ci0KLWV4dGVybiBjb25zdCBzdHJ1Y3QgdXBiX3JlZmNvdW50ZWRfdnRibCB1cGJfZmlsZWRlZl92dGJsOwotCi0jZW5kaWYgIC8qIFVQQl9TVEFUSUNJTklUX0hfICovCi0vKgotKiogdXBiOjpIYW5kbGVycyAodXBiX2hhbmRsZXJzKQotKioKLSoqIEEgdXBiX2hhbmRsZXJzIGlzIGxpa2UgYSB2aXJ0dWFsIHRhYmxlIGZvciBhIHVwYl9tc2dkZWYuICBFYWNoIGZpZWxkIG9mIHRoZQotKiogbWVzc2FnZSBjYW4gaGF2ZSBhc3NvY2lhdGVkIGZ1bmN0aW9ucyB0aGF0IHdpbGwgYmUgY2FsbGVkIHdoZW4gd2UgYXJlCi0qKiBwYXJzaW5nIG9yIHZpc2l0aW5nIGEgc3RyZWFtIG9mIGRhdGEuICBUaGlzIGlzIHNpbWlsYXIgdG8gaG93IGhhbmRsZXJzIHdvcmsKLSoqIGluIFNBWCAodGhlIFNpbXBsZSBBUEkgZm9yIFhNTCkuCi0qKgotKiogVGhlIGhhbmRsZXJzIGhhdmUgbm8gaWRlYSB3aGVyZSB0aGUgZGF0YSBpcyBjb21pbmcgZnJvbSwgc28gYSBzaW5nbGUgc2V0IG9mCi0qKiBoYW5kbGVycyBjb3VsZCBiZSB1c2VkIHdpdGggdHdvIGNvbXBsZXRlbHkgZGlmZmVyZW50IGRhdGEgc291cmNlcyAoZm9yCi0qKiBleGFtcGxlLCBhIHBhcnNlciBhbmQgYSB2aXNpdG9yIG92ZXIgaW4tbWVtb3J5IG9iamVjdHMpLiAgVGhpcyBkZWNvdXBsaW5nIGlzCi0qKiB0aGUgbW9zdCBpbXBvcnRhbnQgZmVhdHVyZSBvZiB1cGIsIGJlY2F1c2UgaXQgYWxsb3dzIHBhcnNlcnMgYW5kIHNlcmlhbGl6ZXJzCi0qKiB0byBiZSBoaWdobHkgcmV1c2FibGUuCi0qKgotKiogVGhpcyBpcyBhIG1peGVkIEMvQysrIGludGVyZmFjZSB0aGF0IG9mZmVycyBhIGZ1bGwgQVBJIHRvIGJvdGggbGFuZ3VhZ2VzLgotKiogU2VlIHRoZSB0b3AtbGV2ZWwgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uLgotKi8KLQotI2lmbmRlZiBVUEJfSEFORExFUlNfSAotI2RlZmluZSBVUEJfSEFORExFUlNfSAotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1jbGFzcyBCdWZmZXJIYW5kbGU7Ci1jbGFzcyBCeXRlc0hhbmRsZXI7Ci1jbGFzcyBIYW5kbGVyQXR0cmlidXRlczsKLWNsYXNzIEhhbmRsZXJzOwotdGVtcGxhdGUgPGNsYXNzIFQ+IGNsYXNzIEhhbmRsZXI7Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IENhbm9uaWNhbFR5cGU7Ci19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OkJ1ZmZlckhhbmRsZSwgdXBiX2J1ZmhhbmRsZSkKLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpCeXRlc0hhbmRsZXIsIHVwYl9ieXRlc2hhbmRsZXIpCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6SGFuZGxlckF0dHJpYnV0ZXMsIHVwYl9oYW5kbGVyYXR0cikKLVVQQl9ERUNMQVJFX0RFUklWRURfVFlQRSh1cGI6OkhhbmRsZXJzLCB1cGI6OlJlZkNvdW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJzLCB1cGJfcmVmY291bnRlZCkKLQotLyogVGhlIG1heGltdW0gZGVwdGggdGhhdCB0aGUgaGFuZGxlciBncmFwaCBjYW4gaGF2ZS4gIFRoaXMgaXMgYSByZXNvdXJjZSBsaW1pdAotICogZm9yIHRoZSBDIHN0YWNrIHNpbmNlIHdlIHNvbWV0aW1lcyBuZWVkIHRvIHJlY3Vyc2l2ZWx5IHRyYXZlcnNlIHRoZSBncmFwaC4KLSAqIEN5Y2xlcyBhcmUgb2s7IHRoZSB0cmF2ZXJzYWwgd2lsbCBzdG9wIHdoZW4gaXQgZGV0ZWN0cyBhIGN5Y2xlLCBidXQgd2UgbXVzdAotICogaGl0IHRoZSBjeWNsZSBiZWZvcmUgdGhlIG1heGltdW0gZGVwdGggaXMgcmVhY2hlZC4KLSAqCi0gKiBJZiBoYXZpbmcgYSBzaW5nbGUgc3RhdGljIGxpbWl0IGlzIHRvbyBpbmZsZXhpYmxlLCB3ZSBjYW4gYWRkIGFub3RoZXIgdmFyaWFudAotICogb2YgSGFuZGxlcnM6OkZyZWV6ZSB0aGF0IGFsbG93cyBzcGVjaWZ5aW5nIHRoaXMgYXMgYSBwYXJhbWV0ZXIuICovCi0jZGVmaW5lIFVQQl9NQVhfSEFORExFUl9ERVBUSCA2NAotCi0vKiBBbGwgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBoYW5kbGVycyB0aGF0IGNhbiBiZSByZWdpc3RlcmVkLgotICogT25seSBuZWVkZWQgZm9yIHRoZSBhZHZhbmNlZCBmdW5jdGlvbnMgaW4gdXBiOjpIYW5kbGVycy4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIFVQQl9IQU5ETEVSX0lOVDMyLAotICBVUEJfSEFORExFUl9JTlQ2NCwKLSAgVVBCX0hBTkRMRVJfVUlOVDMyLAotICBVUEJfSEFORExFUl9VSU5UNjQsCi0gIFVQQl9IQU5ETEVSX0ZMT0FULAotICBVUEJfSEFORExFUl9ET1VCTEUsCi0gIFVQQl9IQU5ETEVSX0JPT0wsCi0gIFVQQl9IQU5ETEVSX1NUQVJUU1RSLAotICBVUEJfSEFORExFUl9TVFJJTkcsCi0gIFVQQl9IQU5ETEVSX0VORFNUUiwKLSAgVVBCX0hBTkRMRVJfU1RBUlRTVUJNU0csCi0gIFVQQl9IQU5ETEVSX0VORFNVQk1TRywKLSAgVVBCX0hBTkRMRVJfU1RBUlRTRVEsCi0gIFVQQl9IQU5ETEVSX0VORFNFUQotfSB1cGJfaGFuZGxlcnR5cGVfdDsKLQotI2RlZmluZSBVUEJfSEFORExFUl9NQVggKFVQQl9IQU5ETEVSX0VORFNFUSsxKQotCi0jZGVmaW5lIFVQQl9CUkVBSyBOVUxMCi0KLS8qIEEgY29udmVuaWVudCBkZWZpbml0aW9uIGZvciB3aGVuIG5vIGNsb3N1cmUgaXMgbmVlZGVkLiAqLwotZXh0ZXJuIGNoYXIgX3VwYl9ub2Nsb3N1cmU7Ci0jZGVmaW5lIFVQQl9OT19DTE9TVVJFICZfdXBiX25vY2xvc3VyZQotCi0vKiBBIHNlbGVjdG9yIHJlZmVycyB0byBhIHNwZWNpZmljIGZpZWxkIGhhbmRsZXIgaW4gdGhlIEhhbmRsZXJzIG9iamVjdAotICogKGZvciBleGFtcGxlOiB0aGUgU1RBUlRTVUJNU0cgaGFuZGxlciBmb3IgZmllbGQgImZpZWxkMTUiKS4gKi8KLXR5cGVkZWYgaW50MzJfdCB1cGJfc2VsZWN0b3JfdDsKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIEZvcndhcmQtZGVjbGFyZXMgZm9yIEMgaW5saW5lIGFjY2Vzc29ycy4gIFdlIG5lZWQgdG8gZGVjbGFyZSB0aGVzZSBoZXJlCi0gKiBzbyB3ZSBjYW4gImZyaWVuZCIgdGhlbSBpbiB0aGUgY2xhc3MgZGVjbGFyYXRpb25zIGluIEMrKy4gKi8KLVVQQl9JTkxJTkUgdXBiX2Z1bmMgKnVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zZWxlY3Rvcl90IHMpOwotVVBCX0lOTElORSBjb25zdCB2b2lkICp1cGJfaGFuZGxlcmF0dHJfaGFuZGxlcmRhdGEoY29uc3QgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLVVQQl9JTkxJTkUgY29uc3Qgdm9pZCAqdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zZWxlY3Rvcl90IHMpOwotCi1VUEJfSU5MSU5FIHZvaWQgdXBiX2J1ZmhhbmRsZV9pbml0KHVwYl9idWZoYW5kbGUgKmgpOwotVVBCX0lOTElORSB2b2lkIHVwYl9idWZoYW5kbGVfc2V0b2JqKHVwYl9idWZoYW5kbGUgKmgsIGNvbnN0IHZvaWQgKm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0eXBlKTsKLVVQQl9JTkxJTkUgdm9pZCB1cGJfYnVmaGFuZGxlX3NldGJ1Zih1cGJfYnVmaGFuZGxlICpoLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mcyk7Ci1VUEJfSU5MSU5FIGNvbnN0IHZvaWQgKnVwYl9idWZoYW5kbGVfb2JqKGNvbnN0IHVwYl9idWZoYW5kbGUgKmgpOwotVVBCX0lOTElORSBjb25zdCB2b2lkICp1cGJfYnVmaGFuZGxlX29ianR5cGUoY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCk7Ci1VUEJfSU5MSU5FIGNvbnN0IGNoYXIgKnVwYl9idWZoYW5kbGVfYnVmKGNvbnN0IHVwYl9idWZoYW5kbGUgKmgpOwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLQotLyogU3RhdGljIHNlbGVjdG9ycyBmb3IgdXBiOjpIYW5kbGVycy4gKi8KLSNkZWZpbmUgVVBCX1NUQVJUTVNHX1NFTEVDVE9SIDAKLSNkZWZpbmUgVVBCX0VORE1TR19TRUxFQ1RPUiAxCi0jZGVmaW5lIFVQQl9TVEFUSUNfU0VMRUNUT1JfQ09VTlQgMgotCi0vKiBTdGF0aWMgc2VsZWN0b3JzIGZvciB1cGI6OkJ5dGVzSGFuZGxlci4gKi8KLSNkZWZpbmUgVVBCX1NUQVJUU1RSX1NFTEVDVE9SIDAKLSNkZWZpbmUgVVBCX1NUUklOR19TRUxFQ1RPUiAxCi0jZGVmaW5lIFVQQl9FTkRTVFJfU0VMRUNUT1IgMgotCi10eXBlZGVmIHZvaWQgdXBiX2hhbmRsZXJmcmVlKHZvaWQgKmQpOwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQSBzZXQgb2YgYXR0cmlidXRlcyB0aGF0IGFjY29tcGFuaWVzIGEgaGFuZGxlcidzIGZ1bmN0aW9uIHBvaW50ZXIuICovCi1jbGFzcyB1cGI6OkhhbmRsZXJBdHRyaWJ1dGVzIHsKLSBwdWJsaWM6Ci0gIEhhbmRsZXJBdHRyaWJ1dGVzKCk7Ci0gIH5IYW5kbGVyQXR0cmlidXRlcygpOwotCi0gIC8qIFNldHMgdGhlIGhhbmRsZXIgZGF0YSB0aGF0IHdpbGwgYmUgcGFzc2VkIGFzIHRoZSBzZWNvbmQgcGFyYW1ldGVyIG9mIHRoZQotICAgKiBoYW5kbGVyLiAgVG8gZnJlZSB0aGlzIHBvaW50ZXIgd2hlbiB0aGUgaGFuZGxlcnMgYXJlIGZyZWVkLCBjYWxsCi0gICAqIEhhbmRsZXJzOjpBZGRDbGVhbnVwKCkuICovCi0gIGJvb2wgU2V0SGFuZGxlckRhdGEoY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhKTsKLSAgY29uc3Qgdm9pZCogaGFuZGxlcl9kYXRhKCkgY29uc3Q7Ci0KLSAgLyogVXNlIHRoaXMgdG8gc3BlY2lmeSB0aGUgdHlwZSBvZiB0aGUgY2xvc3VyZS4gIFRoaXMgd2lsbCBiZSBjaGVja2VkIGFnYWluc3QKLSAgICogYWxsIG90aGVyIGNsb3N1cmUgdHlwZXMgZm9yIGhhbmRsZXIgdGhhdCB1c2UgdGhlIHNhbWUgY2xvc3VyZS4KLSAgICogUmVnaXN0cmF0aW9uIHdpbGwgZmFpbCBpZiB0aGlzIGRvZXMgbm90IG1hdGNoIGFsbCBvdGhlciBub24tTlVMTCBjbG9zdXJlCi0gICAqIHR5cGVzLiAqLwotICBib29sIFNldENsb3N1cmVUeXBlKGNvbnN0IHZvaWQgKmNsb3N1cmVfdHlwZSk7Ci0gIGNvbnN0IHZvaWQqIGNsb3N1cmVfdHlwZSgpIGNvbnN0OwotCi0gIC8qIFVzZSB0aGlzIHRvIHNwZWNpZnkgdGhlIHR5cGUgb2YgdGhlIHJldHVybmVkIGNsb3N1cmUuICBPbmx5IHVzZWQgZm9yCi0gICAqIFN0YXJ0KntTdHJpbmcsU3ViTWVzc2FnZSxTZXF1ZW5jZX0gaGFuZGxlcnMuICBUaGlzIG11c3QgbWF0Y2ggdGhlIGNsb3N1cmUKLSAgICogdHlwZSBvZiBhbnkgaGFuZGxlcnMgdGhhdCB1c2UgaXQgKGZvciBleGFtcGxlLCB0aGUgU3RyaW5nQnVmIGhhbmRsZXIgbXVzdAotICAgKiBtYXRjaCB0aGUgY2xvc3VyZSByZXR1cm5lZCBmcm9tIFN0YXJ0U3RyaW5nKS4gKi8KLSAgYm9vbCBTZXRSZXR1cm5DbG9zdXJlVHlwZShjb25zdCB2b2lkICpyZXR1cm5fY2xvc3VyZV90eXBlKTsKLSAgY29uc3Qgdm9pZCogcmV0dXJuX2Nsb3N1cmVfdHlwZSgpIGNvbnN0OwotCi0gIC8qIFNldCB0byBpbmRpY2F0ZSB0aGF0IHRoZSBoYW5kbGVyIGFsd2F5cyByZXR1cm5zICJvayIgKGVpdGhlciAidHJ1ZSIgb3IgYQotICAgKiBub24tTlVMTCBjbG9zdXJlKS4gIFRoaXMgaXMgYSBoaW50IHRoYXQgY2FuIGFsbG93IGNvZGUgZ2VuZXJhdG9ycyB0bwotICAgKiBnZW5lcmF0ZSBtb3JlIGVmZmljaWVudCBjb2RlLiAqLwotICBib29sIFNldEFsd2F5c09rKGJvb2wgYWx3YXlzX29rKTsKLSAgYm9vbCBhbHdheXNfb2soKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIGNvbnN0IHZvaWQgKiA6OnVwYl9oYW5kbGVyYXR0cl9oYW5kbGVyZGF0YSgKLSAgICAgIGNvbnN0IHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci0jZWxzZQotc3RydWN0IHVwYl9oYW5kbGVyYXR0ciB7Ci0jZW5kaWYKLSAgY29uc3Qgdm9pZCAqaGFuZGxlcl9kYXRhXzsKLSAgY29uc3Qgdm9pZCAqY2xvc3VyZV90eXBlXzsKLSAgY29uc3Qgdm9pZCAqcmV0dXJuX2Nsb3N1cmVfdHlwZV87Ci0gIGJvb2wgYWx3YXlzb2tfOwotfTsKLQotI2RlZmluZSBVUEJfSEFORExFUkFUVFJfSU5JVElBTElaRVIge05VTEwsIE5VTEwsIE5VTEwsIGZhbHNlfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIHVwYl9mdW5jICpmdW5jOwotCi0gIC8qIEl0IGlzIHdhc3RlZnVsIHRvIGluY2x1ZGUgdGhlIGVudGlyZSBhdHRyaWJ1dGVzIGhlcmU6Ci0gICAqCi0gICAqICogU29tZSBvZiB0aGUgaW5mb3JtYXRpb24gaXMgcmVkdW5kYW50IChsaWtlIHN0b3JpbmcgdGhlIGNsb3N1cmUgdHlwZQotICAgKiAgIHNlcGFyYXRlbHkgZm9yIGVhY2ggaGFuZGxlciB0aGF0IG11c3QgbWF0Y2gpLgotICAgKiAqIFNvbWUgb2YgdGhlIGluZm8gaXMgb25seSBuZWVkZWQgcHJpb3IgdG8gZnJlZXplKCkgKGxpa2UgY2xvc3VyZSB0eXBlcykuCi0gICAqICogYWxpZ25tZW50IHBhZGRpbmcgd2FzdGVzIGEgbG90IG9mIHNwYWNlIGZvciBhbHdheXNva18uCi0gICAqCi0gICAqIElmL3doZW4gdGhlIHNpemUgYW5kIGxvY2FsaXR5IG9mIGhhbmRsZXJzIGlzIGFuIGlzc3VlLCB3ZSBjYW4gb3B0aW1pemUgdGhpcwotICAgKiBub3QgdG8gc3RvcmUgdGhlIGVudGlyZSBhdHRyIGxpa2UgdGhpcy4gIFdlIGRvIG5vdCBleHBvc2UgdGhlIHRhYmxlJ3MKLSAgICogbGF5b3V0IHRvIGFsbG93IHRoaXMgb3B0aW1pemF0aW9uIGluIHRoZSBmdXR1cmUuICovCi0gIHVwYl9oYW5kbGVyYXR0ciBhdHRyOwotfSB1cGJfaGFuZGxlcnNfdGFiZW50OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogRXh0cmEgaW5mb3JtYXRpb24gYWJvdXQgYSBidWZmZXIgdGhhdCBpcyBwYXNzZWQgdG8gYSBTdHJpbmdCdWYgaGFuZGxlci4KLSAqIFRPRE8oaGFiZXJtYW4pOiBhbGxvdyB0aGUgaGFuZGxlIHRvIGJlIHBpbm5lZCBzbyB0aGF0IGl0IHdpbGwgb3V0bGl2ZQotICogdGhlIGhhbmRsZXIgaW52b2NhdGlvbi4gKi8KLWNsYXNzIHVwYjo6QnVmZmVySGFuZGxlIHsKLSBwdWJsaWM6Ci0gIEJ1ZmZlckhhbmRsZSgpOwotICB+QnVmZmVySGFuZGxlKCk7Ci0KLSAgLyogVGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyLiAgVGhpcyBtYXkgYmUgZGlmZmVyZW50IHRoYW4gdGhlIHBvaW50ZXIKLSAgICogcGFzc2VkIHRvIGEgU3RyaW5nQnVmIGhhbmRsZXIgYmVjYXVzZSB0aGUgaGFuZGxlciBtYXkgcmVjZWl2ZSBkYXRhCi0gICAqIHRoYXQgaXMgZnJvbSB0aGUgbWlkZGxlIG9yIGVuZCBvZiBhIGxhcmdlciBidWZmZXIuICovCi0gIGNvbnN0IGNoYXIqIGJ1ZmZlcigpIGNvbnN0OwotCi0gIC8qIFRoZSBvZmZzZXQgd2l0aGluIHRoZSBhdHRhY2hlZCBvYmplY3Qgd2hlcmUgdGhpcyBidWZmZXIgYmVnaW5zLiAgT25seQotICAgKiBtZWFuaW5nZnVsIGlmIHRoZXJlIGlzIGFuIGF0dGFjaGVkIG9iamVjdC4gKi8KLSAgc2l6ZV90IG9iamVjdF9vZmZzZXQoKSBjb25zdDsKLQotICAvKiBOb3RlIHRoYXQgb2JqZWN0X29mZnNldCBpcyB0aGUgb2Zmc2V0IG9mICJidWYiIHdpdGhpbiB0aGUgYXR0YWNoZWQKLSAgICogb2JqZWN0LiAqLwotICB2b2lkIFNldEJ1ZmZlcihjb25zdCBjaGFyKiBidWYsIHNpemVfdCBvYmplY3Rfb2Zmc2V0KTsKLQotICAvKiBUaGUgQnVmZmVySGFuZGxlIGNhbiBoYXZlIGFuICJhdHRhY2hlZCBvYmplY3QiLCB3aGljaCBjYW4gYmUgdXNlZCB0bwotICAgKiB0dW5uZWwgdGhyb3VnaCBhIHBvaW50ZXIgdG8gdGhlIGJ1ZmZlcidzIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPgotICB2b2lkIFNldEF0dGFjaGVkT2JqZWN0KGNvbnN0IFQqIG9iaik7Ci0KLSAgLyogUmV0dXJucyBOVUxMIGlmIHRoZSBhdHRhY2hlZCBvYmplY3QgaXMgbm90IG9mIHRoaXMgdHlwZS4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+Ci0gIGNvbnN0IFQqIEdldEF0dGFjaGVkT2JqZWN0KCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgVVBCX0lOTElORSB2b2lkIDo6dXBiX2J1ZmhhbmRsZV9pbml0KHVwYl9idWZoYW5kbGUgKmgpOwotICBmcmllbmQgVVBCX0lOTElORSB2b2lkIDo6dXBiX2J1ZmhhbmRsZV9zZXRvYmoodXBiX2J1ZmhhbmRsZSAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQgKnR5cGUpOwotICBmcmllbmQgVVBCX0lOTElORSB2b2lkIDo6dXBiX2J1ZmhhbmRsZV9zZXRidWYodXBiX2J1ZmhhbmRsZSAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG9mcyk7Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIGNvbnN0IHZvaWQqIDo6dXBiX2J1ZmhhbmRsZV9vYmooY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCk7Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIGNvbnN0IHZvaWQqIDo6dXBiX2J1ZmhhbmRsZV9vYmp0eXBlKAotICAgICAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCk7Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIGNvbnN0IGNoYXIqIDo6dXBiX2J1ZmhhbmRsZV9idWYoY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCk7Ci0jZWxzZQotc3RydWN0IHVwYl9idWZoYW5kbGUgewotI2VuZGlmCi0gIGNvbnN0IGNoYXIgKmJ1Zl87Ci0gIGNvbnN0IHZvaWQgKm9ial87Ci0gIGNvbnN0IHZvaWQgKm9ianR5cGVfOwotICBzaXplX3Qgb2Jqb2ZzXzsKLX07Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBBIHVwYjo6SGFuZGxlcnMgb2JqZWN0IHJlcHJlc2VudHMgdGhlIHNldCBvZiBoYW5kbGVycyBhc3NvY2lhdGVkIHdpdGggYQotICogbWVzc2FnZSBpbiB0aGUgZ3JhcGggb2YgbWVzc2FnZXMuICBZb3UgY2FuIHRoaW5rIG9mIGl0IGFzIGEgYmlnIHZpcnR1YWwKLSAqIHRhYmxlIHdpdGggZnVuY3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gYWxsIHRoZSBldmVudHMgdGhhdCBjYW4gZmlyZSB3aGlsZQotICogcGFyc2luZyBvciB2aXNpdGluZyBhIG1lc3NhZ2Ugb2YgYSBzcGVjaWZpYyB0eXBlLgotICoKLSAqIEFueSBoYW5kbGVycyB0aGF0IGFyZSBub3Qgc2V0IGJlaGF2ZSBhcyBpZiB0aGV5IGhhZCBzdWNjZXNzZnVsbHkgY29uc3VtZWQKLSAqIHRoZSB2YWx1ZS4gIEFueSB1bnNldCBTdGFydCogaGFuZGxlcnMgd2lsbCBwcm9wYWdhdGUgdGhlaXIgY2xvc3VyZSB0byB0aGUKLSAqIGlubmVyIGZyYW1lLgotICoKLSAqIFRoZSBlYXNpZXN0IHdheSB0byBjcmVhdGUgdGhlICpIYW5kbGVyIG9iamVjdHMgbmVlZGVkIGJ5IHRoZSBTZXQqIG1ldGhvZHMgaXMKLSAqIHdpdGggdGhlIFVwYkJpbmQoKSBhbmQgVXBiTWFrZUhhbmRsZXIoKSBtYWNyb3M7IHNlZSBiZWxvdy4gKi8KLWNsYXNzIHVwYjo6SGFuZGxlcnMgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB1cGJfc2VsZWN0b3JfdCBTZWxlY3RvcjsKLSAgdHlwZWRlZiB1cGJfaGFuZGxlcnR5cGVfdCBUeXBlOwotCi0gIHR5cGVkZWYgSGFuZGxlcjx2b2lkICooKikodm9pZCAqLCBjb25zdCB2b2lkICopPiBTdGFydEZpZWxkSGFuZGxlcjsKLSAgdHlwZWRlZiBIYW5kbGVyPGJvb2wgKCopKHZvaWQgKiwgY29uc3Qgdm9pZCAqKT4gRW5kRmllbGRIYW5kbGVyOwotICB0eXBlZGVmIEhhbmRsZXI8Ym9vbCAoKikodm9pZCAqLCBjb25zdCB2b2lkICopPiBTdGFydE1lc3NhZ2VIYW5kbGVyOwotICB0eXBlZGVmIEhhbmRsZXI8Ym9vbCAoKikodm9pZCAqLCBjb25zdCB2b2lkICosIFN0YXR1cyopPiBFbmRNZXNzYWdlSGFuZGxlcjsKLSAgdHlwZWRlZiBIYW5kbGVyPHZvaWQgKigqKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgc2l6ZV90KT4gU3RhcnRTdHJpbmdIYW5kbGVyOwotICB0eXBlZGVmIEhhbmRsZXI8c2l6ZV90ICgqKSh2b2lkICosIGNvbnN0IHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckhhbmRsZSAqKT4gU3RyaW5nSGFuZGxlcjsKLQotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gc3RydWN0IFZhbHVlSGFuZGxlciB7Ci0gICAgdHlwZWRlZiBIYW5kbGVyPGJvb2woKikodm9pZCAqLCBjb25zdCB2b2lkICosIFQpPiBIOwotICB9OwotCi0gIHR5cGVkZWYgVmFsdWVIYW5kbGVyPGludDMyX3Q+OjpIICAgICBJbnQzMkhhbmRsZXI7Ci0gIHR5cGVkZWYgVmFsdWVIYW5kbGVyPGludDY0X3Q+OjpIICAgICBJbnQ2NEhhbmRsZXI7Ci0gIHR5cGVkZWYgVmFsdWVIYW5kbGVyPHVpbnQzMl90Pjo6SCAgICBVSW50MzJIYW5kbGVyOwotICB0eXBlZGVmIFZhbHVlSGFuZGxlcjx1aW50NjRfdD46OkggICAgVUludDY0SGFuZGxlcjsKLSAgdHlwZWRlZiBWYWx1ZUhhbmRsZXI8ZmxvYXQ+OjpIICAgICAgIEZsb2F0SGFuZGxlcjsKLSAgdHlwZWRlZiBWYWx1ZUhhbmRsZXI8ZG91YmxlPjo6SCAgICAgIERvdWJsZUhhbmRsZXI7Ci0gIHR5cGVkZWYgVmFsdWVIYW5kbGVyPGJvb2w+OjpIICAgICAgICBCb29sSGFuZGxlcjsKLQotICAvKiBBbnkgZnVuY3Rpb24gcG9pbnRlciBjYW4gYmUgY29udmVydGVkIHRvIHRoaXMgYW5kIGNvbnZlcnRlZCBiYWNrIHRvIGl0cwotICAgKiBjb3JyZWN0IHR5cGUuICovCi0gIHR5cGVkZWYgdm9pZCBHZW5lcmljRnVuY3Rpb24oKTsKLQotICB0eXBlZGVmIHZvaWQgSGFuZGxlcnNDYWxsYmFjayhjb25zdCB2b2lkICpjbG9zdXJlLCB1cGJfaGFuZGxlcnMgKmgpOwotCi0gIC8qIFJldHVybnMgYSBuZXcgaGFuZGxlcnMgb2JqZWN0IGZvciB0aGUgZ2l2ZW4gZnJvemVuIG1zZ2RlZi4KLSAgICogUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KLSAgc3RhdGljIHJlZmZlZF9wdHI8SGFuZGxlcnM+IE5ldyhjb25zdCBNZXNzYWdlRGVmICptKTsKLQotICAvKiBDb252ZW5pZW5jZSBmdW5jdGlvbiBmb3IgcmVnaXN0ZXJpbmcgYSBncmFwaCBvZiBoYW5kbGVycyB0aGF0IG1pcnJvcnMgdGhlCi0gICAqIGdyYXBoIG9mIG1zZ2RlZnMgZm9yIHNvbWUgbWVzc2FnZS4gIEZvciAibSIgYW5kIGFsbCBpdHMgY2hpbGRyZW4gYSBuZXcgc2V0Ci0gICAqIG9mIGhhbmRsZXJzIHdpbGwgYmUgY3JlYXRlZCBhbmQgdGhlIGdpdmVuIGNhbGxiYWNrIHdpbGwgYmUgaW52b2tlZCwKLSAgICogYWxsb3dpbmcgdGhlIGNsaWVudCB0byByZWdpc3RlciBoYW5kbGVycyBmb3IgdGhpcyBtZXNzYWdlLiAgTm90ZSB0aGF0IGFueQotICAgKiBzdWJoYW5kbGVycyBzZXQgYnkgdGhlIGNhbGxiYWNrIHdpbGwgYmUgb3ZlcndyaXR0ZW4uICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPGNvbnN0IEhhbmRsZXJzPiBOZXdGcm96ZW4oY29uc3QgTWVzc2FnZURlZiAqbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBIYW5kbGVyc0NhbGxiYWNrICpjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjbG9zdXJlKTsKLQotICAvKiBGdW5jdGlvbmFsaXR5IGZyb20gdXBiOjpSZWZDb3VudGVkLiAqLwotICBVUEJfUkVGQ09VTlRFRF9DUFBNRVRIT0RTCi0KLSAgLyogQWxsIGhhbmRsZXIgcmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyByZXR1cm4gYm9vbCB0byBpbmRpY2F0ZSBzdWNjZXNzIG9yCi0gICAqIGZhaWx1cmU7IGRldGFpbHMgYWJvdXQgZmFpbHVyZXMgYXJlIHN0b3JlZCBpbiB0aGlzIHN0YXR1cyBvYmplY3QuICBJZiBhCi0gICAqIGZhaWx1cmUgZG9lcyBvY2N1ciwgaXQgbXVzdCBiZSBjbGVhcmVkIGJlZm9yZSB0aGUgSGFuZGxlcnMgYXJlIGZyb3plbiwKLSAgICogb3RoZXJ3aXNlIHRoZSBmcmVlemUoKSBvcGVyYXRpb24gd2lsbCBmYWlsLiAgVGhlIGZ1bmN0aW9ucyBtYXkgKm9ubHkqIGJlCi0gICAqIHVzZWQgd2hpbGUgdGhlIEhhbmRsZXJzIGFyZSBtdXRhYmxlLiAqLwotICBjb25zdCBTdGF0dXMqIHN0YXR1cygpOwotICB2b2lkIENsZWFyRXJyb3IoKTsKLQotICAvKiBDYWxsIHRvIGZyZWV6ZSB0aGVzZSBIYW5kbGVycy4gIFJlcXVpcmVzIHRoYXQgYW55IFN1YkhhbmRsZXJzIGFyZSBhbHJlYWR5Ci0gICAqIGZyb3plbi4gIEZvciBjeWNsZXMsIHlvdSBtdXN0IHVzZSB0aGUgc3RhdGljIHZlcnNpb24gYmVsb3cgYW5kIGZyZWV6ZSB0aGUKLSAgICogd2hvbGUgZ3JhcGggYXQgb25jZS4gKi8KLSAgYm9vbCBGcmVlemUoU3RhdHVzKiBzKTsKLQotICAvKiBGcmVlemVzIHRoZSBnaXZlbiBzZXQgb2YgaGFuZGxlcnMuICBZb3UgbWF5IG5vdCBmcmVlemUgYSBoYW5kbGVyIHdpdGhvdXQKLSAgICogYWxzbyBmcmVlemluZyBhbnkgaGFuZGxlcnMgdGhleSBwb2ludCB0by4gKi8KLSAgc3RhdGljIGJvb2wgRnJlZXplKEhhbmRsZXJzKmNvbnN0KiBoYW5kbGVycywgaW50IG4sIFN0YXR1cyogcyk7Ci0gIHN0YXRpYyBib29sIEZyZWV6ZShjb25zdCBzdGQ6OnZlY3RvcjxIYW5kbGVycyo+JiBoYW5kbGVycywgU3RhdHVzKiBzKTsKLQotICAvKiBSZXR1cm5zIHRoZSBtc2dkZWYgYXNzb2NpYXRlZCB3aXRoIHRoaXMgaGFuZGxlcnMgb2JqZWN0LiAqLwotICBjb25zdCBNZXNzYWdlRGVmKiBtZXNzYWdlX2RlZigpIGNvbnN0OwotCi0gIC8qIEFkZHMgdGhlIGdpdmVuIHBvaW50ZXIgYW5kIGZ1bmN0aW9uIHRvIHRoZSBsaXN0IG9mIGNsZWFudXAgZnVuY3Rpb25zIHRoYXQKLSAgICogd2lsbCBiZSBydW4gd2hlbiB0aGVzZSBoYW5kbGVycyBhcmUgZnJlZWQuICBJZiB0aGlzIHBvaW50ZXIgaGFzIHByZXZpb3VzbHkKLSAgICogYmVlbiByZWdpc3RlcmVkLCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZSBhbmQgZG9lcyBub3RoaW5nLiAqLwotICBib29sIEFkZENsZWFudXAodm9pZCAqcHRyLCB1cGJfaGFuZGxlcmZyZWUgKmNsZWFudXApOwotCi0gIC8qIFNldHMgdGhlIHN0YXJ0bXNnIGhhbmRsZXIgZm9yIHRoZSBtZXNzYWdlLCB3aGljaCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gICAqCi0gICAqICAgYm9vbCBzdGFydG1zZyhNeVR5cGUqIGNsb3N1cmUpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIHRoZSBtZXNzYWdlIGJlZ2lucy4gIFJldHVybnMgdHJ1ZSBpZiBwcm9jZXNzaW5nIHNob3VsZAotICAgKiAgICAgLy8gY29udGludWUuCi0gICAqICAgICByZXR1cm4gdHJ1ZTsKLSAgICogICB9Ci0gICAqLwotICBib29sIFNldFN0YXJ0TWVzc2FnZUhhbmRsZXIoY29uc3QgU3RhcnRNZXNzYWdlSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLyogU2V0cyB0aGUgZW5kbXNnIGhhbmRsZXIgZm9yIHRoZSBtZXNzYWdlLCB3aGljaCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gICAqCi0gICAqICAgYm9vbCBlbmRtc2coTXlUeXBlKiBjbG9zdXJlLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIHByb2Nlc3Npbmcgb2YgdGhpcyBtZXNzYWdlIGVuZHMsIHdoZXRoZXIgaW4gc3VjY2VzcyBvcgotICAgKiAgICAgLy8gZmFpbHVyZS4gICJzdGF0dXMiIGluZGljYXRlcyB0aGUgZmluYWwgc3RhdHVzIG9mIHByb2Nlc3NpbmcsIGFuZAotICAgKiAgICAgLy8gY2FuIGFsc28gYmUgbW9kaWZpZWQgaW4tcGxhY2UgdG8gdXBkYXRlIHRoZSBmaW5hbCBzdGF0dXMuCi0gICAqICAgfQotICAgKi8KLSAgYm9vbCBTZXRFbmRNZXNzYWdlSGFuZGxlcihjb25zdCBFbmRNZXNzYWdlSGFuZGxlciYgaGFuZGxlcik7Ci0KLSAgLyogU2V0cyB0aGUgdmFsdWUgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGZpZWxkLCB3aGljaCBpcyBkZWZpbmVkIGFzIGZvbGxvd3MKLSAgICogKHRoaXMgaXMgZm9yIGFuIGludDMyIGZpZWxkOyBvdGhlciBmaWVsZCB0eXBlcyB3aWxsIHBhc3MgdGhlaXIgbmF0aXZlCi0gICAqIEMvQysrIHR5cGUgZm9yICJ2YWwiKToKLSAgICoKLSAgICogICBib29sIE9uVmFsdWUoTXlDbG9zdXJlKiBjLCBjb25zdCBNeUhhbmRsZXJEYXRhKiBkLCBpbnQzMl90IHZhbCkgewotICAgKiAgICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGZpZWxkJ3MgdmFsdWUgaXMgZW5jb3VudGVyZWQuICAiZCIgY29udGFpbnMKLSAgICogICAgIC8vIHdoYXRldmVyIGRhdGEgd2FzIGJvdW5kIHRvIHRoaXMgZmllbGQgd2hlbiBpdCB3YXMgcmVnaXN0ZXJlZC4KLSAgICogICAgIC8vIFJldHVybnMgdHJ1ZSBpZiBwcm9jZXNzaW5nIHNob3VsZCBjb250aW51ZS4KLSAgICogICAgIHJldHVybiB0cnVlOwotICAgKiAgIH0KLSAgICoKLSAgICogICBoYW5kZXJzLT5TZXRJbnQzMkhhbmRsZXIoZiwgVXBiQmluZChPblZhbHVlLCBuZXcgTXlIYW5kbGVyRGF0YSguLi4pKSk7Ci0gICAqCi0gICAqIFRoZSB2YWx1ZSB0eXBlIG11c3QgZXhhY3RseSBtYXRjaCBmLT50eXBlKCkuCi0gICAqIEZvciBleGFtcGxlLCBhIGhhbmRsZXIgdGhhdCB0YWtlcyBhbiBpbnQzMl90IHBhcmFtZXRlciBtYXkgb25seSBiZSB1c2VkIGZvcgotICAgKiBmaWVsZHMgb2YgdHlwZSBVUEJfVFlQRV9JTlQzMiBhbmQgVVBCX1RZUEVfRU5VTS4KLSAgICoKLSAgICogUmV0dXJucyBmYWxzZSBpZiB0aGUgaGFuZGxlciBmYWlsZWQgdG8gcmVnaXN0ZXI7IGluIHRoaXMgY2FzZSB0aGUgY2xlYW51cAotICAgKiBoYW5kbGVyIChpZiBhbnkpIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5LgotICAgKi8KLSAgYm9vbCBTZXRJbnQzMkhhbmRsZXIgKGNvbnN0IEZpZWxkRGVmKiBmLCAgY29uc3QgSW50MzJIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXRJbnQ2NEhhbmRsZXIgKGNvbnN0IEZpZWxkRGVmKiBmLCAgY29uc3QgSW50NjRIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXRVSW50MzJIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBVSW50MzJIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXRVSW50NjRIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBVSW50NjRIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXRGbG9hdEhhbmRsZXIgKGNvbnN0IEZpZWxkRGVmKiBmLCAgY29uc3QgRmxvYXRIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXREb3VibGVIYW5kbGVyKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBEb3VibGVIYW5kbGVyJiBoKTsKLSAgYm9vbCBTZXRCb29sSGFuZGxlciAgKGNvbnN0IEZpZWxkRGVmKiBmLCAgIGNvbnN0IEJvb2xIYW5kbGVyJiBoKTsKLQotICAvKiBMaWtlIHRoZSBwcmV2aW91cywgYnV0IHRlbXBsYXRlZCBvbiB0aGUgdHlwZSBvbiB0aGUgdmFsdWUgKGllLiBpbnQzMikuCi0gICAqIFRoaXMgaXMgbW9zdGx5IHVzZWZ1bCB0byBjYWxsIGZyb20gb3RoZXIgdGVtcGxhdGVzLiAgVG8gY2FsbCB0aGlzIHlvdSBtdXN0Ci0gICAqIHNwZWNpZnkgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBleHBsaWNpdGx5LCBpZToKLSAgICogICBoLT5TZXRWYWx1ZUhhbmRsZXI8VD4oZiwgVXBiQmluZChNeUhhbmRsZXI8VD4sIE15RGF0YSkpOyAqLwotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KLSAgYm9vbCBTZXRWYWx1ZUhhbmRsZXIoCi0gICAgICBjb25zdCBGaWVsZERlZiAqZiwKLSAgICAgIGNvbnN0IHR5cGVuYW1lIFZhbHVlSGFuZGxlcjx0eXBlbmFtZSBDYW5vbmljYWxUeXBlPFQ+OjpUeXBlPjo6SCYgaGFuZGxlcik7Ci0KLSAgLyogU2V0cyBoYW5kbGVycyBmb3IgYSBzdHJpbmcgZmllbGQsIHdoaWNoIGFyZSBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gICAqCi0gICAqICAgTXlTdWJDbG9zdXJlKiBzdGFydHN0cihNeUNsb3N1cmUqIGMsIGNvbnN0IE15SGFuZGxlckRhdGEqIGQsCi0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50KSB7Ci0gICAqICAgICAvLyBDYWxsZWQgd2hlbiBhIHN0cmluZyB2YWx1ZSBiZWdpbnMuICBUaGUgcmV0dXJuIHZhbHVlIGluZGljYXRlcyB0aGUKLSAgICogICAgIC8vIGNsb3N1cmUgZm9yIHRoZSBzdHJpbmcuICAic2l6ZV9oaW50IiBpbmRpY2F0ZXMgdGhlIHNpemUgb2YgdGhlCi0gICAqICAgICAvLyBzdHJpbmcgaWYgaXQgaXMga25vd24sIGhvd2V2ZXIgaWYgdGhlIHN0cmluZyBpcyBsZW5ndGgtZGVsaW1pdGVkCi0gICAqICAgICAvLyBhbmQgdGhlIGVuZC1vZi1zdHJpbmcgaXMgbm90IGF2YWlsYWJsZSBzaXplX2hpbnQgd2lsbCBiZSB6ZXJvLgotICAgKiAgICAgLy8gVGhpcyBjYXNlIGlzIGluZGlzdGluZ3Vpc2hhYmxlIGZyb20gdGhlIGNhc2Ugd2hlcmUgdGhlIHNpemUgaXMKLSAgICogICAgIC8vIGtub3duIHRvIGJlIHplcm8uCi0gICAqICAgICAvLwotICAgKiAgICAgLy8gVE9ETyhoYWJlcm1hbik6IGlzIGl0IGltcG9ydGFudCB0byBkaXN0aW5ndWlzaCB0aGVzZSBjYXNlcz8KLSAgICogICAgIC8vIElmIHdlIGhhZCBzc2l6ZV90IGFzIGEgdHlwZSB3ZSBjb3VsZCBtYWtlIC0xICJ1bmtub3duIiwgYnV0Ci0gICAqICAgICAvLyBzc2l6ZV90IGlzIFBPU0lYIChub3QgQU5TSSkgYW5kIHRoZXJlZm9yZSBsZXNzIHBvcnRhYmxlLgotICAgKiAgICAgLy8gSW4gcHJhY3RpY2UgSSBzdXNwZWN0IGl0IHdvbid0IGJlIGltcG9ydGFudCB0byBkaXN0aW5ndWlzaC4KLSAgICogICAgIHJldHVybiBjbG9zdXJlOwotICAgKiAgIH0KLSAgICoKLSAgICogICBzaXplX3Qgc3RyKE15Q2xvc3VyZSogY2xvc3VyZSwgY29uc3QgTXlIYW5kbGVyRGF0YSogZCwKLSAgICogICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciwgc2l6ZV90IGxlbikgewotICAgKiAgICAgLy8gQ2FsbGVkIGZvciBlYWNoIGJ1ZmZlciBvZiBzdHJpbmcgZGF0YTsgdGhlIG11bHRpcGxlIHBoeXNpY2FsIGJ1ZmZlcnMKLSAgICogICAgIC8vIGFyZSBhbGwgcGFydCBvZiB0aGUgc2FtZSBsb2dpY2FsIHN0cmluZy4gIFRoZSByZXR1cm4gdmFsdWUgaW5kaWNhdGVzCi0gICAqICAgICAvLyBob3cgbWFueSBieXRlcyB3ZXJlIGNvbnN1bWVkLiAgSWYgdGhpcyBudW1iZXIgaXMgbGVzcyB0aGFuICJsZW4iLAotICAgKiAgICAgLy8gdGhpcyB3aWxsIGFsc28gaW5kaWNhdGUgdGhhdCBwcm9jZXNzaW5nIHNob3VsZCBiZSBoYWx0ZWQgZm9yIG5vdywKLSAgICogICAgIC8vIGxpa2UgcmV0dXJuaW5nIGZhbHNlIG9yIFVQQl9CUkVBSyBmcm9tIGFueSBvdGhlciBjYWxsYmFjay4gIElmCi0gICAqICAgICAvLyBudW1iZXIgaXMgZ3JlYXRlciB0aGFuICJsZW4iLCB0aGUgZXhjZXNzIGJ5dGVzIHdpbGwgYmUgc2tpcHBlZCBvdmVyCi0gICAqICAgICAvLyBhbmQgbm90IHBhc3NlZCB0byB0aGUgY2FsbGJhY2suCi0gICAqICAgICByZXR1cm4gbGVuOwotICAgKiAgIH0KLSAgICoKLSAgICogICBib29sIGVuZHN0cihNeUNsb3N1cmUqIGMsIGNvbnN0IE15SGFuZGxlckRhdGEqIGQpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIGEgc3RyaW5nIHZhbHVlIGVuZHMuICBSZXR1cm4gdmFsdWUgaW5kaWNhdGVzIHdoZXRoZXIKLSAgICogICAgIC8vIHByb2Nlc3Npbmcgc2hvdWxkIGNvbnRpbnVlLgotICAgKiAgICAgcmV0dXJuIHRydWU7Ci0gICAqICAgfQotICAgKi8KLSAgYm9vbCBTZXRTdGFydFN0cmluZ0hhbmRsZXIoY29uc3QgRmllbGREZWYqIGYsIGNvbnN0IFN0YXJ0U3RyaW5nSGFuZGxlciYgaCk7Ci0gIGJvb2wgU2V0U3RyaW5nSGFuZGxlcihjb25zdCBGaWVsZERlZiogZiwgY29uc3QgU3RyaW5nSGFuZGxlciYgaCk7Ci0gIGJvb2wgU2V0RW5kU3RyaW5nSGFuZGxlcihjb25zdCBGaWVsZERlZiogZiwgY29uc3QgRW5kRmllbGRIYW5kbGVyJiBoKTsKLQotICAvKiBTZXRzIHRoZSBzdGFydHNlcSBoYW5kbGVyLCB3aGljaCBpcyBkZWZpbmVkIGFzIGZvbGxvd3M6Ci0gICAqCi0gICAqICAgTXlTdWJDbG9zdXJlICpzdGFydHNlcShNeUNsb3N1cmUqIGMsIGNvbnN0IE15SGFuZGxlckRhdGEqIGQpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIGEgc2VxdWVuY2UgKHJlcGVhdGVkIGZpZWxkKSBiZWdpbnMuICBUaGUgcmV0dXJuZWQKLSAgICogICAgIC8vIHBvaW50ZXIgaW5kaWNhdGVzIHRoZSBjbG9zdXJlIGZvciB0aGUgc2VxdWVuY2UgKG9yIFVQQl9CUkVBSwotICAgKiAgICAgLy8gdG8gaW50ZXJydXB0IHByb2Nlc3NpbmcpLgotICAgKiAgICAgcmV0dXJuIGNsb3N1cmU7Ci0gICAqICAgfQotICAgKgotICAgKiAgIGgtPlNldFN0YXJ0U2VxdWVuY2VIYW5kbGVyKGYsIFVwYkJpbmQoc3RhcnRzZXEsIG5ldyBNeUhhbmRsZXJEYXRhKC4uLikpKTsKLSAgICoKLSAgICogUmV0dXJucyAiZmFsc2UiIGlmICJmIiBkb2VzIG5vdCBiZWxvbmcgdG8gdGhpcyBtZXNzYWdlIG9yIGlzIG5vdCBhCi0gICAqIHJlcGVhdGVkIGZpZWxkLgotICAgKi8KLSAgYm9vbCBTZXRTdGFydFNlcXVlbmNlSGFuZGxlcihjb25zdCBGaWVsZERlZiogZiwgY29uc3QgU3RhcnRGaWVsZEhhbmRsZXImIGgpOwotCi0gIC8qIFNldHMgdGhlIHN0YXJ0c3VibXNnIGhhbmRsZXIgZm9yIHRoZSBnaXZlbiBmaWVsZCwgd2hpY2ggaXMgZGVmaW5lZCBhcwotICAgKiBmb2xsb3dzOgotICAgKgotICAgKiAgIE15U3ViQ2xvc3VyZSogc3RhcnRzdWJtc2coTXlDbG9zdXJlKiBjLCBjb25zdCBNeUhhbmRsZXJEYXRhKiBkKSB7Ci0gICAqICAgICAvLyBDYWxsZWQgd2hlbiBhIHN1Ym1lc3NhZ2UgYmVnaW5zLiAgVGhlIHJldHVybmVkIHBvaW50ZXIgaW5kaWNhdGVzIHRoZQotICAgKiAgICAgLy8gY2xvc3VyZSBmb3IgdGhlIHNlcXVlbmNlIChvciBVUEJfQlJFQUsgdG8gaW50ZXJydXB0IHByb2Nlc3NpbmcpLgotICAgKiAgICAgcmV0dXJuIGNsb3N1cmU7Ci0gICAqICAgfQotICAgKgotICAgKiAgIGgtPlNldFN0YXJ0U3ViTWVzc2FnZUhhbmRsZXIoZiwgVXBiQmluZChzdGFydHN1Ym1zZywKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IE15SGFuZGxlckRhdGEoLi4uKSkpOwotICAgKgotICAgKiBSZXR1cm5zICJmYWxzZSIgaWYgImYiIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIG1lc3NhZ2Ugb3IgaXMgbm90IGEKLSAgICogc3VibWVzc2FnZS9ncm91cCBmaWVsZC4KLSAgICovCi0gIGJvb2wgU2V0U3RhcnRTdWJNZXNzYWdlSGFuZGxlcihjb25zdCBGaWVsZERlZiogZiwgY29uc3QgU3RhcnRGaWVsZEhhbmRsZXImIGgpOwotCi0gIC8qIFNldHMgdGhlIGVuZHN1Ym1zZyBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQsIHdoaWNoIGlzIGRlZmluZWQgYXMKLSAgICogZm9sbG93czoKLSAgICoKLSAgICogICBib29sIGVuZHN1Ym1zZyhNeUNsb3N1cmUqIGMsIGNvbnN0IE15SGFuZGxlckRhdGEqIGQpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIGEgc3VibWVzc2FnZSBlbmRzLiAgUmV0dXJucyB0cnVlIHRvIGNvbnRpbnVlIHByb2Nlc3NpbmcuCi0gICAqICAgICByZXR1cm4gdHJ1ZTsKLSAgICogICB9Ci0gICAqCi0gICAqIFJldHVybnMgImZhbHNlIiBpZiAiZiIgZG9lcyBub3QgYmVsb25nIHRvIHRoaXMgbWVzc2FnZSBvciBpcyBub3QgYQotICAgKiBzdWJtZXNzYWdlL2dyb3VwIGZpZWxkLgotICAgKi8KLSAgYm9vbCBTZXRFbmRTdWJNZXNzYWdlSGFuZGxlcihjb25zdCBGaWVsZERlZiAqZiwgY29uc3QgRW5kRmllbGRIYW5kbGVyICZoKTsKLQotICAvKiBTdGFydHMgdGhlIGVuZHN1YnNlcSBoYW5kbGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQsIHdoaWNoIGlzIGRlZmluZWQgYXMKLSAgICogZm9sbG93czoKLSAgICoKLSAgICogICBib29sIGVuZHNlcShNeUNsb3N1cmUqIGMsIGNvbnN0IE15SGFuZGxlckRhdGEqIGQpIHsKLSAgICogICAgIC8vIENhbGxlZCB3aGVuIGEgc2VxdWVuY2UgZW5kcy4gIFJldHVybnMgdHJ1ZSBjb250aW51ZSBwcm9jZXNzaW5nLgotICAgKiAgICAgcmV0dXJuIHRydWU7Ci0gICAqICAgfQotICAgKgotICAgKiBSZXR1cm5zICJmYWxzZSIgaWYgImYiIGRvZXMgbm90IGJlbG9uZyB0byB0aGlzIG1lc3NhZ2Ugb3IgaXMgbm90IGEKLSAgICogcmVwZWF0ZWQgZmllbGQuCi0gICAqLwotICBib29sIFNldEVuZFNlcXVlbmNlSGFuZGxlcihjb25zdCBGaWVsZERlZiogZiwgY29uc3QgRW5kRmllbGRIYW5kbGVyJiBoKTsKLQotICAvKiBTZXRzIG9yIGdldHMgdGhlIG9iamVjdCB0aGF0IHNwZWNpZmllcyBoYW5kbGVycyBmb3IgdGhlIGdpdmVuIGZpZWxkLCB3aGljaAotICAgKiBtdXN0IGJlIGEgc3VibWVzc2FnZSBvciBncm91cC4gIFJldHVybnMgTlVMTCBpZiBubyBoYW5kbGVycyBhcmUgc2V0LiAqLwotICBib29sIFNldFN1YkhhbmRsZXJzKGNvbnN0IEZpZWxkRGVmKiBmLCBjb25zdCBIYW5kbGVycyogc3ViKTsKLSAgY29uc3QgSGFuZGxlcnMqIEdldFN1YkhhbmRsZXJzKGNvbnN0IEZpZWxkRGVmKiBmKSBjb25zdDsKLQotICAvKiBFcXVpdmFsZW50IHRvIEdldFN1YkhhbmRsZXJzLCBidXQgdGFrZXMgdGhlIFNUQVJUU1VCTVNHIHNlbGVjdG9yIGZvciB0aGUKLSAgICogZmllbGQuICovCi0gIGNvbnN0IEhhbmRsZXJzKiBHZXRTdWJIYW5kbGVycyhTZWxlY3RvciBzdGFydHN1Ym1zZykgY29uc3Q7Ci0KLSAgLyogQSBzZWxlY3RvciByZWZlcnMgdG8gYSBzcGVjaWZpYyBmaWVsZCBoYW5kbGVyIGluIHRoZSBIYW5kbGVycyBvYmplY3QKLSAgICogKGZvciBleGFtcGxlOiB0aGUgU1RBUlRTVUJNU0cgaGFuZGxlciBmb3IgZmllbGQgImZpZWxkMTUiKS4KLSAgICogT24gc3VjY2VzcywgcmV0dXJucyB0cnVlIGFuZCBzdG9yZXMgdGhlIHNlbGVjdG9yIGluICJzIi4KLSAgICogSWYgdGhlIEZpZWxkRGVmIG9yIFR5cGUgYXJlIGludmFsaWQsIHJldHVybnMgZmFsc2UuCi0gICAqIFRoZSByZXR1cm5lZCBzZWxlY3RvciBpcyBPTkxZIHZhbGlkIGZvciBIYW5kbGVycyB3aG9zZSBNZXNzYWdlRGVmCi0gICAqIGNvbnRhaW5zIHRoaXMgRmllbGREZWYuICovCi0gIHN0YXRpYyBib29sIEdldFNlbGVjdG9yKGNvbnN0IEZpZWxkRGVmKiBmLCBUeXBlIHR5cGUsIFNlbGVjdG9yKiBzKTsKLQotICAvKiBHaXZlbiBhIFNUQVJUIHNlbGVjdG9yIG9mIGFueSBraW5kLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIEVORCBzZWxlY3Rvci4gKi8KLSAgc3RhdGljIFNlbGVjdG9yIEdldEVuZFNlbGVjdG9yKFNlbGVjdG9yIHN0YXJ0X3NlbGVjdG9yKTsKLQotICAvKiBSZXR1cm5zIHRoZSBmdW5jdGlvbiBwb2ludGVyIGZvciB0aGlzIGhhbmRsZXIuICBJdCBpcyB0aGUgY2xpZW50J3MKLSAgICogcmVzcG9uc2liaWxpdHkgdG8gY2FzdCB0byB0aGUgY29ycmVjdCBmdW5jdGlvbiB0eXBlIGJlZm9yZSBjYWxsaW5nIGl0LiAqLwotICBHZW5lcmljRnVuY3Rpb24qIEdldEhhbmRsZXIoU2VsZWN0b3Igc2VsZWN0b3IpOwotCi0gIC8qIFNldHMgdGhlIGdpdmVuIGF0dHJpYnV0ZXMgdG8gdGhlIGF0dHJpYnV0ZXMgZm9yIHRoaXMgc2VsZWN0b3IuICovCi0gIGJvb2wgR2V0QXR0cmlidXRlcyhTZWxlY3RvciBzZWxlY3RvciwgSGFuZGxlckF0dHJpYnV0ZXMqIGF0dHIpOwotCi0gIC8qIFJldHVybnMgdGhlIGhhbmRsZXIgZGF0YSB0aGF0IHdhcyByZWdpc3RlcmVkIHdpdGggdGhpcyBoYW5kbGVyLiAqLwotICBjb25zdCB2b2lkKiBHZXRIYW5kbGVyRGF0YShTZWxlY3RvciBzZWxlY3Rvcik7Ci0KLSAgLyogQ291bGQgYWRkIGFueSBvZiB0aGUgZm9sbG93aW5nIGZ1bmN0aW9ucyBhcy1uZWVkZWQsIHdpdGggc29tZSBtaW5vcgotICAgKiBpbXBsZW1lbnRhdGlvbiBjaGFuZ2VzOgotICAgKgotICAgKiBjb25zdCBGaWVsZERlZiogR2V0RmllbGREZWYoU2VsZWN0b3Igc2VsZWN0b3IpOwotICAgKiBzdGF0aWMgYm9vbCBJc1NlcXVlbmNlKFNlbGVjdG9yIHNlbGVjdG9yKTsgKi8KLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKEhhbmRsZXJzLCB1cGI6OkhhbmRsZXJzKQotCi0gIGZyaWVuZCBVUEJfSU5MSU5FIEdlbmVyaWNGdW5jdGlvbiAqOjp1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcigKLSAgICAgIGNvbnN0IHVwYl9oYW5kbGVycyAqaCwgdXBiX3NlbGVjdG9yX3Qgcyk7Ci0gIGZyaWVuZCBVUEJfSU5MSU5FIGNvbnN0IHZvaWQgKjo6dXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKAotICAgICAgY29uc3QgdXBiX2hhbmRsZXJzICpoLCB1cGJfc2VsZWN0b3JfdCBzKTsKLSNlbHNlCi1zdHJ1Y3QgdXBiX2hhbmRsZXJzIHsKLSNlbmRpZgotICB1cGJfcmVmY291bnRlZCBiYXNlOwotCi0gIGNvbnN0IHVwYl9tc2dkZWYgKm1zZzsKLSAgY29uc3QgdXBiX2hhbmRsZXJzICoqc3ViOwotICBjb25zdCB2b2lkICp0b3BfY2xvc3VyZV90eXBlOwotICB1cGJfaW50dGFibGUgY2xlYW51cF87Ci0gIHVwYl9zdGF0dXMgc3RhdHVzXzsgIC8qIFVzZWQgb25seSB3aGVuIG11dGFibGUuICovCi0gIHVwYl9oYW5kbGVyc190YWJlbnQgdGFibGVbMV07ICAvKiBEeW5hbWljYWxseS1zaXplZCBmaWVsZCBoYW5kbGVyIGFycmF5LiAqLwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSB1cGIgewotCi0vKiBDb252ZW5pZW5jZSBtYWNyb3MgZm9yIGNyZWF0aW5nIGEgSGFuZGxlciBvYmplY3QgdGhhdCBpcyB3cmFwcGVkIHdpdGggYQotICogdHlwZS1zYWZlIHdyYXBwZXIgZnVuY3Rpb24gdGhhdCBjb252ZXJ0cyB0aGUgInZvaWQqIiBwYXJhbWV0ZXJzL3JldHVybnMKLSAqIG9mIHRoZSB1bmRlcmx5aW5nIEMgQVBJIGludG8gbmljZSBDKysgZnVuY3Rpb24uCi0gKgotICogU2FtcGxlIHVzYWdlOgotICogICB2b2lkIE9uVmFsdWUxKE15Q2xvc3VyZSogYywgY29uc3QgTXlIYW5kbGVyRGF0YSogZCwgaW50MzJfdCB2YWwpIHsKLSAqICAgICAvLyBkbyBzdHVmZiAuLi4KLSAqICAgfQotICoKLSAqICAgLy8gSGFuZGxlciB0aGF0IGRvZXNuJ3QgbmVlZCBhbnkgZGF0YSBib3VuZCB0byBpdC4KLSAqICAgdm9pZCBPblZhbHVlMihNeUNsb3N1cmUqIGMsIGludDMyX3QgdmFsKSB7Ci0gKiAgICAgLy8gZG8gc3R1ZmYgLi4uCi0gKiAgIH0KLSAqCi0gKiAgIC8vIEhhbmRsZXIgdGhhdCByZXR1cm5zIGJvb2wgc28gaXQgY2FuIHJldHVybiBmYWlsdXJlIGlmIG5lY2Vzc2FyeS4KLSAqICAgYm9vbCBPblZhbHVlMyhNeUNsb3N1cmUqIGMsIGludDMyX3QgdmFsKSB7Ci0gKiAgICAgLy8gZG8gc3R1ZmYgLi4uCi0gKiAgICAgcmV0dXJuIG9rOwotICogICB9Ci0gKgotICogICAvLyBNZW1iZXIgZnVuY3Rpb24gaGFuZGxlci4KLSAqICAgY2xhc3MgTXlDbG9zdXJlIHsKLSAqICAgIHB1YmxpYzoKLSAqICAgICB2b2lkIE9uVmFsdWUoaW50MzJfdCB2YWwpIHsKLSAqICAgICAgIC8vIGRvIHN0dWZmIC4uLgotICogICAgIH0KLSAqICAgfTsKLSAqCi0gKiAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgTXlIYW5kbGVyRGF0YS4KLSAqICAgaGFuZGxlcnMtPlNldEludDMySGFuZGxlcihmMSwgVXBiQmluZChPblZhbHVlMSwgbmV3IE15SGFuZGxlckRhdGEoLi4uKSkpOwotICogICBoYW5kbGVycy0+U2V0SW50MzJIYW5kbGVyKGYyLCBVcGJNYWtlSGFuZGxlcihPblZhbHVlMikpOwotICogICBoYW5kbGVycy0+U2V0SW50MzJIYW5kbGVyKGYxLCBVcGJNYWtlSGFuZGxlcihPblZhbHVlMykpOwotICogICBoYW5kbGVycy0+U2V0SW50MzJIYW5kbGVyKGYyLCBVcGJNYWtlSGFuZGxlcigmTXlDbG9zdXJlOjpPblZhbHVlKSk7Ci0gKi8KLQotI2lmZGVmIFVQQl9DWFgxMQotCi0vKiBJbiBDKysxMSwgdGhlICJ0ZW1wbGF0ZSIgZGlzYW1iaWd1YXRvciBjYW4gYXBwZWFyIGV2ZW4gb3V0c2lkZSB0ZW1wbGF0ZXMsCi0gKiBzbyBhbGwgY2FsbHMgY2FuIHNhZmVseSB1c2UgdGhpcyBwYWlyIG9mIG1hY3Jvcy4gKi8KLQotI2RlZmluZSBVcGJNYWtlSGFuZGxlcihmKSB1cGI6Ok1hdGNoRnVuYyhmKS50ZW1wbGF0ZSBHZXRGdW5jPGY+KCkKLQotLyogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIG9ubHkgZXZhbHVhdGUgImQiIG9uY2UuICovCi0jZGVmaW5lIFVwYkJpbmQoZiwgZCkgdXBiOjpNYXRjaEZ1bmMoZikudGVtcGxhdGUgR2V0RnVuYzxmPigoZCkpCi0KLSNlbHNlCi0KLS8qIFByaW9yIHRvIEMrKzExLCB0aGUgInRlbXBsYXRlIiBkaXNhbWJpZ3VhdG9yIG1heSBvbmx5IGFwcGVhciBpbnNpZGUgYQotICogdGVtcGxhdGUsIHNvIHRoZSByZWd1bGFyIG1hY3JvIG11c3Qgbm90IHVzZSAidGVtcGxhdGUiICovCi0KLSNkZWZpbmUgVXBiTWFrZUhhbmRsZXIoZikgdXBiOjpNYXRjaEZ1bmMoZikuR2V0RnVuYzxmPigpCi0KLSNkZWZpbmUgVXBiQmluZChmLCBkKSB1cGI6Ok1hdGNoRnVuYyhmKS5HZXRGdW5jPGY+KChkKSkKLQotI2VuZGlmICAvKiBVUEJfQ1hYMTEgKi8KLQotLyogVGhpcyBtYWNybyBtdXN0IGJlIHVzZWQgaW4gQysrOTggZm9yIGNhbGxzIGZyb20gaW5zaWRlIGEgdGVtcGxhdGUuICBCdXQgd2UKLSAqIGRlZmluZSB0aGlzIHZhcmlhbnQgaW4gYWxsIGNhc2VzOyBjb2RlIHRoYXQgd2FudHMgdG8gYmUgY29tcGF0aWJsZSB3aXRoIGJvdGgKLSAqIEMrKzk4IGFuZCBDKysxMSBzaG91bGQgYWx3YXlzIHVzZSB0aGlzIG1hY3JvIHdoZW4gY2FsbGluZyBmcm9tIGEgdGVtcGxhdGUuICovCi0jZGVmaW5lIFVwYk1ha2VIYW5kbGVyVChmKSB1cGI6Ok1hdGNoRnVuYyhmKS50ZW1wbGF0ZSBHZXRGdW5jPGY+KCkKLQotLyogV2UgaGF2ZSB0byBiZSBjYXJlZnVsIHRvIG9ubHkgZXZhbHVhdGUgImQiIG9uY2UuICovCi0jZGVmaW5lIFVwYkJpbmRUKGYsIGQpIHVwYjo6TWF0Y2hGdW5jKGYpLnRlbXBsYXRlIEdldEZ1bmM8Zj4oKGQpKQotCi0vKiBIYW5kbGVyOiBhIHN0cnVjdCB0aGF0IGNvbnRhaW5zIHRoZSAoaGFuZGxlciwgZGF0YSwgZGVsZXRlcikgdHVwbGUgdGhhdCBpcwotICogdXNlZCB0byByZWdpc3RlciBhbGwgaGFuZGxlcnMuICBVc2VycyBjYW4gTWFrZSgpIHRoZXNlIGRpcmVjdGx5IGJ1dCBpdCdzCi0gKiBtb3JlIGNvbnZlbmllbnQgdG8gdXNlIHRoZSBVcGJNYWtlSGFuZGxlci9VcGJCaW5kIG1hY3JvcyBhYm92ZS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBUPiBjbGFzcyBIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIC8qIFRoZSB1bmRlcmx5aW5nLCBoYW5kbGVyIGZ1bmN0aW9uIHNpZ25hdHVyZSB0aGF0IHVwYiB1c2VzIGludGVybmFsbHkuICovCi0gIHR5cGVkZWYgVCBGdW5jUHRyOwotCi0gIC8qIEludGVudGlvbmFsbHkgaW1wbGljaXQuICovCi0gIHRlbXBsYXRlIDxjbGFzcyBGPiBIYW5kbGVyKEYgZnVuYyk7Ci0gIH5IYW5kbGVyKCk7Ci0KLSBwcml2YXRlOgotICB2b2lkIEFkZENsZWFudXAoSGFuZGxlcnMqIGgpIGNvbnN0IHsKLSAgICBpZiAoY2xlYW51cF9mdW5jXykgewotICAgICAgYm9vbCBvayA9IGgtPkFkZENsZWFudXAoY2xlYW51cF9kYXRhXywgY2xlYW51cF9mdW5jXyk7Ci0gICAgICBVUEJfQVNTRVJUX1ZBUihvaywgb2spOwotICAgIH0KLSAgfQotCi0gIFVQQl9ESVNBTExPV19DT1BZX0FORF9BU1NJR04oSGFuZGxlcikKLSAgZnJpZW5kIGNsYXNzIEhhbmRsZXJzOwotICBGdW5jUHRyIGhhbmRsZXJfOwotICBtdXRhYmxlIEhhbmRsZXJBdHRyaWJ1dGVzIGF0dHJfOwotICBtdXRhYmxlIGJvb2wgcmVnaXN0ZXJlZF87Ci0gIHZvaWQgKmNsZWFudXBfZGF0YV87Ci0gIHVwYl9oYW5kbGVyZnJlZSAqY2xlYW51cF9mdW5jXzsKLX07Ci0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogTmF0aXZlIEMgQVBJLiAqLwotCi0vKiBIYW5kbGVyIGZ1bmN0aW9uIHR5cGVkZWZzLiAqLwotdHlwZWRlZiBib29sIHVwYl9zdGFydG1zZ19oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkKik7Ci10eXBlZGVmIGJvb2wgdXBiX2VuZG1zZ19oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICosIHVwYl9zdGF0dXMgKnN0YXR1cyk7Ci10eXBlZGVmIHZvaWQqIHVwYl9zdGFydGZpZWxkX2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkKTsKLXR5cGVkZWYgYm9vbCB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQpOwotdHlwZWRlZiBib29sIHVwYl9pbnQzMl9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgaW50MzJfdCB2YWwpOwotdHlwZWRlZiBib29sIHVwYl9pbnQ2NF9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgaW50NjRfdCB2YWwpOwotdHlwZWRlZiBib29sIHVwYl91aW50MzJfaGFuZGxlcmZ1bmModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIHVpbnQzMl90IHZhbCk7Ci10eXBlZGVmIGJvb2wgdXBiX3VpbnQ2NF9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgdWludDY0X3QgdmFsKTsKLXR5cGVkZWYgYm9vbCB1cGJfZmxvYXRfaGFuZGxlcmZ1bmModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIGZsb2F0IHZhbCk7Ci10eXBlZGVmIGJvb2wgdXBiX2RvdWJsZV9oYW5kbGVyZnVuYyh2b2lkICpjLCBjb25zdCB2b2lkICpoZCwgZG91YmxlIHZhbCk7Ci10eXBlZGVmIGJvb2wgdXBiX2Jvb2xfaGFuZGxlcmZ1bmModm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIGJvb2wgdmFsKTsKLXR5cGVkZWYgdm9pZCAqdXBiX3N0YXJ0c3RyX2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVfaGludCk7Ci10eXBlZGVmIHNpemVfdCB1cGJfc3RyaW5nX2hhbmRsZXJmdW5jKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBuLCBjb25zdCB1cGJfYnVmaGFuZGxlKiBoYW5kbGUpOwotCi0vKiB1cGJfYnVmaGFuZGxlICovCi1zaXplX3QgdXBiX2J1ZmhhbmRsZV9vYmpvZnMoY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCk7Ci0KLS8qIHVwYl9oYW5kbGVyYXR0ciAqLwotdm9pZCB1cGJfaGFuZGxlcmF0dHJfaW5pdCh1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotdm9pZCB1cGJfaGFuZGxlcmF0dHJfdW5pbml0KHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci0KLWJvb2wgdXBiX2hhbmRsZXJhdHRyX3NldGhhbmRsZXJkYXRhKHVwYl9oYW5kbGVyYXR0ciAqYXR0ciwgY29uc3Qgdm9pZCAqaGQpOwotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0Y2xvc3VyZXR5cGUodXBiX2hhbmRsZXJhdHRyICphdHRyLCBjb25zdCB2b2lkICp0eXBlKTsKLWNvbnN0IHZvaWQgKnVwYl9oYW5kbGVyYXR0cl9jbG9zdXJldHlwZShjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcmF0dHJfc2V0cmV0dXJuY2xvc3VyZXR5cGUodXBiX2hhbmRsZXJhdHRyICphdHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqdHlwZSk7Ci1jb25zdCB2b2lkICp1cGJfaGFuZGxlcmF0dHJfcmV0dXJuY2xvc3VyZXR5cGUoY29uc3QgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJhdHRyX3NldGFsd2F5c29rKHVwYl9oYW5kbGVyYXR0ciAqYXR0ciwgYm9vbCBhbHdheXNvayk7Ci1ib29sIHVwYl9oYW5kbGVyYXR0cl9hbHdheXNvayhjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotCi1VUEJfSU5MSU5FIGNvbnN0IHZvaWQgKnVwYl9oYW5kbGVyYXR0cl9oYW5kbGVyZGF0YSgKLSAgICBjb25zdCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpIHsKLSAgcmV0dXJuIGF0dHItPmhhbmRsZXJfZGF0YV87Ci19Ci0KLS8qIHVwYl9oYW5kbGVycyAqLwotdHlwZWRlZiB2b2lkIHVwYl9oYW5kbGVyc19jYWxsYmFjayhjb25zdCB2b2lkICpjbG9zdXJlLCB1cGJfaGFuZGxlcnMgKmgpOwotdXBiX2hhbmRsZXJzICp1cGJfaGFuZGxlcnNfbmV3KGNvbnN0IHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3duZXIpOwotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfaGFuZGxlcnNfbmV3ZnJvemVuKGNvbnN0IHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqb3duZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJzX2NhbGxiYWNrICpjYWxsYmFjaywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpjbG9zdXJlKTsKLQotLyogSW5jbHVkZSByZWZjb3VudGVkIG1ldGhvZHMgbGlrZSB1cGJfaGFuZGxlcnNfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfaGFuZGxlcnMsIHVwYl9oYW5kbGVyc191cGNhc3QpCi0KLWNvbnN0IHVwYl9zdGF0dXMgKnVwYl9oYW5kbGVyc19zdGF0dXModXBiX2hhbmRsZXJzICpoKTsKLXZvaWQgdXBiX2hhbmRsZXJzX2NsZWFyZXJyKHVwYl9oYW5kbGVycyAqaCk7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJfaGFuZGxlcnNfbXNnZGVmKGNvbnN0IHVwYl9oYW5kbGVycyAqaCk7Ci1ib29sIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKHVwYl9oYW5kbGVycyAqaCwgdm9pZCAqcCwgdXBiX2hhbmRsZXJmcmVlICpoZnJlZSk7Ci0KLWJvb2wgdXBiX2hhbmRsZXJzX3NldHN0YXJ0bXNnKHVwYl9oYW5kbGVycyAqaCwgdXBiX3N0YXJ0bXNnX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldGVuZG1zZyh1cGJfaGFuZGxlcnMgKmgsIHVwYl9lbmRtc2dfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldGludDMyKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ludDMyX2hhbmRsZXJmdW5jICpmdW5jLCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0aW50NjQodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaW50NjRfaGFuZGxlcmZ1bmMgKmZ1bmMsIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXR1aW50MzIodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3VpbnQzMl9oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0dWludDY0KHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl91aW50NjRfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldGZsb2F0KHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2Zsb2F0X2hhbmRsZXJmdW5jICpmdW5jLCB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0ZG91YmxlKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9kb3VibGVfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldGJvb2wodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ib29sX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdHIodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhcnRzdHJfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0c3RyaW5nKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zdHJpbmdfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldGVuZHN0cih1cGJfaGFuZGxlcnMgKmgsIGNvbnN0IHVwYl9maWVsZGRlZiAqZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyICphdHRyKTsKLWJvb2wgdXBiX2hhbmRsZXJzX3NldHN0YXJ0c2VxKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXJ0ZmllbGRfaGFuZGxlcmZ1bmMgKmZ1bmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfaGFuZGxlcmF0dHIgKmF0dHIpOwotYm9vbCB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2codXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc3RhcnRmaWVsZF9oYW5kbGVyZnVuYyAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXRlbmRzdWJtc2codXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci1ib29sIHVwYl9oYW5kbGVyc19zZXRlbmRzZXEodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jICpmdW5jLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci0KLWJvb2wgdXBiX2hhbmRsZXJzX3NldHN1YmhhbmRsZXJzKHVwYl9oYW5kbGVycyAqaCwgY29uc3QgdXBiX2ZpZWxkZGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2hhbmRsZXJzICpzdWIpOwotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnMoY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX2hhbmRsZXJzX2dldHN1YmhhbmRsZXJzX3NlbChjb25zdCB1cGJfaGFuZGxlcnMgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NlbGVjdG9yX3Qgc2VsKTsKLQotVVBCX0lOTElORSB1cGJfZnVuYyAqdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIoY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NlbGVjdG9yX3QgcykgewotICByZXR1cm4gKHVwYl9mdW5jICopaC0+dGFibGVbc10uZnVuYzsKLX0KLQotYm9vbCB1cGJfaGFuZGxlcnNfZ2V0YXR0cihjb25zdCB1cGJfaGFuZGxlcnMgKmgsIHVwYl9zZWxlY3Rvcl90IHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9oYW5kbGVyYXR0ciAqYXR0cik7Ci0KLVVQQl9JTkxJTkUgY29uc3Qgdm9pZCAqdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zZWxlY3Rvcl90IHMpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyYXR0cl9oYW5kbGVyZGF0YSgmaC0+dGFibGVbc10uYXR0cik7Ci19Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBIYW5kbGVyIHR5cGVzIGZvciBzaW5nbGUgZmllbGRzLgotICogUmlnaHQgbm93IHdlIG9ubHkgaGF2ZSBvbmUgZm9yIFRZUEVfQllURVMgYnV0IG9uZXMgZm9yIG90aGVyIHR5cGVzCi0gKiBzaG91bGQgZm9sbG93LgotICoKLSAqIFRoZXNlIGZvbGxvdyB0aGUgc2FtZSBoYW5kbGVycyBwcm90b2NvbCBmb3IgZmllbGRzIG9mIGEgbWVzc2FnZS4gKi8KLWNsYXNzIHVwYjo6Qnl0ZXNIYW5kbGVyIHsKLSBwdWJsaWM6Ci0gIEJ5dGVzSGFuZGxlcigpOwotICB+Qnl0ZXNIYW5kbGVyKCk7Ci0jZWxzZQotc3RydWN0IHVwYl9ieXRlc2hhbmRsZXIgewotI2VuZGlmCi0gIHVwYl9oYW5kbGVyc190YWJlbnQgdGFibGVbM107Ci19OwotCi12b2lkIHVwYl9ieXRlc2hhbmRsZXJfaW5pdCh1cGJfYnl0ZXNoYW5kbGVyICpoKTsKLQotLyogQ2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgImQiIG91dGxpdmVzIHRoZSBoYW5kbGVycy4KLSAqIFRPRE8oaGFiZXJtYW4pOiBzaG91bGQgdGhpcyBoYXZlIGEgImZyZWV6ZSIgb3BlcmF0aW9uPyAgSXQncyBub3QgbmVjZXNzYXJ5Ci0gKiBmb3IgbWVtb3J5IG1hbmFnZW1lbnQsIGJ1dCBjb3VsZCBiZSB1c2VmdWwgdG8gZm9yY2UgaW1tdXRhYmlsaXR5IGFuZCBwcm92aWRlCi0gKiBhIGNvbnZlbmllbnQgbW9tZW50IHRvIHZlcmlmeSB0aGF0IGFsbCByZWdpc3RyYXRpb24gc3VjY2VlZGVkLiAqLwotYm9vbCB1cGJfYnl0ZXNoYW5kbGVyX3NldHN0YXJ0c3RyKHVwYl9ieXRlc2hhbmRsZXIgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXJ0c3RyX2hhbmRsZXJmdW5jICpmdW5jLCB2b2lkICpkKTsKLWJvb2wgdXBiX2J5dGVzaGFuZGxlcl9zZXRzdHJpbmcodXBiX2J5dGVzaGFuZGxlciAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0cmluZ19oYW5kbGVyZnVuYyAqZnVuYywgdm9pZCAqZCk7Ci1ib29sIHVwYl9ieXRlc2hhbmRsZXJfc2V0ZW5kc3RyKHVwYl9ieXRlc2hhbmRsZXIgKmgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyAqZnVuYywgdm9pZCAqZCk7Ci0KLS8qICJTdGF0aWMiIG1ldGhvZHMgKi8KLWJvb2wgdXBiX2hhbmRsZXJzX2ZyZWV6ZSh1cGJfaGFuZGxlcnMgKmNvbnN0ICpoYW5kbGVycywgaW50IG4sIHVwYl9zdGF0dXMgKnMpOwotdXBiX2hhbmRsZXJ0eXBlX3QgdXBiX2hhbmRsZXJzX2dldHByaW1pdGl2ZWhhbmRsZXJ0eXBlKGNvbnN0IHVwYl9maWVsZGRlZiAqZik7Ci1ib29sIHVwYl9oYW5kbGVyc19nZXRzZWxlY3Rvcihjb25zdCB1cGJfZmllbGRkZWYgKmYsIHVwYl9oYW5kbGVydHlwZV90IHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1cGJfc2VsZWN0b3JfdCAqcyk7Ci1VUEJfSU5MSU5FIHVwYl9zZWxlY3Rvcl90IHVwYl9oYW5kbGVyc19nZXRlbmRzZWxlY3Rvcih1cGJfc2VsZWN0b3JfdCBzdGFydCkgewotICByZXR1cm4gc3RhcnQgKyAxOwotfQotCi0vKiBJbnRlcm5hbC1vbmx5LiAqLwotdWludDMyX3QgdXBiX2hhbmRsZXJzX3NlbGVjdG9yYmFzZW9mZnNldChjb25zdCB1cGJfZmllbGRkZWYgKmYpOwotdWludDMyX3QgdXBiX2hhbmRsZXJzX3NlbGVjdG9yY291bnQoY29uc3QgdXBiX2ZpZWxkZGVmICpmKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0vKgotKiogSW5saW5lIGRlZmluaXRpb25zIGZvciBoYW5kbGVycy5oLCB3aGljaCBhcmUgcGFydGljdWxhcmx5IGxvbmcgYW5kIGEgYml0Ci0qKiB0cmlja3kuCi0qLwotCi0jaWZuZGVmIFVQQl9IQU5ETEVSU19JTkxfSF8KLSNkZWZpbmUgVVBCX0hBTkRMRVJTX0lOTF9IXwotCi0jaW5jbHVkZSA8bGltaXRzLmg+Ci0KLS8qIEMgaW5saW5lIG1ldGhvZHMuICovCi0KLS8qIHVwYl9idWZoYW5kbGUgKi8KLVVQQl9JTkxJTkUgdm9pZCB1cGJfYnVmaGFuZGxlX2luaXQodXBiX2J1ZmhhbmRsZSAqaCkgewotICBoLT5vYmpfID0gTlVMTDsKLSAgaC0+b2JqdHlwZV8gPSBOVUxMOwotICBoLT5idWZfID0gTlVMTDsKLSAgaC0+b2Jqb2ZzXyA9IDA7Ci19Ci1VUEJfSU5MSU5FIHZvaWQgdXBiX2J1ZmhhbmRsZV91bmluaXQodXBiX2J1ZmhhbmRsZSAqaCkgewotICBVUEJfVU5VU0VEKGgpOwotfQotVVBCX0lOTElORSB2b2lkIHVwYl9idWZoYW5kbGVfc2V0b2JqKHVwYl9idWZoYW5kbGUgKmgsIGNvbnN0IHZvaWQgKm9iaiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICp0eXBlKSB7Ci0gIGgtPm9ial8gPSBvYmo7Ci0gIGgtPm9ianR5cGVfID0gdHlwZTsKLX0KLVVQQl9JTkxJTkUgdm9pZCB1cGJfYnVmaGFuZGxlX3NldGJ1Zih1cGJfYnVmaGFuZGxlICpoLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IG9mcykgewotICBoLT5idWZfID0gYnVmOwotICBoLT5vYmpvZnNfID0gb2ZzOwotfQotVVBCX0lOTElORSBjb25zdCB2b2lkICp1cGJfYnVmaGFuZGxlX29iaihjb25zdCB1cGJfYnVmaGFuZGxlICpoKSB7Ci0gIHJldHVybiBoLT5vYmpfOwotfQotVVBCX0lOTElORSBjb25zdCB2b2lkICp1cGJfYnVmaGFuZGxlX29ianR5cGUoY29uc3QgdXBiX2J1ZmhhbmRsZSAqaCkgewotICByZXR1cm4gaC0+b2JqdHlwZV87Ci19Ci1VUEJfSU5MSU5FIGNvbnN0IGNoYXIgKnVwYl9idWZoYW5kbGVfYnVmKGNvbnN0IHVwYl9idWZoYW5kbGUgKmgpIHsKLSAgcmV0dXJuIGgtPmJ1Zl87Ci19Ci0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFR5cGUgZGV0ZWN0aW9uIGFuZCB0eXBlZGVmcyBmb3IgaW50ZWdlciB0eXBlcy4KLSAqIEZvciBwbGF0Zm9ybXMgd2hlcmUgdGhlcmUgYXJlIG11bHRpcGxlIDMyLWJpdCBvciA2NC1iaXQgdHlwZXMsIHdlIG5lZWQgdG8gYmUKLSAqIGFibGUgdG8gZW51bWVyYXRlIHRoZW0gc28gd2UgY2FuIHByb3Blcmx5IGNyZWF0ZSBvdmVybG9hZHMgZm9yIGFsbCB2YXJpYW50cy4KLSAqCi0gKiBJZiBhbnkgcGxhdGZvcm0gZXhpc3RlZCB3aGVyZSB0aGVyZSB3ZXJlIHRocmVlIGludGVnZXIgdHlwZXMgd2l0aCB0aGUgc2FtZQotICogc2l6ZSwgdGhpcyB3b3VsZCBoYXZlIHRvIGJlY29tZSBtb3JlIGNvbXBsaWNhdGVkLiAgRm9yIGV4YW1wbGUsIHNob3J0LCBpbnQsCi0gKiBhbmQgbG9uZyBjb3VsZCBhbGwgYmUgMzItYml0cy4gIEV2ZW4gbW9yZSBkaWFib2xpY2FsbHksIHNob3J0LCBpbnQsIGxvbmcsCi0gKiBhbmQgbG9uZyBsb25nIGNvdWxkIGFsbCBiZSA2NCBiaXRzIGFuZCBzdGlsbCBiZSBzdGFuZGFyZC1jb21wbGlhbnQuCi0gKiBIb3dldmVyLCBmZXcgcGxhdGZvcm1zIGFyZSB0aGlzIHN0cmFuZ2UsIGFuZCBpdCdzIHVubGlrZWx5IHRoYXQgdXBiIHdpbGwgYmUKLSAqIHVzZWQgb24gdGhlIHN0cmFuZ2VzdCBvbmVzLiAqLwotCi0vKiBDYW4ndCBjb3VudCBvbiBzdGRpbnQuaCBsaW1pdHMgbGlrZSBJTlQzMl9NQVgsIGJlY2F1c2UgaW4gQysrIHRoZXNlIGFyZQotICogb25seSBkZWZpbmVkIHdoZW4gX19TVERDX0xJTUlUX01BQ1JPUyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlICpmaXJzdCogaW5jbHVkZQotICogb2Ygc3RkaW50LmguICBXZSBjYW4ndCBndWFyYW50ZWUgdGhhdCBzb21lb25lIGVsc2UgZGlkbid0IGluY2x1ZGUgdGhlc2UgZmlyc3QKLSAqIHdpdGhvdXQgZGVmaW5pbmcgX19TVERDX0xJTUlUX01BQ1JPUy4gKi8KLSNkZWZpbmUgVVBCX0lOVDMyX01BWCAweDdmZmZmZmZmTEwKLSNkZWZpbmUgVVBCX0lOVDMyX01JTiAoLVVQQl9JTlQzMl9NQVggLSAxKQotI2RlZmluZSBVUEJfSU5UNjRfTUFYIDB4N2ZmZmZmZmZmZmZmZmZmZkxMCi0jZGVmaW5lIFVQQl9JTlQ2NF9NSU4gKC1VUEJfSU5UNjRfTUFYIC0gMSkKLQotI2lmIElOVF9NQVggPT0gVVBCX0lOVDMyX01BWCAmJiBJTlRfTUlOID09IFVQQl9JTlQzMl9NSU4KLSNkZWZpbmUgVVBCX0lOVF9JU18zMkJJVFMgMQotI2VuZGlmCi0KLSNpZiBMT05HX01BWCA9PSBVUEJfSU5UMzJfTUFYICYmIExPTkdfTUlOID09IFVQQl9JTlQzMl9NSU4KLSNkZWZpbmUgVVBCX0xPTkdfSVNfMzJCSVRTIDEKLSNlbmRpZgotCi0jaWYgTE9OR19NQVggPT0gVVBCX0lOVDY0X01BWCAmJiBMT05HX01JTiA9PSBVUEJfSU5UNjRfTUlOCi0jZGVmaW5lIFVQQl9MT05HX0lTXzY0QklUUyAxCi0jZW5kaWYKLQotI2lmIExMT05HX01BWCA9PSBVUEJfSU5UNjRfTUFYICYmIExMT05HX01JTiA9PSBVUEJfSU5UNjRfTUlOCi0jZGVmaW5lIFVQQl9MTE9OR19JU182NEJJVFMgMQotI2VuZGlmCi0KLS8qIFdlIHVzZSBtYWNyb3MgaW5zdGVhZCBvZiB0eXBlZGVmcyBzbyB3ZSBjYW4gdW5kZWZpbmUgdGhlbSBsYXRlciBhbmQgYXZvaWQKLSAqIGxlYWtpbmcgdGhlbSBvdXRzaWRlIHRoaXMgaGVhZGVyIGZpbGUuICovCi0jaWYgVVBCX0lOVF9JU18zMkJJVFMKLSNkZWZpbmUgVVBCX0lOVDMyX1QgaW50Ci0jZGVmaW5lIFVQQl9VSU5UMzJfVCB1bnNpZ25lZCBpbnQKLQotI2lmIFVQQl9MT05HX0lTXzMyQklUUwotI2RlZmluZSBVUEJfVFdPXzMyQklUX1RZUEVTIDEKLSNkZWZpbmUgVVBCX0lOVDMyQUxUX1QgbG9uZwotI2RlZmluZSBVUEJfVUlOVDMyQUxUX1QgdW5zaWduZWQgbG9uZwotI2VuZGlmICAvKiBVUEJfTE9OR19JU18zMkJJVFMgKi8KLQotI2VsaWYgVVBCX0xPTkdfSVNfMzJCSVRTICAvKiAmJiAhVVBCX0lOVF9JU18zMkJJVFMgKi8KLSNkZWZpbmUgVVBCX0lOVDMyX1QgbG9uZwotI2RlZmluZSBVUEJfVUlOVDMyX1QgdW5zaWduZWQgbG9uZwotI2VuZGlmICAvKiBVUEJfSU5UX0lTXzMyQklUUyAqLwotCi0KLSNpZiBVUEJfTE9OR19JU182NEJJVFMKLSNkZWZpbmUgVVBCX0lOVDY0X1QgbG9uZwotI2RlZmluZSBVUEJfVUlOVDY0X1QgdW5zaWduZWQgbG9uZwotCi0jaWYgVVBCX0xMT05HX0lTXzY0QklUUwotI2RlZmluZSBVUEJfVFdPXzY0QklUX1RZUEVTIDEKLSNkZWZpbmUgVVBCX0lOVDY0QUxUX1QgbG9uZyBsb25nCi0jZGVmaW5lIFVQQl9VSU5UNjRBTFRfVCB1bnNpZ25lZCBsb25nIGxvbmcKLSNlbmRpZiAgLyogVVBCX0xMT05HX0lTXzY0QklUUyAqLwotCi0jZWxpZiBVUEJfTExPTkdfSVNfNjRCSVRTICAvKiAmJiAhVVBCX0xPTkdfSVNfNjRCSVRTICovCi0jZGVmaW5lIFVQQl9JTlQ2NF9UIGxvbmcgbG9uZwotI2RlZmluZSBVUEJfVUlOVDY0X1QgdW5zaWduZWQgbG9uZyBsb25nCi0jZW5kaWYgIC8qIFVQQl9MT05HX0lTXzY0QklUUyAqLwotCi0jdW5kZWYgVVBCX0lOVDMyX01BWAotI3VuZGVmIFVQQl9JTlQzMl9NSU4KLSN1bmRlZiBVUEJfSU5UNjRfTUFYCi0jdW5kZWYgVVBCX0lOVDY0X01JTgotI3VuZGVmIFVQQl9JTlRfSVNfMzJCSVRTCi0jdW5kZWYgVVBCX0xPTkdfSVNfMzJCSVRTCi0jdW5kZWYgVVBCX0xPTkdfSVNfNjRCSVRTCi0jdW5kZWYgVVBCX0xMT05HX0lTXzY0QklUUwotCi0KLW5hbWVzcGFjZSB1cGIgewotCi10eXBlZGVmIHZvaWQgQ2xlYW51cEZ1bmModm9pZCAqcHRyKTsKLQotLyogVGVtcGxhdGUgdG8gcmVtb3ZlICJjb25zdCIgZnJvbSAiY29uc3QgVCoiIGFuZCBqdXN0IHJldHVybiAiVCoiLgotICoKLSAqIFdlIGRlZmluZSBhIG5vbnNlbnNlIGRlZmF1bHQgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBmYWlsIHRvIGluc3RhbnRpYXRlIGFzCi0gKiBhIGZ1bmN0aW9uIHBhcmFtZXRlciB0eXBlIGV2ZW4gaW4gY2FzZXMgd2hlcmUgd2UgZG9uJ3QgZXhwZWN0IGFueSBjYWxsZXIgdG8KLSAqIGFjdHVhbGx5IG1hdGNoIHRoZSBvdmVybG9hZC4gKi8KLWNsYXNzIENvdWxkbnRSZW1vdmVDb25zdCB7fTsKLXRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgcmVtb3ZlX2NvbnN0cHRyIHsgdHlwZWRlZiBDb3VsZG50UmVtb3ZlQ29uc3QgdHlwZTsgfTsKLXRlbXBsYXRlIDxjbGFzcyBUPiBzdHJ1Y3QgcmVtb3ZlX2NvbnN0cHRyPGNvbnN0IFQgKj4geyB0eXBlZGVmIFQgKnR5cGU7IH07Ci0KLS8qIFRlbXBsYXRlIHRoYXQgd2UgdXNlIGJlbG93IHRvIHJlbW92ZSBhIHRlbXBsYXRlIHNwZWNpYWxpemF0aW9uIGZyb20KLSAqIGNvbnNpZGVyYXRpb24gaWYgaXQgbWF0Y2hlcyBhIHNwZWNpZmljIHR5cGUuICovCi10ZW1wbGF0ZSA8Y2xhc3MgVCwgY2xhc3MgVT4gc3RydWN0IGRpc2FibGVfaWZfc2FtZSB7IHR5cGVkZWYgdm9pZCBUeXBlOyB9OwotdGVtcGxhdGUgPGNsYXNzIFQ+IHN0cnVjdCBkaXNhYmxlX2lmX3NhbWU8VCwgVD4ge307Ci0KLXRlbXBsYXRlIDxjbGFzcyBUPiB2b2lkIERlbGV0ZVBvaW50ZXIodm9pZCAqcCkgeyBkZWxldGUgc3RhdGljX2Nhc3Q8VD4ocCk7IH0KLQotdGVtcGxhdGUgPGNsYXNzIFQxLCBjbGFzcyBUMj4KLXN0cnVjdCBGaXJzdFVubGVzc1ZvaWRPckJvb2wgewotICB0eXBlZGVmIFQxIHZhbHVlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQyPgotc3RydWN0IEZpcnN0VW5sZXNzVm9pZE9yQm9vbDx2b2lkLCBUMj4gewotICB0eXBlZGVmIFQyIHZhbHVlOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFQyPgotc3RydWN0IEZpcnN0VW5sZXNzVm9pZE9yQm9vbDxib29sLCBUMj4gewotICB0eXBlZGVmIFQyIHZhbHVlOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KLXN0cnVjdCBpc19zYW1lIHsKLSAgc3RhdGljIGJvb2wgdmFsdWU7Ci19OwotCi10ZW1wbGF0ZTxjbGFzcyBUPgotc3RydWN0IGlzX3NhbWU8VCwgVD4gewotICBzdGF0aWMgYm9vbCB2YWx1ZTsKLX07Ci0KLXRlbXBsYXRlPGNsYXNzIFQsIGNsYXNzIFU+Ci1ib29sIGlzX3NhbWU8VCwgVT46OnZhbHVlID0gZmFsc2U7Ci0KLXRlbXBsYXRlPGNsYXNzIFQ+Ci1ib29sIGlzX3NhbWU8VCwgVD46OnZhbHVlID0gdHJ1ZTsKLQotLyogRnVuY0luZm8gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogSW5mbyBhYm91dCB0aGUgdXNlcidzIG9yaWdpbmFsLCBwcmUtd3JhcHBlZCBmdW5jdGlvbi4gKi8KLXRlbXBsYXRlIDxjbGFzcyBDLCBjbGFzcyBSID0gdm9pZD4KLXN0cnVjdCBGdW5jSW5mbyB7Ci0gIC8qIFRoZSB0eXBlIG9mIHRoZSBjbG9zdXJlIHRoYXQgdGhlIGZ1bmN0aW9uIHRha2VzIChpdHMgZmlyc3QgcGFyYW0pLiAqLwotICB0eXBlZGVmIEMgQ2xvc3VyZTsKLQotICAvKiBUaGUgcmV0dXJuIHR5cGUuICovCi0gIHR5cGVkZWYgUiBSZXR1cm47Ci19OwotCi0vKiBGdW5jICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGdW5jMSwgRnVuYzIsIEZ1bmMzOiBUZW1wbGF0ZSBjbGFzc2VzIHJlcHJlc2VudGluZyBhIGZ1bmN0aW9uIGFuZCBpdHMKLSAqIHNpZ25hdHVyZS4KLSAqCi0gKiBTaW5jZSB0aGUgZnVuY3Rpb24gaXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIGNhbGxpbmcgdGhlIGZ1bmN0aW9uIGNhbiBiZQotICogaW5saW5lZCBhdCBjb21waWxlLXRpbWUgYW5kIGRvZXMgbm90IHJlcXVpcmUgYSBmdW5jdGlvbiBwb2ludGVyIGF0IHJ1bnRpbWUuCi0gKiBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCBib3VuZCB0byBhIGhhbmRsZXIgZGF0YSBzbyBoYXZlIG5vIGRhdGEgb3IgY2xlYW51cAotICogaGFuZGxlci4gKi8KLXN0cnVjdCBVbmJvdW5kRnVuYyB7Ci0gIENsZWFudXBGdW5jICpHZXRDbGVhbnVwKCkgeyByZXR1cm4gTlVMTDsgfQotICB2b2lkICpHZXREYXRhKCkgeyByZXR1cm4gTlVMTDsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBSIEYoUDEpLCBjbGFzcyBJPgotc3RydWN0IEZ1bmMxIDogcHVibGljIFVuYm91bmRGdW5jIHsKLSAgdHlwZWRlZiBSIFJldHVybjsKLSAgdHlwZWRlZiBJIEZ1bmNJbmZvOwotICBzdGF0aWMgUiBDYWxsKFAxIHAxKSB7IHJldHVybiBGKHAxKTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgUiBGKFAxLCBQMiksIGNsYXNzIEk+Ci1zdHJ1Y3QgRnVuYzIgOiBwdWJsaWMgVW5ib3VuZEZ1bmMgewotICB0eXBlZGVmIFIgUmV0dXJuOwotICB0eXBlZGVmIEkgRnVuY0luZm87Ci0gIHN0YXRpYyBSIENhbGwoUDEgcDEsIFAyIHAyKSB7IHJldHVybiBGKHAxLCBwMik7IH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBSIEYoUDEsIFAyLCBQMyksIGNsYXNzIEk+Ci1zdHJ1Y3QgRnVuYzMgOiBwdWJsaWMgVW5ib3VuZEZ1bmMgewotICB0eXBlZGVmIFIgUmV0dXJuOwotICB0eXBlZGVmIEkgRnVuY0luZm87Ci0gIHN0YXRpYyBSIENhbGwoUDEgcDEsIFAyIHAyLCBQMyBwMykgeyByZXR1cm4gRihwMSwgcDIsIHAzKTsgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBSIEYoUDEsIFAyLCBQMywgUDQpLAotICAgICAgICAgIGNsYXNzIEk+Ci1zdHJ1Y3QgRnVuYzQgOiBwdWJsaWMgVW5ib3VuZEZ1bmMgewotICB0eXBlZGVmIFIgUmV0dXJuOwotICB0eXBlZGVmIEkgRnVuY0luZm87Ci0gIHN0YXRpYyBSIENhbGwoUDEgcDEsIFAyIHAyLCBQMyBwMywgUDQgcDQpIHsgcmV0dXJuIEYocDEsIHAyLCBwMywgcDQpOyB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIGNsYXNzIFA1LAotICAgICAgICAgIFIgRihQMSwgUDIsIFAzLCBQNCwgUDUpLCBjbGFzcyBJPgotc3RydWN0IEZ1bmM1IDogcHVibGljIFVuYm91bmRGdW5jIHsKLSAgdHlwZWRlZiBSIFJldHVybjsKLSAgdHlwZWRlZiBJIEZ1bmNJbmZvOwotICBzdGF0aWMgUiBDYWxsKFAxIHAxLCBQMiBwMiwgUDMgcDMsIFA0IHA0LCBQNSBwNSkgewotICAgIHJldHVybiBGKHAxLCBwMiwgcDMsIHA0LCBwNSk7Ci0gIH0KLX07Ci0KLS8qIEJvdW5kRnVuYyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIEJvdW5kRnVuYzIsIEJvdW5kRnVuYzM6IExpa2UgRnVuYzIvRnVuYzMgZXhjZXB0IGFsc28gY29udGFpbnMgYSB2YWx1ZSB0aGF0Ci0gKiBzaGFsbCBiZSBib3VuZCB0byB0aGUgZnVuY3Rpb24ncyBzZWNvbmQgcGFyYW1ldGVyLgotICogCi0gKiBOb3RlIHRoYXQgdGhlIHNlY29uZCBwYXJhbWV0ZXIgaXMgYSBjb25zdCBwb2ludGVyLCBidXQgb3VyIHN0b3JlZCBib3VuZCB2YWx1ZQotICogaXMgbm9uLWNvbnN0IHNvIHdlIGNhbiBmcmVlIGl0IHdoZW4gdGhlIGhhbmRsZXJzIGFyZSBkZXN0cm95ZWQuICovCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXN0cnVjdCBCb3VuZEZ1bmMgewotICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdHB0cjxUPjo6dHlwZSBNdXRhYmxlUDI7Ci0gIGV4cGxpY2l0IEJvdW5kRnVuYyhNdXRhYmxlUDIgZGF0YV8pIDogZGF0YShkYXRhXykge30KLSAgQ2xlYW51cEZ1bmMgKkdldENsZWFudXAoKSB7IHJldHVybiAmRGVsZXRlUG9pbnRlcjxNdXRhYmxlUDI+OyB9Ci0gIE11dGFibGVQMiBHZXREYXRhKCkgeyByZXR1cm4gZGF0YTsgfQotICBNdXRhYmxlUDIgZGF0YTsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIFIgRihQMSwgUDIpLCBjbGFzcyBJPgotc3RydWN0IEJvdW5kRnVuYzIgOiBwdWJsaWMgQm91bmRGdW5jPFAyPiB7Ci0gIHR5cGVkZWYgQm91bmRGdW5jPFAyPiBCYXNlOwotICB0eXBlZGVmIEkgRnVuY0luZm87Ci0gIGV4cGxpY2l0IEJvdW5kRnVuYzIodHlwZW5hbWUgQmFzZTo6TXV0YWJsZVAyIGFyZykgOiBCYXNlKGFyZykge30KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBSIEYoUDEsIFAyLCBQMyksIGNsYXNzIEk+Ci1zdHJ1Y3QgQm91bmRGdW5jMyA6IHB1YmxpYyBCb3VuZEZ1bmM8UDI+IHsKLSAgdHlwZWRlZiBCb3VuZEZ1bmM8UDI+IEJhc2U7Ci0gIHR5cGVkZWYgSSBGdW5jSW5mbzsKLSAgZXhwbGljaXQgQm91bmRGdW5jMyh0eXBlbmFtZSBCYXNlOjpNdXRhYmxlUDIgYXJnKSA6IEJhc2UoYXJnKSB7fQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBSIEYoUDEsIFAyLCBQMywgUDQpLAotICAgICAgICAgIGNsYXNzIEk+Ci1zdHJ1Y3QgQm91bmRGdW5jNCA6IHB1YmxpYyBCb3VuZEZ1bmM8UDI+IHsKLSAgdHlwZWRlZiBCb3VuZEZ1bmM8UDI+IEJhc2U7Ci0gIHR5cGVkZWYgSSBGdW5jSW5mbzsKLSAgZXhwbGljaXQgQm91bmRGdW5jNCh0eXBlbmFtZSBCYXNlOjpNdXRhYmxlUDIgYXJnKSA6IEJhc2UoYXJnKSB7fQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBjbGFzcyBQNSwKLSAgICAgICAgICBSIEYoUDEsIFAyLCBQMywgUDQsIFA1KSwgY2xhc3MgST4KLXN0cnVjdCBCb3VuZEZ1bmM1IDogcHVibGljIEJvdW5kRnVuYzxQMj4gewotICB0eXBlZGVmIEJvdW5kRnVuYzxQMj4gQmFzZTsKLSAgdHlwZWRlZiBJIEZ1bmNJbmZvOwotICBleHBsaWNpdCBCb3VuZEZ1bmM1KHR5cGVuYW1lIEJhc2U6Ok11dGFibGVQMiBhcmcpIDogQmFzZShhcmcpIHt9Ci19OwotCi0vKiBGdW5jU2lnICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBGdW5jU2lnMSwgRnVuY1NpZzIsIEZ1bmNTaWczOiB0ZW1wbGF0ZSBjbGFzc2VzIHJlZmxlY3RpbmcgYSBmdW5jdGlvbgotICogKnNpZ25hdHVyZSosIGJ1dCB3aXRob3V0IGEgc3BlY2lmaWMgZnVuY3Rpb24gYXR0YWNoZWQuCi0gKgotICogVGhlc2UgY2xhc3NlcyBjb250YWluIG1lbWJlciBmdW5jdGlvbnMgdGhhdCBjYW4gYmUgaW52b2tlZCB3aXRoIGEKLSAqIHNwZWNpZmljIGZ1bmN0aW9uIHRvIHJldHVybiBhIEZ1bmMvQm91bmRGdW5jIGNsYXNzLiAqLwotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxPgotc3RydWN0IEZ1bmNTaWcxIHsKLSAgdGVtcGxhdGUgPFIgRihQMSk+Ci0gIEZ1bmMxPFIsIFAxLCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jMTxSLCBQMSwgRiwgRnVuY0luZm88UDEsIFI+ID4oKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMj4KLXN0cnVjdCBGdW5jU2lnMiB7Ci0gIHRlbXBsYXRlIDxSIEYoUDEsIFAyKT4KLSAgRnVuYzI8UiwgUDEsIFAyLCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jMjxSLCBQMSwgUDIsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8UiBGKFAxLCBQMik+Ci0gIEJvdW5kRnVuYzI8UiwgUDEsIFAyLCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKAotICAgICAgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAyPjo6dHlwZSBwYXJhbTIpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jMjxSLCBQMSwgUDIsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+KHBhcmFtMik7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzPgotc3RydWN0IEZ1bmNTaWczIHsKLSAgdGVtcGxhdGUgPFIgRihQMSwgUDIsIFAzKT4KLSAgRnVuYzM8UiwgUDEsIFAyLCBQMywgRiwgRnVuY0luZm88UDEsIFI+ID4gR2V0RnVuYygpIHsKLSAgICByZXR1cm4gRnVuYzM8UiwgUDEsIFAyLCBQMywgRiwgRnVuY0luZm88UDEsIFI+ID4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxSIEYoUDEsIFAyLCBQMyk+Ci0gIEJvdW5kRnVuYzM8UiwgUDEsIFAyLCBQMywgRiwgRnVuY0luZm88UDEsIFI+ID4gR2V0RnVuYygKLSAgICAgIHR5cGVuYW1lIHJlbW92ZV9jb25zdHB0cjxQMj46OnR5cGUgcGFyYW0yKSB7Ci0gICAgcmV0dXJuIEJvdW5kRnVuYzM8UiwgUDEsIFAyLCBQMywgRiwgRnVuY0luZm88UDEsIFI+ID4ocGFyYW0yKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0Pgotc3RydWN0IEZ1bmNTaWc0IHsKLSAgdGVtcGxhdGUgPFIgRihQMSwgUDIsIFAzLCBQNCk+Ci0gIEZ1bmM0PFIsIFAxLCBQMiwgUDMsIFA0LCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jNDxSLCBQMSwgUDIsIFAzLCBQNCwgRiwgRnVuY0luZm88UDEsIFI+ID4oKTsKLSAgfQotCi0gIHRlbXBsYXRlIDxSIEYoUDEsIFAyLCBQMywgUDQpPgotICBCb3VuZEZ1bmM0PFIsIFAxLCBQMiwgUDMsIFA0LCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKAotICAgICAgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAyPjo6dHlwZSBwYXJhbTIpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jNDxSLCBQMSwgUDIsIFAzLCBQNCwgRiwgRnVuY0luZm88UDEsIFI+ID4ocGFyYW0yKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBjbGFzcyBQNT4KLXN0cnVjdCBGdW5jU2lnNSB7Ci0gIHRlbXBsYXRlIDxSIEYoUDEsIFAyLCBQMywgUDQsIFA1KT4KLSAgRnVuYzU8UiwgUDEsIFAyLCBQMywgUDQsIFA1LCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jNTxSLCBQMSwgUDIsIFAzLCBQNCwgUDUsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8UiBGKFAxLCBQMiwgUDMsIFA0LCBQNSk+Ci0gIEJvdW5kRnVuYzU8UiwgUDEsIFAyLCBQMywgUDQsIFA1LCBGLCBGdW5jSW5mbzxQMSwgUj4gPiBHZXRGdW5jKAotICAgICAgdHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAyPjo6dHlwZSBwYXJhbTIpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jNTxSLCBQMSwgUDIsIFAzLCBQNCwgUDUsIEYsIEZ1bmNJbmZvPFAxLCBSPiA+KHBhcmFtMik7Ci0gIH0KLX07Ci0KLS8qIE92ZXJsb2FkZWQgdGVtcGxhdGUgZnVuY3Rpb24gdGhhdCBjYW4gY29uc3RydWN0IHRoZSBhcHByb3ByaWF0ZSBGdW5jU2lnKgotICogY2xhc3MgZ2l2ZW4gYSBmdW5jdGlvbiBwb2ludGVyIGJ5IGRlZHVjaW5nIHRoZSB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLiAqLwotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxPgotaW5saW5lIEZ1bmNTaWcxPFIsIFAxPiBNYXRjaEZ1bmMoUiAoKmYpKFAxKSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gRnVuY1NpZzE8UiwgUDE+KCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDI+Ci1pbmxpbmUgRnVuY1NpZzI8UiwgUDEsIFAyPiBNYXRjaEZ1bmMoUiAoKmYpKFAxLCBQMikpIHsKLSAgVVBCX1VOVVNFRChmKTsgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbi4gKi8KLSAgcmV0dXJuIEZ1bmNTaWcyPFIsIFAxLCBQMj4oKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDM+Ci1pbmxpbmUgRnVuY1NpZzM8UiwgUDEsIFAyLCBQMz4gTWF0Y2hGdW5jKFIgKCpmKShQMSwgUDIsIFAzKSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gRnVuY1NpZzM8UiwgUDEsIFAyLCBQMz4oKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0PgotaW5saW5lIEZ1bmNTaWc0PFIsIFAxLCBQMiwgUDMsIFA0PiBNYXRjaEZ1bmMoUiAoKmYpKFAxLCBQMiwgUDMsIFA0KSkgewotICBVUEJfVU5VU0VEKGYpOyAgLyogT25seSB1c2VkIGZvciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgZGVkdWN0aW9uLiAqLwotICByZXR1cm4gRnVuY1NpZzQ8UiwgUDEsIFAyLCBQMywgUDQ+KCk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQNCwgY2xhc3MgUDU+Ci1pbmxpbmUgRnVuY1NpZzU8UiwgUDEsIFAyLCBQMywgUDQsIFA1PiBNYXRjaEZ1bmMoUiAoKmYpKFAxLCBQMiwgUDMsIFA0LCBQNSkpIHsKLSAgVVBCX1VOVVNFRChmKTsgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbi4gKi8KLSAgcmV0dXJuIEZ1bmNTaWc1PFIsIFAxLCBQMiwgUDMsIFA0LCBQNT4oKTsKLX0KLQotLyogTWV0aG9kU2lnICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQ2FsbE1ldGhvZCo6IGEgZnVuY3Rpb24gdGVtcGxhdGUgdGhhdCBjYWxscyBhIGdpdmVuIG1ldGhvZC4gKi8KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBSIChDOjoqRikoKT4KLVIgQ2FsbE1ldGhvZDAoQyAqb2JqKSB7Ci0gIHJldHVybiAoKCpvYmopLipGKSgpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDEsIFIgKEM6OipGKShQMSk+Ci1SIENhbGxNZXRob2QxKEMgKm9iaiwgUDEgYXJnMSkgewotICByZXR1cm4gKCgqb2JqKS4qRikoYXJnMSk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDIsIFIgKEM6OipGKShQMSwgUDIpPgotUiBDYWxsTWV0aG9kMihDICpvYmosIFAxIGFyZzEsIFAyIGFyZzIpIHsKLSAgcmV0dXJuICgoKm9iaikuKkYpKGFyZzEsIGFyZzIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgUiAoQzo6KkYpKFAxLCBQMiwgUDMpPgotUiBDYWxsTWV0aG9kMyhDICpvYmosIFAxIGFyZzEsIFAyIGFyZzIsIFAzIGFyZzMpIHsKLSAgcmV0dXJuICgoKm9iaikuKkYpKGFyZzEsIGFyZzIsIGFyZzMpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsCi0gICAgICAgICAgUiAoQzo6KkYpKFAxLCBQMiwgUDMsIFA0KT4KLVIgQ2FsbE1ldGhvZDQoQyAqb2JqLCBQMSBhcmcxLCBQMiBhcmcyLCBQMyBhcmczLCBQNCBhcmc0KSB7Ci0gIHJldHVybiAoKCpvYmopLipGKShhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLX0KLQotLyogTWV0aG9kU2lnOiBsaWtlIEZ1bmNTaWcsIGJ1dCBmb3IgbWVtYmVyIGZ1bmN0aW9ucy4KLSAqCi0gKiBHZXRGdW5jKCkgcmV0dXJucyBhIG5vcm1hbCBGdW5jTiBvYmplY3QsIHNvIGFmdGVyIGNhbGxpbmcgR2V0RnVuYygpIG5vCi0gKiBtb3JlIGxvZ2ljIGlzIHJlcXVpcmVkIHRvIHNwZWNpYWwtY2FzZSBtZXRob2RzLiAqLwotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEM+Ci1zdHJ1Y3QgTWV0aG9kU2lnMCB7Ci0gIHRlbXBsYXRlIDxSIChDOjoqRikoKT4KLSAgRnVuYzE8UiwgQyAqLCBDYWxsTWV0aG9kMDxSLCBDLCBGPiwgRnVuY0luZm88QyAqLCBSPiA+IEdldEZ1bmMoKSB7Ci0gICAgcmV0dXJuIEZ1bmMxPFIsIEMgKiwgQ2FsbE1ldGhvZDA8UiwgQywgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPigpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDE+Ci1zdHJ1Y3QgTWV0aG9kU2lnMSB7Ci0gIHRlbXBsYXRlIDxSIChDOjoqRikoUDEpPgotICBGdW5jMjxSLCBDICosIFAxLCBDYWxsTWV0aG9kMTxSLCBDLCBQMSwgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPiBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jMjxSLCBDICosIFAxLCBDYWxsTWV0aG9kMTxSLCBDLCBQMSwgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPigpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFIgKEM6OipGKShQMSk+Ci0gIEJvdW5kRnVuYzI8UiwgQyAqLCBQMSwgQ2FsbE1ldGhvZDE8UiwgQywgUDEsIEY+LCBGdW5jSW5mbzxDICosIFI+ID4gR2V0RnVuYygKLSAgICAgIHR5cGVuYW1lIHJlbW92ZV9jb25zdHB0cjxQMT46OnR5cGUgcGFyYW0xKSB7Ci0gICAgcmV0dXJuIEJvdW5kRnVuYzI8UiwgQyAqLCBQMSwgQ2FsbE1ldGhvZDE8UiwgQywgUDEsIEY+LCBGdW5jSW5mbzxDICosIFI+ID4oCi0gICAgICAgIHBhcmFtMSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDI+Ci1zdHJ1Y3QgTWV0aG9kU2lnMiB7Ci0gIHRlbXBsYXRlIDxSIChDOjoqRikoUDEsIFAyKT4KLSAgRnVuYzM8UiwgQyAqLCBQMSwgUDIsIENhbGxNZXRob2QyPFIsIEMsIFAxLCBQMiwgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPgotICBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jMzxSLCBDICosIFAxLCBQMiwgQ2FsbE1ldGhvZDI8UiwgQywgUDEsIFAyLCBGPiwKLSAgICAgICAgICAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8UiAoQzo6KkYpKFAxLCBQMik+Ci0gIEJvdW5kRnVuYzM8UiwgQyAqLCBQMSwgUDIsIENhbGxNZXRob2QyPFIsIEMsIFAxLCBQMiwgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPgotICBHZXRGdW5jKHR5cGVuYW1lIHJlbW92ZV9jb25zdHB0cjxQMT46OnR5cGUgcGFyYW0xKSB7Ci0gICAgcmV0dXJuIEJvdW5kRnVuYzM8UiwgQyAqLCBQMSwgUDIsIENhbGxNZXRob2QyPFIsIEMsIFAxLCBQMiwgRj4sCi0gICAgICAgICAgICAgICAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+KHBhcmFtMSk7Ci0gIH0KLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBDLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzPgotc3RydWN0IE1ldGhvZFNpZzMgewotICB0ZW1wbGF0ZSA8UiAoQzo6KkYpKFAxLCBQMiwgUDMpPgotICBGdW5jNDxSLCBDICosIFAxLCBQMiwgUDMsIENhbGxNZXRob2QzPFIsIEMsIFAxLCBQMiwgUDMsIEY+LCBGdW5jSW5mbzxDICosIFI+ID4KLSAgR2V0RnVuYygpIHsKLSAgICByZXR1cm4gRnVuYzQ8UiwgQyAqLCBQMSwgUDIsIFAzLCBDYWxsTWV0aG9kMzxSLCBDLCBQMSwgUDIsIFAzLCBGPiwKLSAgICAgICAgICAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+KCk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8UiAoQzo6KkYpKFAxLCBQMiwgUDMpPgotICBCb3VuZEZ1bmM0PFIsIEMgKiwgUDEsIFAyLCBQMywgQ2FsbE1ldGhvZDM8UiwgQywgUDEsIFAyLCBQMywgRj4sCi0gICAgICAgICAgICAgRnVuY0luZm88QyAqLCBSPiA+Ci0gIEdldEZ1bmModHlwZW5hbWUgcmVtb3ZlX2NvbnN0cHRyPFAxPjo6dHlwZSBwYXJhbTEpIHsKLSAgICByZXR1cm4gQm91bmRGdW5jNDxSLCBDICosIFAxLCBQMiwgUDMsIENhbGxNZXRob2QzPFIsIEMsIFAxLCBQMiwgUDMsIEY+LAotICAgICAgICAgICAgICAgICAgICAgIEZ1bmNJbmZvPEMgKiwgUj4gPihwYXJhbTEpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQ+Ci1zdHJ1Y3QgTWV0aG9kU2lnNCB7Ci0gIHRlbXBsYXRlIDxSIChDOjoqRikoUDEsIFAyLCBQMywgUDQpPgotICBGdW5jNTxSLCBDICosIFAxLCBQMiwgUDMsIFA0LCBDYWxsTWV0aG9kNDxSLCBDLCBQMSwgUDIsIFAzLCBQNCwgRj4sCi0gICAgICAgIEZ1bmNJbmZvPEMgKiwgUj4gPgotICBHZXRGdW5jKCkgewotICAgIHJldHVybiBGdW5jNTxSLCBDICosIFAxLCBQMiwgUDMsIFA0LCBDYWxsTWV0aG9kNDxSLCBDLCBQMSwgUDIsIFAzLCBQNCwgRj4sCi0gICAgICAgICAgICAgICAgIEZ1bmNJbmZvPEMgKiwgUj4gPigpOwotICB9Ci0KLSAgdGVtcGxhdGUgPFIgKEM6OipGKShQMSwgUDIsIFAzLCBQNCk+Ci0gIEJvdW5kRnVuYzU8UiwgQyAqLCBQMSwgUDIsIFAzLCBQNCwgQ2FsbE1ldGhvZDQ8UiwgQywgUDEsIFAyLCBQMywgUDQsIEY+LAotICAgICAgICAgICAgIEZ1bmNJbmZvPEMgKiwgUj4gPgotICBHZXRGdW5jKHR5cGVuYW1lIHJlbW92ZV9jb25zdHB0cjxQMT46OnR5cGUgcGFyYW0xKSB7Ci0gICAgcmV0dXJuIEJvdW5kRnVuYzU8UiwgQyAqLCBQMSwgUDIsIFAzLCBQNCwKLSAgICAgICAgICAgICAgICAgICAgICBDYWxsTWV0aG9kNDxSLCBDLCBQMSwgUDIsIFAzLCBQNCwgRj4sIEZ1bmNJbmZvPEMgKiwgUj4gPigKLSAgICAgICAgcGFyYW0xKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEM+Ci1pbmxpbmUgTWV0aG9kU2lnMDxSLCBDPiBNYXRjaEZ1bmMoUiAoQzo6KmYpKCkpIHsKLSAgVVBCX1VOVVNFRChmKTsgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbi4gKi8KLSAgcmV0dXJuIE1ldGhvZFNpZzA8UiwgQz4oKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEMsIGNsYXNzIFAxPgotaW5saW5lIE1ldGhvZFNpZzE8UiwgQywgUDE+IE1hdGNoRnVuYyhSIChDOjoqZikoUDEpKSB7Ci0gIFVQQl9VTlVTRUQoZik7ICAvKiBPbmx5IHVzZWQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciBkZWR1Y3Rpb24uICovCi0gIHJldHVybiBNZXRob2RTaWcxPFIsIEMsIFAxPigpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDEsIGNsYXNzIFAyPgotaW5saW5lIE1ldGhvZFNpZzI8UiwgQywgUDEsIFAyPiBNYXRjaEZ1bmMoUiAoQzo6KmYpKFAxLCBQMikpIHsKLSAgVVBCX1VOVVNFRChmKTsgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbi4gKi8KLSAgcmV0dXJuIE1ldGhvZFNpZzI8UiwgQywgUDEsIFAyPigpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgQywgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMz4KLWlubGluZSBNZXRob2RTaWczPFIsIEMsIFAxLCBQMiwgUDM+IE1hdGNoRnVuYyhSIChDOjoqZikoUDEsIFAyLCBQMykpIHsKLSAgVVBCX1VOVVNFRChmKTsgIC8qIE9ubHkgdXNlZCBmb3IgdGVtcGxhdGUgcGFyYW1ldGVyIGRlZHVjdGlvbi4gKi8KLSAgcmV0dXJuIE1ldGhvZFNpZzM8UiwgQywgUDEsIFAyLCBQMz4oKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIEMsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0PgotaW5saW5lIE1ldGhvZFNpZzQ8UiwgQywgUDEsIFAyLCBQMywgUDQ+IE1hdGNoRnVuYyhSIChDOjoqZikoUDEsIFAyLCBQMywgUDQpKSB7Ci0gIFVQQl9VTlVTRUQoZik7ICAvKiBPbmx5IHVzZWQgZm9yIHRlbXBsYXRlIHBhcmFtZXRlciBkZWR1Y3Rpb24uICovCi0gIHJldHVybiBNZXRob2RTaWc0PFIsIEMsIFAxLCBQMiwgUDMsIFA0PigpOwotfQotCi0vKiBNYXliZVdyYXBSZXR1cm4gKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUZW1wbGF0ZSBjbGFzcyB0aGF0IGF0dGVtcHRzIHRvIHdyYXAgdGhlIHJldHVybiB2YWx1ZSBvZiB0aGUgZnVuY3Rpb24gc28gaXQKLSAqIG1hdGNoZXMgdGhlIGV4cGVjdGVkIHR5cGUuICBUaGVyZSBhcmUgdHdvIG1haW4gYWRqdXN0bWVudHMgaXQgbWF5IG1ha2U6Ci0gKgotICogICAxLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyB2b2lkLCBtYWtlIGl0IHJldHVybiB0aGUgZXhwZWN0ZWQgdHlwZSBhbmQgd2l0aAotICogICAgICBhIHZhbHVlIHRoYXQgYWx3YXlzIGluZGljYXRlcyBzdWNjZXNzLgotICogICAyLiBJZiB0aGUgZnVuY3Rpb24gcmV0dXJucyBib29sLCBtYWtlIGl0IHJldHVybiB0aGUgZXhwZWN0ZWQgdHlwZSB3aXRoIGEKLSAqICAgICAgdmFsdWUgdGhhdCBpbmRpY2F0ZXMgc3VjY2VzcyBvciBmYWlsdXJlLgotICoKLSAqIFRoZSAiZXhwZWN0ZWQgdHlwZSIgZm9yIHJldHVybiBpczoKLSAqICAgMS4gdm9pZCogZm9yIHN0YXJ0IGhhbmRsZXJzLiAgSWYgdGhlIGNsb3N1cmUgcGFyYW1ldGVyIGhhcyBhIGRpZmZlcmVudCB0eXBlCi0gKiAgICAgIHdlIHdpbGwgY2FzdCBpdCB0byB2b2lkKiBmb3IgdGhlIHJldHVybiBpbiB0aGUgc3VjY2VzcyBjYXNlLgotICogICAyLiBzaXplX3QgZm9yIHN0cmluZyBidWZmZXIgaGFuZGxlcnMuCi0gKiAgIDMuIGJvb2wgZm9yIGV2ZXJ5dGhpbmcgZWxzZS4gKi8KLQotLyogVGVtcGxhdGUgcGFyYW1ldGVycyBhcmUgRnVuY04gdHlwZSBhbmQgZGVzaXJlZCByZXR1cm4gdHlwZS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBGLCBjbGFzcyBSLCBjbGFzcyBFbmFibGUgPSB2b2lkPgotc3RydWN0IE1heWJlV3JhcFJldHVybjsKLQotLyogSWYgdGhlIHJldHVybiB0eXBlIG1hdGNoZXMsIHJldHVybiB0aGUgZ2l2ZW4gZnVuY3Rpb24gdW53cmFwcGVkLiAqLwotdGVtcGxhdGUgPGNsYXNzIEY+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPEYsIHR5cGVuYW1lIEY6OlJldHVybj4gewotICB0eXBlZGVmIEYgRnVuYzsKLX07Ci0KLS8qIEZ1bmN0aW9uIHdyYXBwZXIgdGhhdCBtdW5nZXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIHZvaWQgdG8gKGJvb2wpdHJ1ZS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIHZvaWQgRihQMSwgUDIpPgotYm9vbCBSZXR1cm5UcnVlMihQMSBwMSwgUDIgcDIpIHsKLSAgRihwMSwgcDIpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIHZvaWQgRihQMSwgUDIsIFAzKT4KLWJvb2wgUmV0dXJuVHJ1ZTMoUDEgcDEsIFAyIHAyLCBQMyBwMykgewotICBGKHAxLCBwMiwgcDMpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLyogRnVuY3Rpb24gd3JhcHBlciB0aGF0IG11bmdlcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gdm9pZCB0byAodm9pZCopYXJnMSAgKi8KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIHZvaWQgRihQMSwgUDIpPgotdm9pZCAqUmV0dXJuQ2xvc3VyZTIoUDEgcDEsIFAyIHAyKSB7Ci0gIEYocDEsIHAyKTsKLSAgcmV0dXJuIHAxOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgdm9pZCBGKFAxLCBQMiwgUDMpPgotdm9pZCAqUmV0dXJuQ2xvc3VyZTMoUDEgcDEsIFAyIHAyLCBQMyBwMykgewotICBGKHAxLCBwMiwgcDMpOwotICByZXR1cm4gcDE7Ci19Ci0KLS8qIEZ1bmN0aW9uIHdyYXBwZXIgdGhhdCBtdW5nZXMgdGhlIHJldHVybiB2YWx1ZSBmcm9tIFIgdG8gdm9pZCouICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSIEYoUDEsIFAyKT4KLXZvaWQgKkNhc3RSZXR1cm5Ub1ZvaWRQdHIyKFAxIHAxLCBQMiBwMikgewotICByZXR1cm4gRihwMSwgcDIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgUiBGKFAxLCBQMiwgUDMpPgotdm9pZCAqQ2FzdFJldHVyblRvVm9pZFB0cjMoUDEgcDEsIFAyIHAyLCBQMyBwMykgewotICByZXR1cm4gRihwMSwgcDIsIHAzKTsKLX0KLQotLyogRnVuY3Rpb24gd3JhcHBlciB0aGF0IG11bmdlcyB0aGUgcmV0dXJuIHZhbHVlIGZyb20gYm9vbCB0byB2b2lkKi4gKi8KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIGJvb2wgRihQMSwgUDIpPgotdm9pZCAqUmV0dXJuQ2xvc3VyZU9yQnJlYWsyKFAxIHAxLCBQMiBwMikgewotICByZXR1cm4gRihwMSwgcDIpID8gcDEgOiBVUEJfQlJFQUs7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBib29sIEYoUDEsIFAyLCBQMyk+Ci12b2lkICpSZXR1cm5DbG9zdXJlT3JCcmVhazMoUDEgcDEsIFAyIHAyLCBQMyBwMykgewotICByZXR1cm4gRihwMSwgcDIsIHAzKSA/IHAxIDogVVBCX0JSRUFLOwotfQotCi0vKiBGb3IgdGhlIHN0cmluZyBjYWxsYmFjaywgd2hpY2ggdGFrZXMgZml2ZSBwYXJhbXMsIHJldHVybnMgdGhlIHNpemUgcGFyYW0uICovCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLAotICAgICAgICAgIHZvaWQgRihQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjb25zdCBCdWZmZXJIYW5kbGUgKik+Ci1zaXplX3QgUmV0dXJuU3RyaW5nTGVuKFAxIHAxLCBQMiBwMiwgY29uc3QgY2hhciAqcDMsIHNpemVfdCBwNCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVySGFuZGxlICpwNSkgewotICBGKHAxLCBwMiwgcDMsIHA0LCBwNSk7Ci0gIHJldHVybiBwNDsKLX0KLQotLyogRm9yIHRoZSBzdHJpbmcgY2FsbGJhY2ssIHdoaWNoIHRha2VzIGZpdmUgcGFyYW1zLCByZXR1cm5zIHRoZSBzaXplIHBhcmFtIG9yCi0gKiB6ZXJvLiAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwKLSAgICAgICAgICBib29sIEYoUDEsIFAyLCBjb25zdCBjaGFyICosIHNpemVfdCwgY29uc3QgQnVmZmVySGFuZGxlICopPgotc2l6ZV90IFJldHVybk5PcjAoUDEgcDEsIFAyIHAyLCBjb25zdCBjaGFyICpwMywgc2l6ZV90IHA0LAotICAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVySGFuZGxlICpwNSkgewotICByZXR1cm4gRihwMSwgcDIsIHAzLCBwNCwgcDUpID8gcDQgOiAwOwotfQotCi0vKiBJZiB3ZSBoYXZlIGEgZnVuY3Rpb24gcmV0dXJuaW5nIHZvaWQgYnV0IHdhbnQgYSBmdW5jdGlvbiByZXR1cm5pbmcgYm9vbCwgd3JhcAotICogaXQgaW4gYSBmdW5jdGlvbiB0aGF0IHJldHVybnMgdHJ1ZS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIHZvaWQgRihQMSwgUDIpLCBjbGFzcyBJPgotc3RydWN0IE1heWJlV3JhcFJldHVybjxGdW5jMjx2b2lkLCBQMSwgUDIsIEYsIEk+LCBib29sPiB7Ci0gIHR5cGVkZWYgRnVuYzI8Ym9vbCwgUDEsIFAyLCBSZXR1cm5UcnVlMjxQMSwgUDIsIEY+LCBJPiBGdW5jOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIHZvaWQgRihQMSwgUDIsIFAzKSwgY2xhc3MgST4KLXN0cnVjdCBNYXliZVdyYXBSZXR1cm48RnVuYzM8dm9pZCwgUDEsIFAyLCBQMywgRiwgST4sIGJvb2w+IHsKLSAgdHlwZWRlZiBGdW5jMzxib29sLCBQMSwgUDIsIFAzLCBSZXR1cm5UcnVlMzxQMSwgUDIsIFAzLCBGPiwgST4gRnVuYzsKLX07Ci0KLS8qIElmIG91ciBmdW5jdGlvbiByZXR1cm5zIHZvaWQgYnV0IHdlIHdhbnQgb25lIHJldHVybmluZyB2b2lkKiwgd3JhcCBpdCBpbiBhCi0gKiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGZpcnN0IGFyZ3VtZW50LiAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgdm9pZCBGKFAxLCBQMiksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPEZ1bmMyPHZvaWQsIFAxLCBQMiwgRiwgST4sIHZvaWQgKj4gewotICB0eXBlZGVmIEZ1bmMyPHZvaWQgKiwgUDEsIFAyLCBSZXR1cm5DbG9zdXJlMjxQMSwgUDIsIEY+LCBJPiBGdW5jOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIHZvaWQgRihQMSwgUDIsIFAzKSwgY2xhc3MgST4KLXN0cnVjdCBNYXliZVdyYXBSZXR1cm48RnVuYzM8dm9pZCwgUDEsIFAyLCBQMywgRiwgST4sIHZvaWQgKj4gewotICB0eXBlZGVmIEZ1bmMzPHZvaWQgKiwgUDEsIFAyLCBQMywgUmV0dXJuQ2xvc3VyZTM8UDEsIFAyLCBQMywgRj4sIEk+IEZ1bmM7Ci19OwotCi0vKiBJZiBvdXIgZnVuY3Rpb24gcmV0dXJucyBSKiBidXQgd2Ugd2FudCBvbmUgcmV0dXJuaW5nIHZvaWQqLCB3cmFwIGl0IGluIGEKLSAqIGZ1bmN0aW9uIHRoYXQgY2FzdHMgdG8gdm9pZCouICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSICpGKFAxLCBQMiksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPEZ1bmMyPFIgKiwgUDEsIFAyLCBGLCBJPiwgdm9pZCAqLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBkaXNhYmxlX2lmX3NhbWU8UiAqLCB2b2lkICo+OjpUeXBlPiB7Ci0gIHR5cGVkZWYgRnVuYzI8dm9pZCAqLCBQMSwgUDIsIENhc3RSZXR1cm5Ub1ZvaWRQdHIyPFIgKiwgUDEsIFAyLCBGPiwgST4gRnVuYzsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBSICpGKFAxLCBQMiwgUDMpLCBjbGFzcyBJPgotc3RydWN0IE1heWJlV3JhcFJldHVybjxGdW5jMzxSICosIFAxLCBQMiwgUDMsIEYsIEk+LCB2b2lkICosCi0gICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGRpc2FibGVfaWZfc2FtZTxSICosIHZvaWQgKj46OlR5cGU+IHsKLSAgdHlwZWRlZiBGdW5jMzx2b2lkICosIFAxLCBQMiwgUDMsIENhc3RSZXR1cm5Ub1ZvaWRQdHIzPFIgKiwgUDEsIFAyLCBQMywgRj4sIEk+Ci0gICAgICBGdW5jOwotfTsKLQotLyogSWYgb3VyIGZ1bmN0aW9uIHJldHVybnMgYm9vbCBidXQgd2Ugd2FudCBvbmUgcmV0dXJuaW5nIHZvaWQqLCB3cmFwIGl0IGluIGEKLSAqIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyBlaXRoZXIgdGhlIGZpcnN0IHBhcmFtIG9yIFVQQl9CUkVBSy4gKi8KLXRlbXBsYXRlIDxjbGFzcyBQMSwgY2xhc3MgUDIsIGJvb2wgRihQMSwgUDIpLCBjbGFzcyBJPgotc3RydWN0IE1heWJlV3JhcFJldHVybjxGdW5jMjxib29sLCBQMSwgUDIsIEYsIEk+LCB2b2lkICo+IHsKLSAgdHlwZWRlZiBGdW5jMjx2b2lkICosIFAxLCBQMiwgUmV0dXJuQ2xvc3VyZU9yQnJlYWsyPFAxLCBQMiwgRj4sIEk+IEZ1bmM7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgYm9vbCBGKFAxLCBQMiwgUDMpLCBjbGFzcyBJPgotc3RydWN0IE1heWJlV3JhcFJldHVybjxGdW5jMzxib29sLCBQMSwgUDIsIFAzLCBGLCBJPiwgdm9pZCAqPiB7Ci0gIHR5cGVkZWYgRnVuYzM8dm9pZCAqLCBQMSwgUDIsIFAzLCBSZXR1cm5DbG9zdXJlT3JCcmVhazM8UDEsIFAyLCBQMywgRj4sIEk+Ci0gICAgICBGdW5jOwotfTsKLQotLyogSWYgb3VyIGZ1bmN0aW9uIHJldHVybnMgdm9pZCBidXQgd2Ugd2FudCBvbmUgcmV0dXJuaW5nIHNpemVfdCwgd3JhcCBpdCBpbiBhCi0gKiBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIHNpemUgYXJndW1lbnQuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUDEsIGNsYXNzIFAyLAotICAgICAgICAgIHZvaWQgRihQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjb25zdCBCdWZmZXJIYW5kbGUgKiksIGNsYXNzIEk+Ci1zdHJ1Y3QgTWF5YmVXcmFwUmV0dXJuPAotICAgIEZ1bmM1PHZvaWQsIFAxLCBQMiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqLCBGLCBJPiwKLSAgICAgICAgICBzaXplX3Q+IHsKLSAgdHlwZWRlZiBGdW5jNTxzaXplX3QsIFAxLCBQMiwgY29uc3QgY2hhciAqLCBzaXplX3QsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqLAotICAgICAgICAgICAgICAgIFJldHVyblN0cmluZ0xlbjxQMSwgUDIsIEY+LCBJPiBGdW5jOwotfTsKLQotLyogSWYgb3VyIGZ1bmN0aW9uIHJldHVybnMgYm9vbCBidXQgd2Ugd2FudCBvbmUgcmV0dXJuaW5nIHNpemVfdCwgd3JhcCBpdCBpbiBhCi0gKiBmdW5jdGlvbiB0aGF0IHJldHVybnMgZWl0aGVyIDAgb3IgdGhlIGJ1ZiBzaXplLiAqLwotdGVtcGxhdGUgPGNsYXNzIFAxLCBjbGFzcyBQMiwKLSAgICAgICAgICBib29sIEYoUDEsIFAyLCBjb25zdCBjaGFyICosIHNpemVfdCwgY29uc3QgQnVmZmVySGFuZGxlICopLCBjbGFzcyBJPgotc3RydWN0IE1heWJlV3JhcFJldHVybjwKLSAgICBGdW5jNTxib29sLCBQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjb25zdCBCdWZmZXJIYW5kbGUgKiwgRiwgST4sCi0gICAgc2l6ZV90PiB7Ci0gIHR5cGVkZWYgRnVuYzU8c2l6ZV90LCBQMSwgUDIsIGNvbnN0IGNoYXIgKiwgc2l6ZV90LCBjb25zdCBCdWZmZXJIYW5kbGUgKiwKLSAgICAgICAgICAgICAgICBSZXR1cm5OT3IwPFAxLCBQMiwgRj4sIEk+IEZ1bmM7Ci19OwotCi0vKiBDb252ZXJ0UGFyYW1zICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBUZW1wbGF0ZSBjbGFzcyB0aGF0IGNvbnZlcnRzIHRoZSBmdW5jdGlvbiBwYXJhbWV0ZXJzIGlmIG5lY2Vzc2FyeSwgYW5kCi0gKiBpZ25vcmVzIHRoZSBIYW5kbGVyRGF0YSBwYXJhbWV0ZXIgaWYgYXBwcm9wcmlhdGUuCi0gKgotICogVGVtcGxhdGUgcGFyYW1ldGVyIGlzIHRoZSBhcmUgRnVuY04gZnVuY3Rpb24gdHlwZS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBGLCBjbGFzcyBUPgotc3RydWN0IENvbnZlcnRQYXJhbXM7Ci0KLS8qIEZ1bmN0aW9uIHRoYXQgZGlzY2FyZHMgdGhlIGhhbmRsZXIgZGF0YSBwYXJhbWV0ZXIuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIFIgRihQMSk+Ci1SIElnbm9yZUhhbmRsZXJEYXRhMih2b2lkICpwMSwgY29uc3Qgdm9pZCAqaGQpIHsKLSAgVVBCX1VOVVNFRChoZCk7Ci0gIHJldHVybiBGKHN0YXRpY19jYXN0PFAxPihwMSkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyV3JhcHBlciwgY2xhc3MgUDJXcmFwcGVkLAotICAgICAgICAgIFIgRihQMSwgUDJXcmFwcGVkKT4KLVIgSWdub3JlSGFuZGxlckRhdGEzKHZvaWQgKnAxLCBjb25zdCB2b2lkICpoZCwgUDJXcmFwcGVyIHAyKSB7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByZXR1cm4gRihzdGF0aWNfY2FzdDxQMT4ocDEpLCBwMik7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBSIEYoUDEsIFAyLCBQMyk+Ci1SIElnbm9yZUhhbmRsZXJEYXRhNCh2b2lkICpwMSwgY29uc3Qgdm9pZCAqaGQsIFAyIHAyLCBQMyBwMykgewotICBVUEJfVU5VU0VEKGhkKTsKLSAgcmV0dXJuIEYoc3RhdGljX2Nhc3Q8UDE+KHAxKSwgcDIsIHAzKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBSIEYoUDEsIFAyLCBQMywgUDQpPgotUiBJZ25vcmVIYW5kbGVyRGF0YTUodm9pZCAqcDEsIGNvbnN0IHZvaWQgKmhkLCBQMiBwMiwgUDMgcDMsIFA0IHA0KSB7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICByZXR1cm4gRihzdGF0aWNfY2FzdDxQMT4ocDEpLCBwMiwgcDMsIHA0KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBSIEYoUDEsIGNvbnN0IGNoYXIqLCBzaXplX3QpPgotUiBJZ25vcmVIYW5kbGVyRGF0YUlnbm9yZUhhbmRsZSh2b2lkICpwMSwgY29uc3Qgdm9pZCAqaGQsIGNvbnN0IGNoYXIgKnAyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcDMsIGNvbnN0IEJ1ZmZlckhhbmRsZSAqaGFuZGxlKSB7Ci0gIFVQQl9VTlVTRUQoaGQpOwotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0gIHJldHVybiBGKHN0YXRpY19jYXN0PFAxPihwMSksIHAyLCBwMyk7Ci19Ci0KLS8qIEZ1bmN0aW9uIHRoYXQgY2FzdHMgdGhlIGhhbmRsZXIgZGF0YSBwYXJhbWV0ZXIuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSIEYoUDEsIFAyKT4KLVIgQ2FzdEhhbmRsZXJEYXRhMih2b2lkICpjLCBjb25zdCB2b2lkICpoZCkgewotICByZXR1cm4gRihzdGF0aWNfY2FzdDxQMT4oYyksIHN0YXRpY19jYXN0PFAyPihoZCkpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQM1dyYXBwZXIsIGNsYXNzIFAzV3JhcHBlZCwKLSAgICAgICAgICBSIEYoUDEsIFAyLCBQM1dyYXBwZWQpPgotUiBDYXN0SGFuZGxlckRhdGEzKHZvaWQgKmMsIGNvbnN0IHZvaWQgKmhkLCBQM1dyYXBwZXIgcDMpIHsKLSAgcmV0dXJuIEYoc3RhdGljX2Nhc3Q8UDE+KGMpLCBzdGF0aWNfY2FzdDxQMj4oaGQpLCBwMyk7Ci19Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQNCwgY2xhc3MgUDUsCi0gICAgICAgICAgUiBGKFAxLCBQMiwgUDMsIFA0LCBQNSk+Ci1SIENhc3RIYW5kbGVyRGF0YTUodm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIFAzIHAzLCBQNCBwNCwgUDUgcDUpIHsKLSAgcmV0dXJuIEYoc3RhdGljX2Nhc3Q8UDE+KGMpLCBzdGF0aWNfY2FzdDxQMj4oaGQpLCBwMywgcDQsIHA1KTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgUiBGKFAxLCBQMiwgY29uc3QgY2hhciAqLCBzaXplX3QpPgotUiBDYXN0SGFuZGxlckRhdGFJZ25vcmVIYW5kbGUodm9pZCAqYywgY29uc3Qgdm9pZCAqaGQsIGNvbnN0IGNoYXIgKnAzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHA0LCBjb25zdCBCdWZmZXJIYW5kbGUgKmhhbmRsZSkgewotICBVUEJfVU5VU0VEKGhhbmRsZSk7Ci0gIHJldHVybiBGKHN0YXRpY19jYXN0PFAxPihjKSwgc3RhdGljX2Nhc3Q8UDI+KGhkKSwgcDMsIHA0KTsKLX0KLQotLyogRm9yIHVuYm91bmQgZnVuY3Rpb25zLCBpZ25vcmUgdGhlIGhhbmRsZXIgZGF0YS4gKi8KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgUiBGKFAxKSwgY2xhc3MgSSwgY2xhc3MgVD4KLXN0cnVjdCBDb252ZXJ0UGFyYW1zPEZ1bmMxPFIsIFAxLCBGLCBJPiwgVD4gewotICB0eXBlZGVmIEZ1bmMyPFIsIHZvaWQgKiwgY29uc3Qgdm9pZCAqLCBJZ25vcmVIYW5kbGVyRGF0YTI8UiwgUDEsIEY+LCBJPiBGdW5jOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgUiBGKFAxLCBQMiksIGNsYXNzIEksCi0gICAgICAgICAgY2xhc3MgUjIsIGNsYXNzIFAxXzIsIGNsYXNzIFAyXzIsIGNsYXNzIFAzXzI+Ci1zdHJ1Y3QgQ29udmVydFBhcmFtczxGdW5jMjxSLCBQMSwgUDIsIEYsIEk+LAotICAgICAgICAgICAgICAgICAgICAgUjIgKCopKFAxXzIsIFAyXzIsIFAzXzIpPiB7Ci0gIHR5cGVkZWYgRnVuYzM8Uiwgdm9pZCAqLCBjb25zdCB2b2lkICosIFAzXzIsCi0gICAgICAgICAgICAgICAgSWdub3JlSGFuZGxlckRhdGEzPFIsIFAxLCBQM18yLCBQMiwgRj4sIEk+IEZ1bmM7Ci19OwotCi0vKiBGb3IgU3RyaW5nQnVmZmVyIG9ubHk7IHRoaXMgaWdub3JlcyBib3RoIHRoZSBoYW5kbGVyIGRhdGEgYW5kIHRoZQotICogQnVmZmVySGFuZGxlLiAqLwotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBSIEYoUDEsIGNvbnN0IGNoYXIgKiwgc2l6ZV90KSwgY2xhc3MgSSwgY2xhc3MgVD4KLXN0cnVjdCBDb252ZXJ0UGFyYW1zPEZ1bmMzPFIsIFAxLCBjb25zdCBjaGFyICosIHNpemVfdCwgRiwgST4sIFQ+IHsKLSAgdHlwZWRlZiBGdW5jNTxSLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsCi0gICAgICAgICAgICAgICAgY29uc3QgQnVmZmVySGFuZGxlICosIElnbm9yZUhhbmRsZXJEYXRhSWdub3JlSGFuZGxlPFIsIFAxLCBGPiwKLSAgICAgICAgICAgICAgICBJPiBGdW5jOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDMsIGNsYXNzIFA0LCBSIEYoUDEsIFAyLCBQMywgUDQpLAotICAgICAgICAgIGNsYXNzIEksIGNsYXNzIFQ+Ci1zdHJ1Y3QgQ29udmVydFBhcmFtczxGdW5jNDxSLCBQMSwgUDIsIFAzLCBQNCwgRiwgST4sIFQ+IHsKLSAgdHlwZWRlZiBGdW5jNTxSLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgUDIsIFAzLCBQNCwKLSAgICAgICAgICAgICAgICBJZ25vcmVIYW5kbGVyRGF0YTU8UiwgUDEsIFAyLCBQMywgUDQsIEY+LCBJPiBGdW5jOwotfTsKLQotLyogRm9yIGJvdW5kIGZ1bmN0aW9ucywgY2FzdCB0aGUgaGFuZGxlciBkYXRhLiAqLwotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgUiBGKFAxLCBQMiksIGNsYXNzIEksIGNsYXNzIFQ+Ci1zdHJ1Y3QgQ29udmVydFBhcmFtczxCb3VuZEZ1bmMyPFIsIFAxLCBQMiwgRiwgST4sIFQ+IHsKLSAgdHlwZWRlZiBGdW5jMjxSLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgQ2FzdEhhbmRsZXJEYXRhMjxSLCBQMSwgUDIsIEY+LCBJPgotICAgICAgRnVuYzsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBSIEYoUDEsIFAyLCBQMyksIGNsYXNzIEksCi0gICAgICAgICAgY2xhc3MgUjIsIGNsYXNzIFAxXzIsIGNsYXNzIFAyXzIsIGNsYXNzIFAzXzI+Ci1zdHJ1Y3QgQ29udmVydFBhcmFtczxCb3VuZEZ1bmMzPFIsIFAxLCBQMiwgUDMsIEYsIEk+LAotICAgICAgICAgICAgICAgICAgICAgUjIgKCopKFAxXzIsIFAyXzIsIFAzXzIpPiB7Ci0gIHR5cGVkZWYgRnVuYzM8Uiwgdm9pZCAqLCBjb25zdCB2b2lkICosIFAzXzIsCi0gICAgICAgICAgICAgICAgQ2FzdEhhbmRsZXJEYXRhMzxSLCBQMSwgUDIsIFAzXzIsIFAzLCBGPiwgST4gRnVuYzsKLX07Ci0KLS8qIEZvciBTdHJpbmdCdWZmZXIgb25seTsgdGhpcyBpZ25vcmVzIHRoZSBCdWZmZXJIYW5kbGUuICovCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBSIEYoUDEsIFAyLCBjb25zdCBjaGFyICosIHNpemVfdCksCi0gICAgICAgICAgY2xhc3MgSSwgY2xhc3MgVD4KLXN0cnVjdCBDb252ZXJ0UGFyYW1zPEJvdW5kRnVuYzQ8UiwgUDEsIFAyLCBjb25zdCBjaGFyICosIHNpemVfdCwgRiwgST4sIFQ+IHsKLSAgdHlwZWRlZiBGdW5jNTxSLCB2b2lkICosIGNvbnN0IHZvaWQgKiwgY29uc3QgY2hhciAqLCBzaXplX3QsCi0gICAgICAgICAgICAgICAgY29uc3QgQnVmZmVySGFuZGxlICosIENhc3RIYW5kbGVyRGF0YUlnbm9yZUhhbmRsZTxSLCBQMSwgUDIsIEY+LAotICAgICAgICAgICAgICAgIEk+IEZ1bmM7Ci19OwotCi10ZW1wbGF0ZSA8Y2xhc3MgUiwgY2xhc3MgUDEsIGNsYXNzIFAyLCBjbGFzcyBQMywgY2xhc3MgUDQsIGNsYXNzIFA1LAotICAgICAgICAgIFIgRihQMSwgUDIsIFAzLCBQNCwgUDUpLCBjbGFzcyBJLCBjbGFzcyBUPgotc3RydWN0IENvbnZlcnRQYXJhbXM8Qm91bmRGdW5jNTxSLCBQMSwgUDIsIFAzLCBQNCwgUDUsIEYsIEk+LCBUPiB7Ci0gIHR5cGVkZWYgRnVuYzU8Uiwgdm9pZCAqLCBjb25zdCB2b2lkICosIFAzLCBQNCwgUDUsCi0gICAgICAgICAgICAgICAgQ2FzdEhhbmRsZXJEYXRhNTxSLCBQMSwgUDIsIFAzLCBQNCwgUDUsIEY+LCBJPiBGdW5jOwotfTsKLQotLyogdXR5cGUvbHR5cGUgYXJlIHVwcGVyL2xvd2VyLWNhc2UsIGN0eXBlIGlzIGNhbm9uaWNhbCBDIHR5cGUsIHZ0eXBlIGlzCi0gKiB2YXJpYW50IEMgdHlwZS4gKi8KLSNkZWZpbmUgVFlQRV9NRVRIT0RTKHV0eXBlLCBsdHlwZSwgY3R5cGUsIHZ0eXBlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+IHN0cnVjdCBDYW5vbmljYWxUeXBlPHZ0eXBlPiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHR5cGVkZWYgY3R5cGUgVHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0VmFsdWVIYW5kbGVyPHZ0eXBlPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IEZpZWxkRGVmICpmLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCBIYW5kbGVyczo6dXR5cGUgIyMgSGFuZGxlciYgaGFuZGxlcikgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaGFuZGxlci5yZWdpc3RlcmVkXyA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0IyNsdHlwZSh0aGlzLCBmLCBoYW5kbGVyLmhhbmRsZXJfLCAmaGFuZGxlci5hdHRyXyk7IFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLVRZUEVfTUVUSE9EUyhEb3VibGUsIGRvdWJsZSwgZG91YmxlLCAgIGRvdWJsZSkKLVRZUEVfTUVUSE9EUyhGbG9hdCwgIGZsb2F0LCAgZmxvYXQsICAgIGZsb2F0KQotVFlQRV9NRVRIT0RTKFVJbnQ2NCwgdWludDY0LCB1aW50NjRfdCwgVVBCX1VJTlQ2NF9UKQotVFlQRV9NRVRIT0RTKFVJbnQzMiwgdWludDMyLCB1aW50MzJfdCwgVVBCX1VJTlQzMl9UKQotVFlQRV9NRVRIT0RTKEludDY0LCAgaW50NjQsICBpbnQ2NF90LCAgVVBCX0lOVDY0X1QpCi1UWVBFX01FVEhPRFMoSW50MzIsICBpbnQzMiwgIGludDMyX3QsICBVUEJfSU5UMzJfVCkKLVRZUEVfTUVUSE9EUyhCb29sLCAgIGJvb2wsICAgYm9vbCwgICAgIGJvb2wpCi0KLSNpZmRlZiBVUEJfVFdPXzMyQklUX1RZUEVTCi1UWVBFX01FVEhPRFMoSW50MzIsICBpbnQzMiwgIGludDMyX3QsICBVUEJfSU5UMzJBTFRfVCkKLVRZUEVfTUVUSE9EUyhVSW50MzIsIHVpbnQzMiwgdWludDMyX3QsIFVQQl9VSU5UMzJBTFRfVCkKLSNlbmRpZgotCi0jaWZkZWYgVVBCX1RXT182NEJJVF9UWVBFUwotVFlQRV9NRVRIT0RTKEludDY0LCAgaW50NjQsICBpbnQ2NF90LCAgVVBCX0lOVDY0QUxUX1QpCi1UWVBFX01FVEhPRFMoVUludDY0LCB1aW50NjQsIHVpbnQ2NF90LCBVUEJfVUlOVDY0QUxUX1QpCi0jZW5kaWYKLSN1bmRlZiBUWVBFX01FVEhPRFMKLQotdGVtcGxhdGUgPD4gc3RydWN0IENhbm9uaWNhbFR5cGU8U3RhdHVzKj4gewotICB0eXBlZGVmIFN0YXR1cyogVHlwZTsKLX07Ci0KLS8qIFR5cGUgbWV0aG9kcyB0aGF0IGFyZSBvbmx5IG9uZS1wZXItY2Fub25pY2FsLXR5cGUgYW5kIG5vdAotICogb25lLXBlci1jdmFyaWFudC4gKi8KLQotI2RlZmluZSBUWVBFX01FVEhPRFModXR5cGUsIGN0eXBlKSBcCi0gICAgaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldCMjdXR5cGUjI0hhbmRsZXIoY29uc3QgRmllbGREZWYgKmYsIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1dHlwZSMjSGFuZGxlciAmaCkgeyBcCi0gICAgICByZXR1cm4gU2V0VmFsdWVIYW5kbGVyPGN0eXBlPihmLCBoKTsgXAotICAgIH0gXAotCi1UWVBFX01FVEhPRFMoRG91YmxlLCBkb3VibGUpCi1UWVBFX01FVEhPRFMoRmxvYXQsICBmbG9hdCkKLVRZUEVfTUVUSE9EUyhVSW50NjQsIHVpbnQ2NF90KQotVFlQRV9NRVRIT0RTKFVJbnQzMiwgdWludDMyX3QpCi1UWVBFX01FVEhPRFMoSW50NjQsICBpbnQ2NF90KQotVFlQRV9NRVRIT0RTKEludDMyLCAgaW50MzJfdCkKLVRZUEVfTUVUSE9EUyhCb29sLCAgIGJvb2wpCi0jdW5kZWYgVFlQRV9NRVRIT0RTCi0KLXRlbXBsYXRlIDxjbGFzcyBGPiBzdHJ1Y3QgUmV0dXJuT2Y7Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDI+Ci1zdHJ1Y3QgUmV0dXJuT2Y8UiAoKikoUDEsIFAyKT4gewotICB0eXBlZGVmIFIgUmV0dXJuOwotfTsKLQotdGVtcGxhdGUgPGNsYXNzIFIsIGNsYXNzIFAxLCBjbGFzcyBQMiwgY2xhc3MgUDM+Ci1zdHJ1Y3QgUmV0dXJuT2Y8UiAoKikoUDEsIFAyLCBQMyk+IHsKLSAgdHlwZWRlZiBSIFJldHVybjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQND4KLXN0cnVjdCBSZXR1cm5PZjxSICgqKShQMSwgUDIsIFAzLCBQNCk+IHsKLSAgdHlwZWRlZiBSIFJldHVybjsKLX07Ci0KLXRlbXBsYXRlIDxjbGFzcyBSLCBjbGFzcyBQMSwgY2xhc3MgUDIsIGNsYXNzIFAzLCBjbGFzcyBQNCwgY2xhc3MgUDU+Ci1zdHJ1Y3QgUmV0dXJuT2Y8UiAoKikoUDEsIFAyLCBQMywgUDQsIFA1KT4gewotICB0eXBlZGVmIFIgUmV0dXJuOwotfTsKLQotdGVtcGxhdGU8Y2xhc3MgVD4gY29uc3Qgdm9pZCAqVW5pcXVlUHRyRm9yVHlwZSgpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIgY2ggPSAwOwotICByZXR1cm4gJmNoOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXRlbXBsYXRlIDxjbGFzcyBGPgotaW5saW5lIEhhbmRsZXI8VD46OkhhbmRsZXIoRiBmdW5jKQotICAgIDogcmVnaXN0ZXJlZF8oZmFsc2UpLAotICAgICAgY2xlYW51cF9kYXRhXyhmdW5jLkdldERhdGEoKSksCi0gICAgICBjbGVhbnVwX2Z1bmNfKGZ1bmMuR2V0Q2xlYW51cCgpKSB7Ci0gIHVwYl9oYW5kbGVyYXR0cl9zZXRoYW5kbGVyZGF0YSgmYXR0cl8sIGZ1bmMuR2V0RGF0YSgpKTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBSZXR1cm5PZjxUPjo6UmV0dXJuIFJldHVybjsKLSAgdHlwZWRlZiB0eXBlbmFtZSBDb252ZXJ0UGFyYW1zPEYsIFQ+OjpGdW5jIENvbnZlcnRlZFBhcmFtc0Z1bmM7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgTWF5YmVXcmFwUmV0dXJuPENvbnZlcnRlZFBhcmFtc0Z1bmMsIFJldHVybj46OkZ1bmMKLSAgICAgIFJldHVybldyYXBwZWRGdW5jOwotICBoYW5kbGVyXyA9IFJldHVybldyYXBwZWRGdW5jKCkuQ2FsbDsKLQotICAvKiBTZXQgYXR0cmlidXRlcyBiYXNlZCBvbiB3aGF0IHRlbXBsYXRlcyBjYW4gc3RhdGljYWxseSB0ZWxsIHVzIGFib3V0IHRoZQotICAgKiB1c2VyJ3MgZnVuY3Rpb24uICovCi0KLSAgLyogSWYgdGhlIG9yaWdpbmFsIGZ1bmN0aW9uIHJldHVybnMgdm9pZCwgdGhlbiB3ZSBrbm93IHRoYXQgd2Ugd3JhcHBlZCBpdCB0bwotICAgKiBhbHdheXMgcmV0dXJuIG9rLiAqLwotICBib29sIGFsd2F5c19vayA9IGlzX3NhbWU8dHlwZW5hbWUgRjo6RnVuY0luZm86OlJldHVybiwgdm9pZD46OnZhbHVlOwotICBhdHRyXy5TZXRBbHdheXNPayhhbHdheXNfb2spOwotCi0gIC8qIENsb3N1cmUgcGFyYW1ldGVyIGFuZCByZXR1cm4gdHlwZS4gKi8KLSAgYXR0cl8uU2V0Q2xvc3VyZVR5cGUoVW5pcXVlUHRyRm9yVHlwZTx0eXBlbmFtZSBGOjpGdW5jSW5mbzo6Q2xvc3VyZT4oKSk7Ci0KLSAgLyogV2UgdXNlIHRoZSBjbG9zdXJlIHR5cGUgKGZyb20gdGhlIGZpcnN0IHBhcmFtZXRlcikgaWYgdGhlIHJldHVybiB0eXBlIGlzCi0gICAqIHZvaWQgb3IgYm9vbCwgc2luY2UgdGhlc2UgYXJlIHRoZSB0d28gY2FzZXMgd2Ugd3JhcCB0byByZXR1cm4gdGhlIGNsb3N1cmUncwotICAgKiB0eXBlIGFueXdheS4KLSAgICoKLSAgICogVGhpcyBpcyBhbGwgbm9uc2Vuc2UgZm9yIG5vbiBTVEFSVCogaGFuZGxlcnMsIGJ1dCBpdCBkb2Vzbid0IG1hdHRlciBiZWNhdXNlCi0gICAqIGluIHRoYXQgY2FzZSB0aGUgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLiAqLwotICB0eXBlZGVmIHR5cGVuYW1lIEZpcnN0VW5sZXNzVm9pZE9yQm9vbDx0eXBlbmFtZSBGOjpGdW5jSW5mbzo6UmV0dXJuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBGOjpGdW5jSW5mbzo6Q2xvc3VyZT46OnZhbHVlCi0gICAgICBFZmZlY3RpdmVSZXR1cm47Ci0gIGF0dHJfLlNldFJldHVybkNsb3N1cmVUeXBlKFVuaXF1ZVB0ckZvclR5cGU8RWZmZWN0aXZlUmV0dXJuPigpKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci1pbmxpbmUgSGFuZGxlcjxUPjo6fkhhbmRsZXIoKSB7Ci0gIGFzc2VydChyZWdpc3RlcmVkXyk7Ci19Ci0KLWlubGluZSBIYW5kbGVyQXR0cmlidXRlczo6SGFuZGxlckF0dHJpYnV0ZXMoKSB7IHVwYl9oYW5kbGVyYXR0cl9pbml0KHRoaXMpOyB9Ci1pbmxpbmUgSGFuZGxlckF0dHJpYnV0ZXM6On5IYW5kbGVyQXR0cmlidXRlcygpIHsgdXBiX2hhbmRsZXJhdHRyX3VuaW5pdCh0aGlzKTsgfQotaW5saW5lIGJvb2wgSGFuZGxlckF0dHJpYnV0ZXM6OlNldEhhbmRsZXJEYXRhKGNvbnN0IHZvaWQgKmhkKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfc2V0aGFuZGxlcmRhdGEodGhpcywgaGQpOwotfQotaW5saW5lIGNvbnN0IHZvaWQqIEhhbmRsZXJBdHRyaWJ1dGVzOjpoYW5kbGVyX2RhdGEoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfaGFuZGxlcmRhdGEodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyQXR0cmlidXRlczo6U2V0Q2xvc3VyZVR5cGUoY29uc3Qgdm9pZCAqdHlwZSkgewotICByZXR1cm4gdXBiX2hhbmRsZXJhdHRyX3NldGNsb3N1cmV0eXBlKHRoaXMsIHR5cGUpOwotfQotaW5saW5lIGNvbnN0IHZvaWQqIEhhbmRsZXJBdHRyaWJ1dGVzOjpjbG9zdXJlX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfY2xvc3VyZXR5cGUodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyQXR0cmlidXRlczo6U2V0UmV0dXJuQ2xvc3VyZVR5cGUoY29uc3Qgdm9pZCAqdHlwZSkgewotICByZXR1cm4gdXBiX2hhbmRsZXJhdHRyX3NldHJldHVybmNsb3N1cmV0eXBlKHRoaXMsIHR5cGUpOwotfQotaW5saW5lIGNvbnN0IHZvaWQqIEhhbmRsZXJBdHRyaWJ1dGVzOjpyZXR1cm5fY2xvc3VyZV90eXBlKCkgY29uc3QgewotICByZXR1cm4gdXBiX2hhbmRsZXJhdHRyX3JldHVybmNsb3N1cmV0eXBlKHRoaXMpOwotfQotaW5saW5lIGJvb2wgSGFuZGxlckF0dHJpYnV0ZXM6OlNldEFsd2F5c09rKGJvb2wgYWx3YXlzX29rKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfc2V0YWx3YXlzb2sodGhpcywgYWx3YXlzX29rKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJBdHRyaWJ1dGVzOjphbHdheXNfb2soKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcmF0dHJfYWx3YXlzb2sodGhpcyk7Ci19Ci0KLWlubGluZSBCdWZmZXJIYW5kbGU6OkJ1ZmZlckhhbmRsZSgpIHsgdXBiX2J1ZmhhbmRsZV9pbml0KHRoaXMpOyB9Ci1pbmxpbmUgQnVmZmVySGFuZGxlOjp+QnVmZmVySGFuZGxlKCkgeyB1cGJfYnVmaGFuZGxlX3VuaW5pdCh0aGlzKTsgfQotaW5saW5lIGNvbnN0IGNoYXIqIEJ1ZmZlckhhbmRsZTo6YnVmZmVyKCkgY29uc3QgewotICByZXR1cm4gdXBiX2J1ZmhhbmRsZV9idWYodGhpcyk7Ci19Ci1pbmxpbmUgc2l6ZV90IEJ1ZmZlckhhbmRsZTo6b2JqZWN0X29mZnNldCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9idWZoYW5kbGVfb2Jqb2ZzKHRoaXMpOwotfQotaW5saW5lIHZvaWQgQnVmZmVySGFuZGxlOjpTZXRCdWZmZXIoY29uc3QgY2hhciogYnVmLCBzaXplX3Qgb2ZzKSB7Ci0gIHVwYl9idWZoYW5kbGVfc2V0YnVmKHRoaXMsIGJ1Ziwgb2ZzKTsKLX0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBCdWZmZXJIYW5kbGU6OlNldEF0dGFjaGVkT2JqZWN0KGNvbnN0IFQqIG9iaikgewotICB1cGJfYnVmaGFuZGxlX3NldG9iaih0aGlzLCBvYmosIFVuaXF1ZVB0ckZvclR5cGU8VD4oKSk7Ci19Ci10ZW1wbGF0ZSA8Y2xhc3MgVD4KLWNvbnN0IFQqIEJ1ZmZlckhhbmRsZTo6R2V0QXR0YWNoZWRPYmplY3QoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfYnVmaGFuZGxlX29ianR5cGUodGhpcykgPT0gVW5pcXVlUHRyRm9yVHlwZTxUPigpCi0gICAgICA/IHN0YXRpY19jYXN0PGNvbnN0IFQgKj4odXBiX2J1ZmhhbmRsZV9vYmoodGhpcykpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMOwotfQotCi1pbmxpbmUgcmVmZmVkX3B0cjxIYW5kbGVycz4gSGFuZGxlcnM6Ok5ldyhjb25zdCBNZXNzYWdlRGVmICptKSB7Ci0gIHVwYl9oYW5kbGVycyAqaCA9IHVwYl9oYW5kbGVyc19uZXcobSwgJmgpOwotICByZXR1cm4gcmVmZmVkX3B0cjxIYW5kbGVycz4oaCwgJmgpOwotfQotaW5saW5lIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+IEhhbmRsZXJzOjpOZXdGcm96ZW4oCi0gICAgY29uc3QgTWVzc2FnZURlZiAqbSwgdXBiX2hhbmRsZXJzX2NhbGxiYWNrICpjYWxsYmFjaywKLSAgICBjb25zdCB2b2lkICpjbG9zdXJlKSB7Ci0gIGNvbnN0IHVwYl9oYW5kbGVycyAqaCA9IHVwYl9oYW5kbGVyc19uZXdmcm96ZW4obSwgJmgsIGNhbGxiYWNrLCBjbG9zdXJlKTsKLSAgcmV0dXJuIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+KGgsICZoKTsKLX0KLWlubGluZSBjb25zdCBTdGF0dXMqIEhhbmRsZXJzOjpzdGF0dXMoKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc3RhdHVzKHRoaXMpOwotfQotaW5saW5lIHZvaWQgSGFuZGxlcnM6OkNsZWFyRXJyb3IoKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfY2xlYXJlcnIodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6RnJlZXplKFN0YXR1cyAqcykgewotICB1cGI6OkhhbmRsZXJzKiBoID0gdGhpczsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19mcmVlemUoJmgsIDEsIHMpOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OkZyZWV6ZShIYW5kbGVycyAqY29uc3QgKmhhbmRsZXJzLCBpbnQgbiwgU3RhdHVzICpzKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfZnJlZXplKGhhbmRsZXJzLCBuLCBzKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpGcmVlemUoY29uc3Qgc3RkOjp2ZWN0b3I8SGFuZGxlcnMqPiYgaCwgU3RhdHVzKiBzdGF0dXMpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19mcmVlemUoKEhhbmRsZXJzKiBjb25zdCopJmhbMF0sIGguc2l6ZSgpLCBzdGF0dXMpOwotfQotaW5saW5lIGNvbnN0IE1lc3NhZ2VEZWYgKkhhbmRsZXJzOjptZXNzYWdlX2RlZigpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19tc2dkZWYodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6QWRkQ2xlYW51cCh2b2lkICpwLCB1cGJfaGFuZGxlcmZyZWUgKmZ1bmMpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19hZGRjbGVhbnVwKHRoaXMsIHAsIGZ1bmMpOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldFN0YXJ0TWVzc2FnZUhhbmRsZXIoCi0gICAgY29uc3QgSGFuZGxlcnM6OlN0YXJ0TWVzc2FnZUhhbmRsZXIgJmhhbmRsZXIpIHsKLSAgYXNzZXJ0KCFoYW5kbGVyLnJlZ2lzdGVyZWRfKTsKLSAgaGFuZGxlci5yZWdpc3RlcmVkXyA9IHRydWU7Ci0gIGhhbmRsZXIuQWRkQ2xlYW51cCh0aGlzKTsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXRzdGFydG1zZyh0aGlzLCBoYW5kbGVyLmhhbmRsZXJfLCAmaGFuZGxlci5hdHRyXyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0RW5kTWVzc2FnZUhhbmRsZXIoCi0gICAgY29uc3QgSGFuZGxlcnM6OkVuZE1lc3NhZ2VIYW5kbGVyICZoYW5kbGVyKSB7Ci0gIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7Ci0gIGhhbmRsZXIucmVnaXN0ZXJlZF8gPSB0cnVlOwotICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0ZW5kbXNnKHRoaXMsIGhhbmRsZXIuaGFuZGxlcl8sICZoYW5kbGVyLmF0dHJfKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpTZXRTdGFydFN0cmluZ0hhbmRsZXIoY29uc3QgRmllbGREZWYgKmYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFN0YXJ0U3RyaW5nSGFuZGxlciAmaGFuZGxlcikgewotICBhc3NlcnQoIWhhbmRsZXIucmVnaXN0ZXJlZF8pOwotICBoYW5kbGVyLnJlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgaGFuZGxlci5BZGRDbGVhbnVwKHRoaXMpOwotICByZXR1cm4gdXBiX2hhbmRsZXJzX3NldHN0YXJ0c3RyKHRoaXMsIGYsIGhhbmRsZXIuaGFuZGxlcl8sICZoYW5kbGVyLmF0dHJfKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpTZXRFbmRTdHJpbmdIYW5kbGVyKGNvbnN0IEZpZWxkRGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW5kRmllbGRIYW5kbGVyICZoYW5kbGVyKSB7Ci0gIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7Ci0gIGhhbmRsZXIucmVnaXN0ZXJlZF8gPSB0cnVlOwotICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0ZW5kc3RyKHRoaXMsIGYsIGhhbmRsZXIuaGFuZGxlcl8sICZoYW5kbGVyLmF0dHJfKTsKLX0KLWlubGluZSBib29sIEhhbmRsZXJzOjpTZXRTdHJpbmdIYW5kbGVyKGNvbnN0IEZpZWxkRGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU3RyaW5nSGFuZGxlciYgaGFuZGxlcikgewotICBhc3NlcnQoIWhhbmRsZXIucmVnaXN0ZXJlZF8pOwotICBoYW5kbGVyLnJlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgaGFuZGxlci5BZGRDbGVhbnVwKHRoaXMpOwotICByZXR1cm4gdXBiX2hhbmRsZXJzX3NldHN0cmluZyh0aGlzLCBmLCBoYW5kbGVyLmhhbmRsZXJfLCAmaGFuZGxlci5hdHRyXyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0U3RhcnRTZXF1ZW5jZUhhbmRsZXIoCi0gICAgY29uc3QgRmllbGREZWYgKmYsIGNvbnN0IFN0YXJ0RmllbGRIYW5kbGVyICZoYW5kbGVyKSB7Ci0gIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7Ci0gIGhhbmRsZXIucmVnaXN0ZXJlZF8gPSB0cnVlOwotICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzZXEodGhpcywgZiwgaGFuZGxlci5oYW5kbGVyXywgJmhhbmRsZXIuYXR0cl8pOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldFN0YXJ0U3ViTWVzc2FnZUhhbmRsZXIoCi0gICAgY29uc3QgRmllbGREZWYgKmYsIGNvbnN0IFN0YXJ0RmllbGRIYW5kbGVyICZoYW5kbGVyKSB7Ci0gIGFzc2VydCghaGFuZGxlci5yZWdpc3RlcmVkXyk7Ci0gIGhhbmRsZXIucmVnaXN0ZXJlZF8gPSB0cnVlOwotICBoYW5kbGVyLkFkZENsZWFudXAodGhpcyk7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0c3RhcnRzdWJtc2codGhpcywgZiwgaGFuZGxlci5oYW5kbGVyXywgJmhhbmRsZXIuYXR0cl8pOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldEVuZFN1Yk1lc3NhZ2VIYW5kbGVyKGNvbnN0IEZpZWxkRGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVuZEZpZWxkSGFuZGxlciAmaGFuZGxlcikgewotICBhc3NlcnQoIWhhbmRsZXIucmVnaXN0ZXJlZF8pOwotICBoYW5kbGVyLnJlZ2lzdGVyZWRfID0gdHJ1ZTsKLSAgaGFuZGxlci5BZGRDbGVhbnVwKHRoaXMpOwotICByZXR1cm4gdXBiX2hhbmRsZXJzX3NldGVuZHN1Ym1zZyh0aGlzLCBmLCBoYW5kbGVyLmhhbmRsZXJfLCAmaGFuZGxlci5hdHRyXyk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6U2V0RW5kU2VxdWVuY2VIYW5kbGVyKGNvbnN0IEZpZWxkRGVmICpmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbmRGaWVsZEhhbmRsZXIgJmhhbmRsZXIpIHsKLSAgYXNzZXJ0KCFoYW5kbGVyLnJlZ2lzdGVyZWRfKTsKLSAgaGFuZGxlci5yZWdpc3RlcmVkXyA9IHRydWU7Ci0gIGhhbmRsZXIuQWRkQ2xlYW51cCh0aGlzKTsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19zZXRlbmRzZXEodGhpcywgZiwgaGFuZGxlci5oYW5kbGVyXywgJmhhbmRsZXIuYXR0cl8pOwotfQotaW5saW5lIGJvb2wgSGFuZGxlcnM6OlNldFN1YkhhbmRsZXJzKGNvbnN0IEZpZWxkRGVmICpmLCBjb25zdCBIYW5kbGVycyAqc3ViKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfc2V0c3ViaGFuZGxlcnModGhpcywgZiwgc3ViKTsKLX0KLWlubGluZSBjb25zdCBIYW5kbGVycyAqSGFuZGxlcnM6OkdldFN1YkhhbmRsZXJzKGNvbnN0IEZpZWxkRGVmICpmKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnModGhpcywgZik7Ci19Ci1pbmxpbmUgY29uc3QgSGFuZGxlcnMgKkhhbmRsZXJzOjpHZXRTdWJIYW5kbGVycyhIYW5kbGVyczo6U2VsZWN0b3Igc2VsKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfZ2V0c3ViaGFuZGxlcnNfc2VsKHRoaXMsIHNlbCk7Ci19Ci1pbmxpbmUgYm9vbCBIYW5kbGVyczo6R2V0U2VsZWN0b3IoY29uc3QgRmllbGREZWYgKmYsIEhhbmRsZXJzOjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSGFuZGxlcnM6OlNlbGVjdG9yICpzKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfZ2V0c2VsZWN0b3IoZiwgdHlwZSwgcyk7Ci19Ci1pbmxpbmUgSGFuZGxlcnM6OlNlbGVjdG9yIEhhbmRsZXJzOjpHZXRFbmRTZWxlY3RvcihIYW5kbGVyczo6U2VsZWN0b3Igc3RhcnQpIHsKLSAgcmV0dXJuIHVwYl9oYW5kbGVyc19nZXRlbmRzZWxlY3RvcihzdGFydCk7Ci19Ci1pbmxpbmUgSGFuZGxlcnM6OkdlbmVyaWNGdW5jdGlvbiAqSGFuZGxlcnM6OkdldEhhbmRsZXIoCi0gICAgSGFuZGxlcnM6OlNlbGVjdG9yIHNlbGVjdG9yKSB7Ci0gIHJldHVybiB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcih0aGlzLCBzZWxlY3Rvcik7Ci19Ci1pbmxpbmUgY29uc3Qgdm9pZCAqSGFuZGxlcnM6OkdldEhhbmRsZXJEYXRhKEhhbmRsZXJzOjpTZWxlY3RvciBzZWxlY3RvcikgewotICByZXR1cm4gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHRoaXMsIHNlbGVjdG9yKTsKLX0KLQotaW5saW5lIEJ5dGVzSGFuZGxlcjo6Qnl0ZXNIYW5kbGVyKCkgewotICB1cGJfYnl0ZXNoYW5kbGVyX2luaXQodGhpcyk7Ci19Ci0KLWlubGluZSBCeXRlc0hhbmRsZXI6On5CeXRlc0hhbmRsZXIoKSB7fQotCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0KLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotCi0jdW5kZWYgVVBCX1RXT18zMkJJVF9UWVBFUwotI3VuZGVmIFVQQl9UV09fNjRCSVRfVFlQRVMKLSN1bmRlZiBVUEJfSU5UMzJfVAotI3VuZGVmIFVQQl9VSU5UMzJfVAotI3VuZGVmIFVQQl9JTlQzMkFMVF9UCi0jdW5kZWYgVVBCX1VJTlQzMkFMVF9UCi0jdW5kZWYgVVBCX0lOVDY0X1QKLSN1bmRlZiBVUEJfVUlOVDY0X1QKLSN1bmRlZiBVUEJfSU5UNjRBTFRfVAotI3VuZGVmIFVQQl9VSU5UNjRBTFRfVAotCi0jZW5kaWYgIC8qIFVQQl9IQU5ETEVSU19JTkxfSF8gKi8KLQotI2VuZGlmICAvKiBVUEJfSEFORExFUlNfSCAqLwotLyoKLSoqIHVwYjo6U2luayAodXBiX3NpbmspCi0qKiB1cGI6OkJ5dGVzU2luayAodXBiX2J5dGVzc2luaykKLSoqCi0qKiBBIHVwYl9zaW5rIGlzIGFuIG9iamVjdCB0aGF0IGJpbmRzIGEgdXBiX2hhbmRsZXJzIG9iamVjdCB0byBzb21lIHJ1bnRpbWUKLSoqIHN0YXRlLiAgSXQgaXMgdGhlIG9iamVjdCB0aGF0IGNhbiBhY3R1YWxseSByZWNlaXZlIGRhdGEgdmlhIHRoZSB1cGJfaGFuZGxlcnMKLSoqIGludGVyZmFjZS4KLSoqCi0qKiBVbmxpa2UgdXBiX2RlZiBhbmQgdXBiX2hhbmRsZXJzLCB1cGJfc2luayBpcyBuZXZlciBmcm96ZW4sIGltbXV0YWJsZSwgb3IKLSoqIHRocmVhZC1zYWZlLiAgWW91IGNhbiBjcmVhdGUgYXMgbWFueSBvZiB0aGVtIGFzIHlvdSB3YW50LCBidXQgZWFjaCBvbmUgbWF5Ci0qKiBvbmx5IGJlIHVzZWQgaW4gYSBzaW5nbGUgdGhyZWFkIGF0IGEgdGltZS4KLSoqCi0qKiBJZiB3ZSBjb21wYXJlIHdpdGggY2xhc3MtYmFzZWQgT09QLCBhIHlvdSBjYW4gdGhpbmsgb2YgYSB1cGJfZGVmIGFzIGFuCi0qKiBhYnN0cmFjdCBiYXNlIGNsYXNzLCBhIHVwYl9oYW5kbGVycyBhcyBhIGNvbmNyZXRlIGRlcml2ZWQgY2xhc3MsIGFuZCBhCi0qKiB1cGJfc2luayBhcyBhbiBvYmplY3QgKGNsYXNzIGluc3RhbmNlKS4KLSovCi0KLSNpZm5kZWYgVVBCX1NJTktfSAotI2RlZmluZSBVUEJfU0lOS19ICi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgdXBiIHsKLWNsYXNzIEJ1ZmZlclNvdXJjZTsKLWNsYXNzIEJ5dGVzU2luazsKLWNsYXNzIFNpbms7Ci19Ci0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OkJ1ZmZlclNvdXJjZSwgdXBiX2J1ZnNyYykKLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpCeXRlc1NpbmssIHVwYl9ieXRlc3NpbmspCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6U2luaywgdXBiX3NpbmspCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBBIHVwYjo6U2luayBpcyBhbiBvYmplY3QgdGhhdCBiaW5kcyBhIHVwYjo6SGFuZGxlcnMgb2JqZWN0IHRvIHNvbWUgcnVudGltZQotICogc3RhdGUuICBJdCByZXByZXNlbnRzIGFuIGVuZHBvaW50IHRvIHdoaWNoIGRhdGEgY2FuIGJlIHNlbnQuCi0gKgotICogVE9ETyhoYWJlcm1hbik6IHJpZ2h0IG5vdyBhbGwgb2YgdGhlc2UgZnVuY3Rpb25zIHRha2Ugc2VsZWN0b3JzLiAgU2hvdWxkIHRoZXkKLSAqIHRha2Ugc2VsZWN0b3JiYXNlIGluc3RlYWQ/Ci0gKgotICogaWUuIGluc3RlYWQgb2YgY2FsbGluZzoKLSAqICAgc2luay0+U3RhcnRTdHJpbmcoRk9PX0ZJRUxEX1NUQVJUX1NUUklORywgLi4uKQotICogYSBzZWxlY3RvciBiYXNlIHdvdWxkIGxldCB5b3Ugc2F5OgotICogICBzaW5rLT5TdGFydFN0cmluZyhGT09fRklFTEQsIC4uLikKLSAqCi0gKiBUaGlzIHdvdWxkIG1ha2UgY2FsbCBzaXRlcyBhIGxpdHRsZSBuaWNlciBhbmQgcmVxdWlyZSBlbWl0dGluZyBmZXdlciBzZWxlY3RvcgotICogZGVmaW5pdGlvbnMgaW4gLmggZmlsZXMuCi0gKgotICogQnV0IHRoZSBjdXJyZW50IHNjaGVtZSBoYXMgdGhlIGJlbmVmaXQgdGhhdCB5b3UgY2FuIHJldHJpZXZlIGEgZnVuY3Rpb24KLSAqIHBvaW50ZXIgZm9yIGFueSBoYW5kbGVyIHdpdGggaGFuZGxlcnMtPkdldEhhbmRsZXIoc2VsZWN0b3IpLCB3aXRob3V0IGhhdmluZwotICogdG8gaGF2ZSBhIHNlcGFyYXRlIEdldEhhbmRsZXIoKSBmdW5jdGlvbiBmb3IgZWFjaCBoYW5kbGVyIHR5cGUuICBUaGUgSklUCi0gKiBjb21waWxlciB1c2VzIHRoaXMuICBUbyBhY2NvbW1vZGF0ZSB3ZSdkIGhhdmUgdG8gZXhwb3NlIGEgc2VwYXJhdGUKLSAqIEdldEhhbmRsZXIoKSBmb3IgZXZlcnkgaGFuZGxlciB0eXBlLgotICoKLSAqIEFsc28gdG8gcG9uZGVyOiBzZWxlY3RvcnMgcmlnaHQgbm93IGFyZSBpbmRlcGVuZGVudCBvZiBhIHNwZWNpZmljIEhhbmRsZXJzCi0gKiBpbnN0YW5jZS4gIEluIG90aGVyIHdvcmRzLCB0aGV5IGFsbG9jYXRlIGEgbnVtYmVyIHRvIGV2ZXJ5IHBvc3NpYmxlIGhhbmRsZXIKLSAqIHRoYXQgKmNvdWxkKiBiZSByZWdpc3RlcmVkLCB3aXRob3V0IGtub3dpbmcgYW55dGhpbmcgYWJvdXQgd2hhdCBoYW5kbGVycwotICogKmFyZSogcmVnaXN0ZXJlZC4gIFRoYXQgbWVhbnMgdGhhdCB1c2luZyBzZWxlY3RvcnMgYXMgdGFibGUgb2Zmc2V0cyBwcm9oaWJpdHMKLSAqIHVzIGZyb20gY29tcGFjdGluZyB0aGUgaGFuZGxlciB0YWJsZSBhdCBGcmVlemUoKSB0aW1lLiAgSWYgdGhlIHRhYmxlIGlzIHZlcnkKLSAqIHNwYXJzZSwgdGhpcyBjb3VsZCBiZSB3YXN0ZWZ1bC4KLSAqCi0gKiBIYXZpbmcgYW5vdGhlciBzZWxlY3Rvci1saWtlIHRoaW5nIHRoYXQgaXMgc3BlY2lmaWMgdG8gYSBIYW5kbGVycyBpbnN0YW5jZQotICogd291bGQgYWxsb3cgdGhpcyBjb21wYWN0aW5nLCBidXQgdGhlbiBpdCB3b3VsZCBiZSBpbXBvc3NpYmxlIHRvIHdyaXRlIGNvZGUKLSAqIGFoZWFkLW9mLXRpbWUgdGhhdCBjYW4gYmUgYm91bmQgdG8gYW55IEhhbmRsZXJzIGluc3RhbmNlIGF0IHJ1bnRpbWUuICBGb3IKLSAqIGV4YW1wbGUsIGEgLnByb3RvIGZpbGUgcGFyc2VyIHdyaXR0ZW4gYXMgc3RyYWlnaHQgQyB3aWxsIG5vdCBrbm93IHdoYXQKLSAqIEhhbmRsZXJzIGl0IHdpbGwgYmUgYm91bmQgdG8sIHNvIHdoZW4gaXQgY2FsbHMgc2luay0+U3RhcnRTdHJpbmcoKSB3aGF0Ci0gKiBzZWxlY3RvciB3aWxsIGl0IHBhc3M/ICBJdCBuZWVkcyBhIHNlbGVjdG9yIGxpa2Ugd2UgaGF2ZSB0b2RheSwgdGhhdCBpcwotICogaW5kZXBlbmRlbnQgb2YgYW55IHBhcnRpY3VsYXIgdXBiOjpIYW5kbGVycy4KLSAqCi0gKiBJcyB0aGVyZSBhIHdheSB0aGVuIHRvIGFsbG93IEhhbmRsZXJzIHRhYmxlIGNvbXBhY3Rpb24/ICovCi1jbGFzcyB1cGI6OlNpbmsgewotIHB1YmxpYzoKLSAgLyogQ29uc3RydWN0b3Igd2l0aCBubyBpbml0aWFsaXphdGlvbjsgbXVzdCBiZSBSZXNldCgpIGJlZm9yZSB1c2UuICovCi0gIFNpbmsoKSB7fQotCi0gIC8qIENvbnN0cnVjdHMgYSBuZXcgc2luayBmb3IgdGhlIGdpdmVuIGZyb3plbiBoYW5kbGVycyBhbmQgY2xvc3VyZS4KLSAgICoKLSAgICogVE9ETzogb25jZSB0aGUgSGFuZGxlcnMga25vdyB0aGUgZXhwZWN0ZWQgY2xvc3VyZSB0eXBlLCB2ZXJpZnkgdGhhdCBUCi0gICAqIG1hdGNoZXMgaXQuICovCi0gIHRlbXBsYXRlIDxjbGFzcyBUPiBTaW5rKGNvbnN0IEhhbmRsZXJzKiBoYW5kbGVycywgVCogY2xvc3VyZSk7Ci0KLSAgLyogUmVzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2luay4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgUmVzZXQoY29uc3QgSGFuZGxlcnMqIGhhbmRsZXJzLCBUKiBjbG9zdXJlKTsKLQotICAvKiBSZXR1cm5zIHRoZSB0b3AtbGV2ZWwgb2JqZWN0IHRoYXQgaXMgYm91bmQgdG8gdGhpcyBzaW5rLgotICAgKgotICAgKiBUT0RPOiBvbmNlIHRoZSBIYW5kbGVycyBrbm93IHRoZSBleHBlY3RlZCBjbG9zdXJlIHR5cGUsIHZlcmlmeSB0aGF0IFQKLSAgICogbWF0Y2hlcyBpdC4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+IFQqIEdldE9iamVjdCgpIGNvbnN0OwotCi0gIC8qIEZ1bmN0aW9ucyBmb3IgcHVzaGluZyBkYXRhIGludG8gdGhlIHNpbmsuCi0gICAqCi0gICAqIFRoZXNlIHJldHVybiBmYWxzZSBpZiBwcm9jZXNzaW5nIHNob3VsZCBzdG9wIChlaXRoZXIgZHVlIHRvIGVycm9yIG9yIGp1c3QKLSAgICogdG8gc3VzcGVuZCkuCi0gICAqCi0gICAqIFRoZXNlIG1heSBub3QgYmUgY2FsbGVkIGZyb20gd2l0aGluIG9uZSBvZiB0aGUgc2FtZSBzaW5rJ3MgaGFuZGxlcnMgKGluCi0gICAqIG90aGVyIHdvcmRzLCBoYW5kbGVycyBhcmUgbm90IHJlLWVudHJhbnQpLiAqLwotCi0gIC8qIFNob3VsZCBiZSBjYWxsZWQgYXQgdGhlIHN0YXJ0IGFuZCBlbmQgb2YgZXZlcnkgbWVzc2FnZTsgYm90aCB0aGUgdG9wLWxldmVsCi0gICAqIG1lc3NhZ2UgYW5kIHN1Ym1lc3NhZ2VzLiAgVGhpcyBtZWFucyB0aGF0IHN1Ym1lc3NhZ2VzIHNob3VsZCB1c2UgdGhlCi0gICAqIGZvbGxvd2luZyBzZXF1ZW5jZToKLSAgICogICBzaW5rLT5TdGFydFN1Yk1lc3NhZ2Uoc3RhcnRzdWJtc2dfc2VsZWN0b3IpOwotICAgKiAgIHNpbmstPlN0YXJ0TWVzc2FnZSgpOwotICAgKiAgIC8vIC4uLgotICAgKiAgIHNpbmstPkVuZE1lc3NhZ2UoJnN0YXR1cyk7Ci0gICAqICAgc2luay0+RW5kU3ViTWVzc2FnZShlbmRzdWJtc2dfc2VsZWN0b3IpOyAqLwotICBib29sIFN0YXJ0TWVzc2FnZSgpOwotICBib29sIEVuZE1lc3NhZ2UoU3RhdHVzKiBzdGF0dXMpOwotCi0gIC8qIFB1dHRpbmcgb2YgaW5kaXZpZHVhbCB2YWx1ZXMuICBUaGVzZSB3b3JrIGZvciBib3RoIHJlcGVhdGVkIGFuZAotICAgKiBub24tcmVwZWF0ZWQgZmllbGRzLCBidXQgZm9yIHJlcGVhdGVkIGZpZWxkcyB5b3UgbXVzdCB3cmFwIHRoZW0gaW4KLSAgICogY2FsbHMgdG8gU3RhcnRTZXF1ZW5jZSgpL0VuZFNlcXVlbmNlKCkuICovCi0gIGJvb2wgUHV0SW50MzIoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIGludDMyX3QgdmFsKTsKLSAgYm9vbCBQdXRJbnQ2NChIYW5kbGVyczo6U2VsZWN0b3IgcywgaW50NjRfdCB2YWwpOwotICBib29sIFB1dFVJbnQzMihIYW5kbGVyczo6U2VsZWN0b3IgcywgdWludDMyX3QgdmFsKTsKLSAgYm9vbCBQdXRVSW50NjQoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIHVpbnQ2NF90IHZhbCk7Ci0gIGJvb2wgUHV0RmxvYXQoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIGZsb2F0IHZhbCk7Ci0gIGJvb2wgUHV0RG91YmxlKEhhbmRsZXJzOjpTZWxlY3RvciBzLCBkb3VibGUgdmFsKTsKLSAgYm9vbCBQdXRCb29sKEhhbmRsZXJzOjpTZWxlY3RvciBzLCBib29sIHZhbCk7Ci0KLSAgLyogUHV0dGluZyBvZiBzdHJpbmcvYnl0ZXMgdmFsdWVzLiAgRWFjaCBzdHJpbmcgY2FuIGNvbnNpc3Qgb2YgemVybyBvciBtb3JlCi0gICAqIG5vbi1jb250aWd1b3VzIGJ1ZmZlcnMgb2YgZGF0YS4KLSAgICoKLSAgICogRm9yIFN0YXJ0U3RyaW5nKCksIHRoZSBmdW5jdGlvbiB3aWxsIHdyaXRlIGEgc2luayBmb3IgdGhlIHN0cmluZyB0byAic3ViLiIKLSAgICogVGhlIHN1Yi1zaW5rIG11c3QgYmUgdXNlZCBmb3IgYW55L2FsbCBQdXRTdHJpbmdCdWZmZXIoKSBjYWxscy4gKi8KLSAgYm9vbCBTdGFydFN0cmluZyhIYW5kbGVyczo6U2VsZWN0b3Igcywgc2l6ZV90IHNpemVfaGludCwgU2luayogc3ViKTsKLSAgc2l6ZV90IFB1dFN0cmluZ0J1ZmZlcihIYW5kbGVyczo6U2VsZWN0b3IgcywgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEJ1ZmZlckhhbmRsZSAqaGFuZGxlKTsKLSAgYm9vbCBFbmRTdHJpbmcoSGFuZGxlcnM6OlNlbGVjdG9yIHMpOwotCi0gIC8qIEZvciBzdWJtZXNzYWdlIGZpZWxkcy4KLSAgICoKLSAgICogRm9yIFN0YXJ0U3ViTWVzc2FnZSgpLCB0aGUgZnVuY3Rpb24gd2lsbCB3cml0ZSBhIHNpbmsgZm9yIHRoZSBzdHJpbmcgdG8KLSAgICogInN1Yi4iIFRoZSBzdWItc2luayBtdXN0IGJlIHVzZWQgZm9yIGFueS9hbGwgaGFuZGxlcnMgY2FsbGVkIHdpdGhpbiB0aGUKLSAgICogc3VibWVzc2FnZS4gKi8KLSAgYm9vbCBTdGFydFN1Yk1lc3NhZ2UoSGFuZGxlcnM6OlNlbGVjdG9yIHMsIFNpbmsqIHN1Yik7Ci0gIGJvb2wgRW5kU3ViTWVzc2FnZShIYW5kbGVyczo6U2VsZWN0b3Igcyk7Ci0KLSAgLyogRm9yIHJlcGVhdGVkIGZpZWxkcyBvZiBhbnkgdHlwZSwgdGhlIHNlcXVlbmNlIG9mIHZhbHVlcyBtdXN0IGJlIHdyYXBwZWQgaW4KLSAgICogdGhlc2UgY2FsbHMuCi0gICAqCi0gICAqIEZvciBTdGFydFNlcXVlbmNlKCksIHRoZSBmdW5jdGlvbiB3aWxsIHdyaXRlIGEgc2luayBmb3IgdGhlIHN0cmluZyB0bwotICAgKiAic3ViLiIgVGhlIHN1Yi1zaW5rIG11c3QgYmUgdXNlZCBmb3IgYW55L2FsbCBoYW5kbGVycyBjYWxsZWQgd2l0aGluIHRoZQotICAgKiBzZXF1ZW5jZS4gKi8KLSAgYm9vbCBTdGFydFNlcXVlbmNlKEhhbmRsZXJzOjpTZWxlY3RvciBzLCBTaW5rKiBzdWIpOwotICBib29sIEVuZFNlcXVlbmNlKEhhbmRsZXJzOjpTZWxlY3RvciBzKTsKLQotICAvKiBDb3B5IGFuZCBhc3NpZ24gc3BlY2lmaWNhbGx5IGFsbG93ZWQuCi0gICAqIFdlIGRvbid0IGV2ZW4gYm90aGVyIG1ha2luZyB0aGVzZSBtZW1iZXJzIHByaXZhdGUgYmVjYXVzZSBzbyBtYW55Ci0gICAqIGZ1bmN0aW9ucyBuZWVkIHRoZW0gYW5kIHRoaXMgaXMgbWFpbmx5IGp1c3QgYSBkdW1iIGRhdGEgY29udGFpbmVyIGFueXdheS4KLSAgICovCi0jZWxzZQotc3RydWN0IHVwYl9zaW5rIHsKLSNlbmRpZgotICBjb25zdCB1cGJfaGFuZGxlcnMgKmhhbmRsZXJzOwotICB2b2lkICpjbG9zdXJlOwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1jbGFzcyB1cGI6OkJ5dGVzU2luayB7Ci0gcHVibGljOgotICBCeXRlc1NpbmsoKSB7fQotCi0gIC8qIENvbnN0cnVjdHMgYSBuZXcgc2luayBmb3IgdGhlIGdpdmVuIGZyb3plbiBoYW5kbGVycyBhbmQgY2xvc3VyZS4KLSAgICoKLSAgICogVE9ETyhoYWJlcm1hbik6IG9uY2UgdGhlIEhhbmRsZXJzIGtub3cgdGhlIGV4cGVjdGVkIGNsb3N1cmUgdHlwZSwgdmVyaWZ5Ci0gICAqIHRoYXQgVCBtYXRjaGVzIGl0LiAqLwotICB0ZW1wbGF0ZSA8Y2xhc3MgVD4gQnl0ZXNTaW5rKGNvbnN0IEJ5dGVzSGFuZGxlciogaGFuZGxlciwgVCogY2xvc3VyZSk7Ci0KLSAgLyogUmVzZXRzIHRoZSB2YWx1ZSBvZiB0aGUgc2luay4gKi8KLSAgdGVtcGxhdGUgPGNsYXNzIFQ+IHZvaWQgUmVzZXQoY29uc3QgQnl0ZXNIYW5kbGVyKiBoYW5kbGVyLCBUKiBjbG9zdXJlKTsKLQotICBib29sIFN0YXJ0KHNpemVfdCBzaXplX2hpbnQsIHZvaWQgKipzdWJjKTsKLSAgc2l6ZV90IFB1dEJ1ZmZlcih2b2lkICpzdWJjLCBjb25zdCBjaGFyICpidWYsIHNpemVfdCBsZW4sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVySGFuZGxlICpoYW5kbGUpOwotICBib29sIEVuZCgpOwotI2Vsc2UKLXN0cnVjdCB1cGJfYnl0ZXNzaW5rIHsKLSNlbmRpZgotICBjb25zdCB1cGJfYnl0ZXNoYW5kbGVyICpoYW5kbGVyOwotICB2b2lkICpjbG9zdXJlOwotfTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIEEgY2xhc3MgZm9yIHB1c2hpbmcgYSBmbGF0IGJ1ZmZlciBvZiBkYXRhIHRvIGEgQnl0ZXNTaW5rLgotICogWW91IGNhbiBjb25zdHJ1Y3QgYW4gaW5zdGFuY2Ugb2YgdGhpcyB0byBnZXQgYSByZXN1bWFibGUgc291cmNlLAotICogb3IganVzdCBjYWxsIHRoZSBzdGF0aWMgUHV0QnVmZmVyKCkgdG8gZG8gYSBub24tcmVzdW1hYmxlIHB1c2ggYWxsIGluIG9uZQotICogZ28uICovCi1jbGFzcyB1cGI6OkJ1ZmZlclNvdXJjZSB7Ci0gcHVibGljOgotICBCdWZmZXJTb3VyY2UoKTsKLSAgQnVmZmVyU291cmNlKGNvbnN0IGNoYXIqIGJ1Ziwgc2l6ZV90IGxlbiwgQnl0ZXNTaW5rKiBzaW5rKTsKLQotICAvKiBSZXR1cm5zIHRydWUgaWYgdGhlIGVudGlyZSBidWZmZXIgd2FzIHB1c2hlZCBzdWNjZXNzZnVsbHkuICBPdGhlcndpc2UgdGhlCi0gICAqIG5leHQgY2FsbCB0byBQdXROZXh0KCkgd2lsbCByZXN1bWUgd2hlcmUgdGhlIHByZXZpb3VzIG9uZSBsZWZ0IG9mZi4KLSAgICogVE9ETyhoYWJlcm1hbik6IGltcGxlbWVudCB0aGlzLiAqLwotICBib29sIFB1dE5leHQoKTsKLQotICAvKiBBIHN0YXRpYyB2ZXJzaW9uOyB3aXRoIHRoaXMgdmVyc2lvbiBpcyBpdCBub3QgcG9zc2libGUgdG8gcmVzdW1lIGluIHRoZQotICAgKiBjYXNlIG9mIGZhaWx1cmUgb3IgYSBwYXJ0aWFsbHktY29uc3VtZWQgYnVmZmVyLiAqLwotICBzdGF0aWMgYm9vbCBQdXRCdWZmZXIoY29uc3QgY2hhciogYnVmLCBzaXplX3QgbGVuLCBCeXRlc1NpbmsqIHNpbmspOwotCi0gIHRlbXBsYXRlIDxjbGFzcyBUPiBzdGF0aWMgYm9vbCBQdXRCdWZmZXIoY29uc3QgVCYgc3RyLCBCeXRlc1NpbmsqIHNpbmspIHsKLSAgICByZXR1cm4gUHV0QnVmZmVyKHN0ci5jX3N0cigpLCBzdHIuc2l6ZSgpLCBzaW5rKTsKLSAgfQotI2Vsc2UKLXN0cnVjdCB1cGJfYnVmc3JjIHsKLSAgY2hhciBkdW1teTsKLSNlbmRpZgotfTsKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIElubGluZSBkZWZpbml0aW9ucy4gKi8KLQotVVBCX0lOTElORSB2b2lkIHVwYl9ieXRlc3NpbmtfcmVzZXQodXBiX2J5dGVzc2luayAqcywgY29uc3QgdXBiX2J5dGVzaGFuZGxlciAqaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmNsb3N1cmUpIHsKLSAgcy0+aGFuZGxlciA9IGg7Ci0gIHMtPmNsb3N1cmUgPSBjbG9zdXJlOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX2J5dGVzc2lua19zdGFydCh1cGJfYnl0ZXNzaW5rICpzLCBzaXplX3Qgc2l6ZV9oaW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqKnN1YmMpIHsKLSAgdHlwZWRlZiB1cGJfc3RhcnRzdHJfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqc3RhcnQ7Ci0gICpzdWJjID0gcy0+Y2xvc3VyZTsKLSAgaWYgKCFzLT5oYW5kbGVyKSByZXR1cm4gdHJ1ZTsKLSAgc3RhcnQgPSAoZnVuYyAqKXMtPmhhbmRsZXItPnRhYmxlW1VQQl9TVEFSVFNUUl9TRUxFQ1RPUl0uZnVuYzsKLQotICBpZiAoIXN0YXJ0KSByZXR1cm4gdHJ1ZTsKLSAgKnN1YmMgPSBzdGFydChzLT5jbG9zdXJlLCB1cGJfaGFuZGxlcmF0dHJfaGFuZGxlcmRhdGEoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzLT5oYW5kbGVyLT50YWJsZVtVUEJfU1RBUlRTVFJfU0VMRUNUT1JdLmF0dHIpLAotICAgICAgICAgICAgICAgIHNpemVfaGludCk7Ci0gIHJldHVybiAqc3ViYyAhPSBOVUxMOwotfQotCi1VUEJfSU5MSU5FIHNpemVfdCB1cGJfYnl0ZXNzaW5rX3B1dGJ1Zih1cGJfYnl0ZXNzaW5rICpzLCB2b2lkICpzdWJjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3Qgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYl9idWZoYW5kbGUqIGhhbmRsZSkgewotICB0eXBlZGVmIHVwYl9zdHJpbmdfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqcHV0YnVmOwotICBpZiAoIXMtPmhhbmRsZXIpIHJldHVybiB0cnVlOwotICBwdXRidWYgPSAoZnVuYyAqKXMtPmhhbmRsZXItPnRhYmxlW1VQQl9TVFJJTkdfU0VMRUNUT1JdLmZ1bmM7Ci0KLSAgaWYgKCFwdXRidWYpIHJldHVybiB0cnVlOwotICByZXR1cm4gcHV0YnVmKHN1YmMsIHVwYl9oYW5kbGVyYXR0cl9oYW5kbGVyZGF0YSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJnMtPmhhbmRsZXItPnRhYmxlW1VQQl9TVFJJTkdfU0VMRUNUT1JdLmF0dHIpLAotICAgICAgICAgICAgICAgIGJ1Ziwgc2l6ZSwgaGFuZGxlKTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9ieXRlc3NpbmtfZW5kKHVwYl9ieXRlc3NpbmsgKnMpIHsKLSAgdHlwZWRlZiB1cGJfZW5kZmllbGRfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqZW5kOwotICBpZiAoIXMtPmhhbmRsZXIpIHJldHVybiB0cnVlOwotICBlbmQgPSAoZnVuYyAqKXMtPmhhbmRsZXItPnRhYmxlW1VQQl9FTkRTVFJfU0VMRUNUT1JdLmZ1bmM7Ci0KLSAgaWYgKCFlbmQpIHJldHVybiB0cnVlOwotICByZXR1cm4gZW5kKHMtPmNsb3N1cmUsCi0gICAgICAgICAgICAgdXBiX2hhbmRsZXJhdHRyX2hhbmRsZXJkYXRhKAotICAgICAgICAgICAgICAgICAmcy0+aGFuZGxlci0+dGFibGVbVVBCX0VORFNUUl9TRUxFQ1RPUl0uYXR0cikpOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX2J1ZnNyY19wdXRidWYoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ieXRlc3NpbmsgKnNpbmspIHsKLSAgdm9pZCAqc3ViYzsKLSAgYm9vbCByZXQ7Ci0gIHVwYl9idWZoYW5kbGUgaGFuZGxlOwotICB1cGJfYnVmaGFuZGxlX2luaXQoJmhhbmRsZSk7Ci0gIHVwYl9idWZoYW5kbGVfc2V0YnVmKCZoYW5kbGUsIGJ1ZiwgMCk7Ci0gIHJldCA9IHVwYl9ieXRlc3Npbmtfc3RhcnQoc2luaywgbGVuLCAmc3ViYyk7Ci0gIGlmIChyZXQgJiYgbGVuICE9IDApIHsKLSAgICByZXQgPSAodXBiX2J5dGVzc2lua19wdXRidWYoc2luaywgc3ViYywgYnVmLCBsZW4sICZoYW5kbGUpID49IGxlbik7Ci0gIH0KLSAgaWYgKHJldCkgewotICAgIHJldCA9IHVwYl9ieXRlc3NpbmtfZW5kKHNpbmspOwotICB9Ci0gIHVwYl9idWZoYW5kbGVfdW5pbml0KCZoYW5kbGUpOwotICByZXR1cm4gcmV0OwotfQotCi0jZGVmaW5lIFBVVFZBTCh0eXBlLCBjdHlwZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVUEJfSU5MSU5FIGJvb2wgdXBiX3NpbmtfcHV0IyN0eXBlKHVwYl9zaW5rICpzLCB1cGJfc2VsZWN0b3JfdCBzZWwsICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjdHlwZSB2YWwpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdHlwZWRlZiB1cGJfIyN0eXBlIyNfaGFuZGxlcmZ1bmMgZnVuY3R5cGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZ1bmN0eXBlICpmdW5jOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCB2b2lkICpoZDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFzLT5oYW5kbGVycykgcmV0dXJuIHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGZ1bmMgPSAoZnVuY3R5cGUgKil1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcihzLT5oYW5kbGVycywgc2VsKTsgICAgICAgICAgICAgIFwKLSAgICBpZiAoIWZ1bmMpIHJldHVybiB0cnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaGQgPSB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEocy0+aGFuZGxlcnMsIHNlbCk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBmdW5jKHMtPmNsb3N1cmUsIGhkLCB2YWwpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1QVVRWQUwoaW50MzIsICBpbnQzMl90KQotUFVUVkFMKGludDY0LCAgaW50NjRfdCkKLVBVVFZBTCh1aW50MzIsIHVpbnQzMl90KQotUFVUVkFMKHVpbnQ2NCwgdWludDY0X3QpCi1QVVRWQUwoZmxvYXQsICBmbG9hdCkKLVBVVFZBTChkb3VibGUsIGRvdWJsZSkKLVBVVFZBTChib29sLCAgIGJvb2wpCi0jdW5kZWYgUFVUVkFMCi0KLVVQQl9JTkxJTkUgdm9pZCB1cGJfc2lua19yZXNldCh1cGJfc2luayAqcywgY29uc3QgdXBiX2hhbmRsZXJzICpoLCB2b2lkICpjKSB7Ci0gIHMtPmhhbmRsZXJzID0gaDsKLSAgcy0+Y2xvc3VyZSA9IGM7Ci19Ci0KLVVQQl9JTkxJTkUgc2l6ZV90IHVwYl9zaW5rX3B1dHN0cmluZyh1cGJfc2luayAqcywgdXBiX3NlbGVjdG9yX3Qgc2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlKSB7Ci0gIHR5cGVkZWYgdXBiX3N0cmluZ19oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICpoYW5kbGVyOwotICBjb25zdCB2b2lkICpoZDsKLSAgaWYgKCFzLT5oYW5kbGVycykgcmV0dXJuIG47Ci0gIGhhbmRsZXIgPSAoZnVuYyAqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBzZWwpOwotCi0gIGlmICghaGFuZGxlcikgcmV0dXJuIG47Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBzZWwpOwotICByZXR1cm4gaGFuZGxlcihzLT5jbG9zdXJlLCBoZCwgYnVmLCBuLCBoYW5kbGUpOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX3Npbmtfc3RhcnRtc2codXBiX3NpbmsgKnMpIHsKLSAgdHlwZWRlZiB1cGJfc3RhcnRtc2dfaGFuZGxlcmZ1bmMgZnVuYzsKLSAgZnVuYyAqc3RhcnRtc2c7Ci0gIGNvbnN0IHZvaWQgKmhkOwotICBpZiAoIXMtPmhhbmRsZXJzKSByZXR1cm4gdHJ1ZTsKLSAgc3RhcnRtc2cgPSAoZnVuYyopdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIocy0+aGFuZGxlcnMsIFVQQl9TVEFSVE1TR19TRUxFQ1RPUik7Ci0KLSAgaWYgKCFzdGFydG1zZykgcmV0dXJuIHRydWU7Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBVUEJfU1RBUlRNU0dfU0VMRUNUT1IpOwotICByZXR1cm4gc3RhcnRtc2cocy0+Y2xvc3VyZSwgaGQpOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX3NpbmtfZW5kbXNnKHVwYl9zaW5rICpzLCB1cGJfc3RhdHVzICpzdGF0dXMpIHsKLSAgdHlwZWRlZiB1cGJfZW5kbXNnX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKmVuZG1zZzsKLSAgY29uc3Qgdm9pZCAqaGQ7Ci0gIGlmICghcy0+aGFuZGxlcnMpIHJldHVybiB0cnVlOwotICBlbmRtc2cgPSAoZnVuYyAqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBVUEJfRU5ETVNHX1NFTEVDVE9SKTsKLQotICBpZiAoIWVuZG1zZykgcmV0dXJuIHRydWU7Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBVUEJfRU5ETVNHX1NFTEVDVE9SKTsKLSAgcmV0dXJuIGVuZG1zZyhzLT5jbG9zdXJlLCBoZCwgc3RhdHVzKTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9zaW5rX3N0YXJ0c2VxKHVwYl9zaW5rICpzLCB1cGJfc2VsZWN0b3JfdCBzZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NpbmsgKnN1YikgewotICB0eXBlZGVmIHVwYl9zdGFydGZpZWxkX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKnN0YXJ0c2VxOwotICBjb25zdCB2b2lkICpoZDsKLSAgc3ViLT5jbG9zdXJlID0gcy0+Y2xvc3VyZTsKLSAgc3ViLT5oYW5kbGVycyA9IHMtPmhhbmRsZXJzOwotICBpZiAoIXMtPmhhbmRsZXJzKSByZXR1cm4gdHJ1ZTsKLSAgc3RhcnRzZXEgPSAoZnVuYyopdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIocy0+aGFuZGxlcnMsIHNlbCk7Ci0KLSAgaWYgKCFzdGFydHNlcSkgcmV0dXJuIHRydWU7Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBzZWwpOwotICBzdWItPmNsb3N1cmUgPSBzdGFydHNlcShzLT5jbG9zdXJlLCBoZCk7Ci0gIHJldHVybiBzdWItPmNsb3N1cmUgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc2lua19lbmRzZXEodXBiX3NpbmsgKnMsIHVwYl9zZWxlY3Rvcl90IHNlbCkgewotICB0eXBlZGVmIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICplbmRzZXE7Ci0gIGNvbnN0IHZvaWQgKmhkOwotICBpZiAoIXMtPmhhbmRsZXJzKSByZXR1cm4gdHJ1ZTsKLSAgZW5kc2VxID0gKGZ1bmMqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBzZWwpOwotCi0gIGlmICghZW5kc2VxKSByZXR1cm4gdHJ1ZTsKLSAgaGQgPSB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEocy0+aGFuZGxlcnMsIHNlbCk7Ci0gIHJldHVybiBlbmRzZXEocy0+Y2xvc3VyZSwgaGQpOwotfQotCi1VUEJfSU5MSU5FIGJvb2wgdXBiX3Npbmtfc3RhcnRzdHIodXBiX3NpbmsgKnMsIHVwYl9zZWxlY3Rvcl90IHNlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZV9oaW50LCB1cGJfc2luayAqc3ViKSB7Ci0gIHR5cGVkZWYgdXBiX3N0YXJ0c3RyX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKnN0YXJ0c3RyOwotICBjb25zdCB2b2lkICpoZDsKLSAgc3ViLT5jbG9zdXJlID0gcy0+Y2xvc3VyZTsKLSAgc3ViLT5oYW5kbGVycyA9IHMtPmhhbmRsZXJzOwotICBpZiAoIXMtPmhhbmRsZXJzKSByZXR1cm4gdHJ1ZTsKLSAgc3RhcnRzdHIgPSAoZnVuYyopdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIocy0+aGFuZGxlcnMsIHNlbCk7Ci0KLSAgaWYgKCFzdGFydHN0cikgcmV0dXJuIHRydWU7Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBzZWwpOwotICBzdWItPmNsb3N1cmUgPSBzdGFydHN0cihzLT5jbG9zdXJlLCBoZCwgc2l6ZV9oaW50KTsKLSAgcmV0dXJuIHN1Yi0+Y2xvc3VyZSA/IHRydWUgOiBmYWxzZTsKLX0KLQotVVBCX0lOTElORSBib29sIHVwYl9zaW5rX2VuZHN0cih1cGJfc2luayAqcywgdXBiX3NlbGVjdG9yX3Qgc2VsKSB7Ci0gIHR5cGVkZWYgdXBiX2VuZGZpZWxkX2hhbmRsZXJmdW5jIGZ1bmM7Ci0gIGZ1bmMgKmVuZHN0cjsKLSAgY29uc3Qgdm9pZCAqaGQ7Ci0gIGlmICghcy0+aGFuZGxlcnMpIHJldHVybiB0cnVlOwotICBlbmRzdHIgPSAoZnVuYyopdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIocy0+aGFuZGxlcnMsIHNlbCk7Ci0KLSAgaWYgKCFlbmRzdHIpIHJldHVybiB0cnVlOwotICBoZCA9IHVwYl9oYW5kbGVyc19nZXRoYW5kbGVyZGF0YShzLT5oYW5kbGVycywgc2VsKTsKLSAgcmV0dXJuIGVuZHN0cihzLT5jbG9zdXJlLCBoZCk7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc2lua19zdGFydHN1Ym1zZyh1cGJfc2luayAqcywgdXBiX3NlbGVjdG9yX3Qgc2VsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zaW5rICpzdWIpIHsKLSAgdHlwZWRlZiB1cGJfc3RhcnRmaWVsZF9oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICpzdGFydHN1Ym1zZzsKLSAgY29uc3Qgdm9pZCAqaGQ7Ci0gIHN1Yi0+Y2xvc3VyZSA9IHMtPmNsb3N1cmU7Ci0gIGlmICghcy0+aGFuZGxlcnMpIHsKLSAgICBzdWItPmhhbmRsZXJzID0gTlVMTDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICBzdWItPmhhbmRsZXJzID0gdXBiX2hhbmRsZXJzX2dldHN1YmhhbmRsZXJzX3NlbChzLT5oYW5kbGVycywgc2VsKTsKLSAgc3RhcnRzdWJtc2cgPSAoZnVuYyopdXBiX2hhbmRsZXJzX2dldGhhbmRsZXIocy0+aGFuZGxlcnMsIHNlbCk7Ci0KLSAgaWYgKCFzdGFydHN1Ym1zZykgcmV0dXJuIHRydWU7Ci0gIGhkID0gdXBiX2hhbmRsZXJzX2dldGhhbmRsZXJkYXRhKHMtPmhhbmRsZXJzLCBzZWwpOwotICBzdWItPmNsb3N1cmUgPSBzdGFydHN1Ym1zZyhzLT5jbG9zdXJlLCBoZCk7Ci0gIHJldHVybiBzdWItPmNsb3N1cmUgPyB0cnVlIDogZmFsc2U7Ci19Ci0KLVVQQl9JTkxJTkUgYm9vbCB1cGJfc2lua19lbmRzdWJtc2codXBiX3NpbmsgKnMsIHVwYl9zZWxlY3Rvcl90IHNlbCkgewotICB0eXBlZGVmIHVwYl9lbmRmaWVsZF9oYW5kbGVyZnVuYyBmdW5jOwotICBmdW5jICplbmRzdWJtc2c7Ci0gIGNvbnN0IHZvaWQgKmhkOwotICBpZiAoIXMtPmhhbmRsZXJzKSByZXR1cm4gdHJ1ZTsKLSAgZW5kc3VibXNnID0gKGZ1bmMqKXVwYl9oYW5kbGVyc19nZXRoYW5kbGVyKHMtPmhhbmRsZXJzLCBzZWwpOwotCi0gIGlmICghZW5kc3VibXNnKSByZXR1cm4gcy0+Y2xvc3VyZTsKLSAgaGQgPSB1cGJfaGFuZGxlcnNfZ2V0aGFuZGxlcmRhdGEocy0+aGFuZGxlcnMsIHNlbCk7Ci0gIHJldHVybiBlbmRzdWJtc2cocy0+Y2xvc3VyZSwgaGQpOwotfQotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1uYW1lc3BhY2UgdXBiIHsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+IFNpbms6OlNpbmsoY29uc3QgSGFuZGxlcnMqIGhhbmRsZXJzLCBUKiBjbG9zdXJlKSB7Ci0gIHVwYl9zaW5rX3Jlc2V0KHRoaXMsIGhhbmRsZXJzLCBjbG9zdXJlKTsKLX0KLXRlbXBsYXRlIDxjbGFzcyBUPgotaW5saW5lIHZvaWQgU2luazo6UmVzZXQoY29uc3QgSGFuZGxlcnMqIGhhbmRsZXJzLCBUKiBjbG9zdXJlKSB7Ci0gIHVwYl9zaW5rX3Jlc2V0KHRoaXMsIGhhbmRsZXJzLCBjbG9zdXJlKTsKLX0KLWlubGluZSBib29sIFNpbms6OlN0YXJ0TWVzc2FnZSgpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3N0YXJ0bXNnKHRoaXMpOwotfQotaW5saW5lIGJvb2wgU2luazo6RW5kTWVzc2FnZShTdGF0dXMqIHN0YXR1cykgewotICByZXR1cm4gdXBiX3NpbmtfZW5kbXNnKHRoaXMsIHN0YXR1cyk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpQdXRJbnQzMihIYW5kbGVyczo6U2VsZWN0b3Igc2VsLCBpbnQzMl90IHZhbCkgewotICByZXR1cm4gdXBiX3NpbmtfcHV0aW50MzIodGhpcywgc2VsLCB2YWwpOwotfQotaW5saW5lIGJvb2wgU2luazo6UHV0SW50NjQoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgaW50NjRfdCB2YWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3B1dGludDY0KHRoaXMsIHNlbCwgdmFsKTsKLX0KLWlubGluZSBib29sIFNpbms6OlB1dFVJbnQzMihIYW5kbGVyczo6U2VsZWN0b3Igc2VsLCB1aW50MzJfdCB2YWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3B1dHVpbnQzMih0aGlzLCBzZWwsIHZhbCk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpQdXRVSW50NjQoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgdWludDY0X3QgdmFsKSB7Ci0gIHJldHVybiB1cGJfc2lua19wdXR1aW50NjQodGhpcywgc2VsLCB2YWwpOwotfQotaW5saW5lIGJvb2wgU2luazo6UHV0RmxvYXQoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgZmxvYXQgdmFsKSB7Ci0gIHJldHVybiB1cGJfc2lua19wdXRmbG9hdCh0aGlzLCBzZWwsIHZhbCk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpQdXREb3VibGUoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgZG91YmxlIHZhbCkgewotICByZXR1cm4gdXBiX3NpbmtfcHV0ZG91YmxlKHRoaXMsIHNlbCwgdmFsKTsKLX0KLWlubGluZSBib29sIFNpbms6OlB1dEJvb2woSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgYm9vbCB2YWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3B1dGJvb2wodGhpcywgc2VsLCB2YWwpOwotfQotaW5saW5lIGJvb2wgU2luazo6U3RhcnRTdHJpbmcoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgc2l6ZV90IHNpemVfaGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmsgKnN1YikgewotICByZXR1cm4gdXBiX3Npbmtfc3RhcnRzdHIodGhpcywgc2VsLCBzaXplX2hpbnQsIHN1Yik7Ci19Ci1pbmxpbmUgc2l6ZV90IFNpbms6OlB1dFN0cmluZ0J1ZmZlcihIYW5kbGVyczo6U2VsZWN0b3Igc2VsLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgbGVuLCBjb25zdCBCdWZmZXJIYW5kbGUqIGhhbmRsZSkgewotICByZXR1cm4gdXBiX3NpbmtfcHV0c3RyaW5nKHRoaXMsIHNlbCwgYnVmLCBsZW4sIGhhbmRsZSk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpFbmRTdHJpbmcoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCkgewotICByZXR1cm4gdXBiX3NpbmtfZW5kc3RyKHRoaXMsIHNlbCk7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpTdGFydFN1Yk1lc3NhZ2UoSGFuZGxlcnM6OlNlbGVjdG9yIHNlbCwgU2luayogc3ViKSB7Ci0gIHJldHVybiB1cGJfc2lua19zdGFydHN1Ym1zZyh0aGlzLCBzZWwsIHN1Yik7Ci19Ci1pbmxpbmUgYm9vbCBTaW5rOjpFbmRTdWJNZXNzYWdlKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX2VuZHN1Ym1zZyh0aGlzLCBzZWwpOwotfQotaW5saW5lIGJvb2wgU2luazo6U3RhcnRTZXF1ZW5jZShIYW5kbGVyczo6U2VsZWN0b3Igc2VsLCBTaW5rKiBzdWIpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX3N0YXJ0c2VxKHRoaXMsIHNlbCwgc3ViKTsKLX0KLWlubGluZSBib29sIFNpbms6OkVuZFNlcXVlbmNlKEhhbmRsZXJzOjpTZWxlY3RvciBzZWwpIHsKLSAgcmV0dXJuIHVwYl9zaW5rX2VuZHNlcSh0aGlzLCBzZWwpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLUJ5dGVzU2luazo6Qnl0ZXNTaW5rKGNvbnN0IEJ5dGVzSGFuZGxlciogaGFuZGxlciwgVCogY2xvc3VyZSkgewotICBSZXNldChoYW5kbGVyLCBjbG9zdXJlKTsKLX0KLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIEJ5dGVzU2luazo6UmVzZXQoY29uc3QgQnl0ZXNIYW5kbGVyICpoYW5kbGVyLCBUICpjbG9zdXJlKSB7Ci0gIHVwYl9ieXRlc3NpbmtfcmVzZXQodGhpcywgaGFuZGxlciwgY2xvc3VyZSk7Ci19Ci1pbmxpbmUgYm9vbCBCeXRlc1Npbms6OlN0YXJ0KHNpemVfdCBzaXplX2hpbnQsIHZvaWQgKipzdWJjKSB7Ci0gIHJldHVybiB1cGJfYnl0ZXNzaW5rX3N0YXJ0KHRoaXMsIHNpemVfaGludCwgc3ViYyk7Ci19Ci1pbmxpbmUgc2l6ZV90IEJ5dGVzU2luazo6UHV0QnVmZmVyKHZvaWQgKnN1YmMsIGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IGxlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQnVmZmVySGFuZGxlICpoYW5kbGUpIHsKLSAgcmV0dXJuIHVwYl9ieXRlc3NpbmtfcHV0YnVmKHRoaXMsIHN1YmMsIGJ1ZiwgbGVuLCBoYW5kbGUpOwotfQotaW5saW5lIGJvb2wgQnl0ZXNTaW5rOjpFbmQoKSB7Ci0gIHJldHVybiB1cGJfYnl0ZXNzaW5rX2VuZCh0aGlzKTsKLX0KLQotaW5saW5lIGJvb2wgQnVmZmVyU291cmNlOjpQdXRCdWZmZXIoY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZXNTaW5rICpzaW5rKSB7Ci0gIHJldHVybiB1cGJfYnVmc3JjX3B1dGJ1ZihidWYsIGxlbiwgc2luayk7Ci19Ci0KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi0jZW5kaWYKLS8qCi0qKiBGb3IgaGFuZGxlcnMgdGhhdCBkbyB2ZXJ5IHRpbnksIHZlcnkgc2ltcGxlIG9wZXJhdGlvbnMsIHRoZSBmdW5jdGlvbiBjYWxsCi0qKiBvdmVyaGVhZCBvZiBjYWxsaW5nIGEgaGFuZGxlciBjYW4gYmUgc2lnbmlmaWNhbnQuICBUaGlzIGZpbGUgYWxsb3dzIHRoZQotKiogdXNlciB0byBkZWZpbmUgaGFuZGxlcnMgdGhhdCBkbyBzb21ldGhpbmcgdmVyeSBzaW1wbGUgbGlrZSBzdG9yZSB0aGUgdmFsdWUKLSoqIHRvIG1lbW9yeSBhbmQvb3Igc2V0IGEgaGFzYml0LiAgSklUIGNvbXBpbGVycyBjYW4gdGhlbiBzcGVjaWFsLWNhc2UgdGhlc2UKLSoqIGhhbmRsZXJzIGFuZCBlbWl0IHNwZWNpYWxpemVkIGNvZGUgZm9yIHRoZW0gaW5zdGVhZCBvZiBhY3R1YWxseSBjYWxsaW5nIHRoZQotKiogaGFuZGxlci4KLSoqCi0qKiBUaGUgZnVuY3Rpb25hbGl0eSBpcyB2ZXJ5IHNpbXBsZS9saW1pdGVkIHJpZ2h0IG5vdyBidXQgbWF5IGV4cGFuZCB0byBiZSBhYmxlCi0qKiB0byBjYWxsIGFub3RoZXIgZnVuY3Rpb24uCi0qLwotCi0jaWZuZGVmIFVQQl9TSElNX0gKLSNkZWZpbmUgVVBCX1NISU1fSAotCi0KLXR5cGVkZWYgc3RydWN0IHsKLSAgc2l6ZV90IG9mZnNldDsKLSAgaW50MzJfdCBoYXNiaXQ7Ci19IHVwYl9zaGltX2RhdGE7Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1uYW1lc3BhY2UgdXBiIHsKLQotc3RydWN0IFNoaW0gewotICB0eXBlZGVmIHVwYl9zaGltX2RhdGEgRGF0YTsKLQotICAvKiBTZXRzIGEgaGFuZGxlciBmb3IgdGhlIGdpdmVuIGZpZWxkIHRoYXQgd3JpdGVzIHRoZSB2YWx1ZSB0byB0aGUgZ2l2ZW4KLSAgICogb2Zmc2V0IGFuZCwgaWYgaGFzYml0ID49IDAsIHNldHMgYSBiaXQgYXQgdGhlIGdpdmVuIGJpdCBvZmZzZXQuICBSZXR1cm5zCi0gICAqIHRydWUgaWYgdGhlIGhhbmRsZXIgd2FzIHNldCBzdWNjZXNzZnVsbHkuICovCi0gIHN0YXRpYyBib29sIFNldChIYW5kbGVycyAqaCwgY29uc3QgRmllbGREZWYgKmYsIHNpemVfdCBvZnMsIGludDMyX3QgaGFzYml0KTsKLQotICAvKiBJZiB0aGlzIGhhbmRsZXIgaXMgYSBzaGltLCByZXR1cm5zIHRoZSBjb3JyZXNwb25kaW5nIHVwYjo6U2hpbTo6RGF0YSBhbmQKLSAgICogc3RvcmVzIHRoZSB0eXBlIGluICJ0eXBlIi4gIE90aGVyd2lzZSByZXR1cm5zIE5VTEwuICovCi0gIHN0YXRpYyBjb25zdCBEYXRhKiBHZXREYXRhKGNvbnN0IEhhbmRsZXJzKiBoLCBIYW5kbGVyczo6U2VsZWN0b3IgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZWY6OlR5cGUqIHR5cGUpOwotfTsKLQotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotCi0jZW5kaWYKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIEMgQVBJLiAqLwotYm9vbCB1cGJfc2hpbV9zZXQodXBiX2hhbmRsZXJzICpoLCBjb25zdCB1cGJfZmllbGRkZWYgKmYsIHNpemVfdCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICBpbnQzMl90IGhhc2JpdCk7Ci1jb25zdCB1cGJfc2hpbV9kYXRhICp1cGJfc2hpbV9nZXRkYXRhKGNvbnN0IHVwYl9oYW5kbGVycyAqaCwgdXBiX3NlbGVjdG9yX3QgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2ZpZWxkdHlwZV90ICp0eXBlKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLS8qIEMrKyBXcmFwcGVycy4gKi8KLW5hbWVzcGFjZSB1cGIgewotaW5saW5lIGJvb2wgU2hpbTo6U2V0KEhhbmRsZXJzKiBoLCBjb25zdCBGaWVsZERlZiogZiwgc2l6ZV90IG9mcywKLSAgICAgICAgICAgICAgICAgICAgICBpbnQzMl90IGhhc2JpdCkgewotICByZXR1cm4gdXBiX3NoaW1fc2V0KGgsIGYsIG9mcywgaGFzYml0KTsKLX0KLWlubGluZSBjb25zdCBTaGltOjpEYXRhKiBTaGltOjpHZXREYXRhKGNvbnN0IEhhbmRsZXJzKiBoLCBIYW5kbGVyczo6U2VsZWN0b3IgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVmOjpUeXBlKiB0eXBlKSB7Ci0gIHJldHVybiB1cGJfc2hpbV9nZXRkYXRhKGgsIHMsIHR5cGUpOwotfQotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2VuZGlmCi0KLSNlbmRpZiAgLyogVVBCX1NISU1fSCAqLwotLyoKLSoqIHVwYjo6U3ltYm9sVGFibGUgKHVwYl9zeW10YWIpCi0qKgotKiogQSBzeW10YWIgKHN5bWJvbCB0YWJsZSkgc3RvcmVzIGEgbmFtZS0+ZGVmIG1hcCBvZiB1cGJfZGVmcy4gIENsaWVudHMgY291bGQKLSoqIGFsd2F5cyBjcmVhdGUgc3VjaCB0YWJsZXMgdGhlbXNlbHZlcywgYnV0IHVwYl9zeW10YWIgaGFzIGxvZ2ljIGZvciByZXNvbHZpbmcKLSoqIHN5bWJvbGljIHJlZmVyZW5jZXMsIGFuZCBpbiBwYXJ0aWN1bGFyLCBmb3Iga2VlcGluZyBhIHdob2xlIHNldCBvZiBjb25zaXN0ZW50Ci0qKiBkZWZzIHdoZW4gcmVwbGFjaW5nIHNvbWUgc3Vic2V0IG9mIHRob3NlIGRlZnMuICBUaGlzIGxvZ2ljIGlzIG5vbnRyaXZpYWwuCi0qKgotKiogVGhpcyBpcyBhIG1peGVkIEMvQysrIGludGVyZmFjZSB0aGF0IG9mZmVycyBhIGZ1bGwgQVBJIHRvIGJvdGggbGFuZ3VhZ2VzLgotKiogU2VlIHRoZSB0b3AtbGV2ZWwgUkVBRE1FIGZvciBtb3JlIGluZm9ybWF0aW9uLgotKi8KLQotI2lmbmRlZiBVUEJfU1lNVEFCX0hfCi0jZGVmaW5lIFVQQl9TWU1UQUJfSF8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDx2ZWN0b3I+Ci1uYW1lc3BhY2UgdXBiIHsgY2xhc3MgU3ltYm9sVGFibGU7IH0KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUodXBiOjpTeW1ib2xUYWJsZSwgdXBiOjpSZWZDb3VudGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zeW10YWIsIHVwYl9yZWZjb3VudGVkKQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gVVBCX1BSSVZBVEVfRk9SX0NQUAotICB1cGJfc3RydGFibGVfaXRlciBpdGVyOwotICB1cGJfZGVmdHlwZV90IHR5cGU7Ci19IHVwYl9zeW10YWJfaXRlcjsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIE5vbi1jb25zdCBtZXRob2RzIGluIHVwYjo6U3ltYm9sVGFibGUgYXJlIE5PVCB0aHJlYWQtc2FmZS4gKi8KLWNsYXNzIHVwYjo6U3ltYm9sVGFibGUgewotIHB1YmxpYzoKLSAgLyogUmV0dXJucyBhIG5ldyBzeW1ib2wgdGFibGUgd2l0aCBhIHNpbmdsZSByZWYgb3duZWQgYnkgIm93bmVyLiIKLSAgICogUmV0dXJucyBOVUxMIGlmIG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZC4gKi8KLSAgc3RhdGljIHJlZmZlZF9wdHI8U3ltYm9sVGFibGU+IE5ldygpOwotCi0gIC8qIEluY2x1ZGUgUmVmQ291bnRlZCBiYXNlIG1ldGhvZHMuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBGb3IgYWxsIGxvb2t1cCBmdW5jdGlvbnMsIHRoZSByZXR1cm5lZCBwb2ludGVyIGlzIG5vdCBvd25lZCBieSB0aGUKLSAgICogY2FsbGVyOyBpdCBtYXkgYmUgaW52YWxpZGF0ZWQgYnkgYW55IG5vbi1jb25zdCBjYWxsIG9yIHVucmVmIG9mIHRoZQotICAgKiBTeW1ib2xUYWJsZSEgIFRvIHByb3RlY3QgYWdhaW5zdCB0aGlzLCB0YWtlIGEgcmVmIGlmIGRlc2lyZWQuICovCi0KLSAgLyogRnJlZXplcyB0aGUgc3ltYm9sIHRhYmxlOiBwcmV2ZW50cyBmdXJ0aGVyIG1vZGlmaWNhdGlvbiBvZiBpdC4KLSAgICogQWZ0ZXIgdGhlIEZyZWV6ZSgpIG9wZXJhdGlvbiBpcyBzdWNjZXNzZnVsLCB0aGUgU3ltYm9sVGFibGUgbXVzdCBvbmx5IGJlCi0gICAqIGFjY2Vzc2VkIHZpYSBhIGNvbnN0IHBvaW50ZXIuCi0gICAqCi0gICAqIFVubGlrZSB3aXRoIHVwYjo6TWVzc2FnZURlZi91cGI6OkVudW1EZWYvZXRjLCBmcmVlemluZyBhIFN5bWJvbFRhYmxlIGlzIG5vdAotICAgKiBhIG5lY2Vzc2FyeSBzdGVwIGluIHVzaW5nIGEgU3ltYm9sVGFibGUuICBJZiB5b3UgaGF2ZSBubyBuZWVkIGZvciBpdCB0byBiZQotICAgKiBpbW11dGFibGUsIHRoZXJlIGlzIG5vIG5lZWQgdG8gZnJlZXplIGl0IGV2ZXIuICBIb3dldmVyIHNvbWV0aW1lcyBpdCBpcwotICAgKiB1c2VmdWwsIGFuZCBTeW1ib2xUYWJsZXMgdGhhdCBhcmUgc3RhdGljYWxseSBjb21waWxlZCBpbnRvIHRoZSBiaW5hcnkgYXJlCi0gICAqIGFsd2F5cyBmcm96ZW4gYnkgbmF0dXJlLiAqLwotICB2b2lkIEZyZWV6ZSgpOwotCi0gIC8qIFJlc29sdmVzIHRoZSBnaXZlbiBzeW1ib2wgdXNpbmcgdGhlIHJ1bGVzIGRlc2NyaWJlZCBpbiBkZXNjcmlwdG9yLnByb3RvLAotICAgKiBuYW1lbHk6Ci0gICAqCi0gICAqICAgIElmIHRoZSBuYW1lIHN0YXJ0cyB3aXRoIGEgJy4nLCBpdCBpcyBmdWxseS1xdWFsaWZpZWQuICBPdGhlcndpc2UsCi0gICAqICAgIEMrKy1saWtlIHNjb3BpbmcgcnVsZXMgYXJlIHVzZWQgdG8gZmluZCB0aGUgdHlwZSAoaS5lLiBmaXJzdCB0aGUgbmVzdGVkCi0gICAqICAgIHR5cGVzIHdpdGhpbiB0aGlzIG1lc3NhZ2UgYXJlIHNlYXJjaGVkLCB0aGVuIHdpdGhpbiB0aGUgcGFyZW50LCBvbiB1cAotICAgKiAgICB0byB0aGUgcm9vdCBuYW1lc3BhY2UpLgotICAgKgotICAgKiBJZiBub3QgZm91bmQsIHJldHVybnMgTlVMTC4gKi8KLSAgY29uc3QgRGVmKiBSZXNvbHZlKGNvbnN0IGNoYXIqIGJhc2UsIGNvbnN0IGNoYXIqIHN5bSkgY29uc3Q7Ci0KLSAgLyogRmluZHMgYW4gZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZSB3aXRoIHRoaXMgZXhhY3QgbmFtZS4gIElmIG5vdCBmb3VuZCwKLSAgICogcmV0dXJucyBOVUxMLiAqLwotICBjb25zdCBEZWYqIExvb2t1cChjb25zdCBjaGFyICpzeW0pIGNvbnN0OwotICBjb25zdCBNZXNzYWdlRGVmKiBMb29rdXBNZXNzYWdlKGNvbnN0IGNoYXIgKnN5bSkgY29uc3Q7Ci0gIGNvbnN0IEVudW1EZWYqIExvb2t1cEVudW0oY29uc3QgY2hhciAqc3ltKSBjb25zdDsKLQotICAvKiBUT0RPOiBpbnRyb2R1Y2UgYSBDKysgaXRlcmF0b3IsIGJ1dCBtYWtlIGl0IG5pY2UgYW5kIHRlbXBsYXRlZCBzbyB0aGF0IGlmCi0gICAqIHlvdSBhc2sgZm9yIGFuIGl0ZXJhdG9yIG9mIE1lc3NhZ2VEZWYgdGhlIGl0ZXJhdGVkIGVsZW1lbnRzIGFyZSBzdHJvbmdseQotICAgKiB0eXBlZCBhcyBNZXNzYWdlRGVmKi4gKi8KLQotICAvKiBBZGRzIHRoZSBnaXZlbiBtdXRhYmxlIGRlZnMgdG8gdGhlIHN5bXRhYiwgcmVzb2x2aW5nIGFsbCBzeW1ib2xzCi0gICAqIChpbmNsdWRpbmcgZW51bSBkZWZhdWx0IHZhbHVlcykgYW5kIGZpbmFsaXppbmcgdGhlIGRlZnMuICBPbmx5IG9uZSBkZWYgcGVyCi0gICAqIG5hbWUgbWF5IGJlIGluIHRoZSBsaXN0LCBidXQgZGVmcyBjYW4gcmVwbGFjZSBleGlzdGluZyBkZWZzIGluIHRoZSBzeW10YWIuCi0gICAqIEFsbCBkZWZzIG11c3QgaGF2ZSBhIG5hbWUgLS0gYW5vbnltb3VzIGRlZnMgYXJlIG5vdCBhbGxvd2VkLiAgQW5vbnltb3VzCi0gICAqIGRlZnMgY2FuIHN0aWxsIGJlIGZyb3plbiBieSBjYWxsaW5nIHVwYl9kZWZfZnJlZXplKCkgZGlyZWN0bHkuCi0gICAqCi0gICAqIEFueSBleGlzdGluZyBkZWZzIHRoYXQgY2FuIHJlYWNoIGRlZnMgdGhhdCBhcmUgYmVpbmcgcmVwbGFjZWQgd2lsbAotICAgKiB0aGVtc2VsdmVzIGJlIHJlcGxhY2VkIGFsc28sIHNvIHRoYXQgdGhlIHJlc3VsdGluZyBzZXQgb2YgZGVmcyBpcyBmdWxseQotICAgKiBjb25zaXN0ZW50LgotICAgKgotICAgKiBUaGlzIGxvZ2ljIGltcGxlbWVudGVkIGluIHRoaXMgbWV0aG9kIGlzIGEgY29udmVuaWVuY2U7IHVsdGltYXRlbHkgaXQKLSAgICogY2FsbHMgc29tZSBjb21iaW5hdGlvbiBvZiB1cGJfZmllbGRkZWZfc2V0c3ViZGVmKCksIHVwYl9kZWZfZHVwKCksIGFuZAotICAgKiB1cGJfZnJlZXplKCksIGFueSBvZiB3aGljaCB0aGUgY2xpZW50IGNvdWxkIGNhbGwgdGhlbXNlbGYuICBIb3dldmVyLCBzaW5jZQotICAgKiB0aGUgbG9naWMgZm9yIGRvaW5nIHNvIGlzIG5vbnRyaXZpYWwsIHdlIHByb3ZpZGUgaXQgaGVyZS4KLSAgICoKLSAgICogVGhlIGVudGlyZSBvcGVyYXRpb24gZWl0aGVyIHN1Y2NlZWRzIG9yIGZhaWxzLiAgSWYgdGhlIG9wZXJhdGlvbiBmYWlscywKLSAgICogdGhlIHN5bXRhYiBpcyB1bmNoYW5nZWQsIGZhbHNlIGlzIHJldHVybmVkLCBhbmQgc3RhdHVzIGluZGljYXRlcyB0aGUKLSAgICogZXJyb3IuICBUaGUgY2FsbGVyIHBhc3NlcyBhIHJlZiBvbiBhbGwgZGVmcyB0byB0aGUgc3ltdGFiIChldmVuIGlmIHRoZQotICAgKiBvcGVyYXRpb24gZmFpbHMpLgotICAgKgotICAgKiBUT0RPKGhhYmVybWFuKTogY3VycmVudGx5IGZhaWx1cmUgd2lsbCBsZWF2ZSB0aGUgc3ltdGFiIHVuY2hhbmdlZCwgYnV0IG1heQotICAgKiBsZWF2ZSB0aGUgZGVmcyB0aGVtc2VsdmVzIHBhcnRpYWxseSByZXNvbHZlZC4gIERvZXMgdGhpcyBtYXR0ZXI/ICBJZiBzbyB3ZQotICAgKiBjb3VsZCBkbyBhIHByZXBhc3MgdGhhdCBlbnN1cmVzIHRoYXQgYWxsIHN5bWJvbHMgYXJlIHJlc29sdmFibGUgYW5kIGJhaWwKLSAgICogaWYgbm90LCBzbyB3ZSBkb24ndCBtdXRhdGUgYW55dGhpbmcgdW50aWwgd2Uga25vdyB0aGUgb3BlcmF0aW9uIHdpbGwKLSAgICogc3VjY2VlZC4KLSAgICoKLSAgICogVE9ETyhoYWJlcm1hbik6IHNpbmNlIHRoZSBkZWZzIG11c3QgYmUgbXV0YWJsZSwgcmVmaW5pbmcgYSBmcm96ZW4gZGVmCi0gICAqIHJlcXVpcmVzIG1ha2luZyBtdXRhYmxlIGNvcGllcyBvZiB0aGUgZW50aXJlIHRyZWUuICBUaGlzIGlzIHdhc3RlZnVsIGlmCi0gICAqIG9ubHkgYSBmZXcgbWVzc2FnZXMgYXJlIGNoYW5naW5nLiAgV2UgbWF5IHdhbnQgdG8gYWRkIGEgd2F5IG9mIGFkZGluZyBhCi0gICAqIHRyZWUgb2YgZnJvemVuIGRlZnMgdG8gdGhlIHN5bXRhYiAocGVyaGFwcyBhbiBhbHRlcm5hdGUgY29uc3RydWN0b3Igd2hlcmUKLSAgICogeW91IHBhc3MgdGhlIHJvb3Qgb2YgdGhlIHRyZWU/KSAqLwotICBib29sIEFkZChEZWYqY29uc3QqIGRlZnMsIHNpemVfdCBuLCB2b2lkKiByZWZfZG9ub3IsIFN0YXR1cyogc3RhdHVzKTsKLQotICBib29sIEFkZChjb25zdCBzdGQ6OnZlY3RvcjxEZWYqPiYgZGVmcywgdm9pZCAqb3duZXIsIFN0YXR1cyogc3RhdHVzKSB7Ci0gICAgcmV0dXJuIEFkZCgoRGVmKmNvbnN0KikmZGVmc1swXSwgZGVmcy5zaXplKCksIG93bmVyLCBzdGF0dXMpOwotICB9Ci0KLSAgLyogUmVzb2x2ZXMgYWxsIHN1YmRlZnMgZm9yIG1lc3NhZ2VzIGluIHRoaXMgZmlsZSBhbmQgYXR0ZW1wdHMgdG8gZnJlZXplIHRoZQotICAgKiBmaWxlLiAgSWYgdGhpcyBzdWNjZWVkcywgYWRkcyBhbGwgdGhlIHN5bWJvbHMgdG8gdGhpcyBTeW1ib2xUYWJsZQotICAgKiAocmVwbGFjaW5nIGFueSBleGlzdGluZyBvbmVzIHdpdGggdGhlIHNhbWUgbmFtZXMpLiAqLwotICBib29sIEFkZEZpbGUoRmlsZURlZiogZmlsZSwgU3RhdHVzKiBzKTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKFN5bWJvbFRhYmxlLCB1cGI6OlN5bWJvbFRhYmxlKQotfTsKLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogTmF0aXZlIEMgQVBJLiAqLwotCi0vKiBJbmNsdWRlIHJlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9zeW10YWJfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfc3ltdGFiLCB1cGJfc3ltdGFiX3VwY2FzdCkKLQotdXBiX3N5bXRhYiAqdXBiX3N5bXRhYl9uZXcoY29uc3Qgdm9pZCAqb3duZXIpOwotdm9pZCB1cGJfc3ltdGFiX2ZyZWV6ZSh1cGJfc3ltdGFiICpzKTsKLWNvbnN0IHVwYl9kZWYgKnVwYl9zeW10YWJfcmVzb2x2ZShjb25zdCB1cGJfc3ltdGFiICpzLCBjb25zdCBjaGFyICpiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN5bSk7Ci1jb25zdCB1cGJfZGVmICp1cGJfc3ltdGFiX2xvb2t1cChjb25zdCB1cGJfc3ltdGFiICpzLCBjb25zdCBjaGFyICpzeW0pOwotY29uc3QgdXBiX21zZ2RlZiAqdXBiX3N5bXRhYl9sb29rdXBtc2coY29uc3QgdXBiX3N5bXRhYiAqcywgY29uc3QgY2hhciAqc3ltKTsKLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJfc3ltdGFiX2xvb2t1cGVudW0oY29uc3QgdXBiX3N5bXRhYiAqcywgY29uc3QgY2hhciAqc3ltKTsKLWJvb2wgdXBiX3N5bXRhYl9hZGQodXBiX3N5bXRhYiAqcywgdXBiX2RlZiAqY29uc3QqZGVmcywgc2l6ZV90IG4sCi0gICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZl9kb25vciwgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLWJvb2wgdXBiX3N5bXRhYl9hZGRmaWxlKHVwYl9zeW10YWIgKnMsIHVwYl9maWxlZGVmICpmaWxlLCB1cGJfc3RhdHVzKiBzdGF0dXMpOwotCi0vKiB1cGJfc3ltdGFiX2l0ZXIgaTsKLSAqIGZvcih1cGJfc3ltdGFiX2JlZ2luKCZpLCBzLCB0eXBlKTsgIXVwYl9zeW10YWJfZG9uZSgmaSk7Ci0gKiAgICAgdXBiX3N5bXRhYl9uZXh0KCZpKSkgewotICogICBjb25zdCB1cGJfZGVmICpkZWYgPSB1cGJfc3ltdGFiX2l0ZXJfZGVmKCZpKTsKLSAqICAgIC8vIC4uLgotICogfQotICoKLSAqIEZvciBDIHdlIGRvbid0IGhhdmUgc2VwYXJhdGUgaXRlcmF0b3JzIGZvciBjb25zdCBhbmQgbm9uLWNvbnN0LgotICogSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNhc3QgdGhlIHVwYl9maWVsZGRlZiogdG8KLSAqIGNvbnN0IGlmIHRoZSB1cGJfbXNnZGVmKiBpcyBjb25zdC4gKi8KLXZvaWQgdXBiX3N5bXRhYl9iZWdpbih1cGJfc3ltdGFiX2l0ZXIgKml0ZXIsIGNvbnN0IHVwYl9zeW10YWIgKnMsCi0gICAgICAgICAgICAgICAgICAgICAgdXBiX2RlZnR5cGVfdCB0eXBlKTsKLXZvaWQgdXBiX3N5bXRhYl9uZXh0KHVwYl9zeW10YWJfaXRlciAqaXRlcik7Ci1ib29sIHVwYl9zeW10YWJfZG9uZShjb25zdCB1cGJfc3ltdGFiX2l0ZXIgKml0ZXIpOwotY29uc3QgdXBiX2RlZiAqdXBiX3N5bXRhYl9pdGVyX2RlZihjb25zdCB1cGJfc3ltdGFiX2l0ZXIgKml0ZXIpOwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotLyogQysrIGlubGluZSB3cmFwcGVycy4gKi8KLW5hbWVzcGFjZSB1cGIgewotaW5saW5lIHJlZmZlZF9wdHI8U3ltYm9sVGFibGU+IFN5bWJvbFRhYmxlOjpOZXcoKSB7Ci0gIHVwYl9zeW10YWIgKnMgPSB1cGJfc3ltdGFiX25ldygmcyk7Ci0gIHJldHVybiByZWZmZWRfcHRyPFN5bWJvbFRhYmxlPihzLCAmcyk7Ci19Ci0KLWlubGluZSB2b2lkIFN5bWJvbFRhYmxlOjpGcmVlemUoKSB7Ci0gIHJldHVybiB1cGJfc3ltdGFiX2ZyZWV6ZSh0aGlzKTsKLX0KLWlubGluZSBjb25zdCBEZWYgKlN5bWJvbFRhYmxlOjpSZXNvbHZlKGNvbnN0IGNoYXIgKmJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzeW0pIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9zeW10YWJfcmVzb2x2ZSh0aGlzLCBiYXNlLCBzeW0pOwotfQotaW5saW5lIGNvbnN0IERlZiogU3ltYm9sVGFibGU6Okxvb2t1cChjb25zdCBjaGFyICpzeW0pIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9zeW10YWJfbG9va3VwKHRoaXMsIHN5bSk7Ci19Ci1pbmxpbmUgY29uc3QgTWVzc2FnZURlZiAqU3ltYm9sVGFibGU6Okxvb2t1cE1lc3NhZ2UoY29uc3QgY2hhciAqc3ltKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfc3ltdGFiX2xvb2t1cG1zZyh0aGlzLCBzeW0pOwotfQotaW5saW5lIGJvb2wgU3ltYm9sVGFibGU6OkFkZCgKLSAgICBEZWYqY29uc3QqIGRlZnMsIHNpemVfdCBuLCB2b2lkKiByZWZfZG9ub3IsIFN0YXR1cyogc3RhdHVzKSB7Ci0gIHJldHVybiB1cGJfc3ltdGFiX2FkZCh0aGlzLCAodXBiX2RlZipjb25zdCopZGVmcywgbiwgcmVmX2Rvbm9yLCBzdGF0dXMpOwotfQotaW5saW5lIGJvb2wgU3ltYm9sVGFibGU6OkFkZEZpbGUoRmlsZURlZiogZmlsZSwgU3RhdHVzKiBzKSB7Ci0gIHJldHVybiB1cGJfc3ltdGFiX2FkZGZpbGUodGhpcywgZmlsZSwgcyk7Ci19Ci19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfU1lNVEFCX0hfICovCi0vKgotKiogdXBiOjpkZXNjcmlwdG9yOjpSZWFkZXIgKHVwYl9kZXNjcmVhZGVyKQotKioKLSoqIFByb3ZpZGVzIGEgd2F5IG9mIGJ1aWxkaW5nIHVwYjo6RGVmcyBmcm9tIGRhdGEgaW4gZGVzY3JpcHRvci5wcm90byBmb3JtYXQuCi0qLwotCi0jaWZuZGVmIFVQQl9ERVNDUklQVE9SX0gKLSNkZWZpbmUgVVBCX0RFU0NSSVBUT1JfSAotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UgZGVzY3JpcHRvciB7Ci1jbGFzcyBSZWFkZXI7Ci19ICAvKiBuYW1lc3BhY2UgZGVzY3JpcHRvciAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2VuZGlmCi0KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpkZXNjcmlwdG9yOjpSZWFkZXIsIHVwYl9kZXNjcmVhZGVyKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQ2xhc3MgdGhhdCByZWNlaXZlcyBkZXNjcmlwdG9yIGRhdGEgYWNjb3JkaW5nIHRvIHRoZSBkZXNjcmlwdG9yLnByb3RvIHNjaGVtYQotICogYW5kIHVzZSBpdCB0byBidWlsZCB1cGI6OkRlZnMgY29ycmVzcG9uZGluZyB0byB0aGF0IHNjaGVtYS4gKi8KLWNsYXNzIHVwYjo6ZGVzY3JpcHRvcjo6UmVhZGVyIHsKLSBwdWJsaWM6Ci0gIC8qIFRoZXNlIGhhbmRsZXJzIG11c3QgaGF2ZSBjb21lIGZyb20gTmV3SGFuZGxlcnMoKSBhbmQgbXVzdCBvdXRsaXZlIHRoZQotICAgKiBSZWFkZXIuCi0gICAqCi0gICAqIFRPRE86IGdlbmVyYXRlIHRoZSBoYW5kbGVycyBzdGF0aWNhbGx5IChsaWtlIHdlIGRvIHdpdGggdGhlCi0gICAqIGRlc2NyaXB0b3IucHJvdG8gZGVmcykgc28gdGhhdCB0aGVyZSBpcyBubyBuZWVkIHRvIHBhc3MgdGhpcyBwYXJhbWV0ZXIgKG9yCi0gICAqIHRvIGJ1aWxkL21lbW9yeS1tYW5hZ2UgdGhlIGhhbmRsZXJzIGF0IHJ1bnRpbWUgYXQgYWxsKS4gIFVuZm9ydHVuYXRlbHkgdGhpcwotICAgKiBpcyBhIGJpdCB0cmlja3kgdG8gaW1wbGVtZW50IGZvciBIYW5kbGVycywgYnV0IG5lY2Vzc2FyeSB0byBzaW1wbGlmeSB0aGlzCi0gICAqIGludGVyZmFjZS4gKi8KLSAgc3RhdGljIFJlYWRlciogQ3JlYXRlKEVudmlyb25tZW50KiBlbnYsIGNvbnN0IEhhbmRsZXJzKiBoYW5kbGVycyk7Ci0KLSAgLyogVGhlIHJlYWRlcidzIGlucHV0OyB0aGlzIGlzIHdoZXJlIGRlc2NyaXB0b3IucHJvdG8gZGF0YSBzaG91bGQgYmUgc2VudC4gKi8KLSAgU2luayogaW5wdXQoKTsKLQotICAvKiBVc2UgdG8gZ2V0IHRoZSBGaWxlRGVmcyB0aGF0IGhhdmUgYmVlbiBwYXJzZWQuICovCi0gIHNpemVfdCBmaWxlX2NvdW50KCkgY29uc3Q7Ci0gIEZpbGVEZWYqIGZpbGUoc2l6ZV90IGkpIGNvbnN0OwotCi0gIC8qIEJ1aWxkcyBhbmQgcmV0dXJucyBoYW5kbGVycyBmb3IgdGhlIHJlYWRlciwgb3duZWQgYnkgIm93bmVyLiIgKi8KLSAgc3RhdGljIEhhbmRsZXJzKiBOZXdIYW5kbGVycyhjb25zdCB2b2lkKiBvd25lcik7Ci0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfUE9EX09QUyhSZWFkZXIsIHVwYjo6ZGVzY3JpcHRvcjo6UmVhZGVyKQotfTsKLQotI2VuZGlmCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBDIEFQSS4gKi8KLXVwYl9kZXNjcmVhZGVyICp1cGJfZGVzY3JlYWRlcl9jcmVhdGUodXBiX2VudiAqZSwgY29uc3QgdXBiX2hhbmRsZXJzICpoKTsKLXVwYl9zaW5rICp1cGJfZGVzY3JlYWRlcl9pbnB1dCh1cGJfZGVzY3JlYWRlciAqcik7Ci1zaXplX3QgdXBiX2Rlc2NyZWFkZXJfZmlsZWNvdW50KGNvbnN0IHVwYl9kZXNjcmVhZGVyICpyKTsKLXVwYl9maWxlZGVmICp1cGJfZGVzY3JlYWRlcl9maWxlKGNvbnN0IHVwYl9kZXNjcmVhZGVyICpyLCBzaXplX3QgaSk7Ci1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9kZXNjcmVhZGVyX25ld2hhbmRsZXJzKGNvbnN0IHZvaWQgKm93bmVyKTsKLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLS8qIEMrKyBpbXBsZW1lbnRhdGlvbiBkZXRhaWxzLiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi1uYW1lc3BhY2UgdXBiIHsKLW5hbWVzcGFjZSBkZXNjcmlwdG9yIHsKLWlubGluZSBSZWFkZXIqIFJlYWRlcjo6Q3JlYXRlKEVudmlyb25tZW50KiBlLCBjb25zdCBIYW5kbGVycyAqaCkgewotICByZXR1cm4gdXBiX2Rlc2NyZWFkZXJfY3JlYXRlKGUsIGgpOwotfQotaW5saW5lIFNpbmsqIFJlYWRlcjo6aW5wdXQoKSB7IHJldHVybiB1cGJfZGVzY3JlYWRlcl9pbnB1dCh0aGlzKTsgfQotaW5saW5lIHNpemVfdCBSZWFkZXI6OmZpbGVfY291bnQoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZGVzY3JlYWRlcl9maWxlY291bnQodGhpcyk7Ci19Ci1pbmxpbmUgRmlsZURlZiogUmVhZGVyOjpmaWxlKHNpemVfdCBpKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfZGVzY3JlYWRlcl9maWxlKHRoaXMsIGkpOwotfQotfSAgLyogbmFtZXNwYWNlIGRlc2NyaXB0b3IgKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9ERVNDUklQVE9SX0ggKi8KLS8qIFRoaXMgZmlsZSBjb250YWlucyBhY2Nlc3NvcnMgZm9yIGEgc2V0IG9mIGNvbXBpbGVkLWluIGRlZnMuCi0gKiBOb3RlIHRoYXQgdW5saWtlIEdvb2dsZSdzIHByb3RvYnVmLCBpdCBkb2VzICpub3QqIGRlZmluZQotICogZ2VuZXJhdGVkIGNsYXNzZXMgb3IgYW55IG90aGVyIGtpbmQgb2YgZGF0YSBzdHJ1Y3R1cmUgZm9yCi0gKiBhY3R1YWxseSBzdG9yaW5nIHByb3RvYnVmcy4gIEl0IG9ubHkgY29udGFpbnMgKmRlZnMqIHdoaWNoCi0gKiBsZXQgeW91IHJlZmxlY3Qgb3ZlciBhIHByb3RvYnVmICpzY2hlbWEqLgotICovCi0vKiBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSB1cGJjICh0aGUgdXBiIGNvbXBpbGVyKSBmcm9tIHRoZSBpbnB1dAotICogZmlsZToKLSAqCi0gKiAgICAgdXBiL2Rlc2NyaXB0b3IvZGVzY3JpcHRvci5wcm90bwotICoKLSAqIERvIG5vdCBlZGl0IC0tIHlvdXIgY2hhbmdlcyB3aWxsIGJlIGRpc2NhcmRlZCB3aGVuIHRoZSBmaWxlIGlzCi0gKiByZWdlbmVyYXRlZC4gKi8KLQotI2lmbmRlZiBVUEJfREVTQ1JJUFRPUl9ERVNDUklQVE9SX1BST1RPX1VQQl9IXwotI2RlZmluZSBVUEJfREVTQ1JJUFRPUl9ERVNDUklQVE9SX1BST1RPX1VQQl9IXwotCi0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi0vKiBFbnVtcyAqLwotCi10eXBlZGVmIGVudW0gewotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fTEFCRUxfT1BUSU9OQUwgPSAxLAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fTEFCRUxfUkVRVUlSRUQgPSAyLAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fTEFCRUxfUkVQRUFURUQgPSAzCi19IGdvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbDsKLQotdHlwZWRlZiBlbnVtIHsKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfRE9VQkxFID0gMSwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfRkxPQVQgPSAyLAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9JTlQ2NCA9IDMsCi0gIGdvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX1VJTlQ2NCA9IDQsCi0gIGdvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX0lOVDMyID0gNSwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfRklYRUQ2NCA9IDYsCi0gIGdvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19UWVBFX0ZJWEVEMzIgPSA3LAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9CT09MID0gOCwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfU1RSSU5HID0gOSwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfR1JPVVAgPSAxMCwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfTUVTU0FHRSA9IDExLAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9CWVRFUyA9IDEyLAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9VSU5UMzIgPSAxMywKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfRU5VTSA9IDE0LAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9TRklYRUQzMiA9IDE1LAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9TRklYRUQ2NCA9IDE2LAotICBnb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fVFlQRV9TSU5UMzIgPSAxNywKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1RZUEVfU0lOVDY0ID0gMTgKLX0gZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIGdvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfU1RSSU5HID0gMCwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19DT1JEID0gMSwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19TVFJJTkdfUElFQ0UgPSAyCi19IGdvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfQ1R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIGdvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfSlNfTk9STUFMID0gMCwKLSAgZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19KU19TVFJJTkcgPSAxLAotICBnb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX0pTX05VTUJFUiA9IDIKLX0gZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19KU1R5cGU7Ci0KLXR5cGVkZWYgZW51bSB7Ci0gIGdvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19TUEVFRCA9IDEsCi0gIGdvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19DT0RFX1NJWkUgPSAyLAotICBnb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfTElURV9SVU5USU1FID0gMwotfSBnb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlOwotCi0vKiBNZXNzYWdlRGVmczogY2FsbCB0aGVzZSBmdW5jdGlvbnMgdG8gZ2V0IGEgcmVmIHRvIGEgbXNnZGVmLiAqLwotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtT3B0aW9uc19nZXQoY29uc3Qgdm9pZCAqb3duZXIpOwotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19nZXQoY29uc3Qgdm9pZCAqb3duZXIpOwotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclNldF9nZXQoY29uc3Qgdm9pZCAqb3duZXIpOwotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnNfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX09uZW9mRGVzY3JpcHRvclByb3RvX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlT3B0aW9uc19nZXQoY29uc3Qgdm9pZCAqb3duZXIpOwotY29uc3QgdXBiX21zZ2RlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fZ2V0KGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IHVwYl9tc2dkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfbXNnZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2dldChjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEVudW1EZWZzOiBjYWxsIHRoZXNlIGZ1bmN0aW9ucyB0byBnZXQgYSByZWYgdG8gYW4gZW51bWRlZi4gKi8KLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9nZXQoY29uc3Qgdm9pZCAqb3duZXIpOwotY29uc3QgdXBiX2VudW1kZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfQ1R5cGVfZ2V0KGNvbnN0IHZvaWQgKm93bmVyKTsKLWNvbnN0IHVwYl9lbnVtZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfSlNUeXBlX2dldChjb25zdCB2b2lkICpvd25lcik7Ci1jb25zdCB1cGJfZW51bWRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2dldChjb25zdCB2b2lkICpvd25lcik7Ci0KLS8qIEZ1bmN0aW9ucyB0byB0ZXN0IHdoZXRoZXIgdGhpcyBtZXNzYWdlIGlzIG9mIGEgY2VydGFpbiB0eXBlLiAqLwotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19pcyhjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX21zZ2RlZl9mdWxsbmFtZShtKSwgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8iKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9pcyhjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX21zZ2RlZl9mdWxsbmFtZShtKSwgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UiKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8iKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9faXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gc3RyY21wKHVwYl9tc2dkZWZfZnVsbG5hbWUobSksICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zX2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMiKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfaXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gc3RyY21wKHVwYl9tc2dkZWZfZnVsbG5hbWUobSksICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8iKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0IikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19pcyhjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX21zZ2RlZl9mdWxsbmFtZShtKSwgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyIpID09IDA7Ci19Ci1VUEJfSU5MSU5FIGJvb2wgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfaXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gc3RyY21wKHVwYl9tc2dkZWZfZnVsbG5hbWUobSksICJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMiKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19pcyhjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX21zZ2RlZl9mdWxsbmFtZShtKSwgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8iKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZE9wdGlvbnNfaXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gc3RyY21wKHVwYl9tc2dkZWZfZnVsbG5hbWUobSksICJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyIpID09IDA7Ci19Ci1VUEJfSU5MSU5FIGJvb2wgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfT25lb2ZEZXNjcmlwdG9yUHJvdG9faXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gc3RyY21wKHVwYl9tc2dkZWZfZnVsbG5hbWUobSksICJnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8iKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG9faXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gc3RyY21wKHVwYl9tc2dkZWZfZnVsbG5hbWUobSksICJnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byIpID09IDA7Ci19Ci1VUEJfSU5MSU5FIGJvb2wgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZU9wdGlvbnNfaXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgewotICByZXR1cm4gc3RyY21wKHVwYl9tc2dkZWZfZnVsbG5hbWUobSksICJnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMiKSA9PSAwOwotfQotVVBCX0lOTElORSBib29sIHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9pcyhjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX21zZ2RlZl9mdWxsbmFtZShtKSwgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiIpID09IDA7Ci19Ci1VUEJfSU5MSU5FIGJvb2wgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9pcyhjb25zdCB1cGJfbXNnZGVmICptKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX21zZ2RlZl9mdWxsbmFtZShtKSwgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2lzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsKLSAgcmV0dXJuIHN0cmNtcCh1cGJfbXNnZGVmX2Z1bGxuYW1lKG0pLCAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQiKSA9PSAwOwotfQotCi0vKiBGdW5jdGlvbnMgdG8gdGVzdCB3aGV0aGVyIHRoaXMgZW51bSBpcyBvZiBhIGNlcnRhaW4gdHlwZS4gKi8KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9pcyhjb25zdCB1cGJfZW51bWRlZiAqZSkgewotICByZXR1cm4gc3RyY21wKHVwYl9lbnVtZGVmX2Z1bGxuYW1lKGUpLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2lzKGNvbnN0IHVwYl9lbnVtZGVmICplKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX2VudW1kZWZfZnVsbG5hbWUoZSksICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSIpID09IDA7Ci19Ci1VUEJfSU5MSU5FIGJvb2wgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX0NUeXBlX2lzKGNvbnN0IHVwYl9lbnVtZGVmICplKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX2VudW1kZWZfZnVsbG5hbWUoZSksICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIikgPT0gMDsKLX0KLVVQQl9JTkxJTkUgYm9vbCB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfSlNUeXBlX2lzKGNvbnN0IHVwYl9lbnVtZGVmICplKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX2VudW1kZWZfZnVsbG5hbWUoZSksICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSIpID09IDA7Ci19Ci1VUEJfSU5MSU5FIGJvb2wgdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2lzKGNvbnN0IHVwYl9lbnVtZGVmICplKSB7Ci0gIHJldHVybiBzdHJjbXAodXBiX2VudW1kZWZfZnVsbG5hbWUoZSksICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIikgPT0gMDsKLX0KLQotCi0vKiBGdW5jdGlvbnMgdG8gZ2V0IGEgZmllbGRkZWYgZnJvbSBhIG1zZ2RlZiByZWZlcmVuY2UuICovCi1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2ZfZW5kKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZl9zdGFydChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZl9lbmQoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZl9zdGFydChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZl9lbnVtX3R5cGUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA0KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19mX2V4dGVuc2lvbihjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDYpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2ZfZXh0ZW5zaW9uX3JhbmdlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgNSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZl9maWVsZChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2ZfbmFtZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2ZfbmVzdGVkX3R5cGUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19mX29uZW9mX2RlY2woY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA4KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19mX29wdGlvbnMoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA3KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0Rlc2NyaXB0b3JQcm90b19mX3Jlc2VydmVkX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxMCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fZl9yZXNlcnZlZF9yYW5nZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDkpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90b19mX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bURlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX2Zfb3B0aW9ucyhjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1EZXNjcmlwdG9yUHJvdG9fZl92YWx1ZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX2ZfYWxsb3dfYWxpYXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnNfZl9kZXByZWNhdGVkKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX2ZfdW5pbnRlcnByZXRlZF9vcHRpb24oY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDk5OSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZl9uYW1lKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZl9udW1iZXIoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19mX29wdGlvbnMoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnNfZl9kZXByZWNhdGVkKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bVZhbHVlT3B0aW9uc19mX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDk5OSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19mX2RlZmF1bHRfdmFsdWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDcpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fZl9leHRlbmRlZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19mX2pzb25fbmFtZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMTApOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fZl9sYWJlbChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgNCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19mX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fZl9udW1iZXIoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDMpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fZl9vbmVvZl9pbmRleChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgOSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19mX29wdGlvbnMoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDgpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9fZl90eXBlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA1KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX2ZfdHlwZV9uYW1lKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA2KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19mX2N0eXBlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfZl9kZXByZWNhdGVkKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfZl9qc3R5cGUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA2KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19mX2xhenkoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA1KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19mX3BhY2tlZChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2ZfdW5pbnRlcnByZXRlZF9vcHRpb24oY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA5OTkpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2Zfd2Vhayhjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEwKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZl9kZXBlbmRlbmN5KGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDMpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19mX2VudW1fdHlwZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA1KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZl9leHRlbnNpb24oY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgNyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2ZfbWVzc2FnZV90eXBlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDQpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19mX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2Zfb3B0aW9ucyhjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA4KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZl9wYWNrYWdlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19mX3B1YmxpY19kZXBlbmRlbmN5KGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEwKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZl9zZXJ2aWNlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDYpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19mX3NvdXJjZV9jb2RlX2luZm8oY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgOSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclByb3RvX2Zfc3ludGF4KGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9fZl93ZWFrX2RlcGVuZGVuY3koY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMTEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JTZXRfZl9maWxlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yU2V0X2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2ZfY2NfZW5hYmxlX2FyZW5hcyhjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMzEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfZl9jY19nZW5lcmljX3NlcnZpY2VzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxNik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19mX2NzaGFycF9uYW1lc3BhY2UoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDM3KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2ZfZGVwcmVjYXRlZChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMjMpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfZl9nb19wYWNrYWdlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19mX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAyMCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19mX2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMTcpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfZl9qYXZhX211bHRpcGxlX2ZpbGVzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxMCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19mX2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA4KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2ZfamF2YV9wYWNrYWdlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2ZfamF2YV9zdHJpbmdfY2hlY2tfdXRmOChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMjcpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfZl9qYXZhbmFub191c2VfZGVwcmVjYXRlZF9wYWNrYWdlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzOCk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19mX29iamNfY2xhc3NfcHJlZml4KGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzNik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19mX29wdGltaXplX2Zvcihjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgOSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19mX3B5X2dlbmVyaWNfc2VydmljZXMoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDE4KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2ZfdW5pbnRlcnByZXRlZF9vcHRpb24oY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDk5OSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19mX2RlcHJlY2F0ZWQoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDMpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfZl9tYXBfZW50cnkoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDcpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfZl9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19mX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfaXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWVzc2FnZU9wdGlvbnNfZl91bmludGVycHJldGVkX29wdGlvbihjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgOTk5KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19mX2NsaWVudF9zdHJlYW1pbmcoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA1KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19mX2lucHV0X3R5cGUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19mX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19mX29wdGlvbnMoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA0KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19mX291dHB1dF90eXBlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fZl9zZXJ2ZXJfc3RyZWFtaW5nKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01ldGhvZERlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgNik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2RPcHRpb25zX2ZfZGVwcmVjYXRlZChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2RPcHRpb25zX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzMyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2RPcHRpb25zX2ZfdW5pbnRlcnByZXRlZF9vcHRpb24oY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgOTk5KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX09uZW9mRGVzY3JpcHRvclByb3RvX2ZfbmFtZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9PbmVvZkRlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX2ZfbWV0aG9kKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDIpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19mX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Zfb3B0aW9ucyhjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlRGVzY3JpcHRvclByb3RvX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAzKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VPcHRpb25zX2ZfZGVwcmVjYXRlZChjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMzMpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZU9wdGlvbnNfZl91bmludGVycHJldGVkX29wdGlvbihjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlT3B0aW9uc19pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgOTk5KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2ZfbGVhZGluZ19jb21tZW50cyhjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMyk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9mX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDYpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25fZl9wYXRoKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAxKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Zfc3Bhbihjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9mX3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA0KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX2ZfbG9jYXRpb24oY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDEpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9mX2lzX2V4dGVuc2lvbihjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCAyKTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZl9uYW1lX3BhcnQoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMSk7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX2ZfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDgpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9mX2RvdWJsZV92YWx1ZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA2KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fZl9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDMpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9mX25hbWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgMik7IH0KLVVQQl9JTkxJTkUgY29uc3QgdXBiX2ZpZWxkZGVmICp1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX2ZfbmVnYXRpdmVfaW50X3ZhbHVlKGNvbnN0IHVwYl9tc2dkZWYgKm0pIHsgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25faXMobSkpOyByZXR1cm4gdXBiX21zZ2RlZl9pdG9mKG0sIDUpOyB9Ci1VUEJfSU5MSU5FIGNvbnN0IHVwYl9maWVsZGRlZiAqdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9mX3Bvc2l0aXZlX2ludF92YWx1ZShjb25zdCB1cGJfbXNnZGVmICptKSB7IGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX2lzKG0pKTsgcmV0dXJuIHVwYl9tc2dkZWZfaXRvZihtLCA0KTsgfQotVVBCX0lOTElORSBjb25zdCB1cGJfZmllbGRkZWYgKnVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25fZl9zdHJpbmdfdmFsdWUoY29uc3QgdXBiX21zZ2RlZiAqbSkgeyBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9pcyhtKSk7IHJldHVybiB1cGJfbXNnZGVmX2l0b2YobSwgNyk7IH0KLQotVVBCX0VORF9FWFRFUk5fQwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotbmFtZXNwYWNlIHVwYmRlZnMgewotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1jbGFzcyBEZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSBwdWJsaWM6Ci0gIERlc2NyaXB0b3JQcm90byhjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yID0gTlVMTCkKLSAgICAgIDogcmVmZmVkX3B0cihtLCByZWZfZG9ub3IpIHsKLSAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG8gZ2V0KCkgewotICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX2dldCgmbSk7Ci0gICAgcmV0dXJuIERlc2NyaXB0b3JQcm90byhtLCAmbSk7Ci0gIH0KLQotICBjbGFzcyBFeHRlbnNpb25SYW5nZSA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotICAgcHVibGljOgotICAgIEV4dGVuc2lvblJhbmdlKGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2lzKG0pKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgRXh0ZW5zaW9uUmFuZ2UgZ2V0KCkgewotICAgICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZ2V0KCZtKTsKLSAgICAgIHJldHVybiBFeHRlbnNpb25SYW5nZShtLCAmbSk7Ci0gICAgfQotICB9OwotCi0gIGNsYXNzIFJlc2VydmVkUmFuZ2UgOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSAgIHB1YmxpYzoKLSAgICBSZXNlcnZlZFJhbmdlKGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfaXMobSkpOwotICAgIH0KLQotICAgIHN0YXRpYyBSZXNlcnZlZFJhbmdlIGdldCgpIHsKLSAgICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZ2V0KCZtKTsKLSAgICAgIHJldHVybiBSZXNlcnZlZFJhbmdlKG0sICZtKTsKLSAgICB9Ci0gIH07Ci19OwotCi1jbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmPiB7Ci0gcHVibGljOgotICBFbnVtRGVzY3JpcHRvclByb3RvKGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgOiByZWZmZWRfcHRyKG0sIHJlZl9kb25vcikgewotICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtRGVzY3JpcHRvclByb3RvX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBFbnVtRGVzY3JpcHRvclByb3RvIGdldCgpIHsKLSAgICBjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1EZXNjcmlwdG9yUHJvdG9fZ2V0KCZtKTsKLSAgICByZXR1cm4gRW51bURlc2NyaXB0b3JQcm90byhtLCAmbSk7Ci0gIH0KLX07Ci0KLWNsYXNzIEVudW1PcHRpb25zIDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmPiB7Ci0gcHVibGljOgotICBFbnVtT3B0aW9ucyhjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yID0gTlVMTCkKLSAgICAgIDogcmVmZmVkX3B0cihtLCByZWZfZG9ub3IpIHsKLSAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRW51bU9wdGlvbnNfaXMobSkpOwotICB9Ci0KLSAgc3RhdGljIEVudW1PcHRpb25zIGdldCgpIHsKLSAgICBjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1PcHRpb25zX2dldCgmbSk7Ci0gICAgcmV0dXJuIEVudW1PcHRpb25zKG0sICZtKTsKLSAgfQotfTsKLQotY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmPiB7Ci0gcHVibGljOgotICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19pcyhtKSk7Ci0gIH0KLQotICBzdGF0aWMgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIGdldCgpIHsKLSAgICBjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZURlc2NyaXB0b3JQcm90b19nZXQoJm0pOwotICAgIHJldHVybiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8obSwgJm0pOwotICB9Ci19OwotCi1jbGFzcyBFbnVtVmFsdWVPcHRpb25zIDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmPiB7Ci0gcHVibGljOgotICBFbnVtVmFsdWVPcHRpb25zKGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgOiByZWZmZWRfcHRyKG0sIHJlZl9kb25vcikgewotICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9FbnVtVmFsdWVPcHRpb25zX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBFbnVtVmFsdWVPcHRpb25zIGdldCgpIHsKLSAgICBjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0VudW1WYWx1ZU9wdGlvbnNfZ2V0KCZtKTsKLSAgICByZXR1cm4gRW51bVZhbHVlT3B0aW9ucyhtLCAmbSk7Ci0gIH0KLX07Ci0KLWNsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmPiB7Ci0gcHVibGljOgotICBGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yID0gTlVMTCkKLSAgICAgIDogcmVmZmVkX3B0cihtLCByZWZfZG9ub3IpIHsKLSAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGREZXNjcmlwdG9yUHJvdG9faXMobSkpOwotICB9Ci0KLSAgc3RhdGljIEZpZWxkRGVzY3JpcHRvclByb3RvIGdldCgpIHsKLSAgICBjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX2dldCgmbSk7Ci0gICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvKG0sICZtKTsKLSAgfQotCi0gIGNsYXNzIExhYmVsIDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpFbnVtRGVmPiB7Ci0gICBwdWJsaWM6Ci0gICAgTGFiZWwoY29uc3QgOjp1cGI6OkVudW1EZWYqIGUsIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICAgIDogcmVmZmVkX3B0cihlLCByZWZfZG9ub3IpIHsKLSAgICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9pcyhlKSk7Ci0gICAgfQotICAgIHN0YXRpYyBMYWJlbCBnZXQoKSB7Ci0gICAgICBjb25zdCA6OnVwYjo6RW51bURlZiogZSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2dldCgmZSk7Ci0gICAgICByZXR1cm4gTGFiZWwoZSwgJmUpOwotICAgIH0KLSAgfTsKLQotICBjbGFzcyBUeXBlIDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpFbnVtRGVmPiB7Ci0gICBwdWJsaWM6Ci0gICAgVHlwZShjb25zdCA6OnVwYjo6RW51bURlZiogZSwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yID0gTlVMTCkKLSAgICAgICAgOiByZWZmZWRfcHRyKGUsIHJlZl9kb25vcikgewotICAgICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfaXMoZSkpOwotICAgIH0KLSAgICBzdGF0aWMgVHlwZSBnZXQoKSB7Ci0gICAgICBjb25zdCA6OnVwYjo6RW51bURlZiogZSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZ2V0KCZlKTsKLSAgICAgIHJldHVybiBUeXBlKGUsICZlKTsKLSAgICB9Ci0gIH07Ci19OwotCi1jbGFzcyBGaWVsZE9wdGlvbnMgOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSBwdWJsaWM6Ci0gIEZpZWxkT3B0aW9ucyhjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yID0gTlVMTCkKLSAgICAgIDogcmVmZmVkX3B0cihtLCByZWZfZG9ub3IpIHsKLSAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBGaWVsZE9wdGlvbnMgZ2V0KCkgewotICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX2dldCgmbSk7Ci0gICAgcmV0dXJuIEZpZWxkT3B0aW9ucyhtLCAmbSk7Ci0gIH0KLQotICBjbGFzcyBDVHlwZSA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6RW51bURlZj4gewotICAgcHVibGljOgotICAgIENUeXBlKGNvbnN0IDo6dXBiOjpFbnVtRGVmKiBlLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgICA6IHJlZmZlZF9wdHIoZSwgcmVmX2Rvbm9yKSB7Ci0gICAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX0NUeXBlX2lzKGUpKTsKLSAgICB9Ci0gICAgc3RhdGljIENUeXBlIGdldCgpIHsKLSAgICAgIGNvbnN0IDo6dXBiOjpFbnVtRGVmKiBlID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmllbGRPcHRpb25zX0NUeXBlX2dldCgmZSk7Ci0gICAgICByZXR1cm4gQ1R5cGUoZSwgJmUpOwotICAgIH0KLSAgfTsKLQotICBjbGFzcyBKU1R5cGUgOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6OkVudW1EZWY+IHsKLSAgIHB1YmxpYzoKLSAgICBKU1R5cGUoY29uc3QgOjp1cGI6OkVudW1EZWYqIGUsIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICAgIDogcmVmZmVkX3B0cihlLCByZWZfZG9ub3IpIHsKLSAgICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWVsZE9wdGlvbnNfSlNUeXBlX2lzKGUpKTsKLSAgICB9Ci0gICAgc3RhdGljIEpTVHlwZSBnZXQoKSB7Ci0gICAgICBjb25zdCA6OnVwYjo6RW51bURlZiogZSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpZWxkT3B0aW9uc19KU1R5cGVfZ2V0KCZlKTsKLSAgICAgIHJldHVybiBKU1R5cGUoZSwgJmUpOwotICAgIH0KLSAgfTsKLX07Ci0KLWNsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSBwdWJsaWM6Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8oY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVEZXNjcmlwdG9yUHJvdG9faXMobSkpOwotICB9Ci0KLSAgc3RhdGljIEZpbGVEZXNjcmlwdG9yUHJvdG8gZ2V0KCkgewotICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JQcm90b19nZXQoJm0pOwotICAgIHJldHVybiBGaWxlRGVzY3JpcHRvclByb3RvKG0sICZtKTsKLSAgfQotfTsKLQotY2xhc3MgRmlsZURlc2NyaXB0b3JTZXQgOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSBwdWJsaWM6Ci0gIEZpbGVEZXNjcmlwdG9yU2V0KGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgOiByZWZmZWRfcHRyKG0sIHJlZl9kb25vcikgewotICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlRGVzY3JpcHRvclNldF9pcyhtKSk7Ci0gIH0KLQotICBzdGF0aWMgRmlsZURlc2NyaXB0b3JTZXQgZ2V0KCkgewotICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZURlc2NyaXB0b3JTZXRfZ2V0KCZtKTsKLSAgICByZXR1cm4gRmlsZURlc2NyaXB0b3JTZXQobSwgJm0pOwotICB9Ci19OwotCi1jbGFzcyBGaWxlT3B0aW9ucyA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotIHB1YmxpYzoKLSAgRmlsZU9wdGlvbnMoY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX0ZpbGVPcHRpb25zX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBGaWxlT3B0aW9ucyBnZXQoKSB7Ci0gICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19nZXQoJm0pOwotICAgIHJldHVybiBGaWxlT3B0aW9ucyhtLCAmbSk7Ci0gIH0KLQotICBjbGFzcyBPcHRpbWl6ZU1vZGUgOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6OkVudW1EZWY+IHsKLSAgIHB1YmxpYzoKLSAgICBPcHRpbWl6ZU1vZGUoY29uc3QgOjp1cGI6OkVudW1EZWYqIGUsIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICAgIDogcmVmZmVkX3B0cihlLCByZWZfZG9ub3IpIHsKLSAgICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9GaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfaXMoZSkpOwotICAgIH0KLSAgICBzdGF0aWMgT3B0aW1pemVNb2RlIGdldCgpIHsKLSAgICAgIGNvbnN0IDo6dXBiOjpFbnVtRGVmKiBlID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2dldCgmZSk7Ci0gICAgICByZXR1cm4gT3B0aW1pemVNb2RlKGUsICZlKTsKLSAgICB9Ci0gIH07Ci19OwotCi1jbGFzcyBNZXNzYWdlT3B0aW9ucyA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotIHB1YmxpYzoKLSAgTWVzc2FnZU9wdGlvbnMoY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX01lc3NhZ2VPcHRpb25zX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBNZXNzYWdlT3B0aW9ucyBnZXQoKSB7Ci0gICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXNzYWdlT3B0aW9uc19nZXQoJm0pOwotICAgIHJldHVybiBNZXNzYWdlT3B0aW9ucyhtLCAmbSk7Ci0gIH0KLX07Ci0KLWNsYXNzIE1ldGhvZERlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotIHB1YmxpYzoKLSAgTWV0aG9kRGVzY3JpcHRvclByb3RvKGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgOiByZWZmZWRfcHRyKG0sIHJlZl9kb25vcikgewotICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9faXMobSkpOwotICB9Ci0KLSAgc3RhdGljIE1ldGhvZERlc2NyaXB0b3JQcm90byBnZXQoKSB7Ci0gICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2REZXNjcmlwdG9yUHJvdG9fZ2V0KCZtKTsKLSAgICByZXR1cm4gTWV0aG9kRGVzY3JpcHRvclByb3RvKG0sICZtKTsKLSAgfQotfTsKLQotY2xhc3MgTWV0aG9kT3B0aW9ucyA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotIHB1YmxpYzoKLSAgTWV0aG9kT3B0aW9ucyhjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSwgY29uc3Qgdm9pZCAqcmVmX2Rvbm9yID0gTlVMTCkKLSAgICAgIDogcmVmZmVkX3B0cihtLCByZWZfZG9ub3IpIHsKLSAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfTWV0aG9kT3B0aW9uc19pcyhtKSk7Ci0gIH0KLQotICBzdGF0aWMgTWV0aG9kT3B0aW9ucyBnZXQoKSB7Ci0gICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9NZXRob2RPcHRpb25zX2dldCgmbSk7Ci0gICAgcmV0dXJuIE1ldGhvZE9wdGlvbnMobSwgJm0pOwotICB9Ci19OwotCi1jbGFzcyBPbmVvZkRlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotIHB1YmxpYzoKLSAgT25lb2ZEZXNjcmlwdG9yUHJvdG8oY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX09uZW9mRGVzY3JpcHRvclByb3RvX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBPbmVvZkRlc2NyaXB0b3JQcm90byBnZXQoKSB7Ci0gICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9PbmVvZkRlc2NyaXB0b3JQcm90b19nZXQoJm0pOwotICAgIHJldHVybiBPbmVvZkRlc2NyaXB0b3JQcm90byhtLCAmbSk7Ci0gIH0KLX07Ci0KLWNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSBwdWJsaWM6Ci0gIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NlcnZpY2VEZXNjcmlwdG9yUHJvdG9faXMobSkpOwotICB9Ci0KLSAgc3RhdGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gZ2V0KCkgewotICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZURlc2NyaXB0b3JQcm90b19nZXQoJm0pOwotICAgIHJldHVybiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKG0sICZtKTsKLSAgfQotfTsKLQotY2xhc3MgU2VydmljZU9wdGlvbnMgOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSBwdWJsaWM6Ci0gIFNlcnZpY2VPcHRpb25zKGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgOiByZWZmZWRfcHRyKG0sIHJlZl9kb25vcikgewotICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9TZXJ2aWNlT3B0aW9uc19pcyhtKSk7Ci0gIH0KLQotICBzdGF0aWMgU2VydmljZU9wdGlvbnMgZ2V0KCkgewotICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfU2VydmljZU9wdGlvbnNfZ2V0KCZtKTsKLSAgICByZXR1cm4gU2VydmljZU9wdGlvbnMobSwgJm0pOwotICB9Ci19OwotCi1jbGFzcyBTb3VyY2VDb2RlSW5mbyA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotIHB1YmxpYzoKLSAgU291cmNlQ29kZUluZm8oY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX2lzKG0pKTsKLSAgfQotCi0gIHN0YXRpYyBTb3VyY2VDb2RlSW5mbyBnZXQoKSB7Ci0gICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9Tb3VyY2VDb2RlSW5mb19nZXQoJm0pOwotICAgIHJldHVybiBTb3VyY2VDb2RlSW5mbyhtLCAmbSk7Ci0gIH0KLQotICBjbGFzcyBMb2NhdGlvbiA6IHB1YmxpYyA6OnVwYjo6cmVmZmVkX3B0cjxjb25zdCA6OnVwYjo6TWVzc2FnZURlZj4gewotICAgcHVibGljOgotICAgIExvY2F0aW9uKGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtLCBjb25zdCB2b2lkICpyZWZfZG9ub3IgPSBOVUxMKQotICAgICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgICBhc3NlcnQodXBiZGVmc19nb29nbGVfcHJvdG9idWZfU291cmNlQ29kZUluZm9fTG9jYXRpb25faXMobSkpOwotICAgIH0KLQotICAgIHN0YXRpYyBMb2NhdGlvbiBnZXQoKSB7Ci0gICAgICBjb25zdCA6OnVwYjo6TWVzc2FnZURlZiogbSA9IHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2dldCgmbSk7Ci0gICAgICByZXR1cm4gTG9jYXRpb24obSwgJm0pOwotICAgIH0KLSAgfTsKLX07Ci0KLWNsYXNzIFVuaW50ZXJwcmV0ZWRPcHRpb24gOiBwdWJsaWMgOjp1cGI6OnJlZmZlZF9wdHI8Y29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWY+IHsKLSBwdWJsaWM6Ci0gIFVuaW50ZXJwcmV0ZWRPcHRpb24oY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICA6IHJlZmZlZF9wdHIobSwgcmVmX2Rvbm9yKSB7Ci0gICAgYXNzZXJ0KHVwYmRlZnNfZ29vZ2xlX3Byb3RvYnVmX1VuaW50ZXJwcmV0ZWRPcHRpb25faXMobSkpOwotICB9Ci0KLSAgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb24gZ2V0KCkgewotICAgIGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmKiBtID0gdXBiZGVmc19nb29nbGVfcHJvdG9idWZfVW5pbnRlcnByZXRlZE9wdGlvbl9nZXQoJm0pOwotICAgIHJldHVybiBVbmludGVycHJldGVkT3B0aW9uKG0sICZtKTsKLSAgfQotCi0gIGNsYXNzIE5hbWVQYXJ0IDogcHVibGljIDo6dXBiOjpyZWZmZWRfcHRyPGNvbnN0IDo6dXBiOjpNZXNzYWdlRGVmPiB7Ci0gICBwdWJsaWM6Ci0gICAgTmFtZVBhcnQoY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0sIGNvbnN0IHZvaWQgKnJlZl9kb25vciA9IE5VTEwpCi0gICAgICAgIDogcmVmZmVkX3B0cihtLCByZWZfZG9ub3IpIHsKLSAgICAgIGFzc2VydCh1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2lzKG0pKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgTmFtZVBhcnQgZ2V0KCkgewotICAgICAgY29uc3QgOjp1cGI6Ok1lc3NhZ2VEZWYqIG0gPSB1cGJkZWZzX2dvb2dsZV9wcm90b2J1Zl9VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2dldCgmbSk7Ci0gICAgICByZXR1cm4gTmFtZVBhcnQobSwgJm0pOwotICAgIH0KLSAgfTsKLX07Ci0KLX0gIC8qIG5hbWVzcGFjZSBwcm90b2J1ZiAqLwotfSAgLyogbmFtZXNwYWNlIGdvb2dsZSAqLwotfSAgLyogbmFtZXNwYWNlIHVwYmRlZnMgKi8KLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIFVQQl9ERVNDUklQVE9SX0RFU0NSSVBUT1JfUFJPVE9fVVBCX0hfICovCi0vKgotKiogSW50ZXJuYWwtb25seSBkZWZpbml0aW9ucyBmb3IgdGhlIGRlY29kZXIuCi0qLwotCi0jaWZuZGVmIFVQQl9ERUNPREVSX0lOVF9IXwotI2RlZmluZSBVUEJfREVDT0RFUl9JTlRfSF8KLQotLyoKLSoqIHVwYjo6cGI6OkRlY29kZXIKLSoqCi0qKiBBIGhpZ2ggcGVyZm9ybWFuY2UsIHN0cmVhbWluZywgcmVzdW1hYmxlIGRlY29kZXIgZm9yIHRoZSBiaW5hcnkgcHJvdG9idWYKLSoqIGZvcm1hdC4KLSoqCi0qKiBUaGlzIGludGVyZmFjZSB3b3JrcyB0aGUgc2FtZSByZWdhcmRsZXNzIG9mIHdoYXQgZGVjb2RlciBiYWNrZW5kIGlzIGJlaW5nCi0qKiB1c2VkLiAgQSBjbGllbnQgb2YgdGhpcyBjbGFzcyBkb2VzIG5vdCBuZWVkIHRvIGtub3cgd2hldGhlciBkZWNvZGluZyBpcyB1c2luZwotKiogYSBKSVR0ZWQgZGVjb2RlciAoRHluQVNNLCBMTFZNLCBldGMpIG9yIGFuIGludGVycHJldGVkIGRlY29kZXIuICBCeSBkZWZhdWx0LAotKiogaXQgd2lsbCBhbHdheXMgdXNlIHRoZSBmYXN0ZXN0IGF2YWlsYWJsZSBkZWNvZGVyLiAgSG93ZXZlciwgeW91IGNhbiBjYWxsCi0qKiBzZXRfYWxsb3dfaml0KGZhbHNlKSB0byBkaXNhYmxlIGFueSBKSVQgZGVjb2RlciB0aGF0IG1pZ2h0IGJlIGF2YWlsYWJsZS4KLSoqIFRoaXMgaXMgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KLSovCi0KLSNpZm5kZWYgVVBCX0RFQ09ERVJfSF8KLSNkZWZpbmUgVVBCX0RFQ09ERVJfSF8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWNsYXNzIENvZGVDYWNoZTsKLWNsYXNzIERlY29kZXI7Ci1jbGFzcyBEZWNvZGVyTWV0aG9kOwotY2xhc3MgRGVjb2Rlck1ldGhvZE9wdGlvbnM7Ci19ICAvKiBuYW1lc3BhY2UgcGIgKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLSNlbmRpZgotCi1VUEJfREVDTEFSRV9UWVBFKHVwYjo6cGI6OkNvZGVDYWNoZSwgdXBiX3BiY29kZWNhY2hlKQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OnBiOjpEZWNvZGVyLCB1cGJfcGJkZWNvZGVyKQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OnBiOjpEZWNvZGVyTWV0aG9kT3B0aW9ucywgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMpCi0KLVVQQl9ERUNMQVJFX0RFUklWRURfVFlQRSh1cGI6OnBiOjpEZWNvZGVyTWV0aG9kLCB1cGI6OlJlZkNvdW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3BiZGVjb2Rlcm1ldGhvZCwgdXBiX3JlZmNvdW50ZWQpCi0KLS8qIFRoZSBtYXhpbXVtIG51bWJlciBvZiBieXRlcyB3ZSBhcmUgcmVxdWlyZWQgdG8gYnVmZmVyIGludGVybmFsbHkgYmV0d2VlbgotICogY2FsbHMgdG8gdGhlIGRlY29kZXIuICBUaGUgdmFsdWUgaXMgMTQ6IGEgNSBieXRlIHVua25vd24gdGFnIHBsdXMgdGVuLWJ5dGUKLSAqIHZhcmludCwgbGVzcyBvbmUgYmVjYXVzZSB3ZSBhcmUgYnVmZmVyaW5nIGFuIGluY29tcGxldGUgdmFsdWUuCi0gKgotICogU2hvdWxkIG9ubHkgYmUgdXNlZCBieSB1bml0IHRlc3RzLiAqLwotI2RlZmluZSBVUEJfREVDT0RFUl9NQVhfUkVTSURVQUxfQllURVMgMTQKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFRoZSBwYXJhbWV0ZXJzIG9uZSB1c2VzIHRvIGNvbnN0cnVjdCBhIERlY29kZXJNZXRob2QuCi0gKiBUT0RPKGhhYmVybWFuKTogbW92ZSBhbGxvd2ppdCBoZXJlPyAgU2VlbXMgbW9yZSBjb252ZW5pZW50IGZvciB1c2Vycy4KLSAqIFRPRE8oaGFiZXJtYW4pOiBtb3ZlIHRoaXMgdG8gYmUgaGVhcCBhbGxvY2F0ZWQgZm9yIEFCSSBzdGFiaWxpdHkuICovCi1jbGFzcyB1cGI6OnBiOjpEZWNvZGVyTWV0aG9kT3B0aW9ucyB7Ci0gcHVibGljOgotICAvKiBQYXJhbWV0ZXIgcmVwcmVzZW50cyB0aGUgZGVzdGluYXRpb24gaGFuZGxlcnMgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIHB1c2gKLSAgICogdG8uICovCi0gIGV4cGxpY2l0IERlY29kZXJNZXRob2RPcHRpb25zKGNvbnN0IEhhbmRsZXJzKiBkZXN0X2hhbmRsZXJzKTsKLQotICAvKiBTaG91bGQgdGhlIGRlY29kZXIgcHVzaCBzdWJtZXNzYWdlcyB0byBsYXp5IGhhbmRsZXJzIGZvciBmaWVsZHMgdGhhdCBoYXZlCi0gICAqIHRoZW0/ICBUaGUgY2FsbGVyIHNob3VsZCBzZXQgdGhpcyBpZmYgdGhlIGxhenkgaGFuZGxlcnMgZXhwZWN0IGRhdGEgdGhhdCBpcwotICAgKiBpbiBwcm90b2J1ZiBiaW5hcnkgZm9ybWF0IGFuZCB0aGUgY2FsbGVyIHdpc2hlcyB0byBsYXp5IHBhcnNlIGl0LiAqLwotICB2b2lkIHNldF9sYXp5KGJvb2wgbGF6eSk7Ci0jZWxzZQotc3RydWN0IHVwYl9wYmRlY29kZXJtZXRob2RvcHRzIHsKLSNlbmRpZgotICBjb25zdCB1cGJfaGFuZGxlcnMgKmhhbmRsZXJzOwotICBib29sIGxhenk7Ci19OwotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogUmVwcmVzZW50cyB0aGUgY29kZSB0byBwYXJzZSBhIHByb3RvYnVmIGFjY29yZGluZyB0byBhIGRlc3RpbmF0aW9uCi0gKiBIYW5kbGVycy4gKi8KLWNsYXNzIHVwYjo6cGI6OkRlY29kZXJNZXRob2QgewotIHB1YmxpYzoKLSAgLyogSW5jbHVkZSBiYXNlIG1ldGhvZHMgZnJvbSB1cGI6OlJlZmVyZW5jZUNvdW50ZWQuICovCi0gIFVQQl9SRUZDT1VOVEVEX0NQUE1FVEhPRFMKLQotICAvKiBUaGUgZGVzdGluYXRpb24gaGFuZGxlcnMgdGhhdCBhcmUgc3RhdGljYWxseSBib3VuZCB0byB0aGlzIG1ldGhvZC4KLSAgICogVGhpcyBtZXRob2QgaXMgb25seSBjYXBhYmxlIG9mIG91dHB1dHRpbmcgdG8gYSBzaW5rIHRoYXQgdXNlcyB0aGVzZQotICAgKiBoYW5kbGVycy4gKi8KLSAgY29uc3QgSGFuZGxlcnMqIGRlc3RfaGFuZGxlcnMoKSBjb25zdDsKLQotICAvKiBUaGUgaW5wdXQgaGFuZGxlcnMgZm9yIHRoaXMgZGVjb2RlciBtZXRob2QuICovCi0gIGNvbnN0IEJ5dGVzSGFuZGxlciogaW5wdXRfaGFuZGxlcigpIGNvbnN0OwotCi0gIC8qIFdoZXRoZXIgdGhpcyBtZXRob2QgaXMgbmF0aXZlLiAqLwotICBib29sIGlzX25hdGl2ZSgpIGNvbnN0OwotCi0gIC8qIENvbnZlbmllbmNlIG1ldGhvZCBmb3IgZ2VuZXJhdGluZyBhIERlY29kZXJNZXRob2Qgd2l0aG91dCBleHBsaWNpdGx5Ci0gICAqIGNyZWF0aW5nIGEgQ29kZUNhY2hlLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxjb25zdCBEZWNvZGVyTWV0aG9kPiBOZXcoY29uc3QgRGVjb2Rlck1ldGhvZE9wdGlvbnMmIG9wdHMpOwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoRGVjb2Rlck1ldGhvZCwgdXBiOjpwYjo6RGVjb2Rlck1ldGhvZCkKLX07Ci0KLSNlbmRpZgotCi0vKiBQcmVhbGxvY2F0aW9uIGhpbnQ6IGRlY29kZXIgd29uJ3QgYWxsb2NhdGUgbW9yZSBieXRlcyB0aGFuIHRoaXMgd2hlbiBmaXJzdAotICogY29uc3RydWN0ZWQuICBUaGlzIGhpbnQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSBmb3Igc29tZSBidWlsZCBjb25maWd1cmF0aW9ucy4KLSAqIEJ1dCBpZiB0aGUgZGVjb2RlciBsaWJyYXJ5IGlzIHVwZ3JhZGVkIHdpdGhvdXQgcmVjb21waWxpbmcgdGhlIGFwcGxpY2F0aW9uLAotICogaXQgbWF5IGJlIGFuIHVuZGVyZXN0aW1hdGUuICovCi0jZGVmaW5lIFVQQl9QQl9ERUNPREVSX1NJWkUgNDQxNgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotLyogQSBEZWNvZGVyIHJlY2VpdmVzIGJpbmFyeSBwcm90b2J1ZiBkYXRhIG9uIGl0cyBpbnB1dCBzaW5rIGFuZCBwdXNoZXMgdGhlCi0gKiBkZWNvZGVkIGRhdGEgdG8gaXRzIG91dHB1dCBzaW5rLiAqLwotY2xhc3MgdXBiOjpwYjo6RGVjb2RlciB7Ci0gcHVibGljOgotICAvKiBDb25zdHJ1Y3RzIGEgZGVjb2RlciBpbnN0YW5jZSBmb3IgdGhlIGdpdmVuIG1ldGhvZCwgd2hpY2ggbXVzdCBvdXRsaXZlIHRoaXMKLSAgICogZGVjb2Rlci4gIEFueSBlcnJvcnMgZHVyaW5nIHBhcnNpbmcgd2lsbCBiZSBzZXQgb24gdGhlIGdpdmVuIHN0YXR1cywgd2hpY2gKLSAgICogbXVzdCBhbHNvIG91dGxpdmUgdGhpcyBkZWNvZGVyLgotICAgKgotICAgKiBUaGUgc2luayBtdXN0IG1hdGNoIHRoZSBnaXZlbiBtZXRob2QuICovCi0gIHN0YXRpYyBEZWNvZGVyKiBDcmVhdGUoRW52aXJvbm1lbnQqIGVudiwgY29uc3QgRGVjb2Rlck1ldGhvZCogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmsqIG91dHB1dCk7Ci0KLSAgLyogUmV0dXJucyB0aGUgRGVjb2Rlck1ldGhvZCB0aGlzIGRlY29kZXIgaXMgcGFyc2luZyBmcm9tLiAqLwotICBjb25zdCBEZWNvZGVyTWV0aG9kKiBtZXRob2QoKSBjb25zdDsKLQotICAvKiBUaGUgc2luayBvbiB3aGljaCB0aGlzIGRlY29kZXIgcmVjZWl2ZXMgaW5wdXQuICovCi0gIEJ5dGVzU2luayogaW5wdXQoKTsKLQotICAvKiBSZXR1cm5zIG51bWJlciBvZiBieXRlcyBzdWNjZXNzZnVsbHkgcGFyc2VkLgotICAgKgotICAgKiBUaGlzIGNhbiBiZSB1c2VmdWwgZm9yIGRldGVybWluaW5nIHRoZSBzdHJlYW0gcG9zaXRpb24gd2hlcmUgYW4gZXJyb3IKLSAgICogb2NjdXJyZWQuCi0gICAqCi0gICAqIFRoaXMgdmFsdWUgbWF5IG5vdCBiZSB1cC10by1kYXRlIHdoZW4gY2FsbGVkIGZyb20gaW5zaWRlIGEgcGFyc2luZwotICAgKiBjYWxsYmFjay4gKi8KLSAgdWludDY0X3QgQnl0ZXNQYXJzZWQoKSBjb25zdDsKLQotICAvKiBHZXRzL3NldHMgdGhlIHBhcnNpbmcgbmV4dGluZyBsaW1pdC4gIElmIHRoZSB0b3RhbCBudW1iZXIgb2YgbmVzdGVkCi0gICAqIHN1Ym1lc3NhZ2VzIGFuZCByZXBlYXRlZCBmaWVsZHMgaGl0cyB0aGlzIGxpbWl0LCBwYXJzaW5nIHdpbGwgZmFpbC4gIFRoaXMKLSAgICogaXMgYSByZXNvdXJjZSBsaW1pdCB0aGF0IGNvbnRyb2xzIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIHBhcnNpbmcKLSAgICogc3RhY2suCi0gICAqCi0gICAqIFNldHRpbmcgdGhlIGxpbWl0IHdpbGwgZmFpbCBpZiB0aGUgcGFyc2VyIGlzIGN1cnJlbnRseSBzdXNwZW5kZWQgYXQgYSBkZXB0aAotICAgKiBncmVhdGVyIHRoYW4gdGhpcywgb3IgaWYgbWVtb3J5IGFsbG9jYXRpb24gb2YgdGhlIHN0YWNrIGZhaWxzLiAqLwotICBzaXplX3QgbWF4X25lc3RpbmcoKSBjb25zdDsKLSAgYm9vbCBzZXRfbWF4X25lc3Rpbmcoc2l6ZV90IG1heCk7Ci0KLSAgdm9pZCBSZXNldCgpOwotCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga1NpemUgPSBVUEJfUEJfREVDT0RFUl9TSVpFOwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoRGVjb2RlciwgdXBiOjpwYjo6RGVjb2RlcikKLX07Ci0KLSNlbmRpZiAgLyogX19jcGx1c3BsdXMgKi8KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIEEgY2xhc3MgZm9yIGNhY2hpbmcgcHJvdG9idWYgcHJvY2Vzc2luZyBjb2RlLCB3aGV0aGVyIGJ5dGVjb2RlIGZvciB0aGUKLSAqIGludGVycHJldGVkIGRlY29kZXIgb3IgbWFjaGluZSBjb2RlIGZvciB0aGUgSklULgotICoKLSAqIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlLgotICoKLSAqIFRPRE8oaGFiZXJtYW4pOiBtb3ZlIHRoaXMgdG8gYmUgaGVhcCBhbGxvY2F0ZWQgZm9yIEFCSSBzdGFiaWxpdHkuICovCi1jbGFzcyB1cGI6OnBiOjpDb2RlQ2FjaGUgewotIHB1YmxpYzoKLSAgQ29kZUNhY2hlKCk7Ci0gIH5Db2RlQ2FjaGUoKTsKLQotICAvKiBXaGV0aGVyIHRoZSBjYWNoZSBpcyBhbGxvd2VkIHRvIGdlbmVyYXRlIG1hY2hpbmUgY29kZS4gIERlZmF1bHRzIHRvIHRydWUuCi0gICAqIFRoZXJlIGlzIG5vIHJlYWwgcmVhc29uIHRvIHR1cm4gaXQgb2ZmIGV4Y2VwdCBmb3IgdGVzdGluZyBvciBpZiB5b3UgYXJlCi0gICAqIGhhdmluZyBhIHNwZWNpZmljIHByb2JsZW0gd2l0aCB0aGUgSklULgotICAgKgotICAgKiBOb3RlIHRoYXQgYWxsb3dfaml0ID0gdHJ1ZSBkb2VzIG5vdCAqZ3VhcmFudGVlKiB0aGF0IHRoZSBjb2RlIHdpbGwgYmUgSklUCi0gICAqIGNvbXBpbGVkLiAgSWYgdGhpcyBwbGF0Zm9ybSBpcyBub3Qgc3VwcG9ydGVkIG9yIHRoZSBKSVQgd2FzIG5vdCBjb21waWxlZAotICAgKiBpbiwgdGhlIGNvZGUgbWF5IHN0aWxsIGJlIGludGVycHJldGVkLiAqLwotICBib29sIGFsbG93X2ppdCgpIGNvbnN0OwotCi0gIC8qIFRoaXMgbWF5IG9ubHkgYmUgY2FsbGVkIHdoZW4gdGhlIG9iamVjdCBpcyBmaXJzdCBjb25zdHJ1Y3RlZCwgYW5kIHByaW9yIHRvCi0gICAqIGFueSBjb2RlIGdlbmVyYXRpb24sIG90aGVyd2lzZSByZXR1cm5zIGZhbHNlIGFuZCBkb2VzIG5vdGhpbmcuICovCi0gIGJvb2wgc2V0X2FsbG93X2ppdChib29sIGFsbG93KTsKLQotICAvKiBSZXR1cm5zIGEgRGVjb2Rlck1ldGhvZCB0aGF0IGNhbiBwdXNoIGRhdGEgdG8gdGhlIGdpdmVuIGhhbmRsZXJzLgotICAgKiBJZiBhIHN1aXRhYmxlIG1ldGhvZCBhbHJlYWR5IGV4aXN0cywgaXQgd2lsbCBiZSByZXR1cm5lZCBmcm9tIHRoZSBjYWNoZS4KLSAgICoKLSAgICogU3BlY2lmeWluZyB0aGUgZGVzdGluYXRpb24gaGFuZGxlcnMgaGVyZSBhbGxvd3MgdGhlIERlY29kZXJNZXRob2QgdG8gYmUKLSAgICogc3RhdGljYWxseSBib3VuZCB0byB0aGUgZGVzdGluYXRpb24gaGFuZGxlcnMgaWYgcG9zc2libGUsIHdoaWNoIGNhbiBhbGxvdwotICAgKiBtb3JlIGVmZmljaWVudCBkZWNvZGluZy4gIEhvd2V2ZXIgdGhlIHJldHVybmVkIG1ldGhvZCBtYXkgb3IgbWF5IG5vdAotICAgKiBhY3R1YWxseSBiZSBzdGF0aWNhbGx5IGJvdW5kLiAgQnV0IGluIGFsbCBjYXNlcywgdGhlIHJldHVybmVkIG1ldGhvZCBjYW4KLSAgICogcHVzaCBkYXRhIHRvIHRoZSBnaXZlbiBoYW5kbGVycy4gKi8KLSAgY29uc3QgRGVjb2Rlck1ldGhvZCAqR2V0RGVjb2Rlck1ldGhvZChjb25zdCBEZWNvZGVyTWV0aG9kT3B0aW9ucyYgb3B0cyk7Ci0KLSAgLyogSWYvd2hlbiBzb21lb25lIG5lZWRzIHRvIGV4cGxpY2l0bHkgY3JlYXRlIGEgZHluYW1pY2FsbHktYm91bmQKLSAgICogRGVjb2Rlck1ldGhvZCosIHdlIGNhbiBhZGQgYSBtZXRob2QgdG8gZ2V0IGl0IGhlcmUuICovCi0KLSBwcml2YXRlOgotICBVUEJfRElTQUxMT1dfQ09QWV9BTkRfQVNTSUdOKENvZGVDYWNoZSkKLSNlbHNlCi1zdHJ1Y3QgdXBiX3BiY29kZWNhY2hlIHsKLSNlbmRpZgotICBib29sIGFsbG93X2ppdF87Ci0KLSAgLyogQXJyYXkgb2YgbWdyb3Vwcy4gKi8KLSAgdXBiX2ludHRhYmxlIGdyb3VwczsKLX07Ci0KLVVQQl9CRUdJTl9FWFRFUk5fQwotCi11cGJfcGJkZWNvZGVyICp1cGJfcGJkZWNvZGVyX2NyZWF0ZSh1cGJfZW52ICplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3NpbmsgKm91dHB1dCk7Ci1jb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICp1cGJfcGJkZWNvZGVyX21ldGhvZChjb25zdCB1cGJfcGJkZWNvZGVyICpkKTsKLXVwYl9ieXRlc3NpbmsgKnVwYl9wYmRlY29kZXJfaW5wdXQodXBiX3BiZGVjb2RlciAqZCk7Ci11aW50NjRfdCB1cGJfcGJkZWNvZGVyX2J5dGVzcGFyc2VkKGNvbnN0IHVwYl9wYmRlY29kZXIgKmQpOwotc2l6ZV90IHVwYl9wYmRlY29kZXJfbWF4bmVzdGluZyhjb25zdCB1cGJfcGJkZWNvZGVyICpkKTsKLWJvb2wgdXBiX3BiZGVjb2Rlcl9zZXRtYXhuZXN0aW5nKHVwYl9wYmRlY29kZXIgKmQsIHNpemVfdCBtYXgpOwotdm9pZCB1cGJfcGJkZWNvZGVyX3Jlc2V0KHVwYl9wYmRlY29kZXIgKmQpOwotCi12b2lkIHVwYl9wYmRlY29kZXJtZXRob2RvcHRzX2luaXQodXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKm9wdHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2hhbmRsZXJzICpoKTsKLXZvaWQgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHNfc2V0bGF6eSh1cGJfcGJkZWNvZGVybWV0aG9kb3B0cyAqb3B0cywgYm9vbCBsYXp5KTsKLQotCi0vKiBJbmNsdWRlIHJlZmNvdW50ZWQgbWV0aG9kcyBsaWtlIHVwYl9wYmRlY29kZXJtZXRob2RfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfcGJkZWNvZGVybWV0aG9kLCB1cGJfcGJkZWNvZGVybWV0aG9kX3VwY2FzdCkKLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfcGJkZWNvZGVybWV0aG9kX2Rlc3RoYW5kbGVycygKLSAgICBjb25zdCB1cGJfcGJkZWNvZGVybWV0aG9kICptKTsKLWNvbnN0IHVwYl9ieXRlc2hhbmRsZXIgKnVwYl9wYmRlY29kZXJtZXRob2RfaW5wdXRoYW5kbGVyKAotICAgIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKm0pOwotYm9vbCB1cGJfcGJkZWNvZGVybWV0aG9kX2lzbmF0aXZlKGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKm0pOwotY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqdXBiX3BiZGVjb2Rlcm1ldGhvZF9uZXcoCi0gICAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKm9wdHMsIGNvbnN0IHZvaWQgKm93bmVyKTsKLQotdm9pZCB1cGJfcGJjb2RlY2FjaGVfaW5pdCh1cGJfcGJjb2RlY2FjaGUgKmMpOwotdm9pZCB1cGJfcGJjb2RlY2FjaGVfdW5pbml0KHVwYl9wYmNvZGVjYWNoZSAqYyk7Ci1ib29sIHVwYl9wYmNvZGVjYWNoZV9hbGxvd2ppdChjb25zdCB1cGJfcGJjb2RlY2FjaGUgKmMpOwotYm9vbCB1cGJfcGJjb2RlY2FjaGVfc2V0YWxsb3dqaXQodXBiX3BiY29kZWNhY2hlICpjLCBib29sIGFsbG93KTsKLWNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKnVwYl9wYmNvZGVjYWNoZV9nZXRkZWNvZGVybWV0aG9kKAotICAgIHVwYl9wYmNvZGVjYWNoZSAqYywgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHMgKm9wdHMpOwotCi1VUEJfRU5EX0VYVEVSTl9DCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1uYW1lc3BhY2UgdXBiIHsKLQotbmFtZXNwYWNlIHBiIHsKLQotLyogc3RhdGljICovCi1pbmxpbmUgRGVjb2RlciogRGVjb2Rlcjo6Q3JlYXRlKEVudmlyb25tZW50KiBlbnYsIGNvbnN0IERlY29kZXJNZXRob2QqIG0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNpbmsqIHNpbmspIHsKLSAgcmV0dXJuIHVwYl9wYmRlY29kZXJfY3JlYXRlKGVudiwgbSwgc2luayk7Ci19Ci1pbmxpbmUgY29uc3QgRGVjb2Rlck1ldGhvZCogRGVjb2Rlcjo6bWV0aG9kKCkgY29uc3QgewotICByZXR1cm4gdXBiX3BiZGVjb2Rlcl9tZXRob2QodGhpcyk7Ci19Ci1pbmxpbmUgQnl0ZXNTaW5rKiBEZWNvZGVyOjppbnB1dCgpIHsKLSAgcmV0dXJuIHVwYl9wYmRlY29kZXJfaW5wdXQodGhpcyk7Ci19Ci1pbmxpbmUgdWludDY0X3QgRGVjb2Rlcjo6Qnl0ZXNQYXJzZWQoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfcGJkZWNvZGVyX2J5dGVzcGFyc2VkKHRoaXMpOwotfQotaW5saW5lIHNpemVfdCBEZWNvZGVyOjptYXhfbmVzdGluZygpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9wYmRlY29kZXJfbWF4bmVzdGluZyh0aGlzKTsKLX0KLWlubGluZSBib29sIERlY29kZXI6OnNldF9tYXhfbmVzdGluZyhzaXplX3QgbWF4KSB7Ci0gIHJldHVybiB1cGJfcGJkZWNvZGVyX3NldG1heG5lc3RpbmcodGhpcywgbWF4KTsKLX0KLWlubGluZSB2b2lkIERlY29kZXI6OlJlc2V0KCkgeyB1cGJfcGJkZWNvZGVyX3Jlc2V0KHRoaXMpOyB9Ci0KLWlubGluZSBEZWNvZGVyTWV0aG9kT3B0aW9uczo6RGVjb2Rlck1ldGhvZE9wdGlvbnMoY29uc3QgSGFuZGxlcnMqIGgpIHsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHNfaW5pdCh0aGlzLCBoKTsKLX0KLWlubGluZSB2b2lkIERlY29kZXJNZXRob2RPcHRpb25zOjpzZXRfbGF6eShib29sIGxhenkpIHsKLSAgdXBiX3BiZGVjb2Rlcm1ldGhvZG9wdHNfc2V0bGF6eSh0aGlzLCBsYXp5KTsKLX0KLQotaW5saW5lIGNvbnN0IEhhbmRsZXJzKiBEZWNvZGVyTWV0aG9kOjpkZXN0X2hhbmRsZXJzKCkgY29uc3QgewotICByZXR1cm4gdXBiX3BiZGVjb2Rlcm1ldGhvZF9kZXN0aGFuZGxlcnModGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgQnl0ZXNIYW5kbGVyKiBEZWNvZGVyTWV0aG9kOjppbnB1dF9oYW5kbGVyKCkgY29uc3QgewotICByZXR1cm4gdXBiX3BiZGVjb2Rlcm1ldGhvZF9pbnB1dGhhbmRsZXIodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBEZWNvZGVyTWV0aG9kOjppc19uYXRpdmUoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfcGJkZWNvZGVybWV0aG9kX2lzbmF0aXZlKHRoaXMpOwotfQotLyogc3RhdGljICovCi1pbmxpbmUgcmVmZmVkX3B0cjxjb25zdCBEZWNvZGVyTWV0aG9kPiBEZWNvZGVyTWV0aG9kOjpOZXcoCi0gICAgY29uc3QgRGVjb2Rlck1ldGhvZE9wdGlvbnMgJm9wdHMpIHsKLSAgY29uc3QgdXBiX3BiZGVjb2Rlcm1ldGhvZCAqbSA9IHVwYl9wYmRlY29kZXJtZXRob2RfbmV3KCZvcHRzLCAmbSk7Ci0gIHJldHVybiByZWZmZWRfcHRyPGNvbnN0IERlY29kZXJNZXRob2Q+KG0sICZtKTsKLX0KLQotaW5saW5lIENvZGVDYWNoZTo6Q29kZUNhY2hlKCkgewotICB1cGJfcGJjb2RlY2FjaGVfaW5pdCh0aGlzKTsKLX0KLWlubGluZSBDb2RlQ2FjaGU6On5Db2RlQ2FjaGUoKSB7Ci0gIHVwYl9wYmNvZGVjYWNoZV91bmluaXQodGhpcyk7Ci19Ci1pbmxpbmUgYm9vbCBDb2RlQ2FjaGU6OmFsbG93X2ppdCgpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9wYmNvZGVjYWNoZV9hbGxvd2ppdCh0aGlzKTsKLX0KLWlubGluZSBib29sIENvZGVDYWNoZTo6c2V0X2FsbG93X2ppdChib29sIGFsbG93KSB7Ci0gIHJldHVybiB1cGJfcGJjb2RlY2FjaGVfc2V0YWxsb3dqaXQodGhpcywgYWxsb3cpOwotfQotaW5saW5lIGNvbnN0IERlY29kZXJNZXRob2QgKkNvZGVDYWNoZTo6R2V0RGVjb2Rlck1ldGhvZCgKLSAgICBjb25zdCBEZWNvZGVyTWV0aG9kT3B0aW9ucyYgb3B0cykgewotICByZXR1cm4gdXBiX3BiY29kZWNhY2hlX2dldGRlY29kZXJtZXRob2QodGhpcywgJm9wdHMpOwotfQotCi19ICAvKiBuYW1lc3BhY2UgcGIgKi8KLX0gIC8qIG5hbWVzcGFjZSB1cGIgKi8KLQotI2VuZGlmICAvKiBfX2NwbHVzcGx1cyAqLwotCi0jZW5kaWYgIC8qIFVQQl9ERUNPREVSX0hfICovCi0KLS8qIEMrKyBuYW1lcyBhcmUgbm90IGFjdHVhbGx5IHVzZWQgc2luY2UgdGhpcyB0eXBlIGlzbid0IGV4cG9zZWQgdG8gdXNlcnMuICovCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWNsYXNzIE1lc3NhZ2VHcm91cDsKLX0gIC8qIG5hbWVzcGFjZSBwYiAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2VuZGlmCi1VUEJfREVDTEFSRV9ERVJJVkVEX1RZUEUodXBiOjpwYjo6TWVzc2FnZUdyb3VwLCB1cGI6OlJlZkNvdW50ZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgbWdyb3VwLCB1cGJfcmVmY291bnRlZCkKLQotLyogT3Bjb2RlIGRlZmluaXRpb25zLiAgVGhlIGNhbm9uaWNhbCBtZWFuaW5nIG9mIGVhY2ggb3Bjb2RlIGlzIGl0cwotICogaW1wbGVtZW50YXRpb24gaW4gdGhlIGludGVycHJldGVyICh0aGUgSklUIGlzIHdyaXR0ZW4gdG8gbWF0Y2ggdGhpcykuCi0gKgotICogQWxsIGluc3RydWN0aW9ucyBoYXZlIHRoZSBvcGNvZGUgaW4gdGhlIGxvdyBieXRlLgotICogSW5zdHJ1Y3Rpb24gZm9ybWF0IGZvciBtb3N0IGluc3RydWN0aW9ucyBpczoKLSAqCi0gKiArLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLSsKLSAqIHwgICAgIGFyZyAoMjQpICAgICAgfCBvcCAoOCkgfAotICogKy0tLS0tLS0tLS0tLS0tLS0tLS0rLS0tLS0tLS0rCi0gKgotICogRXhjZXB0aW9ucyBhcmUgaW5kaWNhdGVkIGJlbG93LiAgQSBmZXcgb3Bjb2RlcyBhcmUgbXVsdGktd29yZC4gKi8KLXR5cGVkZWYgZW51bSB7Ci0gIC8qIE9wY29kZXMgMS04LCAxMywgMTUtMTggcGFyc2UgdGhlaXIgcmVzcGVjdGl2ZSBkZXNjcmlwdG9yIHR5cGVzLgotICAgKiBBcmcgZm9yIGFsbCBvZiB0aGVzZSBpcyB0aGUgdXBiIHNlbGVjdG9yIGZvciB0aGlzIGZpZWxkLiAqLwotI2RlZmluZSBUKHR5cGUpIE9QX1BBUlNFXyAjIyB0eXBlID0gVVBCX0RFU0NSSVBUT1JfVFlQRV8gIyMgdHlwZQotICBUKERPVUJMRSksIFQoRkxPQVQpLCBUKElOVDY0KSwgVChVSU5UNjQpLCBUKElOVDMyKSwgVChGSVhFRDY0KSwgVChGSVhFRDMyKSwKLSAgVChCT09MKSwgVChVSU5UMzIpLCBUKFNGSVhFRDMyKSwgVChTRklYRUQ2NCksIFQoU0lOVDMyKSwgVChTSU5UNjQpLAotI3VuZGVmIFQKLSAgT1BfU1RBUlRNU0cgICAgICAgPSA5LCAgIC8qIE5vIGFyZy4gKi8KLSAgT1BfRU5ETVNHICAgICAgICAgPSAxMCwgIC8qIE5vIGFyZy4gKi8KLSAgT1BfU1RBUlRTRVEgICAgICAgPSAxMSwKLSAgT1BfRU5EU0VRICAgICAgICAgPSAxMiwKLSAgT1BfU1RBUlRTVUJNU0cgICAgPSAxNCwKLSAgT1BfRU5EU1VCTVNHICAgICAgPSAxOSwKLSAgT1BfU1RBUlRTVFIgICAgICAgPSAyMCwKLSAgT1BfU1RSSU5HICAgICAgICAgPSAyMSwKLSAgT1BfRU5EU1RSICAgICAgICAgPSAyMiwKLQotICBPUF9QVVNIVEFHREVMSU0gICA9IDIzLCAgLyogTm8gYXJnLiAqLwotICBPUF9QVVNITEVOREVMSU0gICA9IDI0LCAgLyogTm8gYXJnLiAqLwotICBPUF9QT1AgICAgICAgICAgICA9IDI1LCAgLyogTm8gYXJnLiAqLwotICBPUF9TRVRERUxJTSAgICAgICA9IDI2LCAgLyogTm8gYXJnLiAqLwotICBPUF9TRVRCSUdHUk9VUE5VTSA9IDI3LCAgLyogdHdvIHdvcmRzOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB8IHVudXNlZCAoMjQpICAgICB8IG9wYyAoOCkgfAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICogICB8ICAgICAgICBncm91cG51bSAoMzIpICAgICAgfCAqLwotICBPUF9DSEVDS0RFTElNICAgICA9IDI4LAotICBPUF9DQUxMICAgICAgICAgICA9IDI5LAotICBPUF9SRVQgICAgICAgICAgICA9IDMwLAotICBPUF9CUkFOQ0ggICAgICAgICA9IDMxLAotCi0gIC8qIERpZmZlcmVudCBvcGNvZGVzIGRlcGVuZGluZyBvbiBob3cgbWFueSBieXRlcyBleHBlY3RlZC4gKi8KLSAgT1BfVEFHMSAgICAgICAgICAgPSAzMiwgIC8qIHwgbWF0Y2ggdGFnICgxNikgfCBqdW1wIHRhcmdldCAoOCkgfCBvcGMgKDgpIHwgKi8KLSAgT1BfVEFHMiAgICAgICAgICAgPSAzMywgIC8qIHwgbWF0Y2ggdGFnICgxNikgfCBqdW1wIHRhcmdldCAoOCkgfCBvcGMgKDgpIHwgKi8KLSAgT1BfVEFHTiAgICAgICAgICAgPSAzNCwgIC8qIHRocmVlIHdvcmRzOiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICB8IHVudXNlZCAoMTYpIHwganVtcCB0YXJnZXQoOCkgfCBvcGMgKDgpIHwgKi8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICAgfCAgICAgICAgICAgbWF0Y2ggdGFnIDEgKDMyKSAgICAgICAgICAgICB8ICovCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgIHwgICAgICAgICAgIG1hdGNoIHRhZyAyICgzMikgICAgICAgICAgICAgfCAqLwotCi0gIE9QX1NFVERJU1BBVENIICAgID0gMzUsICAvKiBOIHdvcmRzOiAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICB8IHVudXNlZCAoMjQpICAgICAgICAgfCBvcGMgfCAqLwotICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogICB8IHVwYl9pbnR0YWJsZSogKDMyIG9yIDY0KSAgfCAqLwotCi0gIE9QX0RJU1BBVENIICAgICAgID0gMzYsICAvKiBObyBhcmcuICovCi0KLSAgT1BfSEFMVCAgICAgICAgICAgPSAzNyAgIC8qIE5vIGFyZy4gKi8KLX0gb3Bjb2RlOwotCi0jZGVmaW5lIE9QX01BWCBPUF9IQUxUCi0KLVVQQl9JTkxJTkUgb3Bjb2RlIGdldG9wKHVpbnQzMl90IGluc3RyKSB7IHJldHVybiBpbnN0ciAmIDB4ZmY7IH0KLQotLyogTWV0aG9kIGdyb3VwOyByZXByZXNlbnRzIGEgc2V0IG9mIGRlY29kZXIgbWV0aG9kcyB0aGF0IGhhZCB0aGVpciBjb2RlCi0gKiBlbWl0dGVkIHRvZ2V0aGVyLCBhbmQgbXVzdCB0aGVyZWZvcmUgYmUgZnJlZWQgdG9nZXRoZXIuICBJbW11dGFibGUgb25jZQotICogY3JlYXRlZC4gIEl0IGlzIHBvc3NpYmxlIHdlIG1heSB3YW50IHRvIGV4cG9zZSB0aGlzIHRvIHVzZXJzIGF0IHNvbWUgcG9pbnQuCi0gKgotICogT3ZlcmFsbCBvd25lcnNoaXAgb2YgRGVjb2RlciBvYmplY3RzIGxvb2tzIGxpa2UgdGhpczoKLSAqCi0gKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLSsKLSAqICAgICAgICAgICAgICAgIHwgICAgICAgICAgfCA8LS0tPiBEZWNvZGVyTWV0aG9kCi0gKiAgICAgICAgICAgICAgICB8IG1ldGhvZCAgIHwKLSAqIENvZGVDYWNoZSAtLS0+IHwgIGdyb3VwICAgfCA8LS0tPiBEZWNvZGVyTWV0aG9kCi0gKiAgICAgICAgICAgICAgICB8ICAgICAgICAgIHwKLSAqICAgICAgICAgICAgICAgIHwgKG1ncm91cCkgfCA8LS0tPiBEZWNvZGVyTWV0aG9kCi0gKiAgICAgICAgICAgICAgICArLS0tLS0tLS0tLSsKLSAqLwotc3RydWN0IG1ncm91cCB7Ci0gIHVwYl9yZWZjb3VudGVkIGJhc2U7Ci0KLSAgLyogTWFwcyB1cGJfbXNnZGVmL3VwYl9oYW5kbGVycyAtPiB1cGJfcGJkZWNvZGVybWV0aG9kLiAgV2Ugb3duIHJlZnMgb24gdGhlCi0gICAqIG1ldGhvZHMuICovCi0gIHVwYl9pbnR0YWJsZSBtZXRob2RzOwotCi0gIC8qIFdoZW4gd2UgYWRkIHRoZSBhYmlsaXR5IHRvIGxpbmsgdG8gcHJldmlvdXNseSBleGlzdGluZyBtZ3JvdXBzLCB3ZSdsbAotICAgKiBuZWVkIGFuIGFycmF5IG9mIG1ncm91cHMgd2UgcmVmZXJlbmNlIGhlcmUsIGFuZCBvd24gcmVmcyBvbiB0aGVtLiAqLwotCi0gIC8qIFRoZSBieXRlY29kZSBmb3Igb3VyIG1ldGhvZHMsIGlmIGFueSBleGlzdHMuICBPd25lZCBieSB1cy4gKi8KLSAgdWludDMyX3QgKmJ5dGVjb2RlOwotICB1aW50MzJfdCAqYnl0ZWNvZGVfZW5kOwotCi0jaWZkZWYgVVBCX1VTRV9KSVRfWDY0Ci0gIC8qIEpJVC1nZW5lcmF0ZWQgbWFjaGluZSBjb2RlLCBpZiBhbnkuICovCi0gIHVwYl9zdHJpbmdfaGFuZGxlcmZ1bmMgKmppdF9jb2RlOwotICAvKiBUaGUgc2l6ZSBvZiB0aGUgaml0X2NvZGUgKHJlcXVpcmVkIHRvIG11bm1hcCgpKS4gKi8KLSAgc2l6ZV90IGppdF9zaXplOwotICBjaGFyICpkZWJ1Z19pbmZvOwotICB2b2lkICpkbDsKLSNlbmRpZgotfTsKLQotLyogVGhlIG1heGltdW0gdGhhdCBhbnkgc3VibWVzc2FnZXMgY2FuIGJlIG5lc3RlZC4gIE1hdGNoZXMgcHJvdG8yJ3MgbGltaXQuCi0gKiBUaGlzIHNwZWNpZmllcyB0aGUgc2l6ZSBvZiB0aGUgZGVjb2RlcidzIHN0YXRpY2FsbHktc2l6ZWQgYXJyYXkgYW5kIHRoZXJlZm9yZQotICogc2V0dGluZyBpdCBoaWdoIHdpbGwgY2F1c2UgdGhlIHVwYjo6cGI6OkRlY29kZXIgb2JqZWN0IHRvIGJlIGxhcmdlci4KLSAqCi0gKiBJZiBuZWNlc3Nhcnkgd2UgY2FuIGFkZCBhIHJ1bnRpbWUtc2V0dGFibGUgcHJvcGVydHkgdG8gRGVjb2RlciB0aGF0IGFsbG93Ci0gKiB0aGlzIHRvIGJlIGxhcmdlciB0aGFuIHRoZSBjb21waWxlLXRpbWUgc2V0dGluZywgYnV0IHRoaXMgd291bGQgYWRkCi0gKiBjb21wbGV4aXR5LCBwYXJ0aWN1bGFybHkgc2luY2Ugd2Ugd291bGQgaGF2ZSB0byBkZWNpZGUgaG93L2lmIHRvIGdpdmUgdXNlcnMKLSAqIHRoZSBhYmlsaXR5IHRvIHNldCBhIGN1c3RvbSBtZW1vcnkgYWxsb2NhdGlvbiBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgVVBCX0RFQ09ERVJfTUFYX05FU1RJTkcgNjQKLQotLyogSW50ZXJuYWwtb25seSBzdHJ1Y3QgdXNlZCBieSB0aGUgZGVjb2Rlci4gKi8KLXR5cGVkZWYgc3RydWN0IHsKLSAgLyogU3BhY2Ugb3B0aW1pemF0aW9uIG5vdGU6IHdlIHN0b3JlIHR3byBwb2ludGVycyBoZXJlIHRoYXQgdGhlIEpJVAotICAgKiBkb2Vzbid0IG5lZWQgYXQgYWxsOyB0aGUgdXBiX2hhbmRsZXJzKiBpbnNpZGUgdGhlIHNpbmsgYW5kCi0gICAqIHRoZSBkaXNwYXRjaCB0YWJsZSBwb2ludGVyLiAgV2UgY2FuIG9wdGltemUgc28gdGhhdCB0aGUgSklUIHVzZXMKLSAgICogc21hbGxlciBzdGFjayBmcmFtZXMgdGhhbiB0aGUgaW50ZXJwcmV0ZXIuICBUaGUgb25seSB0aGluZyB3ZSBuZWVkCi0gICAqIHRvIGd1YXJhbnRlZSBpcyB0aGF0IHRoZSBmYWxsYmFjayByb3V0aW5lcyBjYW4gZmluZCBlbmRfb2ZzLiAqLwotICB1cGJfc2luayBzaW5rOwotCi0gIC8qIFRoZSBhYnNvbHV0ZSBzdHJlYW0gb2Zmc2V0IG9mIHRoZSBlbmQtb2YtZnJhbWUgZGVsaW1pdGVyLgotICAgKiBOb24tZGVsaW1pdGVkIGZyYW1lcyAoZ3JvdXBzIGFuZCBub24tcGFja2VkIHJlcGVhdGVkIGZpZWxkcykgcmV1c2UgdGhlCi0gICAqIGRlbGltaXRlciBvZiB0aGVpciBwYXJlbnQsIGV2ZW4gdGhvdWdoIHRoZSBmcmFtZSBtYXkgbm90IGVuZCB0aGVyZS4KLSAgICoKLSAgICogTk9URTogdGhlIEpJVCBzdG9yZXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgdmFsdWUgaGVyZSBmb3Igbm9uLXRvcCBmcmFtZXMuCi0gICAqIEl0IHN0b3JlcyB0aGUgdmFsdWUgcmVsYXRpdmUgdG8gdGhlIGVuZCBvZiB0aGUgZW5jbG9zZWQgbWVzc2FnZS4gIEJ1dCB0aGUKLSAgICogdG9wIGZyYW1lIGlzIHN0aWxsIHN0b3JlZCB0aGUgc2FtZSB3YXksIHdoaWNoIGlzIGltcG9ydGFudCBmb3IgZW5zdXJpbmcKLSAgICogdGhhdCBjYWxscyBmcm9tIHRoZSBKSVQgaW50byBDIHdvcmsgY29ycmVjdGx5LiAqLwotICB1aW50NjRfdCBlbmRfb2ZzOwotICBjb25zdCB1aW50MzJfdCAqYmFzZTsKLQotICAvKiAwIGluZGljYXRlcyBhIGxlbmd0aC1kZWxpbWl0ZWQgZmllbGQuCi0gICAqIEEgcG9zaXRpdmUgbnVtYmVyIGluZGljYXRlcyBhIGtub3duIGdyb3VwLgotICAgKiBBIG5lZ2F0aXZlIG51bWJlciBpbmRpY2F0ZXMgYW4gdW5rbm93biBncm91cC4gKi8KLSAgaW50MzJfdCBncm91cG51bTsKLSAgdXBiX2ludHRhYmxlICpkaXNwYXRjaDsgIC8qIE5vdCB1c2VkIGJ5IHRoZSBKSVQuICovCi19IHVwYl9wYmRlY29kZXJfZnJhbWU7Ci0KLXN0cnVjdCB1cGJfcGJkZWNvZGVybWV0aG9kIHsKLSAgdXBiX3JlZmNvdW50ZWQgYmFzZTsKLQotICAvKiBXaGlsZSBjb21waWxpbmcsIHRoZSBiYXNlIGlzIHJlbGF0aXZlIGluICJvZnMiLCBhZnRlciBjb21waWxpbmcgaXQgaXMKLSAgICogYWJzb2x1dGUgaW4gInB0ciIuICovCi0gIHVuaW9uIHsKLSAgICB1aW50MzJfdCBvZnM7ICAgICAvKiBQQyBvZmZzZXQgb2YgbWV0aG9kLiAqLwotICAgIHZvaWQgKnB0cjsgICAgICAgIC8qIFBvaW50ZXIgdG8gYnl0ZWNvZGUgb3IgbWFjaGluZSBjb2RlIGZvciB0aGlzIG1ldGhvZC4gKi8KLSAgfSBjb2RlX2Jhc2U7Ci0KLSAgLyogVGhlIGRlY29kZXIgbWV0aG9kIGdyb3VwIHRvIHdoaWNoIHRoaXMgbWV0aG9kIGJlbG9uZ3MuICBXZSBvd24gYSByZWYuCi0gICAqIE93bmluZyBhIHJlZiBvbiB0aGUgZW50aXJlIGdyb3VwIGlzIG1vcmUgY29hcnNlLWdyYWluZWQgdGhhbiBpcyBzdHJpY3RseQotICAgKiBuZWNlc3Nhcnk7IGFsbCB3ZSB0cnVseSByZXF1aXJlIGlzIHRoYXQgbWV0aG9kcyB3ZSBkaXJlY3RseSByZWZlcmVuY2UKLSAgICogb3V0bGl2ZSB1cywgd2hpbGUgdGhlIGdyb3VwIGNvdWxkIGNvbnRhaW4gbWFueSBvdGhlciBtZXNzYWdlcyB3ZSBkb24ndAotICAgKiByZXF1aXJlLiAgQnV0IHRoZSBncm91cCByZXByZXNlbnRzIHRoZSBtZXNzYWdlcyB0aGF0IHdlcmUKLSAgICogYWxsb2NhdGVkK2NvbXBpbGVkIHRvZ2V0aGVyLCBzbyBpdCBtYWtlcyB0aGUgbW9zdCBzZW5zZSB0byBmcmVlIHRoZW0KLSAgICogdG9nZXRoZXIgYWxzby4gKi8KLSAgY29uc3QgdXBiX3JlZmNvdW50ZWQgKmdyb3VwOwotCi0gIC8qIFdoZXRoZXIgdGhpcyBtZXRob2QgaXMgbmF0aXZlIGNvZGUgb3IgYnl0ZWNvZGUuICovCi0gIGJvb2wgaXNfbmF0aXZlXzsKLQotICAvKiBUaGUgaGFuZGxlciBvbmUgY2FsbHMgdG8gaW52b2tlIHRoaXMgbWV0aG9kLiAqLwotICB1cGJfYnl0ZXNoYW5kbGVyIGlucHV0X2hhbmRsZXJfOwotCi0gIC8qIFRoZSBkZXN0aW5hdGlvbiBoYW5kbGVycyB0aGlzIG1ldGhvZCBpcyBib3VuZCB0by4gIFdlIG93biBhIHJlZi4gKi8KLSAgY29uc3QgdXBiX2hhbmRsZXJzICpkZXN0X2hhbmRsZXJzXzsKLQotICAvKiBEaXNwYXRjaCB0YWJsZSAtLSB1c2VkIGJ5IGJvdGggYnl0ZWNvZGUgZGVjb2RlciBhbmQgSklUIHdoZW4gZW5jb3VudGVyaW5nIGEKLSAgICogZmllbGQgbnVtYmVyIHRoYXQgd2Fzbid0IHRoZSBvbmUgd2Ugd2VyZSBleHBlY3RpbmcgdG8gc2VlLiAgU2VlCi0gICAqIGRlY29kZXIuaW50LmggZm9yIHRoZSBsYXlvdXQgb2YgdGhpcyB0YWJsZS4gKi8KLSAgdXBiX2ludHRhYmxlIGRpc3BhdGNoOwotfTsKLQotc3RydWN0IHVwYl9wYmRlY29kZXIgewotICB1cGJfZW52ICplbnY7Ci0KLSAgLyogT3VyIGlucHV0IHNpbmsuICovCi0gIHVwYl9ieXRlc3NpbmsgaW5wdXRfOwotCi0gIC8qIFRoZSBkZWNvZGVyIG1ldGhvZCB3ZSBhcmUgcGFyc2luZyB3aXRoIChvd25lZCkuICovCi0gIGNvbnN0IHVwYl9wYmRlY29kZXJtZXRob2QgKm1ldGhvZF87Ci0KLSAgc2l6ZV90IGNhbGxfbGVuOwotICBjb25zdCB1aW50MzJfdCAqcGMsICpsYXN0OwotCi0gIC8qIEN1cnJlbnQgaW5wdXQgYnVmZmVyIGFuZCBpdHMgc3RyZWFtIG9mZnNldC4gKi8KLSAgY29uc3QgY2hhciAqYnVmLCAqcHRyLCAqZW5kLCAqY2hlY2twb2ludDsKLQotICAvKiBFbmQgb2YgdGhlIGRlbGltaXRlZCByZWdpb24sIHJlbGF0aXZlIHRvIHB0ciwgTlVMTCBpZiBub3QgaW4gdGhpcyBidWYuICovCi0gIGNvbnN0IGNoYXIgKmRlbGltX2VuZDsKLQotICAvKiBFbmQgb2YgdGhlIGRlbGltaXRlZCByZWdpb24sIHJlbGF0aXZlIHRvIHB0ciwgZW5kIGlmIG5vdCBpbiB0aGlzIGJ1Zi4gKi8KLSAgY29uc3QgY2hhciAqZGF0YV9lbmQ7Ci0KLSAgLyogT3ZlcmFsbCBzdHJlYW0gb2Zmc2V0IG9mICJidWYuIiAqLwotICB1aW50NjRfdCBidWZzdGFydF9vZnM7Ci0KLSAgLyogQnVmZmVyIGZvciByZXNpZHVhbCBieXRlcyBub3QgcGFyc2VkIGZyb20gdGhlIHByZXZpb3VzIGJ1ZmZlci4gKi8KLSAgY2hhciByZXNpZHVhbFtVUEJfREVDT0RFUl9NQVhfUkVTSURVQUxfQllURVNdOwotICBjaGFyICpyZXNpZHVhbF9lbmQ7Ci0KLSAgLyogQnl0ZXMgb2YgZGF0YSB0aGF0IHNob3VsZCBiZSBkaXNjYXJkZWQgZnJvbSB0aGUgaW5wdXQgYmVvcmUgd2Ugc3RhcnQKLSAgICogcGFyc2luZyBhZ2Fpbi4gIFdlIHNldCB0aGlzIHdoZW4gd2UgaW50ZXJuYWxseSBkZXRlcm1pbmUgdGhhdCB3ZSBjYW4KLSAgICogc2FmZWx5IHNraXAgdGhlIG5leHQgTiBieXRlcywgYnV0IHRoaXMgcmVnaW9uIGV4dGVuZHMgcGFzdCB0aGUgY3VycmVudAotICAgKiB1c2VyIGJ1ZmZlci4gKi8KLSAgc2l6ZV90IHNraXA7Ci0KLSAgLyogU3RvcmVzIHRoZSB1c2VyIGJ1ZmZlciBwYXNzZWQgdG8gb3VyIGRlY29kZSBmdW5jdGlvbi4gKi8KLSAgY29uc3QgY2hhciAqYnVmX3BhcmFtOwotICBzaXplX3Qgc2l6ZV9wYXJhbTsKLSAgY29uc3QgdXBiX2J1ZmhhbmRsZSAqaGFuZGxlOwotCi0gIC8qIE91ciBpbnRlcm5hbCBzdGFjay4gKi8KLSAgdXBiX3BiZGVjb2Rlcl9mcmFtZSAqc3RhY2ssICp0b3AsICpsaW1pdDsKLSAgY29uc3QgdWludDMyX3QgKipjYWxsc3RhY2s7Ci0gIHNpemVfdCBzdGFja19zaXplOwotCi0gIHVwYl9zdGF0dXMgKnN0YXR1czsKLQotI2lmZGVmIFVQQl9VU0VfSklUX1g2NAotICAvKiBVc2VkIG1vbWVudGFyaWx5IGJ5IHRoZSBnZW5lcmF0ZWQgY29kZSB0byBzdG9yZSBhIHZhbHVlIHdoaWxlIGEgdXNlcgotICAgKiBmdW5jdGlvbiBpcyBjYWxsZWQuICovCi0gIHVpbnQzMl90IHRtcF9sZW47Ci0KLSAgY29uc3Qgdm9pZCAqc2F2ZWRfcnNwOwotI2VuZGlmCi19OwotCi0vKiBEZWNvZGVyIGVudHJ5IHBvaW50czsgdXNlZCBhcyBoYW5kbGVycy4gKi8KLXZvaWQgKnVwYl9wYmRlY29kZXJfc3RhcnRiYyh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpwYywgc2l6ZV90IHNpemVfaGludCk7Ci12b2lkICp1cGJfcGJkZWNvZGVyX3N0YXJ0aml0KHZvaWQgKmNsb3N1cmUsIGNvbnN0IHZvaWQgKmhkLCBzaXplX3Qgc2l6ZV9oaW50KTsKLXNpemVfdCB1cGJfcGJkZWNvZGVyX2RlY29kZSh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoZCwgY29uc3QgY2hhciAqYnVmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpOwotYm9vbCB1cGJfcGJkZWNvZGVyX2VuZCh2b2lkICpjbG9zdXJlLCBjb25zdCB2b2lkICpoYW5kbGVyX2RhdGEpOwotCi0vKiBEZWNvZGVyLWludGVybmFsIGZ1bmN0aW9ucyB0aGF0IHRoZSBKSVQgY2FsbHMgdG8gaGFuZGxlIGZhbGxiYWNrIHBhdGhzLiAqLwotaW50MzJfdCB1cGJfcGJkZWNvZGVyX3Jlc3VtZSh1cGJfcGJkZWNvZGVyICpkLCB2b2lkICpwLCBjb25zdCBjaGFyICpidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplLCBjb25zdCB1cGJfYnVmaGFuZGxlICpoYW5kbGUpOwotc2l6ZV90IHVwYl9wYmRlY29kZXJfc3VzcGVuZCh1cGJfcGJkZWNvZGVyICpkKTsKLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9za2lwdW5rbm93bih1cGJfcGJkZWNvZGVyICpkLCBpbnQzMl90IGZpZWxkbnVtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4X3Qgd2lyZV90eXBlKTsKLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9jaGVja3RhZ19zbG93KHVwYl9wYmRlY29kZXIgKmQsIHVpbnQ2NF90IGV4cGVjdGVkKTsKLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9kZWNvZGVfdmFyaW50X3Nsb3codXBiX3BiZGVjb2RlciAqZCwgdWludDY0X3QgKnU2NCk7Ci1pbnQzMl90IHVwYl9wYmRlY29kZXJfZGVjb2RlX2YzMih1cGJfcGJkZWNvZGVyICpkLCB1aW50MzJfdCAqdTMyKTsKLWludDMyX3QgdXBiX3BiZGVjb2Rlcl9kZWNvZGVfZjY0KHVwYl9wYmRlY29kZXIgKmQsIHVpbnQ2NF90ICp1NjQpOwotdm9pZCB1cGJfcGJkZWNvZGVyX3NldGVycih1cGJfcGJkZWNvZGVyICpkLCBjb25zdCBjaGFyICptc2cpOwotCi0vKiBFcnJvciBtZXNzYWdlcyB0aGF0IGFyZSBzaGFyZWQgYmV0d2VlbiB0aGUgYnl0ZWNvZGUgYW5kIEpJVCBkZWNvZGVycy4gKi8KLWV4dGVybiBjb25zdCBjaGFyICprUGJEZWNvZGVyU3RhY2tPdmVyZmxvdzsKLWV4dGVybiBjb25zdCBjaGFyICprUGJEZWNvZGVyU3VibWVzc2FnZVRvb0xvbmc7Ci0KLS8qIEFjY2VzcyB0byBkZWNvZGVycGxhbiBtZW1iZXJzIG5lZWRlZCBieSB0aGUgZGVjb2Rlci4gKi8KLWNvbnN0IGNoYXIgKnVwYl9wYmRlY29kZXJfZ2V0b3BuYW1lKHVuc2lnbmVkIGludCBvcCk7Ci0KLS8qIEpJVCBjb2RlZ2VuIGVudHJ5IHBvaW50LiAqLwotdm9pZCB1cGJfcGJkZWNvZGVyX2ppdChtZ3JvdXAgKmdyb3VwKTsKLXZvaWQgdXBiX3BiZGVjb2Rlcl9mcmVlaml0KG1ncm91cCAqZ3JvdXApOwotVVBCX1JFRkNPVU5URURfQ01FVEhPRFMobWdyb3VwLCBtZ3JvdXBfdXBjYXN0KQotCi0vKiBBIHNwZWNpYWwgbGFiZWwgdGhhdCBtZWFucyAiZG8gZmllbGQgZGlzcGF0Y2ggZm9yIHRoaXMgbWVzc2FnZSBhbmQgYnJhbmNoIHRvCi0gKiB3aGVyZXZlciB0aGF0IHRha2VzIHlvdS4iICovCi0jZGVmaW5lIExBQkVMX0RJU1BBVENIIDAKLQotLyogQSBzcGVjaWFsIHNsb3QgaW4gdGhlIGRpc3BhdGNoIHRhYmxlIHRoYXQgc3RvcmVzIHRoZSBlcGlsb2d1ZSAoRU5ETVNHIGFuZC9vcgotICogUkVUKSBmb3IgYnJhbmNoaW5nIHRvIHdoZW4gd2UgZmluZCBhbiBhcHByb3ByaWF0ZSBFTkRHUk9VUCB0YWcuICovCi0jZGVmaW5lIERJU1BBVENIX0VORE1TRyAwCi0KLS8qIEl0J3MgaW1wb3J0YW50IHRvIHVzZSB0aGlzIGludmFsaWQgd2lyZSB0eXBlIGluc3RlYWQgb2YgMCAod2hpY2ggaXMgYSB2YWxpZAotICogd2lyZSB0eXBlKS4gKi8KLSNkZWZpbmUgTk9fV0lSRV9UWVBFIDB4ZmYKLQotLyogVGhlIGRpc3BhdGNoIHRhYmxlIGxheW91dCBpczoKLSAqICAgW2ZpZWxkIG51bWJlcl0gLT4gWyA0OC1iaXQgb2Zmc2V0IF1bIDgtYml0IHd0MiBdWyA4LWJpdCB3dDEgXQotICoKLSAqIElmIHd0MSBtYXRjaGVzLCBqdW1wIHRvIHRoZSA0OC1iaXQgb2Zmc2V0LiAgSWYgd3QyIG1hdGNoZXMsIGxvb2t1cAotICogKFVQQl9NQVhfRklFTEROVU1CRVIgKyBmaWVsZG51bSkgYW5kIGp1bXAgdGhlcmUuCi0gKgotICogV2UgbmVlZCB0d28gd2lyZSB0eXBlcyBiZWNhdXNlIG9mIHBhY2tlZC9ub24tcGFja2VkIGNvbXBhdGliaWxpdHkuICBBCi0gKiBwcmltaXRpdmUgcmVwZWF0ZWQgZmllbGQgY2FuIHVzZSBlaXRoZXIgd2lyZSB0eXBlIGFuZCBiZSB2YWxpZC4gIFdoaWxlIHdlCi0gKiBjb3VsZCBrZXkgdGhlIHRhYmxlIG9uIGZpZWxkbnVtK3dpcmV0eXBlLCB0aGUgdGFibGUgd291bGQgYmUgOHggc3BhcnNlci4KLSAqCi0gKiBTdG9yaW5nIHR3byB3aXJlIHR5cGVzIGluIHRoZSBwcmltYXJ5IHZhbHVlIGFsbG93cyB1cyB0byBxdWlja2x5IHJ1bGUgb3V0Ci0gKiB0aGUgc2Vjb25kIHdpcmUgdHlwZSB3aXRob3V0IG5lZWRpbmcgdG8gZG8gYSBzZXBhcmF0ZSBsb29rdXAgKHRoaXMgY2FzZSBpcwotICogbGVzcyBjb21tb24gdGhhbiBhbiB1bmtub3duIGZpZWxkKS4gKi8KLVVQQl9JTkxJTkUgdWludDY0X3QgdXBiX3BiZGVjb2Rlcl9wYWNrZGlzcGF0Y2godWludDY0X3Qgb2ZzLCB1aW50OF90IHd0MSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDhfdCB3dDIpIHsKLSAgcmV0dXJuIChvZnMgPDwgMTYpIHwgKHd0MiA8PCA4KSB8IHd0MTsKLX0KLQotVVBCX0lOTElORSB2b2lkIHVwYl9wYmRlY29kZXJfdW5wYWNrZGlzcGF0Y2godWludDY0X3QgZGlzcGF0Y2gsIHVpbnQ2NF90ICpvZnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90ICp3dDEsIHVpbnQ4X3QgKnd0MikgewotICAqd3QxID0gKHVpbnQ4X3QpZGlzcGF0Y2g7Ci0gICp3dDIgPSAodWludDhfdCkoZGlzcGF0Y2ggPj4gOCk7Ci0gICpvZnMgPSBkaXNwYXRjaCA+PiAxNjsKLX0KLQotLyogQWxsIG9mIHRoZSBmdW5jdGlvbnMgaW4gZGVjb2Rlci5jIHRoYXQgcmV0dXJuIGludDMyX3QgcmV0dXJuIHZhbHVlcyBhY2NvcmRpbmcKLSAqIHRvIHRoZSBmb2xsb3dpbmcgc2NoZW1lOgotICogICAxLiBuZWdhdGl2ZSB2YWx1ZXMgaW5kaWNhdGUgYSByZXR1cm4gY29kZSBmcm9tIHRoZSBmb2xsb3dpbmcgbGlzdC4KLSAqICAgMi4gcG9zaXRpdmUgdmFsdWVzIGluZGljYXRlIHRoYXQgZXJyb3Igb3IgZW5kIG9mIGJ1ZmZlciB3YXMgaGl0LCBhbmQKLSAqICAgICAgdGhhdCB0aGUgZGVjb2RlIGZ1bmN0aW9uIHNob3VsZCBpbW1lZGlhdGVseSByZXR1cm4gdGhlIGdpdmVuIHZhbHVlCi0gKiAgICAgICh0aGUgZGVjb2RlciBzdGF0ZSBoYXMgYWxyZWFkeSBiZWVuIHN1c3BlbmRlZCBhbmQgaXMgcmVhZHkgdG8gYmUKLSAqICAgICAgcmVzdW1lZCkuICovCi0jZGVmaW5lIERFQ09ERV9PSyAtMQotI2RlZmluZSBERUNPREVfTUlTTUFUQ0ggLTIgIC8qIFVzZWQgb25seSBmcm9tIGNoZWNrdGFnX3Nsb3coKS4gKi8KLSNkZWZpbmUgREVDT0RFX0VOREdST1VQIC0zICAvKiBVc2VkIG9ubHkgZnJvbSBjaGVja3Vua25vd24oKS4gKi8KLQotI2RlZmluZSBDSEVDS19SRVRVUk4oeCkgeyBpbnQzMl90IHJldCA9IHg7IGlmIChyZXQgPj0gMCkgcmV0dXJuIHJldDsgfQotCi0jZW5kaWYgIC8qIFVQQl9ERUNPREVSX0lOVF9IXyAqLwotLyoKLSoqIEEgbnVtYmVyIG9mIHJvdXRpbmVzIGZvciB2YXJpbnQgbWFuaXB1bGF0aW9uICh3ZSBrZWVwIHRoZW0gYWxsIGFyb3VuZCB0bwotKiogaGF2ZSBtdWx0aXBsZSBhcHByb2FjaGVzIGF2YWlsYWJsZSBmb3IgYmVuY2htYXJraW5nKS4KLSovCi0KLSNpZm5kZWYgVVBCX1ZBUklOVF9ERUNPREVSX0hfCi0jZGVmaW5lIFVQQl9WQVJJTlRfREVDT0RFUl9IXwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkaW50Lmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotZXh0ZXJuICJDIiB7Ci0jZW5kaWYKLQotLyogQSBsaXN0IG9mIHR5cGVzIGFzIHRoZXkgYXJlIGVuY29kZWQgb24tdGhlLXdpcmUuICovCi10eXBlZGVmIGVudW0gewotICBVUEJfV0lSRV9UWVBFX1ZBUklOVCAgICAgID0gMCwKLSAgVVBCX1dJUkVfVFlQRV82NEJJVCAgICAgICA9IDEsCi0gIFVQQl9XSVJFX1RZUEVfREVMSU1JVEVEICAgPSAyLAotICBVUEJfV0lSRV9UWVBFX1NUQVJUX0dST1VQID0gMywKLSAgVVBCX1dJUkVfVFlQRV9FTkRfR1JPVVAgICA9IDQsCi0gIFVQQl9XSVJFX1RZUEVfMzJCSVQgICAgICAgPSA1Ci19IHVwYl93aXJldHlwZV90OwotCi0jZGVmaW5lIFVQQl9NQVhfV0lSRV9UWVBFIDUKLQotLyogVGhlIG1heGltdW0gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaXQgdGFrZXMgdG8gZW5jb2RlIGEgNjQtYml0IHZhcmludC4KLSAqIE5vdGUgdGhhdCB3aXRoIGEgYmV0dGVyIGVuY29kaW5nIHRoaXMgY291bGQgYmUgOSAoVE9ETzogd3JpdGUgdXAgYQotICogd2lraSBkb2N1bWVudCBhYm91dCB0aGlzKS4gKi8KLSNkZWZpbmUgVVBCX1BCX1ZBUklOVF9NQVhfTEVOIDEwCi0KLS8qIEFycmF5IG9mIHRoZSAibmF0aXZlIiAoaWUuIG5vbi1wYWNrZWQtcmVwZWF0ZWQpIHdpcmUgdHlwZSBmb3IgdGhlIGdpdmVuIGEKLSAqIGRlc2NyaXB0b3IgdHlwZSAodXBiX2Rlc2NyaXB0b3J0eXBlX3QpLiAqLwotZXh0ZXJuIGNvbnN0IHVpbnQ4X3QgdXBiX3BiX25hdGl2ZV93aXJlX3R5cGVzW107Ci0KLS8qIFppZy16YWcgZW5jb2RpbmcvZGVjb2RpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLVVQQl9JTkxJTkUgaW50MzJfdCB1cGJfenpkZWNfMzIodWludDMyX3QgbikgewotICByZXR1cm4gKG4gPj4gMSkgXiAtKGludDMyX3QpKG4gJiAxKTsKLX0KLVVQQl9JTkxJTkUgaW50NjRfdCB1cGJfenpkZWNfNjQodWludDY0X3QgbikgewotICByZXR1cm4gKG4gPj4gMSkgXiAtKGludDY0X3QpKG4gJiAxKTsKLX0KLVVQQl9JTkxJTkUgdWludDMyX3QgdXBiX3p6ZW5jXzMyKGludDMyX3QgbikgeyByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiAzMSk7IH0KLVVQQl9JTkxJTkUgdWludDY0X3QgdXBiX3p6ZW5jXzY0KGludDY0X3QgbikgeyByZXR1cm4gKG4gPDwgMSkgXiAobiA+PiA2Myk7IH0KLQotLyogRGVjb2RpbmcgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotLyogQWxsIGRlY29kaW5nIGZ1bmN0aW9ucyByZXR1cm4gdGhpcyBzdHJ1Y3QgYnkgdmFsdWUuICovCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IGNoYXIgKnA7ICAvKiBOVUxMIGlmIHRoZSB2YXJpbnQgd2FzIHVudGVybWluYXRlZC4gKi8KLSAgdWludDY0X3QgdmFsOwotfSB1cGJfZGVjb2RlcmV0OwotCi1VUEJfSU5MSU5FIHVwYl9kZWNvZGVyZXQgdXBiX2RlY29kZXJldF9tYWtlKGNvbnN0IGNoYXIgKnAsIHVpbnQ2NF90IHZhbCkgewotICB1cGJfZGVjb2RlcmV0IHJldDsKLSAgcmV0LnAgPSBwOwotICByZXQudmFsID0gdmFsOwotICByZXR1cm4gcmV0OwotfQotCi0vKiBGb3VyIGZ1bmN0aW9ucyBmb3IgZGVjb2RpbmcgYSB2YXJpbnQgb2YgYXQgbW9zdCBlaWdodCBieXRlcy4gIFRoZXkgYXJlIGFsbAotICogZnVuY3Rpb25hbGx5IGlkZW50aWNhbCwgYnV0IGFyZSBpbXBsZW1lbnRlZCBpbiBkaWZmZXJlbnQgd2F5cyBhbmQgbGlrZWx5IGhhdmUKLSAqIGRpZmZlcmVudCBwZXJmb3JtYW5jZSBwcm9maWxlcy4gIFdlIGtlZXAgdGhlbSBhcm91bmQgZm9yIHBlcmZvcm1hbmNlIHRlc3RpbmcuCi0gKgotICogTm90ZSB0aGF0IHRoZXNlIGZ1bmN0aW9ucyBtYXkgbm90IHJlYWQgYnl0ZS1ieS1ieXRlLCBzbyB0aGV5IG11c3Qgbm90IGJlIHVzZWQKLSAqIHVubGVzcyB0aGVyZSBhcmUgYXQgbGVhc3QgZWlnaHQgYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyISAqLwotdXBiX2RlY29kZXJldCB1cGJfdmRlY29kZV9tYXg4X2JyYW5jaDMyKHVwYl9kZWNvZGVyZXQgcik7Ci11cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX21heDhfYnJhbmNoNjQodXBiX2RlY29kZXJldCByKTsKLXVwYl9kZWNvZGVyZXQgdXBiX3ZkZWNvZGVfbWF4OF93cmlnaHQodXBiX2RlY29kZXJldCByKTsKLXVwYl9kZWNvZGVyZXQgdXBiX3ZkZWNvZGVfbWF4OF9tYXNzaW1pbm8odXBiX2RlY29kZXJldCByKTsKLQotLyogVGVtcGxhdGUgZm9yIGEgZnVuY3Rpb24gdGhhdCBjaGVja3MgdGhlIGZpcnN0IHR3byBieXRlcyB3aXRoIGJyYW5jaGluZwotICogYW5kIGRpc3BhdGNoZXMgMi0xMCBieXRlcyB3aXRoIGEgc2VwYXJhdGUgZnVuY3Rpb24uICBOb3RlIHRoYXQgdGhpcyBtYXkgcmVhZAotICogdXAgdG8gMTAgYnl0ZXMsIHNvIGl0IG11c3Qgbm90IGJlIHVzZWQgdW5sZXNzIHRoZXJlIGFyZSBhdCBsZWFzdCB0ZW4gYnl0ZXMKLSAqIGxlZnQgaW4gdGhlIGJ1ZmZlciEgKi8KLSNkZWZpbmUgVVBCX1ZBUklOVF9ERUNPREVSX0NIRUNLMihuYW1lLCBkZWNvZGVfbWF4OF9mdW5jdGlvbikgICAgICAgICAgICAgICAgICBcCi1VUEJfSU5MSU5FIHVwYl9kZWNvZGVyZXQgdXBiX3ZkZWNvZGVfY2hlY2syXyAjIyBuYW1lKGNvbnN0IGNoYXIgKl9wKSB7ICAgICAgICAgXAotICB1aW50OF90ICpwID0gKHVpbnQ4X3QqKV9wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdXBiX2RlY29kZXJldCByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICgoKnAgJiAweDgwKSA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAvKiBDb21tb24gY2FzZTogb25lLWJ5dGUgdmFyaW50LiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gdXBiX2RlY29kZXJldF9tYWtlKF9wICsgMSwgKnAgJiAweDdmVSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByID0gdXBiX2RlY29kZXJldF9tYWtlKF9wICsgMiwgKCpwICYgMHg3ZlUpIHwgKCgqKHAgKyAxKSAmIDB4N2ZVKSA8PCA3KSk7ICAgIFwKLSAgaWYgKCgqKHAgKyAxKSAmIDB4ODApID09IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLyogVHdvLWJ5dGUgdmFyaW50LiAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiByOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIExvbmdlciB2YXJpbnQsIGZhbGxiYWNrIHRvIG91dC1vZi1saW5lIGZ1bmN0aW9uLiAqLyAgICAgICAgICAgICAgICAgICAgICAgXAotICByZXR1cm4gZGVjb2RlX21heDhfZnVuY3Rpb24ocik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotVVBCX1ZBUklOVF9ERUNPREVSX0NIRUNLMihicmFuY2gzMiwgdXBiX3ZkZWNvZGVfbWF4OF9icmFuY2gzMikKLVVQQl9WQVJJTlRfREVDT0RFUl9DSEVDSzIoYnJhbmNoNjQsIHVwYl92ZGVjb2RlX21heDhfYnJhbmNoNjQpCi1VUEJfVkFSSU5UX0RFQ09ERVJfQ0hFQ0syKHdyaWdodCwgdXBiX3ZkZWNvZGVfbWF4OF93cmlnaHQpCi1VUEJfVkFSSU5UX0RFQ09ERVJfQ0hFQ0syKG1hc3NpbWlubywgdXBiX3ZkZWNvZGVfbWF4OF9tYXNzaW1pbm8pCi0jdW5kZWYgVVBCX1ZBUklOVF9ERUNPREVSX0NIRUNLMgotCi0vKiBPdXIgY2Fub25pY2FsIGZ1bmN0aW9ucyBmb3IgZGVjb2RpbmcgdmFyaW50cywgYmFzZWQgb24gdGhlIGN1cnJlbnRseQotICogZmF2b3JlZCBiZXN0LXBlcmZvcm1pbmcgaW1wbGVtZW50YXRpb25zLiAqLwotVVBCX0lOTElORSB1cGJfZGVjb2RlcmV0IHVwYl92ZGVjb2RlX2Zhc3QoY29uc3QgY2hhciAqcCkgewotICBpZiAoc2l6ZW9mKGxvbmcpID09IDgpCi0gICAgcmV0dXJuIHVwYl92ZGVjb2RlX2NoZWNrMl9icmFuY2g2NChwKTsKLSAgZWxzZQotICAgIHJldHVybiB1cGJfdmRlY29kZV9jaGVjazJfYnJhbmNoMzIocCk7Ci19Ci0KLVVQQl9JTkxJTkUgdXBiX2RlY29kZXJldCB1cGJfdmRlY29kZV9tYXg4X2Zhc3QodXBiX2RlY29kZXJldCByKSB7Ci0gIHJldHVybiB1cGJfdmRlY29kZV9tYXg4X21hc3NpbWlubyhyKTsKLX0KLQotCi0vKiBFbmNvZGluZyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi1VUEJfSU5MSU5FIGludCB1cGJfdmFsdWVfc2l6ZSh1aW50NjRfdCB2YWwpIHsKLSNpZmRlZiBfX0dOVUNfXwotICBpbnQgaGlnaF9iaXQgPSA2MyAtIF9fYnVpbHRpbl9jbHpsbCh2YWwpOyAgLyogMC1iYXNlZCwgdW5kZWYgaWYgdmFsID09IDAuICovCi0jZWxzZQotICBpbnQgaGlnaF9iaXQgPSAwOwotICB1aW50NjRfdCB0bXAgPSB2YWw7Ci0gIHdoaWxlKHRtcCA+Pj0gMSkgaGlnaF9iaXQrKzsKLSNlbmRpZgotICByZXR1cm4gdmFsID09IDAgPyAxIDogaGlnaF9iaXQgLyA4ICsgMTsKLX0KLQotLyogRW5jb2RlcyBhIDY0LWJpdCB2YXJpbnQgaW50byBidWYgKHdoaWNoIG11c3QgYmUgPj1VUEJfUEJfVkFSSU5UX01BWF9MRU4KLSAqIGJ5dGVzIGxvbmcpLCByZXR1cm5pbmcgaG93IG1hbnkgYnl0ZXMgd2VyZSB1c2VkLgotICoKLSAqIFRPRE86IGJlbmNobWFyayBhbmQgb3B0aW1pemUgaWYgbmVjZXNzYXJ5LiAqLwotVVBCX0lOTElORSBzaXplX3QgdXBiX3ZlbmNvZGU2NCh1aW50NjRfdCB2YWwsIGNoYXIgKmJ1ZikgewotICBzaXplX3QgaTsKLSAgaWYgKHZhbCA9PSAwKSB7IGJ1ZlswXSA9IDA7IHJldHVybiAxOyB9Ci0gIGkgPSAwOwotICB3aGlsZSAodmFsKSB7Ci0gICAgdWludDhfdCBieXRlID0gdmFsICYgMHg3ZlU7Ci0gICAgdmFsID4+PSA3OwotICAgIGlmICh2YWwpIGJ5dGUgfD0gMHg4MFU7Ci0gICAgYnVmW2krK10gPSBieXRlOwotICB9Ci0gIHJldHVybiBpOwotfQotCi1VUEJfSU5MSU5FIHNpemVfdCB1cGJfdmFyaW50X3NpemUodWludDY0X3QgdmFsKSB7Ci0gIGNoYXIgYnVmW1VQQl9QQl9WQVJJTlRfTUFYX0xFTl07Ci0gIHJldHVybiB1cGJfdmVuY29kZTY0KHZhbCwgYnVmKTsKLX0KLQotLyogRW5jb2RlcyBhIDMyLWJpdCB2YXJpbnQsICpub3QqIHNpZ24tZXh0ZW5kZWQuICovCi1VUEJfSU5MSU5FIHVpbnQ2NF90IHVwYl92ZW5jb2RlMzIodWludDMyX3QgdmFsKSB7Ci0gIGNoYXIgYnVmW1VQQl9QQl9WQVJJTlRfTUFYX0xFTl07Ci0gIHNpemVfdCBieXRlcyA9IHVwYl92ZW5jb2RlNjQodmFsLCBidWYpOwotICB1aW50NjRfdCByZXQgPSAwOwotICBhc3NlcnQoYnl0ZXMgPD0gNSk7Ci0gIG1lbWNweSgmcmV0LCBidWYsIGJ5dGVzKTsKLSAgYXNzZXJ0KHJldCA8PSAweGZmZmZmZmZmZmZVKTsKLSAgcmV0dXJuIHJldDsKLX0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvKiBleHRlcm4gIkMiICovCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfVkFSSU5UX0RFQ09ERVJfSF8gKi8KLS8qCi0qKiB1cGI6OnBiOjpFbmNvZGVyICh1cGJfcGJfZW5jb2RlcikKLSoqCi0qKiBJbXBsZW1lbnRzIGEgc2V0IG9mIHVwYl9oYW5kbGVycyB0aGF0IHdyaXRlIHByb3RvYnVmIGRhdGEgdG8gdGhlIGJpbmFyeSB3aXJlCi0qKiBmb3JtYXQuCi0qKgotKiogVGhpcyBlbmNvZGVyIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IGhhdmUgYW55IGFjY2VzcyB0byBhbnkgb3V0LW9mLWJhbmQgb3IKLSoqIHByZWNvbXB1dGVkIGxlbmd0aHMgZm9yIHN1Ym1lc3NhZ2VzLCBzbyBpdCBtdXN0IGJ1ZmZlciBzdWJtZXNzYWdlcyBpbnRlcm5hbGx5Ci0qKiBiZWZvcmUgaXQgY2FuIGVtaXQgdGhlIGZpcnN0IGJ5dGUuCi0qLwotCi0jaWZuZGVmIFVQQl9FTkNPREVSX0hfCi0jZGVmaW5lIFVQQl9FTkNPREVSX0hfCi0KLQotI2lmZGVmIF9fY3BsdXNwbHVzCi1uYW1lc3BhY2UgdXBiIHsKLW5hbWVzcGFjZSBwYiB7Ci1jbGFzcyBFbmNvZGVyOwotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OnBiOjpFbmNvZGVyLCB1cGJfcGJfZW5jb2RlcikKLQotI2RlZmluZSBVUEJfUEJFTkNPREVSX01BWF9ORVNUSU5HIDEwMAotCi0vKiB1cGI6OnBiOjpFbmNvZGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwotCi0vKiBQcmVhbGxvY2F0aW9uIGhpbnQ6IGRlY29kZXIgd29uJ3QgYWxsb2NhdGUgbW9yZSBieXRlcyB0aGFuIHRoaXMgd2hlbiBmaXJzdAotICogY29uc3RydWN0ZWQuICBUaGlzIGhpbnQgbWF5IGJlIGFuIG92ZXJlc3RpbWF0ZSBmb3Igc29tZSBidWlsZCBjb25maWd1cmF0aW9ucy4KLSAqIEJ1dCBpZiB0aGUgZGVjb2RlciBsaWJyYXJ5IGlzIHVwZ3JhZGVkIHdpdGhvdXQgcmVjb21waWxpbmcgdGhlIGFwcGxpY2F0aW9uLAotICogaXQgbWF5IGJlIGFuIHVuZGVyZXN0aW1hdGUuICovCi0jZGVmaW5lIFVQQl9QQl9FTkNPREVSX1NJWkUgNzY4Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi1jbGFzcyB1cGI6OnBiOjpFbmNvZGVyIHsKLSBwdWJsaWM6Ci0gIC8qIENyZWF0ZXMgYSBuZXcgZW5jb2RlciBpbiB0aGUgZ2l2ZW4gZW52aXJvbm1lbnQuICBUaGUgSGFuZGxlcnMgbXVzdCBoYXZlCi0gICAqIGNvbWUgZnJvbSBOZXdIYW5kbGVycygpIGJlbG93LiAqLwotICBzdGF0aWMgRW5jb2RlciogQ3JlYXRlKEVudmlyb25tZW50KiBlbnYsIGNvbnN0IEhhbmRsZXJzKiBoYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc1NpbmsqIG91dHB1dCk7Ci0KLSAgLyogVGhlIGlucHV0IHRvIHRoZSBlbmNvZGVyLiAqLwotICBTaW5rKiBpbnB1dCgpOwotCi0gIC8qIENyZWF0ZXMgYSBuZXcgc2V0IG9mIGhhbmRsZXJzIGZvciB0aGlzIE1lc3NhZ2VEZWYuICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPGNvbnN0IEhhbmRsZXJzPiBOZXdIYW5kbGVycyhjb25zdCBNZXNzYWdlRGVmKiBtc2cpOwotCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga1NpemUgPSBVUEJfUEJfRU5DT0RFUl9TSVpFOwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoRW5jb2RlciwgdXBiOjpwYjo6RW5jb2RlcikKLX07Ci0KLSNlbmRpZgotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfcGJfZW5jb2Rlcl9uZXdoYW5kbGVycyhjb25zdCB1cGJfbXNnZGVmICptLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcik7Ci11cGJfc2luayAqdXBiX3BiX2VuY29kZXJfaW5wdXQodXBiX3BiX2VuY29kZXIgKnApOwotdXBiX3BiX2VuY29kZXIqIHVwYl9wYl9lbmNvZGVyX2NyZWF0ZSh1cGJfZW52KiBlLCBjb25zdCB1cGJfaGFuZGxlcnMqIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ieXRlc3NpbmsqIG91dHB1dCk7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWlubGluZSBFbmNvZGVyKiBFbmNvZGVyOjpDcmVhdGUoRW52aXJvbm1lbnQqIGVudiwgY29uc3QgSGFuZGxlcnMqIGhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc1NpbmsqIG91dHB1dCkgewotICByZXR1cm4gdXBiX3BiX2VuY29kZXJfY3JlYXRlKGVudiwgaGFuZGxlcnMsIG91dHB1dCk7Ci19Ci1pbmxpbmUgU2luayogRW5jb2Rlcjo6aW5wdXQoKSB7Ci0gIHJldHVybiB1cGJfcGJfZW5jb2Rlcl9pbnB1dCh0aGlzKTsKLX0KLWlubGluZSByZWZmZWRfcHRyPGNvbnN0IEhhbmRsZXJzPiBFbmNvZGVyOjpOZXdIYW5kbGVycygKLSAgICBjb25zdCB1cGI6Ok1lc3NhZ2VEZWYgKm1kKSB7Ci0gIGNvbnN0IEhhbmRsZXJzKiBoID0gdXBiX3BiX2VuY29kZXJfbmV3aGFuZGxlcnMobWQsICZoKTsKLSAgcmV0dXJuIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+KGgsICZoKTsKLX0KLX0gIC8qIG5hbWVzcGFjZSBwYiAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfRU5DT0RFUl9IXyAqLwotLyoKLSoqIHVwYidzIGNvcmUgY29tcG9uZW50cyBsaWtlIHVwYl9kZWNvZGVyIGFuZCB1cGJfbXNnIGFyZSBjYXJlZnVsbHkgZGVzaWduZWQgdG8KLSoqIGF2b2lkIGRlcGVuZGluZyBvbiBlYWNoIG90aGVyIGZvciBtYXhpbXVtIG9ydGhvZ29uYWxpdHkuICBJbiBvdGhlciB3b3JkcywKLSoqIHlvdSBjYW4gdXNlIGEgdXBiX2RlY29kZXIgdG8gZGVjb2RlIGludG8gKmFueSoga2luZCBvZiBzdHJ1Y3R1cmU7IHVwYl9tc2cgaXMKLSoqIGp1c3Qgb25lIHN1Y2ggc3RydWN0dXJlLiAgQSB1cGJfbXNnIGNhbiBiZSBzZXJpYWxpemVkL2Rlc2VyaWFsaXplZCBpbnRvIGFueQotKiogZm9ybWF0LCBwcm90b2J1ZiBiaW5hcnkgZm9ybWF0IGlzIGp1c3Qgb25lIHN1Y2ggZm9ybWF0LgotKioKLSoqIEhvd2V2ZXIsIGZvciBjb252ZW5pZW5jZSB3ZSBwcm92aWRlIGZ1bmN0aW9ucyBoZXJlIGZvciBkb2luZyBjb21tb24KLSoqIG9wZXJhdGlvbnMgbGlrZSBkZXNlcmlhbGl6aW5nIHByb3RvYnVmIGJpbmFyeSBmb3JtYXQgaW50byBhIHVwYl9tc2cuICBUaGUKLSoqIGNvbXByb21pc2UgaXMgdGhhdCB0aGlzIGZpbGUgZHJhZ3MgaW4gYWxtb3N0IGFsbCBvZiB1cGIgYXMgYSBkZXBlbmRlbmN5LAotKiogd2hpY2ggY291bGQgYmUgdW5kZXNpcmFibGUgaWYgeW91J3JlIHRyeWluZyB0byB1c2UgYSB0cmltbWVkLWRvd24gYnVpbGQgb2YKLSoqIHVwYi4KLSoqCi0qKiBXaGlsZSB0aGVzZSByb3V0aW5lcyBhcmUgY29udmVuaWVudCwgdGhleSBkbyBub3QgcmV1c2UgYW55IGVuY29kaW5nL2RlY29kaW5nCi0qKiBzdGF0ZS4gIEZvciBleGFtcGxlLCBpZiBhIGRlY29kZXIgaXMgSklULWJhc2VkLCBpdCB3aWxsIGJlIHJlLUpJVHRlZCBldmVyeQotKiogdGltZSB0aGVzZSBmdW5jdGlvbnMgYXJlIGNhbGxlZC4gIEZvciB0aGlzIHJlYXNvbiwgaWYgeW91IGFyZSBwYXJzaW5nIGxvdHMKLSoqIG9mIGRhdGEgYW5kIGVmZmljaWVuY3kgaXMgYW4gaXNzdWUsIHRoZXNlIG1heSBub3QgYmUgdGhlIGJlc3QgZnVuY3Rpb25zIHRvCi0qKiB1c2UgKHRob3VnaCB0aGV5IGFyZSB1c2VmdWwgZm9yIHByb3RvdHlwaW5nLCBiZWZvcmUgb3B0aW1pemluZykuCi0qLwotCi0jaWZuZGVmIFVQQl9HTFVFX0gKLSNkZWZpbmUgVVBCX0dMVUVfSAotCi0jaW5jbHVkZSA8c3RkYm9vbC5oPgotCi0jaWZkZWYgX19jcGx1c3BsdXMKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLWV4dGVybiAiQyIgewotI2VuZGlmCi0KLS8qIExvYWRzIGEgYmluYXJ5IGRlc2NyaXB0b3IgYW5kIHJldHVybnMgYSBOVUxMLXRlcm1pbmF0ZWQgYXJyYXkgb2YgdW5mcm96ZW4KLSAqIGZpbGVkZWZzLiAgVGhlIGNhbGxlciBvd25zIHRoZSByZXR1cm5lZCBhcnJheSwgd2hpY2ggbXVzdCBiZSBmcmVlZCB3aXRoCi0gKiB1cGJfZ2ZyZWUoKS4gKi8KLXVwYl9maWxlZGVmICoqdXBiX2xvYWRkZXNjcmlwdG9yKGNvbnN0IGNoYXIgKmJ1Ziwgc2l6ZV90IG4sIGNvbnN0IHZvaWQgKm93bmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX3N0YXR1cyAqc3RhdHVzKTsKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi19ICAvKiBleHRlcm4gIkMiICovCi0KLW5hbWVzcGFjZSB1cGIgewotCi1pbmxpbmUgYm9vbCBMb2FkRGVzY3JpcHRvcihjb25zdCBjaGFyKiBidWYsIHNpemVfdCBuLCBTdGF0dXMqIHN0YXR1cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPHJlZmZlZF9wdHI8RmlsZURlZj4gPiogZmlsZXMpIHsKLSAgRmlsZURlZioqIHBhcnNlZF9maWxlcyA9IHVwYl9sb2FkZGVzY3JpcHRvcihidWYsIG4sICZwYXJzZWRfZmlsZXMsIHN0YXR1cyk7Ci0KLSAgaWYgKHBhcnNlZF9maWxlcykgewotICAgIEZpbGVEZWYqKiBwID0gcGFyc2VkX2ZpbGVzOwotICAgIHdoaWxlICgqcCkgewotICAgICAgZmlsZXMtPnB1c2hfYmFjayhyZWZmZWRfcHRyPEZpbGVEZWY+KCpwLCAmcGFyc2VkX2ZpbGVzKSk7Ci0gICAgICArK3A7Ci0gICAgfQotICAgIGZyZWUocGFyc2VkX2ZpbGVzKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLyogVGVtcGxhdGVkIHNvIGl0IGNhbiBhY2NlcHQgYm90aCBzdHJpbmcgYW5kIHN0ZDo6c3RyaW5nLiAqLwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1ib29sIExvYWREZXNjcmlwdG9yKGNvbnN0IFQmIGRlc2MsIFN0YXR1cyogc3RhdHVzLAotICAgICAgICAgICAgICAgICAgICBzdGQ6OnZlY3RvcjxyZWZmZWRfcHRyPEZpbGVEZWY+ID4qIGZpbGVzKSB7Ci0gIHJldHVybiBMb2FkRGVzY3JpcHRvcihkZXNjLmNfc3RyKCksIGRlc2Muc2l6ZSgpLCBzdGF0dXMsIGZpbGVzKTsKLX0KLQotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfR0xVRV9IICovCi0vKgotKiogdXBiOjpwYjo6VGV4dFByaW50ZXIgKHVwYl90ZXh0cHJpbnRlcikKLSoqCi0qKiBIYW5kbGVycyBmb3Igd3JpdGluZyB0byBwcm90b2J1ZiB0ZXh0IGZvcm1hdC4KLSovCi0KLSNpZm5kZWYgVVBCX1RFWFRfSF8KLSNkZWZpbmUgVVBCX1RFWFRfSF8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWNsYXNzIFRleHRQcmludGVyOwotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6OnBiOjpUZXh0UHJpbnRlciwgdXBiX3RleHRwcmludGVyKQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLQotY2xhc3MgdXBiOjpwYjo6VGV4dFByaW50ZXIgewotIHB1YmxpYzoKLSAgLyogVGhlIGdpdmVuIGhhbmRsZXJzIG11c3QgaGF2ZSBjb21lIGZyb20gTmV3SGFuZGxlcnMoKS4gIEl0IG11c3Qgb3V0bGl2ZSB0aGUKLSAgICogVGV4dFByaW50ZXIuICovCi0gIHN0YXRpYyBUZXh0UHJpbnRlciAqQ3JlYXRlKEVudmlyb25tZW50ICplbnYsIGNvbnN0IHVwYjo6SGFuZGxlcnMgKmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc1NpbmsgKm91dHB1dCk7Ci0KLSAgdm9pZCBTZXRTaW5nbGVMaW5lTW9kZShib29sIHNpbmdsZV9saW5lKTsKLQotICBTaW5rKiBpbnB1dCgpOwotCi0gIC8qIElmIGhhbmRsZXIgY2FjaGluZyBiZWNvbWVzIGEgcmVxdWlyZW1lbnQgd2UgY2FuIGFkZCBhIGNvZGUgY2FjaGUgYXMgaW4KLSAgICogZGVjb2Rlci5oICovCi0gIHN0YXRpYyByZWZmZWRfcHRyPGNvbnN0IEhhbmRsZXJzPiBOZXdIYW5kbGVycyhjb25zdCBNZXNzYWdlRGVmKiBtZCk7Ci19OwotCi0jZW5kaWYKLQotVVBCX0JFR0lOX0VYVEVSTl9DCi0KLS8qIEMgQVBJLiAqLwotdXBiX3RleHRwcmludGVyICp1cGJfdGV4dHByaW50ZXJfY3JlYXRlKHVwYl9lbnYgKmVudiwgY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9ieXRlc3NpbmsgKm91dHB1dCk7Ci12b2lkIHVwYl90ZXh0cHJpbnRlcl9zZXRzaW5nbGVsaW5lKHVwYl90ZXh0cHJpbnRlciAqcCwgYm9vbCBzaW5nbGVfbGluZSk7Ci11cGJfc2luayAqdXBiX3RleHRwcmludGVyX2lucHV0KHVwYl90ZXh0cHJpbnRlciAqcCk7Ci0KLWNvbnN0IHVwYl9oYW5kbGVycyAqdXBiX3RleHRwcmludGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcik7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIHBiIHsKLWlubGluZSBUZXh0UHJpbnRlciAqVGV4dFByaW50ZXI6OkNyZWF0ZShFbnZpcm9ubWVudCAqZW52LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVwYjo6SGFuZGxlcnMgKmhhbmRsZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ5dGVzU2luayAqb3V0cHV0KSB7Ci0gIHJldHVybiB1cGJfdGV4dHByaW50ZXJfY3JlYXRlKGVudiwgaGFuZGxlcnMsIG91dHB1dCk7Ci19Ci1pbmxpbmUgdm9pZCBUZXh0UHJpbnRlcjo6U2V0U2luZ2xlTGluZU1vZGUoYm9vbCBzaW5nbGVfbGluZSkgewotICB1cGJfdGV4dHByaW50ZXJfc2V0c2luZ2xlbGluZSh0aGlzLCBzaW5nbGVfbGluZSk7Ci19Ci1pbmxpbmUgU2luayogVGV4dFByaW50ZXI6OmlucHV0KCkgewotICByZXR1cm4gdXBiX3RleHRwcmludGVyX2lucHV0KHRoaXMpOwotfQotaW5saW5lIHJlZmZlZF9wdHI8Y29uc3QgSGFuZGxlcnM+IFRleHRQcmludGVyOjpOZXdIYW5kbGVycygKLSAgICBjb25zdCBNZXNzYWdlRGVmICptZCkgewotICBjb25zdCBIYW5kbGVycyogaCA9IHVwYl90ZXh0cHJpbnRlcl9uZXdoYW5kbGVycyhtZCwgJmgpOwotICByZXR1cm4gcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4oaCwgJmgpOwotfQotfSAgLyogbmFtZXNwYWNlIHBiICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0KLSNlbmRpZgotCi0jZW5kaWYgIC8qIFVQQl9URVhUX0hfICovCi0vKgotKiogdXBiOjpqc29uOjpQYXJzZXIgKHVwYl9qc29uX3BhcnNlcikKLSoqCi0qKiBQYXJzZXMgSlNPTiBhY2NvcmRpbmcgdG8gYSBzcGVjaWZpYyBzY2hlbWEuCi0qKiBTdXBwb3J0IGZvciBwYXJzaW5nIGFyYml0cmFyeSBKU09OIChzY2hlbWEtbGVzcykgd2lsbCBiZSBhZGRlZCBsYXRlci4KLSovCi0KLSNpZm5kZWYgVVBCX0pTT05fUEFSU0VSX0hfCi0jZGVmaW5lIFVQQl9KU09OX1BBUlNFUl9IXwotCi0KLSNpZmRlZiBfX2NwbHVzcGx1cwotbmFtZXNwYWNlIHVwYiB7Ci1uYW1lc3BhY2UganNvbiB7Ci1jbGFzcyBQYXJzZXI7Ci1jbGFzcyBQYXJzZXJNZXRob2Q7Ci19ICAvKiBuYW1lc3BhY2UganNvbiAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotI2VuZGlmCi0KLVVQQl9ERUNMQVJFX1RZUEUodXBiOjpqc29uOjpQYXJzZXIsIHVwYl9qc29uX3BhcnNlcikKLVVQQl9ERUNMQVJFX0RFUklWRURfVFlQRSh1cGI6Ompzb246OlBhcnNlck1ldGhvZCwgdXBiOjpSZWZDb3VudGVkLAotICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9qc29uX3BhcnNlcm1ldGhvZCwgdXBiX3JlZmNvdW50ZWQpCi0KLS8qIHVwYjo6anNvbjo6UGFyc2VyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCi0KLS8qIFByZWFsbG9jYXRpb24gaGludDogcGFyc2VyIHdvbid0IGFsbG9jYXRlIG1vcmUgYnl0ZXMgdGhhbiB0aGlzIHdoZW4gZmlyc3QKLSAqIGNvbnN0cnVjdGVkLiAgVGhpcyBoaW50IG1heSBiZSBhbiBvdmVyZXN0aW1hdGUgZm9yIHNvbWUgYnVpbGQgY29uZmlndXJhdGlvbnMuCi0gKiBCdXQgaWYgdGhlIHBhcnNlciBsaWJyYXJ5IGlzIHVwZ3JhZGVkIHdpdGhvdXQgcmVjb21waWxpbmcgdGhlIGFwcGxpY2F0aW9uLAotICogaXQgbWF5IGJlIGFuIHVuZGVyZXN0aW1hdGUuICovCi0jZGVmaW5lIFVQQl9KU09OX1BBUlNFUl9TSVpFIDQxMTIKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLS8qIFBhcnNlcyBhbiBpbmNvbWluZyBCeXRlc1N0cmVhbSwgcHVzaGluZyB0aGUgcmVzdWx0cyB0byB0aGUgZGVzdGluYXRpb24KLSAqIHNpbmsuICovCi1jbGFzcyB1cGI6Ompzb246OlBhcnNlciB7Ci0gcHVibGljOgotICBzdGF0aWMgUGFyc2VyKiBDcmVhdGUoRW52aXJvbm1lbnQqIGVudiwgY29uc3QgUGFyc2VyTWV0aG9kKiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICBTaW5rKiBvdXRwdXQpOwotCi0gIEJ5dGVzU2luayogaW5wdXQoKTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKFBhcnNlciwgdXBiOjpqc29uOjpQYXJzZXIpCi19OwotCi1jbGFzcyB1cGI6Ompzb246OlBhcnNlck1ldGhvZCB7Ci0gcHVibGljOgotICAvKiBJbmNsdWRlIGJhc2UgbWV0aG9kcyBmcm9tIHVwYjo6UmVmZXJlbmNlQ291bnRlZC4gKi8KLSAgVVBCX1JFRkNPVU5URURfQ1BQTUVUSE9EUwotCi0gIC8qIFJldHVybnMgaGFuZGxlcnMgZm9yIHBhcnNpbmcgYWNjb3JkaW5nIHRvIHRoZSBzcGVjaWZpZWQgc2NoZW1hLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxjb25zdCBQYXJzZXJNZXRob2Q+IE5ldyhjb25zdCB1cGI6Ok1lc3NhZ2VEZWYqIG1kKTsKLQotICAvKiBUaGUgZGVzdGluYXRpb24gaGFuZGxlcnMgdGhhdCBhcmUgc3RhdGljYWxseSBib3VuZCB0byB0aGlzIG1ldGhvZC4KLSAgICogVGhpcyBtZXRob2QgaXMgb25seSBjYXBhYmxlIG9mIG91dHB1dHRpbmcgdG8gYSBzaW5rIHRoYXQgdXNlcyB0aGVzZQotICAgKiBoYW5kbGVycy4gKi8KLSAgY29uc3QgSGFuZGxlcnMqIGRlc3RfaGFuZGxlcnMoKSBjb25zdDsKLQotICAvKiBUaGUgaW5wdXQgaGFuZGxlcnMgZm9yIHRoaXMgZGVjb2RlciBtZXRob2QuICovCi0gIGNvbnN0IEJ5dGVzSGFuZGxlciogaW5wdXRfaGFuZGxlcigpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgVVBCX0RJU0FMTE9XX1BPRF9PUFMoUGFyc2VyTWV0aG9kLCB1cGI6Ompzb246OlBhcnNlck1ldGhvZCkKLX07Ci0KLSNlbmRpZgotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotdXBiX2pzb25fcGFyc2VyKiB1cGJfanNvbl9wYXJzZXJfY3JlYXRlKHVwYl9lbnYqIGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdXBiX2pzb25fcGFyc2VybWV0aG9kKiBtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVwYl9zaW5rKiBvdXRwdXQpOwotdXBiX2J5dGVzc2luayAqdXBiX2pzb25fcGFyc2VyX2lucHV0KHVwYl9qc29uX3BhcnNlciAqcCk7Ci0KLXVwYl9qc29uX3BhcnNlcm1ldGhvZCogdXBiX2pzb25fcGFyc2VybWV0aG9kX25ldyhjb25zdCB1cGJfbXNnZGVmKiBtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBvd25lcik7Ci1jb25zdCB1cGJfaGFuZGxlcnMgKnVwYl9qc29uX3BhcnNlcm1ldGhvZF9kZXN0aGFuZGxlcnMoCi0gICAgY29uc3QgdXBiX2pzb25fcGFyc2VybWV0aG9kICptKTsKLWNvbnN0IHVwYl9ieXRlc2hhbmRsZXIgKnVwYl9qc29uX3BhcnNlcm1ldGhvZF9pbnB1dGhhbmRsZXIoCi0gICAgY29uc3QgdXBiX2pzb25fcGFyc2VybWV0aG9kICptKTsKLQotLyogSW5jbHVkZSByZWZjb3VudGVkIG1ldGhvZHMgbGlrZSB1cGJfanNvbl9wYXJzZXJtZXRob2RfcmVmKCkuICovCi1VUEJfUkVGQ09VTlRFRF9DTUVUSE9EUyh1cGJfanNvbl9wYXJzZXJtZXRob2QsIHVwYl9qc29uX3BhcnNlcm1ldGhvZF91cGNhc3QpCi0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIGpzb24gewotaW5saW5lIFBhcnNlciogUGFyc2VyOjpDcmVhdGUoRW52aXJvbm1lbnQqIGVudiwgY29uc3QgUGFyc2VyTWV0aG9kKiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTaW5rKiBvdXRwdXQpIHsKLSAgcmV0dXJuIHVwYl9qc29uX3BhcnNlcl9jcmVhdGUoZW52LCBtZXRob2QsIG91dHB1dCk7Ci19Ci1pbmxpbmUgQnl0ZXNTaW5rKiBQYXJzZXI6OmlucHV0KCkgewotICByZXR1cm4gdXBiX2pzb25fcGFyc2VyX2lucHV0KHRoaXMpOwotfQotCi1pbmxpbmUgY29uc3QgSGFuZGxlcnMqIFBhcnNlck1ldGhvZDo6ZGVzdF9oYW5kbGVycygpIGNvbnN0IHsKLSAgcmV0dXJuIHVwYl9qc29uX3BhcnNlcm1ldGhvZF9kZXN0aGFuZGxlcnModGhpcyk7Ci19Ci1pbmxpbmUgY29uc3QgQnl0ZXNIYW5kbGVyKiBQYXJzZXJNZXRob2Q6OmlucHV0X2hhbmRsZXIoKSBjb25zdCB7Ci0gIHJldHVybiB1cGJfanNvbl9wYXJzZXJtZXRob2RfaW5wdXRoYW5kbGVyKHRoaXMpOwotfQotLyogc3RhdGljICovCi1pbmxpbmUgcmVmZmVkX3B0cjxjb25zdCBQYXJzZXJNZXRob2Q+IFBhcnNlck1ldGhvZDo6TmV3KAotICAgIGNvbnN0IE1lc3NhZ2VEZWYqIG1kKSB7Ci0gIGNvbnN0IHVwYl9qc29uX3BhcnNlcm1ldGhvZCAqbSA9IHVwYl9qc29uX3BhcnNlcm1ldGhvZF9uZXcobWQsICZtKTsKLSAgcmV0dXJuIHJlZmZlZF9wdHI8Y29uc3QgUGFyc2VyTWV0aG9kPihtLCAmbSk7Ci19Ci0KLX0gIC8qIG5hbWVzcGFjZSBqc29uICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0KLSNlbmRpZgotCi0KLSNlbmRpZiAgLyogVVBCX0pTT05fUEFSU0VSX0hfICovCi0vKgotKiogdXBiOjpqc29uOjpQcmludGVyCi0qKgotKiogSGFuZGxlcnMgdGhhdCBlbWl0IEpTT04gYWNjb3JkaW5nIHRvIGEgc3BlY2lmaWMgcHJvdG9idWYgc2NoZW1hLgotKi8KLQotI2lmbmRlZiBVUEJfSlNPTl9UWVBFRF9QUklOVEVSX0hfCi0jZGVmaW5lIFVQQl9KU09OX1RZUEVEX1BSSU5URVJfSF8KLQotCi0jaWZkZWYgX19jcGx1c3BsdXMKLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIGpzb24gewotY2xhc3MgUHJpbnRlcjsKLX0gIC8qIG5hbWVzcGFjZSBqc29uICovCi19ICAvKiBuYW1lc3BhY2UgdXBiICovCi0jZW5kaWYKLQotVVBCX0RFQ0xBUkVfVFlQRSh1cGI6Ompzb246OlByaW50ZXIsIHVwYl9qc29uX3ByaW50ZXIpCi0KLQotLyogdXBiOjpqc29uOjpQcmludGVyICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KLQotI2RlZmluZSBVUEJfSlNPTl9QUklOVEVSX1NJWkUgMTc2Ci0KLSNpZmRlZiBfX2NwbHVzcGx1cwotCi0vKiBQcmludHMgYW4gaW5jb21pbmcgc3RyZWFtIG9mIGRhdGEgdG8gYSBCeXRlc1NpbmsgaW4gSlNPTiBmb3JtYXQuICovCi1jbGFzcyB1cGI6Ompzb246OlByaW50ZXIgewotIHB1YmxpYzoKLSAgc3RhdGljIFByaW50ZXIqIENyZWF0ZShFbnZpcm9ubWVudCogZW52LCBjb25zdCB1cGI6OkhhbmRsZXJzKiBoYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICBCeXRlc1NpbmsqIG91dHB1dCk7Ci0KLSAgLyogVGhlIGlucHV0IHRvIHRoZSBwcmludGVyLiAqLwotICBTaW5rKiBpbnB1dCgpOwotCi0gIC8qIFJldHVybnMgaGFuZGxlcnMgZm9yIHByaW50aW5nIGFjY29yZGluZyB0byB0aGUgc3BlY2lmaWVkIHNjaGVtYS4KLSAgICogSWYgcHJlc2VydmVfcHJvdG9fZmllbGRuYW1lcyBpcyB0cnVlLCB0aGUgb3V0cHV0IEpTT04gd2lsbCB1c2UgdGhlCi0gICAqIG9yaWdpbmFsIC5wcm90byBmaWVsZCBuYW1lcyAoaWUuIHsibXlfZmllbGQiOjN9KSBpbnN0ZWFkIG9mIHVzaW5nCi0gICAqIGNhbWVsQ2FzZWQgbmFtZXMsIHdoaWNoIGlzIHRoZSBkZWZhdWx0OiAoZWcuIHsibXlGaWVsZCI6M30pLiAqLwotICBzdGF0aWMgcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4gTmV3SGFuZGxlcnMoY29uc3QgdXBiOjpNZXNzYWdlRGVmKiBtZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlc2VydmVfcHJvdG9fZmllbGRuYW1lcyk7Ci0KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrU2l6ZSA9IFVQQl9KU09OX1BSSU5URVJfU0laRTsKLQotIHByaXZhdGU6Ci0gIFVQQl9ESVNBTExPV19QT0RfT1BTKFByaW50ZXIsIHVwYjo6anNvbjo6UHJpbnRlcikKLX07Ci0KLSNlbmRpZgotCi1VUEJfQkVHSU5fRVhURVJOX0MKLQotLyogTmF0aXZlIEMgQVBJLiAqLwotdXBiX2pzb25fcHJpbnRlciAqdXBiX2pzb25fcHJpbnRlcl9jcmVhdGUodXBiX2VudiAqZSwgY29uc3QgdXBiX2hhbmRsZXJzICpoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdXBiX2J5dGVzc2luayAqb3V0cHV0KTsKLXVwYl9zaW5rICp1cGJfanNvbl9wcmludGVyX2lucHV0KHVwYl9qc29uX3ByaW50ZXIgKnApOwotY29uc3QgdXBiX2hhbmRsZXJzICp1cGJfanNvbl9wcmludGVyX25ld2hhbmRsZXJzKGNvbnN0IHVwYl9tc2dkZWYgKm1kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcHJlc2VydmVfZmllbGRuYW1lcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkICpvd25lcik7Ci0KLVVQQl9FTkRfRVhURVJOX0MKLQotI2lmZGVmIF9fY3BsdXNwbHVzCi0KLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIGpzb24gewotaW5saW5lIFByaW50ZXIqIFByaW50ZXI6OkNyZWF0ZShFbnZpcm9ubWVudCogZW52LCBjb25zdCB1cGI6OkhhbmRsZXJzKiBoYW5kbGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnl0ZXNTaW5rKiBvdXRwdXQpIHsKLSAgcmV0dXJuIHVwYl9qc29uX3ByaW50ZXJfY3JlYXRlKGVudiwgaGFuZGxlcnMsIG91dHB1dCk7Ci19Ci1pbmxpbmUgU2luayogUHJpbnRlcjo6aW5wdXQoKSB7IHJldHVybiB1cGJfanNvbl9wcmludGVyX2lucHV0KHRoaXMpOyB9Ci1pbmxpbmUgcmVmZmVkX3B0cjxjb25zdCBIYW5kbGVycz4gUHJpbnRlcjo6TmV3SGFuZGxlcnMoCi0gICAgY29uc3QgdXBiOjpNZXNzYWdlRGVmICptZCwgYm9vbCBwcmVzZXJ2ZV9wcm90b19maWVsZG5hbWVzKSB7Ci0gIGNvbnN0IEhhbmRsZXJzKiBoID0gdXBiX2pzb25fcHJpbnRlcl9uZXdoYW5kbGVycygKLSAgICAgIG1kLCBwcmVzZXJ2ZV9wcm90b19maWVsZG5hbWVzLCAmaCk7Ci0gIHJldHVybiByZWZmZWRfcHRyPGNvbnN0IEhhbmRsZXJzPihoLCAmaCk7Ci19Ci19ICAvKiBuYW1lc3BhY2UganNvbiAqLwotfSAgLyogbmFtZXNwYWNlIHVwYiAqLwotCi0jZW5kaWYKLQotI2VuZGlmICAvKiBVUEJfSlNPTl9UWVBFRF9QUklOVEVSX0hfICovCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2dvb2dsZS1wcm90b2J1Zi5nZW1zcGVjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9nb29nbGUtcHJvdG9idWYuZ2Vtc3BlYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzU0MmFiZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2dvb2dsZS1wcm90b2J1Zi5nZW1zcGVjCisrKyAvZGV2L251bGwKQEAgLTEsMjUgKzAsMCBAQAotR2VtOjpTcGVjaWZpY2F0aW9uLm5ldyBkbyB8c3wKLSAgcy5uYW1lICAgICAgICA9ICJnb29nbGUtcHJvdG9idWYiCi0gIHMudmVyc2lvbiAgICAgPSAiMy4wLjAuYWxwaGEuNi4wLjAiCi0gIHMubGljZW5zZXMgICAgPSBbIkJTRCJdCi0gIHMuc3VtbWFyeSAgICAgPSAiUHJvdG9jb2wgQnVmZmVycyIKLSAgcy5kZXNjcmlwdGlvbiA9ICJQcm90b2NvbCBCdWZmZXJzIGFyZSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdC4iCi0gIHMuaG9tZXBhZ2UgICAgPSAiaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycyIKLSAgcy5hdXRob3JzICAgICA9IFsiUHJvdG9idWYgQXV0aG9ycyJdCi0gIHMuZW1haWwgICAgICAgPSAicHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbSIKLSAgcy5yZXF1aXJlX3BhdGhzID0gWyJsaWIiXQotICBzLmZpbGVzICAgICAgID0gRGlyLmdsb2IoJ2xpYi8qKi8qLnJiJykKLSAgaWYgUlVCWV9QTEFURk9STSA9PSAiamF2YSIKLSAgICBzLmZpbGVzICAgICArPSBbImxpYi9nb29nbGUvcHJvdG9idWZfamF2YS5qYXIiXQotICBlbHNlCi0gICAgcy5maWxlcyAgICAgKz0gRGlyLmdsb2IoJ2V4dC8qKi8qJykKLSAgICBzLmV4dGVuc2lvbnM9IFsiZXh0L2dvb2dsZS9wcm90b2J1Zl9jL2V4dGNvbmYucmIiXQotICAgIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJha2UtY29tcGlsZXItZG9jayIKLSAgZW5kCi0gIHMudGVzdF9maWxlcyAgPSBbInRlc3RzL2Jhc2ljLnJiIiwKLSAgICAgICAgICAgICAgICAgICJ0ZXN0cy9zdHJlc3MucmIiLAotICAgICAgICAgICAgICAgICAgInRlc3RzL2dlbmVyYXRlZF9jb2RlX3Rlc3QucmIiXQotICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJyYWtlLWNvbXBpbGVyIgotICBzLmFkZF9kZXZlbG9wbWVudF9kZXBlbmRlbmN5ICJ0ZXN0LXVuaXQiCi0gIHMuYWRkX2RldmVsb3BtZW50X2RlcGVuZGVuY3kgInJ1YnlnZW1zLXRhc2tzIgotZW5kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2xpYi9nb29nbGUvcHJvdG9idWYucmIgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2xpYi9nb29nbGUvcHJvdG9idWYucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYyYmRkMWIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9saWIvZ29vZ2xlL3Byb3RvYnVmLnJiCisrKyAvZGV2L251bGwKQEAgLTEsNzYgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jIHJlcXVpcmUgbWl4aW5zIGJlZm9yZSB3ZSBob29rIHRoZW0gaW50byB0aGUgamF2YSAmIGMgY29kZQotcmVxdWlyZSAnZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfZXh0cycKLQotIyBXZSBkZWZpbmUgdGhlc2UgYmVmb3JlIHJlcXVpcmluZyB0aGUgcGxhdGZvcm0tc3BlY2lmaWMgbW9kdWxlcy4KLSMgVGhhdCB3YXkgdGhlIG1vZHVsZSBpbml0IGNhbiBncmFiIHJlZmVyZW5jZXMgdG8gdGhlc2UuCi1tb2R1bGUgR29vZ2xlCi0gIG1vZHVsZSBQcm90b2J1ZgotICAgIGNsYXNzIEVycm9yIDwgU3RhbmRhcmRFcnJvcjsgZW5kCi0gICAgY2xhc3MgUGFyc2VFcnJvciA8IEVycm9yOyBlbmQKLSAgZW5kCi1lbmQKLQotaWYgUlVCWV9QTEFURk9STSA9PSAiamF2YSIKLSAgcmVxdWlyZSAnanNvbicKLSAgcmVxdWlyZSAnZ29vZ2xlL3Byb3RvYnVmX2phdmEnCi1lbHNlCi0gIGJlZ2luCi0gICAgcmVxdWlyZSAiZ29vZ2xlLyN7UlVCWV9WRVJTSU9OLnN1YigvXC5cZCQvLCAnJyl9L3Byb3RvYnVmX2MiCi0gIHJlc2N1ZSBMb2FkRXJyb3IKLSAgICByZXF1aXJlICdnb29nbGUvcHJvdG9idWZfYycKLSAgZW5kCi1lbmQKLQotcmVxdWlyZSAnZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkJwotCi1tb2R1bGUgR29vZ2xlCi0gIG1vZHVsZSBQcm90b2J1ZgotCi0gICAgZGVmIHNlbGYuZW5jb2RlKG1zZykKLSAgICAgIG1zZy50b19wcm90bwotICAgIGVuZAotCi0gICAgZGVmIHNlbGYuZW5jb2RlX2pzb24obXNnKQotICAgICAgbXNnLnRvX2pzb24KLSAgICBlbmQKLQotICAgIGRlZiBzZWxmLmRlY29kZShrbGFzcywgcHJvdG8pCi0gICAgICBrbGFzcy5kZWNvZGUocHJvdG8pCi0gICAgZW5kCi0KLSAgICBkZWYgc2VsZi5kZWNvZGVfanNvbihrbGFzcywganNvbikKLSAgICAgIGtsYXNzLmRlY29kZV9qc29uKGpzb24pCi0gICAgZW5kCi0KLSAgZW5kCi1lbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvbGliL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2V4dHMucmIgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L2xpYi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9leHRzLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMTAyNjZiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvbGliL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2V4dHMucmIKKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLW1vZHVsZSBHb29nbGUKLSAgbW9kdWxlIFByb3RvYnVmCi0gICAgbW9kdWxlIE1lc3NhZ2VFeHRzCi0KLSAgICAgICN0aGlzIGlzIG9ubHkgY2FsbGVkIGluIGpydWJ5OyBtcmkgbG9hZGVzIHRoZSBDbGFzc01ldGhvZHMgZGlmZmVyZW50bHkKLSAgICAgIGRlZiBzZWxmLmluY2x1ZGVkKGtsYXNzKQotICAgICAgICBrbGFzcy5leHRlbmQoQ2xhc3NNZXRob2RzKQotICAgICAgZW5kCi0KLSAgICAgIG1vZHVsZSBDbGFzc01ldGhvZHMKLSAgICAgIGVuZAotCi0gICAgICBkZWYgdG9fanNvbgotICAgICAgICBzZWxmLmNsYXNzLmVuY29kZV9qc29uKHNlbGYpCi0gICAgICBlbmQKLQotICAgICAgZGVmIHRvX3Byb3RvCi0gICAgICAgIHNlbGYuY2xhc3MuZW5jb2RlKHNlbGYpCi0gICAgICBlbmQKLQotICAgIGVuZAotICBlbmQKLWVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9saWIvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLnJiIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9saWIvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYWQyMDYwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvbGliL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5yYgorKysgL2Rldi9udWxsCkBAIC0xLDE4OCArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXJlcXVpcmUgJ2ZvcndhcmRhYmxlJwotCi0jCi0jIFRoaXMgY2xhc3MgbWFrZXMgUmVwZWF0ZWRGaWVsZCBhY3QgKGFsbW9zdC0pIGxpa2UgYSBSdWJ5IEFycmF5LgotIyBJdCBoYXMgY29udmVuaWVuY2UgbWV0aG9kcyB0aGF0IGV4dGVuZCB0aGUgY29yZSBDIG9yIEphdmEgYmFzZWQKLSMgbWV0aG9kcy4KLSMKLSMgVGhpcyBpcyBhIGJlc3QtZWZmb3J0IHRvIG1pcnJvciBBcnJheSBiZWhhdmlvci4gIFR3byBjb21tZW50czoKLSMgIDEpIHBhdGNoZXMgYWx3YXlzIHdlbGNvbWUgOikKLSMgIDIpIGlmIHBlcmZvcm1hbmNlIGlzIGFuIGlzc3VlLCBmZWVsIGZyZWUgdG8gcmV3cml0ZSB0aGUgbWV0aG9kCi0jICAgICBpbiBqcnVieSBhbmQgQy4gIFRoZSBzb3VyY2UgY29kZSBoYXMgcGxlbnR5IG9mIGV4YW1wbGVzCi0jCi0jIEtOT1dOIElTU1VFUwotIyAgIC0gI1tdPSBkb2Vzbid0IGFsbG93IGxlc3MgdXNlZCBhcHByb2FjaGVzIHN1Y2ggYXMgYGFyclsxLCAyXSA9ICdmaXp6J2AKLSMgICAtICNjb25jYXQgc2hvdWxkIHJldHVybiB0aGUgb3JpZyBhcnJheQotIyAgIC0gI3B1c2ggc2hvdWxkIGFjY2VwdCBtdWx0aXBsZSBhcmd1bWVudHMgYW5kIHB1c2ggdGhlbSBhbGwgYXQgdGhlIHNhbWUgdGltZQotIwotbW9kdWxlIEdvb2dsZQotICBtb2R1bGUgUHJvdG9idWYKLSAgICBjbGFzcyBSZXBlYXRlZEZpZWxkCi0gICAgICBleHRlbmQgRm9yd2FyZGFibGUKLQotICAgICAgIyBtZXRob2RzIGRlZmluZWQgaW4gQyBvciBKYXZhOgotICAgICAgIyAgICsKLSAgICAgICMgICBbXSwgYXQKLSAgICAgICMgICBbXT0KLSAgICAgICMgICBjb25jYXQKLSAgICAgICMgICBjbGVhcgotICAgICAgIyAgIGR1cCwgY2xvbmUKLSAgICAgICMgICBlYWNoCi0gICAgICAjICAgcHVzaCwgPDwKLSAgICAgICMgICByZXBsYWNlCi0gICAgICAjICAgbGVuZ3RoLCBzaXplCi0gICAgICAjICAgPT0KLSAgICAgICMgICB0b19hcnksIHRvX2EKLSAgICAgICMgICBhbHNvIGFsbCBlbnVtZXJhYmxlCi0gICAgICAjCi0gICAgICAjIE5PVEU6ICB1c2luZyBkZWxlZ2F0b3JzIHJhdGhlciB0aGFuIG1ldGhvZF9taXNzaW5nIHRvIG1ha2UgdGhlCi0gICAgICAjICAgICAgICByZWxhdGlvbnNoaXAgZXhwbGljaXQgaW5zdGVhZCBvZiBpbXBsaWNpdAotICAgICAgZGVmX2RlbGVnYXRvcnMgOnRvX2FyeSwKLSAgICAgICAgOiYsIDoqLCA6LSwgOic8PT4nLAotICAgICAgICA6YXNzb2MsIDpic2VhcmNoLCA6YnNlYXJjaF9pbmRleCwgOmNvbWJpbmF0aW9uLCA6Y29tcGFjdCwgOmNvdW50LAotICAgICAgICA6Y3ljbGUsIDpkaWcsIDpkcm9wLCA6ZHJvcF93aGlsZSwgOmVxbD8sIDpmZXRjaCwgOmZpbmRfaW5kZXgsIDpmbGF0dGVuLAotICAgICAgICA6aW5jbHVkZT8sIDppbmRleCwgOmluc3BlY3QsIDpqb2luLAotICAgICAgICA6cGFjaywgOnBlcm11dGF0aW9uLCA6cHJvZHVjdCwgOnByZXR0eV9wcmludCwgOnByZXR0eV9wcmludF9jeWNsZSwKLSAgICAgICAgOnJhc3NvYywgOnJlcGVhdGVkX2NvbWJpbmF0aW9uLCA6cmVwZWF0ZWRfcGVybXV0YXRpb24sIDpyZXZlcnNlLAotICAgICAgICA6cmluZGV4LCA6cm90YXRlLCA6c2FtcGxlLCA6c2h1ZmZsZSwgOnNoZWxsam9pbiwgOnNsaWNlLAotICAgICAgICA6dG9fcywgOnRyYW5zcG9zZSwgOnVuaXEsIDp8Ci0KLQotICAgICAgZGVmIGZpcnN0KG49bmlsKQotICAgICAgICBuID8gc2VsZlswLi5uXSA6IHNlbGZbMF0KLSAgICAgIGVuZAotCi0KLSAgICAgIGRlZiBsYXN0KG49bmlsKQotICAgICAgICBuID8gc2VsZlsoc2VsZi5zaXplLW4tMSkuLi0xXSA6IHNlbGZbLTFdCi0gICAgICBlbmQKLQotCi0gICAgICBkZWYgcG9wKG49bmlsKQotICAgICAgICBpZiBuCi0gICAgICAgICAgcmVzdWx0cyA9IFtdCi0gICAgICAgICAgbi50aW1lc3sgcmVzdWx0cyA8PCBwb3Bfb25lIH0KLSAgICAgICAgICByZXR1cm4gcmVzdWx0cwotICAgICAgICBlbHNlCi0gICAgICAgICAgcmV0dXJuIHBvcF9vbmUKLSAgICAgICAgZW5kCi0gICAgICBlbmQKLQotCi0gICAgICBkZWYgZW1wdHk/Ci0gICAgICAgIHNlbGYuc2l6ZSA9PSAwCi0gICAgICBlbmQKLQotICAgICAgIyBhcnJheSBhbGlhc2VzIGludG8gZW51bWVyYWJsZQotICAgICAgYWxpYXNfbWV0aG9kIDplYWNoX2luZGV4LCA6ZWFjaF93aXRoX2luZGV4Ci0gICAgICBhbGlhc19tZXRob2QgOnNsaWNlLCA6W10KLSAgICAgIGFsaWFzX21ldGhvZCA6dmFsdWVzX2F0LCA6c2VsZWN0Ci0gICAgICBhbGlhc19tZXRob2QgOm1hcCwgOmNvbGxlY3QKLQotCi0gICAgICBjbGFzcyA8PCBzZWxmCi0gICAgICAgIGRlZiBkZWZpbmVfYXJyYXlfd3JhcHBlcl9tZXRob2QobWV0aG9kX25hbWUpCi0gICAgICAgICAgZGVmaW5lX21ldGhvZChtZXRob2RfbmFtZSkgZG8gfCphcmdzLCAmYmxvY2t8Ci0gICAgICAgICAgICBhcnIgPSBzZWxmLnRvX2EKLSAgICAgICAgICAgIHJlc3VsdCA9IGFyci5zZW5kKG1ldGhvZF9uYW1lLCAqYXJncykKLSAgICAgICAgICAgIHNlbGYucmVwbGFjZShhcnIpCi0gICAgICAgICAgICByZXR1cm4gcmVzdWx0IGlmIHJlc3VsdAotICAgICAgICAgICAgcmV0dXJuIGJsb2NrID8gYmxvY2suY2FsbCA6IHJlc3VsdAotICAgICAgICAgIGVuZAotICAgICAgICBlbmQKLSAgICAgICAgcHJpdmF0ZSA6ZGVmaW5lX2FycmF5X3dyYXBwZXJfbWV0aG9kCi0KLQotICAgICAgICBkZWYgZGVmaW5lX2FycmF5X3dyYXBwZXJfd2l0aF9yZXN1bHRfbWV0aG9kKG1ldGhvZF9uYW1lKQotICAgICAgICAgIGRlZmluZV9tZXRob2QobWV0aG9kX25hbWUpIGRvIHwqYXJncywgJmJsb2NrfAotICAgICAgICAgICAgIyByZXN1bHQgY2FuIGJlIGFuIEVudW1lcmF0b3IsIEFycmF5LCBvciBuaWwKLSAgICAgICAgICAgICMgRW51bWVyYXRvciBjYW4gc29tZXRpbWVzIGJlIHJldHVybmVkIGlmIGEgYmxvY2sgaXMgYW4gb3B0aW9uYWwgYXJndW1lbnQgYW5kIGl0IGlzIG5vdCBwYXNzZWQgaW4KLSAgICAgICAgICAgICMgbmlsIHVzdWFsbHkgc3BlY2lmaWVzIHRoYXQgbm8gY2hhbmdlIHdhcyBtYWRlCi0gICAgICAgICAgICByZXN1bHQgPSBzZWxmLnRvX2Euc2VuZChtZXRob2RfbmFtZSwgKmFyZ3MsICZibG9jaykKLSAgICAgICAgICAgIGlmIHJlc3VsdAotICAgICAgICAgICAgICBuZXdfYXJyID0gcmVzdWx0LnRvX2EKLSAgICAgICAgICAgICAgc2VsZi5yZXBsYWNlKG5ld19hcnIpCi0gICAgICAgICAgICAgIGlmIHJlc3VsdC5pc19hPyhFbnVtZXJhdG9yKQotICAgICAgICAgICAgICAgICMgZ2VuZXJhdGUgYSBmcmVzaCBlbnVtOyByZXdpbmRpbmcgdGhlIGV4aXRpbmcgb25lLCBpbiBSdWJ5IDIuMiwgd2lsbAotICAgICAgICAgICAgICAgICMgcmVzZXQgdGhlIGVudW0gd2l0aCB0aGUgc2FtZSBsZW5ndGgsIGJ1dCBhbGwgdGhlICNuZXh0IGNhbGxzIHdpbGwKLSAgICAgICAgICAgICAgICAjIHJldHVybiBuaWwKLSAgICAgICAgICAgICAgICByZXN1bHQgPSBuZXdfYXJyLnRvX2VudW0KLSAgICAgICAgICAgICAgICAjIGdlbmVyYXRlIGEgd3JhcHBlciBlbnVtIHNvIGFueSBjaGFuZ2VzIHdoaWNoIG9jY3VyIGJ5IGEgY2hhaW5lZAotICAgICAgICAgICAgICAgICMgZW51bSBjYW4gYmUgY2FwdHVyZWQKLSAgICAgICAgICAgICAgICBpZSA9IFByb3h5aW5nRW51bWVyYXRvci5uZXcoc2VsZiwgcmVzdWx0KQotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGllLnRvX2VudW0KLSAgICAgICAgICAgICAgZW5kCi0gICAgICAgICAgICBlbmQKLSAgICAgICAgICAgIHJlc3VsdAotICAgICAgICAgIGVuZAotICAgICAgICBlbmQKLSAgICAgICAgcHJpdmF0ZSA6ZGVmaW5lX2FycmF5X3dyYXBwZXJfd2l0aF9yZXN1bHRfbWV0aG9kCi0gICAgICBlbmQKLQotCi0gICAgICAldyhkZWxldGUgZGVsZXRlX2F0IGRlbGV0ZV9pZiBzaGlmdCBzbGljZSEgdW5zaGlmdCkuZWFjaCBkbyB8bWV0aG9kX25hbWV8Ci0gICAgICAgIGRlZmluZV9hcnJheV93cmFwcGVyX21ldGhvZChtZXRob2RfbmFtZSkKLSAgICAgIGVuZAotCi0KLSAgICAgICV3KGNvbGxlY3QhIGNvbXBhY3QhIGZpbGwgZmxhdHRlbiEgaW5zZXJ0IHJldmVyc2UhCi0gICAgICAgIHJvdGF0ZSEgc2VsZWN0ISBzaHVmZmxlISBzb3J0ISBzb3J0X2J5ISB1bmlxISkuZWFjaCBkbyB8bWV0aG9kX25hbWV8Ci0gICAgICAgIGRlZmluZV9hcnJheV93cmFwcGVyX3dpdGhfcmVzdWx0X21ldGhvZChtZXRob2RfbmFtZSkKLSAgICAgIGVuZAotICAgICAgYWxpYXNfbWV0aG9kIDprZWVwX2lmLCA6c2VsZWN0IQotICAgICAgYWxpYXNfbWV0aG9kIDptYXAhLCA6Y29sbGVjdCEKLSAgICAgIGFsaWFzX21ldGhvZCA6cmVqZWN0ISwgOmRlbGV0ZV9pZgotCi0KLSAgICAgICMgcHJvcGFnYXRlcyBjaGFuZ2VzIG1hZGUgYnkgdXNlciBvZiBlbnVtZXJhdG9yIGJhY2sgdG8gdGhlIG9yaWdpbmFsIHJlcGVhdGVkIGZpZWxkLgotICAgICAgIyBUaGlzIG9ubHkgYXBwbGllcyBpbiBjYXNlcyB3aGVyZSB0aGUgY2FsbGluZyBmdW5jdGlvbiB3aGljaCBjcmVhdGVkIHRoZSBlbnVtZXJhdG9yLAotICAgICAgIyBzdWNoIGFzICNzb3J0ISwgbW9kaWZpZXMgaXRzZWxmIHJhdGhlciB0aGFuIGEgbmV3IGFycmF5LCBzdWNoIGFzICNzb3J0Ci0gICAgICBjbGFzcyBQcm94eWluZ0VudW1lcmF0b3IgPCBTdHJ1Y3QubmV3KDpyZXBlYXRlZF9maWVsZCwgOmV4dGVybmFsX2VudW1lcmF0b3IpCi0gICAgICAgIGRlZiBlYWNoKCphcmdzLCAmYmxvY2spCi0gICAgICAgICAgcmVzdWx0cyA9IFtdCi0gICAgICAgICAgZXh0ZXJuYWxfZW51bWVyYXRvci5lYWNoX3dpdGhfaW5kZXggZG8gfHZhbCwgaXwKLSAgICAgICAgICAgIHJlc3VsdCA9IHlpZWxkKHZhbCkKLSAgICAgICAgICAgIHJlc3VsdHMgPDwgcmVzdWx0Ci0gICAgICAgICAgICAjbmlsIG1lYW5zIG5vIGNoYW5nZSBvY2N1cmVkIGZyb20geWllbGQ7IHVzdWFsbHkgb2NjdXJzIHdoZW4gI3RvX2EgaXMgY2FsbGVkCi0gICAgICAgICAgICBpZiByZXN1bHQKLSAgICAgICAgICAgICAgcmVwZWF0ZWRfZmllbGRbaV0gPSByZXN1bHQgaWYgcmVzdWx0ICE9IHZhbAotICAgICAgICAgICAgZW5kCi0gICAgICAgICAgZW5kCi0gICAgICAgICAgcmVzdWx0cwotICAgICAgICBlbmQKLSAgICAgIGVuZAotCi0KLSAgICBlbmQKLSAgZW5kCi1lbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvcG9tLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvcG9tLnhtbApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNiZDZkMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSw5MiArMCwwIEBACi08P3htbCB2ZXJzaW9uPSIxLjAiIGVuY29kaW5nPSJVVEYtOCI/PgotPHByb2plY3QgeG1sbnM9Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCIKLSAgICAgICAgIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gICAgICAgICB4c2k6c2NoZW1hTG9jYXRpb249Imh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL1BPTS80LjAuMCBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy94c2QvbWF2ZW4tNC4wLjAueHNkIj4KLSAgICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gICAgPHBhcmVudD4KLSAgICAgIDxncm91cElkPmNvbS5nb29nbGU8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5nb29nbGU8L2FydGlmYWN0SWQ+Ci0gICAgICA8dmVyc2lvbj4xPC92ZXJzaW9uPgotICAgIDwvcGFyZW50PgotCi0gICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5wcm90b2J1Zi1qcnVieTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4xLjAtU05BUFNIT1Q8L3ZlcnNpb24+Ci0gICAgPG5hbWU+UHJvdG9jb2wgQnVmZmVyIEpSdWJ5IG5hdGl2ZSBleHRlbnNpb248L25hbWU+Ci0gICAgPGRlc2NyaXB0aW9uPgotICAgICAgUHJvdG9jb2wgQnVmZmVycyBhcmUgYSB3YXkgb2YgZW5jb2Rpbmcgc3RydWN0dXJlZCBkYXRhIGluIGFuIGVmZmljaWVudCB5ZXQKLSAgICAgIGV4dGVuc2libGUgZm9ybWF0LgotICAgIDwvZGVzY3JpcHRpb24+Ci0gICAgPGluY2VwdGlvblllYXI+MjAxNDwvaW5jZXB0aW9uWWVhcj4KLSAgICA8dXJsPmh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvPC91cmw+Ci0gICAgPGxpY2Vuc2VzPgotICAgICAgPGxpY2Vuc2U+Ci0gICAgICAgIDxuYW1lPk5ldyBCU0QgbGljZW5zZTwvbmFtZT4KLSAgICAgICAgPHVybD5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocDwvdXJsPgotICAgICAgICA8ZGlzdHJpYnV0aW9uPnJlcG88L2Rpc3RyaWJ1dGlvbj4KLSAgICAgIDwvbGljZW5zZT4KLSAgICA8L2xpY2Vuc2VzPgotICAgIDxzY20+Ci0gICAgICA8dXJsPmh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWY8L3VybD4KLSAgICAgIDxjb25uZWN0aW9uPgotICAgICAgICBzY206Z2l0Omh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYuZ2l0Ci0gICAgICA8L2Nvbm5lY3Rpb24+Ci0gICAgPC9zY20+Ci0KLSAgICA8cHJvcGVydGllcz4KLSAgICAgICAgPHByb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+VVRGLTg8L3Byb2plY3QuYnVpbGQuc291cmNlRW5jb2Rpbmc+Ci0gICAgICAgIDxydWJ5LnNvdXJjZXM+bGliL2dvb2dsZTwvcnVieS5zb3VyY2VzPgotICAgICAgICA8amFyLmZpbmFsTmFtZT5wcm90b2J1Zl9qYXZhPC9qYXIuZmluYWxOYW1lPgotICAgIDwvcHJvcGVydGllcz4KLSAgICA8YnVpbGQ+Ci0gICAgICAgIDxwbHVnaW5zPgotICAgICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYXNzZW1ibHktcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICAgICAgICA8ZmluYWxOYW1lPiR7amFyLmZpbmFsTmFtZX08L2ZpbmFsTmFtZT4KLSAgICAgICAgICAgICAgICAgICAgPG91dHB1dERpcmVjdG9yeT4ke3J1Ynkuc291cmNlc308L291dHB1dERpcmVjdG9yeT4KLSAgICAgICAgICAgICAgICAgICAgPGFwcGVuZEFzc2VtYmx5SWQ+ZmFsc2U8L2FwcGVuZEFzc2VtYmx5SWQ+Ci0gICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgICAgICAgICAgIDxkZXNjcmlwdG9yUmVmPmphci13aXRoLWRlcGVuZGVuY2llczwvZGVzY3JpcHRvclJlZj4KLSAgICAgICAgICAgICAgICAgICAgPC9kZXNjcmlwdG9yUmVmcz4KLSAgICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8aWQ+bWFrZS1hc3NlbWJseTwvaWQ+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8cGhhc2U+cGFja2FnZTwvcGhhc2U+Ci0gICAgICAgICAgICAgICAgICAgICAgICA8Z29hbHM+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgPGdvYWw+c2luZ2xlPC9nb2FsPgotICAgICAgICAgICAgICAgICAgICAgICAgPC9nb2Fscz4KLSAgICAgICAgICAgICAgICAgICAgPC9leGVjdXRpb24+Ci0gICAgICAgICAgICAgICAgPC9leGVjdXRpb25zPgotICAgICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgICA8cGx1Z2luPgotICAgICAgICAgICAgICA8Z3JvdXBJZD5vcmcuYXBhY2hlLm1hdmVuLnBsdWdpbnM8L2dyb3VwSWQ+Ci0gICAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgICAgPHNvdXJjZT4xLjY8L3NvdXJjZT4KLSAgICAgICAgICAgICAgICA8dGFyZ2V0PjEuNjwvdGFyZ2V0PgotICAgICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgIDwvYnVpbGQ+Ci0gICAgPGRlcGVuZGVuY2llcz4KLSAgICAgICAgPGRlcGVuZGVuY3k+Ci0gICAgICAgICAgICA8Z3JvdXBJZD5jb20uZmFzdGVyeG1sLmphY2tzb24uY29yZTwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPmphY2tzb24tY29yZTwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDx2ZXJzaW9uPjIuNC4zPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+b3JnLmpydWJ5PC9ncm91cElkPgotICAgICAgICAgICAgPGFydGlmYWN0SWQ+anJ1YnktY29tcGxldGU8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4xLjcuMTM8L3ZlcnNpb24+Ci0gICAgICAgICAgICA8c2NvcGU+cHJvdmlkZWQ8L3Njb3BlPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgICAgIDxkZXBlbmRlbmN5PgotICAgICAgICAgICAgPGdyb3VwSWQ+Y29tLmdvb2dsZS5wcm90b2J1ZjwvZ3JvdXBJZD4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPnByb3RvYnVmLWphdmE8L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8dmVyc2lvbj4zLjAuMC1hbHBoYS0zPC92ZXJzaW9uPgotICAgICAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPC9kZXBlbmRlbmNpZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5QnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieUJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWFkZGFlNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5QnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTY3ICswLDAgQEAKLS8qCi0gKiBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYuanJ1Ynk7Ci0KLWltcG9ydCBvcmcuanJ1YnkuKjsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieUNsYXNzOwotaW1wb3J0IG9yZy5qcnVieS5hbm5vLkpSdWJ5TWV0aG9kOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLio7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuYnVpbHRpbi5JUnVieU9iamVjdDsKLQotQEpSdWJ5Q2xhc3MobmFtZSA9ICJCdWlsZGVyIikKLXB1YmxpYyBjbGFzcyBSdWJ5QnVpbGRlciBleHRlbmRzIFJ1YnlPYmplY3QgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVSdWJ5QnVpbGRlcihSdWJ5IHJ1bnRpbWUpIHsKLSAgICAgICAgUnVieU1vZHVsZSBwcm90b2J1ZiA9IHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1ZiIpOwotICAgICAgICBSdWJ5Q2xhc3MgY0J1aWxkZXIgPSBwcm90b2J1Zi5kZWZpbmVDbGFzc1VuZGVyKCJCdWlsZGVyIiwgcnVudGltZS5nZXRPYmplY3QoKSwgbmV3IE9iamVjdEFsbG9jYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIElSdWJ5T2JqZWN0IGFsbG9jYXRlKFJ1YnkgcnVudGltZSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdWJ5QnVpbGRlcihydW50aW1lLCBrbGF6eik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjQnVpbGRlci5kZWZpbmVBbm5vdGF0ZWRNZXRob2RzKFJ1YnlCdWlsZGVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUnVieUJ1aWxkZXIoUnVieSBydW50aW1lLCBSdWJ5Q2xhc3MgbWV0YUNsYXNzKSB7Ci0gICAgICAgIHN1cGVyKHJ1bnRpbWUsIG1ldGFDbGFzcyk7Ci0gICAgICAgIHRoaXMuY0Rlc2NyaXB0b3IgPSAoUnVieUNsYXNzKSBydW50aW1lLmdldENsYXNzRnJvbVBhdGgoIkdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3IiKTsKLSAgICAgICAgdGhpcy5jRW51bURlc2NyaXB0b3IgPSAoUnVieUNsYXNzKSBydW50aW1lLmdldENsYXNzRnJvbVBhdGgoIkdvb2dsZTo6UHJvdG9idWY6OkVudW1EZXNjcmlwdG9yIik7Ci0gICAgICAgIHRoaXMuY01lc3NhZ2VCdWlsZGVyQ29udGV4dCA9IChSdWJ5Q2xhc3MpIHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1Zjo6TWVzc2FnZUJ1aWxkZXJDb250ZXh0Iik7Ci0gICAgICAgIHRoaXMuY0VudW1CdWlsZGVyQ29udGV4dCA9IChSdWJ5Q2xhc3MpIHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1Zjo6RW51bUJ1aWxkZXJDb250ZXh0Iik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgQnVpbGRlci5uZXcgPT4gYnVpbGRlcgotICAgICAqCi0gICAgICogQ3JlYXRlcyBhIG5ldyBCdWlsZGVyLiBBIEJ1aWxkZXIgY2FuIGFjY3VtdWxhdGUgYSBzZXQgb2YgbmV3IG1lc3NhZ2UgYW5kIGVudW0KLSAgICAgKiBkZXNjcmlwdG9ycyBhbmQgYXRvbWljYWxseSByZWdpc3RlciB0aGVtIGludG8gYSBwb29sIGluIGEgd2F5IHRoYXQgYWxsb3dzIGZvcgotICAgICAqIChjbylyZWN1cnNpdmUgdHlwZSByZWZlcmVuY2VzLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbml0aWFsaXplKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIHRoaXMucGVuZGluZ0xpc3QgPSBydW50aW1lLm5ld0FycmF5KCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEJ1aWxkZXIuYWRkX21lc3NhZ2UobmFtZSwgJmJsb2NrKQotICAgICAqCi0gICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgZGVzY3JpcHRvciB3aXRoIHRoZSBnaXZlbiBuYW1lLCBhbmQgaW52b2tlcyB0aGUgYmxvY2sgaW4KLSAgICAgKiB0aGUgY29udGV4dCBvZiBhIE1lc3NhZ2VCdWlsZGVyQ29udGV4dCBvbiB0aGF0IGRlc2NyaXB0b3IuIFRoZSBibG9jayBjYW4gdGhlbgotICAgICAqIGNhbGwsIGUuZy4sIE1lc3NhZ2VCdWlsZGVyQ29udGV4dCNvcHRpb25hbCBhbmQgTWVzc2FnZUJ1aWxkZXJDb250ZXh0I3JlcGVhdGVkCi0gICAgICogbWV0aG9kcyB0byBkZWZpbmUgdGhlIG1lc3NhZ2UgZmllbGRzLgotICAgICAqCi0gICAgICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQsIGlkaW9tYXRpYyB3YXkgdG8gYnVpbGQgbWVzc2FnZSBkZWZpbml0aW9ucy4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJhZGRfbWVzc2FnZSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGFkZE1lc3NhZ2UoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBuYW1lLCBCbG9jayBibG9jaykgewotICAgICAgICBSdWJ5RGVzY3JpcHRvciBtc2dkZWYgPSAoUnVieURlc2NyaXB0b3IpIGNEZXNjcmlwdG9yLm5ld0luc3RhbmNlKGNvbnRleHQsIEJsb2NrLk5VTExfQkxPQ0spOwotICAgICAgICBJUnVieU9iamVjdCBjdHggPSBjTWVzc2FnZUJ1aWxkZXJDb250ZXh0Lm5ld0luc3RhbmNlKGNvbnRleHQsIG1zZ2RlZiwgdGhpcywgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgIG1zZ2RlZi5zZXROYW1lKGNvbnRleHQsIG5hbWUpOwotICAgICAgICBpZiAoYmxvY2suaXNHaXZlbigpKSB7Ci0gICAgICAgICAgICBpZiAoYmxvY2suYXJpdHkoKSA9PSBBcml0eS5PTkVfQVJHVU1FTlQpIHsKLSAgICAgICAgICAgICAgICBibG9jay55aWVsZChjb250ZXh0LCBjdHgpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBibG9jay5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICAgICAgYmluZGluZy5zZXRTZWxmKGN0eCk7Ci0gICAgICAgICAgICAgICAgYmxvY2sueWllbGRTcGVjaWZpYyhjb250ZXh0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICB0aGlzLnBlbmRpbmdMaXN0LmFkZChtc2dkZWYpOwotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEJ1aWxkZXIuYWRkX2VudW0obmFtZSwgJmJsb2NrKQotICAgICAqCi0gICAgICogQ3JlYXRlcyBhIG5ldywgZW1wdHkgZW51bSBkZXNjcmlwdG9yIHdpdGggdGhlIGdpdmVuIG5hbWUsIGFuZCBpbnZva2VzIHRoZSBibG9jayBpbgotICAgICAqIHRoZSBjb250ZXh0IG9mIGFuIEVudW1CdWlsZGVyQ29udGV4dCBvbiB0aGF0IGRlc2NyaXB0b3IuIFRoZSBibG9jayBjYW4gdGhlbgotICAgICAqIGNhbGwgRW51bUJ1aWxkZXJDb250ZXh0I2FkZF92YWx1ZSB0byBkZWZpbmUgdGhlIGVudW0gdmFsdWVzLgotICAgICAqCi0gICAgICogVGhpcyBpcyB0aGUgcmVjb21tZW5kZWQsIGlkaW9tYXRpYyB3YXkgdG8gYnVpbGQgZW51bSBkZWZpbml0aW9ucy4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJhZGRfZW51bSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGFkZEVudW0oVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBuYW1lLCBCbG9jayBibG9jaykgewotICAgICAgICBSdWJ5RW51bURlc2NyaXB0b3IgZW51bURlZiA9IChSdWJ5RW51bURlc2NyaXB0b3IpIGNFbnVtRGVzY3JpcHRvci5uZXdJbnN0YW5jZShjb250ZXh0LCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgSVJ1YnlPYmplY3QgY3R4ID0gY0VudW1CdWlsZGVyQ29udGV4dC5uZXdJbnN0YW5jZShjb250ZXh0LCBlbnVtRGVmLCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgZW51bURlZi5zZXROYW1lKGNvbnRleHQsIG5hbWUpOwotCi0gICAgICAgIGlmIChibG9jay5pc0dpdmVuKCkpIHsKLSAgICAgICAgICAgIGlmIChibG9jay5hcml0eSgpID09IEFyaXR5Lk9ORV9BUkdVTUVOVCkgewotICAgICAgICAgICAgICAgIGJsb2NrLnlpZWxkKGNvbnRleHQsIGN0eCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIEJpbmRpbmcgYmluZGluZyA9IGJsb2NrLmdldEJpbmRpbmcoKTsKLSAgICAgICAgICAgICAgICBiaW5kaW5nLnNldFNlbGYoY3R4KTsKLSAgICAgICAgICAgICAgICBibG9jay55aWVsZFNwZWNpZmljKGNvbnRleHQpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgdGhpcy5wZW5kaW5nTGlzdC5hZGQoZW51bURlZik7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgQnVpbGRlci5maW5hbGl6ZV90b19wb29sKHBvb2wpCi0gICAgICoKLSAgICAgKiBBZGRzIGFsbCBhY2N1bXVsYXRlZCBtZXNzYWdlIGFuZCBlbnVtIGRlc2NyaXB0b3JzIGNyZWF0ZWQgaW4gdGhpcyBidWlsZGVyCi0gICAgICogY29udGV4dCB0byB0aGUgZ2l2ZW4gcG9vbC4gVGhlIG9wZXJhdGlvbiBvY2N1cnMgYXRvbWljYWxseSwgYW5kIGFsbAotICAgICAqIGRlc2NyaXB0b3JzIGNhbiByZWZlciB0byBlYWNoIG90aGVyIChpbmNsdWRpbmcgaW4gY3ljbGVzKS4gVGhpcyBpcyB0aGUgb25seQotICAgICAqIHdheSB0byBidWlsZCAoY28pcmVjdXJzaXZlIG1lc3NhZ2UgZGVmaW5pdGlvbnMuCi0gICAgICoKLSAgICAgKiBUaGlzIG1ldGhvZCBpcyB1c3VhbGx5IGNhbGxlZCBhdXRvbWF0aWNhbGx5IGJ5IERlc2NyaXB0b3JQb29sI2J1aWxkIGFmdGVyIGl0Ci0gICAgICogaW52b2tlcyB0aGUgZ2l2ZW4gdXNlciBibG9jayBpbiB0aGUgY29udGV4dCBvZiB0aGUgYnVpbGRlci4gVGhlIHVzZXIgc2hvdWxkCi0gICAgICogbm90IG5vcm1hbGx5IG5lZWQgdG8gY2FsbCB0aGlzIG1hbnVhbGx5IGJlY2F1c2UgYSBCdWlsZGVyIGlzIG5vdCBub3JtYWxseQotICAgICAqIGNyZWF0ZWQgbWFudWFsbHkuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAiZmluYWxpemVfdG9fcG9vbCIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGZpbmFsaXplVG9Qb29sKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgcmJQb29sKSB7Ci0gICAgICAgIFJ1YnlEZXNjcmlwdG9yUG9vbCBwb29sID0gKFJ1YnlEZXNjcmlwdG9yUG9vbCkgcmJQb29sOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMucGVuZGluZ0xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIElSdWJ5T2JqZWN0IGRlZlJiID0gdGhpcy5wZW5kaW5nTGlzdC5lbnRyeShpKTsKLSAgICAgICAgICAgIGlmIChkZWZSYiBpbnN0YW5jZW9mIFJ1YnlEZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICAgICAgcG9vbC5hZGRUb1N5bXRhYihjb250ZXh0LCAoUnVieURlc2NyaXB0b3IpIGRlZlJiKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcG9vbC5hZGRUb1N5bXRhYihjb250ZXh0LCAoUnVieUVudW1EZXNjcmlwdG9yKSBkZWZSYik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5wZW5kaW5nTGlzdCA9IGNvbnRleHQucnVudGltZS5uZXdBcnJheSgpOwotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSdWJ5QXJyYXkgcGVuZGluZ0xpc3Q7Ci0gICAgcHJpdmF0ZSBSdWJ5Q2xhc3MgY0Rlc2NyaXB0b3IsIGNFbnVtRGVzY3JpcHRvciwgY01lc3NhZ2VCdWlsZGVyQ29udGV4dCwgY0VudW1CdWlsZGVyQ29udGV4dDsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlEZXNjcmlwdG9yLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5RGVzY3JpcHRvci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkZDkxNzliLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlEZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLyoKLSAqIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieTsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvczsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzOwotaW1wb3J0IG9yZy5qcnVieS4qOwotaW1wb3J0IG9yZy5qcnVieS5hbm5vLkpSdWJ5Q2xhc3M7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuQmxvY2s7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuT2JqZWN0QWxsb2NhdG9yOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLlRocmVhZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuYnVpbHRpbi5JUnVieU9iamVjdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLQotQEpSdWJ5Q2xhc3MobmFtZSA9ICJEZXNjcmlwdG9yIiwgaW5jbHVkZSA9ICJFbnVtZXJhYmxlIikKLXB1YmxpYyBjbGFzcyBSdWJ5RGVzY3JpcHRvciBleHRlbmRzIFJ1YnlPYmplY3QgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVSdWJ5RGVzY3JpcHRvcihSdWJ5IHJ1bnRpbWUpIHsKLSAgICAgICAgUnVieU1vZHVsZSBwcm90b2J1ZiA9IHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1ZiIpOwotICAgICAgICBSdWJ5Q2xhc3MgY0Rlc2NyaXB0b3IgPSBwcm90b2J1Zi5kZWZpbmVDbGFzc1VuZGVyKCJEZXNjcmlwdG9yIiwgcnVudGltZS5nZXRPYmplY3QoKSwgbmV3IE9iamVjdEFsbG9jYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIElSdWJ5T2JqZWN0IGFsbG9jYXRlKFJ1YnkgcnVudGltZSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdWJ5RGVzY3JpcHRvcihydW50aW1lLCBrbGF6eik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjRGVzY3JpcHRvci5pbmNsdWRlTW9kdWxlKHJ1bnRpbWUuZ2V0RW51bWVyYWJsZSgpKTsKLSAgICAgICAgY0Rlc2NyaXB0b3IuZGVmaW5lQW5ub3RhdGVkTWV0aG9kcyhSdWJ5RGVzY3JpcHRvci5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFJ1YnlEZXNjcmlwdG9yKFJ1YnkgcnVudGltZSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgIHN1cGVyKHJ1bnRpbWUsIGtsYXp6KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBEZXNjcmlwdG9yLm5ldyA9PiBkZXNjcmlwdG9yCi0gICAgICoKLSAgICAgKiBDcmVhdGVzIGEgbmV3LCBlbXB0eSwgbWVzc2FnZSB0eXBlIGRlc2NyaXB0b3IuIEF0IGEgbWluaW11bSwgaXRzIG5hbWUgbXVzdCBiZQotICAgICAqIHNldCBiZWZvcmUgaXQgaXMgYWRkZWQgdG8gYSBwb29sLiBJdCBjYW5ub3QgYmUgdXNlZCB0byBjcmVhdGUgbWVzc2FnZXMgdW50aWwKLSAgICAgKiBpdCBpcyBhZGRlZCB0byBhIHBvb2wsIGFmdGVyIHdoaWNoIGl0IGJlY29tZXMgaW1tdXRhYmxlIChhcyBwYXJ0IG9mIGEKLSAgICAgKiBmaW5hbGl6YXRpb24gcHJvY2VzcykuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGluaXRpYWxpemUoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuYnVpbGRlciA9IERlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKTsKLSAgICAgICAgdGhpcy5maWVsZERlZk1hcCA9IG5ldyBIYXNoTWFwPFN0cmluZywgUnVieUZpZWxkRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgdGhpcy5vbmVvZkRlZnMgPSBuZXcgSGFzaE1hcDxJUnVieU9iamVjdCwgUnVieU9uZW9mRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRGVzY3JpcHRvci5uYW1lID0+IG5hbWUKLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBtZXNzYWdlIHR5cGUgYXMgYSBmdWxseS1xdWFsZmllZCBzdHJpbmcgKGUuZy4sCi0gICAgICogTXkuUGFja2FnZS5NZXNzYWdlVHlwZSkuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAibmFtZSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGdldE5hbWUoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICBEZXNjcmlwdG9yLm5hbWUgPSBuYW1lCi0gICAgICoKLSAgICAgKiBBc3NpZ25zIGEgbmFtZSB0byB0aGlzIG1lc3NhZ2UgdHlwZS4gVGhlIGRlc2NyaXB0b3IgbXVzdCBub3QgaGF2ZSBiZWVuIGFkZGVkCi0gICAgICogdG8gYSBwb29sIHlldC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJuYW1lPSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IHNldE5hbWUoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBuYW1lKSB7Ci0gICAgICAgIHRoaXMubmFtZSA9IG5hbWU7Ci0gICAgICAgIHRoaXMuYnVpbGRlci5zZXROYW1lKFV0aWxzLmVzY2FwZUlkZW50aWZpZXIodGhpcy5uYW1lLmFzSmF2YVN0cmluZygpKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRGVzY3JpcHRvci5hZGRfZmllbGQoZmllbGQpID0+IG5pbAotICAgICAqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gRmllbGREZXNjcmlwdG9yIHRvIHRoaXMgbWVzc2FnZSB0eXBlLiBUaGUgZGVzY3JpcHRvciBtdXN0IG5vdAotICAgICAqIGhhdmUgYmVlbiBhZGRlZCB0byBhIHBvb2wgeWV0LiBSYWlzZXMgYW4gZXhjZXB0aW9uIGlmIGEgZmllbGQgd2l0aCB0aGUgc2FtZQotICAgICAqIG5hbWUgb3IgbnVtYmVyIGFscmVhZHkgZXhpc3RzLiBTdWItdHlwZSByZWZlcmVuY2VzIChlLmcuIGZvciBmaWVsZHMgb2YgdHlwZQotICAgICAqIG1lc3NhZ2UpIGFyZSBub3QgcmVzb2x2ZWQgYXQgdGhpcyBwb2ludC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJhZGRfZmllbGQiKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBhZGRGaWVsZChUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IG9iaikgewotICAgICAgICBSdWJ5RmllbGREZXNjcmlwdG9yIGZpZWxkRGVmID0gKFJ1YnlGaWVsZERlc2NyaXB0b3IpIG9iajsKLSAgICAgICAgdGhpcy5maWVsZERlZk1hcC5wdXQoZmllbGREZWYuZ2V0TmFtZShjb250ZXh0KS5hc0phdmFTdHJpbmcoKSwgZmllbGREZWYpOwotICAgICAgICB0aGlzLmJ1aWxkZXIuYWRkRmllbGQoZmllbGREZWYuYnVpbGQoKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRGVzY3JpcHRvci5sb29rdXAobmFtZSkgPT4gRmllbGREZXNjcmlwdG9yCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIHRoZSBmaWVsZCBkZXNjcmlwdG9yIGZvciB0aGUgZmllbGQgd2l0aCB0aGUgZ2l2ZW4gbmFtZSwgaWYgcHJlc2VudCwKLSAgICAgKiBvciBuaWwgaWYgbm9uZS4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgbG9va3VwKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgZmllbGROYW1lKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmZpZWxkRGVmTWFwLmdldChmaWVsZE5hbWUuYXNKYXZhU3RyaW5nKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIERlc2NyaXB0b3IubXNnY2xhc3MgPT4gbWVzc2FnZV9rbGFzcwotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgUnVieSBjbGFzcyBjcmVhdGVkIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4gVmFsaWQgb25seSBvbmNlIHRoZQotICAgICAqIG1lc3NhZ2UgdHlwZSBoYXMgYmVlbiBhZGRlZCB0byBhIHBvb2wuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IG1zZ2NsYXNzKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBpZiAodGhpcy5rbGF6eiA9PSBudWxsKSB7Ci0gICAgICAgICAgICB0aGlzLmtsYXp6ID0gYnVpbGRDbGFzc0Zyb21EZXNjcmlwdG9yKGNvbnRleHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzLmtsYXp6OwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIERlc2NyaXB0b3IuZWFjaCgmYmxvY2spCi0gICAgICoKLSAgICAgKiBJdGVyYXRlcyBvdmVyIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZSwgeWllbGRpbmcgdG8gdGhlIGJsb2NrIG9uIGVhY2ggb25lLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBlYWNoKFRocmVhZENvbnRleHQgY29udGV4dCwgQmxvY2sgYmxvY2spIHsKLSAgICAgICAgZm9yIChNYXAuRW50cnk8U3RyaW5nLCBSdWJ5RmllbGREZXNjcmlwdG9yPiBlbnRyeSA6IGZpZWxkRGVmTWFwLmVudHJ5U2V0KCkpIHsKLSAgICAgICAgICAgIGJsb2NrLnlpZWxkKGNvbnRleHQsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRGVzY3JpcHRvci5hZGRfb25lb2Yob25lb2YpID0+IG5pbAotICAgICAqCi0gICAgICogQWRkcyB0aGUgZ2l2ZW4gT25lb2ZEZXNjcmlwdG9yIHRvIHRoaXMgbWVzc2FnZSB0eXBlLiBUaGlzIGRlc2NyaXB0b3IgbXVzdCBub3QKLSAgICAgKiBoYXZlIGJlZW4gYWRkZWQgdG8gYSBwb29sIHlldC4gUmFpc2VzIGFuIGV4Y2VwdGlvbiBpZiBhIG9uZW9mIHdpdGggdGhlIHNhbWUKLSAgICAgKiBuYW1lIGFscmVhZHkgZXhpc3RzLCBvciBpZiBhbnkgb2YgdGhlIG9uZW9mJ3MgZmllbGRzJyBuYW1lcyBvciBudW1iZXJzCi0gICAgICogY29uZmxpY3Qgd2l0aCBhbiBleGlzdGluZyBmaWVsZCBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4gQWxsIGZpZWxkcyBpbiB0aGUgb25lb2YKLSAgICAgKiBhcmUgYWRkZWQgdG8gdGhlIG1lc3NhZ2UgZGVzY3JpcHRvci4gU3ViLXR5cGUgcmVmZXJlbmNlcyAoZS5nLiBmb3IgZmllbGRzIG9mCi0gICAgICogdHlwZSBtZXNzYWdlKSBhcmUgbm90IHJlc29sdmVkIGF0IHRoaXMgcG9pbnQuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAiYWRkX29uZW9mIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgYWRkT25lb2YoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBvYmopIHsKLSAgICAgICAgUnVieU9uZW9mRGVzY3JpcHRvciBkZWYgPSAoUnVieU9uZW9mRGVzY3JpcHRvcikgb2JqOwotICAgICAgICBidWlsZGVyLmFkZE9uZW9mRGVjbChkZWYuYnVpbGQoYnVpbGRlci5nZXRPbmVvZkRlY2xDb3VudCgpKSk7Ci0gICAgICAgIGZvciAoUnVieUZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgOiBkZWYuZ2V0RmllbGRzKCkpIHsKLSAgICAgICAgICAgIGFkZEZpZWxkKGNvbnRleHQsIGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgb25lb2ZEZWZzLnB1dChkZWYuZ2V0TmFtZShjb250ZXh0KSwgZGVmKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBEZXNjcmlwdG9yLmVhY2hfb25lb2YoJmJsb2NrKSA9PiBuaWwKLSAgICAgKgotICAgICAqIEludm9rZXMgdGhlIGdpdmVuIGJsb2NrIGZvciBlYWNoIG9uZW9mIGluIHRoaXMgbWVzc2FnZSB0eXBlLCBwYXNzaW5nIHRoZQotICAgICAqIGNvcnJlc3BvbmRpbmcgT25lb2ZEZXNjcmlwdG9yLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gImVhY2hfb25lb2YiKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBlYWNoT25lb2YoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBCbG9jayBibG9jaykgewotICAgICAgICBmb3IgKFJ1YnlPbmVvZkRlc2NyaXB0b3Igb25lb2ZEZXNjcmlwdG9yIDogb25lb2ZEZWZzLnZhbHVlcygpKSB7Ci0gICAgICAgICAgICBibG9jay55aWVsZFNwZWNpZmljKGNvbnRleHQsIG9uZW9mRGVzY3JpcHRvcik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBEZXNjcmlwdG9yLmxvb2t1cF9vbmVvZihuYW1lKSA9PiBPbmVvZkRlc2NyaXB0b3IKLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIG9uZW9mIGRlc2NyaXB0b3IgZm9yIHRoZSBvbmVvZiB3aXRoIHRoZSBnaXZlbiBuYW1lLCBpZiBwcmVzZW50LAotICAgICAqIG9yIG5pbCBpZiBub25lLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gImxvb2t1cF9vbmVvZiIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGxvb2t1cE9uZW9mKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgbmFtZSkgewotICAgICAgICBpZiAobmFtZSBpbnN0YW5jZW9mIFJ1YnlTeW1ib2wpIHsKLSAgICAgICAgICAgIG5hbWUgPSAoKFJ1YnlTeW1ib2wpIG5hbWUpLmlkMm5hbWUoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gb25lb2ZEZWZzLmNvbnRhaW5zS2V5KG5hbWUpID8gb25lb2ZEZWZzLmdldChuYW1lKSA6IGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBzZXREZXNjcmlwdG9yKERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3JQcm90b3MuRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgZ2V0QnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0TWFwRW50cnkoYm9vbGVhbiBpc01hcEVudHJ5KSB7Ci0gICAgICAgIHRoaXMuYnVpbGRlci5zZXRPcHRpb25zKERlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMubmV3QnVpbGRlcigpLnNldE1hcEVudHJ5KGlzTWFwRW50cnkpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJ1YnlNb2R1bGUgYnVpbGRDbGFzc0Zyb21EZXNjcmlwdG9yKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0KLSAgICAgICAgT2JqZWN0QWxsb2NhdG9yIGFsbG9jYXRvciA9IG5ldyBPYmplY3RBbGxvY2F0b3IoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBJUnVieU9iamVjdCBhbGxvY2F0ZShSdWJ5IHJ1bnRpbWUsIFJ1YnlDbGFzcyBrbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUnVieU1lc3NhZ2UocnVudGltZSwga2xhenosIGRlc2NyaXB0b3IpOwotICAgICAgICAgICAgfQotICAgICAgICB9OwotCi0gICAgICAgIC8vIHJiX2RlZmluZV9jbGFzc19pZAotICAgICAgICBSdWJ5Q2xhc3Mga2xhc3MgPSBSdWJ5Q2xhc3MubmV3Q2xhc3MocnVudGltZSwgcnVudGltZS5nZXRPYmplY3QoKSk7Ci0gICAgICAgIGtsYXNzLnNldEFsbG9jYXRvcihhbGxvY2F0b3IpOwotICAgICAgICBrbGFzcy5tYWtlTWV0YUNsYXNzKHJ1bnRpbWUuZ2V0T2JqZWN0KCkuZ2V0TWV0YUNsYXNzKCkpOwotICAgICAgICBrbGFzcy5pbmhlcml0KHJ1bnRpbWUuZ2V0T2JqZWN0KCkpOwotICAgICAgICBSdWJ5TW9kdWxlIG1lc3NhZ2VFeHRzID0gcnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmOjpNZXNzYWdlRXh0cyIpOwotICAgICAgICBrbGFzcy5pbmNsdWRlKG5ldyBJUnVieU9iamVjdFtdIHttZXNzYWdlRXh0c30pOwotICAgICAgICBrbGFzcy5pbnN0YW5jZV92YXJpYWJsZV9zZXQocnVudGltZS5uZXdTdHJpbmcoVXRpbHMuREVTQ1JJUFRPUl9JTlNUQU5DRV9WQVIpLCB0aGlzKTsKLSAgICAgICAga2xhc3MuZGVmaW5lQW5ub3RhdGVkTWV0aG9kcyhSdWJ5TWVzc2FnZS5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBrbGFzczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgUnVieUZpZWxkRGVzY3JpcHRvciBsb29rdXAoU3RyaW5nIGZpZWxkTmFtZSkgewotICAgICAgICByZXR1cm4gZmllbGREZWZNYXAuZ2V0KFV0aWxzLnVuZXNjYXBlSWRlbnRpZmllcihmaWVsZE5hbWUpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIElSdWJ5T2JqZWN0IG5hbWU7Ci0gICAgcHJpdmF0ZSBSdWJ5TW9kdWxlIGtsYXp6OwotCi0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yUHJvdG9zLkRlc2NyaXB0b3JQcm90by5CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBNYXA8U3RyaW5nLCBSdWJ5RmllbGREZXNjcmlwdG9yPiBmaWVsZERlZk1hcDsKLSAgICBwcml2YXRlIE1hcDxJUnVieU9iamVjdCwgUnVieU9uZW9mRGVzY3JpcHRvcj4gb25lb2ZEZWZzOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieURlc2NyaXB0b3JQb29sLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5RGVzY3JpcHRvclBvb2wuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDM0NWNiOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5RGVzY3JpcHRvclBvb2wuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vKgotICogUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5OwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnM7Ci1pbXBvcnQgb3JnLmpydWJ5Lio7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlDbGFzczsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieU1ldGhvZDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS4qOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLmJ1aWx0aW4uSVJ1YnlPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1ASlJ1YnlDbGFzcyhuYW1lID0gIkRlc2NyaXB0b3JQb29sIikKLXB1YmxpYyBjbGFzcyBSdWJ5RGVzY3JpcHRvclBvb2wgZXh0ZW5kcyBSdWJ5T2JqZWN0IHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUnVieURlc2NyaXB0b3JQb29sKFJ1YnkgcnVudGltZSkgewotICAgICAgICBSdWJ5TW9kdWxlIHByb3RvYnVmID0gcnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmIik7Ci0gICAgICAgIFJ1YnlDbGFzcyBjRGVzY3JpcHRvclBvb2wgPSBwcm90b2J1Zi5kZWZpbmVDbGFzc1VuZGVyKCJEZXNjcmlwdG9yUG9vbCIsIHJ1bnRpbWUuZ2V0T2JqZWN0KCksIG5ldyBPYmplY3RBbGxvY2F0b3IoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBJUnVieU9iamVjdCBhbGxvY2F0ZShSdWJ5IHJ1bnRpbWUsIFJ1YnlDbGFzcyBrbGF6eikgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUnVieURlc2NyaXB0b3JQb29sKHJ1bnRpbWUsIGtsYXp6KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSk7Ci0KLSAgICAgICAgY0Rlc2NyaXB0b3JQb29sLmRlZmluZUFubm90YXRlZE1ldGhvZHMoUnVieURlc2NyaXB0b3JQb29sLmNsYXNzKTsKLSAgICAgICAgZGVzY3JpcHRvclBvb2wgPSAoUnVieURlc2NyaXB0b3JQb29sKSBjRGVzY3JpcHRvclBvb2wubmV3SW5zdGFuY2UocnVudGltZS5nZXRDdXJyZW50Q29udGV4dCgpLCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUnVieURlc2NyaXB0b3JQb29sKFJ1YnkgcnVieSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgIHN1cGVyKHJ1YnksIGtsYXp6KTsKLSAgICB9Ci0KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5pdGlhbGl6ZShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgdGhpcy5zeW10YWIgPSBuZXcgSGFzaE1hcDxJUnVieU9iamVjdCwgSVJ1YnlPYmplY3Q+KCk7Ci0gICAgICAgIHRoaXMuY0J1aWxkZXIgPSAoUnVieUNsYXNzKSBjb250ZXh0LnJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1Zjo6QnVpbGRlciIpOwotICAgICAgICB0aGlzLmJ1aWxkZXIgPSBEZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgYnVpbGQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBCbG9jayBibG9jaykgewotICAgICAgICBSdWJ5QnVpbGRlciBjdHggPSAoUnVieUJ1aWxkZXIpIGNCdWlsZGVyLm5ld0luc3RhbmNlKGNvbnRleHQsIEJsb2NrLk5VTExfQkxPQ0spOwotICAgICAgICBpZiAoYmxvY2suYXJpdHkoKSA9PSBBcml0eS5PTkVfQVJHVU1FTlQpIHsKLSAgICAgICAgICAgIGJsb2NrLnlpZWxkKGNvbnRleHQsIGN0eCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBibG9jay5nZXRCaW5kaW5nKCk7Ci0gICAgICAgICAgICBiaW5kaW5nLnNldFNlbGYoY3R4KTsKLSAgICAgICAgICAgIGJsb2NrLnlpZWxkU3BlY2lmaWMoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgY3R4LmZpbmFsaXplVG9Qb29sKGNvbnRleHQsIHRoaXMpOwotICAgICAgICBidWlsZEZpbGVEZXNjcmlwdG9yKGNvbnRleHQpOwotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBsb29rdXAoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBuYW1lKSB7Ci0gICAgICAgIElSdWJ5T2JqZWN0IGRlc2NyaXB0b3IgPSB0aGlzLnN5bXRhYi5nZXQobmFtZSk7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRGVzY3JpcHRvclBvb2wuZ2VuZXJhdGVkX3Bvb2wgPT4gZGVzY3JpcHRvcl9wb29sCi0gICAgICoKLSAgICAgKiBDbGFzcyBtZXRob2QgdGhhdCByZXR1cm5zIHRoZSBnbG9iYWwgRGVzY3JpcHRvclBvb2wuIFRoaXMgaXMgYSBzaW5nbGV0b24gaW50bwotICAgICAqIHdoaWNoIGdlbmVyYXRlZC1jb2RlIG1lc3NhZ2UgYW5kIGVudW0gdHlwZXMgYXJlIHJlZ2lzdGVyZWQuIFRoZSB1c2VyIG1heSBhbHNvCi0gICAgICogcmVnaXN0ZXIgdHlwZXMgaW4gdGhpcyBwb29sIGZvciBjb252ZW5pZW5jZSBzbyB0aGF0IHRoZXkgZG8gbm90IGhhdmUgdG8gaG9sZAotICAgICAqIGEgcmVmZXJlbmNlIHRvIGEgcHJpdmF0ZSBwb29sIGluc3RhbmNlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChtZXRhID0gdHJ1ZSwgbmFtZSA9ICJnZW5lcmF0ZWRfcG9vbCIpCi0gICAgcHVibGljIHN0YXRpYyBJUnVieU9iamVjdCBnZW5lcmF0ZWRQb29sKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgcmVjdikgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvclBvb2w7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgYWRkVG9TeW10YWIoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBSdWJ5RGVzY3JpcHRvciBkZWYpIHsKLSAgICAgICAgc3ltdGFiLnB1dChkZWYuZ2V0TmFtZShjb250ZXh0KSwgZGVmKTsKLSAgICAgICAgdGhpcy5idWlsZGVyLmFkZE1lc3NhZ2VUeXBlKGRlZi5nZXRCdWlsZGVyKCkpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCB2b2lkIGFkZFRvU3ltdGFiKFRocmVhZENvbnRleHQgY29udGV4dCwgUnVieUVudW1EZXNjcmlwdG9yIGRlZikgewotICAgICAgICBzeW10YWIucHV0KGRlZi5nZXROYW1lKGNvbnRleHQpLCBkZWYpOwotICAgICAgICB0aGlzLmJ1aWxkZXIuYWRkRW51bVR5cGUoZGVmLmdldEJ1aWxkZXIoKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGJ1aWxkRmlsZURlc2NyaXB0b3IoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJ1YnkgcnVudGltZSA9IGNvbnRleHQucnVudGltZTsKLSAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgIHRoaXMuYnVpbGRlci5zZXRTeW50YXgoInByb3RvMyIpOwotICAgICAgICAgICAgZmluYWwgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IgZmlsZURlc2NyaXB0b3IgPSBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oCi0gICAgICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlci5idWlsZCgpLCBuZXcgRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JbXXt9KTsKLQotICAgICAgICAgICAgZm9yIChEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvciA6IGZpbGVEZXNjcmlwdG9yLmdldEVudW1UeXBlcygpKSB7Ci0gICAgICAgICAgICAgICAgU3RyaW5nIGVudW1OYW1lID0gVXRpbHMudW5lc2NhcGVJZGVudGlmaWVyKGVudW1EZXNjcmlwdG9yLmdldE5hbWUoKSk7Ci0gICAgICAgICAgICAgICAgaWYgKGVudW1EZXNjcmlwdG9yLmZpbmRWYWx1ZUJ5TnVtYmVyKDApID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdUeXBlRXJyb3IoIkVudW0gZGVmaW5pdGlvbiAiICsgZW51bU5hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICArICIgZG9lcyBub3QgY29udGFpbiBhIHZhbHVlIGZvciAnMCciKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgKChSdWJ5RW51bURlc2NyaXB0b3IpIHN5bXRhYi5nZXQocnVudGltZS5uZXdTdHJpbmcoZW51bU5hbWUpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgIC5zZXREZXNjcmlwdG9yKGVudW1EZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGZvciAoRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yIDogZmlsZURlc2NyaXB0b3IuZ2V0TWVzc2FnZVR5cGVzKCkpIHsKLSAgICAgICAgICAgICAgICBSdWJ5RGVzY3JpcHRvciBydWJ5RGVzY3JpcHRvciA9ICgoUnVieURlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgICAgICBzeW10YWIuZ2V0KHJ1bnRpbWUubmV3U3RyaW5nKFV0aWxzLnVuZXNjYXBlSWRlbnRpZmllcihkZXNjcmlwdG9yLmdldE5hbWUoKSkpKSk7Ci0gICAgICAgICAgICAgICAgZm9yIChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yIDogZGVzY3JpcHRvci5nZXRGaWVsZHMoKSkgewotICAgICAgICAgICAgICAgICAgICBpZiAoZmllbGREZXNjcmlwdG9yLmlzUmVxdWlyZWQoKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdUeXBlRXJyb3IoIlJlcXVpcmVkIGZpZWxkcyBhcmUgdW5zdXBwb3J0ZWQgaW4gcHJvdG8zIik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgUnVieUZpZWxkRGVzY3JpcHRvciBydWJ5RmllbGREZXNjcmlwdG9yID0gcnVieURlc2NyaXB0b3IubG9va3VwKGZpZWxkRGVzY3JpcHRvci5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICBydWJ5RmllbGREZXNjcmlwdG9yLnNldEZpZWxkRGVmKGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZERlc2NyaXB0b3IuZ2V0VHlwZSgpID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJ1YnlEZXNjcmlwdG9yIHN1YlR5cGUgPSAoUnVieURlc2NyaXB0b3IpIGxvb2t1cChjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBydW50aW1lLm5ld1N0cmluZyhVdGlscy51bmVzY2FwZUlkZW50aWZpZXIoZmllbGREZXNjcmlwdG9yLmdldE1lc3NhZ2VUeXBlKCkuZ2V0TmFtZSgpKSkpOwotICAgICAgICAgICAgICAgICAgICAgICAgcnVieUZpZWxkRGVzY3JpcHRvci5zZXRTdWJUeXBlKHN1YlR5cGUpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgICAgIGlmIChmaWVsZERlc2NyaXB0b3IuZ2V0VHlwZSgpID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLkVOVU0pIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJ1YnlFbnVtRGVzY3JpcHRvciBzdWJUeXBlID0gKFJ1YnlFbnVtRGVzY3JpcHRvcikgbG9va3VwKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUubmV3U3RyaW5nKFV0aWxzLnVuZXNjYXBlSWRlbnRpZmllcihmaWVsZERlc2NyaXB0b3IuZ2V0RW51bVR5cGUoKS5nZXROYW1lKCkpKSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBydWJ5RmllbGREZXNjcmlwdG9yLnNldFN1YlR5cGUoc3ViVHlwZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgcnVieURlc2NyaXB0b3Iuc2V0RGVzY3JpcHRvcihkZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfSBjYXRjaCAoRGVzY3JpcHRvcnMuRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdSdW50aW1lRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgUnVieURlc2NyaXB0b3JQb29sIGRlc2NyaXB0b3JQb29sOwotCi0gICAgcHJpdmF0ZSBSdWJ5Q2xhc3MgY0J1aWxkZXI7Ci0gICAgcHJpdmF0ZSBNYXA8SVJ1YnlPYmplY3QsIElSdWJ5T2JqZWN0PiBzeW10YWI7Ci0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yUHJvdG9zLkZpbGVEZXNjcmlwdG9yUHJvdG8uQnVpbGRlciBidWlsZGVyOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieUVudW0uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkyOWQ4NjkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDg2ICswLDAgQEAKLS8qCi0gKiBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYuanJ1Ynk7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzOwotaW1wb3J0IG9yZy5qcnVieS5SdWJ5TW9kdWxlOwotaW1wb3J0IG9yZy5qcnVieS5SdWJ5TnVtZXJpYzsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieU1ldGhvZDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5UaHJlYWRDb250ZXh0OwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLmJ1aWx0aW4uSVJ1YnlPYmplY3Q7Ci0KLXB1YmxpYyBjbGFzcyBSdWJ5RW51bSB7Ci0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRW51bS5sb29rdXAobnVtYmVyKSA9PiBuYW1lCi0gICAgICoKLSAgICAgKiBUaGlzIG1vZHVsZSBtZXRob2QsIHByb3ZpZGVkIG9uIGVhY2ggZ2VuZXJhdGVkIGVudW0gbW9kdWxlLCBsb29rcyB1cCBhbiBlbnVtCi0gICAgICogdmFsdWUgYnkgbnVtYmVyIGFuZCByZXR1cm5zIGl0cyBuYW1lIGFzIGEgUnVieSBzeW1ib2wsIG9yIG5pbCBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG1ldGEgPSB0cnVlKQotICAgIHB1YmxpYyBzdGF0aWMgSVJ1YnlPYmplY3QgbG9va3VwKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgcmVjdiwgSVJ1YnlPYmplY3QgbnVtYmVyKSB7Ci0gICAgICAgIFJ1YnlFbnVtRGVzY3JpcHRvciBydWJ5RW51bURlc2NyaXB0b3Jlc2NyaXB0b3IgPSAoUnVieUVudW1EZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKGNvbnRleHQsIHJlY3YpOwotICAgICAgICBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcnVieUVudW1EZXNjcmlwdG9yZXNjcmlwdG9yLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciB2YWx1ZSA9IGRlc2NyaXB0b3IuZmluZFZhbHVlQnlOdW1iZXIoUnVieU51bWVyaWMubnVtMmludChudW1iZXIpKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUubmV3U3ltYm9sKHZhbHVlLmdldE5hbWUoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRW51bS5yZXNvbHZlKG5hbWUpID0+IG51bWJlcgotICAgICAqCi0gICAgICogVGhpcyBtb2R1bGUgbWV0aG9kLCBwcm92aWRlZCBvbiBlYWNoIGdlbmVyYXRlZCBlbnVtIG1vZHVsZSwgbG9va3MgdXAgYW4gZW51bQotICAgICAqIHZhbHVlIGJ5IG5hbWUgKGFzIGEgUnVieSBzeW1ib2wpIGFuZCByZXR1cm5zIGl0cyBuYW1lLCBvciBuaWwgaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChtZXRhID0gdHJ1ZSkKLSAgICBwdWJsaWMgc3RhdGljIElSdWJ5T2JqZWN0IHJlc29sdmUoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCByZWN2LCBJUnVieU9iamVjdCBuYW1lKSB7Ci0gICAgICAgIFJ1YnlFbnVtRGVzY3JpcHRvciBydWJ5RW51bURlc2NyaXB0b3Jlc2NyaXB0b3IgPSAoUnVieUVudW1EZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yKGNvbnRleHQsIHJlY3YpOwotICAgICAgICBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gcnVieUVudW1EZXNjcmlwdG9yZXNjcmlwdG9yLmdldERlc2NyaXB0b3IoKTsKLSAgICAgICAgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciB2YWx1ZSA9IGRlc2NyaXB0b3IuZmluZFZhbHVlQnlOYW1lKG5hbWUuYXNKYXZhU3RyaW5nKCkpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5uZXdGaXhudW0odmFsdWUuZ2V0TnVtYmVyKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEVudW0uZGVzY3JpcHRvcgotICAgICAqCi0gICAgICogVGhpcyBtb2R1bGUgbWV0aG9kLCBwcm92aWRlZCBvbiBlYWNoIGdlbmVyYXRlZCBlbnVtIG1vZHVsZSwgcmV0dXJucyB0aGUKLSAgICAgKiBFbnVtRGVzY3JpcHRvciBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZW51bSB0eXBlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChtZXRhID0gdHJ1ZSwgbmFtZSA9ICJkZXNjcmlwdG9yIikKLSAgICBwdWJsaWMgc3RhdGljIElSdWJ5T2JqZWN0IGdldERlc2NyaXB0b3IoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCByZWN2KSB7Ci0gICAgICAgIHJldHVybiAoKFJ1YnlNb2R1bGUpIHJlY3YpLmdldEluc3RhbmNlVmFyaWFibGUoVXRpbHMuREVTQ1JJUFRPUl9JTlNUQU5DRV9WQVIpOwotICAgIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlFbnVtQnVpbGRlckNvbnRleHQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlFbnVtQnVpbGRlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTRjYWMzNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5RW51bUJ1aWxkZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MiArMCwwIEBACi0vKgotICogUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5OwotCi1pbXBvcnQgb3JnLmpydWJ5LlJ1Ynk7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1YnlDbGFzczsKLWltcG9ydCBvcmcuanJ1YnkuUnVieU1vZHVsZTsKLWltcG9ydCBvcmcuanJ1YnkuUnVieU9iamVjdDsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieUNsYXNzOwotaW1wb3J0IG9yZy5qcnVieS5hbm5vLkpSdWJ5TWV0aG9kOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLk9iamVjdEFsbG9jYXRvcjsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5UaHJlYWRDb250ZXh0OwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLmJ1aWx0aW4uSVJ1YnlPYmplY3Q7Ci0KLUBKUnVieUNsYXNzKG5hbWUgPSAiRW51bUJ1aWxkZXJDb250ZXh0IikKLXB1YmxpYyBjbGFzcyBSdWJ5RW51bUJ1aWxkZXJDb250ZXh0IGV4dGVuZHMgUnVieU9iamVjdCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVJ1YnlFbnVtQnVpbGRlckNvbnRleHQoUnVieSBydW50aW1lKSB7Ci0gICAgICAgIFJ1YnlNb2R1bGUgcHJvdG9idWYgPSBydW50aW1lLmdldENsYXNzRnJvbVBhdGgoIkdvb2dsZTo6UHJvdG9idWYiKTsKLSAgICAgICAgUnVieUNsYXNzIGNNZXNzYWdlQnVpbGRlckNvbnRleHQgPSBwcm90b2J1Zi5kZWZpbmVDbGFzc1VuZGVyKCJFbnVtQnVpbGRlckNvbnRleHQiLCBydW50aW1lLmdldE9iamVjdCgpLCBuZXcgT2JqZWN0QWxsb2NhdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSVJ1YnlPYmplY3QgYWxsb2NhdGUoUnVieSBydW50aW1lLCBSdWJ5Q2xhc3Mga2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJ1YnlFbnVtQnVpbGRlckNvbnRleHQocnVudGltZSwga2xhenopOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY01lc3NhZ2VCdWlsZGVyQ29udGV4dC5kZWZpbmVBbm5vdGF0ZWRNZXRob2RzKFJ1YnlFbnVtQnVpbGRlckNvbnRleHQuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdWJ5RW51bUJ1aWxkZXJDb250ZXh0KFJ1YnkgcnVieSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgIHN1cGVyKHJ1YnksIGtsYXp6KTsKLSAgICB9Ci0KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5pdGlhbGl6ZShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IGVudW1EZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRoaXMuZW51bURlc2NyaXB0b3IgPSAoUnVieUVudW1EZXNjcmlwdG9yKSBlbnVtRGVzY3JpcHRvcjsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRW51bUJ1aWxkZXIuYWRkX3ZhbHVlKG5hbWUsIG51bWJlcikKLSAgICAgKgotICAgICAqIEFkZHMgdGhlIGdpdmVuIG5hbWUgPT4gbnVtYmVyIG1hcHBpbmcgdG8gdGhlIGVudW0gdHlwZS4gTmFtZSBtdXN0IGJlIGEgUnVieQotICAgICAqIHN5bWJvbC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgdmFsdWUoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBuYW1lLCBJUnVieU9iamVjdCBudW1iZXIpIHsKLSAgICAgICAgdGhpcy5lbnVtRGVzY3JpcHRvci5hZGRWYWx1ZShjb250ZXh0LCBuYW1lLCBudW1iZXIpOwotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgUnVieUVudW1EZXNjcmlwdG9yIGVudW1EZXNjcmlwdG9yOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieUVudW1EZXNjcmlwdG9yLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5RW51bURlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRmODMyZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5RW51bURlc2NyaXB0b3IuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4NSArMCwwIEBACi0vKgotICogUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5OwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnM7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1Ynk7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1YnlDbGFzczsKLWltcG9ydCBvcmcuanJ1YnkuUnVieU1vZHVsZTsKLWltcG9ydCBvcmcuanJ1YnkuUnVieU9iamVjdDsKLWltcG9ydCBvcmcuanJ1YnkuUnVieU51bWVyaWM7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlDbGFzczsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieU1ldGhvZDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5CbG9jazsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5PYmplY3RBbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuVGhyZWFkQ29udGV4dDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5idWlsdGluLklSdWJ5T2JqZWN0OwotCi1ASlJ1YnlDbGFzcyhuYW1lID0gIkVudW1EZXNjcmlwdG9yIiwgaW5jbHVkZSA9ICJFbnVtZXJhYmxlIikKLXB1YmxpYyBjbGFzcyBSdWJ5RW51bURlc2NyaXB0b3IgZXh0ZW5kcyBSdWJ5T2JqZWN0IHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUnVieUVudW1EZXNjcmlwdG9yKFJ1YnkgcnVudGltZSkgewotICAgICAgICBSdWJ5TW9kdWxlIG1Qcm90b2J1ZiA9IHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1ZiIpOwotICAgICAgICBSdWJ5Q2xhc3MgY0VudW1EZXNjcmlwdG9yID0gbVByb3RvYnVmLmRlZmluZUNsYXNzVW5kZXIoIkVudW1EZXNjcmlwdG9yIiwgcnVudGltZS5nZXRPYmplY3QoKSwgbmV3IE9iamVjdEFsbG9jYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIElSdWJ5T2JqZWN0IGFsbG9jYXRlKFJ1YnkgcnVudGltZSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdWJ5RW51bURlc2NyaXB0b3IocnVudGltZSwga2xhenopOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY0VudW1EZXNjcmlwdG9yLmluY2x1ZGVNb2R1bGUocnVudGltZS5nZXRFbnVtZXJhYmxlKCkpOwotICAgICAgICBjRW51bURlc2NyaXB0b3IuZGVmaW5lQW5ub3RhdGVkTWV0aG9kcyhSdWJ5RW51bURlc2NyaXB0b3IuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdWJ5RW51bURlc2NyaXB0b3IoUnVieSBydW50aW1lLCBSdWJ5Q2xhc3Mga2xhenopIHsKLSAgICAgICAgc3VwZXIocnVudGltZSwga2xhenopOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEVudW1EZXNjcmlwdG9yLm5ldyA9PiBlbnVtX2Rlc2NyaXB0b3IKLSAgICAgKgotICAgICAqIENyZWF0ZXMgYSBuZXcsIGVtcHR5LCBlbnVtIGRlc2NyaXB0b3IuIE11c3QgYmUgYWRkZWQgdG8gYSBwb29sIGJlZm9yZSB0aGUKLSAgICAgKiBlbnVtIHR5cGUgY2FuIGJlIHVzZWQuIFRoZSBlbnVtIHR5cGUgbWF5IG9ubHkgYmUgbW9kaWZpZWQgcHJpb3IgdG8gYWRkaW5nIHRvCi0gICAgICogYSBwb29sLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbml0aWFsaXplKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0aGlzLmJ1aWxkZXIgPSBEZXNjcmlwdG9yUHJvdG9zLkVudW1EZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBFbnVtRGVzY3JpcHRvci5uYW1lID0+IG5hbWUKLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBlbnVtIHR5cGUuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAibmFtZSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGdldE5hbWUoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRW51bURlc2NyaXB0b3IubmFtZSA9IG5hbWUKLSAgICAgKgotICAgICAqIFNldHMgdGhlIG5hbWUgb2YgdGhpcyBlbnVtIHR5cGUuIENhbm5vdCBiZSBjYWxsZWQgaWYgdGhlIGVudW0gdHlwZSBoYXMKLSAgICAgKiBhbHJlYWR5IGJlZW4gYWRkZWQgdG8gYSBwb29sLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIm5hbWU9IikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3Qgc2V0TmFtZShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IG5hbWUpIHsKLSAgICAgICAgdGhpcy5uYW1lID0gbmFtZTsKLSAgICAgICAgdGhpcy5idWlsZGVyLnNldE5hbWUoVXRpbHMuZXNjYXBlSWRlbnRpZmllcihuYW1lLmFzSmF2YVN0cmluZygpKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRW51bURlc2NyaXB0b3IuYWRkX3ZhbHVlKGtleSwgdmFsdWUpCi0gICAgICoKLSAgICAgKiBBZGRzIGEgbmV3IGtleSA9PiB2YWx1ZSBtYXBwaW5nIHRvIHRoaXMgZW51bSB0eXBlLiBLZXkgbXVzdCBiZSBnaXZlbiBhcyBhCi0gICAgICogUnVieSBzeW1ib2wuIENhbm5vdCBiZSBjYWxsZWQgaWYgdGhlIGVudW0gdHlwZSBoYXMgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIGEKLSAgICAgKiBwb29sLiBXaWxsIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGUga2V5IG9yIHZhbHVlIGlzIGFscmVhZHkgaW4gdXNlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gImFkZF92YWx1ZSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGFkZFZhbHVlKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgbmFtZSwgSVJ1YnlPYmplY3QgbnVtYmVyKSB7Ci0gICAgICAgIERlc2NyaXB0b3JQcm90b3MuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgdmFsdWVCdWlsZGVyID0gRGVzY3JpcHRvclByb3Rvcy5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpOwotICAgICAgICB2YWx1ZUJ1aWxkZXIuc2V0TmFtZShuYW1lLmFzSmF2YVN0cmluZygpKTsKLSAgICAgICAgdmFsdWVCdWlsZGVyLnNldE51bWJlcihSdWJ5TnVtZXJpYy5udW0yaW50KG51bWJlcikpOwotICAgICAgICB0aGlzLmJ1aWxkZXIuYWRkVmFsdWUodmFsdWVCdWlsZGVyKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBFbnVtRGVzY3JpcHRvci5lYWNoKCZibG9jaykKLSAgICAgKgotICAgICAqIEl0ZXJhdGVzIG92ZXIga2V5ID0+IHZhbHVlIG1hcHBpbmdzIGluIHRoaXMgZW51bSdzIGRlZmluaXRpb24sIHlpZWxkaW5nIHRvCi0gICAgICogdGhlIGJsb2NrIHdpdGggKGtleSwgdmFsdWUpIGFyZ3VtZW50cyBmb3IgZWFjaCBvbmUuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGVhY2goVGhyZWFkQ29udGV4dCBjb250ZXh0LCBCbG9jayBibG9jaykgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIGZvciAoRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBlbnVtVmFsdWVEZXNjcmlwdG9yIDogZGVzY3JpcHRvci5nZXRWYWx1ZXMoKSkgewotICAgICAgICAgICAgYmxvY2sueWllbGQoY29udGV4dCwgcnVudGltZS5uZXdBcnJheShydW50aW1lLm5ld1N5bWJvbChlbnVtVmFsdWVEZXNjcmlwdG9yLmdldE5hbWUoKSksCi0gICAgICAgICAgICAgICAgICAgIHJ1bnRpbWUubmV3Rml4bnVtKGVudW1WYWx1ZURlc2NyaXB0b3IuZ2V0TnVtYmVyKCkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRW51bURlc2NyaXB0b3IuZW51bW1vZHVsZSA9PiBtb2R1bGUKLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIFJ1YnkgbW9kdWxlIGNvcnJlc3BvbmRpbmcgdG8gdGhpcyBlbnVtIHR5cGUuIENhbm5vdCBiZSBjYWxsZWQKLSAgICAgKiB1bnRpbCB0aGUgZW51bSBkZXNjcmlwdG9yIGhhcyBiZWVuIGFkZGVkIHRvIGEgcG9vbC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZW51bW1vZHVsZShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaWYgKHRoaXMua2xhenogPT0gbnVsbCkgewotICAgICAgICAgICAgdGhpcy5rbGF6eiA9IGJ1aWxkTW9kdWxlRnJvbURlc2NyaXB0b3IoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMua2xheno7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0RGVzY3JpcHRvcihEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3JQcm90b3MuRW51bURlc2NyaXB0b3JQcm90by5CdWlsZGVyIGdldEJ1aWxkZXIoKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXI7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSdWJ5TW9kdWxlIGJ1aWxkTW9kdWxlRnJvbURlc2NyaXB0b3IoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJ1YnkgcnVudGltZSA9IGNvbnRleHQucnVudGltZTsKLSAgICAgICAgVXRpbHMuY2hlY2tOYW1lQXZhaWxhYmlsaXR5KGNvbnRleHQsIG5hbWUuYXNKYXZhU3RyaW5nKCkpOwotCi0gICAgICAgIFJ1YnlNb2R1bGUgZW51bU1vZHVsZSA9IFJ1YnlNb2R1bGUubmV3TW9kdWxlKHJ1bnRpbWUpOwotICAgICAgICBmb3IgKERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgdmFsdWUgOiBkZXNjcmlwdG9yLmdldFZhbHVlcygpKSB7Ci0gICAgICAgICAgICBlbnVtTW9kdWxlLmRlZmluZUNvbnN0YW50KHZhbHVlLmdldE5hbWUoKSwgcnVudGltZS5uZXdGaXhudW0odmFsdWUuZ2V0TnVtYmVyKCkpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGVudW1Nb2R1bGUuaW5zdGFuY2VfdmFyaWFibGVfc2V0KHJ1bnRpbWUubmV3U3RyaW5nKFV0aWxzLkRFU0NSSVBUT1JfSU5TVEFOQ0VfVkFSKSwgdGhpcyk7Ci0gICAgICAgIGVudW1Nb2R1bGUuZGVmaW5lQW5ub3RhdGVkTWV0aG9kcyhSdWJ5RW51bS5jbGFzcyk7Ci0gICAgICAgIHJldHVybiBlbnVtTW9kdWxlOwotICAgIH0KLQotICAgIHByaXZhdGUgSVJ1YnlPYmplY3QgbmFtZTsKLSAgICBwcml2YXRlIFJ1YnlNb2R1bGUga2xheno7Ci0gICAgcHJpdmF0ZSBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgIHByaXZhdGUgRGVzY3JpcHRvclByb3Rvcy5FbnVtRGVzY3JpcHRvclByb3RvLkJ1aWxkZXIgYnVpbGRlcjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlGaWVsZERlc2NyaXB0b3IuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlGaWVsZERlc2NyaXB0b3IuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjNjNDg4Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5RmllbGREZXNjcmlwdG9yLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNzcgKzAsMCBAQAotLyoKLSAqIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieTsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvczsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzOwotaW1wb3J0IG9yZy5qcnVieS4qOwotaW1wb3J0IG9yZy5qcnVieS5hbm5vLkpSdWJ5Q2xhc3M7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuT2JqZWN0QWxsb2NhdG9yOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLlRocmVhZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuYnVpbHRpbi5JUnVieU9iamVjdDsKLQotQEpSdWJ5Q2xhc3MobmFtZSA9ICJGaWVsZERlc2NyaXB0b3IiKQotcHVibGljIGNsYXNzIFJ1YnlGaWVsZERlc2NyaXB0b3IgZXh0ZW5kcyBSdWJ5T2JqZWN0IHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUnVieUZpbGVEZXNjcmlwdG9yKFJ1YnkgcnVudGltZSkgewotICAgICAgICBSdWJ5TW9kdWxlIG1Qcm90b2J1ZiA9IHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1ZiIpOwotICAgICAgICBSdWJ5Q2xhc3MgY0ZpZWxkRGVzY3JpcHRvciA9IG1Qcm90b2J1Zi5kZWZpbmVDbGFzc1VuZGVyKCJGaWVsZERlc2NyaXB0b3IiLCBydW50aW1lLmdldE9iamVjdCgpLCBuZXcgT2JqZWN0QWxsb2NhdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSVJ1YnlPYmplY3QgYWxsb2NhdGUoUnVieSBydW50aW1lLCBSdWJ5Q2xhc3Mga2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJ1YnlGaWVsZERlc2NyaXB0b3IocnVudGltZSwga2xhenopOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY0ZpZWxkRGVzY3JpcHRvci5kZWZpbmVBbm5vdGF0ZWRNZXRob2RzKFJ1YnlGaWVsZERlc2NyaXB0b3IuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdWJ5RmllbGREZXNjcmlwdG9yKFJ1YnkgcnVudGltZSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgIHN1cGVyKHJ1bnRpbWUsIGtsYXp6KTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBGaWVsZERlc2NyaXB0b3IubmV3ID0+IGZpZWxkCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGEgbmV3IGZpZWxkIGRlc2NyaXB0b3IuIEl0cyBuYW1lLCB0eXBlLCBldGMuIG11c3QgYmUgc2V0IGJlZm9yZSBpdCBpcwotICAgICAqIGFkZGVkIHRvIGEgbWVzc2FnZSB0eXBlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbml0aWFsaXplKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBidWlsZGVyID0gRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5uZXdCdWlsZGVyKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEZpZWxkRGVzY3JpcHRvci5sYWJlbAotICAgICAqCi0gICAgICogUmV0dXJuIHRoZSBsYWJlbCBvZiB0aGlzIGZpZWxkLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gImxhYmVsIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZ2V0TGFiZWwoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLmxhYmVsOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEZpZWxkRGVzY3JpcHRvci5sYWJlbCA9IGxhYmVsCi0gICAgICoKLSAgICAgKiBTZXRzIHRoZSBsYWJlbCBvbiB0aGlzIGZpZWxkLiBDYW5ub3QgYmUgY2FsbGVkIGlmIGZpZWxkIGlzIHBhcnQgb2YgYSBtZXNzYWdlCi0gICAgICogdHlwZSBhbHJlYWR5IGluIGEgcG9vbC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJsYWJlbD0iKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBzZXRMYWJlbChUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFN0cmluZyBsYWJlbE5hbWUgPSB2YWx1ZS5hc0phdmFTdHJpbmcoKTsKLSAgICAgICAgdGhpcy5sYWJlbCA9IGNvbnRleHQucnVudGltZS5uZXdTeW1ib2wobGFiZWxOYW1lLnRvTG93ZXJDYXNlKCkpOwotICAgICAgICB0aGlzLmJ1aWxkZXIuc2V0TGFiZWwoCi0gICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC52YWx1ZU9mKCJMQUJFTF8iICsgbGFiZWxOYW1lLnRvVXBwZXJDYXNlKCkpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBGaWVsZERlc2NyaXB0b3IubmFtZSA9PiBuYW1lCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQgYXMgYSBSdWJ5IFN0cmluZywgb3IgbmlsIGlmIGl0IGlzIG5vdCBzZXQuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAibmFtZSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGdldE5hbWUoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLm5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRmllbGREZXNjcmlwdG9yLm5hbWUgPSBuYW1lCi0gICAgICoKLSAgICAgKiBTZXRzIHRoZSBuYW1lIG9mIHRoaXMgZmllbGQuIENhbm5vdCBiZSBjYWxsZWQgb25jZSB0aGUgY29udGFpbmluZyBtZXNzYWdlCi0gICAgICogdHlwZSwgaWYgYW55LCBpcyBhZGRlZCB0byBhIHBvb2wuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAibmFtZT0iKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBzZXROYW1lKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgU3RyaW5nIG5hbWVTdHIgPSB2YWx1ZS5hc0phdmFTdHJpbmcoKTsKLSAgICAgICAgdGhpcy5uYW1lID0gY29udGV4dC5ydW50aW1lLm5ld1N0cmluZyhuYW1lU3RyKTsKLSAgICAgICAgdGhpcy5idWlsZGVyLnNldE5hbWUoVXRpbHMuZXNjYXBlSWRlbnRpZmllcihuYW1lU3RyKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJzdWJ0eXBlIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZ2V0U3ViVHlwZShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHN1YlR5cGU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRmllbGREZXNjcmlwdG9yLnR5cGUgPT4gdHlwZQotICAgICAqCi0gICAgICogUmV0dXJucyB0aGlzIGZpZWxkJ3MgdHlwZSwgYXMgYSBSdWJ5IHN5bWJvbCwgb3IgbmlsIGlmIG5vdCB5ZXQgc2V0LgotICAgICAqCi0gICAgICogVmFsaWQgZmllbGQgdHlwZXMgYXJlOgotICAgICAqICAgICA6aW50MzIsIDppbnQ2NCwgOnVpbnQzMiwgOnVpbnQ2NCwgOmZsb2F0LCA6ZG91YmxlLCA6Ym9vbCwgOnN0cmluZywKLSAgICAgKiAgICAgOmJ5dGVzLCA6bWVzc2FnZS4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJ0eXBlIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZ2V0VHlwZShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIFV0aWxzLmZpZWxkVHlwZVRvUnVieShjb250ZXh0LCB0aGlzLmJ1aWxkZXIuZ2V0VHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBGaWVsZERlc2NyaXB0b3IudHlwZSA9IHR5cGUKLSAgICAgKgotICAgICAqIFNldHMgdGhpcyBmaWVsZCdzIHR5cGUuIENhbm5vdCBiZSBjYWxsZWQgaWYgZmllbGQgaXMgcGFydCBvZiBhIG1lc3NhZ2UgdHlwZQotICAgICAqIGFscmVhZHkgaW4gYSBwb29sLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gInR5cGU9IikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3Qgc2V0VHlwZShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHRoaXMuYnVpbGRlci5zZXRUeXBlKERlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZS52YWx1ZU9mKCJUWVBFXyIgKyB2YWx1ZS5hc0phdmFTdHJpbmcoKS50b1VwcGVyQ2FzZSgpKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRmllbGREZXNjcmlwdG9yLm51bWJlciA9PiBudW1iZXIKLSAgICAgKgotICAgICAqIFJldHVybnMgdGhpcyBmaWVsZCdzIG51bWJlciwgYXMgYSBSdWJ5IEludGVnZXIsIG9yIG5pbCBpZiBub3QgeWV0IHNldC4KLSAgICAgKgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIm51bWJlciIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGdldG51bWJlcihUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMubnVtYmVyOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEZpZWxkRGVzY3JpcHRvci5udW1iZXIgPSBudW1iZXIKLSAgICAgKgotICAgICAqIFNldHMgdGhlIHRhZyBudW1iZXIgZm9yIHRoaXMgZmllbGQuIENhbm5vdCBiZSBjYWxsZWQgaWYgZmllbGQgaXMgcGFydCBvZiBhCi0gICAgICogbWVzc2FnZSB0eXBlIGFscmVhZHkgaW4gYSBwb29sLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIm51bWJlcj0iKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBzZXROdW1iZXIoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aGlzLm51bWJlciA9IHZhbHVlOwotICAgICAgICB0aGlzLmJ1aWxkZXIuc2V0TnVtYmVyKFJ1YnlOdW1lcmljLm51bTJpbnQodmFsdWUpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBGaWVsZERlc2NyaXB0b3Iuc3VibXNnX25hbWUgPSBzdWJtc2dfbmFtZQotICAgICAqCi0gICAgICogU2V0cyB0aGUgbmFtZSBvZiB0aGUgbWVzc2FnZSBvciBlbnVtIHR5cGUgY29ycmVzcG9uZGluZyB0byB0aGlzIGZpZWxkLCBpZiBpdAotICAgICAqIGlzIGEgbWVzc2FnZSBvciBlbnVtIGZpZWxkIChyZXNwZWN0aXZlbHkpLiBUaGlzIHR5cGUgbmFtZSB3aWxsIGJlIHJlc29sdmVkCi0gICAgICogd2l0aGluIHRoZSBjb250ZXh0IG9mIHRoZSBwb29sIHRvIHdoaWNoIHRoZSBjb250YWluaW5nIG1lc3NhZ2UgdHlwZSBpcyBhZGRlZC4KLSAgICAgKiBDYW5ub3QgYmUgY2FsbGVkIG9uIGZpZWxkIHRoYXQgYXJlIG5vdCBvZiBtZXNzYWdlIG9yIGVudW0gdHlwZSwgb3Igb24gZmllbGRzCi0gICAgICogdGhhdCBhcmUgcGFydCBvZiBhIG1lc3NhZ2UgdHlwZSBhbHJlYWR5IGFkZGVkIHRvIGEgcG9vbC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJzdWJtc2dfbmFtZT0iKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBzZXRTdWJtc2dOYW1lKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgbmFtZSkgewotICAgICAgICB0aGlzLmJ1aWxkZXIuc2V0VHlwZU5hbWUoIi4iICsgVXRpbHMuZXNjYXBlSWRlbnRpZmllcihuYW1lLmFzSmF2YVN0cmluZygpKSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgRmllbGREZXNjcmlwdG9yLmdldChtZXNzYWdlKSA9PiB2YWx1ZQotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgdmFsdWUgc2V0IGZvciB0aGlzIGZpZWxkIG9uIHRoZSBnaXZlbiBtZXNzYWdlLiBSYWlzZXMgYW4KLSAgICAgKiBleGNlcHRpb24gaWYgbWVzc2FnZSBpcyBvZiB0aGUgd3JvbmcgdHlwZS4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJnZXQiKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBnZXRWYWx1ZShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IG1zZ1JiKSB7Ci0gICAgICAgIFJ1YnlNZXNzYWdlIG1lc3NhZ2UgPSAoUnVieU1lc3NhZ2UpIG1zZ1JiOwotICAgICAgICBpZiAobWVzc2FnZS5nZXREZXNjcmlwdG9yKCkgIT0gZmllbGREZWYuZ2V0Q29udGFpbmluZ1R5cGUoKSkgewotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5ydW50aW1lLm5ld1R5cGVFcnJvcigic2V0IG1ldGhvZCBjYWxsZWQgb24gd3JvbmcgbWVzc2FnZSB0eXBlIik7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIG1lc3NhZ2UuZ2V0RmllbGQoY29udGV4dCwgZmllbGREZWYpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIEZpZWxkRGVzY3JpcHRvci5zZXQobWVzc2FnZSwgdmFsdWUpCi0gICAgICoKLSAgICAgKiBTZXRzIHRoZSB2YWx1ZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMgZmllbGQgdG8gdGhlIGdpdmVuIHZhbHVlIG9uIHRoZSBnaXZlbgotICAgICAqIG1lc3NhZ2UuIFJhaXNlcyBhbiBleGNlcHRpb24gaWYgbWVzc2FnZSBpcyBvZiB0aGUgd3JvbmcgdHlwZS4gUGVyZm9ybXMgdGhlCi0gICAgICogb3JkaW5hcnkgdHlwZS1jaGVja3MgZm9yIGZpZWxkIHNldHRpbmcuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAic2V0IikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3Qgc2V0VmFsdWUoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBtc2dSYiwgSVJ1YnlPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgUnVieU1lc3NhZ2UgbWVzc2FnZSA9IChSdWJ5TWVzc2FnZSkgbXNnUmI7Ci0gICAgICAgIGlmIChtZXNzYWdlLmdldERlc2NyaXB0b3IoKSAhPSBmaWVsZERlZi5nZXRDb250YWluaW5nVHlwZSgpKSB7Ci0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LnJ1bnRpbWUubmV3VHlwZUVycm9yKCJzZXQgbWV0aG9kIGNhbGxlZCBvbiB3cm9uZyBtZXNzYWdlIHR5cGUiKTsKLSAgICAgICAgfQotICAgICAgICBtZXNzYWdlLnNldEZpZWxkKGNvbnRleHQsIGZpZWxkRGVmLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0U3ViVHlwZShJUnVieU9iamVjdCBydWJ5RGVzY3JpcHRvcikgewotICAgICAgICB0aGlzLnN1YlR5cGUgPSBydWJ5RGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRGaWVsZERlZihEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRoaXMuZmllbGREZWYgPSBmaWVsZERlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIHZvaWQgc2V0T25lb2ZOYW1lKElSdWJ5T2JqZWN0IG5hbWUpIHsKLSAgICAgICAgb25lb2ZOYW1lID0gbmFtZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgdm9pZCBzZXRPbmVvZkluZGV4KGludCBpbmRleCkgewotICAgICAgICBoYXNPbmVvZkluZGV4ID0gdHJ1ZTsKLSAgICAgICAgb25lb2ZJbmRleCA9IGluZGV4OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJUnVieU9iamVjdCBnZXRPbmVvZk5hbWUoKSB7Ci0gICAgICAgIHJldHVybiBvbmVvZk5hbWU7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBnZXRGaWVsZERlZigpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkRGVmOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvIGJ1aWxkKCkgewotICAgICAgICBpZiAoaGFzT25lb2ZJbmRleCkKLSAgICAgICAgICAgIGJ1aWxkZXIuc2V0T25lb2ZJbmRleChvbmVvZkluZGV4KTsKLSAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgRGVzY3JpcHRvclByb3Rvcy5GaWVsZERlc2NyaXB0b3JQcm90by5CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBJUnVieU9iamVjdCBuYW1lOwotICAgIHByaXZhdGUgSVJ1YnlPYmplY3QgbGFiZWw7Ci0gICAgcHJpdmF0ZSBJUnVieU9iamVjdCBudW1iZXI7Ci0gICAgcHJpdmF0ZSBJUnVieU9iamVjdCBzdWJUeXBlOwotICAgIHByaXZhdGUgSVJ1YnlPYmplY3Qgb25lb2ZOYW1lOwotICAgIHByaXZhdGUgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVmOwotICAgIHByaXZhdGUgaW50IG9uZW9mSW5kZXg7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGhhc09uZW9mSW5kZXggPSBmYWxzZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlNYXAuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlNYXAuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmQ0YzAzYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5TWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzQgKzAsMCBAQAotLyoKLSAqIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieTsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnM7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EeW5hbWljTWVzc2FnZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEVudHJ5OwotaW1wb3J0IG9yZy5qcnVieS4qOwotaW1wb3J0IG9yZy5qcnVieS5hbm5vLkpSdWJ5Q2xhc3M7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmpydWJ5LmludGVybmFsLnJ1bnRpbWUubWV0aG9kcy5EeW5hbWljTWV0aG9kOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLkJsb2NrOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLk9iamVjdEFsbG9jYXRvcjsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5UaHJlYWRDb250ZXh0OwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLmJ1aWx0aW4uSVJ1YnlPYmplY3Q7Ci1pbXBvcnQgb3JnLmpydWJ5LnV0aWwuQnl0ZUxpc3Q7Ci0KLWltcG9ydCBqYXZhLnNlY3VyaXR5Lk1lc3NhZ2VEaWdlc3Q7Ci1pbXBvcnQgamF2YS5zZWN1cml0eS5Ob1N1Y2hBbGdvcml0aG1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi1ASlJ1YnlDbGFzcyhuYW1lID0gIk1hcCIsIGluY2x1ZGUgPSAiRW51bWVyYWJsZSIpCi1wdWJsaWMgY2xhc3MgUnVieU1hcCBleHRlbmRzIFJ1YnlPYmplY3QgewotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVSdWJ5TWFwKFJ1YnkgcnVudGltZSkgewotICAgICAgICBSdWJ5TW9kdWxlIHByb3RvYnVmID0gcnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmIik7Ci0gICAgICAgIFJ1YnlDbGFzcyBjTWFwID0gcHJvdG9idWYuZGVmaW5lQ2xhc3NVbmRlcigiTWFwIiwgcnVudGltZS5nZXRPYmplY3QoKSwgbmV3IE9iamVjdEFsbG9jYXRvcigpIHsKLSAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgcHVibGljIElSdWJ5T2JqZWN0IGFsbG9jYXRlKFJ1YnkgcnVieSwgUnVieUNsYXNzIHJ1YnlDbGFzcykgewotICAgICAgICAgICAgICAgIHJldHVybiBuZXcgUnVieU1hcChydWJ5LCBydWJ5Q2xhc3MpOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY01hcC5pbmNsdWRlTW9kdWxlKHJ1bnRpbWUuZ2V0RW51bWVyYWJsZSgpKTsKLSAgICAgICAgY01hcC5kZWZpbmVBbm5vdGF0ZWRNZXRob2RzKFJ1YnlNYXAuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdWJ5TWFwKFJ1YnkgcnVieSwgUnVieUNsYXNzIHJ1YnlDbGFzcykgewotICAgICAgICBzdXBlcihydWJ5LCBydWJ5Q2xhc3MpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1hcC5uZXcoa2V5X3R5cGUsIHZhbHVlX3R5cGUsIHZhbHVlX3R5cGVjbGFzcyA9IG5pbCwgaW5pdF9oYXNobWFwID0ge30pCi0gICAgICogICAgID0+IG5ldyBtYXAKLSAgICAgKgotICAgICAqIEFsbG9jYXRlcyBhIG5ldyBNYXAgY29udGFpbmVyLiBUaGlzIGNvbnN0cnVjdG9yIG1heSBiZSBjYWxsZWQgd2l0aCAyLCAzLCBvciA0Ci0gICAgICogYXJndW1lbnRzLiBUaGUgZmlyc3QgdHdvIGFyZ3VtZW50cyBhcmUgYWx3YXlzIHByZXNlbnQgYW5kIGFyZSBzeW1ib2xzICh0YWtpbmcKLSAgICAgKiBvbiB0aGUgc2FtZSB2YWx1ZXMgYXMgZmllbGQtdHlwZSBzeW1ib2xzIGluIG1lc3NhZ2UgZGVzY3JpcHRvcnMpIHRoYXQKLSAgICAgKiBpbmRpY2F0ZSB0aGUgdHlwZSBvZiB0aGUgbWFwIGtleSBhbmQgdmFsdWUgZmllbGRzLgotICAgICAqCi0gICAgICogVGhlIHN1cHBvcnRlZCBrZXkgdHlwZXMgYXJlOiA6aW50MzIsIDppbnQ2NCwgOnVpbnQzMiwgOnVpbnQ2NCwgOmJvb2wsCi0gICAgICogOnN0cmluZywgOmJ5dGVzLgotICAgICAqCi0gICAgICogVGhlIHN1cHBvcnRlZCB2YWx1ZSB0eXBlcyBhcmU6IDppbnQzMiwgOmludDY0LCA6dWludDMyLCA6dWludDY0LCA6Ym9vbCwKLSAgICAgKiA6c3RyaW5nLCA6Ynl0ZXMsIDplbnVtLCA6bWVzc2FnZS4KLSAgICAgKgotICAgICAqIFRoZSB0aGlyZCBhcmd1bWVudCwgdmFsdWVfdHlwZWNsYXNzLCBtdXN0IGJlIHByZXNlbnQgaWYgdmFsdWVfdHlwZSBpcyA6ZW51bQotICAgICAqIG9yIDptZXNzYWdlLiBBcyBpbiBSZXBlYXRlZEZpZWxkI25ldywgdGhpcyBhcmd1bWVudCBtdXN0IGJlIGEgbWVzc2FnZSBjbGFzcwotICAgICAqIChmb3IgOm1lc3NhZ2UpIG9yIGVudW0gbW9kdWxlIChmb3IgOmVudW0pLgotICAgICAqCi0gICAgICogVGhlIGxhc3QgYXJndW1lbnQsIGlmIHByZXNlbnQsIHByb3ZpZGVzIGluaXRpYWwgY29udGVudCBmb3IgbWFwLiBOb3RlIHRoYXQKLSAgICAgKiB0aGlzIG1heSBiZSBhbiBvcmRpbmFyeSBSdWJ5IGhhc2htYXAgb3IgYW5vdGhlciBNYXAgaW5zdGFuY2Ugd2l0aCBpZGVudGljYWwKLSAgICAgKiBrZXkgYW5kIHZhbHVlIHR5cGVzLiBBbHNvIG5vdGUgdGhhdCB0aGlzIGFyZ3VtZW50IG1heSBiZSBwcmVzZW50IHdoZXRoZXIgb3IKLSAgICAgKiBub3QgdmFsdWVfdHlwZWNsYXNzIGlzIHByZXNlbnQgKGFuZCBpdCBpcyB1bmFtYmlndW91c2x5IHNlcGFyYXRlIGZyb20KLSAgICAgKiB2YWx1ZV90eXBlY2xhc3MgYmVjYXVzZSB2YWx1ZV90eXBlY2xhc3MncyBwcmVzZW5jZSBpcyBzdHJpY3RseSBkZXRlcm1pbmVkIGJ5Ci0gICAgICogdmFsdWVfdHlwZSkuIFRoZSBjb250ZW50cyBvZiB0aGlzIGluaXRpYWwgaGFzaG1hcCBvciBNYXAgaW5zdGFuY2UgYXJlCi0gICAgICogc2hhbGxvdy1jb3BpZWQgaW50byB0aGUgbmV3IE1hcDogdGhlIG9yaWdpbmFsIG1hcCBpcyB1bm1vZGlmaWVkLCBidXQKLSAgICAgKiByZWZlcmVuY2VzIHRvIHVuZGVybHlpbmcgb2JqZWN0cyB3aWxsIGJlIHNoYXJlZCBpZiB0aGUgdmFsdWUgdHlwZSBpcyBhCi0gICAgICogbWVzc2FnZSB0eXBlLgotICAgICAqLwotCi0gICAgQEpSdWJ5TWV0aG9kKHJlcXVpcmVkID0gMiwgb3B0aW9uYWwgPSAyKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbml0aWFsaXplKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIHRoaXMudGFibGUgPSBuZXcgSGFzaE1hcDxJUnVieU9iamVjdCwgSVJ1YnlPYmplY3Q+KCk7Ci0gICAgICAgIHRoaXMua2V5VHlwZSA9IFV0aWxzLnJ1YnlUb0ZpZWxkVHlwZShhcmdzWzBdKTsKLSAgICAgICAgdGhpcy52YWx1ZVR5cGUgPSBVdGlscy5ydWJ5VG9GaWVsZFR5cGUoYXJnc1sxXSk7Ci0KLSAgICAgICAgc3dpdGNoKGtleVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIElOVDY0OgotICAgICAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgICAgIGNhc2UgQk9PTDoKLSAgICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgY2FzZSBCWVRFUzoKLSAgICAgICAgICAgICAgICAvLyBUaGVzZSBhcmUgT0suCi0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHRocm93IGNvbnRleHQucnVudGltZS5uZXdBcmd1bWVudEVycm9yKCJJbnZhbGlkIGtleSB0eXBlIGZvciBtYXAuIik7Ci0gICAgICAgIH0KLQotICAgICAgICBpbnQgaW5pdFZhbHVlQXJnID0gMjsKLSAgICAgICAgaWYgKG5lZWRUeXBlY2xhc3ModGhpcy52YWx1ZVR5cGUpICYmIGFyZ3MubGVuZ3RoID4gMikgewotICAgICAgICAgICAgdGhpcy52YWx1ZVR5cGVDbGFzcyA9IGFyZ3NbMl07Ci0gICAgICAgICAgICBVdGlscy52YWxpZGF0ZVR5cGVDbGFzcyhjb250ZXh0LCB0aGlzLnZhbHVlVHlwZSwgdGhpcy52YWx1ZVR5cGVDbGFzcyk7Ci0gICAgICAgICAgICBpbml0VmFsdWVBcmcgPSAzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhpcy52YWx1ZVR5cGVDbGFzcyA9IGNvbnRleHQucnVudGltZS5nZXROaWxDbGFzcygpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVGFibGUgdmFsdWUgdHlwZSBpcyBhbHdheXMgVUlOVDY0OiB0aGlzIGVuc3VyZXMgZW5vdWdoIHNwYWNlIHRvIHN0b3JlIHRoZQotICAgICAgICAvLyBuYXRpdmVfc2xvdCB2YWx1ZS4KLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gaW5pdFZhbHVlQXJnKSB7Ci0gICAgICAgICAgICBtZXJnZUludG9TZWxmKGNvbnRleHQsIGFyZ3NbaW5pdFZhbHVlQXJnXSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWFwLltdPShrZXksIHZhbHVlKSA9PiB2YWx1ZQotICAgICAqCi0gICAgICogSW5zZXJ0cyBvciBvdmVyd3JpdGVzIHRoZSB2YWx1ZSBhdCB0aGUgZ2l2ZW4ga2V5IHdpdGggdGhlIGdpdmVuIG5ldyB2YWx1ZS4KLSAgICAgKiBUaHJvd3MgYW4gZXhjZXB0aW9uIGlmIHRoZSBrZXkgdHlwZSBpcyBpbmNvcnJlY3QuIFJldHVybnMgdGhlIG5ldyB2YWx1ZSB0aGF0Ci0gICAgICogd2FzIGp1c3QgaW5zZXJ0ZWQuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAiW109IikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5kZXhTZXQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBrZXksIElSdWJ5T2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFV0aWxzLmNoZWNrVHlwZShjb250ZXh0LCBrZXlUeXBlLCBrZXksIChSdWJ5TW9kdWxlKSB2YWx1ZVR5cGVDbGFzcyk7Ci0gICAgICAgIFV0aWxzLmNoZWNrVHlwZShjb250ZXh0LCB2YWx1ZVR5cGUsIHZhbHVlLCAoUnVieU1vZHVsZSkgdmFsdWVUeXBlQ2xhc3MpOwotICAgICAgICBJUnVieU9iamVjdCBzeW1ib2w7Ci0gICAgICAgIGlmICh2YWx1ZVR5cGUgPT0gRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUuRU5VTSAmJgotICAgICAgICAgICAgICAgIFV0aWxzLmlzUnVieU51bSh2YWx1ZSkgJiYKLSAgICAgICAgICAgICAgICAhIChzeW1ib2wgPSBSdWJ5RW51bS5sb29rdXAoY29udGV4dCwgdmFsdWVUeXBlQ2xhc3MsIHZhbHVlKSkuaXNOaWwoKSkgewotICAgICAgICAgICAgdmFsdWUgPSBzeW1ib2w7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy50YWJsZS5wdXQoa2V5LCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNYXAuW10oa2V5KSA9PiB2YWx1ZQotICAgICAqCi0gICAgICogQWNjZXNzZXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGtleS4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUga2V5IHR5cGUgaXMKLSAgICAgKiBpbmNvcnJlY3QuIFJldHVybnMgbmlsIHdoZW4gdGhlIGtleSBpcyBub3QgcHJlc2VudCBpbiB0aGUgbWFwLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIltdIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5kZXgoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBrZXkpIHsKLSAgICAgICAgaWYgKHRhYmxlLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgICAgICByZXR1cm4gdGhpcy50YWJsZS5nZXQoa2V5KTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNYXAuPT0ob3RoZXIpID0+IGJvb2xlYW4KLSAgICAgKgotICAgICAqIENvbXBhcmVzIHRoaXMgbWFwIHRvIGFub3RoZXIuIE1hcHMgYXJlIGVxdWFsIGlmIHRoZXkgaGF2ZSBpZGVudGljYWwga2V5IHNldHMsCi0gICAgICogYW5kIGZvciBlYWNoIGtleSwgdGhlIHZhbHVlcyBpbiBib3RoIG1hcHMgY29tcGFyZSBlcXVhbC4gRWxlbWVudHMgYXJlCi0gICAgICogY29tcGFyZWQgYXMgcGVyIG5vcm1hbCBSdWJ5IHNlbWFudGljcywgYnkgY2FsbGluZyB0aGVpciA6PT0gbWV0aG9kcyAob3IKLSAgICAgKiBwZXJmb3JtaW5nIGEgbW9yZSBlZmZpY2llbnQgY29tcGFyaXNvbiBmb3IgcHJpbWl0aXZlIHR5cGVzKS4KLSAgICAgKgotICAgICAqIE1hcHMgd2l0aCBkaXNzaW1pbGFyIGtleSB0eXBlcyBvciB2YWx1ZSB0eXBlcy90eXBlY2xhc3NlcyBhcmUgbmV2ZXIgZXF1YWwsCi0gICAgICogZXZlbiBpZiB2YWx1ZSBjb21wYXJpc29uIChmb3IgZXhhbXBsZSwgYmV0d2VlbiBpbnRlZ2VycyBhbmQgZmxvYXRzKSB3b3VsZAotICAgICAqIGhhdmUgb3RoZXJ3aXNlIGluZGljYXRlZCB0aGF0IGV2ZXJ5IGVsZW1lbnQgaGFzIGVxdWFsIHZhbHVlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIj09IikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZXEoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBfb3RoZXIpIHsKLSAgICAgICAgaWYgKF9vdGhlciBpbnN0YW5jZW9mIFJ1YnlIYXNoKQotICAgICAgICAgICAgcmV0dXJuIHRvSGFzaChjb250ZXh0KS5vcF9lcXVhbChjb250ZXh0LCBfb3RoZXIpOwotICAgICAgICBSdWJ5TWFwIG90aGVyID0gKFJ1YnlNYXApIF9vdGhlcjsKLSAgICAgICAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0VHJ1ZSgpOwotICAgICAgICBpZiAoIXR5cGVDb21wYXRpYmxlKG90aGVyKSB8fCB0aGlzLnRhYmxlLnNpemUoKSAhPSBvdGhlci50YWJsZS5zaXplKCkpCi0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldEZhbHNlKCk7Ci0gICAgICAgIGZvciAoSVJ1YnlPYmplY3Qga2V5IDogdGFibGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIGlmICghIG90aGVyLnRhYmxlLmNvbnRhaW5zS2V5KGtleSkpCi0gICAgICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXRGYWxzZSgpOwotICAgICAgICAgICAgaWYgKCEgb3RoZXIudGFibGUuZ2V0KGtleSkuZXF1YWxzKHRhYmxlLmdldChrZXkpKSkKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldEZhbHNlKCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXRUcnVlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWFwLmluc3BlY3QgPT4gc3RyaW5nCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGEgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIG1hcCdzIGVsZW1lbnRzLiBJdCB3aWxsIGJlIGZvcm1hdHRlZCBhcwotICAgICAqICJ7a2V5ID0+IHZhbHVlLCBrZXkgPT4gdmFsdWUsIC4uLn0iLCB3aXRoIGVhY2gga2V5IGFuZCB2YWx1ZSBzdHJpbmcKLSAgICAgKiByZXByZXNlbnRhdGlvbiBjb21wdXRlZCBieSBpdHMgb3duICNpbnNwZWN0IG1ldGhvZC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5zcGVjdCgpIHsKLSAgICAgICAgcmV0dXJuIHRvSGFzaChnZXRSdW50aW1lKCkuZ2V0Q3VycmVudENvbnRleHQoKSkuaW5zcGVjdCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1hcC5oYXNoID0+IGhhc2hfdmFsdWUKLSAgICAgKgotICAgICAqIFJldHVybnMgYSBoYXNoIHZhbHVlIGJhc2VkIG9uIHRoaXMgbWFwJ3MgY29udGVudHMuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGhhc2goVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICBNZXNzYWdlRGlnZXN0IGRpZ2VzdCA9IE1lc3NhZ2VEaWdlc3QuZ2V0SW5zdGFuY2UoIlNIQS0yNTYiKTsKLSAgICAgICAgICAgIGZvciAoSVJ1YnlPYmplY3Qga2V5IDogdGFibGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgICAgICBkaWdlc3QudXBkYXRlKChieXRlKSBrZXkuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICAgICAgZGlnZXN0LnVwZGF0ZSgoYnl0ZSkgdGFibGUuZ2V0KGtleSkuaGFzaENvZGUoKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLm5ld1N0cmluZyhuZXcgQnl0ZUxpc3QoZGlnZXN0LmRpZ2VzdCgpKSk7Ci0gICAgICAgIH0gY2F0Y2ggKE5vU3VjaEFsZ29yaXRobUV4Y2VwdGlvbiBpZ25vcmUpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUubmV3Rml4bnVtKFN5c3RlbS5pZGVudGl0eUhhc2hDb2RlKHRhYmxlKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNYXAua2V5cyA9PiBbbGlzdF9vZl9rZXlzXQotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgbGlzdCBvZiBrZXlzIGNvbnRhaW5lZCBpbiB0aGUgbWFwLCBpbiB1bnNwZWNpZmllZCBvcmRlci4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3Qga2V5cyhUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIFJ1YnlBcnJheS5uZXdBcnJheShjb250ZXh0LnJ1bnRpbWUsIHRhYmxlLmtleVNldCgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNYXAudmFsdWVzID0+IFtsaXN0X29mX3ZhbHVlc10KLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIGxpc3Qgb2YgdmFsdWVzIGNvbnRhaW5lZCBpbiB0aGUgbWFwLCBpbiB1bnNwZWNpZmllZCBvcmRlci4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgdmFsdWVzKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gUnVieUFycmF5Lm5ld0FycmF5KGNvbnRleHQucnVudGltZSwgdGFibGUudmFsdWVzKCkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1hcC5jbGVhcgotICAgICAqCi0gICAgICogUmVtb3ZlcyBhbGwgZW50cmllcyBmcm9tIHRoZSBtYXAuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGNsZWFyKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICB0YWJsZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1hcC5lYWNoKCZibG9jaykKLSAgICAgKgotICAgICAqIEludm9rZXMgJmJsb2NrIG9uIGVhY2ggfGtleSwgdmFsdWV8IHBhaXIgaW4gdGhlIG1hcCwgaW4gdW5zcGVjaWZpZWQgb3JkZXIuCi0gICAgICogTm90ZSB0aGF0IE1hcCBhbHNvIGluY2x1ZGVzIEVudW1lcmFibGU7IG1hcCB0aHVzIGFjdHMgbGlrZSBhIG5vcm1hbCBSdWJ5Ci0gICAgICogc2VxdWVuY2UuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGVhY2goVGhyZWFkQ29udGV4dCBjb250ZXh0LCBCbG9jayBibG9jaykgewotICAgICAgICBmb3IgKElSdWJ5T2JqZWN0IGtleSA6IHRhYmxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBibG9jay55aWVsZFNwZWNpZmljKGNvbnRleHQsIGtleSwgdGFibGUuZ2V0KGtleSkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWFwLmRlbGV0ZShrZXkpID0+IG9sZF92YWx1ZQotICAgICAqCi0gICAgICogRGVsZXRlcyB0aGUgdmFsdWUgYXQgdGhlIGdpdmVuIGtleSwgaWYgYW55LCByZXR1cm5pbmcgZWl0aGVyIHRoZSBvbGQgdmFsdWUgb3IKLSAgICAgKiBuaWwgaWYgbm9uZSB3YXMgcHJlc2VudC4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZiB0aGUga2V5IGlzIG9mIHRoZSB3cm9uZyB0eXBlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBkZWxldGUoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBrZXkpIHsKLSAgICAgICAgcmV0dXJuIHRhYmxlLnJlbW92ZShrZXkpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1hcC5oYXNfa2V5PyhrZXkpID0+IGJvb2wKLSAgICAgKgotICAgICAqIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4ga2V5IGlzIHByZXNlbnQgaW4gdGhlIG1hcC4gVGhyb3dzIGFuIGV4Y2VwdGlvbiBpZgotICAgICAqIHRoZSBrZXkgaGFzIHRoZSB3cm9uZyB0eXBlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gImhhc19rZXk/IikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaGFzS2V5KFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3Qga2V5KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRhYmxlLmNvbnRhaW5zS2V5KGtleSkgPyBjb250ZXh0LnJ1bnRpbWUuZ2V0VHJ1ZSgpIDogY29udGV4dC5ydW50aW1lLmdldEZhbHNlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWFwLmxlbmd0aAotICAgICAqCi0gICAgICogUmV0dXJucyB0aGUgbnVtYmVyIG9mIGVudHJpZXMgKGtleS12YWx1ZSBwYWlycykgaW4gdGhlIG1hcC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgbGVuZ3RoKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLm5ld0ZpeG51bSh0aGlzLnRhYmxlLnNpemUoKSk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWFwLmR1cCA9PiBuZXdfbWFwCi0gICAgICoKLSAgICAgKiBEdXBsaWNhdGVzIHRoaXMgbWFwIHdpdGggYSBzaGFsbG93IGNvcHkuIFJlZmVyZW5jZXMgdG8gYWxsIG5vbi1wcmltaXRpdmUKLSAgICAgKiBlbGVtZW50IG9iamVjdHMgKGUuZy4sIHN1Ym1lc3NhZ2VzKSBhcmUgc2hhcmVkLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBkdXAoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJ1YnlNYXAgbmV3TWFwID0gbmV3VGhpc1R5cGUoY29udGV4dCk7Ci0gICAgICAgIGZvciAoTWFwLkVudHJ5PElSdWJ5T2JqZWN0LCBJUnVieU9iamVjdD4gZW50cnkgOiB0YWJsZS5lbnRyeVNldCgpKSB7Ci0gICAgICAgICAgICBuZXdNYXAudGFibGUucHV0KGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3TWFwOwotICAgIH0KLQotICAgIEBKUnVieU1ldGhvZChuYW1lID0geyJ0b19oIiwgInRvX2hhc2gifSkKLSAgICBwdWJsaWMgUnVieUhhc2ggdG9IYXNoKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gUnVieUhhc2gubmV3SGFzaChjb250ZXh0LnJ1bnRpbWUsIHRhYmxlLCBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCkpOwotICAgIH0KLQotICAgIC8vIFVzZWQgYnkgR29vZ2xlOjpQcm90b2J1Zi5kZWVwX2NvcHkgYnV0IG5vdCBleHBvc2VkIGRpcmVjdGx5LgotICAgIHByb3RlY3RlZCBJUnVieU9iamVjdCBkZWVwQ29weShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUnVieU1hcCBuZXdNYXAgPSBuZXdUaGlzVHlwZShjb250ZXh0KTsKLSAgICAgICAgc3dpdGNoICh2YWx1ZVR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgICAgICBmb3IgKElSdWJ5T2JqZWN0IGtleSA6IHRhYmxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIFJ1YnlNZXNzYWdlIG1lc3NhZ2UgPSAoUnVieU1lc3NhZ2UpIHRhYmxlLmdldChrZXkpOwotICAgICAgICAgICAgICAgICAgICBuZXdNYXAudGFibGUucHV0KGtleS5kdXAoKSwgbWVzc2FnZS5kZWVwQ29weShjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBmb3IgKElSdWJ5T2JqZWN0IGtleSA6IHRhYmxlLmtleVNldCgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIG5ld01hcC50YWJsZS5wdXQoa2V5LmR1cCgpLCB0YWJsZS5nZXQoa2V5KS5kdXAoKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBuZXdNYXA7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIExpc3Q8RHluYW1pY01lc3NhZ2U+IGJ1aWxkKFRocmVhZENvbnRleHQgY29udGV4dCwgUnVieURlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgICBMaXN0PER5bmFtaWNNZXNzYWdlPiBsaXN0ID0gbmV3IEFycmF5TGlzdDxEeW5hbWljTWVzc2FnZT4oKTsKLSAgICAgICAgUnVieUNsYXNzIHJ1YnlDbGFzcyA9IChSdWJ5Q2xhc3MpIGRlc2NyaXB0b3IubXNnY2xhc3MoY29udGV4dCk7Ci0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBrZXlGaWVsZCA9IGRlc2NyaXB0b3IubG9va3VwKCJrZXkiKS5nZXRGaWVsZERlZigpOwotICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgdmFsdWVGaWVsZCA9IGRlc2NyaXB0b3IubG9va3VwKCJ2YWx1ZSIpLmdldEZpZWxkRGVmKCk7Ci0gICAgICAgIGZvciAoSVJ1YnlPYmplY3Qga2V5IDogdGFibGUua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIFJ1YnlNZXNzYWdlIG1hcE1lc3NhZ2UgPSAoUnVieU1lc3NhZ2UpIHJ1YnlDbGFzcy5uZXdJbnN0YW5jZShjb250ZXh0LCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgICAgIG1hcE1lc3NhZ2Uuc2V0RmllbGQoY29udGV4dCwga2V5RmllbGQsIGtleSk7Ci0gICAgICAgICAgICBtYXBNZXNzYWdlLnNldEZpZWxkKGNvbnRleHQsIHZhbHVlRmllbGQsIHRhYmxlLmdldChrZXkpKTsKLSAgICAgICAgICAgIGxpc3QuYWRkKG1hcE1lc3NhZ2UuYnVpbGQoY29udGV4dCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsaXN0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSdWJ5TWFwIG1lcmdlSW50b1NlbGYoZmluYWwgVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBoYXNobWFwKSB7Ci0gICAgICAgIGlmIChoYXNobWFwIGluc3RhbmNlb2YgUnVieUhhc2gpIHsKLSAgICAgICAgICAgICgoUnVieUhhc2gpIGhhc2htYXApLnZpc2l0QWxsKG5ldyBSdWJ5SGFzaC5WaXNpdG9yKCkgewotICAgICAgICAgICAgICAgIEBPdmVycmlkZQotICAgICAgICAgICAgICAgIHB1YmxpYyB2b2lkIHZpc2l0KElSdWJ5T2JqZWN0IGtleSwgSVJ1YnlPYmplY3QgdmFsKSB7Ci0gICAgICAgICAgICAgICAgICAgIGluZGV4U2V0KGNvbnRleHQsIGtleSwgdmFsKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9KTsKLSAgICAgICAgfSBlbHNlIGlmIChoYXNobWFwIGluc3RhbmNlb2YgUnVieU1hcCkgewotICAgICAgICAgICAgUnVieU1hcCBvdGhlciA9IChSdWJ5TWFwKSBoYXNobWFwOwotICAgICAgICAgICAgaWYgKCF0eXBlQ29tcGF0aWJsZShvdGhlcikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBjb250ZXh0LnJ1bnRpbWUubmV3VHlwZUVycm9yKCJBdHRlbXB0IHRvIG1lcmdlIE1hcCB3aXRoIG1pc21hdGNoaW5nIHR5cGVzIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBjb250ZXh0LnJ1bnRpbWUubmV3VHlwZUVycm9yKCJVbmtub3duIHR5cGUgbWVyZ2luZyBpbnRvIE1hcCIpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBib29sZWFuIHR5cGVDb21wYXRpYmxlKFJ1YnlNYXAgb3RoZXIpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMua2V5VHlwZSA9PSBvdGhlci5rZXlUeXBlICYmCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZVR5cGUgPT0gb3RoZXIudmFsdWVUeXBlICYmCi0gICAgICAgICAgICAgICAgdGhpcy52YWx1ZVR5cGVDbGFzcyA9PSBvdGhlci52YWx1ZVR5cGVDbGFzczsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJ1YnlNYXAgbmV3VGhpc1R5cGUoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJ1YnlNYXAgbmV3TWFwOwotICAgICAgICBpZiAobmVlZFR5cGVjbGFzcyh2YWx1ZVR5cGUpKSB7Ci0gICAgICAgICAgICBuZXdNYXAgPSAoUnVieU1hcCkgbWV0YUNsYXNzLm5ld0luc3RhbmNlKGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgIFV0aWxzLmZpZWxkVHlwZVRvUnVieShjb250ZXh0LCBrZXlUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMuZmllbGRUeXBlVG9SdWJ5KGNvbnRleHQsIHZhbHVlVHlwZSksCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlVHlwZUNsYXNzLCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ld01hcCA9IChSdWJ5TWFwKSBtZXRhQ2xhc3MubmV3SW5zdGFuY2UoY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgVXRpbHMuZmllbGRUeXBlVG9SdWJ5KGNvbnRleHQsIGtleVR5cGUpLAotICAgICAgICAgICAgICAgICAgICBVdGlscy5maWVsZFR5cGVUb1J1YnkoY29udGV4dCwgdmFsdWVUeXBlKSwKLSAgICAgICAgICAgICAgICAgICAgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgIH0KLSAgICAgICAgbmV3TWFwLnRhYmxlID0gbmV3IEhhc2hNYXA8SVJ1YnlPYmplY3QsIElSdWJ5T2JqZWN0PigpOwotICAgICAgICByZXR1cm4gbmV3TWFwOwotICAgIH0KLQotICAgIHByaXZhdGUgYm9vbGVhbiBuZWVkVHlwZWNsYXNzKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlIHR5cGUpIHsKLSAgICAgICAgc3dpdGNoKHR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZSBrZXlUeXBlOwotICAgIHByaXZhdGUgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUgdmFsdWVUeXBlOwotICAgIHByaXZhdGUgSVJ1YnlPYmplY3QgdmFsdWVUeXBlQ2xhc3M7Ci0gICAgcHJpdmF0ZSBNYXA8SVJ1YnlPYmplY3QsIElSdWJ5T2JqZWN0PiB0YWJsZTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlNZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5TWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOTIxM2M0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NjUgKzAsMCBAQAotLyoKLSAqIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieTsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuKjsKLWltcG9ydCBvcmcuanJ1YnkuKjsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieU1ldGhvZDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5CbG9jazsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5IZWxwZXJzOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLlRocmVhZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuYnVpbHRpbi5JUnVieU9iamVjdDsKLWltcG9ydCBvcmcuanJ1YnkudXRpbC5CeXRlTGlzdDsKLQotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLXB1YmxpYyBjbGFzcyBSdWJ5TWVzc2FnZSBleHRlbmRzIFJ1YnlPYmplY3QgewotICAgIHB1YmxpYyBSdWJ5TWVzc2FnZShSdWJ5IHJ1YnksIFJ1YnlDbGFzcyBrbGF6eiwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIHN1cGVyKHJ1YnksIGtsYXp6KTsKLSAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlLm5ldyhrd2FyZ3MpID0+IG5ld19tZXNzYWdlCi0gICAgICoKLSAgICAgKiBDcmVhdGVzIGEgbmV3IGluc3RhbmNlIG9mIHRoZSBnaXZlbiBtZXNzYWdlIGNsYXNzLiBLZXl3b3JkIGFyZ3VtZW50cyBtYXkgYmUKLSAgICAgKiBwcm92aWRlZCB3aXRoIGtleXdvcmRzIGNvcnJlc3BvbmRpbmcgdG8gZmllbGQgbmFtZXMuCi0gICAgICoKLSAgICAgKiBOb3RlIHRoYXQgbm8gbGl0ZXJhbCBNZXNzYWdlIGNsYXNzIGV4aXN0cy4gT25seSBjb25jcmV0ZSBjbGFzc2VzIHBlciBtZXNzYWdlCi0gICAgICogdHlwZSBleGlzdCwgYXMgcHJvdmlkZWQgYnkgdGhlICNtc2djbGFzcyBtZXRob2Qgb24gRGVzY3JpcHRvcnMgYWZ0ZXIgdGhleQotICAgICAqIGhhdmUgYmVlbiBhZGRlZCB0byBhIHBvb2wuIFRoZSBtZXRob2QgZGVmaW5pdGlvbnMgZGVzY3JpYmVkIGhlcmUgb24gdGhlCi0gICAgICogTWVzc2FnZSBjbGFzcyBhcmUgcHJvdmlkZWQgb24gZWFjaCBjb25jcmV0ZSBtZXNzYWdlIGNsYXNzLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChvcHRpb25hbCA9IDEpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGluaXRpYWxpemUoZmluYWwgVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgZmluYWwgUnVieSBydW50aW1lID0gY29udGV4dC5ydW50aW1lOwotICAgICAgICB0aGlzLmNSZXBlYXRlZEZpZWxkID0gKFJ1YnlDbGFzcykgcnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmOjpSZXBlYXRlZEZpZWxkIik7Ci0gICAgICAgIHRoaXMuY01hcCA9IChSdWJ5Q2xhc3MpIHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1Zjo6TWFwIik7Ci0gICAgICAgIHRoaXMuYnVpbGRlciA9IER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIodGhpcy5kZXNjcmlwdG9yKTsKLSAgICAgICAgdGhpcy5yZXBlYXRlZEZpZWxkcyA9IG5ldyBIYXNoTWFwPERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciwgUnVieVJlcGVhdGVkRmllbGQ+KCk7Ci0gICAgICAgIHRoaXMubWFwcyA9IG5ldyBIYXNoTWFwPERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciwgUnVieU1hcD4oKTsKLSAgICAgICAgdGhpcy5maWVsZHMgPSBuZXcgSGFzaE1hcDxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIElSdWJ5T2JqZWN0PigpOwotICAgICAgICB0aGlzLm9uZW9mQ2FzZXMgPSBuZXcgSGFzaE1hcDxEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3IsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcj4oKTsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID09IDEpIHsKLSAgICAgICAgICAgIGlmICghKGFyZ3NbMF0gaW5zdGFuY2VvZiBSdWJ5SGFzaCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld0FyZ3VtZW50RXJyb3IoImV4cGVjdGVkIEhhc2ggYXJndW1lbnRzLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgUnVieUhhc2ggaGFzaCA9IGFyZ3NbMF0uY29udmVydFRvSGFzaCgpOwotICAgICAgICAgICAgaGFzaC52aXNpdEFsbChuZXcgUnVieUhhc2guVmlzaXRvcigpIHsKLSAgICAgICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgICAgICBwdWJsaWMgdm9pZCB2aXNpdChJUnVieU9iamVjdCBrZXksIElSdWJ5T2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGlmICghKGtleSBpbnN0YW5jZW9mIFJ1YnlTeW1ib2wpKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdUeXBlRXJyb3IoIkV4cGVjdGVkIHN5bWJvbHMgYXMgaGFzaCBrZXlzIGluIGluaXRpYWxpemF0aW9uIG1hcC4iKTsKLSAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA9IGZpbmRGaWVsZChjb250ZXh0LCBrZXkpOwotCi0gICAgICAgICAgICAgICAgICAgIGlmIChVdGlscy5pc01hcEVudHJ5KGZpZWxkRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUnVieUhhc2gpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3QXJndW1lbnRFcnJvcigiRXhwZWN0ZWQgSGFzaCBvYmplY3QgYXMgaW5pdGlhbGl6ZXIgdmFsdWUgZm9yIG1hcCBmaWVsZCAnIiArICBrZXkuYXNKYXZhU3RyaW5nKCkgKyAiJy4iKTsKLQotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgUnVieU1hcCBtYXAgPSBuZXdNYXBGb3JGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwLm1lcmdlSW50b1NlbGYoY29udGV4dCwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgbWFwcy5wdXQoZmllbGREZXNjcmlwdG9yLCBtYXApOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkRGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUnVieUFycmF5KSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld0FyZ3VtZW50RXJyb3IoIkV4cGVjdGVkIGFycmF5IGFzIGluaXRpYWxpemVyIHZhbHVlIGZvciByZXBlYXRlZCBmaWVsZCAnIiArICBrZXkuYXNKYXZhU3RyaW5nKCkgKyAiJy4iKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIFJ1YnlSZXBlYXRlZEZpZWxkIHJlcGVhdGVkRmllbGQgPSBydWJ5VG9SZXBlYXRlZEZpZWxkKGNvbnRleHQsIGZpZWxkRGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYWRkUmVwZWF0ZWRGaWVsZChmaWVsZERlc2NyaXB0b3IsIHJlcGVhdGVkRmllbGQpOwotICAgICAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIG9uZW9mID0gZmllbGREZXNjcmlwdG9yLmdldENvbnRhaW5pbmdPbmVvZigpOwotICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG9uZW9mICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVvZkNhc2VzLnB1dChvbmVvZiwgZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXQoZmllbGREZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0pOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1lc3NhZ2UuW109KGluZGV4LCB2YWx1ZSkKLSAgICAgKgotICAgICAqIFNldHMgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIG5hbWUuIFRoZSBwcm92aWRlZCBmaWVsZCBuYW1lIHNob3VsZCBiZSBhCi0gICAgICogc3RyaW5nLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIltdPSIpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGluZGV4U2V0KFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgZmllbGROYW1lLCBJUnVieU9iamVjdCB2YWx1ZSkgewotICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yID0gZmluZEZpZWxkKGNvbnRleHQsIGZpZWxkTmFtZSk7Ci0gICAgICAgIHJldHVybiBzZXRGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlLltdKGluZGV4KSA9PiB2YWx1ZQotICAgICAqCi0gICAgICogQWNjZXNzZXMgYSBmaWVsZCdzIHZhbHVlIGJ5IGZpZWxkIG5hbWUuIFRoZSBwcm92aWRlZCBmaWVsZCBuYW1lIHNob3VsZCBiZSBhCi0gICAgICogc3RyaW5nLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIltdIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5kZXgoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBmaWVsZE5hbWUpIHsKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA9IGZpbmRGaWVsZChjb250ZXh0LCBmaWVsZE5hbWUpOwotICAgICAgICByZXR1cm4gZ2V0RmllbGQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlLmluc3BlY3QgPT4gc3RyaW5nCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIHJlcHJlc2VudGluZyB0aGlzIG1lc3NhZ2UuIEl0IHdpbGwgYmUKLSAgICAgKiBmb3JtYXR0ZWQgYXMgIjxNZXNzYWdlVHlwZTogZmllbGQxOiB2YWx1ZTEsIGZpZWxkMjogdmFsdWUyLCAuLi4+Ii4gRWFjaAotICAgICAqIGZpZWxkJ3MgdmFsdWUgaXMgcmVwcmVzZW50ZWQgYWNjb3JkaW5nIHRvIGl0cyBvd24gI2luc3BlY3QgbWV0aG9kLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbnNwZWN0KCkgewotICAgICAgICBTdHJpbmcgY25hbWUgPSBtZXRhQ2xhc3MuZ2V0TmFtZSgpOwotICAgICAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoIjwiKTsKLSAgICAgICAgc2IuYXBwZW5kKGNuYW1lKTsKLSAgICAgICAgc2IuYXBwZW5kKCI6ICIpOwotICAgICAgICBzYi5hcHBlbmQodGhpcy5sYXlvdXRJbnNwZWN0KCkpOwotICAgICAgICBzYi5hcHBlbmQoIj4iKTsKLQotICAgICAgICByZXR1cm4gZ2V0UnVudGltZSgpLm5ld1N0cmluZyhzYi50b1N0cmluZygpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlLmhhc2ggPT4gaGFzaF92YWx1ZQotICAgICAqCi0gICAgICogUmV0dXJucyBhIGhhc2ggdmFsdWUgdGhhdCByZXByZXNlbnRzIHRoaXMgbWVzc2FnZSdzIGZpZWxkIHZhbHVlcy4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaGFzaChUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gU3lzdGVtLmlkZW50aXR5SGFzaENvZGUodGhpcyk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUubmV3Rml4bnVtKGhhc2hDb2RlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlLj09KG90aGVyKSA9PiBib29sZWFuCi0gICAgICoKLSAgICAgKiBQZXJmb3JtcyBhIGRlZXAgY29tcGFyaXNvbiBvZiB0aGlzIG1lc3NhZ2Ugd2l0aCBhbm90aGVyLiBNZXNzYWdlcyBhcmUgZXF1YWwKLSAgICAgKiBpZiB0aGV5IGhhdmUgdGhlIHNhbWUgdHlwZSBhbmQgaWYgZWFjaCBmaWVsZCBpcyBlcXVhbCBhY2NvcmRpbmcgdG8gdGhlIDo9PQotICAgICAqIG1ldGhvZCdzIHNlbWFudGljcyAoYSBtb3JlIGVmZmljaWVudCBjb21wYXJpc29uIG1heSBhY3R1YWxseSBiZSBkb25lIGlmIHRoZQotICAgICAqIGZpZWxkIGlzIG9mIGEgcHJpbWl0aXZlIHR5cGUpLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gIj09IikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZXEoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBvdGhlcikgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIGlmICghKG90aGVyIGluc3RhbmNlb2YgUnVieU1lc3NhZ2UpKQotICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUuZ2V0RmFsc2UoKTsKLSAgICAgICAgUnVieU1lc3NhZ2UgbWVzc2FnZSA9IChSdWJ5TWVzc2FnZSkgb3RoZXI7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yICE9IG1lc3NhZ2UuZGVzY3JpcHRvcikgewotICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUuZ2V0RmFsc2UoKTsKLSAgICAgICAgfQotCi0gICAgICAgIGZvciAoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZkZWYgOiBkZXNjcmlwdG9yLmdldEZpZWxkcygpKSB7Ci0gICAgICAgICAgICBJUnVieU9iamVjdCB0aGlzVmFsID0gZ2V0RmllbGQoY29udGV4dCwgZmRlZik7Ci0gICAgICAgICAgICBJUnVieU9iamVjdCB0aGF0VmFsID0gbWVzc2FnZS5nZXRGaWVsZChjb250ZXh0LCBmZGVmKTsKLSAgICAgICAgICAgIElSdWJ5T2JqZWN0IHJldCA9IHRoaXNWYWwuY2FsbE1ldGhvZChjb250ZXh0LCAiPT0iLCB0aGF0VmFsKTsKLSAgICAgICAgICAgIGlmICghcmV0LmlzVHJ1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUuZ2V0RmFsc2UoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcnVudGltZS5nZXRUcnVlKCk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWVzc2FnZS5tZXRob2RfbWlzc2luZygqYXJncykKLSAgICAgKgotICAgICAqIFByb3ZpZGVzIGFjY2Vzc29ycyBhbmQgc2V0dGVycyBmb3IgbWVzc2FnZSBmaWVsZHMgYWNjb3JkaW5nIHRvIHRoZWlyIGZpZWxkCi0gICAgICogbmFtZXMuIEZvciBhbnkgZmllbGQgd2hvc2UgbmFtZSBkb2VzIG5vdCBjb25mbGljdCB3aXRoIGEgYnVpbHQtaW4gbWV0aG9kLCBhbgotICAgICAqIGFjY2Vzc29yIGlzIHByb3ZpZGVkIHdpdGggdGhlIHNhbWUgbmFtZSBhcyB0aGUgZmllbGQsIGFuZCBhIHNldHRlciBpcwotICAgICAqIHByb3ZpZGVkIHdpdGggdGhlIG5hbWUgb2YgdGhlIGZpZWxkIHBsdXMgdGhlICc9JyBzdWZmaXguIFRodXMsIGdpdmVuIGEKLSAgICAgKiBtZXNzYWdlIGluc3RhbmNlICdtc2cnIHdpdGggZmllbGQgJ2ZvbycsIHRoZSBmb2xsb3dpbmcgY29kZSBpcyB2YWxpZDoKLSAgICAgKgotICAgICAqICAgICBtc2cuZm9vID0gNDIKLSAgICAgKiAgICAgcHV0cyBtc2cuZm9vCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAibWV0aG9kX21pc3NpbmciLCByZXN0ID0gdHJ1ZSkKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgbWV0aG9kTWlzc2luZyhUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0W10gYXJncykgewotICAgICAgICBpZiAoYXJncy5sZW5ndGggPT0gMSkgewotICAgICAgICAgICAgUnVieURlc2NyaXB0b3IgcnVieURlc2NyaXB0b3IgPSAoUnVieURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoY29udGV4dCwgbWV0YUNsYXNzKTsKLSAgICAgICAgICAgIElSdWJ5T2JqZWN0IG9uZW9mRGVzY3JpcHRvciA9IHJ1YnlEZXNjcmlwdG9yLmxvb2t1cE9uZW9mKGNvbnRleHQsIGFyZ3NbMF0pOwotICAgICAgICAgICAgaWYgKG9uZW9mRGVzY3JpcHRvci5pc05pbCgpKSB7Ci0gICAgICAgICAgICAgICAgaWYgKCFoYXNGaWVsZChhcmdzWzBdKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gSGVscGVycy5pbnZva2VTdXBlcihjb250ZXh0LCB0aGlzLCBtZXRhQ2xhc3MsICJtZXRob2RfbWlzc2luZyIsIGFyZ3MsIEJsb2NrLk5VTExfQkxPQ0spOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gaW5kZXgoY29udGV4dCwgYXJnc1swXSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBSdWJ5T25lb2ZEZXNjcmlwdG9yIHJ1YnlPbmVvZkRlc2NyaXB0b3IgPSAoUnVieU9uZW9mRGVzY3JpcHRvcikgb25lb2ZEZXNjcmlwdG9yOwotICAgICAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgIG9uZW9mQ2FzZXMuZ2V0KHJ1YnlPbmVvZkRlc2NyaXB0b3IuZ2V0T25lb2ZEZXNjcmlwdG9yKCkpOwotICAgICAgICAgICAgaWYgKGZpZWxkRGVzY3JpcHRvciA9PSBudWxsKQotICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0KLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUubmV3U3ltYm9sKGZpZWxkRGVzY3JpcHRvci5nZXROYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gZmllbGROYW1lIGlzIFJ1YnlTeW1ib2wKLSAgICAgICAgICAgIFJ1YnlTdHJpbmcgZmllbGQgPSBhcmdzWzBdLmFzU3RyaW5nKCk7Ci0gICAgICAgICAgICBSdWJ5U3RyaW5nIGVxdWFsU2lnbiA9IGNvbnRleHQucnVudGltZS5uZXdTdHJpbmcoVXRpbHMuRVFVQUxfU0lHTik7Ci0gICAgICAgICAgICBpZiAoZmllbGQuZW5kX3dpdGhfcChjb250ZXh0LCBlcXVhbFNpZ24pLmlzVHJ1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgZmllbGQuY2hvbXBfYmFuZyhjb250ZXh0LCBlcXVhbFNpZ24pOwotICAgICAgICAgICAgfQotCi0gICAgICAgICAgICBpZiAoIWhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgICAgICAgIHJldHVybiBIZWxwZXJzLmludm9rZVN1cGVyKGNvbnRleHQsIHRoaXMsIG1ldGFDbGFzcywgIm1ldGhvZF9taXNzaW5nIiwgYXJncywgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gaW5kZXhTZXQoY29udGV4dCwgZmllbGQsIGFyZ3NbMV0pOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogTWVzc2FnZS5kdXAgPT4gbmV3X21lc3NhZ2UKLSAgICAgKiBQZXJmb3JtcyBhIHNoYWxsb3cgY29weSBvZiB0aGlzIG1lc3NhZ2UgYW5kIHJldHVybnMgdGhlIG5ldyBjb3B5LgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBkdXAoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJ1YnlNZXNzYWdlIGR1cCA9IChSdWJ5TWVzc2FnZSkgbWV0YUNsYXNzLm5ld0luc3RhbmNlKGNvbnRleHQsIEJsb2NrLk5VTExfQkxPQ0spOwotICAgICAgICBJUnVieU9iamVjdCB2YWx1ZTsKLSAgICAgICAgZm9yIChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yIDogdGhpcy5kZXNjcmlwdG9yLmdldEZpZWxkcygpKSB7Ci0gICAgICAgICAgICBpZiAoZmllbGREZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgICAgIGR1cC5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkRGVzY3JpcHRvciwgdGhpcy5nZXRSZXBlYXRlZEZpZWxkKGNvbnRleHQsIGZpZWxkRGVzY3JpcHRvcikpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuY29udGFpbnNLZXkoZmllbGREZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgICAgIGR1cC5maWVsZHMucHV0KGZpZWxkRGVzY3JpcHRvciwgZmllbGRzLmdldChmaWVsZERlc2NyaXB0b3IpKTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5idWlsZGVyLmhhc0ZpZWxkKGZpZWxkRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgICAgICBkdXAuZmllbGRzLnB1dChmaWVsZERlc2NyaXB0b3IsIHdyYXBGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IsIHRoaXMuYnVpbGRlci5nZXRGaWVsZChmaWVsZERlc2NyaXB0b3IpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yIDogbWFwcy5rZXlTZXQoKSkgewotICAgICAgICAgICAgZHVwLm1hcHMucHV0KGZpZWxkRGVzY3JpcHRvciwgbWFwcy5nZXQoZmllbGREZXNjcmlwdG9yKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1cDsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlLmRlc2NyaXB0b3IgPT4gZGVzY3JpcHRvcgotICAgICAqCi0gICAgICogQ2xhc3MgbWV0aG9kIHRoYXQgcmV0dXJucyB0aGUgRGVzY3JpcHRvciBpbnN0YW5jZSBjb3JyZXNwb25kaW5nIHRvIHRoaXMKLSAgICAgKiBtZXNzYWdlIGNsYXNzJ3MgdHlwZS4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJkZXNjcmlwdG9yIiwgbWV0YSA9IHRydWUpCi0gICAgcHVibGljIHN0YXRpYyBJUnVieU9iamVjdCBnZXREZXNjcmlwdG9yKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgcmVjdikgewotICAgICAgICByZXR1cm4gKChSdWJ5Q2xhc3MpIHJlY3YpLmdldEluc3RhbmNlVmFyaWFibGUoVXRpbHMuREVTQ1JJUFRPUl9JTlNUQU5DRV9WQVIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1lc3NhZ2VDbGFzcy5lbmNvZGUobXNnKSA9PiBieXRlcwotICAgICAqCi0gICAgICogRW5jb2RlcyB0aGUgZ2l2ZW4gbWVzc2FnZSBvYmplY3QgdG8gaXRzIHNlcmlhbGl6ZWQgZm9ybSBpbiBwcm90b2NvbCBidWZmZXJzCi0gICAgICogd2lyZSBmb3JtYXQuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG1ldGEgPSB0cnVlKQotICAgIHB1YmxpYyBzdGF0aWMgSVJ1YnlPYmplY3QgZW5jb2RlKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgcmVjdiwgSVJ1YnlPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgUnVieU1lc3NhZ2UgbWVzc2FnZSA9IChSdWJ5TWVzc2FnZSkgdmFsdWU7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUubmV3U3RyaW5nKG5ldyBCeXRlTGlzdChtZXNzYWdlLmJ1aWxkKGNvbnRleHQpLnRvQnl0ZUFycmF5KCkpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlQ2xhc3MuZGVjb2RlKGRhdGEpID0+IG1lc3NhZ2UKLSAgICAgKgotICAgICAqIERlY29kZXMgdGhlIGdpdmVuIGRhdGEgKGFzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYnl0ZXMgaW4gcHJvdG9jb2wgYnVmZmVycyB3aXJlCi0gICAgICogZm9ybWF0KSB1bmRlciB0aGUgaW50ZXJwcmV0cmF0aW9uIGdpdmVuIGJ5IHRoaXMgbWVzc2FnZSBjbGFzcydzIGRlZmluaXRpb24KLSAgICAgKiBhbmQgcmV0dXJucyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgdmFsdWVzLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChtZXRhID0gdHJ1ZSkKLSAgICBwdWJsaWMgc3RhdGljIElSdWJ5T2JqZWN0IGRlY29kZShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IHJlY3YsIElSdWJ5T2JqZWN0IGRhdGEpIHsKLSAgICAgICAgYnl0ZVtdIGJpbiA9IGRhdGEuY29udmVydFRvU3RyaW5nKCkuZ2V0Qnl0ZXMoKTsKLSAgICAgICAgUnVieU1lc3NhZ2UgcmV0ID0gKFJ1YnlNZXNzYWdlKSAoKFJ1YnlDbGFzcykgcmVjdikubmV3SW5zdGFuY2UoY29udGV4dCwgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgICByZXQuYnVpbGRlci5tZXJnZUZyb20oYmluKTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQucnVudGltZS5uZXdSdW50aW1lRXJyb3IoZS5nZXRNZXNzYWdlKCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWVzc2FnZUNsYXNzLmVuY29kZV9qc29uKG1zZykgPT4ganNvbl9zdHJpbmcKLSAgICAgKgotICAgICAqIEVuY29kZXMgdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0IGludG8gaXRzIHNlcmlhbGl6ZWQgSlNPTiByZXByZXNlbnRhdGlvbi4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJlbmNvZGVfanNvbiIsIG1ldGEgPSB0cnVlKQotICAgIHB1YmxpYyBzdGF0aWMgSVJ1YnlPYmplY3QgZW5jb2RlSnNvbihUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IHJlY3YsIElSdWJ5T2JqZWN0IG1zZ1JiKSB7Ci0gICAgICAgIFJ1YnlNZXNzYWdlIG1lc3NhZ2UgPSAoUnVieU1lc3NhZ2UpIG1zZ1JiOwotICAgICAgICByZXR1cm4gSGVscGVycy5pbnZva2UoY29udGV4dCwgbWVzc2FnZS50b0hhc2goY29udGV4dCksICJ0b19qc29uIik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgTWVzc2FnZUNsYXNzLmRlY29kZV9qc29uKGRhdGEpID0+IG1lc3NhZ2UKLSAgICAgKgotICAgICAqIERlY29kZXMgdGhlIGdpdmVuIGRhdGEgKGFzIGEgc3RyaW5nIGNvbnRhaW5pbmcgYnl0ZXMgaW4gcHJvdG9jb2wgYnVmZmVycyB3aXJlCi0gICAgICogZm9ybWF0KSB1bmRlciB0aGUgaW50ZXJwcmV0cmF0aW9uIGdpdmVuIGJ5IHRoaXMgbWVzc2FnZSBjbGFzcydzIGRlZmluaXRpb24KLSAgICAgKiBhbmQgcmV0dXJucyBhIG1lc3NhZ2Ugb2JqZWN0IHdpdGggdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgdmFsdWVzLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChuYW1lID0gImRlY29kZV9qc29uIiwgbWV0YSA9IHRydWUpCi0gICAgcHVibGljIHN0YXRpYyBJUnVieU9iamVjdCBkZWNvZGVKc29uKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgcmVjdiwgSVJ1YnlPYmplY3QganNvbikgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIFJ1YnlNZXNzYWdlIHJldCA9IChSdWJ5TWVzc2FnZSkgKChSdWJ5Q2xhc3MpIHJlY3YpLm5ld0luc3RhbmNlKGNvbnRleHQsIEJsb2NrLk5VTExfQkxPQ0spOwotICAgICAgICBSdWJ5TW9kdWxlIGpzb25Nb2R1bGUgPSBydW50aW1lLmdldENsYXNzRnJvbVBhdGgoIkpTT04iKTsKLSAgICAgICAgUnVieUhhc2ggb3B0cyA9IFJ1YnlIYXNoLm5ld0hhc2gocnVudGltZSk7Ci0gICAgICAgIG9wdHMuZmFzdEFTZXQocnVudGltZS5uZXdTeW1ib2woInN5bWJvbGl6ZV9uYW1lcyIpLCBydW50aW1lLmdldFRydWUoKSk7Ci0gICAgICAgIElSdWJ5T2JqZWN0W10gYXJncyA9IG5ldyBJUnVieU9iamVjdFtdIHsgSGVscGVycy5pbnZva2UoY29udGV4dCwganNvbk1vZHVsZSwgInBhcnNlIiwganNvbiwgb3B0cykgfTsKLSAgICAgICAgcmV0LmluaXRpYWxpemUoY29udGV4dCwgYXJncyk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSB7InRvX2giLCAidG9faGFzaCJ9KQotICAgIHB1YmxpYyBJUnVieU9iamVjdCB0b0hhc2goVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFJ1YnkgcnVudGltZSA9IGNvbnRleHQucnVudGltZTsKLSAgICAgICAgUnVieUhhc2ggcmV0ID0gUnVieUhhc2gubmV3SGFzaChydW50aW1lKTsKLSAgICAgICAgZm9yIChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmRlZiA6IHRoaXMuZGVzY3JpcHRvci5nZXRGaWVsZHMoKSkgewotICAgICAgICAgICAgSVJ1YnlPYmplY3QgdmFsdWUgPSBnZXRGaWVsZChjb250ZXh0LCBmZGVmKTsKLSAgICAgICAgICAgIGlmICghdmFsdWUuaXNOaWwoKSkgewotICAgICAgICAgICAgICAgIGlmICh2YWx1ZS5yZXNwb25kc1RvKCJ0b19oIikpIHsKLSAgICAgICAgICAgICAgICAgICAgdmFsdWUgPSBIZWxwZXJzLmludm9rZShjb250ZXh0LCB2YWx1ZSwgInRvX2giKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlLnJlc3BvbmRzVG8oInRvX2EiKSkgewotICAgICAgICAgICAgICAgICAgICB2YWx1ZSA9IEhlbHBlcnMuaW52b2tlKGNvbnRleHQsIHZhbHVlLCAidG9fYSIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHJldC5mYXN0QVNldChydW50aW1lLm5ld1N5bWJvbChmZGVmLmdldE5hbWUoKSksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmV0OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEeW5hbWljTWVzc2FnZSBidWlsZChUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIGJ1aWxkKGNvbnRleHQsIDApOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBEeW5hbWljTWVzc2FnZSBidWlsZChUaHJlYWRDb250ZXh0IGNvbnRleHQsIGludCBkZXB0aCkgewotICAgICAgICBpZiAoZGVwdGggPiBTSU5LX01BWElNVU1fTkVTVElORykgewotICAgICAgICAgICAgdGhyb3cgY29udGV4dC5ydW50aW1lLm5ld1J1bnRpbWVFcnJvcigiTWF4aW11bSByZWN1cnNpb24gZGVwdGggZXhjZWVkZWQgZHVyaW5nIGVuY29kaW5nLiIpOwotICAgICAgICB9Ci0gICAgICAgIGZvciAoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA6IG1hcHMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIHRoaXMuYnVpbGRlci5jbGVhckZpZWxkKGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBSdWJ5RGVzY3JpcHRvciBtYXBEZXNjcmlwdG9yID0gKFJ1YnlEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yRm9yRmllbGQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIGZvciAoRHluYW1pY01lc3NhZ2Uga3YgOiBtYXBzLmdldChmaWVsZERlc2NyaXB0b3IpLmJ1aWxkKGNvbnRleHQsIG1hcERlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgdGhpcy5idWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZmllbGREZXNjcmlwdG9yLCBrdik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yIDogcmVwZWF0ZWRGaWVsZHMua2V5U2V0KCkpIHsKLSAgICAgICAgICAgIFJ1YnlSZXBlYXRlZEZpZWxkIHJlcGVhdGVkRmllbGQgPSByZXBlYXRlZEZpZWxkcy5nZXQoZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIHRoaXMuYnVpbGRlci5jbGVhckZpZWxkKGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkRmllbGQuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgICAgICBPYmplY3QgaXRlbSA9IGNvbnZlcnQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yLCByZXBlYXRlZEZpZWxkLmdldChpKSwgZGVwdGgpOwotICAgICAgICAgICAgICAgIHRoaXMuYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkRGVzY3JpcHRvciwgaXRlbSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgZm9yIChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yIDogZmllbGRzLmtleVNldCgpKSB7Ci0gICAgICAgICAgICBJUnVieU9iamVjdCB2YWx1ZSA9IGZpZWxkcy5nZXQoZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIHRoaXMuYnVpbGRlci5zZXRGaWVsZChmaWVsZERlc2NyaXB0b3IsIGNvbnZlcnQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yLCB2YWx1ZSwgZGVwdGgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5idWlsZGVyLmJ1aWxkKCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuZGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICAvLyBJbnRlcm5hbCB1c2Ugb25seSwgY2FsbGVkIGJ5IEdvb2dsZTo6UHJvdG9idWYuZGVlcF9jb3B5Ci0gICAgcHJvdGVjdGVkIElSdWJ5T2JqZWN0IGRlZXBDb3B5KFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBSdWJ5TWVzc2FnZSBjb3B5ID0gKFJ1YnlNZXNzYWdlKSBtZXRhQ2xhc3MubmV3SW5zdGFuY2UoY29udGV4dCwgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgIGZvciAoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZkZWYgOiB0aGlzLmRlc2NyaXB0b3IuZ2V0RmllbGRzKCkpIHsKLSAgICAgICAgICAgIGlmIChmZGVmLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgICAgIGNvcHkuYWRkUmVwZWF0ZWRGaWVsZChmZGVmLCB0aGlzLmdldFJlcGVhdGVkRmllbGQoY29udGV4dCwgZmRlZikuZGVlcENvcHkoY29udGV4dCkpOwotICAgICAgICAgICAgfSBlbHNlIGlmIChmaWVsZHMuY29udGFpbnNLZXkoZmRlZikpIHsKLSAgICAgICAgICAgICAgICBjb3B5LmZpZWxkcy5wdXQoZmRlZiwgZmllbGRzLmdldChmZGVmKSk7Ci0gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuYnVpbGRlci5oYXNGaWVsZChmZGVmKSkgewotICAgICAgICAgICAgICAgIGNvcHkuZmllbGRzLnB1dChmZGVmLCB3cmFwRmllbGQoY29udGV4dCwgZmRlZiwgdGhpcy5idWlsZGVyLmdldEZpZWxkKGZkZWYpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvcHk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSdWJ5UmVwZWF0ZWRGaWVsZCBnZXRSZXBlYXRlZEZpZWxkKFRocmVhZENvbnRleHQgY29udGV4dCwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvcikgewotICAgICAgICBpZiAodGhpcy5yZXBlYXRlZEZpZWxkcy5jb250YWluc0tleShmaWVsZERlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdGhpcy5yZXBlYXRlZEZpZWxkcy5nZXQoZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgfQotICAgICAgICBpbnQgY291bnQgPSB0aGlzLmJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgIFJ1YnlSZXBlYXRlZEZpZWxkIHJldCA9IHJlcGVhdGVkRmllbGRGb3JGaWVsZERlc2NyaXB0b3IoY29udGV4dCwgZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7Ci0gICAgICAgICAgICByZXQucHVzaChjb250ZXh0LCB3cmFwRmllbGQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yLCB0aGlzLmJ1aWxkZXIuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZERlc2NyaXB0b3IsIGkpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgYWRkUmVwZWF0ZWRGaWVsZChmaWVsZERlc2NyaXB0b3IsIHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIGFkZFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciwgUnVieVJlcGVhdGVkRmllbGQgcmVwZWF0ZWRGaWVsZCkgewotICAgICAgICB0aGlzLnJlcGVhdGVkRmllbGRzLnB1dChmaWVsZERlc2NyaXB0b3IsIHJlcGVhdGVkRmllbGQpOwotICAgIH0KLQotICAgIHByaXZhdGUgSVJ1YnlPYmplY3QgYnVpbGRGcm9tKFRocmVhZENvbnRleHQgY29udGV4dCwgRHluYW1pY01lc3NhZ2UgZHluYW1pY01lc3NhZ2UpIHsKLSAgICAgICAgdGhpcy5idWlsZGVyLm1lcmdlRnJvbShkeW5hbWljTWVzc2FnZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpbmRGaWVsZChUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IGZpZWxkTmFtZSkgewotICAgICAgICBTdHJpbmcgbmFtZVN0ciA9IGZpZWxkTmFtZS5hc0phdmFTdHJpbmcoKTsKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJldCA9IHRoaXMuZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoVXRpbHMuZXNjYXBlSWRlbnRpZmllcihuYW1lU3RyKSk7Ci0gICAgICAgIGlmIChyZXQgPT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQucnVudGltZS5uZXdBcmd1bWVudEVycm9yKCJmaWVsZCAiICsgZmllbGROYW1lLmFzSmF2YVN0cmluZygpICsgIiBpcyBub3QgZm91bmQiKTsKLSAgICAgICAgcmV0dXJuIHJldDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGJvb2xlYW4gaGFzRmllbGQoSVJ1YnlPYmplY3QgZmllbGROYW1lKSB7Ci0gICAgICAgIFN0cmluZyBuYW1lU3RyID0gZmllbGROYW1lLmFzSmF2YVN0cmluZygpOwotICAgICAgICByZXR1cm4gdGhpcy5kZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShVdGlscy5lc2NhcGVJZGVudGlmaWVyKG5hbWVTdHIpKSAhPSBudWxsOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja1JlcGVhdGVkRmllbGRUeXBlKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvcikgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUnVieVJlcGVhdGVkRmllbGQpKSB7Ci0gICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcigiRXhwZWN0ZWQgcmVwZWF0ZWQgZmllbGQgYXJyYXkiKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIC8vIGNvbnZlcnQgYSBydWJ5IG9iamVjdCB0byBwcm90b2J1ZiB0eXBlLCB3aXRoIHR5cGUgY2hlY2sKLSAgICBwcml2YXRlIE9iamVjdCBjb252ZXJ0KFRocmVhZENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBJUnVieU9iamVjdCB2YWx1ZSwgaW50IGRlcHRoKSB7Ci0gICAgICAgIFJ1YnkgcnVudGltZSA9IGNvbnRleHQucnVudGltZTsKLSAgICAgICAgT2JqZWN0IHZhbCA9IG51bGw7Ci0gICAgICAgIHN3aXRjaCAoZmllbGREZXNjcmlwdG9yLmdldFR5cGUoKSkgewotICAgICAgICAgICAgY2FzZSBJTlQzMjoKLSAgICAgICAgICAgIGNhc2UgSU5UNjQ6Ci0gICAgICAgICAgICBjYXNlIFVJTlQzMjoKLSAgICAgICAgICAgIGNhc2UgVUlOVDY0OgotICAgICAgICAgICAgICAgIGlmICghVXRpbHMuaXNSdWJ5TnVtKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcigiRXhwZWN0ZWQgbnVtYmVyIHR5cGUgZm9yIGludGVncmFsIGZpZWxkLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBVdGlscy5jaGVja0ludFR5cGVQcmVjaXNpb24oY29udGV4dCwgZmllbGREZXNjcmlwdG9yLmdldFR5cGUoKSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIHN3aXRjaCAoZmllbGREZXNjcmlwdG9yLmdldFR5cGUoKSkgewotICAgICAgICAgICAgICAgICAgICBjYXNlIElOVDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgdmFsID0gUnVieU51bWVyaWMubnVtMmludCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICAgICAgY2FzZSBJTlQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFJ1YnlOdW1lcmljLm51bTJsb25nKHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFVJTlQzMjoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFV0aWxzLm51bTJ1aW50KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IFV0aWxzLm51bTJ1bG9uZyhjb250ZXh0LnJ1bnRpbWUsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGTE9BVDoKLSAgICAgICAgICAgICAgICBpZiAoIVV0aWxzLmlzUnVieU51bSh2YWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3VHlwZUVycm9yKCJFeHBlY3RlZCBudW1iZXIgdHlwZSBmb3IgZmxvYXQgZmllbGQuIik7Ci0gICAgICAgICAgICAgICAgdmFsID0gKGZsb2F0KSBSdWJ5TnVtZXJpYy5udW0yZGJsKHZhbHVlKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRE9VQkxFOgotICAgICAgICAgICAgICAgIGlmICghVXRpbHMuaXNSdWJ5TnVtKHZhbHVlKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdUeXBlRXJyb3IoIkV4cGVjdGVkIG51bWJlciB0eXBlIGZvciBkb3VibGUgZmllbGQuIik7Ci0gICAgICAgICAgICAgICAgdmFsID0gUnVieU51bWVyaWMubnVtMmRibCh2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEJPT0w6Ci0gICAgICAgICAgICAgICAgaWYgKCEodmFsdWUgaW5zdGFuY2VvZiBSdWJ5Qm9vbGVhbikpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3VHlwZUVycm9yKCJJbnZhbGlkIGFyZ3VtZW50IGZvciBib29sZWFuIGZpZWxkLiIpOwotICAgICAgICAgICAgICAgIHZhbCA9IHZhbHVlLmlzVHJ1ZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCWVRFUzoKLSAgICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgICAgIFV0aWxzLnZhbGlkYXRlU3RyaW5nRW5jb2RpbmcoY29udGV4dC5ydW50aW1lLCBmaWVsZERlc2NyaXB0b3IuZ2V0VHlwZSgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgUnVieVN0cmluZyBzdHIgPSAoUnVieVN0cmluZykgdmFsdWU7Ci0gICAgICAgICAgICAgICAgc3dpdGNoIChmaWVsZERlc2NyaXB0b3IuZ2V0VHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgQllURVM6Ci0gICAgICAgICAgICAgICAgICAgICAgICB2YWwgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKHN0ci5nZXRCeXRlcygpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgICAgICAgICAgIHZhbCA9IHN0ci5hc0phdmFTdHJpbmcoKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICAgICAgICAgIFJ1YnlDbGFzcyB0eXBlQ2xhc3MgPSAoUnVieUNsYXNzKSAoKFJ1YnlEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yRm9yRmllbGQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yKSkubXNnY2xhc3MoY29udGV4dCk7Ci0gICAgICAgICAgICAgICAgaWYgKCF2YWx1ZS5nZXRNZXRhQ2xhc3MoKS5lcXVhbHModHlwZUNsYXNzKSkKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdUeXBlRXJyb3IodmFsdWUsICJJbnZhbGlkIHR5cGUgdG8gYXNzaWduIHRvIHN1Ym1lc3NhZ2UgZmllbGQuIik7Ci0gICAgICAgICAgICAgICAgdmFsID0gKChSdWJ5TWVzc2FnZSkgdmFsdWUpLmJ1aWxkKGNvbnRleHQsIGRlcHRoICsgMSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3IgZW51bURlc2NyaXB0b3IgPSBmaWVsZERlc2NyaXB0b3IuZ2V0RW51bVR5cGUoKTsKLQotICAgICAgICAgICAgICAgIGlmIChVdGlscy5pc1J1YnlOdW0odmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IGVudW1EZXNjcmlwdG9yLmZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oUnVieU51bWVyaWMubnVtMmludCh2YWx1ZSkpOwotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSdWJ5U3ltYm9sKSB7Ci0gICAgICAgICAgICAgICAgICAgIHZhbCA9IGVudW1EZXNjcmlwdG9yLmZpbmRWYWx1ZUJ5TmFtZSh2YWx1ZS5hc0phdmFTdHJpbmcoKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdUeXBlRXJyb3IoIkV4cGVjdGVkIG51bWJlciBvciBzeW1ib2wgdHlwZSBmb3IgZW51bSBmaWVsZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgaWYgKHZhbCA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3UmFuZ2VFcnJvcigiRW51bSB2YWx1ZSAiICsgdmFsdWUgKyAiIGlzIG5vdCBmb3VuZC4iKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiB2YWw7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUnVieU9iamVjdCB3cmFwRmllbGQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yLCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgICAgIH0KLSAgICAgICAgUnVieSBydW50aW1lID0gY29udGV4dC5ydW50aW1lOwotICAgICAgICBzd2l0Y2ggKGZpZWxkRGVzY3JpcHRvci5nZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIElOVDY0OgotICAgICAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgICAgIGNhc2UgRkxPQVQ6Ci0gICAgICAgICAgICBjYXNlIERPVUJMRToKLSAgICAgICAgICAgIGNhc2UgQk9PTDoKLSAgICAgICAgICAgIGNhc2UgQllURVM6Ci0gICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gVXRpbHMud3JhcFByaW1hcnlWYWx1ZShjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IuZ2V0VHlwZSgpLCB2YWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgICAgICAgICAgUnVieUNsYXNzIHR5cGVDbGFzcyA9IChSdWJ5Q2xhc3MpICgoUnVieURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3JGb3JGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpKS5tc2djbGFzcyhjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBSdWJ5TWVzc2FnZSBtc2cgPSAoUnVieU1lc3NhZ2UpIHR5cGVDbGFzcy5uZXdJbnN0YW5jZShjb250ZXh0LCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gbXNnLmJ1aWxkRnJvbShjb250ZXh0LCAoRHluYW1pY01lc3NhZ2UpIHZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICAgICAgICBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGVudW1WYWx1ZURlc2NyaXB0b3IgPSAoRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWU7Ci0gICAgICAgICAgICAgICAgaWYgKGVudW1WYWx1ZURlc2NyaXB0b3IuZ2V0SW5kZXgoKSA9PSAtMSkgeyAvLyBVTktOT1dOIEVOVU0gVkFMVUUKLSAgICAgICAgICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUubmV3Rml4bnVtKGVudW1WYWx1ZURlc2NyaXB0b3IuZ2V0TnVtYmVyKCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZS5uZXdTeW1ib2woZW51bVZhbHVlRGVzY3JpcHRvci5nZXROYW1lKCkpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZS5uZXdTdHJpbmcodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIFJ1YnlSZXBlYXRlZEZpZWxkIHJlcGVhdGVkRmllbGRGb3JGaWVsZERlc2NyaXB0b3IoVGhyZWFkQ29udGV4dCBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yKSB7Ci0gICAgICAgIElSdWJ5T2JqZWN0IHR5cGVDbGFzcyA9IGNvbnRleHQucnVudGltZS5nZXROaWxDbGFzcygpOwotCi0gICAgICAgIElSdWJ5T2JqZWN0IGRlc2NyaXB0b3IgPSBnZXREZXNjcmlwdG9yRm9yRmllbGQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUgdHlwZSA9IGZpZWxkRGVzY3JpcHRvci5nZXRUeXBlKCk7Ci0gICAgICAgIGlmICh0eXBlID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgIHR5cGVDbGFzcyA9ICgoUnVieURlc2NyaXB0b3IpIGRlc2NyaXB0b3IpLm1zZ2NsYXNzKGNvbnRleHQpOwotCi0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNKSB7Ci0gICAgICAgICAgICB0eXBlQ2xhc3MgPSAoKFJ1YnlFbnVtRGVzY3JpcHRvcikgZGVzY3JpcHRvcikuZW51bW1vZHVsZShjb250ZXh0KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gbmV3IFJ1YnlSZXBlYXRlZEZpZWxkKGNvbnRleHQucnVudGltZSwgY1JlcGVhdGVkRmllbGQsIHR5cGUsIHR5cGVDbGFzcyk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIElSdWJ5T2JqZWN0IGdldEZpZWxkKFRocmVhZENvbnRleHQgY29udGV4dCwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvcikgewotICAgICAgICBEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2ZEZXNjcmlwdG9yID0gZmllbGREZXNjcmlwdG9yLmdldENvbnRhaW5pbmdPbmVvZigpOwotICAgICAgICBpZiAob25lb2ZEZXNjcmlwdG9yICE9IG51bGwpIHsKLSAgICAgICAgICAgIGlmIChvbmVvZkNhc2VzLmNvbnRhaW5zS2V5KG9uZW9mRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgICAgICBpZiAob25lb2ZDYXNlcy5nZXQob25lb2ZEZXNjcmlwdG9yKSAhPSBmaWVsZERlc2NyaXB0b3IpCi0gICAgICAgICAgICAgICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUuZ2V0TmlsKCk7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5nZXQoZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIG9uZW9mQ2FzZSA9IGJ1aWxkZXIuZ2V0T25lb2ZGaWVsZERlc2NyaXB0b3Iob25lb2ZEZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICBpZiAob25lb2ZDYXNlICE9IGZpZWxkRGVzY3JpcHRvcikgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICAgICAgICAgICAgICBJUnVieU9iamVjdCB2YWx1ZSA9IHdyYXBGaWVsZChjb250ZXh0LCBvbmVvZkNhc2UsIGJ1aWxkZXIuZ2V0RmllbGQob25lb2ZDYXNlKSk7Ci0gICAgICAgICAgICAgICAgZmllbGRzLnB1dChmaWVsZERlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoVXRpbHMuaXNNYXBFbnRyeShmaWVsZERlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICBSdWJ5TWFwIG1hcCA9IG1hcHMuZ2V0KGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICBpZiAobWFwID09IG51bGwpIHsKLSAgICAgICAgICAgICAgICBtYXAgPSBuZXdNYXBGb3JGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIGludCBtYXBTaXplID0gdGhpcy5idWlsZGVyLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBrZXlGaWVsZCA9IGZpZWxkRGVzY3JpcHRvci5nZXRNZXNzYWdlVHlwZSgpLmZpbmRGaWVsZEJ5TnVtYmVyKDEpOwotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciB2YWx1ZUZpZWxkID0gZmllbGREZXNjcmlwdG9yLmdldE1lc3NhZ2VUeXBlKCkuZmluZEZpZWxkQnlOdW1iZXIoMik7Ci0gICAgICAgICAgICAgICAgUnVieURlc2NyaXB0b3Iga3ZEZXNjcmlwdG9yID0gKFJ1YnlEZXNjcmlwdG9yKSBnZXREZXNjcmlwdG9yRm9yRmllbGQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICBSdWJ5Q2xhc3Mga3ZDbGFzcyA9IChSdWJ5Q2xhc3MpIGt2RGVzY3JpcHRvci5tc2djbGFzcyhjb250ZXh0KTsKLSAgICAgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcFNpemU7IGkrKykgewotICAgICAgICAgICAgICAgICAgICBSdWJ5TWVzc2FnZSBrdk1lc3NhZ2UgPSAoUnVieU1lc3NhZ2UpIGt2Q2xhc3MubmV3SW5zdGFuY2UoY29udGV4dCwgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgICAgICAgICAgICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPSAoRHluYW1pY01lc3NhZ2UpIHRoaXMuYnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkRGVzY3JpcHRvciwgaSk7Ci0gICAgICAgICAgICAgICAgICAgIGt2TWVzc2FnZS5idWlsZEZyb20oY29udGV4dCwgbWVzc2FnZSk7Ci0gICAgICAgICAgICAgICAgICAgIG1hcC5pbmRleFNldChjb250ZXh0LCBrdk1lc3NhZ2UuZ2V0RmllbGQoY29udGV4dCwga2V5RmllbGQpLCBrdk1lc3NhZ2UuZ2V0RmllbGQoY29udGV4dCwgdmFsdWVGaWVsZCkpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBtYXBzLnB1dChmaWVsZERlc2NyaXB0b3IsIG1hcCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICByZXR1cm4gbWFwOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWVsZERlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZ2V0UmVwZWF0ZWRGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWVsZERlc2NyaXB0b3IuZ2V0VHlwZSgpICE9IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgfHwKLSAgICAgICAgICAgICAgICB0aGlzLmJ1aWxkZXIuaGFzRmllbGQoZmllbGREZXNjcmlwdG9yKSB8fCBmaWVsZHMuY29udGFpbnNLZXkoZmllbGREZXNjcmlwdG9yKSkgewotICAgICAgICAgICAgaWYgKGZpZWxkcy5jb250YWluc0tleShmaWVsZERlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkcy5nZXQoZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgSVJ1YnlPYmplY3QgdmFsdWUgPSB3cmFwRmllbGQoY29udGV4dCwgZmllbGREZXNjcmlwdG9yLCB0aGlzLmJ1aWxkZXIuZ2V0RmllbGQoZmllbGREZXNjcmlwdG9yKSk7Ci0gICAgICAgICAgICAgICAgaWYgKHRoaXMuYnVpbGRlci5oYXNGaWVsZChmaWVsZERlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICAgICAgICAgIGZpZWxkcy5wdXQoZmllbGREZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBJUnVieU9iamVjdCBzZXRGaWVsZChUaHJlYWRDb250ZXh0IGNvbnRleHQsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IsIElSdWJ5T2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmIChVdGlscy5pc01hcEVudHJ5KGZpZWxkRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUnVieU1hcCkpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBjb250ZXh0LnJ1bnRpbWUubmV3VHlwZUVycm9yKCJFeHBlY3RlZCBNYXAgaW5zdGFuY2UiKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIFJ1YnlNYXAgdGhpc01hcCA9IChSdWJ5TWFwKSBnZXRGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICAgICAgdGhpc01hcC5tZXJnZUludG9TZWxmKGNvbnRleHQsIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChmaWVsZERlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgICBjaGVja1JlcGVhdGVkRmllbGRUeXBlKGNvbnRleHQsIHZhbHVlLCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUnVieVJlcGVhdGVkRmllbGQpIHsKLSAgICAgICAgICAgICAgICBhZGRSZXBlYXRlZEZpZWxkKGZpZWxkRGVzY3JpcHRvciwgKFJ1YnlSZXBlYXRlZEZpZWxkKSB2YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIFJ1YnlBcnJheSBhcnkgPSB2YWx1ZS5jb252ZXJ0VG9BcnJheSgpOwotICAgICAgICAgICAgICAgIFJ1YnlSZXBlYXRlZEZpZWxkIHJlcGVhdGVkRmllbGQgPSBydWJ5VG9SZXBlYXRlZEZpZWxkKGNvbnRleHQsIGZpZWxkRGVzY3JpcHRvciwgYXJ5KTsKLSAgICAgICAgICAgICAgICBhZGRSZXBlYXRlZEZpZWxkKGZpZWxkRGVzY3JpcHRvciwgcmVwZWF0ZWRGaWVsZCk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2ZEZXNjcmlwdG9yID0gZmllbGREZXNjcmlwdG9yLmdldENvbnRhaW5pbmdPbmVvZigpOwotICAgICAgICAgICAgaWYgKG9uZW9mRGVzY3JpcHRvciAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIG9uZW9mQ2FzZSA9IG9uZW9mQ2FzZXMuZ2V0KG9uZW9mRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgaWYgKG9uZW9mQ2FzZSAhPSBudWxsICYmIG9uZW9mQ2FzZSAhPSBmaWVsZERlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgICAgICAgICAgZmllbGRzLnJlbW92ZShvbmVvZkNhc2UpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAodmFsdWUuaXNOaWwoKSkgewotICAgICAgICAgICAgICAgICAgICBvbmVvZkNhc2VzLnJlbW92ZShvbmVvZkRlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICBmaWVsZHMucmVtb3ZlKGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgICAgb25lb2ZDYXNlcy5wdXQob25lb2ZEZXNjcmlwdG9yLCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICAgICAgICAgICAgICBmaWVsZHMucHV0KGZpZWxkRGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUgZmllbGRUeXBlID0gZmllbGREZXNjcmlwdG9yLmdldFR5cGUoKTsKLSAgICAgICAgICAgICAgICBJUnVieU9iamVjdCB0eXBlQ2xhc3MgPSBjb250ZXh0LnJ1bnRpbWUuZ2V0T2JqZWN0KCk7Ci0gICAgICAgICAgICAgICAgYm9vbGVhbiBhZGRWYWx1ZSA9IHRydWU7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkVHlwZSA9PSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgICAgICAgICAgIHR5cGVDbGFzcyA9ICgoUnVieURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3JGb3JGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpKS5tc2djbGFzcyhjb250ZXh0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHZhbHVlLmlzTmlsKCkpewotICAgICAgICAgICAgICAgICAgICAgICAgYWRkVmFsdWUgPSBmYWxzZTsKLSAgICAgICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoZmllbGRUeXBlID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLkVOVU0pIHsKLSAgICAgICAgICAgICAgICAgICAgdHlwZUNsYXNzID0gKChSdWJ5RW51bURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3JGb3JGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpKS5lbnVtbW9kdWxlKGNvbnRleHQpOwotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvciA9IGZpZWxkRGVzY3JpcHRvci5nZXRFbnVtVHlwZSgpOwotICAgICAgICAgICAgICAgICAgICBpZiAoVXRpbHMuaXNSdWJ5TnVtKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciB2YWwgPQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnVtRGVzY3JpcHRvci5maW5kVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKFJ1YnlOdW1lcmljLm51bTJpbnQodmFsdWUpKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2YWwuZ2V0SW5kZXgoKSAhPSAtMSkgdmFsdWUgPSBjb250ZXh0LnJ1bnRpbWUubmV3U3ltYm9sKHZhbC5nZXROYW1lKCkpOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGlmIChhZGRWYWx1ZSkgewotICAgICAgICAgICAgICAgICAgICBVdGlscy5jaGVja1R5cGUoY29udGV4dCwgZmllbGRUeXBlLCB2YWx1ZSwgKFJ1YnlNb2R1bGUpIHR5cGVDbGFzcyk7Ci0gICAgICAgICAgICAgICAgICAgIHRoaXMuZmllbGRzLnB1dChmaWVsZERlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgICB0aGlzLmZpZWxkcy5yZW1vdmUoZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFN0cmluZyBsYXlvdXRJbnNwZWN0KCkgewotICAgICAgICBUaHJlYWRDb250ZXh0IGNvbnRleHQgPSBnZXRSdW50aW1lKCkuZ2V0Q3VycmVudENvbnRleHQoKTsKLSAgICAgICAgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICAgIGZvciAoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZkZWYgOiBkZXNjcmlwdG9yLmdldEZpZWxkcygpKSB7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoVXRpbHMudW5lc2NhcGVJZGVudGlmaWVyKGZkZWYuZ2V0TmFtZSgpKSk7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoIjogIik7Ci0gICAgICAgICAgICBzYi5hcHBlbmQoZ2V0RmllbGQoY29udGV4dCwgZmRlZikuaW5zcGVjdCgpKTsKLSAgICAgICAgICAgIHNiLmFwcGVuZCgiLCAiKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2Iuc3Vic3RyaW5nKDAsIHNiLmxlbmd0aCgpIC0gMik7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUnVieU9iamVjdCBnZXREZXNjcmlwdG9yRm9yRmllbGQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yKSB7Ci0gICAgICAgIFJ1YnlEZXNjcmlwdG9yIHRoaXNSYkRlc2NyaXB0b3IgPSAoUnVieURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3IoY29udGV4dCwgbWV0YUNsYXNzKTsKLSAgICAgICAgcmV0dXJuIHRoaXNSYkRlc2NyaXB0b3IubG9va3VwKGZpZWxkRGVzY3JpcHRvci5nZXROYW1lKCkpLmdldFN1YlR5cGUoY29udGV4dCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBSdWJ5UmVwZWF0ZWRGaWVsZCBydWJ5VG9SZXBlYXRlZEZpZWxkKFRocmVhZENvbnRleHQgY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciwgSVJ1YnlPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgUnVieUFycmF5IGFyciA9IHZhbHVlLmNvbnZlcnRUb0FycmF5KCk7Ci0gICAgICAgIFJ1YnlSZXBlYXRlZEZpZWxkIHJlcGVhdGVkRmllbGQgPSByZXBlYXRlZEZpZWxkRm9yRmllbGREZXNjcmlwdG9yKGNvbnRleHQsIGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICByZXBlYXRlZEZpZWxkLnB1c2goY29udGV4dCwgYXJyLmVsdEludGVybmFsKGkpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gcmVwZWF0ZWRGaWVsZDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJ1YnlNYXAgbmV3TWFwRm9yRmllbGQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGREZXNjcmlwdG9yKSB7Ci0gICAgICAgIFJ1YnlEZXNjcmlwdG9yIG1hcERlc2NyaXB0b3IgPSAoUnVieURlc2NyaXB0b3IpIGdldERlc2NyaXB0b3JGb3JGaWVsZChjb250ZXh0LCBmaWVsZERlc2NyaXB0b3IpOwotICAgICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3Iga2V5RmllbGQgPSBmaWVsZERlc2NyaXB0b3IuZ2V0TWVzc2FnZVR5cGUoKS5maW5kRmllbGRCeU51bWJlcigxKTsKLSAgICAgICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHZhbHVlRmllbGQgPSBmaWVsZERlc2NyaXB0b3IuZ2V0TWVzc2FnZVR5cGUoKS5maW5kRmllbGRCeU51bWJlcigyKTsKLSAgICAgICAgSVJ1YnlPYmplY3Qga2V5VHlwZSA9IFJ1YnlTeW1ib2wubmV3U3ltYm9sKGNvbnRleHQucnVudGltZSwga2V5RmllbGQuZ2V0VHlwZSgpLm5hbWUoKSk7Ci0gICAgICAgIElSdWJ5T2JqZWN0IHZhbHVlVHlwZSA9IFJ1YnlTeW1ib2wubmV3U3ltYm9sKGNvbnRleHQucnVudGltZSwgdmFsdWVGaWVsZC5nZXRUeXBlKCkubmFtZSgpKTsKLSAgICAgICAgaWYgKHZhbHVlRmllbGQuZ2V0VHlwZSgpID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgIFJ1YnlGaWVsZERlc2NyaXB0b3IgcnVieUZpZWxkRGVzY3JpcHRvciA9IChSdWJ5RmllbGREZXNjcmlwdG9yKSBtYXBEZXNjcmlwdG9yLmxvb2t1cChjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICBjb250ZXh0LnJ1bnRpbWUubmV3U3RyaW5nKCJ2YWx1ZSIpKTsKLSAgICAgICAgICAgIFJ1YnlEZXNjcmlwdG9yIHJ1YnlEZXNjcmlwdG9yID0gKFJ1YnlEZXNjcmlwdG9yKSBydWJ5RmllbGREZXNjcmlwdG9yLmdldFN1YlR5cGUoY29udGV4dCk7Ci0gICAgICAgICAgICByZXR1cm4gKFJ1YnlNYXApIGNNYXAubmV3SW5zdGFuY2UoY29udGV4dCwga2V5VHlwZSwgdmFsdWVUeXBlLAotICAgICAgICAgICAgICAgICAgICBydWJ5RGVzY3JpcHRvci5tc2djbGFzcyhjb250ZXh0KSwgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gKFJ1YnlNYXApIGNNYXAubmV3SW5zdGFuY2UoY29udGV4dCwga2V5VHlwZSwgdmFsdWVUeXBlLCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGdldE9uZW9mQ2FzZShEZXNjcmlwdG9ycy5PbmVvZkRlc2NyaXB0b3Igb25lb2YpIHsKLSAgICAgICAgaWYgKG9uZW9mQ2FzZXMuY29udGFpbnNLZXkob25lb2YpKSB7Ci0gICAgICAgICAgICByZXR1cm4gb25lb2ZDYXNlcy5nZXQob25lb2YpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBidWlsZGVyLmdldE9uZW9mRmllbGREZXNjcmlwdG9yKG9uZW9mKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIER5bmFtaWNNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcjsKLSAgICBwcml2YXRlIFJ1YnlDbGFzcyBjUmVwZWF0ZWRGaWVsZDsKLSAgICBwcml2YXRlIFJ1YnlDbGFzcyBjTWFwOwotICAgIHByaXZhdGUgTWFwPERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciwgUnVieVJlcGVhdGVkRmllbGQ+IHJlcGVhdGVkRmllbGRzOwotICAgIHByaXZhdGUgTWFwPERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciwgUnVieU1hcD4gbWFwczsKLSAgICBwcml2YXRlIE1hcDxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIElSdWJ5T2JqZWN0PiBmaWVsZHM7Ci0gICAgcHJpdmF0ZSBNYXA8RGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yLCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I+IG9uZW9mQ2FzZXM7Ci0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgU0lOS19NQVhJTVVNX05FU1RJTkcgPSA2NDsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlNZXNzYWdlQnVpbGRlckNvbnRleHQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlNZXNzYWdlQnVpbGRlckNvbnRleHQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTYxOWI4MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5TWVzc2FnZUJ1aWxkZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTcgKzAsMCBAQAotLyoKLSAqIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotICogQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0gKiBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotICoKLSAqIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotICogbWV0OgotICoKLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0gKiBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0gKiBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0gKiBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0gKiBkaXN0cmlidXRpb24uCi0gKiAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0gKiBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotICogdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSAqCi0gKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0gKiAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0gKiBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotICogT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0gKiBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSAqIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotICogVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotICogKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0gKiBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotICovCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieTsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnM7Ci1pbXBvcnQgb3JnLmpydWJ5Lio7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlDbGFzczsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieU1ldGhvZDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5CaW5kaW5nOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLkJsb2NrOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLk9iamVjdEFsbG9jYXRvcjsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5UaHJlYWRDb250ZXh0OwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLmJ1aWx0aW4uSVJ1YnlPYmplY3Q7Ci0KLUBKUnVieUNsYXNzKG5hbWUgPSAiTWVzc2FnZUJ1aWxkZXJDb250ZXh0IikKLXB1YmxpYyBjbGFzcyBSdWJ5TWVzc2FnZUJ1aWxkZXJDb250ZXh0IGV4dGVuZHMgUnVieU9iamVjdCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVJ1YnlNZXNzYWdlQnVpbGRlckNvbnRleHQoUnVieSBydW50aW1lKSB7Ci0gICAgICAgIFJ1YnlNb2R1bGUgcHJvdG9idWYgPSBydW50aW1lLmdldENsYXNzRnJvbVBhdGgoIkdvb2dsZTo6UHJvdG9idWYiKTsKLSAgICAgICAgUnVieUNsYXNzIGNNZXNzYWdlQnVpbGRlckNvbnRleHQgPSBwcm90b2J1Zi5kZWZpbmVDbGFzc1VuZGVyKCJNZXNzYWdlQnVpbGRlckNvbnRleHQiLCBydW50aW1lLmdldE9iamVjdCgpLCBuZXcgT2JqZWN0QWxsb2NhdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSVJ1YnlPYmplY3QgYWxsb2NhdGUoUnVieSBydW50aW1lLCBSdWJ5Q2xhc3Mga2xhenopIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJ1YnlNZXNzYWdlQnVpbGRlckNvbnRleHQocnVudGltZSwga2xhenopOwotICAgICAgICAgICAgfQotICAgICAgICB9KTsKLSAgICAgICAgY01lc3NhZ2VCdWlsZGVyQ29udGV4dC5kZWZpbmVBbm5vdGF0ZWRNZXRob2RzKFJ1YnlNZXNzYWdlQnVpbGRlckNvbnRleHQuY2xhc3MpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdWJ5TWVzc2FnZUJ1aWxkZXJDb250ZXh0KFJ1YnkgcnVieSwgUnVieUNsYXNzIGtsYXp6KSB7Ci0gICAgICAgIHN1cGVyKHJ1YnksIGtsYXp6KTsKLSAgICB9Ci0KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5pdGlhbGl6ZShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IGRlc2NyaXB0b3IsIElSdWJ5T2JqZWN0IHJ1YnlCdWlsZGVyKSB7Ci0gICAgICAgIHRoaXMuY0ZpZWxkRGVzY3JpcHRvciA9IChSdWJ5Q2xhc3MpIGNvbnRleHQucnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IiKTsKLSAgICAgICAgdGhpcy5jRGVzY3JpcHRvciA9IChSdWJ5Q2xhc3MpIGNvbnRleHQucnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yIik7Ci0gICAgICAgIHRoaXMuY09uZW9mRGVzY3JpcHRvciA9IChSdWJ5Q2xhc3MpIGNvbnRleHQucnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3IiKTsKLSAgICAgICAgdGhpcy5jT25lb2ZCdWlsZGVyQ29udGV4dCA9IChSdWJ5Q2xhc3MpIGNvbnRleHQucnVudGltZS5nZXRDbGFzc0Zyb21QYXRoKCJHb29nbGU6OlByb3RvYnVmOjpJbnRlcm5hbDo6T25lb2ZCdWlsZGVyQ29udGV4dCIpOwotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSAoUnVieURlc2NyaXB0b3IpIGRlc2NyaXB0b3I7Ci0gICAgICAgIHRoaXMuYnVpbGRlciA9IChSdWJ5QnVpbGRlcikgcnVieUJ1aWxkZXI7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1lc3NhZ2VCdWlsZGVyQ29udGV4dC5vcHRpb25hbChuYW1lLCB0eXBlLCBudW1iZXIsIHR5cGVfY2xhc3MgPSBuaWwpCi0gICAgICoKLSAgICAgKiBEZWZpbmVzIGEgbmV3IG9wdGlvbmFsIGZpZWxkIG9uIHRoaXMgbWVzc2FnZSB0eXBlIHdpdGggdGhlIGdpdmVuIHR5cGUsIHRhZwotICAgICAqIG51bWJlciwgYW5kIHR5cGUgY2xhc3MgKGZvciBtZXNzYWdlIGFuZCBlbnVtIGZpZWxkcykuIFRoZSB0eXBlIG11c3QgYmUgYSBSdWJ5Ci0gICAgICogc3ltYm9sIChhcyBhY2NlcHRlZCBieSBGaWVsZERlc2NyaXB0b3IjdHlwZT0pIGFuZCB0aGUgdHlwZV9jbGFzcyBtdXN0IGJlIGEKLSAgICAgKiBzdHJpbmcsIGlmIHByZXNlbnQgKGFzIGFjY2VwdGVkIGJ5IEZpZWxkRGVzY3JpcHRvciNzdWJtc2dfbmFtZT0pLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZChyZXF1aXJlZCA9IDMsIG9wdGlvbmFsID0gMSkKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3Qgb3B0aW9uYWwoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgUnVieSBydW50aW1lID0gY29udGV4dC5ydW50aW1lOwotICAgICAgICBJUnVieU9iamVjdCB0eXBlQ2xhc3MgPSBydW50aW1lLmdldE5pbCgpOwotICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAzKSB0eXBlQ2xhc3MgPSBhcmdzWzNdOwotICAgICAgICBtc2dkZWZBZGRGaWVsZChjb250ZXh0LCAib3B0aW9uYWwiLCBhcmdzWzBdLCBhcmdzWzFdLCBhcmdzWzJdLCB0eXBlQ2xhc3MpOwotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE1lc3NhZ2VCdWlsZGVyQ29udGV4dC5yZXF1aXJlZChuYW1lLCB0eXBlLCBudW1iZXIsIHR5cGVfY2xhc3MgPSBuaWwpCi0gICAgICoKLSAgICAgKiBEZWZpbmVzIGEgbmV3IHJlcXVpcmVkIGZpZWxkIG9uIHRoaXMgbWVzc2FnZSB0eXBlIHdpdGggdGhlIGdpdmVuIHR5cGUsIHRhZwotICAgICAqIG51bWJlciwgYW5kIHR5cGUgY2xhc3MgKGZvciBtZXNzYWdlIGFuZCBlbnVtIGZpZWxkcykuIFRoZSB0eXBlIG11c3QgYmUgYSBSdWJ5Ci0gICAgICogc3ltYm9sIChhcyBhY2NlcHRlZCBieSBGaWVsZERlc2NyaXB0b3IjdHlwZT0pIGFuZCB0aGUgdHlwZV9jbGFzcyBtdXN0IGJlIGEKLSAgICAgKiBzdHJpbmcsIGlmIHByZXNlbnQgKGFzIGFjY2VwdGVkIGJ5IEZpZWxkRGVzY3JpcHRvciNzdWJtc2dfbmFtZT0pLgotICAgICAqCi0gICAgICogUHJvdG8zIGRvZXMgbm90IGhhdmUgcmVxdWlyZWQgZmllbGRzLCBidXQgdGhpcyBtZXRob2QgZXhpc3RzIGZvcgotICAgICAqIGNvbXBsZXRlbmVzcy4gQW55IGF0dGVtcHQgdG8gYWRkIGEgbWVzc2FnZSB0eXBlIHdpdGggcmVxdWlyZWQgZmllbGRzIHRvIGEKLSAgICAgKiBwb29sIHdpbGwgY3VycmVudGx5IHJlc3VsdCBpbiBhbiBlcnJvci4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QocmVxdWlyZWQgPSAzLCBvcHRpb25hbCA9IDEpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IHJlcXVpcmVkKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIElSdWJ5T2JqZWN0IHR5cGVDbGFzcyA9IGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMykgdHlwZUNsYXNzID0gYXJnc1szXTsKLSAgICAgICAgbXNnZGVmQWRkRmllbGQoY29udGV4dCwgInJlcXVpcmVkIiwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgdHlwZUNsYXNzKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHQucmVwZWF0ZWQobmFtZSwgdHlwZSwgbnVtYmVyLCB0eXBlX2NsYXNzID0gbmlsKQotICAgICAqCi0gICAgICogRGVmaW5lcyBhIG5ldyByZXBlYXRlZCBmaWVsZCBvbiB0aGlzIG1lc3NhZ2UgdHlwZSB3aXRoIHRoZSBnaXZlbiB0eXBlLCB0YWcKLSAgICAgKiBudW1iZXIsIGFuZCB0eXBlIGNsYXNzIChmb3IgbWVzc2FnZSBhbmQgZW51bSBmaWVsZHMpLiBUaGUgdHlwZSBtdXN0IGJlIGEgUnVieQotICAgICAqIHN5bWJvbCAoYXMgYWNjZXB0ZWQgYnkgRmllbGREZXNjcmlwdG9yI3R5cGU9KSBhbmQgdGhlIHR5cGVfY2xhc3MgbXVzdCBiZSBhCi0gICAgICogc3RyaW5nLCBpZiBwcmVzZW50IChhcyBhY2NlcHRlZCBieSBGaWVsZERlc2NyaXB0b3Ijc3VibXNnX25hbWU9KS4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QocmVxdWlyZWQgPSAzLCBvcHRpb25hbCA9IDEpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IHJlcGVhdGVkKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIElSdWJ5T2JqZWN0IHR5cGVDbGFzcyA9IGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMykgdHlwZUNsYXNzID0gYXJnc1szXTsKLSAgICAgICAgbXNnZGVmQWRkRmllbGQoY29udGV4dCwgInJlcGVhdGVkIiwgYXJnc1swXSwgYXJnc1sxXSwgYXJnc1syXSwgdHlwZUNsYXNzKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBNZXNzYWdlQnVpbGRlckNvbnRleHQubWFwKG5hbWUsIGtleV90eXBlLCB2YWx1ZV90eXBlLCBudW1iZXIsCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWVfdHlwZV9jbGFzcyA9IG5pbCkKLSAgICAgKgotICAgICAqIERlZmluZXMgYSBuZXcgbWFwIGZpZWxkIG9uIHRoaXMgbWVzc2FnZSB0eXBlIHdpdGggdGhlIGdpdmVuIGtleSBhbmQgdmFsdWUKLSAgICAgKiB0eXBlcywgdGFnIG51bWJlciwgYW5kIHR5cGUgY2xhc3MgKGZvciBtZXNzYWdlIGFuZCBlbnVtIHZhbHVlIHR5cGVzKS4gVGhlIGtleQotICAgICAqIHR5cGUgbXVzdCBiZSA6aW50MzIvOnVpbnQzMi86aW50NjQvOnVpbnQ2NCwgOmJvb2wsIG9yIDpzdHJpbmcuIFRoZSB2YWx1ZSB0eXBlCi0gICAgICogdHlwZSBtdXN0IGJlIGEgUnVieSBzeW1ib2wgKGFzIGFjY2VwdGVkIGJ5IEZpZWxkRGVzY3JpcHRvciN0eXBlPSkgYW5kIHRoZQotICAgICAqIHR5cGVfY2xhc3MgbXVzdCBiZSBhIHN0cmluZywgaWYgcHJlc2VudCAoYXMgYWNjZXB0ZWQgYnkKLSAgICAgKiBGaWVsZERlc2NyaXB0b3Ijc3VibXNnX25hbWU9KS4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QocmVxdWlyZWQgPSA0LCBvcHRpb25hbCA9IDEpCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IG1hcChUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0W10gYXJncykgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIElSdWJ5T2JqZWN0IG5hbWUgPSBhcmdzWzBdOwotICAgICAgICBJUnVieU9iamVjdCBrZXlUeXBlID0gYXJnc1sxXTsKLSAgICAgICAgSVJ1YnlPYmplY3QgdmFsdWVUeXBlID0gYXJnc1syXTsKLSAgICAgICAgSVJ1YnlPYmplY3QgbnVtYmVyID0gYXJnc1szXTsKLSAgICAgICAgSVJ1YnlPYmplY3QgdHlwZUNsYXNzID0gYXJncy5sZW5ndGggPiA0ID8gYXJnc1s0XSA6IGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLQotICAgICAgICAvLyBWYWxpZGF0ZSB0aGUga2V5IHR5cGUuIFdlIGNhbid0IGFjY2VwdCBlbnVtcywgbWVzc2FnZXMsIG9yIGZsb2F0cy9kb3VibGVzCi0gICAgICAgIC8vIGFzIG1hcCBrZXlzLiAoV2UgZXhjbHVkZSB0aGVzZSBleHBsaWNpdGx5LCBhbmQgdGhlIGZpZWxkLWRlc2NyaXB0b3Igc2V0dGVyCi0gICAgICAgIC8vIGJlbG93IHRoZW4gZW5zdXJlcyB0aGF0IHRoZSB0eXBlIGlzIG9uZSBvZiB0aGUgcmVtYWluaW5nIHZhbGlkIG9wdGlvbnMuKQotICAgICAgICBpZiAoa2V5VHlwZS5lcXVhbHMoUnVieVN5bWJvbC5uZXdTeW1ib2wocnVudGltZSwgImZsb2F0IikpIHx8Ci0gICAgICAgICAgICAgICAga2V5VHlwZS5lcXVhbHMoUnVieVN5bWJvbC5uZXdTeW1ib2wocnVudGltZSwgImRvdWJsZSIpKSB8fAotICAgICAgICAgICAgICAgIGtleVR5cGUuZXF1YWxzKFJ1YnlTeW1ib2wubmV3U3ltYm9sKHJ1bnRpbWUsICJlbnVtIikpIHx8Ci0gICAgICAgICAgICAgICAga2V5VHlwZS5lcXVhbHMoUnVieVN5bWJvbC5uZXdTeW1ib2wocnVudGltZSwgIm1lc3NhZ2UiKSkpCi0gICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld0FyZ3VtZW50RXJyb3IoIkNhbm5vdCBhZGQgYSBtYXAgZmllbGQgd2l0aCBhIGZsb2F0LCBkb3VibGUsIGVudW0sIG9yIG1lc3NhZ2UgdHlwZS4iKTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBuZXcgbWVzc2FnZSBkZXNjcmlwdG9yIGZvciB0aGUgbWFwIGVudHJ5IG1lc3NhZ2UsIGFuZCBjcmVhdGUgYQotICAgICAgICAvLyByZXBlYXRlZCBzdWJtZXNzYWdlIGZpZWxkIGhlcmUgd2l0aCB0aGF0IHR5cGUuCi0gICAgICAgIFJ1YnlEZXNjcmlwdG9yIG1hcGVudHJ5RGVzYyA9IChSdWJ5RGVzY3JpcHRvcikgY0Rlc2NyaXB0b3IubmV3SW5zdGFuY2UoY29udGV4dCwgQmxvY2suTlVMTF9CTE9DSyk7Ci0gICAgICAgIElSdWJ5T2JqZWN0IG1hcGVudHJ5RGVzY05hbWUgPSBSdWJ5U3ltYm9sLm5ld1N5bWJvbChydW50aW1lLCBuYW1lKS5pZDJuYW1lKGNvbnRleHQpOwotICAgICAgICBtYXBlbnRyeURlc2Muc2V0TmFtZShjb250ZXh0LCBtYXBlbnRyeURlc2NOYW1lKTsKLSAgICAgICAgbWFwZW50cnlEZXNjLnNldE1hcEVudHJ5KHRydWUpOwotCi0gICAgICAgIC8vb3B0aW9uYWwgPHR5cGU+IGtleSA9IDE7Ci0gICAgICAgIFJ1YnlGaWVsZERlc2NyaXB0b3Iga2V5RmllbGQgPSAoUnVieUZpZWxkRGVzY3JpcHRvcikgY0ZpZWxkRGVzY3JpcHRvci5uZXdJbnN0YW5jZShjb250ZXh0LCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAga2V5RmllbGQuc2V0TmFtZShjb250ZXh0LCBydW50aW1lLm5ld1N0cmluZygia2V5IikpOwotICAgICAgICBrZXlGaWVsZC5zZXRMYWJlbChjb250ZXh0LCBSdWJ5U3ltYm9sLm5ld1N5bWJvbChydW50aW1lLCAib3B0aW9uYWwiKSk7Ci0gICAgICAgIGtleUZpZWxkLnNldE51bWJlcihjb250ZXh0LCBydW50aW1lLm5ld0ZpeG51bSgxKSk7Ci0gICAgICAgIGtleUZpZWxkLnNldFR5cGUoY29udGV4dCwga2V5VHlwZSk7Ci0gICAgICAgIG1hcGVudHJ5RGVzYy5hZGRGaWVsZChjb250ZXh0LCBrZXlGaWVsZCk7Ci0KLSAgICAgICAgLy9vcHRpb25hbCA8dHlwZT4gdmFsdWUgPSAyOwotICAgICAgICBSdWJ5RmllbGREZXNjcmlwdG9yIHZhbHVlRmllbGQgPSAoUnVieUZpZWxkRGVzY3JpcHRvcikgY0ZpZWxkRGVzY3JpcHRvci5uZXdJbnN0YW5jZShjb250ZXh0LCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgdmFsdWVGaWVsZC5zZXROYW1lKGNvbnRleHQsIHJ1bnRpbWUubmV3U3RyaW5nKCJ2YWx1ZSIpKTsKLSAgICAgICAgdmFsdWVGaWVsZC5zZXRMYWJlbChjb250ZXh0LCBSdWJ5U3ltYm9sLm5ld1N5bWJvbChydW50aW1lLCAib3B0aW9uYWwiKSk7Ci0gICAgICAgIHZhbHVlRmllbGQuc2V0TnVtYmVyKGNvbnRleHQsIHJ1bnRpbWUubmV3Rml4bnVtKDIpKTsKLSAgICAgICAgdmFsdWVGaWVsZC5zZXRUeXBlKGNvbnRleHQsIHZhbHVlVHlwZSk7Ci0gICAgICAgIGlmICghIHR5cGVDbGFzcy5pc05pbCgpKSB2YWx1ZUZpZWxkLnNldFN1Ym1zZ05hbWUoY29udGV4dCwgdHlwZUNsYXNzKTsKLSAgICAgICAgbWFwZW50cnlEZXNjLmFkZEZpZWxkKGNvbnRleHQsIHZhbHVlRmllbGQpOwotCi0gICAgICAgIC8vIEFkZCB0aGUgbWFwLWVudHJ5IG1lc3NhZ2UgdHlwZSB0byB0aGUgY3VycmVudCBidWlsZGVyLCBhbmQgdXNlIHRoZSB0eXBlIHRvCi0gICAgICAgIC8vIGNyZWF0ZSB0aGUgbWFwIGZpZWxkIGl0c2VsZi4KLSAgICAgICAgdGhpcy5idWlsZGVyLnBlbmRpbmdMaXN0LmFkZChtYXBlbnRyeURlc2MpOwotCi0gICAgICAgIG1zZ2RlZkFkZEZpZWxkKGNvbnRleHQsICJyZXBlYXRlZCIsIG5hbWUsIHJ1bnRpbWUubmV3U3ltYm9sKCJtZXNzYWdlIiksIG51bWJlciwgbWFwZW50cnlEZXNjTmFtZSk7Ci0gICAgICAgIHJldHVybiBydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBvbmVvZihUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IG5hbWUsIEJsb2NrIGJsb2NrKSB7Ci0gICAgICAgIFJ1YnlPbmVvZkRlc2NyaXB0b3Igb25lb2ZkZWYgPSAoUnVieU9uZW9mRGVzY3JpcHRvcikKLSAgICAgICAgICAgICAgICBjT25lb2ZEZXNjcmlwdG9yLm5ld0luc3RhbmNlKGNvbnRleHQsIEJsb2NrLk5VTExfQkxPQ0spOwotICAgICAgICBSdWJ5T25lb2ZCdWlsZGVyQ29udGV4dCBjdHggPSAoUnVieU9uZW9mQnVpbGRlckNvbnRleHQpCi0gICAgICAgICAgICAgICAgY09uZW9mQnVpbGRlckNvbnRleHQubmV3SW5zdGFuY2UoY29udGV4dCwgb25lb2ZkZWYsIEJsb2NrLk5VTExfQkxPQ0spOwotICAgICAgICBvbmVvZmRlZi5zZXROYW1lKGNvbnRleHQsIG5hbWUpOwotICAgICAgICBCaW5kaW5nIGJpbmRpbmcgPSBibG9jay5nZXRCaW5kaW5nKCk7Ci0gICAgICAgIGJpbmRpbmcuc2V0U2VsZihjdHgpOwotICAgICAgICBibG9jay55aWVsZFNwZWNpZmljKGNvbnRleHQpOwotICAgICAgICBkZXNjcmlwdG9yLmFkZE9uZW9mKGNvbnRleHQsIG9uZW9mZGVmKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgbXNnZGVmQWRkRmllbGQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbGFiZWwsIElSdWJ5T2JqZWN0IG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSdWJ5T2JqZWN0IHR5cGUsIElSdWJ5T2JqZWN0IG51bWJlciwgSVJ1YnlPYmplY3QgdHlwZUNsYXNzKSB7Ci0gICAgICAgIGRlc2NyaXB0b3IuYWRkRmllbGQoY29udGV4dCwKLSAgICAgICAgICAgICAgICBVdGlscy5tc2dkZWZDcmVhdGVGaWVsZChjb250ZXh0LCBsYWJlbCwgbmFtZSwgdHlwZSwgbnVtYmVyLCB0eXBlQ2xhc3MsIGNGaWVsZERlc2NyaXB0b3IpKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJ1YnlEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBSdWJ5QnVpbGRlciBidWlsZGVyOwotICAgIHByaXZhdGUgUnVieUNsYXNzIGNGaWVsZERlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBSdWJ5Q2xhc3MgY09uZW9mRGVzY3JpcHRvcjsKLSAgICBwcml2YXRlIFJ1YnlDbGFzcyBjT25lb2ZCdWlsZGVyQ29udGV4dDsKLSAgICBwcml2YXRlIFJ1YnlDbGFzcyBjRGVzY3JpcHRvcjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlPbmVvZkJ1aWxkZXJDb250ZXh0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5T25lb2ZCdWlsZGVyQ29udGV4dC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjOWI5OWUwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlPbmVvZkJ1aWxkZXJDb250ZXh0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vKgotICogUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5OwotCi1pbXBvcnQgb3JnLmpydWJ5LlJ1Ynk7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1YnlDbGFzczsKLWltcG9ydCBvcmcuanJ1YnkuUnVieU1vZHVsZTsKLWltcG9ydCBvcmcuanJ1YnkuUnVieU9iamVjdDsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieUNsYXNzOwotaW1wb3J0IG9yZy5qcnVieS5hbm5vLkpSdWJ5TWV0aG9kOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLk9iamVjdEFsbG9jYXRvcjsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5UaHJlYWRDb250ZXh0OwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLmJ1aWx0aW4uSVJ1YnlPYmplY3Q7Ci0KLUBKUnVieUNsYXNzKG5hbWUgPSAiT25lb2ZCdWlsZGVyQ29udGV4dCIpCi1wdWJsaWMgY2xhc3MgUnVieU9uZW9mQnVpbGRlckNvbnRleHQgZXh0ZW5kcyBSdWJ5T2JqZWN0IHsKLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUnVieU9uZW9mQnVpbGRlckNvbnRleHQoUnVieSBydW50aW1lKSB7Ci0gICAgICAgIFJ1YnlNb2R1bGUgcHJvdG9idWYgPSBydW50aW1lLmdldENsYXNzRnJvbVBhdGgoIkdvb2dsZTo6UHJvdG9idWYiKTsKLSAgICAgICAgUnVieU1vZHVsZSBpbnRlcm5hbCA9IHByb3RvYnVmLmRlZmluZU1vZHVsZVVuZGVyKCJJbnRlcm5hbCIpOwotICAgICAgICBSdWJ5Q2xhc3MgY1J1YnlPbmVvZkJ1aWRsZXJDb250ZXh0ID0gaW50ZXJuYWwuZGVmaW5lQ2xhc3NVbmRlcigiT25lb2ZCdWlsZGVyQ29udGV4dCIsIHJ1bnRpbWUuZ2V0T2JqZWN0KCksIG5ldyBPYmplY3RBbGxvY2F0b3IoKSB7Ci0gICAgICAgICAgICBAT3ZlcnJpZGUKLSAgICAgICAgICAgIHB1YmxpYyBJUnVieU9iamVjdCBhbGxvY2F0ZShSdWJ5IHJ1YnksIFJ1YnlDbGFzcyBydWJ5Q2xhc3MpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gbmV3IFJ1YnlPbmVvZkJ1aWxkZXJDb250ZXh0KHJ1YnksIHJ1YnlDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjUnVieU9uZW9mQnVpZGxlckNvbnRleHQuZGVmaW5lQW5ub3RhdGVkTWV0aG9kcyhSdWJ5T25lb2ZCdWlsZGVyQ29udGV4dC5jbGFzcyk7Ci0gICAgfQotCi0gICAgcHVibGljIFJ1YnlPbmVvZkJ1aWxkZXJDb250ZXh0KFJ1YnkgcnVieSwgUnVieUNsYXNzIHJ1YnlDbGFzcykgewotICAgICAgICBzdXBlcihydWJ5LCBydWJ5Q2xhc3MpOwotICAgIH0KLQotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbml0aWFsaXplKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3Qgb25lb2ZkZWYpIHsKLSAgICAgICAgdGhpcy5kZXNjcmlwdG9yID0gKFJ1YnlPbmVvZkRlc2NyaXB0b3IpIG9uZW9mZGVmOwotICAgICAgICB0aGlzLmNGaWVsZERlc2NyaXB0b3IgPSAoUnVieUNsYXNzKSBjb250ZXh0LnJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yIik7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIEBKUnVieU1ldGhvZChyZXF1aXJlZCA9IDMsIG9wdGlvbmFsID0gMSkKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3Qgb3B0aW9uYWwoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdFtdIGFyZ3MpIHsKLSAgICAgICAgSVJ1YnlPYmplY3QgbmFtZSA9IGFyZ3NbMF07Ci0gICAgICAgIElSdWJ5T2JqZWN0IHR5cGUgPSBhcmdzWzFdOwotICAgICAgICBJUnVieU9iamVjdCBudW1iZXIgPSBhcmdzWzJdOwotICAgICAgICBJUnVieU9iamVjdCB0eXBlQ2xhc3MgPSBhcmdzLmxlbmd0aCA+IDMgPyBhcmdzWzNdIDogY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgICAgICBSdWJ5RmllbGREZXNjcmlwdG9yIGZpZWxkRGVzY3JpcHRvciA9IFV0aWxzLm1zZ2RlZkNyZWF0ZUZpZWxkKGNvbnRleHQsICJvcHRpb25hbCIsCi0gICAgICAgICAgICAgICAgbmFtZSwgdHlwZSwgbnVtYmVyLCB0eXBlQ2xhc3MsIGNGaWVsZERlc2NyaXB0b3IpOwotICAgICAgICBkZXNjcmlwdG9yLmFkZEZpZWxkKGNvbnRleHQsIGZpZWxkRGVzY3JpcHRvcik7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHByaXZhdGUgUnVieU9uZW9mRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgIHByaXZhdGUgUnVieUNsYXNzIGNGaWVsZERlc2NyaXB0b3I7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5T25lb2ZEZXNjcmlwdG9yLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5T25lb2ZEZXNjcmlwdG9yLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNjNGFiNjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieU9uZW9mRGVzY3JpcHRvci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTI0ICswLDAgQEAKLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieTsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvczsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzOwotaW1wb3J0IG9yZy5qcnVieS5SdWJ5OwotaW1wb3J0IG9yZy5qcnVieS5SdWJ5Q2xhc3M7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1YnlNb2R1bGU7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1YnlPYmplY3Q7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlDbGFzczsKLWltcG9ydCBvcmcuanJ1YnkuYW5uby5KUnVieU1ldGhvZDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5CbG9jazsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5PYmplY3RBbGxvY2F0b3I7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuVGhyZWFkQ29udGV4dDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5idWlsdGluLklSdWJ5T2JqZWN0OwotCi1pbXBvcnQgamF2YS51dGlsLio7Ci0KLUBKUnVieUNsYXNzKG5hbWUgPSAiT25lb2ZEZXNjcmlwdG9yIiwgaW5jbHVkZSA9ICJFbnVtZXJhYmxlIikKLXB1YmxpYyBjbGFzcyBSdWJ5T25lb2ZEZXNjcmlwdG9yIGV4dGVuZHMgUnVieU9iamVjdCB7Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgY3JlYXRlUnVieU9uZW9mRGVzY3JpcHRvcihSdWJ5IHJ1bnRpbWUpIHsKLSAgICAgICAgUnVieU1vZHVsZSBwcm90b2J1ZiA9IHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1ZiIpOwotICAgICAgICBSdWJ5Q2xhc3MgY1J1YnlPbmVvZkRlc2NyaXB0b3IgPSBwcm90b2J1Zi5kZWZpbmVDbGFzc1VuZGVyKCJPbmVvZkRlc2NyaXB0b3IiLCBydW50aW1lLmdldE9iamVjdCgpLCBuZXcgT2JqZWN0QWxsb2NhdG9yKCkgewotICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICBwdWJsaWMgSVJ1YnlPYmplY3QgYWxsb2NhdGUoUnVieSBydWJ5LCBSdWJ5Q2xhc3MgcnVieUNsYXNzKSB7Ci0gICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdWJ5T25lb2ZEZXNjcmlwdG9yKHJ1YnksIHJ1YnlDbGFzcyk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0pOwotICAgICAgICBjUnVieU9uZW9mRGVzY3JpcHRvci5kZWZpbmVBbm5vdGF0ZWRNZXRob2RzKFJ1YnlPbmVvZkRlc2NyaXB0b3IuY2xhc3MpOwotICAgICAgICBjUnVieU9uZW9mRGVzY3JpcHRvci5pbmNsdWRlTW9kdWxlKHJ1bnRpbWUuZ2V0RW51bWVyYWJsZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgUnVieU9uZW9mRGVzY3JpcHRvcihSdWJ5IHJ1YnksIFJ1YnlDbGFzcyBydWJ5Q2xhc3MpIHsKLSAgICAgICAgc3VwZXIocnVieSwgcnVieUNsYXNzKTsKLSAgICB9Ci0KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaW5pdGlhbGl6ZShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgYnVpbGRlciA9IERlc2NyaXB0b3JQcm90b3MuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpOwotICAgICAgICBmaWVsZHMgPSBuZXcgQXJyYXlMaXN0PFJ1YnlGaWVsZERlc2NyaXB0b3I+KCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIE9uZW9mRGVzY3JpcHRvci5uYW1lID0+IG5hbWUKLSAgICAgKgotICAgICAqIFJldHVybnMgdGhlIG5hbWUgb2YgdGhpcyBvbmVvZi4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJuYW1lIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZ2V0TmFtZShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgcmV0dXJuIG5hbWU7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgT25lb2ZEZXNjcmlwdG9yLm5hbWUgPSBuYW1lCi0gICAgICoKLSAgICAgKiBTZXRzIGEgbmV3IG5hbWUgZm9yIHRoaXMgb25lb2YuIFRoZSBvbmVvZiBtdXN0IG5vdCBoYXZlIGJlZW4gYWRkZWQgdG8gYQotICAgICAqIG1lc3NhZ2UgZGVzY3JpcHRvciB5ZXQuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAibmFtZT0iKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBzZXROYW1lKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgbmFtZSkgewotICAgICAgICB0aGlzLm5hbWUgPSBjb250ZXh0LnJ1bnRpbWUubmV3U3RyaW5nKG5hbWUuYXNKYXZhU3RyaW5nKCkpOwotICAgICAgICB0aGlzLmJ1aWxkZXIuc2V0TmFtZShuYW1lLmFzSmF2YVN0cmluZygpKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBPbmVvZkRlc2NyaXB0b3IuYWRkX2ZpZWxkKGZpZWxkKSA9PiBuaWwKLSAgICAgKgotICAgICAqIEFkZHMgYSBmaWVsZCB0byB0aGlzIG9uZW9mLiBUaGUgZmllbGQgbWF5IGhhdmUgYmVlbiBhZGRlZCB0byB0aGlzIG9uZW9mIGluCi0gICAgICogdGhlIHBhc3QsIG9yIHRoZSBtZXNzYWdlIHRvIHdoaWNoIHRoaXMgb25lb2YgYmVsb25ncyAoaWYgYW55KSwgYnV0IG1heSBub3QKLSAgICAgKiBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0byBhbnkgb3RoZXIgb25lb2Ygb3IgbWVzc2FnZS4gT3RoZXJ3aXNlLCBhbgotICAgICAqIGV4Y2VwdGlvbiBpcyByYWlzZWQuCi0gICAgICoKLSAgICAgKiBBbGwgZmllbGRzIGFkZGVkIHRvIHRoZSBvbmVvZiB2aWEgdGhpcyBtZXRob2Qgd2lsbCBiZSBhdXRvbWF0aWNhbGx5IGFkZGVkIHRvCi0gICAgICogdGhlIG1lc3NhZ2UgdG8gd2hpY2ggdGhpcyBvbmVvZiBiZWxvbmdzLCBpZiBpdCBiZWxvbmdzIHRvIG9uZSBjdXJyZW50bHksIG9yCi0gICAgICogZWxzZSB3aWxsIGJlIGFkZGVkIHRvIGFueSBtZXNzYWdlIHRvIHdoaWNoIHRoZSBvbmVvZiBpcyBsYXRlciBhZGRlZCBhdCB0aGUKLSAgICAgKiB0aW1lIHRoYXQgaXQgaXMgYWRkZWQuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAiYWRkX2ZpZWxkIikKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgYWRkRmllbGQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBvYmopIHsKLSAgICAgICAgUnVieUZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgPSAoUnVieUZpZWxkRGVzY3JpcHRvcikgb2JqOwotICAgICAgICBmaWVsZERlc2NyaXB0b3Iuc2V0T25lb2ZOYW1lKHRoaXMubmFtZSk7Ci0gICAgICAgIGZpZWxkcy5hZGQoZmllbGREZXNjcmlwdG9yKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBPbmVvZkRlc2NyaXB0b3IuZWFjaCgmYmxvY2spID0+IG5pbAotICAgICAqCi0gICAgICogSXRlcmF0ZXMgdGhyb3VnaCBmaWVsZHMgaW4gdGhpcyBvbmVvZiwgeWllbGRpbmcgdG8gdGhlIGJsb2NrIG9uIGVhY2ggb25lLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBlYWNoKFRocmVhZENvbnRleHQgY29udGV4dCwgQmxvY2sgYmxvY2spIHsKLSAgICAgICAgZm9yIChSdWJ5RmllbGREZXNjcmlwdG9yIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICAgICAgICBibG9jay55aWVsZFNwZWNpZmljKGNvbnRleHQsIGZpZWxkKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBEZXNjcmlwdG9yUHJvdG9zLk9uZW9mRGVzY3JpcHRvclByb3RvIGJ1aWxkKGludCBpbmRleCkgewotICAgICAgICBmb3IgKFJ1YnlGaWVsZERlc2NyaXB0b3IgZmllbGQ6IGZpZWxkcykgewotICAgICAgICAgICAgZmllbGQuc2V0T25lb2ZJbmRleChpbmRleCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXMuYnVpbGRlci5idWlsZCgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBDb2xsZWN0aW9uPFJ1YnlGaWVsZERlc2NyaXB0b3I+IGdldEZpZWxkcygpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkczsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRGVzY3JpcHRvcnMuT25lb2ZEZXNjcmlwdG9yIGdldE9uZW9mRGVzY3JpcHRvcigpIHsKLSAgICAgICAgUnVieUZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IgPSBmaWVsZHMuZ2V0KDApOwotICAgICAgICByZXR1cm4gZmllbGREZXNjcmlwdG9yLmdldEZpZWxkRGVmKCkuZ2V0Q29udGFpbmluZ09uZW9mKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUnVieU9iamVjdCBuYW1lOwotICAgIHByaXZhdGUgRGVzY3JpcHRvclByb3Rvcy5PbmVvZkRlc2NyaXB0b3JQcm90by5CdWlsZGVyIGJ1aWxkZXI7Ci0gICAgcHJpdmF0ZSBMaXN0PFJ1YnlGaWVsZERlc2NyaXB0b3I+IGZpZWxkczsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL2pydWJ5L1J1YnlQcm90b2J1Zi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieVByb3RvYnVmLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJjZjIxMGQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieVByb3RvYnVmLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OCArMCwwIEBACi0vKgotICogUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5OwotCi1pbXBvcnQgb3JnLmpydWJ5LlJ1Ynk7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1YnlNb2R1bGU7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlNb2R1bGU7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuVGhyZWFkQ29udGV4dDsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5idWlsdGluLklSdWJ5T2JqZWN0OwotCi1ASlJ1YnlNb2R1bGUobmFtZSA9ICJQcm90b2J1ZiIpCi1wdWJsaWMgY2xhc3MgUnVieVByb3RvYnVmIHsKLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjcmVhdGVQcm90b2J1ZihSdWJ5IHJ1bnRpbWUpIHsKLSAgICAgICAgUnVieU1vZHVsZSBtR29vZ2xlID0gcnVudGltZS5nZXRNb2R1bGUoIkdvb2dsZSIpOwotICAgICAgICBSdWJ5TW9kdWxlIG1Qcm90b2J1ZiA9IG1Hb29nbGUuZGVmaW5lTW9kdWxlVW5kZXIoIlByb3RvYnVmIik7Ci0gICAgICAgIG1Qcm90b2J1Zi5kZWZpbmVBbm5vdGF0ZWRNZXRob2RzKFJ1YnlQcm90b2J1Zi5jbGFzcyk7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgR29vZ2xlOjpQcm90b2J1Zi5kZWVwX2NvcHkob2JqKSA9PiBjb3B5X29mX29iagotICAgICAqCi0gICAgICogUGVyZm9ybXMgYSBkZWVwIGNvcHkgb2YgZWl0aGVyIGEgUmVwZWF0ZWRGaWVsZCBpbnN0YW5jZSBvciBhIG1lc3NhZ2Ugb2JqZWN0LAotICAgICAqIHJlY3Vyc2l2ZWx5IGNvcHlpbmcgaXRzIG1lbWJlcnMuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAiZGVlcF9jb3B5IiwgbWV0YSA9IHRydWUpCi0gICAgcHVibGljIHN0YXRpYyBJUnVieU9iamVjdCBkZWVwQ29weShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IHNlbGYsIElSdWJ5T2JqZWN0IG1lc3NhZ2UpIHsKLSAgICAgICAgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBSdWJ5TWVzc2FnZSkgewotICAgICAgICAgICAgcmV0dXJuICgoUnVieU1lc3NhZ2UpIG1lc3NhZ2UpLmRlZXBDb3B5KGNvbnRleHQpOwotICAgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2UgaW5zdGFuY2VvZiBSdWJ5UmVwZWF0ZWRGaWVsZCkgewotICAgICAgICAgICAgcmV0dXJuICgoUnVieVJlcGVhdGVkRmllbGQpIG1lc3NhZ2UpLmRlZXBDb3B5KGNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuICgoUnVieU1hcCkgbWVzc2FnZSkuZGVlcENvcHkoY29udGV4dCk7Ci0gICAgICAgIH0KLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5UmVwZWF0ZWRGaWVsZC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvUnVieVJlcGVhdGVkRmllbGQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTQ2ZjllNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9SdWJ5UmVwZWF0ZWRGaWVsZC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDA5ICswLDAgQEAKLS8qCi0gKiBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYuanJ1Ynk7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzOwotaW1wb3J0IG9yZy5qcnVieS4qOwotaW1wb3J0IG9yZy5qcnVieS5hbm5vLkpSdWJ5Q2xhc3M7Ci1pbXBvcnQgb3JnLmpydWJ5LmFubm8uSlJ1YnlNZXRob2Q7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuQmxvY2s7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuT2JqZWN0QWxsb2NhdG9yOwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLlRocmVhZENvbnRleHQ7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUuYnVpbHRpbi5JUnVieU9iamVjdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi1ASlJ1YnlDbGFzcyhuYW1lID0gIlJlcGVhdGVkQ2xhc3MiLCBpbmNsdWRlID0gIkVudW1lcmFibGUiKQotcHVibGljIGNsYXNzIFJ1YnlSZXBlYXRlZEZpZWxkIGV4dGVuZHMgUnVieU9iamVjdCB7Ci0gICAgcHVibGljIHN0YXRpYyB2b2lkIGNyZWF0ZVJ1YnlSZXBlYXRlZEZpZWxkKFJ1YnkgcnVudGltZSkgewotICAgICAgICBSdWJ5TW9kdWxlIG1Qcm90b2J1ZiA9IHJ1bnRpbWUuZ2V0Q2xhc3NGcm9tUGF0aCgiR29vZ2xlOjpQcm90b2J1ZiIpOwotICAgICAgICBSdWJ5Q2xhc3MgY1JlcGVhdGVkRmllbGQgPSBtUHJvdG9idWYuZGVmaW5lQ2xhc3NVbmRlcigiUmVwZWF0ZWRGaWVsZCIsIHJ1bnRpbWUuZ2V0T2JqZWN0KCksCi0gICAgICAgICAgICAgICAgbmV3IE9iamVjdEFsbG9jYXRvcigpIHsKLSAgICAgICAgICAgICAgICAgICAgQE92ZXJyaWRlCi0gICAgICAgICAgICAgICAgICAgIHB1YmxpYyBJUnVieU9iamVjdCBhbGxvY2F0ZShSdWJ5IHJ1bnRpbWUsIFJ1YnlDbGFzcyBrbGF6eikgewotICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIG5ldyBSdWJ5UmVwZWF0ZWRGaWVsZChydW50aW1lLCBrbGF6eik7Ci0gICAgICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICB9KTsKLSAgICAgICAgY1JlcGVhdGVkRmllbGQuZGVmaW5lQW5ub3RhdGVkTWV0aG9kcyhSdWJ5UmVwZWF0ZWRGaWVsZC5jbGFzcyk7Ci0gICAgICAgIGNSZXBlYXRlZEZpZWxkLmluY2x1ZGVNb2R1bGUocnVudGltZS5nZXRFbnVtZXJhYmxlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBSdWJ5UmVwZWF0ZWRGaWVsZChSdWJ5IHJ1bnRpbWUsIFJ1YnlDbGFzcyBrbGF6eikgewotICAgICAgICBzdXBlcihydW50aW1lLCBrbGF6eik7Ci0gICAgfQotCi0gICAgcHVibGljIFJ1YnlSZXBlYXRlZEZpZWxkKFJ1YnkgcnVudGltZSwgUnVieUNsYXNzIGtsYXp6LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZSBmaWVsZFR5cGUsIElSdWJ5T2JqZWN0IHR5cGVDbGFzcykgewotICAgICAgICB0aGlzKHJ1bnRpbWUsIGtsYXp6KTsKLSAgICAgICAgdGhpcy5maWVsZFR5cGUgPSBmaWVsZFR5cGU7Ci0gICAgICAgIHRoaXMuc3RvcmFnZSA9IHJ1bnRpbWUubmV3QXJyYXkoKTsKLSAgICAgICAgdGhpcy50eXBlQ2xhc3MgPSB0eXBlQ2xhc3M7Ci0gICAgfQotCi0gICAgQEpSdWJ5TWV0aG9kKHJlcXVpcmVkID0gMSwgb3B0aW9uYWwgPSAyKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbml0aWFsaXplKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIFJ1YnkgcnVudGltZSA9IGNvbnRleHQucnVudGltZTsKLSAgICAgICAgdGhpcy5zdG9yYWdlID0gcnVudGltZS5uZXdBcnJheSgpOwotICAgICAgICBJUnVieU9iamVjdCBhcnkgPSBudWxsOwotICAgICAgICBpZiAoIShhcmdzWzBdIGluc3RhbmNlb2YgUnVieVN5bWJvbCkpIHsKLSAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3QXJndW1lbnRFcnJvcigiRXhwZWN0ZWQgU3ltYm9sIGZvciB0eXBlIG5hbWUiKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLmZpZWxkVHlwZSA9IFV0aWxzLnJ1YnlUb0ZpZWxkVHlwZShhcmdzWzBdKTsKLSAgICAgICAgaWYgKGZpZWxkVHlwZSA9PSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZS5NRVNTQUdFCi0gICAgICAgICAgICAgICAgfHwgZmllbGRUeXBlID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLkVOVU0pIHsKLSAgICAgICAgICAgIGlmIChhcmdzLmxlbmd0aCA8IDIpCi0gICAgICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdBcmd1bWVudEVycm9yKCJFeHBlY3RlZCBhdCBsZWFzdCAyIGFyZ3VtZW50cyBmb3IgbWVzc2FnZS9lbnVtIik7Ci0gICAgICAgICAgICB0eXBlQ2xhc3MgPSBhcmdzWzFdOwotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikKLSAgICAgICAgICAgICAgICBhcnkgPSBhcmdzWzJdOwotICAgICAgICAgICAgVXRpbHMudmFsaWRhdGVUeXBlQ2xhc3MoY29udGV4dCwgZmllbGRUeXBlLCB0eXBlQ2xhc3MpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGFyZ3MubGVuZ3RoID4gMikKLSAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld0FyZ3VtZW50RXJyb3IoIlRvbyBtYW55IGFyZ3VtZW50czogZXhwZWN0ZWQgMSBvciAyIik7Ci0gICAgICAgICAgICBpZiAoYXJncy5sZW5ndGggPiAxKQotICAgICAgICAgICAgICAgIGFyeSA9IGFyZ3NbMV07Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGFyeSAhPSBudWxsKSB7Ci0gICAgICAgICAgICBSdWJ5QXJyYXkgYXJyID0gYXJ5LmNvbnZlcnRUb0FycmF5KCk7Ci0gICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGFyci5zaXplKCk7IGkrKykgewotICAgICAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5hZGQoYXJyLmVsdEludGVybmFsKGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBSZXBlYXRlZEZpZWxkLltdPShpbmRleCwgdmFsdWUpCi0gICAgICoKLSAgICAgKiBTZXRzIHRoZSBlbGVtZW50IGF0IHRoZSBnaXZlbiBpbmRleC4gT24gb3V0LW9mLWJvdW5kcyBhc3NpZ25tZW50cywgZXh0ZW5kcwotICAgICAqIHRoZSBhcnJheSBhbmQgZmlsbHMgdGhlIGhvbGUgKGlmIGFueSkgd2l0aCBkZWZhdWx0IHZhbHVlcy4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9ICJbXT0iKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBpbmRleFNldChUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IGluZGV4LCBJUnVieU9iamVjdCB2YWx1ZSkgewotICAgICAgICBpbnQgYXJySW5kZXggPSBub3JtYWxpemVBcnJheUluZGV4KGluZGV4KTsKLSAgICAgICAgVXRpbHMuY2hlY2tUeXBlKGNvbnRleHQsIGZpZWxkVHlwZSwgdmFsdWUsIChSdWJ5TW9kdWxlKSB0eXBlQ2xhc3MpOwotICAgICAgICBJUnVieU9iamVjdCBkZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWUoY29udGV4dCk7Ci0gICAgICAgIGZvciAoaW50IGkgPSB0aGlzLnN0b3JhZ2Uuc2l6ZSgpOyBpIDwgYXJySW5kZXg7IGkrKykgewotICAgICAgICAgICAgdGhpcy5zdG9yYWdlLnNldChpLCBkZWZhdWx0VmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMuc3RvcmFnZS5zZXQoYXJySW5kZXgsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBSZXBlYXRlZEZpZWxkLltdKGluZGV4KSA9PiB2YWx1ZQotICAgICAqCi0gICAgICogQWNjZXNzZXMgdGhlIGVsZW1lbnQgYXQgdGhlIGdpdmVuIGluZGV4LiBSZXR1cm5zIG5pbCBvbiBvdXQtb2YtYm91bmRzCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKHJlcXVpcmVkPTEsIG9wdGlvbmFsPTEsIG5hbWUgPSB7ImF0IiwgIltdIn0pCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGluZGV4KFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3RbXSBhcmdzKSB7Ci0gICAgICAgIGlmIChhcmdzLmxlbmd0aCA9PSAxKXsKLSAgICAgICAgICAgIElSdWJ5T2JqZWN0IGFyZyA9IGFyZ3NbMF07Ci0gICAgICAgICAgICBpZiAoVXRpbHMuaXNSdWJ5TnVtKGFyZykpIHsKLSAgICAgICAgICAgICAgICAvKiBzdGFuZGFyZCBjYXNlICovCi0gICAgICAgICAgICAgICAgaW50IGFyckluZGV4ID0gbm9ybWFsaXplQXJyYXlJbmRleChhcmcpOwotICAgICAgICAgICAgICAgIGlmIChhcnJJbmRleCA8IDAgfHwgYXJySW5kZXggPj0gdGhpcy5zdG9yYWdlLnNpemUoKSkgewotICAgICAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLmVsdEludGVybmFsKGFyckluZGV4KTsKLSAgICAgICAgICAgIH0gZWxzZSBpZiAoYXJnIGluc3RhbmNlb2YgUnVieVJhbmdlKSB7Ci0gICAgICAgICAgICAgICAgUnVieVJhbmdlIHJhbmdlID0gKChSdWJ5UmFuZ2UpIGFyZyk7Ci0gICAgICAgICAgICAgICAgaW50IGJlZyA9IFJ1YnlOdW1lcmljLm51bTJpbnQocmFuZ2UuZmlyc3QoY29udGV4dCkpOwotICAgICAgICAgICAgICAgIGludCB0byA9IFJ1YnlOdW1lcmljLm51bTJpbnQocmFuZ2UubGFzdChjb250ZXh0KSk7Ci0gICAgICAgICAgICAgICAgaW50IGxlbiA9IHRvIC0gYmVnICsgMTsKLSAgICAgICAgICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnN1YnNlcShiZWcsIGxlbik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgLyogYXNzdW1lIDIgYXJndW1lbnRzICovCi0gICAgICAgIGludCBiZWcgPSBSdWJ5TnVtZXJpYy5udW0yaW50KGFyZ3NbMF0pOwotICAgICAgICBpbnQgbGVuID0gUnVieU51bWVyaWMubnVtMmludChhcmdzWzFdKTsKLSAgICAgICAgaWYgKGJlZyA8IDApIHsKLSAgICAgICAgICAgIGJlZyArPSB0aGlzLnN0b3JhZ2Uuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChiZWcgPj0gdGhpcy5zdG9yYWdlLnNpemUoKSkgewotICAgICAgICAgICAgcmV0dXJuIGNvbnRleHQucnVudGltZS5nZXROaWwoKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlLnN1YnNlcShiZWcsIGxlbik7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgUmVwZWF0ZWRGaWVsZC5wdXNoKHZhbHVlKQotICAgICAqCi0gICAgICogQWRkcyBhIG5ldyBlbGVtZW50IHRvIHRoZSByZXBlYXRlZCBmaWVsZC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9IHsicHVzaCIsICI8PCJ9KQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBwdXNoKFRocmVhZENvbnRleHQgY29udGV4dCwgSVJ1YnlPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKCEoZmllbGRUeXBlID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgICAgIHZhbHVlID09IGNvbnRleHQucnVudGltZS5nZXROaWwoKSkpIHsKLSAgICAgICAgICAgIFV0aWxzLmNoZWNrVHlwZShjb250ZXh0LCBmaWVsZFR5cGUsIHZhbHVlLCAoUnVieU1vZHVsZSkgdHlwZUNsYXNzKTsKLSAgICAgICAgfQotICAgICAgICB0aGlzLnN0b3JhZ2UuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIHByaXZhdGUgUnVieSBtZXRob2QgdXNlZCBieSBSZXBlYXRlZEZpZWxkLnBvcAotICAgICAqLwotICAgIEBKUnVieU1ldGhvZCh2aXNpYmlsaXR5ID0gb3JnLmpydWJ5LnJ1bnRpbWUuVmlzaWJpbGl0eS5QUklWQVRFKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBwb3Bfb25lKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBJUnVieU9iamVjdCByZXQgPSB0aGlzLnN0b3JhZ2UubGFzdCgpOwotICAgICAgICB0aGlzLnN0b3JhZ2UucmVtb3ZlKHJldCk7Ci0gICAgICAgIHJldHVybiByZXQ7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgUmVwZWF0ZWRGaWVsZC5yZXBsYWNlKGxpc3QpCi0gICAgICoKLSAgICAgKiBSZXBsYWNlcyB0aGUgY29udGVudHMgb2YgdGhlIHJlcGVhdGVkIGZpZWxkIHdpdGggdGhlIGdpdmVuIGxpc3Qgb2YgZWxlbWVudHMuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IHJlcGxhY2UoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBJUnVieU9iamVjdCBsaXN0KSB7Ci0gICAgICAgIFJ1YnlBcnJheSBhcnIgPSAoUnVieUFycmF5KSBsaXN0OwotICAgICAgICBjaGVja0FycmF5RWxlbWVudFR5cGUoY29udGV4dCwgYXJyKTsKLSAgICAgICAgdGhpcy5zdG9yYWdlID0gYXJyOwotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIFJlcGVhdGVkRmllbGQuY2xlYXIKLSAgICAgKgotICAgICAqIENsZWFycyAocmVtb3ZlcyBhbGwgZWxlbWVudHMgZnJvbSkgdGhpcyByZXBlYXRlZCBmaWVsZC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgY2xlYXIoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHRoaXMuc3RvcmFnZS5jbGVhcigpOwotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIFJlcGVhdGVkRmllbGQubGVuZ3RoCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIHRoZSBsZW5ndGggb2YgdGhpcyByZXBlYXRlZCBmaWVsZC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QobmFtZSA9IHsibGVuZ3RoIiwgInNpemUifSkKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgbGVuZ3RoKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLm5ld0ZpeG51bSh0aGlzLnN0b3JhZ2Uuc2l6ZSgpKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBSZXBlYXRlZEZpZWxkLisob3RoZXIpID0+IHJlcGVhdGVkIGZpZWxkCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGEgbmV3IHJlcGVhdGVkIGZpZWxkIHRoYXQgY29udGFpbnMgdGhlIGNvbmNhdGVuYXRlZCBsaXN0IG9mIHRoaXMKLSAgICAgKiByZXBlYXRlZCBmaWVsZCdzIGVsZW1lbnRzIGFuZCBvdGhlcidzIGVsZW1lbnRzLiBUaGUgb3RoZXIgKHNlY29uZCkgbGlzdCBtYXkKLSAgICAgKiBiZSBlaXRoZXIgYW5vdGhlciByZXBlYXRlZCBmaWVsZCBvciBhIFJ1YnkgYXJyYXkuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSB7IisifSkKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgcGx1cyhUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IGxpc3QpIHsKLSAgICAgICAgUnVieVJlcGVhdGVkRmllbGQgZHVwID0gKFJ1YnlSZXBlYXRlZEZpZWxkKSBkdXAoY29udGV4dCk7Ci0gICAgICAgIGlmIChsaXN0IGluc3RhbmNlb2YgUnVieUFycmF5KSB7Ci0gICAgICAgICAgICBjaGVja0FycmF5RWxlbWVudFR5cGUoY29udGV4dCwgKFJ1YnlBcnJheSkgbGlzdCk7Ci0gICAgICAgICAgICBkdXAuc3RvcmFnZS5hZGRBbGwoKFJ1YnlBcnJheSkgbGlzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSdWJ5UmVwZWF0ZWRGaWVsZCByZXBlYXRlZEZpZWxkID0gKFJ1YnlSZXBlYXRlZEZpZWxkKSBsaXN0OwotICAgICAgICAgICAgaWYgKCEgZmllbGRUeXBlLmVxdWFscyhyZXBlYXRlZEZpZWxkLmZpZWxkVHlwZSkgfHwgKHR5cGVDbGFzcyAhPSBudWxsICYmICEKLSAgICAgICAgICAgICAgICAgICAgdHlwZUNsYXNzLmVxdWFscyhyZXBlYXRlZEZpZWxkLnR5cGVDbGFzcykpKQotICAgICAgICAgICAgICAgIHRocm93IGNvbnRleHQucnVudGltZS5uZXdBcmd1bWVudEVycm9yKCJBdHRlbXB0IHRvIGFwcGVuZCBSZXBlYXRlZEZpZWxkIHdpdGggZGlmZmVyZW50IGVsZW1lbnQgdHlwZS4iKTsKLSAgICAgICAgICAgIGR1cC5zdG9yYWdlLmFkZEFsbCgoUnVieUFycmF5KSByZXBlYXRlZEZpZWxkLnRvQXJyYXkoY29udGV4dCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBkdXA7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgUmVwZWF0ZWRGaWVsZC5jb25jYXQob3RoZXIpID0+IHNlbGYKLSAgICAgKgotICAgICAqIGNvbmNhdHMgdGhlIHBhc3NlZCBpbiBhcnJheSB0byBzZWxmLiAgUmV0dXJucyBhIFJ1YnkgYXJyYXkuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IGNvbmNhdChUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IGxpc3QpIHsKLSAgICAgICAgaWYgKGxpc3QgaW5zdGFuY2VvZiBSdWJ5QXJyYXkpIHsKLSAgICAgICAgICAgIGNoZWNrQXJyYXlFbGVtZW50VHlwZShjb250ZXh0LCAoUnVieUFycmF5KSBsaXN0KTsKLSAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5hZGRBbGwoKFJ1YnlBcnJheSkgbGlzdCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSdWJ5UmVwZWF0ZWRGaWVsZCByZXBlYXRlZEZpZWxkID0gKFJ1YnlSZXBlYXRlZEZpZWxkKSBsaXN0OwotICAgICAgICAgICAgaWYgKCEgZmllbGRUeXBlLmVxdWFscyhyZXBlYXRlZEZpZWxkLmZpZWxkVHlwZSkgfHwgKHR5cGVDbGFzcyAhPSBudWxsICYmICEKLSAgICAgICAgICAgICAgICAgICAgdHlwZUNsYXNzLmVxdWFscyhyZXBlYXRlZEZpZWxkLnR5cGVDbGFzcykpKQotICAgICAgICAgICAgICAgIHRocm93IGNvbnRleHQucnVudGltZS5uZXdBcmd1bWVudEVycm9yKCJBdHRlbXB0IHRvIGFwcGVuZCBSZXBlYXRlZEZpZWxkIHdpdGggZGlmZmVyZW50IGVsZW1lbnQgdHlwZS4iKTsKLSAgICAgICAgICAgIHRoaXMuc3RvcmFnZS5hZGRBbGwoKFJ1YnlBcnJheSkgcmVwZWF0ZWRGaWVsZC50b0FycmF5KGNvbnRleHQpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIFJlcGVhdGVkRmllbGQuaGFzaCA9PiBoYXNoX3ZhbHVlCi0gICAgICoKLSAgICAgKiBSZXR1cm5zIGEgaGFzaCB2YWx1ZSBjb21wdXRlZCBmcm9tIHRoaXMgcmVwZWF0ZWQgZmllbGQncyBlbGVtZW50cy4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgaGFzaChUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgaW50IGhhc2hDb2RlID0gdGhpcy5zdG9yYWdlLmhhc2hDb2RlKCk7Ci0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUubmV3Rml4bnVtKGhhc2hDb2RlKTsKLSAgICB9Ci0KLSAgICAvKgotICAgICAqIGNhbGwtc2VxOgotICAgICAqICAgICBSZXBlYXRlZEZpZWxkLj09KG90aGVyKSA9PiBib29sZWFuCi0gICAgICoKLSAgICAgKiBDb21wYXJlcyB0aGlzIHJlcGVhdGVkIGZpZWxkIHRvIGFub3RoZXIuIFJlcGVhdGVkIGZpZWxkcyBhcmUgZXF1YWwgaWYgdGhlaXIKLSAgICAgKiBlbGVtZW50IHR5cGVzIGFyZSBlcXVhbCwgdGhlaXIgbGVuZ3RocyBhcmUgZXF1YWwsIGFuZCBlYWNoIGVsZW1lbnQgaXMgZXF1YWwuCi0gICAgICogRWxlbWVudHMgYXJlIGNvbXBhcmVkIGFzIHBlciBub3JtYWwgUnVieSBzZW1hbnRpY3MsIGJ5IGNhbGxpbmcgdGhlaXIgOj09Ci0gICAgICogbWV0aG9kcyAob3IgcGVyZm9ybWluZyBhIG1vcmUgZWZmaWNpZW50IGNvbXBhcmlzb24gZm9yIHByaW1pdGl2ZSB0eXBlcykuCi0gICAgICovCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSAiPT0iKQotICAgIHB1YmxpYyBJUnVieU9iamVjdCBlcShUaHJlYWRDb250ZXh0IGNvbnRleHQsIElSdWJ5T2JqZWN0IG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnRvQXJyYXkoY29udGV4dCkub3BfZXF1YWwoY29udGV4dCwgb3RoZXIpOwotICAgIH0KLQotICAgIC8qCi0gICAgICogY2FsbC1zZXE6Ci0gICAgICogICAgIFJlcGVhdGVkRmllbGQuZWFjaCgmYmxvY2spCi0gICAgICoKLSAgICAgKiBJbnZva2VzIHRoZSBibG9jayBvbmNlIGZvciBlYWNoIGVsZW1lbnQgb2YgdGhlIHJlcGVhdGVkIGZpZWxkLiBSZXBlYXRlZEZpZWxkCi0gICAgICogYWxzbyBpbmNsdWRlcyBFbnVtZXJhYmxlOyBjb21iaW5lZCB3aXRoIHRoaXMgbWV0aG9kLCB0aGUgcmVwZWF0ZWQgZmllbGQgdGh1cwotICAgICAqIGFjdHMgbGlrZSBhbiBvcmRpbmFyeSBSdWJ5IHNlcXVlbmNlLgotICAgICAqLwotICAgIEBKUnVieU1ldGhvZAotICAgIHB1YmxpYyBJUnVieU9iamVjdCBlYWNoKFRocmVhZENvbnRleHQgY29udGV4dCwgQmxvY2sgYmxvY2spIHsKLSAgICAgICAgdGhpcy5zdG9yYWdlLmVhY2goY29udGV4dCwgYmxvY2spOwotICAgICAgICByZXR1cm4gdGhpcy5zdG9yYWdlOwotICAgIH0KLQotCi0gICAgQEpSdWJ5TWV0aG9kKG5hbWUgPSB7InRvX2FyeSIsICJ0b19hIn0pCi0gICAgcHVibGljIElSdWJ5T2JqZWN0IHRvQXJyYXkoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2U7Ci0gICAgfQotCi0gICAgLyoKLSAgICAgKiBjYWxsLXNlcToKLSAgICAgKiAgICAgUmVwZWF0ZWRGaWVsZC5kdXAgPT4gcmVwZWF0ZWRfZmllbGQKLSAgICAgKgotICAgICAqIER1cGxpY2F0ZXMgdGhpcyByZXBlYXRlZCBmaWVsZCB3aXRoIGEgc2hhbGxvdyBjb3B5LiBSZWZlcmVuY2VzIHRvIGFsbAotICAgICAqIG5vbi1wcmltaXRpdmUgZWxlbWVudCBvYmplY3RzIChlLmcuLCBzdWJtZXNzYWdlcykgYXJlIHNoYXJlZC4KLSAgICAgKi8KLSAgICBASlJ1YnlNZXRob2QKLSAgICBwdWJsaWMgSVJ1YnlPYmplY3QgZHVwKFRocmVhZENvbnRleHQgY29udGV4dCkgewotICAgICAgICBSdWJ5UmVwZWF0ZWRGaWVsZCBkdXAgPSBuZXcgUnVieVJlcGVhdGVkRmllbGQoY29udGV4dC5ydW50aW1lLCBtZXRhQ2xhc3MsIGZpZWxkVHlwZSwgdHlwZUNsYXNzKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLnN0b3JhZ2Uuc2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICAgIGR1cC5wdXNoKGNvbnRleHQsIHRoaXMuc3RvcmFnZS5lbHRJbnRlcm5hbChpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGR1cDsKLSAgICB9Ci0KLSAgICAvLyBKYXZhIEFQSQotICAgIHByb3RlY3RlZCBJUnVieU9iamVjdCBnZXQoaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiB0aGlzLnN0b3JhZ2UuZWx0SW50ZXJuYWwoaW5kZXgpOwotICAgIH0KLQotICAgIHByb3RlY3RlZCBSdWJ5UmVwZWF0ZWRGaWVsZCBkZWVwQ29weShUaHJlYWRDb250ZXh0IGNvbnRleHQpIHsKLSAgICAgICAgUnVieVJlcGVhdGVkRmllbGQgY29weSA9IG5ldyBSdWJ5UmVwZWF0ZWRGaWVsZChjb250ZXh0LnJ1bnRpbWUsIG1ldGFDbGFzcywgZmllbGRUeXBlLCB0eXBlQ2xhc3MpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBJUnVieU9iamVjdCB2YWx1ZSA9IHN0b3JhZ2UuZWx0SW50ZXJuYWwoaSk7Ci0gICAgICAgICAgICBpZiAoZmllbGRUeXBlID09IERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgICAgICBjb3B5LnN0b3JhZ2UuYWRkKCgoUnVieU1lc3NhZ2UpIHZhbHVlKS5kZWVwQ29weShjb250ZXh0KSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGNvcHkuc3RvcmFnZS5hZGQodmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBjb3B5OwotICAgIH0KLQotICAgIHByb3RlY3RlZCBpbnQgc2l6ZSgpIHsKLSAgICAgICAgcmV0dXJuIHRoaXMuc3RvcmFnZS5zaXplKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBJUnVieU9iamVjdCBkZWZhdWx0VmFsdWUoVGhyZWFkQ29udGV4dCBjb250ZXh0KSB7Ci0gICAgICAgIFNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbCBzZW50aW5lbCA9IFNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbC5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICAgICAgT2JqZWN0IHZhbHVlOwotICAgICAgICBzd2l0Y2ggKGZpZWxkVHlwZSkgewotICAgICAgICAgICAgY2FzZSBJTlQzMjoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbnRpbmVsLmdldERlZmF1bHRJbnQzMigpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBJTlQ2NDoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbnRpbmVsLmdldERlZmF1bHRJbnQ2NCgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzZW50aW5lbC5nZXREZWZhdWx0VW5pdDMyKCk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgICAgICAgICB2YWx1ZSA9IHNlbnRpbmVsLmdldERlZmF1bHRVaW50NjQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRkxPQVQ6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzZW50aW5lbC5nZXREZWZhdWx0RmxvYXQoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRE9VQkxFOgotICAgICAgICAgICAgICAgIHZhbHVlID0gc2VudGluZWwuZ2V0RGVmYXVsdERvdWJsZSgpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCT09MOgotICAgICAgICAgICAgICAgIHZhbHVlID0gc2VudGluZWwuZ2V0RGVmYXVsdEJvb2woKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQllURVM6Ci0gICAgICAgICAgICAgICAgdmFsdWUgPSBzZW50aW5lbC5nZXREZWZhdWx0Qnl0ZXMoKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgICAgICAgIHZhbHVlID0gc2VudGluZWwuZ2V0RGVmYXVsdFN0cmluZygpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBFTlVNOgotICAgICAgICAgICAgICAgIElSdWJ5T2JqZWN0IGRlZmF1bHRFbnVtTG9jID0gY29udGV4dC5ydW50aW1lLm5ld0ZpeG51bSgwKTsKLSAgICAgICAgICAgICAgICByZXR1cm4gUnVieUVudW0ubG9va3VwKGNvbnRleHQsIHR5cGVDbGFzcywgZGVmYXVsdEVudW1Mb2MpOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICByZXR1cm4gY29udGV4dC5ydW50aW1lLmdldE5pbCgpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBVdGlscy53cmFwUHJpbWFyeVZhbHVlKGNvbnRleHQsIGZpZWxkVHlwZSwgdmFsdWUpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjaGVja0FycmF5RWxlbWVudFR5cGUoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBSdWJ5QXJyYXkgYXJyKSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJyLmdldExlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICAgIFV0aWxzLmNoZWNrVHlwZShjb250ZXh0LCBmaWVsZFR5cGUsIGFyci5lbHRJbnRlcm5hbChpKSwgKFJ1YnlNb2R1bGUpIHR5cGVDbGFzcyk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGludCBub3JtYWxpemVBcnJheUluZGV4KElSdWJ5T2JqZWN0IGluZGV4KSB7Ci0gICAgICAgIGludCBhcnJJbmRleCA9IFJ1YnlOdW1lcmljLm51bTJpbnQoaW5kZXgpOwotICAgICAgICBpbnQgYXJyU2l6ZSA9IHRoaXMuc3RvcmFnZS5zaXplKCk7Ci0gICAgICAgIGlmIChhcnJJbmRleCA8IDAgJiYgYXJyU2l6ZSA+IDApIHsKLSAgICAgICAgICAgIGFyckluZGV4ID0gYXJyU2l6ZSArIGFyckluZGV4OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBhcnJJbmRleDsKLSAgICB9Ci0KLSAgICBwcml2YXRlIFJ1YnlBcnJheSBzdG9yYWdlOwotICAgIHByaXZhdGUgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUgZmllbGRUeXBlOwotICAgIHByaXZhdGUgSVJ1YnlPYmplY3QgdHlwZUNsYXNzOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvU2VudGluZWxPdXRlckNsYXNzLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9TZW50aW5lbE91dGVyQ2xhc3MuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRmMmM3Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9TZW50aW5lbE91dGVyQ2xhc3MuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDc3NiArMCwwIEBACi0vKgotICogUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogc2VudGluZWwucHJvdG8KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5OwotCi1wdWJsaWMgZmluYWwgY2xhc3MgU2VudGluZWxPdXRlckNsYXNzIHsKLSAgcHJpdmF0ZSBTZW50aW5lbE91dGVyQ2xhc3MoKSB7fQotICBwdWJsaWMgc3RhdGljIHZvaWQgcmVnaXN0ZXJBbGxFeHRlbnNpb25zKAotICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgewotICB9Ci0gIHB1YmxpYyBpbnRlcmZhY2UgU2VudGluZWxPckJ1aWxkZXIgZXh0ZW5kcwotICAgICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGludGVyZmFjZV9leHRlbmRzOmNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWwpCi0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPckJ1aWxkZXIgewotCi0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgaW50MzIgZGVmYXVsdF9pbnQzMiA9IDE7PC9jb2RlPgotICAgICAqLwotICAgIGludCBnZXREZWZhdWx0SW50MzIoKTsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPm9wdGlvbmFsIGludDY0IGRlZmF1bHRfaW50NjQgPSAyOzwvY29kZT4KLSAgICAgKi8KLSAgICBsb25nIGdldERlZmF1bHRJbnQ2NCgpOwotCi0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgdWludDMyIGRlZmF1bHRfdW5pdDMyID0gMzs8L2NvZGU+Ci0gICAgICovCi0gICAgaW50IGdldERlZmF1bHRVbml0MzIoKTsKLQotICAgIC8qKgotICAgICAqIDxjb2RlPm9wdGlvbmFsIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NCA9IDQ7PC9jb2RlPgotICAgICAqLwotICAgIGxvbmcgZ2V0RGVmYXVsdFVpbnQ2NCgpOwotCi0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nID0gNTs8L2NvZGU+Ci0gICAgICovCi0gICAgamF2YS5sYW5nLlN0cmluZyBnZXREZWZhdWx0U3RyaW5nKCk7Ci0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nID0gNTs8L2NvZGU+Ci0gICAgICovCi0gICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nCi0gICAgICAgIGdldERlZmF1bHRTdHJpbmdCeXRlcygpOwotCi0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgYm9vbCBkZWZhdWx0X2Jvb2wgPSA2OzwvY29kZT4KLSAgICAgKi8KLSAgICBib29sZWFuIGdldERlZmF1bHRCb29sKCk7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5vcHRpb25hbCBmbG9hdCBkZWZhdWx0X2Zsb2F0ID0gNzs8L2NvZGU+Ci0gICAgICovCi0gICAgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KCk7Ci0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5vcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGUgPSA4OzwvY29kZT4KLSAgICAgKi8KLSAgICBkb3VibGUgZ2V0RGVmYXVsdERvdWJsZSgpOwotCi0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgYnl0ZXMgZGVmYXVsdF9ieXRlcyA9IDk7PC9jb2RlPgotICAgICAqLwotICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBnZXREZWZhdWx0Qnl0ZXMoKTsKLSAgfQotICAvKioKLSAgICogUHJvdG9idWYgdHlwZSB7QGNvZGUgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbH0KLSAgICovCi0gIHB1YmxpYyAgc3RhdGljIGZpbmFsIGNsYXNzIFNlbnRpbmVsIGV4dGVuZHMKLSAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSBpbXBsZW1lbnRzCi0gICAgICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9pbXBsZW1lbnRzOmNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWwpCi0gICAgICBTZW50aW5lbE9yQnVpbGRlciB7Ci0gICAgLy8gVXNlIFNlbnRpbmVsLm5ld0J1aWxkZXIoKSB0byBjb25zdHJ1Y3QuCi0gICAgcHJpdmF0ZSBTZW50aW5lbChjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICBzdXBlcihidWlsZGVyKTsKLSAgICB9Ci0gICAgcHJpdmF0ZSBTZW50aW5lbCgpIHsKLSAgICAgIGRlZmF1bHRJbnQzMl8gPSAwOwotICAgICAgZGVmYXVsdEludDY0XyA9IDBMOwotICAgICAgZGVmYXVsdFVuaXQzMl8gPSAwOwotICAgICAgZGVmYXVsdFVpbnQ2NF8gPSAwTDsKLSAgICAgIGRlZmF1bHRTdHJpbmdfID0gIiI7Ci0gICAgICBkZWZhdWx0Qm9vbF8gPSBmYWxzZTsKLSAgICAgIGRlZmF1bHRGbG9hdF8gPSAwRjsKLSAgICAgIGRlZmF1bHREb3VibGVfID0gMEQ7Ci0gICAgICBkZWZhdWx0Qnl0ZXNfID0gY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLkVNUFRZOwotICAgIH0KLQotICAgIEBqYXZhLmxhbmcuT3ZlcnJpZGUKLSAgICBwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXQKLSAgICBnZXRVbmtub3duRmllbGRzKCkgewotICAgICAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcgotICAgICAgICBnZXREZXNjcmlwdG9yKCkgewotICAgICAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLmludGVybmFsX3N0YXRpY19jb21fZ29vZ2xlX3Byb3RvYnVmX2pydWJ5X1NlbnRpbmVsX2Rlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5GaWVsZEFjY2Vzc29yVGFibGUKLSAgICAgICAgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKSB7Ci0gICAgICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuaW50ZXJuYWxfc3RhdGljX2NvbV9nb29nbGVfcHJvdG9idWZfanJ1YnlfU2VudGluZWxfZmllbGRBY2Nlc3NvclRhYmxlCi0gICAgICAgICAgLmVuc3VyZUZpZWxkQWNjZXNzb3JzSW5pdGlhbGl6ZWQoCi0gICAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsLmNsYXNzLCBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5LlNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbC5CdWlsZGVyLmNsYXNzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuUGFyc2VyPFNlbnRpbmVsPiBQQVJTRVIgPQotICAgICAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdFBhcnNlcjxTZW50aW5lbD4oKSB7Ci0gICAgICBwdWJsaWMgU2VudGluZWwgcGFyc2VQYXJ0aWFsRnJvbSgKLSAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgICAgQnVpbGRlciBidWlsZGVyID0gbmV3QnVpbGRlcigpOwotICAgICAgICB0cnkgewotICAgICAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICAgIH0gY2F0Y2ggKGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBlLnNldFVuZmluaXNoZWRNZXNzYWdlKGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgICB9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAgICAgICAgIGUuZ2V0TWVzc2FnZSgpKS5zZXRVbmZpbmlzaGVkTWVzc2FnZShidWlsZGVyLmJ1aWxkUGFydGlhbCgpKTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgQGphdmEubGFuZy5PdmVycmlkZQotICAgIHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjxTZW50aW5lbD4gZ2V0UGFyc2VyRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBQQVJTRVI7Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTlQzMl9GSUVMRF9OVU1CRVIgPSAxOwotICAgIHByaXZhdGUgaW50IGRlZmF1bHRJbnQzMl87Ci0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgaW50MzIgZGVmYXVsdF9pbnQzMiA9IDE7PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludDMyKCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRJbnQzMl87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9JTlQ2NF9GSUVMRF9OVU1CRVIgPSAyOwotICAgIHByaXZhdGUgbG9uZyBkZWZhdWx0SW50NjRfOwotICAgIC8qKgotICAgICAqIDxjb2RlPm9wdGlvbmFsIGludDY0IGRlZmF1bHRfaW50NjQgPSAyOzwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXREZWZhdWx0SW50NjQoKSB7Ci0gICAgICByZXR1cm4gZGVmYXVsdEludDY0XzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1VOSVQzMl9GSUVMRF9OVU1CRVIgPSAzOwotICAgIHByaXZhdGUgaW50IGRlZmF1bHRVbml0MzJfOwotICAgIC8qKgotICAgICAqIDxjb2RlPm9wdGlvbmFsIHVpbnQzMiBkZWZhdWx0X3VuaXQzMiA9IDM7PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdFVuaXQzMigpIHsKLSAgICAgIHJldHVybiBkZWZhdWx0VW5pdDMyXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1VJTlQ2NF9GSUVMRF9OVU1CRVIgPSA0OwotICAgIHByaXZhdGUgbG9uZyBkZWZhdWx0VWludDY0XzsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5vcHRpb25hbCB1aW50NjQgZGVmYXVsdF91aW50NjQgPSA0OzwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgbG9uZyBnZXREZWZhdWx0VWludDY0KCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRVaW50NjRfOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IERFRkFVTFRfU1RSSU5HX0ZJRUxEX05VTUJFUiA9IDU7Ci0gICAgcHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0IGRlZmF1bHRTdHJpbmdfOwotICAgIC8qKgotICAgICAqIDxjb2RlPm9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZyA9IDU7PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoKSB7Ci0gICAgICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9IGRlZmF1bHRTdHJpbmdfOwotICAgICAgaWYgKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpIHsKLSAgICAgICAgcmV0dXJuIChqYXZhLmxhbmcuU3RyaW5nKSByZWY7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPSAKLSAgICAgICAgICAgIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjsKLSAgICAgICAgamF2YS5sYW5nLlN0cmluZyBzID0gYnMudG9TdHJpbmdVdGY4KCk7Ci0gICAgICAgIGlmIChicy5pc1ZhbGlkVXRmOCgpKSB7Ci0gICAgICAgICAgZGVmYXVsdFN0cmluZ18gPSBzOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBzOwotICAgICAgfQotICAgIH0KLSAgICAvKioKLSAgICAgKiA8Y29kZT5vcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmcgPSA1OzwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nCi0gICAgICAgIGdldERlZmF1bHRTdHJpbmdCeXRlcygpIHsKLSAgICAgIGphdmEubGFuZy5PYmplY3QgcmVmID0gZGVmYXVsdFN0cmluZ187Ci0gICAgICBpZiAocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykgewotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYiA9IAotICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgKLSAgICAgICAgICAgICAgICAoamF2YS5sYW5nLlN0cmluZykgcmVmKTsKLSAgICAgICAgZGVmYXVsdFN0cmluZ18gPSBiOwotICAgICAgICByZXR1cm4gYjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSByZWY7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CT09MX0ZJRUxEX05VTUJFUiA9IDY7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGRlZmF1bHRCb29sXzsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5vcHRpb25hbCBib29sIGRlZmF1bHRfYm9vbCA9IDY7PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIGdldERlZmF1bHRCb29sKCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRCb29sXzsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX0ZMT0FUX0ZJRUxEX05VTUJFUiA9IDc7Ci0gICAgcHJpdmF0ZSBmbG9hdCBkZWZhdWx0RmxvYXRfOwotICAgIC8qKgotICAgICAqIDxjb2RlPm9wdGlvbmFsIGZsb2F0IGRlZmF1bHRfZmxvYXQgPSA3OzwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmxvYXQgZ2V0RGVmYXVsdEZsb2F0KCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRGbG9hdF87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9ET1VCTEVfRklFTERfTlVNQkVSID0gODsKLSAgICBwcml2YXRlIGRvdWJsZSBkZWZhdWx0RG91YmxlXzsKLSAgICAvKioKLSAgICAgKiA8Y29kZT5vcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGUgPSA4OzwvY29kZT4KLSAgICAgKi8KLSAgICBwdWJsaWMgZG91YmxlIGdldERlZmF1bHREb3VibGUoKSB7Ci0gICAgICByZXR1cm4gZGVmYXVsdERvdWJsZV87Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CWVRFU19GSUVMRF9OVU1CRVIgPSA5OwotICAgIHByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGRlZmF1bHRCeXRlc187Ci0gICAgLyoqCi0gICAgICogPGNvZGU+b3B0aW9uYWwgYnl0ZXMgZGVmYXVsdF9ieXRlcyA9IDk7PC9jb2RlPgotICAgICAqLwotICAgIHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgZ2V0RGVmYXVsdEJ5dGVzKCkgewotICAgICAgcmV0dXJuIGRlZmF1bHRCeXRlc187Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5LlNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbCBwYXJzZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgcGFyc2VGcm9tKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgZGF0YSwKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKQotICAgICAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgcGFyc2VGcm9tKAotICAgICAgICBieXRlW10gZGF0YSwKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgcGFyc2VGcm9tKGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGlucHV0KTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5LlNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbCBwYXJzZUZyb20oCi0gICAgICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsIHBhcnNlRGVsaW1pdGVkRnJvbShqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0KQotICAgICAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gUEFSU0VSLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCk7Ci0gICAgfQotICAgIHB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgcGFyc2VEZWxpbWl0ZWRGcm9tKAotICAgICAgICBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIFBBUlNFUi5wYXJzZURlbGltaXRlZEZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICB9Ci0gICAgcHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5LlNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbCBwYXJzZUZyb20oCi0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oaW5wdXQpOwotICAgIH0KLSAgICBwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsIHBhcnNlRnJvbSgKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigpIHsgcmV0dXJuIG5ldyBCdWlsZGVyKCk7IH0KLSAgICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpIHsgcmV0dXJuIG5ld0J1aWxkZXIoKTsgfQotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsIHByb3RvdHlwZSkgewotICAgICAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20ocHJvdG90eXBlKTsKLSAgICB9Ci0gICAgcHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgeyByZXR1cm4gbmV3QnVpbGRlcih0aGlzKTsgfQotCi0gICAgQGphdmEubGFuZy5PdmVycmlkZQotICAgIHByb3RlY3RlZCBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKAotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQpIHsKLSAgICAgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKHBhcmVudCk7Ci0gICAgICByZXR1cm4gYnVpbGRlcjsKLSAgICB9Ci0gICAgLyoqCi0gICAgICogUHJvdG9idWYgdHlwZSB7QGNvZGUgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbH0KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kcwotICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlcjxCdWlsZGVyPiBpbXBsZW1lbnRzCi0gICAgICAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChidWlsZGVyX2ltcGxlbWVudHM6Y29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbCkKLSAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWxPckJ1aWxkZXIgewotICAgICAgcHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3IKLSAgICAgICAgICBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuaW50ZXJuYWxfc3RhdGljX2NvbV9nb29nbGVfcHJvdG9idWZfanJ1YnlfU2VudGluZWxfZGVzY3JpcHRvcjsKLSAgICAgIH0KLQotICAgICAgcHJvdGVjdGVkIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5GaWVsZEFjY2Vzc29yVGFibGUKLSAgICAgICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLmludGVybmFsX3N0YXRpY19jb21fZ29vZ2xlX3Byb3RvYnVmX2pydWJ5X1NlbnRpbmVsX2ZpZWxkQWNjZXNzb3JUYWJsZQotICAgICAgICAgICAgLmVuc3VyZUZpZWxkQWNjZXNzb3JzSW5pdGlhbGl6ZWQoCi0gICAgICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwuY2xhc3MsIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsLkJ1aWxkZXIuY2xhc3MpOwotICAgICAgfQotCi0gICAgICAvLyBDb25zdHJ1Y3QgdXNpbmcgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwubmV3QnVpbGRlcigpCi0gICAgICBwcml2YXRlIEJ1aWxkZXIoKSB7Ci0gICAgICAgIG1heWJlRm9yY2VCdWlsZGVySW5pdGlhbGl6YXRpb24oKTsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBCdWlsZGVyKAotICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCkgewotICAgICAgICBzdXBlcihwYXJlbnQpOwotICAgICAgICBtYXliZUZvcmNlQnVpbGRlckluaXRpYWxpemF0aW9uKCk7Ci0gICAgICB9Ci0gICAgICBwcml2YXRlIHZvaWQgbWF5YmVGb3JjZUJ1aWxkZXJJbml0aWFsaXphdGlvbigpIHsKLSAgICAgICAgaWYgKGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5hbHdheXNVc2VGaWVsZEJ1aWxkZXJzKSB7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyKCkgewotICAgICAgICBzdXBlci5jbGVhcigpOwotICAgICAgICBkZWZhdWx0SW50MzJfID0gMDsKLQotICAgICAgICBkZWZhdWx0SW50NjRfID0gMEw7Ci0KLSAgICAgICAgZGVmYXVsdFVuaXQzMl8gPSAwOwotCi0gICAgICAgIGRlZmF1bHRVaW50NjRfID0gMEw7Ci0KLSAgICAgICAgZGVmYXVsdFN0cmluZ18gPSAiIjsKLQotICAgICAgICBkZWZhdWx0Qm9vbF8gPSBmYWxzZTsKLQotICAgICAgICBkZWZhdWx0RmxvYXRfID0gMEY7Ci0KLSAgICAgICAgZGVmYXVsdERvdWJsZV8gPSAwRDsKLQotICAgICAgICBkZWZhdWx0Qnl0ZXNfID0gY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLkVNUFRZOwotCi0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yCi0gICAgICAgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5LlNlbnRpbmVsT3V0ZXJDbGFzcy5pbnRlcm5hbF9zdGF0aWNfY29tX2dvb2dsZV9wcm90b2J1Zl9qcnVieV9TZW50aW5lbF9kZXNjcmlwdG9yOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICAgICAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsLmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgYnVpbGQoKSB7Ci0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsIHJlc3VsdCA9IGJ1aWxkUGFydGlhbCgpOwotICAgICAgICBpZiAoIXJlc3VsdC5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgICB0aHJvdyBuZXdVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbihyZXN1bHQpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5LlNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbCBidWlsZFBhcnRpYWwoKSB7Ci0gICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsIHJlc3VsdCA9IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5LlNlbnRpbmVsT3V0ZXJDbGFzcy5TZW50aW5lbCh0aGlzKTsKLSAgICAgICAgcmVzdWx0LmRlZmF1bHRJbnQzMl8gPSBkZWZhdWx0SW50MzJfOwotICAgICAgICByZXN1bHQuZGVmYXVsdEludDY0XyA9IGRlZmF1bHRJbnQ2NF87Ci0gICAgICAgIHJlc3VsdC5kZWZhdWx0VW5pdDMyXyA9IGRlZmF1bHRVbml0MzJfOwotICAgICAgICByZXN1bHQuZGVmYXVsdFVpbnQ2NF8gPSBkZWZhdWx0VWludDY0XzsKLSAgICAgICAgcmVzdWx0LmRlZmF1bHRTdHJpbmdfID0gZGVmYXVsdFN0cmluZ187Ci0gICAgICAgIHJlc3VsdC5kZWZhdWx0Qm9vbF8gPSBkZWZhdWx0Qm9vbF87Ci0gICAgICAgIHJlc3VsdC5kZWZhdWx0RmxvYXRfID0gZGVmYXVsdEZsb2F0XzsKLSAgICAgICAgcmVzdWx0LmRlZmF1bHREb3VibGVfID0gZGVmYXVsdERvdWJsZV87Ci0gICAgICAgIHJlc3VsdC5kZWZhdWx0Qnl0ZXNfID0gZGVmYXVsdEJ5dGVzXzsKLSAgICAgICAgb25CdWlsdCgpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0KLSAgICAgIHByaXZhdGUgaW50IGRlZmF1bHRJbnQzMl8gOwotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBpbnQzMiBkZWZhdWx0X2ludDMyID0gMTs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBpbnQgZ2V0RGVmYXVsdEludDMyKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdEludDMyXzsKLSAgICAgIH0KLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgaW50MzIgZGVmYXVsdF9pbnQzMiA9IDE7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBzZXREZWZhdWx0SW50MzIoaW50IHZhbHVlKSB7Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0SW50MzJfID0gdmFsdWU7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgaW50MzIgZGVmYXVsdF9pbnQzMiA9IDE7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBjbGVhckRlZmF1bHRJbnQzMigpIHsKLSAgICAgICAgCi0gICAgICAgIGRlZmF1bHRJbnQzMl8gPSAwOwotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgbG9uZyBkZWZhdWx0SW50NjRfIDsKLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgaW50NjQgZGVmYXVsdF9pbnQ2NCA9IDI7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgbG9uZyBnZXREZWZhdWx0SW50NjQoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0SW50NjRfOwotICAgICAgfQotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBpbnQ2NCBkZWZhdWx0X2ludDY0ID0gMjs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlZmF1bHRJbnQ2NChsb25nIHZhbHVlKSB7Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0SW50NjRfID0gdmFsdWU7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgaW50NjQgZGVmYXVsdF9pbnQ2NCA9IDI7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBjbGVhckRlZmF1bHRJbnQ2NCgpIHsKLSAgICAgICAgCi0gICAgICAgIGRlZmF1bHRJbnQ2NF8gPSAwTDsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGludCBkZWZhdWx0VW5pdDMyXyA7Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIHVpbnQzMiBkZWZhdWx0X3VuaXQzMiA9IDM7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgaW50IGdldERlZmF1bHRVbml0MzIoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VW5pdDMyXzsKLSAgICAgIH0KLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgdWludDMyIGRlZmF1bHRfdW5pdDMyID0gMzs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlZmF1bHRVbml0MzIoaW50IHZhbHVlKSB7Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0VW5pdDMyXyA9IHZhbHVlOwotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIHVpbnQzMiBkZWZhdWx0X3VuaXQzMiA9IDM7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBjbGVhckRlZmF1bHRVbml0MzIoKSB7Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0VW5pdDMyXyA9IDA7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBsb25nIGRlZmF1bHRVaW50NjRfIDsKLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgdWludDY0IGRlZmF1bHRfdWludDY0ID0gNDs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBsb25nIGdldERlZmF1bHRVaW50NjQoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0VWludDY0XzsKLSAgICAgIH0KLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgdWludDY0IGRlZmF1bHRfdWludDY0ID0gNDs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlZmF1bHRVaW50NjQobG9uZyB2YWx1ZSkgewotICAgICAgICAKLSAgICAgICAgZGVmYXVsdFVpbnQ2NF8gPSB2YWx1ZTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCB1aW50NjQgZGVmYXVsdF91aW50NjQgPSA0OzwvY29kZT4KLSAgICAgICAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXJEZWZhdWx0VWludDY0KCkgewotICAgICAgICAKLSAgICAgICAgZGVmYXVsdFVpbnQ2NF8gPSAwTDsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGphdmEubGFuZy5PYmplY3QgZGVmYXVsdFN0cmluZ18gPSAiIjsKLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nID0gNTs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldERlZmF1bHRTdHJpbmcoKSB7Ci0gICAgICAgIGphdmEubGFuZy5PYmplY3QgcmVmID0gZGVmYXVsdFN0cmluZ187Ci0gICAgICAgIGlmICghKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpKSB7Ci0gICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGJzID0KLSAgICAgICAgICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmOwotICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpOwotICAgICAgICAgIGlmIChicy5pc1ZhbGlkVXRmOCgpKSB7Ci0gICAgICAgICAgICBkZWZhdWx0U3RyaW5nXyA9IHM7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAoamF2YS5sYW5nLlN0cmluZykgcmVmOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZyA9IDU7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nCi0gICAgICAgICAgZ2V0RGVmYXVsdFN0cmluZ0J5dGVzKCkgewotICAgICAgICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9IGRlZmF1bHRTdHJpbmdfOwotICAgICAgICBpZiAocmVmIGluc3RhbmNlb2YgU3RyaW5nKSB7Ci0gICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGIgPSAKLSAgICAgICAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgKLSAgICAgICAgICAgICAgICAgIChqYXZhLmxhbmcuU3RyaW5nKSByZWYpOwotICAgICAgICAgIGRlZmF1bHRTdHJpbmdfID0gYjsKLSAgICAgICAgICByZXR1cm4gYjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZyA9IDU7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBzZXREZWZhdWx0U3RyaW5nKAotICAgICAgICAgIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgfQotICAKLSAgICAgICAgZGVmYXVsdFN0cmluZ18gPSB2YWx1ZTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmcgPSA1OzwvY29kZT4KLSAgICAgICAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXJEZWZhdWx0U3RyaW5nKCkgewotICAgICAgICAKLSAgICAgICAgZGVmYXVsdFN0cmluZ18gPSBnZXREZWZhdWx0SW5zdGFuY2UoKS5nZXREZWZhdWx0U3RyaW5nKCk7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nID0gNTs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlZmF1bHRTdHJpbmdCeXRlcygKLSAgICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgfQotICAKLSAgICAgICAgZGVmYXVsdFN0cmluZ18gPSB2YWx1ZTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGJvb2xlYW4gZGVmYXVsdEJvb2xfIDsKLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgYm9vbCBkZWZhdWx0X2Jvb2wgPSA2OzwvY29kZT4KLSAgICAgICAqLwotICAgICAgcHVibGljIGJvb2xlYW4gZ2V0RGVmYXVsdEJvb2woKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0Qm9vbF87Ci0gICAgICB9Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIGJvb2wgZGVmYXVsdF9ib29sID0gNjs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlZmF1bHRCb29sKGJvb2xlYW4gdmFsdWUpIHsKLSAgICAgICAgCi0gICAgICAgIGRlZmF1bHRCb29sXyA9IHZhbHVlOwotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIGJvb2wgZGVmYXVsdF9ib29sID0gNjs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyRGVmYXVsdEJvb2woKSB7Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0Qm9vbF8gPSBmYWxzZTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGZsb2F0IGRlZmF1bHRGbG9hdF8gOwotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBmbG9hdCBkZWZhdWx0X2Zsb2F0ID0gNzs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBmbG9hdCBnZXREZWZhdWx0RmxvYXQoKSB7Ci0gICAgICAgIHJldHVybiBkZWZhdWx0RmxvYXRfOwotICAgICAgfQotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBmbG9hdCBkZWZhdWx0X2Zsb2F0ID0gNzs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldERlZmF1bHRGbG9hdChmbG9hdCB2YWx1ZSkgewotICAgICAgICAKLSAgICAgICAgZGVmYXVsdEZsb2F0XyA9IHZhbHVlOwotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIGZsb2F0IGRlZmF1bHRfZmxvYXQgPSA3OzwvY29kZT4KLSAgICAgICAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXJEZWZhdWx0RmxvYXQoKSB7Ci0gICAgICAgIAotICAgICAgICBkZWZhdWx0RmxvYXRfID0gMEY7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBkb3VibGUgZGVmYXVsdERvdWJsZV8gOwotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGUgPSA4OzwvY29kZT4KLSAgICAgICAqLwotICAgICAgcHVibGljIGRvdWJsZSBnZXREZWZhdWx0RG91YmxlKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdERvdWJsZV87Ci0gICAgICB9Ci0gICAgICAvKioKLSAgICAgICAqIDxjb2RlPm9wdGlvbmFsIGRvdWJsZSBkZWZhdWx0X2RvdWJsZSA9IDg7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBzZXREZWZhdWx0RG91YmxlKGRvdWJsZSB2YWx1ZSkgewotICAgICAgICAKLSAgICAgICAgZGVmYXVsdERvdWJsZV8gPSB2YWx1ZTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBkb3VibGUgZGVmYXVsdF9kb3VibGUgPSA4OzwvY29kZT4KLSAgICAgICAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXJEZWZhdWx0RG91YmxlKCkgewotICAgICAgICAKLSAgICAgICAgZGVmYXVsdERvdWJsZV8gPSAwRDsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkZWZhdWx0Qnl0ZXNfID0gY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLkVNUFRZOwotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBieXRlcyBkZWZhdWx0X2J5dGVzID0gOTs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgZ2V0RGVmYXVsdEJ5dGVzKCkgewotICAgICAgICByZXR1cm4gZGVmYXVsdEJ5dGVzXzsKLSAgICAgIH0KLSAgICAgIC8qKgotICAgICAgICogPGNvZGU+b3B0aW9uYWwgYnl0ZXMgZGVmYXVsdF9ieXRlcyA9IDk7PC9jb2RlPgotICAgICAgICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBzZXREZWZhdWx0Qnl0ZXMoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gIH0KLSAgCi0gICAgICAgIGRlZmF1bHRCeXRlc18gPSB2YWx1ZTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgLyoqCi0gICAgICAgKiA8Y29kZT5vcHRpb25hbCBieXRlcyBkZWZhdWx0X2J5dGVzID0gOTs8L2NvZGU+Ci0gICAgICAgKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyRGVmYXVsdEJ5dGVzKCkgewotICAgICAgICAKLSAgICAgICAgZGVmYXVsdEJ5dGVzXyA9IGdldERlZmF1bHRJbnN0YW5jZSgpLmdldERlZmF1bHRCeXRlcygpOwotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgZmluYWwgQnVpbGRlciBzZXRVbmtub3duRmllbGRzKAotICAgICAgICAgIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIHB1YmxpYyBmaW5hbCBCdWlsZGVyIG1lcmdlVW5rbm93bkZpZWxkcygKLSAgICAgICAgICBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLlVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0KLSAgICAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChidWlsZGVyX3Njb3BlOmNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWwpCi0gICAgfQotCi0gICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWwpCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwgZGVmYXVsdEluc3RhbmNlO3N0YXRpYyB7Ci0gICAgICBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5qcnVieS5TZW50aW5lbE91dGVyQ2xhc3MuU2VudGluZWwoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsIGdldERlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICAgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7Ci0gICAgfQotCi0gICAgcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuanJ1YnkuU2VudGluZWxPdXRlckNsYXNzLlNlbnRpbmVsIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7Ci0gICAgICByZXR1cm4gZGVmYXVsdEluc3RhbmNlOwotICAgIH0KLQotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yCi0gICAgaW50ZXJuYWxfc3RhdGljX2NvbV9nb29nbGVfcHJvdG9idWZfanJ1YnlfU2VudGluZWxfZGVzY3JpcHRvcjsKLSAgcHJpdmF0ZSBzdGF0aWMKLSAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlCi0gICAgICBpbnRlcm5hbF9zdGF0aWNfY29tX2dvb2dsZV9wcm90b2J1Zl9qcnVieV9TZW50aW5lbF9maWVsZEFjY2Vzc29yVGFibGU7Ci0KLSAgcHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yCi0gICAgICBnZXREZXNjcmlwdG9yKCkgewotICAgIHJldHVybiBkZXNjcmlwdG9yOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IKLSAgICAgIGRlc2NyaXB0b3I7Ci0gIHN0YXRpYyB7Ci0gICAgamF2YS5sYW5nLlN0cmluZ1tdIGRlc2NyaXB0b3JEYXRhID0gewotICAgICAgIlxuXDAxNnNlbnRpbmVsLnByb3RvXDAyMlwwMzFjb20uZ29vZ2xlLnByb3RvYnVmLmpyIiArCi0gICAgICAidWJ5XCJcMzM0XDAwMVxuXDAxMFNlbnRpbmVsXDAyMlwwMjVcblxyZGVmYXVsdF9pbnQzMlwwMzBcMDAxIFwwMDEoXDAwNVwwMjIiICsKLSAgICAgICJcMDI1XG5ccmRlZmF1bHRfaW50NjRcMDMwXDAwMiBcMDAxKFwwMDNcMDIyXDAyNlxuXDAxNmRlZmF1bHRfdW5pdDMyIiArCi0gICAgICAiXDAzMFwwMDMgXDAwMShcclwwMjJcMDI2XG5cMDE2ZGVmYXVsdF91aW50NjRcMDMwXDAwNCBcMDAxKFwwMDRcMDIyXDAyNlxuXDAxNmRlZmF1bCIgKwotICAgICAgInRfc3RyaW5nXDAzMFwwMDUgXDAwMShcdFwwMjJcMDI0XG5cMDE0ZGVmYXVsdF9ib29sXDAzMFwwMDYgXDAwMShcMDEwXDAyMlwwMjVcblxyIiArCi0gICAgICAiZGVmYXVsdF9mbG9hdFwwMzBcMDA3IFwwMDEoXDAwMlwwMjJcMDI2XG5cMDE2ZGVmYXVsdF9kb3VibGVcMDMwXDAxMCAiICsKLSAgICAgICJcMDAxKFwwMDFcMDIyXDAyNVxuXHJkZWZhdWx0X2J5dGVzXDAzMFx0IFwwMDEoXDAxNEJcMDAySFwwMDJiXDAwNnByb3RvMyIKLSAgICB9OwotICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgYXNzaWduZXIgPQotICAgICAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci4gICAgSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIoKSB7Ci0gICAgICAgICAgcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkgYXNzaWduRGVzY3JpcHRvcnMoCi0gICAgICAgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3Igcm9vdCkgewotICAgICAgICAgICAgZGVzY3JpcHRvciA9IHJvb3Q7Ci0gICAgICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH07Ci0gICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcgotICAgICAgLmludGVybmFsQnVpbGRHZW5lcmF0ZWRGaWxlRnJvbShkZXNjcmlwdG9yRGF0YSwKLSAgICAgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JbXSB7Ci0gICAgICAgIH0sIGFzc2lnbmVyKTsKLSAgICBpbnRlcm5hbF9zdGF0aWNfY29tX2dvb2dsZV9wcm90b2J1Zl9qcnVieV9TZW50aW5lbF9kZXNjcmlwdG9yID0KLSAgICAgIGdldERlc2NyaXB0b3IoKS5nZXRNZXNzYWdlVHlwZXMoKS5nZXQoMCk7Ci0gICAgaW50ZXJuYWxfc3RhdGljX2NvbV9nb29nbGVfcHJvdG9idWZfanJ1YnlfU2VudGluZWxfZmllbGRBY2Nlc3NvclRhYmxlID0gbmV3Ci0gICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlKAotICAgICAgICBpbnRlcm5hbF9zdGF0aWNfY29tX2dvb2dsZV9wcm90b2J1Zl9qcnVieV9TZW50aW5lbF9kZXNjcmlwdG9yLAotICAgICAgICBuZXcgamF2YS5sYW5nLlN0cmluZ1tdIHsgIkRlZmF1bHRJbnQzMiIsICJEZWZhdWx0SW50NjQiLCAiRGVmYXVsdFVuaXQzMiIsICJEZWZhdWx0VWludDY0IiwgIkRlZmF1bHRTdHJpbmciLCAiRGVmYXVsdEJvb2wiLCAiRGVmYXVsdEZsb2F0IiwgIkRlZmF1bHREb3VibGUiLCAiRGVmYXVsdEJ5dGVzIiwgfSk7Ci0gIH0KLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQob3V0ZXJfY2xhc3Nfc2NvcGUpCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9VdGlscy5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvanJ1YnkvVXRpbHMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTk2YTA5Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9qcnVieS9VdGlscy5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzAwICswLDAgQEAKLS8qCi0gKiBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSAqIENvcHlyaWdodCAyMDE0IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotICogaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSAqCi0gKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSAqIG1ldDoKLSAqCi0gKiAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotICogbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotICogICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotICogY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotICogaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotICogZGlzdHJpYnV0aW9uLgotICogICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotICogY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSAqIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0gKgotICogVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotICogIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotICogQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSAqIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotICogU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotICogTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0gKiBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSAqIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSAqIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotICogT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSAqLwotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYuanJ1Ynk7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmc7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnM7Ci1pbXBvcnQgb3JnLmpjb2RpbmdzLkVuY29kaW5nOwotaW1wb3J0IG9yZy5qY29kaW5ncy5zcGVjaWZpYy5BU0NJSUVuY29kaW5nOwotaW1wb3J0IG9yZy5qY29kaW5ncy5zcGVjaWZpYy5VU0FTQ0lJRW5jb2Rpbmc7Ci1pbXBvcnQgb3JnLmpjb2RpbmdzLnNwZWNpZmljLlVURjhFbmNvZGluZzsKLWltcG9ydCBvcmcuanJ1YnkuKjsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5CbG9jazsKLWltcG9ydCBvcmcuanJ1YnkucnVudGltZS5UaHJlYWRDb250ZXh0OwotaW1wb3J0IG9yZy5qcnVieS5ydW50aW1lLmJ1aWx0aW4uSVJ1YnlPYmplY3Q7Ci0KLWltcG9ydCBqYXZhLm1hdGguQmlnSW50ZWdlcjsKLQotcHVibGljIGNsYXNzIFV0aWxzIHsKLSAgICBwdWJsaWMgc3RhdGljIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlIHJ1YnlUb0ZpZWxkVHlwZShJUnVieU9iamVjdCB0eXBlQ2xhc3MpIHsKLSAgICAgICAgcmV0dXJuIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlLnZhbHVlT2YodHlwZUNsYXNzLmFzSmF2YVN0cmluZygpLnRvVXBwZXJDYXNlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVJ1YnlPYmplY3QgZmllbGRUeXBlVG9SdWJ5KFRocmVhZENvbnRleHQgY29udGV4dCwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gZmllbGRUeXBlVG9SdWJ5KGNvbnRleHQsIHR5cGUubmFtZSgpKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIElSdWJ5T2JqZWN0IGZpZWxkVHlwZVRvUnVieShUaHJlYWRDb250ZXh0IGNvbnRleHQsIERlc2NyaXB0b3JQcm90b3MuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlKSB7Ci0gICAgICAgIHJldHVybiBmaWVsZFR5cGVUb1J1YnkoY29udGV4dCwgdHlwZS5uYW1lKCkpOwotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIElSdWJ5T2JqZWN0IGZpZWxkVHlwZVRvUnVieShUaHJlYWRDb250ZXh0IGNvbnRleHQsIFN0cmluZyB0eXBlTmFtZSkgewotCi0gICAgICAgIHJldHVybiBjb250ZXh0LnJ1bnRpbWUubmV3U3ltYm9sKHR5cGVOYW1lLnJlcGxhY2UoIlRZUEVfIiwgIiIpLnRvTG93ZXJDYXNlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja1R5cGUoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZSBmaWVsZFR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgSVJ1YnlPYmplY3QgdmFsdWUsIFJ1YnlNb2R1bGUgdHlwZUNsYXNzKSB7Ci0gICAgICAgIFJ1YnkgcnVudGltZSA9IGNvbnRleHQucnVudGltZTsKLSAgICAgICAgT2JqZWN0IHZhbDsKLSAgICAgICAgc3dpdGNoKGZpZWxkVHlwZSkgewotICAgICAgICAgICAgY2FzZSBJTlQzMjoKLSAgICAgICAgICAgIGNhc2UgSU5UNjQ6Ci0gICAgICAgICAgICBjYXNlIFVJTlQzMjoKLSAgICAgICAgICAgIGNhc2UgVUlOVDY0OgotICAgICAgICAgICAgICAgIGlmICghaXNSdWJ5TnVtKHZhbHVlKSkgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcigiRXhwZWN0ZWQgbnVtYmVyIHR5cGUgZm9yIGludGVncmFsIGZpZWxkLiIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBzd2l0Y2goZmllbGRUeXBlKSB7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgICAgICAgICAgICAgICAgICBSdWJ5TnVtZXJpYy5udW0yaW50KHZhbHVlKTsKLSAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgICAgICAgICBjYXNlIElOVDY0OgotICAgICAgICAgICAgICAgICAgICAgICAgUnVieU51bWVyaWMubnVtMmxvbmcodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGNhc2UgVUlOVDMyOgotICAgICAgICAgICAgICAgICAgICAgICAgbnVtMnVpbnQodmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgICAgICAgICBudW0ydWxvbmcoY29udGV4dC5ydW50aW1lLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgY2hlY2tJbnRUeXBlUHJlY2lzaW9uKGNvbnRleHQsIGZpZWxkVHlwZSwgdmFsdWUpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBGTE9BVDoKLSAgICAgICAgICAgICAgICBpZiAoIWlzUnVieU51bSh2YWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3VHlwZUVycm9yKCJFeHBlY3RlZCBudW1iZXIgdHlwZSBmb3IgZmxvYXQgZmllbGQuIik7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIERPVUJMRToKLSAgICAgICAgICAgICAgICBpZiAoIWlzUnVieU51bSh2YWx1ZSkpCi0gICAgICAgICAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3VHlwZUVycm9yKCJFeHBlY3RlZCBudW1iZXIgdHlwZSBmb3IgZG91YmxlIGZpZWxkLiIpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCT09MOgotICAgICAgICAgICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUnVieUJvb2xlYW4pKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcigiSW52YWxpZCBhcmd1bWVudCBmb3IgYm9vbGVhbiBmaWVsZC4iKTsKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQllURVM6Ci0gICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgICB2YWxpZGF0ZVN0cmluZ0VuY29kaW5nKGNvbnRleHQucnVudGltZSwgZmllbGRUeXBlLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlLmdldE1ldGFDbGFzcygpICE9IHR5cGVDbGFzcykgewotICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcih2YWx1ZSwgdHlwZUNsYXNzKTsKLSAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUnVieVN5bWJvbCkgewotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvciBlbnVtRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgKChSdWJ5RW51bURlc2NyaXB0b3IpIHR5cGVDbGFzcy5nZXRJbnN0YW5jZVZhcmlhYmxlKERFU0NSSVBUT1JfSU5TVEFOQ0VfVkFSKSkuZ2V0RGVzY3JpcHRvcigpOwotICAgICAgICAgICAgICAgICAgICB2YWwgPSBlbnVtRGVzY3JpcHRvci5maW5kVmFsdWVCeU5hbWUodmFsdWUuYXNKYXZhU3RyaW5nKCkpOwotICAgICAgICAgICAgICAgICAgICBpZiAodmFsID09IG51bGwpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1JhbmdlRXJyb3IoIkVudW0gdmFsdWUgIiArIHZhbHVlICsgIiBpcyBub3QgZm91bmQuIik7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIGlmKCFpc1J1YnlOdW0odmFsdWUpKSB7Ci0gICAgICAgICAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3VHlwZUVycm9yKCJFeHBlY3RlZCBudW1iZXIgb3Igc3ltYm9sIHR5cGUgZm9yIGVudW0gZmllbGQuIik7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgSVJ1YnlPYmplY3Qgd3JhcFByaW1hcnlWYWx1ZShUaHJlYWRDb250ZXh0IGNvbnRleHQsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlIGZpZWxkVHlwZSwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIFJ1YnkgcnVudGltZSA9IGNvbnRleHQucnVudGltZTsKLSAgICAgICAgc3dpdGNoIChmaWVsZFR5cGUpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUubmV3Rml4bnVtKChJbnRlZ2VyKSB2YWx1ZSk7Ci0gICAgICAgICAgICBjYXNlIElOVDY0OgotICAgICAgICAgICAgICAgIHJldHVybiBydW50aW1lLm5ld0ZpeG51bSgoTG9uZykgdmFsdWUpOwotICAgICAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgICAgICAgICAgcmV0dXJuIHJ1bnRpbWUubmV3Rml4bnVtKCgoSW50ZWdlcikgdmFsdWUpICYgKC0xbCA+Pj4gMzIpKTsKLSAgICAgICAgICAgIGNhc2UgVUlOVDY0OgotICAgICAgICAgICAgICAgIGxvbmcgcmV0ID0gKExvbmcpIHZhbHVlOwotICAgICAgICAgICAgICAgIHJldHVybiByZXQgPj0gMCA/IHJ1bnRpbWUubmV3Rml4bnVtKHJldCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgUnVieUJpZ251bS5uZXdCaWdudW0ocnVudGltZSwgVUlOVDY0X0NPTVBMRU1FTlRBUlkuYWRkKG5ldyBCaWdJbnRlZ2VyKHJldCArICIiKSkpOwotICAgICAgICAgICAgY2FzZSBGTE9BVDoKLSAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZS5uZXdGbG9hdCgoRmxvYXQpIHZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgRE9VQkxFOgotICAgICAgICAgICAgICAgIHJldHVybiBydW50aW1lLm5ld0Zsb2F0KChEb3VibGUpIHZhbHVlKTsKLSAgICAgICAgICAgIGNhc2UgQk9PTDoKLSAgICAgICAgICAgICAgICByZXR1cm4gKEJvb2xlYW4pIHZhbHVlID8gcnVudGltZS5nZXRUcnVlKCkgOiBydW50aW1lLmdldEZhbHNlKCk7Ci0gICAgICAgICAgICBjYXNlIEJZVEVTOgotICAgICAgICAgICAgICAgIHJldHVybiBydW50aW1lLm5ld1N0cmluZygoKEJ5dGVTdHJpbmcpIHZhbHVlKS50b1N0cmluZ1V0ZjgoKSk7Ci0gICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgICByZXR1cm4gcnVudGltZS5uZXdTdHJpbmcodmFsdWUudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICAgIHJldHVybiBydW50aW1lLmdldE5pbCgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBpbnQgbnVtMnVpbnQoSVJ1YnlPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgbG9uZyBsb25nVmFsID0gUnVieU51bWVyaWMubnVtMmxvbmcodmFsdWUpOwotICAgICAgICBpZiAobG9uZ1ZhbCA+IFVJTlRfTUFYKQotICAgICAgICAgICAgdGhyb3cgdmFsdWUuZ2V0UnVudGltZSgpLm5ld1JhbmdlRXJyb3IoIkludGVnZXIgIiArIGxvbmdWYWwgKyAiIHRvbyBiaWcgdG8gY29udmVydCB0byAndW5zaWduZWQgaW50JyIpOwotICAgICAgICBsb25nIG51bSA9IGxvbmdWYWw7Ci0gICAgICAgIGlmIChudW0gPiBJbnRlZ2VyLk1BWF9WQUxVRSB8fCBudW0gPCBJbnRlZ2VyLk1JTl9WQUxVRSkKLSAgICAgICAgICAgIC8vIGVuY29kZSB0byBVSU5UMzIKLSAgICAgICAgICAgIG51bSA9ICgtbG9uZ1ZhbCBeICgtMWwgPj4+IDMyKSApICsgMTsKLSAgICAgICAgUnVieU51bWVyaWMuY2hlY2tJbnQodmFsdWUsIG51bSk7Ci0gICAgICAgIHJldHVybiAoaW50KSBudW07Ci0gICAgfQotCi0gICAgcHVibGljIHN0YXRpYyBsb25nIG51bTJ1bG9uZyhSdWJ5IHJ1bnRpbWUsIElSdWJ5T2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICh2YWx1ZSBpbnN0YW5jZW9mIFJ1YnlGbG9hdCkgewotICAgICAgICAgICAgUnVieUJpZ251bSBiaWdudW0gPSBSdWJ5QmlnbnVtLm5ld0JpZ251bShydW50aW1lLCAoKFJ1YnlGbG9hdCkgdmFsdWUpLmdldERvdWJsZVZhbHVlKCkpOwotICAgICAgICAgICAgcmV0dXJuIFJ1YnlCaWdudW0uYmlnMnVsb25nKGJpZ251bSk7Ci0gICAgICAgIH0gZWxzZSBpZiAodmFsdWUgaW5zdGFuY2VvZiBSdWJ5QmlnbnVtKSB7Ci0gICAgICAgICAgICByZXR1cm4gUnVieUJpZ251bS5iaWcydWxvbmcoKFJ1YnlCaWdudW0pIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBSdWJ5TnVtZXJpYy5udW0ybG9uZyh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgdmFsaWRhdGVTdHJpbmdFbmNvZGluZyhSdWJ5IHJ1bnRpbWUsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5UeXBlIHR5cGUsIElSdWJ5T2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUnVieVN0cmluZykpCi0gICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcigiSW52YWxpZCBhcmd1bWVudCBmb3Igc3RyaW5nIGZpZWxkLiIpOwotICAgICAgICBFbmNvZGluZyBlbmNvZGluZyA9ICgoUnVieVN0cmluZykgdmFsdWUpLmdldEVuY29kaW5nKCk7Ci0gICAgICAgIHN3aXRjaCh0eXBlKSB7Ci0gICAgICAgICAgICBjYXNlIEJZVEVTOgotICAgICAgICAgICAgICAgIGlmIChlbmNvZGluZyAhPSBBU0NJSUVuY29kaW5nLklOU1RBTkNFKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcigiRW5jb2RpbmcgZm9yIGJ5dGVzIGZpZWxkcyIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbXVzdCBiZSBcIkFTQ0lJLThCSVRcIiwgYnV0IHdhcyAiICsgZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBTVFJJTkc6Ci0gICAgICAgICAgICAgICAgaWYgKGVuY29kaW5nICE9IFVURjhFbmNvZGluZy5JTlNUQU5DRQotICAgICAgICAgICAgICAgICAgICAgICAgJiYgZW5jb2RpbmcgIT0gVVNBU0NJSUVuY29kaW5nLklOU1RBTkNFKQotICAgICAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld1R5cGVFcnJvcigiRW5jb2RpbmcgZm9yIHN0cmluZyBmaWVsZHMiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIG11c3QgYmUgXCJVVEYtOFwiIG9yIFwiQVNDSUlcIiwgYnV0IHdhcyAiICsgZW5jb2RpbmcpOwotICAgICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgdm9pZCBjaGVja05hbWVBdmFpbGFiaWxpdHkoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbmFtZSkgewotICAgICAgICBpZiAoY29udGV4dC5ydW50aW1lLmdldE9iamVjdCgpLmdldENvbnN0YW50QXQobmFtZSkgIT0gbnVsbCkKLSAgICAgICAgICAgIHRocm93IGNvbnRleHQucnVudGltZS5uZXdOYW1lRXJyb3IobmFtZSArICIgaXMgYWxyZWFkeSBkZWZpbmVkIiwgbmFtZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwbGFjZSBpbnZhbGlkICIuIiBpbiBkZXNjcmlwdG9yIHdpdGggX19ET1RfXwotICAgICAqIEBwYXJhbSBuYW1lCi0gICAgICogQHJldHVybgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgU3RyaW5nIGVzY2FwZUlkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZSgiLiIsIEJBRE5BTUVfUkVQTEFDRU1FTlQpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJlcGxhY2UgX19ET1RfXyBpbiBkZXNjcmlwdG9yIG5hbWUgd2l0aCAiLiIKLSAgICAgKiBAcGFyYW0gbmFtZQotICAgICAqIEByZXR1cm4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyB1bmVzY2FwZUlkZW50aWZpZXIoU3RyaW5nIG5hbWUpIHsKLSAgICAgICAgcmV0dXJuIG5hbWUucmVwbGFjZShCQUROQU1FX1JFUExBQ0VNRU5ULCAiLiIpOwotICAgIH0KLQotICAgIHB1YmxpYyBzdGF0aWMgYm9vbGVhbiBpc01hcEVudHJ5KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZERlc2NyaXB0b3IpIHsKLSAgICAgICAgcmV0dXJuIGZpZWxkRGVzY3JpcHRvci5nZXRUeXBlKCkgPT0gRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSAmJgotICAgICAgICAgICAgICAgIGZpZWxkRGVzY3JpcHRvci5pc1JlcGVhdGVkKCkgJiYKLSAgICAgICAgICAgICAgICBmaWVsZERlc2NyaXB0b3IuZ2V0TWVzc2FnZVR5cGUoKS5nZXRPcHRpb25zKCkuZ2V0TWFwRW50cnkoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFJ1YnlGaWVsZERlc2NyaXB0b3IgbXNnZGVmQ3JlYXRlRmllbGQoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBTdHJpbmcgbGFiZWwsIElSdWJ5T2JqZWN0IG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElSdWJ5T2JqZWN0IHR5cGUsIElSdWJ5T2JqZWN0IG51bWJlciwgSVJ1YnlPYmplY3QgdHlwZUNsYXNzLCBSdWJ5Q2xhc3MgY0ZpZWxkRGVzY3JpcHRvcikgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIFJ1YnlGaWVsZERlc2NyaXB0b3IgZmllbGREZWYgPSAoUnVieUZpZWxkRGVzY3JpcHRvcikgY0ZpZWxkRGVzY3JpcHRvci5uZXdJbnN0YW5jZShjb250ZXh0LCBCbG9jay5OVUxMX0JMT0NLKTsKLSAgICAgICAgZmllbGREZWYuc2V0TGFiZWwoY29udGV4dCwgcnVudGltZS5uZXdTdHJpbmcobGFiZWwpKTsKLSAgICAgICAgZmllbGREZWYuc2V0TmFtZShjb250ZXh0LCBuYW1lKTsKLSAgICAgICAgZmllbGREZWYuc2V0VHlwZShjb250ZXh0LCB0eXBlKTsKLSAgICAgICAgZmllbGREZWYuc2V0TnVtYmVyKGNvbnRleHQsIG51bWJlcik7Ci0KLSAgICAgICAgaWYgKCF0eXBlQ2xhc3MuaXNOaWwoKSkgewotICAgICAgICAgICAgaWYgKCEodHlwZUNsYXNzIGluc3RhbmNlb2YgUnVieVN0cmluZykpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld0FyZ3VtZW50RXJyb3IoImV4cGVjdGVkIHN0cmluZyBmb3IgdHlwZSBjbGFzcyIpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgZmllbGREZWYuc2V0U3VibXNnTmFtZShjb250ZXh0LCB0eXBlQ2xhc3MpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBmaWVsZERlZjsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgY2hlY2tJbnRUeXBlUHJlY2lzaW9uKFRocmVhZENvbnRleHQgY29udGV4dCwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUgdHlwZSwgSVJ1YnlPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHZhbHVlIGluc3RhbmNlb2YgUnVieUZsb2F0KSB7Ci0gICAgICAgICAgICBkb3VibGUgZG91YmxlVmFsID0gUnVieU51bWVyaWMubnVtMmRibCh2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoTWF0aC5mbG9vcihkb3VibGVWYWwpICE9IGRvdWJsZVZhbCkgewotICAgICAgICAgICAgICAgIHRocm93IGNvbnRleHQucnVudGltZS5uZXdSYW5nZUVycm9yKCJOb24taW50ZWdyYWwgZmxvYXRpbmcgcG9pbnQgdmFsdWUgYXNzaWduZWQgdG8gaW50ZWdlciBmaWVsZC4iKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAodHlwZSA9PSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZS5VSU5UMzIgfHwgdHlwZSA9PSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZS5VSU5UNjQpIHsKLSAgICAgICAgICAgIGlmIChSdWJ5TnVtZXJpYy5udW0yZGJsKHZhbHVlKSA8IDApIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBjb250ZXh0LnJ1bnRpbWUubmV3UmFuZ2VFcnJvcigiQXNzaWduaW5nIG5lZ2F0aXZlIHZhbHVlIHRvIHVuc2lnbmVkIGludGVnZXIgZmllbGQuIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIGJvb2xlYW4gaXNSdWJ5TnVtKE9iamVjdCB2YWx1ZSkgewotICAgICAgICByZXR1cm4gdmFsdWUgaW5zdGFuY2VvZiBSdWJ5Rml4bnVtIHx8IHZhbHVlIGluc3RhbmNlb2YgUnVieUZsb2F0IHx8IHZhbHVlIGluc3RhbmNlb2YgUnVieUJpZ251bTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgc3RhdGljIHZvaWQgdmFsaWRhdGVUeXBlQ2xhc3MoVGhyZWFkQ29udGV4dCBjb250ZXh0LCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZSB0eXBlLCBJUnVieU9iamVjdCB2YWx1ZSkgewotICAgICAgICBSdWJ5IHJ1bnRpbWUgPSBjb250ZXh0LnJ1bnRpbWU7Ci0gICAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgUnVieU1vZHVsZSkpIHsKLSAgICAgICAgICAgIHRocm93IHJ1bnRpbWUubmV3QXJndW1lbnRFcnJvcigiVHlwZUNsYXNzIGhhcyBpbmNvcnJlY3QgdHlwZSIpOwotICAgICAgICB9Ci0gICAgICAgIFJ1YnlNb2R1bGUga2xhc3MgPSAoUnVieU1vZHVsZSkgdmFsdWU7Ci0gICAgICAgIElSdWJ5T2JqZWN0IGRlc2NyaXB0b3IgPSBrbGFzcy5nZXRJbnN0YW5jZVZhcmlhYmxlKERFU0NSSVBUT1JfSU5TVEFOQ0VfVkFSKTsKLSAgICAgICAgaWYgKGRlc2NyaXB0b3IuaXNOaWwoKSkgewotICAgICAgICAgICAgdGhyb3cgcnVudGltZS5uZXdBcmd1bWVudEVycm9yKCJUeXBlIGNsYXNzIGhhcyBubyBkZXNjcmlwdG9yLiBQbGVhc2UgcGFzcyBhICIgKwotICAgICAgICAgICAgICAgICAgICAiY2xhc3Mgb3IgZW51bSBhcyByZXR1cm5lZCBieSB0aGUgRGVzY3JpcHRvclBvb2wuIik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHR5cGUgPT0gRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLlR5cGUuTUVTU0FHRSkgewotICAgICAgICAgICAgaWYgKCEgKGRlc2NyaXB0b3IgaW5zdGFuY2VvZiBSdWJ5RGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld0FyZ3VtZW50RXJyb3IoIkRlc2NyaXB0b3IgaGFzIGFuIGluY29ycmVjdCB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAodHlwZSA9PSBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNKSB7Ci0gICAgICAgICAgICBpZiAoISAoZGVzY3JpcHRvciBpbnN0YW5jZW9mIFJ1YnlFbnVtRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgICAgICB0aHJvdyBydW50aW1lLm5ld0FyZ3VtZW50RXJyb3IoIkRlc2NyaXB0b3IgaGFzIGFuIGluY29ycmVjdCB0eXBlIik7Ci0gICAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgc3RhdGljIFN0cmluZyBCQUROQU1FX1JFUExBQ0VNRU5UID0gIl9fRE9UX18iOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgREVTQ1JJUFRPUl9JTlNUQU5DRV9WQVIgPSAiQGRlc2NyaXB0b3IiOwotCi0gICAgcHVibGljIHN0YXRpYyBTdHJpbmcgRVFVQUxfU0lHTiA9ICI9IjsKLQotICAgIHByaXZhdGUgc3RhdGljIEJpZ0ludGVnZXIgVUlOVDY0X0NPTVBMRU1FTlRBUlkgPSBuZXcgQmlnSW50ZWdlcigiMTg0NDY3NDQwNzM3MDk1NTE2MTYiKTsgLy9NYXRoLnBvdygyLCA2NCkKLQotICAgIHByaXZhdGUgc3RhdGljIGxvbmcgVUlOVF9NQVggPSAweGZmZmZmZmZmbDsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1Ynkvc3JjL21haW4vamF2YS9nb29nbGUvUHJvdG9idWZKYXZhU2VydmljZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2dvb2dsZS9Qcm90b2J1ZkphdmFTZXJ2aWNlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJmZmI0OTIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9qYXZhL2dvb2dsZS9Qcm90b2J1ZkphdmFTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MCArMCwwIEBACi0vKgotICogUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0gKiBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSAqIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0gKgotICogUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0gKiBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0gKiBtZXQ6Ci0gKgotICogICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSAqIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSAqICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSAqIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSAqIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSAqIGRpc3RyaWJ1dGlvbi4KLSAqICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSAqIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0gKiB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotICoKLSAqIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSAqICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0gKiBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSAqIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0gKiBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSAqIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSAqIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotICogREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0gKiBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0gKiAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSAqIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0gKi8KLQotcGFja2FnZSBnb29nbGU7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLmpydWJ5Lio7Ci1pbXBvcnQgb3JnLmpydWJ5LlJ1Ynk7Ci1pbXBvcnQgb3JnLmpydWJ5LnJ1bnRpbWUubG9hZC5CYXNpY0xpYnJhcnlTZXJ2aWNlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLQotcHVibGljIGNsYXNzIFByb3RvYnVmSmF2YVNlcnZpY2UgaW1wbGVtZW50cyBCYXNpY0xpYnJhcnlTZXJ2aWNlIHsKLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBiYXNpY0xvYWQoUnVieSBydWJ5KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgICBydWJ5LmRlZmluZU1vZHVsZSgiR29vZ2xlIik7Ci0gICAgICAgIFJ1YnlQcm90b2J1Zi5jcmVhdGVQcm90b2J1ZihydWJ5KTsKLSAgICAgICAgUnVieURlc2NyaXB0b3IuY3JlYXRlUnVieURlc2NyaXB0b3IocnVieSk7Ci0gICAgICAgIFJ1YnlCdWlsZGVyLmNyZWF0ZVJ1YnlCdWlsZGVyKHJ1YnkpOwotICAgICAgICBSdWJ5RmllbGREZXNjcmlwdG9yLmNyZWF0ZVJ1YnlGaWxlRGVzY3JpcHRvcihydWJ5KTsKLSAgICAgICAgUnVieU1lc3NhZ2VCdWlsZGVyQ29udGV4dC5jcmVhdGVSdWJ5TWVzc2FnZUJ1aWxkZXJDb250ZXh0KHJ1YnkpOwotICAgICAgICBSdWJ5RW51bURlc2NyaXB0b3IuY3JlYXRlUnVieUVudW1EZXNjcmlwdG9yKHJ1YnkpOwotICAgICAgICBSdWJ5RW51bUJ1aWxkZXJDb250ZXh0LmNyZWF0ZVJ1YnlFbnVtQnVpbGRlckNvbnRleHQocnVieSk7Ci0gICAgICAgIFJ1YnlEZXNjcmlwdG9yUG9vbC5jcmVhdGVSdWJ5RGVzY3JpcHRvclBvb2wocnVieSk7Ci0gICAgICAgIFJ1YnlSZXBlYXRlZEZpZWxkLmNyZWF0ZVJ1YnlSZXBlYXRlZEZpZWxkKHJ1YnkpOwotICAgICAgICBSdWJ5RmllbGREZXNjcmlwdG9yLmNyZWF0ZVJ1YnlGaWxlRGVzY3JpcHRvcihydWJ5KTsKLSAgICAgICAgUnVieU1hcC5jcmVhdGVSdWJ5TWFwKHJ1YnkpOwotICAgICAgICBSdWJ5T25lb2ZEZXNjcmlwdG9yLmNyZWF0ZVJ1YnlPbmVvZkRlc2NyaXB0b3IocnVieSk7Ci0gICAgICAgIFJ1YnlPbmVvZkJ1aWxkZXJDb250ZXh0LmNyZWF0ZVJ1YnlPbmVvZkJ1aWxkZXJDb250ZXh0KHJ1YnkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL3NlbnRpbmVsLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS9zcmMvbWFpbi9zZW50aW5lbC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzIyMDQxYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3NyYy9tYWluL3NlbnRpbmVsLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsMTUgKzAsMCBAQAotc3ludGF4ID0gInByb3RvMyI7Ci1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWYuanJ1Ynk7Ci1vcHRpb24gb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFOwotCi1tZXNzYWdlIFNlbnRpbmVsIHsKLSAgaW50MzIgZGVmYXVsdF9pbnQzMiA9IDE7Ci0gIGludDY0IGRlZmF1bHRfaW50NjQgPSAyOwotICB1aW50MzIgZGVmYXVsdF91bml0MzIgPSAzOwotICB1aW50NjQgZGVmYXVsdF91aW50NjQgPSA0OwotICBzdHJpbmcgZGVmYXVsdF9zdHJpbmcgPSA1OwotICBib29sIGRlZmF1bHRfYm9vbCA9IDY7Ci0gIGZsb2F0IGRlZmF1bHRfZmxvYXQgPSA3OwotICBkb3VibGUgZGVmYXVsdF9kb3VibGUgPSA4OwotICBieXRlcyBkZWZhdWx0X2J5dGVzID0gOTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvdGVzdHMvYmFzaWMucmIgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3Rlc3RzL2Jhc2ljLnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3N2MxODZlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvdGVzdHMvYmFzaWMucmIKKysrIC9kZXYvbnVsbApAQCAtMSwxMTc0ICswLDAgQEAKLSMhL3Vzci9iaW4vcnVieQotCi1yZXF1aXJlICdnb29nbGUvcHJvdG9idWYnCi1yZXF1aXJlICd0ZXN0L3VuaXQnCi0KLSMgLS0tLS0tLS0tLS0tLSBnZW5lcmF0ZWQgY29kZSAtLS0tLS0tLS0tLS0tLQotCi1tb2R1bGUgQmFzaWNUZXN0Ci0gIHBvb2wgPSBHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5uZXcKLSAgcG9vbC5idWlsZCBkbwotICAgIGFkZF9tZXNzYWdlICJGb28iIGRvCi0gICAgICBvcHRpb25hbCA6YmFyLCA6bWVzc2FnZSwgMSwgIkJhciIKLSAgICAgIHJlcGVhdGVkIDpiYXosIDptZXNzYWdlLCAyLCAiQmF6IgotICAgIGVuZAotCi0gICAgYWRkX21lc3NhZ2UgIkJhciIgZG8KLSAgICAgIG9wdGlvbmFsIDptc2csIDpzdHJpbmcsIDEKLSAgICBlbmQKLQotICAgIGFkZF9tZXNzYWdlICJCYXoiIGRvCi0gICAgICBvcHRpb25hbCA6bXNnLCA6c3RyaW5nLCAxCi0gICAgZW5kCi0KLSAgICBhZGRfbWVzc2FnZSAiVGVzdE1lc3NhZ2UiIGRvCi0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfaW50MzIsICA6aW50MzIsICAgICAgICAxCi0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfaW50NjQsICA6aW50NjQsICAgICAgICAyCi0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfdWludDMyLCA6dWludDMyLCAgICAgICAzCi0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfdWludDY0LCA6dWludDY0LCAgICAgICA0Ci0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfYm9vbCwgICA6Ym9vbCwgICAgICAgICA1Ci0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfZmxvYXQsICA6ZmxvYXQsICAgICAgICA2Ci0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfZG91YmxlLCA6ZG91YmxlLCAgICAgICA3Ci0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfc3RyaW5nLCA6c3RyaW5nLCAgICAgICA4Ci0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfYnl0ZXMsICA6Ynl0ZXMsICAgICAgICA5Ci0gICAgICBvcHRpb25hbCA6b3B0aW9uYWxfbXNnLCAgICA6bWVzc2FnZSwgICAgICAxMCwgIlRlc3RNZXNzYWdlMiIKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9lbnVtLCAgIDplbnVtLCAgICAgICAgIDExLCAiVGVzdEVudW0iCi0KLSAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9pbnQzMiwgIDppbnQzMiwgICAgICAgIDEyCi0gICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfaW50NjQsICA6aW50NjQsICAgICAgICAxMwotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX3VpbnQzMiwgOnVpbnQzMiwgICAgICAgMTQKLSAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF91aW50NjQsIDp1aW50NjQsICAgICAgIDE1Ci0gICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfYm9vbCwgICA6Ym9vbCwgICAgICAgICAxNgotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2Zsb2F0LCAgOmZsb2F0LCAgICAgICAgMTcKLSAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9kb3VibGUsIDpkb3VibGUsICAgICAgIDE4Ci0gICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfc3RyaW5nLCA6c3RyaW5nLCAgICAgICAxOQotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2J5dGVzLCAgOmJ5dGVzLCAgICAgICAgMjAKLSAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9tc2csICAgIDptZXNzYWdlLCAgICAgIDIxLCAiVGVzdE1lc3NhZ2UyIgotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2VudW0sICAgOmVudW0sICAgICAgICAgMjIsICJUZXN0RW51bSIKLSAgICBlbmQKLSAgICBhZGRfbWVzc2FnZSAiVGVzdE1lc3NhZ2UyIiBkbwotICAgICAgb3B0aW9uYWwgOmZvbywgOmludDMyLCAxCi0gICAgZW5kCi0KLSAgICBhZGRfbWVzc2FnZSAiUmVjdXJzaXZlMSIgZG8KLSAgICAgIG9wdGlvbmFsIDpmb28sIDptZXNzYWdlLCAxLCAiUmVjdXJzaXZlMiIKLSAgICBlbmQKLSAgICBhZGRfbWVzc2FnZSAiUmVjdXJzaXZlMiIgZG8KLSAgICAgIG9wdGlvbmFsIDpmb28sIDptZXNzYWdlLCAxLCAiUmVjdXJzaXZlMSIKLSAgICBlbmQKLQotICAgIGFkZF9lbnVtICJUZXN0RW51bSIgZG8KLSAgICAgIHZhbHVlIDpEZWZhdWx0LCAwCi0gICAgICB2YWx1ZSA6QSwgMQotICAgICAgdmFsdWUgOkIsIDIKLSAgICAgIHZhbHVlIDpDLCAzCi0gICAgZW5kCi0KLSAgICBhZGRfbWVzc2FnZSAiQmFkRmllbGROYW1lcyIgZG8KLSAgICAgIG9wdGlvbmFsIDpkdXAsIDppbnQzMiwgMQotICAgICAgb3B0aW9uYWwgOmNsYXNzLCA6aW50MzIsIDIKLSAgICAgIG9wdGlvbmFsIDoiYS5iIiwgOmludDMyLCAzCi0gICAgZW5kCi0KLSAgICBhZGRfbWVzc2FnZSAiTWFwTWVzc2FnZSIgZG8KLSAgICAgIG1hcCA6bWFwX3N0cmluZ19pbnQzMiwgOnN0cmluZywgOmludDMyLCAxCi0gICAgICBtYXAgOm1hcF9zdHJpbmdfbXNnLCA6c3RyaW5nLCA6bWVzc2FnZSwgMiwgIlRlc3RNZXNzYWdlMiIKLSAgICBlbmQKLSAgICBhZGRfbWVzc2FnZSAiTWFwTWVzc2FnZVdpcmVFcXVpdiIgZG8KLSAgICAgIHJlcGVhdGVkIDptYXBfc3RyaW5nX2ludDMyLCA6bWVzc2FnZSwgMSwgIk1hcE1lc3NhZ2VXaXJlRXF1aXZfZW50cnkxIgotICAgICAgcmVwZWF0ZWQgOm1hcF9zdHJpbmdfbXNnLCA6bWVzc2FnZSwgMiwgIk1hcE1lc3NhZ2VXaXJlRXF1aXZfZW50cnkyIgotICAgIGVuZAotICAgIGFkZF9tZXNzYWdlICJNYXBNZXNzYWdlV2lyZUVxdWl2X2VudHJ5MSIgZG8KLSAgICAgIG9wdGlvbmFsIDprZXksIDpzdHJpbmcsIDEKLSAgICAgIG9wdGlvbmFsIDp2YWx1ZSwgOmludDMyLCAyCi0gICAgZW5kCi0gICAgYWRkX21lc3NhZ2UgIk1hcE1lc3NhZ2VXaXJlRXF1aXZfZW50cnkyIiBkbwotICAgICAgb3B0aW9uYWwgOmtleSwgOnN0cmluZywgMQotICAgICAgb3B0aW9uYWwgOnZhbHVlLCA6bWVzc2FnZSwgMiwgIlRlc3RNZXNzYWdlMiIKLSAgICBlbmQKLQotICAgIGFkZF9tZXNzYWdlICJPbmVvZk1lc3NhZ2UiIGRvCi0gICAgICBvbmVvZiA6bXlfb25lb2YgZG8KLSAgICAgICAgb3B0aW9uYWwgOmEsIDpzdHJpbmcsIDEKLSAgICAgICAgb3B0aW9uYWwgOmIsIDppbnQzMiwgMgotICAgICAgICBvcHRpb25hbCA6YywgOm1lc3NhZ2UsIDMsICJUZXN0TWVzc2FnZTIiCi0gICAgICAgIG9wdGlvbmFsIDpkLCA6ZW51bSwgNCwgIlRlc3RFbnVtIgotICAgICAgZW5kCi0gICAgZW5kCi0gIGVuZAotCi0gIEZvbyA9IHBvb2wubG9va3VwKCJGb28iKS5tc2djbGFzcwotICBCYXIgPSBwb29sLmxvb2t1cCgiQmFyIikubXNnY2xhc3MKLSAgQmF6ID0gcG9vbC5sb29rdXAoIkJheiIpLm1zZ2NsYXNzCi0gIFRlc3RNZXNzYWdlID0gcG9vbC5sb29rdXAoIlRlc3RNZXNzYWdlIikubXNnY2xhc3MKLSAgVGVzdE1lc3NhZ2UyID0gcG9vbC5sb29rdXAoIlRlc3RNZXNzYWdlMiIpLm1zZ2NsYXNzCi0gIFJlY3Vyc2l2ZTEgPSBwb29sLmxvb2t1cCgiUmVjdXJzaXZlMSIpLm1zZ2NsYXNzCi0gIFJlY3Vyc2l2ZTIgPSBwb29sLmxvb2t1cCgiUmVjdXJzaXZlMiIpLm1zZ2NsYXNzCi0gIFRlc3RFbnVtID0gcG9vbC5sb29rdXAoIlRlc3RFbnVtIikuZW51bW1vZHVsZQotICBCYWRGaWVsZE5hbWVzID0gcG9vbC5sb29rdXAoIkJhZEZpZWxkTmFtZXMiKS5tc2djbGFzcwotICBNYXBNZXNzYWdlID0gcG9vbC5sb29rdXAoIk1hcE1lc3NhZ2UiKS5tc2djbGFzcwotICBNYXBNZXNzYWdlV2lyZUVxdWl2ID0gcG9vbC5sb29rdXAoIk1hcE1lc3NhZ2VXaXJlRXF1aXYiKS5tc2djbGFzcwotICBNYXBNZXNzYWdlV2lyZUVxdWl2X2VudHJ5MSA9Ci0gICAgcG9vbC5sb29rdXAoIk1hcE1lc3NhZ2VXaXJlRXF1aXZfZW50cnkxIikubXNnY2xhc3MKLSAgTWFwTWVzc2FnZVdpcmVFcXVpdl9lbnRyeTIgPQotICAgIHBvb2wubG9va3VwKCJNYXBNZXNzYWdlV2lyZUVxdWl2X2VudHJ5MiIpLm1zZ2NsYXNzCi0gIE9uZW9mTWVzc2FnZSA9IHBvb2wubG9va3VwKCJPbmVvZk1lc3NhZ2UiKS5tc2djbGFzcwotCi0jIC0tLS0tLS0tLS0tLSB0ZXN0IGNhc2VzIC0tLS0tLS0tLS0tLS0tLQotCi0gIGNsYXNzIE1lc3NhZ2VDb250YWluZXJUZXN0IDwgVGVzdDo6VW5pdDo6VGVzdENhc2UKLQotICAgIGRlZiB0ZXN0X2RlZmF1bHRzCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9pbnQzMiA9PSAwCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9pbnQ2NCA9PSAwCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF91aW50MzIgPT0gMAotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfdWludDY0ID09IDAKLSAgICAgIGFzc2VydCBtLm9wdGlvbmFsX2Jvb2wgPT0gZmFsc2UKLSAgICAgIGFzc2VydCBtLm9wdGlvbmFsX2Zsb2F0ID09IDAuMAotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfZG91YmxlID09IDAuMAotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfc3RyaW5nID09ICIiCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9ieXRlcyA9PSAiIgotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfbXNnID09IG5pbAotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfZW51bSA9PSA6RGVmYXVsdAotICAgIGVuZAotCi0gICAgZGVmIHRlc3Rfc2V0dGVycwotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgICAgbS5vcHRpb25hbF9pbnQzMiA9IC00MgotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfaW50MzIgPT0gLTQyCi0gICAgICBtLm9wdGlvbmFsX2ludDY0ID0gLTB4MV8wMDAwXzAwMDAKLSAgICAgIGFzc2VydCBtLm9wdGlvbmFsX2ludDY0ID09IC0weDFfMDAwMF8wMDAwCi0gICAgICBtLm9wdGlvbmFsX3VpbnQzMiA9IDB4OTAwMF8wMDAwCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF91aW50MzIgPT0gMHg5MDAwXzAwMDAKLSAgICAgIG0ub3B0aW9uYWxfdWludDY0ID0gMHg5MDAwXzAwMDBfMDAwMF8wMDAwCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF91aW50NjQgPT0gMHg5MDAwXzAwMDBfMDAwMF8wMDAwCi0gICAgICBtLm9wdGlvbmFsX2Jvb2wgPSB0cnVlCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9ib29sID09IHRydWUKLSAgICAgIG0ub3B0aW9uYWxfZmxvYXQgPSAwLjUKLSAgICAgIGFzc2VydCBtLm9wdGlvbmFsX2Zsb2F0ID09IDAuNQotICAgICAgbS5vcHRpb25hbF9kb3VibGUgPSAwLjUKLSAgICAgIG0ub3B0aW9uYWxfc3RyaW5nID0gImhlbGxvIgotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfc3RyaW5nID09ICJoZWxsbyIKLSAgICAgIG0ub3B0aW9uYWxfYnl0ZXMgPSAid29ybGQiLmVuY29kZSEoJ0FTQ0lJLThCSVQnKQotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfYnl0ZXMgPT0gIndvcmxkIgotICAgICAgbS5vcHRpb25hbF9tc2cgPSBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gNDIpCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9tc2cgPT0gVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDQyKQotICAgICAgbS5vcHRpb25hbF9tc2cgPSBuaWwKLSAgICAgIGFzc2VydCBtLm9wdGlvbmFsX21zZyA9PSBuaWwKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X2N0b3JfYXJncwotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gLTQyLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6b3B0aW9uYWxfbXNnID0+IFRlc3RNZXNzYWdlMi5uZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpvcHRpb25hbF9lbnVtID0+IDpDLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVwZWF0ZWRfc3RyaW5nID0+IFsiaGVsbG8iLCAidGhlcmUiLCAid29ybGQiXSkKLSAgICAgIGFzc2VydCBtLm9wdGlvbmFsX2ludDMyID09IC00MgotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfbXNnLmNsYXNzID09IFRlc3RNZXNzYWdlMgotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfc3RyaW5nLmxlbmd0aCA9PSAzCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9lbnVtID09IDpDCi0gICAgICBhc3NlcnQgbS5yZXBlYXRlZF9zdHJpbmdbMF0gPT0gImhlbGxvIgotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfc3RyaW5nWzFdID09ICJ0aGVyZSIKLSAgICAgIGFzc2VydCBtLnJlcGVhdGVkX3N0cmluZ1syXSA9PSAid29ybGQiCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9pbnNwZWN0Ci0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3KDpvcHRpb25hbF9pbnQzMiA9PiAtNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpvcHRpb25hbF9lbnVtID0+IDpBLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6b3B0aW9uYWxfbXNnID0+IFRlc3RNZXNzYWdlMi5uZXcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXBlYXRlZF9zdHJpbmcgPT4gWyJoZWxsbyIsICJ0aGVyZSIsICJ3b3JsZCJdKQotICAgICAgZXhwZWN0ZWQgPSAnPEJhc2ljVGVzdDo6VGVzdE1lc3NhZ2U6IG9wdGlvbmFsX2ludDMyOiAtNDIsIG9wdGlvbmFsX2ludDY0OiAwLCBvcHRpb25hbF91aW50MzI6IDAsIG9wdGlvbmFsX3VpbnQ2NDogMCwgb3B0aW9uYWxfYm9vbDogZmFsc2UsIG9wdGlvbmFsX2Zsb2F0OiAwLjAsIG9wdGlvbmFsX2RvdWJsZTogMC4wLCBvcHRpb25hbF9zdHJpbmc6ICIiLCBvcHRpb25hbF9ieXRlczogIiIsIG9wdGlvbmFsX21zZzogPEJhc2ljVGVzdDo6VGVzdE1lc3NhZ2UyOiBmb286IDA+LCBvcHRpb25hbF9lbnVtOiA6QSwgcmVwZWF0ZWRfaW50MzI6IFtdLCByZXBlYXRlZF9pbnQ2NDogW10sIHJlcGVhdGVkX3VpbnQzMjogW10sIHJlcGVhdGVkX3VpbnQ2NDogW10sIHJlcGVhdGVkX2Jvb2w6IFtdLCByZXBlYXRlZF9mbG9hdDogW10sIHJlcGVhdGVkX2RvdWJsZTogW10sIHJlcGVhdGVkX3N0cmluZzogWyJoZWxsbyIsICJ0aGVyZSIsICJ3b3JsZCJdLCByZXBlYXRlZF9ieXRlczogW10sIHJlcGVhdGVkX21zZzogW10sIHJlcGVhdGVkX2VudW06IFtdPicKLSAgICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZCwgbS5pbnNwZWN0Ci0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9oYXNoCi0gICAgICBtMSA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gNDIpCi0gICAgICBtMiA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gMTAyKQotICAgICAgYXNzZXJ0IG0xLmhhc2ggIT0gMAotICAgICAgYXNzZXJ0IG0yLmhhc2ggIT0gMAotICAgICAgIyByZWx5aW5nIG9uIHRoZSByYW5kb21uZXNzIGhlcmUgLS0gaWYgaGFzaCBmdW5jdGlvbiBjaGFuZ2VzIGFuZCB3ZSBhcmUKLSAgICAgICMgdW5sdWNreSBlbm91Z2ggdG8gZ2V0IGEgY29sbGlzaW9uLCB0aGVuIGNoYW5nZSB0aGUgdmFsdWVzIGFib3ZlLgotICAgICAgYXNzZXJ0IG0xLmhhc2ggIT0gbTIuaGFzaAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfdW5rbm93bl9maWVsZF9lcnJvcnMKLSAgICAgIGUgPSBhc3NlcnRfcmFpc2UgTm9NZXRob2RFcnJvciBkbwotICAgICAgICBUZXN0TWVzc2FnZS5uZXcuaGVsbG8KLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X21hdGNoKC9oZWxsby8sIGUubWVzc2FnZSkKLQotICAgICAgZSA9IGFzc2VydF9yYWlzZSBOb01ldGhvZEVycm9yIGRvCi0gICAgICAgIFRlc3RNZXNzYWdlLm5ldy5oZWxsbyA9ICJ3b3JsZCIKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X21hdGNoKC9oZWxsby8sIGUubWVzc2FnZSkKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X2luaXRpYWxpemF0aW9uX21hcF9lcnJvcnMKLSAgICAgIGUgPSBhc3NlcnRfcmFpc2UgQXJndW1lbnRFcnJvciBkbwotICAgICAgICBUZXN0TWVzc2FnZS5uZXcoOmhlbGxvID0+ICJ3b3JsZCIpCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9tYXRjaCgvaGVsbG8vLCBlLm1lc3NhZ2UpCi0KLSAgICAgIGUgPSBhc3NlcnRfcmFpc2UgQXJndW1lbnRFcnJvciBkbwotICAgICAgICBNYXBNZXNzYWdlLm5ldyg6bWFwX3N0cmluZ19pbnQzMiA9PiAiaGVsbG8iKQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfZXF1YWwgZS5tZXNzYWdlLCAiRXhwZWN0ZWQgSGFzaCBvYmplY3QgYXMgaW5pdGlhbGl6ZXIgdmFsdWUgZm9yIG1hcCBmaWVsZCAnbWFwX3N0cmluZ19pbnQzMicuIgotCi0gICAgICBlID0gYXNzZXJ0X3JhaXNlIEFyZ3VtZW50RXJyb3IgZG8KLSAgICAgICAgVGVzdE1lc3NhZ2UubmV3KDpyZXBlYXRlZF91aW50MzIgPT4gImhlbGxvIikKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X2VxdWFsIGUubWVzc2FnZSwgIkV4cGVjdGVkIGFycmF5IGFzIGluaXRpYWxpemVyIHZhbHVlIGZvciByZXBlYXRlZCBmaWVsZCAncmVwZWF0ZWRfdWludDMyJy4iCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF90eXBlX2Vycm9ycwotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX2ludDMyID0gImhlbGxvIgotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfc3RyaW5nID0gNDIKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3N0cmluZyA9IG5pbAotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfYm9vbCA9IDQyCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF9tc2cgPSBUZXN0TWVzc2FnZS5uZXcgICMgZXhwZWN0cyBUZXN0TWVzc2FnZTIKLSAgICAgIGVuZAotCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIG0ucmVwZWF0ZWRfaW50MzIgPSBbXSAgIyBuZWVkcyBSZXBlYXRlZEZpZWxkCi0gICAgICBlbmQKLQotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtLnJlcGVhdGVkX2ludDMyLnB1c2ggImhlbGxvIgotICAgICAgZW5kCi0KLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbS5yZXBlYXRlZF9tc2cucHVzaCBUZXN0TWVzc2FnZS5uZXcKLSAgICAgIGVuZAotICAgIGVuZAotCi0gICAgZGVmIHRlc3Rfc3RyaW5nX2VuY29kaW5nCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0KLSAgICAgICMgQXNzaWduaW5nIGEgbm9ybWFsIChBU0NJSSBvciBVVEY4KSBzdHJpbmcgdG8gYSBieXRlcyBmaWVsZCwgb3IKLSAgICAgICMgQVNDSUktOEJJVCB0byBhIHN0cmluZyBmaWVsZCwgcmFpc2VzIGFuIGVycm9yLgotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX2J5dGVzID0gIlRlc3Qgc3RyaW5nIEFTQ0lJIi5lbmNvZGUhKCdBU0NJSScpCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF9ieXRlcyA9ICJUZXN0IHN0cmluZyBVVEYtOCBcdTAxMDAiLmVuY29kZSEoJ1VURi04JykKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3N0cmluZyA9IFsiRkZGRiJdLnBhY2soJ0gqJykKLSAgICAgIGVuZAotCi0gICAgICAjICJPcmRpbmFyeSIgdXNlIGNhc2UuCi0gICAgICBtLm9wdGlvbmFsX2J5dGVzID0gWyJGRkZGIl0ucGFjaygnSConKQotICAgICAgbS5vcHRpb25hbF9zdHJpbmcgPSAiXHUwMTAwIgotCi0gICAgICAjIHN0cmluZ3MgYXJlIG11dGFibGUgc28gd2UgY2FuIGRvIHRoaXMsIGJ1dCBzZXJpYWxpemUgc2hvdWxkIGNhdGNoIGl0LgotICAgICAgbS5vcHRpb25hbF9zdHJpbmcgPSAiYXNkZiIuZW5jb2RlISgnVVRGLTgnKQotICAgICAgbS5vcHRpb25hbF9zdHJpbmcuZW5jb2RlISgnQVNDSUktOEJJVCcpCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIGRhdGEgPSBUZXN0TWVzc2FnZS5lbmNvZGUobSkKLSAgICAgIGVuZAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcnB0ZmllbGRfaW50MzIKLSAgICAgIGwgPSBHb29nbGU6OlByb3RvYnVmOjpSZXBlYXRlZEZpZWxkLm5ldyg6aW50MzIpCi0gICAgICBhc3NlcnQgbC5jb3VudCA9PSAwCi0gICAgICBsID0gR29vZ2xlOjpQcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZC5uZXcoOmludDMyLCBbMSwgMiwgM10pCi0gICAgICBhc3NlcnQgbC5jb3VudCA9PSAzCi0gICAgICBhc3NlcnRfZXF1YWwgWzEsIDIsIDNdLCBsCi0gICAgICBhc3NlcnRfZXF1YWwgbCwgWzEsIDIsIDNdCi0gICAgICBsLnB1c2ggNAotICAgICAgYXNzZXJ0IGwgPT0gWzEsIDIsIDMsIDRdCi0gICAgICBkc3RfbGlzdCA9IFtdCi0gICAgICBsLmVhY2ggeyB8dmFsfCBkc3RfbGlzdC5wdXNoIHZhbCB9Ci0gICAgICBhc3NlcnQgZHN0X2xpc3QgPT0gWzEsIDIsIDMsIDRdCi0gICAgICBhc3NlcnQgbC50b19hID09IFsxLCAyLCAzLCA0XQotICAgICAgYXNzZXJ0IGxbMF0gPT0gMQotICAgICAgYXNzZXJ0IGxbM10gPT0gNAotICAgICAgbFswXSA9IDUKLSAgICAgIGFzc2VydCBsID09IFs1LCAyLCAzLCA0XQotCi0gICAgICBsMiA9IGwuZHVwCi0gICAgICBhc3NlcnQgbCA9PSBsMgotICAgICAgYXNzZXJ0IGwub2JqZWN0X2lkICE9IGwyLm9iamVjdF9pZAotICAgICAgbDIucHVzaCA2Ci0gICAgICBhc3NlcnQgbC5jb3VudCA9PSA0Ci0gICAgICBhc3NlcnQgbDIuY291bnQgPT0gNQotCi0gICAgICBhc3NlcnQgbC5pbnNwZWN0ID09ICdbNSwgMiwgMywgNF0nCi0KLSAgICAgIGwuY29uY2F0KFs3LCA4LCA5XSkKLSAgICAgIGFzc2VydCBsID09IFs1LCAyLCAzLCA0LCA3LCA4LCA5XQotICAgICAgYXNzZXJ0IGwucG9wID09IDkKLSAgICAgIGFzc2VydCBsID09IFs1LCAyLCAzLCA0LCA3LCA4XQotCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICAgICAgbC5wdXNoIG0KLSAgICAgIGVuZAotCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgICBtLnJlcGVhdGVkX2ludDMyID0gbAotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfaW50MzIgPT0gWzUsIDIsIDMsIDQsIDcsIDhdCi0gICAgICBhc3NlcnQgbS5yZXBlYXRlZF9pbnQzMi5vYmplY3RfaWQgPT0gbC5vYmplY3RfaWQKLSAgICAgIGwucHVzaCA0MgotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfaW50MzIucG9wID09IDQyCi0KLSAgICAgIGwzID0gbCArIGwuZHVwCi0gICAgICBhc3NlcnQgbDMuY291bnQgPT0gbC5jb3VudCAqIDIKLSAgICAgIGwuY291bnQudGltZXMgZG8gfGl8Ci0gICAgICAgIGFzc2VydCBsM1tpXSA9PSBsW2ldCi0gICAgICAgIGFzc2VydCBsM1tsLmNvdW50ICsgaV0gPT0gbFtpXQotICAgICAgZW5kCi0KLSAgICAgIGwuY2xlYXIKLSAgICAgIGFzc2VydCBsLmNvdW50ID09IDAKLSAgICAgIGwgKz0gWzEsIDIsIDMsIDRdCi0gICAgICBsLnJlcGxhY2UoWzUsIDYsIDcsIDhdKQotICAgICAgYXNzZXJ0IGwgPT0gWzUsIDYsIDcsIDhdCi0KLSAgICAgIGw0ID0gR29vZ2xlOjpQcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZC5uZXcoOmludDMyKQotICAgICAgbDRbNV0gPSA0MgotICAgICAgYXNzZXJ0IGw0ID09IFswLCAwLCAwLCAwLCAwLCA0Ml0KLQotICAgICAgbDQgPDwgMTAwCi0gICAgICBhc3NlcnQgbDQgPT0gWzAsIDAsIDAsIDAsIDAsIDQyLCAxMDBdCi0gICAgICBsNCA8PCAxMDEgPDwgMTAyCi0gICAgICBhc3NlcnQgbDQgPT0gWzAsIDAsIDAsIDAsIDAsIDQyLCAxMDAsIDEwMSwgMTAyXQotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcGFyZW50X3JwdGZpZWxkCi0gICAgICAjbWFrZSBzdXJlIHdlIHNldCB0aGUgUmVwZWF0ZWRGaWVsZCBhbmQgY2FuIGFkZCB0byBpdAotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfc3RyaW5nID09IFtdCi0gICAgICBtLnJlcGVhdGVkX3N0cmluZyA8PCAnb2snCi0gICAgICBtLnJlcGVhdGVkX3N0cmluZy5wdXNoKCdvazInKQotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfc3RyaW5nID09IFsnb2snLCAnb2syJ10KLSAgICAgIG0ucmVwZWF0ZWRfc3RyaW5nICs9IFsnb2szJ10KLSAgICAgIGFzc2VydCBtLnJlcGVhdGVkX3N0cmluZyA9PSBbJ29rJywgJ29rMicsICdvazMnXQotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcnB0ZmllbGRfbXNnCi0gICAgICBsID0gR29vZ2xlOjpQcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZC5uZXcoOm1lc3NhZ2UsIFRlc3RNZXNzYWdlKQotICAgICAgbC5wdXNoIFRlc3RNZXNzYWdlLm5ldwotICAgICAgYXNzZXJ0IGwuY291bnQgPT0gMQotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBsLnB1c2ggVGVzdE1lc3NhZ2UyLm5ldwotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIGwucHVzaCA0MgotICAgICAgZW5kCi0KLSAgICAgIGwyID0gbC5kdXAKLSAgICAgIGFzc2VydCBsMlswXSA9PSBsWzBdCi0gICAgICBhc3NlcnQgbDJbMF0ub2JqZWN0X2lkID09IGxbMF0ub2JqZWN0X2lkCi0KLSAgICAgIGwyID0gR29vZ2xlOjpQcm90b2J1Zi5kZWVwX2NvcHkobCkKLSAgICAgIGFzc2VydCBsMlswXSA9PSBsWzBdCi0gICAgICBhc3NlcnQgbDJbMF0ub2JqZWN0X2lkICE9IGxbMF0ub2JqZWN0X2lkCi0KLSAgICAgIGwzID0gbCArIGwyCi0gICAgICBhc3NlcnQgbDMuY291bnQgPT0gMgotICAgICAgYXNzZXJ0IGwzWzBdID09IGxbMF0KLSAgICAgIGFzc2VydCBsM1sxXSA9PSBsMlswXQotICAgICAgbDNbMF0ub3B0aW9uYWxfaW50MzIgPSAxMDAwCi0gICAgICBhc3NlcnQgbFswXS5vcHRpb25hbF9pbnQzMiA9PSAxMDAwCi0KLSAgICAgIG5ld19tc2cgPSBUZXN0TWVzc2FnZS5uZXcoOm9wdGlvbmFsX2ludDMyID0+IDIwMCkKLSAgICAgIGw0ID0gbCArIFtuZXdfbXNnXQotICAgICAgYXNzZXJ0IGw0LmNvdW50ID09IDIKLSAgICAgIG5ld19tc2cub3B0aW9uYWxfaW50MzIgPSAxMDAwCi0gICAgICBhc3NlcnQgbDRbMV0ub3B0aW9uYWxfaW50MzIgPT0gMTAwMAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcnB0ZmllbGRfZW51bQotICAgICAgbCA9IEdvb2dsZTo6UHJvdG9idWY6OlJlcGVhdGVkRmllbGQubmV3KDplbnVtLCBUZXN0RW51bSkKLSAgICAgIGwucHVzaCA6QQotICAgICAgbC5wdXNoIDpCCi0gICAgICBsLnB1c2ggOkMKLSAgICAgIGFzc2VydCBsLmNvdW50ID09IDMKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIGwucHVzaCA6RAotICAgICAgZW5kCi0gICAgICBhc3NlcnQgbFswXSA9PSA6QQotCi0gICAgICBsLnB1c2ggNAotICAgICAgYXNzZXJ0IGxbM10gPT0gNAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcnB0ZmllbGRfaW5pdGlhbGl6ZQotICAgICAgYXNzZXJ0X3JhaXNlIEFyZ3VtZW50RXJyb3IgZG8KLSAgICAgICAgbCA9IEdvb2dsZTo6UHJvdG9idWY6OlJlcGVhdGVkRmllbGQubmV3Ci0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBBcmd1bWVudEVycm9yIGRvCi0gICAgICAgIGwgPSBHb29nbGU6OlByb3RvYnVmOjpSZXBlYXRlZEZpZWxkLm5ldyg6bWVzc2FnZSkKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIEFyZ3VtZW50RXJyb3IgZG8KLSAgICAgICAgbCA9IEdvb2dsZTo6UHJvdG9idWY6OlJlcGVhdGVkRmllbGQubmV3KFsxLCAyLCAzXSkKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIEFyZ3VtZW50RXJyb3IgZG8KLSAgICAgICAgbCA9IEdvb2dsZTo6UHJvdG9idWY6OlJlcGVhdGVkRmllbGQubmV3KDptZXNzYWdlLCBbVGVzdE1lc3NhZ2UyLm5ld10pCi0gICAgICBlbmQKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X3JwdGZpZWxkX2FycmF5X2R1Y2t0eXBpbmcKLSAgICAgIGwgPSBHb29nbGU6OlByb3RvYnVmOjpSZXBlYXRlZEZpZWxkLm5ldyg6aW50MzIpCi0gICAgICBsZW5ndGhfbWV0aG9kcyA9ICV3KGNvdW50IGxlbmd0aCBzaXplKQotICAgICAgbGVuZ3RoX21ldGhvZHMuZWFjaCBkbyB8bG18Ci0gICAgICAgIGFzc2VydCBsLnNlbmQobG0pICA9PSAwCi0gICAgICBlbmQKLSAgICAgICMgb3V0IG9mIGJvdW5kcyByZXR1cm5zIGEgbmlsCi0gICAgICBhc3NlcnQgbFswXSA9PSBuaWwKLSAgICAgIGFzc2VydCBsWzFdID09IG5pbAotICAgICAgYXNzZXJ0IGxbLTFdID09IG5pbAotICAgICAgbC5wdXNoIDQKLSAgICAgIGxlbmd0aF9tZXRob2RzLmVhY2ggZG8gfGxtfAotICAgICAgICBhc3NlcnQgbC5zZW5kKGxtKSA9PSAxCi0gICAgICBlbmQKLSAgICAgIGFzc2VydCBsWzBdID09IDQKLSAgICAgIGFzc2VydCBsWzFdID09IG5pbAotICAgICAgYXNzZXJ0IGxbLTFdID09IDQKLSAgICAgIGFzc2VydCBsWy0yXSA9PSBuaWwKLQotICAgICAgbC5wdXNoIDIKLSAgICAgIGxlbmd0aF9tZXRob2RzLmVhY2ggZG8gfGxtfAotICAgICAgICBhc3NlcnQgbC5zZW5kKGxtKSA9PSAyCi0gICAgICBlbmQKLSAgICAgIGFzc2VydCBsWzBdID09IDQKLSAgICAgIGFzc2VydCBsWzFdID09IDIKLSAgICAgIGFzc2VydCBsWzJdID09IG5pbAotICAgICAgYXNzZXJ0IGxbLTFdID09IDIKLSAgICAgIGFzc2VydCBsWy0yXSA9PSA0Ci0gICAgICBhc3NlcnQgbFstM10gPT0gbmlsCi0KLSAgICAgICNhZGRpbmcgb3V0IG9mIHNjb3BlIHdpbGwgYmFja2ZpbGwgd2l0aCBlbXB0eSBvYmplY3RzCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9tYXBfYmFzaWMKLSAgICAgICMgYWxsb3dlZCBrZXkgdHlwZXM6Ci0gICAgICAjIDppbnQzMiwgOmludDY0LCA6dWludDMyLCA6dWludDY0LCA6Ym9vbCwgOnN0cmluZywgOmJ5dGVzLgotCi0gICAgICBtID0gR29vZ2xlOjpQcm90b2J1Zjo6TWFwLm5ldyg6c3RyaW5nLCA6aW50MzIpCi0gICAgICBtWyJhc2RmIl0gPSAxCi0gICAgICBhc3NlcnQgbVsiYXNkZiJdID09IDEKLSAgICAgIG1bImprbDsiXSA9IDQyCi0gICAgICBhc3NlcnQgbSA9PSB7ICJqa2w7IiA9PiA0MiwgImFzZGYiID0+IDEgfQotICAgICAgYXNzZXJ0IG0uaGFzX2tleT8oImFzZGYiKQotICAgICAgYXNzZXJ0ICFtLmhhc19rZXk/KCJxd2VydHkiKQotICAgICAgYXNzZXJ0IG0ubGVuZ3RoID09IDIKLQotICAgICAgbTIgPSBtLmR1cAotICAgICAgYXNzZXJ0IG0gPT0gbTIKLSAgICAgIGFzc2VydCBtLmhhc2ggIT0gMAotICAgICAgYXNzZXJ0IG0uaGFzaCA9PSBtMi5oYXNoCi0KLSAgICAgIGNvbGxlY3RlZCA9IHt9Ci0gICAgICBtLmVhY2ggeyB8ayx2fCBjb2xsZWN0ZWRbdl0gPSBrIH0KLSAgICAgIGFzc2VydCBjb2xsZWN0ZWQgPT0geyA0MiA9PiAiamtsOyIsIDEgPT4gImFzZGYiIH0KLQotICAgICAgYXNzZXJ0IG0uZGVsZXRlKCJhc2RmIikgPT0gMQotICAgICAgYXNzZXJ0ICFtLmhhc19rZXk/KCJhc2RmIikKLSAgICAgIGFzc2VydCBtWyJhc2RmIl0gPT0gbmlsCi0gICAgICBhc3NlcnQgIW0uaGFzX2tleT8oImFzZGYiKQotCi0gICAgICAjIFdlIG9ubHkgYXNzZXJ0IG9uIGluc3BlY3QgdmFsdWUgd2hlbiB0aGVyZSBpcyBvbmUgbWFwIGVudHJ5IGJlY2F1c2UgdGhlCi0gICAgICAjIG9yZGVyIGluIHdoaWNoIGVsZW1lbnRzIGFwcGVhciBpcyB1bnNwZWNpZmllZCAoZGVwZW5kcyBvbiB0aGUgaW50ZXJuYWwKLSAgICAgICMgaGFzaCBmdW5jdGlvbikuIFdlIGRvbid0IHdhbnQgYSBicml0dGxlIHRlc3QuCi0gICAgICBhc3NlcnQgbS5pbnNwZWN0ID09ICJ7XCJqa2w7XCI9PjQyfSIKLQotICAgICAgYXNzZXJ0IG0ua2V5cyA9PSBbImprbDsiXQotICAgICAgYXNzZXJ0IG0udmFsdWVzID09IFs0Ml0KLQotICAgICAgbS5jbGVhcgotICAgICAgYXNzZXJ0IG0ubGVuZ3RoID09IDAKLSAgICAgIGFzc2VydCBtID09IHt9Ci0KLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbVsxXSA9IDEKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbVsiYXNkZiJdID0gMHgxXzAwMDBfMDAwMAotICAgICAgZW5kCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9tYXBfY3RvcgotICAgICAgbSA9IEdvb2dsZTo6UHJvdG9idWY6Ok1hcC5uZXcoOnN0cmluZywgOmludDMyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyJhIiA9PiAxLCAiYiIgPT4gMiwgImMiID0+IDN9KQotICAgICAgYXNzZXJ0IG0gPT0geyJhIiA9PiAxLCAiYyIgPT4gMywgImIiID0+IDJ9Ci0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9tYXBfa2V5dHlwZXMKLSAgICAgIG0gPSBHb29nbGU6OlByb3RvYnVmOjpNYXAubmV3KDppbnQzMiwgOmludDMyKQotICAgICAgbVsxXSA9IDQyCi0gICAgICBtWy0xXSA9IDQyCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtWzB4ODAwMF8wMDAwXSA9IDEKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtWyJhc2RmIl0gPSAxCi0gICAgICBlbmQKLQotICAgICAgbSA9IEdvb2dsZTo6UHJvdG9idWY6Ok1hcC5uZXcoOmludDY0LCA6aW50MzIpCi0gICAgICBtWzB4MTAwMF8wMDAwXzAwMDBfMDAwMF0gPSAxCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtWzB4MV8wMDAwXzAwMDBfMDAwMF8wMDAwXSA9IDEKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtWyJhc2RmIl0gPSAxCi0gICAgICBlbmQKLQotICAgICAgbSA9IEdvb2dsZTo6UHJvdG9idWY6Ok1hcC5uZXcoOnVpbnQzMiwgOmludDMyKQotICAgICAgbVsweDgwMDBfMDAwMF0gPSAxCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtWzB4MV8wMDAwXzAwMDBdID0gMQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtWy0xXSA9IDEKLSAgICAgIGVuZAotCi0gICAgICBtID0gR29vZ2xlOjpQcm90b2J1Zjo6TWFwLm5ldyg6dWludDY0LCA6aW50MzIpCi0gICAgICBtWzB4ODAwMF8wMDAwXzAwMDBfMDAwMF0gPSAxCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtWzB4MV8wMDAwXzAwMDBfMDAwMF8wMDAwXSA9IDEKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbVstMV0gPSAxCi0gICAgICBlbmQKLQotICAgICAgbSA9IEdvb2dsZTo6UHJvdG9idWY6Ok1hcC5uZXcoOmJvb2wsIDppbnQzMikKLSAgICAgIG1bdHJ1ZV0gPSAxCi0gICAgICBtW2ZhbHNlXSA9IDIKLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbVsxXSA9IDEKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtWyJhc2RmIl0gPSAxCi0gICAgICBlbmQKLQotICAgICAgbSA9IEdvb2dsZTo6UHJvdG9idWY6Ok1hcC5uZXcoOnN0cmluZywgOmludDMyKQotICAgICAgbVsiYXNkZiJdID0gMQotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtWzFdID0gMQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIGJ5dGVzdHJpbmcgPSBbIkZGRkYiXS5wYWNrKCJIKiIpCi0gICAgICAgIG1bYnl0ZXN0cmluZ10gPSAxCi0gICAgICBlbmQKLQotICAgICAgbSA9IEdvb2dsZTo6UHJvdG9idWY6Ok1hcC5uZXcoOmJ5dGVzLCA6aW50MzIpCi0gICAgICBieXRlc3RyaW5nID0gWyJGRkZGIl0ucGFjaygiSCoiKQotICAgICAgbVtieXRlc3RyaW5nXSA9IDEKLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbVsiYXNkZiJdID0gMQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIG1bMV0gPSAxCi0gICAgICBlbmQKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X21hcF9tc2dfZW51bV92YWx1ZXR5cGVzCi0gICAgICBtID0gR29vZ2xlOjpQcm90b2J1Zjo6TWFwLm5ldyg6c3RyaW5nLCA6bWVzc2FnZSwgVGVzdE1lc3NhZ2UpCi0gICAgICBtWyJhc2RmIl0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbVsiamtsOyJdID0gVGVzdE1lc3NhZ2UyLm5ldwotICAgICAgZW5kCi0KLSAgICAgIG0gPSBHb29nbGU6OlByb3RvYnVmOjpNYXAubmV3KAotICAgICAgICA6c3RyaW5nLCA6bWVzc2FnZSwgVGVzdE1lc3NhZ2UsCi0gICAgICAgIHsgImEiID0+IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gNDIpLAotICAgICAgICAgICJiIiA9PiBUZXN0TWVzc2FnZS5uZXcoOm9wdGlvbmFsX2ludDMyID0+IDg0KSB9KQotICAgICAgYXNzZXJ0IG0ubGVuZ3RoID09IDIKLSAgICAgIGFzc2VydCBtLnZhbHVlcy5tYXB7fG1zZ3wgbXNnLm9wdGlvbmFsX2ludDMyfS5zb3J0ID09IFs0MiwgODRdCi0KLSAgICAgIG0gPSBHb29nbGU6OlByb3RvYnVmOjpNYXAubmV3KDpzdHJpbmcsIDplbnVtLCBUZXN0RW51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgIngiID0+IDpBLCAieSIgPT4gOkIsICJ6IiA9PiA6QyB9KQotICAgICAgYXNzZXJ0IG0ubGVuZ3RoID09IDMKLSAgICAgIGFzc2VydCBtWyJ6Il0gPT0gOkMKLSAgICAgIG1bInoiXSA9IDIKLSAgICAgIGFzc2VydCBtWyJ6Il0gPT0gOkIKLSAgICAgIG1bInoiXSA9IDQKLSAgICAgIGFzc2VydCBtWyJ6Il0gPT0gNAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbVsieiJdID0gOloKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBtWyJ6Il0gPSAieiIKLSAgICAgIGVuZAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfbWFwX2R1cF9kZWVwX2NvcHkKLSAgICAgIG0gPSBHb29nbGU6OlByb3RvYnVmOjpNYXAubmV3KAotICAgICAgICA6c3RyaW5nLCA6bWVzc2FnZSwgVGVzdE1lc3NhZ2UsCi0gICAgICAgIHsgImEiID0+IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gNDIpLAotICAgICAgICAgICJiIiA9PiBUZXN0TWVzc2FnZS5uZXcoOm9wdGlvbmFsX2ludDMyID0+IDg0KSB9KQotCi0gICAgICBtMiA9IG0uZHVwCi0gICAgICBhc3NlcnQgbSA9PSBtMgotICAgICAgYXNzZXJ0IG0ub2JqZWN0X2lkICE9IG0yLm9iamVjdF9pZAotICAgICAgYXNzZXJ0IG1bImEiXS5vYmplY3RfaWQgPT0gbTJbImEiXS5vYmplY3RfaWQKLSAgICAgIGFzc2VydCBtWyJiIl0ub2JqZWN0X2lkID09IG0yWyJiIl0ub2JqZWN0X2lkCi0KLSAgICAgIG0yID0gR29vZ2xlOjpQcm90b2J1Zi5kZWVwX2NvcHkobSkKLSAgICAgIGFzc2VydCBtID09IG0yCi0gICAgICBhc3NlcnQgbS5vYmplY3RfaWQgIT0gbTIub2JqZWN0X2lkCi0gICAgICBhc3NlcnQgbVsiYSJdLm9iamVjdF9pZCAhPSBtMlsiYSJdLm9iamVjdF9pZAotICAgICAgYXNzZXJ0IG1bImIiXS5vYmplY3RfaWQgIT0gbTJbImIiXS5vYmplY3RfaWQKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X21hcF9maWVsZAotICAgICAgbSA9IE1hcE1lc3NhZ2UubmV3Ci0gICAgICBhc3NlcnQgbS5tYXBfc3RyaW5nX2ludDMyID09IHt9Ci0gICAgICBhc3NlcnQgbS5tYXBfc3RyaW5nX21zZyA9PSB7fQotCi0gICAgICBtID0gTWFwTWVzc2FnZS5uZXcoCi0gICAgICAgIDptYXBfc3RyaW5nX2ludDMyID0+IHsiYSIgPT4gMSwgImIiID0+IDJ9LAotICAgICAgICA6bWFwX3N0cmluZ19tc2cgPT4geyJhIiA9PiBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgImIiID0+IFRlc3RNZXNzYWdlMi5uZXcoOmZvbyA9PiAyKX0pCi0gICAgICBhc3NlcnQgbS5tYXBfc3RyaW5nX2ludDMyLmtleXMuc29ydCA9PSBbImEiLCAiYiJdCi0gICAgICBhc3NlcnQgbS5tYXBfc3RyaW5nX2ludDMyWyJhIl0gPT0gMQotICAgICAgYXNzZXJ0IG0ubWFwX3N0cmluZ19tc2dbImIiXS5mb28gPT0gMgotCi0gICAgICBtLm1hcF9zdHJpbmdfaW50MzJbImMiXSA9IDMKLSAgICAgIGFzc2VydCBtLm1hcF9zdHJpbmdfaW50MzJbImMiXSA9PSAzCi0gICAgICBtLm1hcF9zdHJpbmdfbXNnWyJjIl0gPSBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMykKLSAgICAgIGFzc2VydCBtLm1hcF9zdHJpbmdfbXNnWyJjIl0gPT0gVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDMpCi0gICAgICBtLm1hcF9zdHJpbmdfbXNnLmRlbGV0ZSgiYiIpCi0gICAgICBtLm1hcF9zdHJpbmdfbXNnLmRlbGV0ZSgiYyIpCi0gICAgICBhc3NlcnQgbS5tYXBfc3RyaW5nX21zZyA9PSB7ICJhIiA9PiBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSkgfQotCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIG0ubWFwX3N0cmluZ19tc2dbImUiXSA9IFRlc3RNZXNzYWdlLm5ldyAjIHdyb25nIHZhbHVlIHR5cGUKLSAgICAgIGVuZAotICAgICAgIyBlbnN1cmUgbm90aGluZyB3YXMgYWRkZWQgYnkgdGhlIGFib3ZlCi0gICAgICBhc3NlcnQgbS5tYXBfc3RyaW5nX21zZyA9PSB7ICJhIiA9PiBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSkgfQotCi0gICAgICBtLm1hcF9zdHJpbmdfaW50MzIgPSBHb29nbGU6OlByb3RvYnVmOjpNYXAubmV3KDpzdHJpbmcsIDppbnQzMikKLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbS5tYXBfc3RyaW5nX2ludDMyID0gR29vZ2xlOjpQcm90b2J1Zjo6TWFwLm5ldyg6c3RyaW5nLCA6aW50NjQpCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBUeXBlRXJyb3IgZG8KLSAgICAgICAgbS5tYXBfc3RyaW5nX2ludDMyID0ge30KLSAgICAgIGVuZAotCi0gICAgICBhc3NlcnRfcmFpc2UgVHlwZUVycm9yIGRvCi0gICAgICAgIG0gPSBNYXBNZXNzYWdlLm5ldyg6bWFwX3N0cmluZ19pbnQzMiA9PiB7IDEgPT4gIkkgYW0gbm90IGEgbnVtYmVyIiB9KQotICAgICAgZW5kCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9tYXBfZW5jb2RlX2RlY29kZQotICAgICAgbSA9IE1hcE1lc3NhZ2UubmV3KAotICAgICAgICA6bWFwX3N0cmluZ19pbnQzMiA9PiB7ImEiID0+IDEsICJiIiA9PiAyfSwKLSAgICAgICAgOm1hcF9zdHJpbmdfbXNnID0+IHsiYSIgPT4gVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiIiA9PiBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMil9KQotICAgICAgbTIgPSBNYXBNZXNzYWdlLmRlY29kZShNYXBNZXNzYWdlLmVuY29kZShtKSkKLSAgICAgIGFzc2VydCBtID09IG0yCi0KLSAgICAgIG0zID0gTWFwTWVzc2FnZVdpcmVFcXVpdi5kZWNvZGUoTWFwTWVzc2FnZS5lbmNvZGUobSkpCi0gICAgICBhc3NlcnQgbTMubWFwX3N0cmluZ19pbnQzMi5sZW5ndGggPT0gMgotCi0gICAgICBrdiA9IHt9Ci0gICAgICBtMy5tYXBfc3RyaW5nX2ludDMyLm1hcCB7IHxtc2d8IGt2W21zZy5rZXldID0gbXNnLnZhbHVlIH0KLSAgICAgIGFzc2VydCBrdiA9PSB7ImEiID0+IDEsICJiIiA9PiAyfQotCi0gICAgICBrdiA9IHt9Ci0gICAgICBtMy5tYXBfc3RyaW5nX21zZy5tYXAgeyB8bXNnfCBrdlttc2cua2V5XSA9IG1zZy52YWx1ZSB9Ci0gICAgICBhc3NlcnQga3YgPT0geyJhIiA9PiBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSksCi0gICAgICAgICAgICAgICAgICAgICJiIiA9PiBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMil9Ci0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9vbmVvZl9kZXNjcmlwdG9ycwotICAgICAgZCA9IE9uZW9mTWVzc2FnZS5kZXNjcmlwdG9yCi0gICAgICBvID0gZC5sb29rdXBfb25lb2YoIm15X29uZW9mIikKLSAgICAgIGFzc2VydCBvICE9IG5pbAotICAgICAgYXNzZXJ0IG8uY2xhc3MgPT0gR29vZ2xlOjpQcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yCi0gICAgICBhc3NlcnQgby5uYW1lID09ICJteV9vbmVvZiIKLSAgICAgIG9uZW9mX2NvdW50ID0gMAotICAgICAgZC5lYWNoX29uZW9meyB8b25lb2Z8Ci0gICAgICAgIG9uZW9mX2NvdW50ICs9IDEKLSAgICAgICAgYXNzZXJ0IG9uZW9mID09IG8KLSAgICAgIH0KLSAgICAgIGFzc2VydCBvbmVvZl9jb3VudCA9PSAxCi0gICAgICBhc3NlcnQgby5jb3VudCA9PSA0Ci0gICAgICBmaWVsZF9uYW1lcyA9IG8ubWFwe3xmfCBmLm5hbWV9LnNvcnQKLSAgICAgIGFzc2VydCBmaWVsZF9uYW1lcyA9PSBbImEiLCAiYiIsICJjIiwgImQiXQotICAgIGVuZAotCi0gICAgZGVmIHRlc3Rfb25lb2YKLSAgICAgIGQgPSBPbmVvZk1lc3NhZ2UubmV3Ci0gICAgICBhc3NlcnQgZC5hID09IG5pbAotICAgICAgYXNzZXJ0IGQuYiA9PSBuaWwKLSAgICAgIGFzc2VydCBkLmMgPT0gbmlsCi0gICAgICBhc3NlcnQgZC5kID09IG5pbAotICAgICAgYXNzZXJ0IGQubXlfb25lb2YgPT0gbmlsCi0KLSAgICAgIGQuYSA9ICJoaSIKLSAgICAgIGFzc2VydCBkLmEgPT0gImhpIgotICAgICAgYXNzZXJ0IGQuYiA9PSBuaWwKLSAgICAgIGFzc2VydCBkLmMgPT0gbmlsCi0gICAgICBhc3NlcnQgZC5kID09IG5pbAotICAgICAgYXNzZXJ0IGQubXlfb25lb2YgPT0gOmEKLQotICAgICAgZC5iID0gNDIKLSAgICAgIGFzc2VydCBkLmEgPT0gbmlsCi0gICAgICBhc3NlcnQgZC5iID09IDQyCi0gICAgICBhc3NlcnQgZC5jID09IG5pbAotICAgICAgYXNzZXJ0IGQuZCA9PSBuaWwKLSAgICAgIGFzc2VydCBkLm15X29uZW9mID09IDpiCi0KLSAgICAgIGQuYyA9IFRlc3RNZXNzYWdlMi5uZXcoOmZvbyA9PiAxMDApCi0gICAgICBhc3NlcnQgZC5hID09IG5pbAotICAgICAgYXNzZXJ0IGQuYiA9PSBuaWwKLSAgICAgIGFzc2VydCBkLmMuZm9vID09IDEwMAotICAgICAgYXNzZXJ0IGQuZCA9PSBuaWwKLSAgICAgIGFzc2VydCBkLm15X29uZW9mID09IDpjCi0KLSAgICAgIGQuZCA9IDpDCi0gICAgICBhc3NlcnQgZC5hID09IG5pbAotICAgICAgYXNzZXJ0IGQuYiA9PSBuaWwKLSAgICAgIGFzc2VydCBkLmMgPT0gbmlsCi0gICAgICBhc3NlcnQgZC5kID09IDpDCi0gICAgICBhc3NlcnQgZC5teV9vbmVvZiA9PSA6ZAotCi0gICAgICBkMiA9IE9uZW9mTWVzc2FnZS5kZWNvZGUoT25lb2ZNZXNzYWdlLmVuY29kZShkKSkKLSAgICAgIGFzc2VydCBkMiA9PSBkCi0KLSAgICAgIGVuY29kZWRfZmllbGRfYSA9IE9uZW9mTWVzc2FnZS5lbmNvZGUoT25lb2ZNZXNzYWdlLm5ldyg6YSA9PiAic3RyaW5nIikpCi0gICAgICBlbmNvZGVkX2ZpZWxkX2IgPSBPbmVvZk1lc3NhZ2UuZW5jb2RlKE9uZW9mTWVzc2FnZS5uZXcoOmIgPT4gMTAwMCkpCi0gICAgICBlbmNvZGVkX2ZpZWxkX2MgPSBPbmVvZk1lc3NhZ2UuZW5jb2RlKAotICAgICAgICBPbmVvZk1lc3NhZ2UubmV3KDpjID0+IFRlc3RNZXNzYWdlMi5uZXcoOmZvbyA9PiAxKSkpCi0gICAgICBlbmNvZGVkX2ZpZWxkX2QgPSBPbmVvZk1lc3NhZ2UuZW5jb2RlKE9uZW9mTWVzc2FnZS5uZXcoOmQgPT4gOkIpKQotCi0gICAgICBkMyA9IE9uZW9mTWVzc2FnZS5kZWNvZGUoCi0gICAgICAgIGVuY29kZWRfZmllbGRfYyArIGVuY29kZWRfZmllbGRfYSArIGVuY29kZWRfZmllbGRfZCkKLSAgICAgIGFzc2VydCBkMy5hID09IG5pbAotICAgICAgYXNzZXJ0IGQzLmIgPT0gbmlsCi0gICAgICBhc3NlcnQgZDMuYyA9PSBuaWwKLSAgICAgIGFzc2VydCBkMy5kID09IDpCCi0KLSAgICAgIGQ0ID0gT25lb2ZNZXNzYWdlLmRlY29kZSgKLSAgICAgICAgZW5jb2RlZF9maWVsZF9jICsgZW5jb2RlZF9maWVsZF9hICsgZW5jb2RlZF9maWVsZF9kICsKLSAgICAgICAgZW5jb2RlZF9maWVsZF9jKQotICAgICAgYXNzZXJ0IGQ0LmEgPT0gbmlsCi0gICAgICBhc3NlcnQgZDQuYiA9PSBuaWwKLSAgICAgIGFzc2VydCBkNC5jLmZvbyA9PSAxCi0gICAgICBhc3NlcnQgZDQuZCA9PSBuaWwKLQotICAgICAgZDUgPSBPbmVvZk1lc3NhZ2UubmV3KDphID0+ICJoZWxsbyIpCi0gICAgICBhc3NlcnQgZDUuYSAhPSBuaWwKLSAgICAgIGQ1LmEgPSBuaWwKLSAgICAgIGFzc2VydCBkNS5hID09IG5pbAotICAgICAgYXNzZXJ0IE9uZW9mTWVzc2FnZS5lbmNvZGUoZDUpID09ICcnCi0gICAgICBhc3NlcnQgZDUubXlfb25lb2YgPT0gbmlsCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9lbnVtX2ZpZWxkCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9lbnVtID09IDpEZWZhdWx0Ci0gICAgICBtLm9wdGlvbmFsX2VudW0gPSA6QQotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfZW51bSA9PSA6QQotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF9lbnVtID0gOkFTREYKLSAgICAgIGVuZAotICAgICAgbS5vcHRpb25hbF9lbnVtID0gMQotICAgICAgYXNzZXJ0IG0ub3B0aW9uYWxfZW51bSA9PSA6QQotICAgICAgbS5vcHRpb25hbF9lbnVtID0gMTAwCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9lbnVtID09IDEwMAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfZHVwCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgICBtLm9wdGlvbmFsX3N0cmluZyA9ICJoZWxsbyIKLSAgICAgIG0ub3B0aW9uYWxfaW50MzIgPSA0MgotICAgICAgdG0xID0gVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDEwMCkKLSAgICAgIHRtMiA9IFRlc3RNZXNzYWdlMi5uZXcoOmZvbyA9PiAyMDApCi0gICAgICBtLnJlcGVhdGVkX21zZy5wdXNoIHRtMQotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfbXNnWy0xXSA9PSB0bTEKLSAgICAgIG0ucmVwZWF0ZWRfbXNnLnB1c2ggdG0yCi0gICAgICBhc3NlcnQgbS5yZXBlYXRlZF9tc2dbLTFdID09IHRtMgotICAgICAgbTIgPSBtLmR1cAotICAgICAgYXNzZXJ0IG0gPT0gbTIKLSAgICAgIG0ub3B0aW9uYWxfaW50MzIgKz0gMQotICAgICAgYXNzZXJ0IG0gIT0gbTIKLSAgICAgIGFzc2VydCBtLnJlcGVhdGVkX21zZ1swXSA9PSBtMi5yZXBlYXRlZF9tc2dbMF0KLSAgICAgIGFzc2VydCBtLnJlcGVhdGVkX21zZ1swXS5vYmplY3RfaWQgPT0gbTIucmVwZWF0ZWRfbXNnWzBdLm9iamVjdF9pZAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfZGVlcF9jb3B5Ci0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3KDpvcHRpb25hbF9pbnQzMiA9PiA0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlcGVhdGVkX21zZyA9PiBbVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDEwMCldKQotICAgICAgbTIgPSBHb29nbGU6OlByb3RvYnVmLmRlZXBfY29weShtKQotICAgICAgYXNzZXJ0IG0gPT0gbTIKLSAgICAgIGFzc2VydCBtLnJlcGVhdGVkX21zZyA9PSBtMi5yZXBlYXRlZF9tc2cKLSAgICAgIGFzc2VydCBtLnJlcGVhdGVkX21zZy5vYmplY3RfaWQgIT0gbTIucmVwZWF0ZWRfbXNnLm9iamVjdF9pZAotICAgICAgYXNzZXJ0IG0ucmVwZWF0ZWRfbXNnWzBdLm9iamVjdF9pZCAhPSBtMi5yZXBlYXRlZF9tc2dbMF0ub2JqZWN0X2lkCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9lcQotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gNDIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXBlYXRlZF9pbnQzMiA9PiBbMSwgMiwgM10pCi0gICAgICBtMiA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gNDMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVwZWF0ZWRfaW50MzIgPT4gWzEsIDIsIDNdKQotICAgICAgYXNzZXJ0IG0gIT0gbTIKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X2VudW1fbG9va3VwCi0gICAgICBhc3NlcnQgVGVzdEVudW06OkEgPT0gMQotICAgICAgYXNzZXJ0IFRlc3RFbnVtOjpCID09IDIKLSAgICAgIGFzc2VydCBUZXN0RW51bTo6QyA9PSAzCi0KLSAgICAgIGFzc2VydCBUZXN0RW51bTo6bG9va3VwKDEpID09IDpBCi0gICAgICBhc3NlcnQgVGVzdEVudW06Omxvb2t1cCgyKSA9PSA6QgotICAgICAgYXNzZXJ0IFRlc3RFbnVtOjpsb29rdXAoMykgPT0gOkMKLQotICAgICAgYXNzZXJ0IFRlc3RFbnVtOjpyZXNvbHZlKDpBKSA9PSAxCi0gICAgICBhc3NlcnQgVGVzdEVudW06OnJlc29sdmUoOkIpID09IDIKLSAgICAgIGFzc2VydCBUZXN0RW51bTo6cmVzb2x2ZSg6QykgPT0gMwotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcGFyc2Vfc2VyaWFsaXplCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3KDpvcHRpb25hbF9pbnQzMiA9PiA0MiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wdGlvbmFsX3N0cmluZyA9PiAiaGVsbG8gd29ybGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6b3B0aW9uYWxfZW51bSA9PiA6QiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlcGVhdGVkX3N0cmluZyA9PiBbImEiLCAiYiIsICJjIl0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXBlYXRlZF9pbnQzMiA9PiBbNDIsIDQzLCA0NF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXBlYXRlZF9lbnVtID0+IFs6QSwgOkIsIDpDLCAxMDBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVwZWF0ZWRfbXNnID0+IFtUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RNZXNzYWdlMi5uZXcoOmZvbyA9PiAyKV0pCi0gICAgICBkYXRhID0gVGVzdE1lc3NhZ2UuZW5jb2RlIG0KLSAgICAgIG0yID0gVGVzdE1lc3NhZ2UuZGVjb2RlIGRhdGEKLSAgICAgIGFzc2VydCBtID09IG0yCi0KLSAgICAgIGRhdGEgPSBHb29nbGU6OlByb3RvYnVmLmVuY29kZSBtCi0gICAgICBtMiA9IEdvb2dsZTo6UHJvdG9idWYuZGVjb2RlKFRlc3RNZXNzYWdlLCBkYXRhKQotICAgICAgYXNzZXJ0IG0gPT0gbTIKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X2VuY29kZV9kZWNvZGVfaGVscGVycwotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfc3RyaW5nID0+ICdmb28nLCA6cmVwZWF0ZWRfc3RyaW5nID0+IFsnYmFyMScsICdiYXIyJ10pCi0gICAgICBqc29uID0gbS50b19qc29uCi0gICAgICBtMiA9IFRlc3RNZXNzYWdlLmRlY29kZV9qc29uKGpzb24pCi0gICAgICBhc3NlcnQgbTIub3B0aW9uYWxfc3RyaW5nID09ICdmb28nCi0gICAgICBhc3NlcnQgbTIucmVwZWF0ZWRfc3RyaW5nID09IFsnYmFyMScsICdiYXIyJ10KLQotICAgICAgcHJvdG8gPSBtLnRvX3Byb3RvCi0gICAgICBtMiA9IFRlc3RNZXNzYWdlLmRlY29kZShwcm90bykKLSAgICAgIGFzc2VydCBtMi5vcHRpb25hbF9zdHJpbmcgPT0gJ2ZvbycKLSAgICAgIGFzc2VydCBtMi5yZXBlYXRlZF9zdHJpbmcgPT0gWydiYXIxJywgJ2JhcjInXQotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcHJvdG9idWZfZW5jb2RlX2RlY29kZV9oZWxwZXJzCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3KDpvcHRpb25hbF9zdHJpbmcgPT4gJ2ZvbycsIDpyZXBlYXRlZF9zdHJpbmcgPT4gWydiYXIxJywgJ2JhcjInXSkKLSAgICAgIGVuY29kZWRfbXNnID0gR29vZ2xlOjpQcm90b2J1Zi5lbmNvZGUobSkKLSAgICAgIGFzc2VydF9lcXVhbCBtLnRvX3Byb3RvLCBlbmNvZGVkX21zZwotCi0gICAgICBkZWNvZGVkX21zZyA9IEdvb2dsZTo6UHJvdG9idWYuZGVjb2RlKFRlc3RNZXNzYWdlLCBlbmNvZGVkX21zZykKLSAgICAgIGFzc2VydF9lcXVhbCBUZXN0TWVzc2FnZS5kZWNvZGUobS50b19wcm90byksIGRlY29kZWRfbXNnCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9wcm90b2J1Zl9lbmNvZGVfZGVjb2RlX2pzb25faGVscGVycwotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfc3RyaW5nID0+ICdmb28nLCA6cmVwZWF0ZWRfc3RyaW5nID0+IFsnYmFyMScsICdiYXIyJ10pCi0gICAgICBlbmNvZGVkX21zZyA9IEdvb2dsZTo6UHJvdG9idWYuZW5jb2RlX2pzb24obSkKLSAgICAgIGFzc2VydF9lcXVhbCBtLnRvX2pzb24sIGVuY29kZWRfbXNnCi0KLSAgICAgIGRlY29kZWRfbXNnID0gR29vZ2xlOjpQcm90b2J1Zi5kZWNvZGVfanNvbihUZXN0TWVzc2FnZSwgZW5jb2RlZF9tc2cpCi0gICAgICBhc3NlcnRfZXF1YWwgVGVzdE1lc3NhZ2UuZGVjb2RlX2pzb24obS50b19qc29uKSwgZGVjb2RlZF9tc2cKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X3RvX2gKLSAgICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcoOm9wdGlvbmFsX2Jvb2wgPT4gdHJ1ZSwgOm9wdGlvbmFsX2RvdWJsZSA9PiAtMTAuMTAwMDAxLCA6b3B0aW9uYWxfc3RyaW5nID0+ICdmb28nLCA6cmVwZWF0ZWRfc3RyaW5nID0+IFsnYmFyMScsICdiYXIyJ10pCi0gICAgICBleHBlY3RlZF9yZXN1bHQgPSB7Ci0gICAgICAgIDpvcHRpb25hbF9ib29sPT50cnVlLAotICAgICAgICA6b3B0aW9uYWxfYnl0ZXM9PiIiLAotICAgICAgICA6b3B0aW9uYWxfZG91YmxlPT4tMTAuMTAwMDAxLAotICAgICAgICA6b3B0aW9uYWxfZW51bT0+OkRlZmF1bHQsCi0gICAgICAgIDpvcHRpb25hbF9mbG9hdD0+MC4wLAotICAgICAgICA6b3B0aW9uYWxfaW50MzI9PjAsCi0gICAgICAgIDpvcHRpb25hbF9pbnQ2ND0+MCwKLSAgICAgICAgOm9wdGlvbmFsX21zZz0+bmlsLAotICAgICAgICA6b3B0aW9uYWxfc3RyaW5nPT4iZm9vIiwKLSAgICAgICAgOm9wdGlvbmFsX3VpbnQzMj0+MCwKLSAgICAgICAgOm9wdGlvbmFsX3VpbnQ2ND0+MCwKLSAgICAgICAgOnJlcGVhdGVkX2Jvb2w9PltdLAotICAgICAgICA6cmVwZWF0ZWRfYnl0ZXM9PltdLAotICAgICAgICA6cmVwZWF0ZWRfZG91YmxlPT5bXSwKLSAgICAgICAgOnJlcGVhdGVkX2VudW09PltdLAotICAgICAgICA6cmVwZWF0ZWRfZmxvYXQ9PltdLAotICAgICAgICA6cmVwZWF0ZWRfaW50MzI9PltdLAotICAgICAgICA6cmVwZWF0ZWRfaW50NjQ9PltdLAotICAgICAgICA6cmVwZWF0ZWRfbXNnPT5bXSwKLSAgICAgICAgOnJlcGVhdGVkX3N0cmluZz0+WyJiYXIxIiwgImJhcjIiXSwKLSAgICAgICAgOnJlcGVhdGVkX3VpbnQzMj0+W10sCi0gICAgICAgIDpyZXBlYXRlZF91aW50NjQ9PltdCi0gICAgICB9Ci0gICAgICBhc3NlcnRfZXF1YWwgZXhwZWN0ZWRfcmVzdWx0LCBtLnRvX2gKLSAgICBlbmQKLQotCi0gICAgZGVmIHRlc3RfZGVmX2Vycm9ycwotICAgICAgcyA9IEdvb2dsZTo6UHJvdG9idWY6OkRlc2NyaXB0b3JQb29sLm5ldwotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBzLmJ1aWxkIGRvCi0gICAgICAgICAgIyBlbnVtIHdpdGggbm8gZGVmYXVsdCAoaW50ZWdlciB2YWx1ZSAwKQotICAgICAgICAgIGFkZF9lbnVtICJNeUVudW0iIGRvCi0gICAgICAgICAgICB2YWx1ZSA6QSwgMQotICAgICAgICAgIGVuZAotICAgICAgICBlbmQKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFR5cGVFcnJvciBkbwotICAgICAgICBzLmJ1aWxkIGRvCi0gICAgICAgICAgIyBtZXNzYWdlIHdpdGggcmVxdWlyZWQgZmllbGQgKHVuc3VwcG9ydGVkIGluIHByb3RvMykKLSAgICAgICAgICBhZGRfbWVzc2FnZSAiTXlNZXNzYWdlIiBkbwotICAgICAgICAgICAgcmVxdWlyZWQgOmZvbywgOmludDMyLCAxCi0gICAgICAgICAgZW5kCi0gICAgICAgIGVuZAotICAgICAgZW5kCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9jb3JlY3Vyc2l2ZQotICAgICAgIyBqdXN0IGJlIHN1cmUgdGhhdCB3ZSBjYW4gaW5zdGFudGlhdGUgdHlwZXMgd2l0aCBjb3JlY3Vyc2l2ZSBmaWVsZC10eXBlCi0gICAgICAjIHJlZmVyZW5jZXMuCi0gICAgICBtID0gUmVjdXJzaXZlMS5uZXcoOmZvbyA9PiBSZWN1cnNpdmUyLm5ldyg6Zm9vID0+IFJlY3Vyc2l2ZTEubmV3KSkKLSAgICAgIGFzc2VydCBSZWN1cnNpdmUxLmRlc2NyaXB0b3IubG9va3VwKCJmb28iKS5zdWJ0eXBlID09Ci0gICAgICAgIFJlY3Vyc2l2ZTIuZGVzY3JpcHRvcgotICAgICAgYXNzZXJ0IFJlY3Vyc2l2ZTIuZGVzY3JpcHRvci5sb29rdXAoImZvbyIpLnN1YnR5cGUgPT0KLSAgICAgICAgUmVjdXJzaXZlMS5kZXNjcmlwdG9yCi0KLSAgICAgIHNlcmlhbGl6ZWQgPSBSZWN1cnNpdmUxLmVuY29kZShtKQotICAgICAgbTIgPSBSZWN1cnNpdmUxLmRlY29kZShzZXJpYWxpemVkKQotICAgICAgYXNzZXJ0IG0gPT0gbTIKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X3NlcmlhbGl6ZV9jeWNsZQotICAgICAgbSA9IFJlY3Vyc2l2ZTEubmV3KDpmb28gPT4gUmVjdXJzaXZlMi5uZXcpCi0gICAgICBtLmZvby5mb28gPSBtCi0gICAgICBhc3NlcnRfcmFpc2UgUnVudGltZUVycm9yIGRvCi0gICAgICAgIHNlcmlhbGl6ZWQgPSBSZWN1cnNpdmUxLmVuY29kZShtKQotICAgICAgZW5kCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9iYWRfZmllbGRfbmFtZXMKLSAgICAgIG0gPSBCYWRGaWVsZE5hbWVzLm5ldyg6ZHVwID0+IDEsIDpjbGFzcyA9PiAyKQotICAgICAgbTIgPSBtLmR1cAotICAgICAgYXNzZXJ0IG0gPT0gbTIKLSAgICAgIGFzc2VydCBtWydkdXAnXSA9PSAxCi0gICAgICBhc3NlcnQgbVsnY2xhc3MnXSA9PSAyCi0gICAgICBtWydkdXAnXSA9IDMKLSAgICAgIGFzc2VydCBtWydkdXAnXSA9PSAzCi0gICAgICBtWydhLmInXSA9IDQKLSAgICAgIGFzc2VydCBtWydhLmInXSA9PSA0Ci0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9pbnRfcmFuZ2VzCi0gICAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0KLSAgICAgIG0ub3B0aW9uYWxfaW50MzIgPSAwCi0gICAgICBtLm9wdGlvbmFsX2ludDMyID0gLTB4ODAwMF8wMDAwCi0gICAgICBtLm9wdGlvbmFsX2ludDMyID0gKzB4N2ZmZl9mZmZmCi0gICAgICBtLm9wdGlvbmFsX2ludDMyID0gMS4wCi0gICAgICBtLm9wdGlvbmFsX2ludDMyID0gLTEuMAotICAgICAgbS5vcHRpb25hbF9pbnQzMiA9IDJlOQotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF9pbnQzMiA9IC0weDgwMDBfMDAwMQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX2ludDMyID0gKzB4ODAwMF8wMDAwCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfaW50MzIgPSArMHgxMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMCAjIGZvcmNlIEJpZ251bQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX2ludDMyID0gMWUxMgotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX2ludDMyID0gMS41Ci0gICAgICBlbmQKLQotICAgICAgbS5vcHRpb25hbF91aW50MzIgPSAwCi0gICAgICBtLm9wdGlvbmFsX3VpbnQzMiA9ICsweGZmZmZfZmZmZgotICAgICAgbS5vcHRpb25hbF91aW50MzIgPSAxLjAKLSAgICAgIG0ub3B0aW9uYWxfdWludDMyID0gNGU5Ci0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3VpbnQzMiA9IC0xCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfdWludDMyID0gLTEuNQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3VpbnQzMiA9IC0xLjVlMTIKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF91aW50MzIgPSAtMHgxMDAwXzAwMDBfMDAwMF8wMDAwCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfdWludDMyID0gKzB4MV8wMDAwXzAwMDAKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF91aW50MzIgPSArMHgxMDAwXzAwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMCAjIGZvcmNlIEJpZ251bQotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3VpbnQzMiA9IDFlMTIKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF91aW50MzIgPSAxLjUKLSAgICAgIGVuZAotCi0gICAgICBtLm9wdGlvbmFsX2ludDY0ID0gMAotICAgICAgbS5vcHRpb25hbF9pbnQ2NCA9IC0weDgwMDBfMDAwMF8wMDAwXzAwMDAKLSAgICAgIG0ub3B0aW9uYWxfaW50NjQgPSArMHg3ZmZmX2ZmZmZfZmZmZl9mZmZmCi0gICAgICBtLm9wdGlvbmFsX2ludDY0ID0gMS4wCi0gICAgICBtLm9wdGlvbmFsX2ludDY0ID0gLTEuMAotICAgICAgbS5vcHRpb25hbF9pbnQ2NCA9IDhlMTgKLSAgICAgIG0ub3B0aW9uYWxfaW50NjQgPSAtOGUxOAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF9pbnQ2NCA9IC0weDgwMDBfMDAwMF8wMDAwXzAwMDEKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF9pbnQ2NCA9ICsweDgwMDBfMDAwMF8wMDAwXzAwMDAKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF9pbnQ2NCA9ICsweDEwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwICMgZm9yY2UgQmlnbnVtCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfaW50NjQgPSAxZTUwCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfaW50NjQgPSAxLjUKLSAgICAgIGVuZAotCi0gICAgICBtLm9wdGlvbmFsX3VpbnQ2NCA9IDAKLSAgICAgIG0ub3B0aW9uYWxfdWludDY0ID0gKzB4ZmZmZl9mZmZmX2ZmZmZfZmZmZgotICAgICAgbS5vcHRpb25hbF91aW50NjQgPSAxLjAKLSAgICAgIG0ub3B0aW9uYWxfdWludDY0ID0gMTZlMTgKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfdWludDY0ID0gLTEKLSAgICAgIGVuZAotICAgICAgYXNzZXJ0X3JhaXNlIFJhbmdlRXJyb3IgZG8KLSAgICAgICAgbS5vcHRpb25hbF91aW50NjQgPSAtMS41Ci0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfdWludDY0ID0gLTEuNWUxMgotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3VpbnQ2NCA9IC0weDFfMDAwMF8wMDAwXzAwMDBfMDAwMAotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3VpbnQ2NCA9ICsweDFfMDAwMF8wMDAwXzAwMDBfMDAwMAotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3VpbnQ2NCA9ICsweDEwMDBfMDAwMF8wMDAwXzAwMDBfMDAwMF8wMDAwICMgZm9yY2UgQmlnbnVtCi0gICAgICBlbmQKLSAgICAgIGFzc2VydF9yYWlzZSBSYW5nZUVycm9yIGRvCi0gICAgICAgIG0ub3B0aW9uYWxfdWludDY0ID0gMWU1MAotICAgICAgZW5kCi0gICAgICBhc3NlcnRfcmFpc2UgUmFuZ2VFcnJvciBkbwotICAgICAgICBtLm9wdGlvbmFsX3VpbnQ2NCA9IDEuNQotICAgICAgZW5kCi0gICAgZW5kCi0KLSAgICBkZWYgdGVzdF9zdHJlc3NfdGVzdAotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgICAgbS5vcHRpb25hbF9pbnQzMiA9IDQyCi0gICAgICBtLm9wdGlvbmFsX2ludDY0ID0gMHgxMDAwMDAwMDAKLSAgICAgIG0ub3B0aW9uYWxfc3RyaW5nID0gImhlbGxvIHdvcmxkIgotICAgICAgMTAudGltZXMgZG8gbS5yZXBlYXRlZF9tc2cucHVzaCBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gNDIpIGVuZAotICAgICAgMTAudGltZXMgZG8gbS5yZXBlYXRlZF9zdHJpbmcucHVzaCAiaGVsbG8gd29ybGQiIGVuZAotCi0gICAgICBkYXRhID0gVGVzdE1lc3NhZ2UuZW5jb2RlKG0pCi0KLSAgICAgIGwgPSAwCi0gICAgICAxMF8wMDAudGltZXMgZG8KLSAgICAgICAgbSA9IFRlc3RNZXNzYWdlLmRlY29kZShkYXRhKQotICAgICAgICBkYXRhX25ldyA9IFRlc3RNZXNzYWdlLmVuY29kZShtKQotICAgICAgICBhc3NlcnQgZGF0YV9uZXcgPT0gZGF0YQotICAgICAgICBkYXRhID0gZGF0YV9uZXcKLSAgICAgIGVuZAotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfcmVmbGVjdGlvbgotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gMTIzNCkKLSAgICAgIG1zZ2RlZiA9IG0uY2xhc3MuZGVzY3JpcHRvcgotICAgICAgYXNzZXJ0IG1zZ2RlZi5jbGFzcyA9PSBHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yCi0gICAgICBhc3NlcnQgbXNnZGVmLmFueT8ge3xmaWVsZHwgZmllbGQubmFtZSA9PSAib3B0aW9uYWxfaW50MzIifQotICAgICAgb3B0aW9uYWxfaW50MzIgPSBtc2dkZWYubG9va3VwICJvcHRpb25hbF9pbnQzMiIKLSAgICAgIGFzc2VydCBvcHRpb25hbF9pbnQzMi5jbGFzcyA9PSBHb29nbGU6OlByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IKLSAgICAgIGFzc2VydCBvcHRpb25hbF9pbnQzMiAhPSBuaWwKLSAgICAgIGFzc2VydCBvcHRpb25hbF9pbnQzMi5uYW1lID09ICJvcHRpb25hbF9pbnQzMiIKLSAgICAgIGFzc2VydCBvcHRpb25hbF9pbnQzMi50eXBlID09IDppbnQzMgotICAgICAgb3B0aW9uYWxfaW50MzIuc2V0KG0sIDU2NzgpCi0gICAgICBhc3NlcnQgbS5vcHRpb25hbF9pbnQzMiA9PSA1Njc4Ci0gICAgICBtLm9wdGlvbmFsX2ludDMyID0gMTAwMAotICAgICAgYXNzZXJ0IG9wdGlvbmFsX2ludDMyLmdldChtKSA9PSAxMDAwCi0KLSAgICAgIG9wdGlvbmFsX21zZyA9IG1zZ2RlZi5sb29rdXAgIm9wdGlvbmFsX21zZyIKLSAgICAgIGFzc2VydCBvcHRpb25hbF9tc2cuc3VidHlwZSA9PSBUZXN0TWVzc2FnZTIuZGVzY3JpcHRvcgotCi0gICAgICBvcHRpb25hbF9tc2cuc2V0KG0sIG9wdGlvbmFsX21zZy5zdWJ0eXBlLm1zZ2NsYXNzLm5ldykKLQotICAgICAgYXNzZXJ0IG1zZ2RlZi5tc2djbGFzcyA9PSBUZXN0TWVzc2FnZQotCi0gICAgICBvcHRpb25hbF9lbnVtID0gbXNnZGVmLmxvb2t1cCAib3B0aW9uYWxfZW51bSIKLSAgICAgIGFzc2VydCBvcHRpb25hbF9lbnVtLnN1YnR5cGUgPT0gVGVzdEVudW0uZGVzY3JpcHRvcgotICAgICAgYXNzZXJ0IG9wdGlvbmFsX2VudW0uc3VidHlwZS5jbGFzcyA9PSBHb29nbGU6OlByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcgotICAgICAgb3B0aW9uYWxfZW51bS5zdWJ0eXBlLmVhY2ggZG8gfGssIHZ8Ci0gICAgICAgICMgc2V0IHdpdGggaW50ZWdlciwgY2hlY2sgcmVzb2x1dGlvbiB0byBzeW1ib2xpYyBuYW1lCi0gICAgICAgIG9wdGlvbmFsX2VudW0uc2V0KG0sIHYpCi0gICAgICAgIGFzc2VydCBvcHRpb25hbF9lbnVtLmdldChtKSA9PSBrCi0gICAgICBlbmQKLSAgICBlbmQKLQotICAgIGRlZiB0ZXN0X2pzb24KLSAgICAgICMgVE9ETzogRml4IEpTT04gaW4gSlJ1YnkgdmVyc2lvbi4KLSAgICAgIHJldHVybiBpZiBSVUJZX1BMQVRGT1JNID09ICJqYXZhIgotICAgICAgbSA9IFRlc3RNZXNzYWdlLm5ldyg6b3B0aW9uYWxfaW50MzIgPT4gMTIzNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wdGlvbmFsX2ludDY0ID0+IC0weDFfMDAwMF8wMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6b3B0aW9uYWxfdWludDMyID0+IDB4ODAwMF8wMDAwLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6b3B0aW9uYWxfdWludDY0ID0+IDB4ZmZmZl9mZmZmX2ZmZmZfZmZmZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wdGlvbmFsX2Jvb2wgPT4gdHJ1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wdGlvbmFsX2Zsb2F0ID0+IDEuMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wdGlvbmFsX2RvdWJsZSA9PiAtMWUxMDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpvcHRpb25hbF9zdHJpbmcgPT4gIlRlc3Qgc3RyaW5nIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOm9wdGlvbmFsX2J5dGVzID0+IFsiRkZGRkZGRkYiXS5wYWNrKCdIKicpLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6b3B0aW9uYWxfbXNnID0+IFRlc3RNZXNzYWdlMi5uZXcoOmZvbyA9PiA0MiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXBlYXRlZF9pbnQzMiA9PiBbMSwgMiwgMywgNF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIDpyZXBlYXRlZF9zdHJpbmcgPT4gWyJhIiwgImIiLCAiYyJdLAotICAgICAgICAgICAgICAgICAgICAgICAgICA6cmVwZWF0ZWRfYm9vbCA9PiBbdHJ1ZSwgZmFsc2UsIHRydWUsIGZhbHNlXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgOnJlcGVhdGVkX21zZyA9PiBbVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMildKQotCi0gICAgICBqc29uX3RleHQgPSBUZXN0TWVzc2FnZS5lbmNvZGVfanNvbihtKQotICAgICAgbTIgPSBUZXN0TWVzc2FnZS5kZWNvZGVfanNvbihqc29uX3RleHQpCi0gICAgICBhc3NlcnQgbSA9PSBtMgotCi0gICAgICAjIENyYXNoIGNhc2UgZnJvbSBHaXRIdWIgaXNzdWUgMjgzLgotICAgICAgYmFyID0gQmFyLm5ldyhtc2c6ICJiYXIiKQotICAgICAgYmF6MSA9IEJhei5uZXcobXNnOiAiYmF6IikKLSAgICAgIGJhejIgPSBCYXoubmV3KG1zZzogInF1dXgiKQotICAgICAgRm9vLmVuY29kZV9qc29uKEZvby5uZXcpCi0gICAgICBGb28uZW5jb2RlX2pzb24oRm9vLm5ldyhiYXI6IGJhcikpCi0gICAgICBGb28uZW5jb2RlX2pzb24oRm9vLm5ldyhiYXI6IGJhciwgYmF6OiBbYmF6MSwgYmF6Ml0pKQotICAgIGVuZAotCi0gICAgZGVmIHRlc3RfanNvbl9tYXBzCi0gICAgICAjIFRPRE86IEZpeCBKU09OIGluIEpSdWJ5IHZlcnNpb24uCi0gICAgICByZXR1cm4gaWYgUlVCWV9QTEFURk9STSA9PSAiamF2YSIKLSAgICAgIG0gPSBNYXBNZXNzYWdlLm5ldyg6bWFwX3N0cmluZ19pbnQzMiA9PiB7ImEiID0+IDF9KQotICAgICAgZXhwZWN0ZWQgPSAneyJtYXBTdHJpbmdJbnQzMiI6eyJhIjoxfSwibWFwU3RyaW5nTXNnIjp7fX0nCi0gICAgICBleHBlY3RlZF9wcmVzZXJ2ZSA9ICd7Im1hcF9zdHJpbmdfaW50MzIiOnsiYSI6MX0sIm1hcF9zdHJpbmdfbXNnIjp7fX0nCi0gICAgICBhc3NlcnQgTWFwTWVzc2FnZS5lbmNvZGVfanNvbihtKSA9PSBleHBlY3RlZAotCi0gICAgICBqc29uID0gTWFwTWVzc2FnZS5lbmNvZGVfanNvbihtLCA6cHJlc2VydmVfcHJvdG9fZmllbGRuYW1lcyA9PiB0cnVlKQotICAgICAgYXNzZXJ0IGpzb24gPT0gZXhwZWN0ZWRfcHJlc2VydmUKLQotICAgICAgbTIgPSBNYXBNZXNzYWdlLmRlY29kZV9qc29uKE1hcE1lc3NhZ2UuZW5jb2RlX2pzb24obSkpCi0gICAgICBhc3NlcnQgbSA9PSBtMgotICAgIGVuZAotICBlbmQKLWVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS90ZXN0cy9nZW5lcmF0ZWRfY29kZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvdGVzdHMvZ2VuZXJhdGVkX2NvZGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQyZDgyYTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS90ZXN0cy9nZW5lcmF0ZWRfY29kZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDY3ICswLDAgQEAKLXN5bnRheCA9ICJwcm90bzMiOwotCi1wYWNrYWdlIEEuQi5DOwotCi1tZXNzYWdlIFRlc3RNZXNzYWdlIHsKLSAgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAxOwotICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCA9IDI7Ci0gIHVpbnQzMiBvcHRpb25hbF91aW50MzIgPSAzOwotICB1aW50NjQgb3B0aW9uYWxfdWludDY0ID0gNDsKLSAgYm9vbCBvcHRpb25hbF9ib29sID0gNTsKLSAgZG91YmxlIG9wdGlvbmFsX2RvdWJsZSA9IDY7Ci0gIGZsb2F0IG9wdGlvbmFsX2Zsb2F0ID0gNzsKLSAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZyA9IDg7Ci0gIGJ5dGVzIG9wdGlvbmFsX2J5dGVzID0gOTsKLSAgVGVzdEVudW0gb3B0aW9uYWxfZW51bSA9IDEwOwotICBUZXN0TWVzc2FnZSBvcHRpb25hbF9tc2cgPSAxMTsKLQotICByZXBlYXRlZCBpbnQzMiByZXBlYXRlZF9pbnQzMiA9IDIxOwotICByZXBlYXRlZCBpbnQ2NCByZXBlYXRlZF9pbnQ2NCA9IDIyOwotICByZXBlYXRlZCB1aW50MzIgcmVwZWF0ZWRfdWludDMyID0gMjM7Ci0gIHJlcGVhdGVkIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgPSAyNDsKLSAgcmVwZWF0ZWQgYm9vbCByZXBlYXRlZF9ib29sID0gMjU7Ci0gIHJlcGVhdGVkIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgPSAyNjsKLSAgcmVwZWF0ZWQgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgPSAyNzsKLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZyA9IDI4OwotICByZXBlYXRlZCBieXRlcyByZXBlYXRlZF9ieXRlcyA9IDI5OwotICByZXBlYXRlZCBUZXN0RW51bSByZXBlYXRlZF9lbnVtID0gMzA7Ci0gIHJlcGVhdGVkIFRlc3RNZXNzYWdlIHJlcGVhdGVkX21zZyA9IDMxOwotCi0gIG9uZW9mIG15X29uZW9mIHsKLSAgICBpbnQzMiBvbmVvZl9pbnQzMiA9IDQxOwotICAgIGludDY0IG9uZW9mX2ludDY0ID0gNDI7Ci0gICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDQzOwotICAgIHVpbnQ2NCBvbmVvZl91aW50NjQgPSA0NDsKLSAgICBib29sIG9uZW9mX2Jvb2wgPSA0NTsKLSAgICBkb3VibGUgb25lb2ZfZG91YmxlID0gNDY7Ci0gICAgZmxvYXQgb25lb2ZfZmxvYXQgPSA0NzsKLSAgICBzdHJpbmcgb25lb2Zfc3RyaW5nID0gNDg7Ci0gICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSA0OTsKLSAgICBUZXN0RW51bSBvbmVvZl9lbnVtID0gNTA7Ci0gICAgVGVzdE1lc3NhZ2Ugb25lb2ZfbXNnID0gNTE7Ci0gIH0KLQotICBtYXA8aW50MzIsIHN0cmluZz4gbWFwX2ludDMyX3N0cmluZyA9IDYxOwotICBtYXA8aW50NjQsIHN0cmluZz4gbWFwX2ludDY0X3N0cmluZyA9IDYyOwotICBtYXA8dWludDMyLCBzdHJpbmc+IG1hcF91aW50MzJfc3RyaW5nID0gNjM7Ci0gIG1hcDx1aW50NjQsIHN0cmluZz4gbWFwX3VpbnQ2NF9zdHJpbmcgPSA2NDsKLSAgbWFwPGJvb2wsIHN0cmluZz4gbWFwX2Jvb2xfc3RyaW5nID0gNjU7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gbWFwX3N0cmluZ19zdHJpbmcgPSA2NjsKLSAgbWFwPHN0cmluZywgVGVzdE1lc3NhZ2U+IG1hcF9zdHJpbmdfbXNnID0gNjc7Ci0gIG1hcDxzdHJpbmcsIFRlc3RFbnVtPiBtYXBfc3RyaW5nX2VudW0gPSA2ODsKLSAgbWFwPHN0cmluZywgaW50MzI+IG1hcF9zdHJpbmdfaW50MzIgPSA2OTsKLSAgbWFwPHN0cmluZywgYm9vbD4gbWFwX3N0cmluZ19ib29sID0gNzA7Ci0KLSAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKLSAgICBpbnQzMiBmb28gPSAxOwotICB9Ci0KLSAgTmVzdGVkTWVzc2FnZSBuZXN0ZWRfbWVzc2FnZSA9IDgwOwotfQotCi1lbnVtIFRlc3RFbnVtIHsKLSAgRGVmYXVsdCA9IDA7Ci0gIEEgPSAxOwotICBCID0gMjsKLSAgQyA9IDM7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3Rlc3RzL2dlbmVyYXRlZF9jb2RlX3Rlc3QucmIgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3Rlc3RzL2dlbmVyYXRlZF9jb2RlX3Rlc3QucmIKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhZWYzNTcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS90ZXN0cy9nZW5lcmF0ZWRfY29kZV90ZXN0LnJiCisrKyAvZGV2L251bGwKQEAgLTEsMTcgKzAsMCBAQAotIyEvdXNyL2Jpbi9ydWJ5Ci0KLSMgZ2VuZXJhdGVkX2NvZGUucmIgaXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IGFzIHRoaXMgdGVzdC4KLSRMT0FEX1BBVEgudW5zaGlmdChGaWxlLmV4cGFuZF9wYXRoKEZpbGUuZGlybmFtZShfX0ZJTEVfXykpKQotCi1yZXF1aXJlICdnZW5lcmF0ZWRfY29kZScKLXJlcXVpcmUgJ3Rlc3QvdW5pdCcKLQotY2xhc3MgR2VuZXJhdGVkQ29kZVRlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICBkZWYgdGVzdF9nZW5lcmF0ZWRfbXNnCi0gICAgIyBqdXN0IHRlc3QgdGhhdCB3ZSBjYW4gaW5zdGFudGlhdGUgdGhlIG1lc3NhZ2UuIFRoZSBwdXJwb3NlIG9mIHRoaXMgdGVzdAotICAgICMgaXMgdG8gZW5zdXJlIHRoYXQgdGhlIG91dHB1dCBvZiB0aGUgY29kZSBnZW5lcmF0b3IgaXMgdmFsaWQgUnVieSBhbmQKLSAgICAjIHN1Y2Nlc3NmdWxseSBjcmVhdGVzIG1lc3NhZ2UgZGVmaW5pdGlvbnMgYW5kIGNsYXNzZXMsIG5vdCB0byB0ZXN0IGV2ZXJ5Ci0gICAgIyBhc3BlY3Qgb2YgdGhlIGV4dGVuc2lvbiAoYmFzaWMucmIgaXMgZm9yIHRoYXQpLgotICAgIG0gPSBBOjpCOjpDOjpUZXN0TWVzc2FnZS5uZXcoKQotICBlbmQKLWVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS90ZXN0cy9yZXBlYXRlZF9maWVsZF90ZXN0LnJiIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS90ZXN0cy9yZXBlYXRlZF9maWVsZF90ZXN0LnJiCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNTcyN2I3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvdGVzdHMvcmVwZWF0ZWRfZmllbGRfdGVzdC5yYgorKysgL2Rldi9udWxsCkBAIC0xLDY0MCArMCwwIEBACi0jIS91c3IvYmluL3J1YnkKLQotcmVxdWlyZSAnZ29vZ2xlL3Byb3RvYnVmJwotcmVxdWlyZSAndGVzdC91bml0JwotCi1jbGFzcyBSZXBlYXRlZEZpZWxkVGVzdCA8IFRlc3Q6OlVuaXQ6OlRlc3RDYXNlCi0KLSAgZGVmIHRlc3RfYWN0c19saWtlX2VudW1lcmF0b3IKLSAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgKEVudW1lcmFibGUuaW5zdGFuY2VfbWV0aG9kcyAtIFRlc3RNZXNzYWdlLm5ldy5yZXBlYXRlZF9zdHJpbmcubWV0aG9kcykuZWFjaCBkbyB8bWV0aG9kX25hbWV8Ci0gICAgICBhc3NlcnQgbS5yZXBlYXRlZF9zdHJpbmcucmVzcG9uZF90bz8obWV0aG9kX25hbWUpID09IHRydWUsICJkb2VzIG5vdCByZXNwb25kIHRvICN7bWV0aG9kX25hbWV9IgotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9hY3RzX2xpa2VfYW5fYXJyYXkKLSAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgYXJyX21ldGhvZHMgPSAoW10ubWV0aG9kcyAtIFRlc3RNZXNzYWdlLm5ldy5yZXBlYXRlZF9zdHJpbmcubWV0aG9kcykKLSAgICAjIGpSdWJ5IGFkZGl0aW9ucyB0byB0aGUgQXJyYXkgY2xhc3MgdGhhdCB3ZSBjYW4gaWdub3JlCi0gICAgYXJyX21ldGhvZHMgLT0gWyA6aW5kaWNlcywgOml0ZXJfZm9yX2VhY2gsIDppdGVyX2Zvcl9lYWNoX2luZGV4LAotICAgICAgOml0ZXJfZm9yX2VhY2hfd2l0aF9pbmRleCwgOmRpbWVuc2lvbnMsIDpjb3B5X2RhdGEsIDpjb3B5X2RhdGFfc2ltcGxlLAotICAgICAgOm5pdGVtcywgOml0ZXJfZm9yX3JldmVyc2VfZWFjaCwgOmluZGV4ZXNdCi0gICAgYXJyX21ldGhvZHMuZWFjaCBkbyB8bWV0aG9kX25hbWV8Ci0gICAgICBhc3NlcnQgbS5yZXBlYXRlZF9zdHJpbmcucmVzcG9uZF90bz8obWV0aG9kX25hbWUpID09IHRydWUsICJkb2VzIG5vdCByZXNwb25kIHRvICN7bWV0aG9kX25hbWV9IgotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9maXJzdAotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZXBlYXRlZF9maWVsZF9uYW1lcyhUZXN0TWVzc2FnZSkuZWFjaCBkbyB8ZmllbGRfbmFtZXwKLSAgICAgIGFzc2VydF9uaWwgbS5zZW5kKGZpZWxkX25hbWUpLmZpcnN0Ci0gICAgZW5kCi0gICAgZmlsbF90ZXN0X21zZyhtKQotICAgIGFzc2VydF9lcXVhbCAtMTAsIG0ucmVwZWF0ZWRfaW50MzIuZmlyc3QKLSAgICBhc3NlcnRfZXF1YWwgLTFfMDAwXzAwMCwgbS5yZXBlYXRlZF9pbnQ2NC5maXJzdAotICAgIGFzc2VydF9lcXVhbCAxMCwgbS5yZXBlYXRlZF91aW50MzIuZmlyc3QKLSAgICBhc3NlcnRfZXF1YWwgMV8wMDBfMDAwLCBtLnJlcGVhdGVkX3VpbnQ2NC5maXJzdAotICAgIGFzc2VydF9lcXVhbCB0cnVlLCBtLnJlcGVhdGVkX2Jvb2wuZmlyc3QKLSAgICBhc3NlcnRfZXF1YWwgLTEuMDEsICBtLnJlcGVhdGVkX2Zsb2F0LmZpcnN0LnJvdW5kKDIpCi0gICAgYXNzZXJ0X2VxdWFsIC0xLjAwMDAwMDAwMDAwMDEsIG0ucmVwZWF0ZWRfZG91YmxlLmZpcnN0Ci0gICAgYXNzZXJ0X2VxdWFsICdmb28nLCBtLnJlcGVhdGVkX3N0cmluZy5maXJzdAotICAgIGFzc2VydF9lcXVhbCAiYmFyIi5lbmNvZGUhKCdBU0NJSS04QklUJyksIG0ucmVwZWF0ZWRfYnl0ZXMuZmlyc3QKLSAgICBhc3NlcnRfZXF1YWwgVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDEpLCBtLnJlcGVhdGVkX21zZy5maXJzdAotICAgIGFzc2VydF9lcXVhbCA6QSwgbS5yZXBlYXRlZF9lbnVtLmZpcnN0Ci0gIGVuZAotCi0KLSAgZGVmIHRlc3RfbGFzdAotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZXBlYXRlZF9maWVsZF9uYW1lcyhUZXN0TWVzc2FnZSkuZWFjaCBkbyB8ZmllbGRfbmFtZXwKLSAgICAgIGFzc2VydF9uaWwgbS5zZW5kKGZpZWxkX25hbWUpLmZpcnN0Ci0gICAgZW5kCi0gICAgZmlsbF90ZXN0X21zZyhtKQotICAgIGFzc2VydF9lcXVhbCAtMTEsIG0ucmVwZWF0ZWRfaW50MzIubGFzdAotICAgIGFzc2VydF9lcXVhbCAtMV8wMDBfMDAxLCBtLnJlcGVhdGVkX2ludDY0Lmxhc3QKLSAgICBhc3NlcnRfZXF1YWwgMTEsIG0ucmVwZWF0ZWRfdWludDMyLmxhc3QKLSAgICBhc3NlcnRfZXF1YWwgMV8wMDBfMDAxLCBtLnJlcGVhdGVkX3VpbnQ2NC5sYXN0Ci0gICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBtLnJlcGVhdGVkX2Jvb2wubGFzdAotICAgIGFzc2VydF9lcXVhbCAtMS4wMiwgbS5yZXBlYXRlZF9mbG9hdC5sYXN0LnJvdW5kKDIpCi0gICAgYXNzZXJ0X2VxdWFsIC0xLjAwMDAwMDAwMDAwMDIsIG0ucmVwZWF0ZWRfZG91YmxlLmxhc3QKLSAgICBhc3NlcnRfZXF1YWwgJ2JhcicsIG0ucmVwZWF0ZWRfc3RyaW5nLmxhc3QKLSAgICBhc3NlcnRfZXF1YWwgImZvbyIuZW5jb2RlISgnQVNDSUktOEJJVCcpLCBtLnJlcGVhdGVkX2J5dGVzLmxhc3QKLSAgICBhc3NlcnRfZXF1YWwgVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDIpLCBtLnJlcGVhdGVkX21zZy5sYXN0Ci0gICAgYXNzZXJ0X2VxdWFsIDpCLCBtLnJlcGVhdGVkX2VudW0ubGFzdAotICBlbmQKLQotCi0gIGRlZiB0ZXN0X3BvcAotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZXBlYXRlZF9maWVsZF9uYW1lcyhUZXN0TWVzc2FnZSkuZWFjaCBkbyB8ZmllbGRfbmFtZXwKLSAgICAgIGFzc2VydF9uaWwgbS5zZW5kKGZpZWxkX25hbWUpLnBvcAotICAgIGVuZAotICAgIGZpbGxfdGVzdF9tc2cobSkKLQotICAgIGFzc2VydF9lcXVhbCAtMTEsIG0ucmVwZWF0ZWRfaW50MzIucG9wCi0gICAgYXNzZXJ0X2VxdWFsIC0xMCwgbS5yZXBlYXRlZF9pbnQzMi5wb3AKLSAgICBhc3NlcnRfZXF1YWwgLTFfMDAwXzAwMSwgbS5yZXBlYXRlZF9pbnQ2NC5wb3AKLSAgICBhc3NlcnRfZXF1YWwgLTFfMDAwXzAwMCwgbS5yZXBlYXRlZF9pbnQ2NC5wb3AKLSAgICBhc3NlcnRfZXF1YWwgMTEsIG0ucmVwZWF0ZWRfdWludDMyLnBvcAotICAgIGFzc2VydF9lcXVhbCAxMCwgbS5yZXBlYXRlZF91aW50MzIucG9wCi0gICAgYXNzZXJ0X2VxdWFsIDFfMDAwXzAwMSwgbS5yZXBlYXRlZF91aW50NjQucG9wCi0gICAgYXNzZXJ0X2VxdWFsIDFfMDAwXzAwMCwgbS5yZXBlYXRlZF91aW50NjQucG9wCi0gICAgYXNzZXJ0X2VxdWFsIGZhbHNlLCBtLnJlcGVhdGVkX2Jvb2wucG9wCi0gICAgYXNzZXJ0X2VxdWFsIHRydWUsIG0ucmVwZWF0ZWRfYm9vbC5wb3AKLSAgICBhc3NlcnRfZXF1YWwgLTEuMDIsICBtLnJlcGVhdGVkX2Zsb2F0LnBvcC5yb3VuZCgyKQotICAgIGFzc2VydF9lcXVhbCAtMS4wMSwgIG0ucmVwZWF0ZWRfZmxvYXQucG9wLnJvdW5kKDIpCi0gICAgYXNzZXJ0X2VxdWFsIC0xLjAwMDAwMDAwMDAwMDIsIG0ucmVwZWF0ZWRfZG91YmxlLnBvcAotICAgIGFzc2VydF9lcXVhbCAtMS4wMDAwMDAwMDAwMDAxLCBtLnJlcGVhdGVkX2RvdWJsZS5wb3AKLSAgICBhc3NlcnRfZXF1YWwgJ2JhcicsIG0ucmVwZWF0ZWRfc3RyaW5nLnBvcAotICAgIGFzc2VydF9lcXVhbCAnZm9vJywgbS5yZXBlYXRlZF9zdHJpbmcucG9wCi0gICAgYXNzZXJ0X2VxdWFsICJmb28iLmVuY29kZSEoJ0FTQ0lJLThCSVQnKSwgbS5yZXBlYXRlZF9ieXRlcy5wb3AKLSAgICBhc3NlcnRfZXF1YWwgImJhciIuZW5jb2RlISgnQVNDSUktOEJJVCcpLCBtLnJlcGVhdGVkX2J5dGVzLnBvcAotICAgIGFzc2VydF9lcXVhbCBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMiksIG0ucmVwZWF0ZWRfbXNnLnBvcAotICAgIGFzc2VydF9lcXVhbCBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSksIG0ucmVwZWF0ZWRfbXNnLnBvcAotICAgIGFzc2VydF9lcXVhbCA6QiwgbS5yZXBlYXRlZF9lbnVtLnBvcAotICAgIGFzc2VydF9lcXVhbCA6QSwgbS5yZXBlYXRlZF9lbnVtLnBvcAotICAgIHJlcGVhdGVkX2ZpZWxkX25hbWVzKFRlc3RNZXNzYWdlKS5lYWNoIGRvIHxmaWVsZF9uYW1lfAotICAgICAgYXNzZXJ0X25pbCBtLnNlbmQoZmllbGRfbmFtZSkucG9wCi0gICAgZW5kCi0KLSAgICBmaWxsX3Rlc3RfbXNnKG0pCi0gICAgYXNzZXJ0X2VxdWFsIFsnYmFyJywgJ2ZvbyddLCBtLnJlcGVhdGVkX3N0cmluZy5wb3AoMikKLSAgICBhc3NlcnRfbmlsIG0ucmVwZWF0ZWRfc3RyaW5nLnBvcAotICBlbmQKLQotCi0gIGRlZiB0ZXN0X2VhY2gKLSAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgNS50aW1lc3t8aXwgbS5yZXBlYXRlZF9zdHJpbmcgPDwgJ3N0cmluZycgfQotICAgIGNvdW50ID0gMAotICAgIG0ucmVwZWF0ZWRfc3RyaW5nLmVhY2ggZG8gfHZhbHwKLSAgICAgIGFzc2VydF9lcXVhbCAnc3RyaW5nJywgdmFsCi0gICAgICBjb3VudCArPSAxCi0gICAgZW5kCi0gICAgYXNzZXJ0X2VxdWFsIDUsIGNvdW50Ci0gICAgcmVzdWx0ID0gbS5yZXBlYXRlZF9zdHJpbmcuZWFjaHt8dmFsfCB2YWwgKyAnX2p1bmsnfQotICAgIGFzc2VydF9lcXVhbCBbJ3N0cmluZyddICogNSwgcmVzdWx0Ci0gIGVuZAotCi0KLSAgZGVmIHRlc3RfZW1wdHk/Ci0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIGFzc2VydF9lcXVhbCB0cnVlLCBtLnJlcGVhdGVkX3N0cmluZy5lbXB0eT8KLSAgICBtLnJlcGVhdGVkX3N0cmluZyA8PCAnZm9vJwotICAgIGFzc2VydF9lcXVhbCBmYWxzZSwgbS5yZXBlYXRlZF9zdHJpbmcuZW1wdHk/Ci0gICAgbS5yZXBlYXRlZF9zdHJpbmcgPDwgJ2JhcicKLSAgICBhc3NlcnRfZXF1YWwgZmFsc2UsIG0ucmVwZWF0ZWRfc3RyaW5nLmVtcHR5PwotICBlbmQKLQotICBkZWYgdGVzdF9hcnJheV9hY2Nlc3NvcgotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyclsxXQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyclstMl0KLSAgICBlbmQKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnJbMjBdCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyWzEsIDJdCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyWzAuLjJdCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyWy0xLCAxXQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyclsxMCwgMTJdCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2FycmF5X3NldHRvcgotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyWzFdID0gJ2p1bmsnCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyWy0yXSA9ICdzbmFwcHknCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyWzNdID0gJycKLSAgICBlbmQKLSAgICAjIHNsaWdodCBkZXZpYXRpb247IHdlIGFyZSBzdHJvbmdseSB0eXBlZCwgYW5kIG5pbCBpcyBub3QgYWxsb3dlZAotICAgICMgZm9yIHN0cmluZyB0eXBlczsKLSAgICBtLnJlcGVhdGVkX3N0cmluZ1s1XSA9ICdzcGFjaW91cycKLSAgICBhc3NlcnRfZXF1YWwgWyJmb28iLCAic25hcHB5IiwgImJheiIsICIiLCAiIiwgInNwYWNpb3VzIl0sIG0ucmVwZWF0ZWRfc3RyaW5nCi0KLSAgICAjbWFrZSBzdXJlIGl0IHNlc3RzIHRoZSBkZWZhdWx0IHR5cGVzIGZvciBvdGhlciBmaWVsZHMgYmVzaWRlcyBzdHJpbmdzCi0gICAgJXcocmVwZWF0ZWRfaW50MzIgcmVwZWF0ZWRfaW50NjQgcmVwZWF0ZWRfdWludDMyIHJlcGVhdGVkX3VpbnQ2NCkuZWFjaCBkbyB8ZmllbGRfbmFtZXwKLSAgICAgIG0uc2VuZChmaWVsZF9uYW1lKVszXSA9IDEwCi0gICAgICBhc3NlcnRfZXF1YWwgWzAsMCwwLDEwXSwgbS5zZW5kKGZpZWxkX25hbWUpCi0gICAgZW5kCi0gICAgbS5yZXBlYXRlZF9mbG9hdFszXSA9IDEwLjEKLSAgICAjd29ua3kgbXJpIGZsb2F0IGhhbmRsaW5nCi0gICAgYXNzZXJ0X2VxdWFsIFswLDAsMF0sIG0ucmVwZWF0ZWRfZmxvYXQudG9fYVswLi4yXQotICAgIGFzc2VydF9lcXVhbCAxMC4xLCBtLnJlcGVhdGVkX2Zsb2F0WzNdLnJvdW5kKDEpCi0gICAgbS5yZXBlYXRlZF9kb3VibGVbM10gPSAxMC4xCi0gICAgYXNzZXJ0X2VxdWFsIFswLDAsMCwxMC4xXSwgbS5yZXBlYXRlZF9kb3VibGUKLSAgICBtLnJlcGVhdGVkX2Jvb2xbM10gPSB0cnVlCi0gICAgYXNzZXJ0X2VxdWFsIFtmYWxzZSwgZmFsc2UsIGZhbHNlLCB0cnVlXSwgbS5yZXBlYXRlZF9ib29sCi0gICAgbS5yZXBlYXRlZF9ieXRlc1szXSA9ICJiYXIiLmVuY29kZSEoJ0FTQ0lJLThCSVQnKQotICAgIGFzc2VydF9lcXVhbCBbJycsICcnLCAnJywgImJhciIuZW5jb2RlISgnQVNDSUktOEJJVCcpXSwgbS5yZXBlYXRlZF9ieXRlcwotICAgIG0ucmVwZWF0ZWRfbXNnWzNdID0gVGVzdE1lc3NhZ2UyLm5ldyg6Zm9vID0+IDEpCi0gICAgYXNzZXJ0X2VxdWFsIFtuaWwsIG5pbCwgbmlsLCBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSldLCBtLnJlcGVhdGVkX21zZwotICAgIG0ucmVwZWF0ZWRfZW51bVszXSA9IDpBCi0gICAgYXNzZXJ0X2VxdWFsIFs6RGVmYXVsdCwgOkRlZmF1bHQsIDpEZWZhdWx0LCA6QV0sIG0ucmVwZWF0ZWRfZW51bQotCi0gICAgIyBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgIyAgIGFyclsyMF0gPSAnc3BhY2lvdXMnCi0gICAgIyBlbmQKLSAgICAjIFRPRE86IGFjY2Vzc29yIGRvZXNuJ3QgYWxsb3cgb3RoZXIgcnVieS1saWtlIG1ldGhvZHMKLSAgICAjIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAjICAgYXJyWzEsIDJdID0gJ2ZpenonCi0gICAgIyBlbmQKLSAgICAjIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAjICAgYXJyWzAuLjJdID0gJ2J1enonCi0gICAgIyBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfcHVzaAotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnB1c2goJ2ZpenonKQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyciA8PCAnZml6eicKLSAgICBlbmQKLSAgICAjVE9ETzogcHVzaCBzaG91bGQgc3VwcG9ydCBtdWx0aXBsZQotICAgICMgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICMgICBhcnIucHVzaCgnZml6eicsICdidXp6JykKLSAgICAjIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9jbGVhcgotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmNsZWFyCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2NvbmNhdAotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotICAgIG0ucmVwZWF0ZWRfc3RyaW5nLmNvbmNhdChbJ2ZpenonLCAnYnV6eiddKQotICAgIGFzc2VydF9lcXVhbCAldyhmb28gYmFyIGJheiBmaXp6IGJ1enopLCBtLnJlcGVhdGVkX3N0cmluZwotICAgICNUT0RPOiBjb25jYXQgc2hvdWxkIHJldHVybiB0aGUgb3JpZyBhcnJheQotICAgICMgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICMgICBhcnIuY29uY2F0KFsnZml6eicsICdidXp6J10pCi0gICAgIyBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZXF1YWwKLSAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgcmVmZXJlbmNlX2FyciA9ICV3KGZvbyBiYXIgYmF6KQotICAgIG0ucmVwZWF0ZWRfc3RyaW5nICs9IHJlZmVyZW5jZV9hcnIuY2xvbmUKLSAgICBhc3NlcnRfZXF1YWwgcmVmZXJlbmNlX2FyciwgbS5yZXBlYXRlZF9zdHJpbmcKLSAgICByZWZlcmVuY2VfYXJyIDw8ICdmaXp6JwotICAgIGFzc2VydF9ub3RfZXF1YWwgcmVmZXJlbmNlX2FyciwgbS5yZXBlYXRlZF9zdHJpbmcKLSAgICBtLnJlcGVhdGVkX3N0cmluZyA8PCAnZml6eicKLSAgICBhc3NlcnRfZXF1YWwgcmVmZXJlbmNlX2FyciwgbS5yZXBlYXRlZF9zdHJpbmcKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaGFzaAotICAgICMganVzdCBhIHNhbml0eSBjaGVjawotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotICAgIGFzc2VydCBtLnJlcGVhdGVkX3N0cmluZy5oYXNoLmlzX2E/KEludGVnZXIpCi0gICAgaGFzaCA9IG0ucmVwZWF0ZWRfc3RyaW5nLmhhc2gKLSAgICBhc3NlcnRfZXF1YWwgaGFzaCwgbS5yZXBlYXRlZF9zdHJpbmcuaGFzaAotICAgIG0ucmVwZWF0ZWRfc3RyaW5nIDw8ICdqJwotICAgIGFzc2VydF9ub3RfZXF1YWwgaGFzaCwgbS5yZXBlYXRlZF9zdHJpbmcuaGFzaAotICBlbmQKLQotICBkZWYgdGVzdF9wbHVzCi0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0KLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIgKyBbJ2ZpenonLCAnYnV6eiddCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyICs9IFsnZml6eicsICdidXp6J10KLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfcmVwbGFjZQotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnJlcGxhY2UoWydmaXp6JywgJ2J1enonXSkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdG9fYQotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnRvX2EKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdG9fYXJ5Ci0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0KLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIudG9fYXJ5Ci0gICAgZW5kCi0gIGVuZAotCi0gICMgZW11bGF0ZSBBcnJheSBiZWhhdmlvcgotICAjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIwotCi0gIGRlZiB0ZXN0X2NvbGxlY3QhCi0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmNvbGxlY3Qhe3x4fCB4ICsgIiEiIH0KLSAgICBlbmQKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuY29sbGVjdCEud2l0aF9pbmRleHt8eCwgaXwgeFswLi4uaV0gfQotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9jb21wYWN0IQotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICBtLnJlcGVhdGVkX21zZyA8PCBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMSkKLSAgICBtLnJlcGVhdGVkX21zZyA8PCBuaWwKLSAgICBtLnJlcGVhdGVkX21zZyA8PCBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMikKLSAgICByZWZlcmVuY2VfYXJyID0gbS5yZXBlYXRlZF9zdHJpbmcudG9fYQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmNvbXBhY3QhCi0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2RlbGV0ZQotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci5kZWxldGUoJ2JhcicpCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmRlbGV0ZSgnbm9wZScpCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmRlbGV0ZSgnbm9wZScpeyd3aXRoaW4nfQotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9kZWxldGVfYXQKLSAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgcmVmZXJlbmNlX2FyciA9ICV3KGZvbyBiYXIgYmF6KQotICAgIG0ucmVwZWF0ZWRfc3RyaW5nICs9IHJlZmVyZW5jZV9hcnIuY2xvbmUKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuZGVsZXRlX2F0KDIpCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmRlbGV0ZV9hdCgxMCkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfZmlsbAotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmZpbGwoIngiKQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci5maWxsKCJ6IiwgMiwgMikKLSAgICBlbmQKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuZmlsbCgieSIsIDAuLjEpCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmZpbGwgeyB8aXwgKGkqaSkudG9fcyB9Ci0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmZpbGwoLTIpIHsgfGl8IChpKmkqaSkudG9fcyB9Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZXN0X2ZsYXR0ZW4hCi0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0KLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuZmxhdHRlbiEKLSAgICBlbmQKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuZmxhdHRlbiEoMSkKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfaW5zZXJ0Ci0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmluc2VydCgyLCAnZml6eicpCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLmluc2VydCgzLCAnZml6eicsICdidXp6JywgJ2JhenonKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9pbnNwZWN0Ci0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIGFzc2VydF9lcXVhbCAnW10nLCBtLnJlcGVhdGVkX3N0cmluZy5pbnNwZWN0Ci0gICAgbS5yZXBlYXRlZF9zdHJpbmcgPDwgJ2ZvbycKLSAgICBhc3NlcnRfZXF1YWwgbS5yZXBlYXRlZF9zdHJpbmcudG9fYS5pbnNwZWN0LCBtLnJlcGVhdGVkX3N0cmluZy5pbnNwZWN0Ci0gICAgbS5yZXBlYXRlZF9zdHJpbmcgPDwgJ2JhcicKLSAgICBhc3NlcnRfZXF1YWwgbS5yZXBlYXRlZF9zdHJpbmcudG9fYS5pbnNwZWN0LCBtLnJlcGVhdGVkX3N0cmluZy5pbnNwZWN0Ci0gIGVuZAotCi0gIGRlZiB0ZXN0X3JldmVyc2UhCi0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0KLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIucmV2ZXJzZSEKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfcm90YXRlIQotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnJvdGF0ZSEKLSAgICBlbmQKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIucm90YXRlISgyKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9zZWxlY3QhCi0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0KLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuc2VsZWN0ISB7IHx2fCB2ID1+IC9bYWVpb3VdLyB9Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3NoaWZ0Ci0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0KLSAgICAjIHNob3VsZCByZXR1cm4gYW4gZWxlbWVudAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci5zaGlmdAotICAgIGVuZAotICAgICMgc2hvdWxkIHJldHVybiBhbiBhcnJheQotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci5zaGlmdCgyKQotICAgIGVuZAotICAgICMgc2hvdWxkIHJldHVybiBuaWwKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuc2hpZnQKLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3Rfc2h1ZmZsZSEKLSAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gJXcoZm9vIGJhciBiYXopCi0gICAgb3JpZ19yZXBlYXRlZF9zdHJpbmcgPSBtLnJlcGVhdGVkX3N0cmluZy5jbG9uZQotICAgIHJlc3VsdCA9IG0ucmVwZWF0ZWRfc3RyaW5nLnNodWZmbGUhCi0gICAgYXNzZXJ0X2VxdWFsIG0ucmVwZWF0ZWRfc3RyaW5nLCByZXN1bHQKLSAgICAjIE5PVEU6IHNvbWV0aW1lcyBpdCBkb2Vzbid0IGNoYW5nZSB0aGUgb3JkZXIuLi4KLSAgICAjIGFzc2VydF9ub3RfZXF1YWwgbS5yZXBlYXRlZF9zdHJpbmcudG9fYSwgb3JpZ19yZXBlYXRlZF9zdHJpbmcudG9fYQotICBlbmQKLQotICBkZWYgdGVzdF9zbGljZSEKLSAgICBtID0gVGVzdE1lc3NhZ2UubmV3Ci0gICAgcmVmZXJlbmNlX2FyciA9ICV3KGZvbyBiYXIgYmF6IGJhciBmaXp6IGJ1enopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnNsaWNlISgyKQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci5zbGljZSEoMSwyKQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci5zbGljZSEoMC4uMSkKLSAgICBlbmQKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuc2xpY2UhKDEwKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF9zb3J0IQotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnNvcnQhCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnNvcnQhIHsgfHgseXwgeSA8PT4geCB9Ci0gICAgZW5kCi0gIGVuZAotCi0gIGRlZiB0ZXN0X3NvcnRfYnkhCi0gICAgbSA9IFRlc3RNZXNzYWdlLm5ldwotICAgIHJlZmVyZW5jZV9hcnIgPSAldyhmb28gYmFyIGJheikKLSAgICBtLnJlcGVhdGVkX3N0cmluZyArPSByZWZlcmVuY2VfYXJyLmNsb25lCi0KLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuc29ydF9ieSEKLSAgICBlbmQKLSAgICBjaGVja19zZWxmX21vZGlmeWluZ19tZXRob2QobS5yZXBlYXRlZF9zdHJpbmcsIHJlZmVyZW5jZV9hcnIpIGRvIHxhcnJ8Ci0gICAgICBhcnIuc29ydF9ieSEoJjpoYXNoKQotICAgIGVuZAotICBlbmQKLQotICBkZWYgdGVzdF91bmlxIQotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnVuaXEhCi0gICAgZW5kCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnVuaXEhe3xzfCBzWzBdIH0KLSAgICBlbmQKLSAgZW5kCi0KLSAgZGVmIHRlc3RfdW5zaGlmdAotICAgIG0gPSBUZXN0TWVzc2FnZS5uZXcKLSAgICByZWZlcmVuY2VfYXJyID0gJXcoZm9vIGJhciBiYXopCi0gICAgbS5yZXBlYXRlZF9zdHJpbmcgKz0gcmVmZXJlbmNlX2Fyci5jbG9uZQotCi0gICAgY2hlY2tfc2VsZl9tb2RpZnlpbmdfbWV0aG9kKG0ucmVwZWF0ZWRfc3RyaW5nLCByZWZlcmVuY2VfYXJyKSBkbyB8YXJyfAotICAgICAgYXJyLnVuc2hpZnQoJzEnKQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci51bnNoaWZ0KCdhJywgJ2InKQotICAgIGVuZAotICAgIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChtLnJlcGVhdGVkX3N0cmluZywgcmVmZXJlbmNlX2FycikgZG8gfGFycnwKLSAgICAgIGFyci51bnNoaWZ0KCcnKQotICAgIGVuZAotICBlbmQKLQotCi0gICMjIyMjIEhFTFBFUiBNRVRIT0RTCi0KLSAgZGVmIGNoZWNrX3NlbGZfbW9kaWZ5aW5nX21ldGhvZChyZXBlYXRlZF9maWVsZCwgcmVmX2FycmF5KQotICAgIGV4cGVjdGVkX3Jlc3VsdCA9IHlpZWxkKHJlZl9hcnJheSkKLSAgICBhY3R1YWxfcmVzdWx0ID0geWllbGQocmVwZWF0ZWRfZmllbGQpCi0gICAgaWYgZXhwZWN0ZWRfcmVzdWx0LmlzX2E/KEVudW1lcmF0b3IpCi0gICAgICBhc3NlcnRfZXF1YWwgZXhwZWN0ZWRfcmVzdWx0LnRvX2EsIGFjdHVhbF9yZXN1bHQudG9fYQotICAgIGVsc2UKLSAgICAgIGFzc2VydF9lcXVhbCBleHBlY3RlZF9yZXN1bHQsIGFjdHVhbF9yZXN1bHQKLSAgICBlbmQKLSAgICBhc3NlcnRfZXF1YWwgcmVmX2FycmF5LCByZXBlYXRlZF9maWVsZAotICBlbmQKLQotCi0gIGRlZiByZXBlYXRlZF9maWVsZF9uYW1lcyhrbGFzcykKLSAgICBrbGFzcy5kZXNjcmlwdG9yLmZpbmRfYWxse3xmfCBmLmxhYmVsID09IDpyZXBlYXRlZH0ubWFwKCY6bmFtZSkKLSAgZW5kCi0KLQotICBkZWYgZmlsbF90ZXN0X21zZyh0ZXN0X21zZykKLSAgICB0ZXN0X21zZy5yZXBlYXRlZF9pbnQzMiAgKz0gWy0xMCwgLTExXQotICAgIHRlc3RfbXNnLnJlcGVhdGVkX2ludDY0ICArPSBbLTFfMDAwXzAwMCwgLTFfMDAwXzAwMV0KLSAgICB0ZXN0X21zZy5yZXBlYXRlZF91aW50MzIgKz0gWzEwLCAxMV0KLSAgICB0ZXN0X21zZy5yZXBlYXRlZF91aW50NjQgKz0gWzFfMDAwXzAwMCwgMV8wMDBfMDAxXQotICAgIHRlc3RfbXNnLnJlcGVhdGVkX2Jvb2wgICArPSBbdHJ1ZSwgZmFsc2VdCi0gICAgdGVzdF9tc2cucmVwZWF0ZWRfZmxvYXQgICs9IFstMS4wMSwgLTEuMDJdCi0gICAgdGVzdF9tc2cucmVwZWF0ZWRfZG91YmxlICs9IFstMS4wMDAwMDAwMDAwMDAxLCAtMS4wMDAwMDAwMDAwMDAyXQotICAgIHRlc3RfbXNnLnJlcGVhdGVkX3N0cmluZyArPSAldyhmb28gYmFyKQotICAgIHRlc3RfbXNnLnJlcGVhdGVkX2J5dGVzICArPSBbImJhciIuZW5jb2RlISgnQVNDSUktOEJJVCcpLCAiZm9vIi5lbmNvZGUhKCdBU0NJSS04QklUJyldCi0gICAgdGVzdF9tc2cucmVwZWF0ZWRfbXNnICAgIDw8IFRlc3RNZXNzYWdlMi5uZXcoOmZvbyA9PiAxKQotICAgIHRlc3RfbXNnLnJlcGVhdGVkX21zZyAgICA8PCBUZXN0TWVzc2FnZTIubmV3KDpmb28gPT4gMikKLSAgICB0ZXN0X21zZy5yZXBlYXRlZF9lbnVtICAgPDwgOkEKLSAgICB0ZXN0X21zZy5yZXBlYXRlZF9lbnVtICAgPDwgOkIKLSAgZW5kCi0KLQotICBwb29sID0gR29vZ2xlOjpQcm90b2J1Zjo6RGVzY3JpcHRvclBvb2wubmV3Ci0gIHBvb2wuYnVpbGQgZG8KLQotICAgIGFkZF9tZXNzYWdlICJUZXN0TWVzc2FnZSIgZG8KLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9pbnQzMiwgIDppbnQzMiwgICAgICAgIDEKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9pbnQ2NCwgIDppbnQ2NCwgICAgICAgIDIKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF91aW50MzIsIDp1aW50MzIsICAgICAgIDMKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF91aW50NjQsIDp1aW50NjQsICAgICAgIDQKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9ib29sLCAgIDpib29sLCAgICAgICAgIDUKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9mbG9hdCwgIDpmbG9hdCwgICAgICAgIDYKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9kb3VibGUsIDpkb3VibGUsICAgICAgIDcKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9zdHJpbmcsIDpzdHJpbmcsICAgICAgIDgKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9ieXRlcywgIDpieXRlcywgICAgICAgIDkKLSAgICAgIG9wdGlvbmFsIDpvcHRpb25hbF9tc2csICAgIDptZXNzYWdlLCAgICAgIDEwLCAiVGVzdE1lc3NhZ2UyIgotICAgICAgb3B0aW9uYWwgOm9wdGlvbmFsX2VudW0sICAgOmVudW0sICAgICAgICAgMTEsICJUZXN0RW51bSIKLQotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2ludDMyLCAgOmludDMyLCAgICAgICAgMTIKLSAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9pbnQ2NCwgIDppbnQ2NCwgICAgICAgIDEzCi0gICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfdWludDMyLCA6dWludDMyLCAgICAgICAxNAotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX3VpbnQ2NCwgOnVpbnQ2NCwgICAgICAgMTUKLSAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9ib29sLCAgIDpib29sLCAgICAgICAgIDE2Ci0gICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfZmxvYXQsICA6ZmxvYXQsICAgICAgICAxNwotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX2RvdWJsZSwgOmRvdWJsZSwgICAgICAgMTgKLSAgICAgIHJlcGVhdGVkIDpyZXBlYXRlZF9zdHJpbmcsIDpzdHJpbmcsICAgICAgIDE5Ci0gICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfYnl0ZXMsICA6Ynl0ZXMsICAgICAgICAyMAotICAgICAgcmVwZWF0ZWQgOnJlcGVhdGVkX21zZywgICAgOm1lc3NhZ2UsICAgICAgMjEsICJUZXN0TWVzc2FnZTIiCi0gICAgICByZXBlYXRlZCA6cmVwZWF0ZWRfZW51bSwgICA6ZW51bSwgICAgICAgICAyMiwgIlRlc3RFbnVtIgotICAgIGVuZAotICAgIGFkZF9tZXNzYWdlICJUZXN0TWVzc2FnZTIiIGRvCi0gICAgICBvcHRpb25hbCA6Zm9vLCA6aW50MzIsIDEKLSAgICBlbmQKLQotICAgIGFkZF9lbnVtICJUZXN0RW51bSIgZG8KLSAgICAgIHZhbHVlIDpEZWZhdWx0LCAwCi0gICAgICB2YWx1ZSA6QSwgMQotICAgICAgdmFsdWUgOkIsIDIKLSAgICAgIHZhbHVlIDpDLCAzCi0gICAgZW5kCi0gIGVuZAotCi0gIFRlc3RNZXNzYWdlID0gcG9vbC5sb29rdXAoIlRlc3RNZXNzYWdlIikubXNnY2xhc3MKLSAgVGVzdE1lc3NhZ2UyID0gcG9vbC5sb29rdXAoIlRlc3RNZXNzYWdlMiIpLm1zZ2NsYXNzCi0gIFRlc3RFbnVtID0gcG9vbC5sb29rdXAoIlRlc3RFbnVtIikuZW51bW1vZHVsZQotCi0KLWVuZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcnVieS90ZXN0cy9zdHJlc3MucmIgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3Rlc3RzL3N0cmVzcy5yYgpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDgyZDVlMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3Rlc3RzL3N0cmVzcy5yYgorKysgL2Rldi9udWxsCkBAIC0xLDM4ICswLDAgQEAKLSMhL3Vzci9iaW4vcnVieQotCi1yZXF1aXJlICdnb29nbGUvcHJvdG9idWYnCi1yZXF1aXJlICd0ZXN0L3VuaXQnCi0KLW1vZHVsZSBTdHJlc3NUZXN0Ci0gIHBvb2wgPSBHb29nbGU6OlByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbC5uZXcKLSAgcG9vbC5idWlsZCBkbwotICAgIGFkZF9tZXNzYWdlICJUZXN0TWVzc2FnZSIgZG8KLSAgICAgIG9wdGlvbmFsIDphLCAgOmludDMyLCAgICAgICAgMQotICAgICAgcmVwZWF0ZWQgOmIsICA6bWVzc2FnZSwgICAgICAyLCAiTSIKLSAgICBlbmQKLSAgICBhZGRfbWVzc2FnZSAiTSIgZG8KLSAgICAgIG9wdGlvbmFsIDpmb28sIDpzdHJpbmcsIDEKLSAgICBlbmQKLSAgZW5kCi0KLSAgVGVzdE1lc3NhZ2UgPSBwb29sLmxvb2t1cCgiVGVzdE1lc3NhZ2UiKS5tc2djbGFzcwotICBNID0gcG9vbC5sb29rdXAoIk0iKS5tc2djbGFzcwotCi0gIGNsYXNzIFN0cmVzc1Rlc3QgPCBUZXN0OjpVbml0OjpUZXN0Q2FzZQotICAgIGRlZiBnZXRfbXNnCi0gICAgICBUZXN0TWVzc2FnZS5uZXcoOmEgPT4gMTAwMCwKLSAgICAgICAgICAgICAgICAgICAgICA6YiA9PiBbTS5uZXcoOmZvbyA9PiAiaGVsbG8iKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTS5uZXcoOmZvbyA9PiAid29ybGQiKV0pCi0gICAgZW5kCi0gICAgZGVmIHRlc3Rfc3RyZXNzCi0gICAgICBtID0gZ2V0X21zZwotICAgICAgZGF0YSA9IFRlc3RNZXNzYWdlLmVuY29kZShtKQotICAgICAgMTAwXzAwMC50aW1lcyBkbwotICAgICAgICBtbmV3ID0gVGVzdE1lc3NhZ2UuZGVjb2RlKGRhdGEpCi0gICAgICAgIG1uZXcgPSBtbmV3LmR1cAotICAgICAgICBhc3NlcnRfZXF1YWwgbW5ldy5pbnNwZWN0LCBtLmluc3BlY3QKLSAgICAgICAgYXNzZXJ0IFRlc3RNZXNzYWdlLmVuY29kZShtbmV3KSA9PSBkYXRhCi0gICAgICBlbmQKLSAgICBlbmQKLSAgZW5kCi1lbmQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvdHJhdmlzLXRlc3Quc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9ydWJ5L3RyYXZpcy10ZXN0LnNoCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA3NWRiN2Q5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3J1YnkvdHJhdmlzLXRlc3Quc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyNSArMCwwIEBACi0jIS91c3IvYmluL2VudiBiYXNoCi0KLSMgRXhpdCBvbiBhbnkgZXJyb3IuCi1zZXQgLWUKLQotdGVzdF92ZXJzaW9uKCkgewotICB2ZXJzaW9uPSQxCi0gIGlmIFsgIiR2ZXJzaW9uIiA9PSAianJ1YnkiIF0gOyB0aGVuCi0gICAgIyBObyBjb25mb3JtYW5jZSB0ZXN0cyB5ZXQgLS0gSlJ1YnkgaXMgdG9vIGJyb2tlbiB0byBydW4gdGhlbS4KLSAgICBiYXNoIC0tbG9naW4gLWMgXAotICAgICAgInJ2bSBpbnN0YWxsICR2ZXJzaW9uICYmIHJ2bSB1c2UgJHZlcnNpb24gJiYgXAotICAgICAgIHdoaWNoIHJ1YnkgJiYgXAotICAgICAgIGdlbSBpbnN0YWxsIGJ1bmRsZXIgJiYgYnVuZGxlICYmIFwKLSAgICAgICByYWtlIHRlc3QiCi0gIGVsc2UKLSAgICBiYXNoIC0tbG9naW4gLWMgXAotICAgICAgInJ2bSBpbnN0YWxsICR2ZXJzaW9uICYmIHJ2bSB1c2UgJHZlcnNpb24gJiYgXAotICAgICAgIHdoaWNoIHJ1YnkgJiYgXAotICAgICAgIGdlbSBpbnN0YWxsIGJ1bmRsZXIgJiYgYnVuZGxlICYmIFwKLSAgICAgICByYWtlIHRlc3QgJiYKLSAgICAgICBjZCAuLi9jb25mb3JtYW5jZSAmJiBtYWtlIHRlc3RfcnVieSIKLSAgZmkKLX0KLQotdGVzdF92ZXJzaW9uICQxCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvTWFrZWZpbGUuYW0KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgwMDY1NTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL01ha2VmaWxlLmFtCisrKyAvZGV2L251bGwKQEAgLTEsODM0ICswLDAgQEAKLSMjIFByb2Nlc3MgdGhpcyBmaWxlIHdpdGggYXV0b21ha2UgdG8gcHJvZHVjZSBNYWtlZmlsZS5pbgotCi1pZiBIQVZFX1pMSUIKLUdaQ0hFQ0tQUk9HUkFNUyA9IHpjZ3ppcCB6Y2d1bnppcAotR1pIRUFERVJTID0gZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgKLUdaVEVTVFMgPSBnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gKLVpMSUJfREVGID0gLURIQVZFX1pMSUI9MQotZWxzZQotR1pDSEVDS1BST0dSQU1TID0KLUdaSEVBREVSUyA9Ci1HWlRFU1RTID0KLVpMSUJfREVGID0KLWVuZGlmCi0KLWlmIEhBVkVfUFRIUkVBRAotUFRIUkVBRF9ERUYgPSAtREhBVkVfUFRIUkVBRD0xCi1lbHNlCi1QVEhSRUFEX0RFRiA9Ci1lbmRpZgotCi1pZiBHQ0MKLSMgVGhlc2UgYXJlIGdvb2Qgd2FybmluZ3MgdG8gdHVybiBvbiBieSBkZWZhdWx0Ci1OT19PUFRfQ1hYRkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKSAkKFBUSFJFQURfREVGKSAkKFpMSUJfREVGKSAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdvdmVybG9hZGVkLXZpcnR1YWwgLVduby1zaWduLWNvbXBhcmUKLWVsc2UKLU5PX09QVF9DWFhGTEFHUyA9ICQoUFRIUkVBRF9DRkxBR1MpICQoUFRIUkVBRF9ERUYpICQoWkxJQl9ERUYpCi1lbmRpZgotCi1BTV9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKSAkKFBST1RPQlVGX09QVF9GTEFHKQotCi1BTV9MREZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykKLQotIyBJZiBJIHNheSAiZGlzdF9pbmNsdWRlX0RBVEEiLCBhdXRvbWFrZSBjb21wbGFpbnMgdGhhdCAkKGluY2x1ZGVkaXIpIGlzIG5vdAotIyBhICJsZWdpdGltYXRlIiBkaXJlY3RvcnkgZm9yIERBVEEuICBTY3JldyB5b3UsIGF1dG9tYWtlLgotcHJvdG9kaXIgPSAkKGluY2x1ZGVkaXIpCi1ub2Jhc2VfZGlzdF9wcm90b19EQVRBID0gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvYW55LnByb3RvICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8gICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8gICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8gICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8gICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8gICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KLQotIyBOb3Qgc3VyZSB3aHkgdGhlc2UgZG9uJ3QgZ2V0IGNsZWFuZWQgYXV0b21hdGljYWxseS4KLWNsZWFuLWxvY2FsOgotCXJtIC1mICoubG9UCi0KLUNMRUFORklMRVMgPSAkKHByb3RvY19vdXRwdXRzKSB1bml0dGVzdF9wcm90b19taWRkbGVtYW4gXAotICAgICAgICAgICAgIHRlc3R6aXAuamFyIHRlc3R6aXAubGlzdCB0ZXN0emlwLnByb3RvIHRlc3R6aXAuemlwCi0KLU1BSU5UQUlORVJDTEVBTkZJTEVTID0gICBcCi0gIE1ha2VmaWxlLmluCi0KLW5vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNfc2VxdWVuY2VfbnVtLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG93ZXIuaCAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybTY0X2djYy5oICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fZ2NjLmggICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmggXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19nZW5lcmljX2djYy5oICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmggICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmggICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wbmFjbC5oICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfc29sYXJpcy5oICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3RzYW4uaCAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmggICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvZmFzdG1lbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zY29wZWRfcHRyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NpbmdsZXRvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9hcGkucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvYW55LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmggICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9tYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX3R5cGVfaGFuZGxlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICQoR1pIRUFERVJTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmggICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX25hbWVzLmggICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lcy5oICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19nZW5lcmF0b3IuaCAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuaCAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaCAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmggICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsLmggICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmggICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaAotCi1saWJfTFRMSUJSQVJJRVMgPSBsaWJwcm90b2J1Zi1saXRlLmxhIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQotCi1saWJwcm90b2J1Zl9saXRlX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKQotbGlicHJvdG9idWZfbGl0ZV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAxMDowOjAgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKLWxpYnByb3RvYnVmX2xpdGVfbGFfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYyAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGh1dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c19tYWNyb3MuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjCi0KLWxpYnByb3RvYnVmX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKQotbGlicHJvdG9idWZfbGFfTERGTEFHUyA9IC12ZXJzaW9uLWluZm8gMTA6MDowIC1leHBvcnQtZHluYW1pYyAtbm8tdW5kZWZpbmVkCi1saWJwcm90b2J1Zl9sYV9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICQobGlicHJvdG9idWZfbGl0ZV9sYV9TT1VSQ0VTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9hbnkucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9hcGkucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9hbnkuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX2ludGVybmFsLmggICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuY2MgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2NvbnN0YW50cy5oICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5jYyAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmNjICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmggICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmNjICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmggICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2V4cGVjdGluZ19vYmplY3R3cml0ZXIuaCAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5jYyAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5oICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuY2MgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuaCAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmNjICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmggICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5jYyAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5oICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2xvY2F0aW9uX3RyYWNrZXIuaCAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL21vY2tfZXJyb3JfbGlzdGVuZXIuaCAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9sb2NhdGlvbl90cmFja2VyLmggICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9zb3VyY2UuaCAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuY2MgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuaCAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5jYyAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5oICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5jYyAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5oICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvX3dyaXRlci5jYyAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvX3dyaXRlci5oICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3N0cnVjdHVyZWRfb2JqZWN0d3JpdGVyLmggICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5jYyAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5oICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYyAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5oICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuY2MgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaCAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuY2MgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5jYwotCi1ub2Rpc3RfbGlicHJvdG9idWZfbGFfU09VUkNFUyA9ICQobm9kaXN0X2xpYnByb3RvYnVmX2xpdGVfbGFfU09VUkNFUykKLQotbGlicHJvdG9jX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQotbGlicHJvdG9jX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvIDEwOjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAotbGlicHJvdG9jX2xhX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmggICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmggICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmggICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tYXBfZmllbGQuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tYXBfZmllbGQuaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmggICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fbGl0ZS5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaCAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGRfbGl0ZS5jYyAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGRfbGl0ZS5oICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fbGl0ZS5oICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmNjICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmggICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaCAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvcl9mYWN0b3J5LmNjICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvcl9mYWN0b3J5LmggICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZC5jYyAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZC5oICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZF9saXRlLmNjXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZF9saXRlLmggXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZC5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZC5oICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZF9saXRlLmNjICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZF9saXRlLmggICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5jYyAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5jYyAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlcl9saXRlLmNjICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaCAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5jYyAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5oICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5oICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5oICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlcl9saXRlLmggICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaCAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYyAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZF9saXRlLmNjICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZF9saXRlLmggICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NoYXJlZF9jb2RlX2dlbmVyYXRvci5jYyAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYyAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmNjICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmggICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmggICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5jYyAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5oICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5jYyAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5oICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmNjICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmggICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmllbGQuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmllbGQuaCAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5jYyAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5oICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmNjICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmggICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5jYyAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5oICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWFwX2ZpZWxkLmNjICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWFwX2ZpZWxkLmggICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZS5jYyAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZS5oICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZV9maWVsZC5jYyAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZV9maWVsZC5oICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcGFyYW1zLmggICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcHJpbWl0aXZlX2ZpZWxkLmNjIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX3ByaW1pdGl2ZV9maWVsZC5oIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmNjICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmggICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmNjIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmggIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uY2MgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uaCAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5jYyAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmNjICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmggICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuY2MgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmNjICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmggICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuY2MgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuaCAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmNjICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmggICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmNjIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmggXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmNjICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmggICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5jYyBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmggXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5jYyAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5oICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmNjICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmggICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmNjICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmggICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmNjICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmggICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3IuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmNjICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmggICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tYXBfZmllbGQuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tYXBfZmllbGQuaCAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlLmNjICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlLmggICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmNjICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmggICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmggICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuY2MgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuaCAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmNjICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuaCAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5jYyBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuaCBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuY2MgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmggXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuY2MgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuaCBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5jYyBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5oIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5jYyAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5oCi0KLWJpbl9QUk9HUkFNUyA9IHByb3RvYwotcHJvdG9jX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQotcHJvdG9jX1NPVVJDRVMgPSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYwotCi0jIFRlc3RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXByb3RvY19pbnB1dHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8gICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8gICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Ryb3BfdW5rbm93bl9maWVsZHMucHJvdG8gICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8gICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8gICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucHJvdG8gICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hX2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hX2ltcG9ydC5wcm90byAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnByb3RvICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8gICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucHJvdG8gICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bS5wcm90byAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wcm90byAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucHJvdG8gICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnByb3RvICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucHJvdG8gICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnByb3RvICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucHJvdG8gICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wcm90byBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucHJvdG8gICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucHJvdG8gICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wcm90byAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wcm90byAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wcm90byBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wcm90byAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucHJvdG8gICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wcm90bwotCi1FWFRSQV9ESVNUID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICQocHJvdG9jX2lucHV0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHNvbGFyaXMvbGlic3RkYysrLmxhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9vbmVvZl9pbXBsZW1lbnRlZCAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9wcm90bzMgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9iYWRfdXRmOF9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9tYXBfdGVzdF9kYXRhLnR4dCAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCAgXAotICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHkudHh0ICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5X29uZW9mLnR4dCAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0ICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhX3BvaW50eS50eHQgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZS5wcm90byAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZS5yYiAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKLQotcHJvdG9jX2xpdGVfb3V0cHV0cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuaCAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmgKLQotcHJvdG9jX291dHB1dHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAkKHByb3RvY19saXRlX291dHB1dHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuY2MgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2xhcmdlX2VudW1fdmFsdWUucGIuaCAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX3Byb3RvMl91bml0dGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfYXJlbmEucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaCAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wYi5oICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmggICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5oICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5jYyAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wYi5oICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuaCAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5jYyAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5oICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfaW1wb3J0LnBiLmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfaW1wb3J0LnBiLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmEucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmEucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5oICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmggICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5jYyAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wYi5oICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmNjICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnBiLmggICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnBiLmggICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucGIuY2MgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnBiLmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuaCAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmNjICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnBiLmggICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuY2MgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucGIuaCAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmNjICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2Jvb2tzLnBiLmggICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuY2MgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucGIuaCAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5jYyBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wYi5oICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuY2MgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2ZpZWxkX21hc2sucGIuaCAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuY2MgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucGIuaCAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5jYyAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wYi5oICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5jYyAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wYi5oICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5jYyBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wYi5oICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5jYyAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wYi5oICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuY2MgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QucGIuaAotCi1CVUlMVF9TT1VSQ0VTID0gJChwcm90b2Nfb3V0cHV0cykKLQotaWYgVVNFX0VYVEVSTkFMX1BST1RPQwotCi11bml0dGVzdF9wcm90b19taWRkbGVtYW46ICQocHJvdG9jX2lucHV0cykKLQkkKFBST1RPQykgLUkkKHNyY2RpcikgLS1jcHBfb3V0PS4gJF4KLQl0b3VjaCB1bml0dGVzdF9wcm90b19taWRkbGVtYW4KLQotZWxzZQotCi0jIFdlIGhhdmUgdG8gY2QgdG8gJChzcmNkaXIpIGJlZm9yZSBleGVjdXRpbmcgcHJvdG9jIGJlY2F1c2UgJChwcm90b2NfaW5wdXRzKSBpcwotIyByZWxhdGl2ZSB0byBzcmNkaXIsIHdoaWNoIG1heSBub3QgYmUgdGhlIHNhbWUgYXMgdGhlIGN1cnJlbnQgZGlyZWN0b3J5IHdoZW4KLSMgYnVpbGRpbmcgb3V0LW9mLXRyZWUuCi11bml0dGVzdF9wcm90b19taWRkbGVtYW46IHByb3RvYyQoRVhFRVhUKSAkKHByb3RvY19pbnB1dHMpCi0Jb2xkcHdkPWBwd2RgICYmICggY2QgJChzcmNkaXIpICYmICQkb2xkcHdkL3Byb3RvYyQoRVhFRVhUKSAtSS4gLS1jcHBfb3V0PSQkb2xkcHdkICQocHJvdG9jX2lucHV0cykgKQotCXRvdWNoIHVuaXR0ZXN0X3Byb3RvX21pZGRsZW1hbgotCi1lbmRpZgotCi0kKHByb3RvY19vdXRwdXRzKTogdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCi0KLUNPTU1PTl9URVNUX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWxfaW1wbC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oCi0KLWNoZWNrX1BST0dSQU1TID0gcHJvdG9jIHByb3RvYnVmLXRlc3QgcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QgXAotICAgICAgICAgICAgICAgICBwcm90b2J1Zi1saXRlLXRlc3QgdGVzdF9wbHVnaW4gcHJvdG9idWYtbGl0ZS1hcmVuYS10ZXN0IFwKLSAgICAgICAgICAgICAgICAgJChHWkNIRUNLUFJPR1JBTVMpCi1wcm90b2J1Zl90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCi0gICAgICAgICAgICAgICAgICAgICAgLi4vZ21vY2svZ3Rlc3QvbGliL2xpYmd0ZXN0LmxhICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgLi4vZ21vY2svbGliL2xpYmdtb2NrLmxhICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgLi4vZ21vY2svbGliL2xpYmdtb2NrX21haW4ubGEKLXByb3RvYnVmX3Rlc3RfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi9nbW9jay9ndGVzdC9pbmNsdWRlIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAtSSQoc3JjZGlyKS8uLi9nbW9jay9pbmNsdWRlCi0jIERpc2FibGUgb3B0aW1pemF0aW9uIGZvciB0ZXN0cyB1bmxlc3MgdGhlIHVzZXIgZXhwbGljaXRseSBhc2tlZCBmb3IgaXQsCi0jIHNpbmNlIHRlc3RfdXRpbC5jYyB0YWtlcyBmb3JldmVyIHRvIGNvbXBpbGUgd2l0aCBvcHRpbWl6YXRpb24gKHdpdGggR0NDKS4KLSMgU2VlIGNvbmZpZ3VyZS5hYyBmb3IgbW9yZSBpbmZvLgotcHJvdG9idWZfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQotcHJvdG9idWZfdGVzdF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkX3VuaXR0ZXN0LmNjICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbF91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmdfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvYXJlbmFfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZHJvcF91bmtub3duX2ZpZWxkc190ZXN0LmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYyAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbm9fZmllbGRfcHJlc2VuY2VfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9wcm90bzNfbGl0ZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3dlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuaCAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXRhZGF0YV90ZXN0LmNjICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5jYyAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzX3VuaXR0ZXN0LmNjIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYyBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyX3Rlc3QuY2MgXAotICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgXAotICAkKENPTU1PTl9URVNUX1NPVVJDRVMpCi0KLQotbm9kaXN0X3Byb3RvYnVmX3Rlc3RfU09VUkNFUyA9ICQocHJvdG9jX291dHB1dHMpCi0KLSMgUnVuIGNwcF91bml0dGVzdCBhZ2FpbiB3aXRoIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMgZGVmaW5lZC4KLXByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIFwKLSAgICAgICAgICAgICAgICAgICAgICBsaWJwcm90b2MubGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAuLi9nbW9jay9ndGVzdC9saWIvbGliZ3Rlc3QubGEgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAuLi9nbW9jay9saWIvbGliZ21vY2subGEgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAuLi9nbW9jay9saWIvbGliZ21vY2tfbWFpbi5sYQotcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi9nbW9jay9pbmNsdWRlICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUkkKHNyY2RpcikvLi4vZ21vY2svZ3Rlc3QvaW5jbHVkZSBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykKLXByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgIFwKLSAgJChDT01NT05fVEVTVF9TT1VSQ0VTKQotbm9kaXN0X3Byb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19vdXRwdXRzKQotCi1DT01NT05fTElURV9URVNUX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oCi0KLSMgQnVpbGQgbGl0ZV91bml0dGVzdCBzZXBhcmF0ZWx5LCBzaW5jZSBpdCBkb2Vzbid0IHVzZSBndGVzdC4gSXQgY2FuJ3QKLSMgZGVwZW5kIG9uIGd0ZXN0IGJlY2F1c2Ugb3VyIGludGVybmFsIHZlcnNpb24gb2YgZ3Rlc3QgZGVwZW5kIG9uIHByb3RvCi0jIGZ1bGwgcnVudGltZSBhbmQgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhpcyB0ZXN0IGJ1aWxkcyB3aXRob3V0IGZ1bGwKLSMgcnVudGltZS4KLXByb3RvYnVmX2xpdGVfdGVzdF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi1saXRlLmxhCi1wcm90b2J1Zl9saXRlX3Rlc3RfQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykKLXByb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICQoQ09NTU9OX0xJVEVfVEVTVF9TT1VSQ0VTKQotbm9kaXN0X3Byb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gJChwcm90b2NfbGl0ZV9vdXRwdXRzKQotCi0jIGxpdGVfYXJlbmFfdW5pdHRlc3QgZGVwZW5kcyBvbiBndGVzdCBiZWNhdXNlIHRlYm9yaW5nQCBmb3VuZCB0aGF0IHdpdGhvdXQKLSMgZ3Rlc3Qgd2hlbiBidWlsZGluZyB0aGUgdGVzdCBpbnRlcm5hbGx5IG91ciBtZW1vcnkgc2FuaXRpemVyIGRvZXNuJ3QgZGV0ZWN0Ci0jIG1lbW9yeSBsZWFrcyAoZG9uJ3Qga25vdyB3aHkpLgotcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLWxpdGUubGEgXAotICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2d0ZXN0L2xpYi9saWJndGVzdC5sYSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2xpYi9saWJnbW9jay5sYSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2xpYi9saWJnbW9ja19tYWluLmxhCi1wcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi9nbW9jay9pbmNsdWRlICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChzcmNkaXIpLy4uL2dtb2NrL2d0ZXN0L2luY2x1ZGUKLXByb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQotcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMgPSAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjIFwKLSAgJChDT01NT05fTElURV9URVNUX1NPVVJDRVMpCi1ub2Rpc3RfcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19saXRlX291dHB1dHMpCi0KLSMgVGVzdCBwbHVnaW4gYmluYXJ5LgotdGVzdF9wbHVnaW5fTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEgbGlicHJvdG9jLmxhIFwKLSAgICAgICAgICAgICAgICAgICAgLi4vZ21vY2svZ3Rlc3QvbGliL2xpYmd0ZXN0LmxhCi10ZXN0X3BsdWdpbl9DUFBGTEFHUyA9IC1JJChzcmNkaXIpLy4uL2dtb2NrL2d0ZXN0L2luY2x1ZGUKLXRlc3RfcGx1Z2luX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjCi0KLWlmIEhBVkVfWkxJQgotemNnemlwX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhCi16Y2d6aXBfU09VUkNFUyA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYwotCi16Y2d1bnppcF9MREFERCA9ICQoUFRIUkVBRF9MSUJTKSBsaWJwcm90b2J1Zi5sYQotemNndW56aXBfU09VUkNFUyA9IGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCi1lbmRpZgotCi1URVNUUyA9IHByb3RvYnVmLXRlc3QgcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QgcHJvdG9idWYtbGl0ZS10ZXN0IFwKLSAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2ggJChHWlRFU1RTKSAgICAgXAotICAgICAgICBwcm90b2J1Zi1saXRlLWFyZW5hLXRlc3QKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmEuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmEuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODg0MDIwMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MjUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FSRU5BX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJFTkFfSF9fCi0KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaWZkZWYgbWF4Ci0jdW5kZWYgbWF4ICAvLyBWaXN1YWwgU3R1ZGlvIGRlZmluZXMgdGhpcyBtYWNybwotI2VuZGlmCi0jaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0cy5oPgotI2VuZGlmCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIV9IQVNfRVhDRVBUSU9OUwotLy8gV29yayBhcm91bmQgYnVncyBpbiBNU1ZDIDx0eXBlaW5mbz4gaGVhZGVyIHdoZW4gX0hBU19FWENFUFRJT05TPTAuCi0jaW5jbHVkZSA8ZXhjZXB0aW9uPgotI2luY2x1ZGUgPHR5cGVpbmZvPgotbmFtZXNwYWNlIHN0ZCB7Ci11c2luZyB0eXBlX2luZm8gPSA6OnR5cGVfaW5mbzsKLX0KLSNlbHNlCi0jaW5jbHVkZSA8dHlwZWluZm8+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNfc2VxdWVuY2VfbnVtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0cy5oPgotCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotY2xhc3MgQXJlbmE7ICAgICAgIC8vIGRlZmluZWQgYmVsb3cKLWNsYXNzIE1lc3NhZ2U7ICAgICAvLyBtZXNzYWdlLmgKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIEFyZW5hU3RyaW5nOyAvLyBhcmVuYXN0cmluZy5oCi1jbGFzcyBMYXp5RmllbGQ7ICAgLy8gbGF6eV9maWVsZC5oCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+Ci1jbGFzcyBHZW5lcmljVHlwZUhhbmRsZXI7IC8vIHJlcGVhdGVkX2ZpZWxkLmgKLQotLy8gVGVtcGxhdGVkIGNsZWFudXAgbWV0aG9kcy4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYXJlbmFfZGVzdHJ1Y3Rfb2JqZWN0KHZvaWQqIG9iamVjdCkgewotICByZWludGVycHJldF9jYXN0PFQqPihvYmplY3QpLT5+VCgpOwotfQotdGVtcGxhdGU8dHlwZW5hbWUgVD4gdm9pZCBhcmVuYV9kZWxldGVfb2JqZWN0KHZvaWQqIG9iamVjdCkgewotICBkZWxldGUgcmVpbnRlcnByZXRfY2FzdDxUKj4ob2JqZWN0KTsKLX0KLWlubGluZSB2b2lkIGFyZW5hX2ZyZWUodm9pZCogb2JqZWN0LCBzaXplX3QgLyogc2l6ZSAqLykgewotICBmcmVlKG9iamVjdCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyBBcmVuYU9wdGlvbnMgcHJvdmlkZXMgb3B0aW9uYWwgYWRkaXRpb25hbCBwYXJhbWV0ZXJzIHRvIGFyZW5hIGNvbnN0cnVjdGlvbgotLy8gdGhhdCBjb250cm9sIGl0cyBibG9jay1hbGxvY2F0aW9uIGJlaGF2aW9yLgotc3RydWN0IEFyZW5hT3B0aW9ucyB7Ci0gIC8vIFRoaXMgZGVmaW5lcyB0aGUgc2l6ZSBvZiB0aGUgZmlyc3QgYmxvY2sgcmVxdWVzdGVkIGZyb20gdGhlIHN5c3RlbSBtYWxsb2MuCi0gIC8vIFN1YnNlcXVlbnQgYmxvY2sgc2l6ZXMgd2lsbCBpbmNyZWFzZSBpbiBhIGdlb21ldHJpYyBzZXJpZXMgdXAgdG8gYSBtYXhpbXVtLgotICBzaXplX3Qgc3RhcnRfYmxvY2tfc2l6ZTsKLQotICAvLyBUaGlzIGRlZmluZXMgdGhlIG1heGltdW0gYmxvY2sgc2l6ZSByZXF1ZXN0ZWQgZnJvbSBzeXN0ZW0gbWFsbG9jICh1bmxlc3MgYW4KLSAgLy8gaW5kaXZpZHVhbCBhcmVuYSBhbGxvY2F0aW9uIHJlcXVlc3Qgb2NjdXJzIHdpdGggYSBzaXplIGxhcmdlciB0aGFuIHRoaXMKLSAgLy8gbWF4aW11bSkuIFJlcXVlc3RlZCBibG9jayBzaXplcyBpbmNyZWFzZSB1cCB0byB0aGlzIHZhbHVlLCB0aGVuIHJlbWFpbgotICAvLyBoZXJlLgotICBzaXplX3QgbWF4X2Jsb2NrX3NpemU7Ci0KLSAgLy8gQW4gaW5pdGlhbCBibG9jayBvZiBtZW1vcnkgZm9yIHRoZSBhcmVuYSB0byB1c2UsIG9yIE5VTEwgZm9yIG5vbmUuIElmCi0gIC8vIHByb3ZpZGVkLCB0aGUgYmxvY2sgbXVzdCBsaXZlIGF0IGxlYXN0IGFzIGxvbmcgYXMgdGhlIGFyZW5hIGl0c2VsZi4gVGhlCi0gIC8vIGNyZWF0b3Igb2YgdGhlIEFyZW5hIHJldGFpbnMgb3duZXJzaGlwIG9mIHRoZSBibG9jayBhZnRlciB0aGUgQXJlbmEgaXMKLSAgLy8gZGVzdHJveWVkLgotICBjaGFyKiBpbml0aWFsX2Jsb2NrOwotCi0gIC8vIFRoZSBzaXplIG9mIHRoZSBpbml0aWFsIGJsb2NrLCBpZiBwcm92aWRlZC4KLSAgc2l6ZV90IGluaXRpYWxfYmxvY2tfc2l6ZTsKLQotICAvLyBBIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYW4gYWxsb2MgbWV0aG9kIHRoYXQgcmV0dXJucyBtZW1vcnkgYmxvY2tzIG9mIHNpemUKLSAgLy8gcmVxdWVzdGVkLiBCeSBkZWZhdWx0LCBpdCBjb250YWlucyBhIHB0ciB0byB0aGUgbWFsbG9jIGZ1bmN0aW9uLgotICAvLwotICAvLyBOT1RFOiBibG9ja19hbGxvYyBhbmQgZGVhbGxvYyBmdW5jdGlvbnMgYXJlIGV4cGVjdGVkIHRvIGJlaGF2ZSBsaWtlCi0gIC8vIG1hbGxvYyBhbmQgZnJlZSwgaW5jbHVkaW5nIEFzYW4gcG9pc29uaW5nLgotICB2b2lkKiAoKmJsb2NrX2FsbG9jKShzaXplX3QpOwotICAvLyBBIGZ1bmN0aW9uIHBvaW50ZXIgdG8gYSBkZWFsbG9jIG1ldGhvZCB0aGF0IHRha2VzIG93bmVyc2hpcCBvZiB0aGUgYmxvY2tzCi0gIC8vIGZyb20gdGhlIGFyZW5hLiBCeSBkZWZhdWx0LCBpdCBjb250YWlucyBhIHB0ciB0byBhIHdyYXBwZXIgZnVuY3Rpb24gdGhhdAotICAvLyBjYWxscyBmcmVlLgotICB2b2lkICgqYmxvY2tfZGVhbGxvYykodm9pZCosIHNpemVfdCk7Ci0KLSAgLy8gSG9va3MgZm9yIGFkZGluZyBleHRlcm5hbCBmdW5jdGlvbmFsaXR5IHN1Y2ggYXMgdXNlci1zcGVjaWZpYyBtZXRyaWNzCi0gIC8vIGNvbGxlY3Rpb24sIHNwZWNpZmljIGRlYnVnZ2luZyBhYmlsaXRpZXMsIGV0Yy4KLSAgLy8gSW5pdCBob29rIG1heSByZXR1cm4gYSBwb2ludGVyIHRvIGEgY29va2llIHRvIGJlIHN0b3JlZCBpbiB0aGUgYXJlbmEuCi0gIC8vIHJlc2V0IGFuZCBkZXN0cnVjdGlvbiBob29rcyB3aWxsIHRoZW4gYmUgY2FsbGVkIHdpdGggdGhlIHNhbWUgY29va2llCi0gIC8vIHBvaW50ZXIuIFRoaXMgYWxsb3dzIHVzIHRvIHNhdmUgYW4gZXh0ZXJuYWwgb2JqZWN0IHBlciBhcmVuYSBpbnN0YW5jZSBhbmQKLSAgLy8gdXNlIGl0IG9uIHRoZSBvdGhlciBob29rcyAoTm90ZTogSXQgaXMganVzdCBhcyBsZWdhbCBmb3IgaW5pdCB0byByZXR1cm4KLSAgLy8gTlVMTCBhbmQgbm90IHVzZSB0aGUgY29va2llIGZlYXR1cmUpLgotICAvLyBvbl9hcmVuYV9yZXNldCBhbmQgb25fYXJlbmFfZGVzdHJ1Y3Rpb24gYWxzbyByZWNlaXZlIHRoZSBzcGFjZSB1c2VkIGluCi0gIC8vIHRoZSBhcmVuYSBqdXN0IGJlZm9yZSB0aGUgcmVzZXQuCi0gIHZvaWQqICgqb25fYXJlbmFfaW5pdCkoQXJlbmEqIGFyZW5hKTsKLSAgdm9pZCAoKm9uX2FyZW5hX3Jlc2V0KShBcmVuYSogYXJlbmEsIHZvaWQqIGNvb2tpZSwgdWludDY0IHNwYWNlX3VzZWQpOwotICB2b2lkICgqb25fYXJlbmFfZGVzdHJ1Y3Rpb24pKEFyZW5hKiBhcmVuYSwgdm9pZCogY29va2llLCB1aW50NjQgc3BhY2VfdXNlZCk7Ci0KLSAgLy8gdHlwZV9pbmZvIGlzIHByb21pc2VkIHRvIGJlIHN0YXRpYyAtIGl0cyBsaWZldGltZSBleHRlbmRzIHRvCi0gIC8vIG1hdGNoIHByb2dyYW0ncyBsaWZldGltZSAoSXQgaXMgZ2l2ZW4gYnkgdHlwZWlkIG9wZXJhdG9yKS4KLSAgLy8gTm90ZTogdHlwZWlkKHZvaWQpIHdpbGwgYmUgcGFzc2VkIGFzIGFsbG9jYXRlZF90eXBlIGV2ZXJ5IHRpbWUgd2UKLSAgLy8gaW50ZW50aW9uYWxseSB3YW50IHRvIGF2b2lkIG1vbml0b3JpbmcgYW4gYWxsb2NhdGlvbi4gKGkuZS4gaW50ZXJuYWwKLSAgLy8gYWxsb2NhdGlvbnMgZm9yIG1hbmFnaW5nIHRoZSBhcmVuYSkKLSAgdm9pZCAoKm9uX2FyZW5hX2FsbG9jYXRpb24pKGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBhbGxvY2F0ZWRfdHlwZSwKLSAgICAgIHVpbnQ2NCBhbGxvY19zaXplLCB2b2lkKiBjb29raWUpOwotCi0gIEFyZW5hT3B0aW9ucygpCi0gICAgICA6IHN0YXJ0X2Jsb2NrX3NpemUoa0RlZmF1bHRTdGFydEJsb2NrU2l6ZSksCi0gICAgICAgIG1heF9ibG9ja19zaXplKGtEZWZhdWx0TWF4QmxvY2tTaXplKSwKLSAgICAgICAgaW5pdGlhbF9ibG9jayhOVUxMKSwKLSAgICAgICAgaW5pdGlhbF9ibG9ja19zaXplKDApLAotICAgICAgICBibG9ja19hbGxvYygmbWFsbG9jKSwKLSAgICAgICAgYmxvY2tfZGVhbGxvYygmaW50ZXJuYWw6OmFyZW5hX2ZyZWUpLAotICAgICAgICBvbl9hcmVuYV9pbml0KE5VTEwpLAotICAgICAgICBvbl9hcmVuYV9yZXNldChOVUxMKSwKLSAgICAgICAgb25fYXJlbmFfZGVzdHJ1Y3Rpb24oTlVMTCksCi0gICAgICAgIG9uX2FyZW5hX2FsbG9jYXRpb24oTlVMTCkge30KLQotIHByaXZhdGU6Ci0gIC8vIENvbnN0YW50cyBkZWZpbmUgZGVmYXVsdCBzdGFydGluZyBibG9jayBzaXplIGFuZCBtYXggYmxvY2sgc2l6ZSBmb3IKLSAgLy8gYXJlbmEgYWxsb2NhdG9yIGJlaGF2aW9yIC0tIHNlZSBkZXNjcmlwdGlvbnMgYWJvdmUuCi0gIHN0YXRpYyBjb25zdCBzaXplX3Qga0RlZmF1bHRTdGFydEJsb2NrU2l6ZSA9IDI1NjsKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrRGVmYXVsdE1heEJsb2NrU2l6ZSAgID0gODE5MjsKLX07Ci0KLS8vIFN1cHBvcnQgZm9yIG5vbi1SVFRJIGVudmlyb25tZW50cy4gKFRoZSBtZXRyaWNzIGhvb2tzIEFQSSB1c2VzIHR5cGUKLS8vIGluZm9ybWF0aW9uLikKLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX05PX1JUVEkKLSNkZWZpbmUgUlRUSV9UWVBFX0lEKHR5cGUpICgmdHlwZWlkKHR5cGUpKQotI2Vsc2UKLSNkZWZpbmUgUlRUSV9UWVBFX0lEKHR5cGUpIChOVUxMKQotI2VuZGlmCi0KLS8vIEFyZW5hIGFsbG9jYXRvci4gQXJlbmEgYWxsb2NhdGlvbiByZXBsYWNlcyBvcmRpbmFyeSAoaGVhcC1iYXNlZCkgYWxsb2NhdGlvbgotLy8gd2l0aCBuZXcvZGVsZXRlLCBhbmQgaW1wcm92ZXMgcGVyZm9ybWFuY2UgYnkgYWdncmVnYXRpbmcgYWxsb2NhdGlvbnMgaW50bwotLy8gbGFyZ2VyIGJsb2NrcyBhbmQgZnJlZWluZyBhbGxvY2F0aW9ucyBhbGwgYXQgb25jZS4gUHJvdG9jb2wgbWVzc2FnZXMgYXJlCi0vLyBhbGxvY2F0ZWQgb24gYW4gYXJlbmEgYnkgdXNpbmcgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8VD4oQXJlbmEqKSwgYmVsb3csIGFuZAotLy8gYXJlIGF1dG9tYXRpY2FsbHkgZnJlZWQgd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkLgotLy8KLS8vIFRoaXMgaXMgYSB0aHJlYWQtc2FmZSBpbXBsZW1lbnRhdGlvbjogbXVsdGlwbGUgdGhyZWFkcyBtYXkgYWxsb2NhdGUgZnJvbSB0aGUKLS8vIGFyZW5hIGNvbmN1cnJlbnRseS4gRGVzdHJ1Y3Rpb24gaXMgbm90IHRocmVhZC1zYWZlIGFuZCB0aGUgZGVzdHJ1Y3RpbmcKLS8vIHRocmVhZCBtdXN0IHN5bmNocm9uaXplIHdpdGggdXNlcnMgb2YgdGhlIGFyZW5hIGZpcnN0LgotLy8KLS8vIEFuIGFyZW5hIHByb3ZpZGVzIHR3byBhbGxvY2F0aW9uIGludGVyZmFjZXM6IENyZWF0ZU1lc3NhZ2U8VD4sIHdoaWNoIHdvcmtzCi0vLyBmb3IgYXJlbmEtZW5hYmxlZCBwcm90bzIgbWVzc2FnZSB0eXBlcyBhcyB3ZWxsIGFzIG90aGVyIHR5cGVzIHRoYXQgc2F0aXNmeQotLy8gdGhlIGFwcHJvcHJpYXRlIHByb3RvY29sIChkZXNjcmliZWQgYmVsb3cpLCBhbmQgQ3JlYXRlPFQ+LCB3aGljaCB3b3JrcyBmb3IKLS8vIGFueSBhcmJpdHJhcnkgdHlwZSBULiBDcmVhdGVNZXNzYWdlPFQ+IGlzIGJldHRlciB3aGVuIHRoZSB0eXBlIFQgc3VwcG9ydHMgaXQsCi0vLyBiZWNhdXNlIHRoaXMgaW50ZXJmYWNlIChpKSBwYXNzZXMgdGhlIGFyZW5hIHBvaW50ZXIgdG8gdGhlIGNyZWF0ZWQgb2JqZWN0IHNvCi0vLyB0aGF0IGl0cyBzdWItb2JqZWN0cyBhbmQgaW50ZXJuYWwgYWxsb2NhdGlvbnMgY2FuIHVzZSB0aGUgYXJlbmEgdG9vLCBhbmQgKGlpKQotLy8gZWxpZGVzIHRoZSBvYmplY3QncyBkZXN0cnVjdG9yIGNhbGwgd2hlbiBwb3NzaWJsZS4gQ3JlYXRlPFQ+IGRvZXMgbm90IHBsYWNlCi0vLyBhbnkgc3BlY2lhbCByZXF1aXJlbWVudHMgb24gdGhlIHR5cGUgVCwgYW5kIHdpbGwgaW52b2tlIHRoZSBvYmplY3QncwotLy8gZGVzdHJ1Y3RvciB3aGVuIHRoZSBhcmVuYSBpcyBkZXN0cm95ZWQuCi0vLwotLy8gVGhlIGFyZW5hIG1lc3NhZ2UgYWxsb2NhdGlvbiBwcm90b2NvbCwgcmVxdWlyZWQgYnkgQ3JlYXRlTWVzc2FnZTxUPiwgaXMgYXMKLS8vIGZvbGxvd3M6Ci0vLwotLy8gLSBUaGUgdHlwZSBUIG11c3QgaGF2ZSAoYXQgbGVhc3QpIHR3byBjb25zdHJ1Y3RvcnM6IGEgY29uc3RydWN0b3Igd2l0aCBubwotLy8gICBhcmd1bWVudHMsIGNhbGxlZCB3aGVuIGEgVCBpcyBhbGxvY2F0ZWQgb24gdGhlIGhlYXA7IGFuZCBhIGNvbnN0cnVjdG9yIHdpdGgKLS8vICAgYSBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJndW1lbnQsIGNhbGxlZCB3aGVuIGEgVCBpcyBhbGxvY2F0ZWQgb24gYW4gYXJlbmEuIElmIHRoZQotLy8gICBzZWNvbmQgY29uc3RydWN0b3IgaXMgY2FsbGVkIHdpdGggYSBOVUxMIGFyZW5hIHBvaW50ZXIsIGl0IG11c3QgYmUKLS8vICAgZXF1aXZhbGVudCB0byBpbnZva2luZyB0aGUgZmlyc3QgKG5vLWFyZ3VtZW50KSBjb25zdHJ1Y3Rvci4KLS8vCi0vLyAtIFRoZSB0eXBlIFQgbXVzdCBoYXZlIGEgcGFydGljdWxhciB0eXBlIHRyYWl0OiBhIG5lc3RlZCB0eXBlCi0vLyAgIHxJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV98LiBUaGlzIGlzIHVzdWFsbHkgYSB0eXBlZGVmIHRvIHx2b2lkfC4gSWYgbm8KLS8vICAgc3VjaCB0eXBlIHRyYWl0IGV4aXN0cywgdGhlbiB0aGUgaW5zdGFudGlhdGlvbiBDcmVhdGVNZXNzYWdlPFQ+IHdpbGwgZmFpbAotLy8gICB0byBjb21waWxlLgotLy8KLS8vIC0gVGhlIHR5cGUgVCAqbWF5KiBoYXZlIHRoZSB0eXBlIHRyYWl0IHxEZXN0cnVjdG9yU2tpcHBhYmxlX3wuIElmIHRoaXMgdHlwZQotLy8gICB0cmFpdCBpcyBwcmVzZW50IGluIHRoZSB0eXBlLCB0aGVuIGl0cyBkZXN0cnVjdG9yIHdpbGwgbm90IGJlIGNhbGxlZCBpZiBhbmQKLS8vICAgb25seSBpZiBpdCB3YXMgcGFzc2VkIGEgbm9uLU5VTEwgYXJlbmEgcG9pbnRlci4gSWYgdGhpcyB0eXBlIHRyYWl0IGlzIG5vdAotLy8gICBwcmVzZW50IG9uIHRoZSB0eXBlLCB0aGVuIGl0cyBkZXN0cnVjdG9yIGlzIGFsd2F5cyBjYWxsZWQgd2hlbiB0aGUKLS8vICAgY29udGFpbmluZyBhcmVuYSBpcyBkZXN0cm95ZWQuCi0vLwotLy8gLSBPbmUtIGFuZCB0d28tdXNlci1hcmd1bWVudCBmb3JtcyBvZiBDcmVhdGVNZXNzYWdlPFQ+KCkgYWxzbyBleGlzdCB0aGF0Ci0vLyAgIGZvcndhcmQgdGhlc2UgY29uc3RydWN0b3IgYXJndW1lbnRzIHRvIFQncyBjb25zdHJ1Y3RvcjogZm9yIGV4YW1wbGUsCi0vLyAgIENyZWF0ZU1lc3NhZ2U8VD4oQXJlbmEqLCBhcmcxLCBhcmcyKSBmb3J3YXJkcyB0byBhIGNvbnN0cnVjdG9yIFQoQXJlbmEqLAotLy8gICBhcmcxLCBhcmcyKS4KLS8vCi0vLyBUaGlzIHByb3RvY29sIGlzIGltcGxlbWVudGVkIGJ5IGFsbCBhcmVuYS1lbmFibGVkIHByb3RvMiBtZXNzYWdlIGNsYXNzZXMgYXMKLS8vIHdlbGwgYXMgUmVwZWF0ZWRQdHJGaWVsZC4KLQotI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBBcmVuYSBmaW5hbCB7Ci0jZWxzZQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEFyZW5hIHsKLSNlbmRpZgotIHB1YmxpYzoKLSAgLy8gQXJlbmEgY29uc3RydWN0b3IgdGFraW5nIGN1c3RvbSBvcHRpb25zLiBTZWUgQXJlbmFPcHRpb25zIGJlbG93IGZvcgotICAvLyBkZXNjcmlwdGlvbnMgb2YgdGhlIG9wdGlvbnMgYXZhaWxhYmxlLgotICBleHBsaWNpdCBBcmVuYShjb25zdCBBcmVuYU9wdGlvbnMmIG9wdGlvbnMpIDogb3B0aW9uc18ob3B0aW9ucykgewotICAgIEluaXQoKTsKLSAgfQotCi0gIC8vIERlZmF1bHQgY29uc3RydWN0b3Igd2l0aCBzZW5zaWJsZSBkZWZhdWx0IG9wdGlvbnMsIHR1bmVkIGZvciBhdmVyYWdlCi0gIC8vIHVzZS1jYXNlcy4KLSAgQXJlbmEoKSB7Ci0gICAgSW5pdCgpOwotICB9Ci0KLSAgLy8gRGVzdHJ1Y3RvciBkZWxldGVzIGFsbCBvd25lZCBoZWFwIGFsbG9jYXRlZCBvYmplY3RzLCBhbmQgZGVzdHJ1Y3RzIG9iamVjdHMKLSAgLy8gdGhhdCBoYXZlIG5vbi10cml2aWFsIGRlc3RydWN0b3JzLCBleGNlcHQgZm9yIHByb3RvMiBtZXNzYWdlIG9iamVjdHMgd2hvc2UKLSAgLy8gZGVzdHJ1Y3RvcnMgY2FuIGJlIHNraXBwZWQuIEFsc28sIGZyZWVzIGFsbCBibG9ja3MgZXhjZXB0IHRoZSBpbml0aWFsIGJsb2NrCi0gIC8vIGlmIGl0IHdhcyBwYXNzZWQgaW4uCi0gIH5BcmVuYSgpOwotCi0gIC8vIEFQSSB0byBjcmVhdGUgcHJvdG8yIG1lc3NhZ2Ugb2JqZWN0cyBvbiB0aGUgYXJlbmEuIElmIHRoZSBhcmVuYSBwYXNzZWQgaW4KLSAgLy8gaXMgTlVMTCwgdGhlbiBhIGhlYXAgYWxsb2NhdGVkIG9iamVjdCBpcyByZXR1cm5lZC4gVHlwZSBUIG11c3QgYmUgYSBtZXNzYWdlCi0gIC8vIGRlZmluZWQgaW4gYSAucHJvdG8gZmlsZSB3aXRoIGNjX2VuYWJsZV9hcmVuYXMgc2V0IHRvIHRydWUsIG90aGVyd2lzZSBhCi0gIC8vIGNvbXBpbGF0aW9uIGVycm9yIHdpbGwgb2NjdXIuCi0gIC8vCi0gIC8vIFJlcGVhdGVkRmllbGQgYW5kIFJlcGVhdGVkUHRyRmllbGQgbWF5IGFsc28gYmUgaW5zdGFudGlhdGVkIGRpcmVjdGx5IG9uIGFuCi0gIC8vIGFyZW5hIHdpdGggdGhpcyBtZXRob2QuCi0gIC8vCi0gIC8vIFRoaXMgZnVuY3Rpb24gYWxzbyBhY2NlcHRzIGFueSB0eXBlIFQgdGhhdCBzYXRpc2ZpZXMgdGhlIGFyZW5hIG1lc3NhZ2UKLSAgLy8gYWxsb2NhdGlvbiBwcm90b2NvbCwgZG9jdW1lbnRlZCBhYm92ZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgVCogQ3JlYXRlTWVzc2FnZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgewotICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gbmV3IFQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBhcmVuYS0+Q3JlYXRlTWVzc2FnZUludGVybmFsPFQ+KHN0YXRpY19jYXN0PFQqPigwKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gT25lLWFyZ3VtZW50IGZvcm0gb2YgQ3JlYXRlTWVzc2FnZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnN0cnVjdGluZyBvYmplY3RzCi0gIC8vIHRoYXQgaW1wbGVtZW50IHRoZSBhcmVuYSBtZXNzYWdlIGNvbnN0cnVjdGlvbiBwcm90b2NvbCBkZXNjcmliZWQgYWJvdmUgYnV0Ci0gIC8vIHRha2UgYWRkaXRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmc+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgVCogQ3JlYXRlTWVzc2FnZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgY29uc3QgQXJnJiBhcmcpIHsKLSAgICBpZiAoYXJlbmEgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIG5ldyBUKE5VTEwsIGFyZyk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBhcmVuYS0+Q3JlYXRlTWVzc2FnZUludGVybmFsPFQ+KHN0YXRpY19jYXN0PFQqPigwKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVHdvLWFyZ3VtZW50IGZvcm0gb2YgQ3JlYXRlTWVzc2FnZS4gVGhpcyBpcyB1c2VmdWwgZm9yIGNvbnN0cnVjdGluZyBvYmplY3RzCi0gIC8vIHRoYXQgaW1wbGVtZW50IHRoZSBhcmVuYSBtZXNzYWdlIGNvbnN0cnVjdGlvbiBwcm90b2NvbCBkZXNjcmliZWQgYWJvdmUgYnV0Ci0gIC8vIHRha2UgYWRkaXRpb25hbCBjb25zdHJ1Y3RvciBhcmd1bWVudHMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgc3RhdGljIFQqIENyZWF0ZU1lc3NhZ2UoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzImIGFyZzIpIHsKLSAgICBpZiAoYXJlbmEgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIG5ldyBUKE5VTEwsIGFyZzEsIGFyZzIpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDxUPihzdGF0aWNfY2FzdDxUKj4oMCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCBhcmcyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBBUEkgdG8gY3JlYXRlIGFueSBvYmplY3RzIG9uIHRoZSBhcmVuYS4gTm90ZSB0aGF0IG9ubHkgdGhlIG9iamVjdCB3aWxsCi0gIC8vIGJlIGNyZWF0ZWQgb24gdGhlIGFyZW5hOyB0aGUgdW5kZXJseWluZyBwdHJzIChpbiBjYXNlIG9mIGEgcHJvdG8yIG1lc3NhZ2UpCi0gIC8vIHdpbGwgYmUgc3RpbGwgaGVhcCBhbGxvY2F0ZWQuIFByb3RvIG1lc3NhZ2VzIHNob3VsZCB1c3VhbGx5IGJlIGFsbG9jYXRlZAotICAvLyB3aXRoIENyZWF0ZU1lc3NhZ2U8VD4oKSBpbnN0ZWFkLgotICAvLwotICAvLyBOb3RlIHRoYXQgZXZlbiBpZiBUIHNhdGlzZmllcyB0aGUgYXJlbmEgbWVzc2FnZSBjb25zdHJ1Y3Rpb24gcHJvdG9jb2wKLSAgLy8gKEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyB0cmFpdCBhbmQgb3B0aW9uYWwgRGVzdHJ1Y3RvclNraXBwYWJsZV8KLSAgLy8gdHJhaXQpLCBhcyBkZXNjcmliZWQgYWJvdmUsIHRoaXMgZnVuY3Rpb24gZG9lcyBub3QgZm9sbG93IHRoZSBwcm90b2NvbDsKLSAgLy8gaW5zdGVhZCwgaXQgdHJlYXRzIFQgYXMgYSBibGFjay1ib3ggdHlwZSwganVzdCBhcyBpZiBpdCBkaWQgbm90IGhhdmUgdGhlc2UKLSAgLy8gdHJhaXRzLiBTcGVjaWZpY2FsbHksIFQncyBjb25zdHJ1Y3RvciBhcmd1bWVudHMgd2lsbCBhbHdheXMgYmUgb25seSB0aG9zZQotICAvLyBwYXNzZWQgdG8gQ3JlYXRlPFQ+KCkgLS0gbm8gYWRkaXRpb25hbCBhcmVuYSBwb2ludGVyIGlzIGltcGxpY2l0bHkgYWRkZWQuCi0gIC8vIEZ1cnRoZXJtb3JlLCB0aGUgZGVzdHJ1Y3RvciB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgYXQgYXJlbmEgZGVzdHJ1Y3Rpb24gdGltZQotICAvLyAodW5sZXNzIHRoZSBkZXN0cnVjdG9yIGlzIHRyaXZpYWwpLiBIZW5jZSwgZnJvbSBUJ3MgcG9pbnQgb2YgdmlldywgaXQgaXMgYXMKLSAgLy8gaWYgdGhlIG9iamVjdCB3ZXJlIGFsbG9jYXRlZCBvbiB0aGUgaGVhcCAoZXhjZXB0IHRoYXQgdGhlIHVuZGVybHlpbmcgbWVtb3J5Ci0gIC8vIGlzIG9idGFpbmVkIGZyb20gdGhlIGFyZW5hKS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgVCogQ3JlYXRlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSB7Ci0gICAgaWYgKGFyZW5hID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBuZXcgVCgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZUludGVybmFsPFQ+KGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVmVyc2lvbiBvZiB0aGUgYWJvdmUgd2l0aCBvbmUgY29uc3RydWN0b3IgYXJndW1lbnQgZm9yIHRoZSBjcmVhdGVkIG9iamVjdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZz4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCi0gIHN0YXRpYyBUKiBDcmVhdGUoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGNvbnN0IEFyZyYgYXJnKSB7Ci0gICAgaWYgKGFyZW5hID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBuZXcgVChhcmcpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZUludGVybmFsPFQ+KGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnKTsKLSAgICB9Ci0gIH0KLQotICAvLyBWZXJzaW9uIG9mIHRoZSBhYm92ZSB3aXRoIHR3byBjb25zdHJ1Y3RvciBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGVkIG9iamVjdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgVCogQ3JlYXRlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyKSB7Ci0gICAgaWYgKGFyZW5hID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBuZXcgVChhcmcxLCBhcmcyKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPihnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIGFyZzIpOwotICAgIH0KLSAgfQotCi0gIC8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdpdGggdGhyZWUgY29uc3RydWN0b3IgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlZAotICAvLyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczPgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGFyZzMpIHsKLSAgICBpZiAoYXJlbmEgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIG5ldyBUKGFyZzEsIGFyZzIsIGFyZzMpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZUludGVybmFsPFQ+KGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgYXJnMiwgYXJnMyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVmVyc2lvbiBvZiB0aGUgYWJvdmUgd2l0aCBmb3VyIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZWQKLSAgLy8gb2JqZWN0LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKLSAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQ+Ci0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgVCogQ3JlYXRlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCkgewotICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gbmV3IFQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBhcmVuYS0+Q3JlYXRlSW50ZXJuYWw8VD4oZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Omhhc190cml2aWFsX2Rlc3RydWN0b3I8VD46OnZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCBhcmcyLCBhcmczLCBhcmc0KTsKLSAgICB9Ci0gIH0KLQotICAvLyBWZXJzaW9uIG9mIHRoZSBhYm92ZSB3aXRoIGZpdmUgY29uc3RydWN0b3IgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlZAotICAvLyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgICAgICAgICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNT4KLSAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHN0YXRpYyBUKiBDcmVhdGUoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczLCBjb25zdCBBcmc0JiBhcmc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzUmIGFyZzUpIHsKLSAgICBpZiAoYXJlbmEgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIG5ldyBUKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZUludGVybmFsPFQ+KGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVmVyc2lvbiBvZiB0aGUgYWJvdmUgd2l0aCBzaXggY29uc3RydWN0b3IgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlZAotICAvLyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgICAgICAgICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNSwgdHlwZW5hbWUgQXJnNj4KLSAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHN0YXRpYyBUKiBDcmVhdGUoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczLCBjb25zdCBBcmc0JiBhcmc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzUmIGFyZzUsIGNvbnN0IEFyZzYmIGFyZzYpIHsKLSAgICBpZiAoYXJlbmEgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIG5ldyBUKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZUludGVybmFsPFQ+KGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7Ci0gICAgfQotICB9Ci0KLSAgLy8gVmVyc2lvbiBvZiB0aGUgYWJvdmUgd2l0aCBzZXZlbiBjb25zdHJ1Y3RvciBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGVkCi0gIC8vIG9iamVjdC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgICAgICAgICB0eXBlbmFtZSBBcmc0LCB0eXBlbmFtZSBBcmc1LCB0eXBlbmFtZSBBcmc2LCB0eXBlbmFtZSBBcmc3PgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGFyZzMsIGNvbnN0IEFyZzQmIGFyZzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNSYgYXJnNSwgY29uc3QgQXJnNiYgYXJnNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc3JiBhcmc3KSB7Ci0gICAgaWYgKGFyZW5hID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBuZXcgVChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3KTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPihnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcpOwotICAgIH0KLSAgfQotCi0gIC8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdpdGggZWlnaHQgY29uc3RydWN0b3IgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlZAotICAvLyBvYmplY3QuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgICAgICAgICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNSwgdHlwZW5hbWUgQXJnNiwgdHlwZW5hbWUgQXJnNywKLSAgICAgICAgICAgIHR5cGVuYW1lIEFyZzg+Ci0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgVCogQ3JlYXRlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc1JiBhcmc1LCBjb25zdCBBcmc2JiBhcmc2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzcmIGFyZzcsIGNvbnN0IEFyZzgmIGFyZzgpIHsKLSAgICBpZiAoYXJlbmEgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIG5ldyBUKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcsIGFyZzgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZUludGVybmFsPFQ+KAotICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSwKLSAgICAgICAgICBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4KTsKLSAgICB9Ci0gIH0KLQotICAvLyBDcmVhdGUgYW4gYXJyYXkgb2Ygb2JqZWN0IHR5cGUgVCBvbiB0aGUgYXJlbmEgKndpdGhvdXQqIGludm9raW5nIHRoZQotICAvLyBjb25zdHJ1Y3RvciBvZiBULiBJZiBgYXJlbmFgIGlzIG51bGwsIHRoZW4gdGhlIHJldHVybiB2YWx1ZSBzaG91bGQgYmUgZnJlZWQKLSAgLy8gd2l0aCBgZGVsZXRlW10geDtgIChvciBgOjpvcGVyYXRvciBkZWxldGVbXSh4KTtgKS4KLSAgLy8gVG8gZW5zdXJlIHNhZmUgdXNlcywgdGhpcyBmdW5jdGlvbiBjaGVja3MgYXQgY29tcGlsZSB0aW1lCi0gIC8vICh3aGVuIGNvbXBpbGVkIGFzIEMrKzExKSB0aGF0IFQgaXMgdHJpdmlhbGx5IGRlZmF1bHQtY29uc3RydWN0aWJsZSBhbmQKLSAgLy8gdHJpdmlhbGx5IGRlc3RydWN0aWJsZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgVCogQ3JlYXRlQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIHNpemVfdCBudW1fZWxlbWVudHMpIHsKLSAgICBHT09HTEVfQ0hFQ0tfTEUobnVtX2VsZW1lbnRzLAotICAgICAgICAgICAgIHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLyBzaXplb2YoVCkpCi0gICAgICAgIDw8ICJSZXF1ZXN0ZWQgc2l6ZSBpcyB0b28gbGFyZ2UgdG8gZml0IGludG8gc2l6ZV90LiI7Ci0gICAgaWYgKGFyZW5hID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oOjpvcGVyYXRvciBuZXdbXShudW1fZWxlbWVudHMgKiBzaXplb2YoVCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbFJhd0FycmF5PFQ+KG51bV9lbGVtZW50cyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmV0dXJucyB0aGUgdG90YWwgc3BhY2UgdXNlZCBieSB0aGUgYXJlbmEsIHdoaWNoIGlzIHRoZSBzdW1zIG9mIHRoZSBzaXplcwotICAvLyBvZiB0aGUgdW5kZXJseWluZyBibG9ja3MuIFRoZSB0b3RhbCBzcGFjZSB1c2VkIG1heSBub3QgaW5jbHVkZSB0aGUgbmV3Ci0gIC8vIGJsb2NrcyB0aGF0IGFyZSBhbGxvY2F0ZWQgYnkgdGhpcyBhcmVuYSBmcm9tIG90aGVyIHRocmVhZHMgY29uY3VycmVudGx5Ci0gIC8vIHdpdGggdGhlIGNhbGwgdG8gdGhpcyBtZXRob2QuCi0gIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgdWludDY0IFNwYWNlQWxsb2NhdGVkKCkgY29uc3Q7Ci0gIC8vIEFzIGFib3ZlLCBidXQgZG9lcyBub3QgaW5jbHVkZSBhbnkgZnJlZSBzcGFjZSBpbiB1bmRlcmx5aW5nIGJsb2Nrcy4KLSAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSB1aW50NjQgU3BhY2VVc2VkKCkgY29uc3Q7Ci0KLSAgLy8gQ29tYmluZXMgU3BhY2VBbGxvY2F0ZWQgYW5kIFNwYWNlVXNlZC4gUmV0dXJucyBhIHBhaXIgb2YKLSAgLy8gPHNwYWNlX2FsbG9jYXRlZCwgc3BhY2VfdXNlZD4uCi0gIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgcGFpcjx1aW50NjQsIHVpbnQ2ND4gU3BhY2VBbGxvY2F0ZWRBbmRVc2VkKCkgY29uc3Q7Ci0KLSAgLy8gRnJlZXMgYWxsIHN0b3JhZ2UgYWxsb2NhdGVkIGJ5IHRoaXMgYXJlbmEgYWZ0ZXIgY2FsbGluZyBkZXN0cnVjdG9ycwotICAvLyByZWdpc3RlcmVkIHdpdGggT3duRGVzdHJ1Y3RvcigpIGFuZCBmcmVlaW5nIG9iamVjdHMgcmVnaXN0ZXJlZCB3aXRoIE93bigpLgotICAvLyBBbnkgb2JqZWN0cyBhbGxvY2F0ZWQgb24gdGhpcyBhcmVuYSBhcmUgdW51c2FibGUgYWZ0ZXIgdGhpcyBjYWxsLiBJdCBhbHNvCi0gIC8vIHJldHVybnMgdGhlIHRvdGFsIHNwYWNlIHVzZWQgYnkgdGhlIGFyZW5hIHdoaWNoIGlzIHRoZSBzdW1zIG9mIHRoZSBzaXplcwotICAvLyBvZiB0aGUgYWxsb2NhdGVkIGJsb2Nrcy4gVGhpcyBtZXRob2QgaXMgbm90IHRocmVhZC1zYWZlLgotICBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHVpbnQ2NCBSZXNldCgpOwotCi0gIC8vIEFkZHMgfG9iamVjdHwgdG8gYSBsaXN0IG9mIGhlYXAtYWxsb2NhdGVkIG9iamVjdHMgdG8gYmUgZnJlZWQgd2l0aCB8ZGVsZXRlfAotICAvLyB3aGVuIHRoZSBhcmVuYSBpcyBkZXN0cm95ZWQgb3IgcmVzZXQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCi0gIHZvaWQgT3duKFQqIG9iamVjdCkgewotICAgIE93bkludGVybmFsKG9iamVjdCwgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmlzX2NvbnZlcnRpYmxlPFQqLCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqPigpKTsKLSAgfQotCi0gIC8vIEFkZHMgfG9iamVjdHwgdG8gYSBsaXN0IG9mIG9iamVjdHMgd2hvc2UgZGVzdHJ1Y3RvcnMgd2lsbCBiZSBtYW51YWxseQotICAvLyBjYWxsZWQgd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkIG9yIHJlc2V0LiBUaGlzIGRpZmZlcnMgZnJvbSBPd24oKSBpbgotICAvLyB0aGF0IGl0IGRvZXMgbm90IGZyZWUgdGhlIHVuZGVybHlpbmcgbWVtb3J5IHdpdGggfGRlbGV0ZXw7IGhlbmNlLCBpdCBpcwotICAvLyBub3JtYWxseSBvbmx5IHVzZWQgZm9yIG9iamVjdHMgdGhhdCBhcmUgcGxhY2VtZW50LW5ld2VkIGludG8KLSAgLy8gYXJlbmEtYWxsb2NhdGVkIG1lbW9yeS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKLSAgdm9pZCBPd25EZXN0cnVjdG9yKFQqIG9iamVjdCkgewotICAgIGlmIChvYmplY3QgIT0gTlVMTCkgewotICAgICAgQWRkTGlzdE5vZGUob2JqZWN0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWRkcyBhIGN1c3RvbSBtZW1iZXIgZnVuY3Rpb24gb24gYW4gb2JqZWN0IHRvIHRoZSBsaXN0IG9mIGRlc3RydWN0b3JzIHRoYXQKLSAgLy8gd2lsbCBiZSBtYW51YWxseSBjYWxsZWQgd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkIG9yIHJlc2V0LiBUaGlzIGRpZmZlcnMKLSAgLy8gZnJvbSBPd25EZXN0cnVjdG9yKCkgaW4gdGhhdCBhbnkgbWVtYmVyIGZ1bmN0aW9uIG1heSBiZSBzcGVjaWZpZWQsIG5vdCBvbmx5Ci0gIC8vIHRoZSBjbGFzcyBkZXN0cnVjdG9yLgotICBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHZvaWQgT3duQ3VzdG9tRGVzdHJ1Y3Rvcih2b2lkKiBvYmplY3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKmRlc3RydWN0KSh2b2lkKikpIHsKLSAgICBBZGRMaXN0Tm9kZShvYmplY3QsIGRlc3RydWN0KTsKLSAgfQotCi0gIC8vIFJldHJpZXZlcyB0aGUgYXJlbmEgYXNzb2NpYXRlZCB3aXRoIHx2YWx1ZXwgaWYgfHZhbHVlfCBpcyBhbiBhcmVuYS1jYXBhYmxlCi0gIC8vIG1lc3NhZ2UsIG9yIE5VTEwgb3RoZXJ3aXNlLiBUaGlzIGRpZmZlcnMgZnJvbSB2YWx1ZS0+R2V0QXJlbmEoKSBpbiB0aGF0IHRoZQotICAvLyBsYXR0ZXIgaXMgYSB2aXJ0dWFsIGNhbGwsIHdoaWxlIHRoaXMgbWV0aG9kIGlzIGEgdGVtcGxhdGVkIGNhbGwgdGhhdAotICAvLyByZXNvbHZlcyBhdCBjb21waWxlLXRpbWUuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmEoY29uc3QgVCogdmFsdWUpIHsKLSAgICByZXR1cm4gR2V0QXJlbmFJbnRlcm5hbCh2YWx1ZSwgc3RhdGljX2Nhc3Q8VCo+KDApKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RydWN0IEludGVybmFsSXNBcmVuYUNvbnN0cnVjdGFibGVIZWxwZXIgewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci0gICAgc3RhdGljIGNoYXIgQXJlbmFDb25zdHJ1Y3RhYmxlKAotICAgICAgICBjb25zdCB0eXBlbmFtZSBVOjpJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8qKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotICAgIHN0YXRpYyBkb3VibGUgQXJlbmFDb25zdHJ1Y3RhYmxlKC4uLik7Ci0gIH07Ci0KLSBwdWJsaWM6Ci0gIC8vIEhlbHBlciB0eXBldHJhaXQgdGhhdCBpbmRpY2F0ZXMgc3VwcG9ydCBmb3IgYXJlbmFzIGluIGEgdHlwZSBUIGF0IGNvbXBpbGUKLSAgLy8gdGltZS4gVGhpcyBpcyBwdWJsaWMgb25seSB0byBhbGxvdyBjb25zdHJ1Y3Rpb24gb2YgaGlnaGVyLWxldmVsIHRlbXBsYXRlZAotICAvLyB1dGlsaXRpZXMuIGlzX2FyZW5hX2NvbnN0cnVjdGFibGU8VD46OnZhbHVlIGlzIHRydWUgaWYgdGhlIG1lc3NhZ2UgdHlwZSBUCi0gIC8vIGhhcyBhcmVuYSBzdXBwb3J0IGVuYWJsZWQsIGFuZCBmYWxzZSBvdGhlcndpc2UuCi0gIC8vCi0gIC8vIFRoaXMgaXMgaW5zaWRlIEFyZW5hIGJlY2F1c2Ugb25seSBBcmVuYSBoYXMgdGhlIGZyaWVuZCByZWxhdGlvbnNoaXBzCi0gIC8vIG5lY2Vzc2FyeSB0byBzZWUgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdGVkIGNvZGUgdHJhaXRzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RydWN0IGlzX2FyZW5hX2NvbnN0cnVjdGFibGUKLSAgICAgIDogcHVibGljIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjppbnRlZ3JhbF9jb25zdGFudDwKLSAgICAgICAgICAgIGJvb2wsIHNpemVvZihJbnRlcm5hbElzQXJlbmFDb25zdHJ1Y3RhYmxlSGVscGVyOjpBcmVuYUNvbnN0cnVjdGFibGU8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgVD4oc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KDApKSkgPT0gc2l6ZW9mKGNoYXIpPiB7Ci0gIH07Ci0KLSBwcml2YXRlOgotICAvLyBCbG9ja3MgYXJlIHZhcmlhYmxlIGxlbmd0aCBtYWxsb2MtZWQgb2JqZWN0cy4gIFRoZSBmb2xsb3dpbmcgc3RydWN0dXJlCi0gIC8vIGRlc2NyaWJlcyB0aGUgY29tbW9uIGhlYWRlciBmb3IgYWxsIGJsb2Nrcy4KLSAgc3RydWN0IEJsb2NrIHsKLSAgICB2b2lkKiBvd25lcjsgICAvLyAmVGhyZWFkQ2FjaGUgb2YgdGhyZWFkIHRoYXQgb3ducyB0aGlzIGJsb2NrLCBvcgotICAgICAgICAgICAgICAgICAgIC8vICZ0aGlzLT5vd25lciBpZiBub3QgeWV0IG93bmVkIGJ5IGEgdGhyZWFkLgotICAgIEJsb2NrKiBuZXh0OyAgIC8vIE5leHQgYmxvY2sgaW4gYXJlbmEgKG1heSBoYXZlIGRpZmZlcmVudCBvd25lcikKLSAgICAvLyAoKGNoYXIqKSAmYmxvY2spICsgcG9zIGlzIG5leHQgYXZhaWxhYmxlIGJ5dGUuIEl0IGlzIGFsd2F5cwotICAgIC8vIGFsaWduZWQgYXQgYSBtdWx0aXBsZSBvZiA4IGJ5dGVzLgotICAgIHNpemVfdCBwb3M7Ci0gICAgc2l6ZV90IHNpemU7ICAvLyB0b3RhbCBzaXplIG9mIHRoZSBibG9jay4KLSAgICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgc2l6ZV90IGF2YWlsKCkgY29uc3QgeyByZXR1cm4gc2l6ZSAtIHBvczsgfQotICAgIC8vIGRhdGEgZm9sbG93cwotICB9OwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+IGZyaWVuZCBjbGFzcyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmljVHlwZUhhbmRsZXI7Ci0gIGZyaWVuZCBjbGFzcyBNb2NrQXJlbmE7ICAgICAgICAgICAgICAvLyBGb3IgdW5pdC10ZXN0aW5nLgotICBmcmllbmQgY2xhc3MgaW50ZXJuYWw6OkFyZW5hU3RyaW5nOyAgLy8gRm9yIEFsbG9jYXRlQWxpZ25lZC4KLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpMYXp5RmllbGQ7ICAgIC8vIEZvciBDcmVhdGVNYXliZU1lc3NhZ2UuCi0KLSAgc3RydWN0IFRocmVhZENhY2hlIHsKLSAgICAvLyBUaGUgVGhyZWFkQ2FjaGUgaXMgY29uc2lkZXJlZCB2YWxpZCBhcyBsb25nIGFzIHRoaXMgbWF0Y2hlcyB0aGUKLSAgICAvLyBsaWZlY3ljbGVfaWQgb2YgdGhlIGFyZW5hIGJlaW5nIHVzZWQuCi0gICAgaW50NjQgbGFzdF9saWZlY3ljbGVfaWRfc2VlbjsKLSAgICBCbG9jayogbGFzdF9ibG9ja191c2VkXzsKLSAgfTsKLQotICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtIZWFkZXJTaXplID0gc2l6ZW9mKEJsb2NrKTsKLSAgc3RhdGljIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpTZXF1ZW5jZU51bWJlciBsaWZlY3ljbGVfaWRfZ2VuZXJhdG9yXzsKLSNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURMT0NBTCkKLSAgLy8gQW5kcm9pZCBuZGsgZG9lcyBub3Qgc3VwcG9ydCBHT09HTEVfVEhSRUFEX0xPQ0FMIGtleXdvcmQgc28gd2UgdXNlIGEgY3VzdG9tIHRocmVhZAotICAvLyBsb2NhbCBzdG9yYWdlIGNsYXNzIHdlIGltcGxlbWVudGVkLgotICAvLyBpT1MgYWxzbyBkb2VzIG5vdCBzdXBwb3J0IHRoZSBHT09HTEVfVEhSRUFEX0xPQ0FMIGtleXdvcmQuCi0gIHN0YXRpYyBUaHJlYWRDYWNoZSYgdGhyZWFkX2NhY2hlKCk7Ci0jZWxpZiBkZWZpbmVkKFBST1RPQlVGX1VTRV9ETExTKQotICAvLyBUaHJlYWQgbG9jYWwgdmFyaWFibGVzIGNhbm5vdCBiZSBleHBvc2VkIHRocm91Z2ggRExMIGludGVyZmFjZSBidXQgd2UgY2FuCi0gIC8vIHdyYXAgdGhlbSBpbiBzdGF0aWMgZnVuY3Rpb25zLgotICBzdGF0aWMgVGhyZWFkQ2FjaGUmIHRocmVhZF9jYWNoZSgpOwotI2Vsc2UKLSAgc3RhdGljIEdPT0dMRV9USFJFQURfTE9DQUwgVGhyZWFkQ2FjaGUgdGhyZWFkX2NhY2hlXzsKLSAgc3RhdGljIFRocmVhZENhY2hlJiB0aHJlYWRfY2FjaGUoKSB7IHJldHVybiB0aHJlYWRfY2FjaGVfOyB9Ci0jZW5kaWYKLQotICAvLyBTRklOQUUgZm9yIHNraXBwaW5nIGFkZGl0aW9uIHRvIGRlbGV0ZSBsaXN0IGZvciBhIG1lc3NhZ2UgdHlwZSB3aGVuIGNyZWF0ZWQKLSAgLy8gd2l0aCBDcmVhdGVNZXNzYWdlLiBUaGlzIGlzIG1haW5seSB0byBza2lwIHByb3RvMi9wcm90bzEgbWVzc2FnZSBvYmplY3RzCi0gIC8vIHdpdGggY2NfZW5hYmxlX2FyZW5hcz10cnVlIGZyb20gYmVpbmcgcGFydCBvZiB0aGUgZGVsZXRlIGxpc3QuIEFsc28sIG5vdGUsCi0gIC8vIGNvbXBpbGVyIHdpbGwgb3B0aW1pemUgb3V0IHRoZSBicmFuY2ggaW4gQ3JlYXRlSW50ZXJuYWw8VD4uCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBTa2lwRGVsZXRlTGlzdCh0eXBlbmFtZSBUOjpEZXN0cnVjdG9yU2tpcHBhYmxlXyopIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIEZvciBtZXNzYWdlIG9iamVjdHMgdGhhdCBkb24ndCBoYXZlIHRoZSBEZXN0cnVjdG9yU2tpcHBhYmxlXyB0cmFpdCwgd2UKLSAgLy8gYWx3YXlzIGFkZCB0byB0aGUgZGVsZXRlIGxpc3QuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBTa2lwRGVsZXRlTGlzdCguLi4pIHsKLSAgICByZXR1cm4gZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Omhhc190cml2aWFsX2Rlc3RydWN0b3I8VD46OnZhbHVlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgSW50ZXJuYWxJc0Rlc3RydWN0b3JTa2lwcGFibGVIZWxwZXIgewotICAgIHRlbXBsYXRlPHR5cGVuYW1lIFU+Ci0gICAgc3RhdGljIGNoYXIgRGVzdHJ1Y3RvclNraXBwYWJsZSgKLSAgICAgICAgY29uc3QgdHlwZW5hbWUgVTo6RGVzdHJ1Y3RvclNraXBwYWJsZV8qKTsKLSAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgotICAgIHN0YXRpYyBkb3VibGUgRGVzdHJ1Y3RvclNraXBwYWJsZSguLi4pOwotICB9OwotCi0gcHVibGljOgotICAvLyBIZWxwZXIgdHlwZXRyYWl0IHRoYXQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIGRlc2N0cnVjdG9yIG9mIHR5cGUgVCBzaG91bGQgYmUKLSAgLy8gY2FsbGVkIHdoZW4gYXJlbmEgaXMgZGVzdHJveWVkIGF0IGNvbXBpbGUgdGltZS4gVGhpcyBpcyBvbmx5IHRvIGFsbG93Ci0gIC8vIGNvbnN0cnVjdGlvbiBvZiBoaWdoZXItbGV2ZWwgdGVtcGxhdGVkIHV0aWxpdGllcy4KLSAgLy8gaXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU8VD46OnZhbHVlIGlzIHRydWUgaWYgdGhlIGRlc3RydWN0b3Igb2YgdGhlIG1lc3NhZ2UKLSAgLy8gdHlwZSBUIHNob3VsZCBub3QgYmUgY2FsbGVkIHdoZW4gYXJlbmEgaXMgZGVzdHJveWVkIG9yIGZhbHNlIG90aGVyd2lzZS4KLSAgLy8gVGhpcyBpcyBpbnNpZGUgQXJlbmEgYmVjYXVzZSBvbmx5IEFyZW5hIGhhcyB0aGUgZnJpZW5kIHJlbGF0aW9uc2hpcHMKLSAgLy8gbmVjZXNzYXJ5IHRvIHNlZSB0aGUgdW5kZXJseWluZyBnZW5lcmF0ZWQgY29kZSB0cmFpdHMuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIHN0cnVjdCBpc19kZXN0cnVjdG9yX3NraXBwYWJsZQotICAgICAgOiBwdWJsaWMgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmludGVncmFsX2NvbnN0YW50PAotICAgICAgICAgICAgYm9vbCwKLSAgICAgICAgICAgIHNpemVvZihJbnRlcm5hbElzRGVzdHJ1Y3RvclNraXBwYWJsZUhlbHBlcjo6RGVzdHJ1Y3RvclNraXBwYWJsZTwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBUPihzdGF0aWNfY2FzdDxjb25zdCBUKj4oMCkpKSA9PSBzaXplb2YoY2hhcikgfHwKLSAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWU+IHt9OwotCi0gIC8vIENyZWF0ZU1lc3NhZ2U8VD4gcmVxdWlyZXMgdGhhdCBUIHN1cHBvcnRzIGFyZW5hcywgYnV0IHRoaXMgcHJpdmF0ZSBtZXRob2QKLSAgLy8gd29ya3Mgd2hldGhlciBvciBub3QgVCBzdXBwb3J0cyBhcmVuYXMuIFRoZXNlIGFyZSBub3QgZXhwb3NlZCB0byB1c2VyIGNvZGUKLSAgLy8gYXMgaXQgY2FuIGNhdXNlIGNvbmZ1c2luZyBBUEkgdXNhZ2VzLCBhbmQgZW5kIHVwIGhhdmluZyBkb3VibGUgZnJlZSBpbgotICAvLyB1c2VyIGNvZGUuIFRoZXNlIGFyZSB1c2VkIG9ubHkgaW50ZXJuYWxseSBmcm9tIExhenlGaWVsZCBhbmQgUmVwZWF0ZWQKLSAgLy8gZmllbGRzLCBzaW5jZSB0aGV5IGFyZSBkZXNpZ25lZCB0byB3b3JrIGluIGFsbCBtb2RlIGNvbWJpbmF0aW9ucy4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgTXNnPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgc3RhdGljIE1zZyogQ3JlYXRlTWF5YmVNZXNzYWdlKAotICAgICAgQXJlbmEqIGFyZW5hLCB0eXBlbmFtZSBNc2c6OkludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyopIHsKLSAgICByZXR1cm4gQ3JlYXRlTWVzc2FnZTxNc2c+KGFyZW5hKTsKLSAgfQotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgVCogQ3JlYXRlTWF5YmVNZXNzYWdlKEFyZW5hKiBhcmVuYSwgLi4uKSB7Ci0gICAgcmV0dXJuIENyZWF0ZTxUPihhcmVuYSk7Ci0gIH0KLQotICAvLyBKdXN0IGFsbG9jYXRlIHRoZSByZXF1aXJlZCBzaXplIGZvciB0aGUgZ2l2ZW4gdHlwZSBhc3N1bWluZyB0aGUKLSAgLy8gdHlwZSBoYXMgYSB0cml2aWFsIGNvbnN0cnVjdG9yLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgVCogQ3JlYXRlSW50ZXJuYWxSYXdBcnJheShzaXplX3QgbnVtX2VsZW1lbnRzKSB7Ci0gICAgR09PR0xFX0NIRUNLX0xFKG51bV9lbGVtZW50cywKLSAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gc2l6ZW9mKFQpKQotICAgICAgICA8PCAiUmVxdWVzdGVkIHNpemUgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHNpemVfdC4iOwotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUKj4oCi0gICAgICAgIEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSAqIG51bV9lbGVtZW50cykpOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBUKiBDcmVhdGVJbnRlcm5hbChib29sIHNraXBfZXhwbGljaXRfb3duZXJzaGlwKSB7Ci0gICAgVCogdCA9IG5ldyAoQWxsb2NhdGVBbGlnbmVkKFJUVElfVFlQRV9JRChUKSwgc2l6ZW9mKFQpKSkgVCgpOwotICAgIGlmICghc2tpcF9leHBsaWNpdF9vd25lcnNoaXApIHsKLSAgICAgIEFkZExpc3ROb2RlKHQsICZpbnRlcm5hbDo6YXJlbmFfZGVzdHJ1Y3Rfb2JqZWN0PFQ+KTsKLSAgICB9Ci0gICAgcmV0dXJuIHQ7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgVCogQ3JlYXRlSW50ZXJuYWwoYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCwgY29uc3QgQXJnJiBhcmcpIHsKLSAgICBUKiB0ID0gbmV3IChBbGxvY2F0ZUFsaWduZWQoUlRUSV9UWVBFX0lEKFQpLCBzaXplb2YoVCkpKSBUKGFyZyk7Ci0gICAgaWYgKCFza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgewotICAgICAgQWRkTGlzdE5vZGUodCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOwotICAgIH0KLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgVCogQ3JlYXRlSW50ZXJuYWwoCi0gICAgICBib29sIHNraXBfZXhwbGljaXRfb3duZXJzaGlwLCBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyKSB7Ci0gICAgVCogdCA9IG5ldyAoQWxsb2NhdGVBbGlnbmVkKFJUVElfVFlQRV9JRChUKSwgc2l6ZW9mKFQpKSkgVChhcmcxLCBhcmcyKTsKLSAgICBpZiAoIXNraXBfZXhwbGljaXRfb3duZXJzaGlwKSB7Ci0gICAgICBBZGRMaXN0Tm9kZSh0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzM+Ci0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBUKiBDcmVhdGVJbnRlcm5hbChib29sIHNraXBfZXhwbGljaXRfb3duZXJzaGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczKSB7Ci0gICAgVCogdCA9IG5ldyAoQWxsb2NhdGVBbGlnbmVkKFJUVElfVFlQRV9JRChUKSwgc2l6ZW9mKFQpKSkKLSAgICAgICAgVChhcmcxLCBhcmcyLCBhcmczKTsKLSAgICBpZiAoIXNraXBfZXhwbGljaXRfb3duZXJzaGlwKSB7Ci0gICAgICBBZGRMaXN0Tm9kZSh0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgICAgICAgICB0eXBlbmFtZSBBcmc0PgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgVCogQ3JlYXRlSW50ZXJuYWwoYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMiYgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNCYgYXJnNCkgewotICAgIFQqIHQgPSBuZXcgKEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSkpCi0gICAgICAgIFQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7Ci0gICAgaWYgKCFza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgewotICAgICAgQWRkTGlzdE5vZGUodCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOwotICAgIH0KLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgICAgICAgICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNT4KLSAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIFQqIENyZWF0ZUludGVybmFsKGJvb2wgc2tpcF9leHBsaWNpdF9vd25lcnNoaXAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzImIGFyZzIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGFyZzMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzQmIGFyZzQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzUmIGFyZzUpIHsKLSAgICBUKiB0ID0gbmV3IChBbGxvY2F0ZUFsaWduZWQoUlRUSV9UWVBFX0lEKFQpLCBzaXplb2YoVCkpKQotICAgICAgICBUKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOwotICAgIGlmICghc2tpcF9leHBsaWNpdF9vd25lcnNoaXApIHsKLSAgICAgIEFkZExpc3ROb2RlKHQsICZpbnRlcm5hbDo6YXJlbmFfZGVzdHJ1Y3Rfb2JqZWN0PFQ+KTsKLSAgICB9Ci0gICAgcmV0dXJuIHQ7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKLSAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzUsIHR5cGVuYW1lIEFyZzY+Ci0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBUKiBDcmVhdGVJbnRlcm5hbChib29sIHNraXBfZXhwbGljaXRfb3duZXJzaGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc0JiBhcmc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc1JiBhcmc1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc2JiBhcmc2KSB7Ci0gICAgVCogdCA9IG5ldyAoQWxsb2NhdGVBbGlnbmVkKFJUVElfVFlQRV9JRChUKSwgc2l6ZW9mKFQpKSkKLSAgICAgICAgVChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2KTsKLSAgICBpZiAoIXNraXBfZXhwbGljaXRfb3duZXJzaGlwKSB7Ci0gICAgICBBZGRMaXN0Tm9kZSh0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCi0gICAgICAgICAgICB0eXBlbmFtZSBBcmc0LCB0eXBlbmFtZSBBcmc1LCB0eXBlbmFtZSBBcmc2LCB0eXBlbmFtZSBBcmc3PgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgVCogQ3JlYXRlSW50ZXJuYWwoYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMiYgYXJnMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNCYgYXJnNCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNSYgYXJnNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNiYgYXJnNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNyYgYXJnNykgewotICAgIFQqIHQgPSBuZXcgKEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSkpCi0gICAgICAgIFQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNyk7Ci0gICAgaWYgKCFza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgewotICAgICAgQWRkTGlzdE5vZGUodCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOwotICAgIH0KLSAgICByZXR1cm4gdDsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAotICAgICAgICAgICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNSwgdHlwZW5hbWUgQXJnNiwgdHlwZW5hbWUgQXJnNywKLSAgICAgICAgICAgIHR5cGVuYW1lIEFyZzg+Ci0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBUKiBDcmVhdGVJbnRlcm5hbChib29sIHNraXBfZXhwbGljaXRfb3duZXJzaGlwLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcyJiBhcmcyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc0JiBhcmc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc1JiBhcmc1LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc2JiBhcmc2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc3JiBhcmc3LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc4JiBhcmc4KSB7Ci0gICAgVCogdCA9IG5ldyAoQWxsb2NhdGVBbGlnbmVkKFJUVElfVFlQRV9JRChUKSwgc2l6ZW9mKFQpKSkKLSAgICAgICAgVChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4KTsKLSAgICBpZiAoIXNraXBfZXhwbGljaXRfb3duZXJzaGlwKSB7Ci0gICAgICBBZGRMaXN0Tm9kZSh0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7Ci0gICAgfQotICAgIHJldHVybiB0OwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBUKiBDcmVhdGVNZXNzYWdlSW50ZXJuYWwodHlwZW5hbWUgVDo6SW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfKikgewotICAgIHJldHVybiBDcmVhdGVJbnRlcm5hbDxULCBBcmVuYSo+KFNraXBEZWxldGVMaXN0PFQ+KHN0YXRpY19jYXN0PFQqPigwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgVCogQ3JlYXRlTWVzc2FnZUludGVybmFsKHR5cGVuYW1lIFQ6OkludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcmIGFyZykgewotICAgIHJldHVybiBDcmVhdGVJbnRlcm5hbDxULCBBcmVuYSo+KFNraXBEZWxldGVMaXN0PFQ+KHN0YXRpY19jYXN0PFQqPigwKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgYXJnKTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgVCogQ3JlYXRlTWVzc2FnZUludGVybmFsKHR5cGVuYW1lIFQ6OkludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyKSB7Ci0gICAgcmV0dXJuIENyZWF0ZUludGVybmFsPFQsIEFyZW5hKj4oU2tpcERlbGV0ZUxpc3Q8VD4oc3RhdGljX2Nhc3Q8VCo+KDApKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGlzLCBhcmcxLCBhcmcyKTsKLSAgfQotCi0gIC8vIENyZWF0ZUluQXJlbmFTdG9yYWdlIGlzIHVzZWQgdG8gaW1wbGVtZW50IG1hcCBmaWVsZC4gV2l0aG91dCBpdCwKLSAgLy8gZ29vZ2xlOjpwcm90b2J1Zjo6TWFwIG5lZWQgdG8gY2FsbCBnZW5lcmF0ZWQgbWVzc2FnZSdzIHByb3RlY3RlZCBhcmVuYSBjb25zdHJ1Y3RvciwKLSAgLy8gd2hpY2ggbmVlZHMgdG8gZGVjbGFyZSBnb29nbGU6OnByb3RvYnVmOjpNYXAgYXMgZnJpZW5kIG9mIGdlbmVyYXRlZCBtZXNzYWdlLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIHZvaWQgQ3JlYXRlSW5BcmVuYVN0b3JhZ2UoVCogcHRyLCBBcmVuYSogYXJlbmEpIHsKLSAgICBDcmVhdGVJbkFyZW5hU3RvcmFnZUludGVybmFsKHB0ciwgYXJlbmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlbmFtZSBpc19hcmVuYV9jb25zdHJ1Y3RhYmxlPFQ+Ojp0eXBlKCkpOwotICAgIFJlZ2lzdGVyRGVzdHJ1Y3RvckludGVybmFsKHB0ciwgYXJlbmEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGU8VD46OnR5cGUoKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLSAgc3RhdGljIHZvaWQgQ3JlYXRlSW5BcmVuYVN0b3JhZ2VJbnRlcm5hbCgKLSAgICAgIFQqIHB0ciwgQXJlbmEqIGFyZW5hLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlKSB7Ci0gICAgbmV3IChwdHIpIFQoYXJlbmEpOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgotICBzdGF0aWMgdm9pZCBDcmVhdGVJbkFyZW5hU3RvcmFnZUludGVybmFsKAotICAgICAgVCogcHRyLCBBcmVuYSogLyphcmVuYSovLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZmFsc2VfdHlwZSkgewotICAgIG5ldyAocHRyKSBUOwotICB9Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRGVzdHJ1Y3RvckludGVybmFsKAotICAgICAgVCogLypwdHIqLywgQXJlbmEqIC8qYXJlbmEqLywgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSkge30KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci0gIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRGVzdHJ1Y3RvckludGVybmFsKAotICAgICAgVCogcHRyLCBBcmVuYSogYXJlbmEsIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlKSB7Ci0gICAgYXJlbmEtPk93bkRlc3RydWN0b3IocHRyKTsKLSAgfQotCi0gIC8vIFRoZXNlIGltcGxlbWVudCBPd24oKSwgd2hpY2ggcmVnaXN0ZXJzIGFuIG9iamVjdCBmb3IgZGVsZXRpb24gKGRlc3RydWN0b3IKLSAgLy8gY2FsbCBhbmQgb3BlcmF0b3IgZGVsZXRlKCkpLiBUaGUgc2Vjb25kIHBhcmFtZXRlciBoYXMgdHlwZSAndHJ1ZV90eXBlJyBpZiBUCi0gIC8vIGlzIGEgc3VidHlwZSBvZiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgYW5kICdmYWxzZV90eXBlJyBvdGhlcndpc2UuIENvbGxhcHNpbmcKLSAgLy8gYWxsIHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIHRvIG9uZSBmb3IgZ2VuZXJpYyBNZXNzYWdlIHJlZHVjZXMgY29kZSBzaXplLAotICAvLyB1c2luZyB0aGUgdmlydHVhbCBkZXN0cnVjdG9yIGluc3RlYWQuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICB2b2lkIE93bkludGVybmFsKFQqIG9iamVjdCwgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSkgewotICAgIGlmIChvYmplY3QgIT0gTlVMTCkgewotICAgICAgQWRkTGlzdE5vZGUob2JqZWN0LCAmaW50ZXJuYWw6OmFyZW5hX2RlbGV0ZV9vYmplY3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSA+KTsKLSAgICB9Ci0gIH0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCi0gIHZvaWQgT3duSW50ZXJuYWwoVCogb2JqZWN0LCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZmFsc2VfdHlwZSkgewotICAgIGlmIChvYmplY3QgIT0gTlVMTCkgewotICAgICAgQWRkTGlzdE5vZGUob2JqZWN0LCAmaW50ZXJuYWw6OmFyZW5hX2RlbGV0ZV9vYmplY3Q8VD4pOwotICAgIH0KLSAgfQotCi0gIC8vIEltcGxlbWVudGF0aW9uIGZvciBHZXRBcmVuYSgpLiBPbmx5IG1lc3NhZ2Ugb2JqZWN0cyB3aXRoCi0gIC8vIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyB0YWdzIGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYW4gYXJlbmEsIGFuZCBzdWNoCi0gIC8vIG9iamVjdHMgbXVzdCBpbXBsZW1lbnQgYSBHZXRBcmVuYU5vVmlydHVhbCgpIG1ldGhvZC4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCi0gIHN0YXRpYyA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYUludGVybmFsKAotICAgICAgY29uc3QgVCogdmFsdWUsIHR5cGVuYW1lIFQ6OkludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyopIHsKLSAgICByZXR1cm4gdmFsdWUtPkdldEFyZW5hTm9WaXJ0dWFsKCk7Ci0gIH0KLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgc3RhdGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hSW50ZXJuYWwoY29uc3QgVCogLyp2YWx1ZSovLCAuLi4pIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIC8vIEFsbG9jYXRlIGFuZCBhbHNvIG9wdGlvbmFsbHkgY2FsbCBvbl9hcmVuYV9hbGxvY2F0aW9uIGNhbGxiYWNrIHdpdGggdGhlCi0gIC8vIGFsbG9jYXRlZCB0eXBlIGluZm8gd2hlbiB0aGUgaG9va3MgYXJlIGluIHBsYWNlIGluIEFyZW5hT3B0aW9ucyBhbmQKLSAgLy8gdGhlIGNvb2tpZSBpcyBub3QgbnVsbC4KLSAgdm9pZCogQWxsb2NhdGVBbGlnbmVkKGNvbnN0IHN0ZDo6dHlwZV9pbmZvKiBhbGxvY2F0ZWQsIHNpemVfdCBuKTsKLQotICAvLyBBbGxvY2F0ZSBhbiBpbnRlcm5hbCBhbGxvY2F0aW9uLCBhdm9pZGluZyBvcHRpb25hbCB0eXBlZCBtb25pdG9yaW5nLgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgdm9pZCogQWxsb2NhdGVBbGlnbmVkKHNpemVfdCBuKSB7Ci0gICAgcmV0dXJuIEFsbG9jYXRlQWxpZ25lZChOVUxMLCBuKTsKLSAgfQotCi0gIHZvaWQgSW5pdCgpOwotCi0gIC8vIEZyZWUgYWxsIGJsb2NrcyBhbmQgcmV0dXJuIHRoZSB0b3RhbCBzcGFjZSB1c2VkIHdoaWNoIGlzIHRoZSBzdW1zIG9mIHNpemVzCi0gIC8vIG9mIHRoZSBhbGwgdGhlIGFsbG9jYXRlZCBibG9ja3MuCi0gIHVpbnQ2NCBGcmVlQmxvY2tzKCk7Ci0KLSAgLy8gQWRkIG9iamVjdCBwb2ludGVyIGFuZCBjbGVhbnVwIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGxpc3QuCi0gIC8vIFRPRE8ocm9oYW5hbmlsLCBjZmFsbGluKTogV2UgY291bGQgcGFzcyBpbiBhIHN1Yi1hcmVuYSBpbnRvIHRoaXMgbWV0aG9kCi0gIC8vIHRvIGF2b2lkIHBvbGx1dGluZyBibG9ja3Mgb2YgdGhpcyBhcmVuYSB3aXRoIGxpc3Qgbm9kZXMuIFRoaXMgd291bGQgaGVscCBpbgotICAvLyBtaXhlZCBtb2RlICh3aGVyZSBtYW55IHByb3RvYnVmcyBoYXZlIGNjX2VuYWJsZV9hcmVuYXM9ZmFsc2UpLCBhbmQgaXMgYW4KLSAgLy8gYWx0ZXJuYXRpdmUgdG8gYSBjaHVua2VkIGxpbmtlZC1saXN0LCBidXQgd2l0aCBleHRyYSBvdmVyaGVhZCBvZiAqbmV4dC4KLSAgdm9pZCBBZGRMaXN0Tm9kZSh2b2lkKiBlbGVtLCB2b2lkICgqY2xlYW51cCkodm9pZCopKTsKLSAgLy8gRGVsZXRlIG9yIERlc3RydWN0IGFsbCBvYmplY3RzIG93bmVkIGJ5IHRoZSBhcmVuYS4KLSAgdm9pZCBDbGVhbnVwTGlzdCgpOwotICB1aW50NjQgUmVzZXRJbnRlcm5hbCgpOwotCi0gIGlubGluZSB2b2lkIFNldFRocmVhZENhY2hlQmxvY2soQmxvY2sqIGJsb2NrKSB7Ci0gICAgdGhyZWFkX2NhY2hlKCkubGFzdF9ibG9ja191c2VkXyA9IGJsb2NrOwotICAgIHRocmVhZF9jYWNoZSgpLmxhc3RfbGlmZWN5Y2xlX2lkX3NlZW4gPSBsaWZlY3ljbGVfaWRfOwotICB9Ci0KLSAgaW50NjQgbGlmZWN5Y2xlX2lkXzsgIC8vIFVuaXF1ZSBmb3IgZWFjaCBhcmVuYS4gQ2hhbmdlcyBvbiBSZXNldCgpLgotCi0gIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBdG9taWNXb3JkIGJsb2Nrc187ICAvLyBIZWFkIG9mIGxpbmtlZCBsaXN0IG9mIGFsbCBhbGxvY2F0ZWQgYmxvY2tzCi0gIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBdG9taWNXb3JkIGhpbnRfOyAgICAvLyBGYXN0IHRocmVhZC1sb2NhbCBibG9jayBhY2Nlc3MKLQotICAvLyBOb2RlIGNvbnRhaW5zIHRoZSBwdHIgb2YgdGhlIG9iamVjdCB0byBiZSBjbGVhbmVkIHVwIGFuZCB0aGUgYXNzb2NpYXRlZAotICAvLyBjbGVhbnVwIGZ1bmN0aW9uIHB0ci4KLSAgc3RydWN0IE5vZGUgewotICAgIHZvaWQqIGVsZW07ICAgICAgICAgICAgICAvLyBQb2ludGVyIHRvIHRoZSBvYmplY3QgdG8gYmUgY2xlYW5lZCB1cC4KLSAgICB2b2lkICgqY2xlYW51cCkodm9pZCopOyAgLy8gRnVuY3Rpb24gcG9pbnRlciB0byB0aGUgZGVzdHJ1Y3RvciBvciBkZWxldGVyLgotICAgIE5vZGUqIG5leHQ7ICAgICAgICAgICAgICAvLyBOZXh0IG5vZGUgaW4gdGhlIGxpc3QuCi0gIH07Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkF0b21pY1dvcmQgY2xlYW51cF9saXN0XzsgIC8vIEhlYWQgb2YgYSBsaW5rZWQgbGlzdCBvZiBub2RlcyBjb250YWluaW5nIG9iamVjdAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBwdHJzIGFuZCBjbGVhbnVwIG1ldGhvZHMuCi0KLSAgYm9vbCBvd25zX2ZpcnN0X2Jsb2NrXzsgICAgLy8gSW5kaWNhdGVzIHRoYXQgYXJlbmEgb3ducyB0aGUgZmlyc3QgYmxvY2sKLSAgTXV0ZXggYmxvY2tzX2xvY2tfOwotCi0gIHZvaWQgQWRkQmxvY2soQmxvY2sqIGIpOwotICAvLyBBY2Nlc3MgbXVzdCBiZSBzeW5jaHJvbml6ZWQsIGVpdGhlciBieSBibG9ja3NfbG9ja18gb3IgYnkgYmVpbmcgY2FsbGVkIGZyb20KLSAgLy8gSW5pdCgpL1Jlc2V0KCkuCi0gIHZvaWQgQWRkQmxvY2tJbnRlcm5hbChCbG9jayogYik7Ci0gIHZvaWQqIFNsb3dBbGxvYyhzaXplX3Qgbik7Ci0gIEJsb2NrKiBGaW5kQmxvY2sodm9pZCogbWUpOwotICBCbG9jayogTmV3QmxvY2sodm9pZCogbWUsIEJsb2NrKiBteV9sYXN0X2Jsb2NrLCBzaXplX3QgbiwKLSAgICAgICAgICAgICAgICAgIHNpemVfdCBzdGFydF9ibG9ja19zaXplLCBzaXplX3QgbWF4X2Jsb2NrX3NpemUpOwotICBzdGF0aWMgdm9pZCogQWxsb2NGcm9tQmxvY2soQmxvY2sqIGIsIHNpemVfdCBuKTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgVD4KLSAgZnJpZW5kIGNsYXNzIE1hcDsKLQotICAvLyBUaGUgYXJlbmEgbWF5IHNhdmUgYSBjb29raWUgaXQgcmVjZWl2ZXMgZnJvbSB0aGUgZXh0ZXJuYWwgb25faW5pdCBob29rCi0gIC8vIGFuZCB0aGVuIHVzZSBpdCB3aGVuIGNhbGxpbmcgdGhlIG9uX3Jlc2V0IGFuZCBvbl9kZXN0cnVjdGlvbiBob29rcy4KLSAgdm9pZCogaG9va3NfY29va2llXzsKLQotICBBcmVuYU9wdGlvbnMgb3B0aW9uc187Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFyZW5hKTsKLX07Ci0KLS8vIERlZmluZWQgYWJvdmUgZm9yIHN1cHBvcnRpbmcgZW52aXJvbm1lbnRzIHdpdGhvdXQgUlRUSS4KLSN1bmRlZiBSVFRJX1RZUEVfSUQKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FSRU5BX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3M2ViNGUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDg1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotQ29kZUdlbmVyYXRvcjo6fkNvZGVHZW5lcmF0b3IoKSB7fQotR2VuZXJhdG9yQ29udGV4dDo6fkdlbmVyYXRvckNvbnRleHQoKSB7fQotCi1pbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qCi1HZW5lcmF0b3JDb250ZXh0OjpPcGVuRm9yQXBwZW5kKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogR2VuZXJhdG9yQ29udGV4dDo6T3BlbkZvckluc2VydCgKLSAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCkgewotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBHZW5lcmF0b3JDb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgaW5zZXJ0aW9uLiI7Ci0gIHJldHVybiBOVUxMOyAgLy8gbWFrZSBjb21waWxlciBoYXBweQotfQotCi12b2lkIEdlbmVyYXRvckNvbnRleHQ6Okxpc3RQYXJzZWRGaWxlcygKLSAgICB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KSB7Ci0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJUaGlzIEdlbmVyYXRvckNvbnRleHQgZG9lcyBub3Qgc3VwcG9ydCBMaXN0UGFyc2VkRmlsZXMiOwotfQotCi0vLyBQYXJzZXMgYSBzZXQgb2YgY29tbWEtZGVsaW1pdGVkIG5hbWUvdmFsdWUgcGFpcnMuCi12b2lkIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKGNvbnN0IHN0cmluZyYgdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4qIG91dHB1dCkgewotICB2ZWN0b3I8c3RyaW5nPiBwYXJ0cyA9IFNwbGl0KHRleHQsICIsIiwgdHJ1ZSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJ0cy5zaXplKCk7IGkrKykgewotICAgIHN0cmluZzo6c2l6ZV90eXBlIGVxdWFsc19wb3MgPSBwYXJ0c1tpXS5maW5kX2ZpcnN0X29mKCc9Jyk7Ci0gICAgcGFpcjxzdHJpbmcsIHN0cmluZz4gdmFsdWU7Ci0gICAgaWYgKGVxdWFsc19wb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICB2YWx1ZS5maXJzdCA9IHBhcnRzW2ldOwotICAgICAgdmFsdWUuc2Vjb25kID0gIiI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHZhbHVlLmZpcnN0ID0gcGFydHNbaV0uc3Vic3RyKDAsIGVxdWFsc19wb3MpOwotICAgICAgdmFsdWUuc2Vjb25kID0gcGFydHNbaV0uc3Vic3RyKGVxdWFsc19wb3MgKyAxKTsKLSAgICB9Ci0gICAgb3V0cHV0LT5wdXNoX2JhY2sodmFsdWUpOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ODlmMTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsMTc2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBEZWZpbmVzIHRoZSBhYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgZWFjaCBvZiB0aGUgbGFuZ3VhZ2Utc3BlY2lmaWMKLS8vIGNvZGUgZ2VuZXJhdG9ycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09ERV9HRU5FUkFUT1JfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT0RFX0dFTkVSQVRPUl9IX18KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotbmFtZXNwYWNlIGlvIHsgY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07IH0KLWNsYXNzIEZpbGVEZXNjcmlwdG9yOwotCi1uYW1lc3BhY2UgY29tcGlsZXIgewotCi0vLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KLWNsYXNzIENvZGVHZW5lcmF0b3I7Ci1jbGFzcyBHZW5lcmF0b3JDb250ZXh0OwotCi0vLyBUaGUgYWJzdHJhY3QgaW50ZXJmYWNlIHRvIGEgY2xhc3Mgd2hpY2ggZ2VuZXJhdGVzIGNvZGUgaW1wbGVtZW50aW5nIGEKLS8vIHBhcnRpY3VsYXIgcHJvdG8gZmlsZSBpbiBhIHBhcnRpY3VsYXIgbGFuZ3VhZ2UuICBBIG51bWJlciBvZiB0aGVzZSBtYXkKLS8vIGJlIHJlZ2lzdGVyZWQgd2l0aCBDb21tYW5kTGluZUludGVyZmFjZSB0byBzdXBwb3J0IHZhcmlvdXMgbGFuZ3VhZ2VzLgotY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBDb2RlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIGlubGluZSBDb2RlR2VuZXJhdG9yKCkge30KLSAgdmlydHVhbCB+Q29kZUdlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlcyBjb2RlIGZvciB0aGUgZ2l2ZW4gcHJvdG8gZmlsZSwgZ2VuZXJhdGluZyBvbmUgb3IgbW9yZSBmaWxlcyBpbgotICAvLyB0aGUgZ2l2ZW4gb3V0cHV0IGRpcmVjdG9yeS4KLSAgLy8KLSAgLy8gQSBwYXJhbWV0ZXIgdG8gYmUgcGFzc2VkIHRvIHRoZSBnZW5lcmF0b3IgY2FuIGJlIHNwZWNpZmllZCBvbiB0aGUKLSAgLy8gY29tbWFuZCBsaW5lLiAgVGhpcyBpcyBpbnRlbmRlZCB0byBiZSB1c2VkIGJ5IEphdmEgYW5kIHNpbWlsYXIgbGFuZ3VhZ2VzCi0gIC8vIHRvIHNwZWNpZnkgd2hpY2ggc3BlY2lmaWMgY2xhc3MgZnJvbSB0aGUgcHJvdG8gZmlsZSBpcyB0byBiZSBnZW5lcmF0ZWQsCi0gIC8vIHRob3VnaCBpdCBjb3VsZCBoYXZlIG90aGVyIHVzZXMgYXMgd2VsbC4gIEl0IGlzIGVtcHR5IGlmIG5vIHBhcmFtZXRlciB3YXMKLSAgLy8gZ2l2ZW4uCi0gIC8vCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBzdWNjZXNzZnVsLiAgT3RoZXJ3aXNlLCBzZXRzICplcnJvciB0byBhIGRlc2NyaXB0aW9uIG9mCi0gIC8vIHRoZSBwcm9ibGVtIChlLmcuICJpbnZhbGlkIHBhcmFtZXRlciIpIGFuZCByZXR1cm5zIGZhbHNlLgotICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgPSAwOwotCi0gIC8vIEdlbmVyYXRlcyBjb2RlIGZvciBhbGwgZ2l2ZW4gcHJvdG8gZmlsZXMsIGdlbmVyYXRpbmcgb25lIG9yIG1vcmUgZmlsZXMgaW4KLSAgLy8gdGhlIGdpdmVuIG91dHB1dCBkaXJlY3RvcnkuCi0gIC8vCi0gIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZCBvZiB8R2VuZXJhdGUoKXwgd2hlbgotICAvLyB8SGFzR2VuZXJhdGVBbGwoKXwgcmV0dXJucyB8dHJ1ZXwuIEl0IGlzIHVzZWQgdG8gZW11bGF0ZSBsZWdhY3kgc2VtYW50aWNzCi0gIC8vIHdoZW4gbW9yZSB0aGFuIG9uZSBgLnByb3RvYCBmaWxlIGlzIHNwZWNpZmllZCBvbiBvbmUgY29tcGlsZXIgaW52b2NhdGlvbi4KLSAgLy8KLSAgLy8gV0FSTklORzogUGxlYXNlIGRvIG5vdCB1c2UgdW5sZXNzIGxlZ2FjeSBzZW1hbnRpY3MgZm9yY2UgdGhlIGNvZGUgZ2VuZXJhdG9yCi0gIC8vIHRvIHByb2R1Y2UgYSBzaW5nbGUgb3V0cHV0IGZpbGUgZm9yIGFsbCBpbnB1dCBmaWxlcywgb3Igb3RoZXJ3aXNlIHJlcXVpcmUKLSAgLy8gYW4gZXhhbWluYXRpb24gb2YgYWxsIGlucHV0IGZpbGVzIGZpcnN0LiBUaGUgY2Fub25pY2FsIGNvZGUgZ2VuZXJhdG9yCi0gIC8vIGRlc2lnbiBwcm9kdWNlcyBvbmUgb3V0cHV0IGZpbGUgcGVyIGlucHV0IC5wcm90byBmaWxlLCBhbmQgd2UgZG8gbm90IHdpc2gKLSAgLy8gdG8gZW5jb3VyYWdlIGFsdGVybmF0ZSBkZXNpZ25zLgotICAvLwotICAvLyBBIHBhcmFtZXRlciBpcyBnaXZlbiBhcyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYXMgaW4gfEdlbmVyYXRlKCl8Ci0gIC8vIGFib3ZlLgotICAvLwotICAvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4gIE90aGVyd2lzZSwgc2V0cyAqZXJyb3IgdG8gYSBkZXNjcmlwdGlvbiBvZgotICAvLyB0aGUgcHJvYmxlbSAoZS5nLiAiaW52YWxpZCBwYXJhbWV0ZXIiKSBhbmQgcmV0dXJucyBmYWxzZS4KLSAgdmlydHVhbCBib29sIEdlbmVyYXRlQWxsKGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBmaWxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7Ci0gICAgKmVycm9yID0gIlVuaW1wbGVtZW50ZWQgR2VuZXJhdGVBbGwoKSBtZXRob2QuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvZGUgZ2VuZXJhdG9yIGV4cGVjdHMgdG8gcmVjZWl2ZSBhbGwgRmlsZURlc2NyaXB0b3JzCi0gIC8vIGF0IG9uY2UgKHZpYSB8R2VuZXJhdGVBbGwoKXwpLCByYXRoZXIgdGhhbiBvbmUgYXQgYSB0aW1lICh2aWEKLSAgLy8gfEdlbmVyYXRlKCl8KS4gVGhpcyBpcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgbGVnYWN5IHNlbWFudGljcy4KLSAgdmlydHVhbCBib29sIEhhc0dlbmVyYXRlQWxsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlR2VuZXJhdG9yKTsKLX07Ci0KLS8vIENvZGVHZW5lcmF0b3JzIGdlbmVyYXRlIG9uZSBvciBtb3JlIGZpbGVzIGluIGEgZ2l2ZW4gZGlyZWN0b3J5LiAgVGhpcwotLy8gYWJzdHJhY3QgaW50ZXJmYWNlIHJlcHJlc2VudHMgdGhlIGRpcmVjdG9yeSB0byB3aGljaCB0aGUgQ29kZUdlbmVyYXRvciBpcwotLy8gdG8gd3JpdGUgYW5kIG90aGVyIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjb250ZXh0IGluIHdoaWNoIHRoZSBHZW5lcmF0b3IKLS8vIHJ1bnMuCi1jbGFzcyBMSUJQUk9UT0NfRVhQT1JUIEdlbmVyYXRvckNvbnRleHQgewotIHB1YmxpYzoKLSAgaW5saW5lIEdlbmVyYXRvckNvbnRleHQoKSB7fQotICB2aXJ0dWFsIH5HZW5lcmF0b3JDb250ZXh0KCk7Ci0KLSAgLy8gT3BlbnMgdGhlIGdpdmVuIGZpbGUsIHRydW5jYXRpbmcgaXQgaWYgaXQgZXhpc3RzLCBhbmQgcmV0dXJucyBhCi0gIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBmaWxlLiAgVGhlIGNhbGxlciB0YWtlcyBvd25lcnNoaXAKLSAgLy8gb2YgdGhlIHJldHVybmVkIG9iamVjdC4gIFRoaXMgbWV0aG9kIG5ldmVyIGZhaWxzIChhIGR1bW15IHN0cmVhbSB3aWxsIGJlCi0gIC8vIHJldHVybmVkIGluc3RlYWQpLgotICAvLwotICAvLyBUaGUgZmlsZW5hbWUgZ2l2ZW4gc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLSAgLy8gRS5nLiB0aGUgQysrIGdlbmVyYXRvciwgd2hlbiBnZW5lcmF0aW5nIGNvZGUgZm9yICJmb28vYmFyLnByb3RvIiwgd2lsbAotICAvLyBnZW5lcmF0ZSB0aGUgZmlsZXMgImZvby9iYXIucGIuaCIgYW5kICJmb28vYmFyLnBiLmNjIjsgbm90ZSB0aGF0Ci0gIC8vICJmb28vIiBpcyBpbmNsdWRlZCBpbiB0aGVzZSBmaWxlbmFtZXMuICBUaGUgZmlsZW5hbWUgaXMgbm90IGFsbG93ZWQgdG8KLSAgLy8gY29udGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzLgotICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSA9IDA7Ci0KLSAgLy8gU2ltaWxhciB0byBPcGVuKCkgYnV0IHRoZSBvdXRwdXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZmlsZSBpZiBleGlzdHMKLSAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW5Gb3JBcHBlbmQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7Ci0KLSAgLy8gQ3JlYXRlcyBhIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIHdpbGwgaW5zZXJ0IGNvZGUgaW50byB0aGUgZ2l2ZW4gZmlsZQotICAvLyBhdCB0aGUgZ2l2ZW4gaW5zZXJ0aW9uIHBvaW50LiAgU2VlIHBsdWdpbi5wcm90byAocGx1Z2luLnBiLmgpIGZvciBtb3JlCi0gIC8vIGluZm9ybWF0aW9uIG9uIGluc2VydGlvbiBwb2ludHMuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotICAvLyBhc3NlcnQtZmFpbHMgLS0gaXQgZXhpc3RzIG9ubHkgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgotICAvLwotICAvLyBXQVJOSU5HOiAgVGhpcyBmZWF0dXJlIGlzIGN1cnJlbnRseSBFWFBFUklNRU5UQUwgYW5kIGlzIHN1YmplY3QgdG8gY2hhbmdlLgotICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckluc2VydCgKLSAgICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KTsKLQotICAvLyBSZXR1cm5zIGEgdmVjdG9yIG9mIEZpbGVEZXNjcmlwdG9ycyBmb3IgYWxsIHRoZSBmaWxlcyBiZWluZyBjb21waWxlZAotICAvLyBpbiB0aGlzIHJ1bi4gIFVzZWZ1bCBmb3IgbGFuZ3VhZ2VzLCBzdWNoIGFzIEdvLCB0aGF0IHRyZWF0IGZpbGVzCi0gIC8vIGRpZmZlcmVudGx5IHdoZW4gY29tcGlsZWQgYXMgYSBzZXQgcmF0aGVyIHRoYW4gaW5kaXZpZHVhbGx5LgotICB2aXJ0dWFsIHZvaWQgTGlzdFBhcnNlZEZpbGVzKHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBvdXRwdXQpOwotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyYXRvckNvbnRleHQpOwotfTsKLQotLy8gVGhlIHR5cGUgR2VuZXJhdG9yQ29udGV4dCB3YXMgb25jZSBjYWxsZWQgT3V0cHV0RGlyZWN0b3J5LiBUaGlzIHR5cGVkZWYKLS8vIHByb3ZpZGVzIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkuCi10eXBlZGVmIEdlbmVyYXRvckNvbnRleHQgT3V0cHV0RGlyZWN0b3J5OwotCi0vLyBTZXZlcmFsIGNvZGUgZ2VuZXJhdG9ycyB0cmVhdCB0aGUgcGFyYW1ldGVyIGFyZ3VtZW50IGFzIGhvbGRpbmcgYQotLy8gbGlzdCBvZiBvcHRpb25zIHNlcGFyYXRlZCBieSBjb21tYXMuICBUaGlzIGhlbHBlciBmdW5jdGlvbiBwYXJzZXMKLS8vIGEgc2V0IG9mIGNvbW1hLWRlbGltaXRlZCBuYW1lL3ZhbHVlIHBhaXJzOiBlLmcuLAotLy8gICAiZm9vPWJhcixiYXoscXV4PWNvcmdlIgotLy8gcGFyc2VzIHRvIHRoZSBwYWlyczoKLS8vICAgKCJmb28iLCAiYmFyIiksICgiYmF6IiwgIiIpLCAoInF1eCIsICJjb3JnZSIpCi1leHRlcm4gdm9pZCBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihjb25zdCBzdHJpbmcmLAotICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4qKTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ09ERV9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZjYWQ2YjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTg3OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaD4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxkaXJlY3QuaD4KLSNlbHNlCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGZzdHJlYW0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8Y3R5cGUuaD4KLQotI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9BUkNIX1NQQVJDCi0jaW5jbHVkZSA8bGltaXRzLmg+IC8vRm9yIFBBVEhfTUFYCi0jZW5kaWYKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2lmZGVmIF9fQVBQTEVfXwotI2luY2x1ZGUgPG1hY2gtby9keWxkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+Ci0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotI2lmIGRlZmluZWQoX1dJTjMyKQotI2RlZmluZSBta2RpcihuYW1lLCBtb2RlKSBta2RpcihuYW1lKQotI2lmbmRlZiBXX09LCi0jZGVmaW5lIFdfT0sgMDIgIC8vIG5vdCBkZWZpbmVkIGJ5IE1TVkMgZm9yIHdoYXRldmVyIHJlYXNvbgotI2VuZGlmCi0jaWZuZGVmIEZfT0sKLSNkZWZpbmUgRl9PSyAwMCAgLy8gbm90IGRlZmluZWQgYnkgTVNWQyBmb3Igd2hhdGV2ZXIgcmVhc29uCi0jZW5kaWYKLSNpZm5kZWYgU1RESU5fRklMRU5PCi0jZGVmaW5lIFNURElOX0ZJTEVOTyAwCi0jZW5kaWYKLSNpZm5kZWYgU1RET1VUX0ZJTEVOTwotI2RlZmluZSBTVERPVVRfRklMRU5PIDEKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgT19CSU5BUlkKLSNpZmRlZiBfT19CSU5BUlkKLSNkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCi0jZWxzZQotI2RlZmluZSBPX0JJTkFSWSAwICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IG5lZWQgaXQuCi0jZW5kaWYKLSNlbmRpZgotCi1uYW1lc3BhY2UgewotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotc3RhdGljIGNvbnN0IGNoYXIqIGtQYXRoU2VwYXJhdG9yID0gIjsiOwotI2Vsc2UKLXN0YXRpYyBjb25zdCBjaGFyKiBrUGF0aFNlcGFyYXRvciA9ICI6IjsKLSNlbmRpZgotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIHRleHQgbG9va3MgbGlrZSBhIFdpbmRvd3Mtc3R5bGUgYWJzb2x1dGUgcGF0aCwgc3RhcnRpbmcKLS8vIHdpdGggYSBkcml2ZSBsZXR0ZXIuICBFeGFtcGxlOiAgIkM6XGZvbyIuICBUT0RPKGtlbnRvbik6ICBTaGFyZSB0aGlzIHdpdGgKLS8vIGNvcHkgaW4gaW1wb3J0ZXIuY2M/Ci1zdGF0aWMgYm9vbCBJc1dpbmRvd3NBYnNvbHV0ZVBhdGgoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgcmV0dXJuIHRleHQuc2l6ZSgpID49IDMgJiYgdGV4dFsxXSA9PSAnOicgJiYKLSAgICAgICAgIGlzYWxwaGEodGV4dFswXSkgJiYKLSAgICAgICAgICh0ZXh0WzJdID09ICcvJyB8fCB0ZXh0WzJdID09ICdcXCcpICYmCi0gICAgICAgICB0ZXh0LmZpbmRfbGFzdF9vZignOicpID09IDE7Ci0jZWxzZQotICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotdm9pZCBTZXRGZFRvVGV4dE1vZGUoaW50IGZkKSB7Ci0jaWZkZWYgX1dJTjMyCi0gIGlmIChfc2V0bW9kZShmZCwgX09fVEVYVCkgPT0gLTEpIHsKLSAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIEkgdGhpbmsuCi0gICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiX3NldG1vZGUoIiA8PCBmZCA8PCAiLCBfT19URVhUKTogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gIH0KLSNlbmRpZgotICAvLyAoVGV4dCBhbmQgYmluYXJ5IGFyZSB0aGUgc2FtZSBvbiBub24tV2luZG93cyBwbGF0Zm9ybXMuKQotfQotCi12b2lkIFNldEZkVG9CaW5hcnlNb2RlKGludCBmZCkgewotI2lmZGVmIF9XSU4zMgotICBpZiAoX3NldG1vZGUoZmQsIF9PX0JJTkFSWSkgPT0gLTEpIHsKLSAgICAvLyBUaGlzIHNob3VsZCBuZXZlciBoYXBwZW4sIEkgdGhpbmsuCi0gICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiX3NldG1vZGUoIiA8PCBmZCA8PCAiLCBfT19CSU5BUlkpOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfQotI2VuZGlmCi0gIC8vIChUZXh0IGFuZCBiaW5hcnkgYXJlIHRoZSBzYW1lIG9uIG5vbi1XaW5kb3dzIHBsYXRmb3Jtcy4pCi19Ci0KLXZvaWQgQWRkVHJhaWxpbmdTbGFzaChzdHJpbmcqIHBhdGgpIHsKLSAgaWYgKCFwYXRoLT5lbXB0eSgpICYmIHBhdGgtPmF0KHBhdGgtPnNpemUoKSAtIDEpICE9ICcvJykgewotICAgIHBhdGgtPnB1c2hfYmFjaygnLycpOwotICB9Ci19Ci0KLWJvb2wgVmVyaWZ5RGlyZWN0b3J5RXhpc3RzKGNvbnN0IHN0cmluZyYgcGF0aCkgewotICBpZiAocGF0aC5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKLQotICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgRl9PSykgPT0gLTEpIHsKLSAgICBzdGQ6OmNlcnIgPDwgcGF0aCA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm5vKSA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLS8vIFRyeSB0byBjcmVhdGUgdGhlIHBhcmVudCBkaXJlY3Rvcnkgb2YgdGhlIGdpdmVuIGZpbGUsIGNyZWF0aW5nIHRoZSBwYXJlbnQncwotLy8gcGFyZW50IGlmIG5lY2Vzc2FyeSwgYW5kIHNvIG9uLiAgVGhlIGZ1bGwgZmlsZSBuYW1lIGlzIGFjdHVhbGx5Ci0vLyAocHJlZml4ICsgZmlsZW5hbWUpLCBidXQgd2UgYXNzdW1lIHxwcmVmaXh8IGFscmVhZHkgZXhpc3RzIGFuZCBvbmx5IGNyZWF0ZQotLy8gZGlyZWN0b3JpZXMgbGlzdGVkIGluIHxmaWxlbmFtZXwuCi1ib29sIFRyeUNyZWF0ZVBhcmVudERpcmVjdG9yeShjb25zdCBzdHJpbmcmIHByZWZpeCwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICAvLyBSZWN1cnNpdmVseSBjcmVhdGUgcGFyZW50IGRpcmVjdG9yaWVzIHRvIHRoZSBvdXRwdXQgZmlsZS4KLSAgdmVjdG9yPHN0cmluZz4gcGFydHMgPSBTcGxpdChmaWxlbmFtZSwgIi8iLCB0cnVlKTsKLSAgc3RyaW5nIHBhdGhfc29fZmFyID0gcHJlZml4OwotICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKSAtIDE7IGkrKykgewotICAgIHBhdGhfc29fZmFyICs9IHBhcnRzW2ldOwotICAgIGlmIChta2RpcihwYXRoX3NvX2Zhci5jX3N0cigpLCAwNzc3KSAhPSAwKSB7Ci0gICAgICBpZiAoZXJybm8gIT0gRUVYSVNUKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgICAgICA8PCBwYXRoX3NvX2ZhciA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm5vKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcGF0aF9zb19mYXIgKz0gJy8nOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIHByb3RvYyBiaW5hcnkuCi1ib29sIEdldFByb3RvY0Fic29sdXRlUGF0aChzdHJpbmcqIHBhdGgpIHsKLSNpZmRlZiBfV0lOMzIKLSAgY2hhciBidWZmZXJbTUFYX1BBVEhdOwotICBpbnQgbGVuID0gR2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsIGJ1ZmZlciwgTUFYX1BBVEgpOwotI2VsaWYgX19BUFBMRV9fCi0gIGNoYXIgYnVmZmVyW1BBVEhfTUFYXTsKLSAgaW50IGxlbiA9IDA7Ci0KLSAgY2hhciBkaXJ0eWJ1ZmZlcltQQVRIX01BWF07Ci0gIHVpbnQzMl90IHNpemUgPSBzaXplb2YoZGlydHlidWZmZXIpOwotICBpZiAoX05TR2V0RXhlY3V0YWJsZVBhdGgoZGlydHlidWZmZXIsICZzaXplKSA9PSAwKSB7Ci0gICAgcmVhbHBhdGgoZGlydHlidWZmZXIsIGJ1ZmZlcik7Ci0gICAgbGVuID0gc3RybGVuKGJ1ZmZlcik7Ci0gIH0KLSNlbHNlCi0gIGNoYXIgYnVmZmVyW1BBVEhfTUFYXTsKLSAgaW50IGxlbiA9IHJlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIsIGJ1ZmZlciwgUEFUSF9NQVgpOwotI2VuZGlmCi0gIGlmIChsZW4gPiAwKSB7Ci0gICAgcGF0aC0+YXNzaWduKGJ1ZmZlciwgbGVuKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLy8gV2hldGhlciBhIHBhdGggaXMgd2hlcmUgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gYW5kIG90aGVyIHdlbGwta25vd24KLS8vIHR5cGUgcHJvdG9zIGFyZSBpbnN0YWxsZWQuCi1ib29sIElzSW5zdGFsbGVkUHJvdG9QYXRoKGNvbnN0IHN0cmluZyYgcGF0aCkgewotICAvLyBDaGVja2luZyB0aGUgZGVzY3JpcHRvci5wcm90byBmaWxlIHNob3VsZCBiZSBnb29kIGVub3VnaC4KLSAgc3RyaW5nIGZpbGVfcGF0aCA9IHBhdGggKyAiL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKLSAgcmV0dXJuIGFjY2VzcyhmaWxlX3BhdGguY19zdHIoKSwgRl9PSykgIT0gLTE7Ci19Ci0KLS8vIEFkZCB0aGUgcGF0aHMgd2hlcmUgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXRvci5wcm90byBhbmQgb3RoZXIgd2VsbC1rbm93bgotLy8gdHlwZSBwcm90b3MgYXJlIGluc3RhbGxlZC4KLXZvaWQgQWRkRGVmYXVsdFByb3RvUGF0aHModmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4qIHBhdGhzKSB7Ci0gIC8vIFRPRE8oeGlhb2ZlbmcpOiBUaGUgY29kZSBjdXJyZW50bHkgb25seSBjaGVja3MgcmVsYXRpdmUgcGF0aHMgb2Ygd2hlcmUKLSAgLy8gdGhlIHByb3RvYyBiaW5hcnkgaXMgaW5zdGFsbGVkLiBXZSBwcm9iYWJseSBzaG91bGQgbWFrZSBpdCBoYW5kbGUgbW9yZQotICAvLyBjYXNlcyB0aGFuIHRoYXQuCi0gIHN0cmluZyBwYXRoOwotICBpZiAoIUdldFByb3RvY0Fic29sdXRlUGF0aCgmcGF0aCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgLy8gU3RyaXAgdGhlIGJpbmFyeSBuYW1lLgotICBzaXplX3QgcG9zID0gcGF0aC5maW5kX2xhc3Rfb2YoIi9cXCIpOwotICBpZiAocG9zID09IHN0cmluZzo6bnBvcyB8fCBwb3MgPT0gMCkgewotICAgIHJldHVybjsKLSAgfQotICBwYXRoID0gcGF0aC5zdWJzdHIoMCwgcG9zKTsKLSAgLy8gQ2hlY2sgdGhlIGJpbmFyeSdzIGRpcmVjdG9yeS4KLSAgaWYgKElzSW5zdGFsbGVkUHJvdG9QYXRoKHBhdGgpKSB7Ci0gICAgcGF0aHMtPnB1c2hfYmFjayhwYWlyPHN0cmluZywgc3RyaW5nPigiIiwgcGF0aCkpOwotICAgIHJldHVybjsKLSAgfQotICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbmNsdWRlIHN1YmRpcmVjdG9yeS4KLSAgaWYgKElzSW5zdGFsbGVkUHJvdG9QYXRoKHBhdGggKyAiL2luY2x1ZGUiKSkgewotICAgIHBhdGhzLT5wdXNoX2JhY2socGFpcjxzdHJpbmcsIHN0cmluZz4oIiIsIHBhdGggKyAiL2luY2x1ZGUiKSk7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIENoZWNrIGlmIHRoZSB1cHBlciBsZXZlbCBkaXJlY3RvcnkgaGFzIGFuICJpbmNsdWRlIiBzdWJkaXJlY3RvcnkuCi0gIHBvcyA9IHBhdGguZmluZF9sYXN0X29mKCIvXFwiKTsKLSAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zID09IDApIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgcGF0aCA9IHBhdGguc3Vic3RyKDAsIHBvcyk7Ci0gIGlmIChJc0luc3RhbGxlZFByb3RvUGF0aChwYXRoICsgIi9pbmNsdWRlIikpIHsKLSAgICBwYXRocy0+cHVzaF9iYWNrKHBhaXI8c3RyaW5nLCBzdHJpbmc+KCIiLCBwYXRoICsgIi9pbmNsdWRlIikpOwotICAgIHJldHVybjsKLSAgfQotfQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vIEEgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgdGhhdCBwcmludHMgZXJyb3JzIHRvIHN0ZGVyci4KLWNsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFcnJvclByaW50ZXIgOiBwdWJsaWMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7Ci0gcHVibGljOgotICBFcnJvclByaW50ZXIoRXJyb3JGb3JtYXQgZm9ybWF0LCBEaXNrU291cmNlVHJlZSAqdHJlZSA9IE5VTEwpCi0gICAgOiBmb3JtYXRfKGZvcm1hdCksIHRyZWVfKHRyZWUpIHt9Ci0gIH5FcnJvclByaW50ZXIoKSB7fQotCi0gIC8vIGltcGxlbWVudHMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgQWRkRXJyb3JPcldhcm5pbmcoZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSwgImVycm9yIiwgc3RkOjpjZXJyKTsKLSAgfQotCi0gIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIEFkZEVycm9yT3JXYXJuaW5nKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UsICJ3YXJuaW5nIiwgc3RkOjpjbG9nKTsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgaW86OkVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIEFkZEVycm9yKCJpbnB1dCIsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0gIH0KLQotICB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIEFkZEVycm9yT3JXYXJuaW5nKCJpbnB1dCIsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSwgIndhcm5pbmciLCBzdGQ6OmNsb2cpOwotICB9Ci0KLSBwcml2YXRlOgotICB2b2lkIEFkZEVycm9yT3JXYXJuaW5nKAotICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCi0gICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyYgdHlwZSwgb3N0cmVhbSYgb3V0KSB7Ci0gICAgLy8gUHJpbnQgZnVsbCBwYXRoIHdoZW4gcnVubmluZyB1bmRlciBNU1ZTCi0gICAgc3RyaW5nIGRmaWxlOwotICAgIGlmIChmb3JtYXRfID09IENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfTVNWUyAmJgotICAgICAgICB0cmVlXyAhPSBOVUxMICYmCi0gICAgICAgIHRyZWVfLT5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoZmlsZW5hbWUsICZkZmlsZSkpIHsKLSAgICAgIG91dCA8PCBkZmlsZTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8IGZpbGVuYW1lOwotICAgIH0KLQotICAgIC8vIFVzZXJzIHR5cGljYWxseSBleHBlY3QgMS1iYXNlZCBsaW5lL2NvbHVtbiBudW1iZXJzLCBzbyB3ZSBhZGQgMQotICAgIC8vIHRvIGVhY2ggaGVyZS4KLSAgICBpZiAobGluZSAhPSAtMSkgewotICAgICAgLy8gQWxsb3cgZm9yIGJvdGggR0NDLSBhbmQgVmlzdWFsLVN0dWRpby1jb21wYXRpYmxlIG91dHB1dC4KLSAgICAgIHN3aXRjaCAoZm9ybWF0XykgewotICAgICAgICBjYXNlIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfR0NDOgotICAgICAgICAgIG91dCA8PCAiOiIgPDwgKGxpbmUgKyAxKSA8PCAiOiIgPDwgKGNvbHVtbiArIDEpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfTVNWUzoKLSAgICAgICAgICBvdXQgPDwgIigiIDw8IChsaW5lICsgMSkgPDwgIikgOiAiCi0gICAgICAgICAgICAgIDw8IHR5cGUgPDwgIiBpbiBjb2x1bW49IiA8PCAoY29sdW1uICsgMSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKHR5cGUgPT0gIndhcm5pbmciKSB7Ci0gICAgICBvdXQgPDwgIjogd2FybmluZzogIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKLSAgICB9IGVsc2UgewotICAgICAgb3V0IDw8ICI6ICIgPDwgbWVzc2FnZSA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICB9Ci0KLSAgY29uc3QgRXJyb3JGb3JtYXQgZm9ybWF0XzsKLSAgRGlza1NvdXJjZVRyZWUgKnRyZWVfOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBIEdlbmVyYXRvckNvbnRleHQgaW1wbGVtZW50YXRpb24gdGhhdCBidWZmZXJzIGZpbGVzIGluIG1lbW9yeSwgdGhlbiBkdW1wcwotLy8gdGhlbSBhbGwgdG8gZGlzayBvbiBkZW1hbmQuCi1jbGFzcyBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGwgOiBwdWJsaWMgR2VuZXJhdG9yQ29udGV4dCB7Ci0gcHVibGljOgotICBHZW5lcmF0b3JDb250ZXh0SW1wbChjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzKTsKLSAgfkdlbmVyYXRvckNvbnRleHRJbXBsKCk7Ci0KLSAgLy8gV3JpdGUgYWxsIGZpbGVzIGluIHRoZSBkaXJlY3RvcnkgdG8gZGlzayBhdCB0aGUgZ2l2ZW4gb3V0cHV0IGxvY2F0aW9uLAotICAvLyB3aGljaCBtdXN0IGVuZCBpbiBhICcvJy4KLSAgYm9vbCBXcml0ZUFsbFRvRGlzayhjb25zdCBzdHJpbmcmIHByZWZpeCk7Ci0KLSAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgZGlyZWN0b3J5IHRvIGEgWklQLWZvcm1hdCBhcmNoaXZlIHdpdGggdGhlCi0gIC8vIGdpdmVuIG5hbWUuCi0gIGJvb2wgV3JpdGVBbGxUb1ppcChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKLQotICAvLyBBZGQgYSBib2lsZXJwbGF0ZSBNRVRBLUlORi9NQU5JRkVTVC5NRiBmaWxlIGFzIHJlcXVpcmVkIGJ5IHRoZSBKYXZhIEpBUgotICAvLyBmb3JtYXQsIHVubGVzcyBvbmUgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgotICB2b2lkIEFkZEphck1hbmlmZXN0KCk7Ci0KLSAgLy8gR2V0IG5hbWUgb2YgYWxsIG91dHB1dCBmaWxlcy4KLSAgdm9pZCBHZXRPdXRwdXRGaWxlbmFtZXModmVjdG9yPHN0cmluZz4qIG91dHB1dF9maWxlbmFtZXMpOwotCi0gIC8vIGltcGxlbWVudHMgR2VuZXJhdG9yQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7Ci0gIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckFwcGVuZChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKLSAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuRm9ySW5zZXJ0KAotICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpOwotICB2b2lkIExpc3RQYXJzZWRGaWxlcyh2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KSB7Ci0gICAgKm91dHB1dCA9IHBhcnNlZF9maWxlc187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBNZW1vcnlPdXRwdXRTdHJlYW07Ci0KLSAgLy8gbWFwIGluc3RlYWQgb2YgaGFzaF9tYXAgc28gdGhhdCBmaWxlcyBhcmUgd3JpdHRlbiBpbiBvcmRlciAoZ29vZCB3aGVuCi0gIC8vIHdyaXRpbmcgemlwcykuCi0gIG1hcDxzdHJpbmcsIHN0cmluZyo+IGZpbGVzXzsKLSAgY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlc187Ci0gIGJvb2wgaGFkX2Vycm9yXzsKLX07Ci0KLWNsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpNZW1vcnlPdXRwdXRTdHJlYW0KLSAgICA6IHB1YmxpYyBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgTWVtb3J5T3V0cHV0U3RyZWFtKEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnksIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBib29sIGFwcGVuZF9tb2RlKTsKLSAgTWVtb3J5T3V0cHV0U3RyZWFtKEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnksIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCk7Ci0gIHZpcnR1YWwgfk1lbW9yeU91dHB1dFN0cmVhbSgpOwotCi0gIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZpcnR1YWwgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsgcmV0dXJuIGlubmVyXy0+TmV4dChkYXRhLCBzaXplKTsgfQotICB2aXJ0dWFsIHZvaWQgQmFja1VwKGludCBjb3VudCkgICAgICAgICAgICB7ICAgICAgICBpbm5lcl8tPkJhY2tVcChjb3VudCk7ICAgIH0KLSAgdmlydHVhbCBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdCAgICAgICAgICAgeyByZXR1cm4gaW5uZXJfLT5CeXRlQ291bnQoKTsgICAgICB9Ci0KLSBwcml2YXRlOgotICAvLyBXaGVyZSB0byBpbnNlcnQgdGhlIHN0cmluZyB3aGVuIGl0J3MgZG9uZS4KLSAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeV87Ci0gIHN0cmluZyBmaWxlbmFtZV87Ci0gIHN0cmluZyBpbnNlcnRpb25fcG9pbnRfOwotCi0gIC8vIFRoZSBzdHJpbmcgd2UncmUgYnVpbGRpbmcuCi0gIHN0cmluZyBkYXRhXzsKLQotICAvLyBXaGV0aGVyIHdlIHNob3VsZCBhcHBlbmQgdGhlIG91dHB1dCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCi0gIGJvb2wgYXBwZW5kX21vZGVfOwotCi0gIC8vIFN0cmluZ091dHB1dFN0cmVhbSB3cml0aW5nIHRvIGRhdGFfLgotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0+IGlubmVyXzsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotQ29tbWFuZExpbmVJbnRlcmZhY2U6OkdlbmVyYXRvckNvbnRleHRJbXBsOjpHZW5lcmF0b3JDb250ZXh0SW1wbCgKLSAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzKQotICAgIDogcGFyc2VkX2ZpbGVzXyhwYXJzZWRfZmlsZXMpLAotICAgICAgaGFkX2Vycm9yXyhmYWxzZSkgewotfQotCi1Db21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6On5HZW5lcmF0b3JDb250ZXh0SW1wbCgpIHsKLSAgU1RMRGVsZXRlVmFsdWVzKCZmaWxlc18pOwotfQotCi1ib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6V3JpdGVBbGxUb0Rpc2soCi0gICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgpIHsKLSAgaWYgKGhhZF9lcnJvcl8pIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoIVZlcmlmeURpcmVjdG9yeUV4aXN0cyhwcmVmaXgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmcqPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGZpbGVzXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZmlsZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBjb25zdCBzdHJpbmcmIHJlbGF0aXZlX2ZpbGVuYW1lID0gaXRlci0+Zmlyc3Q7Ci0gICAgY29uc3QgY2hhciogZGF0YSA9IGl0ZXItPnNlY29uZC0+ZGF0YSgpOwotICAgIGludCBzaXplID0gaXRlci0+c2Vjb25kLT5zaXplKCk7Ci0KLSAgICBpZiAoIVRyeUNyZWF0ZVBhcmVudERpcmVjdG9yeShwcmVmaXgsIHJlbGF0aXZlX2ZpbGVuYW1lKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBzdHJpbmcgZmlsZW5hbWUgPSBwcmVmaXggKyByZWxhdGl2ZV9maWxlbmFtZTsKLQotICAgIC8vIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuCi0gICAgaW50IGZpbGVfZGVzY3JpcHRvcjsKLSAgICBkbyB7Ci0gICAgICBmaWxlX2Rlc2NyaXB0b3IgPQotICAgICAgICBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDY2Nik7Ci0gICAgfSB3aGlsZSAoZmlsZV9kZXNjcmlwdG9yIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICBpZiAoZmlsZV9kZXNjcmlwdG9yIDwgMCkgewotICAgICAgaW50IGVycm9yID0gZXJybm87Ci0gICAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgdGhlIGZpbGUuCi0gICAgd2hpbGUgKHNpemUgPiAwKSB7Ci0gICAgICBpbnQgd3JpdGVfcmVzdWx0OwotICAgICAgZG8gewotICAgICAgICB3cml0ZV9yZXN1bHQgPSB3cml0ZShmaWxlX2Rlc2NyaXB0b3IsIGRhdGEsIHNpemUpOwotICAgICAgfSB3aGlsZSAod3JpdGVfcmVzdWx0IDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgICAgIGlmICh3cml0ZV9yZXN1bHQgPD0gMCkgewotICAgICAgICAvLyBXcml0ZSBlcnJvci4KLQotICAgICAgICAvLyBGSVhNRShrZW50b24pOiAgQWNjb3JkaW5nIHRvIHRoZSBtYW4gcGFnZSwgaWYgd3JpdGUoKSByZXR1cm5zIHplcm8sCi0gICAgICAgIC8vICAgdGhlcmUgd2FzIG5vIGVycm9yOyB3cml0ZSgpIHNpbXBseSBkaWQgbm90IHdyaXRlIGFueXRoaW5nLiAgSXQncwotICAgICAgICAvLyAgIHVuY2xlYXIgdW5kZXIgd2hhdCBjaXJjdW1zdGFuY2VzIHRoaXMgbWlnaHQgaGFwcGVuLCBidXQgcHJlc3VtYWJseQotICAgICAgICAvLyAgIGVycm5vIHdvbid0IGJlIHNldCBpbiB0aGlzIGNhc2UuICBJIGFtIGNvbmZ1c2VkIGFzIHRvIGhvdyBzdWNoIGFuCi0gICAgICAgIC8vICAgZXZlbnQgc2hvdWxkIGJlIGhhbmRsZWQuICBGb3Igbm93IEknbSB0cmVhdGluZyBpdCBhcyBhbiBlcnJvciwKLSAgICAgICAgLy8gICBzaW5jZSByZXRyeWluZyBzZWVtcyBsaWtlIGl0IGNvdWxkIGxlYWQgdG8gYW4gaW5maW5pdGUgbG9vcC4gIEkKLSAgICAgICAgLy8gICBzdXNwZWN0IHRoaXMgbmV2ZXIgYWN0dWFsbHkgaGFwcGVucyBhbnl3YXkuCi0KLSAgICAgICAgaWYgKHdyaXRlX3Jlc3VsdCA8IDApIHsKLSAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKLSAgICAgICAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogd3JpdGU6ICIgPDwgc3RyZXJyb3IoZXJyb3IpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3cml0ZSgpIHJldHVybmVkIHplcm8/IiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBkYXRhICs9IHdyaXRlX3Jlc3VsdDsKLSAgICAgIHNpemUgLT0gd3JpdGVfcmVzdWx0OwotICAgIH0KLQotICAgIGlmIChjbG9zZShmaWxlX2Rlc2NyaXB0b3IpICE9IDApIHsKLSAgICAgIGludCBlcnJvciA9IGVycm5vOwotICAgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lIDw8ICI6IGNsb3NlOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OldyaXRlQWxsVG9aaXAoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICBpZiAoaGFkX2Vycm9yXykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENyZWF0ZSB0aGUgb3V0cHV0IGZpbGUuCi0gIGludCBmaWxlX2Rlc2NyaXB0b3I7Ci0gIGRvIHsKLSAgICBmaWxlX2Rlc2NyaXB0b3IgPQotICAgICAgb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NjYpOwotICB9IHdoaWxlIChmaWxlX2Rlc2NyaXB0b3IgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICBpZiAoZmlsZV9kZXNjcmlwdG9yIDwgMCkgewotICAgIGludCBlcnJvciA9IGVycm5vOwotICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIFppcFdyaXRlcgotICBpbzo6RmlsZU91dHB1dFN0cmVhbSBzdHJlYW0oZmlsZV9kZXNjcmlwdG9yKTsKLSAgWmlwV3JpdGVyIHppcF93cml0ZXIoJnN0cmVhbSk7Ci0KLSAgZm9yIChtYXA8c3RyaW5nLCBzdHJpbmcqPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGZpbGVzXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZmlsZXNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICB6aXBfd3JpdGVyLldyaXRlKGl0ZXItPmZpcnN0LCAqaXRlci0+c2Vjb25kKTsKLSAgfQotCi0gIHppcF93cml0ZXIuV3JpdGVEaXJlY3RvcnkoKTsKLQotICBpZiAoc3RyZWFtLkdldEVycm5vKCkgIT0gMCkgewotICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiAiIDw8IHN0cmVycm9yKHN0cmVhbS5HZXRFcnJubygpKSA8PCBzdGQ6OmVuZGw7Ci0gIH0KLQotICBpZiAoIXN0cmVhbS5DbG9zZSgpKSB7Ci0gICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lIDw8ICI6ICIgPDwgc3RyZXJyb3Ioc3RyZWFtLkdldEVycm5vKCkpIDw8IHN0ZDo6ZW5kbDsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6QWRkSmFyTWFuaWZlc3QoKSB7Ci0gIHN0cmluZyoqIG1hcF9zbG90ID0gJmZpbGVzX1siTUVUQS1JTkYvTUFOSUZFU1QuTUYiXTsKLSAgaWYgKCptYXBfc2xvdCA9PSBOVUxMKSB7Ci0gICAgKm1hcF9zbG90ID0gbmV3IHN0cmluZygKLSAgICAgICAgIk1hbmlmZXN0LVZlcnNpb246IDEuMFxuIgotICAgICAgICAiQ3JlYXRlZC1CeTogMS42LjAgKHByb3RvYylcbiIKLSAgICAgICAgIlxuIik7Ci0gIH0KLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OkdldE91dHB1dEZpbGVuYW1lcygKLSAgICB2ZWN0b3I8c3RyaW5nPiogb3V0cHV0X2ZpbGVuYW1lcykgewotICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZyo+OjppdGVyYXRvciBpdGVyID0gZmlsZXNfLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBmaWxlc18uZW5kKCk7ICsraXRlcikgewotICAgIG91dHB1dF9maWxlbmFtZXMtPnB1c2hfYmFjayhpdGVyLT5maXJzdCk7Ci0gIH0KLX0KLQotaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6Ok9wZW4oCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICByZXR1cm4gbmV3IE1lbW9yeU91dHB1dFN0cmVhbSh0aGlzLCBmaWxlbmFtZSwgZmFsc2UpOwotfQotCi1pbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qCi1Db21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6Ok9wZW5Gb3JBcHBlbmQoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICByZXR1cm4gbmV3IE1lbW9yeU91dHB1dFN0cmVhbSh0aGlzLCBmaWxlbmFtZSwgdHJ1ZSk7Ci19Ci0KLWlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSoKLUNvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6T3BlbkZvckluc2VydCgKLSAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCkgewotICByZXR1cm4gbmV3IE1lbW9yeU91dHB1dFN0cmVhbSh0aGlzLCBmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1Db21tYW5kTGluZUludGVyZmFjZTo6TWVtb3J5T3V0cHV0U3RyZWFtOjpNZW1vcnlPdXRwdXRTdHJlYW0oCi0gICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgYm9vbCBhcHBlbmRfbW9kZSkKLSAgICA6IGRpcmVjdG9yeV8oZGlyZWN0b3J5KSwKLSAgICAgIGZpbGVuYW1lXyhmaWxlbmFtZSksCi0gICAgICBhcHBlbmRfbW9kZV8oYXBwZW5kX21vZGUpLAotICAgICAgaW5uZXJfKG5ldyBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtKCZkYXRhXykpIHsKLX0KLQotQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1lbW9yeU91dHB1dFN0cmVhbTo6TWVtb3J5T3V0cHV0U3RyZWFtKAotICAgIEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnksIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpCi0gICAgOiBkaXJlY3RvcnlfKGRpcmVjdG9yeSksCi0gICAgICBmaWxlbmFtZV8oZmlsZW5hbWUpLAotICAgICAgaW5zZXJ0aW9uX3BvaW50XyhpbnNlcnRpb25fcG9pbnQpLAotICAgICAgaW5uZXJfKG5ldyBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtKCZkYXRhXykpIHsKLX0KLQotQ29tbWFuZExpbmVJbnRlcmZhY2U6Ok1lbW9yeU91dHB1dFN0cmVhbTo6fk1lbW9yeU91dHB1dFN0cmVhbSgpIHsKLSAgLy8gTWFrZSBzdXJlIGFsbCBkYXRhIGhhcyBiZWVuIHdyaXR0ZW4uCi0gIGlubmVyXy5yZXNldCgpOwotCi0gIC8vIEluc2VydCBpbnRvIHRoZSBkaXJlY3RvcnkuCi0gIHN0cmluZyoqIG1hcF9zbG90ID0gJmRpcmVjdG9yeV8tPmZpbGVzX1tmaWxlbmFtZV9dOwotCi0gIGlmIChpbnNlcnRpb25fcG9pbnRfLmVtcHR5KCkpIHsKLSAgICAvLyBUaGlzIHdhcyBqdXN0IGEgcmVndWxhciBPcGVuKCkuCi0gICAgaWYgKCptYXBfc2xvdCAhPSBOVUxMKSB7Ci0gICAgICBpZiAoYXBwZW5kX21vZGVfKSB7Ci0gICAgICAgICgqbWFwX3Nsb3QpLT5hcHBlbmQoZGF0YV8pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lXyA8PCAiOiBUcmllZCB0byB3cml0ZSB0aGUgc2FtZSBmaWxlIHR3aWNlLiIKLSAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgZGlyZWN0b3J5Xy0+aGFkX2Vycm9yXyA9IHRydWU7Ci0gICAgICB9Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgKm1hcF9zbG90ID0gbmV3IHN0cmluZzsKLSAgICAoKm1hcF9zbG90KS0+c3dhcChkYXRhXyk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhpcyB3YXMgYW4gT3BlbkZvckluc2VydCgpLgotCi0gICAgLy8gSWYgdGhlIGRhdGEgZG9lbnMndCBlbmQgd2l0aCBhIGNsZWFuIGxpbmUgYnJlYWssIGFkZCBvbmUuCi0gICAgaWYgKCFkYXRhXy5lbXB0eSgpICYmIGRhdGFfW2RhdGFfLnNpemUoKSAtIDFdICE9ICdcbicpIHsKLSAgICAgIGRhdGFfLnB1c2hfYmFjaygnXG4nKTsKLSAgICB9Ci0KLSAgICAvLyBGaW5kIHRoZSBmaWxlIHdlIGFyZSBnb2luZyB0byBpbnNlcnQgaW50by4KLSAgICBpZiAoKm1hcF9zbG90ID09IE5VTEwpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZV8KLSAgICAgICAgICAgICAgICA8PCAiOiBUcmllZCB0byBpbnNlcnQgaW50byBmaWxlIHRoYXQgZG9lc24ndCBleGlzdC4iCi0gICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgICAgZGlyZWN0b3J5Xy0+aGFkX2Vycm9yXyA9IHRydWU7Ci0gICAgICByZXR1cm47Ci0gICAgfQotICAgIHN0cmluZyogdGFyZ2V0ID0gKm1hcF9zbG90OwotCi0gICAgLy8gRmluZCB0aGUgaW5zZXJ0aW9uIHBvaW50LgotICAgIHN0cmluZyBtYWdpY19zdHJpbmcgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAgICAgICAiQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KCQwKSIsIGluc2VydGlvbl9wb2ludF8pOwotICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHRhcmdldC0+ZmluZChtYWdpY19zdHJpbmcpOwotCi0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZV8gPDwgIjogaW5zZXJ0aW9uIHBvaW50IFwiIiA8PCBpbnNlcnRpb25fcG9pbnRfCi0gICAgICAgICAgICAgICAgPDwgIlwiIG5vdCBmb3VuZC4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIGRpcmVjdG9yeV8tPmhhZF9lcnJvcl8gPSB0cnVlOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIC8vIFNlZWsgYmFja3dhcmRzIHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGxpbmUsIHdoaWNoIGlzIHdoZXJlIHdlIHdpbGwKLSAgICAvLyBpbnNlcnQgdGhlIGRhdGEuICBOb3RlIHRoYXQgdGhpcyBoYXMgdGhlIGVmZmVjdCBvZiBwdXNoaW5nIHRoZSBpbnNlcnRpb24KLSAgICAvLyBwb2ludCBkb3duLCBzbyB0aGUgZGF0YSBpcyBpbnNlcnRlZCBiZWZvcmUgaXQuICBUaGlzIGlzIGludGVudGlvbmFsCi0gICAgLy8gYmVjYXVzZSBpdCBtZWFucyB0aGF0IG11bHRpcGxlIGluc2VydGlvbnMgYXQgdGhlIHNhbWUgcG9pbnQgd2lsbCBlbmQKLSAgICAvLyB1cCBpbiB0aGUgZXhwZWN0ZWQgb3JkZXIgaW4gdGhlIGZpbmFsIG91dHB1dC4KLSAgICBwb3MgPSB0YXJnZXQtPmZpbmRfbGFzdF9vZignXG4nLCBwb3MpOwotICAgIGlmIChwb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAvLyBJbnNlcnRpb24gcG9pbnQgaXMgb24gdGhlIGZpcnN0IGxpbmUuCi0gICAgICBwb3MgPSAwOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBBZHZhbmNlIHRvIGNoYXJhY3RlciBhZnRlciAnXG4nLgotICAgICAgKytwb3M7Ci0gICAgfQotCi0gICAgLy8gRXh0cmFjdCBpbmRlbnQuCi0gICAgc3RyaW5nIGluZGVudF8oKnRhcmdldCwgcG9zLCB0YXJnZXQtPmZpbmRfZmlyc3Rfbm90X29mKCIgXHQiLCBwb3MpIC0gcG9zKTsKLQotICAgIGlmIChpbmRlbnRfLmVtcHR5KCkpIHsKLSAgICAgIC8vIE5vIGluZGVudC4gIFRoaXMgbWFrZXMgdGhpbmdzIGVhc2llci4KLSAgICAgIHRhcmdldC0+aW5zZXJ0KHBvcywgZGF0YV8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBDYWxjdWxhdGUgaG93IG11Y2ggc3BhY2Ugd2UgbmVlZC4KLSAgICAgIGludCBpbmRlbnRfc2l6ZSA9IDA7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRhdGFfLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmIChkYXRhX1tpXSA9PSAnXG4nKSBpbmRlbnRfc2l6ZSArPSBpbmRlbnRfLnNpemUoKTsKLSAgICAgIH0KLQotICAgICAgLy8gTWFrZSBhIGhvbGUgZm9yIGl0LgotICAgICAgdGFyZ2V0LT5pbnNlcnQocG9zLCBkYXRhXy5zaXplKCkgKyBpbmRlbnRfc2l6ZSwgJ1wwJyk7Ci0KLSAgICAgIC8vIE5vdyBjb3B5IGluIHRoZSBkYXRhLgotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgZGF0YV9wb3MgPSAwOwotICAgICAgY2hhciogdGFyZ2V0X3B0ciA9IHN0cmluZ19hc19hcnJheSh0YXJnZXQpICsgcG9zOwotICAgICAgd2hpbGUgKGRhdGFfcG9zIDwgZGF0YV8uc2l6ZSgpKSB7Ci0gICAgICAgIC8vIENvcHkgaW5kZW50LgotICAgICAgICBtZW1jcHkodGFyZ2V0X3B0ciwgaW5kZW50Xy5kYXRhKCksIGluZGVudF8uc2l6ZSgpKTsKLSAgICAgICAgdGFyZ2V0X3B0ciArPSBpbmRlbnRfLnNpemUoKTsKLQotICAgICAgICAvLyBDb3B5IGxpbmUgZnJvbSBkYXRhXy4KLSAgICAgICAgLy8gV2UgYWxyZWFkeSBndWFyYW50ZWVkIHRoYXQgZGF0YV8gZW5kcyB3aXRoIGEgbmV3bGluZSAoYWJvdmUpLCBzbyB0aGlzCi0gICAgICAgIC8vIHNlYXJjaCBjYW4ndCBmYWlsLgotICAgICAgICBzdHJpbmc6OnNpemVfdHlwZSBsaW5lX2xlbmd0aCA9Ci0gICAgICAgICAgICBkYXRhXy5maW5kX2ZpcnN0X29mKCdcbicsIGRhdGFfcG9zKSArIDEgLSBkYXRhX3BvczsKLSAgICAgICAgbWVtY3B5KHRhcmdldF9wdHIsIGRhdGFfLmRhdGEoKSArIGRhdGFfcG9zLCBsaW5lX2xlbmd0aCk7Ci0gICAgICAgIHRhcmdldF9wdHIgKz0gbGluZV9sZW5ndGg7Ci0gICAgICAgIGRhdGFfcG9zICs9IGxpbmVfbGVuZ3RoOwotICAgICAgfQotCi0gICAgICBHT09HTEVfQ0hFQ0tfRVEodGFyZ2V0X3B0ciwKLSAgICAgICAgICBzdHJpbmdfYXNfYXJyYXkodGFyZ2V0KSArIHBvcyArIGRhdGFfLnNpemUoKSArIGluZGVudF9zaXplKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db21tYW5kTGluZUludGVyZmFjZTo6Q29tbWFuZExpbmVJbnRlcmZhY2UoKQotICA6IG1vZGVfKE1PREVfQ09NUElMRSksCi0gICAgcHJpbnRfbW9kZV8oUFJJTlRfTk9ORSksCi0gICAgZXJyb3JfZm9ybWF0XyhFUlJPUl9GT1JNQVRfR0NDKSwKLSAgICBpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyhmYWxzZSksCi0gICAgc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfKGZhbHNlKSwKLSAgICBkaXNhbGxvd19zZXJ2aWNlc18oZmFsc2UpLAotICAgIGlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV8oZmFsc2UpIHt9Ci1Db21tYW5kTGluZUludGVyZmFjZTo6fkNvbW1hbmRMaW5lSW50ZXJmYWNlKCkge30KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UmVnaXN0ZXJHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBmbGFnX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGhlbHBfdGV4dCkgewotICBHZW5lcmF0b3JJbmZvIGluZm87Ci0gIGluZm8uZmxhZ19uYW1lID0gZmxhZ19uYW1lOwotICBpbmZvLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLSAgaW5mby5oZWxwX3RleHQgPSBoZWxwX3RleHQ7Ci0gIGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lX1tmbGFnX25hbWVdID0gaW5mbzsKLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UmVnaXN0ZXJHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBmbGFnX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9mbGFnX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGhlbHBfdGV4dCkgewotICBHZW5lcmF0b3JJbmZvIGluZm87Ci0gIGluZm8uZmxhZ19uYW1lID0gZmxhZ19uYW1lOwotICBpbmZvLm9wdGlvbl9mbGFnX25hbWUgPSBvcHRpb25fZmxhZ19uYW1lOwotICBpbmZvLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKLSAgaW5mby5oZWxwX3RleHQgPSBoZWxwX3RleHQ7Ci0gIGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lX1tmbGFnX25hbWVdID0gaW5mbzsKLSAgZ2VuZXJhdG9yc19ieV9vcHRpb25fbmFtZV9bb3B0aW9uX2ZsYWdfbmFtZV0gPSBpbmZvOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpBbGxvd1BsdWdpbnMoY29uc3Qgc3RyaW5nJiBleGVfbmFtZV9wcmVmaXgpIHsKLSAgcGx1Z2luX3ByZWZpeF8gPSBleGVfbmFtZV9wcmVmaXg7Ci19Ci0KLWludCBDb21tYW5kTGluZUludGVyZmFjZTo6UnVuKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pIHsKLSAgQ2xlYXIoKTsKLSAgc3dpdGNoIChQYXJzZUFyZ3VtZW50cyhhcmdjLCBhcmd2KSkgewotICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfRVhJVDoKLSAgICAgIHJldHVybiAwOwotICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRkFJTDoKLSAgICAgIHJldHVybiAxOwotICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUU6Ci0gICAgICBicmVhazsKLSAgfQotCi0gIEFkZERlZmF1bHRQcm90b1BhdGhzKCZwcm90b19wYXRoXyk7Ci0KLSAgLy8gU2V0IHVwIHRoZSBzb3VyY2UgdHJlZS4KLSAgRGlza1NvdXJjZVRyZWUgc291cmNlX3RyZWU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG9fcGF0aF8uc2l6ZSgpOyBpKyspIHsKLSAgICBzb3VyY2VfdHJlZS5NYXBQYXRoKHByb3RvX3BhdGhfW2ldLmZpcnN0LCBwcm90b19wYXRoX1tpXS5zZWNvbmQpOwotICB9Ci0KLSAgLy8gTWFwIGlucHV0IGZpbGVzIHRvIHZpcnR1YWwgcGF0aHMgaWYgbmVjZXNzYXJ5LgotICBpZiAoIWlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV8pIHsKLSAgICBpZiAoIU1ha2VJbnB1dHNCZVByb3RvUGF0aFJlbGF0aXZlKCZzb3VyY2VfdHJlZSkpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIC8vIEFsbG9jYXRlIHRoZSBJbXBvcnRlci4KLSAgRXJyb3JQcmludGVyIGVycm9yX2NvbGxlY3RvcihlcnJvcl9mb3JtYXRfLCAmc291cmNlX3RyZWUpOwotICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOwotCi0gIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlczsKLQotICAvLyBQYXJzZSBlYWNoIGZpbGUuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXRfZmlsZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgLy8gSW1wb3J0IHRoZSBmaWxlLgotICAgIGltcG9ydGVyLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZShpbnB1dF9maWxlc19baV0pOwotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwYXJzZWRfZmlsZSA9IGltcG9ydGVyLkltcG9ydChpbnB1dF9maWxlc19baV0pOwotICAgIGltcG9ydGVyLkNsZWFyVW51c2VkSW1wb3J0VHJhY2tGaWxlcygpOwotICAgIGlmIChwYXJzZWRfZmlsZSA9PSBOVUxMKSByZXR1cm4gMTsKLSAgICBwYXJzZWRfZmlsZXMucHVzaF9iYWNrKHBhcnNlZF9maWxlKTsKLQotICAgIC8vIEVuZm9yY2UgLS1kaXNhbGxvd19zZXJ2aWNlcy4KLSAgICBpZiAoZGlzYWxsb3dfc2VydmljZXNfICYmIHBhcnNlZF9maWxlLT5zZXJ2aWNlX2NvdW50KCkgPiAwKSB7Ci0gICAgICBjZXJyIDw8IHBhcnNlZF9maWxlLT5uYW1lKCkgPDwgIjogVGhpcyBmaWxlIGNvbnRhaW5zIHNlcnZpY2VzLCBidXQgIgotICAgICAgICAgICAgICAiLS1kaXNhbGxvd19zZXJ2aWNlcyB3YXMgdXNlZC4iIDw8IGVuZGw7Ci0gICAgICByZXR1cm4gMTsKLSAgICB9Ci0gIH0KLQotICAvLyBXZSBjb25zdHJ1Y3QgYSBzZXBhcmF0ZSBHZW5lcmF0b3JDb250ZXh0IGZvciBlYWNoIG91dHB1dCBsb2NhdGlvbi4gIE5vdGUKLSAgLy8gdGhhdCB0d28gY29kZSBnZW5lcmF0b3JzIG1heSBvdXRwdXQgdG8gdGhlIHNhbWUgbG9jYXRpb24sIGluIHdoaWNoIGNhc2UKLSAgLy8gdGhleSBzaG91bGQgc2hhcmUgYSBzaW5nbGUgR2VuZXJhdG9yQ29udGV4dCBzbyB0aGF0IE9wZW5Gb3JJbnNlcnQoKSB3b3Jrcy4KLSAgR2VuZXJhdG9yQ29udGV4dE1hcCBvdXRwdXRfZGlyZWN0b3JpZXM7Ci0KLSAgLy8gR2VuZXJhdGUgb3V0cHV0LgotICBpZiAobW9kZV8gPT0gTU9ERV9DT01QSUxFKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdXRwdXRfZGlyZWN0aXZlc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIHN0cmluZyBvdXRwdXRfbG9jYXRpb24gPSBvdXRwdXRfZGlyZWN0aXZlc19baV0ub3V0cHV0X2xvY2F0aW9uOwotICAgICAgaWYgKCFIYXNTdWZmaXhTdHJpbmcob3V0cHV0X2xvY2F0aW9uLCAiLnppcCIpICYmCi0gICAgICAgICAgIUhhc1N1ZmZpeFN0cmluZyhvdXRwdXRfbG9jYXRpb24sICIuamFyIikpIHsKLSAgICAgICAgQWRkVHJhaWxpbmdTbGFzaCgmb3V0cHV0X2xvY2F0aW9uKTsKLSAgICAgIH0KLSAgICAgIEdlbmVyYXRvckNvbnRleHRJbXBsKiogbWFwX3Nsb3QgPSAmb3V0cHV0X2RpcmVjdG9yaWVzW291dHB1dF9sb2NhdGlvbl07Ci0KLSAgICAgIGlmICgqbWFwX3Nsb3QgPT0gTlVMTCkgewotICAgICAgICAvLyBGaXJzdCB0aW1lIHdlJ3ZlIHNlZW4gdGhpcyBvdXRwdXQgbG9jYXRpb24uCi0gICAgICAgICptYXBfc2xvdCA9IG5ldyBHZW5lcmF0b3JDb250ZXh0SW1wbChwYXJzZWRfZmlsZXMpOwotICAgICAgfQotCi0gICAgICBpZiAoIUdlbmVyYXRlT3V0cHV0KHBhcnNlZF9maWxlcywgb3V0cHV0X2RpcmVjdGl2ZXNfW2ldLCAqbWFwX3Nsb3QpKSB7Ci0gICAgICAgIFNUTERlbGV0ZVZhbHVlcygmb3V0cHV0X2RpcmVjdG9yaWVzKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGUgYWxsIG91dHB1dCB0byBkaXNrLgotICBmb3IgKEdlbmVyYXRvckNvbnRleHRNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBvdXRwdXRfZGlyZWN0b3JpZXMuYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IG91dHB1dF9kaXJlY3Rvcmllcy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgY29uc3Qgc3RyaW5nJiBsb2NhdGlvbiA9IGl0ZXItPmZpcnN0OwotICAgIEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnkgPSBpdGVyLT5zZWNvbmQ7Ci0gICAgaWYgKEhhc1N1ZmZpeFN0cmluZyhsb2NhdGlvbiwgIi8iKSkgewotICAgICAgaWYgKCFkaXJlY3RvcnktPldyaXRlQWxsVG9EaXNrKGxvY2F0aW9uKSkgewotICAgICAgICBTVExEZWxldGVWYWx1ZXMoJm91dHB1dF9kaXJlY3Rvcmllcyk7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoSGFzU3VmZml4U3RyaW5nKGxvY2F0aW9uLCAiLmphciIpKSB7Ci0gICAgICAgIGRpcmVjdG9yeS0+QWRkSmFyTWFuaWZlc3QoKTsKLSAgICAgIH0KLQotICAgICAgaWYgKCFkaXJlY3RvcnktPldyaXRlQWxsVG9aaXAobG9jYXRpb24pKSB7Ci0gICAgICAgIFNUTERlbGV0ZVZhbHVlcygmb3V0cHV0X2RpcmVjdG9yaWVzKTsKLSAgICAgICAgcmV0dXJuIDE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFkZXBlbmRlbmN5X291dF9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgaWYgKCFHZW5lcmF0ZURlcGVuZGVuY3lNYW5pZmVzdEZpbGUocGFyc2VkX2ZpbGVzLCBvdXRwdXRfZGlyZWN0b3JpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNvdXJjZV90cmVlKSkgewotICAgICAgcmV0dXJuIDE7Ci0gICAgfQotICB9Ci0KLSAgU1RMRGVsZXRlVmFsdWVzKCZvdXRwdXRfZGlyZWN0b3JpZXMpOwotCi0gIGlmICghZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgewotICAgIGlmICghV3JpdGVEZXNjcmlwdG9yU2V0KHBhcnNlZF9maWxlcykpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSB8fCBtb2RlXyA9PSBNT0RFX0RFQ09ERSkgewotICAgIGlmIChjb2RlY190eXBlXy5lbXB0eSgpKSB7Ci0gICAgICAvLyBIQUNLOiAgRGVmaW5lIGFuIEVtcHR5TWVzc2FnZSB0eXBlIHRvIHVzZSBmb3IgZGVjb2RpbmcuCi0gICAgICBEZXNjcmlwdG9yUG9vbCBwb29sOwotICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgICAgZmlsZS5zZXRfbmFtZSgiZW1wdHlfbWVzc2FnZS5wcm90byIpOwotICAgICAgZmlsZS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJFbXB0eU1lc3NhZ2UiKTsKLSAgICAgIEdPT0dMRV9DSEVDSyhwb29sLkJ1aWxkRmlsZShmaWxlKSAhPSBOVUxMKTsKLSAgICAgIGNvZGVjX3R5cGVfID0gIkVtcHR5TWVzc2FnZSI7Ci0gICAgICBpZiAoIUVuY29kZU9yRGVjb2RlKCZwb29sKSkgewotICAgICAgICByZXR1cm4gMTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKCFFbmNvZGVPckRlY29kZShpbXBvcnRlci5wb29sKCkpKSB7Ci0gICAgICAgIHJldHVybiAxOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChtb2RlXyA9PSBNT0RFX1BSSU5UKSB7Ci0gICAgc3dpdGNoIChwcmludF9tb2RlXykgewotICAgICAgY2FzZSBQUklOVF9GUkVFX0ZJRUxEUzoKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyArK2kpIHsKLSAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmQgPSBwYXJzZWRfZmlsZXNbaV07Ci0gICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBmZC0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraikgewotICAgICAgICAgICAgUHJpbnRGcmVlRmllbGROdW1iZXJzKGZkLT5tZXNzYWdlX3R5cGUoaikpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgUFJJTlRfTk9ORToKLSAgICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIklmIHRoZSBjb2RlIHJlYWNoZXMgaGVyZSwgaXQgdXN1YWxseSBtZWFucyBhIGJ1ZyBvZiAiCi0gICAgICAgICAgICAgICAgICAgICAiZmxhZyBwYXJzaW5nIGluIHRoZSBDb21tb25hZExpbmVJbnRlcmZhY2UuIjsKLSAgICAgICAgcmV0dXJuIDE7Ci0KLSAgICAgIC8vIERvIG5vdCBhZGQgYSBkZWZhdWx0IGNhc2UuCi0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLXZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OkNsZWFyKCkgewotICAvLyBDbGVhciBhbGwgbWVtYmVycyB0aGF0IGFyZSBzZXQgYnkgUnVuKCkuICBOb3RlIHRoYXQgd2UgbXVzdCBub3QgY2xlYXIKLSAgLy8gbWVtYmVycyB3aGljaCBhcmUgc2V0IGJ5IG90aGVyIG1ldGhvZHMgYmVmb3JlIFJ1bigpIGlzIGNhbGxlZC4KLSAgZXhlY3V0YWJsZV9uYW1lXy5jbGVhcigpOwotICBwcm90b19wYXRoXy5jbGVhcigpOwotICBpbnB1dF9maWxlc18uY2xlYXIoKTsKLSAgb3V0cHV0X2RpcmVjdGl2ZXNfLmNsZWFyKCk7Ci0gIGNvZGVjX3R5cGVfLmNsZWFyKCk7Ci0gIGRlc2NyaXB0b3Jfc2V0X25hbWVfLmNsZWFyKCk7Ci0gIGRlcGVuZGVuY3lfb3V0X25hbWVfLmNsZWFyKCk7Ci0KLSAgbW9kZV8gPSBNT0RFX0NPTVBJTEU7Ci0gIHByaW50X21vZGVfID0gUFJJTlRfTk9ORTsKLSAgaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8gPSBmYWxzZTsKLSAgc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfID0gZmFsc2U7Ci0gIGRpc2FsbG93X3NlcnZpY2VzXyA9IGZhbHNlOwotfQotCi1ib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpNYWtlSW5wdXRzQmVQcm90b1BhdGhSZWxhdGl2ZSgKLSAgICBEaXNrU291cmNlVHJlZSogc291cmNlX3RyZWUpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dF9maWxlc18uc2l6ZSgpOyBpKyspIHsKLSAgICBzdHJpbmcgdmlydHVhbF9maWxlLCBzaGFkb3dpbmdfZGlza19maWxlOwotICAgIHN3aXRjaCAoc291cmNlX3RyZWUtPkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKLSAgICAgICAgaW5wdXRfZmlsZXNfW2ldLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpIHsKLSAgICAgIGNhc2UgRGlza1NvdXJjZVRyZWU6OlNVQ0NFU1M6Ci0gICAgICAgIGlucHV0X2ZpbGVzX1tpXSA9IHZpcnR1YWxfZmlsZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpTSEFET1dFRDoKLSAgICAgICAgc3RkOjpjZXJyIDw8IGlucHV0X2ZpbGVzX1tpXQotICAgICAgICAgICAgICAgICAgPDwgIjogSW5wdXQgaXMgc2hhZG93ZWQgaW4gdGhlIC0tcHJvdG9fcGF0aCBieSBcIiIKLSAgICAgICAgICAgICAgICAgIDw8IHNoYWRvd2luZ19kaXNrX2ZpbGUKLSAgICAgICAgICAgICAgICAgIDw8ICJcIi4gIEVpdGhlciB1c2UgdGhlIGxhdHRlciBmaWxlIGFzIHlvdXIgaW5wdXQgb3IgcmVvcmRlciAiCi0gICAgICAgICAgICAgICAgICAgICAidGhlIC0tcHJvdG9fcGF0aCBzbyB0aGF0IHRoZSBmb3JtZXIgZmlsZSdzIGxvY2F0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICJjb21lcyBmaXJzdC4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgY2FzZSBEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU46Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCBpbnB1dF9maWxlc19baV0gPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HOgotICAgICAgICAvLyBGaXJzdCBjaGVjayBpZiB0aGUgZmlsZSBleGlzdHMgYXQgYWxsLgotICAgICAgICBpZiAoYWNjZXNzKGlucHV0X2ZpbGVzX1tpXS5jX3N0cigpLCBGX09LKSA8IDApIHsKLSAgICAgICAgICAvLyBGaWxlIGRvZXMgbm90IGV2ZW4gZXhpc3QuCi0gICAgICAgICAgc3RkOjpjZXJyIDw8IGlucHV0X2ZpbGVzX1tpXSA8PCAiOiAiIDw8IHN0cmVycm9yKEVOT0VOVCkgPDwgc3RkOjplbmRsOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHN0ZDo6Y2VycgotICAgICAgICAgICAgICA8PCBpbnB1dF9maWxlc19baV0KLSAgICAgICAgICAgICAgPDwgIjogRmlsZSBkb2VzIG5vdCByZXNpZGUgd2l0aGluIGFueSBwYXRoICIKLSAgICAgICAgICAgICAgICAgInNwZWNpZmllZCB1c2luZyAtLXByb3RvX3BhdGggKG9yIC1JKS4gIFlvdSBtdXN0IHNwZWNpZnkgYSAiCi0gICAgICAgICAgICAgICAgICItLXByb3RvX3BhdGggd2hpY2ggZW5jb21wYXNzZXMgdGhpcyBmaWxlLiAgTm90ZSB0aGF0IHRoZSAiCi0gICAgICAgICAgICAgICAgICJwcm90b19wYXRoIG11c3QgYmUgYW4gZXhhY3QgcHJlZml4IG9mIHRoZSAucHJvdG8gZmlsZSAiCi0gICAgICAgICAgICAgICAgICJuYW1lcyAtLSBwcm90b2MgaXMgdG9vIGR1bWIgdG8gZmlndXJlIG91dCB3aGVuIHR3byBwYXRocyAiCi0gICAgICAgICAgICAgICAgICIoZS5nLiBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUpIGFyZSBlcXVpdmFsZW50IChpdCdzIGhhcmRlciAiCi0gICAgICAgICAgICAgICAgICJ0aGFuIHlvdSB0aGluaykuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0KLUNvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50U3RhdHVzCi1Db21tYW5kTGluZUludGVyZmFjZTo6UGFyc2VBcmd1bWVudHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkgewotICBleGVjdXRhYmxlX25hbWVfID0gYXJndlswXTsKLQotICB2ZWN0b3I8c3RyaW5nPiBhcmd1bWVudHM7Ci0gIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7Ci0gICAgYXJndW1lbnRzLnB1c2hfYmFjayhhcmd2W2ldKTsKLSAgfQotCi0gIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYXJndW1lbnRzIGFuZCBwYXJzZSB0aGVtLgotICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7ICsraSkgewotICAgIHN0cmluZyBuYW1lLCB2YWx1ZTsKLQotICAgIGlmIChQYXJzZUFyZ3VtZW50KGFyZ3VtZW50c1tpXS5jX3N0cigpLCAmbmFtZSwgJnZhbHVlKSkgewotICAgICAgLy8gUmV0dXJuZWQgdHJ1ZSA9PiBVc2UgdGhlIG5leHQgYXJndW1lbnQgYXMgdGhlIGZsYWcgdmFsdWUuCi0gICAgICBpZiAoaSArIDEgPT0gYXJndW1lbnRzLnNpemUoKSB8fCBhcmd1bWVudHNbaSArIDFdWzBdID09ICctJykgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIk1pc3NpbmcgdmFsdWUgZm9yIGZsYWc6ICIgPDwgbmFtZSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIGlmIChuYW1lID09ICItLWRlY29kZSIpIHsKLSAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlRvIGRlY29kZSBhbiB1bmtub3duIG1lc3NhZ2UsIHVzZSAtLWRlY29kZV9yYXcuIgotICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICArK2k7Ci0gICAgICAgIHZhbHVlID0gYXJndW1lbnRzW2ldOwotICAgICAgfQotICAgIH0KLQotICAgIFBhcnNlQXJndW1lbnRTdGF0dXMgc3RhdHVzID0gSW50ZXJwcmV0QXJndW1lbnQobmFtZSwgdmFsdWUpOwotICAgIGlmIChzdGF0dXMgIT0gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUUpCi0gICAgICByZXR1cm4gc3RhdHVzOwotICB9Ci0KLSAgLy8gSWYgbm8gLS1wcm90b19wYXRoIHdhcyBnaXZlbiwgdXNlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgotICBpZiAocHJvdG9fcGF0aF8uZW1wdHkoKSkgewotICAgIC8vIERvbid0IHVzZSBtYWtlX3BhaXIgYXMgdGhlIG9sZC9kZWZhdWx0IHN0YW5kYXJkIGxpYnJhcnkgb24gU29sYXJpcwotICAgIC8vIGRvZXNuJ3Qgc3VwcG9ydCBpdCB3aXRob3V0IGV4cGxpY2l0IHRlbXBsYXRlIHBhcmFtZXRlcnMsIHdoaWNoIGFyZQotICAgIC8vIGluY29tcGF0aWJsZSB3aXRoIEMrKzB4J3MgbWFrZV9wYWlyLgotICAgIHByb3RvX3BhdGhfLnB1c2hfYmFjayhwYWlyPHN0cmluZywgc3RyaW5nPigiIiwgIi4iKSk7Ci0gIH0KLQotICAvLyBDaGVjayBzb21lIGVycnJvciBjYXNlcy4KLSAgYm9vbCBkZWNvZGluZ19yYXcgPSAobW9kZV8gPT0gTU9ERV9ERUNPREUpICYmIGNvZGVjX3R5cGVfLmVtcHR5KCk7Ci0gIGlmIChkZWNvZGluZ19yYXcgJiYgIWlucHV0X2ZpbGVzXy5lbXB0eSgpKSB7Ci0gICAgc3RkOjpjZXJyIDw8ICJXaGVuIHVzaW5nIC0tZGVjb2RlX3Jhdywgbm8gaW5wdXQgZmlsZXMgc2hvdWxkIGJlIGdpdmVuLiIKLSAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICB9IGVsc2UgaWYgKCFkZWNvZGluZ19yYXcgJiYgaW5wdXRfZmlsZXNfLmVtcHR5KCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgIk1pc3NpbmcgaW5wdXQgZmlsZS4iIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgfQotICBpZiAobW9kZV8gPT0gTU9ERV9DT01QSUxFICYmIG91dHB1dF9kaXJlY3RpdmVzXy5lbXB0eSgpICYmCi0gICAgICBkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgc3RkOjpjZXJyIDw8ICJNaXNzaW5nIG91dHB1dCBkaXJlY3RpdmVzLiIgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICB9Ci0gIGlmIChtb2RlXyAhPSBNT0RFX0NPTVBJTEUgJiYgIWRlcGVuZGVuY3lfb3V0X25hbWVfLmVtcHR5KCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgIkNhbiBvbmx5IHVzZSAtLWRlcGVuZGVuY3lfb3V0PUZJTEUgd2hlbiBnZW5lcmF0aW5nIGNvZGUuIgotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gIH0KLSAgaWYgKCFkZXBlbmRlbmN5X291dF9uYW1lXy5lbXB0eSgpICYmIGlucHV0X2ZpbGVzXy5zaXplKCkgPiAxKSB7Ci0gICAgc3RkOjpjZXJyCi0gICAgICAgIDw8ICJDYW4gb25seSBwcm9jZXNzIG9uZSBpbnB1dCBmaWxlIHdoZW4gdXNpbmcgLS1kZXBlbmRlbmN5X291dD1GSUxFLiIKLSAgICAgICAgPDwgc3RkOjplbmRsOwotICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICB9Ci0gIGlmIChpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyAmJiBkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgc3RkOjpjZXJyIDw8ICItLWluY2x1ZGVfaW1wb3J0cyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gY29tYmluZWQgd2l0aCAiCi0gICAgICAgICAgICAgICAgICItLWRlc2NyaXB0b3Jfc2V0X291dC4iIDw8IHN0ZDo6ZW5kbDsKLSAgfQotICBpZiAoc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfICYmIGRlc2NyaXB0b3Jfc2V0X25hbWVfLmVtcHR5KCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgIi0taW5jbHVkZV9zb3VyY2VfaW5mbyBvbmx5IG1ha2VzIHNlbnNlIHdoZW4gY29tYmluZWQgd2l0aCAiCi0gICAgICAgICAgICAgICAgICItLWRlc2NyaXB0b3Jfc2V0X291dC4iIDw8IHN0ZDo6ZW5kbDsKLSAgfQotCi0gIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9DT05USU5VRTsKLX0KLQotYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6UGFyc2VBcmd1bWVudChjb25zdCBjaGFyKiBhcmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogbmFtZSwgc3RyaW5nKiB2YWx1ZSkgewotICBib29sIHBhcnNlZF92YWx1ZSA9IGZhbHNlOwotCi0gIGlmIChhcmdbMF0gIT0gJy0nKSB7Ci0gICAgLy8gTm90IGEgZmxhZy4KLSAgICBuYW1lLT5jbGVhcigpOwotICAgIHBhcnNlZF92YWx1ZSA9IHRydWU7Ci0gICAgKnZhbHVlID0gYXJnOwotICB9IGVsc2UgaWYgKGFyZ1sxXSA9PSAnLScpIHsKLSAgICAvLyBUd28gZGFzaGVzOiAgTXVsdGktY2hhcmFjdGVyIG5hbWUsIHdpdGggJz0nIHNlcGFyYXRpbmcgbmFtZSBhbmQKLSAgICAvLyAgIHZhbHVlLgotICAgIGNvbnN0IGNoYXIqIGVxdWFsc19wb3MgPSBzdHJjaHIoYXJnLCAnPScpOwotICAgIGlmIChlcXVhbHNfcG9zICE9IE5VTEwpIHsKLSAgICAgICpuYW1lID0gc3RyaW5nKGFyZywgZXF1YWxzX3BvcyAtIGFyZyk7Ci0gICAgICAqdmFsdWUgPSBlcXVhbHNfcG9zICsgMTsKLSAgICAgIHBhcnNlZF92YWx1ZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICpuYW1lID0gYXJnOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBPbmUgZGFzaDogIE9uZS1jaGFyYWN0ZXIgbmFtZSwgYWxsIHN1YnNlcXVlbnQgY2hhcmFjdGVycyBhcmUgdGhlCi0gICAgLy8gICB2YWx1ZS4KLSAgICBpZiAoYXJnWzFdID09ICdcMCcpIHsKLSAgICAgIC8vIGFyZyBpcyBqdXN0ICItIi4gIFdlIHRyZWF0IHRoaXMgYXMgYW4gaW5wdXQgZmlsZSwgZXhjZXB0IHRoYXQgYXQKLSAgICAgIC8vIHByZXNlbnQgdGhpcyB3aWxsIGp1c3QgbGVhZCB0byBhICJmaWxlIG5vdCBmb3VuZCIgZXJyb3IuCi0gICAgICBuYW1lLT5jbGVhcigpOwotICAgICAgKnZhbHVlID0gYXJnOwotICAgICAgcGFyc2VkX3ZhbHVlID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgKm5hbWUgPSBzdHJpbmcoYXJnLCAyKTsKLSAgICAgICp2YWx1ZSA9IGFyZyArIDI7Ci0gICAgICBwYXJzZWRfdmFsdWUgPSAhdmFsdWUtPmVtcHR5KCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTmVlZCB0byByZXR1cm4gdHJ1ZSBpZmYgdGhlIG5leHQgYXJnIHNob3VsZCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSBmb3IgdGhpcwotICAvLyBvbmUsIGZhbHNlIG90aGVyd2lzZS4KLQotICBpZiAocGFyc2VkX3ZhbHVlKSB7Ci0gICAgLy8gV2UgYWxyZWFkeSBwYXJzZWQgYSB2YWx1ZSBmb3IgdGhpcyBmbGFnLgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICgqbmFtZSA9PSAiLWgiIHx8ICpuYW1lID09ICItLWhlbHAiIHx8Ci0gICAgICAqbmFtZSA9PSAiLS1kaXNhbGxvd19zZXJ2aWNlcyIgfHwKLSAgICAgICpuYW1lID09ICItLWluY2x1ZGVfaW1wb3J0cyIgfHwKLSAgICAgICpuYW1lID09ICItLWluY2x1ZGVfc291cmNlX2luZm8iIHx8Ci0gICAgICAqbmFtZSA9PSAiLS12ZXJzaW9uIiB8fAotICAgICAgKm5hbWUgPT0gIi0tZGVjb2RlX3JhdyIgfHwKLSAgICAgICpuYW1lID09ICItLXByaW50X2ZyZWVfZmllbGRfbnVtYmVycyIpIHsKLSAgICAvLyBIQUNLOiAgVGhlc2UgYXJlIHRoZSBvbmx5IGZsYWdzIHRoYXQgZG9uJ3QgdGFrZSBhIHZhbHVlLgotICAgIC8vICAgVGhleSBwcm9iYWJseSBzaG91bGQgbm90IGJlIGhhcmQtY29kZWQgbGlrZSB0aGlzIGJ1dCBmb3Igbm93IGl0J3MKLSAgICAvLyAgIG5vdCB3b3J0aCBkb2luZyBiZXR0ZXIuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gTmV4dCBhcmd1bWVudCBpcyB0aGUgZmxhZyB2YWx1ZS4KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLUNvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50U3RhdHVzCi1Db21tYW5kTGluZUludGVyZmFjZTo6SW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKLSAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgIC8vIE5vdCBhIGZsYWcuICBKdXN0IGEgZmlsZW5hbWUuCi0gICAgaWYgKHZhbHVlLmVtcHR5KCkpIHsKLSAgICAgIHN0ZDo6Y2VycgotICAgICAgICAgIDw8ICJZb3Ugc2VlbSB0byBoYXZlIHBhc3NlZCBhbiBlbXB0eSBzdHJpbmcgYXMgb25lIG9mIHRoZSAiCi0gICAgICAgICAgICAgImFyZ3VtZW50cyB0byAiIDw8IGV4ZWN1dGFibGVfbmFtZV8KLSAgICAgICAgICA8PCAiLiAgVGhpcyBpcyBhY3R1YWxseSAiCi0gICAgICAgICAgICAgInNvcnQgb2YgaGFyZCB0byBkby4gIENvbmdyYXRzLiAgVW5mb3J0dW5hdGVseSBpdCBpcyBub3QgdmFsaWQgIgotICAgICAgICAgICAgICJpbnB1dCBzbyB0aGUgcHJvZ3JhbSBpcyBnb2luZyB0byBkaWUgbm93LiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gICAgfQotCi0gICAgaW5wdXRfZmlsZXNfLnB1c2hfYmFjayh2YWx1ZSk7Ci0KLSAgfSBlbHNlIGlmIChuYW1lID09ICItSSIgfHwgbmFtZSA9PSAiLS1wcm90b19wYXRoIikgewotICAgIC8vIEphdmEncyAtY2xhc3NwYXRoIChhbmQgc29tZSBvdGhlciBsYW5ndWFnZXMpIGRlbGltaXRzIHBhdGggY29tcG9uZW50cwotICAgIC8vIHdpdGggY29sb25zLiAgTGV0J3MgYWNjZXB0IHRoYXQgc3ludGF4IHRvbyBqdXN0IHRvIG1ha2UgdGhpbmdzIG1vcmUKLSAgICAvLyBpbnR1aXRpdmUuCi0gICAgdmVjdG9yPHN0cmluZz4gcGFydHMgPSBTcGxpdCgKLSAgICAgICAgdmFsdWUsIGtQYXRoU2VwYXJhdG9yLCB0cnVlKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHN0cmluZyB2aXJ0dWFsX3BhdGg7Ci0gICAgICBzdHJpbmcgZGlza19wYXRoOwotCi0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBlcXVhbHNfcG9zID0gcGFydHNbaV0uZmluZF9maXJzdF9vZignPScpOwotICAgICAgaWYgKGVxdWFsc19wb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIHZpcnR1YWxfcGF0aCA9ICIiOwotICAgICAgICBkaXNrX3BhdGggPSBwYXJ0c1tpXTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHZpcnR1YWxfcGF0aCA9IHBhcnRzW2ldLnN1YnN0cigwLCBlcXVhbHNfcG9zKTsKLSAgICAgICAgZGlza19wYXRoID0gcGFydHNbaV0uc3Vic3RyKGVxdWFsc19wb3MgKyAxKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGRpc2tfcGF0aC5lbXB0eSgpKSB7Ci0gICAgICAgIHN0ZDo6Y2VycgotICAgICAgICAgICAgPDwgIi0tcHJvdG9fcGF0aCBwYXNzZWQgZW1wdHkgZGlyZWN0b3J5IG5hbWUuICAoVXNlIFwiLlwiIGZvciAiCi0gICAgICAgICAgICAgICAiY3VycmVudCBkaXJlY3RvcnkuKSIgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgICAgIH0KLQotICAgICAgLy8gTWFrZSBzdXJlIGRpc2sgcGF0aCBleGlzdHMsIHdhcm4gb3RoZXJ3aXNlLgotICAgICAgaWYgKGFjY2VzcyhkaXNrX3BhdGguY19zdHIoKSwgRl9PSykgPCAwKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCBkaXNrX3BhdGggPDwgIjogd2FybmluZzogZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiIKLSAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIH0KLQotICAgICAgLy8gRG9uJ3QgdXNlIG1ha2VfcGFpciBhcyB0aGUgb2xkL2RlZmF1bHQgc3RhbmRhcmQgbGlicmFyeSBvbiBTb2xhcmlzCi0gICAgICAvLyBkb2Vzbid0IHN1cHBvcnQgaXQgd2l0aG91dCBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCB3aGljaCBhcmUKLSAgICAgIC8vIGluY29tcGF0aWJsZSB3aXRoIEMrKzB4J3MgbWFrZV9wYWlyLgotICAgICAgcHJvdG9fcGF0aF8ucHVzaF9iYWNrKHBhaXI8c3RyaW5nLCBzdHJpbmc+KHZpcnR1YWxfcGF0aCwgZGlza19wYXRoKSk7Ci0gICAgfQotCi0gIH0gZWxzZSBpZiAobmFtZSA9PSAiLW8iIHx8IG5hbWUgPT0gIi0tZGVzY3JpcHRvcl9zZXRfb3V0IikgewotICAgIGlmICghZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgewotICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICAgIH0KLSAgICBpZiAodmFsdWUuZW1wdHkoKSkgewotICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiByZXF1aXJlcyBhIG5vbi1lbXB0eSB2YWx1ZS4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICAgIH0KLSAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7Ci0gICAgICBzdGQ6OmNlcnIKLSAgICAgICAgICA8PCAiQ2Fubm90IHVzZSAtLWVuY29kZSBvciAtLWRlY29kZSBhbmQgZ2VuZXJhdGUgZGVzY3JpcHRvcnMgYXQgdGhlICIKLSAgICAgICAgICAgICAic2FtZSB0aW1lLiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gICAgfQotICAgIGRlc2NyaXB0b3Jfc2V0X25hbWVfID0gdmFsdWU7Ci0KLSAgfSBlbHNlIGlmIChuYW1lID09ICItLWRlcGVuZGVuY3lfb3V0IikgewotICAgIGlmICghZGVwZW5kZW5jeV9vdXRfbmFtZV8uZW1wdHkoKSkgewotICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICAgIH0KLSAgICBpZiAodmFsdWUuZW1wdHkoKSkgewotICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiByZXF1aXJlcyBhIG5vbi1lbXB0eSB2YWx1ZS4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICAgIH0KLSAgICBkZXBlbmRlbmN5X291dF9uYW1lXyA9IHZhbHVlOwotCi0gIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1pbmNsdWRlX2ltcG9ydHMiKSB7Ci0gICAgaWYgKGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gICAgfQotICAgIGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfID0gdHJ1ZTsKLQotICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0taW5jbHVkZV9zb3VyY2VfaW5mbyIpIHsKLSAgICBpZiAoc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gICAgfQotICAgIHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XyA9IHRydWU7Ci0KLSAgfSBlbHNlIGlmIChuYW1lID09ICItaCIgfHwgbmFtZSA9PSAiLS1oZWxwIikgewotICAgIFByaW50SGVscFRleHQoKTsKLSAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfRVhJVDsgIC8vIEV4aXQgd2l0aG91dCBydW5uaW5nIGNvbXBpbGVyLgotCi0gIH0gZWxzZSBpZiAobmFtZSA9PSAiLS12ZXJzaW9uIikgewotICAgIGlmICghdmVyc2lvbl9pbmZvXy5lbXB0eSgpKSB7Ci0gICAgICBzdGQ6OmNvdXQgPDwgdmVyc2lvbl9pbmZvXyA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICAgIGNvdXQgPDwgImxpYnByb3RvYyAiCi0gICAgICAgICA8PCBwcm90b2J1Zjo6aW50ZXJuYWw6OlZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pCi0gICAgICAgICA8PCBlbmRsOwotICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9FWElUOyAgLy8gRXhpdCB3aXRob3V0IHJ1bm5pbmcgY29tcGlsZXIuCi0KLSAgfSBlbHNlIGlmIChuYW1lID09ICItLWRpc2FsbG93X3NlcnZpY2VzIikgewotICAgIGRpc2FsbG93X3NlcnZpY2VzXyA9IHRydWU7Ci0KLSAgfSBlbHNlIGlmIChuYW1lID09ICItLWVuY29kZSIgfHwgbmFtZSA9PSAiLS1kZWNvZGUiIHx8Ci0gICAgICAgICAgICAgbmFtZSA9PSAiLS1kZWNvZGVfcmF3IikgewotICAgIGlmIChtb2RlXyAhPSBNT0RFX0NPTVBJTEUpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiT25seSBvbmUgb2YgLS1lbmNvZGUgYW5kIC0tZGVjb2RlIGNhbiBiZSBzcGVjaWZpZWQuIgotICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICAgIH0KLSAgICBpZiAoIW91dHB1dF9kaXJlY3RpdmVzXy5lbXB0eSgpIHx8ICFkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIkNhbm5vdCB1c2UgIiA8PCBuYW1lCi0gICAgICAgICAgICAgICAgPDwgIiBhbmQgZ2VuZXJhdGUgY29kZSBvciBkZXNjcmlwdG9ycyBhdCB0aGUgc2FtZSB0aW1lLiIKLSAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgICB9Ci0KLSAgICBtb2RlXyA9IChuYW1lID09ICItLWVuY29kZSIpID8gTU9ERV9FTkNPREUgOiBNT0RFX0RFQ09ERTsKLQotICAgIGlmICh2YWx1ZS5lbXB0eSgpICYmIG5hbWUgIT0gIi0tZGVjb2RlX3JhdyIpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiVHlwZSBuYW1lIGZvciAiIDw8IG5hbWUgPDwgIiBjYW5ub3QgYmUgYmxhbmsuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICBpZiAobmFtZSA9PSAiLS1kZWNvZGUiKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiVG8gZGVjb2RlIGFuIHVua25vd24gbWVzc2FnZSwgdXNlIC0tZGVjb2RlX3Jhdy4iCi0gICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgICB9IGVsc2UgaWYgKCF2YWx1ZS5lbXB0eSgpICYmIG5hbWUgPT0gIi0tZGVjb2RlX3JhdyIpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiLS1kZWNvZGVfcmF3IGRvZXMgbm90IHRha2UgYSBwYXJhbWV0ZXIuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgICB9Ci0KLSAgICBjb2RlY190eXBlXyA9IHZhbHVlOwotCi0gIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1lcnJvcl9mb3JtYXQiKSB7Ci0gICAgaWYgKHZhbHVlID09ICJnY2MiKSB7Ci0gICAgICBlcnJvcl9mb3JtYXRfID0gRVJST1JfRk9STUFUX0dDQzsKLSAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJtc3ZzIikgewotICAgICAgZXJyb3JfZm9ybWF0XyA9IEVSUk9SX0ZPUk1BVF9NU1ZTOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIlVua25vd24gZXJyb3IgZm9ybWF0OiAiIDw8IHZhbHVlIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwotICAgIH0KLQotICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tcGx1Z2luIikgewotICAgIGlmIChwbHVnaW5fcHJlZml4Xy5lbXB0eSgpKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIlRoaXMgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBwbHVnaW5zLiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gICAgfQotCi0gICAgc3RyaW5nIHBsdWdpbl9uYW1lOwotICAgIHN0cmluZyBwYXRoOwotCi0gICAgc3RyaW5nOjpzaXplX3R5cGUgZXF1YWxzX3BvcyA9IHZhbHVlLmZpbmRfZmlyc3Rfb2YoJz0nKTsKLSAgICBpZiAoZXF1YWxzX3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIC8vIFVzZSB0aGUgYmFzZW5hbWUgb2YgdGhlIGZpbGUuCi0gICAgICBzdHJpbmc6OnNpemVfdHlwZSBzbGFzaF9wb3MgPSB2YWx1ZS5maW5kX2xhc3Rfb2YoJy8nKTsKLSAgICAgIGlmIChzbGFzaF9wb3MgPT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgICAgIHBsdWdpbl9uYW1lID0gdmFsdWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwbHVnaW5fbmFtZSA9IHZhbHVlLnN1YnN0cihzbGFzaF9wb3MgKyAxKTsKLSAgICAgIH0KLSAgICAgIHBhdGggPSB2YWx1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcGx1Z2luX25hbWUgPSB2YWx1ZS5zdWJzdHIoMCwgZXF1YWxzX3Bvcyk7Ci0gICAgICBwYXRoID0gdmFsdWUuc3Vic3RyKGVxdWFsc19wb3MgKyAxKTsKLSAgICB9Ci0KLSAgICBwbHVnaW5zX1twbHVnaW5fbmFtZV0gPSBwYXRoOwotCi0gIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMiKSB7Ci0gICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgewotICAgICAgc3RkOjpjZXJyIDw8ICJDYW5ub3QgdXNlICIgPDwgbmFtZQotICAgICAgICAgICAgICAgIDw8ICIgYW5kIHVzZSAtLWVuY29kZSwgLS1kZWNvZGUgb3IgcHJpbnQgIgotICAgICAgICAgICAgICAgIDw8ICJvdGhlciBpbmZvIGF0IHRoZSBzYW1lIHRpbWUuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgICB9Ci0gICAgaWYgKCFvdXRwdXRfZGlyZWN0aXZlc18uZW1wdHkoKSB8fCAhZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgewotICAgICAgc3RkOjpjZXJyIDw8ICJDYW5ub3QgdXNlICIgPDwgbmFtZQotICAgICAgICAgICAgICAgIDw8ICIgYW5kIGdlbmVyYXRlIGNvZGUgb3IgZGVzY3JpcHRvcnMgYXQgdGhlIHNhbWUgdGltZS4iCi0gICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7Ci0gICAgfQotICAgIG1vZGVfID0gTU9ERV9QUklOVDsKLSAgICBwcmludF9tb2RlXyA9IFBSSU5UX0ZSRUVfRklFTERTOwotICB9IGVsc2UgewotICAgIC8vIFNvbWUgb3RoZXIgZmxhZy4gIExvb2sgaXQgdXAgaW4gdGhlIGdlbmVyYXRvcnMgbGlzdC4KLSAgICBjb25zdCBHZW5lcmF0b3JJbmZvKiBnZW5lcmF0b3JfaW5mbyA9Ci0gICAgICAgIEZpbmRPck51bGwoZ2VuZXJhdG9yc19ieV9mbGFnX25hbWVfLCBuYW1lKTsKLSAgICBpZiAoZ2VuZXJhdG9yX2luZm8gPT0gTlVMTCAmJgotICAgICAgICAocGx1Z2luX3ByZWZpeF8uZW1wdHkoKSB8fCAhSGFzU3VmZml4U3RyaW5nKG5hbWUsICJfb3V0IikpKSB7Ci0gICAgICAvLyBDaGVjayBpZiBpdCdzIGEgZ2VuZXJhdG9yIG9wdGlvbiBmbGFnLgotICAgICAgZ2VuZXJhdG9yX2luZm8gPSBGaW5kT3JOdWxsKGdlbmVyYXRvcnNfYnlfb3B0aW9uX25hbWVfLCBuYW1lKTsKLSAgICAgIGlmIChnZW5lcmF0b3JfaW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBmbGFnOiAiIDw8IG5hbWUgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cmluZyogcGFyYW1ldGVycyA9ICZnZW5lcmF0b3JfcGFyYW1ldGVyc19bZ2VuZXJhdG9yX2luZm8tPmZsYWdfbmFtZV07Ci0gICAgICAgIGlmICghcGFyYW1ldGVycy0+ZW1wdHkoKSkgewotICAgICAgICAgIHBhcmFtZXRlcnMtPmFwcGVuZCgiLCIpOwotICAgICAgICB9Ci0gICAgICAgIHBhcmFtZXRlcnMtPmFwcGVuZCh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIEl0J3MgYW4gb3V0cHV0IGZsYWcuICBBZGQgaXQgdG8gdGhlIG91dHB1dCBkaXJlY3RpdmVzLgotICAgICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIkNhbm5vdCB1c2UgLS1lbmNvZGUsIC0tZGVjb2RlIG9yIHByaW50IC5wcm90byBpbmZvIGFuZCAiCi0gICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGUgY29kZSBhdCB0aGUgc2FtZSB0aW1lLiIgPDwgc3RkOjplbmRsOwotICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKLSAgICAgIH0KLQotICAgICAgT3V0cHV0RGlyZWN0aXZlIGRpcmVjdGl2ZTsKLSAgICAgIGRpcmVjdGl2ZS5uYW1lID0gbmFtZTsKLSAgICAgIGlmIChnZW5lcmF0b3JfaW5mbyA9PSBOVUxMKSB7Ci0gICAgICAgIGRpcmVjdGl2ZS5nZW5lcmF0b3IgPSBOVUxMOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGlyZWN0aXZlLmdlbmVyYXRvciA9IGdlbmVyYXRvcl9pbmZvLT5nZW5lcmF0b3I7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFNwbGl0IHZhbHVlIGF0ICc6JyB0byBzZXBhcmF0ZSB0aGUgZ2VuZXJhdG9yIHBhcmFtZXRlciBmcm9tIHRoZQotICAgICAgLy8gZmlsZW5hbWUuICBIb3dldmVyLCBhdm9pZCBkb2luZyB0aGlzIGlmIHRoZSBjb2xvbiBpcyBwYXJ0IG9mIGEgdmFsaWQKLSAgICAgIC8vIFdpbmRvd3Mtc3R5bGUgYWJzb2x1dGUgcGF0aC4KLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIGNvbG9uX3BvcyA9IHZhbHVlLmZpbmRfZmlyc3Rfb2YoJzonKTsKLSAgICAgIGlmIChjb2xvbl9wb3MgPT0gc3RyaW5nOjpucG9zIHx8IElzV2luZG93c0Fic29sdXRlUGF0aCh2YWx1ZSkpIHsKLSAgICAgICAgZGlyZWN0aXZlLm91dHB1dF9sb2NhdGlvbiA9IHZhbHVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZGlyZWN0aXZlLnBhcmFtZXRlciA9IHZhbHVlLnN1YnN0cigwLCBjb2xvbl9wb3MpOwotICAgICAgICBkaXJlY3RpdmUub3V0cHV0X2xvY2F0aW9uID0gdmFsdWUuc3Vic3RyKGNvbG9uX3BvcyArIDEpOwotICAgICAgfQotCi0gICAgICBvdXRwdXRfZGlyZWN0aXZlc18ucHVzaF9iYWNrKGRpcmVjdGl2ZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0NPTlRJTlVFOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpQcmludEhlbHBUZXh0KCkgewotICAvLyBTb3JyeSBmb3IgaW5kZW50YXRpb24gaGVyZTsgbGluZSB3cmFwcGluZyB3b3VsZCBiZSB1Z2xpZXIuCi0gIHN0ZDo6Y2VyciA8PAotIlVzYWdlOiAiIDw8IGV4ZWN1dGFibGVfbmFtZV8gPDwgIiBbT1BUSU9OXSBQUk9UT19GSUxFU1xuIgotIlBhcnNlIFBST1RPX0ZJTEVTIGFuZCBnZW5lcmF0ZSBvdXRwdXQgYmFzZWQgb24gdGhlIG9wdGlvbnMgZ2l2ZW46XG4iCi0iICAtSVBBVEgsIC0tcHJvdG9fcGF0aD1QQVRIICAgU3BlY2lmeSB0aGUgZGlyZWN0b3J5IGluIHdoaWNoIHRvIHNlYXJjaCBmb3JcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbXBvcnRzLiAgTWF5IGJlIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcztcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcmllcyB3aWxsIGJlIHNlYXJjaGVkIGluIG9yZGVyLiAgSWYgbm90XG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4sIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5IGlzIHVzZWQuXG4iCi0iICAtLXZlcnNpb24gICAgICAgICAgICAgICAgICAgU2hvdyB2ZXJzaW9uIGluZm8gYW5kIGV4aXQuXG4iCi0iICAtaCwgLS1oZWxwICAgICAgICAgICAgICAgICAgU2hvdyB0aGlzIHRleHQgYW5kIGV4aXQuXG4iCi0iICAtLWVuY29kZT1NRVNTQUdFX1RZUEUgICAgICAgUmVhZCBhIHRleHQtZm9ybWF0IG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGVcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcm9tIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZSBpdCBpbiBiaW5hcnlcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFuZGFyZCBvdXRwdXQuICBUaGUgbWVzc2FnZSB0eXBlIG11c3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBkZWZpbmVkIGluIFBST1RPX0ZJTEVTIG9yIHRoZWlyIGltcG9ydHMuXG4iCi0iICAtLWRlY29kZT1NRVNTQUdFX1RZUEUgICAgICAgUmVhZCBhIGJpbmFyeSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb21cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGUgaXQgaW4gdGV4dCBmb3JtYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBzdGFuZGFyZCBvdXRwdXQuICBUaGUgbWVzc2FnZSB0eXBlIG11c3RcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiZSBkZWZpbmVkIGluIFBST1RPX0ZJTEVTIG9yIHRoZWlyIGltcG9ydHMuXG4iCi0iICAtLWRlY29kZV9yYXcgICAgICAgICAgICAgICAgUmVhZCBhbiBhcmJpdHJhcnkgcHJvdG9jb2wgbWVzc2FnZSBmcm9tXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlIHRoZSByYXcgdGFnL3ZhbHVlXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcnMgaW4gdGV4dCBmb3JtYXQgdG8gc3RhbmRhcmQgb3V0cHV0LiAgTm9cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQUk9UT19GSUxFUyBzaG91bGQgYmUgZ2l2ZW4gd2hlbiB1c2luZyB0aGlzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5cbiIKLSIgIC1vRklMRSwgICAgICAgICAgICAgICAgICAgICBXcml0ZXMgYSBGaWxlRGVzY3JpcHRvclNldCAoYSBwcm90b2NvbCBidWZmZXIsXG4iCi0iICAgIC0tZGVzY3JpcHRvcl9zZXRfb3V0PUZJTEUgZGVmaW5lZCBpbiBkZXNjcmlwdG9yLnByb3RvKSBjb250YWluaW5nIGFsbCBvZlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBpbnB1dCBmaWxlcyB0byBGSUxFLlxuIgotIiAgLS1pbmNsdWRlX2ltcG9ydHMgICAgICAgICAgIFdoZW4gdXNpbmcgLS1kZXNjcmlwdG9yX3NldF9vdXQsIGFsc28gaW5jbHVkZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbCBkZXBlbmRlbmNpZXMgb2YgdGhlIGlucHV0IGZpbGVzIGluIHRoZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCwgc28gdGhhdCB0aGUgc2V0IGlzIHNlbGYtY29udGFpbmVkLlxuIgotIiAgLS1pbmNsdWRlX3NvdXJjZV9pbmZvICAgICAgIFdoZW4gdXNpbmcgLS1kZXNjcmlwdG9yX3NldF9vdXQsIGRvIG5vdCBzdHJpcFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUNvZGVJbmZvIGZyb20gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGhpcyByZXN1bHRzIGluIHZhc3RseSBsYXJnZXIgZGVzY3JpcHRvcnMgdGhhdFxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGUgaW5mb3JtYXRpb24gYWJvdXQgdGhlIG9yaWdpbmFsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24gb2YgZWFjaCBkZWNsIGluIHRoZSBzb3VyY2UgZmlsZSBhc1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdlbGwgYXMgc3Vycm91bmRpbmcgY29tbWVudHMuXG4iCi0iICAtLWRlcGVuZGVuY3lfb3V0PUZJTEUgICAgICAgV3JpdGUgYSBkZXBlbmRlbmN5IG91dHB1dCBmaWxlIGluIHRoZSBmb3JtYXRcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHBlY3RlZCBieSBtYWtlLiBUaGlzIHdyaXRlcyB0aGUgdHJhbnNpdGl2ZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCBvZiBpbnB1dCBmaWxlIHBhdGhzIHRvIEZJTEVcbiIKLSIgIC0tZXJyb3JfZm9ybWF0PUZPUk1BVCAgICAgICBTZXQgdGhlIGZvcm1hdCBpbiB3aGljaCB0byBwcmludCBlcnJvcnMuXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRk9STUFUIG1heSBiZSAnZ2NjJyAodGhlIGRlZmF1bHQpIG9yICdtc3ZzJ1xuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBmb3JtYXQpLlxuIgotIiAgLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMgIFByaW50IHRoZSBmcmVlIGZpZWxkIG51bWJlcnMgb2YgdGhlIG1lc3NhZ2VzXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gcHJvdG8gZmlsZXMuIEdyb3VwcyBzaGFyZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGZpZWxkIG51bWJlciBzcGFjZSB3aXRoIHRoZSBwYXJlbnQgXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS4gRXh0ZW5zaW9uIHJhbmdlcyBhcmUgY291bnRlZCBhcyBcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cGllZCBmaWVsZHMgbnVtYmVycy5cbiIKLSAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgaWYgKCFwbHVnaW5fcHJlZml4Xy5lbXB0eSgpKSB7Ci0gICAgc3RkOjpjZXJyIDw8Ci0iICAtLXBsdWdpbj1FWEVDVVRBQkxFICAgICAgICAgU3BlY2lmaWVzIGEgcGx1Z2luIGV4ZWN1dGFibGUgdG8gdXNlLlxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5vcm1hbGx5LCBwcm90b2Mgc2VhcmNoZXMgdGhlIFBBVEggZm9yXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGx1Z2lucywgYnV0IHlvdSBtYXkgc3BlY2lmeSBhZGRpdGlvbmFsXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXhlY3V0YWJsZXMgbm90IGluIHRoZSBwYXRoIHVzaW5nIHRoaXMgZmxhZy5cbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBZGRpdGlvbmFsbHksIEVYRUNVVEFCTEUgbWF5IGJlIG9mIHRoZSBmb3JtXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTkFNRT1QQVRILCBpbiB3aGljaCBjYXNlIHRoZSBnaXZlbiBwbHVnaW4gbmFtZVxuIgotIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzIG1hcHBlZCB0byB0aGUgZ2l2ZW4gZXhlY3V0YWJsZSBldmVuIGlmXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhlIGV4ZWN1dGFibGUncyBvd24gbmFtZSBkaWZmZXJzLiIgPDwgc3RkOjplbmRsOwotICB9Ci0KLSAgZm9yIChHZW5lcmF0b3JNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV8uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgLy8gRklYTUUoa2VudG9uKTogIElmIHRoZSB0ZXh0IGlzIGxvbmcgZW5vdWdoIGl0IHdpbGwgd3JhcCwgd2hpY2ggaXMgdWdseSwKLSAgICAvLyAgIGJ1dCBmaXhpbmcgdGhpcyBuaWNlbHkgKGUuZy4gc3BsaXR0aW5nIG9uIHNwYWNlcykgaXMgcHJvYmFibHkgbW9yZQotICAgIC8vICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguCi0gICAgc3RkOjpjZXJyIDw8ICIgICIgPDwgaXRlci0+Zmlyc3QgPDwgIj1PVVRfRElSICIKLSAgICAgICAgICAgICAgPDwgc3RyaW5nKDE5IC0gaXRlci0+Zmlyc3Quc2l6ZSgpLCAnICcpICAvLyBTcGFjZXMgZm9yIGFsaWdubWVudC4KLSAgICAgICAgICAgICAgPDwgaXRlci0+c2Vjb25kLmhlbHBfdGV4dCA8PCBzdGQ6OmVuZGw7Ci0gIH0KLX0KLQotYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdGVPdXRwdXQoCi0gICAgY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcywKLSAgICBjb25zdCBPdXRwdXREaXJlY3RpdmUmIG91dHB1dF9kaXJlY3RpdmUsCi0gICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQpIHsKLSAgLy8gQ2FsbCB0aGUgZ2VuZXJhdG9yLgotICBzdHJpbmcgZXJyb3I7Ci0gIGlmIChvdXRwdXRfZGlyZWN0aXZlLmdlbmVyYXRvciA9PSBOVUxMKSB7Ci0gICAgLy8gVGhpcyBpcyBhIHBsdWdpbi4KLSAgICBHT09HTEVfQ0hFQ0soSGFzUHJlZml4U3RyaW5nKG91dHB1dF9kaXJlY3RpdmUubmFtZSwgIi0tIikgJiYKLSAgICAgICAgICBIYXNTdWZmaXhTdHJpbmcob3V0cHV0X2RpcmVjdGl2ZS5uYW1lLCAiX291dCIpKQotICAgICAgICA8PCAiQmFkIG5hbWUgZm9yIHBsdWdpbiBnZW5lcmF0b3I6ICIgPDwgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lOwotCi0gICAgLy8gU3RyaXAgdGhlICItLSIgYW5kICJfb3V0IiBhbmQgYWRkIHRoZSBwbHVnaW4gcHJlZml4LgotICAgIHN0cmluZyBwbHVnaW5fbmFtZSA9IHBsdWdpbl9wcmVmaXhfICsgImdlbi0iICsKLSAgICAgICAgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lLnN1YnN0cigyLCBvdXRwdXRfZGlyZWN0aXZlLm5hbWUuc2l6ZSgpIC0gNik7Ci0KLSAgICBpZiAoIUdlbmVyYXRlUGx1Z2luT3V0cHV0KHBhcnNlZF9maWxlcywgcGx1Z2luX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfZGlyZWN0aXZlLnBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LCAmZXJyb3IpKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lIDw8ICI6ICIgPDwgZXJyb3IgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBSZWd1bGFyIGdlbmVyYXRvci4KLSAgICBzdHJpbmcgcGFyYW1ldGVycyA9IG91dHB1dF9kaXJlY3RpdmUucGFyYW1ldGVyOwotICAgIGlmICghZ2VuZXJhdG9yX3BhcmFtZXRlcnNfW291dHB1dF9kaXJlY3RpdmUubmFtZV0uZW1wdHkoKSkgewotICAgICAgaWYgKCFwYXJhbWV0ZXJzLmVtcHR5KCkpIHsKLSAgICAgICAgcGFyYW1ldGVycy5hcHBlbmQoIiwiKTsKLSAgICAgIH0KLSAgICAgIHBhcmFtZXRlcnMuYXBwZW5kKGdlbmVyYXRvcl9wYXJhbWV0ZXJzX1tvdXRwdXRfZGlyZWN0aXZlLm5hbWVdKTsKLSAgICB9Ci0gICAgaWYgKG91dHB1dF9kaXJlY3RpdmUuZ2VuZXJhdG9yLT5IYXNHZW5lcmF0ZUFsbCgpKSB7Ci0gICAgICBpZiAoIW91dHB1dF9kaXJlY3RpdmUuZ2VuZXJhdG9yLT5HZW5lcmF0ZUFsbCgKLSAgICAgICAgICBwYXJzZWRfZmlsZXMsIHBhcmFtZXRlcnMsIGdlbmVyYXRvcl9jb250ZXh0LCAmZXJyb3IpKSB7Ci0gICAgICAgICAgLy8gR2VuZXJhdG9yIHJldHVybmVkIGFuIGVycm9yLgotICAgICAgICAgIHN0ZDo6Y2VyciA8PCBvdXRwdXRfZGlyZWN0aXZlLm5hbWUgPDwgIjogIgotICAgICAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGlmICghb3V0cHV0X2RpcmVjdGl2ZS5nZW5lcmF0b3ItPkdlbmVyYXRlKHBhcnNlZF9maWxlc1tpXSwgcGFyYW1ldGVycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQsICZlcnJvcikpIHsKLSAgICAgICAgICAvLyBHZW5lcmF0b3IgcmV0dXJuZWQgYW4gZXJyb3IuCi0gICAgICAgICAgc3RkOjpjZXJyIDw8IG91dHB1dF9kaXJlY3RpdmUubmFtZSA8PCAiOiAiIDw8IHBhcnNlZF9maWxlc1tpXS0+bmFtZSgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgZXJyb3IgPDwgc3RkOjplbmRsOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0ZURlcGVuZGVuY3lNYW5pZmVzdEZpbGUoCi0gICAgY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlcywKLSAgICBjb25zdCBHZW5lcmF0b3JDb250ZXh0TWFwJiBvdXRwdXRfZGlyZWN0b3JpZXMsCi0gICAgRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlKSB7Ci0gIEZpbGVEZXNjcmlwdG9yU2V0IGZpbGVfc2V0OwotCi0gIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKHBhcnNlZF9maWxlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxyZWFkeV9zZWVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV9zZXQubXV0YWJsZV9maWxlKCkpOwotICB9Ci0KLSAgdmVjdG9yPHN0cmluZz4gb3V0cHV0X2ZpbGVuYW1lczsKLSAgZm9yIChHZW5lcmF0b3JDb250ZXh0TWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0gb3V0cHV0X2RpcmVjdG9yaWVzLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBvdXRwdXRfZGlyZWN0b3JpZXMuZW5kKCk7ICsraXRlcikgewotICAgIGNvbnN0IHN0cmluZyYgbG9jYXRpb24gPSBpdGVyLT5maXJzdDsKLSAgICBHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5ID0gaXRlci0+c2Vjb25kOwotICAgIHZlY3RvcjxzdHJpbmc+IHJlbGF0aXZlX291dHB1dF9maWxlbmFtZXM7Ci0gICAgZGlyZWN0b3J5LT5HZXRPdXRwdXRGaWxlbmFtZXMoJnJlbGF0aXZlX291dHB1dF9maWxlbmFtZXMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVsYXRpdmVfb3V0cHV0X2ZpbGVuYW1lcy5zaXplKCk7IGkrKykgewotICAgICAgc3RyaW5nIG91dHB1dF9maWxlbmFtZSA9IGxvY2F0aW9uICsgcmVsYXRpdmVfb3V0cHV0X2ZpbGVuYW1lc1tpXTsKLSAgICAgIGlmIChvdXRwdXRfZmlsZW5hbWUuY29tcGFyZSgwLCAyLCAiLi8iKSA9PSAwKSB7Ci0gICAgICAgIG91dHB1dF9maWxlbmFtZSA9IG91dHB1dF9maWxlbmFtZS5zdWJzdHIoMik7Ci0gICAgICB9Ci0gICAgICBvdXRwdXRfZmlsZW5hbWVzLnB1c2hfYmFjayhvdXRwdXRfZmlsZW5hbWUpOwotICAgIH0KLSAgfQotCi0gIGludCBmZDsKLSAgZG8gewotICAgIGZkID0gb3BlbihkZXBlbmRlbmN5X291dF9uYW1lXy5jX3N0cigpLAotICAgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX1RSVU5DIHwgT19CSU5BUlksIDA2NjYpOwotICB9IHdoaWxlIChmZCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gIGlmIChmZCA8IDApIHsKLSAgICBwZXJyb3IoZGVwZW5kZW5jeV9vdXRfbmFtZV8uY19zdHIoKSk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0KGZkKTsKLSAgaW86OlByaW50ZXIgcHJpbnRlcigmb3V0LCAnJCcpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgb3V0cHV0X2ZpbGVuYW1lcy5zaXplKCk7IGkrKykgewotICAgIHByaW50ZXIuUHJpbnQob3V0cHV0X2ZpbGVuYW1lc1tpXS5jX3N0cigpKTsKLSAgICBpZiAoaSA9PSBvdXRwdXRfZmlsZW5hbWVzLnNpemUoKSAtIDEpIHsKLSAgICAgIHByaW50ZXIuUHJpbnQoIjoiKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci5QcmludCgiIFxcXG4iKTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfc2V0LmZpbGVfc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlID0gZmlsZV9zZXQuZmlsZShpKTsKLSAgICBjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZSA9IGZpbGUubmFtZSgpOwotICAgIHN0cmluZyBkaXNrX2ZpbGU7Ci0gICAgaWYgKHNvdXJjZV90cmVlICYmCi0gICAgICAgIHNvdXJjZV90cmVlLT5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUodmlydHVhbF9maWxlLCAmZGlza19maWxlKSkgewotICAgICAgcHJpbnRlci5QcmludCgiICRkaXNrX2ZpbGUkIiwgImRpc2tfZmlsZSIsIGRpc2tfZmlsZSk7Ci0gICAgICBpZiAoaSA8IGZpbGVfc2V0LmZpbGVfc2l6ZSgpIC0gMSkgcHJpbnRlci5QcmludCgiXFxcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIlVuYWJsZSB0byBpZGVudGlmeSBwYXRoIGZvciBmaWxlICIgPDwgdmlydHVhbF9maWxlCi0gICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0ZVBsdWdpbk91dHB1dCgKLSAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzLAotICAgIGNvbnN0IHN0cmluZyYgcGx1Z2luX25hbWUsCi0gICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCi0gICAgc3RyaW5nKiBlcnJvcikgewotICBDb2RlR2VuZXJhdG9yUmVxdWVzdCByZXF1ZXN0OwotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgcmVzcG9uc2U7Ci0KLSAgLy8gQnVpbGQgdGhlIHJlcXVlc3QuCi0gIGlmICghcGFyYW1ldGVyLmVtcHR5KCkpIHsKLSAgICByZXF1ZXN0LnNldF9wYXJhbWV0ZXIocGFyYW1ldGVyKTsKLSAgfQotCi0gIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICByZXF1ZXN0LmFkZF9maWxlX3RvX2dlbmVyYXRlKHBhcnNlZF9maWxlc1tpXS0+bmFtZSgpKTsKLSAgICBHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKHBhcnNlZF9maWxlc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBJbmNsdWRlIGpzb25fbmFtZSBmb3IgcGx1Z2lucy4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBJbmNsdWRlIHNvdXJjZSBjb2RlIGluZm8uCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxyZWFkeV9zZWVuLCByZXF1ZXN0Lm11dGFibGVfcHJvdG9fZmlsZSgpKTsKLSAgfQotCi0gIC8vIEludm9rZSB0aGUgcGx1Z2luLgotICBTdWJwcm9jZXNzIHN1YnByb2Nlc3M7Ci0KLSAgaWYgKHBsdWdpbnNfLmNvdW50KHBsdWdpbl9uYW1lKSA+IDApIHsKLSAgICBzdWJwcm9jZXNzLlN0YXJ0KHBsdWdpbnNfW3BsdWdpbl9uYW1lXSwgU3VicHJvY2Vzczo6RVhBQ1RfTkFNRSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3VicHJvY2Vzcy5TdGFydChwbHVnaW5fbmFtZSwgU3VicHJvY2Vzczo6U0VBUkNIX1BBVEgpOwotICB9Ci0KLSAgc3RyaW5nIGNvbW11bmljYXRlX2Vycm9yOwotICBpZiAoIXN1YnByb2Nlc3MuQ29tbXVuaWNhdGUocmVxdWVzdCwgJnJlc3BvbnNlLCAmY29tbXVuaWNhdGVfZXJyb3IpKSB7Ci0gICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgiJDA6ICQxIiwgcGx1Z2luX25hbWUsIGNvbW11bmljYXRlX2Vycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgZmlsZXMuICBXZSBkbyB0aGlzIGV2ZW4gaWYgdGhlcmUgd2FzIGEgZ2VuZXJhdG9yIGVycm9yIGluIG9yZGVyCi0gIC8vIHRvIG1hdGNoIHRoZSBiZWhhdmlvciBvZiBhIGNvbXBpbGVkLWluIGdlbmVyYXRvci4KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IGN1cnJlbnRfb3V0cHV0OwotICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3BvbnNlLmZpbGVfc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkZpbGUmIG91dHB1dF9maWxlID0gcmVzcG9uc2UuZmlsZShpKTsKLQotICAgIGlmICghb3V0cHV0X2ZpbGUuaW5zZXJ0aW9uX3BvaW50KCkuZW1wdHkoKSkgewotICAgICAgLy8gT3BlbiBhIGZpbGUgZm9yIGluc2VydC4KLSAgICAgIC8vIFdlIHJlc2V0IGN1cnJlbnRfb3V0cHV0IHRvIE5VTEwgZmlyc3Qgc28gdGhhdCB0aGUgb2xkIGZpbGUgaXMgY2xvc2VkCi0gICAgICAvLyBiZWZvcmUgdGhlIG5ldyBvbmUgaXMgb3BlbmVkLgotICAgICAgY3VycmVudF9vdXRwdXQucmVzZXQoKTsKLSAgICAgIGN1cnJlbnRfb3V0cHV0LnJlc2V0KGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuRm9ySW5zZXJ0KAotICAgICAgICAgIG91dHB1dF9maWxlLm5hbWUoKSwgb3V0cHV0X2ZpbGUuaW5zZXJ0aW9uX3BvaW50KCkpKTsKLSAgICB9IGVsc2UgaWYgKCFvdXRwdXRfZmlsZS5uYW1lKCkuZW1wdHkoKSkgewotICAgICAgLy8gU3RhcnRpbmcgYSBuZXcgZmlsZS4gIE9wZW4gaXQuCi0gICAgICAvLyBXZSByZXNldCBjdXJyZW50X291dHB1dCB0byBOVUxMIGZpcnN0IHNvIHRoYXQgdGhlIG9sZCBmaWxlIGlzIGNsb3NlZAotICAgICAgLy8gYmVmb3JlIHRoZSBuZXcgb25lIGlzIG9wZW5lZC4KLSAgICAgIGN1cnJlbnRfb3V0cHV0LnJlc2V0KCk7Ci0gICAgICBjdXJyZW50X291dHB1dC5yZXNldChnZW5lcmF0b3JfY29udGV4dC0+T3BlbihvdXRwdXRfZmlsZS5uYW1lKCkpKTsKLSAgICB9IGVsc2UgaWYgKGN1cnJlbnRfb3V0cHV0ID09IE5VTEwpIHsKLSAgICAgICplcnJvciA9IHN0cmluZ3M6OlN1YnN0aXR1dGUoCi0gICAgICAgICIkMDogRmlyc3QgZmlsZSBjaHVuayByZXR1cm5lZCBieSBwbHVnaW4gZGlkIG5vdCBzcGVjaWZ5IGEgZmlsZSBuYW1lLiIsCi0gICAgICAgIHBsdWdpbl9uYW1lKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBVc2UgQ29kZWRPdXRwdXRTdHJlYW0gZm9yIGNvbnZlbmllbmNlOyBvdGhlcndpc2Ugd2UnZCBuZWVkIHRvIHByb3ZpZGUKLSAgICAvLyBvdXIgb3duIGJ1ZmZlci1jb3B5aW5nIGxvb3AuCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIHdyaXRlcihjdXJyZW50X291dHB1dC5nZXQoKSk7Ci0gICAgd3JpdGVyLldyaXRlU3RyaW5nKG91dHB1dF9maWxlLmNvbnRlbnQoKSk7Ci0gIH0KLQotICAvLyBDaGVjayBmb3IgZXJyb3JzLgotICBpZiAoIXJlc3BvbnNlLmVycm9yKCkuZW1wdHkoKSkgewotICAgIC8vIEdlbmVyYXRvciByZXR1cm5lZCBhbiBlcnJvci4KLSAgICAqZXJyb3IgPSByZXNwb25zZS5lcnJvcigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFbmNvZGVPckRlY29kZShjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCkgewotICAvLyBMb29rIHVwIHRoZSB0eXBlLgotICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlID0gcG9vbC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKGNvZGVjX3R5cGVfKTsKLSAgaWYgKHR5cGUgPT0gTlVMTCkgewotICAgIHN0ZDo6Y2VyciA8PCAiVHlwZSBub3QgZGVmaW5lZDogIiA8PCBjb2RlY190eXBlXyA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGR5bmFtaWNfZmFjdG9yeShwb29sKTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKGR5bmFtaWNfZmFjdG9yeS5HZXRQcm90b3R5cGUodHlwZSktPk5ldygpKTsKLQotICBpZiAobW9kZV8gPT0gTU9ERV9FTkNPREUpIHsKLSAgICBTZXRGZFRvVGV4dE1vZGUoU1RESU5fRklMRU5PKTsKLSAgICBTZXRGZFRvQmluYXJ5TW9kZShTVERPVVRfRklMRU5PKTsKLSAgfSBlbHNlIHsKLSAgICBTZXRGZFRvQmluYXJ5TW9kZShTVERJTl9GSUxFTk8pOwotICAgIFNldEZkVG9UZXh0TW9kZShTVERPVVRfRklMRU5PKTsKLSAgfQotCi0gIGlvOjpGaWxlSW5wdXRTdHJlYW0gaW4oU1RESU5fRklMRU5PKTsKLSAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0KFNURE9VVF9GSUxFTk8pOwotCi0gIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSkgewotICAgIC8vIElucHV0IGlzIHRleHQuCi0gICAgRXJyb3JQcmludGVyIGVycm9yX2NvbGxlY3RvcihlcnJvcl9mb3JtYXRfKTsKLSAgICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOwotICAgIHBhcnNlci5SZWNvcmRFcnJvcnNUbygmZXJyb3JfY29sbGVjdG9yKTsKLSAgICBwYXJzZXIuQWxsb3dQYXJ0aWFsTWVzc2FnZSh0cnVlKTsKLQotICAgIGlmICghcGFyc2VyLlBhcnNlKCZpbiwgbWVzc2FnZS5nZXQoKSkpIHsKLSAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIGlucHV0LiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBJbnB1dCBpcyBiaW5hcnkuCi0gICAgaWYgKCFtZXNzYWdlLT5QYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oJmluKSkgewotICAgICAgc3RkOjpjZXJyIDw8ICJGYWlsZWQgdG8gcGFyc2UgaW5wdXQuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgaWYgKCFtZXNzYWdlLT5Jc0luaXRpYWxpemVkKCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgIndhcm5pbmc6ICBJbnB1dCBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAgIgotICAgICAgICAgICAgICA8PCBtZXNzYWdlLT5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgPDwgc3RkOjplbmRsOwotICB9Ci0KLSAgaWYgKG1vZGVfID09IE1PREVfRU5DT0RFKSB7Ci0gICAgLy8gT3V0cHV0IGlzIGJpbmFyeS4KLSAgICBpZiAoIW1lc3NhZ2UtPlNlcmlhbGl6ZVBhcnRpYWxUb1plcm9Db3B5U3RyZWFtKCZvdXQpKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgIm91dHB1dDogSS9PIGVycm9yLiIgPDwgc3RkOjplbmRsOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBPdXRwdXQgaXMgdGV4dC4KLSAgICBpZiAoIVRleHRGb3JtYXQ6OlByaW50KCptZXNzYWdlLCAmb3V0KSkgewotICAgICAgc3RkOjpjZXJyIDw8ICJvdXRwdXQ6IEkvTyBlcnJvci4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6V3JpdGVEZXNjcmlwdG9yU2V0KAotICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlcykgewotICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX3NldDsKLQotICBpZiAoaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8pIHsKLSAgICBzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBhbHJlYWR5X3NlZW47Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMocGFyc2VkX2ZpbGVzW2ldLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlLCAgLy8gSW5jbHVkZSBqc29uX25hbWUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYWxyZWFkeV9zZWVuLCBmaWxlX3NldC5tdXRhYmxlX2ZpbGUoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgewotICAgICAgaWYgKCFhbHJlYWR5X3NlZW4uaW5zZXJ0KHBhcnNlZF9maWxlc1tpXSkuc2Vjb25kKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9wcm90byA9IGZpbGVfc2V0LmFkZF9maWxlKCk7Ci0gICAgICBwYXJzZWRfZmlsZXNbaV0tPkNvcHlUbyhmaWxlX3Byb3RvKTsKLSAgICAgIHBhcnNlZF9maWxlc1tpXS0+Q29weUpzb25OYW1lVG8oZmlsZV9wcm90byk7Ci0gICAgICBpZiAoc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfKSB7Ci0gICAgICAgIHBhcnNlZF9maWxlc1tpXS0+Q29weVNvdXJjZUNvZGVJbmZvVG8oZmlsZV9wcm90byk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW50IGZkOwotICBkbyB7Ci0gICAgZmQgPSBvcGVuKGRlc2NyaXB0b3Jfc2V0X25hbWVfLmNfc3RyKCksCi0gICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDY2Nik7Ci0gIH0gd2hpbGUgKGZkIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0KLSAgaWYgKGZkIDwgMCkgewotICAgIHBlcnJvcihkZXNjcmlwdG9yX3NldF9uYW1lXy5jX3N0cigpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpbzo6RmlsZU91dHB1dFN0cmVhbSBvdXQoZmQpOwotICBpZiAoIWZpbGVfc2V0LlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oJm91dCkpIHsKLSAgICBzdGQ6OmNlcnIgPDwgZGVzY3JpcHRvcl9zZXRfbmFtZV8gPDwgIjogIiA8PCBzdHJlcnJvcihvdXQuR2V0RXJybm8oKSkKLSAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwotICAgIG91dC5DbG9zZSgpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIW91dC5DbG9zZSgpKSB7Ci0gICAgc3RkOjpjZXJyIDw8IGRlc2NyaXB0b3Jfc2V0X25hbWVfIDw8ICI6ICIgPDwgc3RyZXJyb3Iob3V0LkdldEVycm5vKCkpCi0gICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6R2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcygKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICBib29sIGluY2x1ZGVfanNvbl9uYW1lLAotICAgIGJvb2wgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvLAotICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4sCi0gICAgUmVwZWF0ZWRQdHJGaWVsZDxGaWxlRGVzY3JpcHRvclByb3RvPiogb3V0cHV0KSB7Ci0gIGlmICghYWxyZWFkeV9zZWVuLT5pbnNlcnQoZmlsZSkuc2Vjb25kKSB7Ci0gICAgLy8gQWxyZWFkeSBzYXcgdGhpcyBmaWxlLiAgU2tpcC4KLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBBZGQgYWxsIGRlcGVuZGVuY2llcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoZmlsZS0+ZGVwZW5kZW5jeShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluY2x1ZGVfanNvbl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxyZWFkeV9zZWVuLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gQWRkIHRoaXMgZmlsZS4KLSAgRmlsZURlc2NyaXB0b3JQcm90byogbmV3X2Rlc2NyaXB0b3IgPSBvdXRwdXQtPkFkZCgpOwotICBmaWxlLT5Db3B5VG8obmV3X2Rlc2NyaXB0b3IpOwotICBpZiAoaW5jbHVkZV9qc29uX25hbWUpIHsKLSAgICBmaWxlLT5Db3B5SnNvbk5hbWVUbyhuZXdfZGVzY3JpcHRvcik7Ci0gIH0KLSAgaWYgKGluY2x1ZGVfc291cmNlX2NvZGVfaW5mbykgewotICAgIGZpbGUtPkNvcHlTb3VyY2VDb2RlSW5mb1RvKG5ld19kZXNjcmlwdG9yKTsKLSAgfQotfQotCi1uYW1lc3BhY2UgewotCi0vLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBQcmludEZyZWVGaWVsZE51bWJlcnMuCi0vLyBTdG9yZXMgb2NjdXBpZWQgcmFuZ2VzIGludG8gdGhlIHJhbmdlcyBwYXJhbWV0ZXIsIGFuZCBuZXh0IGxldmVsIG9mIHN1YgotLy8gbWVzc2FnZSB0eXBlcyBpbnRvIHRoZSBuZXN0ZWRfbWVzc2FnZXMgcGFyYW1ldGVyLiAgVGhlIEZpZWxkUmFuZ2UgaXMgbGVmdAotLy8gaW5jbHVzaXZlLCByaWdodCBleGNsdXNpdmUuIGkuZS4gW2EsIGIpLgotLy8KLS8vIE5lc3RlZCBNZXNzYWdlczoKLS8vIE5vdGUgdGhhdCBpdCBvbmx5IHN0b3JlcyB0aGUgbmVzdGVkIG1lc3NhZ2UgdHlwZSwgaWZmIHRoZSBuZXN0ZWQgdHlwZSBpcwotLy8gZWl0aGVyIGEgZGlyZWN0IGNoaWxkIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yLCBvciB0aGUgbmVzdGVkIHR5cGUgaXMgYQotLy8gZGVjZW5kZW50IG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGFuZCBhbGwgdGhlIG5vZGVzIGJldHdlZW4gdGhlCi0vLyBuZXN0ZWQgdHlwZSBhbmQgdGhlIGdpdmVuIGRlc2NyaXB0b3IgYXJlIGdyb3VwIHR5cGVzLiBlLmcuCi0vLwotLy8gbWVzc2FnZSBGb28gewotLy8gICBtZXNzYWdlIEJhciB7Ci0vLyAgICAgbWVzc2FnZSBOZXN0ZWRCYXIge30KLS8vICAgfQotLy8gICBncm91cCBCYXogPSAxIHsKLS8vICAgICBncm91cCBOZXN0ZWRCYXpHcm91cCA9IDIgewotLy8gICAgICAgbWVzc2FnZSBRdXogewotLy8gICAgICAgICBtZXNzYWdlIE5lc3RlZFF1eiB7fQotLy8gICAgICAgfQotLy8gICAgIH0KLS8vICAgICBtZXNzYWdlIE5lc3RlZEJheiB7fQotLy8gICB9Ci0vLyB9Ci0vLwotLy8gSW4gdGhpcyBjYXNlLCBCYXIsIFF1eiBhbmQgTmVzdGVkQmF6IHdpbGwgYmUgYWRkZWQgaW50byB0aGUgbmVzdGVkIHR5cGVzLgotLy8gU2luY2UgZnJlZSBmaWVsZCBudW1iZXJzIG9mIGdyb3VwIHR5cGVzIHdpbGwgbm90IGJlIHByaW50ZWQsIHRoaXMgbWFrZXMgc3VyZQotLy8gdGhlIG5lc3RlZCBtZXNzYWdlIHR5cGVzIGluIGdyb3VwcyB3aWxsIG5vdCBiZSBkcm9wcGVkLiBUaGUgbmVzdGVkX21lc3NhZ2VzCi0vLyBwYXJhbWV0ZXIgd2lsbCBjb250YWluIHRoZSBkaXJlY3QgY2hpbGRyZW4gKHdoZW4gZ3JvdXBzIGFyZSBpZ25vcmVkIGluIHRoZQotLy8gdHJlZSkgb2YgdGhlIGdpdmVuIGRlc2NyaXB0b3IgZm9yIHRoZSBjYWxsZXIgdG8gdHJhdmVyc2UuIFRoZSBkZWNsYXJhdGlvbgotLy8gb3JkZXIgb2YgdGhlIG5lc3RlZCBtZXNzYWdlcyBpcyBhbHNvIHByZXNlcnZlZC4KLXR5cGVkZWYgcGFpcjxpbnQsIGludD4gRmllbGRSYW5nZTsKLXZvaWQgR2F0aGVyT2NjdXBpZWRGaWVsZFJhbmdlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldDxGaWVsZFJhbmdlPiogcmFuZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yKj4qIG5lc3RlZF9tZXNzYWdlcykgewotICBzZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGdyb3VwczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZkID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7Ci0gICAgcmFuZ2VzLT5pbnNlcnQoRmllbGRSYW5nZShmZC0+bnVtYmVyKCksIGZkLT5udW1iZXIoKSArIDEpKTsKLSAgICBpZiAoZmQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKLSAgICAgIGdyb3Vwcy5pbnNlcnQoZmQtPm1lc3NhZ2VfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgKytpKSB7Ci0gICAgcmFuZ2VzLT5pbnNlcnQoRmllbGRSYW5nZShkZXNjcmlwdG9yLT5leHRlbnNpb25fcmFuZ2UoaSktPnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlKGkpLT5lbmQpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPnJlc2VydmVkX3JhbmdlX2NvdW50KCk7ICsraSkgewotICAgIHJhbmdlcy0+aW5zZXJ0KEZpZWxkUmFuZ2UoZGVzY3JpcHRvci0+cmVzZXJ2ZWRfcmFuZ2UoaSktPnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+cmVzZXJ2ZWRfcmFuZ2UoaSktPmVuZCkpOwotICB9Ci0gIC8vIEhhbmRsZSB0aGUgbmVzdGVkIG1lc3NhZ2VzL2dyb3VwcyBpbiBkZWNsYXJhdGlvbiBvcmRlciB0byBtYWtlIGl0Ci0gIC8vIHBvc3Qtb3JkZXIgc3RyaWN0LgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IERlc2NyaXB0b3IqIG5lc3RlZF9kZXNjID0gZGVzY3JpcHRvci0+bmVzdGVkX3R5cGUoaSk7Ci0gICAgaWYgKGdyb3Vwcy5maW5kKG5lc3RlZF9kZXNjKSAhPSBncm91cHMuZW5kKCkpIHsKLSAgICAgIEdhdGhlck9jY3VwaWVkRmllbGRSYW5nZXMobmVzdGVkX2Rlc2MsIHJhbmdlcywgbmVzdGVkX21lc3NhZ2VzKTsKLSAgICB9IGVsc2UgewotICAgICAgbmVzdGVkX21lc3NhZ2VzLT5wdXNoX2JhY2sobmVzdGVkX2Rlc2MpOwotICAgIH0KLSAgfQotfQotCi0vLyBVdGlsaXR5IGZ1bmN0aW9uIGZvciBQcmludEZyZWVGaWVsZE51bWJlcnMuCi0vLyBBY3R1YWxseSBwcmludHMgdGhlIGZvcm1hdHRlZCBmcmVlIGZpZWxkIG51bWJlcnMgZm9yIGdpdmVuIG1lc3NhZ2UgbmFtZSBhbmQKLS8vIG9jY3VwaWVkIHJhbmdlcy4KLXZvaWQgRm9ybWF0RnJlZUZpZWxkTnVtYmVycyhjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2V0PEZpZWxkUmFuZ2U+JiByYW5nZXMpIHsKLSAgc3RyaW5nIG91dHB1dDsKLSAgU3RyaW5nQXBwZW5kRigmb3V0cHV0LCAiJS0zNXMgZnJlZToiLCBuYW1lLmNfc3RyKCkpOwotICBpbnQgbmV4dF9mcmVlX251bWJlciA9IDE7Ci0gIGZvciAoc2V0PEZpZWxkUmFuZ2U+Ojpjb25zdF9pdGVyYXRvciBpID0gcmFuZ2VzLmJlZ2luKCk7Ci0gICAgICAgaSAhPSByYW5nZXMuZW5kKCk7ICsraSkgewotICAgIC8vIFRoaXMgaGFwcGVucyB3aGVuIGdyb3VwcyByZS11c2UgcGFyZW50IGZpZWxkIG51bWJlcnMsIGluIHdoaWNoCi0gICAgLy8gY2FzZSB3ZSBza2lwIHRoZSBGaWVsZFJhbmdlIGVudGlyZWx5LgotICAgIGlmIChuZXh0X2ZyZWVfbnVtYmVyID49IGktPnNlY29uZCkgY29udGludWU7Ci0KLSAgICBpZiAobmV4dF9mcmVlX251bWJlciA8IGktPmZpcnN0KSB7Ci0gICAgICBpZiAobmV4dF9mcmVlX251bWJlciArIDEgPT0gaS0+Zmlyc3QpIHsKLSAgICAgICAgLy8gU2luZ2xldG9uCi0gICAgICAgIFN0cmluZ0FwcGVuZEYoJm91dHB1dCwgIiAlZCIsIG5leHRfZnJlZV9udW1iZXIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gUmFuZ2UKLSAgICAgICAgU3RyaW5nQXBwZW5kRigmb3V0cHV0LCAiICVkLSVkIiwgbmV4dF9mcmVlX251bWJlciwgaS0+Zmlyc3QgLSAxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgbmV4dF9mcmVlX251bWJlciA9IGktPnNlY29uZDsKLSAgfQotICBpZiAobmV4dF9mcmVlX251bWJlciA8PSBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIpIHsKLSAgICBTdHJpbmdBcHBlbmRGKCZvdXRwdXQsICIgJWQtSU5GIiwgbmV4dF9mcmVlX251bWJlcik7Ci0gIH0KLSAgc3RkOjpjb3V0IDw8IG91dHB1dCA8PCBzdGQ6OmVuZGw7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpQcmludEZyZWVGaWVsZE51bWJlcnMoCi0gICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBzZXQ8RmllbGRSYW5nZT4gcmFuZ2VzOwotICB2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+IG5lc3RlZF9tZXNzYWdlczsKLSAgR2F0aGVyT2NjdXBpZWRGaWVsZFJhbmdlcyhkZXNjcmlwdG9yLCAmcmFuZ2VzLCAmbmVzdGVkX21lc3NhZ2VzKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZF9tZXNzYWdlcy5zaXplKCk7ICsraSkgewotICAgIFByaW50RnJlZUZpZWxkTnVtYmVycyhuZXN0ZWRfbWVzc2FnZXNbaV0pOwotICB9Ci0gIEZvcm1hdEZyZWVGaWVsZE51bWJlcnMoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIHJhbmdlcyk7Ci19Ci0KLQotCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDEzNzc2Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM5NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gSW1wbGVtZW50cyB0aGUgUHJvdG9jb2wgQ29tcGlsZXIgZnJvbnQtZW5kIHN1Y2ggdGhhdCBpdCBtYXkgYmUgcmV1c2VkIGJ5Ci0vLyBjdXN0b20gY29tcGlsZXJzIHdyaXR0ZW4gdG8gc3VwcG9ydCBvdGhlciBsYW5ndWFnZXMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NPTU1BTkRfTElORV9JTlRFUkZBQ0VfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT01NQU5EX0xJTkVfSU5URVJGQUNFX0hfXwotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKLWNsYXNzIERlc2NyaXB0b3JQb29sOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCi1jbGFzcyBGaWxlRGVzY3JpcHRvcjsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAotY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90bzsgICAvLyBkZXNjcmlwdG9yLnBiLmgKLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFJlcGVhdGVkUHRyRmllbGQ7ICAvLyByZXBlYXRlZF9maWVsZC5oCi0KLW5hbWVzcGFjZSBjb21waWxlciB7Ci0KLWNsYXNzIENvZGVHZW5lcmF0b3I7ICAgICAgICAvLyBjb2RlX2dlbmVyYXRvci5oCi1jbGFzcyBHZW5lcmF0b3JDb250ZXh0OyAgICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKLWNsYXNzIERpc2tTb3VyY2VUcmVlOyAgICAgICAvLyBpbXBvcnRlci5oCi0KLS8vIFRoaXMgY2xhc3MgaW1wbGVtZW50cyB0aGUgY29tbWFuZC1saW5lIGludGVyZmFjZSB0byB0aGUgcHJvdG9jb2wgY29tcGlsZXIuCi0vLyBJdCBpcyBkZXNpZ25lZCB0byBtYWtlIGl0IHZlcnkgZWFzeSB0byBjcmVhdGUgYSBjdXN0b20gcHJvdG9jb2wgY29tcGlsZXIKLS8vIHN1cHBvcnRpbmcgdGhlIGxhbmd1YWdlcyBvZiB5b3VyIGNob2ljZS4gIEZvciBleGFtcGxlLCBpZiB5b3Ugd2FudGVkIHRvCi0vLyBjcmVhdGUgYSBjdXN0b20gcHJvdG9jb2wgY29tcGlsZXIgYmluYXJ5IHdoaWNoIGluY2x1ZGVzIGJvdGggdGhlIHJlZ3VsYXIKLS8vIEMrKyBzdXBwb3J0IHBsdXMgc3VwcG9ydCBmb3IgeW91ciBvd24gY3VzdG9tIG91dHB1dCAiRm9vIiwgeW91IHdvdWxkCi0vLyB3cml0ZSBhIGNsYXNzICJGb29HZW5lcmF0b3IiIHdoaWNoIGltcGxlbWVudHMgdGhlIENvZGVHZW5lcmF0b3IgaW50ZXJmYWNlLAotLy8gdGhlbiB3cml0ZSBhIG1haW4oKSBwcm9jZWR1cmUgbGlrZSB0aGlzOgotLy8KLS8vICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotLy8gICAgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7Ci0vLwotLy8gICAgIC8vIFN1cHBvcnQgZ2VuZXJhdGlvbiBvZiBDKysgc291cmNlIGFuZCBoZWFkZXJzLgotLy8gICAgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpjcHA6OkNwcEdlbmVyYXRvciBjcHBfZ2VuZXJhdG9yOwotLy8gICAgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1jcHBfb3V0IiwgJmNwcF9nZW5lcmF0b3IsCi0vLyAgICAgICAiR2VuZXJhdGUgQysrIHNvdXJjZSBhbmQgaGVhZGVyLiIpOwotLy8KLS8vICAgICAvLyBTdXBwb3J0IGdlbmVyYXRpb24gb2YgRm9vIGNvZGUuCi0vLyAgICAgRm9vR2VuZXJhdG9yIGZvb19nZW5lcmF0b3I7Ci0vLyAgICAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWZvb19vdXQiLCAmZm9vX2dlbmVyYXRvciwKLS8vICAgICAgICJHZW5lcmF0ZSBGb28gZmlsZS4iKTsKLS8vCi0vLyAgICAgcmV0dXJuIGNsaS5SdW4oYXJnYywgYXJndik7Ci0vLyAgIH0KLS8vCi0vLyBUaGUgY29tcGlsZXIgaXMgaW52b2tlZCB3aXRoIHN5bnRheCBsaWtlOgotLy8gICBwcm90b2MgLS1jcHBfb3V0PW91dGRpciAtLWZvb19vdXQ9b3V0ZGlyIC0tcHJvdG9fcGF0aD1zcmMgc3JjL2Zvby5wcm90bwotLy8KLS8vIEZvciBhIGZ1bGwgZGVzY3JpcHRpb24gb2YgdGhlIGNvbW1hbmQtbGluZSBzeW50YXgsIGludm9rZSBpdCB3aXRoIC0taGVscC4KLWNsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29tbWFuZExpbmVJbnRlcmZhY2UgewotIHB1YmxpYzoKLSAgQ29tbWFuZExpbmVJbnRlcmZhY2UoKTsKLSAgfkNvbW1hbmRMaW5lSW50ZXJmYWNlKCk7Ci0KLSAgLy8gUmVnaXN0ZXIgYSBjb2RlIGdlbmVyYXRvciBmb3IgYSBsYW5ndWFnZS4KLSAgLy8KLSAgLy8gUGFyYW1ldGVyczoKLSAgLy8gKiBmbGFnX25hbWU6IFRoZSBjb21tYW5kLWxpbmUgZmxhZyB1c2VkIHRvIHNwZWNpZnkgYW4gb3V0cHV0IGZpbGUgb2YKLSAgLy8gICB0aGlzIHR5cGUuICBUaGUgbmFtZSBtdXN0IHN0YXJ0IHdpdGggYSAnLScuICBJZiB0aGUgbmFtZSBpcyBsb25nZXIKLSAgLy8gICB0aGFuIG9uZSBsZXR0ZXIsIGl0IG11c3Qgc3RhcnQgd2l0aCB0d28gJy0ncy4KLSAgLy8gKiBnZW5lcmF0b3I6IFRoZSBDb2RlR2VuZXJhdG9yIHdoaWNoIHdpbGwgYmUgY2FsbGVkIHRvIGdlbmVyYXRlIGZpbGVzCi0gIC8vICAgb2YgdGhpcyB0eXBlLgotICAvLyAqIGhlbHBfdGV4dDogVGV4dCBkZXNjcmliaW5nIHRoaXMgZmxhZyBpbiB0aGUgLS1oZWxwIG91dHB1dC4KLSAgLy8KLSAgLy8gU29tZSBnZW5lcmF0b3JzIGFjY2VwdCBleHRyYSBwYXJhbWV0ZXJzLiAgWW91IGNhbiBzcGVjaWZ5IHRoaXMgcGFyYW1ldGVyCi0gIC8vIG9uIHRoZSBjb21tYW5kLWxpbmUgYnkgcGxhY2luZyBpdCBiZWZvcmUgdGhlIG91dHB1dCBkaXJlY3RvcnksIHNlcGFyYXRlZAotICAvLyBieSBhIGNvbG9uOgotICAvLyAgIHByb3RvYyAtLWZvb19vdXQ9ZW5hYmxlX2JhcjpvdXRkaXIKLSAgLy8gVGhlIHRleHQgYmVmb3JlIHRoZSBjb2xvbiBpcyBwYXNzZWQgdG8gQ29kZUdlbmVyYXRvcjo6R2VuZXJhdGUoKSBhcyB0aGUKLSAgLy8gInBhcmFtZXRlciIuCi0gIHZvaWQgUmVnaXN0ZXJHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBmbGFnX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaGVscF90ZXh0KTsKLQotICAvLyBSZWdpc3RlciBhIGNvZGUgZ2VuZXJhdG9yIGZvciBhIGxhbmd1YWdlLgotICAvLyBCZXNpZGVzIGZsYWdfbmFtZSB5b3UgY2FuIHNwZWNpZnkgYW5vdGhlciBvcHRpb25fZmxhZ19uYW1lIHRoYXQgY291bGQgYmUKLSAgLy8gdXNlZCB0byBwYXNzIGV4dHJhIHBhcmFtZXRlcnMgdG8gdGhlIHJlZ2lzdGVyZWQgY29kZSBnZW5lcmF0b3IuCi0gIC8vIFN1cHBvc2UgeW91IGhhdmUgcmVnaXN0ZXJlZCBhIGdlbmVyYXRvciBieSBjYWxsaW5nOgotICAvLyAgIGNvbW1hbmRfbGluZV9pbnRlcmZhY2UuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tZm9vX291dCIsICItLWZvb19vcHQiLCAuLi4pCi0gIC8vIFRoZW4geW91IGNvdWxkIGludm9rZSB0aGUgY29tcGlsZXIgd2l0aCBhIGNvbW1hbmQgbGlrZToKLSAgLy8gICBwcm90b2MgLS1mb29fb3V0PWVuYWJsZV9iYXI6b3V0ZGlyIC0tZm9vX29wdD1lbmFibGVfYmF6Ci0gIC8vIFRoaXMgd2lsbCBwYXNzICJlbmFibGVfYmFyLGVuYWJsZV9iYXoiIGFzIHRoZSBwYXJhbWV0ZXIgdG8gdGhlIGdlbmVyYXRvci4KLSAgdm9pZCBSZWdpc3RlckdlbmVyYXRvcihjb25zdCBzdHJpbmcmIGZsYWdfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9mbGFnX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaGVscF90ZXh0KTsKLQotICAvLyBFbmFibGVzICJwbHVnaW5zIi4gIEluIHRoaXMgbW9kZSwgaWYgYSBjb21tYW5kLWxpbmUgZmxhZyBlbmRzIHdpdGggIl9vdXQiCi0gIC8vIGJ1dCBkb2VzIG5vdCBtYXRjaCBhbnkgcmVnaXN0ZXJlZCBnZW5lcmF0b3IsIHRoZSBjb21waWxlciB3aWxsIGF0dGVtcHQgdG8KLSAgLy8gZmluZCBhICJwbHVnaW4iIHRvIGltcGxlbWVudCB0aGUgZ2VuZXJhdG9yLiAgUGx1Z2lucyBhcmUganVzdCBleGVjdXRhYmxlcy4KLSAgLy8gVGhleSBzaG91bGQgbGl2ZSBzb21ld2hlcmUgaW4gdGhlIFBBVEguCi0gIC8vCi0gIC8vIFRoZSBjb21waWxlciBkZXRlcm1pbmVzIHRoZSBleGVjdXRhYmxlIG5hbWUgdG8gc2VhcmNoIGZvciBieSBjb25jYXRlbmF0aW5nCi0gIC8vIGV4ZV9uYW1lX3ByZWZpeCB3aXRoIHRoZSB1bnJlY29nbml6ZWQgZmxhZyBuYW1lLCByZW1vdmluZyAiX291dCIuICBTbywgZm9yCi0gIC8vIGV4YW1wbGUsIGlmIGV4ZV9uYW1lX3ByZWZpeCBpcyAicHJvdG9jLSIgYW5kIHlvdSBwYXNzIHRoZSBmbGFnIC0tZm9vX291dCwKLSAgLy8gdGhlIGNvbXBpbGVyIHdpbGwgdHJ5IHRvIHJ1biB0aGUgcHJvZ3JhbSAicHJvdG9jLWZvbyIuCi0gIC8vCi0gIC8vIFRoZSBwbHVnaW4gcHJvZ3JhbSBzaG91bGQgaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgdXNhZ2U6Ci0gIC8vICAgcGx1Z2luIFstLW91dD1PVVRESVJdIFstLXBhcmFtZXRlcj1QQVJBTUVURVJdIFBST1RPX0ZJTEVTIDwgREVTQ1JJUFRPUlMKLSAgLy8gLS1vdXQgaW5kaWNhdGVzIHRoZSBvdXRwdXQgZGlyZWN0b3J5IChhcyBwYXNzZWQgdG8gdGhlIC0tZm9vX291dAotICAvLyBwYXJhbWV0ZXIpOyBpZiBvbWl0dGVkLCB0aGUgY3VycmVudCBkaXJlY3Rvcnkgc2hvdWxkIGJlIHVzZWQuICAtLXBhcmFtZXRlcgotICAvLyBnaXZlcyB0aGUgZ2VuZXJhdG9yIHBhcmFtZXRlciwgaWYgYW55IHdhcyBwcm92aWRlZC4gIFRoZSBQUk9UT19GSUxFUyBsaXN0Ci0gIC8vIHRoZSAucHJvdG8gZmlsZXMgd2hpY2ggd2VyZSBnaXZlbiBvbiB0aGUgY29tcGlsZXIgY29tbWFuZC1saW5lOyB0aGVzZSBhcmUKLSAgLy8gdGhlIGZpbGVzIGZvciB3aGljaCB0aGUgcGx1Z2luIGlzIGV4cGVjdGVkIHRvIGdlbmVyYXRlIG91dHB1dCBjb2RlLgotICAvLyBGaW5hbGx5LCBERVNDUklQVE9SUyBpcyBhbiBlbmNvZGVkIEZpbGVEZXNjcmlwdG9yU2V0IChhcyBkZWZpbmVkIGluCi0gIC8vIGRlc2NyaXB0b3IucHJvdG8pLiAgVGhpcyBpcyBwaXBlZCB0byB0aGUgcGx1Z2luJ3Mgc3RkaW4uICBUaGUgc2V0IHdpbGwKLSAgLy8gaW5jbHVkZSBkZXNjcmlwdG9ycyBmb3IgYWxsIHRoZSBmaWxlcyBsaXN0ZWQgaW4gUFJPVE9fRklMRVMgYXMgd2VsbCBhcwotICAvLyBhbGwgZmlsZXMgdGhhdCB0aGV5IGltcG9ydC4gIFRoZSBwbHVnaW4gTVVTVCBOT1QgYXR0ZW1wdCB0byByZWFkIHRoZQotICAvLyBQUk9UT19GSUxFUyBkaXJlY3RseSAtLSBpdCBtdXN0IHVzZSB0aGUgRmlsZURlc2NyaXB0b3JTZXQuCi0gIC8vCi0gIC8vIFRoZSBwbHVnaW4gc2hvdWxkIGdlbmVyYXRlIHdoYXRldmVyIGZpbGVzIGFyZSBuZWNlc3NhcnksIGFzIGNvZGUgZ2VuZXJhdG9ycwotICAvLyBub3JtYWxseSBkby4gIEl0IHNob3VsZCB3cml0ZSB0aGUgbmFtZXMgb2YgYWxsIGZpbGVzIGl0IGdlbmVyYXRlcyB0bwotICAvLyBzdGRvdXQuICBUaGUgbmFtZXMgc2hvdWxkIGJlIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LCBOT1QgYWJzb2x1dGUKLSAgLy8gbmFtZXMgb3IgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LiAgSWYgYW55IGVycm9ycyBvY2N1ciwgZXJyb3IKLSAgLy8gbWVzc2FnZXMgc2hvdWxkIGJlIHdyaXR0ZW4gdG8gc3RkZXJyLiAgSWYgYW4gZXJyb3IgaXMgZmF0YWwsIHRoZSBwbHVnaW4KLSAgLy8gc2hvdWxkIGV4aXQgd2l0aCBhIG5vbi16ZXJvIGV4aXQgY29kZS4KLSAgdm9pZCBBbGxvd1BsdWdpbnMoY29uc3Qgc3RyaW5nJiBleGVfbmFtZV9wcmVmaXgpOwotCi0gIC8vIFJ1biB0aGUgUHJvdG9jb2wgQ29tcGlsZXIgd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZC1saW5lIHBhcmFtZXRlcnMuCi0gIC8vIFJldHVybnMgdGhlIGVycm9yIGNvZGUgd2hpY2ggc2hvdWxkIGJlIHJldHVybmVkIGJ5IG1haW4oKS4KLSAgLy8KLSAgLy8gSXQgbWF5IG5vdCBiZSBzYWZlIHRvIGNhbGwgUnVuKCkgaW4gYSBtdWx0aS10aHJlYWRlZCBlbnZpcm9ubWVudCBiZWNhdXNlCi0gIC8vIGl0IGNhbGxzIHN0cmVycm9yKCkuICBJJ20gbm90IHN1cmUgd2h5IHlvdSdkIHdhbnQgdG8gZG8gdGhpcyBhbnl3YXkuCi0gIGludCBSdW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSk7Ci0KLSAgLy8gQ2FsbCBTZXRJbnB1dHNBcmVDd2RSZWxhdGl2ZSh0cnVlKSBpZiB0aGUgaW5wdXQgZmlsZXMgZ2l2ZW4gb24gdGhlIGNvbW1hbmQKLSAgLy8gbGluZSBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgcmVsYXRpdmUgdG8gdGhlIHByb3RvIGltcG9ydCBwYXRoIHNwZWNpZmllZAotICAvLyB1c2luZyAtLXByb3RvX3BhdGggb3IgLUkgZmxhZ3MuICBPdGhlcndpc2UsIGlucHV0IGZpbGUgbmFtZXMgd2lsbCBiZQotICAvLyBpbnRlcnByZXRlZCByZWxhdGl2ZSB0byB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeSAob3IgYXMgYWJzb2x1dGUKLSAgLy8gcGF0aHMgaWYgdGhleSBzdGFydCB3aXRoICcvJyksIHRob3VnaCB0aGV5IG11c3Qgc3RpbGwgcmVzaWRlIGluc2lkZQotICAvLyBhIGRpcmVjdG9yeSBnaXZlbiBieSAtLXByb3RvX3BhdGggb3IgdGhlIGNvbXBpbGVyIHdpbGwgZmFpbC4gIFRoZSBsYXR0ZXIKLSAgLy8gbW9kZSBpcyBnZW5lcmFsbHkgbW9yZSBpbnR1aXRpdmUgYW5kIGVhc2llciB0byB1c2UsIGVzcGVjaWFsbHkgZS5nLiB3aGVuCi0gIC8vIGRlZmluaW5nIGltcGxpY2l0IHJ1bGVzIGluIE1ha2VmaWxlcy4KLSAgdm9pZCBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShib29sIGVuYWJsZSkgewotICAgIGlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV8gPSBlbmFibGU7Ci0gIH0KLQotICAvLyBQcm92aWRlcyBzb21lIHRleHQgd2hpY2ggd2lsbCBiZSBwcmludGVkIHdoZW4gdGhlIC0tdmVyc2lvbiBmbGFnIGlzCi0gIC8vIHVzZWQuICBUaGUgdmVyc2lvbiBvZiBsaWJwcm90b2Mgd2lsbCBhbHNvIGJlIHByaW50ZWQgb24gdGhlIG5leHQgbGluZQotICAvLyBhZnRlciB0aGlzIHRleHQuCi0gIHZvaWQgU2V0VmVyc2lvbkluZm8oY29uc3Qgc3RyaW5nJiB0ZXh0KSB7Ci0gICAgdmVyc2lvbl9pbmZvXyA9IHRleHQ7Ci0gIH0KLQotCi0gcHJpdmF0ZToKLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBjbGFzcyBFcnJvclByaW50ZXI7Ci0gIGNsYXNzIEdlbmVyYXRvckNvbnRleHRJbXBsOwotICBjbGFzcyBNZW1vcnlPdXRwdXRTdHJlYW07Ci0gIHR5cGVkZWYgaGFzaF9tYXA8c3RyaW5nLCBHZW5lcmF0b3JDb250ZXh0SW1wbCo+IEdlbmVyYXRvckNvbnRleHRNYXA7Ci0KLSAgLy8gQ2xlYXIgc3RhdGUgZnJvbSBwcmV2aW91cyBSdW4oKS4KLSAgdm9pZCBDbGVhcigpOwotCi0gIC8vIFJlbWFwcyBlYWNoIGZpbGUgaW4gaW5wdXRfZmlsZXNfIHNvIHRoYXQgaXQgaXMgcmVsYXRpdmUgdG8gb25lIG9mIHRoZQotICAvLyBkaXJlY3RvcmllcyBpbiBwcm90b19wYXRoXy4gIFJldHVybnMgZmFsc2UgaWYgYW4gZXJyb3Igb2NjdXJyZWQuICBUaGlzCi0gIC8vIGlzIG9ubHkgdXNlZCBpZiBpbnB1dHNfYXJlX3Byb3RvX3BhdGhfcmVsYXRpdmVfIGlzIGZhbHNlLgotICBib29sIE1ha2VJbnB1dHNCZVByb3RvUGF0aFJlbGF0aXZlKAotICAgIERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSk7Ci0KLSAgLy8gUmV0dXJuIHN0YXR1cyBmb3IgUGFyc2VBcmd1bWVudHMoKSBhbmQgSW50ZXJwcmV0QXJndW1lbnQoKS4KLSAgZW51bSBQYXJzZUFyZ3VtZW50U3RhdHVzIHsKLSAgICBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9DT05USU5VRSwKLSAgICBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9FWElULAotICAgIFBBUlNFX0FSR1VNRU5UX0ZBSUwKLSAgfTsKLQotICAvLyBQYXJzZSBhbGwgY29tbWFuZC1saW5lIGFyZ3VtZW50cy4KLSAgUGFyc2VBcmd1bWVudFN0YXR1cyBQYXJzZUFyZ3VtZW50cyhpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKTsKLQotCi0gIC8vIFBhcnNlcyBhIGNvbW1hbmQtbGluZSBhcmd1bWVudCBpbnRvIGEgbmFtZS92YWx1ZSBwYWlyLiAgUmV0dXJucwotICAvLyB0cnVlIGlmIHRoZSBuZXh0IGFyZ3VtZW50IGluIHRoZSBhcmd2IHNob3VsZCBiZSB1c2VkIGFzIHRoZSB2YWx1ZSwKLSAgLy8gZmFsc2Ugb3RoZXJ3aXNlLgotICAvLwotICAvLyBFeGFtcGxlczoKLSAgLy8gICAiLUlzcmMvcHJvdG9zIiAtPgotICAvLyAgICAgbmFtZSA9ICItSSIsIHZhbHVlID0gInNyYy9wcm90b3MiCi0gIC8vICAgIi0tY3BwX291dD1zcmMvZm9vLnBiMi5jYyIgLT4KLSAgLy8gICAgIG5hbWUgPSAiLS1jcHBfb3V0IiwgdmFsdWUgPSAic3JjL2Zvby5wYjIuY2MiCi0gIC8vICAgImZvby5wcm90byIgLT4KLSAgLy8gICAgIG5hbWUgPSAiIiwgdmFsdWUgPSAiZm9vLnByb3RvIgotICBib29sIFBhcnNlQXJndW1lbnQoY29uc3QgY2hhciogYXJnLCBzdHJpbmcqIG5hbWUsIHN0cmluZyogdmFsdWUpOwotCi0gIC8vIEludGVycHJldHMgYXJndW1lbnRzIHBhcnNlZCB3aXRoIFBhcnNlQXJndW1lbnQuCi0gIFBhcnNlQXJndW1lbnRTdGF0dXMgSW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpOwotCi0gIC8vIFByaW50IHRoZSAtLWhlbHAgdGV4dCB0byBzdGRlcnIuCi0gIHZvaWQgUHJpbnRIZWxwVGV4dCgpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBnaXZlbiBvdXRwdXQgZmlsZSBmcm9tIHRoZSBnaXZlbiBpbnB1dC4KLSAgc3RydWN0IE91dHB1dERpcmVjdGl2ZTsgIC8vIHNlZSBiZWxvdwotICBib29sIEdlbmVyYXRlT3V0cHV0KGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3V0cHV0RGlyZWN0aXZlJiBvdXRwdXRfZGlyZWN0aXZlLAotICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0KTsKLSAgYm9vbCBHZW5lcmF0ZVBsdWdpbk91dHB1dChjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGx1Z2luX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcik7Ci0KLSAgLy8gSW1wbGVtZW50cyAtLWVuY29kZSBhbmQgLS1kZWNvZGUuCi0gIGJvb2wgRW5jb2RlT3JEZWNvZGUoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpOwotCi0gIC8vIEltcGxlbWVudHMgdGhlIC0tZGVzY3JpcHRvcl9zZXRfb3V0IG9wdGlvbi4KLSAgYm9vbCBXcml0ZURlc2NyaXB0b3JTZXQoY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcGFyc2VkX2ZpbGVzKTsKLQotICAvLyBJbXBsZW1lbnRzIHRoZSAtLWRlcGVuZGVuY3lfb3V0IG9wdGlvbgotICBib29sIEdlbmVyYXRlRGVwZW5kZW5jeU1hbmlmZXN0RmlsZSgKLSAgICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCi0gICAgICBjb25zdCBHZW5lcmF0b3JDb250ZXh0TWFwJiBvdXRwdXRfZGlyZWN0b3JpZXMsCi0gICAgICBEaXNrU291cmNlVHJlZSogc291cmNlX3RyZWUpOwotCi0gIC8vIEdldCBhbGwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIGZpbGUgKGluY2x1ZGluZyB0aGUgZmlsZQotICAvLyBpdHNlbGYpLCBhZGRpbmcgdGhlbSB0byB0aGUgZ2l2ZW4gbGlzdCBvZiBGaWxlRGVzY3JpcHRvclByb3Rvcy4gIFRoZQotICAvLyBwcm90b3Mgd2lsbCBiZSBvcmRlcmVkIHN1Y2ggdGhhdCBldmVyeSBmaWxlIGlzIGxpc3RlZCBiZWZvcmUgYW55IGZpbGUgdGhhdAotICAvLyBkZXBlbmRzIG9uIGl0LCBzbyB0aGF0IHlvdSBjYW4gY2FsbCBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlKCkgb24gdGhlbQotICAvLyBpbiBvcmRlci4gIEFueSBmaWxlcyBpbiAqYWxyZWFkeV9zZWVuIHdpbGwgbm90IGJlIGFkZGVkLCBhbmQgZWFjaCBmaWxlCi0gIC8vIGFkZGVkIHdpbGwgYmUgaW5zZXJ0ZWQgaW50byAqYWxyZWFkeV9zZWVuLiAgSWYgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvIGlzCi0gIC8vIHRydWUgdGhlbiBpbmNsdWRlIHRoZSBzb3VyY2UgY29kZSBpbmZvcm1hdGlvbiBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90b3MuCi0gIC8vIElmIGluY2x1ZGVfanNvbl9uYW1lIGlzIHRydWUsIHBvcHVsYXRlIHRoZSBqc29uX25hbWUgZmllbGQgb2YKLSAgLy8gRmllbGREZXNjcmlwdG9yUHJvdG8gZm9yIGFsbCBmaWVsZHMuCi0gIHN0YXRpYyB2b2lkIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMoCi0gICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgIGJvb2wgaW5jbHVkZV9qc29uX25hbWUsCi0gICAgICBib29sIGluY2x1ZGVfc291cmNlX2NvZGVfaW5mbywKLSAgICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4sCi0gICAgICBSZXBlYXRlZFB0ckZpZWxkPEZpbGVEZXNjcmlwdG9yUHJvdG8+KiBvdXRwdXQpOwotCi0gIC8vIEltcGxlbWVudHMgdGhlIC0tcHJpbnRfZnJlZV9maWVsZF9udW1iZXJzLiBUaGlzIGZ1bmN0aW9uIHByaW50cyBmcmVlIGZpZWxkCi0gIC8vIG51bWJlcnMgaW50byBzdGRvdXQgZm9yIHRoZSBtZXNzYWdlIGFuZCBpdCdzIG5lc3RlZCBtZXNzYWdlIHR5cGVzIGluCi0gIC8vIHBvc3Qtb3JkZXIsIGkuZS4gbmVzdGVkIHR5cGVzIGZpcnN0LiBQcmludGVkIHJhbmdlIGFyZSBsZWZ0LXJpZ2h0Ci0gIC8vIGluY2x1c2l2ZSwgaS5lLiBbYSwgYl0uCi0gIC8vCi0gIC8vIEdyb3VwczoKLSAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZ3JvdXBzIGFyZSBjb25zaWRlcmVkIHRvIHNoYXJlIHRoZSBzYW1lCi0gIC8vIGZpZWxkIG51bWJlciBzcGFjZSB3aXRoIHRoZSBwYXJlbnQgbWVzc2FnZSwgdGh1cyBpdCB3aWxsIG5vdCBwcmludCBmcmVlCi0gIC8vIGZpZWxkIG51bWJlcnMgZm9yIGdyb3Vwcy4gVGhlIGZpZWxkIG51bWJlcnMgdXNlZCBpbiB0aGUgZ3JvdXBzIGFyZQotICAvLyBleGNsdWRlZCBpbiB0aGUgZnJlZSBmaWVsZCBudW1iZXJzIG9mIHRoZSBwYXJlbnQgbWVzc2FnZS4KLSAgLy8KLSAgLy8gRXh0ZW5zaW9uIFJhbmdlczoKLSAgLy8gRXh0ZW5zaW9uIHJhbmdlcyBhcmUgY29uc2lkZXJlZCBvY3VwcGllZCBmaWVsZCBudW1iZXJzIGFuZCB0aGV5IHdpbGwgbm90IGJlCi0gIC8vIGxpc3RlZCBhcyBmcmVlIG51bWJlcnMgaW4gdGhlIG91dHB1dC4KLSAgdm9pZCBQcmludEZyZWVGaWVsZE51bWJlcnMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBUaGUgbmFtZSBvZiB0aGUgZXhlY3V0YWJsZSBhcyBpbnZva2VkIChpLmUuIGFyZ3ZbMF0pLgotICBzdHJpbmcgZXhlY3V0YWJsZV9uYW1lXzsKLQotICAvLyBWZXJzaW9uIGluZm8gc2V0IHdpdGggU2V0VmVyc2lvbkluZm8oKS4KLSAgc3RyaW5nIHZlcnNpb25faW5mb187Ci0KLSAgLy8gUmVnaXN0ZXJlZCBnZW5lcmF0b3JzLgotICBzdHJ1Y3QgR2VuZXJhdG9ySW5mbyB7Ci0gICAgc3RyaW5nIGZsYWdfbmFtZTsKLSAgICBzdHJpbmcgb3B0aW9uX2ZsYWdfbmFtZTsKLSAgICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3I7Ci0gICAgc3RyaW5nIGhlbHBfdGV4dDsKLSAgfTsKLSAgdHlwZWRlZiBtYXA8c3RyaW5nLCBHZW5lcmF0b3JJbmZvPiBHZW5lcmF0b3JNYXA7Ci0gIEdlbmVyYXRvck1hcCBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV87Ci0gIEdlbmVyYXRvck1hcCBnZW5lcmF0b3JzX2J5X29wdGlvbl9uYW1lXzsKLSAgLy8gQSBtYXAgZnJvbSBnZW5lcmF0b3IgbmFtZXMgdG8gdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIHVzaW5nIHRoZSBvcHRpb24KLSAgLy8gZmxhZy4gRm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIGludm9rZXMgdGhlIGNvbXBpbGVyIHdpdGg6Ci0gIC8vICAgcHJvdG9jIC0tZm9vX291dD1vdXRwdXRkaXIgLS1mb29fb3B0PWVuYWJsZV9iYXIgLi4uCi0gIC8vIFRoZW4gdGhlcmUgd2lsbCBiZSBhbiBlbnRyeSAoIi0tZm9vX291dCIsICJlbmFibGVfYmFyIikgaW4gdGhpcyBtYXAuCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gZ2VuZXJhdG9yX3BhcmFtZXRlcnNfOwotCi0gIC8vIFNlZSBBbGxvd1BsdWdpbnMoKS4gIElmIHRoaXMgaXMgZW1wdHksIHBsdWdpbnMgYXJlbid0IGFsbG93ZWQuCi0gIHN0cmluZyBwbHVnaW5fcHJlZml4XzsKLQotICAvLyBNYXBzIHNwZWNpZmljIHBsdWdpbiBuYW1lcyB0byBmaWxlcy4gIFdoZW4gZXhlY3V0aW5nIGEgcGx1Z2luLCB0aGlzIG1hcAotICAvLyBpcyBzZWFyY2hlZCBmaXJzdCB0byBmaW5kIHRoZSBwbHVnaW4gZXhlY3V0YWJsZS4gIElmIG5vdCBmb3VuZCBoZXJlLCB0aGUKLSAgLy8gUEFUSCAob3Igb3RoZXIgT1Mtc3BlY2lmaWMgc2VhcmNoIHN0cmF0ZWd5KSBpcyBzZWFyY2hlZC4KLSAgbWFwPHN0cmluZywgc3RyaW5nPiBwbHVnaW5zXzsKLQotICAvLyBTdHVmZiBwYXJzZWQgZnJvbSBjb21tYW5kIGxpbmUuCi0gIGVudW0gTW9kZSB7Ci0gICAgTU9ERV9DT01QSUxFLCAgLy8gTm9ybWFsIG1vZGU6ICBwYXJzZSAucHJvdG8gZmlsZXMgYW5kIGNvbXBpbGUgdGhlbS4KLSAgICBNT0RFX0VOQ09ERSwgICAvLyAtLWVuY29kZTogIHJlYWQgdGV4dCBmcm9tIHN0ZGluLCB3cml0ZSBiaW5hcnkgdG8gc3Rkb3V0LgotICAgIE1PREVfREVDT0RFLCAgIC8vIC0tZGVjb2RlOiAgcmVhZCBiaW5hcnkgZnJvbSBzdGRpbiwgd3JpdGUgdGV4dCB0byBzdGRvdXQuCi0gICAgTU9ERV9QUklOVCwgICAgLy8gUHJpbnQgbW9kZTogcHJpbnQgaW5mbyBvZiB0aGUgZ2l2ZW4gLnByb3RvIGZpbGVzIGFuZCBleGl0LgotICB9OwotCi0gIE1vZGUgbW9kZV87Ci0KLSAgZW51bSBQcmludE1vZGUgewotICAgIFBSSU5UX05PTkUsICAgICAgICAgICAgICAgLy8gTm90IGluIE1PREVfUFJJTlQKLSAgICBQUklOVF9GUkVFX0ZJRUxEUywgICAgICAgIC8vIC0tcHJpbnRfZnJlZV9maWVsZHMKLSAgfTsKLQotICBQcmludE1vZGUgcHJpbnRfbW9kZV87Ci0KLSAgZW51bSBFcnJvckZvcm1hdCB7Ci0gICAgRVJST1JfRk9STUFUX0dDQywgICAvLyBHQ0MgZXJyb3Igb3V0cHV0IGZvcm1hdCAoZGVmYXVsdCkuCi0gICAgRVJST1JfRk9STUFUX01TVlMgICAvLyBWaXN1YWwgU3R1ZGlvIG91dHB1dCAoLS1lcnJvcl9mb3JtYXQ9bXN2cykuCi0gIH07Ci0KLSAgRXJyb3JGb3JtYXQgZXJyb3JfZm9ybWF0XzsKLQotICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBwcm90b19wYXRoXzsgIC8vIFNlYXJjaCBwYXRoIGZvciBwcm90byBmaWxlcy4KLSAgdmVjdG9yPHN0cmluZz4gaW5wdXRfZmlsZXNfOyAgICAgICAgICAgICAgICAvLyBOYW1lcyBvZiB0aGUgaW5wdXQgcHJvdG8gZmlsZXMuCi0KLSAgLy8gb3V0cHV0X2RpcmVjdGl2ZXNfIGxpc3RzIGFsbCB0aGUgZmlsZXMgd2UgYXJlIHN1cHBvc2VkIHRvIG91dHB1dCBhbmQgd2hhdAotICAvLyBnZW5lcmF0b3IgdG8gdXNlIGZvciBlYWNoLgotICBzdHJ1Y3QgT3V0cHV0RGlyZWN0aXZlIHsKLSAgICBzdHJpbmcgbmFtZTsgICAgICAgICAgICAgICAgLy8gRS5nLiAiLS1mb29fb3V0IgotICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvcjsgICAvLyBOVUxMIGZvciBwbHVnaW5zCi0gICAgc3RyaW5nIHBhcmFtZXRlcjsKLSAgICBzdHJpbmcgb3V0cHV0X2xvY2F0aW9uOwotICB9OwotICB2ZWN0b3I8T3V0cHV0RGlyZWN0aXZlPiBvdXRwdXRfZGlyZWN0aXZlc187Ci0KLSAgLy8gV2hlbiB1c2luZyAtLWVuY29kZSBvciAtLWRlY29kZSwgdGhpcyBuYW1lcyB0aGUgdHlwZSB3ZSBhcmUgZW5jb2Rpbmcgb3IKLSAgLy8gZGVjb2RpbmcuICAoRW1wdHkgc3RyaW5nIGluZGljYXRlcyAtLWRlY29kZV9yYXcuKQotICBzdHJpbmcgY29kZWNfdHlwZV87Ci0KLSAgLy8gSWYgLS1kZXNjcmlwdG9yX3NldF9vdXQgd2FzIGdpdmVuLCB0aGlzIGlzIHRoZSBmaWxlbmFtZSB0byB3aGljaCB0aGUKLSAgLy8gRmlsZURlc2NyaXB0b3JTZXQgc2hvdWxkIGJlIHdyaXR0ZW4uICBPdGhlcndpc2UsIGVtcHR5LgotICBzdHJpbmcgZGVzY3JpcHRvcl9zZXRfbmFtZV87Ci0KLSAgLy8gSWYgLS1kZXBlbmRlbmN5X291dCB3YXMgZ2l2ZW4sIHRoaXMgaXMgdGhlIHBhdGggdG8gdGhlIGZpbGUgd2hlcmUgdGhlCi0gIC8vIGRlcGVuZGVuY3kgZmlsZSB3aWxsIGJlIHdyaXR0ZW4uIE90aGVyd2lzZSwgZW1wdHkuCi0gIHN0cmluZyBkZXBlbmRlbmN5X291dF9uYW1lXzsKLQotICAvLyBUcnVlIGlmIC0taW5jbHVkZV9pbXBvcnRzIHdhcyBnaXZlbiwgbWVhbmluZyB0aGF0IHdlIHNob3VsZAotICAvLyB3cml0ZSBhbGwgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMgdG8gdGhlIERlc2NyaXB0b3JTZXQuICBPdGhlcndpc2UsIG9ubHkKLSAgLy8gdGhlIC5wcm90byBmaWxlcyBsaXN0ZWQgb24gdGhlIGNvbW1hbmQtbGluZSBhcmUgYWRkZWQuCi0gIGJvb2wgaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF87Ci0KLSAgLy8gVHJ1ZSBpZiAtLWluY2x1ZGVfc291cmNlX2luZm8gd2FzIGdpdmVuLCBtZWFuaW5nIHRoYXQgd2Ugc2hvdWxkIG5vdCBzdHJpcAotICAvLyBTb3VyY2VDb2RlSW5mbyBmcm9tIHRoZSBEZXNjcmlwdG9yU2V0LgotICBib29sIHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XzsKLQotICAvLyBXYXMgdGhlIC0tZGlzYWxsb3dfc2VydmljZXMgZmxhZyB1c2VkPwotICBib29sIGRpc2FsbG93X3NlcnZpY2VzXzsKLQotICAvLyBTZWUgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoKS4KLSAgYm9vbCBpbnB1dHNfYXJlX3Byb3RvX3BhdGhfcmVsYXRpdmVfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb21tYW5kTGluZUludGVyZmFjZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT01NQU5EX0xJTkVfSU5URVJGQUNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YjUwNGQyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4MzQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8c3lzL3R5cGVzLmg+Ci0jaW5jbHVkZSA8c3lzL3N0YXQuaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSA8aW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotCi0vLyBEaXNhYmxlIHRoZSB3aG9sZSB0ZXN0IHdoZW4gd2UgdXNlIHRjbWFsbG9jIGZvciAiZHJhY29uaWFuIiBoZWFwIGNoZWNrcywgaW4KLS8vIHdoaWNoIGNhc2UgdGNtYWxsb2Mgd2lsbCBwcmludCB3YXJuaW5ncyB0aGF0IGZhaWwgdGhlIHBsdWdpbiB0ZXN0cy4KLSNpZiAhR09PR0xFX1BST1RPQlVGX0hFQVBfQ0hFQ0tfRFJBQ09OSUFOCi0KLSNpZiBkZWZpbmVkKF9XSU4zMikKLSNpZm5kZWYgU1RESU5fRklMRU5PCi0jZGVmaW5lIFNURElOX0ZJTEVOTyAwCi0jZW5kaWYKLSNpZm5kZWYgU1RET1VUX0ZJTEVOTwotI2RlZmluZSBTVERPVVRfRklMRU5PIDEKLSNlbmRpZgotI2lmbmRlZiBGX09LCi0jZGVmaW5lIEZfT0sgMDAgIC8vIG5vdCBkZWZpbmVkIGJ5IE1TVkMgZm9yIHdoYXRldmVyIHJlYXNvbgotI2VuZGlmCi0jZW5kaWYKLQotbmFtZXNwYWNlIHsKLQotYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0cmluZyYgcGF0aCkgewotICByZXR1cm4gRmlsZTo6RXhpc3RzKHBhdGgpOwotfQotCi1jbGFzcyBDb21tYW5kTGluZUludGVyZmFjZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKTsKLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCk7Ci0KLSAgLy8gUnVucyB0aGUgQ29tbWFuZExpbmVJbnRlcmZhY2Ugd2l0aCB0aGUgZ2l2ZW4gY29tbWFuZCBsaW5lLiAgVGhlCi0gIC8vIGNvbW1hbmQgaXMgYXV0b21hdGljYWxseSBzcGxpdCBvbiBzcGFjZXMsIGFuZCB0aGUgc3RyaW5nICIkdG1wZGlyIgotICAvLyBpcyByZXBsYWNlZCB3aXRoIFRlc3RUZW1wRGlyKCkuCi0gIHZvaWQgUnVuKGNvbnN0IHN0cmluZyYgY29tbWFuZCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gTWV0aG9kcyB0byBzZXQgdXAgdGhlIHRlc3QgKGNhbGxlZCBiZWZvcmUgUnVuKCkpLgotCi0gIGNsYXNzIE51bGxDb2RlR2VuZXJhdG9yOwotCi0gIC8vIE5vcm1hbGx5IHBsdWdpbnMgYXJlIGFsbG93ZWQgZm9yIGFsbCB0ZXN0cy4gIENhbGwgdGhpcyB0byBleHBsaWNpdGx5Ci0gIC8vIGRpc2FibGUgdGhlbS4KLSAgdm9pZCBEaXNhbGxvd1BsdWdpbnMoKSB7IGRpc2FsbG93X3BsdWdpbnNfID0gdHJ1ZTsgfQotCi0gIC8vIENyZWF0ZSBhIHRlbXAgZmlsZSB3aXRoaW4gdGVtcF9kaXJlY3RvcnlfIHdpdGggdGhlIGdpdmVuIG5hbWUuCi0gIC8vIFRoZSBjb250YWluaW5nIGRpcmVjdG9yeSBpcyBhbHNvIGNyZWF0ZWQgaWYgbmVjZXNzYXJ5LgotICB2b2lkIENyZWF0ZVRlbXBGaWxlKGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiBjb250ZW50cyk7Ci0KLSAgLy8gQ3JlYXRlIGEgc3ViZGlyZWN0b3J5IHdpdGhpbiB0ZW1wX2RpcmVjdG9yeV8uCi0gIHZvaWQgQ3JlYXRlVGVtcERpcihjb25zdCBzdHJpbmcmIG5hbWUpOwotCi0jaWZkZWYgUFJPVE9CVUZfT1BFTlNPVVJDRQotICAvLyBDaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkgdG8gdGVtcCBkaXJlY3RvcnkuCi0gIHZvaWQgU3dpdGNoVG9UZW1wRGlyZWN0b3J5KCkgewotICAgIEZpbGU6OkNoYW5nZVdvcmtpbmdEaXJlY3RvcnkodGVtcF9kaXJlY3RvcnlfKTsKLSAgfQotI2Vsc2UgIC8vICFQUk9UT0JVRl9PUEVOU09VUkNFCi0gIC8vIFRPRE8odGVib3JpbmcpOiBGaWd1cmUgb3V0IGhvdyB0byBjaGFuZ2UgYW5kIGdldCB3b3JraW5nIGRpcmVjdG9yeSBpbgotICAvLyBnb29nbGUzLgotI2VuZGlmICAvLyAhUFJPVE9CVUZfT1BFTlNPVVJDRQotCi0gIHZvaWQgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoYm9vbCBlbmFibGUpIHsKLSAgICBjbGlfLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGVuYWJsZSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBNZXRob2RzIHRvIGNoZWNrIHRoZSB0ZXN0IHJlc3VsdHMgKGNhbGxlZCBhZnRlciBSdW4oKSkuCi0KLSAgLy8gQ2hlY2tzIHRoYXQgbm8gdGV4dCB3YXMgd3JpdHRlbiB0byBzdGRlcnIgZHVyaW5nIFJ1bigpLCBhbmQgUnVuKCkKLSAgLy8gcmV0dXJuZWQgMC4KLSAgdm9pZCBFeHBlY3ROb0Vycm9ycygpOwotCi0gIC8vIENoZWNrcyB0aGF0IFJ1bigpIHJldHVybmVkIG5vbi16ZXJvIGFuZCB0aGUgc3RkZXJyIG91dHB1dCBpcyBleGFjdGx5Ci0gIC8vIHRoZSB0ZXh0IGdpdmVuLiAgZXhwZWN0ZWRfdGVzdCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvICIkdG1wZGlyIiwKLSAgLy8gd2hpY2ggd2lsbCBiZSByZXBsYWNlZCBieSB0aGUgdGVtcG9yYXJ5IGRpcmVjdG9yeSBwYXRoLgotICB2b2lkIEV4cGVjdEVycm9yVGV4dChjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3RleHQpOwotCi0gIC8vIENoZWNrcyB0aGF0IFJ1bigpIHJldHVybmVkIG5vbi16ZXJvIGFuZCB0aGUgc3RkZXJyIGNvbnRhaW5zIHRoZSBnaXZlbgotICAvLyBzdWJzdHJpbmcuCi0gIHZvaWQgRXhwZWN0RXJyb3JTdWJzdHJpbmcoY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpOwotCi0gIC8vIExpa2UgRXhwZWN0RXJyb3JTdWJzdHJpbmcsIGJ1dCBjaGVja3MgdGhhdCBSdW4oKSByZXR1cm5lZCB6ZXJvLgotICB2b2lkIEV4cGVjdEVycm9yU3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKAotICAgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpOwotCi0gIC8vIENoZWNrcyB0aGF0IHRoZSBjYXB0dXJlZCBzdGRvdXQgaXMgdGhlIHNhbWUgYXMgdGhlIGV4cGVjdGVkX3RleHQuCi0gIHZvaWQgRXhwZWN0Q2FwdHVyZWRTdGRvdXQoY29uc3Qgc3RyaW5nJiBleHBlY3RlZF90ZXh0KTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgRXhwZWN0RXJyb3JTdWJzdHJpbmcoZXhwZWN0ZWRfc3Vic3RyaW5nKSB3b3VsZCBwYXNzLCBidXQKLSAgLy8gZG9lcyBub3QgZmFpbCBvdGhlcndpc2UuCi0gIGJvb2wgSGFzQWx0ZXJuYXRlRXJyb3JTdWJzdHJpbmcoY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpOwotCi0gIC8vIENoZWNrcyB0aGF0IE1vY2tDb2RlR2VuZXJhdG9yOjpHZW5lcmF0ZSgpIHdhcyBjYWxsZWQgaW4gdGhlIGdpdmVuCi0gIC8vIGNvbnRleHQgKG9yIHRoZSBnZW5lcmF0b3IgaW4gdGVzdF9wbHVnaW4uY2MsIHdoaWNoIHByb2R1Y2VzIHRoZSBzYW1lCi0gIC8vIG91dHB1dCkuICBUaGF0IGlzLCB0aGlzIHRlc3RzIGlmIHRoZSBnZW5lcmF0b3Igd2l0aCB0aGUgZ2l2ZW4gbmFtZQotICAvLyB3YXMgY2FsbGVkIHdpdGggdGhlIGdpdmVuIHBhcmFtZXRlciBhbmQgcHJvdG8gZmlsZSBhbmQgcHJvZHVjZWQgdGhlCi0gIC8vIGdpdmVuIG91dHB1dCBmaWxlLiAgVGhpcyBpcyBjaGVja2VkIGJ5IHJlYWRpbmcgdGhlIG91dHB1dCBmaWxlIGFuZAotICAvLyBjaGVja2luZyB0aGF0IGl0IGNvbnRhaW5zIHRoZSBjb250ZW50IHRoYXQgTW9ja0NvZGVHZW5lcmF0b3Igd291bGQKLSAgLy8gZ2VuZXJhdGUgZ2l2ZW4gdGhlc2UgaW5wdXRzLiAgbWVzc2FnZV9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdAotICAvLyBtZXNzYWdlIHRoYXQgYXBwZWFyZWQgaW4gdGhlIHByb3RvIGZpbGU7IHRoaXMgaXMganVzdCB0byBtYWtlIGV4dHJhCi0gIC8vIHN1cmUgdGhhdCB0aGUgY29ycmVjdCBmaWxlIHdhcyBwYXJzZWQuCi0gIHZvaWQgRXhwZWN0R2VuZXJhdGVkKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByb3RvX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lKTsKLSAgdm9pZCBFeHBlY3RHZW5lcmF0ZWQoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3V0cHV0X2RpcmVjdG9yeSk7Ci0gIHZvaWQgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgYWxsX3Byb3RvX25hbWVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByb3RvX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lKTsKLSAgdm9pZCBFeHBlY3RHZW5lcmF0ZWRXaXRoSW5zZXJ0aW9ucyhjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByb3RvX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlX25hbWUpOwotCi0gIHZvaWQgRXhwZWN0TnVsbENvZGVHZW5lcmF0b3JDYWxsZWQoY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIpOwotCi0gIHZvaWQgUmVhZERlc2NyaXB0b3JTZXQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclNldCogZGVzY3JpcHRvcl9zZXQpOwotCi0gIHZvaWQgRXhwZWN0RmlsZUNvbnRlbnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGNvbnRlbnQpOwotCi0gcHJpdmF0ZToKLSAgLy8gVGhlIG9iamVjdCB3ZSBhcmUgdGVzdGluZy4KLSAgQ29tbWFuZExpbmVJbnRlcmZhY2UgY2xpXzsKLQotICAvLyBXYXMgRGlzYWxsb3dQbHVnaW5zKCkgY2FsbGVkPwotICBib29sIGRpc2FsbG93X3BsdWdpbnNfOwotCi0gIC8vIFdlIGNyZWF0ZSBhIGRpcmVjdG9yeSB3aXRoaW4gVGVzdFRlbXBEaXIoKSBpbiBvcmRlciB0byBhZGQgZXh0cmEKLSAgLy8gcHJvdGVjdGlvbiBhZ2FpbnN0IGFjY2lkZW50YWxseSBkZWxldGluZyB1c2VyIGZpbGVzIChzaW5jZSB3ZSByZWN1cnNpdmVseQotICAvLyBkZWxldGUgdGhpcyBkaXJlY3RvcnkgZHVyaW5nIHRoZSB0ZXN0KS4gIFRoaXMgaXMgdGhlIGZ1bGwgcGF0aCBvZiB0aGF0Ci0gIC8vIGRpcmVjdG9yeS4KLSAgc3RyaW5nIHRlbXBfZGlyZWN0b3J5XzsKLQotICAvLyBUaGUgcmVzdWx0IG9mIFJ1bigpLgotICBpbnQgcmV0dXJuX2NvZGVfOwotCi0gIC8vIFRoZSBjYXB0dXJlZCBzdGRlcnIgb3V0cHV0LgotICBzdHJpbmcgZXJyb3JfdGV4dF87Ci0KLSAgLy8gVGhlIGNhcHR1cmVkIHN0ZG91dC4KLSAgc3RyaW5nIGNhcHR1cmVkX3N0ZG91dF87Ci0KLSAgLy8gUG9pbnRlcnMgd2hpY2ggbmVlZCB0byBiZSBkZWxldGVkIGxhdGVyLgotICB2ZWN0b3I8Q29kZUdlbmVyYXRvcio+IG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfOwotCi0gIE51bGxDb2RlR2VuZXJhdG9yKiBudWxsX2dlbmVyYXRvcl87Ci19OwotCi1jbGFzcyBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6Ok51bGxDb2RlR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgTnVsbENvZGVHZW5lcmF0b3IoKSA6IGNhbGxlZF8oZmFsc2UpIHt9Ci0gIH5OdWxsQ29kZUdlbmVyYXRvcigpIHt9Ci0KLSAgbXV0YWJsZSBib29sIGNhbGxlZF87Ci0gIG11dGFibGUgc3RyaW5nIHBhcmFtZXRlcl87Ci0KLSAgLy8gaW1wbGVtZW50cyBDb2RlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKLSAgICBjYWxsZWRfID0gdHJ1ZTsKLSAgICBwYXJhbWV0ZXJfID0gcGFyYW1ldGVyOwotICAgIHJldHVybiB0cnVlOwotICB9Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpTZXRVcCgpIHsKLSAgLy8gTW9zdCBvZiB0aGVzZSB0ZXN0cyB3ZXJlIHdyaXR0ZW4gYmVmb3JlIHRoaXMgb3B0aW9uIHdhcyBhZGRlZCwgc28gd2UKLSAgLy8gcnVuIHdpdGggdGhlIG9wdGlvbiBvbiAod2hpY2ggdXNlZCB0byBiZSB0aGUgb25seSB3YXkpIGV4Y2VwdCBpbiBjZXJ0YWluCi0gIC8vIHRlc3RzIHdoZXJlIHdlIHR1cm4gaXQgb2ZmLgotICBjbGlfLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOwotCi0gIHRlbXBfZGlyZWN0b3J5XyA9IFRlc3RUZW1wRGlyKCkgKyAiL3Byb3RvMl9jbGlfdGVzdF90ZW1wIjsKLQotICAvLyBJZiB0aGUgdGVtcCBkaXJlY3RvcnkgYWxyZWFkeSBleGlzdHMsIGl0IG11c3QgYmUgbGVmdCBvdmVyIGZyb20gYQotICAvLyBwcmV2aW91cyBydW4uICBEZWxldGUgaXQuCi0gIGlmIChGaWxlRXhpc3RzKHRlbXBfZGlyZWN0b3J5XykpIHsKLSAgICBGaWxlOjpEZWxldGVSZWN1cnNpdmVseSh0ZW1wX2RpcmVjdG9yeV8sIE5VTEwsIE5VTEwpOwotICB9Ci0KLSAgLy8gQ3JlYXRlIHRoZSB0ZW1wIGRpcmVjdG9yeS4KLSAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkNyZWF0ZURpcih0ZW1wX2RpcmVjdG9yeV8sIDA3NzcpKTsKLQotICAvLyBSZWdpc3RlciBnZW5lcmF0b3JzLgotICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBuZXcgTW9ja0NvZGVHZW5lcmF0b3IoInRlc3RfZ2VuZXJhdG9yIik7Ci0gIG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfLnB1c2hfYmFjayhnZW5lcmF0b3IpOwotICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXRlc3Rfb3V0IiwgIi0tdGVzdF9vcHQiLCBnZW5lcmF0b3IsICJUZXN0IG91dHB1dC4iKTsKLSAgY2xpXy5SZWdpc3RlckdlbmVyYXRvcigiLXQiLCBnZW5lcmF0b3IsICJUZXN0IG91dHB1dC4iKTsKLQotICBnZW5lcmF0b3IgPSBuZXcgTW9ja0NvZGVHZW5lcmF0b3IoImFsdF9nZW5lcmF0b3IiKTsKLSAgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGdlbmVyYXRvcik7Ci0gIGNsaV8uUmVnaXN0ZXJHZW5lcmF0b3IoIi0tYWx0X291dCIsIGdlbmVyYXRvciwgIkFsdCBvdXRwdXQuIik7Ci0KLSAgZ2VuZXJhdG9yID0gbnVsbF9nZW5lcmF0b3JfID0gbmV3IE51bGxDb2RlR2VuZXJhdG9yKCk7Ci0gIG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfLnB1c2hfYmFjayhnZW5lcmF0b3IpOwotICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItLW51bGxfb3V0IiwgZ2VuZXJhdG9yLCAiTnVsbCBvdXRwdXQuIik7Ci0KLSAgZGlzYWxsb3dfcGx1Z2luc18gPSBmYWxzZTsKLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OlRlYXJEb3duKCkgewotICAvLyBEZWxldGUgdGhlIHRlbXAgZGlyZWN0b3J5LgotICBpZiAoRmlsZUV4aXN0cyh0ZW1wX2RpcmVjdG9yeV8pKSB7Ci0gICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkodGVtcF9kaXJlY3RvcnlfLCBOVUxMLCBOVUxMKTsKLSAgfQotCi0gIC8vIERlbGV0ZSBhbGwgdGhlIE1vY2tDb2RlR2VuZXJhdG9ycy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5zaXplKCk7IGkrKykgewotICAgIGRlbGV0ZSBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlX1tpXTsKLSAgfQotICBtb2NrX2dlbmVyYXRvcnNfdG9fZGVsZXRlXy5jbGVhcigpOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6UnVuKGNvbnN0IHN0cmluZyYgY29tbWFuZCkgewotICB2ZWN0b3I8c3RyaW5nPiBhcmdzID0gU3BsaXQoY29tbWFuZCwgIiAiLCB0cnVlKTsKLQotICBpZiAoIWRpc2FsbG93X3BsdWdpbnNfKSB7Ci0gICAgY2xpXy5BbGxvd1BsdWdpbnMoInByZWZpeC0iKTsKLSNpZm5kZWYgR09PR0xFX1RISVJEX1BBUlRZX1BST1RPQlVGCi0gICAgc3RyaW5nIHBsdWdpbl9wYXRoOwotI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9URVNUX1BMVUdJTl9QQVRICi0gICAgcGx1Z2luX3BhdGggPSBHT09HTEVfUFJPVE9CVUZfVEVTVF9QTFVHSU5fUEFUSDsKLSNlbHNlCi0gICAgY29uc3QgY2hhciogcG9zc2libGVfcGF0aHNbXSA9IHsKLSAgICAgIC8vIFdoZW4gYnVpbGRpbmcgd2l0aCBzaGFyZWQgbGlicmFyaWVzLCBsaWJ0b29sIGhpZGVzIHRoZSByZWFsIGV4ZWN1dGFibGUKLSAgICAgIC8vIGluIC5saWJzIGFuZCBwdXRzIGEgZmFrZSB3cmFwcGVyIGluIHRoZSBjdXJyZW50IGRpcmVjdG9yeS4KLSAgICAgIC8vIFVuZm9ydHVuYXRlbHksIGR1ZSB0byBhbiBhcHBhcmVudCBidWcgb24gQ3lnd2luL01pbkdXLCBpZiBvbmUgcHJvZ3JhbQotICAgICAgLy8gd3JhcHBlZCBpbiB0aGlzIHdheSAoZS5nLiBwcm90b2J1Zi10ZXN0cy5leGUpIHRyaWVzIHRvIGV4ZWN1dGUgYW5vdGhlcgotICAgICAgLy8gcHJvZ3JhbSB3cmFwcGVkIGluIHRoaXMgd2F5IChlLmcuIHRlc3RfcGx1Z2luLmV4ZSksIHRoZSBsYXR0ZXIgZmFpbHMKLSAgICAgIC8vIHdpdGggZXJyb3IgY29kZSAxMjcgYW5kIG5vIGV4cGxhbmF0aW9uIG1lc3NhZ2UuICBQcmVzdW1hYmx5IHRoZSBwcm9ibGVtCi0gICAgICAvLyBpcyB0aGF0IHRoZSB3cmFwcGVyIGZvciBwcm90b2J1Zi10ZXN0cy5leGUgc2V0IHNvbWUgZW52aXJvbm1lbnQKLSAgICAgIC8vIHZhcmlhYmxlcyB0aGF0IGNvbmZ1c2UgdGhlIHdyYXBwZXIgZm9yIHRlc3RfcGx1Z2luLmV4ZS4gIEx1Y2tpbHksIGl0Ci0gICAgICAvLyB0dXJucyBvdXQgdGhhdCBpZiB3ZSBzaW1wbHkgaW52b2tlIHRoZSB3cmFwcGVkIHRlc3RfcGx1Z2luLmV4ZQotICAgICAgLy8gZGlyZWN0bHksIGl0IHdvcmtzIC0tIEkgZ3Vlc3MgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlcyBzZXQgYnkgdGhlCi0gICAgICAvLyBwcm90b2J1Zi10ZXN0cy5leGUgd3JhcHBlciBoYXBwZW4gdG8gYmUgY29ycmVjdCBmb3IgaXQgdG9vLiAgU28gd2UgZG8KLSAgICAgIC8vIHRoYXQuCi0gICAgICAiLmxpYnMvdGVzdF9wbHVnaW4uZXhlIiwgIC8vIFdpbjMyIHcvYXV0b3Rvb2wgKEN5Z3dpbiAvIE1pbkdXKQotICAgICAgInRlc3RfcGx1Z2luLmV4ZSIsICAgICAgICAvLyBPdGhlciBXaW4zMiAoTVNWQykKLSAgICAgICJ0ZXN0X3BsdWdpbiIsICAgICAgICAgICAgLy8gVW5peAotICAgIH07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKHBvc3NpYmxlX3BhdGhzKTsgaSsrKSB7Ci0gICAgICBpZiAoYWNjZXNzKHBvc3NpYmxlX3BhdGhzW2ldLCBGX09LKSA9PSAwKSB7Ci0gICAgICAgIHBsdWdpbl9wYXRoID0gcG9zc2libGVfcGF0aHNbaV07Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSNlbmRpZgotCi0gICAgaWYgKHBsdWdpbl9wYXRoLmVtcHR5KCkpIHsKLSNlbHNlCi0gICAgc3RyaW5nIHBsdWdpbl9wYXRoID0gInRoaXJkX3BhcnR5L3Byb3RvYnVmL3Rlc3RfcGx1Z2luIjsKLQotICAgIGlmIChhY2Nlc3MocGx1Z2luX3BhdGguY19zdHIoKSwgRl9PSykgIT0gMCkgewotI2VuZGlmICAvLyBHT09HTEVfVEhJUkRfUEFSVFlfUFJPVE9CVUYKLSAgICAgIEdPT0dMRV9MT0coRVJST1IpCi0gICAgICAgICAgPDwgIlBsdWdpbiBleGVjdXRhYmxlIG5vdCBmb3VuZC4gIFBsdWdpbiB0ZXN0cyBhcmUgbGlrZWx5IHRvIGZhaWwuIjsKLSAgICB9IGVsc2UgewotICAgICAgYXJncy5wdXNoX2JhY2soIi0tcGx1Z2luPXByZWZpeC1nZW4tcGx1Zz0iICsgcGx1Z2luX3BhdGgpOwotICAgIH0KLSAgfQotCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBjaGFyICogPiBhcmd2KG5ldyBjb25zdCBjaGFyKiBbYXJncy5zaXplKCldKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKLSAgICBhcmdzW2ldID0gU3RyaW5nUmVwbGFjZShhcmdzW2ldLCAiJHRtcGRpciIsIHRlbXBfZGlyZWN0b3J5XywgdHJ1ZSk7Ci0gICAgYXJndltpXSA9IGFyZ3NbaV0uY19zdHIoKTsKLSAgfQotCi0gIC8vIFRPRE8oamllbHVvKTogQ3lnd2luIGRvZXNuJ3Qgd29yayB3ZWxsIGlmIHdlIHRyeSB0byBjYXB0dXJlIHN0ZGVyciBhbmQKLSAgLy8gc3Rkb3V0IGF0IHRoZSBzYW1lIHRpbWUuIE5lZWQgdG8gZmlndXJlIG91dCB3aHkgYW5kIGFkZCB0aGlzIGNhcHR1cmUgYmFjawotICAvLyBmb3IgQ3lnd2luLgotI2lmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0gIENhcHR1cmVUZXN0U3Rkb3V0KCk7Ci0jZW5kaWYKLSAgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKLQotICByZXR1cm5fY29kZV8gPSBjbGlfLlJ1bihhcmdzLnNpemUoKSwgYXJndi5nZXQoKSk7Ci0KLSAgZXJyb3JfdGV4dF8gPSBHZXRDYXB0dXJlZFRlc3RTdGRlcnIoKTsKLSNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICBjYXB0dXJlZF9zdGRvdXRfID0gR2V0Q2FwdHVyZWRUZXN0U3Rkb3V0KCk7Ci0jZW5kaWYKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6Q3JlYXRlVGVtcEZpbGUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgIGNvbnN0IHN0cmluZyYgY29udGVudHMpIHsKLSAgLy8gQ3JlYXRlIHBhcmVudCBkaXJlY3RvcnksIGlmIG5lY2Vzc2FyeS4KLSAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2hfcG9zID0gbmFtZS5maW5kX2xhc3Rfb2YoJy8nKTsKLSAgaWYgKHNsYXNoX3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdHJpbmcgZGlyID0gbmFtZS5zdWJzdHIoMCwgc2xhc2hfcG9zKTsKLSAgICBpZiAoIUZpbGVFeGlzdHModGVtcF9kaXJlY3RvcnlfICsgIi8iICsgZGlyKSkgewotICAgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKHRlbXBfZGlyZWN0b3J5XyArICIvIiArIGRpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA3NzcpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBXcml0ZSBmaWxlLgotICBzdHJpbmcgZnVsbF9uYW1lID0gdGVtcF9kaXJlY3RvcnlfICsgIi8iICsgbmFtZTsKLSAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlNldENvbnRlbnRzKAotICAgICAgZnVsbF9uYW1lLCBTdHJpbmdSZXBsYWNlKGNvbnRlbnRzLCAiJHRtcGRpciIsIHRlbXBfZGlyZWN0b3J5XywgdHJ1ZSksCi0gICAgICB0cnVlKSk7Ci19Ci0KLXZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpDcmVhdGVUZW1wRGlyKGNvbnN0IHN0cmluZyYgbmFtZSkgewotICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6UmVjdXJzaXZlbHlDcmVhdGVEaXIodGVtcF9kaXJlY3RvcnlfICsgIi8iICsgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDc3NykpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpFeHBlY3ROb0Vycm9ycygpIHsKLSAgRVhQRUNUX0VRKDAsIHJldHVybl9jb2RlXyk7Ci0gIEVYUEVDVF9FUSgiIiwgZXJyb3JfdGV4dF8pOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JUZXh0KGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgewotICBFWFBFQ1RfTkUoMCwgcmV0dXJuX2NvZGVfKTsKLSAgRVhQRUNUX0VRKFN0cmluZ1JlcGxhY2UoZXhwZWN0ZWRfdGV4dCwgIiR0bXBkaXIiLCB0ZW1wX2RpcmVjdG9yeV8sIHRydWUpLAotICAgICAgICAgICAgZXJyb3JfdGV4dF8pOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JTdWJzdHJpbmcoCi0gICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKLSAgRVhQRUNUX05FKDAsIHJldHVybl9jb2RlXyk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIGV4cGVjdGVkX3N1YnN0cmluZywgZXJyb3JfdGV4dF8pOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoCi0gICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKLSAgRVhQRUNUX0VRKDAsIHJldHVybl9jb2RlXyk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIGV4cGVjdGVkX3N1YnN0cmluZywgZXJyb3JfdGV4dF8pOwotfQotCi1ib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6SGFzQWx0ZXJuYXRlRXJyb3JTdWJzdHJpbmcoCi0gICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKLSAgRVhQRUNUX05FKDAsIHJldHVybl9jb2RlXyk7Ci0gIHJldHVybiBlcnJvcl90ZXh0Xy5maW5kKGV4cGVjdGVkX3N1YnN0cmluZykgIT0gc3RyaW5nOjpucG9zOwotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0R2VuZXJhdGVkKAotICAgIGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCi0gICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgY29uc3Qgc3RyaW5nJiBwcm90b19uYW1lLAotICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZV9uYW1lKSB7Ci0gIE1vY2tDb2RlR2VuZXJhdG9yOjpFeHBlY3RHZW5lcmF0ZWQoCi0gICAgICBnZW5lcmF0b3JfbmFtZSwgcGFyYW1ldGVyLCAiIiwgcHJvdG9fbmFtZSwgbWVzc2FnZV9uYW1lLCBwcm90b19uYW1lLAotICAgICAgdGVtcF9kaXJlY3RvcnlfKTsKLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEdlbmVyYXRlZCgKLSAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAotICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKLSAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSwKLSAgICBjb25zdCBzdHJpbmcmIG91dHB1dF9kaXJlY3RvcnkpIHsKLSAgTW9ja0NvZGVHZW5lcmF0b3I6OkV4cGVjdEdlbmVyYXRlZCgKLSAgICAgIGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsICIiLCBwcm90b19uYW1lLCBtZXNzYWdlX25hbWUsIHByb3RvX25hbWUsCi0gICAgICB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBvdXRwdXRfZGlyZWN0b3J5KTsKLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygKLSAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgIGNvbnN0IHN0cmluZyYgYWxsX3Byb3RvX25hbWVzLAotICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKLSAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSkgewotICBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKAotICAgICAgZ2VuZXJhdG9yX25hbWUsICIiLCAiIiwgcHJvdG9fbmFtZSwgbWVzc2FnZV9uYW1lLAotICAgICAgYWxsX3Byb3RvX25hbWVzLAotICAgICAgdGVtcF9kaXJlY3RvcnlfKTsKLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEdlbmVyYXRlZFdpdGhJbnNlcnRpb25zKAotICAgIGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCi0gICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25zLAotICAgIGNvbnN0IHN0cmluZyYgcHJvdG9fbmFtZSwKLSAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2VfbmFtZSkgewotICBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKAotICAgICAgZ2VuZXJhdG9yX25hbWUsIHBhcmFtZXRlciwgaW5zZXJ0aW9ucywgcHJvdG9fbmFtZSwgbWVzc2FnZV9uYW1lLAotICAgICAgcHJvdG9fbmFtZSwgdGVtcF9kaXJlY3RvcnlfKTsKLX0KLQotdm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdE51bGxDb2RlR2VuZXJhdG9yQ2FsbGVkKAotICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyKSB7Ci0gIEVYUEVDVF9UUlVFKG51bGxfZ2VuZXJhdG9yXy0+Y2FsbGVkXyk7Ci0gIEVYUEVDVF9FUShwYXJhbWV0ZXIsIG51bGxfZ2VuZXJhdG9yXy0+cGFyYW1ldGVyXyk7Ci19Ci0KLXZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpSZWFkRGVzY3JpcHRvclNldCgKLSAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBGaWxlRGVzY3JpcHRvclNldCogZGVzY3JpcHRvcl9zZXQpIHsKLSAgc3RyaW5nIHBhdGggPSB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBmaWxlbmFtZTsKLSAgc3RyaW5nIGZpbGVfY29udGVudHM7Ci0gIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cyhwYXRoLCAmZmlsZV9jb250ZW50cywgdHJ1ZSkpOwotCi0gIGlmICghZGVzY3JpcHRvcl9zZXQtPlBhcnNlRnJvbVN0cmluZyhmaWxlX2NvbnRlbnRzKSkgewotICAgIEZBSUwoKSA8PCAiQ291bGQgbm90IHBhcnNlIGZpbGUgY29udGVudHM6ICIgPDwgcGF0aDsKLSAgfQotfQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0Q2FwdHVyZWRTdGRvdXQoCi0gICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF90ZXh0KSB7Ci0gIEVYUEVDVF9FUShleHBlY3RlZF90ZXh0LCBjYXB0dXJlZF9zdGRvdXRfKTsKLX0KLQotCi12b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RmlsZUNvbnRlbnQoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBjb250ZW50KSB7Ci0gIHN0cmluZyBwYXRoID0gdGVtcF9kaXJlY3RvcnlfICsgIi8iICsgZmlsZW5hbWU7Ci0gIHN0cmluZyBmaWxlX2NvbnRlbnRzOwotICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMocGF0aCwgJmZpbGVfY29udGVudHMsIHRydWUpKTsKLQotICBFWFBFQ1RfRVEoU3RyaW5nUmVwbGFjZShjb250ZW50LCAiJHRtcGRpciIsIHRlbXBfZGlyZWN0b3J5XywgdHJ1ZSksCi0gICAgICAgICAgICBmaWxlX2NvbnRlbnRzKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBCYXNpY091dHB1dCkgewotICAvLyBUZXN0IHRoYXQgdGhlIGNvbW1vbiBjYXNlIHdvcmtzLgotCi0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOwotCi0gIEV4cGVjdE5vRXJyb3JzKCk7Ci0gIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQmFzaWNQbHVnaW4pIHsKLSAgLy8gVGVzdCB0aGF0IGJhc2ljIHBsdWdpbnMgd29yay4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD0kdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfcGx1Z2luIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvckFuZFBsdWdpbikgewotICAvLyBJbnZva2UgYSBnZW5lcmF0b3IgYW5kIGEgcGx1Z2luIGF0IHRoZSBzYW1lIHRpbWUuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOwotCi0gIEV4cGVjdE5vRXJyb3JzKCk7Ci0gIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKLSAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNdWx0aXBsZUlucHV0cykgewotICAvLyBUZXN0IHBhcnNpbmcgbXVsdGlwbGUgaW5wdXQgZmlsZXMuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byBiYXIucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byxiYXIucHJvdG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKLSAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7Ci0gIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvLGJhci5wcm90byIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOwotICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhci5wcm90byIsICJCYXIiKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTXVsdGlwbGVJbnB1dHNXaXRoSW1wb3J0KSB7Ci0gIC8vIFRlc3QgcGFyc2luZyBtdWx0aXBsZSBpbnB1dCBmaWxlcyB3aXRoIGFuIGltcG9ydCBvZiBhIHNlcGFyYXRlIGZpbGUuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImltcG9ydCBcImJhei5wcm90b1wiO1xuIgotICAgICJtZXNzYWdlIEJhciB7XG4iCi0gICAgIiAgb3B0aW9uYWwgQmF6IGEgPSAxO1xuIgotICAgICJ9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhei5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgQmF6IHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAtLXBsdWdfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byBiYXIucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byxiYXIucHJvdG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImZvby5wcm90byIsICJGb28iKTsKLSAgRXhwZWN0R2VuZXJhdGVkV2l0aE11bHRpcGxlSW5wdXRzKCJ0ZXN0X2dlbmVyYXRvciIsICJmb28ucHJvdG8sYmFyLnByb3RvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8iLCAiQmFyIik7Ci0gIEV4cGVjdEdlbmVyYXRlZFdpdGhNdWx0aXBsZUlucHV0cygidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvLGJhci5wcm90byIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOwotICBFeHBlY3RHZW5lcmF0ZWRXaXRoTXVsdGlwbGVJbnB1dHMoInRlc3RfcGx1Z2luIiwgImZvby5wcm90byxiYXIucHJvdG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImJhci5wcm90byIsICJCYXIiKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3JlYXRlRGlyZWN0b3J5KSB7Ci0gIC8vIFRlc3QgdGhhdCB3aGVuIHdlIG91dHB1dCB0byBhIHN1Yi1kaXJlY3RvcnksIGl0IGlzIGNyZWF0ZWQuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImJhci9iYXovZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotICBDcmVhdGVUZW1wRGlyKCJvdXQiKTsKLSAgQ3JlYXRlVGVtcERpcigicGx1Z291dCIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyL291dCAtLXBsdWdfb3V0PSR0bXBkaXIvcGx1Z291dCAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyL2Jhei9mb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJiYXIvYmF6L2Zvby5wcm90byIsICJGb28iLCAib3V0Iik7Ci0gIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9wbHVnaW4iLCAiIiwgImJhci9iYXovZm9vLnByb3RvIiwgIkZvbyIsICJwbHVnb3V0Iik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBhcmFtZXRlcnMpIHsKLSAgLy8gVGVzdCB0aGF0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIGFyZSBjb3JyZWN0bHkgcGFyc2VkIGZyb20gdGhlIGNvbW1hbmQgbGluZS4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgotICAgICAgIi0tcGx1Z19vdXQ9VGVzdFBsdWdpblBhcmFtZXRlcjokdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIlRlc3RQYXJhbWV0ZXIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfcGx1Z2luIiwgIlRlc3RQbHVnaW5QYXJhbWV0ZXIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBFeHRyYUdlbmVyYXRvclBhcmFtZXRlcnMpIHsKLSAgLy8gVGVzdCB0aGF0IGdlbmVyYXRvciBwYXJhbWV0ZXJzIHNwZWNpZmllZCB3aXRoIHRoZSBvcHRpb24gZmxhZyBhcmUKLSAgLy8gY29ycmVjdGx5IHBhc3NlZCB0byB0aGUgY29kZSBnZW5lcmF0b3IuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLSAgLy8gQ3JlYXRlIHRoZSAiYSIgYW5kICJiIiBzdWItZGlyZWN0b3JpZXMuCi0gIENyZWF0ZVRlbXBEaXIoImEiKTsKLSAgQ3JlYXRlVGVtcERpcigiYiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgIgotICAgICAgIi0tdGVzdF9vcHQ9Zm9vMSAiCi0gICAgICAiLS10ZXN0X291dD1iYXI6JHRtcGRpci9hICIKLSAgICAgICItLXRlc3Rfb3B0PWZvbzIgIgotICAgICAgIi0tdGVzdF9vdXQ9YmF6OiR0bXBkaXIvYiAiCi0gICAgICAiLS10ZXN0X29wdD1mb28zICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoCi0gICAgICAidGVzdF9nZW5lcmF0b3IiLCAiYmFyLGZvbzEsZm9vMixmb28zIiwgImZvby5wcm90byIsICJGb28iLCAiYSIpOwotICBFeHBlY3RHZW5lcmF0ZWQoCi0gICAgICAidGVzdF9nZW5lcmF0b3IiLCAiYmF6LGZvbzEsZm9vMixmb28zIiwgImZvby5wcm90byIsICJGb28iLCAiYiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBJbnNlcnQpIHsKLSAgLy8gVGVzdCBydW5uaW5nIGEgZ2VuZXJhdG9yIHRoYXQgaW5zZXJ0cyBjb2RlIGludG8gYW5vdGhlcidzIG91dHB1dC4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgIgotICAgICAgIi0tdGVzdF9vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKLSAgICAgICItLXBsdWdfb3V0PVRlc3RQbHVnaW5QYXJhbWV0ZXI6JHRtcGRpciAiCi0gICAgICAiLS10ZXN0X291dD1pbnNlcnQ9dGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW46JHRtcGRpciAiCi0gICAgICAiLS1wbHVnX291dD1pbnNlcnQ9dGVzdF9nZW5lcmF0b3IsdGVzdF9wbHVnaW46JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLSAgRXhwZWN0R2VuZXJhdGVkV2l0aEluc2VydGlvbnMoCi0gICAgICAidGVzdF9nZW5lcmF0b3IiLCAiVGVzdFBhcmFtZXRlciIsICJ0ZXN0X2dlbmVyYXRvcix0ZXN0X3BsdWdpbiIsCi0gICAgICAiZm9vLnByb3RvIiwgIkZvbyIpOwotICBFeHBlY3RHZW5lcmF0ZWRXaXRoSW5zZXJ0aW9ucygKLSAgICAgICJ0ZXN0X3BsdWdpbiIsICJUZXN0UGx1Z2luUGFyYW1ldGVyIiwgInRlc3RfZ2VuZXJhdG9yLHRlc3RfcGx1Z2luIiwKLSAgICAgICJmb28ucHJvdG8iLCAiRm9vIik7Ci19Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMikKLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV2luZG93c091dHB1dFBhdGgpIHsKLSAgLy8gVGVzdCB0aGF0IHRoZSBvdXRwdXQgcGF0aCBjYW4gYmUgYSBXaW5kb3dzLXN0eWxlIHBhdGguCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tbnVsbF9vdXQ9QzpcXCAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLSAgRXhwZWN0TnVsbENvZGVHZW5lcmF0b3JDYWxsZWQoIiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXaW5kb3dzT3V0cHV0UGF0aEFuZFBhcmFtZXRlcikgewotICAvLyBUZXN0IHRoYXQgd2UgY2FuIGhhdmUgYSB3aW5kb3dzLXN0eWxlIG91dHB1dCBwYXRoIGFuZCBhIHBhcmFtZXRlci4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1udWxsX291dD1iYXI6QzpcXCAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLSAgRXhwZWN0TnVsbENvZGVHZW5lcmF0b3JDYWxsZWQoImJhciIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBUcmFpbGluZ0JhY2tzbGFzaCkgewotICAvLyBUZXN0IHRoYXQgdGhlIGRpcmVjdG9yaWVzIGNhbiBlbmQgaW4gYmFja3NsYXNoZXMuICBTb21lIHVzZXJzIGNsYWltIHRoaXMKLSAgLy8gZG9lc24ndCB3b3JrIG9uIHRoZWlyIHN5c3RlbS4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyXFwgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyXFwgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLSAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOwotfQotCi0jZW5kaWYgIC8vIGRlZmluZWQoX1dJTjMyKSB8fCBkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBhdGhMb29rdXApIHsKLSAgLy8gVGVzdCB0aGF0IHNwZWNpZnlpbmcgbXVsdGlwbGUgZGlyZWN0b3JpZXMgaW4gdGhlIHByb3RvIHNlYXJjaCBwYXRoIHdvcmtzLgotCi0gIENyZWF0ZVRlbXBGaWxlKCJiL2Jhci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgQmFyIHt9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImEvZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHtcbiIKLSAgICAiICBvcHRpb25hbCBCYXIgYSA9IDE7XG4iCi0gICAgIn1cbiIpOwotICBDcmVhdGVUZW1wRmlsZSgiYi9mb28ucHJvdG8iLCAidGhpcyBzaG91bGQgbm90IGJlIHBhcnNlZFxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2EgLS1wcm90b19wYXRoPSR0bXBkaXIvYiBmb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIENvbG9uRGVsaW1pdGVkUGF0aCkgewotICAvLyBTYW1lIGFzIFBhdGhMb29rdXAsIGJ1dCB3ZSBwcm92aWRlIHRoZSBwcm90b19wYXRoIGluIGEgc2luZ2xlIGZsYWcuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImIvYmFyLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBCYXIge31cbiIpOwotICBDcmVhdGVUZW1wRmlsZSgiYS9mb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICIgIG9wdGlvbmFsIEJhciBhID0gMTtcbiIKLSAgICAifVxuIik7Ci0gIENyZWF0ZVRlbXBGaWxlKCJiL2Zvby5wcm90byIsICJ0aGlzIHNob3VsZCBub3QgYmUgcGFyc2VkXG4iKTsKLQotI3VuZGVmIFBBVEhfU0VQQVJBVE9SCi0jaWYgZGVmaW5lZChfV0lOMzIpCi0jZGVmaW5lIFBBVEhfU0VQQVJBVE9SICI7IgotI2Vsc2UKLSNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgIjoiCi0jZW5kaWYKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIvYSIgUEFUSF9TRVBBUkFUT1IgIiR0bXBkaXIvYiBmb28ucHJvdG8iKTsKLQotI3VuZGVmIFBBVEhfU0VQQVJBVE9SCi0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLSAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBOb25Sb290TWFwcGluZykgewotICAvLyBUZXN0IHNldHRpbmcgdXAgYSBzZWFyY2ggcGF0aCBtYXBwaW5nIGEgZGlyZWN0b3J5IHRvIGEgbm9uLXJvb3QgbG9jYXRpb24uCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPWJhcj0kdG1wZGlyIGJhci9mb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJiYXIvZm9vLnByb3RvIiwgIkZvbyIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNdWx0aXBsZUdlbmVyYXRvcnMpIHsKLSAgLy8gVGVzdCB0aGF0IHdlIGNhbiBoYXZlIG11bHRpcGxlIGdlbmVyYXRvcnMgYW5kIHVzZSBib3RoIGluIG9uZSBpbnZvY2F0aW9uLAotICAvLyBlYWNoIHdpdGggYSBkaWZmZXJlbnQgb3V0cHV0IGRpcmVjdG9yeS4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotICAvLyBDcmVhdGUgdGhlICJhIiBhbmQgImIiIHN1Yi1kaXJlY3Rvcmllcy4KLSAgQ3JlYXRlVGVtcERpcigiYSIpOwotICBDcmVhdGVUZW1wRGlyKCJiIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAiCi0gICAgICAiLS10ZXN0X291dD0kdG1wZGlyL2EgIgotICAgICAgIi0tYWx0X291dD0kdG1wZGlyL2IgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOwotCi0gIEV4cGVjdE5vRXJyb3JzKCk7Ci0gIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iLCAiYSIpOwotICBFeHBlY3RHZW5lcmF0ZWQoImFsdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iLCAiYiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBEaXNhbGxvd1NlcnZpY2VzTm9TZXJ2aWNlcykgewotICAvLyBUZXN0IHRoYXQgLS1kaXNhbGxvd19zZXJ2aWNlcyBkb2Vzbid0IGNhdXNlIGEgcHJvYmxlbSB3aGVuIHRoZXJlIGFyZSBubwotICAvLyBzZXJ2aWNlcy4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kaXNhbGxvd19zZXJ2aWNlcyAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOwotCi0gIEV4cGVjdE5vRXJyb3JzKCk7Ci0gIEV4cGVjdEdlbmVyYXRlZCgidGVzdF9nZW5lcmF0b3IiLCAiIiwgImZvby5wcm90byIsICJGb28iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRGlzYWxsb3dTZXJ2aWNlc0hhc1NlcnZpY2UpIHsKLSAgLy8gVGVzdCB0aGF0IC0tZGlzYWxsb3dfc2VydmljZXMgcHJvZHVjZXMgYW4gZXJyb3Igd2hlbiB0aGVyZSBhcmUgc2VydmljZXMuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iCi0gICAgInNlcnZpY2UgQmFyIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGlzYWxsb3dfc2VydmljZXMgLS10ZXN0X291dD0kdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclN1YnN0cmluZygiZm9vLnByb3RvOiBUaGlzIGZpbGUgY29udGFpbnMgc2VydmljZXMiKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQWxsb3dTZXJ2aWNlc0hhc1NlcnZpY2UpIHsKLSAgLy8gVGVzdCB0aGF0IHNlcnZpY2VzIHdvcmsgZmluZSBhcyBsb25nIGFzIC0tZGlzYWxsb3dfc2VydmljZXMgaXMgbm90IHVzZWQuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iCi0gICAgInNlcnZpY2UgQmFyIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLSAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDd2RSZWxhdGl2ZUlucHV0cykgewotICAvLyBUZXN0IHRoYXQgd2UgY2FuIGFjY2VwdCB3b3JraW5nLWRpcmVjdG9yeS1yZWxhdGl2ZSBpbnB1dCBmaWxlcy4KLQotICBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShmYWxzZSk7Ci0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgJHRtcGRpci9mb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFdyaXRlRGVzY3JpcHRvclNldCkgewotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCi0gICAgIm1lc3NhZ2UgQmFyIHtcbiIKLSAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKLSAgICAifVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlc2NyaXB0b3Jfc2V0X291dD0kdG1wZGlyL2Rlc2NyaXB0b3Jfc2V0ICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotCi0gIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OwotICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOwotICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKLSAgRVhQRUNUX0VRKDEsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm5hbWUoKSk7Ci0gIC8vIERlc2NyaXB0b3Igc2V0IHNob3VsZCBub3QgaGF2ZSBzb3VyY2UgY29kZSBpbmZvLgotICBFWFBFQ1RfRkFMU0UoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKLSAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIGhhdmUganNvbl9uYW1lLgotICBFWFBFQ1RfRVEoIkJhciIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubWVzc2FnZV90eXBlKDApLm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCkubmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCkuaGFzX2pzb25fbmFtZSgpKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXNjcmlwdG9yU2V0V2l0aER1cGxpY2F0ZXMpIHsKLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgotICAgICJtZXNzYWdlIEJhciB7XG4iCi0gICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCi0gICAgIn1cbiIpOwotICBDcmVhdGVUZW1wRmlsZSgiYmF6LnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCi0gICAgIm1lc3NhZ2UgQmF6IHtcbiIKLSAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKLSAgICAifVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlc2NyaXB0b3Jfc2V0X291dD0kdG1wZGlyL2Rlc2NyaXB0b3Jfc2V0ICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8gZm9vLnByb3RvIGJhci5wcm90byBiYXoucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotCi0gIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OwotICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOwotICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKLSAgRVhQRUNUX0VRKDMsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMikubmFtZSgpKTsKLSAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIG5vdCBoYXZlIHNvdXJjZSBjb2RlIGluZm8uCi0gIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOwotICAvLyBEZXNjcmlwdG9yIHNldCBzaG91bGQgaGF2ZSBqc29uX25hbWUuCi0gIEVYUEVDVF9FUSgiQmFyIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5tZXNzYWdlX3R5cGUoMCkubmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmb28iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKS5uYW1lKCkpOwotICBFWFBFQ1RfVFJVRShkZXNjcmlwdG9yX3NldC5maWxlKDApLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKS5oYXNfanNvbl9uYW1lKCkpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlc2NyaXB0b3JTZXRXaXRoU291cmNlSW5mbykgewotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCi0gICAgIm1lc3NhZ2UgQmFyIHtcbiIKLSAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKLSAgICAifVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlc2NyaXB0b3Jfc2V0X291dD0kdG1wZGlyL2Rlc2NyaXB0b3Jfc2V0ICIKLSAgICAgICItLWluY2x1ZGVfc291cmNlX2luZm8gLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLQotICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKLSAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKLSAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47Ci0gIEVYUEVDVF9FUSgxLCBkZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOwotICAvLyBTb3VyY2UgY29kZSBpbmZvIGluY2x1ZGVkLgotICBFWFBFQ1RfVFJVRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZVRyYW5zaXRpdmVEZXNjcmlwdG9yU2V0KSB7Ci0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0gIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKLSAgICAibWVzc2FnZSBCYXIge1xuIgotICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgotICAgICJ9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgotICAgICAgIi0taW5jbHVkZV9pbXBvcnRzIC0tcHJvdG9fcGF0aD0kdG1wZGlyIGJhci5wcm90byIpOwotCi0gIEV4cGVjdE5vRXJyb3JzKCk7Ci0KLSAgRmlsZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQ7Ci0gIFJlYWREZXNjcmlwdG9yU2V0KCJkZXNjcmlwdG9yX3NldCIsICZkZXNjcmlwdG9yX3NldCk7Ci0gIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOwotICBFWFBFQ1RfRVEoMiwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOwotICBpZiAoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkgPT0gImJhci5wcm90byIpIHsKLSAgICBzdGQ6OnN3YXAoZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzBdLAotICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC5tdXRhYmxlX2ZpbGUoKS0+bXV0YWJsZV9kYXRhKClbMV0pOwotICB9Ci0gIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkubmFtZSgpKTsKLSAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIG5vdCBoYXZlIHNvdXJjZSBjb2RlIGluZm8uCi0gIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOwotICBFWFBFQ1RfRkFMU0UoZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVUcmFuc2l0aXZlRGVzY3JpcHRvclNldFdpdGhTb3VyY2VJbmZvKSB7Ci0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0gIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKLSAgICAibWVzc2FnZSBCYXIge1xuIgotICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgotICAgICJ9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgotICAgICAgIi0taW5jbHVkZV9pbXBvcnRzIC0taW5jbHVkZV9zb3VyY2VfaW5mbyAtLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotCi0gIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OwotICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOwotICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKLSAgRVhQRUNUX0VRKDIsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKLSAgaWYgKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpID09ICJiYXIucHJvdG8iKSB7Ci0gICAgc3RkOjpzd2FwKGRlc2NyaXB0b3Jfc2V0Lm11dGFibGVfZmlsZSgpLT5tdXRhYmxlX2RhdGEoKVswXSwKLSAgICAgICAgICAgICAgZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzFdKTsKLSAgfQotICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDEpLm5hbWUoKSk7Ci0gIC8vIFNvdXJjZSBjb2RlIGluZm8gaW5jbHVkZWQuCi0gIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Ci0gIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Ci19Ci0KLSNpZmRlZiBfV0lOMzIKLS8vIFRPRE8odGVib3JpbmcpOiBGaWd1cmUgb3V0IGhvdyB0byB3cml0ZSB0ZXN0IG9uIHdpbmRvd3MuCi0jZWxzZQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlR2l2ZW5Ud29JbnB1dHMpIHsKLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgotICAgICJtZXNzYWdlIEJhciB7XG4iCi0gICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCi0gICAgIn1cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXBlbmRlbmN5X291dD0kdG1wZGlyL21hbmlmZXN0ICIKLSAgICAgICItLXRlc3Rfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIGZvby5wcm90byIpOwotCi0gIEV4cGVjdEVycm9yVGV4dCgKLSAgICAgICJDYW4gb25seSBwcm9jZXNzIG9uZSBpbnB1dCBmaWxlIHdoZW4gdXNpbmcgLS1kZXBlbmRlbmN5X291dD1GSUxFLlxuIik7Ci19Ci0KLSNpZmRlZiBQUk9UT0JVRl9PUEVOU09VUkNFCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlcGVuZGVuY3lNYW5pZmVzdEZpbGUpIHsKLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgotICAgICJtZXNzYWdlIEJhciB7XG4iCi0gICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCi0gICAgIn1cbiIpOwotCi0gIHN0cmluZyBjdXJyZW50X3dvcmtpbmdfZGlyZWN0b3J5ID0gZ2V0Y3dkKE5VTEwsIDApOwotICBTd2l0Y2hUb1RlbXBEaXJlY3RvcnkoKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVwZW5kZW5jeV9vdXQ9bWFuaWZlc3QgLS10ZXN0X291dD0uICIKLSAgICAgICJiYXIucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotCi0gIEV4cGVjdEZpbGVDb250ZW50KCJtYW5pZmVzdCIsCi0gICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8uTW9ja0NvZGVHZW5lcmF0b3IudGVzdF9nZW5lcmF0b3I6ICIKLSAgICAgICAgICAgICAgICAgICAgImZvby5wcm90b1xcXG4gYmFyLnByb3RvIik7Ci0KLSAgRmlsZTo6Q2hhbmdlV29ya2luZ0RpcmVjdG9yeShjdXJyZW50X3dvcmtpbmdfZGlyZWN0b3J5KTsKLX0KLSNlbHNlICAvLyAhUFJPVE9CVUZfT1BFTlNPVVJDRQotLy8gVE9ETyh0ZWJvcmluZyk6IEZpZ3VyZSBvdXQgaG93IHRvIGNoYW5nZSBhbmQgZ2V0IHdvcmtpbmcgZGlyZWN0b3J5IGluCi0vLyBnb29nbGUzLgotI2VuZGlmICAvLyAhUFJPVE9CVUZfT1BFTlNPVVJDRQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlcGVuZGVuY3lNYW5pZmVzdEZpbGVGb3JBYnNvbHV0ZVBhdGgpIHsKLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgotICAgICJtZXNzYWdlIEJhciB7XG4iCi0gICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCi0gICAgIn1cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXBlbmRlbmN5X291dD0kdG1wZGlyL21hbmlmZXN0ICIKLSAgICAgICItLXRlc3Rfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLQotICBFeHBlY3RGaWxlQ29udGVudCgibWFuaWZlc3QiLAotICAgICAgICAgICAgICAgICAgICAiJHRtcGRpci9iYXIucHJvdG8uTW9ja0NvZGVHZW5lcmF0b3IudGVzdF9nZW5lcmF0b3I6ICIKLSAgICAgICAgICAgICAgICAgICAgIiR0bXBkaXIvZm9vLnByb3RvXFxcbiAkdG1wZGlyL2Jhci5wcm90byIpOwotfQotI2VuZGlmICAvLyAhX1dJTjMyCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZUVycm9ycykgewotICAvLyBUZXN0IHRoYXQgcGFyc2UgZXJyb3JzIGFyZSByZXBvcnRlZC4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiYmFkc3ludGF4XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0RXJyb3JUZXh0KAotICAgICJmb28ucHJvdG86MjoxOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZUVycm9yc011bHRpcGxlRmlsZXMpIHsKLSAgLy8gVGVzdCB0aGF0IHBhcnNlIGVycm9ycyBhcmUgcmVwb3J0ZWQgZnJvbSBtdWx0aXBsZSBmaWxlcy4KLQotICAvLyBXZSBzZXQgdXAgZmlsZXMgc3VjaCB0aGF0IGZvby5wcm90byBhY3R1YWxseSBkZXBlbmRzIG9uIGJhci5wcm90byBpbgotICAvLyB0d28gd2F5czogIERpcmVjdGx5IGFuZCB0aHJvdWdoIGJhei5wcm90by4gIGJhci5wcm90bydzIGVycm9ycyBzaG91bGQKLSAgLy8gb25seSBiZSByZXBvcnRlZCBvbmNlLgotICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiYmFkc3ludGF4XG4iKTsKLSAgQ3JlYXRlVGVtcEZpbGUoImJhei5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIik7Ci0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJpbXBvcnQgXCJiYXIucHJvdG9cIjtcbiIKLSAgICAiaW1wb3J0IFwiYmF6LnByb3RvXCI7XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0RXJyb3JUZXh0KAotICAgICJiYXIucHJvdG86MjoxOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIKLSAgICAiYmF6LnByb3RvOiBJbXBvcnQgXCJiYXIucHJvdG9cIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iCi0gICAgImZvby5wcm90bzogSW1wb3J0IFwiYmFyLnByb3RvXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLlxuIgotICAgICJmb28ucHJvdG86IEltcG9ydCBcImJhei5wcm90b1wiIHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy5cbiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBJbnB1dE5vdEZvdW5kRXJyb3IpIHsKLSAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgaWYgdGhlIGlucHV0IGZpbGUgaXMgbm90IGZvdW5kLgotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclRleHQoCi0gICAgImZvby5wcm90bzogRmlsZSBub3QgZm91bmQuXG4iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3dkUmVsYXRpdmVJbnB1dE5vdEZvdW5kRXJyb3IpIHsKLSAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgd2hlbiBhIHdvcmtpbmctZGlyZWN0b3J5LXJlbGF0aXZlIGlucHV0IGZpbGUgaXMgbm90Ci0gIC8vIGZvdW5kLgotCi0gIFNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGZhbHNlKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgJHRtcGRpci9mb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclRleHQoCi0gICAgIiR0bXBkaXIvZm9vLnByb3RvOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5XG4iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQ3dkUmVsYXRpdmVJbnB1dE5vdE1hcHBlZEVycm9yKSB7Ci0gIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gYSB3b3JraW5nLWRpcmVjdG9yeS1yZWxhdGl2ZSBpbnB1dCBmaWxlIGlzIG5vdAotICAvLyBtYXBwZWQgdG8gYSB2aXJ0dWFsIHBhdGguCi0KLSAgU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUoZmFsc2UpOwotCi0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAiYmFyIiBzbyB0aGF0IHdlIGNhbiBwb2ludCAtLXByb3RvX3BhdGggYXQgaXQuCi0gIENyZWF0ZVRlbXBGaWxlKCJiYXIvZHVtbXkiLCAiIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2JhciAkdG1wZGlyL2Zvby5wcm90byIpOwotCi0gIEV4cGVjdEVycm9yVGV4dCgKLSAgICAiJHRtcGRpci9mb28ucHJvdG86IEZpbGUgZG9lcyBub3QgcmVzaWRlIHdpdGhpbiBhbnkgcGF0aCAiCi0gICAgICAic3BlY2lmaWVkIHVzaW5nIC0tcHJvdG9fcGF0aCAob3IgLUkpLiAgWW91IG11c3Qgc3BlY2lmeSBhICIKLSAgICAgICItLXByb3RvX3BhdGggd2hpY2ggZW5jb21wYXNzZXMgdGhpcyBmaWxlLiAgTm90ZSB0aGF0IHRoZSAiCi0gICAgICAicHJvdG9fcGF0aCBtdXN0IGJlIGFuIGV4YWN0IHByZWZpeCBvZiB0aGUgLnByb3RvIGZpbGUgIgotICAgICAgIm5hbWVzIC0tIHByb3RvYyBpcyB0b28gZHVtYiB0byBmaWd1cmUgb3V0IHdoZW4gdHdvIHBhdGhzICIKLSAgICAgICIoZS5nLiBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUpIGFyZSBlcXVpdmFsZW50IChpdCdzIGhhcmRlciAiCi0gICAgICAidGhhbiB5b3UgdGhpbmspLlxuIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEN3ZFJlbGF0aXZlSW5wdXROb3RGb3VuZEFuZE5vdE1hcHBlZEVycm9yKSB7Ci0gIC8vIENoZWNrIHdoYXQgaGFwcGVucyBpZiB0aGUgaW5wdXQgZmlsZSBpcyBub3QgZm91bmQgKmFuZCogaXMgbm90IG1hcHBlZAotICAvLyBpbiB0aGUgcHJvdG9fcGF0aC4KLQotICBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShmYWxzZSk7Ci0KLSAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGNhbGxlZCAiYmFyIiBzbyB0aGF0IHdlIGNhbiBwb2ludCAtLXByb3RvX3BhdGggYXQgaXQuCi0gIENyZWF0ZVRlbXBGaWxlKCJiYXIvZHVtbXkiLCAiIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2JhciAkdG1wZGlyL2Zvby5wcm90byIpOwotCi0gIEV4cGVjdEVycm9yVGV4dCgKLSAgICAiJHRtcGRpci9mb28ucHJvdG86IE5vIHN1Y2ggZmlsZSBvciBkaXJlY3RvcnlcbiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBDd2RSZWxhdGl2ZUlucHV0U2hhZG93ZWRFcnJvcikgewotICAvLyBUZXN0IHdoYXQgaGFwcGVucyB3aGVuIGEgd29ya2luZy1kaXJlY3RvcnktcmVsYXRpdmUgaW5wdXQgZmlsZSBpcyBzaGFkb3dlZAotICAvLyBieSBhbm90aGVyIGZpbGUgaW4gdGhlIHZpcnR1YWwgcGF0aC4KLQotICBTZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShmYWxzZSk7Ci0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby9mb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0gIENyZWF0ZVRlbXBGaWxlKCJiYXIvZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBCYXIge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpci9mb28gLS1wcm90b19wYXRoPSR0bXBkaXIvYmFyICIKLSAgICAgICIkdG1wZGlyL2Jhci9mb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclRleHQoCi0gICAgIiR0bXBkaXIvYmFyL2Zvby5wcm90bzogSW5wdXQgaXMgc2hhZG93ZWQgaW4gdGhlIC0tcHJvdG9fcGF0aCAiCi0gICAgImJ5IFwiJHRtcGRpci9mb28vZm9vLnByb3RvXCIuICBFaXRoZXIgdXNlIHRoZSBsYXR0ZXIgIgotICAgICJmaWxlIGFzIHlvdXIgaW5wdXQgb3IgcmVvcmRlciB0aGUgLS1wcm90b19wYXRoIHNvIHRoYXQgdGhlICIKLSAgICAiZm9ybWVyIGZpbGUncyBsb2NhdGlvbiBjb21lcyBmaXJzdC5cbiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQcm90b1BhdGhOb3RGb3VuZEVycm9yKSB7Ci0gIC8vIFRlc3Qgd2hhdCBoYXBwZW5zIGlmIHRoZSBpbnB1dCBmaWxlIGlzIG5vdCBmb3VuZC4KLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIvZm9vIGZvby5wcm90byIpOwotCi0gIEV4cGVjdEVycm9yVGV4dCgKLSAgICAiJHRtcGRpci9mb286IHdhcm5pbmc6IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC5cbiIKLSAgICAiZm9vLnByb3RvOiBGaWxlIG5vdCBmb3VuZC5cbiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNaXNzaW5nSW5wdXRFcnJvcikgewotICAvLyBUZXN0IHRoYXQgd2UgZ2V0IGFuIGVycm9yIGlmIG5vIGlucHV0cyBhcmUgZ2l2ZW4uCi0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIik7Ci0KLSAgRXhwZWN0RXJyb3JUZXh0KCJNaXNzaW5nIGlucHV0IGZpbGUuXG4iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgTWlzc2luZ091dHB1dEVycm9yKSB7Ci0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclRleHQoIk1pc3Npbmcgb3V0cHV0IGRpcmVjdGl2ZXMuXG4iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgT3V0cHV0V3JpdGVFcnJvcikgewotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIHN0cmluZyBvdXRwdXRfZmlsZSA9Ci0gICAgICBNb2NrQ29kZUdlbmVyYXRvcjo6R2V0T3V0cHV0RmlsZU5hbWUoInRlc3RfZ2VuZXJhdG9yIiwgImZvby5wcm90byIpOwotCi0gIC8vIENyZWF0ZSBhIGRpcmVjdG9yeSBibG9ja2luZyBvdXIgb3V0cHV0IGxvY2F0aW9uLgotICBDcmVhdGVUZW1wRGlyKG91dHB1dF9maWxlKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQ9JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgLy8gTW9ja0NvZGVHZW5lcmF0b3Igbm8gbG9uZ2VyIGRldGVjdHMgYW4gZXJyb3IgYmVjYXVzZSB3ZSBhY3R1YWxseSB3cml0ZSB0bwotICAvLyBhbiBpbi1tZW1vcnkgbG9jYXRpb24gZmlyc3QsIHRoZW4gZHVtcCB0byBkaXNrIGF0IHRoZSBlbmQuICBUaGlzIGlzIG5vCi0gIC8vIGJpZyBkZWFsLgotICAvLyAgIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJNb2NrQ29kZUdlbmVyYXRvciBkZXRlY3RlZCB3cml0ZSBlcnJvci4iKTsKLQotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICAvLyBXaW5kb3dzIHdpdGggTVNWQ1JULmRsbCBwcm9kdWNlcyBFUEVSTSBpbnN0ZWFkIG9mIEVJU0RJUi4KLSAgaWYgKEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogUGVybWlzc2lvbiBkZW5pZWQiKSkgewotICAgIHJldHVybjsKLSAgfQotI2VuZGlmCi0KLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmcob3V0cHV0X2ZpbGUgKyAiOiBJcyBhIGRpcmVjdG9yeSIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQbHVnaW5PdXRwdXRXcml0ZUVycm9yKSB7Ci0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgc3RyaW5nIG91dHB1dF9maWxlID0KLSAgICAgIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlTmFtZSgidGVzdF9wbHVnaW4iLCAiZm9vLnByb3RvIik7Ci0KLSAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGJsb2NraW5nIG91ciBvdXRwdXQgbG9jYXRpb24uCi0gIENyZWF0ZVRlbXBEaXIob3V0cHV0X2ZpbGUpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD0kdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotI2lmIGRlZmluZWQoX1dJTjMyKSAmJiAhZGVmaW5lZChfX0NZR1dJTl9fKQotICAvLyBXaW5kb3dzIHdpdGggTVNWQ1JULmRsbCBwcm9kdWNlcyBFUEVSTSBpbnN0ZWFkIG9mIEVJU0RJUi4KLSAgaWYgKEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKG91dHB1dF9maWxlICsgIjogUGVybWlzc2lvbiBkZW5pZWQiKSkgewotICAgIHJldHVybjsKLSAgfQotI2VuZGlmCi0KLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmcob3V0cHV0X2ZpbGUgKyAiOiBJcyBhIGRpcmVjdG9yeSIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBPdXRwdXREaXJlY3RvcnlOb3RGb3VuZEVycm9yKSB7Ci0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIvbm9zdWNoZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclN1YnN0cmluZygibm9zdWNoZGlyLzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQbHVnaW5PdXRwdXREaXJlY3RvcnlOb3RGb3VuZEVycm9yKSB7Ci0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PSR0bXBkaXIvbm9zdWNoZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclN1YnN0cmluZygibm9zdWNoZGlyLzogTm8gc3VjaCBmaWxlIG9yIGRpcmVjdG9yeSIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBPdXRwdXREaXJlY3RvcnlJc0ZpbGVFcnJvcikgewotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyL2Zvby5wcm90byAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSNpZiBkZWZpbmVkKF9XSU4zMikgJiYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgLy8gV2luZG93cyB3aXRoIE1TVkNSVC5kbGwgcHJvZHVjZXMgRUlOVkFMIGluc3RlYWQgb2YgRU5PVERJUi4KLSAgaWYgKEhhc0FsdGVybmF0ZUVycm9yU3Vic3RyaW5nKCJmb28ucHJvdG8vOiBJbnZhbGlkIGFyZ3VtZW50IikpIHsKLSAgICByZXR1cm47Ci0gIH0KLSNlbmRpZgotCi0gIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJmb28ucHJvdG8vOiBOb3QgYSBkaXJlY3RvcnkiKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yRXJyb3IpIHsKLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3Ige31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclN1YnN0cmluZygKLSAgICAgICItLXRlc3Rfb3V0OiBmb28ucHJvdG86IFNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3IuIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbkVycm9yKSB7Ci0gIC8vIFRlc3QgYSBnZW5lcmF0b3IgcGx1Z2luIHRoYXQgcmV0dXJucyBhbiBlcnJvci4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvciB7fVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PVRlc3RQYXJhbWV0ZXI6JHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCi0gICAgICAiLS1wbHVnX291dDogZm9vLnByb3RvOiBTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Vycm9yLiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JQbHVnaW5GYWlsKSB7Ci0gIC8vIFRlc3QgYSBnZW5lcmF0b3IgcGx1Z2luIHRoYXQgZXhpdHMgd2l0aCBhbiBlcnJvciBjb2RlLgotCi0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGZvby5wcm90byIpOwotCi0gIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQuIik7Ci0gIEV4cGVjdEVycm9yU3Vic3RyaW5nKAotICAgICAgIi0tcGx1Z19vdXQ6IHByZWZpeC1nZW4tcGx1ZzogUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlIDEyMy4iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgR2VuZXJhdG9yUGx1Z2luQ3Jhc2gpIHsKLSAgLy8gVGVzdCBhIGdlbmVyYXRvciBwbHVnaW4gdGhhdCBjcmFzaGVzLgotCi0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0IHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclN1YnN0cmluZygiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydC4iKTsKLQotI2lmZGVmIF9XSU4zMgotICAvLyBXaW5kb3dzIGRvZXNuJ3QgaGF2ZSBzaWduYWxzLiAgSXQgbG9va3MgbGlrZSBhYm9ydCgpaW5nIGNhdXNlcyB0aGUgcHJvY2VzcwotICAvLyB0byBleGl0IHdpdGggc3RhdHVzIGNvZGUgMywgYnV0IGxldCdzIG5vdCBkZXBlbmQgb24gdGhlIGV4YWN0IG51bWJlciBoZXJlLgotICBFeHBlY3RFcnJvclN1YnN0cmluZygKLSAgICAgICItLXBsdWdfb3V0OiBwcmVmaXgtZ2VuLXBsdWc6IFBsdWdpbiBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSIpOwotI2Vsc2UKLSAgLy8gRG9uJ3QgZGVwZW5kIG9uIHRoZSBleGFjdCBzaWduYWwgbnVtYmVyLgotICBFeHBlY3RFcnJvclN1YnN0cmluZygKLSAgICAgICItLXBsdWdfb3V0OiBwcmVmaXgtZ2VuLXBsdWc6IFBsdWdpbiBraWxsZWQgYnkgc2lnbmFsIik7Ci0jZW5kaWYKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luUmVjZWl2ZXNTb3VyY2VDb2RlSW5mbykgewotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbyB7fVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCi0gICAgICAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbzogMS4iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luUmVjZWl2ZXNKc29uTmFtZSkgewotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNKc29uTmFtZSB7XG4iCi0gICAgIiAgb3B0aW9uYWwgaW50MzIgdmFsdWUgPSAxO1xuIgotICAgICJ9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpciAtLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclN1YnN0cmluZygiU2F3IGpzb25fbmFtZTogMSIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JQbHVnaW5Ob3RGb3VuZCkgewotICAvLyBUZXN0IHdoYXQgaGFwcGVucyBpZiB0aGUgcGx1Z2luIGlzbid0IGZvdW5kLgotCi0gIENyZWF0ZVRlbXBGaWxlKCJlcnJvci5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tYmFkcGx1Z19vdXQ9VGVzdFBhcmFtZXRlcjokdG1wZGlyICIKLSAgICAgICItLXBsdWdpbj1wcmVmaXgtZ2VuLWJhZHBsdWc9bm9fc3VjaF9maWxlICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBlcnJvci5wcm90byIpOwotCi0jaWZkZWYgX1dJTjMyCi0gIEV4cGVjdEVycm9yU3Vic3RyaW5nKCItLWJhZHBsdWdfb3V0OiBwcmVmaXgtZ2VuLWJhZHBsdWc6ICIgKwotICAgICAgU3VicHJvY2Vzczo6V2luMzJFcnJvck1lc3NhZ2UoRVJST1JfRklMRV9OT1RfRk9VTkQpKTsKLSNlbHNlCi0gIC8vIEVycm9yIHdyaXR0ZW4gdG8gc3Rkb3V0IGJ5IGNoaWxkIHByb2Nlc3MgYWZ0ZXIgZXhlYygpIGZhaWxzLgotICBFeHBlY3RFcnJvclN1YnN0cmluZygKLSAgICAgICJub19zdWNoX2ZpbGU6IHByb2dyYW0gbm90IGZvdW5kIG9yIGlzIG5vdCBleGVjdXRhYmxlIik7Ci0KLSAgLy8gRXJyb3Igd3JpdHRlbiBieSBwYXJlbnQgcHJvY2VzcyB3aGVuIGNoaWxkIGZhaWxzLgotICBFeHBlY3RFcnJvclN1YnN0cmluZygKLSAgICAgICItLWJhZHBsdWdfb3V0OiBwcmVmaXgtZ2VuLWJhZHBsdWc6IFBsdWdpbiBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAxLiIpOwotI2VuZGlmCi19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdlbmVyYXRvclBsdWdpbk5vdEFsbG93ZWQpIHsKLSAgLy8gVGVzdCB3aGF0IGhhcHBlbnMgaWYgcGx1Z2lucyBhcmVuJ3QgYWxsb3dlZC4KLQotICBDcmVhdGVUZW1wRmlsZSgiZXJyb3IucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgRGlzYWxsb3dQbHVnaW5zKCk7Ci0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wbHVnX291dD1UZXN0UGFyYW1ldGVyOiR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIGVycm9yLnByb3RvIik7Ci0KLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIlVua25vd24gZmxhZzogLS1wbHVnX291dCIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBIZWxwVGV4dCkgewotICBSdW4oInRlc3RfZXhlY19uYW1lIC0taGVscCIpOwotCi0gIEV4cGVjdEVycm9yU3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKCJVc2FnZTogdGVzdF9leGVjX25hbWUgIik7Ci0gIEV4cGVjdEVycm9yU3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKCItLXRlc3Rfb3V0PU9VVF9ESVIiKTsKLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoIlRlc3Qgb3V0cHV0LiIpOwotICBFeHBlY3RFcnJvclN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgiLS1hbHRfb3V0PU9VVF9ESVIiKTsKLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoIkFsdCBvdXRwdXQuIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdjY0Zvcm1hdEVycm9ycykgewotICAvLyBUZXN0IC0tZXJyb3JfZm9ybWF0PWdjYyAod2hpY2ggaXMgdGhlIGRlZmF1bHQsIGJ1dCB3ZSB3YW50IHRvIHZlcmlmeQotICAvLyB0aGF0IGl0IGNhbiBiZSBzZXQgZXhwbGljaXRseSkuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImJhZHN5bnRheFxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIC0tZXJyb3JfZm9ybWF0PWdjYyBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclRleHQoCi0gICAgImZvby5wcm90bzoyOjE6IEV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgKGUuZy4gXCJtZXNzYWdlXCIpLlxuIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE1zdnNGb3JtYXRFcnJvcnMpIHsKLSAgLy8gVGVzdCAtLWVycm9yX2Zvcm1hdD1tc3ZzCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImJhZHN5bnRheFxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyIC0tZXJyb3JfZm9ybWF0PW1zdnMgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0RXJyb3JUZXh0KAotICAgICIkdG1wZGlyL2Zvby5wcm90bygyKSA6IGVycm9yIGluIGNvbHVtbj0xOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50ICIKLSAgICAgICIoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKLX0KLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSW52YWxpZEVycm9yRm9ybWF0KSB7Ci0gIC8vIFRlc3QgLS1lcnJvcl9mb3JtYXQ9bXN2cwotCi0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJiYWRzeW50YXhcbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dD0kdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciAtLWVycm9yX2Zvcm1hdD1pbnZhbGlkIGZvby5wcm90byIpOwotCi0gIEV4cGVjdEVycm9yVGV4dCgKLSAgICAiVW5rbm93biBlcnJvciBmb3JtYXQ6IGludmFsaWRcbiIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGbGFnIHBhcnNpbmcgdGVzdHMKLQotVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGFyc2VTaW5nbGVDaGFyYWN0ZXJGbGFnKSB7Ci0gIC8vIFRlc3QgdGhhdCBhIHNpbmdsZS1jaGFyYWN0ZXIgZmxhZyB3b3Jrcy4KLQotICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAibWVzc2FnZSBGb28ge31cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLXQkdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFBhcnNlU3BhY2VEZWxpbWl0ZWRWYWx1ZSkgewotICAvLyBUZXN0IHRoYXQgc2VwYXJhdGluZyB0aGUgZmxhZyB2YWx1ZSB3aXRoIGEgc3BhY2Ugd29ya3MuCi0KLSAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLQotICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tdGVzdF9vdXQgJHRtcGRpciAiCi0gICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7Ci0KLSAgRXhwZWN0Tm9FcnJvcnMoKTsKLSAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X2dlbmVyYXRvciIsICIiLCAiZm9vLnByb3RvIiwgIkZvbyIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZVNpbmdsZUNoYXJhY3RlclNwYWNlRGVsaW1pdGVkVmFsdWUpIHsKLSAgLy8gVGVzdCB0aGF0IHNlcGFyYXRpbmcgdGhlIGZsYWcgdmFsdWUgd2l0aCBhIHNwYWNlIHdvcmtzIGZvcgotICAvLyBzaW5nbGUtY2hhcmFjdGVyIGZsYWdzLgotCi0gIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7fVxuIik7Ci0KLSAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtdCAkdG1wZGlyICIKLSAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3ROb0Vycm9ycygpOwotICBFeHBlY3RHZW5lcmF0ZWQoInRlc3RfZ2VuZXJhdG9yIiwgIiIsICJmb28ucHJvdG8iLCAiRm9vIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIE1pc3NpbmdWYWx1ZUVycm9yKSB7Ci0gIC8vIFRlc3QgdGhhdCB3ZSBnZXQgYW4gZXJyb3IgaWYgYSBmbGFnIGlzIG1pc3NpbmcgaXRzIHZhbHVlLgotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dCAtLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKLQotICBFeHBlY3RFcnJvclRleHQoIk1pc3NpbmcgdmFsdWUgZm9yIGZsYWc6IC0tdGVzdF9vdXRcbiIpOwotfQotCi1URVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBNaXNzaW5nVmFsdWVBdEVuZEVycm9yKSB7Ci0gIC8vIFRlc3QgdGhhdCB3ZSBnZXQgYW4gZXJyb3IgaWYgdGhlIGxhc3QgYXJndW1lbnQgaXMgYSBmbGFnIHJlcXVpcmluZyBhCi0gIC8vIHZhbHVlLgotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS10ZXN0X291dCIpOwotCi0gIEV4cGVjdEVycm9yVGV4dCgiTWlzc2luZyB2YWx1ZSBmb3IgZmxhZzogLS10ZXN0X291dFxuIik7Ci19Ci0KLVRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFByaW50RnJlZUZpZWxkTnVtYmVycykgewotICBDcmVhdGVUZW1wRmlsZSgKLSAgICAgICJmb28ucHJvdG8iLAotICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAicGFja2FnZSBmb287XG4iCi0gICAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYSA9IDI7XG4iCi0gICAgICAiICBvcHRpb25hbCBzdHJpbmcgYiA9IDQ7XG4iCi0gICAgICAiICBvcHRpb25hbCBzdHJpbmcgYyA9IDU7XG4iCi0gICAgICAiICBvcHRpb25hbCBpbnQ2NCBkID0gODtcbiIKLSAgICAgICIgIG9wdGlvbmFsIGRvdWJsZSBlID0gMTA7XG4iCi0gICAgICAifVxuIik7Ci0gIENyZWF0ZVRlbXBGaWxlKAotICAgICAgImJhci5wcm90byIsCi0gICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAgICJtZXNzYWdlIEJhciB7XG4iCi0gICAgICAiICBvcHRpb25hbCBpbnQzMiBhID0gMjtcbiIKLSAgICAgICIgIGV4dGVuc2lvbnMgNCB0byA1O1xuIgotICAgICAgIiAgb3B0aW9uYWwgaW50NjQgZCA9IDg7XG4iCi0gICAgICAiICBleHRlbnNpb25zIDEwO1xuIgotICAgICAgIn1cbiIpOwotICBDcmVhdGVUZW1wRmlsZSgKLSAgICAgICJiYXoucHJvdG8iLAotICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAibWVzc2FnZSBCYXoge1xuIgotICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYSA9IDI7XG4iCi0gICAgICAiICBvcHRpb25hbCBpbnQ2NCBkID0gODtcbiIKLSAgICAgICIgIGV4dGVuc2lvbnMgMTUgdG8gbWF4O1xuIiAgLy8gdW5vcmRlcmVkLgotICAgICAgIiAgZXh0ZW5zaW9ucyAxMztcbiIKLSAgICAgICIgIGV4dGVuc2lvbnMgMTAgdG8gMTI7XG4iCi0gICAgICAiICBleHRlbnNpb25zIDU7XG4iCi0gICAgICAiICBleHRlbnNpb25zIDQ7XG4iCi0gICAgICAifVxuIik7Ci0gIENyZWF0ZVRlbXBGaWxlKAotICAgICAgInF1ei5wcm90byIsCi0gICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAgICJtZXNzYWdlIFF1eiB7XG4iCi0gICAgICAiICBtZXNzYWdlIEZvbyB7fVxuIiAgLy8gbmVzdGVkIG1lc3NhZ2UKLSAgICAgICIgIG9wdGlvbmFsIGludDMyIGEgPSAyO1xuIgotICAgICAgIiAgb3B0aW9uYWwgZ3JvdXAgQyA9IDQge1xuIgotICAgICAgIiAgICBvcHRpb25hbCBpbnQzMiBkID0gNTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIGV4dGVuc2lvbnMgOCB0byAxMDtcbiIKLSAgICAgICIgIG9wdGlvbmFsIGdyb3VwIEUgPSAxMSB7XG4iCi0gICAgICAiICAgIG9wdGlvbmFsIGludDMyIGYgPSA5O1xuIiAgICAvLyBleHBsaWNpdGx5IHJldXNlIGV4dGVuc2lvbiByYW5nZSA4LTEwCi0gICAgICAiICAgIG9wdGlvbmFsIGdyb3VwIEcgPSAxNSB7XG4iICAvLyBuZXN0ZWQgZ3JvdXAKLSAgICAgICIgICAgICBtZXNzYWdlIEZvbyB7fVxuIiAgICAgICAgIC8vIG5lc3RlZCBtZXNzYWdlIGluc2lkZSBuZXN0ZWQgZ3JvdXAKLSAgICAgICIgICAgfVxuIgotICAgICAgIiAgfVxuIgotICAgICAgIn1cbiIpOwotCi0gIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMgLS1wcm90b19wYXRoPSR0bXBkaXIgIgotICAgICAgImZvby5wcm90byBiYXIucHJvdG8gYmF6LnByb3RvIHF1ei5wcm90byIpOwotCi0gIEV4cGVjdE5vRXJyb3JzKCk7Ci0KLSAgLy8gVE9ETyhqaWVsdW8pOiBDeWd3aW4gZG9lc24ndCB3b3JrIHdlbGwgaWYgd2UgdHJ5IHRvIGNhcHR1cmUgc3RkZXJyIGFuZAotICAvLyBzdGRvdXQgYXQgdGhlIHNhbWUgdGltZS4gTmVlZCB0byBmaWd1cmUgb3V0IHdoeSBhbmQgYWRkIHRoaXMgdGVzdCBiYWNrCi0gIC8vIGZvciBDeWd3aW4uCi0jaWYgIWRlZmluZWQoX19DWUdXSU5fXykKLSAgRXhwZWN0Q2FwdHVyZWRTdGRvdXQoCi0gICAgICAiZm9vLkZvbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZTogMSAzIDYtNyA5IDExLUlORlxuIgotICAgICAgIkJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWU6IDEgMyA2LTcgOSAxMS1JTkZcbiIKLSAgICAgICJCYXogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOiAxIDMgNi03IDkgMTRcbiIKLSAgICAgICJRdXouRm9vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOiAxLUlORlxuIgotICAgICAgIlF1ei5FLkcuRm9vICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWU6IDEtSU5GXG4iCi0gICAgICAiUXV6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZTogMSAzIDYtNyAxMi0xNCAxNi1JTkZcbiIpOwotI2VuZGlmCi19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gVGVzdCBmb3IgLS1lbmNvZGUgYW5kIC0tZGVjb2RlLiAgTm90ZSB0aGF0IGl0IHdvdWxkIGJlIGVhc2llciB0byBkbyB0aGlzCi0vLyB0ZXN0IGFzIGEgc2hlbGwgc2NyaXB0LCBidXQgd2UnZCBsaWtlIHRvIGJlIGFibGUgdG8gcnVuIHRoZSB0ZXN0IG9uCi0vLyBwbGF0Zm9ybXMgdGhhdCBkb24ndCBoYXZlIGEgQm91cm5lLWNvbXBhdGlibGUgc2hlbGwgYXZhaWxhYmxlIChlc3BlY2lhbGx5Ci0vLyBXaW5kb3dzL01TVkMpLgotY2xhc3MgRW5jb2RlRGVjb2RlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBkdXBlZF9zdGRpbl8gPSBkdXAoU1RESU5fRklMRU5PKTsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBUZWFyRG93bigpIHsKLSAgICBkdXAyKGR1cGVkX3N0ZGluXywgU1RESU5fRklMRU5PKTsKLSAgICBjbG9zZShkdXBlZF9zdGRpbl8pOwotICB9Ci0KLSAgdm9pZCBSZWRpcmVjdFN0ZGluRnJvbVRleHQoY29uc3Qgc3RyaW5nJiBpbnB1dCkgewotICAgIHN0cmluZyBmaWxlbmFtZSA9IFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3Rfc3RkaW4iOwotICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyhmaWxlbmFtZSwgaW5wdXQsIHRydWUpKTsKLSAgICBHT09HTEVfQ0hFQ0soUmVkaXJlY3RTdGRpbkZyb21GaWxlKGZpbGVuYW1lKSk7Ci0gIH0KLQotICBib29sIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gICAgaW50IGZkID0gb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JET05MWSk7Ci0gICAgaWYgKGZkIDwgMCkgcmV0dXJuIGZhbHNlOwotICAgIGR1cDIoZmQsIFNURElOX0ZJTEVOTyk7Ci0gICAgY2xvc2UoZmQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gUmVtb3ZlICdccicgY2hhcmFjdGVycyBmcm9tIHRleHQuCi0gIHN0cmluZyBTdHJpcENSKGNvbnN0IHN0cmluZyYgdGV4dCkgewotICAgIHN0cmluZyByZXN1bHQ7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRleHQuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGlmICh0ZXh0W2ldICE9ICdccicpIHsKLSAgICAgICAgcmVzdWx0LnB1c2hfYmFjayh0ZXh0W2ldKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgZW51bSBUeXBlIHsgVEVYVCwgQklOQVJZIH07Ci0gIGVudW0gUmV0dXJuQ29kZSB7IFNVQ0NFU1MsIEVSUk9SIH07Ci0KLSAgYm9vbCBSdW4oY29uc3Qgc3RyaW5nJiBjb21tYW5kKSB7Ci0gICAgdmVjdG9yPHN0cmluZz4gYXJnczsKLSAgICBhcmdzLnB1c2hfYmFjaygicHJvdG9jIik7Ci0gICAgU3BsaXRTdHJpbmdVc2luZyhjb21tYW5kLCAiICIsICZhcmdzKTsKLSAgICBhcmdzLnB1c2hfYmFjaygiLS1wcm90b19wYXRoPSIgKyBUZXN0U291cmNlRGlyKCkpOwotCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGNvbnN0IGNoYXIgKiA+IGFyZ3YobmV3IGNvbnN0IGNoYXIqIFthcmdzLnNpemUoKV0pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYXJncy5zaXplKCk7IGkrKykgewotICAgICAgYXJndltpXSA9IGFyZ3NbaV0uY19zdHIoKTsKLSAgICB9Ci0KLSAgICBDb21tYW5kTGluZUludGVyZmFjZSBjbGk7Ci0gICAgY2xpLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOwotCi0gICAgQ2FwdHVyZVRlc3RTdGRvdXQoKTsKLSAgICBDYXB0dXJlVGVzdFN0ZGVycigpOwotCi0gICAgaW50IHJlc3VsdCA9IGNsaS5SdW4oYXJncy5zaXplKCksIGFyZ3YuZ2V0KCkpOwotCi0gICAgY2FwdHVyZWRfc3Rkb3V0XyA9IEdldENhcHR1cmVkVGVzdFN0ZG91dCgpOwotICAgIGNhcHR1cmVkX3N0ZGVycl8gPSBHZXRDYXB0dXJlZFRlc3RTdGRlcnIoKTsKLQotICAgIHJldHVybiByZXN1bHQgPT0gMDsKLSAgfQotCi0gIHZvaWQgRXhwZWN0U3Rkb3V0TWF0Y2hlc0JpbmFyeUZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICAgIHN0cmluZyBleHBlY3RlZF9vdXRwdXQ7Ci0gICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKGZpbGVuYW1lLCAmZXhwZWN0ZWRfb3V0cHV0LCB0cnVlKSk7Ci0KLSAgICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmludCByYXcgYmluYXJ5IGRhdGEgdG8KLSAgICAvLyBzdGRvdXQgb24gZmFpbHVyZS4KLSAgICBFWFBFQ1RfVFJVRShjYXB0dXJlZF9zdGRvdXRfID09IGV4cGVjdGVkX291dHB1dCk7Ci0gIH0KLQotICB2b2lkIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0RmlsZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gICAgc3RyaW5nIGV4cGVjdGVkX291dHB1dDsKLSAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoZmlsZW5hbWUsICZleHBlY3RlZF9vdXRwdXQsIHRydWUpKTsKLQotICAgIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KGV4cGVjdGVkX291dHB1dCk7Ci0gIH0KLQotICB2b2lkIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgewotICAgIEVYUEVDVF9FUShTdHJpcENSKGV4cGVjdGVkX3RleHQpLCBTdHJpcENSKGNhcHR1cmVkX3N0ZG91dF8pKTsKLSAgfQotCi0gIHZvaWQgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoY29uc3Qgc3RyaW5nJiBleHBlY3RlZF90ZXh0KSB7Ci0gICAgRVhQRUNUX0VRKFN0cmlwQ1IoZXhwZWN0ZWRfdGV4dCksIFN0cmlwQ1IoY2FwdHVyZWRfc3RkZXJyXykpOwotICB9Ci0KLSBwcml2YXRlOgotICBpbnQgZHVwZWRfc3RkaW5fOwotICBzdHJpbmcgY2FwdHVyZWRfc3Rkb3V0XzsKLSAgc3RyaW5nIGNhcHR1cmVkX3N0ZGVycl87Ci19OwotCi1URVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgRW5jb2RlKSB7Ci0gIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShUZXN0U291cmNlRGlyKCkgKyAiL2dvb2dsZS9wcm90b2J1Zi8iCi0gICAgInRlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfb25lb2ZfaW1wbGVtZW50ZWQudHh0Iik7Ci0gIEVYUEVDVF9UUlVFKFJ1bigiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICIKLSAgICAgICAgICAgICAgICAgICItLWVuY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7Ci0gIEV4cGVjdFN0ZG91dE1hdGNoZXNCaW5hcnlGaWxlKFRlc3RTb3VyY2VEaXIoKSArCi0gICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQiKTsKLSAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIiIpOwotfQotCi1URVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgRGVjb2RlKSB7Ci0gIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShUZXN0U291cmNlRGlyKCkgKwotICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlX29uZW9mX2ltcGxlbWVudGVkIik7Ci0gIEVYUEVDVF9UUlVFKFJ1bigiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICIKLSAgICAgICAgICAgICAgICAgICItLWRlY29kZT1wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMiKSk7Ci0gIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0RmlsZShUZXN0U291cmNlRGlyKCkgKwotICAgICIvZ29vZ2xlL3Byb3RvYnVmLyIKLSAgICAidGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQiKTsKLSAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIiIpOwotfQotCi1URVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgUGFydGlhbCkgewotICBSZWRpcmVjdFN0ZGluRnJvbVRleHQoIiIpOwotICBFWFBFQ1RfVFJVRShSdW4oImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byAiCi0gICAgICAgICAgICAgICAgICAiLS1lbmNvZGU9cHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkIikpOwotICBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dCgiIik7Ci0gIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KAotICAgICJ3YXJuaW5nOiAgSW5wdXQgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIGEsIGIsIGNcbiIpOwotfQotCi1URVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgRGVjb2RlUmF3KSB7Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMTIzKTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJmb28iKTsKLSAgc3RyaW5nIGRhdGE7Ci0gIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotCi0gIFJlZGlyZWN0U3RkaW5Gcm9tVGV4dChkYXRhKTsKLSAgRVhQRUNUX1RSVUUoUnVuKCItLWRlY29kZV9yYXciKSk7Ci0gIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KCIxOiAxMjNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIjE0OiBcImZvb1wiXG4iKTsKLSAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIiIpOwotfQotCi1URVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgVW5rbm93blR5cGUpIHsKLSAgRVhQRUNUX0ZBTFNFKFJ1bigiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvICIKLSAgICAgICAgICAgICAgICAgICAiLS1lbmNvZGU9Tm9TdWNoVHlwZSIpKTsKLSAgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHQoIiIpOwotICBFeHBlY3RTdGRlcnJNYXRjaGVzVGV4dCgiVHlwZSBub3QgZGVmaW5lZDogTm9TdWNoVHlwZVxuIik7Ci19Ci0KLVRFU1RfRihFbmNvZGVEZWNvZGVUZXN0LCBQcm90b1BhcnNlRXJyb3IpIHsKLSAgRVhQRUNUX0ZBTFNFKFJ1bigiZ29vZ2xlL3Byb3RvYnVmL25vX3N1Y2hfZmlsZS5wcm90byAiCi0gICAgICAgICAgICAgICAgICAgIi0tZW5jb2RlPU5vU3VjaFR5cGUiKSk7Ci0gIEV4cGVjdFN0ZG91dE1hdGNoZXNUZXh0KCIiKTsKLSAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoCi0gICAgImdvb2dsZS9wcm90b2J1Zi9ub19zdWNoX2ZpbGUucHJvdG86IEZpbGUgbm90IGZvdW5kLlxuIik7Ci19Ci0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotI2VuZGlmICAvLyAhR09PR0xFX1BST1RPQlVGX0hFQVBfQ0hFQ0tfRFJBQ09OSUFOCi0KLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzc0NTFhYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTU5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIHRlc3QgaW5zdXJlcyB0aGF0IGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLntoLGNjfSBtYXRjaCBleGFjdGx5Ci0vLyB3aGF0IHdvdWxkIGJlIGdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgY29tcGlsZXIuICBUaGVzZSBmaWxlcyBhcmUgbm90Ci0vLyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBhdCBidWlsZCB0aW1lIGJlY2F1c2UgdGhleSBhcmUgY29tcGlsZWQgaW50byB0aGUKLS8vIHByb3RvY29sIGNvbXBpbGVyIGl0c2VsZi4gIFNvLCBpZiB0aGV5IHdlcmUgYXV0by1nZW5lcmF0ZWQsIHlvdSdkIGhhdmUgYQotLy8gY2hpY2tlbi1hbmQtZWdnIHByb2JsZW0uCi0vLwotLy8gSWYgdGhpcyB0ZXN0IGZhaWxzLCBydW4gdGhlIHNjcmlwdAotLy8gImdlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2giIGFuZCBhZGQKLS8vIGRlc2NyaXB0b3IucGIue2gsY2N9IHRvIHlvdXIgY2hhbmdlbGlzdC4KLQotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgY3BwIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW9ja0Vycm9yQ29sbGVjdG9yIDogcHVibGljIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHsKLSBwdWJsaWM6Ci0gIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9Ci0gIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotCi0gIHN0cmluZyB0ZXh0XzsKLQotICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnRleHRfLCAiJDA6JDE6JDI6ICQzXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0gIH0KLX07Ci0KLWNsYXNzIE1vY2tHZW5lcmF0b3JDb250ZXh0IDogcHVibGljIEdlbmVyYXRvckNvbnRleHQgewotIHB1YmxpYzoKLSAgTW9ja0dlbmVyYXRvckNvbnRleHQoKSB7fQotICB+TW9ja0dlbmVyYXRvckNvbnRleHQoKSB7Ci0gICAgU1RMRGVsZXRlVmFsdWVzKCZmaWxlc18pOwotICB9Ci0KLSAgdm9pZCBFeHBlY3RGaWxlTWF0Y2hlcyhjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwaHlzaWNhbF9maWxlbmFtZSkgewotICAgIHN0cmluZyogZXhwZWN0ZWRfY29udGVudHMgPSBGaW5kUHRyT3JOdWxsKGZpbGVzXywgdmlydHVhbF9maWxlbmFtZSk7Ci0gICAgQVNTRVJUX1RSVUUoZXhwZWN0ZWRfY29udGVudHMgIT0gTlVMTCkKLSAgICAgIDw8ICJHZW5lcmF0b3IgZmFpbGVkIHRvIGdlbmVyYXRlIGZpbGU6ICIgPDwgdmlydHVhbF9maWxlbmFtZTsKLQotICAgIHN0cmluZyBhY3R1YWxfY29udGVudHM7Ci0gICAgR09PR0xFX0NIRUNLX09LKAotICAgICAgICBGaWxlOjpHZXRDb250ZW50cyhUZXN0U291cmNlRGlyKCkgKyAiLyIgKyBwaHlzaWNhbF9maWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJmFjdHVhbF9jb250ZW50cywgdHJ1ZSkpOwotICAgIEVYUEVDVF9UUlVFKGFjdHVhbF9jb250ZW50cyA9PSAqZXhwZWN0ZWRfY29udGVudHMpCi0gICAgICA8PCBwaHlzaWNhbF9maWxlbmFtZSA8PCAiIG5lZWRzIHRvIGJlIHJlZ2VuZXJhdGVkLiAgUGxlYXNlIHJ1biAiCi0gICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3JlbGVhc2VfY29tcGlsZXIuc2ggYW5kICIKLSAgICAgICAgICJnZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoLiBUaGVuIGFkZCB0aGlzIGZpbGUgIgotICAgICAgICAgInRvIHlvdXIgQ0wuIjsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgR2VuZXJhdG9yQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHZpcnR1YWwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKLSAgICBzdHJpbmcqKiBtYXBfc2xvdCA9ICZmaWxlc19bZmlsZW5hbWVdOwotICAgIGRlbGV0ZSAqbWFwX3Nsb3Q7Ci0gICAgKm1hcF9zbG90ID0gbmV3IHN0cmluZzsKLQotICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbSgqbWFwX3Nsb3QpOwotICB9Ci0KLSBwcml2YXRlOgotICBtYXA8c3RyaW5nLCBzdHJpbmcqPiBmaWxlc187Ci19OwotCi1URVNUKEJvb3RzdHJhcFRlc3QsIEdlbmVyYXRlZERlc2NyaXB0b3JNYXRjaGVzKSB7Ci0gIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7Ci0gIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOwotICBzb3VyY2VfdHJlZS5NYXBQYXRoKCIiLCBUZXN0U291cmNlRGlyKCkpOwotICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHJvdG9fZmlsZSA9Ci0gICAgaW1wb3J0ZXIuSW1wb3J0KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGx1Z2luX3Byb3RvX2ZpbGUgPQotICAgIGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byIpOwotICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Ci0gIEFTU0VSVF9UUlVFKHByb3RvX2ZpbGUgIT0gTlVMTCk7Ci0gIEFTU0VSVF9UUlVFKHBsdWdpbl9wcm90b19maWxlICE9IE5VTEwpOwotCi0gIENwcEdlbmVyYXRvciBnZW5lcmF0b3I7Ci0gIE1vY2tHZW5lcmF0b3JDb250ZXh0IGNvbnRleHQ7Ci0gIHN0cmluZyBlcnJvcjsKLSAgc3RyaW5nIHBhcmFtZXRlciA9ICJkbGxleHBvcnRfZGVjbD1MSUJQUk9UT0JVRl9FWFBPUlQiOwotICBBU1NFUlRfVFJVRShnZW5lcmF0b3IuR2VuZXJhdGUocHJvdG9fZmlsZSwgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsICZlcnJvcikpOwotICBwYXJhbWV0ZXIgPSAiZGxsZXhwb3J0X2RlY2w9TElCUFJPVE9DX0VYUE9SVCI7Ci0gIEFTU0VSVF9UUlVFKGdlbmVyYXRvci5HZW5lcmF0ZShwbHVnaW5fcHJvdG9fZmlsZSwgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvbnRleHQsICZlcnJvcikpOwotCi0gIGNvbnRleHQuRXhwZWN0RmlsZU1hdGNoZXMoImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIik7Ci0gIGNvbnRleHQuRXhwZWN0RmlsZU1hdGNoZXMoImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MiKTsKLSAgY29udGV4dC5FeHBlY3RGaWxlTWF0Y2hlcygiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oIik7Ci0gIGNvbnRleHQuRXhwZWN0RmlsZU1hdGNoZXMoImdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjIik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzgxYzU5OC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMxOSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxtYXA+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi1uYW1lc3BhY2UgewotLy8gVGhlIEdPT0dMRV9BUlJBWVNJWkUgY29uc3RhbnQgaXMgdGhlIG1heCBlbnVtIHZhbHVlIHBsdXMgMS4gSWYgdGhlIG1heCBlbnVtIHZhbHVlCi0vLyBpcyA6Omdvb2dsZTo6cHJvdG9idWY6OmtpbnQzMm1heCwgR09PR0xFX0FSUkFZU0laRSB3aWxsIG92ZXJmbG93LiBJbiBzdWNoIGNhc2VzIHdlIHNob3VsZCBvbWl0IHRoZQotLy8gZ2VuZXJhdGlvbiBvZiB0aGUgR09PR0xFX0FSUkFZU0laRSBjb25zdGFudC4KLWJvb2wgU2hvdWxkR2VuZXJhdGVBcnJheVNpemUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgaW50MzIgbWF4X3ZhbHVlID0gZGVzY3JpcHRvci0+dmFsdWUoMCktPm51bWJlcigpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPnZhbHVlX2NvdW50KCk7IGkrKykgewotICAgIGlmIChkZXNjcmlwdG9yLT52YWx1ZShpKS0+bnVtYmVyKCkgPiBtYXhfdmFsdWUpIHsKLSAgICAgIG1heF92YWx1ZSA9IGRlc2NyaXB0b3ItPnZhbHVlKGkpLT5udW1iZXIoKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG1heF92YWx1ZSAhPSA6Omdvb2dsZTo6cHJvdG9idWY6OmtpbnQzMm1heDsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1FbnVtR2VuZXJhdG9yOjpFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAotICAgIGNsYXNzbmFtZV8oQ2xhc3NOYW1lKGRlc2NyaXB0b3IsIGZhbHNlKSksCi0gICAgb3B0aW9uc18ob3B0aW9ucyksCi0gICAgZ2VuZXJhdGVfYXJyYXlfc2l6ZV8oU2hvdWxkR2VuZXJhdGVBcnJheVNpemUoZGVzY3JpcHRvcikpIHsKLX0KLQotRW51bUdlbmVyYXRvcjo6fkVudW1HZW5lcmF0b3IoKSB7fQotCi12b2lkIEVudW1HZW5lcmF0b3I6OkZpbGxGb3J3YXJkRGVjbGFyYXRpb24oCi0gICAgbWFwPHN0cmluZywgY29uc3QgRW51bURlc2NyaXB0b3IqPiogZW51bV9uYW1lcykgewotICBpZiAoIW9wdGlvbnNfLnByb3RvX2gpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgKCplbnVtX25hbWVzKVtjbGFzc25hbWVfXSA9IGRlc2NyaXB0b3JfOwotfQotCi12b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKLSAgdmFyc1sic2hvcnRfbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKLSAgdmFyc1siZW51bWJhc2UiXSA9IGNsYXNzbmFtZV8gKyAob3B0aW9uc18ucHJvdG9faCA/ICIgOiBpbnQiIDogIiIpOwotCi0gIHByaW50ZXItPlByaW50KHZhcnMsICJlbnVtICRlbnVtYmFzZSQge1xuIik7Ci0gIHByaW50ZXItPkFubm90YXRlKCJlbnVtYmFzZSIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbWluX3ZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKDApOwotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBtYXhfdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoMCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7Ci0gICAgdmFyc1sibmFtZSJdID0gRW51bVZhbHVlTmFtZShkZXNjcmlwdG9yXy0+dmFsdWUoaSkpOwotICAgIC8vIEluIEMrKywgYW4gdmFsdWUgb2YgLTIxNDc0ODM2NDggZ2V0cyBpbnRlcnByZXRlZCBhcyB0aGUgbmVnYXRpdmUgb2YKLSAgICAvLyAyMTQ3NDgzNjQ4LCBhbmQgc2luY2UgMjE0NzQ4MzY0OCBjYW4ndCBmaXQgaW4gYW4gaW50ZWdlciwgdGhpcyBwcm9kdWNlcyBhCi0gICAgLy8gY29tcGlsZXIgd2FybmluZy4gIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgaXNzdWUuCi0gICAgdmFyc1sibnVtYmVyIl0gPSBJbnQzMlRvU3RyaW5nKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkpOwotICAgIHZhcnNbInByZWZpeCJdID0gKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSA/Ci0gICAgICAiIiA6IGNsYXNzbmFtZV8gKyAiXyI7Ci0gICAgdmFyc1siZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/Ci0gICAgICAgICIgUFJPVE9CVUZfREVQUkVDQVRFRCIgOiAiIjsKLQotICAgIGlmIChpID4gMCkgcHJpbnRlci0+UHJpbnQoIixcbiIpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsICIkcHJlZml4JCRuYW1lJCRkZXByZWNhdGlvbiQgPSAkbnVtYmVyJCIpOwotCi0gICAgaWYgKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkgPCBtaW5fdmFsdWUtPm51bWJlcigpKSB7Ci0gICAgICBtaW5fdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSk7Ci0gICAgfQotICAgIGlmIChkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpID4gbWF4X3ZhbHVlLT5udW1iZXIoKSkgewotICAgICAgbWF4X3ZhbHVlID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpOwotICAgIH0KLSAgfQotCi0gIGlmIChIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAvLyBGb3IgbmV3IGVudW0gc2VtYW50aWNzOiBnZW5lcmF0ZSBtaW4gYW5kIG1heCBzZW50aW5lbCB2YWx1ZXMgZXF1YWwgdG8KLSAgICAvLyBJTlQzMl9NSU4gYW5kIElOVDMyX01BWAotICAgIGlmIChkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKSA+IDApIHByaW50ZXItPlByaW50KCIsXG4iKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAiJGNsYXNzbmFtZSRfJHByZWZpeCRJTlRfTUlOX1NFTlRJTkVMX0RPX05PVF9VU0VfID0gOjpnb29nbGU6OnByb3RvYnVmOjpraW50MzJtaW4sXG4iCi0gICAgICAgICIkY2xhc3NuYW1lJF8kcHJlZml4JElOVF9NQVhfU0VOVElORUxfRE9fTk9UX1VTRV8gPSA6Omdvb2dsZTo6cHJvdG9idWY6OmtpbnQzMm1heCIpOwotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgiXG59O1xuIik7Ci0KLSAgdmFyc1sibWluX25hbWUiXSA9IEVudW1WYWx1ZU5hbWUobWluX3ZhbHVlKTsKLSAgdmFyc1sibWF4X25hbWUiXSA9IEVudW1WYWx1ZU5hbWUobWF4X3ZhbHVlKTsKLQotICBpZiAob3B0aW9uc18uZGxsZXhwb3J0X2RlY2wuZW1wdHkoKSkgewotICAgIHZhcnNbImRsbGV4cG9ydCJdID0gIiI7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyc1siZGxsZXhwb3J0Il0gPSBvcHRpb25zXy5kbGxleHBvcnRfZGVjbCArICIgIjsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiRkbGxleHBvcnQkYm9vbCAkY2xhc3NuYW1lJF9Jc1ZhbGlkKGludCB2YWx1ZSk7XG4iCi0gICAgImNvbnN0ICRjbGFzc25hbWUkICRwcmVmaXgkJHNob3J0X25hbWUkX01JTiA9ICRwcmVmaXgkJG1pbl9uYW1lJDtcbiIKLSAgICAiY29uc3QgJGNsYXNzbmFtZSQgJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYID0gJHByZWZpeCQkbWF4X25hbWUkO1xuIik7Ci0KLSAgaWYgKGdlbmVyYXRlX2FycmF5X3NpemVfKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICJjb25zdCBpbnQgJHByZWZpeCQkc2hvcnRfbmFtZSRfQVJSQVlTSVpFID0gIgotICAgICAgIiRwcmVmaXgkJHNob3J0X25hbWUkX01BWCArIDE7XG5cbiIpOwotICB9Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiJGRsbGV4cG9ydCRjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCk7XG4iKTsKLSAgICAvLyBUaGUgX05hbWUgYW5kIF9QYXJzZSBtZXRob2RzCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgIHZhcnMsCi0gICAgICAgICJpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSRfTmFtZSgkY2xhc3NuYW1lJCB2YWx1ZSkge1xuIgotICAgICAgICAiICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bShcbiIKLSAgICAgICAgIiAgICAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCksIHZhbHVlKTtcbiIKLSAgICAgICAgIn1cbiIpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSRfUGFyc2UoXG4iCi0gICAgICAiICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsICRjbGFzc25hbWUkKiB2YWx1ZSkge1xuIgotICAgICAgIiAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPCRjbGFzc25hbWUkPihcbiIKLSAgICAgICIgICAgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLX0KLQotdm9pZCBFbnVtR2VuZXJhdG9yOjoKLUdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAidGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08ICRjbGFzc25hbWUkPiA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSAiCi0gICAgICAie307XG4iLAotICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXywgdHJ1ZSkpOwotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAidGVtcGxhdGUgPD5cbiIKLSAgICAgICJpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCAkY2xhc3NuYW1lJD4oKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIgotICAgICAgIn1cbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCB0cnVlKSk7Ci0gIH0KLX0KLQotdm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZVN5bWJvbEltcG9ydHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICB2YXJzWyJuZXN0ZWRfbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKLSAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOwotICB2YXJzWyJjb25zdGV4cHIiXSA9IG9wdGlvbnNfLnByb3RvX2ggPyAiY29uc3RleHByICIgOiAiIjsKLSAgcHJpbnRlci0+UHJpbnQodmFycywgInR5cGVkZWYgJGNsYXNzbmFtZSQgJG5lc3RlZF9uYW1lJDtcbiIpOwotCi0gIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGorKykgewotICAgIHZhcnNbInRhZyJdID0gRW51bVZhbHVlTmFtZShkZXNjcmlwdG9yXy0+dmFsdWUoaikpOwotICAgIHZhcnNbImRlcHJlY2F0ZWRfYXR0ciJdID0gZGVzY3JpcHRvcl8tPnZhbHVlKGopLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8KLSAgICAgICJQUk9UT0JVRl9ERVBSRUNBVEVEX0FUVFIgIiA6ICIiOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRzdGF0aWMgJGNvbnN0ZXhwciRjb25zdCAkbmVzdGVkX25hbWUkICR0YWckID1cbiIKLSAgICAgICIgICRjbGFzc25hbWUkXyR0YWckO1xuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICJzdGF0aWMgaW5saW5lIGJvb2wgJG5lc3RlZF9uYW1lJF9Jc1ZhbGlkKGludCB2YWx1ZSkge1xuIgotICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9Jc1ZhbGlkKHZhbHVlKTtcbiIKLSAgICAifVxuIgotICAgICJzdGF0aWMgY29uc3QgJG5lc3RlZF9uYW1lJCAkbmVzdGVkX25hbWUkX01JTiA9XG4iCi0gICAgIiAgJGNsYXNzbmFtZSRfJG5lc3RlZF9uYW1lJF9NSU47XG4iCi0gICAgInN0YXRpYyBjb25zdCAkbmVzdGVkX25hbWUkICRuZXN0ZWRfbmFtZSRfTUFYID1cbiIKLSAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX01BWDtcbiIpOwotICBpZiAoZ2VuZXJhdGVfYXJyYXlfc2l6ZV8pIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgInN0YXRpYyBjb25zdCBpbnQgJG5lc3RlZF9uYW1lJF9BUlJBWVNJWkUgPVxuIgotICAgICAgIiAgJGNsYXNzbmFtZSRfJG5lc3RlZF9uYW1lJF9BUlJBWVNJWkU7XG4iKTsKLSAgfQotCi0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgInN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcipcbiIKLSAgICAgICIkbmVzdGVkX25hbWUkX2Rlc2NyaXB0b3IoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIgotICAgICAgIn1cbiIpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICAgICAgICAgICAgInN0YXRpYyBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgIgotICAgICAgICAgICAgICAgICAgICIkbmVzdGVkX25hbWUkX05hbWUoJG5lc3RlZF9uYW1lJCB2YWx1ZSkgeyIKLSAgICAgICAgICAgICAgICAgICAiXG4iCi0gICAgICAgICAgICAgICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX05hbWUodmFsdWUpO1xuIgotICAgICAgICAgICAgICAgICAgICJ9XG4iKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgInN0YXRpYyBpbmxpbmUgYm9vbCAkbmVzdGVkX25hbWUkX1BhcnNlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsXG4iCi0gICAgICAiICAgICRuZXN0ZWRfbmFtZSQqIHZhbHVlKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfUGFyc2UobmFtZSwgdmFsdWUpO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGludCBpbmRleCkgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKLSAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaW5kZXgpOwotCi0gIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8gPSBmaWxlLT5lbnVtX3R5cGUoJGluZGV4JCk7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICB2YXJzWyJwYXJlbnQiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCksIGZhbHNlKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIiRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfID0gJHBhcmVudCRfZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgkaW5kZXgkKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGVNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOwotICB2YXJzWyJjb25zdGV4cHIiXSA9IG9wdGlvbnNfLnByb3RvX2ggPyAiY29uc3RleHByICIgOiAiIjsKLQotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCkge1xuIgotICAgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iCi0gICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl87XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICJib29sICRjbGFzc25hbWUkX0lzVmFsaWQoaW50IHZhbHVlKSB7XG4iCi0gICAgIiAgc3dpdGNoKHZhbHVlKSB7XG4iKTsKLQotICAvLyBNdWx0aXBsZSB2YWx1ZXMgbWF5IGhhdmUgdGhlIHNhbWUgbnVtYmVyLiAgTWFrZSBzdXJlIHdlIG9ubHkgY292ZXIKLSAgLy8gZWFjaCBudW1iZXIgb25jZSBieSBmaXJzdCBjb25zdHJ1Y3RpbmcgYSBzZXQgY29udGFpbmluZyBhbGwgdmFsaWQKLSAgLy8gbnVtYmVycywgdGhlbiBwcmludGluZyBhIGNhc2Ugc3RhdGVtZW50IGZvciBlYWNoIGVsZW1lbnQuCi0KLSAgc2V0PGludD4gbnVtYmVyczsKLSAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaisrKSB7Ci0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoaik7Ci0gICAgbnVtYmVycy5pbnNlcnQodmFsdWUtPm51bWJlcigpKTsKLSAgfQotCi0gIGZvciAoc2V0PGludD46Oml0ZXJhdG9yIGl0ZXIgPSBudW1iZXJzLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBudW1iZXJzLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIgICAgY2FzZSAkbnVtYmVyJDpcbiIsCi0gICAgICAibnVtYmVyIiwgSW50MzJUb1N0cmluZygqaXRlcikpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAiICAgICAgcmV0dXJuIHRydWU7XG4iCi0gICAgIiAgICBkZWZhdWx0OlxuIgotICAgICIgICAgICByZXR1cm4gZmFsc2U7XG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iCi0gICAgIlxuIik7Ci0KLSAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7Ci0gICAgLy8gV2UgbmVlZCB0byAiZGVmaW5lIiB0aGUgc3RhdGljIGNvbnN0YW50cyB3aGljaCB3ZXJlIGRlY2xhcmVkIGluIHRoZQotICAgIC8vIGhlYWRlciwgdG8gZ2l2ZSB0aGUgbGlua2VyIGEgcGxhY2UgdG8gcHV0IHRoZW0uICBPciBhdCBsZWFzdCB0aGUgQysrCi0gICAgLy8gc3RhbmRhcmQgc2F5cyB3ZSBoYXZlIHRvLiAgTVNWQyBhY3R1YWxseSBpbnNpc3RzIHRoYXQgd2UgZG8gX25vdF8gZGVmaW5lCi0gICAgLy8gdGhlbSBhZ2FpbiBpbiB0aGUgLmNjIGZpbGUsIHByaW9yIHRvIFZDKysgMjAxNS4KLSAgICBwcmludGVyLT5QcmludCgiI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwXG4iKTsKLQotICAgIHZhcnNbInBhcmVudCJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwgZmFsc2UpOwotICAgIHZhcnNbIm5lc3RlZF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgewotICAgICAgdmFyc1sidmFsdWUiXSA9IEVudW1WYWx1ZU5hbWUoZGVzY3JpcHRvcl8tPnZhbHVlKGkpKTsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICIkY29uc3RleHByJGNvbnN0ICRjbGFzc25hbWUkICRwYXJlbnQkOjokdmFsdWUkO1xuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiY29uc3QgJGNsYXNzbmFtZSQgJHBhcmVudCQ6OiRuZXN0ZWRfbmFtZSRfTUlOO1xuIgotICAgICAgImNvbnN0ICRjbGFzc25hbWUkICRwYXJlbnQkOjokbmVzdGVkX25hbWUkX01BWDtcbiIpOwotICAgIGlmIChnZW5lcmF0ZV9hcnJheV9zaXplXykgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICAgImNvbnN0IGludCAkcGFyZW50JDo6JG5lc3RlZF9uYW1lJF9BUlJBWVNJWkU7XG4iKTsKLSAgICB9Ci0KLSAgICBwcmludGVyLT5QcmludCgiI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMFxuIik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MGVkZjAwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FTlVNX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKLSAgfQotfQotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi1jbGFzcyBFbnVtR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgotICBFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLSAgfkVudW1HZW5lcmF0b3IoKTsKLQotICAvLyBIZWFkZXIgc3R1ZmYuCi0KLSAgLy8gRmlsbHMgdGhlIG5hbWUgdG8gdXNlIHdoZW4gZGVjbGFyaW5nIHRoZSBlbnVtLiBUaGlzIGlzIGZvciB1c2Ugd2hlbgotICAvLyBnZW5lcmF0aW5nIG90aGVyIC5wcm90by5oIGZpbGVzLiBUaGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCB3aXRoaW4gdGhlCi0gIC8vIGVudW0ncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0IE5PVCB3aXRoaW4gYW55IGNsYXNzLCBldmVuIGZvciBuZXN0ZWQKLSAgLy8gZW51bXMuIEEgZ2l2ZW4ga2V5IGluIGVudW1fbmFtZXMgd2lsbCBtYXAgZnJvbSBhbiBlbnVtIGNsYXNzIG5hbWUgdG8gdGhlCi0gIC8vIEVudW1EZXNjcmlwdG9yIHRoYXQgd2FzIHJlc3BvbnNpYmxlIGZvciBpdHMgaW5jbHVzaW9uIGluIHRoZSBtYXAuIFRoaXMgY2FuCi0gIC8vIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBpdC4KLSAgdm9pZCBGaWxsRm9yd2FyZERlY2xhcmF0aW9uKG1hcDxzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4qIGVudW1fbmFtZXMpOwotCi0gIC8vIEdlbmVyYXRlIGhlYWRlciBjb2RlIGRlZmluaW5nIHRoZSBlbnVtLiAgVGhpcyBjb2RlIHNob3VsZCBiZSBwbGFjZWQKLSAgLy8gd2l0aGluIHRoZSBlbnVtJ3MgcGFja2FnZSBuYW1lc3BhY2UsIGJ1dCBOT1Qgd2l0aGluIGFueSBjbGFzcywgZXZlbiBmb3IKLSAgLy8gbmVzdGVkIGVudW1zLgotICB2b2lkIEdlbmVyYXRlRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgc3BlY2lhbGl6YXRpb24gb2YgR2V0RW51bURlc2NyaXB0b3I8TXlFbnVtPigpLgotICAvLyBQcmVjb25kaXRpb246IGluIDo6Z29vZ2xlOjpwcm90b2J1ZiBuYW1lc3BhY2UuCi0gIHZvaWQgR2VuZXJhdGVHZXRFbnVtRGVzY3JpcHRvclNwZWNpYWxpemF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gRm9yIGVudW1zIG5lc3RlZCB3aXRoaW4gYSBtZXNzYWdlLCBnZW5lcmF0ZSBjb2RlIHRvIGltcG9ydCBhbGwgdGhlIGVudW0ncwotICAvLyBzeW1ib2xzIChlLmcuIHRoZSBlbnVtIHR5cGUgbmFtZSwgYWxsIGl0cyB2YWx1ZXMsIGV0Yy4pIGludG8gdGhlIGNsYXNzJ3MKLSAgLy8gbmFtZXNwYWNlLiAgVGhpcyBzaG91bGQgYmUgcGxhY2VkIGluc2lkZSB0aGUgY2xhc3MgZGVmaW5pdGlvbiBpbiB0aGUKLSAgLy8gaGVhZGVyLgotICB2b2lkIEdlbmVyYXRlU3ltYm9sSW1wb3J0cyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gU291cmNlIGZpbGUgc3R1ZmYuCi0KLSAgLy8gR2VuZXJhdGUgY29kZSB0aGF0IGluaXRpYWxpemVzIHRoZSBnbG9iYWwgdmFyaWFibGUgc3RvcmluZyB0aGUgZW51bSdzCi0gIC8vIGRlc2NyaXB0b3IuCi0gIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCBpbmRleCk7Ci0KLSAgLy8gR2VuZXJhdGUgbm9uLWlubGluZSBtZXRob2RzIHJlbGF0ZWQgdG8gdGhlIGVudW0sIHN1Y2ggYXMgSXNWYWxpZFZhbHVlKCkuCi0gIC8vIEdvZXMgaW4gdGhlIC5jYyBmaWxlLgotICB2b2lkIEdlbmVyYXRlTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSBwcml2YXRlOgotICBjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIGNvbnN0IHN0cmluZyBjbGFzc25hbWVfOwotICBjb25zdCBPcHRpb25zJiBvcHRpb25zXzsKLSAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgKl9BUlJBWVNJWkUgY29uc3RhbnQuCi0gIGNvbnN0IGJvb2wgZ2VuZXJhdGVfYXJyYXlfc2l6ZV87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1HZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0VOVU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMDI1MmIzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTA3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGNwcCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgU2V0RW51bVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzLCBvcHRpb25zKTsKLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVmYXVsdF92YWx1ZSA9IGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfZW51bSgpOwotICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yLT5lbnVtX3R5cGUoKSwgdHJ1ZSk7Ci0gICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gSW50MzJUb1N0cmluZyhkZWZhdWx0X3ZhbHVlLT5udW1iZXIoKSk7Ci0gICgqdmFyaWFibGVzKVsiZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRW51bUZpZWxkR2VuZXJhdG9yOjpFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgICA6IEZpZWxkR2VuZXJhdG9yKG9wdGlvbnMpLCBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7Ci0gIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOwotfQotCi1FbnVtRmllbGRHZW5lcmF0b3I6On5FbnVtRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJpbnQgJG5hbWUkXztcbiIpOwotfQotCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkICRuYW1lJCgpIGNvbnN0O1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpO1xuIik7Ci19Ci0KLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3QgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUiIDogIiI7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiJGlubGluZSQgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKLSAgICAiICByZXR1cm4gc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KCRuYW1lJF8pO1xuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iKTsKLSAgaWYgKCFIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiAgYXNzZXJ0KCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSk7XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiAgJHNldF9oYXNiaXQkXG4iCi0gICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOwotfQotCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzZXRfJG5hbWUkKGZyb20uJG5hbWUkKCkpO1xuIik7Ci19Ci0KLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGQ6OnN3YXAoJG5hbWUkXywgb3RoZXItPiRuYW1lJF8pO1xuIik7Ci19Ci0KLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Ci19Ci0KLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaW50IHZhbHVlO1xuIgotICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgotICAgICIgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KFxuIgotICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIpOwotICBpZiAoSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJzZXRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoJHR5cGUkX0lzVmFsaWQodmFsdWUpKSB7XG4iCi0gICAgICAiICBzZXRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7Ci0gICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICJ9IGVsc2Uge1xuIgotICAgICAgICAiICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgkbnVtYmVyJCwgdmFsdWUpO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAifSBlbHNlIHtcbiIKLSAgICAgICAgIiAgdW5rbm93bl9maWVsZHNfc3RyZWFtLldyaXRlVmFyaW50MzIoJHRhZyQpO1xuIgotICAgICAgICAiICB1bmtub3duX2ZpZWxkc19zdHJlYW0uV3JpdGVWYXJpbnQzMih2YWx1ZSk7XG4iLAotICAgICAgICAidGFnIiwgU2ltcGxlSXRvYShpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yXykpKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKFxuIgotICAgICIgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoKSwgb3V0cHV0KTtcbiIpOwotfQotCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAidGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoXG4iCi0gICAgIiAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCB0YXJnZXQpO1xuIik7Ci19Ci0KLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKLSAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+JG5hbWUkKCkpO1xuIik7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotRW51bU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgOiBFbnVtRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucykgewotICBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKLX0KLQotRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6On5FbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOwotICB2YXJpYWJsZXNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSIgOiAiIjsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICIkaW5saW5lJCAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgotICAgICIgIGlmIChoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAiICAgIHJldHVybiBzdGF0aWNfY2FzdDwgJHR5cGUkID4oJG9uZW9mX3ByZWZpeCQkbmFtZSRfKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuIHN0YXRpY19jYXN0PCAkdHlwZSQgPigkZGVmYXVsdCQpO1xuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iKTsKLSAgaWYgKCFIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiAgYXNzZXJ0KCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSk7XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRvbmVvZl9wcmVmaXgkJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOwotfQotCi12b2lkIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIERvbid0IHByaW50IGFueSBzd2FwcGluZyBjb2RlLiBTd2FwcGluZyB0aGUgdW5pb24gd2lsbCBzd2FwIHRoaXMgZmllbGQuCi19Ci0KLXZvaWQgRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICAkY2xhc3NuYW1lJF9kZWZhdWx0X29uZW9mX2luc3RhbmNlXy0+JG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjpSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCi0gICAgOiBGaWVsZEdlbmVyYXRvcihvcHRpb25zKSwgZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgewotICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKLX0KLQotUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiAkbmFtZSRfO1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYKLSAgICAgIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJtdXRhYmxlIGludCBfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfO1xuIik7Ci0gIH0KLX0KLQotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkICRuYW1lJChpbnQgaW5kZXgpIGNvbnN0O1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSk7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBhZGRfJG5hbWUkKCR0eXBlJCB2YWx1ZSk7XG4iKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiYgJG5hbWUkKCkgY29uc3Q7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4qIG11dGFibGVfJG5hbWUkKCk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7Ci0gIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lIiA6ICIiOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiRpbmxpbmUkICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuIHN0YXRpY19jYXN0PCAkdHlwZSQgPigkbmFtZSRfLkdldChpbmRleCkpO1xuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIpOwotICBpZiAoIUhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiICBhc3NlcnQoJHR5cGUkX0lzVmFsaWQodmFsdWUpKTtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiICAkbmFtZSRfLlNldChpbmRleCwgdmFsdWUpO1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIn1cbiIKLSAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIpOwotICBpZiAoIUhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiICBhc3NlcnQoJHR5cGUkX0lzVmFsaWQodmFsdWUpKTtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiICAkbmFtZSRfLkFkZCh2YWx1ZSk7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDokZnVsbF9uYW1lJClcbiIKLSAgICAifVxuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiJGlubGluZSQgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4mXG4iCi0gICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgIn1cbiIKLSAgICAiJGlubGluZSQgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4qXG4iCi0gICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OiRmdWxsX25hbWUkKVxuIgotICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uQ2xlYXIoKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uTWVyZ2VGcm9tKGZyb20uJG5hbWUkXyk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT4kbmFtZSRfKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIE5vdCBuZWVkZWQgZm9yIHJlcGVhdGVkIGZpZWxkcy4KLX0KLQotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIERvbid0IHVzZSBSZWFkUmVwZWF0ZWRQcmltaXRpdmUgaGVyZSBzbyB0aGF0IHRoZSBlbnVtIGNhbiBiZSB2YWxpZGF0ZWQuCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImludCB2YWx1ZTtcbiIKLSAgICAiRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTxcbiIKLSAgICAiICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPihcbiIKLSAgICAiICAgICAgIGlucHV0LCAmdmFsdWUpKSk7XG4iKTsKLSAgaWYgKEhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiYWRkXyRuYW1lJChzdGF0aWNfY2FzdDwgJHR5cGUkID4odmFsdWUpKTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSkge1xuIgotICAgICAgIiAgYWRkXyRuYW1lJChzdGF0aWNfY2FzdDwgJHR5cGUkID4odmFsdWUpKTtcbiIpOwotICAgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAifSBlbHNlIHtcbiIKLSAgICAgICAgIiAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoJG51bWJlciQsIHZhbHVlKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIn0gZWxzZSB7XG4iCi0gICAgICAgICIgIHVua25vd25fZmllbGRzX3N0cmVhbS5Xcml0ZVZhcmludDMyKHRhZyk7XG4iCi0gICAgICAgICIgIHVua25vd25fZmllbGRzX3N0cmVhbS5Xcml0ZVZhcmludDMyKHZhbHVlKTtcbiIpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgifVxuIik7Ci0gIH0KLX0KLQotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKCFkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKLSAgICAgIC8vIFRoaXMgcGF0aCBpcyByYXJlbHkgZXhlY3V0ZWQsIHNvIHdlIHVzZSBhIG5vbi1pbmxpbmVkIGltcGxlbWVudGF0aW9uLgotICAgIGlmIChIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OiIKLSAgICAgICAgICAgICAgICAgICAgIldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkRW51bVByZXNlcnZlVW5rbm93bnMoXG4iCi0gICAgICAgICIgICAgICAgaW5wdXQsXG4iCi0gICAgICAgICIgICAgICAgJG51bWJlciQsXG4iCi0gICAgICAgICIgICAgICAgTlVMTCxcbiIKLSAgICAgICAgIiAgICAgICBOVUxMLFxuIgotICAgICAgICAiICAgICAgIHRoaXMtPm11dGFibGVfJG5hbWUkKCkpKSk7XG4iKTsKLSAgICB9IGVsc2UgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlJlYWRQYWNrZWRFbnVtUHJlc2VydmVVbmtub3ducyhcbiIKLSAgICAgICAgIiAgICAgICBpbnB1dCxcbiIKLSAgICAgICAgIiAgICAgICAkbnVtYmVyJCxcbiIKLSAgICAgICAgIiAgICAgICAkdHlwZSRfSXNWYWxpZCxcbiIKLSAgICAgICAgIiAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCksXG4iCi0gICAgICAgICIgICAgICAgdGhpcy0+bXV0YWJsZV8kbmFtZSQoKSkpKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjoiCi0gICAgICAgICAgICAgICAgICAgICAiV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRFbnVtUHJlc2VydmVVbmtub3ducyhcbiIKLSAgICAgICAgIiAgICAgICBpbnB1dCxcbiIKLSAgICAgICAgIiAgICAgICAkbnVtYmVyJCxcbiIKLSAgICAgICAgIiAgICAgICAkdHlwZSRfSXNWYWxpZCxcbiIKLSAgICAgICAgIiAgICAgICAmdW5rbm93bl9maWVsZHNfc3RyZWFtLFxuIgotICAgICAgICAiICAgICAgIHRoaXMtPm11dGFibGVfJG5hbWUkKCkpKSk7XG4iKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBsZW5ndGg7XG4iCi0gICAgICAiRE9fKGlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpO1xuIgotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gIgotICAgICAgICAgICJpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7XG4iCi0gICAgICAid2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHtcbiIKLSAgICAgICIgIGludCB2YWx1ZTtcbiIKLSAgICAgICIgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8XG4iCi0gICAgICAiICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPihcbiIKLSAgICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIpOwotICAgIGlmIChIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiICBhZGRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiICBpZiAoJHR5cGUkX0lzVmFsaWQodmFsdWUpKSB7XG4iCi0gICAgICAiICAgIGFkZF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iCi0gICAgICAiICB9IGVsc2Uge1xuIik7Ci0gICAgICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KCRudW1iZXIkLCB2YWx1ZSk7XG4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICIgICAgdW5rbm93bl9maWVsZHNfc3RyZWFtLldyaXRlVmFyaW50MzIodGFnKTtcbiIKLSAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkc19zdHJlYW0uV3JpdGVWYXJpbnQzMih2YWx1ZSk7XG4iKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiAgfVxuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAifVxuIgotICAgICAgImlucHV0LT5Qb3BMaW1pdChsaW1pdCk7XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKLSAgICAvLyBXcml0ZSB0aGUgdGFnIGFuZCB0aGUgc2l6ZS4KLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICh0aGlzLT4kbmFtZSRfc2l6ZSgpID4gMCkge1xuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKFxuIgotICAgICAgIiAgICAkbnVtYmVyJCxcbiIKLSAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsXG4iCi0gICAgICAiICAgIG91dHB1dCk7XG4iCi0gICAgICAiICBvdXRwdXQtPldyaXRlVmFyaW50MzIoXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnKFxuIgotICAgICAgIiAgICB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bShcbiIKLSAgICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgewotICAgIC8vIFdyaXRlIHRoZSB0YWcgYW5kIHRoZSBzaXplLgotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKHRoaXMtPiRuYW1lJF9zaXplKCkgPiAwKSB7XG4iCi0gICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KFxuIgotICAgICAgIiAgICAkbnVtYmVyJCxcbiIKLSAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsXG4iCi0gICAgICAiICAgIHRhcmdldCk7XG4iCi0gICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoIgotICAgICAgIiAgICBfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfLCB0YXJnZXQpO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOwotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZ1RvQXJyYXkoXG4iCi0gICAgICAiICAgIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheShcbiIKLSAgICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIntcbiIKLSAgICAiICBpbnQgZGF0YV9zaXplID0gMDtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIgotICAgICAgIiAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZShcbiIKLSAgICAgICIgICAgdGhpcy0+JG5hbWUkKGkpKTtcbiIKLSAgICAgICJ9XG4iKTsKLQotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoZGF0YV9zaXplID4gMCkge1xuIgotICAgICAgIiAgdG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKLSAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShkYXRhX3NpemUpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpO1xuIgotICAgICAgIl8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8gPSBkYXRhX3NpemU7XG4iCi0gICAgICAiR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7XG4iCi0gICAgICAidG90YWxfc2l6ZSArPSBkYXRhX3NpemU7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCAqIHRoaXMtPiRuYW1lJF9zaXplKCkgKyBkYXRhX3NpemU7XG4iKTsKLSAgfQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmZTIxYzU3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9GSUVMRF9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FTlVNX0ZJRUxEX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGNwcCB7Ci0KLWNsYXNzIEVudW1GaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLSAgfkVudW1GaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbnVtRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgRW51bU9uZW9mRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRW51bUZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0gIH5FbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bU9uZW9mRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLSAgflJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjNDJmMTYyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmg+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi1uYW1lc3BhY2UgewotCi0vLyBSZXR1cm5zIHRoZSBmdWxseS1xdWFsaWZpZWQgY2xhc3MgbmFtZSBvZiB0aGUgbWVzc2FnZSB0aGF0IHRoaXMgZmllbGQKLS8vIGV4dGVuZHMuIFRoaXMgZnVuY3Rpb24gaXMgdXNlZCBpbiB0aGUgR29vZ2xlLWludGVybmFsIGNvZGUgdG8gaGFuZGxlIHNvbWUKLS8vIGxlZ2FjeSBjYXNlcy4KLXN0cmluZyBFeHRlbmRlZUNsYXNzTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUgPSBkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKTsKLSAgcmV0dXJuIENsYXNzTmFtZShleHRlbmRlZSwgdHJ1ZSk7Ci19Ci0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotRXh0ZW5zaW9uR2VuZXJhdG9yOjpFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKLSAgICBvcHRpb25zXyhvcHRpb25zKSB7Ci0gIC8vIENvbnN0cnVjdCB0eXBlX3RyYWl0c18uCi0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcmVwZWF0ZWQoKSkgewotICAgIHR5cGVfdHJhaXRzXyA9ICJSZXBlYXRlZCI7Ci0gIH0KLQotICBzd2l0Y2ggKGRlc2NyaXB0b3JfLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIkVudW1UeXBlVHJhaXRzPCAiKTsKLSAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoKSwgdHJ1ZSkpOwotICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiLCAiKTsKLSAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoKSwgdHJ1ZSkpOwotICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiX0lzVmFsaWQ+Iik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCJTdHJpbmdUeXBlVHJhaXRzIik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiTWVzc2FnZVR5cGVUcmFpdHM8ICIpOwotICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZChDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLCB0cnVlKSk7Ci0gICAgICB0eXBlX3RyYWl0c18uYXBwZW5kKCIgPiIpOwotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHR5cGVfdHJhaXRzXy5hcHBlbmQoIlByaW1pdGl2ZVR5cGVUcmFpdHM8ICIpOwotICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZChQcmltaXRpdmVUeXBlTmFtZShkZXNjcmlwdG9yXy0+Y3BwX3R5cGUoKSkpOwotICAgICAgdHlwZV90cmFpdHNfLmFwcGVuZCgiID4iKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLUV4dGVuc2lvbkdlbmVyYXRvcjo6fkV4dGVuc2lvbkdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZURlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1siZXh0ZW5kZWUiICAgICBdID0gRXh0ZW5kZWVDbGFzc05hbWUoZGVzY3JpcHRvcl8pOwotICB2YXJzWyJudW1iZXIiICAgICAgIF0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5udW1iZXIoKSk7Ci0gIHZhcnNbInR5cGVfdHJhaXRzIiAgXSA9IHR5cGVfdHJhaXRzXzsKLSAgdmFyc1sibmFtZSIgICAgICAgICBdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKLSAgdmFyc1siZmllbGRfdHlwZSIgICBdID0gU2ltcGxlSXRvYShzdGF0aWNfY2FzdDxpbnQ+KGRlc2NyaXB0b3JfLT50eXBlKCkpKTsKLSAgdmFyc1sicGFja2VkIiAgICAgICBdID0gZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gIHZhcnNbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3JfKTsKLQotICAvLyBJZiB0aGlzIGlzIGEgY2xhc3MgbWVtYmVyLCBpdCBuZWVkcyB0byBiZSBkZWNsYXJlZCAic3RhdGljIi4gIE90aGVyd2lzZSwKLSAgLy8gaXQgbmVlZHMgdG8gYmUgImV4dGVybiIuICBJbiB0aGUgbGF0dGVyIGNhc2UsIGl0IGFsc28gbmVlZHMgdGhlIERMTAotICAvLyBleHBvcnQvaW1wb3J0IHNwZWNpZmllci4KLSAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7Ci0gICAgdmFyc1sicXVhbGlmaWVyIl0gPSAiZXh0ZXJuIjsKLSAgICBpZiAoIW9wdGlvbnNfLmRsbGV4cG9ydF9kZWNsLmVtcHR5KCkpIHsKLSAgICAgIHZhcnNbInF1YWxpZmllciJdID0gb3B0aW9uc18uZGxsZXhwb3J0X2RlY2wgKyAiICIgKyB2YXJzWyJxdWFsaWZpZXIiXTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgdmFyc1sicXVhbGlmaWVyIl0gPSAic3RhdGljIjsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgInN0YXRpYyBjb25zdCBpbnQgJGNvbnN0YW50X25hbWUkID0gJG51bWJlciQ7XG4iCi0gICAgIiRxdWFsaWZpZXIkIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICRleHRlbmRlZSQsXG4iCi0gICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjokdHlwZV90cmFpdHMkLCAkZmllbGRfdHlwZSQsICRwYWNrZWQkID5cbiIKLSAgICAiICAkbmFtZSQ7XG4iCi0gICAgKTsKLQotfQotCi12b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIElmIHRoaXMgaXMgYSBjbGFzcyBtZW1iZXIsIGl0IG5lZWRzIHRvIGJlIGRlY2xhcmVkIGluIGl0cyBjbGFzcyBzY29wZS4KLSAgc3RyaW5nIHNjb3BlID0gKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSA/ICIiIDoKLSAgICBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpLCBmYWxzZSkgKyAiOjoiOwotICBzdHJpbmcgbmFtZSA9IHNjb3BlICsgZGVzY3JpcHRvcl8tPm5hbWUoKTsKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbImV4dGVuZGVlIiAgICAgXSA9IEV4dGVuZGVlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKTsKLSAgdmFyc1sidHlwZV90cmFpdHMiICBdID0gdHlwZV90cmFpdHNfOwotICB2YXJzWyJuYW1lIiAgICAgICAgIF0gPSBuYW1lOwotICB2YXJzWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShkZXNjcmlwdG9yXyk7Ci0gIHZhcnNbImRlZmF1bHQiICAgICAgXSA9IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yXyk7Ci0gIHZhcnNbImZpZWxkX3R5cGUiICAgXSA9IFNpbXBsZUl0b2Eoc3RhdGljX2Nhc3Q8aW50PihkZXNjcmlwdG9yXy0+dHlwZSgpKSk7Ci0gIHZhcnNbInBhY2tlZCIgICAgICAgXSA9IGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkgPyAidHJ1ZSIgOiAiZmFsc2UiOwotICB2YXJzWyJzY29wZSIgICAgICAgIF0gPSBzY29wZTsKLQotICBpZiAoZGVzY3JpcHRvcl8tPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgewotICAgIC8vIFdlIG5lZWQgdG8gZGVjbGFyZSBhIGdsb2JhbCBzdHJpbmcgd2hpY2ggd2lsbCBjb250YWluIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIC8vIFdlIGNhbm5vdCBkZWNsYXJlIGl0IGF0IGNsYXNzIHNjb3BlIGJlY2F1c2UgdGhhdCB3b3VsZCByZXF1aXJlIGV4cG9zaW5nCi0gICAgLy8gaXQgaW4gdGhlIGhlYWRlciB3aGljaCB3b3VsZCBiZSBhbm5veWluZyBmb3Igb3RoZXIgcmVhc29ucy4gIFNvIHdlCi0gICAgLy8gcmVwbGFjZSA6OiB3aXRoIF8gaW4gdGhlIG5hbWUgYW5kIGRlY2xhcmUgaXQgYXMgYSBnbG9iYWwuCi0gICAgc3RyaW5nIGdsb2JhbF9uYW1lID0gU3RyaW5nUmVwbGFjZShuYW1lLCAiOjoiLCAiXyIsIHRydWUpOwotICAgIHZhcnNbImdsb2JhbF9uYW1lIl0gPSBnbG9iYWxfbmFtZTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgImNvbnN0IDo6c3RkOjpzdHJpbmcgJGdsb2JhbF9uYW1lJF9kZWZhdWx0KCRkZWZhdWx0JCk7XG4iKTsKLQotICAgIC8vIFVwZGF0ZSB0aGUgZGVmYXVsdCB0byByZWZlciB0byB0aGUgc3RyaW5nIGdsb2JhbC4KLSAgICB2YXJzWyJkZWZhdWx0Il0gPSBnbG9iYWxfbmFtZSArICJfZGVmYXVsdCI7Ci0gIH0KLQotICAvLyBMaWtld2lzZSwgY2xhc3MgbWVtYmVycyBuZWVkIHRvIGRlY2xhcmUgdGhlIGZpZWxkIGNvbnN0YW50IHZhcmlhYmxlLgotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpICE9IE5VTEwpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIiNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMFxuIgotICAgICAgImNvbnN0IGludCAkc2NvcGUkJGNvbnN0YW50X25hbWUkO1xuIgotICAgICAgIiNlbmRpZlxuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAkZXh0ZW5kZWUkLFxuIgotICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6JHR5cGVfdHJhaXRzJCwgJGZpZWxkX3R5cGUkLCAkcGFja2VkJCA+XG4iCi0gICAgIiAgJG5hbWUkKCRjb25zdGFudF9uYW1lJCwgJGRlZmF1bHQkKTtcbiIpOwotfQotCi12b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVSZWdpc3RyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICB2YXJzWyJleHRlbmRlZSIgICBdID0gRXh0ZW5kZWVDbGFzc05hbWUoZGVzY3JpcHRvcl8pOwotICB2YXJzWyJudW1iZXIiICAgICBdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+bnVtYmVyKCkpOwotICB2YXJzWyJmaWVsZF90eXBlIiBdID0gU2ltcGxlSXRvYShzdGF0aWNfY2FzdDxpbnQ+KGRlc2NyaXB0b3JfLT50eXBlKCkpKTsKLSAgdmFyc1siaXNfcmVwZWF0ZWQiXSA9IGRlc2NyaXB0b3JfLT5pc19yZXBlYXRlZCgpID8gInRydWUiIDogImZhbHNlIjsKLSAgdmFyc1siaXNfcGFja2VkIiAgXSA9IChkZXNjcmlwdG9yXy0+aXNfcmVwZWF0ZWQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0KLSAgc3dpdGNoIChkZXNjcmlwdG9yXy0+Y3BwX3R5cGUoKSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0OjpSZWdpc3RlckVudW1FeHRlbnNpb24oXG4iCi0gICAgICAgICIgICYkZXh0ZW5kZWUkOjpkZWZhdWx0X2luc3RhbmNlKCksXG4iCi0gICAgICAgICIgICRudW1iZXIkLCAkZmllbGRfdHlwZSQsICRpc19yZXBlYXRlZCQsICRpc19wYWNrZWQkLFxuIik7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiAgJiR0eXBlJF9Jc1ZhbGlkKTtcbiIsCi0gICAgICAgICJ0eXBlIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoKSwgdHJ1ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyTWVzc2FnZUV4dGVuc2lvbihcbiIKLSAgICAgICAgIiAgJiRleHRlbmRlZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKLSAgICAgICAgIiAgJG51bWJlciQsICRmaWVsZF90eXBlJCwgJGlzX3JlcGVhdGVkJCwgJGlzX3BhY2tlZCQsXG4iKTsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiICAmJHR5cGUkOjpkZWZhdWx0X2luc3RhbmNlKCkpO1xuIiwKLSAgICAgICAgInR5cGUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpLCB0cnVlKSk7Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldDo6UmVnaXN0ZXJFeHRlbnNpb24oXG4iCi0gICAgICAgICIgICYkZXh0ZW5kZWUkOjpkZWZhdWx0X2luc3RhbmNlKCksXG4iCi0gICAgICAgICIgICRudW1iZXIkLCAkZmllbGRfdHlwZSQsICRpc19yZXBlYXRlZCQsICRpc19wYWNrZWQkKTtcbiIpOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxY2FmMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FWFRFTlNJT05fSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRVhURU5TSU9OX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgY2xhc3MgRmllbGREZXNjcmlwdG9yOyAgICAgICAvLyBkZXNjcmlwdG9yLmgKLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKLSAgfQotfQotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi0vLyBHZW5lcmF0ZXMgY29kZSBmb3IgYW4gZXh0ZW5zaW9uLCB3aGljaCBtYXkgYmUgd2l0aGluIHRoZSBzY29wZSBvZiBzb21lCi0vLyBtZXNzYWdlIG9yIG1heSBiZSBhdCBmaWxlIHNjb3BlLiAgVGhpcyBpcyBtdWNoIHNpbXBsZXIgdGhhbiBGaWVsZEdlbmVyYXRvcgotLy8gc2luY2UgZXh0ZW5zaW9ucyBhcmUganVzdCBzaW1wbGUgaWRlbnRpZmllcnMgd2l0aCBpbnRlcmVzdGluZyB0eXBlcy4KLWNsYXNzIEV4dGVuc2lvbkdlbmVyYXRvciB7Ci0gcHVibGljOgotICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KLSAgZXhwbGljaXQgRXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+RXh0ZW5zaW9uR2VuZXJhdG9yKCk7Ci0KLSAgLy8gSGVhZGVyIHN0dWZmLgotICB2b2lkIEdlbmVyYXRlRGVjbGFyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIFNvdXJjZSBmaWxlIHN0dWZmLgotICB2b2lkIEdlbmVyYXRlRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgY29kZSB0byByZWdpc3RlciB0aGUgZXh0ZW5zaW9uLgotICB2b2lkIEdlbmVyYXRlUmVnaXN0cmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIHN0cmluZyB0eXBlX3RyYWl0c187Ci0gIE9wdGlvbnMgb3B0aW9uc187Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEV4dGVuc2lvbkdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjNiYTNhMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMDEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKLQotdm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICAoKnZhcmlhYmxlcylbIm5hbWUiXSA9IEZpZWxkTmFtZShkZXNjcmlwdG9yKTsKLSAgKCp2YXJpYWJsZXMpWyJpbmRleCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5pbmRleCgpKTsKLSAgKCp2YXJpYWJsZXMpWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOwotICAoKnZhcmlhYmxlcylbImNsYXNzbmFtZSJdID0gQ2xhc3NOYW1lKEZpZWxkU2NvcGUoZGVzY3JpcHRvciksIGZhbHNlKTsKLSAgKCp2YXJpYWJsZXMpWyJkZWNsYXJlZF90eXBlIl0gPSBEZWNsYXJlZFR5cGVNZXRob2ROYW1lKGRlc2NyaXB0b3ItPnR5cGUoKSk7Ci0KLSAgLy8gbm9uX251bGxfcHRyX3RvX25hbWUgaXMgdXNhYmxlIG9ubHkgaWYgaGFzXyRuYW1lJCBpcyB0cnVlLiAgSXQgeWllbGRzIGEKLSAgLy8gcG9pbnRlciB0aGF0IHdpbGwgbm90IGJlIE5VTEwuICBTdWJjbGFzc2VzIG9mIEZpZWxkR2VuZXJhdG9yIG1heSBzZXQKLSAgLy8gKCp2YXJpYWJsZXMpWyJub25fbnVsbF9wdHJfdG9fbmFtZSJdIGRpZmZlcmVudGx5LgotICAoKnZhcmlhYmxlcylbIm5vbl9udWxsX3B0cl90b19uYW1lIl0gPQotICAgICAgU3RyQ2F0KCImdGhpcy0+IiwgRmllbGROYW1lKGRlc2NyaXB0b3IpLCAiKCkiKTsKLQotICAoKnZhcmlhYmxlcylbInRhZ19zaXplIl0gPSBTaW1wbGVJdG9hKAotICAgIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZGVzY3JpcHRvci0+bnVtYmVyKCksIGRlc2NyaXB0b3ItPnR5cGUoKSkpOwotICAoKnZhcmlhYmxlcylbImRlcHJlY2F0aW9uIl0gPSBkZXNjcmlwdG9yLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpCi0gICAgICA/ICIgUFJPVE9CVUZfREVQUkVDQVRFRCIgOiAiIjsKLSAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGVkX2F0dHIiXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKLSAgICAgID8gIlBST1RPQlVGX0RFUFJFQ0FURURfQVRUUiAiIDogIiI7Ci0KLSAgKCp2YXJpYWJsZXMpWyJjcHBnZXQiXSA9ICJHZXQiOwotCi0gIGlmIChIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3ItPmZpbGUoKSkpIHsKLSAgICAoKnZhcmlhYmxlcylbInNldF9oYXNiaXQiXSA9Ci0gICAgICAgICJzZXRfaGFzXyIgKyBGaWVsZE5hbWUoZGVzY3JpcHRvcikgKyAiKCk7IjsKLSAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc2JpdCJdID0KLSAgICAgICAgImNsZWFyX2hhc18iICsgRmllbGROYW1lKGRlc2NyaXB0b3IpICsgIigpOyI7Ci0gIH0gZWxzZSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzYml0Il0gPSAiIjsKLSAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc2JpdCJdID0gIiI7Ci0gIH0KLQotICAvLyBCeSBkZWZhdWx0LCBlbXB0eSBzdHJpbmcsIHNvIHRoYXQgZ2VuZXJpYyBjb2RlIHVzZWQgZm9yIGJvdGggb25lb2ZzIGFuZAotICAvLyBzaW5ndWxhciBmaWVsZHMgY2FuIGJlIHdyaXR0ZW4uCi0gICgqdmFyaWFibGVzKVsib25lb2ZfcHJlZml4Il0gPSAiIjsKLX0KLQotdm9pZCBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKLSAgY29uc3Qgc3RyaW5nIHByZWZpeCA9IGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKS0+bmFtZSgpICsgIl8uIjsKLSAgKCp2YXJpYWJsZXMpWyJvbmVvZl9wcmVmaXgiXSA9IHByZWZpeDsKLSAgKCp2YXJpYWJsZXMpWyJvbmVvZl9uYW1lIl0gPSBkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCktPm5hbWUoKTsKLSAgKCp2YXJpYWJsZXMpWyJub25fbnVsbF9wdHJfdG9fbmFtZSJdID0KLSAgICAgIFN0ckNhdChwcmVmaXgsICgqdmFyaWFibGVzKVsibmFtZSJdLCAiXyIpOwotfQotCi1GaWVsZEdlbmVyYXRvcjo6fkZpZWxkR2VuZXJhdG9yKCkge30KLQotdm9pZCBGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gUmVhY2hpbmcgaGVyZSBpbmRpY2F0ZXMgYSBidWcuIENhc2VzIGFyZToKLSAgLy8gICAtIFRoaXMgRmllbGRHZW5lcmF0b3Igc2hvdWxkIHN1cHBvcnQgcGFja2luZywgYnV0IHRoaXMgbWV0aG9kIHNob3VsZCBiZQotICAvLyAgICAgb3ZlcnJpZGRlbi4KLSAgLy8gICAtIFRoaXMgRmllbGRHZW5lcmF0b3IgZG9lc24ndCBzdXBwb3J0IHBhY2tpbmcsIGFuZCB0aGlzIG1ldGhvZCBzaG91bGQKLSAgLy8gICAgIG5ldmVyIGhhdmUgYmVlbiBjYWxsZWQuCi0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcoKSAiCi0gICAgICAgICAgICAgPDwgImNhbGxlZCBvbiBmaWVsZCBnZW5lcmF0b3IgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHBhY2tpbmcuIjsKLQotfQotCi1GaWVsZEdlbmVyYXRvck1hcDo6RmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQotICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCi0gICAgICBvcHRpb25zXyhvcHRpb25zKSwKLSAgICAgIGZpZWxkX2dlbmVyYXRvcnNfKAotICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEZpZWxkR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXSkgewotICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc19baV0ucmVzZXQoTWFrZUdlbmVyYXRvcihkZXNjcmlwdG9yLT5maWVsZChpKSwgb3B0aW9ucykpOwotICB9Ci19Ci0KLUZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvck1hcDo6TWFrZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgaWYgKGZpZWxkLT5pc19tYXAoKSkgewotICAgICAgICAgIHJldHVybiBuZXcgTWFwRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgZGVmYXVsdDogIC8vIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgaGFuZGxlcyB1bmtub3duIGN0eXBlcy4KLSAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOwotICAgIH0KLSAgfSBlbHNlIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgZGVmYXVsdDogIC8vIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IgaGFuZGxlcyB1bmtub3duIGN0eXBlcy4KLSAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKLSAgICAgICAgfQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgICAgcmV0dXJuIG5ldyBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgZGVmYXVsdDogIC8vIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIGhhbmRsZXMgdW5rbm93biBjdHlwZXMuCi0gICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKLSAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOwotICAgICAgICB9Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgICByZXR1cm4gbmV3IEVudW1GaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKLSAgICB9Ci0gIH0KLX0KLQotRmllbGRHZW5lcmF0b3JNYXA6On5GaWVsZEdlbmVyYXRvck1hcCgpIHt9Ci0KLWNvbnN0IEZpZWxkR2VuZXJhdG9yJiBGaWVsZEdlbmVyYXRvck1hcDo6Z2V0KAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvcl8pOwotICByZXR1cm4gKmZpZWxkX2dlbmVyYXRvcnNfW2ZpZWxkLT5pbmRleCgpXTsKLX0KLQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2IwMTI1Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDIyOSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUVMRF9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUVMRF9IX18KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKLSAgfQotfQotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi0vLyBIZWxwZXIgZnVuY3Rpb246IHNldCB2YXJpYWJsZXMgaW4gdGhlIG1hcCB0aGF0IGFyZSB0aGUgc2FtZSBmb3IgYWxsCi0vLyBmaWVsZCBjb2RlIGdlbmVyYXRvcnMuCi0vLyBbJ25hbWUnLCAnaW5kZXgnLCAnbnVtYmVyJywgJ2NsYXNzbmFtZScsICdkZWNsYXJlZF90eXBlJywgJ3RhZ19zaXplJywKLS8vICdkZXByZWNhdGlvbiddLgotdm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0KLXZvaWQgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKTsKLQotY2xhc3MgRmllbGRHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRmllbGRHZW5lcmF0b3IoY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgOiBvcHRpb25zXyhvcHRpb25zKSB7fQotICB2aXJ0dWFsIH5GaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIEdlbmVyYXRlIGxpbmVzIG9mIGNvZGUgZGVjbGFyaW5nIG1lbWJlcnMgZmllbGRzIG9mIHRoZSBtZXNzYWdlIGNsYXNzCi0gIC8vIG5lZWRlZCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4gIFRoZXNlIGFyZSBwbGFjZWQgaW5zaWRlIHRoZSBtZXNzYWdlCi0gIC8vIGNsYXNzLgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotCi0gIC8vIEdlbmVyYXRlIHN0YXRpYyBkZWZhdWx0IHZhcmlhYmxlIGZvciB0aGlzIGZpZWxkLiBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZQotICAvLyB0aGUgbWVzc2FnZSBjbGFzcy4gTW9zdCBmaWVsZCB0eXBlcyBkb24ndCBuZWVkIHRoaXMsIHNvIHRoZSBkZWZhdWx0Ci0gIC8vIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTdGF0aWNNZW1iZXJzKGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KLQotICAvLyBHZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBhY2Nlc3NvcnMgdGhhdCB3aWxsIG1hbmlwdWxhdGUgaW1wb3J0ZWQKLSAgLy8gbWVzc2FnZXMgaW5saW5lLiAgVGhlc2UgYXJlIGZvciAucHJvdG8uaCBoZWFkZXJzLgotICAvLwotICAvLyBJbiAucHJvdG8uaCBtb2RlLCB0aGUgaGVhZGVycyBvZiBpbXBvcnRzIGFyZSBub3QgI2luY2x1ZGVkLiBIb3dldmVyLAotICAvLyBmdW5jdGlvbnMgdGhhdCBtYW5pcHVsYXRlIHRoZSBpbXBvcnRlZCBtZXNzYWdlIHR5cGVzIG5lZWQgYWNjZXNzIHRvCi0gIC8vIHRoZSBjbGFzcyBkZWZpbml0aW9uIG9mIHRoZSBpbXBvcnRlZCBtZXNzYWdlLCBtZWFuaW5nIHRoYXQgdGhlIGhlYWRlcnMKLSAgLy8gbXVzdCBiZSAjaW5jbHVkZWQuIFRvIGdldCBhcm91bmQgdGhpcywgZnVuY3Rpb25zIHRoYXQgbWFuaXB1bGF0ZQotICAvLyBpbXBvcnRlZCBtZXNzYWdlIG9iamVjdHMgYXJlIGRlZmluZWQgYXMgZGVwZW5kZW50IGZ1bmN0aW9ucyBpbiBhIGJhc2UKLSAgLy8gdGVtcGxhdGUgY2xhc3MuIEJ5IG1ha2luZyB0aGVtIGRlcGVuZGVudCB0ZW1wbGF0ZSBmdW5jdGlvbnMsIHRoZQotICAvLyBmdW5jdGlvbiB0ZW1wbGF0ZXMgd2lsbCBub3QgYmUgaW5zdGFudGlhdGVkIHVudGlsIHRoZXkgYXJlIGNhbGxlZCwgc28KLSAgLy8gd2UgY2FuIGRlZmVyIHRvIHRob3NlIHRyYW5zbGF0aW9uIHVuaXRzIHRvICNpbmNsdWRlIHRoZSBuZWNlc3NhcnkKLSAgLy8gZ2VuZXJhdGVkIGhlYWRlcnMuCi0gIC8vCi0gIC8vIFNlZToKLSAgLy8gaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbGFuZ3VhZ2UvY2xhc3NfdGVtcGxhdGUjSW1wbGljaXRfaW5zdGFudGlhdGlvbgotICAvLwotICAvLyBNb3N0IGZpZWxkIHR5cGVzIGRvbid0IG5lZWQgdGhpcywgc28gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKAotICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9Ci0KLSAgLy8gR2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgYWxsIG9mIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGlzCi0gIC8vIGZpZWxkLiAgVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGNsYXNzIGRlZmluaXRpb24uCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgaW5saW5lIGRlZmluaXRpb25zIG9mIGRlcGVuZW50IGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgdGhpcyBmaWVsZC4KLSAgLy8gVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGhlYWRlciBhZnRlciBhbGwgY2xhc3MgZGVmaW5pdGlvbnMuCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZURlcGVuZGVudElubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9Ci0KLSAgLy8gR2VuZXJhdGUgaW5saW5lIGRlZmluaXRpb25zIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgdGhpcyBmaWVsZC4KLSAgLy8gVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGhlYWRlciBhZnRlciBhbGwgY2xhc3MgZGVmaW5pdGlvbnMuCi0gIC8vIEluIG5vbi0ucHJvdG8uaCBtb2RlLCB0aGlzIGdlbmVyYXRlcyBkZXBlbmRlbnQgYWNjZXNzb3IgZnVuY3Rpb25zIGFzIHdlbGwuCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgaXNfaW5saW5lKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgZGVmaW5pdGlvbnMgb2YgYWNjZXNzb3JzIHRoYXQgYXJlbid0IGlubGluZWQuICBUaGVzZSBhcmUKLSAgLy8gcGxhY2VkIHNvbWV3aGVyZSBpbiB0aGUgLmNjIGZpbGUuCi0gIC8vIE1vc3QgZmllbGQgdHlwZXMgZG9uJ3QgbmVlZCB0aGlzLCBzbyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKLSAgICBpbzo6UHJpbnRlciogLypwcmludGVyKi8pIGNvbnN0IHt9Ci0KLSAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggY2xlYXIgdGhlCi0gIC8vIGZpZWxkLiAgVGhpcyBpcyB1c2VkIHRvIGRlZmluZSB0aGUgY2xlYXJfJG5hbWUkKCkgbWV0aG9kIGFzIHdlbGwgYXMKLSAgLy8gdGhlIENsZWFyKCkgbWV0aG9kIGZvciB0aGUgd2hvbGUgbWVzc2FnZS4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggbWVyZ2VzIHRoZQotICAvLyBjb250ZW50cyBvZiB0aGUgZmllbGQgZnJvbSB0aGUgY3VycmVudCBtZXNzYWdlIHRvIHRoZSB0YXJnZXQgbWVzc2FnZSwKLSAgLy8gd2hpY2ggaXMgc3RvcmVkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB2YXJpYWJsZSAiZnJvbSIuCi0gIC8vIFRoaXMgaXMgdXNlZCB0byBmaWxsIGluIHRoZSBNZXJnZUZyb20gbWV0aG9kIGZvciB0aGUgd2hvbGUgbWVzc2FnZS4KLSAgLy8gRGV0YWlscyBvZiB0aGlzIHVzYWdlIGNhbiBiZSBmb3VuZCBpbiBtZXNzYWdlLmNjIHVuZGVyIHRoZQotICAvLyBHZW5lcmF0ZU1lcmdlRnJvbSBtZXRob2QuCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgbGluZXMgb2YgY29kZSAoc3RhdGVtZW50cywgbm90IGRlY2xhcmF0aW9ucykgd2hpY2ggc3dhcHMKLSAgLy8gdGhpcyBmaWVsZCBhbmQgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGQgb2YgYW5vdGhlciBtZXNzYWdlLCB3aGljaAotICAvLyBpcyBzdG9yZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHZhcmlhYmxlICJvdGhlciIuIFRoaXMgaXMgdXNlZCB0bwotICAvLyBkZWZpbmUgdGhlIFN3YXAgbWV0aG9kLiBEZXRhaWxzIG9mIHVzYWdlIGNhbiBiZSBmb3VuZCBpbgotICAvLyBtZXNzYWdlLmNjIHVuZGVyIHRoZSBHZW5lcmF0ZVN3YXAgbWV0aG9kLgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLQotICAvLyBHZW5lcmF0ZSBpbml0aWFsaXphdGlvbiBjb2RlIGZvciBwcml2YXRlIG1lbWJlcnMgZGVjbGFyZWQgYnkKLSAgLy8gR2VuZXJhdGVQcml2YXRlTWVtYmVycygpLiBUaGVzZSBnbyBpbnRvIHRoZSBtZXNzYWdlIGNsYXNzJ3MgU2hhcmVkQ3RvcigpCi0gIC8vIG1ldGhvZCwgaW52b2tlZCBieSBlYWNoIG9mIHRoZSBnZW5lcmF0ZWQgY29uc3RydWN0b3JzLgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLQotICAvLyBHZW5lcmF0ZSBhbnkgY29kZSB0aGF0IG5lZWRzIHRvIGdvIGluIHRoZSBjbGFzcydzIFNoYXJlZER0b3IoKSBtZXRob2QsCi0gIC8vIGludm9rZWQgYnkgdGhlIGRlc3RydWN0b3IuCi0gIC8vIE1vc3QgZmllbGQgdHlwZXMgZG9uJ3QgbmVlZCB0aGlzLCBzbyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIC8qcHJpbnRlciovKSBjb25zdCB7fQotCi0gIC8vIEdlbmVyYXRlIGEgbWFudWFsIGRlc3RydWN0b3IgaW52b2NhdGlvbiBmb3IgdXNlIHdoZW4gdGhlIG1lc3NhZ2UgaXMgb24gYW4KLSAgLy8gYXJlbmEuIFRoZSBjb2RlIHRoYXQgdGhpcyBtZXRob2QgZ2VuZXJhdGVzIHdpbGwgYmUgZXhlY3V0ZWQgaW5zaWRlIGEKLSAgLy8gc2hhcmVkLWZvci10aGUtd2hvbGUtbWVzc2FnZS1jbGFzcyBtZXRob2QgcmVnaXN0ZXJlZCB3aXRoIE93bkRlc3RydWN0b3IoKS4KLSAgLy8gVGhlIG1ldGhvZCBzaG91bGQgcmV0dXJuIHx0cnVlfCBpZiBpdCBnZW5lcmF0ZWQgYW55IGNvZGUgdGhhdCByZXF1aXJlcyBhCi0gIC8vIGNhbGw7IHRoaXMgYWxsb3dzIHRoZSBtZXNzYWdlIGdlbmVyYXRvciB0byBlbGltaW5hdGUgdGhlIE93bkRlc3RydWN0b3IoKQotICAvLyByZWdpc3RyYXRpb24gaWYgbm8gZmllbGRzIHJlcXVpcmUgaXQuCi0gIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZUFyZW5hRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgYWxsb2NhdGVzIHRoZSBmaWVsZHMncyBkZWZhdWx0IGluc3RhbmNlLgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIC8qcHJpbnRlciovKQotICAgICAgY29uc3Qge30KLQotICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgc2hvdWxkIGJlIHJ1biB3aGVuIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCkgaXMgY2FsbGVkLAotICAvLyB0byBkZWxldGUgYWxsIGR5bmFtaWNhbGx5LWFsbG9jYXRlZCBvYmplY3RzLgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIC8qcHJpbnRlciovKSBjb25zdCB7fQotCi0gIC8vIEdlbmVyYXRlIGxpbmVzIHRvIGRlY29kZSB0aGlzIGZpZWxkLCB3aGljaCB3aWxsIGJlIHBsYWNlZCBpbnNpZGUgdGhlCi0gIC8vIG1lc3NhZ2UncyBNZXJnZUZyb21Db2RlZFN0cmVhbSgpIG1ldGhvZC4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLQotICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBkZWNvZGUgdGhpcyBmaWVsZCBmcm9tIGEgcGFja2VkIHZhbHVlLCB3aGljaCB3aWxsIGJlCi0gIC8vIHBsYWNlZCBpbnNpZGUgdGhlIG1lc3NhZ2UncyBNZXJnZUZyb21Db2RlZFN0cmVhbSgpIG1ldGhvZC4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhpbzo6UHJpbnRlciogcHJpbnRlcikKLSAgICAgIGNvbnN0OwotCi0gIC8vIEdlbmVyYXRlIGxpbmVzIHRvIHNlcmlhbGl6ZSB0aGlzIGZpZWxkLCB3aGljaCBhcmUgcGxhY2VkIHdpdGhpbiB0aGUKLSAgLy8gbWVzc2FnZSdzIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpIG1ldGhvZC4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgbGluZXMgdG8gc2VyaWFsaXplIHRoaXMgZmllbGQgZGlyZWN0bHkgdG8gdGhlIGFycmF5ICJ0YXJnZXQiLAotICAvLyB3aGljaCBhcmUgcGxhY2VkIHdpdGhpbiB0aGUgbWVzc2FnZSdzIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoKQotICAvLyBtZXRob2QuIFRoaXMgbXVzdCBhbHNvIGFkdmFuY2UgInRhcmdldCIgcGFzdCB0aGUgd3JpdHRlbiBieXRlcy4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2VuZXJhdGUgbGluZXMgdG8gY29tcHV0ZSB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHRoaXMgZmllbGQsIHdoaWNoCi0gIC8vIGFyZSBwbGFjZWQgaW4gdGhlIG1lc3NhZ2UncyBCeXRlU2l6ZSgpIG1ldGhvZC4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLQotIHByb3RlY3RlZDoKLSAgY29uc3QgT3B0aW9ucyYgb3B0aW9uc187Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmllbGRHZW5lcmF0b3IpOwotfTsKLQotLy8gQ29udmVuaWVuY2UgY2xhc3Mgd2hpY2ggY29uc3RydWN0cyBGaWVsZEdlbmVyYXRvcnMgZm9yIGEgRGVzY3JpcHRvci4KLWNsYXNzIEZpZWxkR2VuZXJhdG9yTWFwIHsKLSBwdWJsaWM6Ci0gIEZpZWxkR2VuZXJhdG9yTWFwKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+RmllbGRHZW5lcmF0b3JNYXAoKTsKLQotICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2V0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnNfOwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj4gPiBmaWVsZF9nZW5lcmF0b3JzXzsKLQotICBzdGF0aWMgRmllbGRHZW5lcmF0b3IqIE1ha2VHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZEdlbmVyYXRvck1hcCk7Ci19OwotCi0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRlMjA0NzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMDY4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHNldD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGNwcCB7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRmlsZUdlbmVyYXRvcjo6RmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgICA6IGZpbGVfKGZpbGUpLAotICAgICAgb3B0aW9uc18ob3B0aW9ucyksCi0gICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfKAotICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+W2ZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpXSksCi0gICAgICBlbnVtX2dlbmVyYXRvcnNfKAotICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEVudW1HZW5lcmF0b3I+W2ZpbGUtPmVudW1fdHlwZV9jb3VudCgpXSksCi0gICAgICBzZXJ2aWNlX2dlbmVyYXRvcnNfKAotICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPFNlcnZpY2VHZW5lcmF0b3I+W2ZpbGUtPnNlcnZpY2VfY291bnQoKV0pLAotICAgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKAotICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj5bZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCldKSB7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKLSAgICAgIG5ldyBNZXNzYWdlR2VuZXJhdG9yKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSwgb3B0aW9ucykpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgZW51bV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKLSAgICAgIG5ldyBFbnVtR2VuZXJhdG9yKGZpbGUtPmVudW1fdHlwZShpKSwgb3B0aW9ucykpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgewotICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0ucmVzZXQoCi0gICAgICBuZXcgU2VydmljZUdlbmVyYXRvcihmaWxlLT5zZXJ2aWNlKGkpLCBvcHRpb25zKSk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0ucmVzZXQoCi0gICAgICBuZXcgRXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGUtPmV4dGVuc2lvbihpKSwgb3B0aW9ucykpOwotICB9Ci0KLSAgU3BsaXRTdHJpbmdVc2luZyhmaWxlXy0+cGFja2FnZSgpLCAiLiIsICZwYWNrYWdlX3BhcnRzXyk7Ci19Ci0KLUZpbGVHZW5lcmF0b3I6On5GaWxlR2VuZXJhdG9yKCkge30KLQotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVByb3RvSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaW5mb19wYXRoKSB7Ci0gIGlmICghb3B0aW9uc18ucHJvdG9faCkgewotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZyBmaWxlbmFtZV9pZGVudGlmaWVyID0gRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVfLT5uYW1lKCkpOwotICBHZW5lcmF0ZVRvcEhlYWRlckd1YXJkKHByaW50ZXIsIGZpbGVuYW1lX2lkZW50aWZpZXIpOwotCi0KLSAgR2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMocHJpbnRlcik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcCA9IGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKTsKLSAgICBjb25zdCBjaGFyKiBleHRlbnNpb24gPSAiLnByb3RvLmgiOwotICAgIHN0cmluZyBkZXBlbmRlbmN5ID0gU3RyaXBQcm90byhkZXAtPm5hbWUoKSkgKyBleHRlbnNpb247Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiI2luY2x1ZGUgXCIkZGVwZW5kZW5jeSRcIiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydFxuIiwKLSAgICAgICJkZXBlbmRlbmN5IiwgZGVwZW5kZW5jeSk7Ci0gIH0KLQotICBHZW5lcmF0ZU1ldGFkYXRhUHJhZ21hKHByaW50ZXIsIGluZm9fcGF0aCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcylcbiIpOwotCi0KLSAgR2VuZXJhdGVGb3J3YXJkRGVjbGFyYXRpb25zKHByaW50ZXIpOwotCi0gIC8vIE9wZW4gbmFtZXNwYWNlLgotICBHZW5lcmF0ZU5hbWVzcGFjZU9wZW5lcnMocHJpbnRlcik7Ci0KLSAgR2VuZXJhdGVHbG9iYWxTdGF0ZUZ1bmN0aW9uRGVjbGFyYXRpb25zKHByaW50ZXIpOwotCi0gIHByaW50ZXItPlByaW50KCJcbiIpOwotCi0gIEdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOwotCi0gIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7Ci0gIHByaW50ZXItPlByaW50KCJcbiIpOwotCi0gIEdlbmVyYXRlTWVzc2FnZURlZmluaXRpb25zKHByaW50ZXIpOwotCi0gIHByaW50ZXItPlByaW50KCJcbiIpOwotICBwcmludGVyLT5QcmludChrVGhpY2tTZXBhcmF0b3IpOwotICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICBHZW5lcmF0ZVNlcnZpY2VEZWZpbml0aW9ucyhwcmludGVyKTsKLQotICBHZW5lcmF0ZUV4dGVuc2lvbklkZW50aWZpZXJzKHByaW50ZXIpOwotCi0gIHByaW50ZXItPlByaW50KCJcbiIpOwotICBwcmludGVyLT5QcmludChrVGhpY2tTZXBhcmF0b3IpOwotICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICBHZW5lcmF0ZUlubGluZUZ1bmN0aW9uRGVmaW5pdGlvbnMocHJpbnRlcik7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKVxuIgotICAgICJcbiIpOwotCi0gIC8vIENsb3NlIHVwIG5hbWVzcGFjZS4KLSAgR2VuZXJhdGVOYW1lc3BhY2VDbG9zZXJzKHByaW50ZXIpOwotCi0gIC8vIFdlIG5lZWQgdG8gc3BlY2lhbGl6ZSBzb21lIHRlbXBsYXRlcyBpbiB0aGUgOjpnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZToKLSAgR2VuZXJhdGVQcm90bzJOYW1lc3BhY2VFbnVtU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJcbiIKLSAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSlcbiIKLSAgICAiXG4iKTsKLQotICBHZW5lcmF0ZUJvdHRvbUhlYWRlckd1YXJkKHByaW50ZXIsIGZpbGVuYW1lX2lkZW50aWZpZXIpOwotfQotCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlUEJIZWFkZXIoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbmZvX3BhdGgpIHsKLSAgc3RyaW5nIGZpbGVuYW1lX2lkZW50aWZpZXIgPQotICAgICAgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVfLT5uYW1lKCkgKyAob3B0aW9uc18ucHJvdG9faCA/ICIucGIuaCIgOiAiIikpOwotICBHZW5lcmF0ZVRvcEhlYWRlckd1YXJkKHByaW50ZXIsIGZpbGVuYW1lX2lkZW50aWZpZXIpOwotCi0gIGlmIChvcHRpb25zXy5wcm90b19oKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoIiNpbmNsdWRlIFwiJGJhc2VuYW1lJC5wcm90by5oXCIgIC8vIElXWVUgcHJhZ21hOiBleHBvcnRcbiIsCi0gICAgICAgICAgICAgICAgICAgImJhc2VuYW1lIiwgU3RyaXBQcm90byhmaWxlXy0+bmFtZSgpKSk7Ci0gIH0gZWxzZSB7Ci0gICAgR2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMocHJpbnRlcik7Ci0gIH0KLSAgR2VuZXJhdGVEZXBlbmRlbmN5SW5jbHVkZXMocHJpbnRlcik7Ci0gIEdlbmVyYXRlTWV0YWRhdGFQcmFnbWEocHJpbnRlciwgaW5mb19wYXRoKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKVxuIik7Ci0KLQotCi0gIC8vIE9wZW4gbmFtZXNwYWNlLgotICBHZW5lcmF0ZU5hbWVzcGFjZU9wZW5lcnMocHJpbnRlcik7Ci0KLSAgaWYgKCFvcHRpb25zXy5wcm90b19oKSB7Ci0gICAgR2VuZXJhdGVHbG9iYWxTdGF0ZUZ1bmN0aW9uRGVjbGFyYXRpb25zKHByaW50ZXIpOwotICAgIEdlbmVyYXRlTWVzc2FnZUZvcndhcmREZWNsYXJhdGlvbnMocHJpbnRlcik7Ci0KLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAgIEdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOwotCi0gICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAgIEdlbmVyYXRlTWVzc2FnZURlZmluaXRpb25zKHByaW50ZXIpOwotCi0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAgIEdlbmVyYXRlU2VydmljZURlZmluaXRpb25zKHByaW50ZXIpOwotCi0gICAgR2VuZXJhdGVFeHRlbnNpb25JZGVudGlmaWVycyhwcmludGVyKTsKLQotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0KLSAgICBHZW5lcmF0ZUlubGluZUZ1bmN0aW9uRGVmaW5pdGlvbnMocHJpbnRlcik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiXG4iCi0gICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpXG4iKTsKLQotICAvLyBDbG9zZSB1cCBuYW1lc3BhY2UuCi0gIEdlbmVyYXRlTmFtZXNwYWNlQ2xvc2VycyhwcmludGVyKTsKLQotICBpZiAoIW9wdGlvbnNfLnByb3RvX2gpIHsKLSAgICAvLyBXZSBuZWVkIHRvIHNwZWNpYWxpemUgc29tZSB0ZW1wbGF0ZXMgaW4gdGhlIDo6Z29vZ2xlOjpwcm90b2J1ZiBuYW1lc3BhY2U6Ci0gICAgR2VuZXJhdGVQcm90bzJOYW1lc3BhY2VFbnVtU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKVxuIgotICAgICJcbiIpOwotCi0gIEdlbmVyYXRlQm90dG9tSGVhZGVyR3VhcmQocHJpbnRlciwgZmlsZW5hbWVfaWRlbnRpZmllcik7Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVTb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgY29uc3QgYm9vbCB1c2Vfc3lzdGVtX2luY2x1ZGUgPSBJc1dlbGxLbm93bk1lc3NhZ2UoZmlsZV8pOwotICBzdHJpbmcgaGVhZGVyID0KLSAgICAgIFN0cmlwUHJvdG8oZmlsZV8tPm5hbWUoKSkgKyAob3B0aW9uc18ucHJvdG9faCA/ICIucHJvdG8uaCIgOiAiLnBiLmgiKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIi8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCi0gICAgIi8vIHNvdXJjZTogJGZpbGVuYW1lJFxuIgotICAgICJcbiIKLSAgICAvLyBUaGUgZ2VuZXJhdGVkIGNvZGUgY2FsbHMgYWNjZXNzb3JzIHRoYXQgbWlnaHQgYmUgZGVwcmVjYXRlZC4gV2UgZG9uJ3QKLSAgICAvLyB3YW50IHRoZSBjb21waWxlciB0byB3YXJuIGluIGdlbmVyYXRlZCBjb2RlLgotICAgICIjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OXG4iCi0gICAgIiNpbmNsdWRlICRsZWZ0JCRoZWFkZXIkJHJpZ2h0JFxuIgotICAgICJcbiIKLSAgICAiI2luY2x1ZGUgPGFsZ29yaXRobT5cbiIgICAgLy8gZm9yIHN3YXAoKQotICAgICJcbiIKLSAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD5cbiIKLSAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0Lmg+XG4iCi0gICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPlxuIgotICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPlxuIgotICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+XG4iLAotICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCksCi0gICAgImhlYWRlciIsIGhlYWRlciwKLSAgICAibGVmdCIsIHVzZV9zeXN0ZW1faW5jbHVkZSA/ICI8IiA6ICJcIiIsCi0gICAgInJpZ2h0IiwgdXNlX3N5c3RlbV9pbmNsdWRlID8gIj4iIDogIlwiIik7Ci0KLSAgLy8gVW5rbm93biBmaWVsZHMgaW1wbGVtZW50YXRpb24gaW4gbGl0ZSBtb2RlIHVzZXMgU3RyaW5nT3V0cHV0U3RyZWFtCi0gIGlmICghVXNlVW5rbm93bkZpZWxkU2V0KGZpbGVfLCBvcHRpb25zXykgJiYgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpID4gMCkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD5cbiIpOwotICB9Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD5cbiIKLSAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD5cbiIKLSAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+XG4iCi0gICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPlxuIik7Ci0gIH0KLQotICBpZiAob3B0aW9uc18ucHJvdG9faCkgewotICAgIC8vIFVzZSB0aGUgc21hbGxlciAucHJvdG8uaCBmaWxlcy4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcCA9IGZpbGVfLT5kZXBlbmRlbmN5KGkpOwotICAgICAgY29uc3QgY2hhciogZXh0ZW5zaW9uID0gIi5wcm90by5oIjsKLSAgICAgIHN0cmluZyBkZXBlbmRlbmN5ID0gU3RyaXBQcm90byhkZXAtPm5hbWUoKSkgKyBleHRlbnNpb247Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiI2luY2x1ZGUgXCIkZGVwZW5kZW5jeSRcIlxuIiwKLSAgICAgICAgICAiZGVwZW5kZW5jeSIsIGRlcGVuZGVuY3kpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpXG4iKTsKLQotICBHZW5lcmF0ZU5hbWVzcGFjZU9wZW5lcnMocHJpbnRlcik7Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJcbiIKLSAgICAgICJuYW1lc3BhY2Uge1xuIgotICAgICAgIlxuIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9yRGVjbGFyYXRpb25zKHByaW50ZXIpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iLAotICAgICAgICAibmFtZSIsIENsYXNzTmFtZShmaWxlXy0+ZW51bV90eXBlKGkpLCBmYWxzZSkpOwotICAgIH0KLQotICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iLAotICAgICAgICAgICJuYW1lIiwgZmlsZV8tPnNlcnZpY2UoaSktPm5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiXG4iCi0gICAgICAifSAgLy8gbmFtZXNwYWNlXG4iCi0gICAgICAiXG4iKTsKLSAgfQotCi0gIC8vIERlZmluZSBvdXIgZXh0ZXJuYWxseS12aXNpYmxlIEJ1aWxkRGVzY3JpcHRvcnMoKSBmdW5jdGlvbi4gIChGb3IgdGhlIGxpdGUKLSAgLy8gbGlicmFyeSwgYWxsIHRoaXMgZG9lcyBpcyBpbml0aWFsaXplIGRlZmF1bHQgaW5zdGFuY2VzLikKLSAgR2VuZXJhdGVCdWlsZERlc2NyaXB0b3JzKHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIGVudW1zLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVNZXRob2RzKHByaW50ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2xhc3Nlcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGlmIChpID09IDAgJiYgSGFzR2VuZXJhdGVkTWV0aG9kcyhmaWxlXywgb3B0aW9uc18pKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiXG4iCi0gICAgICAgICAgIm5hbWVzcGFjZSB7XG4iCi0gICAgICAgICAgIlxuIgotICAgICAgICAgICJzdGF0aWMgdm9pZCBNZXJnZUZyb21GYWlsKGludCBsaW5lKSBHT09HTEVfQVRUUklCVVRFX0NPTEQ7XG4iCi0gICAgICAgICAgIkdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgc3RhdGljIHZvaWQgTWVyZ2VGcm9tRmFpbChpbnQgbGluZSkge1xuIgotICAgICAgICAgICIgIEdPT0dMRV9DSEVDSyhmYWxzZSkgPDwgX19GSUxFX18gPDwgXCI6XCIgPDwgbGluZTtcbiIKLSAgICAgICAgICAifVxuIgotICAgICAgICAgICJcbiIKLSAgICAgICAgICAifSAgLy8gbmFtZXNwYWNlXG4iCi0gICAgICAgICAgIlxuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc01ldGhvZHMocHJpbnRlcik7Ci0KLSAgICBwcmludGVyLT5QcmludCgiI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSU1xuIik7Ci0gICAgLy8gR2VuZXJhdGUgY2xhc3MgaW5saW5lIG1ldGhvZHMuCi0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzX2lubGluZSA9ICovIGZhbHNlKTsKLSAgICBwcmludGVyLT5QcmludCgiI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlNcbiIpOwotICB9Ci0KLSAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXywgb3B0aW9uc18pKSB7Ci0gICAgLy8gR2VuZXJhdGUgc2VydmljZXMuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIGlmIChpID09IDApIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKLSAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgICAgc2VydmljZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihwcmludGVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBEZWZpbmUgZXh0ZW5zaW9ucy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZpbml0aW9uKHByaW50ZXIpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKVxuIik7Ci0KLSAgR2VuZXJhdGVOYW1lc3BhY2VDbG9zZXJzKHByaW50ZXIpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJcbiIKLSAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSlcbiIpOwotfQotCi1jbGFzcyBGaWxlR2VuZXJhdG9yOjpGb3J3YXJkRGVjbGFyYXRpb25zIHsKLSBwdWJsaWM6Ci0gIH5Gb3J3YXJkRGVjbGFyYXRpb25zKCkgewotICAgIGZvciAobWFwPHN0cmluZywgRm9yd2FyZERlY2xhcmF0aW9ucyAqPjo6aXRlcmF0b3IgaXQgPSBuYW1lc3BhY2VzXy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gbmFtZXNwYWNlc18uZW5kKCk7Ci0gICAgICAgICBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOwotICAgIH0KLSAgICBuYW1lc3BhY2VzXy5jbGVhcigpOwotICB9Ci0KLSAgRm9yd2FyZERlY2xhcmF0aW9ucyogQWRkT3JHZXROYW1lc3BhY2UoY29uc3Qgc3RyaW5nJiBuc19uYW1lKSB7Ci0gICAgRm9yd2FyZERlY2xhcmF0aW9ucyomIG5zID0gbmFtZXNwYWNlc19bbnNfbmFtZV07Ci0gICAgaWYgKG5zID09IE5VTEwpIHsKLSAgICAgIG5zID0gbmV3IEZvcndhcmREZWNsYXJhdGlvbnM7Ci0gICAgfQotICAgIHJldHVybiBuczsKLSAgfQotCi0gIG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPiYgY2xhc3NlcygpIHsgcmV0dXJuIGNsYXNzZXNfOyB9Ci0gIG1hcDxzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4mIGVudW1zKCkgeyByZXR1cm4gZW51bXNfOyB9Ci0KLSAgdm9pZCBQcmludChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAgIGZvciAobWFwPHN0cmluZywgY29uc3QgRW51bURlc2NyaXB0b3IgKj46OmNvbnN0X2l0ZXJhdG9yCi0gICAgICAgICAgICAgaXQgPSBlbnVtc18uYmVnaW4oKSwKLSAgICAgICAgICAgICBlbmQgPSBlbnVtc18uZW5kKCk7Ci0gICAgICAgICBpdCAhPSBlbmQ7ICsraXQpIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJlbnVtICRlbnVtbmFtZSQgOiBpbnQ7XG4iLCAiZW51bW5hbWUiLCBpdC0+Zmlyc3QpOwotICAgICAgcHJpbnRlci0+QW5ub3RhdGUoImVudW1uYW1lIiwgaXQtPnNlY29uZCk7Ci0gICAgICBwcmludGVyLT5QcmludCgiYm9vbCAkZW51bW5hbWUkX0lzVmFsaWQoaW50IHZhbHVlKTtcbiIsICJlbnVtbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QpOwotICAgIH0KLSAgICBmb3IgKG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IgKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2xhc3Nlc18uYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGNsYXNzZXNfLmVuZCgpOwotICAgICAgICAgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgICBwcmludGVyLT5QcmludCgiY2xhc3MgJGNsYXNzbmFtZSQ7XG4iLCAiY2xhc3NuYW1lIiwgaXQtPmZpcnN0KTsKLSAgICAgIHByaW50ZXItPkFubm90YXRlKCJjbGFzc25hbWUiLCBpdC0+c2Vjb25kKTsKLSAgICB9Ci0gICAgZm9yIChtYXA8c3RyaW5nLCBGb3J3YXJkRGVjbGFyYXRpb25zICo+Ojpjb25zdF9pdGVyYXRvcgotICAgICAgICAgICAgIGl0ID0gbmFtZXNwYWNlc18uYmVnaW4oKSwKLSAgICAgICAgICAgICBlbmQgPSBuYW1lc3BhY2VzXy5lbmQoKTsKLSAgICAgICAgIGl0ICE9IGVuZDsgKytpdCkgewotICAgICAgcHJpbnRlci0+UHJpbnQoIm5hbWVzcGFjZSAkbnNuYW1lJCB7XG4iLAotICAgICAgICAgICAgICAgICAgICAgIm5zbmFtZSIsIGl0LT5maXJzdCk7Ci0gICAgICBpdC0+c2Vjb25kLT5QcmludChwcmludGVyKTsKLSAgICAgIHByaW50ZXItPlByaW50KCJ9ICAvLyBuYW1lc3BhY2UgJG5zbmFtZSRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAibnNuYW1lIiwgaXQtPmZpcnN0KTsKLSAgICB9Ci0gIH0KLQotCi0gcHJpdmF0ZToKLSAgbWFwPHN0cmluZywgRm9yd2FyZERlY2xhcmF0aW9ucyo+IG5hbWVzcGFjZXNfOwotICBtYXA8c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj4gY2xhc3Nlc187Ci0gIG1hcDxzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4gZW51bXNfOwotfTsKLQotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gQWRkRGVzY3JpcHRvcnMoKSBpcyBhIGZpbGUtbGV2ZWwgcHJvY2VkdXJlIHdoaWNoIGFkZHMgdGhlIGVuY29kZWQKLSAgLy8gRmlsZURlc2NyaXB0b3JQcm90byBmb3IgdGhpcyAucHJvdG8gZmlsZSB0byB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sIGZvcgotICAvLyBnZW5lcmF0ZWQgZmlsZXMgKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKS4gSXQgZWl0aGVyIHJ1bnMgYXQKLSAgLy8gc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUgKGJ5IGRlZmF1bHQpIG9yIHdoZW4gZGVmYXVsdF9pbnN0YW5jZSgpIGlzCi0gIC8vIGNhbGxlZCBmb3IgdGhlIGZpcnN0IHRpbWUgKGluIExJVEVfUlVOVElNRSBtb2RlIHdpdGgKLSAgLy8gR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUiBmbGFnIGVuYWJsZWQpLiBUaGlzIHByb2NlZHVyZSBhbHNvCi0gIC8vIGNvbnN0cnVjdHMgZGVmYXVsdCBpbnN0YW5jZXMgYW5kIHJlZ2lzdGVycyBleHRlbnNpb25zLgotICAvLwotICAvLyBJdHMgc2libGluZywgQXNzaWduRGVzY3JpcHRvcnMoKSwgYWN0dWFsbHkgcHVsbHMgdGhlIGNvbXBpbGVkCi0gIC8vIEZpbGVEZXNjcmlwdG9yIGZyb20gdGhlIERlc2NyaXB0b3JQb29sIGFuZCB1c2VzIGl0IHRvIHBvcHVsYXRlIGFsbCBvZgotICAvLyB0aGUgZ2xvYmFsIHZhcmlhYmxlcyB3aGljaCBzdG9yZSBwb2ludGVycyB0byB0aGUgZGVzY3JpcHRvciBvYmplY3RzLgotICAvLyBJdCBhbHNvIGNvbnN0cnVjdHMgdGhlIHJlZmxlY3Rpb24gb2JqZWN0cy4gIEl0IGlzIGNhbGxlZCB0aGUgZmlyc3QgdGltZQotICAvLyBhbnlvbmUgY2FsbHMgZGVzY3JpcHRvcigpIG9yIEdldFJlZmxlY3Rpb24oKSBvbiBvbmUgb2YgdGhlIHR5cGVzIGRlZmluZWQKLSAgLy8gaW4gdGhlIGZpbGUuCi0KLSAgLy8gSW4gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIG1vZGUsIHdlIGRvbid0IGdlbmVyYXRlIEFzc2lnbkRlc2NyaXB0b3JzKCkKLSAgLy8gYW5kIHdlIG9ubHkgdXNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYWxsb2NhdGUgZGVmYXVsdCBpbnN0YW5jZXMuCi0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXywgb3B0aW9uc18pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiXG4iCi0gICAgICAidm9pZCAkYXNzaWduZGVzY3JpcHRvcnNuYW1lJCgpIHtcbiIsCi0gICAgICAiYXNzaWduZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQXNzaWduRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGUgZmlsZSBoYXMgZm91bmQgaXRzIHdheSBpbnRvIHRoZSBwb29sLiAgSWYgYSBkZXNjcmlwdG9yCi0gICAgLy8gaXMgcmVxdWVzdGVkICpkdXJpbmcqIHN0YXRpYyBpbml0IHRoZW4gQWRkRGVzY3JpcHRvcnMoKSBtYXkgbm90IGhhdmUKLSAgICAvLyBiZWVuIGNhbGxlZCB5ZXQsIHNvIHdlIGNhbGwgaXQgbWFudWFsbHkuICBOb3RlIHRoYXQgaXQncyBmaW5lIGlmCi0gICAgLy8gQWRkRGVzY3JpcHRvcnMoKSBpcyBjYWxsZWQgbXVsdGlwbGUgdGltZXMuCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIsCi0gICAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpKTsKLQotICAgIC8vIEdldCB0aGUgZmlsZSdzIGRlc2NyaXB0b3IgZnJvbSB0aGUgcG9vbC4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yKiBmaWxlID1cbiIKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPkZpbmRGaWxlQnlOYW1lKFxuIgotICAgICAgIiAgICBcIiRmaWxlbmFtZSRcIik7XG4iCi0gICAgICAvLyBOb3RlIHRoYXQgdGhpcyBHT09HTEVfQ0hFQ0sgaXMgbmVjZXNzYXJ5IHRvIHByZXZlbnQgYSB3YXJuaW5nIGFib3V0ICJmaWxlIgotICAgICAgLy8gYmVpbmcgdW51c2VkIHdoZW4gY29tcGlsaW5nIGFuIGVtcHR5IC5wcm90byBmaWxlLgotICAgICAgIkdPT0dMRV9DSEVDSyhmaWxlICE9IE5VTEwpO1xuIiwKLSAgICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCkpOwotCi0gICAgLy8gR28gdGhyb3VnaCBhbGwgdGhlIHN0dWZmIGRlZmluZWQgaW4gdGhpcyBmaWxlIGFuZCBnZW5lcmF0ZWQgY29kZSB0bwotICAgIC8vIGFzc2lnbiB0aGUgZ2xvYmFsIGRlc2NyaXB0b3IgcG9pbnRlcnMgYmFzZWQgb24gdGhlIGZpbGUgZGVzY3JpcHRvci4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihwcmludGVyLCBpKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIocHJpbnRlciwgaSk7Ci0gICAgfQotICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKLSAgICAgICAgc2VydmljZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIocHJpbnRlciwgaSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIn1cbiIKLSAgICAgICJcbiIpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvLyBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTogIFRoZSBmaXJzdCB0aW1lIGl0IGlzIGNhbGxlZCwgY2FsbHMKLSAgICAvLyBBc3NpZ25EZXNjcmlwdG9ycygpLiAgQWxsIGxhdGVyIHRpbWVzLCB3YWl0cyBmb3IgdGhlIGZpcnN0IGNhbGwgdG8KLSAgICAvLyBjb21wbGV0ZSBhbmQgdGhlbiByZXR1cm5zLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIm5hbWVzcGFjZSB7XG4iCi0gICAgICAiXG4iCi0gICAgICAiR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc19vbmNlXyk7XG4iCi0gICAgICAiaW5saW5lIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCkge1xuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8sXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAmJGFzc2lnbmRlc2NyaXB0b3JzbmFtZSQpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIsCi0gICAgICAiYXNzaWduZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQXNzaWduRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpKTsKLQotICAgIC8vIHByb3RvYnVmX1JlZ2lzdGVyVHlwZXMoKTogIENhbGxzCi0gICAgLy8gTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRUeXBlKCkgZm9yIGVhY2ggbWVzc2FnZSB0eXBlLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInZvaWQgcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyhjb25zdCA6OnN0ZDo6c3RyaW5nJikge1xuIgotICAgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlVHlwZVJlZ2lzdHJhdGlvbnMocHJpbnRlcik7Ci0gICAgfQotCi0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIn1cbiIKLSAgICAgICJcbiIKLSAgICAgICJ9ICAvLyBuYW1lc3BhY2VcbiIpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBTaHV0ZG93bkZpbGUoKTogIERlbGV0ZXMgZGVzY3JpcHRvcnMsIGRlZmF1bHQgaW5zdGFuY2VzLCBldGMuIG9uIHNodXRkb3duLgotICBwcmludGVyLT5QcmludCgKLSAgICAiXG4iCi0gICAgInZvaWQgJHNodXRkb3duZmlsZW5hbWUkKCkge1xuIiwKLSAgICAic2h1dGRvd25maWxlbmFtZSIsIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoZmlsZV8tPm5hbWUoKSkpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTaHV0ZG93bkNvZGUocHJpbnRlcik7Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ9XG5cbiIpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gTm93IGdlbmVyYXRlIHRoZSBBZGREZXNjcmlwdG9ycygpIGZ1bmN0aW9uLgotICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICBmaWxlXywgb3B0aW9uc18sIHByaW50ZXIsCi0gICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkgc3BlY2lhbCBzeW5jaHJvbml6YXRpb24gaW4gdGhlIGZvbGxvd2luZwotICAgICAgLy8gY29kZQotICAgICAgLy8gYmVjYXVzZSBpdCBpcyBjYWxsZWQgYXQgc3RhdGljIGluaXQgdGltZSBiZWZvcmUgYW55IHRocmVhZHMgZXhpc3QuCi0gICAgICAidm9pZCAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpIHtcbiIKLSAgICAgICIgIHN0YXRpYyBib29sIGFscmVhZHlfaGVyZSA9IGZhbHNlO1xuIgotICAgICAgIiAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuO1xuIgotICAgICAgIiAgYWxyZWFkeV9oZXJlID0gdHJ1ZTtcbiIKLSAgICAgICIgIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjtcbiIKLSAgICAgICJcbiIsCi0gICAgICAvLyBXaXRob3V0LgotICAgICAgInZvaWQgJGFkZGRlc2NyaXB0b3JzbmFtZSRfaW1wbCgpIHtcbiIKLSAgICAgICIgIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjtcbiIKLSAgICAgICJcbiIsCi0gICAgICAvLyBWYXJzLgotICAgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSk7Ci0KLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgLy8gQ2FsbCB0aGUgQWRkRGVzY3JpcHRvcnMoKSBtZXRob2RzIGZvciBhbGwgb2Ygb3VyIGRlcGVuZGVuY2llcywgdG8gbWFrZQotICAvLyBzdXJlIHRoZXkgZ2V0IGFkZGVkIGZpcnN0LgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXBlbmRlbmN5ID0gZmlsZV8tPmRlcGVuZGVuY3koaSk7Ci0gICAgLy8gUHJpbnQgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSBkZXBlbmRlbmN5LgotICAgIHN0cmluZyBhZGRfZGVzY19uYW1lID0gUXVhbGlmaWVkRmlsZUxldmVsU3ltYm9sKAotICAgICAgICBkZXBlbmRlbmN5LT5wYWNrYWdlKCksIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShkZXBlbmRlbmN5LT5uYW1lKCkpKTsKLSAgICAvLyBDYWxsIGl0cyBBZGREZXNjcmlwdG9ycyBmdW5jdGlvbi4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIkbmFtZSQoKTtcbiIsCi0gICAgICAibmFtZSIsIGFkZF9kZXNjX25hbWUpOwotICB9Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKLSAgICAvLyBFbWJlZCB0aGUgZGVzY3JpcHRvci4gIFdlIHNpbXBseSBzZXJpYWxpemUgdGhlIGVudGlyZSBGaWxlRGVzY3JpcHRvclByb3RvCi0gICAgLy8gYW5kIGVtYmVkIGl0IGFzIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIGlzIHBhcnNlZCBhbmQgYnVpbHQgaW50byByZWFsCi0gICAgLy8gZGVzY3JpcHRvcnMgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gICAgZmlsZV8tPkNvcHlUbygmZmlsZV9wcm90byk7Ci0gICAgc3RyaW5nIGZpbGVfZGF0YTsKLSAgICBmaWxlX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2RhdGEpOwotCi0jaWZkZWYgX01TQ19WRVIKLSAgICBib29sIGJyZWFrZG93bl9sYXJnZV9maWxlID0gdHJ1ZTsKLSNlbHNlCi0gICAgYm9vbCBicmVha2Rvd25fbGFyZ2VfZmlsZSA9IGZhbHNlOwotI2VuZGlmCi0gICAgLy8gV29ya2Fyb3VuZCBmb3IgTVNWQzogIkVycm9yIEMxMDkxOiBjb21waWxlciBsaW1pdDogc3RyaW5nIGV4Y2VlZHMgNjU1MzUKLSAgICAvLyBieXRlcyBpbiBsZW5ndGgiLiBEZWNsYXJlIGEgc3RhdGljIGFycmF5IG9mIGNoYXJhY3RlcnMgcmF0aGVyIHRoYW4gdXNlIGEKLSAgICAvLyBzdHJpbmcgbGl0ZXJhbC4KLSAgICBpZiAoYnJlYWtkb3duX2xhcmdlX2ZpbGUgJiYgZmlsZV9kYXRhLnNpemUoKSA+IDY1NTM1KSB7Ci0gICAgICAvLyBUaGlzIGhhcyB0byBiZSBleHBsaWNpdGx5IG1hcmtlZCBhcyBhIHNpZ25lZCBjaGFyIGJlY2F1c2UgdGhlIGdlbmVyYXRlZAotICAgICAgLy8gY29kZSBwdXRzIG5lZ2F0aXZlIHZhbHVlcyBpbiB0aGUgYXJyYXksIGFuZCBzb21ldGltZXMgcGxhaW4gY2hhciBpcwotICAgICAgLy8gdW5zaWduZWQuIFRoYXQgaW1wbGljaXQgbmFycm93aW5nIGNvbnZlcnNpb24gaXMgbm90IGFsbG93ZWQgaW4gQysrMTEuCi0gICAgICAvLyA8aHR0cDovL3N0YWNrb3ZlcmZsb3cuY29tL3F1ZXN0aW9ucy80NDM0MTQwL25hcnJvd2luZy1jb252ZXJzaW9ucy1pbi1jMHgtaXMtaXQtanVzdC1tZS1vci1kb2VzLXRoaXMtc291bmQtbGlrZS1hLWJyZWFraW4+Ci0gICAgICAvLyBoYXMgZGV0YWlscyBvbiB3aHkuCi0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAic3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGRlc2NyaXB0b3JbXSA9IHtcbiIpOwotICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgICAgIC8vIE9ubHkgd3JpdGUgMjUgYnl0ZXMgcGVyIGxpbmUuCi0gICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckxpbmUgPSAyNTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9kYXRhLnNpemUoKTspIHsKLSAgICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCeXRlc1BlckxpbmUgJiYgaSA8IGZpbGVfZGF0YS5zaXplKCk7ICsraSwgKytqKSB7Ci0gICAgICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAgICAgICAiJGNoYXIkLCAiLAotICAgICAgICAgICAgICAgICJjaGFyIiwgU2ltcGxlSXRvYShmaWxlX2RhdGFbaV0pKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAgICJcbiIpOwotICAgICAgfQotCi0gICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAifTtcbiIpOwotCi0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxBZGRHZW5lcmF0ZWRGaWxlKGRlc2NyaXB0b3IsICRzaXplJCk7XG4iLAotICAgICAgICAgICJzaXplIiwgU2ltcGxlSXRvYShmaWxlX2RhdGEuc2l6ZSgpKSk7Ci0KLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoIik7Ci0KLSAgICAgIC8vIE9ubHkgd3JpdGUgNDAgYnl0ZXMgcGVyIGxpbmUuCi0gICAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckxpbmUgPSA0MDsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9kYXRhLnNpemUoKTsgaSArPSBrQnl0ZXNQZXJMaW5lKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCJcbiAgXCIkZGF0YSRcIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJkYXRhIiwKLSAgICAgICAgICAgICAgICAgICAgICAgRXNjYXBlVHJpZ3JhcGhzKAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ0VzY2FwZShmaWxlX2RhdGEuc3Vic3RyKGksIGtCeXRlc1BlckxpbmUpKSkpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiwgJHNpemUkKTtcbiIsCi0gICAgICAgICJzaXplIiwgU2ltcGxlSXRvYShmaWxlX2RhdGEuc2l6ZSgpKSk7Ci0gICAgfQotCi0gICAgLy8gQ2FsbCBNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoKS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZShcbiIKLSAgICAgICIgIFwiJGZpbGVuYW1lJFwiLCAmcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyk7XG4iLAotICAgICAgImZpbGVuYW1lIiwgZmlsZV8tPm5hbWUoKSk7Ci0gIH0KLQotICAvLyBBbGxvY2F0ZSBhbmQgaW5pdGlhbGl6ZSBkZWZhdWx0IGluc3RhbmNlcy4gIFRoaXMgY2FuJ3QgYmUgZG9uZSBsYXppbHkKLSAgLy8gc2luY2UgZGVmYXVsdCBpbnN0YW5jZXMgYXJlIHJldHVybmVkIGJ5IHNpbXBsZSBhY2Nlc3NvcnMgYW5kIGFyZSB1c2VkIHdpdGgKLSAgLy8gZXh0ZW5zaW9ucy4gIFNwZWFraW5nIG9mIHdoaWNoLCB3ZSBhbHNvIHJlZ2lzdGVyIGV4dGVuc2lvbnMgYXQgdGhpcyB0aW1lLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IocHJpbnRlcik7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVSZWdpc3RyYXRpb24ocHJpbnRlcik7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmYXVsdEluc3RhbmNlSW5pdGlhbGl6ZXIocHJpbnRlcik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmJHNodXRkb3duZmlsZW5hbWUkKTtcbiIsCi0gICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ9XG4iCi0gICAgIlxuIik7Ci0KLSAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgICAgZmlsZV8sIG9wdGlvbnNfLCBwcmludGVyLAotICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotICAgICAgIi8vIEZvcmNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYmUgY2FsbGVkIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbiB0aW1lLlxuIgotICAgICAgInN0cnVjdCBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfJGZpbGVuYW1lJCB7XG4iCi0gICAgICAiICBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfJGZpbGVuYW1lJCgpIHtcbiIKLSAgICAgICIgICAgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICJ9IHN0YXRpY19kZXNjcmlwdG9yX2luaXRpYWxpemVyXyRmaWxlbmFtZSRfO1xuIiwKLSAgICAgIC8vIFdpdGhvdXQuCi0gICAgICAiR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRSgkYWRkZGVzY3JpcHRvcnNuYW1lJF9vbmNlXyk7XG4iCi0gICAgICAidm9pZCAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpIHtcbiIKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJiRhZGRkZXNjcmlwdG9yc25hbWUkX29uY2VfLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgJiRhZGRkZXNjcmlwdG9yc25hbWUkX2ltcGwpO1xuIgotICAgICAgIn1cbiIsCi0gICAgICAvLyBWYXJzLgotICAgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShmaWxlXy0+bmFtZSgpKSwgImZpbGVuYW1lIiwKLSAgICAgIEZpbGVuYW1lSWRlbnRpZmllcihmaWxlXy0+bmFtZSgpKSk7Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVOYW1lc3BhY2VPcGVuZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGlmIChwYWNrYWdlX3BhcnRzXy5zaXplKCkgPiAwKSBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHBhY2thZ2VfcGFydHNfLnNpemUoKTsgaSsrKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoIm5hbWVzcGFjZSAkcGFydCQge1xuIiwKLSAgICAgICAgICAgICAgICAgICAicGFydCIsIHBhY2thZ2VfcGFydHNfW2ldKTsKLSAgfQotfQotCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlTmFtZXNwYWNlQ2xvc2Vycyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAocGFja2FnZV9wYXJ0c18uc2l6ZSgpID4gMCkgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0KLSAgZm9yIChpbnQgaSA9IHBhY2thZ2VfcGFydHNfLnNpemUoKSAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoIn0gIC8vIG5hbWVzcGFjZSAkcGFydCRcbiIsCi0gICAgICAgICAgICAgICAgICAgInBhcnQiLCBwYWNrYWdlX3BhcnRzX1tpXSk7Ci0gIH0KLX0KLQotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgRm9yd2FyZERlY2xhcmF0aW9ucyBkZWNsczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKLSAgICBGaWxlR2VuZXJhdG9yIGRlcGVuZGVuY3koZmlsZV8tPmRlcGVuZGVuY3koaSksIG9wdGlvbnNfKTsKLSAgICBkZXBlbmRlbmN5LkZpbGxGb3J3YXJkRGVjbGFyYXRpb25zKCZkZWNscyk7Ci0gIH0KLSAgRmlsbEZvcndhcmREZWNsYXJhdGlvbnMoJmRlY2xzKTsKLSAgZGVjbHMuUHJpbnQocHJpbnRlcik7Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6RmlsbEZvcndhcmREZWNsYXJhdGlvbnMoRm9yd2FyZERlY2xhcmF0aW9ucyogZGVjbHMpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgRmlsZUdlbmVyYXRvciBkZXBlbmRlbmN5KGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKSwgb3B0aW9uc18pOwotICAgIGRlcGVuZGVuY3kuRmlsbEZvcndhcmREZWNsYXJhdGlvbnMoZGVjbHMpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZV9wYXJ0c18uc2l6ZSgpOyBpKyspIHsKLSAgICBkZWNscyA9IGRlY2xzLT5BZGRPckdldE5hbWVzcGFjZShwYWNrYWdlX3BhcnRzX1tpXSk7Ci0gIH0KLSAgLy8gR2VuZXJhdGUgZW51bSBkZWZpbml0aW9ucy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkZpbGxFbnVtRm9yd2FyZERlY2xhcmF0aW9ucygmZGVjbHMtPmVudW1zKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5GaWxsRm9yd2FyZERlY2xhcmF0aW9uKCZkZWNscy0+ZW51bXMoKSk7Ci0gIH0KLSAgLy8gR2VuZXJhdGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgY2xhc3Nlcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkZpbGxNZXNzYWdlRm9yd2FyZERlY2xhcmF0aW9ucygKLSAgICAgICAgJmRlY2xzLT5jbGFzc2VzKCkpOwotICB9Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVUb3BIZWFkZXJHdWFyZChpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lX2lkZW50aWZpZXIpIHsKLSAgLy8gR2VuZXJhdGUgdG9wIG9mIGhlYWRlci4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKLSAgICAgICIvLyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKLSAgICAgICJcbiIKLSAgICAgICIjaWZuZGVmIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIKLSAgICAgICIjZGVmaW5lIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIKLSAgICAgICJcbiIKLSAgICAgICIjaW5jbHVkZSA8c3RyaW5nPlxuIiwKLSAgICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCksICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7Ci0gIHByaW50ZXItPlByaW50KCJcbiIpOwotfQotCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlQm90dG9tSGVhZGVyR3VhcmQoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IHN0cmluZyYgZmlsZW5hbWVfaWRlbnRpZmllcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAiI2VuZGlmICAvLyBQUk9UT0JVRl8kZmlsZW5hbWVfaWRlbnRpZmllciRfX0lOQ0xVREVEXG4iLAotICAgICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD5cbiIKLSAgICAiXG4iKTsKLQotICAvLyBWZXJpZnkgdGhlIHByb3RvYnVmIGxpYnJhcnkgaGVhZGVyIHZlcnNpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2MKLSAgLy8gdmVyc2lvbiBiZWZvcmUgZ29pbmcgYW55IGZ1cnRoZXIuCi0gIHByaW50ZXItPlByaW50KAotICAgICIjaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAkbWluX2hlYWRlcl92ZXJzaW9uJFxuIgotICAgICIjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpc1xuIgotICAgICIjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZSB1cGRhdGVcbiIKLSAgICAiI2Vycm9yIHlvdXIgaGVhZGVycy5cbiIKLSAgICAiI2VuZGlmXG4iCi0gICAgIiNpZiAkcHJvdG9jX3ZlcnNpb24kIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTlxuIgotICAgICIjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXNcbiIKLSAgICAiI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2VcbiIKLSAgICAiI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy5cbiIKLSAgICAiI2VuZGlmXG4iCi0gICAgIlxuIiwKLSAgICAibWluX2hlYWRlcl92ZXJzaW9uIiwKLSAgICAgIFNpbXBsZUl0b2EocHJvdG9idWY6OmludGVybmFsOjprTWluSGVhZGVyVmVyc2lvbkZvclByb3RvYyksCi0gICAgInByb3RvY192ZXJzaW9uIiwgU2ltcGxlSXRvYShHT09HTEVfUFJPVE9CVUZfVkVSU0lPTikpOwotCi0gIC8vIE9LLCBpdCdzIG5vdyBzYWZlIHRvICNpbmNsdWRlIG90aGVyIGZpbGVzLgotICBwcmludGVyLT5QcmludCgKLSAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPlxuIgotICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+XG4iCi0gICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPlxuIik7Ci0gIGlmIChVc2VVbmtub3duRmllbGRTZXQoZmlsZV8sIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaD5cbiIpOwotICB9Ci0gIGlmIChmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgPiAwKSB7Ci0gICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPlxuIik7Ci0gICAgfQotICB9Ci0gIHByaW50ZXItPlByaW50KAotICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+XG4iCi0gICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPlxuIik7Ci0gIGlmIChIYXNNYXBGaWVsZHMoZmlsZV8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcC5oPlxuIik7Ci0gICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaD5cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfbGl0ZS5oPlxuIik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhmaWxlXykpIHsKLSAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oPlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuaD5cbiIpOwotICAgIH0KLSAgfQotCi0gIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc2VydmljZS5oPlxuIik7Ci0gIH0KLQotICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGZpbGVfLCBvcHRpb25zXykgJiYgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpID4gMCkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD5cbiIpOwotICB9Ci0KLQotICBpZiAoSXNBbnlNZXNzYWdlKGZpbGVfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYW55Lmg+XG4iKTsKLSAgfQotfQotCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlTWV0YWRhdGFQcmFnbWEoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbmZvX3BhdGgpIHsKLSAgaWYgKCFpbmZvX3BhdGguZW1wdHkoKSAmJiAhb3B0aW9uc18uYW5ub3RhdGlvbl9wcmFnbWFfbmFtZS5lbXB0eSgpICYmCi0gICAgICAhb3B0aW9uc18uYW5ub3RhdGlvbl9ndWFyZF9uYW1lLmVtcHR5KCkpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiNpZmRlZiAkZ3VhcmQkXG4iCi0gICAgICAgICIjcHJhZ21hICRwcmFnbWEkIFwiJGluZm9fcGF0aCRcIlxuIgotICAgICAgICAiI2VuZGlmICAvLyAkZ3VhcmQkXG4iLAotICAgICAgICAiZ3VhcmQiLCBvcHRpb25zXy5hbm5vdGF0aW9uX2d1YXJkX25hbWUsICJwcmFnbWEiLAotICAgICAgICBvcHRpb25zXy5hbm5vdGF0aW9uX3ByYWdtYV9uYW1lLCAiaW5mb19wYXRoIiwgaW5mb19wYXRoKTsKLSAgfQotfQotCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlRGVwZW5kZW5jeUluY2x1ZGVzKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHNldDxzdHJpbmc+IHB1YmxpY19pbXBvcnRfbmFtZXM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIHB1YmxpY19pbXBvcnRfbmFtZXMuaW5zZXJ0KGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgYm9vbCB1c2Vfc3lzdGVtX2luY2x1ZGUgPSBJc1dlbGxLbm93bk1lc3NhZ2UoZmlsZV8tPmRlcGVuZGVuY3koaSkpOwotICAgIGNvbnN0IHN0cmluZyYgbmFtZSA9IGZpbGVfLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCk7Ci0gICAgYm9vbCBwdWJsaWNfaW1wb3J0ID0gKHB1YmxpY19pbXBvcnRfbmFtZXMuY291bnQobmFtZSkgIT0gMCk7Ci0KLQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiNpbmNsdWRlICRsZWZ0JCRkZXBlbmRlbmN5JC5wYi5oJHJpZ2h0JCRpd3l1JFxuIiwKLSAgICAgICJkZXBlbmRlbmN5IiwgU3RyaXBQcm90byhuYW1lKSwKLSAgICAgICJpd3l1IiwgKHB1YmxpY19pbXBvcnQpID8gIiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCIgOiAiIiwKLSAgICAgICJsZWZ0IiwgdXNlX3N5c3RlbV9pbmNsdWRlID8gIjwiIDogIlwiIiwKLSAgICAgICJyaWdodCIsIHVzZV9zeXN0ZW1faW5jbHVkZSA/ICI+IiA6ICJcIiIpOwotICB9Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVHbG9iYWxTdGF0ZUZ1bmN0aW9uRGVjbGFyYXRpb25zKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIEZvcndhcmQtZGVjbGFyZSB0aGUgQWRkRGVzY3JpcHRvcnMsIEFzc2lnbkRlc2NyaXB0b3JzLCBhbmQgU2h1dGRvd25GaWxlCi0gIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGVtIHRvIGJlIGZyaWVuZHMgb2YgZWFjaCBjbGFzcy4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgotICAgICIvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuXG4iCi0gICAgInZvaWQgJGRsbGV4cG9ydF9kZWNsJCRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAotICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSksCi0gICAgImRsbGV4cG9ydF9kZWNsIiwKLSAgICBvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpID8gIiIgOiBvcHRpb25zXy5kbGxleHBvcnRfZGVjbCArICIgIik7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IHB1dCBkbGxleHBvcnRfZGVjbCBvbiB0aGVzZSBiZWNhdXNlIHRoZXkgYXJlIG9ubHkKLSAgICAvLyBjYWxsZWQgYnkgdGhlIC5wYi5jYyBmaWxlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQuCi0gICAgInZvaWQgJGFzc2lnbmRlc2NyaXB0b3JzbmFtZSQoKTtcbiIKLSAgICAidm9pZCAkc2h1dGRvd25maWxlbmFtZSQoKTtcbiIKLSAgICAiXG4iLAotICAgICJhc3NpZ25kZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSksCi0gICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKLX0KLQotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPiBjbGFzc2VzOwotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+RmlsbE1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKCZjbGFzc2VzKTsKLSAgfQotICBmb3IgKG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IgKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2xhc3Nlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGNsYXNzZXMuZW5kKCk7Ci0gICAgICAgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoImNsYXNzICRjbGFzc25hbWUkO1xuIiwgImNsYXNzbmFtZSIsIGl0LT5maXJzdCk7Ci0gICAgcHJpbnRlci0+QW5ub3RhdGUoImNsYXNzbmFtZSIsIGl0LT5zZWNvbmQpOwotICB9Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVNZXNzYWdlRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gR2VuZXJhdGUgY2xhc3MgZGVmaW5pdGlvbnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOwotICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgfQotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHByaW50ZXIpOwotICB9Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVFbnVtRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gR2VuZXJhdGUgZW51bSBkZWZpbml0aW9ucy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlZmluaXRpb24ocHJpbnRlcik7Ci0gIH0KLX0KLQotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcnZpY2VEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfLCBvcHRpb25zXykpIHsKLSAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlIGRlZmluaXRpb25zLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7Ci0gICAgICBpZiAoaSA+IDApIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgICB9Ci0gICAgICBzZXJ2aWNlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9ucyhwcmludGVyKTsKLSAgICB9Ci0KLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgICBwcmludGVyLT5QcmludChrVGhpY2tTZXBhcmF0b3IpOwotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICB9Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVFeHRlbnNpb25JZGVudGlmaWVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICAvLyBEZWNsYXJlIGV4dGVuc2lvbiBpZGVudGlmaWVycy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWNsYXJhdGlvbihwcmludGVyKTsKLSAgfQotfQotCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlSW5saW5lRnVuY3Rpb25EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICAvLyBBbiBhc2lkZSBhYm91dCBpbmxpbmUgZnVuY3Rpb25zIGluIC5wcm90by5oIG1vZGU6Ci0gIC8vCi0gIC8vIFRoZSBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMgc3ltYm9sIGNvbnRyb2xzIGNvbmRpdGlvbmFsbHkKLSAgLy8gbW92aW5nIG11Y2ggb2YgdGhlIGlubGluZSBmdW5jdGlvbnMgdG8gdGhlIC5wYi5jYyBmaWxlLCB3aGljaCBjYW4gYmUgYQotICAvLyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBiZW5lZml0IGZvciBjb21waWxhdGlvbiB0aW1lLCBhdCB0aGUgZXhwZW5zZQotICAvLyBvZiBub24taW5saW5lIGZ1bmN0aW9uIGNhbGxzLgotICAvLwotICAvLyBIb3dldmVyLCBpbiAucHJvdG8uaCBtb2RlLCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGVwZW5kZW50Ci0gIC8vIGJhc2UgY2xhc3MgbXVzdCByZW1haW4gaW4gdGhlIGhlYWRlciwgYW5kIGNhbiBuZXZlciBiZSBvdXQtbGluZWQuIFRoZQotICAvLyBkZXBlbmRlbnQgYmFzZSBjbGFzcyBhbHNvIG5lZWRzIGFjY2VzcyB0byBoYXMtYml0IG1hbmlwdWF0aW9uCi0gIC8vIGZ1bmN0aW9ucywgc28gdGhlIGhhcy1iaXQgZnVuY3Rpb25zIG11c3QgYmUgdW5jb25kaXRpb25hbGx5IGlubGluZWQgaW4KLSAgLy8gcHJvdG9faCBtb2RlLgotICAvLwotICAvLyBUaGlzIGdpdmVzIHVzIHRocmVlIGZsYXZvcnMgb2YgZnVuY3Rpb25zOgotICAvLwotICAvLyAgMS4gRnVuY3Rpb25zIG9uIHRoZSBtZXNzYWdlIG5vdCB1c2VkIGJ5IHRoZSBpbnRlcm5hbCBkZXBlbmRlbnQgYmFzZQotICAvLyAgICAgY2xhc3M6IGluIC5wcm90by5oIG1vZGUsIG9ubHkgc29tZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgb24gdGhlCi0gIC8vICAgICBtZXNzYWdlIGNsYXNzOyBvdGhlcnMgYXJlIGRlZmluZWQgb24gdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzLgotICAvLyAgICAgVGhlc2UgYXJlIGd1YXJkZWQgYW5kIGNhbiBiZSBvdXQtbGluZWQuIFRoZXNlIGFyZSBnZW5lcmF0ZWQgYnkKLSAgLy8gICAgIEdlbmVyYXRlSW5saW5lTWV0aG9kcywgYW5kIGluY2x1ZGUgaGFzXyogYml0IGZ1bmN0aW9ucyBpbgotICAvLyAgICAgbm9uLXByb3RvX2ggbW9kZS4KLSAgLy8KLSAgLy8gIDIuIEZ1bmN0aW9ucyBvbiB0aGUgaW50ZXJuYWwgZGVwZW5kZW50IGJhc2UgY2xhc3M6IHRoZXNlIGZ1bmN0aW9ucwotICAvLyAgICAgYXJlIGRlcGVuZGVudCBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlciwgc28gdGhleSBhbHdheXMgbmVlZCB0bwotICAvLyAgICAgcmVtYWluIGluIHRoZSBoZWFkZXIuCi0gIC8vCi0gIC8vICAzLiBGdW5jdGlvbnMgb24gdGhlIG1lc3NhZ2UgdGhhdCBhcmUgdXNlZCBieSB0aGUgZGVwZW5kZW50IGJhc2U6IHRoZQotICAvLyAgICAgZGVwZW5kZW50IGJhc2UgY2xhc3MgZG93biBjYXN0cyBpdHNlbGYgdG8gdGhlIG1lc3NhZ2UKLSAgLy8gICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGFjY2VzcyB0aGVzZSBmdW5jdGlvbnMgKHRoZSBoYXNfKiBiaXQKLSAgLy8gICAgIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMpLiBVbmxpa2UgIzEsIHRoZXNlIGZ1bmN0aW9ucyBtdXN0Ci0gIC8vICAgICB1bmNvbmRpdGlvbmFsbHkgcmVtYWluIGluIHRoZSBoZWFkZXIuIFRoZXNlIGFyZSBlbWl0dGVkIGJ5Ci0gIC8vICAgICBHZW5lcmF0ZURlcGVuZGVudElubGluZU1ldGhvZHMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBhY3R1YWxseQotICAvLyAgICAgZGVwZW5kZW50LgotCi0gIHByaW50ZXItPlByaW50KCIjaWYgIVBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSU1xuIik7Ci0gIC8vIEdlbmVyYXRlIGNsYXNzIGlubGluZSBtZXRob2RzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7Ci0gICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgICB9Ci0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzX2lubGluZSA9ICovIHRydWUpOwotICB9Ci0gIHByaW50ZXItPlByaW50KCIjZW5kaWYgIC8vICFQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlNcbiIpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKLSAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgIH0KLSAgICAvLyBNZXRob2RzIG9mIHRoZSBkZXBlbmRlbnQgYmFzZSBjbGFzcyBtdXN0IGFsd2F5cyBiZSBpbmxpbmUgaW4gdGhlIGhlYWRlci4KLSAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlcGVuZGVudElubGluZU1ldGhvZHMocHJpbnRlcik7Ci0gIH0KLX0KLQotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVByb3RvMk5hbWVzcGFjZUVudW1TcGVjaWFsaXphdGlvbnMoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gRW1pdCBHZXRFbnVtRGVzY3JpcHRvciBzcGVjaWFsaXphdGlvbnMgaW50byBnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZToKLSAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhmaWxlXykpIHsKLSAgICAvLyBUaGUgU1dJRyBjb25kaXRpb25hbCBpcyB0byBhdm9pZCBhIG51bGwtcG9pbnRlciBkZXJlZmVyZW5jZQotICAgIC8vIChidWcgMTk4NDk2NCkgaW4gc3dpZy0xLjMuMjEgcmVzdWx0aW5nIGZyb20gdGhlIGZvbGxvd2luZyBzeW50YXg6Ci0gICAgLy8gICBuYW1lc3BhY2UgWCB7IHZvaWQgWTxaOjpXPigpOyB9Ci0gICAgLy8gd2hpY2ggYXBwZWFycyBpbiBHZXRFbnVtRGVzY3JpcHRvcigpIHNwZWNpYWxpemF0aW9ucy4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIlxuIgotICAgICAgICAiI2lmbmRlZiBTV0lHXG4iCi0gICAgICAgICJuYW1lc3BhY2UgZ29vZ2xlIHtcbm5hbWVzcGFjZSBwcm90b2J1ZiB7XG4iCi0gICAgICAgICJcbiIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiXG4iCi0gICAgICAgICJ9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWZcbn0gIC8vIG5hbWVzcGFjZSBnb29nbGVcbiIKLSAgICAgICAgIiNlbmRpZiAgLy8gU1dJR1xuIik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZGNmNjkyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklMRV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUxFX0hfXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0gIGNsYXNzIEZpbGVEZXNjcmlwdG9yOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCi0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCi0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgY3BwIHsKLQotY2xhc3MgRW51bUdlbmVyYXRvcjsgICAgICAgICAgIC8vIGVudW0uaAotY2xhc3MgTWVzc2FnZUdlbmVyYXRvcjsgICAgICAgIC8vIG1lc3NhZ2UuaAotY2xhc3MgU2VydmljZUdlbmVyYXRvcjsgICAgICAgIC8vIHNlcnZpY2UuaAotY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yOyAgICAgIC8vIGV4dGVuc2lvbi5oCi0KLWNsYXNzIEZpbGVHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgLy8gU2VlIGdlbmVyYXRvci5jYyBmb3IgdGhlIG1lYW5pbmcgb2YgZGxsZXhwb3J0X2RlY2wuCi0gIEZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+RmlsZUdlbmVyYXRvcigpOwotCi0gIC8vIGluZm9fcGF0aCwgaWYgbm9uLWVtcHR5LCBzaG91bGQgYmUgdGhlIHBhdGggKHJlbGF0aXZlIHRvIHByaW50ZXIncyBvdXRwdXQpCi0gIC8vIHRvIHRoZSBtZXRhZGF0YSBmaWxlIGRlc2NyaWJpbmcgdGhpcyBwcm90byBoZWFkZXIuCi0gIHZvaWQgR2VuZXJhdGVQcm90b0hlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaW5mb19wYXRoKTsKLSAgLy8gaW5mb19wYXRoLCBpZiBub24tZW1wdHksIHNob3VsZCBiZSB0aGUgcGF0aCAocmVsYXRpdmUgdG8gcHJpbnRlcidzIG91dHB1dCkKLSAgLy8gdG8gdGhlIG1ldGFkYXRhIGZpbGUgZGVzY3JpYmluZyB0aGlzIFBCIGhlYWRlci4KLSAgdm9pZCBHZW5lcmF0ZVBCSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbmZvX3BhdGgpOwotICB2b2lkIEdlbmVyYXRlU291cmNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotIHByaXZhdGU6Ci0gIC8vIEludGVybmFsIHR5cGUgdXNlZCBieSBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbnMgKGRlZmluZWQgaW4gZmlsZS5jYykuCi0gIGNsYXNzIEZvcndhcmREZWNsYXJhdGlvbnM7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIEJ1aWxkRGVzY3JpcHRvcnMoKSBwcm9jZWR1cmUsIHdoaWNoIGJ1aWxkcyBhbGwgZGVzY3JpcHRvcnMKLSAgLy8gZm9yIHR5cGVzIGRlZmluZWQgaW4gdGhlIGZpbGUuCi0gIHZvaWQgR2VuZXJhdGVCdWlsZERlc2NyaXB0b3JzKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICB2b2lkIEdlbmVyYXRlTmFtZXNwYWNlT3BlbmVycyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVOYW1lc3BhY2VDbG9zZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBGb3Igb3RoZXIgaW1wb3J0cywgZ2VuZXJhdGVzIHRoZWlyIGZvcndhcmQtZGVjbGFyYXRpb25zLgotICB2b2lkIEdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gSW50ZXJuYWwgaGVscGVyIHVzZWQgYnkgR2VuZXJhdGVGb3J3YXJkRGVjbGFyYXRpb25zOiBmaWxscyAnZGVjbHMnCi0gIC8vIHdpdGggYWxsIG5lY2Vzc2FyeSBmb3J3YXJkLWRlY2xhcmF0aW9ucyBmb3IgdGhpcyBmaWxlIGFuZCBpdHMKLSAgLy8gdHJhbnNpZW50IGRlcGVkbmVuY2llcy4KLSAgdm9pZCBGaWxsRm9yd2FyZERlY2xhcmF0aW9ucyhGb3J3YXJkRGVjbGFyYXRpb25zKiBkZWNscyk7Ci0KLSAgLy8gR2VuZXJhdGVzIHRvcCBvciBib3R0b20gb2YgYSBoZWFkZXIgZmlsZS4KLSAgdm9pZCBHZW5lcmF0ZVRvcEhlYWRlckd1YXJkKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZV9pZGVudGlmaWVyKTsKLSAgdm9pZCBHZW5lcmF0ZUJvdHRvbUhlYWRlckd1YXJkKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZV9pZGVudGlmaWVyKTsKLQotICAvLyBHZW5lcmF0ZXMgI2luY2x1ZGUgZGlyZWN0aXZlcy4KLSAgdm9pZCBHZW5lcmF0ZUxpYnJhcnlJbmNsdWRlcyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVEZXBlbmRlbmN5SW5jbHVkZXMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIGEgcHJhZ21hIHRvIHB1bGwgaW4gbWV0YWRhdGEgdXNpbmcgdGhlIGdpdmVuIGluZm9fcGF0aCAoaWYKLSAgLy8gbm9uLWVtcHR5KS4gaW5mb19wYXRoIHNob3VsZCBiZSByZWxhdGl2ZSB0byBwcmludGVyJ3Mgb3V0cHV0LgotICB2b2lkIEdlbmVyYXRlTWV0YWRhdGFQcmFnbWEoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IHN0cmluZyYgaW5mb19wYXRoKTsKLQotICAvLyBHZW5lcmF0ZXMgYSBjb3VwbGUgb2YgZGlmZmVyZW50IHBpZWNlcyBiZWZvcmUgZGVmaW5pdGlvbnM6Ci0gIHZvaWQgR2VuZXJhdGVHbG9iYWxTdGF0ZUZ1bmN0aW9uRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZXMgdHlwZXMgZm9yIGNsYXNzZXMuCi0gIHZvaWQgR2VuZXJhdGVNZXNzYWdlRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlcyBmb3J3YXJkLWRlY2xhcmF0aW9ucyBmb3IganVzdCB0aGlzIGZpbGUncyBjbGFzc2VzLiBUaGlzIGlzCi0gIC8vIHVzZWQgZm9yIC5wYi5oIGhlYWRlcnMsIGJ1dCBub3QgaW4gcHJvdG9faCBtb2RlLgotICB2b2lkIEdlbmVyYXRlTWVzc2FnZUZvcndhcmREZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEZpbGxzIGluIHR5cGVzIGZvciBmb3J3YXJkIGRlY2xhcmF0aW9ucy4gVGhpcyBpcyB1c2VkIGludGVybmFsbHksIGFuZAotICAvLyBhbHNvIGJ5IG90aGVyIEZpbGVHZW5lcmF0b3JzIHRvIGRldGVybWluZSBpbXBvcnRzJyBkZWNsYXJhdGlvbnMuCi0gIHZvaWQgRmlsbE1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKEZvcndhcmREZWNsYXJhdGlvbnMqIGRlY2xzKTsKLSAgdm9pZCBGaWxsTWVzc2FnZURlZmluaXRpb25zKEZvcndhcmREZWNsYXJhdGlvbnMqIGRlY2xzKTsKLQotICAvLyBHZW5lcmF0ZXMgZW51bSBkZWZpbml0aW9ucy4KLSAgdm9pZCBHZW5lcmF0ZUVudW1Gb3J3YXJkRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBGaWxsRW51bUZvcndhcmREZWNsYXJhdGlvbnMoRm9yd2FyZERlY2xhcmF0aW9ucyogZGVjbHMpOwotICB2b2lkIEdlbmVyYXRlRW51bURlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZXMgZ2VuZXJpYyBzZXJ2aWNlIGRlZmluaXRpb25zLgotICB2b2lkIEdlbmVyYXRlU2VydmljZURlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZXMgZXh0ZW5zaW9uIGlkZW50aWZpZXJzLgotICB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uSWRlbnRpZmllcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlcyBpbmxpbmUgZnVuY3Rpb24gZGVmaW50aW9ucy4KLSAgdm9pZCBHZW5lcmF0ZUlubGluZUZ1bmN0aW9uRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIHZvaWQgR2VuZXJhdGVQcm90bzJOYW1lc3BhY2VFbnVtU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87Ci0gIGNvbnN0IE9wdGlvbnMgb3B0aW9uc187Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZUdlbmVyYXRvcj4gPiBtZXNzYWdlX2dlbmVyYXRvcnNfOwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxFbnVtR2VuZXJhdG9yPiA+IGVudW1fZ2VuZXJhdG9yc187Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPFNlcnZpY2VHZW5lcmF0b3I+ID4gc2VydmljZV9nZW5lcmF0b3JzXzsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RXh0ZW5zaW9uR2VuZXJhdG9yPiA+IGV4dGVuc2lvbl9nZW5lcmF0b3JzXzsKLQotICAvLyBFLmcuIGlmIHRoZSBwYWNrYWdlIGlzIGZvby5iYXIsIHBhY2thZ2VfcGFydHNfIGlzIHsiZm9vIiwgImJhciJ9LgotICB2ZWN0b3I8c3RyaW5nPiBwYWNrYWdlX3BhcnRzXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZUdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklMRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWQxODljLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNjggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHV0aWxpdHk+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGNwcCB7Ci0KLUNwcEdlbmVyYXRvcjo6Q3BwR2VuZXJhdG9yKCkge30KLUNwcEdlbmVyYXRvcjo6fkNwcEdlbmVyYXRvcigpIHt9Ci0KLWJvb2wgQ3BwR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7Ci0gIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+IG9wdGlvbnM7Ci0gIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKHBhcmFtZXRlciwgJm9wdGlvbnMpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIHBhcnNlIGdlbmVyYXRvciBvcHRpb25zCi0KLSAgLy8gVE9ETyhrZW50b24pOiAgSWYgd2UgZXZlciBoYXZlIG1vcmUgb3B0aW9ucywgd2UgbWF5IHdhbnQgdG8gY3JlYXRlIGEKLSAgLy8gICBjbGFzcyB0aGF0IGVuY2Fwc3VsYXRlcyB0aGVtIHdoaWNoIHdlIGNhbiBwYXNzIGRvd24gdG8gYWxsIHRoZQotICAvLyAgIGdlbmVyYXRvciBjbGFzc2VzLiAgQ3VycmVudGx5IHdlIHBhc3MgZGxsZXhwb3J0X2RlY2wgZG93biB0byBhbGwgb2YKLSAgLy8gICB0aGVtIHZpYSB0aGUgY29uc3RydWN0b3JzLCBidXQgd2UgZG9uJ3Qgd2FudCB0byBoYXZlIHRvIGFkZCBhbm90aGVyCi0gIC8vICAgY29uc3RydWN0b3IgcGFyYW1ldGVyIGZvciBldmVyeSBvcHRpb24uCi0KLSAgLy8gSWYgdGhlIGRsbGV4cG9ydF9kZWNsIG9wdGlvbiBpcyBwYXNzZWQgdG8gdGhlIGNvbXBpbGVyLCB3ZSBuZWVkIHRvIHdyaXRlCi0gIC8vIGl0IGluIGZyb250IG9mIGV2ZXJ5IHN5bWJvbCB0aGF0IHNob3VsZCBiZSBleHBvcnRlZCBpZiB0aGlzIC5wcm90byBpcwotICAvLyBjb21waWxlZCBpbnRvIGEgV2luZG93cyBETEwuICBFLmcuLCBpZiB0aGUgdXNlciBpbnZva2VzIHRoZSBwcm90b2NvbAotICAvLyBjb21waWxlciBhczoKLSAgLy8gICBwcm90b2MgLS1jcHBfb3V0PWRsbGV4cG9ydF9kZWNsPUZPT19FWFBPUlQ6b3V0ZGlyIGZvby5wcm90bwotICAvLyB0aGVuIHdlJ2xsIGRlZmluZSBjbGFzc2VzIGxpa2UgdGhpczoKLSAgLy8gICBjbGFzcyBGT09fRVhQT1JUIEZvbyB7Ci0gIC8vICAgICAuLi4KLSAgLy8gICB9Ci0gIC8vIEZPT19FWFBPUlQgaXMgYSBtYWNybyB3aGljaCBzaG91bGQgZXhwYW5kIHRvIF9fZGVjbHNwZWMoZGxsZXhwb3J0KSBvcgotICAvLyBfX2RlY2xzcGVjKGRsbGltcG9ydCkgZGVwZW5kaW5nIG9uIHdoYXQgaXMgYmVpbmcgY29tcGlsZWQuCi0gIC8vCi0gIE9wdGlvbnMgZmlsZV9vcHRpb25zOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5zaXplKCk7IGkrKykgewotICAgIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJkbGxleHBvcnRfZGVjbCIpIHsKLSAgICAgIGZpbGVfb3B0aW9ucy5kbGxleHBvcnRfZGVjbCA9IG9wdGlvbnNbaV0uc2Vjb25kOwotICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAic2FmZV9ib3VuZGFyeV9jaGVjayIpIHsKLSAgICAgIGZpbGVfb3B0aW9ucy5zYWZlX2JvdW5kYXJ5X2NoZWNrID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImFubm90YXRlX2hlYWRlcnMiKSB7Ci0gICAgICBmaWxlX29wdGlvbnMuYW5ub3RhdGVfaGVhZGVycyA9IHRydWU7Ci0gICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJhbm5vdGF0aW9uX3ByYWdtYV9uYW1lIikgewotICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRpb25fcHJhZ21hX25hbWUgPSBvcHRpb25zW2ldLnNlY29uZDsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImFubm90YXRpb25fZ3VhcmRfbmFtZSIpIHsKLSAgICAgIGZpbGVfb3B0aW9ucy5hbm5vdGF0aW9uX2d1YXJkX25hbWUgPSBvcHRpb25zW2ldLnNlY29uZDsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImxpdGUiKSB7Ci0gICAgICBmaWxlX29wdGlvbnMuZW5mb3JjZV9saXRlID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgKmVycm9yID0gIlVua25vd24gZ2VuZXJhdG9yIG9wdGlvbjogIiArIG9wdGlvbnNbaV0uZmlyc3Q7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gIHN0cmluZyBiYXNlbmFtZSA9IFN0cmlwUHJvdG8oZmlsZS0+bmFtZSgpKTsKLQotICBGaWxlR2VuZXJhdG9yIGZpbGVfZ2VuZXJhdG9yKGZpbGUsIGZpbGVfb3B0aW9ucyk7Ci0KLSAgLy8gR2VuZXJhdGUgaGVhZGVyKHMpLgotICBpZiAoZmlsZV9vcHRpb25zLnByb3RvX2gpIHsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihiYXNlbmFtZSArICIucHJvdG8uaCIpKTsKLSAgICBHZW5lcmF0ZWRDb2RlSW5mbyBhbm5vdGF0aW9uczsKLSAgICBpbzo6QW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBhbm5vdGF0aW9uX2NvbGxlY3RvcigKLSAgICAgICAgJmFubm90YXRpb25zKTsKLSAgICBzdHJpbmcgaW5mb19wYXRoID0gYmFzZW5hbWUgKyAiLnByb3RvLmgubWV0YSI7Ci0gICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJywgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmYW5ub3RhdGlvbl9jb2xsZWN0b3IKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMKTsKLSAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVByb3RvSGVhZGVyKAotICAgICAgICAmcHJpbnRlciwgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMgPyBpbmZvX3BhdGggOiAiIik7Ci0gICAgaWYgKGZpbGVfb3B0aW9ucy5hbm5vdGF0ZV9oZWFkZXJzKSB7Ci0gICAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gaW5mb19vdXRwdXQoCi0gICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oaW5mb19wYXRoKSk7Ci0gICAgICBhbm5vdGF0aW9ucy5TZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKGluZm9fb3V0cHV0LmdldCgpKTsKLSAgICB9Ci0gIH0KLQotICBiYXNlbmFtZS5hcHBlbmQoIi5wYiIpOwotICB7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKLSAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oYmFzZW5hbWUgKyAiLmgiKSk7Ci0gICAgR2VuZXJhdGVkQ29kZUluZm8gYW5ub3RhdGlvbnM7Ci0gICAgaW86OkFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gYW5ub3RhdGlvbl9jb2xsZWN0b3IoCi0gICAgICAgICZhbm5vdGF0aW9ucyk7Ci0gICAgc3RyaW5nIGluZm9fcGF0aCA9IGJhc2VuYW1lICsgIi5oLm1ldGEiOwotICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcsIGZpbGVfb3B0aW9ucy5hbm5vdGF0ZV9oZWFkZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmFubm90YXRpb25fY29sbGVjdG9yCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogTlVMTCk7Ci0gICAgZmlsZV9nZW5lcmF0b3IuR2VuZXJhdGVQQkhlYWRlcigKLSAgICAgICAgJnByaW50ZXIsIGZpbGVfb3B0aW9ucy5hbm5vdGF0ZV9oZWFkZXJzID8gaW5mb19wYXRoIDogIiIpOwotICAgIGlmIChmaWxlX29wdGlvbnMuYW5ub3RhdGVfaGVhZGVycykgewotICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IGluZm9fb3V0cHV0KAotICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGluZm9fcGF0aCkpOwotICAgICAgYW5ub3RhdGlvbnMuU2VyaWFsaXplVG9aZXJvQ29weVN0cmVhbShpbmZvX291dHB1dC5nZXQoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gR2VuZXJhdGUgY2MgZmlsZS4KLSAgewotICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCi0gICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGJhc2VuYW1lICsgIi5jYyIpKTsKLSAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKLSAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVNvdXJjZSgmcHJpbnRlcik7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2Q1MTdjZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gR2VuZXJhdGVzIEMrKyBjb2RlIGZvciBhIGdpdmVuIC5wcm90byBmaWxlLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfR0VORVJBVE9SX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0dFTkVSQVRPUl9IX18KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi0vLyBDb2RlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIHdoaWNoIGdlbmVyYXRlcyBhIEMrKyBzb3VyY2UgZmlsZSBhbmQKLS8vIGhlYWRlci4gIElmIHlvdSBjcmVhdGUgeW91ciBvd24gcHJvdG9jb2wgY29tcGlsZXIgYmluYXJ5IGFuZCB5b3Ugd2FudAotLy8gaXQgdG8gc3VwcG9ydCBDKysgb3V0cHV0LCB5b3UgY2FuIGRvIHNvIGJ5IHJlZ2lzdGVyaW5nIGFuIGluc3RhbmNlIG9mIHRoaXMKLS8vIENvZGVHZW5lcmF0b3Igd2l0aCB0aGUgQ29tbWFuZExpbmVJbnRlcmZhY2UgaW4geW91ciBtYWluKCkgZnVuY3Rpb24uCi1jbGFzcyBMSUJQUk9UT0NfRVhQT1JUIENwcEdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIENwcEdlbmVyYXRvcigpOwotICB+Q3BwR2VuZXJhdG9yKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBDb2RlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBnZW5lcmF0b3JfY29udGV4dCwKLSAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDcHBHZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0dFTkVSQVRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJhZDRkMzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3MDQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGNwcCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtBbnlNZXNzYWdlTmFtZVtdID0gIkFueSI7Ci1zdGF0aWMgY29uc3QgY2hhciBrQW55UHJvdG9GaWxlW10gPSAiZ29vZ2xlL3Byb3RvYnVmL2FueS5wcm90byI7Ci1zdGF0aWMgY29uc3QgY2hhciBrR29vZ2xlUHJvdG9idWZQcmVmaXhbXSA9ICJnb29nbGUvcHJvdG9idWYvIjsKLQotc3RyaW5nIERvdHNUb1VuZGVyc2NvcmVzKGNvbnN0IHN0cmluZyYgbmFtZSkgewotICByZXR1cm4gU3RyaW5nUmVwbGFjZShuYW1lLCAiLiIsICJfIiwgdHJ1ZSk7Ci19Ci0KLXN0cmluZyBEb3RzVG9Db2xvbnMoY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIHJldHVybiBTdHJpbmdSZXBsYWNlKG5hbWUsICIuIiwgIjo6IiwgdHJ1ZSk7Ci19Ci0KLWNvbnN0IGNoYXIqIGNvbnN0IGtLZXl3b3JkTGlzdFtdID0gewotICAiYWxpZ25hcyIsICJhbGlnbm9mIiwgImFuZCIsICJhbmRfZXEiLCAiYXNtIiwgImF1dG8iLCAiYml0YW5kIiwgImJpdG9yIiwKLSAgImJvb2wiLCAiYnJlYWsiLCAiY2FzZSIsICJjYXRjaCIsICJjaGFyIiwgImNsYXNzIiwgImNvbXBsIiwgImNvbnN0IiwKLSAgImNvbnN0ZXhwciIsICJjb25zdF9jYXN0IiwgImNvbnRpbnVlIiwgImRlY2x0eXBlIiwgImRlZmF1bHQiLCAiZGVsZXRlIiwgImRvIiwKLSAgImRvdWJsZSIsICJkeW5hbWljX2Nhc3QiLCAiZWxzZSIsICJlbnVtIiwgImV4cGxpY2l0IiwgImV4cG9ydCIsICJleHRlcm4iLAotICAiZmFsc2UiLCAiZmxvYXQiLCAiZm9yIiwgImZyaWVuZCIsICJnb3RvIiwgImlmIiwgImlubGluZSIsICJpbnQiLCAibG9uZyIsCi0gICJtdXRhYmxlIiwgIm5hbWVzcGFjZSIsICJuZXciLCAibm9leGNlcHQiLCAibm90IiwgIm5vdF9lcSIsICJOVUxMIiwKLSAgIm9wZXJhdG9yIiwgIm9yIiwgIm9yX2VxIiwgInByaXZhdGUiLCAicHJvdGVjdGVkIiwgInB1YmxpYyIsICJyZWdpc3RlciIsCi0gICJyZWludGVycHJldF9jYXN0IiwgInJldHVybiIsICJzaG9ydCIsICJzaWduZWQiLCAic2l6ZW9mIiwgInN0YXRpYyIsCi0gICJzdGF0aWNfYXNzZXJ0IiwgInN0YXRpY19jYXN0IiwgInN0cnVjdCIsICJzd2l0Y2giLCAidGVtcGxhdGUiLCAidGhpcyIsCi0gICJ0aHJlYWRfbG9jYWwiLCAidGhyb3ciLCAidHJ1ZSIsICJ0cnkiLCAidHlwZWRlZiIsICJ0eXBlaWQiLCAidHlwZW5hbWUiLAotICAidW5pb24iLCAidW5zaWduZWQiLCAidXNpbmciLCAidmlydHVhbCIsICJ2b2lkIiwgInZvbGF0aWxlIiwgIndjaGFyX3QiLAotICAid2hpbGUiLCAieG9yIiwgInhvcl9lcSIKLX07Ci0KLWhhc2hfc2V0PHN0cmluZz4gTWFrZUtleXdvcmRzTWFwKCkgewotICBoYXNoX3NldDxzdHJpbmc+IHJlc3VsdDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGtLZXl3b3JkTGlzdCk7IGkrKykgewotICAgIHJlc3VsdC5pbnNlcnQoa0tleXdvcmRMaXN0W2ldKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1oYXNoX3NldDxzdHJpbmc+IGtLZXl3b3JkcyA9IE1ha2VLZXl3b3Jkc01hcCgpOwotCi0vLyBSZXR1cm5zIHdoZXRoZXIgdGhlIHByb3ZpZGVkIGRlc2NyaXB0b3IgaGFzIGFuIGV4dGVuc2lvbi4gVGhpcyBpbmNsdWRlcyBpdHMKLS8vIG5lc3RlZCB0eXBlcy4KLWJvb2wgSGFzRXh0ZW5zaW9uKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgaWYgKGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgaWYgKEhhc0V4dGVuc2lvbihkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpKSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBzdHJpbmcmIGlucHV0LCBib29sIGNhcF9uZXh0X2xldHRlcikgewotICBzdHJpbmcgcmVzdWx0OwotICAvLyBOb3RlOiAgSSBkaXN0cnVzdCBjdHlwZS5oIGR1ZSB0byBsb2NhbGVzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCdhJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAneicpIHsKLSAgICAgIGlmIChjYXBfbmV4dF9sZXR0ZXIpIHsKLSAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldICsgKCdBJyAtICdhJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV07Ci0gICAgICB9Ci0gICAgICBjYXBfbmV4dF9sZXR0ZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKCdBJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAnWicpIHsKLSAgICAgIC8vIENhcGl0YWwgbGV0dGVycyBhcmUgbGVmdCBhcy1pcy4KLSAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKLSAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoJzAnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICc5JykgewotICAgICAgcmVzdWx0ICs9IGlucHV0W2ldOwotICAgICAgY2FwX25leHRfbGV0dGVyID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgY2FwX25leHRfbGV0dGVyID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXSA9Ci0gICIvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09XG4iOwotY29uc3QgY2hhciBrVGhpblNlcGFyYXRvcltdID0KLSAgIi8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiI7Ci0KLXN0cmluZyBDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpIHsKLQotICAvLyBGaW5kICJvdXRlciIsIHRoZSBkZXNjcmlwdG9yIG9mIHRoZSB0b3AtbGV2ZWwgbWVzc2FnZSBpbiB3aGljaAotICAvLyAiZGVzY3JpcHRvciIgaXMgZW1iZWRkZWQuCi0gIGNvbnN0IERlc2NyaXB0b3IqIG91dGVyID0gZGVzY3JpcHRvcjsKLSAgd2hpbGUgKG91dGVyLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSBvdXRlciA9IG91dGVyLT5jb250YWluaW5nX3R5cGUoKTsKLQotICBjb25zdCBzdHJpbmcmIG91dGVyX25hbWUgPSBvdXRlci0+ZnVsbF9uYW1lKCk7Ci0gIHN0cmluZyBpbm5lcl9uYW1lID0gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkuc3Vic3RyKG91dGVyX25hbWUuc2l6ZSgpKTsKLQotICBpZiAocXVhbGlmaWVkKSB7Ci0gICAgcmV0dXJuICI6OiIgKyBEb3RzVG9Db2xvbnMob3V0ZXJfbmFtZSkgKyBEb3RzVG9VbmRlcnNjb3Jlcyhpbm5lcl9uYW1lKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gb3V0ZXItPm5hbWUoKSArIERvdHNUb1VuZGVyc2NvcmVzKGlubmVyX25hbWUpOwotICB9Ci19Ci0KLXN0cmluZyBDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpIHsKLSAgaWYgKGVudW1fZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgewotICAgIGlmIChxdWFsaWZpZWQpIHsKLSAgICAgIHJldHVybiAiOjoiICsgRG90c1RvQ29sb25zKGVudW1fZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZW51bV9kZXNjcmlwdG9yLT5uYW1lKCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN0cmluZyByZXN1bHQgPSBDbGFzc05hbWUoZW51bV9kZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSwgcXVhbGlmaWVkKTsKLSAgICByZXN1bHQgKz0gJ18nOwotICAgIHJlc3VsdCArPSBlbnVtX2Rlc2NyaXB0b3ItPm5hbWUoKTsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLQotc3RyaW5nIERlcGVuZGVudEJhc2VDbGFzc1RlbXBsYXRlTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBDbGFzc05hbWUoZGVzY3JpcHRvciwgZmFsc2UpICsgIl9JbnRlcm5hbEJhc2UiOwotfQotCi1zdHJpbmcgU3VwZXJDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICByZXR1cm4gSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpLCBvcHRpb25zKQotICAgICAgICAgICAgID8gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSIKLSAgICAgICAgICAgICA6ICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlIjsKLX0KLQotc3RyaW5nIERlcGVuZGVudEJhc2VEb3duQ2FzdCgpIHsKLSAgcmV0dXJuICJyZWludGVycHJldF9jYXN0PFQqPih0aGlzKS0+IjsKLX0KLQotc3RyaW5nIERlcGVuZGVudEJhc2VDb25zdERvd25DYXN0KCkgewotICByZXR1cm4gInJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KHRoaXMpLT4iOwotfQotCi1zdHJpbmcgRmllbGROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IGZpZWxkLT5uYW1lKCk7Ci0gIExvd2VyU3RyaW5nKCZyZXN1bHQpOwotICBpZiAoa0tleXdvcmRzLmNvdW50KHJlc3VsdCkgPiAwKSB7Ci0gICAgcmVzdWx0LmFwcGVuZCgiXyIpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXN0cmluZyBFbnVtVmFsdWVOYW1lKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUpIHsKLSAgc3RyaW5nIHJlc3VsdCA9IGVudW1fdmFsdWUtPm5hbWUoKTsKLSAgaWYgKGtLZXl3b3Jkcy5jb3VudChyZXN1bHQpID4gMCkgewotICAgIHJlc3VsdC5hcHBlbmQoIl8iKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewotICBzdHJpbmcgZmllbGRfbmFtZSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSk7Ci0gIHN0cmluZyByZXN1bHQgPSAiayIgKyBmaWVsZF9uYW1lICsgIkZpZWxkTnVtYmVyIjsKLQotICBpZiAoIWZpZWxkLT5pc19leHRlbnNpb24oKSAmJgotICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoCi0gICAgICAgIGZpZWxkLT5jYW1lbGNhc2VfbmFtZSgpKSAhPSBmaWVsZCkgewotICAgIC8vIFRoaXMgZmllbGQncyBjYW1lbGNhc2UgbmFtZSBpcyBub3QgdW5pcXVlLiAgQXMgYSBoYWNrLCBhZGQgdGhlIGZpZWxkCi0gICAgLy8gbnVtYmVyIHRvIHRoZSBjb25zdGFudCBuYW1lLiAgVGhpcyBtYWtlcyB0aGUgY29uc3RhbnQgcmF0aGVyIHVzZWxlc3MsCi0gICAgLy8gYnV0IHdoYXQgY2FuIHdlIGRvPwotICAgIHJlc3VsdCArPSAiXyIgKyBTaW1wbGVJdG9hKGZpZWxkLT5udW1iZXIoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIElzRmllbGREZXBlbmRlbnQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBOVUxMICYmCi0gICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKGZpZWxkLT5pc19tYXAoKSkgewotICAgIGNvbnN0IERlc2NyaXB0b3IqIG1hcF9kZXNjcmlwdG9yID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwX2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgICAgaWYgKElzRmllbGREZXBlbmRlbnQobWFwX2Rlc2NyaXB0b3ItPmZpZWxkKGkpKSkgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBOVUxMKSB7Ci0gICAgLy8gT25lb2YgZmllbGRzIHdpbGwgYWx3YXlzIGJlIGRlcGVuZGVudC4KLSAgICAvLwotICAgIC8vIFRoaXMgaXMgYSB1bmlxdWUgY2FzZSBmb3IgZmllbGQgY29kZWdlbi4gRmllbGQgZ2VuZXJhdG9ycyBhcmUKLSAgICAvLyByZXNwb25zaWJsZSBmb3IgZ2VuZXJhdGluZyBhbGwgdGhlIGZpZWxkLXNwZWNpZmljIGFjY2Vzc29yCi0gICAgLy8gZnVuY3Rpb25zLCBleGNlcHQgZm9yIHRoZSBjbGVhcl8qKCkgZnVuY3Rpb247IGluc3RlYWQsIGZpZWxkCi0gICAgLy8gZ2VuZXJhdG9ycyBwcm9kdWNlIGlubGluZSBjbGVhcmluZyBjb2RlLgotICAgIC8vCi0gICAgLy8gRm9yIG5vbi1vbmVvZiBmaWVsZHMsIHRoZSBNZXNzYWdlIGNsYXNzIHVzZXMgdGhlIGlubGluZSBjbGVhcmluZwotICAgIC8vIGNvZGUgdG8gZGVmaW5lIHRoZSBmaWVsZCdzIGNsZWFyXyooKSBmdW5jdGlvbiwgYXMgd2VsbCBhcyBpbiB0aGUKLSAgICAvLyBkZXN0cnVjdG9yLiBGb3Igb25lb2YgZmllbGRzLCB0aGUgTWVzc2FnZSBjbGFzcyBnZW5lcmF0ZXMgYSBtdWNoCi0gICAgLy8gbW9yZSBjb21wbGljYXRlZCBjbGVhcl8qKCkgZnVuY3Rpb24sIHdoaWNoIGNsZWFycyBvbmx5IHRoZSBvbmVvZgotICAgIC8vIG1lbWJlciB0aGF0IGlzIHNldCwgaW4gYWRkaXRpb24gdG8gY2xlYXJpbmcgbWV0aG9kcyBmb3IgZWFjaCBvZiB0aGUKLSAgICAvLyBvbmVvZiBtZW1iZXJzIGluZGl2aWR1YWxseS4KLSAgICAvLwotICAgIC8vIFNpbmNlIG9uZW9mcyBkbyBub3QgaGF2ZSB0aGVpciBvd24gZ2VuZXJhdG9yIGNsYXNzLCB0aGUgTWVzc2FnZSBjb2RlCi0gICAgLy8gZ2VuZXJhdGlvbiBsb2dpYyB3b3VsZCBiZSBzaWduaWZpY2FudGx5IGNvbXBsaWNhdGVkIGluIG9yZGVyIHRvCi0gICAgLy8gc3BsaXQgZGVwZW5kZW50IGFuZCBub24tZGVwZW5kZW50IG1hbmlwdWxhdGlvbiBsb2dpYyBiYXNlZCBvbgotICAgIC8vIHdoZXRoZXIgdGhlIG9uZW9mIHRydWx5IG5lZWRzIHRvIGJlIGRlcGVuZGVudDsgc28sIGZvciBvbmVvZiBmaWVsZHMsCi0gICAgLy8gd2UganVzdCBhc3N1bWUgaXQgKGFuZCBpdHMgY29uc3RpdHVlbnRzKSBzaG91bGQgYmUgbWFuaXB1bGF0ZWQgYnkgYQotICAgIC8vIGRlcGVuZGVudCBiYXNlIGNsYXNzIGZ1bmN0aW9uLgotICAgIC8vCi0gICAgLy8gVGhpcyBpcyBsZXNzIHByZWNpc2UgdGhhbiBob3cgZGVwZW5kZW50IG1lc3NhZ2UtdHlwZWQgZmllbGRzIGFyZQotICAgIC8vIGhhbmRsZWQsIGJ1dCB0aGUgY29zdCBpcyBsaW1pdGVkIHRvIG9ubHkgdGhlIGdlbmVyYXRlZCBjb2RlIGZvciB0aGUKLSAgICAvLyBvbmVvZiBmaWVsZCwgd2hpY2ggc2VlbXMgbGlrZSBhbiBhY2NlcHRhYmxlIHRyYWRlb2ZmLgotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChmaWVsZC0+ZmlsZSgpID09IGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdHJpbmcgRGVwZW5kZW50VHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICByZXR1cm4gIkludGVybmFsQmFzZV8iICsgZmllbGQtPm5hbWUoKSArICJfVCI7Ci19Ci0KLXN0cmluZyBGaWVsZE1lc3NhZ2VUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIC8vIE5vdGU6ICBUaGUgR29vZ2xlLWludGVybmFsIHZlcnNpb24gb2YgUHJvdG9jb2wgQnVmZmVycyB1c2VzIHRoaXMgZnVuY3Rpb24KLSAgLy8gICBhcyBhIGhvb2sgcG9pbnQgZm9yIGhhY2tzIHRvIHN1cHBvcnQgbGVnYWN5IGNvZGUuCi0gIHJldHVybiBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCB0cnVlKTsKLX0KLQotc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICBpZiAoSGFzU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvZGV2ZWwiKSkgewotICAgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90b2RldmVsIik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFN0cmlwU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvIik7Ci0gIH0KLX0KLQotY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzIgIDogcmV0dXJuICI6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NCAgOiByZXR1cm4gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMiA6IHJldHVybiAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NCA6IHJldHVybiAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRSA6IHJldHVybiAiZG91YmxlIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVCAgOiByZXR1cm4gImZsb2F0IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MICAgOiByZXR1cm4gImJvb2wiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0gICA6IHJldHVybiAiaW50IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcgOiByZXR1cm4gIjo6c3RkOjpzdHJpbmciOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHJldHVybiBOVUxMOwotCi0gICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKLSAgICAvLyBDcHBUeXBlcyBhcmUgYWRkZWQuCi0gIH0KLQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIqIERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAiSW50MzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0ICAgOiByZXR1cm4gIkludDY0IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzIgIDogcmV0dXJuICJVSW50MzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NCAgOiByZXR1cm4gIlVJbnQ2NCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyICA6IHJldHVybiAiU0ludDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuICJTSW50NjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gIkZpeGVkMzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gIkZpeGVkNjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gIlNGaXhlZDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuICJTRml4ZWQ2NCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiAiRmxvYXQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRSAgOiByZXR1cm4gIkRvdWJsZSI7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuICJCb29sIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgIDogcmV0dXJuICJFbnVtIjsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gIlN0cmluZyI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgICA6IHJldHVybiAiQnl0ZXMiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gIkdyb3VwIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIDogcmV0dXJuICJNZXNzYWdlIjsKLQotICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3Ci0gICAgLy8gdHlwZXMgYXJlIGFkZGVkLgotICB9Ci0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICByZXR1cm4gIiI7Ci19Ci0KLXN0cmluZyBJbnQzMlRvU3RyaW5nKGludCBudW1iZXIpIHsKLSAgLy8gZ2NjIHJlamVjdHMgdGhlIGRlY2ltYWwgZm9ybSBvZiBraW50MzJtaW4uCi0gIGlmIChudW1iZXIgPT0ga2ludDMybWluKSB7Ci0gICAgR09PR0xFX0NPTVBJTEVfQVNTRVJUKGtpbnQzMm1pbiA9PSAofjB4N2ZmZmZmZmYpLCBraW50MzJtaW5fdmFsdWVfZXJyb3IpOwotICAgIHJldHVybiAiKH4weDdmZmZmZmZmKSI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFNpbXBsZUl0b2EobnVtYmVyKTsKLSAgfQotfQotCi1zdHJpbmcgSW50NjRUb1N0cmluZyhpbnQ2NCBudW1iZXIpIHsKLSAgLy8gZ2NjIHJlamVjdHMgdGhlIGRlY2ltYWwgZm9ybSBvZiBraW50NjRtaW4KLSAgaWYgKG51bWJlciA9PSBraW50NjRtaW4pIHsKLSAgICAvLyBNYWtlIHN1cmUgd2UgYXJlIGluIGEgMidzIGNvbXBsZW1lbnQgc3lzdGVtLgotICAgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChraW50NjRtaW4gPT0gR09PR0xFX0xPTkdMT05HKH4weDdmZmZmZmZmZmZmZmZmZmYpLAotICAgICAgICAgICAgICAgICAgIGtpbnQ2NG1pbl92YWx1ZV9lcnJvcik7Ci0gICAgcmV0dXJuICJHT09HTEVfTE9OR0xPTkcofjB4N2ZmZmZmZmZmZmZmZmZmZikiOwotICB9Ci0gIHJldHVybiAiR09PR0xFX0xPTkdMT05HKCIgKyBTaW1wbGVJdG9hKG51bWJlcikgKyAiKSI7Ci19Ci0KLXN0cmluZyBEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICByZXR1cm4gSW50MzJUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6Ci0gICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSkgKyAidSI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6Ci0gICAgICByZXR1cm4gSW50NjRUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICByZXR1cm4gIkdPT0dMRV9VTE9OR0xPTkcoIiArIFNpbXBsZUl0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDY0KCkpKyAiKSI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7Ci0gICAgICBkb3VibGUgdmFsdWUgPSBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKTsKLSAgICAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgICAgIHJldHVybiAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW5maW5pdHkoKSI7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgICAgIHJldHVybiAiLTo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkluZmluaXR5KCkiOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hTigpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBTaW1wbGVEdG9hKHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6Ci0gICAgICB7Ci0gICAgICAgIGZsb2F0IHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZmxvYXQoKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSkgewotICAgICAgICAgIHJldHVybiAic3RhdGljX2Nhc3Q8ZmxvYXQ+KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkluZmluaXR5KCkpIjsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7Ci0gICAgICAgICAgcmV0dXJuICJzdGF0aWNfY2FzdDxmbG9hdD4oLTo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkluZmluaXR5KCkpIjsKLSAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgewotICAgICAgICAgIHJldHVybiAic3RhdGljX2Nhc3Q8ZmxvYXQ+KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hTigpKSI7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc3RyaW5nIGZsb2F0X3ZhbHVlID0gU2ltcGxlRnRvYSh2YWx1ZSk7Ci0gICAgICAgICAgLy8gSWYgZmxvYXRpbmcgcG9pbnQgdmFsdWUgY29udGFpbnMgYSBwZXJpb2QgKC4pIG9yIGFuIGV4cG9uZW50Ci0gICAgICAgICAgLy8gKGVpdGhlciBFIG9yIGUpLCB0aGVuIGFwcGVuZCBzdWZmaXggJ2YnIHRvIG1ha2UgaXQgYSBmbG9hdAotICAgICAgICAgIC8vIGxpdGVyYWwuCi0gICAgICAgICAgaWYgKGZsb2F0X3ZhbHVlLmZpbmRfZmlyc3Rfb2YoIi5lRSIpICE9IHN0cmluZzo6bnBvcykgewotICAgICAgICAgICAgZmxvYXRfdmFsdWUucHVzaF9iYWNrKCdmJyk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiBmbG9hdF92YWx1ZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID8gInRydWUiIDogImZhbHNlIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgLy8gTGF6eTogIEdlbmVyYXRlIGEgc3RhdGljX2Nhc3QgYmVjYXVzZSB3ZSBkb24ndCBoYXZlIGEgaGVscGVyIGZ1bmN0aW9uCi0gICAgICAvLyAgIHRoYXQgY29uc3RydWN0cyB0aGUgZnVsbCBuYW1lIG9mIGFuIGVudW0gdmFsdWUuCi0gICAgICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICAgICAic3RhdGljX2Nhc3Q8ICQwID4oJDEpIiwKLSAgICAgICAgICBDbGFzc05hbWUoZmllbGQtPmVudW1fdHlwZSgpLCB0cnVlKSwKLSAgICAgICAgICBJbnQzMlRvU3RyaW5nKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlwiIiArIEVzY2FwZVRyaWdyYXBocygKLSAgICAgICAgQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpICsKLSAgICAgICAgIlwiIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuIEZpZWxkTWVzc2FnZVR5cGVOYW1lKGZpZWxkKSArICI6OmRlZmF1bHRfaW5zdGFuY2UoKSI7Ci0gIH0KLSAgLy8gQ2FuJ3QgYWN0dWFsbHkgZ2V0IGhlcmU7IG1ha2UgY29tcGlsZXIgaGFwcHkuICAoV2UgY291bGQgYWRkIGEgZGVmYXVsdAotICAvLyBjYXNlIGFib3ZlIGJ1dCB0aGVuIHdlIHdvdWxkbid0IGdldCB0aGUgbmljZSBjb21waWxlciB3YXJuaW5nIHdoZW4gYQotICAvLyBuZXcgdHlwZSBpcyBhZGRlZC4pCi0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICByZXR1cm4gIiI7Ci19Ci0KLS8vIENvbnZlcnQgYSBmaWxlIG5hbWUgaW50byBhIHZhbGlkIGlkZW50aWZpZXIuCi1zdHJpbmcgRmlsZW5hbWVJZGVudGlmaWVyKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlbmFtZS5zaXplKCk7IGkrKykgewotICAgIGlmIChhc2NpaV9pc2FsbnVtKGZpbGVuYW1lW2ldKSkgewotICAgICAgcmVzdWx0LnB1c2hfYmFjayhmaWxlbmFtZVtpXSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vdCBhbHBoYW51bWVyaWMuICBUbyBhdm9pZCBhbnkgcG9zc2liaWxpdHkgb2YgbmFtZSBjb25mbGljdHMgd2UKLSAgICAgIC8vIHVzZSB0aGUgaGV4IGNvZGUgZm9yIHRoZSBjaGFyYWN0ZXIuCi0gICAgICBTdHJBcHBlbmQoJnJlc3VsdCwgIl8iLCBzdHJpbmdzOjpIZXgoc3RhdGljX2Nhc3Q8dWludDg+KGZpbGVuYW1lW2ldKSkpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIEFkZERlc2NyaXB0b3JzKCkgZnVuY3Rpb24gZm9yIGEgZ2l2ZW4gZmlsZS4KLXN0cmluZyBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICByZXR1cm4gInByb3RvYnVmX0FkZERlc2NfIiArIEZpbGVuYW1lSWRlbnRpZmllcihmaWxlbmFtZSk7Ci19Ci0KLS8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgQXNzaWduRGVzY3JpcHRvcnMoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgotc3RyaW5nIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIHJldHVybiAicHJvdG9idWZfQXNzaWduRGVzY18iICsgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVuYW1lKTsKLX0KLQotLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBTaHV0ZG93bkZpbGUoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgotc3RyaW5nIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICByZXR1cm4gInByb3RvYnVmX1NodXRkb3duRmlsZV8iICsgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVuYW1lKTsKLX0KLQotLy8gUmV0dXJuIHRoZSBxdWFsaWZpZWQgQysrIG5hbWUgZm9yIGEgZmlsZSBsZXZlbCBzeW1ib2wuCi1zdHJpbmcgUXVhbGlmaWVkRmlsZUxldmVsU3ltYm9sKGNvbnN0IHN0cmluZyYgcGFja2FnZSwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIGlmIChwYWNrYWdlLmVtcHR5KCkpIHsKLSAgICByZXR1cm4gU3RyQ2F0KCI6OiIsIG5hbWUpOwotICB9Ci0gIHJldHVybiBTdHJDYXQoIjo6IiwgRG90c1RvQ29sb25zKHBhY2thZ2UpLCAiOjoiLCBuYW1lKTsKLX0KLQotLy8gRXNjYXBlIEMrKyB0cmlncmFwaHMgYnkgZXNjYXBpbmcgcXVlc3Rpb24gbWFya3MgdG8gXD8KLXN0cmluZyBFc2NhcGVUcmlncmFwaHMoY29uc3Qgc3RyaW5nJiB0b19lc2NhcGUpIHsKLSAgcmV0dXJuIFN0cmluZ1JlcGxhY2UodG9fZXNjYXBlLCAiPyIsICJcXD8iLCB0cnVlKTsKLX0KLQotLy8gRXNjYXBlZCBmdW5jdGlvbiBuYW1lIHRvIGVsaW1pbmF0ZSBuYW1pbmcgY29uZmxpY3QuCi1zdHJpbmcgU2FmZUZ1bmN0aW9uTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJlZml4KSB7Ci0gIC8vIERvIG5vdCB1c2UgRmllbGROYW1lKCkgc2luY2UgaXQgd2lsbCBlc2NhcGUga2V5d29yZHMuCi0gIHN0cmluZyBuYW1lID0gZmllbGQtPm5hbWUoKTsKLSAgTG93ZXJTdHJpbmcoJm5hbWUpOwotICBzdHJpbmcgZnVuY3Rpb25fbmFtZSA9IHByZWZpeCArIG5hbWU7Ci0gIGlmIChkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZnVuY3Rpb25fbmFtZSkpIHsKLSAgICAvLyBTaW5nbGUgdW5kZXJzY29yZSB3aWxsIGFsc28gbWFrZSBpdCBjb25mbGljdGluZyB3aXRoIHRoZSBwcml2YXRlIGRhdGEKLSAgICAvLyBtZW1iZXIuIFdlIHVzZSBkb3VibGUgdW5kZXJzY29yZSB0byBlc2NhcGUgZnVuY3Rpb24gbmFtZXMuCi0gICAgZnVuY3Rpb25fbmFtZS5hcHBlbmQoIl9fIik7Ci0gIH0gZWxzZSBpZiAoa0tleXdvcmRzLmNvdW50KG5hbWUpID4gMCkgewotICAgIC8vIElmIHRoZSBmaWVsZCBuYW1lIGlzIGEga2V5d29yZCwgd2UgYXBwZW5kIHRoZSB1bmRlcnNjb3JlIGJhY2sgdG8ga2VlcCBpdAotICAgIC8vIGNvbnNpc3RlbnQgd2l0aCBvdGhlciBmdW5jdGlvbiBuYW1lcy4KLSAgICBmdW5jdGlvbl9uYW1lLmFwcGVuZCgiXyIpOwotICB9Ci0gIHJldHVybiBmdW5jdGlvbl9uYW1lOwotfQotCi1ib29sIFN0YXRpY0luaXRpYWxpemVyc0ZvcmNlZChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGUsIG9wdGlvbnMpIHx8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpID4gMCkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgewotICAgIGlmIChIYXNFeHRlbnNpb24oZmlsZS0+bWVzc2FnZV90eXBlKGkpKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGlvOjpQcmludGVyKiBwcmludGVyLAotICAgIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQsCi0gICAgY29uc3QgY2hhciogdmFyMSwgY29uc3Qgc3RyaW5nJiB2YWwxLCBjb25zdCBjaGFyKiB2YXIyLAotICAgIGNvbnN0IHN0cmluZyYgdmFsMikgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIGlmICh2YXIxKSB7Ci0gICAgdmFyc1t2YXIxXSA9IHZhbDE7Ci0gIH0KLSAgaWYgKHZhcjIpIHsKLSAgICB2YXJzW3ZhcjJdID0gdmFsMjsKLSAgfQotICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICB2YXJzLCBmaWxlLCBvcHRpb25zLCBwcmludGVyLCB3aXRoX3N0YXRpY19pbml0LCB3aXRob3V0X3N0YXRpY19pbml0KTsKLX0KLQotdm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogd2l0aF9zdGF0aWNfaW5pdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQpIHsKLSAgaWYgKFN0YXRpY0luaXRpYWxpemVyc0ZvcmNlZChmaWxlLCBvcHRpb25zKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsIHdpdGhfc3RhdGljX2luaXQpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsIChzdHJpbmcoCi0gICAgICAiI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVJcbiIpICsKLSAgICAgIHdpdGhvdXRfc3RhdGljX2luaXQgKwotICAgICAgIiNlbHNlXG4iICsKLSAgICAgIHdpdGhfc3RhdGljX2luaXQgKwotICAgICAgIiNlbmRpZlxuIikuY19zdHIoKSk7Ci0gIH0KLX0KLQotCi1zdGF0aWMgYm9vbCBIYXNNYXBGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7ICsraSkgewotICAgIGlmIChkZXNjcmlwdG9yLT5maWVsZChpKS0+aXNfbWFwKCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgewotICAgIGlmIChIYXNNYXBGaWVsZHMoZGVzY3JpcHRvci0+bmVzdGVkX3R5cGUoaSkpKSByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSGFzTWFwRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgewotICAgIGlmIChIYXNNYXBGaWVsZHMoZmlsZS0+bWVzc2FnZV90eXBlKGkpKSkgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBIYXNFbnVtRGVmaW5pdGlvbnMoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlKSB7Ci0gIGlmIChtZXNzYWdlX3R5cGUtPmVudW1fdHlwZV9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV90eXBlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBpZiAoSGFzRW51bURlZmluaXRpb25zKG1lc3NhZ2VfdHlwZS0+bmVzdGVkX3R5cGUoaSkpKSByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgSGFzRW51bURlZmluaXRpb25zKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIGlmIChmaWxlLT5lbnVtX3R5cGVfY291bnQoKSA+IDApIHJldHVybiB0cnVlOwotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBpZiAoSGFzRW51bURlZmluaXRpb25zKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSkpIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBJc1N0cmluZ09yTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLUZpZWxkT3B0aW9uczo6Q1R5cGUgRWZmZWN0aXZlU3RyaW5nQ1R5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBHT09HTEVfRENIRUNLKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpOwotICAvLyBPcGVuLXNvdXJjZSBwcm90b2J1ZiByZWxlYXNlIG9ubHkgc3VwcG9ydHMgU1RSSU5HIGN0eXBlLgotICByZXR1cm4gRmllbGRPcHRpb25zOjpTVFJJTkc7Ci0KLX0KLQotYm9vbCBJc0FueU1lc3NhZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3ItPm5hbWUoKSA9PSBrQW55UHJvdG9GaWxlOwotfQotCi1ib29sIElzQW55TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yLT5uYW1lKCkgPT0ga0FueU1lc3NhZ2VOYW1lICYmCi0gICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCktPm5hbWUoKSA9PSBrQW55UHJvdG9GaWxlOwotfQotCi1ib29sIElzV2VsbEtub3duTWVzc2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gIWRlc2NyaXB0b3ItPm5hbWUoKS5jb21wYXJlKDAsIDE2LCBrR29vZ2xlUHJvdG9idWZQcmVmaXgpOwotfQotCi1lbnVtIFV0ZjhDaGVja01vZGUgewotICBTVFJJQ1QgPSAwLCAgLy8gUGFyc2luZyB3aWxsIGZhaWwgaWYgbm9uIFVURi04IGRhdGEgaXMgaW4gc3RyaW5nIGZpZWxkcy4KLSAgVkVSSUZZID0gMSwgIC8vIE9ubHkgbG9nIGFuIGVycm9yIGJ1dCBwYXJzaW5nIHdpbGwgc3VjY2VlZC4KLSAgTk9ORSA9IDIsICAvLyBObyBVVEYtOCBjaGVjay4KLX07Ci0KLS8vIFdoaWNoIGxldmVsIG9mIFVURi04IGVuZm9yY2VtYW50IGlzIHBsYWNlZCBvbiB0aGlzIGZpbGUuCi1zdGF0aWMgVXRmOENoZWNrTW9kZSBHZXRVdGY4Q2hlY2tNb2RlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgaWYgKGZpZWxkLT5maWxlKCktPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zKSB7Ci0gICAgcmV0dXJuIFNUUklDVDsKLSAgfSBlbHNlIGlmIChHZXRPcHRpbWl6ZUZvcihmaWVsZC0+ZmlsZSgpLCBvcHRpb25zKSAhPQotICAgICAgICAgICAgIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUUpIHsKLSAgICByZXR1cm4gVkVSSUZZOwotICB9IGVsc2UgewotICAgIHJldHVybiBOT05FOwotICB9Ci19Ci0KLXN0YXRpYyB2b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgZm9yX3BhcnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHN0cmljdF9mdW5jdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2ZXJpZnlfZnVuY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgc3dpdGNoIChHZXRVdGY4Q2hlY2tNb2RlKGZpZWxkLCBvcHRpb25zKSkgewotICAgIGNhc2UgU1RSSUNUOiB7Ci0gICAgICBpZiAoZm9yX3BhcnNlKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCJET18oIik7Ci0gICAgICB9Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRmdW5jdGlvbiQoXG4iLAotICAgICAgICAgICJmdW5jdGlvbiIsIHN0cmljdF9mdW5jdGlvbik7Ci0gICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywgcGFyYW1ldGVycyk7Ci0gICAgICBpZiAoZm9yX3BhcnNlKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsXG4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLFxuIik7Ci0gICAgICB9Ci0gICAgICBwcmludGVyLT5QcmludCgiXCIkZnVsbF9uYW1lJFwiKSIsICJmdWxsX25hbWUiLCBmaWVsZC0+ZnVsbF9uYW1lKCkpOwotICAgICAgaWYgKGZvcl9wYXJzZSkgewotICAgICAgICBwcmludGVyLT5QcmludCgiKSIpOwotICAgICAgfQotICAgICAgcHJpbnRlci0+UHJpbnQoIjtcbiIpOwotICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgVkVSSUZZOiB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6JGZ1bmN0aW9uJChcbiIsCi0gICAgICAgICAgImZ1bmN0aW9uIiwgdmVyaWZ5X2Z1bmN0aW9uKTsKLSAgICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLCBwYXJhbWV0ZXJzKTsKLSAgICAgIGlmIChmb3JfcGFyc2UpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLFxuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGVyLT5QcmludCgiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLFxuIik7Ci0gICAgICB9Ci0gICAgICBwcmludGVyLT5QcmludCgiXCIkZnVsbF9uYW1lJFwiKTtcbiIsICJmdWxsX25hbWUiLCBmaWVsZC0+ZnVsbF9uYW1lKCkpOwotICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgTk9ORToKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9wYXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBHZW5lcmF0ZVV0ZjhDaGVja0NvZGUoZmllbGQsIG9wdGlvbnMsIGZvcl9wYXJzZSwgdmFyaWFibGVzLCBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgIlZlcmlmeVV0ZjhTdHJpbmciLCAiVmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQiLAotICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcik7Ci19Ci0KLXZvaWQgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yQ29yZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgZm9yX3BhcnNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIEdlbmVyYXRlVXRmOENoZWNrQ29kZShmaWVsZCwgb3B0aW9ucywgZm9yX3BhcnNlLCB2YXJpYWJsZXMsIHBhcmFtZXRlcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAiVmVyaWZ5VXRmOENvcmQiLCAiVmVyaWZ5VVRGOENvcmROYW1lZEZpZWxkIiwgcHJpbnRlcik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDE4YWNmYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oCisrKyAvZGV2L251bGwKQEAgLTEsMzA2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0hFTFBFUlNfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfSEVMUEVSU19IX18KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1uYW1lc3BhY2UgaW8gewotY2xhc3MgUHJpbnRlcjsKLX0KLQotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi0vLyBDb21tb25seS11c2VkIHNlcGFyYXRvciBjb21tZW50cy4gIFRoaWNrIGlzIGEgbGluZSBvZiAnPScsIHRoaW4gaXMgYSBsaW5lCi0vLyBvZiAnLScuCi1leHRlcm4gY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXTsKLWV4dGVybiBjb25zdCBjaGFyIGtUaGluU2VwYXJhdG9yW107Ci0KLS8vIFJldHVybnMgdGhlIG5vbi1uZXN0ZWQgdHlwZSBuYW1lIGZvciB0aGUgZ2l2ZW4gdHlwZS4gIElmICJxdWFsaWZpZWQiIGlzCi0vLyB0cnVlLCBwcmVmaXggdGhlIHR5cGUgd2l0aCB0aGUgZnVsbCBuYW1lc3BhY2UuICBGb3IgZXhhbXBsZSwgaWYgeW91IGhhZDoKLS8vICAgcGFja2FnZSBmb28uYmFyOwotLy8gICBtZXNzYWdlIEJheiB7IG1lc3NhZ2UgUXV4IHt9IH0KLS8vIFRoZW4gdGhlIHF1YWxpZmllZCBDbGFzc05hbWUgZm9yIFF1eCB3b3VsZCBiZToKLS8vICAgOjpmb286OmJhcjo6QmF6X1F1eAotLy8gV2hpbGUgdGhlIG5vbi1xdWFsaWZpZWQgdmVyc2lvbiB3b3VsZCBiZToKLS8vICAgQmF6X1F1eAotc3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIHF1YWxpZmllZCk7Ci1zdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2NyaXB0b3IsIGJvb2wgcXVhbGlmaWVkKTsKLQotLy8gTmFtZSBvZiB0aGUgQ1JUUCBjbGFzcyB0ZW1wbGF0ZSAoZm9yIHVzZSB3aXRoIHByb3RvX2gpLgotLy8gVGhpcyBpcyBhIGNsYXNzIG5hbWUsIGxpa2UgIlByb3RvTmFtZV9JbnRlcm5hbEJhc2UiLgotc3RyaW5nIERlcGVuZGVudEJhc2VDbGFzc1RlbXBsYXRlTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLQotLy8gTmFtZSBvZiB0aGUgYmFzZSBjbGFzczogZWl0aGVyIHRoZSBkZXBlbmRlbnQgYmFzZSBjbGFzcyAoZm9yIHVzZSB3aXRoCi0vLyBwcm90b19oKSBvciBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlLgotc3RyaW5nIFN1cGVyQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotCi0vLyBSZXR1cm5zIGEgc3RyaW5nIHRoYXQgZG93bi1jYXN0cyBmcm9tIHRoZSBkZXBlbmRlbnQgYmFzZSBjbGFzcyB0byB0aGUKLS8vIGRlcml2ZWQgY2xhc3MuCi1zdHJpbmcgRGVwZW5kZW50QmFzZURvd25DYXN0KCk7Ci1zdHJpbmcgRGVwZW5kZW50QmFzZUNvbnN0RG93bkNhc3QoKTsKLQotLy8gR2V0IHRoZSAodW5xdWFsaWZpZWQpIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgdGhpcyBmaWVsZCBpbiBDKysgY29kZS4KLS8vIFRoZSBuYW1lIGlzIGNvZXJjZWQgdG8gbG93ZXItY2FzZSB0byBlbXVsYXRlIHByb3RvMSBiZWhhdmlvci4gIFBlb3BsZQotLy8gc2hvdWxkIGJlIHVzaW5nIGxvd2VyY2FzZS13aXRoLXVuZGVyc2NvcmVzIHN0eWxlIGZvciBwcm90byBmaWVsZCBuYW1lcwotLy8gYW55d2F5LCBzbyBub3JtYWxseSB0aGlzIGp1c3QgcmV0dXJucyBmaWVsZC0+bmFtZSgpLgotc3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKLQotLy8gR2V0IHRoZSBzYW5pdGl6ZWQgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGUgZ2l2ZW4gZW51bSBpbiBDKysgY29kZS4KLXN0cmluZyBFbnVtVmFsdWVOYW1lKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUpOwotCi0vLyBHZXQgdGhlIHVucXVhbGlmaWVkIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSBmaWVsZCdzIGZpZWxkCi0vLyBudW1iZXIgY29uc3RhbnQuCi1zdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0KLS8vIFJldHVybnMgdGhlIHNjb3BlIHdoZXJlIHRoZSBmaWVsZCB3YXMgZGVmaW5lZCAoZm9yIGV4dGVuc2lvbnMsIHRoaXMgaXMKLS8vIGRpZmZlcmVudCBmcm9tIHRoZSBtZXNzYWdlIHR5cGUgdG8gd2hpY2ggdGhlIGZpZWxkIGFwcGxpZXMpLgotaW5saW5lIGNvbnN0IERlc2NyaXB0b3IqIEZpZWxkU2NvcGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICByZXR1cm4gZmllbGQtPmlzX2V4dGVuc2lvbigpID8KLSAgICBmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCkgOiBmaWVsZC0+Y29udGFpbmluZ190eXBlKCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ2ZpZWxkX2Rlc2NyaXB0b3InIGhhcyBhIG1lc3NhZ2UgdHlwZSB0aGF0IGlzCi0vLyBhIGRlcGVuZGVuY3kgb2YgdGhlIGZpbGUgd2hlcmUgdGhlIGZpZWxkIGlzIGRlZmluZWQgKGkuZS4sIHRoZSBmaWVsZAotLy8gdHlwZSBpcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IGZpbGUgdGhhbiB0aGUgbWVzc2FnZSBob2xkaW5nIHRoZSBmaWVsZCkuCi0vLwotLy8gVGhpcyBvbmx5IGFwcGxpZXMgdG8gTWVzc2FnZS10eXBlZCBmaWVsZHMuIEVudW0tdHlwZWQgZmllbGRzIG1heSByZWZlcgotLy8gdG8gYW4gZW51bSBpbiBhIGRlcGVuZGVuY3k7IGhvd2V2ZXIsIGVudW1zIGFyZSBzcGVjaWZpZWQgYW5kCi0vLyBmb3J3YXJkLWRlY2xhcmVkIHdpdGggYW4gZW51bS1iYXNlLCBzbyB0aGUgZGVmaW5pdGlvbiBpcyBub3QgcmVxdWlyZWQgdG8KLS8vIG1hbmlwdWxhdGUgdGhlIGZpZWxkIHZhbHVlLgotYm9vbCBJc0ZpZWxkRGVwZW5kZW50KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcik7Ci0KLS8vIFJldHVybnMgdGhlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZm9yY2luZyBkZXBlbmRlbnQgbG9va3VwIGZyb20gYQotLy8gZGVwZW5kZW50IGJhc2UgY2xhc3MuCi1zdHJpbmcgRGVwZW5kZW50VHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Ci0KLS8vIFJldHVybnMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLiAgVXN1YWxseSB0aGlzCi0vLyBpcyBqdXN0IENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksIHRydWUpOwotc3RyaW5nIEZpZWxkTWVzc2FnZVR5cGVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotCi0vLyBTdHJpcHMgIi5wcm90byIgb3IgIi5wcm90b2RldmVsIiBmcm9tIHRoZSBlbmQgb2YgYSBmaWxlbmFtZS4KLUxJQlBST1RPQ19FWFBPUlQgc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7Ci0KLS8vIEdldCB0aGUgQysrIHR5cGUgbmFtZSBmb3IgYSBwcmltaXRpdmUgdHlwZSAoZS5nLiAiZG91YmxlIiwgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIiLCBldGMuKS4KLS8vIE5vdGU6ICBub24tYnVpbHQtaW4gdHlwZSBuYW1lcyB3aWxsIGJlIHF1YWxpZmllZCwgbWVhbmluZyB0aGV5IHdpbGwgc3RhcnQKLS8vIHdpdGggYSA6Oi4gIElmIHlvdSBhcmUgdXNpbmcgdGhlIHR5cGUgYXMgYSB0ZW1wbGF0ZSBwYXJhbWV0ZXIsIHlvdSB3aWxsCi0vLyBuZWVkIHRvIGluc3VyZSB0aGVyZSBpcyBhIHNwYWNlIGJldHdlZW4gdGhlIDwgYW5kIHRoZSA6OiwgYmVjYXVzZSB0aGUKLS8vIHJpZGljdWxvdXMgQysrIHN0YW5kYXJkIGRlZmluZXMgIjw6IiB0byBiZSBhIHN5bm9ueW0gZm9yICJbIi4KLWNvbnN0IGNoYXIqIFByaW1pdGl2ZVR5cGVOYW1lKEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSB0eXBlKTsKLQotLy8gR2V0IHRoZSBkZWNsYXJlZCB0eXBlIG5hbWUgaW4gQ2FtZWxDYXNlIGZvcm1hdCwgYXMgaXMgdXNlZCBlLmcuIGZvciB0aGUKLS8vIG1ldGhvZHMgb2YgV2lyZUZvcm1hdC4gIEZvciBleGFtcGxlLCBUWVBFX0lOVDMyIGJlY29tZXMgIkludDMyIi4KLWNvbnN0IGNoYXIqIERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpOwotCi0vLyBSZXR1cm4gdGhlIGNvZGUgdGhhdCBldmFsdWF0ZXMgdG8gdGhlIG51bWJlciB3aGVuIGNvbXBpbGVkLgotc3RyaW5nIEludDMyVG9TdHJpbmcoaW50IG51bWJlcik7Ci0KLS8vIFJldHVybiB0aGUgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgbnVtYmVyIHdoZW4gY29tcGlsZWQuCi1zdHJpbmcgSW50NjRUb1N0cmluZyhpbnQ2NCBudW1iZXIpOwotCi0vLyBHZXQgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgZmllbGQncyBkZWZhdWx0IHZhbHVlLgotc3RyaW5nIERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKLQotLy8gQ29udmVydCBhIGZpbGUgbmFtZSBpbnRvIGEgdmFsaWQgaWRlbnRpZmllci4KLXN0cmluZyBGaWxlbmFtZUlkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7Ci0KLS8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgQWRkRGVzY3JpcHRvcnMoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgotc3RyaW5nIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKLQotLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBBc3NpZ25EZXNjcmlwdG9ycygpIGZ1bmN0aW9uIGZvciBhIGdpdmVuIGZpbGUuCi1zdHJpbmcgR2xvYmFsQXNzaWduRGVzY3JpcHRvcnNOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOwotCi0vLyBSZXR1cm4gdGhlIHF1YWxpZmllZCBDKysgbmFtZSBmb3IgYSBmaWxlIGxldmVsIHN5bWJvbC4KLXN0cmluZyBRdWFsaWZpZWRGaWxlTGV2ZWxTeW1ib2woY29uc3Qgc3RyaW5nJiBwYWNrYWdlLCBjb25zdCBzdHJpbmcmIG5hbWUpOwotCi0vLyBSZXR1cm4gdGhlIG5hbWUgb2YgdGhlIFNodXRkb3duRmlsZSgpIGZ1bmN0aW9uIGZvciBhIGdpdmVuIGZpbGUuCi1zdHJpbmcgR2xvYmFsU2h1dGRvd25GaWxlTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKLQotLy8gRXNjYXBlIEMrKyB0cmlncmFwaHMgYnkgZXNjYXBpbmcgcXVlc3Rpb24gbWFya3MgdG8gXD8KLXN0cmluZyBFc2NhcGVUcmlncmFwaHMoY29uc3Qgc3RyaW5nJiB0b19lc2NhcGUpOwotCi0vLyBFc2NhcGVkIGZ1bmN0aW9uIG5hbWUgdG8gZWxpbWluYXRlIG5hbWluZyBjb25mbGljdC4KLXN0cmluZyBTYWZlRnVuY3Rpb25OYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgpOwotCi0vLyBSZXR1cm5zIHRydWUgaWYgdW5rbm93biBmaWVsZHMgYXJlIHByZXNldmVkIGFmdGVyIHBhcnNpbmcuCi1pbmxpbmUgYm9vbCBQcmVzZXJ2ZVVua25vd25GaWVsZHMoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSkgewotICByZXR1cm4gbWVzc2FnZS0+ZmlsZSgpLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKLX0KLQotLy8gUmV0dXJucyB0aGUgb3B0aW1pemUgbW9kZSBmb3IgPGZpbGU+LCByZXNwZWN0aW5nIDxvcHRpb25zLmVuZm9yY2VfbGl0ZT4uCi06Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBHZXRPcHRpbWl6ZUZvcigKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0KLS8vIElmIFByZXNlcnZlVW5rbm93bkZpZWxkcygpIGlzIHRydWUsIGRldGVybWluZXMgd2hldGhlciB1bmtub3duCi0vLyBmaWVsZHMgd2lsbCBiZSBzdG9yZWQgaW4gYW4gVW5rbm93bkZpZWxkU2V0IG9yIGEgc3RyaW5nLgotLy8gSWYgUHJlc2VydmVVbmtub3duRmllbGRzKCkgaXMgZmFsc2UsIHRoaXMgbWV0aG9kIHdpbGwgbm90IGJlCi0vLyB1c2VkLgotaW5saW5lIGJvb2wgVXNlVW5rbm93bkZpZWxkU2V0KGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgcmV0dXJuIEdldE9wdGltaXplRm9yKGZpbGUsIG9wdGlvbnMpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Ci19Ci0KLQotLy8gRG9lcyB0aGUgZmlsZSBoYXZlIGFueSBtYXAgZmllbGRzLCBuZWNlc3NpdGF0aW5nIHRoZSBmaWxlIHRvIGluY2x1ZGUKLS8vIG1hcF9maWVsZF9pbmwuaCBhbmQgbWFwLmguCi1ib29sIEhhc01hcEZpZWxkcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7Ci0KLS8vIERvZXMgdGhpcyBmaWxlIGhhdmUgYW55IGVudW0gdHlwZSBkZWZpbml0aW9ucz8KLWJvb2wgSGFzRW51bURlZmluaXRpb25zKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKLQotLy8gRG9lcyB0aGlzIGZpbGUgaGF2ZSBnZW5lcmF0ZWQgcGFyc2luZywgc2VyaWFsaXphdGlvbiwgYW5kIG90aGVyCi0vLyBzdGFuZGFyZCBtZXRob2RzIGZvciB3aGljaCByZWZsZWN0aW9uLWJhc2VkIGZhbGxiYWNrIGltcGxlbWVudGF0aW9ucyBleGlzdD8KLWlubGluZSBib29sIEhhc0dlbmVyYXRlZE1ldGhvZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgcmV0dXJuIEdldE9wdGltaXplRm9yKGZpbGUsIG9wdGlvbnMpICE9IEZpbGVPcHRpb25zOjpDT0RFX1NJWkU7Ci19Ci0KLS8vIERvIG1lc3NhZ2UgY2xhc3NlcyBpbiB0aGlzIGZpbGUgaGF2ZSBkZXNjcmlwdG9yIGFuZCByZWZsZWN0aW9uIG1ldGhvZHM/Ci1pbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgcmV0dXJuIEdldE9wdGltaXplRm9yKGZpbGUsIG9wdGlvbnMpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Ci19Ci0KLS8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBnZW5lcmljIHNlcnZpY2VzIGZvciB0aGlzIGZpbGU/Ci1pbmxpbmUgYm9vbCBIYXNHZW5lcmljU2VydmljZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICByZXR1cm4gZmlsZS0+c2VydmljZV9jb3VudCgpID4gMCAmJgotICAgICAgICAgR2V0T3B0aW1pemVGb3IoZmlsZSwgb3B0aW9ucykgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgotICAgICAgICAgZmlsZS0+b3B0aW9ucygpLmNjX2dlbmVyaWNfc2VydmljZXMoKTsKLX0KLQotLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGEgc2VwYXJhdGUsIHN1cGVyLW9wdGltaXplZCBjb2RlIHBhdGggZm9yIHNlcmlhbGl6aW5nIHRvCi0vLyBmbGF0IGFycmF5cz8gIFdlIGRvbid0IGRvIHRoaXMgaW4gTGl0ZSBtb2RlIGJlY2F1c2Ugd2UnZCByYXRoZXIgcmVkdWNlIGNvZGUKLS8vIHNpemUuCi1pbmxpbmUgYm9vbCBIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIHJldHVybiBHZXRPcHRpbWl6ZUZvcihmaWxlLCBvcHRpb25zKSA9PSBGaWxlT3B0aW9uczo6U1BFRUQ7Ci19Ci0KLS8vIFJldHVybnMgd2hldGhlciB3ZSBoYXZlIHRvIGdlbmVyYXRlIGNvZGUgd2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotYm9vbCBTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLQotLy8gUHJpbnRzICd3aXRoX3N0YXRpY19pbml0JyBpZiBzdGF0aWMgaW5pdGlhbGl6ZXJzIGhhdmUgdG8gYmUgdXNlZCBmb3IgdGhlCi0vLyBwcm92aWRlZCBmaWxlLiBPdGhlcndpc2UgZW1pdHMgYm90aCAnd2l0aF9zdGF0aWNfaW5pdCcgYW5kCi0vLyAnd2l0aG91dF9zdGF0aWNfaW5pdCcgdXNpbmcgI2lmZGVmLgotdm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGlvOjpQcmludGVyKiBwcmludGVyLAotICAgIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQsCi0gICAgY29uc3QgY2hhciogdmFyMSA9IE5VTEwsIGNvbnN0IHN0cmluZyYgdmFsMSA9ICIiLCBjb25zdCBjaGFyKiB2YXIyID0gTlVMTCwKLSAgICBjb25zdCBzdHJpbmcmIHZhbDIgPSAiIik7Ci0KLXZvaWQgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB3aXRob3V0X3N0YXRpY19pbml0KTsKLQotCi1pbmxpbmUgYm9vbCBJc01hcEVudHJ5TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yLT5vcHRpb25zKCkubWFwX2VudHJ5KCk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQncyBDUFBUWVBFIGlzIHN0cmluZyBvciBtZXNzYWdlLgotYm9vbCBJc1N0cmluZ09yTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKLQotLy8gRm9yIGEgc3RyaW5nIGZpZWxkLCByZXR1cm5zIHRoZSBlZmZlY3RpdmUgY3R5cGUuICBJZiB0aGUgYWN0dWFsIGN0eXBlIGlzCi0vLyBub3Qgc3VwcG9ydGVkLCByZXR1cm5zIHRoZSBkZWZhdWx0IG9mIFNUUklORy4KLUZpZWxkT3B0aW9uczo6Q1R5cGUgRWZmZWN0aXZlU3RyaW5nQ1R5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Ci0KLXN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgY2FwX25leHRfbGV0dGVyKTsKLQotaW5saW5lIGJvb2wgSGFzRmllbGRQcmVzZW5jZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgewotICByZXR1cm4gZmlsZS0+c3ludGF4KCkgIT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiAnZW51bScgc2VtYW50aWNzIGFyZSBzdWNoIHRoYXQgdW5rbm93biB2YWx1ZXMgYXJlIHByZXNlcnZlZAotLy8gaW4gdGhlIGVudW0gZmllbGQgaXRzZWxmLCByYXRoZXIgdGhhbiBnb2luZyB0byB0aGUgVW5rbm93bkZpZWxkU2V0LgotaW5saW5lIGJvb2wgSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIHJldHVybiBmaWxlLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKLX0KLQotaW5saW5lIGJvb2wgU3VwcG9ydHNBcmVuYXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKLSAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5jY19lbmFibGVfYXJlbmFzKCk7Ci19Ci0KLWlubGluZSBib29sIFN1cHBvcnRzQXJlbmFzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIHsKLSAgcmV0dXJuIFN1cHBvcnRzQXJlbmFzKGRlc2MtPmZpbGUoKSk7Ci19Ci0KLWlubGluZSBib29sIFN1cHBvcnRzQXJlbmFzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgcmV0dXJuIFN1cHBvcnRzQXJlbmFzKGZpZWxkLT5maWxlKCkpOwotfQotCi1ib29sIElzQW55TWVzc2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci1ib29sIElzQW55TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLQotYm9vbCBJc1dlbGxLbm93bk1lc3NhZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi12b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgYm9vbCBmb3JfcGFyc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi12b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvckNvcmQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9wYXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFyYW1ldGVycywgaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgR2V0T3B0aW1pemVGb3IoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgcmV0dXJuIG9wdGlvbnMuZW5mb3JjZV9saXRlCi0gICAgICA/IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUUKLSAgICAgIDogZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfSEVMUEVSU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmOGUzYjcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNzk4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKLXVzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKLQotbmFtZXNwYWNlIHsKLQotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIFByaW50RmllbGRDb21tZW50KGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBUKiBmaWVsZCkgewotICAvLyBQcmludCB0aGUgZmllbGQncyAob3Igb25lb2YncykgcHJvdG8tc3ludGF4IGRlZmluaXRpb24gYXMgYSBjb21tZW50LgotICAvLyBXZSBkb24ndCB3YW50IHRvIHByaW50IGdyb3VwIGJvZGllcyBzbyB3ZSBjdXQgb2ZmIGFmdGVyIHRoZSBmaXJzdAotICAvLyBsaW5lLgotICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsKLSAgb3B0aW9ucy5lbGlkZV9ncm91cF9ib2R5ID0gdHJ1ZTsKLSAgb3B0aW9ucy5lbGlkZV9vbmVvZl9ib2R5ID0gdHJ1ZTsKLSAgc3RyaW5nIGRlZiA9IGZpZWxkLT5EZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOwotICBwcmludGVyLT5QcmludCgiLy8gJGRlZiRcbiIsCi0gICAgImRlZiIsIGRlZi5zdWJzdHIoMCwgZGVmLmZpbmRfZmlyc3Rfb2YoJ1xuJykpKTsKLX0KLQotc3RydWN0IEZpZWxkT3JkZXJpbmdCeU51bWJlciB7Ci0gIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYikgY29uc3QgewotICAgIHJldHVybiBhLT5udW1iZXIoKSA8IGItPm51bWJlcigpOwotICB9Ci19OwotCi0vLyBTb3J0IHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIERlc2NyaXB0b3IgYnkgbnVtYmVyIGludG8gYSBuZXdbXSdkIGFycmF5Ci0vLyBhbmQgcmV0dXJuIGl0LgotY29uc3QgRmllbGREZXNjcmlwdG9yKiogU29ydEZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzID0KLSAgICBuZXcgY29uc3QgRmllbGREZXNjcmlwdG9yKltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKLSAgfQotICBzdGQ6OnNvcnQoZmllbGRzLCBmaWVsZHMgKyBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLAotICAgICAgICAgICAgRmllbGRPcmRlcmluZ0J5TnVtYmVyKCkpOwotICByZXR1cm4gZmllbGRzOwotfQotCi0vLyBGdW5jdG9yIGZvciBzb3J0aW5nIGV4dGVuc2lvbiByYW5nZXMgYnkgdGhlaXIgInN0YXJ0IiBmaWVsZCBudW1iZXIuCi1zdHJ1Y3QgRXh0ZW5zaW9uUmFuZ2VTb3J0ZXIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGxlZnQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmlnaHQpIGNvbnN0IHsKLSAgICByZXR1cm4gbGVmdC0+c3RhcnQgPCByaWdodC0+c3RhcnQ7Ci0gIH0KLX07Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgInJlcXVpcmVkIiByZXN0cmljdGlvbiBjaGVjayBzaG91bGQgYmUgaWdub3JlZCBmb3IgdGhlCi0vLyBnaXZlbiBmaWVsZC4KLWlubGluZSBzdGF0aWMgYm9vbCBTaG91bGRJZ25vcmVSZXF1aXJlZEZpZWxkQ2hlY2soY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSB0eXBlIGhhcyBhbnkgcmVxdWlyZWQgZmllbGRzLiAgSWYgaXQgZG9lc24ndCwKLS8vIHdlIGNhbiBvcHRpbWl6ZSBvdXQgY2FsbHMgdG8gaXRzIElzSW5pdGlhbGl6ZWQoKSBtZXRob2QuCi0vLwotLy8gYWxyZWFkeV9zZWVuIGlzIHVzZWQgdG8gYXZvaWQgY2hlY2tpbmcgdGhlIHNhbWUgdHlwZSBtdWx0aXBsZSB0aW1lcwotLy8gKGFuZCBhbHNvIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpb24pLgotc3RhdGljIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiogYWxyZWFkeV9zZWVuKSB7Ci0gIGlmIChhbHJlYWR5X3NlZW4tPmNvdW50KHR5cGUpID4gMCkgewotICAgIC8vIFNpbmNlIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mIGEgcmVxdWlyZWQgZmllbGQgY2F1c2VzIHRoZSB3aG9sZQotICAgIC8vIGZ1bmN0aW9uIHRvIHJldHVybiB0cnVlLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaWYgdGhlIHR5cGUgaXMgYWxyZWFkeQotICAgIC8vIGluIHRoZSBjYWNoZSBpdCBkaWRuJ3QgaGF2ZSBhbnkgcmVxdWlyZWQgZmllbGRzLgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBhbHJlYWR5X3NlZW4tPmluc2VydCh0eXBlKTsKLQotICAvLyBJZiB0aGUgdHlwZSBoYXMgZXh0ZW5zaW9ucywgYW4gZXh0ZW5zaW9uIHdpdGggbWVzc2FnZSB0eXBlIGNvdWxkIGNvbnRhaW4KLSAgLy8gcmVxdWlyZWQgZmllbGRzLCBzbyB3ZSBoYXZlIHRvIGJlIGNvbnNlcnZhdGl2ZSBhbmQgYXNzdW1lIHN1Y2ggYW4KLSAgLy8gZXh0ZW5zaW9uIGV4aXN0cy4KLSAgaWYgKHR5cGUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gdHlwZS0+ZmllbGQoaSk7Ci0gICAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCi0gICAgICAgICFTaG91bGRJZ25vcmVSZXF1aXJlZEZpZWxkQ2hlY2soZmllbGQsIG9wdGlvbnMpKSB7Ci0gICAgICBpZiAoSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBvcHRpb25zLCBhbHJlYWR5X3NlZW4pKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RhdGljIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoY29uc3QgRGVzY3JpcHRvciogdHlwZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewotICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4gYWxyZWFkeV9zZWVuOwotICByZXR1cm4gSGFzUmVxdWlyZWRGaWVsZHModHlwZSwgb3B0aW9ucywgJmFscmVhZHlfc2Vlbik7Ci19Ci0KLS8vIFRoaXMgcmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgY29tcGlsZXIncyBhbGlnbm1lbnQgZm9yIHRoZSBmaWVsZC4gIFRoaXMKLS8vIGNhbid0IGd1YXJhbnRlZSB0byBiZSBjb3JyZWN0IGJlY2F1c2UgdGhlIGdlbmVyYXRlZCBjb2RlIGNvdWxkIGJlIGNvbXBpbGVkIG9uCi0vLyBkaWZmZXJlbnQgc3lzdGVtcyB3aXRoIGRpZmZlcmVudCBhbGlnbm1lbnQgcnVsZXMuICBUaGUgZXN0aW1hdGVzIGJlbG93IGFzc3VtZQotLy8gNjQtYml0IHBvaW50ZXJzLgotaW50IEVzdGltYXRlQWxpZ25tZW50U2l6ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZCA9PSBOVUxMKSByZXR1cm4gMDsKLSAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSByZXR1cm4gODsKLSAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gMTsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgotICAgICAgcmV0dXJuIDQ7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuIDg7Ci0gIH0KLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gIHJldHVybiAtMTsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCi19Ci0KLS8vIEZpZWxkR3JvdXAgaXMganVzdCBhIGhlbHBlciBmb3IgT3B0aW1pemVQYWRkaW5nIGJlbG93LiAgSXQgaG9sZHMgYSB2ZWN0b3Igb2YKLS8vIGZpZWxkcyB0aGF0IGFyZSBncm91cGVkIHRvZ2V0aGVyIGJlY2F1c2UgdGhleSBoYXZlIGNvbXBhdGlibGUgYWxpZ25tZW50LCBhbmQKLS8vIGEgcHJlZmVycmVkIGxvY2F0aW9uIGluIHRoZSBmaW5hbCBmaWVsZCBvcmRlcmluZy4KLWNsYXNzIEZpZWxkR3JvdXAgewotIHB1YmxpYzoKLSAgRmllbGRHcm91cCgpCi0gICAgICA6IHByZWZlcnJlZF9sb2NhdGlvbl8oMCkge30KLQotICAvLyBBIGdyb3VwIHdpdGggYSBzaW5nbGUgZmllbGQuCi0gIEZpZWxkR3JvdXAoZmxvYXQgcHJlZmVycmVkX2xvY2F0aW9uLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKQotICAgICAgOiBwcmVmZXJyZWRfbG9jYXRpb25fKHByZWZlcnJlZF9sb2NhdGlvbiksCi0gICAgICAgIGZpZWxkc18oMSwgZmllbGQpIHt9Ci0KLSAgLy8gQXBwZW5kIHRoZSBmaWVsZHMgaW4gJ290aGVyJyB0byB0aGlzIGdyb3VwLgotICB2b2lkIEFwcGVuZChjb25zdCBGaWVsZEdyb3VwJiBvdGhlcikgewotICAgIGlmIChvdGhlci5maWVsZHNfLmVtcHR5KCkpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgLy8gUHJlZmVycmVkIGxvY2F0aW9uIGlzIHRoZSBhdmVyYWdlIGFtb25nIGFsbCB0aGUgZmllbGRzLCBzbyB3ZSB3ZWlnaHQgYnkKLSAgICAvLyB0aGUgbnVtYmVyIG9mIGZpZWxkcyBvbiBlYWNoIEZpZWxkR3JvdXAgb2JqZWN0LgotICAgIHByZWZlcnJlZF9sb2NhdGlvbl8gPQotICAgICAgICAocHJlZmVycmVkX2xvY2F0aW9uXyAqIGZpZWxkc18uc2l6ZSgpICsKLSAgICAgICAgIChvdGhlci5wcmVmZXJyZWRfbG9jYXRpb25fICogb3RoZXIuZmllbGRzXy5zaXplKCkpKSAvCi0gICAgICAgIChmaWVsZHNfLnNpemUoKSArIG90aGVyLmZpZWxkc18uc2l6ZSgpKTsKLSAgICBmaWVsZHNfLmluc2VydChmaWVsZHNfLmVuZCgpLCBvdGhlci5maWVsZHNfLmJlZ2luKCksIG90aGVyLmZpZWxkc18uZW5kKCkpOwotICB9Ci0KLSAgdm9pZCBTZXRQcmVmZXJyZWRMb2NhdGlvbihmbG9hdCBsb2NhdGlvbikgeyBwcmVmZXJyZWRfbG9jYXRpb25fID0gbG9jYXRpb247IH0KLSAgY29uc3QgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+JiBmaWVsZHMoKSBjb25zdCB7IHJldHVybiBmaWVsZHNfOyB9Ci0KLSAgLy8gRmllbGRHcm91cCBvYmplY3RzIHNvcnQgYnkgdGhlaXIgcHJlZmVycmVkIGxvY2F0aW9uLgotICBib29sIG9wZXJhdG9yPChjb25zdCBGaWVsZEdyb3VwJiBvdGhlcikgY29uc3QgewotICAgIHJldHVybiBwcmVmZXJyZWRfbG9jYXRpb25fIDwgb3RoZXIucHJlZmVycmVkX2xvY2F0aW9uXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgLy8gInByZWZlcnJlZF9sb2NhdGlvbl8iIGlzIGFuIGVzdGltYXRlIG9mIHdoZXJlIHRoaXMgZ3JvdXAgc2hvdWxkIGdvIGluIHRoZQotICAvLyBmaW5hbCBsaXN0IG9mIGZpZWxkcy4gIFdlIGNvbXB1dGUgdGhpcyBieSB0YWtpbmcgdGhlIGF2ZXJhZ2UgaW5kZXggb2YgZWFjaAotICAvLyBmaWVsZCBpbiB0aGlzIGdyb3VwIGluIHRoZSBvcmlnaW5hbCBvcmRlcmluZyBvZiBmaWVsZHMuICBUaGlzIGlzIHZlcnkKLSAgLy8gYXBwcm94aW1hdGUsIGJ1dCBzaG91bGQgcHV0IHRoaXMgZ3JvdXAgY2xvc2UgdG8gd2hlcmUgaXRzIG1lbWJlciBmaWVsZHMKLSAgLy8gb3JpZ2luYWxseSB3ZW50LgotICBmbG9hdCBwcmVmZXJyZWRfbG9jYXRpb25fOwotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzXzsKLSAgLy8gV2UgcmVseSBvbiB0aGUgZGVmYXVsdCBjb3B5IGNvbnN0cnVjdG9yIGFuZCBvcGVyYXRvcj0gc28gdGhpcyB0eXBlIGNhbiBiZQotICAvLyB1c2VkIGluIGEgdmVjdG9yLgotfTsKLQotLy8gUmVvcmRlciAnZmllbGRzJyBzbyB0aGF0IGlmIHRoZSBmaWVsZHMgYXJlIG91dHB1dCBpbnRvIGEgYysrIGNsYXNzIGluIHRoZSBuZXcKLS8vIG9yZGVyLCB0aGUgYWxpZ25tZW50IHBhZGRpbmcgaXMgbWluaW1pemVkLiAgV2UgdHJ5IHRvIGRvIHRoaXMgd2hpbGUga2VlcGluZwotLy8gZWFjaCBmaWVsZCBhcyBjbG9zZSBhcyBwb3NzaWJsZSB0byBpdHMgb3JpZ2luYWwgcG9zaXRpb24gc28gdGhhdCB3ZSBkb24ndAotLy8gcmVkdWNlIGNhY2hlIGxvY2FsaXR5IG11Y2ggZm9yIGZ1bmN0aW9uIHRoYXQgYWNjZXNzIGVhY2ggZmllbGQgaW4gb3JkZXIuCi12b2lkIE9wdGltaXplUGFkZGluZyh2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIGZpZWxkcykgewotICAvLyBGaXJzdCBkaXZpZGUgZmllbGRzIGludG8gdGhvc2UgdGhhdCBhbGlnbiB0byAxIGJ5dGUsIDQgYnl0ZXMgb3IgOCBieXRlcy4KLSAgdmVjdG9yPEZpZWxkR3JvdXA+IGFsaWduZWRfdG9fMSwgYWxpZ25lZF90b180LCBhbGlnbmVkX3RvXzg7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLT5zaXplKCk7ICsraSkgewotICAgIHN3aXRjaCAoRXN0aW1hdGVBbGlnbm1lbnRTaXplKCgqZmllbGRzKVtpXSkpIHsKLSAgICAgIGNhc2UgMTogYWxpZ25lZF90b18xLnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKLSAgICAgIGNhc2UgNDogYWxpZ25lZF90b180LnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKLSAgICAgIGNhc2UgODogYWxpZ25lZF90b184LnB1c2hfYmFjayhGaWVsZEdyb3VwKGksICgqZmllbGRzKVtpXSkpOyBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmtub3duIGFsaWdubWVudCBzaXplLiI7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm93IGdyb3VwIGZpZWxkcyBhbGlnbmVkIHRvIDEgYnl0ZSBpbnRvIHNldHMgb2YgNCwgYW5kIHRyZWF0IHRob3NlIGxpa2UgYQotICAvLyBzaW5nbGUgZmllbGQgYWxpZ25lZCB0byA0IGJ5dGVzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWduZWRfdG9fMS5zaXplKCk7IGkgKz0gNCkgewotICAgIEZpZWxkR3JvdXAgZmllbGRfZ3JvdXA7Ci0gICAgZm9yIChpbnQgaiA9IGk7IGogPCBhbGlnbmVkX3RvXzEuc2l6ZSgpICYmIGogPCBpICsgNDsgKytqKSB7Ci0gICAgICBmaWVsZF9ncm91cC5BcHBlbmQoYWxpZ25lZF90b18xW2pdKTsKLSAgICB9Ci0gICAgYWxpZ25lZF90b180LnB1c2hfYmFjayhmaWVsZF9ncm91cCk7Ci0gIH0KLSAgLy8gU29ydCBieSBwcmVmZXJyZWQgbG9jYXRpb24gdG8ga2VlcCBmaWVsZHMgYXMgY2xvc2UgdG8gdGhlaXIgb3JpZ2luYWwKLSAgLy8gbG9jYXRpb24gYXMgcG9zc2libGUuICBVc2luZyBzdGFibGVfc29ydCBlbnN1cmVzIHRoYXQgdGhlIG91dHB1dCBpcwotICAvLyBjb25zaXN0ZW50IGFjcm9zcyBydW5zLgotICBzdGQ6OnN0YWJsZV9zb3J0KGFsaWduZWRfdG9fNC5iZWdpbigpLCBhbGlnbmVkX3RvXzQuZW5kKCkpOwotCi0gIC8vIE5vdyBncm91cCBmaWVsZHMgYWxpZ25lZCB0byA0IGJ5dGVzIChvciB0aGUgNC1maWVsZCBncm91cHMgY3JlYXRlZCBhYm92ZSkKLSAgLy8gaW50byBwYWlycywgYW5kIHRyZWF0IHRob3NlIGxpa2UgYSBzaW5nbGUgZmllbGQgYWxpZ25lZCB0byA4IGJ5dGVzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWduZWRfdG9fNC5zaXplKCk7IGkgKz0gMikgewotICAgIEZpZWxkR3JvdXAgZmllbGRfZ3JvdXA7Ci0gICAgZm9yIChpbnQgaiA9IGk7IGogPCBhbGlnbmVkX3RvXzQuc2l6ZSgpICYmIGogPCBpICsgMjsgKytqKSB7Ci0gICAgICBmaWVsZF9ncm91cC5BcHBlbmQoYWxpZ25lZF90b180W2pdKTsKLSAgICB9Ci0gICAgaWYgKGkgPT0gYWxpZ25lZF90b180LnNpemUoKSAtIDEpIHsKLSAgICAgIC8vIE1vdmUgaW5jb21wbGV0ZSA0LWJ5dGUgYmxvY2sgdG8gdGhlIGVuZC4KLSAgICAgIGZpZWxkX2dyb3VwLlNldFByZWZlcnJlZExvY2F0aW9uKGZpZWxkcy0+c2l6ZSgpICsgMSk7Ci0gICAgfQotICAgIGFsaWduZWRfdG9fOC5wdXNoX2JhY2soZmllbGRfZ3JvdXApOwotICB9Ci0gIC8vIFNvcnQgYnkgcHJlZmVycmVkIGxvY2F0aW9uLgotICBzdGQ6OnN0YWJsZV9zb3J0KGFsaWduZWRfdG9fOC5iZWdpbigpLCBhbGlnbmVkX3RvXzguZW5kKCkpOwotCi0gIC8vIE5vdyBwdWxsIG91dCBhbGwgdGhlIEZpZWxkRGVzY3JpcHRvcnMgaW4gb3JkZXIuCi0gIGZpZWxkcy0+Y2xlYXIoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGlnbmVkX3RvXzguc2l6ZSgpOyArK2kpIHsKLSAgICBmaWVsZHMtPmluc2VydChmaWVsZHMtPmVuZCgpLAotICAgICAgICAgICAgICAgICAgIGFsaWduZWRfdG9fOFtpXS5maWVsZHMoKS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgIGFsaWduZWRfdG9fOFtpXS5maWVsZHMoKS5lbmQoKSk7Ci0gIH0KLX0KLQotc3RyaW5nIE1lc3NhZ2VUeXBlUHJvdG9OYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgcmV0dXJuIGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCk7Ci19Ci0KLS8vIEVtaXRzIGFuIGlmLXN0YXRlbWVudCB3aXRoIGEgY29uZGl0aW9uIHRoYXQgZXZhbHVhdGVzIHRvIHRydWUgaWYgfGZpZWxkfCBpcwotLy8gY29uc2lkZXJlZCBub24tZGVmYXVsdCAod2lsbCBiZSBzZW50IG92ZXIgdGhlIHdpcmUpLCBmb3IgbWVzc2FnZSB0eXBlcwotLy8gd2l0aG91dCB0cnVlIGZpZWxkIHByZXNlbmNlLiBTaG91bGQgb25seSBiZSBjYWxsZWQgaWYKLS8vICFIYXNGaWVsZFByZXNlbmNlKG1lc3NhZ2VfZGVzY3JpcHRvcikuCi1ib29sIEVtaXRGaWVsZE5vbkRlZmF1bHRDb25kaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICAvLyBNZXJnZSBhbmQgc2VyaWFsaXplIHNlbWFudGljczogcHJpbWl0aXZlIGZpZWxkcyBhcmUgbWVyZ2VkL3NlcmlhbGl6ZWQgb25seQotICAvLyBpZiBub24temVybyAobnVtZXJpYykgb3Igbm9uLWVtcHR5IChzdHJpbmcpLgotICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmICFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJpZiAoJHByZWZpeCQkbmFtZSQoKS5zaXplKCkgPiAwKSB7XG4iLAotICAgICAgICAgICJwcmVmaXgiLCBwcmVmaXgsCi0gICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICAvLyBNZXNzYWdlIGZpZWxkcyBzdGlsbCBoYXZlIGhhc18kbmFtZSQoKSBtZXRob2RzLgotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmICgkcHJlZml4JGhhc18kbmFtZSQoKSkge1xuIiwKLSAgICAgICAgICAicHJlZml4IiwgcHJlZml4LAotICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJpZiAoJHByZWZpeCQkbmFtZSQoKSAhPSAwKSB7XG4iLAotICAgICAgICAgICJwcmVmaXgiLCBwcmVmaXgsCi0gICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwKLSAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIERvZXMgdGhlIGdpdmVuIGZpZWxkIGhhdmUgYSBoYXNfJG5hbWUkKCkgbWV0aG9kPwotYm9vbCBIYXNIYXNNZXRob2QoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBpZiAoSGFzRmllbGRQcmVzZW5jZShmaWVsZC0+ZmlsZSgpKSkgewotICAgIC8vIEluIHByb3RvMS9wcm90bzIsIGV2ZXJ5IGZpZWxkIGhhcyBhIGhhc18kbmFtZSQoKSBtZXRob2QuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgLy8gRm9yIG1lc3NhZ2UgdHlwZXMgd2l0aG91dCB0cnVlIGZpZWxkIHByZXNlbmNlLCBvbmx5IGZpZWxkcyB3aXRoIGEgbWVzc2FnZQotICAvLyB0eXBlIGhhdmUgYSBoYXNfJG5hbWUkKCkgbWV0aG9kLgotICByZXR1cm4gZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U7Ci19Ci0KLS8vIENvbGxlY3RzIG1hcCBlbnRyeSBtZXNzYWdlIHR5cGUgaW5mb3JtYXRpb24uCi12b2lkIENvbGxlY3RNYXBJbmZvKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgewotICBHT09HTEVfQ0hFQ0soSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcikpOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGtleSA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgia2V5Iik7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOwotICAoKnZhcmlhYmxlcylbImtleSJdID0gUHJpbWl0aXZlVHlwZU5hbWUoa2V5LT5jcHBfdHlwZSgpKTsKLSAgc3dpdGNoICh2YWwtPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgKCp2YXJpYWJsZXMpWyJ2YWwiXSA9IEZpZWxkTWVzc2FnZVR5cGVOYW1lKHZhbCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgKCp2YXJpYWJsZXMpWyJ2YWwiXSA9IENsYXNzTmFtZSh2YWwtPmVudW1fdHlwZSgpLCB0cnVlKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICAoKnZhcmlhYmxlcylbInZhbCJdID0gUHJpbWl0aXZlVHlwZU5hbWUodmFsLT5jcHBfdHlwZSgpKTsKLSAgfQotICAoKnZhcmlhYmxlcylbImtleV93aXJlX3R5cGUiXSA9Ci0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfIiArCi0gICAgICBUb1VwcGVyKERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoa2V5LT50eXBlKCkpKTsKLSAgKCp2YXJpYWJsZXMpWyJ2YWxfd2lyZV90eXBlIl0gPQotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFXyIgKwotICAgICAgVG9VcHBlcihEZWNsYXJlZFR5cGVNZXRob2ROYW1lKHZhbC0+dHlwZSgpKSk7Ci19Ci0KLS8vIERvZXMgdGhlIGdpdmVuIGZpZWxkIGhhdmUgYSBwcml2YXRlIChpbnRlcm5hbCBoZWxwZXIgb25seSkgaGFzXyRuYW1lJCgpCi0vLyBtZXRob2Q/Ci1ib29sIEhhc1ByaXZhdGVIYXNNZXRob2QoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICAvLyBPbmx5IGZvciBvbmVvZnMgaW4gbWVzc2FnZSB0eXBlcyB3aXRoIG5vIGZpZWxkIHByZXNlbmNlLiBoYXNfJG5hbWUkKCksCi0gIC8vIGJhc2VkIG9uIHRoZSBvbmVvZiBjYXNlLCBpcyBzdGlsbCB1c2VmdWwgaW50ZXJuYWxseSBmb3IgZ2VuZXJhdGVkIGNvZGUuCi0gIHJldHVybiAoIUhhc0ZpZWxkUHJlc2VuY2UoZmllbGQtPmZpbGUoKSkgJiYKLSAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpICE9IE5VTEwpOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTWVzc2FnZUdlbmVyYXRvcjo6TWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQotICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCi0gICAgICBjbGFzc25hbWVfKENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSkpLAotICAgICAgb3B0aW9uc18ob3B0aW9ucyksCi0gICAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLCBvcHRpb25zKSwKLSAgICAgIG5lc3RlZF9nZW5lcmF0b3JzXyhuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjwKLSAgICAgICAgICBNZXNzYWdlR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpXSksCi0gICAgICBlbnVtX2dlbmVyYXRvcnNfKAotICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEVudW1HZW5lcmF0b3I+W2Rlc2NyaXB0b3ItPmVudW1fdHlwZV9jb3VudCgpXSksCi0gICAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18obmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8Ci0gICAgICAgICAgRXh0ZW5zaW9uR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKV0pLAotICAgICAgdXNlX2RlcGVuZGVudF9iYXNlXyhmYWxzZSkgewotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAotICAgICAgbmV3IE1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvci0+bmVzdGVkX3R5cGUoaSksIG9wdGlvbnMpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGVudW1fZ2VuZXJhdG9yc19baV0ucmVzZXQoCi0gICAgICBuZXcgRW51bUdlbmVyYXRvcihkZXNjcmlwdG9yLT5lbnVtX3R5cGUoaSksIG9wdGlvbnMpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS5yZXNldCgKLSAgICAgIG5ldyBFeHRlbnNpb25HZW5lcmF0b3IoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uKGkpLCBvcHRpb25zKSk7Ci0gIH0KLQotICBudW1fcmVxdWlyZWRfZmllbGRzXyA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKGRlc2NyaXB0b3ItPmZpZWxkKGkpLT5pc19yZXF1aXJlZCgpKSB7Ci0gICAgICArK251bV9yZXF1aXJlZF9maWVsZHNfOwotICAgIH0KLSAgICBpZiAob3B0aW9ucy5wcm90b19oICYmIElzRmllbGREZXBlbmRlbnQoZGVzY3JpcHRvci0+ZmllbGQoaSkpKSB7Ci0gICAgICB1c2VfZGVwZW5kZW50X2Jhc2VfID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgaWYgKG9wdGlvbnMucHJvdG9faCAmJiBkZXNjcmlwdG9yLT5vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7Ci0gICAgLy8gQWx3YXlzIG1ha2Ugb25lb2ZzIGRlcGVuZGVudC4KLSAgICB1c2VfZGVwZW5kZW50X2Jhc2VfID0gdHJ1ZTsKLSAgfQotfQotCi1NZXNzYWdlR2VuZXJhdG9yOjp+TWVzc2FnZUdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1GaWxsTWVzc2FnZUZvcndhcmREZWNsYXJhdGlvbnMobWFwPHN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+KiBjbGFzc19uYW1lcykgewotICAoKmNsYXNzX25hbWVzKVtjbGFzc25hbWVfXSA9IGRlc2NyaXB0b3JfOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIC8vIG1hcCBlbnRyeSBtZXNzYWdlIGRvZXNuJ3QgbmVlZCBmb3J3YXJkIGRlY2xhcmF0aW9uLiBTaW5jZSBtYXAgZW50cnkKLSAgICAvLyBtZXNzYWdlIGNhbm5vdCBiZSBhIHRvcCBsZXZlbCBjbGFzcywgd2UganVzdCBuZWVkIHRvIGF2b2lkIGNhbGxpbmcKLSAgICAvLyBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbiBoZXJlLgotICAgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKLSAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkZpbGxNZXNzYWdlRm9yd2FyZERlY2xhcmF0aW9ucyhjbGFzc19uYW1lcyk7Ci0gIH0KLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUZpbGxFbnVtRm9yd2FyZERlY2xhcmF0aW9ucyhtYXA8c3RyaW5nLCBjb25zdCBFbnVtRGVzY3JpcHRvcio+KiBlbnVtX25hbWVzKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+RmlsbEVudW1Gb3J3YXJkRGVjbGFyYXRpb25zKGVudW1fbmFtZXMpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5GaWxsRm9yd2FyZERlY2xhcmF0aW9uKGVudW1fbmFtZXMpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmaW5pdGlvbihwcmludGVyKTsKLSAgfQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVHZXRFbnVtRGVzY3JpcHRvclNwZWNpYWxpemF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7Ci0gIH0KLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRGVwZW5kZW50RmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotCi0gICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOwotCi0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOwotCi0gICAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8gJiYgSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKLSAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGRlcGVuZGVudCwgdGhlIGlubGluZSBjbGVhcl8qKCkgbWV0aG9kIHdpbGwgbmVlZAotICAgICAgLy8gdG8gZGVsZXRlIHRoZSBtZXNzYWdlIHR5cGUsIHNvIGl0IG11c3QgYmUgaW4gdGhlIGRlcGVuZGVudCBiYXNlCi0gICAgICAvLyBjbGFzcy4gKFNlZSBhbHNvIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucy4pCi0gICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIGNsZWFyXyRuYW1lJCgpO1xuIik7Ci0gICAgfQotICAgIC8vIEdlbmVyYXRlIHR5cGUtc3BlY2lmaWMgYWNjZXNzb3IgZGVjbGFyYXRpb25zLgotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgfQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0KLSAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7Ci0KLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gICAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZmllbGQsICZ2YXJzLCBvcHRpb25zXyk7Ci0gICAgdmFyc1siY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZmllbGQpOwotCi0gICAgYm9vbCBkZXBlbmRlbnRfZmllbGQgPSB1c2VfZGVwZW5kZW50X2Jhc2VfICYmIElzRmllbGREZXBlbmRlbnQoZmllbGQpOwotICAgIGlmIChkZXBlbmRlbnRfZmllbGQgJiYKLSAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKLSAgICAgICAgIWZpZWxkLT5pc19tYXAoKSkgewotICAgICAgLy8gSWYgdGhpcyBmaWVsZCBpcyBkZXBlbmRlbnQsIHRoZSBkZXBlbmRlbnQgYmFzZSBjbGFzcyBkZXRlcm1pbmVzCi0gICAgICAvLyB0aGUgbWVzc2FnZSB0eXBlIGZyb20gdGhlIGRlcml2ZWQgY2xhc3MgKHdoaWNoIGlzIGEgdGVtcGxhdGUKLSAgICAgIC8vIHBhcmFtZXRlcikuIFRoaXMgdHlwZWRlZiBpcyBmb3IgdGhhdDoKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJwcml2YXRlOlxuIgotICAgICAgICAgICJ0eXBlZGVmICRmaWVsZF90eXBlJCAkZGVwZW5kZW50X3R5cGUkO1xuIgotICAgICAgICAgICJwdWJsaWM6XG4iLAotICAgICAgICAgICJmaWVsZF90eXBlIiwgRmllbGRNZXNzYWdlVHlwZU5hbWUoZmllbGQpLAotICAgICAgICAgICJkZXBlbmRlbnRfdHlwZSIsIERlcGVuZGVudFR5cGVOYW1lKGZpZWxkKSk7Ci0gICAgfQotCi0gICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiJGRlcHJlY2F0ZWRfYXR0ciRpbnQgJG5hbWUkX3NpemUoKSBjb25zdDtcbiIpOwotICAgIH0gZWxzZSBpZiAoSGFzSGFzTWV0aG9kKGZpZWxkKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywgIiRkZXByZWNhdGVkX2F0dHIkYm9vbCBoYXNfJG5hbWUkKCkgY29uc3Q7XG4iKTsKLSAgICB9IGVsc2UgaWYgKEhhc1ByaXZhdGVIYXNNZXRob2QoZmllbGQpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAgICJwcml2YXRlOlxuIgotICAgICAgICAgICJib29sIGhhc18kbmFtZSQoKSBjb25zdDtcbiIKLSAgICAgICAgICAicHVibGljOlxuIik7Ci0gICAgfQotCi0gICAgaWYgKCFkZXBlbmRlbnRfZmllbGQpIHsKLSAgICAgIC8vIElmIHRoaXMgZmllbGQgaXMgZGVwZW5kZW50LCB0aGVuIGl0cyBjbGVhcl8oKSBtZXRob2QgaXMgaW4gdGhlCi0gICAgICAvLyBkZXBlbmVudCBiYXNlIGNsYXNzLiAoU2VlIGFsc28gR2VuZXJhdGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucy4pCi0gICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIGNsZWFyXyRuYW1lJCgpO1xuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGVkX2F0dHIkc3RhdGljIGNvbnN0IGludCAkY29uc3RhbnRfbmFtZSQgPSAiCi0gICAgICAgICAgICAgICAgICAgIiRudW1iZXIkO1xuIik7Ci0KLSAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29yIGRlY2xhcmF0aW9ucy4KLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7Ci0KLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgLy8gR2VuZXJhdGUgYWNjZXNzb3JzIGZvciBleHRlbnNpb25zLiAgV2UganVzdCBjYWxsIGEgbWFjcm8gbG9jYXRlZCBpbgotICAgIC8vIGV4dGVuc2lvbl9zZXQuaCBzaW5jZSB0aGUgYWNjZXNzb3JzIGFib3V0IDgwIGxpbmVzIG9mIHN0YXRpYyBjb2RlLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIkdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKCRjbGFzc25hbWUkKVxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIkY2FtZWxfb25lb2ZfbmFtZSRDYXNlICRvbmVvZl9uYW1lJF9jYXNlKCkgY29uc3Q7XG4iLAotICAgICAgICAiY2FtZWxfb25lb2ZfbmFtZSIsCi0gICAgICAgIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSwgdHJ1ZSksCi0gICAgICAgICJvbmVvZl9uYW1lIiwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSk7Ci0gIH0KLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRGVwZW5kZW50RmllbGRBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXykgcmV0dXJuOwotCi0gIHByaW50ZXItPlByaW50KCIvLyAkY2xhc3NuYW1lJFxuXG4iLCAiY2xhc3NuYW1lIiwKLSAgICAgICAgICAgICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfKSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLQotICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKLQotICAgIC8vIFRoZXNlIGZ1bmN0aW9ucyBhcmUgbm90IHJlYWxseSBkZXBlbmRlbnQ6IHRoZXkgYXJlIHBhcnQgb2YgdGhlCi0gICAgLy8gKG5vbi1kZXBlbmRlbnQpIGRlcml2ZWQgY2xhc3MuIEhvd2V2ZXIsIHRoZXkgbmVlZCB0byBsaXZlIG91dHNpZGUKLSAgICAvLyBhbnkgI2lmZGVmIGd1YXJkcywgc28gd2UgdHJlYXQgdGhlbSBhcyBpZiB0aGV5IHdlcmUgZGVwZW5kZW50LgotICAgIC8vCi0gICAgLy8gU2VlIHRoZSBjb21tZW50IGluIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlSW5saW5lRnVuY3Rpb25EZWZpbml0aW9ucwotICAgIC8vIGZvciBhIG1vcmUgY29tcGxldGUgZXhwbGFuYXRpb24uCi0gICAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8gJiYgSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKLSAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOwotICAgICAgdmFyc1siaW5saW5lIl0gPSAiaW5saW5lICI7Ci0gICAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgICB2YXJzWyJmaWVsZF9uYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpOwotICAgICAgICB2YXJzWyJvbmVvZl9uYW1lIl0gPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5uYW1lKCk7Ci0gICAgICAgIHZhcnNbIm9uZW9mX2luZGV4Il0gPSBTaW1wbGVJdG9hKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCktPmluZGV4KCkpOwotICAgICAgICBHZW5lcmF0ZU9uZW9mTWVtYmVySGFzQml0cyhmaWVsZCwgdmFycywgcHJpbnRlcik7Ci0gICAgICB9IGVsc2UgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICAvLyBUaGVyZSB3aWxsIGJlIG5vIGhlYWRlciBndWFyZCwgc28gdGhpcyBhbHdheXMgaGFzIHRvIGJlIGlubGluZS4KLSAgICAgICAgR2VuZXJhdGVTaW5ndWxhckZpZWxkSGFzQml0cyhmaWVsZCwgdmFycywgcHJpbnRlcik7Ci0gICAgICB9Ci0gICAgICAvLyB2YXJzIG5lZWRlZCBmb3IgY2xlYXJfKCksIHdoaWNoIGlzIGluIHRoZSBkZXBlbmRlbnQgYmFzZToKLSAgICAgIC8vIChTZWUgYWxzbyBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMuKQotICAgICAgdmFyc1sidG1wbCJdID0gInRlbXBsYXRlPGNsYXNzIFQ+XG4iOwotICAgICAgdmFyc1siZGVwZW5kZW50X2NsYXNzbmFtZSJdID0KLSAgICAgICAgICBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoZGVzY3JpcHRvcl8pICsgIjxUPiI7Ci0gICAgICB2YXJzWyJ0aGlzX21lc3NhZ2UiXSA9IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpOwotICAgICAgdmFyc1sidGhpc19jb25zdF9tZXNzYWdlIl0gPSBEZXBlbmRlbnRCYXNlQ29uc3REb3duQ2FzdCgpOwotICAgICAgR2VuZXJhdGVGaWVsZENsZWFyKGZpZWxkLCB2YXJzLCBwcmludGVyKTsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29ycy4KLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpCi0gICAgICAgIC5HZW5lcmF0ZURlcGVuZGVudElubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMocHJpbnRlcik7Ci0KLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIGhhc18kbmFtZSQoKSBhbmQgY2xlYXJfaGFzXyRuYW1lJCgpIGZ1bmN0aW9ucyBmb3Igb25lb2ZzCi0gIC8vIFNpbWlsYXIgdG8gb3RoZXIgaGFzLWJpdHMsIHRoZXNlIG11c3QgYWx3YXlzIGJlIGluIHRoZSBoZWFkZXIgaWYgd2UKLSAgLy8gYXJlIHVzaW5nIGEgZGVwZW5kZW50IGJhc2UgY2xhc3MuCi0gIEdlbmVyYXRlT25lb2ZIYXNCaXRzKHByaW50ZXIsIHRydWUgLyogaXNfaW5saW5lICovKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2luZ3VsYXJGaWVsZEhhc0JpdHMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIC8vIE4uQi46IHdpdGhvdXQgZmllbGQgcHJlc2VuY2UsIHdlIGRvIG5vdCB1c2UgaGFzLWJpdHMgb3IgZ2VuZXJhdGUKLSAgICAvLyBoYXNfJG5hbWUkKCkgbWV0aG9kcy4KLSAgICB2YXJzWyJoYXNfYXJyYXlfaW5kZXgiXSA9IFNpbXBsZUl0b2EoZmllbGQtPmluZGV4KCkgLyAzMik7Ci0gICAgdmFyc1siaGFzX21hc2siXSA9IFN0ckNhdChzdHJpbmdzOjpIZXgoMXUgPDwgKGZpZWxkLT5pbmRleCgpICUgMzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlpFUk9fUEFEXzgpKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIiRpbmxpbmUkIgotICAgICAgImJvb2wgJGNsYXNzbmFtZSQ6Omhhc18kbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgICAiICByZXR1cm4gKF9oYXNfYml0c19bJGhhc19hcnJheV9pbmRleCRdICYgMHgkaGFzX21hc2skdSkgIT0gMDtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQiCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0X2hhc18kbmFtZSQoKSB7XG4iCi0gICAgICAiICBfaGFzX2JpdHNfWyRoYXNfYXJyYXlfaW5kZXgkXSB8PSAweCRoYXNfbWFzayR1O1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCIKLSAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpjbGVhcl9oYXNfJG5hbWUkKCkge1xuIgotICAgICAgIiAgX2hhc19iaXRzX1skaGFzX2FycmF5X2luZGV4JF0gJj0gfjB4JGhhc19tYXNrJHU7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTWVzc2FnZSBmaWVsZHMgaGF2ZSBhIGhhc18kbmFtZSQoKSBtZXRob2QuCi0gICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBib29sIGlzX2xhenkgPSBmYWxzZTsKLSAgICAgIGlmIChpc19sYXp5KSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICAgIiRpbmxpbmUkIgotICAgICAgICAgICJib29sICRjbGFzc25hbWUkOjpoYXNfJG5hbWUkKCkgY29uc3Qge1xuIgotICAgICAgICAgICIgIHJldHVybiAhJG5hbWUkXy5Jc0NsZWFyZWQoKTtcbiIKLSAgICAgICAgICAifVxuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAgICIkaW5saW5lJCIKLSAgICAgICAgICAiYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKLSAgICAgICAgICAiICByZXR1cm4gIV9pc19kZWZhdWx0X2luc3RhbmNlXyAmJiAkbmFtZSRfICE9IE5VTEw7XG4iCi0gICAgICAgICAgIn1cbiIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVPbmVvZkhhc0JpdHMoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgaXNfaW5saW5lKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbIm9uZW9mX25hbWUiXSA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCk7Ci0gICAgdmFyc1sib25lb2ZfaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmluZGV4KCkpOwotICAgIHZhcnNbImNhcF9vbmVvZl9uYW1lIl0gPQotICAgICAgICBUb1VwcGVyKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpOwotICAgIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKLSAgICB2YXJzWyJpbmxpbmUiXSA9IChpc19pbmxpbmUgPyAiaW5saW5lICIgOiAiIik7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgIHZhcnMsCi0gICAgICAgICIkaW5saW5lJCIKLSAgICAgICAgImJvb2wgJGNsYXNzbmFtZSQ6Omhhc18kb25lb2ZfbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgICAgICIgIHJldHVybiAkb25lb2ZfbmFtZSRfY2FzZSgpICE9ICRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVDtcbiIKLSAgICAgICAgIn1cbiIKLSAgICAgICAgIiRpbmxpbmUkIgotICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Y2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpIHtcbiIKLSAgICAgICAgIiAgX29uZW9mX2Nhc2VfWyRvbmVvZl9pbmRleCRdID0gJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUO1xuIgotICAgICAgICAifVxuIik7Ci0gIH0KLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlT25lb2ZNZW1iZXJIYXNCaXRzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gU2luZ3VsYXIgZmllbGQgaW4gYSBvbmVvZgotICAvLyBOLkIuOiBXaXRob3V0IGZpZWxkIHByZXNlbmNlLCB3ZSBkbyBub3QgdXNlIGhhcy1iaXRzIG9yIGdlbmVyYXRlCi0gIC8vIGhhc18kbmFtZSQoKSBtZXRob2RzLCBidXQgb25lb2ZzIHN0aWxsIGhhdmUgc2V0X2hhc18kbmFtZSQoKS4KLSAgLy8gT25lb2ZzIGFsc28gaGF2ZSBoYXNfJG5hbWUkKCkgYnV0IG9ubHkgYXMgYSBwcml2YXRlIGhlbHBlcgotICAvLyBtZXRob2QsIHNvIHRoYXQgZ2VuZXJhdGVkIGNvZGUgaXMgc2xpZ2h0bHkgY2xlYW5lciAodnMuICBjb21wYXJpbmcKLSAgLy8gX29uZW9mX2Nhc2VfW2luZGV4XSBhZ2FpbnN0IGEgY29uc3RhbnQgZXZlcnl3aGVyZSkuCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiRpbmxpbmUkIgotICAgICJib29sICRjbGFzc25hbWUkOjpoYXNfJG5hbWUkKCkgY29uc3Qge1xuIgotICAgICIgIHJldHVybiAkb25lb2ZfbmFtZSRfY2FzZSgpID09IGskZmllbGRfbmFtZSQ7XG4iCi0gICAgIn1cbiIpOwotICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICIkaW5saW5lJCIKLSAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0X2hhc18kbmFtZSQoKSB7XG4iCi0gICAgIiAgX29uZW9mX2Nhc2VfWyRvbmVvZl9pbmRleCRdID0gayRmaWVsZF9uYW1lJDtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUZpZWxkQ2xlYXIoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJzLAotICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIEdlbmVyYXRlIGNsZWFyXyRuYW1lJCgpIChTZWUgR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zIGFuZAotICAvLyBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMsICRkZXBlbmRlbnRfY2xhc3NuYW1lJCBpcwotICAvLyBzZXQgYnkgdGhlIEdlbmVyYXRlKkRlZmluaXRpb25zIGZ1bmN0aW9ucy4pCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiR0bXBsJCIKLSAgICAiJGlubGluZSQiCi0gICAgInZvaWQgJGRlcGVuZGVudF9jbGFzc25hbWUkOjpjbGVhcl8kbmFtZSQoKSB7XG4iKTsKLQotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgIC8vIENsZWFyIHRoaXMgZmllbGQgb25seSBpZiBpdCBpcyB0aGUgYWN0aXZlIGZpZWxkIGluIHRoaXMgb25lb2YsCi0gICAgLy8gb3RoZXJ3aXNlIGlnbm9yZQotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiaWYgKCR0aGlzX21lc3NhZ2UkaGFzXyRuYW1lJCgpKSB7XG4iKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpCi0gICAgICAgIC5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIiR0aGlzX21lc3NhZ2UkY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuIik7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpCi0gICAgICAgIC5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKLSAgICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAiJHRoaXNfbWVzc2FnZSRjbGVhcl9oYXNfJG5hbWUkKCk7XG4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIGlzX2lubGluZSkgewotICBwcmludGVyLT5QcmludCgiLy8gJGNsYXNzbmFtZSRcblxuIiwgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0KLSAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7Ci0KLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gICAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZmllbGQsICZ2YXJzLCBvcHRpb25zXyk7Ci0gICAgdmFyc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lICIgOiAiIjsKLSAgICBpZiAodXNlX2RlcGVuZGVudF9iYXNlXyAmJiBJc0ZpZWxkRGVwZW5kZW50KGZpZWxkKSkgewotICAgICAgdmFyc1sidG1wbCJdID0gInRlbXBsYXRlPGNsYXNzIFQ+XG4iOwotICAgICAgdmFyc1siZGVwZW5kZW50X2NsYXNzbmFtZSJdID0KLSAgICAgICAgICBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoZGVzY3JpcHRvcl8pICsgIjxUPiI7Ci0gICAgICB2YXJzWyJ0aGlzX21lc3NhZ2UiXSA9ICJyZWludGVycHJldF9jYXN0PFQqPih0aGlzKS0+IjsKLSAgICAgIHZhcnNbInRoaXNfY29uc3RfbWVzc2FnZSJdID0gInJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVCo+KHRoaXMpLT4iOwotICAgIH0gZWxzZSB7Ci0gICAgICB2YXJzWyJ0bXBsIl0gPSAiIjsKLSAgICAgIHZhcnNbImRlcGVuZGVudF9jbGFzc25hbWUiXSA9IHZhcnNbImNsYXNzbmFtZSJdOwotICAgICAgdmFyc1sidGhpc19tZXNzYWdlIl0gPSAiIjsKLSAgICAgIHZhcnNbInRoaXNfY29uc3RfbWVzc2FnZSJdID0gIiI7Ci0gICAgfQotCi0gICAgLy8gR2VuZXJhdGUgaGFzXyRuYW1lJCgpIG9yICRuYW1lJF9zaXplKCkuCi0gICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAiJGlubGluZSQiCi0gICAgICAgICJpbnQgJGNsYXNzbmFtZSQ6OiRuYW1lJF9zaXplKCkgY29uc3Qge1xuIgotICAgICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgICAgICJ9XG4iKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgIHZhcnNbImZpZWxkX25hbWUiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSk7Ci0gICAgICB2YXJzWyJvbmVvZl9uYW1lIl0gPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5uYW1lKCk7Ci0gICAgICB2YXJzWyJvbmVvZl9pbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpKTsKLSAgICAgIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXyB8fCAhSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKLSAgICAgICAgR2VuZXJhdGVPbmVvZk1lbWJlckhhc0JpdHMoZmllbGQsIHZhcnMsIHByaW50ZXIpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTaW5ndWxhciBmaWVsZC4KLSAgICAgIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXyB8fCAhSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKLSAgICAgICAgR2VuZXJhdGVTaW5ndWxhckZpZWxkSGFzQml0cyhmaWVsZCwgdmFycywgcHJpbnRlcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCF1c2VfZGVwZW5kZW50X2Jhc2VfIHx8ICFJc0ZpZWxkRGVwZW5kZW50KGZpZWxkKSkgewotICAgICAgR2VuZXJhdGVGaWVsZENsZWFyKGZpZWxkLCB2YXJzLCBwcmludGVyKTsKLSAgICB9Ci0KLSAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29ycy4KLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2lubGluZSk7Ci0KLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgfQotCi0gIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXykgewotICAgIC8vIEdlbmVyYXRlIGhhc18kbmFtZSQoKSBhbmQgY2xlYXJfaGFzXyRuYW1lJCgpIGZ1bmN0aW9ucyBmb3Igb25lb2ZzCi0gICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIGEgZGVwZW5kZW50IGJhc2UsIHRoZXkgY2FuIGJlIHdpdGggdGhlIG90aGVyIGZ1bmN0aW9ucwotICAgIC8vIHRoYXQgYXJlICNpZmRlZi1ndWFyZGVkLgotICAgIEdlbmVyYXRlT25lb2ZIYXNCaXRzKHByaW50ZXIsIGlzX2lubGluZSk7Ci0gIH0KLX0KLQotLy8gSGVscGVyIGZvciB0aGUgY29kZSB0aGF0IGVtaXRzIHRoZSBDbGVhcigpIG1ldGhvZC4KLXN0YXRpYyBib29sIENhbkNsZWFyQnlaZXJvaW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpIHx8IGZpZWxkLT5pc19leHRlbnNpb24oKSkgcmV0dXJuIGZhbHNlOwotICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKLSAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpID09IDA7Ci0gICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50MzIoKSA9PSAwOwotICAgIGNhc2UgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDY0OgotICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkgPT0gMDsKLSAgICBjYXNlIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UMzI6Ci0gICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkgPT0gMDsKLSAgICBjYXNlIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDY0KCkgPT0gMDsKLSAgICBjYXNlIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9GTE9BVDoKLSAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpID09IDA7Ci0gICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpID09IDA7Ci0gICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfQk9PTDoKLSAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9ib29sKCkgPT0gZmFsc2U7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVEZXBlbmRlbnRCYXNlQ2xhc3NEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXykgewotICAgIHJldHVybjsKLSAgfQotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1siY2xhc3NuYW1lIl0gPSBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoZGVzY3JpcHRvcl8pOwotICB2YXJzWyJzdXBlcmNsYXNzIl0gPSBTdXBlckNsYXNzTmFtZShkZXNjcmlwdG9yXywgb3B0aW9uc18pOwotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgotICAgICJjbGFzcyAkY2xhc3NuYW1lJCA6IHB1YmxpYyAkc3VwZXJjbGFzcyQge1xuIgotICAgICIgcHVibGljOlxuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiRjbGFzc25hbWUkKCkge31cbiIKLSAgICAidmlydHVhbCB+JGNsYXNzbmFtZSQoKSB7fVxuIgotICAgICJcbiIpOwotCi0gIC8vIEdlbmVyYXRlIGRlcGVuZGVudCBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzLgotICBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifTtcbiIpOwotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVDbGFzc0RlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgLy8gbWFwIGVudHJ5IG1lc3NhZ2UgZG9lc24ndCBuZWVkIGNsYXNzIGRlZmluaXRpb24uIFNpbmNlIG1hcCBlbnRyeSBtZXNzYWdlCi0gICAgLy8gY2Fubm90IGJlIGEgdG9wIGxldmVsIGNsYXNzLCB3ZSBqdXN0IG5lZWQgdG8gYXZvaWQgY2FsbGluZwotICAgIC8vIEdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uIGhlcmUuCi0gICAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkpIGNvbnRpbnVlOwotICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc0RlZmluaXRpb24ocHJpbnRlcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOwotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICB9Ci0KLSAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8pIHsKLSAgICBHZW5lcmF0ZURlcGVuZGVudEJhc2VDbGFzc0RlZmluaXRpb24ocHJpbnRlcik7Ci0gICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgfQotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOwotICB2YXJzWyJmaWVsZF9jb3VudCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSk7Ci0gIHZhcnNbIm9uZW9mX2RlY2xfY291bnQiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSk7Ci0gIGlmIChvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpKSB7Ci0gICAgdmFyc1siZGxsZXhwb3J0Il0gPSAiIjsKLSAgfSBlbHNlIHsKLSAgICB2YXJzWyJkbGxleHBvcnQiXSA9IG9wdGlvbnNfLmRsbGV4cG9ydF9kZWNsICsgIiAiOwotICB9Ci0gIGlmICh1c2VfZGVwZW5kZW50X2Jhc2VfKSB7Ci0gICAgdmFyc1sic3VwZXJjbGFzcyJdID0KLSAgICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfKSArICI8IiArIGNsYXNzbmFtZV8gKyAiPiI7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyc1sic3VwZXJjbGFzcyJdID0gU3VwZXJDbGFzc05hbWUoZGVzY3JpcHRvcl8sIG9wdGlvbnNfKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICJjbGFzcyAkZGxsZXhwb3J0JCRjbGFzc25hbWUkIDogcHVibGljICRzdXBlcmNsYXNzJCB7XG4iKTsKLSAgcHJpbnRlci0+QW5ub3RhdGUoImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfKTsKLSAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8pIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLCAiICBmcmllbmQgY2xhc3MgJHN1cGVyY2xhc3MkO1xuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoIiBwdWJsaWM6XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAiJGNsYXNzbmFtZSQoKTtcbiIKLSAgICAidmlydHVhbCB+JGNsYXNzbmFtZSQoKTtcbiIKLSAgICAiXG4iCi0gICAgIiRjbGFzc25hbWUkKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKTtcbiIKLSAgICAiXG4iCi0gICAgImlubGluZSAkY2xhc3NuYW1lJCYgb3BlcmF0b3I9KGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKSB7XG4iCi0gICAgIiAgQ29weUZyb20oZnJvbSk7XG4iCi0gICAgIiAgcmV0dXJuICp0aGlzO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIik7Ci0KLSAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKLSAgICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3Qge1xuIgotICAgICAgICAiICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpO1xuIgotICAgICAgICAifVxuIgotICAgICAgICAiXG4iCi0gICAgICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7XG4iCi0gICAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTtcbiIKLSAgICAgICAgIn1cbiIKLSAgICAgICAgIlxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHtcbiIKLSAgICAgICAgICAiICByZXR1cm4gX3Vua25vd25fZmllbGRzXy5HZXQoXG4iCi0gICAgICAgICAgIiAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7XG4iCi0gICAgICAgICAgIn1cbiIKLSAgICAgICAgICAiXG4iCi0gICAgICAgICAgImlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkge1xuIgotICAgICAgICAgICIgIHJldHVybiBfdW5rbm93bl9maWVsZHNfLk11dGFibGUoXG4iCi0gICAgICAgICAgIiAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSxcbiIKLSAgICAgICAgICAiICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAgICAgIn1cbiIKLSAgICAgICAgICAiXG4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7XG4iCi0gICAgICAgICAgIiAgcmV0dXJuIF91bmtub3duX2ZpZWxkc18uR2V0Tm9BcmVuYShcbiIKLSAgICAgICAgICAiICAgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTtcbiIKLSAgICAgICAgICAifVxuIgotICAgICAgICAgICJcbiIKLSAgICAgICAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7XG4iCi0gICAgICAgICAgIiAgcmV0dXJuIF91bmtub3duX2ZpZWxkc18uTXV0YWJsZU5vQXJlbmEoXG4iCi0gICAgICAgICAgIiAgICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7XG4iCi0gICAgICAgICAgIn1cbiIKLSAgICAgICAgICAiXG4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBOLkIuOiBXZSBleGNsdWRlIEdldEFyZW5hKCkgd2hlbiBhcmVuYSBzdXBwb3J0IGlzIGRpc2FibGVkLCBmYWxsaW5nIGJhY2sgb24KLSAgLy8gTWVzc2FnZUxpdGUncyBpbXBsZW1lbnRhdGlvbiB3aGljaCByZXR1cm5zIE5VTEwgcmF0aGVyIHRoYW4gZ2VuZXJhdGluZyBvdXIKLSAgLy8gb3duIG1ldGhvZCB3aGljaCByZXR1cm5zIE5VTEwsIGluIG9yZGVyIHRvIHJlZHVjZSBjb2RlIHNpemUuCi0gIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICAvLyB2aXJ0dWFsIG1ldGhvZCB2ZXJzaW9uIG9mIEdldEFyZW5hTm9WaXJ0dWFsKCksIHJlcXVpcmVkIGZvciBnZW5lcmljIGRpc3BhdGNoIGdpdmVuIGEKLSAgICAvLyBNZXNzYWdlTGl0ZSogKGUuZy4sIGluIFJlcGVhdGVkRmllbGQ6OkFkZEFsbG9jYXRlZCgpKS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYSgpIGNvbnN0IHsgcmV0dXJuIEdldEFyZW5hTm9WaXJ0dWFsKCk7IH1cbiIKLSAgICAgICAgImlubGluZSB2b2lkKiBHZXRNYXliZUFyZW5hUG9pbnRlcigpIGNvbnN0IHtcbiIKLSAgICAgICAgIiAgcmV0dXJuIE1heWJlQXJlbmFQdHIoKTtcbiIKLSAgICAgICAgIn1cbiIpOwotICB9Ci0KLSAgLy8gT25seSBnZW5lcmF0ZSB0aGlzIG1lbWJlciBpZiBpdCdzIG5vdCBkaXNhYmxlZC4KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSAmJgotICAgICAgIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICJzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgInN0YXRpYyBjb25zdCAkY2xhc3NuYW1lJCYgZGVmYXVsdF9pbnN0YW5jZSgpO1xuIgotICAgICJcbiIpOwotCi0gIC8vIEdlbmVyYXRlIGVudW0gdmFsdWVzIGZvciBldmVyeSBmaWVsZCBpbiBvbmVvZnMuIE9uZSBsaXN0IGlzIGdlbmVyYXRlZCBmb3IKLSAgLy8gZWFjaCBvbmVvZiB3aXRoIGFuIGFkZGl0aW9uYWwgKl9OT1RfU0VUIHZhbHVlLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiZW51bSAkY2FtZWxfb25lb2ZfbmFtZSRDYXNlIHtcbiIsCi0gICAgICAgICJjYW1lbF9vbmVvZl9uYW1lIiwKLSAgICAgICAgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpLCB0cnVlKSk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGRfY291bnQoKTsgaisrKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiayRmaWVsZF9uYW1lJCA9ICRmaWVsZF9udW1iZXIkLFxuIiwKLSAgICAgICAgICAiZmllbGRfbmFtZSIsCi0gICAgICAgICAgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgKLSAgICAgICAgICAgICAgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkKGopLT5uYW1lKCksIHRydWUpLAotICAgICAgICAgICJmaWVsZF9udW1iZXIiLAotICAgICAgICAgIFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkKGopLT5udW1iZXIoKSkpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVCA9IDAsXG4iLAotICAgICAgICAiY2FwX29uZW9mX25hbWUiLAotICAgICAgICBUb1VwcGVyKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpKTsKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ9O1xuIgotICAgICAgICAiXG4iKTsKLSAgfQotCi0gIGlmICghU3RhdGljSW5pdGlhbGl6ZXJzRm9yY2VkKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVJcbiIKLSAgICAgICIvLyBSZXR1cm5zIHRoZSBpbnRlcm5hbCBkZWZhdWx0IGluc3RhbmNlIHBvaW50ZXIuIFRoaXMgZnVuY3Rpb24gY2FuXG4iCi0gICAgICAiLy8gcmV0dXJuIE5VTEwgdGh1cyBzaG91bGQgbm90IGJlIHVzZWQgYnkgdGhlIHVzZXIuIFRoaXMgaXMgaW50ZW5kZWRcbiIKLSAgICAgICIvLyBmb3IgUHJvdG9idWYgaW50ZXJuYWwgY29kZS4gUGxlYXNlIHVzZSBkZWZhdWx0X2luc3RhbmNlKCkgZGVjbGFyZWRcbiIKLSAgICAgICIvLyBhYm92ZSBpbnN0ZWFkLlxuIgotICAgICAgInN0YXRpYyBpbmxpbmUgY29uc3QgJGNsYXNzbmFtZSQqIGludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSB7XG4iCi0gICAgICAiICByZXR1cm4gZGVmYXVsdF9pbnN0YW5jZV87XG4iCi0gICAgICAifVxuIgotICAgICAgIiNlbmRpZlxuIgotICAgICAgIlxuIik7Ci0gIH0KLQotCi0gIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgInZvaWQgVW5zYWZlQXJlbmFTd2FwKCRjbGFzc25hbWUkKiBvdGhlcik7XG4iKTsKLSAgfQotCi0gIGlmIChJc0FueU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICIvLyBpbXBsZW1lbnRzIEFueSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgotICAgICAgIlxuIgotICAgICAgInZvaWQgUGFja0Zyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBtZXNzYWdlKTtcbiIKLSAgICAgICJ2b2lkIFBhY2tGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbWVzc2FnZSxcbiIKLSAgICAgICIgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHR5cGVfdXJsX3ByZWZpeCk7XG4iCi0gICAgICAiYm9vbCBVbnBhY2tUbyg6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0O1xuIgotICAgICAgInRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgSXMoKSBjb25zdCB7XG4iCi0gICAgICAiICByZXR1cm4gX2FueV9tZXRhZGF0YV8uSXM8VD4oKTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiXG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIkdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgdm9pZCBTd2FwKCRjbGFzc25hbWUkKiBvdGhlcik7XG4iCi0gICAgIlxuIgotICAgICIvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgotICAgICJcbiIKLSAgICAiaW5saW5lICRjbGFzc25hbWUkKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH1cbiIKLSAgICAiXG4iCi0gICAgIiRjbGFzc25hbWUkKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0O1xuIik7Ci0KLSAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICAgInZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTtcbiIKLSAgICAgICAgInZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICAgInZvaWQgQ2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUmIGZyb20pO1xuIik7Ci0gICAgfQotCi0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICJ2b2lkIENvcHlGcm9tKGNvbnN0ICRjbGFzc25hbWUkJiBmcm9tKTtcbiIKLSAgICAgICJ2b2lkIE1lcmdlRnJvbShjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSk7XG4iCi0gICAgICAidm9pZCBDbGVhcigpO1xuIgotICAgICAgImJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0O1xuIgotICAgICAgIlxuIgotICAgICAgImludCBCeXRlU2l6ZSgpIGNvbnN0O1xuIgotICAgICAgImJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKFxuIgotICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7XG4iCi0gICAgICAidm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoXG4iCi0gICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0O1xuIik7Ci0gICAgLy8gRGlzY2FyZFVua25vd25GaWVsZHMoKSBpcyBpbXBsZW1lbnRlZCBpbiBtZXNzYWdlLmNjIHVzaW5nIHJlZmxlY3Rpb25zLiBXZQotICAgIC8vIG5lZWQgdG8gaW1wbGVtZW50IHRoaXMgZnVuY3Rpb24gaW4gZ2VuZXJhdGVkIGNvZGUgZm9yIG1lc3NhZ2VzLgotICAgIGlmICghVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKCk7XG4iKTsKLSAgICB9Ci0gICAgaWYgKEhhc0Zhc3RBcnJheVNlcmlhbGl6YXRpb24oZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDtcbiIpOwotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIGFsbCBGaWVsZERlc2NyaXB0b3JzIGluY2x1ZGluZyB0aG9zZSBpbiBvbmVvZnMgdG8gZXN0aW1hdGUKLSAgLy8gd2hldGhlciA6OnN0ZDo6c3RyaW5nIGlzIGxpa2VseSB0byBiZSB1c2VkLCBhbmQgZGVwZW5kaW5nIG9uIHRoYXQKLSAgLy8gZXN0aW1hdGUsIHNldCB1c2VzX3N0cmluZ18gdG8gdHJ1ZSBvciBmYWxzZS4gIFRoYXQgY29udG9scwotICAvLyB3aGV0aGVyIHRvIGZvcmNlIGluaXRpYWxpemF0aW9uIG9mIGVtcHR5X3N0cmluZ18gaW4gU2hhcmVkQ3RvcigpLgotICAvLyBJdCdzIG9mdGVuIGFkdmFudGFnZW91cyB0byBkbyBzbyB0byBrZWVwICJpcyBlbXB0eV9zdHJpbmdfCi0gIC8vIGluaXRlZD8iIGNvZGUgZnJvbSBhcHBlYXJpbmcgYWxsIG92ZXIgdGhlIHBsYWNlLgotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZGVzY3JpcHRvcnM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGRlc2NyaXB0b3JzLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZmllbGQoaSkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGRfY291bnQoKTsgaisrKSB7Ci0gICAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkKGopKTsKLSAgICB9Ci0gIH0KLSAgdXNlc19zdHJpbmdfID0gZmFsc2U7Ci0gIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pICYmCi0gICAgICAhVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHVzZXNfc3RyaW5nXyA9IHRydWU7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9ycy5zaXplKCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yc1tpXTsKLSAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgewotICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgICAgZGVmYXVsdDogdXNlc19zdHJpbmdfID0gdHJ1ZTsgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfVxuIgotICAgICJwcml2YXRlOlxuIgotICAgICJ2b2lkIFNoYXJlZEN0b3IoKTtcbiIKLSAgICAidm9pZCBTaGFyZWREdG9yKCk7XG4iCi0gICAgInZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7XG4iCi0gICAgInZvaWQgSW50ZXJuYWxTd2FwKCRjbGFzc25hbWUkKiBvdGhlcik7XG4iLAotICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInByb3RlY3RlZDpcbiIKLSAgICAgICJleHBsaWNpdCAkY2xhc3NuYW1lJCg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7XG4iCi0gICAgICAicHJpdmF0ZTpcbiIKLSAgICAgICJzdGF0aWMgdm9pZCBBcmVuYUR0b3Iodm9pZCogb2JqZWN0KTtcbiIKLSAgICAgICJpbmxpbmUgdm9pZCBSZWdpc3RlckFyZW5hRHRvcig6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICB9Ci0KLSAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJwcml2YXRlOlxuIgotICAgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHtcbiIKLSAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7XG4iCi0gICAgICAifVxuIgotICAgICAgImlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3Qge1xuIgotICAgICAgIiAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJwdWJsaWM6XG4iCi0gICAgICAiXG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJwcml2YXRlOlxuIgotICAgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHtcbiIKLSAgICAgICIgIHJldHVybiBfYXJlbmFfcHRyXztcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7XG4iCi0gICAgICAiICByZXR1cm4gX2FyZW5hX3B0cl87XG4iCi0gICAgICAifVxuIgotICAgICAgInB1YmxpYzpcbiIKLSAgICAgICJcbiIpOwotICB9Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDtcbiIKLSAgICAgICJcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIjo6c3RkOjpzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDtcbiIKLSAgICAgICJcbiIpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIi8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iCi0gICAgIlxuIik7Ci0KLSAgLy8gSW1wb3J0IGFsbCBuZXN0ZWQgbWVzc2FnZSBjbGFzc2VzIGludG8gdGhpcyBjbGFzcydzIHNjb3BlIHdpdGggdHlwZWRlZnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IERlc2NyaXB0b3IqIG5lc3RlZF90eXBlID0gZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpOwotICAgIGlmICghSXNNYXBFbnRyeU1lc3NhZ2UobmVzdGVkX3R5cGUpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgidHlwZWRlZiAkbmVzdGVkX2Z1bGxfbmFtZSQgJG5lc3RlZF9uYW1lJDtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAibmVzdGVkX25hbWUiLCBuZXN0ZWRfdHlwZS0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgIm5lc3RlZF9mdWxsX25hbWUiLCBDbGFzc05hbWUobmVzdGVkX3R5cGUsIGZhbHNlKSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpID4gMCkgewotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICB9Ci0KLSAgLy8gSW1wb3J0IGFsbCBuZXN0ZWQgZW51bXMgYW5kIHRoZWlyIHZhbHVlcyBpbnRvIHRoaXMgY2xhc3MncyBzY29wZSB3aXRoCi0gIC8vIHR5cGVkZWZzIGFuZCBjb25zdGFudHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVN5bWJvbEltcG9ydHMocHJpbnRlcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKLSAgICAiXG4iKTsKLQotICAvLyBHZW5lcmF0ZSBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzLgotICBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7Ci0KLSAgLy8gRGVjbGFyZSBleHRlbnNpb24gaWRlbnRpZmllcnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVjbGFyYXRpb24ocHJpbnRlcik7Ci0gIH0KLQotCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAotICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotCi0gIC8vIEdlbmVyYXRlIHByaXZhdGUgbWVtYmVycy4KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgiIHByaXZhdGU6XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgLy8gc2V0X2hhc18qKiooKSBnZW5lcmF0ZWQgaW4gYWxsIHByb3RvMS8yIGNvZGUgYW5kIGluIG9uZW9mcyAob25seSkgZm9yCi0gICAgICAvLyBtZXNzYWdlcyB3aXRob3V0IHRydWUgZmllbGQgcHJlc2VuY2UuCi0gICAgICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSB8fAotICAgICAgICAgIGRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJpbmxpbmUgdm9pZCBzZXRfaGFzXyRuYW1lJCgpO1xuIiwKLSAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKLSAgICAgIH0KLSAgICAgIC8vIGNsZWFyX2hhc18qKiooKSBnZW5lcmF0ZWQgb25seSBmb3Igbm9uLW9uZW9mIGZpZWxkcwotICAgICAgLy8gaW4gcHJvdG8xLzIuCi0gICAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpICYmCi0gICAgICAgICAgSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiaW5saW5lIHZvaWQgY2xlYXJfaGFzXyRuYW1lJCgpO1xuIiwKLSAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0KLSAgLy8gR2VuZXJhdGUgb25lb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJpbmxpbmUgYm9vbCBoYXNfJG9uZW9mX25hbWUkKCkgY29uc3Q7XG4iCi0gICAgICAgICJ2b2lkIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgICAiaW5saW5lIHZvaWQgY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuXG4iLAotICAgICAgICAib25lb2ZfbmFtZSIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpOwotICB9Ci0KLSAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pICYmCi0gICAgICAhZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCi0gICAgICBudW1fcmVxdWlyZWRfZmllbGRzXyA+IDEpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIi8vIGhlbHBlciBmb3IgQnl0ZVNpemUoKVxuIgotICAgICAgICAiaW50IFJlcXVpcmVkRmllbGRzQnl0ZVNpemVGYWxsYmFjaygpIGNvbnN0O1xuXG4iKTsKLSAgfQotCi0gIC8vIFByZXBhcmUgZGVjbHMgZm9yIF9jYWNoZWRfc2l6ZV8gYW5kIF9oYXNfYml0c18uICBUaGVpciBwb3NpdGlvbiBpbiB0aGUKLSAgLy8gb3V0cHV0IHdpbGwgYmUgZGV0ZXJtaW5lZCBsYXRlci4KLQotICBib29sIG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSA9IHRydWU7Ci0gIC8vIFRPRE8oa2VudG9uKTogIE1ha2UgX2NhY2hlZF9zaXplXyBhbiBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KLSAgY29uc3Qgc3RyaW5nIGNhY2hlZF9zaXplX2RlY2wgPSAibXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXztcbiI7Ci0KLSAgLy8gVE9ETyhqaWVsdW8pIC0gT3B0aW1pemUgX2hhc19iaXRzXyBmb3IgcmVwZWF0ZWQgYW5kIG9uZW9mIGZpZWxkcy4KLSAgc2l6ZV90IHNpemVvZl9oYXNfYml0cyA9IChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSArIDMxKSAvIDMyICogNDsKLSAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpID09IDApIHsKLSAgICAvLyBaZXJvLXNpemUgYXJyYXlzIGFyZW4ndCB0ZWNobmljYWxseSBhbGxvd2VkLCBhbmQgTVNWQyBpbiBwYXJ0aWN1bGFyCi0gICAgLy8gZG9lc24ndCBsaWtlIHRoZW0uICBXZSBzdGlsbCBuZWVkIHRvIGRlY2xhcmUgdGhlc2UgYXJyYXlzIHRvIG1ha2UKLSAgICAvLyBvdGhlciBjb2RlIGNvbXBpbGUuICBTaW5jZSB0aGlzIGlzIGFuIHVuY29tbW9uIGNhc2UsIHdlJ2xsIGp1c3QgZGVjbGFyZQotICAgIC8vIHRoZW0gd2l0aCBzaXplIDEgYW5kIHdhc3RlIHNvbWUgc3BhY2UuICBPaCB3ZWxsLgotICAgIHNpemVvZl9oYXNfYml0cyA9IDQ7Ci0gIH0KLSAgY29uc3Qgc3RyaW5nIGhhc19iaXRzX2RlY2wgPSBzaXplb2ZfaGFzX2JpdHMgPT0gMCA/ICIiIDoKLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyIgKyBTaW1wbGVJdG9hKHNpemVvZl9oYXNfYml0cyAvIDQpICsgIl07XG4iOwotCi0KLSAgLy8gVG8gbWluaW1pemUgcGFkZGluZywgZGF0YSBtZW1iZXJzIGFyZSBkaXZpZGVkIGludG8gdGhyZWUgc2VjdGlvbnM6Ci0gIC8vICgxKSBtZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gOCBieXRlcwotICAvLyAoMikgbWVtYmVycyBjb3JyZXNwb25kaW5nIHRvIG1lc3NhZ2UgZmllbGRzLCByZS1vcmRlcmVkIHRvIG9wdGltaXplCi0gIC8vICAgICBhbGlnbm1lbnQuCi0gIC8vICgzKSBtZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gNCBieXRlcy4KLQotICAvLyBNZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gOCBieXRlczoKLQotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187XG4iCi0gICAgICAiXG4iKTsKLSAgfQotCi0gIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgX3Vua25vd25fZmllbGRzXztcbiIKLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBfYXJlbmFfcHRyXztcbiIKLSAgICAgICJcbiIpOwotICB9Ci0KLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImZyaWVuZCBjbGFzcyA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hO1xuIgotICAgICAgInR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87XG4iCi0gICAgICAidHlwZWRlZiB2b2lkIERlc3RydWN0b3JTa2lwcGFibGVfO1xuIik7Ci0gIH0KLQotICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIC8vIF9oYXNfYml0c18gaXMgZnJlcXVlbnRseSBhY2Nlc3NlZCwgc28gdG8gcmVkdWNlIGNvZGUgc2l6ZSBhbmQgaW1wcm92ZQotICAgIC8vIHNwZWVkLCBpdCBzaG91bGQgYmUgY2xvc2UgdG8gdGhlIHN0YXJ0IG9mIHRoZSBvYmplY3QuICBCdXQsIHRyeSBub3QgdG8KLSAgICAvLyB3YXN0ZSBzcGFjZTpfaGFzX2JpdHNfIGJ5IGl0c2VsZiBhbHdheXMgbWFrZXMgc2Vuc2UgaWYgaXRzIHNpemUgaXMgYQotICAgIC8vIG11bHRpcGxlIG9mIDgsIGJ1dCwgb3RoZXJ3aXNlLCBtYXliZSBfaGFzX2JpdHNfIGFuZCBjYWNoZWRfc2l6ZV8gdG9nZXRoZXIKLSAgICAvLyB3aWxsIHdvcmsgd2VsbC4KLSAgICBwcmludGVyLT5QcmludChoYXNfYml0c19kZWNsLmNfc3RyKCkpOwotICAgIGlmICgoc2l6ZW9mX2hhc19iaXRzICUgOCkgIT0gMCkgewotICAgICAgcHJpbnRlci0+UHJpbnQoY2FjaGVkX3NpemVfZGVjbC5jX3N0cigpKTsKLSAgICAgIG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSA9IGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBXaXRob3V0IGZpZWxkIHByZXNlbmNlLCB3ZSBuZWVkIGFub3RoZXIgd2F5IHRvIGRpc2FtYmlndWF0ZSB0aGUgZGVmYXVsdAotICAgIC8vIGluc3RhbmNlLCBiZWNhdXNlIHRoZSBkZWZhdWx0IGluc3RhbmNlJ3Mgc3VibWVzc2FnZSBmaWVsZHMgKGlmIGFueSkgc3RvcmUKLSAgICAvLyBwb2ludGVycyB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZXMgb2YgdGhlIHN1Ym1lc3NhZ2VzIGV2ZW4gd2hlbiB0aGV5Ci0gICAgLy8gYXJlbid0IHByZXNlbnQuIEFsdGVybmF0aXZlcyB0byB0aGlzIGFwcHJvYWNoIG1pZ2h0IGJlIHRvIChpKSB1c2UgYQotICAgIC8vIHRhZ2dlZCBwb2ludGVyIG9uIGFsbCBtZXNzYWdlIGZpZWxkcywgc2V0dGluZyBhIHRhZyBiaXQgZm9yICJub3QgcmVhbGx5Ci0gICAgLy8gcHJlc2VudCwganVzdCBkZWZhdWx0IGluc3RhbmNlIjsgb3IgKGlpKSBjb21wYXJpbmcgfHRoaXN8IGFnYWluc3QgdGhlCi0gICAgLy8gcmV0dXJuIHZhbHVlIGZyb20gR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OkdldFByb3RvdHlwZSgpIGluIGFsbAotICAgIC8vIGhhc18kZmllbGQkKCkgY2FsbHMuIEhvd2V2ZXIsIGJvdGggb2YgdGhlc2Ugb3B0aW9ucyBhcmUgbXVjaCBtb3JlCi0gICAgLy8gZXhwZW5zaXZlIChpbiBjb2RlIHNpemUgYW5kIENQVSBvdmVyaGVhZCkgdGhhbiBqdXN0IGNoZWNraW5nIGEgZmllbGQgaW4KLSAgICAvLyB0aGUgbWVzc2FnZS4gTG9uZy10ZXJtLCB0aGUgYmVzdCBzb2x1dGlvbiB3b3VsZCBiZSB0byByZWFyY2hpdGVjdCB0aGUKLSAgICAvLyBkZWZhdWx0IGluc3RhbmNlIGRlc2lnbiBub3QgdG8gc3RvcmUgcG9pbnRlcnMgdG8gc3VibWVzc2FnZSBkZWZhdWx0Ci0gICAgLy8gaW5zdGFuY2VzLCBhbmQgaGF2ZSByZWZsZWN0aW9uIGdldCB0aG9zZSBzb21lIG90aGVyIHdheTsgYnV0IHRoYXQgY2hhbmdlCi0gICAgLy8gd291bGQgaGF2ZSB0b28gbXVjaCBpbXBhY3Qgb24gcHJvdG8yLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImJvb2wgX2lzX2RlZmF1bHRfaW5zdGFuY2VfO1xuIik7Ci0gIH0KLQotICAvLyBGaWVsZCBtZW1iZXJzOgotCi0gIC8vIExpc3QgZmllbGRzIHdoaWNoIGRvZXNuJ3QgYmVsb25nIHRvIGFueSBvbmVvZgotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICBoYXNoX21hcDxzdHJpbmcsIGludD4gZmllbGRuYW1lX3RvX2NodW5rOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgICAgZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7Ci0gICAgICBmaWVsZG5hbWVfdG9fY2h1bmtbRmllbGROYW1lKGZpZWxkKV0gPSBpIC8gODsKLSAgICB9Ci0gIH0KLSAgT3B0aW1pemVQYWRkaW5nKCZmaWVsZHMpOwotICAvLyBFbWl0IHNvbWUgcHJpdmF0ZSBhbmQgc3RhdGljIG1lbWJlcnMKLSAgcnVuc19vZl9maWVsZHNfID0gdmVjdG9yPCB2ZWN0b3I8c3RyaW5nPiA+KDEpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07Ci0gICAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGdlbmVyYXRvciA9IGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCk7Ci0gICAgZ2VuZXJhdG9yLkdlbmVyYXRlU3RhdGljTWVtYmVycyhwcmludGVyKTsKLSAgICBnZW5lcmF0b3IuR2VuZXJhdGVQcml2YXRlTWVtYmVycyhwcmludGVyKTsKLSAgICBpZiAoQ2FuQ2xlYXJCeVplcm9pbmcoZmllbGQpKSB7Ci0gICAgICBjb25zdCBzdHJpbmcmIGZpZWxkbmFtZSA9IEZpZWxkTmFtZShmaWVsZCk7Ci0gICAgICBpZiAoIXJ1bnNfb2ZfZmllbGRzXy5iYWNrKCkuZW1wdHkoKSAmJgotICAgICAgICAgIChmaWVsZG5hbWVfdG9fY2h1bmtbcnVuc19vZl9maWVsZHNfLmJhY2soKS5iYWNrKCldICE9Ci0gICAgICAgICAgIGZpZWxkbmFtZV90b19jaHVua1tmaWVsZG5hbWVdKSkgewotICAgICAgICBydW5zX29mX2ZpZWxkc18ucHVzaF9iYWNrKHZlY3RvcjxzdHJpbmc+KCkpOwotICAgICAgfQotICAgICAgcnVuc19vZl9maWVsZHNfLmJhY2soKS5wdXNoX2JhY2soZmllbGRuYW1lKTsKLSAgICB9IGVsc2UgaWYgKCFydW5zX29mX2ZpZWxkc18uYmFjaygpLmVtcHR5KCkpIHsKLSAgICAgIHJ1bnNfb2ZfZmllbGRzXy5wdXNoX2JhY2sodmVjdG9yPHN0cmluZz4oKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9yIGVhY2ggb25lb2YgZ2VuZXJhdGUgYSB1bmlvbgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAidW5pb24gJGNhbWVsX29uZW9mX25hbWUkVW5pb24ge1xuIgotICAgICAgICAvLyBleHBsaWNpdCBlbXB0eSBjb25zdHJ1Y3RvciBpcyBuZWVkZWQgd2hlbiB1bmlvbiBjb250YWlucwotICAgICAgICAvLyBBcmVuYVN0cmluZ1B0ciBtZW1iZXJzIGZvciBzdHJpbmcgZmllbGRzLgotICAgICAgICAiICAkY2FtZWxfb25lb2ZfbmFtZSRVbmlvbigpIHt9XG4iLAotICAgICAgICAiY2FtZWxfb25lb2ZfbmFtZSIsCi0gICAgICAgIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSwgdHJ1ZSkpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgewotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT4KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZChqKSkuR2VuZXJhdGVQcml2YXRlTWVtYmVycyhwcmludGVyKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAifSAkb25lb2ZfbmFtZSRfO1xuIiwKLSAgICAgICAgIm9uZW9mX25hbWUiLCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKLSAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQoaikpLkdlbmVyYXRlU3RhdGljTWVtYmVycyhwcmludGVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gNCBieXRlczoKLQotICBpZiAobmVlZF90b19lbWl0X2NhY2hlZF9zaXplKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoY2FjaGVkX3NpemVfZGVjbC5jX3N0cigpKTsKLSAgICBuZWVkX3RvX2VtaXRfY2FjaGVkX3NpemUgPSBmYWxzZTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIF9vbmVvZl9jYXNlXy4KLSAgaWYgKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfb25lb2ZfY2FzZV9bJG9uZW9mX2RlY2xfY291bnQkXTtcbiIKLSAgICAgICJcbiIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgX2FueV9tZXRhZGF0YV8gZm9yIHRoZSBBbnkgdHlwZS4KLSAgaWYgKElzQW55TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFueU1ldGFkYXRhIF9hbnlfbWV0YWRhdGFfO1xuIik7Ci0gIH0KLQotICAvLyBEZWNsYXJlIEFkZERlc2NyaXB0b3JzKCksIEJ1aWxkRGVzY3JpcHRvcnMoKSwgYW5kIFNodXRkb3duRmlsZSgpIGFzCi0gIC8vIGZyaWVuZHMgc28gdGhhdCB0aGV5IGNhbiBhY2Nlc3MgcHJpdmF0ZSBzdGF0aWMgdmFyaWFibGVzIGxpa2UKLSAgLy8gZGVmYXVsdF9pbnN0YW5jZV8gYW5kIHJlZmxlY3Rpb25fLgotICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKLSAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAgICJmcmllbmQgdm9pZCAkZGxsZXhwb3J0X2RlY2wkICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAotICAgICAgLy8gV2l0aG91dC4KLSAgICAgICJmcmllbmQgdm9pZCAkZGxsZXhwb3J0X2RlY2wkICRhZGRkZXNjcmlwdG9yc25hbWUkX2ltcGwoKTtcbiIsCi0gICAgICAvLyBWYXJzLgotICAgICAgImRsbGV4cG9ydF9kZWNsIiwgb3B0aW9uc18uZGxsZXhwb3J0X2RlY2wsICJhZGRkZXNjcmlwdG9yc25hbWUiLAotICAgICAgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJmcmllbmQgdm9pZCAkYXNzaWduZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgotICAgICJmcmllbmQgdm9pZCAkc2h1dGRvd25maWxlbmFtZSQoKTtcbiIKLSAgICAiXG4iLAotICAgICJhc3NpZ25kZXNjcmlwdG9yc25hbWUiLAotICAgICAgR2xvYmFsQXNzaWduRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSksCi0gICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJ2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpO1xuIgotICAgICJzdGF0aWMgJGNsYXNzbmFtZSQqIGRlZmF1bHRfaW5zdGFuY2VfO1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCh2YXJzLCAifTsiKTsKLSAgR09PR0xFX0RDSEVDSyghbmVlZF90b19lbWl0X2NhY2hlZF9zaXplKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRGVwZW5kZW50SW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAvLyBtYXAgZW50cnkgbWVzc2FnZSBkb2Vzbid0IG5lZWQgaW5saW5lIG1ldGhvZHMuIFNpbmNlIG1hcCBlbnRyeSBtZXNzYWdlCi0gICAgLy8gY2Fubm90IGJlIGEgdG9wIGxldmVsIGNsYXNzLCB3ZSBqdXN0IG5lZWQgdG8gYXZvaWQgY2FsbGluZwotICAgIC8vIEdlbmVyYXRlSW5saW5lTWV0aG9kcyBoZXJlLgotICAgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKLSAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVwZW5kZW50SW5saW5lTWV0aG9kcyhwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gIH0KLQotICBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgLy8gbWFwIGVudHJ5IG1lc3NhZ2UgZG9lc24ndCBuZWVkIGlubGluZSBtZXRob2RzLiBTaW5jZSBtYXAgZW50cnkgbWVzc2FnZQotICAgIC8vIGNhbm5vdCBiZSBhIHRvcCBsZXZlbCBjbGFzcywgd2UganVzdCBuZWVkIHRvIGF2b2lkIGNhbGxpbmcKLSAgICAvLyBHZW5lcmF0ZUlubGluZU1ldGhvZHMgaGVyZS4KLSAgICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKSkgY29udGludWU7Ci0gICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUlubGluZU1ldGhvZHMocHJpbnRlciwgaXNfaW5saW5lKTsKLSAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gIH0KLQotICBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyLCBpc19pbmxpbmUpOwotCi0gIC8vIEdlbmVyYXRlIG9uZW9mX2Nhc2UoKSBmdW5jdGlvbnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbImNsYXNzX25hbWUiXSA9IGNsYXNzbmFtZV87Ci0gICAgdmFyc1siY2FtZWxfb25lb2ZfbmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgKLSAgICAgICAgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSwgdHJ1ZSk7Ci0gICAgdmFyc1sib25lb2ZfbmFtZSJdID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKTsKLSAgICB2YXJzWyJvbmVvZl9pbmRleCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+aW5kZXgoKSk7Ci0gICAgdmFyc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lICIgOiAiIjsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgdmFycywKLSAgICAgICAgIiRpbmxpbmUkIgotICAgICAgICAiJGNsYXNzX25hbWUkOjokY2FtZWxfb25lb2ZfbmFtZSRDYXNlICRjbGFzc19uYW1lJDo6IgotICAgICAgICAiJG9uZW9mX25hbWUkX2Nhc2UoKSBjb25zdCB7XG4iCi0gICAgICAgICIgIHJldHVybiAkY2xhc3NfbmFtZSQ6OiRjYW1lbF9vbmVvZl9uYW1lJENhc2UoIgotICAgICAgICAiX29uZW9mX2Nhc2VfWyRvbmVvZl9pbmRleCRdKTtcbiIKLSAgICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZURlc2NyaXB0b3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKCFJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iCi0gICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qXG4iCi0gICAgICAiICAkbmFtZSRfcmVmbGVjdGlvbl8gPSBOVUxMO1xuIiwKLSAgICAgICJuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiAkbmFtZSRfZGVzY3JpcHRvcl8gPSBOVUxMO1xuIiwKLSAgICAgICJuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBvbmVvZiBkZWZhdWx0IGluc3RhbmNlIGZvciByZWZsZWN0aW9uIHVzYWdlLgotICBpZiAoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKLSAgICBwcmludGVyLT5QcmludCgic3RydWN0ICRuYW1lJE9uZW9mSW5zdGFuY2Uge1xuIiwKLSAgICAgICAgICAgICAgICAgICAibmFtZSIsIGNsYXNzbmFtZV8pOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKLSAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIiAgIik7Ci0gICAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSB8fAotICAgICAgICAgICAgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcgJiYKLSAgICAgICAgICAgICBFZmZlY3RpdmVTdHJpbmdDVHlwZShmaWVsZCkgIT0gRmllbGRPcHRpb25zOjpTVFJJTkcpKSB7Ci0gICAgICAgICAgcHJpbnRlci0+UHJpbnQoImNvbnN0ICIpOwotICAgICAgICB9Ci0gICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVQcml2YXRlTWVtYmVycyhwcmludGVyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcmludGVyLT5QcmludCgifSogJG5hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfID0gTlVMTDtcbiIsCi0gICAgICAgICAgICAgICAgICAgIm5hbWUiLCBjbGFzc25hbWVfKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9yRGVjbGFyYXRpb25zKHByaW50ZXIpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iLAotICAgICAgIm5hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZShpKSwgZmFsc2UpKTsKLSAgfQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCBpbmRleCkgewotICAvLyBUT0RPKGtlbnRvbik6ICBQYXNzaW5nIHRoZSBpbmRleCB0byB0aGlzIG1ldGhvZCBpcyByZWR1bmRhbnQ7IGp1c3QgdXNlCi0gIC8vICAgZGVzY3JpcHRvcl8tPmluZGV4KCkgaW5zdGVhZC4KLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICB2YXJzWyJjbGFzc25hbWUiXSA9IGNsYXNzbmFtZV87Ci0gIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGluZGV4KTsKLQotICAvLyBPYnRhaW4gdGhlIGRlc2NyaXB0b3IgZnJvbSB0aGUgcGFyZW50J3MgZGVzY3JpcHRvci4KLSAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICIkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgkaW5kZXgkKTtcbiIpOwotICB9IGVsc2UgewotICAgIHZhcnNbInBhcmVudCJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwgZmFsc2UpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8gPSAiCi0gICAgICAgICIkcGFyZW50JF9kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoJGluZGV4JCk7XG4iKTsKLSAgfQotCi0gIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXykpIHJldHVybjsKLQotICAvLyBHZW5lcmF0ZSB0aGUgb2Zmc2V0cy4KLSAgR2VuZXJhdGVPZmZzZXRzKHByaW50ZXIpOwotCi0gIGNvbnN0IGJvb2wgcGFzc19wb29sX2FuZF9mYWN0b3J5ID0gZmFsc2U7Ci0gIHZhcnNbImZuIl0gPSBwYXNzX3Bvb2xfYW5kX2ZhY3RvcnkgPwotICAgICAgIm5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiIgOgotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIgotICAgICAgIjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24iOwotICAvLyBDb25zdHJ1Y3QgdGhlIHJlZmxlY3Rpb24gb2JqZWN0LgotICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICIkY2xhc3NuYW1lJF9yZWZsZWN0aW9uXyA9XG4iCi0gICAgIiAgJGZuJChcbiIKLSAgICAiICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfLFxuIgotICAgICIgICAgJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfLFxuIgotICAgICIgICAgJGNsYXNzbmFtZSRfb2Zmc2V0c18sXG4iKTsKLSAgaWYgKCFIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgLy8gSWYgd2UgZG9uJ3QgaGF2ZSBmaWVsZCBwcmVzZW5jZSwgdGhlbiBfaGFzX2JpdHNfIGRvZXMgbm90IGV4aXN0LgotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiAgICAtMSxcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCRjbGFzc25hbWUkLCBfaGFzX2JpdHNfWzBdKSxcbiIpOwotICB9Ci0KLSAgLy8gVW5rbm93biBmaWVsZCBvZmZzZXQ6IGVpdGhlciBwb2ludHMgdG8gdGhlIHVua25vd24gZmllbGQgc2V0IGlmIGVtYmVkZGVkCi0gIC8vIGRpcmVjdGx5LCBvciBpbmRpY2F0ZXMgdGhhdCB0aGUgdW5rbm93biBmaWVsZCBzZXQgaXMgc3RvcmVkIGFzIHBhcnQgb2YgdGhlCi0gIC8vIGludGVybmFsIG1ldGFkYXRhIGlmIG5vdC4KLSAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICIgICAgLTEsXG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCi0gICAgICAiJGNsYXNzbmFtZSQsIF91bmtub3duX2ZpZWxkc18pLFxuIik7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoIgotICAgICAgICAiJGNsYXNzbmFtZSQsIF9leHRlbnNpb25zXyksXG4iKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBObyBleHRlbnNpb25zLgotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiICAgIC0xLFxuIik7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICIgICAgJGNsYXNzbmFtZSRfZGVmYXVsdF9vbmVvZl9pbnN0YW5jZV8sXG4iCi0gICAgIiAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCIKLSAgICAgICIkY2xhc3NuYW1lJCwgX29uZW9mX2Nhc2VfWzBdKSxcbiIpOwotICB9Ci0KLSAgaWYgKHBhc3NfcG9vbF9hbmRfZmFjdG9yeSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksXG4iKTsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksXG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiAgICBzaXplb2YoJGNsYXNzbmFtZSQpLFxuIik7Ci0KLSAgLy8gQXJlbmEgb2Zmc2V0OiBlaXRoZXIgYW4gb2Zmc2V0IHRvIHRoZSBtZXRhZGF0YSBzdHJ1Y3QgdGhhdCBjb250YWlucyB0aGUKLSAgLy8gYXJlbmEgcG9pbnRlciBhbmQgdW5rbm93biBmaWVsZCBzZXQgKGluIGEgc3BhY2UtZWZmaWNpZW50IHdheSkgaWYgd2UgdXNlCi0gIC8vIHRoYXQgaW1wbGVtZW50YXRpb24gc3RyYXRlZ3ksIG9yIGFuIG9mZnNldCBkaXJlY3RseSB0byB0aGUgYXJlbmEgcG9pbnRlciBpZgotICAvLyBub3QgKGJlY2F1c2UgZS5nLiB3ZSBkb24ndCBoYXZlIGFuIHVua25vd24gZmllbGQgc2V0KS4KLSAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCi0gICAgIiRjbGFzc25hbWUkLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSxcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCIKLSAgICAiJGNsYXNzbmFtZSQsIF9hcmVuYV8pLFxuIik7Ci0gIH0KLQotICAvLyBpc19kZWZhdWx0X2luc3RhbmNlXyBvZmZzZXQuCi0gIGlmIChIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAiICAgIC0xKTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCIKLSAgICAiJGNsYXNzbmFtZSQsIF9pc19kZWZhdWx0X2luc3RhbmNlXykpO1xuIik7Ci0gIH0KLQotICAvLyBIYW5kbGUgbmVzdGVkIHR5cGVzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKHByaW50ZXIsIGkpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKHByaW50ZXIsIGkpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVR5cGVSZWdpc3RyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIFJlZ2lzdGVyIHRoaXMgbWVzc2FnZSB0eXBlIHdpdGggdGhlIG1lc3NhZ2UgZmFjdG9yeS4KLSAgaWYgKCFJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZShcbiIKLSAgICAgICIgICAgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8sICYkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0KLSAgZWxzZSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIENvbGxlY3RNYXBJbmZvKGRlc2NyaXB0b3JfLCAmdmFycyk7Ci0gICAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOwotCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWwgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOwotICAgIGlmIChkZXNjcmlwdG9yXy0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMiAmJgotICAgICAgICB2YWwtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSkgewotICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVmYXVsdF92YWx1ZSA9IHZhbC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCk7Ci0gICAgICB2YXJzWyJkZWZhdWx0X2VudW1fdmFsdWUiXSA9IEludDMyVG9TdHJpbmcoZGVmYXVsdF92YWx1ZS0+bnVtYmVyKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICB2YXJzWyJkZWZhdWx0X2VudW1fdmFsdWUiXSA9ICIwIjsKLSAgICB9Ci0KLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKFxuIgotICAgICAgIiAgICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfLFxuIgotICAgICAgIiAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok1hcEVudHJ5PFxuIgotICAgICAgIiAgICAgICAgICAka2V5JCxcbiIKLSAgICAgICIgICAgICAgICAgJHZhbCQsXG4iCi0gICAgICAiICAgICAgICAgICRrZXlfd2lyZV90eXBlJCxcbiIKLSAgICAgICIgICAgICAgICAgJHZhbF93aXJlX3R5cGUkLFxuIgotICAgICAgIiAgICAgICAgICAkZGVmYXVsdF9lbnVtX3ZhbHVlJD46OkNyZWF0ZURlZmF1bHRJbnN0YW5jZShcbiIKLSAgICAgICIgICAgICAgICAgICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfKSk7XG4iKTsKLSAgfQotCi0gIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVUeXBlUmVnaXN0cmF0aW9ucyhwcmludGVyKTsKLSAgfQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gQ29uc3RydWN0IHRoZSBkZWZhdWx0IGluc3RhbmNlcyBvZiBhbGwgZmllbGRzLCBhcyB0aGV5IHdpbGwgYmUgdXNlZAotICAvLyB3aGVuIGNyZWF0aW5nIHRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBlbnRpcmUgbWVzc2FnZS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUFsbG9jYXRvcihwcmludGVyKTsKLSAgfQotCi0gIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXykpIHJldHVybjsKLQotICAvLyBDb25zdHJ1Y3QgdGhlIGRlZmF1bHQgaW5zdGFuY2UuICBXZSBjYW4ndCBjYWxsIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHlldAotICAvLyBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlIGFsbCBkZWZhdWx0IGluc3RhbmNlcyB0aGF0IHRoaXMgb25lIG1pZ2h0Ci0gIC8vIGRlcGVuZCBvbiBhcmUgY29uc3RydWN0ZWQgZmlyc3QuCi0gIHByaW50ZXItPlByaW50KAotICAgICIkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgJGNsYXNzbmFtZSQoKTtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotCi0gIGlmICgoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSA+IDApICYmCi0gICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAiJGNsYXNzbmFtZSRfZGVmYXVsdF9vbmVvZl9pbnN0YW5jZV8gPSBuZXcgJGNsYXNzbmFtZSRPbmVvZkluc3RhbmNlKCk7XG4iLAotICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgfQotCi0gIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IocHJpbnRlcik7Ci0gIH0KLQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAiJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotCi0gIC8vIFJlZ2lzdGVyIGV4dGVuc2lvbnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlUmVnaXN0cmF0aW9uKHByaW50ZXIpOwotICB9Ci0KLSAgLy8gSGFuZGxlIG5lc3RlZCB0eXBlcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgLy8gbWFwIGVudHJ5IG1lc3NhZ2UgZG9lc24ndCBuZWVkIHRvIGluaXRpYWxpemUgZGVmYXVsdCBpbnN0YW5jZSBtYW51YWxseS4KLSAgICAvLyBTaW5jZSBtYXAgZW50cnkgbWVzc2FnZSBjYW5ub3QgYmUgYSB0b3AgbGV2ZWwgY2xhc3MsIHdlIGp1c3QgbmVlZCB0bwotICAgIC8vIGF2b2lkIGNhbGxpbmcgRGVmYXVsdEluc3RhbmNlSW5pdGlhbGl6ZXIgaGVyZS4KLSAgICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKSkgY29udGludWU7Ci0gICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUluaXRpYWxpemVyKHByaW50ZXIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNodXRkb3duQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAiZGVsZXRlICRjbGFzc25hbWUkOjpkZWZhdWx0X2luc3RhbmNlXztcbiIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotCi0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBpZiAoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiZGVsZXRlICRjbGFzc25hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfO1xuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJkZWxldGUgJGNsYXNzbmFtZSRfcmVmbGVjdGlvbl87XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICB9Ci0KLSAgLy8gSGFuZGxlIGRlZmF1bHQgaW5zdGFuY2VzIG9mIGZpZWxkcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZVNodXRkb3duQ29kZShwcmludGVyKTsKLSAgfQotCi0gIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKLSAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlU2h1dGRvd25Db2RlKHByaW50ZXIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUNsYXNzTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICAvLyBtdXRhYmxlX3Vua25vd25fZmllbGRzIHdyYXBwZXIgZnVuY3Rpb24gZm9yIExhenlTdHJpbmdPdXRwdXRTdHJlYW0KLSAgLy8gY2FsbGJhY2suCi0gIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pICYmCi0gICAgICAhVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAic3RhdGljIDo6c3RkOjpzdHJpbmcqIE11dGFibGVVbmtub3duRmllbGRzRm9yJGNsYXNzbmFtZSQoXG4iCi0gICAgICAgICIgICAgJGNsYXNzbmFtZSQqIHB0cikge1xuIgotICAgICAgICAiICByZXR1cm4gcHRyLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7XG4iCi0gICAgICAgICJ9XG4iCi0gICAgICAgICJcbiIsCi0gICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgfQotICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlBhY2tGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbWVzc2FnZSkge1xuIgotICAgICAgIiAgX2FueV9tZXRhZGF0YV8uUGFja0Zyb20obWVzc2FnZSk7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIgotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlBhY2tGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbWVzc2FnZSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiB0eXBlX3VybF9wcmVmaXgpIHtcbiIKLSAgICAgICIgIF9hbnlfbWV0YWRhdGFfLlBhY2tGcm9tKG1lc3NhZ2UsIHR5cGVfdXJsX3ByZWZpeCk7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIgotICAgICAgImJvb2wgJGNsYXNzbmFtZSQ6OlVucGFja1RvKDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSkgY29uc3Qge1xuIgotICAgICAgIiAgcmV0dXJuIF9hbnlfbWV0YWRhdGFfLlVucGFja1RvKG1lc3NhZ2UpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVNZXRob2RzKHByaW50ZXIpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgLy8gbWFwIGVudHJ5IG1lc3NhZ2UgZG9lc24ndCBuZWVkIGNsYXNzIG1ldGhvZHMuIFNpbmNlIG1hcCBlbnRyeSBtZXNzYWdlCi0gICAgLy8gY2Fubm90IGJlIGEgdG9wIGxldmVsIGNsYXNzLCB3ZSBqdXN0IG5lZWQgdG8gYXZvaWQgY2FsbGluZwotICAgIC8vIEdlbmVyYXRlQ2xhc3NNZXRob2RzIGhlcmUuCi0gICAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkpIGNvbnRpbnVlOwotICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc01ldGhvZHMocHJpbnRlcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOwotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgbm9uLWlubGluZSBmaWVsZCBkZWZpbml0aW9ucy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMocHJpbnRlcik7Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBmaWVsZCBudW1iZXIgY29uc3RhbnRzLgotICBwcmludGVyLT5QcmludCgiI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwXG4iKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJjb25zdCBpbnQgJGNsYXNzbmFtZSQ6OiRjb25zdGFudF9uYW1lJDtcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKEZpZWxkU2NvcGUoZmllbGQpLCBmYWxzZSksCi0gICAgICAiY29uc3RhbnRfbmFtZSIsIEZpZWxkQ29uc3RhbnROYW1lKGZpZWxkKSk7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDBcbiIKLSAgICAiXG4iKTsKLQotICAvLyBEZWZpbmUgZXh0ZW5zaW9uIGlkZW50aWZpZXJzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlZmluaXRpb24ocHJpbnRlcik7Ci0gIH0KLQotICBHZW5lcmF0ZVN0cnVjdG9ycyhwcmludGVyKTsKLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0KLSAgaWYgKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7Ci0gICAgR2VuZXJhdGVPbmVvZkNsZWFyKHByaW50ZXIpOwotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICB9Ci0KLSAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgR2VuZXJhdGVDbGVhcihwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAgIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0ocHJpbnRlcik7Ci0gICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0KLSAgICBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAgIGlmIChIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHByaW50ZXIpOwotICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgfQotCi0gICAgR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAgIEdlbmVyYXRlTWVyZ2VGcm9tKHByaW50ZXIpOwotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotCi0gICAgR2VuZXJhdGVDb3B5RnJvbShwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAgIEdlbmVyYXRlSXNJbml0aWFsaXplZChwcmludGVyKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgfQotCi0gIEdlbmVyYXRlU3dhcChwcmludGVyKTsKLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgJGNsYXNzbmFtZSQ6OkdldE1ldGFkYXRhKCkgY29uc3Qge1xuIgotICAgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iCi0gICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhO1xuIgotICAgICAgIiAgbWV0YWRhdGEuZGVzY3JpcHRvciA9ICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfO1xuIgotICAgICAgIiAgbWV0YWRhdGEucmVmbGVjdGlvbiA9ICRjbGFzc25hbWUkX3JlZmxlY3Rpb25fO1xuIgotICAgICAgIiAgcmV0dXJuIG1ldGFkYXRhO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiOjpzdGQ6OnN0cmluZyAkY2xhc3NuYW1lJDo6R2V0VHlwZU5hbWUoKSBjb25zdCB7XG4iCi0gICAgICAiICByZXR1cm4gXCIkdHlwZV9uYW1lJFwiO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKLSAgICAgICJ0eXBlX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotICB9Ci0KLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlT2Zmc2V0cyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgic3RhdGljIGNvbnN0IGludCAkY2xhc3NuYW1lJF9vZmZzZXRzX1skZmllbGRfY291bnQkXSA9IHtcbiIsCi0gICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLCAiZmllbGRfY291bnQiLAotICAgICAgICAgICAgICAgICBTaW1wbGVJdG9hKHN0ZDo6bWF4KDEsIGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSkpKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIlBST1RPMl9HRU5FUkFURURfREVGQVVMVF9PTkVPRl9GSUVMRF9PRkZTRVQoIgotICAgICAgICAgICIkY2xhc3NuYW1lJF9kZWZhdWx0X29uZW9mX2luc3RhbmNlXywgJG5hbWUkXyksXG4iLAotICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAotICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCRjbGFzc25hbWUkLCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiRuYW1lJF8pLFxuIiwKLSAgICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKLSAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwotICAgIH0KLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIkdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoJGNsYXNzbmFtZSQsICRuYW1lJF8pLFxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAotICAgICAgIm5hbWUiLCBvbmVvZi0+bmFtZSgpKTsKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn07XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2hhcmVkQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ2b2lkICRjbGFzc25hbWUkOjpTaGFyZWRDdG9yKCkge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIGlmICghSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiAgX2lzX2RlZmF1bHRfaW5zdGFuY2VfID0gZmFsc2U7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KFN0ckNhdCgKLSAgICAgIHVzZXNfc3RyaW5nXyA/ICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpO1xuIiA6ICIiLAotICAgICAgIl9jYWNoZWRfc2l6ZV8gPSAwO1xuIikuY19zdHIoKSk7Ci0KLSAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykgJiYKLSAgICAgICFVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJfdW5rbm93bl9maWVsZHNfLlVuc2FmZVNldERlZmF1bHQoXG4iCi0gICAgICAgICIgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTtcbiIpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKCFkZXNjcmlwdG9yXy0+ZmllbGQoaSktPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAuR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUocHJpbnRlcik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICI6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpO1xuIik7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuIiwKLSAgICAgICAgIm9uZW9mX25hbWUiLCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKTsKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNoYXJlZERlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ2b2lkICRjbGFzc25hbWUkOjpTaGFyZWREdG9yKCkge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgLy8gRG8gbm90aGluZyB3aGVuIHRoZSBtZXNzYWdlIGlzIGFsbG9jYXRlZCBpbiBhbiBhcmVuYS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJpZiAoR2V0QXJlbmFOb1ZpcnR1YWwoKSAhPSBOVUxMKSB7XG4iCi0gICAgICAiICByZXR1cm47XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIik7Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgZGVzY3RydWN0b3IgZm9yIF91bmtub3duX2ZpZWxkc18gaW4gbGl0ZSBydW50aW1lLgotICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSAmJgotICAgICAgIVVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiX3Vua25vd25fZmllbGRzXy5EZXN0cm95KFxuIgotICAgICAgICAgICIgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLFxuIgotICAgICAgICAgICIgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIl91bmtub3duX2ZpZWxkc18uRGVzdHJveU5vQXJlbmEoXG4iCi0gICAgICAgICAgIiAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpO1xuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gV3JpdGUgdGhlIGRlc3RydWN0b3JzIGZvciBlYWNoIGZpZWxkIGV4Y2VwdCBvbmVvZiBtZW1iZXJzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQotICAgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKLSAgICB9Ci0gIH0KLQotICAvLyBHZW5lcmF0ZSBjb2RlIHRvIGRlc3RydWN0IG9uZW9mcy4gQ2xlYXJpbmcgc2hvdWxkIGRvIHRoZSB3b3JrLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaWYgKGhhc18kb25lb2ZfbmFtZSQoKSkge1xuIgotICAgICAgICAiICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICAgIn1cbiIsCi0gICAgICAgICJvbmVvZl9uYW1lIiwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSk7Ci0gIH0KLQotICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKLSAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAgICJpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykge1xuIiwKLSAgICAgIC8vIFdpdGhvdXQuCi0gICAgICAiaWYgKHRoaXMgIT0gJmRlZmF1bHRfaW5zdGFuY2UoKSkge1xuIik7Ci0KLSAgLy8gV2UgbmVlZCB0byBkZWxldGUgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzLgotICAvLyBUT0RPKGtlbnRvbik6ICBJZiB3ZSBtYWtlIHVuc2V0IG1lc3NhZ2VzIHBvaW50IGF0IGRlZmF1bHQgaW5zdGFuY2VzCi0gIC8vICAgaW5zdGVhZCBvZiBOVUxMLCB0aGVuIGl0IHdvdWxkIG1ha2Ugc2Vuc2UgdG8gbW92ZSB0aGlzIGNvZGUgaW50bwotICAvLyAgIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVEZXN0cnVjdG9yQ29kZSgpLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotCi0gICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJgotICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgLy8gU2tpcCBvbmVvZiBtZW1iZXJzCi0gICAgICBpZiAoIWZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAiICBkZWxldGUgJG5hbWUkXztcbiIsCi0gICAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgfVxuIgotICAgICJ9XG4iCi0gICAgIlxuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUFyZW5hRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gR2VuZXJhdGUgdGhlIEFyZW5hRHRvcigpIG1ldGhvZC4gVHJhY2sgd2hldGhlciBhbnkgZmllbGRzIGFjdHVhbGx5IHByb2R1Y2VkCi0gIC8vIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBjYWxsZWQuCi0gIHByaW50ZXItPlByaW50KAotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkFyZW5hRHRvcih2b2lkKiBvYmplY3QpIHtcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIC8vIFRoaXMgY29kZSBpcyBwbGFjZWQgaW5zaWRlIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gYW4gb3JkaW5hcnkgb25lLAotICAvLyBzaW5jZSB0aGF0IHNpbXBsaWZpZXMgQXJlbmEncyBkZXN0cnVjdG9yIGxpc3QgKG9yZGluYXJ5IGZ1bmN0aW9uIHBvaW50ZXJzCi0gIC8vIHJhdGhlciB0aGFuIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycykuIF90aGlzIGlzIHRoZSBvYmplY3QgYmVpbmcKLSAgLy8gZGVzdHJ1Y3RlZC4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiJGNsYXNzbmFtZSQqIF90aGlzID0gcmVpbnRlcnByZXRfY2FzdDwgJGNsYXNzbmFtZSQqID4ob2JqZWN0KTtcbiIKLSAgICAgIC8vIGF2b2lkIGFuICJ1bnVzZWQgdmFyaWFibGUiIHdhcm5pbmcgaW4gY2FzZSBubyBmaWVsZHMgaGF2ZSBkdG9yIGNvZGUuCi0gICAgICAiKHZvaWQpX3RoaXM7XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotCi0gIGJvb2wgbmVlZF9yZWdpc3RyYXRpb24gPSBmYWxzZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShwcmludGVyKSkgewotICAgICAgbmVlZF9yZWdpc3RyYXRpb24gPSB0cnVlOwotICAgIH0KLSAgfQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICAgIn1cbiIpOwotCi0gIGlmIChuZWVkX3JlZ2lzdHJhdGlvbikgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OlJlZ2lzdGVyQXJlbmFEdG9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSB7XG4iCi0gICAgICAgICIgIGlmIChhcmVuYSAhPSBOVUxMKSB7XG4iCi0gICAgICAgICIgICAgYXJlbmEtPk93bkN1c3RvbURlc3RydWN0b3IodGhpcywgJiRjbGFzc25hbWUkOjpBcmVuYUR0b3IpO1xuIgotICAgICAgICAiICB9XG4iCi0gICAgICAgICJ9XG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpSZWdpc3RlckFyZW5hRHRvcig6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkge1xuIgotICAgICAgICAifVxuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVN0cnVjdG9ycyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBzdHJpbmcgc3VwZXJjbGFzczsKLSAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8pIHsKLSAgICBzdXBlcmNsYXNzID0KLSAgICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfKSArICI8IiArIGNsYXNzbmFtZV8gKyAiPiI7Ci0gIH0gZWxzZSB7Ci0gICAgc3VwZXJjbGFzcyA9IFN1cGVyQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCBvcHRpb25zXyk7Ci0gIH0KLSAgc3RyaW5nIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgPSBzdXBlcmNsYXNzICsgIigpIjsKLQotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgKz0gIixcbiAgX2V4dGVuc2lvbnNfKGFyZW5hKSI7Ci0gIH0KLQotICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgKz0gIixcbiAgX2ludGVybmFsX21ldGFkYXRhXyhhcmVuYSkiOwotICB9IGVsc2UgewotICAgIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgKz0gIixcbiAgX2FyZW5hX3B0cl8oYXJlbmEpIjsKLSAgfQotCi0gIC8vIEluaXRpYWxpemUgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIGFyZW5hIGNvbnN0cnVjdG9yLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBib29sIGhhc19hcmVuYV9jb25zdHJ1Y3RvciA9IGRlc2NyaXB0b3JfLT5maWVsZChpKS0+aXNfcmVwZWF0ZWQoKTsKLSAgICBpZiAoaGFzX2FyZW5hX2NvbnN0cnVjdG9yKSB7Ci0gICAgICBpbml0aWFsaXplcl93aXRoX2FyZW5hICs9IHN0cmluZygiLFxuICAiKSArCi0gICAgICAgICAgRmllbGROYW1lKGRlc2NyaXB0b3JfLT5maWVsZChpKSkgKyBzdHJpbmcoIl8oYXJlbmEpIik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKElzQW55TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKLSAgICBpbml0aWFsaXplcl93aXRoX2FyZW5hICs9ICIsXG4gIF9hbnlfbWV0YWRhdGFfKCZ0eXBlX3VybCwgJnZhbHVlXykiOwotICB9Ci0KLSAgc3RyaW5nIGluaXRpYWxpemVyX251bGw7Ci0gIGluaXRpYWxpemVyX251bGwgPSAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSA/Ci0gICAgIiwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSIgOiAiLCBfYXJlbmFfcHRyXyhOVUxMKSIpOwotICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgewotICAgIGluaXRpYWxpemVyX251bGwgKz0gIiwgX2FueV9tZXRhZGF0YV8oJnR5cGVfdXJsXywgJnZhbHVlXykiOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiJGNsYXNzbmFtZSQ6OiRjbGFzc25hbWUkKClcbiIKLSAgICAgICIgIDogJHN1cGVyY2xhc3MkKCkkaW5pdGlhbGl6ZXIkIHtcbiIKLSAgICAgICIgIFNoYXJlZEN0b3IoKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3RvcjokZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCi0gICAgICAic3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MsCi0gICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpLAotICAgICAgImluaXRpYWxpemVyIiwgaW5pdGlhbGl6ZXJfbnVsbCk7Ci0KLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiXG4iCi0gICAgICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpXG4iCi0gICAgICAgICIgIDogJGluaXRpYWxpemVyJCB7XG4iCi0gICAgICAgICIgIFNoYXJlZEN0b3IoKTtcbiIKLSAgICAgICAgIiAgUmVnaXN0ZXJBcmVuYUR0b3IoYXJlbmEpO1xuIgotICAgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAgICJ9XG4iLAotICAgICAgICAiaW5pdGlhbGl6ZXIiLCBpbml0aWFsaXplcl93aXRoX2FyZW5hLAotICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKLSAgICAgICAgInN1cGVyY2xhc3MiLCBzdXBlcmNsYXNzLAotICAgICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KAotICAgICJcbiIKLSAgICAidm9pZCAkY2xhc3NuYW1lJDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0KLSAgaWYgKCFIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiICBfaXNfZGVmYXVsdF9pbnN0YW5jZV8gPSB0cnVlO1xuIik7Ci0gIH0KLQotICAvLyBUaGUgZGVmYXVsdCBpbnN0YW5jZSBuZWVkcyBhbGwgb2YgaXRzIGVtYmVkZGVkIG1lc3NhZ2UgcG9pbnRlcnMKLSAgLy8gY3Jvc3MtbGlua2VkIHRvIG90aGVyIGRlZmF1bHQgaW5zdGFuY2VzLiAgV2UgY2FuJ3QgZG8gdGhpcyBpbml0aWFsaXphdGlvbgotICAvLyBpbiB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSBzb21lIG90aGVyIGRlZmF1bHQgaW5zdGFuY2VzIG1heSBub3QgaGF2ZSBiZWVuCi0gIC8vIGNvbnN0cnVjdGVkIHlldCBhdCB0aGF0IHRpbWUuCi0gIC8vIFRPRE8oa2VudG9uKTogIE1heWJlIGFsbCBtZXNzYWdlIGZpZWxkcyAoZXZlbiBmb3Igbm9uLWRlZmF1bHQgbWVzc2FnZXMpCi0gIC8vICAgc2hvdWxkIGJlIGluaXRpYWxpemVkIHRvIHBvaW50IGF0IGRlZmF1bHQgaW5zdGFuY2VzIHJhdGhlciB0aGFuIE5VTEw/Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0KLSAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmCi0gICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCi0gICAgICAgIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwgfHwKLSAgICAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkpIHsKLSAgICAgIHN0cmluZyBuYW1lOwotICAgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgICAgbmFtZSA9IGNsYXNzbmFtZV8gKyAiX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfLT4iOwotICAgICAgfQotICAgICAgbmFtZSArPSBGaWVsZE5hbWUoZmllbGQpOwotICAgICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgICAgICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfLCBwcmludGVyLAotICAgICAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAgICAgICAiICAkbmFtZSRfID0gY29uc3RfY2FzdDwgJHR5cGUkKj4oJiR0eXBlJDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCi0gICAgICAgICAgLy8gV2l0aG91dC4KLSAgICAgICAgICAiICAkbmFtZSRfID0gY29uc3RfY2FzdDwgJHR5cGUkKj4oXG4iCi0gICAgICAgICAgIiAgICAgICR0eXBlJDo6aW50ZXJuYWxfZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCi0gICAgICAgICAgLy8gVmFycy4KLSAgICAgICAgICAibmFtZSIsIG5hbWUsICJ0eXBlIiwgRmllbGRNZXNzYWdlVHlwZU5hbWUoZmllbGQpKTsKLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgJiYKLSAgICAgICAgICAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAuR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUocHJpbnRlcik7Ci0gICAgfQotICB9Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ9XG4iCi0gICAgIlxuIik7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGNvcHkgY29uc3RydWN0b3IuCi0gIHByaW50ZXItPlByaW50KAotICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pXG4iCi0gICAgIiAgOiAkc3VwZXJjbGFzcyQoKSIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCi0gICAgInN1cGVyY2xhc3MiLCBzdXBlcmNsYXNzLAotICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiLFxuICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkiKTsKLSAgfSBlbHNlIGlmICghVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KCIsXG4gICAgX2FyZW5hX3B0cl8oTlVMTCkiKTsKLSAgfQotICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KCIsXG4gICAgX2FueV9tZXRhZGF0YV8oJnR5cGVfdXJsXywgJnZhbHVlXykiKTsKLSAgfQotICBwcmludGVyLT5QcmludCgiIHtcbiIpOwotICBwcmludGVyLT5QcmludCgKLSAgICAiICBTaGFyZWRDdG9yKCk7XG4iCi0gICAgIiAgTWVyZ2VGcm9tKGZyb20pO1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOiRmdWxsX25hbWUkKVxuIgotICAgICJ9XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKLSAgICAic3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MsCi0gICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHNoYXJlZCBjb25zdHJ1Y3RvciBjb2RlLgotICBHZW5lcmF0ZVNoYXJlZENvbnN0cnVjdG9yQ29kZShwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZGVzdHJ1Y3Rvci4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiRjbGFzc25hbWUkOjp+JGNsYXNzbmFtZSQoKSB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgU2hhcmVkRHRvcigpO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKLSAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGRlc3RydWN0b3IgY29kZS4KLSAgR2VuZXJhdGVTaGFyZWREZXN0cnVjdG9yQ29kZShwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgYXJlbmEtc3BlY2lmaWMgZGVzdHJ1Y3RvciBjb2RlLgotICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgR2VuZXJhdGVBcmVuYURlc3RydWN0b3JDb2RlKHByaW50ZXIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgU2V0Q2FjaGVkU2l6ZS4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInZvaWQgJGNsYXNzbmFtZSQ6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHtcbiIKLSAgICAiICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpO1xuIgotICAgICIgIF9jYWNoZWRfc2l6ZV8gPSBzaXplO1xuIgotICAgICIgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpO1xuIgotICAgICJ9XG4iLAotICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLQotICAvLyBPbmx5IGdlbmVyYXRlIHRoaXMgbWVtYmVyIGlmIGl0J3Mgbm90IGRpc2FibGVkLgotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pICYmCi0gICAgICAhZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqICRjbGFzc25hbWUkOjpkZXNjcmlwdG9yKCkge1xuIgotICAgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iCi0gICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl87XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAotICAgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsCi0gICAgICBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSk7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiY29uc3QgJGNsYXNzbmFtZSQmICRjbGFzc25hbWUkOjpkZWZhdWx0X2luc3RhbmNlKCkge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0KLSAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18sIHByaW50ZXIsCi0gICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgICAiICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIsCi0gICAgICAvLyBXaXRob3V0LgotICAgICAgIiAgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIsCi0gICAgICAvLyBWYXJzLgotICAgICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsCi0gICAgICBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXztcbiIKLSAgICAifVxuIgotICAgICJcbiIKLSAgICAiJGNsYXNzbmFtZSQqICRjbGFzc25hbWUkOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0KLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiRjbGFzc25hbWUkKiAkY2xhc3NuYW1lJDo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7XG4iCi0gICAgICAiICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWVzc2FnZTwkY2xhc3NuYW1lJD4oYXJlbmEpO1xuIgotICAgICAgIn1cbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiJGNsYXNzbmFtZSQqICRjbGFzc25hbWUkOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHtcbiIKLSAgICAgICIgICRjbGFzc25hbWUkKiBuID0gbmV3ICRjbGFzc25hbWUkO1xuIgotICAgICAgIiAgaWYgKGFyZW5hICE9IE5VTEwpIHtcbiIKLSAgICAgICIgICAgYXJlbmEtPk93bihuKTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIHJldHVybiBuO1xuIgotICAgICAgIn1cbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0KLQotfQotCi0vLyBSZXR1cm4gdGhlIG51bWJlciBvZiBiaXRzIHNldCBpbiBuLCBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyLgotc3RhdGljIGludCBwb3BjbnQodWludDMyIG4pIHsKLSAgaW50IHJlc3VsdCA9IDA7Ci0gIHdoaWxlIChuICE9IDApIHsKLSAgICByZXN1bHQgKz0gKG4gJiAxKTsKLSAgICBuID0gbiAvIDI7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ2xlYXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q2xlYXIoKSB7XG4iCi0gICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICAvLyBTdGVwIDE6IEV4dGVuc2lvbnMKLSAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICBwcmludGVyLT5QcmludCgiX2V4dGVuc2lvbnNfLkNsZWFyKCk7XG4iKTsKLSAgfQotCi0gIC8vIFN0ZXAgMjogRXZlcnl0aGluZyBidXQgZXh0ZW5zaW9ucywgcmVwZWF0ZWRzLCB1bmlvbnMuCi0gIC8vIFRoZXNlIGFyZSBoYW5kbGVkIGluIGNodW5rcyBvZiA4LiAgVGhlIGZpcnN0IGNodW5rIGlzCi0gIC8vIHRoZSBub24tZXh0ZW5zaW9ucy1ub24tcmVwZWF0ZWRzLW5vbi11bmlvbnMgaW4KLSAgLy8gIGRlc2NyaXB0b3JfLT5maWVsZCgwKSwgZGVzY3JpcHRvcl8tPmZpZWxkKDEpLCAuLi4gZGVzY3JpcHRvcl8tPmZpZWxkKDcpLAotICAvLyBhbmQgdGhlIHNlY29uZCBjaHVuayBpcyB0aGUgc2FtZSBmb3IKLSAgLy8gIGRlc2NyaXB0b3JfLT5maWVsZCg4KSwgZGVzY3JpcHRvcl8tPmZpZWxkKDkpLCAuLi4gZGVzY3JpcHRvcl8tPmZpZWxkKDE1KSwKLSAgLy8gZXRjLgotICBzZXQ8aW50PiBzdGVwMl9pbmRpY2VzOwotICBoYXNoX21hcDxzdHJpbmcsIGludD4gZmllbGRuYW1lX3RvX2NodW5rOwotICBoYXNoX21hcDxpbnQsIHN0cmluZz4gbWVtc2V0c19mb3JfY2h1bms7Ci0gIGhhc2hfbWFwPGludCwgaW50PiBtZW1zZXRfZmllbGRfY291bnRfZm9yX2NodW5rOwotICBoYXNoX3NldDxzdHJpbmc+IGhhbmRsZWQ7ICAvLyBmaWVsZHMgdGhhdCBhcHBlYXIgYW55d2hlcmUgaW4gbWVtc2V0c19mb3JfY2h1bmsKLSAgaGFzaF9tYXA8aW50LCB1aW50MzI+IGZpZWxkc19tYXNrX2Zvcl9jaHVuazsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmICFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICBzdGVwMl9pbmRpY2VzLmluc2VydChpKTsKLSAgICAgIGludCBjaHVuayA9IGkgLyA4OwotICAgICAgZmllbGRuYW1lX3RvX2NodW5rW0ZpZWxkTmFtZShmaWVsZCldID0gY2h1bms7Ci0gICAgICBmaWVsZHNfbWFza19mb3JfY2h1bmtbY2h1bmtdIHw9IHN0YXRpY19jYXN0PHVpbnQzMj4oMSkgPDwgKGkgJSAzMik7Ci0gICAgfQotICB9Ci0KLSAgLy8gU3RlcCAyYTogR3JlZWRpbHkgc2VlayBydW5zIG9mIGZpZWxkcyB0aGF0IGNhbiBiZSBjbGVhcmVkIGJ5IG1lbXNldC10by0wLgotICAvLyBUaGUgZ2VuZXJhdGVkIGNvZGUgdXNlcyB0d28gbWFjcm9zIHRvIGhlbHAgaXQgY2xlYXIgcnVucyBvZiBmaWVsZHM6Ci0gIC8vIFpSX0hFTFBFUl8oZjEpIC0gWlJfSEVMUEVSXyhmMCkgY29tcHV0ZXMgdGhlIGRpZmZlcmVuY2UsIGluIGJ5dGVzLCBvZiB0aGUKLSAgLy8gcG9zaXRpb25zIG9mIHR3byBmaWVsZHMgaW4gdGhlIE1lc3NhZ2UuCi0gIC8vIFpSXyB6ZXJvZXMgYSBub24tZW1wdHkgcmFuZ2Ugb2YgZmllbGRzIHZpYSBtZW1zZXQuCi0gIGNvbnN0IGNoYXIqIG1hY3JvcyA9Ci0gICAgICAiI2lmIGRlZmluZWQoX19jbGFuZ19fKVxuIgotICAgICAgIiNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcXFxuIgotICAgICAgIiAgX1ByYWdtYShcImNsYW5nIGRpYWdub3N0aWMgcHVzaFwiKSBcXFxuIgotICAgICAgIiAgX1ByYWdtYShcImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcXFwiLVdpbnZhbGlkLW9mZnNldG9mXFxcIlwiKSBcXFxuIgotICAgICAgIiAgX19idWlsdGluX29mZnNldG9mKCRjbGFzc25hbWUkLCBmKSBcXFxuIgotICAgICAgIiAgX1ByYWdtYShcImNsYW5nIGRpYWdub3N0aWMgcG9wXCIpXG4iCi0gICAgICAiI2Vsc2VcbiIKLSAgICAgICIjZGVmaW5lIFpSX0hFTFBFUl8oZikgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oXFxcbiIKLSAgICAgICIgICZyZWludGVycHJldF9jYXN0PCRjbGFzc25hbWUkKj4oMTYpLT5mKVxuIgotICAgICAgIiNlbmRpZlxuXG4iCi0gICAgICAiI2RlZmluZSBaUl8oZmlyc3QsIGxhc3QpIGRvIHtcXFxuIgotICAgICAgIiAgOjptZW1zZXQoJmZpcnN0LCAwLFxcXG4iCi0gICAgICAiICAgICAgICAgICBaUl9IRUxQRVJfKGxhc3QpIC0gWlJfSEVMUEVSXyhmaXJzdCkgKyBzaXplb2YobGFzdCkpO1xcXG4iCi0gICAgICAifSB3aGlsZSAoMClcblxuIjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBydW5zX29mX2ZpZWxkc18uc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgcnVuID0gcnVuc19vZl9maWVsZHNfW2ldOwotICAgIGlmIChydW4uc2l6ZSgpIDwgMikgY29udGludWU7Ci0gICAgY29uc3Qgc3RyaW5nJiBmaXJzdF9maWVsZF9uYW1lID0gcnVuWzBdOwotICAgIGNvbnN0IHN0cmluZyYgbGFzdF9maWVsZF9uYW1lID0gcnVuLmJhY2soKTsKLSAgICBpbnQgY2h1bmsgPSBmaWVsZG5hbWVfdG9fY2h1bmtbcnVuWzBdXTsKLSAgICBtZW1zZXRzX2Zvcl9jaHVua1tjaHVua10uYXBwZW5kKAotICAgICAgIlpSXygiICsgZmlyc3RfZmllbGRfbmFtZSArICJfLCAiICsgbGFzdF9maWVsZF9uYW1lICsgIl8pO1xuIik7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBydW4uc2l6ZSgpOyBqKyspIHsKLSAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY2h1bmssIGZpZWxkbmFtZV90b19jaHVua1tydW5bal1dKTsKLSAgICAgIGhhbmRsZWQuaW5zZXJ0KHJ1bltqXSk7Ci0gICAgfQotICAgIG1lbXNldF9maWVsZF9jb3VudF9mb3JfY2h1bmtbY2h1bmtdICs9IHJ1bi5zaXplKCk7Ci0gIH0KLSAgY29uc3QgYm9vbCBtYWNyb3NfYXJlX25lZWRlZCA9IGhhbmRsZWQuc2l6ZSgpID4gMDsKLSAgaWYgKG1hY3Jvc19hcmVfbmVlZGVkKSB7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KG1hY3JvcywKLSAgICAgICAgICAgICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIH0KLSAgLy8gU3RlcCAyYjogRmluaXNoIHN0ZXAgMiwgaWdub3JpbmcgZmllbGRzIGhhbmRsZWQgaW4gc3RlcCAyYS4KLSAgaW50IGxhc3RfaW5kZXggPSAtMTsKLSAgYm9vbCBjaHVua19ibG9ja19pbl9wcm9ncmVzcyA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoc3RlcDJfaW5kaWNlcy5jb3VudChpKSA9PSAwKSBjb250aW51ZTsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgIGNvbnN0IHN0cmluZyBmaWVsZG5hbWUgPSBGaWVsZE5hbWUoZmllbGQpOwotICAgIGlmIChpIC8gOCAhPSBsYXN0X2luZGV4IC8gOCB8fCBsYXN0X2luZGV4IDwgMCkgewotICAgICAgLy8gRW5kIHByZXZpb3VzIGNodW5rLCBpZiB0aGVyZSB3YXMgb25lLgotICAgICAgaWYgKGNodW5rX2Jsb2NrX2luX3Byb2dyZXNzKSB7Ci0gICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotICAgICAgICBjaHVua19ibG9ja19pbl9wcm9ncmVzcyA9IGZhbHNlOwotICAgICAgfQotICAgICAgLy8gU3RhcnQgY2h1bmsuCi0gICAgICBjb25zdCBzdHJpbmcmIG1lbXNldHMgPSBtZW1zZXRzX2Zvcl9jaHVua1tpIC8gOF07Ci0gICAgICB1aW50MzIgbWFzayA9IGZpZWxkc19tYXNrX2Zvcl9jaHVua1tpIC8gOF07Ci0gICAgICBpbnQgY291bnQgPSBwb3BjbnQobWFzayk7Ci0gICAgICBHT09HTEVfRENIRUNLX0dFKGNvdW50LCAxKTsKLSAgICAgIGlmIChjb3VudCA9PSAxIHx8Ci0gICAgICAgICAgKGNvdW50IDw9IDQgJiYgY291bnQgPT0gbWVtc2V0X2ZpZWxkX2NvdW50X2Zvcl9jaHVua1tpIC8gOF0pKSB7Ci0gICAgICAgIC8vIE5vICJpZiIgaGVyZSBiZWNhdXNlIHRoZSBjaHVuayBpcyB0cml2aWFsLgotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAgICJpZiAoX2hhc19iaXRzX1skaW5kZXgkIC8gMzJdICYgJG1hc2skdSkge1xuIiwKLSAgICAgICAgICAgICJpbmRleCIsIFNpbXBsZUl0b2EoaSAvIDggKiA4KSwKLSAgICAgICAgICAgICJtYXNrIiwgU2ltcGxlSXRvYShtYXNrKSk7Ci0gICAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICAgICAgY2h1bmtfYmxvY2tfaW5fcHJvZ3Jlc3MgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwcmludGVyLT5QcmludChtZW1zZXRzLmNfc3RyKCkpOwotICAgIH0KLSAgICBsYXN0X2luZGV4ID0gaTsKLSAgICBpZiAoaGFuZGxlZC5jb3VudChmaWVsZG5hbWUpID4gMCkgY29udGludWU7Ci0KLSAgICAvLyBJdCdzIGZhc3RlciB0byBqdXN0IG92ZXJ3cml0ZSBwcmltaXRpdmUgdHlwZXMsIGJ1dCB3ZSBzaG91bGQKLSAgICAvLyBvbmx5IGNsZWFyIHN0cmluZ3MgYW5kIG1lc3NhZ2VzIGlmIHRoZXkgd2VyZSBzZXQuCi0gICAgLy8gVE9ETyhrZW50b24pOiAgTGV0IHRoZSBDcHBGaWVsZEdlbmVyYXRvciBkZWNpZGUgdGhpcyBzb21laG93LgotICAgIGJvb2wgc2hvdWxkX2NoZWNrX2JpdCA9Ci0gICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSB8fAotICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzsKLQotICAgIGJvb2wgaGF2ZV9lbmNsb3NpbmdfaWYgPSBmYWxzZTsKLSAgICBpZiAoc2hvdWxkX2NoZWNrX2JpdCAmJgotICAgICAgICAvLyBJZiBubyBmaWVsZCBwcmVzZW5jZSwgdGhlbiBhbHdheXMgY2xlYXIgc3RyaW5ncy9tZXNzYWdlcyBhcyB3ZWxsLgotICAgICAgICBIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwgIm5hbWUiLCBmaWVsZG5hbWUpOwotICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICBoYXZlX2VuY2xvc2luZ19pZiA9IHRydWU7Ci0gICAgfQotCi0gICAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8gJiYgSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJjbGVhcl8kbmFtZSQoKTtcbiIsICJuYW1lIiwgZmllbGRuYW1lKTsKLSAgICB9IGVsc2UgewotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKLSAgICB9Ci0KLSAgICBpZiAoaGF2ZV9lbmNsb3NpbmdfaWYpIHsKLSAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoY2h1bmtfYmxvY2tfaW5fcHJvZ3Jlc3MpIHsKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotICB9Ci0gIGlmIChtYWNyb3NfYXJlX25lZWRlZCkgewotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4jdW5kZWYgWlJfSEVMUEVSX1xuI3VuZGVmIFpSX1xuXG4iKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgfQotCi0gIC8vIFN0ZXAgMzogUmVwZWF0ZWQgZmllbGRzIGRvbid0IHVzZSBfaGFzX2JpdHNfOyBlbWl0IGNvZGUgdG8gY2xlYXIgdGhlbSBoZXJlLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotCi0gICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBpZiAodXNlX2RlcGVuZGVudF9iYXNlXyAmJiBJc0ZpZWxkRGVwZW5kZW50KGZpZWxkKSkgewotICAgICAgICBwcmludGVyLT5QcmludCgiY2xlYXJfJG5hbWUkKCk7XG4iLCAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBTdGVwIDQ6IFVuaW9ucy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIiwKLSAgICAgICAgIm9uZW9mX25hbWUiLCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKTsKLSAgfQotCi0gIGlmIChIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgLy8gU3RlcCA1OiBFdmVyeXRoaW5nIGVsc2UuCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTtcbiIpOwotICB9Ci0KLSAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKLSAgICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHtcbiIKLSAgICAgICAgIiAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpO1xuIgotICAgICAgICAifVxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIl91bmtub3duX2ZpZWxkc18uQ2xlYXJUb0VtcHR5KFxuIgotICAgICAgICAgICIgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLFxuIgotICAgICAgICAgICIgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJfdW5rbm93bl9maWVsZHNfLkNsZWFyVG9FbXB0eU5vQXJlbmEoXG4iCi0gICAgICAgICAgIiAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpO1xuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU9uZW9mQ2xlYXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gR2VuZXJhdGVkIGZ1bmN0aW9uIGNsZWFycyB0aGUgYWN0aXZlIGZpZWxkIGFuZCB1bmlvbiBjYXNlIChlLmcuIGZvb19jYXNlXykuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiBvbmVvZl92YXJzOwotICAgIG9uZW9mX3ZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKLSAgICBvbmVvZl92YXJzWyJvbmVvZm5hbWUiXSA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCk7Ci0gICAgb25lb2ZfdmFyc1siZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCk7Ci0gICAgc3RyaW5nIG1lc3NhZ2VfY2xhc3M7Ci0KLSAgICBwcmludGVyLT5QcmludChvbmVvZl92YXJzLAotICAgICAgICAgICAgICAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpjbGVhcl8kb25lb2ZuYW1lJCgpIHtcbiIKLSAgICAgICAgICAgICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG9uZV9vZl9jbGVhcl9zdGFydDoiCi0gICAgICAgICAgICAgICAgICAgIiRmdWxsX25hbWUkKVxuIik7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQob25lb2ZfdmFycywKLSAgICAgICAgInN3aXRjaCgkb25lb2ZuYW1lJF9jYXNlKCkpIHtcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJjYXNlIGskZmllbGRfbmFtZSQ6IHtcbiIsCi0gICAgICAgICAgImZpZWxkX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpKTsKLSAgICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICAgLy8gV2UgY2xlYXIgb25seSBhbGxvY2F0ZWQgb2JqZWN0cyBpbiBvbmVvZnMKLSAgICAgIGlmICghSXNTdHJpbmdPck1lc3NhZ2UoZmllbGQpKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICAgIi8vIE5vIG5lZWQgdG8gY2xlYXJcbiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJicmVhaztcbiIpOwotICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIn1cbiIpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNhc2UgJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUOiB7XG4iCi0gICAgICAgICIgIGJyZWFrO1xuIgotICAgICAgICAifVxuIiwKLSAgICAgICAgImNhcF9vbmVvZl9uYW1lIiwKLSAgICAgICAgVG9VcHBlcihkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKSk7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAifVxuIgotICAgICAgICAiX29uZW9mX2Nhc2VfWyRvbmVvZl9pbmRleCRdID0gJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUO1xuIiwKLSAgICAgICAgIm9uZW9mX2luZGV4IiwgU2ltcGxlSXRvYShpKSwKLSAgICAgICAgImNhcF9vbmVvZl9uYW1lIiwKLSAgICAgICAgVG9VcHBlcihkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKSk7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAifVxuIgotICAgICAgICAiXG4iKTsKLSAgfQotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVTd2FwKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICAvLyBHZW5lcmF0ZSB0aGUgU3dhcCBtZW1iZXIgZnVuY3Rpb24uIFRoaXMgaXMgYSBsaWdodHdlaWdodCB3cmFwcGVyIGFyb3VuZAotICAgIC8vIFVuc2FmZUFyZW5hU3dhcCgpIC8gTWVyZ2VGcm9tKCkgd2l0aCB0ZW1wb3JhcmllcywgZGVwZW5kaW5nIG9uIHRoZSBtZW1vcnkKLSAgICAvLyBvd25lcnNoaXAgc2l0dWF0aW9uOiBzd2FwcGluZyBhY3Jvc3MgYXJlbmFzIG9yIGJldHdlZW4gYW4gYXJlbmEgYW5kIGEKLSAgICAvLyBoZWFwIHJlcXVpcmVzIGNvcHlpbmcuCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHZvaWQgJGNsYXNzbmFtZSQ6OlN3YXAoJGNsYXNzbmFtZSQqIG90aGVyKSB7XG4iCi0gICAgICAgICIgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47XG4iCi0gICAgICAgICIgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKSB7XG4iCi0gICAgICAgICIgICAgSW50ZXJuYWxTd2FwKG90aGVyKTtcbiIKLSAgICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICAgIiAgICAkY2xhc3NuYW1lJCB0ZW1wO1xuIgotICAgICAgICAiICAgIHRlbXAuTWVyZ2VGcm9tKCp0aGlzKTtcbiIKLSAgICAgICAgIiAgICBDb3B5RnJvbSgqb3RoZXIpO1xuIgotICAgICAgICAiICAgIG90aGVyLT5Db3B5RnJvbSh0ZW1wKTtcbiIKLSAgICAgICAgIiAgfVxuIgotICAgICAgICAifVxuIgotICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6VW5zYWZlQXJlbmFTd2FwKCRjbGFzc25hbWUkKiBvdGhlcikge1xuIgotICAgICAgICAiICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuO1xuIgotICAgICAgICAiICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gb3RoZXItPkdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgotICAgICAgICAiICBJbnRlcm5hbFN3YXAob3RoZXIpO1xuIgotICAgICAgICAifVxuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6U3dhcCgkY2xhc3NuYW1lJCogb3RoZXIpIHtcbiIKLSAgICAgICAgIiAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjtcbiIKLSAgICAgICAgIiAgSW50ZXJuYWxTd2FwKG90aGVyKTtcbiIKLSAgICAgICAgIn1cbiIsCi0gICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBVbnNhZmVBcmVuYVN3YXAgbWVtYmVyIGZ1bmN0aW9uLgotICBwcmludGVyLT5QcmludCgidm9pZCAkY2xhc3NuYW1lJDo6SW50ZXJuYWxTd2FwKCRjbGFzc25hbWUkKiBvdGhlcikge1xuIiwKLSAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU3dhcHBpbmdDb2RlKHByaW50ZXIpOwotICAgIH0KLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInN0ZDo6c3dhcCgkb25lb2ZfbmFtZSRfLCBvdGhlci0+JG9uZW9mX25hbWUkXyk7XG4iCi0gICAgICAgICJzdGQ6OnN3YXAoX29uZW9mX2Nhc2VfWyRpJF0sIG90aGVyLT5fb25lb2ZfY2FzZV9bJGkkXSk7XG4iLAotICAgICAgICAib25lb2ZfbmFtZSIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCksCi0gICAgICAgICJpIiwgU2ltcGxlSXRvYShpKSk7Ci0gICAgfQotCi0gICAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7ICsraSkgewotICAgICAgICBwcmludGVyLT5QcmludCgic3RkOjpzd2FwKF9oYXNfYml0c19bJGkkXSwgb3RoZXItPl9oYXNfYml0c19bJGkkXSk7XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAiaSIsIFNpbXBsZUl0b2EoaSkpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIElnbm9yZSBQcmVzZXJ2ZVVua25vd25GaWVsZHMgaGVyZSAtIGFsd2F5cyBzd2FwIGludGVybmFsX21ldGFkYXRhIGFzIGl0Ci0gICAgLy8gbWF5IGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgdW5rbm93biBmaWVsZHMuCi0gICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgiX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7XG4iKTsKLSAgICB9Ci0KLSAgICBwcmludGVyLT5QcmludCgic3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTtcbiIpOwotICAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgiX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pO1xuIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KCJHZXRSZWZsZWN0aW9uKCktPlN3YXAodGhpcywgb3RoZXIpOyIpOwotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdlRnJvbShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgLy8gR2VuZXJhdGUgdGhlIGdlbmVyYWxpemVkIE1lcmdlRnJvbSAoYWthIHRoYXQgd2hpY2ggdGFrZXMgaW4gdGhlIE1lc3NhZ2UKLSAgICAvLyBiYXNlIGNsYXNzIGFzIGEgcGFyYW1ldGVyKS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHtcbiIKLSAgICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0OiIKLSAgICAgICAgIiRmdWxsX25hbWUkKVxuIgotICAgICAgICAiICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pO1xuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotCi0gICAgLy8gQ2FzdCB0aGUgbWVzc2FnZSB0byB0aGUgcHJvcGVyIHR5cGUuIElmIHdlIGZpbmQgdGhhdCB0aGUgbWVzc2FnZSBpcwotICAgIC8vICpub3QqIG9mIHRoZSBwcm9wZXIgdHlwZSwgd2UgY2FuIHN0aWxsIGNhbGwgTWVyZ2UgdmlhIHRoZSByZWZsZWN0aW9uCi0gICAgLy8gc3lzdGVtLCBhcyB0aGUgR09PR0xFX0NIRUNLIGFib3ZlIGVuc3VyZWQgdGhhdCB3ZSBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3IKLSAgICAvLyBmb3IgZWFjaCBtZXNzYWdlLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNvbnN0ICRjbGFzc25hbWUkKiBzb3VyY2UgPSBcbiIKLSAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCAkY2xhc3NuYW1lJD4oXG4iCi0gICAgICAiICAgICAgICAmZnJvbSk7XG4iCi0gICAgICAiaWYgKHNvdXJjZSA9PSBOVUxMKSB7XG4iCi0gICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOiIKLSAgICAgICIkZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpO1xuIgotICAgICAgIn0gZWxzZSB7XG4iCi0gICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOiIKLSAgICAgICIkZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIE1lcmdlRnJvbSgqc291cmNlKTtcbiIKLSAgICAgICJ9XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotCi0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOwotICB9IGVsc2UgewotICAgIC8vIEdlbmVyYXRlIENoZWNrVHlwZUFuZE1lcmdlRnJvbSgpLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkNoZWNrVHlwZUFuZE1lcmdlRnJvbShcbiIKLSAgICAgICIgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSYgZnJvbSkge1xuIgotICAgICAgIiAgTWVyZ2VGcm9tKCo6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCAkY2xhc3NuYW1lJCo+KCZmcm9tKSk7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGFzcy1zcGVjaWZpYyBNZXJnZUZyb20sIHdoaWNoIGF2b2lkcyB0aGUgR09PR0xFX0NIRUNLIGFuZCBjYXN0LgotICBwcmludGVyLT5QcmludCgKLSAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpNZXJnZUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pIHtcbiIKLSAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDoiCi0gICAgICAiJGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pO1xuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLCAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgLy8gTWVyZ2UgUmVwZWF0ZWQgZmllbGRzLiBUaGVzZSBmaWVsZHMgZG8gbm90IHJlcXVpcmUgYQotICAvLyBjaGVjayBhcyB3ZSBjYW4gc2ltcGx5IGl0ZXJhdGUgb3ZlciB0aGVtLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotCi0gICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7Ci0gICAgfQotICB9Ci0KLSAgLy8gTWVyZ2Ugb25lb2YgZmllbGRzLiBPbmVvZiBmaWVsZCByZXF1aXJlcyBvbmVvZiBjYXNlIGNoZWNrLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7ICsraSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAic3dpdGNoIChmcm9tLiRvbmVvZm5hbWUkX2Nhc2UoKSkge1xuIiwKLSAgICAgICAgIm9uZW9mbmFtZSIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJjYXNlIGskZmllbGRfbmFtZSQ6IHtcbiIsCi0gICAgICAgICAgImZpZWxkX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpKTsKLSAgICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZU1lcmdpbmdDb2RlKHByaW50ZXIpOwotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImJyZWFrO1xuIik7Ci0gICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAifVxuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiY2FzZSAkY2FwX29uZW9mX25hbWUkX05PVF9TRVQ6IHtcbiIKLSAgICAgICAgIiAgYnJlYWs7XG4iCi0gICAgICAgICJ9XG4iLAotICAgICAgICAiY2FwX29uZW9mX25hbWUiLAotICAgICAgICBUb1VwcGVyKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpKTsKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ9XG4iKTsKLSAgfQotCi0gIC8vIE1lcmdlIE9wdGlvbmFsIGFuZCBSZXF1aXJlZCBmaWVsZHMgKGFmdGVyIGEgX2hhc19iaXQgY2hlY2spLgotICBpbnQgbGFzdF9pbmRleCA9IC0xOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0KLSAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmICFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgICAgICAvLyBTZWUgYWJvdmUgaW4gR2VuZXJhdGVDbGVhciBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcy4KLSAgICAgICAgaWYgKGkgLyA4ICE9IGxhc3RfaW5kZXggLyA4IHx8IGxhc3RfaW5kZXggPCAwKSB7Ci0gICAgICAgICAgaWYgKGxhc3RfaW5kZXggPj0gMCkgewotICAgICAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAgICJpZiAoZnJvbS5faGFzX2JpdHNfWyRpbmRleCQgLyAzMl0gJiAiCi0gICAgICAgICAgICAiKDB4ZmZ1IDw8ICgkaW5kZXgkICUgMzIpKSkge1xuIiwKLSAgICAgICAgICAgICJpbmRleCIsIFNpbXBsZUl0b2EoZmllbGQtPmluZGV4KCkpKTsKLSAgICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBsYXN0X2luZGV4ID0gaTsKLQotICAgICAgYm9vbCBoYXZlX2VuY2xvc2luZ19pZiA9IGZhbHNlOwotICAgICAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmIChmcm9tLmhhc18kbmFtZSQoKSkge1xuIiwKLSAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwotICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gTWVyZ2Ugc2VtYW50aWNzIHdpdGhvdXQgdHJ1ZSBmaWVsZCBwcmVzZW5jZTogcHJpbWl0aXZlIGZpZWxkcyBhcmUKLSAgICAgICAgLy8gbWVyZ2VkIG9ubHkgaWYgbm9uLXplcm8gKG51bWVyaWMpIG9yIG5vbi1lbXB0eSAoc3RyaW5nKS4KLSAgICAgICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSBFbWl0RmllbGROb25EZWZhdWx0Q29uZGl0aW9uKAotICAgICAgICAgICAgcHJpbnRlciwgImZyb20uIiwgZmllbGQpOwotICAgICAgfQotCi0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7Ci0KLSAgICAgIGlmIChoYXZlX2VuY2xvc2luZ19pZikgewotICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSAmJgotICAgICAgbGFzdF9pbmRleCA+PSAwKSB7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoIl9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pO1xuIik7Ci0gIH0KLQotICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewotICAgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7XG4iCi0gICAgICAgICIgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7XG4iCi0gICAgICAgICJ9XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJpZiAoIWZyb20udW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7XG4iCi0gICAgICAgICIgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+YXBwZW5kKGZyb20udW5rbm93bl9maWVsZHMoKSk7XG4iCi0gICAgICAgICJ9XG4iKTsKLSAgICB9Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ29weUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIC8vIEdlbmVyYXRlIHRoZSBnZW5lcmFsaXplZCBDb3B5RnJvbSAoYWthIHRoYXQgd2hpY2ggdGFrZXMgaW4gdGhlIE1lc3NhZ2UKLSAgICAvLyBiYXNlIGNsYXNzIGFzIGEgcGFyYW1ldGVyKS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkge1xuIgotICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDoiCi0gICAgICAgICIkZnVsbF9uYW1lJClcbiIsCi0gICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLCAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47XG4iCi0gICAgICAiQ2xlYXIoKTtcbiIKLSAgICAgICJNZXJnZUZyb20oZnJvbSk7XG4iKTsKLQotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHRoZSBjbGFzcy1zcGVjaWZpYyBDb3B5RnJvbS4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q29weUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pIHtcbiIKLSAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0OiIKLSAgICAgICIkZnVsbF9uYW1lJClcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuO1xuIgotICAgICJDbGVhcigpO1xuIgotICAgICJNZXJnZUZyb20oZnJvbSk7XG4iKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIC8vIFNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0LgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImJvb2wgJGNsYXNzbmFtZSQ6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShcbiIKLSAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHtcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0KLSAgICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfLCBwcmludGVyLAotICAgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgICAgICIgIHJldHVybiBfZXh0ZW5zaW9uc18uUGFyc2VNZXNzYWdlU2V0KGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXyxcbiIKLSAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKTtcbiIsCi0gICAgICAgIC8vIFdpdGhvdXQuCi0gICAgICAgICIgIHJldHVybiBfZXh0ZW5zaW9uc18uUGFyc2VNZXNzYWdlU2V0KGlucHV0LCAmZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgotICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpO1xuIiwKLSAgICAgICAgLy8gVmFycy4KLSAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAifVxuIik7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImJvb2wgJGNsYXNzbmFtZSQ6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShcbiIKLSAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7XG4iCi0gICAgIiNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlXG4iCi0gICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnO1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0KLSAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykgJiYKLSAgICAgICFVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgLy8gVXNlIExhenlTdHJpbmdPdXRwdXRTdHJpbmcgdG8gYXZvaWQgaW5pdGlhbGl6aW5nIHVua25vd24gZmllbGRzIHN0cmluZwotICAgIC8vIHVubGVzcyBpdCBpcyBhY3R1YWxseSBuZWVkZWQuIEZvciB0aGUgc2FtZSByZWFzb24sIGRpc2FibGUgZWFnZXIgcmVmcmVzaAotICAgIC8vIG9uIHRoZSBDb2RlZE91dHB1dFN0cmVhbS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkxhenlTdHJpbmdPdXRwdXRTdHJlYW0gdW5rbm93bl9maWVsZHNfc3RyaW5nKFxuIgotICAgICAgIiAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5ld1Blcm1hbmVudENhbGxiYWNrKFxuIgotICAgICAgIiAgICAgICAgICAmTXV0YWJsZVVua25vd25GaWVsZHNGb3IkY2xhc3NuYW1lJCwgdGhpcykpO1xuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0gdW5rbm93bl9maWVsZHNfc3RyZWFtKFxuIgotICAgICAgIiAgICAgICZ1bmtub3duX2ZpZWxkc19zdHJpbmcsIGZhbHNlKTtcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iLAotICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotCi0gIHByaW50ZXItPkluZGVudCgpOwotICBwcmludGVyLT5QcmludCgiZm9yICg7Oykge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IgKiA+IG9yZGVyZWRfZmllbGRzKAotICAgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7Ci0gIHVpbnQzMiBtYXh0YWcgPSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSA9PSAwID8gMCA6Ci0gICAgICBXaXJlRm9ybWF0OjpNYWtlVGFnKG9yZGVyZWRfZmllbGRzW2Rlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpIC0gMV0pOwotICBjb25zdCBpbnQga0N1dG9mZjAgPSAxMjc7ICAgICAgICAgICAgICAgLy8gZml0cyBpbiAxLWJ5dGUgdmFyaW50Ci0gIGNvbnN0IGludCBrQ3V0b2ZmMSA9ICgxMjcgPDwgNykgKyAxMjc7ICAvLyBmaXRzIGluIDItYnl0ZSB2YXJpbnQKLSAgcHJpbnRlci0+UHJpbnQoIjo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9ICIKLSAgICAgICAgICAgICAgICAgImlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigkbWF4JCk7XG4iCi0gICAgICAgICAgICAgICAgICJ0YWcgPSBwLmZpcnN0O1xuIgotICAgICAgICAgICAgICAgICAiaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDtcbiIsCi0gICAgICAgICAgICAgICAgICJtYXgiLCBTaW1wbGVJdG9hKG1heHRhZyA8PSBrQ3V0b2ZmMCA/IGtDdXRvZmYwIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heHRhZyA8PSBrQ3V0b2ZmMSA/IGtDdXRvZmYxIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHRhZykpKTsKLSAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpID4gMCkgewotICAgIC8vIFdlIGRvbid0IGV2ZW4gd2FudCB0byBwcmludCB0aGUgc3dpdGNoKCkgaWYgd2UgaGF2ZSBubyBmaWVsZHMgYmVjYXVzZQotICAgIC8vIE1TVkMgZGlzbGlrZXMgc3dpdGNoKCkgc3RhdGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSBhIGRlZmF1bHQgdmFsdWUuCi0KLSAgICAvLyBOb3RlOiAgSWYgd2UganVzdCBzd2l0Y2hlZCBvbiB0aGUgdGFnIHJhdGhlciB0aGFuIHRoZSBmaWVsZCBudW1iZXIsIHdlCi0gICAgLy8gY291bGQgYXZvaWQgdGhlIG5lZWQgZm9yIHRoZSBpZigpIHRvIGNoZWNrIHRoZSB3aXJlIHR5cGUgYXQgdGhlIGJlZ2lubmluZwotICAgIC8vIG9mIGVhY2ggY2FzZS4gIEhvd2V2ZXIsIHRoaXMgaXMgYWN0dWFsbHkgYSBiaXQgc2xvd2VyIGluIHByYWN0aWNlIGFzIGl0Ci0gICAgLy8gY3JlYXRlcyBhIGp1bXAgdGFibGUgdGhhdCBpcyA4eCBsYXJnZXIgYW5kIHNwYXJzZXIsIGFuZCBtZWFud2hpbGUgdGhlCi0gICAgLy8gaWYoKXMgYXJlIGhpZ2hseSBwcmVkaWN0YWJsZS4KLSAgICBwcmludGVyLT5QcmludCgic3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6IgotICAgICAgICAgICAgICAgICAgICJHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7XG4iKTsKLQotICAgIHByaW50ZXItPkluZGVudCgpOwotCi0gICAgLy8gRmluZCByZXBlYXRlZCBtZXNzYWdlcyBhbmQgZ3JvdXBzIG5vdywgdG8gc2ltcGxpZnkgd2hhdCBmb2xsb3dzLgotICAgIGhhc2hfc2V0PGludD4gZmllbGRzX3dpdGhfcGFyc2VfbG9vcDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvcmRlcmVkX2ZpZWxkc1tpXTsKLSAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJgotICAgICAgICAgIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIHx8Ci0gICAgICAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSkgewotICAgICAgICBmaWVsZHNfd2l0aF9wYXJzZV9sb29wLmluc2VydChpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBuZWVkX2xhYmVsIGlzIHRydWUgaWYgd2UgZ2VuZXJhdGVkICJnb3RvIHBhcnNlXyRuYW1lJCIgd2hpbGUgaGFuZGxpbmcgdGhlCi0gICAgLy8gcHJldmlvdXMgZmllbGQuCi0gICAgYm9vbCBuZWVkX2xhYmVsID0gZmFsc2U7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3JkZXJlZF9maWVsZHNbaV07Ci0gICAgICBjb25zdCBib29sIGxvb3BzID0gZmllbGRzX3dpdGhfcGFyc2VfbG9vcC5jb3VudChpKSA+IDA7Ci0gICAgICBjb25zdCBib29sIG5leHRfZmllbGRfbG9vcHMgPSBmaWVsZHNfd2l0aF9wYXJzZV9sb29wLmNvdW50KGkgKyAxKSA+IDA7Ci0KLSAgICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKLQotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJjYXNlICRudW1iZXIkOiB7XG4iLAotICAgICAgICAibnVtYmVyIiwgU2ltcGxlSXRvYShmaWVsZC0+bnVtYmVyKCkpKTsKLSAgICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGZpZWxkX2dlbmVyYXRvciA9IGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCk7Ci0KLSAgICAgIC8vIEVtaXQgY29kZSB0byBwYXJzZSB0aGUgY29tbW9uLCBleHBlY3RlZCBjYXNlLgotICAgICAgcHJpbnRlci0+UHJpbnQoImlmICh0YWcgPT0gJGNvbW1vbnRhZyQpIHtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAiY29tbW9udGFnIiwgU2ltcGxlSXRvYShXaXJlRm9ybWF0OjpNYWtlVGFnKGZpZWxkKSkpOwotCi0gICAgICBpZiAobmVlZF9sYWJlbCB8fAotICAgICAgICAgIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPmlzX3BhY2tlZCgpICYmICFsb29wcykpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAiIHBhcnNlXyRuYW1lJDpcbiIsCi0gICAgICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOwotICAgICAgfQotICAgICAgaWYgKGxvb3BzKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICIgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7XG4iCi0gICAgICAgICAgIiBwYXJzZV9sb29wXyRuYW1lJDpcbiIsCi0gICAgICAgICAgIm5hbWUiLCBmaWVsZC0+bmFtZSgpKTsKLSAgICAgIH0KLQotICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICBpZiAoZmllbGQtPmlzX3BhY2tlZCgpKSB7Ci0gICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcocHJpbnRlcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZF9nZW5lcmF0b3IuR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShwcmludGVyKTsKLSAgICAgIH0KLSAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLQotICAgICAgLy8gRW1pdCBjb2RlIHRvIHBhcnNlIHVuZXhwZWN0ZWRseSBwYWNrZWQgb3IgdW5wYWNrZWQgdmFsdWVzLgotICAgICAgaWYgKGZpZWxkLT5pc19wYWNrZWQoKSkgewotICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHdpcmV0eXBlID0KLSAgICAgICAgICAgIFdpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpOwotICAgICAgICBwcmludGVyLT5QcmludCgifSBlbHNlIGlmICh0YWcgPT0gJHVuY29tbW9udGFnJCkge1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgInVuY29tbW9udGFnIiwgU2ltcGxlSXRvYSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIHdpcmV0eXBlKSkpOwotICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgICAgZmllbGRfZ2VuZXJhdG9yLkdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0ocHJpbnRlcik7Ci0gICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmlzX3BhY2thYmxlKCkgJiYgIWZpZWxkLT5pc19wYWNrZWQoKSkgewotICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHdpcmV0eXBlID0KLSAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIn0gZWxzZSBpZiAodGFnID09ICR1bmNvbW1vbnRhZyQpIHtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICJ1bmNvbW1vbnRhZyIsIFNpbXBsZUl0b2EoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLCB3aXJldHlwZSkpKTsKLSAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtV2l0aFBhY2tpbmcocHJpbnRlcik7Ci0gICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgIH0KLQotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ9IGVsc2Uge1xuIgotICAgICAgICAiICBnb3RvIGhhbmRsZV91bnVzdWFsO1xuIgotICAgICAgICAifVxuIik7Ci0KLSAgICAgIC8vIHN3aXRjaCgpIGlzIHNsb3cgc2luY2UgaXQgY2FuJ3QgYmUgcHJlZGljdGVkIHdlbGwuICBJbnNlcnQgc29tZSBpZigpcwotICAgICAgLy8gaGVyZSB0aGF0IGF0dGVtcHQgdG8gcHJlZGljdCB0aGUgbmV4dCB0YWcuCi0gICAgICAvLyBGb3Igbm9uLXBhY2tlZCByZXBlYXRlZCBmaWVsZHMsIGV4cGVjdCB0aGUgc2FtZSB0YWcgYWdhaW4uCi0gICAgICBpZiAobG9vcHMpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0VGFnKCR0YWckKSkgZ290byBwYXJzZV9sb29wXyRuYW1lJDtcbiIsCi0gICAgICAgICAgInRhZyIsIFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhmaWVsZCkpLAotICAgICAgICAgICJuYW1lIiwgZmllbGQtPm5hbWUoKSk7Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpICYmICFmaWVsZC0+aXNfcGFja2VkKCkpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0VGFnKCR0YWckKSkgZ290byBwYXJzZV8kbmFtZSQ7XG4iLAotICAgICAgICAgICJ0YWciLCBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZmllbGQpKSwKLSAgICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOwotICAgICAgfQotCi0gICAgICAvLyBIYXZlIHdlIGVtaXR0ZWQgImlmIChpbnB1dC0+RXhwZWN0VGFnKCRuZXh0X3RhZyQpKSAuLi4iIHlldD8KLSAgICAgIGJvb2wgZW1pdHRlZF9nb3RvX25leHRfdGFnID0gZmFsc2U7Ci0KLSAgICAgIC8vIEZvciByZXBlYXRlZCBtZXNzYWdlcy9ncm91cHMsIHdlIG5lZWQgdG8gZGVjcmVtZW50IHJlY3Vyc2lvbiBkZXB0aCwKLSAgICAgIC8vIHVubGVzcyB0aGUgbmV4dCB0YWcgaXMgYWxzbyBmb3IgYSByZXBlYXRlZCBtZXNzYWdlL2dyb3VwLgotICAgICAgaWYgKGxvb3BzKSB7Ci0gICAgICAgIGlmIChuZXh0X2ZpZWxkX2xvb3BzKSB7Ci0gICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXh0X2ZpZWxkID0gb3JkZXJlZF9maWVsZHNbaSArIDFdOwotICAgICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0VGFnKCRuZXh0X3RhZyQpKSBnb3RvIHBhcnNlX2xvb3BfJG5leHRfbmFtZSQ7XG4iLAotICAgICAgICAgICAgIm5leHRfdGFnIiwgU2ltcGxlSXRvYShXaXJlRm9ybWF0OjpNYWtlVGFnKG5leHRfZmllbGQpKSwKLSAgICAgICAgICAgICJuZXh0X25hbWUiLCBuZXh0X2ZpZWxkLT5uYW1lKCkpOwotICAgICAgICAgIGVtaXR0ZWRfZ290b19uZXh0X3RhZyA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpO1xuIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGZpZWxkcywgZXhwZWN0IHRoZSBuZXh0IG9uZS4KLSAgICAgIG5lZWRfbGFiZWwgPSBmYWxzZTsKLSAgICAgIGlmICghZW1pdHRlZF9nb3RvX25leHRfdGFnKSB7Ci0gICAgICAgIGlmIChpICsgMSA9PSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSkgewotICAgICAgICAgIC8vIEV4cGVjdCBFT0YuCi0gICAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgRXhwZWN0IGdyb3VwIGVuZC10YWc/Ci0gICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAiaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7XG4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5leHRfZmllbGQgPSBvcmRlcmVkX2ZpZWxkc1tpICsgMV07Ci0gICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAiaWYgKGlucHV0LT5FeHBlY3RUYWcoJG5leHRfdGFnJCkpIGdvdG8gcGFyc2VfJG5leHRfbmFtZSQ7XG4iLAotICAgICAgICAgICAgIm5leHRfdGFnIiwgU2ltcGxlSXRvYShXaXJlRm9ybWF0OjpNYWtlVGFnKG5leHRfZmllbGQpKSwKLSAgICAgICAgICAgICJuZXh0X25hbWUiLCBuZXh0X2ZpZWxkLT5uYW1lKCkpOwotICAgICAgICAgIG5lZWRfbGFiZWwgPSB0cnVlOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiYnJlYWs7XG4iKTsKLQotICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Ci0gICAgfQotCi0gICAgcHJpbnRlci0+UHJpbnQoImRlZmF1bHQ6IHtcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgiaGFuZGxlX3VudXN1YWw6XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIC8vIElmIHRhZyBpcyAwIG9yIGFuIGVuZC1ncm91cCB0YWcgdGhlbiB0aGlzIG11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImlmICh0YWcgPT0gMCB8fFxuIgotICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT1cbiIKLSAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHtcbiIKLSAgICAiICBnb3RvIHN1Y2Nlc3M7XG4iCi0gICAgIn1cbiIpOwotCi0gIC8vIEhhbmRsZSBleHRlbnNpb24gcmFuZ2VzLgotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImlmICgiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaSsrKSB7Ci0gICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UgPQotICAgICAgICBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlKGkpOwotICAgICAgaWYgKGkgPiAwKSBwcmludGVyLT5QcmludCgiIHx8XG4gICAgIik7Ci0KLSAgICAgIHVpbnQzMiBzdGFydF90YWcgPSBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKLSAgICAgICAgcmFuZ2UtPnN0YXJ0LCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU+KDApKTsKLSAgICAgIHVpbnQzMiBlbmRfdGFnID0gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCi0gICAgICAgIHJhbmdlLT5lbmQsIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZT4oMCkpOwotCi0gICAgICBpZiAocmFuZ2UtPmVuZCA+IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcikgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiKCRzdGFydCR1IDw9IHRhZykiLAotICAgICAgICAgICJzdGFydCIsIFNpbXBsZUl0b2Eoc3RhcnRfdGFnKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiKCRzdGFydCR1IDw9IHRhZyAmJiB0YWcgPCAkZW5kJHUpIiwKLSAgICAgICAgICAic3RhcnQiLCBTaW1wbGVJdG9hKHN0YXJ0X3RhZyksCi0gICAgICAgICAgImVuZCIsIFNpbXBsZUl0b2EoZW5kX3RhZykpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgiKSB7XG4iKTsKLSAgICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewotICAgICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICAgICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgICAgICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18sIHByaW50ZXIsCi0gICAgICAgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgICAgICAgICAiICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sXG4iCi0gICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7XG4iLAotICAgICAgICAgICAgLy8gV2l0aG91dC4KLSAgICAgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpO1xuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKLSAgICAgICAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXyxcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdW5rbm93bl9maWVsZHNfc3RyZWFtKSk7XG4iLAotICAgICAgICAgICAgLy8gV2l0aG91dC4KLSAgICAgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgotICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bmtub3duX2ZpZWxkc19zdHJlYW0pKTtcbiIpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18sIHByaW50ZXIsCi0gICAgICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotICAgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXyk7XG4iLAotICAgICAgICAgIC8vIFdpdGhvdXQuCi0gICAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsICZkZWZhdWx0X2luc3RhbmNlKCkpO1xuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiAgY29udGludWU7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLQotICAvLyBXZSByZWFsbHkgZG9uJ3QgcmVjb2duaXplIHRoaXMgdGFnLiAgU2tpcCBpdC4KLSAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKLSAgICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKFxuIgotICAgICAgICAiICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChcbiIKLSAgICAgICAgIiAgICBpbnB1dCwgdGFnLCAmdW5rbm93bl9maWVsZHNfc3RyZWFtKSk7XG4iKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZykpO1xuIik7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgPiAwKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoImJyZWFrO1xuIik7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsgICAgLy8gZGVmYXVsdDoKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOyAgICAvLyBzd2l0Y2gKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgKLSAgICAiICB9XG4iICAgICAgICAgICAgICAgICAgIC8vIGZvciAoOzspCi0gICAgInN1Y2Nlc3M6XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuIHRydWU7XG4iCi0gICAgImZhaWx1cmU6XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuIGZhbHNlO1xuIgotICAgICIjdW5kZWYgRE9fXG4iCi0gICAgIn1cbiIsICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgdG9fYXJyYXkpIHsKLSAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOwotCi0gIGJvb2wgaGF2ZV9lbmNsb3NpbmdfaWYgPSBmYWxzZTsKLSAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwKLSAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSB0cnVlOwotICB9IGVsc2UgaWYgKCFIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSBFbWl0RmllbGROb25EZWZhdWx0Q29uZGl0aW9uKHByaW50ZXIsICJ0aGlzLT4iLCBmaWVsZCk7Ci0gIH0KLQotICBpZiAodG9fYXJyYXkpIHsKLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgICAgcHJpbnRlcik7Ci0gIH0gZWxzZSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhwcmludGVyKTsKLSAgfQotCi0gIGlmIChoYXZlX2VuY2xvc2luZ19pZikgewotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgifVxuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKLSAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlLAotICAgIGJvb2wgdG9fYXJyYXkpIHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICB2YXJzWyJzdGFydCJdID0gU2ltcGxlSXRvYShyYW5nZS0+c3RhcnQpOwotICB2YXJzWyJlbmQiXSA9IFNpbXBsZUl0b2EocmFuZ2UtPmVuZCk7Ci0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIi8vIEV4dGVuc2lvbiByYW5nZSBbJHN0YXJ0JCwgJGVuZCQpXG4iKTsKLSAgaWYgKHRvX2FycmF5KSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICJ0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShcbiIKLSAgICAgICIgICAgJHN0YXJ0JCwgJGVuZCQsIHRhcmdldCk7XG5cbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhcbiIKLSAgICAgICIgICAgJHN0YXJ0JCwgJGVuZCQsIG91dHB1dCk7XG5cbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7Ci0gICAgLy8gU3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQuCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKFxuIgotICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7XG4iCi0gICAgICAiICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplcyhvdXRwdXQpO1xuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgICBHT09HTEVfQ0hFQ0soVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSk7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKFxuIgotICAgICAgIiAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7XG4iKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJ9XG4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAidm9pZCAkY2xhc3NuYW1lJDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKFxuIgotICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Qge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0OiRmdWxsX25hbWUkKVxuIiwKLSAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLQotICBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc0JvZHkocHJpbnRlciwgZmFsc2UpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDokZnVsbF9uYW1lJClcbiIsCi0gICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIC8vIFNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0LgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqICRjbGFzc25hbWUkOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KFxuIgotICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHtcbiIKLSAgICAgICIgIHRhcmdldCA9XG4iCi0gICAgICAiICAgICAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICAgIEdPT0dMRV9DSEVDSyhVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlxuIgotICAgICAgIiAgICAgICAgICAgICBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheShcbiIKLSAgICAgICIgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpO1xuIik7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiICByZXR1cm4gdGFyZ2V0O1xuIgotICAgICAgIn1cbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KAotICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiAkY2xhc3NuYW1lJDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShcbiIKLSAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3Qge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0OiRmdWxsX25hbWUkKVxuIiwKLSAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLQotICBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc0JvZHkocHJpbnRlciwgdHJ1ZSk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOiRmdWxsX25hbWUkKVxuIiwKLSAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICIgIHJldHVybiB0YXJnZXQ7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNCb2R5KGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIHRvX2FycmF5KSB7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IgKiA+IG9yZGVyZWRfZmllbGRzKAotICAgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7Ci0KLSAgdmVjdG9yPGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKj4gc29ydGVkX2V4dGVuc2lvbnM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyArK2kpIHsKLSAgICBzb3J0ZWRfZXh0ZW5zaW9ucy5wdXNoX2JhY2soZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZShpKSk7Ci0gIH0KLSAgc3RkOjpzb3J0KHNvcnRlZF9leHRlbnNpb25zLmJlZ2luKCksIHNvcnRlZF9leHRlbnNpb25zLmVuZCgpLAotICAgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VTb3J0ZXIoKSk7Ci0KLSAgLy8gTWVyZ2UgdGhlIGZpZWxkcyBhbmQgdGhlIGV4dGVuc2lvbiByYW5nZXMsIGJvdGggc29ydGVkIGJ5IGZpZWxkIG51bWJlci4KLSAgaW50IGksIGo7Ci0gIGZvciAoaSA9IDAsIGogPSAwOwotICAgICAgIGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSB8fCBqIDwgc29ydGVkX2V4dGVuc2lvbnMuc2l6ZSgpOwotICAgICAgICkgewotICAgIGlmIChpID09IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKSB7Ci0gICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUV4dGVuc2lvblJhbmdlKHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvcnRlZF9leHRlbnNpb25zW2orK10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvX2FycmF5KTsKLSAgICB9IGVsc2UgaWYgKGogPT0gc29ydGVkX2V4dGVuc2lvbnMuc2l6ZSgpKSB7Ci0gICAgICBHZW5lcmF0ZVNlcmlhbGl6ZU9uZUZpZWxkKHByaW50ZXIsIG9yZGVyZWRfZmllbGRzW2krK10sIHRvX2FycmF5KTsKLSAgICB9IGVsc2UgaWYgKG9yZGVyZWRfZmllbGRzW2ldLT5udW1iZXIoKSA8IHNvcnRlZF9leHRlbnNpb25zW2pdLT5zdGFydCkgewotICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChwcmludGVyLCBvcmRlcmVkX2ZpZWxkc1tpKytdLCB0b19hcnJheSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UocHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc29ydGVkX2V4dGVuc2lvbnNbaisrXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG9fYXJyYXkpOwotICAgIH0KLSAgfQotCi0gIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHtcbiIpOwotICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICBpZiAodG9fYXJyYXkpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgInRhcmdldCA9ICIKLSAgICAgICAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KFxuIgotICAgICAgICAgICIgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTtcbiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoXG4iCi0gICAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpO1xuIik7Ci0gICAgICB9Ci0gICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAifVxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAib3V0cHV0LT5Xcml0ZVJhdyh1bmtub3duX2ZpZWxkcygpLmRhdGEoKSxcbiIKLSAgICAgICAgIiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih1bmtub3duX2ZpZWxkcygpLnNpemUoKSkpO1xuIik7Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyB2ZWN0b3I8dWludDMyPiBSZXF1aXJlZEZpZWxkc0JpdE1hc2soY29uc3QgRGVzY3JpcHRvciogZGVzYykgewotICB2ZWN0b3I8dWludDMyPiByZXN1bHQ7Ci0gIHVpbnQzMiBtYXNrID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoaSA+IDAgJiYgaSAlIDMyID09IDApIHsKLSAgICAgIHJlc3VsdC5wdXNoX2JhY2sobWFzayk7Ci0gICAgICBtYXNrID0gMDsKLSAgICB9Ci0gICAgaWYgKGRlc2MtPmZpZWxkKGkpLT5pc19yZXF1aXJlZCgpKSB7Ci0gICAgICBtYXNrIHw9ICgxIDw8IChpICYgMzEpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKG1hc2sgIT0gMCkgewotICAgIHJlc3VsdC5wdXNoX2JhY2sobWFzayk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gQ3JlYXRlIGFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8KLS8vICAiZm9yIGFsbCBpLCAoX2hhc19iaXRzX1tpXSAmIG1hc2tzW2ldKSA9PSBtYXNrc1tpXSIKLS8vIG1hc2tzIGlzIGFsbG93ZWQgdG8gYmUgc2hvcnRlciB0aGFuIF9oYXNfYml0c18sIGJ1dCBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZgotLy8gbWFza3MgbXVzdCBiZSBub24temVyby4KLXN0YXRpYyBzdHJpbmcgQ29uZGl0aW9uYWxUb0NoZWNrQml0bWFza3MoY29uc3QgdmVjdG9yPHVpbnQzMj4mIG1hc2tzKSB7Ci0gIHZlY3RvcjxzdHJpbmc+IHBhcnRzOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1hc2tzLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKG1hc2tzW2ldID09IDApIGNvbnRpbnVlOwotICAgIHN0cmluZyBtID0gU3RyQ2F0KCIweCIsIHN0cmluZ3M6OkhleChtYXNrc1tpXSwgc3RyaW5nczo6WkVST19QQURfOCkpOwotICAgIC8vIEVhY2ggeG9yIGV2YWx1YXRlcyB0byAwIGlmIHRoZSBleHBlY3RlZCBiaXRzIGFyZSBwcmVzZW50LgotICAgIHBhcnRzLnB1c2hfYmFjayhTdHJDYXQoIigoX2hhc19iaXRzX1siLCBpLCAiXSAmICIsIG0sICIpIF4gIiwgbSwgIikiKSk7Ci0gIH0KLSAgR09PR0xFX0NIRUNLKCFwYXJ0cy5lbXB0eSgpKTsKLSAgLy8gSWYgd2UgaGF2ZSBtdWx0aXBsZSBwYXJ0cywgZWFjaCBleHBlY3RlZCB0byBiZSAwLCB0aGVuIGJpdHdpc2Utb3IgdGhlbS4KLSAgc3RyaW5nIHJlc3VsdCA9IHBhcnRzLnNpemUoKSA9PSAxID8gcGFydHNbMF0gOgotICAgICAgU3RyQ2F0KCIoIiwgSm9pbihwYXJ0cywgIlxuICAgICAgIHwgIiksICIpIik7Ci0gIHJldHVybiByZXN1bHQgKyAiID09IDAiOwotfQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7Ci0gICAgLy8gU3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQuCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJpbnQgJGNsYXNzbmFtZSQ6OkJ5dGVTaXplKCkgY29uc3Qge1xuIgotICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2Vfc2V0X2J5dGVfc2l6ZV9zdGFydDokZnVsbF9uYW1lJClcbiIKLSAgICAgICAgIiAgaW50IHRvdGFsX3NpemUgPSBfZXh0ZW5zaW9uc18uTWVzc2FnZVNldEJ5dGVTaXplKCk7XG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7Ci0gICAgR09PR0xFX0NIRUNLKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkge1xuIgotICAgICAgIiAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpcbiIKLSAgICAgICIgICAgICBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMoKSk7XG4iCi0gICAgICAifVxuIik7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpO1xuIgotICAgICAgIiAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7XG4iCi0gICAgICAiICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTtcbiIKLSAgICAgICIgIHJldHVybiB0b3RhbF9zaXplO1xuIgotICAgICAgIn1cbiIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChudW1fcmVxdWlyZWRfZmllbGRzXyA+IDEgJiYgSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIC8vIEVtaXQgYSBmdW5jdGlvbiAocmFyZWx5IHVzZWQsIHdlIGhvcGUpIHRoYXQgaGFuZGxlcyB0aGUgcmVxdWlyZWQgZmllbGRzCi0gICAgLy8gYnkgY2hlY2tpbmcgZm9yIGVhY2ggb25lIGluZGl2aWR1YWxseS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImludCAkY2xhc3NuYW1lJDo6UmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCkgY29uc3Qge1xuIgotICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHJlcXVpcmVkX2ZpZWxkc19ieXRlX3NpemVfZmFsbGJhY2tfc3RhcnQ6IgotICAgICAgICAiJGZ1bGxfbmFtZSQpXG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoImludCB0b3RhbF9zaXplID0gMDtcbiIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgewotICAgICAgICBwcmludGVyLT5QcmludCgiXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwotICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOwotICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7Ci0gICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotICAgICAgfQotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgiXG4iCi0gICAgICAgICAgICAgICAgICAgInJldHVybiB0b3RhbF9zaXplO1xuIik7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KAotICAgICAgImludCAkY2xhc3NuYW1lJDo6Qnl0ZVNpemUoKSBjb25zdCB7XG4iCi0gICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0OiRmdWxsX25hbWUkKVxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLCAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJpbnQgdG90YWxfc2l6ZSA9IDA7XG4iCi0gICAgIlxuIik7Ci0KLSAgLy8gSGFuZGxlIHJlcXVpcmVkIGZpZWxkcyAoaWYgYW55KS4gIFdlIGV4cGVjdCBhbGwgb2YgdGhlbSB0byBiZQotICAvLyBwcmVzZW50LCBzbyBlbWl0IG9uZSBjb25kaXRpb25hbCB0aGF0IGNoZWNrcyBmb3IgdGhhdC4gIElmIHRoZXkgYXJlIGFsbAotICAvLyBwcmVzZW50IHRoZW4gdGhlIGZhc3QgcGF0aCBleGVjdXRlczsgb3RoZXJ3aXNlIHRoZSBzbG93IHBhdGggZXhlY3V0ZXMuCi0gIGlmIChudW1fcmVxdWlyZWRfZmllbGRzXyA+IDEgJiYgSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIC8vIFRoZSBmYXN0IHBhdGggd29ya3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KLSAgICB2ZWN0b3I8dWludDMyPiBtYXNrc19mb3JfaGFzX2JpdHMgPSBSZXF1aXJlZEZpZWxkc0JpdE1hc2soZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KChzdHJpbmcoImlmICgiKSArCi0gICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbmFsVG9DaGVja0JpdG1hc2tzKG1hc2tzX2Zvcl9oYXNfYml0cykgKwotICAgICAgICAgICAgICAgICAgICAiKSB7ICAvLyBBbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LlxuIikuY19zdHIoKSk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSkgY29udGludWU7Ci0gICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7Ci0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7Ci0gICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9IGVsc2Uge1xuIiAgLy8gdGhlIHNsb3cgcGF0aAotICAgICAgICAgICAgICAgICAgICIgIHRvdGFsX3NpemUgKz0gUmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCk7XG4iCi0gICAgICAgICAgICAgICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIC8vIG51bV9yZXF1aXJlZF9maWVsZHNfIDw9IDE6IG5vIG5lZWQgdG8gYmUgdHJpY2t5Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSkgY29udGludWU7Ci0gICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7Ci0gICAgICBwcmludGVyLT5QcmludCgiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7Ci0gICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKLSAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyBIYW5kbGUgb3B0aW9uYWwgZmllbGRzICh3b3JyeSBiZWxvdyBhYm91dCByZXBlYXRlZHMsIG9uZW9mcywgZXRjLikuCi0gIC8vIFRoZXNlIGFyZSBoYW5kbGVkIGluIGNodW5rcyBvZiA4LiAgVGhlIGZpcnN0IGNodW5rIGlzCi0gIC8vIHRoZSBub24tcmVxdWlyZWRzLW5vbi1yZXBlYXRlZHMtbm9uLXVuaW9ucy1ub24tZXh0ZW5zaW9ucyBpbgotICAvLyAgZGVzY3JpcHRvcl8tPmZpZWxkKDApLCBkZXNjcmlwdG9yXy0+ZmllbGQoMSksIC4uLiBkZXNjcmlwdG9yXy0+ZmllbGQoNyksCi0gIC8vIGFuZCB0aGUgc2Vjb25kIGNodW5rIGlzIHRoZSBzYW1lIGZvcgotICAvLyAgZGVzY3JpcHRvcl8tPmZpZWxkKDgpLCBkZXNjcmlwdG9yXy0+ZmllbGQoOSksIC4uLiBkZXNjcmlwdG9yXy0+ZmllbGQoMTUpLAotICAvLyBldGMuCi0gIGhhc2hfbWFwPGludCwgdWludDMyPiBmaWVsZHNfbWFza19mb3JfY2h1bms7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0gICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSAmJiAhZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKLSAgICAgICAgIWZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgIGZpZWxkc19tYXNrX2Zvcl9jaHVua1tpIC8gOF0gfD0gc3RhdGljX2Nhc3Q8dWludDMyPigxKSA8PCAoaSAlIDMyKTsKLSAgICB9Ci0gIH0KLQotICBpbnQgbGFzdF9pbmRleCA9IC0xOwotICBib29sIGNodW5rX2Jsb2NrX2luX3Byb2dyZXNzID0gZmFsc2U7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0gICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSAmJiAhZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKLSAgICAgICAgIWZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgIC8vIFNlZSBhYm92ZSBpbiBHZW5lcmF0ZUNsZWFyIGZvciBhbiBleHBsYW5hdGlvbiBvZiB0aGlzLgotICAgICAgLy8gVE9ETyhrZW50b24pOiAgU2hhcmUgY29kZT8gIFVuY2xlYXIgaG93IHRvIGRvIHNvIHdpdGhvdXQKLSAgICAgIC8vICAgb3Zlci1lbmdpbmVlcmluZy4KLSAgICAgIGlmIChpIC8gOCAhPSBsYXN0X2luZGV4IC8gOCB8fCBsYXN0X2luZGV4IDwgMCkgewotICAgICAgICAvLyBFbmQgcHJldmlvdXMgY2h1bmssIGlmIHRoZXJlIHdhcyBvbmUuCi0gICAgICAgIGlmIChjaHVua19ibG9ja19pbl9wcm9ncmVzcykgewotICAgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgICAgICBwcmludGVyLT5QcmludCgifVxuIik7Ci0gICAgICAgICAgY2h1bmtfYmxvY2tfaW5fcHJvZ3Jlc3MgPSBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBTdGFydCBjaHVuay4KLSAgICAgICAgdWludDMyIG1hc2sgPSBmaWVsZHNfbWFza19mb3JfY2h1bmtbaSAvIDhdOwotICAgICAgICBpbnQgY291bnQgPSBwb3BjbnQobWFzayk7Ci0gICAgICAgIEdPT0dMRV9EQ0hFQ0tfR0UoY291bnQsIDEpOwotICAgICAgICBpZiAoY291bnQgPT0gMSkgewotICAgICAgICAgIC8vIE5vICJpZiIgaGVyZSBiZWNhdXNlIHRoZSBjaHVuayBpcyB0cml2aWFsLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAgICAgImlmIChfaGFzX2JpdHNfWyRpbmRleCQgLyAzMl0gJiAkbWFzayR1KSB7XG4iLAotICAgICAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGkpLAotICAgICAgICAgICAgICAibWFzayIsIFNpbXBsZUl0b2EobWFzaykpOwotICAgICAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICAgICAgICBjaHVua19ibG9ja19pbl9wcm9ncmVzcyA9IHRydWU7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBsYXN0X2luZGV4ID0gaTsKLQotICAgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOwotCi0gICAgICBib29sIGhhdmVfZW5jbG9zaW5nX2lmID0gZmFsc2U7Ci0gICAgICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwKLSAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwotICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgICAgaGF2ZV9lbmNsb3NpbmdfaWYgPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2l0aG91dCBmaWVsZCBwcmVzZW5jZTogZmllbGQgaXMgc2VyaWFsaXplZCBvbmx5IGlmIGl0IGhhcyBhCi0gICAgICAgIC8vIG5vbi1kZWZhdWx0IHZhbHVlLgotICAgICAgICBoYXZlX2VuY2xvc2luZ19pZiA9IEVtaXRGaWVsZE5vbkRlZmF1bHRDb25kaXRpb24oCi0gICAgICAgICAgICBwcmludGVyLCAidGhpcy0+IiwgZmllbGQpOwotICAgICAgfQotCi0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7Ci0KLSAgICAgIGlmIChoYXZlX2VuY2xvc2luZ19pZikgewotICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJ9XG4iCi0gICAgICAgICAgIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNodW5rX2Jsb2NrX2luX3Byb2dyZXNzKSB7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgfQotCi0gIC8vIFJlcGVhdGVkIGZpZWxkcyBkb24ndCB1c2UgX2hhc19iaXRzXyBzbyB3ZSBjb3VudCB0aGVtIGluIGEgc2VwYXJhdGUKLSAgLy8gcGFzcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLQotICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOwotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUJ5dGVTaXplKHByaW50ZXIpOwotICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gRmllbGRzIGluc2lkZSBhIG9uZW9mIGRvbid0IHVzZSBfaGFzX2JpdHNfIHNvIHdlIGNvdW50IHRoZW0gaW4gYSBzZXBhcmF0ZQotICAvLyBwYXNzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAic3dpdGNoICgkb25lb2ZuYW1lJF9jYXNlKCkpIHtcbiIsCi0gICAgICAgICJvbmVvZm5hbWUiLCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGQoaik7Ci0gICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiY2FzZSBrJGZpZWxkX25hbWUkOiB7XG4iLAotICAgICAgICAgICJmaWVsZF9uYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKSk7Ci0gICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJicmVhaztcbiIpOwotICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIn1cbiIpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNhc2UgJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUOiB7XG4iCi0gICAgICAgICIgIGJyZWFrO1xuIgotICAgICAgICAifVxuIiwKLSAgICAgICAgImNhcF9vbmVvZl9uYW1lIiwKLSAgICAgICAgVG9VcHBlcihkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKSk7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAifVxuIik7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7XG4iCi0gICAgICAiXG4iKTsKLSAgfQotCi0gIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7XG4iCi0gICAgICAgICIgIHRvdGFsX3NpemUgKz1cbiIKLSAgICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoXG4iCi0gICAgICAgICIgICAgICB1bmtub3duX2ZpZWxkcygpKTtcbiIKLSAgICAgICAgIn1cbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInRvdGFsX3NpemUgKz0gdW5rbm93bl9maWVsZHMoKS5zaXplKCk7XG4iCi0gICAgICAgICJcbiIpOwotICAgIH0KLSAgfQotCi0gIC8vIFdlIHVwZGF0ZSBfY2FjaGVkX3NpemVfIGV2ZW4gdGhvdWdoIHRoaXMgaXMgYSBjb25zdCBtZXRob2QuICBJbiB0aGVvcnksCi0gIC8vIHRoaXMgaXMgbm90IHRocmVhZC1jb21wYXRpYmxlLCBiZWNhdXNlIGNvbmN1cnJlbnQgd3JpdGVzIGhhdmUgdW5kZWZpbmVkCi0gIC8vIHJlc3VsdHMuICBJbiBwcmFjdGljZSwgc2luY2UgYW55IGNvbmN1cnJlbnQgd3JpdGVzIHdpbGwgYmUgd3JpdGluZyB0aGUKLSAgLy8gZXhhY3Qgc2FtZSB2YWx1ZSwgaXQgd29ya3Mgb24gYWxsIGNvbW1vbiBwcm9jZXNzb3JzLiAgSW4gYSBmdXR1cmUgdmVyc2lvbgotICAvLyBvZiBDKyssIF9jYWNoZWRfc2l6ZV8gc2hvdWxkIGJlIG1hZGUgaW50byBhbiBhdG9taWM8aW50Pi4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIkdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7XG4iCi0gICAgIl9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplO1xuIgotICAgICJHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTtcbiIKLSAgICAicmV0dXJuIHRvdGFsX3NpemU7XG4iKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlSXNJbml0aWFsaXplZChpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAiYm9vbCAkY2xhc3NuYW1lJDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4gIFdlIGNhbiBkbyB0aGlzCi0gICAgLy8gbW9zdCBlZmZpY2llbnRseSBieSBjaGVja2luZyAzMiAiaGFzIGJpdHMiIGF0IGEgdGltZS4KLSAgICBpbnQgaGFzX2JpdHNfYXJyYXlfc2l6ZSA9IChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSArIDMxKSAvIDMyOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzX2JpdHNfYXJyYXlfc2l6ZTsgaSsrKSB7Ci0gICAgICB1aW50MzIgbWFzayA9IDA7Ci0gICAgICBmb3IgKGludCBiaXQgPSAwOyBiaXQgPCAzMjsgYml0KyspIHsKLSAgICAgICAgaW50IGluZGV4ID0gaSAqIDMyICsgYml0OwotICAgICAgICBpZiAoaW5kZXggPj0gZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpIGJyZWFrOwotICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGluZGV4KTsKLQotICAgICAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKLSAgICAgICAgICBtYXNrIHw9IDEgPDwgYml0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChtYXNrICE9IDApIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmICgoX2hhc19iaXRzX1skaSRdICYgMHgkbWFzayQpICE9IDB4JG1hc2skKSByZXR1cm4gZmFsc2U7XG4iLAotICAgICAgICAgICJpIiwgU2ltcGxlSXRvYShpKSwKLSAgICAgICAgICAibWFzayIsIFN0ckNhdChzdHJpbmdzOjpIZXgobWFzaywgc3RyaW5nczo6WkVST19QQURfOCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgY2hlY2sgdGhhdCBhbGwgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgotICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKLSAgICAgICAgIVNob3VsZElnbm9yZVJlcXVpcmVkRmllbGRDaGVjayhmaWVsZCwgb3B0aW9uc18pICYmCi0gICAgICAgIEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgb3B0aW9uc18pKSB7Ci0gICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+JG5hbWUkKCkpKSIKLSAgICAgICAgICAiIHJldHVybiBmYWxzZTtcbiIsCi0gICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLndlYWsoKSB8fCAhZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgICAgIC8vIEZvciB3ZWFrIGZpZWxkcywgdXNlIHRoZSBkYXRhIG1lbWJlciAoOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKikgaW5zdGVhZAotICAgICAgICAgIC8vIG9mIHRoZSBnZXR0ZXIgdG8gYXZvaWQgYSBsaW5rIGRlcGVuZGVuY3kgb24gdGhlIHdlYWsgbWVzc2FnZSB0eXBlCi0gICAgICAgICAgLy8gd2hpY2ggaXMgb25seSBmb3J3YXJkIGRlY2xhcmVkLgotICAgICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIgotICAgICAgICAgICAgICAiICBpZiAoIXRoaXMtPiRuYW1lJF8tPklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIgotICAgICAgICAgICAgIiAgaWYgKCF0aGlzLT4kbmFtZSQoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgICAgICJ9XG4iLAotICAgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiXG4iCi0gICAgICAiaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Iik7Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICIgIHJldHVybiB0cnVlO1xuIgotICAgICJ9XG4iKTsKLX0KLQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDMxMjIzZTEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDIwOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfSF9fCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBuYW1lc3BhY2UgaW8gewotICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAotICB9Ci19Ci0KLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGNwcCB7Ci0KLWNsYXNzIEVudW1HZW5lcmF0b3I7ICAgICAgICAgICAvLyBlbnVtLmgKLWNsYXNzIEV4dGVuc2lvbkdlbmVyYXRvcjsgICAgICAvLyBleHRlbnNpb24uaAotCi1jbGFzcyBNZXNzYWdlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgotICBNZXNzYWdlR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+TWVzc2FnZUdlbmVyYXRvcigpOwotCi0gIC8vIEhlYWRlciBzdHVmZi4KLQotICAvLyBSZXR1cm4gbmFtZXMgZm9yIGZvd2FyZCBkZWNsYXJhdGlvbnMgb2YgdGhpcyBjbGFzcyBhbmQgYWxsIGl0cyBuZXN0ZWQKLSAgLy8gdHlwZXMuIEEgZ2l2ZW4ga2V5IGluIHtjbGFzcyxlbnVtfV9uYW1lcyB3aWxsIG1hcCBmcm9tIGEgY2xhc3MgbmFtZSB0byB0aGUKLSAgLy8gZGVzY3JpcHRvciB0aGF0IHdhcyByZXNwb25zaWJsZSBmb3IgaXRzIGluY2x1c2lvbiBpbiB0aGUgbWFwLiBUaGlzIGNhbiBiZQotICAvLyB1c2VkIHRvIGFzc29jaWF0ZSB0aGUgZGVzY3JpcHRvciB3aXRoIHRoZSBjb2RlIGdlbmVyYXRlZCBmb3IgaXQuCi0gIHZvaWQgRmlsbE1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKAotICAgICAgbWFwPHN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+KiBjbGFzc19uYW1lcyk7Ci0gIHZvaWQgRmlsbEVudW1Gb3J3YXJkRGVjbGFyYXRpb25zKAotICAgICAgbWFwPHN0cmluZywgY29uc3QgRW51bURlc2NyaXB0b3IqPiogZW51bV9uYW1lcyk7Ci0KLSAgLy8gR2VuZXJhdGUgZGVmaW5pdGlvbnMgb2YgYWxsIG5lc3RlZCBlbnVtcyAobXVzdCBjb21lIGJlZm9yZSBjbGFzcwotICAvLyBkZWZpbml0aW9ucyBiZWNhdXNlIHRob3NlIGNsYXNzZXMgdXNlIHRoZSBlbnVtcyBkZWZpbml0aW9ucykuCi0gIHZvaWQgR2VuZXJhdGVFbnVtRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIHNwZWNpYWxpemF0aW9ucyBvZiBHZXRFbnVtRGVzY3JpcHRvcjxNeUVudW0+KCkuCi0gIC8vIFByZWNvbmRpdGlvbjogaW4gOjpnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZS4KLSAgdm9pZCBHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBmb3IgdGhpcyBjbGFzcyBhbmQgYWxsIGl0cyBuZXN0ZWQgdHlwZXMuCi0gIHZvaWQgR2VuZXJhdGVDbGFzc0RlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIGRlZmluaXRpb25zIG9mIGlubGluZSBtZXRob2RzIChwbGFjZWQgYXQgdGhlIGVuZCBvZiB0aGUgaGVhZGVyCi0gIC8vIGZpbGUpLgotICB2b2lkIEdlbmVyYXRlSW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpOwotCi0gIC8vIERlcGVuZGVudCBtZXRob2RzIGFyZSBhbHdheXMgaW5saW5lLgotICB2b2lkIEdlbmVyYXRlRGVwZW5kZW50SW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gU291cmNlIGZpbGUgc3R1ZmYuCi0KLSAgLy8gR2VuZXJhdGUgY29kZSB3aGljaCBkZWNsYXJlcyBhbGwgdGhlIGdsb2JhbCBkZXNjcmlwdG9yIHBvaW50ZXJzIHdoaWNoCi0gIC8vIHdpbGwgYmUgaW5pdGlhbGl6ZWQgYnkgdGhlIG1ldGhvZHMgYmVsb3cuCi0gIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIGdsb2JhbCB2YXJpYWJsZSBzdG9yaW5nIHRoZSBtZXNzYWdlJ3MKLSAgLy8gZGVzY3JpcHRvci4KLSAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlciwgaW50IGluZGV4KTsKLQotICAvLyBHZW5lcmF0ZSBjb2RlIHRoYXQgY2FsbHMgTWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKCkKLSAgLy8gZm9yIGFsbCB0eXBlcy4KLSAgdm9pZCBHZW5lcmF0ZVR5cGVSZWdpc3RyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZXMgY29kZSB0aGF0IGFsbG9jYXRlcyB0aGUgbWVzc2FnZSdzIGRlZmF1bHQgaW5zdGFuY2UuCi0gIHZvaWQgR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlcyBjb2RlIHRoYXQgaW5pdGlhbGl6ZXMgdGhlIG1lc3NhZ2UncyBkZWZhdWx0IGluc3RhbmNlLiAgVGhpcwotICAvLyBpcyBzZXBhcmF0ZSBmcm9tIGFsbG9jYXRpbmcgYmVjYXVzZSBhbGwgZGVmYXVsdCBpbnN0YW5jZXMgbXVzdCBiZQotICAvLyBhbGxvY2F0ZWQgYmVmb3JlIGFueSBjYW4gYmUgaW5pdGlhbGl6ZWQuCi0gIHZvaWQgR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGVzIGNvZGUgdGhhdCBzaG91bGQgYmUgcnVuIHdoZW4gU2h1dGRvd25Qcm90b2J1ZkxpYnJhcnkoKSBpcyBjYWxsZWQsCi0gIC8vIHRvIGRlbGV0ZSBhbGwgZHluYW1pY2FsbHktYWxsb2NhdGVkIG9iamVjdHMuCi0gIHZvaWQgR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIGFsbCBub24taW5saW5lIG1ldGhvZHMgZm9yIHRoaXMgY2xhc3MuCi0gIHZvaWQgR2VuZXJhdGVDbGFzc01ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gcHJpdmF0ZToKLSAgLy8gR2VuZXJhdGUgZGVjbGFyYXRpb25zIGFuZCBkZWZpbml0aW9ucyBvZiBhY2Nlc3NvcnMgZm9yIGZpZWxkcy4KLSAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEJhc2VDbGFzc0RlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlRGVwZW5kZW50RmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgaXNfaW5saW5lKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgZmllbGQgb2Zmc2V0cyBhcnJheS4KLSAgdm9pZCBHZW5lcmF0ZU9mZnNldHMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3Rvci4KLSAgdm9pZCBHZW5lcmF0ZVN0cnVjdG9ycyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gVGhlIGNvbXBpbGVyIHR5cGljYWxseSBnZW5lcmF0ZXMgbXVsdGlwbGUgY29waWVzIG9mIGVhY2ggY29uc3RydWN0b3IgYW5kCi0gIC8vIGRlc3RydWN0b3I6IGh0dHA6Ly9nY2MuZ251Lm9yZy9idWdzLmh0bWwjbm9uYnVnc19jeHgKLSAgLy8gUGxhY2luZyBjb21tb24gY29kZSBpbiBhIHNlcGFyYXRlIG1ldGhvZCByZWR1Y2VzIHRoZSBnZW5lcmF0ZWQgY29kZSBzaXplLgotICAvLwotICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGNvbnN0cnVjdG9yIGNvZGUuCi0gIHZvaWQgR2VuZXJhdGVTaGFyZWRDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGRlc3RydWN0b3IgY29kZS4KLSAgdm9pZCBHZW5lcmF0ZVNoYXJlZERlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgLy8gR2VuZXJhdGUgdGhlIGFyZW5hLXNwZWNpZmljIGRlc3RydWN0b3IgY29kZS4KLSAgdm9pZCBHZW5lcmF0ZUFyZW5hRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIHN0YW5kYXJkIE1lc3NhZ2UgbWV0aG9kcy4KLSAgdm9pZCBHZW5lcmF0ZUNsZWFyKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZU9uZW9mQ2xlYXIoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keShpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB0b19hcnJheSk7Ci0gIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnZUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlQ29weUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlU3dhcChpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBIZWxwZXJzIGZvciBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLgotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB1bmJvdW5kZWQpOwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UoCi0gICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlLAotICAgICAgYm9vbCB1bmJvdW5kZWQpOwotCi0KLSAgLy8gR2VuZXJhdGVzIGhhc19mb28oKSBmdW5jdGlvbnMgYW5kIHZhcmlhYmxlcyBmb3Igc2luZ3VsYXIgZmllbGQgaGFzLWJpdHMuCi0gIHZvaWQgR2VuZXJhdGVTaW5ndWxhckZpZWxkSGFzQml0cyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOwotICAvLyBHZW5lcmF0ZXMgaGFzX2ZvbygpIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGZvciBvbmVvZiBmaWVsZCBoYXMtYml0cy4KLSAgdm9pZCBHZW5lcmF0ZU9uZW9mSGFzQml0cyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpOwotICAvLyBHZW5lcmF0ZXMgaGFzX2Zvb19iYXIoKSBmdW5jdGlvbnMgZm9yIG9uZW9mIG1lbWJlcnMuCi0gIHZvaWQgR2VuZXJhdGVPbmVvZk1lbWJlckhhc0JpdHMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgLy8gR2VuZXJhdGVzIHRoZSBjbGVhcl9mb28oKSBtZXRob2QgZm9yIGEgZmllbGQuCi0gIHZvaWQgR2VuZXJhdGVGaWVsZENsZWFyKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgc3RyaW5nIGNsYXNzbmFtZV87Ci0gIE9wdGlvbnMgb3B0aW9uc187Ci0gIEZpZWxkR2VuZXJhdG9yTWFwIGZpZWxkX2dlbmVyYXRvcnNfOwotICB2ZWN0b3I8IHZlY3RvcjxzdHJpbmc+ID4gcnVuc19vZl9maWVsZHNfOyAgLy8gdGhhdCBtaWdodCBiZSB0cml2aWFsbHkgY2xlYXJlZAotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPiA+IG5lc3RlZF9nZW5lcmF0b3JzXzsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RW51bUdlbmVyYXRvcj4gPiBlbnVtX2dlbmVyYXRvcnNfOwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+ID4gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfOwotICBpbnQgbnVtX3JlcXVpcmVkX2ZpZWxkc187Ci0gIGJvb2wgdXNlc19zdHJpbmdfOwotICBib29sIHVzZV9kZXBlbmRlbnRfYmFzZV87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VHZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMzJjMDI2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTA1NSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi1uYW1lc3BhY2UgewotCi12b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7Ci0gICgqdmFyaWFibGVzKVsidHlwZSJdID0gRmllbGRNZXNzYWdlVHlwZU5hbWUoZGVzY3JpcHRvcik7Ci0gIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkud2VhaygpIHx8ICFkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAoKnZhcmlhYmxlcylbIm5vbl9udWxsX3B0cl90b19uYW1lIl0gPQotICAgICAgICBTdHJDYXQoInRoaXMtPiIsICgqdmFyaWFibGVzKVsibmFtZSJdLCAiXyIpOwotICB9Ci0gICgqdmFyaWFibGVzKVsic3RyZWFtX3dyaXRlciJdID0KLSAgICAgICgqdmFyaWFibGVzKVsiZGVjbGFyZWRfdHlwZSJdICsKLSAgICAgIChIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5maWxlKCksIG9wdGlvbnMpCi0gICAgICAgICAgID8gIk1heWJlVG9BcnJheSIKLSAgICAgICAgICAgOiAiIik7Ci0gIC8vIE5PVEU6IEVzY2FwZWQgaGVyZSB0byB1bmJsb2NrIHByb3RvMS0+cHJvdG8yIG1pZ3JhdGlvbi4KLSAgLy8gVE9ETyhsaXVqaXNpKTogRXh0ZW5kIHRoaXMgdG8gYXBwbHkgZm9yIG90aGVyIGNvbmZsaWN0aW5nIG1ldGhvZHMuCi0gICgqdmFyaWFibGVzKVsicmVsZWFzZV9uYW1lIl0gPQotICAgICAgU2FmZUZ1bmN0aW9uTmFtZShkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgInJlbGVhc2VfIik7Ci0gICgqdmFyaWFibGVzKVsiZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKLSAgaWYgKG9wdGlvbnMucHJvdG9faCAmJiBJc0ZpZWxkRGVwZW5kZW50KGRlc2NyaXB0b3IpKSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJkZXBlbmRlbnRfdHlwZSJdID0gIlQ6OiIgKyBEZXBlbmRlbnRUeXBlTmFtZShkZXNjcmlwdG9yKTsKLSAgICAoKnZhcmlhYmxlcylbImRlcGVuZGVudF90eXBlbmFtZSJdID0KLSAgICAgICAgInR5cGVuYW1lIFQ6OiIgKyBEZXBlbmRlbnRUeXBlTmFtZShkZXNjcmlwdG9yKTsKLSAgfSBlbHNlIHsKLSAgICAoKnZhcmlhYmxlcylbImRlcGVuZGVudF90eXBlIl0gPSBGaWVsZE1lc3NhZ2VUeXBlTmFtZShkZXNjcmlwdG9yKTsKLSAgICAoKnZhcmlhYmxlcylbImRlcGVuZGVudF90eXBlbmFtZSJdID0gRmllbGRNZXNzYWdlVHlwZU5hbWUoZGVzY3JpcHRvcik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgICA6IEZpZWxkR2VuZXJhdG9yKG9wdGlvbnMpLAotICAgICAgZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCi0gICAgICBkZXBlbmRlbnRfZmllbGRfKG9wdGlvbnMucHJvdG9faCAmJiBJc0ZpZWxkRGVwZW5kZW50KGRlc2NyaXB0b3IpKSB7Ci0gIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOwotfQotCi1NZXNzYWdlRmllbGRHZW5lcmF0b3I6On5NZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkdHlwZSQqICRuYW1lJF87XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVHZXR0ZXJEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgJHR5cGUkJiAkbmFtZSQoKSBjb25zdDtcbiIpOwotfQotCi12b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmICghZGVwZW5kZW50X2ZpZWxkXykgewotICAgIHJldHVybjsKLSAgfQotICAvLyBBcmVuYSBtYW5pcHVsYXRpb24gY29kZSBpcyBvdXQtb2YtbGluZSBpbiB0aGUgZGVyaXZlZCBtZXNzYWdlIGNsYXNzLgotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogbXV0YWJsZV8kbmFtZSQoKTtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqICRyZWxlYXNlX25hbWUkKCk7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCk7XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAicHJpdmF0ZTpcbiIKLSAgICAgICAidm9pZCBfc2xvd19tdXRhYmxlXyRuYW1lJCgpO1xuIik7Ci0gICAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgInZvaWQgX3Nsb3dfc2V0X2FsbG9jYXRlZF8kbmFtZSQoXG4iCi0gICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBtZXNzYWdlX2FyZW5hLCAkdHlwZSQqKiAkbmFtZSQpO1xuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgIiR0eXBlJCogX3Nsb3dfJHJlbGVhc2VfbmFtZSQoKTtcbiIKLSAgICAgICAicHVibGljOlxuIik7Ci0gIH0KLSAgR2VuZXJhdGVHZXR0ZXJEZWNsYXJhdGlvbihwcmludGVyKTsKLSAgaWYgKCFkZXBlbmRlbnRfZmllbGRfKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogbXV0YWJsZV8kbmFtZSQoKTtcbiIKLSAgICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogJHJlbGVhc2VfbmFtZSQoKTtcbiIKLSAgICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0X2FsbG9jYXRlZF8kbmFtZSQoJHR5cGUkKiAkbmFtZSQpO1xuIik7Ci0gIH0KLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqIHVuc2FmZV9hcmVuYV9yZWxlYXNlXyRuYW1lJCgpO1xuIgotICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF8kbmFtZSQoXG4iCi0gICAgICAiICAgICR0eXBlJCogJG5hbWUkKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6X3Nsb3dfbXV0YWJsZV8kbmFtZSQoKSB7XG4iKTsKLSAgICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICAgIiAgJG5hbWUkXyA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8ICR0eXBlJCA+KFxuIgotICAgICAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgICAiICAkbmFtZSRfID0gOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlPCAkdHlwZSQgPihcbiIKLSAgICAgICAgICAiICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iKTsKLSAgICAgIH0KLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIn1cbiIKLSAgICAgICIkdHlwZSQqICRjbGFzc25hbWUkOjpfc2xvd18kcmVsZWFzZV9uYW1lJCgpIHtcbiIKLSAgICAgICIgIGlmICgkbmFtZSRfID09IE5VTEwpIHtcbiIKLSAgICAgICIgICAgcmV0dXJuIE5VTEw7XG4iCi0gICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgIiAgICAkdHlwZSQqIHRlbXAgPSBuZXcgJHR5cGUkO1xuIgotICAgICAgIiAgICB0ZW1wLT5NZXJnZUZyb20oKiRuYW1lJF8pO1xuIgotICAgICAgIiAgICAkbmFtZSRfID0gTlVMTDtcbiIKLSAgICAgICIgICAgcmV0dXJuIHRlbXA7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAifVxuIgotICAgICAgIiR0eXBlJCogJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9yZWxlYXNlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgICRjbGVhcl9oYXNiaXQkXG4iCi0gICAgICAiICAkdHlwZSQqIHRlbXAgPSAkbmFtZSRfO1xuIgotICAgICAgIiAgJG5hbWUkXyA9IE5VTEw7XG4iCi0gICAgICAiICByZXR1cm4gdGVtcDtcbiIKLSAgICAgICJ9XG4iKTsKLSAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgLy8gTk9URTogdGhlIHNhbWUgbG9naWMgaXMgbWlycm9yZWQgaW4gd2Vha19tZXNzYWdlX2ZpZWxkLmNjLiBBbnkKLSAgICAgIC8vIGFyZW5hLXJlbGF0ZWQgc2VtYW50aWNzIGNoYW5nZXMgc2hvdWxkIGJlIG1hZGUgaW4gYm90aCBwbGFjZXMuCi0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpfc2xvd19zZXRfYWxsb2NhdGVkXyRuYW1lJChcbiIKLSAgICAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEsICR0eXBlJCoqICRuYW1lJCkge1xuIgotICAgICAgICAgICIgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gTlVMTCAmJiBcbiIKLSAgICAgICAgICAiICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpHZXRBcmVuYSgqJG5hbWUkKSA9PSBOVUxMKSB7XG4iCi0gICAgICAgICAgIiAgICAgIG1lc3NhZ2VfYXJlbmEtPk93bigqJG5hbWUkKTtcbiIKLSAgICAgICAgICAiICAgIH0gZWxzZSBpZiAobWVzc2FnZV9hcmVuYSAhPVxuIgotICAgICAgICAgICIgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpHZXRBcmVuYSgqJG5hbWUkKSkge1xuIgotICAgICAgICAgICIgICAgICAkdHlwZSQqIG5ld18kbmFtZSQgPSBcbiIKLSAgICAgICAgICAiICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWVzc2FnZTwgJHR5cGUkID4oXG4iCi0gICAgICAgICAgIiAgICAgICAgICAgIG1lc3NhZ2VfYXJlbmEpO1xuIgotICAgICAgICAgICIgICAgICBuZXdfJG5hbWUkLT5Db3B5RnJvbSgqKiRuYW1lJCk7XG4iCi0gICAgICAgICAgIiAgICAgICokbmFtZSQgPSBuZXdfJG5hbWUkO1xuIgotICAgICAgICAgICIgICAgfVxuIgotICAgICAgICAgICJ9XG4iKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJ2b2lkICRjbGFzc25hbWUkOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF8kbmFtZSQoXG4iCi0gICAgICAiICAgICR0eXBlJCogJG5hbWUkKSB7XG4iCi0gICAgICAvLyBJZiB3ZSdyZSBub3Qgb24gYW4gYXJlbmEsIGZyZWUgd2hhdGV2ZXIgd2Ugd2VyZSBob2xkaW5nIGJlZm9yZS4KLSAgICAgIC8vIChJZiB3ZSBhcmUgb24gYXJlbmEsIHdlIGNhbiBqdXN0IGZvcmdldCB0aGUgZWFybGllciBwb2ludGVyLikKLSAgICAgICIgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IE5VTEwpIHtcbiIKLSAgICAgICIgICAgZGVsZXRlICRuYW1lJF87XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAkbmFtZSRfID0gJG5hbWUkO1xuIgotICAgICAgIiAgaWYgKCRuYW1lJCkge1xuIgotICAgICAgIiAgICAkc2V0X2hhc2JpdCRcbiIKLSAgICAgICIgIH0gZWxzZSB7XG4iCi0gICAgICAiICAgICRjbGVhcl9oYXNiaXQkXG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQiCi0gICAgICAiOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRGVwZW5kZW50SW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoIWRlcGVuZGVudF9maWVsZF8pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgLy8gRm9yIHRoZSBDUlRQIGJhc2UgY2xhc3MsIGFsbCBtdXRhdGlvbiBtZXRob2RzIGFyZSBkZXBlbmRlbnQsIGFuZCBzbwotICAvLyB0aGV5IG11c3QgYmUgaW4gdGhlIGhlYWRlci4KLSAgdmFyaWFibGVzWyJkZXBlbmRlbnRfY2xhc3NuYW1lIl0gPQotICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkgKyAiPFQ+IjsKLSAgdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSA9IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpOwotICBpZiAoIXZhcmlhYmxlc1sic2V0X2hhc2JpdCJdLmVtcHR5KCkpIHsKLSAgICB2YXJpYWJsZXNbInNldF9oYXNiaXQiXSA9Ci0gICAgICAgIHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gKyB2YXJpYWJsZXNbInNldF9oYXNiaXQiXTsKLSAgfQotICBpZiAoIXZhcmlhYmxlc1siY2xlYXJfaGFzYml0Il0uZW1wdHkoKSkgewotICAgIHZhcmlhYmxlc1siY2xlYXJfaGFzYml0Il0gPQotICAgICAgICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdICsgdmFyaWFibGVzWyJjbGVhcl9oYXNiaXQiXTsKLSAgfQotCi0gIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iCi0gICAgICAiaW5saW5lICR0eXBlJCogJGRlcGVuZGVudF9jbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgJGRlcGVuZGVudF90eXBlbmFtZSQqJiAkbmFtZSRfID0gJHRoaXNfbWVzc2FnZSQkbmFtZSRfO1xuIgotICAgICAgIiAgaWYgKCRuYW1lJF8gPT0gTlVMTCkge1xuIgotICAgICAgIiAgICAkdGhpc19tZXNzYWdlJF9zbG93X211dGFibGVfJG5hbWUkKCk7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKLSAgICAgICJpbmxpbmUgJHR5cGUkKiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICAkZGVwZW5kZW50X3R5cGVuYW1lJComICRuYW1lJF8gPSAkdGhpc19tZXNzYWdlJCRuYW1lJF87XG4iCi0gICAgICAiICAkY2xlYXJfaGFzYml0JFxuIgotICAgICAgIiAgaWYgKCR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSAhPSBOVUxMKSB7XG4iCi0gICAgICAiICAgIHJldHVybiAkdGhpc19tZXNzYWdlJF9zbG93XyRyZWxlYXNlX25hbWUkKCk7XG4iCi0gICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgIiAgICAkZGVwZW5kZW50X3R5cGVuYW1lJCogdGVtcCA9ICRuYW1lJF87XG4iCi0gICAgICAiICAgICRuYW1lJF8gPSBOVUxMO1xuIgotICAgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICJ9XG4iCi0gICAgICAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iCi0gICAgICAiaW5saW5lIHZvaWQgJGRlcGVuZGVudF9jbGFzc25hbWUkOjoiCi0gICAgICAic2V0X2FsbG9jYXRlZF8kbmFtZSQoJHR5cGUkKiAkbmFtZSQpIHtcbiIKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEgPSAkdGhpc19tZXNzYWdlJEdldEFyZW5hTm9WaXJ0dWFsKCk7XG4iCi0gICAgICAiICAkZGVwZW5kZW50X3R5cGVuYW1lJComICRuYW1lJF8gPSAkdGhpc19tZXNzYWdlJCRuYW1lJF87XG4iCi0gICAgICAiICBpZiAobWVzc2FnZV9hcmVuYSA9PSBOVUxMKSB7XG4iCi0gICAgICAiICAgIGRlbGV0ZSAkbmFtZSRfO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMKSB7XG4iKTsKLSAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgLy8gSWYgd2UncmUgb24gYW4gYXJlbmEgYW5kIHRoZSBpbmNvbWluZyBtZXNzYWdlIGlzIG5vdCwgc2ltcGx5IE93bigpIGl0Ci0gICAgICAvLyByYXRoZXIgdGhhbiBjb3B5IHRvIHRoZSBhcmVuYSAtLSBlaXRoZXIgd2F5IHdlIG5lZWQgYSBoZWFwIGRlYWxsb2MsCi0gICAgICAvLyBzbyB3ZSBtaWdodCBhcyB3ZWxsIGRlZmVyIGl0LiBPdGhlcndpc2UsIGlmIGluY29taW5nIG1lc3NhZ2UgaXMgb24gYQotICAgICAgLy8gZGlmZmVyZW50IG93bmVyc2hpcCBkb21haW4gKHNwZWNpZmljIGFyZW5hLCBvciB0aGUgaGVhcCkgdGhhbiB3ZSBhcmUsCi0gICAgICAvLyBjb3B5IHRvIG91ciBhcmVuYSAob3IgaGVhcCwgYXMgdGhlIGNhc2UgbWF5IGJlKS4KLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICAgIiAgICAkdGhpc19tZXNzYWdlJF9zbG93X3NldF9hbGxvY2F0ZWRfJG5hbWUkKG1lc3NhZ2VfYXJlbmEsICIKLSAgICAgICAgIiYkbmFtZSQpO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICAgIiAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBOVUxMKSB7XG4iCi0gICAgICAgICIgICAgICBtZXNzYWdlX2FyZW5hLT5Pd24oJG5hbWUkKTtcbiIKLSAgICAgICAgIiAgICB9XG4iKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgIiAgfVxuIgotICAgICAgIiAgJG5hbWUkXyA9ICRuYW1lJDtcbiIKLSAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIKLSAgICAgICIgICAgJHNldF9oYXNiaXQkXG4iCi0gICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgIiAgICAkY2xlYXJfaGFzYml0JFxuIgotICAgICAgIiAgfVxuIgotICAgICAgLy8gVE9ETyhkbGopOiBtb3ZlIGluc2VydGlvbiBwb2ludHMgdG8gbWVzc2FnZSBjbGFzcy4KLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKLSAgICAgICJpbmxpbmUgJHR5cGUkKiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCi0gICAgICAiICAkZGVwZW5kZW50X3R5cGVuYW1lJComICRuYW1lJF8gPSAkdGhpc19tZXNzYWdlJCRuYW1lJF87XG4iCi0gICAgICAiICBpZiAoJG5hbWUkXyA9PSBOVUxMKSB7XG4iCi0gICAgICAiICAgICRuYW1lJF8gPSBuZXcgJGRlcGVuZGVudF90eXBlbmFtZSQ7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKLSAgICAgICJpbmxpbmUgJHR5cGUkKiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICAkY2xlYXJfaGFzYml0JFxuIgotICAgICAgIiAgJGRlcGVuZGVudF90eXBlbmFtZSQqJiAkbmFtZSRfID0gJHRoaXNfbWVzc2FnZSQkbmFtZSRfO1xuIgotICAgICAgIiAgJGRlcGVuZGVudF90eXBlbmFtZSQqIHRlbXAgPSAkbmFtZSRfO1xuIgotICAgICAgIiAgJG5hbWUkXyA9IE5VTEw7XG4iCi0gICAgICAiICByZXR1cm4gdGVtcDtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iCi0gICAgICAiaW5saW5lIHZvaWQgJGRlcGVuZGVudF9jbGFzc25hbWUkOjoiCi0gICAgICAic2V0X2FsbG9jYXRlZF8kbmFtZSQoJHR5cGUkKiAkbmFtZSQpIHtcbiIKLSAgICAgICIgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiYgJG5hbWUkXyA9ICR0aGlzX21lc3NhZ2UkJG5hbWUkXztcbiIKLSAgICAgICIgIGRlbGV0ZSAkbmFtZSRfO1xuIik7Ci0KLSAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMICYmIHN0YXRpY19jYXN0PCAkZGVwZW5kZW50X3R5cGVuYW1lJCogPigkbmFtZSQpIgotICAgICAgIi0+R2V0QXJlbmEoKSAhPSBOVUxMKSB7XG4iCi0gICAgICAiICAgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiBuZXdfJG5hbWUkID0gbmV3ICRkZXBlbmRlbnRfdHlwZW5hbWUkO1xuIgotICAgICAgIiAgICBuZXdfJG5hbWUkLT5Db3B5RnJvbSgqJG5hbWUkKTtcbiIKLSAgICAgICIgICAgJG5hbWUkID0gbmV3XyRuYW1lJDtcbiIKLSAgICAgICIgIH1cbiIpOwotICAgIH0KLQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIgICRuYW1lJF8gPSAkbmFtZSQ7XG4iCi0gICAgICAiICBpZiAoJG5hbWUkKSB7XG4iCi0gICAgICAiICAgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3QgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUgIiA6ICIiOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiRpbmxpbmUkY29uc3QgJHR5cGUkJiAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iKTsKLQotICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICB2YXJpYWJsZXMsIGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfLCBwcmludGVyLAotICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotICAgICAgIiAgcmV0dXJuICRuYW1lJF8gIT0gTlVMTCA/ICokbmFtZSRfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT4kbmFtZSRfO1xuIiwKLSAgICAgIC8vIFdpdGhvdXQuCi0gICAgICAiICByZXR1cm4gJG5hbWUkXyAhPSBOVUxMID8gKiRuYW1lJF8gOiAqZGVmYXVsdF9pbnN0YW5jZSgpLiRuYW1lJF87XG4iKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLCAifVxuIik7Ci0KLSAgaWYgKGRlcGVuZGVudF9maWVsZF8pIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgIiRpbmxpbmUkIgotICAgICAgIiR0eXBlJCogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCi0gICAgICAiICBpZiAoJG5hbWUkXyA9PSBOVUxMKSB7XG4iCi0gICAgICAiICAgIF9zbG93X211dGFibGVfJG5hbWUkKCk7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCIKLSAgICAgICIkdHlwZSQqICRjbGFzc25hbWUkOjokcmVsZWFzZV9uYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpIHtcbiIKLSAgICAgICIgICAgcmV0dXJuIF9zbG93XyRyZWxlYXNlX25hbWUkKCk7XG4iCi0gICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgIiAgICAkdHlwZSQqIHRlbXAgPSAkbmFtZSRfO1xuIgotICAgICAgIiAgICAkbmFtZSRfID0gTlVMTDtcbiIKLSAgICAgICIgICAgcmV0dXJuIHRlbXA7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkICIKLSAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCkge1xuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9IEdldEFyZW5hTm9WaXJ0dWFsKCk7XG4iCi0gICAgICAiICBpZiAobWVzc2FnZV9hcmVuYSA9PSBOVUxMKSB7XG4iCi0gICAgICAiICAgIGRlbGV0ZSAkbmFtZSRfO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMKSB7XG4iKTsKLSAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgLy8gSWYgd2UncmUgb24gYW4gYXJlbmEgYW5kIHRoZSBpbmNvbWluZyBtZXNzYWdlIGlzIG5vdCwgc2ltcGx5IE93bigpIGl0Ci0gICAgICAvLyByYXRoZXIgdGhhbiBjb3B5IHRvIHRoZSBhcmVuYSAtLSBlaXRoZXIgd2F5IHdlIG5lZWQgYSBoZWFwIGRlYWxsb2MsCi0gICAgICAvLyBzbyB3ZSBtaWdodCBhcyB3ZWxsIGRlZmVyIGl0LiBPdGhlcndpc2UsIGlmIGluY29taW5nIG1lc3NhZ2UgaXMgb24gYQotICAgICAgLy8gZGlmZmVyZW50IG93bmVyc2hpcCBkb21haW4gKHNwZWNpZmljIGFyZW5hLCBvciB0aGUgaGVhcCkgdGhhbiB3ZSBhcmUsCi0gICAgICAvLyBjb3B5IHRvIG91ciBhcmVuYSAob3IgaGVhcCwgYXMgdGhlIGNhc2UgbWF5IGJlKS4KLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICAgIiAgICBfc2xvd19zZXRfYWxsb2NhdGVkXyRuYW1lJChtZXNzYWdlX2FyZW5hLCAmJG5hbWUkKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAgICIgICAgaWYgKG1lc3NhZ2VfYXJlbmEgIT0gTlVMTCkge1xuIgotICAgICAgICAiICAgICAgbWVzc2FnZV9hcmVuYS0+T3duKCRuYW1lJCk7XG4iCi0gICAgICAgICIgICAgfVxuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIgIH1cbiIKLSAgICAgICIgICRuYW1lJF8gPSAkbmFtZSQ7XG4iCi0gICAgICAiICBpZiAoJG5hbWUkKSB7XG4iCi0gICAgICAiICAgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIkaW5saW5lJCIKLSAgICAgICIkdHlwZSQqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgaWYgKCRuYW1lJF8gPT0gTlVMTCkge1xuIgotICAgICAgIiAgICAkbmFtZSRfID0gbmV3ICR0eXBlJDtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIgotICAgICAgIiR0eXBlJCogJGNsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICAkY2xlYXJfaGFzYml0JFxuIgotICAgICAgIiAgJHR5cGUkKiB0ZW1wID0gJG5hbWUkXztcbiIKLSAgICAgICIgICRuYW1lJF8gPSBOVUxMO1xuIgotICAgICAgIiAgcmV0dXJuIHRlbXA7XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIgotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKCR0eXBlJCogJG5hbWUkKSB7XG4iCi0gICAgICAiICBkZWxldGUgJG5hbWUkXztcbiIpOwotCi0gICAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIgIGlmICgkbmFtZSQgIT0gTlVMTCAmJiAkbmFtZSQtPkdldEFyZW5hKCkgIT0gTlVMTCkge1xuIgotICAgICAgIiAgICAkdHlwZSQqIG5ld18kbmFtZSQgPSBuZXcgJHR5cGUkO1xuIgotICAgICAgIiAgICBuZXdfJG5hbWUkLT5Db3B5RnJvbSgqJG5hbWUkKTtcbiIKLSAgICAgICIgICAgJG5hbWUkID0gbmV3XyRuYW1lJDtcbiIKLSAgICAgICIgIH1cbiIpOwotICAgIH0KLQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIgICRuYW1lJF8gPSAkbmFtZSQ7XG4iCi0gICAgICAiICBpZiAoJG5hbWUkKSB7XG4iCi0gICAgICAiICAgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOwotICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdID0gZGVwZW5kZW50X2ZpZWxkXyA/IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpIDogIiI7Ci0gIGlmICghSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIC8vIElmIHdlIGRvbid0IGhhdmUgaGFzLWJpdHMsIG1lc3NhZ2UgcHJlc2VuY2UgaXMgaW5kaWNhdGVkIG9ubHkgYnkgcHRyICE9Ci0gICAgLy8gTlVMTC4gVGh1cyBvbiBjbGVhciwgd2UgbmVlZCB0byBkZWxldGUgdGhlIG9iamVjdC4KLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAiaWYgKCR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBOVUxMICYmICIKLSAgICAgICIkdGhpc19tZXNzYWdlJCRuYW1lJF8gIT0gTlVMTCkgZGVsZXRlICR0aGlzX21lc3NhZ2UkJG5hbWUkXztcbiIKLSAgICAgICIkdGhpc19tZXNzYWdlJCRuYW1lJF8gPSBOVUxMO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgImlmICgkdGhpc19tZXNzYWdlJCRuYW1lJF8gIT0gTlVMTCkgJHRoaXNfbWVzc2FnZSQkbmFtZSRfLT4iCi0gICAgICAiJGRlcGVuZGVudF90eXBlJDo6Q2xlYXIoKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAibXV0YWJsZV8kbmFtZSQoKS0+JHR5cGUkOjpNZXJnZUZyb20oZnJvbS4kbmFtZSQoKSk7XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInN0ZDo6c3dhcCgkbmFtZSRfLCBvdGhlci0+JG5hbWUkXyk7XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSBOVUxMO1xuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoXG4iCi0gICAgICAiICAgICBpbnB1dCwgbXV0YWJsZV8kbmFtZSQoKSkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRHcm91cE5vVmlydHVhbChcbiIKLSAgICAgICIgICAgICAkbnVtYmVyJCwgaW5wdXQsIG11dGFibGVfJG5hbWUkKCkpKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRzdHJlYW1fd3JpdGVyJChcbiIKLSAgICAiICAkbnVtYmVyJCwgKiRub25fbnVsbF9wdHJfdG9fbmFtZSQsIG91dHB1dCk7XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKLSAgICAiICBXcml0ZSRkZWNsYXJlZF90eXBlJE5vVmlydHVhbFRvQXJyYXkoXG4iCi0gICAgIiAgICAkbnVtYmVyJCwgKiRub25fbnVsbF9wdHJfdG9fbmFtZSQsIHRhcmdldCk7XG4iKTsKLX0KLQotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgotICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplTm9WaXJ0dWFsKFxuIgotICAgICIgICAgKiRub25fbnVsbF9wdHJfdG9fbmFtZSQpO1xuIik7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgOiBNZXNzYWdlRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucyksCi0gICAgZGVwZW5kZW50X2Jhc2VfKG9wdGlvbnMucHJvdG9faCkgewotICBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKLX0KLQotTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6On5NZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLQotdm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIE9uZW9mIGZpZWxkIGdldHRlcnMgbXVzdCBiZSBkZXBlbmRlbnQgYXMgdGhleSBjYWxsIGRlZmF1bHRfaW5zdGFuY2UoKS4KLSAgLy8gT3RoZXJ3aXNlLCB0aGUgbG9naWMgaXMgdGhlIHNhbWUgYXMgTWVzc2FnZUZpZWxkcy4KLSAgaWYgKCFkZXBlbmRlbnRfZmllbGRfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCAkdHlwZSQmICRuYW1lJCgpIGNvbnN0O1xuIik7Ci0gIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2VuZXJhdGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKLX0KLQotdm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUdldHRlckRlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIE9uZW9mIGZpZWxkIGdldHRlcnMgbXVzdCBiZSBkZXBlbmRlbnQgYXMgdGhleSBjYWxsIGRlZmF1bHRfaW5zdGFuY2UoKS4KLSAgLy8gVW5saWtlIE1lc3NhZ2VGaWVsZCwgdGhpcyBtZWFucyB0aGVyZSBpcyBubyAobm9uLWRlcGVuZGVudCkgZ2V0dGVyIHRvCi0gIC8vIGdlbmVyYXRlLgotICBpZiAoZGVwZW5kZW50X2ZpZWxkXykgewotICAgIHJldHVybjsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgJHR5cGUkJiAkbmFtZSQoKSBjb25zdDtcbiIpOwotfQotCi12b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRGVwZW5kZW50SW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBGb3IgdGhlIENSVFAgYmFzZSBjbGFzcywgYWxsIG11dGF0aW9uIG1ldGhvZHMgYXJlIGRlcGVuZGVudCwgYW5kIHNvCi0gIC8vIHRoZXkgbXVzdCBiZSBpbiB0aGUgaGVhZGVyLgotICBpZiAoIWRlcGVuZGVudF9iYXNlXykgewotICAgIHJldHVybjsKLSAgfQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgdmFyaWFibGVzWyJpbmxpbmUiXSA9ICJpbmxpbmUgIjsKLSAgdmFyaWFibGVzWyJkZXBlbmRlbnRfY2xhc3NuYW1lIl0gPQotICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkgKyAiPFQ+IjsKLSAgdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSA9ICJyZWludGVycHJldF9jYXN0PFQqPih0aGlzKS0+IjsKLSAgLy8gQ29uc3QgbWVzc2FnZSBhY2Nlc3MgaXMgbmVlZGVkIGZvciB0aGUgZGVwZW5kZW50IGdldHRlci4KLSAgdmFyaWFibGVzWyJ0aGlzX2NvbnN0X21lc3NhZ2UiXSA9ICJyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPih0aGlzKS0+IjsKLSAgdmFyaWFibGVzWyJ0bXBsIl0gPSAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iOwotICB2YXJpYWJsZXNbImZpZWxkX21lbWJlciJdID0gdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJpYWJsZXNbIm9uZW9mX3ByZWZpeCJdICsgdmFyaWFibGVzWyJuYW1lIl0gKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl8iOwotICBJbnRlcm5hbEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyh2YXJpYWJsZXMsIHByaW50ZXIpOwotfQotCi12b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3QgewotICBpZiAoZGVwZW5kZW50X2Jhc2VfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOwotICB2YXJpYWJsZXNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSAiIDogIiI7Ci0gIHZhcmlhYmxlc1siZGVwZW5kZW50X2NsYXNzbmFtZSJdID0gdmFyaWFibGVzWyJjbGFzc25hbWUiXTsKLSAgdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSA9ICIiOwotICB2YXJpYWJsZXNbInRoaXNfY29uc3RfbWVzc2FnZSJdID0gIiI7Ci0gIHZhcmlhYmxlc1sidG1wbCJdID0gIiI7Ci0gIHZhcmlhYmxlc1siZmllbGRfbWVtYmVyIl0gPQotICAgICAgdmFyaWFibGVzWyJvbmVvZl9wcmVmaXgiXSArIHZhcmlhYmxlc1sibmFtZSJdICsgIl8iOwotICB2YXJpYWJsZXNbImRlcGVuZGVudF90eXBlIl0gPSB2YXJpYWJsZXNbInR5cGUiXTsKLSAgSW50ZXJuYWxHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnModmFyaWFibGVzLCBwcmludGVyKTsKLX0KLQotdm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7Ci0gIHZhcmlhYmxlc1siZmllbGRfbWVtYmVyIl0gPQotICAgICAgdmFyaWFibGVzWyJvbmVvZl9wcmVmaXgiXSArIHZhcmlhYmxlc1sibmFtZSJdICsgIl8iOwotCi0gIC8vcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotfQotCi12b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUludGVybmFsR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiJHRtcGwkIgotICAgICIkaW5saW5lJCAiCi0gICAgImNvbnN0ICR0eXBlJCYgJGRlcGVuZGVudF9jbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKLSAgICAiICByZXR1cm4gJHRoaXNfY29uc3RfbWVzc2FnZSRoYXNfJG5hbWUkKClcbiIKLSAgICAiICAgICAgPyAqJHRoaXNfY29uc3RfbWVzc2FnZSQkb25lb2ZfcHJlZml4JCRuYW1lJF9cbiIKLSAgICAiICAgICAgOiAkZGVwZW5kZW50X3R5cGUkOjpkZWZhdWx0X2luc3RhbmNlKCk7XG4iCi0gICAgIn1cbiIpOwotCi0gIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAiJHRtcGwkIgotICAgICAgIiRpbmxpbmUkIgotICAgICAgIiR0eXBlJCogJGRlcGVuZGVudF9jbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgIGlmICghJHRoaXNfbWVzc2FnZSRoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRzZXRfaGFzXyRuYW1lJCgpO1xuIik7Ci0gICAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICAgICIgICAgJGZpZWxkX21lbWJlciQgPSBcbiIKLSAgICAgICAgICIgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVNZXNzYWdlPCAkZGVwZW5kZW50X3R5cGVuYW1lJCA+KFxuIgotICAgICAgICAgIiAgICAgICR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgICAgIiAgICAkdGhpc19tZXNzYWdlJCRvbmVvZl9wcmVmaXgkJG5hbWUkXyA9IFxuIgotICAgICAgICAgIiAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZTwgJGRlcGVuZGVudF90eXBlbmFtZSQgPihcbiIKLSAgICAgICAgICIgICAgICAkdGhpc19tZXNzYWdlJEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgcmV0dXJuICRmaWVsZF9tZW1iZXIkO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkdG1wbCQiCi0gICAgICAiJGlubGluZSQiCi0gICAgICAiJHR5cGUkKiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICBpZiAoJHRoaXNfbWVzc2FnZSRoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iCi0gICAgICAiICAgIGlmICgkdGhpc19tZXNzYWdlJEdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gTlVMTCkge1xuIgotICAgICAgLy8gTi5CLjogc2FmZSB0byB1c2UgdGhlIHVuZGVybHlpbmcgZmllbGQgcG9pbnRlciBoZXJlIGJlY2F1c2Ugd2UgYXJlIHN1cmUKLSAgICAgIC8vIHRoYXQgaXQgaXMgbm9uLU5VTEwgKGJlY2F1c2UgaGFzXyRuYW1lJCgpIHJldHVybmVkIHRydWUpLgotICAgICAgIiAgICAgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiB0ZW1wID0gbmV3ICRkZXBlbmRlbnRfdHlwZW5hbWUkO1xuIgotICAgICAgIiAgICAgIHRlbXAtPk1lcmdlRnJvbSgqJGZpZWxkX21lbWJlciQpO1xuIgotICAgICAgIiAgICAgICRmaWVsZF9tZW1iZXIkID0gTlVMTDtcbiIKLSAgICAgICIgICAgICByZXR1cm4gdGVtcDtcbiIKLSAgICAgICIgICAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgICAkZGVwZW5kZW50X3R5cGVuYW1lJCogdGVtcCA9ICRmaWVsZF9tZW1iZXIkO1xuIgotICAgICAgIiAgICAgICRmaWVsZF9tZW1iZXIkID0gTlVMTDtcbiIKLSAgICAgICIgICAgICByZXR1cm4gdGVtcDtcbiIKLSAgICAgICIgICAgfVxuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgcmV0dXJuIE5VTEw7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAifVxuIgotICAgICAgIiR0bXBsJCIKLSAgICAgICIkaW5saW5lJCIKLSAgICAgICJ2b2lkICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6IgotICAgICAgInNldF9hbGxvY2F0ZWRfJG5hbWUkKCR0eXBlJCogJG5hbWUkKSB7XG4iCi0gICAgICAiICAkdGhpc19tZXNzYWdlJGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgaWYgKCRuYW1lJCkge1xuIik7Ci0KLSAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgICAvLyBJZiBpbmNvbWluZyBtZXNzYWdlIGlzIG9uIHRoZSBoZWFwIGFuZCB3ZSBhcmUgb24gYW4gYXJlbmEsIGp1c3QgT3duKCkKLSAgICAgICAgLy8gaXQgKHNlZSBhYm92ZSkuIElmIGl0J3Mgb24gYSBkaWZmZXJlbnQgYXJlbmEgdGhhbiB3ZSBhcmUgb3Igb25lIG9mIHVzCi0gICAgICAgIC8vIGlzIG9uIHRoZSBoZWFwLCB3ZSBtYWtlIGEgY29weSB0byBvdXIgYXJlbmEvaGVhcC4KLSAgICAgICAgIiAgICBpZiAoJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwgJiZcbiIKLSAgICAgICAgIiAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6R2V0QXJlbmEoJG5hbWUkKSA9PSBOVUxMKSB7XG4iCi0gICAgICAgICIgICAgICAkdGhpc19tZXNzYWdlJEdldEFyZW5hTm9WaXJ0dWFsKCktPk93bigkbmFtZSQpO1xuIgotICAgICAgICAiICAgIH0gZWxzZSBpZiAoJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpICE9XG4iCi0gICAgICAgICIgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpHZXRBcmVuYSgkbmFtZSQpKSB7XG4iCi0gICAgICAgICIgICAgICAkZGVwZW5kZW50X3R5cGVuYW1lJCogbmV3XyRuYW1lJCA9IFxuIgotICAgICAgICAiICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8ICRkZXBlbmRlbnRfdHlwZW5hbWUkID4oXG4iCi0gICAgICAgICIgICAgICAgICAgJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKLSAgICAgICAgIiAgICAgIG5ld18kbmFtZSQtPkNvcHlGcm9tKCokbmFtZSQpO1xuIgotICAgICAgICAiICAgICAgJG5hbWUkID0gbmV3XyRuYW1lJDtcbiIKLSAgICAgICAgIiAgICB9XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgICAiICAgIGlmICgkdGhpc19tZXNzYWdlJEdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gTlVMTCkge1xuIgotICAgICAgICAiICAgICAgJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpLT5Pd24oJG5hbWUkKTtcbiIKLSAgICAgICAgIiAgICB9XG4iKTsKLSAgICB9Ci0KLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAiICAgICR0aGlzX21lc3NhZ2Ukc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAgICIgICAgJGZpZWxkX21lbWJlciQgPSAkbmFtZSQ7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDokZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgJHR5cGUkKiAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3JlbGVhc2VfJG5hbWUkKCkge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9yZWxlYXNlIgotICAgICAgIjokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIGlmIChoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICIgICAgY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICAkdHlwZSQqIHRlbXAgPSAkb25lb2ZfcHJlZml4JCRuYW1lJF87XG4iCi0gICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXyA9IE5VTEw7XG4iCi0gICAgICAiICAgIHJldHVybiB0ZW1wO1xuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgcmV0dXJuIE5VTEw7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkXyRuYW1lJCIKLSAgICAgICIoJHR5cGUkKiAkbmFtZSQpIHtcbiIKLSAgICAgIC8vIFdlIHJlbHkgb24gdGhlIG9uZW9mIGNsZWFyIG1ldGhvZCB0byBmcmVlIHRoZSBlYXJsaWVyIGNvbnRlbnRzIG9mIHRoaXMKLSAgICAgIC8vIG9uZW9mLiBXZSBjYW4gZGlyZWN0bHkgdXNlIHRoZSBwb2ludGVyIHdlJ3JlIGdpdmVuIHRvIHNldCB0aGUgbmV3Ci0gICAgICAvLyB2YWx1ZS4KLSAgICAgICIgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgaWYgKCRuYW1lJCkge1xuIgotICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8gPSAkbmFtZSQ7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6IgotICAgICAgIiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIkdG1wbCQiCi0gICAgICAiJGlubGluZSQiCi0gICAgICAiJHR5cGUkKiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICAgIiAgaWYgKCEkdGhpc19tZXNzYWdlJGhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICAkdGhpc19tZXNzYWdlJGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICAkdGhpc19tZXNzYWdlJHNldF9oYXNfJG5hbWUkKCk7XG4iCi0gICAgICAiICAgICRmaWVsZF9tZW1iZXIkID0gbmV3ICRkZXBlbmRlbnRfdHlwZW5hbWUkO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJGZpZWxkX21lbWJlciQ7XG4iCi0gICAgICAifVxuIgotICAgICAgIiR0bXBsJCIKLSAgICAgICIkaW5saW5lJCIKLSAgICAgICIkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6JHJlbGVhc2VfbmFtZSQoKSB7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIGlmICgkdGhpc19tZXNzYWdlJGhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICAkdGhpc19tZXNzYWdlJGNsZWFyX2hhc18kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICIgICAgJGRlcGVuZGVudF90eXBlbmFtZSQqIHRlbXAgPSAkZmllbGRfbWVtYmVyJDtcbiIKLSAgICAgICIgICAgJGZpZWxkX21lbWJlciQgPSBOVUxMO1xuIgotICAgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKLSAgICAgICIgIH0gZWxzZSB7XG4iCi0gICAgICAiICAgIHJldHVybiBOVUxMO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIn1cbiIKLSAgICAgICIkdG1wbCQiCi0gICAgICAiJGlubGluZSQiCi0gICAgICAidm9pZCAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiIKLSAgICAgICJzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCkge1xuIgotICAgICAgIiAgJHRoaXNfbWVzc2FnZSRjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIpOwotICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAgICIgICAgaWYgKHN0YXRpY19jYXN0PCAkZGVwZW5kZW50X3R5cGVuYW1lJCo+KCRuYW1lJCktPiIKLSAgICAgICAgIkdldEFyZW5hKCkgIT0gTlVMTCkge1xuIgotICAgICAgICAiICAgICAgJGRlcGVuZGVudF90eXBlbmFtZSQqIG5ld18kbmFtZSQgPSBuZXcgJGRlcGVuZGVudF90eXBlbmFtZSQ7XG4iCi0gICAgICAgICIgICAgICBuZXdfJG5hbWUkLT5Db3B5RnJvbSgqJG5hbWUkKTtcbiIKLSAgICAgICAgIiAgICAgICRuYW1lJCA9IG5ld18kbmFtZSQ7XG4iCi0gICAgICAgICIgICAgfVxuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkZmllbGRfbWVtYmVyJCA9ICRuYW1lJDtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7Ci0gIHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gPSBkZXBlbmRlbnRfZmllbGRfID8gRGVwZW5kZW50QmFzZURvd25DYXN0KCkgOiAiIjsKLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICJpZiAoJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpID09IE5VTEwpIHtcbiIKLSAgICAgICIgIGRlbGV0ZSAkdGhpc19tZXNzYWdlJCRvbmVvZl9wcmVmaXgkJG5hbWUkXztcbiIKLSAgICAgICJ9XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAiZGVsZXRlICR0aGlzX21lc3NhZ2UkJG9uZW9mX3ByZWZpeCQkbmFtZSRfO1xuIik7Ci0gIH0KLX0KLQotdm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBEb24ndCBwcmludCBhbnkgc3dhcHBpbmcgY29kZS4gU3dhcHBpbmcgdGhlIHVuaW9uIHdpbGwgc3dhcCB0aGlzIGZpZWxkLgotfQotCi12b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIERvbid0IHByaW50IGFueSBjb25zdHJ1Y3RvciBjb2RlLiBUaGUgZmllbGQgaXMgaW4gYSB1bmlvbi4gV2UgYWxsb2NhdGUKLSAgLy8gc3BhY2Ugb25seSB3aGVuIHRoaXMgZmllbGQgaXMgdXNlZC4KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQotICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksCi0gICAgICBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKLSAgICAgIGRlcGVuZGVudF9maWVsZF8ob3B0aW9ucy5wcm90b19oICYmIElzRmllbGREZXBlbmRlbnQoZGVzY3JpcHRvcikpLAotICAgICAgZGVwZW5kZW50X2dldHRlcl8oZGVwZW5kZW50X2ZpZWxkXyAmJiBvcHRpb25zLnNhZmVfYm91bmRhcnlfY2hlY2spIHsKLSAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXywgb3B0aW9ucyk7Ci19Ci0KLVJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiAkbmFtZSRfO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotSW50ZXJuYWxHZW5lcmF0ZVR5cGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogbXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KTtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqIGFkZF8kbmFtZSQoKTtcbiIpOwotICBpZiAoZGVwZW5kZW50X2dldHRlcl8pIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiZcbiIKLSAgICAgICIgICAgJG5hbWUkKCkgY29uc3Q7XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRlZF9hdHRyJDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4qXG4iCi0gICAgIiAgICBtdXRhYmxlXyRuYW1lJCgpO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoZGVwZW5kZW50X2dldHRlcl8pIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgJHR5cGUkJiAkbmFtZSQoaW50IGluZGV4KSBjb25zdDtcbiIpOwotICB9Ci0gIGlmIChkZXBlbmRlbnRfZmllbGRfKSB7Ci0gICAgSW50ZXJuYWxHZW5lcmF0ZVR5cGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKCFkZXBlbmRlbnRfZ2V0dGVyXykgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCAkdHlwZSQmICRuYW1lJChpbnQgaW5kZXgpIGNvbnN0O1xuIik7Ci0gIH0KLSAgaWYgKCFkZXBlbmRlbnRfZmllbGRfKSB7Ci0gICAgSW50ZXJuYWxHZW5lcmF0ZVR5cGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKLSAgfQotICBpZiAoIWRlcGVuZGVudF9nZXR0ZXJfKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4mXG4iCi0gICAgICAiICAgICRuYW1lJCgpIGNvbnN0O1xuIik7Ci0gIH0KLX0KLQotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZURlcGVuZGVudElubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKCFkZXBlbmRlbnRfZmllbGRfKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOwotICAvLyBGb3IgdGhlIENSVFAgYmFzZSBjbGFzcywgYWxsIG11dGF0aW9uIG1ldGhvZHMgYXJlIGRlcGVuZGVudCwgYW5kIHNvCi0gIC8vIHRoZXkgbXVzdCBiZSBpbiB0aGUgaGVhZGVyLgotICB2YXJpYWJsZXNbImRlcGVuZGVudF9jbGFzc25hbWUiXSA9Ci0gICAgICBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSArICI8VD4iOwotICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdID0gRGVwZW5kZW50QmFzZURvd25DYXN0KCk7Ci0gIHZhcmlhYmxlc1sidGhpc19jb25zdF9tZXNzYWdlIl0gPSBEZXBlbmRlbnRCYXNlQ29uc3REb3duQ2FzdCgpOwotCi0gIGlmIChkZXBlbmRlbnRfZ2V0dGVyXykgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKLSAgICAgICJpbmxpbmUgY29uc3QgJHR5cGUkJiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJHRoaXNfY29uc3RfbWVzc2FnZSQkbmFtZSRfLiRjcHBnZXQkKGluZGV4KTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0gIC8vIEdlbmVyYXRlIHBlci1lbGVtZW50IGFjY2Vzc29yczoKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKLSAgICAiaW5saW5lICR0eXBlJCogJGRlcGVuZGVudF9jbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJChpbnQgaW5kZXgpIHtcbiIKLSAgICAvLyBUT0RPKGRsaik6IG1vdmUgaW5zZXJ0aW9uIHBvaW50cwotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgotICAgICIgIHJldHVybiAkdGhpc19tZXNzYWdlJCRuYW1lJF8uTXV0YWJsZShpbmRleCk7XG4iCi0gICAgIn1cbiIKLSAgICAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iCi0gICAgImlubGluZSAkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOiRmdWxsX25hbWUkKVxuIgotICAgICIgIHJldHVybiAkdGhpc19tZXNzYWdlJCRuYW1lJF8uQWRkKCk7XG4iCi0gICAgIn1cbiIpOwotCi0KLSAgaWYgKGRlcGVuZGVudF9nZXR0ZXJfKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgotICAgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+JlxuIgotICAgICAgIiRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJHRoaXNfY29uc3RfbWVzc2FnZSQkbmFtZSRfO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgLy8gR2VuZXJhdGUgbXV0YWJsZSBhY2Nlc3MgdG8gdGhlIGVudGlyZSBsaXN0OgotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgotICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPipcbiIKLSAgICAiJGRlcGVuZGVudF9jbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OiRmdWxsX25hbWUkKVxuIgotICAgICIgIHJldHVybiAmJHRoaXNfbWVzc2FnZSQkbmFtZSRfO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7Ci0gIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lICIgOiAiIjsKLQotICBpZiAoIWRlcGVuZGVudF9nZXR0ZXJfKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgIiRpbmxpbmUkIgotICAgICAgImNvbnN0ICR0eXBlJCYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXy4kY3BwZ2V0JChpbmRleCk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLQotICBpZiAoIWRlcGVuZGVudF9maWVsZF8pIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgICAiJGlubGluZSQiCi0gICAgICAiJHR5cGUkKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSB7XG4iCi0gICAgICAvLyBUT0RPKGRsaik6IG1vdmUgaW5zZXJ0aW9uIHBvaW50cwotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXy5NdXRhYmxlKGluZGV4KTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQiCi0gICAgICAiJHR5cGUkKiAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXy5BZGQoKTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0KLSAgaWYgKCFkZXBlbmRlbnRfZmllbGRfKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgIiRpbmxpbmUkIgotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4qXG4iCi0gICAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotICBpZiAoIWRlcGVuZGVudF9nZXR0ZXJfKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgIiRpbmxpbmUkIgotICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4mXG4iCi0gICAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0OiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLX0KLQotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSA9IGRlcGVuZGVudF9maWVsZF8gPyBEZXBlbmRlbnRCYXNlRG93bkNhc3QoKSA6ICIiOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsICIkdGhpc19tZXNzYWdlJCRuYW1lJF8uQ2xlYXIoKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uTWVyZ2VGcm9tKGZyb20uJG5hbWUkXyk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT4kbmFtZSRfKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIE5vdCBuZWVkZWQgZm9yIHJlcGVhdGVkIGZpZWxkcy4KLX0KLQotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiIKLSAgICAgICJSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoXG4iCi0gICAgICAiICAgICAgaW5wdXQsIGFkZF8kbmFtZSQoKSkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiIKLSAgICAgICJSZWFkR3JvdXBOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKFxuIgotICAgICAgIiAgICAgICRudW1iZXIkLCBpbnB1dCwgYWRkXyRuYW1lJCgpKSk7XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+JG5hbWUkX3NpemUoKTsgaSA8IG47IGkrKykge1xuIgotICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRzdHJlYW1fd3JpdGVyJChcbiIKLSAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkgPCBuOyBpKyspIHtcbiIKLSAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCi0gICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJE5vVmlydHVhbFRvQXJyYXkoXG4iCi0gICAgIiAgICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAidG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICogdGhpcy0+JG5hbWUkX3NpemUoKTtcbiIKLSAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIKLSAgICAiICB0b3RhbF9zaXplICs9XG4iCi0gICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZU5vVmlydHVhbChcbiIKLSAgICAiICAgICAgdGhpcy0+JG5hbWUkKGkpKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDhkOTI3OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfRklFTERfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfTUVTU0FHRV9GSUVMRF9IX18KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi1jbGFzcyBNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudElubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgR2VuZXJhdGVBcmVuYU1hbmlwdWxhdGlvbkNvZGUoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFyaWFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVHZXR0ZXJEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgY29uc3QgYm9vbCBkZXBlbmRlbnRfZmllbGRfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUZpZWxkR2VuZXJhdG9yKTsKLX07Ci0KLWNsYXNzIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+TWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoKTsKLQotICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB2b2lkIEdlbmVyYXRlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRGVwZW5kZW50SW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBHZW5lcmF0ZUdldHRlckRlY2xhcmF0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHZvaWQgSW50ZXJuYWxHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCi0gICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotICBjb25zdCBib29sIGRlcGVuZGVudF9iYXNlXzsKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKTsKLX07Ci0KLWNsYXNzIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0gIH5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVEZXBlbmRlbnRJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHZvaWQgSW50ZXJuYWxHZW5lcmF0ZVR5cGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucygKLSAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBjb25zdCBib29sIGRlcGVuZGVudF9maWVsZF87Ci0gIGNvbnN0IGJvb2wgZGVwZW5kZW50X2dldHRlcl87Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3BsdWdpbl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzRhNDFkOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjUyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLwotLy8gVE9ETyhrZW50b24pOiAgU2hhcmUgY29kZSB3aXRoIHRoZSB2ZXJzaW9ucyBvZiB0aGlzIHRlc3QgaW4gb3RoZXIgbGFuZ3VhZ2VzPwotLy8gICBJdCBzZWVtZWQgbGlrZSBwYXJhbWV0ZXJpemluZyBpdCB3b3VsZCBhZGQgbW9yZSBjb21wbGV4aXR5IHRoYW4gaXQgaXMKLS8vICAgd29ydGguCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgY3BwIHsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIFRlc3RHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBUZXN0R2VuZXJhdG9yKCkge30KLSAgflRlc3RHZW5lcmF0b3IoKSB7fQotCi0gIHZpcnR1YWwgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJpbmNsdWRlcyIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgIm5hbWVzcGFjZV9zY29wZSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImdsb2JhbF9zY29wZSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImNsYXNzX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJjbGFzc19zY29wZTpmb28uQmFyLkJheiIsIGNvbnRleHQpOwotCi0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgImluY2x1ZGVzIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgIm5hbWVzcGFjZV9zY29wZSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5jYyIsICJnbG9iYWxfc2NvcGUiLCBjb250ZXh0KTsKLQotICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYW4gb3B0aW9uYWwgaW50MzI6Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub3B0SW50IiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIub3B0SW50IiwgY29udGV4dCk7Ci0KLSAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGEgcmVwZWF0ZWQgaW50MzI6Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVwZWF0ZWRJbnQiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5yZXBlYXRlZEludCIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcXVpcmVkIHN0cmluZzoKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXF1aXJlZFN0cmluZyIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcXVpcmVkU3RyaW5nIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X2NoYXI6Zm9vLkJhci5yZXF1aXJlZFN0cmluZyIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9wb2ludGVyOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfYWxsb2NhdGVkOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLAotICAgICAgICAgICAgICBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfY2hhcjpmb28uQmFyLnJlcXVpcmVkU3RyaW5nIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X3BvaW50ZXI6Zm9vLkJhci5yZXF1aXJlZFN0cmluZyIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcGVhdGVkIHN0cmluZzoKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcGVhdGVkU3RyaW5nIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X2NoYXI6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9wb2ludGVyOmZvby5CYXIucmVwZWF0ZWRTdHJpbmciLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIucmVwZWF0ZWRTdHJpbmciLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfY2hhcjpmb28uQmFyLnJlcGVhdGVkU3RyaW5nIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X3BvaW50ZXI6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBpbnQgaW5zaWRlIG9uZW9me306Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub25lT2ZJbnQiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5vbmVPZkludCIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHN0cmluZyBpbnNpZGUgb25lb2Z7fToKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLm9uZU9mU3RyaW5nIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X2NoYXI6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9wb2ludGVyOmZvby5CYXIub25lT2ZTdHJpbmciLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIub25lT2ZTdHJpbmciLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfYWxsb2NhdGVkOmZvby5CYXIub25lT2ZTdHJpbmciLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfY2hhcjpmb28uQmFyLm9uZU9mU3RyaW5nIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X3BvaW50ZXI6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBvcHRpb25hbCBtZXNzYWdlOgotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9wdE1lc3NhZ2UiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIub3B0TWVzc2FnZSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9hbGxvY2F0ZWQ6Zm9vLkJhci5vcHRNZXNzYWdlIiwgY29udGV4dCk7Ci0KLSAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGEgcmVwZWF0ZWQgbWVzc2FnZToKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9hZGQ6Zm9vLkJhci5yZXBlYXRlZE1lc3NhZ2UiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXBlYXRlZE1lc3NhZ2UiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9saXN0OmZvby5CYXIucmVwZWF0ZWRNZXNzYWdlIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLnJlcGVhdGVkTWVzc2FnZSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGVfbGlzdDpmb28uQmFyLnJlcGVhdGVkTWVzc2FnZSIsCi0gICAgICAgICAgICAgIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIG1lc3NhZ2UgaW5zaWRlIG9uZW9me306Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub25lT2ZNZXNzYWdlIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLm9uZU9mTWVzc2FnZSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9hbGxvY2F0ZWQ6Zm9vLkJhci5vbmVPZk1lc3NhZ2UiLCBjb250ZXh0KTsKLQotICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYW4gb3B0aW9uYWwgZW51bToKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5vcHRFbnVtIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIub3B0RW51bSIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcGVhdGVkIGVudW06Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVwZWF0ZWRFbnVtIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIucmVwZWF0ZWRFbnVtIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfYWRkOmZvby5CYXIucmVwZWF0ZWRFbnVtIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbGlzdDpmb28uQmFyLnJlcGVhdGVkRW51bSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGVfbGlzdDpmb28uQmFyLnJlcGVhdGVkRW51bSIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBlbnVtIGluc2lkZSBvbmVvZnt9OgotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9uZU9mRW51bSIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLm9uZU9mRW51bSIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcXVpcmVkIGNvcmQ6Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVxdWlyZWRDb3JkIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIucmVxdWlyZWRDb3JkIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLnJlcXVpcmVkQ29yZCIsIGNvbnRleHQpOwotCi0gICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcGVhdGVkIGNvcmQ6Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfYWRkOmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbGlzdDpmb28uQmFyLnJlcGVhdGVkQ29yZCIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGU6Zm9vLkJhci5yZXBlYXRlZENvcmQiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlX2xpc3Q6Zm9vLkJhci5yZXBlYXRlZENvcmQiLCBjb250ZXh0KTsKLQotICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSBjb3JkIGluc2lkZSBvbmVvZnt9OgotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9uZU9mQ29yZCIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLm9uZU9mQ29yZCIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGU6Zm9vLkJhci5vbmVPZkNvcmQiLCBjb250ZXh0KTsKLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBUcnlJbnNlcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCi0gICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgICBjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KGZpbGVuYW1lLCBpbnNlcnRpb25fcG9pbnQpKTsKLSAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKLSAgICBwcmludGVyLlByaW50KCIvLyBpbnNlcnRlZCAkbmFtZSRcbiIsICJuYW1lIiwgaW5zZXJ0aW9uX3BvaW50KTsKLSAgfQotfTsKLQotLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgYWxsIHRoZSBleHBlY3RlZCBpbnNlcnRpb24gcG9pbnRzIGV4aXN0LiAgSXQgZG9lcwotLy8gbm90IHZlcmlmeSB0aGF0IHRoZXkgYXJlIGNvcnJlY3RseS1wbGFjZWQ7IHRoYXQgd291bGQgcmVxdWlyZSBhY3R1YWxseQotLy8gY29tcGlsaW5nIHRoZSBvdXRwdXQgd2hpY2ggaXMgYSBiaXQgbW9yZSB0aGFuIEkgY2FyZSB0byBkbyBmb3IgdGhpcyB0ZXN0LgotVEVTVChDcHBQbHVnaW5UZXN0LCBQbHVnaW5UZXN0KSB7Ci0gIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyhUZXN0VGVtcERpcigpICsgIi90ZXN0LnByb3RvIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIGZvbztcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSBUaHVkIHsgVkFMVUUgPSAwOyB9XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgaW50MzIgb3B0SW50ID0gMTtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRJbnQgPSAyO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVkIHN0cmluZyByZXF1aXJlZFN0cmluZyA9IDM7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZFN0cmluZyA9IDQ7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgQmF6IG9wdE1lc3NhZ2UgPSA2O1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICByZXBlYXRlZCBCYXogcmVwZWF0ZWRNZXNzYWdlID0gNztcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBvcHRpb25hbCBUaHVkIG9wdEVudW0gPSA4O1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICByZXBlYXRlZCBUaHVkIHJlcGVhdGVkRW51bSA9IDk7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVxdWlyZWQgc3RyaW5nIHJlcXVpcmVkQ29yZCA9IDEwIFtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjdHlwZSA9IENPUkRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgXTtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkQ29yZCA9IDExIFtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBjdHlwZSA9IENPUkRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgXTtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBvbmVvZiBRdXgge1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIGludDY0IG9uZU9mSW50ID0gMjA7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgc3RyaW5nIG9uZU9mU3RyaW5nID0gMjE7XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgQmF6IG9uZU9mTWVzc2FnZSA9IDIyO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIFRodWQgb25lT2ZFbnVtID0gMjM7IgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHN0cmluZyBvbmVPZkNvcmQgPSAyNCBbXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICBjdHlwZSA9IENPUkRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBdO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICB9XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKLSAgY2xpLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOwotCi0gIENwcEdlbmVyYXRvciBjcHBfZ2VuZXJhdG9yOwotICBUZXN0R2VuZXJhdG9yIHRlc3RfZ2VuZXJhdG9yOwotICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tY3BwX291dCIsICZjcHBfZ2VuZXJhdG9yLCAiIik7Ci0gIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS10ZXN0X291dCIsICZ0ZXN0X2dlbmVyYXRvciwgIiIpOwotCi0gIHN0cmluZyBwcm90b19wYXRoID0gIi1JIiArIFRlc3RUZW1wRGlyKCk7Ci0gIHN0cmluZyBjcHBfb3V0ID0gIi0tY3BwX291dD0iICsgVGVzdFRlbXBEaXIoKTsKLSAgc3RyaW5nIHRlc3Rfb3V0ID0gIi0tdGVzdF9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7Ci0KLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJwcm90b2MiLAotICAgIHByb3RvX3BhdGguY19zdHIoKSwKLSAgICBjcHBfb3V0LmNfc3RyKCksCi0gICAgdGVzdF9vdXQuY19zdHIoKSwKLSAgICAidGVzdC5wcm90byIKLSAgfTsKLQotICBFWFBFQ1RfRVEoMCwgY2xpLlJ1big1LCBhcmd2KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NTBmMDM4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NTggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKLS8vIHJldHVybnMgLTEuCi1pbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQgICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzIgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NCAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGaXhlZDMyU2l6ZTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRml4ZWQ2NFNpemU7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a1NGaXhlZDMyU2l6ZTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkNjRTaXplOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGbG9hdFNpemU7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0RvdWJsZVNpemU7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprQm9vbFNpemU7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAtMTsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gLTE7Ci0KLSAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwotICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KLSAgfQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIC0xOwotfQotCi12b2lkIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7Ci0gICgqdmFyaWFibGVzKVsidHlwZSJdID0gUHJpbWl0aXZlVHlwZU5hbWUoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7Ci0gICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbInRhZyJdID0gU2ltcGxlSXRvYShpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7Ci0gIGludCBmaXhlZF9zaXplID0gRml4ZWRTaXplKGRlc2NyaXB0b3ItPnR5cGUoKSk7Ci0gIGlmIChmaXhlZF9zaXplICE9IC0xKSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJmaXhlZF9zaXplIl0gPSBTaW1wbGVJdG9hKGZpeGVkX3NpemUpOwotICB9Ci0gICgqdmFyaWFibGVzKVsid2lyZV9mb3JtYXRfZmllbGRfdHlwZSJdID0KLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6IiArIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfTmFtZSgKLSAgICAgICAgICBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlPihkZXNjcmlwdG9yLT50eXBlKCkpKTsKLSAgKCp2YXJpYWJsZXMpWyJmdWxsX25hbWUiXSA9IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1QcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQotICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKLSAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKLX0KLQotUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6On5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJHR5cGUkICRuYW1lJF87XG4iKTsKLX0KLQotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkICRuYW1lJCgpIGNvbnN0O1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpO1xuIik7Ci19Ci0KLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIGlzX2lubGluZSkgY29uc3QgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUiIDogIiI7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiJGlubGluZSQgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIgotICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgotICAgICIgICRzZXRfaGFzYml0JFxuIgotICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOwotfQotCi12b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInNldF8kbmFtZSQoZnJvbS4kbmFtZSQoKSk7XG4iKTsKLX0KLQotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAic3RkOjpzd2FwKCRuYW1lJF8sIG90aGVyLT4kbmFtZSRfKTtcbiIpOwotfQotCi12b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Ci19Ci0KLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgotICAgICIgICAgICAgICAkdHlwZSQsICR3aXJlX2Zvcm1hdF9maWVsZF90eXBlJD4oXG4iCi0gICAgIiAgICAgICBpbnB1dCwgJiRuYW1lJF8pKSk7XG4iCi0gICAgIiRzZXRfaGFzYml0JFxuIik7Ci19Ci0KLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkKCIKLSAgICAgICIkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIG91dHB1dCk7XG4iKTsKLX0KLQotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAidGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkVG9BcnJheSgiCi0gICAgICAiJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCB0YXJnZXQpO1xuIik7Ci19Ci0KLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpbnQgZml4ZWRfc2l6ZSA9IEZpeGVkU2l6ZShkZXNjcmlwdG9yXy0+dHlwZSgpKTsKLSAgaWYgKGZpeGVkX3NpemUgPT0gLTEpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCi0gICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZShcbiIKLSAgICAgICIgICAgdGhpcy0+JG5hbWUkKCkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgKyAkZml4ZWRfc2l6ZSQ7XG4iKTsKLSAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCi0gIDogUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucykgewotICBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKLX0KLQotUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6flByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIGlzX2lubGluZSkgY29uc3QgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUiIDogIiI7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiJGlubGluZSQgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKLSAgICAiICBpZiAoaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgIiAgICByZXR1cm4gJG9uZW9mX3ByZWZpeCQkbmFtZSRfO1xuIgotICAgICIgIH1cbiIKLSAgICAiICByZXR1cm4gJGRlZmF1bHQkO1xuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG9uZW9mX3ByZWZpeCQkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Ci19Ci0KLXZvaWQgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBEb24ndCBwcmludCBhbnkgc3dhcHBpbmcgY29kZS4gU3dhcHBpbmcgdGhlIHVuaW9uIHdpbGwgc3dhcCB0aGlzIGZpZWxkLgotfQotCi12b2lkIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICB2YXJpYWJsZXNfLAotICAgICAgIiAgJGNsYXNzbmFtZSRfZGVmYXVsdF9vbmVvZl9pbnN0YW5jZV8tPiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKLX0KLQotdm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCi0gICAgIkRPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8XG4iCi0gICAgIiAgICAgICAgICR0eXBlJCwgJHdpcmVfZm9ybWF0X2ZpZWxkX3R5cGUkPihcbiIKLSAgICAiICAgICAgIGlucHV0LCAmJG9uZW9mX3ByZWZpeCQkbmFtZSRfKSkpO1xuIgotICAgICJzZXRfaGFzXyRuYW1lJCgpO1xuIik7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6UmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCi0gICAgOiBGaWVsZEdlbmVyYXRvcihvcHRpb25zKSwgZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgewotICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOwotCi0gIGlmIChkZXNjcmlwdG9yLT5pc19wYWNrZWQoKSkgewotICAgIHZhcmlhYmxlc19bInBhY2tlZF9yZWFkZXIiXSA9ICJSZWFkUGFja2VkUHJpbWl0aXZlIjsKLSAgICB2YXJpYWJsZXNfWyJyZXBlYXRlZF9yZWFkZXIiXSA9ICJSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZSI7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyaWFibGVzX1sicGFja2VkX3JlYWRlciJdID0gIlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZSI7Ci0gICAgdmFyaWFibGVzX1sicmVwZWF0ZWRfcmVhZGVyIl0gPSAiUmVhZFJlcGVhdGVkUHJpbWl0aXZlIjsKLSAgfQotfQotCi1SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4gJG5hbWUkXztcbiIpOwotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpICYmCi0gICAgICBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAibXV0YWJsZSBpbnQgXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXztcbiIpOwotICB9Ci19Ci0KLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkICRuYW1lJChpbnQgaW5kZXgpIGNvbnN0O1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSk7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBhZGRfJG5hbWUkKCR0eXBlJCB2YWx1ZSk7XG4iKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+JlxuIgotICAgICIgICAgJG5hbWUkKCkgY29uc3Q7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCAkdHlwZSQgPipcbiIKLSAgICAiICAgIG11dGFibGVfJG5hbWUkKCk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7Ci0gIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lIiA6ICIiOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiRpbmxpbmUkICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uR2V0KGluZGV4KTtcbiIKLSAgICAifVxuIgotICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgJG5hbWUkXy5TZXQoaW5kZXgsIHZhbHVlKTtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgJG5hbWUkXy5BZGQodmFsdWUpO1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIn1cbiIpOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCi0gICAgIiRpbmxpbmUkIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4mXG4iCi0gICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgIn1cbiIKLSAgICAiJGlubGluZSQgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCAkdHlwZSQgPipcbiIKLSAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuICYkbmFtZSRfO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLkNsZWFyKCk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uTWVyZ2VGcm9tKGZyb20uJG5hbWUkXyk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBOb3QgbmVlZGVkIGZvciByZXBlYXRlZCBmaWVsZHMuCi19Ci0KLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIkRPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRyZXBlYXRlZF9yZWFkZXIkPFxuIgotICAgICIgICAgICAgICAkdHlwZSQsICR3aXJlX2Zvcm1hdF9maWVsZF90eXBlJD4oXG4iCi0gICAgIiAgICAgICAkdGFnX3NpemUkLCAkdGFnJCwgaW5wdXQsIHRoaXMtPm11dGFibGVfJG5hbWUkKCkpKSk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokcGFja2VkX3JlYWRlciQ8XG4iCi0gICAgIiAgICAgICAgICR0eXBlJCwgJHdpcmVfZm9ybWF0X2ZpZWxkX3R5cGUkPihcbiIKLSAgICAiICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSkpO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgLy8gV3JpdGUgdGhlIHRhZyBhbmQgdGhlIHNpemUuCi0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAodGhpcy0+JG5hbWUkX3NpemUoKSA+IDApIHtcbiIKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZygiCi0gICAgICAgICAgIiRudW1iZXIkLCAiCi0gICAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCAiCi0gICAgICAgICAgIm91dHB1dCk7XG4iCi0gICAgICAiICBvdXRwdXQtPldyaXRlVmFyaW50MzIoXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkTm9UYWcoXG4iCi0gICAgICAiICAgIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSQoXG4iCi0gICAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCgifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgewotICAgIC8vIFdyaXRlIHRoZSB0YWcgYW5kIHRoZSBzaXplLgotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKHRoaXMtPiRuYW1lJF9zaXplKCkgPiAwKSB7XG4iCi0gICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KFxuIgotICAgICAgIiAgICAkbnVtYmVyJCxcbiIKLSAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsXG4iCi0gICAgICAiICAgIHRhcmdldCk7XG4iCi0gICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoXG4iCi0gICAgICAiICAgIF8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8sIHRhcmdldCk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgotICAgICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJE5vVGFnVG9BcnJheSh0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgotICAgICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJFRvQXJyYXkoJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAie1xuIgotICAgICIgIGludCBkYXRhX3NpemUgPSAwO1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBpbnQgZml4ZWRfc2l6ZSA9IEZpeGVkU2l6ZShkZXNjcmlwdG9yXy0+dHlwZSgpKTsKLSAgaWYgKGZpeGVkX3NpemUgPT0gLTEpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCi0gICAgICAiICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgotICAgICAgIiAgICAkZGVjbGFyZWRfdHlwZSRTaXplKHRoaXMtPiRuYW1lJChpKSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJkYXRhX3NpemUgPSAkZml4ZWRfc2l6ZSQgKiB0aGlzLT4kbmFtZSRfc2l6ZSgpO1xuIik7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoZGF0YV9zaXplID4gMCkge1xuIgotICAgICAgIiAgdG90YWxfc2l6ZSArPSAkdGFnX3NpemUkICtcbiIKLSAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShkYXRhX3NpemUpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpO1xuIgotICAgICAgIl8kbmFtZSRfY2FjaGVkX2J5dGVfc2l6ZV8gPSBkYXRhX3NpemU7XG4iCi0gICAgICAiR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7XG4iCi0gICAgICAidG90YWxfc2l6ZSArPSBkYXRhX3NpemU7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCAqIHRoaXMtPiRuYW1lJF9zaXplKCkgKyBkYXRhX3NpemU7XG4iKTsKLSAgfQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjU1ZWJkZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMjYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfUFJJTUlUSVZFX0ZJRUxEX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BSSU1JVElWRV9GSUVMRF9IX18KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi1jbGFzcyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKLQotICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLSAgflByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoKTsKLQotICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLSAgflJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKLQotICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1BSSU1JVElWRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIyNmMyYWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgY3BwIHsKLQotU2VydmljZUdlbmVyYXRvcjo6U2VydmljZUdlbmVyYXRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7Ci0gIHZhcnNfWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7Ci0gIHZhcnNfWyJmdWxsX25hbWUiXSA9IGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKTsKLSAgaWYgKG9wdGlvbnMuZGxsZXhwb3J0X2RlY2wuZW1wdHkoKSkgewotICAgIHZhcnNfWyJkbGxleHBvcnQiXSA9ICIiOwotICB9IGVsc2UgewotICAgIHZhcnNfWyJkbGxleHBvcnQiXSA9IG9wdGlvbnMuZGxsZXhwb3J0X2RlY2wgKyAiICI7Ci0gIH0KLX0KLQotU2VydmljZUdlbmVyYXRvcjo6flNlcnZpY2VHZW5lcmF0b3IoKSB7fQotCi12b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIEZvcndhcmQtZGVjbGFyZSB0aGUgc3R1YiB0eXBlLgotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiY2xhc3MgJGNsYXNzbmFtZSRfU3R1YjtcbiIKLSAgICAiXG4iKTsKLQotICBHZW5lcmF0ZUludGVyZmFjZShwcmludGVyKTsKLSAgR2VuZXJhdGVTdHViRGVmaW5pdGlvbihwcmludGVyKTsKLX0KLQotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiY2xhc3MgJGRsbGV4cG9ydCQkY2xhc3NuYW1lJCA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2Uge1xuIgotICAgICIgcHJvdGVjdGVkOlxuIgotICAgICIgIC8vIFRoaXMgY2xhc3Mgc2hvdWxkIGJlIHRyZWF0ZWQgYXMgYW4gYWJzdHJhY3QgaW50ZXJmYWNlLlxuIgotICAgICIgIGlubGluZSAkY2xhc3NuYW1lJCgpIHt9O1xuIgotICAgICIgcHVibGljOlxuIgotICAgICIgIHZpcnR1YWwgfiRjbGFzc25hbWUkKCk7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQodmFyc18sCi0gICAgIlxuIgotICAgICJ0eXBlZGVmICRjbGFzc25hbWUkX1N0dWIgU3R1YjtcbiIKLSAgICAiXG4iCi0gICAgInN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7XG4iCi0gICAgIlxuIik7Ci0KLSAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmVzKFZJUlRVQUwsIHByaW50ZXIpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJcbiIKLSAgICAiLy8gaW1wbGVtZW50cyBTZXJ2aWNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKLSAgICAiXG4iCi0gICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKTtcbiIKLSAgICAidm9pZCBDYWxsTWV0aG9kKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLFxuIgotICAgICIgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpScGNDb250cm9sbGVyKiBjb250cm9sbGVyLFxuIgotICAgICIgICAgICAgICAgICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiByZXF1ZXN0LFxuIgotICAgICIgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiByZXNwb25zZSxcbiIKLSAgICAiICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Q2xvc3VyZSogZG9uZSk7XG4iCi0gICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgR2V0UmVxdWVzdFByb3RvdHlwZShcbiIKLSAgICAiICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgY29uc3Q7XG4iCi0gICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgR2V0UmVzcG9uc2VQcm90b3R5cGUoXG4iCi0gICAgIiAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0O1xuIik7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiXG4iCi0gICAgIiBwcml2YXRlOlxuIgotICAgICIgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUygkY2xhc3NuYW1lJCk7XG4iCi0gICAgIn07XG4iCi0gICAgIlxuIik7Ci19Ci0KLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVTdHViRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiY2xhc3MgJGRsbGV4cG9ydCQkY2xhc3NuYW1lJF9TdHViIDogcHVibGljICRjbGFzc25hbWUkIHtcbiIKLSAgICAiIHB1YmxpYzpcbiIpOwotCi0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KHZhcnNfLAotICAgICIkY2xhc3NuYW1lJF9TdHViKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ2hhbm5lbCogY2hhbm5lbCk7XG4iCi0gICAgIiRjbGFzc25hbWUkX1N0dWIoOjpnb29nbGU6OnByb3RvYnVmOjpScGNDaGFubmVsKiBjaGFubmVsLFxuIgotICAgICIgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZTo6Q2hhbm5lbE93bmVyc2hpcCBvd25lcnNoaXApO1xuIgotICAgICJ+JGNsYXNzbmFtZSRfU3R1YigpO1xuIgotICAgICJcbiIKLSAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ2hhbm5lbCogY2hhbm5lbCgpIHsgcmV0dXJuIGNoYW5uZWxfOyB9XG4iCi0gICAgIlxuIgotICAgICIvLyBpbXBsZW1lbnRzICRjbGFzc25hbWUkIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgotICAgICJcbiIpOwotCi0gIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlcyhOT05fVklSVFVBTCwgcHJpbnRlcik7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiIHByaXZhdGU6XG4iCi0gICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpScGNDaGFubmVsKiBjaGFubmVsXztcbiIKLSAgICAiICBib29sIG93bnNfY2hhbm5lbF87XG4iCi0gICAgIiAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKCRjbGFzc25hbWUkX1N0dWIpO1xuIgotICAgICJ9O1xuIgotICAgICJcbiIpOwotfQotCi12b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlcygKLSAgICBWaXJ0dWFsT3JOb24gdmlydHVhbF9vcl9ub24sIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOwotICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc3ViX3ZhcnM7Ci0gICAgc3ViX3ZhcnNbIm5hbWUiXSA9IG1ldGhvZC0+bmFtZSgpOwotICAgIHN1Yl92YXJzWyJpbnB1dF90eXBlIl0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCksIHRydWUpOwotICAgIHN1Yl92YXJzWyJvdXRwdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSwgdHJ1ZSk7Ci0gICAgc3ViX3ZhcnNbInZpcnR1YWwiXSA9IHZpcnR1YWxfb3Jfbm9uID09IFZJUlRVQUwgPyAidmlydHVhbCAiIDogIiI7Ci0KLSAgICBwcmludGVyLT5QcmludChzdWJfdmFycywKLSAgICAgICIkdmlydHVhbCR2b2lkICRuYW1lJCg6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NvbnRyb2xsZXIqIGNvbnRyb2xsZXIsXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgY29uc3QgJGlucHV0X3R5cGUkKiByZXF1ZXN0LFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICRvdXRwdXRfdHlwZSQqIHJlc3BvbnNlLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Q2xvc3VyZSogZG9uZSk7XG4iKTsKLSAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGludCBpbmRleCkgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbImNsYXNzbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKLSAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaW5kZXgpOwotCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfID0gZmlsZS0+c2VydmljZSgkaW5kZXgkKTtcbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVJbXBsZW1lbnRhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiJGNsYXNzbmFtZSQ6On4kY2xhc3NuYW1lJCgpIHt9XG4iCi0gICAgIlxuIgotICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yKiAkY2xhc3NuYW1lJDo6ZGVzY3JpcHRvcigpIHtcbiIKLSAgICAiICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTtcbiIKLSAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl87XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3IqICRjbGFzc25hbWUkOjpHZXREZXNjcmlwdG9yKCkge1xuIgotICAgICIgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpO1xuIgotICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXztcbiIKLSAgICAifVxuIgotICAgICJcbiIpOwotCi0gIC8vIEdlbmVyYXRlIG1ldGhvZHMgb2YgdGhlIGludGVyZmFjZS4KLSAgR2VuZXJhdGVOb3RJbXBsZW1lbnRlZE1ldGhvZHMocHJpbnRlcik7Ci0gIEdlbmVyYXRlQ2FsbE1ldGhvZChwcmludGVyKTsKLSAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUkVRVUVTVCwgcHJpbnRlcik7Ci0gIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFU1BPTlNFLCBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSBzdHViIGltcGxlbWVudGF0aW9uLgotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiJGNsYXNzbmFtZSRfU3R1Yjo6JGNsYXNzbmFtZSRfU3R1Yig6Omdvb2dsZTo6cHJvdG9idWY6OlJwY0NoYW5uZWwqIGNoYW5uZWwpXG4iCi0gICAgIiAgOiBjaGFubmVsXyhjaGFubmVsKSwgb3duc19jaGFubmVsXyhmYWxzZSkge31cbiIKLSAgICAiJGNsYXNzbmFtZSRfU3R1Yjo6JGNsYXNzbmFtZSRfU3R1YihcbiIKLSAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ2hhbm5lbCogY2hhbm5lbCxcbiIKLSAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZTo6Q2hhbm5lbE93bmVyc2hpcCBvd25lcnNoaXApXG4iCi0gICAgIiAgOiBjaGFubmVsXyhjaGFubmVsKSxcbiIKLSAgICAiICAgIG93bnNfY2hhbm5lbF8ob3duZXJzaGlwID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZTo6U1RVQl9PV05TX0NIQU5ORUwpIHt9XG4iCi0gICAgIiRjbGFzc25hbWUkX1N0dWI6On4kY2xhc3NuYW1lJF9TdHViKCkge1xuIgotICAgICIgIGlmIChvd25zX2NoYW5uZWxfKSBkZWxldGUgY2hhbm5lbF87XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iKTsKLQotICBHZW5lcmF0ZVN0dWJNZXRob2RzKHByaW50ZXIpOwotfQotCi12b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTm90SW1wbGVtZW50ZWRNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOwotICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gc3ViX3ZhcnM7Ci0gICAgc3ViX3ZhcnNbImNsYXNzbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKLSAgICBzdWJfdmFyc1sibmFtZSJdID0gbWV0aG9kLT5uYW1lKCk7Ci0gICAgc3ViX3ZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOwotICAgIHN1Yl92YXJzWyJpbnB1dF90eXBlIl0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCksIHRydWUpOwotICAgIHN1Yl92YXJzWyJvdXRwdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSwgdHJ1ZSk7Ci0KLSAgICBwcmludGVyLT5QcmludChzdWJfdmFycywKLSAgICAgICJ2b2lkICRjbGFzc25hbWUkOjokbmFtZSQoOjpnb29nbGU6OnByb3RvYnVmOjpScGNDb250cm9sbGVyKiBjb250cm9sbGVyLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkaW5wdXRfdHlwZSQqLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAkb3V0cHV0X3R5cGUkKixcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpDbG9zdXJlKiBkb25lKSB7XG4iCi0gICAgICAiICBjb250cm9sbGVyLT5TZXRGYWlsZWQoXCJNZXRob2QgJG5hbWUkKCkgbm90IGltcGxlbWVudGVkLlwiKTtcbiIKLSAgICAgICIgIGRvbmUtPlJ1bigpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIpOwotICB9Ci19Ci0KLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVDYWxsTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KHZhcnNfLAotICAgICJ2b2lkICRjbGFzc25hbWUkOjpDYWxsTWV0aG9kKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLFxuIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIHJlcXVlc3QsXG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiByZXNwb25zZSxcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkNsb3N1cmUqIGRvbmUpIHtcbiIKLSAgICAiICBHT09HTEVfRENIRUNLX0VRKG1ldGhvZC0+c2VydmljZSgpLCAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyk7XG4iCi0gICAgIiAgc3dpdGNoKG1ldGhvZC0+aW5kZXgoKSkge1xuIik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiBzdWJfdmFyczsKLSAgICBzdWJfdmFyc1sibmFtZSJdID0gbWV0aG9kLT5uYW1lKCk7Ci0gICAgc3ViX3ZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOwotICAgIHN1Yl92YXJzWyJpbnB1dF90eXBlIl0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCksIHRydWUpOwotICAgIHN1Yl92YXJzWyJvdXRwdXRfdHlwZSJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSwgdHJ1ZSk7Ci0KLSAgICAvLyBOb3RlOiAgZG93bl9jYXN0IGRvZXMgbm90IHdvcmsgaGVyZSBiZWNhdXNlIGl0IG9ubHkgd29ya3Mgb24gcG9pbnRlcnMsCi0gICAgLy8gICBub3QgcmVmZXJlbmNlcy4KLSAgICBwcmludGVyLT5QcmludChzdWJfdmFycywKLSAgICAgICIgICAgY2FzZSAkaW5kZXgkOlxuIgotICAgICAgIiAgICAgICRuYW1lJChjb250cm9sbGVyLFxuIgotICAgICAgIiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmRvd25fY2FzdDxjb25zdCAkaW5wdXRfdHlwZSQqPihyZXF1ZXN0KSxcbiIKLSAgICAgICIgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpkb3duX2Nhc3Q8ICRvdXRwdXRfdHlwZSQqPihyZXNwb25zZSksXG4iCi0gICAgICAiICAgICAgICAgICAgIGRvbmUpO1xuIgotICAgICAgIiAgICAgIGJyZWFrO1xuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAiICAgIGRlZmF1bHQ6XG4iCi0gICAgIiAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8IFwiQmFkIG1ldGhvZCBpbmRleDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLlwiO1xuIgotICAgICIgICAgICBicmVhaztcbiIKLSAgICAiICB9XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iKTsKLX0KLQotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUdldFByb3RvdHlwZShSZXF1ZXN0T3JSZXNwb25zZSB3aGljaCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKHdoaWNoID09IFJFUVVFU1QpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzXywKLSAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmICRjbGFzc25hbWUkOjpHZXRSZXF1ZXN0UHJvdG90eXBlKFxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyc18sCi0gICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiAkY2xhc3NuYW1lJDo6R2V0UmVzcG9uc2VQcm90b3R5cGUoXG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcnNfLAotICAgICIgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0IHtcbiIKLSAgICAiICBHT09HTEVfRENIRUNLX0VRKG1ldGhvZC0+c2VydmljZSgpLCBkZXNjcmlwdG9yKCkpO1xuIgotICAgICIgIHN3aXRjaChtZXRob2QtPmluZGV4KCkpIHtcbiIpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOwotICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUgPQotICAgICAgKHdoaWNoID09IFJFUVVFU1QpID8gbWV0aG9kLT5pbnB1dF90eXBlKCkgOiBtZXRob2QtPm91dHB1dF90eXBlKCk7Ci0KLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHN1Yl92YXJzOwotICAgIHN1Yl92YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKLSAgICBzdWJfdmFyc1sidHlwZSJdID0gQ2xhc3NOYW1lKHR5cGUsIHRydWUpOwotCi0gICAgcHJpbnRlci0+UHJpbnQoc3ViX3ZhcnMsCi0gICAgICAiICAgIGNhc2UgJGluZGV4JDpcbiIKLSAgICAgICIgICAgICByZXR1cm4gJHR5cGUkOjpkZWZhdWx0X2luc3RhbmNlKCk7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcnNfLAotICAgICIgICAgZGVmYXVsdDpcbiIKLSAgICAiICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgXCJCYWQgbWV0aG9kIGluZGV4OyB0aGlzIHNob3VsZCBuZXZlciBoYXBwZW4uXCI7XG4iCi0gICAgIiAgICAgIHJldHVybiAqc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSo+KE5VTEwpO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIgotICAgICJcbiIpOwotfQotCi12b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1Yk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiBzdWJfdmFyczsKLSAgICBzdWJfdmFyc1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOwotICAgIHN1Yl92YXJzWyJuYW1lIl0gPSBtZXRob2QtPm5hbWUoKTsKLSAgICBzdWJfdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7Ci0gICAgc3ViX3ZhcnNbImlucHV0X3R5cGUiXSA9IENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSwgdHJ1ZSk7Ci0gICAgc3ViX3ZhcnNbIm91dHB1dF90eXBlIl0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpLCB0cnVlKTsKLQotICAgIHByaW50ZXItPlByaW50KHN1Yl92YXJzLAotICAgICAgInZvaWQgJGNsYXNzbmFtZSRfU3R1Yjo6JG5hbWUkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlcixcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAkaW5wdXRfdHlwZSQqIHJlcXVlc3QsXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJG91dHB1dF90eXBlJCogcmVzcG9uc2UsXG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpDbG9zdXJlKiBkb25lKSB7XG4iCi0gICAgICAiICBjaGFubmVsXy0+Q2FsbE1ldGhvZChkZXNjcmlwdG9yKCktPm1ldGhvZCgkaW5kZXgkKSxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgIGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBkb25lKTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkZTJmZDguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TRVJWSUNFX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NFUlZJQ0VfSF9fCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCi0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgY3BwIHsKLQotY2xhc3MgU2VydmljZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KLSAgZXhwbGljaXQgU2VydmljZUdlbmVyYXRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLSAgflNlcnZpY2VHZW5lcmF0b3IoKTsKLQotICAvLyBIZWFkZXIgc3R1ZmYuCi0KLSAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGRlZmluaXRpb25zIGZvciB0aGUgc2VydmljZSdzIGludGVyZmFjZSBhbmQgdGhlCi0gIC8vIHN0dWIgaW1wbGVtZW50YXRpb24uCi0gIHZvaWQgR2VuZXJhdGVEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIFNvdXJjZSBmaWxlIHN0dWZmLgotCi0gIC8vIEdlbmVyYXRlIGNvZGUgdGhhdCBpbml0aWFsaXplcyB0aGUgZ2xvYmFsIHZhcmlhYmxlIHN0b3JpbmcgdGhlIHNlcnZpY2UncwotICAvLyBkZXNjcmlwdG9yLgotICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQgaW5kZXgpOwotCi0gIC8vIEdlbmVyYXRlIGltcGxlbWVudGF0aW9ucyBvZiBldmVyeXRoaW5nIGRlY2xhcmVkIGJ5IEdlbmVyYXRlRGVjbGFyYXRpb25zKCkuCi0gIHZvaWQgR2VuZXJhdGVJbXBsZW1lbnRhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSBwcml2YXRlOgotICBlbnVtIFJlcXVlc3RPclJlc3BvbnNlIHsgUkVRVUVTVCwgUkVTUE9OU0UgfTsKLSAgZW51bSBWaXJ0dWFsT3JOb24geyBWSVJUVUFMLCBOT05fVklSVFVBTCB9OwotCi0gIC8vIEhlYWRlciBzdHVmZi4KLQotICAvLyBHZW5lcmF0ZSB0aGUgc2VydmljZSBhYnN0cmFjdCBpbnRlcmZhY2UuCi0gIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBzdHViIGNsYXNzIGRlZmluaXRpb24uCi0gIHZvaWQgR2VuZXJhdGVTdHViRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gUHJpbnRzIHNpZ25hdHVyZXMgZm9yIGFsbCBtZXRob2RzIGluIHRoZQotICB2b2lkIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlcyhWaXJ0dWFsT3JOb24gdmlydHVhbF9vcl9ub24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBTb3VyY2UgZmlsZSBzdHVmZi4KLQotICAvLyBHZW5lcmF0ZSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNlcnZpY2UgbWV0aG9kcywgd2hpY2gKLSAgLy8gcHJvZHVjZSBhICJub3QgaW1wbGVtZW50ZWQiIGVycm9yLgotICB2b2lkIEdlbmVyYXRlTm90SW1wbGVtZW50ZWRNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSB0aGUgQ2FsbE1ldGhvZCgpIG1ldGhvZCBvZiB0aGUgc2VydmljZS4KLSAgdm9pZCBHZW5lcmF0ZUNhbGxNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBHZXR7UmVxdWVzdCxSZXNwb25zZX1Qcm90b3R5cGUoKSBtZXRob2RzLgotICB2b2lkIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJlcXVlc3RPclJlc3BvbnNlIHdoaWNoLCBpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIHN0dWIncyBpbXBsZW1lbnRhdGlvbnMgb2YgdGhlIHNlcnZpY2UgbWV0aG9kcy4KLSAgdm9pZCBHZW5lcmF0ZVN0dWJNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyc187Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlcnZpY2VHZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNwcAotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX1NFUlZJQ0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWQ3NDM0NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODcxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBjcHAgewotCi1uYW1lc3BhY2UgewotCi12b2lkIFNldFN0cmluZ1ZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7Ci0gIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7Ci0gICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHRfbGVuZ3RoIl0gPQotICAgICAgU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmxlbmd0aCgpKTsKLSAgc3RyaW5nIGRlZmF1bHRfdmFyaWFibGVfc3RyaW5nID0KLSAgICAgIGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKQotICAgICAgICAgID8gIiY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSIKLSAgICAgICAgICA6ICJfZGVmYXVsdF8iICsgRmllbGROYW1lKGRlc2NyaXB0b3IpICsgIl8iOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHRfdmFyaWFibGUiXSA9IGRlZmF1bHRfdmFyaWFibGVfc3RyaW5nOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHRfdmFsdWVfaW5pdCJdID0KLSAgICAgIGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKQotICAgICAgPyAiIiA6ICIqIiArIGRlZmF1bHRfdmFyaWFibGVfc3RyaW5nOwotICAoKnZhcmlhYmxlcylbInBvaW50ZXJfdHlwZSJdID0KLSAgICAgIGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgPyAidm9pZCIgOiAiY2hhciI7Ci0gIC8vIE5PVEU6IEVzY2FwZWQgaGVyZSB0byB1bmJsb2NrIHByb3RvMS0+cHJvdG8yIG1pZ3JhdGlvbi4KLSAgLy8gVE9ETyhsaXVqaXNpKTogRXh0ZW5kIHRoaXMgdG8gYXBwbHkgZm9yIG90aGVyIGNvbmZsaWN0aW5nIG1ldGhvZHMuCi0gICgqdmFyaWFibGVzKVsicmVsZWFzZV9uYW1lIl0gPQotICAgICAgU2FmZUZ1bmN0aW9uTmFtZShkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvciwgInJlbGVhc2VfIik7Ci0gICgqdmFyaWFibGVzKVsiZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKTsKLQotICAoKnZhcmlhYmxlcylbInN0cmluZ19waWVjZSJdID0gIjo6c3RkOjpzdHJpbmciOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TdHJpbmdGaWVsZEdlbmVyYXRvcjo6U3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCi0gICAgOiBGaWVsZEdlbmVyYXRvcihvcHRpb25zKSwgZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgewotICBTZXRTdHJpbmdWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOwotfQotCi1TdHJpbmdGaWVsZEdlbmVyYXRvcjo6flN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KLQotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIE4uQi4gdGhhdCB3ZSBjb250aW51ZSB0byB1c2UgfEFyZW5hU3RyaW5nUHRyfCBpbnN0ZWFkIG9mIHxzdHJpbmcqfCBmb3IKLSAgLy8gc3RyaW5nIGZpZWxkcywgZXZlbiB3aGVuIFN1cHBvcnRBcmVuYXMoZGVzY3JpcHRvcl8pID09IGZhbHNlLiBXaHk/Ci0gIC8vIFRoZSBzaW1wbGUgYW5zd2VyIGlzIHRvIGF2b2lkIHVubWFpbnRhaW5hYmxlIGNvbXBsZXhpdHkuIFRoZSByZWZsZWN0aW9uCi0gIC8vIGNvZGUgYXNzdW1lcyBBcmVuYVN0cmluZ1B0cnMuIFRoZXNlIGFyZSAqYWxtb3N0KiBpbi1tZW1vcnktY29tcGF0aWJsZSB3aXRoCi0gIC8vIHN0cmluZyosIGV4Y2VwdCBmb3IgdGhlIHBvaW50ZXIgdGFncyBhbmQgcmVsYXRlZCBvd25lcnNoaXAgc2VtYW50aWNzLiBXZQotICAvLyBjb3VsZCBtb2RpZnkgdGhlIHJ1bnRpbWUgY29kZSB0byB1c2Ugc3RyaW5nKiBmb3IgdGhlIG5vdC1zdXBwb3J0aW5nLWFyZW5hcwotICAvLyBjYXNlLCBidXQgdGhpcyB3b3VsZCByZXF1aXJlIGEgd2F5IHRvIGRldGVjdCB3aGljaCB0eXBlIG9mIGNsYXNzIHdhcwotICAvLyBnZW5lcmF0ZWQgKGFkZGluZyBvdmVyaGVhZCBhbmQgY29tcGxleGl0eSB0byBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbikKLSAgLy8gYW5kIGxpdHRlcmluZyB0aGUgcnVudGltZSBjb2RlIHBhdGhzIHdpdGggY29uZGl0aW9uYWxzLiBJdCdzIHNpbXBsZXIgdG8KLSAgLy8gc3RpY2sgd2l0aCB0aGlzIGJ1dCB1c2UgbGlnaHR3ZWlnaHQgYWNjZXNzb3JzIHRoYXQgYXNzdW1lIGFyZW5hID09IE5VTEwuCi0gIC8vIFRoZXJlIHNob3VsZCBiZSB2ZXJ5IGxpdHRsZSBvdmVyaGVhZCBhbnl3YXkgYmVjYXVzZSBpdCdzIGp1c3QgYSB0YWdnZWQKLSAgLy8gcG9pbnRlciBpbi1tZW1vcnkuCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciAkbmFtZSRfO1xuIik7Ci19Ci0KLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTdGF0aWNNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmICghZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGF0aWMgOjpzdGQ6OnN0cmluZyogJGRlZmF1bHRfdmFyaWFibGUkO1xuIik7Ci0gIH0KLX0KLQotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIElmIHdlJ3JlIHVzaW5nIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIGZvciBhIGZpZWxkIHdpdGggYSBjdHlwZSwgaXQncwotICAvLyBiZWNhdXNlIHRoYXQgY3R5cGUgaXNuJ3QgYWN0dWFsbHkgaW1wbGVtZW50ZWQuICBJbiBwYXJ0aWN1bGFyLCB0aGlzIGlzCi0gIC8vIHRydWUgb2YgY3R5cGU9Q09SRCBhbmQgY3R5cGU9U1RSSU5HX1BJRUNFIGluIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLgotICAvLyBXZSBhcmVuJ3QgcmVsZWFzaW5nIENvcmQgYmVjYXVzZSBpdCBoYXMgdG9vIG1hbnkgR29vZ2xlLXNwZWNpZmljCi0gIC8vIGRlcGVuZGVuY2llcyBhbmQgd2UgYXJlbid0IHJlbGVhc2luZyBTdHJpbmdQaWVjZSBiZWNhdXNlIGl0J3MgaGFyZGx5Ci0gIC8vIHVzZWZ1bCBvdXRzaWRlIG9mIEdvb2dsZSBhbmQgYmVjYXVzZSBpdCB3b3VsZCBnZXQgY29uZnVzaW5nIHRvIGhhdmUKLSAgLy8gbXVsdGlwbGUgaW5zdGFuY2VzIG9mIHRoZSBTdHJpbmdQaWVjZSBjbGFzcyBpbiBkaWZmZXJlbnQgbGlicmFyaWVzIChQQ1JFCi0gIC8vIGFscmVhZHkgaW5jbHVkZXMgaXQgZm9yIHRoZWlyIEMrKyBiaW5kaW5ncywgd2hpY2ggY2FtZSBmcm9tIEdvb2dsZSkuCi0gIC8vCi0gIC8vIEluIGFueSBjYXNlLCB3ZSBtYWtlIGFsbCB0aGUgYWNjZXNzb3JzIHByaXZhdGUgd2hpbGUgc3RpbGwgYWN0dWFsbHkKLSAgLy8gdXNpbmcgYSBzdHJpbmcgdG8gcmVwcmVzZW50IHRoZSBmaWVsZCBpbnRlcm5hbGx5LiAgVGhpcyB3YXksIHdlIGNhbgotICAvLyBndWFyYW50ZWUgdGhhdCBpZiB3ZSBkbyBldmVyIGltcGxlbWVudCB0aGUgY3R5cGUsIGl0IHdvbid0IGJyZWFrIGFueQotICAvLyBleGlzdGluZyB1c2VycyB3aG8gbWlnaHQgYmUgLS0gZm9yIHdoYXRldmVyIHJlYXNvbiAtLSBhbHJlYWR5IHVzaW5nIC5wcm90bwotICAvLyBmaWxlcyB0aGF0IGFwcGxpZWQgdGhlIGN0eXBlLiAgVGhlIGZpZWxkIGNhbiBzdGlsbCBiZSBhY2Nlc3NlZCB2aWEgdGhlCi0gIC8vIHJlZmxlY3Rpb24gaW50ZXJmYWNlIHNpbmNlIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZSBpcyBpbmRlcGVuZGVudCBvZgotICAvLyB0aGUgc3RyaW5nJ3MgdW5kZXJseWluZyByZXByZXNlbnRhdGlvbi4KLQotICBib29sIHVua25vd25fY3R5cGUgPQotICAgICAgZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5jdHlwZSgpICE9IEVmZmVjdGl2ZVN0cmluZ0NUeXBlKGRlc2NyaXB0b3JfKTsKLQotICBpZiAodW5rbm93bl9jdHlwZSkgewotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIgcHJpdmF0ZTpcbiIKLSAgICAgICIgIC8vIEhpZGRlbiBkdWUgdG8gdW5rbm93biBjdHlwZSBvcHRpb24uXG4iKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjpzdGQ6OnN0cmluZyYgJG5hbWUkKCkgY29uc3Q7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHNldF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpO1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSIKLSAgICAgICAgICAgICAgICAgIjtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlXyRuYW1lJCgpO1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJDo6c3RkOjpzdHJpbmcqICRyZWxlYXNlX25hbWUkKCk7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfYWxsb2NhdGVkXyRuYW1lJCg6OnN0ZDo6c3RyaW5nKiAkbmFtZSQpO1xuIik7Ci0gIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGVkX2F0dHIkOjpzdGQ6OnN0cmluZyogdW5zYWZlX2FyZW5hX3JlbGVhc2VfJG5hbWUkKCk7XG4iCi0gICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkXyRuYW1lJChcbiIKLSAgICAgICIgICAgOjpzdGQ6OnN0cmluZyogJG5hbWUkKTtcbiIpOwotICB9Ci0KLQotICBpZiAodW5rbm93bl9jdHlwZSkgewotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgiIHB1YmxpYzpcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICB9Ci19Ci0KLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOwotICB2YXJpYWJsZXNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSIgOiAiIjsKLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIkaW5saW5lJCBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfLkdldCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCi0gICAgICAiICAkc2V0X2hhc2JpdCRcbiIKLSAgICAgICIgICRuYW1lJF8uU2V0KCRkZWZhdWx0X3ZhcmlhYmxlJCwgdmFsdWUsIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgotICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCi0gICAgICAiICAkbmFtZSRfLlNldCgkZGVmYXVsdF92YXJpYWJsZSQsICRzdHJpbmdfcGllY2UkKHZhbHVlKSxcbiIKLSAgICAgICIgICAgICAgICAgICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCAiCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsXG4iCi0gICAgICAiICAgIHNpemVfdCBzaXplKSB7XG4iCi0gICAgICAiICAkc2V0X2hhc2JpdCRcbiIKLSAgICAgICIgICRuYW1lJF8uU2V0KCRkZWZhdWx0X3ZhcmlhYmxlJCwgJHN0cmluZ19waWVjZSQoXG4iCi0gICAgICAiICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXy5NdXRhYmxlKCRkZWZhdWx0X3ZhcmlhYmxlJCwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjokcmVsZWFzZV9uYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfLlJlbGVhc2UoJGRlZmF1bHRfdmFyaWFibGUkLCBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9yZWxlYXNlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSAhPSBOVUxMKTtcbiIKLSAgICAgICIgICRjbGVhcl9oYXNiaXQkXG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXy5VbnNhZmVBcmVuYVJlbGVhc2UoJGRlZmF1bHRfdmFyaWFibGUkLFxuIgotICAgICAgIiAgICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfYWxsb2NhdGVkXyRuYW1lJCg6OnN0ZDo6c3RyaW5nKiAkbmFtZSQpIHtcbiIKLSAgICAgICIgIGlmICgkbmFtZSQgIT0gTlVMTCkge1xuIgotICAgICAgIiAgICAkc2V0X2hhc2JpdCRcbiIKLSAgICAgICIgIH0gZWxzZSB7XG4iCi0gICAgICAiICAgICRjbGVhcl9oYXNiaXQkXG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICAkbmFtZSRfLlNldEFsbG9jYXRlZCgkZGVmYXVsdF92YXJpYWJsZSQsICRuYW1lJCxcbiIKLSAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF8kbmFtZSQoXG4iCi0gICAgICAiICAgIDo6c3RkOjpzdHJpbmcqICRuYW1lJCkge1xuIgotICAgICAgIiAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpO1xuIgotICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMKSB7XG4iCi0gICAgICAiICAgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgICRuYW1lJF8uVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWQoJGRlZmF1bHRfdmFyaWFibGUkLFxuIgotICAgICAgIiAgICAgICRuYW1lJCwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6IgotICAgICAgIiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIC8vIE5vLWFyZW5hIGNhc2UuCi0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgIiRpbmxpbmUkIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF8uR2V0Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCi0gICAgICAiICAkc2V0X2hhc2JpdCRcbiIKLSAgICAgICIgICRuYW1lJF8uU2V0Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQsIHZhbHVlKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgJG5hbWUkXy5TZXROb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCwgJHN0cmluZ19waWVjZSQodmFsdWUpKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjokZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgIgotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCAiCi0gICAgICAic2l6ZV90IHNpemUpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgJG5hbWUkXy5TZXROb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCxcbiIKLSAgICAgICIgICAgICAkc3RyaW5nX3BpZWNlJChyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjokZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfLk11dGFibGVOb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjokcmVsZWFzZV9uYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfLlJlbGVhc2VOb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKDo6c3RkOjpzdHJpbmcqICRuYW1lJCkge1xuIgotICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMKSB7XG4iCi0gICAgICAiICAgICRzZXRfaGFzYml0JFxuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgJGNsZWFyX2hhc2JpdCRcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgICRuYW1lJF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQsICRuYW1lJCk7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDokZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi12b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoIWRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKLSAgICAvLyBJbml0aWFsaXplZCBpbiBHZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUFsbG9jYXRvci4KLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIjo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjokZGVmYXVsdF92YXJpYWJsZSQgPSBOVUxMO1xuIik7Ci0gIH0KLX0KLQotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBUd28tZGltZW5zaW9uIHNwZWNpYWxpemF0aW9uIGhlcmU6IHN1cHBvcnRpbmcgYXJlbmFzIG9yIG5vdCwgYW5kIGRlZmF1bHQKLSAgLy8gdmFsdWUgaXMgdGhlIGVtcHR5IHN0cmluZyBvciBub3QuIENvbXBsZXhpdHkgaGVyZSBlbnN1cmVzIHRoZSBtaW5pbWFsCi0gIC8vIG51bWJlciBvZiBicmFuY2hlcyAvIGFtb3VudCBvZiBleHRyYW5lb3VzIGNvZGUgYXQgcnVudGltZSAoZ2l2ZW4gdGhhdCB0aGUKLSAgLy8gYmVsb3cgbWV0aG9kcyBhcmUgaW5saW5lZCBvbmUtbGluZXJzKSEKLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiJG5hbWUkXy5DbGVhclRvRW1wdHkoJGRlZmF1bHRfdmFyaWFibGUkLCBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiJG5hbWUkXy5DbGVhclRvRGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQsIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiJG5hbWUkXy5DbGVhclRvRW1wdHlOb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgIiRuYW1lJF8uQ2xlYXJUb0RlZmF1bHROb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykgfHwgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBOVUxMKSB7Ci0gICAgLy8gVE9ETyhncGlrZSk6IGltcHJvdmUgdGhpcwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzZXRfJG5hbWUkKGZyb20uJG5hbWUkKCkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkc2V0X2hhc2JpdCRcbiIKLSAgICAgICIkbmFtZSRfLkFzc2lnbldpdGhEZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCwgZnJvbS4kbmFtZSRfKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7Ci19Ci0KLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkbmFtZSRfLlVuc2FmZVNldERlZmF1bHQoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIpOwotfQotCi12b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJG5hbWUkXy5EZXN0cm95KCRkZWZhdWx0X3ZhcmlhYmxlJCwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRuYW1lJF8uRGVzdHJveU5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkY2xhc3NuYW1lJDo6JGRlZmF1bHRfdmFyaWFibGUkID1cbiIKLSAgICAgICIgICAgbmV3IDo6c3RkOjpzdHJpbmcoJGRlZmF1bHQkLCAkZGVmYXVsdF9sZW5ndGgkKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJkZWxldGUgJGNsYXNzbmFtZSQ6OiRkZWZhdWx0X3ZhcmlhYmxlJDtcbiIpOwotICB9Ci19Ci0KLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWQkZGVjbGFyZWRfdHlwZSQoXG4iCi0gICAgIiAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSk7XG4iKTsKLQotICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7Ci0gICAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKAotICAgICAgICBkZXNjcmlwdG9yXywgb3B0aW9uc18sIHRydWUsIHZhcmlhYmxlc18sCi0gICAgICAgICJ0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIiwgcHJpbnRlcik7Ci0gIH0KLX0KLQotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7Ci0gICAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKAotICAgICAgICBkZXNjcmlwdG9yXywgb3B0aW9uc18sIGZhbHNlLCB2YXJpYWJsZXNfLAotICAgICAgICAidGhpcy0+JG5hbWUkKCkuZGF0YSgpLCB0aGlzLT4kbmFtZSQoKS5sZW5ndGgoKSxcbiIsIHByaW50ZXIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRkZWNsYXJlZF90eXBlJE1heWJlQWxpYXNlZChcbiIKLSAgICAiICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIG91dHB1dCk7XG4iKTsKLX0KLQotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZygKLSAgICAgICAgZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCBmYWxzZSwgdmFyaWFibGVzXywKLSAgICAgICAgInRoaXMtPiRuYW1lJCgpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKCkubGVuZ3RoKCksXG4iLCBwcmludGVyKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJ0YXJnZXQgPVxuIgotICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRkZWNsYXJlZF90eXBlJFRvQXJyYXkoXG4iCi0gICAgIiAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKCksIHRhcmdldCk7XG4iKTsKLX0KLQotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCi0gICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OiRkZWNsYXJlZF90eXBlJFNpemUoXG4iCi0gICAgIiAgICB0aGlzLT4kbmFtZSQoKSk7XG4iKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQotICAgIDogU3RyaW5nRmllbGRHZW5lcmF0b3IoZGVzY3JpcHRvciwgb3B0aW9ucyksCi0gICAgICBkZXBlbmRlbnRfZmllbGRfKG9wdGlvbnMucHJvdG9faCkgewotICBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKLX0KLQotU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6flN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOwotICB2YXJpYWJsZXNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSIgOiAiIjsKLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIkaW5saW5lJCBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIGlmIChoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICIgICAgcmV0dXJuICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5HZXQoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgIHJldHVybiAqJGRlZmF1bHRfdmFyaWFibGUkO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCi0gICAgICAiICBpZiAoIWhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAgICIgICAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlVuc2FmZVNldERlZmF1bHQoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5TZXQoJGRlZmF1bHRfdmFyaWFibGUkLCB2YWx1ZSxcbiIKLSAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpIHtcbiIKLSAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlNldCgkZGVmYXVsdF92YXJpYWJsZSQsXG4iCi0gICAgICAiICAgICAgJHN0cmluZ19waWVjZSQodmFsdWUpLCBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjokZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgIgotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemUpIHtcbiIKLSAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlNldCgkZGVmYXVsdF92YXJpYWJsZSQsICRzdHJpbmdfcGllY2UkKFxuIgotICAgICAgIiAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSksXG4iCi0gICAgICAiICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgcmV0dXJuICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5NdXRhYmxlKCRkZWZhdWx0X3ZhcmlhYmxlJCxcbiIKLSAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6JHJlbGVhc2VfbmFtZSQoKSB7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIGlmIChoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICIgICAgY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICByZXR1cm4gJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlJlbGVhc2UoJGRlZmF1bHRfdmFyaWFibGUkLFxuIgotICAgICAgIiAgICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgIiAgICByZXR1cm4gTlVMTDtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9yZWxlYXNlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSAhPSBOVUxMKTtcbiIKLSAgICAgICIgIGlmIChoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICIgICAgY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICByZXR1cm4gJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlVuc2FmZUFyZW5hUmVsZWFzZShcbiIKLSAgICAgICIgICAgICAgICRkZWZhdWx0X3ZhcmlhYmxlJCwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgIiAgICByZXR1cm4gTlVMTDtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0X2FsbG9jYXRlZF8kbmFtZSQoOjpzdGQ6OnN0cmluZyogJG5hbWUkKSB7XG4iCi0gICAgICAiICBpZiAoIWhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCi0gICAgICAiICBpZiAoJG5hbWUkICE9IE5VTEwpIHtcbiIKLSAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAgICIgICAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlNldEFsbG9jYXRlZCgkZGVmYXVsdF92YXJpYWJsZSQsICRuYW1lJCxcbiIKLSAgICAgICIgICAgICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkXyRuYW1lJCgiCi0gICAgICAiOjpzdGQ6OnN0cmluZyogJG5hbWUkKSB7XG4iCi0gICAgICAiICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gTlVMTCk7XG4iCi0gICAgICAiICBpZiAoIWhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCi0gICAgICAiICBpZiAoJG5hbWUkKSB7XG4iCi0gICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCi0gICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVBcmVuYVNldEFsbG9jYXRlZCgkZGVmYXVsdF92YXJpYWJsZSQsICIKLSAgICAgICIkbmFtZSQsIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkOiIKLSAgICAgICIkZnVsbF9uYW1lJClcbiIKLSAgICAgICJ9XG4iKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBOby1hcmVuYSBjYXNlLgotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIkaW5saW5lJCBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIGlmIChoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICIgICAgcmV0dXJuICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5HZXROb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICByZXR1cm4gKiRkZWZhdWx0X3ZhcmlhYmxlJDtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkge1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKLSAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlNldE5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkLCB2YWx1ZSk7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKSB7XG4iCi0gICAgICAiICBpZiAoIWhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAgICIgICAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlVuc2FmZVNldERlZmF1bHQoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5TZXROb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCxcbiIKLSAgICAgICIgICAgICAkc3RyaW5nX3BpZWNlJCh2YWx1ZSkpO1xuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOiRmdWxsX25hbWUkKVxuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCAiCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSB7XG4iCi0gICAgICAiICBpZiAoIWhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAgICIgICAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlVuc2FmZVNldERlZmF1bHQoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICIgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5TZXROb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCwgJHN0cmluZ19waWVjZSQoXG4iCi0gICAgICAiICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7XG4iCi0gICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKLSAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgotICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAiICByZXR1cm4gJG9uZW9mX3ByZWZpeCQkbmFtZSRfLk11dGFibGVOb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCi0gICAgICAifVxuIgotICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjokcmVsZWFzZV9uYW1lJCgpIHtcbiIKLSAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgotICAgICAgIiAgaWYgKGhhc18kbmFtZSQoKSkge1xuIgotICAgICAgIiAgICBjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iCi0gICAgICAiICAgIHJldHVybiAkb25lb2ZfcHJlZml4JCRuYW1lJF8uUmVsZWFzZU5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAgICIgIH0gZWxzZSB7XG4iCi0gICAgICAiICAgIHJldHVybiBOVUxMO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIn1cbiIKLSAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfYWxsb2NhdGVkXyRuYW1lJCg6OnN0ZDo6c3RyaW5nKiAkbmFtZSQpIHtcbiIKLSAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKLSAgICAgICIgIGlmICgkbmFtZSQgIT0gTlVMTCkge1xuIgotICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQsXG4iCi0gICAgICAiICAgICAgICAkbmFtZSQpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCi0gICAgICAifVxuIik7Ci0gIH0KLX0KLQotdm9pZCBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOwotICBpZiAoZGVwZW5kZW50X2ZpZWxkXykgewotICAgIHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gPSBEZXBlbmRlbnRCYXNlRG93bkNhc3QoKTsKLSAgICAvLyBUaGlzIGNsZWFyaW5nIGNvZGUgbWF5IGJlIGluIHRoZSBkZXBlbmRlbnQgYmFzZSBjbGFzcy4gSWYgdGhlIGRlZmF1bHQKLSAgICAvLyB2YWx1ZSBpcyBhbiBlbXB0eSBzdHJpbmcsIHRoZW4gdGhlICRkZWZhdWx0X3ZhcmlhYmxlJCBpcyBhIGdsb2JhbAotICAgIC8vIHNpbmdsZXRvbi4gSWYgdGhlIGRlZmF1bHQgaXMgbm90IGVtcHR5LCB3ZSBuZWVkIHRvIGRvd24tY2FzdCB0byBnZXQgdGhlCi0gICAgLy8gZGVmYXVsdCB2YWx1ZSdzIGdsb2JhbCBzaW5nbGV0b24gaW5zdGFuY2UuIFNlZSBTZXRTdHJpbmdWYXJpYWJsZXMoKSBmb3IKLSAgICAvLyBwb3NzaWJsZSB2YWx1ZXMgb2YgZGVmYXVsdF92YXJpYWJsZS4KLSAgICBpZiAoIWRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKLSAgICAgIHZhcmlhYmxlc1siZGVmYXVsdF92YXJpYWJsZSJdID0KLSAgICAgICAgICBEZXBlbmRlbnRCYXNlRG93bkNhc3QoKSArIHZhcmlhYmxlc1siZGVmYXVsdF92YXJpYWJsZSJdOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdID0gIiI7Ci0gIH0KLSAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIkdGhpc19tZXNzYWdlJCRvbmVvZl9wcmVmaXgkJG5hbWUkXy5EZXN0cm95KCRkZWZhdWx0X3ZhcmlhYmxlJCxcbiIKLSAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAgICIkdGhpc19tZXNzYWdlJCRvbmVvZl9wcmVmaXgkJG5hbWUkXy4iCi0gICAgICAiRGVzdHJveU5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIpOwotICB9Ci19Ci0KLXZvaWQgU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBEb24ndCBwcmludCBhbnkgc3dhcHBpbmcgY29kZS4gU3dhcHBpbmcgdGhlIHVuaW9uIHdpbGwgc3dhcCB0aGlzIGZpZWxkLgotfQotCi12b2lkIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICAkY2xhc3NuYW1lJF9kZWZhdWx0X29uZW9mX2luc3RhbmNlXy0+JG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCIKLSAgICAiJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIpOwotfQotCi12b2lkIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uRGVzdHJveSgkZGVmYXVsdF92YXJpYWJsZSQsXG4iCi0gICAgICAiICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iCi0gICAgICAiICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uRGVzdHJveU5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi12b2lkIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkJGRlY2xhcmVkX3R5cGUkKFxuIgotICAgICAgIiAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSk7XG4iKTsKLQotICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7Ci0gICAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKAotICAgICAgICBkZXNjcmlwdG9yXywgb3B0aW9uc18sIHRydWUsIHZhcmlhYmxlc18sCi0gICAgICAgICJ0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIiwgcHJpbnRlcik7Ci0gIH0KLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OlJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQotICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKLSAgU2V0U3RyaW5nVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKLX0KLQotUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+ICRuYW1lJF87XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gU2VlIGNvbW1lbnQgYWJvdmUgYWJvdXQgdW5rbm93biBjdHlwZXMuCi0gIGJvb2wgdW5rbm93bl9jdHlwZSA9Ci0gICAgICBkZXNjcmlwdG9yXy0+b3B0aW9ucygpLmN0eXBlKCkgIT0gRWZmZWN0aXZlU3RyaW5nQ1R5cGUoZGVzY3JpcHRvcl8pOwotCi0gIGlmICh1bmtub3duX2N0eXBlKSB7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiBwcml2YXRlOlxuIgotICAgICAgIiAgLy8gSGlkZGVuIGR1ZSB0byB1bmtub3duIGN0eXBlIG9wdGlvbi5cbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6OnN0ZDo6c3RyaW5nJiAkbmFtZSQoaW50IGluZGV4KSBjb25zdDtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlXyRuYW1lJChpbnQgaW5kZXgpO1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7XG4iCi0gICAgIiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHNldF8kbmFtZSQoIgotICAgICAgICAgICAgICAgICAiaW50IGluZGV4LCBjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKTtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6OnN0ZDo6c3RyaW5nKiBhZGRfJG5hbWUkKCk7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBhZGRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTtcbiIKLSAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIGFkZF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpO1xuIgotICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgYWRkXyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSIKLSAgICAgICAgICAgICAgICAgIjtcbiIpOwotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgJG5hbWUkKCkgIgotICAgICAgICAgICAgICAgICAiY29uc3Q7XG4iCi0gICAgIiRkZXByZWNhdGVkX2F0dHIkOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV8kbmFtZSQoKSIKLSAgICAgICAgICAgICAgICAgIjtcbiIpOwotCi0gIGlmICh1bmtub3duX2N0eXBlKSB7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCIgcHVibGljOlxuIik7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIH0KLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3QgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKLSAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUiIDogIiI7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiJGlubGluZSQgY29uc3QgOjpzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgotICAgICIgIHJldHVybiAkbmFtZSRfLiRjcHBnZXQkKGluZGV4KTtcbiIKLSAgICAifVxuIgotICAgICIkaW5saW5lJCA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uTXV0YWJsZShpbmRleCk7XG4iCi0gICAgIn1cbiIKLSAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKLSAgICAiICAkbmFtZSRfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpO1xuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgotICAgICIgICRuYW1lJF8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOiRmdWxsX25hbWUkKVxuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgIgotICAgICIkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJCIKLSAgICAiKGludCBpbmRleCwgY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkge1xuIgotICAgICIgICRuYW1lJF8uTXV0YWJsZShpbmRleCktPmFzc2lnbihcbiIKLSAgICAiICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOiRmdWxsX25hbWUkKVxuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCkge1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5BZGQoKTtcbiIKLSAgICAifVxuIgotICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCi0gICAgIiAgJG5hbWUkXy5BZGQoKS0+YXNzaWduKHZhbHVlKTtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOiRmdWxsX25hbWUkKVxuIgotICAgICJ9XG4iCi0gICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpIHtcbiIKLSAgICAiICAkbmFtZSRfLkFkZCgpLT5hc3NpZ24odmFsdWUpO1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfY2hhcjokZnVsbF9uYW1lJClcbiIKLSAgICAifVxuIgotICAgICIkaW5saW5lJCB2b2lkICIKLSAgICAiJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkge1xuIgotICAgICIgICRuYW1lJF8uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpO1xuIgotICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjokZnVsbF9uYW1lJClcbiIKLSAgICAifVxuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKLSAgICAiJGlubGluZSQgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiZcbiIKLSAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKLSAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDokZnVsbF9uYW1lJClcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIgotICAgICIkaW5saW5lJCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KlxuIgotICAgICIkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCi0gICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDokZnVsbF9uYW1lJClcbiIKLSAgICAiICByZXR1cm4gJiRuYW1lJF87XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uQ2xlYXIoKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5NZXJnZUZyb20oZnJvbS4kbmFtZSRfKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+JG5hbWUkXyk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIE5vdCBuZWVkZWQgZm9yIHJlcGVhdGVkIGZpZWxkcy4KLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkJGRlY2xhcmVkX3R5cGUkKFxuIgotICAgICIgICAgICBpbnB1dCwgdGhpcy0+YWRkXyRuYW1lJCgpKSk7XG4iKTsKLSAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZygKLSAgICAgICAgZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCB0cnVlLCB2YXJpYWJsZXNfLAotICAgICAgICAidGhpcy0+JG5hbWUkKHRoaXMtPiRuYW1lJF9zaXplKCkgLSAxKS5kYXRhKCksXG4iCi0gICAgICAgICJ0aGlzLT4kbmFtZSQodGhpcy0+JG5hbWUkX3NpemUoKSAtIDEpLmxlbmd0aCgpLFxuIiwKLSAgICAgICAgcHJpbnRlcik7Ci0gIH0KLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKLSAgICBHZW5lcmF0ZVV0ZjhDaGVja0NvZGVGb3JTdHJpbmcoCi0gICAgICAgIGRlc2NyaXB0b3JfLCBvcHRpb25zXywgZmFsc2UsIHZhcmlhYmxlc18sCi0gICAgICAgICJ0aGlzLT4kbmFtZSQoaSkuZGF0YSgpLCB0aGlzLT4kbmFtZSQoaSkubGVuZ3RoKCksXG4iLCBwcmludGVyKTsKLSAgfQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkKFxuIgotICAgICIgICAgJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZygKLSAgICAgICAgZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCBmYWxzZSwgdmFyaWFibGVzXywKLSAgICAgICAgInRoaXMtPiRuYW1lJChpKS5kYXRhKCksIHRoaXMtPiRuYW1lJChpKS5sZW5ndGgoKSxcbiIsIHByaW50ZXIpOwotICB9Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6XG4iCi0gICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJFRvQXJyYXkoJG51bWJlciQsIHRoaXMtPiRuYW1lJChpKSwgdGFyZ2V0KTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCAqIHRoaXMtPiRuYW1lJF9zaXplKCk7XG4iCi0gICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCi0gICAgIiAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6JGRlY2xhcmVkX3R5cGUkU2l6ZShcbiIKLSAgICAiICAgIHRoaXMtPiRuYW1lJChpKSk7XG4iCi0gICAgIn1cbiIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjYjRlODc3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEzMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9TVFJJTkdfRklFTERfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU1RSSU5HX0ZJRUxEX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGNwcCB7Ci0KLWNsYXNzIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0gIH5TdHJpbmdGaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTdGF0aWNNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU5vbklubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRGVmYXVsdEluc3RhbmNlQWxsb2NhdG9yKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNodXRkb3duQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdGaWVsZEdlbmVyYXRvcik7Ci19OwotCi1jbGFzcyBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwotICB+U3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBib29sIGRlcGVuZGVudF9maWVsZF87Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKTsKLX07Ci0KLWNsYXNzIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0gIH5SZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfU1RSSU5HX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ZTI1YjJlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDE1NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gVGhpcyBmaWxlIHRlc3RzIHRoYXQgdmFyaW91cyBpZGVudGlmaWVycyB3b3JrIGFzIGZpZWxkIGFuZCB0eXBlIG5hbWVzIGV2ZW4KLS8vIHRob3VnaCB0aGUgc2FtZSBpZGVudGlmaWVycyBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBDKysgY29kZSBnZW5lcmF0b3IuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi0vLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCi0vLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAotb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAotCi0vLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0vLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLS8vIFRlc3QgdGhhdCBmaWVsZHMgY2FuIGhhdmUgbmFtZXMgbGlrZSAiaW5wdXQiIGFuZCAiaSIgd2hpY2ggYXJlIGFsc28gdXNlZAotLy8gaW50ZXJuYWxseSBieSB0aGUgY29kZSBnZW5lcmF0b3IgZm9yIGxvY2FsIHZhcmlhYmxlcy4KLW1lc3NhZ2UgVGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXMgewotICBtZXNzYWdlIEJ1aWxkRGVzY3JpcHRvcnMge30KLSAgbWVzc2FnZSBUeXBlVHJhaXRzIHt9Ci0KLSAgb3B0aW9uYWwgaW50MzIgaW5wdXQgPSAxOwotICBvcHRpb25hbCBpbnQzMiBvdXRwdXQgPSAyOwotICBvcHRpb25hbCBzdHJpbmcgbGVuZ3RoID0gMzsKLSAgcmVwZWF0ZWQgaW50MzIgaSA9IDQ7Ci0gIHJlcGVhdGVkIHN0cmluZyBuZXdfZWxlbWVudCA9IDUgW2N0eXBlPVNUUklOR19QSUVDRV07Ci0gIG9wdGlvbmFsIGludDMyIHRvdGFsX3NpemUgPSA2OwotICBvcHRpb25hbCBpbnQzMiB0YWcgPSA3OwotCi0gIGVudW0gVGVzdEVudW0geyBGT08gPSAwOyB9Ci0gIG1lc3NhZ2UgRGF0YTEgeyByZXBlYXRlZCBpbnQzMiBkYXRhID0gMTsgfQotICBtZXNzYWdlIERhdGEyIHsgcmVwZWF0ZWQgVGVzdEVudW0gZGF0YSA9IDE7IH0KLSAgbWVzc2FnZSBEYXRhMyB7IHJlcGVhdGVkIHN0cmluZyBkYXRhID0gMTsgfQotICBtZXNzYWdlIERhdGE0IHsgcmVwZWF0ZWQgRGF0YTQgZGF0YSA9IDE7IH0KLSAgbWVzc2FnZSBEYXRhNSB7IHJlcGVhdGVkIHN0cmluZyBkYXRhID0gMSBbY3R5cGU9U1RSSU5HX1BJRUNFXTsgfQotICBtZXNzYWdlIERhdGE2IHsgcmVwZWF0ZWQgc3RyaW5nIGRhdGEgPSAxIFtjdHlwZT1DT1JEXTsgfQotCi0gIG9wdGlvbmFsIGludDMyIHNvdXJjZSA9IDg7Ci0gIG9wdGlvbmFsIGludDMyIHZhbHVlID0gOTsKLSAgb3B0aW9uYWwgaW50MzIgZmlsZSA9IDEwOwotICBvcHRpb25hbCBpbnQzMiBmcm9tID0gMTE7Ci0gIG9wdGlvbmFsIGludDMyIGhhbmRsZV91bmludGVycHJldGVkID0gMTI7Ci0gIHJlcGVhdGVkIGludDMyIGluZGV4ID0gMTM7Ci0gIG9wdGlvbmFsIGludDMyIGNvbnRyb2xsZXIgPSAxNDsKLSAgb3B0aW9uYWwgaW50MzIgYWxyZWFkeV9oZXJlID0gMTU7Ci0KLSAgb3B0aW9uYWwgdWludDMyIHVpbnQzMiA9IDE2OwotICBvcHRpb25hbCB1aW50NjQgdWludDY0ID0gMTc7Ci0gIG9wdGlvbmFsIHN0cmluZyBzdHJpbmcgPSAxODsKLSAgb3B0aW9uYWwgaW50MzIgbWVtc2V0ID0gMTk7Ci0gIG9wdGlvbmFsIGludDMyIGludDMyID0gMjA7Ci0gIG9wdGlvbmFsIGludDY0IGludDY0ID0gMjE7Ci0KLSAgb3B0aW9uYWwgdWludDMyIGNhY2hlZF9zaXplID0gMjI7Ci0gIG9wdGlvbmFsIHVpbnQzMiBleHRlbnNpb25zID0gMjM7Ci0gIG9wdGlvbmFsIHVpbnQzMiBiaXQgPSAyNDsKLSAgb3B0aW9uYWwgdWludDMyIGJpdHMgPSAyNTsKLSAgb3B0aW9uYWwgdWludDMyIG9mZnNldHMgPSAyNjsKLSAgb3B0aW9uYWwgdWludDMyIHJlZmxlY3Rpb24gPSAyNzsKLQotICBtZXNzYWdlIENvcmQge30KLSAgb3B0aW9uYWwgc3RyaW5nIHNvbWVfY29yZCA9IDI4IFtjdHlwZT1DT1JEXTsKLQotICBtZXNzYWdlIFN0cmluZ1BpZWNlIHt9Ci0gIG9wdGlvbmFsIHN0cmluZyBzb21lX3N0cmluZ19waWVjZSA9IDI5IFtjdHlwZT1TVFJJTkdfUElFQ0VdOwotCi0gIC8vIFNvbWUga2V5d29yZHMuCi0gIG9wdGlvbmFsIHVpbnQzMiBpbnQgPSAzMDsKLSAgb3B0aW9uYWwgdWludDMyIGZyaWVuZCA9IDMxOwotICBvcHRpb25hbCB1aW50MzIgY2xhc3MgPSAzNzsKLSAgb3B0aW9uYWwgdWludDMyIHR5cGVkZWNsID0gMzk7Ci0gIG9wdGlvbmFsIHVpbnQzMiBhdXRvID0gNDA7Ci0KLSAgLy8gVGhlIGdlbmVyYXRvciB1c2VkIHRvICNkZWZpbmUgYSBtYWNybyBjYWxsZWQgIkRPIiBpbnNpZGUgdGhlIC5jYyBmaWxlLgotICBtZXNzYWdlIERPIHt9Ci0gIG9wdGlvbmFsIERPIGRvID0gMzI7Ci0KLSAgLy8gU29tZSB0ZW1wbGF0ZSBwYXJhbWV0ZXIgbmFtZXMgZm9yIGV4dGVuc2lvbnMuCi0gIG9wdGlvbmFsIGludDMyIGZpZWxkX3R5cGUgPSAzMzsKLSAgb3B0aW9uYWwgYm9vbCBpc19wYWNrZWQgPSAzNDsKLQotICAvLyB0ZXN0IGNvbmZsaWN0aW5nIHJlbGVhc2VfJG5hbWUkLiAibGVuZ3RoIiBhbmQgImRvIiBmaWVsZCBpbiB0aGlzIG1lc3NhZ2UKLSAgLy8gbXVzdCByZW1haW4gc3RyaW5nIG9yIG1lc3NhZ2UgZmllbGRzIHRvIG1ha2UgdGhlIHRlc3QgdmFsaWQuCi0gIG9wdGlvbmFsIHN0cmluZyByZWxlYXNlX2xlbmd0aCA9IDM1OwotICAvLyBBIG1vcmUgZXh0cmVtZSBjYXNlLCB0aGUgZmllbGQgbmFtZSAiZG8iIGhlcmUgaXMgYSBrZXl3b3JkLCB3aGljaCB3aWxsIGJlCi0gIC8vIGVzY2FwZWQgdG8gImRvXyIgYWxyZWFkeS4gVGVzdCB0aGVyZSBpcyBubyBjb25mbGljdCBldmVuIHdpdGggZXNjYXBlZCBmaWVsZAotICAvLyBuYW1lcy4KLSAgb3B0aW9uYWwgRE8gcmVsZWFzZV9kbyA9IDM2OwotCi0gIC8vIEZvciBjbGFzaGluZyBsb2NhbCB2YXJpYWJsZXMgaW4gU2VyaWFsaXplIGFuZCBCeXRlU2l6ZSBjYWxjdWxhdGlvbi4KLSAgb3B0aW9uYWwgc3RyaW5nIHRhcmdldCA9IDM4OwotCi0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7ICAvLyBOT19QUk9UTzMKLX0KLQotbWVzc2FnZSBUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lc0V4dGVuc2lvbiB7ICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKLSAgZXh0ZW5kIFRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCi0gICAgcmVwZWF0ZWQgaW50MzIgcmVwZWF0ZWRfaW50MzJfZXh0ID0gMjA0MjM2MzggW3BhY2tlZD10cnVlXTsgIC8vIE5PX1BST1RPMwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCi0KLW1lc3NhZ2UgVGVzdENvbmZsaWN0aW5nRW51bU5hbWVzIHsgIC8vIE5PX1BST1RPMwotICBlbnVtIE5lc3RlZENvbmZsaWN0aW5nRW51bSB7ICAgICAgLy8gTk9fUFJPVE8zCi0gICAgYW5kID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKLSAgICBjbGFzcyA9IDI7ICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMwotICAgIGludCA9IDM7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCi0gICAgdHlwZWRlZiA9IDQ7ICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKLSAgICBYT1IgPSA1OyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMwotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCi0KLSAgb3B0aW9uYWwgTmVzdGVkQ29uZmxpY3RpbmdFbnVtIGNvbmZsaWN0aW5nX2VudW0gPSAxOyAgLy8gTk9fUFJPVE8zCi19ICAvLyBOT19QUk9UTzMKLQotZW51bSBDb25mbGljdGluZ0VudW0geyAgLy8gTk9fUFJPVE8zCi0gIE5PVF9FUSA9IDE7ICAgICAgICAgICAvLyBOT19QUk9UTzMKLSAgdm9sYXRpbGUgPSAyOyAgICAgICAgIC8vIE5PX1BST1RPMwotICByZXR1cm4gPSAzOyAgICAgICAgICAgLy8gTk9fUFJPVE8zCi19ICAvLyBOT19QUk9UTzMKLQotbWVzc2FnZSBEdW1teU1lc3NhZ2Uge30KLQotc2VydmljZSBUZXN0Q29uZmxpY3RpbmdNZXRob2ROYW1lcyB7Ci0gIHJwYyBDbG9zdXJlKER1bW15TWVzc2FnZSkgcmV0dXJucyAoRHVtbXlNZXNzYWdlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWQ4Mjk0Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyMTM5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUbyB0ZXN0IHRoZSBjb2RlIGdlbmVyYXRvciwgd2UgYWN0dWFsbHkgdXNlIGl0IHRvIGdlbmVyYXRlIGNvZGUgZm9yCi0vLyBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8sIHRoZW4gdGVzdCB0aGF0LiAgVGhpcyBtZWFucyB0aGF0IHdlCi0vLyBhcmUgYWN0dWFsbHkgdGVzdGluZyB0aGUgcGFyc2VyIGFuZCBvdGhlciBwYXJ0cyBvZiB0aGUgc3lzdGVtIGF0IHRoZSBzYW1lCi0vLyB0aW1lLCBhbmQgdGhhdCBwcm9ibGVtcyBpbiB0aGUgZ2VuZXJhdG9yIG1heSBzaG93IHVwIGFzIGNvbXBpbGUtdGltZSBlcnJvcnMKLS8vIHJhdGhlciB0aGFuIHVuaXR0ZXN0IGZhaWx1cmVzLCB3aGljaCBtYXkgYmUgc3VycHJpc2luZy4gIEhvd2V2ZXIsIHRlc3RpbmcKLS8vIHRoZSBvdXRwdXQgb2YgdGhlIEMrKyBnZW5lcmF0b3IgZGlyZWN0bHkgd291bGQgYmUgdmVyeSBoYXJkLiAgV2UgY2FuJ3QgdmVyeQotLy8gd2VsbCBqdXN0IGNoZWNrIGl0IGFnYWluc3QgZ29sZGVuIGZpbGVzIHNpbmNlIHRob3NlIGZpbGVzIHdvdWxkIGhhdmUgdG8gYmUKLS8vIHVwZGF0ZWQgZm9yIGFueSBzbWFsbCBjaGFuZ2U7IHN1Y2ggYSB0ZXN0IHdvdWxkIGJlIHZlcnkgYnJpdHRsZSBhbmQgcHJvYmFibHkKLS8vIG5vdCB2ZXJ5IGhlbHBmdWwuICBXaGF0IHdlIHJlYWxseSB3YW50IHRvIHRlc3QgaXMgdGhhdCB0aGUgY29kZSBjb21waWxlcwotLy8gY29ycmVjdGx5IGFuZCBwcm9kdWNlcyB0aGUgaW50ZXJmYWNlcyB3ZSBleHBlY3QsIHdoaWNoIGlzIHdoeSB0aGlzIHRlc3QKLS8vIGlzIHdyaXR0ZW4gdGhpcyB3YXkuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmg+Ci0jaWYgIWRlZmluZWQoR09PR0xFX1BST1RPQlVGX0NNQUtFX0JVSUxEKSAmJiAhZGVmaW5lZChfTVNDX1ZFUikKLS8vIFdlIGV4Y2x1ZGUgdGhpcyBsYXJnZSBwcm90byBmcm9tIGNtYWtlIGJ1aWxkIGJlY2F1c2UgaXQncyB0b28gbGFyZ2UgZm9yCi0vLyB2aXN1YWwgc3R1ZGlvIHRvIGNvbXBpbGUgKHJlcG9ydCBpbnRlcm5hbCBlcnJvcnMpLgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgY3BwIHsKLQotLy8gQ2FuJ3QgdXNlIGFuIGFub255bW91cyBuYW1lc3BhY2UgaGVyZSBkdWUgdG8gYnJva2VubmVzcyBvZiBUcnU2NCBjb21waWxlci4KLW5hbWVzcGFjZSBjcHBfdW5pdHRlc3QgewotCi1uYW1lc3BhY2UgcHJvdG9idWZfdW5pdHRlc3QgPSA6OnByb3RvYnVmX3VuaXR0ZXN0OwotCi0KLWNsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciB7Ci0gcHVibGljOgotICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkge30KLQotICBzdHJpbmcgdGV4dF87Ci0KLSAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotICB9Ci19OwotCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLQotLy8gVGVzdCB0aGF0IGdlbmVyYXRlZCBjb2RlIGhhcyBwcm9wZXIgZGVzY3JpcHRvcnM6Ci0vLyBQYXJzZSBhIGRlc2NyaXB0b3IgZGlyZWN0bHkgKHVzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpJbXBvcnRlcikgYW5kCi0vLyBjb21wYXJlIGl0IHRvIHRoZSBvbmUgdGhhdCB3YXMgcHJvZHVjZWQgYnkgZ2VuZXJhdGVkIGNvZGUuCi1URVNUKEdlbmVyYXRlZERlc2NyaXB0b3JUZXN0LCBJZGVudGljYWxEZXNjcmlwdG9ycykgewotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZ2VuZXJhdGVkX2Rlc2NyaXB0b3IgPQotICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOwotCi0gIC8vIFNldCB1cCB0aGUgSW1wb3J0ZXIuCi0gIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7Ci0gIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlOwotICBzb3VyY2VfdHJlZS5NYXBQYXRoKCIiLCBUZXN0U291cmNlRGlyKCkpOwotICBJbXBvcnRlciBpbXBvcnRlcigmc291cmNlX3RyZWUsICZlcnJvcl9jb2xsZWN0b3IpOwotCi0gIC8vIEltcG9ydCAocGFyc2UpIHVuaXR0ZXN0LnByb3RvLgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGFyc2VkX2Rlc2NyaXB0b3IgPQotICAgIGltcG9ydGVyLkltcG9ydCgiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIik7Ci0gIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKLSAgQVNTRVJUX1RSVUUocGFyc2VkX2Rlc2NyaXB0b3IgIT0gTlVMTCk7Ci0KLSAgLy8gVGVzdCB0aGF0IGRlc2NyaXB0b3JzIGFyZSBnZW5lcmF0ZWQgY29ycmVjdGx5IGJ5IGNvbnZlcnRpbmcgdGhlbSB0bwotICAvLyBGaWxlRGVzY3JpcHRvclByb3RvcyBhbmQgY29tcGFyaW5nLgotICBGaWxlRGVzY3JpcHRvclByb3RvIGdlbmVyYXRlZF9kZWNzcmlwdG9yX3Byb3RvLCBwYXJzZWRfZGVzY3JpcHRvcl9wcm90bzsKLSAgZ2VuZXJhdGVkX2Rlc2NyaXB0b3ItPkNvcHlUbygmZ2VuZXJhdGVkX2RlY3NyaXB0b3JfcHJvdG8pOwotICBwYXJzZWRfZGVzY3JpcHRvci0+Q29weVRvKCZwYXJzZWRfZGVzY3JpcHRvcl9wcm90byk7Ci0KLSAgRVhQRUNUX0VRKHBhcnNlZF9kZXNjcmlwdG9yX3Byb3RvLkRlYnVnU3RyaW5nKCksCi0gICAgICAgICAgICBnZW5lcmF0ZWRfZGVjc3JpcHRvcl9wcm90by5EZWJ1Z1N0cmluZygpKTsKLX0KLQotI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9DTUFLRV9CVUlMRCkgJiYgIWRlZmluZWQoX01TQ19WRVIpCi0vLyBUZXN0IHRoYXQgZ2VuZXJhdGVkIGNvZGUgaGFzIHByb3BlciBkZXNjcmlwdG9yczoKLS8vIFRvdWNoIGEgZGVzY3JpcHRvciBnZW5lcmF0ZWQgZnJvbSBhbiBlbm9ybW91cyBtZXNzYWdlIHRvIHZhbGlkYXRlIHNwZWNpYWwKLS8vIGhhbmRsaW5nIGZvciBkZXNjcmlwdG9ycyBleGNlZWRpbmcgdGhlIEMrKyBzdGFuZGFyZCdzIHJlY29tbWVuZGVkIG1pbmltdW0KLS8vIGxpbWl0IGZvciBzdHJpbmcgbGl0ZXJhbCBzaXplCi1URVNUKEdlbmVyYXRlZERlc2NyaXB0b3JUZXN0LCBFbm9ybW91c0Rlc2NyaXB0b3IpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZ2VuZXJhdGVkX2Rlc2NyaXB0b3IgPQotICAgIFRlc3RFbm9ybW91c0Rlc2NyaXB0b3I6OmRlc2NyaXB0b3IoKTsKLQotICBFWFBFQ1RfVFJVRShnZW5lcmF0ZWRfZGVzY3JpcHRvciAhPSBOVUxMKTsKLX0KLSNlbmRpZgotCi0jZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRGVmYXVsdHMpIHsKLSAgLy8gQ2hlY2sgdGhhdCBhbGwgZGVmYXVsdCB2YWx1ZXMgYXJlIHNldCBjb3JyZWN0bHkgaW4gdGhlIGluaXRpYWwgbWVzc2FnZS4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKLQotICAvLyBNZXNzYWdlcyBzaG91bGQgcmV0dXJuIHBvaW50ZXJzIHRvIGRlZmF1bHQgaW5zdGFuY2VzIHVudGlsIGZpcnN0IHVzZS4KLSAgLy8gKFRoaXMgaXMgbm90IGNoZWNrZWQgYnkgRXhwZWN0Q2xlYXIoKSBzaW5jZSBpdCBpcyBub3QgYWN0dWFsbHkgdHJ1ZSBhZnRlcgotICAvLyB0aGUgZmllbGRzIGhhdmUgYmVlbiBzZXQgYW5kIHRoZW4gY2xlYXJlZC4pCi0gIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxncm91cCgpKTsKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOwotfQotCi0jaWZuZGVmIFBST1RPQlVGX1VTRV9ETExTCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBJbnQzMlN0cmluZ0NvbnZlcnNpb24pIHsKLSAgRVhQRUNUX0VRKCI5NzEiLCBJbnQzMlRvU3RyaW5nKDk3MSkpOwotICBFWFBFQ1RfRVEoIih+MHg3ZmZmZmZmZikiLCBJbnQzMlRvU3RyaW5nKGtpbnQzMm1pbikpOwotICBFWFBFQ1RfRVEoIjIxNDc0ODM2NDciLCBJbnQzMlRvU3RyaW5nKGtpbnQzMm1heCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBJbnQ2NFN0cmluZ0NvbnZlcnNpb24pIHsKLSAgRVhQRUNUX0VRKCJHT09HTEVfTE9OR0xPTkcoOTcxKSIsIEludDY0VG9TdHJpbmcoOTcxKSk7Ci0gIEVYUEVDVF9FUSgiR09PR0xFX0xPTkdMT05HKC0yMTQ3NDgzNjQ4KSIsIEludDY0VG9TdHJpbmcoa2ludDMybWluKSk7Ci0gIEVYUEVDVF9FUSgiR09PR0xFX0xPTkdMT05HKH4weDdmZmZmZmZmZmZmZmZmZmYpIiwgSW50NjRUb1N0cmluZyhraW50NjRtaW4pKTsKLSAgRVhQRUNUX0VRKCJHT09HTEVfTE9OR0xPTkcoOTIyMzM3MjAzNjg1NDc3NTgwNykiLCBJbnQ2NFRvU3RyaW5nKGtpbnQ2NG1heCkpOwotfQotI2VuZGlmICAvLyAhUFJPVE9CVUZfVVNFX0RMTFMKLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRmxvYXRpbmdQb2ludERlZmF1bHRzKSB7Ci0gIGNvbnN0IHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMmIGV4dHJlbWVfZGVmYXVsdCA9Ci0gICAgICB1bml0dGVzdDo6VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgRVhQRUNUX0VRKDAuMGYsIGV4dHJlbWVfZGVmYXVsdC56ZXJvX2Zsb2F0KCkpOwotICBFWFBFQ1RfRVEoMS4wZiwgZXh0cmVtZV9kZWZhdWx0Lm9uZV9mbG9hdCgpKTsKLSAgRVhQRUNUX0VRKDEuNWYsIGV4dHJlbWVfZGVmYXVsdC5zbWFsbF9mbG9hdCgpKTsKLSAgRVhQRUNUX0VRKC0xLjBmLCBleHRyZW1lX2RlZmF1bHQubmVnYXRpdmVfb25lX2Zsb2F0KCkpOwotICBFWFBFQ1RfRVEoLTEuNWYsIGV4dHJlbWVfZGVmYXVsdC5uZWdhdGl2ZV9mbG9hdCgpKTsKLSAgRVhQRUNUX0VRKDIuMGU4ZiwgZXh0cmVtZV9kZWZhdWx0LmxhcmdlX2Zsb2F0KCkpOwotICBFWFBFQ1RfRVEoLThlLTI4ZiwgZXh0cmVtZV9kZWZhdWx0LnNtYWxsX25lZ2F0aXZlX2Zsb2F0KCkpOwotICBFWFBFQ1RfRVEobnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSwKLSAgICAgICAgICAgIGV4dHJlbWVfZGVmYXVsdC5pbmZfZG91YmxlKCkpOwotICBFWFBFQ1RfRVEoLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCksCi0gICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQubmVnX2luZl9kb3VibGUoKSk7Ci0gIEVYUEVDVF9UUlVFKGV4dHJlbWVfZGVmYXVsdC5uYW5fZG91YmxlKCkgIT0gZXh0cmVtZV9kZWZhdWx0Lm5hbl9kb3VibGUoKSk7Ci0gIEVYUEVDVF9FUShudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCksCi0gICAgICAgICAgICBleHRyZW1lX2RlZmF1bHQuaW5mX2Zsb2F0KCkpOwotICBFWFBFQ1RfRVEoLW51bWVyaWNfbGltaXRzPGZsb2F0Pjo6aW5maW5pdHkoKSwKLSAgICAgICAgICAgIGV4dHJlbWVfZGVmYXVsdC5uZWdfaW5mX2Zsb2F0KCkpOwotICBFWFBFQ1RfVFJVRShleHRyZW1lX2RlZmF1bHQubmFuX2Zsb2F0KCkgIT0gZXh0cmVtZV9kZWZhdWx0Lm5hbl9mbG9hdCgpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgVHJpZ3JhcGgpIHsKLSAgY29uc3QgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyYgZXh0cmVtZV9kZWZhdWx0ID0KLSAgICAgIHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICBFWFBFQ1RfRVEoIj8gPyA/PyA/PyA/Pz8gP1w/LyA/XD8tIiwgZXh0cmVtZV9kZWZhdWx0LmNwcF90cmlncmFwaCgpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRXh0cmVtZVNtYWxsSW50ZWdlckRlZmF1bHQpIHsKLSAgY29uc3QgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyYgZXh0cmVtZV9kZWZhdWx0ID0KLSAgICAgIHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgRVhQRUNUX0VRKH4weDdmZmZmZmZmLCBraW50MzJtaW4pOwotICBFWFBFQ1RfRVEoR09PR0xFX0xPTkdMT05HKH4weDdmZmZmZmZmZmZmZmZmZmYpLCBraW50NjRtaW4pOwotICBFWFBFQ1RfRVEoa2ludDMybWluLCBleHRyZW1lX2RlZmF1bHQucmVhbGx5X3NtYWxsX2ludDMyKCkpOwotICBFWFBFQ1RfRVEoa2ludDY0bWluLCBleHRyZW1lX2RlZmF1bHQucmVhbGx5X3NtYWxsX2ludDY0KCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBBY2Nlc3NvcnMpIHsKLSAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gZ28gYmFjayBhbmQgY2hlY2sgYWxsIHRob3NlCi0gIC8vIHZhbHVlcy4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOwotCi0gIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEZpZWxkcygmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBNdXRhYmxlU3RyaW5nRGVmYXVsdCkgewotICAvLyBtdXRhYmxlX2ZvbygpIGZvciBhIHN0cmluZyBzaG91bGQgcmV0dXJuIGEgc3RyaW5nIGluaXRpYWxpemVkIHRvIGl0cwotICAvLyBkZWZhdWx0IHZhbHVlLgotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0KLSAgRVhQRUNUX0VRKCJoZWxsbyIsICptZXNzYWdlLm11dGFibGVfZGVmYXVsdF9zdHJpbmcoKSk7Ci0KLSAgLy8gTm90ZSB0aGF0IHRoZSBmaXJzdCB0aW1lIHdlIGNhbGwgbXV0YWJsZV9mb28oKSwgd2UgZ2V0IGEgbmV3bHktYWxsb2NhdGVkCi0gIC8vIHN0cmluZywgYnV0IGlmIHdlIGNsZWFyIGl0IGFuZCBjYWxsIGl0IGFnYWluLCB3ZSBnZXQgdGhlIHNhbWUgb2JqZWN0IGFnYWluLgotICAvLyBXZSBzaG91bGQgdmVyaWZ5IHRoYXQgaXQgaGFzIGl0cyBkZWZhdWx0IHZhbHVlIGluIGJvdGggY2FzZXMuCi0gIG1lc3NhZ2Uuc2V0X2RlZmF1bHRfc3RyaW5nKCJibGFoIik7Ci0gIG1lc3NhZ2UuQ2xlYXIoKTsKLQotICBFWFBFQ1RfRVEoImhlbGxvIiwgKm1lc3NhZ2UubXV0YWJsZV9kZWZhdWx0X3N0cmluZygpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3RyaW5nRGVmYXVsdHMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBtZXNzYWdlOwotICAvLyBDaGVjayBpZiAnXDAwMCcgY2FuIGJlIHVzZWQgaW4gZGVmYXVsdCBzdHJpbmcgdmFsdWUuCi0gIEVYUEVDVF9FUShzdHJpbmcoImhlbFwwMDBsbyIsIDYpLCBtZXNzYWdlLnN0cmluZ193aXRoX3plcm8oKSk7Ci0gIEVYUEVDVF9FUShzdHJpbmcoIndvclwwMDBsZCIsIDYpLCBtZXNzYWdlLmJ5dGVzX3dpdGhfemVybygpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVsZWFzZVN0cmluZykgewotICAvLyBDaGVjayB0aGF0IHJlbGVhc2VfZm9vKCkgc3RhcnRzIG91dCBOVUxMLCBhbmQgZ2l2ZXMgdXMgYSB2YWx1ZQotICAvLyB0aGF0IHdlIGNhbiBkZWxldGUgYWZ0ZXIgaXQncyBiZWVuIHNldC4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotCi0gIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2VfZGVmYXVsdF9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3N0cmluZygpKTsKLSAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcoKSk7Ci0KLSAgbWVzc2FnZS5zZXRfZGVmYXVsdF9zdHJpbmcoImJsYWgiKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8c3RyaW5nPiBzdHIobWVzc2FnZS5yZWxlYXNlX2RlZmF1bHRfc3RyaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7Ci0gIEFTU0VSVF9UUlVFKHN0ciAhPSBOVUxMKTsKLSAgRVhQRUNUX0VRKCJibGFoIiwgKnN0cik7Ci0KLSAgRVhQRUNUX0VRKE5VTEwsIG1lc3NhZ2UucmVsZWFzZV9kZWZhdWx0X3N0cmluZygpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5kZWZhdWx0X3N0cmluZygpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVsZWFzZU1lc3NhZ2UpIHsKLSAgLy8gQ2hlY2sgdGhhdCByZWxlYXNlX2ZvbygpIHN0YXJ0cyBvdXQgTlVMTCwgYW5kIGdpdmVzIHVzIGEgdmFsdWUKLSAgLy8gdGhhdCB3ZSBjYW4gZGVsZXRlIGFmdGVyIGl0J3MgYmVlbiBzZXQuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Ci0KLSAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlPiBuZXN0KAotICAgICAgbWVzc2FnZS5yZWxlYXNlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Ci0gIEFTU0VSVF9UUlVFKG5lc3QgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgxLCBuZXN0LT5iYigpKTsKLQotICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFNldEFsbG9jYXRlZFN0cmluZykgewotICAvLyBDaGVjayB0aGF0IHNldF9hbGxvY2F0ZWRfZm9vKCkgd29ya3MgZm9yIHN0cmluZ3MuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOwotICBjb25zdCBzdHJpbmcga0hlbGxvKCJoZWxsbyIpOwotICBtZXNzYWdlLnNldF9vcHRpb25hbF9zdHJpbmcoa0hlbGxvKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOwotCi0gIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9vcHRpb25hbF9zdHJpbmcoTlVMTCk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7Ci0KLSAgbWVzc2FnZS5zZXRfYWxsb2NhdGVkX29wdGlvbmFsX3N0cmluZyhuZXcgc3RyaW5nKGtIZWxsbykpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShrSGVsbG8sIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBTZXRBbGxvY2F0ZWRNZXNzYWdlKSB7Ci0gIC8vIENoZWNrIHRoYXQgc2V0X2FsbG9jYXRlZF9mb28oKSBjYW4gYmUgY2FsbGVkIGluIGFsbCBjYXNlcy4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKLQotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKLQotICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoTlVMTCk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKLQotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEpOwotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBuZXN0ID0KLSAgICAgIG1lc3NhZ2UucmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOwotICBBU1NFUlRfVFJVRShuZXN0ICE9IE5VTEwpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Ci0KLSAgbWVzc2FnZS5zZXRfYWxsb2NhdGVkX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKG5lc3QpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ2xlYXIpIHsKLSAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlLCBjbGVhciB0aGUgbWVzc2FnZSwgdGhlbiBjaGVjayB0aGF0Ci0gIC8vIGl0IGlzIGNsZWFyZWQuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKLSAgbWVzc2FnZS5DbGVhcigpOwotICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7Ci0KLSAgLy8gVW5saWtlIHdpdGggdGhlIGRlZmF1bHRzIHRlc3QsIHdlIGRvIE5PVCBleHBlY3QgdGhhdCByZXF1ZXN0aW5nIGVtYmVkZGVkCi0gIC8vIG1lc3NhZ2VzIHdpbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZGVmYXVsdCBpbnN0YW5jZS4gIEluc3RlYWQsIHRoZXkKLSAgLy8gc2hvdWxkIHJldHVybiB0aGUgb2JqZWN0cyB0aGF0IHdlcmUgY3JlYXRlZCB3aGVuIG11dGFibGVfYmxhaCgpIHdhcwotICAvLyBjYWxsZWQuCi0gIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxncm91cCgpKTsKLSAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX05FKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKLSAgRVhQRUNUX05FKCZ1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBFbWJlZGRlZE51bGxzSW5CeXRlc0NoYXJTdGFyKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBjb25zdCBjaGFyKiB2YWx1ZSA9ICJcMGxhbGFsYVwwXDAiOwotICBtZXNzYWdlLnNldF9vcHRpb25hbF9ieXRlcyh2YWx1ZSwgOSk7Ci0gIEFTU0VSVF9FUSg5LCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzKCkuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcCh2YWx1ZSwgbWVzc2FnZS5vcHRpb25hbF9ieXRlcygpLmRhdGEoKSwgOSkpOwotCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2J5dGVzKHZhbHVlLCA5KTsKLSAgQVNTRVJUX0VRKDksIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMoMCkuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcCh2YWx1ZSwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcygwKS5kYXRhKCksIDkpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ2xlYXJPbmVGaWVsZCkgewotICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUsIHRoZW4gY2xlYXIgb25lIHZhbHVlIGFuZCBpbnN1cmUgdGhhdAotICAvLyBvbmx5IHRoYXQgb25lIHZhbHVlIGlzIGNsZWFyZWQuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKLSAgaW50NjQgb3JpZ2luYWxfdmFsdWUgPSBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KCk7Ci0KLSAgLy8gQ2xlYXIgdGhlIGZpZWxkIGFuZCBtYWtlIHN1cmUgaXQgc2hvd3MgdXAgYXMgY2xlYXJlZC4KLSAgbWVzc2FnZS5jbGVhcl9vcHRpb25hbF9pbnQ2NCgpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50NjQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KCkpOwotCi0gIC8vIE90aGVyIGFkamFjZW50IGZpZWxkcyBzaG91bGQgbm90IGJlIGNsZWFyZWQuCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50MzIoKSk7Ci0KLSAgLy8gTWFrZSBzdXJlIGlmIHdlIHNldCBpdCBhZ2FpbiwgdGhlbiBhbGwgZmllbGRzIGFyZSBzZXQuCi0gIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDY0KG9yaWdpbmFsX3ZhbHVlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3RyaW5nQ2hhclN0YXJMZW5ndGgpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHVzZSBhIGNoYXIqLGxlbmd0aCB0byBzZXQgb25lIG9mIHRoZSBzdHJpbmcgZmllbGRzLgotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0gIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZygiYWJjZGVmIiwgMyk7Ci0gIEVYUEVDVF9FUSgiYWJjIiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIHVzZSBhIGNoYXIqLGxlbmd0aCB0byBhZGQgdG8gYSByZXBlYXRlZCBzdHJpbmcgZmllbGQuCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjZGVmIiwgMyk7Ci0gIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOwotICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKLQotICAvLyBWZXJpZnkgdGhhdCB3ZSBjYW4gdXNlIGEgY2hhciosbGVuZ3RoIHRvIHNldCBhIHJlcGVhdGVkIHN0cmluZyBmaWVsZC4KLSAgbWVzc2FnZS5zZXRfcmVwZWF0ZWRfc3RyaW5nKDAsICJ3eHl6IiwgMik7Ci0gIEVYUEVDVF9FUSgid3giLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZygwKSk7Ci19Ci0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ29weUZyb20pIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOwotICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwotCi0gIC8vIENvcHlpbmcgZnJvbSBzZWxmIHNob3VsZCBiZSBhIG5vLW9wLgotICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMik7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwotfQotCi0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFN3YXBXaXRoRW1wdHkpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKLQotICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UyKTsKLSAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLSAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UxKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3dhcFdpdGhTZWxmKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0gIG1lc3NhZ2UuU3dhcCgmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFN3YXBXaXRoT3RoZXIpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0KLSAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2ludDMyKDEyMyk7Ci0gIG1lc3NhZ2UxLnNldF9vcHRpb25hbF9zdHJpbmcoImFiYyIpOwotICBtZXNzYWdlMS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxKTsKLSAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7Ci0gIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9pbnQzMigxKTsKLSAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX2ludDMyKDIpOwotICBtZXNzYWdlMS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhIik7Ci0gIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9zdHJpbmcoImIiKTsKLSAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig3KTsKLSAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig4KTsKLSAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7Ci0gIG1lc3NhZ2UxLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOwotCi0gIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMig0NTYpOwotICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKCJkZWYiKTsKLSAgbWVzc2FnZTIubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMik7Ci0gIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOwotICBtZXNzYWdlMi5hZGRfcmVwZWF0ZWRfaW50MzIoMyk7Ci0gIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9zdHJpbmcoImMiKTsKLSAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig5KTsKLSAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7Ci0KLSAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOwotCi0gIEVYUEVDVF9FUSg0NTYsIG1lc3NhZ2UxLm9wdGlvbmFsX2ludDMyKCkpOwotICBFWFBFQ1RfRVEoImRlZiIsIG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDMsIG1lc3NhZ2UxLnJlcGVhdGVkX2ludDMyKDApKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UxLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOwotICBFWFBFQ1RfRVEoImMiLCBtZXNzYWdlMS5yZXBlYXRlZF9zdHJpbmcoMCkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDksIG1lc3NhZ2UxLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZTEucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOwotCi0gIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2UyLm9wdGlvbmFsX2ludDMyKCkpOwotICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UyLm9wdGlvbmFsX3N0cmluZygpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UyLm9wdGlvbmFsX25lc3RlZF9lbnVtKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDApKTsKLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDEpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOwotICBFWFBFQ1RfRVEoImEiLCBtZXNzYWdlMi5yZXBlYXRlZF9zdHJpbmcoMCkpOwotICBFWFBFQ1RfRVEoImIiLCBtZXNzYWdlMi5yZXBlYXRlZF9zdHJpbmcoMSkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDcsIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOwotICBFWFBFQ1RfRVEoOCwgbWVzc2FnZTIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlMi5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UyLnJlcGVhdGVkX25lc3RlZF9lbnVtKDEpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7Ci0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKLQotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UyKG1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIENvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOwotCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7Ci0gIG1lc3NhZ2UyID0gbWVzc2FnZTE7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGF0IHNlbGYtYXNzaWdubWVudCBkb2VzIHNvbWV0aGluZyBzYW5lLgotICBtZXNzYWdlMi5vcGVyYXRvcj0obWVzc2FnZTIpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLX0KLQotI2lmICFkZWZpbmVkKFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMpIHx8IFwKLSAgICAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSkKLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFVwY2FzdENvcHlGcm9tKSB7Ci0gIC8vIFRlc3QgdGhlIENvcHlGcm9tIG1ldGhvZCB0aGF0IHRha2VzIGluIHRoZSBnZW5lcmljIGNvbnN0IE1lc3NhZ2UmCi0gIC8vIHBhcmFtZXRlci4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTEpOwotCi0gIGNvbnN0IE1lc3NhZ2UqIHNvdXJjZSA9IGltcGxpY2l0X2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KCZtZXNzYWdlMSk7Ci0gIG1lc3NhZ2UyLkNvcHlGcm9tKCpzb3VyY2UpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwotfQotI2VuZGlmCi0KLSNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBEeW5hbWljTWVzc2FnZUNvcHlGcm9tKSB7Ci0gIC8vIFRlc3QgY29weWluZyBmcm9tIGEgRHluYW1pY01lc3NhZ2UsIHdoaWNoIG11c3QgZmFsbCBiYWNrIHRvIHVzaW5nCi0gIC8vIHJlZmxlY3Rpb24uCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IHZlcnNpb24gb2YgdGhlIGR5bmFtaWMgbWVzc2FnZSB2aWEgdGhlIGZhY3RvcnkuCi0gIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UxOwotICBtZXNzYWdlMS5yZXNldChmYWN0b3J5LkdldFByb3RvdHlwZSgKLSAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSktPk5ldygpKTsKLQotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKLSAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOwotICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UxLmdldCgpKTsKLQotICBtZXNzYWdlMi5Db3B5RnJvbSgqbWVzc2FnZTEpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwotfQotCi0jZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIE5vbkVtcHR5TWVyZ2VGcm9tKSB7Ci0gIC8vIFRlc3QgbWVyZ2luZyB3aXRoIGEgbm9uLWVtcHR5IG1lc3NhZ2UuIENvZGUgaXMgYSBtb2RpZmllZCBmb3JtCi0gIC8vIG9mIHRoYXQgZm91bmQgaW4gZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjLgotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7Ci0KLSAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCi0gIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMihtZXNzYWdlMS5vcHRpb25hbF9pbnQzMigpKTsKLSAgbWVzc2FnZTEuY2xlYXJfb3B0aW9uYWxfaW50MzIoKTsKLQotICAvLyBUaGlzIHRlc3RzIG92ZXJ3cml0aW5nLgotICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKLSAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX3N0cmluZygic29tZXRoaW5nIGVsc2UiKTsKLQotICAvLyBUaGlzIHRlc3RzIGNvbmNhdGVuYXRpbmcuCi0gIG1lc3NhZ2UyLmFkZF9yZXBlYXRlZF9pbnQzMihtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMigxKSk7Ci0gIGludDMyIGkgPSBtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMigwKTsKLSAgbWVzc2FnZTEuY2xlYXJfcmVwZWF0ZWRfaW50MzIoKTsKLSAgbWVzc2FnZTEuYWRkX3JlcGVhdGVkX2ludDMyKGkpOwotCi0gIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMSk7Ci19Ci0KLSNpZiAhZGVmaW5lZChQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTKSB8fCBcCi0gICAgIWRlZmluZWQoR09PR0xFX1BST1RPQlVGX05PX1JUVEkpCi0jaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgTWVyZ2VGcm9tU2VsZikgewotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0gIEVYUEVDVF9ERUFUSChtZXNzYWdlLk1lcmdlRnJvbShtZXNzYWdlKSwgIkNoZWNrIGZhaWxlZDouKnBiWy5dY2MiKTsKLSAgRVhQRUNUX0RFQVRIKG1lc3NhZ2UuTWVyZ2VGcm9tKGltcGxpY2l0X2Nhc3Q8Y29uc3QgTWVzc2FnZSY+KG1lc3NhZ2UpKSwKLSAgICAgICAgICAgICAgICJDaGVjayBmYWlsZWQ6LipwYlsuXWNjIik7Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLSNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMgfHwgIUdPT0dMRV9QUk9UT0JVRl9OT19SVFRJCi0KLS8vIFRlc3QgdGhlIGdlbmVyYXRlZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KCksCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBTZXJpYWxpemF0aW9uVG9BcnJheSkgewotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgc3RyaW5nIGRhdGE7Ci0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UxKTsKLSAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOwotICBkYXRhLnJlc2l6ZShzaXplKTsKLSAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOwotICB1aW50OCogZW5kID0gbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7Ci0gIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwotCi19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFBhY2tlZEZpZWxkc1NlcmlhbGl6YXRpb25Ub0FycmF5KSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgcGFja2VkX21lc3NhZ2UxLCBwYWNrZWRfbWVzc2FnZTI7Ci0gIHN0cmluZyBwYWNrZWRfZGF0YTsKLSAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmcGFja2VkX21lc3NhZ2UxKTsKLSAgaW50IHBhY2tlZF9zaXplID0gcGFja2VkX21lc3NhZ2UxLkJ5dGVTaXplKCk7Ci0gIHBhY2tlZF9kYXRhLnJlc2l6ZShwYWNrZWRfc2l6ZSk7Ci0gIHVpbnQ4KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJnBhY2tlZF9kYXRhKSk7Ci0gIHVpbnQ4KiBlbmQgPSBwYWNrZWRfbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7Ci0gIEVYUEVDVF9FUShwYWNrZWRfc2l6ZSwgZW5kIC0gc3RhcnQpOwotICBFWFBFQ1RfVFJVRShwYWNrZWRfbWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKHBhY2tlZF9kYXRhKSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQocGFja2VkX21lc3NhZ2UyKTsKLX0KLQotLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpIGJ5IGZvcmNpbmcgdGhlIGJ1ZmZlciB0byB3cml0ZQotLy8gb25lIGJ5dGUgYXQgYSB0aW1lLgotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7Ci0gIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKLSAgc3RyaW5nIGRhdGE7Ci0gIGRhdGEucmVzaXplKHNpemUpOwotICB7Ci0gICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgotICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7Ci0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKLSAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKLSAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci0KLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUGFja2VkRmllbGRzU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlMSk7Ci0gIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKLSAgc3RyaW5nIGRhdGE7Ci0gIGRhdGEucmVzaXplKHNpemUpOwotICB7Ci0gICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgotICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7Ci0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKLSAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKLSAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Ci19Ci0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVxdWlyZWQpIHsKLSAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Ci0gIG1lc3NhZ2Uuc2V0X2EoMSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Ci0gIG1lc3NhZ2Uuc2V0X2IoMik7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Ci0gIG1lc3NhZ2Uuc2V0X2MoMyk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVxdWlyZWRGb3JlaWduKSB7Ci0gIC8vIFRlc3QgdGhhdCBJc0luaXRpYWxpemVkKCkgcmV0dXJucyBmYWxzZSBpZiByZXF1aXJlZCBmaWVsZHMgaW4gbmVzdGVkCi0gIC8vIG1lc3NhZ2VzIGFyZSBtaXNzaW5nLgotICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkRm9yZWlnbiBtZXNzYWdlOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKLQotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotCi0gIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9hKDEpOwotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYigyKTsKLSAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2MoMyk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKLQotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9tZXNzYWdlKCk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX21lc3NhZ2UoMCktPnNldF9hKDEpOwotICBtZXNzYWdlLm11dGFibGVfcmVwZWF0ZWRfbWVzc2FnZSgwKS0+c2V0X2IoMik7Ci0gIG1lc3NhZ2UubXV0YWJsZV9yZXBlYXRlZF9tZXNzYWdlKDApLT5zZXRfYygzKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBGb3JlaWduTmVzdGVkKSB7Ci0gIC8vIFRlc3QgdGhhdCBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UgY2FuIGJlIGVtYmVkZGVkIGRpcmVjdGx5IGludG8KLSAgLy8gYW5vdGhlciBtZXNzYWdlLgotICB1bml0dGVzdDo6VGVzdEZvcmVpZ25OZXN0ZWQgbWVzc2FnZTsKLQotICAvLyBJZiB0aGlzIGNvbXBpbGVzIGFuZCBydW5zIHdpdGhvdXQgY3Jhc2hpbmcsIGl0IG11c3Qgd29yay4gIFdlIGhhdmUKLSAgLy8gbm90aGluZyBtb3JlIHRvIHRlc3QuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3RlZCA9Ci0gICAgbWVzc2FnZS5tdXRhYmxlX2ZvcmVpZ25fbmVzdGVkKCk7Ci0gIG5lc3RlZC0+c2V0X2JiKDEpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBSZWFsbHlMYXJnZVRhZ051bWJlcikgewotICAvLyBUZXN0IHRoYXQgcmVhbGx5IGxhcmdlIHRhZyBudW1iZXJzIGRvbid0IGJyZWFrIGFueXRoaW5nLgotICB1bml0dGVzdDo6VGVzdFJlYWxseUxhcmdlVGFnTnVtYmVyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgc3RyaW5nIGRhdGE7Ci0KLSAgLy8gRm9yIHRoZSBtb3N0IHBhcnQsIGlmIHRoaXMgY29tcGlsZXMgYW5kIHJ1bnMgdGhlbiB3ZSdyZSBwcm9iYWJseSBnb29kLgotICAvLyAoVGhlIG1vc3QgbGlrZWx5IGNhdXNlIGZvciBmYWlsdXJlIHdvdWxkIGJlIGlmIHNvbWV0aGluZyB3ZXJlIGF0dGVtcHRpbmcKLSAgLy8gdG8gYWxsb2NhdGUgYSBsb29rdXAgdGFibGUgb2Ygc29tZSBzb3J0IHVzaW5nIHRhZyBudW1iZXJzIGFzIHRoZSBpbmRleC4pCi0gIC8vIFdlJ2xsIHRyeSBzZXJpYWxpemluZyBqdXN0IGZvciBmdW4uCi0gIG1lc3NhZ2UxLnNldF9hKDEyMzQpOwotICBtZXNzYWdlMS5zZXRfYmIoNTY3OCk7Ci0gIG1lc3NhZ2UxLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgRVhQRUNUX0VRKDEyMzQsIG1lc3NhZ2UyLmEoKSk7Ci0gIEVYUEVDVF9FUSg1Njc4LCBtZXNzYWdlMi5iYigpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgTXV0dWFsUmVjdXJzaW9uKSB7Ci0gIC8vIFRlc3QgdGhhdCBtdXR1YWxseS1yZWN1cnNpdmUgbWVzc2FnZSB0eXBlcyB3b3JrLgotICB1bml0dGVzdDo6VGVzdE11dHVhbFJlY3Vyc2lvbkEgbWVzc2FnZTsKLSAgdW5pdHRlc3Q6OlRlc3RNdXR1YWxSZWN1cnNpb25BKiBuZXN0ZWQgPSBtZXNzYWdlLm11dGFibGVfYmIoKS0+bXV0YWJsZV9hKCk7Ci0gIHVuaXR0ZXN0OjpUZXN0TXV0dWFsUmVjdXJzaW9uQSogbmVzdGVkMiA9IG5lc3RlZC0+bXV0YWJsZV9iYigpLT5tdXRhYmxlX2EoKTsKLQotICAvLyBBZ2FpbiwgaWYgdGhlIGFib3ZlIGNvbXBpbGVzIGFuZCBydW5zLCB0aGF0J3MgYWxsIHdlIHJlYWxseSBoYXZlIHRvCi0gIC8vIHRlc3QsIGJ1dCBqdXN0IGZvciBydW4gd2UnbGwgY2hlY2sgdGhhdCB0aGUgc3lzdGVtIGRpZG4ndCBzb21laG93IGNvbWUKLSAgLy8gdXAgd2l0aCBhIHBvaW50ZXIgbG9vcC4uLgotICBFWFBFQ1RfTkUoJm1lc3NhZ2UsIG5lc3RlZCk7Ci0gIEVYUEVDVF9ORSgmbWVzc2FnZSwgbmVzdGVkMik7Ci0gIEVYUEVDVF9ORShuZXN0ZWQsIG5lc3RlZDIpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBDYW1lbENhc2VGaWVsZE5hbWVzKSB7Ci0gIC8vIFRoaXMgdGVzdCBpcyBtYWlubHkgY2hlY2tpbmcgdGhhdCB0aGUgZm9sbG93aW5nIGNvbXBpbGVzLCB3aGljaCB2ZXJpZmllcwotICAvLyB0aGF0IHRoZSBmaWVsZCBuYW1lcyB3ZXJlIGNvZXJjZWQgdG8gbG93ZXItY2FzZS4KLSAgLy8KLSAgLy8gUHJvdG9jb2wgYnVmZmVycyBzdGFuZGFyZCBzdHlsZSBpcyB0byB1c2UgbG93ZXJjYXNlLXdpdGgtdW5kZXJzY29yZXMgZm9yCi0gIC8vIGZpZWxkIG5hbWVzLiAgU29tZSBvbGQgcHJvdG8xIC5wcm90b3MgdW5mb3J0dW5hdGVseSB1c2VkIGNhbWVsLWNhc2UgZmllbGQKLSAgLy8gbmFtZXMuICBJbiBwcm90bzEsIHRoZXNlIG5hbWVzIHdlcmUgZm9yY2VkIHRvIGxvd2VyLWNhc2UuICBTbywgd2UgZG8gdGhlCi0gIC8vIHNhbWUgdGhpbmcgaW4gcHJvdG8yLgotCi0gIHVuaXR0ZXN0OjpUZXN0Q2FtZWxDYXNlRmllbGROYW1lcyBtZXNzYWdlOwotCi0gIG1lc3NhZ2Uuc2V0X3ByaW1pdGl2ZWZpZWxkKDIpOwotICBtZXNzYWdlLnNldF9zdHJpbmdmaWVsZCgiZm9vIik7Ci0gIG1lc3NhZ2Uuc2V0X2VudW1maWVsZCh1bml0dGVzdDo6Rk9SRUlHTl9GT08pOwotICBtZXNzYWdlLm11dGFibGVfbWVzc2FnZWZpZWxkKCktPnNldF9jKDYpOwotCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkcHJpbWl0aXZlZmllbGQoOCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkc3RyaW5nZmllbGQoInF1eCIpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZGVudW1maWVsZCh1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZG1lc3NhZ2VmaWVsZCgpLT5zZXRfYygxNSk7Ci0KLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UucHJpbWl0aXZlZmllbGQoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgbWVzc2FnZS5zdHJpbmdmaWVsZCgpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywgbWVzc2FnZS5lbnVtZmllbGQoKSk7Ci0gIEVYUEVDVF9FUSg2LCBtZXNzYWdlLm1lc3NhZ2VmaWVsZCgpLmMoKSk7Ci0KLSAgRVhQRUNUX0VRKDgsIG1lc3NhZ2UucmVwZWF0ZWRwcmltaXRpdmVmaWVsZCgwKSk7Ci0gIEVYUEVDVF9FUSgicXV4IiwgbWVzc2FnZS5yZXBlYXRlZHN0cmluZ2ZpZWxkKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5yZXBlYXRlZGVudW1maWVsZCgwKSk7Ci0gIEVYUEVDVF9FUSgxNSwgbWVzc2FnZS5yZXBlYXRlZG1lc3NhZ2VmaWVsZCgwKS5jKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lcykgewotICAvLyB0ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byBzdWNjZXNzZnVsbHkgY29tcGlsZWQsIHRoZW4gaXQgd29ya3MuICBUaGUKLSAgLy8gZm9sbG93aW5nIGlzIGp1c3QgYSB0b2tlbiB1c2FnZSB0byBpbnN1cmUgdGhhdCB0aGUgY29kZSBpcywgaW4gZmFjdCwKLSAgLy8gYmVpbmcgY29tcGlsZWQgYW5kIGxpbmtlZC4KLQotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXMgbWVzc2FnZTsKLSAgbWVzc2FnZS5zZXRfdWludDMyKDEpOwotICBFWFBFQ1RfRVEoMywgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKLQotICBtZXNzYWdlLnNldF9mcmllbmRfKDUpOwotICBFWFBFQ1RfRVEoNSwgbWVzc2FnZS5mcmllbmRfKCkpOwotCi0gIG1lc3NhZ2Uuc2V0X2NsYXNzXyg2KTsKLSAgRVhQRUNUX0VRKDYsIG1lc3NhZ2UuY2xhc3NfKCkpOwotCi0gIC8vIEluc3RhbnRpYXRlIGV4dGVuc2lvbiB0ZW1wbGF0ZSBmdW5jdGlvbnMgdG8gdGVzdCBjb25mbGljdGluZyB0ZW1wbGF0ZQotICAvLyBwYXJhbWV0ZXIgbmFtZXMuCi0gIHR5cGVkZWYgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RDb25mbGljdGluZ1N5bWJvbE5hbWVzRXh0ZW5zaW9uIEV4dGVuc2lvbk1lc3NhZ2U7Ci0gIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKEV4dGVuc2lvbk1lc3NhZ2U6OnJlcGVhdGVkX2ludDMyX2V4dCwgMTIzKTsKLSAgRVhQRUNUX0VRKDEyMywKLSAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKEV4dGVuc2lvbk1lc3NhZ2U6OnJlcGVhdGVkX2ludDMyX2V4dCwgMCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0Q29uZmxpY3RpbmdFbnVtTmFtZXMpIHsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RDb25mbGljdGluZ0VudW1OYW1lcyBtZXNzYWdlOwotICBtZXNzYWdlLnNldF9jb25mbGljdGluZ19lbnVtKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0Q29uZmxpY3RpbmdFbnVtTmFtZXNfTmVzdGVkQ29uZmxpY3RpbmdFbnVtX2FuZF8pOwotICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5jb25mbGljdGluZ19lbnVtKCkpOwotICBtZXNzYWdlLnNldF9jb25mbGljdGluZ19lbnVtKHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0Q29uZmxpY3RpbmdFbnVtTmFtZXNfTmVzdGVkQ29uZmxpY3RpbmdFbnVtX1hPUik7Ci0gIEVYUEVDVF9FUSg1LCBtZXNzYWdlLmNvbmZsaWN0aW5nX2VudW0oKSk7Ci0KLQotICBwcm90b2J1Zl91bml0dGVzdDo6Q29uZmxpY3RpbmdFbnVtIGNvbmZsaWN0aW5nX2VudW07Ci0gIGNvbmZsaWN0aW5nX2VudW0gPSBwcm90b2J1Zl91bml0dGVzdDo6Tk9UX0VROwotICBFWFBFQ1RfRVEoMSwgY29uZmxpY3RpbmdfZW51bSk7Ci0gIGNvbmZsaWN0aW5nX2VudW0gPSBwcm90b2J1Zl91bml0dGVzdDo6cmV0dXJuXzsKLSAgRVhQRUNUX0VRKDMsIGNvbmZsaWN0aW5nX2VudW0pOwotfQotCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgVGVzdE9wdGltaXplZEZvclNpemUpIHsKLSAgLy8gV2UgcmVseSBvbiB0aGUgdGVzdHMgaW4gcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QgYW5kIHdpcmVfZm9ybWF0X3VuaXR0ZXN0Ci0gIC8vIHRvIHJlYWxseSB0ZXN0IHRoYXQgcmVmbGVjdGlvbi1iYXNlZCBtZXRob2RzIHdvcmsuICBIZXJlIHdlIGFyZSBtb3N0bHkKLSAgLy8ganVzdCBtYWtpbmcgc3VyZSB0aGF0IFRlc3RPcHRpbWl6ZWRGb3JTaXplIGFjdHVhbGx5IGJ1aWxkcyBhbmQgc2VlbXMgdG8KLSAgLy8gZnVuY3Rpb24uCi0KLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RPcHRpbWl6ZWRGb3JTaXplIG1lc3NhZ2UsIG1lc3NhZ2UyOwotICBtZXNzYWdlLnNldF9pKDEpOwotICBtZXNzYWdlLm11dGFibGVfbXNnKCktPnNldF9jKDIpOwotICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLmkoKSk7Ci0gIEVYUEVDVF9FUSgyLCBtZXNzYWdlMi5tc2coKS5jKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0RW1iZWRPcHRpbWl6ZWRGb3JTaXplKSB7Ci0gIC8vIFZlcmlmaWVzIHRoYXQgc29tZXRoaW5nIG9wdGltaXplZCBmb3Igc3BlZWQgY2FuIGNvbnRhaW4gc29tZXRoaW5nIG9wdGltaXplZAotICAvLyBmb3Igc2l6ZS4KLQotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtYmVkT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlLCBtZXNzYWdlMjsKLSAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2koMSk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKS0+bXV0YWJsZV9tc2coKS0+c2V0X2MoMik7Ci0gIHN0cmluZyBkYXRhOwotICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLSAgQVNTRVJUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLm9wdGlvbmFsX21lc3NhZ2UoKS5pKCkpOwotICBFWFBFQ1RfRVEoMiwgbWVzc2FnZTIucmVwZWF0ZWRfbWVzc2FnZSgwKS5tc2coKS5jKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0U3BhY2VVc2VkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7Ci0gIC8vIHNpemVvZiBwcm92aWRlcyBhIGxvd2VyIGJvdW5kIG9uIFNwYWNlVXNlZCgpLgotICBFWFBFQ1RfTEUoc2l6ZW9mKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMpLCBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7Ci0gIGNvbnN0IGludCBlbXB0eV9tZXNzYWdlX3NpemUgPSBtZXNzYWdlMS5TcGFjZVVzZWQoKTsKLQotICAvLyBTZXR0aW5nIHByaW1pdGl2ZSB0eXBlcyBzaG91bGRuJ3QgYWZmZWN0IHRoZSBzcGFjZSB1c2VkLgotICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfaW50MzIoMTIzKTsKLSAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2ludDY0KDEyMzQ1KTsKLSAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX3VpbnQzMigxMjMpOwotICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfdWludDY0KDEyMzQ1KTsKLSAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2Vfc2l6ZSwgbWVzc2FnZTEuU3BhY2VVc2VkKCkpOwotCi0gIC8vIE9uIHNvbWUgU1RMIGltcGxlbWVudGF0aW9ucywgc2V0dGluZyB0aGUgc3RyaW5nIHRvIGEgc21hbGwgdmFsdWUgc2hvdWxkCi0gIC8vIG9ubHkgaW5jcmVhc2UgU3BhY2VVc2VkKCkgYnkgdGhlIHNpemUgb2YgYSBzdHJpbmcgb2JqZWN0LCB0aG91Z2ggdGhpcyBpcwotICAvLyBub3QgdHJ1ZSBldmVyeXdoZXJlLgotICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJhYmMiKTsKLSAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIHNpemVvZihzdHJpbmcpLCBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7Ci0KLSAgLy8gU2V0dGluZyBhIHN0cmluZyB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZiBzaG91bGQKLSAgLy8gaW5jcmVhc2UgU3BhY2VVc2VkKCksIGJlY2F1c2UgaXQgY2Fubm90IHN0b3JlIHRoZSB2YWx1ZSBpbnRlcm5hbGx5LgotICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfc3RyaW5nKHN0cmluZyhzaXplb2Yoc3RyaW5nKSArIDEsICd4JykpOwotICBpbnQgbWluX2V4cGVjdGVkX2luY3JlYXNlID0gbWVzc2FnZTEub3B0aW9uYWxfc3RyaW5nKCkuY2FwYWNpdHkoKSArCi0gICAgICBzaXplb2Yoc3RyaW5nKTsKLSAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIG1pbl9leHBlY3RlZF9pbmNyZWFzZSwKLSAgICAgICAgICAgIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKLQotICBpbnQgcHJldmlvdXNfc2l6ZSA9IG1lc3NhZ2UxLlNwYWNlVXNlZCgpOwotICAvLyBBZGRpbmcgYW4gb3B0aW9uYWwgbWVzc2FnZSBzaG91bGQgaW5jcmVhc2UgdGhlIHNpemUgYnkgdGhlIHNpemUgb2YgdGhlCi0gIC8vIG5lc3RlZCBtZXNzYWdlIHR5cGUuIE5lc3RlZE1lc3NhZ2UgaXMgc2ltcGxlIGVub3VnaCAoMSBpbnQgZmllbGQpIHRoYXQgaXQKLSAgLy8gaXMgZXF1YWwgdG8gc2l6ZW9mKE5lc3RlZE1lc3NhZ2UpCi0gIG1lc3NhZ2UxLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKLSAgQVNTRVJUX0VRKHNpemVvZih1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKSwKLSAgICAgICAgICAgIG1lc3NhZ2UxLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkuU3BhY2VVc2VkKCkpOwotICBFWFBFQ1RfRVEocHJldmlvdXNfc2l6ZSArCi0gICAgICAgICAgICBzaXplb2YodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSksCi0gICAgICAgICAgICBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFRlc3RPbmVvZlNwYWNlVXNlZCkgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMTsKLSAgRVhQRUNUX0xFKHNpemVvZih1bml0dGVzdDo6VGVzdE9uZW9mMiksIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKLQotICBjb25zdCBpbnQgZW1wdHlfbWVzc2FnZV9zaXplID0gbWVzc2FnZTEuU3BhY2VVc2VkKCk7Ci0gIC8vIFNldHRpbmcgcHJpbWl0aXZlIHR5cGVzIHNob3VsZG4ndCBhZmZlY3QgdGhlIHNwYWNlIHVzZWQuCi0gIG1lc3NhZ2UxLnNldF9mb29faW50KDEyMyk7Ci0gIG1lc3NhZ2UxLnNldF9iYXJfaW50KDEyMzQ1KTsKLSAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2Vfc2l6ZSwgbWVzc2FnZTEuU3BhY2VVc2VkKCkpOwotCi0gIC8vIFNldHRpbmcgYSBzdHJpbmcgaW4gb25lb2YgdG8gYSBzbWFsbCB2YWx1ZSBzaG91bGQgb25seSBpbmNyZWFzZSBTcGFjZVVzZWQoKQotICAvLyBieSB0aGUgc2l6ZSBvZiBhIHN0cmluZyBvYmplY3QuCi0gIG1lc3NhZ2UxLnNldF9mb29fc3RyaW5nKCJhYmMiKTsKLSAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIHNpemVvZihzdHJpbmcpLCBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7Ci0KLSAgLy8gU2V0dGluZyBhIHN0cmluZyBpbiBvbmVvZiB0byBhIHZhbHVlIGxhcmdlciB0aGFuIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZgotICAvLyBzaG91bGQgaW5jcmVhc2UgU3BhY2VVc2VkKCksIGJlY2F1c2UgaXQgY2Fubm90IHN0b3JlIHRoZSB2YWx1ZSBpbnRlcm5hbGx5LgotICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZyhzdHJpbmcoc2l6ZW9mKHN0cmluZykgKyAxLCAneCcpKTsKLSAgaW50IG1pbl9leHBlY3RlZF9pbmNyZWFzZSA9IG1lc3NhZ2UxLmZvb19zdHJpbmcoKS5jYXBhY2l0eSgpICsKLSAgICAgIHNpemVvZihzdHJpbmcpOwotICBFWFBFQ1RfTEUoZW1wdHlfbWVzc2FnZV9zaXplICsgbWluX2V4cGVjdGVkX2luY3JlYXNlLAotICAgICAgICAgICAgbWVzc2FnZTEuU3BhY2VVc2VkKCkpOwotCi0gIC8vIFNldHRpbmcgYSBtZXNzYWdlIGluIG9uZW9mIHNob3VsZCBkZWxldGUgdGhlIG90aGVyIGZpZWxkcyBhbmQgaW5jcmVhc2UgdGhlCi0gIC8vIHNpemUgYnkgdGhlIHNpemUgb2YgdGhlIG5lc3RlZCBtZXNzYWdlIHR5cGUuIE5lc3RlZE1lc3NhZ2UgaXMgc2ltcGxlIGVub3VnaAotICAvLyB0aGF0IGl0IGlzIGVxdWFsIHRvIHNpemVvZihOZXN0ZWRNZXNzYWdlKQotICBtZXNzYWdlMS5tdXRhYmxlX2Zvb19tZXNzYWdlKCk7Ci0gIEFTU0VSVF9FUShzaXplb2YodW5pdHRlc3Q6OlRlc3RPbmVvZjI6Ok5lc3RlZE1lc3NhZ2UpLAotICAgICAgICAgICAgbWVzc2FnZTEuZm9vX21lc3NhZ2UoKS5TcGFjZVVzZWQoKSk7Ci0gIEVYUEVDVF9FUShlbXB0eV9tZXNzYWdlX3NpemUgKwotICAgICAgICAgICAgc2l6ZW9mKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpOZXN0ZWRNZXNzYWdlKSwKLSAgICAgICAgICAgIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKLX0KLQotI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotCi0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIEZpZWxkQ29uc3RhbnRWYWx1ZXMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlOjprQmJGaWVsZE51bWJlciwgMSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprT3B0aW9uYWxJbnQzMkZpZWxkTnVtYmVyLCAxKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtPcHRpb25hbGdyb3VwRmllbGROdW1iZXIsIDE2KTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtPcHRpb25hbE5lc3RlZE1lc3NhZ2VGaWVsZE51bWJlciwgMTgpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6a09wdGlvbmFsTmVzdGVkRW51bUZpZWxkTnVtYmVyLCAyMSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWRJbnQzMkZpZWxkTnVtYmVyLCAzMSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWRncm91cEZpZWxkTnVtYmVyLCA0Nik7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjprUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRmllbGROdW1iZXIsIDQ4KTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmtSZXBlYXRlZE5lc3RlZEVudW1GaWVsZE51bWJlciwgNTEpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBFeHRlbnNpb25Db25zdGFudFZhbHVlcykgewotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6a1NpbmdsZUZpZWxkTnVtYmVyLCAxMDAwKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OmtNdWx0aUZpZWxkTnVtYmVyLCAxMDAxKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprT3B0aW9uYWxJbnQzMkV4dGVuc2lvbkZpZWxkTnVtYmVyLCAxKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprT3B0aW9uYWxncm91cEV4dGVuc2lvbkZpZWxkTnVtYmVyLCAxNik7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6a09wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkZpZWxkTnVtYmVyLCAxOCk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6a09wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyLCAyMSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6a1JlcGVhdGVkSW50MzJFeHRlbnNpb25GaWVsZE51bWJlciwgMzEpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OmtSZXBlYXRlZGdyb3VwRXh0ZW5zaW9uRmllbGROdW1iZXIsIDQ2KTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprUmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uRmllbGROdW1iZXIsIDQ4KTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjprUmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uRmllbGROdW1iZXIsIDUxKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUGFyc2VGcm9tVHJ1bmNhdGVkKSB7Ci0gIGNvbnN0IHN0cmluZyBsb25nX3N0cmluZyA9IHN0cmluZygxMjgsICdxJyk7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gcDsKLSAgcC5hZGRfZXh0ZW5zaW9uKCktPnNldF9uYW1lKGxvbmdfc3RyaW5nKTsKLSAgY29uc3Qgc3RyaW5nIG1zZyA9IHAuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgaW50IHN1Y2Nlc3NmdWxfY291bnQgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8PSBtc2cuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAocC5QYXJzZUZyb21BcnJheShtc2cuY19zdHIoKSwgaSkpIHsKLSAgICAgICsrc3VjY2Vzc2Z1bF9jb3VudDsKLSAgICB9Ci0gIH0KLSAgLy8gV2UgZG9uJ3QgcmVhbGx5IGNhcmUgYWJvdXQgaG93IG9mdGVuIHdlIHN1Y2NlZWRlZC4KLSAgLy8gQXMgbG9uZyBhcyB3ZSBkaWRuJ3QgY3Jhc2gsIHdlJ3JlIGhhcHB5LgotICBFWFBFQ1RfR0Uoc3VjY2Vzc2Z1bF9jb3VudCwgMSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgRW51bVZhbHVlc0FzU3dpdGNoQ2FzZXMpIHsKLSAgLy8gVGVzdCB0aGF0IG91ciBuZXN0ZWQgZW51bSB2YWx1ZXMgY2FuIGJlIHVzZWQgYXMgc3dpdGNoIGNhc2VzLiAgVGhpcyB0ZXN0Ci0gIC8vIGRvZXNuJ3QgYWN0dWFsbHkgZG8gYW55dGhpbmcsIHRoZSBwcm9vZiB0aGF0IGl0IHdvcmtzIGlzIHRoYXQgaXQKLSAgLy8gY29tcGlsZXMuCi0gIGludCBpID0wOwotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtIGEgPSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVI7Ci0gIHN3aXRjaCAoYSkgewotICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9POgotICAgICAgaSA9IDE7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUjoKLSAgICAgIGkgPSAyOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVo6Ci0gICAgICBpID0gMzsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TkVHOgotICAgICAgaSA9IC0xOwotICAgICAgYnJlYWs7Ci0gICAgLy8gbm8gZGVmYXVsdCBjYXNlOiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhlIGNvbXBpbGVyIHJlY29nbml6ZXMgdGhhdAotICAgIC8vICAgYWxsIGNhc2VzIGFyZSBjb3ZlcmVkLiAgKEdDQyB3YXJucyBpZiB5b3UgZG8gbm90IGNvdmVyIGFsbCBjYXNlcyBvZgotICAgIC8vICAgYW4gZW51bSBpbiBhIHN3aXRjaC4pCi0gIH0KLQotICAvLyBUb2tlbiBjaGVjayBqdXN0IGZvciBmdW4uCi0gIEVYUEVDVF9FUSgyLCBpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgSXNWYWxpZFZhbHVlKSB7Ci0gIC8vIFRlc3QgZW51bSBJc1ZhbGlkVmFsdWUuCi0gIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgxKSk7Ci0gIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgyKSk7Ci0gIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgzKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fSXNWYWxpZCgwKSk7Ci0gIEVYUEVDVF9GQUxTRSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0lzVmFsaWQoNCkpOwotCi0gIC8vIE1ha2Ugc3VyZSBpdCBhbHNvIHdvcmtzIHdoZW4gdGhlcmUgYXJlIGR1cHMuCi0gIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDEpKTsKLSAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX0lzVmFsaWQoMikpOwotICBFWFBFQ1RfVFJVRSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfSXNWYWxpZCgzKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDApKTsKLSAgRVhQRUNUX0ZBTFNFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9Jc1ZhbGlkKDQpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgTWluQW5kTWF4KSB7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpORUcsCi0gICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTik7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosCi0gICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01BWCk7Ci0gIEVYUEVDVF9FUSg0LCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0FSUkFZU0laRSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywgdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX01JTik7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosIHVuaXR0ZXN0OjpGb3JlaWduRW51bV9NQVgpOwotICBFWFBFQ1RfRVEoNywgdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX0FSUkFZU0laRSk7Ci0KLSAgRVhQRUNUX0VRKDEsIHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9NSU4pOwotICBFWFBFQ1RfRVEoMywgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX01BWCk7Ci0gIEVYUEVDVF9FUSg0LCB1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfQVJSQVlTSVpFKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlNQQVJTRV9FLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTUlOKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpTUEFSU0VfQywgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX01BWCk7Ci0gIEVYUEVDVF9FUSgxMjU4OTIzNSwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX0FSUkFZU0laRSk7Ci0KLSAgLy8gTWFrZSBzdXJlIHdlIGNhbiB0YWtlIHRoZSBhZGRyZXNzIG9mIF9NSU4sIF9NQVggYW5kIF9BUlJBWVNJWkUuCi0gIHZvaWQqIG51bGxfcG9pbnRlciA9IDA7ICAvLyBOVUxMIG1heSBiZSBpbnRlZ2VyLXR5cGUsIG5vdCBwb2ludGVyLXR5cGUuCi0gIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTik7Ci0gIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01BWCk7Ci0gIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX0FSUkFZU0laRSk7Ci0KLSAgRVhQRUNUX05FKG51bGxfcG9pbnRlciwgJnVuaXR0ZXN0OjpGb3JlaWduRW51bV9NSU4pOwotICBFWFBFQ1RfTkUobnVsbF9wb2ludGVyLCAmdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX01BWCk7Ci0gIEVYUEVDVF9ORShudWxsX3BvaW50ZXIsICZ1bml0dGVzdDo6Rm9yZWlnbkVudW1fQVJSQVlTSVpFKTsKLQotICAvLyBNYWtlIHN1cmUgd2UgY2FuIHVzZSBfTUlOIGFuZCBfTUFYIGFzIHN3aXRjaCBjYXNlcy4KLSAgc3dpdGNoICh1bml0dGVzdDo6U1BBUlNFX0EpIHsKLSAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9NSU46Ci0gICAgY2FzZSB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTUFYOgotICAgICAgYnJlYWs7Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLSNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotCi1URVNUKEdlbmVyYXRlZEVudW1UZXN0LCBOYW1lKSB7Ci0gIC8vICJOYW1lcyIgaW4gdGhlIHByZXNlbmNlIG9mIGR1cCB2YWx1ZXMgYXJlIGEgYml0IGFyYml0cmFyeS4KLSAgRVhQRUNUX0VRKCJGT08xIiwgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX05hbWUodW5pdHRlc3Q6OkZPTzEpKTsKLSAgRVhQRUNUX0VRKCJGT08xIiwgdW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX05hbWUodW5pdHRlc3Q6OkZPTzIpKTsKLQotICBFWFBFQ1RfRVEoIlNQQVJTRV9BIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9BKSk7Ci0gIEVYUEVDVF9FUSgiU1BBUlNFX0IiLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTmFtZSh1bml0dGVzdDo6U1BBUlNFX0IpKTsKLSAgRVhQRUNUX0VRKCJTUEFSU0VfQyIsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9OYW1lKHVuaXR0ZXN0OjpTUEFSU0VfQykpOwotICBFWFBFQ1RfRVEoIlNQQVJTRV9EIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9EKSk7Ci0gIEVYUEVDVF9FUSgiU1BBUlNFX0UiLCB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fTmFtZSh1bml0dGVzdDo6U1BBUlNFX0UpKTsKLSAgRVhQRUNUX0VRKCJTUEFSU0VfRiIsIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9OYW1lKHVuaXR0ZXN0OjpTUEFSU0VfRikpOwotICBFWFBFQ1RfRVEoIlNQQVJTRV9HIiwgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX05hbWUodW5pdHRlc3Q6OlNQQVJTRV9HKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkRW51bVRlc3QsIFBhcnNlKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZSBkdXBfdmFsdWUgPSB1bml0dGVzdDo6Rk9PMTsKLSAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX1BhcnNlKCJGT08xIiwgJmR1cF92YWx1ZSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPTzEsIGR1cF92YWx1ZSk7Ci0gIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZV9QYXJzZSgiRk9PMiIsICZkdXBfdmFsdWUpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT08yLCBkdXBfdmFsdWUpOwotICBFWFBFQ1RfRkFMU0UodW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlX1BhcnNlKCJGT08iLCAmZHVwX3ZhbHVlKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkRW51bVRlc3QsIEdldEVudW1EZXNjcmlwdG9yKSB7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX2Rlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgIEdldEVudW1EZXNjcmlwdG9yPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+KCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZvcmVpZ25FbnVtX2Rlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgIEdldEVudW1EZXNjcmlwdG9yPHVuaXR0ZXN0OjpGb3JlaWduRW51bT4oKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWVfZGVzY3JpcHRvcigpLAotICAgICAgICAgICAgR2V0RW51bURlc2NyaXB0b3I8dW5pdHRlc3Q6OlRlc3RFbnVtV2l0aER1cFZhbHVlPigpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9kZXNjcmlwdG9yKCksCi0gICAgICAgICAgICBHZXRFbnVtRGVzY3JpcHRvcjx1bml0dGVzdDo6VGVzdFNwYXJzZUVudW0+KCkpOwotfQotCi1lbnVtIE5vblByb3RvRW51bSB7Ci0gIGtGb28gPSAxLAotfTsKLQotVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgSXNQcm90b0VudW1UeXBlVHJhaXQpIHsKLSAgRVhQRUNUX1RSVUUoaXNfcHJvdG9fZW51bTx1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtPjo6dmFsdWUpOwotICBFWFBFQ1RfVFJVRShpc19wcm90b19lbnVtPHVuaXR0ZXN0OjpGb3JlaWduRW51bT46OnZhbHVlKTsKLSAgRVhQRUNUX1RSVUUoaXNfcHJvdG9fZW51bTx1bml0dGVzdDo6VGVzdEVudW1XaXRoRHVwVmFsdWU+Ojp2YWx1ZSk7Ci0gIEVYUEVDVF9UUlVFKGlzX3Byb3RvX2VudW08dW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtPjo6dmFsdWUpOwotCi0gIEVYUEVDVF9GQUxTRShpc19wcm90b19lbnVtPGludD46OnZhbHVlKTsKLSAgRVhQRUNUX0ZBTFNFKGlzX3Byb3RvX2VudW08Tm9uUHJvdG9FbnVtPjo6dmFsdWUpOwotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLQotLy8gU3VwcG9ydCBjb2RlIGZvciB0ZXN0aW5nIHNlcnZpY2VzLgotY2xhc3MgR2VuZXJhdGVkU2VydmljZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBjbGFzcyBNb2NrVGVzdFNlcnZpY2UgOiBwdWJsaWMgdW5pdHRlc3Q6OlRlc3RTZXJ2aWNlIHsKLSAgIHB1YmxpYzoKLSAgICBNb2NrVGVzdFNlcnZpY2UoKQotICAgICAgOiBjYWxsZWRfKGZhbHNlKSwKLSAgICAgICAgbWV0aG9kXygiIiksCi0gICAgICAgIGNvbnRyb2xsZXJfKE5VTEwpLAotICAgICAgICByZXF1ZXN0XyhOVUxMKSwKLSAgICAgICAgcmVzcG9uc2VfKE5VTEwpLAotICAgICAgICBkb25lXyhOVUxMKSB7fQotCi0gICAgfk1vY2tUZXN0U2VydmljZSgpIHt9Ci0KLSAgICB2b2lkIFJlc2V0KCkgeyBjYWxsZWRfID0gZmFsc2U7IH0KLQotICAgIC8vIGltcGxlbWVudHMgVGVzdFNlcnZpY2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgdm9pZCBGb28oUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgICAgICAgICBjb25zdCB1bml0dGVzdDo6Rm9vUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgICAgICB1bml0dGVzdDo6Rm9vUmVzcG9uc2UqIHJlc3BvbnNlLAotICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpIHsKLSAgICAgIEFTU0VSVF9GQUxTRShjYWxsZWRfKTsKLSAgICAgIGNhbGxlZF8gPSB0cnVlOwotICAgICAgbWV0aG9kXyA9ICJGb28iOwotICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OwotICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7Ci0gICAgICBkb25lXyA9IGRvbmU7Ci0gICAgfQotCi0gICAgdm9pZCBCYXIoUnBjQ29udHJvbGxlciogY29udHJvbGxlciwKLSAgICAgICAgICAgICBjb25zdCB1bml0dGVzdDo6QmFyUmVxdWVzdCogcmVxdWVzdCwKLSAgICAgICAgICAgICB1bml0dGVzdDo6QmFyUmVzcG9uc2UqIHJlc3BvbnNlLAotICAgICAgICAgICAgIENsb3N1cmUqIGRvbmUpIHsKLSAgICAgIEFTU0VSVF9GQUxTRShjYWxsZWRfKTsKLSAgICAgIGNhbGxlZF8gPSB0cnVlOwotICAgICAgbWV0aG9kXyA9ICJCYXIiOwotICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OwotICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7Ci0gICAgICBkb25lXyA9IGRvbmU7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBib29sIGNhbGxlZF87Ci0gICAgc3RyaW5nIG1ldGhvZF87Ci0gICAgUnBjQ29udHJvbGxlciogY29udHJvbGxlcl87Ci0gICAgY29uc3QgTWVzc2FnZSogcmVxdWVzdF87Ci0gICAgTWVzc2FnZSogcmVzcG9uc2VfOwotICAgIENsb3N1cmUqIGRvbmVfOwotICB9OwotCi0gIGNsYXNzIE1vY2tScGNDaGFubmVsIDogcHVibGljIFJwY0NoYW5uZWwgewotICAgcHVibGljOgotICAgIE1vY2tScGNDaGFubmVsKCkKLSAgICAgIDogY2FsbGVkXyhmYWxzZSksCi0gICAgICAgIG1ldGhvZF8oTlVMTCksCi0gICAgICAgIGNvbnRyb2xsZXJfKE5VTEwpLAotICAgICAgICByZXF1ZXN0XyhOVUxMKSwKLSAgICAgICAgcmVzcG9uc2VfKE5VTEwpLAotICAgICAgICBkb25lXyhOVUxMKSwKLSAgICAgICAgZGVzdHJveWVkXyhOVUxMKSB7fQotCi0gICAgfk1vY2tScGNDaGFubmVsKCkgewotICAgICAgaWYgKGRlc3Ryb3llZF8gIT0gTlVMTCkgKmRlc3Ryb3llZF8gPSB0cnVlOwotICAgIH0KLQotICAgIHZvaWQgUmVzZXQoKSB7IGNhbGxlZF8gPSBmYWxzZTsgfQotCi0gICAgLy8gaW1wbGVtZW50cyBUZXN0U2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICB2b2lkIENhbGxNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgewotICAgICAgQVNTRVJUX0ZBTFNFKGNhbGxlZF8pOwotICAgICAgY2FsbGVkXyA9IHRydWU7Ci0gICAgICBtZXRob2RfID0gbWV0aG9kOwotICAgICAgY29udHJvbGxlcl8gPSBjb250cm9sbGVyOwotICAgICAgcmVxdWVzdF8gPSByZXF1ZXN0OwotICAgICAgcmVzcG9uc2VfID0gcmVzcG9uc2U7Ci0gICAgICBkb25lXyA9IGRvbmU7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBib29sIGNhbGxlZF87Ci0gICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kXzsKLSAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyXzsKLSAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0XzsKLSAgICBNZXNzYWdlKiByZXNwb25zZV87Ci0gICAgQ2xvc3VyZSogZG9uZV87Ci0gICAgYm9vbCogZGVzdHJveWVkXzsKLSAgfTsKLQotICBjbGFzcyBNb2NrQ29udHJvbGxlciA6IHB1YmxpYyBScGNDb250cm9sbGVyIHsKLSAgIHB1YmxpYzoKLSAgICB2b2lkIFJlc2V0KCkgewotICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiUmVzZXQoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOwotICAgIH0KLSAgICBib29sIEZhaWxlZCgpIGNvbnN0IHsKLSAgICAgIEFERF9GQUlMVVJFKCkgPDwgIkZhaWxlZCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHN0cmluZyBFcnJvclRleHQoKSBjb25zdCB7Ci0gICAgICBBRERfRkFJTFVSRSgpIDw8ICJFcnJvclRleHQoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOwotICAgICAgcmV0dXJuICIiOwotICAgIH0KLSAgICB2b2lkIFN0YXJ0Q2FuY2VsKCkgewotICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiU3RhcnRDYW5jZWwoKSBub3QgZXhwZWN0ZWQgZHVyaW5nIHRoaXMgdGVzdC4iOwotICAgIH0KLSAgICB2b2lkIFNldEZhaWxlZChjb25zdCBzdHJpbmcmIHJlYXNvbikgewotICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiU2V0RmFpbGVkKCkgbm90IGV4cGVjdGVkIGR1cmluZyB0aGlzIHRlc3QuIjsKLSAgICB9Ci0gICAgYm9vbCBJc0NhbmNlbGVkKCkgY29uc3QgewotICAgICAgQUREX0ZBSUxVUkUoKSA8PCAiSXNDYW5jZWxlZCgpIG5vdCBleHBlY3RlZCBkdXJpbmcgdGhpcyB0ZXN0LiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHZvaWQgTm90aWZ5T25DYW5jZWwoQ2xvc3VyZSogY2FsbGJhY2spIHsKLSAgICAgIEFERF9GQUlMVVJFKCkgPDwgIk5vdGlmeU9uQ2FuY2VsKCkgbm90IGV4cGVjdGVkIGR1cmluZyB0aGlzIHRlc3QuIjsKLSAgICB9Ci0gIH07Ci0KLSAgR2VuZXJhdGVkU2VydmljZVRlc3QoKQotICAgIDogZGVzY3JpcHRvcl8odW5pdHRlc3Q6OlRlc3RTZXJ2aWNlOjpkZXNjcmlwdG9yKCkpLAotICAgICAgZm9vXyhkZXNjcmlwdG9yXy0+RmluZE1ldGhvZEJ5TmFtZSgiRm9vIikpLAotICAgICAgYmFyXyhkZXNjcmlwdG9yXy0+RmluZE1ldGhvZEJ5TmFtZSgiQmFyIikpLAotICAgICAgc3R1Yl8oJm1vY2tfY2hhbm5lbF8pLAotICAgICAgZG9uZV8oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmV3UGVybWFuZW50Q2FsbGJhY2soJkRvTm90aGluZykpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIEFTU0VSVF9UUlVFKGZvb18gIT0gTlVMTCk7Ci0gICAgQVNTRVJUX1RSVUUoYmFyXyAhPSBOVUxMKTsKLSAgfQotCi0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogZm9vXzsKLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmFyXzsKLQotICBNb2NrVGVzdFNlcnZpY2UgbW9ja19zZXJ2aWNlXzsKLSAgTW9ja0NvbnRyb2xsZXIgbW9ja19jb250cm9sbGVyXzsKLQotICBNb2NrUnBjQ2hhbm5lbCBtb2NrX2NoYW5uZWxfOwotICB1bml0dGVzdDo6VGVzdFNlcnZpY2U6OlN0dWIgc3R1Yl87Ci0KLSAgLy8gSnVzdCBzbyB3ZSBkb24ndCBoYXZlIHRvIHJlLWRlZmluZSB0aGVzZSB3aXRoIGV2ZXJ5IHRlc3QuCi0gIHVuaXR0ZXN0OjpGb29SZXF1ZXN0IGZvb19yZXF1ZXN0XzsKLSAgdW5pdHRlc3Q6OkZvb1Jlc3BvbnNlIGZvb19yZXNwb25zZV87Ci0gIHVuaXR0ZXN0OjpCYXJSZXF1ZXN0IGJhcl9yZXF1ZXN0XzsKLSAgdW5pdHRlc3Q6OkJhclJlc3BvbnNlIGJhcl9yZXNwb25zZV87Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8Q2xvc3VyZT4gZG9uZV87Ci19OwotCi1URVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIEdldERlc2NyaXB0b3IpIHsKLSAgLy8gVGVzdCB0aGF0IEdldERlc2NyaXB0b3IoKSB3b3Jrcy4KLQotICBFWFBFQ1RfRVEoZGVzY3JpcHRvcl8sIG1vY2tfc2VydmljZV8uR2V0RGVzY3JpcHRvcigpKTsKLX0KLQotVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBHZXRDaGFubmVsKSB7Ci0gIEVYUEVDVF9FUSgmbW9ja19jaGFubmVsXywgc3R1Yl8uY2hhbm5lbCgpKTsKLX0KLQotVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBPd25zQ2hhbm5lbCkgewotICBNb2NrUnBjQ2hhbm5lbCogY2hhbm5lbCA9IG5ldyBNb2NrUnBjQ2hhbm5lbDsKLSAgYm9vbCBkZXN0cm95ZWQgPSBmYWxzZTsKLSAgY2hhbm5lbC0+ZGVzdHJveWVkXyA9ICZkZXN0cm95ZWQ7Ci0KLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0U2VydmljZTo6U3R1YiBvd25pbmdfc3R1YihjaGFubmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlOjpTVFVCX09XTlNfQ0hBTk5FTCk7Ci0gICAgRVhQRUNUX0ZBTFNFKGRlc3Ryb3llZCk7Ci0gIH0KLQotICBFWFBFQ1RfVFJVRShkZXN0cm95ZWQpOwotfQotCi1URVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIENhbGxNZXRob2QpIHsKLSAgLy8gVGVzdCB0aGF0IENhbGxNZXRob2QoKSB3b3Jrcy4KLQotICAvLyBDYWxsIEZvbygpIHZpYSBDYWxsTWV0aG9kKCkuCi0gIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChmb29fLCAmbW9ja19jb250cm9sbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb29fcmVxdWVzdF8sICZmb29fcmVzcG9uc2VfLCBkb25lXy5nZXQoKSk7Ci0KLSAgQVNTRVJUX1RSVUUobW9ja19zZXJ2aWNlXy5jYWxsZWRfKTsKLQotICBFWFBFQ1RfRVEoIkZvbyIgICAgICAgICAgICAsIG1vY2tfc2VydmljZV8ubWV0aG9kXyAgICApOwotICBFWFBFQ1RfRVEoJm1vY2tfY29udHJvbGxlcl8sIG1vY2tfc2VydmljZV8uY29udHJvbGxlcl8pOwotICBFWFBFQ1RfRVEoJmZvb19yZXF1ZXN0XyAgICAsIG1vY2tfc2VydmljZV8ucmVxdWVzdF8gICApOwotICBFWFBFQ1RfRVEoJmZvb19yZXNwb25zZV8gICAsIG1vY2tfc2VydmljZV8ucmVzcG9uc2VfICApOwotICBFWFBFQ1RfRVEoZG9uZV8uZ2V0KCkgICAgICAsIG1vY2tfc2VydmljZV8uZG9uZV8gICAgICApOwotCi0gIC8vIFRyeSBhZ2FpbiwgYnV0IGNhbGwgQmFyKCkgaW5zdGVhZC4KLSAgbW9ja19zZXJ2aWNlXy5SZXNldCgpOwotICBtb2NrX3NlcnZpY2VfLkNhbGxNZXRob2QoYmFyXywgJm1vY2tfY29udHJvbGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAmYmFyX3JlcXVlc3RfLCAmYmFyX3Jlc3BvbnNlXywgZG9uZV8uZ2V0KCkpOwotCi0gIEFTU0VSVF9UUlVFKG1vY2tfc2VydmljZV8uY2FsbGVkXyk7Ci0gIEVYUEVDVF9FUSgiQmFyIiwgbW9ja19zZXJ2aWNlXy5tZXRob2RfKTsKLX0KLQotVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBDYWxsTWV0aG9kVHlwZUZhaWx1cmUpIHsKLSAgLy8gVmVyaWZ5IGRlYXRoIGlmIHdlIGNhbGwgRm9vKCkgd2l0aCBCYXIncyBtZXNzYWdlIHR5cGVzLgotCi0jaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0Ci0gIEVYUEVDVF9ERUJVR19ERUFUSCgKLSAgICBtb2NrX3NlcnZpY2VfLkNhbGxNZXRob2QoZm9vXywgJm1vY2tfY29udHJvbGxlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb29fcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSksCi0gICAgImR5bmFtaWNfY2FzdCIpOwotCi0gIG1vY2tfc2VydmljZV8uUmVzZXQoKTsKLSAgRVhQRUNUX0RFQlVHX0RFQVRIKAotICAgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChmb29fLCAmbW9ja19jb250cm9sbGVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhcl9yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKSwKLSAgICAiZHluYW1pY19jYXN0Iik7Ci0jZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCi19Ci0KLVRFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgR2V0UHJvdG90eXBlcykgewotICAvLyBUZXN0IEdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpIG1ldGhvZHMuCi0KLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6Rm9vUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1vY2tfc2VydmljZV8uR2V0UmVxdWVzdFByb3RvdHlwZShmb29fKSk7Ci0gIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkJhclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtb2NrX3NlcnZpY2VfLkdldFJlcXVlc3RQcm90b3R5cGUoYmFyXykpOwotCi0gIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkZvb1Jlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbW9ja19zZXJ2aWNlXy5HZXRSZXNwb25zZVByb3RvdHlwZShmb29fKSk7Ci0gIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkJhclJlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbW9ja19zZXJ2aWNlXy5HZXRSZXNwb25zZVByb3RvdHlwZShiYXJfKSk7Ci19Ci0KLVRFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgU3R1YikgewotICAvLyBUZXN0IHRoYXQgdGhlIHN0dWIgY2xhc3Mgd29ya3MuCi0KLSAgLy8gQ2FsbCBGb28oKSB2aWEgdGhlIHN0dWIuCi0gIHN0dWJfLkZvbygmbW9ja19jb250cm9sbGVyXywgJmZvb19yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKTsKLQotICBBU1NFUlRfVFJVRShtb2NrX2NoYW5uZWxfLmNhbGxlZF8pOwotCi0gIEVYUEVDVF9FUShmb29fICAgICAgICAgICAgICwgbW9ja19jaGFubmVsXy5tZXRob2RfICAgICk7Ci0gIEVYUEVDVF9FUSgmbW9ja19jb250cm9sbGVyXywgbW9ja19jaGFubmVsXy5jb250cm9sbGVyXyk7Ci0gIEVYUEVDVF9FUSgmZm9vX3JlcXVlc3RfICAgICwgbW9ja19jaGFubmVsXy5yZXF1ZXN0XyAgICk7Ci0gIEVYUEVDVF9FUSgmZm9vX3Jlc3BvbnNlXyAgICwgbW9ja19jaGFubmVsXy5yZXNwb25zZV8gICk7Ci0gIEVYUEVDVF9FUShkb25lXy5nZXQoKSAgICAgICwgbW9ja19jaGFubmVsXy5kb25lXyAgICAgICk7Ci0KLSAgLy8gQ2FsbCBCYXIoKSB2aWEgdGhlIHN0dWIuCi0gIG1vY2tfY2hhbm5lbF8uUmVzZXQoKTsKLSAgc3R1Yl8uQmFyKCZtb2NrX2NvbnRyb2xsZXJfLCAmYmFyX3JlcXVlc3RfLCAmYmFyX3Jlc3BvbnNlXywgZG9uZV8uZ2V0KCkpOwotCi0gIEFTU0VSVF9UUlVFKG1vY2tfY2hhbm5lbF8uY2FsbGVkXyk7Ci0gIEVYUEVDVF9FUShiYXJfLCBtb2NrX2NoYW5uZWxfLm1ldGhvZF8pOwotfQotCi1URVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIE5vdEltcGxlbWVudGVkKSB7Ci0gIC8vIFRlc3QgdGhhdCBmYWlsaW5nIHRvIGltcGxlbWVudCBhIG1ldGhvZCBvZiBhIHNlcnZpY2UgY2F1c2VzIGl0IHRvIGZhaWwKLSAgLy8gd2l0aCBhICJub3QgaW1wbGVtZW50ZWQiIGVycm9yIG1lc3NhZ2UuCi0KLSAgLy8gQSBzZXJ2aWNlIHdoaWNoIGRvZXNuJ3QgaW1wbGVtZW50IGFueSBtZXRob2RzLgotICBjbGFzcyBVbmltcGxlbWVudGVkU2VydmljZSA6IHB1YmxpYyB1bml0dGVzdDo6VGVzdFNlcnZpY2UgewotICAgcHVibGljOgotICAgIFVuaW1wbGVtZW50ZWRTZXJ2aWNlKCkge30KLSAgfTsKLQotICBVbmltcGxlbWVudGVkU2VydmljZSB1bmltcGxlbWVudGVkX3NlcnZpY2U7Ci0KLSAgLy8gQW5kIGEgY29udHJvbGxlciB3aGljaCBleHBlY3RzIHRvIGdldCBhICJub3QgaW1wbGVtZW50ZWQiIGVycm9yLgotICBjbGFzcyBFeHBlY3RVbmltcGxlbWVudGVkQ29udHJvbGxlciA6IHB1YmxpYyBNb2NrQ29udHJvbGxlciB7Ci0gICBwdWJsaWM6Ci0gICAgRXhwZWN0VW5pbXBsZW1lbnRlZENvbnRyb2xsZXIoKSA6IGNhbGxlZF8oZmFsc2UpIHt9Ci0KLSAgICB2b2lkIFNldEZhaWxlZChjb25zdCBzdHJpbmcmIHJlYXNvbikgewotICAgICAgRVhQRUNUX0ZBTFNFKGNhbGxlZF8pOwotICAgICAgY2FsbGVkXyA9IHRydWU7Ci0gICAgICBFWFBFQ1RfRVEoIk1ldGhvZCBGb28oKSBub3QgaW1wbGVtZW50ZWQuIiwgcmVhc29uKTsKLSAgICB9Ci0KLSAgICBib29sIGNhbGxlZF87Ci0gIH07Ci0KLSAgRXhwZWN0VW5pbXBsZW1lbnRlZENvbnRyb2xsZXIgY29udHJvbGxlcjsKLQotICAvLyBDYWxsIEZvby4KLSAgdW5pbXBsZW1lbnRlZF9zZXJ2aWNlLkZvbygmY29udHJvbGxlciwgJmZvb19yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9uZV8uZ2V0KCkpOwotCi0gIEVYUEVDVF9UUlVFKGNvbnRyb2xsZXIuY2FsbGVkXyk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgT25lb2ZUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICB9Ci0KLSAgdm9pZCBFeHBlY3RFbnVtQ2FzZXNXb3JrKGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyICZtZXNzYWdlKSB7Ci0gICAgc3dpdGNoIChtZXNzYWdlLmZvb19jYXNlKCkpIHsKLSAgICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmtGb29JbnQ6Ci0gICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6a0Zvb1N0cmluZzoKLSAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjprRm9vQ29yZDoKLSAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2NvcmQoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6a0Zvb1N0cmluZ1BpZWNlOgotICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nX3BpZWNlKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmtGb29CeXRlczoKLSAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2J5dGVzKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmtGb29FbnVtOgotICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fZW51bSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjprRm9vTWVzc2FnZToKLSAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6a0Zvb2dyb3VwOgotICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29ncm91cCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjprRm9vTGF6eU1lc3NhZ2U6Ci0gICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19sYXp5X21lc3NhZ2UoKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PX05PVF9TRVQ6Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfTsKLQotVEVTVF9GKE9uZW9mVGVzdCwgU2V0dGluZ09uZUZpZWxkQ2xlYXJzT3RoZXJzKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0KLSAgbWVzc2FnZS5zZXRfZm9vX2ludCgxMjMpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29faW50KCkpOwotICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOwotCi0gIG1lc3NhZ2Uuc2V0X2Zvb19zdHJpbmcoImZvbyIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOwotCi0KLSAgbWVzc2FnZS5zZXRfZm9vX2J5dGVzKCJxdXgiKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2J5dGVzKCkpOwotICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOwotCi0gIG1lc3NhZ2Uuc2V0X2Zvb19lbnVtKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08pOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fZW51bSgpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKLQotICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X3F1eF9pbnQoMjM0KTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7Ci0KLSAgbWVzc2FnZS5tdXRhYmxlX2Zvb2dyb3VwKCktPnNldF9hKDM0NSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb2dyb3VwKCkpOwotICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOwotCi0KLSAgLy8gd2UgcmVwZWF0IHRoaXMgYmVjYXVzZSB3ZSBkaWRuJ3QgdGVzdCBpZiB0aGlzIHByb3Blcmx5IGNsZWFycyBvdGhlciBmaWVsZHMKLSAgLy8gYXQgdGhlIGJlZ2lubmluZy4KLSAgbWVzc2FnZS5zZXRfZm9vX2ludCgxMjMpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29faW50KCkpOwotICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOwotfQotCi1URVNUX0YoT25lb2ZUZXN0LCBFbnVtQ2FzZXMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKLQotICBtZXNzYWdlLnNldF9mb29faW50KDEyMyk7Ci0gIEV4cGVjdEVudW1DYXNlc1dvcmsobWVzc2FnZSk7Ci0gIG1lc3NhZ2Uuc2V0X2Zvb19zdHJpbmcoImZvbyIpOwotICBFeHBlY3RFbnVtQ2FzZXNXb3JrKG1lc3NhZ2UpOwotICBtZXNzYWdlLnNldF9mb29fYnl0ZXMoInF1eCIpOwotICBFeHBlY3RFbnVtQ2FzZXNXb3JrKG1lc3NhZ2UpOwotICBtZXNzYWdlLnNldF9mb29fZW51bSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PKTsKLSAgRXhwZWN0RW51bUNhc2VzV29yayhtZXNzYWdlKTsKLSAgbWVzc2FnZS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDIzNCk7Ci0gIEV4cGVjdEVudW1DYXNlc1dvcmsobWVzc2FnZSk7Ci0gIG1lc3NhZ2UubXV0YWJsZV9mb29ncm91cCgpLT5zZXRfYSgzNDUpOwotICBFeHBlY3RFbnVtQ2FzZXNXb3JrKG1lc3NhZ2UpOwotfQotCi1URVNUX0YoT25lb2ZUZXN0LCBQcmltaXRpdmVUeXBlKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0gIC8vIFVuc2V0IGZpZWxkIHJldHVybnMgZGVmYXVsdCB2YWx1ZQotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29faW50KCksIDApOwotCi0gIG1lc3NhZ2Uuc2V0X2Zvb19pbnQoMTIzKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX2ludCgpLCAxMjMpOwotICBtZXNzYWdlLmNsZWFyX2Zvb19pbnQoKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7Ci19Ci0KLVRFU1RfRihPbmVvZlRlc3QsIEVudW1UeXBlKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0gIC8vIFVuc2V0IGZpZWxkIHJldHVybnMgZGVmYXVsdCB2YWx1ZQotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fZW51bSgpLCAxKTsKLQotICBtZXNzYWdlLnNldF9mb29fZW51bSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2VudW0oKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLmZvb19lbnVtKCksIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08pOwotICBtZXNzYWdlLmNsZWFyX2Zvb19lbnVtKCk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fZW51bSgpKTsKLX0KLQotVEVTVF9GKE9uZW9mVGVzdCwgU2V0U3RyaW5nKSB7Ci0gIC8vIENoZWNrIHRoYXQgc2V0dGluZyBhIHN0cmluZyBmaWVsZCBpbiB2YXJpb3VzIHdheXMgd29ya3MKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKLQotICAvLyBVbnNldCBmaWVsZCByZXR1cm5zIGRlZmF1bHQgdmFsdWUKLSAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiIik7Ci0KLSAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiZm9vIik7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLmZvb19zdHJpbmcoKSwgImZvbyIpOwotICBtZXNzYWdlLmNsZWFyX2Zvb19zdHJpbmcoKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci0KLSAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZyhzdHJpbmcoImJhciIpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiYmFyIik7Ci0gIG1lc3NhZ2UuY2xlYXJfZm9vX3N0cmluZygpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLQotCi0gIG1lc3NhZ2Uuc2V0X2Zvb19zdHJpbmcoInF1eCIsIDMpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fc3RyaW5nKCksICJxdXgiKTsKLSAgbWVzc2FnZS5jbGVhcl9mb29fc3RyaW5nKCk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotCi0gIG1lc3NhZ2UubXV0YWJsZV9mb29fc3RyaW5nKCktPmFzc2lnbigicXV1eCIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fc3RyaW5nKCksICJxdXV4Iik7Ci0gIG1lc3NhZ2UuY2xlYXJfZm9vX3N0cmluZygpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLQotICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJjb3JnZSIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fc3RyaW5nKCksICJjb3JnZSIpOwotICBtZXNzYWdlLmNsZWFyX2Zvb19zdHJpbmcoKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihPbmVvZlRlc3QsIFJlbGVhc2VTdHJpbmcpIHsKLSAgLy8gQ2hlY2sgdGhhdCByZWxlYXNlX2ZvbygpIHN0YXJ0cyBvdXQgTlVMTCwgYW5kIGdpdmVzIHVzIGEgdmFsdWUKLSAgLy8gdGhhdCB3ZSBjYW4gZGVsZXRlIGFmdGVyIGl0J3MgYmVlbiBzZXQuCi0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0KLSAgRVhQRUNUX0VRKE5VTEwsIG1lc3NhZ2UucmVsZWFzZV9mb29fc3RyaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLQotICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJibGFoIik7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8c3RyaW5nPiBzdHIobWVzc2FnZS5yZWxlYXNlX2Zvb19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotICBBU1NFUlRfVFJVRShzdHIgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgiYmxhaCIsICpzdHIpOwotCi0gIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2VfZm9vX3N0cmluZygpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihPbmVvZlRlc3QsIFNldEFsbG9jYXRlZFN0cmluZykgewotICAvLyBDaGVjayB0aGF0IHNldF9hbGxvY2F0ZWRfZm9vKCkgd29ya3MgZm9yIHN0cmluZ3MuCi0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIGNvbnN0IHN0cmluZyBrSGVsbG8oImhlbGxvIik7Ci0gIG1lc3NhZ2Uuc2V0X2Zvb19zdHJpbmcoa0hlbGxvKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLQotICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfZm9vX3N0cmluZyhOVUxMKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgiIiwgbWVzc2FnZS5mb29fc3RyaW5nKCkpOwotCi0gIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9mb29fc3RyaW5nKG5ldyBzdHJpbmcoa0hlbGxvKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShrSGVsbG8sIG1lc3NhZ2UuZm9vX3N0cmluZygpKTsKLX0KLQotCi1URVNUX0YoT25lb2ZUZXN0LCBTZXRNZXNzYWdlKSB7Ci0gIC8vIENoZWNrIHRoYXQgc2V0dGluZyBhIG1lc3NhZ2UgZmllbGQgd29ya3MKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKLQotICAvLyBVbnNldCBmaWVsZCByZXR1cm5zIGRlZmF1bHQgaW5zdGFuY2UKLSAgRVhQRUNUX0VRKCZtZXNzYWdlLmZvb19tZXNzYWdlKCksCi0gICAgICAgICAgICAmdW5pdHRlc3Q6OlRlc3RPbmVvZjJfTmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCksIDApOwotCi0gIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcXV4X2ludCgyMzQpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCksIDIzNCk7Ci0gIG1lc3NhZ2UuY2xlYXJfZm9vX21lc3NhZ2UoKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOwotfQotCi1URVNUX0YoT25lb2ZUZXN0LCBSZWxlYXNlTWVzc2FnZSkgewotICAvLyBDaGVjayB0aGF0IHJlbGVhc2VfZm9vKCkgc3RhcnRzIG91dCBOVUxMLCBhbmQgZ2l2ZXMgdXMgYSB2YWx1ZQotICAvLyB0aGF0IHdlIGNhbiBkZWxldGUgYWZ0ZXIgaXQncyBiZWVuIHNldC4KLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKLQotICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX2Zvb19tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7Ci0KLSAgbWVzc2FnZS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDEpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjx1bml0dGVzdDo6VGVzdE9uZW9mMl9OZXN0ZWRNZXNzYWdlPiBtZXMoCi0gICAgICBtZXNzYWdlLnJlbGVhc2VfZm9vX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKLSAgQVNTRVJUX1RSVUUobWVzICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoMSwgbWVzLT5xdXhfaW50KCkpOwotCi0gIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2VfZm9vX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKLX0KLQotVEVTVF9GKE9uZW9mVGVzdCwgU2V0QWxsb2NhdGVkTWVzc2FnZSkgewotICAvLyBDaGVjayB0aGF0IHNldF9hbGxvY2F0ZWRfZm9vKCkgd29ya3MgZm9yIG1lc3NhZ2VzLgotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKLQotICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X3F1eF9pbnQoMSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOwotCi0gIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9mb29fbWVzc2FnZShOVUxMKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOwotICBFWFBFQ1RfRVEoJm1lc3NhZ2UuZm9vX21lc3NhZ2UoKSwKLSAgICAgICAgICAgICZ1bml0dGVzdDo6VGVzdE9uZW9mMl9OZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotCi0gIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcXV4X2ludCgxKTsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjJfTmVzdGVkTWVzc2FnZSogbWVzID0gbWVzc2FnZS5yZWxlYXNlX2Zvb19tZXNzYWdlKCk7Ci0gIEFTU0VSVF9UUlVFKG1lcyAhPSBOVUxMKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOwotCi0gIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9mb29fbWVzc2FnZShtZXMpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCkpOwotfQotCi0KLVRFU1RfRihPbmVvZlRlc3QsIENsZWFyKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0KLSAgbWVzc2FnZS5zZXRfZm9vX2ludCgxKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKLSAgbWVzc2FnZS5jbGVhcl9mb29faW50KCk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29faW50KCkpOwotfQotCi1URVNUX0YoT25lb2ZUZXN0LCBEZWZhdWx0cykgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29faW50KCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29faW50KCksIDApOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fc3RyaW5nKCksICIiKTsKLQotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fYnl0ZXMoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLmZvb19ieXRlcygpLCAiIik7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fZW51bSgpLCAxKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLmZvb19tZXNzYWdlKCkucXV4X2ludCgpLCAwKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vZ3JvdXAoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLmZvb2dyb3VwKCkuYSgpLCAwKTsKLQotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfaW50KCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5iYXJfaW50KCksIDUpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZS5iYXJfc3RyaW5nKCksICJTVFJJTkciKTsKLQotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfYnl0ZXMoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLmJhcl9ieXRlcygpLCAiQllURVMiKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX2VudW0oKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLmJhcl9lbnVtKCksIDIpOwotfQotCi1URVNUX0YoT25lb2ZUZXN0LCBTd2FwV2l0aEVtcHR5KSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgbWVzc2FnZTEuc2V0X2Zvb19zdHJpbmcoIkZPTyIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMS5oYXNfZm9vX3N0cmluZygpKTsKLSAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29fc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX3N0cmluZygpLCAiRk9PIik7Ci19Ci0KLVRFU1RfRihPbmVvZlRlc3QsIFN3YXBXaXRoU2VsZikgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOwotICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJGT08iKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLSAgbWVzc2FnZS5Td2FwKCZtZXNzYWdlKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiRk9PIik7Ci19Ci0KLVRFU1RfRihPbmVvZlRlc3QsIFN3YXBCb3RoSGFzRmllbGRzKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLQotICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZygiRk9PIik7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLmhhc19mb29fc3RyaW5nKCkpOwotICBtZXNzYWdlMi5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDEpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX21lc3NhZ2UoKSk7Ci0KLSAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5oYXNfZm9vX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLmhhc19mb29fbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UxLmZvb19tZXNzYWdlKCkucXV4X2ludCgpLCAxKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fc3RyaW5nKCksICJGT08iKTsKLX0KLQotVEVTVF9GKE9uZW9mVGVzdCwgQ29weUNvbnN0cnVjdG9yKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxOwotICBtZXNzYWdlMS5zZXRfZm9vX2J5dGVzKCJGT08iKTsKLQotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMihtZXNzYWdlMSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29fYnl0ZXMoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fYnl0ZXMoKSwgIkZPTyIpOwotfQotCi1URVNUX0YoT25lb2ZUZXN0LCBDb3B5RnJvbSkgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIG1lc3NhZ2UxLnNldF9mb29fZW51bSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6QkFSKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX2Zvb19lbnVtKCkpOwotCi0gIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19lbnVtKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2VudW0oKSwgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkJBUik7Ci0KLSAgLy8gQ29weWluZyBmcm9tIHNlbGYgc2hvdWxkIGJlIGEgbm8tb3AuCi0gIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UyKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19lbnVtKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2VudW0oKSwgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkJBUik7Ci19Ci0KLVRFU1RfRihPbmVvZlRlc3QsIENvcHlBc3NpZ25tZW50T3BlcmF0b3IpIHsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTE7Ci0gIG1lc3NhZ2UxLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X3F1eF9pbnQoMTIzKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX2Zvb19tZXNzYWdlKCkpOwotCi0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UyOwotICBtZXNzYWdlMiA9IG1lc3NhZ2UxOwotICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCksIDEyMyk7Ci0KLSAgLy8gTWFrZSBzdXJlIHRoYXQgc2VsZi1hc3NpZ25tZW50IGRvZXMgc29tZXRoaW5nIHNhbmUuCi0gIG1lc3NhZ2UyID0gbWVzc2FnZTI7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fbWVzc2FnZSgpLnF1eF9pbnQoKSwgMTIzKTsKLX0KLQotVEVTVF9GKE9uZW9mVGVzdCwgVXBjYXN0Q29weUZyb20pIHsKLSAgLy8gVGVzdCB0aGUgQ29weUZyb20gbWV0aG9kIHRoYXQgdGFrZXMgaW4gdGhlIGdlbmVyaWMgY29uc3QgTWVzc2FnZSYKLSAgLy8gcGFyYW1ldGVyLgotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIG1lc3NhZ2UxLm11dGFibGVfZm9vZ3JvdXAoKS0+c2V0X2EoMTIzKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX2Zvb2dyb3VwKCkpOwotCi0gIGNvbnN0IE1lc3NhZ2UqIHNvdXJjZSA9IGltcGxpY2l0X2Nhc3Q8Y29uc3QgTWVzc2FnZSo+KCZtZXNzYWdlMSk7Ci0gIG1lc3NhZ2UyLkNvcHlGcm9tKCpzb3VyY2UpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29ncm91cCgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb2dyb3VwKCkuYSgpLCAxMjMpOwotfQotCi0vLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpLAotLy8gVGhpcyBpbmRpcmVjdGx5IHRlc3RzIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpCi0vLyBXZSBoYXZlIHRvIHRlc3QgZWFjaCBmaWVsZCB0eXBlIHNlcGFyYXRlbHkgYmVjYXVzZSB3ZSBjYW5ub3Qgc2V0IHRoZW0gYXQgdGhlCi0vLyBzYW1lIHRpbWUKLVRFU1RfRihPbmVvZlRlc3QsIFNlcmlhbGl6YXRpb25Ub0FycmF5KSB7Ci0gIC8vIFByaW1pdGl2ZSB0eXBlCi0gIHsKLSAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gICAgc3RyaW5nIGRhdGE7Ci0gICAgbWVzc2FnZTEuc2V0X2Zvb19pbnQoMTIzKTsKLSAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7Ci0gICAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0gICAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOwotICAgIHVpbnQ4KiBlbmQgPSBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKLSAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOwotICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19pbnQoKSwgMTIzKTsKLSAgfQotCi0gIC8vIFN0cmluZwotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICAgIHN0cmluZyBkYXRhOwotICAgIG1lc3NhZ2UxLnNldF9mb29fc3RyaW5nKCJmb28iKTsKLSAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7Ci0gICAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0gICAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOwotICAgIHVpbnQ4KiBlbmQgPSBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKLSAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOwotICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19zdHJpbmcoKSwgImZvbyIpOwotICB9Ci0KLQotICAvLyBCeXRlcwotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICAgIHN0cmluZyBkYXRhOwotICAgIG1lc3NhZ2UxLnNldF9mb29fYnl0ZXMoInF1eCIpOwotICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKLSAgICBkYXRhLnJlc2l6ZShzaXplKTsKLSAgICB1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7Ci0gICAgdWludDgqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOwotICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7Ci0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2J5dGVzKCksICJxdXgiKTsKLSAgfQotCi0gIC8vIEVudW0KLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgICBzdHJpbmcgZGF0YTsKLSAgICBtZXNzYWdlMS5zZXRfZm9vX2VudW0odW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTyk7Ci0gICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOwotICAgIGRhdGEucmVzaXplKHNpemUpOwotICAgIHVpbnQ4KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKLSAgICB1aW50OCogZW5kID0gbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7Ci0gICAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHN0YXJ0KTsKLSAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fZW51bSgpLCB1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PKTsKLSAgfQotCi0gIC8vIE1lc3NhZ2UKLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgICBzdHJpbmcgZGF0YTsKLSAgICBtZXNzYWdlMS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDIzNCk7Ci0gICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOwotICAgIGRhdGEucmVzaXplKHNpemUpOwotICAgIHVpbnQ4KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKLSAgICB1aW50OCogZW5kID0gbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7Ci0gICAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHN0YXJ0KTsKLSAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fbWVzc2FnZSgpLnF1eF9pbnQoKSwgMjM0KTsKLSAgfQotCi0gIC8vIEdyb3VwCi0gIHsKLSAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gICAgc3RyaW5nIGRhdGE7Ci0gICAgbWVzc2FnZTEubXV0YWJsZV9mb29ncm91cCgpLT5zZXRfYSgzNDUpOwotICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKLSAgICBkYXRhLnJlc2l6ZShzaXplKTsKLSAgICB1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7Ci0gICAgdWludDgqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOwotICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7Ci0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vZ3JvdXAoKS5hKCksIDM0NSk7Ci0gIH0KLQotfQotCi0vLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkgYnkgZm9yY2luZyB0aGUgYnVmZmVyIHRvIHdyaXRlCi0vLyBvbmUgYnl0ZSBhdCBhIHRpbWUuCi0vLyBUaGlzIGluZGlyZWN0bHkgdGVzdHMgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCkKLS8vIFdlIGhhdmUgdG8gdGVzdCBlYWNoIGZpZWxkIHR5cGUgc2VwYXJhdGVseSBiZWNhdXNlIHdlIGNhbm5vdCBzZXQgdGhlbSBhdCB0aGUKLS8vIHNhbWUgdGltZQotVEVTVF9GKE9uZW9mVGVzdCwgU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7Ci0gIC8vIFByaW1pdGl2ZSB0eXBlCi0gIHsKLSAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gICAgc3RyaW5nIGRhdGE7Ci0gICAgbWVzc2FnZTEuc2V0X2Zvb19pbnQoMTIzKTsKLSAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7Ci0gICAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0KLSAgICB7Ci0gICAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCi0gICAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKHN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOwotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOwotICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2ludCgpLCAxMjMpOwotICB9Ci0KLSAgLy8gU3RyaW5nCi0gIHsKLSAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gICAgc3RyaW5nIGRhdGE7Ci0gICAgbWVzc2FnZTEuc2V0X2Zvb19zdHJpbmcoImZvbyIpOwotICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKLSAgICBkYXRhLnJlc2l6ZShzaXplKTsKLQotICAgIHsKLSAgICAgIC8vIEFsbG93IHRoZSBvdXRwdXQgc3RyZWFtIHRvIGJ1ZmZlciBvbmx5IG9uZSBieXRlIGF0IGEgdGltZS4KLSAgICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7Ci0gICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKLSAgICAgIG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7Ci0gICAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKLSAgICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKLSAgICB9Ci0KLSAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fc3RyaW5nKCksICJmb28iKTsKLSAgfQotCi0KLSAgLy8gQnl0ZXMKLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgICBzdHJpbmcgZGF0YTsKLSAgICBtZXNzYWdlMS5zZXRfZm9vX2J5dGVzKCJxdXgiKTsKLSAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7Ci0gICAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0KLSAgICB7Ci0gICAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCi0gICAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKHN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOwotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOwotICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2J5dGVzKCksICJxdXgiKTsKLSAgfQotCi0gIC8vIEVudW0KLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgICBzdHJpbmcgZGF0YTsKLSAgICBtZXNzYWdlMS5zZXRfZm9vX2VudW0odW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTyk7Ci0gICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOwotICAgIGRhdGEucmVzaXplKHNpemUpOwotCi0gICAgewotICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgotICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKLSAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOwotICAgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKLSAgICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOwotICAgICAgRVhQRUNUX0VRKHNpemUsIG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCkpOwotICAgIH0KLQotICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19lbnVtKCksIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08pOwotICB9Ci0KLSAgLy8gTWVzc2FnZQotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICAgIHN0cmluZyBkYXRhOwotICAgIG1lc3NhZ2UxLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X3F1eF9pbnQoMjM0KTsKLSAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7Ci0gICAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0KLSAgICB7Ci0gICAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCi0gICAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKHN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOwotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOwotICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCksIDIzNCk7Ci0gIH0KLQotICAvLyBHcm91cAotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICAgIHN0cmluZyBkYXRhOwotICAgIG1lc3NhZ2UxLm11dGFibGVfZm9vZ3JvdXAoKS0+c2V0X2EoMzQ1KTsKLSAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7Ci0gICAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0KLSAgICB7Ci0gICAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCi0gICAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKHN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOwotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOwotICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7Ci0gICAgfQotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vZ3JvdXAoKS5hKCksIDM0NSk7Ci0gIH0KLQotfQotCi1URVNUX0YoT25lb2ZUZXN0LCBNZXJnZUZyb20pIHsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOwotCi0gIG1lc3NhZ2UxLnNldF9mb29faW50KDEyMyk7Ci0gIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX2ludCgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19pbnQoKSwgMTIzKTsKLQotICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZygiZm9vIik7Ci0gIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX3N0cmluZygpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19zdHJpbmcoKSwgImZvbyIpOwotCi0KLSAgbWVzc2FnZTEuc2V0X2Zvb19ieXRlcygicXV4Iik7Ci0gIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX2J5dGVzKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2J5dGVzKCksICJxdXgiKTsKLQotICBtZXNzYWdlMS5zZXRfZm9vX2VudW0odW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTyk7Ci0gIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX2VudW0oKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fZW51bSgpLCB1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PKTsKLQotICBtZXNzYWdlMS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDIzNCk7Ci0gIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fbWVzc2FnZSgpLnF1eF9pbnQoKSwgMjM0KTsKLQotICBtZXNzYWdlMS5tdXRhYmxlX2Zvb2dyb3VwKCktPnNldF9hKDM0NSk7Ci0gIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZTIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vZ3JvdXAoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMi5mb29ncm91cCgpLmEoKSwgMzQ1KTsKLQotfQotCi19ICAvLyBuYW1lc3BhY2UgY3BwX3VuaXR0ZXN0Ci19ICAvLyBuYW1lc3BhY2UgY3BwCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLQotbmFtZXNwYWNlIG5vX2dlbmVyaWNfc2VydmljZXNfdGVzdCB7Ci0gIC8vIFZlcmlmeSB0aGF0IG5vIGNsYXNzIGNhbGxlZCAiVGVzdFNlcnZpY2UiIHdhcyBkZWZpbmVkIGluCi0gIC8vIHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuaCBieSBkZWZpbmluZyBhIGRpZmZlcmVudCB0eXBlIGJ5IHRoZSBzYW1lCi0gIC8vIG5hbWUuICBJZiBzdWNoIGEgc2VydmljZSB3YXMgZ2VuZXJhdGVkLCB0aGlzIHdpbGwgbm90IGNvbXBpbGUuCi0gIHN0cnVjdCBUZXN0U2VydmljZSB7Ci0gICAgaW50IGk7Ci0gIH07Ci19Ci0KLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgY3BwIHsKLW5hbWVzcGFjZSBjcHBfdW5pdHRlc3QgewotCi1URVNUX0YoR2VuZXJhdGVkU2VydmljZVRlc3QsIE5vR2VuZXJpY1NlcnZpY2VzKSB7Ci0gIC8vIFZlcmlmeSB0aGF0IG5vbi1zZXJ2aWNlcyBpbiB1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIHdlcmUKLSAgLy8gZ2VuZXJhdGVkLgotICBub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q6OlRlc3RNZXNzYWdlIG1lc3NhZ2U7Ci0gIG1lc3NhZ2Uuc2V0X2EoMSk7Ci0gIG1lc3NhZ2UuU2V0RXh0ZW5zaW9uKG5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDo6dGVzdF9leHRlbnNpb24sIDEyMyk7Ci0gIG5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDo6VGVzdEVudW0gZSA9IG5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDo6Rk9POwotICBFWFBFQ1RfRVEoZSwgMSk7Ci0KLSAgLy8gVmVyaWZ5IHRoYXQgYSBTZXJ2aWNlRGVzY3JpcHRvciBpcyBnZW5lcmF0ZWQgZm9yIHRoZSBzZXJ2aWNlIGV2ZW4gaWYgdGhlCi0gIC8vIGNsYXNzIGl0c2VsZiBpcyBub3QuCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0KLSAgICAgIG5vX2dlbmVyaWNfc2VydmljZXNfdGVzdDo6VGVzdE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOwotCi0gIEFTU0VSVF9FUSgxLCBmaWxlLT5zZXJ2aWNlX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoIlRlc3RTZXJ2aWNlIiwgZmlsZS0+c2VydmljZSgwKS0+bmFtZSgpKTsKLSAgQVNTRVJUX0VRKDEsIGZpbGUtPnNlcnZpY2UoMCktPm1ldGhvZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKCJGb28iLCBmaWxlLT5zZXJ2aWNlKDApLT5tZXRob2QoMCktPm5hbWUoKSk7Ci19Ci0KLSNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBUaGlzIHRlc3QgbXVzdCBydW4gbGFzdC4gIEl0IHZlcmlmaWVzIHRoYXQgZGVzY3JpcHRvcnMgd2VyZSBvciB3ZXJlIG5vdAotLy8gaW5pdGlhbGl6ZWQgZGVwZW5kaW5nIG9uIHdoZXRoZXIgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUyB3YXMgZGVmaW5lZC4KLS8vIFdoZW4gdGhpcyBpcyBkZWZpbmVkLCB3ZSBza2lwIGFsbCB0ZXN0cyB3aGljaCBhcmUgZXhwZWN0ZWQgdG8gdHJpZ2dlcgotLy8gZGVzY3JpcHRvciBpbml0aWFsaXphdGlvbi4gIFRoaXMgdmVyaWZpZXMgdGhhdCBldmVyeXRoaW5nIGVsc2Ugc3RpbGwgd29ya3MKLS8vIGlmIGRlc2NyaXB0b3JzIGFyZSBub3QgaW5pdGlhbGl6ZWQuCi1URVNUKERlc2NyaXB0b3JJbml0aWFsaXphdGlvblRlc3QsIEluaXRpYWxpemVkKSB7Ci0jaWZkZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotICBib29sIHNob3VsZF9oYXZlX2Rlc2NyaXB0b3JzID0gZmFsc2U7Ci0jZWxzZQotICBib29sIHNob3VsZF9oYXZlX2Rlc2NyaXB0b3JzID0gdHJ1ZTsKLSNlbmRpZgotCi0gIEVYUEVDVF9FUShzaG91bGRfaGF2ZV9kZXNjcmlwdG9ycywKLSAgICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS0+SW50ZXJuYWxJc0ZpbGVMb2FkZWQoCi0gICAgICAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIikpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY3BwX3VuaXR0ZXN0Ci0KLX0gIC8vIG5hbWVzcGFjZSBjcHAKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMGQ5MDkzYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDk2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmZGVmIF9NU0NfVkVSCi0jaW5jbHVkZSA8aW8uaD4KLSNlbHNlCi0jaW5jbHVkZSA8dW5pc3RkLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jaW5jbHVkZSA8ZXJybm8uaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci0KLSNpZmRlZiBfV0lOMzIKLSNpZm5kZWYgRl9PSwotI2RlZmluZSBGX09LIDAwICAvLyBub3QgZGVmaW5lZCBieSBNU1ZDIGZvciB3aGF0ZXZlciByZWFzb24KLSNlbmRpZgotI2luY2x1ZGUgPGN0eXBlLmg+Ci0jZW5kaWYKLQotLy8gUmV0dXJucyB0cnVlIGlmIHRoZSB0ZXh0IGxvb2tzIGxpa2UgYSBXaW5kb3dzLXN0eWxlIGFic29sdXRlIHBhdGgsIHN0YXJ0aW5nCi0vLyB3aXRoIGEgZHJpdmUgbGV0dGVyLiAgRXhhbXBsZTogICJDOlxmb28iLiAgVE9ETyhrZW50b24pOiAgU2hhcmUgdGhpcyB3aXRoCi0vLyBjb3B5IGluIGNvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2M/Ci1zdGF0aWMgYm9vbCBJc1dpbmRvd3NBYnNvbHV0ZVBhdGgoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7Ci0jaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQoX19DWUdXSU5fXykKLSAgcmV0dXJuIHRleHQuc2l6ZSgpID49IDMgJiYgdGV4dFsxXSA9PSAnOicgJiYKLSAgICAgICAgIGlzYWxwaGEodGV4dFswXSkgJiYKLSAgICAgICAgICh0ZXh0WzJdID09ICcvJyB8fCB0ZXh0WzJdID09ICdcXCcpICYmCi0gICAgICAgICB0ZXh0LmZpbmRfbGFzdF9vZignOicpID09IDE7Ci0jZWxzZQotICByZXR1cm4gZmFsc2U7Ci0jZW5kaWYKLX0KLQotTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3I6On5NdWx0aUZpbGVFcnJvckNvbGxlY3RvcigpIHt9Ci0KLS8vIFRoaXMgY2xhc3Mgc2VydmVzIHR3byBwdXJwb3NlczoKLS8vIC0gSXQgaW1wbGVtZW50cyB0aGUgRXJyb3JDb2xsZWN0b3IgaW50ZXJmYWNlICh1c2VkIGJ5IFRva2VuaXplciBhbmQgUGFyc2VyKQotLy8gICBpbiB0ZXJtcyBvZiBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciwgdXNpbmcgYSBwYXJ0aWN1bGFyIGZpbGVuYW1lLgotLy8gLSBJdCBsZXRzIHVzIGNoZWNrIGlmIGFueSBlcnJvcnMgaGF2ZSBvY2N1cnJlZC4KLWNsYXNzIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OlNpbmdsZUZpbGVFcnJvckNvbGxlY3RvcgotICAgIDogcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7Ci0gcHVibGljOgotICBTaW5nbGVGaWxlRXJyb3JDb2xsZWN0b3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3RvcikKLSAgICA6IGZpbGVuYW1lXyhmaWxlbmFtZSksCi0gICAgICBtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3Rvcl8obXVsdGlfZmlsZV9lcnJvcl9jb2xsZWN0b3IpLAotICAgICAgaGFkX2Vycm9yc18oZmFsc2UpIHt9Ci0gIH5TaW5nbGVGaWxlRXJyb3JDb2xsZWN0b3IoKSB7fQotCi0gIGJvb2wgaGFkX2Vycm9ycygpIHsgcmV0dXJuIGhhZF9lcnJvcnNfOyB9Ci0KLSAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgaWYgKG11bHRpX2ZpbGVfZXJyb3JfY29sbGVjdG9yXyAhPSBOVUxMKSB7Ci0gICAgICBtdWx0aV9maWxlX2Vycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGZpbGVuYW1lXywgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLSAgICB9Ci0gICAgaGFkX2Vycm9yc18gPSB0cnVlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdHJpbmcgZmlsZW5hbWVfOwotICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogbXVsdGlfZmlsZV9lcnJvcl9jb2xsZWN0b3JfOwotICBib29sIGhhZF9lcnJvcnNfOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Tb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKAotICAgIFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlKQotICA6IHNvdXJjZV90cmVlXyhzb3VyY2VfdHJlZSksCi0gICAgZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKLSAgICB1c2luZ192YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl8oZmFsc2UpLAotICAgIHZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXyh0aGlzKSB7fQotCi1Tb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjp+U291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSgpIHt9Ci0KLWJvb2wgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVCeU5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IGlucHV0KHNvdXJjZV90cmVlXy0+T3BlbihmaWxlbmFtZSkpOwotICBpZiAoaW5wdXQgPT0gTlVMTCkgewotICAgIGlmIChlcnJvcl9jb2xsZWN0b3JfICE9IE5VTEwpIHsKLSAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGZpbGVuYW1lLCAtMSwgMCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNvdXJjZV90cmVlXy0+R2V0TGFzdEVycm9yTWVzc2FnZSgpKTsKLSAgICB9Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIgYW5kIHBhcnNlci4KLSAgU2luZ2xlRmlsZUVycm9yQ29sbGVjdG9yIGZpbGVfZXJyb3JfY29sbGVjdG9yKGZpbGVuYW1lLCBlcnJvcl9jb2xsZWN0b3JfKTsKLSAgaW86OlRva2VuaXplciB0b2tlbml6ZXIoaW5wdXQuZ2V0KCksICZmaWxlX2Vycm9yX2NvbGxlY3Rvcik7Ci0KLSAgUGFyc2VyIHBhcnNlcjsKLSAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gTlVMTCkgewotICAgIHBhcnNlci5SZWNvcmRFcnJvcnNUbygmZmlsZV9lcnJvcl9jb2xsZWN0b3IpOwotICB9Ci0gIGlmICh1c2luZ192YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl8pIHsKLSAgICBwYXJzZXIuUmVjb3JkU291cmNlTG9jYXRpb25zVG8oJnNvdXJjZV9sb2NhdGlvbnNfKTsKLSAgfQotCi0gIC8vIFBhcnNlIGl0LgotICBvdXRwdXQtPnNldF9uYW1lKGZpbGVuYW1lKTsKLSAgcmV0dXJuIHBhcnNlci5QYXJzZSgmdG9rZW5pemVyLCBvdXRwdXQpICYmCi0gICAgICAgICAhZmlsZV9lcnJvcl9jb2xsZWN0b3IuaGFkX2Vycm9ycygpOwotfQotCi1ib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLCBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKLSAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwgaW50IGZpZWxkX251bWJlciwKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLVNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OlZhbGlkYXRpb25FcnJvckNvbGxlY3Rvcjo6Ci1WYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSogb3duZXIpCi0gIDogb3duZXJfKG93bmVyKSB7fQotCi1Tb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I6OgotflZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpIHt9Ci0KLXZvaWQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yOjpBZGRFcnJvcigKLSAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAotICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCi0gICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgaWYgKG93bmVyXy0+ZXJyb3JfY29sbGVjdG9yXyA9PSBOVUxMKSByZXR1cm47Ci0KLSAgaW50IGxpbmUsIGNvbHVtbjsKLSAgb3duZXJfLT5zb3VyY2VfbG9jYXRpb25zXy5GaW5kKGRlc2NyaXB0b3IsIGxvY2F0aW9uLCAmbGluZSwgJmNvbHVtbik7Ci0gIG93bmVyXy0+ZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci19Ci0KLXZvaWQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZTo6VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yOjpBZGRXYXJuaW5nKAotICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsCi0gICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKLSAgICBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAotICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICBpZiAob3duZXJfLT5lcnJvcl9jb2xsZWN0b3JfID09IE5VTEwpIHJldHVybjsKLQotICBpbnQgbGluZSwgY29sdW1uOwotICBvd25lcl8tPnNvdXJjZV9sb2NhdGlvbnNfLkZpbmQoZGVzY3JpcHRvciwgbG9jYXRpb24sICZsaW5lLCAmY29sdW1uKTsKLSAgb3duZXJfLT5lcnJvcl9jb2xsZWN0b3JfLT5BZGRXYXJuaW5nKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUltcG9ydGVyOjpJbXBvcnRlcihTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSwKLSAgICAgICAgICAgICAgICAgICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKQotICA6IGRhdGFiYXNlXyhzb3VyY2VfdHJlZSksCi0gICAgcG9vbF8oJmRhdGFiYXNlXywgZGF0YWJhc2VfLkdldFZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpKSB7Ci0gIHBvb2xfLkVuZm9yY2VXZWFrRGVwZW5kZW5jaWVzKHRydWUpOwotICBkYXRhYmFzZV8uUmVjb3JkRXJyb3JzVG8oZXJyb3JfY29sbGVjdG9yKTsKLX0KLQotSW1wb3J0ZXI6On5JbXBvcnRlcigpIHt9Ci0KLWNvbnN0IEZpbGVEZXNjcmlwdG9yKiBJbXBvcnRlcjo6SW1wb3J0KGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKLSAgcmV0dXJuIHBvb2xfLkZpbmRGaWxlQnlOYW1lKGZpbGVuYW1lKTsKLX0KLQotdm9pZCBJbXBvcnRlcjo6QWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKGNvbnN0IHN0cmluZyYgZmlsZV9uYW1lKSB7Ci0gIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZShmaWxlX25hbWUpOwotfQotCi12b2lkIEltcG9ydGVyOjpDbGVhclVudXNlZEltcG9ydFRyYWNrRmlsZXMoKSB7Ci0gIHBvb2xfLkNsZWFyVW51c2VkSW1wb3J0VHJhY2tGaWxlcygpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNvdXJjZVRyZWU6On5Tb3VyY2VUcmVlKCkge30KLQotc3RyaW5nIFNvdXJjZVRyZWU6OkdldExhc3RFcnJvck1lc3NhZ2UoKSB7Ci0gIHJldHVybiAiRmlsZSBub3QgZm91bmQuIjsKLX0KLQotRGlza1NvdXJjZVRyZWU6OkRpc2tTb3VyY2VUcmVlKCkge30KLQotRGlza1NvdXJjZVRyZWU6On5EaXNrU291cmNlVHJlZSgpIHt9Ci0KLXN0YXRpYyBpbmxpbmUgY2hhciBMYXN0Q2hhcihjb25zdCBzdHJpbmcmIHN0cikgewotICByZXR1cm4gc3RyW3N0ci5zaXplKCkgLSAxXTsKLX0KLQotLy8gR2l2ZW4gYSBwYXRoLCByZXR1cm5zIGFuIGVxdWl2YWxlbnQgcGF0aCB3aXRoIHRoZXNlIGNoYW5nZXM6Ci0vLyAtIE9uIFdpbmRvd3MsIGFueSBiYWNrc2xhc2hlcyBhcmUgcmVwbGFjZWQgd2l0aCBmb3J3YXJkIHNsYXNoZXMuCi0vLyAtIEFueSBpbnN0YW5jZXMgb2YgdGhlIGRpcmVjdG9yeSAiLiIgYXJlIHJlbW92ZWQuCi0vLyAtIEFueSBjb25zZWN1dGl2ZSAnLydzIGFyZSBjb2xsYXBzZWQgaW50byBhIHNpbmdsZSBzbGFzaC4KLS8vIE5vdGUgdGhhdCB0aGUgcmVzdWx0aW5nIHN0cmluZyBtYXkgYmUgZW1wdHkuCi0vLwotLy8gVE9ETyhrZW50b24pOiAgSXQgd291bGQgYmUgbmljZSB0byBoYW5kbGUgIi4uIiwgZS5nLiBzbyB0aGF0IHdlIGNhbiBmaWd1cmUKLS8vICAgb3V0IHRoYXQgImZvby9iYXIucHJvdG8iIGlzIGluc2lkZSAiYmF6Ly4uL2ZvbyIuICBIb3dldmVyLCBpZiBiYXogaXMgYQotLy8gICBzeW1saW5rIG9yIGRvZXNuJ3QgZXhpc3QsIHRoZW4gdGhpbmdzIGdldCBjb21wbGljYXRlZCwgYW5kIHdlIGNhbid0Ci0vLyAgIGFjdHVhbGx5IGRldGVybWluZSB0aGlzIHdpdGhvdXQgaW52ZXN0aWdhdGluZyB0aGUgZmlsZXN5c3RlbSwgcHJvYmFibHkKLS8vICAgaW4gbm9uLXBvcnRhYmxlIHdheXMuICBTbywgd2UgcHVudC4KLS8vCi0vLyBUT0RPKGtlbnRvbik6ICBJdCB3b3VsZCBiZSBuaWNlIHRvIHVzZSByZWFscGF0aCgpIGhlcmUgZXhjZXB0IHRoYXQgaXQKLS8vICAgcmVzb2x2ZXMgc3ltYm9saWMgbGlua3MuICBUaGlzIGNvdWxkIGNhdXNlIHByb2JsZW1zIGlmIHBlb3BsZSBwbGFjZQotLy8gICBzeW1ib2xpYyBsaW5rcyBpbiB0aGVpciBzb3VyY2UgdHJlZS4gIEZvciBleGFtcGxlLCBpZiB5b3UgZXhlY3V0ZWQ6Ci0vLyAgICAgcHJvdG9jIC0tcHJvdG9fcGF0aD1mb28gZm9vL2Jhci9iYXoucHJvdG8KLS8vICAgdGhlbiBpZiBmb28vYmFyIGlzIGEgc3ltYm9saWMgbGluaywgZm9vL2Jhci9iYXoucHJvdG8gd2lsbCBjYW5vbmljYWxpemUKLS8vICAgdG8gYSBwYXRoIHdoaWNoIGRvZXMgbm90IGFwcGVhciB0byBiZSB1bmRlciBmb28sIGFuZCB0aHVzIHRoZSBjb21waWxlcgotLy8gICB3aWxsIGNvbXBsYWluIHRoYXQgYmF6LnByb3RvIGlzIG5vdCBpbnNpZGUgdGhlIC0tcHJvdG9fcGF0aC4KLXN0YXRpYyBzdHJpbmcgQ2Fub25pY2FsaXplUGF0aChzdHJpbmcgcGF0aCkgewotI2lmZGVmIF9XSU4zMgotICAvLyBUaGUgV2luMzIgQVBJIGFjY2VwdHMgZm9yd2FyZCBzbGFzaGVzIGFzIGEgcGF0aCBkZWxpbWl0ZXIgZXZlbiB0aG91Z2gKLSAgLy8gYmFja3NsYXNoZXMgYXJlIHN0YW5kYXJkLiAgTGV0J3MgYXZvaWQgY29uZnVzaW9uIGFuZCB1c2Ugb25seSBmb3J3YXJkCi0gIC8vIHNsYXNoZXMuCi0gIGlmIChIYXNQcmVmaXhTdHJpbmcocGF0aCwgIlxcXFwiKSkgewotICAgIC8vIEF2b2lkIGNvbnZlcnRpbmcgdHdvIGxlYWRpbmcgYmFja3NsYXNoZXMuCi0gICAgcGF0aCA9ICJcXFxcIiArIFN0cmluZ1JlcGxhY2UocGF0aC5zdWJzdHIoMiksICJcXCIsICIvIiwgdHJ1ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgcGF0aCA9IFN0cmluZ1JlcGxhY2UocGF0aCwgIlxcIiwgIi8iLCB0cnVlKTsKLSAgfQotI2VuZGlmCi0KLSAgdmVjdG9yPHN0cmluZz4gY2Fub25pY2FsX3BhcnRzOwotICB2ZWN0b3I8c3RyaW5nPiBwYXJ0cyA9IFNwbGl0KAotICAgICAgcGF0aCwgIi8iLCB0cnVlKTsgIC8vIE5vdGU6ICBSZW1vdmVzIGVtcHR5IHBhcnRzLgotICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHBhcnRzW2ldID09ICIuIikgewotICAgICAgLy8gSWdub3JlLgotICAgIH0gZWxzZSB7Ci0gICAgICBjYW5vbmljYWxfcGFydHMucHVzaF9iYWNrKHBhcnRzW2ldKTsKLSAgICB9Ci0gIH0KLSAgc3RyaW5nIHJlc3VsdCA9IEpvaW4oY2Fub25pY2FsX3BhcnRzLCAiLyIpOwotICBpZiAoIXBhdGguZW1wdHkoKSAmJiBwYXRoWzBdID09ICcvJykgewotICAgIC8vIFJlc3RvcmUgbGVhZGluZyBzbGFzaC4KLSAgICByZXN1bHQgPSAnLycgKyByZXN1bHQ7Ci0gIH0KLSAgaWYgKCFwYXRoLmVtcHR5KCkgJiYgTGFzdENoYXIocGF0aCkgPT0gJy8nICYmCi0gICAgICAhcmVzdWx0LmVtcHR5KCkgJiYgTGFzdENoYXIocmVzdWx0KSAhPSAnLycpIHsKLSAgICAvLyBSZXN0b3JlIHRyYWlsaW5nIHNsYXNoLgotICAgIHJlc3VsdCArPSAnLyc7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIGlubGluZSBib29sIENvbnRhaW5zUGFyZW50UmVmZXJlbmNlKGNvbnN0IHN0cmluZyYgcGF0aCkgewotICByZXR1cm4gcGF0aCA9PSAiLi4iIHx8Ci0gICAgICAgICBIYXNQcmVmaXhTdHJpbmcocGF0aCwgIi4uLyIpIHx8Ci0gICAgICAgICBIYXNTdWZmaXhTdHJpbmcocGF0aCwgIi8uLiIpIHx8Ci0gICAgICAgICBwYXRoLmZpbmQoIi8uLi8iKSAhPSBzdHJpbmc6Om5wb3M7Ci19Ci0KLS8vIE1hcHMgYSBmaWxlIGZyb20gYW4gb2xkIGxvY2F0aW9uIHRvIGEgbmV3IG9uZS4gIFR5cGljYWxseSwgb2xkX3ByZWZpeCBpcwotLy8gYSB2aXJ0dWFsIHBhdGggYW5kIG5ld19wcmVmaXggaXMgaXRzIGNvcnJlc3BvbmRpbmcgZGlzayBwYXRoLiAgUmV0dXJucwotLy8gZmFsc2UgaWYgdGhlIGZpbGVuYW1lIGRpZCBub3Qgc3RhcnQgd2l0aCBvbGRfcHJlZml4LCBvdGhlcndpc2UgcmVwbGFjZXMKLS8vIG9sZF9wcmVmaXggd2l0aCBuZXdfcHJlZml4IGFuZCBzdG9yZXMgdGhlIHJlc3VsdCBpbiAqcmVzdWx0LiAgRXhhbXBsZXM6Ci0vLyAgIHN0cmluZyByZXN1bHQ7Ci0vLyAgIGFzc2VydChBcHBseU1hcHBpbmcoImZvby9iYXIiLCAiIiwgImJheiIsICZyZXN1bHQpKTsKLS8vICAgYXNzZXJ0KHJlc3VsdCA9PSAiYmF6L2Zvby9iYXIiKTsKLS8vCi0vLyAgIGFzc2VydChBcHBseU1hcHBpbmcoImZvby9iYXIiLCAiZm9vIiwgImJheiIsICZyZXN1bHQpKTsKLS8vICAgYXNzZXJ0KHJlc3VsdCA9PSAiYmF6L2JhciIpOwotLy8KLS8vICAgYXNzZXJ0KEFwcGx5TWFwcGluZygiZm9vIiwgImZvbyIsICJiYXIiLCAmcmVzdWx0KSk7Ci0vLyAgIGFzc2VydChyZXN1bHQgPT0gImJhciIpOwotLy8KLS8vICAgYXNzZXJ0KCFBcHBseU1hcHBpbmcoImZvby9iYXIiLCAiYmF6IiwgInF1eCIsICZyZXN1bHQpKTsKLS8vICAgYXNzZXJ0KCFBcHBseU1hcHBpbmcoImZvby9iYXIiLCAiYmF6IiwgInF1eCIsICZyZXN1bHQpKTsKLS8vICAgYXNzZXJ0KCFBcHBseU1hcHBpbmcoImZvb2JhciIsICJmb28iLCAiYmF6IiwgJnJlc3VsdCkpOwotc3RhdGljIGJvb2wgQXBwbHlNYXBwaW5nKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvbGRfcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmV3X3ByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHJlc3VsdCkgewotICBpZiAob2xkX3ByZWZpeC5lbXB0eSgpKSB7Ci0gICAgLy8gb2xkX3ByZWZpeCBtYXRjaGVzIGFueSByZWxhdGl2ZSBwYXRoLgotICAgIGlmIChDb250YWluc1BhcmVudFJlZmVyZW5jZShmaWxlbmFtZSkpIHsKLSAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyB0aGUgZmlsZSBuYW1lIHRvIHVzZSAiLi4iLgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAoSGFzUHJlZml4U3RyaW5nKGZpbGVuYW1lLCAiLyIpIHx8Ci0gICAgICAgIElzV2luZG93c0Fic29sdXRlUGF0aChmaWxlbmFtZSkpIHsKLSAgICAgIC8vIFRoaXMgaXMgYW4gYWJzb2x1dGUgcGF0aCwgc28gaXQgaXNuJ3QgbWF0Y2hlZCBieSB0aGUgZW1wdHkgc3RyaW5nLgotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICByZXN1bHQtPmFzc2lnbihuZXdfcHJlZml4KTsKLSAgICBpZiAoIXJlc3VsdC0+ZW1wdHkoKSkgcmVzdWx0LT5wdXNoX2JhY2soJy8nKTsKLSAgICByZXN1bHQtPmFwcGVuZChmaWxlbmFtZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoSGFzUHJlZml4U3RyaW5nKGZpbGVuYW1lLCBvbGRfcHJlZml4KSkgewotICAgIC8vIG9sZF9wcmVmaXggaXMgYSBwcmVmaXggb2YgdGhlIGZpbGVuYW1lLiAgSXMgaXQgdGhlIHdob2xlIGZpbGVuYW1lPwotICAgIGlmIChmaWxlbmFtZS5zaXplKCkgPT0gb2xkX3ByZWZpeC5zaXplKCkpIHsKLSAgICAgIC8vIFllcCwgaXQncyBhbiBleGFjdCBtYXRjaC4KLSAgICAgICpyZXN1bHQgPSBuZXdfcHJlZml4OwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vdCBhbiBleGFjdCBtYXRjaC4gIElzIHRoZSBuZXh0IGNoYXJhY3RlciBhICcvJz8gIE90aGVyd2lzZSwKLSAgICAgIC8vIHRoaXMgaXNuJ3QgYWN0dWFsbHkgYSBtYXRjaCBhdCBhbGwuICBFLmcuIHRoZSBwcmVmaXggImZvby9iYXIiCi0gICAgICAvLyBkb2VzIG5vdCBtYXRjaCB0aGUgZmlsZW5hbWUgImZvby9iYXJiYXoiLgotICAgICAgaW50IGFmdGVyX3ByZWZpeF9zdGFydCA9IC0xOwotICAgICAgaWYgKGZpbGVuYW1lW29sZF9wcmVmaXguc2l6ZSgpXSA9PSAnLycpIHsKLSAgICAgICAgYWZ0ZXJfcHJlZml4X3N0YXJ0ID0gb2xkX3ByZWZpeC5zaXplKCkgKyAxOwotICAgICAgfSBlbHNlIGlmIChmaWxlbmFtZVtvbGRfcHJlZml4LnNpemUoKSAtIDFdID09ICcvJykgewotICAgICAgICAvLyBvbGRfcHJlZml4IGlzIG5ldmVyIGVtcHR5LCBhbmQgY2Fub25pY2FsaXplZCBwYXRocyBuZXZlciBoYXZlCi0gICAgICAgIC8vIGNvbnNlY3V0aXZlICcvJyBjaGFyYWN0ZXJzLgotICAgICAgICBhZnRlcl9wcmVmaXhfc3RhcnQgPSBvbGRfcHJlZml4LnNpemUoKTsKLSAgICAgIH0KLSAgICAgIGlmIChhZnRlcl9wcmVmaXhfc3RhcnQgIT0gLTEpIHsKLSAgICAgICAgLy8gWWVwLiAgU28gdGhlIHByZWZpeGVzIGFyZSBkaXJlY3RvcmllcyBhbmQgdGhlIGZpbGVuYW1lIGlzIGEgZmlsZQotICAgICAgICAvLyBpbnNpZGUgdGhlbS4KLSAgICAgICAgc3RyaW5nIGFmdGVyX3ByZWZpeCA9IGZpbGVuYW1lLnN1YnN0cihhZnRlcl9wcmVmaXhfc3RhcnQpOwotICAgICAgICBpZiAoQ29udGFpbnNQYXJlbnRSZWZlcmVuY2UoYWZ0ZXJfcHJlZml4KSkgewotICAgICAgICAgIC8vIFdlIGRvIG5vdCBhbGxvdyB0aGUgZmlsZSBuYW1lIHRvIHVzZSAiLi4iLgotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQtPmFzc2lnbihuZXdfcHJlZml4KTsKLSAgICAgICAgaWYgKCFyZXN1bHQtPmVtcHR5KCkpIHJlc3VsdC0+cHVzaF9iYWNrKCcvJyk7Ci0gICAgICAgIHJlc3VsdC0+YXBwZW5kKGFmdGVyX3ByZWZpeCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiBmYWxzZTsKLX0KLQotdm9pZCBEaXNrU291cmNlVHJlZTo6TWFwUGF0aChjb25zdCBzdHJpbmcmIHZpcnR1YWxfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkaXNrX3BhdGgpIHsKLSAgbWFwcGluZ3NfLnB1c2hfYmFjayhNYXBwaW5nKHZpcnR1YWxfcGF0aCwgQ2Fub25pY2FsaXplUGF0aChkaXNrX3BhdGgpKSk7Ci19Ci0KLURpc2tTb3VyY2VUcmVlOjpEaXNrRmlsZVRvVmlydHVhbEZpbGVSZXN1bHQKLURpc2tTb3VyY2VUcmVlOjpEaXNrRmlsZVRvVmlydHVhbEZpbGUoCi0gICAgY29uc3Qgc3RyaW5nJiBkaXNrX2ZpbGUsCi0gICAgc3RyaW5nKiB2aXJ0dWFsX2ZpbGUsCi0gICAgc3RyaW5nKiBzaGFkb3dpbmdfZGlza19maWxlKSB7Ci0gIGludCBtYXBwaW5nX2luZGV4ID0gLTE7Ci0gIHN0cmluZyBjYW5vbmljYWxfZGlza19maWxlID0gQ2Fub25pY2FsaXplUGF0aChkaXNrX2ZpbGUpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ3NfLnNpemUoKTsgaSsrKSB7Ci0gICAgLy8gQXBwbHkgdGhlIG1hcHBpbmcgaW4gcmV2ZXJzZS4KLSAgICBpZiAoQXBwbHlNYXBwaW5nKGNhbm9uaWNhbF9kaXNrX2ZpbGUsIG1hcHBpbmdzX1tpXS5kaXNrX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICBtYXBwaW5nc19baV0udmlydHVhbF9wYXRoLCB2aXJ0dWFsX2ZpbGUpKSB7Ci0gICAgICAvLyBTdWNjZXNzLgotICAgICAgbWFwcGluZ19pbmRleCA9IGk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBpZiAobWFwcGluZ19pbmRleCA9PSAtMSkgewotICAgIHJldHVybiBOT19NQVBQSU5HOwotICB9Ci0KLSAgLy8gSXRlcmF0ZSB0aHJvdWdoIGFsbCBtYXBwaW5ncyB3aXRoIGhpZ2hlciBwcmVjZWRlbmNlIGFuZCB2ZXJpZnkgdGhhdCBub25lCi0gIC8vIG9mIHRoZW0gbWFwIHRoaXMgZmlsZSB0byBzb21lIG90aGVyIGV4aXN0aW5nIGZpbGUuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWFwcGluZ19pbmRleDsgaSsrKSB7Ci0gICAgaWYgKEFwcGx5TWFwcGluZygqdmlydHVhbF9maWxlLCBtYXBwaW5nc19baV0udmlydHVhbF9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgbWFwcGluZ3NfW2ldLmRpc2tfcGF0aCwgc2hhZG93aW5nX2Rpc2tfZmlsZSkpIHsKLSAgICAgIGlmIChhY2Nlc3Moc2hhZG93aW5nX2Rpc2tfZmlsZS0+Y19zdHIoKSwgRl9PSykgPj0gMCkgewotICAgICAgICAvLyBGaWxlIGV4aXN0cy4KLSAgICAgICAgcmV0dXJuIFNIQURPV0VEOwotICAgICAgfQotICAgIH0KLSAgfQotICBzaGFkb3dpbmdfZGlza19maWxlLT5jbGVhcigpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHdlIGNhbiBvcGVuIHRoZSBmaWxlLiAgTm90ZSB0aGF0IHRoaXMgYWxzbyBoYXMgdGhlIHNpZGUtZWZmZWN0Ci0gIC8vIG9mIHZlcmlmeWluZyB0aGF0IHdlIGFyZSBub3QgY2Fub25pY2FsaXppbmcgYXdheSBhbnkgbm9uLWV4aXN0ZW50Ci0gIC8vIGRpcmVjdG9yaWVzLgotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBzdHJlYW0oT3BlbkRpc2tGaWxlKGRpc2tfZmlsZSkpOwotICBpZiAoc3RyZWFtID09IE5VTEwpIHsKLSAgICByZXR1cm4gQ0FOTk9UX09QRU47Ci0gIH0KLQotICByZXR1cm4gU1VDQ0VTUzsKLX0KLQotYm9vbCBEaXNrU291cmNlVHJlZTo6VmlydHVhbEZpbGVUb0Rpc2tGaWxlKGNvbnN0IHN0cmluZyYgdmlydHVhbF9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZGlza19maWxlKSB7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IHN0cmVhbSgKLSAgICAgIE9wZW5WaXJ0dWFsRmlsZSh2aXJ0dWFsX2ZpbGUsIGRpc2tfZmlsZSkpOwotICByZXR1cm4gc3RyZWFtICE9IE5VTEw7Ci19Ci0KLWlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBEaXNrU291cmNlVHJlZTo6T3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIHJldHVybiBPcGVuVmlydHVhbEZpbGUoZmlsZW5hbWUsIE5VTEwpOwotfQotCi1zdHJpbmcgRGlza1NvdXJjZVRyZWU6OkdldExhc3RFcnJvck1lc3NhZ2UoKSB7Ci0gIHJldHVybiBsYXN0X2Vycm9yX21lc3NhZ2VfOwotfQotCi1pbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogRGlza1NvdXJjZVRyZWU6Ok9wZW5WaXJ0dWFsRmlsZSgKLSAgICBjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZSwKLSAgICBzdHJpbmcqIGRpc2tfZmlsZSkgewotICBpZiAodmlydHVhbF9maWxlICE9IENhbm9uaWNhbGl6ZVBhdGgodmlydHVhbF9maWxlKSB8fAotICAgICAgQ29udGFpbnNQYXJlbnRSZWZlcmVuY2UodmlydHVhbF9maWxlKSkgewotICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBpbXBvcnRpbmcgb2YgcGF0aHMgY29udGFpbmluZyB0aGluZ3MgbGlrZSAiLi4iIG9yCi0gICAgLy8gY29uc2VjdXRpdmUgc2xhc2hlcyBzaW5jZSB0aGUgY29tcGlsZXIgZXhwZWN0cyBmaWxlcyB0byBiZSB1bmlxdWVseQotICAgIC8vIGlkZW50aWZpZWQgYnkgZmlsZSBuYW1lLgotICAgIGxhc3RfZXJyb3JfbWVzc2FnZV8gPSAiQmFja3NsYXNoZXMsIGNvbnNlY3V0aXZlIHNsYXNoZXMsIFwiLlwiLCBvciBcIi4uXCIgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJlIG5vdCBhbGxvd2VkIGluIHRoZSB2aXJ0dWFsIHBhdGgiOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtYXBwaW5nc18uc2l6ZSgpOyBpKyspIHsKLSAgICBzdHJpbmcgdGVtcF9kaXNrX2ZpbGU7Ci0gICAgaWYgKEFwcGx5TWFwcGluZyh2aXJ0dWFsX2ZpbGUsIG1hcHBpbmdzX1tpXS52aXJ0dWFsX3BhdGgsCi0gICAgICAgICAgICAgICAgICAgICBtYXBwaW5nc19baV0uZGlza19wYXRoLCAmdGVtcF9kaXNrX2ZpbGUpKSB7Ci0gICAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogc3RyZWFtID0gT3BlbkRpc2tGaWxlKHRlbXBfZGlza19maWxlKTsKLSAgICAgIGlmIChzdHJlYW0gIT0gTlVMTCkgewotICAgICAgICBpZiAoZGlza19maWxlICE9IE5VTEwpIHsKLSAgICAgICAgICAqZGlza19maWxlID0gdGVtcF9kaXNrX2ZpbGU7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHN0cmVhbTsKLSAgICAgIH0KLQotICAgICAgaWYgKGVycm5vID09IEVBQ0NFUykgewotICAgICAgICAvLyBUaGUgZmlsZSBleGlzdHMgYnV0IGlzIG5vdCByZWFkYWJsZS4KLSAgICAgICAgbGFzdF9lcnJvcl9tZXNzYWdlXyA9ICJSZWFkIGFjY2VzcyBpcyBkZW5pZWQgZm9yIGZpbGU6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kaXNrX2ZpbGU7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgIH0KLSAgfQotICBsYXN0X2Vycm9yX21lc3NhZ2VfID0gIkZpbGUgbm90IGZvdW5kLiI7Ci0gIHJldHVybiBOVUxMOwotfQotCi1pbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogRGlza1NvdXJjZVRyZWU6Ok9wZW5EaXNrRmlsZSgKLSAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIGludCBmaWxlX2Rlc2NyaXB0b3I7Ci0gIGRvIHsKLSAgICBmaWxlX2Rlc2NyaXB0b3IgPSBvcGVuKGZpbGVuYW1lLmNfc3RyKCksIE9fUkRPTkxZKTsKLSAgfSB3aGlsZSAoZmlsZV9kZXNjcmlwdG9yIDwgMCAmJiBlcnJubyA9PSBFSU5UUik7Ci0gIGlmIChmaWxlX2Rlc2NyaXB0b3IgPj0gMCkgewotICAgIGlvOjpGaWxlSW5wdXRTdHJlYW0qIHJlc3VsdCA9IG5ldyBpbzo6RmlsZUlucHV0U3RyZWFtKGZpbGVfZGVzY3JpcHRvcik7Ci0gICAgcmVzdWx0LT5TZXRDbG9zZU9uRGVsZXRlKHRydWUpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2M4ZmNjMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMjYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgZmlsZSBpcyB0aGUgcHVibGljIGludGVyZmFjZSB0byB0aGUgLnByb3RvIGZpbGUgcGFyc2VyLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9JTVBPUlRFUl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0lNUE9SVEVSX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxzZXQ+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLW5hbWVzcGFjZSBpbyB7IGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07IH0KLQotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCi1jbGFzcyBJbXBvcnRlcjsKLWNsYXNzIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yOwotY2xhc3MgU291cmNlVHJlZTsKLWNsYXNzIERpc2tTb3VyY2VUcmVlOwotCi0vLyBUT0RPKGtlbnRvbik6ICBNb3ZlIGFsbCBTb3VyY2VUcmVlIHN0dWZmIHRvIGEgc2VwYXJhdGUgZmlsZT8KLQotLy8gQW4gaW1wbGVtZW50YXRpb24gb2YgRGVzY3JpcHRvckRhdGFiYXNlIHdoaWNoIGxvYWRzIGZpbGVzIGZyb20gYSBTb3VyY2VUcmVlCi0vLyBhbmQgcGFyc2VzIHRoZW0uCi0vLwotLy8gTm90ZTogIFRoaXMgY2xhc3MgaXMgbm90IHRocmVhZC1zYWZlIHNpbmNlIGl0IG1haW50YWlucyBhIHRhYmxlIG9mIHNvdXJjZQotLy8gICBjb2RlIGxvY2F0aW9ucyBmb3IgZXJyb3IgcmVwb3J0aW5nLiAgSG93ZXZlciwgd2hlbiBhIERlc2NyaXB0b3JQb29sIHdyYXBzCi0vLyAgIGEgRGVzY3JpcHRvckRhdGFiYXNlLCBpdCB1c2VzIG11dGV4IGxvY2tpbmcgdG8gbWFrZSBzdXJlIG9ubHkgb25lIG1ldGhvZAotLy8gICBvZiB0aGUgZGF0YWJhc2UgaXMgY2FsbGVkIGF0IGEgdGltZSwgZXZlbiBpZiB0aGUgRGVzY3JpcHRvclBvb2wgaXMgdXNlZAotLy8gICBmcm9tIG11bHRpcGxlIHRocmVhZHMuICBUaGVyZWZvcmUsIHRoZXJlIGlzIG9ubHkgYSBwcm9ibGVtIGlmIHlvdSBjcmVhdGUKLS8vICAgbXVsdGlwbGUgRGVzY3JpcHRvclBvb2xzIHdyYXBwaW5nIHRoZSBzYW1lIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UKLS8vICAgYW5kIHVzZSB0aGVtIGZyb20gbXVsdGlwbGUgdGhyZWFkcy4KLS8vCi0vLyBOb3RlOiAgVGhpcyBjbGFzcyBkb2VzIG5vdCBpbXBsZW1lbnQgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCkgb3IKLS8vICAgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCk7IHRoZXNlIHdpbGwgYWx3YXlzIHJldHVybiBmYWxzZS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7Ci0gcHVibGljOgotICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlKTsKLSAgflNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UoKTsKLQotICAvLyBJbnN0cnVjdHMgdGhlIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgdG8gcmVwb3J0IGFueSBwYXJzZSBlcnJvcnMKLSAgLy8gdG8gdGhlIGdpdmVuIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yLiAgVGhpcyBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZQotICAvLyBwYXJzaW5nLiAgZXJyb3JfY29sbGVjdG9yIG11c3QgcmVtYWluIHZhbGlkIHVudGlsIGVpdGhlciB0aGlzIG1ldGhvZAotICAvLyBpcyBjYWxsZWQgYWdhaW4gb3IgdGhlIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgaXMgZGVzdHJveWVkLgotICB2b2lkIFJlY29yZEVycm9yc1RvKE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpIHsKLSAgICBlcnJvcl9jb2xsZWN0b3JfID0gZXJyb3JfY29sbGVjdG9yOwotICB9Ci0KLSAgLy8gR2V0cyBhIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB3aGljaCByZWNvcmRzIGVycm9ycyB0byB0aGUKLSAgLy8gTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3Igc3BlY2lmaWVkIHdpdGggUmVjb3JkRXJyb3JzVG8oKS4gIFRoaXMgY29sbGVjdG9yCi0gIC8vIGhhcyB0aGUgYWJpbGl0eSB0byBkZXRlcm1pbmUgZXhhY3QgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgb2YgZXJyb3JzCi0gIC8vIGZyb20gdGhlIGluZm9ybWF0aW9uIGdpdmVuIHRvIGl0IGJ5IHRoZSBEZXNjcmlwdG9yUG9vbC4KLSAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yKiBHZXRWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3IoKSB7Ci0gICAgdXNpbmdfdmFsaWRhdGlvbl9lcnJvcl9jb2xsZWN0b3JfID0gdHJ1ZTsKLSAgICByZXR1cm4gJnZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yXzsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLSAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLSAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBTaW5nbGVGaWxlRXJyb3JDb2xsZWN0b3I7Ci0KLSAgU291cmNlVHJlZSogc291cmNlX3RyZWVfOwotICBNdWx0aUZpbGVFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKLQotICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7Ci0gICBwdWJsaWM6Ci0gICAgVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UqIG93bmVyKTsKLSAgICB+VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCk7Ci0KLSAgICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpOwotCi0gICAgdmlydHVhbCB2b2lkIEFkZFdhcm5pbmcoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKLQotICAgcHJpdmF0ZToKLSAgICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKiBvd25lcl87Ci0gIH07Ci0gIGZyaWVuZCBjbGFzcyBWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I7Ci0KLSAgYm9vbCB1c2luZ192YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl87Ci0gIFNvdXJjZUxvY2F0aW9uVGFibGUgc291cmNlX2xvY2F0aW9uc187Ci0gIFZhbGlkYXRpb25FcnJvckNvbGxlY3RvciB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3Rvcl87Ci19OwotCi0vLyBTaW1wbGUgaW50ZXJmYWNlIGZvciBwYXJzaW5nIC5wcm90byBmaWxlcy4gIFRoaXMgd3JhcHMgdGhlIHByb2Nlc3MKLS8vIG9mIG9wZW5pbmcgdGhlIGZpbGUsIHBhcnNpbmcgaXQgd2l0aCBhIFBhcnNlciwgcmVjdXJzaXZlbHkgcGFyc2luZyBhbGwgaXRzCi0vLyBpbXBvcnRzLCBhbmQgdGhlbiBjcm9zcy1saW5raW5nIHRoZSByZXN1bHRzIHRvIHByb2R1Y2UgYSBGaWxlRGVzY3JpcHRvci4KLS8vCi0vLyBUaGlzIGlzIHJlYWxseSBqdXN0IGEgdGhpbiB3cmFwcGVyIGFyb3VuZCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlLgotLy8gWW91IG1heSBmaW5kIHRoYXQgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBpcyBtb3JlIGZsZXhpYmxlLgotLy8KLS8vIFRPRE8oa2VudG9uKTogIEkgZmVlbCBsaWtlIHRoaXMgY2xhc3MgaXMgbm90IHdlbGwtbmFtZWQuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgSW1wb3J0ZXIgewotIHB1YmxpYzoKLSAgSW1wb3J0ZXIoU291cmNlVHJlZSogc291cmNlX3RyZWUsCi0gICAgICAgICAgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpOwotICB+SW1wb3J0ZXIoKTsKLQotICAvLyBJbXBvcnQgdGhlIGdpdmVuIGZpbGUgYW5kIGJ1aWxkIGEgRmlsZURlc2NyaXB0b3IgcmVwcmVzZW50aW5nIGl0LiAgSWYKLSAgLy8gdGhlIGZpbGUgaXMgYWxyZWFkeSBpbiB0aGUgRGVzY3JpcHRvclBvb2wsIHRoZSBleGlzdGluZyBGaWxlRGVzY3JpcHRvcgotICAvLyB3aWxsIGJlIHJldHVybmVkLiAgVGhlIEZpbGVEZXNjcmlwdG9yIGlzIHByb3BlcnR5IG9mIHRoZSBEZXNjcmlwdG9yUG9vbCwKLSAgLy8gYW5kIHdpbGwgcmVtYWluIHZhbGlkIHVudGlsIGl0IGlzIGRlc3Ryb3llZC4gIElmIGFueSBlcnJvcnMgb2NjdXIsIHRoZXkKLSAgLy8gd2lsbCBiZSByZXBvcnRlZCB1c2luZyB0aGUgZXJyb3IgY29sbGVjdG9yIGFuZCBJbXBvcnQoKSB3aWxsIHJldHVybiBOVUxMLgotICAvLwotICAvLyBBIHBhcnRpY3VsYXIgSW1wb3J0ZXIgb2JqZWN0IHdpbGwgb25seSByZXBvcnQgZXJyb3JzIGZvciBhIHBhcnRpY3VsYXIKLSAgLy8gZmlsZSBvbmNlLiAgQWxsIGZ1dHVyZSBhdHRlbXB0cyB0byBpbXBvcnQgdGhlIHNhbWUgZmlsZSB3aWxsIHJldHVybiBOVUxMCi0gIC8vIHdpdGhvdXQgcmVwb3J0aW5nIGFueSBlcnJvcnMuICBUaGUgaWRlYSBpcyB0aGF0IHlvdSBtaWdodCB3YW50IHRvIGltcG9ydAotICAvLyBhIGxvdCBvZiBmaWxlcyB3aXRob3V0IHNlZWluZyB0aGUgc2FtZSBlcnJvcnMgb3ZlciBhbmQgb3ZlciBhZ2Fpbi4gIElmCi0gIC8vIHlvdSB3YW50IHRvIHNlZSBlcnJvcnMgZm9yIHRoZSBzYW1lIGZpbGVzIHJlcGVhdGVkbHksIHlvdSBjYW4gdXNlIGEKLSAgLy8gc2VwYXJhdGUgSW1wb3J0ZXIgb2JqZWN0IHRvIGltcG9ydCBlYWNoIG9uZSAoYnV0IHVzZSB0aGUgc2FtZQotICAvLyBEZXNjcmlwdG9yUG9vbCBzbyB0aGF0IHRoZXkgY2FuIGJlIGNyb3NzLWxpbmtlZCkuCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBJbXBvcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7Ci0KLSAgLy8gVGhlIERlc2NyaXB0b3JQb29sIGluIHdoaWNoIGFsbCBpbXBvcnRlZCBGaWxlRGVzY3JpcHRvcnMgYW5kIHRoZWlyCi0gIC8vIGNvbnRlbnRzIGFyZSBzdG9yZWQuCi0gIGlubGluZSBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gJnBvb2xfOwotICB9Ci0KLSAgdm9pZCBBZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlX25hbWUpOwotICB2b2lkIENsZWFyVW51c2VkSW1wb3J0VHJhY2tGaWxlcygpOwotCi0gcHJpdmF0ZToKLSAgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBkYXRhYmFzZV87Ci0gIERlc2NyaXB0b3JQb29sIHBvb2xfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbXBvcnRlcik7Ci19OwotCi0vLyBJZiB0aGUgaW1wb3J0ZXIgZW5jb3VudGVycyBwcm9ibGVtcyB3aGlsZSB0cnlpbmcgdG8gaW1wb3J0IHRoZSBwcm90byBmaWxlcywKLS8vIGl0IHJlcG9ydHMgdGhlbSB0byBhIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHsKLSBwdWJsaWM6Ci0gIGlubGluZSBNdWx0aUZpbGVFcnJvckNvbGxlY3RvcigpIHt9Ci0gIHZpcnR1YWwgfk11bHRpRmlsZUVycm9yQ29sbGVjdG9yKCk7Ci0KLSAgLy8gTGluZSBhbmQgY29sdW1uIG51bWJlcnMgYXJlIHplcm8tYmFzZWQuICBBIGxpbmUgbnVtYmVyIG9mIC0xIGluZGljYXRlcwotICAvLyBhbiBlcnJvciB3aXRoIHRoZSBlbnRpcmUgZmlsZSAoZS5nLiAibm90IGZvdW5kIikuCi0gIHZpcnR1YWwgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBBZGRXYXJuaW5nKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHt9Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IpOwotfTsKLQotLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHdoaWNoIHJlcHJlc2VudHMgYSBkaXJlY3RvcnkgdHJlZSBjb250YWluaW5nIHByb3RvIGZpbGVzLgotLy8gVXNlZCBieSB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBvZiBJbXBvcnRlciB0byByZXNvbHZlIGltcG9ydCBzdGF0ZW1lbnRzCi0vLyBNb3N0IHVzZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0byB1c2UgdGhlIERpc2tTb3VyY2VUcmVlIGltcGxlbWVudGF0aW9uLAotLy8gYmVsb3cuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU291cmNlVHJlZSB7Ci0gcHVibGljOgotICBpbmxpbmUgU291cmNlVHJlZSgpIHt9Ci0gIHZpcnR1YWwgflNvdXJjZVRyZWUoKTsKLQotICAvLyBPcGVuIHRoZSBnaXZlbiBmaWxlIGFuZCByZXR1cm4gYSBzdHJlYW0gdGhhdCByZWFkcyBpdCwgb3IgTlVMTCBpZiBub3QKLSAgLy8gZm91bmQuICBUaGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgb2JqZWN0LiAgVGhlIGZpbGVuYW1lCi0gIC8vIG11c3QgYmUgYSBwYXRoIHJlbGF0aXZlIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSBhbmQgbXVzdCBub3QKLSAgLy8gY29udGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzLgotICB2aXJ0dWFsIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpID0gMDsKLQotICAvLyBJZiBPcGVuKCkgcmV0dXJucyBOVUxMLCBjYWxsaW5nIHRoaXMgbWV0aG9kIGltbWVkaWF0ZWx5IHdpbGwgcmV0dXJuIGFuCi0gIC8vIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4KLSAgLy8gU3ViY2xhc3NlcyBzaG91bGQgaW1wbGVtZW50IHRoaXMgbWV0aG9kIGFuZCByZXR1cm4gYSBtZWFuaW5nZnVsIHZhbHVlIGZvcgotICAvLyBiZXR0ZXIgZXJyb3IgcmVwb3J0aW5nLgotICAvLyBUT0RPKHhpYW9mZW5nKTogY2hhbmdlIHRoaXMgdG8gYSBwdXJlIHZpcnR1YWwgZnVuY3Rpb24uCi0gIHZpcnR1YWwgc3RyaW5nIEdldExhc3RFcnJvck1lc3NhZ2UoKTsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTb3VyY2VUcmVlKTsKLX07Ci0KLS8vIEFuIGltcGxlbWVudGF0aW9uIG9mIFNvdXJjZVRyZWUgd2hpY2ggbG9hZHMgZmlsZXMgZnJvbSBsb2NhdGlvbnMgb24gZGlzay4KLS8vIE11bHRpcGxlIG1hcHBpbmdzIGNhbiBiZSBzZXQgdXAgdG8gbWFwIGxvY2F0aW9ucyBpbiB0aGUgRGlza1NvdXJjZVRyZWUgdG8KLS8vIGxvY2F0aW9ucyBpbiB0aGUgcGh5c2ljYWwgZmlsZXN5c3RlbS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEaXNrU291cmNlVHJlZSA6IHB1YmxpYyBTb3VyY2VUcmVlIHsKLSBwdWJsaWM6Ci0gIERpc2tTb3VyY2VUcmVlKCk7Ci0gIH5EaXNrU291cmNlVHJlZSgpOwotCi0gIC8vIE1hcCBhIHBhdGggb24gZGlzayB0byBhIGxvY2F0aW9uIGluIHRoZSBTb3VyY2VUcmVlLiAgVGhlIHBhdGggbWF5IGJlCi0gIC8vIGVpdGhlciBhIGZpbGUgb3IgYSBkaXJlY3RvcnkuICBJZiBpdCBpcyBhIGRpcmVjdG9yeSwgdGhlIGVudGlyZSB0cmVlCi0gIC8vIHVuZGVyIGl0IHdpbGwgYmUgbWFwcGVkIHRvIHRoZSBnaXZlbiB2aXJ0dWFsIGxvY2F0aW9uLiAgVG8gbWFwIGEgZGlyZWN0b3J5Ci0gIC8vIHRvIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZSwgcGFzcyBhbiBlbXB0eSBzdHJpbmcgZm9yIHZpcnR1YWxfcGF0aC4KLSAgLy8KLSAgLy8gSWYgbXVsdGlwbGUgbWFwcGVkIHBhdGhzIGFwcGx5IHdoZW4gb3BlbmluZyBhIGZpbGUsIHRoZXkgd2lsbCBiZSBzZWFyY2hlZAotICAvLyBpbiBvcmRlci4gIEZvciBleGFtcGxlLCBpZiB5b3UgZG86Ci0gIC8vICAgTWFwUGF0aCgiYmFyIiwgImZvby9iYXIiKTsKLSAgLy8gICBNYXBQYXRoKCIiLCAiYmF6Iik7Ci0gIC8vIGFuZCB0aGVuIHlvdSBkbzoKLSAgLy8gICBPcGVuKCJiYXIvcXV4Iik7Ci0gIC8vIHRoZSBEaXNrU291cmNlVHJlZSB3aWxsIGZpcnN0IHRyeSB0byBvcGVuIGZvby9iYXIvcXV4LCB0aGVuIGJhei9iYXIvcXV4LAotICAvLyByZXR1cm5pbmcgdGhlIGZpcnN0IG9uZSB0aGF0IG9wZW5zIHN1Y2Nlc3NmdWx5LgotICAvLwotICAvLyBkaXNrX3BhdGggbWF5IGJlIGFuIGFic29sdXRlIHBhdGggb3IgcmVsYXRpdmUgdG8gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LAotICAvLyBqdXN0IGxpa2UgYSBwYXRoIHlvdSdkIHBhc3MgdG8gb3BlbigpLgotICB2b2lkIE1hcFBhdGgoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX3BhdGgsIGNvbnN0IHN0cmluZyYgZGlza19wYXRoKTsKLQotICAvLyBSZXR1cm4gdHlwZSBmb3IgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKCkuCi0gIGVudW0gRGlza0ZpbGVUb1ZpcnR1YWxGaWxlUmVzdWx0IHsKLSAgICBTVUNDRVNTLAotICAgIFNIQURPV0VELAotICAgIENBTk5PVF9PUEVOLAotICAgIE5PX01BUFBJTkcKLSAgfTsKLQotICAvLyBHaXZlbiBhIHBhdGggdG8gYSBmaWxlIG9uIGRpc2ssIGZpbmQgYSB2aXJ0dWFsIHBhdGggbWFwcGluZyB0byB0aGF0Ci0gIC8vIGZpbGUuICBUaGUgZmlyc3QgbWFwcGluZyBjcmVhdGVkIHdpdGggTWFwUGF0aCgpIHdob3NlIGRpc2tfcGF0aCBjb250YWlucwotICAvLyB0aGUgZmlsZW5hbWUgaXMgdXNlZC4gIEhvd2V2ZXIsIHRoYXQgdmlydHVhbCBwYXRoIG1heSBub3QgYWN0dWFsbHkgYmUKLSAgLy8gdXNhYmxlIHRvIG9wZW4gdGhlIGdpdmVuIGZpbGUuICBQb3NzaWJsZSByZXR1cm4gdmFsdWVzIGFyZToKLSAgLy8gKiBTVUNDRVNTOiBUaGUgbWFwcGluZyB3YXMgZm91bmQuICAqdmlydHVhbF9maWxlIGlzIGZpbGxlZCBpbiBzbyB0aGF0Ci0gIC8vICAgY2FsbGluZyBPcGVuKCp2aXJ0dWFsX2ZpbGUpIHdpbGwgb3BlbiB0aGUgZmlsZSBuYW1lZCBieSBkaXNrX2ZpbGUuCi0gIC8vICogU0hBRE9XRUQ6IEEgbWFwcGluZyB3YXMgZm91bmQsIGJ1dCB1c2luZyBPcGVuKCkgdG8gb3BlbiB0aGlzIHZpcnR1YWwKLSAgLy8gICBwYXRoIHdpbGwgZW5kIHVwIHJldHVybmluZyBzb21lIGRpZmZlcmVudCBmaWxlLiAgVGhpcyBpcyBiZWNhdXNlIHNvbWUKLSAgLy8gICBvdGhlciBtYXBwaW5nIHdpdGggYSBoaWdoZXIgcHJlY2VkZW5jZSBhbHNvIG1hdGNoZXMgdGhpcyB2aXJ0dWFsIHBhdGgKLSAgLy8gICBhbmQgbWFwcyBpdCB0byBhIGRpZmZlcmVudCBmaWxlIHRoYXQgZXhpc3RzIG9uIGRpc2suICAqdmlydHVhbF9maWxlCi0gIC8vICAgaXMgZmlsbGVkIGluIGFzIGl0IHdvdWxkIGJlIGluIHRoZSBTVUNDRVNTIGNhc2UuICAqc2hhZG93aW5nX2Rpc2tfZmlsZQotICAvLyAgIGlzIGZpbGxlZCBpbiB3aXRoIHRoZSBkaXNrIHBhdGggb2YgdGhlIGZpbGUgd2hpY2ggd291bGQgYmUgb3BlbmVkIGlmCi0gIC8vICAgeW91IHdlcmUgdG8gY2FsbCBPcGVuKCp2aXJ0dWFsX2ZpbGUpLgotICAvLyAqIENBTk5PVF9PUEVOOiBUaGUgbWFwcGluZyB3YXMgZm91bmQgYW5kIHdhcyBub3Qgc2hhZG93ZWQsIGJ1dCB0aGUKLSAgLy8gICBmaWxlIHNwZWNpZmllZCBjYW5ub3QgYmUgb3BlbmVkLiAgV2hlbiB0aGlzIHZhbHVlIGlzIHJldHVybmVkLAotICAvLyAgIGVycm5vIHdpbGwgaW5kaWNhdGUgdGhlIHJlYXNvbiB0aGUgZmlsZSBjYW5ub3QgYmUgb3BlbmVkLiAgKnZpcnR1YWxfZmlsZQotICAvLyAgIHdpbGwgYmUgc2V0IHRvIHRoZSB2aXJ0dWFsIHBhdGggYXMgaW4gdGhlIFNVQ0NFU1MgY2FzZSwgZXZlbiB0aG91Z2gKLSAgLy8gICBpdCBpcyBub3QgdXNlZnVsLgotICAvLyAqIE5PX01BUFBJTkc6IEluZGljYXRlcyB0aGF0IG5vIG1hcHBpbmcgd2FzIGZvdW5kIHdoaWNoIGNvbnRhaW5zIHRoaXMKLSAgLy8gICBmaWxlLgotICBEaXNrRmlsZVRvVmlydHVhbEZpbGVSZXN1bHQKLSAgICBEaXNrRmlsZVRvVmlydHVhbEZpbGUoY29uc3Qgc3RyaW5nJiBkaXNrX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmlydHVhbF9maWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHNoYWRvd2luZ19kaXNrX2ZpbGUpOwotCi0gIC8vIEdpdmVuIGEgdmlydHVhbCBwYXRoLCBmaW5kIHRoZSBwYXRoIHRvIHRoZSBmaWxlIG9uIGRpc2suCi0gIC8vIFJldHVybiB0cnVlIGFuZCB1cGRhdGUgZGlza19maWxlIHdpdGggdGhlIG9uLWRpc2sgcGF0aCBpZiB0aGUgZmlsZSBleGlzdHMuCi0gIC8vIFJldHVybiBmYWxzZSBhbmQgbGVhdmUgZGlza19maWxlIHVudG91Y2hlZCBpZiB0aGUgZmlsZSBkb2Vzbid0IGV4aXN0LgotICBib29sIFZpcnR1YWxGaWxlVG9EaXNrRmlsZShjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZSwgc3RyaW5nKiBkaXNrX2ZpbGUpOwotCi0gIC8vIGltcGxlbWVudHMgU291cmNlVHJlZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZpcnR1YWwgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7Ci0KLSAgdmlydHVhbCBzdHJpbmcgR2V0TGFzdEVycm9yTWVzc2FnZSgpOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IE1hcHBpbmcgewotICAgIHN0cmluZyB2aXJ0dWFsX3BhdGg7Ci0gICAgc3RyaW5nIGRpc2tfcGF0aDsKLQotICAgIGlubGluZSBNYXBwaW5nKGNvbnN0IHN0cmluZyYgdmlydHVhbF9wYXRoX3BhcmFtLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGlza19wYXRoX3BhcmFtKQotICAgICAgOiB2aXJ0dWFsX3BhdGgodmlydHVhbF9wYXRoX3BhcmFtKSwgZGlza19wYXRoKGRpc2tfcGF0aF9wYXJhbSkge30KLSAgfTsKLSAgdmVjdG9yPE1hcHBpbmc+IG1hcHBpbmdzXzsKLSAgc3RyaW5nIGxhc3RfZXJyb3JfbWVzc2FnZV87Ci0KLSAgLy8gTGlrZSBPcGVuKCksIGJ1dCByZXR1cm5zIHRoZSBvbi1kaXNrIHBhdGggaW4gZGlza19maWxlIGlmIGRpc2tfZmlsZSBpcwotICAvLyBub24tTlVMTCBhbmQgdGhlIGZpbGUgY291bGQgYmUgc3VjY2Vzc2Z1bGx5IG9wZW5lZC4KLSAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW5WaXJ0dWFsRmlsZShjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGRpc2tfZmlsZSk7Ci0KLSAgLy8gTGlrZSBPcGVuKCkgYnV0IGdpdmVuIHRoZSBhY3R1YWwgb24tZGlzayBwYXRoLgotICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3BlbkRpc2tGaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEaXNrU291cmNlVHJlZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9JTVBPUlRFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjZlOTcwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotbmFtZXNwYWNlIHsKLQotYm9vbCBGaWxlRXhpc3RzKGNvbnN0IHN0cmluZyYgcGF0aCkgewotICByZXR1cm4gRmlsZTo6RXhpc3RzKHBhdGgpOwotfQotCi0jZGVmaW5lIEVYUEVDVF9TVUJTVFJJTkcobmVlZGxlLCBoYXlzdGFjaykgXAotICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLCAobmVlZGxlKSwgKGhheXN0YWNrKSkKLQotY2xhc3MgTW9ja0Vycm9yQ29sbGVjdG9yIDogcHVibGljIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHsKLSBwdWJsaWM6Ci0gIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9Ci0gIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotCi0gIHN0cmluZyB0ZXh0XzsKLSAgc3RyaW5nIHdhcm5pbmdfdGV4dF87Ci0KLSAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotICB9Ci0KLSAgdm9pZCBBZGRXYXJuaW5nKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAotICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmd2FybmluZ190ZXh0XywgIiQwOiQxOiQyOiAkM1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotICB9Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEEgZHVtbXkgaW1wbGVtZW50YXRpb24gb2YgU291cmNlVHJlZSBiYWNrZWQgYnkgYSBzaW1wbGUgbWFwLgotY2xhc3MgTW9ja1NvdXJjZVRyZWUgOiBwdWJsaWMgU291cmNlVHJlZSB7Ci0gcHVibGljOgotICBNb2NrU291cmNlVHJlZSgpIHt9Ci0gIH5Nb2NrU291cmNlVHJlZSgpIHt9Ci0KLSAgdm9pZCBBZGRGaWxlKGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3QgY2hhciogY29udGVudHMpIHsKLSAgICBmaWxlc19bbmFtZV0gPSBjb250ZW50czsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgU291cmNlVHJlZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKLSAgICBjb25zdCBjaGFyKiBjb250ZW50cyA9IEZpbmRQdHJPck51bGwoZmlsZXNfLCBmaWxlbmFtZSk7Ci0gICAgaWYgKGNvbnRlbnRzID09IE5VTEwpIHsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbmV3IGlvOjpBcnJheUlucHV0U3RyZWFtKGNvbnRlbnRzLCBzdHJsZW4oY29udGVudHMpKTsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgR2V0TGFzdEVycm9yTWVzc2FnZSgpIHsKLSAgICByZXR1cm4gIkZpbGUgbm90IGZvdW5kLiI7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGhhc2hfbWFwPHN0cmluZywgY29uc3QgY2hhcio+IGZpbGVzXzsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgSW1wb3J0ZXJUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgSW1wb3J0ZXJUZXN0KCkKLSAgICA6IGltcG9ydGVyXygmc291cmNlX3RyZWVfLCAmZXJyb3JfY29sbGVjdG9yXykge30KLQotICB2b2lkIEFkZEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgY2hhciogdGV4dCkgewotICAgIHNvdXJjZV90cmVlXy5BZGRGaWxlKGZpbGVuYW1lLCB0ZXh0KTsKLSAgfQotCi0gIC8vIFJldHVybiB0aGUgY29sbGVjdGVkIGVycm9yIHRleHQKLSAgc3RyaW5nIGVycm9yKCkgY29uc3QgeyByZXR1cm4gZXJyb3JfY29sbGVjdG9yXy50ZXh0XzsgfQotICBzdHJpbmcgd2FybmluZygpIGNvbnN0IHsgcmV0dXJuIGVycm9yX2NvbGxlY3Rvcl8ud2FybmluZ190ZXh0XzsgfQotCi0gIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3JfOwotICBNb2NrU291cmNlVHJlZSBzb3VyY2VfdHJlZV87Ci0gIEltcG9ydGVyIGltcG9ydGVyXzsKLX07Ci0KLVRFU1RfRihJbXBvcnRlclRlc3QsIEltcG9ydCkgewotICAvLyBUZXN0IG5vcm1hbCBpbXBvcnRpbmcuCi0gIEFkZEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IGltcG9ydGVyXy5JbXBvcnQoImZvby5wcm90byIpOwotICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOwotCi0gIEFTU0VSVF9FUSgxLCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgiRm9vIiwgZmlsZS0+bWVzc2FnZV90eXBlKDApLT5uYW1lKCkpOwotCi0gIC8vIEltcG9ydGluZyBhZ2FpbiBzaG91bGQgcmV0dXJuIHNhbWUgb2JqZWN0LgotICBFWFBFQ1RfRVEoZmlsZSwgaW1wb3J0ZXJfLkltcG9ydCgiZm9vLnByb3RvIikpOwotfQotCi1URVNUX0YoSW1wb3J0ZXJUZXN0LCBJbXBvcnROZXN0ZWQpIHsKLSAgLy8gVGVzdCB0aGF0IGltcG9ydGluZyBhIGZpbGUgd2hpY2ggaW1wb3J0cyBhbm90aGVyIGZpbGUgd29ya3MuCi0gIEFkZEZpbGUoImZvby5wcm90byIsCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIgotICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgIiAgb3B0aW9uYWwgQmFyIGJhciA9IDE7XG4iCi0gICAgIn1cbiIpOwotICBBZGRGaWxlKCJiYXIucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIEJhciB7fVxuIik7Ci0KLSAgLy8gTm90ZSB0aGF0IGJvdGggZmlsZXMgYXJlIGFjdHVhbGx5IHBhcnNlZCBieSB0aGUgZmlyc3QgY2FsbCB0byBJbXBvcnQoKQotICAvLyBoZXJlLCBzaW5jZSBmb28ucHJvdG8gaW1wb3J0cyBiYXIucHJvdG8uICBUaGUgc2Vjb25kIGNhbGwganVzdCByZXR1cm5zCi0gIC8vIHRoZSBzYW1lIFByb3RvRmlsZSBmb3IgYmFyLnByb3RvIHdoaWNoIHdhcyBjb25zdHJ1Y3RlZCB3aGlsZSBpbXBvcnRpbmcKLSAgLy8gZm9vLnByb3RvLiAgV2UgdGVzdCB0aGF0IHRoaXMgaXMgdGhlIGNhc2UgYmVsb3cgYnkgY2hlY2tpbmcgdGhhdCBiYXIKLSAgLy8gaXMgYW1vbmcgZm9vJ3MgZGVwZW5kZW5jaWVzIChieSBwb2ludGVyKS4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IGltcG9ydGVyXy5JbXBvcnQoImZvby5wcm90byIpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFyID0gaW1wb3J0ZXJfLkltcG9ydCgiYmFyLnByb3RvIik7Ci0gIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Ci0gIEFTU0VSVF9UUlVFKGZvbyAhPSBOVUxMKTsKLSAgQVNTRVJUX1RSVUUoYmFyICE9IE5VTEwpOwotCi0gIC8vIENoZWNrIHRoYXQgZm9vJ3MgZGVwZW5kZW5jeSBpcyB0aGUgc2FtZSBvYmplY3QgYXMgYmFyLgotICBBU1NFUlRfRVEoMSwgZm9vLT5kZXBlbmRlbmN5X2NvdW50KCkpOwotICBFWFBFQ1RfRVEoYmFyLCBmb28tPmRlcGVuZGVuY3koMCkpOwotCi0gIC8vIENoZWNrIHRoYXQgZm9vIHByb3Blcmx5IGNyb3NzLWxpbmtzIGJhci4KLSAgQVNTRVJUX0VRKDEsIGZvby0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwotICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gIEFTU0VSVF9FUSgxLCBmb28tPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGRfY291bnQoKSk7Ci0gIEFTU0VSVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSwKLSAgICAgICAgICAgIGZvby0+bWVzc2FnZV90eXBlKDApLT5maWVsZCgwKS0+dHlwZSgpKTsKLSAgRVhQRUNUX0VRKGJhci0+bWVzc2FnZV90eXBlKDApLAotICAgICAgICAgICAgZm9vLT5tZXNzYWdlX3R5cGUoMCktPmZpZWxkKDApLT5tZXNzYWdlX3R5cGUoKSk7Ci19Ci0KLVRFU1RfRihJbXBvcnRlclRlc3QsIEZpbGVOb3RGb3VuZCkgewotICAvLyBFcnJvcjogIFBhcnNpbmcgYSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdC4KLSAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgiZm9vLnByb3RvIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgKLSAgICAiZm9vLnByb3RvOi0xOjA6IEZpbGUgbm90IGZvdW5kLlxuIiwKLSAgICBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKLX0KLQotVEVTVF9GKEltcG9ydGVyVGVzdCwgSW1wb3J0Tm90Rm91bmQpIHsKLSAgLy8gRXJyb3I6ICBJbXBvcnRpbmcgYSBmaWxlIHRoYXQgZG9lc24ndCBleGlzdC4KLSAgQWRkRmlsZSgiZm9vLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiaW1wb3J0IFwiYmFyLnByb3RvXCI7XG4iKTsKLQotICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJmb28ucHJvdG8iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX0VRKAotICAgICJiYXIucHJvdG86LTE6MDogRmlsZSBub3QgZm91bmQuXG4iCi0gICAgImZvby5wcm90bzotMTowOiBJbXBvcnQgXCJiYXIucHJvdG9cIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iLAotICAgIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotfQotCi1URVNUX0YoSW1wb3J0ZXJUZXN0LCBSZWN1cnNpdmVJbXBvcnQpIHsKLSAgLy8gRXJyb3I6ICBSZWN1cnNpdmUgaW1wb3J0LgotICBBZGRGaWxlKCJyZWN1cnNpdmUxLnByb3RvIiwKLSAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAiaW1wb3J0IFwicmVjdXJzaXZlMi5wcm90b1wiO1xuIik7Ci0gIEFkZEZpbGUoInJlY3Vyc2l2ZTIucHJvdG8iLAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJpbXBvcnQgXCJyZWN1cnNpdmUxLnByb3RvXCI7XG4iKTsKLQotICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJyZWN1cnNpdmUxLnByb3RvIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgKLSAgICAicmVjdXJzaXZlMS5wcm90bzotMTowOiBGaWxlIHJlY3Vyc2l2ZWx5IGltcG9ydHMgaXRzZWxmOiByZWN1cnNpdmUxLnByb3RvICIKLSAgICAgICItPiByZWN1cnNpdmUyLnByb3RvIC0+IHJlY3Vyc2l2ZTEucHJvdG9cbiIKLSAgICAicmVjdXJzaXZlMi5wcm90bzotMTowOiBJbXBvcnQgXCJyZWN1cnNpdmUxLnByb3RvXCIgd2FzIG5vdCBmb3VuZCAiCi0gICAgICAib3IgaGFkIGVycm9ycy5cbiIKLSAgICAicmVjdXJzaXZlMS5wcm90bzotMTowOiBJbXBvcnQgXCJyZWN1cnNpdmUyLnByb3RvXCIgd2FzIG5vdCBmb3VuZCAiCi0gICAgICAib3IgaGFkIGVycm9ycy5cbiIsCi0gICAgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBEaXNrU291cmNlVHJlZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgZGlybmFtZXNfLnB1c2hfYmFjayhUZXN0VGVtcERpcigpICsgIi90ZXN0X3Byb3RvMl9pbXBvcnRfcGF0aF8xIik7Ci0gICAgZGlybmFtZXNfLnB1c2hfYmFjayhUZXN0VGVtcERpcigpICsgIi90ZXN0X3Byb3RvMl9pbXBvcnRfcGF0aF8yIik7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcm5hbWVzXy5zaXplKCk7IGkrKykgewotICAgICAgaWYgKEZpbGVFeGlzdHMoZGlybmFtZXNfW2ldKSkgewotICAgICAgICBGaWxlOjpEZWxldGVSZWN1cnNpdmVseShkaXJuYW1lc19baV0sIE5VTEwsIE5VTEwpOwotICAgICAgfQotICAgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkNyZWF0ZURpcihkaXJuYW1lc19baV0sIDA3NzcpKTsKLSAgICB9Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJuYW1lc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIGlmIChGaWxlRXhpc3RzKGRpcm5hbWVzX1tpXSkpIHsKLSAgICAgICAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkoZGlybmFtZXNfW2ldLCBOVUxMLCBOVUxMKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB2b2lkIEFkZEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3QgY2hhciogY29udGVudHMpIHsKLSAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoZmlsZW5hbWUsIGNvbnRlbnRzLCB0cnVlKSk7Ci0gIH0KLQotICB2b2lkIEFkZFN1YmRpcihjb25zdCBzdHJpbmcmIGRpcm5hbWUpIHsKLSAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6Q3JlYXRlRGlyKGRpcm5hbWUsIDA3NzcpKTsKLSAgfQotCi0gIHZvaWQgRXhwZWN0RmlsZUNvbnRlbnRzKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2NvbnRlbnRzKSB7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLk9wZW4oZmlsZW5hbWUpKTsKLQotICAgIEFTU0VSVF9GQUxTRShpbnB1dCA9PSBOVUxMKTsKLQotICAgIC8vIFJlYWQgYWxsIHRoZSBkYXRhIGZyb20gdGhlIGZpbGUuCi0gICAgc3RyaW5nIGZpbGVfY29udGVudHM7Ci0gICAgY29uc3Qgdm9pZCogZGF0YTsKLSAgICBpbnQgc2l6ZTsKLSAgICB3aGlsZSAoaW5wdXQtPk5leHQoJmRhdGEsICZzaXplKSkgewotICAgICAgZmlsZV9jb250ZW50cy5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSksIHNpemUpOwotICAgIH0KLQotICAgIEVYUEVDVF9FUShleHBlY3RlZF9jb250ZW50cywgZmlsZV9jb250ZW50cyk7Ci0gIH0KLQotICB2b2lkIEV4cGVjdENhbm5vdE9wZW5GaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBlcnJvcl9tZXNzYWdlKSB7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLk9wZW4oZmlsZW5hbWUpKTsKLSAgICBFWFBFQ1RfVFJVRShpbnB1dCA9PSBOVUxMKTsKLSAgICBFWFBFQ1RfRVEoZXJyb3JfbWVzc2FnZSwgc291cmNlX3RyZWVfLkdldExhc3RFcnJvck1lc3NhZ2UoKSk7Ci0gIH0KLQotICBEaXNrU291cmNlVHJlZSBzb3VyY2VfdHJlZV87Ci0KLSAgLy8gUGF0aHMgb2YgdHdvIG9uLWRpc2sgZGlyZWN0b3JpZXMgdG8gdXNlIGR1cmluZyB0aGUgdGVzdC4KLSAgdmVjdG9yPHN0cmluZz4gZGlybmFtZXNfOwotfTsKLQotVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTWFwUm9vdCkgewotICAvLyBUZXN0IG9wZW5pbmcgYSBmaWxlIGluIGEgZGlyZWN0b3J5IHRoYXQgaXMgbWFwcGVkIHRvIHRoZSByb290IG9mIHRoZQotICAvLyBzb3VyY2UgdHJlZS4KLSAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKLSAgc291cmNlX3RyZWVfLk1hcFBhdGgoIiIsIGRpcm5hbWVzX1swXSk7Ci0KLSAgRXhwZWN0RmlsZUNvbnRlbnRzKCJmb28iLCAiSGVsbG8gV29ybGQhIik7Ci0gIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXIiLCAiRmlsZSBub3QgZm91bmQuIik7Ci19Ci0KLVRFU1RfRihEaXNrU291cmNlVHJlZVRlc3QsIE1hcERpcmVjdG9yeSkgewotICAvLyBUZXN0IG9wZW5pbmcgYSBmaWxlIGluIGEgZGlyZWN0b3J5IHRoYXQgaXMgbWFwcGVkIHRvIHNvbWV3aGVyZSBvdGhlcgotICAvLyB0aGFuIHRoZSByb290IG9mIHRoZSBzb3VyY2UgdHJlZS4KLQotICBBZGRGaWxlKGRpcm5hbWVzX1swXSArICIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOwotICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmF6IiwgZGlybmFtZXNfWzBdKTsKLQotICBFeHBlY3RGaWxlQ29udGVudHMoImJhei9mb28iLCAiSGVsbG8gV29ybGQhIik7Ci0gIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXovYmFyIiwgIkZpbGUgbm90IGZvdW5kLiIpOwotICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiZm9vIiwgIkZpbGUgbm90IGZvdW5kLiIpOwotICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmFyIiwgIkZpbGUgbm90IGZvdW5kLiIpOwotCi0gIC8vIE5vbi1jYW5vbmljYWwgZmlsZSBuYW1lcyBzaG91bGQgbm90IHdvcmsuCi0gIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXovL2ZvbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCIpOwotICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmF6Ly4uL2Jhei9mb28iLAotICAgICAgICAgICAgICAgICAgICAgICAiQmFja3NsYXNoZXMsIGNvbnNlY3V0aXZlIHNsYXNoZXMsIFwiLlwiLCBvciBcIi4uXCIgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGxvd2VkIGluIHRoZSB2aXJ0dWFsIHBhdGgiKTsKLSAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhei8uL2ZvbyIsCi0gICAgICAgICAgICAgICAgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiBhcmUgIgotICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCIpOwotICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmF6L2Zvby8iLCAiRmlsZSBub3QgZm91bmQuIik7Ci19Ci0KLVRFU1RfRihEaXNrU291cmNlVHJlZVRlc3QsIE5vUGFyZW50KSB7Ci0gIC8vIFRlc3QgdGhhdCB3ZSBjYW5ub3Qgb3BlbiBmaWxlcyBpbiBhIHBhcmVudCBvZiBhIG1hcHBlZCBkaXJlY3RvcnkuCi0KLSAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKLSAgQWRkU3ViZGlyKGRpcm5hbWVzX1swXSArICIvYmFyIik7Ci0gIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9iYXIvYmF6IiwgIkJsYWguIik7Ci0gIHNvdXJjZV90cmVlXy5NYXBQYXRoKCIiLCBkaXJuYW1lc19bMF0gKyAiL2JhciIpOwotCi0gIEV4cGVjdEZpbGVDb250ZW50cygiYmF6IiwgIkJsYWguIik7Ci0gIEV4cGVjdENhbm5vdE9wZW5GaWxlKCIuLi9mb28iLAotICAgICAgICAgICAgICAgICAgICAgICAiQmFja3NsYXNoZXMsIGNvbnNlY3V0aXZlIHNsYXNoZXMsIFwiLlwiLCBvciBcIi4uXCIgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGxvd2VkIGluIHRoZSB2aXJ0dWFsIHBhdGgiKTsKLSAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoIi4uL2Jhci9iYXoiLAotICAgICAgICAgICAgICAgICAgICAgICAiQmFja3NsYXNoZXMsIGNvbnNlY3V0aXZlIHNsYXNoZXMsIFwiLlwiLCBvciBcIi4uXCIgYXJlICIKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGxvd2VkIGluIHRoZSB2aXJ0dWFsIHBhdGgiKTsKLX0KLQotVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTWFwRmlsZSkgewotICAvLyBUZXN0IG9wZW5pbmcgYSBmaWxlIHRoYXQgaXMgbWFwcGVkIGRpcmVjdGx5IGludG8gdGhlIHNvdXJjZSB0cmVlLgotCi0gIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7Ci0gIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJmb28iLCBkaXJuYW1lc19bMF0gKyAiL2ZvbyIpOwotCi0gIEV4cGVjdEZpbGVDb250ZW50cygiZm9vIiwgIkhlbGxvIFdvcmxkISIpOwotICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmFyIiwgIkZpbGUgbm90IGZvdW5kLiIpOwotfQotCi1URVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBTZWFyY2hNdWx0aXBsZURpcmVjdG9yaWVzKSB7Ci0gIC8vIFRlc3QgbWFwcGluZyBhbmQgc2VhcmNoaW5nIG11bHRpcGxlIGRpcmVjdG9yaWVzLgotCi0gIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7Ci0gIEFkZEZpbGUoZGlybmFtZXNfWzFdICsgIi9mb28iLCAiVGhpcyBmaWxlIHNob3VsZCBiZSBoaWRkZW4uIik7Ci0gIEFkZEZpbGUoZGlybmFtZXNfWzFdICsgIi9iYXIiLCAiR29vZGJ5ZSBXb3JsZCEiKTsKLSAgc291cmNlX3RyZWVfLk1hcFBhdGgoIiIsIGRpcm5hbWVzX1swXSk7Ci0gIHNvdXJjZV90cmVlXy5NYXBQYXRoKCIiLCBkaXJuYW1lc19bMV0pOwotCi0gIEV4cGVjdEZpbGVDb250ZW50cygiZm9vIiwgIkhlbGxvIFdvcmxkISIpOwotICBFeHBlY3RGaWxlQ29udGVudHMoImJhciIsICJHb29kYnllIFdvcmxkISIpOwotICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmF6IiwgIkZpbGUgbm90IGZvdW5kLiIpOwotfQotCi1URVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBPcmRlcmluZ1RydW1wc1NwZWNpZmljaXR5KSB7Ci0gIC8vIFRlc3QgdGhhdCBkaXJlY3RvcmllcyBhcmUgYWx3YXlzIHNlYXJjaGVkIGluIG9yZGVyLCBldmVuIHdoZW4gYSBsYXR0ZXIKLSAgLy8gZGlyZWN0b3J5IGlzIG1vcmUtc3BlY2lmaWMgdGhhbiBhIGZvcm1lciBvbmUuCi0KLSAgLy8gQ3JlYXRlIHRoZSAiYmFyIiBkaXJlY3Rvcnkgc28gd2UgY2FuIHB1dCBhIGZpbGUgaW4gaXQuCi0gIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpDcmVhdGVEaXIoZGlybmFtZXNfWzBdICsgIi9iYXIiLCAwNzc3KSk7Ci0KLSAgLy8gQWRkIGZpbGVzIGFuZCBtYXAgcGF0aHMuCi0gIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9iYXIvZm9vIiwgIkhlbGxvIFdvcmxkISIpOwotICBBZGRGaWxlKGRpcm5hbWVzX1sxXSArICIvZm9vIiwgIlRoaXMgZmlsZSBzaG91bGQgYmUgaGlkZGVuLiIpOwotICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKLSAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1sxXSk7Ci0KLSAgLy8gQ2hlY2suCi0gIEV4cGVjdEZpbGVDb250ZW50cygiYmFyL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKLX0KLQotVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKSB7Ci0gIC8vIFRlc3QgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlLgotCi0gIEFkZEZpbGUoZGlybmFtZXNfWzBdICsgIi9mb28iLCAiSGVsbG8gV29ybGQhIik7Ci0gIEFkZEZpbGUoZGlybmFtZXNfWzFdICsgIi9mb28iLCAiVGhpcyBmaWxlIHNob3VsZCBiZSBoaWRkZW4uIik7Ci0gIHNvdXJjZV90cmVlXy5NYXBQYXRoKCJiYXIiLCBkaXJuYW1lc19bMF0pOwotICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzFdKTsKLQotICBzdHJpbmcgdmlydHVhbF9maWxlOwotICBzdHJpbmcgc2hhZG93aW5nX2Rpc2tfZmlsZTsKLQotICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6Ok5PX01BUFBJTkcsCi0gICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKLSAgICAgICIvZm9vIiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKLQotICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNIQURPV0VELAotICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCi0gICAgICBkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7Ci0gIEVYUEVDVF9FUSgiYmFyL2ZvbyIsIHZpcnR1YWxfZmlsZSk7Ci0gIEVYUEVDVF9FUShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsIHNoYWRvd2luZ19kaXNrX2ZpbGUpOwotCi0gIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCi0gICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKLSAgICAgIGRpcm5hbWVzX1sxXSArICIvYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKLSAgRVhQRUNUX0VRKCJiYXIvYmF6IiwgdmlydHVhbF9maWxlKTsKLQotICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OlNVQ0NFU1MsCi0gICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKLSAgICAgIGRpcm5hbWVzX1swXSArICIvZm9vIiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKLSAgRVhQRUNUX0VRKCJiYXIvZm9vIiwgdmlydHVhbF9maWxlKTsKLX0KLQotVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgRGlza0ZpbGVUb1ZpcnR1YWxGaWxlQ2Fub25pY2FsaXphdGlvbikgewotICAvLyBUZXN0IGhhbmRsaW5nIG9mICIuLiIsICIuIiwgZXRjLiBpbiBEaXNrRmlsZVRvVmlydHVhbEZpbGUoKS4KLQotICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMSIsICIuLiIpOwotICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiZGlyMiIsICIuLi8uLi9mb28iKTsKLSAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjMiLCAiLi9mb28vYmFyLy4iKTsKLSAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjQiLCAiLiIpOwotICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgIi9xdXgiKTsKLSAgc291cmNlX3RyZWVfLk1hcFBhdGgoImRpcjUiLCAiL3F1dXgvIik7Ci0KLSAgc3RyaW5nIHZpcnR1YWxfZmlsZTsKLSAgc3RyaW5nIHNoYWRvd2luZ19kaXNrX2ZpbGU7Ci0KLSAgLy8gIi4uLy4uIiBzaG91bGQgbm90IGJlIGNvbnNpZGVyZWQgdG8gYmUgdW5kZXIgIi4uIi4KLSAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpOT19NQVBQSU5HLAotICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCi0gICAgICAiLi4vLi4vYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKLQotICAvLyAiL2ZvbyIgaXMgbm90IG1hcHBlZCAoaXQgc2hvdWxkIG5vdCBiZSBtaXNpbnRlcHJldGVkIGFzIGJlaW5nIHVuZGVyICIuIikuCi0gIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKLSAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAotICAgICAgIi9mb28iLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOwotCi0jaWZkZWYgV0lOMzIKLSAgLy8gIkM6XGZvbyIgaXMgbm90IG1hcHBlZCAoaXQgc2hvdWxkIG5vdCBiZSBtaXNpbnRlcHJldGVkIGFzIGJlaW5nIHVuZGVyICIuIikuCi0gIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Tk9fTUFQUElORywKLSAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAotICAgICAgIkM6XFxmb28iLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOwotI2VuZGlmICAvLyBXSU4zMgotCi0gIC8vIEJ1dCAiLi4vYmF6IiBzaG91bGQgYmUuCi0gIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCi0gICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKLSAgICAgICIuLi9iYXoiLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOwotICBFWFBFQ1RfRVEoImRpcjEvYmF6IiwgdmlydHVhbF9maWxlKTsKLQotICAvLyAiLi4vLi4vZm9vL2JheiIgaXMgdW5kZXIgIi4uLy4uL2ZvbyIuCi0gIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCi0gICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKLSAgICAgICIuLi8uLi9mb28vYmF6IiwgJnZpcnR1YWxfZmlsZSwgJnNoYWRvd2luZ19kaXNrX2ZpbGUpKTsKLSAgRVhQRUNUX0VRKCJkaXIyL2JheiIsIHZpcnR1YWxfZmlsZSk7Ci0KLSAgLy8gImZvby8uL2Jhci9iYXoiIGlzIHVuZGVyICIuL2Zvby9iYXIvLiIuCi0gIEVYUEVDVF9FUShEaXNrU291cmNlVHJlZTo6Q0FOTk9UX09QRU4sCi0gICAgc291cmNlX3RyZWVfLkRpc2tGaWxlVG9WaXJ0dWFsRmlsZSgKLSAgICAgICJmb28vYmFyL2JheiIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7Ci0gIEVYUEVDVF9FUSgiZGlyMy9iYXoiLCB2aXJ0dWFsX2ZpbGUpOwotCi0gIC8vICJiYXIiIGlzIHVuZGVyICIuIi4KLSAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKLSAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAotICAgICAgImJhciIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7Ci0gIEVYUEVDVF9FUSgiZGlyNC9iYXIiLCB2aXJ0dWFsX2ZpbGUpOwotCi0gIC8vICIvcXV4L2JheiIgaXMgdW5kZXIgIi9xdXgiLgotICBFWFBFQ1RfRVEoRGlza1NvdXJjZVRyZWU6OkNBTk5PVF9PUEVOLAotICAgIHNvdXJjZV90cmVlXy5EaXNrRmlsZVRvVmlydHVhbEZpbGUoCi0gICAgICAiL3F1eC9iYXoiLCAmdmlydHVhbF9maWxlLCAmc2hhZG93aW5nX2Rpc2tfZmlsZSkpOwotICBFWFBFQ1RfRVEoImJheiIsIHZpcnR1YWxfZmlsZSk7Ci0KLSAgLy8gIi9xdXV4L2JhciIgaXMgdW5kZXIgIi9xdXV4Ii4KLSAgRVhQRUNUX0VRKERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTiwKLSAgICBzb3VyY2VfdHJlZV8uRGlza0ZpbGVUb1ZpcnR1YWxGaWxlKAotICAgICAgIi9xdXV4L2JhciIsICZ2aXJ0dWFsX2ZpbGUsICZzaGFkb3dpbmdfZGlza19maWxlKSk7Ci0gIEVYUEVDVF9FUSgiZGlyNS9iYXIiLCB2aXJ0dWFsX2ZpbGUpOwotfQotCi1URVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUpIHsKLSAgLy8gVGVzdCBWaXJ0dWFsRmlsZVRvRGlza0ZpbGUuCi0KLSAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2ZvbyIsICJIZWxsbyBXb3JsZCEiKTsKLSAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL2ZvbyIsICJUaGlzIGZpbGUgc2hvdWxkIGJlIGhpZGRlbi4iKTsKLSAgQWRkRmlsZShkaXJuYW1lc19bMV0gKyAiL3F1dXgiLCAiVGhpcyBmaWxlIHNob3VsZCBub3QgYmUgaGlkZGVuLiIpOwotICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmFyIiwgZGlybmFtZXNfWzBdKTsKLSAgc291cmNlX3RyZWVfLk1hcFBhdGgoImJhciIsIGRpcm5hbWVzX1sxXSk7Ci0KLSAgLy8gRXhpc3RlbnQgZmlsZXMsIHNoYWRvd2VkIGFuZCBub24tc2hhZG93ZWQgY2FzZS4KLSAgc3RyaW5nIGRpc2tfZmlsZTsKLSAgRVhQRUNUX1RSVUUoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL2ZvbyIsICZkaXNrX2ZpbGUpKTsKLSAgRVhQRUNUX0VRKGRpcm5hbWVzX1swXSArICIvZm9vIiwgZGlza19maWxlKTsKLSAgRVhQRUNUX1RSVUUoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL3F1dXgiLCAmZGlza19maWxlKSk7Ci0gIEVYUEVDVF9FUShkaXJuYW1lc19bMV0gKyAiL3F1dXgiLCBkaXNrX2ZpbGUpOwotCi0gIC8vIE5vbmV4aXN0ZW50IGZpbGUgaW4gZXhpc3RlbnQgZGlyZWN0b3J5IGFuZCB2aWNlIHZlcnNhLgotICBzdHJpbmcgbm90X3RvdWNoZWQgPSAibm90IHRvdWNoZWQiOwotICBFWFBFQ1RfRkFMU0Uoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmFyL2JheiIsICZub3RfdG91Y2hlZCkpOwotICBFWFBFQ1RfRVEoIm5vdCB0b3VjaGVkIiwgbm90X3RvdWNoZWQpOwotICBFWFBFQ1RfRkFMU0Uoc291cmNlX3RyZWVfLlZpcnR1YWxGaWxlVG9EaXNrRmlsZSgiYmF6L2ZvbyIsICZub3RfdG91Y2hlZCkpOwotICBFWFBFQ1RfRVEoIm5vdCB0b3VjaGVkIiwgbm90X3RvdWNoZWQpOwotCi0gIC8vIEFjY2VwdCBOVUxMIGFzIG91dHB1dCBwYXJhbWV0ZXIuCi0gIEVYUEVDVF9UUlVFKHNvdXJjZV90cmVlXy5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoImJhci9mb28iLCBOVUxMKSk7Ci0gIEVYUEVDVF9GQUxTRShzb3VyY2VfdHJlZV8uVmlydHVhbEZpbGVUb0Rpc2tGaWxlKCJiYXovZm9vIiwgTlVMTCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDdiODBlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzOTUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotbmFtZXNwYWNlIHsKLWJvb2wgRW51bUhhc0N1c3RvbU9wdGlvbnMoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgaWYgKGRlc2NyaXB0b3ItPm9wdGlvbnMoKS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT52YWx1ZV9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGRlc2NyaXB0b3ItPnZhbHVlKGkpOwotICAgIGlmICh2YWx1ZS0+b3B0aW9ucygpLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSA+IDApIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLX0gIC8vIG5hbWVzcGFjZQotCi1FbnVtR2VuZXJhdG9yOjpFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIGltbXV0YWJsZV9hcGlfKGltbXV0YWJsZV9hcGkpLAotICAgIGNvbnRleHRfKGNvbnRleHQpLAotICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSAgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKTsKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBjYW5vbmljYWxfdmFsdWUgPQotICAgICAgZGVzY3JpcHRvcl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlLT5udW1iZXIoKSk7Ci0KLSAgICBpZiAodmFsdWUgPT0gY2Fub25pY2FsX3ZhbHVlKSB7Ci0gICAgICBjYW5vbmljYWxfdmFsdWVzXy5wdXNoX2JhY2sodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBbGlhcyBhbGlhczsKLSAgICAgIGFsaWFzLnZhbHVlID0gdmFsdWU7Ci0gICAgICBhbGlhcy5jYW5vbmljYWxfdmFsdWUgPSBjYW5vbmljYWxfdmFsdWU7Ci0gICAgICBhbGlhc2VzXy5wdXNoX2JhY2soYWxpYXMpOwotICAgIH0KLSAgfQotfQotCi1FbnVtR2VuZXJhdG9yOjp+RW51bUdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgV3JpdGVFbnVtRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgZW51bSAkY2xhc3NuYW1lJFxuIgotICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlByb3RvY29sTWVzc2FnZUVudW0ge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIGJvb2wgb3JkaW5hbF9pc19pbmRleCA9IHRydWU7Ci0gIHN0cmluZyBpbmRleF90ZXh0ID0gIm9yZGluYWwoKSI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY2Fub25pY2FsX3ZhbHVlc18uc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoY2Fub25pY2FsX3ZhbHVlc19baV0tPmluZGV4KCkgIT0gaSkgewotICAgICAgb3JkaW5hbF9pc19pbmRleCA9IGZhbHNlOwotICAgICAgaW5kZXhfdGV4dCA9ICJpbmRleCI7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGNhbm9uaWNhbF92YWx1ZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbIm5hbWUiXSA9IGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5uYW1lKCk7Ci0gICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoY2Fub25pY2FsX3ZhbHVlc19baV0tPmluZGV4KCkpOwotICAgIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShjYW5vbmljYWxfdmFsdWVzX1tpXS0+bnVtYmVyKCkpOwotICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBjYW5vbmljYWxfdmFsdWVzX1tpXSk7Ci0gICAgaWYgKGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iKTsKLSAgICB9Ci0gICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICIkbmFtZSQoJG51bWJlciQpLFxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICIkbmFtZSQoJGluZGV4JCwgJG51bWJlciQpLFxuIik7Ci0gICAgfQotICB9Ci0KLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJVTlJFQ09HTklaRUQoLTEpLFxuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJVTlJFQ09HTklaRUQoLTEsIC0xKSxcbiIpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZXItPlByaW50KAotICAgICI7XG4iCi0gICAgIlxuIik7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGFsaWFzZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbImNsYXNzbmFtZSJdID0gZGVzY3JpcHRvcl8tPm5hbWUoKTsKLSAgICB2YXJzWyJuYW1lIl0gPSBhbGlhc2VzX1tpXS52YWx1ZS0+bmFtZSgpOwotICAgIHZhcnNbImNhbm9uaWNhbF9uYW1lIl0gPSBhbGlhc2VzX1tpXS5jYW5vbmljYWxfdmFsdWUtPm5hbWUoKTsKLSAgICBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQocHJpbnRlciwgYWxpYXNlc19baV0udmFsdWUpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAicHVibGljIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJCAkbmFtZSQgPSAkY2Fub25pY2FsX25hbWUkO1xuIik7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gICAgdmFyc1sibmFtZSJdID0gZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5uYW1lKCk7Ci0gICAgdmFyc1sibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkpOwotICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXy0+dmFsdWUoaSkpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJG5hbWUkX1ZBTFVFID0gJG51bWJlciQ7XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCgiXG4iKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHByaW50ZXItPlByaW50KAotICAgICJcbiIKLSAgICAicHVibGljIGZpbmFsIGludCBnZXROdW1iZXIoKSB7XG4iKTsKLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiICBpZiAodGhpcyA9PSBVTlJFQ09HTklaRUQpIHtcbiIKLSAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcbiIKLSAgICAgICAgIiAgICAgICAgXCJDYW4ndCBnZXQgdGhlIG51bWJlciBvZiBhbiB1bmtub3duIGVudW0gdmFsdWUuXCIpO1xuIgotICAgICAgICAiICB9XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIgIGlmIChpbmRleCA9PSAtMSkge1xuIgotICAgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgotICAgICAgICAiICAgICAgICBcIkNhbid0IGdldCB0aGUgbnVtYmVyIG9mIGFuIHVua25vd24gZW51bSB2YWx1ZS5cIik7XG4iCi0gICAgICAgICIgIH1cbiIpOwotICAgIH0KLSAgfQotICBwcmludGVyLT5QcmludCgKLSAgICAiICByZXR1cm4gdmFsdWU7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgIi8qKlxuIgotICAgICIgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNmb3JOdW1iZXIoaW50KX0gaW5zdGVhZC5cbiIKLSAgICAiICovXG4iCi0gICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgotICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHZhbHVlT2YoaW50IHZhbHVlKSB7XG4iCi0gICAgIiAgcmV0dXJuIGZvck51bWJlcih2YWx1ZSk7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZm9yTnVtYmVyKGludCB2YWx1ZSkge1xuIgotICAgICIgIHN3aXRjaCAodmFsdWUpIHtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBjYW5vbmljYWxfdmFsdWVzXy5zaXplKCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNhc2UgJG51bWJlciQ6IHJldHVybiAkbmFtZSQ7XG4iLAotICAgICAgIm5hbWUiLCBjYW5vbmljYWxfdmFsdWVzX1tpXS0+bmFtZSgpLAotICAgICAgIm51bWJlciIsIFNpbXBsZUl0b2EoY2Fub25pY2FsX3ZhbHVlc19baV0tPm51bWJlcigpKSk7Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgICBkZWZhdWx0OiByZXR1cm4gbnVsbDtcbiIKLSAgICAiICB9XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgInB1YmxpYyBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDwkY2xhc3NuYW1lJD5cbiIKLSAgICAiICAgIGludGVybmFsR2V0VmFsdWVNYXAoKSB7XG4iCi0gICAgIiAgcmV0dXJuIGludGVybmFsVmFsdWVNYXA7XG4iCi0gICAgIn1cbiIKLSAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDxcbiIKLSAgICAiICAgICRjbGFzc25hbWUkPiBpbnRlcm5hbFZhbHVlTWFwID1cbiIKLSAgICAiICAgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8JGNsYXNzbmFtZSQ+KCkge1xuIgotICAgICIgICAgICAgIHB1YmxpYyAkY2xhc3NuYW1lJCBmaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKSB7XG4iCi0gICAgIiAgICAgICAgICByZXR1cm4gJGNsYXNzbmFtZSQuZm9yTnVtYmVyKG51bWJlcik7XG4iCi0gICAgIiAgICAgICAgfVxuIgotICAgICIgICAgICB9O1xuIgotICAgICJcbiIsCi0gICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFJlZmxlY3Rpb24KLQotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInB1YmxpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3JcbiIKLSAgICAgICIgICAgZ2V0VmFsdWVEZXNjcmlwdG9yKCkge1xuIgotICAgICAgIiAgcmV0dXJuIGdldERlc2NyaXB0b3IoKS5nZXRWYWx1ZXMoKS5nZXQoJGluZGV4X3RleHQkKTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3JcbiIKLSAgICAgICIgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7XG4iCi0gICAgICAiICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3JcbiIKLSAgICAgICIgICAgZ2V0RGVzY3JpcHRvcigpIHtcbiIsCi0gICAgICAiaW5kZXhfdGV4dCIsIGluZGV4X3RleHQpOwotCi0gICAgLy8gVE9ETyhrZW50b24pOiAgQ2FjaGUgc3RhdGljYWxseT8gIE5vdGUgdGhhdCB3ZSBjYW4ndCBhY2Nlc3MgZGVzY3JpcHRvcnMKLSAgICAvLyAgIGF0IG1vZHVsZSBpbml0IHRpbWUgYmVjYXVzZSBpdCB3b3VsZG4ndCB3b3JrIHdpdGggZGVzY3JpcHRvci5wcm90bywgYnV0Ci0gICAgLy8gICB3ZSBjYW4gY2FjaGUgdGhlIHZhbHVlIHRoZSBmaXJzdCB0aW1lIGdldERlc2NyaXB0b3IoKSBpcyBjYWxsZWQuCi0gICAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSB7Ci0gICAgICBpZiAoIU11bHRpcGxlSmF2YUZpbGVzKGRlc2NyaXB0b3JfLT5maWxlKCksIGltbXV0YWJsZV9hcGlfKSkgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiICByZXR1cm4gJGZpbGUkLmdldERlc2NyaXB0b3IoKS5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAotICAgICAgICAgICJmaWxlIiwgbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW11dGFibGVfYXBpXyksCi0gICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICAgIGlmIChFbnVtSGFzQ3VzdG9tT3B0aW9ucyhkZXNjcmlwdG9yXykpIHsKLSAgICAgICAgICAvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIGltbXV0YWJsZSBjbGFzc2VzIGluIG9yZGVyIHRvIHBhcnNlIGN1c3RvbQotICAgICAgICAgIC8vIG9wdGlvbnMuIEhvd2V2ZXIsIHNpbmNlIGZpbGUgbGV2ZWwgZW51bXMgKG5vIG91dGVyIGNsYXNzKSBhcmUKLSAgICAgICAgICAvLyBzaGFyZWQgYnkgaW1tdXRhYmxlIGNvZGUgYW5kIG11dGFibGUgY29kZSwgdGhlIGltbXV0YWJsZSBjbGFzc2VzCi0gICAgICAgICAgLy8gbWF5IG5vdCBleGlzdC4gU28gd2UgdHJ5IHRvIHVzZSBKYXZhIHJlZmxlY3Rpb24gdG8gcmV0cmlldmUgdGhlCi0gICAgICAgICAgLy8gZGVzY3JpcHRvciBmcm9tIGltbXV0YWJsZSBjbGFzc2VzLgotICAgICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICAgInRyeSB7XG4iCi0gICAgICAgICAgICAiICBqYXZhLmxhbmcuQ2xhc3MgaW1tdXRhYmxlRmlsZUNsYXNzID1cbiIKLSAgICAgICAgICAgICIgICAgICBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZShcIiRpbW11dGFibGVfZmlsZV9jbGFzc19uYW1lJFwiKTtcbiIKLSAgICAgICAgICAgICIgIEBqYXZhLmxhbmcuU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKVxuIgotICAgICAgICAgICAgIiAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gPVxuIgotICAgICAgICAgICAgIiAgICAgIGltbXV0YWJsZUZpbGVDbGFzcy5nZXRNZXRob2QoXCJnZXREZXNjcmlwdG9yXCIpO1xuIgotICAgICAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciBmaWxlID1cbiIKLSAgICAgICAgICAgICIgICAgICAoY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcilcbiIKLSAgICAgICAgICAgICIgICAgICAgICAgbS5pbnZva2UoaW1tdXRhYmxlRmlsZUNsYXNzKTtcbiIKLSAgICAgICAgICAgICIgIHJldHVybiBmaWxlLmdldEVudW1UeXBlcygpLmdldCgkaW5kZXgkKTtcbiIKLSAgICAgICAgICAgICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHtcbiIKLSAgICAgICAgICAgIC8vIEltbXV0YWJsZSBjbGFzc2VzIGNhbm5vdCBiZSBmb3VuZC4gUHJvY2VlZCBhcyBpZiBjdXN0b20gb3B0aW9ucwotICAgICAgICAgICAgLy8gZG9uJ3QgZXhpc3QuCi0gICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICJpbW11dGFibGVfZmlsZV9jbGFzc19uYW1lIiwKLSAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCi0gICAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7Ci0gICAgICAgIH0KLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgInJldHVybiAkaW1tdXRhYmxlX3BhY2thZ2UkLiRkZXNjcmlwdG9yX2NsYXNzJC4kZGVzY3JpcHRvciRcbiIKLSAgICAgICAgICAiICAgIC5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAotICAgICAgICAgICJpbW11dGFibGVfcGFja2FnZSIsIEZpbGVKYXZhUGFja2FnZShkZXNjcmlwdG9yXy0+ZmlsZSgpLCB0cnVlKSwKLSAgICAgICAgICAiZGVzY3JpcHRvcl9jbGFzcyIsCi0gICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldERlc2NyaXB0b3JDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCi0gICAgICAgICAgImRlc2NyaXB0b3IiLCAiZ2V0RGVzY3JpcHRvcigpIiwKLSAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7Ci0gICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIiAgcmV0dXJuICRwYXJlbnQkLiRkZXNjcmlwdG9yJC5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAotICAgICAgICAgICJwYXJlbnQiLCBuYW1lX3Jlc29sdmVyXy0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW11dGFibGVfYXBpXyksCi0gICAgICAgICAgImRlc2NyaXB0b3IiLCBkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKQotICAgICAgICAgICAgICAgICAgICAgICAgLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKQotICAgICAgICAgICAgICAgICAgICAgICAgPyAiZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvckZvclR5cGUoKSIKLSAgICAgICAgICAgICAgICAgICAgICAgIDogImdldERlc2NyaXB0b3IoKSIsCi0gICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOwotICAgIH0KLQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIn1cbiIKLSAgICAgICJcbiIKLSAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJFtdIFZBTFVFUyA9ICIsCi0gICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0KLSAgICBpZiAoQ2FuVXNlRW51bVZhbHVlcygpKSB7Ci0gICAgICAvLyBJZiB0aGUgY29uc3RhbnRzIHdlIGFyZSBnb2luZyB0byBvdXRwdXQgYXJlIGV4YWN0bHkgdGhlIG9uZXMgd2UKLSAgICAgIC8vIGhhdmUgZGVjbGFyZWQgaW4gdGhlIEphdmEgZW51bSBpbiB0aGUgc2FtZSBvcmRlciwgdGhlbiB3ZSBjYW4gdXNlCi0gICAgICAvLyB0aGUgdmFsdWVzKCkgbWV0aG9kIHRoYXQgdGhlIEphdmEgY29tcGlsZXIgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMKLSAgICAgIC8vIGZvciBldmVyeSBlbnVtLgotICAgICAgcHJpbnRlci0+UHJpbnQoInZhbHVlcygpO1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAie1xuIgotICAgICAgICAiICAiKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgewotICAgICAgICBwcmludGVyLT5QcmludCgiJG5hbWUkLCAiLAotICAgICAgICAgICJuYW1lIiwgZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5uYW1lKCkpOwotICAgICAgfQotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIlxuIgotICAgICAgICAgICJ9O1xuIik7Ci0gICAgfQotCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiXG4iCi0gICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCB2YWx1ZU9mKFxuIgotICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgZGVzYykge1xuIgotICAgICAgIiAgaWYgKGRlc2MuZ2V0VHlwZSgpICE9IGdldERlc2NyaXB0b3IoKSkge1xuIgotICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcbiIKLSAgICAgICIgICAgICBcIkVudW1WYWx1ZURlc2NyaXB0b3IgaXMgbm90IGZvciB0aGlzIHR5cGUuXCIpO1xuIgotICAgICAgIiAgfVxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiICBpZiAoZGVzYy5nZXRJbmRleCgpID09IC0xKSB7XG4iCi0gICAgICAgICIgICAgcmV0dXJuIFVOUkVDT0dOSVpFRDtcbiIKLSAgICAgICAgIiAgfVxuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiAgcmV0dXJuIFZBTFVFU1tkZXNjLmdldEluZGV4KCldO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIpOwotCi0gICAgaWYgKCFvcmRpbmFsX2lzX2luZGV4KSB7Ci0gICAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7XG4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHByaW50ZXItPlByaW50KAotICAgICJwcml2YXRlIGZpbmFsIGludCB2YWx1ZTtcblxuIik7Ci0KLSAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJwcml2YXRlICRjbGFzc25hbWUkKGludCB2YWx1ZSkge1xuIiwKLSAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJwcml2YXRlICRjbGFzc25hbWUkKGludCBpbmRleCwgaW50IHZhbHVlKSB7XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotICB9Ci0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpICYmCi0gICAgICAhb3JkaW5hbF9pc19pbmRleCkgewotICAgIHByaW50ZXItPlByaW50KCIgIHRoaXMuaW5kZXggPSBpbmRleDtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KAotICAgICIgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiIKLSAgICAifVxuIik7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgotICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZW51bV9zY29wZTokZnVsbF9uYW1lJClcbiIsCi0gICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKLX0KLQotYm9vbCBFbnVtR2VuZXJhdG9yOjpDYW5Vc2VFbnVtVmFsdWVzKCkgewotICBpZiAoY2Fub25pY2FsX3ZhbHVlc18uc2l6ZSgpICE9IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgewotICAgIGlmIChkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKSAhPSBjYW5vbmljYWxfdmFsdWVzX1tpXS0+bmFtZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTBkOTFmNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBuYW1lc3BhY2UgY29tcGlsZXIgewotICAgIG5hbWVzcGFjZSBqYXZhIHsKLSAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAvLyBjb250ZXh0LmgKLSAgICAgIGNsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAvLyBuYW1lX3Jlc29sdmVyLmgKLSAgICB9Ci0gIH0KLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKLSAgfQotfQotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotY2xhc3MgRW51bUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1tdXRhYmxlX2FwaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKLSAgfkVudW1HZW5lcmF0b3IoKTsKLQotICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLQotICAvLyBUaGUgcHJvdG8gbGFuZ3VhZ2UgYWxsb3dzIG11bHRpcGxlIGVudW0gY29uc3RhbnRzIHRvIGhhdmUgdGhlIHNhbWUgbnVtZXJpYwotICAvLyB2YWx1ZS4gIEphdmEsIGhvd2V2ZXIsIGRvZXMgbm90IGFsbG93IG11bHRpcGxlIGVudW0gY29uc3RhbnRzIHRvIGJlCi0gIC8vIGNvbnNpZGVyZWQgZXF1aXZhbGVudC4gIFdlIHRyZWF0IHRoZSBmaXJzdCBkZWZpbmVkIGNvbnN0YW50IGZvciBhbnkKLSAgLy8gZ2l2ZW4gbnVtZXJpYyB2YWx1ZSBhcyAiY2Fub25pY2FsIiBhbmQgdGhlIHJlc3QgYXMgYWxpYXNlcyBvZiB0aGF0Ci0gIC8vIGNhbm9uaWNhbCB2YWx1ZS4KLSAgdmVjdG9yPGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqPiBjYW5vbmljYWxfdmFsdWVzXzsKLQotICBzdHJ1Y3QgQWxpYXMgewotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlOwotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGNhbm9uaWNhbF92YWx1ZTsKLSAgfTsKLSAgdmVjdG9yPEFsaWFzPiBhbGlhc2VzXzsKLQotICBib29sIGltbXV0YWJsZV9hcGlfOwotCi0gIENvbnRleHQqIGNvbnRleHRfOwotICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87Ci0KLSAgYm9vbCBDYW5Vc2VFbnVtVmFsdWVzKCk7Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1HZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGphdmEKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRU5VTV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZTU0YmUzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5NjIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgU2V0RW51bVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKLSAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKLQotICAoKnZhcmlhYmxlcylbInR5cGUiXSA9Ci0gICAgICBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpOwotICAoKnZhcmlhYmxlcylbIm11dGFibGVfdHlwZSJdID0KLSAgICAgIG5hbWVfcmVzb2x2ZXItPkdldE11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKLSAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X251bWJlciJdID0gU2ltcGxlSXRvYSgKLSAgICAgIGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7Ci0gICgqdmFyaWFibGVzKVsidGFnIl0gPSBTaW1wbGVJdG9hKGludGVybmFsOjpXaXJlRm9ybWF0OjpNYWtlVGFnKGRlc2NyaXB0b3IpKTsKLSAgKCp2YXJpYWJsZXMpWyJ0YWdfc2l6ZSJdID0gU2ltcGxlSXRvYSgKLSAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7Ci0gIC8vIFRPRE8oYmlyZG8pOiBBZGQgQGRlcHJlY2F0ZWQgamF2YWRvYyB3aGVuIGdlbmVyYXRpbmcgamF2YWRvYyBpcyBzdXBwb3J0ZWQKLSAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCi0gICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKLSAgICAgID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7Ci0gICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0gIm9uQ2hhbmdlZCgpOyI7Ci0KLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3ItPmZpbGUoKSkpIHsKLSAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCi0gICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOwotICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKLQotICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgIjsiLgotICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0KLSAgICAgICAgR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KSArICI7IjsKLSAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9Ci0gICAgICAgIEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7Ci0gICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9Ci0gICAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKLQotICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOwotICB9IGVsc2UgewotICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gIiI7Ci0gICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKLSAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7Ci0KLSAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0KLSAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXyAhPSAiICsKLSAgICAgICAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gKyAiLmdldE51bWJlcigpIjsKLSAgfQotCi0gIC8vIEZvciByZXBhdGVkIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZS4KLSAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7Ci0KLSAgLy8gRm9yIHJlcGVhdGVkIGZpZWxkcywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUKLSAgLy8gaW4gdGhlIHBhcnNpbmcgY29uc3RydWN0b3IuCi0gICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X3BhcnNlciJdID0KLSAgICAgIEdlbmVyYXRlR2V0Qml0TXV0YWJsZUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7Ci0gICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X3BhcnNlciJdID0KLSAgICAgIEdlbmVyYXRlU2V0Qml0TXV0YWJsZUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7Ci0KLSAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsIl0gPQotICAgICAgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCJdID0KLSAgICAgIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChtZXNzYWdlQml0SW5kZXgpOwotCi0gIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yLT5maWxlKCkpKSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJ1bmtub3duIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXSArICIuVU5SRUNPR05JWkVEIjsKLSAgfSBlbHNlIHsKLSAgICAoKnZhcmlhYmxlcylbInVua25vd24iXSA9ICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1JbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCi0gICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpLAotICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7Ci0gIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Ci19Ci0KLUltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigpIHt9Ci0KLWludCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgewotICByZXR1cm4gMTsKLX0KLQotaW50IEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKLSAgfQotICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCk7XG4iKTsKLSAgfQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgaW50ICRuYW1lJF87XG4iKTsKLSAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLmZvck51bWJlcigkbmFtZSRfKTtcbiIKLSAgICAiICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAkdW5rbm93biQgOiByZXN1bHQ7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgaW50ICRuYW1lJF8gPSAkZGVmYXVsdF9udW1iZXIkO1xuIik7Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0gIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgICAifVxuIik7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCB2YWx1ZSkge1xuIgotICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgotICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLmZvck51bWJlcigkbmFtZSRfKTtcbiIKLSAgICAiICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAkdW5rbm93biQgOiByZXN1bHQ7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKLSAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgotICAgICIgIH1cbiIKLSAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKLSAgICAiICAkbmFtZSRfID0gdmFsdWUuZ2V0TnVtYmVyKCk7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgotICAgICIgICRuYW1lJF8gPSAkZGVmYXVsdF9udW1iZXIkO1xuIgotICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7Ci0gIC8vIG5vb3AgZm9yIGVudW1zCi19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHRfbnVtYmVyJDtcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJG5hbWUkXyA9ICRkZWZhdWx0X251bWJlciQ7XG4iCi0gICAgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgotICAgICAgIiAgc2V0JGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfSBlbHNlIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKG90aGVyLiRuYW1lJF8gIT0gJGRlZmF1bHRfbnVtYmVyJCkge1xuIgotICAgICAgIiAgc2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IHJlYWNoIGhlcmUuIjsKLSAgfQotfQotCi12b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCQpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCQ7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgotICAgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgotICAgICAgIiRuYW1lJF8gPSByYXdWYWx1ZTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTtcbiIKLSAgICAgICIkdHlwZSQgdmFsdWUgPSAkdHlwZSQuZm9yTnVtYmVyKHJhd1ZhbHVlKTtcbiIKLSAgICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIik7Ci0gICAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiICB1bmtub3duRmllbGRzLm1lcmdlVmFyaW50RmllbGQoJG51bWJlciQsIHJhd1ZhbHVlKTtcbiIpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIn0gZWxzZSB7XG4iCi0gICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIKLSAgICAgICIgICRuYW1lJF8gPSByYXdWYWx1ZTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi12b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBub29wIGZvciBlbnVtcwotfQotCi12b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgotICAgICIgIG91dHB1dC53cml0ZUVudW0oJG51bWJlciQsICRuYW1lJF8pO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCi0gICAgIiAgICAuY29tcHV0ZUVudW1TaXplKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJyZXN1bHQgPSByZXN1bHQgJiYgJG5hbWUkXyA9PSBvdGhlci4kbmFtZSRfO1xuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgotICAgICJoYXNoID0gKDUzICogaGFzaCkgKyAkbmFtZSRfO1xuIik7Ci19Ci0KLXN0cmluZyBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1JbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCi0gICAgOiBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpIHsKLSAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0KLSAgICAgIGNvbnRleHQtPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkpOwotICBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCAmdmFyaWFibGVzXyk7Ci19Ci0KLUltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKLX5JbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLXZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0gIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCkge1xuIgotICAgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICAgIiAgICByZXR1cm4gKGphdmEubGFuZy5JbnRlZ2VyKSAkb25lb2ZfbmFtZSRfO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgcmV0dXJuICRkZWZhdWx0X251bWJlciQ7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgICAgJHR5cGUkIHJlc3VsdCA9ICR0eXBlJC5mb3JOdW1iZXIoKGphdmEubGFuZy5JbnRlZ2VyKSAkb25lb2ZfbmFtZSRfKTtcbiIKLSAgICAiICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuICRkZWZhdWx0JDtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSgpIHtcbiIKLSAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAgICIgICAgcmV0dXJuICgoamF2YS5sYW5nLkludGVnZXIpICRvbmVvZl9uYW1lJF8pLmludFZhbHVlKCk7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICByZXR1cm4gJGRlZmF1bHRfbnVtYmVyJDtcbiIKLSAgICAgICJ9XG4iKTsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoaW50IHZhbHVlKSB7XG4iCi0gICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICAgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuZm9yTnVtYmVyKChqYXZhLmxhbmcuSW50ZWdlcikgJG9uZW9mX25hbWUkXyk7XG4iCi0gICAgIiAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAkdW5rbm93biQgOiByZXN1bHQ7XG4iCi0gICAgIiAgfVxuIgotICAgICIgIHJldHVybiAkZGVmYXVsdCQ7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKLSAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgotICAgICIgIH1cbiIKLSAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlLmdldE51bWJlcigpO1xuIgotICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgICAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgIiAgICAkb25lb2ZfbmFtZSRfID0gbnVsbDtcbiIKLSAgICAiICAgICRvbl9jaGFuZ2VkJFxuIgotICAgICIgIH1cbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIHJlc3VsdC4kb25lb2ZfbmFtZSRfID0gJG9uZW9mX25hbWUkXztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgInNldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Ci0gIH0KLX0KLQotdm9pZCBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTtcbiIKLSAgICAgICIkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgICAiJG9uZW9mX25hbWUkXyA9IHJhd1ZhbHVlO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgotICAgICAgIiR0eXBlJCB2YWx1ZSA9ICR0eXBlJC5mb3JOdW1iZXIocmF3VmFsdWUpO1xuIgotICAgICAgImlmICh2YWx1ZSA9PSBudWxsKSB7XG4iKTsKLSAgICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICIgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCgkbnVtYmVyJCwgcmF3VmFsdWUpO1xuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAifSBlbHNlIHtcbiIKLSAgICAgICIgICRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAgICIgICRvbmVvZl9uYW1lJF8gPSByYXdWYWx1ZTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi12b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIG91dHB1dC53cml0ZUVudW0oJG51bWJlciQsICgoamF2YS5sYW5nLkludGVnZXIpICRvbmVvZl9uYW1lJF8pKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgotICAgICIgICAgLmNvbXB1dGVFbnVtU2l6ZSgkbnVtYmVyJCwgKChqYXZhLmxhbmcuSW50ZWdlcikgJG9uZW9mX25hbWUkXykpO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKVxuIgotICAgICAgIiAgICA9PSBvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSgpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkKClcbiIKLSAgICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKLSAgfQotfQotCi12b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCi0gICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgotICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmdldE51bWJlcigpO1xuIik7Ci0gIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1SZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1SZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKLSAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCksIGNvbnRleHRfKGNvbnRleHQpLAotICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7Ci0gIFNldEVudW1WYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Ci19Ci0KLVJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoKSB7fQotCi1pbnQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgewotICByZXR1cm4gMDsKLX0KLQotaW50IFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOwotICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+XG4iCi0gICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVMaXN0KCk7XG4iKTsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCBpbmRleCk7XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5JbnRlZ2VyPiAkbmFtZSRfO1xuIgotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkxpc3RBZGFwdGVyLkNvbnZlcnRlcjxcbiIKLSAgICAiICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdHlwZSQ+ICRuYW1lJF9jb252ZXJ0ZXJfID1cbiIKLSAgICAiICAgICAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5MaXN0QWRhcHRlci5Db252ZXJ0ZXI8XG4iCi0gICAgIiAgICAgICAgICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdHlwZSQ+KCkge1xuIgotICAgICIgICAgICAgICAgcHVibGljICR0eXBlJCBjb252ZXJ0KGphdmEubGFuZy5JbnRlZ2VyIGZyb20pIHtcbiIKLSAgICAiICAgICAgICAgICAgJHR5cGUkIHJlc3VsdCA9ICR0eXBlJC5mb3JOdW1iZXIoZnJvbSk7XG4iCi0gICAgIiAgICAgICAgICAgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKLSAgICAiICAgICAgICAgIH1cbiIKLSAgICAiICAgICAgICB9O1xuIik7Ci0gIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCi0gICAgIiAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkxpc3RBZGFwdGVyPFxuIgotICAgICIgICAgICBqYXZhLmxhbmcuSW50ZWdlciwgJHR5cGUkPigkbmFtZSRfLCAkbmFtZSRfY29udmVydGVyXyk7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfY29udmVydGVyXy5jb252ZXJ0KCRuYW1lJF8uZ2V0KGluZGV4KSk7XG4iCi0gICAgIn1cbiIpOwotICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5JbnRlZ2VyPlxuIgotICAgICAgImdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlTGlzdCgpIHtcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgotICAgICAgIn1cbiIpOwotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCBpbmRleCkge1xuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYKLSAgICAgIGNvbnRleHRfLT5IYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgInByaXZhdGUgaW50ICRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemU7XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBvdGhlciBmaWVsZCBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZQotICAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLiBJZiBpdCdzIGltbXV0YWJsZSwgdGhlIGludmFyaWFudCBpcyB0aGF0IGl0IG11c3QKLSAgICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKLSAgICAvLyB3cmFwcGVkIGluIGEgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgpIHdyYXBwZXIgYW5kIG5vYm9keSBlbHNlIGhhcwotICAgIC8vIGEgcmVmZXJlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgQXJyYXlMaXN0LiBUaGlzIGludmFyaWFudCBhbGxvd3MgdXMgdG8KLSAgICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQotICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy4gTm90ZSwgaW1tdXRhYmxlIGlzIGEgc3Ryb25nIGd1YXJhbnRlZSBoZXJlIC0tIG5vdAotICAgIC8vIGp1c3QgdGhhdCB0aGUgbGlzdCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIHRoZSByZWZlcmVuY2UgYnV0IHRoYXQgdGhlCi0gICAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCi0gICAgInByaXZhdGUgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+ICRuYW1lJF8gPVxuIgotICAgICIgIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKLQotICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgotICAgICIgIGlmICghJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgotICAgICIgICAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5JbnRlZ2VyPigkbmFtZSRfKTtcbiIKLSAgICAiICAgICRzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iKTsKLQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgLy8gTm90ZTogIFdlIHJldHVybiBhbiB1bm1vZGlmaWFibGUgbGlzdCBiZWNhdXNlIG90aGVyd2lzZSB0aGUgY2FsbGVyCi0gICAgLy8gICBjb3VsZCBob2xkIG9uIHRvIHRoZSByZXR1cm5lZCBsaXN0IGFuZCBtb2RpZnkgaXQgYWZ0ZXIgdGhlIG1lc3NhZ2UKLSAgICAvLyAgIGhhcyBiZWVuIGJ1aWx0LCB0aHVzIG11dGF0aW5nIHRoZSBtZXNzYWdlIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlCi0gICAgLy8gICBpbW11dGFibGUuCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JHR5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgotICAgICIgIHJldHVybiBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5MaXN0QWRhcHRlcjxcbiIKLSAgICAiICAgICAgamF2YS5sYW5nLkludGVnZXIsICR0eXBlJD4oJG5hbWUkXywgJG5hbWUkX2NvbnZlcnRlcl8pO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkX2NvbnZlcnRlcl8uY29udmVydCgkbmFtZSRfLmdldChpbmRleCkpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgotICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKLSAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgotICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCi0gICAgIiAgfVxuIgotICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZS5nZXROdW1iZXIoKSk7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKLSAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgotICAgICIgIH1cbiIKLSAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKLSAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZS5nZXROdW1iZXIoKSk7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCi0gICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICR0eXBlJD4gdmFsdWVzKSB7XG4iCi0gICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgZm9yICgkdHlwZSQgdmFsdWUgOiB2YWx1ZXMpIHtcbiIKLSAgICAiICAgICRuYW1lJF8uYWRkKHZhbHVlLmdldE51bWJlcigpKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgotICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci0KLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj5cbiIKLSAgICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZUxpc3QoKSB7XG4iCi0gICAgICAiICByZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCi0gICAgICAifVxuIik7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoaW50IGluZGV4KSB7XG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgotICAgICAgIn1cbiIpOwotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShcbiIKLSAgICAgICIgICAgaW50IGluZGV4LCBpbnQgdmFsdWUpIHtcbiIKLSAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICAgIiAgJG5hbWUkXy5zZXQoaW5kZXgsIHZhbHVlKTtcbiIKLSAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgICAifVxuIik7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCB2YWx1ZSkge1xuIgotICAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCi0gICAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICAgIn1cbiIpOwotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShcbiIKLSAgICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPGphdmEubGFuZy5JbnRlZ2VyPiB2YWx1ZXMpIHtcbiIKLSAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICAgIiAgZm9yIChpbnQgdmFsdWUgOiB2YWx1ZXMpIHtcbiIKLSAgICAgICIgICAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgewotICAvLyBub29wIGZvciBlbnVtcwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iCi0gICAgIiRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gVGhlIGNvZGUgYmVsb3cgZG9lcyB0d28gb3B0aW1pemF0aW9uczoKLSAgLy8gICAxLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBlbXB0eSwgdGhlcmUncyBub3RoaW5nIHRvIGRvLiBUaGlzIGVuc3VyZXMgd2UKLSAgLy8gICAgICBkb24ndCBhbGxvY2F0ZSBhIG5ldyBhcnJheSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW1tdXRhYmxlIG9uZS4KLSAgLy8gICAyLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBub24tZW1wdHkgYW5kIG91ciBjdXJyZW50IGxpc3QgaXMgZW1wdHksIHdlIGNhbgotICAvLyAgICAgIHJldXNlIHRoZSBvdGhlciBsaXN0IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW1tdXRhYmxlLgotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoIW90aGVyLiRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCi0gICAgIiAgaWYgKCRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCi0gICAgIiAgICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKLSAgICAiICAgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgICAkbmFtZSRfLmFkZEFsbChvdGhlci4kbmFtZSRfKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCi0gIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKLSAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCi0gICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgotICAgICJ9XG4iCi0gICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gUmVhZCBhbmQgc3RvcmUgdGhlIGVudW0KLSAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgotICAgICAgImlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkKSB7XG4iCi0gICAgICAiICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8amF2YS5sYW5nLkludGVnZXI+KCk7XG4iCi0gICAgICAiICAkc2V0X211dGFibGVfYml0X3BhcnNlciQ7XG4iCi0gICAgICAifVxuIgotICAgICAgIiRuYW1lJF8uYWRkKHJhd1ZhbHVlKTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTtcbiIKLSAgICAgICIkdHlwZSQgdmFsdWUgPSAkdHlwZSQuZm9yTnVtYmVyKHJhd1ZhbHVlKTtcbiIKLSAgICAgICAgImlmICh2YWx1ZSA9PSBudWxsKSB7XG4iKTsKLSAgICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICIgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCgkbnVtYmVyJCwgcmF3VmFsdWUpO1xuIik7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAifSBlbHNlIHtcbiIKLSAgICAgICIgIGlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkKSB7XG4iCi0gICAgICAiICAgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDxqYXZhLmxhbmcuSW50ZWdlcj4oKTtcbiIKLSAgICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIiAgJG5hbWUkXy5hZGQocmF3VmFsdWUpO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gV3JhcCBHZW5lcmF0ZVBhcnNpbmdDb2RlJ3MgY29udGVudHMgd2l0aCBhIHdoaWxlIGxvb3AuCi0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpO1xuIgotICAgICJpbnQgb2xkTGltaXQgPSBpbnB1dC5wdXNoTGltaXQobGVuZ3RoKTtcbiIKLSAgICAid2hpbGUoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgR2VuZXJhdGVQYXJzaW5nQ29kZShwcmludGVyKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIn1cbiIKLSAgICAiaW5wdXQucG9wTGltaXQob2xkTGltaXQpO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgotICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKSA+IDApIHtcbiIKLSAgICAgICIgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKCR0YWckKTtcbiIKLSAgICAgICIgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKCRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemUpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKLSAgICAgICIgIG91dHB1dC53cml0ZUVudW1Ob1RhZygkbmFtZSRfLmdldChpKSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKLSAgICAgICIgIG91dHB1dC53cml0ZUVudW0oJG51bWJlciQsICRuYW1lJF8uZ2V0KGkpKTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIntcbiIKLSAgICAiICBpbnQgZGF0YVNpemUgPSAwO1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgotICAgICIgIGRhdGFTaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKLSAgICAiICAgIC5jb21wdXRlRW51bVNpemVOb1RhZygkbmFtZSRfLmdldChpKSk7XG4iCi0gICAgIn1cbiIpOwotICBwcmludGVyLT5QcmludCgKLSAgICAic2l6ZSArPSBkYXRhU2l6ZTtcbiIpOwotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoIWdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5pc0VtcHR5KCkpIHsiCi0gICAgICAiICBzaXplICs9ICR0YWdfc2l6ZSQ7XG4iCi0gICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKLSAgICAgICIgICAgLmNvbXB1dGVSYXdWYXJpbnQzMlNpemUoZGF0YVNpemUpO1xuIgotICAgICAgIn0iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgInNpemUgKz0gJHRhZ19zaXplJCAqICRuYW1lJF8uc2l6ZSgpO1xuIik7Ci0gIH0KLQotICAvLyBjYWNoZSB0aGUgZGF0YSBzaXplIGZvciBwYWNrZWQgZmllbGRzLgotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJyZXN1bHQgPSByZXN1bHQgJiYgJG5hbWUkXy5lcXVhbHMob3RoZXIuJG5hbWUkXyk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgotICAgICIgIGhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKLSAgICAiICBoYXNoID0gKDUzICogaGFzaCkgKyAkbmFtZSRfLmhhc2hDb2RlKCk7XG4iCi0gICAgIn1cbiIpOwotfQotCi1zdHJpbmcgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGphdmEKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI4ZmY3MzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0ZJRUxEX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9FTlVNX0ZJRUxEX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgbmFtZXNwYWNlIGNvbXBpbGVyIHsKLSAgICBuYW1lc3BhY2UgamF2YSB7Ci0gICAgICBjbGFzcyBDb250ZXh0OyAgICAgICAgICAgIC8vIGNvbnRleHQuaAotICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAvLyBuYW1lX3Jlc29sdmVyLmgKLSAgICB9Ci0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLWNsYXNzIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKLSAgfkltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OwotICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0gIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwotICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKLSAgQ29udGV4dCogY29udGV4dF87Ci0gIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7Ci0gIH5JbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpOwotCi0gIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKLSAgflJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Q7Ci0gIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOwotICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKLSAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87Ci0gIENvbnRleHQqIGNvbnRleHRfOwotICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBqYXZhCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VOVU1fRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ2YjVmYWEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTc0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lX3Jlc29sdmVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGphdmEgewotCi1JbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6OkltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIGNvbnRleHRfKGNvbnRleHQpLAotICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgIT0gTlVMTCkgewotICAgIHNjb3BlXyA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoCi0gICAgICAgIGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc2NvcGVfID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKTsKLSAgfQotfQotCi1JbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6On5JbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3IoKSB7fQotCi0vLyBJbml0aWFsaXplcyB0aGUgdmFycyByZWZlcmVuY2VkIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB0ZW1wbGF0ZXMuCi12b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6SW5pdFRlbXBsYXRlVmFycyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcnNfcG9pbnRlcikgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+ICZ2YXJzID0gKnZhcnNfcG9pbnRlcjsKLSAgdmFyc1sic2NvcGUiXSA9IHNjb3BlOwotICB2YXJzWyJuYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOwotICB2YXJzWyJjb250YWluaW5nX3R5cGUiXSA9Ci0gICAgICBuYW1lX3Jlc29sdmVyLT5HZXRDbGFzc05hbWUoZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCksIGltbXV0YWJsZSk7Ci0gIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7Ci0gIHZhcnNbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOwotICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5pbmRleCgpKTsKLSAgdmFyc1siZGVmYXVsdCJdID0gZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSA/Ci0gICAgICAiIiA6IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBpbW11dGFibGUsIG5hbWVfcmVzb2x2ZXIpOwotICB2YXJzWyJ0eXBlX2NvbnN0YW50Il0gPSBGaWVsZFR5cGVOYW1lKEdldFR5cGUoZGVzY3JpcHRvcikpOwotICB2YXJzWyJwYWNrZWQiXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5wYWNrZWQoKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gIHZhcnNbImVudW1fbWFwIl0gPSAibnVsbCI7Ci0gIHZhcnNbInByb3RvdHlwZSJdID0gIm51bGwiOwotCi0gIEphdmFUeXBlIGphdmFfdHlwZSA9IEdldEphdmFUeXBlKGRlc2NyaXB0b3IpOwotICBzdHJpbmcgc2luZ3VsYXJfdHlwZTsKLSAgc3dpdGNoIChqYXZhX3R5cGUpIHsKLSAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6Ci0gICAgICBzaW5ndWxhcl90eXBlID0gbmFtZV9yZXNvbHZlci0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1tdXRhYmxlKTsKLSAgICAgIHZhcnNbInByb3RvdHlwZSJdID0gc2luZ3VsYXJfdHlwZSArICIuZ2V0RGVmYXVsdEluc3RhbmNlKCkiOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBKQVZBVFlQRV9FTlVNOgotICAgICAgc2luZ3VsYXJfdHlwZSA9IG5hbWVfcmVzb2x2ZXItPkdldENsYXNzTmFtZShkZXNjcmlwdG9yLT5lbnVtX3R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbXV0YWJsZSk7Ci0gICAgICB2YXJzWyJlbnVtX21hcCJdID0gc2luZ3VsYXJfdHlwZSArICIuaW50ZXJuYWxHZXRWYWx1ZU1hcCgpIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgotICAgICAgc2luZ3VsYXJfdHlwZSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgSkFWQVRZUEVfQllURVM6Ci0gICAgICBzaW5ndWxhcl90eXBlID0gaW1tdXRhYmxlID8gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyIgOiAiYnl0ZVtdIjsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBzaW5ndWxhcl90eXBlID0gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShqYXZhX3R5cGUpOwotICAgICAgYnJlYWs7Ci0gIH0KLSAgdmFyc1sidHlwZSJdID0gZGVzY3JpcHRvci0+aXNfcmVwZWF0ZWQoKSA/Ci0gICAgICAiamF2YS51dGlsLkxpc3Q8IiArIHNpbmd1bGFyX3R5cGUgKyAiPiIgOiBzaW5ndWxhcl90eXBlOwotICB2YXJzWyJzaW5ndWxhcl90eXBlIl0gPSBzaW5ndWxhcl90eXBlOwotfQotCi12b2lkIEltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICBjb25zdCBib29sIGtVc2VJbW11dGFibGVOYW1lcyA9IHRydWU7Ci0gIEluaXRUZW1wbGF0ZVZhcnMoZGVzY3JpcHRvcl8sIHNjb3BlXywga1VzZUltbXV0YWJsZU5hbWVzLCBuYW1lX3Jlc29sdmVyXywKLSAgICAgICAgICAgICAgICAgICAmdmFycyk7Ci0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJGNvbnN0YW50X25hbWUkID0gJG51bWJlciQ7XG4iKTsKLQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCkgewotICAgIC8vIE5vbi1uZXN0ZWQKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgdmFycywKLSAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWxcbiIKLSAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKLSAgICAgICAgIiAgICAkY29udGFpbmluZ190eXBlJCxcbiIKLSAgICAgICAgIiAgICAkdHlwZSQ+ICRuYW1lJCA9IGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgotICAgICAgICAiICAgICAgICAubmV3RmlsZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbihcbiIKLSAgICAgICAgIiAgICAgICRzaW5ndWxhcl90eXBlJC5jbGFzcyxcbiIKLSAgICAgICAgIiAgICAgICRwcm90b3R5cGUkKTtcbiIpOwotICB9IGVsc2UgewotICAgIC8vIE5lc3RlZAotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICB2YXJzLAotICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgotICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuR2VuZXJhdGVkRXh0ZW5zaW9uPFxuIgotICAgICAgICAiICAgICRjb250YWluaW5nX3R5cGUkLFxuIgotICAgICAgICAiICAgICR0eXBlJD4gJG5hbWUkID0gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCi0gICAgICAgICIgICAgICAgIC5uZXdNZXNzYWdlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgotICAgICAgICAiICAgICAgJHNjb3BlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSxcbiIKLSAgICAgICAgIiAgICAgICRpbmRleCQsXG4iCi0gICAgICAgICIgICAgICAkc2luZ3VsYXJfdHlwZSQuY2xhc3MsXG4iCi0gICAgICAgICIgICAgICAkcHJvdG90eXBlJCk7XG4iKTsKLSAgfQotfQotCi1pbnQgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZSgKLSAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpbnQgYnl0ZWNvZGVfZXN0aW1hdGUgPSAwOwotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKLSAgICAvLyBPbmx5IGFwcGxpZXMgdG8gbm9uLW5lc3RlZCBleHRlbnNpb25zLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiJG5hbWUkLmludGVybmFsSW5pdChkZXNjcmlwdG9yLmdldEV4dGVuc2lvbnMoKS5nZXQoJGluZGV4JCkpO1xuIiwKLSAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3JfKSwKLSAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOwotICAgIGJ5dGVjb2RlX2VzdGltYXRlICs9IDIxOwotICB9Ci0gIHJldHVybiBieXRlY29kZV9lc3RpbWF0ZTsKLX0KLQotaW50IEltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJyZWdpc3RyeS5hZGQoJHNjb3BlJC4kbmFtZSQpO1xuIiwKLSAgICAic2NvcGUiLCBzY29wZV8sCi0gICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3JfKSk7Ci0gIHJldHVybiA3OwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJkZDQyMjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRVhURU5TSU9OX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBjbGFzcyBGaWVsZERlc2NyaXB0b3I7ICAgICAgIC8vIGRlc2NyaXB0b3IuaAotICBuYW1lc3BhY2UgY29tcGlsZXIgewotICAgIG5hbWVzcGFjZSBqYXZhIHsKLSAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAvLyBjb250ZXh0LmgKLSAgICAgIGNsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAvLyBuYW1lX3Jlc29sdmVyLmgKLSAgICB9Ci0gIH0KLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKLSAgfQotfQotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotLy8gR2VuZXJhdGVzIGNvZGUgZm9yIGFuIGV4dGVuc2lvbiwgd2hpY2ggbWF5IGJlIHdpdGhpbiB0aGUgc2NvcGUgb2Ygc29tZQotLy8gbWVzc2FnZSBvciBtYXkgYmUgYXQgZmlsZSBzY29wZS4gIFRoaXMgaXMgbXVjaCBzaW1wbGVyIHRoYW4gRmllbGRHZW5lcmF0b3IKLS8vIHNpbmNlIGV4dGVuc2lvbnMgYXJlIGp1c3Qgc2ltcGxlIGlkZW50aWZpZXJzIHdpdGggaW50ZXJlc3RpbmcgdHlwZXMuCi1jbGFzcyBFeHRlbnNpb25HZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KLSAgdmlydHVhbCB+RXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKLQotICAvLyBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByaW50ZWQgY29kZSB3aWxsIGNvbXBpbGUgdG8KLSAgdmlydHVhbCBpbnQgR2VuZXJhdGVOb25OZXN0ZWRJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKLQotICAvLyBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByaW50ZWQgY29kZSB3aWxsIGNvbXBpbGUgdG8KLSAgdmlydHVhbCBpbnQgR2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIHN0YXRpYyB2b2lkIEluaXRUZW1wbGF0ZVZhcnMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyc19wb2ludGVyKTsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFeHRlbnNpb25HZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yIDogcHVibGljIEV4dGVuc2lvbkdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7Ci0gIHZpcnR1YWwgfkltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcigpOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZpcnR1YWwgaW50IEdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdmlydHVhbCBpbnQgR2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotIHByb3RlY3RlZDoKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgQ29udGV4dCogY29udGV4dF87Ci0gIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKLSAgc3RyaW5nIHNjb3BlXzsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGphdmEKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRVhURU5TSU9OX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2M3YmM1Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+Ci0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGRfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGRfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZF9saXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotbmFtZXNwYWNlIHsKLQotSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IqIE1ha2VJbW11dGFibGVHZW5lcmF0b3IoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKLSAgICBDb250ZXh0KiBjb250ZXh0KSB7Ci0gIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7Ci0gICAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6Ci0gICAgICAgIGlmIChJc01hcEVudHJ5KGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKLSAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlTGF6eU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICBjYXNlIEpBVkFUWVBFX0VOVU06Ci0gICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6Ci0gICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKLSAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUxhenlNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKLSAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUxhenlNZXNzYWdlRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKLSAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1JbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IqIE1ha2VJbW11dGFibGVMaXRlR2VuZXJhdG9yKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCi0gICAgQ29udGV4dCogY29udGV4dCkgewotICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICBzd2l0Y2ggKEdldEphdmFUeXBlKGZpZWxkKSkgewotICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAoSXNNYXBFbnRyeShmaWVsZC0+bWVzc2FnZV90eXBlKCkpKSB7Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVNYXBGaWVsZExpdGVHZW5lcmF0b3IoCi0gICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKElzTGF6eShmaWVsZCwgY29udGV4dC0+RW5mb3JjZUxpdGUoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVMYXp5TWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgotICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yKAotICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7Ci0gICAgICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKLSAgICAgICAgICBpZiAoSXNMYXp5KGZpZWxkLCBjb250ZXh0LT5FbmZvcmNlTGl0ZSgpKSkgewotICAgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVMYXp5TWVzc2FnZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKAotICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKAotICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVFbnVtT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoCi0gICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgotICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoCi0gICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKLSAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7Ci0gICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUxhenlNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKAotICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgotICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3IoCi0gICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3IoCi0gICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLQotc3RhdGljIGlubGluZSB2b2lkIFJlcG9ydFVuZXhwZWN0ZWRQYWNrZWRGaWVsZHNDYWxsKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIFJlYWNoaW5nIGhlcmUgaW5kaWNhdGVzIGEgYnVnLiBDYXNlcyBhcmU6Ci0gIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIHNob3VsZCBzdXBwb3J0IHBhY2tpbmcsCi0gIC8vICAgICBidXQgdGhpcyBtZXRob2Qgc2hvdWxkIGJlIG92ZXJyaWRkZW4uCi0gIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIGRvZXNuJ3Qgc3VwcG9ydCBwYWNraW5nLCBhbmQgdGhpcyBtZXRob2QKLSAgLy8gICAgIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gY2FsbGVkLgotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoKSAiCi0gICAgICAgICAgICAgPDwgImNhbGxlZCBvbiBmaWVsZCBnZW5lcmF0b3IgdGhhdCBkb2VzIG5vdCBzdXBwb3J0IHBhY2tpbmcuIjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLUltbXV0YWJsZUZpZWxkR2VuZXJhdG9yOjp+SW1tdXRhYmxlRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIFJlcG9ydFVuZXhwZWN0ZWRQYWNrZWRGaWVsZHNDYWxsKHByaW50ZXIpOwotfQotCi1JbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3I6On5JbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IoKSB7fQotCi12b2lkIEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBSZXBvcnRVbmV4cGVjdGVkUGFja2VkRmllbGRzQ2FsbChwcmludGVyKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi10ZW1wbGF0ZSA8PgotRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRHZW5lcmF0b3I+OjpGaWVsZEdlbmVyYXRvck1hcCgKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBDb250ZXh0KiBjb250ZXh0KQotICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCi0gICAgICBmaWVsZF9nZW5lcmF0b3JzXyhuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjwKLSAgICAgICAgICBJbW11dGFibGVGaWVsZEdlbmVyYXRvcj5bZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKV0pIHsKLQotICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMgYW5kIGFzc2lnbiB0aGVtIGJpdCBpbmRpY2VzIGZvciB0aGVpcgotICAvLyBiaXQgZmllbGRzLgotICBpbnQgbWVzc2FnZUJpdEluZGV4ID0gMDsKLSAgaW50IGJ1aWxkZXJCaXRJbmRleCA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IqIGdlbmVyYXRvciA9IE1ha2VJbW11dGFibGVHZW5lcmF0b3IoCi0gICAgICAgIGRlc2NyaXB0b3ItPmZpZWxkKGkpLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc19baV0ucmVzZXQoZ2VuZXJhdG9yKTsKLSAgICBtZXNzYWdlQml0SW5kZXggKz0gZ2VuZXJhdG9yLT5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOwotICAgIGJ1aWxkZXJCaXRJbmRleCArPSBnZW5lcmF0b3ItPkdldE51bUJpdHNGb3JCdWlsZGVyKCk7Ci0gIH0KLX0KLQotdGVtcGxhdGU8PgotRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRHZW5lcmF0b3I+Ojp+RmllbGRHZW5lcmF0b3JNYXAoKSB7fQotCi10ZW1wbGF0ZSA8PgotRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yPjo6RmllbGRHZW5lcmF0b3JNYXAoCi0gICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgQ29udGV4dCogY29udGV4dCkKLSAgICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAotICAgICAgZmllbGRfZ2VuZXJhdG9yc18obmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8Ci0gICAgICAgICAgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXSkgewotICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMgYW5kIGFzc2lnbiB0aGVtIGJpdCBpbmRpY2VzIGZvciB0aGVpcgotICAvLyBiaXQgZmllbGRzLgotICBpbnQgbWVzc2FnZUJpdEluZGV4ID0gMDsKLSAgaW50IGJ1aWxkZXJCaXRJbmRleCA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBNYWtlSW1tdXRhYmxlTGl0ZUdlbmVyYXRvcigKLSAgICAgICAgZGVzY3JpcHRvci0+ZmllbGQoaSksIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKLSAgICBmaWVsZF9nZW5lcmF0b3JzX1tpXS5yZXNldChnZW5lcmF0b3IpOwotICAgIG1lc3NhZ2VCaXRJbmRleCArPSBnZW5lcmF0b3ItPkdldE51bUJpdHNGb3JNZXNzYWdlKCk7Ci0gICAgYnVpbGRlckJpdEluZGV4ICs9IGdlbmVyYXRvci0+R2V0TnVtQml0c0ZvckJ1aWxkZXIoKTsKLSAgfQotfQotCi10ZW1wbGF0ZTw+Ci1GaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3I+Ojp+RmllbGRHZW5lcmF0b3JNYXAoKSB7fQotCi0KLXZvaWQgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgewotICAoKnZhcmlhYmxlcylbImZpZWxkX25hbWUiXSA9IGRlc2NyaXB0b3ItPm5hbWUoKTsKLSAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPSBpbmZvLT5uYW1lOwotICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9IGluZm8tPmNhcGl0YWxpemVkX25hbWU7Ci0gICgqdmFyaWFibGVzKVsiZGlzYW1iaWd1YXRlZF9yZWFzb24iXSA9IGluZm8tPmRpc2FtYmlndWF0ZWRfcmVhc29uOwotICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7Ci19Ci0KLXZvaWQgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgewotICAoKnZhcmlhYmxlcylbIm9uZW9mX25hbWUiXSA9IGluZm8tPm5hbWU7Ci0gICgqdmFyaWFibGVzKVsib25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSJdID0gaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZTsKLSAgKCp2YXJpYWJsZXMpWyJvbmVvZl9pbmRleCJdID0KLSAgICAgIFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpKTsKLSAgKCp2YXJpYWJsZXMpWyJzZXRfb25lb2ZfY2FzZV9tZXNzYWdlIl0gPSBpbmZvLT5uYW1lICsKLSAgICAgICJDYXNlXyA9ICIgKyBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKLSAgKCp2YXJpYWJsZXMpWyJjbGVhcl9vbmVvZl9jYXNlX21lc3NhZ2UiXSA9IGluZm8tPm5hbWUgKwotICAgICAgIkNhc2VfID0gMCI7Ci0gICgqdmFyaWFibGVzKVsiaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSJdID0gaW5mby0+bmFtZSArCi0gICAgICAiQ2FzZV8gPT0gIiArIFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOwotfQotCi12b2lkIFByaW50RXh0cmFGaWVsZEluZm8oY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFyaWFibGVzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgIHZhcmlhYmxlcy5maW5kKCJkaXNhbWJpZ3VhdGVkX3JlYXNvbiIpOwotICBpZiAoaXQgIT0gdmFyaWFibGVzLmVuZCgpICYmICFpdC0+c2Vjb25kLmVtcHR5KCkpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgdmFyaWFibGVzLAotICAgICAgICAiLy8gQW4gYWx0ZXJuYXRpdmUgbmFtZSBpcyB1c2VkIGZvciBmaWVsZCBcIiRmaWVsZF9uYW1lJFwiIGJlY2F1c2U6XG4iCi0gICAgICAgICIvLyAgICAgJGRpc2FtYmlndWF0ZWRfcmVhc29uJFxuIik7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGphdmEKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGRkNGY1Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTk3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUVMRF9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRklFTERfSF9fCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgbmFtZXNwYWNlIGNvbXBpbGVyIHsKLSAgICBuYW1lc3BhY2UgamF2YSB7Ci0gICAgICBjbGFzcyBDb250ZXh0OyAgICAgICAgICAgICAgICAvLyBjb250ZXh0LmgKLSAgICAgIGNsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgICAgIC8vIG5hbWVfcmVzb2x2ZXIuaAotICAgIH0KLSAgfQotICBuYW1lc3BhY2UgaW8gewotICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgICAgICAgLy8gcHJpbnRlci5oCi0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLWNsYXNzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yKCkge30KLSAgdmlydHVhbCB+SW1tdXRhYmxlRmllbGRHZW5lcmF0b3IoKTsKLQotICB2aXJ0dWFsIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpCi0gICAgICBjb25zdCA9IDA7Ci0KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0ID0gMDsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVGaWVsZEdlbmVyYXRvcik7Ci19OwotCi1jbGFzcyBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yKCkge30KLSAgdmlydHVhbCB+SW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yKCk7Ci0KLSAgdmlydHVhbCBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVZpc2l0Q29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVEeW5hbWljTWV0aG9kTWFrZUltbXV0YWJsZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpCi0gICAgICBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKQotICAgICAgY29uc3QgPSAwOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKLQotICB2aXJ0dWFsIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdCA9IDA7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yKTsKLX07Ci0KLQotLy8gQ29udmVuaWVuY2UgY2xhc3Mgd2hpY2ggY29uc3RydWN0cyBGaWVsZEdlbmVyYXRvcnMgZm9yIGEgRGVzY3JpcHRvci4KLXRlbXBsYXRlPHR5cGVuYW1lIEZpZWxkR2VuZXJhdG9yVHlwZT4KLWNsYXNzIEZpZWxkR2VuZXJhdG9yTWFwIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEZpZWxkR2VuZXJhdG9yTWFwKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOwotICB+RmllbGRHZW5lcmF0b3JNYXAoKTsKLQotICBjb25zdCBGaWVsZEdlbmVyYXRvclR5cGUmIGdldChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBDb250ZXh0KiBjb250ZXh0XzsKLSAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvclR5cGU+ID4gZmllbGRfZ2VuZXJhdG9yc187Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yTWFwKTsKLX07Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEZpZWxkR2VuZXJhdG9yVHlwZT4KLWlubGluZSBjb25zdCBGaWVsZEdlbmVyYXRvclR5cGUmCi1GaWVsZEdlbmVyYXRvck1hcDxGaWVsZEdlbmVyYXRvclR5cGU+OjpnZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBkZXNjcmlwdG9yXyk7Ci0gIHJldHVybiAqZmllbGRfZ2VuZXJhdG9yc19bZmllbGQtPmluZGV4KCldOwotfQotCi0vLyBJbnN0YW50aWF0ZSB0ZW1wbGF0ZSBmb3IgbXV0YWJsZSBhbmQgaW1tdXRhYmxlIG1hcHMuCi10ZW1wbGF0ZTw+Ci1GaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZEdlbmVyYXRvcj46OgotRmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOwotCi10ZW1wbGF0ZTw+Ci1GaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZEdlbmVyYXRvcj46On5GaWVsZEdlbmVyYXRvck1hcCgpOwotCi0KLS8vIEZpZWxkIGluZm9ybWF0aW9uIHVzZWQgaW4gRmllbGRHZW5lYXJ0b3JzLgotc3RydWN0IEZpZWxkR2VuZXJhdG9ySW5mbyB7Ci0gIHN0cmluZyBuYW1lOwotICBzdHJpbmcgY2FwaXRhbGl6ZWRfbmFtZTsKLSAgc3RyaW5nIGRpc2FtYmlndWF0ZWRfcmVhc29uOwotfTsKLQotLy8gT25lb2YgaW5mb3JtYXRpb24gdXNlZCBpbiBPbmVvZkZpZWxkR2VuZWFydG9ycy4KLXN0cnVjdCBPbmVvZkdlbmVyYXRvckluZm8gewotICBzdHJpbmcgbmFtZTsKLSAgc3RyaW5nIGNhcGl0YWxpemVkX25hbWU7Ci19OwotCi0vLyBTZXQgc29tZSBjb21tb24gdmFyaWFibGVzIHVzZWQgaW4gdmFyaWFibGUgRmllbGRHZW5lcmF0b3JzLgotdm9pZCBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKTsKLQotLy8gU2V0IHNvbWUgY29tbW9uIG9uZW9mIHZhcmlhYmxlcyB1c2VkIGluIE9uZW9mRmllbGRHZW5lcmF0b3JzLgotdm9pZCBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKTsKLQotLy8gUHJpbnQgdXNlZnVsIGNvbW1lbnRzIGJlZm9yZSBhIGZpZWxkJ3MgYWNjZXNzb3JzLgotdm9pZCBQcmludEV4dHJhRmllbGRJbmZvKGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBqYXZhCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJRUxEX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1M2FhZTYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDYxNiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaD4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzZXQ+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0cnVjdCBGaWVsZERlc2NyaXB0b3JDb21wYXJlIHsKLSAgYm9vbCBvcGVyYXRvciAoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGYxLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGYyKSB7Ci0gICAgaWYoZjEgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZihmMiA9PSBOVUxMKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIGYxLT5mdWxsX25hbWUoKSA8IGYyLT5mdWxsX25hbWUoKTsKLSAgfQotfTsKLQotdHlwZWRlZiBzdGQ6OnNldDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLCBGaWVsZERlc2NyaXB0b3JDb21wYXJlPiBGaWVsZERlc2NyaXB0b3JTZXQ7Ci0KLS8vIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGNvbGxlY3QgZXh0ZW5zaW9ucy4KLS8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIGV4dGVuc2lvbnMgY2FuIGJlIHJlY29nbml6ZWQuIFRoZSBleHRlbnNpb25zIHdpbGwgYmUKLS8vIGFwcGVuZGVkIGluIHRvIHRoZSBleHRlbnNpb25zIHBhcmFtZXRlci4KLS8vIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgdW5rbm93biBmaWVsZHMsIGluIHdoaWNoIGNhc2UgdGhlIGRhdGEgaW4gdGhlCi0vLyBleHRlbnNpb25zIG91dHB1dCBwYXJhbWV0ZXIgaXMgbm90IHJlbGlhYmxlIGFuZCBzaG91bGQgYmUgZGlzY2FyZGVkLgotYm9vbCBDb2xsZWN0RXh0ZW5zaW9ucyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JTZXQqIGV4dGVuc2lvbnMpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotCi0gIC8vIFRoZXJlIGFyZSB1bmtub3duIGZpZWxkcyB0aGF0IGNvdWxkIGJlIGV4dGVuc2lvbnMsIHRodXMgdGhpcyBjYWxsIGZhaWxzLgotICBpZiAocmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKS5maWVsZF9jb3VudCgpID4gMCkgcmV0dXJuIGZhbHNlOwotCi0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0gIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoZmllbGRzW2ldLT5pc19leHRlbnNpb24oKSkgZXh0ZW5zaW9ucy0+aW5zZXJ0KGZpZWxkc1tpXSk7Ci0KLSAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGRzW2ldKSA9PSBKQVZBVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBpZiAoZmllbGRzW2ldLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkc1tpXSk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0gICAgICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPQotICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkc1tpXSwgaik7Ci0gICAgICAgICAgaWYgKCFDb2xsZWN0RXh0ZW5zaW9ucyhzdWJfbWVzc2FnZSwgZXh0ZW5zaW9ucykpIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkc1tpXSk7Ci0gICAgICAgIGlmICghQ29sbGVjdEV4dGVuc2lvbnMoc3ViX21lc3NhZ2UsIGV4dGVuc2lvbnMpKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEZpbmRzIGFsbCBleHRlbnNpb25zIGluIHRoZSBnaXZlbiBtZXNzYWdlIGFuZCBpdHMgc3ViLW1lc3NhZ2VzLiAgSWYgdGhlCi0vLyBtZXNzYWdlIGNvbnRhaW5zIHVua25vd24gZmllbGRzICh3aGljaCBjb3VsZCBiZSBleHRlbnNpb25zKSwgdGhlbiB0aG9zZQotLy8gZXh0ZW5zaW9ucyBhcmUgZGVmaW5lZCBpbiBhbHRlcm5hdGVfcG9vbC4KLS8vIFRoZSBtZXNzYWdlIHdpbGwgYmUgY29udmVydGVkIHRvIGEgRHluYW1pY01lc3NhZ2UgYmFja2VkIGJ5IGFsdGVybmF0ZV9wb29sCi0vLyBpbiBvcmRlciB0byBoYW5kbGUgdGhpcyBjYXNlLgotdm9pZCBDb2xsZWN0RXh0ZW5zaW9ucyhjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlX3Byb3RvLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCYgYWx0ZXJuYXRlX3Bvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclNldCogZXh0ZW5zaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlX2RhdGEpIHsKLSAgaWYgKCFDb2xsZWN0RXh0ZW5zaW9ucyhmaWxlX3Byb3RvLCBleHRlbnNpb25zKSkgewotICAgIC8vIFRoZXJlIGFyZSB1bmtub3duIGZpZWxkcyBpbiB0aGUgZmlsZV9wcm90bywgd2hpY2ggYXJlIHByb2JhYmx5Ci0gICAgLy8gZXh0ZW5zaW9ucy4gV2UgbmVlZCB0byBwYXJzZSB0aGUgZGF0YSBpbnRvIGEgZHluYW1pYyBtZXNzYWdlIGJhc2VkIG9uIHRoZQotICAgIC8vIGJ1aWxkZXItcG9vbCB0byBmaW5kIG91dCBhbGwgZXh0ZW5zaW9ucy4KLSAgICBjb25zdCBEZXNjcmlwdG9yKiBmaWxlX3Byb3RvX2Rlc2MgPSBhbHRlcm5hdGVfcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCi0gICAgICAgIGZpbGVfcHJvdG8uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSk7Ci0gICAgR09PR0xFX0NIRUNLKGZpbGVfcHJvdG9fZGVzYykKLSAgICAgICAgPDwgIkZpbmQgdW5rbm93biBmaWVsZHMgaW4gRmlsZURlc2NyaXB0b3JQcm90byB3aGVuIGJ1aWxkaW5nICIKLSAgICAgICAgPDwgZmlsZV9wcm90by5uYW1lKCkKLSAgICAgICAgPDwgIi4gSXQncyBsaWtlbHkgdGhhdCB0aG9zZSBmaWVsZHMgYXJlIGN1c3RvbSBvcHRpb25zLCBob3dldmVyLCAiCi0gICAgICAgICAgICJkZXNjcmlwdG9yLnByb3RvIGlzIG5vdCBpbiB0aGUgdHJhbnNpdGl2ZSBkZXBlbmRlbmNpZXMuICIKLSAgICAgICAgICAgIlRoaXMgbm9ybWFsbHkgc2hvdWxkIG5vdCBoYXBwZW4uIFBsZWFzZSByZXBvcnQgYSBidWcuIjsKLSAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZmFjdG9yeTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IGR5bmFtaWNfZmlsZV9wcm90bygKLSAgICAgICAgZmFjdG9yeS5HZXRQcm90b3R5cGUoZmlsZV9wcm90b19kZXNjKS0+TmV3KCkpOwotICAgIEdPT0dMRV9DSEVDSyhkeW5hbWljX2ZpbGVfcHJvdG8uZ2V0KCkgIT0gTlVMTCk7Ci0gICAgR09PR0xFX0NIRUNLKGR5bmFtaWNfZmlsZV9wcm90by0+UGFyc2VGcm9tU3RyaW5nKGZpbGVfZGF0YSkpOwotCi0gICAgLy8gQ29sbGVjdCB0aGUgZXh0ZW5zaW9ucyBhZ2FpbiBmcm9tIHRoZSBkeW5hbWljIG1lc3NhZ2UuIFRoZXJlIHNob3VsZCBiZSBubwotICAgIC8vIG1vcmUgdW5rbm93biBmaWVsZHMgdGhpcyB0aW1lLCBpLmUuIGFsbCB0aGUgY3VzdG9tIG9wdGlvbnMgc2hvdWxkIGJlCi0gICAgLy8gcGFyc2VkIGFzIGV4dGVuc2lvbnMgbm93LgotICAgIGV4dGVuc2lvbnMtPmNsZWFyKCk7Ci0gICAgR09PR0xFX0NIRUNLKENvbGxlY3RFeHRlbnNpb25zKCpkeW5hbWljX2ZpbGVfcHJvdG8sIGV4dGVuc2lvbnMpKQotICAgICAgICA8PCAiRmluZCB1bmtub3duIGZpZWxkcyBpbiBGaWxlRGVzY3JpcHRvclByb3RvIHdoZW4gYnVpbGRpbmcgIgotICAgICAgICA8PCBmaWxlX3Byb3RvLm5hbWUoKQotICAgICAgICA8PCAiLiBJdCdzIGxpa2VseSB0aGF0IHRob3NlIGZpZWxkcyBhcmUgY3VzdG9tIG9wdGlvbnMsIGhvd2V2ZXIsICIKLSAgICAgICAgICAgInRob3NlIG9wdGlvbnMgY2Fubm90IGJlIHJlY29nbml6ZWQgaW4gdGhlIGJ1aWxkZXIgcG9vbC4gIgotICAgICAgICAgICAiVGhpcyBub3JtYWxseSBzaG91bGQgbm90IGhhcHBlbi4gUGxlYXNlIHJlcG9ydCBhIGJ1Zy4iOwotICB9Ci19Ci0KLS8vIENvbXBhcmUgdHdvIGZpZWxkIGRlc2NyaXB0b3JzLCByZXR1cm5pbmcgdHJ1ZSBpZiB0aGUgZmlyc3Qgc2hvdWxkIGNvbWUKLS8vIGJlZm9yZSB0aGUgc2Vjb25kLgotYm9vbCBDb21wYXJlRmllbGRzQnlOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqYSwgY29uc3QgRmllbGREZXNjcmlwdG9yICpiKSB7Ci0gIHJldHVybiBhLT5mdWxsX25hbWUoKSA8IGItPmZ1bGxfbmFtZSgpOwotfQotCi0vLyBPdXIgc3RhdGljIGluaXRpYWxpemF0aW9uIG1ldGhvZHMgY2FuIGJlY29tZSB2ZXJ5LCB2ZXJ5IGxhcmdlLgotLy8gU28gbGFyZ2UgdGhhdCBpZiB3ZSBhcmVuJ3QgY2FyZWZ1bCB3ZSBlbmQgdXAgYmxvd2luZyB0aGUgSlZNJ3MKLS8vIDY0SyBieXRlcyBvZiBieXRlY29kZS9tZXRob2QuIEZvcnR1bmF0ZWx5LCBzaW5jZSB0aGVzZSBzdGF0aWMKLS8vIG1ldGhvZHMgYXJlIGV4ZWN1dGVkIG9ubHkgb25jZSBuZWFyIHRoZSBiZWdpbm5pbmcgb2YgYSBwcm9ncmFtLAotLy8gdGhlcmUncyB1c3VhbGx5IHBsZW50eSBvZiBzdGFjayBzcGFjZSBhdmFpbGFibGUgYW5kIHdlIGNhbgotLy8gZXh0ZW5kIG91ciBtZXRob2RzIGJ5IHNpbXBseSBjaGFpbmluZyB0aGVtIHRvIGFub3RoZXIgbWV0aG9kCi0vLyB3aXRoIGEgdGFpbCBjYWxsLiBUaGlzIGluc2VydHMgdGhlIHNlcXVlbmNlIGNhbGwtbmV4dC1tZXRob2QsCi0vLyBlbmQgdGhpcyBvbmUsIGJlZ2luLW5leHQtbWV0aG9kIGFzIG5lZWRlZC4KLXZvaWQgTWF5YmVSZXN0YXJ0SmF2YU1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKmJ5dGVjb2RlX2VzdGltYXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqbWV0aG9kX251bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpjaGFpbl9zdGF0ZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqbWV0aG9kX2RlY2wpIHsKLSAgLy8gVGhlIGdvYWwgaGVyZSBpcyB0byBzdGF5IHVuZGVyIDY0SyBieXRlcyBvZiBqdm0gYnl0ZWNvZGUvbWV0aG9kLAotICAvLyBzaW5jZSBvdGhlcndpc2Ugd2UgaGl0IGEgaGFyZGNvZGVkIGxpbWl0IGluIHRoZSBqdm0gYW5kIGphdmFjIHdpbGwKLSAgLy8gdGhlbiBmYWlsIHdpdGggdGhlIGVycm9yICJjb2RlIHRvbyBsYXJnZSIuIFRoaXMgbGltaXQgbGV0cyBvdXIKLSAgLy8gZXN0aW1hdGVzIGJlIG9mZiBieSBhIGZhY3RvciBvZiB0d28gYW5kIHN0aWxsIHdlJ3JlIG9rYXkuCi0gIHN0YXRpYyBjb25zdCBpbnQgYnl0ZXNQZXJNZXRob2QgPSBrTWF4U3RhdGljU2l6ZTsKLQotICBpZiAoKCpieXRlY29kZV9lc3RpbWF0ZSkgPiBieXRlc1Blck1ldGhvZCkgewotICAgICsrKCptZXRob2RfbnVtKTsKLSAgICBwcmludGVyLT5QcmludChjaGFpbl9zdGF0ZW1lbnQsICJtZXRob2RfbnVtIiwgU2ltcGxlSXRvYSgqbWV0aG9kX251bSkpOwotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgifVxuIik7Ci0gICAgcHJpbnRlci0+UHJpbnQobWV0aG9kX2RlY2wsICJtZXRob2RfbnVtIiwgU2ltcGxlSXRvYSgqbWV0aG9kX251bSkpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICpieXRlY29kZV9lc3RpbWF0ZSA9IDA7Ci0gIH0KLX0KLQotCi19ICAvLyBuYW1lc3BhY2UKLQotRmlsZUdlbmVyYXRvcjo6RmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBpbW11dGFibGVfYXBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VfbGl0ZSkKLSAgICA6IGZpbGVfKGZpbGUpLAotICAgICAgamF2YV9wYWNrYWdlXyhGaWxlSmF2YVBhY2thZ2UoZmlsZSwgaW1tdXRhYmxlX2FwaSkpLAotICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzXygKLSAgICAgICAgICBuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPltmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKV0pLAotICAgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfKAotICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj5bZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCldKSwKLSAgICAgIGNvbnRleHRfKG5ldyBDb250ZXh0KGZpbGUpKSwKLSAgICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHRfLT5HZXROYW1lUmVzb2x2ZXIoKSksCi0gICAgICBpbW11dGFibGVfYXBpXyhpbW11dGFibGVfYXBpKSB7Ci0gIGNsYXNzbmFtZV8gPSBuYW1lX3Jlc29sdmVyXy0+R2V0RmlsZUNsYXNzTmFtZShmaWxlLCBpbW11dGFibGVfYXBpKTsKLSAgY29udGV4dF8tPlNldEVuZm9yY2VMaXRlKGVuZm9yY2VfbGl0ZSk7Ci0gIGdlbmVyYXRvcl9mYWN0b3J5Xy5yZXNldCgKLSAgICAgIG5ldyBJbW11dGFibGVHZW5lcmF0b3JGYWN0b3J5KGNvbnRleHRfLmdldCgpKSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAotICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld01lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0ucmVzZXQoCi0gICAgICAgIGdlbmVyYXRvcl9mYWN0b3J5Xy0+TmV3RXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGVfLT5leHRlbnNpb24oaSkpKTsKLSAgfQotfQotCi1GaWxlR2VuZXJhdG9yOjp+RmlsZUdlbmVyYXRvcigpIHt9Ci0KLWJvb2wgRmlsZUdlbmVyYXRvcjo6VmFsaWRhdGUoc3RyaW5nKiBlcnJvcikgewotICAvLyBDaGVjayB0aGF0IG5vIGNsYXNzIG5hbWUgbWF0Y2hlcyB0aGUgZmlsZSdzIGNsYXNzIG5hbWUuICBUaGlzIGlzIGEgY29tbW9uCi0gIC8vIHByb2JsZW0gdGhhdCBsZWFkcyB0byBKYXZhIGNvbXBpbGUgZXJyb3JzIHRoYXQgY2FuIGJlIGhhcmQgdG8gdW5kZXJzdGFuZC4KLSAgLy8gSXQncyBlc3BlY2lhbGx5IGJhZCB3aGVuIHVzaW5nIHRoZSBqYXZhX211bHRpcGxlX2ZpbGVzLCBzaW5jZSB3ZSB3b3VsZAotICAvLyBlbmQgdXAgb3ZlcndyaXRpbmcgdGhlIG91dGVyIGNsYXNzIHdpdGggb25lIG9mIHRoZSBpbm5lciBvbmVzLgotICBpZiAobmFtZV9yZXNvbHZlcl8tPkhhc0NvbmZsaWN0aW5nQ2xhc3NOYW1lKGZpbGVfLCBjbGFzc25hbWVfKSkgewotICAgIGVycm9yLT5hc3NpZ24oZmlsZV8tPm5hbWUoKSk7Ci0gICAgZXJyb3ItPmFwcGVuZCgKLSAgICAgICI6IENhbm5vdCBnZW5lcmF0ZSBKYXZhIG91dHB1dCBiZWNhdXNlIHRoZSBmaWxlJ3Mgb3V0ZXIgY2xhc3MgbmFtZSwgXCIiKTsKLSAgICBlcnJvci0+YXBwZW5kKGNsYXNzbmFtZV8pOwotICAgIGVycm9yLT5hcHBlbmQoCi0gICAgICAiXCIsIG1hdGNoZXMgdGhlIG5hbWUgb2Ygb25lIG9mIHRoZSB0eXBlcyBkZWNsYXJlZCBpbnNpZGUgaXQuICAiCi0gICAgICAiUGxlYXNlIGVpdGhlciByZW5hbWUgdGhlIHR5cGUgb3IgdXNlIHRoZSBqYXZhX291dGVyX2NsYXNzbmFtZSAiCi0gICAgICAib3B0aW9uIHRvIHNwZWNpZnkgYSBkaWZmZXJlbnQgb3V0ZXIgY2xhc3MgbmFtZSBmb3IgdGhlIC5wcm90byBmaWxlLiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICAvLyBXZSBkb24ndCBpbXBvcnQgYW55dGhpbmcgYmVjYXVzZSB3ZSByZWZlciB0byBhbGwgY2xhc3NlcyBieSB0aGVpcgotICAvLyBmdWxseS1xdWFsaWZpZWQgbmFtZXMgaW4gdGhlIGdlbmVyYXRlZCBzb3VyY2UuCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgotICAgICIvLyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKLSAgICAiXG4iLAotICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCkpOwotICBpZiAoIWphdmFfcGFja2FnZV8uZW1wdHkoKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInBhY2thZ2UgJHBhY2thZ2UkO1xuIgotICAgICAgIlxuIiwKLSAgICAgICJwYWNrYWdlIiwgamF2YV9wYWNrYWdlXyk7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInB1YmxpYyBmaW5hbCBjbGFzcyAkY2xhc3NuYW1lJCB7XG4iCi0gICAgIiAgcHJpdmF0ZSAkY2xhc3NuYW1lJCgpIHt9XG4iLAotICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkkbGl0ZSQgcmVnaXN0cnkpIHtcbiIsCi0gICAgImxpdGUiLAotICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkgPyAiIiA6ICJMaXRlIik7Ci0KLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaWYgKCFNdWx0aXBsZUphdmFGaWxlcyhmaWxlXywgaW1tdXRhYmxlX2FwaV8pKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkpIHsKLSAgICAgICAgRW51bUdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpLCBpbW11dGFibGVfYXBpXywgY29udGV4dF8uZ2V0KCkpCi0gICAgICAgICAgICAuR2VuZXJhdGUocHJpbnRlcik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBFbnVtTGl0ZUdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpLCBpbW11dGFibGVfYXBpXywgY29udGV4dF8uZ2V0KCkpCi0gICAgICAgICAgICAuR2VuZXJhdGUocHJpbnRlcik7Ci0gICAgICB9Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOwotICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGUocHJpbnRlcik7Ci0gICAgfQotICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKLSAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxTZXJ2aWNlR2VuZXJhdG9yPiBnZW5lcmF0b3IoCi0gICAgICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld1NlcnZpY2VHZW5lcmF0b3IoZmlsZV8tPnNlcnZpY2UoaSkpKTsKLSAgICAgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZShwcmludGVyKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBFeHRlbnNpb25zIG11c3QgYmUgZ2VuZXJhdGVkIGluIHRoZSBvdXRlciBjbGFzcyBzaW5jZSB0aGV5IGFyZSB2YWx1ZXMsCi0gIC8vIG5vdCBjbGFzc2VzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZShwcmludGVyKTsKLSAgfQotCi0gIC8vIFN0YXRpYyB2YXJpYWJsZXMuIFdlJ2QgbGlrZSB0aGVtIHRvIGJlIGZpbmFsIGlmIHBvc3NpYmxlLCBidXQgZHVlIHRvCi0gIC8vIHRoZSBKVk0ncyA2NGsgc2l6ZSBsaW1pdCBvbiBzdGF0aWMgYmxvY2tzLCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgc29tZQotICAvLyBvZiB0aGVtIGluIG1ldGhvZHM7IHRodXMgdGhleSBjYW5ub3QgYmUgZmluYWwuCi0gIGludCBzdGF0aWNfYmxvY2tfYnl0ZWNvZGVfZXN0aW1hdGUgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoCi0gICAgICAgIHByaW50ZXIsICZzdGF0aWNfYmxvY2tfYnl0ZWNvZGVfZXN0aW1hdGUpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkpIHsKLSAgICBpZiAoaW1tdXRhYmxlX2FwaV8pIHsKLSAgICAgIEdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemF0aW9uQ29kZUZvckltbXV0YWJsZShwcmludGVyKTsKLSAgICB9IGVsc2UgewotICAgICAgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9yTXV0YWJsZShwcmludGVyKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAic3RhdGljIHtcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIGludCBieXRlY29kZV9lc3RpbWF0ZSA9IDA7Ci0gICAgaW50IG1ldGhvZF9udW0gPSAwOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0gbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKLSAgICAgIE1heWJlUmVzdGFydEphdmFNZXRob2QoCi0gICAgICAgIHByaW50ZXIsCi0gICAgICAgICZieXRlY29kZV9lc3RpbWF0ZSwgJm1ldGhvZF9udW0sCi0gICAgICAgICJfY2xpbml0X2F1dG9zcGxpdF8kbWV0aG9kX251bSQoKTtcbiIsCi0gICAgICAgICJwcml2YXRlIHN0YXRpYyB2b2lkIF9jbGluaXRfYXV0b3NwbGl0XyRtZXRob2RfbnVtJCgpIHtcbiIpOwotICAgIH0KLQotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KAotICAgICJcbiIKLSAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG91dGVyX2NsYXNzX3Njb3BlKVxuIik7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuIik7Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9ySW1tdXRhYmxlKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKLSAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCi0gICAgIiAgcmV0dXJuIGRlc2NyaXB0b3I7XG4iCi0gICAgIn1cbiIKLSAgICAicHJpdmF0ZSBzdGF0aWMgJGZpbmFsJCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCi0gICAgIiAgICBkZXNjcmlwdG9yO1xuIgotICAgICJzdGF0aWMge1xuIiwKLSAgICAvLyBUT0RPKGR3ZWlzKTogTWFyayB0aGlzIGFzIGZpbmFsLgotICAgICJmaW5hbCIsICIiKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgU2hhcmVkQ29kZUdlbmVyYXRvciBzaGFyZWRfY29kZV9nZW5lcmF0b3IoZmlsZV8pOwotICBzaGFyZWRfY29kZV9nZW5lcmF0b3IuR2VuZXJhdGVEZXNjcmlwdG9ycyhwcmludGVyKTsKLQotICBpbnQgYnl0ZWNvZGVfZXN0aW1hdGUgPSAwOwotICBpbnQgbWV0aG9kX251bSA9IDA7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGJ5dGVjb2RlX2VzdGltYXRlICs9IG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMocHJpbnRlcik7Ci0gICAgTWF5YmVSZXN0YXJ0SmF2YU1ldGhvZCgKLSAgICAgIHByaW50ZXIsCi0gICAgICAmYnl0ZWNvZGVfZXN0aW1hdGUsICZtZXRob2RfbnVtLAotICAgICAgIl9jbGluaXRfYXV0b3NwbGl0X2Rpbml0XyRtZXRob2RfbnVtJCgpO1xuIiwKLSAgICAgICJwcml2YXRlIHN0YXRpYyB2b2lkIF9jbGluaXRfYXV0b3NwbGl0X2Rpbml0XyRtZXRob2RfbnVtJCgpIHtcbiIpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBieXRlY29kZV9lc3RpbWF0ZSArPSBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKHByaW50ZXIpOwotICAgIE1heWJlUmVzdGFydEphdmFNZXRob2QoCi0gICAgICBwcmludGVyLAotICAgICAgJmJ5dGVjb2RlX2VzdGltYXRlLCAmbWV0aG9kX251bSwKLSAgICAgICJfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQoKTtcbiIsCi0gICAgICAicHJpdmF0ZSBzdGF0aWMgdm9pZCBfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQoKSB7XG4iKTsKLSAgfQotCi0gIC8vIFByb3RvIGNvbXBpbGVyIGJ1aWxkcyBhIERlc2NyaXB0b3JQb29sLCB3aGljaCBob2xkcyBhbGwgdGhlIGRlc2NyaXB0b3JzIHRvCi0gIC8vIGdlbmVyYXRlLCB3aGVuIHByb2Nlc3NpbmcgdGhlICIucHJvdG8iIGZpbGVzLiBXZSBjYWxsIHRoaXMgRGVzY3JpcHRvclBvb2wKLSAgLy8gdGhlIHBhcnNlZCBwb29sIChhLmsuYS4gZmlsZV8tPnBvb2woKSkuCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCB3aGVuIHVzZXJzIHRyeSB0byBleHRlbmQgdGhlICguKilEZXNjcmlwdG9yUHJvdG8gaW4gdGhlaXIKLSAgLy8gIi5wcm90byIgZmlsZXMsIGl0IGRvZXMgbm90IGFmZmVjdCB0aGUgcHJlLWJ1aWx0IEZpbGVEZXNjcmlwdG9yUHJvdG8gY2xhc3MKLSAgLy8gaW4gcHJvdG8gY29tcGlsZXIuIFdoZW4gd2UgcHV0IHRoZSBkZXNjcmlwdG9yIGRhdGEgaW4gdGhlIGZpbGVfcHJvdG8sIHRob3NlCi0gIC8vIGV4dGVuc2lvbnMgYmVjb21lIHVua25vd24gZmllbGRzLgotICAvLwotICAvLyBOb3cgd2UgbmVlZCB0byBmaW5kIG91dCBhbGwgdGhlIGV4dGVuc2lvbiB2YWx1ZSB0byB0aGUgKC4qKURlc2NyaXB0b3JQcm90bwotICAvLyBpbiB0aGUgZmlsZV9wcm90byBtZXNzYWdlLCBhbmQgcHJlcGFyZSBhbiBFeHRlbnNpb25SZWdpc3RyeSB0byByZXR1cm4uCi0gIC8vCi0gIC8vIFRvIGZpbmQgdGhvc2UgZXh0ZW5zaW9ucywgd2UgbmVlZCB0byBwYXJzZSB0aGUgZGF0YSBpbnRvIGEgZHluYW1pYyBtZXNzYWdlCi0gIC8vIG9mIHRoZSBGaWxlRGVzY3JpcHRvciBiYXNlZCBvbiB0aGUgYnVpbGRlci1wb29sLCB0aGVuIHdlIGNhbiB1c2UKLSAgLy8gcmVmbGVjdGlvbnMgdG8gZmluZCBhbGwgZXh0ZW5zaW9uIGZpZWxkcwotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIGZpbGVfLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotICBzdHJpbmcgZmlsZV9kYXRhOwotICBmaWxlX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2RhdGEpOwotICBGaWVsZERlc2NyaXB0b3JTZXQgZXh0ZW5zaW9uczsKLSAgQ29sbGVjdEV4dGVuc2lvbnMoZmlsZV9wcm90bywgKmZpbGVfLT5wb29sKCksICZleHRlbnNpb25zLCBmaWxlX2RhdGEpOwotCi0gIGlmIChleHRlbnNpb25zLnNpemUoKSA+IDApIHsKLSAgICAvLyBNdXN0IGNvbnN0cnVjdCBhbiBFeHRlbnNpb25SZWdpc3RyeSBjb250YWluaW5nIGFsbCBleGlzdGluZyBleHRlbnNpb25zCi0gICAgLy8gYW5kIHVzZSBpdCB0byBwYXJzZSB0aGUgZGVzY3JpcHRvciBkYXRhIGFnYWluIHRvIHJlY29nbml6ZSBleHRlbnNpb25zLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPVxuIgotICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7XG4iKTsKLSAgICBGaWVsZERlc2NyaXB0b3JTZXQ6Oml0ZXJhdG9yIGl0OwotICAgIGZvciAoaXQgPSBleHRlbnNpb25zLmJlZ2luKCk7IGl0ICE9IGV4dGVuc2lvbnMuZW5kKCk7IGl0KyspIHsKLSAgICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RXh0ZW5zaW9uR2VuZXJhdG9yPiBnZW5lcmF0b3IoCi0gICAgICAgICAgZ2VuZXJhdG9yX2ZhY3RvcnlfLT5OZXdFeHRlbnNpb25HZW5lcmF0b3IoKml0KSk7Ci0gICAgICBieXRlY29kZV9lc3RpbWF0ZSArPSBnZW5lcmF0b3ItPkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKLSAgICAgIE1heWJlUmVzdGFydEphdmFNZXRob2QoCi0gICAgICAgIHByaW50ZXIsCi0gICAgICAgICZieXRlY29kZV9lc3RpbWF0ZSwgJm1ldGhvZF9udW0sCi0gICAgICAgICJfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQocmVnaXN0cnkpO1xuIiwKLSAgICAgICAgInByaXZhdGUgc3RhdGljIHZvaWQgX2NsaW5pdF9hdXRvc3BsaXRfZGluaXRfJG1ldGhvZF9udW0kKFxuIgotICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkpIHtcbiIpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCi0gICAgICAiICAgIC5pbnRlcm5hbFVwZGF0ZUZpbGVEZXNjcmlwdG9yKGRlc2NyaXB0b3IsIHJlZ2lzdHJ5KTtcbiIpOwotICB9Ci0KLSAgLy8gRm9yY2UgZGVzY3JpcHRvciBpbml0aWFsaXphdGlvbiBvZiBhbGwgZGVwZW5kZW5jaWVzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIGlmIChTaG91bGRJbmNsdWRlRGVwZW5kZW5jeShmaWxlXy0+ZGVwZW5kZW5jeShpKSwgdHJ1ZSkpIHsKLSAgICAgIHN0cmluZyBkZXBlbmRlbmN5ID0KLSAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGZpbGVfLT5kZXBlbmRlbmN5KGkpKTsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiJGRlcGVuZGVuY3kkLmdldERlc2NyaXB0b3IoKTtcbiIsCi0gICAgICAgICJkZXBlbmRlbmN5IiwgZGVwZW5kZW5jeSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9yTXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCi0gICAgIiAgICBnZXREZXNjcmlwdG9yKCkge1xuIgotICAgICIgIHJldHVybiBkZXNjcmlwdG9yO1xuIgotICAgICJ9XG4iCi0gICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKLSAgICAiICAgIGRlc2NyaXB0b3I7XG4iCi0gICAgInN0YXRpYyB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImRlc2NyaXB0b3IgPSAkaW1tdXRhYmxlX3BhY2thZ2UkLiRkZXNjcmlwdG9yX2NsYXNzbmFtZSQuZGVzY3JpcHRvcjtcbiIsCi0gICAgImltbXV0YWJsZV9wYWNrYWdlIiwgRmlsZUphdmFQYWNrYWdlKGZpbGVfLCB0cnVlKSwKLSAgICAiZGVzY3JpcHRvcl9jbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0RGVzY3JpcHRvckNsYXNzTmFtZShmaWxlXykpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKHByaW50ZXIpOwotICB9Ci0KLSAgLy8gQ2hlY2sgaWYgY3VzdG9tIG9wdGlvbnMgZXhpc3QuIElmIGFueSwgdHJ5IHRvIGxvYWQgaW1tdXRhYmxlIGNsYXNzZXMgc2luY2UKLSAgLy8gY3VzdG9tIG9wdGlvbnMgYXJlIG9ubHkgcmVwcmVzZW50ZWQgd2l0aCBpbW11dGFibGUgbWVzc2FnZXMuCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgZmlsZV8tPkNvcHlUbygmZmlsZV9wcm90byk7Ci0gIHN0cmluZyBmaWxlX2RhdGE7Ci0gIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7Ci0gIEZpZWxkRGVzY3JpcHRvclNldCBleHRlbnNpb25zOwotICBDb2xsZWN0RXh0ZW5zaW9ucyhmaWxlX3Byb3RvLCAqZmlsZV8tPnBvb2woKSwgJmV4dGVuc2lvbnMsIGZpbGVfZGF0YSk7Ci0KLSAgaWYgKGV4dGVuc2lvbnMuc2l6ZSgpID4gMCkgewotICAgIC8vIFRyeSB0byBsb2FkIGltbXV0YWJsZSBtZXNzYWdlcycgb3V0ZXIgY2xhc3MuIEl0cyBpbml0aWFsaXphdGlvbiBjb2RlCi0gICAgLy8gd2lsbCB0YWtlIGNhcmUgb2YgaW50ZXJwcmV0aW5nIGN1c3RvbSBvcHRpb25zLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInRyeSB7XG4iCi0gICAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSB0byBsb2FkIHRoZSBpbW11dGFibGUgY2xhc3MgZHluYW1pY2FsbHkgaGVyZSBhcwotICAgICAgLy8gd2Ugd2FudCB0aGUgbXV0YWJsZSBjb2RlIHRvIGJlIGluZGVwZW5kZW50IGZyb20gdGhlIGltbXV0YWJsZSBjb2RlCi0gICAgICAvLyBhdCBjb21waWxlIHRpbWUuIEl0IGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBkdWFsLWNvbXBpbGUgZm9yCi0gICAgICAvLyBtdXRhYmxlIGFuZCBpbW11dGFibGUgQVBJIGluIGJsYXplLgotICAgICAgIiAgamF2YS5sYW5nLkNsYXNzIGltbXV0YWJsZUNsYXNzID0gamF2YS5sYW5nLkNsYXNzLmZvck5hbWUoXG4iCi0gICAgICAiICAgICAgXCIkaW1tdXRhYmxlX2NsYXNzbmFtZSRcIik7XG4iCi0gICAgICAifSBjYXRjaCAoamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkge1xuIgotICAgICAgLy8gVGhlIGltbXV0YWJsZSBjbGFzcyBjYW4gbm90IGJlIGZvdW5kLiBDdXN0b20gb3B0aW9ucyBhcmUgbGVmdAotICAgICAgLy8gYXMgdW5rbm93biBmaWVsZHMuCi0gICAgICAvLyBUT0RPKHhpYW9mZW5nKTogaW5mb3JtIHRoZSB1c2VyIHdpdGggYSB3YXJuaW5nPwotICAgICAgIn1cbiIsCi0gICAgICAiaW1tdXRhYmxlX2NsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZmlsZV8pKTsKLSAgfQotCi0gIC8vIEZvcmNlIGRlc2NyaXB0b3IgaW5pdGlhbGl6YXRpb24gb2YgYWxsIGRlcGVuZGVuY2llcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoU2hvdWxkSW5jbHVkZURlcGVuZGVuY3koZmlsZV8tPmRlcGVuZGVuY3koaSksIGZhbHNlKSkgewotICAgICAgc3RyaW5nIGRlcGVuZGVuY3kgPSBuYW1lX3Jlc29sdmVyXy0+R2V0TXV0YWJsZUNsYXNzTmFtZSgKLSAgICAgICAgICBmaWxlXy0+ZGVwZW5kZW5jeShpKSk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiRkZXBlbmRlbmN5JC5nZXREZXNjcmlwdG9yKCk7XG4iLAotICAgICAgICAiZGVwZW5kZW5jeSIsIGRlcGVuZGVuY3kpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIpOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBHZW5lcmF0b3JDbGFzcywgdHlwZW5hbWUgRGVzY3JpcHRvckNsYXNzPgotc3RhdGljIHZvaWQgR2VuZXJhdGVTaWJsaW5nKGNvbnN0IHN0cmluZyYgcGFja2FnZV9kaXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBqYXZhX3BhY2thZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvckNsYXNzKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGZpbGVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWVfc3VmZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNsYXNzKiBnZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoR2VuZXJhdG9yQ2xhc3M6OipwZm4pKGlvOjpQcmludGVyKiBwcmludGVyKSkgewotICBzdHJpbmcgZmlsZW5hbWUgPSBwYWNrYWdlX2RpciArIGRlc2NyaXB0b3ItPm5hbWUoKSArIG5hbWVfc3VmZml4ICsgIi5qYXZhIjsKLSAgZmlsZV9saXN0LT5wdXNoX2JhY2soZmlsZW5hbWUpOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoY29udGV4dC0+T3BlbihmaWxlbmFtZSkpOwotICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKLQotICBwcmludGVyLlByaW50KAotICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgotICAgICIvLyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKLSAgICAiXG4iLAotICAgICJmaWxlbmFtZSIsIGRlc2NyaXB0b3ItPmZpbGUoKS0+bmFtZSgpKTsKLSAgaWYgKCFqYXZhX3BhY2thZ2UuZW1wdHkoKSkgewotICAgIHByaW50ZXIuUHJpbnQoCi0gICAgICAicGFja2FnZSAkcGFja2FnZSQ7XG4iCi0gICAgICAiXG4iLAotICAgICAgInBhY2thZ2UiLCBqYXZhX3BhY2thZ2UpOwotICB9Ci0KLSAgKGdlbmVyYXRvci0+KnBmbikoJnByaW50ZXIpOwotfQotCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlU2libGluZ3MoY29uc3Qgc3RyaW5nJiBwYWNrYWdlX2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBmaWxlX2xpc3QpIHsKLSAgaWYgKE11bHRpcGxlSmF2YUZpbGVzKGZpbGVfLCBpbW11dGFibGVfYXBpXykpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgewotICAgICAgICBFbnVtR2VuZXJhdG9yIGdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpLCBpbW11dGFibGVfYXBpXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF8uZ2V0KCkpOwotICAgICAgICBHZW5lcmF0ZVNpYmxpbmc8RW51bUdlbmVyYXRvcj4ocGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+ZW51bV90eXBlKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZmlsZV9saXN0LCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmRW51bUdlbmVyYXRvcjo6R2VuZXJhdGUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRW51bUxpdGVHZW5lcmF0b3IgZ2VuZXJhdG9yKGZpbGVfLT5lbnVtX3R5cGUoaSksIGltbXV0YWJsZV9hcGlfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dF8uZ2V0KCkpOwotICAgICAgICBHZW5lcmF0ZVNpYmxpbmc8RW51bUxpdGVHZW5lcmF0b3I+KHBhY2thZ2VfZGlyLCBqYXZhX3BhY2thZ2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfLT5lbnVtX3R5cGUoaSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZmlsZV9saXN0LCAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZ2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFbnVtTGl0ZUdlbmVyYXRvcjo6R2VuZXJhdGUpOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBpZiAoaW1tdXRhYmxlX2FwaV8pIHsKLSAgICAgICAgR2VuZXJhdGVTaWJsaW5nPE1lc3NhZ2VHZW5lcmF0b3I+KHBhY2thZ2VfZGlyLCBqYXZhX3BhY2thZ2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPckJ1aWxkZXIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZSk7Ci0gICAgICB9Ci0gICAgICBHZW5lcmF0ZVNpYmxpbmc8TWVzc2FnZUdlbmVyYXRvcj4ocGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBmaWxlX2xpc3QsICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlKTsKLSAgICB9Ci0gICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpKSB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgewotICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPFNlcnZpY2VHZW5lcmF0b3I+IGdlbmVyYXRvcigKLSAgICAgICAgICAgIGdlbmVyYXRvcl9mYWN0b3J5Xy0+TmV3U2VydmljZUdlbmVyYXRvcihmaWxlXy0+c2VydmljZShpKSkpOwotICAgICAgICBHZW5lcmF0ZVNpYmxpbmc8U2VydmljZUdlbmVyYXRvcj4ocGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+c2VydmljZShpKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3IuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGUpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIEZpbGVHZW5lcmF0b3I6OlNob3VsZEluY2x1ZGVEZXBlbmRlbmN5KAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGltbXV0YWJsZV9hcGkpIHsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBqYXZhCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3ZGJlYjk0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRklMRV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRklMRV9IX18KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBjbGFzcyBGaWxlRGVzY3JpcHRvcjsgICAgICAgICAgLy8gZGVzY3JpcHRvci5oCi0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgICAvLyBwcmludGVyLmgKLSAgfQotICBuYW1lc3BhY2UgY29tcGlsZXIgewotICAgIGNsYXNzIEdlbmVyYXRvckNvbnRleHQ7ICAgICAgLy8gY29kZV9nZW5lcmF0b3IuaAotICAgIG5hbWVzcGFjZSBqYXZhIHsKLSAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAgIC8vIGNvbnRleHQuaAotICAgICAgY2xhc3MgTWVzc2FnZUdlbmVyYXRvcjsgICAgLy8gbWVzc2FnZS5oCi0gICAgICBjbGFzcyBHZW5lcmF0b3JGYWN0b3J5OyAgICAvLyBnZW5lcmF0b3JfZmFjdG9yeS5oCi0gICAgICBjbGFzcyBFeHRlbnNpb25HZW5lcmF0b3I7ICAvLyBleHRlbnNpb24uaAotICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAgLy8gbmFtZV9yZXNvbHZlci5oCi0gICAgfQotICB9Ci19Ci0KLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGphdmEgewotCi1jbGFzcyBGaWxlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIEZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW1tdXRhYmxlX2FwaSA9IHRydWUsCi0gICAgICAgICAgICAgICAgYm9vbCBlbmZvcmNlX2xpdGUgPSBmYWxzZSk7Ci0gIH5GaWxlR2VuZXJhdG9yKCk7Ci0KLSAgLy8gQ2hlY2tzIGZvciBwcm9ibGVtcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBsZWFkIHRvIGNyeXB0aWMgY29tcGlsZSBlcnJvcnMuCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGVyZSBhcmUgbm8gcHJvYmxlbXMsIG9yIHdyaXRlcyBhbiBlcnJvciBkZXNjcmlwdGlvbiB0bwotICAvLyB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCByZXR1cm5zIGZhbHNlIG90aGVyd2lzZS4KLSAgYm9vbCBWYWxpZGF0ZShzdHJpbmcqIGVycm9yKTsKLQotICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBJZiB3ZSBhcmVuJ3QgcHV0dGluZyBldmVyeXRoaW5nIGludG8gb25lIGZpbGUsIHRoaXMgd2lsbCB3cml0ZSBhbGwgdGhlCi0gIC8vIGZpbGVzIG90aGVyIHRoYW4gdGhlIG91dGVyIGZpbGUgKGkuZS4gb25lIGZvciBlYWNoIG1lc3NhZ2UsIGVudW0sIGFuZAotICAvLyBzZXJ2aWNlIHR5cGUpLgotICB2b2lkIEdlbmVyYXRlU2libGluZ3MoY29uc3Qgc3RyaW5nJiBwYWNrYWdlX2RpciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGZpbGVfbGlzdCk7Ci0KLSAgY29uc3Qgc3RyaW5nJiBqYXZhX3BhY2thZ2UoKSB7IHJldHVybiBqYXZhX3BhY2thZ2VfOyB9Ci0gIGNvbnN0IHN0cmluZyYgY2xhc3NuYW1lKCkgICAgeyByZXR1cm4gY2xhc3NuYW1lXzsgICAgfQotCi0KLSBwcml2YXRlOgotICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemF0aW9uQ29kZUZvckltbXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9yTXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgYm9vbCBTaG91bGRJbmNsdWRlRGVwZW5kZW5jeShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGlfKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87Ci0gIHN0cmluZyBqYXZhX3BhY2thZ2VfOwotICBzdHJpbmcgY2xhc3NuYW1lXzsKLQotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPiA+IG1lc3NhZ2VfZ2VuZXJhdG9yc187Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8R2VuZXJhdG9yRmFjdG9yeT4gZ2VuZXJhdG9yX2ZhY3RvcnlfOwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPENvbnRleHQ+IGNvbnRleHRfOwotICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87Ci0gIGJvb2wgaW1tdXRhYmxlX2FwaV87Ci0KLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZUdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUxFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhNDZjN2ZjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDE3NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oPgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotCi1KYXZhR2VuZXJhdG9yOjpKYXZhR2VuZXJhdG9yKCkge30KLUphdmFHZW5lcmF0b3I6On5KYXZhR2VuZXJhdG9yKCkge30KLQotYm9vbCBKYXZhR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gcGFyc2UgZ2VuZXJhdG9yIG9wdGlvbnMKLQotICAvLyBOYW1lIGEgZmlsZSB3aGVyZSB3ZSB3aWxsIHdyaXRlIGEgbGlzdCBvZiBnZW5lcmF0ZWQgZmlsZSBuYW1lcywgb25lCi0gIC8vIHBlciBsaW5lLgotICBzdHJpbmcgb3V0cHV0X2xpc3RfZmlsZTsKLQotCi0gIHZlY3RvcjxwYWlyPHN0cmluZywgc3RyaW5nPiA+IG9wdGlvbnM7Ci0gIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKHBhcmFtZXRlciwgJm9wdGlvbnMpOwotCi0gIGJvb2wgZ2VuZXJhdGVfaW1tdXRhYmxlX2NvZGUgPSBmYWxzZTsKLSAgYm9vbCBnZW5lcmF0ZV9tdXRhYmxlX2NvZGUgPSBmYWxzZTsKLSAgYm9vbCBnZW5lcmF0ZV9zaGFyZWRfY29kZSA9IGZhbHNlOwotICBib29sIGVuZm9yY2VfbGl0ZSA9IGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAib3V0cHV0X2xpc3RfZmlsZSIpIHsKLSAgICAgIG91dHB1dF9saXN0X2ZpbGUgPSBvcHRpb25zW2ldLnNlY29uZDsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImltbXV0YWJsZSIpIHsKLSAgICAgIGdlbmVyYXRlX2ltbXV0YWJsZV9jb2RlID0gdHJ1ZTsKLSAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gIm11dGFibGUiKSB7Ci0gICAgICBnZW5lcmF0ZV9tdXRhYmxlX2NvZGUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAic2hhcmVkIikgewotICAgICAgZ2VuZXJhdGVfc2hhcmVkX2NvZGUgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAibGl0ZSIpIHsKLSAgICAgIC8vIFdoZW4gc2V0LCB0aGUgcHJvdG9jIHdpbGwgZ2VuZXJhdGUgdGhlIGN1cnJlbnQgZmlsZXMgYW5kIGFsbCB0aGUKLSAgICAgIC8vIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIGFzIGxpdGUgcnVudGltZS4KLSAgICAgIGVuZm9yY2VfbGl0ZSA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgICplcnJvciA9ICJVbmtub3duIGdlbmVyYXRvciBvcHRpb246ICIgKyBvcHRpb25zW2ldLmZpcnN0OwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIGlmIChlbmZvcmNlX2xpdGUgJiYgZ2VuZXJhdGVfbXV0YWJsZV9jb2RlKSB7Ci0gICAgKmVycm9yID0gImxpdGUgcnVudGltZSBnZW5lcmF0b3Igb3B0aW9uIGNhbm5vdCBiZSB1c2VkIHdpdGggbXV0YWJsZSBBUEkuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBCeSBkZWZhdWx0IHdlIGdlbmVyYXRlIGltbXV0YWJsZSBjb2RlIGFuZCBzaGFyZWQgY29kZSBmb3IgaW1tdXRhYmxlIEFQSS4KLSAgaWYgKCFnZW5lcmF0ZV9pbW11dGFibGVfY29kZSAmJiAhZ2VuZXJhdGVfbXV0YWJsZV9jb2RlICYmCi0gICAgICAhZ2VuZXJhdGVfc2hhcmVkX2NvZGUpIHsKLSAgICBnZW5lcmF0ZV9pbW11dGFibGVfY29kZSA9IHRydWU7Ci0gICAgZ2VuZXJhdGVfc2hhcmVkX2NvZGUgPSB0cnVlOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0gIHZlY3RvcjxzdHJpbmc+IGFsbF9maWxlczsKLQotCi0gIHZlY3RvcjxGaWxlR2VuZXJhdG9yKj4gZmlsZV9nZW5lcmF0b3JzOwotICBpZiAoZ2VuZXJhdGVfaW1tdXRhYmxlX2NvZGUpIHsKLSAgICBmaWxlX2dlbmVyYXRvcnMucHVzaF9iYWNrKAotICAgICAgICBuZXcgRmlsZUdlbmVyYXRvcihmaWxlLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlLCBlbmZvcmNlX2xpdGUpKTsKLSAgfQotICBpZiAoZ2VuZXJhdGVfbXV0YWJsZV9jb2RlKSB7Ci0gICAgZmlsZV9nZW5lcmF0b3JzLnB1c2hfYmFjaygKLSAgICAgICAgbmV3IEZpbGVHZW5lcmF0b3IoZmlsZSwgLyogbXV0YWJsZSA9ICovIGZhbHNlLCBlbmZvcmNlX2xpdGUpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZ2VuZXJhdG9ycy5zaXplKCk7ICsraSkgewotICAgIGlmICghZmlsZV9nZW5lcmF0b3JzW2ldLT5WYWxpZGF0ZShlcnJvcikpIHsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZV9nZW5lcmF0b3JzLnNpemUoKTsgKytqKSB7Ci0gICAgICAgIGRlbGV0ZSBmaWxlX2dlbmVyYXRvcnNbal07Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX2dlbmVyYXRvcnMuc2l6ZSgpOyArK2kpIHsKLSAgICBGaWxlR2VuZXJhdG9yKiBmaWxlX2dlbmVyYXRvciA9IGZpbGVfZ2VuZXJhdG9yc1tpXTsKLQotICAgIHN0cmluZyBwYWNrYWdlX2RpciA9IEphdmFQYWNrYWdlVG9EaXIoZmlsZV9nZW5lcmF0b3ItPmphdmFfcGFja2FnZSgpKTsKLQotICAgIHN0cmluZyBqYXZhX2ZpbGVuYW1lID0gcGFja2FnZV9kaXI7Ci0gICAgamF2YV9maWxlbmFtZSArPSBmaWxlX2dlbmVyYXRvci0+Y2xhc3NuYW1lKCk7Ci0gICAgamF2YV9maWxlbmFtZSArPSAiLmphdmEiOwotICAgIGFsbF9maWxlcy5wdXNoX2JhY2soamF2YV9maWxlbmFtZSk7Ci0KLSAgICAvLyBHZW5lcmF0ZSBtYWluIGphdmEgZmlsZS4KLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgICBjb250ZXh0LT5PcGVuKGphdmFfZmlsZW5hbWUpKTsKLSAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKLSAgICBmaWxlX2dlbmVyYXRvci0+R2VuZXJhdGUoJnByaW50ZXIpOwotCi0gICAgLy8gR2VuZXJhdGUgc2libGluZyBmaWxlcy4KLSAgICBmaWxlX2dlbmVyYXRvci0+R2VuZXJhdGVTaWJsaW5ncyhwYWNrYWdlX2RpciwgY29udGV4dCwgJmFsbF9maWxlcyk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZ2VuZXJhdG9ycy5zaXplKCk7ICsraSkgewotICAgIGRlbGV0ZSBmaWxlX2dlbmVyYXRvcnNbaV07Ci0gIH0KLSAgZmlsZV9nZW5lcmF0b3JzLmNsZWFyKCk7Ci0KLSAgLy8gR2VuZXJhdGUgb3V0cHV0IGxpc3QgaWYgcmVxdWVzdGVkLgotICBpZiAoIW91dHB1dF9saXN0X2ZpbGUuZW1wdHkoKSkgewotICAgIC8vIEdlbmVyYXRlIG91dHB1dCBsaXN0LiAgVGhpcyBpcyBqdXN0IGEgc2ltcGxlIHRleHQgZmlsZSBwbGFjZWQgaW4gYQotICAgIC8vIGRldGVybWluaXN0aWMgbG9jYXRpb24gd2hpY2ggbGlzdHMgdGhlIC5qYXZhIGZpbGVzIGJlaW5nIGdlbmVyYXRlZC4KLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gc3JjbGlzdF9yYXdfb3V0cHV0KAotICAgICAgICBjb250ZXh0LT5PcGVuKG91dHB1dF9saXN0X2ZpbGUpKTsKLSAgICBpbzo6UHJpbnRlciBzcmNsaXN0X3ByaW50ZXIoc3JjbGlzdF9yYXdfb3V0cHV0LmdldCgpLCAnJCcpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBzcmNsaXN0X3ByaW50ZXIuUHJpbnQoIiRmaWxlbmFtZSRcbiIsICJmaWxlbmFtZSIsIGFsbF9maWxlc1tpXSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBqYXZhCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDdmNzZiZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDcyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBHZW5lcmF0ZXMgSmF2YSBjb2RlIGZvciBhIGdpdmVuIC5wcm90byBmaWxlLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0dFTkVSQVRPUl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfR0VORVJBVE9SX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGphdmEgewotCi0vLyBDb2RlR2VuZXJhdG9yIGltcGxlbWVudGF0aW9uIHdoaWNoIGdlbmVyYXRlcyBKYXZhIGNvZGUuICBJZiB5b3UgY3JlYXRlIHlvdXIKLS8vIG93biBwcm90b2NvbCBjb21waWxlciBiaW5hcnkgYW5kIHlvdSB3YW50IGl0IHRvIHN1cHBvcnQgSmF2YSBvdXRwdXQsIHlvdQotLy8gY2FuIGRvIHNvIGJ5IHJlZ2lzdGVyaW5nIGFuIGluc3RhbmNlIG9mIHRoaXMgQ29kZUdlbmVyYXRvciB3aXRoIHRoZQotLy8gQ29tbWFuZExpbmVJbnRlcmZhY2UgaW4geW91ciBtYWluKCkgZnVuY3Rpb24uCi1jbGFzcyBMSUJQUk9UT0NfRVhQT1JUIEphdmFHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBKYXZhR2VuZXJhdG9yKCk7Ci0gIH5KYXZhR2VuZXJhdG9yKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBDb2RlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEphdmFHZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGphdmEKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGUyNDg5NGIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYworKysgL2Rldi9udWxsCkBAIC0xLDc1NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lX3Jlc29sdmVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLXVzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwotdXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOwotCi1jb25zdCBjaGFyIGtUaGlja1NlcGFyYXRvcltdID0KLSAgIi8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT1cbiI7Ci1jb25zdCBjaGFyIGtUaGluU2VwYXJhdG9yW10gPQotICAiLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIjsKLQotbmFtZXNwYWNlIHsKLQotY29uc3QgY2hhcioga0RlZmF1bHRQYWNrYWdlID0gIiI7Ci0KLS8vIE5hbWVzIHRoYXQgc2hvdWxkIGJlIGF2b2lkZWQgYXMgZmllbGQgbmFtZXMuCi0vLyBVc2luZyB0aGVtIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGFjY2Vzc29ycyB3aG9zZSBuYW1lcyBhcmUKLS8vIGNvbGxpZGluZyB3aXRoIG1ldGhvZHMgZGVmaW5lZCBpbiBiYXNlIGNsYXNzZXMuCi1jb25zdCBjaGFyKiBrRm9yYmlkZGVuV29yZExpc3RbXSA9IHsKLSAgLy8gbWVzc2FnZSBiYXNlIGNsYXNzOgotICAiY2FjaGVkX3NpemUiLCAic2VyaWFsaXplZF9zaXplIiwKLSAgLy8gamF2YS5sYW5nLk9iamVjdDoKLSAgImNsYXNzIiwKLX07Ci0KLWJvb2wgSXNGb3JiaWRkZW4oY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShrRm9yYmlkZGVuV29yZExpc3QpOyArK2kpIHsKLSAgICBpZiAoZmllbGRfbmFtZSA9PSBrRm9yYmlkZGVuV29yZExpc3RbaV0pIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXN0cmluZyBGaWVsZE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBzdHJpbmcgZmllbGRfbmFtZTsKLSAgLy8gR3JvdXBzIGFyZSBoYWNreTogIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpcyBqdXN0IHRoZSBsb3dlci1jYXNlZCBuYW1lCi0gIC8vIG9mIHRoZSBncm91cCB0eXBlLiAgSW4gSmF2YSwgdGhvdWdoLCB3ZSB3b3VsZCBsaWtlIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwKLSAgLy8gY2FwaXRhbGl6YXRpb24gb2YgdGhlIHR5cGUgbmFtZS4KLSAgaWYgKEdldFR5cGUoZmllbGQpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgewotICAgIGZpZWxkX25hbWUgPSBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm5hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBmaWVsZF9uYW1lID0gZmllbGQtPm5hbWUoKTsKLSAgfQotICBpZiAoSXNGb3JiaWRkZW4oZmllbGRfbmFtZSkpIHsKLSAgICAvLyBBcHBlbmQgYSB0cmFpbGluZyAiIyIgdG8gaW5kaWNhdGUgdGhhdCB0aGUgbmFtZSBzaG91bGQgYmUgZGVjb3JhdGVkIHRvCi0gICAgLy8gYXZvaWQgY29sbGlzaW9uIHdpdGggb3RoZXIgbmFtZXMuCi0gICAgZmllbGRfbmFtZSArPSAiIyI7Ci0gIH0KLSAgcmV0dXJuIGZpZWxkX25hbWU7Ci19Ci0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgY2FwX25leHRfbGV0dGVyKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoJ2EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICd6JykgewotICAgICAgaWYgKGNhcF9uZXh0X2xldHRlcikgewotICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV0gKyAoJ0EnIC0gJ2EnKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKLSAgICAgIH0KLSAgICAgIGNhcF9uZXh0X2xldHRlciA9IGZhbHNlOwotICAgIH0gZWxzZSBpZiAoJ0EnIDw9IGlucHV0W2ldICYmIGlucHV0W2ldIDw9ICdaJykgewotICAgICAgaWYgKGkgPT0gMCAmJiAhY2FwX25leHRfbGV0dGVyKSB7Ci0gICAgICAgIC8vIEZvcmNlIGZpcnN0IGxldHRlciB0byBsb3dlci1jYXNlIHVubGVzcyBleHBsaWNpdGx5IHRvbGQgdG8KLSAgICAgICAgLy8gY2FwaXRhbGl6ZSBpdC4KLSAgICAgICAgcmVzdWx0ICs9IGlucHV0W2ldICsgKCdhJyAtICdBJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBDYXBpdGFsIGxldHRlcnMgYWZ0ZXIgdGhlIGZpcnN0IGFyZSBsZWZ0IGFzLWlzLgotICAgICAgICByZXN1bHQgKz0gaW5wdXRbaV07Ci0gICAgICB9Ci0gICAgICBjYXBfbmV4dF9sZXR0ZXIgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKCcwJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAnOScpIHsKLSAgICAgIHJlc3VsdCArPSBpbnB1dFtpXTsKLSAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7Ci0gICAgfQotICB9Ci0gIC8vIEFkZCBhIHRyYWlsaW5nICJfIiBpZiB0aGUgbmFtZSBzaG91bGQgYmUgYWx0ZXJlZC4KLSAgaWYgKGlucHV0W2lucHV0LnNpemUoKSAtIDFdID09ICcjJykgewotICAgIHJlc3VsdCArPSAnXyc7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShGaWVsZE5hbWUoZmllbGQpLCBmYWxzZSk7Ci19Ci0KLXN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShGaWVsZE5hbWUoZmllbGQpLCB0cnVlKTsKLX0KLQotc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSB7Ci0gIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZC0+bmFtZSgpLCBmYWxzZSk7Ci19Ci0KLXN0cmluZyBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuICJzdGF0aWNfIiArIFN0cmluZ1JlcGxhY2UoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksICIuIiwgIl8iLCB0cnVlKTsKLX0KLQotc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICBpZiAoSGFzU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvZGV2ZWwiKSkgewotICAgIHJldHVybiBTdHJpcFN1ZmZpeFN0cmluZyhmaWxlbmFtZSwgIi5wcm90b2RldmVsIik7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFN0cmlwU3VmZml4U3RyaW5nKGZpbGVuYW1lLCAiLnByb3RvIik7Ci0gIH0KLX0KLQotc3RyaW5nIEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW1tdXRhYmxlKSB7Ci0gIENsYXNzTmFtZVJlc29sdmVyIG5hbWVfcmVzb2x2ZXI7Ci0gIHJldHVybiBuYW1lX3Jlc29sdmVyLkdldEZpbGVDbGFzc05hbWUoZmlsZSwgaW1tdXRhYmxlKTsKLX0KLQotc3RyaW5nIEZpbGVKYXZhUGFja2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBpbW11dGFibGUpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLQotICBpZiAoZmlsZS0+b3B0aW9ucygpLmhhc19qYXZhX3BhY2thZ2UoKSkgewotICAgIHJlc3VsdCA9IGZpbGUtPm9wdGlvbnMoKS5qYXZhX3BhY2thZ2UoKTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQgPSBrRGVmYXVsdFBhY2thZ2U7Ci0gICAgaWYgKCFmaWxlLT5wYWNrYWdlKCkuZW1wdHkoKSkgewotICAgICAgaWYgKCFyZXN1bHQuZW1wdHkoKSkgcmVzdWx0ICs9ICcuJzsKLSAgICAgIHJlc3VsdCArPSBmaWxlLT5wYWNrYWdlKCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIEphdmFQYWNrYWdlVG9EaXIoc3RyaW5nIHBhY2thZ2VfbmFtZSkgewotICBzdHJpbmcgcGFja2FnZV9kaXIgPQotICAgIFN0cmluZ1JlcGxhY2UocGFja2FnZV9uYW1lLCAiLiIsICIvIiwgdHJ1ZSk7Ci0gIGlmICghcGFja2FnZV9kaXIuZW1wdHkoKSkgcGFja2FnZV9kaXIgKz0gIi8iOwotICByZXR1cm4gcGFja2FnZV9kaXI7Ci19Ci0KLS8vIFRPRE8oeGlhb2ZlbmcpOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkga2VwdCBmb3IgaXQncyBwdWJsaWNseSByZWZlcmVuY2VkLgotLy8gSXQgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgbXV0YWJsZSBBUEkgdXAtaW50ZWdyYXRpb24uCi1zdHJpbmcgVG9KYXZhTmFtZShjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIGlmIChmaWxlLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpKSB7Ci0gICAgcmVzdWx0ID0gRmlsZUphdmFQYWNrYWdlKGZpbGUpOwotICB9IGVsc2UgewotICAgIHJlc3VsdCA9IENsYXNzTmFtZShmaWxlKTsKLSAgfQotICBpZiAoIXJlc3VsdC5lbXB0eSgpKSB7Ci0gICAgcmVzdWx0ICs9ICcuJzsKLSAgfQotICBpZiAoZmlsZS0+cGFja2FnZSgpLmVtcHR5KCkpIHsKLSAgICByZXN1bHQgKz0gZnVsbF9uYW1lOwotICB9IGVsc2UgewotICAgIC8vIFN0cmlwIHRoZSBwcm90byBwYWNrYWdlIGZyb20gZnVsbF9uYW1lIHNpbmNlIHdlJ3ZlIHJlcGxhY2VkIGl0IHdpdGgKLSAgICAvLyB0aGUgSmF2YSBwYWNrYWdlLgotICAgIHJlc3VsdCArPSBmdWxsX25hbWUuc3Vic3RyKGZpbGUtPnBhY2thZ2UoKS5zaXplKCkgKyAxKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgQ2xhc3NOYW1lUmVzb2x2ZXIgbmFtZV9yZXNvbHZlcjsKLSAgcmV0dXJuIG5hbWVfcmVzb2x2ZXIuR2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3IsIHRydWUpOwotfQotCi1zdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIENsYXNzTmFtZVJlc29sdmVyIG5hbWVfcmVzb2x2ZXI7Ci0gIHJldHVybiBuYW1lX3Jlc29sdmVyLkdldENsYXNzTmFtZShkZXNjcmlwdG9yLCB0cnVlKTsKLX0KLQotc3RyaW5nIENsYXNzTmFtZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBDbGFzc05hbWVSZXNvbHZlciBuYW1lX3Jlc29sdmVyOwotICByZXR1cm4gbmFtZV9yZXNvbHZlci5HZXRDbGFzc05hbWUoZGVzY3JpcHRvciwgdHJ1ZSk7Ci19Ci0KLXN0cmluZyBDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgQ2xhc3NOYW1lUmVzb2x2ZXIgbmFtZV9yZXNvbHZlcjsKLSAgcmV0dXJuIG5hbWVfcmVzb2x2ZXIuR2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3IsIHRydWUpOwotfQotCi1zdHJpbmcgRXh0cmFNZXNzYWdlSW50ZXJmYWNlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHN0cmluZyBpbnRlcmZhY2VzID0gIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2ltcGxlbWVudHM6IgotICAgICAgKyBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICIpIjsKLSAgcmV0dXJuIGludGVyZmFjZXM7Ci19Ci0KLQotc3RyaW5nIEV4dHJhQnVpbGRlckludGVyZmFjZXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBzdHJpbmcgaW50ZXJmYWNlcyA9ICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYnVpbGRlcl9pbXBsZW1lbnRzOiIKLSAgICAgICsgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKyAiKSI7Ci0gIHJldHVybiBpbnRlcmZhY2VzOwotfQotCi1zdHJpbmcgRXh0cmFNZXNzYWdlT3JCdWlsZGVySW50ZXJmYWNlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHN0cmluZyBpbnRlcmZhY2VzID0gIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbnRlcmZhY2VfZXh0ZW5kczoiCi0gICAgICArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIikiOwotICByZXR1cm4gaW50ZXJmYWNlczsKLX0KLQotc3RyaW5nIEZpZWxkQ29uc3RhbnROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqZmllbGQpIHsKLSAgc3RyaW5nIG5hbWUgPSBmaWVsZC0+bmFtZSgpICsgIl9GSUVMRF9OVU1CRVIiOwotICBVcHBlclN0cmluZygmbmFtZSk7Ci0gIHJldHVybiBuYW1lOwotfQotCi1GaWVsZERlc2NyaXB0b3I6OlR5cGUgR2V0VHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHJldHVybiBmaWVsZC0+dHlwZSgpOwotfQotCi1KYXZhVHlwZSBHZXRKYXZhVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHN3aXRjaCAoR2V0VHlwZShmaWVsZCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6Ci0gICAgICByZXR1cm4gSkFWQVRZUEVfSU5UOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQ6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgotICAgICAgcmV0dXJuIEpBVkFUWVBFX0xPTkc7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVDoKLSAgICAgIHJldHVybiBKQVZBVFlQRV9GTE9BVDsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKLSAgICAgIHJldHVybiBKQVZBVFlQRV9ET1VCTEU7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgotICAgICAgcmV0dXJuIEpBVkFUWVBFX0JPT0xFQU47Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gSkFWQVRZUEVfU1RSSU5HOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6Ci0gICAgICByZXR1cm4gSkFWQVRZUEVfQllURVM7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgotICAgICAgcmV0dXJuIEpBVkFUWVBFX0VOVU07Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuIEpBVkFUWVBFX01FU1NBR0U7Ci0KLSAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwotICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KLSAgfQotCi0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICByZXR1cm4gSkFWQVRZUEVfSU5UOwotfQotCi1jb25zdCBjaGFyKiBQcmltaXRpdmVUeXBlTmFtZShKYXZhVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgSkFWQVRZUEVfSU5UICAgIDogcmV0dXJuICJpbnQiOwotICAgIGNhc2UgSkFWQVRZUEVfTE9ORyAgIDogcmV0dXJuICJsb25nIjsKLSAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUICA6IHJldHVybiAiZmxvYXQiOwotICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFIDogcmV0dXJuICJkb3VibGUiOwotICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjogcmV0dXJuICJib29sZWFuIjsKLSAgICBjYXNlIEpBVkFUWVBFX1NUUklORyA6IHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Ci0gICAgY2FzZSBKQVZBVFlQRV9CWVRFUyAgOiByZXR1cm4gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyI7Ci0gICAgY2FzZSBKQVZBVFlQRV9FTlVNICAgOiByZXR1cm4gTlVMTDsKLSAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6IHJldHVybiBOVUxMOwotCi0gICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKLSAgICAvLyBKYXZhVHlwZXMgYXJlIGFkZGVkLgotICB9Ci0KLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBjaGFyKiBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEphdmFUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBKQVZBVFlQRV9JTlQgICAgOiByZXR1cm4gImphdmEubGFuZy5JbnRlZ2VyIjsKLSAgICBjYXNlIEpBVkFUWVBFX0xPTkcgICA6IHJldHVybiAiamF2YS5sYW5nLkxvbmciOwotICAgIGNhc2UgSkFWQVRZUEVfRkxPQVQgIDogcmV0dXJuICJqYXZhLmxhbmcuRmxvYXQiOwotICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFIDogcmV0dXJuICJqYXZhLmxhbmcuRG91YmxlIjsKLSAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46IHJldHVybiAiamF2YS5sYW5nLkJvb2xlYW4iOwotICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HIDogcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKLSAgICBjYXNlIEpBVkFUWVBFX0JZVEVTICA6IHJldHVybiAiY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIjsKLSAgICBjYXNlIEpBVkFUWVBFX0VOVU0gICA6IHJldHVybiBOVUxMOwotICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRTogcmV0dXJuIE5VTEw7Ci0KLSAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwotICAgIC8vIEphdmFUeXBlcyBhcmUgYWRkZWQuCi0gIH0KLQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IGNoYXIqIEZpZWxkVHlwZU5hbWUoRmllbGREZXNjcmlwdG9yOjpUeXBlIGZpZWxkX3R5cGUpIHsKLSAgc3dpdGNoIChmaWVsZF90eXBlKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAiSU5UMzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMiAgOiByZXR1cm4gIlVJTlQzMiI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyICA6IHJldHVybiAiU0lOVDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyIDogcmV0dXJuICJGSVhFRDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjogcmV0dXJuICJTRklYRUQzMiI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQgICA6IHJldHVybiAiSU5UNjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NCAgOiByZXR1cm4gIlVJTlQ2NCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0ICA6IHJldHVybiAiU0lOVDY0IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuICJGSVhFRDY0IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuICJTRklYRUQ2NCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiAiRkxPQVQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRSAgOiByZXR1cm4gIkRPVUJMRSI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiAiQk9PTCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICA6IHJldHVybiAiU1RSSU5HIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuICJCWVRFUyI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRU5VTSI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICA6IHJldHVybiAiR1JPVVAiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gIk1FU1NBR0UiOwotCi0gICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKLSAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCi0gIH0KLQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWJvb2wgQWxsQXNjaWkoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5zaXplKCk7IGkrKykgewotICAgIGlmICgodGV4dFtpXSAmIDB4ODApICE9IDApIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0cmluZyBEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCBpbW11dGFibGUsCi0gICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyKSB7Ci0gIC8vIFN3aXRjaCBvbiBDcHBUeXBlIHNpbmNlIHdlIG5lZWQgdG8ga25vdyB3aGljaCBkZWZhdWx0X3ZhbHVlXyogbWV0aG9kCi0gIC8vIG9mIEZpZWxkRGVzY3JpcHRvciB0byBjYWxsLgotICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6Ci0gICAgICAvLyBOZWVkIHRvIHByaW50IGFzIGEgc2lnbmVkIGludCBzaW5jZSBKYXZhIGhhcyBubyB1bnNpZ25lZC4KLSAgICAgIHJldHVybiBTaW1wbGVJdG9hKHN0YXRpY19jYXN0PGludDMyPihmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSkpOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgotICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50NjQoKSkgKyAiTCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgotICAgICAgcmV0dXJuIFNpbXBsZUl0b2Eoc3RhdGljX2Nhc3Q8aW50NjQ+KGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKSkgKwotICAgICAgICAgICAgICJMIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKLSAgICAgIGRvdWJsZSB2YWx1ZSA9IGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpOwotICAgICAgaWYgKHZhbHVlID09IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKLSAgICAgICAgcmV0dXJuICJEb3VibGUuUE9TSVRJVkVfSU5GSU5JVFkiOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgewotICAgICAgICByZXR1cm4gIkRvdWJsZS5ORUdBVElWRV9JTkZJTklUWSI7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7Ci0gICAgICAgIHJldHVybiAiRG91YmxlLk5hTiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gU2ltcGxlRHRvYSh2YWx1ZSkgKyAiRCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBmbG9hdCB2YWx1ZSA9IGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0KCk7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7Ci0gICAgICAgIHJldHVybiAiRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFkiOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7Ci0gICAgICAgIHJldHVybiAiRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFkiOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSAhPSB2YWx1ZSkgewotICAgICAgICByZXR1cm4gIkZsb2F0Lk5hTiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gU2ltcGxlRnRvYSh2YWx1ZSkgKyAiRiI7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6Ci0gICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfYm9vbCgpID8gInRydWUiIDogImZhbHNlIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICBpZiAoR2V0VHlwZShmaWVsZCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7Ci0gICAgICAgIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgewotICAgICAgICAgIC8vIFNlZSBjb21tZW50cyBpbiBJbnRlcm5hbC5qYXZhIGZvciBnb3J5IGRldGFpbHMuCi0gICAgICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCi0gICAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5ieXRlc0RlZmF1bHRWYWx1ZShcIiQwXCIpIiwKLSAgICAgICAgICAgIENFc2NhcGUoZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5FTVBUWSI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChBbGxBc2NpaShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpIHsKLSAgICAgICAgICAvLyBBbGwgY2hhcnMgYXJlIEFTQ0lJLiAgSW4gdGhpcyBjYXNlIENFc2NhcGUoKSB3b3JrcyBmaW5lLgotICAgICAgICAgIHJldHVybiAiXCIiICsgQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkgKyAiXCIiOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFNlZSBjb21tZW50cyBpbiBJbnRlcm5hbC5qYXZhIGZvciBnb3J5IGRldGFpbHMuCi0gICAgICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoCi0gICAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLnN0cmluZ0RlZmF1bHRWYWx1ZShcIiQwXCIpIiwKLSAgICAgICAgICAgICAgQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgcmV0dXJuIG5hbWVfcmVzb2x2ZXItPkdldENsYXNzTmFtZShmaWVsZC0+ZW51bV90eXBlKCksIGltbXV0YWJsZSkgKyAiLiIgKwotICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bmFtZSgpOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgIHJldHVybiBuYW1lX3Jlc29sdmVyLT5HZXRDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBpbW11dGFibGUpICsKLSAgICAgICAgICAiLmdldERlZmF1bHRJbnN0YW5jZSgpIjsKLQotICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3Ci0gICAgLy8gdHlwZXMgYXJlIGFkZGVkLgotICB9Ci0KLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gIHJldHVybiAiIjsKLX0KLQotYm9vbCBJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgLy8gU3dpdGNoIG9uIENwcFR5cGUgc2luY2Ugd2UgbmVlZCB0byBrbm93IHdoaWNoIGRlZmF1bHRfdmFsdWVfKiBtZXRob2QKLSAgLy8gb2YgRmllbGREZXNjcmlwdG9yIHRvIGNhbGwuCi0gIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKLSAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpID09IDA7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgotICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpID09IDA7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6Ci0gICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50NjQoKSA9PSAwTDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDY0KCkgPT0gMEw7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpID09IDAuMDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKLSAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpID09IDAuMDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgotICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2Jvb2woKSA9PSBmYWxzZTsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwotICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KLSAgfQotCi0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWNvbnN0IGNoYXIqIGJpdF9tYXNrc1tdID0gewotICAiMHgwMDAwMDAwMSIsCi0gICIweDAwMDAwMDAyIiwKLSAgIjB4MDAwMDAwMDQiLAotICAiMHgwMDAwMDAwOCIsCi0gICIweDAwMDAwMDEwIiwKLSAgIjB4MDAwMDAwMjAiLAotICAiMHgwMDAwMDA0MCIsCi0gICIweDAwMDAwMDgwIiwKLQotICAiMHgwMDAwMDEwMCIsCi0gICIweDAwMDAwMjAwIiwKLSAgIjB4MDAwMDA0MDAiLAotICAiMHgwMDAwMDgwMCIsCi0gICIweDAwMDAxMDAwIiwKLSAgIjB4MDAwMDIwMDAiLAotICAiMHgwMDAwNDAwMCIsCi0gICIweDAwMDA4MDAwIiwKLQotICAiMHgwMDAxMDAwMCIsCi0gICIweDAwMDIwMDAwIiwKLSAgIjB4MDAwNDAwMDAiLAotICAiMHgwMDA4MDAwMCIsCi0gICIweDAwMTAwMDAwIiwKLSAgIjB4MDAyMDAwMDAiLAotICAiMHgwMDQwMDAwMCIsCi0gICIweDAwODAwMDAwIiwKLQotICAiMHgwMTAwMDAwMCIsCi0gICIweDAyMDAwMDAwIiwKLSAgIjB4MDQwMDAwMDAiLAotICAiMHgwODAwMDAwMCIsCi0gICIweDEwMDAwMDAwIiwKLSAgIjB4MjAwMDAwMDAiLAotICAiMHg0MDAwMDAwMCIsCi0gICIweDgwMDAwMDAwIiwKLX07Ci0KLXN0cmluZyBHZXRCaXRGaWVsZE5hbWUoaW50IGluZGV4KSB7Ci0gIHN0cmluZyB2YXJOYW1lID0gImJpdEZpZWxkIjsKLSAgdmFyTmFtZSArPSBTaW1wbGVJdG9hKGluZGV4KTsKLSAgdmFyTmFtZSArPSAiXyI7Ci0gIHJldHVybiB2YXJOYW1lOwotfQotCi1zdHJpbmcgR2V0Qml0RmllbGROYW1lRm9yQml0KGludCBiaXRJbmRleCkgewotICByZXR1cm4gR2V0Qml0RmllbGROYW1lKGJpdEluZGV4IC8gMzIpOwotfQotCi1uYW1lc3BhY2UgewotCi1zdHJpbmcgR2VuZXJhdGVHZXRCaXRJbnRlcm5hbChjb25zdCBzdHJpbmcmIHByZWZpeCwgaW50IGJpdEluZGV4KSB7Ci0gIHN0cmluZyB2YXJOYW1lID0gcHJlZml4ICsgR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKLSAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOwotCi0gIHN0cmluZyBtYXNrID0gYml0X21hc2tzW2JpdEluVmFySW5kZXhdOwotICBzdHJpbmcgcmVzdWx0ID0gIigoIiArIHZhck5hbWUgKyAiICYgIiArIG1hc2sgKyAiKSA9PSAiICsgbWFzayArICIpIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIEdlbmVyYXRlU2V0Qml0SW50ZXJuYWwoY29uc3Qgc3RyaW5nJiBwcmVmaXgsIGludCBiaXRJbmRleCkgewotICBzdHJpbmcgdmFyTmFtZSA9IHByZWZpeCArIEdldEJpdEZpZWxkTmFtZUZvckJpdChiaXRJbmRleCk7Ci0gIGludCBiaXRJblZhckluZGV4ID0gYml0SW5kZXggJSAzMjsKLQotICBzdHJpbmcgbWFzayA9IGJpdF9tYXNrc1tiaXRJblZhckluZGV4XTsKLSAgc3RyaW5nIHJlc3VsdCA9IHZhck5hbWUgKyAiIHw9ICIgKyBtYXNrOwotICByZXR1cm4gcmVzdWx0OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RyaW5nIEdlbmVyYXRlR2V0Qml0KGludCBiaXRJbmRleCkgewotICByZXR1cm4gR2VuZXJhdGVHZXRCaXRJbnRlcm5hbCgiIiwgYml0SW5kZXgpOwotfQotCi1zdHJpbmcgR2VuZXJhdGVTZXRCaXQoaW50IGJpdEluZGV4KSB7Ci0gIHJldHVybiBHZW5lcmF0ZVNldEJpdEludGVybmFsKCIiLCBiaXRJbmRleCk7Ci19Ci0KLXN0cmluZyBHZW5lcmF0ZUNsZWFyQml0KGludCBiaXRJbmRleCkgewotICBzdHJpbmcgdmFyTmFtZSA9IEdldEJpdEZpZWxkTmFtZUZvckJpdChiaXRJbmRleCk7Ci0gIGludCBiaXRJblZhckluZGV4ID0gYml0SW5kZXggJSAzMjsKLQotICBzdHJpbmcgbWFzayA9IGJpdF9tYXNrc1tiaXRJblZhckluZGV4XTsKLSAgc3RyaW5nIHJlc3VsdCA9IHZhck5hbWUgKyAiID0gKCIgKyB2YXJOYW1lICsgIiAmIH4iICsgbWFzayArICIpIjsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGludCBiaXRJbmRleCkgewotICByZXR1cm4gR2VuZXJhdGVHZXRCaXRJbnRlcm5hbCgiZnJvbV8iLCBiaXRJbmRleCk7Ci19Ci0KLXN0cmluZyBHZW5lcmF0ZVNldEJpdFRvTG9jYWwoaW50IGJpdEluZGV4KSB7Ci0gIHJldHVybiBHZW5lcmF0ZVNldEJpdEludGVybmFsKCJ0b18iLCBiaXRJbmRleCk7Ci19Ci0KLXN0cmluZyBHZW5lcmF0ZUdldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpIHsKLSAgcmV0dXJuIEdlbmVyYXRlR2V0Qml0SW50ZXJuYWwoIm11dGFibGVfIiwgYml0SW5kZXgpOwotfQotCi1zdHJpbmcgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoaW50IGJpdEluZGV4KSB7Ci0gIHJldHVybiBHZW5lcmF0ZVNldEJpdEludGVybmFsKCJtdXRhYmxlXyIsIGJpdEluZGV4KTsKLX0KLQotYm9vbCBJc1JlZmVyZW5jZVR5cGUoSmF2YVR5cGUgdHlwZSkgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEpBVkFUWVBFX0lOVCAgICA6IHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEpBVkFUWVBFX0xPTkcgICA6IHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUICA6IHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRSA6IHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46IHJldHVybiBmYWxzZTsKLSAgICBjYXNlIEpBVkFUWVBFX1NUUklORyA6IHJldHVybiB0cnVlOwotICAgIGNhc2UgSkFWQVRZUEVfQllURVMgIDogcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBKQVZBVFlQRV9FTlVNICAgOiByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6IHJldHVybiB0cnVlOwotCi0gICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKLSAgICAvLyBKYXZhVHlwZXMgYXJlIGFkZGVkLgotICB9Ci0KLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotY29uc3QgY2hhciogR2V0Q2FwaXRhbGl6ZWRUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgaW1tdXRhYmxlKSB7Ci0gIHN3aXRjaCAoR2V0VHlwZShmaWVsZCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgIDogcmV0dXJuICJJbnQzMiI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAiVUludDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuICJTSW50MzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gIkZpeGVkMzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gIlNGaXhlZDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuICJJbnQ2NCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAiVUludDY0IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuICJTSW50NjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gIkZpeGVkNjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OiByZXR1cm4gIlNGaXhlZDY0IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVCAgIDogcmV0dXJuICJGbG9hdCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiAiRG91YmxlIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuICJCb29sIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgIDogcmV0dXJuICJTdHJpbmciOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTICAgOiB7Ci0gICAgICByZXR1cm4gIkJ5dGVzIjsKLSAgICB9Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRW51bSI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICA6IHJldHVybiAiR3JvdXAiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gIk1lc3NhZ2UiOwotCi0gICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKLSAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCi0gIH0KLQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLS8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKLS8vIHJldHVybnMgLTEuCi1pbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQgICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzIgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NCAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGaXhlZDMyU2l6ZTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRml4ZWQ2NFNpemU7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a1NGaXhlZDMyU2l6ZTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkNjRTaXplOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGbG9hdFNpemU7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0RvdWJsZVNpemU7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprQm9vbFNpemU7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAtMTsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gLTE7Ci0KLSAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwotICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KLSAgfQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIC0xOwotfQotCi0vLyBTb3J0IHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIERlc2NyaXB0b3IgYnkgbnVtYmVyIGludG8gYSBuZXdbXSdkIGFycmF5Ci0vLyBhbmQgcmV0dXJuIGl0LiBUaGUgY2FsbGVyIHNob3VsZCBkZWxldGUgdGhlIHJldHVybmVkIGFycmF5LgotY29uc3QgRmllbGREZXNjcmlwdG9yKiogU29ydEZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzID0KLSAgICBuZXcgY29uc3QgRmllbGREZXNjcmlwdG9yKltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKLSAgfQotICBzdGQ6OnNvcnQoZmllbGRzLCBmaWVsZHMgKyBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLAotICAgICAgICAgICAgRmllbGRPcmRlcmluZ0J5TnVtYmVyKCkpOwotICByZXR1cm4gZmllbGRzOwotfQotCi0vLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NhZ2UgdHlwZSBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcy4gIElmIGl0IGRvZXNuJ3QsCi0vLyB3ZSBjYW4gb3B0aW1pemUgb3V0IGNhbGxzIHRvIGl0cyBpc0luaXRpYWxpemVkKCkgbWV0aG9kLgotLy8KLS8vIGFscmVhZHlfc2VlbiBpcyB1c2VkIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzYW1lIHR5cGUgbXVsdGlwbGUgdGltZXMKLS8vIChhbmQgYWxzbyB0byBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaW9uKS4KLWJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoCi0gICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSwKLSAgICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbikgewotICBpZiAoYWxyZWFkeV9zZWVuLT5jb3VudCh0eXBlKSA+IDApIHsKLSAgICAvLyBUaGUgdHlwZSBpcyBhbHJlYWR5IGluIGNhY2hlLiAgVGhpcyBtZWFucyB0aGF0IGVpdGhlcjoKLSAgICAvLyBhLiBUaGUgdHlwZSBoYXMgbm8gcmVxdWlyZWQgZmllbGRzLgotICAgIC8vIGIuIFdlIGFyZSBpbiB0aGUgbWlkc3Qgb2YgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcywKLSAgICAvLyAgICBzb21ld2hlcmUgdXAgdGhlIHN0YWNrLiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHRoYXQgaWYgdGhlIHR5cGUKLSAgICAvLyAgICBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcywgdGhleSdsbCBiZSBmb3VuZCB3aGVuIHdlIHJldHVybiB0byBpdCwKLSAgICAvLyAgICBhbmQgdGhlIHdob2xlIGNhbGwgdG8gSGFzUmVxdWlyZWRGaWVsZHMoKSB3aWxsIHJldHVybiB0cnVlLgotICAgIC8vICAgIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpZiB0aGlzIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcwotICAgIC8vICAgIGhlcmUuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGFscmVhZHlfc2Vlbi0+aW5zZXJ0KHR5cGUpOwotCi0gIC8vIElmIHRoZSB0eXBlIGhhcyBleHRlbnNpb25zLCBhbiBleHRlbnNpb24gd2l0aCBtZXNzYWdlIHR5cGUgY291bGQgY29udGFpbgotICAvLyByZXF1aXJlZCBmaWVsZHMsIHNvIHdlIGhhdmUgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgc3VjaCBhbgotICAvLyBleHRlbnNpb24gZXhpc3RzLgotICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5maWVsZChpKTsKLSAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UpIHsKLSAgICAgIGlmIChIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCksIGFscmVhZHlfc2VlbikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEhhc1JlcXVpcmVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKLSAgaGFzaF9zZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKLSAgcmV0dXJuIEhhc1JlcXVpcmVkRmllbGRzKHR5cGUsICZhbHJlYWR5X3NlZW4pOwotfQotCi1ib29sIEhhc1JlcGVhdGVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7Ci0gICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzg1MDQyMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzNTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0hFTFBFUlNfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0hFTFBFUlNfSF9fCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGphdmEgewotCi0vLyBDb21tb25seS11c2VkIHNlcGFyYXRvciBjb21tZW50cy4gIFRoaWNrIGlzIGEgbGluZSBvZiAnPScsIHRoaW4gaXMgYSBsaW5lCi0vLyBvZiAnLScuCi1leHRlcm4gY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXTsKLWV4dGVybiBjb25zdCBjaGFyIGtUaGluU2VwYXJhdG9yW107Ci0KLS8vIENvbnZlcnRzIGEgbmFtZSB0byBjYW1lbC1jYXNlLiBJZiBjYXBfZmlyc3RfbGV0dGVyIGlzIHRydWUsIGNhcGl0YWxpemUgdGhlCi0vLyBmaXJzdCBsZXR0ZXIuCi1zdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgY2FwX2ZpcnN0X2xldHRlcik7Ci0vLyBDb252ZXJ0cyB0aGUgZmllbGQncyBuYW1lIHRvIGNhbWVsLWNhc2UsIGUuZy4gImZvb19iYXJfYmF6IiBiZWNvbWVzCi0vLyAiZm9vQmFyQmF6IiBvciAiRm9vQmFyQmF6IiwgcmVzcGVjdGl2ZWx5Lgotc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Ci1zdHJpbmcgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotCi0vLyBTaW1pbGFyLCBidXQgZm9yIG1ldGhvZCBuYW1lcy4gIChUeXBpY2FsbHksIHRoaXMgbWVyZWx5IGhhcyB0aGUgZWZmZWN0Ci0vLyBvZiBsb3dlci1jYXNpbmcgdGhlIGZpcnN0IGxldHRlciBvZiB0aGUgbmFtZS4pCi1zdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpOwotCi0vLyBHZXQgYW4gaWRlbnRpZmllciB0aGF0IHVuaXF1ZWx5IGlkZW50aWZpZXMgdGhpcyB0eXBlIHdpdGhpbiB0aGUgZmlsZS4KLS8vIFRoaXMgaXMgdXNlZCB0byBkZWNsYXJlIHN0YXRpYyB2YXJpYWJsZXMgcmVsYXRlZCB0byB0aGlzIHR5cGUgYXQgdGhlCi0vLyBvdXRlcm1vc3QgZmlsZSBzY29wZS4KLXN0cmluZyBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi0vLyBTdHJpcHMgIi5wcm90byIgb3IgIi5wcm90b2RldmVsIiBmcm9tIHRoZSBlbmQgb2YgYSBmaWxlbmFtZS4KLXN0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOwotCi0vLyBHZXRzIHRoZSB1bnF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgZmlsZS4gIEZvciBlYWNoIC5wcm90byBmaWxlLCB0aGVyZQotLy8gd2lsbCBiZSBvbmUgSmF2YSBjbGFzcyBjb250YWluaW5nIGFsbCB0aGUgaW1tdXRhYmxlIG1lc3NhZ2VzIGFuZCBhbm90aGVyCi0vLyBKYXZhIGNsYXNzIGNvbnRhaW5pbmcgYWxsIHRoZSBtdXRhYmxlIG1lc3NhZ2VzLgotLy8gVE9ETyh4aWFvZmVuZyk6IHJlbW92ZSB0aGUgZGVmYXVsdCB2YWx1ZSBhZnRlciB1cGRhdGluZyBjbGllbnQgY29kZS4KLXN0cmluZyBGaWxlQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSA9IHRydWUpOwotCi0vLyBSZXR1cm5zIHRoZSBmaWxlJ3MgSmF2YSBwYWNrYWdlIG5hbWUuCi1zdHJpbmcgRmlsZUphdmFQYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSA9IHRydWUpOwotCi0vLyBSZXR1cm5zIG91dHB1dCBkaXJlY3RvcnkgZm9yIHRoZSBnaXZlbiBwYWNrYWdlIG5hbWUuCi1zdHJpbmcgSmF2YVBhY2thZ2VUb0RpcihzdHJpbmcgcGFja2FnZV9uYW1lKTsKLQotLy8gQ29udmVydHMgdGhlIGdpdmVuIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGluIHRoZSBwcm90byBuYW1lc3BhY2UgdG8gaXRzCi0vLyBmdWxseS1xdWFsaWZpZWQgbmFtZSBpbiB0aGUgSmF2YSBuYW1lc3BhY2UsIGdpdmVuIHRoYXQgaXQgaXMgaW4gdGhlIGdpdmVuCi0vLyBmaWxlLgotLy8gVE9ETyh4aWFvZmVuZyk6IHRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSByZW1vdmVkIGluIHRoZQotLy8gZnV0dXJlLgotc3RyaW5nIFRvSmF2YU5hbWUoY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7Ci0KLS8vIFRPRE8oeGlhb2ZlbmcpOiB0aGUgZm9sbG93aW5nIG1ldGhvZHMgYXJlIGtlcHQgZm9yIHRoZXkgYXJlIGV4cG9zZWQKLS8vIHB1YmxpY2x5IGluIC8vZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvbmFtZXMuaC4gVGhleSByZXR1cm4KLS8vIGltbXV0YWJsZSBuYW1lcyBvbmx5IGFuZCBzaG91bGQgYmUgcmVtb3ZlZCBhZnRlciBtdXRhYmxlIEFQSSBpcwotLy8gaW50ZWdyYXRlZCBpbnRvIGdvb2dsZTMuCi1zdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotc3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci1zdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLXN0cmluZyBDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi0vLyBDb21tYS1zZXBhcmF0ZSBsaXN0IG9mIG9wdGlvbi1zcGVjaWZpZWQgaW50ZXJmYWNlcyBpbXBsZW1lbnRlZCBieSB0aGUKLS8vIE1lc3NhZ2UsIHRvIGZvbGxvdyB0aGUgImltcGxlbWVudHMiIGRlY2xhcmF0aW9uIG9mIHRoZSBNZXNzYWdlIGRlZmluaXRpb24uCi1zdHJpbmcgRXh0cmFNZXNzYWdlSW50ZXJmYWNlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLS8vIENvbW1hLXNlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9uLXNwZWNpZmllZCBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZQotLy8gTXV0YWJsZU1lc3NhZ2UsIHRvIGZvbGxvdyB0aGUgImltcGxlbWVudHMiIGRlY2xhcmF0aW9uIG9mIHRoZSBNdXRhYmxlTWVzc2FnZQotLy8gZGVmaW5pdGlvbi4KLXN0cmluZyBFeHRyYU11dGFibGVNZXNzYWdlSW50ZXJmYWNlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLS8vIENvbW1hLXNlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9uLXNwZWNpZmllZCBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZQotLy8gQnVpbGRlciwgdG8gZm9sbG93IHRoZSAiaW1wbGVtZW50cyIgZGVjbGFyYXRpb24gb2YgdGhlIEJ1aWxkZXIgZGVmaW5pdGlvbi4KLXN0cmluZyBFeHRyYUJ1aWxkZXJJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotLy8gQ29tbWEtc2VwYXJhdGUgbGlzdCBvZiBvcHRpb24tc3BlY2lmaWVkIGludGVyZmFjZXMgZXh0ZW5kZWQgYnkgdGhlCi0vLyBNZXNzYWdlT3JCdWlsZGVyLCB0byBmb2xsb3cgdGhlICJleHRlbmRzIiBkZWNsYXJhdGlvbiBvZiB0aGUKLS8vIE1lc3NhZ2VPckJ1aWxkZXIgZGVmaW5pdGlvbi4KLXN0cmluZyBFeHRyYU1lc3NhZ2VPckJ1aWxkZXJJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi0vLyBHZXQgdGhlIHVucXVhbGlmaWVkIEphdmEgY2xhc3MgbmFtZSBmb3IgbXV0YWJsZSBtZXNzYWdlcy4gaS5lLiB3aXRob3V0Ci0vLyBwYWNrYWdlIG9yIG91dGVyIGNsYXNzbmFtZXMuCi1pbmxpbmUgc3RyaW5nIFNob3J0TXV0YWJsZUphdmFDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+bmFtZSgpOwotfQotCi0KLS8vIFdoZXRoZXIgd2Ugc2hvdWxkIGdlbmVyYXRlIG11bHRpcGxlIGphdmEgZmlsZXMgZm9yIG1lc3NhZ2VzLgotaW5saW5lIGJvb2wgTXVsdGlwbGVKYXZhRmlsZXMoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGJvb2wgaW1tdXRhYmxlKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpOwotfQotCi0vLyBHZXQgdGhlIHVucXVhbGlmaWVkIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgYSBmaWVsZCdzIGZpZWxkCi0vLyBudW1iZXIgY29uc3RhbnQuCi1zdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCk7Ci0KLS8vIFJldHVybnMgdGhlIHR5cGUgb2YgdGhlIEZpZWxkRGVzY3JpcHRvci4KLS8vIFRoaXMgZG9lcyBub3RoaW5nIGludGVyZXN0aW5nIGZvciB0aGUgb3BlbiBzb3VyY2UgcmVsZWFzZSwgYnV0IGlzIHVzZWQgZm9yCi0vLyBoYWNrcyB0aGF0IGltcHJvdmUgY29tcGF0aWJpbGl0eSB3aXRoIHZlcnNpb24gMSBwcm90b2NvbCBidWZmZXJzIGF0IEdvb2dsZS4KLUZpZWxkRGVzY3JpcHRvcjo6VHlwZSBHZXRUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotCi1lbnVtIEphdmFUeXBlIHsKLSAgSkFWQVRZUEVfSU5ULAotICBKQVZBVFlQRV9MT05HLAotICBKQVZBVFlQRV9GTE9BVCwKLSAgSkFWQVRZUEVfRE9VQkxFLAotICBKQVZBVFlQRV9CT09MRUFOLAotICBKQVZBVFlQRV9TVFJJTkcsCi0gIEpBVkFUWVBFX0JZVEVTLAotICBKQVZBVFlQRV9FTlVNLAotICBKQVZBVFlQRV9NRVNTQUdFCi19OwotCi1KYXZhVHlwZSBHZXRKYXZhVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKLQotY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoSmF2YVR5cGUgdHlwZSk7Ci0KLS8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgYm94ZWQgcHJpbWl0aXZlIHR5cGUsIGUuZy4KLS8vICJqYXZhLmxhbmcuSW50ZWdlciIgZm9yIEpBVkFUWVBFX0lOVC4gIFJldHVybnMgTlVMTCBmb3IgZW51bSBhbmQgbWVzc2FnZQotLy8gdHlwZXMuCi1jb25zdCBjaGFyKiBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEphdmFUeXBlIHR5cGUpOwotCi0vLyBHZXQgdGhlIG5hbWUgb2YgdGhlIGphdmEgZW51bSBjb25zdGFudCByZXByZXNlbnRpbmcgdGhpcyB0eXBlLiBFLmcuLAotLy8gIklOVDMyIiBmb3IgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyLiBUaGUgZW51bSBjb25zdGFudCdzIGZ1bGwKLS8vIG5hbWUgaXMgImNvbS5nb29nbGUucHJvdG9idWYuV2lyZUZvcm1hdC5GaWVsZFR5cGUuSU5UMzIiLgotY29uc3QgY2hhciogRmllbGRUeXBlTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgZmllbGRfdHlwZSk7Ci0KLWNsYXNzIENsYXNzTmFtZVJlc29sdmVyOwotc3RyaW5nIERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIGltbXV0YWJsZSwKLSAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIpOwotaW5saW5lIHN0cmluZyBJbW11dGFibGVEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyKSB7Ci0gIHJldHVybiBEZWZhdWx0VmFsdWUoZmllbGQsIHRydWUsIG5hbWVfcmVzb2x2ZXIpOwotfQotYm9vbCBJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotCi0vLyBEb2VzIHRoaXMgbWVzc2FnZSBoYXZlIHNwZWNpYWxpemVkIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIG1ldGhvZHM/Ci1pbmxpbmUgYm9vbCBIYXNFcXVhbHNBbmRIYXNoQ29kZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOwotfQotCi0vLyBEb2VzIHRoaXMgbWVzc2FnZSBjbGFzcyBoYXZlIGRlc2NyaXB0b3IgYW5kIHJlZmxlY3Rpb24gbWV0aG9kcz8KLWlubGluZSBib29sIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VfbGl0ZSkgewotICByZXR1cm4gIWVuZm9yY2VfbGl0ZSAmJgotICAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KLSAgICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOwotfQotaW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VfbGl0ZSkgewotICByZXR1cm4gIWVuZm9yY2VfbGl0ZSAmJgotICAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KLSAgICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOwotfQotaW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VfbGl0ZSkgewotICByZXR1cm4gIWVuZm9yY2VfbGl0ZSAmJgotICAgICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Ci19Ci0KLS8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBnZW5lcmljIHNlcnZpY2VzIGZvciB0aGlzIGZpbGU/Ci1pbmxpbmUgYm9vbCBIYXNHZW5lcmljU2VydmljZXMoY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGUsIGJvb2wgZW5mb3JjZV9saXRlKSB7Ci0gIHJldHVybiBmaWxlLT5zZXJ2aWNlX2NvdW50KCkgPiAwICYmCi0gICAgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlLCBlbmZvcmNlX2xpdGUpICYmCi0gICAgICAgICBmaWxlLT5vcHRpb25zKCkuamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7Ci19Ci0KLWlubGluZSBib29sIElzTGF6eShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGJvb2wgZW5mb3JjZV9saXRlKSB7Ci0gIC8vIEN1cnJlbnRseSwgdGhlIHByb3RvLWxpdGUgdmVyc2lvbiBzdXBvcnRzIGxhenkgZmllbGQuCi0gIC8vIFRPRE8obml3YXNha2kpOiBTdXBwb3J0IGxhenkgZmllbGRzIGFsc28gZm9yIG90aGVyIHByb3RvIHJ1bnRpbWVzLgotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpLCBlbmZvcmNlX2xpdGUpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBkZXNjcmlwdG9yLT5vcHRpb25zKCkubGF6eSgpOwotfQotCi0vLyBNZXRob2RzIGZvciBzaGFyZWQgYml0ZmllbGRzLgotCi0vLyBHZXRzIHRoZSBuYW1lIG9mIHRoZSBzaGFyZWQgYml0ZmllbGQgZm9yIHRoZSBnaXZlbiBpbmRleC4KLXN0cmluZyBHZXRCaXRGaWVsZE5hbWUoaW50IGluZGV4KTsKLQotLy8gR2V0cyB0aGUgbmFtZSBvZiB0aGUgc2hhcmVkIGJpdGZpZWxkIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgotLy8gRWZmZWN0aXZlbHksIEdldEJpdEZpZWxkTmFtZShiaXRJbmRleCAvIDMyKQotc3RyaW5nIEdldEJpdEZpZWxkTmFtZUZvckJpdChpbnQgYml0SW5kZXgpOwotCi0vLyBHZW5lcmF0ZXMgdGhlIGphdmEgY29kZSBmb3IgdGhlIGV4cHJlc3Npb24gdGhhdCByZXR1cm5zIHRoZSBib29sZWFuIHZhbHVlCi0vLyBvZiB0aGUgYml0IG9mIHRoZSBzaGFyZWQgYml0ZmllbGRzIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgotLy8gRXhhbXBsZTogIigoYml0RmllbGQxXyAmIDB4MDQpID09IDB4MDQpIgotc3RyaW5nIEdlbmVyYXRlR2V0Qml0KGludCBiaXRJbmRleCk7Ci0KLS8vIEdlbmVyYXRlcyB0aGUgamF2YSBjb2RlIGZvciB0aGUgZXhwcmVzc2lvbiB0aGF0IHNldHMgdGhlIGJpdCBvZiB0aGUgc2hhcmVkCi0vLyBiaXRmaWVsZHMgZm9yIHRoZSBnaXZlbiBiaXQgaW5kZXguCi0vLyBFeGFtcGxlOiAiYml0RmllbGQxXyA9IChiaXRGaWVsZDFfIHwgMHgwNCkiCi1zdHJpbmcgR2VuZXJhdGVTZXRCaXQoaW50IGJpdEluZGV4KTsKLQotLy8gR2VuZXJhdGVzIHRoZSBqYXZhIGNvZGUgZm9yIHRoZSBleHByZXNzaW9uIHRoYXQgY2xlYXJzIHRoZSBiaXQgb2YgdGhlIHNoYXJlZAotLy8gYml0ZmllbGRzIGZvciB0aGUgZ2l2ZW4gYml0IGluZGV4LgotLy8gRXhhbXBsZTogImJpdEZpZWxkMV8gPSAoYml0RmllbGQxXyAmIH4weDA0KSIKLXN0cmluZyBHZW5lcmF0ZUNsZWFyQml0KGludCBiaXRJbmRleCk7Ci0KLS8vIERvZXMgdGhlIHNhbWUgYXMgR2VuZXJhdGVHZXRCaXQgYnV0IG9wZXJhdGVzIG9uIHRoZSBiaXQgZmllbGQgb24gYSBsb2NhbAotLy8gdmFyaWFibGUuIFRoaXMgaXMgdXNlZCBieSB0aGUgYnVpbGRlciB0byBjb3B5IHRoZSB2YWx1ZSBpbiB0aGUgYnVpbGRlciB0bwotLy8gdGhlIG1lc3NhZ2UuCi0vLyBFeGFtcGxlOiAiKChmcm9tX2JpdEZpZWxkMV8gJiAweDA0KSA9PSAweDA0KSIKLXN0cmluZyBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChpbnQgYml0SW5kZXgpOwotCi0vLyBEb2VzIHRoZSBzYW1lIGFzIEdlbmVyYXRlU2V0Qml0IGJ1dCBvcGVyYXRlcyBvbiB0aGUgYml0IGZpZWxkIG9uIGEgbG9jYWwKLS8vIHZhcmlhYmxlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIGJ1aWxkZXIgdG8gY29weSB0aGUgdmFsdWUgaW4gdGhlIGJ1aWxkZXIgdG8KLS8vIHRoZSBtZXNzYWdlLgotLy8gRXhhbXBsZTogInRvX2JpdEZpZWxkMV8gPSAodG9fYml0RmllbGQxXyB8IDB4MDQpIgotc3RyaW5nIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChpbnQgYml0SW5kZXgpOwotCi0vLyBEb2VzIHRoZSBzYW1lIGFzIEdlbmVyYXRlR2V0Qml0IGJ1dCBvcGVyYXRlcyBvbiB0aGUgYml0IGZpZWxkIG9uIGEgbG9jYWwKLS8vIHZhcmlhYmxlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIHBhcnNpbmcgY29uc3RydWN0b3IgdG8gcmVjb3JkIGlmIGEgcmVwZWF0ZWQKLS8vIGZpZWxkIGlzIG11dGFibGUuCi0vLyBFeGFtcGxlOiAiKChtdXRhYmxlX2JpdEZpZWxkMV8gJiAweDA0KSA9PSAweDA0KSIKLXN0cmluZyBHZW5lcmF0ZUdldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpOwotCi0vLyBEb2VzIHRoZSBzYW1lIGFzIEdlbmVyYXRlU2V0Qml0IGJ1dCBvcGVyYXRlcyBvbiB0aGUgYml0IGZpZWxkIG9uIGEgbG9jYWwKLS8vIHZhcmlhYmxlLiBUaGlzIGlzIHVzZWQgYnkgdGhlIHBhcnNpbmcgY29uc3RydWN0b3IgdG8gcmVjb3JkIGlmIGEgcmVwZWF0ZWQKLS8vIGZpZWxkIGlzIG11dGFibGUuCi0vLyBFeGFtcGxlOiAibXV0YWJsZV9iaXRGaWVsZDFfID0gKG11dGFibGVfYml0RmllbGQxXyB8IDB4MDQpIgotc3RyaW5nIEdlbmVyYXRlU2V0Qml0TXV0YWJsZUxvY2FsKGludCBiaXRJbmRleCk7Ci0KLS8vIFJldHVybnMgd2hldGhlciB0aGUgSmF2YVR5cGUgaXMgYSByZWZlcmVuY2UgdHlwZS4KLWJvb2wgSXNSZWZlcmVuY2VUeXBlKEphdmFUeXBlIHR5cGUpOwotCi0vLyBSZXR1cm5zIHRoZSBjYXBpdGFsaXplZCBuYW1lIGZvciBjYWxsaW5nIHJlbGF0aXZlIGZ1bmN0aW9ucyBpbgotLy8gQ29kZWRJbnB1dFN0cmVhbQotY29uc3QgY2hhciogR2V0Q2FwaXRhbGl6ZWRUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgaW1tdXRhYmxlKTsKLQotLy8gRm9yIGVuY29kaW5ncyB3aXRoIGZpeGVkIHNpemVzLCByZXR1cm5zIHRoYXQgc2l6ZSBpbiBieXRlcy4gIE90aGVyd2lzZQotLy8gcmV0dXJucyAtMS4KLWludCBGaXhlZFNpemUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpOwotCi0vLyBDb21wYXJhdG9ycyB1c2VkIHRvIHNvcnQgZmllbGRzIGluIE1lc3NhZ2VHZW5lcmF0b3IKLXN0cnVjdCBGaWVsZE9yZGVyaW5nQnlOdW1iZXIgewotICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGIpIGNvbnN0IHsKLSAgICByZXR1cm4gYS0+bnVtYmVyKCkgPCBiLT5udW1iZXIoKTsKLSAgfQotfTsKLQotc3RydWN0IEV4dGVuc2lvblJhbmdlT3JkZXJpbmcgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogYikgY29uc3QgewotICAgIHJldHVybiBhLT5zdGFydCA8IGItPnN0YXJ0OwotICB9Ci19OwotCi0vLyBTb3J0IHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIERlc2NyaXB0b3IgYnkgbnVtYmVyIGludG8gYSBuZXdbXSdkIGFycmF5Ci0vLyBhbmQgcmV0dXJuIGl0LiBUaGUgY2FsbGVyIHNob3VsZCBkZWxldGUgdGhlIHJldHVybmVkIGFycmF5LgotY29uc3QgRmllbGREZXNjcmlwdG9yKiogU29ydEZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi0vLyBEb2VzIHRoaXMgbWVzc2FnZSBjbGFzcyBoYXZlIGFueSBwYWNrZWQgZmllbGRzPwotaW5saW5lIGJvb2wgSGFzUGFja2VkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX3BhY2tlZCgpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi0vLyBDaGVjayBhIG1lc3NhZ2UgdHlwZSBhbmQgaXRzIHN1Yi1tZXNzYWdlIHR5cGVzIHJlY3Vyc2l2ZWx5IHRvIHNlZSBpZiBhbnkgb2YKLS8vIHRoZW0gaGFzIGEgcmVxdWlyZWQgZmllbGQuIFJldHVybiB0cnVlIGlmIGEgcmVxdWlyZWQgZmllbGQgaXMgZm91bmQuCi1ib29sIEhhc1JlcXVpcmVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi0vLyBXaGV0aGVyIGEgLnByb3RvIGZpbGUgc3VwcG9ydHMgZmllbGQgcHJlc2VuY2UgdGVzdCBmb3Igbm9uLW1lc3NhZ2UgdHlwZXMuCi1pbmxpbmUgYm9vbCBTdXBwb3J0RmllbGRQcmVzZW5jZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+c3ludGF4KCkgIT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Ci19Ci0KLS8vIFdoZXRoZXIgZ2VuZXJhdGUgY2xhc3NlcyBleHBvc2UgcHVibGljIFBBUlNFUiBpbnN0YW5jZXMuCi1pbmxpbmUgYm9vbCBFeHBvc2VQdWJsaWNQYXJzZXIoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgLy8gVE9ETyhsaXVqaXNpKTogTWFyayB0aGUgUEFSU0VSIHByaXZhdGUgaW4gMy4xLnggcmVsZWFzZXMuCi0gIHJldHVybiBkZXNjcmlwdG9yLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMjsKLX0KLQotLy8gV2hldGhlciB1bmtub3duIGVudW0gdmFsdWVzIGFyZSBrZXB0IChpLmUuLCBub3Qgc3RvcmVkIGluIFVua25vd25GaWVsZFNldAotLy8gYnV0IGluIHRoZSBtZXNzYWdlIGFuZCBjYW4gYmUgcXVlcmllZCB1c2luZyBhZGRpdGlvbmFsIGdldHRlcnMgdGhhdCByZXR1cm4KLS8vIGludHMuCi1pbmxpbmUgYm9vbCBTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Ci19Ci0KLS8vIENoZWNrIHdoZXRoZXIgYSBtZXNhc2dlIGhhcyByZXBlYXRlZCBmaWVsZHMuCi1ib29sIEhhc1JlcGVhdGVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwotCi1pbmxpbmUgYm9vbCBJc01hcEVudHJ5KGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tYXBfZW50cnkoKTsKLX0KLQotaW5saW5lIGJvb2wgSXNNYXBGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3ItPmlzX21hcCgpOwotfQotCi1pbmxpbmUgYm9vbCBQcmVzZXJ2ZVVua25vd25GaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKLX0KLQotaW5saW5lIGJvb2wgSXNBbnlNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpID09ICJnb29nbGUucHJvdG9idWYuQW55IjsKLX0KLQotaW5saW5lIGJvb2wgQ2hlY2tVdGY4KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMyB8fAotICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkuamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9IRUxQRVJTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRjNDc0YTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE0NTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotdXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Ci11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7Ci0KLW5hbWVzcGFjZSB7Ci1ib29sIEdlbmVyYXRlSGFzQml0cyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yLT5maWxlKCkpIHx8Ci0gICAgICBIYXNSZXBlYXRlZEZpZWxkcyhkZXNjcmlwdG9yKTsKLX0KLQotc3RyaW5nIE1hcFZhbHVlSW1tdXRhYmxlQ2xhc3NkTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcikgewotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2ZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOwotICBHT09HTEVfQ0hFQ0tfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIHZhbHVlX2ZpZWxkLT50eXBlKCkpOwotICByZXR1cm4gbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKHZhbHVlX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1NZXNzYWdlR2VuZXJhdG9yOjpNZXNzYWdlR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikge30KLQotTWVzc2FnZUdlbmVyYXRvcjo6fk1lc3NhZ2VHZW5lcmF0b3IoKSB7fQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci1JbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCi0gIDogTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yKSwgY29udGV4dF8oY29udGV4dCksCi0gICAgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpLAotICAgIGZpZWxkX2dlbmVyYXRvcnNfKGRlc2NyaXB0b3IsIGNvbnRleHRfKSB7Ci0gIEdPT0dMRV9DSEVDSyhIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5maWxlKCksIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKQotICAgICAgPDwgIkdlbmVyYXRvciBmYWN0b3J5IGVycm9yOiBBIG5vbi1saXRlIG1lc3NhZ2UgZ2VuZXJhdG9yIGlzIHVzZWQgdG8gIgotICAgICAgICAgImdlbmVyYXRlIGxpdGUgbWVzc2FnZXMuIjsKLX0KLQotSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6fkltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoKSB7fQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQqIGJ5dGVjb2RlX2VzdGltYXRlKSB7Ci0gIC8vIEJlY2F1c2UgZGVzY3JpcHRvci5wcm90byAoY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zKSBpcwotICAvLyB1c2VkIGluIHRoZSBjb25zdHJ1Y3Rpb24gb2YgZGVzY3JpcHRvcnMsIHdlIGhhdmUgYSB0cmlja3kgYm9vdHN0cmFwcGluZwotICAvLyBwcm9ibGVtLiAgVG8gaGVscCBjb250cm9sIHN0YXRpYyBpbml0aWFsaXphdGlvbiBvcmRlciwgd2UgbWFrZSBzdXJlIGFsbAotICAvLyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgc3RhdGljIGRhdGEgdGhhdCBkZXBlbmRzIG9uIHRoZW0gYXJlIG1lbWJlcnMgb2YKLSAgLy8gdGhlIG91dGVybW9zdCBjbGFzcyBpbiB0aGUgZmlsZS4gIFRoaXMgd2F5LCB0aGV5IHdpbGwgYmUgaW5pdGlhbGl6ZWQgaW4KLSAgLy8gYSBkZXRlcm1pbmlzdGljIG9yZGVyLgotCi0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1siaWRlbnRpZmllciJdID0gVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXyk7Ci0gIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKTsKLSAgdmFyc1siY2xhc3NuYW1lIl0gPSBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKTsKLSAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7Ci0gICAgdmFyc1sicGFyZW50Il0gPSBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKAotICAgICAgICBkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpOwotICB9Ci0gIGlmIChNdWx0aXBsZUphdmFGaWxlcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlKSkgewotICAgIC8vIFdlIGNhbiBvbmx5IG1ha2UgdGhlc2UgcGFja2FnZS1wcml2YXRlIHNpbmNlIHRoZSBjbGFzc2VzIHRoYXQgdXNlIHRoZW0KLSAgICAvLyBhcmUgaW4gc2VwYXJhdGUgZmlsZXMuCi0gICAgdmFyc1sicHJpdmF0ZSJdID0gIiI7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyc1sicHJpdmF0ZSJdID0gInByaXZhdGUgIjsKLSAgfQotICBpZiAoKmJ5dGVjb2RlX2VzdGltYXRlIDw9IGtNYXhTdGF0aWNTaXplKSB7Ci0gICAgdmFyc1siZmluYWwiXSA9ICJmaW5hbCAiOwotICB9IGVsc2UgewotICAgIHZhcnNbImZpbmFsIl0gPSAiIjsKLSAgfQotCi0gIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIHR5cGUuCi0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgLy8gVE9ETyh0ZWJvcmluZyk6IGZpbmFsIG5lZWRzIHRvIGJlIGFkZGVkIGJhY2suIFRoZSB3YXkgdG8gZml4IGl0IGlzIHRvCi0gICAgLy8gZ2VuZXJhdGUgbWV0aG9kcyB0aGF0IGNhbiBjb25zdHJ1Y3QgdGhlIHR5cGVzLCBhbmQgdGhlbiBzdGlsbCBkZWNsYXJlIHRoZQotICAgIC8vIHR5cGVzLCBhbmQgdGhlbiBpbml0IHRoZW0gaW4gY2xpbml0IHdpdGggdGhlIG5ldyBtZXRob2QgY2FsbHMuCi0gICAgIiRwcml2YXRlJHN0YXRpYyAkZmluYWwkY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCi0gICAgIiAgaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3I7XG4iKTsKLSAgKmJ5dGVjb2RlX2VzdGltYXRlICs9IDMwOwotCi0gIC8vIEFuZCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlLgotICBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JUYWJsZShwcmludGVyLCBieXRlY29kZV9lc3RpbWF0ZSk7Ci0KLSAgLy8gR2VuZXJhdGUgc3RhdGljIG1lbWJlcnMgZm9yIGFsbCBuZXN0ZWQgdHlwZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIC8vIFRPRE8oa2VudG9uKTogIFJldXNlIE1lc3NhZ2VHZW5lcmF0b3Igb2JqZWN0cz8KLSAgICBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSwgY29udGV4dF8pCi0gICAgICAgIC5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcyhwcmludGVyLCBieXRlY29kZV9lc3RpbWF0ZSk7Ci0gIH0KLX0KLQotaW50IEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaW50IGJ5dGVjb2RlX2VzdGltYXRlID0gMDsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICB2YXJzWyJpZGVudGlmaWVyIl0gPSBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKTsKLSAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpOwotICB2YXJzWyJjbGFzc25hbWUiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pOwotICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKLSAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoCi0gICAgICAgIGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIH0KLQotICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyB0eXBlLgotICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yID1cbiIKLSAgICAgICIgIGdldERlc2NyaXB0b3IoKS5nZXRNZXNzYWdlVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iKTsKLSAgICBieXRlY29kZV9lc3RpbWF0ZSArPSAzMDsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yID1cbiIKLSAgICAgICIgIGludGVybmFsXyRwYXJlbnQkX2Rlc2NyaXB0b3IuZ2V0TmVzdGVkVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iKTsKLSAgICBieXRlY29kZV9lc3RpbWF0ZSArPSAzMDsKLSAgfQotCi0gIC8vIEFuZCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlLgotICBieXRlY29kZV9lc3RpbWF0ZSArPSBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JUYWJsZUluaXRpYWxpemVyKHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIHN0YXRpYyBtZW1iZXIgaW5pdGlhbGl6ZXJzIGZvciBhbGwgbmVzdGVkIHR5cGVzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBNZXNzYWdlR2VuZXJhdG9yIG9iamVjdHM/Ci0gICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0KLSAgICAgICAgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSksIGNvbnRleHRfKQotICAgICAgICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMocHJpbnRlcik7Ci0gIH0KLSAgcmV0dXJuIGJ5dGVjb2RlX2VzdGltYXRlOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCogYnl0ZWNvZGVfZXN0aW1hdGUpIHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICB2YXJzWyJpZGVudGlmaWVyIl0gPSBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKTsKLSAgaWYgKE11bHRpcGxlSmF2YUZpbGVzKGRlc2NyaXB0b3JfLT5maWxlKCksIC8qIGltbXV0YWJsZSA9ICovIHRydWUpKSB7Ci0gICAgLy8gV2UgY2FuIG9ubHkgbWFrZSB0aGVzZSBwYWNrYWdlLXByaXZhdGUgc2luY2UgdGhlIGNsYXNzZXMgdGhhdCB1c2UgdGhlbQotICAgIC8vIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcy4KLSAgICB2YXJzWyJwcml2YXRlIl0gPSAiIjsKLSAgfSBlbHNlIHsKLSAgICB2YXJzWyJwcml2YXRlIl0gPSAicHJpdmF0ZSAiOwotICB9Ci0gIGlmICgqYnl0ZWNvZGVfZXN0aW1hdGUgPD0ga01heFN0YXRpY1NpemUpIHsKLSAgICB2YXJzWyJmaW5hbCJdID0gImZpbmFsICI7Ci0gIH0gZWxzZSB7Ci0gICAgdmFyc1siZmluYWwiXSA9ICIiOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgIiRwcml2YXRlJHN0YXRpYyAkZmluYWwkXG4iCi0gICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkZpZWxkQWNjZXNzb3JUYWJsZVxuIgotICAgICIgICAgaW50ZXJuYWxfJGlkZW50aWZpZXIkX2ZpZWxkQWNjZXNzb3JUYWJsZTtcbiIpOwotCi0gIC8vIDYgYnl0ZXMgcGVyIGZpZWxkIGFuZCBvbmVvZgotICAqYnl0ZWNvZGVfZXN0aW1hdGUgKz0gMTAgKyA2ICogZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkKLSAgICAgICsgNiAqIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7Ci19Ci0KLWludCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRmllbGRBY2Nlc3NvclRhYmxlSW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaW50IGJ5dGVjb2RlX2VzdGltYXRlID0gMTA7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJpbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlID0gbmV3XG4iCi0gICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkZpZWxkQWNjZXNzb3JUYWJsZShcbiIKLSAgICAiICAgIGludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yLFxuIgotICAgICIgICAgbmV3IGphdmEubGFuZy5TdHJpbmdbXSB7ICIsCi0gICAgImlkZW50aWZpZXIiLAotICAgIFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKLSAgICBieXRlY29kZV9lc3RpbWF0ZSArPSA2OwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIlwiJGZpZWxkX25hbWUkXCIsICIsCi0gICAgICAiZmllbGRfbmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpOwotICAgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbyA9IGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8ob25lb2YpOwotICAgIGJ5dGVjb2RlX2VzdGltYXRlICs9IDY7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiXCIkb25lb2ZfbmFtZSRcIiwgIiwKLSAgICAgICJvbmVvZl9uYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoIn0pO1xuIik7Ci0gIHJldHVybiBieXRlY29kZV9lc3RpbWF0ZTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlciBleHRlbmRzXG4iCi0gICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgotICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuXG4iCi0gICAgICAiICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZU9yQnVpbGRlcjwkY2xhc3NuYW1lJD4ge1xuIiwKLSAgICAgICJleHRyYV9pbnRlcmZhY2VzIiwgRXh0cmFNZXNzYWdlT3JCdWlsZGVySW50ZXJmYWNlcyhkZXNjcmlwdG9yXyksCi0gICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlciBleHRlbmRzXG4iCi0gICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgotICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPckJ1aWxkZXIge1xuIiwKLSAgICAgICJleHRyYV9pbnRlcmZhY2VzIiwgRXh0cmFNZXNzYWdlT3JCdWlsZGVySW50ZXJmYWNlcyhkZXNjcmlwdG9yXyksCi0gICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gIH0KLQotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhwcmludGVyKTsKLSAgICB9Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJcbiIKLSAgICAgICAgICAicHVibGljICRjbGFzc25hbWUkLiRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UgIgotICAgICAgICAgICJnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCk7XG4iLAotICAgICAgICAgICJvbmVvZl9jYXBpdGFsaXplZF9uYW1lIiwKLSAgICAgICAgICBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKAotICAgICAgICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKSktPmNhcGl0YWxpemVkX25hbWUsCi0gICAgICAgICAgImNsYXNzbmFtZSIsCi0gICAgICAgICAgY29udGV4dF8tPkdldE5hbWVSZXNvbHZlcigpLT5HZXRJbW11dGFibGVDbGFzc05hbWUoCi0gICAgICAgICAgICAgIGRlc2NyaXB0b3JfKSk7Ci0gICAgfQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgYm9vbCBpc19vd25fZmlsZSA9Ci0gICAgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwgJiYKLSAgICBNdWx0aXBsZUphdmFGaWxlcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlKTsKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlczsKLSAgdmFyaWFibGVzWyJzdGF0aWMiXSA9IGlzX293bl9maWxlID8gIiAiIDogIiBzdGF0aWMgIjsKLSAgdmFyaWFibGVzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7Ci0gIHZhcmlhYmxlc1siZXh0cmFfaW50ZXJmYWNlcyJdID0gRXh0cmFNZXNzYWdlSW50ZXJmYWNlcyhkZXNjcmlwdG9yXyk7Ci0KLSAgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0KLSAgLy8gVGhlIGJ1aWxkZXJfdHlwZSBzdG9yZXMgdGhlIHN1cGVyIHR5cGUgbmFtZSBvZiB0aGUgbmVzdGVkIEJ1aWxkZXIgY2xhc3MuCi0gIHN0cmluZyBidWlsZGVyX3R5cGU7Ci0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgInB1YmxpYyAkc3RhdGljJGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKLSAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVNZXNzYWdlPFxuIgotICAgICAgIiAgICAgICRjbGFzc25hbWUkPiBpbXBsZW1lbnRzXG4iCi0gICAgICAiICAgICRleHRyYV9pbnRlcmZhY2VzJFxuIgotICAgICAgIiAgICAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iKTsKLSAgICBidWlsZGVyX3R5cGUgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAgICAgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRXh0ZW5kYWJsZUJ1aWxkZXI8JDAsID8+IiwKLSAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAotICAgICAgInB1YmxpYyAkc3RhdGljJGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKLSAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlIGltcGxlbWVudHNcbiIKLSAgICAgICIgICAgJGV4dHJhX2ludGVyZmFjZXMkXG4iCi0gICAgICAiICAgICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIpOwotICAgIGJ1aWxkZXJfdHlwZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlcjw/PiI7Ci0gIH0KLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIC8vIFVzaW5nIGJ1aWxkZXJfdHlwZSwgaW5zdGVhZCBvZiBCdWlsZGVyLCBwcmV2ZW50cyB0aGUgQnVpbGRlciBjbGFzcyBmcm9tCi0gIC8vIGJlaW5nIGxvYWRlZCBpbnRvIFBlcm1HZW4gc3BhY2Ugd2hlbiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBjcmVhdGVkLgotICAvLyBUaGlzIG9wdGltaXplcyB0aGUgUGVybUdlbiBzcGFjZSB1c2FnZSBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdCBtb2RpZnkKLSAgLy8gbWVzc2FnZXMuCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBVc2UgJGNsYXNzbmFtZSQubmV3QnVpbGRlcigpIHRvIGNvbnN0cnVjdC5cbiIKLSAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJCgkYnVpbGRlcnR5cGUkIGJ1aWxkZXIpIHtcbiIKLSAgICAiICBzdXBlcihidWlsZGVyKTtcbiIKLSAgICAifVxuIiwKLSAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSwKLSAgICAiYnVpbGRlcnR5cGUiLCBidWlsZGVyX3R5cGUpOwotICBwcmludGVyLT5QcmludCgKLSAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJCgpIHtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgR2VuZXJhdGVJbml0aWFsaXplcnMocHJpbnRlcik7Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIKLSAgICAiXG4iKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgotICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXRcbiIKLSAgICAiZ2V0VW5rbm93bkZpZWxkcygpIHtcbiIpOwotICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiAgcmV0dXJuIHRoaXMudW5rbm93bkZpZWxkcztcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIpOwotCi0gIGlmIChjb250ZXh0Xy0+SGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKLSAgICBHZW5lcmF0ZVBhcnNpbmdDb25zdHJ1Y3RvcihwcmludGVyKTsKLSAgfQotCi0gIEdlbmVyYXRlRGVzY3JpcHRvck1ldGhvZHMocHJpbnRlcik7Ci0KLSAgLy8gTmVzdGVkIHR5cGVzCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBFbnVtR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoaSksIHRydWUsIGNvbnRleHRfKQotICAgICAgICAuR2VuZXJhdGUocHJpbnRlcik7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAvLyBEb24ndCBnZW5lcmF0ZSBKYXZhIGNsYXNzZXMgZm9yIG1hcCBlbnRyeSBtZXNzYWdlcy4KLSAgICBpZiAoSXNNYXBFbnRyeShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKLSAgICBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VHZW5lcmF0b3IoCi0gICAgICAgIGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSwgY29udGV4dF8pOwotICAgIG1lc3NhZ2VHZW5lcmF0b3IuR2VuZXJhdGVJbnRlcmZhY2UocHJpbnRlcik7Ci0gICAgbWVzc2FnZUdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKLSAgfQotCi0gIGlmIChHZW5lcmF0ZUhhc0JpdHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgLy8gSW50ZWdlcnMgZm9yIGJpdCBmaWVsZHMuCi0gICAgaW50IHRvdGFsQml0cyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgICB0b3RhbEJpdHMgKz0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAuR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgaW50IHRvdGFsSW50cyA9ICh0b3RhbEJpdHMgKyAzMSkgLyAzMjsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsSW50czsgaSsrKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBpbnQgJGJpdF9maWVsZF9uYW1lJDtcbiIsCi0gICAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gb25lb2YKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgewotICAgIHZhcnNbIm9uZW9mX25hbWUiXSA9IGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8oCi0gICAgICAgIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpKS0+bmFtZTsKLSAgICB2YXJzWyJvbmVvZl9jYXBpdGFsaXplZF9uYW1lIl0gPSBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKAotICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKSktPmNhcGl0YWxpemVkX25hbWU7Ci0gICAgdmFyc1sib25lb2ZfaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmluZGV4KCkpOwotICAgIC8vIG9uZW9mQ2FzZV8gYW5kIG9uZW9mXwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAicHJpdmF0ZSBpbnQgJG9uZW9mX25hbWUkQ2FzZV8gPSAwO1xuIgotICAgICAgInByaXZhdGUgamF2YS5sYW5nLk9iamVjdCAkb25lb2ZfbmFtZSRfO1xuIik7Ci0gICAgLy8gT25lb2ZDYXNlIGVudW0KLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgInB1YmxpYyBlbnVtICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2VcbiIKLSAgICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlIHtcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiJGZpZWxkX25hbWUkKCRmaWVsZF9udW1iZXIkKSxcbiIsCi0gICAgICAgICJmaWVsZF9uYW1lIiwKLSAgICAgICAgVG9VcHBlcihmaWVsZC0+bmFtZSgpKSwKLSAgICAgICAgImZpZWxkX251bWJlciIsCi0gICAgICAgIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSk7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVCgwKTtcbiIsCi0gICAgICAiY2FwX29uZW9mX25hbWUiLAotICAgICAgVG9VcHBlcih2YXJzWyJvbmVvZl9uYW1lIl0pKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgInByaXZhdGUgZmluYWwgaW50IHZhbHVlO1xuIgotICAgICAgInByaXZhdGUgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZShpbnQgdmFsdWUpIHtcbiIKLSAgICAgICIgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIi8qKlxuIgotICAgICAgIiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2Zvck51bWJlcihpbnQpfSBpbnN0ZWFkLlxuIgotICAgICAgIiAqL1xuIgotICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgotICAgICAgInB1YmxpYyBzdGF0aWMgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSB2YWx1ZU9mKGludCB2YWx1ZSkge1xuIgotICAgICAgIiAgcmV0dXJuIGZvck51bWJlcih2YWx1ZSk7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIgotICAgICAgInB1YmxpYyBzdGF0aWMgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSBmb3JOdW1iZXIoaW50IHZhbHVlKSB7XG4iCi0gICAgICAiICBzd2l0Y2ggKHZhbHVlKSB7XG4iKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGQoaik7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiAgICBjYXNlICRmaWVsZF9udW1iZXIkOiByZXR1cm4gJGZpZWxkX25hbWUkO1xuIiwKLSAgICAgICAgImZpZWxkX251bWJlciIsCi0gICAgICAgIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSwKLSAgICAgICAgImZpZWxkX25hbWUiLAotICAgICAgICBUb1VwcGVyKGZpZWxkLT5uYW1lKCkpKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiICAgIGNhc2UgMDogcmV0dXJuICRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVDtcbiIKLSAgICAgICIgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAifVxuIgotICAgICAgInB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkge1xuIgotICAgICAgIiAgcmV0dXJuIHRoaXMudmFsdWU7XG4iCi0gICAgICAifVxuIiwKLSAgICAgICJjYXBfb25lb2ZfbmFtZSIsIFRvVXBwZXIodmFyc1sib25lb2ZfbmFtZSJdKSk7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9O1xuXG4iKTsKLSAgICAvLyBvbmVvZkNhc2UoKQotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAicHVibGljICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2VcbiIKLSAgICAgICJnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UuZm9yTnVtYmVyKFxuIgotICAgICAgIiAgICAgICRvbmVvZl9uYW1lJENhc2VfKTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiXG4iKTsKLSAgfQotCi0gIGlmIChJc0FueU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7Ci0gICAgR2VuZXJhdGVBbnlNZXRob2RzKHByaW50ZXIpOwotICB9Ci0KLSAgLy8gRmllbGRzCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KCJwdWJsaWMgc3RhdGljIGZpbmFsIGludCAkY29uc3RhbnRfbmFtZSQgPSAkbnVtYmVyJDtcbiIsCi0gICAgICAiY29uc3RhbnRfbmFtZSIsIEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3JfLT5maWVsZChpKSksCi0gICAgICAibnVtYmVyIiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+ZmllbGQoaSktPm51bWJlcigpKSk7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2VuZXJhdGVNZW1iZXJzKHByaW50ZXIpOwotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICB9Ci0KLSAgaWYgKGNvbnRleHRfLT5IYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgIEdlbmVyYXRlSXNJbml0aWFsaXplZChwcmludGVyKTsKLSAgICBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhwcmludGVyKTsKLSAgfQotCi0gIGlmIChIYXNFcXVhbHNBbmRIYXNoQ29kZShkZXNjcmlwdG9yXykpIHsKLSAgICBHZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKHByaW50ZXIpOwotICB9Ci0KLQotICBHZW5lcmF0ZVBhcnNlRnJvbU1ldGhvZHMocHJpbnRlcik7Ci0gIEdlbmVyYXRlQnVpbGRlcihwcmludGVyKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAiXG4iCi0gICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTokZnVsbF9uYW1lJClcbiIsCi0gICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7Ci0KLQotICAvLyBDYXJlZnVsbHkgaW5pdGlhbGl6ZSB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpbiBzdWNoIGEgd2F5IHRoYXQgaXQgZG9lc24ndAotICAvLyBjb25mbGljdCB3aXRoIG90aGVyIGluaXRpYWxpemF0aW9uLgotICBwcmludGVyLT5QcmludCgKLSAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgJGNsYXNzbmFtZSQgREVGQVVMVF9JTlNUQU5DRTtcbiIsCi0gICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInN0YXRpYyB7XG4iCi0gICAgIiAgREVGQVVMVF9JTlNUQU5DRSA9IG5ldyAkY2xhc3NuYW1lJCgpO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlKCkge1xuIgotICAgICAgIiAgcmV0dXJuIERFRkFVTFRfSU5TVEFOQ0U7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0KLSAgR2VuZXJhdGVQYXJzZXIocHJpbnRlcik7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgotICAgICIgIHJldHVybiBERUZBVUxUX0lOU1RBTkNFO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotCi0gIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBkZWNsYXJlZCBhZnRlciB0aGUgREVGQVVMVF9JTlNUQU5DRSBpcyBpbml0aWFsaXplZAotICAvLyBiZWNhdXNlIHRoZSBERUZBVUxUX0lOU1RBTkNFIGlzIHVzZWQgYnkgdGhlIGV4dGVuc2lvbiB0byBsYXppbHkgcmV0cmlldmUKLSAgLy8gdGhlIG91dGVyIGNsYXNzJ3MgRmlsZURlc2NyaXB0b3IuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbihpKSwgY29udGV4dF8pCi0gICAgICAgIC5HZW5lcmF0ZShwcmludGVyKTsKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGNvbnN0IEZpZWxkRGVzY3JpcHRvciAqID4gc29ydGVkX2ZpZWxkcygKLSAgICAgIFNvcnRGaWVsZHNCeU51bWJlcihkZXNjcmlwdG9yXykpOwotCi0gIHZlY3Rvcjxjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSo+IHNvcnRlZF9leHRlbnNpb25zOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgKytpKSB7Ci0gICAgc29ydGVkX2V4dGVuc2lvbnMucHVzaF9iYWNrKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2UoaSkpOwotICB9Ci0gIHN0ZDo6c29ydChzb3J0ZWRfZXh0ZW5zaW9ucy5iZWdpbigpLCBzb3J0ZWRfZXh0ZW5zaW9ucy5lbmQoKSwKLSAgICAgICAgICAgIEV4dGVuc2lvblJhbmdlT3JkZXJpbmcoKSk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpXG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBpZiAoSGFzUGFja2VkRmllbGRzKGRlc2NyaXB0b3JfKSkgewotICAgIC8vIHdyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KSBtaWdodCBiZSBpbnZva2VkIHdpdGhvdXQKLSAgICAvLyBnZXRTZXJpYWxpemVkU2l6ZSgpIGV2ZXIgYmVpbmcgY2FsbGVkLCBidXQgd2UgbmVlZCB0aGUgbWVtb2l6ZWQKLSAgICAvLyBzaXplcyBpbiBjYXNlIHRoaXMgbWVzc2FnZSBoYXMgcGFja2VkIGZpZWxkcy4gUmF0aGVyIHRoYW4gZW1pdCBjaGVja3MgZm9yCi0gICAgLy8gZWFjaCBwYWNrZWQgZmllbGQsIGp1c3QgY2FsbCBnZXRTZXJpYWxpemVkU2l6ZSgpIHVwIGZyb250LgotICAgIC8vIEluIG1vc3QgY2FzZXMsIGdldFNlcmlhbGl6ZWRTaXplKCkgd2lsbCBoYXZlIGFscmVhZHkgYmVlbiBjYWxsZWQgYW55d2F5Ci0gICAgLy8gYnkgb25lIG9mIHRoZSB3cmFwcGVyIHdyaXRlVG8oKSBtZXRob2RzLCBtYWtpbmcgdGhpcyBjYWxsIGNoZWFwLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImdldFNlcmlhbGl6ZWRTaXplKCk7XG4iKTsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKLSAgICAgICAgIiAgLkV4dGVuZGFibGVNZXNzYWdlPCRjbGFzc25hbWUkPi5FeHRlbnNpb25Xcml0ZXJcbiIKLSAgICAgICAgIiAgICBleHRlbnNpb25Xcml0ZXIgPSBuZXdNZXNzYWdlU2V0RXh0ZW5zaW9uV3JpdGVyKCk7XG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgotICAgICAgICAiICAuRXh0ZW5kYWJsZU1lc3NhZ2U8JGNsYXNzbmFtZSQ+LkV4dGVuc2lvbldyaXRlclxuIgotICAgICAgICAiICAgIGV4dGVuc2lvbldyaXRlciA9IG5ld0V4dGVuc2lvbldyaXRlcigpO1xuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKLSAgICB9Ci0gIH0KLQotICAvLyBNZXJnZSB0aGUgZmllbGRzIGFuZCB0aGUgZXh0ZW5zaW9uIHJhbmdlcywgYm90aCBzb3J0ZWQgYnkgZmllbGQgbnVtYmVyLgotICBmb3IgKGludCBpID0gMCwgaiA9IDA7Ci0gICAgICAgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpIHx8IGogPCBzb3J0ZWRfZXh0ZW5zaW9ucy5zaXplKCk7Ci0gICAgICAgKSB7Ci0gICAgaWYgKGkgPT0gZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpIHsKLSAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UocHJpbnRlciwgc29ydGVkX2V4dGVuc2lvbnNbaisrXSk7Ci0gICAgfSBlbHNlIGlmIChqID09IHNvcnRlZF9leHRlbnNpb25zLnNpemUoKSkgewotICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChwcmludGVyLCBzb3J0ZWRfZmllbGRzW2krK10pOwotICAgIH0gZWxzZSBpZiAoc29ydGVkX2ZpZWxkc1tpXS0+bnVtYmVyKCkgPCBzb3J0ZWRfZXh0ZW5zaW9uc1tqXS0+c3RhcnQpIHsKLSAgICAgIEdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQocHJpbnRlciwgc29ydGVkX2ZpZWxkc1tpKytdKTsKLSAgICB9IGVsc2UgewotICAgICAgR2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZShwcmludGVyLCBzb3J0ZWRfZXh0ZW5zaW9uc1tqKytdKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewotICAgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAidW5rbm93bkZpZWxkcy53cml0ZUFzTWVzc2FnZVNldFRvKG91dHB1dCk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ1bmtub3duRmllbGRzLndyaXRlVG8ob3V0cHV0KTtcbiIpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgInB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7XG4iCi0gICAgIiAgaW50IHNpemUgPSBtZW1vaXplZFNpemU7XG4iCi0gICAgIiAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplO1xuIgotICAgICJcbiIKLSAgICAiICBzaXplID0gMDtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoc29ydGVkX2ZpZWxkc1tpXSkuR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUocHJpbnRlcik7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAic2l6ZSArPSBleHRlbnNpb25zU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInNpemUgKz0gZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCk7XG4iKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewotICAgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAic2l6ZSArPSB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0KCk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemUoKTtcbiIpOwotICAgIH0KLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgbWVtb2l6ZWRTaXplID0gc2l6ZTtcbiIKLSAgICAiICByZXR1cm4gc2l6ZTtcbiIKLSAgICAifVxuIgotICAgICJcbiIpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDtcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIE5vdGU6ICBUaGVzZSBhcmUgc2VwYXJhdGUgZnJvbSBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcygpCi0gIC8vICAgYmVjYXVzZSB0aGV5IG5lZWQgdG8gYmUgZ2VuZXJhdGVkIGV2ZW4gZm9yIG1lc3NhZ2VzIHRoYXQgYXJlIG9wdGltaXplZAotICAvLyAgIGZvciBjb2RlIHNpemUuCi0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkYXRhKVxuIgotICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShkYXRhKTtcbiIKLSAgICAifVxuIgotICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkYXRhLFxuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCi0gICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgotICAgICIgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKLSAgICAifVxuIgotICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShieXRlW10gZGF0YSlcbiIKLSAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCi0gICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSk7XG4iCi0gICAgIn1cbiIKLSAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCi0gICAgIiAgICBieXRlW10gZGF0YSxcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgotICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gUEFSU0VSLnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCi0gICAgIn1cbiIKLSAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dClcbiIKLSAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCi0gICAgIiAgICAgIC5wYXJzZVdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0KTtcbiIKLSAgICAifVxuIgotICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKLSAgICAiICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQsXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKLSAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCi0gICAgIiAgICAgIC5wYXJzZVdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCi0gICAgIn1cbiIKLSAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZURlbGltaXRlZEZyb20oamF2YS5pby5JbnB1dFN0cmVhbSBpbnB1dClcbiIKLSAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCi0gICAgIiAgICAgIC5wYXJzZURlbGltaXRlZFdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0KTtcbiIKLSAgICAifVxuIgotICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRGVsaW1pdGVkRnJvbShcbiIKLSAgICAiICAgIGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQsXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKLSAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCi0gICAgIiAgICAgIC5wYXJzZURlbGltaXRlZFdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCi0gICAgIn1cbiIKLSAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQpXG4iCi0gICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCi0gICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgotICAgICIgICAgICAucGFyc2VXaXRoSU9FeGNlcHRpb24oUEFSU0VSLCBpbnB1dCk7XG4iCi0gICAgIn1cbiIKLSAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKLSAgICAiICAgIHRocm93cyBqYXZhLmlvLklPRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCi0gICAgIiAgICAgIC5wYXJzZVdpdGhJT0V4Y2VwdGlvbihQQVJTRVIsIGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iLAotICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZCgKLSAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUocHJpbnRlcik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKLSAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJleHRlbnNpb25Xcml0ZXIud3JpdGVVbnRpbCgkZW5kJCwgb3V0cHV0KTtcbiIsCi0gICAgImVuZCIsIFNpbXBsZUl0b2EocmFuZ2UtPmVuZCkpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIExJVEVfUlVOVElNRSBpbXBsZW1lbnRzIHRoaXMgYXQgdGhlIEdlbmVyYXRlZE1lc3NhZ2VMaXRlIGxldmVsLgotICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoKSB7IHJldHVybiBuZXdCdWlsZGVyKCk7IH1cbiIpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigpIHtcbiIKLSAgICAiICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRS50b0J1aWxkZXIoKTtcbiIKLSAgICAifVxuIgotICAgICJwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigkY2xhc3NuYW1lJCBwcm90b3R5cGUpIHtcbiIKLSAgICAiICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRS50b0J1aWxkZXIoKS5tZXJnZUZyb20ocHJvdG90eXBlKTtcbiIKLSAgICAifVxuIgotICAgICJwdWJsaWMgQnVpbGRlciB0b0J1aWxkZXIoKSB7XG4iCi0gICAgIiAgcmV0dXJuIHRoaXMgPT0gREVGQVVMVF9JTlNUQU5DRVxuIgotICAgICIgICAgICA/IG5ldyBCdWlsZGVyKCkgOiBuZXcgQnVpbGRlcigpLm1lcmdlRnJvbSh0aGlzKTtcbiIKLSAgICAifVxuIgotICAgICJcbiIsCi0gICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgotICAgICJwcm90ZWN0ZWQgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZShcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCkge1xuIgotICAgICIgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKHBhcmVudCk7XG4iCi0gICAgIiAgcmV0dXJuIGJ1aWxkZXI7XG4iCi0gICAgIn1cbiIpOwotCi0gIE1lc3NhZ2VCdWlsZGVyR2VuZXJhdG9yIGJ1aWxkZXJHZW5lcmF0b3IoZGVzY3JpcHRvcl8sIGNvbnRleHRfKTsKLSAgYnVpbGRlckdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKLX0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRGVzY3JpcHRvck1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKCFkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCi0gICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGZpbGVjbGFzcyQuaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3I7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIiwKLSAgICAgICJmaWxlY2xhc3MiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAotICAgICAgImlkZW50aWZpZXIiLCBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKSk7Ci0gIH0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG1hcF9maWVsZHM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0gICAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCi0gICAgICAgIElzTWFwRW50cnkoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgbWFwX2ZpZWxkcy5wdXNoX2JhY2soZmllbGQpOwotICAgIH0KLSAgfQotICBpZiAoIW1hcF9maWVsZHMuZW1wdHkoKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIkBTdXBwcmVzc1dhcm5pbmdzKHtcInJhd3R5cGVzXCJ9KVxuIgotICAgICAgInByb3RlY3RlZCBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkIGludGVybmFsR2V0TWFwRmllbGQoXG4iCi0gICAgICAiICAgIGludCBudW1iZXIpIHtcbiIKLSAgICAgICIgIHN3aXRjaCAobnVtYmVyKSB7XG4iKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcF9maWVsZHMuc2l6ZSgpOyArK2kpIHsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtYXBfZmllbGRzW2ldOwotICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNhc2UgJG51bWJlciQ6XG4iCi0gICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIiwKLSAgICAgICAgIm51bWJlciIsIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSwKLSAgICAgICAgImNhcGl0YWxpemVkX25hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJkZWZhdWx0OlxuIgotICAgICAgICAiICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcbiIKLSAgICAgICAgIiAgICAgIFwiSW52YWxpZCBtYXAgZmllbGQgbnVtYmVyOiBcIiArIG51bWJlcik7XG4iKTsKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiICB9XG4iCi0gICAgICAgICJ9XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCgKLSAgICAicHJvdGVjdGVkIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5GaWVsZEFjY2Vzc29yVGFibGVcbiIKLSAgICAiICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkge1xuIgotICAgICIgIHJldHVybiAkZmlsZWNsYXNzJC5pbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlXG4iCi0gICAgIiAgICAgIC5lbnN1cmVGaWVsZEFjY2Vzc29yc0luaXRpYWxpemVkKFxuIgotICAgICIgICAgICAgICAgJGNsYXNzbmFtZSQuY2xhc3MsICRjbGFzc25hbWUkLkJ1aWxkZXIuY2xhc3MpO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXyksCi0gICAgImZpbGVjbGFzcyIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCi0gICAgImlkZW50aWZpZXIiLCBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgLy8gTWVtb2l6ZXMgd2hldGhlciB0aGUgcHJvdG9jb2wgYnVmZmVyIGlzIGZ1bGx5IGluaXRpYWxpemVkIChoYXMgYWxsCi0gIC8vIHJlcXVpcmVkIGZpZWxkcykuIC0xIG1lYW5zIG5vdCB5ZXQgY29tcHV0ZWQuIDAgbWVhbnMgZmFsc2UgYW5kIDEgbWVhbnMKLSAgLy8gdHJ1ZS4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInByaXZhdGUgYnl0ZSBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAtMTtcbiIpOwotICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICAvLyBEb24ndCBkaXJlY3RseSBjb21wYXJlIHRvIC0xIHRvIGF2b2lkIGFuIEFuZHJvaWQgeDg2IEpJVCBidWcuCi0gIHByaW50ZXItPlByaW50KAotICAgICJieXRlIGlzSW5pdGlhbGl6ZWQgPSBtZW1vaXplZElzSW5pdGlhbGl6ZWQ7XG4iCi0gICAgImlmIChpc0luaXRpYWxpemVkID09IDEpIHJldHVybiB0cnVlO1xuIgotICAgICJpZiAoaXNJbml0aWFsaXplZCA9PSAwKSByZXR1cm4gZmFsc2U7XG4iCi0gICAgIlxuIik7Ci0KLSAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGluIHRoaXMgbWVzc2FnZSBhcmUgc2V0LgotICAvLyBUT0RPKGtlbnRvbik6ICBXZSBjYW4gb3B0aW1pemUgdGhpcyB3aGVuIHdlIHN3aXRjaCB0byBwdXR0aW5nIGFsbCB0aGUKLSAgLy8gICAiaGFzIiBmaWVsZHMgaW50byBhIHNpbmdsZSBiaXRmaWVsZC4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKLQotICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJpZiAoIWhhcyRuYW1lJCgpKSB7XG4iCi0gICAgICAgICIgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7XG4iCi0gICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgIn1cbiIsCi0gICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTm93IGNoZWNrIHRoYXQgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBpbml0aWFsaXplZC4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKLSAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UgJiYKLSAgICAgICAgSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgc3dpdGNoIChmaWVsZC0+bGFiZWwoKSkgewotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVRVUlSRUQ6Ci0gICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAiaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKLSAgICAgICAgICAgICAiICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgotICAgICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICJ0eXBlIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKLSAgICAgICAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCkpLAotICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMOgotICAgICAgICAgIGlmICghU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKLSAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKTsKLSAgICAgICAgICAgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogb25lb2ZfaW5mbyA9Ci0gICAgICAgICAgICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZik7Ci0gICAgICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAgICAgImlmICgkb25lb2ZfbmFtZSRDYXNlXyA9PSAkZmllbGRfbnVtYmVyJCkge1xuIiwKLSAgICAgICAgICAgICAgIm9uZW9mX25hbWUiLCBvbmVvZl9pbmZvLT5uYW1lLAotICAgICAgICAgICAgICAiZmllbGRfbnVtYmVyIiwgU2ltcGxlSXRvYShmaWVsZC0+bnVtYmVyKCkpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAgICJpZiAoaGFzJG5hbWUkKCkpIHtcbiIsCi0gICAgICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICAgIiAgaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKLSAgICAgICAgICAgICIgICAgbWVtb2l6ZWRJc0luaXRpYWxpemVkID0gMDtcbiIKLSAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgICAgICAgIiAgfVxuIgotICAgICAgICAgICAgIn1cbiIsCi0gICAgICAgICAgICAibmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQ6Ci0gICAgICAgICAgaWYgKElzTWFwRW50cnkoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgewotICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAgICJmb3IgKCR0eXBlJCBpdGVtIDogZ2V0JG5hbWUkKCkudmFsdWVzKCkpIHtcbiIKLSAgICAgICAgICAgICAgIiAgaWYgKCFpdGVtLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgotICAgICAgICAgICAgICAiICAgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7XG4iCi0gICAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgICAgICAgICAiICB9XG4iCi0gICAgICAgICAgICAgICJ9XG4iLAotICAgICAgICAgICAgICAidHlwZSIsIE1hcFZhbHVlSW1tdXRhYmxlQ2xhc3NkTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfKSwKLSAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IGdldCRuYW1lJENvdW50KCk7IGkrKykge1xuIgotICAgICAgICAgICAgICAiICBpZiAoIWdldCRuYW1lJChpKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKLSAgICAgICAgICAgICAgIiAgICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgotICAgICAgICAgICAgICAiICAgIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgICAgICAgIiAgfVxuIgotICAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICAgInR5cGUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKAotICAgICAgICAgICAgICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSwKLSAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJpZiAoIWV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpKSB7XG4iCi0gICAgICAiICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgotICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICIgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDE7XG4iKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAiICByZXR1cm4gdHJ1ZTtcbiIKLSAgICAifVxuIgotICAgICJcbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLW5hbWVzcGFjZSB7Ci1ib29sIENoZWNrSGFzQml0c0ZvckVxdWFsc0FuZEhhc2hDb2RlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShmaWVsZC0+ZmlsZSgpKSkgewotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBHZXRKYXZhVHlwZShmaWVsZCkgPT0gSkFWQVRZUEVfTUVTU0FHRSAmJgotICAgICAgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSA9PSBOVUxMOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUVxdWFsc0FuZEhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCi0gICAgInB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBqYXZhLmxhbmcuT2JqZWN0IG9iaikge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBwcmludGVyLT5QcmludCgKLSAgICAiaWYgKG9iaiA9PSB0aGlzKSB7XG4iCi0gICAgIiByZXR1cm4gdHJ1ZTtcbiIKLSAgICAifVxuIgotICAgICJpZiAoIShvYmogaW5zdGFuY2VvZiAkY2xhc3NuYW1lJCkpIHtcbiIKLSAgICAiICByZXR1cm4gc3VwZXIuZXF1YWxzKG9iaik7XG4iCi0gICAgIn1cbiIKLSAgICAiJGNsYXNzbmFtZSQgb3RoZXIgPSAoJGNsYXNzbmFtZSQpIG9iajtcbiIKLSAgICAiXG4iLAotICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoImJvb2xlYW4gcmVzdWx0ID0gdHJ1ZTtcbiIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwpIHsKLSAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbyA9IGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpOwotICAgICAgYm9vbCBjaGVja19oYXNfYml0cyA9IENoZWNrSGFzQml0c0ZvckVxdWFsc0FuZEhhc2hDb2RlKGZpZWxkKTsKLSAgICAgIGlmIChjaGVja19oYXNfYml0cykgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIChoYXMkbmFtZSQoKSA9PSBvdGhlci5oYXMkbmFtZSQoKSk7XG4iCi0gICAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIiwKLSAgICAgICAgICAibmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOwotICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgIH0KLSAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVFcXVhbHNDb2RlKHByaW50ZXIpOwotICAgICAgaWYgKGNoZWNrX2hhc19iaXRzKSB7Ci0gICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIn1cbiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIENvbXBhcmUgb25lb2ZzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCkuZXF1YWxzKFxuIgotICAgICAgIiAgICBvdGhlci5nZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCkpO1xuIiwKLSAgICAgICJvbmVvZl9jYXBpdGFsaXplZF9uYW1lIiwKLSAgICAgIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8oCi0gICAgICAgICAgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSkpLT5jYXBpdGFsaXplZF9uYW1lKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJpZiAoIXJlc3VsdCkgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgInN3aXRjaCAoJG9uZW9mX25hbWUkQ2FzZV8pIHtcbiIsCi0gICAgICAib25lb2ZfbmFtZSIsCi0gICAgICBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKAotICAgICAgICAgIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpKS0+bmFtZSk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGRfY291bnQoKTsgaisrKSB7Ci0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkKGopOwotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJjYXNlICRmaWVsZF9udW1iZXIkOlxuIiwKLSAgICAgICAgImZpZWxkX251bWJlciIsCi0gICAgICAgIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSk7Ci0gICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVFcXVhbHNDb2RlKHByaW50ZXIpOwotICAgICAgcHJpbnRlci0+UHJpbnQoImJyZWFrO1xuIik7Ci0gICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNhc2UgMDpcbiIKLSAgICAgICJkZWZhdWx0OlxuIik7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgfQotCi0gIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgLy8gQWx3YXlzIGNvbnNpZGVyIHVua25vd24gZmllbGRzIGZvciBlcXVhbGl0eS4gVGhpcyB3aWxsIHNvbWV0aW1lcyByZXR1cm4KLSAgICAvLyBmYWxzZSBmb3Igbm9uLWNhbm9uaWNhbCBvcmRlcmluZyB3aGVuIHJ1bm5pbmcgaW4gTElURV9SVU5USU1FIGJ1dCBpdCdzCi0gICAgLy8gdGhlIGJlc3Qgd2UgY2FuIGRvLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiB1bmtub3duRmllbGRzLmVxdWFscyhvdGhlci51bmtub3duRmllbGRzKTtcbiIpOwotICB9Ci0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAicmVzdWx0ID0gcmVzdWx0ICYmXG4iCi0gICAgICAiICAgIGdldEV4dGVuc2lvbkZpZWxkcygpLmVxdWFscyhvdGhlci5nZXRFeHRlbnNpb25GaWVsZHMoKSk7XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCgKLSAgICAicmV0dXJuIHJlc3VsdDtcbiIpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ9XG4iCi0gICAgIlxuIik7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKLSAgICAicHVibGljIGludCBoYXNoQ29kZSgpIHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImlmIChtZW1vaXplZEhhc2hDb2RlICE9IDApIHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInJldHVybiBtZW1vaXplZEhhc2hDb2RlO1xuIik7Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIKLSAgICAiaW50IGhhc2ggPSA0MTtcbiIpOwotCi0gIHByaW50ZXItPlByaW50KCJoYXNoID0gKDE5ICogaGFzaCkgKyBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmhhc2hDb2RlKCk7XG4iKTsKLQotICAvLyBoYXNoQ29kZSBub24tb25lb2ZzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwpIHsKLSAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbyA9IGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpOwotICAgICAgYm9vbCBjaGVja19oYXNfYml0cyA9IENoZWNrSGFzQml0c0ZvckVxdWFsc0FuZEhhc2hDb2RlKGZpZWxkKTsKLSAgICAgIGlmIChjaGVja19oYXNfYml0cykgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiaWYgKGhhcyRuYW1lJCgpKSB7XG4iLAotICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7Ci0gICAgICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICAgfQotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUhhc2hDb2RlKHByaW50ZXIpOwotICAgICAgaWYgKGNoZWNrX2hhc19iaXRzKSB7Ci0gICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIGhhc2hDb2RlIG9uZW9mcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJzd2l0Y2ggKCRvbmVvZl9uYW1lJENhc2VfKSB7XG4iLAotICAgICAgIm9uZW9mX25hbWUiLAotICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbygKLSAgICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKSktPm5hbWUpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiY2FzZSAkZmllbGRfbnVtYmVyJDpcbiIsCi0gICAgICAgICJmaWVsZF9udW1iZXIiLAotICAgICAgICBTaW1wbGVJdG9hKGZpZWxkLT5udW1iZXIoKSkpOwotICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSGFzaENvZGUocHJpbnRlcik7Ci0gICAgICBwcmludGVyLT5QcmludCgiYnJlYWs7XG4iKTsKLSAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiY2FzZSAwOlxuIgotICAgICAgImRlZmF1bHQ6XG4iKTsKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotICB9Ci0KLSAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJoYXNoID0gaGFzaEZpZWxkcyhoYXNoLCBnZXRFeHRlbnNpb25GaWVsZHMoKSk7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KAotICAgICJoYXNoID0gKDI5ICogaGFzaCkgKyB1bmtub3duRmllbGRzLmhhc2hDb2RlKCk7XG4iKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIm1lbW9pemVkSGFzaENvZGUgPSBoYXNoO1xuIgotICAgICJyZXR1cm4gaGFzaDtcbiIpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ9XG4iCi0gICAgIlxuIik7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5leHRlbnNpb24oaSksIGNvbnRleHRfKQotICAgICAgLkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCBjb250ZXh0XykKLSAgICAgIC5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7Ci0gIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvbnN0cnVjdG9yKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IgKiA+IHNvcnRlZF9maWVsZHMoCi0gICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAgICJwcml2YXRlICRjbGFzc25hbWUkKFxuIgotICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCi0gICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgotICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIiwKLSAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBhbGwgZmllbGRzIHRvIGRlZmF1bHQuCi0gIHByaW50ZXItPlByaW50KAotICAgICAgInRoaXMoKTtcbiIpOwotCi0gIC8vIFVzZSBidWlsZGVyIGJpdHMgdG8gdHJhY2sgbXV0YWJsZSByZXBlYXRlZCBmaWVsZHMuCi0gIGludCB0b3RhbEJ1aWxkZXJCaXRzID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3ImIGZpZWxkID0KLSAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSk7Ci0gICAgdG90YWxCdWlsZGVyQml0cyArPSBmaWVsZC5HZXROdW1CaXRzRm9yQnVpbGRlcigpOwotICB9Ci0gIGludCB0b3RhbEJ1aWxkZXJJbnRzID0gKHRvdGFsQnVpbGRlckJpdHMgKyAzMSkgLyAzMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbEJ1aWxkZXJJbnRzOyBpKyspIHsKLSAgICBwcmludGVyLT5QcmludCgiaW50IG11dGFibGVfJGJpdF9maWVsZF9uYW1lJCA9IDA7XG4iLAotICAgICAgImJpdF9maWVsZF9uYW1lIiwgR2V0Qml0RmllbGROYW1lKGkpKTsKLSAgfQotCi0gIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID1cbiIKLSAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpO1xuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAgICJ0cnkge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJib29sZWFuIGRvbmUgPSBmYWxzZTtcbiIKLSAgICAid2hpbGUgKCFkb25lKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7XG4iCi0gICAgInN3aXRjaCAodGFnKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImNhc2UgMDpcbiIgICAgICAgICAgLy8gemVybyBzaWduYWxzIEVPRiAvIGxpbWl0IHJlYWNoZWQKLSAgICAiICBkb25lID0gdHJ1ZTtcbiIKLSAgICAiICBicmVhaztcbiIpOwotCi0gIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiZGVmYXVsdDoge1xuIgotICAgICAgIiAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgdW5rbm93bkZpZWxkcyxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZykpIHtcbiIKLSAgICAgICIgICAgZG9uZSA9IHRydWU7XG4iICAvLyBpdCdzIGFuIGVuZGdyb3VwIHRhZwotICAgICAgIiAgfVxuIgotICAgICAgIiAgYnJlYWs7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiZGVmYXVsdDoge1xuIgotICAgICAgIiAgaWYgKCFpbnB1dC5za2lwRmllbGQodGFnKSkge1xuIgotICAgICAgIiAgICBkb25lID0gdHJ1ZTtcbiIgIC8vIGl0J3MgYW4gZW5kZ3JvdXAgdGFnCi0gICAgICAiICB9XG4iKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIgIGJyZWFrO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHNvcnRlZF9maWVsZHNbaV07Ci0gICAgdWludDMyIHRhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwKLSAgICAgIFdpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpKTsKLQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNhc2UgJHRhZyQ6IHtcbiIsCi0gICAgICAidGFnIiwgU2ltcGxlSXRvYSh0YWcpKTsKLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLQotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVQYXJzaW5nQ29kZShwcmludGVyKTsKLQotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIgIGJyZWFrO1xuIgotICAgICAgIn1cbiIpOwotCi0gICAgaWYgKGZpZWxkLT5pc19wYWNrYWJsZSgpKSB7Ci0gICAgICAvLyBUbyBtYWtlIHBhY2tlZCA9IHRydWUgd2lyZSBjb21wYXRpYmxlLCB3ZSBnZW5lcmF0ZSBwYXJzaW5nIGNvZGUgZnJvbSBhCi0gICAgICAvLyBwYWNrZWQgdmVyc2lvbiBvZiB0aGlzIGZpZWxkIHJlZ2FyZGxlc3Mgb2YgZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKS4KLSAgICAgIHVpbnQzMiBwYWNrZWRfdGFnID0gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQtPm51bWJlcigpLAotICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNhc2UgJHRhZyQ6IHtcbiIsCi0gICAgICAgICJ0YWciLCBTaW1wbGVJdG9hKHBhY2tlZF90YWcpKTsKLSAgICAgIHByaW50ZXItPkluZGVudCgpOwotCi0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKHByaW50ZXIpOwotCi0gICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiAgYnJlYWs7XG4iCi0gICAgICAgICJ9XG4iKTsKLSAgICB9Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiICB9XG4iICAgICAvLyBzd2l0Y2ggKHRhZykKLSAgICAgICJ9XG4iKTsgICAgIC8vIHdoaWxlICghZG9uZSkKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICAgIn0gY2F0Y2ggKGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHtcbiIKLSAgICAgICIgIHRocm93IGUuc2V0VW5maW5pc2hlZE1lc3NhZ2UodGhpcyk7XG4iCi0gICAgICAifSBjYXRjaCAoamF2YS5pby5JT0V4Y2VwdGlvbiBlKSB7XG4iCi0gICAgICAiICB0aHJvdyBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oXG4iCi0gICAgICAiICAgICAgZSkuc2V0VW5maW5pc2hlZE1lc3NhZ2UodGhpcyk7XG4iCi0gICAgICAifSBmaW5hbGx5IHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICAvLyBNYWtlIHJlcGVhdGVkIGZpZWxkIGxpc3QgaW1tdXRhYmxlLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gc29ydGVkX2ZpZWxkc1tpXTsKLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKHByaW50ZXIpOwotICB9Ci0KLSAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKLSAgICAvLyBNYWtlIHVua25vd24gZmllbGRzIGltbXV0YWJsZS4KLSAgICBwcmludGVyLT5QcmludCgidGhpcy51bmtub3duRmllbGRzID0gdW5rbm93bkZpZWxkcy5idWlsZCgpO1xuIik7Ci0gIH0KLQotICAvLyBNYWtlIGV4dGVuc2lvbnMgaW1tdXRhYmxlLgotICBwcmludGVyLT5QcmludCgKLSAgICAgICJtYWtlRXh0ZW5zaW9uc0ltbXV0YWJsZSgpO1xuIik7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICAgIiAgfVxuIiAgICAgLy8gZmluYWxseQotICAgICAgIn1cbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci12b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlUGFyc2VyKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICAgIiR2aXNpYmlsaXR5JCBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5QYXJzZXI8JGNsYXNzbmFtZSQ+XG4iCi0gICAgICAiICAgIFBBUlNFUiA9IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0UGFyc2VyPCRjbGFzc25hbWUkPigpIHtcbiIsCi0gICAgICAidmlzaWJpbGl0eSIsCi0gICAgICBFeHBvc2VQdWJsaWNQYXJzZXIoZGVzY3JpcHRvcl8tPmZpbGUoKSkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkIHB1YmxpYyIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJwcml2YXRlIiwKLSAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBwYXJzZVBhcnRpYWxGcm9tKFxuIgotICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCi0gICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgotICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIiwKLSAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgaWYgKGNvbnRleHRfLT5IYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiICAgIHJldHVybiBuZXcgJGNsYXNzbmFtZSQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIsCi0gICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXaGVuIHBhcnNpbmcgY29uc3RydWN0b3IgaXNuJ3QgZ2VuZXJhdGVkLCB1c2UgYnVpbGRlciB0byBwYXJzZQotICAgIC8vIG1lc3NhZ2VzLiBOb3RlLCB3aWxsIGZhbGxiYWNrIHRvIHVzZSByZWZsZWN0aW9uIGJhc2VkIG1lcmdlRmllbGRGcm9tKCkKLSAgICAvLyBpbiBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlci4KLSAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIkJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTtcbiIKLSAgICAgICAgInRyeSB7XG4iCi0gICAgICAgICIgIGJ1aWxkZXIubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCi0gICAgICAgICJ9IGNhdGNoIChjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7XG4iCi0gICAgICAgICIgIHRocm93IGUuc2V0VW5maW5pc2hlZE1lc3NhZ2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKSk7XG4iCi0gICAgICAgICJ9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHtcbiIKLSAgICAgICAgIiAgdGhyb3cgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKFxuIgotICAgICAgICAiICAgICAgZS5nZXRNZXNzYWdlKCkpLnNldFVuZmluaXNoZWRNZXNzYWdlKFxuIgotICAgICAgICAiICAgICAgICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpO1xuIgotICAgICAgICAifVxuIgotICAgICAgICAicmV0dXJuIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7XG4iKTsKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ9XG4iKTsKLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgKLSAgICAgICJ9O1xuIgotICAgICAgIlxuIik7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gcGFyc2VyKCkge1xuIgotICAgICAgIiAgcmV0dXJuIFBBUlNFUjtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiXG4iCi0gICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgotICAgICAgInB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gZ2V0UGFyc2VyRm9yVHlwZSgpIHtcbiIKLSAgICAgICIgIHJldHVybiBQQVJTRVI7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotdm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUluaXRpYWxpemVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQotICAgICAgICAgIC5HZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlQW55TWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAicHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGdldFR5cGVVcmwoXG4iCi0gICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHR5cGVVcmxQcmVmaXgsXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvcikge1xuIgotICAgICIgIHJldHVybiB0eXBlVXJsUHJlZml4LmVuZHNXaXRoKFwiL1wiKVxuIgotICAgICIgICAgICA/IHR5cGVVcmxQcmVmaXggKyBkZXNjcmlwdG9yLmdldEZ1bGxOYW1lKClcbiIKLSAgICAiICAgICAgOiB0eXBlVXJsUHJlZml4ICsgXCIvXCIgKyBkZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCk7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgInByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlTmFtZUZyb21UeXBlVXJsKFxuIgotICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlVXJsKSB7XG4iCi0gICAgIiAgaW50IHBvcyA9IHR5cGVVcmwubGFzdEluZGV4T2YoJy8nKTtcbiIKLSAgICAiICByZXR1cm4gcG9zID09IC0xID8gXCJcIiA6IHR5cGVVcmwuc3Vic3RyaW5nKHBvcyArIDEpO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIgotICAgICJwdWJsaWMgc3RhdGljIDxUIGV4dGVuZHMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlPiBBbnkgcGFjayhcbiIKLSAgICAiICAgIFQgbWVzc2FnZSkge1xuIgotICAgICIgIHJldHVybiBBbnkubmV3QnVpbGRlcigpXG4iCi0gICAgIiAgICAgIC5zZXRUeXBlVXJsKGdldFR5cGVVcmwoXCJ0eXBlLmdvb2dsZWFwaXMuY29tXCIsXG4iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpKSlcbiIKLSAgICAiICAgICAgLnNldFZhbHVlKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpXG4iCi0gICAgIiAgICAgIC5idWlsZCgpO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIgotICAgICIvKipcbiIKLSAgICAiICogUGFja3MgYSBtZXNzYWdlIHVpc25nIHRoZSBnaXZlbiB0eXBlIFVSTCBwcmVmaXguIFRoZSB0eXBlIFVSTCB3aWxsXG4iCi0gICAgIiAqIGJlIGNvbnN0cnVjdGVkIGJ5IGNvbmNhdGVuYXRpbmcgdGhlIG1lc3NhZ2UgdHlwZSdzIGZ1bGwgbmFtZSB0byB0aGVcbiIKLSAgICAiICogcHJlZml4IHdpdGggYW4gb3B0aW9uYWwgXCIvXCIgc2VwYXJhdG9yIGlmIHRoZSBwcmVmaXggZG9lc24ndCBlbmRcbiIKLSAgICAiICogd2l0aCBcIi9cIiBhbHJlYWR5LlxuIgotICAgICIgKi9cbiIKLSAgICAicHVibGljIHN0YXRpYyA8VCBleHRlbmRzIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZT4gQW55IHBhY2soXG4iCi0gICAgIiAgICBUIG1lc3NhZ2UsIGphdmEubGFuZy5TdHJpbmcgdHlwZVVybFByZWZpeCkge1xuIgotICAgICIgIHJldHVybiBBbnkubmV3QnVpbGRlcigpXG4iCi0gICAgIiAgICAgIC5zZXRUeXBlVXJsKGdldFR5cGVVcmwodHlwZVVybFByZWZpeCxcbiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpKVxuIgotICAgICIgICAgICAuc2V0VmFsdWUobWVzc2FnZS50b0J5dGVTdHJpbmcoKSlcbiIKLSAgICAiICAgICAgLmJ1aWxkKCk7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgInB1YmxpYyA8VCBleHRlbmRzIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZT4gYm9vbGVhbiBpcyhcbiIKLSAgICAiICAgIGphdmEubGFuZy5DbGFzczxUPiBjbGF6eikge1xuIgotICAgICIgIFQgZGVmYXVsdEluc3RhbmNlID1cbiIKLSAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5nZXREZWZhdWx0SW5zdGFuY2UoY2xhenopO1xuIgotICAgICIgIHJldHVybiBnZXRUeXBlTmFtZUZyb21UeXBlVXJsKGdldFR5cGVVcmwoKSkuZXF1YWxzKFxuIgotICAgICIgICAgICBkZWZhdWx0SW5zdGFuY2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGdWxsTmFtZSgpKTtcbiIKLSAgICAifVxuIgotICAgICJcbiIKLSAgICAicHJpdmF0ZSB2b2xhdGlsZSBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2UgY2FjaGVkVW5wYWNrVmFsdWU7XG4iCi0gICAgIlxuIgotICAgICJwdWJsaWMgPFQgZXh0ZW5kcyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2U+IFQgdW5wYWNrKFxuIgotICAgICIgICAgamF2YS5sYW5nLkNsYXNzPFQ+IGNsYXp6KVxuIgotICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKLSAgICAiICBpZiAoIWlzKGNsYXp6KSkge1xuIgotICAgICIgICAgdGhyb3cgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKFxuIgotICAgICIgICAgICAgIFwiVHlwZSBvZiB0aGUgQW55IG1lc3NhZ2UgZG9lcyBub3QgbWF0Y2ggdGhlIGdpdmVuIGNsYXNzLlwiKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgaWYgKGNhY2hlZFVucGFja1ZhbHVlICE9IG51bGwpIHtcbiIKLSAgICAiICAgIHJldHVybiAoVCkgY2FjaGVkVW5wYWNrVmFsdWU7XG4iCi0gICAgIiAgfVxuIgotICAgICIgIFQgZGVmYXVsdEluc3RhbmNlID1cbiIKLSAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5nZXREZWZhdWx0SW5zdGFuY2UoY2xhenopO1xuIgotICAgICIgIFQgcmVzdWx0ID0gKFQpIGRlZmF1bHRJbnN0YW5jZS5nZXRQYXJzZXJGb3JUeXBlKClcbiIKLSAgICAiICAgICAgLnBhcnNlRnJvbShnZXRWYWx1ZSgpKTtcbiIKLSAgICAiICBjYWNoZWRVbnBhY2tWYWx1ZSA9IHJlc3VsdDtcbiIKLSAgICAiICByZXR1cm4gcmVzdWx0O1xuIgotICAgICJ9XG4iKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGphdmEKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGU5ZmM1N2MuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTQzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgbmFtZXNwYWNlIGNvbXBpbGVyIHsKLSAgICBuYW1lc3BhY2UgamF2YSB7Ci0gICAgICBjbGFzcyBDb250ZXh0OyAgICAgICAgICAgLy8gY29udGV4dC5oCi0gICAgICBjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgLy8gbmFtZV9yZXNvbHZlci5oCi0gICAgfQotICB9Ci0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCi0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga01heFN0YXRpY1NpemUgPSAxIDw8IDE1OyAgLy8gYWthIDMyawotCi1jbGFzcyBNZXNzYWdlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1lc3NhZ2VHZW5lcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0gIHZpcnR1YWwgfk1lc3NhZ2VHZW5lcmF0b3IoKTsKLQotICAvLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBoYXZlIHRvIGJlIGRlY2xhcmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIGZpbGUKLSAgLy8gc28gdGhhdCB3ZSBjYW4gY29udHJvbCBpbml0aWFsaXphdGlvbiBvcmRlciwgd2hpY2ggaXMgaW1wb3J0YW50IGZvcgotICAvLyBEZXNjcmlwdG9yUHJvdG8gYm9vdHN0cmFwcGluZyB0byB3b3JrLgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoCi0gICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgaW50KiBieXRlY29kZV9lc3RpbWF0ZSkgPSAwOwotCi0gIC8vIE91dHB1dCBjb2RlIHdoaWNoIGluaXRpYWxpemVzIHRoZSBzdGF0aWMgdmFyaWFibGVzIGdlbmVyYXRlZCBieQotICAvLyBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcygpLiBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIGJ5dGVjb2RlIHNpemUuCi0gIHZpcnR1YWwgaW50IEdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKLQotICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3MgaXRzZWxmLgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKLQotICAvLyBHZW5lcmF0ZXMgdGhlIGJhc2UgaW50ZXJmYWNlIHRoYXQgYm90aCB0aGUgY2xhc3MgYW5kIGl0cyBidWlsZGVyIGltcGxlbWVudAotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKLQotICAvLyBHZW5lcmF0ZSBjb2RlIHRvIHJlZ2lzdGVyIGFsbCBjb250YWluZWQgZXh0ZW5zaW9ucyB3aXRoIGFuCi0gIC8vIEV4dGVuc2lvblJlZ2lzdHJ5LgotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFeHRlbnNpb25SZWdpc3RyYXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7Ci0KLSBwcm90ZWN0ZWQ6Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvciA6IHB1YmxpYyBNZXNzYWdlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKLSAgdmlydHVhbCB+SW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcigpOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoCi0gICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgaW50KiBieXRlY29kZV9lc3RpbWF0ZSk7Ci0KLSAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcmludGVkIGNvZGUgd2lsbCBjb21waWxlIHRvCi0gIHZpcnR1YWwgaW50IEdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gcHJpdmF0ZToKLQotICB2b2lkIEdlbmVyYXRlRmllbGRBY2Nlc3NvclRhYmxlKGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQqIGJ5dGVjb2RlX2VzdGltYXRlKTsKLQotICAvLyBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByaW50ZWQgY29kZSB3aWxsIGNvbXBpbGUgdG8KLSAgaW50IEdlbmVyYXRlRmllbGRBY2Nlc3NvclRhYmxlSW5pdGlhbGl6ZXIoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIHZvaWQgR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlUGFyc2VGcm9tTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZChpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplT25lRXh0ZW5zaW9uUmFuZ2UoCi0gICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlKTsKLQotICB2b2lkIEdlbmVyYXRlQnVpbGRlcihpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVJc0luaXRpYWxpemVkKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZURlc2NyaXB0b3JNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemVycyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVFcXVhbHNBbmRIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzZXIoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvbnN0cnVjdG9yKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZUFueU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIENvbnRleHQqIGNvbnRleHRfOwotICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87Ci0gIEZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yPiBmaWVsZF9nZW5lcmF0b3JzXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1NTUxNmYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyOTEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgU2V0TWVzc2FnZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKLSAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKLSAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKLQotICAoKnZhcmlhYmxlcylbInR5cGUiXSA9Ci0gICAgICBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOwotICAoKnZhcmlhYmxlcylbIm11dGFibGVfdHlwZSJdID0KLSAgICAgIG5hbWVfcmVzb2x2ZXItPkdldE11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOwotICAoKnZhcmlhYmxlcylbImdyb3VwX29yX21lc3NhZ2UiXSA9Ci0gICAgKEdldFR5cGUoZGVzY3JpcHRvcikgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSA/Ci0gICAgIkdyb3VwIiA6ICJNZXNzYWdlIjsKLSAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAotICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKLSAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQotICAgICAgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKLSAgKCp2YXJpYWJsZXMpWyJvbl9jaGFuZ2VkIl0gPSAib25DaGFuZ2VkKCk7IjsKLQotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvci0+ZmlsZSgpKSkgewotICAgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KLSAgICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7Ci0gICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwotCi0gICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCi0gICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQotICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOwotICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KLSAgICAgICAgR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKLSAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KLSAgICAgICAgR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpICsgIjsiOwotCi0gICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7Ci0gIH0gZWxzZSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSAiIjsKLSAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9ICIiOwotICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKLQotICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQotICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfICE9IG51bGwiOwotICB9Ci0KLSAgLy8gRm9yIHJlcGF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgotICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKLQotICAvLyBGb3IgcmVwZWF0ZWQgZmllbGRzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZQotICAvLyBpbiB0aGUgcGFyc2luZyBjb25zdHJ1Y3Rvci4KLSAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQotICAgICAgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQotICAgICAgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKLQotICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9Ci0gICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQotICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1JbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCi0gICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpLCBjb250ZXh0Xyhjb250ZXh0KSwKLSAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgewotICAgIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOwotfQotCi1JbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6On5JbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQotCi1pbnQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgewotICByZXR1cm4gMTsKLX0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIFRPRE8oam9ucCk6IEluIHRoZSBmdXR1cmUsIGNvbnNpZGVyIGhhdmluZyBhIG1ldGhvZCBzcGVjaWZpYyB0byB0aGUKLSAgLy8gaW50ZXJmYWNlIHNvIHRoYXQgYnVpbGRlcnMgY2FuIGNob29zZSBkeW5hbWljYWxseSB0byBlaXRoZXIgcmV0dXJuIGEKLSAgLy8gbWVzc2FnZSBvciBhIG5lc3RlZCBidWlsZGVyLCBzbyB0aGF0IGFza2luZyBmb3IgdGhlIGludGVyZmFjZSBkb2Vzbid0Ci0gIC8vIGNhdXNlIGEgbWVzc2FnZSB0byBldmVyIGJlIGJ1aWx0LgotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkgfHwKLSAgICAgIGRlc2NyaXB0b3JfLT5jb250YWluaW5nX29uZW9mKCkgPT0gTlVMTCkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7Ci0gIH0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kJHR5cGUkT3JCdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlcigpO1xuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlICR0eXBlJCAkbmFtZSRfO1xuIik7Ci0gIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7Ci0KLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCi0gICAgICAifVxuIik7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCi0gICAgICAifVxuIik7Ci0KLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciAiCi0gICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAgICIgIHJldHVybiAkbmFtZSRfICE9IG51bGw7XG4iCi0gICAgICAifVxuIik7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCi0gICAgICAifVxuIik7Ci0KLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciAiCi0gICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKCkge1xuIgotICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAotICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn0gZWxzZSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIG5lc3RlZF9idWlsZGVyX2Nhc2UpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyLAotICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsCi0gICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAotICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCi0gICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBtZXRob2RfcHJvdG90eXBlKTsKLSAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLCByZWd1bGFyX2Nhc2UsIG5lc3RlZF9idWlsZGVyX2Nhc2UpOwotICBpZiAodHJhaWxpbmdfY29kZSAhPSBOVUxMKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgdHJhaWxpbmdfY29kZSk7Ci0gIH0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCi0gIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KLSAgLy8gZGVtYW5kIGFuZCB0aGVuIGZvcmV2ZXIgZGVsZWdhdGVzIHRvIGl0IGFmdGVyIGNyZWF0aW9uLgotCi0gIGJvb2wgc3VwcG9ydF9maWVsZF9wcmVzZW5jZSA9IFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpOwotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgJHR5cGUkICRuYW1lJF8gPSBudWxsO1xuIik7Ci0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgIC8vIElmIHRoaXMgYnVpbGRlciBpcyBub24tbnVsbCwgaXQgaXMgdXNlZCBhbmQgdGhlIG90aGVyIGZpZWxkcyBhcmUKLSAgICAgIC8vIGlnbm9yZWQuCi0gICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlNpbmdsZUZpZWxkQnVpbGRlcjxcbiIKLSAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXzsiCi0gICAgICAiXG4iKTsKLQotICAvLyBUaGUgY29tbWVudHMgYWJvdmUgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGJhc2VkIG9uIGEgaHlwb3RoZXRpY2FsCi0gIC8vIGZpZWxkIG9mIHR5cGUgIkZpZWxkIiBjYWxsZWQgIkZpZWxkIi4KLQotICAvLyBib29sZWFuIGhhc0ZpZWxkKCkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBpZiAoc3VwcG9ydF9maWVsZF9wcmVzZW5jZSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfICE9IG51bGwgfHwgJG5hbWUkXyAhPSBudWxsO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgLy8gRmllbGQgZ2V0RmllbGQoKQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIiwKLSAgICAicmV0dXJuICRuYW1lJF8gPT0gbnVsbCA/ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iLAotICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZSgpO1xuIiwKLSAgICBOVUxMKTsKLQotICAvLyBGaWVsZC5CdWlsZGVyIHNldEZpZWxkKEZpZWxkIHZhbHVlKQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSIsCi0KLSAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKLSAgICAiICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKLSAgICAifVxuIgotICAgICIkbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgIiRvbl9jaGFuZ2VkJFxuIiwKLQotICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKHZhbHVlKTtcbiIsCi0KLSAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCi0gICAgInJldHVybiB0aGlzO1xuIik7Ci0KLSAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgotICAgICIgICAgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCi0KLSAgICAiJG5hbWUkXyA9IGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpO1xuIgotICAgICIkb25fY2hhbmdlZCRcbiIsCi0KLSAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZShidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAotCi0gICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgotICAgICJyZXR1cm4gdGhpcztcbiIpOwotCi0gIC8vIEZpZWxkLkJ1aWxkZXIgbWVyZ2VGaWVsZChGaWVsZCB2YWx1ZSkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgbWVyZ2UkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSIsCi0KLSAgICBzdXBwb3J0X2ZpZWxkX3ByZXNlbmNlCi0gICAgICAgID8gImlmICgkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQgJiZcbiIKLSAgICAgICAgICAiICAgICRuYW1lJF8gIT0gbnVsbCAmJlxuIgotICAgICAgICAgICIgICAgJG5hbWUkXyAhPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHtcbiIKLSAgICAgICAgICAiICAkbmFtZSRfID1cbiIKLSAgICAgICAgICAiICAgICR0eXBlJC5uZXdCdWlsZGVyKCRuYW1lJF8pLm1lcmdlRnJvbSh2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7XG4iCi0gICAgICAgICAgIn0gZWxzZSB7XG4iCi0gICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgotICAgICAgICAgICJ9XG4iCi0gICAgICAgICAgIiRvbl9jaGFuZ2VkJFxuIgotICAgICAgICA6ICJpZiAoJG5hbWUkXyAhPSBudWxsKSB7XG4iCi0gICAgICAgICAgIiAgJG5hbWUkXyA9XG4iCi0gICAgICAgICAgIiAgICAkdHlwZSQubmV3QnVpbGRlcigkbmFtZSRfKS5tZXJnZUZyb20odmFsdWUpLmJ1aWxkUGFydGlhbCgpO1xuIgotICAgICAgICAgICJ9IGVsc2Uge1xuIgotICAgICAgICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKLSAgICAgICAgICAifVxuIgotICAgICAgICAgICIkb25fY2hhbmdlZCRcbiIsCi0KLSAgICAiJG5hbWUkQnVpbGRlcl8ubWVyZ2VGcm9tKHZhbHVlKTtcbiIsCi0KLSAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCi0gICAgInJldHVybiB0aGlzO1xuIik7Ci0KLSAgLy8gRmllbGQuQnVpbGRlciBjbGVhckZpZWxkKCkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSIsCi0KLSAgICAiJG5hbWUkXyA9IG51bGw7XG4iCi0gICAgIiRvbl9jaGFuZ2VkJFxuIiwKLQotICAgIHN1cHBvcnRfZmllbGRfcHJlc2VuY2UKLSAgICAgICAgPyAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIKLSAgICAgICAgOiAiJG5hbWUkXyA9IG51bGw7XG4iCi0gICAgICAgICAgIiRuYW1lJEJ1aWxkZXJfID0gbnVsbDtcbiIsCi0KLSAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKLSAgICAicmV0dXJuIHRoaXM7XG4iKTsKLQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkLkJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlcigpIHtcbiIKLSAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcigpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCi0gICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfICE9IG51bGwpIHtcbiIKLSAgICAiICAgIHJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlT3JCdWlsZGVyKCk7XG4iCi0gICAgIiAgfSBlbHNlIHtcbiIKLSAgICAiICAgIHJldHVybiAkbmFtZSRfID09IG51bGwgP1xuIgotICAgICIgICAgICAgICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgotICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKLSAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgotICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXI8XG4iCi0gICAgIiAgICAgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPihcbiIKLSAgICAiICAgICAgICAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCksXG4iCi0gICAgIiAgICAgICAgICAgIGdldFBhcmVudEZvckNoaWxkcmVuKCksXG4iCi0gICAgIiAgICAgICAgICAgIGlzQ2xlYW4oKSk7XG4iCi0gICAgIiAgICAkbmFtZSRfID0gbnVsbDtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCk7XG4iKTsKLSAgfQotfQotCi0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7fQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsCi0gICAgICAiJG5hbWUkXyA9IG51bGw7XG4iLAotCi0gICAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIpOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsCi0gICAgICAiJG5hbWUkXyA9IG51bGw7XG4iLAotCi0gICAgICAiJG5hbWUkXyA9IG51bGw7XG4iCi0gICAgICAiJG5hbWUkQnVpbGRlcl8gPSBudWxsO1xuIik7Ci0gIH0KLX0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKLSAgICAiICBtZXJnZSRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIgotICAgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwkO1xuIgotICAgICAgICAifVxuIik7Ci0gIH0KLQotICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKLSAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIiwKLQotICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJEJ1aWxkZXJfLmJ1aWxkKCk7XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkdHlwZSQuQnVpbGRlciBzdWJCdWlsZGVyID0gbnVsbDtcbiIKLSAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgc3ViQnVpbGRlciA9ICRuYW1lJF8udG9CdWlsZGVyKCk7XG4iCi0gICAgIn1cbiIpOwotCi0gIGlmIChHZXRUeXBlKGRlc2NyaXB0b3JfKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRuYW1lJF8gPSBpbnB1dC5yZWFkR3JvdXAoJG51bWJlciQsICR0eXBlJC5wYXJzZXIoKSxcbiIKLSAgICAgICIgICAgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkbmFtZSRfID0gaW5wdXQucmVhZE1lc3NhZ2UoJHR5cGUkLnBhcnNlcigpLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmIChzdWJCdWlsZGVyICE9IG51bGwpIHtcbiIKLSAgICAiICBzdWJCdWlsZGVyLm1lcmdlRnJvbSgkbmFtZSRfKTtcbiIKLSAgICAiICAkbmFtZSRfID0gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTtcbiIKLSAgICAifVxuIgotICAgICIkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBub29wIGZvciBtZXNzYWdlcy4KLX0KLQotdm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSQpIHtcbiIKLSAgICAiICBvdXRwdXQud3JpdGUkZ3JvdXBfb3JfbWVzc2FnZSQoJG51bWJlciQsIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgotICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgotICAgICIgICAgLmNvbXB1dGUkZ3JvdXBfb3JfbWVzc2FnZSRTaXplKCRudW1iZXIkLCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpXG4iCi0gICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKLSAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkuaGFzaENvZGUoKTtcbiIpOwotfQotCi1zdHJpbmcgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQotICAgIDogSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgIGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KSB7Ci0gIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbyA9Ci0gICAgICBjb250ZXh0LT5HZXRPbmVvZkdlbmVyYXRvckluZm8oZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpKTsKLSAgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgJnZhcmlhYmxlc18pOwotfQotCi1JbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1+SW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOwotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgICAgcmV0dXJuICgkdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCi0gICAgIiAgfVxuIgotICAgICIgIHJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iCi0gICAgIn1cbiIpOwotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKCkge1xuIgotICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICAgICByZXR1cm4gKCR0eXBlJCkgJG9uZW9mX25hbWUkXztcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBXaGVuIHVzaW5nIG5lc3RlZC1idWlsZGVycywgdGhlIGNvZGUgaW5pdGlhbGx5IHdvcmtzIGp1c3QgbGlrZSB0aGUKLSAgLy8gbm9uLW5lc3RlZCBidWlsZGVyIGNhc2UuIEl0IG9ubHkgY3JlYXRlcyBhIG5lc3RlZCBidWlsZGVyIGxhemlseSBvbgotICAvLyBkZW1hbmQgYW5kIHRoZW4gZm9yZXZlciBkZWxlZ2F0ZXMgdG8gaXQgYWZ0ZXIgY3JlYXRpb24uCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgLy8gSWYgdGhpcyBidWlsZGVyIGlzIG5vbi1udWxsLCBpdCBpcyB1c2VkIGFuZCB0aGUgb3RoZXIgZmllbGRzIGFyZQotICAgIC8vIGlnbm9yZWQuCi0gICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXI8XG4iCi0gICAgIiAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+ICRuYW1lJEJ1aWxkZXJfOyIKLSAgICAiXG4iKTsKLQotICAvLyBUaGUgY29tbWVudHMgYWJvdmUgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGJhc2VkIG9uIGEgaHlwb3RoZXRpY2FsCi0gIC8vIGZpZWxkIG9mIHR5cGUgIkZpZWxkIiBjYWxsZWQgIkZpZWxkIi4KLQotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAvLyBib29sZWFuIGhhc0ZpZWxkKCkKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0gIC8vIEZpZWxkIGdldEZpZWxkKCkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSIsCi0KLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIHJldHVybiAoJHR5cGUkKSAkb25lb2ZfbmFtZSRfO1xuIgotICAgICJ9XG4iCi0gICAgInJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iLAotCi0gICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZSgpO1xuIgotICAgICJ9XG4iCi0gICAgInJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iLAotCi0gICAgTlVMTCk7Ci0KLSAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZCB2YWx1ZSkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkiLAotCi0gICAgImlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCi0gICAgIiAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCi0gICAgIn1cbiIKLSAgICAiJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgotICAgICIkb25fY2hhbmdlZCRcbiIsCi0KLSAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZSh2YWx1ZSk7XG4iLAotCi0gICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAicmV0dXJuIHRoaXM7XG4iKTsKLQotICAvLyBGaWVsZC5CdWlsZGVyIHNldEZpZWxkKEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCi0gICAgIiAgICAkdHlwZSQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpIiwKLQotICAgICIkb25lb2ZfbmFtZSRfID0gYnVpbGRlckZvclZhbHVlLmJ1aWxkKCk7XG4iCi0gICAgIiRvbl9jaGFuZ2VkJFxuIiwKLQotICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIsCi0KLSAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICJyZXR1cm4gdGhpcztcbiIpOwotCi0gIC8vIEZpZWxkLkJ1aWxkZXIgbWVyZ2VGaWVsZChGaWVsZCB2YWx1ZSkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgbWVyZ2UkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSIsCi0KLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCAmJlxuIgotICAgICIgICAgJG9uZW9mX25hbWUkXyAhPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpIHtcbiIKLSAgICAiICAkb25lb2ZfbmFtZSRfID0gJHR5cGUkLm5ld0J1aWxkZXIoKCR0eXBlJCkgJG9uZW9mX25hbWUkXylcbiIKLSAgICAiICAgICAgLm1lcmdlRnJvbSh2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7XG4iCi0gICAgIn0gZWxzZSB7XG4iCi0gICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgotICAgICJ9XG4iCi0gICAgIiRvbl9jaGFuZ2VkJFxuIiwKLQotICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgJG5hbWUkQnVpbGRlcl8ubWVyZ2VGcm9tKHZhbHVlKTtcbiIKLSAgICAifVxuIgotICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKHZhbHVlKTtcbiIsCi0KLSAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICJyZXR1cm4gdGhpcztcbiIpOwotCi0gIC8vIEZpZWxkLkJ1aWxkZXIgY2xlYXJGaWVsZCgpCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkiLAotCi0gICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICAkY2xlYXJfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAiICAkb25lb2ZfbmFtZSRfID0gbnVsbDtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAifVxuIiwKLQotICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgIiAgJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iCi0gICAgIn1cbiIKLSAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIsCi0KLSAgICAicmV0dXJuIHRoaXM7XG4iKTsKLQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkLkJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlcigpIHtcbiIKLSAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcigpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCi0gICAgIiAgaWYgKCgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpICYmICgkbmFtZSRCdWlsZGVyXyAhPSBudWxsKSkge1xuIgotICAgICIgICAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2VPckJ1aWxkZXIoKTtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgICAgICByZXR1cm4gKCR0eXBlJCkgJG9uZW9mX25hbWUkXztcbiIKLSAgICAiICAgIH1cbiIKLSAgICAiICAgIHJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgotICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKLSAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgotICAgICIgICAgaWYgKCEoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSkge1xuIgotICAgICIgICAgICAkb25lb2ZfbmFtZSRfID0gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIgotICAgICIgICAgfVxuIgotICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXI8XG4iCi0gICAgIiAgICAgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPihcbiIKLSAgICAiICAgICAgICAgICAgKCR0eXBlJCkgJG9uZW9mX25hbWUkXyxcbiIKLSAgICAiICAgICAgICAgICAgZ2V0UGFyZW50Rm9yQ2hpbGRyZW4oKSxcbiIKLSAgICAiICAgICAgICAgICAgaXNDbGVhbigpKTtcbiIKLSAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgotICAgICIgIH1cbiIKLSAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkO1xuIgotICAgICIgIHJldHVybiAkbmFtZSRCdWlsZGVyXztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAgICAgICAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAotICAgICJyZXN1bHQuJG9uZW9mX25hbWUkXyA9ICRvbmVvZl9uYW1lJF87XG4iLAotCi0gICAgInJlc3VsdC4kb25lb2ZfbmFtZSRfID0gJG5hbWUkQnVpbGRlcl8uYnVpbGQoKTtcbiIpOwotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAibWVyZ2UkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkdHlwZSQuQnVpbGRlciBzdWJCdWlsZGVyID0gbnVsbDtcbiIKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIHN1YkJ1aWxkZXIgPSAoKCR0eXBlJCkgJG9uZW9mX25hbWUkXykudG9CdWlsZGVyKCk7XG4iCi0gICAgIn1cbiIpOwotCi0gIGlmIChHZXRUeXBlKGRlc2NyaXB0b3JfKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRvbmVvZl9uYW1lJF8gPSBpbnB1dC5yZWFkR3JvdXAoJG51bWJlciQsICR0eXBlJC5wYXJzZXIoKSxcbiIKLSAgICAgICIgICAgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkb25lb2ZfbmFtZSRfID1cbiIKLSAgICAgICIgICAgaW5wdXQucmVhZE1lc3NhZ2UoJHR5cGUkLnBhcnNlcigpLCBleHRlbnNpb25SZWdpc3RyeSk7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmIChzdWJCdWlsZGVyICE9IG51bGwpIHtcbiIKLSAgICAiICBzdWJCdWlsZGVyLm1lcmdlRnJvbSgoJHR5cGUkKSAkb25lb2ZfbmFtZSRfKTtcbiIKLSAgICAiICAkb25lb2ZfbmFtZSRfID0gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTtcbiIKLSAgICAifVxuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIG91dHB1dC53cml0ZSRncm91cF9vcl9tZXNzYWdlJCgkbnVtYmVyJCwgKCR0eXBlJCkgJG9uZW9mX25hbWUkXyk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKLSAgICAiICAgIC5jb21wdXRlJGdyb3VwX29yX21lc3NhZ2UkU2l6ZSgkbnVtYmVyJCwgKCR0eXBlJCkgJG9uZW9mX25hbWUkXyk7XG4iCi0gICAgIn1cbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLVJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAotICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSwgY29udGV4dF8oY29udGV4dCksCi0gICAgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpICB7Ci0gIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Ci19Ci0KLVJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLX5SZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLWludCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgewotICByZXR1cm4gMTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gVE9ETyhqb25wKTogSW4gdGhlIGZ1dHVyZSwgY29uc2lkZXIgaGF2aW5nIG1ldGhvZHMgc3BlY2lmaWMgdG8gdGhlCi0gIC8vIGludGVyZmFjZSBzbyB0aGF0IGJ1aWxkZXJzIGNhbiBjaG9vc2UgZHluYW1pY2FsbHkgdG8gZWl0aGVyIHJldHVybiBhCi0gIC8vIG1lc3NhZ2Ugb3IgYSBuZXN0ZWQgYnVpbGRlciwgc28gdGhhdCBhc2tpbmcgZm9yIHRoZSBpbnRlcmZhY2UgZG9lc24ndAotICAvLyBjYXVzZSBhIG1lc3NhZ2UgdG8gZXZlciBiZSBidWlsdC4KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8JHR5cGUkPiBcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCk7XG4iKTsKLQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlckxpc3QoKTtcbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiQkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKFxuIgotICAgICIgICAgaW50IGluZGV4KTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXztcbiIpOwotICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8JHR5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyAkdHlwZSRPckJ1aWxkZXI+IFxuIgotICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyTGlzdCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKFxuIgotICAgICIgICAgaW50IGluZGV4KSB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKLSAgICAifVxuIik7Ci0KLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyLAotICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKLSAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCByZWd1bGFyX2Nhc2UpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9IGVsc2Uge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBuZXN0ZWRfYnVpbGRlcl9jYXNlKTsKLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyLAotICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsCi0gICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAotICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCi0gICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBtZXRob2RfcHJvdG90eXBlKTsKLSAgcHJpbnRlci0+UHJpbnQoIiB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLCByZWd1bGFyX2Nhc2UsIG5lc3RlZF9idWlsZGVyX2Nhc2UpOwotICBpZiAodHJhaWxpbmdfY29kZSAhPSBOVUxMKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgdHJhaWxpbmdfY29kZSk7Ci0gIH0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBXaGVuIHVzaW5nIG5lc3RlZC1idWlsZGVycywgdGhlIGNvZGUgaW5pdGlhbGx5IHdvcmtzIGp1c3QgbGlrZSB0aGUKLSAgLy8gbm9uLW5lc3RlZCBidWlsZGVyIGNhc2UuIEl0IG9ubHkgY3JlYXRlcyBhIG5lc3RlZCBidWlsZGVyIGxhemlseSBvbgotICAvLyBkZW1hbmQgYW5kIHRoZW4gZm9yZXZlciBkZWxlZ2F0ZXMgdG8gaXQgYWZ0ZXIgY3JlYXRpb24uCi0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAvLyBVc2VkIHdoZW4gdGhlIGJ1aWxkZXIgaXMgbnVsbC4KLSAgICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBvdGhlciBmaWVsZCBrZWVwcyB0cmFjayBvZiB3aGV0aGVyIHRoZQotICAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLiBJZiBpdCdzIGltbXV0YWJsZSwgdGhlIGludmFyaWFudCBpcyB0aGF0IGl0IG11c3QKLSAgICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKLSAgICAvLyB3cmFwcGVkIGluIGEgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgpIHdyYXBwZXIgYW5kIG5vYm9keSBlbHNlIGhhcwotICAgIC8vIGEgcmVmZXJlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgQXJyYXlMaXN0LiBUaGlzIGludmFyaWFudCBhbGxvd3MgdXMgdG8KLSAgICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQotICAgIC8vIG1lbW9yeSBhbGxvY2F0aW9ucy4gTm90ZSwgaW1tdXRhYmxlIGlzIGEgc3Ryb25nIGd1YXJhbnRlZSBoZXJlIC0tIG5vdAotICAgIC8vIGp1c3QgdGhhdCB0aGUgbGlzdCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIHRoZSByZWZlcmVuY2UgYnV0IHRoYXQgdGhlCi0gICAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCi0gICAgInByaXZhdGUgamF2YS51dGlsLkxpc3Q8JHR5cGUkPiAkbmFtZSRfID1cbiIKLSAgICAiICBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iCi0KLSAgICAicHJpdmF0ZSB2b2lkIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpIHtcbiIKLSAgICAiICBpZiAoISRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKLSAgICAiICAgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkdHlwZSQ+KCRuYW1lJF8pO1xuIgotICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICAgfVxuIgotICAgICJ9XG4iCi0gICAgIlxuIik7Ci0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAvLyBJZiB0aGlzIGJ1aWxkZXIgaXMgbm9uLW51bGwsIGl0IGlzIHVzZWQgYW5kIHRoZSBvdGhlciBmaWVsZHMgYXJlCi0gICAgLy8gaWdub3JlZC4KLSAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyPFxuIgotICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXztcbiIKLSAgICAiXG4iKTsKLQotICAvLyBUaGUgY29tbWVudHMgYWJvdmUgdGhlIG1ldGhvZHMgYmVsb3cgYXJlIGJhc2VkIG9uIGEgaHlwb3RoZXRpY2FsCi0gIC8vIHJlcGVhdGVkIGZpZWxkIG9mIHR5cGUgIkZpZWxkIiBjYWxsZWQgIlJlcGVhdGVkRmllbGQiLgotCi0gIC8vIExpc3Q8RmllbGQ+IGdldFJlcGVhdGVkRmllbGRMaXN0KCkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIiwKLQotICAgICJyZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iLAotICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZUxpc3QoKTtcbiIsCi0KLSAgICBOVUxMKTsKLQotICAvLyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KCkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIiwKLQotICAgICJyZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iLAotICAgICJyZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0Q291bnQoKTtcbiIsCi0KLSAgICBOVUxMKTsKLQotICAvLyBGaWVsZCBnZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSIsCi0KLSAgICAicmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIsCi0KLSAgICAicmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2UoaW5kZXgpO1xuIiwKLQotICAgIE5VTEwpOwotCi0gIC8vIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCi0gICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkiLAotICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgotICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgotICAgICJ9XG4iCi0gICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgotICAgICIkb25fY2hhbmdlZCRcbiIsCi0gICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UoaW5kZXgsIHZhbHVlKTtcbiIsCi0gICAgInJldHVybiB0aGlzO1xuIik7Ci0KLSAgLy8gQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKLSAgICAiICAgIGludCBpbmRleCwgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCi0KLSAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiRuYW1lJF8uc2V0KGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iCi0gICAgIiRvbl9jaGFuZ2VkJFxuIiwKLQotICAgICIkbmFtZSRCdWlsZGVyXy5zZXRNZXNzYWdlKGluZGV4LCBidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAotCi0gICAgInJldHVybiB0aGlzO1xuIik7Ci0KLSAgLy8gQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKEZpZWxkIHZhbHVlKQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSIsCi0KLSAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKLSAgICAiICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKLSAgICAifVxuIgotICAgICJlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKLSAgICAiJG5hbWUkXy5hZGQodmFsdWUpO1xuIgotCi0gICAgIiRvbl9jaGFuZ2VkJFxuIiwKLQotICAgICIkbmFtZSRCdWlsZGVyXy5hZGRNZXNzYWdlKHZhbHVlKTtcbiIsCi0KLSAgICAicmV0dXJuIHRoaXM7XG4iKTsKLQotICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoaW50IGluZGV4LCBGaWVsZCB2YWx1ZSkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgotICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIiwKLQotICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgotICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgotICAgICJ9XG4iCi0gICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIkbmFtZSRfLmFkZChpbmRleCwgdmFsdWUpO1xuIgotICAgICIkb25fY2hhbmdlZCRcbiIsCi0KLSAgICAiJG5hbWUkQnVpbGRlcl8uYWRkTWVzc2FnZShpbmRleCwgdmFsdWUpO1xuIiwKLQotICAgICJyZXR1cm4gdGhpcztcbiIpOwotCi0gIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgotICAgICIgICAgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCi0KLSAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiRuYW1lJF8uYWRkKGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpKTtcbiIKLSAgICAiJG9uX2NoYW5nZWQkXG4iLAotCi0gICAgIiRuYW1lJEJ1aWxkZXJfLmFkZE1lc3NhZ2UoYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIiwKLQotICAgICJyZXR1cm4gdGhpcztcbiIpOwotCi0gIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCi0gICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLAotCi0gICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIkbmFtZSRfLmFkZChpbmRleCwgYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIgotICAgICIkb25fY2hhbmdlZCRcbiIsCi0KLSAgICAiJG5hbWUkQnVpbGRlcl8uYWRkTWVzc2FnZShpbmRleCwgYnVpbGRlckZvclZhbHVlLmJ1aWxkKCkpO1xuIiwKLQotICAgICJyZXR1cm4gdGhpcztcbiIpOwotCi0gIC8vIEJ1aWxkZXIgYWRkQWxsUmVwZWF0ZWRGaWVsZChJdGVyYWJsZTxGaWVsZD4gdmFsdWVzKQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCi0gICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICR0eXBlJD4gdmFsdWVzKSIsCi0KLSAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgImNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RNZXNzYWdlTGl0ZS5CdWlsZGVyLmFkZEFsbChcbiIKLSAgICAiICAgIHZhbHVlcywgJG5hbWUkXyk7XG4iCi0gICAgIiRvbl9jaGFuZ2VkJFxuIiwKLQotICAgICIkbmFtZSRCdWlsZGVyXy5hZGRBbGxNZXNzYWdlcyh2YWx1ZXMpO1xuIiwKLQotICAgICJyZXR1cm4gdGhpcztcbiIpOwotCi0gIC8vIEJ1aWxkZXIgY2xlYXJBbGxSZXBlYXRlZEZpZWxkKCkKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSIsCi0KLSAgICAiJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKLSAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgotICAgICIkb25fY2hhbmdlZCRcbiIsCi0KLSAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIsCi0KLSAgICAicmV0dXJuIHRoaXM7XG4iKTsKLQotICAvLyBCdWlsZGVyIHJlbW92ZVJlcGVhdGVkRmllbGQoaW50IGluZGV4KQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciByZW1vdmUkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSIsCi0KLSAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiRuYW1lJF8ucmVtb3ZlKGluZGV4KTtcbiIKLSAgICAiJG9uX2NoYW5nZWQkXG4iLAotCi0gICAgIiRuYW1lJEJ1aWxkZXJfLnJlbW92ZShpbmRleCk7XG4iLAotCi0gICAgInJldHVybiB0aGlzO1xuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJC5CdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXIoXG4iCi0gICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcihpbmRleCk7XG4iCi0gICAgIn1cbiIpOwotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlcihcbiIKLSAgICAiICAgIGludCBpbmRleCkge1xuIgotICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iCi0gICAgIiAgICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpOyIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2VPckJ1aWxkZXIoaW5kZXgpO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKLSAgICAiICAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXJMaXN0KCkge1xuIgotICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyAhPSBudWxsKSB7XG4iCi0gICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlckxpc3QoKTtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKCkge1xuIgotICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5hZGRCdWlsZGVyKFxuIgotICAgICIgICAgICAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKFxuIgotICAgICIgICAgaW50IGluZGV4KSB7XG4iCi0gICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmFkZEJ1aWxkZXIoXG4iCi0gICAgIiAgICAgIGluZGV4LCAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQuQnVpbGRlcj4gXG4iCi0gICAgIiAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlckxpc3QoKSB7XG4iCi0gICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmdldEJ1aWxkZXJMaXN0KCk7XG4iCi0gICAgIn1cbiIKLSAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyPFxuIgotICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKLSAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgotICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKLSAgICAiICAgICAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+KFxuIgotICAgICIgICAgICAgICAgICAkbmFtZSRfLFxuIgotICAgICIgICAgICAgICAgICAkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkLFxuIgotICAgICIgICAgICAgICAgICBnZXRQYXJlbnRGb3JDaGlsZHJlbigpLFxuIgotICAgICIgICAgICAgICAgICBpc0NsZWFuKCkpO1xuIgotICAgICIgICAgJG5hbWUkXyA9IG51bGw7XG4iCi0gICAgIiAgfVxuIgotICAgICIgIHJldHVybiAkbmFtZSRCdWlsZGVyXztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsCi0gICAgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iCi0gICAgIiRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIsCi0KLSAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gVGhlIGNvZGUgYmVsb3cgZG9lcyB0d28gb3B0aW1pemF0aW9ucyAobm9uLW5lc3RlZCBidWlsZGVyIGNhc2UpOgotICAvLyAgIDEuIElmIHRoZSBvdGhlciBsaXN0IGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIFRoaXMgZW5zdXJlcyB3ZQotICAvLyAgICAgIGRvbid0IGFsbG9jYXRlIGEgbmV3IGFycmF5IGlmIHdlIGFscmVhZHkgaGF2ZSBhbiBpbW11dGFibGUgb25lLgotICAvLyAgIDIuIElmIHRoZSBvdGhlciBsaXN0IGlzIG5vbi1lbXB0eSBhbmQgb3VyIGN1cnJlbnQgbGlzdCBpcyBlbXB0eSwgd2UgY2FuCi0gIC8vICAgICAgcmV1c2UgdGhlIG90aGVyIGxpc3Qgd2hpY2ggaXMgZ3VhcmFudGVlZCB0byBiZSBpbW11dGFibGUuCi0gIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAotICAgICJpZiAoIW90aGVyLiRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCi0gICAgIiAgaWYgKCRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCi0gICAgIiAgICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKLSAgICAiICAgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgICAkbmFtZSRfLmFkZEFsbChvdGhlci4kbmFtZSRfKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIn1cbiIsCi0KLSAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgotICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXy5pc0VtcHR5KCkpIHtcbiIKLSAgICAiICAgICRuYW1lJEJ1aWxkZXJfLmRpc3Bvc2UoKTtcbiIKLSAgICAiICAgICRuYW1lJEJ1aWxkZXJfID0gbnVsbDtcbiIKLSAgICAiICAgICRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIgotICAgICIgICAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgotICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBcbiIKLSAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLmFsd2F5c1VzZUZpZWxkQnVpbGRlcnMgP1xuIgotICAgICIgICAgICAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKSA6IG51bGw7XG4iCi0gICAgIiAgfSBlbHNlIHtcbiIKLSAgICAiICAgICRuYW1lJEJ1aWxkZXJfLmFkZEFsbE1lc3NhZ2VzKG90aGVyLiRuYW1lJF8pO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gVGhlIGNvZGUgYmVsb3cgKG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlKSBlbnN1cmVzIHRoYXQgdGhlIHJlc3VsdCBoYXMgYW4KLSAgLy8gaW1tdXRhYmxlIGxpc3QuIElmIG91ciBsaXN0IGlzIGltbXV0YWJsZSwgd2UgY2FuIGp1c3QgcmV1c2UgaXQuIElmIG5vdCwKLSAgLy8gd2UgbWFrZSBpdCBpbW11dGFibGUuCi0gIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAotICAgICJpZiAoJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgotICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKLSAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIn1cbiIKLSAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIiwKLQotICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJEJ1aWxkZXJfLmJ1aWxkKCk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkKSB7XG4iCi0gICAgIiAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PCR0eXBlJD4oKTtcbiIKLSAgICAiICAkc2V0X211dGFibGVfYml0X3BhcnNlciQ7XG4iCi0gICAgIn1cbiIpOwotCi0gIGlmIChHZXRUeXBlKGRlc2NyaXB0b3JfKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRuYW1lJF8uYWRkKGlucHV0LnJlYWRHcm91cCgkbnVtYmVyJCwgJHR5cGUkLnBhcnNlcigpLFxuIgotICAgICAgIiAgICBleHRlbnNpb25SZWdpc3RyeSkpO1xuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkbmFtZSRfLmFkZChpbnB1dC5yZWFkTWVzc2FnZSgkdHlwZSQucGFyc2VyKCksIGV4dGVuc2lvblJlZ2lzdHJ5KSk7XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKLSAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCi0gICAgIiAgb3V0cHV0LndyaXRlJGdyb3VwX29yX21lc3NhZ2UkKCRudW1iZXIkLCAkbmFtZSRfLmdldChpKSk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgotICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgotICAgICIgICAgLmNvbXB1dGUkZ3JvdXBfb3JfbWVzc2FnZSRTaXplKCRudW1iZXIkLCAkbmFtZSRfLmdldChpKSk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCi0gICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgotICAgICIgIGhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKLSAgICAiICBoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuaGFzaENvZGUoKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXN0cmluZyBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgewotICByZXR1cm4gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWE4MjI1YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfRklFTERfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfRklFTERfSF9fCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBuYW1lc3BhY2UgY29tcGlsZXIgewotICAgIG5hbWVzcGFjZSBqYXZhIHsKLSAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAvLyBjb250ZXh0LmgKLSAgICAgIGNsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAvLyBuYW1lX3Jlc29sdmVyLmgKLSAgICB9Ci0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLWNsYXNzIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKLSAgfkltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OwotICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0gIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwotICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKLSAgQ29udGV4dCogY29udGV4dF87Ci0gIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKLQotICB2b2lkIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSkgY29uc3Q7Ci0gIHZvaWQgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLCBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCi0gICAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlLAotICAgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKTsKLX07Ci0KLWNsYXNzIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yCi0gICAgOiBwdWJsaWMgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7Ci0gIH5JbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigpOwotCi0gIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKTsKLX07Ci0KLWNsYXNzIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7Ci0gIH5SZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OwotICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0gIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwotICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKLSAgQ29udGV4dCogY29udGV4dF87Ci0gIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKLQotICB2b2lkIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSkgY29uc3Q7Ci0gIHZvaWQgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLCBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCi0gICAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlLAotICAgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGphdmEKLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfTUVTU0FHRV9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2U0OTEwYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMjggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vCi0vLyBUT0RPKGtlbnRvbik6ICBTaGFyZSBjb2RlIHdpdGggdGhlIHZlcnNpb25zIG9mIHRoaXMgdGVzdCBpbiBvdGhlciBsYW5ndWFnZXM/Ci0vLyAgIEl0IHNlZW1lZCBsaWtlIHBhcmFtZXRlcml6aW5nIGl0IHdvdWxkIGFkZCBtb3JlIGNvbXBsZXhpdHkgdGhhbiBpdCBpcwotLy8gICB3b3J0aC4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGphdmEgewotbmFtZXNwYWNlIHsKLQotY2xhc3MgVGVzdEdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIFRlc3RHZW5lcmF0b3IoKSB7fQotICB+VGVzdEdlbmVyYXRvcigpIHt9Ci0KLSAgdmlydHVhbCBib29sIEdlbmVyYXRlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgewotICAgIHN0cmluZyBmaWxlbmFtZSA9ICJUZXN0LmphdmEiOwotICAgIFRyeUluc2VydChmaWxlbmFtZSwgIm91dGVyX2NsYXNzX3Njb3BlIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAiY2xhc3Nfc2NvcGU6Zm9vLkJhciIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydChmaWxlbmFtZSwgImNsYXNzX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAiYnVpbGRlcl9zY29wZTpmb28uQmFyIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KGZpbGVuYW1lLCAiYnVpbGRlcl9zY29wZTpmb28uQmFyLkJheiIsIGNvbnRleHQpOwotICAgIFRyeUluc2VydChmaWxlbmFtZSwgImVudW1fc2NvcGU6Zm9vLlF1eCIsIGNvbnRleHQpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdm9pZCBUcnlJbnNlcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCi0gICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgICBjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KGZpbGVuYW1lLCBpbnNlcnRpb25fcG9pbnQpKTsKLSAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKLSAgICBwcmludGVyLlByaW50KCIvLyBpbnNlcnRlZCAkbmFtZSRcbiIsICJuYW1lIiwgaW5zZXJ0aW9uX3BvaW50KTsKLSAgfQotfTsKLQotLy8gVGhpcyB0ZXN0IHZlcmlmaWVzIHRoYXQgYWxsIHRoZSBleHBlY3RlZCBpbnNlcnRpb24gcG9pbnRzIGV4aXN0LiAgSXQgZG9lcwotLy8gbm90IHZlcmlmeSB0aGF0IHRoZXkgYXJlIGNvcnJlY3RseS1wbGFjZWQ7IHRoYXQgd291bGQgcmVxdWlyZSBhY3R1YWxseQotLy8gY29tcGlsaW5nIHRoZSBvdXRwdXQgd2hpY2ggaXMgYSBiaXQgbW9yZSB0aGFuIEkgY2FyZSB0byBkbyBmb3IgdGhpcyB0ZXN0LgotVEVTVChKYXZhUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgewotICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb287XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gamF2YV9wYWNrYWdlID0gXCJcIjtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9IFwiVGVzdFwiO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIge1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBtZXNzYWdlIEJheiB7fVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZW51bSBRdXggeyBCTEFIID0gMTsgfVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7Ci0gIGNsaS5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKLQotICBKYXZhR2VuZXJhdG9yIGphdmFfZ2VuZXJhdG9yOwotICBUZXN0R2VuZXJhdG9yIHRlc3RfZ2VuZXJhdG9yOwotICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tamF2YV9vdXQiLCAmamF2YV9nZW5lcmF0b3IsICIiKTsKLSAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXRlc3Rfb3V0IiwgJnRlc3RfZ2VuZXJhdG9yLCAiIik7Ci0KLSAgc3RyaW5nIHByb3RvX3BhdGggPSAiLUkiICsgVGVzdFRlbXBEaXIoKTsKLSAgc3RyaW5nIGphdmFfb3V0ID0gIi0tamF2YV9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7Ci0gIHN0cmluZyB0ZXN0X291dCA9ICItLXRlc3Rfb3V0PSIgKyBUZXN0VGVtcERpcigpOwotCi0gIGNvbnN0IGNoYXIqIGFyZ3ZbXSA9IHsKLSAgICAicHJvdG9jIiwKLSAgICBwcm90b19wYXRoLmNfc3RyKCksCi0gICAgamF2YV9vdXQuY19zdHIoKSwKLSAgICB0ZXN0X291dC5jX3N0cigpLAotICAgICJ0ZXN0LnByb3RvIgotICB9OwotCi0gIEVYUEVDVF9FUSgwLCBjbGkuUnVuKDUsIGFyZ3YpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTQyZWMyOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NjAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotdXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Ci11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKLSAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKLQotICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IFByaW1pdGl2ZVR5cGVOYW1lKEdldEphdmFUeXBlKGRlc2NyaXB0b3IpKTsKLSAgKCp2YXJpYWJsZXMpWyJib3hlZF90eXBlIl0gPSBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEdldEphdmFUeXBlKGRlc2NyaXB0b3IpKTsKLSAgKCp2YXJpYWJsZXMpWyJmaWVsZF90eXBlIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXTsKLSAgKCp2YXJpYWJsZXMpWyJmaWVsZF9saXN0X3R5cGUiXSA9ICJqYXZhLnV0aWwuTGlzdDwiICsKLSAgICAgICgqdmFyaWFibGVzKVsiYm94ZWRfdHlwZSJdICsgIj4iOwotICAoKnZhcmlhYmxlcylbImVtcHR5X2xpc3QiXSA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkiOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKLSAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X2luaXQiXSA9IElzRGVmYXVsdFZhbHVlSmF2YURlZmF1bHQoZGVzY3JpcHRvcikgPwotICAgICAgIiIgOiAoIj0gIiArIEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKSk7Ci0gICgqdmFyaWFibGVzKVsiY2FwaXRhbGl6ZWRfdHlwZSJdID0KLSAgICAgIEdldENhcGl0YWxpemVkVHlwZShkZXNjcmlwdG9yLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlKTsKLSAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9IFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7Ci0gICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCi0gICAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7Ci0gIGlmIChJc1JlZmVyZW5jZVR5cGUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcikpKSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJudWxsX2NoZWNrIl0gPQotICAgICAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgotICAgICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgotICAgICAgICAiICB9XG4iOwotICB9IGVsc2UgewotICAgICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0gIiI7Ci0gIH0KLSAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAotICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKLSAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQotICAgICAgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKLSAgaW50IGZpeGVkX3NpemUgPSBGaXhlZFNpemUoR2V0VHlwZShkZXNjcmlwdG9yKSk7Ci0gIGlmIChmaXhlZF9zaXplICE9IC0xKSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJmaXhlZF9zaXplIl0gPSBTaW1wbGVJdG9hKGZpeGVkX3NpemUpOwotICB9Ci0gICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0gIm9uQ2hhbmdlZCgpOyI7Ci0KLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3ItPmZpbGUoKSkpIHsKLSAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCi0gICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOwotICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKLQotICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgIjsiLgotICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0KLSAgICAgICAgR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KSArICI7IjsKLSAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9Ci0gICAgICAgIEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7Ci0gICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9Ci0gICAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKLQotICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOwotICB9IGVsc2UgewotICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gIiI7Ci0gICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKLSAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7Ci0KLSAgICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUykgewotICAgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9Ci0gICAgICAgICAgIiEiICsgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXy5pc0VtcHR5KCkiOwotICAgIH0gZWxzZSB7Ci0gICAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0KLSAgICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfICE9ICIgKyAoKnZhcmlhYmxlcylbImRlZmF1bHQiXTsKLSAgICB9Ci0gIH0KLQotICAvLyBGb3IgcmVwYXRlZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUuCi0gICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7Ci0gICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7Ci0gICgqdmFyaWFibGVzKVsiY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOwotCi0gIC8vIEZvciByZXBlYXRlZCBmaWVsZHMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlCi0gIC8vIGluIHRoZSBwYXJzaW5nIGNvbnN0cnVjdG9yLgotICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9wYXJzZXIiXSA9Ci0gICAgICBHZW5lcmF0ZUdldEJpdE11dGFibGVMb2NhbChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9wYXJzZXIiXSA9Ci0gICAgICBHZW5lcmF0ZVNldEJpdE11dGFibGVMb2NhbChidWlsZGVyQml0SW5kZXgpOwotCi0gICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCJdID0KLSAgICAgIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7Ci0gICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwiXSA9Ci0gICAgICBHZW5lcmF0ZVNldEJpdFRvTG9jYWwobWVzc2FnZUJpdEluZGV4KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCi0gICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpLCBjb250ZXh0Xyhjb250ZXh0KSwKLSAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgewotICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCi0gICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOwotfQotCi1JbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6fkltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KLQotaW50IEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIDE7Ci19Ci0KLWludCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOwotICB9Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlICRmaWVsZF90eXBlJCAkbmFtZSRfO1xuIik7Ci0gIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSAkZmllbGRfdHlwZSQgJG5hbWUkXyAkZGVmYXVsdF9pbml0JDtcbiIpOwotCi0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgIn1cbiIpOwotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKLSAgICAiJG51bGxfY2hlY2skIgotICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgotICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOwotICBKYXZhVHlwZSB0eXBlID0gR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pOwotICBpZiAodHlwZSA9PSBKQVZBVFlQRV9TVFJJTkcgfHwgdHlwZSA9PSBKQVZBVFlQRV9CWVRFUykgewotICAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG5vdCBhIHNpbXBsZSBsaXRlcmFsIHNvIHdlIHdhbnQgdG8gYXZvaWQgZXhlY3V0aW5nCi0gICAgLy8gaXQgbXVsdGlwbGUgdGltZXMuICBJbnN0ZWFkLCBnZXQgdGhlIGRlZmF1bHQgb3V0IG9mIHRoZSBkZWZhdWx0IGluc3RhbmNlLgotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiICAkbmFtZSRfID0gZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgewotICAvLyBub29wIGZvciBwcmltaXRpdmVzCi19Ci0KLXZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIKLSAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKLSAgICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkgIT0gJGRlZmF1bHQkKSB7XG4iCi0gICAgICAiICBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCi0gICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwkO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJHNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkXG4iCi0gICAgIiRuYW1lJF8gPSBpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCk7XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBub29wIGZvciBwcmltaXRpdmVzLgotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgb3V0cHV0LndyaXRlJGNhcGl0YWxpemVkX3R5cGUkKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCi0gICAgIiAgICAuY29tcHV0ZSRjYXBpdGFsaXplZF90eXBlJFNpemUoJG51bWJlciQsICRuYW1lJF8pO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgc3dpdGNoIChHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykpIHsKLSAgICBjYXNlIEpBVkFUWVBFX0lOVDoKLSAgICBjYXNlIEpBVkFUWVBFX0xPTkc6Ci0gICAgY2FzZSBKQVZBVFlQRV9CT09MRUFOOgotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkKClcbiIKLSAgICAgICAgIiAgICA9PSBvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBKQVZBVFlQRV9GTE9BVDoKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgKFxuIgotICAgICAgICAiICAgIGphdmEubGFuZy5GbG9hdC5mbG9hdFRvSW50Qml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSlcbiIKLSAgICAgICAgIiAgICA9PSBqYXZhLmxhbmcuRmxvYXQuZmxvYXRUb0ludEJpdHMoXG4iCi0gICAgICAgICIgICAgICAgIG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSk7XG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBKQVZBVFlQRV9ET1VCTEU6Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIChcbiIKLSAgICAgICAgIiAgICBqYXZhLmxhbmcuRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpXG4iCi0gICAgICAgICIgICAgPT0gamF2YS5sYW5nLkRvdWJsZS5kb3VibGVUb0xvbmdCaXRzKFxuIgotICAgICAgICAiICAgICAgICBvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpO1xuIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgotICAgIGNhc2UgSkFWQVRZUEVfQllURVM6Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpXG4iCi0gICAgICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBKQVZBVFlQRV9FTlVNOgotICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKLSAgICBkZWZhdWx0OgotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIik7Ci0gIHN3aXRjaCAoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pKSB7Ci0gICAgY2FzZSBKQVZBVFlQRV9JTlQ6Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBKQVZBVFlQRV9MT05HOgotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuaGFzaExvbmcoXG4iCi0gICAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjoKLSAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmhhc2hCb29sZWFuKFxuIgotICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGphdmEubGFuZy5GbG9hdC5mbG9hdFRvSW50Qml0cyhcbiIKLSAgICAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBKQVZBVFlQRV9ET1VCTEU6Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5oYXNoTG9uZyhcbiIKLSAgICAgICAgIiAgICBqYXZhLmxhbmcuRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpKTtcbiIpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKLSAgICBjYXNlIEpBVkFUWVBFX0JZVEVTOgotICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmhhc2hDb2RlKCk7XG4iKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBKQVZBVFlQRV9FTlVNOgotICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKLSAgICBkZWZhdWx0OgotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi1zdHJpbmcgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQotICAgIDogSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpIHsKLSAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0KLSAgICAgIGNvbnRleHQtPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkpOwotICBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCAmdmFyaWFibGVzXyk7Ci19Ci0KLUltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotfkltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgICAgcmV0dXJuICgkYm94ZWRfdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCi0gICAgIiAgfVxuIgotICAgICIgIHJldHVybiAkZGVmYXVsdCQ7XG4iCi0gICAgIn1cbiIpOwotfQotCi0KLXZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgICAgcmV0dXJuICgkYm94ZWRfdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCi0gICAgIiAgfVxuIgotICAgICIgIHJldHVybiAkZGVmYXVsdCQ7XG4iCi0gICAgIn1cbiIpOwotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKLSAgICAiJG51bGxfY2hlY2skIgotICAgICIgICRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICAgICRjbGVhcl9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICIgICAgJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iCi0gICAgIiAgICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIHJlc3VsdC4kb25lb2ZfbmFtZSRfID0gJG9uZW9mX25hbWUkXztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICIkb25lb2ZfbmFtZSRfID0gaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpO1xuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICBvdXRwdXQud3JpdGUkY2FwaXRhbGl6ZWRfdHlwZSQoXG4iCi0gICAgIiAgICAgICRudW1iZXIkLCAoJHR5cGUkKSgoJGJveGVkX3R5cGUkKSAkb25lb2ZfbmFtZSRfKSk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgotICAgICIgICAgLmNvbXB1dGUkY2FwaXRhbGl6ZWRfdHlwZSRTaXplKFxuIgotICAgICIgICAgICAgICRudW1iZXIkLCAoJHR5cGUkKSgoJGJveGVkX3R5cGUkKSAkb25lb2ZfbmFtZSRfKSk7XG4iCi0gICAgIn1cbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKLSAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCksIGNvbnRleHRfKGNvbnRleHQpLAotICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7Ci0gIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7Ci19Ci0KLVJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotflJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7fQotCi1pbnQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOwotfQotCi0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSAkZmllbGRfbGlzdF90eXBlJCAkbmFtZSRfO1xuIik7Ci0gIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkYm94ZWRfdHlwZSQ+XG4iCi0gICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgotICAgICJ9XG4iKTsKLQotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpICYmCi0gICAgICBjb250ZXh0Xy0+SGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7XG4iKTsKLSAgfQotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBiaXQgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKLSAgLy8gbGlzdCBpcyBpbW11dGFibGUuIElmIGl0J3MgaW1tdXRhYmxlLCB0aGUgaW52YXJpYW50IGlzIHRoYXQgaXQgbXVzdAotICAvLyBlaXRoZXIgYW4gaW5zdGFuY2Ugb2YgQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkgb3IgaXQncyBhbiBBcnJheUxpc3QKLSAgLy8gd3JhcHBlZCBpbiBhIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKSB3cmFwcGVyIGFuZCBub2JvZHkgZWxzZSBoYXMKLSAgLy8gYSByZWZlcmVyZW5jZSB0byB0aGUgdW5kZXJseWluZyBBcnJheUxpc3QuIFRoaXMgaW52YXJpYW50IGFsbG93cyB1cyB0bwotICAvLyBzaGFyZSBpbnN0YW5jZXMgb2YgbGlzdHMgYmV0d2VlbiBwcm90b2NvbCBidWZmZXJzIGF2b2lkaW5nIGV4cGVuc2l2ZQotICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKLSAgLy8ganVzdCB0aGF0IHRoZSBsaXN0IGNhbm5vdCBiZSBtb2RpZmllZCB2aWEgdGhlIHJlZmVyZW5jZSBidXQgdGhhdCB0aGUKLSAgLy8gbGlzdCBjYW4gbmV2ZXIgYmUgbW9kaWZpZWQuCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgJGZpZWxkX2xpc3RfdHlwZSQgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIpOwotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgdm9pZCBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKSB7XG4iCi0gICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCi0gICAgIiAgICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8JGJveGVkX3R5cGUkPigkbmFtZSRfKTtcbiIKLSAgICAiICAgICRzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIiAgIH1cbiIKLSAgICAifVxuIik7Ci0KLSAgICAvLyBOb3RlOiAgV2UgcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjYWxsZXIKLSAgICAvLyAgIGNvdWxkIGhvbGQgb24gdG8gdGhlIHJldHVybmVkIGxpc3QgYW5kIG1vZGlmeSBpdCBhZnRlciB0aGUgbWVzc2FnZQotICAgIC8vICAgaGFzIGJlZW4gYnVpbHQsIHRodXMgbXV0YXRpbmcgdGhlIG1lc3NhZ2Ugd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUKLSAgICAvLyAgIGltbXV0YWJsZS4KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD5cbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCi0gICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgotICAgICIgICAgaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKLSAgICAiJG51bGxfY2hlY2skIgotICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZSk7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiRudWxsX2NoZWNrJCIKLSAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKLSAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZSk7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCi0gICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICRib3hlZF90eXBlJD4gdmFsdWVzKSB7XG4iCi0gICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuYWRkQWxsKFxuIgotICAgICIgICAgICB2YWx1ZXMsICRuYW1lJF8pO1xuIgotICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKLSAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7Ci0gIC8vIG5vb3AgZm9yIHByaW1pdGl2ZXMKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKLSAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIFRoZSBjb2RlIGJlbG93IGRvZXMgdHdvIG9wdGltaXphdGlvbnM6Ci0gIC8vICAgMS4gSWYgdGhlIG90aGVyIGxpc3QgaXMgZW1wdHksIHRoZXJlJ3Mgbm90aGluZyB0byBkby4gVGhpcyBlbnN1cmVzIHdlCi0gIC8vICAgICAgZG9uJ3QgYWxsb2NhdGUgYSBuZXcgYXJyYXkgaWYgd2UgYWxyZWFkeSBoYXZlIGFuIGltbXV0YWJsZSBvbmUuCi0gIC8vICAgMi4gSWYgdGhlIG90aGVyIGxpc3QgaXMgbm9uLWVtcHR5IGFuZCBvdXIgY3VycmVudCBsaXN0IGlzIGVtcHR5LCB3ZSBjYW4KLSAgLy8gICAgICByZXVzZSB0aGUgb3RoZXIgbGlzdCB3aGljaCBpcyBndWFyYW50ZWVkIHRvIGJlIGltbXV0YWJsZS4KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCFvdGhlci4kbmFtZSRfLmlzRW1wdHkoKSkge1xuIgotICAgICIgIGlmICgkbmFtZSRfLmlzRW1wdHkoKSkge1xuIgotICAgICIgICAgJG5hbWUkXyA9IG90aGVyLiRuYW1lJF87XG4iCi0gICAgIiAgICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIiAgfSBlbHNlIHtcbiIKLSAgICAiICAgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIgICAgJG5hbWUkXy5hZGRBbGwob3RoZXIuJG5hbWUkXyk7XG4iCi0gICAgIiAgfVxuIgotICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCi0gIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQpIHtcbiIKLSAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCi0gICAgIiAgJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIgotICAgICJ9XG4iCi0gICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoISRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgotICAgICIgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkYm94ZWRfdHlwZSQ+KCk7XG4iCi0gICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgotICAgICJ9XG4iCi0gICAgIiRuYW1lJF8uYWRkKGlucHV0LnJlYWQkY2FwaXRhbGl6ZWRfdHlwZSQoKSk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTtcbiIKLSAgICAiaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7XG4iCi0gICAgImlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkICYmIGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIgotICAgICIgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkYm94ZWRfdHlwZSQ+KCk7XG4iCi0gICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgotICAgICJ9XG4iCi0gICAgIndoaWxlIChpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHtcbiIKLSAgICAiICAkbmFtZSRfLmFkZChpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCkpO1xuIgotICAgICJ9XG4iCi0gICAgImlucHV0LnBvcExpbWl0KGxpbWl0KTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgotICAgICIgICRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKLSAgICAvLyBXZSBpbnZva2UgZ2V0U2VyaWFsaXplZFNpemUgaW4gd3JpdGVUbyBmb3IgbWVzc2FnZXMgdGhhdCBoYXZlIHBhY2tlZAotICAgIC8vIGZpZWxkcyBpbiBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcy4KLSAgICAvLyBUaGF0IG1ha2VzIGl0IHNhZmUgdG8gcmVseSBvbiB0aGUgbWVtb2l6ZWQgc2l6ZSBoZXJlLgotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCkgPiAwKSB7XG4iCi0gICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkdGFnJCk7XG4iCi0gICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplKTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCi0gICAgICAiICBvdXRwdXQud3JpdGUkY2FwaXRhbGl6ZWRfdHlwZSROb1RhZygkbmFtZSRfLmdldChpKSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKLSAgICAgICIgIG91dHB1dC53cml0ZSRjYXBpdGFsaXplZF90eXBlJCgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkpO1xuIgotICAgICAgIn1cbiIpOwotICB9Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJ7XG4iCi0gICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBpZiAoRml4ZWRTaXplKEdldFR5cGUoZGVzY3JpcHRvcl8pKSA9PSAtMSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCi0gICAgICAiICBkYXRhU2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCi0gICAgICAiICAgIC5jb21wdXRlJGNhcGl0YWxpemVkX3R5cGUkU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0KGkpKTtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImRhdGFTaXplID0gJGZpeGVkX3NpemUkICogZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKTtcbiIpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAic2l6ZSArPSBkYXRhU2l6ZTtcbiIpOwotCi0gIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICghZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmlzRW1wdHkoKSkge1xuIgotICAgICAgIiAgc2l6ZSArPSAkdGFnX3NpemUkO1xuIgotICAgICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCi0gICAgICAiICAgICAgLmNvbXB1dGVJbnQzMlNpemVOb1RhZyhkYXRhU2l6ZSk7XG4iCi0gICAgICAifVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJzaXplICs9ICR0YWdfc2l6ZSQgKiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpO1xuIik7Ci0gIH0KLQotICAvLyBjYWNoZSB0aGUgZGF0YSBzaXplIGZvciBwYWNrZWQgZmllbGRzLgotICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KClcbiIKLSAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpKTtcbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSA+IDApIHtcbiIKLSAgICAiICBoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCi0gICAgIiAgaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmhhc2hDb2RlKCk7XG4iCi0gICAgIn1cbiIpOwotfQotCi1zdHJpbmcgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgewotICByZXR1cm4gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQwY2QxMmQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1BSSU1JVElWRV9GSUVMRF9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfUFJJTUlUSVZFX0ZJRUxEX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgbmFtZXNwYWNlIGNvbXBpbGVyIHsKLSAgICBuYW1lc3BhY2UgamF2YSB7Ci0gICAgICBjbGFzcyBDb250ZXh0OyAgICAgICAgICAgLy8gY29udGV4dC5oCi0gICAgICBjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgLy8gbmFtZV9yZXNvbHZlci5oCi0gICAgfQotICB9Ci19Ci0KLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGphdmEgewotCi1jbGFzcyBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOwotICB+SW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKLQotICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKLSAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotCi0gIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOwotICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKLSAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87Ci0gIENvbnRleHQqIGNvbnRleHRfOwotICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcgotICAgIDogcHVibGljIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKLSAgfkltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoKTsKLQotICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKTsKLX07Ci0KLWNsYXNzIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IKLSAgICA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7Ci0gIHZpcnR1YWwgflJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKLQotICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKLSAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotICBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0gIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwotICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKLSAgQ29udGV4dCogY29udGV4dF87Ci0gIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9QUklNSVRJVkVfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTFiZmMxMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDcyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotU2VydmljZUdlbmVyYXRvcjo6U2VydmljZUdlbmVyYXRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcikKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7fQotCi1TZXJ2aWNlR2VuZXJhdG9yOjp+U2VydmljZUdlbmVyYXRvcigpIHt9Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLUltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoCi0gICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCi0gICAgOiBTZXJ2aWNlR2VuZXJhdG9yKGRlc2NyaXB0b3IpLCBjb250ZXh0Xyhjb250ZXh0KSwKLSAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkge30KLQotSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6fkltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoKSB7fQotCi12b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGJvb2wgaXNfb3duX2ZpbGUgPQotICAgIE11bHRpcGxlSmF2YUZpbGVzKGRlc2NyaXB0b3JfLT5maWxlKCksIC8qIGltbXV0YWJsZSA9ICovIHRydWUpOwotICBXcml0ZVNlcnZpY2VEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInB1YmxpYyAkc3RhdGljJCBhYnN0cmFjdCBjbGFzcyAkY2xhc3NuYW1lJFxuIgotICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2Uge1xuIiwKLSAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAotICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInByb3RlY3RlZCAkY2xhc3NuYW1lJCgpIHt9XG5cbiIsCi0gICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotCi0gIEdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOwotCi0gIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZVNlcnZpY2VNZXRob2QocHJpbnRlcik7Ci0gIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZU1ldGhvZChwcmludGVyKTsKLQotICBHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSBnZXREZXNjcmlwdG9yKCkgYW5kIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuCi0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yXG4iCi0gICAgIiAgICBnZXREZXNjcmlwdG9yKCkge1xuIgotICAgICIgIHJldHVybiAkZmlsZSQuZ2V0RGVzY3JpcHRvcigpLmdldFNlcnZpY2VzKCkuZ2V0KCRpbmRleCQpO1xuIgotICAgICJ9XG4iLAotICAgICJmaWxlIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSwKLSAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7Ci0gIEdlbmVyYXRlR2V0RGVzY3JpcHRvckZvclR5cGUocHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgbW9yZSBzdHVmZi4KLSAgR2VuZXJhdGVDYWxsTWV0aG9kKHByaW50ZXIpOwotICBHZW5lcmF0ZUdldFByb3RvdHlwZShSRVFVRVNULCBwcmludGVyKTsKLSAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUkVTUE9OU0UsIHByaW50ZXIpOwotICBHZW5lcmF0ZVN0dWIocHJpbnRlcik7Ci0gIEdlbmVyYXRlQmxvY2tpbmdTdHViKHByaW50ZXIpOwotCi0gIC8vIEFkZCBhbiBpbnNlcnRpb24gcG9pbnQuCi0gIHByaW50ZXItPlByaW50KAotICAgICJcbiIKLSAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKLSAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlR2V0RGVzY3JpcHRvckZvclR5cGUoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInB1YmxpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yXG4iCi0gICAgIiAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHtcbiIKLSAgICAiICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgicHVibGljIGludGVyZmFjZSBJbnRlcmZhY2Uge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhwcmludGVyKTsKLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU5ld1JlZmxlY3RpdmVTZXJ2aWNlTWV0aG9kKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuU2VydmljZSBuZXdSZWZsZWN0aXZlU2VydmljZShcbiIKLSAgICAiICAgIGZpbmFsIEludGVyZmFjZSBpbXBsKSB7XG4iCi0gICAgIiAgcmV0dXJuIG5ldyAkY2xhc3NuYW1lJCgpIHtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7Ci0gICAgcHJpbnRlci0+UHJpbnQoIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIpOwotICAgIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlKHByaW50ZXIsIG1ldGhvZCwgSVNfQ09OQ1JFVEUpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiB7XG4iCi0gICAgICAiICBpbXBsLiRtZXRob2QkKGNvbnRyb2xsZXIsIHJlcXVlc3QsIGRvbmUpO1xuIgotICAgICAgIn1cblxuIiwKLSAgICAgICJtZXRob2QiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCkpOwotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifTtcbiIpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZU1ldGhvZCgKLSAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nU2VydmljZVxuIgotICAgICIgICAgbmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZShmaW5hbCBCbG9ja2luZ0ludGVyZmFjZSBpbXBsKSB7XG4iCi0gICAgIiAgcmV0dXJuIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nU2VydmljZSgpIHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgR2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShwcmludGVyKTsKLQotICBHZW5lcmF0ZUNhbGxCbG9ja2luZ01ldGhvZChwcmludGVyKTsKLSAgR2VuZXJhdGVHZXRQcm90b3R5cGUoUkVRVUVTVCwgcHJpbnRlcik7Ci0gIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJFU1BPTlNFLCBwcmludGVyKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9O1xuIik7Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVBYnN0cmFjdE1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7Ci0gICAgV3JpdGVNZXRob2REb2NDb21tZW50KHByaW50ZXIsIG1ldGhvZCk7Ci0gICAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kLCBJU19BQlNUUkFDVCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoIjtcblxuIik7Ci0gIH0KLX0KLQotdm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUNhbGxNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgotICAgICJwdWJsaWMgZmluYWwgdm9pZCBjYWxsTWV0aG9kKFxuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCxcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ29udHJvbGxlciBjb250cm9sbGVyLFxuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIHJlcXVlc3QsXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NhbGxiYWNrPFxuIgotICAgICIgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2U+IGRvbmUpIHtcbiIKLSAgICAiICBpZiAobWV0aG9kLmdldFNlcnZpY2UoKSAhPSBnZXREZXNjcmlwdG9yKCkpIHtcbiIKLSAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgotICAgICIgICAgICBcIlNlcnZpY2UuY2FsbE1ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciB3cm9uZyBcIiArXG4iCi0gICAgIiAgICAgIFwic2VydmljZSB0eXBlLlwiKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgc3dpdGNoKG1ldGhvZC5nZXRJbmRleCgpKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOwotICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKLSAgICB2YXJzWyJtZXRob2QiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKTsKLSAgICB2YXJzWyJpbnB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKLSAgICAgICAgbWV0aG9kLT5pbnB1dF90eXBlKCkpOwotICAgIHZhcnNbIm91dHB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKLSAgICAgICAgbWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgImNhc2UgJGluZGV4JDpcbiIKLSAgICAgICIgIHRoaXMuJG1ldGhvZCQoY29udHJvbGxlciwgKCRpbnB1dCQpcmVxdWVzdCxcbiIKLSAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNVdGlsLjwkb3V0cHV0JD5zcGVjaWFsaXplQ2FsbGJhY2soXG4iCi0gICAgICAiICAgICAgZG9uZSkpO1xuIgotICAgICAgIiAgcmV0dXJuO1xuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiZGVmYXVsdDpcbiIKLSAgICAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkFzc2VydGlvbkVycm9yKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpO1xuIik7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgfVxuIgotICAgICJ9XG4iCi0gICAgIlxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVDYWxsQmxvY2tpbmdNZXRob2QoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgotICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIGNhbGxCbG9ja2luZ01ldGhvZChcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZSByZXF1ZXN0KVxuIgotICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuU2VydmljZUV4Y2VwdGlvbiB7XG4iCi0gICAgIiAgaWYgKG1ldGhvZC5nZXRTZXJ2aWNlKCkgIT0gZ2V0RGVzY3JpcHRvcigpKSB7XG4iCi0gICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcbiIKLSAgICAiICAgICAgXCJTZXJ2aWNlLmNhbGxCbG9ja2luZ01ldGhvZCgpIGdpdmVuIG1ldGhvZCBkZXNjcmlwdG9yIGZvciBcIiArXG4iCi0gICAgIiAgICAgIFwid3Jvbmcgc2VydmljZSB0eXBlLlwiKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgc3dpdGNoKG1ldGhvZC5nZXRJbmRleCgpKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOwotICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKLSAgICB2YXJzWyJtZXRob2QiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKTsKLSAgICB2YXJzWyJpbnB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKLSAgICAgICAgbWV0aG9kLT5pbnB1dF90eXBlKCkpOwotICAgIHZhcnNbIm91dHB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKLSAgICAgICAgbWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgImNhc2UgJGluZGV4JDpcbiIKLSAgICAgICIgIHJldHVybiBpbXBsLiRtZXRob2QkKGNvbnRyb2xsZXIsICgkaW5wdXQkKXJlcXVlc3QpO1xuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiZGVmYXVsdDpcbiIKLSAgICAiICB0aHJvdyBuZXcgamF2YS5sYW5nLkFzc2VydGlvbkVycm9yKFwiQ2FuJ3QgZ2V0IGhlcmUuXCIpO1xuIik7Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgfVxuIgotICAgICJ9XG4iCi0gICAgIlxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8qCi0gICAqIFRPRE8oY3Bvdmlyayk6IFRoZSBleGNlcHRpb24gbWVzc2FnZSBzYXlzICJTZXJ2aWNlLmZvbyIgd2hlbiBpdCBtYXkgYmUKLSAgICogIkJsb2NraW5nU2VydmljZS5mb28uIiAgQ29uc2lkZXIgZml4aW5nLgotICAgKi8KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgInB1YmxpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VcbiIKLSAgICAiICAgIGdldCRyZXF1ZXN0X29yX3Jlc3BvbnNlJFByb3RvdHlwZShcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpIHtcbiIKLSAgICAiICBpZiAobWV0aG9kLmdldFNlcnZpY2UoKSAhPSBnZXREZXNjcmlwdG9yKCkpIHtcbiIKLSAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgotICAgICIgICAgICBcIlNlcnZpY2UuZ2V0JHJlcXVlc3Rfb3JfcmVzcG9uc2UkUHJvdG90eXBlKCkgZ2l2ZW4gbWV0aG9kIFwiICtcbiIKLSAgICAiICAgICAgXCJkZXNjcmlwdG9yIGZvciB3cm9uZyBzZXJ2aWNlIHR5cGUuXCIpO1xuIgotICAgICIgIH1cbiIKLSAgICAiICBzd2l0Y2gobWV0aG9kLmdldEluZGV4KCkpIHtcbiIsCi0gICAgInJlcXVlc3Rfb3JfcmVzcG9uc2UiLCAod2hpY2ggPT0gUkVRVUVTVCkgPyAiUmVxdWVzdCIgOiAiUmVzcG9uc2UiKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm1ldGhvZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOwotICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKLSAgICB2YXJzWyJ0eXBlIl0gPSBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKAotICAgICAgKHdoaWNoID09IFJFUVVFU1QpID8gbWV0aG9kLT5pbnB1dF90eXBlKCkgOiBtZXRob2QtPm91dHB1dF90eXBlKCkpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiY2FzZSAkaW5kZXgkOlxuIgotICAgICAgIiAgcmV0dXJuICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImRlZmF1bHQ6XG4iCi0gICAgIiAgdGhyb3cgbmV3IGphdmEubGFuZy5Bc3NlcnRpb25FcnJvcihcIkNhbid0IGdldCBoZXJlLlwiKTtcbiIpOwotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICIgIH1cbiIKLSAgICAifVxuIgotICAgICJcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIHN0YXRpYyBTdHViIG5ld1N0dWIoXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NoYW5uZWwgY2hhbm5lbCkge1xuIgotICAgICIgIHJldHVybiBuZXcgU3R1YihjaGFubmVsKTtcbiIKLSAgICAifVxuIgotICAgICJcbiIKLSAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHViIGV4dGVuZHMgJGNsYXNzbmFtZSQgaW1wbGVtZW50cyBJbnRlcmZhY2UgeyIKLSAgICAiXG4iLAotICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJwcml2YXRlIFN0dWIoY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKLSAgICAiICB0aGlzLmNoYW5uZWwgPSBjaGFubmVsO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIgotICAgICJwcml2YXRlIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2hhbm5lbCBjaGFubmVsO1xuIgotICAgICJcbiIKLSAgICAicHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2hhbm5lbCBnZXRDaGFubmVsKCkge1xuIgotICAgICIgIHJldHVybiBjaGFubmVsO1xuIgotICAgICJ9XG4iKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5tZXRob2RfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvcl8tPm1ldGhvZChpKTsKLSAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgICBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QsIElTX0NPTkNSRVRFKTsKLSAgICBwcmludGVyLT5QcmludCgiIHtcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotCi0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOwotICAgIHZhcnNbIm91dHB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKLSAgICAgICAgbWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgImNoYW5uZWwuY2FsbE1ldGhvZChcbiIKLSAgICAgICIgIGdldERlc2NyaXB0b3IoKS5nZXRNZXRob2RzKCkuZ2V0KCRpbmRleCQpLFxuIgotICAgICAgIiAgY29udHJvbGxlcixcbiIKLSAgICAgICIgIHJlcXVlc3QsXG4iCi0gICAgICAiICAkb3V0cHV0JC5nZXREZWZhdWx0SW5zdGFuY2UoKSxcbiIKLSAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjVXRpbC5nZW5lcmFsaXplQ2FsbGJhY2soXG4iCi0gICAgICAiICAgIGRvbmUsXG4iCi0gICAgICAiICAgICRvdXRwdXQkLmNsYXNzLFxuIgotICAgICAgIiAgICAkb3V0cHV0JC5nZXREZWZhdWx0SW5zdGFuY2UoKSkpO1xuIik7Ci0KLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwotICB9Ci0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgKLSAgICAifVxuIgotICAgICJcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQmxvY2tpbmdTdHViKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgc3RhdGljIEJsb2NraW5nSW50ZXJmYWNlIG5ld0Jsb2NraW5nU3R1YihcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQmxvY2tpbmdScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKLSAgICAiICByZXR1cm4gbmV3IEJsb2NraW5nU3R1YihjaGFubmVsKTtcbiIKLSAgICAifVxuIgotICAgICJcbiIpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJwdWJsaWMgaW50ZXJmYWNlIEJsb2NraW5nSW50ZXJmYWNlIHsiKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7Ci0gICAgR2VuZXJhdGVCbG9ja2luZ01ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QpOwotICAgIHByaW50ZXItPlByaW50KCI7XG4iKTsKLSAgfQotCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIKLSAgICAiXG4iKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgQmxvY2tpbmdTdHViIGltcGxlbWVudHMgQmxvY2tpbmdJbnRlcmZhY2Uge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIHByaW50ZXItPlByaW50KAotICAgICJwcml2YXRlIEJsb2NraW5nU3R1Yihjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nUnBjQ2hhbm5lbCBjaGFubmVsKSB7XG4iCi0gICAgIiAgdGhpcy5jaGFubmVsID0gY2hhbm5lbDtcbiIKLSAgICAifVxuIgotICAgICJcbiIKLSAgICAicHJpdmF0ZSBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nUnBjQ2hhbm5lbCBjaGFubmVsO1xuIik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7Ci0gICAgR2VuZXJhdGVCbG9ja2luZ01ldGhvZFNpZ25hdHVyZShwcmludGVyLCBtZXRob2QpOwotICAgIHByaW50ZXItPlByaW50KCIge1xuIik7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7Ci0gICAgdmFyc1sib3V0cHV0Il0gPSBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKAotICAgICAgICBtZXRob2QtPm91dHB1dF90eXBlKCkpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAicmV0dXJuICgkb3V0cHV0JCkgY2hhbm5lbC5jYWxsQmxvY2tpbmdNZXRob2QoXG4iCi0gICAgICAiICBnZXREZXNjcmlwdG9yKCkuZ2V0TWV0aG9kcygpLmdldCgkaW5kZXgkKSxcbiIKLSAgICAgICIgIGNvbnRyb2xsZXIsXG4iCi0gICAgICAiICByZXF1ZXN0LFxuIgotICAgICAgIiAgJG91dHB1dCQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIik7Ci0KLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAifVxuIgotICAgICAgIlxuIik7Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0Fic3RyYWN0IGlzX2Fic3RyYWN0KSB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1sibmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpOwotICB2YXJzWyJpbnB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7Ci0gIHZhcnNbIm91dHB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOwotICB2YXJzWyJhYnN0cmFjdCJdID0gKGlzX2Fic3RyYWN0ID09IElTX0FCU1RSQUNUKSA/ICJhYnN0cmFjdCIgOiAiIjsKLSAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAicHVibGljICRhYnN0cmFjdCQgdm9pZCAkbmFtZSQoXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlJwY0NvbnRyb2xsZXIgY29udHJvbGxlcixcbiIKLSAgICAiICAgICRpbnB1dCQgcmVxdWVzdCxcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ2FsbGJhY2s8JG91dHB1dCQ+IGRvbmUpIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVCbG9ja2luZ01ldGhvZFNpZ25hdHVyZSgKLSAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICB2YXJzWyJtZXRob2QiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UobWV0aG9kKTsKLSAgdmFyc1siaW5wdXQiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOwotICB2YXJzWyJvdXRwdXQiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKLSAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAiXG4iCi0gICAgInB1YmxpYyAkb3V0cHV0JCAkbWV0aG9kJChcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuUnBjQ29udHJvbGxlciBjb250cm9sbGVyLFxuIgotICAgICIgICAgJGlucHV0JCByZXF1ZXN0KVxuIgotICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuU2VydmljZUV4Y2VwdGlvbiIpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjcwN2U4Mi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMzUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NFUlZJQ0VfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX1NFUlZJQ0VfSF9fCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBuYW1lc3BhY2UgY29tcGlsZXIgewotICAgIG5hbWVzcGFjZSBqYXZhIHsKLSAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCi0gICAgICBjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAotICAgIH0KLSAgfQotICBuYW1lc3BhY2UgaW8gewotICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgICAvLyBwcmludGVyLmgKLSAgfQotfQotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLW5hbWVzcGFjZSBqYXZhIHsKLQotY2xhc3MgU2VydmljZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLSAgdmlydHVhbCB+U2VydmljZUdlbmVyYXRvcigpOwotCi0gIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgPSAwOwotCi0gIGVudW0gUmVxdWVzdE9yUmVzcG9uc2UgeyBSRVFVRVNULCBSRVNQT05TRSB9OwotICBlbnVtIElzQWJzdHJhY3QgeyBJU19BQlNUUkFDVCwgSVNfQ09OQ1JFVEUgfTsKLQotIHByb3RlY3RlZDoKLSAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNlcnZpY2VHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvciA6IHB1YmxpYyBTZXJ2aWNlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7Ci0gIHZpcnR1YWwgfkltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoKTsKLQotICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gcHJpdmF0ZToKLQotICAvLyBHZW5lcmF0ZSB0aGUgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSBtZXRob2QuCi0gIHZvaWQgR2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgYSBKYXZhIGludGVyZmFjZSBmb3IgdGhlIHNlcnZpY2UuCi0gIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIG5ld1JlZmxlY3RpdmVTZXJ2aWNlKCkgbWV0aG9kLgotICB2b2lkIEdlbmVyYXRlTmV3UmVmbGVjdGl2ZVNlcnZpY2VNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIG5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2UoKSBtZXRob2QuCi0gIHZvaWQgR2VuZXJhdGVOZXdSZWZsZWN0aXZlQmxvY2tpbmdTZXJ2aWNlTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKTsKLQotICAvLyBHZW5lcmF0ZSBhYnN0cmFjdCBtZXRob2QgZGVjbGFyYXRpb25zIGZvciBhbGwgbWV0aG9kcy4KLSAgdm9pZCBHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIFNlcnZpY2UuY2FsbE1ldGhvZCgpLgotICB2b2lkIEdlbmVyYXRlQ2FsbE1ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9uIG9mIEJsb2NraW5nU2VydmljZS5jYWxsQmxvY2tpbmdNZXRob2QoKS4KLSAgdm9pZCBHZW5lcmF0ZUNhbGxCbG9ja2luZ01ldGhvZChpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGltcGxlbWVudGF0aW9ucyBvZiBTZXJ2aWNlLmdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpLgotICB2b2lkIEdlbmVyYXRlR2V0UHJvdG90eXBlKFJlcXVlc3RPclJlc3BvbnNlIHdoaWNoLCBpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgYSBzdHViIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgotICB2b2lkIEdlbmVyYXRlU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0KLSAgLy8gR2VuZXJhdGUgYSBtZXRob2Qgc2lnbmF0dXJlLCBwb3NzaWJseSBhYnN0cmFjdCwgd2l0aG91dCBib2R5IG9yIHRyYWlsaW5nCi0gIC8vIHNlbWljb2xvbi4KLSAgdm9pZCBHZW5lcmF0ZU1ldGhvZFNpZ25hdHVyZShpbzo6UHJpbnRlciogcHJpbnRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSXNBYnN0cmFjdCBpc19hYnN0cmFjdCk7Ci0KLSAgLy8gR2VuZXJhdGUgYSBibG9ja2luZyBzdHViIGludGVyZmFjZSBhbmQgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCi0gIHZvaWQgR2VuZXJhdGVCbG9ja2luZ1N0dWIoaW86OlByaW50ZXIqIHByaW50ZXIpOwotCi0gIC8vIEdlbmVyYXRlIHRoZSBtZXRob2Qgc2lnbmF0dXJlIGZvciBvbmUgbWV0aG9kIG9mIGEgYmxvY2tpbmcgc3R1Yi4KLSAgdm9pZCBHZW5lcmF0ZUJsb2NraW5nTWV0aG9kU2lnbmF0dXJlKGlvOjpQcmludGVyKiBwcmludGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKTsKLQotICBDb250ZXh0KiBjb250ZXh0XzsKLSAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOwotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotI2VuZGlmICAvLyBORVRfUFJPVE8yX0NPTVBJTEVSX0pBVkFfU0VSVklDRV9IX18KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjY3ZWViNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5OTcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIGphdmEgewotCi11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKLXVzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKLQotbmFtZXNwYWNlIHsKLQotdm9pZCBTZXRQcmltaXRpdmVWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgewotICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCB2YXJpYWJsZXMpOwotCi0gICgqdmFyaWFibGVzKVsiZW1wdHlfbGlzdCJdID0gImNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0FycmF5TGlzdC5FTVBUWSI7Ci0KLSAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcik7Ci0gICgqdmFyaWFibGVzKVsiZGVmYXVsdF9pbml0Il0gPQotICAgICAgIj0gIiArIEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKLSAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF90eXBlIl0gPSAiU3RyaW5nIjsKLSAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9IFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7Ci0gICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCi0gICAgICBXaXJlRm9ybWF0OjpUYWdTaXplKGRlc2NyaXB0b3ItPm51bWJlcigpLCBHZXRUeXBlKGRlc2NyaXB0b3IpKSk7Ci0gICgqdmFyaWFibGVzKVsibnVsbF9jaGVjayJdID0KLSAgICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCi0gICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgotICAgICAgIiAgfVxuIjsKLSAgKCp2YXJpYWJsZXMpWyJ3cml0ZVN0cmluZyJdID0KLSAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2Uud3JpdGVTdHJpbmciOwotICAoKnZhcmlhYmxlcylbImNvbXB1dGVTdHJpbmdTaXplIl0gPQotICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5jb21wdXRlU3RyaW5nU2l6ZSI7Ci0KLSAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAotICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKLSAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQotICAgICAgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKLSAgKCp2YXJpYWJsZXMpWyJvbl9jaGFuZ2VkIl0gPSAib25DaGFuZ2VkKCk7IjsKLQotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvci0+ZmlsZSgpKSkgewotICAgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KLSAgICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7Ci0gICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwotCi0gICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCi0gICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQotICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOwotICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KLSAgICAgICAgR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKLSAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KLSAgICAgICAgR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpICsgIjsiOwotCi0gICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7Ci0gIH0gZWxzZSB7Ci0gICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSAiIjsKLSAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9ICIiOwotICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKLQotICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQotICAgICAgICAiIWdldCIgKyAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSArICJCeXRlcygpLmlzRW1wdHkoKSI7Ci0gIH0KLQotICAvLyBGb3IgcmVwZWF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgotICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKLQotICAvLyBGb3IgcmVwZWF0ZWQgZmllbGRzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZQotICAvLyBpbiB0aGUgcGFyc2luZyBjb25zdHJ1Y3Rvci4KLSAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQotICAgICAgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQotICAgICAgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKLQotICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9Ci0gICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQotICAgICAgR2VuZXJhdGVTZXRCaXRUb0xvY2FsKG1lc3NhZ2VCaXRJbmRleCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAotICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSwgY29udGV4dF8oY29udGV4dCksCi0gICAgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpIHsKLSAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8sICZ2YXJpYWJsZXNfKTsKLX0KLQotSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6On5JbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLWludCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAxOwotfQotCi1pbnQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgewotICByZXR1cm4gMTsKLX0KLQotLy8gQSBub3RlIGFib3V0IGhvdyBzdHJpbmdzIGFyZSBoYW5kbGVkLiBUaGlzIGNvZGUgdXNlZCB0byBqdXN0IHN0b3JlIGEgU3RyaW5nCi0vLyBpbiB0aGUgTWVzc2FnZS4gVGhpcyBoYWQgdHdvIGlzc3VlczoKLS8vCi0vLyAgMS4gSXQgd291bGRuJ3Qgcm91bmR0cmlwIGJ5dGUgYXJyYXlzIHRoYXQgd2VyZSBub3QgdmFpZCBVVEYtOCBlbmNvZGVkCi0vLyAgICAgc3RyaW5ncywgYnV0IHJhdGhlciBmaWVsZHMgdGhhdCB3ZXJlIHJhdyBieXRlcyBpbmNvcnJlY3RseSBtYXJrZWQKLS8vICAgICBhcyBzdHJpbmdzIGluIHRoZSBwcm90byBmaWxlLiBUaGlzIGlzIGNvbW1vbiBiZWNhdXNlIGluIHRoZSBwcm90bzEKLS8vICAgICBzeW50YXgsIHN0cmluZyB3YXMgdGhlIHdheSB0byBpbmRpY2F0ZSBieXRlcyBhbmQgQysrIGVuZ2luZWVycyBjYW4KLS8vICAgICBlYXNpbHkgbWFrZSB0aGlzIG1pc3Rha2Ugd2l0aG91dCBhZmZlY3RpbmcgdGhlIEMrKyBBUEkuIEJ5IGNvbnZlcnRpbmcgdG8KLS8vICAgICBzdHJpbmdzIGltbWVkaWF0ZWx5LCBzb21lIGphdmEgY29kZSBtaWdodCBjb3JydXB0IHRoZXNlIGJ5dGUgYXJyYXlzIGFzCi0vLyAgICAgaXQgcGFzc2VzIHRocm91Z2ggYSBqYXZhIHNlcnZlciBldmVuIGlmIHRoZSBmaWVsZCB3YXMgbmV2ZXIgYWNjZXNzZWQgYnkKLS8vICAgICBhcHBsaWNhdGlvbiBjb2RlLgotLy8KLS8vICAyLiBUaGVyZSdzIGEgcGVyZm9ybWFuY2UgaGl0IHRvIGNvbnZlcnRpbmcgYmV0d2VlbiBieXRlcyBhbmQgc3RyaW5ncyBhbmQKLS8vICAgICBpdCBtYW55IGNhc2VzLCB0aGUgZmllbGQgaXMgbmV2ZXIgZXZlbiByZWFkIGJ5IHRoZSBhcHBsaWNhdGlvbiBjb2RlLiBUaGlzCi0vLyAgICAgYXZvaWRzIHVubmVjZXNzYXJ5IGNvbnZlcnNpb25zIGluIHRoZSBjb21tb24gdXNlIGNhc2VzLgotLy8KLS8vIFNvIG5vdywgdGhlIGZpZWxkIGZvciBTdHJpbmcgaXMgbWFpbnRhaW5lZCBhcyBhbiBPYmplY3QgcmVmZXJlbmNlIHdoaWNoIGNhbgotLy8gZWl0aGVyIHN0b3JlIGEgU3RyaW5nIG9yIGEgQnl0ZVN0cmluZy4gVGhlIGNvZGUgdXNlcyBhbiBpbnN0YW5jZW9mIGNoZWNrCi0vLyB0byBzZWUgd2hpY2ggb25lIGl0IGhhcyBhbmQgY29udmVydHMgdG8gdGhlIG90aGVyIG9uZSBpZiBuZWVkZWQuIEl0IHJlbWVtYmVycwotLy8gdGhlIGxhc3QgdmFsdWUgcmVxdWVzdGVkIChpbiBhIHRocmVhZCBzYWZlIG1hbm5lcikgYXMgdGhpcyBpcyBtb3N0IGxpa2VseQotLy8gdGhlIG9uZSBuZWVkZWQgbmV4dC4gVGhlIHRocmVhZCBzYWZldHkgaXMgc3VjaCB0aGF0IGlmIHR3byB0aHJlYWRzIGJvdGgKLS8vIGNvbnZlcnQgdGhlIGZpZWxkIGJlY2F1c2UgdGhlIGNoYW5nZXMgbWFkZSBieSBlYWNoIHRocmVhZCB3ZXJlIG5vdCB2aXNpYmxlIHRvCi0vLyB0aGUgb3RoZXIsIHRoZXkgbWF5IGNhdXNlIGEgY29udmVyc2lvbiB0byBoYXBwZW4gbW9yZSB0aW1lcyB0aGFuIHdvdWxkCi0vLyBvdGhlcndpc2UgYmUgbmVjZXNzYXJ5LiBUaGlzIHdhcyBkZWVtZWQgYmV0dGVyIHRoYW4gYWRkaW5nIHN5bmNocm9uaXphdGlvbgotLy8gb3ZlcmhlYWQuIEl0IHdpbGwgbm90IGNhdXNlIGFueSBjb3JydXB0aW9uIGlzc3VlcyBvciBhZmZlY3QgdGhlIGJlaGF2aW9yIG9mCi0vLyB0aGUgQVBJLiBUaGUgaW5zdGFuY2VvZiBjaGVjayBpcyBhbHNvIGhpZ2hseSBvcHRpbWl6ZWQgaW4gdGhlIEpWTSBhbmQgd2UKLS8vIGRlY2lkZWQgaXQgd2FzIGJldHRlciB0byByZWR1Y2UgdGhlIG1lbW9yeSBvdmVyaGVhZCBieSBub3QgaGF2aW5nIHR3bwotLy8gc2VwYXJhdGUgZmllbGRzIGJ1dCByYXRoZXIgdXNlIGR5bmFtaWMgdHlwZSBjaGVja2luZy4KLS8vCi0vLyBGb3Igc2luZ2xlIGZpZWxkcywgdGhlIGxvZ2ljIGZvciB0aGlzIGlzIGRvbmUgaW5zaWRlIHRoZSBnZW5lcmF0ZWQgY29kZS4gRm9yCi0vLyByZXBlYXRlZCBmaWVsZHMsIHRoZSBsb2dpYyBpcyBkb25lIGluIExhenlTdHJpbmdBcnJheUxpc3QgYW5kCi0vLyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdC4KLXZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7Ci0gIH0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKCk7XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSB2b2xhdGlsZSBqYXZhLmxhbmcuT2JqZWN0ICRuYW1lJF87XG4iKTsKLSAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKLQotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9ICRuYW1lJF87XG4iCi0gICAgIiAgaWYgKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpIHtcbiIKLSAgICAiICAgIHJldHVybiAoamF2YS5sYW5nLlN0cmluZykgcmVmO1xuIgotICAgICIgIH0gZWxzZSB7XG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPSBcbiIKLSAgICAiICAgICAgICAoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSByZWY7XG4iCi0gICAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIik7Ci0gIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIgICAgJG5hbWUkXyA9IHM7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSkge1xuIgotICAgICAgIiAgICAgICRuYW1lJF8gPSBzO1xuIgotICAgICAgIiAgICB9XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIgICAgcmV0dXJuIHM7XG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgotICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSB7XG4iCi0gICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgPSAkbmFtZSRfO1xuIgotICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSB7XG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYiA9IFxuIgotICAgICIgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoXG4iCi0gICAgIiAgICAgICAgICAgIChqYXZhLmxhbmcuU3RyaW5nKSByZWYpO1xuIgotICAgICIgICAgJG5hbWUkXyA9IGI7XG4iCi0gICAgIiAgICByZXR1cm4gYjtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgcmV0dXJuIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKLSAgICAiICB9XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0ICRuYW1lJF8gJGRlZmF1bHRfaW5pdCQ7XG4iKTsKLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgPSAkbmFtZSRfO1xuIgotICAgICIgIGlmICghKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpKSB7XG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPVxuIgotICAgICIgICAgICAgIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKLSAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIik7Ci0gIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIgICAgJG5hbWUkXyA9IHM7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSkge1xuIgotICAgICAgIiAgICAgICRuYW1lJF8gPSBzO1xuIgotICAgICAgIiAgICB9XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIgICAgcmV0dXJuIHM7XG4iCi0gICAgIiAgfSBlbHNlIHtcbiIKLSAgICAiICAgIHJldHVybiAoamF2YS5sYW5nLlN0cmluZykgcmVmO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgotICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSB7XG4iCi0gICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgPSAkbmFtZSRfO1xuIgotICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBiID0gXG4iCi0gICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChcbiIKLSAgICAiICAgICAgICAgICAgKGphdmEubGFuZy5TdHJpbmcpIHJlZik7XG4iCi0gICAgIiAgICAkbmFtZSRfID0gYjtcbiIKLSAgICAiICAgIHJldHVybiBiO1xuIgotICAgICIgIH0gZWxzZSB7XG4iCi0gICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgotICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgotICAgICIkbnVsbF9jaGVjayQiCi0gICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCi0gICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgotICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOwotICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvIGF2b2lkIGV4ZWN1dGluZwotICAvLyBpdCBtdWx0aXBsZSB0aW1lcy4gIEluc3RlYWQsIGdldCB0aGUgZGVmYXVsdCBvdXQgb2YgdGhlIGRlZmF1bHQgaW5zdGFuY2UuCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiAgJG5hbWUkXyA9IGdldERlZmF1bHRJbnN0YW5jZSgpLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKFxuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCi0gICAgIiRudWxsX2NoZWNrJCIpOwotICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiICBjaGVja0J5dGVTdHJpbmdJc1V0ZjgodmFsdWUpO1xuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKLSAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgewotICAvLyBub29wIGZvciBwcmltaXRpdmVzCi19Ci0KLXZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKLX0KLQotdm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIKLSAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgLy8gQWxsb3cgYSBzbGlnaHQgYnJlYWNoIG9mIGFic3RyYWN0aW9uIGhlcmUgaW4gb3JkZXIgdG8gYXZvaWQgZm9yY2luZwotICAgIC8vIGFsbCBzdHJpbmcgZmllbGRzIHRvIFN0cmluZ3Mgd2hlbiBjb3B5aW5nIGZpZWxkcyBmcm9tIGEgTWVzc2FnZS4KLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgotICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCi0gICAgICAiICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKLSAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKCFvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5pc0VtcHR5KCkpIHtcbiIKLSAgICAgICIgICRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIgotICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgICAifVxuIik7Ci0gIH0KLX0KLQotdm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCQpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCQ7XG4iCi0gICAgICAifVxuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRfO1xuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiamF2YS5sYW5nLlN0cmluZyBzID0gaW5wdXQucmVhZFN0cmluZ1JlcXVpcmVVdGY4KCk7XG4iCi0gICAgICAiJHNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkXG4iCi0gICAgICAiJG5hbWUkXyA9IHM7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IGlucHV0LnJlYWRCeXRlcygpO1xuIgotICAgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgotICAgICAgIiRuYW1lJF8gPSBicztcbiIpOwotICB9Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gbm9vcCBmb3Igc3RyaW5ncy4KLX0KLQotdm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgotICAgICIgICR3cml0ZVN0cmluZyQob3V0cHV0LCAkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgotICAgICIgIHNpemUgKz0gJGNvbXB1dGVTdHJpbmdTaXplJCgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkKClcbiIKLSAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkuaGFzaENvZGUoKTtcbiIpOwotfQotCi1zdHJpbmcgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjoKLUltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQotICAgIDogSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpIHsKLSAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0KLSAgICAgIGNvbnRleHQtPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkpOwotICBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCAmdmFyaWFibGVzXyk7Ci19Ci0KLUltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotfkltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQotCi12b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7Ci0KLSAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICJ9XG4iKTsKLSAgfQotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiAkZGVmYXVsdF9pbml0JDtcbiIKLSAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgICByZWYgPSAkb25lb2ZfbmFtZSRfO1xuIgotICAgICIgIH1cbiIKLSAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykge1xuIgotICAgICIgICAgcmV0dXJuIChqYXZhLmxhbmcuU3RyaW5nKSByZWY7XG4iCi0gICAgIiAgfSBlbHNlIHtcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IFxuIgotICAgICIgICAgICAgIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKLSAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIik7Ci0gIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICAgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICAgICAgJG9uZW9mX25hbWUkXyA9IHM7XG4iCi0gICAgIiAgICB9XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIgICAgaWYgKGJzLmlzVmFsaWRVdGY4KCkgJiYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkpIHtcbiIKLSAgICAiICAgICAgJG9uZW9mX25hbWUkXyA9IHM7XG4iCi0gICAgIiAgICB9XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIgICAgcmV0dXJuIHM7XG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCi0gICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpIHtcbiIKLSAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiAkZGVmYXVsdF9pbml0JDtcbiIKLSAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgICByZWYgPSAkb25lb2ZfbmFtZSRfO1xuIgotICAgICIgIH1cbiIKLSAgICAiICBpZiAocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykge1xuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGIgPSBcbiIKLSAgICAiICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcuY29weUZyb21VdGY4KFxuIgotICAgICIgICAgICAgICAgICAoamF2YS5sYW5nLlN0cmluZykgcmVmKTtcbiIKLSAgICAiICAgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICAgICAgJG9uZW9mX25hbWUkXyA9IGI7XG4iCi0gICAgIiAgICB9XG4iCi0gICAgIiAgICByZXR1cm4gYjtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgcmV0dXJuIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKLSAgICAiICB9XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiAkZGVmYXVsdF9pbml0JDtcbiIKLSAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgICByZWYgPSAkb25lb2ZfbmFtZSRfO1xuIgotICAgICIgIH1cbiIKLSAgICAiICBpZiAoIShyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSkge1xuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGJzID1cbiIKLSAgICAiICAgICAgICAoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSByZWY7XG4iCi0gICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHMgPSBicy50b1N0cmluZ1V0ZjgoKTtcbiIKLSAgICAiICAgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIpOwotICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiICAgICAgJG9uZW9mX25hbWUkXyA9IHM7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgICAgIGlmIChicy5pc1ZhbGlkVXRmOCgpKSB7XG4iCi0gICAgICAiICAgICAgICAkb25lb2ZfbmFtZSRfID0gcztcbiIKLSAgICAgICIgICAgICB9XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIgICAgfVxuIgotICAgICIgICAgcmV0dXJuIHM7XG4iCi0gICAgIiAgfSBlbHNlIHtcbiIKLSAgICAiICAgIHJldHVybiAoamF2YS5sYW5nLlN0cmluZykgcmVmO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgotICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSB7XG4iCi0gICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgJGRlZmF1bHRfaW5pdCQ7XG4iCi0gICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgICAgcmVmID0gJG9uZW9mX25hbWUkXztcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgaWYgKHJlZiBpbnN0YW5jZW9mIFN0cmluZykge1xuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGIgPSBcbiIKLSAgICAiICAgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcuY29weUZyb21VdGY4KFxuIgotICAgICIgICAgICAgICAgICAoamF2YS5sYW5nLlN0cmluZykgcmVmKTtcbiIKLSAgICAiICAgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKLSAgICAiICAgICAgJG9uZW9mX25hbWUkXyA9IGI7XG4iCi0gICAgIiAgICB9XG4iCi0gICAgIiAgICByZXR1cm4gYjtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgcmV0dXJuIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKLSAgICAiICB9XG4iCi0gICAgIn1cbiIpOwotCi0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKLSAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKLSAgICAiJG51bGxfY2hlY2skIgotICAgICIgICRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgICAkY2xlYXJfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgotICAgICIgICAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgfVxuIgotICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iKTsKLQotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhcbiIKLSAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyB2YWx1ZSkge1xuIgotICAgICIkbnVsbF9jaGVjayQiKTsKLSAgaWYgKENoZWNrVXRmOChkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgY2hlY2tCeXRlU3RyaW5nSXNVdGY4KHZhbHVlKTtcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgotICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZTtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIC8vIEFsbG93IGEgc2xpZ2h0IGJyZWFjaCBvZiBhYnN0cmFjdGlvbiBoZXJlIGluIG9yZGVyIHRvIGF2b2lkIGZvcmNpbmcKLSAgLy8gYWxsIHN0cmluZyBmaWVsZHMgdG8gU3RyaW5ncyB3aGVuIGNvcHlpbmcgZmllbGRzIGZyb20gYSBNZXNzYWdlLgotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgIiRvbmVvZl9uYW1lJF8gPSBvdGhlci4kb25lb2ZfbmFtZSRfO1xuIgotICAgICIkb25fY2hhbmdlZCRcbiIpOwotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgotICAgICIgIHJlc3VsdC4kb25lb2ZfbmFtZSRfID0gJG9uZW9mX25hbWUkXztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJqYXZhLmxhbmcuU3RyaW5nIHMgPSBpbnB1dC5yZWFkU3RyaW5nUmVxdWlyZVV0ZjgoKTtcbiIKLSAgICAgICIkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCi0gICAgICAiJG9uZW9mX25hbWUkXyA9IHM7XG4iKTsKLSAgfSBlbHNlIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IGlucHV0LnJlYWRCeXRlcygpO1xuIgotICAgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKLSAgICAgICIkb25lb2ZfbmFtZSRfID0gYnM7XG4iKTsKLSAgfQotfQotCi12b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgJHdyaXRlU3RyaW5nJChvdXRwdXQsICRudW1iZXIkLCAkb25lb2ZfbmFtZSRfKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgc2l6ZSArPSAkY29tcHV0ZVN0cmluZ1NpemUkKCRudW1iZXIkLCAkb25lb2ZfbmFtZSRfKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1SZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAotICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSwgY29udGV4dF8oY29udGV4dCksCi0gICAgbmFtZV9yZXNvbHZlcl8oY29udGV4dC0+R2V0TmFtZVJlc29sdmVyKCkpIHsKLSAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dC0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8sICZ2YXJpYWJsZXNfKTsKLX0KLQotUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1+UmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9Ci0KLWludCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIDA7Ci19Ci0KLWludCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKLSAgcmV0dXJuIDE7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kY29tLmdvb2dsZS5wcm90b2J1Zi5Qcm90b2NvbFN0cmluZ0xpc3RcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgotICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoaW50IGluZGV4KTtcbiIpOwotfQotCi0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLkxhenlTdHJpbmdMaXN0ICRuYW1lJF87XG4iKTsKLSAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuUHJvdG9jb2xTdHJpbmdMaXN0XG4iCi0gICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKLSAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKGludCBpbmRleCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfLmdldEJ5dGVTdHJpbmcoaW5kZXgpO1xuIgotICAgICJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gT25lIGZpZWxkIGlzIHRoZSBsaXN0IGFuZCB0aGUgYml0IGZpZWxkIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlCi0gIC8vIGxpc3QgaXMgaW1tdXRhYmxlLiBJZiBpdCdzIGltbXV0YWJsZSwgdGhlIGludmFyaWFudCBpcyB0aGF0IGl0IG11c3QKLSAgLy8gZWl0aGVyIGFuIGluc3RhbmNlIG9mIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpIG9yIGl0J3MgYW4gQXJyYXlMaXN0Ci0gIC8vIHdyYXBwZWQgaW4gYSBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCkgd3JhcHBlciBhbmQgbm9ib2R5IGVsc2UgaGFzCi0gIC8vIGEgcmVmZXJlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgQXJyYXlMaXN0LiBUaGlzIGludmFyaWFudCBhbGxvd3MgdXMgdG8KLSAgLy8gc2hhcmUgaW5zdGFuY2VzIG9mIGxpc3RzIGJldHdlZW4gcHJvdG9jb2wgYnVmZmVycyBhdm9pZGluZyBleHBlbnNpdmUKLSAgLy8gbWVtb3J5IGFsbG9jYXRpb25zLiBOb3RlLCBpbW11dGFibGUgaXMgYSBzdHJvbmcgZ3VhcmFudGVlIGhlcmUgLS0gbm90Ci0gIC8vIGp1c3QgdGhhdCB0aGUgbGlzdCBjYW5ub3QgYmUgbW9kaWZpZWQgdmlhIHRoZSByZWZlcmVuY2UgYnV0IHRoYXQgdGhlCi0gIC8vIGxpc3QgY2FuIG5ldmVyIGJlIG1vZGlmaWVkLgotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0xpc3QgJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIpOwotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgdm9pZCBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKSB7XG4iCi0gICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCi0gICAgIiAgICAkbmFtZSRfID0gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0FycmF5TGlzdCgkbmFtZSRfKTtcbiIKLSAgICAiICAgICRzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIiAgIH1cbiIKLSAgICAifVxuIik7Ci0KLSAgICAvLyBOb3RlOiAgV2UgcmV0dXJuIGFuIHVubW9kaWZpYWJsZSBsaXN0IGJlY2F1c2Ugb3RoZXJ3aXNlIHRoZSBjYWxsZXIKLSAgICAvLyAgIGNvdWxkIGhvbGQgb24gdG8gdGhlIHJldHVybmVkIGxpc3QgYW5kIG1vZGlmeSBpdCBhZnRlciB0aGUgbWVzc2FnZQotICAgIC8vICAgaGFzIGJlZW4gYnVpbHQsIHRodXMgbXV0YXRpbmcgdGhlIG1lc3NhZ2Ugd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUKLSAgICAvLyAgIGltbXV0YWJsZS4KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuUHJvdG9jb2xTdHJpbmdMaXN0XG4iCi0gICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfLmdldFVubW9kaWZpYWJsZVZpZXcoKTtcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgotICAgICJ9XG4iKTsKLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCi0gICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5nZXRCeXRlU3RyaW5nKGluZGV4KTtcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKLSAgICAiICAgIGludCBpbmRleCwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgotICAgICIkbnVsbF9jaGVjayQiCi0gICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgJG5hbWUkXy5zZXQoaW5kZXgsIHZhbHVlKTtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJChcbiIKLSAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgdmFsdWUpIHtcbiIKLSAgICAiJG51bGxfY2hlY2skIgotICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci0gIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJChcbiIKLSAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTxqYXZhLmxhbmcuU3RyaW5nPiB2YWx1ZXMpIHtcbiIKLSAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKLSAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlci5hZGRBbGwoXG4iCi0gICAgIiAgICAgIHZhbHVlcywgJG5hbWUkXyk7XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIpOwotICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICAkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIgotICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci0KLSAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoXG4iCi0gICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgdmFsdWUpIHtcbiIKLSAgICAiJG51bGxfY2hlY2skIik7Ci0gIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIgIGNoZWNrQnl0ZVN0cmluZ0lzVXRmOCh2YWx1ZSk7XG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKLSAgICAiICAkb25fY2hhbmdlZCRcbiIKLSAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKLSAgLy8gbm9vcCBmb3IgcHJpbWl0aXZlcwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIgotICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gVGhlIGNvZGUgYmVsb3cgZG9lcyB0d28gb3B0aW1pemF0aW9uczoKLSAgLy8gICAxLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBlbXB0eSwgdGhlcmUncyBub3RoaW5nIHRvIGRvLiBUaGlzIGVuc3VyZXMgd2UKLSAgLy8gICAgICBkb24ndCBhbGxvY2F0ZSBhIG5ldyBhcnJheSBpZiB3ZSBhbHJlYWR5IGhhdmUgYW4gaW1tdXRhYmxlIG9uZS4KLSAgLy8gICAyLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBub24tZW1wdHkgYW5kIG91ciBjdXJyZW50IGxpc3QgaXMgZW1wdHksIHdlIGNhbgotICAvLyAgICAgIHJldXNlIHRoZSBvdGhlciBsaXN0IHdoaWNoIGlzIGd1YXJhbnRlZWQgdG8gYmUgaW1tdXRhYmxlLgotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoIW90aGVyLiRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCi0gICAgIiAgaWYgKCRuYW1lJF8uaXNFbXB0eSgpKSB7XG4iCi0gICAgIiAgICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKLSAgICAiICAgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICB9IGVsc2Uge1xuIgotICAgICIgICAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgICAkbmFtZSRfLmFkZEFsbChvdGhlci4kbmFtZSRfKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgLy8gVGhlIGNvZGUgYmVsb3cgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaGFzIGFuIGltbXV0YWJsZSBsaXN0LiBJZiBvdXIKLSAgLy8gbGlzdCBpcyBpbW11dGFibGUsIHdlIGNhbiBqdXN0IHJldXNlIGl0LiBJZiBub3QsIHdlIG1ha2UgaXQgaW1tdXRhYmxlLgotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkKSB7XG4iCi0gICAgIiAgJG5hbWUkXyA9ICRuYW1lJF8uZ2V0VW5tb2RpZmlhYmxlVmlldygpO1xuIgotICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKLSAgICAifVxuIgotICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKENoZWNrVXRmOChkZXNjcmlwdG9yXykpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJqYXZhLmxhbmcuU3RyaW5nIHMgPSBpbnB1dC5yZWFkU3RyaW5nUmVxdWlyZVV0ZjgoKTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBicyA9IGlucHV0LnJlYWRCeXRlcygpO1xuIik7Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCEkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKLSAgICAiICAkbmFtZSRfID0gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0FycmF5TGlzdCgpO1xuIgotICAgICIgICRzZXRfbXV0YWJsZV9iaXRfcGFyc2VyJDtcbiIKLSAgICAifVxuIik7Ci0gIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkbmFtZSRfLmFkZChzKTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJG5hbWUkXy5hZGQoYnMpO1xuIik7Ci0gIH0KLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKLSAgICAiICAkbmFtZSRfID0gJG5hbWUkXy5nZXRVbm1vZGlmaWFibGVWaWV3KCk7XG4iCi0gICAgIn1cbiIpOwotfQotCi12b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKLSAgICAiICAkd3JpdGVTdHJpbmckKG91dHB1dCwgJG51bWJlciQsICRuYW1lJF8uZ2V0UmF3KGkpKTtcbiIKLSAgICAifVxuIik7Ci19Ci0KLXZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJ7XG4iCi0gICAgIiAgaW50IGRhdGFTaXplID0gMDtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKLSAgICAiICBkYXRhU2l6ZSArPSBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0UmF3KGkpKTtcbiIKLSAgICAifVxuIik7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAic2l6ZSArPSBkYXRhU2l6ZTtcbiIpOwotCi0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInNpemUgKz0gJHRhZ19zaXplJCAqIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCk7XG4iKTsKLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCi0gICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkgPiAwKSB7XG4iCi0gICAgIiAgaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgotICAgICIgIGhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5oYXNoQ29kZSgpO1xuIgotICAgICJ9XG4iKTsKLX0KLQotc3RyaW5nIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuICJTdHJpbmciOwotfQotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGEzYjU3MzUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vIEF1dGhvcjogam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfU1RSSU5HX0ZJRUxEX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfSF9fCi0KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBuYW1lc3BhY2UgY29tcGlsZXIgewotICAgIG5hbWVzcGFjZSBqYXZhIHsKLSAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAvLyBjb250ZXh0LmgKLSAgICAgIGNsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAvLyBuYW1lX3Jlc29sdmVyLmgKLSAgICB9Ci0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci1uYW1lc3BhY2UgamF2YSB7Ci0KLWNsYXNzIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7Ci0gIH5JbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigpOwotCi0gIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OwotICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OwotCi0gcHJvdGVjdGVkOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0gIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwotICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKLSAgQ29udGV4dCogY29udGV4dF87Ci0gIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcik7Ci19OwotCi1jbGFzcyBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yCi0gICAgOiBwdWJsaWMgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOwotICB+SW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigpOwotCi0gcHJpdmF0ZToKLSAgdm9pZCBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IpOwotfTsKLQotY2xhc3MgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7Ci0gcHVibGljOgotICBleHBsaWNpdCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7Ci0gIH5SZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Q7Ci0gIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLQotICBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187Ci0gIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwotICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKLSAgQ29udGV4dCogY29udGV4dF87Ci0gIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgamF2YQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9TVFJJTkdfRklFTERfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY2YWQxM2IuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qcy9qc19nZW5lcmF0b3IuaD4KLQotaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSkgewotCi0gIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7Ci0gIGNsaS5BbGxvd1BsdWdpbnMoInByb3RvYy0iKTsKLQotICAvLyBQcm90bzIgQysrCi0gIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpjcHA6OkNwcEdlbmVyYXRvciBjcHBfZ2VuZXJhdG9yOwotICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tY3BwX291dCIsICItLWNwcF9vcHQiLCAmY3BwX2dlbmVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBDKysgaGVhZGVyIGFuZCBzb3VyY2UuIik7Ci0KLSAgLy8gUHJvdG8yIEphdmEKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OmphdmE6OkphdmFHZW5lcmF0b3IgamF2YV9nZW5lcmF0b3I7Ci0gIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1qYXZhX291dCIsICZqYXZhX2dlbmVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBKYXZhIHNvdXJjZSBmaWxlLiIpOwotCi0KLSAgLy8gUHJvdG8yIFB5dGhvbgotICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6cHl0aG9uOjpHZW5lcmF0b3IgcHlfZ2VuZXJhdG9yOwotICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tcHl0aG9uX291dCIsICZweV9nZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgUHl0aG9uIHNvdXJjZSBmaWxlLiIpOwotCi0gIC8vIEphdmEgTmFubwotICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6amF2YW5hbm86OkphdmFOYW5vR2VuZXJhdG9yIGphdmFuYW5vX2dlbmVyYXRvcjsKLSAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWphdmFuYW5vX291dCIsICZqYXZhbmFub19nZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgSmF2YSBOYW5vIHNvdXJjZSBmaWxlLiIpOwotCi0gIC8vIFJ1YnkKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OnJ1Ynk6OkdlbmVyYXRvciByYl9nZW5lcmF0b3I7Ci0gIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1ydWJ5X291dCIsICZyYl9nZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgUnVieSBzb3VyY2UgZmlsZS4iKTsKLQotICAvLyBDU2hhcnAKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OmNzaGFycDo6R2VuZXJhdG9yIGNzaGFycF9nZW5lcmF0b3I7Ci0gIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1jc2hhcnBfb3V0IiwgIi0tY3NoYXJwX29wdCIsICZjc2hhcnBfZ2VuZXJhdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIEMjIHNvdXJjZSBmaWxlLiIpOwotCi0gIC8vIE9iamVjdGl2ZSBDCi0gIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpvYmplY3RpdmVjOjpPYmplY3RpdmVDR2VuZXJhdG9yIG9iamNfZ2VuZXJhdG9yOwotICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tb2JqY19vdXQiLCAiLS1vYmpjX29wdCIsICZvYmpjX2dlbmVyYXRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBPYmplY3RpdmUgQyBoZWFkZXIgYW5kIHNvdXJjZS4iKTsKLQotICAvLyBKYXZhU2NyaXB0Ci0gIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpqczo6R2VuZXJhdG9yIGpzX2dlbmVyYXRvcjsKLSAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWpzX291dCIsICZqc19nZW5lcmF0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgSmF2YVNjcmlwdCBzb3VyY2UuIik7Ci0KLSAgcmV0dXJuIGNsaS5SdW4oYXJnYywgYXJndik7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgyYmIzNDIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjU1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oPgotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci0KLS8vIFJldHVybnMgdGhlIGxpc3Qgb2YgdGhlIG5hbWVzIG9mIGZpbGVzIGluIGFsbF9maWxlcyBpbiB0aGUgZm9ybSBvZiBhCi0vLyBjb21tYS1zZXBhcmF0ZWQgc3RyaW5nLgotc3RyaW5nIENvbW1hU2VwYXJhdGVkTGlzdChjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBhbGxfZmlsZXMpIHsKLSAgdmVjdG9yPHN0cmluZz4gbmFtZXM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgbmFtZXMucHVzaF9iYWNrKGFsbF9maWxlc1tpXS0+bmFtZSgpKTsKLSAgfQotICByZXR1cm4gSm9pbihuYW1lcywgIiwiKTsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIqIGtGaXJzdEluc2VydGlvblBvaW50TmFtZSA9ICJmaXJzdF9tb2NrX2luc2VydGlvbl9wb2ludCI7Ci1zdGF0aWMgY29uc3QgY2hhcioga1NlY29uZEluc2VydGlvblBvaW50TmFtZSA9ICJzZWNvbmRfbW9ja19pbnNlcnRpb25fcG9pbnQiOwotc3RhdGljIGNvbnN0IGNoYXIqIGtGaXJzdEluc2VydGlvblBvaW50ID0KLSAgICAiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmlyc3RfbW9ja19pbnNlcnRpb25fcG9pbnQpIGlzIGhlcmVcbiI7Ci1zdGF0aWMgY29uc3QgY2hhcioga1NlY29uZEluc2VydGlvblBvaW50ID0KLSAgICAiICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZWNvbmRfbW9ja19pbnNlcnRpb25fcG9pbnQpIGlzIGhlcmVcbiI7Ci0KLU1vY2tDb2RlR2VuZXJhdG9yOjpNb2NrQ29kZUdlbmVyYXRvcihjb25zdCBzdHJpbmcmIG5hbWUpCi0gICAgOiBuYW1lXyhuYW1lKSB7fQotCi1Nb2NrQ29kZUdlbmVyYXRvcjo6fk1vY2tDb2RlR2VuZXJhdG9yKCkge30KLQotdm9pZCBNb2NrQ29kZUdlbmVyYXRvcjo6RXhwZWN0R2VuZXJhdGVkKAotICAgIGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICBjb25zdCBzdHJpbmcmIGluc2VydGlvbnMsCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlLAotICAgIGNvbnN0IHN0cmluZyYgZmlyc3RfbWVzc2FnZV9uYW1lLAotICAgIGNvbnN0IHN0cmluZyYgZmlyc3RfcGFyc2VkX2ZpbGVfbmFtZSwKLSAgICBjb25zdCBzdHJpbmcmIG91dHB1dF9kaXJlY3RvcnkpIHsKLSAgc3RyaW5nIGNvbnRlbnQ7Ci0gIEdPT0dMRV9DSEVDS19PSygKLSAgICAgIEZpbGU6OkdldENvbnRlbnRzKG91dHB1dF9kaXJlY3RvcnkgKyAiLyIgKyBHZXRPdXRwdXRGaWxlTmFtZShuYW1lLCBmaWxlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICZjb250ZW50LCB0cnVlKSk7Ci0KLSAgdmVjdG9yPHN0cmluZz4gbGluZXMgPSBTcGxpdChjb250ZW50LCAiXG4iLCB0cnVlKTsKLQotICB3aGlsZSAoIWxpbmVzLmVtcHR5KCkgJiYgbGluZXMuYmFjaygpLmVtcHR5KCkpIHsKLSAgICBsaW5lcy5wb3BfYmFjaygpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbGluZXMuc2l6ZSgpOyBpKyspIHsKLSAgICBsaW5lc1tpXSArPSAiXG4iOwotICB9Ci0KLSAgdmVjdG9yPHN0cmluZz4gaW5zZXJ0aW9uX2xpc3Q7Ci0gIGlmICghaW5zZXJ0aW9ucy5lbXB0eSgpKSB7Ci0gICAgU3BsaXRTdHJpbmdVc2luZyhpbnNlcnRpb25zLCAiLCIsICZpbnNlcnRpb25fbGlzdCk7Ci0gIH0KLQotICBFWFBFQ1RfRVEobGluZXMuc2l6ZSgpLCAzICsgaW5zZXJ0aW9uX2xpc3Quc2l6ZSgpICogMik7Ci0gIEVYUEVDVF9FUShHZXRPdXRwdXRGaWxlQ29udGVudChuYW1lLCBwYXJhbWV0ZXIsIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9wYXJzZWRfZmlsZV9uYW1lLCBmaXJzdF9tZXNzYWdlX25hbWUpLAotICAgICAgICAgICAgbGluZXNbMF0pOwotCi0gIEVYUEVDVF9FUShrRmlyc3RJbnNlcnRpb25Qb2ludCwgbGluZXNbMSArIGluc2VydGlvbl9saXN0LnNpemUoKV0pOwotICBFWFBFQ1RfRVEoa1NlY29uZEluc2VydGlvblBvaW50LCBsaW5lc1syICsgaW5zZXJ0aW9uX2xpc3Quc2l6ZSgpICogMl0pOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zZXJ0aW9uX2xpc3Quc2l6ZSgpOyBpKyspIHsKLSAgICBFWFBFQ1RfRVEoR2V0T3V0cHV0RmlsZUNvbnRlbnQoaW5zZXJ0aW9uX2xpc3RbaV0sICJmaXJzdF9pbnNlcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBmaWxlLCBmaXJzdF9tZXNzYWdlX25hbWUpLAotICAgICAgICAgICAgICBsaW5lc1sxICsgaV0pOwotICAgIC8vIFNlY29uZCBpbnNlcnRpb24gcG9pbnQgaXMgaW5kZW50ZWQsIHNvIHRoZSBpbnNlcnRlZCB0ZXh0IHNob3VsZAotICAgIC8vIGF1dG9tYXRpY2FsbHkgYmUgaW5kZW50ZWQgdG9vLgotICAgIEVYUEVDVF9FUSgiICAiICsgR2V0T3V0cHV0RmlsZUNvbnRlbnQoaW5zZXJ0aW9uX2xpc3RbaV0sICJzZWNvbmRfaW5zZXJ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGZpbGUsIGZpcnN0X21lc3NhZ2VfbmFtZSksCi0gICAgICAgICAgICAgIGxpbmVzWzIgKyBpbnNlcnRpb25fbGlzdC5zaXplKCkgKyBpXSk7Ci0gIH0KLX0KLQotYm9vbCBNb2NrQ29kZUdlbmVyYXRvcjo6R2VuZXJhdGUoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKLSAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGlmIChIYXNQcmVmaXhTdHJpbmcoZmlsZS0+bWVzc2FnZV90eXBlKGkpLT5uYW1lKCksICJNb2NrQ29kZUdlbmVyYXRvcl8iKSkgewotICAgICAgc3RyaW5nIGNvbW1hbmQgPSBTdHJpcFByZWZpeFN0cmluZyhmaWxlLT5tZXNzYWdlX3R5cGUoaSktPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk1vY2tDb2RlR2VuZXJhdG9yXyIpOwotICAgICAgaWYgKGNvbW1hbmQgPT0gIkVycm9yIikgewotICAgICAgICAqZXJyb3IgPSAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvci4iOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkV4aXQiKSB7Ci0gICAgICAgIHN0ZDo6Y2VyciA8PCAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0LiIgPDwgc3RkOjplbmRsOwotICAgICAgICBleGl0KDEyMyk7Ci0gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkFib3J0IikgewotICAgICAgICBzdGQ6OmNlcnIgPDwgIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfQWJvcnQuIiA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkhhc1NvdXJjZUNvZGVJbmZvIikgewotICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfZGVzY3JpcHRvcl9wcm90bzsKLSAgICAgICAgZmlsZS0+Q29weVNvdXJjZUNvZGVJbmZvVG8oJmZpbGVfZGVzY3JpcHRvcl9wcm90byk7Ci0gICAgICAgIGJvb2wgaGFzX3NvdXJjZV9jb2RlX2luZm8gPQotICAgICAgICAgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkgJiYKLSAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5zb3VyY2VfY29kZV9pbmZvKCkubG9jYXRpb25fc2l6ZSgpID4gMDsKLSAgICAgICAgc3RkOjpjZXJyIDw8ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0hhc1NvdXJjZUNvZGVJbmZvOiAiCi0gICAgICAgICAgICAgICAgICA8PCBoYXNfc291cmNlX2NvZGVfaW5mbyA8PCAiLiIgPDwgc3RkOjplbmRsOwotICAgICAgICBhYm9ydCgpOwotICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJIYXNKc29uTmFtZSIpIHsKLSAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGRfZGVzY3JpcHRvcl9wcm90bzsKLSAgICAgICAgZmlsZS0+bWVzc2FnZV90eXBlKGkpLT5maWVsZCgwKS0+Q29weVRvKCZmaWVsZF9kZXNjcmlwdG9yX3Byb3RvKTsKLSAgICAgICAgc3RkOjpjZXJyIDw8ICJTYXcganNvbl9uYW1lOiAiCi0gICAgICAgICAgICAgICAgICA8PCBmaWVsZF9kZXNjcmlwdG9yX3Byb3RvLmhhc19qc29uX25hbWUoKSA8PCBzdGQ6OmVuZGw7Ci0gICAgICAgIGFib3J0KCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5rbm93biBNb2NrQ29kZUdlbmVyYXRvciBjb21tYW5kOiAiIDw8IGNvbW1hbmQ7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKEhhc1ByZWZpeFN0cmluZyhwYXJhbWV0ZXIsICJpbnNlcnQ9IikpIHsKLSAgICB2ZWN0b3I8c3RyaW5nPiBpbnNlcnRfaW50bzsKLSAgICBTcGxpdFN0cmluZ1VzaW5nKFN0cmlwUHJlZml4U3RyaW5nKHBhcmFtZXRlciwgImluc2VydD0iKSwKLSAgICAgICAgICAgICAgICAgICAgICIsIiwgJmluc2VydF9pbnRvKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5zZXJ0X2ludG8uc2l6ZSgpOyBpKyspIHsKLSAgICAgIHsKLSAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KAotICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLCBrRmlyc3RJbnNlcnRpb25Qb2ludE5hbWUpKTsKLSAgICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7Ci0gICAgICAgIHByaW50ZXIuUHJpbnRSYXcoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZV8sICJmaXJzdF9pbnNlcnQiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGNvbnRleHQpKTsKLSAgICAgICAgaWYgKHByaW50ZXIuZmFpbGVkKCkpIHsKLSAgICAgICAgICAqZXJyb3IgPSAiTW9ja0NvZGVHZW5lcmF0b3IgZGV0ZWN0ZWQgd3JpdGUgZXJyb3IuIjsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgewotICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChHZXRPdXRwdXRGaWxlTmFtZShpbnNlcnRfaW50b1tpXSwgZmlsZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtTZWNvbmRJbnNlcnRpb25Qb2ludE5hbWUpKTsKLSAgICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7Ci0gICAgICAgIHByaW50ZXIuUHJpbnRSYXcoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZV8sICJzZWNvbmRfaW5zZXJ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBjb250ZXh0KSk7Ci0gICAgICAgIGlmIChwcmludGVyLmZhaWxlZCgpKSB7Ci0gICAgICAgICAgKmVycm9yID0gIk1vY2tDb2RlR2VuZXJhdG9yIGRldGVjdGVkIHdyaXRlIGVycm9yLiI7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCi0gICAgICAgIGNvbnRleHQtPk9wZW4oR2V0T3V0cHV0RmlsZU5hbWUobmFtZV8sIGZpbGUpKSk7Ci0KLSAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKLSAgICBwcmludGVyLlByaW50UmF3KEdldE91dHB1dEZpbGVDb250ZW50KG5hbWVfLCBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlLCBjb250ZXh0KSk7Ci0gICAgcHJpbnRlci5QcmludFJhdyhrRmlyc3RJbnNlcnRpb25Qb2ludCk7Ci0gICAgcHJpbnRlci5QcmludFJhdyhrU2Vjb25kSW5zZXJ0aW9uUG9pbnQpOwotCi0gICAgaWYgKHByaW50ZXIuZmFpbGVkKCkpIHsKLSAgICAgICplcnJvciA9ICJNb2NrQ29kZUdlbmVyYXRvciBkZXRlY3RlZCB3cml0ZSBlcnJvci4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1zdHJpbmcgTW9ja0NvZGVHZW5lcmF0b3I6OkdldE91dHB1dEZpbGVOYW1lKGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIHJldHVybiBHZXRPdXRwdXRGaWxlTmFtZShnZW5lcmF0b3JfbmFtZSwgZmlsZS0+bmFtZSgpKTsKLX0KLQotc3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlTmFtZShjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGUpIHsKLSAgcmV0dXJuIGZpbGUgKyAiLk1vY2tDb2RlR2VuZXJhdG9yLiIgKyBnZW5lcmF0b3JfbmFtZTsKLX0KLQotc3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlQ29udGVudCgKLSAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgIEdlbmVyYXRvckNvbnRleHQgKmNvbnRleHQpIHsKLSAgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gYWxsX2ZpbGVzOwotICBjb250ZXh0LT5MaXN0UGFyc2VkRmlsZXMoJmFsbF9maWxlcyk7Ci0gIHJldHVybiBHZXRPdXRwdXRGaWxlQ29udGVudCgKLSAgICAgIGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsIGZpbGUtPm5hbWUoKSwKLSAgICAgIENvbW1hU2VwYXJhdGVkTGlzdChhbGxfZmlsZXMpLAotICAgICAgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkgPiAwID8KLSAgICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSA6ICIobm9uZSkiKTsKLX0KLQotc3RyaW5nIE1vY2tDb2RlR2VuZXJhdG9yOjpHZXRPdXRwdXRGaWxlQ29udGVudCgKLSAgICBjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAotICAgIGNvbnN0IHN0cmluZyYgZmlsZSwKLSAgICBjb25zdCBzdHJpbmcmIHBhcnNlZF9maWxlX2xpc3QsCi0gICAgY29uc3Qgc3RyaW5nJiBmaXJzdF9tZXNzYWdlX25hbWUpIHsKLSAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwOiAkMSwgJDIsICQzLCAkNFxuIiwKLSAgICAgIGdlbmVyYXRvcl9uYW1lLCBwYXJhbWV0ZXIsIGZpbGUsCi0gICAgICBmaXJzdF9tZXNzYWdlX25hbWUsIHBhcnNlZF9maWxlX2xpc3QpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTE2NjVmOC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9NT0NLX0NPREVfR0VORVJBVE9SX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfTU9DS19DT0RFX0dFTkVSQVRPUl9IX18KLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1jbGFzcyBGaWxlRGVzY3JpcHRvcjsKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotLy8gQSBtb2NrIENvZGVHZW5lcmF0b3IsIHVzZWQgYnkgY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC4gIFRoaXMgaXMgaW4KLS8vIGl0cyBvd24gZmlsZSBzbyB0aGF0IGl0IGNhbiBiZSB1c2VkIGJvdGggZGlyZWN0bHkgYW5kIGFzIGEgcGx1Z2luLgotLy8KLS8vIEdlbmVyYXRlKCkgcHJvZHVjZXMgc29tZSBvdXRwdXQgd2hpY2ggY2FuIGJlIGNoZWNrZWQgYnkgRXhwZWN0Q2FsbGVkKCkuICBUaGUKLS8vIGdlbmVyYXRvciBjYW4gcnVuIGluIGEgZGlmZmVyZW50IHByb2Nlc3MgKGUuZy4gYSBwbHVnaW4pLgotLy8KLS8vIElmIHRoZSBwYXJhbWV0ZXIgaXMgImluc2VydD1OQU1FUyIsIHRoZSBNb2NrQ29kZUdlbmVyYXRvciB3aWxsIGluc2VydCBsaW5lcwotLy8gaW50byB0aGUgZmlsZXMgZ2VuZXJhdGVkIGJ5IG90aGVyIE1vY2tDb2RlR2VuZXJhdG9ycyBpbnN0ZWFkIG9mIGNyZWF0aW5nCi0vLyBpdHMgb3duIGZpbGUuICBOQU1FUyBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIHRoZSBuYW1lcyBvZiB0aG9zZSBvdGhlcgotLy8gTW9ja0NvZGVHZW5lcmF0b3JzLgotLy8KLS8vIE1vY2tDb2RlR2VuZXJhdG9yIHdpbGwgYWxzbyBtb2RpZnkgaXRzIGJlaGF2aW9yIHNsaWdodGx5IGlmIHRoZSBpbnB1dCBmaWxlCi0vLyBjb250YWlucyBhIG1lc3NhZ2UgdHlwZSB3aXRoIG9uZSBvZiB0aGUgZm9sbG93aW5nIG5hbWVzOgotLy8gICBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvcjogIENhdXNlcyBHZW5lcmF0ZSgpIHRvIHJldHVybiBmYWxzZSBhbmQgc2V0IHRoZQotLy8gICAgIGVycm9yIG1lc3NhZ2UgdG8gIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfRXJyb3IuIgotLy8gICBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0OiAgR2VuZXJhdGUoKSBwcmludHMgIlNhdyBtZXNzYWdlIHR5cGUKLS8vICAgICBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0LiIgdG8gc3RkZXJyIGFuZCB0aGVuIGNhbGxzIGV4aXQoMTIzKS4KLS8vICAgTW9ja0NvZGVHZW5lcmF0b3JfQWJvcnQ6ICBHZW5lcmF0ZSgpIHByaW50cyAiU2F3IG1lc3NhZ2UgdHlwZQotLy8gICAgIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0LiIgdG8gc3RkZXJyIGFuZCB0aGVuIGNhbGxzIGFib3J0KCkuCi0vLyAgIE1vY2tDb2RlR2VuZXJhdG9yX0hhc1NvdXJjZUNvZGVJbmZvOiAgQ2F1c2VzIEdlbmVyYXRlKCkgdG8gYWJvcnQgYWZ0ZXIKLS8vICAgICBwcmludGluZyAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbzogRk9PLiIgdG8KLS8vICAgICBzdGRlcnIsIHdoZXJlIEZPTyBpcyAiMSIgaWYgdGhlIHN1cHBsaWVkIEZpbGVEZXNjcmlwdG9yUHJvdG8gaGFzIHNvdXJjZQotLy8gICAgIGNvZGUgaW5mbywgYW5kICIwIiBvdGhlcndpc2UuCi1jbGFzcyBNb2NrQ29kZUdlbmVyYXRvciA6IHB1YmxpYyBDb2RlR2VuZXJhdG9yIHsKLSBwdWJsaWM6Ci0gIE1vY2tDb2RlR2VuZXJhdG9yKGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0gIHZpcnR1YWwgfk1vY2tDb2RlR2VuZXJhdG9yKCk7Ci0KLSAgLy8gRXhwZWN0ICh2aWEgZ1Rlc3QpIHRoYXQgYSBNb2NrQ29kZUdlbmVyYXRvciB3aXRoIHRoZSBnaXZlbiBuYW1lIHdhcyBjYWxsZWQKLSAgLy8gd2l0aCB0aGUgZ2l2ZW4gcGFyYW1ldGVycyBieSBpbnNwZWN0aW5nIHRoZSBvdXRwdXQgbG9jYXRpb24uCi0gIC8vCi0gIC8vIHxpbnNlcnRpb25zfCBpcyBhIGNvbW1hLXNlcGFyYXRlZCBsaXN0IG9mIG5hbWVzIG9mIE1vY2tDb2RlR2VuZXJhdG9ycyB3aGljaAotICAvLyBzaG91bGQgaGF2ZSBpbnNlcnRlZCBsaW5lcyBpbnRvIHRoaXMgZmlsZS4KLSAgLy8gfHBhcnNlZF9maWxlX2xpc3R8IGlzIGEgY29tbWEtc2VwYXJhdGVkIGxpc3Qgb2YgbmFtZXMgb2YgdGhlIGZpbGVzCi0gIC8vIHRoYXQgYXJlIGJlaW5nIGNvbXBpbGVkIHRvZ2V0aGVyIGluIHRoaXMgcnVuLgotICBzdGF0aWMgdm9pZCBFeHBlY3RHZW5lcmF0ZWQoY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGluc2VydGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpcnN0X21lc3NhZ2VfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyc2VkX2ZpbGVfbGlzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgb3V0cHV0X2RpcmVjdG9yeSk7Ci0KLSAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBmaWxlIHdoaWNoIHdvdWxkIGJlIHdyaXR0ZW4gYnkgdGhlIGdpdmVuIGdlbmVyYXRvci4KLSAgc3RhdGljIHN0cmluZyBHZXRPdXRwdXRGaWxlTmFtZShjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKLSAgc3RhdGljIHN0cmluZyBHZXRPdXRwdXRGaWxlTmFtZShjb25zdCBzdHJpbmcmIGdlbmVyYXRvcl9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZSk7Ci0KLSAgLy8gaW1wbGVtZW50cyBDb2RlR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHN0cmluZyBuYW1lXzsKLQotICBzdGF0aWMgc3RyaW5nIEdldE91dHB1dEZpbGVDb250ZW50KGNvbnN0IHN0cmluZyYgZ2VuZXJhdG9yX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJhbWV0ZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCAqY29udGV4dCk7Ci0gIHN0YXRpYyBzdHJpbmcgR2V0T3V0cHV0RmlsZUNvbnRlbnQoY29uc3Qgc3RyaW5nJiBnZW5lcmF0b3JfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwYXJzZWRfZmlsZV9saXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlyc3RfbWVzc2FnZV9uYW1lKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX01PQ0tfQ09ERV9HRU5FUkFUT1JfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI2YjQ3My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oCisrKyAvZGV2L251bGwKQEAgLTEsNjQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgZmlsZSBleGlzdHMgc29sZWx5IHRvIGRvY3VtZW50IHRoZSBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlciBuYW1lc3BhY2UuCi0vLyBJdCBpcyBub3QgY29tcGlsZWQgaW50byBhbnl0aGluZywgYnV0IGl0IG1heSBiZSByZWFkIGJ5IGFuIGF1dG9tYXRlZAotLy8gZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuCi0KLW5hbWVzcGFjZSBnb29nbGUgewotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0vLyBJbXBsZW1lbnRhdGlvbiBvZiB0aGUgUHJvdG9jb2wgQnVmZmVyIGNvbXBpbGVyLgotLy8KLS8vIFRoaXMgcGFja2FnZSBjb250YWlucyBjb2RlIGZvciBwYXJzaW5nIC5wcm90byBmaWxlcyBhbmQgZ2VuZXJhdGluZyBjb2RlCi0vLyBiYXNlZCBvbiB0aGVtLiAgVGhlcmUgYXJlIHR3byByZWFzb25zIHlvdSBtaWdodCBiZSBpbnRlcmVzdGVkIGluIHRoaXMKLS8vIHBhY2thZ2U6Ci0vLyAtIFlvdSB3YW50IHRvIHBhcnNlIC5wcm90byBmaWxlcyBhdCBydW50aW1lLiAgSW4gdGhpcyBjYXNlLCB5b3Ugc2hvdWxkCi0vLyAgIGxvb2sgYXQgaW1wb3J0ZXIuaC4gIFNpbmNlIHRoaXMgZnVuY3Rpb25hbGl0eSBpcyB3aWRlbHkgdXNlZnVsLCBpdCBpcwotLy8gICBpbmNsdWRlZCBpbiB0aGUgbGlicHJvdG9idWYgYmFzZSBsaWJyYXJ5OyB5b3UgZG8gbm90IGhhdmUgdG8gbGluayBhZ2FpbnN0Ci0vLyAgIGxpYnByb3RvYy4KLS8vIC0gWW91IHdhbnQgdG8gd3JpdGUgYSBjdXN0b20gcHJvdG9jb2wgY29tcGlsZXIgd2hpY2ggZ2VuZXJhdGVzIGRpZmZlcmVudAotLy8gICBraW5kcyBvZiBjb2RlLCBlLmcuIGNvZGUgaW4gYSBkaWZmZXJlbnQgbGFuZ3VhZ2Ugd2hpY2ggaXMgbm90IHN1cHBvcnRlZAotLy8gICBieSB0aGUgb2ZmaWNpYWwgY29tcGlsZXIuICBGb3IgdGhpcyBwdXJwb3NlLCBjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgKLS8vICAgcHJvdmlkZXMgeW91IHdpdGggYSBjb21wbGV0ZSBjb21waWxlciBmcm9udC1lbmQsIHNvIGFsbCB5b3UgbmVlZCB0byBkbwotLy8gICBpcyB3cml0ZSBhIGN1c3RvbSBpbXBsZW1lbnRhdGlvbiBvZiBDb2RlR2VuZXJhdG9yIGFuZCBhIHRyaXZpYWwgbWFpbigpCi0vLyAgIGZ1bmN0aW9uLiAgWW91IGNhbiBldmVuIG1ha2UgeW91ciBjb21waWxlciBzdXBwb3J0IHRoZSBvZmZpY2lhbCBsYW5ndWFnZXMKLS8vICAgaW4gYWRkaXRpb24gdG8geW91ciBvd24uICBTaW5jZSB0aGlzIGZ1bmN0aW9uYWxpdHkgaXMgb25seSB1c2VmdWwgdG8gdGhvc2UKLS8vICAgd3JpdGluZyBjdXN0b20gY29tcGlsZXJzLCBpdCBpcyBpbiBhIHNlcGFyYXRlIGxpYnJhcnkgY2FsbGVkICJsaWJwcm90b2MiCi0vLyAgIHdoaWNoIHlvdSB3aWxsIGhhdmUgdG8gbGluayBhZ2FpbnN0LgotbmFtZXNwYWNlIGNvbXBpbGVyIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBkZWQ0ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDIxMDkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFJlY3Vyc2l2ZSBkZXNjZW50IEZUVy4KLQotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KLSNpbmNsdWRlIDxsaW1pdHM+Ci0KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci0KLXVzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwotCi1uYW1lc3BhY2UgewotCi10eXBlZGVmIGhhc2hfbWFwPHN0cmluZywgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGU+IFR5cGVOYW1lTWFwOwotCi1UeXBlTmFtZU1hcCBNYWtlVHlwZU5hbWVUYWJsZSgpIHsKLSAgVHlwZU5hbWVNYXAgcmVzdWx0OwotCi0gIHJlc3VsdFsiZG91YmxlIiAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0RPVUJMRTsKLSAgcmVzdWx0WyJmbG9hdCIgICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQ7Ci0gIHJlc3VsdFsidWludDY0IiAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQ2NDsKLSAgcmVzdWx0WyJmaXhlZDY0IiBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQ2NDsKLSAgcmVzdWx0WyJmaXhlZDMyIiBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQzMjsKLSAgcmVzdWx0WyJib29sIiAgICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQk9PTDsKLSAgcmVzdWx0WyJzdHJpbmciICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HOwotICByZXN1bHRbImdyb3VwIiAgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9HUk9VUDsKLQotICByZXN1bHRbImJ5dGVzIiAgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9CWVRFUzsKLSAgcmVzdWx0WyJ1aW50MzIiICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfVUlOVDMyOwotICByZXN1bHRbInNmaXhlZDMyIl0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQzMjsKLSAgcmVzdWx0WyJzZml4ZWQ2NCJdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVENjQ7Ci0gIHJlc3VsdFsiaW50MzIiICAgXSA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyOwotICByZXN1bHRbImludDY0IiAgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQ2NDsKLSAgcmVzdWx0WyJzaW50MzIiICBdID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0lOVDMyOwotICByZXN1bHRbInNpbnQ2NCIgIF0gPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UNjQ7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3QgVHlwZU5hbWVNYXAga1R5cGVOYW1lcyA9IE1ha2VUeXBlTmFtZVRhYmxlKCk7Ci0KLS8vIENhbWVsLWNhc2UgdGhlIGZpZWxkIG5hbWUgYW5kIGFwcGVuZCAiRW50cnkiIGZvciBnZW5lcmF0ZWQgbWFwIGVudHJ5IG5hbWUuCi0vLyBlLmcuIG1hcDxLZXlUeXBlLCBWYWx1ZVR5cGU+IGZvb19tYXAgPT4gRm9vTWFwRW50cnkKLXN0cmluZyBNYXBFbnRyeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtTdWZmaXhbXSA9ICJFbnRyeSI7Ci0gIHJlc3VsdC5yZXNlcnZlKGZpZWxkX25hbWUuc2l6ZSgpICsgc2l6ZW9mKGtTdWZmaXgpKTsKLSAgYm9vbCBjYXBfbmV4dCA9IHRydWU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfbmFtZS5zaXplKCk7ICsraSkgewotICAgIGlmIChmaWVsZF9uYW1lW2ldID09ICdfJykgewotICAgICAgY2FwX25leHQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoY2FwX25leHQpIHsKLSAgICAgIC8vIE5vdGU6IERvIG5vdCB1c2UgY3R5cGUuaCBkdWUgdG8gbG9jYWxlcy4KLSAgICAgIGlmICgnYScgPD0gZmllbGRfbmFtZVtpXSAmJiBmaWVsZF9uYW1lW2ldIDw9ICd6JykgewotICAgICAgICByZXN1bHQucHVzaF9iYWNrKGZpZWxkX25hbWVbaV0gLSAnYScgKyAnQScpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhmaWVsZF9uYW1lW2ldKTsKLSAgICAgIH0KLSAgICAgIGNhcF9uZXh0ID0gZmFsc2U7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlc3VsdC5wdXNoX2JhY2soZmllbGRfbmFtZVtpXSk7Ci0gICAgfQotICB9Ci0gIHJlc3VsdC5hcHBlbmQoa1N1ZmZpeCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotLy8gTWFrZXMgY29kZSBzbGlnaHRseSBtb3JlIHJlYWRhYmxlLiAgVGhlIG1lYW5pbmcgb2YgIkRPKGZvbykiIGlzCi0vLyAiRXhlY3V0ZSBmb28gYW5kIGZhaWwgaWYgaXQgZmFpbHMuIiwgd2hlcmUgZmFpbHVyZSBpcyBpbmRpY2F0ZWQgYnkKLS8vIHJldHVybmluZyBmYWxzZS4KLSNkZWZpbmUgRE8oU1RBVEVNRU5UKSBpZiAoU1RBVEVNRU5UKSB7fSBlbHNlIHJldHVybiBmYWxzZQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVBhcnNlcjo6UGFyc2VyKCkKLSAgOiBpbnB1dF8oTlVMTCksCi0gICAgZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKLSAgICBzb3VyY2VfbG9jYXRpb25fdGFibGVfKE5VTEwpLAotICAgIGhhZF9lcnJvcnNfKGZhbHNlKSwKLSAgICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyhmYWxzZSksCi0gICAgc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl8oZmFsc2UpIHsKLX0KLQotUGFyc2VyOjp+UGFyc2VyKCkgewotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWlubGluZSBib29sIFBhcnNlcjo6TG9va2luZ0F0KGNvbnN0IGNoYXIqIHRleHQpIHsKLSAgcmV0dXJuIGlucHV0Xy0+Y3VycmVudCgpLnRleHQgPT0gdGV4dDsKLX0KLQotaW5saW5lIGJvb2wgUGFyc2VyOjpMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRva2VuVHlwZSB0b2tlbl90eXBlKSB7Ci0gIHJldHVybiBpbnB1dF8tPmN1cnJlbnQoKS50eXBlID09IHRva2VuX3R5cGU7Ci19Ci0KLWlubGluZSBib29sIFBhcnNlcjo6QXRFbmQoKSB7Ci0gIHJldHVybiBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EKTsKLX0KLQotYm9vbCBQYXJzZXI6OlRyeUNvbnN1bWUoY29uc3QgY2hhciogdGV4dCkgewotICBpZiAoTG9va2luZ0F0KHRleHQpKSB7Ci0gICAgaW5wdXRfLT5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgUGFyc2VyOjpDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIGVycm9yKSB7Ci0gIGlmIChUcnlDb25zdW1lKHRleHQpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgQWRkRXJyb3IoZXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIFBhcnNlcjo6Q29uc3VtZShjb25zdCBjaGFyKiB0ZXh0KSB7Ci0gIGlmIChUcnlDb25zdW1lKHRleHQpKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgQWRkRXJyb3IoIkV4cGVjdGVkIFwiIiArIHN0cmluZyh0ZXh0KSArICJcIi4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBQYXJzZXI6OkNvbnN1bWVJZGVudGlmaWVyKHN0cmluZyogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcikgewotICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7Ci0gICAgKm91dHB1dCA9IGlucHV0Xy0+Y3VycmVudCgpLnRleHQ7Ci0gICAgaW5wdXRfLT5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgQWRkRXJyb3IoZXJyb3IpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIFBhcnNlcjo6Q29uc3VtZUludGVnZXIoaW50KiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKSB7Ci0gIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKLSAgICB1aW50NjQgdmFsdWUgPSAwOwotICAgIGlmICghaW86OlRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGlucHV0Xy0+Y3VycmVudCgpLnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga2ludDMybWF4LCAmdmFsdWUpKSB7Ci0gICAgICBBZGRFcnJvcigiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIik7Ci0gICAgICAvLyBXZSBzdGlsbCByZXR1cm4gdHJ1ZSBiZWNhdXNlIHdlIGRpZCwgaW4gZmFjdCwgcGFyc2UgYW4gaW50ZWdlci4KLSAgICB9Ci0gICAgKm91dHB1dCA9IHZhbHVlOwotICAgIGlucHV0Xy0+TmV4dCgpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIEFkZEVycm9yKGVycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBQYXJzZXI6OkNvbnN1bWVTaWduZWRJbnRlZ2VyKGludCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcikgewotICBib29sIGlzX25lZ2F0aXZlID0gZmFsc2U7Ci0gIHVpbnQ2NCBtYXhfdmFsdWUgPSBraW50MzJtYXg7Ci0gIGlmIChUcnlDb25zdW1lKCItIikpIHsKLSAgICBpc19uZWdhdGl2ZSA9IHRydWU7Ci0gICAgbWF4X3ZhbHVlICs9IDE7Ci0gIH0KLSAgdWludDY0IHZhbHVlID0gMDsKLSAgRE8oQ29uc3VtZUludGVnZXI2NChtYXhfdmFsdWUsICZ2YWx1ZSwgZXJyb3IpKTsKLSAgaWYgKGlzX25lZ2F0aXZlKSB2YWx1ZSAqPSAtMTsKLSAgKm91dHB1dCA9IHZhbHVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZXI6OkNvbnN1bWVJbnRlZ2VyNjQodWludDY0IG1heF92YWx1ZSwgdWludDY0KiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcikgewotICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7Ci0gICAgaWYgKCFpbzo6VG9rZW5pemVyOjpQYXJzZUludGVnZXIoaW5wdXRfLT5jdXJyZW50KCkudGV4dCwgbWF4X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCkpIHsKLSAgICAgIEFkZEVycm9yKCJJbnRlZ2VyIG91dCBvZiByYW5nZS4iKTsKLSAgICAgIC8vIFdlIHN0aWxsIHJldHVybiB0cnVlIGJlY2F1c2Ugd2UgZGlkLCBpbiBmYWN0LCBwYXJzZSBhbiBpbnRlZ2VyLgotICAgICAgKm91dHB1dCA9IDA7Ci0gICAgfQotICAgIGlucHV0Xy0+TmV4dCgpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIEFkZEVycm9yKGVycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBQYXJzZXI6OkNvbnN1bWVOdW1iZXIoZG91YmxlKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKSB7Ci0gIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfRkxPQVQpKSB7Ci0gICAgKm91dHB1dCA9IGlvOjpUb2tlbml6ZXI6OlBhcnNlRmxvYXQoaW5wdXRfLT5jdXJyZW50KCkudGV4dCk7Ci0gICAgaW5wdXRfLT5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7Ci0gICAgLy8gQWxzbyBhY2NlcHQgaW50ZWdlcnMuCi0gICAgdWludDY0IHZhbHVlID0gMDsKLSAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcihpbnB1dF8tPmN1cnJlbnQoKS50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGt1aW50NjRtYXgsICZ2YWx1ZSkpIHsKLSAgICAgIEFkZEVycm9yKCJJbnRlZ2VyIG91dCBvZiByYW5nZS4iKTsKLSAgICAgIC8vIFdlIHN0aWxsIHJldHVybiB0cnVlIGJlY2F1c2Ugd2UgZGlkLCBpbiBmYWN0LCBwYXJzZSBhIG51bWJlci4KLSAgICB9Ci0gICAgKm91dHB1dCA9IHZhbHVlOwotICAgIGlucHV0Xy0+TmV4dCgpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiaW5mIikpIHsKLSAgICAqb3V0cHV0ID0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLSAgICBpbnB1dF8tPk5leHQoKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoIm5hbiIpKSB7Ci0gICAgKm91dHB1dCA9IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpOwotICAgIGlucHV0Xy0+TmV4dCgpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIEFkZEVycm9yKGVycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBQYXJzZXI6OkNvbnN1bWVTdHJpbmcoc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKSB7Ci0gIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgewotICAgIGlvOjpUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKGlucHV0Xy0+Y3VycmVudCgpLnRleHQsIG91dHB1dCk7Ci0gICAgaW5wdXRfLT5OZXh0KCk7Ci0gICAgLy8gQWxsb3cgQysrIGxpa2UgY29uY2F0ZW5hdGlvbiBvZiBhZGphY2VudCBzdHJpbmcgdG9rZW5zLgotICAgIHdoaWxlIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgewotICAgICAgaW86OlRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQoaW5wdXRfLT5jdXJyZW50KCkudGV4dCwgb3V0cHV0KTsKLSAgICAgIGlucHV0Xy0+TmV4dCgpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBBZGRFcnJvcihlcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgUGFyc2VyOjpUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigKLSAgICBjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBMb2NhdGlvblJlY29yZGVyKiBsb2NhdGlvbikgewotICBpZiAoTG9va2luZ0F0KHRleHQpKSB7Ci0gICAgc3RyaW5nIGxlYWRpbmcsIHRyYWlsaW5nOwotICAgIHZlY3RvcjxzdHJpbmc+IGRldGFjaGVkOwotICAgIGlucHV0Xy0+TmV4dFdpdGhDb21tZW50cygmdHJhaWxpbmcsICZkZXRhY2hlZCwgJmxlYWRpbmcpOwotCi0gICAgLy8gU2F2ZSB0aGUgbGVhZGluZyBjb21tZW50cyBmb3IgbmV4dCB0aW1lLCBhbmQgcmVjYWxsIHRoZSBsZWFkaW5nIGNvbW1lbnRzCi0gICAgLy8gZnJvbSBsYXN0IHRpbWUuCi0gICAgbGVhZGluZy5zd2FwKHVwY29taW5nX2RvY19jb21tZW50c18pOwotCi0gICAgaWYgKGxvY2F0aW9uICE9IE5VTEwpIHsKLSAgICAgIHVwY29taW5nX2RldGFjaGVkX2NvbW1lbnRzXy5zd2FwKGRldGFjaGVkKTsKLSAgICAgIGxvY2F0aW9uLT5BdHRhY2hDb21tZW50cygmbGVhZGluZywgJnRyYWlsaW5nLCAmZGV0YWNoZWQpOwotICAgIH0gZWxzZSBpZiAoc3RyY21wKHRleHQsICJ9IikgPT0gMCkgewotICAgICAgLy8gSWYgdGhlIGN1cnJlbnQgbG9jYXRpb24gaXMgbnVsbCBhbmQgd2UgYXJlIGZpbmlzaGluZyB0aGUgY3VycmVudCBzY29wZSwKLSAgICAgIC8vIGRyb3AgcGVuZGluZyB1cGNvbWluZyBkZXRhY2hlZCBjb21tZW50cy4KLSAgICAgIHVwY29taW5nX2RldGFjaGVkX2NvbW1lbnRzXy5zd2FwKGRldGFjaGVkKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gT3RoZXJ3aXNlLCBhcHBlbmQgdGhlIG5ldyBkZXRhY2hlZCBjb21tZW50cyB0byB0aGUgZXhpc3RpbmcgdXBjb21pbmcKLSAgICAgIC8vIGRldGFjaGVkIGNvbW1lbnRzLgotICAgICAgdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLmluc2VydCh1cGNvbWluZ19kZXRhY2hlZF9jb21tZW50c18uZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRldGFjaGVkLmJlZ2luKCksIGRldGFjaGVkLmVuZCgpKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotYm9vbCBQYXJzZXI6OkNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKAotICAgIGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKSB7Ci0gIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbih0ZXh0LCBsb2NhdGlvbikpIHsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBBZGRFcnJvcigiRXhwZWN0ZWQgXCIiICsgc3RyaW5nKHRleHQpICsgIlwiLiIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgUGFyc2VyOjpBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBlcnJvcikgewotICBpZiAoZXJyb3JfY29sbGVjdG9yXyAhPSBOVUxMKSB7Ci0gICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZSwgY29sdW1uLCBlcnJvcik7Ci0gIH0KLSAgaGFkX2Vycm9yc18gPSB0cnVlOwotfQotCi12b2lkIFBhcnNlcjo6QWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBlcnJvcikgewotICBBZGRFcnJvcihpbnB1dF8tPmN1cnJlbnQoKS5saW5lLCBpbnB1dF8tPmN1cnJlbnQoKS5jb2x1bW4sIGVycm9yKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1QYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkxvY2F0aW9uUmVjb3JkZXIoUGFyc2VyKiBwYXJzZXIpCi0gIDogcGFyc2VyXyhwYXJzZXIpLAotICAgIGxvY2F0aW9uXyhwYXJzZXJfLT5zb3VyY2VfY29kZV9pbmZvXy0+YWRkX2xvY2F0aW9uKCkpIHsKLSAgbG9jYXRpb25fLT5hZGRfc3BhbihwYXJzZXJfLT5pbnB1dF8tPmN1cnJlbnQoKS5saW5lKTsKLSAgbG9jYXRpb25fLT5hZGRfc3BhbihwYXJzZXJfLT5pbnB1dF8tPmN1cnJlbnQoKS5jb2x1bW4pOwotfQotCi1QYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkxvY2F0aW9uUmVjb3JkZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50KSB7Ci0gIEluaXQocGFyZW50KTsKLX0KLQotUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF0aDEpIHsKLSAgSW5pdChwYXJlbnQpOwotICBBZGRQYXRoKHBhdGgxKTsKLX0KLQotUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpMb2NhdGlvblJlY29yZGVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGF0aDEsIGludCBwYXRoMikgewotICBJbml0KHBhcmVudCk7Ci0gIEFkZFBhdGgocGF0aDEpOwotICBBZGRQYXRoKHBhdGgyKTsKLX0KLQotdm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkluaXQoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50KSB7Ci0gIHBhcnNlcl8gPSBwYXJlbnQucGFyc2VyXzsKLSAgbG9jYXRpb25fID0gcGFyc2VyXy0+c291cmNlX2NvZGVfaW5mb18tPmFkZF9sb2NhdGlvbigpOwotICBsb2NhdGlvbl8tPm11dGFibGVfcGF0aCgpLT5Db3B5RnJvbShwYXJlbnQubG9jYXRpb25fLT5wYXRoKCkpOwotCi0gIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkubGluZSk7Ci0gIGxvY2F0aW9uXy0+YWRkX3NwYW4ocGFyc2VyXy0+aW5wdXRfLT5jdXJyZW50KCkuY29sdW1uKTsKLX0KLQotUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjp+TG9jYXRpb25SZWNvcmRlcigpIHsKLSAgaWYgKGxvY2F0aW9uXy0+c3Bhbl9zaXplKCkgPD0gMikgewotICAgIEVuZEF0KHBhcnNlcl8tPmlucHV0Xy0+cHJldmlvdXMoKSk7Ci0gIH0KLX0KLQotdm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkFkZFBhdGgoaW50IHBhdGhfY29tcG9uZW50KSB7Ci0gIGxvY2F0aW9uXy0+YWRkX3BhdGgocGF0aF9jb21wb25lbnQpOwotfQotCi12b2lkIFBhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6U3RhcnRBdChjb25zdCBpbzo6VG9rZW5pemVyOjpUb2tlbiYgdG9rZW4pIHsKLSAgbG9jYXRpb25fLT5zZXRfc3BhbigwLCB0b2tlbi5saW5lKTsKLSAgbG9jYXRpb25fLT5zZXRfc3BhbigxLCB0b2tlbi5jb2x1bW4pOwotfQotCi12b2lkIFBhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6U3RhcnRBdChjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvdGhlcikgewotICBsb2NhdGlvbl8tPnNldF9zcGFuKDAsIG90aGVyLmxvY2F0aW9uXy0+c3BhbigwKSk7Ci0gIGxvY2F0aW9uXy0+c2V0X3NwYW4oMSwgb3RoZXIubG9jYXRpb25fLT5zcGFuKDEpKTsKLX0KLQotdm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OkVuZEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbikgewotICBpZiAodG9rZW4ubGluZSAhPSBsb2NhdGlvbl8tPnNwYW4oMCkpIHsKLSAgICBsb2NhdGlvbl8tPmFkZF9zcGFuKHRva2VuLmxpbmUpOwotICB9Ci0gIGxvY2F0aW9uXy0+YWRkX3NwYW4odG9rZW4uZW5kX2NvbHVtbik7Ci19Ci0KLXZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpSZWNvcmRMZWdhY3lMb2NhdGlvbihjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAotICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbikgewotICBpZiAocGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXyAhPSBOVUxMKSB7Ci0gICAgcGFyc2VyXy0+c291cmNlX2xvY2F0aW9uX3RhYmxlXy0+QWRkKAotICAgICAgICBkZXNjcmlwdG9yLCBsb2NhdGlvbiwgbG9jYXRpb25fLT5zcGFuKDApLCBsb2NhdGlvbl8tPnNwYW4oMSkpOwotICB9Ci19Ci0KLXZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpBdHRhY2hDb21tZW50cygKLSAgICBzdHJpbmcqIGxlYWRpbmcsIHN0cmluZyogdHJhaWxpbmcsCi0gICAgdmVjdG9yPHN0cmluZz4qIGRldGFjaGVkX2NvbW1lbnRzKSBjb25zdCB7Ci0gIEdPT0dMRV9DSEVDSyghbG9jYXRpb25fLT5oYXNfbGVhZGluZ19jb21tZW50cygpKTsKLSAgR09PR0xFX0NIRUNLKCFsb2NhdGlvbl8tPmhhc190cmFpbGluZ19jb21tZW50cygpKTsKLQotICBpZiAoIWxlYWRpbmctPmVtcHR5KCkpIHsKLSAgICBsb2NhdGlvbl8tPm11dGFibGVfbGVhZGluZ19jb21tZW50cygpLT5zd2FwKCpsZWFkaW5nKTsKLSAgfQotICBpZiAoIXRyYWlsaW5nLT5lbXB0eSgpKSB7Ci0gICAgbG9jYXRpb25fLT5tdXRhYmxlX3RyYWlsaW5nX2NvbW1lbnRzKCktPnN3YXAoKnRyYWlsaW5nKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGRldGFjaGVkX2NvbW1lbnRzLT5zaXplKCk7ICsraSkgewotICAgIGxvY2F0aW9uXy0+YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKS0+c3dhcCgKLSAgICAgICAgKCpkZXRhY2hlZF9jb21tZW50cylbaV0pOwotICB9Ci0gIGRldGFjaGVkX2NvbW1lbnRzLT5jbGVhcigpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgUGFyc2VyOjpTa2lwU3RhdGVtZW50KCkgewotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmIChBdEVuZCgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1lNQk9MKSkgewotICAgICAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJ7IikpIHsKLSAgICAgICAgU2tpcFJlc3RPZkJsb2NrKCk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJ9IikpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0KLSAgICBpbnB1dF8tPk5leHQoKTsKLSAgfQotfQotCi12b2lkIFBhcnNlcjo6U2tpcFJlc3RPZkJsb2NrKCkgewotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmIChBdEVuZCgpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1lNQk9MKSkgewotICAgICAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgTlVMTCkpIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJ7IikpIHsKLSAgICAgICAgU2tpcFJlc3RPZkJsb2NrKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlucHV0Xy0+TmV4dCgpOwotICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotYm9vbCBQYXJzZXI6OlZhbGlkYXRlRW51bShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBwcm90bykgewotICBib29sIGhhc19hbGxvd19hbGlhcyA9IGZhbHNlOwotICBib29sIGFsbG93X2FsaWFzID0gZmFsc2U7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiBvcHRpb24gPSBwcm90by0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpOwotICAgIGlmIChvcHRpb24ubmFtZV9zaXplKCkgPiAxKSB7Ci0gICAgICBjb250aW51ZTsKLSAgICB9Ci0gICAgaWYgKCFvcHRpb24ubmFtZSgwKS5pc19leHRlbnNpb24oKSAmJgotICAgICAgICBvcHRpb24ubmFtZSgwKS5uYW1lX3BhcnQoKSA9PSAiYWxsb3dfYWxpYXMiKSB7Ci0gICAgICBoYXNfYWxsb3dfYWxpYXMgPSB0cnVlOwotICAgICAgaWYgKG9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKCkgPT0gInRydWUiKSB7Ci0gICAgICAgIGFsbG93X2FsaWFzID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChoYXNfYWxsb3dfYWxpYXMgJiYgIWFsbG93X2FsaWFzKSB7Ci0gICAgc3RyaW5nIGVycm9yID0KLSAgICAgICAgIlwiIiArIHByb3RvLT5uYW1lKCkgKwotICAgICAgICAiXCIgZGVjbGFyZXMgJ29wdGlvbiBhbGxvd19hbGlhcyA9IGZhbHNlOycgd2hpY2ggaGFzIG5vIGVmZmVjdC4gIgotICAgICAgICAiUGxlYXNlIHJlbW92ZSB0aGUgZGVjbGFyYXRpb24uIjsKLSAgICAvLyBUaGlzIG5lZWRsZXNzbHkgY2x1dHRlcnMgZGVjbGFyYXRpb25zIHdpdGggbm9wcy4KLSAgICBBZGRFcnJvcihlcnJvcik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc2V0PGludD4gdXNlZF92YWx1ZXM7Ci0gIGJvb2wgaGFzX2R1cGxpY2F0ZXMgPSBmYWxzZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by0+dmFsdWVfc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gZW51bV92YWx1ZSA9IHByb3RvLT52YWx1ZShpKTsKLSAgICBpZiAodXNlZF92YWx1ZXMuZmluZChlbnVtX3ZhbHVlLm51bWJlcigpKSAhPSB1c2VkX3ZhbHVlcy5lbmQoKSkgewotICAgICAgaGFzX2R1cGxpY2F0ZXMgPSB0cnVlOwotICAgICAgYnJlYWs7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVzZWRfdmFsdWVzLmluc2VydChlbnVtX3ZhbHVlLm51bWJlcigpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGFsbG93X2FsaWFzICYmICFoYXNfZHVwbGljYXRlcykgewotICAgIHN0cmluZyBlcnJvciA9Ci0gICAgICAgICJcIiIgKyBwcm90by0+bmFtZSgpICsKLSAgICAgICAgIlwiIGRlY2xhcmVzIHN1cHBvcnQgZm9yIGVudW0gYWxpYXNlcyBidXQgbm8gZW51bSB2YWx1ZXMgc2hhcmUgZmllbGQgIgotICAgICAgICAibnVtYmVycy4gUGxlYXNlIHJlbW92ZSB0aGUgdW5uZWNlc3NhcnkgJ29wdGlvbiBhbGxvd19hbGlhcyA9IHRydWU7JyAiCi0gICAgICAgICJkZWNsYXJhdGlvbi4iOwotICAgIC8vIEdlbmVyYXRlIGFuIGVycm9yIGlmIGFuIGVudW0gZGVjbGFyZXMgc3VwcG9ydCBmb3IgZHVwbGljYXRlIGVudW0gdmFsdWVzCi0gICAgLy8gYW5kIGRvZXMgbm90IHVzZSBpdCBwcm90ZWN0IGZ1dHVyZSBhdXRob3JzLgotICAgIEFkZEVycm9yKGVycm9yKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZXI6OlBhcnNlKGlvOjpUb2tlbml6ZXIqIGlucHV0LCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKSB7Ci0gIGlucHV0XyA9IGlucHV0OwotICBoYWRfZXJyb3JzXyA9IGZhbHNlOwotICBzeW50YXhfaWRlbnRpZmllcl8uY2xlYXIoKTsKLQotICAvLyBOb3RlIHRoYXQgfGZpbGV8IGNvdWxkIGJlIE5VTEwgYXQgdGhpcyBwb2ludCBpZgotICAvLyBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXyBpcyB0cnVlLiAgU28sIHdlIGNvbnNlcnZhdGl2ZWx5IGFsbG9jYXRlCi0gIC8vIFNvdXJjZUNvZGVJbmZvIG9uIHRoZSBzdGFjaywgdGhlbiBzd2FwIGl0IGludG8gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8KLSAgLy8gbGF0ZXIgb24uCi0gIFNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm87Ci0gIHNvdXJjZV9jb2RlX2luZm9fID0gJnNvdXJjZV9jb2RlX2luZm87Ci0KLSAgdmVjdG9yPHN0cmluZz4gdG9wX2RvY19jb21tZW50czsKLSAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVEFSVCkpIHsKLSAgICAvLyBBZHZhbmNlIHRvIGZpcnN0IHRva2VuLgotICAgIGlucHV0Xy0+TmV4dFdpdGhDb21tZW50cyhOVUxMLCAmdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBjb21pbmdfZG9jX2NvbW1lbnRzXyk7Ci0gIH0KLQotICB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciByb290X2xvY2F0aW9uKHRoaXMpOwotCi0gICAgaWYgKHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfIHx8IExvb2tpbmdBdCgic3ludGF4IikpIHsKLSAgICAgIGlmICghUGFyc2VTeW50YXhJZGVudGlmaWVyKHJvb3RfbG9jYXRpb24pKSB7Ci0gICAgICAgIC8vIERvbid0IGF0dGVtcHQgdG8gcGFyc2UgdGhlIGZpbGUgaWYgd2UgZGlkbid0IHJlY29nbml6ZSB0aGUgc3ludGF4Ci0gICAgICAgIC8vIGlkZW50aWZpZXIuCi0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIC8vIFN0b3JlIHRoZSBzeW50YXggaW50byB0aGUgZmlsZS4KLSAgICAgIGlmIChmaWxlICE9IE5VTEwpIGZpbGUtPnNldF9zeW50YXgoc3ludGF4X2lkZW50aWZpZXJfKTsKLSAgICB9IGVsc2UgaWYgKCFzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXykgewotICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiTm8gc3ludGF4IHNwZWNpZmllZCBmb3IgdGhlIHByb3RvIGZpbGU6ICIKLSAgICAgICAgICAgICAgICAgICA8PCBmaWxlLT5uYW1lKCkgPDwgIi4gUGxlYXNlIHVzZSAnc3ludGF4ID0gXCJwcm90bzJcIjsnICIKLSAgICAgICAgICAgICAgICAgICA8PCAib3IgJ3N5bnRheCA9IFwicHJvdG8zXCI7JyB0byBzcGVjaWZ5IGEgc3ludGF4ICIKLSAgICAgICAgICAgICAgICAgICA8PCAidmVyc2lvbi4gKERlZmF1bHRlZCB0byBwcm90bzIgc3ludGF4LikiOwotICAgICAgc3ludGF4X2lkZW50aWZpZXJfID0gInByb3RvMiI7Ci0gICAgfQotCi0gICAgaWYgKHN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfKSByZXR1cm4gIWhhZF9lcnJvcnNfOwotCi0gICAgLy8gUmVwZWF0ZWRseSBwYXJzZSBzdGF0ZW1lbnRzIHVudGlsIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlIGZpbGUuCi0gICAgd2hpbGUgKCFBdEVuZCgpKSB7Ci0gICAgICBpZiAoIVBhcnNlVG9wTGV2ZWxTdGF0ZW1lbnQoZmlsZSwgcm9vdF9sb2NhdGlvbikpIHsKLSAgICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQotICAgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgotICAgICAgICBTa2lwU3RhdGVtZW50KCk7Ci0KLSAgICAgICAgaWYgKExvb2tpbmdBdCgifSIpKSB7Ci0gICAgICAgICAgQWRkRXJyb3IoIlVubWF0Y2hlZCBcIn1cIi4iKTsKLSAgICAgICAgICBpbnB1dF8tPk5leHRXaXRoQ29tbWVudHMoTlVMTCwgJnVwY29taW5nX2RldGFjaGVkX2NvbW1lbnRzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVwY29taW5nX2RvY19jb21tZW50c18pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaW5wdXRfID0gTlVMTDsKLSAgc291cmNlX2NvZGVfaW5mb18gPSBOVUxMOwotICBzb3VyY2VfY29kZV9pbmZvLlN3YXAoZmlsZS0+bXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCkpOwotICByZXR1cm4gIWhhZF9lcnJvcnNfOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VTeW50YXhJZGVudGlmaWVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCkgewotICBMb2NhdGlvblJlY29yZGVyIHN5bnRheF9sb2NhdGlvbihwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTeW50YXhGaWVsZE51bWJlcik7Ci0gIERPKENvbnN1bWUoCi0gICAgICAic3ludGF4IiwKLSAgICAgICJGaWxlIG11c3QgYmVnaW4gd2l0aCBhIHN5bnRheCBzdGF0ZW1lbnQsIGUuZy4gJ3N5bnRheCA9IFwicHJvdG8yXCI7Jy4iKSk7Ci0gIERPKENvbnN1bWUoIj0iKSk7Ci0gIGlvOjpUb2tlbml6ZXI6OlRva2VuIHN5bnRheF90b2tlbiA9IGlucHV0Xy0+Y3VycmVudCgpOwotICBzdHJpbmcgc3ludGF4OwotICBETyhDb25zdW1lU3RyaW5nKCZzeW50YXgsICJFeHBlY3RlZCBzeW50YXggaWRlbnRpZmllci4iKSk7Ci0gIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJnN5bnRheF9sb2NhdGlvbikpOwotCi0gIHN5bnRheF9pZGVudGlmaWVyXyA9IHN5bnRheDsKLQotICBpZiAoc3ludGF4ICE9ICJwcm90bzIiICYmIHN5bnRheCAhPSAicHJvdG8zIiAmJgotICAgICAgIXN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfKSB7Ci0gICAgQWRkRXJyb3Ioc3ludGF4X3Rva2VuLmxpbmUsIHN5bnRheF90b2tlbi5jb2x1bW4sCi0gICAgICAiVW5yZWNvZ25pemVkIHN5bnRheCBpZGVudGlmaWVyIFwiIiArIHN5bnRheCArICJcIi4gIFRoaXMgcGFyc2VyICIKLSAgICAgICJvbmx5IHJlY29nbml6ZXMgXCJwcm90bzJcIiBhbmQgXCJwcm90bzNcIi4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZXI6OlBhcnNlVG9wTGV2ZWxTdGF0ZW1lbnQoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24pIHsKLSAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgTlVMTCkpIHsKLSAgICAvLyBlbXB0eSBzdGF0ZW1lbnQ7IGlnbm9yZQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKExvb2tpbmdBdCgibWVzc2FnZSIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAotICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsIGZpbGUtPm1lc3NhZ2VfdHlwZV9zaXplKCkpOwotICAgIHJldHVybiBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKGZpbGUtPmFkZF9tZXNzYWdlX3R5cGUoKSwgbG9jYXRpb24sIGZpbGUpOwotICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZW51bSIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAotICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIsIGZpbGUtPmVudW1fdHlwZV9zaXplKCkpOwotICAgIHJldHVybiBQYXJzZUVudW1EZWZpbml0aW9uKGZpbGUtPmFkZF9lbnVtX3R5cGUoKSwgbG9jYXRpb24sIGZpbGUpOwotICB9IGVsc2UgaWYgKExvb2tpbmdBdCgic2VydmljZSIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAotICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlciwgZmlsZS0+c2VydmljZV9zaXplKCkpOwotICAgIHJldHVybiBQYXJzZVNlcnZpY2VEZWZpbml0aW9uKGZpbGUtPmFkZF9zZXJ2aWNlKCksIGxvY2F0aW9uLCBmaWxlKTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoImV4dGVuZCIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAotICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOwotICAgIHJldHVybiBQYXJzZUV4dGVuZChmaWxlLT5tdXRhYmxlX2V4dGVuc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICByb290X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGZpbGUpOwotICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiaW1wb3J0IikpIHsKLSAgICByZXR1cm4gUGFyc2VJbXBvcnQoZmlsZS0+bXV0YWJsZV9kZXBlbmRlbmN5KCksCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbGUtPm11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSwKLSAgICAgICAgICAgICAgICAgICAgICAgZmlsZS0+bXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKSwKLSAgICAgICAgICAgICAgICAgICAgICAgcm9vdF9sb2NhdGlvbiwgZmlsZSk7Ci0gIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJwYWNrYWdlIikpIHsKLSAgICByZXR1cm4gUGFyc2VQYWNrYWdlKGZpbGUsIHJvb3RfbG9jYXRpb24sIGZpbGUpOwotICB9IGVsc2UgaWYgKExvb2tpbmdBdCgib3B0aW9uIikpIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCi0gICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOwotICAgIHJldHVybiBQYXJzZU9wdGlvbihmaWxlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24sIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIE9QVElPTl9TVEFURU1FTlQpOwotICB9IGVsc2UgewotICAgIEFkZEVycm9yKCJFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS4iKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWVzc2FnZXMKLQotYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZURlZmluaXRpb24oCi0gICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIERPKENvbnN1bWUoIm1lc3NhZ2UiKSk7Ci0gIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOwotICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgICBtZXNzYWdlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOwotICAgIERPKENvbnN1bWVJZGVudGlmaWVyKG1lc3NhZ2UtPm11dGFibGVfbmFtZSgpLCAiRXhwZWN0ZWQgbWVzc2FnZSBuYW1lLiIpKTsKLSAgfQotICBETyhQYXJzZU1lc3NhZ2VCbG9jayhtZXNzYWdlLCBtZXNzYWdlX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IGludCBrTWF4RXh0ZW5zaW9uUmFuZ2VTZW50aW5lbCA9IC0xOwotCi1ib29sIElzTWVzc2FnZVNldFdpcmVGb3JtYXRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3JQcm90byYgbWVzc2FnZSkgewotICBjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucyA9IG1lc3NhZ2Uub3B0aW9ucygpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkID0gb3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbihpKTsKLSAgICBpZiAodW5pbnRlcnByZXRlZC5uYW1lX3NpemUoKSA9PSAxICYmCi0gICAgICAgIHVuaW50ZXJwcmV0ZWQubmFtZSgwKS5uYW1lX3BhcnQoKSA9PSAibWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQiICYmCi0gICAgICAgIHVuaW50ZXJwcmV0ZWQuaWRlbnRpZmllcl92YWx1ZSgpID09ICJ0cnVlIikgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gTW9kaWZpZXMgYW55IGV4dGVuc2lvbiByYW5nZXMgdGhhdCBzcGVjaWZpZWQgJ21heCcgYXMgdGhlIGVuZCBvZiB0aGUKLS8vIGV4dGVuc2lvbiByYW5nZSwgYW5kIHNldHMgdGhlbSB0byB0aGUgdHlwZS1zcGVjaWZpYyBtYXhpbXVtLiBUaGUgYWN0dWFsIG1heAotLy8gdGFnIG51bWJlciBjYW4gb25seSBiZSBkZXRlcm1pbmVkIGFmdGVyIGFsbCBvcHRpb25zIGhhdmUgYmVlbiBwYXJzZWQuCi12b2lkIEFkanVzdEV4dGVuc2lvblJhbmdlc1dpdGhNYXhFbmROdW1iZXIoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IGJvb2wgaXNfbWVzc2FnZV9zZXQgPSBJc01lc3NhZ2VTZXRXaXJlRm9ybWF0TWVzc2FnZSgqbWVzc2FnZSk7Ci0gIGNvbnN0IGludCBtYXhfZXh0ZW5zaW9uX251bWJlciA9IGlzX21lc3NhZ2Vfc2V0ID8KLSAgICAgIGtpbnQzMm1heCA6Ci0gICAgICBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCk7ICsraSkgewotICAgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2UoaSkuZW5kKCkgPT0ga01heEV4dGVuc2lvblJhbmdlU2VudGluZWwpIHsKLSAgICAgIG1lc3NhZ2UtPm11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKGkpLT5zZXRfZW5kKG1heF9leHRlbnNpb25fbnVtYmVyKTsKLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgUGFyc2VyOjpQYXJzZU1lc3NhZ2VCbG9jayhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKLSAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oInsiLCAmbWVzc2FnZV9sb2NhdGlvbikpOwotCi0gIHdoaWxlICghVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBOVUxMKSkgewotICAgIGlmIChBdEVuZCgpKSB7Ci0gICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWVzc2FnZSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFQYXJzZU1lc3NhZ2VTdGF0ZW1lbnQobWVzc2FnZSwgbWVzc2FnZV9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSkgewotICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQotICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KLSAgICAgIFNraXBTdGF0ZW1lbnQoKTsKLSAgICB9Ci0gIH0KLQotICBpZiAobWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSA+IDApIHsKLSAgICBBZGp1c3RFeHRlbnNpb25SYW5nZXNXaXRoTWF4RW5kTnVtYmVyKG1lc3NhZ2UpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlU3RhdGVtZW50KERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsIE5VTEwpKSB7Ci0gICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoIm1lc3NhZ2UiKSkgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPm5lc3RlZF90eXBlX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlTWVzc2FnZURlZmluaXRpb24obWVzc2FnZS0+YWRkX25lc3RlZF90eXBlKCksIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJlbnVtIikpIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZW51bV90eXBlX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlRW51bURlZmluaXRpb24obWVzc2FnZS0+YWRkX2VudW1fdHlwZSgpLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpOwotICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZXh0ZW5zaW9ucyIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlRXh0ZW5zaW9ucyhtZXNzYWdlLCBsb2NhdGlvbiwgY29udGFpbmluZ19maWxlKTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoInJlc2VydmVkIikpIHsKLSAgICByZXR1cm4gUGFyc2VSZXNlcnZlZChtZXNzYWdlLCBtZXNzYWdlX2xvY2F0aW9uKTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoImV4dGVuZCIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOwotICAgIHJldHVybiBQYXJzZUV4dGVuZChtZXNzYWdlLT5tdXRhYmxlX2V4dGVuc2lvbigpLAotICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5tdXRhYmxlX25lc3RlZF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvcHRpb24iKSkgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlT3B0aW9uKG1lc3NhZ2UtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlLCBPUFRJT05fU1RBVEVNRU5UKTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9uZW9mIikpIHsKLSAgICBpbnQgb25lb2ZfaW5kZXggPSBtZXNzYWdlLT5vbmVvZl9kZWNsX3NpemUoKTsKLSAgICBMb2NhdGlvblJlY29yZGVyIG9uZW9mX2xvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtPbmVvZkRlY2xGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZW9mX2luZGV4KTsKLQotICAgIHJldHVybiBQYXJzZU9uZW9mKG1lc3NhZ2UtPmFkZF9vbmVvZl9kZWNsKCksIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgb25lb2ZfaW5kZXgsIG9uZW9mX2xvY2F0aW9uLCBtZXNzYWdlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIH0gZWxzZSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRmllbGRGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlTWVzc2FnZUZpZWxkKG1lc3NhZ2UtPmFkZF9maWVsZCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5tdXRhYmxlX25lc3RlZF90eXBlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIH0KLX0KLQotYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZUZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKLSAgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0xhYmVsRmllbGROdW1iZXIpOwotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbDsKLSAgICBpZiAoUGFyc2VMYWJlbCgmbGFiZWwsIGNvbnRhaW5pbmdfZmlsZSkpIHsKLSAgICAgIGZpZWxkLT5zZXRfbGFiZWwobGFiZWwpOwotICAgICAgaWYgKGxhYmVsID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCAmJgotICAgICAgICAgIHN5bnRheF9pZGVudGlmaWVyXyA9PSAicHJvdG8zIikgewotICAgICAgICBBZGRFcnJvcigKLSAgICAgICAgICAgICJFeHBsaWNpdCAnb3B0aW9uYWwnIGxhYmVscyBhcmUgZGlzYWxsb3dlZCBpbiB0aGUgUHJvdG8zIHN5bnRheC4gIgotICAgICAgICAgICAgIlRvIGRlZmluZSAnb3B0aW9uYWwnIGZpZWxkcyBpbiBQcm90bzMsIHNpbXBseSByZW1vdmUgdGhlICIKLSAgICAgICAgICAgICInb3B0aW9uYWwnIGxhYmVsLCBhcyBmaWVsZHMgYXJlICdvcHRpb25hbCcgYnkgZGVmYXVsdC4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gUGFyc2VNZXNzYWdlRmllbGROb0xhYmVsKGZpZWxkLCBtZXNzYWdlcywgcGFyZW50X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKTsKLX0KLQotYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZUZpZWxkTm9MYWJlbCgKLSAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCi0gICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKLSAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCi0gICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCi0gICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIE1hcEZpZWxkIG1hcF9maWVsZDsKLSAgLy8gUGFyc2UgdHlwZS4KLSAgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24pOyAgLy8gYWRkIHBhdGggbGF0ZXIKLSAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbihmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFKTsKLQotICAgIGJvb2wgdHlwZV9wYXJzZWQgPSBmYWxzZTsKLSAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZSB0eXBlID0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzI7Ci0gICAgc3RyaW5nIHR5cGVfbmFtZTsKLQotICAgIC8vIFNwZWNpYWwgY2FzZSBtYXAgZmllbGQuIFdlIG9ubHkgdHJlYXQgdGhlIGZpZWxkIGFzIGEgbWFwIGZpZWxkIGlmIHRoZQotICAgIC8vIGZpZWxkIHR5cGUgbmFtZSBzdGFydHMgd2l0aCB0aGUgd29yZCAibWFwIiB3aXRoIGEgZm9sbG93aW5nICI8Ii4KLSAgICBpZiAoVHJ5Q29uc3VtZSgibWFwIikpIHsKLSAgICAgIGlmIChMb29raW5nQXQoIjwiKSkgewotICAgICAgICBtYXBfZmllbGQuaXNfbWFwX2ZpZWxkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIEZhbHNlIHBvc2l0aXZlCi0gICAgICAgIHR5cGVfcGFyc2VkID0gdHJ1ZTsKLSAgICAgICAgdHlwZV9uYW1lID0gIm1hcCI7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChtYXBfZmllbGQuaXNfbWFwX2ZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQtPmhhc19vbmVvZl9pbmRleCgpKSB7Ci0gICAgICAgIEFkZEVycm9yKCJNYXAgZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBvbmVvZnMuIik7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZC0+aGFzX2xhYmVsKCkpIHsKLSAgICAgICAgQWRkRXJyb3IoCi0gICAgICAgICAgICAiRmllbGQgbGFiZWxzIChyZXF1aXJlZC9vcHRpb25hbC9yZXBlYXRlZCkgYXJlIG5vdCBhbGxvd2VkIG9uICIKLSAgICAgICAgICAgICJtYXAgZmllbGRzLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGQtPmhhc19leHRlbmRlZSgpKSB7Ci0gICAgICAgIEFkZEVycm9yKCJNYXAgZmllbGRzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBleHRlbnNpb25zLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaWVsZC0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCk7Ci0gICAgICBETyhDb25zdW1lKCI8IikpOwotICAgICAgRE8oUGFyc2VUeXBlKCZtYXBfZmllbGQua2V5X3R5cGUsICZtYXBfZmllbGQua2V5X3R5cGVfbmFtZSkpOwotICAgICAgRE8oQ29uc3VtZSgiLCIpKTsKLSAgICAgIERPKFBhcnNlVHlwZSgmbWFwX2ZpZWxkLnZhbHVlX3R5cGUsICZtYXBfZmllbGQudmFsdWVfdHlwZV9uYW1lKSk7Ci0gICAgICBETyhDb25zdW1lKCI+IikpOwotICAgICAgLy8gRGVmZXIgc2V0dGluZyBvZiB0aGUgdHlwZSBuYW1lIG9mIHRoZSBtYXAgZmllbGQgdW50aWwgdGhlCi0gICAgICAvLyBmaWVsZCBuYW1lIGlzIHBhcnNlZC4gQWRkIHRoZSBzb3VyY2UgbG9jYXRpb24gdGhvdWdoLgotICAgICAgbG9jYXRpb24uQWRkUGF0aChGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVOYW1lRmllbGROdW1iZXIpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgbm8gZXhwbGljaXQgbGFiZWwgaXMgZ2l2ZW4gZm9yIGEgbm9uLW1hcCBmaWVsZC4KLSAgICAgIGlmICghZmllbGQtPmhhc19sYWJlbCgpICYmIERlZmF1bHRUb09wdGlvbmFsRmllbGRzKCkpIHsKLSAgICAgICAgZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwpOwotICAgICAgfQotICAgICAgaWYgKCFmaWVsZC0+aGFzX2xhYmVsKCkpIHsKLSAgICAgICAgQWRkRXJyb3IoIkV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuIik7Ci0gICAgICAgIC8vIFdlIGNhbiBhY3R1YWxseSByZWFzb25hYmx5IHJlY292ZXIgaGVyZSBieSBqdXN0IGFzc3VtaW5nIHRoZSB1c2VyCi0gICAgICAgIC8vIGZvcmdvdCB0aGUgbGFiZWwgYWx0b2dldGhlci4KLSAgICAgICAgZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwpOwotICAgICAgfQotCi0gICAgICAvLyBIYW5kbGUgdGhlIGNhc2Ugd2hlcmUgdGhlIGFjdHVhbCB0eXBlIGlzIGEgbWVzc2FnZSBvciBlbnVtIG5hbWVkICJtYXAiLAotICAgICAgLy8gd2hpY2ggd2UgYWxyZWFkeSBjb25zdW1lZCBpbiB0aGUgY29kZSBhYm92ZS4KLSAgICAgIGlmICghdHlwZV9wYXJzZWQpIHsKLSAgICAgICAgRE8oUGFyc2VUeXBlKCZ0eXBlLCAmdHlwZV9uYW1lKSk7Ci0gICAgICB9Ci0gICAgICBpZiAodHlwZV9uYW1lLmVtcHR5KCkpIHsKLSAgICAgICAgbG9jYXRpb24uQWRkUGF0aChGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVGaWVsZE51bWJlcik7Ci0gICAgICAgIGZpZWxkLT5zZXRfdHlwZSh0eXBlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxvY2F0aW9uLkFkZFBhdGgoRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlTmFtZUZpZWxkTnVtYmVyKTsKLSAgICAgICAgZmllbGQtPnNldF90eXBlX25hbWUodHlwZV9uYW1lKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBQYXJzZSBuYW1lIGFuZCAnPScuCi0gIGlvOjpUb2tlbml6ZXI6OlRva2VuIG5hbWVfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKLSAgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcik7Ci0gICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oZmllbGQsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7Ci0gICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoZmllbGQtPm11dGFibGVfbmFtZSgpLCAiRXhwZWN0ZWQgZmllbGQgbmFtZS4iKSk7Ci0gIH0KLSAgRE8oQ29uc3VtZSgiPSIsICJNaXNzaW5nIGZpZWxkIG51bWJlci4iKSk7Ci0KLSAgLy8gUGFyc2UgZmllbGQgbnVtYmVyLgotICB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprTnVtYmVyRmllbGROdW1iZXIpOwotICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgICBmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIpOwotICAgIGludCBudW1iZXI7Ci0gICAgRE8oQ29uc3VtZUludGVnZXIoJm51bWJlciwgIkV4cGVjdGVkIGZpZWxkIG51bWJlci4iKSk7Ci0gICAgZmllbGQtPnNldF9udW1iZXIobnVtYmVyKTsKLSAgfQotCi0gIC8vIFBhcnNlIG9wdGlvbnMuCi0gIERPKFBhcnNlRmllbGRPcHRpb25zKGZpZWxkLCBmaWVsZF9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSk7Ci0KLSAgLy8gRGVhbCB3aXRoIGdyb3Vwcy4KLSAgaWYgKGZpZWxkLT5oYXNfdHlwZSgpICYmIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVApIHsKLSAgICAvLyBBd2t3YXJkOiAgU2luY2UgYSBncm91cCBkZWNsYXJlcyBib3RoIGEgbWVzc2FnZSB0eXBlIGFuZCBhIGZpZWxkLCB3ZQotICAgIC8vICAgaGF2ZSB0byBjcmVhdGUgb3ZlcmxhcHBpbmcgbG9jYXRpb25zLgotICAgIExvY2F0aW9uUmVjb3JkZXIgZ3JvdXBfbG9jYXRpb24ocGFyZW50X2xvY2F0aW9uKTsKLSAgICBncm91cF9sb2NhdGlvbi5TdGFydEF0KGZpZWxkX2xvY2F0aW9uKTsKLSAgICBncm91cF9sb2NhdGlvbi5BZGRQYXRoKGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUpOwotICAgIGdyb3VwX2xvY2F0aW9uLkFkZFBhdGgobWVzc2FnZXMtPnNpemUoKSk7Ci0KLSAgICBEZXNjcmlwdG9yUHJvdG8qIGdyb3VwID0gbWVzc2FnZXMtPkFkZCgpOwotICAgIGdyb3VwLT5zZXRfbmFtZShmaWVsZC0+bmFtZSgpKTsKLQotICAgIC8vIFJlY29yZCBuYW1lIGxvY2F0aW9uIHRvIG1hdGNoIHRoZSBmaWVsZCBuYW1lJ3MgbG9jYXRpb24uCi0gICAgewotICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihncm91cF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKLSAgICAgIGxvY2F0aW9uLlN0YXJ0QXQobmFtZV90b2tlbik7Ci0gICAgICBsb2NhdGlvbi5FbmRBdChuYW1lX3Rva2VuKTsKLSAgICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgICAgIGdyb3VwLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOwotICAgIH0KLQotICAgIC8vIFRoZSBmaWVsZCdzIHR5cGVfbmFtZSBhbHNvIGNvbWVzIGZyb20gdGhlIG5hbWUuICBDb25mdXNpbmchCi0gICAgewotICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlTmFtZUZpZWxkTnVtYmVyKTsKLSAgICAgIGxvY2F0aW9uLlN0YXJ0QXQobmFtZV90b2tlbik7Ci0gICAgICBsb2NhdGlvbi5FbmRBdChuYW1lX3Rva2VuKTsKLSAgICB9Ci0KLSAgICAvLyBBcyBhIGhhY2sgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LCB3ZSBmb3JjZSB0aGUgZ3JvdXAgbmFtZSB0byBzdGFydAotICAgIC8vIHdpdGggYSBjYXBpdGFsIGxldHRlciBhbmQgbG93ZXItY2FzZSB0aGUgZmllbGQgbmFtZS4gIE5ldyBjb2RlIHNob3VsZAotICAgIC8vIG5vdCB1c2UgZ3JvdXBzOyBpdCBzaG91bGQgdXNlIG5lc3RlZCBtZXNzYWdlcy4KLSAgICBpZiAoZ3JvdXAtPm5hbWUoKVswXSA8ICdBJyB8fCAnWicgPCBncm91cC0+bmFtZSgpWzBdKSB7Ci0gICAgICBBZGRFcnJvcihuYW1lX3Rva2VuLmxpbmUsIG5hbWVfdG9rZW4uY29sdW1uLAotICAgICAgICAiR3JvdXAgbmFtZXMgbXVzdCBzdGFydCB3aXRoIGEgY2FwaXRhbCBsZXR0ZXIuIik7Ci0gICAgfQotICAgIExvd2VyU3RyaW5nKGZpZWxkLT5tdXRhYmxlX25hbWUoKSk7Ci0KLSAgICBmaWVsZC0+c2V0X3R5cGVfbmFtZShncm91cC0+bmFtZSgpKTsKLSAgICBpZiAoTG9va2luZ0F0KCJ7IikpIHsKLSAgICAgIERPKFBhcnNlTWVzc2FnZUJsb2NrKGdyb3VwLCBncm91cF9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZEVycm9yKCJNaXNzaW5nIGdyb3VwIGJvZHkuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmZpZWxkX2xvY2F0aW9uKSk7Ci0gIH0KLQotICAvLyBDcmVhdGUgYSBtYXAgZW50cnkgdHlwZSBpZiB0aGlzIGlzIGEgbWFwIGZpZWxkLgotICBpZiAobWFwX2ZpZWxkLmlzX21hcF9maWVsZCkgewotICAgIEdlbmVyYXRlTWFwRW50cnkobWFwX2ZpZWxkLCBmaWVsZCwgbWVzc2FnZXMpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgUGFyc2VyOjpHZW5lcmF0ZU1hcEVudHJ5KGNvbnN0IE1hcEZpZWxkJiBtYXBfZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzKSB7Ci0gIERlc2NyaXB0b3JQcm90byogZW50cnkgPSBtZXNzYWdlcy0+QWRkKCk7Ci0gIHN0cmluZyBlbnRyeV9uYW1lID0gTWFwRW50cnlOYW1lKGZpZWxkLT5uYW1lKCkpOwotICBmaWVsZC0+c2V0X3R5cGVfbmFtZShlbnRyeV9uYW1lKTsKLSAgZW50cnktPnNldF9uYW1lKGVudHJ5X25hbWUpOwotICBlbnRyeS0+bXV0YWJsZV9vcHRpb25zKCktPnNldF9tYXBfZW50cnkodHJ1ZSk7Ci0gIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXlfZmllbGQgPSBlbnRyeS0+YWRkX2ZpZWxkKCk7Ci0gIGtleV9maWVsZC0+c2V0X25hbWUoImtleSIpOwotICBrZXlfZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwpOwotICBrZXlfZmllbGQtPnNldF9udW1iZXIoMSk7Ci0gIGlmIChtYXBfZmllbGQua2V5X3R5cGVfbmFtZS5lbXB0eSgpKSB7Ci0gICAga2V5X2ZpZWxkLT5zZXRfdHlwZShtYXBfZmllbGQua2V5X3R5cGUpOwotICB9IGVsc2UgewotICAgIGtleV9maWVsZC0+c2V0X3R5cGVfbmFtZShtYXBfZmllbGQua2V5X3R5cGVfbmFtZSk7Ci0gIH0KLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHZhbHVlX2ZpZWxkID0gZW50cnktPmFkZF9maWVsZCgpOwotICB2YWx1ZV9maWVsZC0+c2V0X25hbWUoInZhbHVlIik7Ci0gIHZhbHVlX2ZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKLSAgdmFsdWVfZmllbGQtPnNldF9udW1iZXIoMik7Ci0gIGlmIChtYXBfZmllbGQudmFsdWVfdHlwZV9uYW1lLmVtcHR5KCkpIHsKLSAgICB2YWx1ZV9maWVsZC0+c2V0X3R5cGUobWFwX2ZpZWxkLnZhbHVlX3R5cGUpOwotICB9IGVsc2UgewotICAgIHZhbHVlX2ZpZWxkLT5zZXRfdHlwZV9uYW1lKG1hcF9maWVsZC52YWx1ZV90eXBlX25hbWUpOwotICB9Ci0gIC8vIFByb3BhZ2F0ZSB0aGUgImVuZm9yY2VfdXRmOCIgb3B0aW9uIHRvIGtleSBhbmQgdmFsdWUgZmllbGRzIGlmIHRoZXkKLSAgLy8gYXJlIHN0cmluZ3MuIFRoaXMgaGVscHMgc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNvZGUgZ2VuZXJhdG9ycwotICAvLyBhbmQgYWxzbyByZWZsZWN0aW9uLWJhc2VkIHBhcnNpbmcgY29kZS4KLSAgLy8KLSAgLy8gVGhlIGZvbGxvd2luZyBkZWZpbml0aW9uOgotICAvLyAgIG1lc3NhZ2UgRm9vIHsKLSAgLy8gICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFsdWUgPSAxIFtlbmZvcmNlX3V0ZjggPSBmYWxzZV07Ci0gIC8vICAgfQotICAvLyB3aWxsIGJlIGludGVycHJldGVkIGFzOgotICAvLyAgIG1lc3NhZ2UgRm9vIHsKLSAgLy8gICAgIG1lc3NhZ2UgVmFsdWVFbnRyeSB7Ci0gIC8vICAgICAgIG9wdGlvbiBtYXBfZW50cnkgPSB0cnVlOwotICAvLyAgICAgICBzdHJpbmcga2V5ID0gMSBbZW5mb3JjZV91dGY4ID0gZmFsc2VdOwotICAvLyAgICAgICBzdHJpbmcgdmFsdWUgPSAyIFtlbmZvcmNlX3V0ZjggPSBmYWxzZV07Ci0gIC8vICAgICB9Ci0gIC8vICAgICByZXBlYXRlZCBWYWx1ZUVudHJ5IHZhbHVlID0gMSBbZW5mb3JjZV91dGY4ID0gZmFsc2VdOwotICAvLyAgfQotICAvLwotICAvLyBUT0RPKHhpYW9mZW5nKTogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgImVuZm9yY2VfdXRmOCIgb3B0aW9uIGlzIHJlbW92ZWQKLSAgLy8gZnJvbSBwcm90b2NvbCBjb21waWxlci4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZC0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgKytpKSB7Ci0gICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uID0KLSAgICAgICAgZmllbGQtPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbihpKTsKLSAgICBpZiAob3B0aW9uLm5hbWVfc2l6ZSgpID09IDEgJiYKLSAgICAgICAgb3B0aW9uLm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gImVuZm9yY2VfdXRmOCIgJiYKLSAgICAgICAgIW9wdGlvbi5uYW1lKDApLmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgICBpZiAoa2V5X2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgIGtleV9maWVsZC0+bXV0YWJsZV9vcHRpb25zKCktPmFkZF91bmludGVycHJldGVkX29wdGlvbigpCi0gICAgICAgICAgICAtPkNvcHlGcm9tKG9wdGlvbik7Ci0gICAgICB9Ci0gICAgICBpZiAodmFsdWVfZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpIHsKLSAgICAgICAgdmFsdWVfZmllbGQtPm11dGFibGVfb3B0aW9ucygpLT5hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKQotICAgICAgICAgICAgLT5Db3B5RnJvbShvcHRpb24pOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewotICBpZiAoIUxvb2tpbmdBdCgiWyIpKSByZXR1cm4gdHJ1ZTsKLQotICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKLQotICBETyhDb25zdW1lKCJbIikpOwotCi0gIC8vIFBhcnNlIGZpZWxkIG9wdGlvbnMuCi0gIGRvIHsKLSAgICBpZiAoTG9va2luZ0F0KCJkZWZhdWx0IikpIHsKLSAgICAgIC8vIFdlIGludGVudGlvbmFsbHkgcGFzcyBmaWVsZF9sb2NhdGlvbiByYXRoZXIgdGhhbiBsb2NhdGlvbiBoZXJlLCBzaW5jZQotICAgICAgLy8gdGhlIGRlZmF1bHQgdmFsdWUgaXMgbm90IGFjdHVhbGx5IGFuIG9wdGlvbi4KLSAgICAgIERPKFBhcnNlRGVmYXVsdEFzc2lnbm1lbnQoZmllbGQsIGZpZWxkX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKLSAgICB9IGVsc2UgaWYgKExvb2tpbmdBdCgianNvbl9uYW1lIikpIHsKLSAgICAgIC8vIExpa2UgZGVmYXVsdCB2YWx1ZSwgdGhpcyAianNvbl9uYW1lIiBpcyBub3QgYW4gYWN0dWFsIG9wdGlvbi4KLSAgICAgIERPKFBhcnNlSnNvbk5hbWUoZmllbGQsIGZpZWxkX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKLSAgICB9IGVsc2UgewotICAgICAgRE8oUGFyc2VPcHRpb24oZmllbGQtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSwgT1BUSU9OX0FTU0lHTk1FTlQpKTsKLSAgICB9Ci0gIH0gd2hpbGUgKFRyeUNvbnN1bWUoIiwiKSk7Ci0KLSAgRE8oQ29uc3VtZSgiXSIpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VyOjpQYXJzZURlZmF1bHRBc3NpZ25tZW50KAotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKLSAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKLSAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7Ci0gICAgQWRkRXJyb3IoIkFscmVhZHkgc2V0IG9wdGlvbiBcImRlZmF1bHRcIi4iKTsKLSAgICBmaWVsZC0+Y2xlYXJfZGVmYXVsdF92YWx1ZSgpOwotICB9Ci0KLSAgRE8oQ29uc3VtZSgiZGVmYXVsdCIpKTsKLSAgRE8oQ29uc3VtZSgiPSIpKTsKLQotICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprRGVmYXVsdFZhbHVlRmllbGROdW1iZXIpOwotICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKLSAgICAgIGZpZWxkLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUpOwotICBzdHJpbmcqIGRlZmF1bHRfdmFsdWUgPSBmaWVsZC0+bXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCk7Ci0KLSAgaWYgKCFmaWVsZC0+aGFzX3R5cGUoKSkgewotICAgIC8vIFRoZSBmaWVsZCBoYXMgYSB0eXBlIG5hbWUsIGJ1dCB3ZSBkb24ndCBrbm93IGlmIGl0IGlzIGEgbWVzc2FnZSBvciBhbgotICAgIC8vIGVudW0geWV0LiAoSWYgaXQgd2VyZSBhIHByaW1pdGl2ZSB0eXBlLCB8ZmllbGR8IHdvdWxkIGhhdmUgYSB0eXBlIHNldAotICAgIC8vIGFscmVhZHkuKSBJbiB0aGlzIGNhc2UsIHNpbXBseSB0YWtlIHRoZSBjdXJyZW50IHN0cmluZyBhcyB0aGUgZGVmYXVsdAotICAgIC8vIHZhbHVlOyB3ZSB3aWxsIGNhdGNoIHRoZSBlcnJvciBsYXRlciBpZiBpdCBpcyBub3QgYSB2YWxpZCBlbnVtIHZhbHVlLgotICAgIC8vIChOLkIuIHRoYXQgd2UgZG8gbm90IGNoZWNrIHdoZXRoZXIgdGhlIGN1cnJlbnQgdG9rZW4gaXMgYW4gaWRlbnRpZmllcjoKLSAgICAvLyBkb2luZyBzbyB0aHJvd3Mgc3RyYW5nZSBlcnJvcnMgd2hlbiB0aGUgdXNlciBtaXN0eXBlcyBhIHByaW1pdGl2ZQotICAgIC8vIHR5cGVuYW1lIGFuZCB3ZSBhc3N1bWUgaXQncyBhbiBlbnVtLiBFLmcuOiAib3B0aW9uYWwgaW50IGZvbyA9IDEgW2RlZmF1bHQKLSAgICAvLyA9IDQyXSIuIEluIHN1Y2ggYSBjYXNlIHRoZSBmdW5kYW1lbnRhbCBlcnJvciBpcyByZWFsbHkgdGhhdCAiaW50IiBpcyBub3QKLSAgICAvLyBhIHR5cGUsIG5vdCB0aGF0ICI0MiIgaXMgbm90IGFuIGlkZW50aWZpZXIuIFNlZSBiLzEyNTMzNTgyLikKLSAgICAqZGVmYXVsdF92YWx1ZSA9IGlucHV0Xy0+Y3VycmVudCgpLnRleHQ7Ci0gICAgaW5wdXRfLT5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBzd2l0Y2ggKGZpZWxkLT50eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UNjQ6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UNjQ6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQzMjoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDY0OiB7Ci0gICAgICB1aW50NjQgbWF4X3ZhbHVlID0ga2ludDY0bWF4OwotICAgICAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIgfHwKLSAgICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NJTlQzMiB8fAotICAgICAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0ZJWEVEMzIpIHsKLSAgICAgICAgbWF4X3ZhbHVlID0ga2ludDMybWF4OwotICAgICAgfQotCi0gICAgICAvLyBUaGVzZSB0eXBlcyBjYW4gYmUgbmVnYXRpdmUuCi0gICAgICBpZiAoVHJ5Q29uc3VtZSgiLSIpKSB7Ci0gICAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZCgiLSIpOwotICAgICAgICAvLyBUd28ncyBjb21wbGVtZW50IGFsd2F5cyBoYXMgb25lIG1vcmUgbmVnYXRpdmUgdmFsdWUgdGhhbiBwb3NpdGl2ZS4KLSAgICAgICAgKyttYXhfdmFsdWU7Ci0gICAgICB9Ci0gICAgICAvLyBQYXJzZSB0aGUgaW50ZWdlciB0byB2ZXJpZnkgdGhhdCBpdCBpcyBub3Qgb3V0LW9mLXJhbmdlLgotICAgICAgdWludDY0IHZhbHVlOwotICAgICAgRE8oQ29uc3VtZUludGVnZXI2NChtYXhfdmFsdWUsICZ2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGludGVnZXIgZm9yIGZpZWxkIGRlZmF1bHQgdmFsdWUuIikpOwotICAgICAgLy8gQW5kIHN0cmluZ2lmeSBpdCBhZ2Fpbi4KLSAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZChTaW1wbGVJdG9hKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQzMjoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQ2NDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVEMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GSVhFRDY0OiB7Ci0gICAgICB1aW50NjQgbWF4X3ZhbHVlID0ga3VpbnQ2NG1heDsKLSAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQzMiB8fAotICAgICAgICAgIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRklYRUQzMikgewotICAgICAgICBtYXhfdmFsdWUgPSBrdWludDMybWF4OwotICAgICAgfQotCi0gICAgICAvLyBOdW1lcmljLCBub3QgbmVnYXRpdmUuCi0gICAgICBpZiAoVHJ5Q29uc3VtZSgiLSIpKSB7Ci0gICAgICAgIEFkZEVycm9yKCJVbnNpZ25lZCBmaWVsZCBjYW4ndCBoYXZlIG5lZ2F0aXZlIGRlZmF1bHQgdmFsdWUuIik7Ci0gICAgICB9Ci0gICAgICAvLyBQYXJzZSB0aGUgaW50ZWdlciB0byB2ZXJpZnkgdGhhdCBpdCBpcyBub3Qgb3V0LW9mLXJhbmdlLgotICAgICAgdWludDY0IHZhbHVlOwotICAgICAgRE8oQ29uc3VtZUludGVnZXI2NChtYXhfdmFsdWUsICZ2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIkV4cGVjdGVkIGludGVnZXIgZm9yIGZpZWxkIGRlZmF1bHQgdmFsdWUuIikpOwotICAgICAgLy8gQW5kIHN0cmluZ2lmeSBpdCBhZ2Fpbi4KLSAgICAgIGRlZmF1bHRfdmFsdWUtPmFwcGVuZChTaW1wbGVJdG9hKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZMT0FUOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRE9VQkxFOgotICAgICAgLy8gVGhlc2UgdHlwZXMgY2FuIGJlIG5lZ2F0aXZlLgotICAgICAgaWYgKFRyeUNvbnN1bWUoIi0iKSkgewotICAgICAgICBkZWZhdWx0X3ZhbHVlLT5hcHBlbmQoIi0iKTsKLSAgICAgIH0KLSAgICAgIC8vIFBhcnNlIHRoZSBpbnRlZ2VyIGJlY2F1c2Ugd2UgaGF2ZSB0byBjb252ZXJ0IGhleCBpbnRlZ2VycyB0byBkZWNpbWFsCi0gICAgICAvLyBmbG9hdHMuCi0gICAgICBkb3VibGUgdmFsdWU7Ci0gICAgICBETyhDb25zdW1lTnVtYmVyKCZ2YWx1ZSwgIkV4cGVjdGVkIG51bWJlci4iKSk7Ci0gICAgICAvLyBBbmQgc3RyaW5naWZ5IGl0IGFnYWluLgotICAgICAgZGVmYXVsdF92YWx1ZS0+YXBwZW5kKFNpbXBsZUR0b2EodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9CT09MOgotICAgICAgaWYgKFRyeUNvbnN1bWUoInRydWUiKSkgewotICAgICAgICBkZWZhdWx0X3ZhbHVlLT5hc3NpZ24oInRydWUiKTsKLSAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgiZmFsc2UiKSkgewotICAgICAgICBkZWZhdWx0X3ZhbHVlLT5hc3NpZ24oImZhbHNlIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HOgotICAgICAgLy8gTm90ZTogV2hlbiBmaWxlIG9wdG9uIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggaXMgdHJ1ZSwgaWYgYQotICAgICAgLy8gbm9uLXN0cmluZyByZXByZXNlbnRhdGlvbiAoZWcgYnl0ZVtdKSBpcyBsYXRlciBzdXBwb3J0ZWQsIGl0IG11c3QKLSAgICAgIC8vIGJlIGNoZWNrZWQgZm9yIFVURi04LW5lc3MuCi0gICAgICBETyhDb25zdW1lU3RyaW5nKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBzdHJpbmcgZm9yIGZpZWxkIGRlZmF1bHQgIgotICAgICAgICAgICAgICAgICAgICAgICAidmFsdWUuIikpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTOgotICAgICAgRE8oQ29uc3VtZVN0cmluZyhkZWZhdWx0X3ZhbHVlLCAiRXhwZWN0ZWQgc3RyaW5nLiIpKTsKLSAgICAgICpkZWZhdWx0X3ZhbHVlID0gQ0VzY2FwZSgqZGVmYXVsdF92YWx1ZSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTToKLSAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBlbnVtIGlkZW50aWZpZXIgZm9yIGZpZWxkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IHZhbHVlLiIpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVA6Ci0gICAgICBBZGRFcnJvcigiTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VKc29uTmFtZSgKLSAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCi0gICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIGlmIChmaWVsZC0+aGFzX2pzb25fbmFtZSgpKSB7Ci0gICAgQWRkRXJyb3IoIkFscmVhZHkgc2V0IG9wdGlvbiBcImpzb25fbmFtZVwiLiIpOwotICAgIGZpZWxkLT5jbGVhcl9qc29uX25hbWUoKTsKLSAgfQotCi0gIERPKENvbnN1bWUoImpzb25fbmFtZSIpKTsKLSAgRE8oQ29uc3VtZSgiPSIpKTsKLQotICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGZpZWxkX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjprSnNvbk5hbWVGaWVsZE51bWJlcik7Ci0gIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgZmllbGQsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1BUSU9OX1ZBTFVFKTsKLSAgRE8oQ29uc3VtZVN0cmluZyhmaWVsZC0+bXV0YWJsZV9qc29uX25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgc3RyaW5nIGZvciBKU09OIG5hbWUuIikpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1ib29sIFBhcnNlcjo6UGFyc2VPcHRpb25OYW1lUGFydChVbmludGVycHJldGVkT3B0aW9uKiB1bmludGVycHJldGVkX29wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcnRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKLSAgVW5pbnRlcnByZXRlZE9wdGlvbjo6TmFtZVBhcnQqIG5hbWUgPSB1bmludGVycHJldGVkX29wdGlvbi0+YWRkX25hbWUoKTsKLSAgc3RyaW5nIGlkZW50aWZpZXI7ICAvLyBXZSBwYXJzZSBpZGVudGlmaWVycyBpbnRvIHRoaXMgc3RyaW5nLgotICBpZiAoTG9va2luZ0F0KCIoIikpIHsgIC8vIFRoaXMgaXMgYW4gZXh0ZW5zaW9uLgotICAgIERPKENvbnN1bWUoIigiKSk7Ci0KLSAgICB7Ci0gICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAotICAgICAgICAgIHBhcnRfbG9jYXRpb24sIFVuaW50ZXJwcmV0ZWRPcHRpb246Ok5hbWVQYXJ0OjprTmFtZVBhcnRGaWVsZE51bWJlcik7Ci0gICAgICAvLyBBbiBleHRlbnNpb24gbmFtZSBjb25zaXN0cyBvZiBkb3Qtc2VwYXJhdGVkIGlkZW50aWZpZXJzLCBhbmQgbWF5IGJlZ2luCi0gICAgICAvLyB3aXRoIGEgZG90LgotICAgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgewotICAgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmaWRlbnRpZmllciwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOwotICAgICAgICBuYW1lLT5tdXRhYmxlX25hbWVfcGFydCgpLT5hcHBlbmQoaWRlbnRpZmllcik7Ci0gICAgICB9Ci0gICAgICB3aGlsZSAoTG9va2luZ0F0KCIuIikpIHsKLSAgICAgICAgRE8oQ29uc3VtZSgiLiIpKTsKLSAgICAgICAgbmFtZS0+bXV0YWJsZV9uYW1lX3BhcnQoKS0+YXBwZW5kKCIuIik7Ci0gICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7Ci0gICAgICAgIG5hbWUtPm11dGFibGVfbmFtZV9wYXJ0KCktPmFwcGVuZChpZGVudGlmaWVyKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBETyhDb25zdW1lKCIpIikpOwotICAgIG5hbWUtPnNldF9pc19leHRlbnNpb24odHJ1ZSk7Ci0gIH0gZWxzZSB7ICAvLyBUaGlzIGlzIGEgcmVndWxhciBmaWVsZC4KLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAotICAgICAgICBwYXJ0X2xvY2F0aW9uLCBVbmludGVycHJldGVkT3B0aW9uOjpOYW1lUGFydDo6a05hbWVQYXJ0RmllbGROdW1iZXIpOwotICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7Ci0gICAgbmFtZS0+bXV0YWJsZV9uYW1lX3BhcnQoKS0+YXBwZW5kKGlkZW50aWZpZXIpOwotICAgIG5hbWUtPnNldF9pc19leHRlbnNpb24oZmFsc2UpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VVbmludGVycHJldGVkQmxvY2soc3RyaW5nKiB2YWx1ZSkgewotICAvLyBOb3RlIHRoYXQgZW5jbG9zaW5nIGJyYWNlcyBhcmUgbm90IGFkZGVkIHRvICp2YWx1ZS4KLSAgLy8gV2UgZG8gTk9UIHVzZSBDb25zdW1lRW5kT2ZTdGF0ZW1lbnQgZm9yIHRoaXMgYnJhY2UgYmVjYXVzZSBpdCdzIGRlbGltaXRpbmcKLSAgLy8gYW4gZXhwcmVzc2lvbiwgbm90IGEgYmxvY2sgb2Ygc3RhdGVtZW50cy4KLSAgRE8oQ29uc3VtZSgieyIpKTsKLSAgaW50IGJyYWNlX2RlcHRoID0gMTsKLSAgd2hpbGUgKCFBdEVuZCgpKSB7Ci0gICAgaWYgKExvb2tpbmdBdCgieyIpKSB7Ci0gICAgICBicmFjZV9kZXB0aCsrOwotICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJ9IikpIHsKLSAgICAgIGJyYWNlX2RlcHRoLS07Ci0gICAgICBpZiAoYnJhY2VfZGVwdGggPT0gMCkgewotICAgICAgICBpbnB1dF8tPk5leHQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIFRPRE8oc2FuamF5KTogSW50ZXJwcmV0IGxpbmUvY29sdW1uIG51bWJlcnMgdG8gcHJlc2VydmUgZm9ybWF0dGluZwotICAgIGlmICghdmFsdWUtPmVtcHR5KCkpIHZhbHVlLT5wdXNoX2JhY2soJyAnKTsKLSAgICB2YWx1ZS0+YXBwZW5kKGlucHV0Xy0+Y3VycmVudCgpLnRleHQpOwotICAgIGlucHV0Xy0+TmV4dCgpOwotICB9Ci0gIEFkZEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBzdHJlYW0gd2hpbGUgcGFyc2luZyBhZ2dyZWdhdGUgdmFsdWUuIik7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gV2UgZG9uJ3QgaW50ZXJwcmV0IHRoZSBvcHRpb24gaGVyZS4gSW5zdGVhZCB3ZSBzdG9yZSBpdCBpbiBhbgotLy8gVW5pbnRlcnByZXRlZE9wdGlvbiwgdG8gYmUgaW50ZXJwcmV0ZWQgbGF0ZXIuCi1ib29sIFBhcnNlcjo6UGFyc2VPcHRpb24oTWVzc2FnZSogb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvcHRpb25zX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25TdHlsZSBzdHlsZSkgewotICAvLyBDcmVhdGUgYW4gZW50cnkgaW4gdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIGZpZWxkLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkID0gb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpLT4KLSAgICAgIEZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKLSAgR09PR0xFX0NIRUNLKHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkICE9IE5VTEwpCi0gICAgICA8PCAiTm8gZmllbGQgbmFtZWQgXCJ1bmludGVycHJldGVkX29wdGlvblwiIGluIHRoZSBPcHRpb25zIHByb3RvLiI7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMtPkdldFJlZmxlY3Rpb24oKTsKLQotICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAotICAgICAgb3B0aW9uc19sb2NhdGlvbiwgdW5pbnRlcnByZXRlZF9vcHRpb25fZmllbGQtPm51bWJlcigpLAotICAgICAgcmVmbGVjdGlvbi0+RmllbGRTaXplKCpvcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl9maWVsZCkpOwotCi0gIGlmIChzdHlsZSA9PSBPUFRJT05fU1RBVEVNRU5UKSB7Ci0gICAgRE8oQ29uc3VtZSgib3B0aW9uIikpOwotICB9Ci0KLSAgVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb24gPSBkb3duX2Nhc3Q8VW5pbnRlcnByZXRlZE9wdGlvbio+KAotICAgICAgb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT5BZGRNZXNzYWdlKG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fZmllbGQpKTsKLQotICAvLyBQYXJzZSBkb3Qtc2VwYXJhdGVkIG5hbWUuCi0gIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIG5hbWVfbG9jYXRpb24obG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmtOYW1lRmllbGROdW1iZXIpOwotICAgIG5hbWVfbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCi0gICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9OQU1FKTsKLQotICAgIHsKLSAgICAgIExvY2F0aW9uUmVjb3JkZXIgcGFydF9sb2NhdGlvbihuYW1lX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5uYW1lX3NpemUoKSk7Ci0gICAgICBETyhQYXJzZU9wdGlvbk5hbWVQYXJ0KHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBwYXJ0X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpKTsKLSAgICB9Ci0KLSAgICB3aGlsZSAoTG9va2luZ0F0KCIuIikpIHsKLSAgICAgIERPKENvbnN1bWUoIi4iKSk7Ci0gICAgICBMb2NhdGlvblJlY29yZGVyIHBhcnRfbG9jYXRpb24obmFtZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bmFtZV9zaXplKCkpOwotICAgICAgRE8oUGFyc2VPcHRpb25OYW1lUGFydCh1bmludGVycHJldGVkX29wdGlvbiwgcGFydF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKSk7Ci0gICAgfQotICB9Ci0KLSAgRE8oQ29uc3VtZSgiPSIpKTsKLQotICB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciB2YWx1ZV9sb2NhdGlvbihsb2NhdGlvbik7Ci0gICAgdmFsdWVfbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCi0gICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9WQUxVRSk7Ci0KLSAgICAvLyBBbGwgdmFsdWVzIGFyZSBhIHNpbmdsZSB0b2tlbiwgZXhjZXB0IGZvciBuZWdhdGl2ZSBudW1iZXJzLCB3aGljaCBjb25zaXN0Ci0gICAgLy8gb2YgYSBzaW5nbGUgJy0nIHN5bWJvbCwgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBudW1iZXIuCi0gICAgYm9vbCBpc19uZWdhdGl2ZSA9IFRyeUNvbnN1bWUoIi0iKTsKLQotICAgIHN3aXRjaCAoaW5wdXRfLT5jdXJyZW50KCkudHlwZSkgewotICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NUQVJUOgotICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVHJ5aW5nIHRvIHJlYWQgdmFsdWUgYmVmb3JlIGFueSB0b2tlbnMgaGF2ZSBiZWVuIHJlYWQuIjsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EOgotICAgICAgICBBZGRFcnJvcigiVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHBhcnNpbmcgb3B0aW9uIHZhbHVlLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSOiB7Ci0gICAgICAgIHZhbHVlX2xvY2F0aW9uLkFkZFBhdGgoCi0gICAgICAgICAgICBVbmludGVycHJldGVkT3B0aW9uOjprSWRlbnRpZmllclZhbHVlRmllbGROdW1iZXIpOwotICAgICAgICBpZiAoaXNfbmVnYXRpdmUpIHsKLSAgICAgICAgICBBZGRFcnJvcigiSW52YWxpZCAnLScgc3ltYm9sIGJlZm9yZSBpZGVudGlmaWVyLiIpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgdmFsdWU7Ci0gICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZ2YWx1ZSwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOwotICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2lkZW50aWZpZXJfdmFsdWUodmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVI6IHsKLSAgICAgICAgdWludDY0IHZhbHVlOwotICAgICAgICB1aW50NjQgbWF4X3ZhbHVlID0KLSAgICAgICAgICAgIGlzX25lZ2F0aXZlID8gc3RhdGljX2Nhc3Q8dWludDY0PihraW50NjRtYXgpICsgMSA6IGt1aW50NjRtYXg7Ci0gICAgICAgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKLSAgICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7Ci0gICAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKLSAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a05lZ2F0aXZlSW50VmFsdWVGaWVsZE51bWJlcik7Ci0gICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoCi0gICAgICAgICAgICAgIC1zdGF0aWNfY2FzdDxpbnQ2ND4odmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKAotICAgICAgICAgICAgICBVbmludGVycHJldGVkT3B0aW9uOjprUG9zaXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyKTsKLSAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X3Bvc2l0aXZlX2ludF92YWx1ZSh2YWx1ZSk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVDogewotICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKFVuaW50ZXJwcmV0ZWRPcHRpb246OmtEb3VibGVWYWx1ZUZpZWxkTnVtYmVyKTsKLSAgICAgICAgZG91YmxlIHZhbHVlOwotICAgICAgICBETyhDb25zdW1lTnVtYmVyKCZ2YWx1ZSwgIkV4cGVjdGVkIG51bWJlci4iKSk7Ci0gICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5zZXRfZG91YmxlX3ZhbHVlKGlzX25lZ2F0aXZlID8gLXZhbHVlIDogdmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORzogewotICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKFVuaW50ZXJwcmV0ZWRPcHRpb246OmtTdHJpbmdWYWx1ZUZpZWxkTnVtYmVyKTsKLSAgICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7Ci0gICAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgJy0nIHN5bWJvbCBiZWZvcmUgc3RyaW5nLiIpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICBzdHJpbmcgdmFsdWU7Ci0gICAgICAgIERPKENvbnN1bWVTdHJpbmcoJnZhbHVlLCAiRXhwZWN0ZWQgc3RyaW5nLiIpKTsKLSAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9zdHJpbmdfdmFsdWUodmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NZTUJPTDoKLSAgICAgICAgaWYgKExvb2tpbmdBdCgieyIpKSB7Ci0gICAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKLSAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXIpOwotICAgICAgICAgIERPKFBhcnNlVW5pbnRlcnByZXRlZEJsb2NrKAotICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bXV0YWJsZV9hZ2dyZWdhdGVfdmFsdWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBvcHRpb24gdmFsdWUuIik7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIGlmIChzdHlsZSA9PSBPUFRJT05fU1RBVEVNRU5UKSB7Ci0gICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbG9jYXRpb24pKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VFeHRlbnNpb25zKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5zaW9uc19sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIC8vIFBhcnNlIHRoZSBkZWNsYXJhdGlvbi4KLSAgRE8oQ29uc3VtZSgiZXh0ZW5zaW9ucyIpKTsKLQotICBkbyB7Ci0gICAgLy8gTm90ZSB0aGF0IGtFeHRlbnNpb25SYW5nZUZpZWxkTnVtYmVyIHdhcyBhbHJlYWR5IHB1c2hlZCBieSB0aGUgcGFyZW50LgotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZXh0ZW5zaW9uc19sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCkpOwotCi0gICAgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UgPSBtZXNzYWdlLT5hZGRfZXh0ZW5zaW9uX3JhbmdlKCk7Ci0gICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCi0gICAgICAgIHJhbmdlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7Ci0KLSAgICBpbnQgc3RhcnQsIGVuZDsKLSAgICBpbzo6VG9rZW5pemVyOjpUb2tlbiBzdGFydF90b2tlbjsKLQotICAgIHsKLSAgICAgIExvY2F0aW9uUmVjb3JkZXIgc3RhcnRfbG9jYXRpb24oCi0gICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2U6OmtTdGFydEZpZWxkTnVtYmVyKTsKLSAgICAgIHN0YXJ0X3Rva2VuID0gaW5wdXRfLT5jdXJyZW50KCk7Ci0gICAgICBETyhDb25zdW1lSW50ZWdlcigmc3RhcnQsICJFeHBlY3RlZCBmaWVsZCBudW1iZXIgcmFuZ2UuIikpOwotICAgIH0KLQotICAgIGlmIChUcnlDb25zdW1lKCJ0byIpKSB7Ci0gICAgICBMb2NhdGlvblJlY29yZGVyIGVuZF9sb2NhdGlvbigKLSAgICAgICAgICBsb2NhdGlvbiwgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKLSAgICAgIGlmIChUcnlDb25zdW1lKCJtYXgiKSkgewotICAgICAgICAvLyBTZXQgdG8gdGhlIHNlbnRpbmVsIHZhbHVlIC0gMSBzaW5jZSB3ZSBpbmNyZW1lbnQgdGhlIHZhbHVlIGJlbG93LgotICAgICAgICAvLyBUaGUgYWN0dWFsIHZhbHVlIG9mIHRoZSBlbmQgb2YgdGhlIHJhbmdlIHNob3VsZCBiZSBzZXQgd2l0aAotICAgICAgICAvLyBBZGp1c3RFeHRlbnNpb25SYW5nZXNXaXRoTWF4RW5kTnVtYmVyLgotICAgICAgICBlbmQgPSBrTWF4RXh0ZW5zaW9uUmFuZ2VTZW50aW5lbCAtIDE7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBETyhDb25zdW1lSW50ZWdlcigmZW5kLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAotICAgICAgICAgIGxvY2F0aW9uLCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlOjprRW5kRmllbGROdW1iZXIpOwotICAgICAgZW5kX2xvY2F0aW9uLlN0YXJ0QXQoc3RhcnRfdG9rZW4pOwotICAgICAgZW5kX2xvY2F0aW9uLkVuZEF0KHN0YXJ0X3Rva2VuKTsKLSAgICAgIGVuZCA9IHN0YXJ0OwotICAgIH0KLQotICAgIC8vIFVzZXJzIGxpa2UgdG8gc3BlY2lmeSBpbmNsdXNpdmUgcmFuZ2VzLCBidXQgaW4gY29kZSB3ZSBsaWtlIHRoZSBlbmQKLSAgICAvLyBudW1iZXIgdG8gYmUgZXhjbHVzaXZlLgotICAgICsrZW5kOwotCi0gICAgcmFuZ2UtPnNldF9zdGFydChzdGFydCk7Ci0gICAgcmFuZ2UtPnNldF9lbmQoZW5kKTsKLSAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKLQotICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZleHRlbnNpb25zX2xvY2F0aW9uKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyBUaGlzIGlzIHNpbWlsYXIgdG8gZXh0ZW5zaW9uIHJhbmdlIHBhcnNpbmcsIGV4Y2VwdCB0aGF0ICJtYXgiIGlzIG5vdAotLy8gc3VwcG9ydGVkLCBhbmQgYWNjZXB0cyBmaWVsZCBuYW1lIGxpdGVyYWxzLgotYm9vbCBQYXJzZXI6OlBhcnNlUmVzZXJ2ZWQoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbikgewotICAvLyBQYXJzZSB0aGUgZGVjbGFyYXRpb24uCi0gIERPKENvbnN1bWUoInJlc2VydmVkIikpOwotICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtSZXNlcnZlZE5hbWVGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlUmVzZXJ2ZWROYW1lcyhtZXNzYWdlLCBsb2NhdGlvbik7Ci0gIH0gZWxzZSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprUmVzZXJ2ZWRSYW5nZUZpZWxkTnVtYmVyKTsKLSAgICByZXR1cm4gUGFyc2VSZXNlcnZlZE51bWJlcnMobWVzc2FnZSwgbG9jYXRpb24pOwotICB9Ci19Ci0KLQotYm9vbCBQYXJzZXI6OlBhcnNlUmVzZXJ2ZWROYW1lcyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbikgewotICBkbyB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihwYXJlbnRfbG9jYXRpb24sIG1lc3NhZ2UtPnJlc2VydmVkX25hbWVfc2l6ZSgpKTsKLSAgICBETyhDb25zdW1lU3RyaW5nKG1lc3NhZ2UtPmFkZF9yZXNlcnZlZF9uYW1lKCksICJFeHBlY3RlZCBmaWVsZCBuYW1lLiIpKTsKLSAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKLSAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmcGFyZW50X2xvY2F0aW9uKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VSZXNlcnZlZE51bWJlcnMoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbikgewotICBib29sIGZpcnN0ID0gdHJ1ZTsKLSAgZG8gewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocGFyZW50X2xvY2F0aW9uLCBtZXNzYWdlLT5yZXNlcnZlZF9yYW5nZV9zaXplKCkpOwotCi0gICAgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlKiByYW5nZSA9IG1lc3NhZ2UtPmFkZF9yZXNlcnZlZF9yYW5nZSgpOwotICAgIGludCBzdGFydCwgZW5kOwotICAgIGlvOjpUb2tlbml6ZXI6OlRva2VuIHN0YXJ0X3Rva2VuOwotICAgIHsKLSAgICAgIExvY2F0aW9uUmVjb3JkZXIgc3RhcnRfbG9jYXRpb24oCi0gICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZTo6a1N0YXJ0RmllbGROdW1iZXIpOwotICAgICAgc3RhcnRfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKLSAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZzdGFydCwgKGZpcnN0ID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmaWVsZCBuYW1lIG9yIG51bWJlciByYW5nZS4iIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmaWVsZCBudW1iZXIgcmFuZ2UuIikpKTsKLSAgICB9Ci0KLSAgICBpZiAoVHJ5Q29uc3VtZSgidG8iKSkgewotICAgICAgTG9jYXRpb25SZWNvcmRlciBlbmRfbG9jYXRpb24oCi0gICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKLSAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZlbmQsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKLSAgICB9IGVsc2UgewotICAgICAgTG9jYXRpb25SZWNvcmRlciBlbmRfbG9jYXRpb24oCi0gICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKLSAgICAgIGVuZF9sb2NhdGlvbi5TdGFydEF0KHN0YXJ0X3Rva2VuKTsKLSAgICAgIGVuZF9sb2NhdGlvbi5FbmRBdChzdGFydF90b2tlbik7Ci0gICAgICBlbmQgPSBzdGFydDsKLSAgICB9Ci0KLSAgICAvLyBVc2VycyBsaWtlIHRvIHNwZWNpZnkgaW5jbHVzaXZlIHJhbmdlcywgYnV0IGluIGNvZGUgd2UgbGlrZSB0aGUgZW5kCi0gICAgLy8gbnVtYmVyIHRvIGJlIGV4Y2x1c2l2ZS4KLSAgICArK2VuZDsKLQotICAgIHJhbmdlLT5zZXRfc3RhcnQoc3RhcnQpOwotICAgIHJhbmdlLT5zZXRfZW5kKGVuZCk7Ci0gICAgZmlyc3QgPSBmYWxzZTsKLSAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKLQotICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZwYXJlbnRfbG9jYXRpb24pKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VyOjpQYXJzZUV4dGVuZChSZXBlYXRlZFB0ckZpZWxkPEZpZWxkRGVzY3JpcHRvclByb3RvPiogZXh0ZW5zaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBleHRlbmRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIERPKENvbnN1bWUoImV4dGVuZCIpKTsKLQotICAvLyBQYXJzZSB0aGUgZXh0ZW5kZWUgdHlwZS4KLSAgaW86OlRva2VuaXplcjo6VG9rZW4gZXh0ZW5kZWVfc3RhcnQgPSBpbnB1dF8tPmN1cnJlbnQoKTsKLSAgc3RyaW5nIGV4dGVuZGVlOwotICBETyhQYXJzZVVzZXJEZWZpbmVkVHlwZSgmZXh0ZW5kZWUpKTsKLSAgaW86OlRva2VuaXplcjo6VG9rZW4gZXh0ZW5kZWVfZW5kID0gaW5wdXRfLT5wcmV2aW91cygpOwotCi0gIC8vIFBhcnNlIHRoZSBibG9jay4KLSAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oInsiLCAmZXh0ZW5kX2xvY2F0aW9uKSk7Ci0KLSAgYm9vbCBpc19maXJzdCA9IHRydWU7Ci0KLSAgZG8gewotICAgIGlmIChBdEVuZCgpKSB7Ci0gICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gZXh0ZW5kIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvLyBOb3RlIHRoYXQga0V4dGVuc2lvbkZpZWxkTnVtYmVyIHdhcyBhbHJlYWR5IHB1c2hlZCBieSB0aGUgcGFyZW50LgotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZXh0ZW5kX2xvY2F0aW9uLCBleHRlbnNpb25zLT5zaXplKCkpOwotCi0gICAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkID0gZXh0ZW5zaW9ucy0+QWRkKCk7Ci0KLSAgICB7Ci0gICAgICBMb2NhdGlvblJlY29yZGVyIGV4dGVuZGVlX2xvY2F0aW9uKAotICAgICAgICAgIGxvY2F0aW9uLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0V4dGVuZGVlRmllbGROdW1iZXIpOwotICAgICAgZXh0ZW5kZWVfbG9jYXRpb24uU3RhcnRBdChleHRlbmRlZV9zdGFydCk7Ci0gICAgICBleHRlbmRlZV9sb2NhdGlvbi5FbmRBdChleHRlbmRlZV9lbmQpOwotCi0gICAgICBpZiAoaXNfZmlyc3QpIHsKLSAgICAgICAgZXh0ZW5kZWVfbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCi0gICAgICAgICAgICBmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSk7Ci0gICAgICAgIGlzX2ZpcnN0ID0gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgZmllbGQtPnNldF9leHRlbmRlZShleHRlbmRlZSk7Ci0KLSAgICBpZiAoIVBhcnNlTWVzc2FnZUZpZWxkKGZpZWxkLCBtZXNzYWdlcywgcGFyZW50X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKSkgewotICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQotICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KLSAgICAgIFNraXBTdGF0ZW1lbnQoKTsKLSAgICB9Ci0gIH0gd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBQYXJzZXI6OlBhcnNlT25lb2YoT25lb2ZEZXNjcmlwdG9yUHJvdG8qIG9uZW9mX2RlY2wsCi0gICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGludCBvbmVvZl9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9uZW9mX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgY29udGFpbmluZ190eXBlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIERPKENvbnN1bWUoIm9uZW9mIikpOwotCi0gIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIG5hbWVfbG9jYXRpb24ob25lb2ZfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZW9mRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKLSAgICBETyhDb25zdW1lSWRlbnRpZmllcihvbmVvZl9kZWNsLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIG9uZW9mIG5hbWUuIikpOwotICB9Ci0KLSAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oInsiLCAmb25lb2ZfbG9jYXRpb24pKTsKLQotICBkbyB7Ci0gICAgaWYgKEF0RW5kKCkpIHsKLSAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBvbmVvZiBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gUHJpbnQgYSBuaWNlIGVycm9yIGlmIHRoZSB1c2VyIGFjY2lkZW50YWxseSB0cmllcyB0byBwbGFjZSBhIGxhYmVsCi0gICAgLy8gb24gYW4gaW5kaXZpZHVhbCBtZW1iZXIgb2YgYSBvbmVvZi4KLSAgICBpZiAoTG9va2luZ0F0KCJyZXF1aXJlZCIpIHx8Ci0gICAgICAgIExvb2tpbmdBdCgib3B0aW9uYWwiKSB8fAotICAgICAgICBMb29raW5nQXQoInJlcGVhdGVkIikpIHsKLSAgICAgIEFkZEVycm9yKCJGaWVsZHMgaW4gb25lb2ZzIG11c3Qgbm90IGhhdmUgbGFiZWxzIChyZXF1aXJlZCAvIG9wdGlvbmFsICIKLSAgICAgICAgICAgICAgICIvIHJlcGVhdGVkKS4iKTsKLSAgICAgIC8vIFdlIGNhbiBjb250aW51ZSBwYXJzaW5nIGhlcmUgYmVjYXVzZSB3ZSB1bmRlcnN0YW5kIHdoYXQgdGhlIHVzZXIKLSAgICAgIC8vIG1lYW50LiAgVGhlIGVycm9yIHJlcG9ydCB3aWxsIHN0aWxsIG1ha2UgcGFyc2luZyBmYWlsIG92ZXJhbGwuCi0gICAgICBpbnB1dF8tPk5leHQoKTsKLSAgICB9Ci0KLSAgICBMb2NhdGlvblJlY29yZGVyIGZpZWxkX2xvY2F0aW9uKGNvbnRhaW5pbmdfdHlwZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0ZpZWxkRmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPmZpZWxkX3NpemUoKSk7Ci0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBjb250YWluaW5nX3R5cGUtPmFkZF9maWVsZCgpOwotICAgIGZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKLSAgICBmaWVsZC0+c2V0X29uZW9mX2luZGV4KG9uZW9mX2luZGV4KTsKLQotICAgIGlmICghUGFyc2VNZXNzYWdlRmllbGROb0xhYmVsKGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKSkgewotICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQotICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KLSAgICAgIFNraXBTdGF0ZW1lbnQoKTsKLSAgICB9Ci0gIH0gd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW51bXMKLQotYm9vbCBQYXJzZXI6OlBhcnNlRW51bURlZmluaXRpb24oRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewotICBETyhDb25zdW1lKCJlbnVtIikpOwotCi0gIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKGVudW1fbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKLSAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKLSAgICAgICAgZW51bV90eXBlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOwotICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGVudW1fdHlwZS0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBlbnVtIG5hbWUuIikpOwotICB9Ci0KLSAgRE8oUGFyc2VFbnVtQmxvY2soZW51bV90eXBlLCBlbnVtX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKLQotICBETyhWYWxpZGF0ZUVudW0oZW51bV90eXBlKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VyOjpQYXJzZUVudW1CbG9jayhFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKLSAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oInsiLCAmZW51bV9sb2NhdGlvbikpOwotCi0gIHdoaWxlICghVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBOVUxMKSkgewotICAgIGlmIChBdEVuZCgpKSB7Ci0gICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gZW51bSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKCFQYXJzZUVudW1TdGF0ZW1lbnQoZW51bV90eXBlLCBlbnVtX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKSB7Ci0gICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCi0gICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgotICAgICAgU2tpcFN0YXRlbWVudCgpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VFbnVtU3RhdGVtZW50KEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsIE5VTEwpKSB7Ci0gICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihlbnVtX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlT3B0aW9uKGVudW1fdHlwZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUsIE9QVElPTl9TVEFURU1FTlQpOwotICB9IGVsc2UgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZW51bV9sb2NhdGlvbiwKLSAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a1ZhbHVlRmllbGROdW1iZXIsIGVudW1fdHlwZS0+dmFsdWVfc2l6ZSgpKTsKLSAgICByZXR1cm4gUGFyc2VFbnVtQ29uc3RhbnQoZW51bV90eXBlLT5hZGRfdmFsdWUoKSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIH0KLX0KLQotYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50KEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZW51bV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewotICAvLyBQYXJzZSBuYW1lLgotICB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihlbnVtX3ZhbHVlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKLSAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKLSAgICAgICAgZW51bV92YWx1ZSwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKLSAgICBETyhDb25zdW1lSWRlbnRpZmllcihlbnVtX3ZhbHVlLT5tdXRhYmxlX25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZW51bSBjb25zdGFudCBuYW1lLiIpKTsKLSAgfQotCi0gIERPKENvbnN1bWUoIj0iLCAiTWlzc2luZyBudW1lcmljIHZhbHVlIGZvciBlbnVtIGNvbnN0YW50LiIpKTsKLQotICAvLyBQYXJzZSB2YWx1ZS4KLSAgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oCi0gICAgICAgIGVudW1fdmFsdWVfbG9jYXRpb24sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a051bWJlckZpZWxkTnVtYmVyKTsKLSAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKLSAgICAgICAgZW51bV92YWx1ZSwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIpOwotCi0gICAgaW50IG51bWJlcjsKLSAgICBETyhDb25zdW1lU2lnbmVkSW50ZWdlcigmbnVtYmVyLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7Ci0gICAgZW51bV92YWx1ZS0+c2V0X251bWJlcihudW1iZXIpOwotICB9Ci0KLSAgRE8oUGFyc2VFbnVtQ29uc3RhbnRPcHRpb25zKGVudW1fdmFsdWUsIGVudW1fdmFsdWVfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpKTsKLQotICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZlbnVtX3ZhbHVlX2xvY2F0aW9uKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VyOjpQYXJzZUVudW1Db25zdGFudE9wdGlvbnMoCi0gICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiB2YWx1ZSwKLSAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uLAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewotICBpZiAoIUxvb2tpbmdBdCgiWyIpKSByZXR1cm4gdHJ1ZTsKLQotICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAotICAgICAgZW51bV92YWx1ZV9sb2NhdGlvbiwgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKLQotICBETyhDb25zdW1lKCJbIikpOwotCi0gIGRvIHsKLSAgICBETyhQYXJzZU9wdGlvbih2YWx1ZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSwgT1BUSU9OX0FTU0lHTk1FTlQpKTsKLSAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKLQotICBETyhDb25zdW1lKCJdIikpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2VydmljZXMKLQotYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZURlZmluaXRpb24oCi0gICAgU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKLSAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uLAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewotICBETyhDb25zdW1lKCJzZXJ2aWNlIikpOwotCi0gIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHNlcnZpY2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKLSAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKLSAgICAgICAgc2VydmljZSwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FKTsKLSAgICBETyhDb25zdW1lSWRlbnRpZmllcihzZXJ2aWNlLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIHNlcnZpY2UgbmFtZS4iKSk7Ci0gIH0KLQotICBETyhQYXJzZVNlcnZpY2VCbG9jayhzZXJ2aWNlLCBzZXJ2aWNlX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VyOjpQYXJzZVNlcnZpY2VCbG9jayhTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJnNlcnZpY2VfbG9jYXRpb24pKTsKLQotICB3aGlsZSAoIVRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgTlVMTCkpIHsKLSAgICBpZiAoQXRFbmQoKSkgewotICAgICAgQWRkRXJyb3IoIlJlYWNoZWQgZW5kIG9mIGlucHV0IGluIHNlcnZpY2UgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghUGFyc2VTZXJ2aWNlU3RhdGVtZW50KHNlcnZpY2UsIHNlcnZpY2VfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpIHsKLSAgICAgIC8vIFRoaXMgc3RhdGVtZW50IGZhaWxlZCB0byBwYXJzZS4gIFNraXAgaXQsIGJ1dCBrZWVwIGxvb3BpbmcgdG8gcGFyc2UKLSAgICAgIC8vIG90aGVyIHN0YXRlbWVudHMuCi0gICAgICBTa2lwU3RhdGVtZW50KCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgUGFyc2VyOjpQYXJzZVNlcnZpY2VTdGF0ZW1lbnQoU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsIE5VTEwpKSB7Ci0gICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKLSAgICAgICAgc2VydmljZV9sb2NhdGlvbiwgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlT3B0aW9uKHNlcnZpY2UtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlLCBPUFRJT05fU1RBVEVNRU5UKTsKLSAgfSBlbHNlIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHNlcnZpY2VfbG9jYXRpb24sCi0gICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtNZXRob2RGaWVsZE51bWJlciwgc2VydmljZS0+bWV0aG9kX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlU2VydmljZU1ldGhvZChzZXJ2aWNlLT5hZGRfbWV0aG9kKCksIGxvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpOwotICB9Ci19Ci0KLWJvb2wgUGFyc2VyOjpQYXJzZVNlcnZpY2VNZXRob2QoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1ldGhvZF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIERPKENvbnN1bWUoInJwYyIpKTsKLQotICB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXRob2RfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXIpOwotICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgICBtZXRob2QsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7Ci0gICAgRE8oQ29uc3VtZUlkZW50aWZpZXIobWV0aG9kLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIG1ldGhvZCBuYW1lLiIpKTsKLSAgfQotCi0gIC8vIFBhcnNlIGlucHV0IHR5cGUuCi0gIERPKENvbnN1bWUoIigiKSk7Ci0gIHsKLSAgICBpZiAoTG9va2luZ0F0KCJzdHJlYW0iKSkgewotICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKLSAgICAgICAgICBtZXRob2RfbG9jYXRpb24sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a0NsaWVudFN0cmVhbWluZ0ZpZWxkTnVtYmVyKTsKLSAgICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgICAgIG1ldGhvZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUik7Ci0gICAgICBtZXRob2QtPnNldF9jbGllbnRfc3RyZWFtaW5nKHRydWUpOwotICAgICAgRE8oQ29uc3VtZSgic3RyZWFtIikpOwotCi0gICAgfQotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWV0aG9kX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprSW5wdXRUeXBlRmllbGROdW1iZXIpOwotICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgICBtZXRob2QsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6SU5QVVRfVFlQRSk7Ci0gICAgRE8oUGFyc2VVc2VyRGVmaW5lZFR5cGUobWV0aG9kLT5tdXRhYmxlX2lucHV0X3R5cGUoKSkpOwotICB9Ci0gIERPKENvbnN1bWUoIikiKSk7Ci0KLSAgLy8gUGFyc2Ugb3V0cHV0IHR5cGUuCi0gIERPKENvbnN1bWUoInJldHVybnMiKSk7Ci0gIERPKENvbnN1bWUoIigiKSk7Ci0gIHsKLSAgICBpZiAoTG9va2luZ0F0KCJzdHJlYW0iKSkgewotICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKLSAgICAgICAgICBtZXRob2RfbG9jYXRpb24sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a1NlcnZlclN0cmVhbWluZ0ZpZWxkTnVtYmVyKTsKLSAgICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgICAgIG1ldGhvZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUik7Ci0gICAgICBETyhDb25zdW1lKCJzdHJlYW0iKSk7Ci0gICAgICBtZXRob2QtPnNldF9zZXJ2ZXJfc3RyZWFtaW5nKHRydWUpOwotCi0gICAgfQotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWV0aG9kX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3V0cHV0VHlwZUZpZWxkTnVtYmVyKTsKLSAgICBsb2NhdGlvbi5SZWNvcmRMZWdhY3lMb2NhdGlvbigKLSAgICAgICAgbWV0aG9kLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9VVFBVVF9UWVBFKTsKLSAgICBETyhQYXJzZVVzZXJEZWZpbmVkVHlwZShtZXRob2QtPm11dGFibGVfb3V0cHV0X3R5cGUoKSkpOwotICB9Ci0gIERPKENvbnN1bWUoIikiKSk7Ci0KLSAgaWYgKExvb2tpbmdBdCgieyIpKSB7Ci0gICAgLy8gT3B0aW9ucyEKLSAgICBETyhQYXJzZU1ldGhvZE9wdGlvbnMobWV0aG9kX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWV0aG9kLT5tdXRhYmxlX29wdGlvbnMoKSkpOwotICB9IGVsc2UgewotICAgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJm1ldGhvZF9sb2NhdGlvbikpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLQotYm9vbCBQYXJzZXI6OlBhcnNlTWV0aG9kT3B0aW9ucyhjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9wdGlvbnNGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXV0YWJsZV9vcHRpb25zKSB7Ci0gIC8vIE9wdGlvbnMhCi0gIENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJnBhcmVudF9sb2NhdGlvbik7Ci0gIHdoaWxlICghVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBOVUxMKSkgewotICAgIGlmIChBdEVuZCgpKSB7Ci0gICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWV0aG9kIG9wdGlvbnMgKG1pc3NpbmcgJ30nKS4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgewotICAgICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKLSAgICB9IGVsc2UgewotICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihwYXJlbnRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNGaWVsZE51bWJlcik7Ci0gICAgICBpZiAoIVBhcnNlT3B0aW9uKG11dGFibGVfb3B0aW9ucywgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSwgT1BUSU9OX1NUQVRFTUVOVCkpIHsKLSAgICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0bwotICAgICAgICAvLyBwYXJzZSBvdGhlciBzdGF0ZW1lbnRzLgotICAgICAgICBTa2lwU3RhdGVtZW50KCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBQYXJzZXI6OlBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewotICBpZiAoVHJ5Q29uc3VtZSgib3B0aW9uYWwiKSkgewotICAgICpsYWJlbCA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJyZXBlYXRlZCIpKSB7Ci0gICAgKmxhYmVsID0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUEVBVEVEOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoInJlcXVpcmVkIikpIHsKLSAgICAqbGFiZWwgPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VUeXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHR5cGVfbmFtZSkgewotICBUeXBlTmFtZU1hcDo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGtUeXBlTmFtZXMuZmluZChpbnB1dF8tPmN1cnJlbnQoKS50ZXh0KTsKLSAgaWYgKGl0ZXIgIT0ga1R5cGVOYW1lcy5lbmQoKSkgewotICAgICp0eXBlID0gaXRlci0+c2Vjb25kOwotICAgIGlucHV0Xy0+TmV4dCgpOwotICB9IGVsc2UgewotICAgIERPKFBhcnNlVXNlckRlZmluZWRUeXBlKHR5cGVfbmFtZSkpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VVc2VyRGVmaW5lZFR5cGUoc3RyaW5nKiB0eXBlX25hbWUpIHsKLSAgdHlwZV9uYW1lLT5jbGVhcigpOwotCi0gIFR5cGVOYW1lTWFwOjpjb25zdF9pdGVyYXRvciBpdGVyID0ga1R5cGVOYW1lcy5maW5kKGlucHV0Xy0+Y3VycmVudCgpLnRleHQpOwotICBpZiAoaXRlciAhPSBrVHlwZU5hbWVzLmVuZCgpKSB7Ci0gICAgLy8gTm90ZTogIFRoZSBvbmx5IHBsYWNlIGVudW0gdHlwZXMgYXJlIGFsbG93ZWQgaXMgZm9yIGZpZWxkIHR5cGVzLCBidXQKLSAgICAvLyAgIGlmIHdlIGFyZSBwYXJzaW5nIGEgZmllbGQgdHlwZSB0aGVuIHdlIHdvdWxkIG5vdCBnZXQgaGVyZSBiZWNhdXNlCi0gICAgLy8gICBwcmltaXRpdmVzIGFyZSBhbGxvd2VkIHRoZXJlIGFzIHdlbGwuICBTbyB0aGlzIGVycm9yIG1lc3NhZ2UgZG9lc24ndAotICAgIC8vICAgbmVlZCB0byBhY2NvdW50IGZvciBlbnVtcy4KLSAgICBBZGRFcnJvcigiRXhwZWN0ZWQgbWVzc2FnZSB0eXBlLiIpOwotCi0gICAgLy8gUHJldGVuZCB0byBhY2NlcHQgdGhpcyB0eXBlIHNvIHRoYXQgd2UgY2FuIGdvIG9uIHBhcnNpbmcuCi0gICAgKnR5cGVfbmFtZSA9IGlucHV0Xy0+Y3VycmVudCgpLnRleHQ7Ci0gICAgaW5wdXRfLT5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBBIGxlYWRpbmcgIi4iIG1lYW5zIHRoZSBuYW1lIGlzIGZ1bGx5LXF1YWxpZmllZC4KLSAgaWYgKFRyeUNvbnN1bWUoIi4iKSkgdHlwZV9uYW1lLT5hcHBlbmQoIi4iKTsKLQotICAvLyBDb25zdW1lIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBuYW1lLgotICBzdHJpbmcgaWRlbnRpZmllcjsKLSAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmlkZW50aWZpZXIsICJFeHBlY3RlZCB0eXBlIG5hbWUuIikpOwotICB0eXBlX25hbWUtPmFwcGVuZChpZGVudGlmaWVyKTsKLQotICAvLyBDb25zdW1lIG1vcmUgcGFydHMuCi0gIHdoaWxlIChUcnlDb25zdW1lKCIuIikpIHsKLSAgICB0eXBlX25hbWUtPmFwcGVuZCgiLiIpOwotICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZpZGVudGlmaWVyLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iKSk7Ci0gICAgdHlwZV9uYW1lLT5hcHBlbmQoaWRlbnRpZmllcik7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1ib29sIFBhcnNlcjo6UGFyc2VQYWNrYWdlKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewotICBpZiAoZmlsZS0+aGFzX3BhY2thZ2UoKSkgewotICAgIEFkZEVycm9yKCJNdWx0aXBsZSBwYWNrYWdlIGRlZmluaXRpb25zLiIpOwotICAgIC8vIERvbid0IGFwcGVuZCB0aGUgbmV3IHBhY2thZ2UgdG8gdGhlIG9sZCBvbmUuICBKdXN0IHJlcGxhY2UgaXQuICBOb3QKLSAgICAvLyB0aGF0IGl0IHJlYWxseSBtYXR0ZXJzIHNpbmNlIHRoaXMgaXMgYW4gZXJyb3IgYW55d2F5LgotICAgIGZpbGUtPmNsZWFyX3BhY2thZ2UoKTsKLSAgfQotCi0gIERPKENvbnN1bWUoInBhY2thZ2UiKSk7Ci0KLSAgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocm9vdF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQYWNrYWdlRmllbGROdW1iZXIpOwotICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKGZpbGUsIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSk7Ci0KLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgc3RyaW5nIGlkZW50aWZpZXI7Ci0gICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmaWRlbnRpZmllciwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOwotICAgICAgZmlsZS0+bXV0YWJsZV9wYWNrYWdlKCktPmFwcGVuZChpZGVudGlmaWVyKTsKLSAgICAgIGlmICghVHJ5Q29uc3VtZSgiLiIpKSBicmVhazsKLSAgICAgIGZpbGUtPm11dGFibGVfcGFja2FnZSgpLT5hcHBlbmQoIi4iKTsKLSAgICB9Ci0KLSAgICBsb2NhdGlvbi5FbmRBdChpbnB1dF8tPnByZXZpb3VzKCkpOwotCi0gICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbG9jYXRpb24pKTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFBhcnNlcjo6UGFyc2VJbXBvcnQoUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiBkZXBlbmRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzI+KiBwdWJsaWNfZGVwZW5kZW5jeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludDMyPiogd2Vha19kZXBlbmRlbmN5LAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7Ci0gIERPKENvbnN1bWUoImltcG9ydCIpKTsKLSAgaWYgKExvb2tpbmdBdCgicHVibGljIikpIHsKLSAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAotICAgICAgICByb290X2xvY2F0aW9uLCBGaWxlRGVzY3JpcHRvclByb3RvOjprUHVibGljRGVwZW5kZW5jeUZpZWxkTnVtYmVyLAotICAgICAgICBwdWJsaWNfZGVwZW5kZW5jeS0+c2l6ZSgpKTsKLSAgICBETyhDb25zdW1lKCJwdWJsaWMiKSk7Ci0gICAgKnB1YmxpY19kZXBlbmRlbmN5LT5BZGQoKSA9IGRlcGVuZGVuY3ktPnNpemUoKTsKLSAgfSBlbHNlIGlmIChMb29raW5nQXQoIndlYWsiKSkgewotICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oCi0gICAgICAgIHJvb3RfbG9jYXRpb24sIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtXZWFrRGVwZW5kZW5jeUZpZWxkTnVtYmVyLAotICAgICAgICB3ZWFrX2RlcGVuZGVuY3ktPnNpemUoKSk7Ci0gICAgRE8oQ29uc3VtZSgid2VhayIpKTsKLSAgICAqd2Vha19kZXBlbmRlbmN5LT5BZGQoKSA9IGRlcGVuZGVuY3ktPnNpemUoKTsKLSAgfQotICB7Ci0gICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a0RlcGVuZGVuY3lGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3ktPnNpemUoKSk7Ci0gICAgRE8oQ29uc3VtZVN0cmluZyhkZXBlbmRlbmN5LT5BZGQoKSwKLSAgICAgICJFeHBlY3RlZCBhIHN0cmluZyBuYW1pbmcgdGhlIGZpbGUgdG8gaW1wb3J0LiIpKTsKLQotICAgIGxvY2F0aW9uLkVuZEF0KGlucHV0Xy0+cHJldmlvdXMoKSk7Ci0KLSAgICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZsb2NhdGlvbikpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVNvdXJjZUxvY2F0aW9uVGFibGU6OlNvdXJjZUxvY2F0aW9uVGFibGUoKSB7fQotU291cmNlTG9jYXRpb25UYWJsZTo6flNvdXJjZUxvY2F0aW9uVGFibGUoKSB7fQotCi1ib29sIFNvdXJjZUxvY2F0aW9uVGFibGU6OkZpbmQoCi0gICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKLSAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCi0gICAgaW50KiBsaW5lLCBpbnQqIGNvbHVtbikgY29uc3QgewotICBjb25zdCBwYWlyPGludCwgaW50PiogcmVzdWx0ID0KLSAgICAgIEZpbmRPck51bGwobG9jYXRpb25fbWFwXywgc3RkOjptYWtlX3BhaXIoZGVzY3JpcHRvciwgbG9jYXRpb24pKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgKmxpbmUgICA9IC0xOwotICAgICpjb2x1bW4gPSAwOwotICAgIHJldHVybiBmYWxzZTsKLSAgfSBlbHNlIHsKLSAgICAqbGluZSAgID0gcmVzdWx0LT5maXJzdDsKLSAgICAqY29sdW1uID0gcmVzdWx0LT5zZWNvbmQ7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VMb2NhdGlvblRhYmxlOjpBZGQoCi0gICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKLSAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCi0gICAgaW50IGxpbmUsIGludCBjb2x1bW4pIHsKLSAgbG9jYXRpb25fbWFwX1tzdGQ6Om1ha2VfcGFpcihkZXNjcmlwdG9yLCBsb2NhdGlvbildID0KLSAgICAgIHN0ZDo6bWFrZV9wYWlyKGxpbmUsIGNvbHVtbik7Ci19Ci0KLXZvaWQgU291cmNlTG9jYXRpb25UYWJsZTo6Q2xlYXIoKSB7Ci0gIGxvY2F0aW9uX21hcF8uY2xlYXIoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzU2MWMyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NjkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIEltcGxlbWVudHMgcGFyc2luZyBvZiAucHJvdG8gZmlsZXMgdG8gRmlsZURlc2NyaXB0b3JQcm90b3MuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BBUlNFUl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BBUlNFUl9IX18KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7IGNsYXNzIE1lc3NhZ2U7IH0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci0KLS8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgotY2xhc3MgUGFyc2VyOwotY2xhc3MgU291cmNlTG9jYXRpb25UYWJsZTsKLQotLy8gSW1wbGVtZW50cyBwYXJzaW5nIG9mIHByb3RvY29sIGRlZmluaXRpb25zIChzdWNoIGFzIC5wcm90byBmaWxlcykuCi0vLwotLy8gTm90ZSB0aGF0IG1vc3QgdXNlcnMgd2lsbCBiZSBtb3JlIGludGVyZXN0ZWQgaW4gdGhlIEltcG9ydGVyIGNsYXNzLgotLy8gUGFyc2VyIGlzIGEgbG93ZXItbGV2ZWwgY2xhc3Mgd2hpY2ggc2ltcGx5IGNvbnZlcnRzIGEgc2luZ2xlIC5wcm90byBmaWxlCi0vLyB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8uICBJdCBkb2VzIG5vdCByZXNvbHZlIGltcG9ydCBkaXJlY3RpdmVzIG9yIHBlcmZvcm0KLS8vIG1hbnkgb3RoZXIga2luZHMgb2YgdmFsaWRhdGlvbiBuZWVkZWQgdG8gY29uc3RydWN0IGEgY29tcGxldGUKLS8vIEZpbGVEZXNjcmlwdG9yLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFBhcnNlciB7Ci0gcHVibGljOgotICBQYXJzZXIoKTsKLSAgflBhcnNlcigpOwotCi0gIC8vIFBhcnNlIHRoZSBlbnRpcmUgaW5wdXQgYW5kIGNvbnN0cnVjdCBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gcmVwcmVzZW50aW5nCi0gIC8vIGl0LiAgUmV0dXJucyB0cnVlIGlmIG5vIGVycm9ycyBvY2N1cnJlZCwgZmFsc2Ugb3RoZXJ3aXNlLgotICBib29sIFBhcnNlKGlvOjpUb2tlbml6ZXIqIGlucHV0LCBGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlKTsKLQotICAvLyBPcHRpb25hbCBmZXRhdXJlczoKLQotICAvLyBERVBSRUNBVEVEOiAgTmV3IGNvZGUgc2hvdWxkIHVzZSB0aGUgU291cmNlQ29kZUluZm8gZW1iZWRkZWQgaW4gdGhlCi0gIC8vICAgRmlsZURlc2NyaXB0b3JQcm90by4KLSAgLy8KLSAgLy8gUmVxdWVzdHMgdGhhdCBsb2NhdGlvbnMgb2YgY2VydGFpbiBkZWZpbml0aW9ucyBiZSByZWNvcmRlZCB0byB0aGUgZ2l2ZW4KLSAgLy8gU291cmNlTG9jYXRpb25UYWJsZSB3aGlsZSBwYXJzaW5nLiAgVGhpcyBjYW4gYmUgdXNlZCB0byBsb29rIHVwIGV4YWN0IGxpbmUKLSAgLy8gYW5kIGNvbHVtbiBudW1iZXJzIGZvciBlcnJvcnMgcmVwb3J0ZWQgYnkgRGVzY3JpcHRvclBvb2wgZHVyaW5nIHZhbGlkYXRpb24uCi0gIC8vIFNldCB0byBOVUxMICh0aGUgZGVmYXVsdCkgdG8gZGlzY2FyZCBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCi0gIHZvaWQgUmVjb3JkU291cmNlTG9jYXRpb25zVG8oU291cmNlTG9jYXRpb25UYWJsZSogbG9jYXRpb25fdGFibGUpIHsKLSAgICBzb3VyY2VfbG9jYXRpb25fdGFibGVfID0gbG9jYXRpb25fdGFibGU7Ci0gIH0KLQotICAvLyBSZXF1ZXN0cyB0aGF0IGVycm9ycyBiZSByZWNvcmRlZCB0byB0aGUgZ2l2ZW4gRXJyb3JDb2xsZWN0b3Igd2hpbGUKLSAgLy8gcGFyc2luZy4gIFNldCB0byBOVUxMICh0aGUgZGVmYXVsdCkgdG8gZGlzY2FyZCBlcnJvciBtZXNzYWdlcy4KLSAgdm9pZCBSZWNvcmRFcnJvcnNUbyhpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgewotICAgIGVycm9yX2NvbGxlY3Rvcl8gPSBlcnJvcl9jb2xsZWN0b3I7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBpZGVudGlmaWVyIHVzZWQgaW4gdGhlICJzeW50YXggPSAiIGRlY2xhcmF0aW9uLCBpZiBvbmUgd2FzCi0gIC8vIHNlZW4gZHVyaW5nIHRoZSBsYXN0IGNhbGwgdG8gUGFyc2UoKSwgb3IgdGhlIGVtcHR5IHN0cmluZyBvdGhlcndpc2UuCi0gIGNvbnN0IHN0cmluZyYgR2V0U3ludGF4SWRlbnRpZmllcigpIHsgcmV0dXJuIHN5bnRheF9pZGVudGlmaWVyXzsgfQotCi0gIC8vIElmIHNldCB0cnVlLCBpbnB1dCBmaWxlcyB3aWxsIGJlIHJlcXVpcmVkIHRvIGJlZ2luIHdpdGggYSBzeW50YXgKLSAgLy8gaWRlbnRpZmllci4gIE90aGVyd2lzZSwgZmlsZXMgbWF5IG9taXQgdGhpcy4gIElmIGEgc3ludGF4IGlkZW50aWZpZXIKLSAgLy8gaXMgcHJvdmlkZWQsIGl0IG11c3QgYmUgJ3N5bnRheCA9ICJwcm90bzIiOycgYW5kIG11c3QgYXBwZWFyIGF0IHRoZQotICAvLyB0b3Agb2YgdGhpcyBmaWxlIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgaXQgd2FzIHJlcXVpcmVkLgotICB2b2lkIFNldFJlcXVpcmVTeW50YXhJZGVudGlmaWVyKGJvb2wgdmFsdWUpIHsKLSAgICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IHZhbHVlOwotICB9Ci0KLSAgLy8gQ2FsbCBTZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKHRydWUpIHRvIHRlbGwgdGhlIHBhcnNlciB0byBzdG9wCi0gIC8vIHBhcnNpbmcgYXMgc29vbiBhcyBpdCBoYXMgc2VlbiB0aGUgc3ludGF4IGlkZW50aWZpZXIsIG9yIGxhY2sgdGhlcmVvZi4KLSAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHF1aWNrbHkgaWRlbnRpZnlpbmcgdGhlIHN5bnRheCBvZiB0aGUgZmlsZSB3aXRob3V0Ci0gIC8vIHBhcnNpbmcgdGhlIHdob2xlIHRoaW5nLiAgSWYgdGhpcyBpcyBlbmFibGVkLCBubyBlcnJvciB3aWxsIGJlIHJlY29yZGVkCi0gIC8vIGlmIHRoZSBzeW50YXggaWRlbnRpZmllciBpcyBzb21ldGhpbmcgb3RoZXIgdGhhbiAicHJvdG8yIiAoc2luY2UKLSAgLy8gcHJlc3VtYWJseSB0aGUgY2FsbGVyIGludGVuZHMgdG8gZGVhbCB3aXRoIHRoYXQpLCBidXQgb3RoZXIga2luZHMgb2YKLSAgLy8gZXJyb3JzIChlLmcuIHBhcnNlIGVycm9ycykgd2lsbCBzdGlsbCBiZSByZXBvcnRlZC4gIFdoZW4gdGhpcyBpcyBlbmFibGVkLAotICAvLyB5b3UgbWF5IHBhc3MgYSBOVUxMIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gUGFyc2UoKS4KLSAgdm9pZCBTZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKGJvb2wgdmFsdWUpIHsKLSAgICBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXyA9IHZhbHVlOwotICB9Ci0KLSBwcml2YXRlOgotICBjbGFzcyBMb2NhdGlvblJlY29yZGVyOwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIEVycm9yIHJlY292ZXJ5IGhlbHBlcnMKLQotICAvLyBDb25zdW1lIHRoZSByZXN0IG9mIHRoZSBjdXJyZW50IHN0YXRlbWVudC4gIFRoaXMgY29uc3VtZXMgdG9rZW5zCi0gIC8vIHVudGlsIGl0IHNlZXMgb25lIG9mOgotICAvLyAgICc7JyAgQ29uc3VtZXMgdGhlIHRva2VuIGFuZCByZXR1cm5zLgotICAvLyAgICd7JyAgQ29uc3VtZXMgdGhlIGJyYWNlIHRoZW4gY2FsbHMgU2tpcFJlc3RPZkJsb2NrKCkuCi0gIC8vICAgJ30nICBSZXR1cm5zIHdpdGhvdXQgY29uc3VtaW5nLgotICAvLyAgIEVPRiAgUmV0dXJucyAoY2FuJ3QgY29uc3VtZSkuCi0gIC8vIFRoZSBQYXJzZXIgb2Z0ZW4gY2FsbHMgU2tpcFN0YXRlbWVudCgpIGFmdGVyIGVuY291bnRlcmluZyBhIHN5bnRheAotICAvLyBlcnJvci4gIFRoaXMgYWxsb3dzIGl0IHRvIGdvIG9uIHBhcnNpbmcgdGhlIGZvbGxvd2luZyBsaW5lcywgYWxsb3dpbmcKLSAgLy8gaXQgdG8gcmVwb3J0IG1vcmUgdGhhbiBqdXN0IG9uZSBlcnJvciBpbiB0aGUgZmlsZS4KLSAgdm9pZCBTa2lwU3RhdGVtZW50KCk7Ci0KLSAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiB0aGUgY3VycmVudCBibG9jaywgaW5jbHVkaW5nIG5lc3RlZCBibG9ja3MsCi0gIC8vIGVuZGluZyBhZnRlciB0aGUgY2xvc2luZyAnfScgaXMgZW5jb3VudGVyZWQgYW5kIGNvbnN1bWVkLCBvciBhdCBFT0YuCi0gIHZvaWQgU2tpcFJlc3RPZkJsb2NrKCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gU2luZ2xlLXRva2VuIGNvbnN1bWluZyBoZWxwZXJzCi0gIC8vCi0gIC8vIFRoZXNlIG1ha2UgcGFyc2luZyBjb2RlIG1vcmUgcmVhZGFibGUuCi0KLSAgLy8gVHJ1ZSBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBUWVBFX0VORC4KLSAgaW5saW5lIGJvb2wgQXRFbmQoKTsKLQotICAvLyBUcnVlIGlmIHRoZSBuZXh0IHRva2VuIG1hdGNoZXMgdGhlIGdpdmVuIHRleHQuCi0gIGlubGluZSBib29sIExvb2tpbmdBdChjb25zdCBjaGFyKiB0ZXh0KTsKLSAgLy8gVHJ1ZSBpZiB0aGUgbmV4dCB0b2tlbiBpcyBvZiB0aGUgZ2l2ZW4gdHlwZS4KLSAgaW5saW5lIGJvb2wgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUb2tlblR5cGUgdG9rZW5fdHlwZSk7Ci0KLSAgLy8gSWYgdGhlIG5leHQgdG9rZW4gZXhhY3RseSBtYXRjaGVzIHRoZSB0ZXh0IGdpdmVuLCBjb25zdW1lIGl0IGFuZCByZXR1cm4KLSAgLy8gdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJuIGZhbHNlIHdpdGhvdXQgbG9nZ2luZyBhbiBlcnJvci4KLSAgYm9vbCBUcnlDb25zdW1lKGNvbnN0IGNoYXIqIHRleHQpOwotCi0gIC8vIFRoZXNlIGF0dGVtcHQgdG8gcmVhZCBzb21lIGtpbmQgb2YgdG9rZW4gZnJvbSB0aGUgaW5wdXQuICBJZiBzdWNjZXNzZnVsLAotICAvLyB0aGV5IHJldHVybiB0cnVlLiAgT3RoZXJ3aXNlIHRoZXkgcmV0dXJuIGZhbHNlIGFuZCBhZGQgdGhlIGdpdmVuIGVycm9yCi0gIC8vIHRvIHRoZSBlcnJvciBsaXN0LgotCi0gIC8vIENvbnN1bWUgYSB0b2tlbiB3aXRoIHRoZSBleGFjdCB0ZXh0IGdpdmVuLgotICBib29sIENvbnN1bWUoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXJyb3IpOwotICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMgdGhlIGVycm9yICJFeHBlY3RlZCBcInRleHRcIi4iLAotICAvLyB3aGVyZSAidGV4dCIgaXMgdGhlIGV4cGVjdGVkIHRva2VuIHRleHQuCi0gIGJvb2wgQ29uc3VtZShjb25zdCBjaGFyKiB0ZXh0KTsKLSAgLy8gQ29uc3VtZSBhIHRva2VuIG9mIHR5cGUgSURFTlRJRklFUiBhbmQgc3RvcmUgaXRzIHRleHQgaW4gIm91dHB1dCIuCi0gIGJvb2wgQ29uc3VtZUlkZW50aWZpZXIoc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKLSAgLy8gQ29uc3VtZSBhbiBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuCi0gIGJvb2wgQ29uc3VtZUludGVnZXIoaW50KiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKLSAgLy8gQ29uc3VtZSBhIHNpZ25lZCBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuCi0gIGJvb2wgQ29uc3VtZVNpZ25lZEludGVnZXIoaW50KiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKLSAgLy8gQ29uc3VtZSBhIDY0LWJpdCBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuICBJZiB0aGUgdmFsdWUKLSAgLy8gaXMgZ3JlYXRlciB0aGFuIG1heF92YWx1ZSwgYW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZC4KLSAgYm9vbCBDb25zdW1lSW50ZWdlcjY0KHVpbnQ2NCBtYXhfdmFsdWUsIHVpbnQ2NCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7Ci0gIC8vIENvbnN1bWUgYSBudW1iZXIgYW5kIHN0b3JlIGl0cyB2YWx1ZSBpbiAib3V0cHV0Ii4gIFRoaXMgd2lsbCBhY2NlcHQKLSAgLy8gdG9rZW5zIG9mIGVpdGhlciBJTlRFR0VSIG9yIEZMT0FUIHR5cGUuCi0gIGJvb2wgQ29uc3VtZU51bWJlcihkb3VibGUqIG91dHB1dCwgY29uc3QgY2hhciogZXJyb3IpOwotICAvLyBDb25zdW1lIGEgc3RyaW5nIGxpdGVyYWwgYW5kIHN0b3JlIGl0cyAodW5lc2NhcGVkKSB2YWx1ZSBpbiAib3V0cHV0Ii4KLSAgYm9vbCBDb25zdW1lU3RyaW5nKHN0cmluZyogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7Ci0KLSAgLy8gQ29uc3VtZSBhIHRva2VuIHJlcHJlc2VudGluZyB0aGUgZW5kIG9mIHRoZSBzdGF0ZW1lbnQuICBDb21tZW50cyBiZXR3ZWVuCi0gIC8vIHRoaXMgdG9rZW4gYW5kIHRoZSBuZXh0IHdpbGwgYmUgaGFydmVzdGVkIGZvciBkb2N1bWVudGF0aW9uLiAgVGhlIGdpdmVuCi0gIC8vIExvY2F0aW9uUmVjb3JkZXIgc2hvdWxkIHJlZmVyIHRvIHRoZSBkZWNsYXJhdGlvbiB0aGF0IHdhcyBqdXN0IHBhcnNlZDsKLSAgLy8gaXQgd2lsbCBiZSBwb3B1bGF0ZWQgd2l0aCB0aGVzZSBjb21tZW50cy4KLSAgLy8KLSAgLy8gVE9ETyhrZW50b24pOiAgVGhlIExvY2F0aW9uUmVjb3JkZXIgaXMgY29uc3QgYmVjYXVzZSBoaXN0b3JpY2FsbHkgbG9jYXRpb25zCi0gIC8vICAgaGF2ZSBiZWVuIHBhc3NlZCBhcm91bmQgYnkgY29uc3QgcmVmZXJlbmNlLCBmb3Igbm8gcGFydGljdWxhcmx5IGdvb2QKLSAgLy8gICByZWFzb24uICBXZSBzaG91bGQgcHJvYmFibHkgZ28gdGhyb3VnaCBhbmQgY2hhbmdlIHRoZW0gYWxsIHRvIG11dGFibGUKLSAgLy8gICBwb2ludGVyIHRvIG1ha2UgdGhpcyBtb3JlIGludHVpdGl2ZS4KLSAgYm9vbCBUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigKLSAgICAgIGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKTsKLSAgYm9vbCBUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbkZpbmlzaFNjb3BlKAotICAgICAgY29uc3QgY2hhciogdGV4dCwgY29uc3QgTG9jYXRpb25SZWNvcmRlciogbG9jYXRpb24pOwotCi0gIGJvb2wgQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oCi0gICAgICBjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBMb2NhdGlvblJlY29yZGVyKiBsb2NhdGlvbik7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRXJyb3IgbG9nZ2luZyBoZWxwZXJzCi0KLSAgLy8gSW52b2tlcyBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcigpLCBpZiBlcnJvcl9jb2xsZWN0b3JfIGlzIG5vdCBOVUxMLgotICB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIGVycm9yKTsKLQotICAvLyBJbnZva2VzIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKCkgd2l0aCB0aGUgbGluZSBhbmQgY29sdW1uIG51bWJlcgotICAvLyBvZiB0aGUgY3VycmVudCB0b2tlbi4KLSAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGVycm9yKTsKLQotICAvLyBSZWNvcmRzIGEgbG9jYXRpb24gaW4gdGhlIFNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uIHRhYmxlIChzZWUKLSAgLy8gZGVzY3JpcHRvci5wcm90bykuICBXZSB1c2UgUkFJSSB0byBlbnN1cmUgdGhhdCB0aGUgc3RhcnQgYW5kIGVuZCBsb2NhdGlvbnMKLSAgLy8gYXJlIHJlY29yZGVkIC0tIHRoZSBjb25zdHJ1Y3RvciByZWNvcmRzIHRoZSBzdGFydCBsb2NhdGlvbiBhbmQgdGhlCi0gIC8vIGRlc3RydWN0b3IgcmVjb3JkcyB0aGUgZW5kIGxvY2F0aW9uLiAgU2luY2UgdGhlIHBhcnNlciBpcwotICAvLyByZWN1cnNpdmUtZGVzY2VudCwgdGhpcyB3b3JrcyBvdXQgYmVhdXRpZnVsbHkuCi0gIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBMb2NhdGlvblJlY29yZGVyIHsKLSAgIHB1YmxpYzoKLSAgICAvLyBDb25zdHJ1Y3QgdGhlIGZpbGUncyAicm9vdCIgbG9jYXRpb24uCi0gICAgTG9jYXRpb25SZWNvcmRlcihQYXJzZXIqIHBhcnNlcik7Ci0KLSAgICAvLyBDb25zdHJ1Y3QgYSBsb2NhdGlvbiB0aGF0IHJlcHJlc2VudHMgYSBkZWNsYXJhdGlvbiBuZXN0ZWQgd2l0aGluIHRoZQotICAgIC8vIGdpdmVuIHBhcmVudC4gIEUuZy4gYSBmaWVsZCdzIGxvY2F0aW9uIGlzIG5lc3RlZCB3aXRoaW4gdGhlIGxvY2F0aW9uCi0gICAgLy8gZm9yIGEgbWVzc2FnZSB0eXBlLiAgVGhlIHBhcmVudCdzIHBhdGggd2lsbCBiZSBjb3BpZWQsIHNvIHlvdSBzaG91bGQKLSAgICAvLyBjYWxsIEFkZFBhdGgoKSBvbmx5IHRvIGFkZCB0aGUgcGF0aCBjb21wb25lbnRzIGxlYWRpbmcgZnJvbSB0aGUgcGFyZW50Ci0gICAgLy8gdG8gdGhlIGNoaWxkIChhcyBvcHBvc2VkIHRvIGxlYWRpbmcgZnJvbSB0aGUgcm9vdCB0byB0aGUgY2hpbGQpLgotICAgIExvY2F0aW9uUmVjb3JkZXIoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50KTsKLQotICAgIC8vIENvbnZlbmllbmNlIGNvbnN0cnVjdG9ycyB0aGF0IGNhbGwgQWRkUGF0aCgpIG9uZSBvciB0d28gdGltZXMuCi0gICAgTG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsIGludCBwYXRoMSk7Ci0gICAgTG9jYXRpb25SZWNvcmRlcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQsIGludCBwYXRoMSwgaW50IHBhdGgyKTsKLQotICAgIH5Mb2NhdGlvblJlY29yZGVyKCk7Ci0KLSAgICAvLyBBZGQgYSBwYXRoIGNvbXBvbmVudC4gIFNlZSBTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoIGluCi0gICAgLy8gZGVzY3JpcHRvci5wcm90by4KLSAgICB2b2lkIEFkZFBhdGgoaW50IHBhdGhfY29tcG9uZW50KTsKLQotICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQgdG8gc3RhcnQgYXQgdGhlIGN1cnJlbnQgdG9rZW4gYXQKLSAgICAvLyB0aGUgdGltZSB0aGUgTG9jYXRpb25SZWNvcmRlciBpcyBjcmVhdGVkLiAgU3RhcnRBdCgpIHNldHMgdGhlIHN0YXJ0Ci0gICAgLy8gbG9jYXRpb24gdG8gdGhlIGdpdmVuIHRva2VuIGluc3RlYWQuCi0gICAgdm9pZCBTdGFydEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbik7Ci0KLSAgICAvLyBTdGFydCBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcyBzb21lIG90aGVyIExvY2F0aW9uUmVjb3JkZXIuCi0gICAgdm9pZCBTdGFydEF0KGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG90aGVyKTsKLQotICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQgdG8gZW5kIGF0IHRoZSBwcmV2aW91cyB0b2tlbiBhdAotICAgIC8vIHRoZSB0aW1lIHRoZSBMb2NhdGlvblJlY29yZGVyIGlzIGRlc3Ryb3llZC4gIEVuZEF0KCkgc2V0cyB0aGUgZW5kCi0gICAgLy8gbG9jYXRpb24gdG8gdGhlIGdpdmVuIHRva2VuIGluc3RlYWQuCi0gICAgdm9pZCBFbmRBdChjb25zdCBpbzo6VG9rZW5pemVyOjpUb2tlbiYgdG9rZW4pOwotCi0gICAgLy8gUmVjb3JkcyB0aGUgc3RhcnQgcG9pbnQgb2YgdGhpcyBsb2NhdGlvbiB0byB0aGUgU291cmNlTG9jYXRpb25UYWJsZSB0aGF0Ci0gICAgLy8gd2FzIHBhc3NlZCB0byBSZWNvcmRTb3VyY2VMb2NhdGlvbnNUbygpLCBpZiBhbnkuICBTb3VyY2VMb2NhdGlvblRhYmxlCi0gICAgLy8gaXMgYW4gb2xkZXIgd2F5IG9mIGtlZXBpbmcgdHJhY2sgb2Ygc291cmNlIGxvY2F0aW9ucyB3aGljaCBpcyBzdGlsbAotICAgIC8vIHVzZWQgaW4gc29tZSBwbGFjZXMuCi0gICAgdm9pZCBSZWNvcmRMZWdhY3lMb2NhdGlvbihjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAotICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24pOwotCi0gICAgLy8gQXR0YWNoZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgY29tbWVudHMgdG8gdGhlIGxvY2F0aW9uLiAgVGhlIHR3byBzdHJpbmdzCi0gICAgLy8gd2lsbCBiZSBzd2FwcGVkIGludG8gcGxhY2UsIHNvIGFmdGVyIHRoaXMgaXMgY2FsbGVkICpsZWFkaW5nIGFuZAotICAgIC8vICp0cmFpbGluZyB3aWxsIGJlIGVtcHR5LgotICAgIC8vCi0gICAgLy8gVE9ETyhrZW50b24pOiAgU2VlIGNvbW1lbnQgb24gVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oKSwgYWJvdmUsIGZvcgotICAgIC8vICAgd2h5IHRoaXMgaXMgY29uc3QuCi0gICAgdm9pZCBBdHRhY2hDb21tZW50cyhzdHJpbmcqIGxlYWRpbmcsIHN0cmluZyogdHJhaWxpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMpIGNvbnN0OwotCi0gICBwcml2YXRlOgotICAgIC8vIEluZGV4ZXMgb2YgcGFyZW50IGFuZCBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBwYXJlbnQKLSAgICAvLyBTb3VyY2VDb2RlSW5mby5sb2NhdGlvbiByZXBlYXRlZCBmaWVsZC4gRm9yIHRvcC1sZXZlbCBlbGVtZW50cywKLSAgICAvLyBwYXJlbnRfaW5kZXhfIGlzIC0xLgotICAgIFBhcnNlciogcGFyc2VyXzsKLSAgICBTb3VyY2VDb2RlSW5mbzo6TG9jYXRpb24qIGxvY2F0aW9uXzsKLQotICAgIHZvaWQgSW5pdChjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQpOwotICB9OwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFBhcnNlcnMgZm9yIHZhcmlvdXMgbGFuZ3VhZ2UgY29uc3RydWN0cwotCi0gIC8vIFBhcnNlcyB0aGUgInN5bnRheCA9IFwicHJvdG8yXCI7IiBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICBSZXR1cm5zCi0gIC8vIGZhbHNlIGlmIGl0IGZhaWxlZCB0byBwYXJzZSBvciBpZiB0aGUgc3ludGF4IGlkZW50aWZpZXIgd2FzIG5vdAotICAvLyByZWNvZ25pemVkLgotICBib29sIFBhcnNlU3ludGF4SWRlbnRpZmllcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQpOwotCi0gIC8vIFRoZXNlIG1ldGhvZHMgcGFyc2UgdmFyaW91cyBpbmRpdmlkdWFsIGJpdHMgb2YgY29kZS4gIFRoZXkgcmV0dXJuCi0gIC8vIGZhbHNlIGlmIHRoZXkgY29tcGxldGVseSBmYWlsIHRvIHBhcnNlIHRoZSBjb25zdHJ1Y3QuICBJbiB0aGlzIGNhc2UsCi0gIC8vIGl0IGlzIHByb2JhYmx5IG5lY2Vzc2FyeSB0byBza2lwIHRoZSByZXN0IG9mIHRoZSBzdGF0ZW1lbnQgdG8gcmVjb3Zlci4KLSAgLy8gSG93ZXZlciwgaWYgdGhlc2UgbWV0aG9kcyByZXR1cm4gdHJ1ZSwgaXQgZG9lcyBOT1QgbWVhbiB0aGF0IHRoZXJlCi0gIC8vIHdlcmUgbm8gZXJyb3JzOyBvbmx5IHRoYXQgdGhlcmUgd2VyZSBubyAqc3ludGF4KiBlcnJvcnMuICBGb3IgaW5zdGFuY2UsCi0gIC8vIGlmIGEgc2VydmljZSBtZXRob2QgaXMgZGVmaW5lZCB1c2luZyBwcm9wZXIgc3ludGF4IGJ1dCB1c2VzIGEgcHJpbWl0aXZlCi0gIC8vIHR5cGUgYXMgaXRzIGlucHV0IG9yIG91dHB1dCwgUGFyc2VNZXRob2RGaWVsZCgpIHN0aWxsIHJldHVybnMgdHJ1ZQotICAvLyBhbmQgb25seSByZXBvcnRzIHRoZSBlcnJvciBieSBjYWxsaW5nIEFkZEVycm9yKCkuICBJbiBwcmFjdGljZSwgdGhpcwotICAvLyBtYWtlcyBsb2dpYyBtdWNoIHNpbXBsZXIgZm9yIHRoZSBjYWxsZXIuCi0KLSAgLy8gUGFyc2UgYSB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgc2VydmljZSwgZXRjLgotICBib29sIFBhcnNlVG9wTGV2ZWxTdGF0ZW1lbnQoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24pOwotCi0gIC8vIFBhcnNlIHZhcmlvdXMgbGFuZ3VhZ2UgaGlnaC1sZXZlbCBsYW5ndWFnZSBjb25zdHJ1cmN0cy4KLSAgYm9vbCBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotICBib29sIFBhcnNlRW51bURlZmluaXRpb24oRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIGJvb2wgUGFyc2VTZXJ2aWNlRGVmaW5pdGlvbihTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIGJvb2wgUGFyc2VQYWNrYWdlKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0gIGJvb2wgUGFyc2VJbXBvcnQoUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiBkZXBlbmRlbmN5LAotICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50MzI+KiBwdWJsaWNfZGVwZW5kZW5jeSwKLSAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludDMyPiogd2Vha19kZXBlbmRlbmN5LAotICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKLQotICAvLyBUaGVzZSBtZXRob2RzIHBhcnNlIHRoZSBjb250ZW50cyBvZiBhIG1lc3NhZ2UsIGVudW0sIG9yIHNlcnZpY2UgdHlwZSBhbmQKLSAgLy8gYWRkIHRoZW0gdG8gdGhlIGdpdmVuIG9iamVjdC4gIFRoZXkgY29uc3VtZSB0aGUgZW50aXJlIGJsb2NrIGluY2x1ZGluZwotICAvLyB0aGUgYmVnaW5uaW5nIGFuZCBlbmRpbmcgYnJhY2UuCi0gIGJvb2wgUGFyc2VNZXNzYWdlQmxvY2soRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKLSAgYm9vbCBQYXJzZUVudW1CbG9jayhFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotICBib29sIFBhcnNlU2VydmljZUJsb2NrKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotCi0gIC8vIFBhcnNlIG9uZSBzdGF0ZW1lbnQgd2l0aGluIGEgbWVzc2FnZSwgZW51bSwgb3Igc2VydmljZSBibG9jaywgaW5jbHVkaW5nCi0gIC8vIGZpbmFsIHNlbWljb2xvbi4KLSAgYm9vbCBQYXJzZU1lc3NhZ2VTdGF0ZW1lbnQoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotICBib29sIFBhcnNlRW51bVN0YXRlbWVudChFbnVtRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotICBib29sIFBhcnNlU2VydmljZVN0YXRlbWVudChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotCi0gIC8vIFBhcnNlIGEgZmllbGQgb2YgYSBtZXNzYWdlLiAgSWYgdGhlIGZpZWxkIGlzIGEgZ3JvdXAsIGl0cyB0eXBlIHdpbGwgYmUKLSAgLy8gYWRkZWQgdG8gIm1lc3NhZ2VzIi4KLSAgLy8KLSAgLy8gcGFyZW50X2xvY2F0aW9uIGFuZCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlIGFyZSBuZWVkZWQgd2hlbgotICAvLyBwYXJzaW5nIGdyb3VwcyAtLSB3ZSBuZWVkIHRvIGdlbmVyYXRlIGEgbmVzdGVkIG1lc3NhZ2UgdHlwZSB3aXRoaW4gdGhlCi0gIC8vIHBhcmVudCBhbmQgcmVjb3JkIGl0cyBsb2NhdGlvbiBhY2NvcmRpbmdseS4gIFNpbmNlIHRoZSBwYXJlbnQgY291bGQgYmUKLSAgLy8gZWl0aGVyIGEgRmlsZURlc2NyaXB0b3JQcm90byBvciBhIERlc2NyaXB0b3JQcm90bywgd2UgbXVzdCBwYXNzIGluIHRoZQotICAvLyBjb3JyZWN0IGZpZWxkIG51bWJlciB0byB1c2UuCi0gIGJvb2wgUGFyc2VNZXNzYWdlRmllbGQoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0KLSAgLy8gTGlrZSBQYXJzZU1lc3NhZ2VGaWVsZCgpIGJ1dCBleHBlY3RzIHRoZSBsYWJlbCBoYXMgYWxyZWFkeSBiZWVuIGZpbGxlZCBpbgotICAvLyBieSB0aGUgY2FsbGVyLgotICBib29sIFBhcnNlTWVzc2FnZUZpZWxkTm9MYWJlbChGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotCi0gIC8vIFBhcnNlIGFuICJleHRlbnNpb25zIiBkZWNsYXJhdGlvbi4KLSAgYm9vbCBQYXJzZUV4dGVuc2lvbnMoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBleHRlbnNpb25zX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotCi0gIC8vIFBhcnNlIGEgInJlc2VydmVkIiBkZWNsYXJhdGlvbi4KLSAgYm9vbCBQYXJzZVJlc2VydmVkKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pOwotICBib29sIFBhcnNlUmVzZXJ2ZWROYW1lcyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbik7Ci0gIGJvb2wgUGFyc2VSZXNlcnZlZE51bWJlcnMoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbik7Ci0KLSAgLy8gUGFyc2UgYW4gImV4dGVuZCIgZGVjbGFyYXRpb24uICAoU2VlIGFsc28gY29tbWVudHMgZm9yCi0gIC8vIFBhcnNlTWVzc2FnZUZpZWxkKCkuKQotICBib29sIFBhcnNlRXh0ZW5kKFJlcGVhdGVkUHRyRmllbGQ8RmllbGREZXNjcmlwdG9yUHJvdG8+KiBleHRlbnNpb25zLAotICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgIGludCBsb2NhdGlvbl9maWVsZF9udW1iZXJfZm9yX25lc3RlZF90eXBlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGV4dGVuZF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotCi0gIC8vIFBhcnNlIGEgIm9uZW9mIiBkZWNsYXJhdGlvbi4gIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yIHNldHRpbmcKLSAgLy8gb25lb2ZfZGVjbC0+bGFiZWwoKSBzaW5jZSBpdCB3aWxsIGhhdmUgaGFkIHRvIHBhcnNlIHRoZSBsYWJlbCBiZWZvcmUgaXQKLSAgLy8ga25ldyBpdCB3YXMgcGFyc2luZyBhIG9uZW9mLgotICBib29sIFBhcnNlT25lb2YoT25lb2ZEZXNjcmlwdG9yUHJvdG8qIG9uZW9mX2RlY2wsCi0gICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgIGludCBvbmVvZl9pbmRleCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9uZW9mX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgY29udGFpbmluZ190eXBlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKLQotICAvLyBQYXJzZSBhIHNpbmdsZSBlbnVtIHZhbHVlIHdpdGhpbiBhbiBlbnVtIGJsb2NrLgotICBib29sIFBhcnNlRW51bUNvbnN0YW50KEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZW51bV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0KLSAgLy8gUGFyc2UgZW51bSBjb25zdGFudCBvcHRpb25zLCBpLmUuIHRoZSBsaXN0IGluIHNxdWFyZSBicmFja2V0cyBhdCB0aGUgZW5kCi0gIC8vIG9mIHRoZSBlbnVtIGNvbnN0YW50IHZhbHVlIGRlZmluaXRpb24uCi0gIGJvb2wgUGFyc2VFbnVtQ29uc3RhbnRPcHRpb25zKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0KLSAgLy8gUGFyc2UgYSBzaW5nbGUgbWV0aG9kIHdpdGhpbiBhIHNlcnZpY2UgZGVmaW5pdGlvbi4KLSAgYm9vbCBQYXJzZVNlcnZpY2VNZXRob2QoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1ldGhvZF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKLQotCi0gIC8vIFBhcnNlIG9wdGlvbnMgb2YgYSBzaW5nbGUgbWV0aG9kIG9yIHN0cmVhbS4KLSAgYm9vbCBQYXJzZU1ldGhvZE9wdGlvbnMoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFyZW50X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvcHRpb25zRmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG11dGFibGVfb3B0aW9ucyk7Ci0KLSAgLy8gUGFyc2UgInJlcXVpcmVkIiwgIm9wdGlvbmFsIiwgb3IgInJlcGVhdGVkIiBhbmQgZmlsbCBpbiAibGFiZWwiCi0gIC8vIHdpdGggdGhlIHZhbHVlLiBSZXR1cm5zIHRydWUgaWYgc3VjaCBhIGxhYmVsIGlzIGNvbnN1bWVkLgotICBib29sIFBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0KLSAgLy8gUGFyc2UgYSB0eXBlIG5hbWUgYW5kIGZpbGwgaW4gInR5cGUiIChpZiBpdCBpcyBhIHByaW1pdGl2ZSkgb3IKLSAgLy8gInR5cGVfbmFtZSIgKGlmIGl0IGlzIG5vdCkgd2l0aCB0aGUgdHlwZSBwYXJzZWQuCi0gIGJvb2wgUGFyc2VUeXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlKiB0eXBlLAotICAgICAgICAgICAgICAgICBzdHJpbmcqIHR5cGVfbmFtZSk7Ci0gIC8vIFBhcnNlIGEgdXNlci1kZWZpbmVkIHR5cGUgYW5kIGZpbGwgaW4gInR5cGVfbmFtZSIgd2l0aCB0aGUgbmFtZS4KLSAgLy8gSWYgYSBwcmltaXRpdmUgdHlwZSBpcyBuYW1lZCwgaXQgaXMgdHJlYXRlZCBhcyBhbiBlcnJvci4KLSAgYm9vbCBQYXJzZVVzZXJEZWZpbmVkVHlwZShzdHJpbmcqIHR5cGVfbmFtZSk7Ci0KLSAgLy8gUGFyc2VzIGZpZWxkIG9wdGlvbnMsIGkuZS4gdGhlIHN0dWZmIGluIHNxdWFyZSBicmFja2V0cyBhdCB0aGUgZW5kCi0gIC8vIG9mIGEgZmllbGQgZGVmaW5pdGlvbi4gIEFsc28gcGFyc2VzIGRlZmF1bHQgdmFsdWUuCi0gIGJvb2wgUGFyc2VGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0KLSAgLy8gUGFyc2UgdGhlICJkZWZhdWx0IiBvcHRpb24uICBUaGlzIG5lZWRzIHNwZWNpYWwgaGFuZGxpbmcgYmVjYXVzZSBpdHMKLSAgLy8gdHlwZSBpcyB0aGUgZmllbGQncyB0eXBlLgotICBib29sIFBhcnNlRGVmYXVsdEFzc2lnbm1lbnQoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwotCi0gIGJvb2wgUGFyc2VKc29uTmFtZShGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7Ci0KLSAgZW51bSBPcHRpb25TdHlsZSB7Ci0gICAgT1BUSU9OX0FTU0lHTk1FTlQsICAvLyBqdXN0ICJuYW1lID0gdmFsdWUiCi0gICAgT1BUSU9OX1NUQVRFTUVOVCAgICAvLyAib3B0aW9uIG5hbWUgPSB2YWx1ZTsiCi0gIH07Ci0KLSAgLy8gUGFyc2UgYSBzaW5nbGUgb3B0aW9uIG5hbWUvdmFsdWUgcGFpciwgZS5nLiAiY3R5cGUgPSBDT1JEIi4gIFRoZSBuYW1lCi0gIC8vIGlkZW50aWZpZXMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gTWVzc2FnZSwgYW5kIHRoZSB2YWx1ZSBvZiB0aGF0IGZpZWxkCi0gIC8vIGlzIHNldCB0byB0aGUgcGFyc2VkIHZhbHVlLgotICBib29sIFBhcnNlT3B0aW9uKE1lc3NhZ2UqIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb3B0aW9uc19sb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUsCi0gICAgICAgICAgICAgICAgICAgT3B0aW9uU3R5bGUgc3R5bGUpOwotCi0gIC8vIFBhcnNlcyBhIHNpbmdsZSBwYXJ0IG9mIGEgbXVsdGlwYXJ0IG9wdGlvbiBuYW1lLiBBIG11bHRpcGFydCBuYW1lIGNvbnNpc3RzCi0gIC8vIG9mIG5hbWVzIHNlcGFyYXRlZCBieSBkb3RzLiBFYWNoIG5hbWUgaXMgZWl0aGVyIGFuIGlkZW50aWZpZXIgb3IgYSBzZXJpZXMKLSAgLy8gb2YgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5IGRvdHMgYW5kIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLiBFLmcuLAotICAvLyAiZm9vLihiYXIuYmF6KS5xdXgiLgotICBib29sIFBhcnNlT3B0aW9uTmFtZVBhcnQoVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJ0X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKLQotICAvLyBQYXJzZXMgYSBzdHJpbmcgc3Vycm91bmRlZCBieSBiYWxhbmNlZCBicmFjZXMuICBTdHJpcHMgb2ZmIHRoZSBvdXRlcgotICAvLyBicmFjZXMgYW5kIHN0b3JlcyB0aGUgZW5jbG9zZWQgc3RyaW5nIGluICp2YWx1ZS4KLSAgLy8gRS5nLiwKLSAgLy8gICAgIHsgZm9vIH0gICAgICAgICAgICAgICAgICAgICAqdmFsdWUgZ2V0cyAnZm9vJwotICAvLyAgICAgeyBmb28geyBiYXI6IGJveCB9IH0gICAgICAgICp2YWx1ZSBnZXRzICdmb28geyBiYXI6IGJveCB9JwotICAvLyAgICAge30gICAgICAgICAgICAgICAgICAgICAgICAgICp2YWx1ZSBnZXRzICcnCi0gIC8vCi0gIC8vIFJFUVVJUkVTOiBMb29raW5nQXQoInsiKQotICAvLyBXaGVuIGZpbmlzaGVkIHN1Y2Nlc3NmdWxseSwgd2UgYXJlIGxvb2tpbmcgYXQgdGhlIGZpcnN0IHRva2VuIHBhc3QKLSAgLy8gdGhlIGVuZGluZyBicmFjZS4KLSAgYm9vbCBQYXJzZVVuaW50ZXJwcmV0ZWRCbG9jayhzdHJpbmcqIHZhbHVlKTsKLQotICBzdHJ1Y3QgTWFwRmllbGQgewotICAgIC8vIFdoZXRoZXIgdGhlIGZpZWxkIGlzIGEgbWFwIGZpZWxkLgotICAgIGJvb2wgaXNfbWFwX2ZpZWxkOwotICAgIC8vIFRoZSB0eXBlcyBvZiB0aGUga2V5IGFuZCB2YWx1ZSBpZiB0aGV5IGFyZSBwcmltaXRpdmUgdHlwZXMuCi0gICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUga2V5X3R5cGU7Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdmFsdWVfdHlwZTsKLSAgICAvLyBPciB0aGUgdHlwZSBuYW1lcyBzdHJpbmcgaWYgdGhlIHR5cGVzIGFyZSBjdXN0b21pemVkIHR5cGVzLgotICAgIHN0cmluZyBrZXlfdHlwZV9uYW1lOwotICAgIHN0cmluZyB2YWx1ZV90eXBlX25hbWU7Ci0KLSAgICBNYXBGaWVsZCgpIDogaXNfbWFwX2ZpZWxkKGZhbHNlKSB7fQotICB9OwotICAvLyBEZXN1Z2FyIHRoZSBtYXAgc3ludGF4IHRvIGdlbmVyYXRlIGEgbmVzdGVkIG1hcCBlbnRyeSBtZXNzYWdlLgotICB2b2lkIEdlbmVyYXRlTWFwRW50cnkoY29uc3QgTWFwRmllbGQmIG1hcF9maWVsZCwgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcyk7Ci0KLSAgLy8gV2hldGhlciBmaWVsZHMgd2l0aG91dCBsYWJlbCBkZWZhdWx0IHRvIG9wdGlvbmFsIGZpZWxkcy4KLSAgYm9vbCBEZWZhdWx0VG9PcHRpb25hbEZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gc3ludGF4X2lkZW50aWZpZXJfID09ICJwcm90bzMiOwotICB9Ci0KLQotICBib29sIFZhbGlkYXRlRW51bShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBwcm90byk7Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBpbzo6VG9rZW5pemVyKiBpbnB1dF87Ci0gIGlvOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKLSAgU291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm9fOwotICBTb3VyY2VMb2NhdGlvblRhYmxlKiBzb3VyY2VfbG9jYXRpb25fdGFibGVfOyAgLy8gbGVnYWN5Ci0gIGJvb2wgaGFkX2Vycm9yc187Ci0gIGJvb2wgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl87Ci0gIGJvb2wgc3RvcF9hZnRlcl9zeW50YXhfaWRlbnRpZmllcl87Ci0gIHN0cmluZyBzeW50YXhfaWRlbnRpZmllcl87Ci0KLSAgLy8gTGVhZGluZyBkb2MgY29tbWVudHMgZm9yIHRoZSBuZXh0IGRlY2xhcmF0aW9uLiAgVGhlc2UgYXJlIG5vdCBjb21wbGV0ZQotICAvLyB5ZXQ7IHVzZSBDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigpIHRvIGdldCB0aGUgY29tcGxldGUgY29tbWVudHMuCi0gIHN0cmluZyB1cGNvbWluZ19kb2NfY29tbWVudHNfOwotCi0gIC8vIERldGFjaGVkIGNvbW1lbnRzIGFyZSBub3QgY29ubmVjdGVkIHRvIGFueSBzeW50YXggZW50aXRpZXMuIEVsZW1lbnRzIGluCi0gIC8vIHRoaXMgdmVjdG9yIGFyZSBwYXJhZ3JhcGhzIG9mIGNvbW1lbnRzIHNlcGFyYXRlZCBieSBlbXB0eSBsaW5lcy4gVGhlCi0gIC8vIGRldGFjaGVkIGNvbW1lbnRzIHdpbGwgYmUgcHV0IGludG8gdGhlIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgZmllbGQgZm9yCi0gIC8vIHRoZSBuZXh0IGVsZW1lbnQgKFNlZSBTb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBpbiBkZXNjcmlwdG9yLnByb3RvKSwgd2hlbgotICAvLyBDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigpIGlzIGNhbGxlZC4KLSAgdmVjdG9yPHN0cmluZz4gdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJzZXIpOwotfTsKLQotLy8gQSB0YWJsZSBtYXBwaW5nIChkZXNjcmlwdG9yLCBFcnJvckxvY2F0aW9uKSBwYWlycyAtLSBhcyByZXBvcnRlZCBieQotLy8gRGVzY3JpcHRvclBvb2wgd2hlbiB2YWxpZGF0aW5nIGRlc2NyaXB0b3JzIC0tIHRvIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzCi0vLyB3aXRoaW4gdGhlIG9yaWdpbmFsIHNvdXJjZSBjb2RlLgotLy8KLS8vIFRoaXMgaXMgc2VtaS1vYnNvbGV0ZTogIEZpbGVEZXNjcmlwdG9yUHJvdG8uc291cmNlX2NvZGVfaW5mbyBub3cgY29udGFpbnMKLS8vIGZhciBtb3JlIGNvbXBsZXRlIGluZm9ybWF0aW9uIGFib3V0IHNvdXJjZSBsb2NhdGlvbnMuICBIb3dldmVyLCBhcyBvZiB0aGlzCi0vLyB3cml0aW5nIHlvdSBzdGlsbCBuZWVkIHRvIHVzZSBTb3VyY2VMb2NhdGlvblRhYmxlIHdoZW4gaW50ZWdyYXRpbmcgd2l0aAotLy8gRGVzY3JpcHRvclBvb2wuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU291cmNlTG9jYXRpb25UYWJsZSB7Ci0gcHVibGljOgotICBTb3VyY2VMb2NhdGlvblRhYmxlKCk7Ci0gIH5Tb3VyY2VMb2NhdGlvblRhYmxlKCk7Ci0KLSAgLy8gRmluZHMgdGhlIHByZWNpc2UgbG9jYXRpb24gb2YgdGhlIGdpdmVuIGVycm9yIGFuZCBmaWxscyBpbiAqbGluZSBhbmQKLSAgLy8gKmNvbHVtbiB3aXRoIHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycy4gIElmIG5vdCBmb3VuZCwgc2V0cyAqbGluZSB0bwotICAvLyAtMSBhbmQgKmNvbHVtbiB0byAwIChzaW5jZSBsaW5lID0gLTEgaXMgdXNlZCB0byBtZWFuICJlcnJvciBoYXMgbm8gZXhhY3QKLSAgLy8gbG9jYXRpb24iIGluIHRoZSBFcnJvckNvbGxlY3RvciBpbnRlcmZhY2UpLiAgUmV0dXJucyB0cnVlIGlmIGZvdW5kLCBmYWxzZQotICAvLyBvdGhlcndpc2UuCi0gIGJvb2wgRmluZChjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAotICAgICAgICAgICAgaW50KiBsaW5lLCBpbnQqIGNvbHVtbikgY29uc3Q7Ci0KLSAgLy8gQWRkcyBhIGxvY2F0aW9uIHRvIHRoZSB0YWJsZS4KLSAgdm9pZCBBZGQoY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKLSAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAotICAgICAgICAgICBpbnQgbGluZSwgaW50IGNvbHVtbik7Ci0KLSAgLy8gQ2xlYXJzIHRoZSBjb250ZW50cyBvZiB0aGUgdGFibGUuCi0gIHZvaWQgQ2xlYXIoKTsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgbWFwPAotICAgIHBhaXI8Y29uc3QgTWVzc2FnZSosIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbj4sCi0gICAgcGFpcjxpbnQsIGludD4gPiBMb2NhdGlvbk1hcDsKLSAgTG9jYXRpb25NYXAgbG9jYXRpb25fbWFwXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BBUlNFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFkNjIzZGQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMTU3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPG1hcD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotbmFtZXNwYWNlIHsKLQotY2xhc3MgTW9ja0Vycm9yQ29sbGVjdG9yIDogcHVibGljIGlvOjpFcnJvckNvbGxlY3RvciB7Ci0gcHVibGljOgotICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkge30KLQotICBzdHJpbmcgdGV4dF87Ci0KLSAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTogJDJcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotICB9Ci19OwotCi1jbGFzcyBNb2NrVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7Ci0gcHVibGljOgotICBNb2NrVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKGNvbnN0IFNvdXJjZUxvY2F0aW9uVGFibGUmIHNvdXJjZV9sb2NhdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkVycm9yQ29sbGVjdG9yKiB3cmFwcGVkX2NvbGxlY3RvcikKLSAgICA6IHNvdXJjZV9sb2NhdGlvbnNfKHNvdXJjZV9sb2NhdGlvbnMpLAotICAgICAgd3JhcHBlZF9jb2xsZWN0b3JfKHdyYXBwZWRfY29sbGVjdG9yKSB7fQotICB+TW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3RvcigpIHt9Ci0KLSAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBpbnQgbGluZSwgY29sdW1uOwotICAgIHNvdXJjZV9sb2NhdGlvbnNfLkZpbmQoZGVzY3JpcHRvciwgbG9jYXRpb24sICZsaW5lLCAmY29sdW1uKTsKLSAgICB3cmFwcGVkX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIGNvbnN0IFNvdXJjZUxvY2F0aW9uVGFibGUmIHNvdXJjZV9sb2NhdGlvbnNfOwotICBpbzo6RXJyb3JDb2xsZWN0b3IqIHdyYXBwZWRfY29sbGVjdG9yXzsKLX07Ci0KLWNsYXNzIFBhcnNlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBQYXJzZXJUZXN0KCkKLSAgICA6IHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfKGZhbHNlKSB7fQotCi0gIC8vIFNldCB1cCB0aGUgcGFyc2VyIHRvIHBhcnNlIHRoZSBnaXZlbiB0ZXh0LgotICB2b2lkIFNldHVwUGFyc2VyKGNvbnN0IGNoYXIqIHRleHQpIHsKLSAgICByYXdfaW5wdXRfLnJlc2V0KG5ldyBpbzo6QXJyYXlJbnB1dFN0cmVhbSh0ZXh0LCBzdHJsZW4odGV4dCkpKTsKLSAgICBpbnB1dF8ucmVzZXQobmV3IGlvOjpUb2tlbml6ZXIocmF3X2lucHV0Xy5nZXQoKSwgJmVycm9yX2NvbGxlY3Rvcl8pKTsKLSAgICBwYXJzZXJfLnJlc2V0KG5ldyBQYXJzZXIoKSk7Ci0gICAgcGFyc2VyXy0+UmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcl8pOwotICAgIHBhcnNlcl8tPlNldFJlcXVpcmVTeW50YXhJZGVudGlmaWVyKHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfKTsKLSAgfQotCi0gIC8vIFBhcnNlIHRoZSBpbnB1dCBhbmQgZXhwZWN0IHRoYXQgdGhlIHJlc3VsdGluZyBGaWxlRGVzY3JpcHRvclByb3RvIG1hdGNoZXMKLSAgLy8gdGhlIGdpdmVuIG91dHB1dC4gIFRoZSBvdXRwdXQgaXMgYSBGaWxlRGVzY3JpcHRvclByb3RvIGluIHByb3RvY29sIGJ1ZmZlcgotICAvLyB0ZXh0IGZvcm1hdC4KLSAgdm9pZCBFeHBlY3RQYXJzZXNUbyhjb25zdCBjaGFyKiBpbnB1dCwgY29uc3QgY2hhciogb3V0cHV0KSB7Ci0gICAgU2V0dXBQYXJzZXIoaW5wdXQpOwotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYWN0dWFsLCBleHBlY3RlZDsKLQotICAgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJmFjdHVhbCk7Ci0gICAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKLSAgICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotCi0gICAgLy8gV2UgZG9uJ3QgY292ZXIgU291cmNlQ29kZUluZm8gaW4gdGhlc2UgdGVzdHMuCi0gICAgYWN0dWFsLmNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKLQotICAgIC8vIFBhcnNlIHRoZSBBU0NJSSByZXByZXNlbnRhdGlvbiBpbiBvcmRlciB0byBjYW5vbmljYWxpemUgaXQuICBXZSBjb3VsZAotICAgIC8vIGp1c3QgY29tcGFyZSBkaXJlY3RseSB0byBhY3R1YWwuRGVidWdTdHJpbmcoKSwgYnV0IHRoYXQgd291bGQgcmVxdWlyZQotICAgIC8vIHRoYXQgdGhlIGNhbGxlciBwcmVjaXNlbHkgbWF0Y2ggdGhlIGZvcm1hdHRpbmcgdGhhdCBEZWJ1Z1N0cmluZygpCi0gICAgLy8gcHJvZHVjZXMuCi0gICAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKG91dHB1dCwgJmV4cGVjdGVkKSk7Ci0KLSAgICAvLyBDb21wYXJlIGJ5IGNvbXBhcmluZyBkZWJ1ZyBzdHJpbmdzLgotICAgIC8vIFRPRE8oa2VudG9uKTogIFVzZSBkaWZmZXJlbmNlciwgb25jZSBpdCBpcyBhdmFpbGFibGUuCi0gICAgRVhQRUNUX0VRKGV4cGVjdGVkLkRlYnVnU3RyaW5nKCksIGFjdHVhbC5EZWJ1Z1N0cmluZygpKTsKLSAgfQotCi0gIC8vIFBhcnNlIHRoZSB0ZXh0IGFuZCBleHBlY3QgdGhhdCB0aGUgZ2l2ZW4gZXJyb3JzIGFyZSByZXBvcnRlZC4KLSAgdm9pZCBFeHBlY3RIYXNFcnJvcnMoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXhwZWN0ZWRfZXJyb3JzKSB7Ci0gICAgRXhwZWN0SGFzRWFybHlFeGl0RXJyb3JzKHRleHQsIGV4cGVjdGVkX2Vycm9ycyk7Ci0gICAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKLSAgfQotCi0gIC8vIFNhbWUgYXMgYWJvdmUgYnV0IGRvZXMgbm90IGV4cGVjdCB0aGF0IHRoZSBwYXJzZXIgcGFyc2VzIHRoZSBjb21wbGV0ZQotICAvLyBpbnB1dC4KLSAgdm9pZCBFeHBlY3RIYXNFYXJseUV4aXRFcnJvcnMoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogZXhwZWN0ZWRfZXJyb3JzKSB7Ci0gICAgU2V0dXBQYXJzZXIodGV4dCk7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJmZpbGUpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvcnMsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotICB9Ci0KLSAgLy8gUGFyc2UgdGhlIHRleHQgYXMgYSBmaWxlIGFuZCB2YWxpZGF0ZSBpdCAod2l0aCBhIERlc2NyaXB0b3JQb29sKSwgYW5kCi0gIC8vIGV4cGVjdCB0aGF0IHRoZSB2YWxpZGF0aW9uIHN0ZXAgcmVwb3J0cyB0aGUgZ2l2ZW4gZXJyb3JzLgotICB2b2lkIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoY29uc3QgY2hhciogdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2Vycm9ycykgewotICAgIFNldHVwUGFyc2VyKHRleHQpOwotICAgIFNvdXJjZUxvY2F0aW9uVGFibGUgc291cmNlX2xvY2F0aW9uczsKLSAgICBwYXJzZXJfLT5SZWNvcmRTb3VyY2VMb2NhdGlvbnNUbygmc291cmNlX2xvY2F0aW9ucyk7Ci0KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0gICAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmZmlsZSk7Ci0gICAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKLSAgICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotCi0gICAgTW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3RvciB2YWxpZGF0aW9uX2Vycm9yX2NvbGxlY3RvcigKLSAgICAgIHNvdXJjZV9sb2NhdGlvbnMsICZlcnJvcl9jb2xsZWN0b3JfKTsKLSAgICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKAotICAgICAgZmlsZSwgJnZhbGlkYXRpb25fZXJyb3JfY29sbGVjdG9yKSA9PSBOVUxMKTsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZXJyb3JzLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKLSAgfQotCi0gIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3JfOwotICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKLQotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiByYXdfaW5wdXRfOwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpUb2tlbml6ZXI+IGlucHV0XzsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxQYXJzZXI+IHBhcnNlcl87Ci0gIGJvb2wgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl87Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRFU1RfRihQYXJzZXJUZXN0LCBTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKSB7Ci0gIFNldHVwUGFyc2VyKAotICAgICIvLyBibGFoXG4iCi0gICAgInN5bnRheCA9IFwiZm9vYmFyXCI7XG4iCi0gICAgInRoaXMgbGluZSB3aWxsIG5vdCBiZSBwYXJzZWRcbiIpOwotICBwYXJzZXJfLT5TZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKHRydWUpOwotICBFWFBFQ1RfVFJVRShwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksIE5VTEwpKTsKLSAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKLSAgRVhQRUNUX0VRKCJmb29iYXIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOwotfQotCi1URVNUX0YoUGFyc2VyVGVzdCwgU3RvcEFmdGVyT21pdHRlZFN5bnRheElkZW50aWZpZXIpIHsKLSAgU2V0dXBQYXJzZXIoCi0gICAgIi8vIGJsYWhcbiIKLSAgICAidGhpcyBsaW5lIHdpbGwgbm90IGJlIHBhcnNlZFxuIik7Ci0gIHBhcnNlcl8tPlNldFN0b3BBZnRlclN5bnRheElkZW50aWZpZXIodHJ1ZSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgTlVMTCkpOwotICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotICBFWFBFQ1RfRVEoIiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Ci19Ci0KLVRFU1RfRihQYXJzZXJUZXN0LCBTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyV2l0aEVycm9ycykgewotICBTZXR1cFBhcnNlcigKLSAgICAiLy8gYmxhaFxuIgotICAgICJzeW50YXggPSBlcnJvcjtcbiIpOwotICBwYXJzZXJfLT5TZXRTdG9wQWZ0ZXJTeW50YXhJZGVudGlmaWVyKHRydWUpOwotICBFWFBFQ1RfRkFMU0UocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCBOVUxMKSk7Ci0gIEVYUEVDVF9FUSgiMTo5OiBFeHBlY3RlZCBzeW50YXggaWRlbnRpZmllci5cbiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotfQotCi1URVNUX0YoUGFyc2VyVGVzdCwgV2FybklmU3ludGF4SWRlbnRpZmllck9tbWl0dGVkKSB7Ci0gIFNldHVwUGFyc2VyKCJtZXNzYWdlIEEge30iKTsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICBDYXB0dXJlVGVzdFN0ZGVycigpOwotICBFWFBFQ1RfVFJVRShwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZmaWxlKSk7Ci0gIEVYUEVDVF9UUlVFKAotICAgICAgR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCkuZmluZCgiTm8gc3ludGF4IHNwZWNpZmllZCIpICE9IHN0cmluZzo6bnBvcyk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlTWVzc2FnZVRlc3Q7Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBJZ25vcmVCT00pIHsKLSAgY2hhciBpbnB1dFtdID0gIiAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTtcbiIKLSAgICAgICJ9XG4iOwotICAvLyBTZXQgVVRGLTggQk9NLgotICBpbnB1dFswXSA9IChjaGFyKTB4RUY7Ci0gIGlucHV0WzFdID0gKGNoYXIpMHhCQjsKLSAgaW5wdXRbMl0gPSAoY2hhcikweEJGOwotICBFeHBlY3RQYXJzZXNUbyhpbnB1dCwKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBCT01FcnJvcikgewotICBjaGFyIGlucHV0W10gPSAiICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgotICAgICAgIn1cbiI7Ci0gIGlucHV0WzBdID0gKGNoYXIpMHhFRjsKLSAgRXhwZWN0SGFzRXJyb3JzKGlucHV0LAotICAgICAgICAgICAgICAgICAgIjA6MTogUHJvdG8gZmlsZSBzdGFydHMgd2l0aCAweEVGIGJ1dCBub3QgVVRGLTggQk9NLiAiCi0gICAgICAgICAgICAgICAgICAiT25seSBVVEYtOCBpcyBhY2NlcHRlZCBmb3IgcHJvdG8gZmlsZS5cbiIKLSAgICAgICAgICAgICAgICAgICIwOjA6IEV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgKGUuZy4gXCJtZXNzYWdlXCIpLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBTaW1wbGVNZXNzYWdlKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgSW1wbGljaXRTeW50YXhJZGVudGlmaWVyKSB7Ci0gIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfID0gZmFsc2U7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKLSAgICAifSIpOwotICBFWFBFQ1RfRVEoInByb3RvMiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHBsaWNpdFN5bnRheElkZW50aWZpZXIpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCi0gICAgIn1cbiIsCi0KLSAgICAic3ludGF4OiAncHJvdG8yJyAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKLSAgICAifSIpOwotICBFWFBFQ1RfRVEoInByb3RvMiIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHBsaWNpdFJlcXVpcmVkU3ludGF4SWRlbnRpZmllcikgewotICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IHRydWU7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgotICAgICJ9XG4iLAotCi0gICAgInN5bnRheDogJ3Byb3RvMicgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCi0gICAgIn0iKTsKLSAgRVhQRUNUX0VRKCJwcm90bzIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgU2ltcGxlRmllbGRzKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxNTtcbiIKLSAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAzNDtcbiIKLSAgICAiICByZXBlYXRlZCBpbnQzMiBiYXogPSAzO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjE1IH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjozNCB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIGxhYmVsOkxBQkVMX1JFUEVBVEVEIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MyAgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgUHJpbWl0aXZlRmllbGRUeXBlcykgewotICBFeHBlY3RQYXJzZXNUbygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgcmVxdWlyZWQgaW50MzIgICAgZm9vID0gMTtcbiIKLSAgICAiICByZXF1aXJlZCBpbnQ2NCAgICBmb28gPSAxO1xuIgotICAgICIgIHJlcXVpcmVkIHVpbnQzMiAgIGZvbyA9IDE7XG4iCi0gICAgIiAgcmVxdWlyZWQgdWludDY0ICAgZm9vID0gMTtcbiIKLSAgICAiICByZXF1aXJlZCBzaW50MzIgICBmb28gPSAxO1xuIgotICAgICIgIHJlcXVpcmVkIHNpbnQ2NCAgIGZvbyA9IDE7XG4iCi0gICAgIiAgcmVxdWlyZWQgZml4ZWQzMiAgZm9vID0gMTtcbiIKLSAgICAiICByZXF1aXJlZCBmaXhlZDY0ICBmb28gPSAxO1xuIgotICAgICIgIHJlcXVpcmVkIHNmaXhlZDMyIGZvbyA9IDE7XG4iCi0gICAgIiAgcmVxdWlyZWQgc2ZpeGVkNjQgZm9vID0gMTtcbiIKLSAgICAiICByZXF1aXJlZCBmbG9hdCAgICBmb28gPSAxO1xuIgotICAgICIgIHJlcXVpcmVkIGRvdWJsZSAgIGZvbyA9IDE7XG4iCi0gICAgIiAgcmVxdWlyZWQgc3RyaW5nICAgZm9vID0gMTtcbiIKLSAgICAiICByZXF1aXJlZCBieXRlcyAgICBmb28gPSAxO1xuIgotICAgICIgIHJlcXVpcmVkIGJvb2wgICAgIGZvbyA9IDE7XG4iCi0gICAgIn1cbiIsCi0KLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiAgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQ2NCAgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9VSU5UMzIgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9VSU5UNjQgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TSU5UMzIgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TSU5UNjQgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9GSVhFRDMyICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9GSVhFRDY0ICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TRklYRUQzMiBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TRklYRUQ2NCBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9GTE9BVCAgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9ET1VCTEUgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9TVFJJTkcgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9CWVRFUyAgICBudW1iZXI6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9CT09MICAgICBudW1iZXI6MSB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBGaWVsZERlZmF1bHRzKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICByZXF1aXJlZCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0gIDEgIF07XG4iCi0gICAgIiAgcmVxdWlyZWQgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9IC0yICBdO1xuIgotICAgICIgIHJlcXVpcmVkIGludDY0ICBmb28gPSAxIFtkZWZhdWx0PSAgMyAgXTtcbiIKLSAgICAiICByZXF1aXJlZCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0gLTQgIF07XG4iCi0gICAgIiAgcmVxdWlyZWQgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9ICA1ICBdO1xuIgotICAgICIgIHJlcXVpcmVkIHVpbnQ2NCBmb28gPSAxIFtkZWZhdWx0PSAgNiAgXTtcbiIKLSAgICAiICByZXF1aXJlZCBmbG9hdCAgZm9vID0gMSBbZGVmYXVsdD0gIDcuNV07XG4iCi0gICAgIiAgcmVxdWlyZWQgZmxvYXQgIGZvbyA9IDEgW2RlZmF1bHQ9IC04LjVdO1xuIgotICAgICIgIHJlcXVpcmVkIGZsb2F0ICBmb28gPSAxIFtkZWZhdWx0PSAgOSAgXTtcbiIKLSAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gMTAuNV07XG4iCi0gICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9LTExLjVdO1xuIgotICAgICIgIHJlcXVpcmVkIGRvdWJsZSBmb28gPSAxIFtkZWZhdWx0PSAxMiAgXTtcbiIKLSAgICAiICByZXF1aXJlZCBkb3VibGUgZm9vID0gMSBbZGVmYXVsdD0gaW5mIF07XG4iCi0gICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9LWluZiBdO1xuIgotICAgICIgIHJlcXVpcmVkIGRvdWJsZSBmb28gPSAxIFtkZWZhdWx0PSBuYW4gXTtcbiIKLSAgICAiICByZXF1aXJlZCBzdHJpbmcgZm9vID0gMSBbZGVmYXVsdD0nMTNcXDAwMSddO1xuIgotICAgICIgIHJlcXVpcmVkIHN0cmluZyBmb28gPSAxIFtkZWZhdWx0PSdhJyBcImJcIiBcbiBcImNcIl07XG4iCi0gICAgIiAgcmVxdWlyZWQgYnl0ZXMgIGZvbyA9IDEgW2RlZmF1bHQ9JzE0XFwwMDInXTtcbiIKLSAgICAiICByZXF1aXJlZCBieXRlcyAgZm9vID0gMSBbZGVmYXVsdD0nYScgXCJiXCIgXG4gJ2MnXTtcbiIKLSAgICAiICByZXF1aXJlZCBib29sICAgZm9vID0gMSBbZGVmYXVsdD10cnVlIF07XG4iCi0gICAgIiAgcmVxdWlyZWQgRm9vICAgIGZvbyA9IDEgW2RlZmF1bHQ9Rk9PICBdO1xuIgotCi0gICAgIiAgcmVxdWlyZWQgaW50MzIgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4N0ZGRkZGRkZdO1xuIgotICAgICIgIHJlcXVpcmVkIGludDMyICBmb28gPSAxIFtkZWZhdWx0PS0weDgwMDAwMDAwXTtcbiIKLSAgICAiICByZXF1aXJlZCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0gMHhGRkZGRkZGRl07XG4iCi0gICAgIiAgcmVxdWlyZWQgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9IDB4N0ZGRkZGRkZGRkZGRkZGRl07XG4iCi0gICAgIiAgcmVxdWlyZWQgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9LTB4ODAwMDAwMDAwMDAwMDAwMF07XG4iCi0gICAgIiAgcmVxdWlyZWQgdWludDY0IGZvbyA9IDEgW2RlZmF1bHQ9IDB4RkZGRkZGRkZGRkZGRkZGRl07XG4iCi0gICAgIiAgcmVxdWlyZWQgZG91YmxlIGZvbyA9IDEgW2RlZmF1bHQ9IDB4YWJjZF07XG4iCi0gICAgIn1cbiIsCi0KLSNkZWZpbmUgRVRDICJuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgbnVtYmVyOjEiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCIxXCIgICAgICAgICAiIEVUQyAiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiLTJcIiAgICAgICAgIiBFVEMgIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIjNcIiAgICAgICAgICIgRVRDICIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQ2NCAgIGRlZmF1bHRfdmFsdWU6XCItNFwiICAgICAgICAiIEVUQyAiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfVUlOVDMyICBkZWZhdWx0X3ZhbHVlOlwiNVwiICAgICAgICAgIiBFVEMgIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1VJTlQ2NCAgZGVmYXVsdF92YWx1ZTpcIjZcIiAgICAgICAgICIgRVRDICIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9GTE9BVCAgIGRlZmF1bHRfdmFsdWU6XCI3LjVcIiAgICAgICAiIEVUQyAiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRkxPQVQgICBkZWZhdWx0X3ZhbHVlOlwiLTguNVwiICAgICAgIiBFVEMgIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0ZMT0FUICAgZGVmYXVsdF92YWx1ZTpcIjlcIiAgICAgICAgICIgRVRDICIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCIxMC41XCIgICAgICAiIEVUQyAiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiLTExLjVcIiAgICAgIiBFVEMgIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIjEyXCIgICAgICAgICIgRVRDICIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCJpbmZcIiAgICAgICAiIEVUQyAiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiLWluZlwiICAgICAgIiBFVEMgIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIm5hblwiICAgICAgICIgRVRDICIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9TVFJJTkcgIGRlZmF1bHRfdmFsdWU6XCIxM1xcMDAxXCIgICAiIEVUQyAiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfU1RSSU5HICBkZWZhdWx0X3ZhbHVlOlwiYWJjXCIgICAgICAgIiBFVEMgIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0JZVEVTICAgZGVmYXVsdF92YWx1ZTpcIjE0XFxcXDAwMlwiICIgRVRDICIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9CWVRFUyAgIGRlZmF1bHRfdmFsdWU6XCJhYmNcIiAgICAgICAiIEVUQyAiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfQk9PTCAgICBkZWZhdWx0X3ZhbHVlOlwidHJ1ZVwiICAgICAgIiBFVEMgIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZV9uYW1lOlwiRm9vXCIgZGVmYXVsdF92YWx1ZTpcIkZPT1wiICAgICAgICIgRVRDICIgfSIKLQotICAgICIgIGZpZWxkIHsiCi0gICAgIiAgICB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiMjE0NzQ4MzY0N1wiICAgICAgICAgICAiIEVUQwotICAgICIgIH0iCi0gICAgIiAgZmllbGQgeyIKLSAgICAiICAgIHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCItMjE0NzQ4MzY0OFwiICAgICAgICAgICIgRVRDCi0gICAgIiAgfSIKLSAgICAiICBmaWVsZCB7IgotICAgICIgICAgdHlwZTpUWVBFX1VJTlQzMiAgZGVmYXVsdF92YWx1ZTpcIjQyOTQ5NjcyOTVcIiAgICAgICAgICAgIiBFVEMKLSAgICAiICB9IgotICAgICIgIGZpZWxkIHsiCi0gICAgIiAgICB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiOTIyMzM3MjAzNjg1NDc3NTgwN1wiICAiIEVUQwotICAgICIgIH0iCi0gICAgIiAgZmllbGQgeyIKLSAgICAiICAgIHR5cGU6VFlQRV9JTlQ2NCAgIGRlZmF1bHRfdmFsdWU6XCItOTIyMzM3MjAzNjg1NDc3NTgwOFwiICIgRVRDCi0gICAgIiAgfSIKLSAgICAiICBmaWVsZCB7IgotICAgICIgICAgdHlwZTpUWVBFX1VJTlQ2NCAgZGVmYXVsdF92YWx1ZTpcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIgIiBFVEMKLSAgICAiICB9IgotICAgICIgIGZpZWxkIHsiCi0gICAgIiAgICB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiNDM5ODFcIiAgICAgICAgICAgICAgICAiIEVUQwotICAgICIgIH0iCi0gICAgIn0iKTsKLSN1bmRlZiBFVEMKLX0KLQotVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEZpZWxkSnNvbk5hbWUpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtqc29uX25hbWUgPSBcIkB0eXBlXCJdO1xuIgotICAgICJ9XG4iLAotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCi0gICAgIiAgZmllbGQge1xuIgotICAgICIgICAgbmFtZTogXCJmb29cIiBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9TVFJJTkcgbnVtYmVyOiAxIgotICAgICIgICAganNvbl9uYW1lOiBcIkB0eXBlXCJcbiIKLSAgICAiICB9XG4iCi0gICAgIn1cbiIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRmllbGRPcHRpb25zKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCBzdHJpbmcgZm9vID0gMVxuIgotICAgICIgICAgICBbY3R5cGU9Q09SRCwgKGZvbyk9NywgZm9vLiguYmFyLmJheikucXV4LnF1dXguKGNvcmdlKT0tMzMsIFxuIgotICAgICIgICAgICAgKHF1dXgpPVwieFwwNDB5XCIsIChiYXoucXV4KT1oZXldO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfU1RSSU5HIG51bWJlcjogMSIKLSAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImN0eXBlXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiQ09SRFwiICB9IgotICAgICIgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uOiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiA3ICB9IgotICAgICIgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uOiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwiLmJhci5iYXpcIiIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicXV4XCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicXV1eFwiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImNvcmdlXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmVnYXRpdmVfaW50X3ZhbHVlOiAtMzMgfSIKLSAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcInF1dXhcIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwieCB5XCIgfSIKLSAgICAiICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbjogeyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhei5xdXhcIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcImhleVwiIH0iCi0gICAgIiAgICAgICAgICB9IgotICAgICIgIH0iCi0gICAgIn0iKTsKLX0KLQotVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE9uZW9mKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvbmVvZiBmb28ge1xuIgotICAgICIgICAgaW50MzIgYSA9IDE7XG4iCi0gICAgIiAgICBzdHJpbmcgYiA9IDI7XG4iCi0gICAgIiAgICBUZXN0TWVzc2FnZSBjID0gMztcbiIKLSAgICAiICAgIGdyb3VwIEQgPSA0IHsgb3B0aW9uYWwgaW50MzIgaSA9IDU7IH1cbiIKLSAgICAiICB9XG4iCi0gICAgIn1cbiIsCi0KLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImFcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgIgotICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MCB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImJcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfU1RSSU5HIG51bWJlcjoyICIKLSAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OjAgfSIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJjXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiAiCi0gICAgIiAgICAgICAgICBudW1iZXI6MyBvbmVvZl9pbmRleDowIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9HUk9VUCAiCi0gICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJEXCIgbnVtYmVyOjQgb25lb2ZfaW5kZXg6MCB9IgotICAgICIgIG9uZW9mX2RlY2wgeyIKLSAgICAiICAgIG5hbWU6IFwiZm9vXCIiCi0gICAgIiAgfSIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IgotICAgICIgICAgbmFtZTogXCJEXCIiCi0gICAgIiAgICBmaWVsZCB7IG5hbWU6XCJpXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjo1IH0iCi0gICAgIiAgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTXVsdGlwbGVPbmVvZnMpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9uZW9mIGZvbyB7XG4iCi0gICAgIiAgICBpbnQzMiBhID0gMTtcbiIKLSAgICAiICAgIHN0cmluZyBiID0gMjtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgb25lb2YgYmFyIHtcbiIKLSAgICAiICAgIGludDMyIGMgPSAzO1xuIgotICAgICIgICAgc3RyaW5nIGQgPSA0O1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIiwKLQotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiYVwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSAiCi0gICAgIiAgICAgICAgICBvbmVvZl9pbmRleDowIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiYlwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9TVFJJTkcgbnVtYmVyOjIgIgotICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MCB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImNcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjMgIgotICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MSB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImRcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfU1RSSU5HIG51bWJlcjo0ICIKLSAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OjEgfSIKLSAgICAiICBvbmVvZl9kZWNsIHsiCi0gICAgIiAgICBuYW1lOiBcImZvb1wiIgotICAgICIgIH0iCi0gICAgIiAgb25lb2ZfZGVjbCB7IgotICAgICIgICAgbmFtZTogXCJiYXJcIiIKLSAgICAiICB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBNYXBzKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBtYXA8aW50MzIsIHN0cmluZz4gcHJpbWl0aXZlX3R5cGVfbWFwID0gMTtcbiIKLSAgICAiICBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBjb21wb3NpdGVfdHlwZV9tYXAgPSAyO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IgotICAgICIgICAgbmFtZTogXCJQcmltaXRpdmVUeXBlTWFwRW50cnlcIiIKLSAgICAiICAgIGZpZWxkIHsgIgotICAgICIgICAgICAgbmFtZTogXCJrZXlcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCi0gICAgIiAgICAgICB0eXBlOlRZUEVfSU5UMzIiCi0gICAgIiAgICB9IgotICAgICIgICAgZmllbGQgeyAiCi0gICAgIiAgICAgICBuYW1lOiBcInZhbHVlXCIgbnVtYmVyOiAyIGxhYmVsOkxBQkVMX09QVElPTkFMIgotICAgICIgICAgICAgdHlwZTpUWVBFX1NUUklORyIKLSAgICAiICAgIH0iCi0gICAgIiAgICBvcHRpb25zIHsgbWFwX2VudHJ5OiB0cnVlIH0iCi0gICAgIiAgfSIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IgotICAgICIgICAgbmFtZTogXCJDb21wb3NpdGVUeXBlTWFwRW50cnlcIiIKLSAgICAiICAgIGZpZWxkIHsgIgotICAgICIgICAgICAgbmFtZTogXCJrZXlcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCi0gICAgIiAgICAgICB0eXBlX25hbWU6IFwiS2V5VHlwZVwiIgotICAgICIgICAgfSIKLSAgICAiICAgIGZpZWxkIHsgIgotICAgICIgICAgICAgbmFtZTogXCJ2YWx1ZVwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCIKLSAgICAiICAgICAgIHR5cGVfbmFtZTogXCJWYWx1ZVR5cGVcIiIKLSAgICAiICAgIH0iCi0gICAgIiAgICBvcHRpb25zIHsgbWFwX2VudHJ5OiB0cnVlIH0iCi0gICAgIiAgfSIKLSAgICAiICBmaWVsZCB7IgotICAgICIgICAgbmFtZTogXCJwcmltaXRpdmVfdHlwZV9tYXBcIiIKLSAgICAiICAgIGxhYmVsOiBMQUJFTF9SRVBFQVRFRCIKLSAgICAiICAgIHR5cGVfbmFtZTogXCJQcmltaXRpdmVUeXBlTWFwRW50cnlcIiIKLSAgICAiICAgIG51bWJlcjogMSIKLSAgICAiICB9IgotICAgICIgIGZpZWxkIHsiCi0gICAgIiAgICBuYW1lOiBcImNvbXBvc2l0ZV90eXBlX21hcFwiIgotICAgICIgICAgbGFiZWw6IExBQkVMX1JFUEVBVEVEIgotICAgICIgICAgdHlwZV9uYW1lOiBcIkNvbXBvc2l0ZVR5cGVNYXBFbnRyeVwiIgotICAgICIgICAgbnVtYmVyOiAyIgotICAgICIgIH0iCi0gICAgIn0iKTsKLX0KLQotVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEdyb3VwKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCBncm91cCBUZXN0R3JvdXAgPSAxIHt9O1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiVGVzdEdyb3VwXCIgfSIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJ0ZXN0Z3JvdXBcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCBudW1iZXI6MSIKLSAgICAiICAgICAgICAgIHR5cGU6VFlQRV9HUk9VUCB0eXBlX25hbWU6IFwiVGVzdEdyb3VwXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTmVzdGVkTWVzc2FnZSkgewotICBFeHBlY3RQYXJzZXNUbygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgbWVzc2FnZSBOZXN0ZWQge31cbiIKLSAgICAiICBvcHRpb25hbCBOZXN0ZWQgdGVzdF9uZXN0ZWQgPSAxO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiTmVzdGVkXCIgfSIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJ0ZXN0X25lc3RlZFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIG51bWJlcjoxIgotICAgICIgICAgICAgICAgdHlwZV9uYW1lOiBcIk5lc3RlZFwiIH0iCi0gICAgIn0iKTsKLX0KLQotVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE5lc3RlZEVudW0pIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIGVudW0gTmVzdGVkRW51bSB7fVxuIgotICAgICIgIG9wdGlvbmFsIE5lc3RlZEVudW0gdGVzdF9lbnVtID0gMTtcbiIKLSAgICAifVxuIiwKLQotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCi0gICAgIiAgZW51bV90eXBlIHsgbmFtZTogXCJOZXN0ZWRFbnVtXCIgfSIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJ0ZXN0X2VudW1cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCBudW1iZXI6MSIKLSAgICAiICAgICAgICAgIHR5cGVfbmFtZTogXCJOZXN0ZWRFbnVtXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgUmVzZXJ2ZWRSYW5nZSkgewotICBFeHBlY3RQYXJzZXNUbygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTtcbiIKLSAgICAiICByZXNlcnZlZCAyLCAxNSwgOSB0byAxMSwgMztcbiIKLSAgICAifVxuIiwKLQotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCi0gICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDoyICAgZW5kOjMgICAgICAgICB9IgotICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6MTUgIGVuZDoxNiAgICAgICAgfSIKLSAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OjkgICBlbmQ6MTIgICAgICAgIH0iCi0gICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDozICAgZW5kOjQgICAgICAgICB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBSZXNlcnZlZE5hbWVzKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICByZXNlcnZlZCBcImZvb1wiLCBcImJhclwiO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICByZXNlcnZlZF9uYW1lOiBcImZvb1wiIgotICAgICIgIHJlc2VydmVkX25hbWU6IFwiYmFyXCIiCi0gICAgIn0iKTsKLX0KLQotVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4dGVuc2lvblJhbmdlKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBleHRlbnNpb25zIDEwIHRvIDE5O1xuIgotICAgICIgIGV4dGVuc2lvbnMgMzAgdG8gbWF4O1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoxMCBlbmQ6MjAgICAgICAgIH0iCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6MzAgZW5kOjUzNjg3MDkxMiB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBDb21wb3VuZEV4dGVuc2lvblJhbmdlKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBleHRlbnNpb25zIDIsIDE1LCA5IHRvIDExLCAxMDAgdG8gbWF4LCAzO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoyICAgZW5kOjMgICAgICAgICB9IgotICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjE1ICBlbmQ6MTYgICAgICAgIH0iCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6OSAgIGVuZDoxMiAgICAgICAgfSIKLSAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDoxMDAgZW5kOjUzNjg3MDkxMiB9IgotICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjMgICBlbmQ6NCAgICAgICAgIH0iCi0gICAgIn0iKTsKLX0KLQotVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIExhcmdlck1heEZvck1lc3NhZ2VTZXRXaXJlRm9ybWF0TWVzc2FnZXMpIHsKLSAgLy8gTWVzc2FnZXMgdXNpbmcgdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IG9wdGlvbiBjYW4gYWNjZXB0IGxhcmdlcgotICAvLyBleHRlbnNpb24gbnVtYmVycywgYXMgdGhlIG51bWJlcnMgYXJlIG5vdCBlbmNvZGVkIGFzIGludDMyIGZpZWxkIHZhbHVlcwotICAvLyByYXRoZXIgdGhhbiB0YWdzLgotICBFeHBlY3RQYXJzZXNUbygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgZXh0ZW5zaW9ucyA0IHRvIG1heDtcbiIKLSAgICAiICBvcHRpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlO1xuIgotICAgICJ9XG4iLAotCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICAgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjQgZW5kOiAweDdmZmZmZmZmIH0iCi0gICAgIiAgb3B0aW9ucyB7XG4iCi0gICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7IFxuIgotICAgICIgICAgICBuYW1lIHtcbiIKLSAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwibWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRcIlxuIgotICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2VcbiIKLSAgICAiICAgICAgfVxuIgotICAgICIgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcInRydWVcIlxuIgotICAgICIgICAgfVxuIgotICAgICIgIH1cbiIKLSAgICAifSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRXh0ZW5zaW9ucykgewotICBFeHBlY3RQYXJzZXNUbygKLSAgICAiZXh0ZW5kIEV4dGVuZGVlMSB7IG9wdGlvbmFsIGludDMyIGZvbyA9IDEyOyB9XG4iCi0gICAgImV4dGVuZCBFeHRlbmRlZTIgeyByZXBlYXRlZCBUZXN0TWVzc2FnZSBiYXIgPSAyMjsgfVxuIiwKLQotICAgICJleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxMiIKLSAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiRXh0ZW5kZWUxXCIgfSAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXJcIiBsYWJlbDpMQUJFTF9SRVBFQVRFRCBudW1iZXI6MjIiCi0gICAgIiAgICAgICAgICAgIHR5cGVfbmFtZTpcIlRlc3RNZXNzYWdlXCIgZXh0ZW5kZWU6IFwiRXh0ZW5kZWUyXCIgfSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRXh0ZW5zaW9uc0luTWVzc2FnZVNjb3BlKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBleHRlbmQgRXh0ZW5kZWUxIHsgb3B0aW9uYWwgaW50MzIgZm9vID0gMTI7IH1cbiIKLSAgICAiICBleHRlbmQgRXh0ZW5kZWUyIHsgcmVwZWF0ZWQgVGVzdE1lc3NhZ2UgYmFyID0gMjI7IH1cbiIKLSAgICAifVxuIiwKLQotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCi0gICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MTIiCi0gICAgIiAgICAgICAgICAgICAgZXh0ZW5kZWU6IFwiRXh0ZW5kZWUxXCIgfSIKLSAgICAiICBleHRlbnNpb24geyBuYW1lOlwiYmFyXCIgbGFiZWw6TEFCRUxfUkVQRUFURUQgbnVtYmVyOjIyIgotICAgICIgICAgICAgICAgICAgIHR5cGVfbmFtZTpcIlRlc3RNZXNzYWdlXCIgZXh0ZW5kZWU6IFwiRXh0ZW5kZWUyXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTXVsdGlwbGVFeHRlbnNpb25zT25lRXh0ZW5kZWUpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgImV4dGVuZCBFeHRlbmRlZTEge1xuIgotICAgICIgIG9wdGlvbmFsIGludDMyIGZvbyA9IDEyO1xuIgotICAgICIgIHJlcGVhdGVkIFRlc3RNZXNzYWdlIGJhciA9IDIyO1xuIgotICAgICJ9XG4iLAotCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEyIgotICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJFeHRlbmRlZTFcIiB9ICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhclwiIGxhYmVsOkxBQkVMX1JFUEVBVEVEIG51bWJlcjoyMiIKLSAgICAiICAgICAgICAgICAgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiBleHRlbmRlZTogXCJFeHRlbmRlZTFcIiB9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBPcHRpb25hbExhYmVsUHJvdG8zKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJzeW50YXggPSBcInByb3RvM1wiO1xuIgotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBpbnQzMiBmb28gPSAxO1xuIgotICAgICJ9XG4iLAotCi0gICAgInN5bnRheDogXCJwcm90bzNcIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSB9Iik7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlRW51bVRlc3Q7Ci0KLVRFU1RfRihQYXJzZUVudW1UZXN0LCBTaW1wbGVFbnVtKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJlbnVtIFRlc3RFbnVtIHtcbiIKLSAgICAiICBGT08gPSAwO1xuIgotICAgICJ9XG4iLAotCi0gICAgImVudW1fdHlwZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdEVudW1cIiIKLSAgICAiICB2YWx1ZSB7IG5hbWU6XCJGT09cIiBudW1iZXI6MCB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZUVudW1UZXN0LCBWYWx1ZXMpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgImVudW0gVGVzdEVudW0ge1xuIgotICAgICIgIEZPTyA9IDEzO1xuIgotICAgICIgIEJBUiA9IC0xMDtcbiIKLSAgICAiICBCQVogPSA1MDA7XG4iCi0gICAgIiAgSEVYX01BWCA9IDB4N0ZGRkZGRkY7XG4iCi0gICAgIiAgSEVYX01JTiA9IC0weDgwMDAwMDAwO1xuIgotICAgICIgIElOVF9NQVggPSAyMTQ3NDgzNjQ3O1xuIgotICAgICIgIElOVF9NSU4gPSAtMjE0NzQ4MzY0ODtcbiIKLSAgICAifVxuIiwKLQotICAgICJlbnVtX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RFbnVtXCIiCi0gICAgIiAgdmFsdWUgeyBuYW1lOlwiRk9PXCIgbnVtYmVyOjEzIH0iCi0gICAgIiAgdmFsdWUgeyBuYW1lOlwiQkFSXCIgbnVtYmVyOi0xMCB9IgotICAgICIgIHZhbHVlIHsgbmFtZTpcIkJBWlwiIG51bWJlcjo1MDAgfSIKLSAgICAiICB2YWx1ZSB7IG5hbWU6XCJIRVhfTUFYXCIgbnVtYmVyOjIxNDc0ODM2NDcgfSIKLSAgICAiICB2YWx1ZSB7IG5hbWU6XCJIRVhfTUlOXCIgbnVtYmVyOi0yMTQ3NDgzNjQ4IH0iCi0gICAgIiAgdmFsdWUgeyBuYW1lOlwiSU5UX01BWFwiIG51bWJlcjoyMTQ3NDgzNjQ3IH0iCi0gICAgIiAgdmFsdWUgeyBuYW1lOlwiSU5UX01JTlwiIG51bWJlcjotMjE0NzQ4MzY0OCB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihQYXJzZUVudW1UZXN0LCBWYWx1ZU9wdGlvbnMpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgImVudW0gVGVzdEVudW0ge1xuIgotICAgICIgIEZPTyA9IDEzO1xuIgotICAgICIgIEJBUiA9IC0xMCBbIChzb21ldGhpbmcudGV4dCkgPSAnYWJjJyBdO1xuIgotICAgICIgIEJBWiA9IDUwMCBbIChzb21ldGhpbmcudGV4dCkgPSAnZGVmJywgb3RoZXIgPSAxIF07XG4iCi0gICAgIn1cbiIsCi0KLSAgICAiZW51bV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0RW51bVwiIgotICAgICIgIHZhbHVlIHsgbmFtZTogXCJGT09cIiBudW1iZXI6IDEzIH0iCi0gICAgIiAgdmFsdWUgeyBuYW1lOiBcIkJBUlwiIG51bWJlcjogLTEwICIKLSAgICAiICAgIG9wdGlvbnMgeyAiCi0gICAgIiAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwic29tZXRoaW5nLnRleHRcIiBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgc3RyaW5nX3ZhbHVlOiBcImFiY1wiICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICB9ICIKLSAgICAiICB9ICIKLSAgICAiICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiA1MDAgIgotICAgICIgICAgb3B0aW9ucyB7ICIKLSAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJzb21ldGhpbmcudGV4dFwiIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICBzdHJpbmdfdmFsdWU6IFwiZGVmXCIgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJvdGhlclwiIGlzX2V4dGVuc2lvbjogZmFsc2UgfSAiCi0gICAgIiAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICB9ICIKLSAgICAiICB9ICIKLSAgICAifSIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXR5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZVNlcnZpY2VUZXN0OwotCi1URVNUX0YoUGFyc2VTZXJ2aWNlVGVzdCwgU2ltcGxlU2VydmljZSkgewotICBFeHBlY3RQYXJzZXNUbygKLSAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCi0gICAgIiAgcnBjIEZvbyhJbikgcmV0dXJucyAoT3V0KTtcbiIKLSAgICAifVxuIiwKLQotICAgICJzZXJ2aWNlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgotICAgICIgIG1ldGhvZCB7IG5hbWU6XCJGb29cIiBpbnB1dF90eXBlOlwiSW5cIiBvdXRwdXRfdHlwZTpcIk91dFwiIH0iCi0gICAgIn0iKTsKLX0KLQotVEVTVF9GKFBhcnNlU2VydmljZVRlc3QsIE1ldGhvZHNBbmRTdHJlYW1zKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKLSAgICAiICBycGMgRm9vKEluMSkgcmV0dXJucyAoT3V0MSk7XG4iCi0gICAgIiAgcnBjIEJhcihJbjIpIHJldHVybnMgKE91dDIpO1xuIgotICAgICIgIHJwYyBCYXooSW4zKSByZXR1cm5zIChPdXQzKTtcbiIKLSAgICAifVxuIiwKLQotICAgICJzZXJ2aWNlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgotICAgICIgIG1ldGhvZCB7IG5hbWU6XCJGb29cIiBpbnB1dF90eXBlOlwiSW4xXCIgb3V0cHV0X3R5cGU6XCJPdXQxXCIgfSIKLSAgICAiICBtZXRob2QgeyBuYW1lOlwiQmFyXCIgaW5wdXRfdHlwZTpcIkluMlwiIG91dHB1dF90eXBlOlwiT3V0MlwiIH0iCi0gICAgIiAgbWV0aG9kIHsgbmFtZTpcIkJhelwiIGlucHV0X3R5cGU6XCJJbjNcIiBvdXRwdXRfdHlwZTpcIk91dDNcIiB9IgotICAgICJ9Iik7Ci19Ci0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBpbXBvcnRzIGFuZCBwYWNrYWdlcwotCi10eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VNaXNjVGVzdDsKLQotVEVTVF9GKFBhcnNlTWlzY1Rlc3QsIFBhcnNlSW1wb3J0KSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJpbXBvcnQgXCJmb28vYmFyL2Jhei5wcm90b1wiO1xuIiwKLSAgICAiZGVwZW5kZW5jeTogXCJmb28vYmFyL2Jhei5wcm90b1wiIik7Ci19Ci0KLVRFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZU11bHRpcGxlSW1wb3J0cykgewotICBFeHBlY3RQYXJzZXNUbygKLSAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCi0gICAgImltcG9ydCBcImJhci5wcm90b1wiO1xuIgotICAgICJpbXBvcnQgXCJiYXoucHJvdG9cIjtcbiIsCi0gICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwiYmF6LnByb3RvXCIiKTsKLX0KLQotVEVTVF9GKFBhcnNlTWlzY1Rlc3QsIFBhcnNlUHVibGljSW1wb3J0cykgewotICBFeHBlY3RQYXJzZXNUbygKLSAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCi0gICAgImltcG9ydCBwdWJsaWMgXCJiYXIucHJvdG9cIjtcbiIKLSAgICAiaW1wb3J0IFwiYmF6LnByb3RvXCI7XG4iCi0gICAgImltcG9ydCBwdWJsaWMgXCJxdXgucHJvdG9cIjtcbiIsCi0gICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwiYmF6LnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwicXV4LnByb3RvXCIiCi0gICAgInB1YmxpY19kZXBlbmRlbmN5OiAxICIKLSAgICAicHVibGljX2RlcGVuZGVuY3k6IDMgIik7Ci19Ci0KLVRFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZVBhY2thZ2UpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgInBhY2thZ2UgZm9vLmJhci5iYXo7XG4iLAotICAgICJwYWNrYWdlOiBcImZvby5iYXIuYmF6XCIiKTsKLX0KLQotVEVTVF9GKFBhcnNlTWlzY1Rlc3QsIFBhcnNlUGFja2FnZVdpdGhTcGFjZXMpIHsKLSAgRXhwZWN0UGFyc2VzVG8oCi0gICAgInBhY2thZ2UgZm9vICAgLiAgIGJhci4gIFxuIgotICAgICIgIGJhejtcbiIsCi0gICAgInBhY2thZ2U6IFwiZm9vLmJhci5iYXpcIiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBvcHRpb25zCi0KLVRFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZUZpbGVPcHRpb25zKSB7Ci0gIEV4cGVjdFBhcnNlc1RvKAotICAgICJvcHRpb24gamF2YV9wYWNrYWdlID0gXCJjb20uZ29vZ2xlLmZvb1wiO1xuIgotICAgICJvcHRpb24gb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFOyIsCi0KLSAgICAib3B0aW9ucyB7IgotICAgICJ1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiamF2YV9wYWNrYWdlXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcImNvbS5nb29nbGUuZm9vXCJ9ICIKLSAgICAidW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcIm9wdGltaXplX2ZvclwiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgotICAgICIgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiQ09ERV9TSVpFXCIgfSAiCi0gICAgIn0iKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRXJyb3IgdGVzdHMKLS8vCi0vLyBUaGVyZSBhcmUgYSB2ZXJ5IGxhcmdlIG51bWJlciBvZiBwb3NzaWJsZSBlcnJvcnMgdGhhdCB0aGUgcGFyc2VyIGNvdWxkCi0vLyByZXBvcnQsIHNvIGl0J3MgaW5mZWFzaWJsZSB0byB0ZXN0IGV2ZXJ5IHNpbmdsZSBvbmUgb2YgdGhlbS4gIEluc3RlYWQsCi0vLyB3ZSB0ZXN0IGVhY2ggdW5pcXVlIGNhbGwgdG8gQWRkRXJyb3IoKSBpbiBwYXJzZXIuaC4gIFRoaXMgZG9lcyBub3QgbWVhbgotLy8gd2UgYXJlIHRlc3RpbmcgZXZlcnkgcG9zc2libGUgZXJyb3IgdGhhdCBQYXJzZXIgY2FuIGdlbmVyYXRlIGJlY2F1c2UKLS8vIGVhY2ggdmFyaWFudCBvZiB0aGUgQ29uc3VtZSgpIGhlbHBlciBvbmx5IGNvdW50cyBhcyBvbmUgdW5pcXVlIGNhbGwgdG8KLS8vIEFkZEVycm9yKCkuCi0KLXR5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZUVycm9yVGVzdDsKLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNaXNzaW5nU3ludGF4SWRlbnRpZmllcikgewotICByZXF1aXJlX3N5bnRheF9pZGVudGlmaWVyXyA9IHRydWU7Ci0gIEV4cGVjdEhhc0Vhcmx5RXhpdEVycm9ycygibWVzc2FnZSBUZXN0TWVzc2FnZSB7fSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAiMDowOiBGaWxlIG11c3QgYmVnaW4gd2l0aCBhIHN5bnRheCBzdGF0ZW1lbnQsIGUuZy4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgIidzeW50YXggPSBcInByb3RvMlwiOycuXG4iKTsKLSAgRVhQRUNUX0VRKCIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIFVua25vd25TeW50YXhJZGVudGlmaWVyKSB7Ci0gIEV4cGVjdEhhc0Vhcmx5RXhpdEVycm9ycygKLSAgICAic3ludGF4ID0gXCJub19zdWNoX3N5bnRheFwiOyIsCi0gICAgIjA6OTogVW5yZWNvZ25pemVkIHN5bnRheCBpZGVudGlmaWVyIFwibm9fc3VjaF9zeW50YXhcIi4gIFRoaXMgcGFyc2VyICIKLSAgICAgICJvbmx5IHJlY29nbml6ZXMgXCJwcm90bzJcIiBhbmQgXCJwcm90bzNcIi5cbiIpOwotICBFWFBFQ1RfRVEoIm5vX3N1Y2hfc3ludGF4IiwgcGFyc2VyXy0+R2V0U3ludGF4SWRlbnRpZmllcigpKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBTaW1wbGVTeW50YXhFcnJvcikgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2UgQCMkIHsgYmxhaCB9IiwKLSAgICAiMDoyMDogRXhwZWN0ZWQgXCJ7XCIuXG4iKTsKLSAgRVhQRUNUX0VRKCJwcm90bzIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4cGVjdGVkVG9wTGV2ZWwpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJibGFoOyIsCi0gICAgIjA6MDogRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBVbm1hdGNoZWRDbG9zZUJyYWNlKSB7Ci0gIC8vIFRoaXMgdXNlZCB0byBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLiAgRG9oLgotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIn0iLAotICAgICIwOjA6IEV4cGVjdGVkIHRvcC1sZXZlbCBzdGF0ZW1lbnQgKGUuZy4gXCJtZXNzYWdlXCIpLlxuIgotICAgICIwOjA6IFVubWF0Y2hlZCBcIn1cIi5cbiIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNZXNzYWdlIGVycm9ycwotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIE1lc3NhZ2VNaXNzaW5nTmFtZSkgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2Uge30iLAotICAgICIwOjg6IEV4cGVjdGVkIG1lc3NhZ2UgbmFtZS5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIE1lc3NhZ2VNaXNzaW5nQm9keSkgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2U7IiwKLSAgICAiMDoxOTogRXhwZWN0ZWQgXCJ7XCIuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJbk1lc3NhZ2UpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHsiLAotICAgICIwOjIxOiBSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBtZXNzYWdlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIE1pc3NpbmdGaWVsZE51bWJlcikgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9wdGlvbmFsIGludDMyIGZvbztcbiIKLSAgICAifVxuIiwKLSAgICAiMToyMDogTWlzc2luZyBmaWVsZCBudW1iZXIuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFeHBlY3RlZEZpZWxkTnVtYmVyKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gO1xuIgotICAgICJ9XG4iLAotICAgICIxOjIzOiBFeHBlY3RlZCBmaWVsZCBudW1iZXIuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBGaWVsZE51bWJlck91dE9mUmFuZ2UpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCBpbnQzMiBmb28gPSAweDEwMDAwMDAwMDtcbiIKLSAgICAifVxuIiwKLSAgICAiMToyMzogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNaXNzaW5nTGFiZWwpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBpbnQzMiBmb28gPSAxO1xuIgotICAgICJ9XG4iLAotICAgICIxOjI6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFeHBlY3RlZE9wdGlvbk5hbWUpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbXTtcbiIKLSAgICAifVxuIiwKLSAgICAiMToyNzogRXhwZWN0ZWQgaWRlbnRpZmllci5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIE5vbkV4dGVuc2lvbk9wdGlvbk5hbWVCZWdpbm5pbmdXaXRoRG90KSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgWy5mb289MV07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6Mjc6IEV4cGVjdGVkIGlkZW50aWZpZXIuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVUeXBlTWlzbWF0Y2gpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD10cnVlXTtcbiIKLSAgICAifVxuIiwKLSAgICAiMTozNTogRXhwZWN0ZWQgaW50ZWdlciBmb3IgZmllbGQgZGVmYXVsdCB2YWx1ZS5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU5vdEJvb2xlYW4pIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCBib29sIGZvbyA9IDEgW2RlZmF1bHQ9YmxhaF07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MzM6IEV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU5vdFN0cmluZykgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtkZWZhdWx0PTFdO1xuIgotICAgICJ9XG4iLAotICAgICIxOjM1OiBFeHBlY3RlZCBzdHJpbmcgZm9yIGZpZWxkIGRlZmF1bHQgdmFsdWUuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVVbnNpZ25lZE5lZ2F0aXZlKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9LTFdO1xuIgotICAgICJ9XG4iLAotICAgICIxOjM2OiBVbnNpZ25lZCBmaWVsZCBjYW4ndCBoYXZlIG5lZ2F0aXZlIGRlZmF1bHQgdmFsdWUuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVUb29MYXJnZSkgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9wdGlvbmFsIGludDMyICBmb28gPSAxIFtkZWZhdWx0PSAweDgwMDAwMDAwXTtcbiIKLSAgICAiICBvcHRpb25hbCBpbnQzMiAgZm9vID0gMSBbZGVmYXVsdD0tMHg4MDAwMDAwMV07XG4iCi0gICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9IDB4MTAwMDAwMDAwXTtcbiIKLSAgICAiICBvcHRpb25hbCBpbnQ2NCAgZm9vID0gMSBbZGVmYXVsdD0gMHg4MDAwMDAwMDAwMDAwMDAwMF07XG4iCi0gICAgIiAgb3B0aW9uYWwgaW50NjQgIGZvbyA9IDEgW2RlZmF1bHQ9LTB4ODAwMDAwMDAwMDAwMDAwMDFdO1xuIgotICAgICIgIG9wdGlvbmFsIHVpbnQ2NCBmb28gPSAxIFtkZWZhdWx0PSAweDEwMDAwMDAwMDAwMDAwMDAwMF07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgotICAgICIyOjM2OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKLSAgICAiMzozNjogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iCi0gICAgIjQ6MzY6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgotICAgICI1OjM2OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKLSAgICAiNjozNjogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBKc29uTmFtZU5vdFN0cmluZykgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtqc29uX25hbWU9MV07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6Mzc6IEV4cGVjdGVkIHN0cmluZyBmb3IgSlNPTiBuYW1lLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgRHVwbGljYXRlSnNvbk5hbWUpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbanNvbl9uYW1lPVwiYVwiLGpzb25fbmFtZT1cImJcIl07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6NDE6IEFscmVhZHkgc2V0IG9wdGlvbiBcImpzb25fbmFtZVwiLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgRW51bVZhbHVlT3V0T2ZSYW5nZSkgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgImVudW0gVGVzdEVudW0ge1xuIgotICAgICIgIEhFWF9UT09fQklHICAgPSAgMHg4MDAwMDAwMDtcbiIKLSAgICAiICBIRVhfVE9PX1NNQUxMID0gLTB4ODAwMDAwMDE7XG4iCi0gICAgIiAgSU5UX1RPT19CSUcgICA9ICAyMTQ3NDgzNjQ4O1xuIgotICAgICIgIElOVF9UT09fU01BTEwgPSAtMjE0NzQ4MzY0OTtcbiIKLSAgICAifVxuIiwKLSAgICAiMToxOTogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iCi0gICAgIjI6MTk6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgotICAgICIzOjE5OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKLSAgICAiNDoxOTogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtQWxsb3dBbGlhc0ZhbHNlKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAiZW51bSBGb28ge1xuIgotICAgICIgIG9wdGlvbiBhbGxvd19hbGlhcyA9IGZhbHNlO1xuIgotICAgICIgIEJBUiA9IDE7XG4iCi0gICAgIiAgQkFaID0gMjtcbiIKLSAgICAifVxuIiwKLSAgICAiNTowOiBcIkZvb1wiIGRlY2xhcmVzICdvcHRpb24gYWxsb3dfYWxpYXMgPSBmYWxzZTsnIHdoaWNoIGhhcyBubyBlZmZlY3QuICIKLSAgICAiUGxlYXNlIHJlbW92ZSB0aGUgZGVjbGFyYXRpb24uXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBVbm5lY2Vzc2FyeUVudW1BbGxvd0FsaWFzKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAiZW51bSBGb28ge1xuIgotICAgICIgIG9wdGlvbiBhbGxvd19hbGlhcyA9IHRydWU7XG4iCi0gICAgIiAgQkFSID0gMTtcbiIKLSAgICAiICBCQVogPSAyO1xuIgotICAgICJ9XG4iLAotICAgICI1OjA6IFwiRm9vXCIgZGVjbGFyZXMgc3VwcG9ydCBmb3IgZW51bSBhbGlhc2VzIGJ1dCBubyBlbnVtIHZhbHVlcyBzaGFyZSAiCi0gICAgImZpZWxkIG51bWJlcnMuIFBsZWFzZSByZW1vdmUgdGhlIHVubmVjZXNzYXJ5ICdvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOycgIgotICAgICJkZWNsYXJhdGlvbi5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU1pc3NpbmcpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD1dO1xuIgotICAgICJ9XG4iLAotICAgICIxOjM1OiBFeHBlY3RlZCBpbnRlZ2VyIGZvciBmaWVsZCBkZWZhdWx0IHZhbHVlLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgRGVmYXVsdFZhbHVlRm9yR3JvdXApIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCBncm91cCBGb28gPSAxIFtkZWZhdWx0PWJsYWhdIHt9XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MzQ6IE1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEdXBsaWNhdGVEZWZhdWx0VmFsdWUpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD0xLGRlZmF1bHQ9Ml07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6Mzc6IEFscmVhZHkgc2V0IG9wdGlvbiBcImRlZmF1bHRcIi5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIE1pc3NpbmdPbmVvZk5hbWUpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvbmVvZiB7XG4iCi0gICAgIiAgICBpbnQzMiBiYXIgPSAxO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIiwKLSAgICAiMTo4OiBFeHBlY3RlZCBvbmVvZiBuYW1lLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgTGFiZWxJbk9uZW9mKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgb25lb2YgZm9vIHtcbiIKLSAgICAiICAgIG9wdGlvbmFsIGludDMyIGJhciA9IDE7XG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iLAotICAgICIyOjQ6IEZpZWxkcyBpbiBvbmVvZnMgbXVzdCBub3QgaGF2ZSBsYWJlbHMgKHJlcXVpcmVkIC8gb3B0aW9uYWwgIgotICAgICAgIi8gcmVwZWF0ZWQpLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgTWFwSW5PbmVvZikgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9uZW9mIGZvbyB7XG4iCi0gICAgIiAgICBtYXA8aW50MzIsIGludDMyPiBmb29fbWFwID0gMTtcbiIKLSAgICAiICAgIG1hcCBtZXNzYWdlX2ZpZWxkID0gMjtcbiIgIC8vIGEgbm9ybWFsIG1lc3NhZ2UgZmllbGQgaXMgT0sKLSAgICAiICB9XG4iCi0gICAgIn1cbiIsCi0gICAgIjI6NzogTWFwIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgaW4gb25lb2ZzLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgTGFiZWxGb3JNYXApIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCBtYXA8aW50MzIsIGludDMyPiBpbnRfbWFwID0gMTtcbiIKLSAgICAiICByZXF1aXJlZCBtYXA8aW50MzIsIGludDMyPiBpbnRfbWFwMiA9IDI7XG4iCi0gICAgIiAgcmVwZWF0ZWQgbWFwPGludDMyLCBpbnQzMj4gaW50X21hcDMgPSAzO1xuIgotICAgICIgIG9wdGlvbmFsIG1hcCBtYXBfbWVzc2FnZSA9IDQ7XG4iICAvLyBhIG5vcm1hbCBtZXNzYWdlIGZpZWxkIGlzIE9LCi0gICAgIn1cbiIsCi0gICAgIjE6MTQ6IEZpZWxkIGxhYmVscyAocmVxdWlyZWQvb3B0aW9uYWwvcmVwZWF0ZWQpIGFyZSBub3QgYWxsb3dlZCBvbiBtYXAgIgotICAgICJmaWVsZHMuXG4iCi0gICAgIjI6MTQ6IEZpZWxkIGxhYmVscyAocmVxdWlyZWQvb3B0aW9uYWwvcmVwZWF0ZWQpIGFyZSBub3QgYWxsb3dlZCBvbiBtYXAgIgotICAgICJmaWVsZHMuXG4iCi0gICAgIjM6MTQ6IEZpZWxkIGxhYmVscyAocmVxdWlyZWQvb3B0aW9uYWwvcmVwZWF0ZWQpIGFyZSBub3QgYWxsb3dlZCBvbiBtYXAgIgotICAgICJmaWVsZHMuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNYWxmb3JtZWRNYXBzKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgbWFwIG1hcF9tZXNzYWdlID0gMTtcbiIgICAvLyBhIG5vcm1hbCBtZXNzYWdlIGZpZWxkIGxhY2tpbmcgbGFiZWwKLSAgICAiICBtYXA8c3RyaW5nPiBzdHJfbWFwID0gMjtcbiIKLSAgICAiICBtYXA8c3RyaW5nLD4gc3RyX21hcDIgPSAzO1xuIgotICAgICIgIG1hcDwsc3RyaW5nPiBzdHJfbWFwMyA9IDQ7XG4iCi0gICAgIiAgbWFwPD4gZW1wdHlfbWFwID0gNTtcbiIKLSAgICAiICBtYXA8c3RyaW5nLHN0cmluZyBzdHJfbWFwNiA9IDY7XG4iCi0gICAgIn0iCi0gICAgImV4dGVuZCBTb21lTWVzc2FnZSB7XG4iCi0gICAgIiAgbWFwPGludDMyLCBpbnQzMj4gaW50X21hcCA9IDE7XG4iCi0gICAgIn0iLAotICAgICIxOjY6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iCi0gICAgIjI6MTI6IEV4cGVjdGVkIFwiLFwiLlxuIgotICAgICIzOjEzOiBFeHBlY3RlZCB0eXBlIG5hbWUuXG4iCi0gICAgIjQ6NjogRXhwZWN0ZWQgdHlwZSBuYW1lLlxuIgotICAgICI1OjY6IEV4cGVjdGVkIHR5cGUgbmFtZS5cbiIKLSAgICAiNjoyMDogRXhwZWN0ZWQgXCI+XCIuXG4iCi0gICAgIjg6NTogTWFwIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgdG8gYmUgZXh0ZW5zaW9ucy5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIEdyb3VwTm90Q2FwaXRhbGl6ZWQpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAiICBvcHRpb25hbCBncm91cCBmb28gPSAxIHt9XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MTc6IEdyb3VwIG5hbWVzIG11c3Qgc3RhcnQgd2l0aCBhIGNhcGl0YWwgbGV0dGVyLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgR3JvdXBNaXNzaW5nQm9keSkgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgotICAgICIgIG9wdGlvbmFsIGdyb3VwIEZvbyA9IDE7XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MjQ6IE1pc3NpbmcgZ3JvdXAgYm9keS5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4dGVuZGluZ1ByaW1pdGl2ZSkgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgImV4dGVuZCBpbnQzMiB7IG9wdGlvbmFsIHN0cmluZyBmb28gPSA0OyB9XG4iLAotICAgICIwOjc6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIEVycm9ySW5FeHRlbnNpb24pIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIEZvbyB7IGV4dGVuc2lvbnMgMTAwIHRvIDE5OTsgfVxuIgotICAgICJleHRlbmQgRm9vIHsgb3B0aW9uYWwgc3RyaW5nIGZvbzsgfVxuIiwKLSAgICAiMTozMjogTWlzc2luZyBmaWVsZCBudW1iZXIuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNdWx0aXBsZVBhcnNlRXJyb3JzKSB7Ci0gIC8vIFdoZW4gYSBzdGF0ZW1lbnQgaGFzIGEgcGFyc2UgZXJyb3IsIHRoZSBwYXJzZXIgc2hvdWxkIGJlIGFibGUgdG8gY29udGludWUKLSAgLy8gcGFyc2luZyBhdCB0aGUgbmV4dCBzdGF0ZW1lbnQuCi0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCi0gICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vO1xuIgotICAgICIgICFpbnZhbGlkIHN0YXRlbWVudCBlbmRpbmcgaW4gYSBibG9jayB7IGJsYWggYmxhaCB7IGJsYWggfSBibGFoIH1cbiIKLSAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAzIHt9XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MjA6IE1pc3NpbmcgZmllbGQgbnVtYmVyLlxuIgotICAgICIyOjI6IEV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuXG4iCi0gICAgIjI6MjogRXhwZWN0ZWQgdHlwZSBuYW1lLlxuIgotICAgICIzOjI1OiBFeHBlY3RlZCBcIjtcIi5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIEVvZkluQWdncmVnYXRlVmFsdWUpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICAgIm9wdGlvbiAoZmlsZW9wdCkgPSB7IGk6MTAwXG4iLAotICAgICAgIjE6MDogVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHBhcnNpbmcgYWdncmVnYXRlIHZhbHVlLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgRXhwbGljaXRPcHRpb25hbExhYmVsUHJvdG8zKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAgICJzeW50YXggPSAncHJvdG8zJztcbiIKLSAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKLSAgICAgICIgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7XG4iCi0gICAgICAifVxuIiwKLSAgICAgICIyOjExOiBFeHBsaWNpdCAnb3B0aW9uYWwnIGxhYmVscyBhcmUgZGlzYWxsb3dlZCBpbiB0aGUgUHJvdG8zIHN5bnRheC4gIgotICAgICAgIlRvIGRlZmluZSAnb3B0aW9uYWwnIGZpZWxkcyBpbiBQcm90bzMsIHNpbXBseSByZW1vdmUgdGhlICdvcHRpb25hbCcgIgotICAgICAgImxhYmVsLCBhcyBmaWVsZHMgYXJlICdvcHRpb25hbCcgYnkgZGVmYXVsdC5cbiIpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEVudW0gZXJyb3JzCi0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgRW9mSW5FbnVtKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAiZW51bSBUZXN0RW51bSB7IiwKLSAgICAiMDoxNTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gZW51bSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtVmFsdWVNaXNzaW5nTnVtYmVyKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAiZW51bSBUZXN0RW51bSB7XG4iCi0gICAgIiAgRk9PO1xuIgotICAgICJ9XG4iLAotICAgICIxOjU6IE1pc3NpbmcgbnVtZXJpYyB2YWx1ZSBmb3IgZW51bSBjb25zdGFudC5cbiIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBSZXNlcnZlZCBmaWVsZCBudW1iZXIgZXJyb3JzCi0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgUmVzZXJ2ZWRNYXhOb3RBbGxvd2VkKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICIgIHJlc2VydmVkIDEwIHRvIG1heDtcbiIKLSAgICAifVxuIiwKLSAgICAiMToxNzogRXhwZWN0ZWQgaW50ZWdlci5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIFJlc2VydmVkTWl4TmFtZUFuZE51bWJlcikgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgIm1lc3NhZ2UgRm9vIHtcbiIKLSAgICAiICByZXNlcnZlZCAxMCwgXCJmb29cIjtcbiIKLSAgICAifVxuIiwKLSAgICAiMToxNTogRXhwZWN0ZWQgZmllbGQgbnVtYmVyIHJhbmdlLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgUmVzZXJ2ZWRNaXNzaW5nUXVvdGVzKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICIgIHJlc2VydmVkIGZvbztcbiIKLSAgICAifVxuIiwKLSAgICAiMToxMTogRXhwZWN0ZWQgZmllbGQgbmFtZSBvciBudW1iZXIgcmFuZ2UuXG4iKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2VydmljZSBlcnJvcnMKLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJblNlcnZpY2UpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHsiLAotICAgICIwOjIxOiBSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBzZXJ2aWNlIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIFNlcnZpY2VNZXRob2RQcmltaXRpdmVQYXJhbXMpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKLSAgICAiICBycGMgRm9vKGludDMyKSByZXR1cm5zIChzdHJpbmcpO1xuIgotICAgICJ9XG4iLAotICAgICIxOjEwOiBFeHBlY3RlZCBtZXNzYWdlIHR5cGUuXG4iCi0gICAgIjE6MjY6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIpOwotfQotCi0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgRW9mSW5NZXRob2RPcHRpb25zKSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCi0gICAgIiAgcnBjIEZvbyhCYXIpIHJldHVybnMoQmFyKSB7IiwKLSAgICAiMToyOTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWV0aG9kIG9wdGlvbnMgKG1pc3NpbmcgJ30nKS5cbiIKLSAgICAiMToyOTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gc2VydmljZSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKLX0KLQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIFByaW1pdGl2ZU1ldGhvZElucHV0KSB7Ci0gIEV4cGVjdEhhc0Vycm9ycygKLSAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCi0gICAgIiAgcnBjIEZvbyhpbnQzMikgcmV0dXJucyhCYXIpO1xuIgotICAgICJ9XG4iLAotICAgICIxOjEwOiBFeHBlY3RlZCBtZXNzYWdlIHR5cGUuXG4iKTsKLX0KLQotCi1URVNUX0YoUGFyc2VFcnJvclRlc3QsIE1ldGhvZE9wdGlvblR5cGVFcnJvcikgewotICAvLyBUaGlzIHVzZWQgdG8gY2F1c2UgYW4gaW5maW5pdGUgbG9vcC4KLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJtZXNzYWdlIEJheiB7fVxuIgotICAgICJzZXJ2aWNlIEZvbyB7XG4iCi0gICAgIiAgcnBjIEJhcihCYXopIHJldHVybnMoQmF6KSB7IG9wdGlvbiBpbnZhbGlkIHN5bnRheDsgfVxuIgotICAgICJ9XG4iLAotICAgICIyOjQ1OiBFeHBlY3RlZCBcIj1cIi5cbiIpOwotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEltcG9ydCBhbmQgcGFja2FnZSBlcnJvcnMKLQotVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBJbXBvcnROb3RRdW90ZWQpIHsKLSAgRXhwZWN0SGFzRXJyb3JzKAotICAgICJpbXBvcnQgZm9vO1xuIiwKLSAgICAiMDo3OiBFeHBlY3RlZCBhIHN0cmluZyBuYW1pbmcgdGhlIGZpbGUgdG8gaW1wb3J0LlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZUVycm9yVGVzdCwgTXVsdGlwbGVQYWNrYWdlc0luRmlsZSkgewotICBFeHBlY3RIYXNFcnJvcnMoCi0gICAgInBhY2thZ2UgZm9vO1xuIgotICAgICJwYWNrYWdlIGJhcjtcbiIsCi0gICAgIjE6MDogTXVsdGlwbGUgcGFja2FnZSBkZWZpbml0aW9ucy5cbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUZXN0IHRoYXQgZXJyb3JzIGRldGVjdGVkIGJ5IERlc2NyaXB0b3JQb29sIGNvcnJlY3RseSByZXBvcnQgbGluZSBhbmQKLS8vIGNvbHVtbiBudW1iZXJzLiAgV2UgaGF2ZSBvbmUgdGVzdCBmb3IgZXZlcnkgY2FsbCB0byBSZWNvcmRMb2NhdGlvbigpIGluCi0vLyBwYXJzZXIuY2MuCi0KLXR5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0OwotCi1URVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgUGFja2FnZU5hbWVFcnJvcikgewotICAvLyBDcmVhdGUgYW5vdGhlciBmaWxlIHdoaWNoIGRlZmluZXMgc3ltYm9sICJmb28iLgotICBGaWxlRGVzY3JpcHRvclByb3RvIG90aGVyX2ZpbGU7Ci0gIG90aGVyX2ZpbGUuc2V0X25hbWUoImJhci5wcm90byIpOwotICBvdGhlcl9maWxlLmFkZF9tZXNzYWdlX3R5cGUoKS0+c2V0X25hbWUoImZvbyIpOwotICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGUob3RoZXJfZmlsZSkgIT0gTlVMTCk7Ci0KLSAgLy8gTm93IHRyeSB0byBkZWZpbmUgaXQgYXMgYSBwYWNrYWdlLgotICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAotICAgICJwYWNrYWdlIGZvby5iYXI7IiwKLSAgICAiMDo4OiBcImZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgc29tZXRoaW5nIG90aGVyIHRoYW4gYSBwYWNrYWdlKSAiCi0gICAgICAiaW4gZmlsZSBcImJhci5wcm90b1wiLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXNzYWdlTmFtZUVycm9yKSB7Ci0gIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHt9XG4iLAotICAgICIxOjg6IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE5hbWVFcnJvcikgewotICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAotICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMTtcbiIKLSAgICAiICBvcHRpb25hbCBpbnQzMiBiYXIgPSAyO1xuIgotICAgICJ9XG4iLAotICAgICIyOjE3OiBcImJhclwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcIkZvb1wiLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVFcnJvcikgewotICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAotICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgIiAgb3B0aW9uYWwgQmF6IGJhciA9IDE7XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MTE6IFwiQmF6XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkTnVtYmVyRXJyb3IpIHsKLSAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKLSAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICIgIG9wdGlvbmFsIGludDMyIGJhciA9IDA7XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MjM6IEZpZWxkIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRFeHRlbmRlZUVycm9yKSB7Ci0gIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCi0gICAgImV4dGVuZCBCYXogeyBvcHRpb25hbCBpbnQzMiBiYXIgPSAxOyB9XG4iLAotICAgICIwOjc6IFwiQmF6XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkRGVmYXVsdFZhbHVlRXJyb3IpIHsKLSAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKLSAgICAiZW51bSBCYXogeyBRVVggPSAxOyB9XG4iCi0gICAgIm1lc3NhZ2UgRm9vIHtcbiIKLSAgICAiICBvcHRpb25hbCBCYXogYmFyID0gMSBbZGVmYXVsdD1OT19TVUNIX1ZBTFVFXTtcbiIKLSAgICAifVxuIiwKLSAgICAiMjozMjogRW51bSB0eXBlIFwiQmF6XCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiTk9fU1VDSF9WQUxVRVwiLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWxlT3B0aW9uTmFtZUVycm9yKSB7Ci0gIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCi0gICAgIm9wdGlvbiBmb28gPSA1OyIsCi0gICAgIjA6NzogT3B0aW9uIFwiZm9vXCIgdW5rbm93bi5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRmlsZU9wdGlvblZhbHVlRXJyb3IpIHsKLSAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKLSAgICAib3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gNTsiLAotICAgICIwOjMwOiBWYWx1ZSBtdXN0IGJlIHF1b3RlZCBzdHJpbmcgZm9yIHN0cmluZyBvcHRpb24gIgotICAgICJcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZVwiLlxuIik7Ci19Ci0KLVRFU1RfRihQYXJzZXJWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE9wdGlvbk5hbWVFcnJvcikgewotICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAotICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgIiAgb3B0aW9uYWwgYm9vbCBiYXIgPSAxIFtmb289MV07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MjU6IE9wdGlvbiBcImZvb1wiIHVua25vd24uXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkT3B0aW9uVmFsdWVFcnJvcikgewotICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAotICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMSBbY3R5cGU9MV07XG4iCi0gICAgIn1cbiIsCi0gICAgIjE6MzI6IFZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgZW51bS12YWx1ZWQgb3B0aW9uICIKLSAgICAiXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlXCIuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIEV4dGVuc2lvblJhbmdlTnVtYmVyRXJyb3IpIHsKLSAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKLSAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICIgIGV4dGVuc2lvbnMgMDtcbiIKLSAgICAifVxuIiwKLSAgICAiMToxMzogRXh0ZW5zaW9uIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU5hbWVFcnJvcikgewotICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAotICAgICJlbnVtIEZvbyB7QSA9IDE7fVxuIgotICAgICJlbnVtIEZvbyB7QiA9IDE7fVxuIiwKLSAgICAiMTo1OiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZC5cbiIpOwotfQotCi1URVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bVZhbHVlTmFtZUVycm9yKSB7Ci0gIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCi0gICAgImVudW0gRm9vIHtcbiIKLSAgICAiICBCQVIgPSAxO1xuIgotICAgICIgIEJBUiA9IDE7XG4iCi0gICAgIn1cbiIsCi0gICAgIjI6MjogXCJCQVJcIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFNlcnZpY2VOYW1lRXJyb3IpIHsKLSAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKLSAgICAic2VydmljZSBGb28ge31cbiIKLSAgICAic2VydmljZSBGb28ge31cbiIsCi0gICAgIjE6ODogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIE1ldGhvZE5hbWVFcnJvcikgewotICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAotICAgICJtZXNzYWdlIEJheiB7fVxuIgotICAgICJzZXJ2aWNlIEZvbyB7XG4iCi0gICAgIiAgcnBjIEJhcihCYXopIHJldHVybnMoQmF6KTtcbiIKLSAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhCYXopO1xuIgotICAgICJ9XG4iLAotICAgICIzOjY6IFwiQmFyXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiRm9vXCIuXG4iKTsKLX0KLQotCi1URVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgTWV0aG9kSW5wdXRUeXBlRXJyb3IpIHsKLSAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKLSAgICAibWVzc2FnZSBCYXoge31cbiIKLSAgICAic2VydmljZSBGb28ge1xuIgotICAgICIgIHJwYyBCYXIoUXV4KSByZXR1cm5zKEJheik7XG4iCi0gICAgIn1cbiIsCi0gICAgIjI6MTA6IFwiUXV4XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKLX0KLQotCi1URVNUX0YoUGFyc2VyVmFsaWRhdGlvbkVycm9yVGVzdCwgTWV0aG9kT3V0cHV0VHlwZUVycm9yKSB7Ci0gIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCi0gICAgIm1lc3NhZ2UgQmF6IHt9XG4iCi0gICAgInNlcnZpY2UgRm9vIHtcbiIKLSAgICAiICBycGMgQmFyKEJheikgcmV0dXJucyhRdXgpO1xuIgotICAgICJ9XG4iLAotICAgICIyOjIzOiBcIlF1eFwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Ci19Ci0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFJlc292bGVkVW5kZWZpbmVkRXJyb3IpIHsKLSAgLy8gQ3JlYXRlIGFub3RoZXIgZmlsZSB3aGljaCBkZWZpbmVzIHN5bWJvbCAiLmJhc2UuYmFyIi4KLSAgRmlsZURlc2NyaXB0b3JQcm90byBvdGhlcl9maWxlOwotICBvdGhlcl9maWxlLnNldF9uYW1lKCJiYXNlLnByb3RvIik7Ci0gIG90aGVyX2ZpbGUuc2V0X3BhY2thZ2UoImJhc2UiKTsKLSAgb3RoZXJfZmlsZS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJiYXIiKTsKLSAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKG90aGVyX2ZpbGUpICE9IE5VTEwpOwotCi0gIC8vIERlZmluZSAiZm9vLmJhc2UiIGFuZCB0cnkgImJhc2UuYmFyIi4KLSAgLy8gImJhc2UuYmFyIiBpcyByZXNvbHZlZCB0byAiZm9vLmJhc2UuYmFyIiB3aGljaCBpcyBub3QgZGVmaW5lZC4KLSAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKLSAgICAicGFja2FnZSBmb28uYmFzZTtcbiIKLSAgICAiaW1wb3J0IFwiYmFzZS5wcm90b1wiO1xuIgotICAgICJtZXNzYWdlIHF1eCB7XG4iCi0gICAgIiAgb3B0aW9uYWwgYmFzZS5iYXIgYmF6ID0gMTtcbiIKLSAgICAiICBvcHRpb25hbCAuYmFzZS5iYXIgcXV6ID0gMjtcbiIKLSAgICAifVxuIiwKLSAgICAiMzoxMTogXCJiYXNlLmJhclwiIGlzIHJlc29sdmVkIHRvIFwiZm9vLmJhc2UuYmFyXCIsIgotICAgICIgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgIgotICAgICJpbiBuYW1lIHJlc29sdXRpb24uIENvbnNpZGVyIHVzaW5nIGEgbGVhZGluZyAnLicoaS5lLiwgXCIuYmFzZS5iYXJcIikiCi0gICAgIiB0byBzdGFydCBmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuXG4iKTsKLX0KLQotVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFJlc292bGVkVW5kZWZpbmVkT3B0aW9uRXJyb3IpIHsKLSAgLy8gQnVpbGQgZGVzY3JpcHRvciBtZXNzYWdlIGluIHRlc3QgcG9vbAotICBGaWxlRGVzY3JpcHRvclByb3RvIGRlc2NyaXB0b3JfcHJvdG87Ci0gIERlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZGVzY3JpcHRvcl9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShkZXNjcmlwdG9yX3Byb3RvKSAhPSBOVUxMKTsKLQotICAvLyBiYXNlMi5wcm90bzoKLSAgLy8gICBwYWNrYWdlIGJhegotICAvLyAgIGltcG9ydCBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwotICAvLyAgIG1lc3NhZ2UgQmFyIHsgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgfQotICAvLyAgIGV4dGVuZCBGaWxlT3B0aW9ucyB7IG9wdGlvbmFsIEJhciBiYXIgPSA3NjcyNzU3OyB9Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXJfZmlsZTsKLSAgb3RoZXJfZmlsZS5zZXRfbmFtZSgiYmFzZTIucHJvdG8iKTsKLSAgb3RoZXJfZmlsZS5zZXRfcGFja2FnZSgiYmF6Iik7Ci0gIG90aGVyX2ZpbGUuYWRkX2RlcGVuZGVuY3koKTsKLSAgb3RoZXJfZmlsZS5zZXRfZGVwZW5kZW5jeSgwLCBkZXNjcmlwdG9yX3Byb3RvLm5hbWUoKSk7Ci0KLSAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlKG90aGVyX2ZpbGUuYWRkX21lc3NhZ2VfdHlwZSgpKTsKLSAgbWVzc2FnZS0+c2V0X25hbWUoIkJhciIpOwotICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQobWVzc2FnZS0+YWRkX2ZpZWxkKCkpOwotICBmaWVsZC0+c2V0X25hbWUoImZvbyIpOwotICBmaWVsZC0+c2V0X251bWJlcigxKTsKLSAgZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTCk7Ci0gIGZpZWxkLT5zZXRfdHlwZShGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzIpOwotCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvKiBleHRlbnNpb24ob3RoZXJfZmlsZS5hZGRfZXh0ZW5zaW9uKCkpOwotICBleHRlbnNpb24tPnNldF9uYW1lKCJiYXIiKTsKLSAgZXh0ZW5zaW9uLT5zZXRfbnVtYmVyKDc2NzI3NTcpOwotICBleHRlbnNpb24tPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTCk7Ci0gIGV4dGVuc2lvbi0+c2V0X3R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0UpOwotICBleHRlbnNpb24tPnNldF90eXBlX25hbWUoIkJhciIpOwotICBleHRlbnNpb24tPnNldF9leHRlbmRlZSgiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIik7Ci0KLSAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKG90aGVyX2ZpbGUpICE9IE5VTEwpOwotCi0gIC8vIHF1eC5wcm90bzoKLSAgLy8gICBwYWNrYWdlIHF1eC5iYXoKLSAgLy8gICBvcHRpb24gKGJhei5iYXIpLmZvbyA9IDE7Ci0gIC8vCi0gIC8vIEFsdGhvdWdoICJiYXouYmFyIiBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZSBsb29rdXAgY29kZSB3aWxsIHRyeQotICAvLyAicXV4LmJhei5iYXIiLCBzaW5jZSBpdCdzIHRoZSBtYXRjaCBmcm9tIHRoZSBpbm5lcm1vc3Qgc2NvcGUsCi0gIC8vIHdoaWNoIHdpbGwgY2F1c2UgYSBzeW1ib2wgbm90IGRlZmluZWQgZXJyb3IuCi0gIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCi0gICAgICAicGFja2FnZSBxdXguYmF6O1xuIgotICAgICAgImltcG9ydCBcImJhc2UyLnByb3RvXCI7XG4iCi0gICAgICAib3B0aW9uIChiYXouYmFyKS5mb28gPSAxO1xuIiwKLSAgICAgICIyOjc6IE9wdGlvbiBcIihiYXouYmFyKVwiIGlzIHJlc29sdmVkIHRvIFwiKHF1eC5iYXouYmFyKVwiLCIKLSAgICAgICIgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgIgotICAgICAgImluIG5hbWUgcmVzb2x1dGlvbi4gQ29uc2lkZXIgdXNpbmcgYSBsZWFkaW5nICcuJyhpLmUuLCBcIiguYmF6LmJhcilcIikiCi0gICAgICAiIHRvIHN0YXJ0IGZyb20gdGhlIG91dGVybW9zdCBzY29wZS5cbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUZXN0IHRoYXQgdGhlIG91dHB1dCBmcm9tIEZpbGVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIChhbmQgYWxsIG90aGVyCi0vLyBkZXNjcmlwdG9yIHR5cGVzKSBpcyBwYXJzZWFibGUsIGFuZCByZXN1bHRzIGluIHRoZSBzYW1lIERlc2NyaXB0b3IKLS8vIGRlZmluaXRpb25zIGFnYWluIGFmb3RlciBwYXJzaW5nIChub3RlLCBob3dldmVyLCB0aGF0IHRoZSBvcmRlciBvZiBtZXNzYWdlcwotLy8gY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gYmUgdGhlIHNhbWUpCi0KLXR5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZURlc2NyaXB0b3JEZWJ1Z1Rlc3Q7Ci0KLWNsYXNzIENvbXBhcmVEZXNjcmlwdG9yTmFtZXMgewotIHB1YmxpYzoKLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IERlc2NyaXB0b3JQcm90byogbGVmdCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byogcmlnaHQpIGNvbnN0IHsKLSAgICByZXR1cm4gbGVmdC0+bmFtZSgpIDwgcmlnaHQtPm5hbWUoKTsKLSAgfQotfTsKLQotLy8gU29ydHMgbmVzdGVkIERlc2NyaXB0b3JQcm90b3Mgb2YgYSBEZXNjcmlwdG9Qcm90bywgYnkgbmFtZS4KLXZvaWQgU29ydE1lc3NhZ2VzKERlc2NyaXB0b3JQcm90byAqZGVzY3JpcHRvcl9wcm90bykgewotICBpbnQgc2l6ZSA9IGRlc2NyaXB0b3JfcHJvdG8tPm5lc3RlZF90eXBlX3NpemUoKTsKLSAgLy8gcmVjdXJzaXZlbHkgc29ydDsgd2UgY2FuJ3QgZ3VhcmFudGVlIHRoZSBvcmRlciBvZiBuZXN0ZWQgbWVzc2FnZXMgZWl0aGVyCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgU29ydE1lc3NhZ2VzKGRlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbmVzdGVkX3R5cGUoaSkpOwotICB9Ci0gIERlc2NyaXB0b3JQcm90byAqKmRhdGEgPQotICAgIGRlc2NyaXB0b3JfcHJvdG8tPm11dGFibGVfbmVzdGVkX3R5cGUoKS0+bXV0YWJsZV9kYXRhKCk7Ci0gIHN0ZDo6c29ydChkYXRhLCBkYXRhICsgc2l6ZSwgQ29tcGFyZURlc2NyaXB0b3JOYW1lcygpKTsKLX0KLQotLy8gU29ydHMgRGVzY3JpcHRvclByb3RvcyBiZWxvbmdpbmcgdG8gYSBGaWxlRGVzY3JpcHRvclByb3RvLCBieSBuYW1lLgotdm9pZCBTb3J0TWVzc2FnZXMoRmlsZURlc2NyaXB0b3JQcm90byAqZmlsZV9kZXNjcmlwdG9yX3Byb3RvKSB7Ci0gIGludCBzaXplID0gZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOwotICAvLyByZWN1cnNpdmVseSBzb3J0OyB3ZSBjYW4ndCBndWFyYW50ZWUgdGhlIG9yZGVyIG9mIG5lc3RlZCBtZXNzYWdlcyBlaXRoZXIKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyArK2kpIHsKLSAgICBTb3J0TWVzc2FnZXMoZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZShpKSk7Ci0gIH0KLSAgRGVzY3JpcHRvclByb3RvICoqZGF0YSA9Ci0gICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpLT5tdXRhYmxlX2RhdGEoKTsKLSAgc3RkOjpzb3J0KGRhdGEsIGRhdGEgKyBzaXplLCBDb21wYXJlRGVzY3JpcHRvck5hbWVzKCkpOwotfQotCi0vLyBTdHJpcHMgdGhlIG1lc3NhZ2UgYW5kIGVudW0gZmllbGQgdHlwZSBuYW1lcyBmb3IgY29tcGFyaXNvbiBwdXJwb3NlIG9ubHkuCi12b2lkIFN0cmlwRmllbGRUeXBlTmFtZShEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8tPmZpZWxkX3NpemUoKTsgKytpKSB7Ci0gICAgc3RyaW5nIHR5cGVfbmFtZSA9IHByb3RvLT5maWVsZChpKS50eXBlX25hbWUoKTsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBwb3MgPSB0eXBlX25hbWUuZmluZF9sYXN0X29mKCIuIik7Ci0gICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIHByb3RvLT5tdXRhYmxlX2ZpZWxkKGkpLT5tdXRhYmxlX3R5cGVfbmFtZSgpLT5hc3NpZ24oCi0gICAgICAgICAgdHlwZV9uYW1lLmJlZ2luKCkgKyBwb3MgKyAxLCB0eXBlX25hbWUuZW5kKCkpOwotICAgIH0KLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLT5uZXN0ZWRfdHlwZV9zaXplKCk7ICsraSkgewotICAgIFN0cmlwRmllbGRUeXBlTmFtZShwcm90by0+bXV0YWJsZV9uZXN0ZWRfdHlwZShpKSk7Ci0gIH0KLX0KLQotdm9pZCBTdHJpcEZpZWxkVHlwZU5hbWUoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9wcm90bykgewotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfcHJvdG8tPm1lc3NhZ2VfdHlwZV9zaXplKCk7ICsraSkgewotICAgIFN0cmlwRmllbGRUeXBlTmFtZShmaWxlX3Byb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZShpKSk7Ci0gIH0KLX0KLQotVEVTVF9GKFBhcnNlRGVzY3JpcHRvckRlYnVnVGVzdCwgVGVzdEFsbERlc2NyaXB0b3JUeXBlcykgewotICBjb25zdCBGaWxlRGVzY3JpcHRvciogb3JpZ2luYWxfZmlsZSA9Ci0gICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOwotICBGaWxlRGVzY3JpcHRvclByb3RvIGV4cGVjdGVkOwotICBvcmlnaW5hbF9maWxlLT5Db3B5VG8oJmV4cGVjdGVkKTsKLQotICAvLyBHZXQgdGhlIERlYnVnU3RyaW5nIG9mIHRoZSB1bml0dGVzdC5wcm90byBGaWxlRGVjcmlwdG9yLCB3aGljaCBpbmNsdWRlcwotICAvLyBhbGwgb3RoZXIgZGVzY3JpcHRvciB0eXBlcwotICBzdHJpbmcgZGVidWdfc3RyaW5nID0gb3JpZ2luYWxfZmlsZS0+RGVidWdTdHJpbmcoKTsKLQotICAvLyBQYXJzZSB0aGUgZGVidWcgc3RyaW5nCi0gIFNldHVwUGFyc2VyKGRlYnVnX3N0cmluZy5jX3N0cigpKTsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBwYXJzZWQ7Ci0gIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZCk7Ci0gIEVYUEVDVF9FUShpbzo6VG9rZW5pemVyOjpUWVBFX0VORCwgaW5wdXRfLT5jdXJyZW50KCkudHlwZSk7Ci0gIEFTU0VSVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0XykKLSAgICAgIDw8ICJGYWlsZWQgdG8gcGFyc2U6XG4iIDw8IGRlYnVnX3N0cmluZzsKLQotICAvLyBXZSBub3cgaGF2ZSBhIEZpbGVEZXNjcmlwdG9yUHJvdG8sIGJ1dCB0byBjb21wYXJlIHdpdGggdGhlIGV4cGVjdGVkIHdlCi0gIC8vIG5lZWQgdG8gbGluayB0byBhIEZpbGVEZWNyaXB0b3IsIHRoZW4gb3V0cHV0IGJhY2sgdG8gYSBwcm90by4gV2UnbGwKLSAgLy8gYWxzbyBuZWVkIHRvIGdpdmUgaXQgdGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWwuCi0gIHBhcnNlZC5zZXRfbmFtZSgiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIik7Ci0gIC8vIFdlIG5lZWQgdGhlIGltcG9ydGVkIGRlcGVuZGVuY3kgYmVmb3JlIHdlIGNhbiBidWlsZCBvdXIgcGFyc2VkIHByb3RvCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwdWJsaWNfaW1wb3J0ID0KLSAgICAgIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydDo6UHVibGljSW1wb3J0TWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5maWxlKCk7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHVibGljX2ltcG9ydF9wcm90bzsKLSAgcHVibGljX2ltcG9ydC0+Q29weVRvKCZwdWJsaWNfaW1wb3J0X3Byb3RvKTsKLSAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKHB1YmxpY19pbXBvcnRfcHJvdG8pICE9IE5VTEwpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogaW1wb3J0ID0KLSAgICAgICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOwotICBGaWxlRGVzY3JpcHRvclByb3RvIGltcG9ydF9wcm90bzsKLSAgaW1wb3J0LT5Db3B5VG8oJmltcG9ydF9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShpbXBvcnRfcHJvdG8pICE9IE5VTEwpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogYWN0dWFsID0gcG9vbF8uQnVpbGRGaWxlKHBhcnNlZCk7Ci0gIHBhcnNlZC5DbGVhcigpOwotICBBU1NFUlRfVFJVRShhY3R1YWwgIT0gTlVMTCkKLSAgICAgIDw8ICJGYWlsZWQgdG8gdmFsaWRhdGU6XG4iIDw8IGRlYnVnX3N0cmluZzsKLSAgYWN0dWFsLT5Db3B5VG8oJnBhcnNlZCk7Ci0gIEFTU0VSVF9UUlVFKGFjdHVhbCAhPSBOVUxMKTsKLQotICAvLyBUaGUgbWVzc2FnZXMgbWlnaHQgYmUgaW4gZGlmZmVyZW50IG9yZGVycywgbWFraW5nIHRoZW0gaGFyZCB0byBjb21wYXJlLgotICAvLyBTbywgc29ydCB0aGUgbWVzc2FnZXMgaW4gdGhlIGRlc2NyaXB0b3IgcHJvdG9zIChpbmNsdWRpbmcgbmVzdGVkIG1lc3NhZ2VzLAotICAvLyByZWN1cnNpdmVseSkuCi0gIFNvcnRNZXNzYWdlcygmZXhwZWN0ZWQpOwotICBTb3J0TWVzc2FnZXMoJnBhcnNlZCk7Ci0KLSAgLy8gSSByZWFsbHkgd2FudGVkIHRvIHVzZSBTdHJpbmdEaWZmIGhlcmUgZm9yIHRoZSBkZWJ1ZyBvdXRwdXQgb24gZmFpbCwKLSAgLy8gYnV0IHRoZSBzdHJpbmdzIGFyZSB0b28gbG9uZyBmb3IgaXQsIGFuZCBpZiBJIGluY3JlYXNlIGl0cyBtYXggc2l6ZSwKLSAgLy8gd2UgZ2V0IGEgbWVtb3J5IGFsbG9jYXRpb24gZmFpbHVyZSA6KAotICBFWFBFQ1RfRVEoZXhwZWN0ZWQuRGVidWdTdHJpbmcoKSwgcGFyc2VkLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoUGFyc2VEZXNjcmlwdG9yRGVidWdUZXN0LCBUZXN0Q3VzdG9tT3B0aW9ucykgewotICBjb25zdCBGaWxlRGVzY3JpcHRvciogb3JpZ2luYWxfZmlsZSA9Ci0gICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpBZ2dyZWdhdGVNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBleHBlY3RlZDsKLSAgb3JpZ2luYWxfZmlsZS0+Q29weVRvKCZleHBlY3RlZCk7Ci0KLSAgc3RyaW5nIGRlYnVnX3N0cmluZyA9IG9yaWdpbmFsX2ZpbGUtPkRlYnVnU3RyaW5nKCk7Ci0KLSAgLy8gUGFyc2UgdGhlIGRlYnVnIHN0cmluZwotICBTZXR1cFBhcnNlcihkZWJ1Z19zdHJpbmcuY19zdHIoKSk7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gcGFyc2VkOwotICBwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZwYXJzZWQpOwotICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOwotICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotCi0gIC8vIFdlIG5vdyBoYXZlIGEgRmlsZURlc2NyaXB0b3JQcm90bywgYnV0IHRvIGNvbXBhcmUgd2l0aCB0aGUgZXhwZWN0ZWQgd2UKLSAgLy8gbmVlZCB0byBsaW5rIHRvIGEgRmlsZURlY3JpcHRvciwgdGhlbiBvdXRwdXQgYmFjayB0byBhIHByb3RvLiBXZSdsbAotICAvLyBhbHNvIG5lZWQgdG8gZ2l2ZSBpdCB0aGUgc2FtZSBuYW1lIGFzIHRoZSBvcmlnaW5hbC4KLSAgcGFyc2VkLnNldF9uYW1lKG9yaWdpbmFsX2ZpbGUtPm5hbWUoKSk7Ci0KLSAgLy8gdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gZGVwZW5kcyBvbiBkZXNjcmlwdG9yLnByb3RvLgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogaW1wb3J0ID0gRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCk7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW1wb3J0X3Byb3RvOwotICBpbXBvcnQtPkNvcHlUbygmaW1wb3J0X3Byb3RvKTsKLSAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKGltcG9ydF9wcm90bykgIT0gTlVMTCk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBhY3R1YWwgPSBwb29sXy5CdWlsZEZpbGUocGFyc2VkKTsKLSAgQVNTRVJUX1RSVUUoYWN0dWFsICE9IE5VTEwpOwotICBwYXJzZWQuQ2xlYXIoKTsKLSAgYWN0dWFsLT5Db3B5VG8oJnBhcnNlZCk7Ci0KLSAgLy8gVGhlIG1lc3NhZ2VzIG1pZ2h0IGJlIGluIGRpZmZlcmVudCBvcmRlcnMsIG1ha2luZyB0aGVtIGhhcmQgdG8gY29tcGFyZS4KLSAgLy8gU28sIHNvcnQgdGhlIG1lc3NhZ2VzIGluIHRoZSBkZXNjcmlwdG9yIHByb3RvcyAoaW5jbHVkaW5nIG5lc3RlZCBtZXNzYWdlcywKLSAgLy8gcmVjdXJzaXZlbHkpLgotICBTb3J0TWVzc2FnZXMoJmV4cGVjdGVkKTsKLSAgU29ydE1lc3NhZ2VzKCZwYXJzZWQpOwotCi0gIEVYUEVDVF9FUShleHBlY3RlZC5EZWJ1Z1N0cmluZygpLCBwYXJzZWQuRGVidWdTdHJpbmcoKSk7Ci19Ci0KLS8vIEVuc3VyZSB0aGF0IERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKSwgd2l0aCB8aW5jbHVkZV9jb21tZW50c3wgc2V0IHRvIHRydWUsCi0vLyBpbmNsdWRlcyBjb21tZW50cyBmcm9tIHRoZSBvcmlnaW5hbCBwYXJzZXIgaW5wdXQgaW4gYWxsIG9mIHRoZSBhcHByb3ByaWF0ZQotLy8gcGxhY2VzLgotVEVTVF9GKFBhcnNlRGVzY3JpcHRvckRlYnVnVGVzdCwgVGVzdENvbW1lbnRzSW5EZWJ1Z1N0cmluZykgewotICBTZXR1cFBhcnNlcigKLSAgICAgICIvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBzeW50YXguXG4iCi0gICAgICAiXG4iCi0gICAgICAiLy8gU3ludGF4IGNvbW1lbnQuXG4iCi0gICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBwYWNrYWdlLlxuIgotICAgICAgIlxuIgotICAgICAgIi8vIFBhY2thZ2UgY29tbWVudC5cbiIKLSAgICAgICJwYWNrYWdlIGNvbW1lbnRfdGVzdDtcbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBUZXN0TWVzc2FnZTEuXG4iCi0gICAgICAiXG4iCi0gICAgICAiLy8gTWVzc2FnZSBjb21tZW50LlxuIgotICAgICAgIi8vXG4iCi0gICAgICAiLy8gTW9yZSBkZXRhaWwgaW4gbWVzc2FnZSBjb21tZW50LlxuIgotICAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2UxIHtcbiIKLSAgICAgICJcbiIKLSAgICAgICIgIC8vIERldGFjaGVkIGNvbW1lbnQgYmVmb3JlIGZvby5cbiIKLSAgICAgICJcbiIKLSAgICAgICIgIC8vIEZpZWxkIGNvbW1lbnQuXG4iCi0gICAgICAiICBvcHRpb25hbCBpbnQzMiBmb28gPSAxO1xuIgotICAgICAgIlxuIgotICAgICAgIiAgLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgTmVzdGVkTWVzc2FnZS5cbiIKLSAgICAgICJcbiIKLSAgICAgICIgIC8vIE5lc3RlZC1tZXNzYWdlIGNvbW1lbnQuXG4iCi0gICAgICAiICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2Uge1xuIgotICAgICAgIiAgICBvcHRpb25hbCBpbnQzMiBiYXIgPSAxO1xuIgotICAgICAgIiAgfVxuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeUVudW1UeXBlLlxuIgotICAgICAgIlxuIgotICAgICAgIi8vIEVudW0gY29tbWVudC5cbiIKLSAgICAgICJlbnVtIE15RW51bVR5cGUge1xuIgotICAgICAgIlxuIgotICAgICAgIiAgLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgQVNERi5cbiIKLSAgICAgICJcbiIKLSAgICAgICIgIC8vIEVudW0tdmFsdWUgY29tbWVudC5cbiIKLSAgICAgICIgIEFTREYgPSAxO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeVNlcnZpY2UuXG4iCi0gICAgICAiXG4iCi0gICAgICAiLy8gU2VydmljZSBjb21tZW50LlxuIgotICAgICAgInNlcnZpY2UgTXlTZXJ2aWNlIHtcbiIKLSAgICAgICJcbiIKLSAgICAgICIgIC8vIERldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE15UlBDQ2FsbC5cbiIKLSAgICAgICJcbiIKLSAgICAgICIgIC8vIFJQQyBjb21tZW50LlxuIgotICAgICAgIiAgcnBjIE15UlBDQ2FsbChUZXN0TWVzc2FnZTEpIHJldHVybnMgKFRlc3RNZXNzYWdlMSkgeyB9XG4iCi0gICAgICAifVxuIik7Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBwYXJzZWRfZGVzYzsKLSAgcGFyc2VkX2Rlc2Muc2V0X25hbWUoImZvby5wcm90byIpOwotICBTb3VyY2VMb2NhdGlvblRhYmxlIHNvdXJjZV9sb2NhdGlvbnM7Ci0gIHBhcnNlcl8tPlJlY29yZFNvdXJjZUxvY2F0aW9uc1RvKCZzb3VyY2VfbG9jYXRpb25zKTsKLSAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmcGFyc2VkX2Rlc2MpOwotICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOwotICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotCi0gIC8vIFdlIG5lZWQgdG8gaW1wb3J0IHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIGdldCBhIEZpbGVEZXNjcmlwdG9yLgotICBNb2NrVmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yIGNvbGxlY3Rvcihzb3VyY2VfbG9jYXRpb25zLCAmZXJyb3JfY29sbGVjdG9yXyk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0KLSAgICAgIHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMocGFyc2VkX2Rlc2MsICZjb2xsZWN0b3IpOwotICBBU1NFUlRfVFJVRShkZXNjcmlwdG9yICE9IE5VTEwpOwotCi0gIC8vIEVuc3VyZSB0aGF0IGVhY2ggb2YgdGhlIGNvbW1lbnRzIGFwcGVhcnMgc29tZXdoZXJlIGluIHRoZSBEZWJ1Z1N0cmluZygpLgotICAvLyBXZSBkb24ndCB0ZXN0IHRoZSBleGFjdCBjb21tZW50IHBsYWNlbWVudCBvciBmb3JtYXR0aW5nLCBiZWNhdXNlIHdlIGRvIG5vdAotICAvLyB3YW50IHRvIGJlIHRvbyBmcmFnaWxlIGhlcmUuCi0gIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2NvbW1lbnRzW10gPSB7Ci0gICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIHN5bnRheC4iLAotICAgICJTeW50YXggY29tbWVudC4iLAotICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBwYWNrYWdlLiIsCi0gICAgIlBhY2thZ2UgY29tbWVudC4iLAotICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBUZXN0TWVzc2FnZTEuIiwKLSAgICAiTWVzc2FnZSBjb21tZW50LiIsCi0gICAgIk1vcmUgZGV0YWlsIGluIG1lc3NhZ2UgY29tbWVudC4iLAotICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBmb28uIiwKLSAgICAiRmllbGQgY29tbWVudCIsCi0gICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE5lc3RlZE1lc3NhZ2UuIiwKLSAgICAiTmVzdGVkLW1lc3NhZ2UgY29tbWVudCIsCi0gICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE15RW51bVR5cGUuIiwKLSAgICAiRW51bSBjb21tZW50IiwKLSAgICAiRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgQVNERi4iLAotICAgICJFbnVtLXZhbHVlIGNvbW1lbnQiLAotICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeVNlcnZpY2UuIiwKLSAgICAiU2VydmljZSBjb21tZW50IiwKLSAgICAiRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgTXlSUENDYWxsLiIsCi0gICAgIlJQQyBjb21tZW50IiwKLSAgfTsKLQotICBEZWJ1Z1N0cmluZ09wdGlvbnMgZGVidWdfc3RyaW5nX29wdGlvbnM7Ci0gIGRlYnVnX3N0cmluZ19vcHRpb25zLmluY2x1ZGVfY29tbWVudHMgPSB0cnVlOwotCi0gIHsKLSAgICBjb25zdCBzdHJpbmcgZGVidWdfc3RyaW5nID0KLSAgICAgICAgZGVzY3JpcHRvci0+RGVidWdTdHJpbmdXaXRoT3B0aW9ucyhkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoZXhwZWN0ZWRfY29tbWVudHMpOyArK2kpIHsKLSAgICAgIHN0cmluZzo6c2l6ZV90eXBlIGZvdW5kX3BvcyA9IGRlYnVnX3N0cmluZy5maW5kKGV4cGVjdGVkX2NvbW1lbnRzW2ldKTsKLSAgICAgIEVYUEVDVF9UUlVFKGZvdW5kX3BvcyAhPSBzdHJpbmc6Om5wb3MpCi0gICAgICAgICAgPDwgIlwiIiA8PCBleHBlY3RlZF9jb21tZW50c1tpXSA8PCAiXCIgbm90IGZvdW5kLiI7Ci0gICAgfQotCi0gICAgLy8gUmVzdWx0IG9mIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMgc2hvdWxkIGJlIHBhcnNlYWJsZS4KLSAgICBTZXR1cFBhcnNlcihkZWJ1Z19zdHJpbmcuY19zdHIoKSk7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBwYXJzZWQ7Ci0gICAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmcGFyc2VkKTsKLSAgICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOwotICAgIEFTU0VSVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yXy50ZXh0XykKLSAgICAgICAgPDwgIkZhaWxlZCB0byBwYXJzZTpcbiIgPDwgZGVidWdfc3RyaW5nOwotICB9Ci0KLX0KLQotVEVTVF9GKFBhcnNlRGVzY3JpcHRvckRlYnVnVGVzdCwgVGVzdE1hcHMpIHsKLSAgU2V0dXBQYXJzZXIoCi0gICAgICAic3ludGF4ID0gXCJwcm90bzNcIjsgIgotICAgICAgIm1lc3NhZ2UgRm9vIHsgIgotICAgICAgIiAgbWVzc2FnZSBCYXIgeyB9ICIKLSAgICAgICIgIG1hcDxpbnQzMiwgQmFyPiBlbnVtX21lc3NhZ2VfbWFwID0gMTsgIgotICAgICAgIiAgbWFwPHN0cmluZywgZmxvYXQ+IHByaW1pdGl2ZV9tYXAgPSAyOyAiCi0gICAgICAifSAiKTsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBvcmlnaW5hbDsKLSAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmb3JpZ2luYWwpKTsKLSAgb3JpZ2luYWwuc2V0X25hbWUoImZvby5wcm90byIpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2xfLkJ1aWxkRmlsZShvcmlnaW5hbCk7Ci0gIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0KLSAgLy8gTWFrZSBzdXJlIHRoZSBkZWJ1ZyBzdHJpbmcgdXNlcyBtYXAgc3ludGF4IGFuZCBkb2VzIG5vdCBoYXZlIHRoZSBhdXRvCi0gIC8vIGdlbmVyYXRlZCBlbnRyeS4KLSAgc3RyaW5nIGRlYnVnX3N0cmluZyA9IGZpbGUtPkRlYnVnU3RyaW5nKCk7Ci0gIEVYUEVDVF9UUlVFKGRlYnVnX3N0cmluZy5maW5kKCJtYXA8IikgIT0gc3RyaW5nOjpucG9zKTsKLSAgRVhQRUNUX1RSVUUoZGVidWdfc3RyaW5nLmZpbmQoIm9wdGlvbiBtYXBfZW50cnkiKSA9PSBzdHJpbmc6Om5wb3MpOwotICBFWFBFQ1RfVFJVRShkZWJ1Z19zdHJpbmcuZmluZCgiTWFwRW50cnkiKSA9PSBzdHJpbmc6Om5wb3MpOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGUgZGVzY3JpcHRvciBkZWJ1ZyBzdHJpbmcgaXMgcGFyc2FibGUuCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gcGFyc2VkOwotICBTZXR1cFBhcnNlcihkZWJ1Z19zdHJpbmcuY19zdHIoKSk7Ci0gIHBhcnNlZC5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0gIEFTU0VSVF9UUlVFKHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZCkpOwotCi0gIG9yaWdpbmFsLmNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKLSAgcGFyc2VkLmNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKLSAgU3RyaXBGaWVsZFR5cGVOYW1lKCZvcmlnaW5hbCk7Ci0gIFN0cmlwRmllbGRUeXBlTmFtZSgmcGFyc2VkKTsKLSAgRVhQRUNUX0VRKG9yaWdpbmFsLkRlYnVnU3RyaW5nKCksIHBhcnNlZC5EZWJ1Z1N0cmluZygpKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gU291cmNlQ29kZUluZm8gdGVzdHMuCi0KLS8vIEZvbGxvd3MgYSBwYXRoIC0tIGFzIGRlZmluZWQgYnkgU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCAtLSBmcm9tIGEKLS8vIG1lc3NhZ2UgdG8gYSBwYXJ0aWN1bGFyIHN1Yi1maWVsZC4KLS8vICogSWYgdGhlIHRhcmdldCBpcyBpdHNlbGYgYSBtZXNzYWdlLCBzZXRzICpvdXRwdXRfbWVzc2FnZSB0byBwb2ludCBhdCBpdCwKLS8vICAgKm91dHB1dF9maWVsZCB0byBOVUxMLCBhbmQgKm91dHB1dF9pbmRleCB0byAtMS4KLS8vICogT3RoZXJ3aXNlLCBpZiB0aGUgdGFyZ2V0IGlzIGFuIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZCwgc2V0cwotLy8gICAqb3V0cHV0X21lc3NhZ2UgdG8gdGhlIGNvbnRhaW5pbmcgbWVzc2FnZSwgKm91dHB1dF9maWVsZCB0byB0aGUgZGVzY3JpcHRvcgotLy8gICBvZiB0aGUgZmllbGQsIGFuZCAqb3V0cHV0X2luZGV4IHRvIHRoZSBpbmRleCBvZiB0aGUgZWxlbWVudC4KLS8vICogT3RoZXJ3aXNlLCB0aGUgdGFyZ2V0IGlzIGEgZmllbGQgKHBvc3NpYmx5IGEgcmVwZWF0ZWQgZmllbGQsIGJ1dCBub3QgYW55Ci0vLyAgIG9uZSBlbGVtZW50KS4gIFNldHMgKm91dHB1dF9tZXNzYWdlIHRvIHRoZSBjb250YWluaW5nIG1lc3NhZ2UsCi0vLyAgICpvdXRwdXRfZmllbGQgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkLCBhbmQgKm91dHB1dF9pbmRleCB0byAtMS4KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgcGF0aCB3YXMgdmFsaWQsIGZhbHNlIG90aGVyd2lzZS4gIEEgZ1Rlc3QgZmFpbHVyZSBpcwotLy8gcmVjb3JkZWQgYmVmb3JlIHJldHVybmluZyBmYWxzZS4KLWJvb2wgRm9sbG93UGF0aChjb25zdCBNZXNzYWdlJiByb290LAotICAgICAgICAgICAgICAgIGNvbnN0IGludCogcGF0aF9iZWdpbiwgY29uc3QgaW50KiBwYXRoX2VuZCwKLSAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiogb3V0cHV0X21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogb3V0cHV0X2ZpZWxkLAotICAgICAgICAgICAgICAgIGludCogb3V0cHV0X2luZGV4KSB7Ci0gIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7Ci0gICAgLy8gUGF0aCByZWZlcnMgdG8gdGhpcyB3aG9sZSBtZXNzYWdlLgotICAgICpvdXRwdXRfbWVzc2FnZSA9ICZyb290OwotICAgICpvdXRwdXRfZmllbGQgPSBOVUxMOwotICAgICpvdXRwdXRfaW5kZXggPSAtMTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSByb290LkdldERlc2NyaXB0b3IoKTsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHJvb3QuR2V0UmVmbGVjdGlvbigpOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU51bWJlcigqcGF0aF9iZWdpbik7Ci0KLSAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiIGhhcyBubyBmaWVsZCBudW1iZXI6ICIKLSAgICAgICAgICAgICAgICAgIDw8ICpwYXRoX2JlZ2luOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gICsrcGF0aF9iZWdpbjsKLQotICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICBpZiAocGF0aF9iZWdpbiA9PSBwYXRoX2VuZCkgewotICAgICAgLy8gUGF0aCByZWZlcnMgdG8gdGhlIHdob2xlIHJlcGVhdGVkIGZpZWxkLgotICAgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7Ci0gICAgICAqb3V0cHV0X2ZpZWxkID0gZmllbGQ7Ci0gICAgICAqb3V0cHV0X2luZGV4ID0gLTE7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBpbnQgaW5kZXggPSAqcGF0aF9iZWdpbisrOwotICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKHJvb3QsIGZpZWxkKTsKLQotICAgIGlmIChpbmRleCA+PSBzaXplKSB7Ci0gICAgICBBRERfRkFJTFVSRSgpIDw8IGRlc2NyaXB0b3ItPm5hbWUoKSA8PCAiLiIgPDwgZmllbGQtPm5hbWUoKQotICAgICAgICAgICAgICAgICAgICA8PCAiIGhhcyBzaXplICIgPDwgc2l6ZSA8PCAiLCBidXQgcGF0aCBjb250YWluZWQgaW5kZXg6ICIKLSAgICAgICAgICAgICAgICAgICAgPDwgaW5kZXg7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICAvLyBEZXNjZW5kIGludG8gY2hpbGQgbWVzc2FnZS4KLSAgICAgIGNvbnN0IE1lc3NhZ2UmIGNoaWxkID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKHJvb3QsIGZpZWxkLCBpbmRleCk7Ci0gICAgICByZXR1cm4gRm9sbG93UGF0aChjaGlsZCwgcGF0aF9iZWdpbiwgcGF0aF9lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfbWVzc2FnZSwgb3V0cHV0X2ZpZWxkLCBvdXRwdXRfaW5kZXgpOwotICAgIH0gZWxzZSBpZiAocGF0aF9iZWdpbiA9PSBwYXRoX2VuZCkgewotICAgICAgLy8gUGF0aCByZWZlcnMgdG8gdGhpcyBlbGVtZW50LgotICAgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7Ci0gICAgICAqb3V0cHV0X2ZpZWxkID0gZmllbGQ7Ci0gICAgICAqb3V0cHV0X2luZGV4ID0gaW5kZXg7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgQUREX0ZBSUxVUkUoKSA8PCBkZXNjcmlwdG9yLT5uYW1lKCkgPDwgIi4iIDw8IGZpZWxkLT5uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYSBtZXNzYWdlOyBjYW5ub3QgZGVzY2VuZCBpbnRvIGl0LiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgY29uc3QgTWVzc2FnZSYgY2hpbGQgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKHJvb3QsIGZpZWxkKTsKLSAgICAgIHJldHVybiBGb2xsb3dQYXRoKGNoaWxkLCBwYXRoX2JlZ2luLCBwYXRoX2VuZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF9tZXNzYWdlLCBvdXRwdXRfZmllbGQsIG91dHB1dF9pbmRleCk7Ci0gICAgfSBlbHNlIGlmIChwYXRoX2JlZ2luID09IHBhdGhfZW5kKSB7Ci0gICAgICAvLyBQYXRoIHJlZmVycyB0byB0aGlzIGZpZWxkLgotICAgICAgKm91dHB1dF9tZXNzYWdlID0gJnJvb3Q7Ci0gICAgICAqb3V0cHV0X2ZpZWxkID0gZmllbGQ7Ci0gICAgICAqb3V0cHV0X2luZGV4ID0gLTE7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgQUREX0ZBSUxVUkUoKSA8PCBkZXNjcmlwdG9yLT5uYW1lKCkgPDwgIi4iIDw8IGZpZWxkLT5uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgPDwgIiBpcyBub3QgYSBtZXNzYWdlOyBjYW5ub3QgZGVzY2VuZCBpbnRvIGl0LiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLS8vIENoZWNrIGlmIHR3byBzcGFucyBhcmUgZXF1YWwuCi1ib29sIENvbXBhcmVTcGFucyhjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHNwYW4xLAotICAgICAgICAgICAgICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ+JiBzcGFuMikgewotICBpZiAoc3BhbjEuc2l6ZSgpICE9IHNwYW4yLnNpemUoKSkgcmV0dXJuIGZhbHNlOwotICBmb3IgKGludCBpID0gMDsgaSA8IHNwYW4xLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHNwYW4xLkdldChpKSAhPSBzcGFuMi5HZXQoaSkpIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gVGVzdCBmaXh0dXJlIGZvciBzb3VyY2UgaW5mbyB0ZXN0cywgd2hpY2ggY2hlY2sgdGhhdCBzb3VyY2UgbG9jYXRpb25zIGFyZQotLy8gcmVjb3JkZWQgY29ycmVjdGx5IGluIEZpbGVEZXNjcmlwdG9yUHJvdG8uc291cmNlX2NvZGVfaW5mby5sb2NhdGlvbi4KLWNsYXNzIFNvdXJjZUluZm9UZXN0IDogcHVibGljIFBhcnNlclRlc3QgewotIHByb3RlY3RlZDoKLSAgLy8gVGhlIHBhcnNlZCBmaWxlIChpbml0aWFsaXplZCBieSBQYXJzZSgpKS4KLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlXzsKLQotICAvLyBQYXJzZSB0aGUgZ2l2ZW4gdGV4dCBhcyBhIC5wcm90byBmaWxlIGFuZCBwb3B1bGF0ZSB0aGUgc3BhbnNfIG1hcCB3aXRoCi0gIC8vIGFsbCB0aGUgc291cmNlIGxvY2F0aW9uIHNwYW5zIGluIGl0cyBTb3VyY2VDb2RlSW5mbyB0YWJsZS4KLSAgYm9vbCBQYXJzZShjb25zdCBjaGFyKiB0ZXh0KSB7Ci0gICAgRXh0cmFjdE1hcmtlcnModGV4dCk7Ci0gICAgU2V0dXBQYXJzZXIodGV4dF93aXRob3V0X21hcmtlcnNfLmNfc3RyKCkpOwotICAgIGlmICghcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmZmlsZV8pKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgY29uc3QgU291cmNlQ29kZUluZm8mIHNvdXJjZV9pbmZvID0gZmlsZV8uc291cmNlX2NvZGVfaW5mbygpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlX2luZm8ubG9jYXRpb25fc2l6ZSgpOyBpKyspIHsKLSAgICAgIGNvbnN0IFNvdXJjZUNvZGVJbmZvOjpMb2NhdGlvbiYgbG9jYXRpb24gPSBzb3VyY2VfaW5mby5sb2NhdGlvbihpKTsKLSAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3JfcHJvdG8gPSBOVUxMOwotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IE5VTEw7Ci0gICAgICBpbnQgaW5kZXggPSAwOwotICAgICAgaWYgKCFGb2xsb3dQYXRoKGZpbGVfLCBsb2NhdGlvbi5wYXRoKCkuYmVnaW4oKSwgbG9jYXRpb24ucGF0aCgpLmVuZCgpLAotICAgICAgICAgICAgICAgICAgICAgICZkZXNjcmlwdG9yX3Byb3RvLCAmZmllbGQsICZpbmRleCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotCi0gICAgICBzcGFuc18uaW5zZXJ0KAotICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKFNwYW5LZXkoKmRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkLCBpbmRleCksICZsb2NhdGlvbikpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIFRlYXJEb3duKCkgewotICAgIEVYUEVDVF9UUlVFKHNwYW5zXy5lbXB0eSgpKQotICAgICAgICA8PCAiRm9yZ290IHRvIGNhbGwgSGFzU3BhbigpIGZvcjpcbiIKLSAgICAgICAgPDwgc3BhbnNfLmJlZ2luKCktPnNlY29uZC0+RGVidWdTdHJpbmcoKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEhhc1NwYW4oKSBjaGVja3MgdGhhdCB0aGUgc3BhbiBvZiBzb3VyY2UgY29kZSBkZWxpbWl0ZWQgYnkgdGhlIGdpdmVuCi0gIC8vIHRhZ3MgKGNvbW1lbnRzKSBjb3JyZXNwb25kIHZpYSB0aGUgU291cmNlQ29kZUluZm8gdGFibGUgdG8gdGhlIGdpdmVuCi0gIC8vIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uICAoSWYgdW5jbGVhciwgbG9vayBhdCB0aGUgYWN0dWFsIHRlc3RzOwotICAvLyBpdCBzaG91bGQgcXVpY2tseSBiZWNvbWUgb2J2aW91cy4pCi0KLSAgYm9vbCBIYXNTcGFuKGNoYXIgc3RhcnRfbWFya2VyLCBjaGFyIGVuZF9tYXJrZXIsCi0gICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvKSB7Ci0gICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudCgKLSAgICAgICAgc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLCBOVUxMLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIH0KLQotICBib29sIEhhc1NwYW5XaXRoQ29tbWVudChjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykgewotICAgIHJldHVybiBIYXNTcGFuV2l0aENvbW1lbnQoCi0gICAgICAgIHN0YXJ0X21hcmtlciwgZW5kX21hcmtlciwgZGVzY3JpcHRvcl9wcm90bywgTlVMTCwgLTEsCi0gICAgICAgIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsIGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzLAotICAgICAgICBleHBlY3RlZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKTsKLSAgfQotCi0gIGJvb2wgSGFzU3BhbihjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAotICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lKSB7Ci0gICAgcmV0dXJuIEhhc1NwYW4oc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZF9uYW1lLCAtMSk7Ci0gIH0KLQotICBib29sIEhhc1NwYW4oY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwKLSAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgIGludCBpbmRleCkgewotICAgIHJldHVybiBIYXNTcGFuKHN0YXJ0X21hcmtlciwgZW5kX21hcmtlciwgZGVzY3JpcHRvcl9wcm90bywKLSAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lLCBpbmRleCwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIH0KLQotICBib29sIEhhc1NwYW4oY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwKLSAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sCi0gICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCi0gICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKLSAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KLSAgICAgICAgZGVzY3JpcHRvcl9wcm90by5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKTsKLSAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgQUREX0ZBSUxVUkUoKSA8PCBkZXNjcmlwdG9yX3Byb3RvLkdldERlc2NyaXB0b3IoKS0+bmFtZSgpCi0gICAgICAgICAgICAgICAgICAgIDw8ICIgaGFzIG5vIHN1Y2ggZmllbGQ6ICIgPDwgZmllbGRfbmFtZTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gSGFzU3BhbldpdGhDb21tZW50KAotICAgICAgICBzdGFydF9tYXJrZXIsIGVuZF9tYXJrZXIsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkLCBpbmRleCwKLSAgICAgICAgZXhwZWN0ZWRfbGVhZGluZ19jb21tZW50cywgZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMsCi0gICAgICAgIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpOwotICB9Ci0KLSAgYm9vbCBIYXNTcGFuKGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8pIHsKLSAgICByZXR1cm4gSGFzU3BhbldpdGhDb21tZW50KAotICAgICAgICAnXDAnLCAnXDAnLCBkZXNjcmlwdG9yX3Byb3RvLCBOVUxMLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCk7Ci0gIH0KLQotICBib29sIEhhc1NwYW4oY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lKSB7Ci0gICAgcmV0dXJuIEhhc1NwYW4oJ1wwJywgJ1wwJywgZGVzY3JpcHRvcl9wcm90bywgZmllbGRfbmFtZSwgLTEpOwotICB9Ci0KLSAgYm9vbCBIYXNTcGFuKGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSwKLSAgICAgICAgICAgICAgIGludCBpbmRleCkgewotICAgIHJldHVybiBIYXNTcGFuKCdcMCcsICdcMCcsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkX25hbWUsIGluZGV4KTsKLSAgfQotCi0gIGJvb2wgSGFzU3BhbldpdGhDb21tZW50KAotICAgICAgY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKLSAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCi0gICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKLSAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpIHsKLSAgICBwYWlyPFNwYW5NYXA6Oml0ZXJhdG9yLCBTcGFuTWFwOjppdGVyYXRvcj4gcmFuZ2UgPQotICAgICAgICBzcGFuc18uZXF1YWxfcmFuZ2UoU3BhbktleShkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZCwgaW5kZXgpKTsKLQotICAgIGlmIChzdGFydF9tYXJrZXIgPT0gJ1wwJykgewotICAgICAgaWYgKHJhbmdlLmZpcnN0ID09IHJhbmdlLnNlY29uZCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzcGFuc18uZXJhc2UocmFuZ2UuZmlyc3QpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcGFpcjxpbnQsIGludD4gc3RhcnRfcG9zID0gRmluZE9yRGllKG1hcmtlcnNfLCBzdGFydF9tYXJrZXIpOwotICAgICAgcGFpcjxpbnQsIGludD4gZW5kX3BvcyA9IEZpbmRPckRpZShtYXJrZXJzXywgZW5kX21hcmtlcik7Ci0KLSAgICAgIFJlcGVhdGVkRmllbGQ8aW50PiBleHBlY3RlZF9zcGFuOwotICAgICAgZXhwZWN0ZWRfc3Bhbi5BZGQoc3RhcnRfcG9zLmZpcnN0KTsKLSAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKHN0YXJ0X3Bvcy5zZWNvbmQpOwotICAgICAgaWYgKGVuZF9wb3MuZmlyc3QgIT0gc3RhcnRfcG9zLmZpcnN0KSB7Ci0gICAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKGVuZF9wb3MuZmlyc3QpOwotICAgICAgfQotICAgICAgZXhwZWN0ZWRfc3Bhbi5BZGQoZW5kX3Bvcy5zZWNvbmQpOwotCi0gICAgICBmb3IgKFNwYW5NYXA6Oml0ZXJhdG9yIGl0ZXIgPSByYW5nZS5maXJzdDsgaXRlciAhPSByYW5nZS5zZWNvbmQ7ICsraXRlcikgewotICAgICAgICBpZiAoQ29tcGFyZVNwYW5zKGV4cGVjdGVkX3NwYW4sIGl0ZXItPnNlY29uZC0+c3BhbigpKSkgewotICAgICAgICAgIGlmIChleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzID09IE5VTEwpIHsKLSAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdGVyLT5zZWNvbmQtPmhhc19sZWFkaW5nX2NvbW1lbnRzKCkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShpdGVyLT5zZWNvbmQtPmhhc19sZWFkaW5nX2NvbW1lbnRzKCkpOwotICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5sZWFkaW5nX2NvbW1lbnRzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMgPT0gTlVMTCkgewotICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGl0ZXItPnNlY29uZC0+aGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBFWFBFQ1RfVFJVRShpdGVyLT5zZWNvbmQtPmhhc190cmFpbGluZ19jb21tZW50cygpKTsKLSAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPnRyYWlsaW5nX2NvbW1lbnRzKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9PSBOVUxMKSB7Ci0gICAgICAgICAgICBFWFBFQ1RfRVEoMCwgaXRlci0+c2Vjb25kLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEVYUEVDVF9FUSgKLSAgICAgICAgICAgICAgICBleHBlY3RlZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzLAotICAgICAgICAgICAgICAgIEpvaW4oaXRlci0+c2Vjb25kLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCksICJcbiIpKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBzcGFuc18uZXJhc2UoaXRlcik7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RydWN0IFNwYW5LZXkgewotICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3JfcHJvdG87Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDsKLSAgICBpbnQgaW5kZXg7Ci0KLSAgICBpbmxpbmUgU3BhbktleSgpIHt9Ci0gICAgaW5saW5lIFNwYW5LZXkoY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90b19wYXJhbSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkX3BhcmFtLAotICAgICAgICAgICAgICAgICAgIGludCBpbmRleF9wYXJhbSkKLSAgICAgICAgOiBkZXNjcmlwdG9yX3Byb3RvKCZkZXNjcmlwdG9yX3Byb3RvX3BhcmFtKSwgZmllbGQoZmllbGRfcGFyYW0pLAotICAgICAgICAgIGluZGV4KGluZGV4X3BhcmFtKSB7fQotCi0gICAgaW5saW5lIGJvb2wgb3BlcmF0b3I8KGNvbnN0IFNwYW5LZXkmIG90aGVyKSBjb25zdCB7Ci0gICAgICBpZiAoZGVzY3JpcHRvcl9wcm90byA8IG90aGVyLmRlc2NyaXB0b3JfcHJvdG8pIHJldHVybiB0cnVlOwotICAgICAgaWYgKGRlc2NyaXB0b3JfcHJvdG8gPiBvdGhlci5kZXNjcmlwdG9yX3Byb3RvKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoZmllbGQgPCBvdGhlci5maWVsZCkgcmV0dXJuIHRydWU7Ci0gICAgICBpZiAoZmllbGQgPiBvdGhlci5maWVsZCkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIGluZGV4IDwgb3RoZXIuaW5kZXg7Ci0gICAgfQotICB9OwotCi0gIHR5cGVkZWYgbXVsdGltYXA8U3BhbktleSwgY29uc3QgU291cmNlQ29kZUluZm86OkxvY2F0aW9uKj4gU3Bhbk1hcDsKLSAgU3Bhbk1hcCBzcGFuc187Ci0gIG1hcDxjaGFyLCBwYWlyPGludCwgaW50PiA+IG1hcmtlcnNfOwotICBzdHJpbmcgdGV4dF93aXRob3V0X21hcmtlcnNfOwotCi0gIHZvaWQgRXh0cmFjdE1hcmtlcnMoY29uc3QgY2hhciogdGV4dCkgewotICAgIG1hcmtlcnNfLmNsZWFyKCk7Ci0gICAgdGV4dF93aXRob3V0X21hcmtlcnNfLmNsZWFyKCk7Ci0gICAgaW50IGxpbmUgPSAwOwotICAgIGludCBjb2x1bW4gPSAwOwotICAgIHdoaWxlICgqdGV4dCAhPSAnXDAnKSB7Ci0gICAgICBpZiAoKnRleHQgPT0gJyQnKSB7Ci0gICAgICAgICsrdGV4dDsKLSAgICAgICAgR09PR0xFX0NIRUNLX05FKCdcMCcsICp0ZXh0KTsKLSAgICAgICAgaWYgKCp0ZXh0ID09ICckJykgewotICAgICAgICAgIHRleHRfd2l0aG91dF9tYXJrZXJzXyArPSAnJCc7Ci0gICAgICAgICAgKytjb2x1bW47Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbWFya2Vyc19bKnRleHRdID0gc3RkOjptYWtlX3BhaXIobGluZSwgY29sdW1uKTsKLSAgICAgICAgICArK3RleHQ7Ci0gICAgICAgICAgR09PR0xFX0NIRUNLX0VRKCckJywgKnRleHQpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKCp0ZXh0ID09ICdcbicpIHsKLSAgICAgICAgKytsaW5lOwotICAgICAgICBjb2x1bW4gPSAwOwotICAgICAgICB0ZXh0X3dpdGhvdXRfbWFya2Vyc18gKz0gKnRleHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0ZXh0X3dpdGhvdXRfbWFya2Vyc18gKz0gKnRleHQ7Ci0gICAgICAgICsrY29sdW1uOwotICAgICAgfQotICAgICAgKyt0ZXh0OwotICAgIH0KLSAgfQotfTsKLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBCYXNpY0ZpbGVEZWNscykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICIkYSRzeW50YXggPSBcInByb3RvMlwiOyRpJFxuIgotICAgICAgInBhY2thZ2UgJGIkZm9vLmJhciRjJDtcbiIKLSAgICAgICJpbXBvcnQgJGQkXCJiYXoucHJvdG9cIiRlJDtcbiIKLSAgICAgICJpbXBvcnQgJGYkXCJxdXgucHJvdG9cIiRnJDskaCRcbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBjb21tZW50IGlnbm9yZWRcbiIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2gnLCBmaWxlXykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWxlXywgInBhY2thZ2UiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIGZpbGVfLCAiZGVwZW5kZW5jeSIsIDApKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgZmlsZV8sICJkZXBlbmRlbmN5IiwgMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2knLCBmaWxlXywgInN5bnRheCIpKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBNZXNzYWdlcykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICIkYSRtZXNzYWdlICRiJEZvbyRjJCB7fSRkJFxuIgotICAgICAgIiRlJG1lc3NhZ2UgJGYkQmFyJGckIHt9JGgkXG4iKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdkJywgZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnaCcsIGZpbGVfLm1lc3NhZ2VfdHlwZSgxKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMSksICJuYW1lIikpOwotCi0gIC8vIElnbm9yZSB0aGVzZS4KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIEZpZWxkcykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgICAiICAkYSRvcHRpb25hbCRiJCAkYyRpbnQzMiRkJCAkZSRiYXIkZiQgPSAkZyQxJGgkOyRpJFxuIgotICAgICAgIiAgJGokcmVwZWF0ZWQkayQgJGwkWC5ZJG0kICRuJGJheiRvJCA9ICRwJDIkcSQ7JHIkXG4iCi0gICAgICAifVxuIikpOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDEgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdpJywgZmllbGQxKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpZWxkMSwgImxhYmVsIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBmaWVsZDEsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWVsZDEsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWVsZDEsICJudW1iZXIiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaicsICdyJywgZmllbGQyKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnaycsIGZpZWxkMiwgImxhYmVsIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBmaWVsZDIsICJ0eXBlX25hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ24nLCAnbycsIGZpZWxkMiwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3AnLCAncScsIGZpZWxkMiwgIm51bWJlciIpKTsKLQotICAvLyBJZ25vcmUgdGhlc2UuCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIEV4dGVuc2lvbnMpIHsKLSAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAiJGEkZXh0ZW5kICRiJEZvbyRjJCB7XG4iCi0gICAgICAiICAkZCRvcHRpb25hbCRlJCBpbnQzMiBiYXIgPSAxOyRmJFxuIgotICAgICAgIiAgJGckcmVwZWF0ZWQkaCQgWC5ZIGJheiA9IDI7JGkkXG4iCi0gICAgICAifSRqJFxuIgotICAgICAgIiRrJGV4dGVuZCAkbCRCYXIkbSQge1xuIgotICAgICAgIiAgJG4kb3B0aW9uYWwgaW50MzIgcXV4ID0gMTskbyRcbiIKLSAgICAgICJ9JHAkXG4iKSk7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMSA9IGZpbGVfLmV4dGVuc2lvbigwKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMiA9IGZpbGVfLmV4dGVuc2lvbigxKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMyA9IGZpbGVfLmV4dGVuc2lvbigyKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2onLCBmaWxlXywgImV4dGVuc2lvbiIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaycsICdwJywgZmlsZV8sICJleHRlbnNpb24iKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdmJywgZmllbGQxKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIGZpZWxkMSwgImxhYmVsIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWVsZDEsICJleHRlbmRlZSIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2knLCBmaWVsZDIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdoJywgZmllbGQyLCAibGFiZWwiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpZWxkMiwgImV4dGVuZGVlIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ24nLCAnbycsIGZpZWxkMykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBmaWVsZDMsICJleHRlbmRlZSIpKTsKLQotICAvLyBJZ25vcmUgdGhlc2UuCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibnVtYmVyIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDIsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm51bWJlciIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibnVtYmVyIikpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIE5lc3RlZEV4dGVuc2lvbnMpIHsKLSAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAibWVzc2FnZSBNZXNzYWdlIHtcbiIKLSAgICAgICIgICRhJGV4dGVuZCAkYiRGb28kYyQge1xuIgotICAgICAgIiAgICAkZCRvcHRpb25hbCRlJCBpbnQzMiBiYXIgPSAxOyRmJFxuIgotICAgICAgIiAgICAkZyRyZXBlYXRlZCRoJCBYLlkgYmF6ID0gMjskaSRcbiIKLSAgICAgICIgIH0kaiRcbiIKLSAgICAgICIgICRrJGV4dGVuZCAkbCRCYXIkbSQge1xuIgotICAgICAgIiAgICAkbiRvcHRpb25hbCBpbnQzMiBxdXggPSAxOyRvJFxuIgotICAgICAgIiAgfSRwJFxuIgotICAgICAgIn1cbiIpKTsKLQotICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbigwKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMiA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb24oMSk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDMgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uKDIpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaicsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbiIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaycsICdwJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZicsIGZpZWxkMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBmaWVsZDEsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmllbGQxLCAiZXh0ZW5kZWUiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdpJywgZmllbGQyKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpZWxkMiwgImxhYmVsIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWVsZDIsICJleHRlbmRlZSIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCduJywgJ28nLCBmaWVsZDMpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgZmllbGQzLCAiZXh0ZW5kZWUiKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDEsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQxLCAibnVtYmVyIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDIsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMiwgIm51bWJlciIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZDMsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkMywgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQzLCAibnVtYmVyIikpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIEV4dGVuc2lvblJhbmdlcykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICJtZXNzYWdlIE1lc3NhZ2Uge1xuIgotICAgICAgIiAgJGEkZXh0ZW5zaW9ucyAkYiQxJGMkIHRvICRkJDQkZSQsICRmJDYkZyQ7JGgkXG4iCi0gICAgICAiICAkaSRleHRlbnNpb25zICRqJDgkayQgdG8gJGwkbWF4JG0kOyRuJFxuIgotICAgICAgIn1cbiIpKTsKLQotICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlJiByYW5nZTEgPQotICAgICAgZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbl9yYW5nZSgwKTsKLSAgY29uc3QgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSYgcmFuZ2UyID0KLSAgICAgIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb25fcmFuZ2UoMSk7Ci0gIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHJhbmdlMyA9Ci0gICAgICBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uX3JhbmdlKDIpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaCcsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbl9yYW5nZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaScsICduJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uX3JhbmdlIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnZScsIHJhbmdlMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCByYW5nZTEsICJzdGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgcmFuZ2UxLCAiZW5kIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIHJhbmdlMikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCByYW5nZTIsICJzdGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgcmFuZ2UyLCAiZW5kIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnbScsIHJhbmdlMykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCByYW5nZTMsICJzdGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgcmFuZ2UzLCAiZW5kIikpOwotCi0gIC8vIElnbm9yZSB0aGVzZS4KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Ci19Ci0KLVRFU1RfRihTb3VyY2VJbmZvVGVzdCwgT25lb2ZzKSB7Ci0gIEVYUEVDVF9UUlVFKFBhcnNlKAotICAgICAgIm1lc3NhZ2UgRm9vIHtcbiIKLSAgICAgICIgICRhJG9uZW9mICRjJGZvbyRkJCB7XG4iCi0gICAgICAiICAgICRlJGludDMyJGYkICRnJGEkaCQgPSAkaSQxJGokOyRrJFxuIgotICAgICAgIiAgfSRyJFxuIgotICAgICAgIn1cbiIpKTsKLQotICBjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgb25lb2ZfZGVjbCA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vbmVvZl9kZWNsKDApOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdyJywgb25lb2ZfZGVjbCkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBvbmVvZl9kZWNsLCAibmFtZSIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2snLCBmaWVsZCkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWVsZCwgInR5cGUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpZWxkLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaScsICdqJywgZmllbGQsICJudW1iZXIiKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBOZXN0ZWRNZXNzYWdlcykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgICAiICAkYSRtZXNzYWdlICRiJEJhciRjJCB7XG4iCi0gICAgICAiICAgICRkJG1lc3NhZ2UgJGUkQmF6JGYkIHt9JGckXG4iCi0gICAgICAiICB9JGgkXG4iCi0gICAgICAiICAkaSRtZXNzYWdlICRqJFF1eCRrJCB7fSRsJFxuIgotICAgICAgIn1cbiIpKTsKLQotICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgwKTsKLSAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXogPSBiYXIubmVzdGVkX3R5cGUoMCk7Ci0gIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcXV4ID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLm5lc3RlZF90eXBlKDEpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaCcsIGJhcikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBiYXIsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2cnLCBiYXopKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgYmF6LCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaScsICdsJywgcXV4KSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2onLCAnaycsIHF1eCwgIm5hbWUiKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBHcm91cHMpIHsKLSAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICAgIiAgbWVzc2FnZSBCYXIge31cbiIKLSAgICAgICIgICRhJG9wdGlvbmFsJGIkICRjJGdyb3VwJGQkICRlJEJheiRmJCA9ICRnJDEkaCQge1xuIgotICAgICAgIiAgICAkaSRtZXNzYWdlIFF1eCB7fSRqJFxuIgotICAgICAgIiAgfSRrJFxuIgotICAgICAgIn1cbiIpKTsKLQotICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgwKTsKLSAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXogPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkubmVzdGVkX3R5cGUoMSk7Ci0gIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcXV4ID0gYmF6Lm5lc3RlZF90eXBlKDApOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdrJywgZmllbGQpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdiJywgZmllbGQsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgZmllbGQsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWVsZCwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGZpZWxkLCAidHlwZV9uYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWVsZCwgIm51bWJlciIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2snLCBiYXopKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgYmF6LCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaScsICdqJywgcXV4KSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKHF1eCwgIm5hbWUiKSk7Ci19Ci0KLVRFU1RfRihTb3VyY2VJbmZvVGVzdCwgRW51bXMpIHsKLSAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAiJGEkZW51bSAkYiRGb28kYyQge30kZCRcbiIKLSAgICAgICIkZSRlbnVtICRmJEJhciRnJCB7fSRoJFxuIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZCcsIGZpbGVfLmVudW1fdHlwZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWxlXy5lbnVtX3R5cGUoMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2gnLCBmaWxlXy5lbnVtX3R5cGUoMSkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgZmlsZV8uZW51bV90eXBlKDEpLCAibmFtZSIpKTsKLQotICAvLyBJZ25vcmUgdGhlc2UuCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFbnVtVmFsdWVzKSB7Ci0gIEVYUEVDVF9UUlVFKFBhcnNlKAotICAgICAgImVudW0gRm9vIHtcbiIKLSAgICAgICIgICRhJEJBUiRiJCA9ICRjJDEkZCQ7JGUkXG4iCi0gICAgICAiICAkZiRCQVokZyQgPSAkaCQyJGkkOyRqJFxuIgotICAgICAgIn0iKSk7Ci0KLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5lbnVtX3R5cGUoMCkudmFsdWUoMCk7Ci0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8uZW51bV90eXBlKDApLnZhbHVlKDEpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZScsIGJhcikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2InLCBiYXIsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBiYXIsICJudW1iZXIiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnaicsIGJheikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBiYXosICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdoJywgJ2knLCBiYXosICJudW1iZXIiKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLCAibmFtZSIpKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBOZXN0ZWRFbnVtcykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgICAiICAkYSRlbnVtICRiJEJhciRjJCB7fSRkJFxuIgotICAgICAgIiAgJGUkZW51bSAkZiRCYXokZyQge30kaCRcbiIKLSAgICAgICJ9XG4iKSk7Ci0KLSAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgwKTsKLSAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgxKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2QnLCBiYXIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgYmFyLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdoJywgYmF6KSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGJheiwgIm5hbWUiKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLCAibmFtZSIpKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBTZXJ2aWNlcykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICIkYSRzZXJ2aWNlICRiJEZvbyRjJCB7fSRkJFxuIgotICAgICAgIiRlJHNlcnZpY2UgJGYkQmFyJGckIHt9JGgkXG4iKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdkJywgZmlsZV8uc2VydmljZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWxlXy5zZXJ2aWNlKDApLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdoJywgZmlsZV8uc2VydmljZSgxKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBmaWxlXy5zZXJ2aWNlKDEpLCAibmFtZSIpKTsKLQotICAvLyBJZ25vcmUgdGhlc2UuCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBNZXRob2RzQW5kU3RyZWFtcykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICJzZXJ2aWNlIEZvbyB7XG4iCi0gICAgICAiICAkYSRycGMgJGIkQmFyJGMkKCRkJFgkZSQpIHJldHVybnMoJGYkWSRnJCk7JGgkIgotICAgICAgIiAgJGkkcnBjICRqJEJheiRrJCgkbCRaJG0kKSByZXR1cm5zKCRuJFckbyQpOyRwJCIKLSAgICAgICJ9IikpOwotCi0gIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCk7Ci0gIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdoJywgYmFyKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGJhciwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIGJhciwgImlucHV0X3R5cGUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGJhciwgIm91dHB1dF90eXBlIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAncCcsIGJheikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCBiYXosICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBiYXosICJpbnB1dF90eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCduJywgJ28nLCBiYXosICJvdXRwdXRfdHlwZSIpKTsKLQotICAvLyBJZ25vcmUgdGhlc2UuCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKSwgIm5hbWUiKSk7Ci19Ci0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBPcHRpb25zKSB7Ci0gIEVYUEVDVF9UUlVFKFBhcnNlKAotICAgICAgIiRhJG9wdGlvbiAkYiRmb28kYyQuJGQkKCRlJGJhci5iYXokZiQpJGckID0gIgotICAgICAgICAgICIkaCQxMjMkaSQ7JGokXG4iCi0gICAgICAiJGskb3B0aW9uIHF1eCA9ICRsJC0xMjMkbSQ7JG4kXG4iCi0gICAgICAiJG8kb3B0aW9uIGNvcmdlID0gJHAkYWJjJHEkOyRyJFxuIgotICAgICAgIiRzJG9wdGlvbiBncmF1bHQgPSAkdCQnYmxhaCckdSQ7JHYkXG4iCi0gICAgICAiJHckb3B0aW9uIGdhcnBseSA9ICR4JHsgeWFkZGEgeWFkZGEgfSR5JDskeiRcbiIKLSAgICAgICIkMCRvcHRpb24gd2FsZG8gPSAkMSQxMjMuMCQyJDskMyRcbiIKLSAgKSk7Ci0KLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMSA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKTsKLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMiA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigxKTsKLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMyA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigyKTsKLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNCA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigzKTsKLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNSA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbig0KTsKLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNiA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbig1KTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2onLCBmaWxlXy5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdqJywgb3B0aW9uMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2cnLCBvcHRpb24xLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgb3B0aW9uMS5uYW1lKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIG9wdGlvbjEubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdnJywgb3B0aW9uMS5uYW1lKDEpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIG9wdGlvbjEubmFtZSgxKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignaCcsICdpJywgb3B0aW9uMSwgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdrJywgJ24nLCBmaWxlXy5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgb3B0aW9uMiwgIm5lZ2F0aXZlX2ludF92YWx1ZSIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdvJywgJ3InLCBmaWxlXy5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigncCcsICdxJywgb3B0aW9uMywgImlkZW50aWZpZXJfdmFsdWUiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigncycsICd2JywgZmlsZV8ub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3QnLCAndScsIG9wdGlvbjQsICJzdHJpbmdfdmFsdWUiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigndycsICd6JywgZmlsZV8ub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3gnLCAneScsIG9wdGlvbjUsICJhZ2dyZWdhdGVfdmFsdWUiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignMCcsICczJywgZmlsZV8ub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJzEnLCAnMicsIG9wdGlvbjYsICJkb3VibGVfdmFsdWUiKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjMpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb240KSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjYpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24zLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb240LCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb241LCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb242LCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24zLm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb240Lm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb241Lm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb242Lm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMy5uYW1lKDApLCAibmFtZV9wYXJ0IikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjQubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb241Lm5hbWUoMCksICJuYW1lX3BhcnQiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uNi5uYW1lKDApLCAibmFtZV9wYXJ0IikpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIFNjb3BlZE9wdGlvbnMpIHsKLSAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgIm1lc3NhZ2UgRm9vIHtcbiIKLSAgICAiICAkYSRvcHRpb24gbW9wdCA9IDE7JGIkXG4iCi0gICAgIn1cbiIKLSAgICAiZW51bSBCYXIge1xuIgotICAgICIgICRjJG9wdGlvbiBlb3B0ID0gMTskZCRcbiIKLSAgICAifVxuIgotICAgICJzZXJ2aWNlIEJheiB7XG4iCi0gICAgIiAgJGUkb3B0aW9uIHNvcHQgPSAxOyRmJFxuIgotICAgICIgIHJwYyBNKFgpIHJldHVybnMoWSkge1xuIgotICAgICIgICAgJGckb3B0aW9uIG1vcHQgPSAxOyRoJFxuIgotICAgICIgIH1cbiIKLSAgICAiICBycGMgTVM0KCQxJHN0cmVhbSQyJCBYKSByZXR1cm5zKCQzJHN0cmVhbSQ0JCBZKSB7XG4iCi0gICAgIiAgICAkayRvcHRpb24gbW9wdCA9IDE7JGwkXG4iCi0gICAgIiAgfVxuIgotICAgICJ9XG4iKSk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdiJywgZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBmaWxlXy5lbnVtX3R5cGUoMCkub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKSkpOwotCi0gIC8vIElnbm9yZSB0aGVzZS4KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8ubWVzc2FnZV90eXBlKDApLm9wdGlvbnMoKQotICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKQotICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5lbnVtX3R5cGUoMCkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm9wdGlvbnMoKQotICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKSwgImlucHV0X3R5cGUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCksICJvdXRwdXRfdHlwZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKQotICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2snLCAnbCcsIGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLm9wdGlvbnMoKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLCAiaW5wdXRfdHlwZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKSwgIm91dHB1dF90eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLm9wdGlvbnMoKQotICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLm9wdGlvbnMoKQotICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSkub3B0aW9ucygpCi0gICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKS5vcHRpb25zKCkKLSAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJzEnLCAnMicsIGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLAotICAgICAgICAgICAgICAgICAgICAgICJjbGllbnRfc3RyZWFtaW5nIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCczJywgJzQnLCBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKSwKLSAgICAgICAgICAgICAgICAgICAgICAic2VydmVyX3N0cmVhbWluZyIpKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBGaWVsZE9wdGlvbnMpIHsKLSAgLy8gVGhlIGFjdHVhbCAibmFtZSA9IHZhbHVlIiBwYWlycyBhcmUgcGFyc2VkIGJ5IHRoZSBzYW1lIGNvZGUgYXMgZm9yCi0gIC8vIHRvcC1sZXZlbCBvcHRpb25zIHNvIHdlIHdvbid0IHJlLXRlc3QgdGhhdCAtLSBqdXN0IG1ha2Ugc3VyZSB0aGF0IHRoZQotICAvLyBzeW50YXggdXNlZCBmb3IgZmllbGQgb3B0aW9ucyBpcyB1bmRlcnN0b29kLgotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICJtZXNzYWdlIEZvbyB7IgotICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMSAiCi0gICAgICAgICAgIiRhJFtkZWZhdWx0PSRiJDEyMyRjJCwkZCRvcHQxPTEyMyRlJCwiCi0gICAgICAgICAgIiRmJG9wdDI9J2hpJyRnJF0kaCQ7IgotICAgICAgIn1cbiIKLSAgKSk7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOwotICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24xID0gZmllbGQub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOwotICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24yID0gZmllbGQub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDEpOwotCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaCcsIGZpZWxkLm9wdGlvbnMoKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWVsZCwgImRlZmF1bHRfdmFsdWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIG9wdGlvbjEpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgb3B0aW9uMikpOwotCi0gIC8vIElnbm9yZSB0aGVzZS4KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCwgImxhYmVsIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpZWxkLCAidHlwZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWVsZCwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmllbGQsICJudW1iZXIiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMiwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMS5uYW1lKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjIsICJzdHJpbmdfdmFsdWUiKSk7Ci19Ci0KLVRFU1RfRihTb3VyY2VJbmZvVGVzdCwgRW51bVZhbHVlT3B0aW9ucykgewotICAvLyBUaGUgYWN0dWFsICJuYW1lID0gdmFsdWUiIHBhaXJzIGFyZSBwYXJzZWQgYnkgdGhlIHNhbWUgY29kZSBhcyBmb3IKLSAgLy8gdG9wLWxldmVsIG9wdGlvbnMgc28gd2Ugd29uJ3QgcmUtdGVzdCB0aGF0IC0tIGp1c3QgbWFrZSBzdXJlIHRoYXQgdGhlCi0gIC8vIHN5bnRheCB1c2VkIGZvciBlbnVtIG9wdGlvbnMgaXMgdW5kZXJzdG9vZC4KLSAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAiZW51bSBGb28geyIKLSAgICAgICIgIEJBUiA9IDEgJGEkWyRiJG9wdDE9MTIzJGMkLCRkJG9wdDI9J2hpJyRlJF0kZiQ7IgotICAgICAgIn1cbiIKLSAgKSk7Ci0KLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiB2YWx1ZSA9IGZpbGVfLmVudW1fdHlwZSgwKS52YWx1ZSgwKTsKLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMSA9IHZhbHVlLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKTsKLSAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMiA9IHZhbHVlLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigxKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2YnLCB2YWx1ZS5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgb3B0aW9uMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBvcHRpb24yKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uZW51bV90eXBlKDApLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3Bhbih2YWx1ZSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKHZhbHVlLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3Bhbih2YWx1ZSwgIm51bWJlciIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLm5hbWUoMCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24xLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMi5uYW1lKDApLCAibmFtZV9wYXJ0IikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKG9wdGlvbjEsICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4ob3B0aW9uMiwgInN0cmluZ192YWx1ZSIpKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBEb2NDb21tZW50cykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICIvLyBGb28gbGVhZGluZ1xuIgotICAgICAgIi8vIGxpbmUgMlxuIgotICAgICAgIiRhJG1lc3NhZ2UgRm9vIHtcbiIKLSAgICAgICIgIC8vIEZvbyB0cmFpbGluZ1xuIgotICAgICAgIiAgLy8gbGluZSAyXG4iCi0gICAgICAiXG4iCi0gICAgICAiICAvLyBkZXRhY2hlZFxuIgotICAgICAgIlxuIgotICAgICAgIiAgLy8gYmFyIGxlYWRpbmdcbiIKLSAgICAgICIgICRiJG9wdGlvbmFsIGludDMyIGJhciA9IDE7JGMkXG4iCi0gICAgICAiICAvLyBiYXIgdHJhaWxpbmdcbiIKLSAgICAgICJ9JGQkXG4iCi0gICAgICAiLy8gaWdub3JlZFxuIgotICApKTsKLQotICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZvbyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZvby5maWVsZCgwKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2EnLCAnZCcsIGZvbywKLSAgICAgICIgRm9vIGxlYWRpbmdcbiBsaW5lIDJcbiIsCi0gICAgICAiIEZvbyB0cmFpbGluZ1xuIGxpbmUgMlxuIiwKLSAgICAgIE5VTEwpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdiJywgJ2MnLCBiYXIsCi0gICAgICAiIGJhciBsZWFkaW5nXG4iLAotICAgICAgIiBiYXIgdHJhaWxpbmdcbiIsCi0gICAgICAiIGRldGFjaGVkXG4iKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZm9vLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibnVtYmVyIikpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzMikgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICIvLyBkZXRhY2hlZCBiZWZvcmUgbWVzc2FnZS5cbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBGb28gbGVhZGluZ1xuIgotICAgICAgIi8vIGxpbmUgMlxuIgotICAgICAgIiRhJG1lc3NhZ2UgRm9vIHtcbiIKLSAgICAgICIgIC8qIEZvbyB0cmFpbGluZ1xuIgotICAgICAgIiAgICogbGluZSAyICovXG4iCi0gICAgICAiICAvLyBkZXRhY2hlZFxuIgotICAgICAgIiAgLyogYmFyIGxlYWRpbmdcbiIKLSAgICAgICIgICAqLyIKLSAgICAgICIgICRiJG9wdGlvbmFsIGludDMyIGJhciA9IDE7JGMkICAvLyBiYXIgdHJhaWxpbmdcbiIKLSAgICAgICIgIC8vIGlnbm9yZWQgZGV0YWNoZWRcbiIKLSAgICAgICJ9JGQkXG4iCi0gICAgICAiLy8gaWdub3JlZFxuIgotICAgICAgIlxuIgotICAgICAgIi8vIGRldGFjaGVkIGJlZm9yZSBvcHRpb25cbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBvcHRpb24gbGVhZGluZ1xuIgotICAgICAgIiRlJG9wdGlvbiBiYXogPSAxMjM7JGYkXG4iCi0gICAgICAiLy8gb3B0aW9uIHRyYWlsaW5nXG4iCi0gICkpOwotCi0gIGNvbnN0IERlc2NyaXB0b3JQcm90byYgZm9vID0gZmlsZV8ubWVzc2FnZV90eXBlKDApOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgYmFyID0gZm9vLmZpZWxkKDApOwotICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBiYXogPSBmaWxlXy5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdhJywgJ2QnLCBmb28sCi0gICAgICAiIEZvbyBsZWFkaW5nXG4gbGluZSAyXG4iLAotICAgICAgIiBGb28gdHJhaWxpbmdcbiBsaW5lIDIgIiwKLSAgICAgICIgZGV0YWNoZWQgYmVmb3JlIG1lc3NhZ2UuXG4iKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnYicsICdjJywgYmFyLAotICAgICAgIiBiYXIgbGVhZGluZ1xuIiwKLSAgICAgICIgYmFyIHRyYWlsaW5nXG4iLAotICAgICAgIiBkZXRhY2hlZFxuIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2UnLCAnZicsIGJheiwKLSAgICAgICIgb3B0aW9uIGxlYWRpbmdcbiIsCi0gICAgICAiIG9wdGlvbiB0cmFpbGluZ1xuIiwKLSAgICAgICIgZGV0YWNoZWQgYmVmb3JlIG9wdGlvblxuIikpOwotCi0gIC8vIElnbm9yZSB0aGVzZS4KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZvbywgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibGFiZWwiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAidHlwZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm51bWJlciIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXosICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhei5uYW1lKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmF6Lm5hbWUoMCksICJuYW1lX3BhcnQiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmF6LCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzMykgewotICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICIkYSRtZXNzYWdlIEZvbyB7XG4iCi0gICAgICAiICAvLyBiYXIgbGVhZGluZ1xuIgotICAgICAgIiAgJGIkb3B0aW9uYWwgaW50MzIgYmFyID0gMSBbKGJhei5xdXgpID0ge31dOyRjJFxuIgotICAgICAgIiAgLy8gYmFyIHRyYWlsaW5nXG4iCi0gICAgICAifSRkJFxuIgotICAgICAgIi8vIGlnbm9yZWRcbiIKLSAgKSk7Ci0KLSAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBmb28gPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmb28uZmllbGQoMCk7Ci0KLSAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdiJywgJ2MnLCBiYXIsCi0gICAgICAiIGJhciBsZWFkaW5nXG4iLAotICAgICAgIiBiYXIgdHJhaWxpbmdcbiIsCi0gICAgICBOVUxMKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZm9vKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZm9vLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibnVtYmVyIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhci5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKSwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oCi0gICAgICBiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oCi0gICAgICBiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAiYWdncmVnYXRlX3ZhbHVlIikpOwotfQotCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzVG9wTGV2ZWwpIHsKLSAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAiLy8gZGV0YWNoZWQgYmVmb3JlIHN5bnRheCBwYXJhZ3JhcGggMVxuIgotICAgICAgIlxuIgotICAgICAgIi8vIGRldGFjaGVkIGJlZm9yZSBzeW50YXggcGFyYWdyYXBoIDJcbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBzeW50YXggbGVhZGluZ1xuIgotICAgICAgIiRhJHN5bnRheCA9IFwicHJvdG8yXCI7JGIkXG4iCi0gICAgICAiLy8gc3ludGF4IHRyYWlsaW5nXG4iCi0gICAgICAiXG4iCi0gICAgICAiLy8gc3ludGF4LXBhY2thZ2UgZGV0YWNoZWQgY29tbWVudHNcbiIKLSAgICAgICJcbiIKLSAgICAgICI7XG4iCi0gICAgICAiXG4iCi0gICAgICAiLy8gZGV0YWNoZWQgYWZ0ZXIgZW1wdHkgYmVmb3JlIHBhY2thZ2VcbiIKLSAgICAgICJcbiIKLSAgICAgICIvLyBwYWNrYWdlIGxlYWRpbmdcbiIKLSAgICAgICJwYWNrYWdlICRjJGZvbyRkJDtcbiIKLSAgICAgICIvLyBwYWNrYWdlIHRyYWlsaW5nXG4iCi0gICAgICAiXG4iCi0gICAgICAiLy8gaWdub3JlZCBkZXRhY2hcbiIKLSAgICAgICJcbiIpKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2InLCBmaWxlXywgInN5bnRheCIsIC0xLAotICAgICAgIiBzeW50YXggbGVhZGluZ1xuIiwKLSAgICAgICIgc3ludGF4IHRyYWlsaW5nXG4iLAotICAgICAgIiBkZXRhY2hlZCBiZWZvcmUgc3ludGF4IHBhcmFncmFwaCAxXG4iCi0gICAgICAiXG4iCi0gICAgICAiIGRldGFjaGVkIGJlZm9yZSBzeW50YXggcGFyYWdyYXBoIDJcbiIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgZmlsZV8sICJwYWNrYWdlIiwgLTEsCi0gICAgICAiIHBhY2thZ2UgbGVhZGluZ1xuIiwKLSAgICAgICIgcGFja2FnZSB0cmFpbGluZ1xuIiwKLSAgICAgICIgc3ludGF4LXBhY2thZ2UgZGV0YWNoZWQgY29tbWVudHNcbiIKLSAgICAgICJcbiIKLSAgICAgICIgZGV0YWNoZWQgYWZ0ZXIgZW1wdHkgYmVmb3JlIHBhY2thZ2VcbiIpKTsKLQotICAvLyBpZ25vcmUgdGhlc2UuCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKLX0KLQotVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBEb2NDb21tZW50c09uZW9mKSB7Ci0gIEVYUEVDVF9UUlVFKFBhcnNlKAotICAgICAgIi8vIEZvbyBsZWFkaW5nXG4iCi0gICAgICAiJGEkbWVzc2FnZSBGb28ge1xuIgotICAgICAgIiAgLyogRm9vIHRyYWlsaW5nXG4iCi0gICAgICAiICAgKi9cbiIKLSAgICAgICIgIC8vIGRldGFjaGVkIGJlZm9yZSBvbmVvZlxuIgotICAgICAgIiAgLyogYmFyIGxlYWRpbmdcbiIKLSAgICAgICIgICAqIGxpbmUgMiAqL1xuIgotICAgICAgIiAgJGIkb25lb2YgYmFyIHtcbiIKLSAgICAgICIgIC8qIGJhciB0cmFpbGluZ1xuIgotICAgICAgIiAgICogbGluZSAyICovXG4iCi0gICAgICAiICAvLyBkZXRhY2hlZCBiZWZvcmUgYmFyX2ludFxuIgotICAgICAgIiAgLyogYmFyX2ludCBsZWFkaW5nXG4iCi0gICAgICAiICAgKi9cbiIKLSAgICAgICIgICRjJGludDMyIGJhcl9pbnQgPSAxOyRkJCAgLy8gYmFyX2ludCB0cmFpbGluZ1xuIgotICAgICAgIiAgLy8gZGV0YWNoIGNvbW1lbnQgaWdub3JlZFxuIgotICAgICAgIiAgfSRlJFxuIgotICAgICAgIn0kZiRcbiIpKTsKLQotICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZvbyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKTsKLSAgY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZvby5vbmVvZl9kZWNsKDApOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgYmFyX2ludCA9IGZvby5maWVsZCgwKTsKLQotICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2EnLCAnZicsIGZvbywKLSAgICAgICIgRm9vIGxlYWRpbmdcbiIsCi0gICAgICAiIEZvbyB0cmFpbGluZ1xuIiwKLSAgICAgIE5VTEwpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdiJywgJ2UnLCBiYXIsCi0gICAgICAiIGJhciBsZWFkaW5nXG4gbGluZSAyICIsCi0gICAgICAiIGJhciB0cmFpbGluZ1xuIGxpbmUgMiAiLAotICAgICAgIiBkZXRhY2hlZCBiZWZvcmUgb25lb2ZcbiIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdjJywgJ2QnLCBiYXJfaW50LAotICAgICAgIiBiYXJfaW50IGxlYWRpbmdcbiIsCi0gICAgICAiIGJhcl9pbnQgdHJhaWxpbmdcbiIsCi0gICAgICAiIGRldGFjaGVkIGJlZm9yZSBiYXJfaW50XG4iKSk7Ci0KLSAgLy8gSWdub3JlIHRoZXNlLgotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oZm9vLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhcl9pbnQsICJ0eXBlIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhcl9pbnQsICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhcl9pbnQsICJudW1iZXIiKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmZmNTBmNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oPgotCi0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8aW8uaD4KLSNpbmNsdWRlIDxmY250bC5oPgotI2lmbmRlZiBTVERJTl9GSUxFTk8KLSNkZWZpbmUgU1RESU5fRklMRU5PIDAKLSNlbmRpZgotI2lmbmRlZiBTVERPVVRfRklMRU5PCi0jZGVmaW5lIFNURE9VVF9GSUxFTk8gMQotI2VuZGlmCi0jZWxzZQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotY2xhc3MgR2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0IDogcHVibGljIEdlbmVyYXRvckNvbnRleHQgewotIHB1YmxpYzoKLSAgR2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0KENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzKQotICAgICAgOiByZXNwb25zZV8ocmVzcG9uc2UpLAotICAgICAgICBwYXJzZWRfZmlsZXNfKHBhcnNlZF9maWxlcykge30KLSAgdmlydHVhbCB+R2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0KCkge30KLQotICAvLyBpbXBsZW1lbnRzIEdlbmVyYXRvckNvbnRleHQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpGaWxlKiBmaWxlID0gcmVzcG9uc2VfLT5hZGRfZmlsZSgpOwotICAgIGZpbGUtPnNldF9uYW1lKGZpbGVuYW1lKTsKLSAgICByZXR1cm4gbmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oZmlsZS0+bXV0YWJsZV9jb250ZW50KCkpOwotICB9Ci0KLSAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW5Gb3JJbnNlcnQoCi0gICAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCkgewotICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6RmlsZSogZmlsZSA9IHJlc3BvbnNlXy0+YWRkX2ZpbGUoKTsKLSAgICBmaWxlLT5zZXRfbmFtZShmaWxlbmFtZSk7Ci0gICAgZmlsZS0+c2V0X2luc2VydGlvbl9wb2ludChpbnNlcnRpb25fcG9pbnQpOwotICAgIHJldHVybiBuZXcgaW86OlN0cmluZ091dHB1dFN0cmVhbShmaWxlLT5tdXRhYmxlX2NvbnRlbnQoKSk7Ci0gIH0KLQotICB2b2lkIExpc3RQYXJzZWRGaWxlcyh2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KSB7Ci0gICAgKm91dHB1dCA9IHBhcnNlZF9maWxlc187Ci0gIH0KLQotIHByaXZhdGU6Ci0gIENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2VfOwotICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzXzsKLX07Ci0KLWJvb2wgR2VuZXJhdGVDb2RlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiByZXF1ZXN0LAotICAgIGNvbnN0IENvZGVHZW5lcmF0b3ImIGdlbmVyYXRvciwgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiByZXNwb25zZSwKLSAgICBzdHJpbmcqIGVycm9yX21zZykgewotICBEZXNjcmlwdG9yUG9vbCBwb29sOwotICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3QucHJvdG9fZmlsZV9zaXplKCk7IGkrKykgewotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUocmVxdWVzdC5wcm90b19maWxlKGkpKTsKLSAgICBpZiAoZmlsZSA9PSBOVUxMKSB7Ci0gICAgICAvLyBCdWlsZEZpbGUoKSBhbHJlYWR5IHdyb3RlIGFuIGVycm9yIG1lc3NhZ2UuCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gcGFyc2VkX2ZpbGVzOwotICBmb3IgKGludCBpID0gMDsgaSA8IHJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZV9zaXplKCk7IGkrKykgewotICAgIHBhcnNlZF9maWxlcy5wdXNoX2JhY2socG9vbC5GaW5kRmlsZUJ5TmFtZShyZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUoaSkpKTsKLSAgICBpZiAocGFyc2VkX2ZpbGVzLmJhY2soKSA9PSBOVUxMKSB7Ci0gICAgICAqZXJyb3JfbXNnID0gInByb3RvYyBhc2tlZCBwbHVnaW4gdG8gZ2VuZXJhdGUgYSBmaWxlIGJ1dCAiCi0gICAgICAgICAgICAgICAgICAgImRpZCBub3QgcHJvdmlkZSBhIGRlc2NyaXB0b3IgZm9yIHRoZSBmaWxlOiAiICsKLSAgICAgICAgICAgICAgICAgICByZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUoaSk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgR2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0IGNvbnRleHQocmVzcG9uc2UsIHBhcnNlZF9maWxlcyk7Ci0KLSAgaWYgKGdlbmVyYXRvci5IYXNHZW5lcmF0ZUFsbCgpKSB7Ci0gICAgc3RyaW5nIGVycm9yOwotICAgIGJvb2wgc3VjY2VlZGVkID0gZ2VuZXJhdG9yLkdlbmVyYXRlQWxsKAotICAgICAgICBwYXJzZWRfZmlsZXMsIHJlcXVlc3QucGFyYW1ldGVyKCksICZjb250ZXh0LCAmZXJyb3IpOwotCi0gICAgaWYgKCFzdWNjZWVkZWQgJiYgZXJyb3IuZW1wdHkoKSkgewotICAgICAgZXJyb3IgPSAiQ29kZSBnZW5lcmF0b3IgcmV0dXJuZWQgZmFsc2UgYnV0IHByb3ZpZGVkIG5vIGVycm9yICIKLSAgICAgICAgICAgICAgImRlc2NyaXB0aW9uLiI7Ci0gICAgfQotICAgIGlmICghZXJyb3IuZW1wdHkoKSkgewotICAgICAgcmVzcG9uc2UtPnNldF9lcnJvcihlcnJvcik7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBhcnNlZF9maWxlc1tpXTsKLQotICAgICAgc3RyaW5nIGVycm9yOwotICAgICAgYm9vbCBzdWNjZWVkZWQgPSBnZW5lcmF0b3IuR2VuZXJhdGUoCi0gICAgICAgICAgZmlsZSwgcmVxdWVzdC5wYXJhbWV0ZXIoKSwgJmNvbnRleHQsICZlcnJvcik7Ci0KLSAgICAgIGlmICghc3VjY2VlZGVkICYmIGVycm9yLmVtcHR5KCkpIHsKLSAgICAgICAgZXJyb3IgPSAiQ29kZSBnZW5lcmF0b3IgcmV0dXJuZWQgZmFsc2UgYnV0IHByb3ZpZGVkIG5vIGVycm9yICIKLSAgICAgICAgICAgICAgICAiZGVzY3JpcHRpb24uIjsKLSAgICAgIH0KLSAgICAgIGlmICghZXJyb3IuZW1wdHkoKSkgewotICAgICAgICByZXNwb25zZS0+c2V0X2Vycm9yKGZpbGUtPm5hbWUoKSArICI6ICIgKyBlcnJvcik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1pbnQgUGx1Z2luTWFpbihpbnQgYXJnYywgY2hhciogYXJndltdLCBjb25zdCBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IpIHsKLQotICBpZiAoYXJnYyA+IDEpIHsKLSAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiBVbmtub3duIG9wdGlvbjogIiA8PCBhcmd2WzFdIDw8IHN0ZDo6ZW5kbDsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0jaWZkZWYgX1dJTjMyCi0gIF9zZXRtb2RlKFNURElOX0ZJTEVOTywgX09fQklOQVJZKTsKLSAgX3NldG1vZGUoU1RET1VUX0ZJTEVOTywgX09fQklOQVJZKTsKLSNlbmRpZgotCi0gIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlcXVlc3Q7Ci0gIGlmICghcmVxdWVzdC5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihTVERJTl9GSUxFTk8pKSB7Ci0gICAgc3RkOjpjZXJyIDw8IGFyZ3ZbMF0gPDwgIjogcHJvdG9jIHNlbnQgdW5wYXJzZWFibGUgcmVxdWVzdCB0byBwbHVnaW4uIgotICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7Ci0gICAgcmV0dXJuIDE7Ci0gIH0KLQotICBzdHJpbmcgZXJyb3JfbXNnOwotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgcmVzcG9uc2U7Ci0KLSAgaWYgKEdlbmVyYXRlQ29kZShyZXF1ZXN0LCAqZ2VuZXJhdG9yLCAmcmVzcG9uc2UsICZlcnJvcl9tc2cpKSB7Ci0gICAgaWYgKCFyZXNwb25zZS5TZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKFNURE9VVF9GSUxFTk8pKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiBFcnJvciB3cml0aW5nIHRvIHN0ZG91dC4iIDw8IHN0ZDo6ZW5kbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoIWVycm9yX21zZy5lbXB0eSgpKSB7Ci0gICAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiAiIDw8IGVycm9yX21zZyA8PCBzdGQ6OmVuZGw7Ci0gICAgfQotICAgIHJldHVybiAxOwotICB9Ci0KLSAgcmV0dXJuIDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDI3OTNhOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vCi0vLyBGcm9udC1lbmQgZm9yIHByb3RvYyBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdyaXR0ZW4gaW4gQysrLgotLy8KLS8vIFRvIGltcGxlbWVudCBhIHByb3RvYyBwbHVnaW4gaW4gQysrLCBzaW1wbHkgd3JpdGUgYW4gaW1wbGVtZW50YXRpb24gb2YKLS8vIENvZGVHZW5lcmF0b3IsIHRoZW4gY3JlYXRlIGEgbWFpbigpIGZ1bmN0aW9uIGxpa2U6Ci0vLyAgIGludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLS8vICAgICBNeUNvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yOwotLy8gICAgIHJldHVybiBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6UGx1Z2luTWFpbihhcmdjLCBhcmd2LCAmZ2VuZXJhdG9yKTsKLS8vICAgfQotLy8gWW91IG11c3QgbGluayB5b3VyIHBsdWdpbiBhZ2FpbnN0IGxpYnByb3RvYnVmIGFuZCBsaWJwcm90b2MuCi0vLwotLy8gVGhlIGNvcmUgcGFydCBvZiBQbHVnaW5NYWluIGlzIHRvIGludm9rZSB0aGUgZ2l2ZW4gQ29kZUdlbmVyYXRvciBvbiBhCi0vLyBDb2RlR2VuZXJhdG9yUmVxdWVzdCB0byBnZW5lcmF0ZSBhIENvZGVHZW5lcmF0b3JSZXNwb25zZS4gVGhpcyBwYXJ0IGlzCi0vLyBhYnN0cmFjdGVkIG91dCBhbmQgbWFkZSBpbnRvIGZ1bmN0aW9uIEdlbmVyYXRlQ29kZSBzbyB0aGF0IGl0IGNhbiBiZSByZXVzZWQsCi0vLyBmb3IgZXhhbXBsZSwgdG8gaW1wbGVtZW50IGEgdmFyaWFudCBvZiBQbHVnaW5NYWluIHRoYXQgZG9lcyBzb21lCi0vLyBwcmVwcm9jZXNzaW5nIG9uIHRoZSBpbnB1dCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBiZWZvcmUgZmVlZGluZyB0aGUgcmVxdWVzdAotLy8gdG8gdGhlIGdpdmVuIGNvZGUgZ2VuZXJhdG9yLgotLy8KLS8vIFRvIGdldCBwcm90b2MgdG8gdXNlIHRoZSBwbHVnaW4sIGRvIG9uZSBvZiB0aGUgZm9sbG93aW5nOgotLy8gKiBQbGFjZSB0aGUgcGx1Z2luIGJpbmFyeSBzb21ld2hlcmUgaW4gdGhlIFBBVEggYW5kIGdpdmUgaXQgdGhlIG5hbWUKLS8vICAgInByb3RvYy1nZW4tTkFNRSIgKHJlcGxhY2luZyAiTkFNRSIgd2l0aCB0aGUgbmFtZSBvZiB5b3VyIHBsdWdpbikuICBJZiB5b3UKLS8vICAgdGhlbiBpbnZva2UgcHJvdG9jIHdpdGggdGhlIHBhcmFtZXRlciAtLU5BTUVfb3V0PU9VVF9ESVIgKGFnYWluLCByZXBsYWNlCi0vLyAgICJOQU1FIiB3aXRoIHlvdXIgcGx1Z2luJ3MgbmFtZSksIHByb3RvYyB3aWxsIGludm9rZSB5b3VyIHBsdWdpbiB0byBnZW5lcmF0ZQotLy8gICB0aGUgb3V0cHV0LCB3aGljaCB3aWxsIGJlIHBsYWNlZCBpbiBPVVRfRElSLgotLy8gKiBQbGFjZSB0aGUgcGx1Z2luIGJpbmFyeSBhbnl3aGVyZSwgd2l0aCBhbnkgbmFtZSwgYW5kIHBhc3MgdGhlIC0tcGx1Z2luCi0vLyAgIHBhcmFtZXRlciB0byBwcm90b2MgdG8gZGlyZWN0IGl0IHRvIHlvdXIgcGx1Z2luIGxpa2Ugc286Ci0vLyAgICAgcHJvdG9jIC0tcGx1Z2luPXByb3RvYy1nZW4tTkFNRT1wYXRoL3RvL215YmluYXJ5IC0tTkFNRV9vdXQ9T1VUX0RJUgotLy8gICBPbiBXaW5kb3dzLCBtYWtlIHN1cmUgdG8gaW5jbHVkZSB0aGUgLmV4ZSBzdWZmaXg6Ci0vLyAgICAgcHJvdG9jIC0tcGx1Z2luPXByb3RvYy1nZW4tTkFNRT1wYXRoL3RvL215YmluYXJ5LmV4ZSAtLU5BTUVfb3V0PU9VVF9ESVIKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUExVR0lOX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfUExVR0lOX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotY2xhc3MgQ29kZUdlbmVyYXRvcjsgICAgLy8gY29kZV9nZW5lcmF0b3IuaAotY2xhc3MgQ29kZUdlbmVyYXRvclJlcXVlc3Q7Ci1jbGFzcyBDb2RlR2VuZXJhdG9yUmVzcG9uc2U7Ci0KLS8vIEltcGxlbWVudHMgbWFpbigpIGZvciBhIHByb3RvYyBwbHVnaW4gZXhwb3NpbmcgdGhlIGdpdmVuIGNvZGUgZ2VuZXJhdG9yLgotTElCUFJPVE9DX0VYUE9SVCBpbnQgUGx1Z2luTWFpbihpbnQgYXJnYywgY2hhciogYXJndltdLCBjb25zdCBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IpOwotCi0vLyBHZW5lcmF0ZXMgY29kZSB1c2luZyB0aGUgZ2l2ZW4gY29kZSBnZW5lcmF0b3IuIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZQotLy8gZ2VuZXJhdGlvbiBpcyBzdWNjZXNzZnVsLiBJZiB0aGUgY29kZSBnZW5lYXJ0aW9uIGZhaWxzLCBlcnJvcl9tc2cgbWF5IGJlCi0vLyBwb3B1bGF0ZWQgdG8gZGVzY3JpYmUgdGhlIGZhaWx1cmUgY2F1c2UuCi1ib29sIEdlbmVyYXRlQ29kZShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgcmVxdWVzdCwKLSAgICBjb25zdCBDb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2UsCi0gICAgc3RyaW5nKiBlcnJvcl9tc2cpOwotCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QTFVHSU5fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlOWQ1MGExLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTYwMCArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvCi0KLSNkZWZpbmUgSU5URVJOQUxfU1VQUFJFU1NfUFJPVE9CVUZfRklFTERfREVQUkVDQVRJT04KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIENvZGVHZW5lcmF0b3JSZXF1ZXN0X3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlc3BvbnNlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfcmVmbGVjdGlvbl8gPSBOVUxMOwotCi19ICAvLyBuYW1lc3BhY2UKLQotCi12b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCkgewotICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yKiBmaWxlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5GaW5kRmlsZUJ5TmFtZSgKLSAgICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIik7Ci0gIEdPT0dMRV9DSEVDSyhmaWxlICE9IE5VTEwpOwotICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKTsKLSAgc3RhdGljIGNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdF9vZmZzZXRzX1szXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBmaWxlX3RvX2dlbmVyYXRlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVxdWVzdCwgcGFyYW1ldGVyXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVxdWVzdCwgcHJvdG9fZmlsZV8pLAotICB9OwotICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9yZWZsZWN0aW9uXyA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl8sCi0gICAgICBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlcXVlc3QsIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICAtMSwKLSAgICAgIHNpemVvZihDb2RlR2VuZXJhdG9yUmVxdWVzdCksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLSAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEpOwotICBzdGF0aWMgY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9vZmZzZXRzX1syXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgZXJyb3JfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgZmlsZV8pLAotICB9OwotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXywKLSAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2Vfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKENvZGVHZW5lcmF0b3JSZXNwb25zZSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX2Rlc2NyaXB0b3JfID0gQ29kZUdlbmVyYXRvclJlc3BvbnNlX2Rlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZSgwKTsKLSAgc3RhdGljIGNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9vZmZzZXRzX1szXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBuYW1lXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSwgaW5zZXJ0aW9uX3BvaW50XyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSwgY29udGVudF8pLAotICB9OwotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9yZWZsZWN0aW9uXyA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl8sCi0gICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICAtMSwKLSAgICAgIHNpemVvZihDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLX0KLQotbmFtZXNwYWNlIHsKLQotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc19vbmNlXyk7Ci1pbmxpbmUgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfLAotICAgICAgICAgICAgICAgICAmcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8pOwotfQotCi12b2lkIHByb3RvYnVmX1JlZ2lzdGVyVHlwZXMoY29uc3QgOjpzdGQ6OnN0cmluZyYpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl8sICZDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl8sICZDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl8sICZDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLXZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpIHsKLSAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXF1ZXN0X3JlZmxlY3Rpb25fOwotICBkZWxldGUgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXNwb25zZV9yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX3JlZmxlY3Rpb25fOwotfQotCi12b2lkIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCkgewotICBzdGF0aWMgYm9vbCBhbHJlYWR5X2hlcmUgPSBmYWxzZTsKLSAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuOwotICBhbHJlYWR5X2hlcmUgPSB0cnVlOwotICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OkludGVybmFsQWRkR2VuZXJhdGVkRmlsZSgKLSAgICAiXG4lZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90b1wwMjIiCi0gICAgIlwwMzBnb29nbGUucHJvdG9idWYuY29tcGlsZXJcMDMyIGdvb2dsZS9wcm90b2IiCi0gICAgInVmL2Rlc2NyaXB0b3IucHJvdG9cIn1cblwwMjRDb2RlR2VuZXJhdG9yUmVxdSIKLSAgICAiZXN0XDAyMlwwMzBcblwwMjBmaWxlX3RvX2dlbmVyYXRlXDAzMFwwMDEgXDAwMyhcdFwwMjJcMDIxXG5cdHBhcmFtZXQiCi0gICAgImVyXDAzMFwwMDIgXDAwMShcdFwwMjI4XG5cbnByb3RvX2ZpbGVcMDMwXDAxNyBcMDAzKFwwMTMyJC5nb29nbGUucHIiCi0gICAgIm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvXCJcMjUyXDAwMVxuXDAyNUNvZGVHZW5lciIKLSAgICAiYXRvclJlc3BvbnNlXDAyMlxyXG5cMDA1ZXJyb3JcMDMwXDAwMSBcMDAxKFx0XDAyMkJcblwwMDRmaWxlXDAzMFwwMTcgXDAwMygiCi0gICAgIlwwMTMyNC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXQiCi0gICAgIm9yUmVzcG9uc2UuRmlsZVwwMzI+XG5cMDA0RmlsZVwwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAyN1xuIgotICAgICJcMDE3aW5zZXJ0aW9uX3BvaW50XDAzMFwwMDIgXDAwMShcdFwwMjJcMDE3XG5cMDA3Y29udGVudFwwMzBcMDE3IFwwMDEoXHRCIgotICAgICI3XG5cMDM0Y29tLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlckJcMDE0UGx1Z2luUCIKLSAgICAicm90b3NaXHRwbHVnaW5fZ28iLCA0NTYpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZSgKLSAgICAiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byIsICZwcm90b2J1Zl9SZWdpc3RlclR5cGVzKTsKLSAgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IENvZGVHZW5lcmF0b3JSZXF1ZXN0KCk7Ci0gIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgQ29kZUdlbmVyYXRvclJlc3BvbnNlKCk7Ci0gIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpOwotICBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90byk7Ci19Ci0KLS8vIEZvcmNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYmUgY2FsbGVkIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbiB0aW1lLgotc3RydWN0IFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8gewotICBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCkgewotICAgIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7Ci0gIH0KLX0gc3RhdGljX2Rlc2NyaXB0b3JfaW5pdGlhbGl6ZXJfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvXzsKLQotbmFtZXNwYWNlIHsKLQotc3RhdGljIHZvaWQgTWVyZ2VGcm9tRmFpbChpbnQgbGluZSkgR09PR0xFX0FUVFJJQlVURV9DT0xEOwotc3RhdGljIHZvaWQgTWVyZ2VGcm9tRmFpbChpbnQgbGluZSkgewotICBHT09HTEVfQ0hFQ0soZmFsc2UpIDw8IF9fRklMRV9fIDw8ICI6IiA8PCBsaW5lOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjprRmlsZVRvR2VuZXJhdGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6a1BhcmFtZXRlckZpZWxkTnVtYmVyOwotY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjprUHJvdG9GaWxlRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLUNvZGVHZW5lcmF0b3JSZXF1ZXN0OjpDb2RlR2VuZXJhdG9yUmVxdWVzdCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCi19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNvZGVHZW5lcmF0b3JSZXF1ZXN0KGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTaGFyZWRDdG9yKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgcGFyYW1ldGVyXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUNvZGVHZW5lcmF0b3JSZXF1ZXN0Ojp+Q29kZUdlbmVyYXRvclJlcXVlc3QoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTaGFyZWREdG9yKCkgewotICBwYXJhbWV0ZXJfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXF1ZXN0X2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1Db2RlR2VuZXJhdG9yUmVxdWVzdCogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotQ29kZUdlbmVyYXRvclJlcXVlc3QqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKLSAgQ29kZUdlbmVyYXRvclJlcXVlc3QqIG4gPSBuZXcgQ29kZUdlbmVyYXRvclJlcXVlc3Q7Ci0gIGlmIChhcmVuYSAhPSBOVUxMKSB7Ci0gICAgYXJlbmEtPk93bihuKTsKLSAgfQotICByZXR1cm4gbjsKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q2xlYXIoKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCi0gIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKLSAgICBwYXJhbWV0ZXJfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgfQotICBmaWxlX3RvX2dlbmVyYXRlXy5DbGVhcigpOwotICBwcm90b19maWxlXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgIHBhcnNlX2ZpbGVfdG9fZ2VuZXJhdGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5hZGRfZmlsZV90b19nZW5lcmF0ZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpIC0gMSkuZGF0YSgpLAotICAgICAgICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZSh0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKSAtIDEpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEwKSkgZ290byBwYXJzZV9maWxlX3RvX2dlbmVyYXRlOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfcGFyYW1ldGVyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAxOCkgewotICAgICAgICAgcGFyc2VfcGFyYW1ldGVyOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXJhbWV0ZXIoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+cGFyYW1ldGVyKCkuZGF0YSgpLCB0aGlzLT5wYXJhbWV0ZXIoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyMikpIGdvdG8gcGFyc2VfcHJvdG9fZmlsZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Ci0gICAgICBjYXNlIDE1OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTIyKSB7Ci0gICAgICAgICBwYXJzZV9wcm90b19maWxlOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX3Byb3RvX2ZpbGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9wcm90b19maWxlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyMikpIGdvdG8gcGFyc2VfbG9vcF9wcm90b19maWxlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQotICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZV9zaXplKCk7IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKS5kYXRhKCksIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCi0gICAgICAxLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7Ci0gIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPnBhcmFtZXRlcigpLmRhdGEoKSwgdGhpcy0+cGFyYW1ldGVyKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlciIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDIsIHRoaXMtPnBhcmFtZXRlcigpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5wcm90b19maWxlX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICAxNSwgdGhpcy0+cHJvdG9fZmlsZShpKSwgb3V0cHV0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCi0gIC8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLmRhdGEoKSwgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSIpOwotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlU3RyaW5nVG9BcnJheSgxLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7Ci0gIGlmIChoYXNfcGFyYW1ldGVyKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPnBhcmFtZXRlcigpLmRhdGEoKSwgdGhpcy0+cGFyYW1ldGVyKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlciIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5wYXJhbWV0ZXIoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICAxNSwgdGhpcy0+cHJvdG9fZmlsZShpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKLSAgaWYgKGhhc19wYXJhbWV0ZXIoKSkgewotICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgdGhpcy0+cGFyYW1ldGVyKCkpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+cHJvdG9fZmlsZShpKSk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QqIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdD4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6TWVyZ2VGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGZpbGVfdG9fZ2VuZXJhdGVfLk1lcmdlRnJvbShmcm9tLmZpbGVfdG9fZ2VuZXJhdGVfKTsKLSAgcHJvdG9fZmlsZV8uTWVyZ2VGcm9tKGZyb20ucHJvdG9fZmlsZV8pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX3BhcmFtZXRlcigpKSB7Ci0gICAgICBzZXRfaGFzX3BhcmFtZXRlcigpOwotICAgICAgcGFyYW1ldGVyXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ucGFyYW1ldGVyXyk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+cHJvdG9fZmlsZSgpKSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U3dhcChDb2RlR2VuZXJhdG9yUmVxdWVzdCogb3RoZXIpIHsKLSAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKLSAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkludGVybmFsU3dhcChDb2RlR2VuZXJhdG9yUmVxdWVzdCogb3RoZXIpIHsKLSAgZmlsZV90b19nZW5lcmF0ZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZmlsZV90b19nZW5lcmF0ZV8pOwotICBwYXJhbWV0ZXJfLlN3YXAoJm90aGVyLT5wYXJhbWV0ZXJfKTsKLSAgcHJvdG9fZmlsZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+cHJvdG9fZmlsZV8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDb2RlR2VuZXJhdG9yUmVxdWVzdF9yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0jaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBDb2RlR2VuZXJhdG9yUmVxdWVzdAotCi0vLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7Ci1pbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLnNpemUoKTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7Ci0gIGZpbGVfdG9fZ2VuZXJhdGVfLkNsZWFyKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi0gIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5HZXQoaW5kZXgpOwotfQotIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQotICByZXR1cm4gZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCk7Ci19Ci0gdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQotICBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIGZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi19Ci0gdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi19Ci0gOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi0gIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5BZGQoKTsKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjphZGRfZmlsZV90b19nZW5lcmF0ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBmaWxlX3RvX2dlbmVyYXRlXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjphZGRfZmlsZV90b19nZW5lcmF0ZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBmaWxlX3RvX2dlbmVyYXRlXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBmaWxlX3RvX2dlbmVyYXRlXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKLX0KLSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgotQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmZpbGVfdG9fZ2VuZXJhdGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQotICByZXR1cm4gZmlsZV90b19nZW5lcmF0ZV87Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKLUNvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi0gIHJldHVybiAmZmlsZV90b19nZW5lcmF0ZV87Ci19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOwotYm9vbCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6aGFzX3BhcmFtZXRlcigpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci12b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfaGFzX3BhcmFtZXRlcigpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX2hhc19wYXJhbWV0ZXIoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfcGFyYW1ldGVyKCkgewotICBwYXJhbWV0ZXJfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX3BhcmFtZXRlcigpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpwYXJhbWV0ZXIoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKLSAgcmV0dXJuIHBhcmFtZXRlcl8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKLSAgcGFyYW1ldGVyXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCi19Ci0gdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X3BhcmFtZXRlcihjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX3BhcmFtZXRlcigpOwotICBwYXJhbWV0ZXJfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIHBhcmFtZXRlcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKLX0KLSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wYXJhbWV0ZXIoKSB7Ci0gIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCi0gIHJldHVybiBwYXJhbWV0ZXJfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnJlbGVhc2VfcGFyYW1ldGVyKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQotICBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7Ci0gIHJldHVybiBwYXJhbWV0ZXJfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2FsbG9jYXRlZF9wYXJhbWV0ZXIoOjpzdGQ6OnN0cmluZyogcGFyYW1ldGVyKSB7Ci0gIGlmIChwYXJhbWV0ZXIgIT0gTlVMTCkgewotICAgIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX3BhcmFtZXRlcigpOwotICB9Ci0gIHBhcmFtZXRlcl8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHBhcmFtZXRlcik7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Ci1pbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHByb3RvX2ZpbGVfLnNpemUoKTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmNsZWFyX3Byb3RvX2ZpbGUoKSB7Ci0gIHByb3RvX2ZpbGVfLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpwcm90b19maWxlKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQotICByZXR1cm4gcHJvdG9fZmlsZV8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcHJvdG9fZmlsZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCi0gIHJldHVybiBwcm90b19maWxlXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9wcm90b19maWxlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQotICByZXR1cm4gcHJvdG9fZmlsZV8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgotQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcHJvdG9fZmlsZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucHJvdG9fZmlsZSkKLSAgcmV0dXJuICZwcm90b19maWxlXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4mCi1Db2RlR2VuZXJhdG9yUmVxdWVzdDo6cHJvdG9fZmlsZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCi0gIHJldHVybiBwcm90b19maWxlXzsKLX0KLQotI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6a05hbWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6a0luc2VydGlvblBvaW50RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmtDb250ZW50RmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLUNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTaGFyZWRDdG9yKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbmFtZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBpbnNlcnRpb25fcG9pbnRfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY29udGVudF8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6fkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U2hhcmVkRHRvcigpIHsKLSAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaW5zZXJ0aW9uX3BvaW50Xy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjb250ZW50Xy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLSAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBuID0gbmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obik7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgN3UpIHsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBpZiAoaGFzX2luc2VydGlvbl9wb2ludCgpKSB7Ci0gICAgICBpbnNlcnRpb25fcG9pbnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gICAgaWYgKGhhc19jb250ZW50KCkpIHsKLSAgICAgIGNvbnRlbnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotICB9Ci19Ci0KLWJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9pbnNlcnRpb25fcG9pbnQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE4KSB7Ci0gICAgICAgICBwYXJzZV9pbnNlcnRpb25fcG9pbnQ6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2luc2VydGlvbl9wb2ludCgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5kYXRhKCksIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTIyKSkgZ290byBwYXJzZV9jb250ZW50OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnQgPSAxNTsKLSAgICAgIGNhc2UgMTU6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAxMjIpIHsKLSAgICAgICAgIHBhcnNlX2NvbnRlbnQ6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2NvbnRlbnQoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+Y29udGVudCgpLmRhdGEoKSwgdGhpcy0+Y29udGVudCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQotICByZXR1cm4gdHJ1ZTsKLWZhaWx1cmU6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7Ci0gIGlmIChoYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmRhdGEoKSwgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDIsIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGNvbnRlbnQgPSAxNTsKLSAgaWYgKGhhc19jb250ZW50KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmNvbnRlbnQoKS5kYXRhKCksIHRoaXMtPmNvbnRlbnQoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDE1LCB0aGlzLT5jb250ZW50KCksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7Ci0gIGlmIChoYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmRhdGEoKSwgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7Ci0gIGlmIChoYXNfY29udGVudCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5jb250ZW50KCkuZGF0YSgpLCB0aGlzLT5jb250ZW50KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMTUsIHRoaXMtPmNvbnRlbnQoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgN3UpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7Ci0gICAgaWYgKGhhc19pbnNlcnRpb25fcG9pbnQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7Ci0gICAgaWYgKGhhc19jb250ZW50KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPmNvbnRlbnQoKSk7Ci0gICAgfQotCi0gIH0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ok1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX25hbWUoKSkgewotICAgICAgc2V0X2hhc19uYW1lKCk7Ci0gICAgICBuYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV8pOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKLSAgICAgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gICAgICBpbnNlcnRpb25fcG9pbnRfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5pbnNlcnRpb25fcG9pbnRfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2NvbnRlbnQoKSkgewotICAgICAgc2V0X2hhc19jb250ZW50KCk7Ci0gICAgICBjb250ZW50Xy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uY29udGVudF8pOwotICAgIH0KLSAgfQotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpDb3B5RnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpIHsKLSAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKLSAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkludGVybmFsU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpIHsKLSAgbmFtZV8uU3dhcCgmb3RoZXItPm5hbWVfKTsKLSAgaW5zZXJ0aW9uX3BvaW50Xy5Td2FwKCZvdGhlci0+aW5zZXJ0aW9uX3BvaW50Xyk7Ci0gIGNvbnRlbnRfLlN3YXAoJm90aGVyLT5jb250ZW50Xyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmtFcnJvckZpZWxkTnVtYmVyOwotY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6a0ZpbGVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLQotQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2UoY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNoYXJlZEN0b3IoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBlcnJvcl8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Db2RlR2VuZXJhdG9yUmVzcG9uc2U6On5Db2RlR2VuZXJhdG9yUmVzcG9uc2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNoYXJlZER0b3IoKSB7Ci0gIGVycm9yXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1Db2RlR2VuZXJhdG9yUmVzcG9uc2UqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1Db2RlR2VuZXJhdG9yUmVzcG9uc2UqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIENvZGVHZW5lcmF0b3JSZXNwb25zZSogbiA9IG5ldyBDb2RlR2VuZXJhdG9yUmVzcG9uc2U7Ci0gIGlmIChhcmVuYSAhPSBOVUxMKSB7Ci0gICAgYXJlbmEtPk93bihuKTsKLSAgfQotICByZXR1cm4gbjsKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLSAgaWYgKGhhc19lcnJvcigpKSB7Ci0gICAgZXJyb3JfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgfQotICBmaWxlXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLSAgZm9yICg7OykgewotICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfZXJyb3IoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+ZXJyb3IoKS5kYXRhKCksIHRoaXMtPmVycm9yKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX2ZpbGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKLSAgICAgIGNhc2UgMTU6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAxMjIpIHsKLSAgICAgICAgIHBhcnNlX2ZpbGU6Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfZmlsZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2ZpbGUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTIyKSkgZ290byBwYXJzZV9sb29wX2ZpbGU7Ci0gICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bnVzdWFsOgotICAgICAgICBpZiAodGFnID09IDAgfHwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgZ290byBzdWNjZXNzOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLXN1Y2Nlc3M6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQotICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOwotICBpZiAoaGFzX2Vycm9yKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmVycm9yKCkuZGF0YSgpLCB0aGlzLT5lcnJvcigpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAxLCB0aGlzLT5lcnJvcigpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZmlsZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMTUsIHRoaXMtPmZpbGUoaSksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQotICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOwotICBpZiAoaGFzX2Vycm9yKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmVycm9yKCkuZGF0YSgpLCB0aGlzLT5lcnJvcigpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+ZXJyb3IoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmZpbGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMTUsIHRoaXMtPmZpbGUoaSksIHRhcmdldCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKLSAgaWYgKGhhc19lcnJvcigpKSB7Ci0gICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICB0aGlzLT5lcnJvcigpKTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWxlX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT5maWxlKGkpKTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSogc291cmNlID0gCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZT4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TWVyZ2VGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgZmlsZV8uTWVyZ2VGcm9tKGZyb20uZmlsZV8pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX2Vycm9yKCkpIHsKLSAgICAgIHNldF9oYXNfZXJyb3IoKTsKLSAgICAgIGVycm9yXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uZXJyb3JfKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotICB9Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Q29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZSogb3RoZXIpIHsKLSAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKLSAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpJbnRlcm5hbFN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBvdGhlcikgewotICBlcnJvcl8uU3dhcCgmb3RoZXItPmVycm9yXyk7Ci0gIGZpbGVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmZpbGVfKTsKLSAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Ci0gIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUKLQotLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfbmFtZSgpIHsKLSAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbmFtZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQotICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCi19Ci0gdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKLX0KLSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9uYW1lKCkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCi0gIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpyZWxlYXNlX25hbWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQotICBjbGVhcl9oYXNfbmFtZSgpOwotICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgfQotICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKLWJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Omhhc19pbnNlcnRpb25fcG9pbnQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9oYXNfaW5zZXJ0aW9uX3BvaW50KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2luc2VydGlvbl9wb2ludCgpIHsKLSAgaW5zZXJ0aW9uX3BvaW50Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aW5zZXJ0aW9uX3BvaW50KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCi0gIHJldHVybiBpbnNlcnRpb25fcG9pbnRfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gIGluc2VydGlvbl9wb2ludF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLSAgaW5zZXJ0aW9uX3BvaW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCkKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOwotICBpbnNlcnRpb25fcG9pbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCi19Ci0gOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Om11dGFibGVfaW5zZXJ0aW9uX3BvaW50KCkgewotICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQotICByZXR1cm4gaW5zZXJ0aW9uX3BvaW50Xy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpyZWxlYXNlX2luc2VydGlvbl9wb2ludCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCkKLSAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOwotICByZXR1cm4gaW5zZXJ0aW9uX3BvaW50Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9hbGxvY2F0ZWRfaW5zZXJ0aW9uX3BvaW50KDo6c3RkOjpzdHJpbmcqIGluc2VydGlvbl9wb2ludCkgewotICBpZiAoaW5zZXJ0aW9uX3BvaW50ICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLSAgfQotICBpbnNlcnRpb25fcG9pbnRfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBpbnNlcnRpb25fcG9pbnQpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OwotYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX2NvbnRlbnQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2hhc19jb250ZW50KCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaGFzX2NvbnRlbnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfY29udGVudCgpIHsKLSAgY29udGVudF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfY29udGVudCgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjb250ZW50KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotICByZXR1cm4gY29udGVudF8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9jb250ZW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfY29udGVudCgpOwotICBjb250ZW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfY29udGVudCgpOwotICBjb250ZW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCi19Ci0gdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2NvbnRlbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfY29udGVudCgpOwotICBjb250ZW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKLX0KLSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9jb250ZW50KCkgewotICBzZXRfaGFzX2NvbnRlbnQoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCi0gIHJldHVybiBjb250ZW50Xy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpyZWxlYXNlX2NvbnRlbnQoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotICBjbGVhcl9oYXNfY29udGVudCgpOwotICByZXR1cm4gY29udGVudF8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX2NvbnRlbnQoOjpzdGQ6OnN0cmluZyogY29udGVudCkgewotICBpZiAoY29udGVudCAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19jb250ZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2NvbnRlbnQoKTsKLSAgfQotICBjb250ZW50Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgY29udGVudCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENvZGVHZW5lcmF0b3JSZXNwb25zZQotCi0vLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOwotYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Omhhc19lcnJvcigpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2hhc19lcnJvcigpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLXZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpjbGVhcl9oYXNfZXJyb3IoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmNsZWFyX2Vycm9yKCkgewotICBlcnJvcl8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfZXJyb3IoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmVycm9yKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCi0gIHJldHVybiBlcnJvcl8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfZXJyb3IoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19lcnJvcigpOwotICBlcnJvcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQotfQotIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19lcnJvcigpOwotICBlcnJvcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCi19Ci0gdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnNldF9lcnJvcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19lcnJvcigpOwotICBlcnJvcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKLX0KLSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Om11dGFibGVfZXJyb3IoKSB7Ci0gIHNldF9oYXNfZXJyb3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKLSAgcmV0dXJuIGVycm9yXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6cmVsZWFzZV9lcnJvcigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKLSAgY2xlYXJfaGFzX2Vycm9yKCk7Ci0gIHJldHVybiBlcnJvcl8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2FsbG9jYXRlZF9lcnJvcig6OnN0ZDo6c3RyaW5nKiBlcnJvcikgewotICBpZiAoZXJyb3IgIT0gTlVMTCkgewotICAgIHNldF9oYXNfZXJyb3IoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfZXJyb3IoKTsKLSAgfQotICBlcnJvcl8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGVycm9yKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7Ci1pbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBmaWxlXy5zaXplKCk7Ci19Ci12b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfZmlsZSgpIHsKLSAgZmlsZV8uQ2xlYXIoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlKQotICByZXR1cm4gZmlsZV8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Om11dGFibGVfZmlsZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlKQotICByZXR1cm4gZmlsZV8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjphZGRfZmlsZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCi0gIHJldHVybiBmaWxlXy5BZGQoKTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPioKLUNvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9maWxlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKLSAgcmV0dXJuICZmaWxlXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiYKLUNvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZmlsZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlKQotICByZXR1cm4gZmlsZV87Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCi0KLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTEwMjAyZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oCisrKyAvZGV2L251bGwKQEAgLTEsODE4ICswLDAgQEAKLS8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCi0vLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KLQotI2lmbmRlZiBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fX0lOQ0xVREVECi0jZGVmaW5lIFBST1RPQlVGX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b19fSU5DTFVERUQKLQotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotI2lmIEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OIDwgMzAwMDAwMAotI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGEgbmV3ZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKLSNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZQotI2Vycm9yIHlvdXIgaGVhZGVycy4KLSNlbmRpZgotI2lmIDMwMDAwMDAgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OCi0jZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXMKLSNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlCi0jZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotCi0vLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCi12b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLXZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLXZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotCi1jbGFzcyBDb2RlR2VuZXJhdG9yUmVxdWVzdDsKLWNsYXNzIENvZGVHZW5lcmF0b3JSZXNwb25zZTsKLWNsYXNzIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNsYXNzIExJQlBST1RPQ19FWFBPUlQgQ29kZUdlbmVyYXRvclJlcXVlc3QgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIENvZGVHZW5lcmF0b3JSZXF1ZXN0KCk7Ci0gIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3JSZXF1ZXN0KCk7Ci0KLSAgQ29kZUdlbmVyYXRvclJlcXVlc3QoY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pOwotCi0gIGlubGluZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgdm9pZCBTd2FwKENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgQ29kZUdlbmVyYXRvclJlcXVlc3QqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBvdGhlcik7Ci0gIHByaXZhdGU6Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOwotICB9Ci0gIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKLSAgfQotICBwdWJsaWM6Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7Ci0gIGludCBmaWxlX3RvX2dlbmVyYXRlX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9maWxlX3RvX2dlbmVyYXRlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVUb0dlbmVyYXRlRmllbGROdW1iZXIgPSAxOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBmaWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCkgY29uc3Q7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpOwotICB2b2lkIHNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKTsKLSAgdm9pZCBhZGRfZmlsZV90b19nZW5lcmF0ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIGFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIGZpbGVfdG9fZ2VuZXJhdGUoKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9maWxlX3RvX2dlbmVyYXRlKCk7Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7Ci0gIGJvb2wgaGFzX3BhcmFtZXRlcigpIGNvbnN0OwotICB2b2lkIGNsZWFyX3BhcmFtZXRlcigpOwotICBzdGF0aWMgY29uc3QgaW50IGtQYXJhbWV0ZXJGaWVsZE51bWJlciA9IDI7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHBhcmFtZXRlcigpIGNvbnN0OwotICB2b2lkIHNldF9wYXJhbWV0ZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9wYXJhbWV0ZXIoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9wYXJhbWV0ZXIoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX3BhcmFtZXRlcig6OnN0ZDo6c3RyaW5nKiBwYXJhbWV0ZXIpOwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Ci0gIGludCBwcm90b19maWxlX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9wcm90b19maWxlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1Byb3RvRmlsZUZpZWxkTnVtYmVyID0gMTU7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG9fZmlsZShpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfcHJvdG9fZmlsZShpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIGFkZF9wcm90b19maWxlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4qCi0gICAgICBtdXRhYmxlX3Byb3RvX2ZpbGUoKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiYKLSAgICAgIHByb3RvX2ZpbGUoKSBjb25zdDsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQotIHByaXZhdGU6Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19wYXJhbWV0ZXIoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4gZmlsZV90b19nZW5lcmF0ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHBhcmFtZXRlcl87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4gcHJvdG9fZmlsZV87Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVxdWVzdCogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0NfRVhQT1JUIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpOwotICB2aXJ0dWFsIH5Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpOwotCi0gIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKTsKLQotICBpbmxpbmUgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIG9wZXJhdG9yPShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBib29sIGhhc19uYW1lKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbmFtZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOwotICBib29sIGhhc19pbnNlcnRpb25fcG9pbnQoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9pbnNlcnRpb25fcG9pbnQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSW5zZXJ0aW9uUG9pbnRGaWVsZE51bWJlciA9IDI7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCgpIGNvbnN0OwotICB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9pbnNlcnRpb25fcG9pbnQoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX2luc2VydGlvbl9wb2ludCg6OnN0ZDo6c3RyaW5nKiBpbnNlcnRpb25fcG9pbnQpOwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7Ci0gIGJvb2wgaGFzX2NvbnRlbnQoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9jb250ZW50KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NvbnRlbnRGaWVsZE51bWJlciA9IDE1OwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBjb250ZW50KCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2NvbnRlbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfY29udGVudChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2NvbnRlbnQoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9jb250ZW50KCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9jb250ZW50KDo6c3RkOjpzdHJpbmcqIGNvbnRlbnQpOwotCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19jb250ZW50KCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19jb250ZW50KCk7Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgaW5zZXJ0aW9uX3BvaW50XzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgY29udGVudF87Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0NfRVhQT1JUIENvZGVHZW5lcmF0b3JSZXNwb25zZSA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKCk7Ci0gIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3JSZXNwb25zZSgpOwotCi0gIENvZGVHZW5lcmF0b3JSZXNwb25zZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pOwotCi0gIGlubGluZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIG9wZXJhdG9yPShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgdm9pZCBTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZSogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZSogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBvdGhlcik7Ci0gIHByaXZhdGU6Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOwotICB9Ci0gIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKLSAgfQotICBwdWJsaWM6Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgdHlwZWRlZiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSBGaWxlOwotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKLSAgYm9vbCBoYXNfZXJyb3IoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9lcnJvcigpOwotICBzdGF0aWMgY29uc3QgaW50IGtFcnJvckZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgZXJyb3IoKSBjb25zdDsKLSAgdm9pZCBzZXRfZXJyb3IoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9lcnJvcihjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2Vycm9yKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXJyb3IoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9lcnJvcigpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfZXJyb3IoOjpzdGQ6OnN0cmluZyogZXJyb3IpOwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OwotICBpbnQgZmlsZV9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZmlsZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtGaWxlRmllbGROdW1iZXIgPSAxNTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZpbGUoaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIG11dGFibGVfZmlsZShpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogYWRkX2ZpbGUoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+KgotICAgICAgbXV0YWJsZV9maWxlKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiYKLSAgICAgIGZpbGUoKSBjb25zdDsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKLSBwcml2YXRlOgotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2Vycm9yKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19lcnJvcigpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZXJyb3JfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4gZmlsZV87Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZiAhUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBDb2RlR2VuZXJhdG9yUmVxdWVzdAotCi0vLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7Ci1pbmxpbmUgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpmaWxlX3RvX2dlbmVyYXRlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfZmlsZV90b19nZW5lcmF0ZSgpIHsKLSAgZmlsZV90b19nZW5lcmF0ZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKLSAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi0gIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi0gIGZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKLSAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpOwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCi1Db2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCi0gIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgotQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKLSAgcmV0dXJuICZmaWxlX3RvX2dlbmVyYXRlXzsKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7Ci1pbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6aGFzX3BhcmFtZXRlcigpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2hhc19wYXJhbWV0ZXIoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfaGFzX3BhcmFtZXRlcigpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfcGFyYW1ldGVyKCkgewotICBwYXJhbWV0ZXJfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX3BhcmFtZXRlcigpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpwYXJhbWV0ZXIoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKLSAgcmV0dXJuIHBhcmFtZXRlcl8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKLSAgcGFyYW1ldGVyXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCi19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X3BhcmFtZXRlcihjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX3BhcmFtZXRlcigpOwotICBwYXJhbWV0ZXJfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIHBhcmFtZXRlcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wYXJhbWV0ZXIoKSB7Ci0gIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCi0gIHJldHVybiBwYXJhbWV0ZXJfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnJlbGVhc2VfcGFyYW1ldGVyKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQotICBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7Ci0gIHJldHVybiBwYXJhbWV0ZXJfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X2FsbG9jYXRlZF9wYXJhbWV0ZXIoOjpzdGQ6OnN0cmluZyogcGFyYW1ldGVyKSB7Ci0gIGlmIChwYXJhbWV0ZXIgIT0gTlVMTCkgewotICAgIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX3BhcmFtZXRlcigpOwotICB9Ci0gIHBhcmFtZXRlcl8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHBhcmFtZXRlcik7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Ci1pbmxpbmUgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpwcm90b19maWxlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBwcm90b19maWxlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfcHJvdG9fZmlsZSgpIHsKLSAgcHJvdG9fZmlsZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpwcm90b19maWxlKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQotICByZXR1cm4gcHJvdG9fZmlsZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX3Byb3RvX2ZpbGUoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQotICByZXR1cm4gcHJvdG9fZmlsZV8uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX3Byb3RvX2ZpbGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCi0gIHJldHVybiBwcm90b19maWxlXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgotQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcHJvdG9fZmlsZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucHJvdG9fZmlsZSkKLSAgcmV0dXJuICZwcm90b19maWxlXzsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgotQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQotICByZXR1cm4gcHJvdG9fZmlsZV87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUKLQotLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotaW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Omhhc19uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX25hbWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKLSAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Om11dGFibGVfbmFtZSgpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6cmVsZWFzZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKLSAgY2xlYXJfaGFzX25hbWUoKTsKLSAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7Ci1pbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX2luc2VydGlvbl9wb2ludCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaW5zZXJ0aW9uX3BvaW50KCkgewotICBpbnNlcnRpb25fcG9pbnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjppbnNlcnRpb25fcG9pbnQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCkKLSAgcmV0dXJuIGluc2VydGlvbl9wb2ludF8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLSAgaW5zZXJ0aW9uX3BvaW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCi19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2luc2VydGlvbl9wb2ludChjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOwotICBpbnNlcnRpb25fcG9pbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gIGluc2VydGlvbl9wb2ludF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9pbnNlcnRpb25fcG9pbnQoKSB7Ci0gIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCi0gIHJldHVybiBpbnNlcnRpb25fcG9pbnRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfaW5zZXJ0aW9uX3BvaW50KCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQotICBjbGVhcl9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gIHJldHVybiBpbnNlcnRpb25fcG9pbnRfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2FsbG9jYXRlZF9pbnNlcnRpb25fcG9pbnQoOjpzdGQ6OnN0cmluZyogaW5zZXJ0aW9uX3BvaW50KSB7Ci0gIGlmIChpbnNlcnRpb25fcG9pbnQgIT0gTlVMTCkgewotICAgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOwotICB9Ci0gIGluc2VydGlvbl9wb2ludF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGluc2VydGlvbl9wb2ludCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7Ci1pbmxpbmUgYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX2NvbnRlbnQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9oYXNfY29udGVudCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9oYXNfY29udGVudCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfY29udGVudCgpIHsKLSAgY29udGVudF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfY29udGVudCgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjb250ZW50KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotICByZXR1cm4gY29udGVudF8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9jb250ZW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfY29udGVudCgpOwotICBjb250ZW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfY29udGVudCgpOwotICBjb250ZW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCi19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2NvbnRlbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfY29udGVudCgpOwotICBjb250ZW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9jb250ZW50KCkgewotICBzZXRfaGFzX2NvbnRlbnQoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCi0gIHJldHVybiBjb250ZW50Xy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpyZWxlYXNlX2NvbnRlbnQoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotICBjbGVhcl9oYXNfY29udGVudCgpOwotICByZXR1cm4gY29udGVudF8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX2NvbnRlbnQoOjpzdGQ6OnN0cmluZyogY29udGVudCkgewotICBpZiAoY29udGVudCAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19jb250ZW50KCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2NvbnRlbnQoKTsKLSAgfQotICBjb250ZW50Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgY29udGVudCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIENvZGVHZW5lcmF0b3JSZXNwb25zZQotCi0vLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOwotaW5saW5lIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpoYXNfZXJyb3IoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfaGFzX2Vycm9yKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpjbGVhcl9oYXNfZXJyb3IoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpjbGVhcl9lcnJvcigpIHsKLSAgZXJyb3JfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2Vycm9yKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjplcnJvcigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQotICByZXR1cm4gZXJyb3JfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2Vycm9yKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfZXJyb3IoKTsKLSAgZXJyb3JfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2Vycm9yKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfZXJyb3IoKTsKLSAgZXJyb3JfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQotfQotaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfZXJyb3IoKTsKLSAgZXJyb3JfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2Vycm9yKCkgewotICBzZXRfaGFzX2Vycm9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCi0gIHJldHVybiBlcnJvcl8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnJlbGVhc2VfZXJyb3IoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCi0gIGNsZWFyX2hhc19lcnJvcigpOwotICByZXR1cm4gZXJyb3JfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnNldF9hbGxvY2F0ZWRfZXJyb3IoOjpzdGQ6OnN0cmluZyogZXJyb3IpIHsKLSAgaWYgKGVycm9yICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2Vycm9yKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2Vycm9yKCk7Ci0gIH0KLSAgZXJyb3JfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBlcnJvcik7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUgZmlsZSA9IDE1OwotaW5saW5lIGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGZpbGVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfZmlsZSgpIHsKLSAgZmlsZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKLSAgcmV0dXJuIGZpbGVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9maWxlKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCi0gIHJldHVybiBmaWxlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjphZGRfZmlsZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCi0gIHJldHVybiBmaWxlXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4qCi1Db2RlR2VuZXJhdG9yUmVzcG9uc2U6Om11dGFibGVfZmlsZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCi0gIHJldHVybiAmZmlsZV87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+JgotQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCi0gIHJldHVybiBmaWxlXzsKLX0KLQotI2VuZGlmICAvLyAhUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQotCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90b19fSU5DTFVERUQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYWVlMWYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwxNTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vCi0vLyBXQVJOSU5HOiAgVGhlIHBsdWdpbiBpbnRlcmZhY2UgaXMgY3VycmVudGx5IEVYUEVSSU1FTlRBTCBhbmQgaXMgc3ViamVjdCB0bwotLy8gICBjaGFuZ2UuCi0vLwotLy8gcHJvdG9jIChha2EgdGhlIFByb3RvY29sIENvbXBpbGVyKSBjYW4gYmUgZXh0ZW5kZWQgdmlhIHBsdWdpbnMuICBBIHBsdWdpbiBpcwotLy8ganVzdCBhIHByb2dyYW0gdGhhdCByZWFkcyBhIENvZGVHZW5lcmF0b3JSZXF1ZXN0IGZyb20gc3RkaW4gYW5kIHdyaXRlcyBhCi0vLyBDb2RlR2VuZXJhdG9yUmVzcG9uc2UgdG8gc3Rkb3V0LgotLy8KLS8vIFBsdWdpbnMgd3JpdHRlbiB1c2luZyBDKysgY2FuIHVzZSBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmggaW5zdGVhZAotLy8gb2YgZGVhbGluZyB3aXRoIHRoZSByYXcgcHJvdG9jb2wgZGVmaW5lZCBoZXJlLgotLy8KLS8vIEEgcGx1Z2luIGV4ZWN1dGFibGUgbmVlZHMgb25seSB0byBiZSBwbGFjZWQgc29tZXdoZXJlIGluIHRoZSBwYXRoLiAgVGhlCi0vLyBwbHVnaW4gc2hvdWxkIGJlIG5hbWVkICJwcm90b2MtZ2VuLSROQU1FIiwgYW5kIHdpbGwgdGhlbiBiZSB1c2VkIHdoZW4gdGhlCi0vLyBmbGFnICItLSR7TkFNRX1fb3V0IiBpcyBwYXNzZWQgdG8gcHJvdG9jLgotCi1zeW50YXggPSAicHJvdG8yIjsKLXBhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyOwotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyIjsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJQbHVnaW5Qcm90b3MiOwotCi1vcHRpb24gZ29fcGFja2FnZSA9ICJwbHVnaW5fZ28iOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKLQotLy8gQW4gZW5jb2RlZCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBpcyB3cml0dGVuIHRvIHRoZSBwbHVnaW4ncyBzdGRpbi4KLW1lc3NhZ2UgQ29kZUdlbmVyYXRvclJlcXVlc3QgewotICAvLyBUaGUgLnByb3RvIGZpbGVzIHRoYXQgd2VyZSBleHBsaWNpdGx5IGxpc3RlZCBvbiB0aGUgY29tbWFuZC1saW5lLiAgVGhlCi0gIC8vIGNvZGUgZ2VuZXJhdG9yIHNob3VsZCBnZW5lcmF0ZSBjb2RlIG9ubHkgZm9yIHRoZXNlIGZpbGVzLiAgRWFjaCBmaWxlJ3MKLSAgLy8gZGVzY3JpcHRvciB3aWxsIGJlIGluY2x1ZGVkIGluIHByb3RvX2ZpbGUsIGJlbG93LgotICByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7Ci0KLSAgLy8gVGhlIGdlbmVyYXRvciBwYXJhbWV0ZXIgcGFzc2VkIG9uIHRoZSBjb21tYW5kLWxpbmUuCi0gIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOwotCi0gIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGZvciBhbGwgZmlsZXMgaW4gZmlsZXNfdG9fZ2VuZXJhdGUgYW5kIGV2ZXJ5dGhpbmcKLSAgLy8gdGhleSBpbXBvcnQuICBUaGUgZmlsZXMgd2lsbCBhcHBlYXIgaW4gdG9wb2xvZ2ljYWwgb3JkZXIsIHNvIGVhY2ggZmlsZQotICAvLyBhcHBlYXJzIGJlZm9yZSBhbnkgZmlsZSB0aGF0IGltcG9ydHMgaXQuCi0gIC8vCi0gIC8vIHByb3RvYyBndWFyYW50ZWVzIHRoYXQgYWxsIHByb3RvX2ZpbGVzIHdpbGwgYmUgd3JpdHRlbiBhZnRlcgotICAvLyB0aGUgZmllbGRzIGFib3ZlLCBldmVuIHRob3VnaCB0aGlzIGlzIG5vdCB0ZWNobmljYWxseSBndWFyYW50ZWVkIGJ5IHRoZQotICAvLyBwcm90b2J1ZiB3aXJlIGZvcm1hdC4gIFRoaXMgdGhlb3JldGljYWxseSBjb3VsZCBhbGxvdyBhIHBsdWdpbiB0byBzdHJlYW0KLSAgLy8gaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGFuZCBoYW5kbGUgdGhlbSBvbmUgYnkgb25lIHJhdGhlciB0aGFuIHJlYWQKLSAgLy8gdGhlIGVudGlyZSBzZXQgaW50byBtZW1vcnkgYXQgb25jZS4gIEhvd2V2ZXIsIGFzIG9mIHRoaXMgd3JpdGluZywgdGhpcwotICAvLyBpcyBub3Qgc2ltaWxhcmx5IG9wdGltaXplZCBvbiBwcm90b2MncyBlbmQgLS0gaXQgd2lsbCBzdG9yZSBhbGwgZmllbGRzIGluCi0gIC8vIG1lbW9yeSBhdCBvbmNlIGJlZm9yZSBzZW5kaW5nIHRoZW0gdG8gdGhlIHBsdWdpbi4KLSAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Ci19Ci0KLS8vIFRoZSBwbHVnaW4gd3JpdGVzIGFuIGVuY29kZWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHRvIHN0ZG91dC4KLW1lc3NhZ2UgQ29kZUdlbmVyYXRvclJlc3BvbnNlIHsKLSAgLy8gRXJyb3IgbWVzc2FnZS4gIElmIG5vbi1lbXB0eSwgY29kZSBnZW5lcmF0aW9uIGZhaWxlZC4gIFRoZSBwbHVnaW4gcHJvY2VzcwotICAvLyBzaG91bGQgZXhpdCB3aXRoIHN0YXR1cyBjb2RlIHplcm8gZXZlbiBpZiBpdCByZXBvcnRzIGFuIGVycm9yIGluIHRoaXMgd2F5LgotICAvLwotICAvLyBUaGlzIHNob3VsZCBiZSB1c2VkIHRvIGluZGljYXRlIGVycm9ycyBpbiAucHJvdG8gZmlsZXMgd2hpY2ggcHJldmVudCB0aGUKLSAgLy8gY29kZSBnZW5lcmF0b3IgZnJvbSBnZW5lcmF0aW5nIGNvcnJlY3QgY29kZS4gIEVycm9ycyB3aGljaCBpbmRpY2F0ZSBhCi0gIC8vIHByb2JsZW0gaW4gcHJvdG9jIGl0c2VsZiAtLSBzdWNoIGFzIHRoZSBpbnB1dCBDb2RlR2VuZXJhdG9yUmVxdWVzdCBiZWluZwotICAvLyB1bnBhcnNlYWJsZSAtLSBzaG91bGQgYmUgcmVwb3J0ZWQgYnkgd3JpdGluZyBhIG1lc3NhZ2UgdG8gc3RkZXJyIGFuZAotICAvLyBleGl0aW5nIHdpdGggYSBub24temVybyBzdGF0dXMgY29kZS4KLSAgb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKLQotICAvLyBSZXByZXNlbnRzIGEgc2luZ2xlIGdlbmVyYXRlZCBmaWxlLgotICBtZXNzYWdlIEZpbGUgewotICAgIC8vIFRoZSBmaWxlIG5hbWUsIHJlbGF0aXZlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiAgVGhlIG5hbWUgbXVzdCBub3QKLSAgICAvLyBjb250YWluICIuIiBvciAiLi4iIGNvbXBvbmVudHMgYW5kIG11c3QgYmUgcmVsYXRpdmUsIG5vdCBiZSBhYnNvbHV0ZSAoc28sCi0gICAgLy8gdGhlIGZpbGUgY2Fubm90IGxpZSBvdXRzaWRlIHRoZSBvdXRwdXQgZGlyZWN0b3J5KS4gICIvIiBtdXN0IGJlIHVzZWQgYXMKLSAgICAvLyB0aGUgcGF0aCBzZXBhcmF0b3IsIG5vdCAiXCIuCi0gICAgLy8KLSAgICAvLyBJZiB0aGUgbmFtZSBpcyBvbWl0dGVkLCB0aGUgY29udGVudCB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBwcmV2aW91cwotICAgIC8vIGZpbGUuICBUaGlzIGFsbG93cyB0aGUgZ2VuZXJhdG9yIHRvIGJyZWFrIGxhcmdlIGZpbGVzIGludG8gc21hbGwgY2h1bmtzLAotICAgIC8vIGFuZCBhbGxvd3MgdGhlIGdlbmVyYXRlZCB0ZXh0IHRvIGJlIHN0cmVhbWVkIGJhY2sgdG8gcHJvdG9jIHNvIHRoYXQgbGFyZ2UKLSAgICAvLyBmaWxlcyBuZWVkIG5vdCByZXNpZGUgY29tcGxldGVseSBpbiBtZW1vcnkgYXQgb25lIHRpbWUuICBOb3RlIHRoYXQgYXMgb2YKLSAgICAvLyB0aGlzIHdyaXRpbmcgcHJvdG9jIGRvZXMgbm90IG9wdGltaXplIGZvciB0aGlzIC0tIGl0IHdpbGwgcmVhZCB0aGUgZW50aXJlCi0gICAgLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlIGJlZm9yZSB3cml0aW5nIGZpbGVzIHRvIGRpc2suCi0gICAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotCi0gICAgLy8gSWYgbm9uLWVtcHR5LCBpbmRpY2F0ZXMgdGhhdCB0aGUgbmFtZWQgZmlsZSBzaG91bGQgYWxyZWFkeSBleGlzdCwgYW5kIHRoZQotICAgIC8vIGNvbnRlbnQgaGVyZSBpcyB0byBiZSBpbnNlcnRlZCBpbnRvIHRoYXQgZmlsZSBhdCBhIGRlZmluZWQgaW5zZXJ0aW9uCi0gICAgLy8gcG9pbnQuICBUaGlzIGZlYXR1cmUgYWxsb3dzIGEgY29kZSBnZW5lcmF0b3IgdG8gZXh0ZW5kIHRoZSBvdXRwdXQKLSAgICAvLyBwcm9kdWNlZCBieSBhbm90aGVyIGNvZGUgZ2VuZXJhdG9yLiAgVGhlIG9yaWdpbmFsIGdlbmVyYXRvciBtYXkgcHJvdmlkZQotICAgIC8vIGluc2VydGlvbiBwb2ludHMgYnkgcGxhY2luZyBzcGVjaWFsIGFubm90YXRpb25zIGluIHRoZSBmaWxlIHRoYXQgbG9vawotICAgIC8vIGxpa2U6Ci0gICAgLy8gICBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoTkFNRSkKLSAgICAvLyBUaGUgYW5ub3RhdGlvbiBjYW4gaGF2ZSBhcmJpdHJhcnkgdGV4dCBiZWZvcmUgYW5kIGFmdGVyIGl0IG9uIHRoZSBsaW5lLAotICAgIC8vIHdoaWNoIGFsbG93cyBpdCB0byBiZSBwbGFjZWQgaW4gYSBjb21tZW50LiAgTkFNRSBzaG91bGQgYmUgcmVwbGFjZWQgd2l0aAotICAgIC8vIGFuIGlkZW50aWZpZXIgbmFtaW5nIHRoZSBwb2ludCAtLSB0aGlzIGlzIHdoYXQgb3RoZXIgZ2VuZXJhdG9ycyB3aWxsIHVzZQotICAgIC8vIGFzIHRoZSBpbnNlcnRpb25fcG9pbnQuICBDb2RlIGluc2VydGVkIGF0IHRoaXMgcG9pbnQgd2lsbCBiZSBwbGFjZWQKLSAgICAvLyBpbW1lZGlhdGVseSBhYm92ZSB0aGUgbGluZSBjb250YWluaW5nIHRoZSBpbnNlcnRpb24gcG9pbnQgKHRodXMgbXVsdGlwbGUKLSAgICAvLyBpbnNlcnRpb25zIHRvIHRoZSBzYW1lIHBvaW50IHdpbGwgY29tZSBvdXQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBhZGRlZCkuCi0gICAgLy8gVGhlIGRvdWJsZS1AIGlzIGludGVuZGVkIHRvIG1ha2UgaXQgdW5saWtlbHkgdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUKLSAgICAvLyBjb3VsZCBjb250YWluIHRoaW5ncyB0aGF0IGxvb2sgbGlrZSBpbnNlcnRpb24gcG9pbnRzIGJ5IGFjY2lkZW50LgotICAgIC8vCi0gICAgLy8gRm9yIGV4YW1wbGUsIHRoZSBDKysgY29kZSBnZW5lcmF0b3IgcGxhY2VzIHRoZSBmb2xsb3dpbmcgbGluZSBpbiB0aGUKLSAgICAvLyAucGIuaCBmaWxlcyB0aGF0IGl0IGdlbmVyYXRlczoKLSAgICAvLyAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCi0gICAgLy8gVGhpcyBsaW5lIGFwcGVhcnMgd2l0aGluIHRoZSBzY29wZSBvZiB0aGUgZmlsZSdzIHBhY2thZ2UgbmFtZXNwYWNlLCBidXQKLSAgICAvLyBvdXRzaWRlIG9mIGFueSBwYXJ0aWN1bGFyIGNsYXNzLiAgQW5vdGhlciBwbHVnaW4gY2FuIHRoZW4gc3BlY2lmeSB0aGUKLSAgICAvLyBpbnNlcnRpb25fcG9pbnQgIm5hbWVzcGFjZV9zY29wZSIgdG8gZ2VuZXJhdGUgYWRkaXRpb25hbCBjbGFzc2VzIG9yCi0gICAgLy8gb3RoZXIgZGVjbGFyYXRpb25zIHRoYXQgc2hvdWxkIGJlIHBsYWNlZCBpbiB0aGlzIHNjb3BlLgotICAgIC8vCi0gICAgLy8gTm90ZSB0aGF0IGlmIHRoZSBsaW5lIGNvbnRhaW5pbmcgdGhlIGluc2VydGlvbiBwb2ludCBiZWdpbnMgd2l0aAotICAgIC8vIHdoaXRlc3BhY2UsIHRoZSBzYW1lIHdoaXRlc3BhY2Ugd2lsbCBiZSBhZGRlZCB0byBldmVyeSBsaW5lIG9mIHRoZQotICAgIC8vIGluc2VydGVkIHRleHQuICBUaGlzIGlzIHVzZWZ1bCBmb3IgbGFuZ3VhZ2VzIGxpa2UgUHl0aG9uLCB3aGVyZQotICAgIC8vIGluZGVudGF0aW9uIG1hdHRlcnMuICBJbiB0aGVzZSBsYW5ndWFnZXMsIHRoZSBpbnNlcnRpb24gcG9pbnQgY29tbWVudAotICAgIC8vIHNob3VsZCBiZSBpbmRlbnRlZCB0aGUgc2FtZSBhbW91bnQgYXMgYW55IGluc2VydGVkIGNvZGUgd2lsbCBuZWVkIHRvIGJlCi0gICAgLy8gaW4gb3JkZXIgdG8gd29yayBjb3JyZWN0bHkgaW4gdGhhdCBjb250ZXh0LgotICAgIC8vCi0gICAgLy8gVGhlIGNvZGUgZ2VuZXJhdG9yIHRoYXQgZ2VuZXJhdGVzIHRoZSBpbml0aWFsIGZpbGUgYW5kIHRoZSBvbmUgd2hpY2gKLSAgICAvLyBpbnNlcnRzIGludG8gaXQgbXVzdCBib3RoIHJ1biBhcyBwYXJ0IG9mIGEgc2luZ2xlIGludm9jYXRpb24gb2YgcHJvdG9jLgotICAgIC8vIENvZGUgZ2VuZXJhdG9ycyBhcmUgZXhlY3V0ZWQgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgYXBwZWFyIG9uIHRoZQotICAgIC8vIGNvbW1hbmQgbGluZS4KLSAgICAvLwotICAgIC8vIElmIHxpbnNlcnRpb25fcG9pbnR8IGlzIHByZXNlbnQsIHxuYW1lfCBtdXN0IGFsc28gYmUgcHJlc2VudC4KLSAgICBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKLQotICAgIC8vIFRoZSBmaWxlIGNvbnRlbnRzLgotICAgIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7Ci0gIH0KLSAgcmVwZWF0ZWQgRmlsZSBmaWxlID0gMTU7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDU1M2RkMC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTMzMSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8jUFkyNSBjb21wYXRpYmxlIGdlbmVyYXRlZCBjb2RlIGZvciBHQUUuCi0vLyBDb3B5cmlnaHQgMjAwNyBHb29nbGUgSW5jLiBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8gQXV0aG9yOiByb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKQotLy8KLS8vIFRoaXMgbW9kdWxlIG91dHB1dHMgcHVyZS1QeXRob24gcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIHRoYXQgd2lsbAotLy8gbGFyZ2VseSBiZSBjb25zdHJ1Y3RlZCBhdCBydW50aW1lIHZpYSB0aGUgbWV0YWNsYXNzIGluIHJlZmxlY3Rpb24ucHkuCi0vLyBJbiBvdGhlciB3b3Jkcywgb3VyIGpvYiBpcyBiYXNpY2FsbHkgdG8gb3V0cHV0IGEgUHl0aG9uIGVxdWl2YWxlbnQKLS8vIG9mIHRoZSBDKysgKkRlc2NyaXB0b3Igb2JqZWN0cywgYW5kIGZpeCB1cCBhbGwgY2lyY3VsYXIgcmVmZXJlbmNlcwotLy8gd2l0aGluIHRoZXNlIG9iamVjdHMuCi0vLwotLy8gTm90ZSB0aGF0IHRoZSBydW50aW1lIHBlcmZvcm1hbmNlIG9mIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBjcmVhdGVkIGluCi0vLyB0aGlzIHdheSBpcyBleHBlY3RlZCB0byBiZSBsb3VzeS4gIFRoZSBwbGFuIGlzIHRvIGNyZWF0ZSBhbiBhbHRlcm5hdGUKLS8vIGdlbmVyYXRvciB0aGF0IG91dHB1dHMgYSBQeXRob24vQyBleHRlbnNpb24gbW9kdWxlIHRoYXQgbGV0cwotLy8gcGVyZm9ybWFuY2UtbWluZGVkIFB5dGhvbiBjb2RlIGxldmVyYWdlIHRoZSBmYXN0IEMrKyBpbXBsZW1lbnRhdGlvbgotLy8gZGlyZWN0bHkuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIFJldHVybnMgYSBjb3B5IG9mIHxmaWxlbmFtZXwgd2l0aCBhbnkgdHJhaWxpbmcgIi5wcm90b2RldmVsIiBvciAiLnByb3RvCi0vLyBzdWZmaXggc3RyaXBwZWQuCi0vLyBUT0RPKHJvYmluc29uKTogVW5pZnkgd2l0aCBjb3B5IGluIGNvbXBpbGVyL2NwcC9pbnRlcm5hbC9oZWxwZXJzLmNjLgotc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICBjb25zdCBjaGFyKiBzdWZmaXggPSBIYXNTdWZmaXhTdHJpbmcoZmlsZW5hbWUsICIucHJvdG9kZXZlbCIpCi0gICAgICA/ICIucHJvdG9kZXZlbCIgOiAiLnByb3RvIjsKLSAgcmV0dXJuIFN0cmlwU3VmZml4U3RyaW5nKGZpbGVuYW1lLCBzdWZmaXgpOwotfQotCi0KLS8vIFJldHVybnMgdGhlIFB5dGhvbiBtb2R1bGUgbmFtZSBleHBlY3RlZCBmb3IgYSBnaXZlbiAucHJvdG8gZmlsZW5hbWUuCi1zdHJpbmcgTW9kdWxlTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7Ci0gIHN0cmluZyBiYXNlbmFtZSA9IFN0cmlwUHJvdG8oZmlsZW5hbWUpOwotICBTdHJpcFN0cmluZygmYmFzZW5hbWUsICItIiwgJ18nKTsKLSAgU3RyaXBTdHJpbmcoJmJhc2VuYW1lLCAiLyIsICcuJyk7Ci0gIHJldHVybiBiYXNlbmFtZSArICJfcGIyIjsKLX0KLQotCi0vLyBSZXR1cm5zIHRoZSBhbGlhcyB3ZSBhc3NpZ24gdG8gdGhlIG1vZHVsZSBvZiB0aGUgZ2l2ZW4gLnByb3RvIGZpbGVuYW1lCi0vLyB3aGVuIGltcG9ydGluZy4gU2VlIHRlc3RQYWNrYWdlSW5pdGlhbGl6YXRpb25JbXBvcnQgaW4KLS8vIGdvb2dsZS9wcm90b2J1Zi9weXRob24vcmVmbGVjdGlvbl90ZXN0LnB5Ci0vLyB0byBzZWUgd2h5IHdlIG5lZWQgdGhlIGFsaWFzLgotc3RyaW5nIE1vZHVsZUFsaWFzKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKLSAgc3RyaW5nIG1vZHVsZV9uYW1lID0gTW9kdWxlTmFtZShmaWxlbmFtZSk7Ci0gIC8vIFdlIGNhbid0IGhhdmUgZG90cyBpbiB0aGUgbW9kdWxlIG5hbWUsIHNvIHdlIHJlcGxhY2UgZWFjaCB3aXRoIF9kb3RfLgotICAvLyBCdXQgdGhhdCBjb3VsZCBsZWFkIHRvIGEgY29sbGlzaW9uIGJldHdlZW4gYS5iIGFuZCBhX2RvdF9iLCBzbyB3ZSBhbHNvCi0gIC8vIGR1cGxpY2F0ZSBlYWNoIHVuZGVyc2NvcmUuCi0gIEdsb2JhbFJlcGxhY2VTdWJzdHJpbmcoIl8iLCAiX18iLCAmbW9kdWxlX25hbWUpOwotICBHbG9iYWxSZXBsYWNlU3Vic3RyaW5nKCIuIiwgIl9kb3RfIiwgJm1vZHVsZV9uYW1lKTsKLSAgcmV0dXJuIG1vZHVsZV9uYW1lOwotfQotCi0KLS8vIFJldHVybnMgYW4gaW1wb3J0IHN0YXRlbWVudCBvZiBmb3JtICJmcm9tIFguWS5aIGltcG9ydCBUIiBmb3IgdGhlIGdpdmVuCi0vLyAucHJvdG8gZmlsZW5hbWUuCi1zdHJpbmcgTW9kdWxlSW1wb3J0U3RhdGVtZW50KGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKLSAgc3RyaW5nIG1vZHVsZV9uYW1lID0gTW9kdWxlTmFtZShmaWxlbmFtZSk7Ci0gIGludCBsYXN0X2RvdF9wb3MgPSBtb2R1bGVfbmFtZS5yZmluZCgnLicpOwotICBpZiAobGFzdF9kb3RfcG9zID09IHN0cmluZzo6bnBvcykgewotICAgIC8vIE5PVEUocGV0eWEpOiB0aGlzIGlzIG5vdCB0ZXN0ZWQgYXMgaXQgd291bGQgcmVxdWlyZSBhIHByb3RvY29sIGJ1ZmZlcgotICAgIC8vIG91dHNpZGUgb2YgYW55IHBhY2thZ2UsIGFuZCBJIGRvbid0IHRoaW5rIHRoYXQgaXMgZWFzaWx5IGFjaGlldmFibGUuCi0gICAgcmV0dXJuICJpbXBvcnQgIiArIG1vZHVsZV9uYW1lOwotICB9IGVsc2UgewotICAgIHJldHVybiAiZnJvbSAiICsgbW9kdWxlX25hbWUuc3Vic3RyKDAsIGxhc3RfZG90X3BvcykgKyAiIGltcG9ydCAiICsKLSAgICAgICAgbW9kdWxlX25hbWUuc3Vic3RyKGxhc3RfZG90X3BvcyArIDEpOwotICB9Ci19Ci0KLQotLy8gUmV0dXJucyB0aGUgbmFtZSBvZiBhbGwgY29udGFpbmluZyB0eXBlcyBmb3IgZGVzY3JpcHRvciwKLS8vIGluIG9yZGVyIGZyb20gb3V0ZXJtb3N0IHRvIGlubmVybW9zdCwgZm9sbG93ZWQgYnkgZGVzY3JpcHRvcidzCi0vLyBvd24gbmFtZS4gIEVhY2ggbmFtZSBpcyBzZXBhcmF0ZWQgYnkgfHNlcGFyYXRvcnwuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+Ci1zdHJpbmcgTmFtZVByZWZpeGVkV2l0aE5lc3RlZFR5cGVzKGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHNlcGFyYXRvcikgewotICBzdHJpbmcgbmFtZSA9IGRlc2NyaXB0b3IubmFtZSgpOwotICBmb3IgKGNvbnN0IERlc2NyaXB0b3IqIGN1cnJlbnQgPSBkZXNjcmlwdG9yLmNvbnRhaW5pbmdfdHlwZSgpOwotICAgICAgIGN1cnJlbnQgIT0gTlVMTDsgY3VycmVudCA9IGN1cnJlbnQtPmNvbnRhaW5pbmdfdHlwZSgpKSB7Ci0gICAgbmFtZSA9IGN1cnJlbnQtPm5hbWUoKSArIHNlcGFyYXRvciArIG5hbWU7Ci0gIH0KLSAgcmV0dXJuIG5hbWU7Ci19Ci0KLQotLy8gTmFtZSBvZiB0aGUgY2xhc3MgYXR0cmlidXRlIHdoZXJlIHdlIHN0b3JlIHRoZSBQeXRob24KLS8vIGRlc2NyaXB0b3IuRGVzY3JpcHRvciBpbnN0YW5jZSBmb3IgdGhlIGdlbmVyYXRlZCBjbGFzcy4KLS8vIE11c3Qgc3RheSBjb25zaXN0ZW50IHdpdGggdGhlIF9ERVNDUklQVE9SX0tFWSBjb25zdGFudAotLy8gaW4gcHJvdG8yL3B1YmxpYy9yZWZsZWN0aW9uLnB5LgotY29uc3QgY2hhciBrRGVzY3JpcHRvcktleVtdID0gIkRFU0NSSVBUT1IiOwotCi0KLS8vIERvZXMgdGhlIGZpbGUgaGF2ZSB0b3AtbGV2ZWwgZW51bXM/Ci1pbmxpbmUgYm9vbCBIYXNUb3BMZXZlbEVudW1zKGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlKSB7Ci0gIHJldHVybiBmaWxlLT5lbnVtX3R5cGVfY291bnQoKSA+IDA7Ci19Ci0KLQotLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGdlbmVyaWMgc2VydmljZXMgZm9yIHRoaXMgZmlsZT8KLWlubGluZSBib29sIEhhc0dlbmVyaWNTZXJ2aWNlcyhjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZSkgewotICByZXR1cm4gZmlsZS0+c2VydmljZV9jb3VudCgpID4gMCAmJgotICAgICAgICAgZmlsZS0+b3B0aW9ucygpLnB5X2dlbmVyaWNfc2VydmljZXMoKTsKLX0KLQotCi0vLyBQcmludHMgdGhlIGNvbW1vbiBib2lsZXJwbGF0ZSBuZWVkZWQgYXQgdGhlIHRvcCBvZiBldmVyeSAucHkKLS8vIGZpbGUgb3V0cHV0IGJ5IHRoaXMgZ2VuZXJhdG9yLgotdm9pZCBQcmludFRvcEJvaWxlcnBsYXRlKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBkZXNjcmlwdG9yX3Byb3RvKSB7Ci0gIC8vIFRPRE8ocm9iaW5zb24pOiBBbGxvdyBwYXJhbWV0ZXJpemF0aW9uIG9mIFB5dGhvbiB2ZXJzaW9uPwotICBwcmludGVyLT5QcmludCgKLSAgICAgICIjIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhXG4iCi0gICAgICAiIyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKLSAgICAgICJcbmltcG9ydCBzeXNcbl9iPXN5cy52ZXJzaW9uX2luZm9bMF08MyBhbmQgKGxhbWJkYSB4OngpIG9yIChsYW1iZGEgeDp4LmVuY29kZSgnbGF0aW4xJykpIiAgLy8jI1BZMjUKLSAgICAgICJcbiIsCi0gICAgICAiZmlsZW5hbWUiLCBmaWxlLT5uYW1lKCkpOwotICBpZiAoSGFzVG9wTGV2ZWxFbnVtcyhmaWxlKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGVudW1fdHlwZV93cmFwcGVyXG4iKTsKLSAgfQotICBwcmludGVyLT5QcmludCgKLSAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvciBhcyBfZGVzY3JpcHRvclxuIgotICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlIGFzIF9tZXNzYWdlXG4iCi0gICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb24gYXMgX3JlZmxlY3Rpb25cbiIKLSAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc3ltYm9sX2RhdGFiYXNlIGFzICIKLSAgICAgICJfc3ltYm9sX2RhdGFiYXNlXG4iKTsKLSAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2UgYXMgX3NlcnZpY2VcbiIKLSAgICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlX3JlZmxlY3Rpb25cbiIpOwotICB9Ci0KLSAgLy8gQXZvaWQgY2lyY3VsYXIgaW1wb3J0cyBpZiB0aGlzIG1vZHVsZSBpcyBkZXNjcmlwdG9yX3BiMi4KLSAgaWYgKCFkZXNjcmlwdG9yX3Byb3RvKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjJcbiIpOwotICB9Ci0gIHByaW50ZXItPlByaW50KAotICAgICAgIiMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGltcG9ydHMpXG5cbiIKLSAgICAgICJfc3ltX2RiID0gX3N5bWJvbF9kYXRhYmFzZS5EZWZhdWx0KClcbiIpOwotICBwcmludGVyLT5QcmludCgiXG5cbiIpOwotfQotCi0KLS8vIFJldHVybnMgYSBQeXRob24gbGl0ZXJhbCBnaXZpbmcgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIGEgZmllbGQuCi0vLyBJZiB0aGUgZmllbGQgc3BlY2lmaWVzIG5vIGV4cGxpY2l0IGRlZmF1bHQgdmFsdWUsIHdlJ2xsIHJldHVybgotLy8gdGhlIGRlZmF1bHQgZGVmYXVsdCB2YWx1ZSBmb3IgdGhlIGZpZWxkIHR5cGUgKHplcm8gZm9yIG51bWJlcnMsCi0vLyBlbXB0eSBzdHJpbmcgZm9yIHN0cmluZ3MsIGVtcHR5IGxpc3QgZm9yIHJlcGVhdGVkIGZpZWxkcywgYW5kCi0vLyBOb25lIGZvciBub24tcmVwZWF0ZWQsIGNvbXBvc2l0ZSBmaWVsZHMpLgotLy8KLS8vIFRPRE8ocm9iaW5zb24pOiBVbmlmeSB3aXRoIGNvZGUgZnJvbQotLy8gLy9jb21waWxlci9jcHAvaW50ZXJuYWwvcHJpbWl0aXZlX2ZpZWxkLmNjCi0vLyAvL2NvbXBpbGVyL2NwcC9pbnRlcm5hbC9lbnVtX2ZpZWxkLmNjCi0vLyAvL2NvbXBpbGVyL2NwcC9pbnRlcm5hbC9zdHJpbmdfZmllbGQuY2MKLXN0cmluZyBTdHJpbmdpZnlEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgewotICBpZiAoZmllbGQuaXNfcmVwZWF0ZWQoKSkgewotICAgIHJldHVybiAiW10iOwotICB9Ci0KLSAgc3dpdGNoIChmaWVsZC5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC5kZWZhdWx0X3ZhbHVlX2ludDMyKCkpOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKLSAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLmRlZmF1bHRfdmFsdWVfdWludDMyKCkpOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgotICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQuZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKLSAgICAgIGRvdWJsZSB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRfdmFsdWVfZG91YmxlKCk7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgewotICAgICAgICAvLyBQeXRob24gcHJlLTIuNiBvbiBXaW5kb3dzIGRvZXMgbm90IHBhcnNlICJpbmYiIGNvcnJlY3RseS4gIEhvd2V2ZXIsCi0gICAgICAgIC8vIGEgbnVtZXJpYyBsaXRlcmFsIHRoYXQgaXMgdG9vIGJpZyBmb3IgYSBkb3VibGUgd2lsbCBiZWNvbWUgaW5maW5pdHkuCi0gICAgICAgIHJldHVybiAiMWUxMDAwMCI7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgICAgIC8vIFNlZSBhYm92ZS4KLSAgICAgICAgcmV0dXJuICItMWUxMDAwMCI7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7Ci0gICAgICAgIC8vIGluZmluaXR5ICogMCA9IG5hbgotICAgICAgICByZXR1cm4gIigxZTEwMDAwICogMCkiOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuICJmbG9hdCgiICsgU2ltcGxlRHRvYSh2YWx1ZSkgKyAiKSI7Ci0gICAgICB9Ci0gICAgfQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBmbG9hdCB2YWx1ZSA9IGZpZWxkLmRlZmF1bHRfdmFsdWVfZmxvYXQoKTsKLSAgICAgIGlmICh2YWx1ZSA9PSBudW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCkpIHsKLSAgICAgICAgLy8gUHl0aG9uIHByZS0yLjYgb24gV2luZG93cyBkb2VzIG5vdCBwYXJzZSAiaW5mIiBjb3JyZWN0bHkuICBIb3dldmVyLAotICAgICAgICAvLyBhIG51bWVyaWMgbGl0ZXJhbCB0aGF0IGlzIHRvbyBiaWcgZm9yIGEgZG91YmxlIHdpbGwgYmVjb21lIGluZmluaXR5LgotICAgICAgICByZXR1cm4gIjFlMTAwMDAiOwotICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpKSB7Ci0gICAgICAgIC8vIFNlZSBhYm92ZS4KLSAgICAgICAgcmV0dXJuICItMWUxMDAwMCI7Ci0gICAgICB9IGVsc2UgaWYgKHZhbHVlICE9IHZhbHVlKSB7Ci0gICAgICAgIC8vIGluZmluaXR5IC0gaW5maW5pdHkgPSBuYW4KLSAgICAgICAgcmV0dXJuICIoMWUxMDAwMCAqIDApIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAiZmxvYXQoIiArIFNpbXBsZUZ0b2EodmFsdWUpICsgIikiOwotICAgICAgfQotICAgIH0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgotICAgICAgcmV0dXJuIGZpZWxkLmRlZmF1bHRfdmFsdWVfYm9vbCgpID8gIlRydWUiIDogIkZhbHNlIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQuZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpKTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0vLyMjIVBZMjUgICAgICByZXR1cm4gImJcIiIgKyBDRXNjYXBlKGZpZWxkLmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpICsKLS8vIyMhUFkyNSAgICAgICAgICAgICAoZmllbGQudHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgPyAiXCIiIDoKLS8vIyMhUFkyNSAgICAgICAgICAgICAgICJcIi5kZWNvZGUoJ3V0Zi04JykiKTsKLSAgICAgIHJldHVybiAiX2IoXCIiICsgQ0VzY2FwZShmaWVsZC5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArICAvLyMjUFkyNQotICAgICAgICAgICAgIChmaWVsZC50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyA/ICJcIikiIDogIC8vIyNQWTI1Ci0gICAgICAgICAgICAgICAiXCIpLmRlY29kZSgndXRmLTgnKSIpOyAgLy8jI1BZMjUKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuICJOb25lIjsKLSAgfQotICAvLyAoV2UgY291bGQgYWRkIGEgZGVmYXVsdCBjYXNlIGFib3ZlIGJ1dCB0aGVuIHdlIHdvdWxkbid0IGdldCB0aGUgbmljZQotICAvLyBjb21waWxlciB3YXJuaW5nIHdoZW4gYSBuZXcgdHlwZSBpcyBhZGRlZC4pCi0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgcmVhY2hlZC4iOwotICByZXR1cm4gIiI7Ci19Ci0KLXN0cmluZyBTdHJpbmdpZnlTeW50YXgoRmlsZURlc2NyaXB0b3I6OlN5bnRheCBzeW50YXgpIHsKLSAgc3dpdGNoIChzeW50YXgpIHsKLSAgICBjYXNlIEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yOgotICAgICAgcmV0dXJuICJwcm90bzIiOwotICAgIGNhc2UgRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM6Ci0gICAgICByZXR1cm4gInByb3RvMyI7Ci0gICAgY2FzZSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1VOS05PV046Ci0gICAgZGVmYXVsdDoKLSAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbnN1cHBvcnRlZCBzeW50YXg7IHRoaXMgZ2VuZXJhdG9yIG9ubHkgc3VwcG9ydHMgcHJvdG8yICIKLSAgICAgICAgICAgICAgICAgICAgImFuZCBwcm90bzMgc3ludGF4LiI7Ci0gICAgICByZXR1cm4gIiI7Ci0gIH0KLX0KLQotCi19ICAvLyBuYW1lc3BhY2UKLQotCi1HZW5lcmF0b3I6OkdlbmVyYXRvcigpIDogZmlsZV8oTlVMTCkgewotfQotCi1HZW5lcmF0b3I6On5HZW5lcmF0b3IoKSB7Ci19Ci0KLWJvb2wgR2VuZXJhdG9yOjpHZW5lcmF0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZXJyb3IpIGNvbnN0IHsKLQotICAvLyBDb21wbGV0ZWx5IHNlcmlhbGl6ZSBhbGwgR2VuZXJhdGUoKSBjYWxscyBvbiB0aGlzIGluc3RhbmNlLiAgVGhlCi0gIC8vIHRocmVhZC1zYWZldHkgY29uc3RyYWludHMgb2YgdGhlIENvZGVHZW5lcmF0b3IgaW50ZXJmYWNlIGFyZW4ndCBjbGVhciBzbwotICAvLyBqdXN0IGJlIGFzIGNvbnNlcnZhdGl2ZSBhcyBwb3NzaWJsZS4gIEl0J3MgZWFzaWVyIHRvIHJlbGF4IHRoaXMgbGF0ZXIgaWYKLSAgLy8gd2UgbmVlZCB0bywgYnV0IEkgZG91YnQgaXQgd2lsbCBiZSBhbiBpc3N1ZS4KLSAgLy8gVE9ETyhrZW50b24pOiAgVGhlIHByb3BlciB0aGluZyB0byBkbyB3b3VsZCBiZSB0byBhbGxvY2F0ZSBhbnkgc3RhdGUgb24KLSAgLy8gICB0aGUgc3RhY2sgYW5kIHVzZSB0aGF0LCBzbyB0aGF0IHRoZSBHZW5lcmF0b3IgY2xhc3MgaXRzZWxmIGRvZXMgbm90IG5lZWQKLSAgLy8gICB0byBoYXZlIGFueSBtdXRhYmxlIG1lbWJlcnMuICBUaGVuIGl0IGlzIGltcGxpY2l0bHkgdGhyZWFkLXNhZmUuCi0gIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICBmaWxlXyA9IGZpbGU7Ci0gIHN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZS0+bmFtZSgpKTsKLSAgc3RyaW5nIGZpbGVuYW1lID0gbW9kdWxlX25hbWU7Ci0gIFN0cmlwU3RyaW5nKCZmaWxlbmFtZSwgIi4iLCAnLycpOwotICBmaWxlbmFtZSArPSAiLnB5IjsKLQotICBGaWxlRGVzY3JpcHRvclByb3RvIGZkcDsKLSAgZmlsZV8tPkNvcHlUbygmZmRwKTsKLSAgZmRwLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8pOwotCi0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChjb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7Ci0gIEdPT0dMRV9DSEVDSyhvdXRwdXQuZ2V0KCkpOwotICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKLSAgcHJpbnRlcl8gPSAmcHJpbnRlcjsKLQotICBQcmludFRvcEJvaWxlcnBsYXRlKHByaW50ZXJfLCBmaWxlXywgR2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpKTsKLSAgUHJpbnRJbXBvcnRzKCk7Ci0gIFByaW50RmlsZURlc2NyaXB0b3IoKTsKLSAgUHJpbnRUb3BMZXZlbEVudW1zKCk7Ci0gIFByaW50VG9wTGV2ZWxFeHRlbnNpb25zKCk7Ci0gIFByaW50QWxsTmVzdGVkRW51bXNJbkZpbGUoKTsKLSAgUHJpbnRNZXNzYWdlRGVzY3JpcHRvcnMoKTsKLSAgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcnMoKTsKLSAgUHJpbnRNZXNzYWdlcygpOwotICAvLyBXZSBoYXZlIHRvIGZpeCB1cCB0aGUgZXh0ZW5zaW9ucyBhZnRlciB0aGUgbWVzc2FnZSBjbGFzc2VzIHRoZW1zZWx2ZXMsCi0gIC8vIHNpbmNlIHRoZXkgbmVlZCB0byBjYWxsIHN0YXRpYyBSZWdpc3RlckV4dGVuc2lvbigpIG1ldGhvZHMgb24gdGhlc2UKLSAgLy8gY2xhc3Nlcy4KLSAgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9ucygpOwotICAvLyBEZXNjcmlwdG9yIG9wdGlvbnMgbWF5IGhhdmUgY3VzdG9tIGV4dGVuc2lvbnMuIFRoZXNlIGN1c3RvbSBvcHRpb25zCi0gIC8vIGNhbiBvbmx5IGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYWZ0ZXIgd2UgcmVnaXN0ZXIgY29ycmVzcG9uZGluZwotICAvLyBleHRlbnNpb25zLiBUaGVyZWZvcmUgd2UgcGFyc2UgYWxsIG9wdGlvbnMgYWdhaW4gaGVyZSB0byByZWNvZ25pemUKLSAgLy8gY3VzdG9tIG9wdGlvbnMgdGhhdCBtYXkgYmUgdW5rbm93biB3aGVuIHdlIGRlZmluZSB0aGUgZGVzY3JpcHRvcnMuCi0gIEZpeEFsbERlc2NyaXB0b3JPcHRpb25zKCk7Ci0gIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZSkpIHsKLSAgICBQcmludFNlcnZpY2VzKCk7Ci0gIH0KLQotICBwcmludGVyLlByaW50KAotICAgICIjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtb2R1bGVfc2NvcGUpXG4iKTsKLQotICByZXR1cm4gIXByaW50ZXIuZmFpbGVkKCk7Ci19Ci0KLS8vIFByaW50cyBQeXRob24gaW1wb3J0cyBmb3IgYWxsIG1vZHVsZXMgaW1wb3J0ZWQgYnkgfGZpbGV8Lgotdm9pZCBHZW5lcmF0b3I6OlByaW50SW1wb3J0cygpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lID0gZmlsZV8tPmRlcGVuZGVuY3koaSktPm5hbWUoKTsKLSAgICBzdHJpbmcgaW1wb3J0X3N0YXRlbWVudCA9IE1vZHVsZUltcG9ydFN0YXRlbWVudChmaWxlbmFtZSk7Ci0gICAgc3RyaW5nIG1vZHVsZV9hbGlhcyA9IE1vZHVsZUFsaWFzKGZpbGVuYW1lKTsKLSAgICBwcmludGVyXy0+UHJpbnQoIiRzdGF0ZW1lbnQkIGFzICRhbGlhcyRcbiIsICJzdGF0ZW1lbnQiLAotICAgICAgICAgICAgICAgICAgICBpbXBvcnRfc3RhdGVtZW50LCAiYWxpYXMiLCBtb2R1bGVfYWxpYXMpOwotICAgIENvcHlQdWJsaWNEZXBlbmRlbmNpZXNBbGlhc2VzKG1vZHVsZV9hbGlhcywgZmlsZV8tPmRlcGVuZGVuY3koaSkpOwotICB9Ci0gIHByaW50ZXJfLT5QcmludCgiXG4iKTsKLQotICAvLyBQcmludCBwdWJsaWMgaW1wb3J0cy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgKytpKSB7Ci0gICAgc3RyaW5nIG1vZHVsZV9uYW1lID0gTW9kdWxlTmFtZShmaWxlXy0+cHVibGljX2RlcGVuZGVuY3koaSktPm5hbWUoKSk7Ci0gICAgcHJpbnRlcl8tPlByaW50KCJmcm9tICRtb2R1bGUkIGltcG9ydCAqXG4iLCAibW9kdWxlIiwgbW9kdWxlX25hbWUpOwotICB9Ci0gIHByaW50ZXJfLT5QcmludCgiXG4iKTsKLX0KLQotLy8gUHJpbnRzIHRoZSBzaW5nbGUgZmlsZSBkZXNjcmlwdG9yIGZvciB0aGlzIGZpbGUuCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWxlRGVzY3JpcHRvcigpIGNvbnN0IHsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiBtOwotICBtWyJkZXNjcmlwdG9yX25hbWUiXSA9IGtEZXNjcmlwdG9yS2V5OwotICBtWyJuYW1lIl0gPSBmaWxlXy0+bmFtZSgpOwotICBtWyJwYWNrYWdlIl0gPSBmaWxlXy0+cGFja2FnZSgpOwotICBtWyJzeW50YXgiXSA9IFN0cmluZ2lmeVN5bnRheChmaWxlXy0+c3ludGF4KCkpOwotICBjb25zdCBjaGFyIGZpbGVfZGVzY3JpcHRvcl90ZW1wbGF0ZVtdID0KLSAgICAgICIkZGVzY3JpcHRvcl9uYW1lJCA9IF9kZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKFxuIgotICAgICAgIiAgbmFtZT0nJG5hbWUkJyxcbiIKLSAgICAgICIgIHBhY2thZ2U9JyRwYWNrYWdlJCcsXG4iCi0gICAgICAiICBzeW50YXg9JyRzeW50YXgkJyxcbiI7Ci0gIHByaW50ZXJfLT5QcmludChtLCBmaWxlX2Rlc2NyaXB0b3JfdGVtcGxhdGUpOwotICBwcmludGVyXy0+SW5kZW50KCk7Ci0gIHByaW50ZXJfLT5QcmludCgKLS8vIyMhUFkyNSAgICAgICJzZXJpYWxpemVkX3BiPWInJHZhbHVlJCdcbiIsCi0gICAgICAic2VyaWFsaXplZF9wYj1fYignJHZhbHVlJCcpXG4iLCAgLy8jI1BZMjUKLSAgICAgICJ2YWx1ZSIsIHN0cmluZ3M6OkNIZXhFc2NhcGUoZmlsZV9kZXNjcmlwdG9yX3NlcmlhbGl6ZWRfKSk7Ci0gIGlmIChmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpICE9IDApIHsKLSAgICBwcmludGVyXy0+UHJpbnQoIixcbmRlcGVuZGVuY2llcz1bIik7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyArK2kpIHsKLSAgICAgIHN0cmluZyBtb2R1bGVfYWxpYXMgPSBNb2R1bGVBbGlhcyhmaWxlXy0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKLSAgICAgIHByaW50ZXJfLT5QcmludCgiJG1vZHVsZV9hbGlhcyQuREVTQ1JJUFRPUiwiLCAibW9kdWxlX2FsaWFzIiwKLSAgICAgICAgICAgICAgICAgICAgICBtb2R1bGVfYWxpYXMpOwotICAgIH0KLSAgICBwcmludGVyXy0+UHJpbnQoIl0iKTsKLSAgfQotCi0gIC8vIFRPRE8oZmFsayk6IEFsc28gcHJpbnQgb3B0aW9ucyBhbmQgZml4IHRoZSBtZXNzYWdlX3R5cGUsIGVudW1fdHlwZSwKLSAgLy8gICAgICAgICAgICAgc2VydmljZSBhbmQgZXh0ZW5zaW9uIGxhdGVyIGluIHRoZSBnZW5lcmF0aW9uLgotCi0gIHByaW50ZXJfLT5PdXRkZW50KCk7Ci0gIHByaW50ZXJfLT5QcmludCgiKVxuIik7Ci0gIHByaW50ZXJfLT5QcmludCgiX3N5bV9kYi5SZWdpc3RlckZpbGVEZXNjcmlwdG9yKCRuYW1lJClcbiIsICJuYW1lIiwKLSAgICAgICAgICAgICAgICAgIGtEZXNjcmlwdG9yS2V5KTsKLSAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotfQotCi0vLyBQcmludHMgZGVzY3JpcHRvcnMgYW5kIG1vZHVsZS1sZXZlbCBjb25zdGFudHMgZm9yIGFsbCB0b3AtbGV2ZWwKLS8vIGVudW1zIGRlZmluZWQgaW4gfGZpbGV8Lgotdm9pZCBHZW5lcmF0b3I6OlByaW50VG9wTGV2ZWxFbnVtcygpIGNvbnN0IHsKLSAgdmVjdG9yPHBhaXI8c3RyaW5nLCBpbnQ+ID4gdG9wX2xldmVsX2VudW1fdmFsdWVzOwotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpmaWxlXy0+ZW51bV90eXBlKGkpOwotICAgIFByaW50RW51bShlbnVtX2Rlc2NyaXB0b3IpOwotICAgIHByaW50ZXJfLT5QcmludCgiJG5hbWUkID0gIgotICAgICAgICAgICAgICAgICAgICAiZW51bV90eXBlX3dyYXBwZXIuRW51bVR5cGVXcmFwcGVyKCRkZXNjcmlwdG9yX25hbWUkKSIsCi0gICAgICAgICAgICAgICAgICAgICJuYW1lIiwgZW51bV9kZXNjcmlwdG9yLm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JfbmFtZSIsCi0gICAgICAgICAgICAgICAgICAgIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZW51bV9kZXNjcmlwdG9yKSk7Ci0gICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotCi0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBlbnVtX2Rlc2NyaXB0b3IudmFsdWVfY291bnQoKTsgKytqKSB7Ci0gICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yJiB2YWx1ZV9kZXNjcmlwdG9yID0gKmVudW1fZGVzY3JpcHRvci52YWx1ZShqKTsKLSAgICAgIHRvcF9sZXZlbF9lbnVtX3ZhbHVlcy5wdXNoX2JhY2soCi0gICAgICAgICAgc3RkOjptYWtlX3BhaXIodmFsdWVfZGVzY3JpcHRvci5uYW1lKCksIHZhbHVlX2Rlc2NyaXB0b3IubnVtYmVyKCkpKTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IHRvcF9sZXZlbF9lbnVtX3ZhbHVlcy5zaXplKCk7ICsraSkgewotICAgIHByaW50ZXJfLT5QcmludCgiJG5hbWUkID0gJHZhbHVlJFxuIiwKLSAgICAgICAgICAgICAgICAgICAgIm5hbWUiLCB0b3BfbGV2ZWxfZW51bV92YWx1ZXNbaV0uZmlyc3QsCi0gICAgICAgICAgICAgICAgICAgICJ2YWx1ZSIsIFNpbXBsZUl0b2EodG9wX2xldmVsX2VudW1fdmFsdWVzW2ldLnNlY29uZCkpOwotICB9Ci0gIHByaW50ZXJfLT5QcmludCgiXG4iKTsKLX0KLQotLy8gUHJpbnRzIGFsbCBlbnVtcyBjb250YWluZWQgaW4gYWxsIG1lc3NhZ2UgdHlwZXMgaW4gfGZpbGV8Lgotdm9pZCBHZW5lcmF0b3I6OlByaW50QWxsTmVzdGVkRW51bXNJbkZpbGUoKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBQcmludE5lc3RlZEVudW1zKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpKTsKLSAgfQotfQotCi0vLyBQcmludHMgYSBQeXRob24gc3RhdGVtZW50IGFzc2lnbmluZyB0aGUgYXBwcm9wcmlhdGUgbW9kdWxlLWxldmVsCi0vLyBlbnVtIG5hbWUgdG8gYSBQeXRob24gRW51bURlc2NyaXB0b3Igb2JqZWN0IGVxdWl2YWxlbnQgdG8KLS8vIGVudW1fZGVzY3JpcHRvci4KLXZvaWQgR2VuZXJhdG9yOjpQcmludEVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvcikgY29uc3QgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07Ci0gIHN0cmluZyBtb2R1bGVfbGV2ZWxfZGVzY3JpcHRvcl9uYW1lID0KLSAgICAgIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZW51bV9kZXNjcmlwdG9yKTsKLSAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBtb2R1bGVfbGV2ZWxfZGVzY3JpcHRvcl9uYW1lOwotICBtWyJuYW1lIl0gPSBlbnVtX2Rlc2NyaXB0b3IubmFtZSgpOwotICBtWyJmdWxsX25hbWUiXSA9IGVudW1fZGVzY3JpcHRvci5mdWxsX25hbWUoKTsKLSAgbVsiZmlsZSJdID0ga0Rlc2NyaXB0b3JLZXk7Ci0gIGNvbnN0IGNoYXIgZW51bV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQotICAgICAgIiRkZXNjcmlwdG9yX25hbWUkID0gX2Rlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoXG4iCi0gICAgICAiICBuYW1lPSckbmFtZSQnLFxuIgotICAgICAgIiAgZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCi0gICAgICAiICBmaWxlbmFtZT1Ob25lLFxuIgotICAgICAgIiAgZmlsZT0kZmlsZSQsXG4iCi0gICAgICAiICB2YWx1ZXM9W1xuIjsKLSAgc3RyaW5nIG9wdGlvbnNfc3RyaW5nOwotICBlbnVtX2Rlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7Ci0gIHByaW50ZXJfLT5QcmludChtLCBlbnVtX2Rlc2NyaXB0b3JfdGVtcGxhdGUpOwotICBwcmludGVyXy0+SW5kZW50KCk7Ci0gIHByaW50ZXJfLT5JbmRlbnQoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX2Rlc2NyaXB0b3IudmFsdWVfY291bnQoKTsgKytpKSB7Ci0gICAgUHJpbnRFbnVtVmFsdWVEZXNjcmlwdG9yKCplbnVtX2Rlc2NyaXB0b3IudmFsdWUoaSkpOwotICAgIHByaW50ZXJfLT5QcmludCgiLFxuIik7Ci0gIH0KLSAgcHJpbnRlcl8tPk91dGRlbnQoKTsKLSAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7Ci0gIHByaW50ZXJfLT5QcmludCgiY29udGFpbmluZ190eXBlPU5vbmUsXG4iKTsKLSAgcHJpbnRlcl8tPlByaW50KCJvcHRpb25zPSRvcHRpb25zX3ZhbHVlJCxcbiIsCi0gICAgICAgICAgICAgICAgICAib3B0aW9uc192YWx1ZSIsCi0gICAgICAgICAgICAgICAgICBPcHRpb25zVmFsdWUoIkVudW1PcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpKTsKLSAgRW51bURlc2NyaXB0b3JQcm90byBlZHA7Ci0gIFByaW50U2VyaWFsaXplZFBiSW50ZXJ2YWwoZW51bV9kZXNjcmlwdG9yLCBlZHApOwotICBwcmludGVyXy0+T3V0ZGVudCgpOwotICBwcmludGVyXy0+UHJpbnQoIilcbiIpOwotICBwcmludGVyXy0+UHJpbnQoIl9zeW1fZGIuUmVnaXN0ZXJFbnVtRGVzY3JpcHRvcigkbmFtZSQpXG4iLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICBtb2R1bGVfbGV2ZWxfZGVzY3JpcHRvcl9uYW1lKTsKLSAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotfQotCi0vLyBSZWN1cnNpdmVseSBwcmludHMgZW51bXMgaW4gbmVzdGVkIHR5cGVzIHdpdGhpbiBkZXNjcmlwdG9yLCB0aGVuCi0vLyBwcmludHMgZW51bXMgY29udGFpbmVkIGF0IHRoZSB0b3AgbGV2ZWwgaW4gZGVzY3JpcHRvci4KLXZvaWQgR2VuZXJhdG9yOjpQcmludE5lc3RlZEVudW1zKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgewotICAgIFByaW50TmVzdGVkRW51bXMoKmRlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSkpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBQcmludEVudW0oKmRlc2NyaXB0b3IuZW51bV90eXBlKGkpKTsKLSAgfQotfQotCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRUb3BMZXZlbEV4dGVuc2lvbnMoKSBjb25zdCB7Ci0gIGNvbnN0IGJvb2wgaXNfZXh0ZW5zaW9uID0gdHJ1ZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZXh0ZW5zaW9uX2ZpZWxkID0gKmZpbGVfLT5leHRlbnNpb24oaSk7Ci0gICAgc3RyaW5nIGNvbnN0YW50X25hbWUgPSBleHRlbnNpb25fZmllbGQubmFtZSgpICsgIl9GSUVMRF9OVU1CRVIiOwotICAgIFVwcGVyU3RyaW5nKCZjb25zdGFudF9uYW1lKTsKLSAgICBwcmludGVyXy0+UHJpbnQoIiRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkXG4iLAotICAgICAgImNvbnN0YW50X25hbWUiLCBjb25zdGFudF9uYW1lLAotICAgICAgIm51bWJlciIsIFNpbXBsZUl0b2EoZXh0ZW5zaW9uX2ZpZWxkLm51bWJlcigpKSk7Ci0gICAgcHJpbnRlcl8tPlByaW50KCIkbmFtZSQgPSAiLCAibmFtZSIsIGV4dGVuc2lvbl9maWVsZC5uYW1lKCkpOwotICAgIFByaW50RmllbGREZXNjcmlwdG9yKGV4dGVuc2lvbl9maWVsZCwgaXNfZXh0ZW5zaW9uKTsKLSAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7Ci0gIH0KLSAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotfQotCi0vLyBQcmludHMgUHl0aG9uIGVxdWl2YWxlbnRzIG9mIGFsbCBEZXNjcmlwdG9ycyBpbiB8ZmlsZXwuCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRNZXNzYWdlRGVzY3JpcHRvcnMoKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBQcmludERlc2NyaXB0b3IoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOwotICAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKLSAgfQotfQotCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRTZXJ2aWNlcygpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyArK2kpIHsKLSAgICBQcmludFNlcnZpY2VEZXNjcmlwdG9yKCpmaWxlXy0+c2VydmljZShpKSk7Ci0gICAgUHJpbnRTZXJ2aWNlQ2xhc3MoKmZpbGVfLT5zZXJ2aWNlKGkpKTsKLSAgICBQcmludFNlcnZpY2VTdHViKCpmaWxlXy0+c2VydmljZShpKSk7Ci0gICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotICB9Ci19Ci0KLXZvaWQgR2VuZXJhdG9yOjpQcmludFNlcnZpY2VEZXNjcmlwdG9yKAotICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIHByaW50ZXJfLT5QcmludCgiXG4iKTsKLSAgc3RyaW5nIHNlcnZpY2VfbmFtZSA9IE1vZHVsZUxldmVsU2VydmljZURlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOwotICBzdHJpbmcgb3B0aW9uc19zdHJpbmc7Ci0gIGRlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7Ci0KLSAgcHJpbnRlcl8tPlByaW50KAotICAgICAgIiRzZXJ2aWNlX25hbWUkID0gX2Rlc2NyaXB0b3IuU2VydmljZURlc2NyaXB0b3IoXG4iLAotICAgICAgInNlcnZpY2VfbmFtZSIsIHNlcnZpY2VfbmFtZSk7Ci0gIHByaW50ZXJfLT5JbmRlbnQoKTsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiBtOwotICBtWyJuYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKLSAgbVsiZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yLmZ1bGxfbmFtZSgpOwotICBtWyJmaWxlIl0gPSBrRGVzY3JpcHRvcktleTsKLSAgbVsiaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci5pbmRleCgpKTsKLSAgbVsib3B0aW9uc192YWx1ZSJdID0gT3B0aW9uc1ZhbHVlKCJTZXJ2aWNlT3B0aW9ucyIsIG9wdGlvbnNfc3RyaW5nKTsKLSAgY29uc3QgY2hhciByZXF1aXJlZF9mdW5jdGlvbl9hcmd1bWVudHNbXSA9Ci0gICAgICAibmFtZT0nJG5hbWUkJyxcbiIKLSAgICAgICJmdWxsX25hbWU9JyRmdWxsX25hbWUkJyxcbiIKLSAgICAgICJmaWxlPSRmaWxlJCxcbiIKLSAgICAgICJpbmRleD0kaW5kZXgkLFxuIgotICAgICAgIm9wdGlvbnM9JG9wdGlvbnNfdmFsdWUkLFxuIjsKLSAgcHJpbnRlcl8tPlByaW50KG0sIHJlcXVpcmVkX2Z1bmN0aW9uX2FyZ3VtZW50cyk7Ci0KLSAgU2VydmljZURlc2NyaXB0b3JQcm90byBzZHA7Ci0gIFByaW50U2VyaWFsaXplZFBiSW50ZXJ2YWwoZGVzY3JpcHRvciwgc2RwKTsKLQotICBwcmludGVyXy0+UHJpbnQoIm1ldGhvZHM9W1xuIik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5tZXRob2RfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gZGVzY3JpcHRvci5tZXRob2QoaSk7Ci0gICAgbWV0aG9kLT5vcHRpb25zKCkuU2VyaWFsaXplVG9TdHJpbmcoJm9wdGlvbnNfc3RyaW5nKTsKLQotICAgIG0uY2xlYXIoKTsKLSAgICBtWyJuYW1lIl0gPSBtZXRob2QtPm5hbWUoKTsKLSAgICBtWyJmdWxsX25hbWUiXSA9IG1ldGhvZC0+ZnVsbF9uYW1lKCk7Ci0gICAgbVsiaW5kZXgiXSA9IFNpbXBsZUl0b2EobWV0aG9kLT5pbmRleCgpKTsKLSAgICBtWyJzZXJpYWxpemVkX29wdGlvbnMiXSA9IENFc2NhcGUob3B0aW9uc19zdHJpbmcpOwotICAgIG1bImlucHV0X3R5cGUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKihtZXRob2QtPmlucHV0X3R5cGUoKSkpOwotICAgIG1bIm91dHB1dF90eXBlIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKCoobWV0aG9kLT5vdXRwdXRfdHlwZSgpKSk7Ci0gICAgbVsib3B0aW9uc192YWx1ZSJdID0gT3B0aW9uc1ZhbHVlKCJNZXRob2RPcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpOwotICAgIHByaW50ZXJfLT5QcmludCgiX2Rlc2NyaXB0b3IuTWV0aG9kRGVzY3JpcHRvcihcbiIpOwotICAgIHByaW50ZXJfLT5JbmRlbnQoKTsKLSAgICBwcmludGVyXy0+UHJpbnQoCi0gICAgICAgIG0sCi0gICAgICAgICJuYW1lPSckbmFtZSQnLFxuIgotICAgICAgICAiZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCi0gICAgICAgICJpbmRleD0kaW5kZXgkLFxuIgotICAgICAgICAiY29udGFpbmluZ19zZXJ2aWNlPU5vbmUsXG4iCi0gICAgICAgICJpbnB1dF90eXBlPSRpbnB1dF90eXBlJCxcbiIKLSAgICAgICAgIm91dHB1dF90eXBlPSRvdXRwdXRfdHlwZSQsXG4iCi0gICAgICAgICJvcHRpb25zPSRvcHRpb25zX3ZhbHVlJCxcbiIpOwotICAgIHByaW50ZXJfLT5PdXRkZW50KCk7Ci0gICAgcHJpbnRlcl8tPlByaW50KCIpLFxuIik7Ci0gIH0KLQotICBwcmludGVyXy0+T3V0ZGVudCgpOwotICBwcmludGVyXy0+UHJpbnQoIl0pXG5cbiIpOwotfQotCi0KLXZvaWQgR2VuZXJhdG9yOjpQcmludERlc2NyaXB0b3JLZXlBbmRNb2R1bGVOYW1lKAotICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIHByaW50ZXJfLT5QcmludCgKLSAgICAgICIkZGVzY3JpcHRvcl9rZXkkID0gJGRlc2NyaXB0b3JfbmFtZSQsXG4iLAotICAgICAgImRlc2NyaXB0b3Jfa2V5Iiwga0Rlc2NyaXB0b3JLZXksCi0gICAgICAiZGVzY3JpcHRvcl9uYW1lIiwgTW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcikpOwotICBwcmludGVyXy0+UHJpbnQoCi0gICAgICAiX19tb2R1bGVfXyA9ICckbW9kdWxlX25hbWUkJ1xuIiwKLSAgICAgICJtb2R1bGVfbmFtZSIsIE1vZHVsZU5hbWUoZmlsZV8tPm5hbWUoKSkpOwotfQotCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRTZXJ2aWNlQ2xhc3MoY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKLSAgLy8gUHJpbnQgdGhlIHNlcnZpY2UuCi0gIHByaW50ZXJfLT5QcmludCgiJGNsYXNzX25hbWUkID0gc2VydmljZV9yZWZsZWN0aW9uLkdlbmVyYXRlZFNlcnZpY2VUeXBlKCIKLSAgICAgICAgICAgICAgICAgICInJGNsYXNzX25hbWUkJywgKF9zZXJ2aWNlLlNlcnZpY2UsKSwgZGljdChcbiIsCi0gICAgICAgICAgICAgICAgICAiY2xhc3NfbmFtZSIsIGRlc2NyaXB0b3IubmFtZSgpKTsKLSAgcHJpbnRlcl8tPkluZGVudCgpOwotICBHZW5lcmF0b3I6OlByaW50RGVzY3JpcHRvcktleUFuZE1vZHVsZU5hbWUoZGVzY3JpcHRvcik7Ci0gIHByaW50ZXJfLT5QcmludCgiKSlcblxuIik7Ci0gIHByaW50ZXJfLT5PdXRkZW50KCk7Ci19Ci0KLXZvaWQgR2VuZXJhdG9yOjpQcmludFNlcnZpY2VTdHViKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIC8vIFByaW50IHRoZSBzZXJ2aWNlIHN0dWIuCi0gIHByaW50ZXJfLT5QcmludCgiJGNsYXNzX25hbWUkX1N0dWIgPSAiCi0gICAgICAgICAgICAgICAgICAic2VydmljZV9yZWZsZWN0aW9uLkdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZSgiCi0gICAgICAgICAgICAgICAgICAiJyRjbGFzc19uYW1lJF9TdHViJywgKCRjbGFzc19uYW1lJCwpLCBkaWN0KFxuIiwKLSAgICAgICAgICAgICAgICAgICJjbGFzc19uYW1lIiwgZGVzY3JpcHRvci5uYW1lKCkpOwotICBwcmludGVyXy0+SW5kZW50KCk7Ci0gIEdlbmVyYXRvcjo6UHJpbnREZXNjcmlwdG9yS2V5QW5kTW9kdWxlTmFtZShkZXNjcmlwdG9yKTsKLSAgcHJpbnRlcl8tPlByaW50KCIpKVxuXG4iKTsKLSAgcHJpbnRlcl8tPk91dGRlbnQoKTsKLX0KLQotLy8gUHJpbnRzIHN0YXRlbWVudCBhc3NpZ25pbmcgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IpCi0vLyB0byBhIFB5dGhvbiBEZXNjcmlwdG9yIG9iamVjdCBmb3IgbWVzc2FnZV9kZXNjcmlwdG9yLgotLy8KLS8vIE11dHVhbGx5IHJlY3Vyc2l2ZSB3aXRoIFByaW50TmVzdGVkRGVzY3JpcHRvcnMoKS4KLXZvaWQgR2VuZXJhdG9yOjpQcmludERlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7Ci0gIFByaW50TmVzdGVkRGVzY3JpcHRvcnMobWVzc2FnZV9kZXNjcmlwdG9yKTsKLQotICBwcmludGVyXy0+UHJpbnQoIlxuIik7Ci0gIHByaW50ZXJfLT5QcmludCgiJGRlc2NyaXB0b3JfbmFtZSQgPSBfZGVzY3JpcHRvci5EZXNjcmlwdG9yKFxuIiwKLSAgICAgICAgICAgICAgICAgICJkZXNjcmlwdG9yX25hbWUiLAotICAgICAgICAgICAgICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IpKTsKLSAgcHJpbnRlcl8tPkluZGVudCgpOwotICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07Ci0gIG1bIm5hbWUiXSA9IG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lKCk7Ci0gIG1bImZ1bGxfbmFtZSJdID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSgpOwotICBtWyJmaWxlIl0gPSBrRGVzY3JpcHRvcktleTsKLSAgY29uc3QgY2hhciByZXF1aXJlZF9mdW5jdGlvbl9hcmd1bWVudHNbXSA9Ci0gICAgICAibmFtZT0nJG5hbWUkJyxcbiIKLSAgICAgICJmdWxsX25hbWU9JyRmdWxsX25hbWUkJyxcbiIKLSAgICAgICJmaWxlbmFtZT1Ob25lLFxuIgotICAgICAgImZpbGU9JGZpbGUkLFxuIgotICAgICAgImNvbnRhaW5pbmdfdHlwZT1Ob25lLFxuIjsKLSAgcHJpbnRlcl8tPlByaW50KG0sIHJlcXVpcmVkX2Z1bmN0aW9uX2FyZ3VtZW50cyk7Ci0gIFByaW50RmllbGRzSW5EZXNjcmlwdG9yKG1lc3NhZ2VfZGVzY3JpcHRvcik7Ci0gIFByaW50RXh0ZW5zaW9uc0luRGVzY3JpcHRvcihtZXNzYWdlX2Rlc2NyaXB0b3IpOwotCi0gIC8vIE5lc3RlZCB0eXBlcwotICBwcmludGVyXy0+UHJpbnQoIm5lc3RlZF90eXBlcz1bIik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9kZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IHN0cmluZyBuZXN0ZWRfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoCi0gICAgICAgICptZXNzYWdlX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSkpOwotICAgIHByaW50ZXJfLT5QcmludCgiJG5hbWUkLCAiLCAibmFtZSIsIG5lc3RlZF9uYW1lKTsKLSAgfQotICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKLQotICAvLyBFbnVtIHR5cGVzCi0gIHByaW50ZXJfLT5QcmludCgiZW51bV90eXBlcz1bXG4iKTsKLSAgcHJpbnRlcl8tPkluZGVudCgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfZGVzY3JpcHRvci5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3Qgc3RyaW5nIGRlc2NyaXB0b3JfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoCi0gICAgICAgICptZXNzYWdlX2Rlc2NyaXB0b3IuZW51bV90eXBlKGkpKTsKLSAgICBwcmludGVyXy0+UHJpbnQoZGVzY3JpcHRvcl9uYW1lLmNfc3RyKCkpOwotICAgIHByaW50ZXJfLT5QcmludCgiLFxuIik7Ci0gIH0KLSAgcHJpbnRlcl8tPk91dGRlbnQoKTsKLSAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7Ci0gIHN0cmluZyBvcHRpb25zX3N0cmluZzsKLSAgbWVzc2FnZV9kZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOwotICBwcmludGVyXy0+UHJpbnQoCi0gICAgICAib3B0aW9ucz0kb3B0aW9uc192YWx1ZSQsXG4iCi0gICAgICAiaXNfZXh0ZW5kYWJsZT0kZXh0ZW5kYWJsZSQsXG4iCi0gICAgICAic3ludGF4PSckc3ludGF4JCciLAotICAgICAgIm9wdGlvbnNfdmFsdWUiLCBPcHRpb25zVmFsdWUoIk1lc3NhZ2VPcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpLAotICAgICAgImV4dGVuZGFibGUiLCBtZXNzYWdlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwID8KLSAgICAgICAgICAgICAgICAgICAgICAiVHJ1ZSIgOiAiRmFsc2UiLAotICAgICAgInN5bnRheCIsIFN0cmluZ2lmeVN5bnRheChtZXNzYWdlX2Rlc2NyaXB0b3IuZmlsZSgpLT5zeW50YXgoKSkpOwotICBwcmludGVyXy0+UHJpbnQoIixcbiIpOwotCi0gIC8vIEV4dGVuc2lvbiByYW5nZXMKLSAgcHJpbnRlcl8tPlByaW50KCJleHRlbnNpb25fcmFuZ2VzPVsiKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZSA9Ci0gICAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25fcmFuZ2UoaSk7Ci0gICAgcHJpbnRlcl8tPlByaW50KCIoJHN0YXJ0JCwgJGVuZCQpLCAiLAotICAgICAgICAgICAgICAgICAgICAic3RhcnQiLCBTaW1wbGVJdG9hKHJhbmdlLT5zdGFydCksCi0gICAgICAgICAgICAgICAgICAgICJlbmQiLCBTaW1wbGVJdG9hKHJhbmdlLT5lbmQpKTsKLSAgfQotICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKLSAgcHJpbnRlcl8tPlByaW50KCJvbmVvZnM9W1xuIik7Ci0gIHByaW50ZXJfLT5JbmRlbnQoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGRlc2MgPSBtZXNzYWdlX2Rlc2NyaXB0b3Iub25lb2ZfZGVjbChpKTsKLSAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07Ci0gICAgbVsibmFtZSJdID0gZGVzYy0+bmFtZSgpOwotICAgIG1bImZ1bGxfbmFtZSJdID0gZGVzYy0+ZnVsbF9uYW1lKCk7Ci0gICAgbVsiaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzYy0+aW5kZXgoKSk7Ci0gICAgcHJpbnRlcl8tPlByaW50KAotICAgICAgICBtLAotICAgICAgICAiX2Rlc2NyaXB0b3IuT25lb2ZEZXNjcmlwdG9yKFxuIgotICAgICAgICAiICBuYW1lPSckbmFtZSQnLCBmdWxsX25hbWU9JyRmdWxsX25hbWUkJyxcbiIKLSAgICAgICAgIiAgaW5kZXg9JGluZGV4JCwgY29udGFpbmluZ190eXBlPU5vbmUsIGZpZWxkcz1bXSksXG4iKTsKLSAgfQotICBwcmludGVyXy0+T3V0ZGVudCgpOwotICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKLSAgLy8gU2VyaWFsaXphdGlvbiBvZiBwcm90bwotICBEZXNjcmlwdG9yUHJvdG8gZWRwOwotICBQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKG1lc3NhZ2VfZGVzY3JpcHRvciwgZWRwKTsKLQotICBwcmludGVyXy0+T3V0ZGVudCgpOwotICBwcmludGVyXy0+UHJpbnQoIilcbiIpOwotfQotCi0vLyBQcmludHMgUHl0aG9uIERlc2NyaXB0b3Igb2JqZWN0cyBmb3IgYWxsIG5lc3RlZCB0eXBlcyBjb250YWluZWQgaW4KLS8vIG1lc3NhZ2VfZGVzY3JpcHRvci4KLS8vCi0vLyBNdXR1YWxseSByZWN1cnNpdmUgd2l0aCBQcmludERlc2NyaXB0b3IoKS4KLXZvaWQgR2VuZXJhdG9yOjpQcmludE5lc3RlZERlc2NyaXB0b3JzKAotICAgIGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3QgewotICBmb3IgKGludCBpID0gMDsgaSA8IGNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBQcmludERlc2NyaXB0b3IoKmNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7Ci0gIH0KLX0KLQotLy8gUHJpbnRzIGFsbCBtZXNzYWdlcyBpbiB8ZmlsZXwuCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRNZXNzYWdlcygpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgewotICAgIHZlY3RvcjxzdHJpbmc+IHRvX3JlZ2lzdGVyOwotICAgIFByaW50TWVzc2FnZSgqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSwgIiIsICZ0b19yZWdpc3Rlcik7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCB0b19yZWdpc3Rlci5zaXplKCk7ICsraikgewotICAgICAgcHJpbnRlcl8tPlByaW50KCJfc3ltX2RiLlJlZ2lzdGVyTWVzc2FnZSgkbmFtZSQpXG4iLCAibmFtZSIsCi0gICAgICAgICAgICAgICAgICAgICAgdG9fcmVnaXN0ZXJbal0pOwotICAgIH0KLSAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7Ci0gIH0KLX0KLQotLy8gUHJpbnRzIGEgUHl0aG9uIGNsYXNzIGZvciB0aGUgZ2l2ZW4gbWVzc2FnZSBkZXNjcmlwdG9yLiAgV2UgZGVmZXIgdG8gdGhlCi0vLyBtZXRhY2xhc3MgdG8gZG8gYWxtb3N0IGFsbCBvZiB0aGUgd29yayBvZiBhY3R1YWxseSBjcmVhdGluZyBhIHVzZWZ1bCBjbGFzcy4KLS8vIFRoZSBwdXJwb3NlIG9mIHRoaXMgZnVuY3Rpb24gYW5kIGl0cyBtYW55IGhlbHBlciBmdW5jdGlvbnMgYWJvdmUgaXMgbWVyZWx5Ci0vLyB0byBvdXRwdXQgYSBQeXRob24gdmVyc2lvbiBvZiB0aGUgZGVzY3JpcHRvcnMsIHdoaWNoIHRoZSBtZXRhY2xhc3MgaW4KLS8vIHJlZmxlY3Rpb24ucHkgd2lsbCB1c2UgdG8gY29uc3RydWN0IHRoZSBtZWF0IG9mIHRoZSBjbGFzcyBpdHNlbGYuCi0vLwotLy8gTXV0dWFsbHkgcmVjdXJzaXZlIHdpdGggUHJpbnROZXN0ZWRNZXNzYWdlcygpLgotLy8gQ29sbGVjdCBuZXN0ZWQgbWVzc2FnZSBuYW1lcyB0b19yZWdpc3RlciBmb3IgdGhlIHN5bWJvbF9kYXRhYmFzZS4KLXZvaWQgR2VuZXJhdG9yOjpQcmludE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIHRvX3JlZ2lzdGVyKSBjb25zdCB7Ci0gIHN0cmluZyBxdWFsaWZpZWRfbmFtZShwcmVmaXggKyBtZXNzYWdlX2Rlc2NyaXB0b3IubmFtZSgpKTsKLSAgdG9fcmVnaXN0ZXItPnB1c2hfYmFjayhxdWFsaWZpZWRfbmFtZSk7Ci0gIHByaW50ZXJfLT5QcmludCgKLSAgICAgICIkbmFtZSQgPSBfcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKCckbmFtZSQnLCAiCi0gICAgICAiKF9tZXNzYWdlLk1lc3NhZ2UsKSwgZGljdChcbiIsCi0gICAgICAibmFtZSIsIG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lKCkpOwotICBwcmludGVyXy0+SW5kZW50KCk7Ci0KLSAgUHJpbnROZXN0ZWRNZXNzYWdlcyhtZXNzYWdlX2Rlc2NyaXB0b3IsIHF1YWxpZmllZF9uYW1lICsgIi4iLCB0b19yZWdpc3Rlcik7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgbVsiZGVzY3JpcHRvcl9rZXkiXSA9IGtEZXNjcmlwdG9yS2V5OwotICBtWyJkZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUobWVzc2FnZV9kZXNjcmlwdG9yKTsKLSAgcHJpbnRlcl8tPlByaW50KG0sICIkZGVzY3JpcHRvcl9rZXkkID0gJGRlc2NyaXB0b3JfbmFtZSQsXG4iKTsKLSAgcHJpbnRlcl8tPlByaW50KCJfX21vZHVsZV9fID0gJyRtb2R1bGVfbmFtZSQnXG4iLAotICAgICAgICAgICAgICAgICAgIm1vZHVsZV9uYW1lIiwgTW9kdWxlTmFtZShmaWxlXy0+bmFtZSgpKSk7Ci0gIHByaW50ZXJfLT5QcmludCgiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAotICAgICAgICAgICAgICAgICAgImZ1bGxfbmFtZSIsIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUoKSk7Ci0gIHByaW50ZXJfLT5QcmludCgiKSlcbiIpOwotICBwcmludGVyXy0+T3V0ZGVudCgpOwotfQotCi0vLyBQcmludHMgYWxsIG5lc3RlZCBtZXNzYWdlcyB3aXRoaW4gfGNvbnRhaW5pbmdfZGVzY3JpcHRvcnwuCi0vLyBNdXR1YWxseSByZWN1cnNpdmUgd2l0aCBQcmludE1lc3NhZ2UoKS4KLXZvaWQgR2VuZXJhdG9yOjpQcmludE5lc3RlZE1lc3NhZ2VzKGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIHRvX3JlZ2lzdGVyKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgY29udGFpbmluZ19kZXNjcmlwdG9yLm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgewotICAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKLSAgICBQcmludE1lc3NhZ2UoKmNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSwgcHJlZml4LCB0b19yZWdpc3Rlcik7Ci0gICAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKLSAgfQotfQotCi0vLyBSZWN1cnNpdmVseSBmaXhlcyBmb3JlaWduIGZpZWxkcyBpbiBhbGwgbmVzdGVkIHR5cGVzIGluIHxkZXNjcmlwdG9yfCwgdGhlbgotLy8gc2V0cyB0aGUgbWVzc2FnZV90eXBlIGFuZCBlbnVtX3R5cGUgb2YgYWxsIG1lc3NhZ2UgYW5kIGVudW0gZmllbGRzIHRvIHBvaW50Ci0vLyB0byB0aGVpciByZXNwZWN0aXZlIGRlc2NyaXB0b3JzLgotLy8gQXJnczoKLS8vICAgZGVzY3JpcHRvcjogZGVzY3JpcHRvciB0byBwcmludCBmaWVsZHMgZm9yLgotLy8gICBjb250YWluaW5nX2Rlc2NyaXB0b3I6IGlmIGRlc2NyaXB0b3IgaXMgYSBuZXN0ZWQgdHlwZSwgdGhpcyBpcyBpdHMKLS8vICAgICAgIGNvbnRhaW5pbmcgdHlwZSwgb3IgTlVMTCBpZiB0aGlzIGlzIGEgcm9vdC90b3AtbGV2ZWwgdHlwZS4KLXZvaWQgR2VuZXJhdG9yOjpGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9yKAotICAgIGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IsCi0gICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9yKCpkZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpLCAmZGVzY3JpcHRvcik7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZmllbGRfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZF9kZXNjcmlwdG9yID0gKmRlc2NyaXB0b3IuZmllbGQoaSk7Ci0gICAgRml4Rm9yZWlnbkZpZWxkc0luRmllbGQoJmRlc2NyaXB0b3IsIGZpZWxkX2Rlc2NyaXB0b3IsICJmaWVsZHNfYnlfbmFtZSIpOwotICB9Ci0KLSAgRml4Q29udGFpbmluZ1R5cGVJbkRlc2NyaXB0b3IoZGVzY3JpcHRvciwgY29udGFpbmluZ19kZXNjcmlwdG9yKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yID0gKmRlc2NyaXB0b3IuZW51bV90eXBlKGkpOwotICAgIEZpeENvbnRhaW5pbmdUeXBlSW5EZXNjcmlwdG9yKGVudW1fZGVzY3JpcHRvciwgJmRlc2NyaXB0b3IpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5vbmVvZl9kZWNsX2NvdW50KCk7ICsraSkgewotICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZGVzY3JpcHRvci5vbmVvZl9kZWNsKGkpOwotICAgIG1bImRlc2NyaXB0b3JfbmFtZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShkZXNjcmlwdG9yKTsKLSAgICBtWyJvbmVvZl9uYW1lIl0gPSBvbmVvZi0+bmFtZSgpOwotICAgIGZvciAoaW50IGogPSAwOyBqIDwgb25lb2YtPmZpZWxkX2NvdW50KCk7ICsraikgewotICAgICAgbVsiZmllbGRfbmFtZSJdID0gb25lb2YtPmZpZWxkKGopLT5uYW1lKCk7Ci0gICAgICBwcmludGVyXy0+UHJpbnQoCi0gICAgICAgICAgbSwKLSAgICAgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQub25lb2ZzX2J5X25hbWVbJyRvbmVvZl9uYW1lJCddLmZpZWxkcy5hcHBlbmQoXG4iCi0gICAgICAgICAgIiAgJGRlc2NyaXB0b3JfbmFtZSQuZmllbGRzX2J5X25hbWVbJyRmaWVsZF9uYW1lJCddKVxuIik7Ci0gICAgICBwcmludGVyXy0+UHJpbnQoCi0gICAgICAgICAgbSwKLSAgICAgICAgICAiJGRlc2NyaXB0b3JfbmFtZSQuZmllbGRzX2J5X25hbWVbJyRmaWVsZF9uYW1lJCddLmNvbnRhaW5pbmdfb25lb2YgPSAiCi0gICAgICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLm9uZW9mc19ieV9uYW1lWyckb25lb2ZfbmFtZSQnXVxuIik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgR2VuZXJhdG9yOjpBZGRNZXNzYWdlVG9GaWxlRGVzY3JpcHRvcihjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKLSAgbVsibWVzc2FnZV9uYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKLSAgbVsibWVzc2FnZV9kZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7Ci0gIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQotICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLm1lc3NhZ2VfdHlwZXNfYnlfbmFtZVsnJG1lc3NhZ2VfbmFtZSQnXSA9ICIKLSAgICAgICIkbWVzc2FnZV9kZXNjcmlwdG9yX25hbWUkXG4iOwotICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKLX0KLQotdm9pZCBHZW5lcmF0b3I6OkFkZEVudW1Ub0ZpbGVEZXNjcmlwdG9yKAotICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKLSAgbVsiZW51bV9uYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKLSAgbVsiZW51bV9kZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7Ci0gIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQotICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLmVudW1fdHlwZXNfYnlfbmFtZVsnJGVudW1fbmFtZSQnXSA9ICIKLSAgICAgICIkZW51bV9kZXNjcmlwdG9yX25hbWUkXG4iOwotICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKLX0KLQotdm9pZCBHZW5lcmF0b3I6OkFkZEV4dGVuc2lvblRvRmlsZURlc2NyaXB0b3IoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKLSAgbVsiZmllbGRfbmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7Ci0gIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQotICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLmV4dGVuc2lvbnNfYnlfbmFtZVsnJGZpZWxkX25hbWUkJ10gPSAiCi0gICAgICAiJGZpZWxkX25hbWUkXG4iOwotICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKLX0KLQotLy8gU2V0cyBhbnkgbmVjZXNzYXJ5IG1lc3NhZ2VfdHlwZSBhbmQgZW51bV90eXBlIGF0dHJpYnV0ZXMKLS8vIGZvciB0aGUgUHl0aG9uIHZlcnNpb24gb2YgfGZpZWxkfC4KLS8vCi0vLyBjb250YWluaW5nX3R5cGUgbWF5IGJlIE5VTEwsIGluIHdoaWNoIGNhc2UgdGhpcyBpcyBhIG1vZHVsZS1sZXZlbCBmaWVsZC4KLS8vCi0vLyBweXRob25fZGljdF9uYW1lIGlzIHRoZSBuYW1lIG9mIHRoZSBQeXRob24gZGljdCB3aGVyZSB3ZSBzaG91bGQKLS8vIGxvb2sgdGhlIGZpZWxkIHVwIGluIHRoZSBjb250YWluaW5nIHR5cGUuICAoZS5nLiwgZmllbGRzX2J5X25hbWUKLS8vIG9yIGV4dGVuc2lvbnNfYnlfbmFtZSkuICBXZSBpZ25vcmUgcHl0aG9uX2RpY3RfbmFtZSBpZiBjb250YWluaW5nX3R5cGUKLS8vIGlzIE5VTEwuCi12b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luRmllbGQoY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBweXRob25fZGljdF9uYW1lKSBjb25zdCB7Ci0gIGNvbnN0IHN0cmluZyBmaWVsZF9yZWZlcmVuY2luZ19leHByZXNzaW9uID0gRmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oCi0gICAgICBjb250YWluaW5nX3R5cGUsIGZpZWxkLCBweXRob25fZGljdF9uYW1lKTsKLSAgbWFwPHN0cmluZywgc3RyaW5nPiBtOwotICBtWyJmaWVsZF9yZWYiXSA9IGZpZWxkX3JlZmVyZW5jaW5nX2V4cHJlc3Npb247Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fbWVzc2FnZV90eXBlID0gZmllbGQubWVzc2FnZV90eXBlKCk7Ci0gIGlmIChmb3JlaWduX21lc3NhZ2VfdHlwZSkgewotICAgIG1bImZvcmVpZ25fdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqZm9yZWlnbl9tZXNzYWdlX3R5cGUpOwotICAgIHByaW50ZXJfLT5QcmludChtLCAiJGZpZWxkX3JlZiQubWVzc2FnZV90eXBlID0gJGZvcmVpZ25fdHlwZSRcbiIpOwotICB9Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUgPSBmaWVsZC5lbnVtX3R5cGUoKTsKLSAgaWYgKGVudW1fdHlwZSkgewotICAgIG1bImVudW1fdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqZW51bV90eXBlKTsKLSAgICBwcmludGVyXy0+UHJpbnQobSwgIiRmaWVsZF9yZWYkLmVudW1fdHlwZSA9ICRlbnVtX3R5cGUkXG4iKTsKLSAgfQotfQotCi0vLyBSZXR1cm5zIHRoZSBtb2R1bGUtbGV2ZWwgZXhwcmVzc2lvbiBmb3IgdGhlIGdpdmVuIEZpZWxkRGVzY3JpcHRvci4KLS8vIE9ubHkgd29ya3MgZm9yIGZpZWxkcyBpbiB0aGUgLnByb3RvIGZpbGUgdGhpcyBHZW5lcmF0b3IgaXMgZ2VuZXJhdGluZyBmb3IuCi0vLwotLy8gY29udGFpbmluZ190eXBlIG1heSBiZSBOVUxMLCBpbiB3aGljaCBjYXNlIHRoaXMgaXMgYSBtb2R1bGUtbGV2ZWwgZmllbGQuCi0vLwotLy8gcHl0aG9uX2RpY3RfbmFtZSBpcyB0aGUgbmFtZSBvZiB0aGUgUHl0aG9uIGRpY3Qgd2hlcmUgd2Ugc2hvdWxkCi0vLyBsb29rIHRoZSBmaWVsZCB1cCBpbiB0aGUgY29udGFpbmluZyB0eXBlLiAgKGUuZy4sIGZpZWxkc19ieV9uYW1lCi0vLyBvciBleHRlbnNpb25zX2J5X25hbWUpLiAgV2UgaWdub3JlIHB5dGhvbl9kaWN0X25hbWUgaWYgY29udGFpbmluZ190eXBlCi0vLyBpcyBOVUxMLgotc3RyaW5nIEdlbmVyYXRvcjo6RmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oCi0gICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCi0gICAgY29uc3Qgc3RyaW5nJiBweXRob25fZGljdF9uYW1lKSBjb25zdCB7Ci0gIC8vIFdlIHNob3VsZCBvbmx5IGV2ZXIgYmUgbG9va2luZyB1cCBmaWVsZHMgaW4gdGhlIGN1cnJlbnQgZmlsZS4KLSAgLy8gVGhlIG9ubHkgdGhpbmdzIHdlIHJlZmVyIHRvIGZyb20gb3RoZXIgZmlsZXMgYXJlIG1lc3NhZ2UgZGVzY3JpcHRvcnMuCi0gIEdPT0dMRV9DSEVDS19FUShmaWVsZC5maWxlKCksIGZpbGVfKSA8PCBmaWVsZC5maWxlKCktPm5hbWUoKSA8PCAiIHZzLiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpbGVfLT5uYW1lKCk7Ci0gIGlmICghY29udGFpbmluZ190eXBlKSB7Ci0gICAgcmV0dXJuIGZpZWxkLm5hbWUoKTsKLSAgfQotICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICIkMC4kMVsnJDInXSIsCi0gICAgICBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKCpjb250YWluaW5nX3R5cGUpLAotICAgICAgcHl0aG9uX2RpY3RfbmFtZSwgZmllbGQubmFtZSgpKTsKLX0KLQotLy8gUHJpbnRzIGNvbnRhaW5pbmdfdHlwZSBmb3IgbmVzdGVkIGRlc2NyaXB0b3JzIG9yIGVudW0gZGVzY3JpcHRvcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+Ci12b2lkIEdlbmVyYXRvcjo6Rml4Q29udGFpbmluZ1R5cGVJbkRlc2NyaXB0b3IoCi0gICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCi0gICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdCB7Ci0gIGlmIChjb250YWluaW5nX2Rlc2NyaXB0b3IgIT0gTlVMTCkgewotICAgIGNvbnN0IHN0cmluZyBuZXN0ZWRfbmFtZSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7Ci0gICAgY29uc3Qgc3RyaW5nIHBhcmVudF9uYW1lID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgKLSAgICAgICAgKmNvbnRhaW5pbmdfZGVzY3JpcHRvcik7Ci0gICAgcHJpbnRlcl8tPlByaW50KAotICAgICAgICAiJG5lc3RlZF9uYW1lJC5jb250YWluaW5nX3R5cGUgPSAkcGFyZW50X25hbWUkXG4iLAotICAgICAgICAibmVzdGVkX25hbWUiLCBuZXN0ZWRfbmFtZSwKLSAgICAgICAgInBhcmVudF9uYW1lIiwgcGFyZW50X25hbWUpOwotICB9Ci19Ci0KLS8vIFByaW50cyBzdGF0ZW1lbnRzIHNldHRpbmcgdGhlIG1lc3NhZ2VfdHlwZSBhbmQgZW51bV90eXBlIGZpZWxkcyBpbiB0aGUKLS8vIFB5dGhvbiBkZXNjcmlwdG9yIG9iamVjdHMgd2UndmUgYWxyZWFkeSBvdXRwdXQgaW4gdGhzIGZpbGUuICBXZSBtdXN0Ci0vLyBkbyB0aGlzIGluIGEgc2VwYXJhdGUgc3RlcCBkdWUgdG8gY2lyY3VsYXIgcmVmZXJlbmNlcyAob3RoZXJ3aXNlLCB3ZSdkCi0vLyBqdXN0IHNldCBldmVyeXRoaW5nIGluIHRoZSBpbml0aWFsIGFzc2lnbm1lbnQgc3RhdGVtZW50cykuCi12b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcnMoKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9yKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpLCBOVUxMKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgQWRkTWVzc2FnZVRvRmlsZURlc2NyaXB0b3IoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBBZGRFbnVtVG9GaWxlRGVzY3JpcHRvcigqZmlsZV8tPmVudW1fdHlwZShpKSk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7ICsraSkgewotICAgIEFkZEV4dGVuc2lvblRvRmlsZURlc2NyaXB0b3IoKmZpbGVfLT5leHRlbnNpb24oaSkpOwotICB9Ci0gIHByaW50ZXJfLT5QcmludCgiXG4iKTsKLX0KLQotLy8gV2UgbmVlZCB0byBub3Qgb25seSBzZXQgYW55IG5lY2Vzc2FyeSBtZXNzYWdlX3R5cGUgZmllbGRzLCBidXQKLS8vIGFsc28gbmVlZCB0byBjYWxsIFJlZ2lzdGVyRXh0ZW5zaW9uKCkgb24gZWFjaCBtZXNzYWdlIHdlJ3JlCi0vLyBleHRlbmRpbmcuCi12b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9ucygpIGNvbnN0IHsKLSAgLy8gVG9wLWxldmVsIGV4dGVuc2lvbnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKLSAgICBGaXhGb3JlaWduRmllbGRzSW5FeHRlbnNpb24oKmZpbGVfLT5leHRlbnNpb24oaSkpOwotICB9Ci0gIC8vIE5lc3RlZCBleHRlbnNpb25zLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgRml4Rm9yZWlnbkZpZWxkc0luTmVzdGVkRXh0ZW5zaW9ucygqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7Ci0gIH0KLSAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotfQotCi12b2lkIEdlbmVyYXRvcjo6Rml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9uKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZXh0ZW5zaW9uX2ZpZWxkKSBjb25zdCB7Ci0gIEdPT0dMRV9DSEVDSyhleHRlbnNpb25fZmllbGQuaXNfZXh0ZW5zaW9uKCkpOwotICAvLyBleHRlbnNpb25fc2NvcGUoKSB3aWxsIGJlIE5VTEwgZm9yIHRvcC1sZXZlbCBleHRlbnNpb25zLCB3aGljaCBpcwotICAvLyBleGFjdGx5IHdoYXQgRml4Rm9yZWlnbkZpZWxkc0luRmllbGQoKSB3YW50cy4KLSAgRml4Rm9yZWlnbkZpZWxkc0luRmllbGQoZXh0ZW5zaW9uX2ZpZWxkLmV4dGVuc2lvbl9zY29wZSgpLCBleHRlbnNpb25fZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJleHRlbnNpb25zX2J5X25hbWUiKTsKLQotICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07Ci0gIC8vIENvbmZ1c2luZ2x5LCBmb3IgRmllbGREZXNjcmlwdG9ycyB0aGF0IGhhcHBlbiB0byBiZSBleHRlbnNpb25zLAotICAvLyBjb250YWluaW5nX3R5cGUoKSBtZWFucyAiZXh0ZW5kZWQgdHlwZS4iCi0gIC8vIE9uIHRoZSBvdGhlciBoYW5kLCBleHRlbnNpb25fc2NvcGUoKSB3aWxsIGdpdmUgdXMgd2hhdCB3ZSBub3JtYWxseQotICAvLyBtZWFuIGJ5IGNvbnRhaW5pbmdfdHlwZSgpLgotICBtWyJleHRlbmRlZF9tZXNzYWdlX2NsYXNzIl0gPSBNb2R1bGVMZXZlbE1lc3NhZ2VOYW1lKAotICAgICAgKmV4dGVuc2lvbl9maWVsZC5jb250YWluaW5nX3R5cGUoKSk7Ci0gIG1bImZpZWxkIl0gPSBGaWVsZFJlZmVyZW5jaW5nRXhwcmVzc2lvbihleHRlbnNpb25fZmllbGQuZXh0ZW5zaW9uX3Njb3BlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uc19ieV9uYW1lIik7Ci0gIHByaW50ZXJfLT5QcmludChtLCAiJGV4dGVuZGVkX21lc3NhZ2VfY2xhc3MkLlJlZ2lzdGVyRXh0ZW5zaW9uKCRmaWVsZCQpXG4iKTsKLX0KLQotdm9pZCBHZW5lcmF0b3I6OkZpeEZvcmVpZ25GaWVsZHNJbk5lc3RlZEV4dGVuc2lvbnMoCi0gICAgY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgewotICAvLyBSZWN1cnNpdmVseSBmaXggdXAgZXh0ZW5zaW9ucyBpbiBhbGwgbmVzdGVkIHR5cGVzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgRml4Rm9yZWlnbkZpZWxkc0luTmVzdGVkRXh0ZW5zaW9ucygqZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSk7Ci0gIH0KLSAgLy8gRml4IHVwIGV4dGVuc2lvbnMgZGlyZWN0bHkgY29udGFpbmVkIHdpdGhpbiB0aGlzIHR5cGUuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci5leHRlbnNpb25fY291bnQoKTsgKytpKSB7Ci0gICAgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9uKCpkZXNjcmlwdG9yLmV4dGVuc2lvbihpKSk7Ci0gIH0KLX0KLQotLy8gUmV0dXJucyBhIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgaW5zdGFudGlhdGVzIGEgUHl0aG9uIEVudW1WYWx1ZURlc2NyaXB0b3IKLS8vIG9iamVjdCBmb3IgdGhlIGdpdmVuIEMrKyBkZXNjcmlwdG9yLgotdm9pZCBHZW5lcmF0b3I6OlByaW50RW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIC8vIFRPRE8ocm9iaW5zb24pOiBGaXggdXAgRW51bVZhbHVlRGVzY3JpcHRvciAidHlwZSIgZmllbGRzLgotICAvLyBNb3JlIGNpcmN1bGFyIHJlZmVyZW5jZXMuICA6OnNpZ2g6OgotICBzdHJpbmcgb3B0aW9uc19zdHJpbmc7Ci0gIGRlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgbVsibmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7Ci0gIG1bImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3IuaW5kZXgoKSk7Ci0gIG1bIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLm51bWJlcigpKTsKLSAgbVsib3B0aW9ucyJdID0gT3B0aW9uc1ZhbHVlKCJFbnVtVmFsdWVPcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpOwotICBwcmludGVyXy0+UHJpbnQoCi0gICAgICBtLAotICAgICAgIl9kZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoXG4iCi0gICAgICAiICBuYW1lPSckbmFtZSQnLCBpbmRleD0kaW5kZXgkLCBudW1iZXI9JG51bWJlciQsXG4iCi0gICAgICAiICBvcHRpb25zPSRvcHRpb25zJCxcbiIKLSAgICAgICIgIHR5cGU9Tm9uZSkiKTsKLX0KLQotLy8gUmV0dXJucyBhIFB5dGhvbiBleHByZXNzaW9uIHRoYXQgY2FsbHMgZGVzY3JpcHRvci5fUGFyc2VPcHRpb25zIHVzaW5nCi0vLyB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBjbGFzcyBuYW1lIGFuZCBzZXJpYWxpemVkIG9wdGlvbnMgcHJvdG9idWYgc3RyaW5nLgotc3RyaW5nIEdlbmVyYXRvcjo6T3B0aW9uc1ZhbHVlKAotICAgIGNvbnN0IHN0cmluZyYgY2xhc3NfbmFtZSwgY29uc3Qgc3RyaW5nJiBzZXJpYWxpemVkX29wdGlvbnMpIGNvbnN0IHsKLSAgaWYgKHNlcmlhbGl6ZWRfb3B0aW9ucy5sZW5ndGgoKSA9PSAwIHx8IEdlbmVyYXRpbmdEZXNjcmlwdG9yUHJvdG8oKSkgewotICAgIHJldHVybiAiTm9uZSI7Ci0gIH0gZWxzZSB7Ci0gICAgc3RyaW5nIGZ1bGxfY2xhc3NfbmFtZSA9ICJkZXNjcmlwdG9yX3BiMi4iICsgY2xhc3NfbmFtZTsKLS8vIyMhUFkyNSAgICByZXR1cm4gIl9kZXNjcmlwdG9yLl9QYXJzZU9wdGlvbnMoIiArIGZ1bGxfY2xhc3NfbmFtZSArICIoKSwgYiciCi0vLyMjIVBZMjUgICAgICAgICsgQ0VzY2FwZShzZXJpYWxpemVkX29wdGlvbnMpKyAiJykiOwotICAgIHJldHVybiAiX2Rlc2NyaXB0b3IuX1BhcnNlT3B0aW9ucygiICsgZnVsbF9jbGFzc19uYW1lICsgIigpLCBfYignIiAgLy8jI1BZMjUKLSAgICAgICAgKyBDRXNjYXBlKHNlcmlhbGl6ZWRfb3B0aW9ucykrICInKSkiOyAgLy8jI1BZMjUKLSAgfQotfQotCi0vLyBQcmludHMgYW4gZXhwcmVzc2lvbiBmb3IgYSBQeXRob24gRmllbGREZXNjcmlwdG9yIGZvciB8ZmllbGR8Lgotdm9pZCBHZW5lcmF0b3I6OlByaW50RmllbGREZXNjcmlwdG9yKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsIGJvb2wgaXNfZXh0ZW5zaW9uKSBjb25zdCB7Ci0gIHN0cmluZyBvcHRpb25zX3N0cmluZzsKLSAgZmllbGQub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgbVsibmFtZSJdID0gZmllbGQubmFtZSgpOwotICBtWyJmdWxsX25hbWUiXSA9IGZpZWxkLmZ1bGxfbmFtZSgpOwotICBtWyJpbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC5pbmRleCgpKTsKLSAgbVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGZpZWxkLm51bWJlcigpKTsKLSAgbVsidHlwZSJdID0gU2ltcGxlSXRvYShmaWVsZC50eXBlKCkpOwotICBtWyJjcHBfdHlwZSJdID0gU2ltcGxlSXRvYShmaWVsZC5jcHBfdHlwZSgpKTsKLSAgbVsibGFiZWwiXSA9IFNpbXBsZUl0b2EoZmllbGQubGFiZWwoKSk7Ci0gIG1bImhhc19kZWZhdWx0X3ZhbHVlIl0gPSBmaWVsZC5oYXNfZGVmYXVsdF92YWx1ZSgpID8gIlRydWUiIDogIkZhbHNlIjsKLSAgbVsiZGVmYXVsdF92YWx1ZSJdID0gU3RyaW5naWZ5RGVmYXVsdFZhbHVlKGZpZWxkKTsKLSAgbVsiaXNfZXh0ZW5zaW9uIl0gPSBpc19leHRlbnNpb24gPyAiVHJ1ZSIgOiAiRmFsc2UiOwotICBtWyJvcHRpb25zIl0gPSBPcHRpb25zVmFsdWUoIkZpZWxkT3B0aW9ucyIsIG9wdGlvbnNfc3RyaW5nKTsKLSAgLy8gV2UgYWx3YXlzIHNldCBtZXNzYWdlX3R5cGUgYW5kIGVudW1fdHlwZSB0byBOb25lIGF0IHRoaXMgcG9pbnQsIGFuZCB0aGVuCi0gIC8vIHRoZXNlIGZpZWxkcyBpbiBjb3JyZWN0bHkgYWZ0ZXIgYWxsIHJlZmVyZW5jZWQgZGVzY3JpcHRvcnMgaGF2ZSBiZWVuCi0gIC8vIGRlZmluZWQgYW5kL29yIGltcG9ydGVkIChzZWUgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcnMoKSkuCi0gIGNvbnN0IGNoYXIgZmllbGRfZGVzY3JpcHRvcl9kZWNsW10gPQotICAgICJfZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoXG4iCi0gICAgIiAgbmFtZT0nJG5hbWUkJywgZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsIGluZGV4PSRpbmRleCQsXG4iCi0gICAgIiAgbnVtYmVyPSRudW1iZXIkLCB0eXBlPSR0eXBlJCwgY3BwX3R5cGU9JGNwcF90eXBlJCwgbGFiZWw9JGxhYmVsJCxcbiIKLSAgICAiICBoYXNfZGVmYXVsdF92YWx1ZT0kaGFzX2RlZmF1bHRfdmFsdWUkLCBkZWZhdWx0X3ZhbHVlPSRkZWZhdWx0X3ZhbHVlJCxcbiIKLSAgICAiICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLFxuIgotICAgICIgIGlzX2V4dGVuc2lvbj0kaXNfZXh0ZW5zaW9uJCwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsXG4iCi0gICAgIiAgb3B0aW9ucz0kb3B0aW9ucyQpIjsKLSAgcHJpbnRlcl8tPlByaW50KG0sIGZpZWxkX2Rlc2NyaXB0b3JfZGVjbCk7Ci19Ci0KLS8vIEhlbHBlciBmb3IgUHJpbnR7RmllbGRzLEV4dGVuc2lvbnN9SW5EZXNjcmlwdG9yKCkuCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAotICAgIGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvciwKLSAgICBib29sIGlzX2V4dGVuc2lvbiwKLSAgICBjb25zdCBzdHJpbmcmIGxpc3RfdmFyaWFibGVfbmFtZSwKLSAgICBpbnQgKERlc2NyaXB0b3I6OipDb3VudEZuKSgpIGNvbnN0LAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogKERlc2NyaXB0b3I6OipHZXR0ZXJGbikoaW50KSBjb25zdCkgY29uc3QgewotICBwcmludGVyXy0+UHJpbnQoIiRsaXN0JD1bXG4iLCAibGlzdCIsIGxpc3RfdmFyaWFibGVfbmFtZSk7Ci0gIHByaW50ZXJfLT5JbmRlbnQoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAobWVzc2FnZV9kZXNjcmlwdG9yLipDb3VudEZuKSgpOyArK2kpIHsKLSAgICBQcmludEZpZWxkRGVzY3JpcHRvcigqKG1lc3NhZ2VfZGVzY3JpcHRvci4qR2V0dGVyRm4pKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbik7Ci0gICAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKLSAgfQotICBwcmludGVyXy0+T3V0ZGVudCgpOwotICBwcmludGVyXy0+UHJpbnQoIl0sXG4iKTsKLX0KLQotLy8gUHJpbnRzIGEgc3RhdGVtZW50IGFzc2lnbmluZyAiZmllbGRzIiB0byBhIGxpc3Qgb2YgUHl0aG9uIEZpZWxkRGVzY3JpcHRvcnMsCi0vLyBvbmUgZm9yIGVhY2ggZmllbGQgcHJlc2VudCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRGaWVsZHNJbkRlc2NyaXB0b3IoCi0gICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7Ci0gIGNvbnN0IGJvb2wgaXNfZXh0ZW5zaW9uID0gZmFsc2U7Ci0gIFByaW50RmllbGREZXNjcmlwdG9yc0luRGVzY3JpcHRvcigKLSAgICAgIG1lc3NhZ2VfZGVzY3JpcHRvciwgaXNfZXh0ZW5zaW9uLCAiZmllbGRzIiwKLSAgICAgICZEZXNjcmlwdG9yOjpmaWVsZF9jb3VudCwgJkRlc2NyaXB0b3I6OmZpZWxkKTsKLX0KLQotLy8gUHJpbnRzIGEgc3RhdGVtZW50IGFzc2lnbmluZyAiZXh0ZW5zaW9ucyIgdG8gYSBsaXN0IG9mIFB5dGhvbgotLy8gRmllbGREZXNjcmlwdG9ycywgb25lIGZvciBlYWNoIGV4dGVuc2lvbiBwcmVzZW50IGluIG1lc3NhZ2VfZGVzY3JpcHRvci4KLXZvaWQgR2VuZXJhdG9yOjpQcmludEV4dGVuc2lvbnNJbkRlc2NyaXB0b3IoCi0gICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdCB7Ci0gIGNvbnN0IGJvb2wgaXNfZXh0ZW5zaW9uID0gdHJ1ZTsKLSAgUHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAotICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLCBpc19leHRlbnNpb24sICJleHRlbnNpb25zIiwKLSAgICAgICZEZXNjcmlwdG9yOjpleHRlbnNpb25fY291bnQsICZEZXNjcmlwdG9yOjpleHRlbnNpb24pOwotfQotCi1ib29sIEdlbmVyYXRvcjo6R2VuZXJhdGluZ0Rlc2NyaXB0b3JQcm90bygpIGNvbnN0IHsKLSAgcmV0dXJuIGZpbGVfLT5uYW1lKCkgPT0gImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKLX0KLQotLy8gUmV0dXJucyB0aGUgdW5pcXVlIFB5dGhvbiBtb2R1bGUtbGV2ZWwgaWRlbnRpZmllciBnaXZlbiB0byBhIGRlc2NyaXB0b3IuCi0vLyBUaGlzIG5hbWUgaXMgbW9kdWxlLXF1YWxpZmllZCBpZmYgdGhlIGdpdmVuIGRlc2NyaXB0b3IgZGVzY3JpYmVzIGFuCi0vLyBlbnRpdHkgdGhhdCBkb2Vzbid0IGNvbWUgZnJvbSB0aGUgY3VycmVudCBmaWxlLgotdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgotc3RyaW5nIEdlbmVyYXRvcjo6TW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgKLSAgICBjb25zdCBEZXNjcmlwdG9yVCYgZGVzY3JpcHRvcikgY29uc3QgewotICAvLyBGSVhNRShyb2JpbnNvbik6Ci0gIC8vIFdlIGN1cnJlbnRseSBkb24ndCB3b3JyeSBhYm91dCBjb2xsaXNpb25zIHdpdGggdW5kZXJzY29yZXMgaW4gdGhlIHR5cGUKLSAgLy8gbmFtZXMsIHNvIHRoZXNlIHdvdWxkIGNvbGxpZGUgaW4gbmFzdHkgd2F5cyBpZiBmb3VuZCBpbiB0aGUgc2FtZSBmaWxlOgotICAvLyAgIE91dGVyUHJvdG8uUHJvdG9BLlByb3RvQgotICAvLyAgIE91dGVyUHJvdG9fUHJvdG9BLlByb3RvQiAgIyBVbmRlcnNjb3JlIGluc3RlYWQgb2YgcGVyaW9kLgotICAvLyBBcyB3b3VsZCB0aGVzZToKLSAgLy8gICBPdXRlclByb3RvLlByb3RvQV8uUHJvdG9CCi0gIC8vICAgT3V0ZXJQcm90by5Qcm90b0EuX1Byb3RvQiAgIyBMZWFkaW5nIHZzLiB0cmFpbGluZyB1bmRlcnNjb3JlLgotICAvLyAoQ29udHJpdmVkLCBidXQgY2VydGFpbmx5IHBvc3NpYmxlKS4KLSAgLy8KLSAgLy8gVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBkb2Vzbid0IGd1YXJkIGFnYWluc3QgdGhpcyBlaXRoZXIuICBMZWF2aW5nCi0gIC8vIGl0IGZvciBub3cuLi4KLSAgc3RyaW5nIG5hbWUgPSBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoZGVzY3JpcHRvciwgIl8iKTsKLSAgVXBwZXJTdHJpbmcoJm5hbWUpOwotICAvLyBNb2R1bGUtcHJpdmF0ZSBmb3Igbm93LiAgRWFzeSB0byBtYWtlIHB1YmxpYyBsYXRlcjsgYWxtb3N0IGltcG9zc2libGUKLSAgLy8gdG8gbWFrZSBwcml2YXRlIGxhdGVyLgotICBuYW1lID0gIl8iICsgbmFtZTsKLSAgLy8gV2Ugbm93IGhhdmUgdGhlIG5hbWUgcmVsYXRpdmUgdG8gaXRzIG93biBtb2R1bGUuICBBbHNvIHF1YWxpZnkgd2l0aAotICAvLyB0aGUgbW9kdWxlIG5hbWUgaWZmIHRoaXMgZGVzY3JpcHRvciBpcyBmcm9tIGEgZGlmZmVyZW50IC5wcm90byBmaWxlLgotICBpZiAoZGVzY3JpcHRvci5maWxlKCkgIT0gZmlsZV8pIHsKLSAgICBuYW1lID0gTW9kdWxlQWxpYXMoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOwotICB9Ci0gIHJldHVybiBuYW1lOwotfQotCi0vLyBSZXR1cm5zIHRoZSBuYW1lIG9mIHRoZSBtZXNzYWdlIGNsYXNzIGl0c2VsZiwgbm90IHRoZSBkZXNjcmlwdG9yLgotLy8gTGlrZSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKCksIG1vZHVsZS1xdWFsaWZpZXMgdGhlIG5hbWUgaWZmCi0vLyB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBkZXNjcmliZXMgYW4gZW50aXR5IHRoYXQgZG9lc24ndCBjb21lIGZyb20KLS8vIHRoZSBjdXJyZW50IGZpbGUuCi1zdHJpbmcgR2VuZXJhdG9yOjpNb2R1bGVMZXZlbE1lc3NhZ2VOYW1lKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKLSAgc3RyaW5nIG5hbWUgPSBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoZGVzY3JpcHRvciwgIi4iKTsKLSAgaWYgKGRlc2NyaXB0b3IuZmlsZSgpICE9IGZpbGVfKSB7Ci0gICAgbmFtZSA9IE1vZHVsZUFsaWFzKGRlc2NyaXB0b3IuZmlsZSgpLT5uYW1lKCkpICsgIi4iICsgbmFtZTsKLSAgfQotICByZXR1cm4gbmFtZTsKLX0KLQotLy8gUmV0dXJucyB0aGUgdW5pcXVlIFB5dGhvbiBtb2R1bGUtbGV2ZWwgaWRlbnRpZmllciBnaXZlbiB0byBhIHNlcnZpY2UKLS8vIGRlc2NyaXB0b3IuCi1zdHJpbmcgR2VuZXJhdG9yOjpNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZSgKLSAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgewotICBzdHJpbmcgbmFtZSA9IGRlc2NyaXB0b3IubmFtZSgpOwotICBVcHBlclN0cmluZygmbmFtZSk7Ci0gIG5hbWUgPSAiXyIgKyBuYW1lOwotICBpZiAoZGVzY3JpcHRvci5maWxlKCkgIT0gZmlsZV8pIHsKLSAgICBuYW1lID0gTW9kdWxlQWxpYXMoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOwotICB9Ci0gIHJldHVybiBuYW1lOwotfQotCi0vLyBQcmludHMgc3RhbmRhcmQgY29uc3RydWN0b3IgYXJndW1lbnRzIHNlcmlhbGl6ZWRfc3RhcnQgYW5kIHNlcmlhbGl6ZWRfZW5kLgotLy8gQXJnczoKLS8vICAgZGVzY3JpcHRvcjogVGhlIGNwcCBkZXNjcmlwdG9yIHRvIGhhdmUgYSBzZXJpYWxpemVkIHJlZmVyZW5jZS4KLS8vICAgcHJvdG86IEEgcHJvdG8KLS8vIEV4YW1wbGUgcHJpbnRlciBvdXRwdXQ6Ci0vLyBzZXJpYWxpemVkX3N0YXJ0PTQxLAotLy8gc2VyaWFsaXplZF9lbmQ9NDMsCi0vLwotdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JULCB0eXBlbmFtZSBEZXNjcmlwdG9yUHJvdG9UPgotdm9pZCBHZW5lcmF0b3I6OlByaW50U2VyaWFsaXplZFBiSW50ZXJ2YWwoCi0gICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsIERlc2NyaXB0b3JQcm90b1QmIHByb3RvKSBjb25zdCB7Ci0gIGRlc2NyaXB0b3IuQ29weVRvKCZwcm90byk7Ci0gIHN0cmluZyBzcDsKLSAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJnNwKTsKLSAgaW50IG9mZnNldCA9IGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXy5maW5kKHNwKTsKLSAgR09PR0xFX0NIRUNLX0dFKG9mZnNldCwgMCk7Ci0KLSAgcHJpbnRlcl8tPlByaW50KCJzZXJpYWxpemVkX3N0YXJ0PSRzZXJpYWxpemVkX3N0YXJ0JCxcbiIKLSAgICAgICAgICAgICAgICAgICJzZXJpYWxpemVkX2VuZD0kc2VyaWFsaXplZF9lbmQkLFxuIiwKLSAgICAgICAgICAgICAgICAgICJzZXJpYWxpemVkX3N0YXJ0IiwgU2ltcGxlSXRvYShvZmZzZXQpLAotICAgICAgICAgICAgICAgICAgInNlcmlhbGl6ZWRfZW5kIiwgU2ltcGxlSXRvYShvZmZzZXQgKyBzcC5zaXplKCkpKTsKLX0KLQotbmFtZXNwYWNlIHsKLXZvaWQgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoY29uc3Qgc3RyaW5nJiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIFRPRE8oeGlhb2ZlbmcpOiBJIGhhdmUgYWRkZWQgYSBtZXRob2QgX1NldE9wdGlvbnMoKSB0byBEZXNjcmlwdG9yQmFzZQotICAvLyBpbiBwcm90bzIgcHl0aG9uIHJ1bnRpbWUgYnV0IGl0IGNvdWxkbid0IGJlIHVzZWQgaGVyZSBiZWNhdXNlIGFwcGVuZ2luZQotICAvLyB1c2VzIGEgc25hcHNob3QgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBpbiB3aGljaCB0aGUgbmV3IG1ldGhvZCBpcyBub3QKLSAgLy8geWV0IHByZXNlbnQuIEFmdGVyIGFwcGVuZ2luZSBoYXMgc3luY2VkIHRoZWlyIHJ1bnRpbWUgbGlicmFyeSwgdGhlIGNvZGUKLSAgLy8gYmVsb3cgc2hvdWxkIGJlIGNsZWFuZWQgdXAgdG8gdXNlIF9TZXRPcHRpb25zKCkuCi0gIHByaW50ZXItPlByaW50KAotICAgICAgIiRkZXNjcmlwdG9yJC5oYXNfb3B0aW9ucyA9IFRydWVcbiIKLSAgICAgICIkZGVzY3JpcHRvciQuX29wdGlvbnMgPSAkb3B0aW9ucyRcbiIsCi0gICAgICAiZGVzY3JpcHRvciIsIGRlc2NyaXB0b3IsICJvcHRpb25zIiwgb3B0aW9ucyk7Ci19Ci19ICAvLyBuYW1lc3BhY2UKLQotLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZpZWxkIG9mIGFsbCBkZXNjcmlwdG9ycy4KLXZvaWQgR2VuZXJhdG9yOjpGaXhBbGxEZXNjcmlwdG9yT3B0aW9ucygpIGNvbnN0IHsKLSAgLy8gUHJpbnRzIGFuIGV4cHJlc3Npb24gdGhhdCBzZXRzIHRoZSBmaWxlIGRlc2NyaXB0b3IncyBvcHRpb25zLgotICBzdHJpbmcgZmlsZV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAotICAgICAgIkZpbGVPcHRpb25zIiwgZmlsZV8tPm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKLSAgaWYgKGZpbGVfb3B0aW9ucyAhPSAiTm9uZSIpIHsKLSAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShrRGVzY3JpcHRvcktleSwgZmlsZV9vcHRpb25zLCBwcmludGVyXyk7Ci0gIH0KLSAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGVudW1zLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpmaWxlXy0+ZW51bV90eXBlKGkpOwotICAgIEZpeE9wdGlvbnNGb3JFbnVtKGVudW1fZGVzY3JpcHRvcik7Ci0gIH0KLSAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGV4dGVuc2lvbnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmZpbGVfLT5leHRlbnNpb24oaSk7Ci0gICAgRml4T3B0aW9uc0ZvckZpZWxkKGZpZWxkKTsKLSAgfQotICAvLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGFsbCBtZXNzYWdlcywgbmVzdGVkIGVudW1zLAotICAvLyBuZXN0ZWQgZXh0ZW5zaW9ucyBhbmQgbWVzc2FnZSBmaWVsZHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBGaXhPcHRpb25zRm9yTWVzc2FnZSgqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7Ci0gIH0KLX0KLQotLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbiBlbnVtIGRlc2NyaXB0b3IgYW5kIGl0cwotLy8gdmFsdWUgZGVzY3JpcHRvcnMuCi12b2lkIEdlbmVyYXRvcjo6Rml4T3B0aW9uc0ZvckVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvcikgY29uc3QgewotICBzdHJpbmcgZGVzY3JpcHRvcl9uYW1lID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShlbnVtX2Rlc2NyaXB0b3IpOwotICBzdHJpbmcgZW51bV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAotICAgICAgIkVudW1PcHRpb25zIiwgZW51bV9kZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKLSAgaWYgKGVudW1fb3B0aW9ucyAhPSAiTm9uZSIpIHsKLSAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShkZXNjcmlwdG9yX25hbWUsIGVudW1fb3B0aW9ucywgcHJpbnRlcl8pOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV9kZXNjcmlwdG9yLnZhbHVlX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIHZhbHVlX2Rlc2NyaXB0b3IgPSAqZW51bV9kZXNjcmlwdG9yLnZhbHVlKGkpOwotICAgIHN0cmluZyB2YWx1ZV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAotICAgICAgICAiRW51bVZhbHVlT3B0aW9ucyIsIHZhbHVlX2Rlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOwotICAgIGlmICh2YWx1ZV9vcHRpb25zICE9ICJOb25lIikgewotICAgICAgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoCi0gICAgICAgICAgU3RyaW5nUHJpbnRmKCIlcy52YWx1ZXNfYnlfbmFtZVtcIiVzXCJdIiwgZGVzY3JpcHRvcl9uYW1lLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2Rlc2NyaXB0b3IubmFtZSgpLmNfc3RyKCkpLAotICAgICAgICAgIHZhbHVlX29wdGlvbnMsIHByaW50ZXJfKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBmaWVsZCBkZXNjcmlwdG9ycyAoaW5jbHVkaW5nCi0vLyBleHRlbnNpb25zKS4KLXZvaWQgR2VuZXJhdG9yOjpGaXhPcHRpb25zRm9yRmllbGQoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgY29uc3QgewotICBzdHJpbmcgZmllbGRfb3B0aW9ucyA9IE9wdGlvbnNWYWx1ZSgKLSAgICAgICJGaWVsZE9wdGlvbnMiLCBmaWVsZC5vcHRpb25zKCkuU2VyaWFsaXplQXNTdHJpbmcoKSk7Ci0gIGlmIChmaWVsZF9vcHRpb25zICE9ICJOb25lIikgewotICAgIHN0cmluZyBmaWVsZF9uYW1lOwotICAgIGlmIChmaWVsZC5pc19leHRlbnNpb24oKSkgewotICAgICAgaWYgKGZpZWxkLmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKLSAgICAgICAgLy8gVG9wIGxldmVsIGV4dGVuc2lvbnMuCi0gICAgICAgIGZpZWxkX25hbWUgPSBmaWVsZC5uYW1lKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZF9uYW1lID0gRmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oCi0gICAgICAgICAgICBmaWVsZC5leHRlbnNpb25fc2NvcGUoKSwgZmllbGQsICJleHRlbnNpb25zX2J5X25hbWUiKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZmllbGRfbmFtZSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKAotICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZCwgImZpZWxkc19ieV9uYW1lIik7Ci0gICAgfQotICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGZpZWxkX25hbWUsIGZpZWxkX29wdGlvbnMsIHByaW50ZXJfKTsKLSAgfQotfQotCi0vLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGEgbWVzc2FnZSBhbmQgYWxsIGl0cyBpbm5lcgotLy8gdHlwZXMgKG5lc3RlZCBtZXNzYWdlcywgbmVzdGVkIGVudW1zLCBleHRlbnNpb25zLCBmaWVsZHMpLgotdm9pZCBHZW5lcmF0b3I6OkZpeE9wdGlvbnNGb3JNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKLSAgLy8gTmVzdGVkIG1lc3NhZ2VzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgRml4T3B0aW9uc0Zvck1lc3NhZ2UoKmRlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSkpOwotICB9Ci0gIC8vIEVudW1zLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCk7ICsraSkgewotICAgIEZpeE9wdGlvbnNGb3JFbnVtKCpkZXNjcmlwdG9yLmVudW1fdHlwZShpKSk7Ci0gIH0KLSAgLy8gRmllbGRzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZmllbGRfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCA9ICpkZXNjcmlwdG9yLmZpZWxkKGkpOwotICAgIEZpeE9wdGlvbnNGb3JGaWVsZChmaWVsZCk7Ci0gIH0KLSAgLy8gRXh0ZW5zaW9ucy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmRlc2NyaXB0b3IuZXh0ZW5zaW9uKGkpOwotICAgIEZpeE9wdGlvbnNGb3JGaWVsZChmaWVsZCk7Ci0gIH0KLSAgLy8gTWVzc2FnZSBvcHRpb24gZm9yIHRoaXMgbWVzc2FnZS4KLSAgc3RyaW5nIG1lc3NhZ2Vfb3B0aW9ucyA9IE9wdGlvbnNWYWx1ZSgKLSAgICAgICJNZXNzYWdlT3B0aW9ucyIsIGRlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOwotICBpZiAobWVzc2FnZV9vcHRpb25zICE9ICJOb25lIikgewotICAgIHN0cmluZyBkZXNjcmlwdG9yX25hbWUgPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOwotICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGRlc2NyaXB0b3JfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcl8pOwotICB9Ci19Ci0KLS8vIElmIGEgZGVwZW5kZW5jeSBmb3J3YXJkcyBvdGhlciBmaWxlcyB0aHJvdWdoIHB1YmxpYyBkZXBlbmRlbmNpZXMsIGxldCdzCi0vLyBjb3B5IG92ZXIgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGFsaWFzZXMuCi12b2lkIEdlbmVyYXRvcjo6Q29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMoCi0gICAgY29uc3Qgc3RyaW5nJiBjb3B5X2Zyb20sIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSBjb25zdCB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgKytpKSB7Ci0gICAgc3RyaW5nIG1vZHVsZV9hbGlhcyA9IE1vZHVsZUFsaWFzKGZpbGUtPnB1YmxpY19kZXBlbmRlbmN5KGkpLT5uYW1lKCkpOwotICAgIHByaW50ZXJfLT5QcmludCgiJGFsaWFzJCA9ICRjb3B5X2Zyb20kLiRhbGlhcyRcbiIsICJhbGlhcyIsIG1vZHVsZV9hbGlhcywKLSAgICAgICAgICAgICAgICAgICAgImNvcHlfZnJvbSIsIGNvcHlfZnJvbSk7Ci0gICAgQ29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMoY29weV9mcm9tLCBmaWxlLT5wdWJsaWNfZGVwZW5kZW5jeShpKSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWEwZjVmYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNzIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKLS8vCi0vLyBHZW5lcmF0ZXMgUHl0aG9uIGNvZGUgZm9yIGEgZ2l2ZW4gLnByb3RvIGZpbGUuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1BZVEhPTl9HRU5FUkFUT1JfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QWVRIT05fR0VORVJBVE9SX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLWNsYXNzIERlc2NyaXB0b3I7Ci1jbGFzcyBFbnVtRGVzY3JpcHRvcjsKLWNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7Ci1jbGFzcyBGaWVsZERlc2NyaXB0b3I7Ci1jbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKLQotbmFtZXNwYWNlIGlvIHsgY2xhc3MgUHJpbnRlcjsgfQotCi1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLS8vIENvZGVHZW5lcmF0b3IgaW1wbGVtZW50YXRpb24gZm9yIGdlbmVyYXRlZCBQeXRob24gcHJvdG9jb2wgYnVmZmVyIGNsYXNzZXMuCi0vLyBJZiB5b3UgY3JlYXRlIHlvdXIgb3duIHByb3RvY29sIGNvbXBpbGVyIGJpbmFyeSBhbmQgeW91IHdhbnQgaXQgdG8gc3VwcG9ydAotLy8gUHl0aG9uIG91dHB1dCwgeW91IGNhbiBkbyBzbyBieSByZWdpc3RlcmluZyBhbiBpbnN0YW5jZSBvZiB0aGlzCi0vLyBDb2RlR2VuZXJhdG9yIHdpdGggdGhlIENvbW1hbmRMaW5lSW50ZXJmYWNlIGluIHlvdXIgbWFpbigpIGZ1bmN0aW9uLgotY2xhc3MgTElCUFJPVE9DX0VYUE9SVCBHZW5lcmF0b3IgOiBwdWJsaWMgQ29kZUdlbmVyYXRvciB7Ci0gcHVibGljOgotICBHZW5lcmF0b3IoKTsKLSAgdmlydHVhbCB+R2VuZXJhdG9yKCk7Ci0KLSAgLy8gQ29kZUdlbmVyYXRvciBtZXRob2RzLgotICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB2b2lkIFByaW50SW1wb3J0cygpIGNvbnN0OwotICB2b2lkIFByaW50RmlsZURlc2NyaXB0b3IoKSBjb25zdDsKLSAgdm9pZCBQcmludFRvcExldmVsRW51bXMoKSBjb25zdDsKLSAgdm9pZCBQcmludEFsbE5lc3RlZEVudW1zSW5GaWxlKCkgY29uc3Q7Ci0gIHZvaWQgUHJpbnROZXN0ZWRFbnVtcyhjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKLSAgdm9pZCBQcmludEVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvcikgY29uc3Q7Ci0KLSAgdm9pZCBQcmludFRvcExldmVsRXh0ZW5zaW9ucygpIGNvbnN0OwotCi0gIHZvaWQgUHJpbnRGaWVsZERlc2NyaXB0b3IoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLCBib29sIGlzX2V4dGVuc2lvbikgY29uc3Q7Ci0gIHZvaWQgUHJpbnRGaWVsZERlc2NyaXB0b3JzSW5EZXNjcmlwdG9yKAotICAgICAgY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yLAotICAgICAgYm9vbCBpc19leHRlbnNpb24sCi0gICAgICBjb25zdCBzdHJpbmcmIGxpc3RfdmFyaWFibGVfbmFtZSwKLSAgICAgIGludCAoRGVzY3JpcHRvcjo6KkNvdW50Rm4pKCkgY29uc3QsCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIChEZXNjcmlwdG9yOjoqR2V0dGVyRm4pKGludCkgY29uc3QpIGNvbnN0OwotICB2b2lkIFByaW50RmllbGRzSW5EZXNjcmlwdG9yKGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvcikgY29uc3Q7Ci0gIHZvaWQgUHJpbnRFeHRlbnNpb25zSW5EZXNjcmlwdG9yKGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvcikgY29uc3Q7Ci0gIHZvaWQgUHJpbnRNZXNzYWdlRGVzY3JpcHRvcnMoKSBjb25zdDsKLSAgdm9pZCBQcmludERlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdDsKLSAgdm9pZCBQcmludE5lc3RlZERlc2NyaXB0b3JzKGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3Q7Ci0KLSAgdm9pZCBQcmludE1lc3NhZ2VzKCkgY29uc3Q7Ci0gIHZvaWQgUHJpbnRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvciwgY29uc3Qgc3RyaW5nJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiB0b19yZWdpc3RlcikgY29uc3Q7Ci0gIHZvaWQgUHJpbnROZXN0ZWRNZXNzYWdlcyhjb25zdCBEZXNjcmlwdG9yJiBjb250YWluaW5nX2Rlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiB0b19yZWdpc3RlcikgY29uc3Q7Ci0KLSAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9ycygpIGNvbnN0OwotICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3IoCi0gICAgICBjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yLAotICAgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKLSAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5GaWVsZChjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHB5dGhvbl9kaWN0X25hbWUpIGNvbnN0OwotICB2b2lkIEFkZE1lc3NhZ2VUb0ZpbGVEZXNjcmlwdG9yKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OwotICB2b2lkIEFkZEVudW1Ub0ZpbGVEZXNjcmlwdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKLSAgdm9pZCBBZGRFeHRlbnNpb25Ub0ZpbGVEZXNjcmlwdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7Ci0gIHN0cmluZyBGaWVsZFJlZmVyZW5jaW5nRXhwcmVzc2lvbihjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBweXRob25fZGljdF9uYW1lKSBjb25zdDsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIERlc2NyaXB0b3JUPgotICB2b2lkIEZpeENvbnRhaW5pbmdUeXBlSW5EZXNjcmlwdG9yKAotICAgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsCi0gICAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX2Rlc2NyaXB0b3IpIGNvbnN0OwotCi0gIHZvaWQgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9ucygpIGNvbnN0OwotICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbigKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZXh0ZW5zaW9uX2ZpZWxkKSBjb25zdDsKLSAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5OZXN0ZWRFeHRlbnNpb25zKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OwotCi0gIHZvaWQgUHJpbnRTZXJ2aWNlcygpIGNvbnN0OwotICB2b2lkIFByaW50U2VydmljZURlc2NyaXB0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OwotICB2b2lkIFByaW50U2VydmljZUNsYXNzKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKLSAgdm9pZCBQcmludFNlcnZpY2VTdHViKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKLSAgdm9pZCBQcmludERlc2NyaXB0b3JLZXlBbmRNb2R1bGVOYW1lKAotICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IDsKLQotICB2b2lkIFByaW50RW51bVZhbHVlRGVzY3JpcHRvcihjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKLSAgc3RyaW5nIE9wdGlvbnNWYWx1ZShjb25zdCBzdHJpbmcmIGNsYXNzX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzZXJpYWxpemVkX29wdGlvbnMpIGNvbnN0OwotICBib29sIEdlbmVyYXRpbmdEZXNjcmlwdG9yUHJvdG8oKSBjb25zdDsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQ+Ci0gIHN0cmluZyBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yKSBjb25zdDsKLSAgc3RyaW5nIE1vZHVsZUxldmVsTWVzc2FnZU5hbWUoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7Ci0gIHN0cmluZyBNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZSgKLSAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgRGVzY3JpcHRvclQsIHR5cGVuYW1lIERlc2NyaXB0b3JQcm90b1Q+Ci0gIHZvaWQgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbCgKLSAgICAgIGNvbnN0IERlc2NyaXB0b3JUJiBkZXNjcmlwdG9yLCBEZXNjcmlwdG9yUHJvdG9UJiBwcm90bykgY29uc3Q7Ci0KLSAgdm9pZCBGaXhBbGxEZXNjcmlwdG9yT3B0aW9ucygpIGNvbnN0OwotICB2b2lkIEZpeE9wdGlvbnNGb3JGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkKSBjb25zdDsKLSAgdm9pZCBGaXhPcHRpb25zRm9yRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7Ci0gIHZvaWQgRml4T3B0aW9uc0Zvck1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7Ci0KLSAgdm9pZCBDb3B5UHVibGljRGVwZW5kZW5jaWVzQWxpYXNlcygKLSAgICAgIGNvbnN0IHN0cmluZyYgY29weV9mcm9tLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgY29uc3Q7Ci0KLSAgLy8gVmVyeSBjb2Fyc2UtZ3JhaW5lZCBsb2NrIHRvIGVuc3VyZSB0aGF0IEdlbmVyYXRlKCkgaXMgcmVlbnRyYW50LgotICAvLyBHdWFyZHMgZmlsZV8sIHByaW50ZXJfIGFuZCBmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8uCi0gIG11dGFibGUgTXV0ZXggbXV0ZXhfOwotICBtdXRhYmxlIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsgIC8vIFNldCBpbiBHZW5lcmF0ZSgpLiAgVW5kZXIgbXV0ZXhfLgotICBtdXRhYmxlIHN0cmluZyBmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF87Ci0gIG11dGFibGUgaW86OlByaW50ZXIqIHByaW50ZXJfOyAgLy8gU2V0IGluIEdlbmVyYXRlKCkuICBVbmRlciBtdXRleF8uCi0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyYXRvcik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QWVRIT05fR0VORVJBVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzZjI0NDkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8KLS8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGNvZGUgd2l0aCB0aGUgdmVyc2lvbnMgb2YgdGhpcyB0ZXN0IGluIG90aGVyIGxhbmd1YWdlcz8KLS8vICAgSXQgc2VlbWVkIGxpa2UgcGFyYW1ldGVyaXppbmcgaXQgd291bGQgYWRkIG1vcmUgY29tcGxleGl0eSB0aGFuIGl0IGlzCi0vLyAgIHdvcnRoLgotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgY29tcGlsZXIgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci1uYW1lc3BhY2UgewotCi1jbGFzcyBUZXN0R2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgVGVzdEdlbmVyYXRvcigpIHt9Ci0gIH5UZXN0R2VuZXJhdG9yKCkge30KLQotICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhcmFtZXRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJpbXBvcnRzIiwgY29udGV4dCk7Ci0gICAgVHJ5SW5zZXJ0KCJ0ZXN0X3BiMi5weSIsICJtb2R1bGVfc2NvcGUiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3RfcGIyLnB5IiwgImNsYXNzX3Njb3BlOmZvby5CYXIiLCBjb250ZXh0KTsKLSAgICBUcnlJbnNlcnQoInRlc3RfcGIyLnB5IiwgImNsYXNzX3Njb3BlOmZvby5CYXIuQmF6IiwgY29udGV4dCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICB2b2lkIFRyeUluc2VydChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCwKLSAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCkgY29uc3QgewotICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCi0gICAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCkpOwotICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOwotICAgIHByaW50ZXIuUHJpbnQoIi8vIGluc2VydGVkICRuYW1lJFxuIiwgIm5hbWUiLCBpbnNlcnRpb25fcG9pbnQpOwotICB9Ci19OwotCi0vLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCBhbGwgdGhlIGV4cGVjdGVkIGluc2VydGlvbiBwb2ludHMgZXhpc3QuICBJdCBkb2VzCi0vLyBub3QgdmVyaWZ5IHRoYXQgdGhleSBhcmUgY29ycmVjdGx5LXBsYWNlZDsgdGhhdCB3b3VsZCByZXF1aXJlIGFjdHVhbGx5Ci0vLyBjb21waWxpbmcgdGhlIG91dHB1dCB3aGljaCBpcyBhIGJpdCBtb3JlIHRoYW4gSSBjYXJlIHRvIGRvIGZvciB0aGlzIHRlc3QuCi1URVNUKFB5dGhvblBsdWdpblRlc3QsIFBsdWdpblRlc3QpIHsKLSAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlNldENvbnRlbnRzKFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3QucHJvdG8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgZm9vO1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSBCYXIge1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICBtZXNzYWdlIEJheiB7fVxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7Ci0gIGNsaS5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKLQotICBweXRob246OkdlbmVyYXRvciBweXRob25fZ2VuZXJhdG9yOwotICBUZXN0R2VuZXJhdG9yIHRlc3RfZ2VuZXJhdG9yOwotICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tcHl0aG9uX291dCIsICZweXRob25fZ2VuZXJhdG9yLCAiIik7Ci0gIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS10ZXN0X291dCIsICZ0ZXN0X2dlbmVyYXRvciwgIiIpOwotCi0gIHN0cmluZyBwcm90b19wYXRoID0gIi1JIiArIFRlc3RUZW1wRGlyKCk7Ci0gIHN0cmluZyBweXRob25fb3V0ID0gIi0tcHl0aG9uX291dD0iICsgVGVzdFRlbXBEaXIoKTsKLSAgc3RyaW5nIHRlc3Rfb3V0ID0gIi0tdGVzdF9vdXQ9IiArIFRlc3RUZW1wRGlyKCk7Ci0KLSAgY29uc3QgY2hhciogYXJndltdID0gewotICAgICJwcm90b2MiLAotICAgIHByb3RvX3BhdGguY19zdHIoKSwKLSAgICBweXRob25fb3V0LmNfc3RyKCksCi0gICAgdGVzdF9vdXQuY19zdHIoKSwKLSAgICAidGVzdC5wcm90byIKLSAgfTsKLQotICBFWFBFQ1RfRVEoMCwgY2xpLlJ1big1LCBhcmd2KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmUyNTg2Ni4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NjUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8aW9zdHJlYW0+Ci0KLSNpZm5kZWYgX1dJTjMyCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzeXMvc2VsZWN0Lmg+Ci0jaW5jbHVkZSA8c3lzL3dhaXQuaD4KLSNpbmNsdWRlIDxzaWduYWwuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgotCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBjb21waWxlciB7Ci0KLSNpZmRlZiBfV0lOMzIKLQotc3RhdGljIHZvaWQgQ2xvc2VIYW5kbGVPckRpZShIQU5ETEUgaGFuZGxlKSB7Ci0gIGlmICghQ2xvc2VIYW5kbGUoaGFuZGxlKSkgewotICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDbG9zZUhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgICAgIDw8IFN1YnByb2Nlc3M6OldpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKLSAgfQotfQotCi1TdWJwcm9jZXNzOjpTdWJwcm9jZXNzKCkKLSAgICA6IHByb2Nlc3Nfc3RhcnRfZXJyb3JfKEVSUk9SX1NVQ0NFU1MpLAotICAgICAgY2hpbGRfaGFuZGxlXyhOVUxMKSwgY2hpbGRfc3RkaW5fKE5VTEwpLCBjaGlsZF9zdGRvdXRfKE5VTEwpIHt9Ci0KLVN1YnByb2Nlc3M6On5TdWJwcm9jZXNzKCkgewotICBpZiAoY2hpbGRfc3RkaW5fICE9IE5VTEwpIHsKLSAgICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX3N0ZGluXyk7Ci0gIH0KLSAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gTlVMTCkgewotICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3Rkb3V0Xyk7Ci0gIH0KLX0KLQotdm9pZCBTdWJwcm9jZXNzOjpTdGFydChjb25zdCBzdHJpbmcmIHByb2dyYW0sIFNlYXJjaE1vZGUgc2VhcmNoX21vZGUpIHsKLSAgLy8gQ3JlYXRlIHRoZSBwaXBlcy4KLSAgSEFORExFIHN0ZGluX3BpcGVfcmVhZDsKLSAgSEFORExFIHN0ZGluX3BpcGVfd3JpdGU7Ci0gIEhBTkRMRSBzdGRvdXRfcGlwZV9yZWFkOwotICBIQU5ETEUgc3Rkb3V0X3BpcGVfd3JpdGU7Ci0KLSAgaWYgKCFDcmVhdGVQaXBlKCZzdGRpbl9waXBlX3JlYWQsICZzdGRpbl9waXBlX3dyaXRlLCBOVUxMLCAwKSkgewotICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDcmVhdGVQaXBlOiAiIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKLSAgfQotICBpZiAoIUNyZWF0ZVBpcGUoJnN0ZG91dF9waXBlX3JlYWQsICZzdGRvdXRfcGlwZV93cml0ZSwgTlVMTCwgMCkpIHsKLSAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ3JlYXRlUGlwZTogIiA8PCBXaW4zMkVycm9yTWVzc2FnZShHZXRMYXN0RXJyb3IoKSk7Ci0gIH0KLQotICAvLyBNYWtlIGNoaWxkIHNpZGUgb2YgdGhlIHBpcGVzIGluaGVyaXRhYmxlLgotICBpZiAoIVNldEhhbmRsZUluZm9ybWF0aW9uKHN0ZGluX3BpcGVfcmVhZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBIQU5ETEVfRkxBR19JTkhFUklULCBIQU5ETEVfRkxBR19JTkhFUklUKSkgewotICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJTZXRIYW5kbGVJbmZvcm1hdGlvbjogIgotICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKLSAgfQotICBpZiAoIVNldEhhbmRsZUluZm9ybWF0aW9uKHN0ZG91dF9waXBlX3dyaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEhBTkRMRV9GTEFHX0lOSEVSSVQsIEhBTkRMRV9GTEFHX0lOSEVSSVQpKSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNldEhhbmRsZUluZm9ybWF0aW9uOiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOwotICB9Ci0KLSAgLy8gU2V0dXAgU1RBUlRVUElORk8gdG8gcmVkaXJlY3QgaGFuZGxlcy4KLSAgU1RBUlRVUElORk9BIHN0YXJ0dXBfaW5mbzsKLSAgWmVyb01lbW9yeSgmc3RhcnR1cF9pbmZvLCBzaXplb2Yoc3RhcnR1cF9pbmZvKSk7Ci0gIHN0YXJ0dXBfaW5mby5jYiA9IHNpemVvZihzdGFydHVwX2luZm8pOwotICBzdGFydHVwX2luZm8uZHdGbGFncyA9IFNUQVJURl9VU0VTVERIQU5ETEVTOwotICBzdGFydHVwX2luZm8uaFN0ZElucHV0ID0gc3RkaW5fcGlwZV9yZWFkOwotICBzdGFydHVwX2luZm8uaFN0ZE91dHB1dCA9IHN0ZG91dF9waXBlX3dyaXRlOwotICBzdGFydHVwX2luZm8uaFN0ZEVycm9yID0gR2V0U3RkSGFuZGxlKFNURF9FUlJPUl9IQU5ETEUpOwotCi0gIGlmIChzdGFydHVwX2luZm8uaFN0ZEVycm9yID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkdldFN0ZEhhbmRsZTogIgotICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKLSAgfQotCi0gIC8vIENyZWF0ZVByb2Nlc3MoKSBtdXRhdGVzIGl0cyBzZWNvbmQgcGFyYW1ldGVyLiAgV1RGPwotICBjaGFyKiBuYW1lX2NvcHkgPSBzdHJkdXAocHJvZ3JhbS5jX3N0cigpKTsKLQotICAvLyBDcmVhdGUgdGhlIHByb2Nlc3MuCi0gIFBST0NFU1NfSU5GT1JNQVRJT04gcHJvY2Vzc19pbmZvOwotCi0gIGlmIChDcmVhdGVQcm9jZXNzQSgoc2VhcmNoX21vZGUgPT0gU0VBUkNIX1BBVEgpID8gTlVMTCA6IHByb2dyYW0uY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgICAgIChzZWFyY2hfbW9kZSA9PSBTRUFSQ0hfUEFUSCkgPyBuYW1lX2NvcHkgOiBOVUxMLAotICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHByb2Nlc3Mgc2VjdXJpdHkgYXR0cmlidXRlcwotICAgICAgICAgICAgICAgICAgICAgTlVMTCwgIC8vIHRocmVhZCBzZWN1cml0eSBhdHRyaWJ1dGVzCi0gICAgICAgICAgICAgICAgICAgICBUUlVFLCAgLy8gaW5oZXJpdCBoYW5kbGVzPwotICAgICAgICAgICAgICAgICAgICAgMCwgICAgIC8vIG9ic2N1cmUgY3JlYXRpb24gZmxhZ3MKLSAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBlbnZpcm9ubWVudCAoaW5oZXJpdCBmcm9tIHBhcmVudCkKLSAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAvLyBjdXJyZW50IGRpcmVjdG9yeSAoaW5oZXJpdCBmcm9tIHBhcmVudCkKLSAgICAgICAgICAgICAgICAgICAgICZzdGFydHVwX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAmcHJvY2Vzc19pbmZvKSkgewotICAgIGNoaWxkX2hhbmRsZV8gPSBwcm9jZXNzX2luZm8uaFByb2Nlc3M7Ci0gICAgQ2xvc2VIYW5kbGVPckRpZShwcm9jZXNzX2luZm8uaFRocmVhZCk7Ci0gICAgY2hpbGRfc3RkaW5fID0gc3RkaW5fcGlwZV93cml0ZTsKLSAgICBjaGlsZF9zdGRvdXRfID0gc3Rkb3V0X3BpcGVfcmVhZDsKLSAgfSBlbHNlIHsKLSAgICBwcm9jZXNzX3N0YXJ0X2Vycm9yXyA9IEdldExhc3RFcnJvcigpOwotICAgIENsb3NlSGFuZGxlT3JEaWUoc3RkaW5fcGlwZV93cml0ZSk7Ci0gICAgQ2xvc2VIYW5kbGVPckRpZShzdGRvdXRfcGlwZV9yZWFkKTsKLSAgfQotCi0gIENsb3NlSGFuZGxlT3JEaWUoc3RkaW5fcGlwZV9yZWFkKTsKLSAgQ2xvc2VIYW5kbGVPckRpZShzdGRvdXRfcGlwZV93cml0ZSk7Ci0gIGZyZWUobmFtZV9jb3B5KTsKLX0KLQotYm9vbCBTdWJwcm9jZXNzOjpDb21tdW5pY2F0ZShjb25zdCBNZXNzYWdlJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSB7Ci0gIGlmIChwcm9jZXNzX3N0YXJ0X2Vycm9yXyAhPSBFUlJPUl9TVUNDRVNTKSB7Ci0gICAgKmVycm9yID0gV2luMzJFcnJvck1lc3NhZ2UocHJvY2Vzc19zdGFydF9lcnJvcl8pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEdPT0dMRV9DSEVDSyhjaGlsZF9oYW5kbGVfICE9IE5VTEwpIDw8ICJNdXN0IGNhbGwgU3RhcnQoKSBmaXJzdC4iOwotCi0gIHN0cmluZyBpbnB1dF9kYXRhID0gaW5wdXQuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgc3RyaW5nIG91dHB1dF9kYXRhOwotCi0gIGludCBpbnB1dF9wb3MgPSAwOwotCi0gIHdoaWxlIChjaGlsZF9zdGRvdXRfICE9IE5VTEwpIHsKLSAgICBIQU5ETEUgaGFuZGxlc1syXTsKLSAgICBpbnQgaGFuZGxlX2NvdW50ID0gMDsKLQotICAgIGlmIChjaGlsZF9zdGRpbl8gIT0gTlVMTCkgewotICAgICAgaGFuZGxlc1toYW5kbGVfY291bnQrK10gPSBjaGlsZF9zdGRpbl87Ci0gICAgfQotICAgIGlmIChjaGlsZF9zdGRvdXRfICE9IE5VTEwpIHsKLSAgICAgIGhhbmRsZXNbaGFuZGxlX2NvdW50KytdID0gY2hpbGRfc3Rkb3V0XzsKLSAgICB9Ci0KLSAgICBEV09SRCB3YWl0X3Jlc3VsdCA9Ci0gICAgICAgIFdhaXRGb3JNdWx0aXBsZU9iamVjdHMoaGFuZGxlX2NvdW50LCBoYW5kbGVzLCBGQUxTRSwgSU5GSU5JVEUpOwotCi0gICAgSEFORExFIHNpZ25hbGVkX2hhbmRsZSA9IE5VTEw7Ci0gICAgaWYgKHdhaXRfcmVzdWx0ID49IFdBSVRfT0JKRUNUXzAgJiYKLSAgICAgICAgd2FpdF9yZXN1bHQgPCBXQUlUX09CSkVDVF8wICsgaGFuZGxlX2NvdW50KSB7Ci0gICAgICBzaWduYWxlZF9oYW5kbGUgPSBoYW5kbGVzW3dhaXRfcmVzdWx0IC0gV0FJVF9PQkpFQ1RfMF07Ci0gICAgfSBlbHNlIGlmICh3YWl0X3Jlc3VsdCA9PSBXQUlUX0ZBSUxFRCkgewotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIldhaXRGb3JNdWx0aXBsZU9iamVjdHM6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKLSAgICB9IGVsc2UgewotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIldhaXRGb3JNdWx0aXBsZU9iamVjdHM6IFVuZXhwZWN0ZWQgcmV0dXJuIGNvZGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgIDw8IHdhaXRfcmVzdWx0OwotICAgIH0KLQotICAgIGlmIChzaWduYWxlZF9oYW5kbGUgPT0gY2hpbGRfc3RkaW5fKSB7Ci0gICAgICBEV09SRCBuOwotICAgICAgaWYgKCFXcml0ZUZpbGUoY2hpbGRfc3RkaW5fLAotICAgICAgICAgICAgICAgICAgICAgaW5wdXRfZGF0YS5kYXRhKCkgKyBpbnB1dF9wb3MsCi0gICAgICAgICAgICAgICAgICAgICBpbnB1dF9kYXRhLnNpemUoKSAtIGlucHV0X3BvcywKLSAgICAgICAgICAgICAgICAgICAgICZuLCBOVUxMKSkgewotICAgICAgICAvLyBDaGlsZCBjbG9zZWQgcGlwZS4gIFByZXN1bWFibHkgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgbGF0ZXIuCi0gICAgICAgIC8vIFByZXRlbmQgd2UncmUgZG9uZSBmb3Igbm93LgotICAgICAgICBpbnB1dF9wb3MgPSBpbnB1dF9kYXRhLnNpemUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlucHV0X3BvcyArPSBuOwotICAgICAgfQotCi0gICAgICBpZiAoaW5wdXRfcG9zID09IGlucHV0X2RhdGEuc2l6ZSgpKSB7Ci0gICAgICAgIC8vIFdlJ3JlIGRvbmUgd3JpdGluZy4gIENsb3NlLgotICAgICAgICBDbG9zZUhhbmRsZU9yRGllKGNoaWxkX3N0ZGluXyk7Ci0gICAgICAgIGNoaWxkX3N0ZGluXyA9IE5VTEw7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChzaWduYWxlZF9oYW5kbGUgPT0gY2hpbGRfc3Rkb3V0XykgewotICAgICAgY2hhciBidWZmZXJbNDA5Nl07Ci0gICAgICBEV09SRCBuOwotCi0gICAgICBpZiAoIVJlYWRGaWxlKGNoaWxkX3N0ZG91dF8sIGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksICZuLCBOVUxMKSkgewotICAgICAgICAvLyBXZSdyZSBkb25lIHJlYWRpbmcuICBDbG9zZS4KLSAgICAgICAgQ2xvc2VIYW5kbGVPckRpZShjaGlsZF9zdGRvdXRfKTsKLSAgICAgICAgY2hpbGRfc3Rkb3V0XyA9IE5VTEw7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXRwdXRfZGF0YS5hcHBlbmQoYnVmZmVyLCBuKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoY2hpbGRfc3RkaW5fICE9IE5VTEwpIHsKLSAgICAvLyBDaGlsZCBkaWQgbm90IGZpbmlzaCByZWFkaW5nIGlucHV0IGJlZm9yZSBpdCBjbG9zZWQgdGhlIG91dHB1dC4KLSAgICAvLyBQcmVzdW1hYmx5IGl0IGV4aXRlZCB3aXRoIGFuIGVycm9yLgotICAgIENsb3NlSGFuZGxlT3JEaWUoY2hpbGRfc3RkaW5fKTsKLSAgICBjaGlsZF9zdGRpbl8gPSBOVUxMOwotICB9Ci0KLSAgRFdPUkQgd2FpdF9yZXN1bHQgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KGNoaWxkX2hhbmRsZV8sIElORklOSVRFKTsKLQotICBpZiAod2FpdF9yZXN1bHQgPT0gV0FJVF9GQUlMRUQpIHsKLSAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiV2FpdEZvclNpbmdsZU9iamVjdDogIgotICAgICAgICAgICAgICAgICAgICAgIDw8IFdpbjMyRXJyb3JNZXNzYWdlKEdldExhc3RFcnJvcigpKTsKLSAgfSBlbHNlIGlmICh3YWl0X3Jlc3VsdCAhPSBXQUlUX09CSkVDVF8wKSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIldhaXRGb3JTaW5nbGVPYmplY3Q6IFVuZXhwZWN0ZWQgcmV0dXJuIGNvZGU6ICIKLSAgICAgICAgICAgICAgICAgICAgICA8PCB3YWl0X3Jlc3VsdDsKLSAgfQotCi0gIERXT1JEIGV4aXRfY29kZTsKLSAgaWYgKCFHZXRFeGl0Q29kZVByb2Nlc3MoY2hpbGRfaGFuZGxlXywgJmV4aXRfY29kZSkpIHsKLSAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiR2V0RXhpdENvZGVQcm9jZXNzOiAiCi0gICAgICAgICAgICAgICAgICAgICAgPDwgV2luMzJFcnJvck1lc3NhZ2UoR2V0TGFzdEVycm9yKCkpOwotICB9Ci0KLSAgQ2xvc2VIYW5kbGVPckRpZShjaGlsZF9oYW5kbGVfKTsKLSAgY2hpbGRfaGFuZGxlXyA9IE5VTEw7Ci0KLSAgaWYgKGV4aXRfY29kZSAhPSAwKSB7Ci0gICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICAgIlBsdWdpbiBmYWlsZWQgd2l0aCBzdGF0dXMgY29kZSAkMC4iLCBleGl0X2NvZGUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICghb3V0cHV0LT5QYXJzZUZyb21TdHJpbmcob3V0cHV0X2RhdGEpKSB7Ci0gICAgKmVycm9yID0gIlBsdWdpbiBvdXRwdXQgaXMgdW5wYXJzZWFibGU6ICIgKyBDRXNjYXBlKG91dHB1dF9kYXRhKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotc3RyaW5nIFN1YnByb2Nlc3M6OldpbjMyRXJyb3JNZXNzYWdlKERXT1JEIGVycm9yX2NvZGUpIHsKLSAgY2hhciogbWVzc2FnZTsKLQotICAvLyBXVEY/Ci0gIEZvcm1hdE1lc3NhZ2UoRk9STUFUX01FU1NBR0VfQUxMT0NBVEVfQlVGRkVSIHwKLSAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NZU1RFTSB8Ci0gICAgICAgICAgICAgICAgRk9STUFUX01FU1NBR0VfSUdOT1JFX0lOU0VSVFMsCi0gICAgICAgICAgICAgICAgTlVMTCwgZXJyb3JfY29kZSwgMCwKLSAgICAgICAgICAgICAgICAoTFBUU1RSKSZtZXNzYWdlLCAgLy8gTk9UIEEgQlVHIQotICAgICAgICAgICAgICAgIDAsIE5VTEwpOwotCi0gIHN0cmluZyByZXN1bHQgPSBtZXNzYWdlOwotICBMb2NhbEZyZWUobWVzc2FnZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2Vsc2UgIC8vIF9XSU4zMgotCi1TdWJwcm9jZXNzOjpTdWJwcm9jZXNzKCkKLSAgICA6IGNoaWxkX3BpZF8oLTEpLCBjaGlsZF9zdGRpbl8oLTEpLCBjaGlsZF9zdGRvdXRfKC0xKSB7fQotCi1TdWJwcm9jZXNzOjp+U3VicHJvY2VzcygpIHsKLSAgaWYgKGNoaWxkX3N0ZGluXyAhPSAtMSkgewotICAgIGNsb3NlKGNoaWxkX3N0ZGluXyk7Ci0gIH0KLSAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gLTEpIHsKLSAgICBjbG9zZShjaGlsZF9zdGRvdXRfKTsKLSAgfQotfQotCi12b2lkIFN1YnByb2Nlc3M6OlN0YXJ0KGNvbnN0IHN0cmluZyYgcHJvZ3JhbSwgU2VhcmNoTW9kZSBzZWFyY2hfbW9kZSkgewotICAvLyBOb3RlIHRoYXQgd2UgYXNzdW1lIHRoYXQgdGhlcmUgYXJlIG5vIG90aGVyIHRocmVhZHMsIHRodXMgd2UgZG9uJ3QgaGF2ZSB0bwotICAvLyBkbyBjcmF6eSBzdHVmZiBsaWtlIHVzaW5nIHNvY2tldCBwYWlycyBvciBhdm9pZGluZyBsaWJjIGxvY2tzLgotCi0gIC8vIFswXSBpcyByZWFkIGVuZCwgWzFdIGlzIHdyaXRlIGVuZC4KLSAgaW50IHN0ZGluX3BpcGVbMl07Ci0gIGludCBzdGRvdXRfcGlwZVsyXTsKLQotICBHT09HTEVfQ0hFQ0socGlwZShzdGRpbl9waXBlKSAhPSAtMSk7Ci0gIEdPT0dMRV9DSEVDSyhwaXBlKHN0ZG91dF9waXBlKSAhPSAtMSk7Ci0KLSAgY2hhciogYXJndlsyXSA9IHsgc3RyZHVwKHByb2dyYW0uY19zdHIoKSksIE5VTEwgfTsKLQotICBjaGlsZF9waWRfID0gZm9yaygpOwotICBpZiAoY2hpbGRfcGlkXyA9PSAtMSkgewotICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJmb3JrOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgfSBlbHNlIGlmIChjaGlsZF9waWRfID09IDApIHsKLSAgICAvLyBXZSBhcmUgdGhlIGNoaWxkLgotICAgIGR1cDIoc3RkaW5fcGlwZVswXSwgU1RESU5fRklMRU5PKTsKLSAgICBkdXAyKHN0ZG91dF9waXBlWzFdLCBTVERPVVRfRklMRU5PKTsKLQotICAgIGNsb3NlKHN0ZGluX3BpcGVbMF0pOwotICAgIGNsb3NlKHN0ZGluX3BpcGVbMV0pOwotICAgIGNsb3NlKHN0ZG91dF9waXBlWzBdKTsKLSAgICBjbG9zZShzdGRvdXRfcGlwZVsxXSk7Ci0KLSAgICBzd2l0Y2ggKHNlYXJjaF9tb2RlKSB7Ci0gICAgICBjYXNlIFNFQVJDSF9QQVRIOgotICAgICAgICBleGVjdnAoYXJndlswXSwgYXJndik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBFWEFDVF9OQU1FOgotICAgICAgICBleGVjdihhcmd2WzBdLCBhcmd2KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgLy8gV3JpdGUgZGlyZWN0bHkgdG8gU1RERVJSX0ZJTEVOTyB0byBhdm9pZCBzdGRpbyBjb2RlIHBhdGhzIHRoYXQgbWF5IGRvCi0gICAgLy8gc3R1ZmYgdGhhdCBpcyB1bnNhZmUgaGVyZS4KLSAgICBpbnQgaWdub3JlZDsKLSAgICBpZ25vcmVkID0gd3JpdGUoU1RERVJSX0ZJTEVOTywgYXJndlswXSwgc3RybGVuKGFyZ3ZbMF0pKTsKLSAgICBjb25zdCBjaGFyKiBtZXNzYWdlID0gIjogcHJvZ3JhbSBub3QgZm91bmQgb3IgaXMgbm90IGV4ZWN1dGFibGVcbiI7Ci0gICAgaWdub3JlZCA9IHdyaXRlKFNUREVSUl9GSUxFTk8sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7Ci0gICAgKHZvaWQpIGlnbm9yZWQ7Ci0KLSAgICAvLyBNdXN0IHVzZSBfZXhpdCgpIHJhdGhlciB0aGFuIGV4aXQoKSB0byBhdm9pZCBmbHVzaGluZyBvdXRwdXQgYnVmZmVycwotICAgIC8vIHRoYXQgd2lsbCBhbHNvIGJlIGZsdXNoZWQgYnkgdGhlIHBhcmVudC4KLSAgICBfZXhpdCgxKTsKLSAgfSBlbHNlIHsKLSAgICBmcmVlKGFyZ3ZbMF0pOwotCi0gICAgY2xvc2Uoc3RkaW5fcGlwZVswXSk7Ci0gICAgY2xvc2Uoc3Rkb3V0X3BpcGVbMV0pOwotCi0gICAgY2hpbGRfc3RkaW5fID0gc3RkaW5fcGlwZVsxXTsKLSAgICBjaGlsZF9zdGRvdXRfID0gc3Rkb3V0X3BpcGVbMF07Ci0gIH0KLX0KLQotYm9vbCBTdWJwcm9jZXNzOjpDb21tdW5pY2F0ZShjb25zdCBNZXNzYWdlJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSB7Ci0KLSAgR09PR0xFX0NIRUNLX05FKGNoaWxkX3N0ZGluXywgLTEpIDw8ICJNdXN0IGNhbGwgU3RhcnQoKSBmaXJzdC4iOwotCi0gIC8vIFRoZSAic2lnaGFuZGxlcl90IiB0eXBlZGVmIGlzIEdOVS1zcGVjaWZpYywgc28gZGVmaW5lIG91ciBvd24uCi0gIHR5cGVkZWYgdm9pZCBTaWduYWxIYW5kbGVyKGludCk7Ci0KLSAgLy8gTWFrZSBzdXJlIFNJR1BJUEUgaXMgZGlzYWJsZWQgc28gdGhhdCBpZiB0aGUgY2hpbGQgZGllcyBpdCBkb2Vzbid0IGtpbGwgdXMuCi0gIFNpZ25hbEhhbmRsZXIqIG9sZF9waXBlX2hhbmRsZXIgPSBzaWduYWwoU0lHUElQRSwgU0lHX0lHTik7Ci0KLSAgc3RyaW5nIGlucHV0X2RhdGEgPSBpbnB1dC5TZXJpYWxpemVBc1N0cmluZygpOwotICBzdHJpbmcgb3V0cHV0X2RhdGE7Ci0KLSAgaW50IGlucHV0X3BvcyA9IDA7Ci0gIGludCBtYXhfZmQgPSBzdGQ6Om1heChjaGlsZF9zdGRpbl8sIGNoaWxkX3N0ZG91dF8pOwotCi0gIHdoaWxlIChjaGlsZF9zdGRvdXRfICE9IC0xKSB7Ci0gICAgZmRfc2V0IHJlYWRfZmRzOwotICAgIGZkX3NldCB3cml0ZV9mZHM7Ci0gICAgRkRfWkVSTygmcmVhZF9mZHMpOwotICAgIEZEX1pFUk8oJndyaXRlX2Zkcyk7Ci0gICAgaWYgKGNoaWxkX3N0ZG91dF8gIT0gLTEpIHsKLSAgICAgIEZEX1NFVChjaGlsZF9zdGRvdXRfLCAmcmVhZF9mZHMpOwotICAgIH0KLSAgICBpZiAoY2hpbGRfc3RkaW5fICE9IC0xKSB7Ci0gICAgICBGRF9TRVQoY2hpbGRfc3RkaW5fLCAmd3JpdGVfZmRzKTsKLSAgICB9Ci0KLSAgICBpZiAoc2VsZWN0KG1heF9mZCArIDEsICZyZWFkX2ZkcywgJndyaXRlX2ZkcywgTlVMTCwgTlVMTCkgPCAwKSB7Ci0gICAgICBpZiAoZXJybm8gPT0gRUlOVFIpIHsKLSAgICAgICAgLy8gSW50ZXJydXB0ZWQgYnkgc2lnbmFsLiAgVHJ5IGFnYWluLgotICAgICAgICBjb250aW51ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJzZWxlY3Q6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChjaGlsZF9zdGRpbl8gIT0gLTEgJiYgRkRfSVNTRVQoY2hpbGRfc3RkaW5fLCAmd3JpdGVfZmRzKSkgewotICAgICAgaW50IG4gPSB3cml0ZShjaGlsZF9zdGRpbl8sIGlucHV0X2RhdGEuZGF0YSgpICsgaW5wdXRfcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0X2RhdGEuc2l6ZSgpIC0gaW5wdXRfcG9zKTsKLSAgICAgIGlmIChuIDwgMCkgewotICAgICAgICAvLyBDaGlsZCBjbG9zZWQgcGlwZS4gIFByZXN1bWFibHkgaXQgd2lsbCByZXBvcnQgYW4gZXJyb3IgbGF0ZXIuCi0gICAgICAgIC8vIFByZXRlbmQgd2UncmUgZG9uZSBmb3Igbm93LgotICAgICAgICBpbnB1dF9wb3MgPSBpbnB1dF9kYXRhLnNpemUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlucHV0X3BvcyArPSBuOwotICAgICAgfQotCi0gICAgICBpZiAoaW5wdXRfcG9zID09IGlucHV0X2RhdGEuc2l6ZSgpKSB7Ci0gICAgICAgIC8vIFdlJ3JlIGRvbmUgd3JpdGluZy4gIENsb3NlLgotICAgICAgICBjbG9zZShjaGlsZF9zdGRpbl8pOwotICAgICAgICBjaGlsZF9zdGRpbl8gPSAtMTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoY2hpbGRfc3Rkb3V0XyAhPSAtMSAmJiBGRF9JU1NFVChjaGlsZF9zdGRvdXRfLCAmcmVhZF9mZHMpKSB7Ci0gICAgICBjaGFyIGJ1ZmZlcls0MDk2XTsKLSAgICAgIGludCBuID0gcmVhZChjaGlsZF9zdGRvdXRfLCBidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLQotICAgICAgaWYgKG4gPiAwKSB7Ci0gICAgICAgIG91dHB1dF9kYXRhLmFwcGVuZChidWZmZXIsIG4pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gV2UncmUgZG9uZSByZWFkaW5nLiAgQ2xvc2UuCi0gICAgICAgIGNsb3NlKGNoaWxkX3N0ZG91dF8pOwotICAgICAgICBjaGlsZF9zdGRvdXRfID0gLTE7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGNoaWxkX3N0ZGluXyAhPSAtMSkgewotICAgIC8vIENoaWxkIGRpZCBub3QgZmluaXNoIHJlYWRpbmcgaW5wdXQgYmVmb3JlIGl0IGNsb3NlZCB0aGUgb3V0cHV0LgotICAgIC8vIFByZXN1bWFibHkgaXQgZXhpdGVkIHdpdGggYW4gZXJyb3IuCi0gICAgY2xvc2UoY2hpbGRfc3RkaW5fKTsKLSAgICBjaGlsZF9zdGRpbl8gPSAtMTsKLSAgfQotCi0gIGludCBzdGF0dXM7Ci0gIHdoaWxlICh3YWl0cGlkKGNoaWxkX3BpZF8sICZzdGF0dXMsIDApID09IC0xKSB7Ci0gICAgaWYgKGVycm5vICE9IEVJTlRSKSB7Ci0gICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAid2FpdHBpZDogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gUmVzdG9yZSBTSUdQSVBFIGhhbmRsaW5nLgotICBzaWduYWwoU0lHUElQRSwgb2xkX3BpcGVfaGFuZGxlcik7Ci0KLSAgaWYgKFdJRkVYSVRFRChzdGF0dXMpKSB7Ci0gICAgaWYgKFdFWElUU1RBVFVTKHN0YXR1cykgIT0gMCkgewotICAgICAgaW50IGVycm9yX2NvZGUgPSBXRVhJVFNUQVRVUyhzdGF0dXMpOwotICAgICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICAgICAiUGx1Z2luIGZhaWxlZCB3aXRoIHN0YXR1cyBjb2RlICQwLiIsIGVycm9yX2NvZGUpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIGlmIChXSUZTSUdOQUxFRChzdGF0dXMpKSB7Ci0gICAgaW50IHNpZ25hbCA9IFdURVJNU0lHKHN0YXR1cyk7Ci0gICAgKmVycm9yID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICAgIlBsdWdpbiBraWxsZWQgYnkgc2lnbmFsICQwLiIsIHNpZ25hbCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgICplcnJvciA9ICJOZWl0aGVyIFdFWElUU1RBVFVTIG5vciBXVEVSTVNJRyBpcyB0cnVlPyI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKCFvdXRwdXQtPlBhcnNlRnJvbVN0cmluZyhvdXRwdXRfZGF0YSkpIHsKLSAgICAqZXJyb3IgPSAiUGx1Z2luIG91dHB1dCBpcyB1bnBhcnNlYWJsZTogIiArIENFc2NhcGUob3V0cHV0X2RhdGEpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi0jZW5kaWYgIC8vICFfV0lOMzIKLQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDI1MTM4NjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxMDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfU1VCUFJPQ0VTU19IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX1NVQlBST0NFU1NfSF9fCi0KLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgV0lOMzJfTEVBTl9BTkRfTUVBTiAgIC8vIHJpZ2h0Li4uCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2Vsc2UgIC8vIF9XSU4zMgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmICAvLyAhX1dJTjMyCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi0jaW5jbHVkZSA8c3RyaW5nPgotCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotY2xhc3MgTWVzc2FnZTsKLQotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotLy8gVXRpbGl0eSBjbGFzcyBmb3IgbGF1bmNoaW5nIHN1Yi1wcm9jZXNzZXMuCi1jbGFzcyBMSUJQUk9UT0NfRVhQT1JUIFN1YnByb2Nlc3MgewotIHB1YmxpYzoKLSAgU3VicHJvY2VzcygpOwotICB+U3VicHJvY2VzcygpOwotCi0gIGVudW0gU2VhcmNoTW9kZSB7Ci0gICAgU0VBUkNIX1BBVEgsICAgLy8gVXNlIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gICAgRVhBQ1RfTkFNRSAgICAgLy8gUHJvZ3JhbSBpcyBhbiBleGFjdCBmaWxlIG5hbWU7IGRvbid0IHVzZSB0aGUgUEFUSC4KLSAgfTsKLQotICAvLyBTdGFydCB0aGUgc3VicHJvY2Vzcy4gIEN1cnJlbnRseSB3ZSBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHNwZWNpZnkKLSAgLy8gYXJndW1lbnRzIGFzIHByb3RvYyBwbHVnaW5zIGRvbid0IGhhdmUgYW55LgotICB2b2lkIFN0YXJ0KGNvbnN0IHN0cmluZyYgcHJvZ3JhbSwgU2VhcmNoTW9kZSBzZWFyY2hfbW9kZSk7Ci0KLSAgLy8gU2VyaWFsaXplIHRoZSBpbnB1dCBtZXNzYWdlIGFuZCBwaXBlIGl0IHRvIHRoZSBzdWJwcm9jZXNzJ3Mgc3RkaW4sIHRoZW4KLSAgLy8gY2xvc2UgdGhlIHBpcGUuICBNZWFud2hpbGUsIHJlYWQgZnJvbSB0aGUgc3VicHJvY2VzcydzIHN0ZG91dCBhbmQgcGFyc2UKLSAgLy8gdGhlIGRhdGEgaW50byAqb3V0cHV0LiAgQWxsIHRoaXMgaXMgZG9uZSBjYXJlZnVsbHkgdG8gYXZvaWQgZGVhZGxvY2tzLgotICAvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4gIE9uIGFueSBzb3J0IG9mIGVycm9yLCByZXR1cm5zIGZhbHNlIGFuZCBzZXRzCi0gIC8vICplcnJvciB0byBhIGRlc2NyaXB0aW9uIG9mIHRoZSBwcm9ibGVtLgotICBib29sIENvbW11bmljYXRlKGNvbnN0IE1lc3NhZ2UmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQsIHN0cmluZyogZXJyb3IpOwotCi0jaWZkZWYgX1dJTjMyCi0gIC8vIEdpdmVuIGFuIGVycm9yIGNvZGUsIHJldHVybnMgYSBodW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLiAgVGhpcyBpcwotICAvLyBkZWZpbmVkIGhlcmUgc28gdGhhdCBDb21tYW5kTGluZUludGVyZmFjZSBjYW4gc2hhcmUgaXQuCi0gIHN0YXRpYyBzdHJpbmcgV2luMzJFcnJvck1lc3NhZ2UoRFdPUkQgZXJyb3JfY29kZSk7Ci0jZW5kaWYKLQotIHByaXZhdGU6Ci0jaWZkZWYgX1dJTjMyCi0gIERXT1JEIHByb2Nlc3Nfc3RhcnRfZXJyb3JfOwotICBIQU5ETEUgY2hpbGRfaGFuZGxlXzsKLQotICAvLyBUaGUgZmlsZSBoYW5kbGVzIGZvciBvdXIgZW5kIG9mIHRoZSBjaGlsZCdzIHBpcGVzLiAgV2UgY2xvc2UgZWFjaCBhbmQKLSAgLy8gc2V0IGl0IHRvIE5VTEwgd2hlbiBubyBsb25nZXIgbmVlZGVkLgotICBIQU5ETEUgY2hpbGRfc3RkaW5fOwotICBIQU5ETEUgY2hpbGRfc3Rkb3V0XzsKLQotI2Vsc2UgIC8vIF9XSU4zMgotICBwaWRfdCBjaGlsZF9waWRfOwotCi0gIC8vIFRoZSBmaWxlIGRlc2NyaXB0b3JzIGZvciBvdXIgZW5kIG9mIHRoZSBjaGlsZCdzIHBpcGVzLiAgV2UgY2xvc2UgZWFjaCBhbmQKLSAgLy8gc2V0IGl0IHRvIC0xIHdoZW4gbm8gbG9uZ2VyIG5lZWRlZC4KLSAgaW50IGNoaWxkX3N0ZGluXzsKLSAgaW50IGNoaWxkX3N0ZG91dF87Ci0KLSNlbmRpZiAgLy8gIV9XSU4zMgotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfU1VCUFJPQ0VTU19IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3Rlc3RfcGx1Z2luLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0ODMwZmQ3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8KLS8vIFRoaXMgaXMgYSBkdW1teSBjb2RlIGdlbmVyYXRvciBwbHVnaW4gdXNlZCBieQotLy8gY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC4KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi1pbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7Ci0jaWZkZWYgX01TQ19WRVIKLSAgLy8gRG9uJ3QgcHJpbnQgYSBzaWxseSBtZXNzYWdlIG9yIHN0aWNrIGEgbW9kYWwgZGlhbG9nIGJveCBpbiBteSBmYWNlLAotICAvLyBwbGVhc2UuCi0gIF9zZXRfYWJvcnRfYmVoYXZpb3IoMCwgfjApOwotI2VuZGlmICAvLyAhX01TQ19WRVIKLQotICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6TW9ja0NvZGVHZW5lcmF0b3IgZ2VuZXJhdG9yKCJ0ZXN0X3BsdWdpbiIpOwotICByZXR1cm4gZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OlBsdWdpbk1haW4oYXJnYywgYXJndiwgJmdlbmVyYXRvcik7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDZmYzcxMzYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfb3V0cHV0X3VuaXR0ZXN0LnNoCisrKyAvZGV2L251bGwKQEAgLTEsOTEgKzAsMCBAQAotIyEvYmluL3NoCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSMgQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotIwotIyBUZXN0IHByb3RvYydzIHppcCBvdXRwdXQgbW9kZS4KLQotZmFpbCgpIHsKLSAgZWNobyAiJEAiID4mMgotICBleGl0IDEKLX0KLQotVEVTVF9UTVBESVI9LgotUFJPVE9DPS4vcHJvdG9jCi0KLWVjaG8gJwotICBzeW50YXggPSAicHJvdG8yIjsKLSAgb3B0aW9uIGphdmFfbXVsdGlwbGVfZmlsZXMgPSB0cnVlOwotICBvcHRpb24gamF2YV9wYWNrYWdlID0gInRlc3QuamFyIjsKLSAgb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIk91dGVyIjsKLSAgbWVzc2FnZSBGb28ge30KLSAgbWVzc2FnZSBCYXIge30KLScgPiAkVEVTVF9UTVBESVIvdGVzdHppcC5wcm90bwotCi0kUFJPVE9DIFwKLSAgICAtLWNwcF9vdXQ9JFRFU1RfVE1QRElSL3Rlc3R6aXAuemlwIC0tcHl0aG9uX291dD0kVEVTVF9UTVBESVIvdGVzdHppcC56aXAgXAotICAgIC0tamF2YV9vdXQ9JFRFU1RfVE1QRElSL3Rlc3R6aXAuamFyIC1JJFRFU1RfVE1QRElSIHRlc3R6aXAucHJvdG8gXAotICAgIHx8IGZhaWwgJ3Byb3RvYyBmYWlsZWQuJwotCi1lY2hvICJUZXN0aW5nIG91dHB1dCB0byB6aXAuLi4iCi1pZiB1bnppcCAtaCA+IC9kZXYvbnVsbDsgdGhlbgotICB1bnppcCAtdCAkVEVTVF9UTVBESVIvdGVzdHppcC56aXAgPiAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0IHx8IGZhaWwgJ3VuemlwIGZhaWxlZC4nCi0KLSAgZ3JlcCAndGVzdGluZzogdGVzdHppcFwucGJcLmNjICpPSyQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAotICAgIHx8IGZhaWwgJ3Rlc3R6aXAucGIuY2Mgbm90IGZvdW5kIGluIG91dHB1dCB6aXAuJwotICBncmVwICd0ZXN0aW5nOiB0ZXN0emlwXC5wYlwuaCAqT0skJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKLSAgICB8fCBmYWlsICd0ZXN0emlwLnBiLmggbm90IGZvdW5kIGluIG91dHB1dCB6aXAuJwotICBncmVwICd0ZXN0aW5nOiB0ZXN0emlwX3BiMlwucHkgKk9LJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCi0gICAgfHwgZmFpbCAndGVzdHppcF9wYjIucHkgbm90IGZvdW5kIGluIG91dHB1dCB6aXAuJwotICBncmVwIC1pICdtYW5pZmVzdCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCi0gICAgJiYgZmFpbCAnWmlwIGZpbGUgY29udGFpbmVkIG1hbmlmZXN0LicKLWVsc2UKLSAgZWNobyAiV2FybmluZzogICd1bnppcCcgY29tbWFuZCBub3QgYXZhaWxhYmxlLiAgU2tpcHBpbmcgdGVzdC4iCi1maQotCi1lY2hvICJUZXN0aW5nIG91dHB1dCB0byBqYXIuLi4iCi1pZiBqYXIgYyAkVEVTVF9UTVBESVIvdGVzdHppcC5wcm90byA+IC9kZXYvbnVsbDsgdGhlbgotICBqYXIgdGYgJFRFU1RfVE1QRElSL3Rlc3R6aXAuamFyID4gJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCB8fCBmYWlsICdqYXIgZmFpbGVkLicKLQotICBncmVwICdedGVzdC9qYXIvRm9vXC5qYXZhJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCi0gICAgfHwgZmFpbCAnRm9vLmphdmEgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJwotICBncmVwICdedGVzdC9qYXIvQmFyXC5qYXZhJCcgJFRFU1RfVE1QRElSL3Rlc3R6aXAubGlzdCA+IC9kZXYvbnVsbCBcCi0gICAgfHwgZmFpbCAnQmFyLmphdmEgbm90IGZvdW5kIGluIG91dHB1dCBqYXIuJwotICBncmVwICdedGVzdC9qYXIvT3V0ZXJcLmphdmEkJyAkVEVTVF9UTVBESVIvdGVzdHppcC5saXN0ID4gL2Rldi9udWxsIFwKLSAgICB8fCBmYWlsICdPdXRlci5qYXZhIG5vdCBmb3VuZCBpbiBvdXRwdXQgamFyLicKLSAgZ3JlcCAnXk1FVEEtSU5GL01BTklGRVNUXC5NRiQnICRURVNUX1RNUERJUi90ZXN0emlwLmxpc3QgPiAvZGV2L251bGwgXAotICAgIHx8IGZhaWwgJ01hbmlmZXN0IG5vdCBmb3VuZCBpbiBvdXRwdXQgamFyLicKLWVsc2UKLSAgZWNobyAiV2FybmluZzogICdqYXInIGNvbW1hbmQgbm90IGF2YWlsYWJsZS4gIFNraXBwaW5nIHRlc3QuIgotZmkKLQotZWNobyBQQVNTCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ1OGNjZWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjE4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBhbWJyb3NlQGdvb2dsZS5jb20gKEFtYnJvc2UgRmVpbnN0ZWluKSwKLS8vICAgICAgICAga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vCi0vLyBCYXNlZCBvbiBodHRwOi8vd3d3LnBrd2FyZS5jb20vZG9jdW1lbnRzL2Nhc2VzdHVkaWVzL0FQUE5PVEUuVFhUCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotc3RhdGljIGNvbnN0IHVpbnQzMiBrQ1JDMzJUYWJsZVsyNTZdID0gewotICAweDAwMDAwMDAwLCAweDc3MDczMDk2LCAweGVlMGU2MTJjLCAweDk5MDk1MWJhLCAweDA3NmRjNDE5LCAweDcwNmFmNDhmLAotICAweGU5NjNhNTM1LCAweDllNjQ5NWEzLCAweDBlZGI4ODMyLCAweDc5ZGNiOGE0LCAweGUwZDVlOTFlLCAweDk3ZDJkOTg4LAotICAweDA5YjY0YzJiLCAweDdlYjE3Y2JkLCAweGU3YjgyZDA3LCAweDkwYmYxZDkxLCAweDFkYjcxMDY0LCAweDZhYjAyMGYyLAotICAweGYzYjk3MTQ4LCAweDg0YmU0MWRlLCAweDFhZGFkNDdkLCAweDZkZGRlNGViLCAweGY0ZDRiNTUxLCAweDgzZDM4NWM3LAotICAweDEzNmM5ODU2LCAweDY0NmJhOGMwLCAweGZkNjJmOTdhLCAweDhhNjVjOWVjLCAweDE0MDE1YzRmLCAweDYzMDY2Y2Q5LAotICAweGZhMGYzZDYzLCAweDhkMDgwZGY1LCAweDNiNmUyMGM4LCAweDRjNjkxMDVlLCAweGQ1NjA0MWU0LCAweGEyNjc3MTcyLAotICAweDNjMDNlNGQxLCAweDRiMDRkNDQ3LCAweGQyMGQ4NWZkLCAweGE1MGFiNTZiLCAweDM1YjVhOGZhLCAweDQyYjI5ODZjLAotICAweGRiYmJjOWQ2LCAweGFjYmNmOTQwLCAweDMyZDg2Y2UzLCAweDQ1ZGY1Yzc1LCAweGRjZDYwZGNmLCAweGFiZDEzZDU5LAotICAweDI2ZDkzMGFjLCAweDUxZGUwMDNhLCAweGM4ZDc1MTgwLCAweGJmZDA2MTE2LCAweDIxYjRmNGI1LCAweDU2YjNjNDIzLAotICAweGNmYmE5NTk5LCAweGI4YmRhNTBmLCAweDI4MDJiODllLCAweDVmMDU4ODA4LCAweGM2MGNkOWIyLCAweGIxMGJlOTI0LAotICAweDJmNmY3Yzg3LCAweDU4Njg0YzExLCAweGMxNjExZGFiLCAweGI2NjYyZDNkLCAweDc2ZGM0MTkwLCAweDAxZGI3MTA2LAotICAweDk4ZDIyMGJjLCAweGVmZDUxMDJhLCAweDcxYjE4NTg5LCAweDA2YjZiNTFmLCAweDlmYmZlNGE1LCAweGU4YjhkNDMzLAotICAweDc4MDdjOWEyLCAweDBmMDBmOTM0LCAweDk2MDlhODhlLCAweGUxMGU5ODE4LCAweDdmNmEwZGJiLCAweDA4NmQzZDJkLAotICAweDkxNjQ2Yzk3LCAweGU2NjM1YzAxLCAweDZiNmI1MWY0LCAweDFjNmM2MTYyLCAweDg1NjUzMGQ4LCAweGYyNjIwMDRlLAotICAweDZjMDY5NWVkLCAweDFiMDFhNTdiLCAweDgyMDhmNGMxLCAweGY1MGZjNDU3LCAweDY1YjBkOWM2LCAweDEyYjdlOTUwLAotICAweDhiYmViOGVhLCAweGZjYjk4ODdjLCAweDYyZGQxZGRmLCAweDE1ZGEyZDQ5LCAweDhjZDM3Y2YzLCAweGZiZDQ0YzY1LAotICAweDRkYjI2MTU4LCAweDNhYjU1MWNlLCAweGEzYmMwMDc0LCAweGQ0YmIzMGUyLCAweDRhZGZhNTQxLCAweDNkZDg5NWQ3LAotICAweGE0ZDFjNDZkLCAweGQzZDZmNGZiLCAweDQzNjllOTZhLCAweDM0NmVkOWZjLCAweGFkNjc4ODQ2LCAweGRhNjBiOGQwLAotICAweDQ0MDQyZDczLCAweDMzMDMxZGU1LCAweGFhMGE0YzVmLCAweGRkMGQ3Y2M5LCAweDUwMDU3MTNjLCAweDI3MDI0MWFhLAotICAweGJlMGIxMDEwLCAweGM5MGMyMDg2LCAweDU3NjhiNTI1LCAweDIwNmY4NWIzLCAweGI5NjZkNDA5LCAweGNlNjFlNDlmLAotICAweDVlZGVmOTBlLCAweDI5ZDljOTk4LCAweGIwZDA5ODIyLCAweGM3ZDdhOGI0LCAweDU5YjMzZDE3LCAweDJlYjQwZDgxLAotICAweGI3YmQ1YzNiLCAweGMwYmE2Y2FkLCAweGVkYjg4MzIwLCAweDlhYmZiM2I2LCAweDAzYjZlMjBjLCAweDc0YjFkMjlhLAotICAweGVhZDU0NzM5LCAweDlkZDI3N2FmLCAweDA0ZGIyNjE1LCAweDczZGMxNjgzLCAweGUzNjMwYjEyLCAweDk0NjQzYjg0LAotICAweDBkNmQ2YTNlLCAweDdhNmE1YWE4LCAweGU0MGVjZjBiLCAweDkzMDlmZjlkLCAweDBhMDBhZTI3LCAweDdkMDc5ZWIxLAotICAweGYwMGY5MzQ0LCAweDg3MDhhM2QyLCAweDFlMDFmMjY4LCAweDY5MDZjMmZlLCAweGY3NjI1NzVkLCAweDgwNjU2N2NiLAotICAweDE5NmMzNjcxLCAweDZlNmIwNmU3LCAweGZlZDQxYjc2LCAweDg5ZDMyYmUwLCAweDEwZGE3YTVhLCAweDY3ZGQ0YWNjLAotICAweGY5YjlkZjZmLCAweDhlYmVlZmY5LCAweDE3YjdiZTQzLCAweDYwYjA4ZWQ1LCAweGQ2ZDZhM2U4LCAweGExZDE5MzdlLAotICAweDM4ZDhjMmM0LCAweDRmZGZmMjUyLCAweGQxYmI2N2YxLCAweGE2YmM1NzY3LCAweDNmYjUwNmRkLCAweDQ4YjIzNjRiLAotICAweGQ4MGQyYmRhLCAweGFmMGExYjRjLCAweDM2MDM0YWY2LCAweDQxMDQ3YTYwLCAweGRmNjBlZmMzLCAweGE4NjdkZjU1LAotICAweDMxNmU4ZWVmLCAweDQ2NjliZTc5LCAweGNiNjFiMzhjLCAweGJjNjY4MzFhLCAweDI1NmZkMmEwLCAweDUyNjhlMjM2LAotICAweGNjMGM3Nzk1LCAweGJiMGI0NzAzLCAweDIyMDIxNmI5LCAweDU1MDUyNjJmLCAweGM1YmEzYmJlLCAweGIyYmQwYjI4LAotICAweDJiYjQ1YTkyLCAweDVjYjM2YTA0LCAweGMyZDdmZmE3LCAweGI1ZDBjZjMxLCAweDJjZDk5ZThiLCAweDViZGVhZTFkLAotICAweDliNjRjMmIwLCAweGVjNjNmMjI2LCAweDc1NmFhMzljLCAweDAyNmQ5MzBhLCAweDljMDkwNmE5LCAweGViMGUzNjNmLAotICAweDcyMDc2Nzg1LCAweDA1MDA1NzEzLCAweDk1YmY0YTgyLCAweGUyYjg3YTE0LCAweDdiYjEyYmFlLCAweDBjYjYxYjM4LAotICAweDkyZDI4ZTliLCAweGU1ZDViZTBkLCAweDdjZGNlZmI3LCAweDBiZGJkZjIxLCAweDg2ZDNkMmQ0LCAweGYxZDRlMjQyLAotICAweDY4ZGRiM2Y4LCAweDFmZGE4MzZlLCAweDgxYmUxNmNkLCAweGY2YjkyNjViLCAweDZmYjA3N2UxLCAweDE4Yjc0Nzc3LAotICAweDg4MDg1YWU2LCAweGZmMGY2YTcwLCAweDY2MDYzYmNhLCAweDExMDEwYjVjLCAweDhmNjU5ZWZmLCAweGY4NjJhZTY5LAotICAweDYxNmJmZmQzLCAweDE2NmNjZjQ1LCAweGEwMGFlMjc4LCAweGQ3MGRkMmVlLCAweDRlMDQ4MzU0LCAweDM5MDNiM2MyLAotICAweGE3NjcyNjYxLCAweGQwNjAxNmY3LCAweDQ5Njk0NzRkLCAweDNlNmU3N2RiLCAweGFlZDE2YTRhLCAweGQ5ZDY1YWRjLAotICAweDQwZGYwYjY2LCAweDM3ZDgzYmYwLCAweGE5YmNhZTUzLCAweGRlYmI5ZWM1LCAweDQ3YjJjZjdmLCAweDMwYjVmZmU5LAotICAweGJkYmRmMjFjLCAweGNhYmFjMjhhLCAweDUzYjM5MzMwLCAweDI0YjRhM2E2LCAweGJhZDAzNjA1LCAweGNkZDcwNjkzLAotICAweDU0ZGU1NzI5LCAweDIzZDk2N2JmLCAweGIzNjY3YTJlLCAweGM0NjE0YWI4LCAweDVkNjgxYjAyLCAweDJhNmYyYjk0LAotICAweGI0MGJiZTM3LCAweGMzMGM4ZWExLCAweDVhMDVkZjFiLCAweDJkMDJlZjhkCi19OwotCi1zdGF0aWMgdWludDMyIENvbXB1dGVDUkMzMihjb25zdCBzdHJpbmcgJmJ1ZikgewotICB1aW50MzIgeCA9IH4wVTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBidWYuc2l6ZSgpOyArK2kpIHsKLSAgICB1bnNpZ25lZCBjaGFyIGMgPSBidWZbaV07Ci0gICAgeCA9IGtDUkMzMlRhYmxlWyh4IF4gYykgJiAweGZmXSBeICh4ID4+IDgpOwotICB9Ci0gIHJldHVybiB+eDsKLX0KLQotc3RhdGljIHZvaWQgV3JpdGVTaG9ydChpbzo6Q29kZWRPdXRwdXRTdHJlYW0gKm91dCwgdWludDE2IHZhbCkgewotICB1aW50OCBwWzJdOwotICBwWzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbCk7Ci0gIHBbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsID4+IDgpOwotICBvdXQtPldyaXRlUmF3KHAsIDIpOwotfQotCi1aaXBXcml0ZXI6OlppcFdyaXRlcihpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXQpCi0gIDogcmF3X291dHB1dF8ocmF3X291dHB1dCkge30KLVppcFdyaXRlcjo6flppcFdyaXRlcigpIHt9Ci0KLWJvb2wgWmlwV3JpdGVyOjpXcml0ZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKSB7Ci0gIEZpbGVJbmZvIGluZm87Ci0KLSAgaW5mby5uYW1lID0gZmlsZW5hbWU7Ci0gIHVpbnQxNiBmaWxlbmFtZV9zaXplID0gZmlsZW5hbWUuc2l6ZSgpOwotICBpbmZvLm9mZnNldCA9IHJhd19vdXRwdXRfLT5CeXRlQ291bnQoKTsKLSAgaW5mby5zaXplID0gY29udGVudHMuc2l6ZSgpOwotICBpbmZvLmNyYzMyID0gQ29tcHV0ZUNSQzMyKGNvbnRlbnRzKTsKLQotICBmaWxlc18ucHVzaF9iYWNrKGluZm8pOwotCi0gIC8vIHdyaXRlIGZpbGUgaGVhZGVyCi0gIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQocmF3X291dHB1dF8pOwotICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMigweDA0MDM0YjUwKTsgIC8vIG1hZ2ljCi0gIFdyaXRlU2hvcnQoJm91dHB1dCwgMTApOyAgLy8gdmVyc2lvbiBuZWVkZWQgdG8gZXh0cmFjdAotICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gZmxhZ3MKLSAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGNvbXByZXNzaW9uIG1ldGhvZDogc3RvcmVkCi0gIFdyaXRlU2hvcnQoJm91dHB1dCwgMCk7ICAvLyBsYXN0IG1vZGlmaWVkIHRpbWUKLSAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGxhc3QgbW9kaWZpZWQgZGF0ZQotICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihpbmZvLmNyYzMyKTsgIC8vIGNyYy0zMgotICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMihpbmZvLnNpemUpOyAgLy8gY29tcHJlc3NlZCBzaXplCi0gIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGluZm8uc2l6ZSk7ICAvLyB1bmNvbXByZXNzZWQgc2l6ZQotICBXcml0ZVNob3J0KCZvdXRwdXQsIGZpbGVuYW1lX3NpemUpOyAgLy8gZmlsZSBuYW1lIGxlbmd0aAotICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIGV4dHJhIGZpZWxkIGxlbmd0aAotICBvdXRwdXQuV3JpdGVTdHJpbmcoZmlsZW5hbWUpOyAgLy8gZmlsZSBuYW1lCi0gIG91dHB1dC5Xcml0ZVN0cmluZyhjb250ZW50cyk7ICAvLyBmaWxlIGRhdGEKLQotICByZXR1cm4gIW91dHB1dC5IYWRFcnJvcigpOwotfQotCi1ib29sIFppcFdyaXRlcjo6V3JpdGVEaXJlY3RvcnkoKSB7Ci0gIHVpbnQxNiBudW1fZW50cmllcyA9IGZpbGVzXy5zaXplKCk7Ci0gIHVpbnQzMiBkaXJfb2ZzID0gcmF3X291dHB1dF8tPkJ5dGVDb3VudCgpOwotCi0gIC8vIHdyaXRlIGNlbnRyYWwgZGlyZWN0b3J5Ci0gIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQocmF3X291dHB1dF8pOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV9lbnRyaWVzOyArK2kpIHsKLSAgICBjb25zdCBzdHJpbmcgJmZpbGVuYW1lID0gZmlsZXNfW2ldLm5hbWU7Ci0gICAgdWludDE2IGZpbGVuYW1lX3NpemUgPSBmaWxlbmFtZS5zaXplKCk7Ci0gICAgdWludDMyIGNyYzMyID0gZmlsZXNfW2ldLmNyYzMyOwotICAgIHVpbnQzMiBzaXplID0gZmlsZXNfW2ldLnNpemU7Ci0gICAgdWludDMyIG9mZnNldCA9IGZpbGVzX1tpXS5vZmZzZXQ7Ci0KLSAgICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMigweDAyMDE0YjUwKTsgIC8vIG1hZ2ljCi0gICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAxMCk7ICAvLyB2ZXJzaW9uIG1hZGUgYnkKLSAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDEwKTsgIC8vIHZlcnNpb24gbmVlZGVkIHRvIGV4dHJhY3QKLSAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gZmxhZ3MKLSAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gY29tcHJlc3Npb24gbWV0aG9kOiBzdG9yZWQKLSAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gbGFzdCBtb2RpZmllZCB0aW1lCi0gICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGxhc3QgbW9kaWZpZWQgZGF0ZQotICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGNyYzMyKTsgIC8vIGNyYy0zMgotICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKHNpemUpOyAgLy8gY29tcHJlc3NlZCBzaXplCi0gICAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoc2l6ZSk7ICAvLyB1bmNvbXByZXNzZWQgc2l6ZQotICAgIFdyaXRlU2hvcnQoJm91dHB1dCwgZmlsZW5hbWVfc2l6ZSk7ICAvLyBmaWxlIG5hbWUgbGVuZ3RoCi0gICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAvLyBleHRyYSBmaWVsZCBsZW5ndGgKLSAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIGZpbGUgY29tbWVudCBsZW5ndGgKLSAgICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgIC8vIHN0YXJ0aW5nIGRpc2sgbnVtYmVyCi0gICAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAvLyBpbnRlcm5hbCBmaWxlIGF0dHJpYnV0ZXMKLSAgICBvdXRwdXQuV3JpdGVMaXR0bGVFbmRpYW4zMigwKTsgIC8vIGV4dGVybmFsIGZpbGUgYXR0cmlidXRlcwotICAgIG91dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKG9mZnNldCk7ICAvLyBsb2NhbCBoZWFkZXIgb2Zmc2V0Ci0gICAgb3V0cHV0LldyaXRlU3RyaW5nKGZpbGVuYW1lKTsgIC8vIGZpbGUgbmFtZQotICB9Ci0gIHVpbnQzMiBkaXJfbGVuID0gb3V0cHV0LkJ5dGVDb3VudCgpOwotCi0gIC8vIHdyaXRlIGVuZCBvZiBjZW50cmFsIGRpcmVjdG9yeSBtYXJrZXIKLSAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoMHgwNjA1NGI1MCk7ICAvLyBtYWdpYwotICBXcml0ZVNob3J0KCZvdXRwdXQsIDApOyAgLy8gZGlzayBudW1iZXIKLSAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgIC8vIGRpc2sgd2l0aCBzdGFydCBvZiBjZW50cmFsIGRpcmVjdG9yeQotICBXcml0ZVNob3J0KCZvdXRwdXQsIG51bV9lbnRyaWVzKTsgIC8vIGNlbnRyYWwgZGlyZWN0b3J5IGVudHJpZXMgKHRoaXMgZGlzaykKLSAgV3JpdGVTaG9ydCgmb3V0cHV0LCBudW1fZW50cmllcyk7ICAvLyBjZW50cmFsIGRpcmVjdG9yeSBlbnRyaWVzICh0b3RhbCkKLSAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoZGlyX2xlbik7ICAvLyBjZW50cmFsIGRpcmVjdG9yeSBieXRlIHNpemUKLSAgb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuMzIoZGlyX29mcyk7ICAvLyBjZW50cmFsIGRpcmVjdG9yeSBvZmZzZXQKLSAgV3JpdGVTaG9ydCgmb3V0cHV0LCAwKTsgICAvLyBjb21tZW50IGxlbmd0aAotCi0gIHJldHVybiBvdXRwdXQuSGFkRXJyb3IoKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDYwMmU1MDguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLQotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLQotY2xhc3MgWmlwV3JpdGVyIHsKLSBwdWJsaWM6Ci0gIFppcFdyaXRlcihpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXQpOwotICB+WmlwV3JpdGVyKCk7Ci0KLSAgYm9vbCBXcml0ZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKTsKLSAgYm9vbCBXcml0ZURpcmVjdG9yeSgpOwotCi0gcHJpdmF0ZToKLSAgc3RydWN0IEZpbGVJbmZvIHsKLSAgICBzdHJpbmcgbmFtZTsKLSAgICB1aW50MzIgb2Zmc2V0OwotICAgIHVpbnQzMiBzaXplOwotICAgIHVpbnQzMiBjcmMzMjsKLSAgfTsKLQotICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXRfOwotICB2ZWN0b3I8RmlsZUluZm8+IGZpbGVzXzsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDU2ZTExZmEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjI3NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c2V0PgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+Ci0KLSN1bmRlZiBQQUNLQUdFICAvLyBhdXRvaGVhZGVyICNkZWZpbmVzIHRoaXMuICA6KAotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLWNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZQotRmllbGREZXNjcmlwdG9yOjprVHlwZVRvQ3BwVHlwZU1hcFtNQVhfVFlQRSArIDFdID0gewotICBzdGF0aWNfY2FzdDxDcHBUeXBlPigwKSwgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycwotCi0gIENQUFRZUEVfRE9VQkxFLCAgIC8vIFRZUEVfRE9VQkxFCi0gIENQUFRZUEVfRkxPQVQsICAgIC8vIFRZUEVfRkxPQVQKLSAgQ1BQVFlQRV9JTlQ2NCwgICAgLy8gVFlQRV9JTlQ2NAotICBDUFBUWVBFX1VJTlQ2NCwgICAvLyBUWVBFX1VJTlQ2NAotICBDUFBUWVBFX0lOVDMyLCAgICAvLyBUWVBFX0lOVDMyCi0gIENQUFRZUEVfVUlOVDY0LCAgIC8vIFRZUEVfRklYRUQ2NAotICBDUFBUWVBFX1VJTlQzMiwgICAvLyBUWVBFX0ZJWEVEMzIKLSAgQ1BQVFlQRV9CT09MLCAgICAgLy8gVFlQRV9CT09MCi0gIENQUFRZUEVfU1RSSU5HLCAgIC8vIFRZUEVfU1RSSU5HCi0gIENQUFRZUEVfTUVTU0FHRSwgIC8vIFRZUEVfR1JPVVAKLSAgQ1BQVFlQRV9NRVNTQUdFLCAgLy8gVFlQRV9NRVNTQUdFCi0gIENQUFRZUEVfU1RSSU5HLCAgIC8vIFRZUEVfQllURVMKLSAgQ1BQVFlQRV9VSU5UMzIsICAgLy8gVFlQRV9VSU5UMzIKLSAgQ1BQVFlQRV9FTlVNLCAgICAgLy8gVFlQRV9FTlVNCi0gIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfU0ZJWEVEMzIKLSAgQ1BQVFlQRV9JTlQ2NCwgICAgLy8gVFlQRV9TRklYRUQ2NAotICBDUFBUWVBFX0lOVDMyLCAgICAvLyBUWVBFX1NJTlQzMgotICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX1NJTlQ2NAotfTsKLQotY29uc3QgY2hhciAqIGNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6a1R5cGVUb05hbWVbTUFYX1RZUEUgKyAxXSA9IHsKLSAgIkVSUk9SIiwgICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycwotCi0gICJkb3VibGUiLCAgICAvLyBUWVBFX0RPVUJMRQotICAiZmxvYXQiLCAgICAgLy8gVFlQRV9GTE9BVAotICAiaW50NjQiLCAgICAgLy8gVFlQRV9JTlQ2NAotICAidWludDY0IiwgICAgLy8gVFlQRV9VSU5UNjQKLSAgImludDMyIiwgICAgIC8vIFRZUEVfSU5UMzIKLSAgImZpeGVkNjQiLCAgIC8vIFRZUEVfRklYRUQ2NAotICAiZml4ZWQzMiIsICAgLy8gVFlQRV9GSVhFRDMyCi0gICJib29sIiwgICAgICAvLyBUWVBFX0JPT0wKLSAgInN0cmluZyIsICAgIC8vIFRZUEVfU1RSSU5HCi0gICJncm91cCIsICAgICAvLyBUWVBFX0dST1VQCi0gICJtZXNzYWdlIiwgICAvLyBUWVBFX01FU1NBR0UKLSAgImJ5dGVzIiwgICAgIC8vIFRZUEVfQllURVMKLSAgInVpbnQzMiIsICAgIC8vIFRZUEVfVUlOVDMyCi0gICJlbnVtIiwgICAgICAvLyBUWVBFX0VOVU0KLSAgInNmaXhlZDMyIiwgIC8vIFRZUEVfU0ZJWEVEMzIKLSAgInNmaXhlZDY0IiwgIC8vIFRZUEVfU0ZJWEVENjQKLSAgInNpbnQzMiIsICAgIC8vIFRZUEVfU0lOVDMyCi0gICJzaW50NjQiLCAgICAvLyBUWVBFX1NJTlQ2NAotfTsKLQotY29uc3QgY2hhciAqIGNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6a0NwcFR5cGVUb05hbWVbTUFYX0NQUFRZUEUgKyAxXSA9IHsKLSAgIkVSUk9SIiwgICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycwotCi0gICJpbnQzMiIsICAgICAvLyBDUFBUWVBFX0lOVDMyCi0gICJpbnQ2NCIsICAgICAvLyBDUFBUWVBFX0lOVDY0Ci0gICJ1aW50MzIiLCAgICAvLyBDUFBUWVBFX1VJTlQzMgotICAidWludDY0IiwgICAgLy8gQ1BQVFlQRV9VSU5UNjQKLSAgImRvdWJsZSIsICAgIC8vIENQUFRZUEVfRE9VQkxFCi0gICJmbG9hdCIsICAgICAvLyBDUFBUWVBFX0ZMT0FUCi0gICJib29sIiwgICAgICAvLyBDUFBUWVBFX0JPT0wKLSAgImVudW0iLCAgICAgIC8vIENQUFRZUEVfRU5VTQotICAic3RyaW5nIiwgICAgLy8gQ1BQVFlQRV9TVFJJTkcKLSAgIm1lc3NhZ2UiLCAgIC8vIENQUFRZUEVfTUVTU0FHRQotfTsKLQotY29uc3QgY2hhciAqIGNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6a0xhYmVsVG9OYW1lW01BWF9MQUJFTCArIDFdID0gewotICAiRVJST1IiLCAgICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCi0KLSAgIm9wdGlvbmFsIiwgIC8vIExBQkVMX09QVElPTkFMCi0gICJyZXF1aXJlZCIsICAvLyBMQUJFTF9SRVFVSVJFRAotICAicmVwZWF0ZWQiLCAgLy8gTEFCRUxfUkVQRUFURUQKLX07Ci0KLWNvbnN0IGNoYXIqIEZpbGVEZXNjcmlwdG9yOjpTeW50YXhOYW1lKEZpbGVEZXNjcmlwdG9yOjpTeW50YXggc3ludGF4KSB7Ci0gIHN3aXRjaCAoc3ludGF4KSB7Ci0gICAgY2FzZSBTWU5UQVhfUFJPVE8yOgotICAgICAgcmV0dXJuICJwcm90bzIiOwotICAgIGNhc2UgU1lOVEFYX1BST1RPMzoKLSAgICAgIHJldHVybiAicHJvdG8zIjsKLSAgICBjYXNlIFNZTlRBWF9VTktOT1dOOgotICAgICAgcmV0dXJuICJ1bmtub3duIjsKLSAgfQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiY2FuJ3QgcmVhY2ggaGVyZS4iOwotICByZXR1cm4gTlVMTDsKLX0KLQotc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrTm9uTGlua2VkV2Vha01lc3NhZ2VSZXBsYWNlbWVudE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVtcHR5IjsKLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyOwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvcjo6a0ZpcnN0UmVzZXJ2ZWROdW1iZXI7Ci1jb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyOwotI2VuZGlmCi0KLW5hbWVzcGFjZSB7Ci0KLXN0cmluZyBUb0NhbWVsQ2FzZShjb25zdCBzdHJpbmcmIGlucHV0LCBib29sIGxvd2VyX2ZpcnN0KSB7Ci0gIGJvb2wgY2FwaXRhbGl6ZV9uZXh0ID0gIWxvd2VyX2ZpcnN0OwotICBzdHJpbmcgcmVzdWx0OwotICByZXN1bHQucmVzZXJ2ZShpbnB1dC5zaXplKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoaW5wdXRbaV0gPT0gJ18nKSB7Ci0gICAgICBjYXBpdGFsaXplX25leHQgPSB0cnVlOwotICAgIH0gZWxzZSBpZiAoY2FwaXRhbGl6ZV9uZXh0KSB7Ci0gICAgICAvLyBOb3RlOiAgSSBkaXN0cnVzdCBjdHlwZS5oIGR1ZSB0byBsb2NhbGVzLgotICAgICAgaWYgKCdhJyA8PSBpbnB1dFtpXSAmJiBpbnB1dFtpXSA8PSAneicpIHsKLSAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhpbnB1dFtpXSAtICdhJyArICdBJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQucHVzaF9iYWNrKGlucHV0W2ldKTsKLSAgICAgIH0KLSAgICAgIGNhcGl0YWxpemVfbmV4dCA9IGZhbHNlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXN1bHQucHVzaF9iYWNrKGlucHV0W2ldKTsKLSAgICB9Ci0gIH0KLQotICAvLyBMb3dlci1jYXNlIHRoZSBmaXJzdCBsZXR0ZXIuCi0gIGlmIChsb3dlcl9maXJzdCAmJiAhcmVzdWx0LmVtcHR5KCkgJiYgJ0EnIDw9IHJlc3VsdFswXSAmJiByZXN1bHRbMF0gPD0gJ1onKSB7Ci0gICAgICByZXN1bHRbMF0gPSByZXN1bHRbMF0gLSAnQScgKyAnYSc7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBBIERlc2NyaXB0b3JQb29sIGNvbnRhaW5zIGEgYnVuY2ggb2YgaGFzaF9tYXBzIHRvIGltcGxlbWVudCB0aGUKLS8vIHZhcmlvdXMgRmluZCpCeSooKSBtZXRob2RzLiAgU2luY2UgaGFzaHRhYmxlIGxvb2t1cHMgYXJlIE8oMSksIGl0J3MKLS8vIG1vc3QgZWZmaWNpZW50IHRvIGNvbnN0cnVjdCBhIGZpeGVkIHNldCBvZiBsYXJnZSBoYXNoX21hcHMgdXNlZCBieQotLy8gYWxsIG9iamVjdHMgaW4gdGhlIHBvb2wgcmF0aGVyIHRoYW4gY29uc3RydWN0IG9uZSBvciBtb3JlIHNtYWxsCi0vLyBoYXNoX21hcHMgZm9yIGVhY2ggb2JqZWN0LgotLy8KLS8vIFRoZSBrZXlzIHRvIHRoZXNlIGhhc2hfbWFwcyBhcmUgKHBhcmVudCwgbmFtZSkgb3IgKHBhcmVudCwgbnVtYmVyKQotLy8gcGFpcnMuICBVbmZvcnR1bmF0ZWx5IFNUTCBkb2Vzbid0IHByb3ZpZGUgaGFzaCBmdW5jdGlvbnMgZm9yIHBhaXI8PiwKLS8vIHNvIHdlIG11c3QgaW52ZW50IG91ciBvd24uCi0vLwotLy8gVE9ETyhrZW50b24pOiAgVXNlIFN0cmluZ1BpZWNlIHJhdGhlciB0aGFuIGNvbnN0IGNoYXIqIGluIGtleXM/ICBJdCB3b3VsZAotLy8gICBiZSBhIGxvdCBjbGVhbmVyIGJ1dCB3ZSdkIGp1c3QgaGF2ZSB0byBjb252ZXJ0IGl0IGJhY2sgdG8gY29uc3QgY2hhcioKLS8vICAgZm9yIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLgotCi10eXBlZGVmIHBhaXI8Y29uc3Qgdm9pZCosIGNvbnN0IGNoYXIqPiBQb2ludGVyU3RyaW5nUGFpcjsKLQotc3RydWN0IFBvaW50ZXJTdHJpbmdQYWlyRXF1YWwgewotICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBiKSBjb25zdCB7Ci0gICAgcmV0dXJuIGEuZmlyc3QgPT0gYi5maXJzdCAmJiBzdHJjbXAoYS5zZWNvbmQsIGIuc2Vjb25kKSA9PSAwOwotICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBQYWlyVHlwZT4KLXN0cnVjdCBQb2ludGVySW50ZWdlclBhaXJIYXNoIHsKLSAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgUGFpclR5cGUmIHApIGNvbnN0IHsKLSAgICAvLyBGSVhNRShrZW50b24pOiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29tcHV0ZSB0aGlzIGhhc2g/ICBJIGhhdmUKLSAgICAvLyBubyBpZGVhISAgVGhpcyBzZWVtcyBhIGJpdCBiZXR0ZXIgdGhhbiBhbiBYT1IuCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHAuZmlyc3QpICogKCgxIDw8IDE2KSAtIDEpICsgcC5zZWNvbmQ7Ci0gIH0KLQotI2lmZGVmIF9NU0NfVkVSCi0gIC8vIFVzZWQgb25seSBieSBNU1ZDIGFuZCBwbGF0Zm9ybXMgd2hlcmUgaGFzaF9tYXAgaXMgbm90IGF2YWlsYWJsZS4KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBidWNrZXRfc2l6ZSA9IDQ7Ci0gIHN0YXRpYyBjb25zdCBzaXplX3QgbWluX2J1Y2tldHMgPSA4OwotI2VuZGlmCi0gIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgUGFpclR5cGUmIGEsIGNvbnN0IFBhaXJUeXBlJiBiKSBjb25zdCB7Ci0gICAgcmV0dXJuIGEuZmlyc3QgPCBiLmZpcnN0IHx8Ci0gICAgICAgICAgKGEuZmlyc3QgPT0gYi5maXJzdCAmJiBhLnNlY29uZCA8IGIuc2Vjb25kKTsKLSAgfQotfTsKLQotdHlwZWRlZiBwYWlyPGNvbnN0IERlc2NyaXB0b3IqLCBpbnQ+IERlc2NyaXB0b3JJbnRQYWlyOwotdHlwZWRlZiBwYWlyPGNvbnN0IEVudW1EZXNjcmlwdG9yKiwgaW50PiBFbnVtSW50UGFpcjsKLQotc3RydWN0IFBvaW50ZXJTdHJpbmdQYWlySGFzaCB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBwKSBjb25zdCB7Ci0gICAgLy8gRklYTUUoa2VudG9uKTogIFdoYXQgaXMgdGhlIGJlc3Qgd2F5IHRvIGNvbXB1dGUgdGhpcyBoYXNoPyAgSSBoYXZlCi0gICAgLy8gbm8gaWRlYSEgIFRoaXMgc2VlbXMgYSBiaXQgYmV0dGVyIHRoYW4gYW4gWE9SLgotICAgIGhhc2g8Y29uc3QgY2hhcio+IGNzdHJpbmdfaGFzaDsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxpbnRwdHJfdD4ocC5maXJzdCkgKiAoKDEgPDwgMTYpIC0gMSkgKwotICAgICAgICAgICBjc3RyaW5nX2hhc2gocC5zZWNvbmQpOwotICB9Ci0KLSNpZmRlZiBfTVNDX1ZFUgotICAvLyBVc2VkIG9ubHkgYnkgTVNWQyBhbmQgcGxhdGZvcm1zIHdoZXJlIGhhc2hfbWFwIGlzIG5vdCBhdmFpbGFibGUuCi0gIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKLSNlbmRpZgotICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFBvaW50ZXJTdHJpbmdQYWlyJiBiKSBjb25zdCB7Ci0gICAgaWYgKGEuZmlyc3QgPCBiLmZpcnN0KSByZXR1cm4gdHJ1ZTsKLSAgICBpZiAoYS5maXJzdCA+IGIuZmlyc3QpIHJldHVybiBmYWxzZTsKLSAgICByZXR1cm4gc3RyY21wKGEuc2Vjb25kLCBiLnNlY29uZCkgPCAwOwotICB9Ci19OwotCi0KLXN0cnVjdCBTeW1ib2wgewotICBlbnVtIFR5cGUgewotICAgIE5VTExfU1lNQk9MLCBNRVNTQUdFLCBGSUVMRCwgT05FT0YsIEVOVU0sIEVOVU1fVkFMVUUsIFNFUlZJQ0UsIE1FVEhPRCwKLSAgICBQQUNLQUdFCi0gIH07Ci0gIFR5cGUgdHlwZTsKLSAgdW5pb24gewotICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yOwotICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcjsKLSAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yOwotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWVfZGVzY3JpcHRvcjsKLSAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV9kZXNjcmlwdG9yOwotICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZF9kZXNjcmlwdG9yOwotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwYWNrYWdlX2ZpbGVfZGVzY3JpcHRvcjsKLSAgfTsKLQotICBpbmxpbmUgU3ltYm9sKCkgOiB0eXBlKE5VTExfU1lNQk9MKSB7IGRlc2NyaXB0b3IgPSBOVUxMOyB9Ci0gIGlubGluZSBib29sIElzTnVsbCgpIGNvbnN0IHsgcmV0dXJuIHR5cGUgPT0gTlVMTF9TWU1CT0w7IH0KLSAgaW5saW5lIGJvb2wgSXNUeXBlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlID09IE1FU1NBR0UgfHwgdHlwZSA9PSBFTlVNOwotICB9Ci0gIGlubGluZSBib29sIElzQWdncmVnYXRlKCkgY29uc3QgewotICAgIHJldHVybiB0eXBlID09IE1FU1NBR0UgfHwgdHlwZSA9PSBQQUNLQUdFCi0gICAgICAgIHx8IHR5cGUgPT0gRU5VTSB8fCB0eXBlID09IFNFUlZJQ0U7Ci0gIH0KLQotI2RlZmluZSBDT05TVFJVQ1RPUihUWVBFLCBUWVBFX0NPTlNUQU5ULCBGSUVMRCkgIFwKLSAgaW5saW5lIGV4cGxpY2l0IFN5bWJvbChjb25zdCBUWVBFKiB2YWx1ZSkgeyAgICBcCi0gICAgdHlwZSA9IFRZUEVfQ09OU1RBTlQ7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHRoaXMtPkZJRUxEID0gdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi0gIENPTlNUUlVDVE9SKERlc2NyaXB0b3IgICAgICAgICAsIE1FU1NBR0UgICAsIGRlc2NyaXB0b3IgICAgICAgICAgICAgKQotICBDT05TVFJVQ1RPUihGaWVsZERlc2NyaXB0b3IgICAgLCBGSUVMRCAgICAgLCBmaWVsZF9kZXNjcmlwdG9yICAgICAgICkKLSAgQ09OU1RSVUNUT1IoT25lb2ZEZXNjcmlwdG9yICAgICwgT05FT0YgICAgICwgb25lb2ZfZGVzY3JpcHRvciAgICAgICApCi0gIENPTlNUUlVDVE9SKEVudW1EZXNjcmlwdG9yICAgICAsIEVOVU0gICAgICAsIGVudW1fZGVzY3JpcHRvciAgICAgICAgKQotICBDT05TVFJVQ1RPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBFTlVNX1ZBTFVFLCBlbnVtX3ZhbHVlX2Rlc2NyaXB0b3IgICkKLSAgQ09OU1RSVUNUT1IoU2VydmljZURlc2NyaXB0b3IgICwgU0VSVklDRSAgICwgc2VydmljZV9kZXNjcmlwdG9yICAgICApCi0gIENPTlNUUlVDVE9SKE1ldGhvZERlc2NyaXB0b3IgICAsIE1FVEhPRCAgICAsIG1ldGhvZF9kZXNjcmlwdG9yICAgICAgKQotICBDT05TVFJVQ1RPUihGaWxlRGVzY3JpcHRvciAgICAgLCBQQUNLQUdFICAgLCBwYWNrYWdlX2ZpbGVfZGVzY3JpcHRvcikKLSN1bmRlZiBDT05TVFJVQ1RPUgotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBHZXRGaWxlKCkgY29uc3QgewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBOVUxMX1NZTUJPTDogcmV0dXJuIE5VTEw7Ci0gICAgICBjYXNlIE1FU1NBR0UgICAgOiByZXR1cm4gZGVzY3JpcHRvciAgICAgICAgICAgLT5maWxlKCk7Ci0gICAgICBjYXNlIEZJRUxEICAgICAgOiByZXR1cm4gZmllbGRfZGVzY3JpcHRvciAgICAgLT5maWxlKCk7Ci0gICAgICBjYXNlIE9ORU9GICAgICAgOiByZXR1cm4gb25lb2ZfZGVzY3JpcHRvciAgICAgLT5jb250YWluaW5nX3R5cGUoKS0+ZmlsZSgpOwotICAgICAgY2FzZSBFTlVNICAgICAgIDogcmV0dXJuIGVudW1fZGVzY3JpcHRvciAgICAgIC0+ZmlsZSgpOwotICAgICAgY2FzZSBFTlVNX1ZBTFVFIDogcmV0dXJuIGVudW1fdmFsdWVfZGVzY3JpcHRvci0+dHlwZSgpLT5maWxlKCk7Ci0gICAgICBjYXNlIFNFUlZJQ0UgICAgOiByZXR1cm4gc2VydmljZV9kZXNjcmlwdG9yICAgLT5maWxlKCk7Ci0gICAgICBjYXNlIE1FVEhPRCAgICAgOiByZXR1cm4gbWV0aG9kX2Rlc2NyaXB0b3IgICAgLT5zZXJ2aWNlKCktPmZpbGUoKTsKLSAgICAgIGNhc2UgUEFDS0FHRSAgICA6IHJldHVybiBwYWNrYWdlX2ZpbGVfZGVzY3JpcHRvcjsKLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX07Ci0KLWNvbnN0IFN5bWJvbCBrTnVsbFN5bWJvbDsKLQotdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgU3ltYm9sLAotICAgICAgICAgICAgICAgICBoYXNoPGNvbnN0IGNoYXIqPiwgc3RyZXE+Ci0gIFN5bWJvbHNCeU5hbWVNYXA7Ci10eXBlZGVmIGhhc2hfbWFwPFBvaW50ZXJTdHJpbmdQYWlyLCBTeW1ib2wsCi0gICAgICAgICAgICAgICAgIFBvaW50ZXJTdHJpbmdQYWlySGFzaCwgUG9pbnRlclN0cmluZ1BhaXJFcXVhbD4KLSAgU3ltYm9sc0J5UGFyZW50TWFwOwotdHlwZWRlZiBoYXNoX21hcDxjb25zdCBjaGFyKiwgY29uc3QgRmlsZURlc2NyaXB0b3IqLAotICAgICAgICAgICAgICAgICBoYXNoPGNvbnN0IGNoYXIqPiwgc3RyZXE+Ci0gIEZpbGVzQnlOYW1lTWFwOwotdHlwZWRlZiBoYXNoX21hcDxQb2ludGVyU3RyaW5nUGFpciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiwKLSAgICAgICAgICAgICAgICAgUG9pbnRlclN0cmluZ1BhaXJIYXNoLCBQb2ludGVyU3RyaW5nUGFpckVxdWFsPgotICBGaWVsZHNCeU5hbWVNYXA7Ci10eXBlZGVmIGhhc2hfbWFwPERlc2NyaXB0b3JJbnRQYWlyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqLAotICAgICAgICAgICAgICAgICBQb2ludGVySW50ZWdlclBhaXJIYXNoPERlc2NyaXB0b3JJbnRQYWlyPiA+Ci0gIEZpZWxkc0J5TnVtYmVyTWFwOwotdHlwZWRlZiBoYXNoX21hcDxFbnVtSW50UGFpciwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciosCi0gICAgICAgICAgICAgICAgIFBvaW50ZXJJbnRlZ2VyUGFpckhhc2g8RW51bUludFBhaXI+ID4KLSAgRW51bVZhbHVlc0J5TnVtYmVyTWFwOwotLy8gVGhpcyBpcyBhIG1hcCByYXRoZXIgdGhhbiBhIGhhc2hfbWFwLCBzaW5jZSB3ZSB1c2UgaXQgdG8gaXRlcmF0ZQotLy8gdGhyb3VnaCBhbGwgdGhlIGV4dGVuc2lvbnMgdGhhdCBleHRlbmQgYSBnaXZlbiBEZXNjcmlwdG9yLCBhbmQgYW4KLS8vIG9yZGVyZWQgZGF0YSBzdHJ1Y3R1cmUgdGhhdCBpbXBsZW1lbnRzIGxvd2VyX2JvdW5kIGlzIGNvbnZlbmllbnQKLS8vIGZvciB0aGF0LgotdHlwZWRlZiBtYXA8RGVzY3JpcHRvckludFBhaXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+Ci0gIEV4dGVuc2lvbnNHcm91cGVkQnlEZXNjcmlwdG9yTWFwOwotdHlwZWRlZiBoYXNoX21hcDxzdHJpbmcsIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKj4gTG9jYXRpb25zQnlQYXRoTWFwOwotCi1zZXQ8c3RyaW5nPiogYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzXyA9IE5VTEw7Ci1HT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc19pbml0Xyk7Ci0KLXZvaWQgRGVsZXRlQWxsb3dlZFByb3RvM0V4dGVuZGVlKCkgewotICBkZWxldGUgYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzXzsKLX0KLQotdm9pZCBJbml0QWxsb3dlZFByb3RvM0V4dGVuZGVlKCkgewotICBhbGxvd2VkX3Byb3RvM19leHRlbmRlZXNfID0gbmV3IHNldDxzdHJpbmc+OwotICBjb25zdCBjaGFyKiBrT3B0aW9uTmFtZXNbXSA9IHsKLSAgICAgICJGaWxlT3B0aW9ucyIsICAgICAgIk1lc3NhZ2VPcHRpb25zIiwgIkZpZWxkT3B0aW9ucyIsICJFbnVtT3B0aW9ucyIsCi0gICAgICAiRW51bVZhbHVlT3B0aW9ucyIsICJTZXJ2aWNlT3B0aW9ucyIsICJNZXRob2RPcHRpb25zIn07Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShrT3B0aW9uTmFtZXMpOyArK2kpIHsKLSAgICAvLyBkZXNjcmlwdG9yLnByb3RvIGhhcyBhIGRpZmZlcmVudCBwYWNrYWdlIG5hbWUgaW4gb3BlbnNvdXJjZS4gV2UgYWxsb3cKLSAgICAvLyBib3RoIHNvIHRoZSBvcGVuc291cmNlIHByb3RvY29sIGNvbXBpbGVyIGNhbiBhbHNvIGNvbXBpbGUgaW50ZXJuYWwKLSAgICAvLyBwcm90bzMgZmlsZXMgd2l0aCBjdXN0b20gb3B0aW9ucy4gU2VlOiBiLzI3NTY3OTEyCi0gICAgYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzXy0+aW5zZXJ0KHN0cmluZygiZ29vZ2xlLnByb3RvYnVmLiIpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga09wdGlvbk5hbWVzW2ldKTsKLSAgICAvLyBTcGxpdCB0aGUgd29yZCB0byB0cmljayB0aGUgb3BlbnNvdXJjZSBwcm9jZXNzaW5nIHNjcmlwdHMgc28gdGhleQotICAgIC8vIHdpbGwga2VlcCB0aGUgb3JpZ2lhbCBwYWNrYWdlIG5hbWUuCi0gICAgYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzXy0+aW5zZXJ0KHN0cmluZygicHJvdG8iKSArICIyLiIgKyBrT3B0aW9uTmFtZXNbaV0pOwotICB9Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJkRlbGV0ZUFsbG93ZWRQcm90bzNFeHRlbmRlZSk7Ci19Ci0KLS8vIENoZWNrcyB3aGV0aGVyIHRoZSBleHRlbmRlZSB0eXBlIGlzIGFsbG93ZWQgaW4gcHJvdG8zLgotLy8gT25seSBleHRlbnNpb25zIHRvIGRlc2NyaXB0b3Igb3B0aW9ucyBhcmUgYWxsb3dlZC4gV2UgdXNlIG5hbWUgY29tcGFyaXNvbgotLy8gaW5zdGVhZCBvZiBjb21wYXJpbmcgdGhlIGRlc2NyaXB0b3IgZGlyZWN0bHkgYmVjYXVzZSB0aGUgZXh0ZW5zaW9ucyBtYXkgYmUKLS8vIGRlZmluZWQgaW4gYSBkaWZmZXJlbnQgcG9vbC4KLWJvb2wgQWxsb3dlZEV4dGVuZGVlSW5Qcm90bzMoY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJmFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc19pbml0XywgJkluaXRBbGxvd2VkUHJvdG8zRXh0ZW5kZWUpOwotICByZXR1cm4gYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzXy0+ZmluZChuYW1lKSAhPQotICAgICAgICAgYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzXy0+ZW5kKCk7Ci19Ci0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRGVzY3JpcHRvclBvb2w6OlRhYmxlcwotCi1jbGFzcyBEZXNjcmlwdG9yUG9vbDo6VGFibGVzIHsKLSBwdWJsaWM6Ci0gIFRhYmxlcygpOwotICB+VGFibGVzKCk7Ci0KLSAgLy8gUmVjb3JkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0YWJsZXMgdG8gdGhlIHN0YWNrIG9mIGNoZWNrcG9pbnRzLgotICAvLyBFYWNoIGNhbGwgdG8gQWRkQ2hlY2twb2ludCgpIG11c3QgYmUgcGFpcmVkIHdpdGggZXhhY3RseSBvbmUgY2FsbCB0byBlaXRoZXIKLSAgLy8gQ2xlYXJMYXN0Q2hlY2twb2ludCgpIG9yIFJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpLgotICAvLwotICAvLyBUaGlzIGlzIHVzZWQgd2hlbiBidWlsZGluZyBmaWxlcywgc2luY2Ugc29tZSBraW5kcyBvZiB2YWxpZGF0aW9uIGVycm9ycwotICAvLyBjYW5ub3QgYmUgZGV0ZWN0ZWQgdW50aWwgdGhlIGZpbGUncyBkZXNjcmlwdG9ycyBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0bwotICAvLyB0aGUgdGFibGVzLgotICAvLwotICAvLyBUaGlzIHN1cHBvcnRzIHJlY3Vyc2l2ZSBjaGVja3BvaW50cywgc2luY2UgYnVpbGRpbmcgYSBmaWxlIG1heSB0cmlnZ2VyCi0gIC8vIHJlY3Vyc2l2ZSBidWlsZGluZyBvZiBvdGhlciBmaWxlcy4gTm90ZSB0aGF0IHJlY3Vyc2l2ZSBjaGVja3BvaW50cyBhcmUgbm90Ci0gIC8vIG5vcm1hbGx5IG5lY2Vzc2FyeTsgZXhwbGljaXQgZGVwZW5kZW5jaWVzIGFyZSBidWlsdCBwcmlvciB0byBjaGVja3BvaW50aW5nLgotICAvLyBTbyBhbHRob3VnaCB3ZSByZWN1cnNpdmVseSBidWlsZCB0cmFuc2l0aXZlIGltcG9ydHMsIHRoZXJlIGlzIGF0IG1vc3Qgb25lCi0gIC8vIGNoZWNrcG9pbnQgaW4gdGhlIHN0YWNrIGR1cmluZyBkZXBlbmRlbmN5IGJ1aWxkaW5nLgotICAvLwotICAvLyBSZWN1cnNpdmUgY2hlY2twb2ludHMgb25seSBhcmlzZSBkdXJpbmcgY3Jvc3MtbGlua2luZyBvZiB0aGUgZGVzY3JpcHRvcnMuCi0gIC8vIFN5bWJvbCByZWZlcmVuY2VzIG11c3QgYmUgcmVzb2x2ZWQsIHZpYSBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbCBhbmQKLSAgLy8gZnJpZW5kcy4gSWYgdGhlIHBlbmRpbmcgZmlsZSByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sCi0gIC8vIChlLmcuLCBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcGVuZGluZyBmaWxlJ3MgZXhwbGljaXQgZGVwZW5kZW5jaWVzKSwgYW5kCi0gIC8vIHRoZSBwb29sIGlzIHVzaW5nIGEgZmFsbGJhY2sgZGF0YWJhc2UsIGFuZCB0aGF0IGRhdGFiYXNlIGNvbnRhaW5zIGEgZmlsZQotICAvLyBkZWZpbmluZyB0aGF0IHN5bWJvbCwgYW5kIHRoYXQgZmlsZSBoYXMgbm90IHlldCBiZWVuIGJ1aWx0IGJ5IHRoZSBwb29sLAotICAvLyB0aGUgcG9vbCBidWlsZHMgdGhlIGZpbGUgZHVyaW5nIGNyb3NzLWxpbmtpbmcsIGxlYWRpbmcgdG8gYW5vdGhlcgotICAvLyBjaGVja3BvaW50LgotICB2b2lkIEFkZENoZWNrcG9pbnQoKTsKLQotICAvLyBNYXJrIHRoZSBsYXN0IGNoZWNrcG9pbnQgYXMgaGF2aW5nIGNsZWFyZWQgc3VjY2Vzc2Z1bGx5LCByZW1vdmluZyBpdCBmcm9tCi0gIC8vIHRoZSBzdGFjay4gSWYgdGhlIHN0YWNrIGlzIGVtcHR5LCBhbGwgcGVuZGluZyBzeW1ib2xzIHdpbGwgYmUgY29tbWl0dGVkLgotICAvLwotICAvLyBOb3RlIHRoYXQgdGhpcyBkb2VzIG5vdCBndWFyYW50ZWUgdGhhdCB0aGUgc3ltYm9scyBhZGRlZCBzaW5jZSB0aGUgbGFzdAotICAvLyBjaGVja3BvaW50IHdvbid0IGJlIHJvbGxlZCBiYWNrOiBpZiBhIGNoZWNrcG9pbnQgZ2V0cyByb2xsZWQgYmFjaywKLSAgLy8gZXZlcnl0aGluZyBwYXN0IHRoYXQgcG9pbnQgZ2V0cyByb2xsZWQgYmFjaywgaW5jbHVkaW5nIHN5bWJvbHMgYWRkZWQgYWZ0ZXIKLSAgLy8gY2hlY2twb2ludHMgdGhhdCB3ZXJlIHB1c2hlZCBvbnRvIHRoZSBzdGFjayBhZnRlciBpdCBhbmQgbWFya2VkIGFzIGNsZWFyZWQuCi0gIHZvaWQgQ2xlYXJMYXN0Q2hlY2twb2ludCgpOwotCi0gIC8vIFJvbGwgYmFjayB0aGUgVGFibGVzIHRvIHRoZSBzdGF0ZSBvZiB0aGUgY2hlY2twb2ludCBhdCB0aGUgdG9wIG9mIHRoZQotICAvLyBzdGFjaywgcmVtb3ZpbmcgZXZlcnl0aGluZyB0aGF0IHdhcyBhZGRlZCBhZnRlciB0aGF0IHBvaW50LgotICB2b2lkIFJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpOwotCi0gIC8vIFRoZSBzdGFjayBvZiBmaWxlcyB3aGljaCBhcmUgY3VycmVudGx5IGJlaW5nIGJ1aWx0LiAgVXNlZCB0byBkZXRlY3QKLSAgLy8gY3ljbGljIGRlcGVuZGVuY2llcyB3aGVuIGxvYWRpbmcgZmlsZXMgZnJvbSBhIERlc2NyaXB0b3JEYXRhYmFzZS4gIE5vdAotICAvLyB1c2VkIHdoZW4gZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwuCi0gIHZlY3RvcjxzdHJpbmc+IHBlbmRpbmdfZmlsZXNfOwotCi0gIC8vIEEgc2V0IG9mIGZpbGVzIHdoaWNoIHdlIGhhdmUgdHJpZWQgdG8gbG9hZCBmcm9tIHRoZSBmYWxsYmFjayBkYXRhYmFzZQotICAvLyBhbmQgZW5jb3VudGVyZWQgZXJyb3JzLiAgV2Ugd2lsbCBub3QgYXR0ZW1wdCB0byBsb2FkIHRoZW0gYWdhaW4gZHVyaW5nCi0gIC8vIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCBwdWJsaWMgQVBJIGNhbGwsIGJ1dCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCi0gIC8vIGxlZ2FjeSBjbGllbnRzLCB0aGlzIGlzIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHB1YmxpYyBBUEkgY2FsbC4KLSAgLy8gTm90IHVzZWQgd2hlbiBmYWxsYmFja19kYXRhYmFzZV8gPT0gTlVMTC4KLSAgaGFzaF9zZXQ8c3RyaW5nPiBrbm93bl9iYWRfZmlsZXNfOwotCi0gIC8vIEEgc2V0IG9mIHN5bWJvbHMgd2hpY2ggd2UgaGF2ZSB0cmllZCB0byBsb2FkIGZyb20gdGhlIGZhbGxiYWNrIGRhdGFiYXNlCi0gIC8vIGFuZCBlbmNvdW50ZXJlZCBlcnJvcnMuIFdlIHdpbGwgbm90IGF0dGVtcHQgdG8gbG9hZCB0aGVtIGFnYWluIGR1cmluZwotICAvLyBleGVjdXRpb24gb2YgdGhlIGN1cnJlbnQgcHVibGljIEFQSSBjYWxsLCBidXQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aAotICAvLyBsZWdhY3kgY2xpZW50cywgdGhpcyBpcyBjbGVhcmVkIGF0IHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBwdWJsaWMgQVBJIGNhbGwuCi0gIGhhc2hfc2V0PHN0cmluZz4ga25vd25fYmFkX3N5bWJvbHNfOwotCi0gIC8vIFRoZSBzZXQgb2YgZGVzY3JpcHRvcnMgZm9yIHdoaWNoIHdlJ3ZlIGFscmVhZHkgbG9hZGVkIHRoZSBmdWxsCi0gIC8vIHNldCBvZiBleHRlbnNpb25zIG51bWJlcnMgZnJvbSBmYWxsYmFja19kYXRhYmFzZV8uCi0gIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBleHRlbnNpb25zX2xvYWRlZF9mcm9tX2RiXzsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBGaW5kaW5nIGl0ZW1zLgotCi0gIC8vIEZpbmQgc3ltYm9scy4gIFRoaXMgcmV0dXJucyBhIG51bGwgU3ltYm9sIChzeW1ib2wuSXNOdWxsKCkgaXMgdHJ1ZSkKLSAgLy8gaWYgbm90IGZvdW5kLgotICBpbmxpbmUgU3ltYm9sIEZpbmRTeW1ib2woY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0OwotCi0gIC8vIFRoaXMgaW1wbGVtZW50cyB0aGUgYm9keSBvZiBEZXNjcmlwdG9yUG9vbDo6RmluZCpCeU5hbWUoKS4gIEl0IHNob3VsZAotICAvLyByZWFsbHkgYmUgYSBwcml2YXRlIG1ldGhvZCBvZiBEZXNjcmlwdG9yUG9vbCwgYnV0IHRoYXQgd291bGQgcmVxdWlyZQotICAvLyBkZWNsYXJpbmcgU3ltYm9sIGluIGRlc2NyaXB0b3IuaCwgd2hpY2ggd291bGQgZHJhZyBhbGwga2luZHMgb2Ygb3RoZXIKLSAgLy8gc3R1ZmYgaW50byB0aGUgaGVhZGVyLiAgWWF5IEMrKy4KLSAgU3ltYm9sIEZpbmRCeU5hbWVIZWxwZXIoCi0gICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsIGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgLy8gVGhlc2UgcmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgotICBpbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIEZpbmRGaWxlKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdDsKLSAgaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbihjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKTsKLSAgaW5saW5lIHZvaWQgRmluZEFsbEV4dGVuc2lvbnMoY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0KSBjb25zdDsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBBZGRpbmcgaXRlbXMuCi0KLSAgLy8gVGhlc2UgYWRkIGl0ZW1zIHRvIHRoZSBjb3JyZXNwb25kaW5nIHRhYmxlcy4gIFRoZXkgcmV0dXJuIGZhbHNlIGlmCi0gIC8vIHRoZSBrZXkgYWxyZWFkeSBleGlzdHMgaW4gdGhlIHRhYmxlLiAgRm9yIEFkZFN5bWJvbCgpLCB0aGUgc3RyaW5nIHBhc3NlZAotICAvLyBpbiBtdXN0IGJlIG9uZSB0aGF0IHdhcyBjb25zdHJ1Y3RlZCB1c2luZyBBbGxvY2F0ZVN0cmluZygpLCBhcyBpdCB3aWxsCi0gIC8vIGJlIHVzZWQgYXMgYSBrZXkgaW4gdGhlIHN5bWJvbHNfYnlfbmFtZV8gbWFwIHdpdGhvdXQgY29weWluZy4KLSAgYm9vbCBBZGRTeW1ib2woY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsIFN5bWJvbCBzeW1ib2wpOwotICBib29sIEFkZEZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOwotICBib29sIEFkZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBBbGxvY2F0aW5nIG1lbW9yeS4KLQotICAvLyBBbGxvY2F0ZSBhbiBvYmplY3Qgd2hpY2ggd2lsbCBiZSByZWNsYWltZWQgd2hlbiB0aGUgcG9vbCBpcwotICAvLyBkZXN0cm95ZWQuICBOb3RlIHRoYXQgdGhlIG9iamVjdCdzIGRlc3RydWN0b3Igd2lsbCBuZXZlciBiZSBjYWxsZWQsCi0gIC8vIHNvIGl0cyBmaWVsZHMgbXVzdCBiZSBwbGFpbiBvbGQgZGF0YSAocHJpbWl0aXZlIGRhdGEgdHlwZXMgYW5kCi0gIC8vIHBvaW50ZXJzKS4gIEFsbCBvZiB0aGUgZGVzY3JpcHRvciB0eXBlcyBhcmUgc3VjaCBvYmplY3RzLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBUeXBlKiBBbGxvY2F0ZSgpOwotCi0gIC8vIEFsbG9jYXRlIGFuIGFycmF5IG9mIG9iamVjdHMgd2hpY2ggd2lsbCBiZSByZWNsYWltZWQgd2hlbiB0aGUKLSAgLy8gcG9vbCBpbiBkZXN0cm95ZWQuICBBZ2FpbiwgZGVzdHJ1Y3RvcnMgYXJlIG5ldmVyIGNhbGxlZC4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4gVHlwZSogQWxsb2NhdGVBcnJheShpbnQgY291bnQpOwotCi0gIC8vIEFsbG9jYXRlIGEgc3RyaW5nIHdoaWNoIHdpbGwgYmUgZGVzdHJveWVkIHdoZW4gdGhlIHBvb2wgaXMgZGVzdHJveWVkLgotICAvLyBUaGUgc3RyaW5nIGlzIGluaXRpYWxpemVkIHRvIHRoZSBnaXZlbiB2YWx1ZSBmb3IgY29udmVuaWVuY2UuCi0gIHN0cmluZyogQWxsb2NhdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7Ci0KLSAgLy8gQWxsb2NhdGUgYSBwcm90b2NvbCBtZXNzYWdlIG9iamVjdC4gIFNvbWUgb2xkZXIgdmVyc2lvbnMgb2YgR0NDIGhhdmUKLSAgLy8gdHJvdWJsZSB1bmRlcnN0YW5kaW5nIGV4cGxpY2l0IHRlbXBsYXRlIGluc3RhbnRpYXRpb25zIGluIHNvbWUgY2FzZXMsIHNvCi0gIC8vIGluIHRob3NlIGNhc2VzIHdlIGhhdmUgdG8gcGFzcyBhIGR1bW15IHBvaW50ZXIgb2YgdGhlIHJpZ2h0IHR5cGUgYXMgdGhlCi0gIC8vIHBhcmFtZXRlciBpbnN0ZWFkIG9mIHNwZWNpZnlpbmcgdGhlIHR5cGUgZXhwbGljaXRseS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4gVHlwZSogQWxsb2NhdGVNZXNzYWdlKFR5cGUqIGR1bW15ID0gTlVMTCk7Ci0KLSAgLy8gQWxsb2NhdGUgYSBGaWxlRGVzY3JpcHRvclRhYmxlcyBvYmplY3QuCi0gIEZpbGVEZXNjcmlwdG9yVGFibGVzKiBBbGxvY2F0ZUZpbGVUYWJsZXMoKTsKLQotIHByaXZhdGU6Ci0gIHZlY3RvcjxzdHJpbmcqPiBzdHJpbmdzXzsgICAgLy8gQWxsIHN0cmluZ3MgaW4gdGhlIHBvb2wuCi0gIHZlY3RvcjxNZXNzYWdlKj4gbWVzc2FnZXNfOyAgLy8gQWxsIG1lc3NhZ2VzIGluIHRoZSBwb29sLgotICB2ZWN0b3I8RmlsZURlc2NyaXB0b3JUYWJsZXMqPiBmaWxlX3RhYmxlc187ICAvLyBBbGwgZmlsZSB0YWJsZXMgaW4gdGhlIHBvb2wuCi0gIHZlY3Rvcjx2b2lkKj4gYWxsb2NhdGlvbnNfOyAgLy8gQWxsIG90aGVyIG1lbW9yeSBhbGxvY2F0ZWQgaW4gdGhlIHBvb2wuCi0KLSAgU3ltYm9sc0J5TmFtZU1hcCAgICAgIHN5bWJvbHNfYnlfbmFtZV87Ci0gIEZpbGVzQnlOYW1lTWFwICAgICAgICBmaWxlc19ieV9uYW1lXzsKLSAgRXh0ZW5zaW9uc0dyb3VwZWRCeURlc2NyaXB0b3JNYXAgZXh0ZW5zaW9uc187Ci0KLSAgc3RydWN0IENoZWNrUG9pbnQgewotICAgIGV4cGxpY2l0IENoZWNrUG9pbnQoY29uc3QgVGFibGVzKiB0YWJsZXMpCi0gICAgICA6IHN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnQodGFibGVzLT5zdHJpbmdzXy5zaXplKCkpLAotICAgICAgICBtZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludCh0YWJsZXMtPm1lc3NhZ2VzXy5zaXplKCkpLAotICAgICAgICBmaWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludCh0YWJsZXMtPmZpbGVfdGFibGVzXy5zaXplKCkpLAotICAgICAgICBhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludCh0YWJsZXMtPmFsbG9jYXRpb25zXy5zaXplKCkpLAotICAgICAgICBwZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQoCi0gICAgICAgICAgICB0YWJsZXMtPnN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpKSwKLSAgICAgICAgcGVuZGluZ19maWxlc19iZWZvcmVfY2hlY2twb2ludCgKLSAgICAgICAgICAgIHRhYmxlcy0+ZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpKSwKLSAgICAgICAgcGVuZGluZ19leHRlbnNpb25zX2JlZm9yZV9jaGVja3BvaW50KAotICAgICAgICAgICAgdGFibGVzLT5leHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKSkgewotICAgIH0KLSAgICBpbnQgc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludDsKLSAgICBpbnQgbWVzc2FnZXNfYmVmb3JlX2NoZWNrcG9pbnQ7Ci0gICAgaW50IGZpbGVfdGFibGVzX2JlZm9yZV9jaGVja3BvaW50OwotICAgIGludCBhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludDsKLSAgICBpbnQgcGVuZGluZ19zeW1ib2xzX2JlZm9yZV9jaGVja3BvaW50OwotICAgIGludCBwZW5kaW5nX2ZpbGVzX2JlZm9yZV9jaGVja3BvaW50OwotICAgIGludCBwZW5kaW5nX2V4dGVuc2lvbnNfYmVmb3JlX2NoZWNrcG9pbnQ7Ci0gIH07Ci0gIHZlY3RvcjxDaGVja1BvaW50PiBjaGVja3BvaW50c187Ci0gIHZlY3Rvcjxjb25zdCBjaGFyKiAgICAgID4gc3ltYm9sc19hZnRlcl9jaGVja3BvaW50XzsKLSAgdmVjdG9yPGNvbnN0IGNoYXIqICAgICAgPiBmaWxlc19hZnRlcl9jaGVja3BvaW50XzsKLSAgdmVjdG9yPERlc2NyaXB0b3JJbnRQYWlyPiBleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfOwotCi0gIC8vIEFsbG9jYXRlIHNvbWUgYnl0ZXMgd2hpY2ggd2lsbCBiZSByZWNsYWltZWQgd2hlbiB0aGUgcG9vbCBpcwotICAvLyBkZXN0cm95ZWQuCi0gIHZvaWQqIEFsbG9jYXRlQnl0ZXMoaW50IHNpemUpOwotfTsKLQotLy8gQ29udGFpbnMgdGFibGVzIHNwZWNpZmljIHRvIGEgcGFydGljdWxhciBmaWxlLiAgVGhlc2UgdGFibGVzIGFyZSBub3QKLS8vIG1vZGlmaWVkIG9uY2UgdGhlIGZpbGUgaGFzIGJlZW4gY29uc3RydWN0ZWQsIHNvIHRoZXkgbmVlZCBub3QgYmUKLS8vIHByb3RlY3RlZCBieSBhIG11dGV4LiAgVGhpcyBtYWtlcyBvcGVyYXRpb25zIHRoYXQgZGVwZW5kIG9ubHkgb24gdGhlCi0vLyBjb250ZW50cyBvZiBhIHNpbmdsZSBmaWxlIC0tIGUuZy4gRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlOYW1lKCkgLS0KLS8vIGxvY2stZnJlZS4KLS8vCi0vLyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCB0aGUgZGVmaW5pdGlvbnMgb2YgdGhlIG1ldGhvZHMgb2YKLS8vIEZpbGVEZXNjcmlwdG9yVGFibGVzIGFuZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzIGFyZSBpbnRlcmxlYXZlZCBiZWxvdy4KLS8vIFRoZXNlIHVzZWQgdG8gYmUgYSBzaW5nbGUgY2xhc3MuCi1jbGFzcyBGaWxlRGVzY3JpcHRvclRhYmxlcyB7Ci0gcHVibGljOgotICBGaWxlRGVzY3JpcHRvclRhYmxlcygpOwotICB+RmlsZURlc2NyaXB0b3JUYWJsZXMoKTsKLQotICAvLyBFbXB0eSB0YWJsZSwgdXNlZCB3aXRoIHBsYWNlaG9sZGVyIGZpbGVzLgotICBpbmxpbmUgc3RhdGljIGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzJiBHZXRFbXB0eUluc3RhbmNlKCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRmluZGluZyBpdGVtcy4KLQotICAvLyBGaW5kIHN5bWJvbHMuICBUaGVzZSByZXR1cm4gYSBudWxsIFN5bWJvbCAoc3ltYm9sLklzTnVsbCgpIGlzIHRydWUpCi0gIC8vIGlmIG5vdCBmb3VuZC4KLSAgaW5saW5lIFN5bWJvbCBGaW5kTmVzdGVkU3ltYm9sKGNvbnN0IHZvaWQqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gIGlubGluZSBTeW1ib2wgRmluZE5lc3RlZFN5bWJvbE9mVHlwZShjb25zdCB2b2lkKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTeW1ib2w6OlR5cGUgdHlwZSkgY29uc3Q7Ci0KLSAgLy8gVGhlc2UgcmV0dXJuIE5VTEwgaWYgbm90IGZvdW5kLgotICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeU51bWJlcigKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0OwotICBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoCi0gICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIGxvd2VyY2FzZV9uYW1lKSBjb25zdDsKLSAgaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKAotICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBjYW1lbGNhc2VfbmFtZSkgY29uc3Q7Ci0gIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOdW1iZXIoCi0gICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwgaW50IG51bWJlcikgY29uc3Q7Ci0gIC8vIFRoaXMgY3JlYXRlcyBhIG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yIGlmIG5vdCBmb3VuZCwgaW4gYSB0aHJlYWQtc2FmZSB3YXkuCi0gIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bigKLSAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0OwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEFkZGluZyBpdGVtcy4KLQotICAvLyBUaGVzZSBhZGQgaXRlbXMgdG8gdGhlIGNvcnJlc3BvbmRpbmcgdGFibGVzLiAgVGhleSByZXR1cm4gZmFsc2UgaWYKLSAgLy8gdGhlIGtleSBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgdGFibGUuICBGb3IgQWRkQWxpYXNVbmRlclBhcmVudCgpLCB0aGUKLSAgLy8gc3RyaW5nIHBhc3NlZCBpbiBtdXN0IGJlIG9uZSB0aGF0IHdhcyBjb25zdHJ1Y3RlZCB1c2luZyBBbGxvY2F0ZVN0cmluZygpLAotICAvLyBhcyBpdCB3aWxsIGJlIHVzZWQgYXMgYSBrZXkgaW4gdGhlIHN5bWJvbHNfYnlfcGFyZW50XyBtYXAgd2l0aG91dCBjb3B5aW5nLgotICBib29sIEFkZEFsaWFzVW5kZXJQYXJlbnQoY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBTeW1ib2wgc3ltYm9sKTsKLSAgYm9vbCBBZGRGaWVsZEJ5TnVtYmVyKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotICBib29sIEFkZEVudW1WYWx1ZUJ5TnVtYmVyKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKTsKLQotICAvLyBBZGRzIHRoZSBmaWVsZCB0byB0aGUgbG93ZXJjYXNlX25hbWUgYW5kIGNhbWVsY2FzZV9uYW1lIG1hcHMuICBOZXZlcgotICAvLyBmYWlscyBiZWNhdXNlIHdlIGFsbG93IGR1cGxpY2F0ZXM7IHRoZSBmaXJzdCBmaWVsZCBieSB0aGUgbmFtZSB3aW5zLgotICB2b2lkIEFkZEZpZWxkQnlTdHlsaXplZE5hbWVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotCi0gIC8vIFBvcHVsYXRlcyBwLT5maXJzdC0+bG9jYXRpb25zX2J5X3BhdGhfIGZyb20gcC0+c2Vjb25kLgotICAvLyBVbnVzdWFsIHNpZ25hdHVyZSBkaWN0YXRlZCBieSBHb29nbGVPbmNlRHluYW1pYy4KLSAgc3RhdGljIHZvaWQgQnVpbGRMb2NhdGlvbnNCeVBhdGgoCi0gICAgICBwYWlyPGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzKiwgY29uc3QgU291cmNlQ29kZUluZm8qPiogcCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbG9jYXRpb24gZGVub3RlZCBieSB0aGUgc3BlY2lmaWVkIHBhdGggdGhyb3VnaCBpbmZvLAotICAvLyBvciBOVUxMIGlmIG5vdCBmb3VuZC4KLSAgLy8gVGhlIHZhbHVlIG9mIGluZm8gbXVzdCBiZSB0aGF0IG9mIHRoZSBjb3JyZXNwb25kaW5nIEZpbGVEZXNjcmlwdG9yLgotICAvLyAoQ29uY2VwdHVhbGx5IGEgcHVyZSBmdW5jdGlvbiwgYnV0IHN0YXRlZnVsIGFzIGFuIG9wdGltaXNhdGlvbi4pCi0gIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBHZXRTb3VyY2VMb2NhdGlvbigKLSAgICAgIGNvbnN0IHZlY3RvcjxpbnQ+JiBwYXRoLCBjb25zdCBTb3VyY2VDb2RlSW5mbyogaW5mbykgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBTeW1ib2xzQnlQYXJlbnRNYXAgICAgc3ltYm9sc19ieV9wYXJlbnRfOwotICBGaWVsZHNCeU5hbWVNYXAgICAgICAgZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lXzsKLSAgRmllbGRzQnlOYW1lTWFwICAgICAgIGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV87Ci0gIEZpZWxkc0J5TnVtYmVyTWFwICAgICBmaWVsZHNfYnlfbnVtYmVyXzsgICAgICAgLy8gTm90IGluY2x1ZGluZyBleHRlbnNpb25zLgotICBFbnVtVmFsdWVzQnlOdW1iZXJNYXAgZW51bV92YWx1ZXNfYnlfbnVtYmVyXzsKLSAgbXV0YWJsZSBFbnVtVmFsdWVzQnlOdW1iZXJNYXAgdW5rbm93bl9lbnVtX3ZhbHVlc19ieV9udW1iZXJfCi0gICAgICBHT09HTEVfR1VBUkRFRF9CWSh1bmtub3duX2VudW1fdmFsdWVzX211Xyk7Ci0KLSAgLy8gUG9wdWxhdGVkIG9uIGZpcnN0IHJlcXVlc3QgdG8gc2F2ZSBzcGFjZSwgaGVuY2UgY29uc3RuZXNzIGdhbWVzLgotICBtdXRhYmxlIEdvb2dsZU9uY2VEeW5hbWljIGxvY2F0aW9uc19ieV9wYXRoX29uY2VfOwotICBtdXRhYmxlIExvY2F0aW9uc0J5UGF0aE1hcCBsb2NhdGlvbnNfYnlfcGF0aF87Ci0KLSAgLy8gTXV0ZXggdG8gcHJvdGVjdCB0aGUgdW5rbm93bi1lbnVtLXZhbHVlIG1hcCBkdWUgdG8gZHluYW1pYwotICAvLyBFbnVtVmFsdWVEZXNjcmlwdG9yIGNyZWF0aW9uIG9uIHVua25vd24gdmFsdWVzLgotICBtdXRhYmxlIE11dGV4IHVua25vd25fZW51bV92YWx1ZXNfbXVfOwotfTsKLQotRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6VGFibGVzKCkKLSAgICAvLyBTdGFydCBzb21lIGhhc2hfbWFwIGFuZCBoYXNoX3NldCBvYmplY3RzIHdpdGggYSBzbWFsbCAjIG9mIGJ1Y2tldHMKLSAgICA6IGtub3duX2JhZF9maWxlc18oMyksCi0gICAgICBrbm93bl9iYWRfc3ltYm9sc18oMyksCi0gICAgICBleHRlbnNpb25zX2xvYWRlZF9mcm9tX2RiXygzKSwKLSAgICAgIHN5bWJvbHNfYnlfbmFtZV8oMyksCi0gICAgICBmaWxlc19ieV9uYW1lXygzKSB7fQotCi0KLURlc2NyaXB0b3JQb29sOjpUYWJsZXM6On5UYWJsZXMoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soY2hlY2twb2ludHNfLmVtcHR5KCkpOwotICAvLyBOb3RlIHRoYXQgdGhlIGRlbGV0aW9uIG9yZGVyIGlzIGltcG9ydGFudCwgc2luY2UgdGhlIGRlc3RydWN0b3JzIG9mIHNvbWUKLSAgLy8gbWVzc2FnZXMgbWF5IHJlZmVyIHRvIG9iamVjdHMgaW4gYWxsb2NhdGlvbnNfLgotICBTVExEZWxldGVFbGVtZW50cygmbWVzc2FnZXNfKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxvY2F0aW9uc18uc2l6ZSgpOyBpKyspIHsKLSAgICBvcGVyYXRvciBkZWxldGUoYWxsb2NhdGlvbnNfW2ldKTsKLSAgfQotICBTVExEZWxldGVFbGVtZW50cygmc3RyaW5nc18pOwotICBTVExEZWxldGVFbGVtZW50cygmZmlsZV90YWJsZXNfKTsKLX0KLQotRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbGVEZXNjcmlwdG9yVGFibGVzKCkKLSAgICAvLyBJbml0aWFsaXplIGFsbCB0aGUgaGFzaCB0YWJsZXMgdG8gc3RhcnQgb3V0IHdpdGggYSBzbWFsbCAjIG9mIGJ1Y2tldHMKLSAgICA6IHN5bWJvbHNfYnlfcGFyZW50XygzKSwKLSAgICAgIGZpZWxkc19ieV9sb3dlcmNhc2VfbmFtZV8oMyksCi0gICAgICBmaWVsZHNfYnlfY2FtZWxjYXNlX25hbWVfKDMpLAotICAgICAgZmllbGRzX2J5X251bWJlcl8oMyksCi0gICAgICBlbnVtX3ZhbHVlc19ieV9udW1iZXJfKDMpLAotICAgICAgdW5rbm93bl9lbnVtX3ZhbHVlc19ieV9udW1iZXJfKDMpIHsKLX0KLQotRmlsZURlc2NyaXB0b3JUYWJsZXM6On5GaWxlRGVzY3JpcHRvclRhYmxlcygpIHt9Ci0KLW5hbWVzcGFjZSB7Ci0KLUZpbGVEZXNjcmlwdG9yVGFibGVzKiBmaWxlX2Rlc2NyaXB0b3JfdGFibGVzXyA9IE5VTEw7Ci1HT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKGZpbGVfZGVzY3JpcHRvcl90YWJsZXNfb25jZV9pbml0Xyk7Ci0KLXZvaWQgRGVsZXRlRmlsZURlc2NyaXB0b3JUYWJsZXMoKSB7Ci0gIGRlbGV0ZSBmaWxlX2Rlc2NyaXB0b3JfdGFibGVzXzsKLSAgZmlsZV9kZXNjcmlwdG9yX3RhYmxlc18gPSBOVUxMOwotfQotCi12b2lkIEluaXRGaWxlRGVzY3JpcHRvclRhYmxlcygpIHsKLSAgZmlsZV9kZXNjcmlwdG9yX3RhYmxlc18gPSBuZXcgRmlsZURlc2NyaXB0b3JUYWJsZXMoKTsKLSAgaW50ZXJuYWw6Ok9uU2h1dGRvd24oJkRlbGV0ZUZpbGVEZXNjcmlwdG9yVGFibGVzKTsKLX0KLQotaW5saW5lIHZvaWQgSW5pdEZpbGVEZXNjcmlwdG9yVGFibGVzT25jZSgpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgKLSAgICAgICZmaWxlX2Rlc2NyaXB0b3JfdGFibGVzX29uY2VfaW5pdF8sICZJbml0RmlsZURlc2NyaXB0b3JUYWJsZXMpOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLWlubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyYgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkdldEVtcHR5SW5zdGFuY2UoKSB7Ci0gIEluaXRGaWxlRGVzY3JpcHRvclRhYmxlc09uY2UoKTsKLSAgcmV0dXJuICpmaWxlX2Rlc2NyaXB0b3JfdGFibGVzXzsKLX0KLQotdm9pZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBZGRDaGVja3BvaW50KCkgewotICBjaGVja3BvaW50c18ucHVzaF9iYWNrKENoZWNrUG9pbnQodGhpcykpOwotfQotCi12b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkNsZWFyTGFzdENoZWNrcG9pbnQoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soIWNoZWNrcG9pbnRzXy5lbXB0eSgpKTsKLSAgY2hlY2twb2ludHNfLnBvcF9iYWNrKCk7Ci0gIGlmIChjaGVja3BvaW50c18uZW1wdHkoKSkgewotICAgIC8vIEFsbCBjaGVja3BvaW50cyBoYXZlIGJlZW4gY2xlYXJlZDogd2UgY2FuIG5vdyBjb21taXQgYWxsIG9mIHRoZSBwZW5kaW5nCi0gICAgLy8gZGF0YS4KLSAgICBzeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfLmNsZWFyKCk7Ci0gICAgZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKLSAgICBleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfLmNsZWFyKCk7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpSb2xsYmFja1RvTGFzdENoZWNrcG9pbnQoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soIWNoZWNrcG9pbnRzXy5lbXB0eSgpKTsKLSAgY29uc3QgQ2hlY2tQb2ludCYgY2hlY2twb2ludCA9IGNoZWNrcG9pbnRzXy5iYWNrKCk7Ci0KLSAgZm9yIChpbnQgaSA9IGNoZWNrcG9pbnQucGVuZGluZ19zeW1ib2xzX2JlZm9yZV9jaGVja3BvaW50OwotICAgICAgIGkgPCBzeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKTsKLSAgICAgICBpKyspIHsKLSAgICBzeW1ib2xzX2J5X25hbWVfLmVyYXNlKHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF9baV0pOwotICB9Ci0gIGZvciAoaW50IGkgPSBjaGVja3BvaW50LnBlbmRpbmdfZmlsZXNfYmVmb3JlX2NoZWNrcG9pbnQ7Ci0gICAgICAgaSA8IGZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKTsKLSAgICAgICBpKyspIHsKLSAgICBmaWxlc19ieV9uYW1lXy5lcmFzZShmaWxlc19hZnRlcl9jaGVja3BvaW50X1tpXSk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IGNoZWNrcG9pbnQucGVuZGluZ19leHRlbnNpb25zX2JlZm9yZV9jaGVja3BvaW50OwotICAgICAgIGkgPCBleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKTsKLSAgICAgICBpKyspIHsKLSAgICBleHRlbnNpb25zXy5lcmFzZShleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfW2ldKTsKLSAgfQotCi0gIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8ucmVzaXplKAotICAgICAgY2hlY2twb2ludC5wZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQpOwotICBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5yZXNpemUoY2hlY2twb2ludC5wZW5kaW5nX2ZpbGVzX2JlZm9yZV9jaGVja3BvaW50KTsKLSAgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5yZXNpemUoCi0gICAgICBjaGVja3BvaW50LnBlbmRpbmdfZXh0ZW5zaW9uc19iZWZvcmVfY2hlY2twb2ludCk7Ci0KLSAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoCi0gICAgICBzdHJpbmdzXy5iZWdpbigpICsgY2hlY2twb2ludC5zdHJpbmdzX2JlZm9yZV9jaGVja3BvaW50LCBzdHJpbmdzXy5lbmQoKSk7Ci0gIFNUTERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKAotICAgICAgbWVzc2FnZXNfLmJlZ2luKCkgKyBjaGVja3BvaW50Lm1lc3NhZ2VzX2JlZm9yZV9jaGVja3BvaW50LAotICAgICAgbWVzc2FnZXNfLmVuZCgpKTsKLSAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoCi0gICAgICBmaWxlX3RhYmxlc18uYmVnaW4oKSArIGNoZWNrcG9pbnQuZmlsZV90YWJsZXNfYmVmb3JlX2NoZWNrcG9pbnQsCi0gICAgICBmaWxlX3RhYmxlc18uZW5kKCkpOwotICBmb3IgKGludCBpID0gY2hlY2twb2ludC5hbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludDsKLSAgICAgICBpIDwgYWxsb2NhdGlvbnNfLnNpemUoKTsKLSAgICAgICBpKyspIHsKLSAgICBvcGVyYXRvciBkZWxldGUoYWxsb2NhdGlvbnNfW2ldKTsKLSAgfQotCi0gIHN0cmluZ3NfLnJlc2l6ZShjaGVja3BvaW50LnN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnQpOwotICBtZXNzYWdlc18ucmVzaXplKGNoZWNrcG9pbnQubWVzc2FnZXNfYmVmb3JlX2NoZWNrcG9pbnQpOwotICBmaWxlX3RhYmxlc18ucmVzaXplKGNoZWNrcG9pbnQuZmlsZV90YWJsZXNfYmVmb3JlX2NoZWNrcG9pbnQpOwotICBhbGxvY2F0aW9uc18ucmVzaXplKGNoZWNrcG9pbnQuYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnQpOwotICBjaGVja3BvaW50c18ucG9wX2JhY2soKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1pbmxpbmUgU3ltYm9sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkZpbmRTeW1ib2woY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgY29uc3QgU3ltYm9sKiByZXN1bHQgPSBGaW5kT3JOdWxsKHN5bWJvbHNfYnlfbmFtZV8sIGtleS5jX3N0cigpKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGtOdWxsU3ltYm9sOwotICB9IGVsc2UgewotICAgIHJldHVybiAqcmVzdWx0OwotICB9Ci19Ci0KLWlubGluZSBTeW1ib2wgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmROZXN0ZWRTeW1ib2woCi0gICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgY29uc3QgU3ltYm9sKiByZXN1bHQgPQotICAgIEZpbmRPck51bGwoc3ltYm9sc19ieV9wYXJlbnRfLCBQb2ludGVyU3RyaW5nUGFpcihwYXJlbnQsIG5hbWUuY19zdHIoKSkpOwotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICByZXR1cm4ga051bGxTeW1ib2w7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuICpyZXN1bHQ7Ci0gIH0KLX0KLQotaW5saW5lIFN5bWJvbCBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZE5lc3RlZFN5bWJvbE9mVHlwZSgKLSAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3QgU3ltYm9sOjpUeXBlIHR5cGUpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9IEZpbmROZXN0ZWRTeW1ib2wocGFyZW50LCBuYW1lKTsKLSAgaWYgKHJlc3VsdC50eXBlICE9IHR5cGUpIHJldHVybiBrTnVsbFN5bWJvbDsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3ltYm9sIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkZpbmRCeU5hbWVIZWxwZXIoCi0gICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICBNdXRleExvY2tNYXliZSBsb2NrKHBvb2wtPm11dGV4Xyk7Ci0gIGtub3duX2JhZF9zeW1ib2xzXy5jbGVhcigpOwotICBrbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7Ci0gIFN5bWJvbCByZXN1bHQgPSBGaW5kU3ltYm9sKG5hbWUpOwotCi0gIGlmIChyZXN1bHQuSXNOdWxsKCkgJiYgcG9vbC0+dW5kZXJsYXlfICE9IE5VTEwpIHsKLSAgICAvLyBTeW1ib2wgbm90IGZvdW5kOyBjaGVjayB0aGUgdW5kZXJsYXkuCi0gICAgcmVzdWx0ID0KLSAgICAgIHBvb2wtPnVuZGVybGF5Xy0+dGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcihwb29sLT51bmRlcmxheV8sIG5hbWUpOwotICB9Ci0KLSAgaWYgKHJlc3VsdC5Jc051bGwoKSkgewotICAgIC8vIFN5bWJvbCBzdGlsbCBub3QgZm91bmQsIHNvIGNoZWNrIGZhbGxiYWNrIGRhdGFiYXNlLgotICAgIGlmIChwb29sLT5UcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKG5hbWUpKSB7Ci0gICAgICByZXN1bHQgPSBGaW5kU3ltYm9sKG5hbWUpOwotICAgIH0KLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWlubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6RmluZEZpbGUoCi0gICAgY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgcmV0dXJuIEZpbmRQdHJPck51bGwoZmlsZXNfYnlfbmFtZV8sIGtleS5jX3N0cigpKTsKLX0KLQotaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRGaWVsZEJ5TnVtYmVyKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwgaW50IG51bWJlcikgY29uc3QgewotICByZXR1cm4gRmluZFB0ck9yTnVsbChmaWVsZHNfYnlfbnVtYmVyXywgc3RkOjptYWtlX3BhaXIocGFyZW50LCBudW1iZXIpKTsKLX0KLQotaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKLSAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbG93ZXJjYXNlX25hbWUpIGNvbnN0IHsKLSAgcmV0dXJuIEZpbmRQdHJPck51bGwoZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lXywKLSAgICAgICAgICAgICAgICAgICAgICAgUG9pbnRlclN0cmluZ1BhaXIocGFyZW50LCBsb3dlcmNhc2VfbmFtZS5jX3N0cigpKSk7Ci19Ci0KLWlubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoCi0gICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIGNhbWVsY2FzZV9uYW1lKSBjb25zdCB7Ci0gIHJldHVybiBGaW5kUHRyT3JOdWxsKGZpZWxkc19ieV9jYW1lbGNhc2VfbmFtZV8sCi0gICAgICAgICAgICAgICAgICAgICAgIFBvaW50ZXJTdHJpbmdQYWlyKHBhcmVudCwgY2FtZWxjYXNlX25hbWUuY19zdHIoKSkpOwotfQotCi1pbmxpbmUgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRFbnVtVmFsdWVCeU51bWJlcigKLSAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LCBpbnQgbnVtYmVyKSBjb25zdCB7Ci0gIHJldHVybiBGaW5kUHRyT3JOdWxsKGVudW1fdmFsdWVzX2J5X251bWJlcl8sIHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgbnVtYmVyKSk7Ci19Ci0KLWlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKgotRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRFbnVtVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKAotICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0IHsKLSAgLy8gRmlyc3QgdHJ5LCB3aXRoIG1hcCBvZiBjb21waWxlZC1pbiB2YWx1ZXMuCi0gIHsKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZXNjID0KLSAgICAgICAgRmluZFB0ck9yTnVsbChlbnVtX3ZhbHVlc19ieV9udW1iZXJfLCBzdGQ6Om1ha2VfcGFpcihwYXJlbnQsIG51bWJlcikpOwotICAgIGlmIChkZXNjICE9IE5VTEwpIHsKLSAgICAgIHJldHVybiBkZXNjOwotICAgIH0KLSAgfQotICAvLyBTZWNvbmQgdHJ5LCB3aXRoIHJlYWRlciBsb2NrIGhlbGQgb24gdW5rbm93biBlbnVtIHZhbHVlczogY29tbW9uIGNhc2UuCi0gIHsKLSAgICBSZWFkZXJNdXRleExvY2sgbCgmdW5rbm93bl9lbnVtX3ZhbHVlc19tdV8pOwotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2MgPSBGaW5kUHRyT3JOdWxsKAotICAgICAgICB1bmtub3duX2VudW1fdmFsdWVzX2J5X251bWJlcl8sIHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgbnVtYmVyKSk7Ci0gICAgaWYgKGRlc2MgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIGRlc2M7Ci0gICAgfQotICB9Ci0gIC8vIElmIG5vdCBmb3VuZCwgdHJ5IGFnYWluIHdpdGggd3JpdGVyIGxvY2sgaGVsZCwgYW5kIGNyZWF0ZSBuZXcgZGVzY3JpcHRvciBpZgotICAvLyBuZWNlc3NhcnkuCi0gIHsKLSAgICBXcml0ZXJNdXRleExvY2sgbCgmdW5rbm93bl9lbnVtX3ZhbHVlc19tdV8pOwotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2MgPSBGaW5kUHRyT3JOdWxsKAotICAgICAgICB1bmtub3duX2VudW1fdmFsdWVzX2J5X251bWJlcl8sIHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgbnVtYmVyKSk7Ci0gICAgaWYgKGRlc2MgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIGRlc2M7Ci0gICAgfQotCi0gICAgLy8gQ3JlYXRlIGFuIEVudW1WYWx1ZURlc2NyaXB0b3IgZHluYW1pY2FsbHkuIFdlIGRvbid0IGluc2VydCBpdCBpbnRvIHRoZQotICAgIC8vIEVudW1EZXNjcmlwdG9yIChpdCdzIG5vdCBhIHBhcnQgb2YgdGhlIGVudW0gYXMgb3JpZ2luYWxseSBkZWZpbmVkKSwgYnV0Ci0gICAgLy8gd2UgZG8gaW5zZXJ0IGl0IGludG8gdGhlIHRhYmxlIHNvIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgc2FtZSBwb2ludGVyCi0gICAgLy8gbGF0ZXIuCi0gICAgc3RyaW5nIGVudW1fdmFsdWVfbmFtZSA9IFN0cmluZ1ByaW50ZigKLSAgICAgICAgIlVOS05PV05fRU5VTV9WQUxVRV8lc18lZCIsIHBhcmVudC0+bmFtZSgpLmNfc3RyKCksIG51bWJlcik7Ci0gICAgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyogdGFibGVzID0KLSAgICAgICAgY29uc3RfY2FzdDxEZXNjcmlwdG9yUG9vbDo6VGFibGVzKj4oRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNfLmdldCgpKTsKLSAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXMtPkFsbG9jYXRlPEVudW1WYWx1ZURlc2NyaXB0b3I+KCk7Ci0gICAgcmVzdWx0LT5uYW1lXyA9IHRhYmxlcy0+QWxsb2NhdGVTdHJpbmcoZW51bV92YWx1ZV9uYW1lKTsKLSAgICByZXN1bHQtPmZ1bGxfbmFtZV8gPSB0YWJsZXMtPkFsbG9jYXRlU3RyaW5nKHBhcmVudC0+ZnVsbF9uYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iICsgZW51bV92YWx1ZV9uYW1lKTsKLSAgICByZXN1bHQtPm51bWJlcl8gPSBudW1iZXI7Ci0gICAgcmVzdWx0LT50eXBlXyA9IHBhcmVudDsKLSAgICByZXN1bHQtPm9wdGlvbnNfID0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgICBJbnNlcnRJZk5vdFByZXNlbnQoJnVua25vd25fZW51bV92YWx1ZXNfYnlfbnVtYmVyXywKLSAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIocGFyZW50LCBudW1iZXIpLCByZXN1bHQpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotCi1pbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kRXh0ZW5zaW9uKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCBpbnQgbnVtYmVyKSB7Ci0gIHJldHVybiBGaW5kUHRyT3JOdWxsKGV4dGVuc2lvbnNfLCBzdGQ6Om1ha2VfcGFpcihleHRlbmRlZSwgbnVtYmVyKSk7Ci19Ci0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkZpbmRBbGxFeHRlbnNpb25zKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3QgewotICBFeHRlbnNpb25zR3JvdXBlZEJ5RGVzY3JpcHRvck1hcDo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgZXh0ZW5zaW9uc18ubG93ZXJfYm91bmQoc3RkOjptYWtlX3BhaXIoZXh0ZW5kZWUsIDApKTsKLSAgZm9yICg7IGl0ICE9IGV4dGVuc2lvbnNfLmVuZCgpICYmIGl0LT5maXJzdC5maXJzdCA9PSBleHRlbmRlZTsgKytpdCkgewotICAgIG91dC0+cHVzaF9iYWNrKGl0LT5zZWNvbmQpOwotICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBZGRTeW1ib2woCi0gICAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsIFN5bWJvbCBzeW1ib2wpIHsKLSAgaWYgKEluc2VydElmTm90UHJlc2VudCgmc3ltYm9sc19ieV9uYW1lXywgZnVsbF9uYW1lLmNfc3RyKCksIHN5bWJvbCkpIHsKLSAgICBzeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfLnB1c2hfYmFjayhmdWxsX25hbWUuY19zdHIoKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkFkZEFsaWFzVW5kZXJQYXJlbnQoCi0gICAgY29uc3Qgdm9pZCogcGFyZW50LCBjb25zdCBzdHJpbmcmIG5hbWUsIFN5bWJvbCBzeW1ib2wpIHsKLSAgUG9pbnRlclN0cmluZ1BhaXIgYnlfcGFyZW50X2tleShwYXJlbnQsIG5hbWUuY19zdHIoKSk7Ci0gIHJldHVybiBJbnNlcnRJZk5vdFByZXNlbnQoJnN5bWJvbHNfYnlfcGFyZW50XywgYnlfcGFyZW50X2tleSwgc3ltYm9sKTsKLX0KLQotYm9vbCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBZGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIGlmIChJbnNlcnRJZk5vdFByZXNlbnQoJmZpbGVzX2J5X25hbWVfLCBmaWxlLT5uYW1lKCkuY19zdHIoKSwgZmlsZSkpIHsKLSAgICBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5wdXNoX2JhY2soZmlsZS0+bmFtZSgpLmNfc3RyKCkpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpBZGRGaWVsZEJ5U3R5bGl6ZWROYW1lcygKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIGNvbnN0IHZvaWQqIHBhcmVudDsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIGlmIChmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCkgewotICAgICAgcGFyZW50ID0gZmllbGQtPmZpbGUoKTsKLSAgICB9IGVsc2UgewotICAgICAgcGFyZW50ID0gZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBwYXJlbnQgPSBmaWVsZC0+Y29udGFpbmluZ190eXBlKCk7Ci0gIH0KLQotICBQb2ludGVyU3RyaW5nUGFpciBsb3dlcmNhc2Vfa2V5KHBhcmVudCwgZmllbGQtPmxvd2VyY2FzZV9uYW1lKCkuY19zdHIoKSk7Ci0gIEluc2VydElmTm90UHJlc2VudCgmZmllbGRzX2J5X2xvd2VyY2FzZV9uYW1lXywgbG93ZXJjYXNlX2tleSwgZmllbGQpOwotCi0gIFBvaW50ZXJTdHJpbmdQYWlyIGNhbWVsY2FzZV9rZXkocGFyZW50LCBmaWVsZC0+Y2FtZWxjYXNlX25hbWUoKS5jX3N0cigpKTsKLSAgSW5zZXJ0SWZOb3RQcmVzZW50KCZmaWVsZHNfYnlfY2FtZWxjYXNlX25hbWVfLCBjYW1lbGNhc2Vfa2V5LCBmaWVsZCk7Ci19Ci0KLWJvb2wgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkFkZEZpZWxkQnlOdW1iZXIoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBEZXNjcmlwdG9ySW50UGFpciBrZXkoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZC0+bnVtYmVyKCkpOwotICByZXR1cm4gSW5zZXJ0SWZOb3RQcmVzZW50KCZmaWVsZHNfYnlfbnVtYmVyXywga2V5LCBmaWVsZCk7Ci19Ci0KLWJvb2wgRmlsZURlc2NyaXB0b3JUYWJsZXM6OkFkZEVudW1WYWx1ZUJ5TnVtYmVyKAotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSB7Ci0gIEVudW1JbnRQYWlyIGtleSh2YWx1ZS0+dHlwZSgpLCB2YWx1ZS0+bnVtYmVyKCkpOwotICByZXR1cm4gSW5zZXJ0SWZOb3RQcmVzZW50KCZlbnVtX3ZhbHVlc19ieV9udW1iZXJfLCBrZXksIHZhbHVlKTsKLX0KLQotYm9vbCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBZGRFeHRlbnNpb24oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBEZXNjcmlwdG9ySW50UGFpciBrZXkoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZC0+bnVtYmVyKCkpOwotICBpZiAoSW5zZXJ0SWZOb3RQcmVzZW50KCZleHRlbnNpb25zXywga2V5LCBmaWVsZCkpIHsKLSAgICBleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfLnB1c2hfYmFjayhrZXkpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+Ci1UeXBlKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBbGxvY2F0ZSgpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8VHlwZSo+KEFsbG9jYXRlQnl0ZXMoc2l6ZW9mKFR5cGUpKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+Ci1UeXBlKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBbGxvY2F0ZUFycmF5KGludCBjb3VudCkgewotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUeXBlKj4oQWxsb2NhdGVCeXRlcyhzaXplb2YoVHlwZSkgKiBjb3VudCkpOwotfQotCi1zdHJpbmcqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKLSAgc3RyaW5nKiByZXN1bHQgPSBuZXcgc3RyaW5nKHZhbHVlKTsKLSAgc3RyaW5nc18ucHVzaF9iYWNrKHJlc3VsdCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFR5cGU+Ci1UeXBlKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBbGxvY2F0ZU1lc3NhZ2UoVHlwZSogLyogZHVtbXkgKi8pIHsKLSAgVHlwZSogcmVzdWx0ID0gbmV3IFR5cGU7Ci0gIG1lc3NhZ2VzXy5wdXNoX2JhY2socmVzdWx0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRmlsZURlc2NyaXB0b3JUYWJsZXMqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlRmlsZVRhYmxlcygpIHsKLSAgRmlsZURlc2NyaXB0b3JUYWJsZXMqIHJlc3VsdCA9IG5ldyBGaWxlRGVzY3JpcHRvclRhYmxlczsKLSAgZmlsZV90YWJsZXNfLnB1c2hfYmFjayhyZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpBbGxvY2F0ZUJ5dGVzKGludCBzaXplKSB7Ci0gIC8vIFRPRE8oa2VudG9uKTogIFdvdWxkIGl0IGJlIHdvcnRod2hpbGUgdG8gaW1wbGVtZW50IHRoaXMgaW4gc29tZSBtb3JlCi0gIC8vIHNvcGhpc3RpY2F0ZWQgd2F5PyAgUHJvYmFibHkgbm90IGZvciB0aGUgb3BlbiBzb3VyY2UgcmVsZWFzZSwgYnV0IGZvcgotICAvLyBpbnRlcm5hbCB1c2Ugd2UgY291bGQgZWFzaWx5IHBsdWcgaW4gb25lIG9mIG91ciBleGlzdGluZyBtZW1vcnkgcG9vbAotICAvLyBhbGxvY2F0b3JzLi4uCi0gIGlmIChzaXplID09IDApIHJldHVybiBOVUxMOwotCi0gIHZvaWQqIHJlc3VsdCA9IG9wZXJhdG9yIG5ldyhzaXplKTsKLSAgYWxsb2NhdGlvbnNfLnB1c2hfYmFjayhyZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpCdWlsZExvY2F0aW9uc0J5UGF0aCgKLSAgICBwYWlyPGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzKiwgY29uc3QgU291cmNlQ29kZUluZm8qPiogcCkgewotICBmb3IgKGludCBpID0gMCwgbGVuID0gcC0+c2Vjb25kLT5sb2NhdGlvbl9zaXplKCk7IGkgPCBsZW47ICsraSkgewotICAgIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBsb2MgPSAmcC0+c2Vjb25kLT5sb2NhdGlvbigpLkdldChpKTsKLSAgICBwLT5maXJzdC0+bG9jYXRpb25zX2J5X3BhdGhfW0pvaW4obG9jLT5wYXRoKCksICIsIildID0gbG9jOwotICB9Ci19Ci0KLWNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6R2V0U291cmNlTG9jYXRpb24oCi0gICAgY29uc3QgdmVjdG9yPGludD4mIHBhdGgsIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBpbmZvKSBjb25zdCB7Ci0gIHBhaXI8Y29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqLCBjb25zdCBTb3VyY2VDb2RlSW5mbyo+IHAoCi0gICAgICBzdGQ6Om1ha2VfcGFpcih0aGlzLCBpbmZvKSk7Ci0gIGxvY2F0aW9uc19ieV9wYXRoX29uY2VfLkluaXQoJkZpbGVEZXNjcmlwdG9yVGFibGVzOjpCdWlsZExvY2F0aW9uc0J5UGF0aCwgJnApOwotICByZXR1cm4gRmluZFB0ck9yTnVsbChsb2NhdGlvbnNfYnlfcGF0aF8sIEpvaW4ocGF0aCwgIiwiKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIERlc2NyaXB0b3JQb29sCi0KLURlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6fkVycm9yQ29sbGVjdG9yKCkge30KLQotRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKCkKLSAgOiBtdXRleF8oTlVMTCksCi0gICAgZmFsbGJhY2tfZGF0YWJhc2VfKE5VTEwpLAotICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKLSAgICB1bmRlcmxheV8oTlVMTCksCi0gICAgdGFibGVzXyhuZXcgVGFibGVzKSwKLSAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCi0gICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpLAotICAgIGVuZm9yY2Vfd2Vha18oZmFsc2UpIHt9Ci0KLURlc2NyaXB0b3JQb29sOjpEZXNjcmlwdG9yUG9vbChEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCi0gIDogbXV0ZXhfKG5ldyBNdXRleCksCi0gICAgZmFsbGJhY2tfZGF0YWJhc2VfKGZhbGxiYWNrX2RhdGFiYXNlKSwKLSAgICBkZWZhdWx0X2Vycm9yX2NvbGxlY3Rvcl8oZXJyb3JfY29sbGVjdG9yKSwKLSAgICB1bmRlcmxheV8oTlVMTCksCi0gICAgdGFibGVzXyhuZXcgVGFibGVzKSwKLSAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCi0gICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpLAotICAgIGVuZm9yY2Vfd2Vha18oZmFsc2UpIHsKLX0KLQotRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkKLSAgOiBtdXRleF8oTlVMTCksCi0gICAgZmFsbGJhY2tfZGF0YWJhc2VfKE5VTEwpLAotICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXyhOVUxMKSwKLSAgICB1bmRlcmxheV8odW5kZXJsYXkpLAotICAgIHRhYmxlc18obmV3IFRhYmxlcyksCi0gICAgZW5mb3JjZV9kZXBlbmRlbmNpZXNfKHRydWUpLAotICAgIGFsbG93X3Vua25vd25fKGZhbHNlKSwKLSAgICBlbmZvcmNlX3dlYWtfKGZhbHNlKSB7fQotCi1EZXNjcmlwdG9yUG9vbDo6fkRlc2NyaXB0b3JQb29sKCkgewotICBpZiAobXV0ZXhfICE9IE5VTEwpIGRlbGV0ZSBtdXRleF87Ci19Ci0KLS8vIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGUoKSBkZWZpbmVkIGxhdGVyLgotLy8gRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoKSBkZWZpbmVkIGxhdGVyLgotCi12b2lkIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbERvbnRFbmZvcmNlRGVwZW5kZW5jaWVzKCkgewotICBlbmZvcmNlX2RlcGVuZGVuY2llc18gPSBmYWxzZTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yUG9vbDo6QWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKGNvbnN0IHN0cmluZyYgZmlsZV9uYW1lKSB7Ci0gIHVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLmluc2VydChmaWxlX25hbWUpOwotfQotCi12b2lkIERlc2NyaXB0b3JQb29sOjpDbGVhclVudXNlZEltcG9ydFRyYWNrRmlsZXMoKSB7Ci0gIHVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLmNsZWFyKCk7Ci19Ci0KLWJvb2wgRGVzY3JpcHRvclBvb2w6OkludGVybmFsSXNGaWxlTG9hZGVkKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIGNvbnN0IHsKLSAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOwotICByZXR1cm4gdGFibGVzXy0+RmluZEZpbGUoZmlsZW5hbWUpICE9IE5VTEw7Ci19Ci0KLS8vIGdlbmVyYXRlZF9wb29sID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotbmFtZXNwYWNlIHsKLQotCi1FbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKiBnZW5lcmF0ZWRfZGF0YWJhc2VfID0gTlVMTDsKLURlc2NyaXB0b3JQb29sKiBnZW5lcmF0ZWRfcG9vbF8gPSBOVUxMOwotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShnZW5lcmF0ZWRfcG9vbF9pbml0Xyk7Ci0KLXZvaWQgRGVsZXRlR2VuZXJhdGVkUG9vbCgpIHsKLSAgZGVsZXRlIGdlbmVyYXRlZF9kYXRhYmFzZV87Ci0gIGdlbmVyYXRlZF9kYXRhYmFzZV8gPSBOVUxMOwotICBkZWxldGUgZ2VuZXJhdGVkX3Bvb2xfOwotICBnZW5lcmF0ZWRfcG9vbF8gPSBOVUxMOwotfQotCi1zdGF0aWMgdm9pZCBJbml0R2VuZXJhdGVkUG9vbCgpIHsKLSAgZ2VuZXJhdGVkX2RhdGFiYXNlXyA9IG5ldyBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOwotICBnZW5lcmF0ZWRfcG9vbF8gPSBuZXcgRGVzY3JpcHRvclBvb2woZ2VuZXJhdGVkX2RhdGFiYXNlXyk7Ci0KLSAgaW50ZXJuYWw6Ok9uU2h1dGRvd24oJkRlbGV0ZUdlbmVyYXRlZFBvb2wpOwotfQotCi1pbmxpbmUgdm9pZCBJbml0R2VuZXJhdGVkUG9vbE9uY2UoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJmdlbmVyYXRlZF9wb29sX2luaXRfLCAmSW5pdEdlbmVyYXRlZFBvb2wpOwotfQotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLWNvbnN0IERlc2NyaXB0b3JQb29sKiBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSB7Ci0gIEluaXRHZW5lcmF0ZWRQb29sT25jZSgpOwotICByZXR1cm4gZ2VuZXJhdGVkX3Bvb2xfOwotfQotCi0KLURlc2NyaXB0b3JQb29sKiBEZXNjcmlwdG9yUG9vbDo6aW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKSB7Ci0gIEluaXRHZW5lcmF0ZWRQb29sT25jZSgpOwotICByZXR1cm4gZ2VuZXJhdGVkX3Bvb2xfOwotfQotCi12b2lkIERlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCi0gICAgY29uc3Qgdm9pZCogZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIGludCBzaXplKSB7Ci0gIC8vIFNvLCB0aGlzIGZ1bmN0aW9uIGlzIGNhbGxlZCBpbiB0aGUgcHJvY2VzcyBvZiBpbml0aWFsaXppbmcgdGhlCi0gIC8vIGRlc2NyaXB0b3JzIGZvciBnZW5lcmF0ZWQgcHJvdG8gY2xhc3Nlcy4gIEVhY2ggZ2VuZXJhdGVkIC5wYi5jYyBmaWxlCi0gIC8vIGhhcyBhbiBpbnRlcm5hbCBwcm9jZWR1cmUgY2FsbGVkIEFkZERlc2NyaXB0b3JzKCkgd2hpY2ggaXMgY2FsbGVkIGF0Ci0gIC8vIHByb2Nlc3Mgc3RhcnR1cCwgYW5kIHRoYXQgZnVuY3Rpb24gY2FsbHMgdGhpcyBvbmUgaW4gb3JkZXIgdG8gcmVnaXN0ZXIKLSAgLy8gdGhlIHJhdyBieXRlcyBvZiB0aGUgRmlsZURlc2NyaXB0b3JQcm90byByZXByZXNlbnRpbmcgdGhlIGZpbGUuCi0gIC8vCi0gIC8vIFdlIGRvIG5vdCBhY3R1YWxseSBjb25zdHJ1Y3QgdGhlIGRlc2NyaXB0b3Igb2JqZWN0cyByaWdodCBhd2F5LiAgV2UganVzdAotICAvLyBoYW5nIG9uIHRvIHRoZSBieXRlcyB1bnRpbCB0aGV5IGFyZSBhY3R1YWxseSBuZWVkZWQuICBXZSBhY3R1YWxseSBjb25zdHJ1Y3QKLSAgLy8gdGhlIGRlc2NyaXB0b3IgdGhlIGZpcnN0IHRpbWUgb25lIG9mIHRoZSBmb2xsb3dpbmcgdGhpbmdzIGhhcHBlbnM6Ci0gIC8vICogU29tZW9uZSBjYWxscyBhIG1ldGhvZCBsaWtlIGRlc2NyaXB0b3IoKSwgR2V0RGVzY3JpcHRvcigpLCBvcgotICAvLyAgIEdldFJlZmxlY3Rpb24oKSBvbiB0aGUgZ2VuZXJhdGVkIHR5cGVzLCB3aGljaCByZXF1aXJlcyByZXR1cm5pbmcgdGhlCi0gIC8vICAgZGVzY3JpcHRvciBvciBhbiBvYmplY3QgYmFzZWQgb24gaXQuCi0gIC8vICogU29tZW9uZSBsb29rcyB1cCB0aGUgZGVzY3JpcHRvciBpbiBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKS4KLSAgLy8KLSAgLy8gT25jZSBvbmUgb2YgdGhlc2UgaGFwcGVucywgdGhlIERlc2NyaXB0b3JQb29sIGFjdHVhbGx5IHBhcnNlcyB0aGUKLSAgLy8gRmlsZURlc2NyaXB0b3JQcm90byBhbmQgZ2VuZXJhdGVzIGEgRmlsZURlc2NyaXB0b3IgKGFuZCBhbGwgaXRzIGNoaWxkcmVuKQotICAvLyBiYXNlZCBvbiBpdC4KLSAgLy8KLSAgLy8gTm90ZSB0aGF0IEZpbGVEZXNjcmlwdG9yUHJvdG8gaXMgaXRzZWxmIGEgZ2VuZXJhdGVkIHByb3RvY29sIG1lc3NhZ2UuCi0gIC8vIFRoZXJlZm9yZSwgd2hlbiB3ZSBwYXJzZSBvbmUsIHdlIGhhdmUgdG8gYmUgdmVyeSBjYXJlZnVsIHRvIGF2b2lkIHVzaW5nCi0gIC8vIGFueSBkZXNjcmlwdG9yLWJhc2VkIG9wZXJhdGlvbnMsIHNpbmNlIHRoaXMgbWlnaHQgY2F1c2UgaW5maW5pdGUgcmVjdXJzaW9uCi0gIC8vIG9yIGRlYWRsb2NrLgotICBJbml0R2VuZXJhdGVkUG9vbE9uY2UoKTsKLSAgR09PR0xFX0NIRUNLKGdlbmVyYXRlZF9kYXRhYmFzZV8tPkFkZChlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgc2l6ZSkpOwotfQotCi0KLS8vIEZpbmQqQnkqIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gVE9ETyhrZW50b24pOiAgVGhlcmUncyBhIGxvdCBvZiByZXBlYXRlZCBjb2RlIGhlcmUsIGJ1dCBJJ20gbm90IHN1cmUgaWYKLS8vICAgdGhlcmUncyBhbnkgZ29vZCB3YXkgdG8gZmFjdG9yIGl0IG91dC4gIFRoaW5rIGFib3V0IHRoaXMgc29tZSB0aW1lIHdoZW4KLS8vICAgdGhlcmUncyBub3RoaW5nIG1vcmUgaW1wb3J0YW50IHRvIGRvIChyZWFkOiBuZXZlcikuCi0KLWNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7Ci0gIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKLSAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7Ci0gIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRGaWxlKG5hbWUpOwotICBpZiAocmVzdWx0ICE9IE5VTEwpIHJldHVybiByZXN1bHQ7Ci0gIGlmICh1bmRlcmxheV8gIT0gTlVMTCkgewotICAgIHJlc3VsdCA9IHVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUobmFtZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OwotICB9Ci0gIGlmIChUcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShuYW1lKSkgewotICAgIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRGaWxlKG5hbWUpOwotICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgcmV0dXJuIHJlc3VsdDsKLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCi0gICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSkgY29uc3QgewotICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7Ci0gIHRhYmxlc18tPmtub3duX2JhZF9zeW1ib2xzXy5jbGVhcigpOwotICB0YWJsZXNfLT5rbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7Ci0gIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKHN5bWJvbF9uYW1lKTsKLSAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHJldHVybiByZXN1bHQuR2V0RmlsZSgpOwotICBpZiAodW5kZXJsYXlfICE9IE5VTEwpIHsKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9yZXN1bHQgPQotICAgICAgdW5kZXJsYXlfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3ltYm9sX25hbWUpOwotICAgIGlmIChmaWxlX3Jlc3VsdCAhPSBOVUxMKSByZXR1cm4gZmlsZV9yZXN1bHQ7Ci0gIH0KLSAgaWYgKFRyeUZpbmRTeW1ib2xJbkZhbGxiYWNrRGF0YWJhc2Uoc3ltYm9sX25hbWUpKSB7Ci0gICAgcmVzdWx0ID0gdGFibGVzXy0+RmluZFN5bWJvbChzeW1ib2xfbmFtZSk7Ci0gICAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHJldHVybiByZXN1bHQuR2V0RmlsZSgpOwotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1jb25zdCBEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZE1lc3NhZ2VUeXBlQnlOYW1lKAotICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgewotICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKTsKLSAgcmV0dXJuIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6Ok1FU1NBR0UpID8gcmVzdWx0LmRlc2NyaXB0b3IgOiBOVUxMOwotfQotCi1jb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRmllbGRCeU5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7Ci0gIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOwotICBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpGSUVMRCAmJgotICAgICAgIXJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiByZXN1bHQuZmllbGRfZGVzY3JpcHRvcjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKAotICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgewotICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKTsKLSAgaWYgKHJlc3VsdC50eXBlID09IFN5bWJvbDo6RklFTEQgJiYKLSAgICAgIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiByZXN1bHQuZmllbGRfZGVzY3JpcHRvcjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jb25zdCBPbmVvZkRlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kT25lb2ZCeU5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7Ci0gIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOwotICByZXR1cm4gKHJlc3VsdC50eXBlID09IFN5bWJvbDo6T05FT0YpID8gcmVzdWx0Lm9uZW9mX2Rlc2NyaXB0b3IgOiBOVUxMOwotfQotCi1jb25zdCBFbnVtRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRFbnVtVHlwZUJ5TmFtZSgKLSAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSk7Ci0gIHJldHVybiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpFTlVNKSA/IHJlc3VsdC5lbnVtX2Rlc2NyaXB0b3IgOiBOVUxMOwotfQotCi1jb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZEVudW1WYWx1ZUJ5TmFtZSgKLSAgICBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRCeU5hbWVIZWxwZXIodGhpcywgbmFtZSk7Ci0gIHJldHVybiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpFTlVNX1ZBTFVFKSA/Ci0gICAgcmVzdWx0LmVudW1fdmFsdWVfZGVzY3JpcHRvciA6IE5VTEw7Ci19Ci0KLWNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZFNlcnZpY2VCeU5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7Ci0gIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOwotICByZXR1cm4gKHJlc3VsdC50eXBlID09IFN5bWJvbDo6U0VSVklDRSkgPyByZXN1bHQuc2VydmljZV9kZXNjcmlwdG9yIDogTlVMTDsKLX0KLQotY29uc3QgTWV0aG9kRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRNZXRob2RCeU5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7Ci0gIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOwotICByZXR1cm4gKHJlc3VsdC50eXBlID09IFN5bWJvbDo6TUVUSE9EKSA/IHJlc3VsdC5tZXRob2RfZGVzY3JpcHRvciA6IE5VTEw7Ci19Ci0KLWNvbnN0IEZpZWxkRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRFeHRlbnNpb25CeU51bWJlcigKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgaW50IG51bWJlcikgY29uc3QgewotICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7Ci0gIHRhYmxlc18tPmtub3duX2JhZF9zeW1ib2xzXy5jbGVhcigpOwotICB0YWJsZXNfLT5rbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEV4dGVuc2lvbihleHRlbmRlZSwgbnVtYmVyKTsKLSAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotICBpZiAodW5kZXJsYXlfICE9IE5VTEwpIHsKLSAgICByZXN1bHQgPSB1bmRlcmxheV8tPkZpbmRFeHRlbnNpb25CeU51bWJlcihleHRlbmRlZSwgbnVtYmVyKTsKLSAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHJldHVybiByZXN1bHQ7Ci0gIH0KLSAgaWYgKFRyeUZpbmRFeHRlbnNpb25JbkZhbGxiYWNrRGF0YWJhc2UoZXh0ZW5kZWUsIG51bWJlcikpIHsKLSAgICByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRXh0ZW5zaW9uKGV4dGVuZGVlLCBudW1iZXIpOwotICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclBvb2w6OkZpbmRBbGxFeHRlbnNpb25zKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3QgewotICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7Ci0gIHRhYmxlc18tPmtub3duX2JhZF9zeW1ib2xzXy5jbGVhcigpOwotICB0YWJsZXNfLT5rbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0YWJsZXNfLT5leHRlbnNpb25zXyBmcm9tIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBmaXJzdAotICAvLyAoYnV0IGRvIHRoaXMgb25seSBvbmNlIHBlciBkZXNjcmlwdG9yKS4KLSAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyAhPSBOVUxMICYmCi0gICAgICB0YWJsZXNfLT5leHRlbnNpb25zX2xvYWRlZF9mcm9tX2RiXy5jb3VudChleHRlbmRlZSkgPT0gMCkgewotICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7Ci0gICAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoZXh0ZW5kZWUtPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZudW1iZXJzKSkgewotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1iZXJzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgIGludCBudW1iZXIgPSBudW1iZXJzW2ldOwotICAgICAgICBpZiAodGFibGVzXy0+RmluZEV4dGVuc2lvbihleHRlbmRlZSwgbnVtYmVyKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgVHJ5RmluZEV4dGVuc2lvbkluRmFsbGJhY2tEYXRhYmFzZShleHRlbmRlZSwgbnVtYmVyKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgdGFibGVzXy0+ZXh0ZW5zaW9uc19sb2FkZWRfZnJvbV9kYl8uaW5zZXJ0KGV4dGVuZGVlKTsKLSAgICB9Ci0gIH0KLQotICB0YWJsZXNfLT5GaW5kQWxsRXh0ZW5zaW9ucyhleHRlbmRlZSwgb3V0KTsKLSAgaWYgKHVuZGVybGF5XyAhPSBOVUxMKSB7Ci0gICAgdW5kZXJsYXlfLT5GaW5kQWxsRXh0ZW5zaW9ucyhleHRlbmRlZSwgb3V0KTsKLSAgfQotfQotCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlOdW1iZXIoaW50IGtleSkgY29uc3QgewotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9Ci0gICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kRmllbGRCeU51bWJlcih0aGlzLCBrZXkpOwotICBpZiAocmVzdWx0ID09IE5VTEwgfHwgcmVzdWx0LT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KLSAgICBmaWxlKCktPnRhYmxlc18tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSh0aGlzLCBrZXkpOwotICBpZiAocmVzdWx0ID09IE5VTEwgfHwgcmVzdWx0LT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KLSAgICBmaWxlKCktPnRhYmxlc18tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSh0aGlzLCBrZXkpOwotICBpZiAocmVzdWx0ID09IE5VTEwgfHwgcmVzdWx0LT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7Ci0gIFN5bWJvbCByZXN1bHQgPQotICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6RklFTEQpOwotICBpZiAoIXJlc3VsdC5Jc051bGwoKSAmJiAhcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLWNvbnN0IE9uZW9mRGVzY3JpcHRvcioKLURlc2NyaXB0b3I6OkZpbmRPbmVvZkJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewotICBTeW1ib2wgcmVzdWx0ID0KLSAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6Ok9ORU9GKTsKLSAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKLSAgICByZXR1cm4gcmVzdWx0Lm9uZW9mX2Rlc2NyaXB0b3I7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewotICBTeW1ib2wgcmVzdWx0ID0KLSAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkZJRUxEKTsKLSAgaWYgKCFyZXN1bHQuSXNOdWxsKCkgJiYgcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLWNvbnN0IEZpZWxkRGVzY3JpcHRvcioKLURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPQotICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKHRoaXMsIGtleSk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhcmVzdWx0LT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9Ci0gICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUodGhpcywga2V5KTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFyZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi1jb25zdCBEZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZE5lc3RlZFR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9Ci0gICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpNRVNTQUdFKTsKLSAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKLSAgICByZXR1cm4gcmVzdWx0LmRlc2NyaXB0b3I7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotY29uc3QgRW51bURlc2NyaXB0b3IqCi1EZXNjcmlwdG9yOjpGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9Ci0gICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpFTlVNKTsKLSAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKLSAgICByZXR1cm4gcmVzdWx0LmVudW1fZGVzY3JpcHRvcjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKgotRGVzY3JpcHRvcjo6RmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewotICBTeW1ib2wgcmVzdWx0ID0KLSAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkVOVU1fVkFMVUUpOwotICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgewotICAgIHJldHVybiByZXN1bHQuZW51bV92YWx1ZV9kZXNjcmlwdG9yOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLWNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqCi1FbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7Ci0gIFN5bWJvbCByZXN1bHQgPQotICAgIGZpbGUoKS0+dGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6RU5VTV9WQUxVRSk7Ci0gIGlmICghcmVzdWx0LklzTnVsbCgpKSB7Ci0gICAgcmV0dXJuIHJlc3VsdC5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3I7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcioKLUVudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU51bWJlcihpbnQga2V5KSBjb25zdCB7Ci0gIHJldHVybiBmaWxlKCktPnRhYmxlc18tPkZpbmRFbnVtVmFsdWVCeU51bWJlcih0aGlzLCBrZXkpOwotfQotCi1jb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKgotRW51bURlc2NyaXB0b3I6OkZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oaW50IGtleSkgY29uc3QgewotICByZXR1cm4gZmlsZSgpLT50YWJsZXNfLT5GaW5kRW51bVZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih0aGlzLCBrZXkpOwotfQotCi1jb25zdCBNZXRob2REZXNjcmlwdG9yKgotU2VydmljZURlc2NyaXB0b3I6OkZpbmRNZXRob2RCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9Ci0gICAgZmlsZSgpLT50YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpNRVRIT0QpOwotICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgewotICAgIHJldHVybiByZXN1bHQubWV0aG9kX2Rlc2NyaXB0b3I7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotY29uc3QgRGVzY3JpcHRvcioKLUZpbGVEZXNjcmlwdG9yOjpGaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6Ok1FU1NBR0UpOwotICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgewotICAgIHJldHVybiByZXN1bHQuZGVzY3JpcHRvcjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jb25zdCBFbnVtRGVzY3JpcHRvcioKLUZpbGVEZXNjcmlwdG9yOjpGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkVOVU0pOwotICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgewotICAgIHJldHVybiByZXN1bHQuZW51bV9kZXNjcmlwdG9yOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLWNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqCi1GaWxlRGVzY3JpcHRvcjo6RmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewotICBTeW1ib2wgcmVzdWx0ID0KLSAgICB0YWJsZXNfLT5GaW5kTmVzdGVkU3ltYm9sT2ZUeXBlKHRoaXMsIGtleSwgU3ltYm9sOjpFTlVNX1ZBTFVFKTsKLSAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKLSAgICByZXR1cm4gcmVzdWx0LmVudW1fdmFsdWVfZGVzY3JpcHRvcjsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfQotCi1jb25zdCBTZXJ2aWNlRGVzY3JpcHRvcioKLUZpbGVEZXNjcmlwdG9yOjpGaW5kU2VydmljZUJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewotICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZE5lc3RlZFN5bWJvbE9mVHlwZSh0aGlzLCBrZXksIFN5bWJvbDo6U0VSVklDRSk7Ci0gIGlmICghcmVzdWx0LklzTnVsbCgpKSB7Ci0gICAgcmV0dXJuIHJlc3VsdC5zZXJ2aWNlX2Rlc2NyaXB0b3I7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRmlsZURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6OkZJRUxEKTsKLSAgaWYgKCFyZXN1bHQuSXNOdWxsKCkgJiYgcmVzdWx0LmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLWNvbnN0IEZpZWxkRGVzY3JpcHRvcioKLUZpbGVEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKHRoaXMsIGtleSk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCB8fCAhcmVzdWx0LT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotY29uc3QgRmllbGREZXNjcmlwdG9yKgotRmlsZURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0IHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUodGhpcywga2V5KTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMIHx8ICFyZXN1bHQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi1jb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSoKLURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25SYW5nZUNvbnRhaW5pbmdOdW1iZXIoaW50IG51bWJlcikgY29uc3QgewotICAvLyBMaW5lYXIgc2VhcmNoIHNob3VsZCBiZSBmaW5lIGJlY2F1c2Ugd2UgZG9uJ3QgZXhwZWN0IGEgbWVzc2FnZSB0byBoYXZlCi0gIC8vIG1vcmUgdGhhbiBhIGNvdXBsZSBleHRlbnNpb24gcmFuZ2VzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAobnVtYmVyID49IGV4dGVuc2lvbl9yYW5nZShpKS0+c3RhcnQgJiYKLSAgICAgICAgbnVtYmVyIDwgIGV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kKSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlKGkpOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotY29uc3QgRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSoKLURlc2NyaXB0b3I6OkZpbmRSZXNlcnZlZFJhbmdlQ29udGFpbmluZ051bWJlcihpbnQgbnVtYmVyKSBjb25zdCB7Ci0gIC8vIFRPRE8oY2hyaXNuKTogQ29uc2lkZXIgYSBub24tbGluZWFyIHNlYXJjaC4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9yYW5nZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAobnVtYmVyID49IHJlc2VydmVkX3JhbmdlKGkpLT5zdGFydCAmJgotICAgICAgICBudW1iZXIgPCAgcmVzZXJ2ZWRfcmFuZ2UoaSktPmVuZCkgewotICAgICAgcmV0dXJuIHJlc2VydmVkX3JhbmdlKGkpOwotICAgIH0KLSAgfQotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1ib29sIERlc2NyaXB0b3JQb29sOjpUcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY291bnQobmFtZSkgPiAwKSByZXR1cm4gZmFsc2U7Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBpZiAoIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUobmFtZSwgJmZpbGVfcHJvdG8pIHx8Ci0gICAgICBCdWlsZEZpbGVGcm9tRGF0YWJhc2UoZmlsZV9wcm90bykgPT0gTlVMTCkgewotICAgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uaW5zZXJ0KG5hbWUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEZXNjcmlwdG9yUG9vbDo6SXNTdWJTeW1ib2xPZkJ1aWx0VHlwZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgc3RyaW5nIHByZWZpeCA9IG5hbWU7Ci0gIGZvciAoOzspIHsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gcHJlZml4LmZpbmRfbGFzdF9vZignLicpOwotICAgIGlmIChkb3RfcG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIHByZWZpeCA9IHByZWZpeC5zdWJzdHIoMCwgZG90X3Bvcyk7Ci0gICAgU3ltYm9sIHN5bWJvbCA9IHRhYmxlc18tPkZpbmRTeW1ib2wocHJlZml4KTsKLSAgICAvLyBJZiB0aGUgc3ltYm9sIHR5cGUgaXMgYW55dGhpbmcgb3RoZXIgdGhhbiBQQUNLQUdFLCB0aGVuIGl0cyBjb21wbGV0ZQotICAgIC8vIGRlZmluaXRpb24gaXMgYWxyZWFkeSBrbm93bi4KLSAgICBpZiAoIXN5bWJvbC5Jc051bGwoKSAmJiBzeW1ib2wudHlwZSAhPSBTeW1ib2w6OlBBQ0tBR0UpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICBpZiAodW5kZXJsYXlfICE9IE5VTEwpIHsKLSAgICAvLyBDaGVjayB0byBzZWUgaWYgYW55IHByZWZpeCBvZiB0aGlzIHN5bWJvbCBleGlzdHMgaW4gdGhlIHVuZGVybGF5LgotICAgIHJldHVybiB1bmRlcmxheV8tPklzU3ViU3ltYm9sT2ZCdWlsdFR5cGUobmFtZSk7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIERlc2NyaXB0b3JQb29sOjpUcnlGaW5kU3ltYm9sSW5GYWxsYmFja0RhdGFiYXNlKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgewotICBpZiAoZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICBpZiAodGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNvdW50KG5hbWUpID4gMCkgcmV0dXJuIGZhbHNlOwotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgaWYgKC8vIFdlIHNraXAgbG9va2luZyBpbiB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgaWYgdGhlIG5hbWUgaXMgYSBzdWItc3ltYm9sCi0gICAgICAvLyBvZiBhbnkgZGVzY3JpcHRvciB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBkZXNjcmlwdG9yIHBvb2wgKGV4Y2VwdAotICAgICAgLy8gZm9yIHBhY2thZ2UgZGVzY3JpcHRvcnMpLiAgVGhpcyBpcyB2YWxpZCBiZWNhdXNlIGFsbCBzeW1ib2xzIGV4Y2VwdAotICAgICAgLy8gZm9yIHBhY2thZ2VzIGFyZSBkZWZpbmVkIGluIGEgc2luZ2xlIGZpbGUsIHNvIGlmIHRoZSBzeW1ib2wgZXhpc3RzCi0gICAgICAvLyB0aGVuIHdlIHNob3VsZCBhbHJlYWR5IGhhdmUgaXRzIGRlZmluaXRpb24uCi0gICAgICAvLwotICAgICAgLy8gVGhlIG90aGVyIHJlYXNvbiB0byBkbyB0aGlzIGlzIHRvIHN1cHBvcnQgIm92ZXJyaWRpbmciIHR5cGUKLSAgICAgIC8vIGRlZmluaXRpb25zIGJ5IG1lcmdpbmcgdHdvIGRhdGFiYXNlcyB0aGF0IGRlZmluZSB0aGUgc2FtZSB0eXBlLiAgKFllcywKLSAgICAgIC8vIHBlb3BsZSBkbyB0aGlzLikgIFRoZSBtYWluIGRpZmZpY3VsdHkgd2l0aCBtYWtpbmcgdGhpcyB3b3JrIGlzIHRoYXQKLSAgICAgIC8vIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgpIGlzIGFsbG93ZWQgdG8gcmV0dXJuIGJvdGggZmFsc2UgcG9zaXRpdmVzCi0gICAgICAvLyAoZS5nLiwgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLCBVcGdyYWRlZERlc2NyaXB0b3JEYXRhYmFzZSkgYW5kIGZhbHNlCi0gICAgICAvLyBuZWdhdGl2ZXMgKGUuZy4gUHJvdG9GaWxlUGFyc2VyLCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlKS4KLSAgICAgIC8vIFdoZW4gdHdvIHN1Y2ggZGF0YWJhc2VzIGFyZSBtZXJnZWQsIGxvb2tpbmcgdXAgYSBub24tZXhpc3RlbnQKLSAgICAgIC8vIHN1Yi1zeW1ib2wgb2YgYSB0eXBlIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRlc2NyaXB0b3IgcG9vbCBjYW4KLSAgICAgIC8vIHJlc3VsdCBpbiBhbiBhdHRlbXB0IHRvIGxvYWQgbXVsdGlwbGUgZGVmaW5pdGlvbnMgb2YgdGhlIHNhbWUgdHlwZS4KLSAgICAgIC8vIFRoZSBjaGVjayBiZWxvdyBhdm9pZHMgdGhpcy4KLSAgICAgIElzU3ViU3ltYm9sT2ZCdWlsdFR5cGUobmFtZSkKLQotICAgICAgLy8gTG9vayB1cCBmaWxlIGNvbnRhaW5pbmcgdGhpcyBzeW1ib2wgaW4gZmFsbGJhY2sgZGF0YWJhc2UuCi0gICAgICB8fCAhZmFsbGJhY2tfZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2wobmFtZSwgJmZpbGVfcHJvdG8pCi0KLSAgICAgIC8vIENoZWNrIGlmIHdlJ3ZlIGFscmVhZHkgYnVpbHQgdGhpcyBmaWxlLiBJZiBzbywgaXQgYXBwYXJlbnRseSBkb2Vzbid0Ci0gICAgICAvLyBjb250YWluIHRoZSBzeW1ib2wgd2UncmUgbG9va2luZyBmb3IuICBTb21lIERlc2NyaXB0b3JEYXRhYmFzZXMKLSAgICAgIC8vIHJldHVybiBmYWxzZSBwb3NpdGl2ZXMuCi0gICAgICB8fCB0YWJsZXNfLT5GaW5kRmlsZShmaWxlX3Byb3RvLm5hbWUoKSkgIT0gTlVMTAotCi0gICAgICAvLyBCdWlsZCB0aGUgZmlsZS4KLSAgICAgIHx8IEJ1aWxkRmlsZUZyb21EYXRhYmFzZShmaWxlX3Byb3RvKSA9PSBOVUxMKSB7Ci0gICAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmluc2VydChuYW1lKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEZXNjcmlwdG9yUG9vbDo6VHJ5RmluZEV4dGVuc2lvbkluRmFsbGJhY2tEYXRhYmFzZSgKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIpIGNvbnN0IHsKLSAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBpZiAoIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKAotICAgICAgICBjb250YWluaW5nX3R5cGUtPmZ1bGxfbmFtZSgpLCBmaWVsZF9udW1iZXIsICZmaWxlX3Byb3RvKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmICh0YWJsZXNfLT5GaW5kRmlsZShmaWxlX3Byb3RvLm5hbWUoKSkgIT0gTlVMTCkgewotICAgIC8vIFdlJ3ZlIGFscmVhZHkgbG9hZGVkIHRoaXMgZmlsZSwgYW5kIGl0IGFwcGFyZW50bHkgZG9lc24ndCBjb250YWluIHRoZQotICAgIC8vIGV4dGVuc2lvbiB3ZSdyZSBsb29raW5nIGZvci4gIFNvbWUgRGVzY3JpcHRvckRhdGFiYXNlcyByZXR1cm4gZmFsc2UKLSAgICAvLyBwb3NpdGl2ZXMuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgaWYgKEJ1aWxkRmlsZUZyb21EYXRhYmFzZShmaWxlX3Byb3RvKSA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX21hcCgpIGNvbnN0IHsKLSAgcmV0dXJuIHR5cGUoKSA9PSBUWVBFX01FU1NBR0UgJiYgbWVzc2FnZV90eXBlKCktPm9wdGlvbnMoKS5tYXBfZW50cnkoKTsKLX0KLQotc3RyaW5nIEZpZWxkRGVzY3JpcHRvcjo6RGVmYXVsdFZhbHVlQXNTdHJpbmcoYm9vbCBxdW90ZV9zdHJpbmdfdHlwZSkgY29uc3QgewotICBHT09HTEVfQ0hFQ0soaGFzX2RlZmF1bHRfdmFsdWUoKSkgPDwgIk5vIGRlZmF1bHQgdmFsdWUiOwotICBzd2l0Y2ggKGNwcF90eXBlKCkpIHsKLSAgICBjYXNlIENQUFRZUEVfSU5UMzI6Ci0gICAgICByZXR1cm4gU2ltcGxlSXRvYShkZWZhdWx0X3ZhbHVlX2ludDMyKCkpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUFBUWVBFX0lOVDY0OgotICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1BQVFlQRV9VSU5UMzI6Ci0gICAgICByZXR1cm4gU2ltcGxlSXRvYShkZWZhdWx0X3ZhbHVlX3VpbnQzMigpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1BQVFlQRV9VSU5UNjQ6Ci0gICAgICByZXR1cm4gU2ltcGxlSXRvYShkZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1BQVFlQRV9GTE9BVDoKLSAgICAgIHJldHVybiBTaW1wbGVGdG9hKGRlZmF1bHRfdmFsdWVfZmxvYXQoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQUFRZUEVfRE9VQkxFOgotICAgICAgcmV0dXJuIFNpbXBsZUR0b2EoZGVmYXVsdF92YWx1ZV9kb3VibGUoKSk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQUFRZUEVfQk9PTDoKLSAgICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlX2Jvb2woKSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIENQUFRZUEVfU1RSSU5HOgotICAgICAgaWYgKHF1b3RlX3N0cmluZ190eXBlKSB7Ci0gICAgICAgIHJldHVybiAiXCIiICsgQ0VzY2FwZShkZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArICJcIiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAodHlwZSgpID09IFRZUEVfQllURVMpIHsKLSAgICAgICAgICByZXR1cm4gQ0VzY2FwZShkZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV9zdHJpbmcoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBDUFBUWVBFX0VOVU06Ci0gICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZV9lbnVtKCktPm5hbWUoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzISI7Ci0gICAgICBicmVhazsKLSAgfQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmU6IGZhaWxlZCB0byBnZXQgZGVmYXVsdCB2YWx1ZSBhcyBzdHJpbmciOwotICByZXR1cm4gIiI7Ci19Ci0KLS8vIENvcHlUbyBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdm9pZCBGaWxlRGVzY3JpcHRvcjo6Q29weVRvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7Ci0gIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwotICBpZiAoIXBhY2thZ2UoKS5lbXB0eSgpKSBwcm90by0+c2V0X3BhY2thZ2UocGFja2FnZSgpKTsKLSAgLy8gVE9ETyhsaXVqaXNpKTogQWxzbyBwb3B1bGF0ZSB3aGVuIHN5bnRheD0icHJvdG8yIi4KLSAgaWYgKHN5bnRheCgpID09IFNZTlRBWF9QUk9UTzMpIHByb3RvLT5zZXRfc3ludGF4KFN5bnRheE5hbWUoc3ludGF4KCkpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgcHJvdG8tPmFkZF9kZXBlbmRlbmN5KGRlcGVuZGVuY3koaSktPm5hbWUoKSk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIHByb3RvLT5hZGRfcHVibGljX2RlcGVuZGVuY3kocHVibGljX2RlcGVuZGVuY2llc19baV0pOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWFrX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgcHJvdG8tPmFkZF93ZWFrX2RlcGVuZGVuY3kod2Vha19kZXBlbmRlbmNpZXNfW2ldKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfdHlwZShpKS0+Q29weVRvKHByb3RvLT5hZGRfbWVzc2FnZV90eXBlKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGVudW1fdHlwZShpKS0+Q29weVRvKHByb3RvLT5hZGRfZW51bV90eXBlKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZV9jb3VudCgpOyBpKyspIHsKLSAgICBzZXJ2aWNlKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF9zZXJ2aWNlKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGV4dGVuc2lvbihpKS0+Q29weVRvKHByb3RvLT5hZGRfZXh0ZW5zaW9uKCkpOwotICB9Ci0KLSAgaWYgKCZvcHRpb25zKCkgIT0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKLSAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7Ci0gIH0KLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvcjo6Q29weUpzb25OYW1lVG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKLSAgaWYgKG1lc3NhZ2VfdHlwZV9jb3VudCgpICE9IHByb3RvLT5tZXNzYWdlX3R5cGVfc2l6ZSgpIHx8Ci0gICAgICBleHRlbnNpb25fY291bnQoKSAhPSBwcm90by0+ZXh0ZW5zaW9uX3NpemUoKSkgewotICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJDYW5ub3QgY29weSBqc29uX25hbWUgdG8gYSBwcm90byBvZiBhIGRpZmZlcmVudCBzaXplLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfdHlwZShpKS0+Q29weUpzb25OYW1lVG8ocHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKGkpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBleHRlbnNpb24oaSktPkNvcHlKc29uTmFtZVRvKHByb3RvLT5tdXRhYmxlX2V4dGVuc2lvbihpKSk7Ci0gIH0KLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvcjo6Q29weVNvdXJjZUNvZGVJbmZvVG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKLSAgaWYgKHNvdXJjZV9jb2RlX2luZm9fICYmCi0gICAgICBzb3VyY2VfY29kZV9pbmZvXyAhPSAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSkgewotICAgIHByb3RvLT5tdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKS0+Q29weUZyb20oKnNvdXJjZV9jb2RlX2luZm9fKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3I6OkNvcHlUbyhEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7Ci0gIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGQoaSktPkNvcHlUbyhwcm90by0+YWRkX2ZpZWxkKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICBvbmVvZl9kZWNsKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF9vbmVvZl9kZWNsKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgbmVzdGVkX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX25lc3RlZF90eXBlKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGVudW1fdHlwZShpKS0+Q29weVRvKHByb3RvLT5hZGRfZW51bV90eXBlKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgewotICAgIERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlID0gcHJvdG8tPmFkZF9leHRlbnNpb25fcmFuZ2UoKTsKLSAgICByYW5nZS0+c2V0X3N0YXJ0KGV4dGVuc2lvbl9yYW5nZShpKS0+c3RhcnQpOwotICAgIHJhbmdlLT5zZXRfZW5kKGV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBleHRlbnNpb24oaSktPkNvcHlUbyhwcm90by0+YWRkX2V4dGVuc2lvbigpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IHJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGkrKykgewotICAgIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSogcmFuZ2UgPSBwcm90by0+YWRkX3Jlc2VydmVkX3JhbmdlKCk7Ci0gICAgcmFuZ2UtPnNldF9zdGFydChyZXNlcnZlZF9yYW5nZShpKS0+c3RhcnQpOwotICAgIHJhbmdlLT5zZXRfZW5kKHJlc2VydmVkX3JhbmdlKGkpLT5lbmQpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpOyBpKyspIHsKLSAgICBwcm90by0+YWRkX3Jlc2VydmVkX25hbWUocmVzZXJ2ZWRfbmFtZShpKSk7Ci0gIH0KLQotICBpZiAoJm9wdGlvbnMoKSAhPSAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgewotICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3I6OkNvcHlKc29uTmFtZVRvKERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKLSAgaWYgKGZpZWxkX2NvdW50KCkgIT0gcHJvdG8tPmZpZWxkX3NpemUoKSB8fAotICAgICAgbmVzdGVkX3R5cGVfY291bnQoKSAhPSBwcm90by0+bmVzdGVkX3R5cGVfc2l6ZSgpIHx8Ci0gICAgICBleHRlbnNpb25fY291bnQoKSAhPSBwcm90by0+ZXh0ZW5zaW9uX3NpemUoKSkgewotICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJDYW5ub3QgY29weSBqc29uX25hbWUgdG8gYSBwcm90byBvZiBhIGRpZmZlcmVudCBzaXplLiI7Ci0gICAgcmV0dXJuOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGQoaSktPkNvcHlKc29uTmFtZVRvKHByb3RvLT5tdXRhYmxlX2ZpZWxkKGkpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG5lc3RlZF90eXBlKGkpLT5Db3B5SnNvbk5hbWVUbyhwcm90by0+bXV0YWJsZV9uZXN0ZWRfdHlwZShpKSk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgZXh0ZW5zaW9uKGkpLT5Db3B5SnNvbk5hbWVUbyhwcm90by0+bXV0YWJsZV9leHRlbnNpb24oaSkpOwotICB9Ci19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yOjpDb3B5VG8oRmllbGREZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7Ci0gIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwotICBwcm90by0+c2V0X251bWJlcihudW1iZXIoKSk7Ci0gIGlmIChoYXNfanNvbl9uYW1lXykgewotICAgIHByb3RvLT5zZXRfanNvbl9uYW1lKGpzb25fbmFtZSgpKTsKLSAgfQotCi0gIC8vIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBzdGF0aWNfY2FzdCBkaXJlY3RseSBiZXR3ZWVuIHR3byBlbnVtIHR5cGVzLAotICAvLyBzbyB3ZSBtdXN0IGNhc3QgdG8gaW50IGZpcnN0LgotICBwcm90by0+c2V0X2xhYmVsKHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbD4oCi0gICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4obGFiZWwoKSkpKTsKLSAgcHJvdG8tPnNldF90eXBlKHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlPigKLSAgICAgICAgICAgICAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KHR5cGUoKSkpKTsKLQotICBpZiAoaXNfZXh0ZW5zaW9uKCkpIHsKLSAgICBpZiAoIWNvbnRhaW5pbmdfdHlwZSgpLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8pIHsKLSAgICAgIHByb3RvLT5zZXRfZXh0ZW5kZWUoIi4iKTsKLSAgICB9Ci0gICAgcHJvdG8tPm11dGFibGVfZXh0ZW5kZWUoKS0+YXBwZW5kKGNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSk7Ci0gIH0KLQotICBpZiAoY3BwX3R5cGUoKSA9PSBDUFBUWVBFX01FU1NBR0UpIHsKLSAgICBpZiAobWVzc2FnZV90eXBlKCktPmlzX3BsYWNlaG9sZGVyXykgewotICAgICAgLy8gV2UgZG9uJ3QgYWN0dWFsbHkga25vdyBpZiB0aGUgdHlwZSBpcyBhIG1lc3NhZ2UgdHlwZS4gIEl0IGNvdWxkIGJlCi0gICAgICAvLyBhbiBlbnVtLgotICAgICAgcHJvdG8tPmNsZWFyX3R5cGUoKTsKLSAgICB9Ci0KLSAgICBpZiAoIW1lc3NhZ2VfdHlwZSgpLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8pIHsKLSAgICAgIHByb3RvLT5zZXRfdHlwZV9uYW1lKCIuIik7Ci0gICAgfQotICAgIHByb3RvLT5tdXRhYmxlX3R5cGVfbmFtZSgpLT5hcHBlbmQobWVzc2FnZV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKLSAgfSBlbHNlIGlmIChjcHBfdHlwZSgpID09IENQUFRZUEVfRU5VTSkgewotICAgIGlmICghZW51bV90eXBlKCktPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXykgewotICAgICAgcHJvdG8tPnNldF90eXBlX25hbWUoIi4iKTsKLSAgICB9Ci0gICAgcHJvdG8tPm11dGFibGVfdHlwZV9uYW1lKCktPmFwcGVuZChlbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOwotICB9Ci0KLSAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKLSAgICBwcm90by0+c2V0X2RlZmF1bHRfdmFsdWUoRGVmYXVsdFZhbHVlQXNTdHJpbmcoZmFsc2UpKTsKLSAgfQotCi0gIGlmIChjb250YWluaW5nX29uZW9mKCkgIT0gTlVMTCAmJiAhaXNfZXh0ZW5zaW9uKCkpIHsKLSAgICBwcm90by0+c2V0X29uZW9mX2luZGV4KGNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKSk7Ci0gIH0KLQotICBpZiAoJm9wdGlvbnMoKSAhPSAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKLSAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7Ci0gIH0KLX0KLQotdm9pZCBGaWVsZERlc2NyaXB0b3I6OkNvcHlKc29uTmFtZVRvKEZpZWxkRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgewotICBwcm90by0+c2V0X2pzb25fbmFtZShqc29uX25hbWUoKSk7Ci19Ci0KLXZvaWQgT25lb2ZEZXNjcmlwdG9yOjpDb3B5VG8oT25lb2ZEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7Ci0gIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yOjpDb3B5VG8oRW51bURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKLSAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZV9jb3VudCgpOyBpKyspIHsKLSAgICB2YWx1ZShpKS0+Q29weVRvKHByb3RvLT5hZGRfdmFsdWUoKSk7Ci0gIH0KLQotICBpZiAoJm9wdGlvbnMoKSAhPSAmRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgewotICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKLSAgfQotfQotCi12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3I6OkNvcHlUbyhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7Ci0gIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwotICBwcm90by0+c2V0X251bWJlcihudW1iZXIoKSk7Ci0KLSAgaWYgKCZvcHRpb25zKCkgIT0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgewotICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKLSAgfQotfQotCi12b2lkIFNlcnZpY2VEZXNjcmlwdG9yOjpDb3B5VG8oU2VydmljZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKLSAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RfY291bnQoKTsgaSsrKSB7Ci0gICAgbWV0aG9kKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF9tZXRob2QoKSk7Ci0gIH0KLQotICBpZiAoJm9wdGlvbnMoKSAhPSAmU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgewotICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKLSAgfQotfQotCi12b2lkIE1ldGhvZERlc2NyaXB0b3I6OkNvcHlUbyhNZXRob2REZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7Ci0gIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwotCi0gIGlmICghaW5wdXRfdHlwZSgpLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8pIHsKLSAgICBwcm90by0+c2V0X2lucHV0X3R5cGUoIi4iKTsKLSAgfQotICBwcm90by0+bXV0YWJsZV9pbnB1dF90eXBlKCktPmFwcGVuZChpbnB1dF90eXBlKCktPmZ1bGxfbmFtZSgpKTsKLQotICBpZiAoIW91dHB1dF90eXBlKCktPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXykgewotICAgIHByb3RvLT5zZXRfb3V0cHV0X3R5cGUoIi4iKTsKLSAgfQotICBwcm90by0+bXV0YWJsZV9vdXRwdXRfdHlwZSgpLT5hcHBlbmQob3V0cHV0X3R5cGUoKS0+ZnVsbF9uYW1lKCkpOwotCi0gIGlmICgmb3B0aW9ucygpICE9ICZNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpIHsKLSAgICBwcm90by0+bXV0YWJsZV9vcHRpb25zKCktPkNvcHlGcm9tKG9wdGlvbnMoKSk7Ci0gIH0KLQotICBpZiAoY2xpZW50X3N0cmVhbWluZ18pIHsKLSAgICBwcm90by0+c2V0X2NsaWVudF9zdHJlYW1pbmcodHJ1ZSk7Ci0gIH0KLSAgaWYgKHNlcnZlcl9zdHJlYW1pbmdfKSB7Ci0gICAgcHJvdG8tPnNldF9zZXJ2ZXJfc3RyZWFtaW5nKHRydWUpOwotICB9Ci19Ci0KLS8vIERlYnVnU3RyaW5nIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotbmFtZXNwYWNlIHsKLQotLy8gVXNlZCBieSBlYWNoIG9mIHRoZSBvcHRpb24gZm9ybWF0dGVycy4KLWJvb2wgUmV0cmlldmVPcHRpb25zKGludCBkZXB0aCwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UgJm9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiAqb3B0aW9uX2VudHJpZXMpIHsKLSAgb3B0aW9uX2VudHJpZXMtPmNsZWFyKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBvcHRpb25zLkdldFJlZmxlY3Rpb24oKTsKLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhvcHRpb25zLCAmZmllbGRzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBpbnQgY291bnQgPSAxOwotICAgIGJvb2wgcmVwZWF0ZWQgPSBmYWxzZTsKLSAgICBpZiAoZmllbGRzW2ldLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBjb3VudCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShvcHRpb25zLCBmaWVsZHNbaV0pOwotICAgICAgcmVwZWF0ZWQgPSB0cnVlOwotICAgIH0KLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGNvdW50OyBqKyspIHsKLSAgICAgIHN0cmluZyBmaWVsZHZhbDsKLSAgICAgIGlmIChmaWVsZHNbaV0tPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgICAgc3RyaW5nIHRtcDsKLSAgICAgICAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOwotICAgICAgICBwcmludGVyLlNldEluaXRpYWxJbmRlbnRMZXZlbChkZXB0aCArIDEpOwotICAgICAgICBwcmludGVyLlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKG9wdGlvbnMsIGZpZWxkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZCA/IGogOiAtMSwgJnRtcCk7Ci0gICAgICAgIGZpZWxkdmFsLmFwcGVuZCgie1xuIik7Ci0gICAgICAgIGZpZWxkdmFsLmFwcGVuZCh0bXApOwotICAgICAgICBmaWVsZHZhbC5hcHBlbmQoZGVwdGggKiAyLCAnICcpOwotICAgICAgICBmaWVsZHZhbC5hcHBlbmQoIn0iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFRleHRGb3JtYXQ6OlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKG9wdGlvbnMsIGZpZWxkc1tpXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWQgPyBqIDogLTEsICZmaWVsZHZhbCk7Ci0gICAgICB9Ci0gICAgICBzdHJpbmcgbmFtZTsKLSAgICAgIGlmIChmaWVsZHNbaV0tPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgICAgIG5hbWUgPSAiKC4iICsgZmllbGRzW2ldLT5mdWxsX25hbWUoKSArICIpIjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIG5hbWUgPSBmaWVsZHNbaV0tPm5hbWUoKTsKLSAgICAgIH0KLSAgICAgIG9wdGlvbl9lbnRyaWVzLT5wdXNoX2JhY2sobmFtZSArICIgPSAiICsgZmllbGR2YWwpOwotICAgIH0KLSAgfQotICByZXR1cm4gIW9wdGlvbl9lbnRyaWVzLT5lbXB0eSgpOwotfQotCi0vLyBGb3JtYXRzIG9wdGlvbnMgdGhhdCBhbGwgYXBwZWFyIHRvZ2V0aGVyIGluIGJyYWNrZXRzLiBEb2VzIG5vdCBpbmNsdWRlCi0vLyBicmFja2V0cy4KLWJvb2wgRm9ybWF0QnJhY2tldGVkT3B0aW9ucyhpbnQgZGVwdGgsIGNvbnN0IE1lc3NhZ2UgJm9wdGlvbnMsIHN0cmluZyAqb3V0cHV0KSB7Ci0gIHZlY3RvcjxzdHJpbmc+IGFsbF9vcHRpb25zOwotICBpZiAoUmV0cmlldmVPcHRpb25zKGRlcHRoLCBvcHRpb25zLCAmYWxsX29wdGlvbnMpKSB7Ci0gICAgb3V0cHV0LT5hcHBlbmQoSm9pbihhbGxfb3B0aW9ucywgIiwgIikpOwotICB9Ci0gIHJldHVybiAhYWxsX29wdGlvbnMuZW1wdHkoKTsKLX0KLQotLy8gRm9ybWF0cyBvcHRpb25zIG9uZSBwZXIgbGluZQotYm9vbCBGb3JtYXRMaW5lT3B0aW9ucyhpbnQgZGVwdGgsIGNvbnN0IE1lc3NhZ2UgJm9wdGlvbnMsIHN0cmluZyAqb3V0cHV0KSB7Ci0gIHN0cmluZyBwcmVmaXgoZGVwdGggKiAyLCAnICcpOwotICB2ZWN0b3I8c3RyaW5nPiBhbGxfb3B0aW9uczsKLSAgaWYgKFJldHJpZXZlT3B0aW9ucyhkZXB0aCwgb3B0aW9ucywgJmFsbF9vcHRpb25zKSkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX29wdGlvbnMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQob3V0cHV0LCAiJDBvcHRpb24gJDE7XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIGFsbF9vcHRpb25zW2ldKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuICFhbGxfb3B0aW9ucy5lbXB0eSgpOwotfQotCi1jbGFzcyBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyIHsKLSBwdWJsaWM6Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIERlc2NUeXBlPgotICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyKGNvbnN0IERlc2NUeXBlKiBkZXNjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJlZml4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykKLSAgICAgIDogb3B0aW9uc18ob3B0aW9ucyksIHByZWZpeF8ocHJlZml4KSB7Ci0gICAgLy8gUGVyZm9ybSB0aGUgU291cmNlTG9jYXRpb24gbG9va3VwIG9ubHkgaWYgd2UncmUgaW5jbHVkaW5nIHVzZXIgY29tbWVudHMsCi0gICAgLy8gYmVjYXVzZSB0aGUgbG9va3VwIGlzIGZhaXJseSBleHBlbnNpdmUuCi0gICAgaGF2ZV9zb3VyY2VfbG9jXyA9IG9wdGlvbnMuaW5jbHVkZV9jb21tZW50cyAmJgotICAgICAgICBkZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmc291cmNlX2xvY18pOwotICB9Ci0gIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludD4mIHBhdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKQotICAgICAgOiBvcHRpb25zXyhvcHRpb25zKSwgcHJlZml4XyhwcmVmaXgpIHsKLSAgICAvLyBQZXJmb3JtIHRoZSBTb3VyY2VMb2NhdGlvbiBsb29rdXAgb25seSBpZiB3ZSdyZSBpbmNsdWRpbmcgdXNlciBjb21tZW50cywKLSAgICAvLyBiZWNhdXNlIHRoZSBsb29rdXAgaXMgZmFpcmx5IGV4cGVuc2l2ZS4KLSAgICBoYXZlX3NvdXJjZV9sb2NfID0gb3B0aW9ucy5pbmNsdWRlX2NvbW1lbnRzICYmCi0gICAgICAgIGZpbGUtPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsICZzb3VyY2VfbG9jXyk7Ci0gIH0KLSAgdm9pZCBBZGRQcmVDb21tZW50KHN0cmluZyogb3V0cHV0KSB7Ci0gICAgaWYgKGhhdmVfc291cmNlX2xvY18pIHsKLSAgICAgIC8vIERldGFjaGVkIGxlYWRpbmcgY29tbWVudHMuCi0gICAgICBmb3IgKGludCBpID0gMCA7IGkgPCBzb3VyY2VfbG9jXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzLnNpemUoKTsgKytpKSB7Ci0gICAgICAgICpvdXRwdXQgKz0gRm9ybWF0Q29tbWVudChzb3VyY2VfbG9jXy5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzW2ldKTsKLSAgICAgICAgKm91dHB1dCArPSAiXG4iOwotICAgICAgfQotICAgICAgLy8gQXR0YWNoZWQgbGVhZGluZyBjb21tZW50cy4KLSAgICAgIGlmICghc291cmNlX2xvY18ubGVhZGluZ19jb21tZW50cy5lbXB0eSgpKSB7Ci0gICAgICAgICpvdXRwdXQgKz0gRm9ybWF0Q29tbWVudChzb3VyY2VfbG9jXy5sZWFkaW5nX2NvbW1lbnRzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgdm9pZCBBZGRQb3N0Q29tbWVudChzdHJpbmcqIG91dHB1dCkgewotICAgIGlmIChoYXZlX3NvdXJjZV9sb2NfICYmIHNvdXJjZV9sb2NfLnRyYWlsaW5nX2NvbW1lbnRzLnNpemUoKSA+IDApIHsKLSAgICAgICpvdXRwdXQgKz0gRm9ybWF0Q29tbWVudChzb3VyY2VfbG9jXy50cmFpbGluZ19jb21tZW50cyk7Ci0gICAgfQotICB9Ci0KLSAgLy8gRm9ybWF0IGNvbW1lbnQgc3VjaCB0aGF0IGVhY2ggbGluZSBiZWNvbWVzIGEgZnVsbC1saW5lIEMrKy1zdHlsZSBjb21tZW50IGluCi0gIC8vIHRoZSBEZWJ1Z1N0cmluZygpIG91dHB1dC4KLSAgc3RyaW5nIEZvcm1hdENvbW1lbnQoY29uc3Qgc3RyaW5nJiBjb21tZW50X3RleHQpIHsKLSAgICBzdHJpbmcgc3RyaXBwZWRfY29tbWVudCA9IGNvbW1lbnRfdGV4dDsKLSAgICBTdHJpcFdoaXRlc3BhY2UoJnN0cmlwcGVkX2NvbW1lbnQpOwotICAgIHZlY3RvcjxzdHJpbmc+IGxpbmVzID0gU3BsaXQoc3RyaXBwZWRfY29tbWVudCwgIlxuIik7Ci0gICAgc3RyaW5nIG91dHB1dDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgKytpKSB7Ci0gICAgICBjb25zdCBzdHJpbmcmIGxpbmUgPSBsaW5lc1tpXTsKLSAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJm91dHB1dCwgIiQwLy8gJDFcbiIsIHByZWZpeF8sIGxpbmUpOwotICAgIH0KLSAgICByZXR1cm4gb3V0cHV0OwotICB9Ci0KLSBwcml2YXRlOgotCi0gIGJvb2wgaGF2ZV9zb3VyY2VfbG9jXzsKLSAgU291cmNlTG9jYXRpb24gc291cmNlX2xvY187Ci0gIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zXzsKLSAgc3RyaW5nIHByZWZpeF87Ci19OwotCi19ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCi0KLXN0cmluZyBGaWxlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCBvcHRpb25zCi0gIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOwotfQotCi1zdHJpbmcgRmlsZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCi0gICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBkZWJ1Z19zdHJpbmdfb3B0aW9ucykgY29uc3QgewotICBzdHJpbmcgY29udGVudHM7Ci0gIHsKLSAgICB2ZWN0b3I8aW50PiBwYXRoOwotICAgIHBhdGgucHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTeW50YXhGaWVsZE51bWJlcik7Ci0gICAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlciBzeW50YXhfY29tbWVudCgKLSAgICAgICAgdGhpcywgcGF0aCwgIiIsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgICBzeW50YXhfY29tbWVudC5BZGRQcmVDb21tZW50KCZjb250ZW50cyk7Ci0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJzeW50YXggPSBcIiQwXCI7XG5cbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTeW50YXhOYW1lKHN5bnRheCgpKSk7Ci0gICAgc3ludGF4X2NvbW1lbnQuQWRkUG9zdENvbW1lbnQoJmNvbnRlbnRzKTsKLSAgfQotCi0gIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIKLSAgICAgIGNvbW1lbnRfcHJpbnRlcih0aGlzLCAiIiwgZGVidWdfc3RyaW5nX29wdGlvbnMpOwotICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudCgmY29udGVudHMpOwotCi0gIHNldDxpbnQ+IHB1YmxpY19kZXBlbmRlbmNpZXM7Ci0gIHNldDxpbnQ+IHdlYWtfZGVwZW5kZW5jaWVzOwotICBwdWJsaWNfZGVwZW5kZW5jaWVzLmluc2VydChwdWJsaWNfZGVwZW5kZW5jaWVzXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVibGljX2RlcGVuZGVuY2llc18gKyBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudF8pOwotICB3ZWFrX2RlcGVuZGVuY2llcy5pbnNlcnQod2Vha19kZXBlbmRlbmNpZXNfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgd2Vha19kZXBlbmRlbmNpZXNfICsgd2Vha19kZXBlbmRlbmN5X2NvdW50Xyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIGlmIChwdWJsaWNfZGVwZW5kZW5jaWVzLmNvdW50KGkpID4gMCkgewotICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgcHVibGljIFwiJDBcIjtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3koaSktPm5hbWUoKSk7Ci0gICAgfSBlbHNlIGlmICh3ZWFrX2RlcGVuZGVuY2llcy5jb3VudChpKSA+IDApIHsKLSAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAiaW1wb3J0IHdlYWsgXCIkMFwiO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgXCIkMFwiO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoIXBhY2thZ2UoKS5lbXB0eSgpKSB7Ci0gICAgdmVjdG9yPGludD4gcGF0aDsKLSAgICBwYXRoLnB1c2hfYmFjayhGaWxlRGVzY3JpcHRvclByb3RvOjprUGFja2FnZUZpZWxkTnVtYmVyKTsKLSAgICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyIHBhY2thZ2VfY29tbWVudCgKLSAgICAgICAgdGhpcywgcGF0aCwgIiIsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgICBwYWNrYWdlX2NvbW1lbnQuQWRkUHJlQ29tbWVudCgmY29udGVudHMpOwotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAicGFja2FnZSAkMDtcblxuIiwgcGFja2FnZSgpKTsKLSAgICBwYWNrYWdlX2NvbW1lbnQuQWRkUG9zdENvbW1lbnQoJmNvbnRlbnRzKTsKLSAgfQotCi0gIGlmIChGb3JtYXRMaW5lT3B0aW9ucygwLCBvcHRpb25zKCksICZjb250ZW50cykpIHsKLSAgICBjb250ZW50cy5hcHBlbmQoIlxuIik7ICAvLyBhZGQgc29tZSBzcGFjZSBpZiB3ZSBoYWQgb3B0aW9ucwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgZW51bV90eXBlKGkpLT5EZWJ1Z1N0cmluZygwLCAmY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgICBjb250ZW50cy5hcHBlbmQoIlxuIik7Ci0gIH0KLQotICAvLyBGaW5kIGFsbCB0aGUgJ2dyb3VwJyB0eXBlIGV4dGVuc2lvbnM7IHdlIHdpbGwgbm90IG91dHB1dCB0aGVpciBuZXN0ZWQKLSAgLy8gZGVmaW5pdGlvbnMgKHRob3NlIHdpbGwgYmUgZG9uZSB3aXRoIHRoZWlyIGdyb3VwIGZpZWxkIGRlc2NyaXB0b3IpLgotICBzZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGdyb3VwczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKGV4dGVuc2lvbihpKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgewotICAgICAgZ3JvdXBzLmluc2VydChleHRlbnNpb24oaSktPm1lc3NhZ2VfdHlwZSgpKTsKLSAgICB9Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoZ3JvdXBzLmNvdW50KG1lc3NhZ2VfdHlwZShpKSkgPT0gMCkgewotICAgICAgbWVzc2FnZV90eXBlKGkpLT5EZWJ1Z1N0cmluZygwLCAmY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIHRydWUpOwotICAgICAgY29udGVudHMuYXBwZW5kKCJcbiIpOwotICAgIH0KLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZV9jb3VudCgpOyBpKyspIHsKLSAgICBzZXJ2aWNlKGkpLT5EZWJ1Z1N0cmluZygmY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgICBjb250ZW50cy5hcHBlbmQoIlxuIik7Ci0gIH0KLQotICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUgPSBOVUxMOwotICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoZXh0ZW5zaW9uKGkpLT5jb250YWluaW5nX3R5cGUoKSAhPSBjb250YWluaW5nX3R5cGUpIHsKLSAgICAgIGlmIChpID4gMCkgY29udGVudHMuYXBwZW5kKCJ9XG5cbiIpOwotICAgICAgY29udGFpbmluZ190eXBlID0gZXh0ZW5zaW9uKGkpLT5jb250YWluaW5nX3R5cGUoKTsKLSAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAiZXh0ZW5kIC4kMCB7XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPmZ1bGxfbmFtZSgpKTsKLSAgICB9Ci0gICAgZXh0ZW5zaW9uKGkpLT5EZWJ1Z1N0cmluZygxLCBGaWVsZERlc2NyaXB0b3I6OlBSSU5UX0xBQkVMLCAmY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7Ci0gIH0KLSAgaWYgKGV4dGVuc2lvbl9jb3VudCgpID4gMCkgY29udGVudHMuYXBwZW5kKCJ9XG5cbiIpOwotCi0gIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudCgmY29udGVudHMpOwotCi0gIHJldHVybiBjb250ZW50czsKLX0KLQotc3RyaW5nIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgewotICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgb3B0aW9ucwotICByZXR1cm4gRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhvcHRpb25zKTsKLX0KLQotc3RyaW5nIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCi0gICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdCB7Ci0gIHN0cmluZyBjb250ZW50czsKLSAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBvcHRpb25zLCAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIHRydWUpOwotICByZXR1cm4gY29udGVudHM7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfb3BlbmluZ19jbGF1c2UpIGNvbnN0IHsKLSAgaWYgKG9wdGlvbnMoKS5tYXBfZW50cnkoKSkgewotICAgIC8vIERvIG5vdCBnZW5lcmF0ZSBkZWJ1ZyBzdHJpbmcgZm9yIGF1dG8tZ2VuZXJhdGVkIG1hcC1lbnRyeSB0eXBlLgotICAgIHJldHVybjsKLSAgfQotICBzdHJpbmcgcHJlZml4KGRlcHRoICogMiwgJyAnKTsKLSAgKytkZXB0aDsKLQotICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyCi0gICAgICBjb21tZW50X3ByaW50ZXIodGhpcywgcHJlZml4LCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7Ci0gIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KGNvbnRlbnRzKTsKLQotICBpZiAoaW5jbHVkZV9vcGVuaW5nX2NsYXVzZSkgewotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMG1lc3NhZ2UgJDEiLCBwcmVmaXgsIG5hbWUoKSk7Ci0gIH0KLSAgY29udGVudHMtPmFwcGVuZCgiIHtcbiIpOwotCi0gIEZvcm1hdExpbmVPcHRpb25zKGRlcHRoLCBvcHRpb25zKCksIGNvbnRlbnRzKTsKLQotICAvLyBGaW5kIGFsbCB0aGUgJ2dyb3VwJyB0eXBlcyBmb3IgZmllbGRzIGFuZCBleHRlbnNpb25zOyB3ZSB3aWxsIG5vdCBvdXRwdXQKLSAgLy8gdGhlaXIgbmVzdGVkIGRlZmluaXRpb25zICh0aG9zZSB3aWxsIGJlIGRvbmUgd2l0aCB0aGVpciBncm91cCBmaWVsZAotICAvLyBkZXNjcmlwdG9yKS4KLSAgc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBncm91cHM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKGZpZWxkKGkpLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7Ci0gICAgICBncm91cHMuaW5zZXJ0KGZpZWxkKGkpLT5tZXNzYWdlX3R5cGUoKSk7Ci0gICAgfQotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGlmIChleHRlbnNpb24oaSktPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKLSAgICAgIGdyb3Vwcy5pbnNlcnQoZXh0ZW5zaW9uKGkpLT5tZXNzYWdlX3R5cGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoZ3JvdXBzLmNvdW50KG5lc3RlZF90eXBlKGkpKSA9PSAwKSB7Ci0gICAgICBuZXN0ZWRfdHlwZShpKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIHRydWUpOwotICAgIH0KLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBlbnVtX3R5cGUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMpOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKGZpZWxkKGkpLT5jb250YWluaW5nX29uZW9mKCkgPT0gTlVMTCkgewotICAgICAgZmllbGQoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBGaWVsZERlc2NyaXB0b3I6OlBSSU5UX0xBQkVMLCBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7Ci0gICAgfSBlbHNlIGlmIChmaWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpLT5maWVsZCgwKSA9PSBmaWVsZChpKSkgewotICAgICAgLy8gVGhpcyBpcyB0aGUgZmlyc3QgZmllbGQgaW4gdGhpcyBvbmVvZiwgc28gcHJpbnQgdGhlIHdob2xlIG9uZW9mLgotICAgICAgZmllbGQoaSktPmNvbnRhaW5pbmdfb25lb2YoKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpOwotICAgIH0KLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgewotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgZXh0ZW5zaW9ucyAkMSB0byAkMjtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fcmFuZ2UoaSktPnN0YXJ0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX3JhbmdlKGkpLT5lbmQgLSAxKTsKLSAgfQotCi0gIC8vIEdyb3VwIGV4dGVuc2lvbnMgYnkgd2hhdCB0aGV5IGV4dGVuZCwgc28gdGhleSBjYW4gYmUgcHJpbnRlZCBvdXQgdG9nZXRoZXIuCi0gIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSA9IE5VTEw7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIGlmIChleHRlbnNpb24oaSktPmNvbnRhaW5pbmdfdHlwZSgpICE9IGNvbnRhaW5pbmdfdHlwZSkgewotICAgICAgaWYgKGkgPiAwKSBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIH1cbiIsIHByZWZpeCk7Ci0gICAgICBjb250YWluaW5nX3R5cGUgPSBleHRlbnNpb24oaSktPmNvbnRhaW5pbmdfdHlwZSgpOwotICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICBleHRlbmQgLiQxIHtcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgY29udGFpbmluZ190eXBlLT5mdWxsX25hbWUoKSk7Ci0gICAgfQotICAgIGV4dGVuc2lvbihpKS0+RGVidWdTdHJpbmcoCi0gICAgICAgIGRlcHRoICsgMSwgRmllbGREZXNjcmlwdG9yOjpQUklOVF9MQUJFTCwgY29udGVudHMsCi0gICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgfQotICBpZiAoZXh0ZW5zaW9uX2NvdW50KCkgPiAwKQotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgfVxuIiwgcHJlZml4KTsKLQotICBpZiAocmVzZXJ2ZWRfcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIHJlc2VydmVkICIsIHByZWZpeCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9yYW5nZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIGNvbnN0IERlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqIHJhbmdlID0gcmVzZXJ2ZWRfcmFuZ2UoaSk7Ci0gICAgICBpZiAocmFuZ2UtPmVuZCA9PSByYW5nZS0+c3RhcnQgKyAxKSB7Ci0gICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCwgIiwgcmFuZ2UtPnN0YXJ0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCB0byAkMSwgIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS0+c3RhcnQsIHJhbmdlLT5lbmQgLSAxKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgY29udGVudHMtPnJlcGxhY2UoY29udGVudHMtPnNpemUoKSAtIDIsIDIsICI7XG4iKTsKLSAgfQotCi0gIGlmIChyZXNlcnZlZF9uYW1lX2NvdW50KCkgPiAwKSB7Ci0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICByZXNlcnZlZCAiLCBwcmVmaXgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICJcIiQwXCIsICIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFc2NhcGUocmVzZXJ2ZWRfbmFtZShpKSkpOwotICAgIH0KLSAgICBjb250ZW50cy0+cmVwbGFjZShjb250ZW50cy0+c2l6ZSgpIC0gMiwgMiwgIjtcbiIpOwotICB9Ci0KLSAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKLSAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKLX0KLQotc3RyaW5nIEZpZWxkRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCBvcHRpb25zCi0gIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOwotfQotCi1zdHJpbmcgRmllbGREZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAotICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKLSAgc3RyaW5nIGNvbnRlbnRzOwotICBpbnQgZGVwdGggPSAwOwotICBpZiAoaXNfZXh0ZW5zaW9uKCkpIHsKLSAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgImV4dGVuZCAuJDAge1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSk7Ci0gICAgZGVwdGggPSAxOwotICB9Ci0gIERlYnVnU3RyaW5nKGRlcHRoLCBQUklOVF9MQUJFTCwgJmNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7Ci0gIGlmIChpc19leHRlbnNpb24oKSkgewotICAgIGNvbnRlbnRzLmFwcGVuZCgifVxuIik7Ci0gIH0KLSAgcmV0dXJuIGNvbnRlbnRzOwotfQotCi0vLyBUaGUgZmllbGQgdHlwZSBzdHJpbmcgdXNlZCBpbiBGaWVsZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkKLXN0cmluZyBGaWVsZERlc2NyaXB0b3I6OkZpZWxkVHlwZU5hbWVEZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgc3dpdGNoKHR5cGUoKSkgewotICAgIGNhc2UgVFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuICIuIiArIG1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKTsKLSAgICBjYXNlIFRZUEVfRU5VTToKLSAgICAgIHJldHVybiAiLiIgKyBlbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCk7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBrVHlwZVRvTmFtZVt0eXBlKCldOwotICB9Ci19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHJpbnRMYWJlbEZsYWcgcHJpbnRfbGFiZWxfZmxhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucykgY29uc3QgewotICBzdHJpbmcgcHJlZml4KGRlcHRoICogMiwgJyAnKTsKLSAgc3RyaW5nIGZpZWxkX3R5cGU7Ci0KLSAgLy8gU3BlY2lhbCBjYXNlIG1hcCBmaWVsZHMuCi0gIGlmIChpc19tYXAoKSkgewotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoCi0gICAgICAgICZmaWVsZF90eXBlLCAibWFwPCQwLCAkMT4iLAotICAgICAgICBtZXNzYWdlX3R5cGUoKS0+ZmllbGQoMCktPkZpZWxkVHlwZU5hbWVEZWJ1Z1N0cmluZygpLAotICAgICAgICBtZXNzYWdlX3R5cGUoKS0+ZmllbGQoMSktPkZpZWxkVHlwZU5hbWVEZWJ1Z1N0cmluZygpKTsKLSAgfSBlbHNlIHsKLSAgICBmaWVsZF90eXBlID0gRmllbGRUeXBlTmFtZURlYnVnU3RyaW5nKCk7Ci0gIH0KLQotICBzdHJpbmcgbGFiZWw7Ci0gIGlmIChwcmludF9sYWJlbF9mbGFnID09IFBSSU5UX0xBQkVMICYmICFpc19tYXAoKSkgewotICAgIGxhYmVsID0ga0xhYmVsVG9OYW1lW3RoaXMtPmxhYmVsKCldOwotICAgIGxhYmVsLnB1c2hfYmFjaygnICcpOwotICB9Ci0KLSAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgotICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwgZGVidWdfc3RyaW5nX29wdGlvbnMpOwotICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7Ci0KLSAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwJDEkMiAkMyA9ICQ0IiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlKCkgPT0gVFlQRV9HUk9VUCA/IG1lc3NhZ2VfdHlwZSgpLT5uYW1lKCkgOgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlcigpKTsKLQotICBib29sIGJyYWNrZXRlZCA9IGZhbHNlOwotICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUoKSkgewotICAgIGJyYWNrZXRlZCA9IHRydWU7Ci0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiBbZGVmYXVsdCA9ICQwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlZmF1bHRWYWx1ZUFzU3RyaW5nKHRydWUpKTsKLSAgfQotCi0gIHN0cmluZyBmb3JtYXR0ZWRfb3B0aW9uczsKLSAgaWYgKEZvcm1hdEJyYWNrZXRlZE9wdGlvbnMoZGVwdGgsIG9wdGlvbnMoKSwgJmZvcm1hdHRlZF9vcHRpb25zKSkgewotICAgIGNvbnRlbnRzLT5hcHBlbmQoYnJhY2tldGVkID8gIiwgIiA6ICIgWyIpOwotICAgIGJyYWNrZXRlZCA9IHRydWU7Ci0gICAgY29udGVudHMtPmFwcGVuZChmb3JtYXR0ZWRfb3B0aW9ucyk7Ci0gIH0KLQotICBpZiAoYnJhY2tldGVkKSB7Ci0gICAgY29udGVudHMtPmFwcGVuZCgiXSIpOwotICB9Ci0KLSAgaWYgKHR5cGUoKSA9PSBUWVBFX0dST1VQKSB7Ci0gICAgaWYgKGRlYnVnX3N0cmluZ19vcHRpb25zLmVsaWRlX2dyb3VwX2JvZHkpIHsKLSAgICAgIGNvbnRlbnRzLT5hcHBlbmQoIiB7IC4uLiB9O1xuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG1lc3NhZ2VfdHlwZSgpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGluY2x1ZGVfb3BlbmluZ19jbGF1c2UgKi8gZmFsc2UpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBjb250ZW50cy0+YXBwZW5kKCI7XG4iKTsKLSAgfQotCi0gIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudChjb250ZW50cyk7Ci19Ci0KLXN0cmluZyBPbmVvZkRlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgewotICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgdmFsdWVzCi0gIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOwotfQotCi1zdHJpbmcgT25lb2ZEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAotICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgewotICBzdHJpbmcgY29udGVudHM7Ci0gIERlYnVnU3RyaW5nKDAsICZjb250ZW50cywgb3B0aW9ucyk7Ci0gIHJldHVybiBjb250ZW50czsKLX0KLQotdm9pZCBPbmVvZkRlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nKiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKLSAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7Ci0gICsrZGVwdGg7Ci0gIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIKLSAgICAgIGNvbW1lbnRfcHJpbnRlcih0aGlzLCBwcmVmaXgsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgY29tbWVudF9wcmludGVyLkFkZFByZUNvbW1lbnQoY29udGVudHMpOwotICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKAotICAgICAgY29udGVudHMsICIkMCBvbmVvZiAkMSB7IiwgcHJlZml4LCBuYW1lKCkpOwotICBpZiAoZGVidWdfc3RyaW5nX29wdGlvbnMuZWxpZGVfb25lb2ZfYm9keSkgewotICAgIGNvbnRlbnRzLT5hcHBlbmQoIiAuLi4gfVxuIik7Ci0gIH0gZWxzZSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICAgIGZpZWxkKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgRmllbGREZXNjcmlwdG9yOjpPTUlUX0xBQkVMLCBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7Ci0gICAgfQotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMH1cbiIsIHByZWZpeCk7Ci0gIH0KLSAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKLX0KLQotc3RyaW5nIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnM7ICAvLyBkZWZhdWx0IHZhbHVlcwotICByZXR1cm4gRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhvcHRpb25zKTsKLX0KLQotc3RyaW5nIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAotICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgewotICBzdHJpbmcgY29udGVudHM7Ci0gIERlYnVnU3RyaW5nKDAsICZjb250ZW50cywgb3B0aW9ucyk7Ci0gIHJldHVybiBjb250ZW50czsKLX0KLQotdm9pZCBFbnVtRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKLSAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7Ci0gICsrZGVwdGg7Ci0KLSAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgotICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwgZGVidWdfc3RyaW5nX29wdGlvbnMpOwotICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7Ci0KLSAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwZW51bSAkMSB7XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByZWZpeCwgbmFtZSgpKTsKLQotICBGb3JtYXRMaW5lT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCBjb250ZW50cyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZV9jb3VudCgpOyBpKyspIHsKLSAgICB2YWx1ZShpKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7Ci0gIH0KLSAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKLQotICBjb21tZW50X3ByaW50ZXIuQWRkUG9zdENvbW1lbnQoY29udGVudHMpOwotfQotCi1zdHJpbmcgRW51bVZhbHVlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCB2YWx1ZXMKLSAgcmV0dXJuIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7Ci19Ci0KLXN0cmluZyBFbnVtVmFsdWVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAotICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgewotICBzdHJpbmcgY29udGVudHM7Ci0gIERlYnVnU3RyaW5nKDAsICZjb250ZW50cywgb3B0aW9ucyk7Ci0gIHJldHVybiBjb250ZW50czsKLX0KLQotdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKLSAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7Ci0KLSAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgotICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwgZGVidWdfc3RyaW5nX29wdGlvbnMpOwotICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7Ci0KLSAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwJDEgPSAkMiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBuYW1lKCksIG51bWJlcigpKTsKLQotICBzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7Ci0gIGlmIChGb3JtYXRCcmFja2V0ZWRPcHRpb25zKGRlcHRoLCBvcHRpb25zKCksICZmb3JtYXR0ZWRfb3B0aW9ucykpIHsKLSAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiIFskMF0iLCBmb3JtYXR0ZWRfb3B0aW9ucyk7Ci0gIH0KLSAgY29udGVudHMtPmFwcGVuZCgiO1xuIik7Ci0KLSAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKLX0KLQotc3RyaW5nIFNlcnZpY2VEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKLSAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnM7ICAvLyBkZWZhdWx0IHZhbHVlcwotICByZXR1cm4gRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhvcHRpb25zKTsKLX0KLQotc3RyaW5nIFNlcnZpY2VEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAotICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgewotICBzdHJpbmcgY29udGVudHM7Ci0gIERlYnVnU3RyaW5nKCZjb250ZW50cywgb3B0aW9ucyk7Ci0gIHJldHVybiBjb250ZW50czsKLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoc3RyaW5nICpjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7Ci0gIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIKLSAgICAgIGNvbW1lbnRfcHJpbnRlcih0aGlzLCAvKiBwcmVmaXggKi8gIiIsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgY29tbWVudF9wcmludGVyLkFkZFByZUNvbW1lbnQoY29udGVudHMpOwotCi0gIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICJzZXJ2aWNlICQwIHtcbiIsIG5hbWUoKSk7Ci0KLSAgRm9ybWF0TGluZU9wdGlvbnMoMSwgb3B0aW9ucygpLCBjb250ZW50cyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2RfY291bnQoKTsgaSsrKSB7Ci0gICAgbWV0aG9kKGkpLT5EZWJ1Z1N0cmluZygxLCBjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMpOwotICB9Ci0KLSAgY29udGVudHMtPmFwcGVuZCgifVxuIik7Ci0KLSAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKLX0KLQotc3RyaW5nIE1ldGhvZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgewotICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgdmFsdWVzCi0gIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOwotfQotCi1zdHJpbmcgTWV0aG9kRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygKLSAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0IHsKLSAgc3RyaW5nIGNvbnRlbnRzOwotICBEZWJ1Z1N0cmluZygwLCAmY29udGVudHMsIG9wdGlvbnMpOwotICByZXR1cm4gY29udGVudHM7Ci19Ci0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7Ci0gIHN0cmluZyBwcmVmaXgoZGVwdGggKiAyLCAnICcpOwotICArK2RlcHRoOwotCi0gIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIKLSAgICAgIGNvbW1lbnRfcHJpbnRlcih0aGlzLCBwcmVmaXgsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKLSAgY29tbWVudF9wcmludGVyLkFkZFByZUNvbW1lbnQoY29udGVudHMpOwotCi0gIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMHJwYyAkMSgkNC4kMikgcmV0dXJucyAoJDUuJDMpIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIG5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlKCktPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlKCktPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsaWVudF9zdHJlYW1pbmcoKSA/ICJzdHJlYW0gIiA6ICIiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlcnZlcl9zdHJlYW1pbmcoKSA/ICJzdHJlYW0gIiA6ICIiKTsKLQotICBzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7Ci0gIGlmIChGb3JtYXRMaW5lT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCAmZm9ybWF0dGVkX29wdGlvbnMpKSB7Ci0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiB7XG4kMCQxfVxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcm1hdHRlZF9vcHRpb25zLCBwcmVmaXgpOwotICB9IGVsc2UgewotICAgIGNvbnRlbnRzLT5hcHBlbmQoIjtcbiIpOwotICB9Ci0KLSAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKLX0KLQotCi0vLyBMb2NhdGlvbiBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWJvb2wgRmlsZURlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKGNvbnN0IHZlY3RvcjxpbnQ+JiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3QgewotICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChvdXRfbG9jYXRpb24pOwotICBpZiAoc291cmNlX2NvZGVfaW5mb18pIHsKLSAgICBpZiAoY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIGxvYyA9Ci0gICAgICAgIHRhYmxlc18tPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIHNvdXJjZV9jb2RlX2luZm9fKSkgewotICAgICAgY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQzMj4mIHNwYW4gPSBsb2MtPnNwYW4oKTsKLSAgICAgIGlmIChzcGFuLnNpemUoKSA9PSAzIHx8IHNwYW4uc2l6ZSgpID09IDQpIHsKLSAgICAgICAgb3V0X2xvY2F0aW9uLT5zdGFydF9saW5lICAgPSBzcGFuLkdldCgwKTsKLSAgICAgICAgb3V0X2xvY2F0aW9uLT5zdGFydF9jb2x1bW4gPSBzcGFuLkdldCgxKTsKLSAgICAgICAgb3V0X2xvY2F0aW9uLT5lbmRfbGluZSAgICAgPSBzcGFuLkdldChzcGFuLnNpemUoKSA9PSAzID8gMCA6IDIpOwotICAgICAgICBvdXRfbG9jYXRpb24tPmVuZF9jb2x1bW4gICA9IHNwYW4uR2V0KHNwYW4uc2l6ZSgpIC0gMSk7Ci0KLSAgICAgICAgb3V0X2xvY2F0aW9uLT5sZWFkaW5nX2NvbW1lbnRzID0gbG9jLT5sZWFkaW5nX2NvbW1lbnRzKCk7Ci0gICAgICAgIG91dF9sb2NhdGlvbi0+dHJhaWxpbmdfY29tbWVudHMgPSBsb2MtPnRyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gICAgICAgIG91dF9sb2NhdGlvbi0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cy5hc3NpZ24oCi0gICAgICAgICAgICBsb2MtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKS5iZWdpbigpLAotICAgICAgICAgICAgbG9jLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkuZW5kKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIEZpbGVEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7Ci0gIHZlY3RvcjxpbnQ+IHBhdGg7ICAvLyBlbXB0eSBwYXRoIGZvciByb290IEZpbGVEZXNjcmlwdG9yCi0gIHJldHVybiBHZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOwotfQotCi1ib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfcGFja2VkKCkgY29uc3QgewotICBpZiAoIWlzX3BhY2thYmxlKCkpIHJldHVybiBmYWxzZTsKLSAgaWYgKGZpbGVfLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMikgewotICAgIHJldHVybiAob3B0aW9uc18gIT0gTlVMTCkgJiYgb3B0aW9uc18tPnBhY2tlZCgpOwotICB9IGVsc2UgewotICAgIHJldHVybiBvcHRpb25zXyA9PSBOVUxMIHx8ICFvcHRpb25zXy0+aGFzX3BhY2tlZCgpIHx8IG9wdGlvbnNfLT5wYWNrZWQoKTsKLSAgfQotfQotCi1ib29sIERlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKLSAgdmVjdG9yPGludD4gcGF0aDsKLSAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKLSAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKLX0KLQotYm9vbCBGaWVsZERlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKLSAgdmVjdG9yPGludD4gcGF0aDsKLSAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKLSAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKLX0KLQotYm9vbCBPbmVvZkRlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKLSAgdmVjdG9yPGludD4gcGF0aDsKLSAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKLSAgcmV0dXJuIGNvbnRhaW5pbmdfdHlwZSgpLT5maWxlKCktPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIG91dF9sb2NhdGlvbik7Ci19Ci0KLWJvb2wgRW51bURlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKLSAgdmVjdG9yPGludD4gcGF0aDsKLSAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKLSAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKLX0KLQotYm9vbCBNZXRob2REZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7Ci0gIHZlY3RvcjxpbnQ+IHBhdGg7Ci0gIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7Ci0gIHJldHVybiBzZXJ2aWNlKCktPmZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKLX0KLQotYm9vbCBTZXJ2aWNlRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3QgewotICB2ZWN0b3I8aW50PiBwYXRoOwotICBHZXRMb2NhdGlvblBhdGgoJnBhdGgpOwotICByZXR1cm4gZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOwotfQotCi1ib29sIEVudW1WYWx1ZURlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKAotICAgIFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKLSAgdmVjdG9yPGludD4gcGF0aDsKLSAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKLSAgcmV0dXJuIHR5cGUoKS0+ZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOwotfQotCi12b2lkIERlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7Ci0gIGlmIChjb250YWluaW5nX3R5cGUoKSkgewotICAgIGNvbnRhaW5pbmdfdHlwZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKLSAgICBvdXRwdXQtPnB1c2hfYmFjayhEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIpOwotICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOwotICB9IGVsc2UgewotICAgIG91dHB1dC0+cHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyKTsKLSAgICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKLSAgfQotfQotCi12b2lkIEZpZWxkRGVzY3JpcHRvcjo6R2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKLSAgaWYgKGlzX2V4dGVuc2lvbigpKSB7Ci0gICAgaWYgKGV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKLSAgICAgIG91dHB1dC0+cHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtFeHRlbnNpb25GaWVsZE51bWJlcik7Ci0gICAgICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgZXh0ZW5zaW9uX3Njb3BlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOwotICAgICAgb3V0cHV0LT5wdXNoX2JhY2soRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOwotICAgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGNvbnRhaW5pbmdfdHlwZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKLSAgICBvdXRwdXQtPnB1c2hfYmFjayhEZXNjcmlwdG9yUHJvdG86OmtGaWVsZEZpZWxkTnVtYmVyKTsKLSAgICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKLSAgfQotfQotCi12b2lkIE9uZW9mRGVzY3JpcHRvcjo6R2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKLSAgY29udGFpbmluZ190eXBlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOwotICBvdXRwdXQtPnB1c2hfYmFjayhEZXNjcmlwdG9yUHJvdG86OmtPbmVvZkRlY2xGaWVsZE51bWJlcik7Ci0gIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOwotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3QgewotICBpZiAoY29udGFpbmluZ190eXBlKCkpIHsKLSAgICBjb250YWluaW5nX3R5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7Ci0gICAgb3V0cHV0LT5wdXNoX2JhY2soRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlcik7Ci0gICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0cHV0LT5wdXNoX2JhY2soRmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIpOwotICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOwotICB9Ci19Ci0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvcjo6R2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKLSAgdHlwZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKLSAgb3V0cHV0LT5wdXNoX2JhY2soRW51bURlc2NyaXB0b3JQcm90bzo6a1ZhbHVlRmllbGROdW1iZXIpOwotICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvcjo6R2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKLSAgb3V0cHV0LT5wdXNoX2JhY2soRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlcik7Ci0gIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOwotfQotCi12b2lkIE1ldGhvZERlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7Ci0gIHNlcnZpY2UoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7Ci0gIG91dHB1dC0+cHVzaF9iYWNrKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtNZXRob2RGaWVsZE51bWJlcik7Ci0gIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIFJlcHJlc2VudHMgYW4gb3B0aW9ucyBtZXNzYWdlIHRvIGludGVycHJldC4gRXh0ZW5zaW9uIG5hbWVzIGluIHRoZSBvcHRpb24KLS8vIG5hbWUgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIG5hbWVfc2NvcGUuIGVsZW1lbnRfbmFtZSBhbmQgb3JpZ19vcHQgYXJlCi0vLyB1c2VkIG9ubHkgZm9yIGVycm9yIHJlcG9ydGluZyAoc2luY2UgdGhlIHBhcnNlciByZWNvcmRzIGxvY2F0aW9ucyBhZ2FpbnN0Ci0vLyBwb2ludGVycyBpbiB0aGUgb3JpZ2luYWwgb3B0aW9ucywgbm90IHRoZSBtdXRhYmxlIGNvcHkpLiBUaGUgTWVzc2FnZSBtdXN0IGJlCi0vLyBvbmUgb2YgdGhlIE9wdGlvbnMgbWVzc2FnZXMgaW4gZGVzY3JpcHRvci5wcm90by4KLXN0cnVjdCBPcHRpb25zVG9JbnRlcnByZXQgewotICBPcHRpb25zVG9JbnRlcnByZXQoY29uc3Qgc3RyaW5nJiBucywKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZWwsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBvcmlnX29wdCwKLSAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG9wdCkKLSAgICAgIDogbmFtZV9zY29wZShucyksCi0gICAgICAgIGVsZW1lbnRfbmFtZShlbCksCi0gICAgICAgIG9yaWdpbmFsX29wdGlvbnMob3JpZ19vcHQpLAotICAgICAgICBvcHRpb25zKG9wdCkgewotICB9Ci0gIHN0cmluZyBuYW1lX3Njb3BlOwotICBzdHJpbmcgZWxlbWVudF9uYW1lOwotICBjb25zdCBNZXNzYWdlKiBvcmlnaW5hbF9vcHRpb25zOwotICBNZXNzYWdlKiBvcHRpb25zOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLWNsYXNzIERlc2NyaXB0b3JCdWlsZGVyIHsKLSBwdWJsaWM6Ci0gIERlc2NyaXB0b3JCdWlsZGVyKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAotICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6VGFibGVzKiB0YWJsZXMsCi0gICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKTsKLSAgfkRlc2NyaXB0b3JCdWlsZGVyKCk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEJ1aWxkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgT3B0aW9uSW50ZXJwcmV0ZXI7Ci0KLSAgLy8gTm9uLXJlY3Vyc2l2ZSBwYXJ0IG9mIEJ1aWxkRmlsZSBmdW5jdGlvbmFsaXR5LgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlSW1wbChjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0KLSAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2xfOwotICBEZXNjcmlwdG9yUG9vbDo6VGFibGVzKiB0YWJsZXNfOyAgLy8gZm9yIGNvbnZlbmllbmNlCi0gIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKLQotICAvLyBBcyB3ZSBidWlsZCBkZXNjcmlwdG9ycyB3ZSBzdG9yZSBjb3BpZXMgb2YgdGhlIG9wdGlvbnMgbWVzc2FnZXMgaW4KLSAgLy8gdGhlbS4gV2UgcHV0IHBvaW50ZXJzIHRvIHRob3NlIGNvcGllcyBpbiB0aGlzIHZlY3RvciwgYXMgd2UgYnVpbGQsIHNvIHdlCi0gIC8vIGNhbiBsYXRlciAoYWZ0ZXIgY3Jvc3MtbGlua2luZykgaW50ZXJwcmV0IHRob3NlIG9wdGlvbnMuCi0gIHZlY3RvcjxPcHRpb25zVG9JbnRlcnByZXQ+IG9wdGlvbnNfdG9faW50ZXJwcmV0XzsKLQotICBib29sIGhhZF9lcnJvcnNfOwotICBzdHJpbmcgZmlsZW5hbWVfOwotICBGaWxlRGVzY3JpcHRvciogZmlsZV87Ci0gIEZpbGVEZXNjcmlwdG9yVGFibGVzKiBmaWxlX3RhYmxlc187Ci0gIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGRlcGVuZGVuY2llc187Ci0KLSAgLy8gdW51c2VkX2RlcGVuZGVuY3lfIGlzIHVzZWQgdG8gcmVjb3JkIHRoZSB1bnVzZWQgaW1wb3J0ZWQgZmlsZXMuCi0gIC8vIE5vdGU6IHB1YmxpYyBpbXBvcnQgaXMgbm90IGNvbnNpZGVyZWQuCi0gIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHVudXNlZF9kZXBlbmRlbmN5XzsKLQotICAvLyBJZiBMb29rdXBTeW1ib2woKSBmaW5kcyBhIHN5bWJvbCB0aGF0IGlzIGluIGEgZmlsZSB3aGljaCBpcyBub3QgYSBkZWNsYXJlZAotICAvLyBkZXBlbmRlbmN5IG9mIHRoaXMgZmlsZSwgaXQgd2lsbCBmYWlsLCBidXQgd2lsbCBzZXQKLSAgLy8gcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyB0byBwb2ludCBhdCB0aGF0IGZpbGUuICBUaGlzIGlzIG9ubHkgdXNlZAotICAvLyBieSBBZGROb3REZWZpbmVkRXJyb3IoKSB0byByZXBvcnQgYSBtb3JlIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgotICAvLyBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gaXMgdGhlIG5hbWUgb2YgdGhlIHN5bWJvbCB0aGF0IHdhcwotICAvLyBhY3R1YWxseSBmb3VuZCBpbiBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfLCB3aGljaCBtYXkgYmUgYSBwYXJlbnQKLSAgLy8gb2YgdGhlIHN5bWJvbCBhY3R1YWxseSBsb29rZWQgZm9yLgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XzsKLSAgc3RyaW5nIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV9uYW1lXzsKLQotICAvLyBJZiBMb29rdXBTeW1ib2woKSBjb3VsZCByZXNvbHZlIGEgc3ltYm9sIHdoaWNoIGlzIG5vdCBkZWZpbmVkLAotICAvLyByZWNvcmQgdGhlIHJlc29sdmVkIG5hbWUuICBUaGlzIGlzIG9ubHkgdXNlZCBieSBBZGROb3REZWZpbmVkRXJyb3IoKQotICAvLyB0byByZXBvcnQgYSBtb3JlIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgotICBzdHJpbmcgdW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV87Ci0KLSAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVycm9yKTsKLSAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcik7Ci0gIHZvaWQgQWRkUmVjdXJzaXZlSW1wb3J0RXJyb3IoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludCBmcm9tX2hlcmUpOwotICB2b2lkIEFkZFR3aWNlTGlzdGVkRXJyb3IoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludCBpbmRleCk7Ci0gIHZvaWQgQWRkSW1wb3J0RXJyb3IoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludCBpbmRleCk7Ci0KLSAgLy8gQWRkcyBhbiBlcnJvciBpbmRpY2F0aW5nIHRoYXQgdW5kZWZpbmVkX3N5bWJvbCB3YXMgbm90IGRlZmluZWQuICBNdXN0Ci0gIC8vIG9ubHkgYmUgY2FsbGVkIGFmdGVyIExvb2t1cFN5bWJvbCgpIGZhaWxzLgotICB2b2lkIEFkZE5vdERlZmluZWRFcnJvcigKLSAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAotICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICBjb25zdCBzdHJpbmcmIHVuZGVmaW5lZF9zeW1ib2wpOwotCi0gIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZXJyb3IpOwotCi0gIC8vIFNpbGx5IGhlbHBlciB3aGljaCBkZXRlcm1pbmVzIGlmIHRoZSBnaXZlbiBmaWxlIGlzIGluIHRoZSBnaXZlbiBwYWNrYWdlLgotICAvLyBJLmUuLCBlaXRoZXIgZmlsZS0+cGFja2FnZSgpID09IHBhY2thZ2VfbmFtZSBvciBmaWxlLT5wYWNrYWdlKCkgaXMgYQotICAvLyBuZXN0ZWQgcGFja2FnZSB3aXRoaW4gcGFja2FnZV9uYW1lLgotICBib29sIElzSW5QYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBzdHJpbmcmIHBhY2thZ2VfbmFtZSk7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHdoaWNoIGZpbmRzIGFsbCBwdWJsaWMgZGVwZW5kZW5jaWVzIG9mIHRoZSBnaXZlbiBmaWxlLCBhbmQKLSAgLy8gc3RvcmVzIHRoZSB0aGVtIGluIHRoZSBkZXBlbmRlbmNpZXNfIHNldCBpbiB0aGUgYnVpbGRlci4KLSAgdm9pZCBSZWNvcmRQdWJsaWNEZXBlbmRlbmNpZXMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOwotCi0gIC8vIExpa2UgdGFibGVzXy0+RmluZFN5bWJvbCgpLCBidXQgYWRkaXRpb25hbGx5OgotICAvLyAtIFNlYXJjaCB0aGUgcG9vbCdzIHVuZGVybGF5IGlmIG5vdCBmb3VuZCBpbiB0YWJsZXNfLgotICAvLyAtIEluc3VyZSB0aGF0IHRoZSByZXN1bHRpbmcgU3ltYm9sIGlzIGZyb20gb25lIG9mIHRoZSBmaWxlJ3MgZGVjbGFyZWQKLSAgLy8gICBkZXBlbmRlbmNpZXMuCi0gIFN5bWJvbCBGaW5kU3ltYm9sKGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgLy8gTGlrZSBGaW5kU3ltYm9sKCkgYnV0IGRvZXMgbm90IHJlcXVpcmUgdGhhdCB0aGUgc3ltYm9sIGlzIGluIG9uZSBvZiB0aGUKLSAgLy8gZmlsZSdzIGRlY2xhcmVkIGRlcGVuZGVuY2llcy4KLSAgU3ltYm9sIEZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgLy8gVGhpcyBpbXBsZW1lbnRzIHRoZSBib2R5IG9mIEZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKCkuCi0gIFN5bWJvbCBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwc0hlbHBlcihjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgLy8gTGlrZSBGaW5kU3ltYm9sKCksIGJ1dCBsb29rcyB1cCB0aGUgbmFtZSByZWxhdGl2ZSB0byBzb21lIG90aGVyIHN5bWJvbAotICAvLyBuYW1lLiAgVGhpcyBmaXJzdCBzZWFyY2hlcyBzaWJsaW5ncyBvZiByZWxhdGl2ZV90bywgdGhlbiBzaWJsaW5ncyBvZiBpdHMKLSAgLy8gcGFyZW50cywgZXRjLiAgRm9yIGV4YW1wbGUsIExvb2t1cFN5bWJvbCgiZm9vLmJhciIsICJiYXoucXV4LmNvcmdlIikgbWFrZXMKLSAgLy8gdGhlIGZvbGxvd2luZyBjYWxscywgcmV0dXJuaW5nIHRoZSBmaXJzdCBub24tbnVsbCByZXN1bHQ6Ci0gIC8vIEZpbmRTeW1ib2woImJhei5xdXguZm9vLmJhciIpLCBGaW5kU3ltYm9sKCJiYXouZm9vLmJhciIpLAotICAvLyBGaW5kU3ltYm9sKCJmb28uYmFyIikuICBJZiBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBoYXMgYmVlbiBjYWxsZWQKLSAgLy8gb24gdGhlIERlc2NyaXB0b3JQb29sLCB0aGlzIHdpbGwgZ2VuZXJhdGUgYSBwbGFjZWhvbGRlciB0eXBlIGlmCi0gIC8vIHRoZSBuYW1lIGlzIG5vdCBmb3VuZCAodW5sZXNzIHRoZSBuYW1lIGl0c2VsZiBpcyBtYWxmb3JtZWQpLiAgVGhlCi0gIC8vIHBsYWNlaG9sZGVyX3R5cGUgcGFyYW1ldGVyIGluZGljYXRlcyB3aGF0IGtpbmQgb2YgcGxhY2Vob2xkZXIgc2hvdWxkIGJlCi0gIC8vIGNvbnN0cnVjdGVkIGluIHRoaXMgY2FzZS4gIFRoZSByZXNvbHZlX21vZGUgcGFyYW1ldGVyIGRldGVybWluZXMgd2hldGhlcgotICAvLyBhbnkgc3ltYm9sIGlzIHJldHVybmVkLCBvciBvbmx5IHN5bWJvbHMgdGhhdCBhcmUgdHlwZXMuICBOb3RlLCBob3dldmVyLAotICAvLyB0aGF0IExvb2t1cFN5bWJvbCBtYXkgc3RpbGwgcmV0dXJuIGEgbm9uLXR5cGUgc3ltYm9sIGluIExPT0tVUF9UWVBFUyBtb2RlLAotICAvLyBpZiBpdCBiZWxpZXZlcyB0aGF0J3MgYWxsIGl0IGNvdWxkIHJlZmVyIHRvLiAgVGhlIGNhbGxlciBzaG91bGQgYWx3YXlzCi0gIC8vIGNoZWNrIHRoYXQgaXQgcmVjZWl2ZXMgdGhlIHR5cGUgb2Ygc3ltYm9sIGl0IHdhcyBleHBlY3RpbmcuCi0gIGVudW0gUGxhY2Vob2xkZXJUeXBlIHsKLSAgICBQTEFDRUhPTERFUl9NRVNTQUdFLAotICAgIFBMQUNFSE9MREVSX0VOVU0sCi0gICAgUExBQ0VIT0xERVJfRVhURU5EQUJMRV9NRVNTQUdFCi0gIH07Ci0gIGVudW0gUmVzb2x2ZU1vZGUgewotICAgIExPT0tVUF9BTEwsIExPT0tVUF9UWVBFUwotICB9OwotICBTeW1ib2wgTG9va3VwU3ltYm9sKGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiByZWxhdGl2ZV90bywKLSAgICAgICAgICAgICAgICAgICAgICBQbGFjZWhvbGRlclR5cGUgcGxhY2Vob2xkZXJfdHlwZSA9IFBMQUNFSE9MREVSX01FU1NBR0UsCi0gICAgICAgICAgICAgICAgICAgICAgUmVzb2x2ZU1vZGUgcmVzb2x2ZV9tb2RlID0gTE9PS1VQX0FMTCk7Ci0KLSAgLy8gTGlrZSBMb29rdXBTeW1ib2woKSBidXQgd2lsbCBub3QgcmV0dXJuIGEgcGxhY2Vob2xkZXIgZXZlbiBpZgotICAvLyBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBoYXMgYmVlbiB1c2VkLgotICBTeW1ib2wgTG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcihjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSA9IExPT0tVUF9BTEwpOwotCi0gIC8vIENyZWF0ZXMgYSBwbGFjZWhvbGRlciB0eXBlIHN1aXRhYmxlIGZvciByZXR1cm4gZnJvbSBMb29rdXBTeW1ib2woKS4gIE1heQotICAvLyByZXR1cm4ga051bGxTeW1ib2wgaWYgdGhlIG5hbWUgaXMgbm90IGEgdmFsaWQgdHlwZSBuYW1lLgotICBTeW1ib2wgTmV3UGxhY2Vob2xkZXIoY29uc3Qgc3RyaW5nJiBuYW1lLCBQbGFjZWhvbGRlclR5cGUgcGxhY2Vob2xkZXJfdHlwZSk7Ci0KLSAgLy8gQ3JlYXRlcyBhIHBsYWNlaG9sZGVyIGZpbGUuICBOZXZlciByZXR1cm5zIE5VTEwuICBUaGlzIGlzIHVzZWQgd2hlbiBhbgotICAvLyBpbXBvcnQgaXMgbm90IGZvdW5kIGFuZCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBpcyBlbmFibGVkLgotICBGaWxlRGVzY3JpcHRvciogTmV3UGxhY2Vob2xkZXJGaWxlKGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgLy8gQ2FsbHMgdGFibGVzXy0+QWRkU3ltYm9sKCkgYW5kIHJlY29yZHMgYW4gZXJyb3IgaWYgaXQgZmFpbHMuICBSZXR1cm5zCi0gIC8vIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBmYWxzZSBpZiBmYWlsZWQsIHRob3VnaCBtb3N0IGNhbGxlcnMgY2FuIGlnbm9yZQotICAvLyB0aGUgcmV0dXJuIHZhbHVlIHNpbmNlIGFuIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4gcmVjb3JkZWQuCi0gIGJvb2wgQWRkU3ltYm9sKGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lLAotICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgcHJvdG8sIFN5bWJvbCBzeW1ib2wpOwotCi0gIC8vIExpa2UgQWRkU3ltYm9sKCksIGJ1dCBzdWNjZWVkcyBpZiB0aGUgc3ltYm9sIGlzIGFscmVhZHkgZGVmaW5lZCBhcyBsb25nCi0gIC8vIGFzIHRoZSBleGlzdGluZyBkZWZpbml0aW9uIGlzIGFsc28gYSBwYWNrYWdlIChiZWNhdXNlIGl0J3MgT0sgdG8gZGVmaW5lCi0gIC8vIHRoZSBzYW1lIHBhY2thZ2UgaW4gdHdvIGRpZmZlcmVudCBmaWxlcykuICBBbHNvIGFkZHMgYWxsIHBhcmVudHMgb2YgdGhlCi0gIC8vIHBhY2tnYWUgdG8gdGhlIHN5bWJvbCB0YWJsZSAoZS5nLiBBZGRQYWNrYWdlKCJmb28uYmFyIiwgLi4uKSB3aWxsIGFkZAotICAvLyAiZm9vLmJhciIgYW5kICJmb28iIHRvIHRoZSB0YWJsZSkuCi0gIHZvaWQgQWRkUGFja2FnZShjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IE1lc3NhZ2UmIHByb3RvLAotICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOwotCi0gIC8vIENoZWNrcyB0aGF0IHRoZSBzeW1ib2wgbmFtZSBjb250YWlucyBvbmx5IGFscGhhbnVtZXJpYyBjaGFyYWN0ZXJzIGFuZAotICAvLyB1bmRlcnNjb3Jlcy4gIFJlY29yZHMgYW4gZXJyb3Igb3RoZXJ3aXNlLgotICB2b2lkIFZhbGlkYXRlU3ltYm9sTmFtZShjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBwcm90byk7Ci0KLSAgLy8gTGlrZSBWYWxpZGF0ZVN5bWJvbE5hbWUoKSwgYnV0IHRoZSBuYW1lIGlzIGFsbG93ZWQgdG8gY29udGFpbiBwZXJpb2RzIGFuZAotICAvLyBhbiBlcnJvciBpcyBpbmRpY2F0ZWQgYnkgcmV0dXJuaW5nIGZhbHNlIChub3QgcmVjb3JkaW5nIHRoZSBlcnJvcikuCi0gIGJvb2wgVmFsaWRhdGVRdWFsaWZpZWROYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgLy8gVXNlZCBieSBCVUlMRF9BUlJBWSBtYWNybyAoYmVsb3cpIHRvIGF2b2lkIGhhdmluZyB0byBoYXZlIHRoZSB0eXBlCi0gIC8vIHNwZWNpZmllZCBhcyBhIG1hY3JvIHBhcmFtZXRlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci0gIGlubGluZSB2b2lkIEFsbG9jYXRlQXJyYXkoaW50IHNpemUsIFR5cGUqKiBvdXRwdXQpIHsKLSAgICAqb3V0cHV0ID0gdGFibGVzXy0+QWxsb2NhdGVBcnJheTxUeXBlPihzaXplKTsKLSAgfQotCi0gIC8vIEFsbG9jYXRlcyBhIGNvcHkgb2Ygb3JpZ19vcHRpb25zIGluIHRhYmxlc18gYW5kIHN0b3JlcyBpdCBpbiB0aGUKLSAgLy8gZGVzY3JpcHRvci4gUmVtZW1iZXJzIGl0cyB1bmludGVycHJldGVkIG9wdGlvbnMsIHRvIGJlIGludGVycHJldGVkCi0gIC8vIGxhdGVyLiBEZXNjcmlwdG9yVCBtdXN0IGJlIG9uZSBvZiB0aGUgRGVzY3JpcHRvciBtZXNzYWdlcyBmcm9tCi0gIC8vIGRlc2NyaXB0b3IucHJvdG8uCi0gIHRlbXBsYXRlPGNsYXNzIERlc2NyaXB0b3JUPiB2b2lkIEFsbG9jYXRlT3B0aW9ucygKLSAgICAgIGNvbnN0IHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSYgb3JpZ19vcHRpb25zLAotICAgICAgRGVzY3JpcHRvclQqIGRlc2NyaXB0b3IpOwotICAvLyBTcGVjaWFsaXphdGlvbiBmb3IgRmlsZU9wdGlvbnMuCi0gIHZvaWQgQWxsb2NhdGVPcHRpb25zKGNvbnN0IEZpbGVPcHRpb25zJiBvcmlnX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLQotICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgQWxsb2NhdGVPcHRpb25zKCkuIERvbid0IGNhbGwgdGhpcyBkaXJlY3RseS4KLSAgdGVtcGxhdGU8Y2xhc3MgRGVzY3JpcHRvclQ+IHZvaWQgQWxsb2NhdGVPcHRpb25zSW1wbCgKLSAgICAgIGNvbnN0IHN0cmluZyYgbmFtZV9zY29wZSwKLSAgICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgICAgY29uc3QgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlJiBvcmlnX29wdGlvbnMsCi0gICAgICBEZXNjcmlwdG9yVCogZGVzY3JpcHRvcik7Ci0KLSAgLy8gVGhlc2UgbWV0aG9kcyBhbGwgaGF2ZSB0aGUgc2FtZSBzaWduYXR1cmUgZm9yIHRoZSBzYWtlIG9mIHRoZSBCVUlMRF9BUlJBWQotICAvLyBtYWNybywgYmVsb3cuCi0gIHZvaWQgQnVpbGRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvciogcmVzdWx0KTsKLSAgdm9pZCBCdWlsZEZpZWxkT3JFeHRlbnNpb24oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciogcmVzdWx0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4dGVuc2lvbik7Ci0gIHZvaWQgQnVpbGRGaWVsZChjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCkgewotICAgIEJ1aWxkRmllbGRPckV4dGVuc2lvbihwcm90bywgcGFyZW50LCByZXN1bHQsIGZhbHNlKTsKLSAgfQotICB2b2lkIEJ1aWxkRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yKiByZXN1bHQpIHsKLSAgICBCdWlsZEZpZWxkT3JFeHRlbnNpb24ocHJvdG8sIHBhcmVudCwgcmVzdWx0LCB0cnVlKTsKLSAgfQotICB2b2lkIEJ1aWxkRXh0ZW5zaW9uUmFuZ2UoY29uc3QgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmVzdWx0KTsKLSAgdm9pZCBCdWlsZFJlc2VydmVkUmFuZ2UoY29uc3QgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlJiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqIHJlc3VsdCk7Ci0gIHZvaWQgQnVpbGRPbmVvZihjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICBPbmVvZkRlc2NyaXB0b3IqIHJlc3VsdCk7Ci0gIHZvaWQgQnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLAotICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yKiByZXN1bHQpOwotICB2b2lkIEJ1aWxkRW51bVZhbHVlKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQpOwotICB2b2lkIEJ1aWxkU2VydmljZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZHVtbXksCi0gICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yKiByZXN1bHQpOwotICB2b2lkIEJ1aWxkTWV0aG9kKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yKiByZXN1bHQpOwotCi0gIHZvaWQgTG9nVW51c2VkRGVwZW5kZW5jeShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiByZXN1bHQpOwotCi0gIC8vIE11c3QgYmUgcnVuIG9ubHkgYWZ0ZXIgYnVpbGRpbmcuCi0gIC8vCi0gIC8vIE5PVEU6IE9wdGlvbnMgd2lsbCBub3QgYmUgYXZhaWxhYmxlIGR1cmluZyBjcm9zcy1saW5raW5nLCBhcyB0aGV5Ci0gIC8vIGhhdmUgbm90IHlldCBiZWVuIGludGVycHJldGVkLiBEZWZlciBhbnkgaGFuZGxpbmcgb2Ygb3B0aW9ucyB0byB0aGUKLSAgLy8gVmFsaWRhdGUqT3B0aW9ucyBtZXRob2RzLgotICB2b2lkIENyb3NzTGlua0ZpbGUoRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLSAgdm9pZCBDcm9zc0xpbmtNZXNzYWdlKERlc2NyaXB0b3IqIG1lc3NhZ2UsIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pOwotICB2b2lkIENyb3NzTGlua0ZpZWxkKEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLSAgdm9pZCBDcm9zc0xpbmtFbnVtKEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0gIHZvaWQgQ3Jvc3NMaW5rRW51bVZhbHVlKEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOwotICB2b2lkIENyb3NzTGlua1NlcnZpY2UoU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0gIHZvaWQgQ3Jvc3NMaW5rTWV0aG9kKE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0KLSAgLy8gTXVzdCBiZSBydW4gb25seSBhZnRlciBjcm9zcy1saW5raW5nLgotICB2b2lkIEludGVycHJldE9wdGlvbnMoKTsKLQotICAvLyBBIGhlbHBlciBjbGFzcyBmb3IgaW50ZXJwcmV0aW5nIG9wdGlvbnMuCi0gIGNsYXNzIE9wdGlvbkludGVycHJldGVyIHsKLSAgIHB1YmxpYzoKLSAgICAvLyBDcmVhdGVzIGFuIGludGVycHJldGVyIHRoYXQgb3BlcmF0ZXMgaW4gdGhlIGNvbnRleHQgb2YgdGhlIHBvb2wgb2YgdGhlCi0gICAgLy8gc3BlY2lmaWVkIGJ1aWxkZXIsIHdoaWNoIG11c3Qgbm90IGJlIE5VTEwuIFdlIGRvbid0IHRha2Ugb3duZXJzaGlwIG9mIHRoZQotICAgIC8vIGJ1aWxkZXIuCi0gICAgZXhwbGljaXQgT3B0aW9uSW50ZXJwcmV0ZXIoRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXIpOwotCi0gICAgfk9wdGlvbkludGVycHJldGVyKCk7Ci0KLSAgICAvLyBJbnRlcnByZXRzIHRoZSB1bmludGVycHJldGVkIG9wdGlvbnMgaW4gdGhlIHNwZWNpZmllZCBPcHRpb25zIG1lc3NhZ2UuCi0gICAgLy8gT24gZXJyb3IsIGNhbGxzIEFkZEVycm9yKCkgb24gdGhlIHVuZGVybHlpbmcgYnVpbGRlciBhbmQgcmV0dXJucyBmYWxzZS4KLSAgICAvLyBPdGhlcndpc2UgcmV0dXJucyB0cnVlLgotICAgIGJvb2wgSW50ZXJwcmV0T3B0aW9ucyhPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0KTsKLQotICAgIGNsYXNzIEFnZ3JlZ2F0ZU9wdGlvbkZpbmRlcjsKLQotICAgcHJpdmF0ZToKLSAgICAvLyBJbnRlcnByZXRzIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyBvbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UsIHdoaWNoCi0gICAgLy8gbXVzdCBiZSB0aGUgbXV0YWJsZSBjb3B5IG9mIHRoZSBvcmlnaW5hbCBvcHRpb25zIG1lc3NhZ2UgdG8gd2hpY2gKLSAgICAvLyB1bmludGVycHJldGVkX29wdGlvbl8gYmVsb25ncy4KLSAgICBib29sIEludGVycHJldFNpbmdsZU9wdGlvbihNZXNzYWdlKiBvcHRpb25zKTsKLQotICAgIC8vIEFkZHMgdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHRvIHRoZSBnaXZlbiBvcHRpb25zIG1lc3NhZ2UgdmVyYmF0aW0uCi0gICAgLy8gVXNlZCB3aGVuIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIGlzIGluIGVmZmVjdCBhbmQgd2UgY2FuJ3QgZmluZAotICAgIC8vIHRoZSBvcHRpb24ncyBkZWZpbml0aW9uLgotICAgIHZvaWQgQWRkV2l0aG91dEludGVycHJldGluZyhjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3B0aW9ucyk7Ci0KLSAgICAvLyBBIHJlY3Vyc2l2ZSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBkcmlsbHMgaW50byB0aGUgaW50ZXJtZWRpYXRlIGZpZWxkcwotICAgIC8vIGluIHVua25vd25fZmllbGRzIHRvIGNoZWNrIGlmIGZpZWxkIGlubmVybW9zdF9maWVsZCBpcyBzZXQgb24gdGhlCi0gICAgLy8gaW5uZXJtb3N0IG1lc3NhZ2UuIFJldHVybnMgZmFsc2UgYW5kIHNldHMgYW4gZXJyb3IgaWYgc28uCi0gICAgYm9vbCBFeGFtaW5lSWZPcHRpb25Jc1NldCgKLSAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+Ojpjb25zdF9pdGVyYXRvciBpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIsCi0gICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCi0gICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW5uZXJtb3N0X2ZpZWxkLCBjb25zdCBzdHJpbmcmIGRlYnVnX21zZ19uYW1lLAotICAgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKLQotICAgIC8vIFZhbGlkYXRlcyB0aGUgdmFsdWUgZm9yIHRoZSBvcHRpb24gZmllbGQgb2YgdGhlIGN1cnJlbnRseSBpbnRlcnByZXRlZAotICAgIC8vIG9wdGlvbiBhbmQgdGhlbiBzZXRzIGl0IG9uIHRoZSB1bmtub3duX2ZpZWxkLgotICAgIGJvb2wgU2V0T3B0aW9uVmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25fZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLQotICAgIC8vIFBhcnNlcyBhbiBhZ2dyZWdhdGUgdmFsdWUgZm9yIGEgQ1BQVFlQRV9NRVNTQUdFIG9wdGlvbiBhbmQKLSAgICAvLyBzYXZlcyBpdCBpbnRvICp1bmtub3duX2ZpZWxkcy4KLSAgICBib29sIFNldEFnZ3JlZ2F0ZU9wdGlvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIG9wdGlvbl9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLQotICAgIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9ucyB0byBzZXQgYW4gaW50IGZpZWxkIHRoZSByaWdodCB3YXksIGRlcGVuZGluZyBvbgotICAgIC8vIGl0cyB3aXJlIHR5cGUgKGEgc2luZ2xlIGludCBDcHBUeXBlIGNhbiByZXByZXNlbnQgbXVsdGlwbGUgd2lyZSB0eXBlcykuCi0gICAgdm9pZCBTZXRJbnQzMihpbnQgbnVtYmVyLCBpbnQzMiB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLSAgICB2b2lkIFNldEludDY0KGludCBudW1iZXIsIGludDY0IHZhbHVlLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOwotICAgIHZvaWQgU2V0VUludDMyKGludCBudW1iZXIsIHVpbnQzMiB2YWx1ZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7Ci0gICAgdm9pZCBTZXRVSW50NjQoaW50IG51bWJlciwgdWludDY0IHZhbHVlLCBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLQotICAgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIHRoYXQgYWRkcyBhbiBlcnJvciBhdCB0aGUgc3BlY2lmaWVkIGxvY2F0aW9uIG9mIHRoZQotICAgIC8vIG9wdGlvbiB3ZSdyZSBjdXJyZW50bHkgaW50ZXJwcmV0aW5nLCBhbmQgcmV0dXJucyBmYWxzZS4KLSAgICBib29sIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbXNnKSB7Ci0gICAgICBidWlsZGVyXy0+QWRkRXJyb3Iob3B0aW9uc190b19pbnRlcnByZXRfLT5lbGVtZW50X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgKnVuaW50ZXJwcmV0ZWRfb3B0aW9uXywgbG9jYXRpb24sIG1zZyk7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhZGRzIGFuIGVycm9yIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3B0aW9uIG5hbWUKLSAgICAvLyBhbmQgcmV0dXJucyBmYWxzZS4KLSAgICBib29sIEFkZE5hbWVFcnJvcihjb25zdCBzdHJpbmcmIG1zZykgewotICAgICAgcmV0dXJuIEFkZE9wdGlvbkVycm9yKERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1BUSU9OX05BTUUsIG1zZyk7Ci0gICAgfQotCi0gICAgLy8gQSBoZWxwZXIgZnVuY3Rpb24gdGhhdCBhZGRzIGFuIGVycm9yIGF0IHRoZSBsb2NhdGlvbiBvZiB0aGUgb3B0aW9uIG5hbWUKLSAgICAvLyBhbmQgcmV0dXJucyBmYWxzZS4KLSAgICBib29sIEFkZFZhbHVlRXJyb3IoY29uc3Qgc3RyaW5nJiBtc2cpIHsKLSAgICAgIHJldHVybiBBZGRPcHRpb25FcnJvcihEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9QVElPTl9WQUxVRSwgbXNnKTsKLSAgICB9Ci0KLSAgICAvLyBXZSBpbnRlcnByZXQgYWdhaW5zdCB0aGlzIGJ1aWxkZXIncyBwb29sLiBJcyBuZXZlciBOVUxMLiBXZSBkb24ndCBvd24KLSAgICAvLyB0aGlzIHBvaW50ZXIuCi0gICAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXJfOwotCi0gICAgLy8gVGhlIG9wdGlvbnMgd2UncmUgY3VycmVudGx5IGludGVycHJldGluZywgb3IgTlVMTCBpZiB3ZSdyZSBub3QgaW4gYSBjYWxsCi0gICAgLy8gdG8gSW50ZXJwcmV0T3B0aW9ucy4KLSAgICBjb25zdCBPcHRpb25zVG9JbnRlcnByZXQqIG9wdGlvbnNfdG9faW50ZXJwcmV0XzsKLQotICAgIC8vIFRoZSBvcHRpb24gd2UncmUgY3VycmVudGx5IGludGVycHJldGluZyB3aXRoaW4gb3B0aW9uc190b19pbnRlcnByZXRfLCBvcgotICAgIC8vIE5VTEwgaWYgd2UncmUgbm90IGluIGEgY2FsbCB0byBJbnRlcnByZXRPcHRpb25zKCkuIFRoaXMgcG9pbnRzIHRvIGEKLSAgICAvLyBzdWJtZXNzYWdlIG9mIHRoZSBvcmlnaW5hbCBvcHRpb24sIG5vdCB0aGUgbXV0YWJsZSBjb3B5LiBUaGVyZWZvcmUgd2UKLSAgICAvLyBjYW4gdXNlIGl0IHRvIGZpbmQgbG9jYXRpb25zIHJlY29yZGVkIGJ5IHRoZSBwYXJzZXIuCi0gICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb25fOwotCi0gICAgLy8gRmFjdG9yeSB1c2VkIHRvIGNyZWF0ZSB0aGUgZHluYW1pYyBtZXNzYWdlcyB3ZSBuZWVkIHRvIHBhcnNlCi0gICAgLy8gYW55IGFnZ3JlZ2F0ZSBvcHRpb24gdmFsdWVzIHdlIGVuY291bnRlci4KLSAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZHluYW1pY19mYWN0b3J5XzsKLQotICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPcHRpb25JbnRlcnByZXRlcik7Ci0gIH07Ci0KLSAgLy8gV29yay1hcm91bmQgZm9yIGJyb2tlbiBjb21waWxlcnM6ICBBY2NvcmRpbmcgdG8gdGhlIEMrKyBzdGFuZGFyZCwKLSAgLy8gT3B0aW9uSW50ZXJwcmV0ZXIgc2hvdWxkIGhhdmUgYWNjZXNzIHRvIHRoZSBwcml2YXRlIG1lbWJlcnMgb2YgYW55IGNsYXNzCi0gIC8vIHdoaWNoIGhhcyBkZWNsYXJlZCBEZXNjcmlwdG9yQnVpbGRlciBhcyBhIGZyaWVuZC4gIFVuZm9ydHVuYXRlbHkgc29tZSBvbGQKLSAgLy8gdmVyc2lvbnMgb2YgR0NDIGFuZCBvdGhlciBjb21waWxlcnMgZG8gbm90IGltcGxlbWVudCB0aGlzIGNvcnJlY3RseS4gIFNvLAotICAvLyB3ZSBoYXZlIHRvIGhhdmUgdGhlc2UgaW50ZXJtZWRpYXRlIG1ldGhvZHMgdG8gcHJvdmlkZSBhY2Nlc3MuICBXZSBhbHNvCi0gIC8vIHJlZHVuZGFudGx5IGRlY2xhcmUgT3B0aW9uSW50ZXJwcmV0ZXIgYSBmcmllbmQganVzdCB0byBtYWtlIHRoaW5ncyBleHRyYQotICAvLyBjbGVhciBmb3IgdGhlc2UgYmFkIGNvbXBpbGVycy4KLSAgZnJpZW5kIGNsYXNzIE9wdGlvbkludGVycHJldGVyOwotICBmcmllbmQgY2xhc3MgT3B0aW9uSW50ZXJwcmV0ZXI6OkFnZ3JlZ2F0ZU9wdGlvbkZpbmRlcjsKLQotICBzdGF0aWMgaW5saW5lIGJvb2wgZ2V0X2FsbG93X3Vua25vd24oY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKLSAgICByZXR1cm4gcG9vbC0+YWxsb3dfdW5rbm93bl87Ci0gIH0KLSAgc3RhdGljIGlubGluZSBib29sIGdldF9lbmZvcmNlX3dlYWsoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpIHsKLSAgICByZXR1cm4gcG9vbC0+ZW5mb3JjZV93ZWFrXzsKLSAgfQotICBzdGF0aWMgaW5saW5lIGJvb2wgZ2V0X2lzX3BsYWNlaG9sZGVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgICByZXR1cm4gZGVzY3JpcHRvci0+aXNfcGxhY2Vob2xkZXJfOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBhc3NlcnRfbXV0ZXhfaGVsZChjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCkgewotICAgIGlmIChwb29sLT5tdXRleF8gIT0gTlVMTCkgewotICAgICAgcG9vbC0+bXV0ZXhfLT5Bc3NlcnRIZWxkKCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gTXVzdCBiZSBydW4gb25seSBhZnRlciBvcHRpb25zIGhhdmUgYmVlbiBpbnRlcnByZXRlZC4KLSAgLy8KLSAgLy8gTk9URTogVmFsaWRhdGlvbiBjb2RlIG11c3Qgb25seSByZWZlcmVuY2UgdGhlIG9wdGlvbnMgaW4gdGhlIG11dGFibGUKLSAgLy8gZGVzY3JpcHRvcnMsIHdoaWNoIGFyZSB0aGUgb25lcyB0aGF0IGhhdmUgYmVlbiBpbnRlcnByZXRlZC4gVGhlIGNvbnN0Ci0gIC8vIHByb3RvIHJlZmVyZW5jZXMgYXJlIHBhc3NlZCBpbiBvbmx5IHNvIHRoZXkgY2FuIGJlIHByb3ZpZGVkIHRvIGNhbGxzIHRvCi0gIC8vIEFkZEVycm9yKCkuIERvIG5vdCBsb29rIGF0IHRoZWlyIG9wdGlvbnMsIHdoaWNoIGhhdmUgbm90IGJlZW4gaW50ZXJwcmV0ZWQuCi0gIHZvaWQgVmFsaWRhdGVGaWxlT3B0aW9ucyhGaWxlRGVzY3JpcHRvciogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLSAgdm9pZCBWYWxpZGF0ZU1lc3NhZ2VPcHRpb25zKERlc2NyaXB0b3IqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLSAgdm9pZCBWYWxpZGF0ZUZpZWxkT3B0aW9ucyhGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0gIHZvaWQgVmFsaWRhdGVFbnVtT3B0aW9ucyhFbnVtRGVzY3JpcHRvciogZW5tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pOwotICB2b2lkIFZhbGlkYXRlRW51bVZhbHVlT3B0aW9ucyhFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLSAgdm9pZCBWYWxpZGF0ZVNlcnZpY2VPcHRpb25zKFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOwotICB2b2lkIFZhbGlkYXRlTWV0aG9kT3B0aW9ucyhNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgcHJvdG8pOwotICB2b2lkIFZhbGlkYXRlUHJvdG8zKEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLSAgdm9pZCBWYWxpZGF0ZVByb3RvM01lc3NhZ2UoRGVzY3JpcHRvciogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0gIHZvaWQgVmFsaWRhdGVQcm90bzNGaWVsZChGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLSAgdm9pZCBWYWxpZGF0ZVByb3RvM0VudW0oRW51bURlc2NyaXB0b3IqIGVubSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pOwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGVudHJ5IG1lc3NhZ2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQotICAvLyBhdXRvLWdlbmVyYXRlZCBlbnRyeSBtZXNzYWdlIGZyb20gbWFwIGZpZWxkcyBzeW50YXguCi0gIGJvb2wgVmFsaWRhdGVNYXBFbnRyeShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKLQotICAvLyBSZWN1cnNpdmVseSBkZXRlY3RzIG5hbWluZyBjb25mbGljdHMgd2l0aCBtYXAgZW50cnkgdHlwZXMgZm9yIGEKLSAgLy8gYmV0dGVyIGVycm9yIG1lc3NhZ2UuCi0gIHZvaWQgRGV0ZWN0TWFwQ29uZmxpY3RzKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pOwotCi19OwotCi1jb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZSgKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBHT09HTEVfQ0hFQ0soZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpCi0gICAgPDwgIkNhbm5vdCBjYWxsIEJ1aWxkRmlsZSBvbiBhIERlc2NyaXB0b3JQb29sIHRoYXQgdXNlcyBhICIKLSAgICAgICAiRGVzY3JpcHRvckRhdGFiYXNlLiAgWW91IG11c3QgaW5zdGVhZCBmaW5kIGEgd2F5IHRvIGdldCB5b3VyIGZpbGUgIgotICAgICAgICJpbnRvIHRoZSB1bmRlcmx5aW5nIGRhdGFiYXNlLiI7Ci0gIEdPT0dMRV9DSEVDSyhtdXRleF8gPT0gTlVMTCk7ICAgLy8gSW1wbGllZCBieSB0aGUgYWJvdmUgR09PR0xFX0NIRUNLLgotICB0YWJsZXNfLT5rbm93bl9iYWRfc3ltYm9sc18uY2xlYXIoKTsKLSAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jbGVhcigpOwotICByZXR1cm4gRGVzY3JpcHRvckJ1aWxkZXIodGhpcywgdGFibGVzXy5nZXQoKSwgTlVMTCkuQnVpbGRGaWxlKHByb3RvKTsKLX0KLQotY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpCdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAotICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpIHsKLSAgR09PR0xFX0NIRUNLKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKQotICAgIDw8ICJDYW5ub3QgY2FsbCBCdWlsZEZpbGUgb24gYSBEZXNjcmlwdG9yUG9vbCB0aGF0IHVzZXMgYSAiCi0gICAgICAgIkRlc2NyaXB0b3JEYXRhYmFzZS4gIFlvdSBtdXN0IGluc3RlYWQgZmluZCBhIHdheSB0byBnZXQgeW91ciBmaWxlICIKLSAgICAgICAiaW50byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4iOwotICBHT09HTEVfQ0hFQ0sobXV0ZXhfID09IE5VTEwpOyAgIC8vIEltcGxpZWQgYnkgdGhlIGFib3ZlIEdPT0dMRV9DSEVDSy4KLSAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7Ci0gIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKLSAgcmV0dXJuIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2xsZWN0b3IpLkJ1aWxkRmlsZShwcm90byk7Ci19Ci0KLWNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlRnJvbURhdGFiYXNlKAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSBjb25zdCB7Ci0gIG11dGV4Xy0+QXNzZXJ0SGVsZCgpOwotICBpZiAodGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jb3VudChwcm90by5uYW1lKCkpID4gMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiByZXN1bHQgPQotICAgICAgRGVzY3JpcHRvckJ1aWxkZXIodGhpcywgdGFibGVzXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXykuQnVpbGRGaWxlKHByb3RvKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5pbnNlcnQocHJvdG8ubmFtZSgpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1EZXNjcmlwdG9yQnVpbGRlcjo6RGVzY3JpcHRvckJ1aWxkZXIoCi0gICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyogdGFibGVzLAotICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKQotICA6IHBvb2xfKHBvb2wpLAotICAgIHRhYmxlc18odGFibGVzKSwKLSAgICBlcnJvcl9jb2xsZWN0b3JfKGVycm9yX2NvbGxlY3RvciksCi0gICAgaGFkX2Vycm9yc18oZmFsc2UpLAotICAgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8oTlVMTCksCi0gICAgdW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV8oIiIpIHt9Ci0KLURlc2NyaXB0b3JCdWlsZGVyOjp+RGVzY3JpcHRvckJ1aWxkZXIoKSB7fQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRFcnJvcigKLSAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAotICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICBjb25zdCBzdHJpbmcmIGVycm9yKSB7Ci0gIGlmIChlcnJvcl9jb2xsZWN0b3JfID09IE5VTEwpIHsKLSAgICBpZiAoIWhhZF9lcnJvcnNfKSB7Ci0gICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBwcm90byBkZXNjcmlwdG9yIGZvciBmaWxlIFwiIiA8PCBmaWxlbmFtZV8KLSAgICAgICAgICAgICAgICAgPDwgIlwiOiI7Ci0gICAgfQotICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICIgICIgPDwgZWxlbWVudF9uYW1lIDw8ICI6ICIgPDwgZXJyb3I7Ci0gIH0gZWxzZSB7Ci0gICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoZmlsZW5hbWVfLCBlbGVtZW50X25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRlc2NyaXB0b3IsIGxvY2F0aW9uLCBlcnJvcik7Ci0gIH0KLSAgaGFkX2Vycm9yc18gPSB0cnVlOwotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRFcnJvcigKLSAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAotICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICBjb25zdCBjaGFyKiBlcnJvcikgewotICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLCBzdHJpbmcoZXJyb3IpKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkTm90RGVmaW5lZEVycm9yKAotICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCi0gICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAotICAgIGNvbnN0IHN0cmluZyYgdW5kZWZpbmVkX3N5bWJvbCkgewotICBpZiAocG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyA9PSBOVUxMICYmCi0gICAgICB1bmRlZmluZV9yZXNvbHZlZF9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgQWRkRXJyb3IoZWxlbWVudF9uYW1lLCBkZXNjcmlwdG9yLCBsb2NhdGlvbiwKLSAgICAgICAgICAgICAiXCIiICsgdW5kZWZpbmVkX3N5bWJvbCArICJcIiBpcyBub3QgZGVmaW5lZC4iKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAocG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyAhPSBOVUxMKSB7Ci0gICAgICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgIlwiIiArIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV9uYW1lXyArCi0gICAgICAgICAgICAgICAiXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcIiIgKwotICAgICAgICAgICAgICAgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5Xy0+bmFtZSgpICsgIlwiLCB3aGljaCBpcyBub3QgIgotICAgICAgICAgICAgICAgImltcG9ydGVkIGJ5IFwiIiArIGZpbGVuYW1lXyArICJcIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgIgotICAgICAgICAgICAgICAgImFkZCB0aGUgbmVjZXNzYXJ5IGltcG9ydC4iKTsKLSAgICB9Ci0gICAgaWYgKCF1bmRlZmluZV9yZXNvbHZlZF9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLAotICAgICAgICAgICAgICAgIlwiIiArIHVuZGVmaW5lZF9zeW1ib2wgKyAiXCIgaXMgcmVzb2x2ZWQgdG8gXCIiICsKLSAgICAgICAgICAgICAgIHVuZGVmaW5lX3Jlc29sdmVkX25hbWVfICsgIlwiLCB3aGljaCBpcyBub3QgZGVmaW5lZC4gIgotICAgICAgICAgICAgICAgIlRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgaW4gbmFtZSByZXNvbHV0aW9uLiAiCi0gICAgICAgICAgICAgICAiQ29uc2lkZXIgdXNpbmcgYSBsZWFkaW5nICcuJyhpLmUuLCBcIi4iCi0gICAgICAgICAgICAgICArIHVuZGVmaW5lZF9zeW1ib2wgKwotICAgICAgICAgICAgICAgIlwiKSB0byBzdGFydCBmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuIik7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZFdhcm5pbmcoCi0gICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCi0gICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAotICAgIGNvbnN0IHN0cmluZyYgZXJyb3IpIHsKLSAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gPT0gTlVMTCkgewotICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgZmlsZW5hbWVfIDw8ICIgIiA8PCBlbGVtZW50X25hbWUgPDwgIjogIiA8PCBlcnJvcjsKLSAgfSBlbHNlIHsKLSAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRXYXJuaW5nKGZpbGVuYW1lXywgZWxlbWVudF9uYW1lLCAmZGVzY3JpcHRvciwgbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcik7Ci0gIH0KLX0KLQotYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6SXNJblBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHBhY2thZ2VfbmFtZSkgewotICByZXR1cm4gSGFzUHJlZml4U3RyaW5nKGZpbGUtPnBhY2thZ2UoKSwgcGFja2FnZV9uYW1lKSAmJgotICAgICAgICAgICAoZmlsZS0+cGFja2FnZSgpLnNpemUoKSA9PSBwYWNrYWdlX25hbWUuc2l6ZSgpIHx8Ci0gICAgICAgICAgICBmaWxlLT5wYWNrYWdlKClbcGFja2FnZV9uYW1lLnNpemUoKV0gPT0gJy4nKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6UmVjb3JkUHVibGljRGVwZW5kZW5jaWVzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIGlmIChmaWxlID09IE5VTEwgfHwgIWRlcGVuZGVuY2llc18uaW5zZXJ0KGZpbGUpLnNlY29uZCkgcmV0dXJuOwotICBmb3IgKGludCBpID0gMDsgZmlsZSAhPSBOVUxMICYmIGkgPCBmaWxlLT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKLSAgICBSZWNvcmRQdWJsaWNEZXBlbmRlbmNpZXMoZmlsZS0+cHVibGljX2RlcGVuZGVuY3koaSkpOwotICB9Ci19Ci0KLVN5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHNIZWxwZXIoCi0gICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICAvLyBJZiB3ZSBhcmUgbG9va2luZyBhdCBhbiB1bmRlcmxheSwgd2UgbXVzdCBsb2NrIGl0cyBtdXRleF8sIHNpbmNlIHdlIGFyZQotICAvLyBhY2Nlc3NpbmcgdGhlIHVuZGVybGF5J3MgdGFibGVzXyBkaXJlY3RseS4KLSAgTXV0ZXhMb2NrTWF5YmUgbG9jaygocG9vbCA9PSBwb29sXykgPyBOVUxMIDogcG9vbC0+bXV0ZXhfKTsKLQotICBTeW1ib2wgcmVzdWx0ID0gcG9vbC0+dGFibGVzXy0+RmluZFN5bWJvbChuYW1lKTsKLSAgaWYgKHJlc3VsdC5Jc051bGwoKSAmJiBwb29sLT51bmRlcmxheV8gIT0gTlVMTCkgewotICAgIC8vIFN5bWJvbCBub3QgZm91bmQ7IGNoZWNrIHRoZSB1bmRlcmxheS4KLSAgICByZXN1bHQgPSBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwc0hlbHBlcihwb29sLT51bmRlcmxheV8sIG5hbWUpOwotICB9Ci0KLSAgaWYgKHJlc3VsdC5Jc051bGwoKSkgewotICAgIC8vIEluIHRoZW9yeSwgd2Ugc2hvdWxkbid0IG5lZWQgdG8gY2hlY2sgZmFsbGJhY2tfZGF0YWJhc2VfIGJlY2F1c2UgdGhlCi0gICAgLy8gc3ltYm9sIHNob3VsZCBiZSBpbiBvbmUgb2YgaXRzIGZpbGUncyBkaXJlY3QgZGVwZW5kZW5jaWVzLCBhbmQgd2UgaGF2ZQotICAgIC8vIGFscmVhZHkgbG9hZGVkIHRob3NlIGJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlLiAgQnV0IHdlIGNoZWNrIGFueXdheSBzbwotICAgIC8vIHRoYXQgd2UgY2FuIGdlbmVyYXRlIGJldHRlciBlcnJvciBtZXNzYWdlIHdoZW4gZGVwZW5kZW5jaWVzIGFyZSBtaXNzaW5nCi0gICAgLy8gKGkuZS4sICJtaXNzaW5nIGRlcGVuZGVuY3kiIHJhdGhlciB0aGFuICJ0eXBlIGlzIG5vdCBkZWZpbmVkIikuCi0gICAgaWYgKHBvb2wtPlRyeUZpbmRTeW1ib2xJbkZhbGxiYWNrRGF0YWJhc2UobmFtZSkpIHsKLSAgICAgIHJlc3VsdCA9IHBvb2wtPnRhYmxlc18tPkZpbmRTeW1ib2wobmFtZSk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotU3ltYm9sIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcyhjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgcmV0dXJuIEZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzSGVscGVyKHBvb2xfLCBuYW1lKTsKLX0KLQotU3ltYm9sIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sKGNvbnN0IHN0cmluZyYgbmFtZSkgewotICBTeW1ib2wgcmVzdWx0ID0gRmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHMobmFtZSk7Ci0KLSAgaWYgKHJlc3VsdC5Jc051bGwoKSkgcmV0dXJuIHJlc3VsdDsKLQotICBpZiAoIXBvb2xfLT5lbmZvcmNlX2RlcGVuZGVuY2llc18pIHsKLSAgICAvLyBIYWNrIGZvciBDb21waWxlclVwZ3JhZGVyLgotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBPbmx5IGZpbmQgc3ltYm9scyB3aGljaCB3ZXJlIGRlZmluZWQgaW4gdGhpcyBmaWxlIG9yIG9uZSBvZiBpdHMKLSAgLy8gZGVwZW5kZW5jaWVzLgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHJlc3VsdC5HZXRGaWxlKCk7Ci0gIGlmIChmaWxlID09IGZpbGVfIHx8IGRlcGVuZGVuY2llc18uY291bnQoZmlsZSkgPiAwKSB7Ci0gICAgdW51c2VkX2RlcGVuZGVuY3lfLmVyYXNlKGZpbGUpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpQQUNLQUdFKSB7Ci0gICAgLy8gQXJnLCB0aGlzIGlzIG92ZXJjb21wbGljYXRlZC4gIFRoZSBzeW1ib2wgaXMgYSBwYWNrYWdlIG5hbWUuICBJdCBjb3VsZAotICAgIC8vIGJlIHRoYXQgdGhlIHBhY2thZ2Ugd2FzIGRlZmluZWQgaW4gbXVsdGlwbGUgZmlsZXMuICByZXN1bHQuR2V0RmlsZSgpCi0gICAgLy8gcmV0dXJucyB0aGUgZmlyc3QgZmlsZSB3ZSBzYXcgdGhhdCB1c2VkIHRoaXMgcGFja2FnZS4gIFdlJ3ZlIGRldGVybWluZWQKLSAgICAvLyB0aGF0IHRoYXQgZmlsZSBpcyBub3QgYSBkaXJlY3QgZGVwZW5kZW5jeSBvZiB0aGUgZmlsZSB3ZSBhcmUgY3VycmVudGx5Ci0gICAgLy8gYnVpbGRpbmcsIGJ1dCBpdCBjb3VsZCBiZSB0aGF0IHNvbWUgb3RoZXIgZmlsZSB3aGljaCAqaXMqIGEgZGlyZWN0Ci0gICAgLy8gZGVwZW5kZW5jeSBhbHNvIGRlZmluZXMgdGhlIHNhbWUgcGFja2FnZS4gIFdlIGNhbid0IHJlYWxseSBydWxlIG91dCB0aGlzCi0gICAgLy8gc3ltYm9sIHVubGVzcyBub25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lIGl0LgotICAgIGlmIChJc0luUGFja2FnZShmaWxlXywgbmFtZSkpIHJldHVybiByZXN1bHQ7Ci0gICAgZm9yIChzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBkZXBlbmRlbmNpZXNfLmJlZ2luKCk7Ci0gICAgICAgICBpdCAhPSBkZXBlbmRlbmNpZXNfLmVuZCgpOyArK2l0KSB7Ci0gICAgICAvLyBOb3RlOiAgQSBkZXBlbmRlbmN5IG1heSBiZSBOVUxMIGlmIGl0IHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy4KLSAgICAgIGlmICgqaXQgIT0gTlVMTCAmJiBJc0luUGFja2FnZSgqaXQsIG5hbWUpKSByZXR1cm4gcmVzdWx0OwotICAgIH0KLSAgfQotCi0gIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gPSBmaWxlOwotICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gPSBuYW1lOwotICByZXR1cm4ga051bGxTeW1ib2w7Ci19Ci0KLVN5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6TG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcigKLSAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgcmVsYXRpdmVfdG8sIFJlc29sdmVNb2RlIHJlc29sdmVfbW9kZSkgewotICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfID0gTlVMTDsKLSAgdW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV8uY2xlYXIoKTsKLQotICBpZiAobmFtZS5zaXplKCkgPiAwICYmIG5hbWVbMF0gPT0gJy4nKSB7Ci0gICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUuCi0gICAgcmV0dXJuIEZpbmRTeW1ib2wobmFtZS5zdWJzdHIoMSkpOwotICB9Ci0KLSAgLy8gSWYgbmFtZSBpcyBzb21ldGhpbmcgbGlrZSAiRm9vLkJhci5iYXoiLCBhbmQgc3ltYm9scyBuYW1lZCAiRm9vIiBhcmUKLSAgLy8gZGVmaW5lZCBpbiBtdWx0aXBsZSBwYXJlbnQgc2NvcGVzLCB3ZSBvbmx5IHdhbnQgdG8gZmluZCAiQmFyLmJheiIgaW4gdGhlCi0gIC8vIGlubmVybW9zdCBvbmUuICBFLmcuLCB0aGUgZm9sbG93aW5nIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yOgotICAvLyAgIG1lc3NhZ2UgQmFyIHsgbWVzc2FnZSBCYXoge30gfQotICAvLyAgIG1lc3NhZ2UgRm9vIHsKLSAgLy8gICAgIG1lc3NhZ2UgQmFyIHsKLSAgLy8gICAgIH0KLSAgLy8gICAgIG9wdGlvbmFsIEJhci5CYXogYmF6ID0gMTsKLSAgLy8gICB9Ci0gIC8vIFNvLCB3ZSBsb29rIGZvciBqdXN0ICJGb28iIGZpcnN0LCB0aGVuIGxvb2sgZm9yICJCYXIuYmF6IiB3aXRoaW4gaXQgaWYKLSAgLy8gZm91bmQuCi0gIHN0cmluZzo6c2l6ZV90eXBlIG5hbWVfZG90X3BvcyA9IG5hbWUuZmluZF9maXJzdF9vZignLicpOwotICBzdHJpbmcgZmlyc3RfcGFydF9vZl9uYW1lOwotICBpZiAobmFtZV9kb3RfcG9zID09IHN0cmluZzo6bnBvcykgewotICAgIGZpcnN0X3BhcnRfb2ZfbmFtZSA9IG5hbWU7Ci0gIH0gZWxzZSB7Ci0gICAgZmlyc3RfcGFydF9vZl9uYW1lID0gbmFtZS5zdWJzdHIoMCwgbmFtZV9kb3RfcG9zKTsKLSAgfQotCi0gIHN0cmluZyBzY29wZV90b190cnkocmVsYXRpdmVfdG8pOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgLy8gQ2hvcCBvZmYgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBzY29wZS4KLSAgICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gc2NvcGVfdG9fdHJ5LmZpbmRfbGFzdF9vZignLicpOwotICAgIGlmIChkb3RfcG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgcmV0dXJuIEZpbmRTeW1ib2wobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNjb3BlX3RvX3RyeS5lcmFzZShkb3RfcG9zKTsKLSAgICB9Ci0KLSAgICAvLyBBcHBlbmQgIi5maXJzdF9wYXJ0X29mX25hbWUiIGFuZCB0cnkgdG8gZmluZC4KLSAgICBzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHNjb3BlX3RvX3RyeS5zaXplKCk7Ci0gICAgc2NvcGVfdG9fdHJ5LmFwcGVuZCgxLCAnLicpOwotICAgIHNjb3BlX3RvX3RyeS5hcHBlbmQoZmlyc3RfcGFydF9vZl9uYW1lKTsKLSAgICBTeW1ib2wgcmVzdWx0ID0gRmluZFN5bWJvbChzY29wZV90b190cnkpOwotICAgIGlmICghcmVzdWx0LklzTnVsbCgpKSB7Ci0gICAgICBpZiAoZmlyc3RfcGFydF9vZl9uYW1lLnNpemUoKSA8IG5hbWUuc2l6ZSgpKSB7Ci0gICAgICAgIC8vIG5hbWUgaXMgYSBjb21wb3VuZCBzeW1ib2wsIG9mIHdoaWNoIHdlIG9ubHkgZm91bmQgdGhlIGZpcnN0IHBhcnQuCi0gICAgICAgIC8vIE5vdyB0cnkgdG8gbG9vayB1cCB0aGUgcmVzdCBvZiBpdC4KLSAgICAgICAgaWYgKHJlc3VsdC5Jc0FnZ3JlZ2F0ZSgpKSB7Ci0gICAgICAgICAgc2NvcGVfdG9fdHJ5LmFwcGVuZChuYW1lLCBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZS5zaXplKCkgLSBmaXJzdF9wYXJ0X29mX25hbWUuc2l6ZSgpKTsKLSAgICAgICAgICByZXN1bHQgPSBGaW5kU3ltYm9sKHNjb3BlX3RvX3RyeSk7Ci0gICAgICAgICAgaWYgKHJlc3VsdC5Jc051bGwoKSkgewotICAgICAgICAgICAgdW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV8gPSBzY29wZV90b190cnk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gV2UgZm91bmQgYSBzeW1ib2wgYnV0IGl0J3Mgbm90IGFuIGFnZ3JlZ2F0ZS4gIENvbnRpbnVlIHRoZSBsb29wLgotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAocmVzb2x2ZV9tb2RlID09IExPT0tVUF9UWVBFUyAmJiAhcmVzdWx0LklzVHlwZSgpKSB7Ci0gICAgICAgICAgLy8gV2UgZm91bmQgYSBzeW1ib2wgYnV0IGl0J3Mgbm90IGEgdHlwZS4gIENvbnRpbnVlIHRoZSBsb29wLgotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBOb3QgZm91bmQuICBSZW1vdmUgdGhlIG5hbWUgc28gd2UgY2FuIHRyeSBhZ2Fpbi4KLSAgICBzY29wZV90b190cnkuZXJhc2Uob2xkX3NpemUpOwotICB9Ci19Ci0KLVN5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6TG9va3VwU3ltYm9sKAotICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiByZWxhdGl2ZV90bywKLSAgICBQbGFjZWhvbGRlclR5cGUgcGxhY2Vob2xkZXJfdHlwZSwgUmVzb2x2ZU1vZGUgcmVzb2x2ZV9tb2RlKSB7Ci0gIFN5bWJvbCByZXN1bHQgPSBMb29rdXBTeW1ib2xOb1BsYWNlaG9sZGVyKAotICAgICAgbmFtZSwgcmVsYXRpdmVfdG8sIHJlc29sdmVfbW9kZSk7Ci0gIGlmIChyZXN1bHQuSXNOdWxsKCkgJiYgcG9vbF8tPmFsbG93X3Vua25vd25fKSB7Ci0gICAgLy8gTm90IGZvdW5kLCBidXQgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaXMgZW5hYmxlZC4gIFJldHVybiBhCi0gICAgLy8gcGxhY2Vob2xkZXIgaW5zdGVhZC4KLSAgICByZXN1bHQgPSBOZXdQbGFjZWhvbGRlcihuYW1lLCBwbGFjZWhvbGRlcl90eXBlKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1TeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6Ok5ld1BsYWNlaG9sZGVyKGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGxhY2Vob2xkZXJUeXBlIHBsYWNlaG9sZGVyX3R5cGUpIHsKLSAgLy8gQ29tcHV0ZSBuYW1lcy4KLSAgY29uc3Qgc3RyaW5nKiBwbGFjZWhvbGRlcl9mdWxsX25hbWU7Ci0gIGNvbnN0IHN0cmluZyogcGxhY2Vob2xkZXJfbmFtZTsKLSAgY29uc3Qgc3RyaW5nKiBwbGFjZWhvbGRlcl9wYWNrYWdlOwotCi0gIGlmICghVmFsaWRhdGVRdWFsaWZpZWROYW1lKG5hbWUpKSByZXR1cm4ga051bGxTeW1ib2w7Ci0gIGlmIChuYW1lWzBdID09ICcuJykgewotICAgIC8vIEZ1bGx5LXF1YWxpZmllZC4KLSAgICBwbGFjZWhvbGRlcl9mdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhuYW1lLnN1YnN0cigxKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcGxhY2Vob2xkZXJfZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcobmFtZSk7Ci0gIH0KLQotICBzdHJpbmc6OnNpemVfdHlwZSBkb3Rwb3MgPSBwbGFjZWhvbGRlcl9mdWxsX25hbWUtPmZpbmRfbGFzdF9vZignLicpOwotICBpZiAoZG90cG9zICE9IHN0cmluZzo6bnBvcykgewotICAgIHBsYWNlaG9sZGVyX3BhY2thZ2UgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZygKLSAgICAgIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZS0+c3Vic3RyKDAsIGRvdHBvcykpOwotICAgIHBsYWNlaG9sZGVyX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZygKLSAgICAgIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZS0+c3Vic3RyKGRvdHBvcyArIDEpKTsKLSAgfSBlbHNlIHsKLSAgICBwbGFjZWhvbGRlcl9wYWNrYWdlID0gJmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICAgIHBsYWNlaG9sZGVyX25hbWUgPSBwbGFjZWhvbGRlcl9mdWxsX25hbWU7Ci0gIH0KLQotICAvLyBDcmVhdGUgdGhlIHBsYWNlaG9sZGVycy4KLSAgRmlsZURlc2NyaXB0b3IqIHBsYWNlaG9sZGVyX2ZpbGUgPSBOZXdQbGFjZWhvbGRlckZpbGUoCi0gICAgICAqcGxhY2Vob2xkZXJfZnVsbF9uYW1lICsgIi5wbGFjZWhvbGRlci5wcm90byIpOwotICBwbGFjZWhvbGRlcl9maWxlLT5wYWNrYWdlXyA9IHBsYWNlaG9sZGVyX3BhY2thZ2U7Ci0KLSAgaWYgKHBsYWNlaG9sZGVyX3R5cGUgPT0gUExBQ0VIT0xERVJfRU5VTSkgewotICAgIHBsYWNlaG9sZGVyX2ZpbGUtPmVudW1fdHlwZV9jb3VudF8gPSAxOwotICAgIHBsYWNlaG9sZGVyX2ZpbGUtPmVudW1fdHlwZXNfID0KLSAgICAgIHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8RW51bURlc2NyaXB0b3I+KDEpOwotCi0gICAgRW51bURlc2NyaXB0b3IqIHBsYWNlaG9sZGVyX2VudW0gPSAmcGxhY2Vob2xkZXJfZmlsZS0+ZW51bV90eXBlc19bMF07Ci0gICAgbWVtc2V0KHBsYWNlaG9sZGVyX2VudW0sIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfZW51bSkpOwotCi0gICAgcGxhY2Vob2xkZXJfZW51bS0+ZnVsbF9uYW1lXyA9IHBsYWNlaG9sZGVyX2Z1bGxfbmFtZTsKLSAgICBwbGFjZWhvbGRlcl9lbnVtLT5uYW1lXyA9IHBsYWNlaG9sZGVyX25hbWU7Ci0gICAgcGxhY2Vob2xkZXJfZW51bS0+ZmlsZV8gPSBwbGFjZWhvbGRlcl9maWxlOwotICAgIHBsYWNlaG9sZGVyX2VudW0tPm9wdGlvbnNfID0gJkVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0gICAgcGxhY2Vob2xkZXJfZW51bS0+aXNfcGxhY2Vob2xkZXJfID0gdHJ1ZTsKLSAgICBwbGFjZWhvbGRlcl9lbnVtLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSAobmFtZVswXSAhPSAnLicpOwotCi0gICAgLy8gRW51bXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZS4KLSAgICBwbGFjZWhvbGRlcl9lbnVtLT52YWx1ZV9jb3VudF8gPSAxOwotICAgIHBsYWNlaG9sZGVyX2VudW0tPnZhbHVlc18gPSB0YWJsZXNfLT5BbGxvY2F0ZUFycmF5PEVudW1WYWx1ZURlc2NyaXB0b3I+KDEpOwotCi0gICAgRW51bVZhbHVlRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfdmFsdWUgPSAmcGxhY2Vob2xkZXJfZW51bS0+dmFsdWVzX1swXTsKLSAgICBtZW1zZXQocGxhY2Vob2xkZXJfdmFsdWUsIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfdmFsdWUpKTsKLQotICAgIHBsYWNlaG9sZGVyX3ZhbHVlLT5uYW1lXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCJQTEFDRUhPTERFUl9WQUxVRSIpOwotICAgIC8vIE5vdGUgdGhhdCBlbnVtIHZhbHVlIG5hbWVzIGFyZSBzaWJsaW5ncyBvZiB0aGVpciB0eXBlLCBub3QgY2hpbGRyZW4uCi0gICAgcGxhY2Vob2xkZXJfdmFsdWUtPmZ1bGxfbmFtZV8gPQotICAgICAgcGxhY2Vob2xkZXJfcGFja2FnZS0+ZW1wdHkoKSA/IHBsYWNlaG9sZGVyX3ZhbHVlLT5uYW1lXyA6Ci0gICAgICAgIHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCpwbGFjZWhvbGRlcl9wYWNrYWdlICsgIi5QTEFDRUhPTERFUl9WQUxVRSIpOwotCi0gICAgcGxhY2Vob2xkZXJfdmFsdWUtPm51bWJlcl8gPSAwOwotICAgIHBsYWNlaG9sZGVyX3ZhbHVlLT50eXBlXyA9IHBsYWNlaG9sZGVyX2VudW07Ci0gICAgcGxhY2Vob2xkZXJfdmFsdWUtPm9wdGlvbnNfID0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICAgIHJldHVybiBTeW1ib2wocGxhY2Vob2xkZXJfZW51bSk7Ci0gIH0gZWxzZSB7Ci0gICAgcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50XyA9IDE7Ci0gICAgcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlc18gPQotICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxEZXNjcmlwdG9yPigxKTsKLQotICAgIERlc2NyaXB0b3IqIHBsYWNlaG9sZGVyX21lc3NhZ2UgPSAmcGxhY2Vob2xkZXJfZmlsZS0+bWVzc2FnZV90eXBlc19bMF07Ci0gICAgbWVtc2V0KHBsYWNlaG9sZGVyX21lc3NhZ2UsIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfbWVzc2FnZSkpOwotCi0gICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZnVsbF9uYW1lXyA9IHBsYWNlaG9sZGVyX2Z1bGxfbmFtZTsKLSAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5uYW1lXyA9IHBsYWNlaG9sZGVyX25hbWU7Ci0gICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+ZmlsZV8gPSBwbGFjZWhvbGRlcl9maWxlOwotICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPm9wdGlvbnNfID0gJk1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0gICAgcGxhY2Vob2xkZXJfbWVzc2FnZS0+aXNfcGxhY2Vob2xkZXJfID0gdHJ1ZTsKLSAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSAobmFtZVswXSAhPSAnLicpOwotCi0gICAgaWYgKHBsYWNlaG9sZGVyX3R5cGUgPT0gUExBQ0VIT0xERVJfRVhURU5EQUJMRV9NRVNTQUdFKSB7Ci0gICAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VfY291bnRfID0gMTsKLSAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZXNfID0KLSAgICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZT4oMSk7Ci0gICAgICBwbGFjZWhvbGRlcl9tZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VzXy0+c3RhcnQgPSAxOwotICAgICAgLy8ga01heE51bWJlciArIDEgYmVjYXVzZSBFeHRlbnNpb25SYW5nZTo6ZW5kIGlzIGV4Y2x1c2l2ZS4KLSAgICAgIHBsYWNlaG9sZGVyX21lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZXNfLT5lbmQgPQotICAgICAgICBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIgKyAxOwotICAgIH0KLQotICAgIHJldHVybiBTeW1ib2wocGxhY2Vob2xkZXJfbWVzc2FnZSk7Ci0gIH0KLX0KLQotRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JCdWlsZGVyOjpOZXdQbGFjZWhvbGRlckZpbGUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIEZpbGVEZXNjcmlwdG9yKiBwbGFjZWhvbGRlciA9IHRhYmxlc18tPkFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpOwotICBtZW1zZXQocGxhY2Vob2xkZXIsIDAsIHNpemVvZigqcGxhY2Vob2xkZXIpKTsKLQotICBwbGFjZWhvbGRlci0+bmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhuYW1lKTsKLSAgcGxhY2Vob2xkZXItPnBhY2thZ2VfID0gJmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBwbGFjZWhvbGRlci0+cG9vbF8gPSBwb29sXzsKLSAgcGxhY2Vob2xkZXItPm9wdGlvbnNfID0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIHBsYWNlaG9sZGVyLT50YWJsZXNfID0gJkZpbGVEZXNjcmlwdG9yVGFibGVzOjpHZXRFbXB0eUluc3RhbmNlKCk7Ci0gIHBsYWNlaG9sZGVyLT5zb3VyY2VfY29kZV9pbmZvXyA9ICZTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpOwotICBwbGFjZWhvbGRlci0+aXNfcGxhY2Vob2xkZXJfID0gdHJ1ZTsKLSAgcGxhY2Vob2xkZXItPnN5bnRheF8gPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMjsKLSAgLy8gQWxsIG90aGVyIGZpZWxkcyBhcmUgemVybyBvciBOVUxMLgotCi0gIHJldHVybiBwbGFjZWhvbGRlcjsKLX0KLQotYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkU3ltYm9sKAotICAgIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lLCBjb25zdCB2b2lkKiBwYXJlbnQsIGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICBjb25zdCBNZXNzYWdlJiBwcm90bywgU3ltYm9sIHN5bWJvbCkgewotICAvLyBJZiB0aGUgY2FsbGVyIHBhc3NlZCBOVUxMIGZvciB0aGUgcGFyZW50LCB0aGUgc3ltYm9sIGlzIGF0IGZpbGUgc2NvcGUuCi0gIC8vIFVzZSBpdHMgZmlsZSBhcyB0aGUgcGFyZW50IGluc3RlYWQuCi0gIGlmIChwYXJlbnQgPT0gTlVMTCkgcGFyZW50ID0gZmlsZV87Ci0KLSAgaWYgKHRhYmxlc18tPkFkZFN5bWJvbChmdWxsX25hbWUsIHN5bWJvbCkpIHsKLSAgICBpZiAoIWZpbGVfdGFibGVzXy0+QWRkQWxpYXNVbmRlclBhcmVudChwYXJlbnQsIG5hbWUsIHN5bWJvbCkpIHsKLSAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiXCIiIDw8IGZ1bGxfbmFtZSA8PCAiXCIgbm90IHByZXZpb3VzbHkgZGVmaW5lZCBpbiAiCi0gICAgICAgICAgICAgICAgICAgICAic3ltYm9sc19ieV9uYW1lXywgYnV0IHdhcyBkZWZpbmVkIGluIHN5bWJvbHNfYnlfcGFyZW50XzsgIgotICAgICAgICAgICAgICAgICAgICAgInRoaXMgc2hvdWxkbid0IGJlIHBvc3NpYmxlLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBvdGhlcl9maWxlID0gdGFibGVzXy0+RmluZFN5bWJvbChmdWxsX25hbWUpLkdldEZpbGUoKTsKLSAgICBpZiAob3RoZXJfZmlsZSA9PSBmaWxlXykgewotICAgICAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IGZ1bGxfbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKLSAgICAgIGlmIChkb3RfcG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgICBBZGRFcnJvcihmdWxsX25hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCi0gICAgICAgICAgICAgICAgICJcIiIgKyBmdWxsX25hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkLiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQWRkRXJyb3IoZnVsbF9uYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAotICAgICAgICAgICAgICAgICAiXCIiICsgZnVsbF9uYW1lLnN1YnN0cihkb3RfcG9zICsgMSkgKwotICAgICAgICAgICAgICAgICAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwiIiArCi0gICAgICAgICAgICAgICAgIGZ1bGxfbmFtZS5zdWJzdHIoMCwgZG90X3BvcykgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFN5bWJvbCBzZWVtcyB0byBoYXZlIGJlZW4gZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBmaWxlLgotICAgICAgQWRkRXJyb3IoZnVsbF9uYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAotICAgICAgICAgICAgICAgIlwiIiArIGZ1bGxfbmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gZmlsZSBcIiIgKwotICAgICAgICAgICAgICAgb3RoZXJfZmlsZS0+bmFtZSgpICsgIlwiLiIpOwotICAgIH0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkUGFja2FnZSgKLSAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IE1lc3NhZ2UmIHByb3RvLCBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgewotICBpZiAodGFibGVzXy0+QWRkU3ltYm9sKG5hbWUsIFN5bWJvbChmaWxlKSkpIHsKLSAgICAvLyBTdWNjZXNzLiAgQWxzbyBhZGQgcGFyZW50IHBhY2thZ2UsIGlmIGFueS4KLSAgICBzdHJpbmc6OnNpemVfdHlwZSBkb3RfcG9zID0gbmFtZS5maW5kX2xhc3Rfb2YoJy4nKTsKLSAgICBpZiAoZG90X3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIC8vIE5vIHBhcmVudHMuCi0gICAgICBWYWxpZGF0ZVN5bWJvbE5hbWUobmFtZSwgbmFtZSwgcHJvdG8pOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBIYXMgcGFyZW50LgotICAgICAgc3RyaW5nKiBwYXJlbnRfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKG5hbWUuc3Vic3RyKDAsIGRvdF9wb3MpKTsKLSAgICAgIEFkZFBhY2thZ2UoKnBhcmVudF9uYW1lLCBwcm90bywgZmlsZSk7Ci0gICAgICBWYWxpZGF0ZVN5bWJvbE5hbWUobmFtZS5zdWJzdHIoZG90X3BvcyArIDEpLCBuYW1lLCBwcm90byk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIFN5bWJvbCBleGlzdGluZ19zeW1ib2wgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKG5hbWUpOwotICAgIC8vIEl0J3MgT0sgdG8gcmVkZWZpbmUgYSBwYWNrYWdlLgotICAgIGlmIChleGlzdGluZ19zeW1ib2wudHlwZSAhPSBTeW1ib2w6OlBBQ0tBR0UpIHsKLSAgICAgIC8vIFN5bWJvbCBzZWVtcyB0byBoYXZlIGJlZW4gZGVmaW5lZCBpbiBhIGRpZmZlcmVudCBmaWxlLgotICAgICAgQWRkRXJyb3IobmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKLSAgICAgICAgICAgICAgICJcIiIgKyBuYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZCAoYXMgc29tZXRoaW5nIG90aGVyIHRoYW4gIgotICAgICAgICAgICAgICAgImEgcGFja2FnZSkgaW4gZmlsZSBcIiIgKyBleGlzdGluZ19zeW1ib2wuR2V0RmlsZSgpLT5uYW1lKCkgKwotICAgICAgICAgICAgICAgIlwiLiIpOwotICAgIH0KLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVN5bWJvbE5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwgY29uc3QgTWVzc2FnZSYgcHJvdG8pIHsKLSAgaWYgKG5hbWUuZW1wdHkoKSkgewotICAgIEFkZEVycm9yKGZ1bGxfbmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKLSAgICAgICAgICAgICAiTWlzc2luZyBuYW1lLiIpOwotICB9IGVsc2UgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7IGkrKykgewotICAgICAgLy8gSSBkb24ndCB0cnVzdCBpc2FsbnVtKCkgZHVlIHRvIGxvY2FsZXMuICA6KAotICAgICAgaWYgKChuYW1lW2ldIDwgJ2EnIHx8ICd6JyA8IG5hbWVbaV0pICYmCi0gICAgICAgICAgKG5hbWVbaV0gPCAnQScgfHwgJ1onIDwgbmFtZVtpXSkgJiYKLSAgICAgICAgICAobmFtZVtpXSA8ICcwJyB8fCAnOScgPCBuYW1lW2ldKSAmJgotICAgICAgICAgIChuYW1lW2ldICE9ICdfJykpIHsKLSAgICAgICAgQWRkRXJyb3IoZnVsbF9uYW1lLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAotICAgICAgICAgICAgICAgICAiXCIiICsgbmFtZSArICJcIiBpcyBub3QgYSB2YWxpZCBpZGVudGlmaWVyLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1ib29sIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVF1YWxpZmllZE5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIGJvb2wgbGFzdF93YXNfcGVyaW9kID0gZmFsc2U7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgaSsrKSB7Ci0gICAgLy8gSSBkb24ndCB0cnVzdCBpc2FsbnVtKCkgZHVlIHRvIGxvY2FsZXMuICA6KAotICAgIGlmICgoJ2EnIDw9IG5hbWVbaV0gJiYgbmFtZVtpXSA8PSAneicpIHx8Ci0gICAgICAgICgnQScgPD0gbmFtZVtpXSAmJiBuYW1lW2ldIDw9ICdaJykgfHwKLSAgICAgICAgKCcwJyA8PSBuYW1lW2ldICYmIG5hbWVbaV0gPD0gJzknKSB8fAotICAgICAgICAobmFtZVtpXSA9PSAnXycpKSB7Ci0gICAgICBsYXN0X3dhc19wZXJpb2QgPSBmYWxzZTsKLSAgICB9IGVsc2UgaWYgKG5hbWVbaV0gPT0gJy4nKSB7Ci0gICAgICBpZiAobGFzdF93YXNfcGVyaW9kKSByZXR1cm4gZmFsc2U7Ci0gICAgICBsYXN0X3dhc19wZXJpb2QgPSB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuICFuYW1lLmVtcHR5KCkgJiYgIWxhc3Rfd2FzX3BlcmlvZDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUaGlzIGdlbmVyaWMgaW1wbGVtZW50YXRpb24gaXMgZ29vZCBmb3IgYWxsIGRlc2NyaXB0b3JzIGV4Y2VwdAotLy8gRmlsZURlc2NyaXB0b3IuCi10ZW1wbGF0ZTxjbGFzcyBEZXNjcmlwdG9yVD4gdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWxsb2NhdGVPcHRpb25zKAotICAgIGNvbnN0IHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSYgb3JpZ19vcHRpb25zLAotICAgIERlc2NyaXB0b3JUKiBkZXNjcmlwdG9yKSB7Ci0gIEFsbG9jYXRlT3B0aW9uc0ltcGwoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgIG9yaWdfb3B0aW9ucywgZGVzY3JpcHRvcik7Ci19Ci0KLS8vIFdlIHNwZWNpYWxpemUgZm9yIEZpbGVEZXNjcmlwdG9yLgotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWxsb2NhdGVPcHRpb25zKGNvbnN0IEZpbGVPcHRpb25zJiBvcmlnX29wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgLy8gV2UgYWRkIHRoZSBkdW1teSB0b2tlbiBzbyB0aGF0IExvb2t1cFN5bWJvbCBkb2VzIHRoZSByaWdodCB0aGluZy4KLSAgQWxsb2NhdGVPcHRpb25zSW1wbChkZXNjcmlwdG9yLT5wYWNrYWdlKCkgKyAiLmR1bW15IiwgZGVzY3JpcHRvci0+bmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgIG9yaWdfb3B0aW9ucywgZGVzY3JpcHRvcik7Ci19Ci0KLXRlbXBsYXRlPGNsYXNzIERlc2NyaXB0b3JUPiB2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBbGxvY2F0ZU9wdGlvbnNJbXBsKAotICAgIGNvbnN0IHN0cmluZyYgbmFtZV9zY29wZSwKLSAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKLSAgICBjb25zdCB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUmIG9yaWdfb3B0aW9ucywKLSAgICBEZXNjcmlwdG9yVCogZGVzY3JpcHRvcikgewotICAvLyBXZSBuZWVkIHRvIHVzZSBhIGR1bW15IHBvaW50ZXIgdG8gd29yayBhcm91bmQgYSBidWcgaW4gb2xkZXIgdmVyc2lvbnMgb2YKLSAgLy8gR0NDLiAgT3RoZXJ3aXNlLCB0aGUgZm9sbG93aW5nIHR3byBsaW5lcyBjb3VsZCBiZSByZXBsYWNlZCB3aXRoOgotICAvLyAgIHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSogb3B0aW9ucyA9Ci0gIC8vICAgICAgIHRhYmxlc18tPkFsbG9jYXRlTWVzc2FnZTx0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGU+KCk7Ci0gIHR5cGVuYW1lIERlc2NyaXB0b3JUOjpPcHRpb25zVHlwZSogY29uc3QgZHVtbXkgPSBOVUxMOwotICB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUqIG9wdGlvbnMgPSB0YWJsZXNfLT5BbGxvY2F0ZU1lc3NhZ2UoZHVtbXkpOwotICAvLyBBdm9pZCB1c2luZyBNZXJnZUZyb20oKS9Db3B5RnJvbSgpIGluIHRoaXMgY2xhc3MgdG8gbWFrZSBpdCAtZm5vLXJ0dGkKLSAgLy8gZnJpZW5kbHkuIFdpdGhvdXQgUlRUSSwgTWVyZ2VGcm9tKCkgYW5kIENvcHlGcm9tKCkgd2lsbCBmYWxsYmFjayB0byB0aGUKLSAgLy8gcmVmbGVjdGlvbiBiYXNlZCBtZXRob2QsIHdoaWNoIHJlcXVpcmVzIHRoZSBEZXNjcmlwdG9yLiBIb3dldmVyLCB3ZSBhcmUgaW4KLSAgLy8gdGhlIG1pZGRsZSBvZiBidWlsZGluZyB0aGUgZGVzY3JpcHRvcnMsIHRodXMgdGhlIGRlYWRsb2NrLgotICBvcHRpb25zLT5QYXJzZUZyb21TdHJpbmcob3JpZ19vcHRpb25zLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOwotICBkZXNjcmlwdG9yLT5vcHRpb25zXyA9IG9wdGlvbnM7Ci0KLSAgLy8gRG9uJ3QgYWRkIHRvIG9wdGlvbnNfdG9faW50ZXJwcmV0XyB1bmxlc3MgdGhlcmUgd2VyZSB1bmludGVycHJldGVkCi0gIC8vIG9wdGlvbnMuICBUaGlzIG5vdCBvbmx5IGF2b2lkcyB1bm5lY2Vzc2FyeSB3b3JrLCBidXQgcHJldmVudHMgYQotICAvLyBib290c3RyYXBwaW5nIHByb2JsZW0gd2hlbiBidWlsZGluZyBkZXNjcmlwdG9ycyBmb3IgZGVzY3JpcHRvci5wcm90by4KLSAgLy8gZGVzY3JpcHRvci5wcm90byBkb2VzIG5vdCBjb250YWluIGFueSB1bmludGVycHJldGVkIG9wdGlvbnMsIGJ1dAotICAvLyBhdHRlbXB0aW5nIHRvIGludGVycHJldCBvcHRpb25zIGFueXdheSB3aWxsIGNhdXNlCi0gIC8vIE9wdGlvbnNUeXBlOjpHZXREZXNjcmlwdG9yKCkgdG8gYmUgY2FsbGVkIHdoaWNoIG1heSB0aGVuIGRlYWRsb2NrIHNpbmNlCi0gIC8vIHdlJ3JlIHN0aWxsIHRyeWluZyB0byBidWlsZCBpdC4KLSAgaWYgKG9wdGlvbnMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSA+IDApIHsKLSAgICBvcHRpb25zX3RvX2ludGVycHJldF8ucHVzaF9iYWNrKAotICAgICAgICBPcHRpb25zVG9JbnRlcnByZXQobmFtZV9zY29wZSwgZWxlbWVudF9uYW1lLCAmb3JpZ19vcHRpb25zLCBvcHRpb25zKSk7Ci0gIH0KLX0KLQotCi0vLyBBIGNvbW1vbiBwYXR0ZXJuOiAgV2Ugd2FudCB0byBjb252ZXJ0IGEgcmVwZWF0ZWQgZmllbGQgaW4gdGhlIGRlc2NyaXB0b3IKLS8vIHRvIGFuIGFycmF5IG9mIHZhbHVlcywgY2FsbGluZyBzb21lIG1ldGhvZCB0byBidWlsZCBlYWNoIHZhbHVlLgotI2RlZmluZSBCVUlMRF9BUlJBWShJTlBVVCwgT1VUUFVULCBOQU1FLCBNRVRIT0QsIFBBUkVOVCkgICAgICAgICAgICAgXAotICBPVVRQVVQtPk5BTUUjI19jb3VudF8gPSBJTlBVVC5OQU1FIyNfc2l6ZSgpOyAgICAgICAgICAgICAgICAgICAgICAgXAotICBBbGxvY2F0ZUFycmF5KElOUFVULk5BTUUjI19zaXplKCksICZPVVRQVVQtPk5BTUUjI3NfKTsgICAgICAgICAgICAgXAotICBmb3IgKGludCBpID0gMDsgaSA8IElOUFVULk5BTUUjI19zaXplKCk7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgXAotICAgIE1FVEhPRChJTlBVVC5OQU1FKGkpLCBQQVJFTlQsIE9VVFBVVC0+TkFNRSMjc18gKyBpKTsgICAgICAgICAgICAgXAotICB9Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkFkZFJlY3Vyc2l2ZUltcG9ydEVycm9yKAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLCBpbnQgZnJvbV9oZXJlKSB7Ci0gIHN0cmluZyBlcnJvcl9tZXNzYWdlKCJGaWxlIHJlY3Vyc2l2ZWx5IGltcG9ydHMgaXRzZWxmOiAiKTsKLSAgZm9yIChpbnQgaSA9IGZyb21faGVyZTsgaSA8IHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgZXJyb3JfbWVzc2FnZS5hcHBlbmQodGFibGVzXy0+cGVuZGluZ19maWxlc19baV0pOwotICAgIGVycm9yX21lc3NhZ2UuYXBwZW5kKCIgLT4gIik7Ci0gIH0KLSAgZXJyb3JfbWVzc2FnZS5hcHBlbmQocHJvdG8ubmFtZSgpKTsKLQotICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAotICAgICAgICAgICBlcnJvcl9tZXNzYWdlKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkVHdpY2VMaXN0ZWRFcnJvcihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7Ci0gIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICJJbXBvcnQgXCIiICsgcHJvdG8uZGVwZW5kZW5jeShpbmRleCkgKyAiXCIgd2FzIGxpc3RlZCB0d2ljZS4iKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkSW1wb3J0RXJyb3IoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKLSAgc3RyaW5nIG1lc3NhZ2U7Ci0gIGlmIChwb29sXy0+ZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpIHsKLSAgICBtZXNzYWdlID0gIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGluZGV4KSArCi0gICAgICAgICAgICAgICJcIiBoYXMgbm90IGJlZW4gbG9hZGVkLiI7Ci0gIH0gZWxzZSB7Ci0gICAgbWVzc2FnZSA9ICJJbXBvcnQgXCIiICsgcHJvdG8uZGVwZW5kZW5jeShpbmRleCkgKwotICAgICAgICAgICAgICAiXCIgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLiI7Ci0gIH0KLSAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwgbWVzc2FnZSk7Ci19Ci0KLXN0YXRpYyBib29sIEV4aXN0aW5nRmlsZU1hdGNoZXNQcm90byhjb25zdCBGaWxlRGVzY3JpcHRvciogZXhpc3RpbmdfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGV4aXN0aW5nX3Byb3RvOwotICBleGlzdGluZ19maWxlLT5Db3B5VG8oJmV4aXN0aW5nX3Byb3RvKTsKLSAgLy8gVE9ETyhsaXVqaXNpKTogUmVtb3ZlIGl0IHdoZW4gQ29weVRvIHN1cHBvcnRzIGNvcHlpbmcgc3ludGF4IHBhcmFtcyB3aGVuCi0gIC8vIHN5bnRheD0icHJvdG8yIi4KLSAgaWYgKGV4aXN0aW5nX2ZpbGUtPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yICYmCi0gICAgICBwcm90by5oYXNfc3ludGF4KCkpIHsKLSAgICBleGlzdGluZ19wcm90by5zZXRfc3ludGF4KAotICAgICAgICBleGlzdGluZ19maWxlLT5TeW50YXhOYW1lKGV4aXN0aW5nX2ZpbGUtPnN5bnRheCgpKSk7Ci0gIH0KLQotICByZXR1cm4gZXhpc3RpbmdfcHJvdG8uU2VyaWFsaXplQXNTdHJpbmcoKSA9PSBwcm90by5TZXJpYWxpemVBc1N0cmluZygpOwotfQotCi1jb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRmlsZSgKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBmaWxlbmFtZV8gPSBwcm90by5uYW1lKCk7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhlIGZpbGUgYWxyZWFkeSBleGlzdHMgYW5kIGlzIGlkZW50aWNhbCB0byB0aGUgb25lIGJlaW5nIGJ1aWx0LgotICAvLyBOb3RlOiAgVGhpcyBvbmx5IHdvcmtzIGlmIHRoZSBpbnB1dCBpcyBjYW5vbmljYWwgLS0gdGhhdCBpcywgaXQKLSAgLy8gICBmdWxseS1xdWFsaWZpZXMgYWxsIHR5cGUgbmFtZXMsIGhhcyBubyBVbmludGVycHJldGVkT3B0aW9ucywgZXRjLgotICAvLyAgIFRoaXMgaXMgZmluZSwgYmVjYXVzZSB0aGlzIGlkZW1wb3RlbmN5ICJmZWF0dXJlIiByZWFsbHkgb25seSBleGlzdHMgdG8KLSAgLy8gICBhY2NvbW1vZGF0ZSBvbmUgaGFjayBpbiB0aGUgcHJvdG8xLT5wcm90bzIgbWlncmF0aW9uIGxheWVyLgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZXhpc3RpbmdfZmlsZSA9IHRhYmxlc18tPkZpbmRGaWxlKGZpbGVuYW1lXyk7Ci0gIGlmIChleGlzdGluZ19maWxlICE9IE5VTEwpIHsKLSAgICAvLyBGaWxlIGFscmVhZHkgaW4gcG9vbC4gIENvbXBhcmUgdGhlIGV4aXN0aW5nIG9uZSB0byB0aGUgaW5wdXQuCi0gICAgaWYgKEV4aXN0aW5nRmlsZU1hdGNoZXNQcm90byhleGlzdGluZ19maWxlLCBwcm90bykpIHsKLSAgICAgIC8vIFRoZXkncmUgaWRlbnRpY2FsLiAgUmV0dXJuIHRoZSBleGlzdGluZyBkZXNjcmlwdG9yLgotICAgICAgcmV0dXJuIGV4aXN0aW5nX2ZpbGU7Ci0gICAgfQotCi0gICAgLy8gTm90IGEgbWF0Y2guICBUaGUgZXJyb3Igd2lsbCBiZSBkZXRlY3RlZCBhbmQgaGFuZGxlZCBsYXRlci4KLSAgfQotCi0gIC8vIENoZWNrIHRvIHNlZSBpZiB0aGlzIGZpbGUgaXMgYWxyZWFkeSBvbiB0aGUgcGVuZGluZyBmaWxlcyBsaXN0LgotICAvLyBUT0RPKGtlbnRvbik6ICBBbGxvdyByZWN1cnNpdmUgaW1wb3J0cz8gIEl0IG1heSBub3Qgd29yayB3aXRoIHNvbWUKLSAgLy8gICAobW9zdD8pIHByb2dyYW1taW5nIGxhbmd1YWdlcy4gIEUuZy4sIGluIEMrKywgYSBmb3J3YXJkIGRlY2xhcmF0aW9uCi0gIC8vICAgb2YgYSB0eXBlIGlzIG5vdCBzdWZmaWNpZW50IHRvIGFsbG93IGl0IHRvIGJlIHVzZWQgZXZlbiBpbiBhCi0gIC8vICAgZ2VuZXJhdGVkIGhlYWRlciBmaWxlIGR1ZSB0byBpbmxpbmluZy4gIFRoaXMgY291bGQgcGVyaGFwcyBiZQotICAvLyAgIHdvcmtlZCBhcm91bmQgdXNpbmcgdHJpY2tzIGludm9sdmluZyBpbnNlcnRpbmcgI2luY2x1ZGUgc3RhdGVtZW50cwotICAvLyAgIG1pZC1maWxlLCBidXQgdGhhdCdzIHByZXR0eSB1Z2x5LCBhbmQgSSdtIHByZXR0eSBzdXJlIHRoZXJlIGFyZQotICAvLyAgIHNvbWUgbGFuZ3VhZ2VzIG91dCB0aGVyZSB0aGF0IGRvIG5vdCBhbGxvdyByZWN1cnNpdmUgZGVwZW5kZW5jaWVzCi0gIC8vICAgYXQgYWxsLgotICBmb3IgKGludCBpID0gMDsgaSA8IHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfW2ldID09IHByb3RvLm5hbWUoKSkgewotICAgICAgQWRkUmVjdXJzaXZlSW1wb3J0RXJyb3IocHJvdG8sIGkpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgLy8gSWYgd2UgaGF2ZSBhIGZhbGxiYWNrX2RhdGFiYXNlXywgYXR0ZW1wdCB0byBsb2FkIGFsbCBkZXBlbmRlbmNpZXMgbm93LAotICAvLyBiZWZvcmUgY2hlY2twb2ludGluZyB0YWJsZXNfLiAgVGhpcyBhdm9pZHMgY29uZnVzaW9uIHdpdGggcmVjdXJzaXZlCi0gIC8vIGNoZWNrcG9pbnRzLgotICBpZiAocG9vbF8tPmZhbGxiYWNrX2RhdGFiYXNlXyAhPSBOVUxMKSB7Ci0gICAgdGFibGVzXy0+cGVuZGluZ19maWxlc18ucHVzaF9iYWNrKHByb3RvLm5hbWUoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7Ci0gICAgICBpZiAodGFibGVzXy0+RmluZEZpbGUocHJvdG8uZGVwZW5kZW5jeShpKSkgPT0gTlVMTCAmJgotICAgICAgICAgIChwb29sXy0+dW5kZXJsYXlfID09IE5VTEwgfHwKLSAgICAgICAgICAgcG9vbF8tPnVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUocHJvdG8uZGVwZW5kZW5jeShpKSkgPT0gTlVMTCkpIHsKLSAgICAgICAgLy8gV2UgZG9uJ3QgY2FyZSB3aGF0IHRoaXMgcmV0dXJucyBzaW5jZSB3ZSdsbCBmaW5kIG91dCBiZWxvdyBhbnl3YXkuCi0gICAgICAgIHBvb2xfLT5UcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShwcm90by5kZXBlbmRlbmN5KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGFibGVzXy0+cGVuZGluZ19maWxlc18ucG9wX2JhY2soKTsKLSAgfQotICByZXR1cm4gQnVpbGRGaWxlSW1wbChwcm90byk7Ci19Ci0KLWNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRGaWxlSW1wbCgKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICAvLyBDaGVja3BvaW50IHRoZSB0YWJsZXMgc28gdGhhdCB3ZSBjYW4gcm9sbCBiYWNrIGlmIHNvbWV0aGluZyBnb2VzIHdyb25nLgotICB0YWJsZXNfLT5BZGRDaGVja3BvaW50KCk7Ci0KLSAgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpOwotICBmaWxlXyA9IHJlc3VsdDsKLQotICByZXN1bHQtPmlzX3BsYWNlaG9sZGVyXyA9IGZhbHNlOwotICBpZiAocHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSkgewotICAgIFNvdXJjZUNvZGVJbmZvICppbmZvID0gdGFibGVzXy0+QWxsb2NhdGVNZXNzYWdlPFNvdXJjZUNvZGVJbmZvPigpOwotICAgIGluZm8tPkNvcHlGcm9tKHByb3RvLnNvdXJjZV9jb2RlX2luZm8oKSk7Ci0gICAgcmVzdWx0LT5zb3VyY2VfY29kZV9pbmZvXyA9IGluZm87Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0LT5zb3VyY2VfY29kZV9pbmZvXyA9ICZTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpOwotICB9Ci0KLSAgZmlsZV90YWJsZXNfID0gdGFibGVzXy0+QWxsb2NhdGVGaWxlVGFibGVzKCk7Ci0gIGZpbGVfLT50YWJsZXNfID0gZmlsZV90YWJsZXNfOwotCi0gIGlmICghcHJvdG8uaGFzX25hbWUoKSkgewotICAgIEFkZEVycm9yKCIiLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKLSAgICAgICAgICAgICAiTWlzc2luZyBmaWVsZDogRmlsZURlc2NyaXB0b3JQcm90by5uYW1lLiIpOwotICB9Ci0KLSAgLy8gVE9ETyhsaXVqaXNpKTogUmVwb3J0IGVycm9yIHdoZW4gdGhlIHN5bnRheCBpcyBlbXB0eSBhZnRlciBhbGwgdGhlIHByb3RvcwotICAvLyBoYXZlIGFkZGVkIHRoZSBzeW50YXggc3RhdGVtZW50LgotICBpZiAocHJvdG8uc3ludGF4KCkuZW1wdHkoKSB8fCBwcm90by5zeW50YXgoKSA9PSAicHJvdG8yIikgewotICAgIGZpbGVfLT5zeW50YXhfID0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzI7Ci0gIH0gZWxzZSBpZiAocHJvdG8uc3ludGF4KCkgPT0gInByb3RvMyIpIHsKLSAgICBmaWxlXy0+c3ludGF4XyA9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOwotICB9IGVsc2UgewotICAgIGZpbGVfLT5zeW50YXhfID0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9VTktOT1dOOwotICAgIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgIlVucmVjb2duaXplZCBzeW50YXg6ICIgKyBwcm90by5zeW50YXgoKSk7Ci0gIH0KLQotICByZXN1bHQtPm5hbWVfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8ubmFtZSgpKTsKLSAgaWYgKHByb3RvLmhhc19wYWNrYWdlKCkpIHsKLSAgICByZXN1bHQtPnBhY2thZ2VfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8ucGFja2FnZSgpKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBXZSBjYW5ub3QgcmVseSBvbiBwcm90by5wYWNrYWdlKCkgcmV0dXJuaW5nIGEgdmFsaWQgc3RyaW5nIGlmCi0gICAgLy8gcHJvdG8uaGFzX3BhY2thZ2UoKSBpcyBmYWxzZSwgYmVjYXVzZSB3ZSBtaWdodCBiZSBydW5uaW5nIGF0IHN0YXRpYwotICAgIC8vIGluaXRpYWxpemF0aW9uIHRpbWUsIGluIHdoaWNoIGNhc2UgZGVmYXVsdCB2YWx1ZXMgaGF2ZSBub3QgeWV0IGJlZW4KLSAgICAvLyBpbml0aWFsaXplZC4KLSAgICByZXN1bHQtPnBhY2thZ2VfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoIiIpOwotICB9Ci0gIHJlc3VsdC0+cG9vbF8gPSBwb29sXzsKLQotICAvLyBBZGQgdG8gdGFibGVzLgotICBpZiAoIXRhYmxlc18tPkFkZEZpbGUocmVzdWx0KSkgewotICAgIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgIkEgZmlsZSB3aXRoIHRoaXMgbmFtZSBpcyBhbHJlYWR5IGluIHRoZSBwb29sLiIpOwotICAgIC8vIEJhaWwgb3V0IGVhcmx5IHNvIHRoYXQgaWYgdGhpcyBpcyBhY3R1YWxseSB0aGUgZXhhY3Qgc2FtZSBmaWxlLCB3ZQotICAgIC8vIGRvbid0IGVuZCB1cCByZXBvcnRpbmcgdGhhdCBldmVyeSBzaW5nbGUgc3ltYm9sIGlzIGFscmVhZHkgZGVmaW5lZC4KLSAgICB0YWJsZXNfLT5Sb2xsYmFja1RvTGFzdENoZWNrcG9pbnQoKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBpZiAoIXJlc3VsdC0+cGFja2FnZSgpLmVtcHR5KCkpIHsKLSAgICBBZGRQYWNrYWdlKHJlc3VsdC0+cGFja2FnZSgpLCBwcm90bywgcmVzdWx0KTsKLSAgfQotCi0gIC8vIE1ha2Ugc3VyZSBhbGwgZGVwZW5kZW5jaWVzIGFyZSBsb2FkZWQuCi0gIHNldDxzdHJpbmc+IHNlZW5fZGVwZW5kZW5jaWVzOwotICByZXN1bHQtPmRlcGVuZGVuY3lfY291bnRfID0gcHJvdG8uZGVwZW5kZW5jeV9zaXplKCk7Ci0gIHJlc3VsdC0+ZGVwZW5kZW5jaWVzXyA9Ci0gICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxjb25zdCBGaWxlRGVzY3JpcHRvcio+KHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpKTsKLSAgdW51c2VkX2RlcGVuZGVuY3lfLmNsZWFyKCk7Ci0gIHNldDxpbnQ+IHdlYWtfZGVwczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by53ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpOyArK2kpIHsKLSAgICB3ZWFrX2RlcHMuaW5zZXJ0KHByb3RvLndlYWtfZGVwZW5kZW5jeShpKSk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCFzZWVuX2RlcGVuZGVuY2llcy5pbnNlcnQocHJvdG8uZGVwZW5kZW5jeShpKSkuc2Vjb25kKSB7Ci0gICAgICBBZGRUd2ljZUxpc3RlZEVycm9yKHByb3RvLCBpKTsKLSAgICB9Ci0KLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwZW5kZW5jeSA9IHRhYmxlc18tPkZpbmRGaWxlKHByb3RvLmRlcGVuZGVuY3koaSkpOwotICAgIGlmIChkZXBlbmRlbmN5ID09IE5VTEwgJiYgcG9vbF8tPnVuZGVybGF5XyAhPSBOVUxMKSB7Ci0gICAgICBkZXBlbmRlbmN5ID0gcG9vbF8tPnVuZGVybGF5Xy0+RmluZEZpbGVCeU5hbWUocHJvdG8uZGVwZW5kZW5jeShpKSk7Ci0gICAgfQotCi0gICAgaWYgKGRlcGVuZGVuY3kgPT0gTlVMTCkgewotICAgICAgaWYgKHBvb2xfLT5hbGxvd191bmtub3duXyB8fAotICAgICAgICAgICghcG9vbF8tPmVuZm9yY2Vfd2Vha18gJiYgd2Vha19kZXBzLmZpbmQoaSkgIT0gd2Vha19kZXBzLmVuZCgpKSkgewotICAgICAgICBkZXBlbmRlbmN5ID0gTmV3UGxhY2Vob2xkZXJGaWxlKHByb3RvLmRlcGVuZGVuY3koaSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgQWRkSW1wb3J0RXJyb3IocHJvdG8sIGkpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBBZGQgdG8gdW51c2VkX2RlcGVuZGVuY3lfIHRvIHRyYWNrIHVudXNlZCBpbXBvcnRlZCBmaWxlcy4KLSAgICAgIC8vIE5vdGU6IGRvIG5vdCB0cmFjayB1bnVzZWQgaW1wb3J0ZWQgZmlsZXMgZm9yIHB1YmxpYyBpbXBvcnQuCi0gICAgICBpZiAocG9vbF8tPmVuZm9yY2VfZGVwZW5kZW5jaWVzXyAmJgotICAgICAgICAgIChwb29sXy0+dW51c2VkX2ltcG9ydF90cmFja19maWxlc18uZmluZChwcm90by5uYW1lKCkpICE9Ci0gICAgICAgICAgIHBvb2xfLT51bnVzZWRfaW1wb3J0X3RyYWNrX2ZpbGVzXy5lbmQoKSkgJiYKLSAgICAgICAgICAoZGVwZW5kZW5jeS0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKSA9PSAwKSkgewotICAgICAgICB1bnVzZWRfZGVwZW5kZW5jeV8uaW5zZXJ0KGRlcGVuZGVuY3kpOwotICAgICAgfQotICAgIH0KLQotICAgIHJlc3VsdC0+ZGVwZW5kZW5jaWVzX1tpXSA9IGRlcGVuZGVuY3k7Ci0gIH0KLQotICAvLyBDaGVjayBwdWJsaWMgZGVwZW5kZW5jaWVzLgotICBpbnQgcHVibGljX2RlcGVuZGVuY3lfY291bnQgPSAwOwotICByZXN1bHQtPnB1YmxpY19kZXBlbmRlbmNpZXNfID0gdGFibGVzXy0+QWxsb2NhdGVBcnJheTxpbnQ+KAotICAgICAgcHJvdG8ucHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgewotICAgIC8vIE9ubHkgcHV0IHZhbGlkIHB1YmxpYyBkZXBlbmRlbmN5IGluZGV4ZXMuCi0gICAgaW50IGluZGV4ID0gcHJvdG8ucHVibGljX2RlcGVuZGVuY3koaSk7Ci0gICAgaWYgKGluZGV4ID49IDAgJiYgaW5kZXggPCBwcm90by5kZXBlbmRlbmN5X3NpemUoKSkgewotICAgICAgcmVzdWx0LT5wdWJsaWNfZGVwZW5kZW5jaWVzX1twdWJsaWNfZGVwZW5kZW5jeV9jb3VudCsrXSA9IGluZGV4OwotICAgICAgLy8gRG8gbm90IHRyYWNrIHVudXNlZCBpbXBvcnRlZCBmaWxlcyBmb3IgcHVibGljIGltcG9ydC4KLSAgICAgIHVudXNlZF9kZXBlbmRlbmN5Xy5lcmFzZShyZXN1bHQtPmRlcGVuZGVuY3koaW5kZXgpKTsKLSAgICB9IGVsc2UgewotICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICAiSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC4iKTsKLSAgICB9Ci0gIH0KLSAgcmVzdWx0LT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudF8gPSBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudDsKLQotICAvLyBCdWlsZCBkZXBlbmRlbmN5IHNldAotICBkZXBlbmRlbmNpZXNfLmNsZWFyKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIFJlY29yZFB1YmxpY0RlcGVuZGVuY2llcyhyZXN1bHQtPmRlcGVuZGVuY3koaSkpOwotICB9Ci0KLSAgLy8gQ2hlY2sgd2VhayBkZXBlbmRlbmNpZXMuCi0gIGludCB3ZWFrX2RlcGVuZGVuY3lfY291bnQgPSAwOwotICByZXN1bHQtPndlYWtfZGVwZW5kZW5jaWVzXyA9IHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8aW50PigKLSAgICAgIHByb3RvLndlYWtfZGVwZW5kZW5jeV9zaXplKCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLndlYWtfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgewotICAgIGludCBpbmRleCA9IHByb3RvLndlYWtfZGVwZW5kZW5jeShpKTsKLSAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpKSB7Ci0gICAgICByZXN1bHQtPndlYWtfZGVwZW5kZW5jaWVzX1t3ZWFrX2RlcGVuZGVuY3lfY291bnQrK10gPSBpbmRleDsKLSAgICB9IGVsc2UgewotICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICAiSW52YWxpZCB3ZWFrIGRlcGVuZGVuY3kgaW5kZXguIik7Ci0gICAgfQotICB9Ci0gIHJlc3VsdC0+d2Vha19kZXBlbmRlbmN5X2NvdW50XyA9IHdlYWtfZGVwZW5kZW5jeV9jb3VudDsKLQotICAvLyBDb252ZXJ0IGNoaWxkcmVuLgotICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBtZXNzYWdlX3R5cGUsIEJ1aWxkTWVzc2FnZSAgLCBOVUxMKTsKLSAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZW51bV90eXBlICAgLCBCdWlsZEVudW0gICAgICwgTlVMTCk7Ci0gIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIHNlcnZpY2UgICAgICwgQnVpbGRTZXJ2aWNlICAsIE5VTEwpOwotICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb24gICAsIEJ1aWxkRXh0ZW5zaW9uLCBOVUxMKTsKLQotICAvLyBDb3B5IG9wdGlvbnMuCi0gIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgewotICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KLSAgfSBlbHNlIHsKLSAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOwotICB9Ci0KLSAgLy8gTm90ZSB0aGF0IHRoZSBmb2xsb3dpbmcgc3RlcHMgbXVzdCBvY2N1ciBpbiBleGFjdGx5IHRoZSBzcGVjaWZpZWQgb3JkZXIuCi0KLSAgLy8gQ3Jvc3MtbGluay4KLSAgQ3Jvc3NMaW5rRmlsZShyZXN1bHQsIHByb3RvKTsKLQotICAvLyBJbnRlcnByZXQgYW55IHJlbWFpbmluZyB1bmludGVycHJldGVkIG9wdGlvbnMgZ2F0aGVyZWQgaW50bwotICAvLyBvcHRpb25zX3RvX2ludGVycHJldF8gZHVyaW5nIGRlc2NyaXB0b3IgYnVpbGRpbmcuICBDcm9zcy1saW5raW5nIGhhcyBtYWRlCi0gIC8vIGV4dGVuc2lvbiBvcHRpb25zIGtub3duLCBzbyBhbGwgaW50ZXJwcmV0YXRpb25zIHNob3VsZCBub3cgc3VjY2VlZC4KLSAgaWYgKCFoYWRfZXJyb3JzXykgewotICAgIE9wdGlvbkludGVycHJldGVyIG9wdGlvbl9pbnRlcnByZXRlcih0aGlzKTsKLSAgICBmb3IgKHZlY3RvcjxPcHRpb25zVG9JbnRlcnByZXQ+OjppdGVyYXRvciBpdGVyID0KLSAgICAgICAgICAgICBvcHRpb25zX3RvX2ludGVycHJldF8uYmVnaW4oKTsKLSAgICAgICAgIGl0ZXIgIT0gb3B0aW9uc190b19pbnRlcnByZXRfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICAgIG9wdGlvbl9pbnRlcnByZXRlci5JbnRlcnByZXRPcHRpb25zKCYoKml0ZXIpKTsKLSAgICB9Ci0gICAgb3B0aW9uc190b19pbnRlcnByZXRfLmNsZWFyKCk7Ci0gIH0KLQotICAvLyBWYWxpZGF0ZSBvcHRpb25zLgotICBpZiAoIWhhZF9lcnJvcnNfKSB7Ci0gICAgVmFsaWRhdGVGaWxlT3B0aW9ucyhyZXN1bHQsIHByb3RvKTsKLSAgfQotCi0gIC8vIEFkZGl0aW9uYWwgbmFtaW5nIGNvbmZsaWN0IGNoZWNrIGZvciBtYXAgZW50cnkgdHlwZXMuIE9ubHkgbmVlZCB0byBjaGVjawotICAvLyB0aGlzIGlmIHRoZXJlIGFyZSBhbHJlYWR5IGVycm9ycy4KLSAgaWYgKGhhZF9lcnJvcnNfKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5tZXNzYWdlX3R5cGVfc2l6ZSgpOyArK2kpIHsKLSAgICAgIERldGVjdE1hcENvbmZsaWN0cyhyZXN1bHQtPm1lc3NhZ2VfdHlwZShpKSwgcHJvdG8ubWVzc2FnZV90eXBlKGkpKTsKLSAgICB9Ci0gIH0KLQotCi0gIGlmICghdW51c2VkX2RlcGVuZGVuY3lfLmVtcHR5KCkpIHsKLSAgICBMb2dVbnVzZWREZXBlbmRlbmN5KHByb3RvLCByZXN1bHQpOwotICB9Ci0KLSAgaWYgKGhhZF9lcnJvcnNfKSB7Ci0gICAgdGFibGVzXy0+Um9sbGJhY2tUb0xhc3RDaGVja3BvaW50KCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgdGFibGVzXy0+Q2xlYXJMYXN0Q2hlY2twb2ludCgpOwotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IqIHJlc3VsdCkgewotICBjb25zdCBzdHJpbmcmIHNjb3BlID0gKHBhcmVudCA9PSBOVUxMKSA/Ci0gICAgZmlsZV8tPnBhY2thZ2UoKSA6IHBhcmVudC0+ZnVsbF9uYW1lKCk7Ci0gIHN0cmluZyogZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoc2NvcGUpOwotICBpZiAoIWZ1bGxfbmFtZS0+ZW1wdHkoKSkgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKLSAgZnVsbF9uYW1lLT5hcHBlbmQocHJvdG8ubmFtZSgpKTsKLQotICBWYWxpZGF0ZVN5bWJvbE5hbWUocHJvdG8ubmFtZSgpLCAqZnVsbF9uYW1lLCBwcm90byk7Ci0KLSAgcmVzdWx0LT5uYW1lXyAgICAgICAgICAgID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8ubmFtZSgpKTsKLSAgcmVzdWx0LT5mdWxsX25hbWVfICAgICAgID0gZnVsbF9uYW1lOwotICByZXN1bHQtPmZpbGVfICAgICAgICAgICAgPSBmaWxlXzsKLSAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OwotICByZXN1bHQtPmlzX3BsYWNlaG9sZGVyXyAgPSBmYWxzZTsKLSAgcmVzdWx0LT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSBmYWxzZTsKLQotICAvLyBCdWlsZCBvbmVvZnMgZmlyc3Qgc28gdGhhdCBmaWVsZHMgYW5kIGV4dGVuc2lvbiByYW5nZXMgY2FuIHJlZmVyIHRvIHRoZW0uCi0gIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIG9uZW9mX2RlY2wgICAgICwgQnVpbGRPbmVvZiAgICAgICAgICwgcmVzdWx0KTsKLSAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZmllbGQgICAgICAgICAgLCBCdWlsZEZpZWxkICAgICAgICAgLCByZXN1bHQpOwotICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBuZXN0ZWRfdHlwZSAgICAsIEJ1aWxkTWVzc2FnZSAgICAgICAsIHJlc3VsdCk7Ci0gIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIGVudW1fdHlwZSAgICAgICwgQnVpbGRFbnVtICAgICAgICAgICwgcmVzdWx0KTsKLSAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZXh0ZW5zaW9uX3JhbmdlLCBCdWlsZEV4dGVuc2lvblJhbmdlLCByZXN1bHQpOwotICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb24gICAgICAsIEJ1aWxkRXh0ZW5zaW9uICAgICAsIHJlc3VsdCk7Ci0gIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIHJlc2VydmVkX3JhbmdlICwgQnVpbGRSZXNlcnZlZFJhbmdlICwgcmVzdWx0KTsKLQotICAvLyBDb3B5IHJlc2VydmVkIG5hbWVzLgotICBpbnQgcmVzZXJ2ZWRfbmFtZV9jb3VudCA9IHByb3RvLnJlc2VydmVkX25hbWVfc2l6ZSgpOwotICByZXN1bHQtPnJlc2VydmVkX25hbWVfY291bnRfID0gcmVzZXJ2ZWRfbmFtZV9jb3VudDsKLSAgcmVzdWx0LT5yZXNlcnZlZF9uYW1lc18gPQotICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxjb25zdCBzdHJpbmcqPihyZXNlcnZlZF9uYW1lX2NvdW50KTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9uYW1lX2NvdW50OyArK2kpIHsKLSAgICByZXN1bHQtPnJlc2VydmVkX25hbWVzX1tpXSA9Ci0gICAgICAgIHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLnJlc2VydmVkX25hbWUoaSkpOwotICB9Ci0KLSAgLy8gQ29weSBvcHRpb25zLgotICBpZiAoIXByb3RvLmhhc19vcHRpb25zKCkpIHsKLSAgICByZXN1bHQtPm9wdGlvbnNfID0gTlVMTDsgIC8vIFdpbGwgc2V0IHRvIGRlZmF1bHRfaW5zdGFuY2UgbGF0ZXIuCi0gIH0gZWxzZSB7Ci0gICAgQWxsb2NhdGVPcHRpb25zKHByb3RvLm9wdGlvbnMoKSwgcmVzdWx0KTsKLSAgfQotCi0gIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQsIHJlc3VsdC0+bmFtZSgpLAotICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLnJlc2VydmVkX3JhbmdlX3NpemUoKTsgaSsrKSB7Ci0gICAgY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIHJhbmdlMSA9IHByb3RvLnJlc2VydmVkX3JhbmdlKGkpOwotICAgIGZvciAoaW50IGogPSBpICsgMTsgaiA8IHByb3RvLnJlc2VydmVkX3JhbmdlX3NpemUoKTsgaisrKSB7Ci0gICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgcmFuZ2UyID0gcHJvdG8ucmVzZXJ2ZWRfcmFuZ2Uoaik7Ci0gICAgICBpZiAocmFuZ2UxLmVuZCgpID4gcmFuZ2UyLnN0YXJ0KCkgJiYgcmFuZ2UyLmVuZCgpID4gcmFuZ2UxLnN0YXJ0KCkpIHsKLSAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2UoaSksCi0gICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAotICAgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJSZXNlcnZlZCByYW5nZSAkMCB0byAkMSBvdmVybGFwcyB3aXRoICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxyZWFkeS1kZWZpbmVkIHJhbmdlICQyIHRvICQzLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UyLnN0YXJ0KCksIHJhbmdlMi5lbmQoKSAtIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UxLnN0YXJ0KCksIHJhbmdlMS5lbmQoKSAtIDEpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBoYXNoX3NldDxzdHJpbmc+IHJlc2VydmVkX25hbWVfc2V0OwotICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLnJlc2VydmVkX25hbWVfc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBzdHJpbmcmIG5hbWUgPSBwcm90by5yZXNlcnZlZF9uYW1lKGkpOwotICAgIGlmIChyZXNlcnZlZF9uYW1lX3NldC5maW5kKG5hbWUpID09IHJlc2VydmVkX25hbWVfc2V0LmVuZCgpKSB7Ci0gICAgICByZXNlcnZlZF9uYW1lX3NldC5pbnNlcnQobmFtZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZEVycm9yKG5hbWUsIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCi0gICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAgICAgICAgICAgICAgICAiRmllbGQgbmFtZSBcIiQwXCIgaXMgcmVzZXJ2ZWQgbXVsdGlwbGUgdGltZXMuIiwKLSAgICAgICAgICAgICAgICAgbmFtZSkpOwotICAgIH0KLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gcmVzdWx0LT5maWVsZChpKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlID0gcmVzdWx0LT5leHRlbnNpb25fcmFuZ2Uoaik7Ci0gICAgICBpZiAocmFuZ2UtPnN0YXJ0IDw9IGZpZWxkLT5udW1iZXIoKSAmJiBmaWVsZC0+bnVtYmVyKCkgPCByYW5nZS0+ZW5kKSB7Ci0gICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGopLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICAgICAgICAgICAgICAiRXh0ZW5zaW9uIHJhbmdlICQwIHRvICQxIGluY2x1ZGVzIGZpZWxkIFwiJDJcIiAoJDMpLiIsCi0gICAgICAgICAgICAgICAgICAgcmFuZ2UtPnN0YXJ0LCByYW5nZS0+ZW5kIC0gMSwKLSAgICAgICAgICAgICAgICAgICBmaWVsZC0+bmFtZSgpLCBmaWVsZC0+bnVtYmVyKCkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCByZXN1bHQtPnJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSogcmFuZ2UgPSByZXN1bHQtPnJlc2VydmVkX3JhbmdlKGopOwotICAgICAgaWYgKHJhbmdlLT5zdGFydCA8PSBmaWVsZC0+bnVtYmVyKCkgJiYgZmllbGQtPm51bWJlcigpIDwgcmFuZ2UtPmVuZCkgewotICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLnJlc2VydmVkX3JhbmdlKGopLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICAgICAgICAgICAgICAiRmllbGQgXCIkMFwiIHVzZXMgcmVzZXJ2ZWQgbnVtYmVyICQxLiIsCi0gICAgICAgICAgICAgICAgICAgZmllbGQtPm5hbWUoKSwgZmllbGQtPm51bWJlcigpKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmIChyZXNlcnZlZF9uYW1lX3NldC5maW5kKGZpZWxkLT5uYW1lKCkpICE9IHJlc2VydmVkX25hbWVfc2V0LmVuZCgpKSB7Ci0gICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLmZpZWxkKGkpLAotICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAotICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgKLSAgICAgICAgICAgICAgICAgIkZpZWxkIG5hbWUgXCIkMFwiIGlzIHJlc2VydmVkLiIsIGZpZWxkLT5uYW1lKCkpKTsKLSAgICB9Ci0gIH0KLQotICAvLyBDaGVjayB0aGF0IGV4dGVuc2lvbiByYW5nZXMgZG9uJ3Qgb3ZlcmxhcCBhbmQgZG9uJ3QgaW5jbHVkZQotICAvLyByZXNlcnZlZCBmaWVsZCBudW1iZXJzLgotICBmb3IgKGludCBpID0gMDsgaSA8IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZTEgPSByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZShpKTsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHJlc3VsdC0+cmVzZXJ2ZWRfcmFuZ2VfY291bnQoKTsgaisrKSB7Ci0gICAgICBjb25zdCBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiByYW5nZTIgPSByZXN1bHQtPnJlc2VydmVkX3JhbmdlKGopOwotICAgICAgaWYgKHJhbmdlMS0+ZW5kID4gcmFuZ2UyLT5zdGFydCAmJiByYW5nZTItPmVuZCA+IHJhbmdlMS0+c3RhcnQpIHsKLSAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGopLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRXh0ZW5zaW9uIHJhbmdlICQwIHRvICQxIG92ZXJsYXBzIHdpdGggIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJyZXNlcnZlZCByYW5nZSAkMiB0byAkMy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlMS0+c3RhcnQsIHJhbmdlMS0+ZW5kIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTItPnN0YXJ0LCByYW5nZTItPmVuZCAtIDEpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgcmVzdWx0LT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaisrKSB7Ci0gICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UyID0gcmVzdWx0LT5leHRlbnNpb25fcmFuZ2Uoaik7Ci0gICAgICBpZiAocmFuZ2UxLT5lbmQgPiByYW5nZTItPnN0YXJ0ICYmIHJhbmdlMi0+ZW5kID4gcmFuZ2UxLT5zdGFydCkgewotICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90by5leHRlbnNpb25fcmFuZ2UoaiksCi0gICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAotICAgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJFeHRlbnNpb24gcmFuZ2UgJDAgdG8gJDEgb3ZlcmxhcHMgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFscmVhZHktZGVmaW5lZCByYW5nZSAkMiB0byAkMy4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlMi0+c3RhcnQsIHJhbmdlMi0+ZW5kIC0gMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTEtPnN0YXJ0LCByYW5nZTEtPmVuZCAtIDEpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZEZpZWxkT3JFeHRlbnNpb24oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2V4dGVuc2lvbikgewotICBjb25zdCBzdHJpbmcmIHNjb3BlID0gKHBhcmVudCA9PSBOVUxMKSA/Ci0gICAgZmlsZV8tPnBhY2thZ2UoKSA6IHBhcmVudC0+ZnVsbF9uYW1lKCk7Ci0gIHN0cmluZyogZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoc2NvcGUpOwotICBpZiAoIWZ1bGxfbmFtZS0+ZW1wdHkoKSkgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKLSAgZnVsbF9uYW1lLT5hcHBlbmQocHJvdG8ubmFtZSgpKTsKLQotICBWYWxpZGF0ZVN5bWJvbE5hbWUocHJvdG8ubmFtZSgpLCAqZnVsbF9uYW1lLCBwcm90byk7Ci0KLSAgcmVzdWx0LT5uYW1lXyAgICAgICAgID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8ubmFtZSgpKTsKLSAgcmVzdWx0LT5mdWxsX25hbWVfICAgID0gZnVsbF9uYW1lOwotICByZXN1bHQtPmZpbGVfICAgICAgICAgPSBmaWxlXzsKLSAgcmVzdWx0LT5udW1iZXJfICAgICAgID0gcHJvdG8ubnVtYmVyKCk7Ci0gIHJlc3VsdC0+aXNfZXh0ZW5zaW9uXyA9IGlzX2V4dGVuc2lvbjsKLQotICAvLyBJZiAucHJvdG8gZmlsZXMgZm9sbG93IHRoZSBzdHlsZSBndWlkZSB0aGVuIHRoZSBuYW1lIHNob3VsZCBhbHJlYWR5IGJlCi0gIC8vIGxvd2VyLWNhc2VkLiAgSWYgdGhhdCdzIHRoZSBjYXNlIHdlIGNhbiBqdXN0IHJldXNlIHRoZSBzdHJpbmcgd2UgYWxyZWFkeQotICAvLyBhbGxvY2F0ZWQgcmF0aGVyIHRoYW4gYWxsb2NhdGUgYSBuZXcgb25lLgotICBzdHJpbmcgbG93ZXJjYXNlX25hbWUocHJvdG8ubmFtZSgpKTsKLSAgTG93ZXJTdHJpbmcoJmxvd2VyY2FzZV9uYW1lKTsKLSAgaWYgKGxvd2VyY2FzZV9uYW1lID09IHByb3RvLm5hbWUoKSkgewotICAgIHJlc3VsdC0+bG93ZXJjYXNlX25hbWVfID0gcmVzdWx0LT5uYW1lXzsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQtPmxvd2VyY2FzZV9uYW1lXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKGxvd2VyY2FzZV9uYW1lKTsKLSAgfQotCi0gIC8vIERvbid0IGJvdGhlciB3aXRoIHRoZSBhYm92ZSBvcHRpbWl6YXRpb24gZm9yIGNhbWVsLWNhc2UgbmFtZXMgc2luY2UKLSAgLy8gLnByb3RvIGZpbGVzIHRoYXQgZm9sbG93IHRoZSBndWlkZSBzaG91bGRuJ3QgYmUgdXNpbmcgbmFtZXMgaW4gdGhpcwotICAvLyBmb3JtYXQsIHNvIHRoZSBvcHRpbWl6YXRpb24gd291bGRuJ3QgaGVscCBtdWNoLgotICByZXN1bHQtPmNhbWVsY2FzZV9uYW1lXyA9Ci0gICAgICB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhUb0NhbWVsQ2FzZShwcm90by5uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb3dlcl9maXJzdCA9ICovIHRydWUpKTsKLQotICBpZiAocHJvdG8uaGFzX2pzb25fbmFtZSgpKSB7Ci0gICAgcmVzdWx0LT5oYXNfanNvbl9uYW1lXyA9IHRydWU7Ci0gICAgcmVzdWx0LT5qc29uX25hbWVfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocHJvdG8uanNvbl9uYW1lKCkpOwotICB9IGVsc2UgewotICAgIHJlc3VsdC0+aGFzX2pzb25fbmFtZV8gPSBmYWxzZTsKLSAgICByZXN1bHQtPmpzb25fbmFtZV8gPSByZXN1bHQtPmNhbWVsY2FzZV9uYW1lXzsKLSAgfQotCi0gIC8vIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBzdGF0aWNfY2FzdCBkaXJlY3RseSBiZXR3ZWVuIHR3byBlbnVtIHR5cGVzLAotICAvLyBzbyB3ZSBtdXN0IGNhc3QgdG8gaW50IGZpcnN0LgotICByZXN1bHQtPnR5cGVfICA9IHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4oCi0gICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4ocHJvdG8udHlwZSgpKSk7Ci0gIHJlc3VsdC0+bGFiZWxfID0gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpMYWJlbD4oCi0gICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4ocHJvdG8ubGFiZWwoKSkpOwotCi0gIC8vIEFuIGV4dGVuc2lvbiBjYW5ub3QgaGF2ZSBhIHJlcXVpcmVkIGZpZWxkIChiLzEzMzY1ODM2KS4KLSAgaWYgKHJlc3VsdC0+aXNfZXh0ZW5zaW9uXyAmJgotICAgICAgcmVzdWx0LT5sYWJlbF8gPT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVFVSVJFRCkgewotICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgIC8vIEVycm9yIGxvY2F0aW9uIGBUWVBFYDogd2Ugd291bGQgcmVhbGx5IGxpa2UgdG8gaW5kaWNhdGUKLSAgICAgICAgICAgICAvLyBgTEFCRUxgLCBidXQgdGhlIGBFcnJvckxvY2F0aW9uYCBlbnVtIGhhcyBubyBlbnRyeSBmb3IgdGhpcywgYW5kCi0gICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVjZXNzYXJpbHkga25vdyBhYm91dCBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoZQotICAgICAgICAgICAgIC8vIGBFcnJvckNvbGxlY3RvcmAgaW50ZXJmYWNlIHRvIGV4dGVuZCB0aGVtIHRvIGhhbmRsZSB0aGUgbmV3Ci0gICAgICAgICAgICAgLy8gZXJyb3IgbG9jYXRpb24gdHlwZSBwcm9wZXJseS4KLSAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgIk1lc3NhZ2UgZXh0ZW5zaW9ucyBjYW5ub3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMuIik7Ci0gIH0KLQotICAvLyBTb21lIG9mIHRoZXNlIG1heSBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nLgotICByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZV8gPSBOVUxMOwotICByZXN1bHQtPmV4dGVuc2lvbl9zY29wZV8gPSBOVUxMOwotICByZXN1bHQtPm1lc3NhZ2VfdHlwZV8gPSBOVUxMOwotICByZXN1bHQtPmVudW1fdHlwZV8gPSBOVUxMOwotCi0gIHJlc3VsdC0+aGFzX2RlZmF1bHRfdmFsdWVfID0gcHJvdG8uaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgaWYgKHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCkgJiYgcmVzdWx0LT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAotICAgICAgICAgICAgICJSZXBlYXRlZCBmaWVsZHMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKLSAgfQotCi0gIGlmIChwcm90by5oYXNfdHlwZSgpKSB7Ci0gICAgaWYgKHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKLSAgICAgIGNoYXIqIGVuZF9wb3MgPSBOVUxMOwotICAgICAgc3dpdGNoIChyZXN1bHQtPmNwcF90eXBlKCkpIHsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2ludDMyXyA9Ci0gICAgICAgICAgICBzdHJ0b2wocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmNfc3RyKCksICZlbmRfcG9zLCAwKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2ludDY0XyA9Ci0gICAgICAgICAgICBzdHJ0bzY0KHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcywgMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKLSAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDMyXyA9Ci0gICAgICAgICAgICBzdHJ0b3VsKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3BvcywgMCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKLSAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfdWludDY0XyA9Ci0gICAgICAgICAgICBzdHJ0b3U2NChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MsIDApOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVDoKLSAgICAgICAgICBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICJpbmYiKSB7Ci0gICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZmxvYXRfID0gbnVtZXJpY19saW1pdHM8ZmxvYXQ+OjppbmZpbml0eSgpOwotICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICItaW5mIikgewotICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9IC1udW1lcmljX2xpbWl0czxmbG9hdD46OmluZmluaXR5KCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gIm5hbiIpIHsKLSAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPSBudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpOwotICAgICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9IGlvOjpTYWZlRG91YmxlVG9GbG9hdCgKLSAgICAgICAgICAgICAgICBpbzo6Tm9Mb2NhbGVTdHJ0b2QocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmNfc3RyKCksICZlbmRfcG9zKSk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6Ci0gICAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAiaW5mIikgewotICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwotICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZGVmYXVsdF92YWx1ZSgpID09ICItaW5mIikgewotICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAibmFuIikgewotICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPSBudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKLSAgICAgICAgICB9IGVsc2UgIHsKLSAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9kb3VibGVfID0KLSAgICAgICAgICAgICAgICBpbzo6Tm9Mb2NhbGVTdHJ0b2QocHJvdG8uZGVmYXVsdF92YWx1ZSgpLmNfc3RyKCksICZlbmRfcG9zKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6Ci0gICAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKLSAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9ib29sXyA9IHRydWU7Ci0gICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gImZhbHNlIikgewotICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Jvb2xfID0gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgIkJvb2xlYW4gZGVmYXVsdCBtdXN0IGJlIHRydWUgb3IgZmFsc2UuIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgICAgIC8vIFRoaXMgd2lsbCBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nLgotICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IE5VTEw7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgICBpZiAocmVzdWx0LT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKSB7Ci0gICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKAotICAgICAgICAgICAgICBVbmVzY2FwZUNFc2NhcGVTdHJpbmcocHJvdG8uZGVmYXVsdF92YWx1ZSgpKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmdfID0KLSAgICAgICAgICAgICAgICB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5kZWZhdWx0X3ZhbHVlKCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIk1lc3NhZ2VzIGNhbid0IGhhdmUgZGVmYXVsdCB2YWx1ZXMuIik7Ci0gICAgICAgICAgcmVzdWx0LT5oYXNfZGVmYXVsdF92YWx1ZV8gPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaWYgKGVuZF9wb3MgIT0gTlVMTCkgewotICAgICAgICAvLyBlbmRfcG9zIGlzIG9ubHkgc2V0IG5vbi1OVUxMIGJ5IHRoZSBwYXJzZXJzIGZvciBudW1lcmljIHR5cGVzLCBhYm92ZS4KLSAgICAgICAgLy8gVGhpcyBjaGVja3MgdGhhdCB0aGUgZGVmYXVsdCB3YXMgbm9uLWVtcHR5IGFuZCBoYWQgbm8gZXh0cmEganVuawotICAgICAgICAvLyBhZnRlciB0aGUgZW5kIG9mIHRoZSBudW1iZXIuCi0gICAgICAgIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkuZW1wdHkoKSB8fCAqZW5kX3BvcyAhPSAnXDAnKSB7Ci0gICAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICJDb3VsZG4ndCBwYXJzZSBkZWZhdWx0IHZhbHVlIFwiIiArIHByb3RvLmRlZmF1bHRfdmFsdWUoKSArCi0gICAgICAgICAgICAgICAgICAgIlwiLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vIGV4cGxpY2l0IGRlZmF1bHQgdmFsdWUKLSAgICAgIHN3aXRjaCAocmVzdWx0LT5jcHBfdHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgotICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9pbnQzMl8gPSAwOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDoKLSAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfaW50NjRfID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgotICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV91aW50MzJfID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OgotICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV91aW50NjRfID0gMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6Ci0gICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9IDAuMGY7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKLSAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZG91YmxlXyA9IDAuMDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKLSAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfYm9vbF8gPSBmYWxzZTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgICAgICAvLyBUaGlzIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZy4KLSAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZW51bV8gPSBOVUxMOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX3N0cmluZ18gPSAmaW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKHJlc3VsdC0+bnVtYmVyKCkgPD0gMCkgewotICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAiRmllbGQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLiIpOwotICB9IGVsc2UgaWYgKCFpc19leHRlbnNpb24gJiYgcmVzdWx0LT5udW1iZXIoKSA+IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcikgewotICAgIC8vIE9ubHkgdmFsaWRhdGUgdGhhdCB0aGUgbnVtYmVyIGlzIHdpdGhpbiB0aGUgdmFsaWQgZmllbGQgcmFuZ2UgaWYgaXQgaXMKLSAgICAvLyBub3QgYW4gZXh0ZW5zaW9uLiBTaW5jZSBleHRlbnNpb24gbnVtYmVycyBhcmUgdmFsaWRhdGVkIHdpdGggdGhlCi0gICAgLy8gZXh0ZW5kZWUncyB2YWxpZCBzZXQgb2YgZXh0ZW5zaW9uIG51bWJlcnMsIGFuZCB0aG9zZSBhcmUgaW4gdHVybgotICAgIC8vIHZhbGlkYXRlZCBhZ2FpbnN0IHRoZSBtYXggYWxsb3dlZCBudW1iZXIsIHRoZSBjaGVjayBpcyB1bm5lY2Vzc2FyeSBmb3IKLSAgICAvLyBleHRlbnNpb24gZmllbGRzLgotICAgIC8vIFRoaXMgYXZvaWRzIGNyb3NzLWxpbmtpbmcgaXNzdWVzIHRoYXQgYXJpc2Ugd2hlbiBhdHRlbXB0aW5nIHRvIGNoZWNrIGlmCi0gICAgLy8gdGhlIGV4dGVuZGVlIGlzIGEgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgbWVzc2FnZSwgd2hpY2ggaGFzIGEgaGlnaGVyIG1heAotICAgIC8vIG9uIGV4dGVuc2lvbiBudW1iZXJzLgotICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJGaWVsZCBudW1iZXJzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJDAuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcikpOwotICB9IGVsc2UgaWYgKHJlc3VsdC0+bnVtYmVyKCkgPj0gRmllbGREZXNjcmlwdG9yOjprRmlyc3RSZXNlcnZlZE51bWJlciAmJgotICAgICAgICAgICAgIHJlc3VsdC0+bnVtYmVyKCkgPD0gRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyKSB7Ci0gICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAotICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoCi0gICAgICAgICAgICAgICAiRmllbGQgbnVtYmVycyAkMCB0aHJvdWdoICQxIGFyZSByZXNlcnZlZCBmb3IgdGhlIHByb3RvY29sICIKLSAgICAgICAgICAgICAgICJidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi4iLAotICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprRmlyc3RSZXNlcnZlZE51bWJlciwKLSAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a0xhc3RSZXNlcnZlZE51bWJlcikpOwotICB9Ci0KLSAgaWYgKGlzX2V4dGVuc2lvbikgewotICAgIGlmICghcHJvdG8uaGFzX2V4dGVuZGVlKCkpIHsKLSAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSwKLSAgICAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBub3Qgc2V0IGZvciBleHRlbnNpb24gZmllbGQuIik7Ci0gICAgfQotCi0gICAgcmVzdWx0LT5leHRlbnNpb25fc2NvcGVfID0gcGFyZW50OwotCi0gICAgaWYgKHByb3RvLmhhc19vbmVvZl9pbmRleCgpKSB7Ci0gICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICAiRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXggc2hvdWxkIG5vdCBiZSBzZXQgZm9yICIKLSAgICAgICAgICAgICAgICJleHRlbnNpb25zLiIpOwotICAgIH0KLQotICAgIC8vIEZpbGwgaW4gbGF0ZXIgKG1heWJlKS4KLSAgICByZXN1bHQtPmNvbnRhaW5pbmdfb25lb2ZfID0gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBpZiAocHJvdG8uaGFzX2V4dGVuZGVlKCkpIHsKLSAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSwKLSAgICAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBzZXQgZm9yIG5vbi1leHRlbnNpb24gZmllbGQuIik7Ci0gICAgfQotCi0gICAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OwotCi0gICAgaWYgKHByb3RvLmhhc19vbmVvZl9pbmRleCgpKSB7Ci0gICAgICBpZiAocHJvdG8ub25lb2ZfaW5kZXgoKSA8IDAgfHwKLSAgICAgICAgICBwcm90by5vbmVvZl9pbmRleCgpID49IHBhcmVudC0+b25lb2ZfZGVjbF9jb3VudCgpKSB7Ci0gICAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAotICAgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJGaWVsZERlc2NyaXB0b3JQcm90by5vbmVvZl9pbmRleCAkMCBpcyAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm91dCBvZiByYW5nZSBmb3IgdHlwZSBcIiQxXCIuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5vbmVvZl9pbmRleCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcmVudC0+bmFtZSgpKSk7Ci0gICAgICAgIHJlc3VsdC0+Y29udGFpbmluZ19vbmVvZl8gPSBOVUxMOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LT5jb250YWluaW5nX29uZW9mXyA9IHBhcmVudC0+b25lb2ZfZGVjbChwcm90by5vbmVvZl9pbmRleCgpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0LT5jb250YWluaW5nX29uZW9mXyA9IE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgLy8gQ29weSBvcHRpb25zLgotICBpZiAoIXByb3RvLmhhc19vcHRpb25zKCkpIHsKLSAgICByZXN1bHQtPm9wdGlvbnNfID0gTlVMTDsgIC8vIFdpbGwgc2V0IHRvIGRlZmF1bHRfaW5zdGFuY2UgbGF0ZXIuCi0gIH0gZWxzZSB7Ci0gICAgQWxsb2NhdGVPcHRpb25zKHByb3RvLm9wdGlvbnMoKSwgcmVzdWx0KTsKLSAgfQotCi0KLSAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHBhcmVudCwgcmVzdWx0LT5uYW1lKCksCi0gICAgICAgICAgICBwcm90bywgU3ltYm9sKHJlc3VsdCkpOwotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZEV4dGVuc2lvblJhbmdlKAotICAgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHByb3RvLAotICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKLSAgICBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmVzdWx0KSB7Ci0gIHJlc3VsdC0+c3RhcnQgPSBwcm90by5zdGFydCgpOwotICByZXN1bHQtPmVuZCA9IHByb3RvLmVuZCgpOwotICBpZiAocmVzdWx0LT5zdGFydCA8PSAwKSB7Ci0gICAgQWRkRXJyb3IocGFyZW50LT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCi0gICAgICAgICAgICAgIkV4dGVuc2lvbiBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7Ci0gIH0KLQotICAvLyBDaGVja2luZyBvZiB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIGV4dGVuc2lvbiByYW5nZSBpcyBkZWZlcnJlZCB1bnRpbCBhZnRlcgotICAvLyBvcHRpb25zIGludGVycHJldGluZy4gVGhpcyBhbGxvd3MgbWVzc2FnZXMgd2l0aCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCB0bwotICAvLyBoYXZlIGV4dGVuc2lvbnMgYmV5b25kIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciwgc2luY2UgdGhlIGV4dGVuc2lvbgotICAvLyBudW1iZXJzIGFyZSBhY3R1YWxseSB1c2VkIGFzIGludDMycyBpbiB0aGUgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQuCi0KLSAgaWYgKHJlc3VsdC0+c3RhcnQgPj0gcmVzdWx0LT5lbmQpIHsKLSAgICBBZGRFcnJvcihwYXJlbnQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAiRXh0ZW5zaW9uIHJhbmdlIGVuZCBudW1iZXIgbXVzdCBiZSBncmVhdGVyIHRoYW4gc3RhcnQgbnVtYmVyLiIpOwotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkUmVzZXJ2ZWRSYW5nZSgKLSAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OlJlc2VydmVkUmFuZ2UmIHByb3RvLAotICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKLSAgICBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiByZXN1bHQpIHsKLSAgcmVzdWx0LT5zdGFydCA9IHByb3RvLnN0YXJ0KCk7Ci0gIHJlc3VsdC0+ZW5kID0gcHJvdG8uZW5kKCk7Ci0gIGlmIChyZXN1bHQtPnN0YXJ0IDw9IDApIHsKLSAgICBBZGRFcnJvcihwYXJlbnQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAiUmVzZXJ2ZWQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLiIpOwotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkT25lb2YoY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZW9mRGVzY3JpcHRvciogcmVzdWx0KSB7Ci0gIHN0cmluZyogZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocGFyZW50LT5mdWxsX25hbWUoKSk7Ci0gIGZ1bGxfbmFtZS0+YXBwZW5kKDEsICcuJyk7Ci0gIGZ1bGxfbmFtZS0+YXBwZW5kKHByb3RvLm5hbWUoKSk7Ci0KLSAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOwotCi0gIHJlc3VsdC0+bmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOwotICByZXN1bHQtPmZ1bGxfbmFtZV8gPSBmdWxsX25hbWU7Ci0KLSAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OwotCi0gIC8vIFdlIG5lZWQgdG8gZmlsbCB0aGVzZSBpbiBsYXRlci4KLSAgcmVzdWx0LT5maWVsZF9jb3VudF8gPSAwOwotICByZXN1bHQtPmZpZWxkc18gPSBOVUxMOwotCi0gIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQsIHJlc3VsdC0+bmFtZSgpLAotICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvciogcmVzdWx0KSB7Ci0gIGNvbnN0IHN0cmluZyYgc2NvcGUgPSAocGFyZW50ID09IE5VTEwpID8KLSAgICBmaWxlXy0+cGFja2FnZSgpIDogcGFyZW50LT5mdWxsX25hbWUoKTsKLSAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhzY29wZSk7Ci0gIGlmICghZnVsbF9uYW1lLT5lbXB0eSgpKSBmdWxsX25hbWUtPmFwcGVuZCgxLCAnLicpOwotICBmdWxsX25hbWUtPmFwcGVuZChwcm90by5uYW1lKCkpOwotCi0gIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksICpmdWxsX25hbWUsIHByb3RvKTsKLQotICByZXN1bHQtPm5hbWVfICAgICAgICAgICAgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOwotICByZXN1bHQtPmZ1bGxfbmFtZV8gICAgICAgPSBmdWxsX25hbWU7Ci0gIHJlc3VsdC0+ZmlsZV8gICAgICAgICAgICA9IGZpbGVfOwotICByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZV8gPSBwYXJlbnQ7Ci0gIHJlc3VsdC0+aXNfcGxhY2Vob2xkZXJfICA9IGZhbHNlOwotICByZXN1bHQtPmlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXyA9IGZhbHNlOwotCi0gIGlmIChwcm90by52YWx1ZV9zaXplKCkgPT0gMCkgewotICAgIC8vIFdlIGNhbm5vdCBhbGxvdyBlbnVtcyB3aXRoIG5vIHZhbHVlcyBiZWNhdXNlIHRoaXMgd291bGQgbWVhbiB0aGVyZQotICAgIC8vIHdvdWxkIGJlIG5vIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCi0gICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAotICAgICAgICAgICAgICJFbnVtcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHZhbHVlLiIpOwotICB9Ci0KLSAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgdmFsdWUsIEJ1aWxkRW51bVZhbHVlLCByZXN1bHQpOwotCi0gIC8vIENvcHkgb3B0aW9ucy4KLSAgaWYgKCFwcm90by5oYXNfb3B0aW9ucygpKSB7Ci0gICAgcmVzdWx0LT5vcHRpb25zXyA9IE5VTEw7ICAvLyBXaWxsIHNldCB0byBkZWZhdWx0X2luc3RhbmNlIGxhdGVyLgotICB9IGVsc2UgewotICAgIEFsbG9jYXRlT3B0aW9ucyhwcm90by5vcHRpb25zKCksIHJlc3VsdCk7Ci0gIH0KLQotICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwKLSAgICAgICAgICAgIHByb3RvLCBTeW1ib2wocmVzdWx0KSk7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkRW51bVZhbHVlKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvciogcmVzdWx0KSB7Ci0gIHJlc3VsdC0+bmFtZV8gICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7Ci0gIHJlc3VsdC0+bnVtYmVyXyA9IHByb3RvLm51bWJlcigpOwotICByZXN1bHQtPnR5cGVfICAgPSBwYXJlbnQ7Ci0KLSAgLy8gTm90ZTogIGZ1bGxfbmFtZSBmb3IgZW51bSB2YWx1ZXMgaXMgYSBzaWJsaW5nIHRvIHRoZSBwYXJlbnQncyBuYW1lLCBub3QgYQotICAvLyAgIGNoaWxkIG9mIGl0LgotICBzdHJpbmcqIGZ1bGxfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKCpwYXJlbnQtPmZ1bGxfbmFtZV8pOwotICBmdWxsX25hbWUtPnJlc2l6ZShmdWxsX25hbWUtPnNpemUoKSAtIHBhcmVudC0+bmFtZV8tPnNpemUoKSk7Ci0gIGZ1bGxfbmFtZS0+YXBwZW5kKCpyZXN1bHQtPm5hbWVfKTsKLSAgcmVzdWx0LT5mdWxsX25hbWVfID0gZnVsbF9uYW1lOwotCi0gIFZhbGlkYXRlU3ltYm9sTmFtZShwcm90by5uYW1lKCksICpmdWxsX25hbWUsIHByb3RvKTsKLQotICAvLyBDb3B5IG9wdGlvbnMuCi0gIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgewotICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KLSAgfSBlbHNlIHsKLSAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOwotICB9Ci0KLSAgLy8gQWdhaW4sIGVudW0gdmFsdWVzIGFyZSB3ZWlyZCBiZWNhdXNlIHdlIG1ha2VzIHRoZW0gYXBwZWFyIGFzIHNpYmxpbmdzCi0gIC8vIG9mIHRoZSBlbnVtIHR5cGUgaW5zdGVhZCBvZiBjaGlsZHJlbiBvZiBpdC4gIFNvLCB3ZSB1c2UKLSAgLy8gcGFyZW50LT5jb250YWluaW5nX3R5cGUoKSBhcyB0aGUgdmFsdWUncyBwYXJlbnQuCi0gIGJvb2wgYWRkZWRfdG9fb3V0ZXJfc2NvcGUgPQotICAgIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQtPmNvbnRhaW5pbmdfdHlwZSgpLCByZXN1bHQtPm5hbWUoKSwKLSAgICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKLQotICAvLyBIb3dldmVyLCB3ZSBhbHNvIHdhbnQgdG8gYmUgYWJsZSB0byBzZWFyY2ggZm9yIHZhbHVlcyB3aXRoaW4gYSBzaW5nbGUKLSAgLy8gZW51bSB0eXBlLCBzbyB3ZSBhZGQgaXQgYXMgYSBjaGlsZCBvZiB0aGUgZW51bSB0eXBlIGl0c2VsZiwgdG9vLgotICAvLyBOb3RlOiAgVGhpcyBjb3VsZCBmYWlsLCBidXQgaWYgaXQgZG9lcywgdGhlIGVycm9yIGhhcyBhbHJlYWR5IGJlZW4KLSAgLy8gICByZXBvcnRlZCBieSB0aGUgYWJvdmUgQWRkU3ltYm9sKCkgY2FsbCwgc28gd2UgaWdub3JlIHRoZSByZXR1cm4gY29kZS4KLSAgYm9vbCBhZGRlZF90b19pbm5lcl9zY29wZSA9Ci0gICAgZmlsZV90YWJsZXNfLT5BZGRBbGlhc1VuZGVyUGFyZW50KHBhcmVudCwgcmVzdWx0LT5uYW1lKCksIFN5bWJvbChyZXN1bHQpKTsKLQotICBpZiAoYWRkZWRfdG9faW5uZXJfc2NvcGUgJiYgIWFkZGVkX3RvX291dGVyX3Njb3BlKSB7Ci0gICAgLy8gVGhpcyB2YWx1ZSBkaWQgbm90IGNvbmZsaWN0IHdpdGggYW55IHZhbHVlcyBkZWZpbmVkIGluIHRoZSBzYW1lIGVudW0sCi0gICAgLy8gYnV0IGl0IGRpZCBjb25mbGljdCB3aXRoIHNvbWUgb3RoZXIgc3ltYm9sIGRlZmluZWQgaW4gdGhlIGVudW0gdHlwZSdzCi0gICAgLy8gc2NvcGUuICBMZXQncyBwcmludCBhbiBhZGRpdGlvbmFsIGVycm9yIHRvIGV4cGxhaW4gdGhpcy4KLSAgICBzdHJpbmcgb3V0ZXJfc2NvcGU7Ci0gICAgaWYgKHBhcmVudC0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgewotICAgICAgb3V0ZXJfc2NvcGUgPSBmaWxlXy0+cGFja2FnZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBvdXRlcl9zY29wZSA9IHBhcmVudC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpOwotICAgIH0KLQotICAgIGlmIChvdXRlcl9zY29wZS5lbXB0eSgpKSB7Ci0gICAgICBvdXRlcl9zY29wZSA9ICJ0aGUgZ2xvYmFsIHNjb3BlIjsKLSAgICB9IGVsc2UgewotICAgICAgb3V0ZXJfc2NvcGUgPSAiXCIiICsgb3V0ZXJfc2NvcGUgKyAiXCIiOwotICAgIH0KLQotICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKLSAgICAgICAgICAgICAiTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgbWVhbmluZyB0aGF0ICIKLSAgICAgICAgICAgICAiZW51bSB2YWx1ZXMgYXJlIHNpYmxpbmdzIG9mIHRoZWlyIHR5cGUsIG5vdCBjaGlsZHJlbiBvZiBpdC4gICIKLSAgICAgICAgICAgICAiVGhlcmVmb3JlLCBcIiIgKyByZXN1bHQtPm5hbWUoKSArICJcIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gIgotICAgICAgICAgICAgICsgb3V0ZXJfc2NvcGUgKyAiLCBub3QganVzdCB3aXRoaW4gXCIiICsgcGFyZW50LT5uYW1lKCkgKyAiXCIuIik7Ci0gIH0KLQotICAvLyBBbiBlbnVtIGlzIGFsbG93ZWQgdG8gZGVmaW5lIHR3byBudW1iZXJzIHRoYXQgcmVmZXIgdG8gdGhlIHNhbWUgdmFsdWUuCi0gIC8vIEZpbmRWYWx1ZUJ5TnVtYmVyKCkgc2hvdWxkIHJldHVybiB0aGUgZmlyc3Qgc3VjaCB2YWx1ZSwgc28gd2Ugc2ltcGx5Ci0gIC8vIGlnbm9yZSBBZGRFbnVtVmFsdWVCeU51bWJlcigpJ3MgcmV0dXJuIGNvZGUuCi0gIGZpbGVfdGFibGVzXy0+QWRkRW51bVZhbHVlQnlOdW1iZXIocmVzdWx0KTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRTZXJ2aWNlKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIC8qIGR1bW15ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yKiByZXN1bHQpIHsKLSAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhmaWxlXy0+cGFja2FnZSgpKTsKLSAgaWYgKCFmdWxsX25hbWUtPmVtcHR5KCkpIGZ1bGxfbmFtZS0+YXBwZW5kKDEsICcuJyk7Ci0gIGZ1bGxfbmFtZS0+YXBwZW5kKHByb3RvLm5hbWUoKSk7Ci0KLSAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOwotCi0gIHJlc3VsdC0+bmFtZV8gICAgICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7Ci0gIHJlc3VsdC0+ZnVsbF9uYW1lXyA9IGZ1bGxfbmFtZTsKLSAgcmVzdWx0LT5maWxlXyAgICAgID0gZmlsZV87Ci0KLSAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgbWV0aG9kLCBCdWlsZE1ldGhvZCwgcmVzdWx0KTsKLQotICAvLyBDb3B5IG9wdGlvbnMuCi0gIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgewotICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KLSAgfSBlbHNlIHsKLSAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOwotICB9Ci0KLSAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIE5VTEwsIHJlc3VsdC0+bmFtZSgpLAotICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yKiByZXN1bHQpIHsKLSAgcmVzdWx0LT5uYW1lXyAgICA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7Ci0gIHJlc3VsdC0+c2VydmljZV8gPSBwYXJlbnQ7Ci0KLSAgc3RyaW5nKiBmdWxsX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwYXJlbnQtPmZ1bGxfbmFtZSgpKTsKLSAgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKLSAgZnVsbF9uYW1lLT5hcHBlbmQoKnJlc3VsdC0+bmFtZV8pOwotICByZXN1bHQtPmZ1bGxfbmFtZV8gPSBmdWxsX25hbWU7Ci0KLSAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOwotCi0gIC8vIFRoZXNlIHdpbGwgYmUgZmlsbGVkIGluIHdoZW4gY3Jvc3MtbGlua2luZy4KLSAgcmVzdWx0LT5pbnB1dF90eXBlXyA9IE5VTEw7Ci0gIHJlc3VsdC0+b3V0cHV0X3R5cGVfID0gTlVMTDsKLQotICAvLyBDb3B5IG9wdGlvbnMuCi0gIGlmICghcHJvdG8uaGFzX29wdGlvbnMoKSkgewotICAgIHJlc3VsdC0+b3B0aW9uc18gPSBOVUxMOyAgLy8gV2lsbCBzZXQgdG8gZGVmYXVsdF9pbnN0YW5jZSBsYXRlci4KLSAgfSBlbHNlIHsKLSAgICBBbGxvY2F0ZU9wdGlvbnMocHJvdG8ub3B0aW9ucygpLCByZXN1bHQpOwotICB9Ci0KLSAgcmVzdWx0LT5jbGllbnRfc3RyZWFtaW5nXyA9IHByb3RvLmNsaWVudF9zdHJlYW1pbmcoKTsKLSAgcmVzdWx0LT5zZXJ2ZXJfc3RyZWFtaW5nXyA9IHByb3RvLnNlcnZlcl9zdHJlYW1pbmcoKTsKLQotICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwKLSAgICAgICAgICAgIHByb3RvLCBTeW1ib2wocmVzdWx0KSk7Ci19Ci0KLSN1bmRlZiBCVUlMRF9BUlJBWQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0ZpbGUoCi0gICAgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Ci0gIGlmIChmaWxlLT5vcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgZmlsZS0+b3B0aW9uc18gPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIENyb3NzTGlua01lc3NhZ2UoJmZpbGUtPm1lc3NhZ2VfdHlwZXNfW2ldLCBwcm90by5tZXNzYWdlX3R5cGUoaSkpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgQ3Jvc3NMaW5rRmllbGQoJmZpbGUtPmV4dGVuc2lvbnNfW2ldLCBwcm90by5leHRlbnNpb24oaSkpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgQ3Jvc3NMaW5rRW51bSgmZmlsZS0+ZW51bV90eXBlc19baV0sIHByb3RvLmVudW1fdHlwZShpKSk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7Ci0gICAgQ3Jvc3NMaW5rU2VydmljZSgmZmlsZS0+c2VydmljZXNfW2ldLCBwcm90by5zZXJ2aWNlKGkpKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpDcm9zc0xpbmtNZXNzYWdlKAotICAgIERlc2NyaXB0b3IqIG1lc3NhZ2UsIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgaWYgKG1lc3NhZ2UtPm9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBtZXNzYWdlLT5vcHRpb25zXyA9ICZNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOwotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBDcm9zc0xpbmtNZXNzYWdlKCZtZXNzYWdlLT5uZXN0ZWRfdHlwZXNfW2ldLCBwcm90by5uZXN0ZWRfdHlwZShpKSk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBDcm9zc0xpbmtFbnVtKCZtZXNzYWdlLT5lbnVtX3R5cGVzX1tpXSwgcHJvdG8uZW51bV90eXBlKGkpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgQ3Jvc3NMaW5rRmllbGQoJm1lc3NhZ2UtPmZpZWxkc19baV0sIHByb3RvLmZpZWxkKGkpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIENyb3NzTGlua0ZpZWxkKCZtZXNzYWdlLT5leHRlbnNpb25zX1tpXSwgcHJvdG8uZXh0ZW5zaW9uKGkpKTsKLSAgfQotCi0gIC8vIFNldCB1cCBmaWVsZCBhcnJheSBmb3IgZWFjaCBvbmVvZi4KLQotICAvLyBGaXJzdCBjb3VudCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBwZXIgb25lb2YuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZWNsID0gbWVzc2FnZS0+ZmllbGQoaSktPmNvbnRhaW5pbmdfb25lb2YoKTsKLSAgICBpZiAob25lb2ZfZGVjbCAhPSBOVUxMKSB7Ci0gICAgICAvLyBNYWtlIHN1cmUgZmllbGRzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBvbmVvZiBhcmUgZGVmaW5lZCBjb25zZWN1dGl2ZWx5LgotICAgICAgLy8gVGhpcyBlbmFibGVzIG9wdGltaXphdGlvbnMgaW4gY29kZWdlbnMgYW5kIHJlZmxlY3Rpb24gbGlicmFyaWVzIHRvCi0gICAgICAvLyBza2lwIGZpZWxkcyBpbiB0aGUgb25lb2YgZ3JvdXAsIGFzIG9ubHkgb25lIG9mIHRoZSBmaWVsZCBjYW4gYmUgc2V0LgotICAgICAgLy8gTm90ZSB0aGF0IGZpZWxkX2NvdW50KCkgcmV0dXJucyBob3cgbWFueSBmaWVsZHMgaW4gdGhpcyBvbmVvZiB3ZSBoYXZlCi0gICAgICAvLyBzZWVuIHNvIGZhci4gZmllbGRfY291bnQoKSA+IDAgZ3VhcmFudGVlcyB0aGF0IGkgPiAwLCBzbyBmaWVsZChpLTEpIGlzCi0gICAgICAvLyBzYWZlLgotICAgICAgaWYgKG9uZW9mX2RlY2wtPmZpZWxkX2NvdW50KCkgPiAwICYmCi0gICAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSAtIDEpLT5jb250YWluaW5nX29uZW9mKCkgIT0gb25lb2ZfZGVjbCkgewotICAgICAgICBBZGRFcnJvcigKLSAgICAgICAgICAgIG1lc3NhZ2UtPmZ1bGxfbmFtZSgpICsgIi4iICsgbWVzc2FnZS0+ZmllbGQoaSAtIDEpLT5uYW1lKCksCi0gICAgICAgICAgICBwcm90by5maWVsZChpIC0gMSksIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAgICAgICAgICAgICAgICJGaWVsZHMgaW4gdGhlIHNhbWUgb25lb2YgbXVzdCBiZSBkZWZpbmVkIGNvbnNlY3V0aXZlbHkuICIKLSAgICAgICAgICAgICAgICAiXCIkMFwiIGNhbm5vdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgIgotICAgICAgICAgICAgICAgICJcIiQxXCIgb25lb2YgZGVmaW5pdGlvbi4iLAotICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkKGkgLSAxKS0+bmFtZSgpLCBvbmVvZl9kZWNsLT5uYW1lKCkpKTsKLSAgICAgIH0KLSAgICAgIC8vIE11c3QgZ28gdGhyb3VnaCBvbmVvZl9kZWNsc18gYXJyYXkgdG8gZ2V0IGEgbm9uLWNvbnN0IHZlcnNpb24gb2YgdGhlCi0gICAgICAvLyBPbmVvZkRlc2NyaXB0b3IuCi0gICAgICArK21lc3NhZ2UtPm9uZW9mX2RlY2xzX1tvbmVvZl9kZWNsLT5pbmRleCgpXS5maWVsZF9jb3VudF87Ci0gICAgfQotICB9Ci0KLSAgLy8gVGhlbiBhbGxvY2F0ZSB0aGUgYXJyYXlzLgotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7Ci0gICAgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZWNsID0gJm1lc3NhZ2UtPm9uZW9mX2RlY2xzX1tpXTsKLQotICAgIGlmIChvbmVvZl9kZWNsLT5maWVsZF9jb3VudCgpID09IDApIHsKLSAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpICsgIi4iICsgb25lb2ZfZGVjbC0+bmFtZSgpLAotICAgICAgICAgICAgICAgcHJvdG8ub25lb2ZfZGVjbChpKSwKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKLSAgICAgICAgICAgICAgICJPbmVvZiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkLiIpOwotICAgIH0KLQotICAgIG9uZW9mX2RlY2wtPmZpZWxkc18gPQotICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IqPihvbmVvZl9kZWNsLT5maWVsZF9jb3VudF8pOwotICAgIG9uZW9mX2RlY2wtPmZpZWxkX2NvdW50XyA9IDA7Ci0gIH0KLQotICAvLyBUaGVuIGZpbGwgdGhlbSBpbi4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2RlY2wgPSBtZXNzYWdlLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpOwotICAgIGlmIChvbmVvZl9kZWNsICE9IE5VTEwpIHsKLSAgICAgIE9uZW9mRGVzY3JpcHRvciogbXV0YWJsZV9vbmVvZl9kZWNsID0KLSAgICAgICAgICAmbWVzc2FnZS0+b25lb2ZfZGVjbHNfW29uZW9mX2RlY2wtPmluZGV4KCldOwotICAgICAgbWVzc2FnZS0+ZmllbGRzX1tpXS5pbmRleF9pbl9vbmVvZl8gPSBtdXRhYmxlX29uZW9mX2RlY2wtPmZpZWxkX2NvdW50XzsKLSAgICAgIG11dGFibGVfb25lb2ZfZGVjbC0+ZmllbGRzX1ttdXRhYmxlX29uZW9mX2RlY2wtPmZpZWxkX2NvdW50XysrXSA9Ci0gICAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0ZpZWxkKAotICAgIEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBpZiAoZmllbGQtPm9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBmaWVsZC0+b3B0aW9uc18gPSAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIH0KLQotICBpZiAocHJvdG8uaGFzX2V4dGVuZGVlKCkpIHsKLSAgICBTeW1ib2wgZXh0ZW5kZWUgPSBMb29rdXBTeW1ib2wocHJvdG8uZXh0ZW5kZWUoKSwgZmllbGQtPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQTEFDRUhPTERFUl9FWFRFTkRBQkxFX01FU1NBR0UpOwotICAgIGlmIChleHRlbmRlZS5Jc051bGwoKSkgewotICAgICAgQWRkTm90RGVmaW5lZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5leHRlbmRlZSgpKTsKLSAgICAgIHJldHVybjsKLSAgICB9IGVsc2UgaWYgKGV4dGVuZGVlLnR5cGUgIT0gU3ltYm9sOjpNRVNTQUdFKSB7Ci0gICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFWFRFTkRFRSwKLSAgICAgICAgICAgICAgICJcIiIgKyBwcm90by5leHRlbmRlZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZV8gPSBleHRlbmRlZS5kZXNjcmlwdG9yOwotCi0gICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZSA9IGZpZWxkLT5jb250YWluaW5nX3R5cGUoKQotICAgICAgICAtPkZpbmRFeHRlbnNpb25SYW5nZUNvbnRhaW5pbmdOdW1iZXIoZmllbGQtPm51bWJlcigpKTsKLQotICAgIGlmIChleHRlbnNpb25fcmFuZ2UgPT0gTlVMTCkgewotICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAotICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiXCIkMFwiIGRvZXMgbm90IGRlY2xhcmUgJDEgYXMgYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZXh0ZW5zaW9uIG51bWJlci4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpKTsKLSAgICB9Ci0gIH0KLQotICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBOVUxMKSB7Ci0gICAgaWYgKGZpZWxkLT5sYWJlbCgpICE9IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwpIHsKLSAgICAgIC8vIE5vdGUgdGhhdCB0aGlzIGVycm9yIHdpbGwgbmV2ZXIgaGFwcGVuIHdoZW4gcGFyc2luZyAucHJvdG8gZmlsZXMuCi0gICAgICAvLyBJdCBjYW4gb25seSBoYXBwZW4gaWYgeW91IG1hbnVhbGx5IGNvbnN0cnVjdCBhIEZpbGVEZXNjcmlwdG9yUHJvdG8KLSAgICAgIC8vIHRoYXQgaXMgaW5jb3JyZWN0LgotICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKLSAgICAgICAgICAgICAgICJGaWVsZHMgb2Ygb25lb2ZzIG11c3QgdGhlbXNlbHZlcyBoYXZlIGxhYmVsIExBQkVMX09QVElPTkFMLiIpOwotICAgIH0KLSAgfQotCi0gIGlmIChwcm90by5oYXNfdHlwZV9uYW1lKCkpIHsKLSAgICAvLyBBc3N1bWUgd2UgYXJlIGV4cGVjdGluZyBhIG1lc3NhZ2UgdHlwZSB1bmxlc3MgdGhlIHByb3RvIGNvbnRhaW5zIHNvbWUKLSAgICAvLyBldmlkZW5jZSB0aGF0IGl0IGV4cGVjdHMgYW4gZW51bSB0eXBlLiAgVGhpcyBvbmx5IG1ha2VzIGEgZGlmZmVyZW5jZSBpZgotICAgIC8vIHdlIGVuZCB1cCBjcmVhdGluZyBhIHBsYWNlaG9sZGVyLgotICAgIGJvb2wgZXhwZWN0aW5nX2VudW0gPSAocHJvdG8udHlwZSgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0VOVU0pIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLmhhc19kZWZhdWx0X3ZhbHVlKCk7Ci0KLSAgICBTeW1ib2wgdHlwZSA9Ci0gICAgICBMb29rdXBTeW1ib2wocHJvdG8udHlwZV9uYW1lKCksIGZpZWxkLT5mdWxsX25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICBleHBlY3RpbmdfZW51bSA/IFBMQUNFSE9MREVSX0VOVU0gOiBQTEFDRUhPTERFUl9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgIExPT0tVUF9UWVBFUyk7Ci0KLSAgICAvLyBJZiB0aGUgdHlwZSBpcyBhIHdlYWsgdHlwZSwgd2UgY2hhbmdlIHRoZSB0eXBlIHRvIGEgZ29vZ2xlLnByb3RvYnVmLkVtcHR5IGZpZWxkLgotICAgIGlmICh0eXBlLklzTnVsbCgpICYmICFwb29sXy0+ZW5mb3JjZV93ZWFrXyAmJiBwcm90by5vcHRpb25zKCkud2VhaygpKSB7Ci0gICAgICB0eXBlID0gRmluZFN5bWJvbChrTm9uTGlua2VkV2Vha01lc3NhZ2VSZXBsYWNlbWVudE5hbWUpOwotICAgIH0KLQotICAgIGlmICh0eXBlLklzTnVsbCgpKSB7Ci0gICAgICBBZGROb3REZWZpbmVkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8udHlwZV9uYW1lKCkpOwotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIGlmICghcHJvdG8uaGFzX3R5cGUoKSkgewotICAgICAgLy8gQ2hvb3NlIGZpZWxkIHR5cGUgYmFzZWQgb24gc3ltYm9sLgotICAgICAgaWYgKHR5cGUudHlwZSA9PSBTeW1ib2w6Ok1FU1NBR0UpIHsKLSAgICAgICAgZmllbGQtPnR5cGVfID0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U7Ci0gICAgICB9IGVsc2UgaWYgKHR5cGUudHlwZSA9PSBTeW1ib2w6OkVOVU0pIHsKLSAgICAgICAgZmllbGQtPnR5cGVfID0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU07Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgICAgICJcIiIgKyBwcm90by50eXBlX25hbWUoKSArICJcIiBpcyBub3QgYSB0eXBlLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBpZiAodHlwZS50eXBlICE9IFN5bWJvbDo6TUVTU0FHRSkgewotICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgICAgICJcIiIgKyBwcm90by50eXBlX25hbWUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICAgIGZpZWxkLT5tZXNzYWdlX3R5cGVfID0gdHlwZS5kZXNjcmlwdG9yOwotCi0gICAgICBpZiAoZmllbGQtPmhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKLSAgICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAotICAgICAgICAgICAgICAgICAiTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7Ci0gICAgICBpZiAodHlwZS50eXBlICE9IFN5bWJvbDo6RU5VTSkgewotICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgICAgICJcIiIgKyBwcm90by50eXBlX25hbWUoKSArICJcIiBpcyBub3QgYW4gZW51bSB0eXBlLiIpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICBmaWVsZC0+ZW51bV90eXBlXyA9IHR5cGUuZW51bV9kZXNjcmlwdG9yOwotCi0gICAgICBpZiAoZmllbGQtPmVudW1fdHlwZSgpLT5pc19wbGFjZWhvbGRlcl8pIHsKLSAgICAgICAgLy8gV2UgY2FuJ3QgbG9vayB1cCBkZWZhdWx0IHZhbHVlcyBmb3IgcGxhY2Vob2xkZXIgdHlwZXMuICBXZSdsbCBoYXZlCi0gICAgICAgIC8vIHRvIGp1c3QgZHJvcCB0aGVtLgotICAgICAgICBmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWVfID0gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgewotICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBpZGVudGlmaWVyLiBQYXJzZXIgY2Fubm90IGFsd2F5cwotICAgICAgICAvLyB2ZXJpZnkgdGhpcyBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgY29tcGxldGUgdHlwZSBpbmZvcm1hdGlvbi4KLSAgICAgICAgLy8gTi5CLiB0aGF0IHRoaXMgY2hlY2sgeWllbGRzIGJldHRlciBlcnJvciBtZXNzYWdlcyBidXQgaXMgbm90Ci0gICAgICAgIC8vIG5lY2Vzc2FyeSBmb3IgY29ycmVjdG5lc3MgKGFuIGVudW0gc3ltYm9sIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCi0gICAgICAgIC8vIGFueXdheSksIG9ubHkgZm9yIGJldHRlciBlcnJvcnMuCi0gICAgICAgIGlmICghaW86OlRva2VuaXplcjo6SXNJZGVudGlmaWVyKHByb3RvLmRlZmF1bHRfdmFsdWUoKSkpIHsKLSAgICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAiRGVmYXVsdCB2YWx1ZSBmb3IgYW4gZW51bSBmaWVsZCBtdXN0IGJlIGFuIGlkZW50aWZpZXIuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gV2UgY2FuJ3QganVzdCB1c2UgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU5hbWUoKSBoZXJlCi0gICAgICAgICAgLy8gYmVjYXVzZSB0aGF0IGxvY2tzIHRoZSBwb29sJ3MgbXV0ZXgsIHdoaWNoIHdlIGhhdmUgYWxyZWFkeSBsb2NrZWQKLSAgICAgICAgICAvLyBhdCB0aGlzIHBvaW50LgotICAgICAgICAgIFN5bWJvbCBkZWZhdWx0X3ZhbHVlID0KLSAgICAgICAgICAgIExvb2t1cFN5bWJvbE5vUGxhY2Vob2xkZXIocHJvdG8uZGVmYXVsdF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKLQotICAgICAgICAgIGlmIChkZWZhdWx0X3ZhbHVlLnR5cGUgPT0gU3ltYm9sOjpFTlVNX1ZBTFVFICYmCi0gICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUuZW51bV92YWx1ZV9kZXNjcmlwdG9yLT50eXBlKCkgPT0KLSAgICAgICAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpKSB7Ci0gICAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IGRlZmF1bHRfdmFsdWUuZW51bV92YWx1ZV9kZXNjcmlwdG9yOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpERUZBVUxUX1ZBTFVFLAotICAgICAgICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBmaWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCIiICsgcHJvdG8uZGVmYXVsdF92YWx1ZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICJcIi4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZV9jb3VudCgpID4gMCkgewotICAgICAgICAvLyBBbGwgZW51bXMgbXVzdCBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZSwgb3Igd2Ugd291bGQgaGF2ZSByZXBvcnRlZAotICAgICAgICAvLyBhbiBlcnJvciBlbHNld2hlcmUuICBXZSB1c2UgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUgYXMgdGhlIGRlZmF1bHQKLSAgICAgICAgLy8gaWYgYSBkZWZhdWx0IGlzIG5vdCBleHBsaWNpdGx5IGRlZmluZWQuCi0gICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gZmllbGQtPmVudW1fdHlwZSgpLT52YWx1ZSgwKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAotICAgICAgICAgICAgICAgIkZpZWxkIHdpdGggcHJpbWl0aXZlIHR5cGUgaGFzIHR5cGVfbmFtZS4iKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFIHx8Ci0gICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7Ci0gICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgICAiRmllbGQgd2l0aCBtZXNzYWdlIG9yIGVudW0gdHlwZSBtaXNzaW5nIHR5cGVfbmFtZS4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyBBZGQgdGhlIGZpZWxkIHRvIHRoZSBmaWVsZHMtYnktbnVtYmVyIHRhYmxlLgotICAvLyBOb3RlOiAgV2UgaGF2ZSB0byBkbyB0aGlzICphZnRlciogY3Jvc3MtbGlua2luZyBiZWNhdXNlIGV4dGVuc2lvbnMgZG8gbm90Ci0gIC8vICAga25vdyB0aGVpciBjb250YWluaW5nIHR5cGUgdW50aWwgbm93LgotICBpZiAoIWZpbGVfdGFibGVzXy0+QWRkRmllbGRCeU51bWJlcihmaWVsZCkpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNvbmZsaWN0aW5nX2ZpZWxkID0KLSAgICAgIGZpbGVfdGFibGVzXy0+RmluZEZpZWxkQnlOdW1iZXIoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpOwotICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkV4dGVuc2lvbiBudW1iZXIgJDAgaGFzIGFscmVhZHkgYmVlbiB1c2VkICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImluIFwiJDFcIiBieSBleHRlbnNpb24gXCIkMlwiLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZmxpY3RpbmdfZmllbGQtPmZ1bGxfbmFtZSgpKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIG51bWJlciAkMCBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgaW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIkMVwiIGJ5IGZpZWxkIFwiJDJcIi4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nX2ZpZWxkLT5uYW1lKCkpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgICAgaWYgKCF0YWJsZXNfLT5BZGRFeHRlbnNpb24oZmllbGQpKSB7Ci0gICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogY29uZmxpY3RpbmdfZmllbGQgPQotICAgICAgICAgICAgdGFibGVzXy0+RmluZEV4dGVuc2lvbihmaWVsZC0+Y29udGFpbmluZ190eXBlKCksIGZpZWxkLT5udW1iZXIoKSk7Ci0gICAgICAgIHN0cmluZyBlcnJvcl9tc2cgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAgICAgICAgICAgIkV4dGVuc2lvbiBudW1iZXIgJDAgaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIFwiJDFcIiBieSBleHRlbnNpb24gIgotICAgICAgICAgICAgIlwiJDJcIiBkZWZpbmVkIGluICQzLiIsCi0gICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksCi0gICAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgY29uZmxpY3RpbmdfZmllbGQtPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgY29uZmxpY3RpbmdfZmllbGQtPmZpbGUoKS0+bmFtZSgpKTsKLSAgICAgICAgLy8gQ29uZmxpY3RpbmcgZXh0ZW5zaW9uIG51bWJlcnMgc2hvdWxkIGJlIGFuIGVycm9yLiBIb3dldmVyLCBiZWZvcmUKLSAgICAgICAgLy8gdHVybmluZyB0aGlzIGludG8gYW4gZXJyb3Igd2UgbmVlZCB0byBmaXggYWxsIGV4aXN0aW5nIGJyb2tlbgotICAgICAgICAvLyBwcm90b3MgZmlyc3QuCi0gICAgICAgIC8vIFRPRE8oeGlhb2ZlbmcpOiBDaGFuZ2UgdGhpcyB0byBhbiBlcnJvci4KLSAgICAgICAgQWRkV2FybmluZyhmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLCBlcnJvcl9tc2cpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIEFkZCB0aGUgZmllbGQgdG8gdGhlIGxvd2VyY2FzZS1uYW1lIGFuZCBjYW1lbGNhc2UtbmFtZSB0YWJsZXMuCi0gIGZpbGVfdGFibGVzXy0+QWRkRmllbGRCeVN0eWxpemVkTmFtZXMoZmllbGQpOwotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpDcm9zc0xpbmtFbnVtKAotICAgIEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUsIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Ci0gIGlmIChlbnVtX3R5cGUtPm9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBlbnVtX3R5cGUtPm9wdGlvbnNfID0gJkVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZS0+dmFsdWVfY291bnQoKTsgaSsrKSB7Ci0gICAgQ3Jvc3NMaW5rRW51bVZhbHVlKCZlbnVtX3R5cGUtPnZhbHVlc19baV0sIHByb3RvLnZhbHVlKGkpKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpDcm9zc0xpbmtFbnVtVmFsdWUoCi0gICAgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSwKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIC8qIHByb3RvICovKSB7Ci0gIGlmIChlbnVtX3ZhbHVlLT5vcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgZW51bV92YWx1ZS0+b3B0aW9uc18gPSAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOwotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua1NlcnZpY2UoCi0gICAgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UsIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Ci0gIGlmIChzZXJ2aWNlLT5vcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgc2VydmljZS0+b3B0aW9uc18gPSAmU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2VydmljZS0+bWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIENyb3NzTGlua01ldGhvZCgmc2VydmljZS0+bWV0aG9kc19baV0sIHByb3RvLm1ldGhvZChpKSk7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rTWV0aG9kKAotICAgIE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBpZiAobWV0aG9kLT5vcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgbWV0aG9kLT5vcHRpb25zXyA9ICZNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIH0KLQotICBTeW1ib2wgaW5wdXRfdHlwZSA9IExvb2t1cFN5bWJvbChwcm90by5pbnB1dF90eXBlKCksIG1ldGhvZC0+ZnVsbF9uYW1lKCkpOwotICBpZiAoaW5wdXRfdHlwZS5Jc051bGwoKSkgewotICAgIEFkZE5vdERlZmluZWRFcnJvcihtZXRob2QtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpJTlBVVF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICBwcm90by5pbnB1dF90eXBlKCkpOwotICB9IGVsc2UgaWYgKGlucHV0X3R5cGUudHlwZSAhPSBTeW1ib2w6Ok1FU1NBR0UpIHsKLSAgICBBZGRFcnJvcihtZXRob2QtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OklOUFVUX1RZUEUsCi0gICAgICAgICAgICAgIlwiIiArIHByb3RvLmlucHV0X3R5cGUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7Ci0gIH0gZWxzZSB7Ci0gICAgbWV0aG9kLT5pbnB1dF90eXBlXyA9IGlucHV0X3R5cGUuZGVzY3JpcHRvcjsKLSAgfQotCi0gIFN5bWJvbCBvdXRwdXRfdHlwZSA9IExvb2t1cFN5bWJvbChwcm90by5vdXRwdXRfdHlwZSgpLCBtZXRob2QtPmZ1bGxfbmFtZSgpKTsKLSAgaWYgKG91dHB1dF90eXBlLklzTnVsbCgpKSB7Ci0gICAgQWRkTm90RGVmaW5lZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9VVFBVVF9UWVBFLAotICAgICAgICAgICAgICAgICAgICAgICBwcm90by5vdXRwdXRfdHlwZSgpKTsKLSAgfSBlbHNlIGlmIChvdXRwdXRfdHlwZS50eXBlICE9IFN5bWJvbDo6TUVTU0FHRSkgewotICAgIEFkZEVycm9yKG1ldGhvZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1VUUFVUX1RZUEUsCi0gICAgICAgICAgICAgIlwiIiArIHByb3RvLm91dHB1dF90eXBlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICB9IGVsc2UgewotICAgIG1ldGhvZC0+b3V0cHV0X3R5cGVfID0gb3V0cHV0X3R5cGUuZGVzY3JpcHRvcjsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNkZWZpbmUgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGRlc2NyaXB0b3IsIGFycmF5X25hbWUsIHR5cGUpICBcCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+YXJyYXlfbmFtZSMjX2NvdW50KCk7ICsraSkgeyAgICAgXAotICAgIFZhbGlkYXRlIyN0eXBlIyNPcHRpb25zKGRlc2NyaXB0b3ItPmFycmF5X25hbWUjI3NfICsgaSwgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5hcnJheV9uYW1lKGkpKTsgICAgICAgICAgICAgICAgICBcCi0gIH0KLQotLy8gRGV0ZXJtaW5lIGlmIHRoZSBmaWxlIHVzZXMgb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FLCBiZWluZyBjYXJlZnVsIHRvCi0vLyBhdm9pZCBwcm9ibGVtcyB0aGF0IGV4aXN0IGF0IGluaXQgdGltZS4KLXN0YXRpYyBib29sIElzTGl0ZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgewotICAvLyBUT0RPKGtlbnRvbik6ICBJIGRvbid0IGV2ZW4gcmVtZW1iZXIgaG93IG1hbnkgb2YgdGhlc2UgY29uZGl0aW9ucyBhcmUKLSAgLy8gICBhY3R1YWxseSBwb3NzaWJsZS4gIEknbSBqdXN0IGJlaW5nIHN1cGVyLXNhZmUuCi0gIHJldHVybiBmaWxlICE9IE5VTEwgJiYKLSAgICAgICAgICZmaWxlLT5vcHRpb25zKCkgIT0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgJiYKLSAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSA9PSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOwotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUZpbGVPcHRpb25zKEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkoZmlsZSwgbWVzc2FnZV90eXBlLCBNZXNzYWdlKTsKLSAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGZpbGUsIGVudW1fdHlwZSwgRW51bSk7Ci0gIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShmaWxlLCBzZXJ2aWNlLCBTZXJ2aWNlKTsKLSAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGZpbGUsIGV4dGVuc2lvbiwgRmllbGQpOwotCi0gIC8vIExpdGUgZmlsZXMgY2FuIG9ubHkgYmUgaW1wb3J0ZWQgYnkgb3RoZXIgTGl0ZSBmaWxlcy4KLSAgaWYgKCFJc0xpdGUoZmlsZSkpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgICBpZiAoSXNMaXRlKGZpbGUtPmRlcGVuZGVuY3koaSkpKSB7Ci0gICAgICAgIEFkZEVycm9yKAotICAgICAgICAgIGZpbGUtPm5hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKLSAgICAgICAgICAiRmlsZXMgdGhhdCBkbyBub3QgdXNlIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjYW5ub3QgaW1wb3J0ICIKLSAgICAgICAgICAiZmlsZXMgd2hpY2ggZG8gdXNlIHRoaXMgb3B0aW9uLiAgVGhpcyBmaWxlIGlzIG5vdCBsaXRlLCBidXQgaXQgIgotICAgICAgICAgICJpbXBvcnRzIFwiIiArIGZpbGUtPmRlcGVuZGVuY3koaSktPm5hbWUoKSArICJcIiB3aGljaCBpcy4iKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGlmIChmaWxlLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgewotICAgIFZhbGlkYXRlUHJvdG8zKGZpbGUsIHByb3RvKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVByb3RvMygKLSAgICBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7Ci0gICAgVmFsaWRhdGVQcm90bzNGaWVsZChmaWxlLT5leHRlbnNpb25zXyArIGksIHByb3RvLmV4dGVuc2lvbihpKSk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgVmFsaWRhdGVQcm90bzNNZXNzYWdlKGZpbGUtPm1lc3NhZ2VfdHlwZXNfICsgaSwgcHJvdG8ubWVzc2FnZV90eXBlKGkpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBWYWxpZGF0ZVByb3RvM0VudW0oZmlsZS0+ZW51bV90eXBlc18gKyBpLCBwcm90by5lbnVtX3R5cGUoaSkpOwotICB9Ci19Ci0KLXN0YXRpYyBzdHJpbmcgVG9Mb3dlcmNhc2VXaXRob3V0VW5kZXJzY29yZXMoY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZS5zaXplKCk7ICsraSkgewotICAgIGlmIChuYW1lW2ldICE9ICdfJykgewotICAgICAgaWYgKG5hbWVbaV0gPj0gJ0EnICYmIG5hbWVbaV0gPD0gJ1onKSB7Ci0gICAgICAgIHJlc3VsdC5wdXNoX2JhY2sobmFtZVtpXSAtICdBJyArICdhJyk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQucHVzaF9iYWNrKG5hbWVbaV0pOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVByb3RvM01lc3NhZ2UoCi0gICAgRGVzY3JpcHRvciogbWVzc2FnZSwgY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm5lc3RlZF90eXBlX2NvdW50KCk7ICsraSkgewotICAgIFZhbGlkYXRlUHJvdG8zTWVzc2FnZShtZXNzYWdlLT5uZXN0ZWRfdHlwZXNfICsgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLm5lc3RlZF90eXBlKGkpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBWYWxpZGF0ZVByb3RvM0VudW0obWVzc2FnZS0+ZW51bV90eXBlc18gKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8uZW51bV90eXBlKGkpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmZpZWxkX2NvdW50KCk7ICsraSkgewotICAgIFZhbGlkYXRlUHJvdG8zRmllbGQobWVzc2FnZS0+ZmllbGRzXyArIGksIHByb3RvLmZpZWxkKGkpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKLSAgICBWYWxpZGF0ZVByb3RvM0ZpZWxkKG1lc3NhZ2UtPmV4dGVuc2lvbnNfICtpLCBwcm90by5leHRlbnNpb24oaSkpOwotICB9Ci0gIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKLSAgICAgICAgICAgICAiRXh0ZW5zaW9uIHJhbmdlcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLiIpOwotICB9Ci0gIGlmIChtZXNzYWdlLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIC8vIFVzaW5nIE1lc3NhZ2VTZXQgZG9lc24ndCBtYWtlIHNlbnNlIHNpbmNlIHdlIGRpc2FsbG93IGV4dGVuc2lvbnMuCi0gICAgQWRkRXJyb3IobWVzc2FnZS0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgIk1lc3NhZ2VTZXQgaXMgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMuIik7Ci0gIH0KLQotICAvLyBJbiBwcm90bzMsIHdlIHJlamVjdCBmaWVsZCBuYW1lcyBpZiB0aGV5IGNvbmZsaWN0IGluIGNhbWVsQ2FzZS4KLSAgLy8gTm90ZSB0aGF0IHdlIGN1cnJlbnRseSBlbmZvcmNlIGEgc3RyaWN0ZXIgcnVsZTogRmllbGQgbmFtZXMgbXVzdCBiZQotICAvLyB1bmlxdWUgYWZ0ZXIgYmVpbmcgY29udmVydGVkIHRvIGxvd2VyY2FzZSB3aXRoIHVuZGVyc2NvcmVzIHJlbW92ZWQuCi0gIG1hcDxzdHJpbmcsIGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG5hbWVfdG9fZmllbGQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgKytpKSB7Ci0gICAgc3RyaW5nIGxvd2VyY2FzZV9uYW1lID0gVG9Mb3dlcmNhc2VXaXRob3V0VW5kZXJzY29yZXMoCi0gICAgICAgIG1lc3NhZ2UtPmZpZWxkKGkpLT5uYW1lKCkpOwotICAgIGlmIChuYW1lX3RvX2ZpZWxkLmZpbmQobG93ZXJjYXNlX25hbWUpICE9IG5hbWVfdG9fZmllbGQuZW5kKCkpIHsKLSAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICAiVGhlIEpTT04gY2FtY2VsLWNhc2UgbmFtZSBvZiBmaWVsZCBcIiIgKwotICAgICAgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSktPm5hbWUoKSArICJcIiBjb25mbGljdHMgd2l0aCBmaWVsZCBcIiIgKwotICAgICAgICAgICAgICAgbmFtZV90b19maWVsZFtsb3dlcmNhc2VfbmFtZV0tPm5hbWUoKSArICJcIi4gVGhpcyBpcyBub3QgIiArCi0gICAgICAgICAgICAgICAiYWxsb3dlZCBpbiBwcm90bzMuIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIG5hbWVfdG9fZmllbGRbbG93ZXJjYXNlX25hbWVdID0gbWVzc2FnZS0+ZmllbGQoaSk7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlUHJvdG8zRmllbGQoCi0gICAgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Ci0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkgJiYKLSAgICAgICFBbGxvd2VkRXh0ZW5kZWVJblByb3RvMyhmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpKSkgewotICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKLSAgICAgICAgICAgICAiRXh0ZW5zaW9ucyBpbiBwcm90bzMgYXJlIG9ubHkgYWxsb3dlZCBmb3IgZGVmaW5pbmcgb3B0aW9ucy4iKTsKLSAgfQotICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKLSAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgIlJlcXVpcmVkIGZpZWxkcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLiIpOwotICB9Ci0gIGlmIChmaWVsZC0+aGFzX2RlZmF1bHRfdmFsdWUoKSkgewotICAgIEFkZEVycm9yKAotICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAotICAgICAgICAiRXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkIGluIHByb3RvMy4iKTsKLSAgfQotICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0gJiYKLSAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKSAmJgotICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5maWxlKCktPnN5bnRheCgpICE9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zKSB7Ci0gICAgLy8gUHJvdG8zIG1lc3NhZ2VzIGNhbiBvbmx5IHVzZSBQcm90bzMgZW51bSB0eXBlczsgb3RoZXJ3aXNlIHdlIGNhbid0Ci0gICAgLy8gZ3VhcmFudGVlIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgemVyby4KLSAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKLSAgICAgICAgICAgICAiRW51bSB0eXBlIFwiIiArIGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgKwotICAgICAgICAgICAgICJcIiBpcyBub3QgYSBwcm90bzMgZW51bSwgYnV0IGlzIHVzZWQgaW4gXCIiICsKLSAgICAgICAgICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpICsKLSAgICAgICAgICAgICAiXCIgd2hpY2ggaXMgYSBwcm90bzMgbWVzc2FnZSB0eXBlLiIpOwotICB9Ci0gIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgewotICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAotICAgICAgICAgICAgICJHcm91cHMgYXJlIG5vdCBzdXBwb3J0ZWQgaW4gcHJvdG8zIHN5bnRheC4iKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVByb3RvM0VudW0oCi0gICAgRW51bURlc2NyaXB0b3IqIGVubSwgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgaWYgKGVubS0+dmFsdWVfY291bnQoKSA+IDAgJiYgZW5tLT52YWx1ZSgwKS0+bnVtYmVyKCkgIT0gMCkgewotICAgIEFkZEVycm9yKAotICAgICAgICBlbm0tPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKLSAgICAgICAgIlRoZSBmaXJzdCBlbnVtIHZhbHVlIG11c3QgYmUgemVybyBpbiBwcm90bzMuIik7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNZXNzYWdlT3B0aW9ucyhEZXNjcmlwdG9yKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Ci0gIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShtZXNzYWdlLCBmaWVsZCwgRmllbGQpOwotICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgbmVzdGVkX3R5cGUsIE1lc3NhZ2UpOwotICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgZW51bV90eXBlLCBFbnVtKTsKLSAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKG1lc3NhZ2UsIGV4dGVuc2lvbiwgRmllbGQpOwotCi0gIGNvbnN0IGludDY0IG1heF9leHRlbnNpb25fcmFuZ2UgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50NjQ+KG1lc3NhZ2UtPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICBraW50MzJtYXggOgotICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgewotICAgIGlmIChtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2UoaSktPmVuZCA+IG1heF9leHRlbnNpb25fcmFuZ2UgKyAxKSB7Ci0gICAgICBBZGRFcnJvcigKLSAgICAgICAgICBtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8uZXh0ZW5zaW9uX3JhbmdlKGkpLAotICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAotICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkV4dGVuc2lvbiBudW1iZXJzIGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gJDAuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF9leHRlbnNpb25fcmFuZ2UpKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgLy8gT25seSBtZXNzYWdlIHR5cGUgZmllbGRzIG1heSBiZSBsYXp5LgotICBpZiAoZmllbGQtPm9wdGlvbnMoKS5sYXp5KCkpIHsKLSAgICBpZiAoZmllbGQtPnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgewotICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKLSAgICAgICAgICAgICAgICJbbGF6eSA9IHRydWVdIGNhbiBvbmx5IGJlIHNwZWNpZmllZCBmb3Igc3VibWVzc2FnZSBmaWVsZHMuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gT25seSByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIG1heSBiZSBwYWNrZWQuCi0gIGlmIChmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpICYmICFmaWVsZC0+aXNfcGFja2FibGUoKSkgewotICAgIEFkZEVycm9yKAotICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKLSAgICAgICJbcGFja2VkID0gdHJ1ZV0gY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzLiIpOwotICB9Ci0KLSAgLy8gTm90ZTogIERlZmF1bHQgaW5zdGFuY2UgbWF5IG5vdCB5ZXQgYmUgaW5pdGlhbGl6ZWQgaGVyZSwgc28gd2UgaGF2ZSB0bwotICAvLyAgIGF2b2lkIHJlYWRpbmcgZnJvbSBpdC4KLSAgaWYgKGZpZWxkLT5jb250YWluaW5nX3R5cGVfICE9IE5VTEwgJiYKLSAgICAgICZmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKSAhPQotICAgICAgJk1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgJiYKLSAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKLSAgICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgICBpZiAoIWZpZWxkLT5pc19vcHRpb25hbCgpIHx8Ci0gICAgICAgICAgZmllbGQtPnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgewotICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgICAgICJFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgbWVzc2FnZXMuIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCi0gICAgICAgICAgICAgICAiTWVzc2FnZVNldHMgY2Fubm90IGhhdmUgZmllbGRzLCBvbmx5IGV4dGVuc2lvbnMuIik7Ci0gICAgfQotICB9Ci0KLSAgLy8gTGl0ZSBleHRlbnNpb25zIGNhbiBvbmx5IGJlIG9mIExpdGUgdHlwZXMuCi0gIGlmIChJc0xpdGUoZmllbGQtPmZpbGUoKSkgJiYKLSAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGVfICE9IE5VTEwgJiYKLSAgICAgICFJc0xpdGUoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5maWxlKCkpKSB7Ci0gICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVYVEVOREVFLAotICAgICAgICAgICAgICJFeHRlbnNpb25zIHRvIG5vbi1saXRlIHR5cGVzIGNhbiBvbmx5IGJlIGRlY2xhcmVkIGluIG5vbi1saXRlICIKLSAgICAgICAgICAgICAiZmlsZXMuICBOb3RlIHRoYXQgeW91IGNhbm5vdCBleHRlbmQgYSBub24tbGl0ZSB0eXBlIHRvIGNvbnRhaW4gIgotICAgICAgICAgICAgICJhIGxpdGUgdHlwZSwgYnV0IHRoZSByZXZlcnNlIGlzIGFsbG93ZWQuIik7Ci0gIH0KLQotICAvLyBWYWxpZGF0ZSBtYXAgdHlwZXMuCi0gIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKLSAgICBpZiAoIVZhbGlkYXRlTWFwRW50cnkoZmllbGQsIHByb3RvKSkgewotICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICAibWFwX2VudHJ5IHNob3VsZCBub3QgYmUgc2V0IGV4cGxpY2l0bHkuIFVzZSBtYXA8S2V5VHlwZSwgIgotICAgICAgICAgICAgICAgIlZhbHVlVHlwZT4gaW5zdGVhZC4iKTsKLSAgICB9Ci0gIH0KLQotfQotCi12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUVudW1PcHRpb25zKEVudW1EZXNjcmlwdG9yKiBlbm0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Ci0gIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShlbm0sIHZhbHVlLCBFbnVtVmFsdWUpOwotICBpZiAoIWVubS0+b3B0aW9ucygpLmhhc19hbGxvd19hbGlhcygpIHx8ICFlbm0tPm9wdGlvbnMoKS5hbGxvd19hbGlhcygpKSB7Ci0gICAgbWFwPGludCwgc3RyaW5nPiB1c2VkX3ZhbHVlczsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGVubS0+dmFsdWVfY291bnQoKTsgKytpKSB7Ci0gICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gZW5tLT52YWx1ZShpKTsKLSAgICAgIGlmICh1c2VkX3ZhbHVlcy5maW5kKGVudW1fdmFsdWUtPm51bWJlcigpKSAhPSB1c2VkX3ZhbHVlcy5lbmQoKSkgewotICAgICAgICBzdHJpbmcgZXJyb3IgPQotICAgICAgICAgICAgIlwiIiArIGVudW1fdmFsdWUtPmZ1bGxfbmFtZSgpICsKLSAgICAgICAgICAgICJcIiB1c2VzIHRoZSBzYW1lIGVudW0gdmFsdWUgYXMgXCIiICsKLSAgICAgICAgICAgIHVzZWRfdmFsdWVzW2VudW1fdmFsdWUtPm51bWJlcigpXSArICJcIi4gSWYgdGhpcyBpcyBpbnRlbmRlZCwgc2V0ICIKLSAgICAgICAgICAgICInb3B0aW9uIGFsbG93X2FsaWFzID0gdHJ1ZTsnIHRvIHRoZSBlbnVtIGRlZmluaXRpb24uIjsKLSAgICAgICAgaWYgKCFlbm0tPm9wdGlvbnMoKS5hbGxvd19hbGlhcygpKSB7Ci0gICAgICAgICAgLy8gR2VuZXJhdGUgZXJyb3IgaWYgZHVwbGljYXRlZCBlbnVtIHZhbHVlcyBhcmUgZXhwbGljaXRseSBkaXNhbGxvd2VkLgotICAgICAgICAgIEFkZEVycm9yKGVubS0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAotICAgICAgICAgICAgICAgICAgIGVycm9yKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBHZW5lcmF0ZSB3YXJuaW5nIGlmIGR1cGxpY2F0ZWQgdmFsdWVzIGFyZSBmb3VuZCBidXQgdGhlIG9wdGlvbgotICAgICAgICAgIC8vIGlzbid0IHNldC4KLSAgICAgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCBlcnJvcjsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdXNlZF92YWx1ZXNbZW51bV92YWx1ZS0+bnVtYmVyKCldID0gZW51bV92YWx1ZS0+ZnVsbF9uYW1lKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRW51bVZhbHVlT3B0aW9ucygKLSAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiAvKiBlbnVtX3ZhbHVlICovLAotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgLyogcHJvdG8gKi8pIHsKLSAgLy8gTm90aGluZyB0byBkbyBzbyBmYXIuCi19Ci12b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVNlcnZpY2VPcHRpb25zKFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlLAotICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Ci0gIGlmIChJc0xpdGUoc2VydmljZS0+ZmlsZSgpKSAmJgotICAgICAgKHNlcnZpY2UtPmZpbGUoKS0+b3B0aW9ucygpLmNjX2dlbmVyaWNfc2VydmljZXMoKSB8fAotICAgICAgIHNlcnZpY2UtPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpKSkgewotICAgIEFkZEVycm9yKHNlcnZpY2UtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCi0gICAgICAgICAgICAgIkZpbGVzIHdpdGggb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIGNhbm5vdCBkZWZpbmUgc2VydmljZXMgIgotICAgICAgICAgICAgICJ1bmxlc3MgeW91IHNldCBib3RoIG9wdGlvbnMgY2NfZ2VuZXJpY19zZXJ2aWNlcyBhbmQgIgotICAgICAgICAgICAgICJqYXZhX2dlbmVyaWNfc2V2aWNlcyB0byBmYWxzZS4iKTsKLSAgfQotCi0gIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShzZXJ2aWNlLCBtZXRob2QsIE1ldGhvZCk7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlTWV0aG9kT3B0aW9ucyhNZXRob2REZXNjcmlwdG9yKiAvKiBtZXRob2QgKi8sCi0gICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiAvKiBwcm90byAqLykgewotICAvLyBOb3RoaW5nIHRvIGRvIHNvIGZhci4KLX0KLQotYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNYXBFbnRyeShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKLSAgaWYgKC8vIE11c3Qgbm90IGNvbnRhaW4gZXh0ZW5zaW9ucywgZXh0ZW5zaW9uIHJhbmdlIG9yIG5lc3RlZCBtZXNzYWdlIG9yCi0gICAgICAvLyBlbnVtcwotICAgICAgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCkgIT0gMCB8fAotICAgICAgZmllbGQtPmxhYmVsKCkgIT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCB8fAotICAgICAgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgIT0gMCB8fAotICAgICAgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKSAhPSAwIHx8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpICE9IDAgfHwKLSAgICAgIC8vIE11c3QgY29udGFpbiBleGFjdGx5IHR3byBmaWVsZHMKLSAgICAgIG1lc3NhZ2UtPmZpZWxkX2NvdW50KCkgIT0gMiB8fAotICAgICAgLy8gRmllbGQgbmFtZSBhbmQgbWVzc2FnZSBuYW1lIG11c3QgbWF0Y2gKLSAgICAgIG1lc3NhZ2UtPm5hbWUoKSAhPSBUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCBmYWxzZSkgKyAiRW50cnkiIHx8Ci0gICAgICAvLyBFbnRyeSBtZXNzYWdlIG11c3QgYmUgaW4gdGhlIHNhbWUgY29udGFpbmluZyB0eXBlIG9mIHRoZSBmaWVsZC4KLSAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSAhPSBtZXNzYWdlLT5jb250YWluaW5nX3R5cGUoKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5ID0gbWVzc2FnZS0+ZmllbGQoMCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWUgPSBtZXNzYWdlLT5maWVsZCgxKTsKLSAgaWYgKGtleS0+bGFiZWwoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMIHx8IGtleS0+bnVtYmVyKCkgIT0gMSB8fAotICAgICAga2V5LT5uYW1lKCkgIT0gImtleSIpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKHZhbHVlLT5sYWJlbCgpICE9IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwgfHwKLSAgICAgIHZhbHVlLT5udW1iZXIoKSAhPSAyIHx8IHZhbHVlLT5uYW1lKCkgIT0gInZhbHVlIikgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIENoZWNrIGtleSB0eXBlcyBhcmUgbGVnYWwuCi0gIHN3aXRjaCAoa2V5LT50eXBlKCkpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOgotICAgICAgQWRkRXJyb3IoCi0gICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAotICAgICAgICAgICJLZXkgaW4gbWFwIGZpZWxkcyBjYW5ub3QgYmUgZW51bSB0eXBlcy4iKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRToKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQOgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTOgotICAgICAgQWRkRXJyb3IoCi0gICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAotICAgICAgICAgICJLZXkgaW4gbWFwIGZpZWxkcyBjYW5ub3QgYmUgZmxvYXQvZG91YmxlLCBieXRlcyBvciBtZXNzYWdlIHR5cGVzLiIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMjoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0OgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzI6Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDoKLSAgICAgIC8vIExlZ2FsIGNhc2VzCi0gICAgICBicmVhazsKLSAgICAvLyBEbyBub3QgYWRkIGEgZGVmYXVsdCwgc28gdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBjb21wbGFpbiB3aGVuIG5ldyB0eXBlcwotICAgIC8vIGFyZSBhZGRlZC4KLSAgfQotCi0gIGlmICh2YWx1ZS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNKSB7Ci0gICAgaWYgKHZhbHVlLT5lbnVtX3R5cGUoKS0+dmFsdWUoMCktPm51bWJlcigpICE9IDApIHsKLSAgICAgIEFkZEVycm9yKAotICAgICAgICAgIGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKLSAgICAgICAgICAiRW51bSB2YWx1ZSBpbiBtYXAgbXVzdCBkZWZpbmUgMCBhcyB0aGUgZmlyc3QgdmFsdWUuIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkRldGVjdE1hcENvbmZsaWN0cyhjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgbWFwPHN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+IHNlZW5fdHlwZXM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgRGVzY3JpcHRvciogbmVzdGVkID0gbWVzc2FnZS0+bmVzdGVkX3R5cGUoaSk7Ci0gICAgcGFpcjxtYXA8c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj46Oml0ZXJhdG9yLCBib29sPiByZXN1bHQgPQotICAgICAgICBzZWVuX3R5cGVzLmluc2VydChzdGQ6Om1ha2VfcGFpcihuZXN0ZWQtPm5hbWUoKSwgbmVzdGVkKSk7Ci0gICAgaWYgKCFyZXN1bHQuc2Vjb25kKSB7Ci0gICAgICBpZiAocmVzdWx0LmZpcnN0LT5zZWNvbmQtPm9wdGlvbnMoKS5tYXBfZW50cnkoKSB8fAotICAgICAgICAgIG5lc3RlZC0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7Ci0gICAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAotICAgICAgICAgICAgICAgICAiRXhwYW5kZWQgbWFwIGVudHJ5IHR5cGUgIiArIG5lc3RlZC0+bmFtZSgpICsKLSAgICAgICAgICAgICAgICAgIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBuZXN0ZWQgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgIH0KLSAgICAvLyBSZWN1cnNpdmVseSB0ZXN0IG9uIHRoZSBuZXN0ZWQgdHlwZXMuCi0gICAgRGV0ZWN0TWFwQ29uZmxpY3RzKG1lc3NhZ2UtPm5lc3RlZF90eXBlKGkpLCBwcm90by5uZXN0ZWRfdHlwZShpKSk7Ci0gIH0KLSAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0ZWQgZmllbGQgbmFtZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgKytpKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG1lc3NhZ2UtPmZpZWxkKGkpOwotICAgIG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPjo6aXRlcmF0b3IgaXRlciA9Ci0gICAgICAgIHNlZW5fdHlwZXMuZmluZChmaWVsZC0+bmFtZSgpKTsKLSAgICBpZiAoaXRlciAhPSBzZWVuX3R5cGVzLmVuZCgpICYmIGl0ZXItPnNlY29uZC0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7Ci0gICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCi0gICAgICAgICAgICAgICAiRXhwYW5kZWQgbWFwIGVudHJ5IHR5cGUgIiArIGl0ZXItPnNlY29uZC0+bmFtZSgpICsKLSAgICAgICAgICAgICAgICIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgZmllbGQuIik7Ci0gICAgfQotICB9Ci0gIC8vIENoZWNrIGZvciBjb25mbGljdGVkIGVudW0gbmFtZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX2Rlc2MgPSBtZXNzYWdlLT5lbnVtX3R5cGUoaSk7Ci0gICAgbWFwPHN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+OjppdGVyYXRvciBpdGVyID0KLSAgICAgICAgc2Vlbl90eXBlcy5maW5kKGVudW1fZGVzYy0+bmFtZSgpKTsKLSAgICBpZiAoaXRlciAhPSBzZWVuX3R5cGVzLmVuZCgpICYmIGl0ZXItPnNlY29uZC0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7Ci0gICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCi0gICAgICAgICAgICAgICAiRXhwYW5kZWQgbWFwIGVudHJ5IHR5cGUgIiArIGl0ZXItPnNlY29uZC0+bmFtZSgpICsKLSAgICAgICAgICAgICAgICIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3RpbmcgZW51bSB0eXBlLiIpOwotICAgIH0KLSAgfQotICAvLyBDaGVjayBmb3IgY29uZmxpY3RlZCBvbmVvZiBuYW1lcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5vbmVvZl9kZWNsX2NvdW50KCk7ICsraSkgewotICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzYyA9IG1lc3NhZ2UtPm9uZW9mX2RlY2woaSk7Ci0gICAgbWFwPHN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+OjppdGVyYXRvciBpdGVyID0KLSAgICAgICAgc2Vlbl90eXBlcy5maW5kKG9uZW9mX2Rlc2MtPm5hbWUoKSk7Ci0gICAgaWYgKGl0ZXIgIT0gc2Vlbl90eXBlcy5lbmQoKSAmJiBpdGVyLT5zZWNvbmQtPm9wdGlvbnMoKS5tYXBfZW50cnkoKSkgewotICAgICAgQWRkRXJyb3IobWVzc2FnZS0+ZnVsbF9uYW1lKCksIHByb3RvLAotICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOQU1FLAotICAgICAgICAgICAgICAgIkV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlICIgKyBpdGVyLT5zZWNvbmQtPm5hbWUoKSArCi0gICAgICAgICAgICAgICAiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIG9uZW9mIHR5cGUuIik7Ci0gICAgfQotICB9Ci19Ci0KLQotI3VuZGVmIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLURlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6T3B0aW9uSW50ZXJwcmV0ZXIoCi0gICAgRGVzY3JpcHRvckJ1aWxkZXIqIGJ1aWxkZXIpIDogYnVpbGRlcl8oYnVpbGRlcikgewotICBHT09HTEVfQ0hFQ0soYnVpbGRlcl8pOwotfQotCi1EZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6On5PcHRpb25JbnRlcnByZXRlcigpIHsKLX0KLQotYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkludGVycHJldE9wdGlvbnMoCi0gICAgT3B0aW9uc1RvSW50ZXJwcmV0KiBvcHRpb25zX3RvX2ludGVycHJldCkgewotICAvLyBOb3RlIHRoYXQgdGhlc2UgbWF5IGJlIGluIGRpZmZlcmVudCBwb29scywgc28gd2UgY2FuJ3QgdXNlIHRoZSBzYW1lCi0gIC8vIGRlc2NyaXB0b3IgYW5kIHJlZmxlY3Rpb24gb2JqZWN0cyBvbiBib3RoLgotICBNZXNzYWdlKiBvcHRpb25zID0gb3B0aW9uc190b19pbnRlcnByZXQtPm9wdGlvbnM7Ci0gIGNvbnN0IE1lc3NhZ2UqIG9yaWdpbmFsX29wdGlvbnMgPSBvcHRpb25zX3RvX2ludGVycHJldC0+b3JpZ2luYWxfb3B0aW9uczsKLQotICBib29sIGZhaWxlZCA9IGZhbHNlOwotICBvcHRpb25zX3RvX2ludGVycHJldF8gPSBvcHRpb25zX3RvX2ludGVycHJldDsKLQotICAvLyBGaW5kIHRoZSB1bmludGVycHJldGVkX29wdGlvbiBmaWVsZCBpbiB0aGUgbXV0YWJsZSBjb3B5IG9mIHRoZSBvcHRpb25zCi0gIC8vIGFuZCBjbGVhciB0aGVtLCBzaW5jZSB3ZSdyZSBhYm91dCB0byBpbnRlcnByZXQgdGhlbS4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB1bmludGVycHJldGVkX29wdGlvbnNfZmllbGQgPQotICAgICAgb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInVuaW50ZXJwcmV0ZWRfb3B0aW9uIik7Ci0gIEdPT0dMRV9DSEVDSyh1bmludGVycHJldGVkX29wdGlvbnNfZmllbGQgIT0gTlVMTCkKLSAgICAgIDw8ICJObyBmaWVsZCBuYW1lZCBcInVuaW50ZXJwcmV0ZWRfb3B0aW9uXCIgaW4gdGhlIE9wdGlvbnMgcHJvdG8uIjsKLSAgb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uc19maWVsZCk7Ci0KLSAgLy8gRmluZCB0aGUgdW5pbnRlcnByZXRlZF9vcHRpb24gZmllbGQgaW4gdGhlIG9yaWdpbmFsIG9wdGlvbnMuCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3JpZ2luYWxfdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkID0KLSAgICAgIG9yaWdpbmFsX29wdGlvbnMtPkdldERlc2NyaXB0b3IoKS0+Ci0gICAgICAgICAgRmluZEZpZWxkQnlOYW1lKCJ1bmludGVycHJldGVkX29wdGlvbiIpOwotICBHT09HTEVfQ0hFQ0sob3JpZ2luYWxfdW5pbnRlcnByZXRlZF9vcHRpb25zX2ZpZWxkICE9IE5VTEwpCi0gICAgICA8PCAiTm8gZmllbGQgbmFtZWQgXCJ1bmludGVycHJldGVkX29wdGlvblwiIGluIHRoZSBPcHRpb25zIHByb3RvLiI7Ci0KLSAgY29uc3QgaW50IG51bV91bmludGVycHJldGVkX29wdGlvbnMgPSBvcmlnaW5hbF9vcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPgotICAgICAgRmllbGRTaXplKCpvcmlnaW5hbF9vcHRpb25zLCBvcmlnaW5hbF91bmludGVycHJldGVkX29wdGlvbnNfZmllbGQpOwotICBmb3IgKGludCBpID0gMDsgaSA8IG51bV91bmludGVycHJldGVkX29wdGlvbnM7ICsraSkgewotICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyA9IGRvd25fY2FzdDxjb25zdCBVbmludGVycHJldGVkT3B0aW9uKj4oCi0gICAgICAgICZvcmlnaW5hbF9vcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkdldFJlcGVhdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICpvcmlnaW5hbF9vcHRpb25zLCBvcmlnaW5hbF91bmludGVycHJldGVkX29wdGlvbnNfZmllbGQsIGkpKTsKLSAgICBpZiAoIUludGVycHJldFNpbmdsZU9wdGlvbihvcHRpb25zKSkgewotICAgICAgLy8gRXJyb3IgYWxyZWFkeSBhZGRlZCBieSBJbnRlcnByZXRTaW5nbGVPcHRpb24oKS4KLSAgICAgIGZhaWxlZCA9IHRydWU7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgLy8gUmVzZXQgdGhlc2UsIHNvIHdlIGRvbid0IGhhdmUgYW55IGRhbmdsaW5nIHBvaW50ZXJzLgotICB1bmludGVycHJldGVkX29wdGlvbl8gPSBOVUxMOwotICBvcHRpb25zX3RvX2ludGVycHJldF8gPSBOVUxMOwotCi0gIGlmICghZmFpbGVkKSB7Ci0gICAgLy8gSW50ZXJwcmV0U2luZ2xlT3B0aW9uKCkgYWRkZWQgdGhlIGludGVycHJldGVkIG9wdGlvbnMgaW4gdGhlCi0gICAgLy8gVW5rbm93bkZpZWxkU2V0LCBpbiBjYXNlIHRoZSBvcHRpb24gaXNuJ3QgeWV0IGtub3duIHRvIHVzLiAgTm93IHdlCi0gICAgLy8gc2VyaWFsaXplIHRoZSBvcHRpb25zIG1lc3NhZ2UgYW5kIGRlc2VyaWFsaXplIGl0IGJhY2suICBUaGF0IHdheSwgYW55Ci0gICAgLy8gb3B0aW9uIGZpZWxkcyB0aGF0IHdlIGRvIGhhcHBlbiB0byBrbm93IGFib3V0IHdpbGwgZ2V0IG1vdmVkIGZyb20gdGhlCi0gICAgLy8gVW5rbm93bkZpZWxkU2V0IGludG8gdGhlIHJlYWwgZmllbGRzLCBhbmQgdGh1cyBiZSBhdmFpbGFibGUgcmlnaHQgYXdheS4KLSAgICAvLyBJZiB0aGV5IGFyZSBub3Qga25vd24sIHRoYXQncyBPSyB0b28uIFRoZXkgd2lsbCBnZXQgcmVwYXJzZWQgaW50byB0aGUKLSAgICAvLyBVbmtub3duRmllbGRTZXQgYW5kIHdhaXQgdGhlcmUgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcGFyc2VkIGJ5IHNvbWV0aGluZwotICAgIC8vIHRoYXQgZG9lcyBrbm93IGFib3V0IHRoZSBvcHRpb25zLgotICAgIHN0cmluZyBidWY7Ci0gICAgR09PR0xFX0NIRUNLKG9wdGlvbnMtPkFwcGVuZFBhcnRpYWxUb1N0cmluZygmYnVmKSkKLSAgICAgICAgPDwgIlByb3RvY29sIG1lc3NhZ2UgY291bGQgbm90IGJlIHNlcmlhbGl6ZWQuIjsKLSAgICBHT09HTEVfQ0hFQ0sob3B0aW9ucy0+UGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhidWYpKQotICAgICAgICA8PCAiUHJvdG9jb2wgbWVzc2FnZSBzZXJpYWxpemVkIGl0c2VsZiBpbiBpbnZhbGlkIGZhc2hpb24uIjsKLSAgICBpZiAoIW9wdGlvbnMtPklzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgYnVpbGRlcl8tPkFkZFdhcm5pbmcoCi0gICAgICAgICAgb3B0aW9uc190b19pbnRlcnByZXQtPmVsZW1lbnRfbmFtZSwgKm9yaWdpbmFsX29wdGlvbnMsCi0gICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKLSAgICAgICAgICAiT3B0aW9ucyBjb3VsZCBub3QgYmUgZnVsbHkgcGFyc2VkIHVzaW5nIHRoZSBwcm90byBkZXNjcmlwdG9ycyAiCi0gICAgICAgICAgImNvbXBpbGVkIGludG8gdGhpcyBiaW5hcnkuIE1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiICsKLSAgICAgICAgICBvcHRpb25zLT5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOwotICAgIH0KLSAgfQotICByZXR1cm4gIWZhaWxlZDsKLX0KLQotYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkludGVycHJldFNpbmdsZU9wdGlvbigKLSAgICBNZXNzYWdlKiBvcHRpb25zKSB7Ci0gIC8vIEZpcnN0IGRvIHNvbWUgYmFzaWMgdmFsaWRhdGlvbi4KLSAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZV9zaXplKCkgPT0gMCkgewotICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiB1bmxlc3MgdGhlIHBhcnNlciBoYXMgZ29uZSBzZXJpb3VzbHkgYXdyeSBvcgotICAgIC8vIHNvbWVvbmUgaGFzIG1hbnVhbGx5IGNyZWF0ZWQgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uIGJhZGx5LgotICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBtdXN0IGhhdmUgYSBuYW1lLiIpOwotICB9Ci0gIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gInVuaW50ZXJwcmV0ZWRfb3B0aW9uIikgewotICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBtdXN0IG5vdCB1c2UgcmVzZXJ2ZWQgbmFtZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAiXCJ1bmludGVycHJldGVkX29wdGlvblwiLiIpOwotICB9Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogb3B0aW9uc19kZXNjcmlwdG9yID0gTlVMTDsKLSAgLy8gR2V0IHRoZSBvcHRpb25zIG1lc3NhZ2UncyBkZXNjcmlwdG9yIGZyb20gdGhlIGJ1aWxkZXIncyBwb29sLCBzbyB0aGF0IHdlCi0gIC8vIGdldCB0aGUgdmVyc2lvbiB0aGF0IGtub3dzIGFib3V0IGFueSBleHRlbnNpb24gb3B0aW9ucyBkZWNsYXJlZCBpbiB0aGUKLSAgLy8gZmlsZSB3ZSdyZSBjdXJyZW50bHkgYnVpbGRpbmcuIFRoZSBkZXNjcmlwdG9yIHNob3VsZCBiZSB0aGVyZSBhcyBsb25nIGFzCi0gIC8vIHRoZSBmaWxlIHdlJ3JlIGJ1aWxkaW5nIGltcG9ydGVkICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcnMucHJvdG8iLgotCi0gIC8vIE5vdGUgdGhhdCB3ZSB1c2UgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKCksIG5vdAotICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCkgYmVjYXVzZSB3ZSdyZSBhbHJlYWR5IGhvbGRpbmcgdGhlCi0gIC8vIHBvb2wncyBtdXRleCwgYW5kIHRoZSBsYXR0ZXIgbWV0aG9kIGxvY2tzIGl0IGFnYWluLiAgV2UgZG9uJ3QgdXNlCi0gIC8vIEZpbmRTeW1ib2woKSBiZWNhdXNlIGZpbGVzIHRoYXQgdXNlIGN1c3RvbSBvcHRpb25zIG9ubHkgbmVlZCB0byBkZXBlbmQgb24KLSAgLy8gdGhlIGZpbGUgdGhhdCBkZWZpbmVzIHRoZSBvcHRpb24sIG5vdCBkZXNjcmlwdG9yLnByb3RvIGl0c2VsZi4KLSAgU3ltYm9sIHN5bWJvbCA9IGJ1aWxkZXJfLT5GaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygKLSAgICBvcHRpb25zLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKTsKLSAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgPT0gU3ltYm9sOjpNRVNTQUdFKSB7Ci0gICAgb3B0aW9uc19kZXNjcmlwdG9yID0gc3ltYm9sLmRlc2NyaXB0b3I7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhlIG9wdGlvbnMgbWVzc2FnZSdzIGRlc2NyaXB0b3Igd2FzIG5vdCBpbiB0aGUgYnVpbGRlcidzIHBvb2wsIHNvIHVzZQotICAgIC8vIHRoZSBzdGFuZGFyZCB2ZXJzaW9uIGZyb20gdGhlIGdlbmVyYXRlZCBwb29sLiBXZSdyZSBub3QgaG9sZGluZyB0aGUKLSAgICAvLyBnZW5lcmF0ZWQgcG9vbCdzIG11dGV4LCBzbyB3ZSBjYW4gc2VhcmNoIGl0IHRoZSBzdHJhaWdodGZvcndhcmQgd2F5LgotICAgIG9wdGlvbnNfZGVzY3JpcHRvciA9IG9wdGlvbnMtPkdldERlc2NyaXB0b3IoKTsKLSAgfQotICBHT09HTEVfQ0hFQ0sob3B0aW9uc19kZXNjcmlwdG9yKTsKLQotICAvLyBXZSBpdGVyYXRlIG92ZXIgdGhlIG5hbWUgcGFydHMgdG8gZHJpbGwgaW50byB0aGUgc3VibWVzc2FnZXMgdW50aWwgd2UgZmluZAotICAvLyB0aGUgbGVhZiBmaWVsZCBmb3IgdGhlIG9wdGlvbi4gQXMgd2UgZHJpbGwgZG93biB3ZSByZW1lbWJlciB0aGUgY3VycmVudAotICAvLyBzdWJtZXNzYWdlJ3MgZGVzY3JpcHRvciBpbiB8ZGVzY3JpcHRvcnwgYW5kIHRoZSBuZXh0IGZpZWxkIGluIHRoYXQKLSAgLy8gc3VibWVzc2FnZSBpbiB8ZmllbGR8LiBXZSBhbHNvIHRyYWNrIHRoZSBmaWVsZHMgd2UncmUgZHJpbGxpbmcgZG93bgotICAvLyB0aHJvdWdoIGluIHxpbnRlcm1lZGlhdGVfZmllbGRzfC4gQXMgd2UgZ28sIHdlIHJlY29uc3RydWN0IHRoZSBmdWxsIG9wdGlvbgotICAvLyBuYW1lIGluIHxkZWJ1Z19tc2dfbmFtZXwsIGZvciB1c2UgaW4gZXJyb3IgbWVzc2FnZXMuCi0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBvcHRpb25zX2Rlc2NyaXB0b3I7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOwotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gaW50ZXJtZWRpYXRlX2ZpZWxkczsKLSAgc3RyaW5nIGRlYnVnX21zZ19uYW1lID0gIiI7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl8tPm5hbWVfc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBzdHJpbmcmIG5hbWVfcGFydCA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZShpKS5uYW1lX3BhcnQoKTsKLSAgICBpZiAoZGVidWdfbXNnX25hbWUuc2l6ZSgpID4gMCkgewotICAgICAgZGVidWdfbXNnX25hbWUgKz0gIi4iOwotICAgIH0KLSAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lKGkpLmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgICBkZWJ1Z19tc2dfbmFtZSArPSAiKCIgKyBuYW1lX3BhcnQgKyAiKSI7Ci0gICAgICAvLyBTZWFyY2ggZm9yIHRoZSBleHRlbnNpb24ncyBkZXNjcmlwdG9yIGFzIGFuIGV4dGVuc2lvbiBpbiB0aGUgYnVpbGRlcidzCi0gICAgICAvLyBwb29sLiBOb3RlIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpMb29rdXBTeW1ib2woKSwgbm90Ci0gICAgICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpLCBmb3IgdHdvIHJlYXNvbnM6IDEpIEl0IGFsbG93cwotICAgICAgLy8gcmVsYXRpdmUgbG9va3VwcywgYW5kIDIpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZSBwb29sJ3MKLSAgICAgIC8vIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uCi0gICAgICBzeW1ib2wgPSBidWlsZGVyXy0+TG9va3VwU3ltYm9sKG5hbWVfcGFydCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uc190b19pbnRlcnByZXRfLT5uYW1lX3Njb3BlKTsKLSAgICAgIGlmICghc3ltYm9sLklzTnVsbCgpICYmIHN5bWJvbC50eXBlID09IFN5bWJvbDo6RklFTEQpIHsKLSAgICAgICAgZmllbGQgPSBzeW1ib2wuZmllbGRfZGVzY3JpcHRvcjsKLSAgICAgIH0KLSAgICAgIC8vIElmIHdlIGRvbid0IGZpbmQgdGhlIGZpZWxkIHRoZW4gdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciB3YXMgbm90IGluIHRoZQotICAgICAgLy8gYnVpbGRlcidzIHBvb2wsIGJ1dCB0aGVyZSdzIG5vIHBvaW50IGluIGxvb2tpbmcgaW4gdGhlIGdlbmVyYXRlZAotICAgICAgLy8gcG9vbC4gV2UgcmVxdWlyZSB0aGF0IHlvdSBpbXBvcnQgdGhlIGZpbGUgdGhhdCBkZWZpbmVzIGFueSBleHRlbnNpb25zCi0gICAgICAvLyB5b3UgdXNlLCBzbyB0aGV5IG11c3QgYmUgcHJlc2VudCBpbiB0aGUgYnVpbGRlcidzIHBvb2wuCi0gICAgfSBlbHNlIHsKLSAgICAgIGRlYnVnX21zZ19uYW1lICs9IG5hbWVfcGFydDsKLSAgICAgIC8vIFNlYXJjaCBmb3IgdGhlIGZpZWxkJ3MgZGVzY3JpcHRvciBhcyBhIHJlZ3VsYXIgZmllbGQuCi0gICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShuYW1lX3BhcnQpOwotICAgIH0KLQotICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7Ci0gICAgICBpZiAoZ2V0X2FsbG93X3Vua25vd24oYnVpbGRlcl8tPnBvb2xfKSkgewotICAgICAgICAvLyBXZSBjYW4ndCBmaW5kIHRoZSBvcHRpb24sIGJ1dCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBpcyBlbmFibGVkLAotICAgICAgICAvLyBzbyB3ZSB3aWxsIGp1c3QgbGVhdmUgaXQgYXMgdW5pbnRlcnByZXRlZC4KLSAgICAgICAgQWRkV2l0aG91dEludGVycHJldGluZygqdW5pbnRlcnByZXRlZF9vcHRpb25fLCBvcHRpb25zKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKCEoYnVpbGRlcl8tPnVuZGVmaW5lX3Jlc29sdmVkX25hbWVfKS5lbXB0eSgpKSB7Ci0gICAgICAgIC8vIE9wdGlvbiBpcyByZXNvbHZlZCB0byBhIG5hbWUgd2hpY2ggaXMgbm90IGRlZmluZWQuCi0gICAgICAgIHJldHVybiBBZGROYW1lRXJyb3IoCi0gICAgICAgICAgICAiT3B0aW9uIFwiIiArIGRlYnVnX21zZ19uYW1lICsgIlwiIGlzIHJlc29sdmVkIHRvIFwiKCIgKwotICAgICAgICAgICAgYnVpbGRlcl8tPnVuZGVmaW5lX3Jlc29sdmVkX25hbWVfICsKLSAgICAgICAgICAgICIpXCIsIHdoaWNoIGlzIG5vdCBkZWZpbmVkLiBUaGUgaW5uZXJtb3N0IHNjb3BlIGlzIHNlYXJjaGVkIGZpcnN0ICIKLSAgICAgICAgICAgICJpbiBuYW1lIHJlc29sdXRpb24uIENvbnNpZGVyIHVzaW5nIGEgbGVhZGluZyAnLicoaS5lLiwgXCIoLiIgKwotICAgICAgICAgICAgZGVidWdfbXNnX25hbWUuc3Vic3RyKDEpICsKLSAgICAgICAgICAgICJcIikgdG8gc3RhcnQgZnJvbSB0aGUgb3V0ZXJtb3N0IHNjb3BlLiIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIFwiIiArIGRlYnVnX21zZ19uYW1lICsgIlwiIHVua25vd24uIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIGlmIChmaWVsZC0+Y29udGFpbmluZ190eXBlKCkgIT0gZGVzY3JpcHRvcikgewotICAgICAgaWYgKGdldF9pc19wbGFjZWhvbGRlcihmaWVsZC0+Y29udGFpbmluZ190eXBlKCkpKSB7Ci0gICAgICAgIC8vIFRoZSBmaWVsZCBpcyBhbiBleHRlbnNpb24gb2YgYSBwbGFjZWhvbGRlciB0eXBlLCBzbyB3ZSBjYW4ndAotICAgICAgICAvLyByZWxpYWJseSB2ZXJpZnkgd2hldGhlciBpdCBpcyBhIHZhbGlkIGV4dGVuc2lvbiB0byB1c2UgaGVyZSAoZS5nLgotICAgICAgICAvLyB3ZSBkb24ndCBrbm93IGlmIGl0IGlzIGFuIGV4dGVuc2lvbiBvZiB0aGUgY29ycmVjdCAqT3B0aW9ucyBtZXNzYWdlLAotICAgICAgICAvLyBvciBpZiBpdCBoYXMgYSB2YWxpZCBmaWVsZCBudW1iZXIsIGV0Yy4pLiAgSnVzdCBsZWF2ZSBpdCBhcwotICAgICAgICAvLyB1bmludGVycHJldGVkIGluc3RlYWQuCi0gICAgICAgIEFkZFdpdGhvdXRJbnRlcnByZXRpbmcoKnVuaW50ZXJwcmV0ZWRfb3B0aW9uXywgb3B0aW9ucyk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gVGhpcyBjYW4gb25seSBoYXBwZW4gaWYsIGR1ZSB0byBzb21lIGluc2FuZSBtaXNjb25maWd1cmF0aW9uIG9mIHRoZQotICAgICAgICAvLyBwb29scywgd2UgZmluZCB0aGUgb3B0aW9ucyBtZXNzYWdlIGluIG9uZSBwb29sIGJ1dCB0aGUgZmllbGQgaW4KLSAgICAgICAgLy8gYW5vdGhlci4gVGhpcyB3b3VsZCBwcm9iYWJseSBpbXBseSBhIGhlZnR5IGJ1ZyBzb21ld2hlcmUuCi0gICAgICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBmaWVsZCBcIiIgKyBkZWJ1Z19tc2dfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIG5vdCBhIGZpZWxkIG9yIGV4dGVuc2lvbiBvZiBtZXNzYWdlIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+bmFtZSgpICsgIlwiLiIpOwotICAgICAgfQotICAgIH0gZWxzZSBpZiAoaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmFtZV9zaXplKCkgLSAxKSB7Ci0gICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgICAgcmV0dXJuIEFkZE5hbWVFcnJvcigiT3B0aW9uIFwiIiArICBkZWJ1Z19tc2dfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIGFuIGF0b21pYyB0eXBlLCBub3QgYSBtZXNzYWdlLiIpOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gZmllbGQgXCIiICsgZGVidWdfbXNnX25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpcyBhIHJlcGVhdGVkIG1lc3NhZ2UuIFJlcGVhdGVkIG1lc3NhZ2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25zIG11c3QgYmUgaW5pdGlhbGl6ZWQgdXNpbmcgYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhZ2dyZWdhdGUgdmFsdWUuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBEcmlsbCBkb3duIGludG8gdGhlIHN1Ym1lc3NhZ2UuCi0gICAgICAgIGludGVybWVkaWF0ZV9maWVsZHMucHVzaF9iYWNrKGZpZWxkKTsKLSAgICAgICAgZGVzY3JpcHRvciA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBXZSd2ZSBmb3VuZCB0aGUgbGVhZiBmaWVsZC4gTm93IHdlIHVzZSBVbmtub3duRmllbGRTZXRzIHRvIHNldCBpdHMgdmFsdWUKLSAgLy8gb24gdGhlIG9wdGlvbnMgbWVzc2FnZS4gV2UgZG8gc28gYmVjYXVzZSB0aGUgbWVzc2FnZSBtYXkgbm90IHlldCBrbm93Ci0gIC8vIGFib3V0IGl0cyBleHRlbnNpb24gZmllbGRzLCBzbyB3ZSBtYXkgbm90IGJlIGFibGUgdG8gc2V0IHRoZSBmaWVsZHMKLSAgLy8gZGlyZWN0bHkuIEJ1dCB0aGUgVW5rbm93bkZpZWxkU2V0cyB3aWxsIHNlcmlhbGl6ZSB0byB0aGUgc2FtZSB3aXJlLWZvcm1hdAotICAvLyBtZXNzYWdlLCBzbyByZWFkaW5nIHRoYXQgbWVzc2FnZSBiYWNrIGluIG9uY2UgdGhlIGV4dGVuc2lvbiBmaWVsZHMgYXJlCi0gIC8vIGtub3duIHdpbGwgcG9wdWxhdGUgdGhlbSBjb3JyZWN0bHkuCi0KLSAgLy8gRmlyc3Qgc2VlIGlmIHRoZSBvcHRpb24gaXMgYWxyZWFkeSBzZXQuCi0gIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgIUV4YW1pbmVJZk9wdGlvbklzU2V0KAotICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHMuYmVnaW4oKSwKLSAgICAgICAgICBpbnRlcm1lZGlhdGVfZmllbGRzLmVuZCgpLAotICAgICAgICAgIGZpZWxkLCBkZWJ1Z19tc2dfbmFtZSwKLSAgICAgICAgICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkdldFVua25vd25GaWVsZHMoKm9wdGlvbnMpKSkgewotICAgIHJldHVybiBmYWxzZTsgIC8vIEV4YW1pbmVJZk9wdGlvbklzU2V0KCkgYWxyZWFkeSBhZGRlZCB0aGUgZXJyb3IuCi0gIH0KLQotCi0gIC8vIEZpcnN0IHNldCB0aGUgdmFsdWUgb24gdGhlIFVua25vd25GaWVsZFNldCBjb3JyZXNwb25kaW5nIHRvIHRoZQotICAvLyBpbm5lcm1vc3QgbWVzc2FnZS4KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxVbmtub3duRmllbGRTZXQ+IHVua25vd25fZmllbGRzKG5ldyBVbmtub3duRmllbGRTZXQoKSk7Ci0gIGlmICghU2V0T3B0aW9uVmFsdWUoZmllbGQsIHVua25vd25fZmllbGRzLmdldCgpKSkgewotICAgIHJldHVybiBmYWxzZTsgIC8vIFNldE9wdGlvblZhbHVlKCkgYWxyZWFkeSBhZGRlZCB0aGUgZXJyb3IuCi0gIH0KLQotICAvLyBOb3cgd3JhcCB0aGUgVW5rbm93bkZpZWxkU2V0IHdpdGggVW5rbm93bkZpZWxkU2V0cyBjb3JyZXNwb25kaW5nIHRvIGFsbAotICAvLyB0aGUgaW50ZXJtZWRpYXRlIG1lc3NhZ2VzLgotICBmb3IgKHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdGVyID0KLSAgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkcy5yYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGludGVybWVkaWF0ZV9maWVsZHMucmVuZCgpOyArK2l0ZXIpIHsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPFVua25vd25GaWVsZFNldD4gcGFyZW50X3Vua25vd25fZmllbGRzKAotICAgICAgICBuZXcgVW5rbm93bkZpZWxkU2V0KCkpOwotICAgIHN3aXRjaCAoKCppdGVyKS0+dHlwZSgpKSB7Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0c3RyKAotICAgICAgICAgICAgcGFyZW50X3Vua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQoKCppdGVyKS0+bnVtYmVyKCkpKTsKLSAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dCgmb3V0c3RyKTsKLSAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoKnVua25vd25fZmllbGRzLCAmb3V0KTsKLSAgICAgICAgR09PR0xFX0NIRUNLKCFvdXQuSGFkRXJyb3IoKSkKLSAgICAgICAgICAgIDw8ICJVbmV4cGVjdGVkIGZhaWx1cmUgd2hpbGUgc2VyaWFsaXppbmcgb3B0aW9uIHN1Ym1lc3NhZ2UgIgotICAgICAgICAgICAgPDwgZGVidWdfbXNnX25hbWUgPDwgIlwiLiI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDogewotICAgICAgICAgcGFyZW50X3Vua25vd25fZmllbGRzLT5BZGRHcm91cCgoKml0ZXIpLT5udW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+TWVyZ2VGcm9tKCp1bmtub3duX2ZpZWxkcyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfTUVTU0FHRTogIgotICAgICAgICAgICAgICAgICAgIDw8ICgqaXRlciktPnR5cGUoKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB1bmtub3duX2ZpZWxkcy5yZXNldChwYXJlbnRfdW5rbm93bl9maWVsZHMucmVsZWFzZSgpKTsKLSAgfQotCi0gIC8vIE5vdyBtZXJnZSB0aGUgVW5rbm93bkZpZWxkU2V0IGNvcnJlc3BvbmRpbmcgdG8gdGhlIHRvcC1sZXZlbCBtZXNzYWdlIGludG8KLSAgLy8gdGhlIG9wdGlvbnMgbWVzc2FnZS4KLSAgb3B0aW9ucy0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhvcHRpb25zKS0+TWVyZ2VGcm9tKAotICAgICAgKnVua25vd25fZmllbGRzKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OkFkZFdpdGhvdXRJbnRlcnByZXRpbmcoCi0gICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24sIE1lc3NhZ2UqIG9wdGlvbnMpIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9Ci0gICAgb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInVuaW50ZXJwcmV0ZWRfb3B0aW9uIik7Ci0gIEdPT0dMRV9DSEVDSyhmaWVsZCAhPSBOVUxMKTsKLQotICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkFkZE1lc3NhZ2Uob3B0aW9ucywgZmllbGQpCi0gICAgLT5Db3B5RnJvbSh1bmludGVycHJldGVkX29wdGlvbik7Ci19Ci0KLWJvb2wgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpFeGFtaW5lSWZPcHRpb25Jc1NldCgKLSAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGludGVybWVkaWF0ZV9maWVsZHNfaXRlciwKLSAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj46OmNvbnN0X2l0ZXJhdG9yIGludGVybWVkaWF0ZV9maWVsZHNfZW5kLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW5uZXJtb3N0X2ZpZWxkLCBjb25zdCBzdHJpbmcmIGRlYnVnX21zZ19uYW1lLAotICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpIHsKLSAgLy8gV2UgZG8gbGluZWFyIHNlYXJjaGVzIG9mIHRoZSBVbmtub3duRmllbGRTZXQgYW5kIGl0cyBzdWItZ3JvdXBzLiAgVGhpcwotICAvLyBzaG91bGQgYmUgZmluZSBzaW5jZSBpdCdzIHVubGlrZWx5IHRoYXQgYW55IG9uZSBvcHRpb25zIHN0cnVjdHVyZSB3aWxsCi0gIC8vIGNvbnRhaW4gbW9yZSB0aGFuIGEgaGFuZGZ1bCBvZiBvcHRpb25zLgotCi0gIGlmIChpbnRlcm1lZGlhdGVfZmllbGRzX2l0ZXIgPT0gaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQpIHsKLSAgICAvLyBXZSdyZSBhdCB0aGUgaW5uZXJtb3N0IHN1Ym1lc3NhZ2UuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICAgIGlmICh1bmtub3duX2ZpZWxkcy5maWVsZChpKS5udW1iZXIoKSA9PSBpbm5lcm1vc3RfZmllbGQtPm51bWJlcigpKSB7Ci0gICAgICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBcIiIgKyBkZWJ1Z19tc2dfbmFtZSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIHdhcyBhbHJlYWR5IHNldC4iKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGlmICh1bmtub3duX2ZpZWxkcy5maWVsZChpKS5udW1iZXIoKSA9PQotICAgICAgICAoKmludGVybWVkaWF0ZV9maWVsZHNfaXRlciktPm51bWJlcigpKSB7Ci0gICAgICBjb25zdCBVbmtub3duRmllbGQqIHVua25vd25fZmllbGQgPSAmdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0gICAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSA9ICgqaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyKS0+dHlwZSgpOwotICAgICAgLy8gUmVjdXJzZSBpbnRvIHRoZSBuZXh0IHN1Ym1lc3NhZ2UuCi0gICAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRToKLSAgICAgICAgICBpZiAodW5rbm93bl9maWVsZC0+dHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICAgICBVbmtub3duRmllbGRTZXQgaW50ZXJtZWRpYXRlX3Vua25vd25fZmllbGRzOwotICAgICAgICAgICAgaWYgKGludGVybWVkaWF0ZV91bmtub3duX2ZpZWxkcy5QYXJzZUZyb21TdHJpbmcoCi0gICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGQtPmxlbmd0aF9kZWxpbWl0ZWQoKSkgJiYKLSAgICAgICAgICAgICAgICAhRXhhbWluZUlmT3B0aW9uSXNTZXQoaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVybW9zdF9maWVsZCwgZGVidWdfbXNnX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybWVkaWF0ZV91bmtub3duX2ZpZWxkcykpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOyAgLy8gRXJyb3IgYWxyZWFkeSBhZGRlZC4KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6Ci0gICAgICAgICAgaWYgKHVua25vd25fZmllbGQtPnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVApIHsKLSAgICAgICAgICAgIGlmICghRXhhbWluZUlmT3B0aW9uSXNTZXQoaW50ZXJtZWRpYXRlX2ZpZWxkc19pdGVyICsgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkc19lbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlubmVybW9zdF9maWVsZCwgZGVidWdfbXNnX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGQtPmdyb3VwKCkpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsgIC8vIEVycm9yIGFscmVhZHkgYWRkZWQuCi0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkludmFsaWQgd2lyZSB0eXBlIGZvciBDUFBUWVBFX01FU1NBR0U6ICIgPDwgdHlwZTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6U2V0T3B0aW9uVmFsdWUoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25fZmllbGQsCi0gICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICAvLyBXZSBzd2l0Y2ggb24gdGhlIENwcFR5cGUgdG8gdmFsaWRhdGUuCi0gIHN3aXRjaCAob3B0aW9uX2ZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKLSAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgewotICAgICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSA+Ci0gICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjQ+KGtpbnQzMm1heCkpIHsKLSAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgb3V0IG9mIHJhbmdlIGZvciBpbnQzMiBvcHRpb24gXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNldEludDMyKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPm5lZ2F0aXZlX2ludF92YWx1ZSgpIDwKLSAgICAgICAgICAgIHN0YXRpY19jYXN0PGludDY0PihraW50MzJtaW4pKSB7Ci0gICAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG91dCBvZiByYW5nZSBmb3IgaW50MzIgb3B0aW9uIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBTZXRJbnQzMihvcHRpb25fZmllbGQtPm51bWJlcigpLAotICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+bmVnYXRpdmVfaW50X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT50eXBlKCksIHVua25vd25fZmllbGRzKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgaW50ZWdlciBmb3IgaW50MzIgb3B0aW9uIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OgotICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpID4KLSAgICAgICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWF4KSkgewotICAgICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBvdXQgb2YgcmFuZ2UgZm9yIGludDY0IG9wdGlvbiBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgU2V0SW50NjQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+dHlwZSgpLCB1bmtub3duX2ZpZWxkcyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKLSAgICAgICAgU2V0SW50NjQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwKLSAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT50eXBlKCksIHVua25vd25fZmllbGRzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIGludGVnZXIgZm9yIGludDY0IG9wdGlvbiBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6Ci0gICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKLSAgICAgICAgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkgPiBrdWludDMybWF4KSB7Ci0gICAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG91dCBvZiByYW5nZSBmb3IgdWludDMyIG9wdGlvbiBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+bmFtZSgpICsgIlwiLiIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIFNldFVJbnQzMihvcHRpb25fZmllbGQtPm51bWJlcigpLAotICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPnR5cGUoKSwgdW5rbm93bl9maWVsZHMpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciBmb3IgdWludDMyICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbiBcIiIgKyBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKLSAgICAgICAgU2V0VUludDY0KG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnBvc2l0aXZlX2ludF92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT50eXBlKCksIHVua25vd25fZmllbGRzKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIGZvciB1aW50NjQgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIFwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBmbG9hdCB2YWx1ZTsKLSAgICAgIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19kb3VibGVfdmFsdWUoKSkgewotICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+ZG91YmxlX3ZhbHVlKCk7Ci0gICAgICB9IGVsc2UgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKLSAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKLSAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPm5lZ2F0aXZlX2ludF92YWx1ZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgbnVtYmVyIGZvciBmbG9hdCBvcHRpb24gXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKLSAgICAgIH0KLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKG9wdGlvbl9maWVsZC0+bnVtYmVyKCksCi0gICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbmNvZGVGbG9hdCh2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7Ci0gICAgICBkb3VibGUgdmFsdWU7Ci0gICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfZG91YmxlX3ZhbHVlKCkpIHsKLSAgICAgICAgdmFsdWUgPSB1bmludGVycHJldGVkX29wdGlvbl8tPmRvdWJsZV92YWx1ZSgpOwotICAgICAgfSBlbHNlIGlmICh1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgewotICAgICAgICB2YWx1ZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+cG9zaXRpdmVfaW50X3ZhbHVlKCk7Ci0gICAgICB9IGVsc2UgaWYgKHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgICAgIHZhbHVlID0gdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIG51bWJlciBmb3IgZG91YmxlIG9wdGlvbiBcIiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOwotICAgICAgfQotICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVuY29kZURvdWJsZSh2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0gICAgfQotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKLSAgICAgIHVpbnQ2NCB2YWx1ZTsKLSAgICAgIGlmICghdW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7Ci0gICAgICAgIHJldHVybiBBZGRWYWx1ZUVycm9yKCJWYWx1ZSBtdXN0IGJlIGlkZW50aWZpZXIgZm9yIGJvb2xlYW4gb3B0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgICBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5pZGVudGlmaWVyX3ZhbHVlKCkgPT0gInRydWUiKSB7Ci0gICAgICAgIHZhbHVlID0gMTsKLSAgICAgIH0gZWxzZSBpZiAodW5pbnRlcnByZXRlZF9vcHRpb25fLT5pZGVudGlmaWVyX3ZhbHVlKCkgPT0gImZhbHNlIikgewotICAgICAgICB2YWx1ZSA9IDA7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiVmFsdWUgbXVzdCBiZSBcInRydWVcIiBvciBcImZhbHNlXCIgZm9yIGJvb2xlYW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIFwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG9wdGlvbl9maWVsZC0+bnVtYmVyKCksIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgaWYgKCF1bmludGVycHJldGVkX29wdGlvbl8tPmhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKLSAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgZW51bS12YWx1ZWQgb3B0aW9uICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIiArIG9wdGlvbl9maWVsZC0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gb3B0aW9uX2ZpZWxkLT5lbnVtX3R5cGUoKTsKLSAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWVfbmFtZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aWRlbnRpZmllcl92YWx1ZSgpOwotICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9IE5VTEw7Ci0KLSAgICAgIGlmIChlbnVtX3R5cGUtPmZpbGUoKS0+cG9vbCgpICE9IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKSB7Ci0gICAgICAgIC8vIE5vdGUgdGhhdCB0aGUgZW51bSB2YWx1ZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGlzIGEgc2libGluZyBvZiB0aGUKLSAgICAgICAgLy8gZW51bSdzIG5hbWUsIG5vdCBhIGNoaWxkIG9mIGl0LgotICAgICAgICBzdHJpbmcgZnVsbHlfcXVhbGlmaWVkX25hbWUgPSBlbnVtX3R5cGUtPmZ1bGxfbmFtZSgpOwotICAgICAgICBmdWxseV9xdWFsaWZpZWRfbmFtZS5yZXNpemUoZnVsbHlfcXVhbGlmaWVkX25hbWUuc2l6ZSgpIC0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudW1fdHlwZS0+bmFtZSgpLnNpemUoKSk7Ci0gICAgICAgIGZ1bGx5X3F1YWxpZmllZF9uYW1lICs9IHZhbHVlX25hbWU7Ci0KLSAgICAgICAgLy8gU2VhcmNoIGZvciB0aGUgZW51bSB2YWx1ZSdzIGRlc2NyaXB0b3IgaW4gdGhlIGJ1aWxkZXIncyBwb29sLiBOb3RlCi0gICAgICAgIC8vIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygpLCBub3QKLSAgICAgICAgLy8gRGVzY3JpcHRvclBvb2w6OkZpbmRFbnVtVmFsdWVCeU5hbWUoKSBiZWNhdXNlIHdlJ3JlIGFscmVhZHkgaG9sZGluZwotICAgICAgICAvLyB0aGUgcG9vbCdzIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uCi0gICAgICAgIFN5bWJvbCBzeW1ib2wgPQotICAgICAgICAgIGJ1aWxkZXJfLT5GaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcyhmdWxseV9xdWFsaWZpZWRfbmFtZSk7Ci0gICAgICAgIGlmICghc3ltYm9sLklzTnVsbCgpICYmIHN5bWJvbC50eXBlID09IFN5bWJvbDo6RU5VTV9WQUxVRSkgewotICAgICAgICAgIGlmIChzeW1ib2wuZW51bV92YWx1ZV9kZXNjcmlwdG9yLT50eXBlKCkgIT0gZW51bV90eXBlKSB7Ci0gICAgICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiRW51bSB0eXBlIFwiIiArIGVudW1fdHlwZS0+ZnVsbF9uYW1lKCkgKwotICAgICAgICAgICAgICAgICJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCIiICsgdmFsdWVfbmFtZSArICJcIiBmb3Igb3B0aW9uIFwiIiArCi0gICAgICAgICAgICAgICAgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArCi0gICAgICAgICAgICAgICAgIlwiLiBUaGlzIGFwcGVhcnMgdG8gYmUgYSB2YWx1ZSBmcm9tIGEgc2libGluZyB0eXBlLiIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBlbnVtX3ZhbHVlID0gc3ltYm9sLmVudW1fdmFsdWVfZGVzY3JpcHRvcjsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFRoZSBlbnVtIHR5cGUgaXMgaW4gdGhlIGdlbmVyYXRlZCBwb29sLCBzbyB3ZSBjYW4gc2VhcmNoIGZvciB0aGUKLSAgICAgICAgLy8gdmFsdWUgdGhlcmUuCi0gICAgICAgIGVudW1fdmFsdWUgPSBlbnVtX3R5cGUtPkZpbmRWYWx1ZUJ5TmFtZSh2YWx1ZV9uYW1lKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGVudW1fdmFsdWUgPT0gTlVMTCkgewotICAgICAgICByZXR1cm4gQWRkVmFsdWVFcnJvcigiRW51bSB0eXBlIFwiIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIiIgKyB2YWx1ZV9uYW1lICsgIlwiIGZvciAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gXCIiICsgb3B0aW9uX2ZpZWxkLT5mdWxsX25hbWUoKSArICJcIi4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNpZ24tZXh0ZW5zaW9uIGlzIG5vdCBhIHByb2JsZW0sIHNpbmNlIHdlIGNhc3QgZGlyZWN0bHkgZnJvbSBpbnQzMiB0bwotICAgICAgICAvLyB1aW50NjQsIHdpdGhvdXQgZmlyc3QgZ29pbmcgdGhyb3VnaCB1aW50MzIuCi0gICAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50NjQ+KHN0YXRpY19jYXN0PGludDY0PihlbnVtX3ZhbHVlLT5udW1iZXIoKSkpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgIGlmICghdW5pbnRlcnByZXRlZF9vcHRpb25fLT5oYXNfc3RyaW5nX3ZhbHVlKCkpIHsKLSAgICAgICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIlZhbHVlIG11c3QgYmUgcXVvdGVkIHN0cmluZyBmb3Igc3RyaW5nIG9wdGlvbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiIgKyBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsgIlwiLiIpOwotICAgICAgfQotICAgICAgLy8gVGhlIHN0cmluZyBoYXMgYWxyZWFkeSBiZWVuIHVucXVvdGVkIGFuZCB1bmVzY2FwZWQgYnkgdGhlIHBhcnNlci4KLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl8tPnN0cmluZ192YWx1ZSgpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgIGlmICghU2V0QWdncmVnYXRlT3B0aW9uKG9wdGlvbl9maWVsZCwgdW5rbm93bl9maWVsZHMpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOjpPcHRpb25JbnRlcnByZXRlcjo6QWdncmVnYXRlT3B0aW9uRmluZGVyCi0gICAgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmluZGVyIHsKLSBwdWJsaWM6Ci0gIERlc2NyaXB0b3JCdWlsZGVyKiBidWlsZGVyXzsKLQotICB2aXJ0dWFsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbigKLSAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgewotICAgIGFzc2VydF9tdXRleF9oZWxkKGJ1aWxkZXJfLT5wb29sXyk7Ci0gICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKLSAgICBTeW1ib2wgcmVzdWx0ID0gYnVpbGRlcl8tPkxvb2t1cFN5bWJvbE5vUGxhY2Vob2xkZXIoCi0gICAgICAgIG5hbWUsIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpKTsKLSAgICBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpGSUVMRCAmJgotICAgICAgICByZXN1bHQuZmllbGRfZGVzY3JpcHRvci0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICAgIHJldHVybiByZXN1bHQuZmllbGRfZGVzY3JpcHRvcjsKLSAgICB9IGVsc2UgaWYgKHJlc3VsdC50eXBlID09IFN5bWJvbDo6TUVTU0FHRSAmJgotICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKLSAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fdHlwZSA9IHJlc3VsdC5kZXNjcmlwdG9yOwotICAgICAgLy8gVGhlIHRleHQgZm9ybWF0IGFsbG93cyBNZXNzYWdlU2V0IGl0ZW1zIHRvIGJlIHNwZWNpZmllZCB1c2luZwotICAgICAgLy8gdGhlIHR5cGUgbmFtZSwgcmF0aGVyIHRoYW4gdGhlIGV4dGVuc2lvbiBpZGVudGlmaWVyLiBJZiB0aGUgc3ltYm9sCi0gICAgICAvLyBsb29rdXAgcmV0dXJuZWQgYSBNZXNzYWdlLCBhbmQgdGhlIGVuY2xvc2luZyBNZXNzYWdlIGhhcwotICAgICAgLy8gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlLCB0aGVuIHJldHVybiB0aGUgbWVzc2FnZSBzZXQKLSAgICAgIC8vIGV4dGVuc2lvbiwgaWYgb25lIGV4aXN0cy4KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9yZWlnbl90eXBlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gZm9yZWlnbl90eXBlLT5leHRlbnNpb24oaSk7Ci0gICAgICAgIGlmIChleHRlbnNpb24tPmNvbnRhaW5pbmdfdHlwZSgpID09IGRlc2NyaXB0b3IgJiYKLSAgICAgICAgICAgIGV4dGVuc2lvbi0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCi0gICAgICAgICAgICBleHRlbnNpb24tPmlzX29wdGlvbmFsKCkgJiYKLSAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV90eXBlKCkgPT0gZm9yZWlnbl90eXBlKSB7Ci0gICAgICAgICAgLy8gRm91bmQgaXQuCi0gICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gTlVMTDsKLSAgfQotfTsKLQotLy8gQSBjdXN0b20gZXJyb3IgY29sbGVjdG9yIHRvIHJlY29yZCBhbnkgdGV4dC1mb3JtYXQgcGFyc2luZyBlcnJvcnMKLW5hbWVzcGFjZSB7Ci1jbGFzcyBBZ2dyZWdhdGVFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgewotIHB1YmxpYzoKLSAgc3RyaW5nIGVycm9yXzsKLQotICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoaW50IC8qIGxpbmUgKi8sIGludCAvKiBjb2x1bW4gKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBpZiAoIWVycm9yXy5lbXB0eSgpKSB7Ci0gICAgICBlcnJvcl8gKz0gIjsgIjsKLSAgICB9Ci0gICAgZXJyb3JfICs9IG1lc3NhZ2U7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhpbnQgLyogbGluZSAqLywgaW50IC8qIGNvbHVtbiAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiAvKiBtZXNzYWdlICovKSB7Ci0gICAgLy8gSWdub3JlIHdhcm5pbmdzCi0gIH0KLX07Ci19Ci0KLS8vIFdlIGNvbnN0cnVjdCBhIGR5bmFtaWMgbWVzc2FnZSBvZiB0aGUgdHlwZSBjb3JyZXNwb25kaW5nIHRvCi0vLyBvcHRpb25fZmllbGQsIHBhcnNlIHRoZSBzdXBwbGllZCB0ZXh0LWZvcm1hdCBzdHJpbmcgaW50byB0aGlzCi0vLyBtZXNzYWdlLCBhbmQgc2VyaWFsaXplIHRoZSByZXN1bHRpbmcgbWVzc2FnZSB0byBwcm9kdWNlIHRoZSB2YWx1ZS4KLWJvb2wgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRBZ2dyZWdhdGVPcHRpb24oCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25fZmllbGQsCi0gICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICBpZiAoIXVuaW50ZXJwcmV0ZWRfb3B0aW9uXy0+aGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7Ci0gICAgcmV0dXJuIEFkZFZhbHVlRXJyb3IoIk9wdGlvbiBcIiIgKyBvcHRpb25fZmllbGQtPmZ1bGxfbmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgYSBtZXNzYWdlLiBUbyBzZXQgdGhlIGVudGlyZSBtZXNzYWdlLCB1c2UgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggbGlrZSBcIiIgKyBvcHRpb25fZmllbGQtPm5hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgIiA9IHsgPHByb3RvIHRleHQgZm9ybWF0PiB9XCIuICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiVG8gc2V0IGZpZWxkcyB3aXRoaW4gaXQsIHVzZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInN5bnRheCBsaWtlIFwiIiArIG9wdGlvbl9maWVsZC0+bmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAiLmZvbyA9IHZhbHVlXCIuIik7Ci0gIH0KLQotICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlID0gb3B0aW9uX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlPiBkeW5hbWljKGR5bmFtaWNfZmFjdG9yeV8uR2V0UHJvdG90eXBlKHR5cGUpLT5OZXcoKSk7Ci0gIEdPT0dMRV9DSEVDSyhkeW5hbWljLmdldCgpICE9IE5VTEwpCi0gICAgICA8PCAiQ291bGQgbm90IGNyZWF0ZSBhbiBpbnN0YW5jZSBvZiAiIDw8IG9wdGlvbl9maWVsZC0+RGVidWdTdHJpbmcoKTsKLQotICBBZ2dyZWdhdGVFcnJvckNvbGxlY3RvciBjb2xsZWN0b3I7Ci0gIEFnZ3JlZ2F0ZU9wdGlvbkZpbmRlciBmaW5kZXI7Ci0gIGZpbmRlci5idWlsZGVyXyA9IGJ1aWxkZXJfOwotICBUZXh0Rm9ybWF0OjpQYXJzZXIgcGFyc2VyOwotICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmNvbGxlY3Rvcik7Ci0gIHBhcnNlci5TZXRGaW5kZXIoJmZpbmRlcik7Ci0gIGlmICghcGFyc2VyLlBhcnNlRnJvbVN0cmluZyh1bmludGVycHJldGVkX29wdGlvbl8tPmFnZ3JlZ2F0ZV92YWx1ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHluYW1pYy5nZXQoKSkpIHsKLSAgICBBZGRWYWx1ZUVycm9yKCJFcnJvciB3aGlsZSBwYXJzaW5nIG9wdGlvbiB2YWx1ZSBmb3IgXCIiICsKLSAgICAgICAgICAgICAgICAgIG9wdGlvbl9maWVsZC0+bmFtZSgpICsgIlwiOiAiICsgY29sbGVjdG9yLmVycm9yXyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHN0cmluZyBzZXJpYWw7Ci0gICAgZHluYW1pYy0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbCk7ICAvLyBOZXZlciBmYWlscwotICAgIGlmIChvcHRpb25fZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSkgewotICAgICAgdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZChvcHRpb25fZmllbGQtPm51bWJlcigpLCBzZXJpYWwpOwotICAgIH0gZWxzZSB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfRVEob3B0aW9uX2ZpZWxkLT50eXBlKCksICBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApOwotICAgICAgVW5rbm93bkZpZWxkU2V0KiBncm91cCA9IHVua25vd25fZmllbGRzLT5BZGRHcm91cChvcHRpb25fZmllbGQtPm51bWJlcigpKTsKLSAgICAgIGdyb3VwLT5QYXJzZUZyb21TdHJpbmcoc2VyaWFsKTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldEludDMyKGludCBudW1iZXIsIGludDMyIHZhbHVlLAotICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlLCBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgotICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChudW1iZXIsCi0gICAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4oc3RhdGljX2Nhc3Q8aW50NjQ+KHZhbHVlKSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjoKLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKG51bWJlciwgc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzI6Ci0gICAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwKLSAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlppZ1phZ0VuY29kZTMyKHZhbHVlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGRlZmF1bHQ6Ci0gICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiSW52YWxpZCB3aXJlIHR5cGUgZm9yIENQUFRZUEVfSU5UMzI6ICIgPDwgdHlwZTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6Ok9wdGlvbkludGVycHJldGVyOjpTZXRJbnQ2NChpbnQgbnVtYmVyLCBpbnQ2NCB2YWx1ZSwKLSAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSwgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICBzd2l0Y2ggKHR5cGUpIHsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NDoKLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgotICAgICAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQobnVtYmVyLCBzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7Ci0gICAgICBicmVhazsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NDoKLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQobnVtYmVyLAotICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlNjQodmFsdWUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJJbnZhbGlkIHdpcmUgdHlwZSBmb3IgQ1BQVFlQRV9JTlQ2NDogIiA8PCB0eXBlOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldFVJbnQzMihpbnQgbnVtYmVyLCB1aW50MzIgdmFsdWUsCi0gICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyOgotICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChudW1iZXIsIHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKG51bWJlciwgc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkludmFsaWQgd2lyZSB0eXBlIGZvciBDUFBUWVBFX1VJTlQzMjogIiA8PCB0eXBlOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6T3B0aW9uSW50ZXJwcmV0ZXI6OlNldFVJbnQ2NChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUsCi0gICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUsIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0OgotICAgICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChudW1iZXIsIHZhbHVlKTsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NDoKLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KG51bWJlciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0KLSAgICBkZWZhdWx0OgotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkludmFsaWQgd2lyZSB0eXBlIGZvciBDUFBUWVBFX1VJTlQ2NDogIiA8PCB0eXBlOwotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6TG9nVW51c2VkRGVwZW5kZW5jeShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHJlc3VsdCkgewotCi0gIGlmICghdW51c2VkX2RlcGVuZGVuY3lfLmVtcHR5KCkpIHsKLSAgICBzdGQ6OnNldDxzdHJpbmc+IGFubm90YXRpb25fZXh0ZW5zaW9uczsKLSAgICBhbm5vdGF0aW9uX2V4dGVuc2lvbnMuaW5zZXJ0KCJnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMiKTsKLSAgICBhbm5vdGF0aW9uX2V4dGVuc2lvbnMuaW5zZXJ0KCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMiKTsKLSAgICBhbm5vdGF0aW9uX2V4dGVuc2lvbnMuaW5zZXJ0KCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIik7Ci0gICAgYW5ub3RhdGlvbl9leHRlbnNpb25zLmluc2VydCgiZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIik7Ci0gICAgYW5ub3RhdGlvbl9leHRlbnNpb25zLmluc2VydCgiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMiKTsKLSAgICBhbm5vdGF0aW9uX2V4dGVuc2lvbnMuaW5zZXJ0KCJnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMiKTsKLSAgICBhbm5vdGF0aW9uX2V4dGVuc2lvbnMuaW5zZXJ0KCJnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyIpOwotICAgIGFubm90YXRpb25fZXh0ZW5zaW9ucy5pbnNlcnQoImdvb2dsZS5wcm90b2J1Zi5TdHJlYW1PcHRpb25zIik7Ci0gICAgZm9yIChzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPjo6Y29uc3RfaXRlcmF0b3IKLSAgICAgICAgICAgICBpdCA9IHVudXNlZF9kZXBlbmRlbmN5Xy5iZWdpbigpOwotICAgICAgICAgaXQgIT0gdW51c2VkX2RlcGVuZGVuY3lfLmVuZCgpOyArK2l0KSB7Ci0gICAgICAvLyBEbyBub3QgbG9nIHdhcm5pbmdzIGZvciBwcm90byBmaWxlcyB3aGljaCBleHRlbmQgYW5ub3RhdGlvbnMuCi0gICAgICBpbnQgaTsKLSAgICAgIGZvciAoaSA9IDAgOyBpIDwgKCppdCktPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKLSAgICAgICAgaWYgKGFubm90YXRpb25fZXh0ZW5zaW9ucy5maW5kKAotICAgICAgICAgICAgICAgICgqaXQpLT5leHRlbnNpb24oaSktPmNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSkKLSAgICAgICAgICAgICE9IGFubm90YXRpb25fZXh0ZW5zaW9ucy5lbmQoKSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBMb2cgd2FybmluZ3MgZm9yIHVudXNlZCBpbXBvcnRlZCBmaWxlcy4KLSAgICAgIGlmIChpID09ICgqaXQpLT5leHRlbnNpb25fY291bnQoKSkgewotICAgICAgICBzdHJpbmcgZXJyb3JfbWVzc2FnZSA9ICJJbXBvcnQgIiArICgqaXQpLT5uYW1lKCkgKyAiIGJ1dCBub3QgdXNlZC4iOwotICAgICAgICBBZGRXYXJuaW5nKCgqaXQpLT5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAotICAgICAgICAgICAgICAgICAgIGVycm9yX21lc3NhZ2UpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNlY2MwYTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxOTEyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgY2xhc3NlcyB3aGljaCBkZXNjcmliZSBhIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZS4KLS8vIFlvdSBjYW4gdXNlIGEgbWVzc2FnZSdzIGRlc2NyaXB0b3IgdG8gbGVhcm4gYXQgcnVudGltZSB3aGF0IGZpZWxkcwotLy8gaXQgY29udGFpbnMgYW5kIHdoYXQgdGhlIHR5cGVzIG9mIHRob3NlIGZpZWxkcyBhcmUuICBUaGUgTWVzc2FnZQotLy8gaW50ZXJmYWNlIGFsc28gYWxsb3dzIHlvdSB0byBkeW5hbWljYWxseSBhY2Nlc3MgYW5kIG1vZGlmeSBpbmRpdmlkdWFsCi0vLyBmaWVsZHMgYnkgcGFzc2luZyB0aGUgRmllbGREZXNjcmlwdG9yIG9mIHRoZSBmaWVsZCB5b3UgYXJlIGludGVyZXN0ZWQKLS8vIGluLgotLy8KLS8vIE1vc3QgdXNlcnMgd2lsbCBub3QgY2FyZSBhYm91dCBkZXNjcmlwdG9ycywgYmVjYXVzZSB0aGV5IHdpbGwgd3JpdGUKLS8vIGNvZGUgc3BlY2lmaWMgdG8gY2VydGFpbiBwcm90b2NvbCB0eXBlcyBhbmQgd2lsbCBzaW1wbHkgdXNlIHRoZSBjbGFzc2VzCi0vLyBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyIGRpcmVjdGx5LiAgQWR2YW5jZWQgdXNlcnMgd2hvIHdhbnQKLS8vIHRvIG9wZXJhdGUgb24gYXJiaXRyYXJ5IHR5cGVzIChub3Qga25vd24gYXQgY29tcGlsZSB0aW1lKSBtYXkgd2FudCB0bwotLy8gcmVhZCBkZXNjcmlwdG9ycyBpbiBvcmRlciB0byBsZWFybiBhYm91dCB0aGUgY29udGVudHMgb2YgYSBtZXNzYWdlLgotLy8gQSB2ZXJ5IHNtYWxsIG51bWJlciBvZiB1c2VycyB3aWxsIHdhbnQgdG8gY29uc3RydWN0IHRoZWlyIG93bgotLy8gRGVzY3JpcHRvcnMsIGVpdGhlciBiZWNhdXNlIHRoZXkgYXJlIGltcGxlbWVudGluZyBNZXNzYWdlIG1hbnVhbGx5IG9yCi0vLyBiZWNhdXNlIHRoZXkgYXJlIHdyaXRpbmcgc29tZXRoaW5nIGxpa2UgdGhlIHByb3RvY29sIGNvbXBpbGVyLgotLy8KLS8vIEZvciBhbiBleGFtcGxlIG9mIGhvdyB5b3UgbWlnaHQgdXNlIGRlc2NyaXB0b3JzLCBzZWUgdGhlIGNvZGUgZXhhbXBsZQotLy8gYXQgdGhlIHRvcCBvZiBtZXNzYWdlLmguCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0hfXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHNldD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2NvcGVkX3B0ci5oPgotCi0vLyBUWVBFX0JPT0wgaXMgZGVmaW5lZCBpbiB0aGUgTWFjT1MncyBDb25kaXRpb25hbE1hY3Jvcy5oLgotI2lmZGVmIFRZUEVfQk9PTAotI3VuZGVmIFRZUEVfQk9PTAotI2VuZGlmICAvLyBUWVBFX0JPT0wKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0vLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KLWNsYXNzIERlc2NyaXB0b3I7Ci1jbGFzcyBGaWVsZERlc2NyaXB0b3I7Ci1jbGFzcyBPbmVvZkRlc2NyaXB0b3I7Ci1jbGFzcyBFbnVtRGVzY3JpcHRvcjsKLWNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7Ci1jbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKLWNsYXNzIE1ldGhvZERlc2NyaXB0b3I7Ci1jbGFzcyBGaWxlRGVzY3JpcHRvcjsKLWNsYXNzIERlc2NyaXB0b3JEYXRhYmFzZTsKLWNsYXNzIERlc2NyaXB0b3JQb29sOwotCi0vLyBEZWZpbmVkIGluIGRlc2NyaXB0b3IucHJvdG8KLWNsYXNzIERlc2NyaXB0b3JQcm90bzsKLWNsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvOwotY2xhc3MgT25lb2ZEZXNjcmlwdG9yUHJvdG87Ci1jbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvOwotY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOwotY2xhc3MgU2VydmljZURlc2NyaXB0b3JQcm90bzsKLWNsYXNzIE1ldGhvZERlc2NyaXB0b3JQcm90bzsKLWNsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG87Ci1jbGFzcyBNZXNzYWdlT3B0aW9uczsKLWNsYXNzIEZpZWxkT3B0aW9uczsKLWNsYXNzIEVudW1PcHRpb25zOwotY2xhc3MgRW51bVZhbHVlT3B0aW9uczsKLWNsYXNzIFNlcnZpY2VPcHRpb25zOwotY2xhc3MgTWV0aG9kT3B0aW9uczsKLWNsYXNzIEZpbGVPcHRpb25zOwotY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbjsKLWNsYXNzIFNvdXJjZUNvZGVJbmZvOwotCi0vLyBEZWZpbmVkIGluIG1lc3NhZ2UuaAotY2xhc3MgTWVzc2FnZTsKLQotLy8gRGVmaW5lZCBpbiBkZXNjcmlwdG9yLmNjCi1jbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKLWNsYXNzIEZpbGVEZXNjcmlwdG9yVGFibGVzOwotCi0vLyBEZWZpbmVkIGluIHVua25vd25fZmllbGRfc2V0LmguCi1jbGFzcyBVbmtub3duRmllbGQ7Ci0KLS8vIERlZmluZWQgaW4gZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oLgotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIERlZmluZWQgaW4gY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYwotbmFtZXNwYWNlIGNvbXBpbGVyIHsKLWNsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOwotfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCi0KLW5hbWVzcGFjZSBkZXNjcmlwdG9yX3VuaXR0ZXN0IHsKLWNsYXNzIERlc2NyaXB0b3JUZXN0OwotfSAgLy8gbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QKLQotLy8gRGVmaW5lZCBpbiBwcmludGVyLmgKLW5hbWVzcGFjZSBpbyB7Ci1jbGFzcyBQcmludGVyOwotfSAgLy8gbmFtZXNwYWNlIGlvCi0KLS8vIE5CLCBhbGwgaW5kaWNlcyBhcmUgemVyby1iYXNlZC4KLXN0cnVjdCBTb3VyY2VMb2NhdGlvbiB7Ci0gIGludCBzdGFydF9saW5lOwotICBpbnQgZW5kX2xpbmU7Ci0gIGludCBzdGFydF9jb2x1bW47Ci0gIGludCBlbmRfY29sdW1uOwotCi0gIC8vIERvYyBjb21tZW50cyBmb3VuZCBhdCB0aGUgc291cmNlIGxvY2F0aW9uLgotICAvLyBTZWUgdGhlIGNvbW1lbnRzIGluIFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIChkZXNjcmlwdG9yLnByb3RvKSBmb3IgZGV0YWlscy4KLSAgc3RyaW5nIGxlYWRpbmdfY29tbWVudHM7Ci0gIHN0cmluZyB0cmFpbGluZ19jb21tZW50czsKLSAgdmVjdG9yPHN0cmluZz4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50czsKLX07Ci0KLS8vIE9wdGlvbnMgd2hlbiBnZW5lcmF0aW5nIG1hY2hpbmUtcGFyc2FibGUgb3V0cHV0IGZyb20gYSBkZXNjcmlwdG9yIHdpdGgKLS8vIERlYnVnU3RyaW5nKCkuCi1zdHJ1Y3QgRGVidWdTdHJpbmdPcHRpb25zIHsKLSAgLy8gaW5jbHVkZSBvcmlnaW5hbCB1c2VyIGNvbW1lbnRzIGFzIHJlY29yZGVkIGluIFNvdXJjZUxvY2F0aW9uIGVudHJpZXMuIE4uQi4KLSAgLy8gdGhhdCB0aGlzIG11c3QgYmUgfGZhbHNlfCBieSBkZWZhdWx0OiBzZXZlcmFsIG90aGVyIHBpZWNlcyBvZiBjb2RlIChmb3IKLSAgLy8gZXhhbXBsZSwgdGhlIEMrKyBjb2RlIGdlbmVyYXRpb24gZm9yIGZpZWxkcyBpbiB0aGUgcHJvdG8gY29tcGlsZXIpIHJlbHkgb24KLSAgLy8gRGVidWdTdHJpbmcoKSBvdXRwdXQgYmVpbmcgdW5vYnN0cnVjdGVkIGJ5IHVzZXIgY29tbWVudHMuCi0gIGJvb2wgaW5jbHVkZV9jb21tZW50czsKLSAgLy8gSWYgdHJ1ZSwgZWxpZGUgdGhlIGJyYWNlZCBib2R5IGluIHRoZSBkZWJ1ZyBzdHJpbmcuCi0gIGJvb2wgZWxpZGVfZ3JvdXBfYm9keTsKLSAgYm9vbCBlbGlkZV9vbmVvZl9ib2R5OwotCi0gIERlYnVnU3RyaW5nT3B0aW9ucygpCi0gICAgICA6IGluY2x1ZGVfY29tbWVudHMoZmFsc2UpLAotICAgICAgICBlbGlkZV9ncm91cF9ib2R5KGZhbHNlKSwKLSAgICAgICAgZWxpZGVfb25lb2ZfYm9keShmYWxzZSkge30KLX07Ci0KLS8vIERlc2NyaWJlcyBhIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSwgb3IgYSBwYXJ0aWN1bGFyIGdyb3VwIHdpdGhpbiBhCi0vLyBtZXNzYWdlLiAgVG8gb2J0YWluIHRoZSBEZXNjcmlwdG9yIGZvciBhIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LCBjYWxsCi0vLyBNZXNzYWdlOjpHZXREZXNjcmlwdG9yKCkuICBHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGFsc28gaGF2ZSBhCi0vLyBzdGF0aWMgbWV0aG9kIGNhbGxlZCBkZXNjcmlwdG9yKCkgd2hpY2ggcmV0dXJucyB0aGUgdHlwZSdzIGRlc2NyaXB0b3IuCi0vLyBVc2UgRGVzY3JpcHRvclBvb2wgdG8gY29uc3RydWN0IHlvdXIgb3duIGRlc2NyaXB0b3JzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3IgewotIHB1YmxpYzoKLSAgLy8gVGhlIG5hbWUgb2YgdGhlIG1lc3NhZ2UgdHlwZSwgbm90IGluY2x1ZGluZyBpdHMgc2NvcGUuCi0gIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OwotCi0gIC8vIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbWVzc2FnZSB0eXBlLCBzY29wZSBkZWxpbWl0ZWQgYnkKLSAgLy8gcGVyaW9kcy4gIEZvciBleGFtcGxlLCBtZXNzYWdlIHR5cGUgIkZvbyIgd2hpY2ggaXMgZGVjbGFyZWQgaW4gcGFja2FnZQotICAvLyAiYmFyIiBoYXMgZnVsbCBuYW1lICJiYXIuRm9vIi4gIElmIGEgdHlwZSAiQmF6IiBpcyBuZXN0ZWQgd2l0aGluCi0gIC8vIEZvbywgQmF6J3MgZnVsbF9uYW1lIGlzICJiYXIuRm9vLkJheiIuICBUbyBnZXQgb25seSB0aGUgcGFydCB0aGF0Ci0gIC8vIGNvbWVzIGFmdGVyIHRoZSBsYXN0ICcuJywgdXNlIG5hbWUoKS4KLSAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKLQotICAvLyBJbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIHRoZSBmaWxlIG9yIGNvbnRhaW5pbmcgdHlwZSdzIG1lc3NhZ2UKLSAgLy8gdHlwZSBhcnJheS4KLSAgaW50IGluZGV4KCkgY29uc3Q7Ci0KLSAgLy8gVGhlIC5wcm90byBmaWxlIGluIHdoaWNoIHRoaXMgbWVzc2FnZSB0eXBlIHdhcyBkZWZpbmVkLiAgTmV2ZXIgTlVMTC4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUoKSBjb25zdDsKLQotICAvLyBJZiB0aGlzIERlc2NyaXB0b3IgZGVzY3JpYmVzIGEgbmVzdGVkIHR5cGUsIHRoaXMgcmV0dXJucyB0aGUgdHlwZQotICAvLyBpbiB3aGljaCBpdCBpcyBuZXN0ZWQuICBPdGhlcndpc2UsIHJldHVybnMgTlVMTC4KLSAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7Ci0KLSAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUKLSAgLy8gYnkgcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIHRoZSBtZXNzYWdlIGRlZmluaXRpb24uCi0gIC8vIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBNZXNzYWdlT3B0aW9ucyBpbgotICAvLyBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0Ci0gIC8vIG1lc3NhZ2UuCi0gIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0KLSAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgRGVzY3JpcHRvciBpbnRvIHRoZSBnaXZlbiBEZXNjcmlwdG9yUHJvdG8uCi0gIC8vIFRoZSB0YXJnZXQgRGVzY3JpcHRvclByb3RvIG11c3QgYmUgY2xlYXIgYmVmb3JlIGNhbGxpbmcgdGhpczsgaWYgaXQKLSAgLy8gaXNuJ3QsIHRoZSByZXN1bHQgbWF5IGJlIGdhcmJhZ2UuCi0gIHZvaWQgQ29weVRvKERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OwotCi0gIC8vIFdyaXRlIHRoZSBjb250ZW50cyBvZiB0aGlzIGRlY3JpcHRvciBpbiBhIGh1bWFuLXJlYWRhYmxlIGZvcm0uIE91dHB1dAotICAvLyB3aWxsIGJlIHN1aXRhYmxlIGZvciByZS1wYXJzaW5nLgotICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKLQotICAvLyBTaW1pbGFyIHRvIERlYnVnU3RyaW5nKCksIGJ1dCBhZGRpdGlvbmFsbHkgdGFrZXMgb3B0aW9ucyAoZS5nLiwKLSAgLy8gaW5jbHVkZSBvcmlnaW5hbCB1c2VyIGNvbW1lbnRzIGluIG91dHB1dCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgYW4gdW5rbm93biB0eXBlLiBUaGlzIHdpbGwKLSAgLy8gb25seSBiZSB0aGUgY2FzZSBpZiB0aGlzIGRlc2NyaXB0b3IgY29tZXMgZnJvbSBhIERlc2NyaXB0b3JQb29sCi0gIC8vIHdpdGggQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgc2V0LgotICBib29sIGlzX3BsYWNlaG9sZGVyKCkgY29uc3Q7Ci0KLSAgLy8gRmllbGQgc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBUaGUgbnVtYmVyIG9mIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4KLSAgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7Ci0gIC8vIEdldHMgYSBmaWVsZCBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IGZpZWxkX2NvdW50KCkuCi0gIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gTG9va3MgdXAgYSBmaWVsZCBieSBkZWNsYXJlZCB0YWcgbnVtYmVyLiAgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggZmllbGQKLSAgLy8gZXhpc3RzLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5TnVtYmVyKGludCBudW1iZXIpIGNvbnN0OwotICAvLyBMb29rcyB1cCBhIGZpZWxkIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBmaWVsZCBleGlzdHMuCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEZpZWxkQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0KLSAgLy8gTG9va3MgdXAgYSBmaWVsZCBieSBsb3dlcmNhc2VkIG5hbWUgKGFzIHJldHVybmVkIGJ5IGxvd2VyY2FzZV9uYW1lKCkpLgotICAvLyBUaGlzIGxvb2t1cCBtYXkgYmUgYW1iaWd1b3VzIGlmIG11bHRpcGxlIGZpZWxkIG5hbWVzIGRpZmZlciBvbmx5IGJ5IGNhc2UsCi0gIC8vIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkIHJldHVybmVkIGlzIGNob3NlbiBhcmJpdHJhcmlseSBmcm9tIHRoZSBtYXRjaGVzLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKLSAgICAgIGNvbnN0IHN0cmluZyYgbG93ZXJjYXNlX25hbWUpIGNvbnN0OwotCi0gIC8vIExvb2tzIHVwIGEgZmllbGQgYnkgY2FtZWwtY2FzZSBuYW1lIChhcyByZXR1cm5lZCBieSBjYW1lbGNhc2VfbmFtZSgpKS4KLSAgLy8gVGhpcyBsb29rdXAgbWF5IGJlIGFtYmlndW91cyBpZiBtdWx0aXBsZSBmaWVsZCBuYW1lcyBkaWZmZXIgaW4gYSB3YXkgdGhhdAotICAvLyBsZWFkcyB0aGVtIHRvIGhhdmUgaWRlbnRpY2FsIGNhbWVsLWNhc2UgbmFtZXMsIGluIHdoaWNoIGNhc2UgdGhlIGZpZWxkCi0gIC8vIHJldHVybmVkIGlzIGNob3NlbiBhcmJpdHJhcmlseSBmcm9tIHRoZSBtYXRjaGVzLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgKLSAgICAgIGNvbnN0IHN0cmluZyYgY2FtZWxjYXNlX25hbWUpIGNvbnN0OwotCi0gIC8vIFRoZSBudW1iZXIgb2Ygb25lb2ZzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgotICBpbnQgb25lb2ZfZGVjbF9jb3VudCgpIGNvbnN0OwotICAvLyBHZXQgYSBvbmVvZiBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IG9uZW9mX2RlY2xfY291bnQoKS4KLSAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVjbChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIExvb2tzIHVwIGEgb25lb2YgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIG9uZW9mIGV4aXN0cy4KLSAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBGaW5kT25lb2ZCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLQotICAvLyBOZXN0ZWQgdHlwZSBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIFRoZSBudW1iZXIgb2YgbmVzdGVkIHR5cGVzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgotICBpbnQgbmVzdGVkX3R5cGVfY291bnQoKSBjb25zdDsKLSAgLy8gR2V0cyBhIG5lc3RlZCB0eXBlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgbmVzdGVkX3R5cGVfY291bnQoKS4KLSAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gIGNvbnN0IERlc2NyaXB0b3IqIG5lc3RlZF90eXBlKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gTG9va3MgdXAgYSBuZXN0ZWQgdHlwZSBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggbmVzdGVkIHR5cGUKLSAgLy8gZXhpc3RzLgotICBjb25zdCBEZXNjcmlwdG9yKiBGaW5kTmVzdGVkVHlwZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotCi0gIC8vIEVudW0gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gVGhlIG51bWJlciBvZiBlbnVtIHR5cGVzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgotICBpbnQgZW51bV90eXBlX2NvdW50KCkgY29uc3Q7Ci0gIC8vIEdldHMgYW4gZW51bSB0eXBlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgZW51bV90eXBlX2NvdW50KCkuCi0gIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgotICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gTG9va3MgdXAgYW4gZW51bSB0eXBlIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCBlbnVtIHR5cGUgZXhpc3RzLgotICBjb25zdCBFbnVtRGVzY3JpcHRvciogRmluZEVudW1UeXBlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0KLSAgLy8gTG9va3MgdXAgYW4gZW51bSB2YWx1ZSBieSBuYW1lLCBhbW9uZyBhbGwgZW51bSB0eXBlcyBpbiB0aGlzIG1lc3NhZ2UuCi0gIC8vIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIHZhbHVlIGV4aXN0cy4KLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotCi0gIC8vIEV4dGVuc2lvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gQSByYW5nZSBvZiBmaWVsZCBudW1iZXJzIHdoaWNoIGFyZSBkZXNpZ25hdGVkIGZvciB0aGlyZC1wYXJ0eQotICAvLyBleHRlbnNpb25zLgotICBzdHJ1Y3QgRXh0ZW5zaW9uUmFuZ2UgewotICAgIGludCBzdGFydDsgIC8vIGluY2x1c2l2ZQotICAgIGludCBlbmQ7ICAgIC8vIGV4Y2x1c2l2ZQotICB9OwotCi0gIC8vIFRoZSBudW1iZXIgb2YgZXh0ZW5zaW9uIHJhbmdlcyBpbiB0aGlzIG1lc3NhZ2UgdHlwZS4KLSAgaW50IGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpIGNvbnN0OwotICAvLyBHZXRzIGFuIGV4dGVuc2lvbiByYW5nZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8Ci0gIC8vIGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpLiBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkCi0gIC8vIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgY29uc3QgRXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIGluIG9uZSBvZiB0aGUgZXh0ZW5zaW9uIHJhbmdlcy4KLSAgYm9vbCBJc0V4dGVuc2lvbk51bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIE5VTEwgaWYgbm8gZXh0ZW5zaW9uIHJhbmdlIGNvbnRhaW5zIHRoZSBnaXZlbiBudW1iZXIuCi0gIGNvbnN0IEV4dGVuc2lvblJhbmdlKiBGaW5kRXh0ZW5zaW9uUmFuZ2VDb250YWluaW5nTnVtYmVyKGludCBudW1iZXIpIGNvbnN0OwotCi0gIC8vIFRoZSBudW1iZXIgb2YgZXh0ZW5zaW9ucyAtLSBleHRlbmRpbmcgKm90aGVyKiBtZXNzYWdlcyAtLSB0aGF0IHdlcmUKLSAgLy8gZGVmaW5lZCBuZXN0ZWQgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgc2NvcGUuCi0gIGludCBleHRlbnNpb25fY291bnQoKSBjb25zdDsKLSAgLy8gR2V0IGFuIGV4dGVuc2lvbiBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IGV4dGVuc2lvbl9jb3VudCgpLgotICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBMb29rcyB1cCBhIG5hbWVkIGV4dGVuc2lvbiAod2hpY2ggZXh0ZW5kcyBzb21lICpvdGhlciogbWVzc2FnZSB0eXBlKQotICAvLyBkZWZpbmVkIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLQotICAvLyBTaW1pbGFyIHRvIEZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgpLCBidXQgZmluZHMgZXh0ZW5zaW9ucyBkZWZpbmVkIHdpdGhpbgotICAvLyB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLQotICAvLyBTaW1pbGFyIHRvIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgpLCBidXQgZmluZHMgZXh0ZW5zaW9ucyBkZWZpbmVkIHdpdGhpbgotICAvLyB0aGlzIG1lc3NhZ2UgdHlwZSdzIHNjb3BlLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLQotICAvLyBSZXNlcnZlZCBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIEEgcmFuZ2Ugb2YgcmVzZXJ2ZWQgZmllbGQgbnVtYmVycy4KLSAgc3RydWN0IFJlc2VydmVkUmFuZ2UgewotICAgIGludCBzdGFydDsgIC8vIGluY2x1c2l2ZQotICAgIGludCBlbmQ7ICAgIC8vIGV4Y2x1c2l2ZQotICB9OwotCi0gIC8vIFRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgcmFuZ2VzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgotICBpbnQgcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKSBjb25zdDsKLSAgLy8gR2V0cyBhbiByZXNlcnZlZCByYW5nZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8Ci0gIC8vIHJlc2VydmVkX3JhbmdlX2NvdW50KCkuIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQKLSAgLy8gaW4gdGhlIC5wcm90byBmaWxlLgotICBjb25zdCBSZXNlcnZlZFJhbmdlKiByZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIGluIG9uZSBvZiB0aGUgcmVzZXJ2ZWQgcmFuZ2VzLgotICBib29sIElzUmVzZXJ2ZWROdW1iZXIoaW50IG51bWJlcikgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyBOVUxMIGlmIG5vIHJlc2VydmVkIHJhbmdlIGNvbnRhaW5zIHRoZSBnaXZlbiBudW1iZXIuCi0gIGNvbnN0IFJlc2VydmVkUmFuZ2UqIEZpbmRSZXNlcnZlZFJhbmdlQ29udGFpbmluZ051bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKLQotICAvLyBUaGUgbnVtYmVyIG9mIHJlc2VydmVkIGZpZWxkIG5hbWVzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgotICBpbnQgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpIGNvbnN0OwotCi0gIC8vIEdldHMgYSByZXNlcnZlZCBuYW1lIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpLgotICBjb25zdCBzdHJpbmcmIHJlc2VydmVkX25hbWUoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIG5hbWUgaXMgcmVzZXJ2ZWQuCi0gIGJvb2wgSXNSZXNlcnZlZE5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLQotICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKLSAgLy8gZXh0ZW50IG9mIHRoaXMgbWVzc2FnZSBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcwotICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KLSAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgTWVzc2FnZU9wdGlvbnMgT3B0aW9uc1R5cGU7Ci0KLSAgLy8gQWxsb3dzIHRlc3RzIHRvIHRlc3QgQ29weVRvKHByb3RvLCB0cnVlKS4KLSAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6ZGVzY3JpcHRvcl91bml0dGVzdDo6RGVzY3JpcHRvclRlc3Q7Ci0KLSAgLy8gQWxsb3dzIGFjY2VzcyB0byBHZXRMb2NhdGlvblBhdGggZm9yIGFubm90YXRpb25zLgotICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6UHJpbnRlcjsKLQotICAvLyBGaWxsIHRoZSBqc29uX25hbWUgZmllbGQgb2YgRmllbGREZXNjcmlwdG9yUHJvdG8uCi0gIHZvaWQgQ29weUpzb25OYW1lVG8oRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7Ci0KLSAgLy8gSW50ZXJuYWwgdmVyc2lvbiBvZiBEZWJ1Z1N0cmluZzsgY29udHJvbHMgdGhlIGxldmVsIG9mIGluZGVudGluZyBmb3IKLSAgLy8gY29ycmVjdCBkZXB0aC4gVGFrZXMgfG9wdGlvbnN8IHRvIGNvbnRyb2wgZGVidWctc3RyaW5nIG9wdGlvbnMsIGFuZAotICAvLyB8aW5jbHVkZV9vcGVuaW5nX2NsYXVzZXwgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgIm1lc3NhZ2UgLi4uICIgcGFydCBvZiB0aGUKLSAgLy8gY2xhdXNlIGhhcyBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkICh0aGlzIHZhcmllcyBkZXBlbmRpbmcgb24gY29udGV4dCkuCi0gIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfb3BlbmluZ19jbGF1c2UpIGNvbnN0OwotCi0gIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCi0gIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCi0gIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7Ci0KLSAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKLSAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZV87Ci0gIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBvcHRpb25zXzsKLQotICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgYW4gdW5rbm93biB0eXBlLgotICBib29sIGlzX3BsYWNlaG9sZGVyXzsKLSAgLy8gVHJ1ZSBpZiB0aGlzIGlzIGEgcGxhY2Vob2xkZXIgYW5kIHRoZSB0eXBlIG5hbWUgd2Fzbid0IGZ1bGx5LXF1YWxpZmllZC4KLSAgYm9vbCBpc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl87Ci0KLSAgaW50IGZpZWxkX2NvdW50XzsKLSAgRmllbGREZXNjcmlwdG9yKiBmaWVsZHNfOwotICBpbnQgb25lb2ZfZGVjbF9jb3VudF87Ci0gIE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVjbHNfOwotICBpbnQgbmVzdGVkX3R5cGVfY291bnRfOwotICBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZXNfOwotICBpbnQgZW51bV90eXBlX2NvdW50XzsKLSAgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZXNfOwotICBpbnQgZXh0ZW5zaW9uX3JhbmdlX2NvdW50XzsKLSAgRXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZXNfOwotICBpbnQgZXh0ZW5zaW9uX2NvdW50XzsKLSAgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb25zXzsKLSAgaW50IHJlc2VydmVkX3JhbmdlX2NvdW50XzsKLSAgUmVzZXJ2ZWRSYW5nZSogcmVzZXJ2ZWRfcmFuZ2VzXzsKLSAgaW50IHJlc2VydmVkX25hbWVfY291bnRfOwotICBjb25zdCBzdHJpbmcqKiByZXNlcnZlZF9uYW1lc187Ci0gIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKLSAgLy8gb2YgQWxsb2NhdGU8RGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxEZXNjcmlwdG9yPigpIGluIGRlc2NyaXB0b3IuY2MKLSAgLy8gYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgotCi0gIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCi0gIERlc2NyaXB0b3IoKSB7fQotICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7Ci0gIGZyaWVuZCBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIE9uZW9mRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIE1ldGhvZERlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvcjsKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyaXB0b3IpOwotfTsKLQotLy8gRGVzY3JpYmVzIGEgc2luZ2xlIGZpZWxkIG9mIGEgbWVzc2FnZS4gIFRvIGdldCB0aGUgZGVzY3JpcHRvciBmb3IgYSBnaXZlbgotLy8gZmllbGQsIGZpcnN0IGdldCB0aGUgRGVzY3JpcHRvciBmb3IgdGhlIG1lc3NhZ2UgaW4gd2hpY2ggaXQgaXMgZGVmaW5lZCwKLS8vIHRoZW4gY2FsbCBEZXNjcmlwdG9yOjpGaW5kRmllbGRCeU5hbWUoKS4gIFRvIGdldCBhIEZpZWxkRGVzY3JpcHRvciBmb3IKLS8vIGFuIGV4dGVuc2lvbiwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6Ci0vLyAtIEdldCB0aGUgRGVzY3JpcHRvciBvciBGaWxlRGVzY3JpcHRvciBmb3IgaXRzIGNvbnRhaW5pbmcgc2NvcGUsIHRoZW4KLS8vICAgY2FsbCBEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uQnlOYW1lKCkgb3IKLS8vICAgRmlsZURlc2NyaXB0b3I6OkZpbmRFeHRlbnNpb25CeU5hbWUoKS4KLS8vIC0gR2l2ZW4gYSBEZXNjcmlwdG9yUG9vbCwgY2FsbCBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TnVtYmVyKCkuCi0vLyAtIEdpdmVuIGEgUmVmbGVjdGlvbiBmb3IgYSBtZXNzYWdlIG9iamVjdCwgY2FsbAotLy8gICBSZWZsZWN0aW9uOjpGaW5kS25vd25FeHRlbnNpb25CeU5hbWUoKSBvcgotLy8gICBSZWZsZWN0aW9uOjpGaW5kS25vd25FeHRlbnNpb25CeU51bWJlcigpLgotLy8gVXNlIERlc2NyaXB0b3JQb29sIHRvIGNvbnN0cnVjdCB5b3VyIG93biBkZXNjcmlwdG9ycy4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWVsZERlc2NyaXB0b3IgewotIHB1YmxpYzoKLSAgLy8gSWRlbnRpZmllcyBhIGZpZWxkIHR5cGUuICAwIGlzIHJlc2VydmVkIGZvciBlcnJvcnMuICBUaGUgb3JkZXIgaXMgd2VpcmQKLSAgLy8gZm9yIGhpc3RvcmljYWwgcmVhc29ucy4gIFR5cGVzIDEyIGFuZCB1cCBhcmUgbmV3IGluIHByb3RvMi4KLSAgZW51bSBUeXBlIHsKLSAgICBUWVBFX0RPVUJMRSAgICAgICAgID0gMSwgICAvLyBkb3VibGUsIGV4YWN0bHkgZWlnaHQgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgVFlQRV9GTE9BVCAgICAgICAgICA9IDIsICAgLy8gZmxvYXQsIGV4YWN0bHkgZm91ciBieXRlcyBvbiB0aGUgd2lyZS4KLSAgICBUWVBFX0lOVDY0ICAgICAgICAgID0gMywgICAvLyBpbnQ2NCwgdmFyaW50IG9uIHRoZSB3aXJlLiAgTmVnYXRpdmUgbnVtYmVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UNjQgaWYgbmVnYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgYXJlIGxpa2VseS4KLSAgICBUWVBFX1VJTlQ2NCAgICAgICAgID0gNCwgICAvLyB1aW50NjQsIHZhcmludCBvbiB0aGUgd2lyZS4KLSAgICBUWVBFX0lOVDMyICAgICAgICAgID0gNSwgICAvLyBpbnQzMiwgdmFyaW50IG9uIHRoZSB3aXJlLiAgTmVnYXRpdmUgbnVtYmVycwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRha2UgMTAgYnl0ZXMuICBVc2UgVFlQRV9TSU5UMzIgaWYgbmVnYXRpdmUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2YWx1ZXMgYXJlIGxpa2VseS4KLSAgICBUWVBFX0ZJWEVENjQgICAgICAgID0gNiwgICAvLyB1aW50NjQsIGV4YWN0bHkgZWlnaHQgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgVFlQRV9GSVhFRDMyICAgICAgICA9IDcsICAgLy8gdWludDMyLCBleGFjdGx5IGZvdXIgYnl0ZXMgb24gdGhlIHdpcmUuCi0gICAgVFlQRV9CT09MICAgICAgICAgICA9IDgsICAgLy8gYm9vbCwgdmFyaW50IG9uIHRoZSB3aXJlLgotICAgIFRZUEVfU1RSSU5HICAgICAgICAgPSA5LCAgIC8vIFVURi04IHRleHQuCi0gICAgVFlQRV9HUk9VUCAgICAgICAgICA9IDEwLCAgLy8gVGFnLWRlbGltaXRlZCBtZXNzYWdlLiAgRGVwcmVjYXRlZC4KLSAgICBUWVBFX01FU1NBR0UgICAgICAgID0gMTEsICAvLyBMZW5ndGgtZGVsaW1pdGVkIG1lc3NhZ2UuCi0KLSAgICBUWVBFX0JZVEVTICAgICAgICAgID0gMTIsICAvLyBBcmJpdHJhcnkgYnl0ZSBhcnJheS4KLSAgICBUWVBFX1VJTlQzMiAgICAgICAgID0gMTMsICAvLyB1aW50MzIsIHZhcmludCBvbiB0aGUgd2lyZQotICAgIFRZUEVfRU5VTSAgICAgICAgICAgPSAxNCwgIC8vIEVudW0sIHZhcmludCBvbiB0aGUgd2lyZQotICAgIFRZUEVfU0ZJWEVEMzIgICAgICAgPSAxNSwgIC8vIGludDMyLCBleGFjdGx5IGZvdXIgYnl0ZXMgb24gdGhlIHdpcmUKLSAgICBUWVBFX1NGSVhFRDY0ICAgICAgID0gMTYsICAvLyBpbnQ2NCwgZXhhY3RseSBlaWdodCBieXRlcyBvbiB0aGUgd2lyZQotICAgIFRZUEVfU0lOVDMyICAgICAgICAgPSAxNywgIC8vIGludDMyLCBaaWdaYWctZW5jb2RlZCB2YXJpbnQgb24gdGhlIHdpcmUKLSAgICBUWVBFX1NJTlQ2NCAgICAgICAgID0gMTgsICAvLyBpbnQ2NCwgWmlnWmFnLWVuY29kZWQgdmFyaW50IG9uIHRoZSB3aXJlCi0KLSAgICBNQVhfVFlQRSAgICAgICAgICAgID0gMTgsICAvLyBDb25zdGFudCB1c2VmdWwgZm9yIGRlZmluaW5nIGxvb2t1cCB0YWJsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleGVkIGJ5IFR5cGUuCi0gIH07Ci0KLSAgLy8gU3BlY2lmaWVzIHRoZSBDKysgZGF0YSB0eXBlIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBmaWVsZC4gIFRoZXJlIGlzIGEKLSAgLy8gZml4ZWQgbWFwcGluZyBmcm9tIFR5cGUgdG8gQ3BwVHlwZSB3aGVyZSBlYWNoIFR5cGUgbWFwcyB0byBleGFjdGx5IG9uZQotICAvLyBDcHBUeXBlLiAgMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzLgotICBlbnVtIENwcFR5cGUgewotICAgIENQUFRZUEVfSU5UMzIgICAgICAgPSAxLCAgICAgLy8gVFlQRV9JTlQzMiwgVFlQRV9TSU5UMzIsIFRZUEVfU0ZJWEVEMzIKLSAgICBDUFBUWVBFX0lOVDY0ICAgICAgID0gMiwgICAgIC8vIFRZUEVfSU5UNjQsIFRZUEVfU0lOVDY0LCBUWVBFX1NGSVhFRDY0Ci0gICAgQ1BQVFlQRV9VSU5UMzIgICAgICA9IDMsICAgICAvLyBUWVBFX1VJTlQzMiwgVFlQRV9GSVhFRDMyCi0gICAgQ1BQVFlQRV9VSU5UNjQgICAgICA9IDQsICAgICAvLyBUWVBFX1VJTlQ2NCwgVFlQRV9GSVhFRDY0Ci0gICAgQ1BQVFlQRV9ET1VCTEUgICAgICA9IDUsICAgICAvLyBUWVBFX0RPVUJMRQotICAgIENQUFRZUEVfRkxPQVQgICAgICAgPSA2LCAgICAgLy8gVFlQRV9GTE9BVAotICAgIENQUFRZUEVfQk9PTCAgICAgICAgPSA3LCAgICAgLy8gVFlQRV9CT09MCi0gICAgQ1BQVFlQRV9FTlVNICAgICAgICA9IDgsICAgICAvLyBUWVBFX0VOVU0KLSAgICBDUFBUWVBFX1NUUklORyAgICAgID0gOSwgICAgIC8vIFRZUEVfU1RSSU5HLCBUWVBFX0JZVEVTCi0gICAgQ1BQVFlQRV9NRVNTQUdFICAgICA9IDEwLCAgICAvLyBUWVBFX01FU1NBR0UsIFRZUEVfR1JPVVAKLQotICAgIE1BWF9DUFBUWVBFICAgICAgICAgPSAxMCwgICAgLy8gQ29uc3RhbnQgdXNlZnVsIGZvciBkZWZpbmluZyBsb29rdXAgdGFibGVzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbmRleGVkIGJ5IENwcFR5cGUuCi0gIH07Ci0KLSAgLy8gSWRlbnRpZmllcyB3aGV0aGVyIHRoZSBmaWVsZCBpcyBvcHRpb25hbCwgcmVxdWlyZWQsIG9yIHJlcGVhdGVkLiAgMCBpcwotICAvLyByZXNlcnZlZCBmb3IgZXJyb3JzLgotICBlbnVtIExhYmVsIHsKLSAgICBMQUJFTF9PUFRJT05BTCAgICAgID0gMSwgICAgLy8gb3B0aW9uYWwKLSAgICBMQUJFTF9SRVFVSVJFRCAgICAgID0gMiwgICAgLy8gcmVxdWlyZWQKLSAgICBMQUJFTF9SRVBFQVRFRCAgICAgID0gMywgICAgLy8gcmVwZWF0ZWQKLQotICAgIE1BWF9MQUJFTCAgICAgICAgICAgPSAzLCAgICAvLyBDb25zdGFudCB1c2VmdWwgZm9yIGRlZmluaW5nIGxvb2t1cCB0YWJsZXMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXhlZCBieSBMYWJlbC4KLSAgfTsKLQotICAvLyBWYWxpZCBmaWVsZCBudW1iZXJzIGFyZSBwb3NpdGl2ZSBpbnRlZ2VycyB1cCB0byBrTWF4TnVtYmVyLgotICBzdGF0aWMgY29uc3QgaW50IGtNYXhOdW1iZXIgPSAoMSA8PCAyOSkgLSAxOwotCi0gIC8vIEZpcnN0IGZpZWxkIG51bWJlciByZXNlcnZlZCBmb3IgdGhlIHByb3RvY29sIGJ1ZmZlciBsaWJyYXJ5IGltcGxlbWVudGF0aW9uLgotICAvLyBVc2VycyBtYXkgbm90IGRlY2xhcmUgZmllbGRzIHRoYXQgdXNlIHJlc2VydmVkIG51bWJlcnMuCi0gIHN0YXRpYyBjb25zdCBpbnQga0ZpcnN0UmVzZXJ2ZWROdW1iZXIgPSAxOTAwMDsKLSAgLy8gTGFzdCBmaWVsZCBudW1iZXIgcmVzZXJ2ZWQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi4KLSAgLy8gVXNlcnMgbWF5IG5vdCBkZWNsYXJlIGZpZWxkcyB0aGF0IHVzZSByZXNlcnZlZCBudW1iZXJzLgotICBzdGF0aWMgY29uc3QgaW50IGtMYXN0UmVzZXJ2ZWROdW1iZXIgID0gMTk5OTk7Ci0KLSAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7ICAgICAgICAvLyBOYW1lIG9mIHRoaXMgZmllbGQgd2l0aGluIHRoZSBtZXNzYWdlLgotICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSgpIGNvbnN0OyAgIC8vIEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBmaWVsZC4KLSAgY29uc3Qgc3RyaW5nJiBqc29uX25hbWUoKSBjb25zdDsgICAvLyBKU09OIG5hbWUgb2YgdGhpcyBmaWVsZC4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUoKSBjb25zdDsvLyBGaWxlIGluIHdoaWNoIHRoaXMgZmllbGQgd2FzIGRlZmluZWQuCi0gIGJvb2wgaXNfZXh0ZW5zaW9uKCkgY29uc3Q7ICAgICAgICAgLy8gSXMgdGhpcyBhbiBleHRlbnNpb24gZmllbGQ/Ci0gIGludCBudW1iZXIoKSBjb25zdDsgICAgICAgICAgICAgICAgLy8gRGVjbGFyZWQgdGFnIG51bWJlci4KLQotICAvLyBTYW1lIGFzIG5hbWUoKSBleGNlcHQgY29udmVydGVkIHRvIGxvd2VyLWNhc2UuICBUaGlzIChhbmQgZXNwZWNpYWxseSB0aGUKLSAgLy8gRmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCkgbWV0aG9kKSBjYW4gYmUgdXNlZnVsIHdoZW4gcGFyc2luZyBmb3JtYXRzCi0gIC8vIHdoaWNoIHByZWZlciB0byB1c2UgbG93ZXJjYXNlIG5hbWluZyBzdHlsZS4gIChBbHRob3VnaCwgdGVjaG5pY2FsbHkKLSAgLy8gZmllbGQgbmFtZXMgc2hvdWxkIGJlIGxvd2VyY2FzZWQgYW55d2F5IGFjY29yZGluZyB0byB0aGUgcHJvdG9idWYgc3R5bGUKLSAgLy8gZ3VpZGUsIHNvIHRoaXMgb25seSBtYWtlcyBhIGRpZmZlcmVuY2Ugd2hlbiBkZWFsaW5nIHdpdGggb2xkIC5wcm90byBmaWxlcwotICAvLyB3aGljaCBkbyBub3QgZm9sbG93IHRoZSBndWlkZS4pCi0gIGNvbnN0IHN0cmluZyYgbG93ZXJjYXNlX25hbWUoKSBjb25zdDsKLQotICAvLyBTYW1lIGFzIG5hbWUoKSBleGNlcHQgY29udmVydGVkIHRvIGNhbWVsLWNhc2UuICBJbiB0aGlzIGNvbnZlcnNpb24sIGFueQotICAvLyB0aW1lIGFuIHVuZGVyc2NvcmUgYXBwZWFycyBpbiB0aGUgbmFtZSwgaXQgaXMgcmVtb3ZlZCBhbmQgdGhlIG5leHQKLSAgLy8gbGV0dGVyIGlzIGNhcGl0YWxpemVkLiAgRnVydGhlcm1vcmUsIHRoZSBmaXJzdCBsZXR0ZXIgb2YgdGhlIG5hbWUgaXMKLSAgLy8gbG93ZXItY2FzZWQuICBFeGFtcGxlczoKLSAgLy8gICBGb29CYXIgLT4gZm9vQmFyCi0gIC8vICAgZm9vX2JhciAtPiBmb29CYXIKLSAgLy8gICBmb29CYXIgLT4gZm9vQmFyCi0gIC8vIFRoaXMgKGFuZCBlc3BlY2lhbGx5IHRoZSBGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoKSBtZXRob2QpIGNhbiBiZSB1c2VmdWwKLSAgLy8gd2hlbiBwYXJzaW5nIGZvcm1hdHMgd2hpY2ggcHJlZmVyIHRvIHVzZSBjYW1lbC1jYXNlIG5hbWluZyBzdHlsZS4KLSAgY29uc3Qgc3RyaW5nJiBjYW1lbGNhc2VfbmFtZSgpIGNvbnN0OwotCi0gIFR5cGUgdHlwZSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgIC8vIERlY2xhcmVkIHR5cGUgb2YgdGhpcyBmaWVsZC4KLSAgY29uc3QgY2hhciogdHlwZV9uYW1lKCkgY29uc3Q7ICAgICAgLy8gTmFtZSBvZiB0aGUgZGVjbGFyZWQgdHlwZS4KLSAgQ3BwVHlwZSBjcHBfdHlwZSgpIGNvbnN0OyAgICAgICAgICAgLy8gQysrIHR5cGUgb2YgdGhpcyBmaWVsZC4KLSAgY29uc3QgY2hhciogY3BwX3R5cGVfbmFtZSgpIGNvbnN0OyAgLy8gTmFtZSBvZiB0aGUgQysrIHR5cGUuCi0gIExhYmVsIGxhYmVsKCkgY29uc3Q7ICAgICAgICAgICAgICAgIC8vIG9wdGlvbmFsL3JlcXVpcmVkL3JlcGVhdGVkCi0KLSAgYm9vbCBpc19yZXF1aXJlZCgpIGNvbnN0OyAgICAgIC8vIHNob3J0aGFuZCBmb3IgbGFiZWwoKSA9PSBMQUJFTF9SRVFVSVJFRAotICBib29sIGlzX29wdGlvbmFsKCkgY29uc3Q7ICAgICAgLy8gc2hvcnRoYW5kIGZvciBsYWJlbCgpID09IExBQkVMX09QVElPTkFMCi0gIGJvb2wgaXNfcmVwZWF0ZWQoKSBjb25zdDsgICAgICAvLyBzaG9ydGhhbmQgZm9yIGxhYmVsKCkgPT0gTEFCRUxfUkVQRUFURUQKLSAgYm9vbCBpc19wYWNrYWJsZSgpIGNvbnN0OyAgICAgIC8vIHNob3J0aGFuZCBmb3IgaXNfcmVwZWF0ZWQoKSAmJgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBJc1R5cGVQYWNrYWJsZSh0eXBlKCkpCi0gIGJvb2wgaXNfcGFja2VkKCkgY29uc3Q7ICAgICAgICAvLyBzaG9ydGhhbmQgZm9yIGlzX3BhY2thYmxlKCkgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgb3B0aW9ucygpLnBhY2tlZCgpCi0gIGJvb2wgaXNfbWFwKCkgY29uc3Q7ICAgICAgICAgICAvLyBzaG9ydGhhbmQgZm9yIHR5cGUoKSA9PSBUWVBFX01FU1NBR0UgJiYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2VfdHlwZSgpLT5vcHRpb25zKCkubWFwX2VudHJ5KCkKLQotICAvLyBJbmRleCBvZiB0aGlzIGZpZWxkIHdpdGhpbiB0aGUgbWVzc2FnZSdzIGZpZWxkIGFycmF5LCBvciB0aGUgZmlsZSBvcgotICAvLyBleHRlbnNpb24gc2NvcGUncyBleHRlbnNpb25zIGFycmF5LgotICBpbnQgaW5kZXgoKSBjb25zdDsKLQotICAvLyBEb2VzIHRoaXMgZmllbGQgaGF2ZSBhbiBleHBsaWNpdGx5LWRlY2xhcmVkIGRlZmF1bHQgdmFsdWU/Ci0gIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWUoKSBjb25zdDsKLQotICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0lOVDMyLiAgSWYgbm8KLSAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4KLSAgaW50MzIgZGVmYXVsdF92YWx1ZV9pbnQzMigpIGNvbnN0OwotICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0lOVDY0LiAgSWYgbm8KLSAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4KLSAgaW50NjQgZGVmYXVsdF92YWx1ZV9pbnQ2NCgpIGNvbnN0OwotICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX1VJTlQzMi4gIElmIG5vCi0gIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCi0gIHVpbnQzMiBkZWZhdWx0X3ZhbHVlX3VpbnQzMigpIGNvbnN0OwotICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX1VJTlQ2NC4gIElmIG5vCi0gIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIDAuCi0gIHVpbnQ2NCBkZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpIGNvbnN0OwotICAvLyBHZXQgdGhlIGZpZWxkIGRlZmF1bHQgdmFsdWUgaWYgY3BwX3R5cGUoKSA9PSBDUFBUWVBFX0ZMT0FULiAgSWYgbm8KLSAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4wLgotICBmbG9hdCBkZWZhdWx0X3ZhbHVlX2Zsb2F0KCkgY29uc3Q7Ci0gIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfRE9VQkxFLiAgSWYgbm8KLSAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgMC4wLgotICBkb3VibGUgZGVmYXVsdF92YWx1ZV9kb3VibGUoKSBjb25zdDsKLSAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9CT09MLiAgSWYgbm8KLSAgLy8gZXhwbGljaXQgZGVmYXVsdCB3YXMgZGVmaW5lZCwgdGhlIGRlZmF1bHQgaXMgZmFsc2UuCi0gIGJvb2wgZGVmYXVsdF92YWx1ZV9ib29sKCkgY29uc3Q7Ci0gIC8vIEdldCB0aGUgZmllbGQgZGVmYXVsdCB2YWx1ZSBpZiBjcHBfdHlwZSgpID09IENQUFRZUEVfRU5VTS4gIElmIG5vCi0gIC8vIGV4cGxpY2l0IGRlZmF1bHQgd2FzIGRlZmluZWQsIHRoZSBkZWZhdWx0IGlzIHRoZSBmaXJzdCB2YWx1ZSBkZWZpbmVkCi0gIC8vIGluIHRoZSBlbnVtIHR5cGUgKGFsbCBlbnVtIHR5cGVzIGFyZSByZXF1aXJlZCB0byBoYXZlIGF0IGxlYXN0IG9uZSB2YWx1ZSkuCi0gIC8vIFRoaXMgbmV2ZXIgcmV0dXJucyBOVUxMLgotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZWZhdWx0X3ZhbHVlX2VudW0oKSBjb25zdDsKLSAgLy8gR2V0IHRoZSBmaWVsZCBkZWZhdWx0IHZhbHVlIGlmIGNwcF90eXBlKCkgPT0gQ1BQVFlQRV9TVFJJTkcuICBJZiBubwotICAvLyBleHBsaWNpdCBkZWZhdWx0IHdhcyBkZWZpbmVkLCB0aGUgZGVmYXVsdCBpcyB0aGUgZW1wdHkgc3RyaW5nLgotICBjb25zdCBzdHJpbmcmIGRlZmF1bHRfdmFsdWVfc3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gVGhlIERlc2NyaXB0b3IgZm9yIHRoZSBtZXNzYWdlIG9mIHdoaWNoIHRoaXMgaXMgYSBmaWVsZC4gIEZvciBleHRlbnNpb25zLAotICAvLyB0aGlzIGlzIHRoZSBleHRlbmRlZCB0eXBlLiAgTmV2ZXIgTlVMTC4KLSAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7Ci0KLSAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgbWVtYmVyIG9mIGEgb25lb2YsIHRoaXMgaXMgdGhlIG9uZSwgb3RoZXJ3aXNlIHRoaXMgaXMKLSAgLy8gTlVMTC4KLSAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBjb250YWluaW5nX29uZW9mKCkgY29uc3Q7Ci0KLSAgLy8gSWYgdGhlIGZpZWxkIGlzIGEgbWVtYmVyIG9mIGEgb25lb2YsIHJldHVybnMgdGhlIGluZGV4IGluIHRoYXQgb25lb2YuCi0gIGludCBpbmRleF9pbl9vbmVvZigpIGNvbnN0OwotCi0gIC8vIEFuIGV4dGVuc2lvbiBtYXkgYmUgZGVjbGFyZWQgd2l0aGluIHRoZSBzY29wZSBvZiBhbm90aGVyIG1lc3NhZ2UuICBJZiB0aGlzCi0gIC8vIGZpZWxkIGlzIGFuIGV4dGVuc2lvbiAoaXNfZXh0ZW5zaW9uKCkgaXMgdHJ1ZSksIHRoZW4gZXh0ZW5zaW9uX3Njb3BlKCkKLSAgLy8gcmV0dXJucyB0aGF0IG1lc3NhZ2UsIG9yIE5VTEwgaWYgdGhlIGV4dGVuc2lvbiB3YXMgZGVjbGFyZWQgYXQgZ2xvYmFsCi0gIC8vIHNjb3BlLiAgSWYgdGhpcyBpcyBub3QgYW4gZXh0ZW5zaW9uLCBleHRlbnNpb25fc2NvcGUoKSBpcyB1bmRlZmluZWQgKG1heQotICAvLyBhc3NlcnQtZmFpbCkuCi0gIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuc2lvbl9zY29wZSgpIGNvbnN0OwotCi0gIC8vIElmIHR5cGUgaXMgVFlQRV9NRVNTQUdFIG9yIFRZUEVfR1JPVVAsIHJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUKLSAgLy8gbWVzc2FnZSBvciB0aGUgZ3JvdXAgdHlwZS4gIE90aGVyd2lzZSwgcmV0dXJucyBudWxsLgotICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUoKSBjb25zdDsKLSAgLy8gSWYgdHlwZSBpcyBUWVBFX0VOVU0sIHJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUgZW51bS4gIE90aGVyd2lzZSwKLSAgLy8gcmV0dXJucyBudWxsLgotICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlKCkgY29uc3Q7Ci0KLSAgLy8gR2V0IHRoZSBGaWVsZE9wdGlvbnMgZm9yIHRoaXMgZmllbGQuICBUaGlzIGluY2x1ZGVzIHRoaW5ncyBsaXN0ZWQgaW4KLSAgLy8gc3F1YXJlIGJyYWNrZXRzIGFmdGVyIHRoZSBmaWVsZCBkZWZpbml0aW9uLiAgRS5nLiwgdGhlIGZpZWxkOgotICAvLyAgIG9wdGlvbmFsIHN0cmluZyB0ZXh0ID0gMSBbY3R5cGU9Q09SRF07Ci0gIC8vIGhhcyB0aGUgImN0eXBlIiBvcHRpb24gc2V0LiAgQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IEZpZWxkT3B0aW9ucwotICAvLyBpbiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0Ci0gIC8vIG1lc3NhZ2UuCi0gIGNvbnN0IEZpZWxkT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KLSAgdm9pZCBDb3B5VG8oRmllbGREZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKLQotICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KLSAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KLSAgc3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKLQotICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgQ3BwVHlwZSBmb3IgYSBwYXJ0aWN1bGFyIFR5cGUuCi0gIHN0YXRpYyBDcHBUeXBlIFR5cGVUb0NwcFR5cGUoVHlwZSB0eXBlKTsKLQotICAvLyBIZWxwZXIgbWV0aG9kIHRvIGdldCB0aGUgbmFtZSBvZiBhIFR5cGUuCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBUeXBlTmFtZShUeXBlIHR5cGUpOwotCi0gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBuYW1lIG9mIGEgQ3BwVHlwZS4KLSAgc3RhdGljIGNvbnN0IGNoYXIqIENwcFR5cGVOYW1lKENwcFR5cGUgY3BwX3R5cGUpOwotCi0gIC8vIFJldHVybiB0cnVlIGlmZiBbcGFja2VkID0gdHJ1ZV0gaXMgdmFsaWQgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCi0gIHN0YXRpYyBpbmxpbmUgYm9vbCBJc1R5cGVQYWNrYWJsZShUeXBlIGZpZWxkX3R5cGUpOwotCi0gIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQotICAvLyBleHRlbnQgb2YgdGhpcyBmaWVsZCBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcwotICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KLSAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgRmllbGRPcHRpb25zIE9wdGlvbnNUeXBlOwotCi0gIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KLSAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OlByaW50ZXI7Ci0KLSAgLy8gRmlsbCB0aGUganNvbl9uYW1lIGZpZWxkIG9mIEZpZWxkRGVzY3JpcHRvclByb3RvLgotICB2b2lkIENvcHlKc29uTmFtZVRvKEZpZWxkRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIGVudW0gUHJpbnRMYWJlbEZsYWcgeyBQUklOVF9MQUJFTCwgT01JVF9MQUJFTCB9OwotICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgUHJpbnRMYWJlbEZsYWcgcHJpbnRfbGFiZWxfZmxhZywKLSAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGNvbnRlbnRzLCBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OwotCi0gIC8vIGZvcm1hdHMgdGhlIGRlZmF1bHQgdmFsdWUgYXBwcm9wcmlhdGVseSBhbmQgcmV0dXJucyBpdCBhcyBhIHN0cmluZy4KLSAgLy8gTXVzdCBoYXZlIGEgZGVmYXVsdCB2YWx1ZSB0byBjYWxsIHRoaXMuIElmIHF1b3RlX3N0cmluZ190eXBlIGlzIHRydWUsIHRoZW4KLSAgLy8gdHlwZXMgb2YgQ1BQVFlQRV9TVFJJTkcgd2hpbGwgYmUgc3Vycm91bmRlZCBieSBxdW90ZXMgYW5kIENFc2NhcGVkLgotICBzdHJpbmcgRGVmYXVsdFZhbHVlQXNTdHJpbmcoYm9vbCBxdW90ZV9zdHJpbmdfdHlwZSkgY29uc3Q7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIHRoYXQgcmV0dXJucyB0aGUgZmllbGQgdHlwZSBuYW1lIGZvciBEZWJ1Z1N0cmluZy4KLSAgc3RyaW5nIEZpZWxkVHlwZU5hbWVEZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCi0gIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCi0gIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7Ci0KLSAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKLSAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOwotICBjb25zdCBzdHJpbmcqIGxvd2VyY2FzZV9uYW1lXzsKLSAgY29uc3Qgc3RyaW5nKiBjYW1lbGNhc2VfbmFtZV87Ci0gIC8vIFdoZXRoZXIgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCB0aGUganNvbl9uYW1lIGZpZWxkIG9wdGlvbiBpbiB0aGUgLnByb3RvCi0gIC8vIGZpbGUuCi0gIGJvb2wgaGFzX2pzb25fbmFtZV87Ci0gIC8vIElmIGhhc19qc29uX25hbWVfIGlzIHRydWUsIGl0J3MgdGhlIHZhbHVlIHNwZWNpZmllZCBieSB0aGUgdXNlci4KLSAgLy8gT3RoZXJ3aXNlLCBpdCBoYXMgdGhlIHNhbWUgdmFsdWUgYXMgbG93ZXJjYXNlX25hbWVfLgotICBjb25zdCBzdHJpbmcqIGpzb25fbmFtZV87Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKLSAgaW50IG51bWJlcl87Ci0gIFR5cGUgdHlwZV87Ci0gIExhYmVsIGxhYmVsXzsKLSAgYm9vbCBpc19leHRlbnNpb25fOwotICBpbnQgaW5kZXhfaW5fb25lb2ZfOwotICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGVfOwotICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGNvbnRhaW5pbmdfb25lb2ZfOwotICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbnNpb25fc2NvcGVfOwotICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGVfOwotICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlXzsKLSAgY29uc3QgRmllbGRPcHRpb25zKiBvcHRpb25zXzsKLSAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcwotICAvLyBvZiBBbGxvY2F0ZTxGaWVsZERlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8RmllbGREZXNjcmlwdG9yPigpIGluCi0gIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgotCi0gIGJvb2wgaGFzX2RlZmF1bHRfdmFsdWVfOwotICB1bmlvbiB7Ci0gICAgaW50MzIgIGRlZmF1bHRfdmFsdWVfaW50MzJfOwotICAgIGludDY0ICBkZWZhdWx0X3ZhbHVlX2ludDY0XzsKLSAgICB1aW50MzIgZGVmYXVsdF92YWx1ZV91aW50MzJfOwotICAgIHVpbnQ2NCBkZWZhdWx0X3ZhbHVlX3VpbnQ2NF87Ci0gICAgZmxvYXQgIGRlZmF1bHRfdmFsdWVfZmxvYXRfOwotICAgIGRvdWJsZSBkZWZhdWx0X3ZhbHVlX2RvdWJsZV87Ci0gICAgYm9vbCAgIGRlZmF1bHRfdmFsdWVfYm9vbF87Ci0KLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZWZhdWx0X3ZhbHVlX2VudW1fOwotICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF92YWx1ZV9zdHJpbmdfOwotICB9OwotCi0gIHN0YXRpYyBjb25zdCBDcHBUeXBlIGtUeXBlVG9DcHBUeXBlTWFwW01BWF9UWVBFICsgMV07Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrVHlwZVRvTmFtZVtNQVhfVFlQRSArIDFdOwotCi0gIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga0NwcFR5cGVUb05hbWVbTUFYX0NQUFRZUEUgKyAxXTsKLQotICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtMYWJlbFRvTmFtZVtNQVhfTEFCRUwgKyAxXTsKLQotICAvLyBNdXN0IGJlIGNvbnN0cnVjdGVkIHVzaW5nIERlc2NyaXB0b3JQb29sLgotICBGaWVsZERlc2NyaXB0b3IoKSB7fQotICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7Ci0gIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBPbmVvZkRlc2NyaXB0b3I7Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZERlc2NyaXB0b3IpOwotfTsKLQotLy8gRGVzY3JpYmVzIGEgb25lb2YgZGVmaW5lZCBpbiBhIG1lc3NhZ2UgdHlwZS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBPbmVvZkRlc2NyaXB0b3IgewotIHB1YmxpYzoKLSAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7ICAgICAgIC8vIE5hbWUgb2YgdGhpcyBvbmVvZi4KLSAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsgIC8vIEZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBvbmVvZi4KLQotICAvLyBJbmRleCBvZiB0aGlzIG9uZW9mIHdpdGhpbiB0aGUgbWVzc2FnZSdzIG9uZW9mIGFycmF5LgotICBpbnQgaW5kZXgoKSBjb25zdDsKLQotICAvLyBUaGUgRGVzY3JpcHRvciBmb3IgdGhlIG1lc3NhZ2UgY29udGFpbmluZyB0aGlzIG9uZW9mLgotICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUoKSBjb25zdDsKLQotICAvLyBUaGUgbnVtYmVyIG9mIChub24tZXh0ZW5zaW9uKSBmaWVsZHMgd2hpY2ggYXJlIG1lbWJlcnMgb2YgdGhpcyBvbmVvZi4KLSAgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7Ci0gIC8vIEdldCBhIG1lbWJlciBvZiB0aGlzIG9uZW9mLCBpbiB0aGUgb3JkZXIgaW4gd2hpY2ggdGhleSB3ZXJlIGRlY2xhcmVkIGluIHRoZQotICAvLyAucHJvdG8gZmlsZS4gIERvZXMgbm90IGluY2x1ZGUgZXh0ZW5zaW9ucy4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KLSAgdm9pZCBDb3B5VG8oT25lb2ZEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKLQotICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KLSAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KLSAgc3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKLQotICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKLSAgLy8gZXh0ZW50IG9mIHRoaXMgb25lb2YgZGVjbGFyYXRpb24uICBSZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMKLSAgLy8gfCpvdXRfbG9jYXRpb258IHVuY2hhbmdlZCBpZmYgbG9jYXRpb24gaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUuCi0gIGJvb2wgR2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAvLyBBbGxvd3MgYWNjZXNzIHRvIEdldExvY2F0aW9uUGF0aCBmb3IgYW5ub3RhdGlvbnMuCi0gIGZyaWVuZCBjbGFzcyA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpQcmludGVyOwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgotICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nKiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OwotCi0gIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCi0gIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCi0gIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7Ci0KLSAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKLSAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOwotICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGVfOwotICBib29sIGlzX2V4dGVuZGFibGVfOwotICBpbnQgZmllbGRfY291bnRfOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiBmaWVsZHNfOwotICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCi0gIC8vIG9mIEFsbG9jYXRlPE9uZW9mRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxPbmVvZkRlc2NyaXB0b3I+KCkKLSAgLy8gaW4gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCi0KLSAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KLSAgT25lb2ZEZXNjcmlwdG9yKCkge30KLSAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOwotICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvcjsKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9uZW9mRGVzY3JpcHRvcik7Ci19OwotCi0vLyBEZXNjcmliZXMgYW4gZW51bSB0eXBlIGRlZmluZWQgaW4gYSAucHJvdG8gZmlsZS4gIFRvIGdldCB0aGUgRW51bURlc2NyaXB0b3IKLS8vIGZvciBhIGdlbmVyYXRlZCBlbnVtIHR5cGUsIGNhbGwgVHlwZU5hbWVfZGVzY3JpcHRvcigpLiAgVXNlIERlc2NyaXB0b3JQb29sCi0vLyB0byBjb25zdHJ1Y3QgeW91ciBvd24gZGVzY3JpcHRvcnMuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bURlc2NyaXB0b3IgewotIHB1YmxpYzoKLSAgLy8gVGhlIG5hbWUgb2YgdGhpcyBlbnVtIHR5cGUgaW4gdGhlIGNvbnRhaW5pbmcgc2NvcGUuCi0gIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OwotCi0gIC8vIFRoZSBmdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgZW51bSB0eXBlLCBzY29wZSBkZWxpbWl0ZWQgYnkgcGVyaW9kcy4KLSAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKLQotICAvLyBJbmRleCBvZiB0aGlzIGVudW0gd2l0aGluIHRoZSBmaWxlIG9yIGNvbnRhaW5pbmcgbWVzc2FnZSdzIGVudW0gYXJyYXkuCi0gIGludCBpbmRleCgpIGNvbnN0OwotCi0gIC8vIFRoZSAucHJvdG8gZmlsZSBpbiB3aGljaCB0aGlzIGVudW0gdHlwZSB3YXMgZGVmaW5lZC4gIE5ldmVyIE5VTEwuCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKCkgY29uc3Q7Ci0KLSAgLy8gVGhlIG51bWJlciBvZiB2YWx1ZXMgZm9yIHRoaXMgRW51bURlc2NyaXB0b3IuICBHdWFyYW50ZWVkIHRvIGJlIGdyZWF0ZXIKLSAgLy8gdGhhbiB6ZXJvLgotICBpbnQgdmFsdWVfY291bnQoKSBjb25zdDsKLSAgLy8gR2V0cyBhIHZhbHVlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwgdmFsdWVfY291bnQoKS4KLSAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gTG9va3MgdXAgYSB2YWx1ZSBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vIHN1Y2ggdmFsdWUgZXhpc3RzLgotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kVmFsdWVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgLy8gTG9va3MgdXAgYSB2YWx1ZSBieSBudW1iZXIuICBSZXR1cm5zIE5VTEwgaWYgbm8gc3VjaCB2YWx1ZSBleGlzdHMuICBJZgotICAvLyBtdWx0aXBsZSB2YWx1ZXMgaGF2ZSB0aGlzIG51bWJlciwgdGhlIGZpcnN0IG9uZSBkZWZpbmVkIGlzIHJldHVybmVkLgotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKLQotICAvLyBJZiB0aGlzIGVudW0gdHlwZSBpcyBuZXN0ZWQgaW4gYSBtZXNzYWdlIHR5cGUsIHRoaXMgaXMgdGhhdCBtZXNzYWdlIHR5cGUuCi0gIC8vIE90aGVyd2lzZSwgTlVMTC4KLSAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7Ci0KLSAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgZW51bSB0eXBlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKLSAgLy8gcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIHRoZSBlbnVtIGRlZmluaXRpb24uICBBbGxvd2VkCi0gIC8vIG9wdGlvbnMgYXJlIGRlZmluZWQgYnkgRW51bU9wdGlvbnMgaW4gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8sCi0gIC8vIGFuZCBhbnkgYXZhaWxhYmxlIGV4dGVuc2lvbnMgb2YgdGhhdCBtZXNzYWdlLgotICBjb25zdCBFbnVtT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KLSAgdm9pZCBDb3B5VG8oRW51bURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgotICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKLQotICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygpLgotICBzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OwotCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgYW4gdW5rbm93biBlbnVtLiBUaGlzIHdpbGwKLSAgLy8gb25seSBiZSB0aGUgY2FzZSBpZiB0aGlzIGRlc2NyaXB0b3IgY29tZXMgZnJvbSBhIERlc2NyaXB0b3JQb29sCi0gIC8vIHdpdGggQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgc2V0LgotICBib29sIGlzX3BsYWNlaG9sZGVyKCkgY29uc3Q7Ci0KLSAgLy8gU291cmNlIExvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIFVwZGF0ZXMgfCpvdXRfbG9jYXRpb258IHRvIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGNvbXBsZXRlCi0gIC8vIGV4dGVudCBvZiB0aGlzIGVudW0gZGVjbGFyYXRpb24uICBSZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMKLSAgLy8gfCpvdXRfbG9jYXRpb258IHVuY2hhbmdlZCBpZmYgbG9jYXRpb24gaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUuCi0gIGJvb2wgR2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB0eXBlZGVmIEVudW1PcHRpb25zIE9wdGlvbnNUeXBlOwotCi0gIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KLSAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OlByaW50ZXI7Ci0KLSAgLy8gTG9va3MgdXAgYSB2YWx1ZSBieSBudW1iZXIuICBJZiB0aGUgdmFsdWUgZG9lcyBub3QgZXhpc3QsIGR5bmFtaWNhbGx5Ci0gIC8vIGNyZWF0ZXMgYSBuZXcgRW51bVZhbHVlRGVzY3JpcHRvciBmb3IgdGhhdCB2YWx1ZSwgYXNzdW1pbmcgdGhhdCBpdCB3YXMKLSAgLy8gdW5rbm93bi4gSWYgYSBuZXcgZGVzY3JpcHRvciBpcyBjcmVhdGVkLCB0aGlzIGlzIGRvbmUgaW4gYSB0aHJlYWQtc2FmZSB3YXksCi0gIC8vIGFuZCBmdXR1cmUgY2FsbHMgd2lsbCByZXR1cm4gdGhlIHNhbWUgdmFsdWUgZGVzY3JpcHRvciBwb2ludGVyLgotICAvLwotICAvLyBUaGlzIGlzIHByaXZhdGUgYnV0IGlzIHVzZWQgYnkgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24gKHdoaWNoIGlzCi0gIC8vIGZyaWVuZGVkIGJlbG93KSB0byByZXR1cm4gYSB2YWxpZCBFbnVtVmFsdWVEZXNjcmlwdG9yIGZyb20gR2V0RW51bSgpIHdoZW4KLSAgLy8gdGhpcyBmZWF0dXJlIGlzIGVuYWJsZWQuCi0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqCi0gICAgICBGaW5kVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKGludCBudW1iZXIpIGNvbnN0OwotCi0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7Ci0KLSAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKLSAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KLSAgdm9pZCBHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdDsKLQotICBjb25zdCBzdHJpbmcqIG5hbWVfOwotICBjb25zdCBzdHJpbmcqIGZ1bGxfbmFtZV87Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKLSAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKLSAgY29uc3QgRW51bU9wdGlvbnMqIG9wdGlvbnNfOwotCi0gIC8vIFRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIHR5cGUuCi0gIGJvb2wgaXNfcGxhY2Vob2xkZXJfOwotICAvLyBUcnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBhbmQgdGhlIHR5cGUgbmFtZSB3YXNuJ3QgZnVsbHktcXVhbGlmaWVkLgotICBib29sIGlzX3VucXVhbGlmaWVkX3BsYWNlaG9sZGVyXzsKLQotICBpbnQgdmFsdWVfY291bnRfOwotICBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZXNfOwotICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCi0gIC8vIG9mIEFsbG9jYXRlPEVudW1EZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PEVudW1EZXNjcmlwdG9yPigpIGluCi0gIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgotCi0gIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCi0gIEVudW1EZXNjcmlwdG9yKCkge30KLSAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOwotICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1EZXNjcmlwdG9yKTsKLX07Ci0KLS8vIERlc2NyaWJlcyBhbiBpbmRpdmlkdWFsIGVudW0gY29uc3RhbnQgb2YgYSBwYXJ0aWN1bGFyIHR5cGUuICBUbyBnZXQgdGhlCi0vLyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciBhIGdpdmVuIGVudW0gdmFsdWUsIGZpcnN0IGdldCB0aGUgRW51bURlc2NyaXB0b3IKLS8vIGZvciBpdHMgdHlwZSwgdGhlbiB1c2UgRW51bURlc2NyaXB0b3I6OkZpbmRWYWx1ZUJ5TmFtZSgpIG9yCi0vLyBFbnVtRGVzY3JpcHRvcjo6RmluZFZhbHVlQnlOdW1iZXIoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QKLS8vIHlvdXIgb3duIGRlc2NyaXB0b3JzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVudW1WYWx1ZURlc2NyaXB0b3IgewotIHB1YmxpYzoKLSAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7ICAvLyBOYW1lIG9mIHRoaXMgZW51bSBjb25zdGFudC4KLSAgaW50IGluZGV4KCkgY29uc3Q7ICAgICAgICAgICAvLyBJbmRleCB3aXRoaW4gdGhlIGVudW1zJ3MgRGVzY3JpcHRvci4KLSAgaW50IG51bWJlcigpIGNvbnN0OyAgICAgICAgICAvLyBOdW1lcmljIHZhbHVlIG9mIHRoaXMgZW51bSBjb25zdGFudC4KLQotICAvLyBUaGUgZnVsbF9uYW1lIG9mIGFuIGVudW0gdmFsdWUgaXMgYSBzaWJsaW5nIHN5bWJvbCBvZiB0aGUgZW51bSB0eXBlLgotICAvLyBlLmcuIHRoZSBmdWxsIG5hbWUgb2YgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIgaXMgYWN0dWFsbHkKLSAgLy8gImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UWVBFX0lOVDMyIiwgTk9UCi0gIC8vICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZS5UWVBFX0lOVDMyIi4gIFRoaXMgaXMgdG8gY29uZm9ybQotICAvLyB3aXRoIEMrKyBzY29waW5nIHJ1bGVzIGZvciBlbnVtcy4KLSAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKLQotICAvLyBUaGUgdHlwZSBvZiB0aGlzIHZhbHVlLiAgTmV2ZXIgTlVMTC4KLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIHR5cGUoKSBjb25zdDsKLQotICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBlbnVtIHZhbHVlLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUKLSAgLy8gYnkgYWRkaW5nIHRleHQgbGlrZSAiW2ZvbyA9IDEyMzRdIiBhZnRlciBhbiBlbnVtIHZhbHVlIGRlZmluaXRpb24uCi0gIC8vIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBFbnVtVmFsdWVPcHRpb25zIGluCi0gIC8vIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55IGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQKLSAgLy8gbWVzc2FnZS4KLSAgY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KLSAgdm9pZCBDb3B5VG8oRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7Ci0KLQotICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKLSAgLy8gZXh0ZW50IG9mIHRoaXMgZW51bSB2YWx1ZSBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcwotICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KLSAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgRW51bVZhbHVlT3B0aW9ucyBPcHRpb25zVHlwZTsKLQotICAvLyBBbGxvd3MgYWNjZXNzIHRvIEdldExvY2F0aW9uUGF0aCBmb3IgYW5ub3RhdGlvbnMuCi0gIGZyaWVuZCBjbGFzcyA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpQcmludGVyOwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgotICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OwotCi0gIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCi0gIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCi0gIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7Ci0KLSAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKLSAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOwotICBpbnQgbnVtYmVyXzsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIHR5cGVfOwotICBjb25zdCBFbnVtVmFsdWVPcHRpb25zKiBvcHRpb25zXzsKLSAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcwotICAvLyBvZiBBbGxvY2F0ZTxFbnVtVmFsdWVEZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PEVudW1WYWx1ZURlc2NyaXB0b3I+KCkKLSAgLy8gaW4gZGVzY3JpcHRvci5jYyBhbmQgdXBkYXRlIHRoZW0gdG8gaW5pdGlhbGl6ZSB0aGUgZmllbGQuCi0KLSAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KLSAgRW51bVZhbHVlRGVzY3JpcHRvcigpIHt9Ci0gIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKLSAgZnJpZW5kIGNsYXNzIEVudW1EZXNjcmlwdG9yOwotICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3JUYWJsZXM7Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbnVtVmFsdWVEZXNjcmlwdG9yKTsKLX07Ci0KLS8vIERlc2NyaWJlcyBhbiBSUEMgc2VydmljZS4gIFRvIGdldCB0aGUgU2VydmljZURlc2NyaXB0b3IgZm9yIGEgc2VydmljZSwKLS8vIGNhbGwgU2VydmljZTo6R2V0RGVzY3JpcHRvcigpLiAgR2VuZXJhdGVkIHNlcnZpY2UgY2xhc3NlcyBhbHNvIGhhdmUgYQotLy8gc3RhdGljIG1ldGhvZCBjYWxsZWQgZGVzY3JpcHRvcigpIHdoaWNoIHJldHVybnMgdGhlIHR5cGUncwotLy8gU2VydmljZURlc2NyaXB0b3IuICBVc2UgRGVzY3JpcHRvclBvb2wgdG8gY29uc3RydWN0IHlvdXIgb3duIGRlc2NyaXB0b3JzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFNlcnZpY2VEZXNjcmlwdG9yIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBub3QgaW5jbHVkaW5nIGl0cyBjb250YWluaW5nIHNjb3BlLgotICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsKLSAgLy8gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBzY29wZSBkZWxpbWl0ZWQgYnkgcGVyaW9kcy4KLSAgY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUoKSBjb25zdDsKLSAgLy8gSW5kZXggb2YgdGhpcyBzZXJ2aWNlIHdpdGhpbiB0aGUgZmlsZSdzIHNlcnZpY2VzIGFycmF5LgotICBpbnQgaW5kZXgoKSBjb25zdDsKLQotICAvLyBUaGUgLnByb3RvIGZpbGUgaW4gd2hpY2ggdGhpcyBzZXJ2aWNlIHdhcyBkZWZpbmVkLiAgTmV2ZXIgTlVMTC4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUoKSBjb25zdDsKLQotICAvLyBHZXQgb3B0aW9ucyBmb3IgdGhpcyBzZXJ2aWNlIHR5cGUuICBUaGVzZSBhcmUgc3BlY2lmaWVkIGluIHRoZSAucHJvdG8gZmlsZQotICAvLyBieSBwbGFjaW5nIGxpbmVzIGxpa2UgIm9wdGlvbiBmb28gPSAxMjM0OyIgaW4gdGhlIHNlcnZpY2UgZGVmaW5pdGlvbi4KLSAgLy8gQWxsb3dlZCBvcHRpb25zIGFyZSBkZWZpbmVkIGJ5IFNlcnZpY2VPcHRpb25zIGluCi0gIC8vIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55IGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQKLSAgLy8gbWVzc2FnZS4KLSAgY29uc3QgU2VydmljZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKLQotICAvLyBUaGUgbnVtYmVyIG9mIG1ldGhvZHMgdGhpcyBzZXJ2aWNlIGRlZmluZXMuCi0gIGludCBtZXRob2RfY291bnQoKSBjb25zdDsKLSAgLy8gR2V0cyBhIE1ldGhvZERlc2NyaXB0b3IgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCBtZXRob2RfY291bnQoKS4KLSAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZChpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIExvb2sgdXAgYSBNZXRob2REZXNjcmlwdG9yIGJ5IG5hbWUuCi0gIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIEZpbmRNZXRob2RCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgotICB2b2lkIENvcHlUbyhTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7Ci0KLQotICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKLSAgLy8gZXh0ZW50IG9mIHRoaXMgc2VydmljZSBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcwotICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KLSAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIHR5cGVkZWYgU2VydmljZU9wdGlvbnMgT3B0aW9uc1R5cGU7Ci0KLSAgLy8gQWxsb3dzIGFjY2VzcyB0byBHZXRMb2NhdGlvblBhdGggZm9yIGFubm90YXRpb25zLgotICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6UHJpbnRlcjsKLQotICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KLSAgdm9pZCBEZWJ1Z1N0cmluZyhzdHJpbmcgKmNvbnRlbnRzLCBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OwotCi0gIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCi0gIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCi0gIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7Ci0KLSAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKLSAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87Ci0gIGNvbnN0IFNlcnZpY2VPcHRpb25zKiBvcHRpb25zXzsKLSAgaW50IG1ldGhvZF9jb3VudF87Ci0gIE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZHNfOwotICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCi0gIC8vIG9mIEFsbG9jYXRlPFNlcnZpY2VEZXNjcmlwdG9yPigpIGFuZCBBbGxvY2F0ZUFycmF5PFNlcnZpY2VEZXNjcmlwdG9yPigpIGluCi0gIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgotCi0gIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCi0gIFNlcnZpY2VEZXNjcmlwdG9yKCkge30KLSAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOwotICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBNZXRob2REZXNjcmlwdG9yOwotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2VydmljZURlc2NyaXB0b3IpOwotfTsKLQotLy8gRGVzY3JpYmVzIGFuIGluZGl2aWR1YWwgc2VydmljZSBtZXRob2QuICBUbyBvYnRhaW4gYSBNZXRob2REZXNjcmlwdG9yIGdpdmVuCi0vLyBhIHNlcnZpY2UsIGZpcnN0IGdldCBpdHMgU2VydmljZURlc2NyaXB0b3IsIHRoZW4gY2FsbAotLy8gU2VydmljZURlc2NyaXB0b3I6OkZpbmRNZXRob2RCeU5hbWUoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QgeW91cgotLy8gb3duIGRlc2NyaXB0b3JzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1ldGhvZERlc2NyaXB0b3IgewotIHB1YmxpYzoKLSAgLy8gTmFtZSBvZiB0aGlzIG1ldGhvZCwgbm90IGluY2x1ZGluZyBjb250YWluaW5nIHNjb3BlLgotICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsKLSAgLy8gVGhlIGZ1bGx5LXF1YWxpZmllZCBuYW1lIG9mIHRoZSBtZXRob2QsIHNjb3BlIGRlbGltaXRlZCBieSBwZXJpb2RzLgotICBjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSgpIGNvbnN0OwotICAvLyBJbmRleCB3aXRoaW4gdGhlIHNlcnZpY2UncyBEZXNjcmlwdG9yLgotICBpbnQgaW5kZXgoKSBjb25zdDsKLQotICAvLyBHZXRzIHRoZSBzZXJ2aWNlIHRvIHdoaWNoIHRoaXMgbWV0aG9kIGJlbG9uZ3MuICBOZXZlciBOVUxMLgotICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZSgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSB3aGljaCB0aGlzIG1ldGhvZCBhY2NlcHRzIGFzIGlucHV0LgotICBjb25zdCBEZXNjcmlwdG9yKiBpbnB1dF90eXBlKCkgY29uc3Q7Ci0gIC8vIEdldHMgdGhlIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSB3aGljaCB0aGlzIG1lc3NhZ2UgcHJvZHVjZXMgYXMgb3V0cHV0LgotICBjb25zdCBEZXNjcmlwdG9yKiBvdXRwdXRfdHlwZSgpIGNvbnN0OwotCi0gIC8vIEdldHMgd2hldGhlciB0aGUgY2xpZW50IHN0cmVhbXMgbXVsdGlwbGUgcmVxdWVzdHMuCi0gIGJvb2wgY2xpZW50X3N0cmVhbWluZygpIGNvbnN0OwotICAvLyBHZXRzIHdoZXRoZXIgdGhlIHNlcnZlciBzdHJlYW1zIG11bHRpcGxlIHJlc3BvbnNlcy4KLSAgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3Q7Ci0KLSAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgbWV0aG9kLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKLSAgLy8gcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIGN1cmx5LWJyYWNlcyBhZnRlciBhIG1ldGhvZAotICAvLyBkZWNsYXJhdGlvbi4gIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBNZXRob2RPcHRpb25zIGluCi0gIC8vIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvLCBhbmQgYW55IGF2YWlsYWJsZSBleHRlbnNpb25zIG9mIHRoYXQKLSAgLy8gbWVzc2FnZS4KLSAgY29uc3QgTWV0aG9kT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KLSAgdm9pZCBDb3B5VG8oTWV0aG9kRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7Ci0KLQotICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKLSAgLy8gZXh0ZW50IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCi0gIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgotICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBNZXRob2RPcHRpb25zIE9wdGlvbnNUeXBlOwotCi0gIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KLSAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OlByaW50ZXI7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7Ci0KLSAgLy8gV2Fsa3MgdXAgdGhlIGRlc2NyaXB0b3IgdHJlZSB0byBnZW5lcmF0ZSB0aGUgc291cmNlIGxvY2F0aW9uIHBhdGgKLSAgLy8gdG8gdGhpcyBkZXNjcmlwdG9yIGZyb20gdGhlIGZpbGUgcm9vdC4KLSAgdm9pZCBHZXRMb2NhdGlvblBhdGgoc3RkOjp2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdDsKLQotICBjb25zdCBzdHJpbmcqIG5hbWVfOwotICBjb25zdCBzdHJpbmcqIGZ1bGxfbmFtZV87Ci0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlXzsKLSAgY29uc3QgRGVzY3JpcHRvciogaW5wdXRfdHlwZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG91dHB1dF90eXBlXzsKLSAgY29uc3QgTWV0aG9kT3B0aW9ucyogb3B0aW9uc187Ci0gIGJvb2wgY2xpZW50X3N0cmVhbWluZ187Ci0gIGJvb2wgc2VydmVyX3N0cmVhbWluZ187Ci0gIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKLSAgLy8gb2YgQWxsb2NhdGU8TWV0aG9kRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxNZXRob2REZXNjcmlwdG9yPigpIGluCi0gIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgotCi0gIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCi0gIE1ldGhvZERlc2NyaXB0b3IoKSB7fQotICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7Ci0gIGZyaWVuZCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1ldGhvZERlc2NyaXB0b3IpOwotfTsKLQotCi0vLyBEZXNjcmliZXMgYSB3aG9sZSAucHJvdG8gZmlsZS4gIFRvIGdldCB0aGUgRmlsZURlc2NyaXB0b3IgZm9yIGEgY29tcGlsZWQtaW4KLS8vIGZpbGUsIGdldCB0aGUgZGVzY3JpcHRvciBmb3Igc29tZXRoaW5nIGRlZmluZWQgaW4gdGhhdCBmaWxlIGFuZCBjYWxsCi0vLyBkZXNjcmlwdG9yLT5maWxlKCkuICBVc2UgRGVzY3JpcHRvclBvb2wgdG8gY29uc3RydWN0IHlvdXIgb3duIGRlc2NyaXB0b3JzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpbGVEZXNjcmlwdG9yIHsKLSBwdWJsaWM6Ci0gIC8vIFRoZSBmaWxlbmFtZSwgcmVsYXRpdmUgdG8gdGhlIHNvdXJjZSB0cmVlLgotICAvLyBlLmcuICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIKLSAgY29uc3Qgc3RyaW5nJiBuYW1lKCkgY29uc3Q7Ci0KLSAgLy8gVGhlIHBhY2thZ2UsIGUuZy4gImdvb2dsZS5wcm90b2J1Zi5jb21waWxlciIuCi0gIGNvbnN0IHN0cmluZyYgcGFja2FnZSgpIGNvbnN0OwotCi0gIC8vIFRoZSBEZXNjcmlwdG9yUG9vbCBpbiB3aGljaCB0aGlzIEZpbGVEZXNjcmlwdG9yIGFuZCBhbGwgaXRzIGNvbnRlbnRzIHdlcmUKLSAgLy8gYWxsb2NhdGVkLiAgTmV2ZXIgTlVMTC4KLSAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2woKSBjb25zdDsKLQotICAvLyBUaGUgbnVtYmVyIG9mIGZpbGVzIGltcG9ydGVkIGJ5IHRoaXMgb25lLgotICBpbnQgZGVwZW5kZW5jeV9jb3VudCgpIGNvbnN0OwotICAvLyBHZXRzIGFuIGltcG9ydGVkIGZpbGUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCBkZXBlbmRlbmN5X2NvdW50KCkuCi0gIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIFRoZSBudW1iZXIgb2YgZmlsZXMgcHVibGljIGltcG9ydGVkIGJ5IHRoaXMgb25lLgotICAvLyBUaGUgcHVibGljIGRlcGVuZGVuY3kgbGlzdCBpcyBhIHN1YnNldCBvZiB0aGUgZGVwZW5kZW5jeSBsaXN0LgotICBpbnQgcHVibGljX2RlcGVuZGVuY3lfY291bnQoKSBjb25zdDsKLSAgLy8gR2V0cyBhIHB1YmxpYyBpbXBvcnRlZCBmaWxlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwKLSAgLy8gcHVibGljX2RlcGVuZGVuY3lfY291bnQoKS4KLSAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OwotCi0gIC8vIFRoZSBudW1iZXIgb2YgZmlsZXMgdGhhdCBhcmUgaW1wb3J0ZWQgZm9yIHdlYWsgZmllbGRzLgotICAvLyBUaGUgd2VhayBkZXBlbmRlbmN5IGxpc3QgaXMgYSBzdWJzZXQgb2YgdGhlIGRlcGVuZGVuY3kgbGlzdC4KLSAgaW50IHdlYWtfZGVwZW5kZW5jeV9jb3VudCgpIGNvbnN0OwotICAvLyBHZXRzIGEgd2VhayBpbXBvcnRlZCBmaWxlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwKLSAgLy8gd2Vha19kZXBlbmRlbmN5X2NvdW50KCkuCi0gIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgotICBjb25zdCBGaWxlRGVzY3JpcHRvciogd2Vha19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gTnVtYmVyIG9mIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBmaWxlLiAgKFRoaXMgZG9lcyBub3QKLSAgLy8gaW5jbHVkZSBuZXN0ZWQgdHlwZXMuKQotICBpbnQgbWVzc2FnZV90eXBlX2NvdW50KCkgY29uc3Q7Ci0gIC8vIEdldHMgYSB0b3AtbGV2ZWwgbWVzc2FnZSB0eXBlLCB3aGVyZSAwIDw9IGluZGV4IDwgbWVzc2FnZV90eXBlX2NvdW50KCkuCi0gIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgotICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBOdW1iZXIgb2YgdG9wLWxldmVsIGVudW0gdHlwZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuICAoVGhpcyBkb2VzIG5vdAotICAvLyBpbmNsdWRlIG5lc3RlZCB0eXBlcy4pCi0gIGludCBlbnVtX3R5cGVfY291bnQoKSBjb25zdDsKLSAgLy8gR2V0cyBhIHRvcC1sZXZlbCBlbnVtIHR5cGUsIHdoZXJlIDAgPD0gaW5kZXggPCBlbnVtX3R5cGVfY291bnQoKS4KLSAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBOdW1iZXIgb2Ygc2VydmljZXMgZGVmaW5lZCBpbiB0aGlzIGZpbGUuCi0gIGludCBzZXJ2aWNlX2NvdW50KCkgY29uc3Q7Ci0gIC8vIEdldHMgYSBzZXJ2aWNlLCB3aGVyZSAwIDw9IGluZGV4IDwgc2VydmljZV9jb3VudCgpLgotICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UoaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBOdW1iZXIgb2YgZXh0ZW5zaW9ucyBkZWZpbmVkIGF0IGZpbGUgc2NvcGUuICAoVGhpcyBkb2VzIG5vdCBpbmNsdWRlCi0gIC8vIGV4dGVuc2lvbnMgbmVzdGVkIHdpdGhpbiBtZXNzYWdlIHR5cGVzLikKLSAgaW50IGV4dGVuc2lvbl9jb3VudCgpIGNvbnN0OwotICAvLyBHZXRzIGFuIGV4dGVuc2lvbidzIGRlc2NyaXB0b3IsIHdoZXJlIDAgPD0gaW5kZXggPCBleHRlbnNpb25fY291bnQoKS4KLSAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7Ci0KLSAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgZmlsZS4gIFRoZXNlIGFyZSBzcGVjaWZpZWQgaW4gdGhlIC5wcm90byBmaWxlIGJ5Ci0gIC8vIHBsYWNpbmcgbGluZXMgbGlrZSAib3B0aW9uIGZvbyA9IDEyMzQ7IiBhdCB0aGUgdG9wIGxldmVsLCBvdXRzaWRlIG9mIGFueQotICAvLyBvdGhlciBkZWZpbml0aW9ucy4gIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBGaWxlT3B0aW9ucyBpbgotICAvLyBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bywgYW5kIGFueSBhdmFpbGFibGUgZXh0ZW5zaW9ucyBvZiB0aGF0Ci0gIC8vIG1lc3NhZ2UuCi0gIGNvbnN0IEZpbGVPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0KLSAgLy8gU3ludGF4IG9mIHRoaXMgZmlsZS4KLSAgZW51bSBTeW50YXggewotICAgIFNZTlRBWF9VTktOT1dOID0gMCwKLSAgICBTWU5UQVhfUFJPVE8yICA9IDIsCi0gICAgU1lOVEFYX1BST1RPMyAgPSAzLAotICB9OwotICBTeW50YXggc3ludGF4KCkgY29uc3Q7Ci0gIHN0YXRpYyBjb25zdCBjaGFyKiBTeW50YXhOYW1lKFN5bnRheCBzeW50YXgpOwotCi0gIC8vIEZpbmQgYSB0b3AtbGV2ZWwgbWVzc2FnZSB0eXBlIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLgotICBjb25zdCBEZXNjcmlwdG9yKiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgLy8gRmluZCBhIHRvcC1sZXZlbCBlbnVtIHR5cGUgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuCi0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgLy8gRmluZCBhbiBlbnVtIHZhbHVlIGRlZmluZWQgaW4gYW55IHRvcC1sZXZlbCBlbnVtIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYKLSAgLy8gbm90IGZvdW5kLgotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gIC8vIEZpbmQgYSBzZXJ2aWNlIGRlZmluaXRpb24gYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuCi0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBGaW5kU2VydmljZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotICAvLyBGaW5kIGEgdG9wLWxldmVsIGV4dGVuc2lvbiBkZWZpbml0aW9uIGJ5IG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm90IGZvdW5kLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgLy8gU2ltaWxhciB0byBGaW5kRXh0ZW5zaW9uQnlOYW1lKCksIGJ1dCBzZWFyY2hlcyBieSBsb3dlcmNhc2VkLW5hbWUuICBTZWUKLSAgLy8gRGVzY3JpcHRvcjo6RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCkuCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotICAvLyBTaW1pbGFyIHRvIEZpbmRFeHRlbnNpb25CeU5hbWUoKSwgYnV0IHNlYXJjaGVzIGJ5IGNhbWVsY2FzZWQtbmFtZS4gIFNlZQotICAvLyBEZXNjcmlwdG9yOjpGaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoKS4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkNvcHlUbygpLgotICAvLyBOb3RlczoKLSAgLy8gLSBUaGlzIG1ldGhvZCBkb2VzIE5PVCBjb3B5IHNvdXJjZSBjb2RlIGluZm9ybWF0aW9uIHNpbmNlIGl0IGlzIHJlbGF0aXZlbHkKLSAgLy8gICBsYXJnZSBhbmQgcmFyZWx5IG5lZWRlZC4gIFNlZSBDb3B5U291cmNlQ29kZUluZm9UbygpIGJlbG93LgotICB2b2lkIENvcHlUbyhGaWxlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7Ci0gIC8vIFdyaXRlIHRoZSBzb3VyY2UgY29kZSBpbmZvcm1hdGlvbiBvZiB0aGlzIEZpbGVEZXNjcmlwdG9yIGludG8gdGhlIGdpdmVuCi0gIC8vIEZpbGVEZXNjcmlwdG9yUHJvdG8uICBTZWUgQ29weVRvKCkgYWJvdmUuCi0gIHZvaWQgQ29weVNvdXJjZUNvZGVJbmZvVG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OwotICAvLyBGaWxsIHRoZSBqc29uX25hbWUgZmllbGQgb2YgRmllbGREZXNjcmlwdG9yUHJvdG8gZm9yIGFsbCBmaWVsZHMuIENhbiBvbmx5Ci0gIC8vIGJlIGNhbGxlZCBhZnRlciBDb3B5VG8oKS4KLSAgdm9pZCBDb3B5SnNvbk5hbWVUbyhGaWxlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7Ci0KLSAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCi0gIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoaXMgaXMgYSBwbGFjZWhvbGRlciBmb3IgYW4gdW5rbm93biBmaWxlLiBUaGlzIHdpbGwKLSAgLy8gb25seSBiZSB0aGUgY2FzZSBpZiB0aGlzIGRlc2NyaXB0b3IgY29tZXMgZnJvbSBhIERlc2NyaXB0b3JQb29sCi0gIC8vIHdpdGggQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgc2V0LgotICBib29sIGlzX3BsYWNlaG9sZGVyKCkgY29uc3Q7Ci0KLSAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUgZXh0ZW50IG9mCi0gIC8vIHRoaXMgZmlsZSBkZWNsYXJhdGlvbiAobmFtZWx5LCB0aGUgZW1wdHkgcGF0aCkuCi0gIGJvb2wgR2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7Ci0KLSAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKLSAgLy8gZXh0ZW50IG9mIHRoZSBkZWNsYXJhdGlvbiBvciBkZWNsYXJhdGlvbi1wYXJ0IGRlbm90ZWQgYnkgfHBhdGh8LgotICAvLyBSZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMgfCpvdXRfbG9jYXRpb258IHVuY2hhbmdlZCBpZmYgbG9jYXRpb24KLSAgLy8gaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUuICAoU2VlIFNvdXJjZUNvZGVJbmZvIGZvcgotICAvLyBkZXNjcmlwdGlvbiBvZiBwYXRoIGVuY29kaW5nLikKLSAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihjb25zdCBzdGQ6OnZlY3RvcjxpbnQ+JiBwYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgdHlwZWRlZiBGaWxlT3B0aW9ucyBPcHRpb25zVHlwZTsKLQotICBjb25zdCBzdHJpbmcqIG5hbWVfOwotICBjb25zdCBzdHJpbmcqIHBhY2thZ2VfOwotICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbF87Ci0gIGludCBkZXBlbmRlbmN5X2NvdW50XzsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqKiBkZXBlbmRlbmNpZXNfOwotICBpbnQgcHVibGljX2RlcGVuZGVuY3lfY291bnRfOwotICBpbnQqIHB1YmxpY19kZXBlbmRlbmNpZXNfOwotICBpbnQgd2Vha19kZXBlbmRlbmN5X2NvdW50XzsKLSAgaW50KiB3ZWFrX2RlcGVuZGVuY2llc187Ci0gIGludCBtZXNzYWdlX3R5cGVfY291bnRfOwotICBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGVzXzsKLSAgaW50IGVudW1fdHlwZV9jb3VudF87Ci0gIEVudW1EZXNjcmlwdG9yKiBlbnVtX3R5cGVzXzsKLSAgaW50IHNlcnZpY2VfY291bnRfOwotICBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZXNfOwotICBpbnQgZXh0ZW5zaW9uX2NvdW50XzsKLSAgU3ludGF4IHN5bnRheF87Ci0gIGJvb2wgaXNfcGxhY2Vob2xkZXJfOwotICBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbnNfOwotICBjb25zdCBGaWxlT3B0aW9ucyogb3B0aW9uc187Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqIHRhYmxlc187Ci0gIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvXzsKLSAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcwotICAvLyBvZiBBbGxvY2F0ZTxGaWxlRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxGaWxlRGVzY3JpcHRvcj4oKSBpbgotICAvLyBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KLQotICBGaWxlRGVzY3JpcHRvcigpIHt9Ci0gIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKLSAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBGaWVsZERlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBPbmVvZkRlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBNZXRob2REZXNjcmlwdG9yOwotICBmcmllbmQgY2xhc3MgU2VydmljZURlc2NyaXB0b3I7Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlRGVzY3JpcHRvcik7Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIFVzZWQgdG8gY29uc3RydWN0IGRlc2NyaXB0b3JzLgotLy8KLS8vIE5vcm1hbGx5IHlvdSB3b24ndCB3YW50IHRvIGJ1aWxkIHlvdXIgb3duIGRlc2NyaXB0b3JzLiAgTWVzc2FnZSBjbGFzc2VzCi0vLyBjb25zdHJ1Y3RlZCBieSB0aGUgcHJvdG9jb2wgY29tcGlsZXIgd2lsbCBwcm92aWRlIHRoZW0gZm9yIHlvdS4gIEhvd2V2ZXIsCi0vLyBpZiB5b3UgYXJlIGltcGxlbWVudGluZyBNZXNzYWdlIG9uIHlvdXIgb3duLCBvciBpZiB5b3UgYXJlIHdyaXRpbmcgYQotLy8gcHJvZ3JhbSB3aGljaCBjYW4gb3BlcmF0ZSBvbiB0b3RhbGx5IGFyYml0cmFyeSB0eXBlcyBhbmQgbmVlZHMgdG8gbG9hZAotLy8gdGhlbSBmcm9tIHNvbWUgc29ydCBvZiBkYXRhYmFzZSwgeW91IG1pZ2h0IG5lZWQgdG8uCi0vLwotLy8gU2luY2UgRGVzY3JpcHRvcnMgYXJlIGNvbXBvc2VkIG9mIGEgd2hvbGUgbG90IG9mIGNyb3NzLWxpbmtlZCBiaXRzIG9mCi0vLyBkYXRhIHRoYXQgd291bGQgYmUgYSBwYWluIHRvIHB1dCB0b2dldGhlciBtYW51YWxseSwgdGhlCi0vLyBEZXNjcmlwdG9yUG9vbCBjbGFzcyBpcyBwcm92aWRlZCB0byBtYWtlIHRoZSBwcm9jZXNzIGVhc2llci4gIEl0IGNhbgotLy8gdGFrZSBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gKGRlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90byksIHZhbGlkYXRlIGl0LAotLy8gYW5kIGNvbnZlcnQgaXQgdG8gYSBzZXQgb2YgbmljZWx5IGNyb3NzLWxpbmtlZCBEZXNjcmlwdG9ycy4KLS8vCi0vLyBEZXNjcmlwdG9yUG9vbCBhbHNvIGhlbHBzIHdpdGggbWVtb3J5IG1hbmFnZW1lbnQuICBEZXNjcmlwdG9ycyBhcmUKLS8vIGNvbXBvc2VkIG9mIG1hbnkgb2JqZWN0cyBjb250YWluaW5nIHN0YXRpYyBkYXRhIGFuZCBwb2ludGVycyB0byBlYWNoCi0vLyBvdGhlci4gIEluIGFsbCBsaWtlbGlob29kLCB3aGVuIGl0IGNvbWVzIHRpbWUgdG8gZGVsZXRlIHRoaXMgZGF0YSwKLS8vIHlvdSdsbCB3YW50IHRvIGRlbGV0ZSBpdCBhbGwgYXQgb25jZS4gIEluIGZhY3QsIGl0IGlzIG5vdCB1bmNvbW1vbiB0bwotLy8gaGF2ZSBhIHdob2xlIHBvb2wgb2YgZGVzY3JpcHRvcnMgYWxsIGNyb3NzLWxpbmtlZCB3aXRoIGVhY2ggb3RoZXIgd2hpY2gKLS8vIHlvdSB3aXNoIHRvIGRlbGV0ZSBhbGwgYXQgb25jZS4gIFRoaXMgY2xhc3MgcmVwcmVzZW50cyBzdWNoIGEgcG9vbCwgYW5kCi0vLyBoYW5kbGVzIHRoZSBtZW1vcnkgbWFuYWdlbWVudCBmb3IgeW91LgotLy8KLS8vIFlvdSBjYW4gYWxzbyBzZWFyY2ggZm9yIGRlc2NyaXB0b3JzIHdpdGhpbiBhIERlc2NyaXB0b3JQb29sIGJ5IG5hbWUsIGFuZAotLy8gZXh0ZW5zaW9ucyBieSBudW1iZXIuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclBvb2wgewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGEgbm9ybWFsLCBlbXB0eSBEZXNjcmlwdG9yUG9vbC4KLSAgRGVzY3JpcHRvclBvb2woKTsKLQotICAvLyBDb25zdHJ1Y3RzIGEgRGVzY3JpcHRvclBvb2wgdGhhdCwgd2hlbiBpdCBjYW4ndCBmaW5kIHNvbWV0aGluZyBhbW9uZyB0aGUKLSAgLy8gZGVzY3JpcHRvcnMgYWxyZWFkeSBpbiB0aGUgcG9vbCwgbG9va3MgZm9yIGl0IGluIHRoZSBnaXZlbgotICAvLyBEZXNjcmlwdG9yRGF0YWJhc2UuCi0gIC8vIE5vdGVzOgotICAvLyAtIElmIGEgRGVzY3JpcHRvclBvb2wgaXMgY29uc3RydWN0ZWQgdGhpcyB3YXksIGl0cyBCdWlsZEZpbGUqKCkgbWV0aG9kcwotICAvLyAgIG11c3Qgbm90IGJlIGNhbGxlZCAodGhleSB3aWxsIGFzc2VydC1mYWlsKS4gIFRoZSBvbmx5IHdheSB0byBwb3B1bGF0ZQotICAvLyAgIHRoZSBwb29sIHdpdGggZGVzY3JpcHRvcnMgaXMgdG8gY2FsbCB0aGUgRmluZCpCeSooKSBtZXRob2RzLgotICAvLyAtIFRoZSBGaW5kKkJ5KigpIG1ldGhvZHMgbWF5IGJsb2NrIHRoZSBjYWxsaW5nIHRocmVhZCBpZiB0aGUKLSAgLy8gICBEZXNjcmlwdG9yRGF0YWJhc2UgYmxvY2tzLiAgVGhpcyBpbiB0dXJuIG1lYW5zIHRoYXQgcGFyc2luZyBtZXNzYWdlcwotICAvLyAgIG1heSBibG9jayBpZiB0aGV5IG5lZWQgdG8gbG9vayB1cCBleHRlbnNpb25zLgotICAvLyAtIFRoZSBGaW5kKkJ5KigpIG1ldGhvZHMgd2lsbCB1c2UgbXV0ZXhlcyBmb3IgdGhyZWFkLXNhZmV0eSwgdGh1cyBtYWtpbmcKLSAgLy8gICB0aGVtIHNsb3dlciBldmVuIHdoZW4gdGhleSBkb24ndCBoYXZlIHRvIGZhbGwgYmFjayB0byB0aGUgZGF0YWJhc2UuCi0gIC8vICAgSW4gZmFjdCwgZXZlbiB0aGUgRmluZCpCeSooKSBtZXRob2RzIG9mIGRlc2NyaXB0b3Igb2JqZWN0cyBvd25lZCBieQotICAvLyAgIHRoaXMgcG9vbCB3aWxsIGJlIHNsb3dlciwgc2luY2UgdGhleSB3aWxsIGhhdmUgdG8gb2J0YWluIGxvY2tzIHRvby4KLSAgLy8gLSBBbiBFcnJvckNvbGxlY3RvciBtYXkgb3B0aW9uYWxseSBiZSBnaXZlbiB0byBjb2xsZWN0IHZhbGlkYXRpb24gZXJyb3JzCi0gIC8vICAgaW4gZmlsZXMgbG9hZGVkIGZyb20gdGhlIGRhdGFiYXNlLiAgSWYgbm90IGdpdmVuLCBlcnJvcnMgd2lsbCBiZSBwcmludGVkCi0gIC8vICAgdG8gR09PR0xFX0xPRyhFUlJPUikuICBSZW1lbWJlciB0aGF0IGZpbGVzIGFyZSBidWlsdCBvbi1kZW1hbmQsIHNvIHRoaXMKLSAgLy8gICBFcnJvckNvbGxlY3RvciBtYXkgYmUgY2FsbGVkIGZyb20gYW55IHRocmVhZCB0aGF0IGNhbGxzIG9uZSBvZiB0aGUKLSAgLy8gICBGaW5kKkJ5KigpIG1ldGhvZHMuCi0gIC8vIC0gVGhlIERlc2NyaXB0b3JEYXRhYmFzZSBtdXN0IG5vdCBiZSBtdXRhdGVkIGR1cmluZyB0aGUgbGlmZXRpbWUgb2YKLSAgLy8gICB0aGUgRGVzY3JpcHRvclBvb2wuIEV2ZW4gaWYgdGhlIGNsaWVudCB0YWtlcyBjYXJlIHRvIGF2b2lkIGRhdGEgcmFjZXMsCi0gIC8vICAgY2hhbmdlcyB0byB0aGUgY29udGVudCBvZiB0aGUgRGVzY3JpcHRvckRhdGFiYXNlIG1heSBub3QgYmUgcmVmbGVjdGVkCi0gIC8vICAgaW4gc3Vic2VxdWVudCBsb29rdXBzIGluIHRoZSBEZXNjcmlwdG9yUG9vbC4KLSAgY2xhc3MgRXJyb3JDb2xsZWN0b3I7Ci0gIGV4cGxpY2l0IERlc2NyaXB0b3JQb29sKERlc2NyaXB0b3JEYXRhYmFzZSogZmFsbGJhY2tfZGF0YWJhc2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IgPSBOVUxMKTsKLQotICB+RGVzY3JpcHRvclBvb2woKTsKLQotICAvLyBHZXQgYSBwb2ludGVyIHRvIHRoZSBnZW5lcmF0ZWQgcG9vbC4gIEdlbmVyYXRlZCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMKLSAgLy8gd2hpY2ggYXJlIGNvbXBpbGVkIGludG8gdGhlIGJpbmFyeSB3aWxsIGFsbG9jYXRlIHRoZWlyIGRlc2NyaXB0b3JzIGluCi0gIC8vIHRoaXMgcG9vbC4gIERvIG5vdCBhZGQgeW91ciBvd24gZGVzY3JpcHRvcnMgdG8gdGhpcyBwb29sLgotICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvclBvb2wqIGdlbmVyYXRlZF9wb29sKCk7Ci0KLQotICAvLyBGaW5kIGEgRmlsZURlc2NyaXB0b3IgaW4gdGhlIHBvb2wgYnkgZmlsZSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vdAotICAvLyBmb3VuZC4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0KLSAgLy8gRmluZCB0aGUgRmlsZURlc2NyaXB0b3IgaW4gdGhlIHBvb2wgd2hpY2ggZGVmaW5lcyB0aGUgZ2l2ZW4gc3ltYm9sLgotICAvLyBJZiBhbnkgb2YgdGhlIEZpbmQqQnlOYW1lKCkgbWV0aG9kcyBiZWxvdyB3b3VsZCBzdWNjZWVkLCB0aGVuIHRoaXMgaXMKLSAgLy8gZXF1aXZhbGVudCB0byBjYWxsaW5nIHRoYXQgbWV0aG9kIGFuZCBjYWxsaW5nIHRoZSByZXN1bHQncyBmaWxlKCkgbWV0aG9kLgotICAvLyBPdGhlcndpc2UgdGhpcyByZXR1cm5zIE5VTEwuCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woCi0gICAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lKSBjb25zdDsKLQotICAvLyBMb29raW5nIHVwIGRlc2NyaXB0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUaGVzZSBmaW5kIGRlc2NyaXB0b3JzIGJ5IGZ1bGx5LXF1YWxpZmllZCBuYW1lLiAgVGhlc2Ugd2lsbCBmaW5kIGJvdGgKLSAgLy8gdG9wLWxldmVsIGRlc2NyaXB0b3JzIGFuZCBuZXN0ZWQgZGVzY3JpcHRvcnMuICBUaGV5IHJldHVybiBOVUxMIGlmIG5vdAotICAvLyBmb3VuZC4KLQotICBjb25zdCBEZXNjcmlwdG9yKiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogRmluZE9uZW9mQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogRmluZFNlcnZpY2VCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogRmluZE1ldGhvZEJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotCi0gIC8vIEZpbmRzIGFuIGV4dGVuc2lvbiBvZiB0aGUgZ2l2ZW4gdHlwZSBieSBudW1iZXIuICBUaGUgZXh0ZW5kZWUgbXVzdCBiZQotICAvLyBhIG1lbWJlciBvZiB0aGlzIERlc2NyaXB0b3JQb29sIG9yIG9uZSBvZiBpdHMgdW5kZXJsYXlzLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeU51bWJlcihjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlcikgY29uc3Q7Ci0KLSAgLy8gRmluZHMgZXh0ZW5zaW9ucyBvZiBleHRlbmRlZS4gVGhlIGV4dGVuc2lvbnMgd2lsbCBiZSBhcHBlbmRlZCB0bwotICAvLyBvdXQgaW4gYW4gdW5kZWZpbmVkIG9yZGVyLiBPbmx5IGV4dGVuc2lvbnMgZGVmaW5lZCBkaXJlY3RseSBpbgotICAvLyB0aGlzIERlc2NyaXB0b3JQb29sIG9yIG9uZSBvZiBpdHMgdW5kZXJsYXlzIGFyZSBndWFyYW50ZWVkIHRvIGJlCi0gIC8vIGZvdW5kOiBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIG1pZ2h0IG5vdCBiZSBmb3VuZAotICAvLyBkZXBlbmRpbmcgb24gdGhlIGRhdGFiYXNlIGltcGxlbWVudGF0aW9uLgotICB2b2lkIEZpbmRBbGxFeHRlbnNpb25zKGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0OwotCi0gIC8vIEJ1aWxkaW5nIGRlc2NyaXB0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gV2hlbiBjb252ZXJ0aW5nIGEgRmlsZURlc2NyaXB0b3JQcm90byB0byBhIEZpbGVEZXNjcmlwdG9yLCB2YXJpb3VzCi0gIC8vIGVycm9ycyBtaWdodCBiZSBkZXRlY3RlZCBpbiB0aGUgaW5wdXQuICBUaGUgY2FsbGVyIG1heSBoYW5kbGUgdGhlc2UKLSAgLy8gcHJvZ3JhbW1hdGljYWxseSBieSBpbXBsZW1lbnRpbmcgYW4gRXJyb3JDb2xsZWN0b3IuCi0gIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFcnJvckNvbGxlY3RvciB7Ci0gICBwdWJsaWM6Ci0gICAgaW5saW5lIEVycm9yQ29sbGVjdG9yKCkge30KLSAgICB2aXJ0dWFsIH5FcnJvckNvbGxlY3RvcigpOwotCi0gICAgLy8gVGhlc2UgY29uc3RhbnRzIHNwZWNpZnkgd2hhdCBleGFjdCBwYXJ0IG9mIHRoZSBjb25zdHJ1Y3QgaXMgYnJva2VuLgotICAgIC8vIFRoaXMgaXMgdXNlZnVsIGUuZy4gZm9yIG1hcHBpbmcgdGhlIGVycm9yIGJhY2sgdG8gYW4gZXhhY3QgbG9jYXRpb24KLSAgICAvLyBpbiBhIC5wcm90byBmaWxlLgotICAgIGVudW0gRXJyb3JMb2NhdGlvbiB7Ci0gICAgICBOQU1FLCAgICAgICAgICAgICAgLy8gdGhlIHN5bWJvbCBuYW1lLCBvciB0aGUgcGFja2FnZSBuYW1lIGZvciBmaWxlcwotICAgICAgTlVNQkVSLCAgICAgICAgICAgIC8vIGZpZWxkIG9yIGV4dGVuc2lvbiByYW5nZSBudW1iZXIKLSAgICAgIFRZUEUsICAgICAgICAgICAgICAvLyBmaWVsZCB0eXBlCi0gICAgICBFWFRFTkRFRSwgICAgICAgICAgLy8gZmllbGQgZXh0ZW5kZWUKLSAgICAgIERFRkFVTFRfVkFMVUUsICAgICAvLyBmaWVsZCBkZWZhdWx0IHZhbHVlCi0gICAgICBJTlBVVF9UWVBFLCAgICAgICAgLy8gbWV0aG9kIGlucHV0IHR5cGUKLSAgICAgIE9VVFBVVF9UWVBFLCAgICAgICAvLyBtZXRob2Qgb3V0cHV0IHR5cGUKLSAgICAgIE9QVElPTl9OQU1FLCAgICAgICAvLyBuYW1lIGluIGFzc2lnbm1lbnQKLSAgICAgIE9QVElPTl9WQUxVRSwgICAgICAvLyB2YWx1ZSBpbiBvcHRpb24gYXNzaWdubWVudAotICAgICAgT1RIRVIgICAgICAgICAgICAgIC8vIHNvbWUgb3RoZXIgcHJvYmxlbQotICAgIH07Ci0KLSAgICAvLyBSZXBvcnRzIGFuIGVycm9yIGluIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvLiBVc2UgdGhpcyBmdW5jdGlvbiBpZiB0aGUKLSAgICAvLyBwcm9ibGVtIG9jY3VycmVkIHNob3VsZCBpbnRlcnJ1cHQgYnVpbGRpbmcgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uCi0gICAgdmlydHVhbCB2b2lkIEFkZEVycm9yKAotICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgICAgICAvLyBGaWxlIG5hbWUgaW4gd2hpY2ggdGhlIGVycm9yIG9jY3VycmVkLgotICAgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsICAvLyBGdWxsIG5hbWUgb2YgdGhlIGVycm9uZW91cyBlbGVtZW50LgotICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgICAvLyBEZXNjcmlwdG9yIG9mIHRoZSBlcnJvbmVvdXMgZWxlbWVudC4KLSAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sICAgICAgLy8gT25lIG9mIHRoZSBsb2NhdGlvbiBjb25zdGFudHMsIGFib3ZlLgotICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlICAgICAgICAvLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgotICAgICAgKSA9IDA7Ci0KLSAgICAvLyBSZXBvcnRzIGEgd2FybmluZyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4gVXNlIHRoaXMgZnVuY3Rpb24gaWYgdGhlCi0gICAgLy8gcHJvYmxlbSBvY2N1cnJlZCBzaG91bGQgTk9UIGludGVycnVwdCBidWlsZGluZyB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4KLSAgICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZygKLSAgICAgIGNvbnN0IHN0cmluZyYgLypmaWxlbmFtZSovLCAgICAgIC8vIEZpbGUgbmFtZSBpbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCi0gICAgICBjb25zdCBzdHJpbmcmIC8qZWxlbWVudF9uYW1lKi8sICAvLyBGdWxsIG5hbWUgb2YgdGhlIGVycm9uZW91cyBlbGVtZW50LgotICAgICAgY29uc3QgTWVzc2FnZSogLypkZXNjcmlwdG9yKi8sICAgLy8gRGVzY3JpcHRvciBvZiB0aGUgZXJyb25lb3VzIGVsZW1lbnQuCi0gICAgICBFcnJvckxvY2F0aW9uIC8qbG9jYXRpb24qLywgICAgICAvLyBPbmUgb2YgdGhlIGxvY2F0aW9uIGNvbnN0YW50cywgYWJvdmUuCi0gICAgICBjb25zdCBzdHJpbmcmIC8qbWVzc2FnZSovICAgICAgICAvLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgotICAgICAgKSB7fQotCi0gICBwcml2YXRlOgotICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFcnJvckNvbGxlY3Rvcik7Ci0gIH07Ci0KLSAgLy8gQ29udmVydCB0aGUgRmlsZURlc2NyaXB0b3JQcm90byB0byByZWFsIGRlc2NyaXB0b3JzIGFuZCBwbGFjZSB0aGVtIGluCi0gIC8vIHRoaXMgRGVzY3JpcHRvclBvb2wuICBBbGwgZGVwZW5kZW5jaWVzIG9mIHRoZSBmaWxlIG11c3QgYWxyZWFkeSBiZSBpbgotICAvLyB0aGUgcG9vbC4gIFJldHVybnMgdGhlIHJlc3VsdGluZyBGaWxlRGVzY3JpcHRvciwgb3IgTlVMTCBpZiB0aGVyZSB3ZXJlCi0gIC8vIHByb2JsZW1zIHdpdGggdGhlIGlucHV0IChlLmcuIHRoZSBtZXNzYWdlIHdhcyBpbnZhbGlkLCBvciBkZXBlbmRlbmNpZXMKLSAgLy8gd2VyZSBtaXNzaW5nKS4gIERldGFpbHMgYWJvdXQgdGhlIGVycm9ycyBhcmUgd3JpdHRlbiB0byBHT09HTEVfTE9HKEVSUk9SKS4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEJ1aWxkRmlsZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90byk7Ci0KLSAgLy8gU2FtZSBhcyBCdWlsZEZpbGUoKSBleGNlcHQgZXJyb3JzIGFyZSBzZW50IHRvIHRoZSBnaXZlbiBFcnJvckNvbGxlY3Rvci4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcik7Ci0KLSAgLy8gQnkgZGVmYXVsdCwgaXQgaXMgYW4gZXJyb3IgaWYgYSBGaWxlRGVzY3JpcHRvclByb3RvIGNvbnRhaW5zIHJlZmVyZW5jZXMKLSAgLy8gdG8gdHlwZXMgb3Igb3RoZXIgZmlsZXMgdGhhdCBhcmUgbm90IGZvdW5kIGluIHRoZSBEZXNjcmlwdG9yUG9vbCAob3IgaXRzCi0gIC8vIGJhY2tpbmcgRGVzY3JpcHRvckRhdGFiYXNlLCBpZiBhbnkpLiAgSWYgeW91IGNhbGwKLSAgLy8gQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCksIGhvd2V2ZXIsIHRoZW4gdW5rbm93biB0eXBlcyBhbmQgZmlsZXMKLSAgLy8gd2lsbCBiZSByZXBsYWNlZCBieSBwbGFjZWhvbGRlciBkZXNjcmlwdG9ycyAod2hpY2ggY2FuIGJlIGlkZW50aWZpZWQgYnkKLSAgLy8gdGhlIGlzX3BsYWNlaG9sZGVyKCkgbWV0aG9kKS4gIFRoaXMgY2FuIGFsbG93IHlvdSB0bwotICAvLyBwZXJmb3JtIHNvbWUgdXNlZnVsIG9wZXJhdGlvbnMgd2l0aCBhIC5wcm90byBmaWxlIGV2ZW4gaWYgeW91IGRvIG5vdAotICAvLyBoYXZlIGFjY2VzcyB0byBvdGhlciAucHJvdG8gZmlsZXMgb24gd2hpY2ggaXQgZGVwZW5kcy4gIEhvd2V2ZXIsIHNvbWUKLSAgLy8gaGV1cmlzdGljcyBtdXN0IGJlIHVzZWQgdG8gZmlsbCBpbiB0aGUgZ2FwcyBpbiBpbmZvcm1hdGlvbiwgYW5kIHRoZXNlCi0gIC8vIGNhbiBsZWFkIHRvIGRlc2NyaXB0b3JzIHdoaWNoIGFyZSBpbmFjY3VyYXRlLiAgRm9yIGV4YW1wbGUsIHRoZQotICAvLyBEZXNjcmlwdG9yUG9vbCBtYXkgYmUgZm9yY2VkIHRvIGd1ZXNzIHdoZXRoZXIgYW4gdW5rbm93biB0eXBlIGlzIGEgbWVzc2FnZQotICAvLyBvciBhbiBlbnVtLCBhcyB3ZWxsIGFzIHdoYXQgcGFja2FnZSBpdCByZXNpZGVzIGluLiAgRnVydGhlcm1vcmUsCi0gIC8vIHBsYWNlaG9sZGVyIHR5cGVzIHdpbGwgbm90IGJlIGRpc2NvdmVyYWJsZSB2aWEgRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCkKLSAgLy8gYW5kIHNpbWlsYXIgbWV0aG9kcywgd2hpY2ggY291bGQgY29uZnVzZSBzb21lIGRlc2NyaXB0b3ItYmFzZWQgYWxnb3JpdGhtcy4KLSAgLy8gR2VuZXJhbGx5LCB0aGUgcmVzdWx0cyBvZiB0aGlzIG9wdGlvbiBzaG91bGQgYmUgaGFuZGxlZCB3aXRoIGV4dHJlbWUgY2FyZS4KLSAgdm9pZCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSB7IGFsbG93X3Vua25vd25fID0gdHJ1ZTsgfQotCi0gIC8vIEJ5IGRlZmF1bHQsIHdlYWsgaW1wb3J0cyBhcmUgYWxsb3dlZCB0byBiZSBtaXNzaW5nLCBpbiB3aGljaCBjYXNlIHdlIHdpbGwKLSAgLy8gdXNlIGEgcGxhY2Vob2xkZXIgZm9yIHRoZSBkZXBlbmRlbmN5IGFuZCBjb252ZXJ0IHRoZSBmaWVsZCB0byBiZSBhbiBFbXB0eQotICAvLyBtZXNzYWdlIGZpZWxkLiBJZiB5b3UgY2FsbCBFbmZvcmNlV2Vha0RlcGVuZGVuY2llcyh0cnVlKSwgaG93ZXZlciwgdGhlCi0gIC8vIERlc2NyaXB0b3JQb29sIHdpbGwgcmVwb3J0IGEgaW1wb3J0IG5vdCBmb3VuZCBlcnJvci4KLSAgdm9pZCBFbmZvcmNlV2Vha0RlcGVuZGVuY2llcyhib29sIGVuZm9yY2UpIHsgZW5mb3JjZV93ZWFrXyA9IGVuZm9yY2U7IH0KLQotICAvLyBJbnRlcm5hbCBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUaGVzZSBtZXRob2RzIE1VU1QgTk9UIGJlIGNhbGxlZCBmcm9tIG91dHNpZGUgdGhlIHByb3RvMiBsaWJyYXJ5LgotICAvLyBUaGVzZSBtZXRob2RzIG1heSBjb250YWluIGhpZGRlbiBwaXRmYWxscyBhbmQgbWF5IGJlIHJlbW92ZWQgaW4gYQotICAvLyBmdXR1cmUgbGlicmFyeSB2ZXJzaW9uLgotCi0gIC8vIENyZWF0ZSBhIERlc2NyaXB0b3JQb29sIHdoaWNoIGlzIG92ZXJsYWlkIG9uIHRvcCBvZiBzb21lIG90aGVyIHBvb2wuCi0gIC8vIElmIHlvdSBzZWFyY2ggZm9yIGEgZGVzY3JpcHRvciBpbiB0aGUgb3ZlcmxheSBhbmQgaXQgaXMgbm90IGZvdW5kLCB0aGUKLSAgLy8gdW5kZXJsYXkgd2lsbCBiZSBzZWFyY2hlZCBhcyBhIGJhY2t1cC4gIElmIHRoZSB1bmRlcmxheSBoYXMgaXRzIG93bgotICAvLyB1bmRlcmxheSwgdGhhdCB3aWxsIGJlIHNlYXJjaGVkIG5leHQsIGFuZCBzbyBvbi4gIFRoaXMgYWxzbyBtZWFucyB0aGF0Ci0gIC8vIGZpbGVzIGJ1aWx0IGluIHRoZSBvdmVybGF5IHdpbGwgYmUgY3Jvc3MtbGlua2VkIHdpdGggdGhlIHVuZGVybGF5J3MKLSAgLy8gZGVzY3JpcHRvcnMgaWYgbmVjZXNzYXJ5LiAgVGhlIHVuZGVybGF5IHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGNhbGxlcjsKLSAgLy8gaXQgbXVzdCByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZldGltZSBvZiB0aGUgbmV3bHktY29uc3RydWN0ZWQgcG9vbC4KLSAgLy8KLSAgLy8gRXhhbXBsZTogIFNheSB5b3Ugd2FudCB0byBwYXJzZSBhIC5wcm90byBmaWxlIGF0IHJ1bnRpbWUgaW4gb3JkZXIgdG8gdXNlCi0gIC8vIGl0cyB0eXBlIHdpdGggYSBEeW5hbWljTWVzc2FnZS4gIFNheSB0aGlzIC5wcm90byBmaWxlIGhhcyBkZXBlbmRlbmNpZXMsCi0gIC8vIGJ1dCB5b3Uga25vdyB0aGF0IGFsbCB0aGUgZGVwZW5kZW5jaWVzIHdpbGwgYmUgdGhpbmdzIHRoYXQgYXJlIGFscmVhZHkKLSAgLy8gY29tcGlsZWQgaW50byB0aGUgYmluYXJ5LiAgRm9yIGVhc2Ugb2YgdXNlLCB5b3UnZCBsaWtlIHRvIGxvYWQgdGhlIHR5cGVzCi0gIC8vIHJpZ2h0IG91dCBvZiBnZW5lcmF0ZWRfcG9vbCgpIHJhdGhlciB0aGFuIGhhdmUgdG8gcGFyc2UgcmVkdW5kYW50IGNvcGllcwotICAvLyBvZiBhbGwgdGhlc2UgLnByb3RvcyBhbmQgcnVudGltZS4gIEJ1dCwgeW91IGRvbid0IHdhbnQgdG8gYWRkIHRoZSBwYXJzZWQKLSAgLy8gdHlwZXMgZGlyZWN0bHkgaW50byBnZW5lcmF0ZWRfcG9vbCgpOiB0aGlzIGlzIG5vdCBhbGxvd2VkLCBhbmQgd291bGQgYmUKLSAgLy8gYmFkIGRlc2lnbiBhbnl3YXkuICBTbywgaW5zdGVhZCwgeW91IGNvdWxkIHVzZSBnZW5lcmF0ZWRfcG9vbCgpIGFzIGFuCi0gIC8vIHVuZGVybGF5IGZvciBhIG5ldyBEZXNjcmlwdG9yUG9vbCBpbiB3aGljaCB5b3UgYWRkIG9ubHkgdGhlIG5ldyBmaWxlLgotICAvLwotICAvLyBXQVJOSU5HOiAgVXNlIG9mIHVuZGVybGF5cyBjYW4gbGVhZCB0byBtYW55IHN1YnRsZSBnb3RjaGFzLiAgSW5zdGVhZCwKLSAgLy8gICB0cnkgdG8gZm9ybXVsYXRlIHdoYXQgeW91IHdhbnQgdG8gZG8gaW4gdGVybXMgb2YgRGVzY3JpcHRvckRhdGFiYXNlcy4KLSAgZXhwbGljaXQgRGVzY3JpcHRvclBvb2woY29uc3QgRGVzY3JpcHRvclBvb2wqIHVuZGVybGF5KTsKLQotICAvLyBDYWxsZWQgYnkgZ2VuZXJhdGVkIGNsYXNzZXMgYXQgaW5pdCB0aW1lIHRvIGFkZCB0aGVpciBkZXNjcmlwdG9ycyB0bwotICAvLyBnZW5lcmF0ZWRfcG9vbC4gIERvIE5PVCBjYWxsIHRoaXMgaW4geW91ciBvd24gY29kZSEgIGZpbGVuYW1lIG11c3QgYmUgYQotICAvLyBwZXJtYW5lbnQgc3RyaW5nIChlLmcuIGEgc3RyaW5nIGxpdGVyYWwpLgotICBzdGF0aWMgdm9pZCBJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCi0gICAgICBjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpOwotCi0KLSAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiAgR2V0cyBhIG5vbi1jb25zdCBwb2ludGVyIHRvIHRoZSBnZW5lcmF0ZWQgcG9vbC4KLSAgLy8gVGhpcyBpcyBjYWxsZWQgYXQgc3RhdGljLWluaXRpYWxpemF0aW9uIHRpbWUgb25seSwgc28gdGhyZWFkLXNhZmV0eSBpcwotICAvLyBub3QgYSBjb25jZXJuLiAgSWYgYm90aCBhbiB1bmRlcmxheSBhbmQgYSBmYWxsYmFjayBkYXRhYmFzZSBhcmUgcHJlc2VudCwKLSAgLy8gdGhlIHVuZGVybGF5IHRha2VzIHByZWNlZGVuY2UuCi0gIHN0YXRpYyBEZXNjcmlwdG9yUG9vbCogaW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKTsKLQotICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBDaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiBCdWlsZEZpbGUoKSBzdWNoIHRoYXQgaXQKLSAgLy8gYWxsb3dzIHRoZSBmaWxlIHRvIG1ha2UgcmVmZXJlbmNlIHRvIG1lc3NhZ2UgdHlwZXMgZGVjbGFyZWQgaW4gb3RoZXIgZmlsZXMKLSAgLy8gd2hpY2ggaXQgZGlkIG5vdCBvZmZpY2lhbGx5IGRlY2xhcmUgYXMgZGVwZW5kZW5jaWVzLgotICB2b2lkIEludGVybmFsRG9udEVuZm9yY2VEZXBlbmRlbmNpZXMoKTsKLQotICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHkuCi0gIHZvaWQgaW50ZXJuYWxfc2V0X3VuZGVybGF5KGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkgewotICAgIHVuZGVybGF5XyA9IHVuZGVybGF5OwotICB9Ci0KLSAgLy8gRm9yIGludGVybmFsICh1bml0IHRlc3QpIHVzZSBvbmx5OiAgUmV0dXJucyB0cnVlIGlmIGEgRmlsZURlc2NyaXB0b3IgaGFzCi0gIC8vIGJlZW4gY29uc3RydWN0ZWQgZm9yIHRoZSBnaXZlbiBmaWxlLCBmYWxzZSBvdGhlcndpc2UuICBVc2VmdWwgZm9yIHRlc3RpbmcKLSAgLy8gbGF6eSBkZXNjcmlwdG9yIGluaXRpYWxpemF0aW9uIGJlaGF2aW9yLgotICBib29sIEludGVybmFsSXNGaWxlTG9hZGVkKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIGNvbnN0OwotCi0KLSAgLy8gQWRkIGEgZmlsZSB0byB1bnVzZWRfaW1wb3J0X3RyYWNrX2ZpbGVzXy4gRGVzY3JpcHRvckJ1aWxkZXIgd2lsbCBsb2cKLSAgLy8gd2FybmluZ3MgZm9yIHRob3NlIGZpbGVzIGlmIHRoZXJlIGlzIGFueSB1bnVzZWQgaW1wb3J0LgotICB2b2lkIEFkZFVudXNlZEltcG9ydFRyYWNrRmlsZShjb25zdCBzdHJpbmcmIGZpbGVfbmFtZSk7Ci0gIHZvaWQgQ2xlYXJVbnVzZWRJbXBvcnRUcmFja0ZpbGVzKCk7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIEVudW1EZXNjcmlwdG9yOwotICBmcmllbmQgY2xhc3MgU2VydmljZURlc2NyaXB0b3I7Ci0gIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvcjsKLSAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOwotICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3JUYWJsZXM7Ci0KLSAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGdpdmVuIG5hbWUgaXMgYSBzdWItc3ltYm9sIG9mIGFueSBub24tcGFja2FnZQotICAvLyBkZXNjcmlwdG9yIHRoYXQgYWxyZWFkeSBleGlzdHMgaW4gdGhlIGRlc2NyaXB0b3IgcG9vbC4gIChUaGUgZnVsbAotICAvLyBkZWZpbml0aW9uIG9mIHN1Y2ggdHlwZXMgaXMgYWxyZWFkeSBrbm93bi4pCi0gIGJvb2wgSXNTdWJTeW1ib2xPZkJ1aWx0VHlwZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotCi0gIC8vIFRyaWVzIHRvIGZpbmQgc29tZXRoaW5nIGluIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBhbmQgbGluayBpbiB0aGUKLSAgLy8gY29ycmVzcG9uZGluZyBwcm90byBmaWxlLiAgUmV0dXJucyB0cnVlIGlmIHN1Y2Nlc3NmdWwsIGluIHdoaWNoIGNhc2UKLSAgLy8gdGhlIGNhbGxlciBzaG91bGQgc2VhcmNoIGZvciB0aGUgdGhpbmcgYWdhaW4uICBUaGVzZSBhcmUgZGVjbGFyZWQKLSAgLy8gY29uc3QgYmVjYXVzZSB0aGV5IGFyZSBjYWxsZWQgYnkgKHNlbWFudGljYWxseSkgY29uc3QgbWV0aG9kcy4KLSAgYm9vbCBUcnlGaW5kRmlsZUluRmFsbGJhY2tEYXRhYmFzZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotICBib29sIFRyeUZpbmRTeW1ib2xJbkZhbGxiYWNrRGF0YWJhc2UoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKLSAgYm9vbCBUcnlGaW5kRXh0ZW5zaW9uSW5GYWxsYmFja0RhdGFiYXNlKGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIpIGNvbnN0OwotCi0gIC8vIExpa2UgQnVpbGRGaWxlKCkgYnV0IGNhbGxlZCBpbnRlcm5hbGx5IHdoZW4gdGhlIGZpbGUgaGFzIGJlZW4gbG9hZGVkIGZyb20KLSAgLy8gZmFsbGJhY2tfZGF0YWJhc2VfLiAgRGVjbGFyZWQgY29uc3QgYmVjYXVzZSBpdCBpcyBjYWxsZWQgYnkgKHNlbWFudGljYWxseSkKLSAgLy8gY29uc3QgbWV0aG9kcy4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEJ1aWxkRmlsZUZyb21EYXRhYmFzZSgKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgY29uc3Q7Ci0KLSAgLy8gSWYgZmFsbGJhY2tfZGF0YWJhc2VfIGlzIE5VTEwsIHRoaXMgaXMgTlVMTC4gIE90aGVyd2lzZSwgdGhpcyBpcyBhIG11dGV4Ci0gIC8vIHdoaWNoIG11c3QgYmUgbG9ja2VkIHdoaWxlIGFjY2Vzc2luZyB0YWJsZXNfLgotICBNdXRleCogbXV0ZXhfOwotCi0gIC8vIFNlZSBjb25zdHJ1Y3Rvci4KLSAgRGVzY3JpcHRvckRhdGFiYXNlKiBmYWxsYmFja19kYXRhYmFzZV87Ci0gIEVycm9yQ29sbGVjdG9yKiBkZWZhdWx0X2Vycm9yX2NvbGxlY3Rvcl87Ci0gIGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheV87Ci0KLSAgLy8gVGhpcyBjbGFzcyBjb250YWlucyBhIGxvdCBvZiBoYXNoIG1hcHMgd2l0aCBjb21wbGljYXRlZCB0eXBlcyB0aGF0Ci0gIC8vIHdlJ2QgbGlrZSB0byBrZWVwIG91dCBvZiB0aGUgaGVhZGVyLgotICBjbGFzcyBUYWJsZXM7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8VGFibGVzPiB0YWJsZXNfOwotCi0gIGJvb2wgZW5mb3JjZV9kZXBlbmRlbmNpZXNfOwotICBib29sIGFsbG93X3Vua25vd25fOwotICBib29sIGVuZm9yY2Vfd2Vha187Ci0gIHN0ZDo6c2V0PHN0cmluZz4gdW51c2VkX2ltcG9ydF90cmFja19maWxlc187Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyaXB0b3JQb29sKTsKLX07Ci0KLS8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gVGhlc2UgbWFjcm9zIG1ha2VzIHRoaXMgcmVwZXRpdGl2ZSBjb2RlIG1vcmUgcmVhZGFibGUuCi0jZGVmaW5lIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihDTEFTUywgRklFTEQsIFRZUEUpIFwKLSAgaW5saW5lIFRZUEUgQ0xBU1M6OkZJRUxEKCkgY29uc3QgeyByZXR1cm4gRklFTEQjI187IH0KLQotLy8gU3RyaW5ncyBmaWVsZHMgYXJlIHN0b3JlZCBhcyBwb2ludGVycyBidXQgcmV0dXJuZWQgYXMgY29uc3QgcmVmZXJlbmNlcy4KLSNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihDTEFTUywgRklFTEQpIFwKLSAgaW5saW5lIGNvbnN0IHN0cmluZyYgQ0xBU1M6OkZJRUxEKCkgY29uc3QgeyByZXR1cm4gKkZJRUxEIyNfOyB9Ci0KLS8vIEFycmF5cyB0YWtlIGFuIGluZGV4IHBhcmFtZXRlciwgb2J2aW91c2x5LgotI2RlZmluZSBQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoQ0xBU1MsIEZJRUxELCBUWVBFKSBcCi0gIGlubGluZSBUWVBFIENMQVNTOjpGSUVMRChpbnQgaW5kZXgpIGNvbnN0IHsgcmV0dXJuIEZJRUxEIyNzXyArIGluZGV4OyB9Ci0KLSNkZWZpbmUgUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoQ0xBU1MsIFRZUEUpIFwKLSAgaW5saW5lIGNvbnN0IFRZUEUmIENMQVNTOjpvcHRpb25zKCkgY29uc3QgeyByZXR1cm4gKm9wdGlvbnNfOyB9Ci0KLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRGVzY3JpcHRvciwgbmFtZSkKLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRGVzY3JpcHRvciwgZnVsbF9uYW1lKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBjb250YWluaW5nX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQotCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZmllbGRfY291bnQsIGludCkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBvbmVvZl9kZWNsX2NvdW50LCBpbnQpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgbmVzdGVkX3R5cGVfY291bnQsIGludCkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBlbnVtX3R5cGVfY291bnQsIGludCkKLQotUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIGZpZWxkLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIG9uZW9mX2RlY2wsIGNvbnN0IE9uZW9mRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgbmVzdGVkX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIGVudW1fdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3IqKQotCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZXh0ZW5zaW9uX3JhbmdlX2NvdW50LCBpbnQpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZXh0ZW5zaW9uX2NvdW50LCBpbnQpCi1QUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgZXh0ZW5zaW9uX3JhbmdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKikKLVBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKikKLQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIHJlc2VydmVkX3JhbmdlX2NvdW50LCBpbnQpCi1QUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgcmVzZXJ2ZWRfcmFuZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSopCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgcmVzZXJ2ZWRfbmFtZV9jb3VudCwgaW50KQotCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihEZXNjcmlwdG9yLCBNZXNzYWdlT3B0aW9ucykKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBpc19wbGFjZWhvbGRlciwgYm9vbCkKLQotUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIG5hbWUpCi1QUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZnVsbF9uYW1lKQotUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGpzb25fbmFtZSkKLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBsb3dlcmNhc2VfbmFtZSkKLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBjYW1lbGNhc2VfbmFtZSkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIG51bWJlciwgaW50KQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgaXNfZXh0ZW5zaW9uLCBib29sKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgdHlwZSwgRmllbGREZXNjcmlwdG9yOjpUeXBlKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgbGFiZWwsIEZpZWxkRGVzY3JpcHRvcjo6TGFiZWwpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBjb250YWluaW5nX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgY29udGFpbmluZ19vbmVvZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgaW5kZXhfaW5fb25lb2YsIGludCkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGV4dGVuc2lvbl9zY29wZSwgY29uc3QgRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZW51bV90eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIEZpZWxkT3B0aW9ucykKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGhhc19kZWZhdWx0X3ZhbHVlLCBib29sKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9pbnQzMiAsIGludDMyICkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfaW50NjQgLCBpbnQ2NCApCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX3VpbnQzMiwgdWludDMyKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV91aW50NjQsIHVpbnQ2NCkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfZmxvYXQgLCBmbG9hdCApCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2RvdWJsZSwgZG91YmxlKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9ib29sICAsIGJvb2wgICkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfZW51bSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX3N0cmluZykKLQotUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihPbmVvZkRlc2NyaXB0b3IsIG5hbWUpCi1QUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKE9uZW9mRGVzY3JpcHRvciwgZnVsbF9uYW1lKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE9uZW9mRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihPbmVvZkRlc2NyaXB0b3IsIGZpZWxkX2NvdW50LCBpbnQpCi0KLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIG5hbWUpCi1QUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCBmdWxsX25hbWUpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgdmFsdWVfY291bnQsIGludCkKLVBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgRW51bU9wdGlvbnMpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGlzX3BsYWNlaG9sZGVyLCBib29sKQotCi1QUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIG5hbWUpCi1QUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIGZ1bGxfbmFtZSkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBudW1iZXIsIGludCkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCB0eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBFbnVtVmFsdWVPcHRpb25zKQotCi1QUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBuYW1lKQotUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvciwgZnVsbF9uYW1lKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIG1ldGhvZF9jb3VudCwgaW50KQotUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBtZXRob2QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvciwgU2VydmljZU9wdGlvbnMpCi0KLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgbmFtZSkKLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgZnVsbF9uYW1lKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIHNlcnZpY2UsIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBpbnB1dF90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBvdXRwdXRfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBNZXRob2RPcHRpb25zKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIGNsaWVudF9zdHJlYW1pbmcsIGJvb2wpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgc2VydmVyX3N0cmVhbWluZywgYm9vbCkKLQotUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgbmFtZSkKLVBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHBhY2thZ2UpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHBvb2wsIGNvbnN0IERlc2NyaXB0b3JQb29sKikKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZGVwZW5kZW5jeV9jb3VudCwgaW50KQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudCwgaW50KQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCB3ZWFrX2RlcGVuZGVuY3lfY291bnQsIGludCkKLVBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgbWVzc2FnZV90eXBlX2NvdW50LCBpbnQpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGVudW1fdHlwZV9jb3VudCwgaW50KQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBzZXJ2aWNlX2NvdW50LCBpbnQpCi1QUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGV4dGVuc2lvbl9jb3VudCwgaW50KQotUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIEZpbGVPcHRpb25zKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBpc19wbGFjZWhvbGRlciwgYm9vbCkKLQotUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBlbnVtX3R5cGUsIGNvbnN0IEVudW1EZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKQotCi0jdW5kZWYgUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SCi0jdW5kZWYgUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUgotI3VuZGVmIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUgotCi0vLyBBIGZldyBhY2Nlc3NvcnMgZGlmZmVyIGZyb20gdGhlIG1hY3Jvcy4uLgotCi1pbmxpbmUgYm9vbCBEZXNjcmlwdG9yOjpJc0V4dGVuc2lvbk51bWJlcihpbnQgbnVtYmVyKSBjb25zdCB7Ci0gIHJldHVybiBGaW5kRXh0ZW5zaW9uUmFuZ2VDb250YWluaW5nTnVtYmVyKG51bWJlcikgIT0gTlVMTDsKLX0KLQotaW5saW5lIGJvb2wgRGVzY3JpcHRvcjo6SXNSZXNlcnZlZE51bWJlcihpbnQgbnVtYmVyKSBjb25zdCB7Ci0gIHJldHVybiBGaW5kUmVzZXJ2ZWRSYW5nZUNvbnRhaW5pbmdOdW1iZXIobnVtYmVyKSAhPSBOVUxMOwotfQotCi1pbmxpbmUgYm9vbCBEZXNjcmlwdG9yOjpJc1Jlc2VydmVkTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9uYW1lX2NvdW50KCk7IGkrKykgewotICAgIGlmIChuYW1lID09IHJlc2VydmVkX25hbWUoaSkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLS8vIENhbid0IHVzZSBQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IgYmVjYXVzZSByZXNlcnZlZF9uYW1lc18gaXMgYWN0dWFsbHkKLS8vIGFuIGFycmF5IG9mIHBvaW50ZXJzIHJhdGhlciB0aGFuIHRoZSB1c3VhbCBhcnJheSBvZiBvYmplY3RzLgotaW5saW5lIGNvbnN0IHN0cmluZyYgRGVzY3JpcHRvcjo6cmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuICpyZXNlcnZlZF9uYW1lc19baW5kZXhdOwotfQotCi1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX3JlcXVpcmVkKCkgY29uc3QgewotICByZXR1cm4gbGFiZWwoKSA9PSBMQUJFTF9SRVFVSVJFRDsKLX0KLQotaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjppc19vcHRpb25hbCgpIGNvbnN0IHsKLSAgcmV0dXJuIGxhYmVsKCkgPT0gTEFCRUxfT1BUSU9OQUw7Ci19Ci0KLWlubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfcmVwZWF0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiBsYWJlbCgpID09IExBQkVMX1JFUEVBVEVEOwotfQotCi1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX3BhY2thYmxlKCkgY29uc3QgewotICByZXR1cm4gaXNfcmVwZWF0ZWQoKSAmJiBJc1R5cGVQYWNrYWJsZSh0eXBlKCkpOwotfQotCi0vLyBUbyBzYXZlIHNwYWNlLCBpbmRleCgpIGlzIGNvbXB1dGVkIGJ5IGxvb2tpbmcgYXQgdGhlIGRlc2NyaXB0b3IncyBwb3NpdGlvbgotLy8gaW4gdGhlIHBhcmVudCdzIGFycmF5IG9mIGNoaWxkcmVuLgotaW5saW5lIGludCBGaWVsZERlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgewotICBpZiAoIWlzX2V4dGVuc2lvbl8pIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gY29udGFpbmluZ190eXBlXy0+ZmllbGRzXyk7Ci0gIH0gZWxzZSBpZiAoZXh0ZW5zaW9uX3Njb3BlXyAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGV4dGVuc2lvbl9zY29wZV8tPmV4dGVuc2lvbnNfKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gZmlsZV8tPmV4dGVuc2lvbnNfKTsKLSAgfQotfQotCi1pbmxpbmUgaW50IERlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgewotICBpZiAoY29udGFpbmluZ190eXBlXyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGZpbGVfLT5tZXNzYWdlX3R5cGVzXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPm5lc3RlZF90eXBlc18pOwotICB9Ci19Ci0KLWlubGluZSBpbnQgT25lb2ZEZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPm9uZW9mX2RlY2xzXyk7Ci19Ci0KLWlubGluZSBpbnQgRW51bURlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgewotICBpZiAoY29udGFpbmluZ190eXBlXyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGZpbGVfLT5lbnVtX3R5cGVzXyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPmVudW1fdHlwZXNfKTsKLSAgfQotfQotCi1pbmxpbmUgaW50IEVudW1WYWx1ZURlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gdHlwZV8tPnZhbHVlc18pOwotfQotCi1pbmxpbmUgaW50IFNlcnZpY2VEZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGZpbGVfLT5zZXJ2aWNlc18pOwotfQotCi1pbmxpbmUgaW50IE1ldGhvZERlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gc2VydmljZV8tPm1ldGhvZHNfKTsKLX0KLQotaW5saW5lIGNvbnN0IGNoYXIqIEZpZWxkRGVzY3JpcHRvcjo6dHlwZV9uYW1lKCkgY29uc3QgewotICByZXR1cm4ga1R5cGVUb05hbWVbdHlwZV9dOwotfQotCi1pbmxpbmUgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIEZpZWxkRGVzY3JpcHRvcjo6Y3BwX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBrVHlwZVRvQ3BwVHlwZU1hcFt0eXBlX107Ci19Ci0KLWlubGluZSBjb25zdCBjaGFyKiBGaWVsZERlc2NyaXB0b3I6OmNwcF90eXBlX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBrQ3BwVHlwZVRvTmFtZVtrVHlwZVRvQ3BwVHlwZU1hcFt0eXBlX11dOwotfQotCi1pbmxpbmUgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIEZpZWxkRGVzY3JpcHRvcjo6VHlwZVRvQ3BwVHlwZShUeXBlIHR5cGUpIHsKLSAgcmV0dXJuIGtUeXBlVG9DcHBUeXBlTWFwW3R5cGVdOwotfQotCi1pbmxpbmUgY29uc3QgY2hhciogRmllbGREZXNjcmlwdG9yOjpUeXBlTmFtZShUeXBlIHR5cGUpIHsKLSAgcmV0dXJuIGtUeXBlVG9OYW1lW3R5cGVdOwotfQotCi1pbmxpbmUgY29uc3QgY2hhciogRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlTmFtZShDcHBUeXBlIGNwcF90eXBlKSB7Ci0gIHJldHVybiBrQ3BwVHlwZVRvTmFtZVtjcHBfdHlwZV07Ci19Ci0KLWlubGluZSBib29sIEZpZWxkRGVzY3JpcHRvcjo6SXNUeXBlUGFja2FibGUoVHlwZSBmaWVsZF90eXBlKSB7Ci0gIHJldHVybiAoZmllbGRfdHlwZSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICYmCi0gICAgICAgICAgZmllbGRfdHlwZSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgJiYKLSAgICAgICAgICBmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCi0gICAgICAgICAgZmllbGRfdHlwZSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpOwotfQotCi1pbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjpkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gZGVwZW5kZW5jaWVzX1tpbmRleF07Ci19Ci0KLWlubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OnB1YmxpY19kZXBlbmRlbmN5KAotICAgIGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gZGVwZW5kZW5jaWVzX1twdWJsaWNfZGVwZW5kZW5jaWVzX1tpbmRleF1dOwotfQotCi1pbmxpbmUgY29uc3QgRmlsZURlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yOjp3ZWFrX2RlcGVuZGVuY3koCi0gICAgaW50IGluZGV4KSBjb25zdCB7Ci0gIHJldHVybiBkZXBlbmRlbmNpZXNfW3dlYWtfZGVwZW5kZW5jaWVzX1tpbmRleF1dOwotfQotCi1pbmxpbmUgRmlsZURlc2NyaXB0b3I6OlN5bnRheCBGaWxlRGVzY3JpcHRvcjo6c3ludGF4KCkgY29uc3QgewotICByZXR1cm4gc3ludGF4XzsKLX0KLQotLy8gQ2FuJ3QgdXNlIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUiBiZWNhdXNlIGZpZWxkc18gaXMgYWN0dWFsbHkgYW4gYXJyYXkKLS8vIG9mIHBvaW50ZXJzIHJhdGhlciB0aGFuIHRoZSB1c3VhbCBhcnJheSBvZiBvYmplY3RzLgotaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogT25lb2ZEZXNjcmlwdG9yOjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIGZpZWxkc19baW5kZXhdOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGQ1YzRkOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTE2OCArMCwwIEBACi0vLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotLy8gc291cmNlOiBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwotCi0jZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1uYW1lc3BhY2UgewotCi1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBGaWxlRGVzY3JpcHRvclNldF9yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBPbmVvZkRlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgT25lb2ZEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBFbnVtRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWV0aG9kRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBNZXRob2REZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWxlT3B0aW9uc19kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgRmlsZU9wdGlvbnNfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIE1lc3NhZ2VPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBGaWVsZE9wdGlvbnNfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkT3B0aW9uc19KU1R5cGVfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBFbnVtT3B0aW9uc19kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgRW51bU9wdGlvbnNfcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBFbnVtVmFsdWVPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU2VydmljZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFNlcnZpY2VPcHRpb25zX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgTWV0aG9kT3B0aW9uc19yZWZsZWN0aW9uXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFVuaW50ZXJwcmV0ZWRPcHRpb25fcmVmbGVjdGlvbl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2Rlc2NyaXB0b3JfID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgotICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFNvdXJjZUNvZGVJbmZvX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU291cmNlQ29kZUluZm9fTG9jYXRpb25fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogR2VuZXJhdGVkQ29kZUluZm9fZGVzY3JpcHRvcl8gPSBOVUxMOwotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCi0gIEdlbmVyYXRlZENvZGVJbmZvX3JlZmxlY3Rpb25fID0gTlVMTDsKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9kZXNjcmlwdG9yXyA9IE5VTEw7Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLSAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9yZWZsZWN0aW9uXyA9IE5VTEw7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLXZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpIHsKLSAgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yKiBmaWxlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5GaW5kRmlsZUJ5TmFtZSgKLSAgICAgICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOwotICBHT09HTEVfQ0hFQ0soZmlsZSAhPSBOVUxMKTsKLSAgRmlsZURlc2NyaXB0b3JTZXRfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JTZXRfb2Zmc2V0c19bMV0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclNldCwgZmlsZV8pLAotICB9OwotICBGaWxlRGVzY3JpcHRvclNldF9yZWZsZWN0aW9uXyA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgRmlsZURlc2NyaXB0b3JTZXRfZGVzY3JpcHRvcl8sCi0gICAgICBGaWxlRGVzY3JpcHRvclNldDo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBGaWxlRGVzY3JpcHRvclNldF9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JTZXQsIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICAtMSwKLSAgICAgIHNpemVvZihGaWxlRGVzY3JpcHRvclNldCksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yU2V0LCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLSAgRmlsZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxKTsKLSAgc3RhdGljIGNvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzEyXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHBhY2thZ2VfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIGRlcGVuZGVuY3lfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHB1YmxpY19kZXBlbmRlbmN5XyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCB3ZWFrX2RlcGVuZGVuY3lfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG1lc3NhZ2VfdHlwZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgZW51bV90eXBlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBzZXJ2aWNlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBleHRlbnNpb25fKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHNvdXJjZV9jb2RlX2luZm9fKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHN5bnRheF8pLAotICB9OwotICBGaWxlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBGaWxlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAotICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBGaWxlRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgLTEsCi0gICAgICBzaXplb2YoRmlsZURlc2NyaXB0b3JQcm90byksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzEwXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgbmFtZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBmaWVsZF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBleHRlbnNpb25fKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgbmVzdGVkX3R5cGVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgZW51bV90eXBlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIGV4dGVuc2lvbl9yYW5nZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBvbmVvZl9kZWNsXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgcmVzZXJ2ZWRfcmFuZ2VfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgcmVzZXJ2ZWRfbmFtZV8pLAotICB9OwotICBEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKLSAgICAgIERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKERlc2NyaXB0b3JQcm90byksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXyA9IERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX29mZnNldHNfWzJdID0gewotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBzdGFydF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBlbmRfKSwKLSAgfTsKLSAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfZGVzY3JpcHRvcl8sCi0gICAgICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICAtMSwKLSAgICAgIHNpemVvZihEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UpLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9kZXNjcmlwdG9yXyA9IERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMSk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2Vfb2Zmc2V0c19bMl0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgc3RhcnRfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlLCBlbmRfKSwKLSAgfTsKLSAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX2Rlc2NyaXB0b3JfLAotICAgICAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2Vfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgLTEsCi0gICAgICBzaXplb2YoRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UpLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDMpOwotICBzdGF0aWMgY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzEwXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgbnVtYmVyXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgbGFiZWxfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCB0eXBlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgdHlwZV9uYW1lXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgZXh0ZW5kZWVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBkZWZhdWx0X3ZhbHVlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgb25lb2ZfaW5kZXhfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBqc29uX25hbWVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCi0gIH07Ci0gIEZpZWxkRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKLSAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKEZpZWxkRGVzY3JpcHRvclByb3RvKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3JfID0gRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcl8gPSBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+ZW51bV90eXBlKDEpOwotICBPbmVvZkRlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg0KTsKLSAgc3RhdGljIGNvbnN0IGludCBPbmVvZkRlc2NyaXB0b3JQcm90b19vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE9uZW9mRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCi0gIH07Ci0gIE9uZW9mRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBPbmVvZkRlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKLSAgICAgIE9uZW9mRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIE9uZW9mRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChPbmVvZkRlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKE9uZW9mRGVzY3JpcHRvclByb3RvKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoT25lb2ZEZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDUpOwotICBzdGF0aWMgY29uc3QgaW50IEVudW1EZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bM10gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCB2YWx1ZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAotICB9OwotICBFbnVtRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAotICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBFbnVtRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgLTEsCi0gICAgICBzaXplb2YoRW51bURlc2NyaXB0b3JQcm90byksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1EZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoNik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzNdID0gewotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIG51bWJlcl8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCi0gIH07Ci0gIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLAotICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgLTEsCi0gICAgICBzaXplb2YoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLSAgU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg3KTsKLSAgc3RhdGljIGNvbnN0IGludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzNdID0gewotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgbmFtZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgbWV0aG9kXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCi0gIH07Ci0gIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCi0gICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICAtMSwKLSAgICAgIHNpemVvZihTZXJ2aWNlRGVzY3JpcHRvclByb3RvKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg4KTsKLSAgc3RhdGljIGNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bNl0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgaW5wdXRfdHlwZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBvdXRwdXRfdHlwZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIGNsaWVudF9zdHJlYW1pbmdfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgc2VydmVyX3N0cmVhbWluZ18pLAotICB9OwotICBNZXRob2REZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKLSAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKE1ldGhvZERlc2NyaXB0b3JQcm90byksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDkpOwotICBzdGF0aWMgY29uc3QgaW50IEZpbGVPcHRpb25zX29mZnNldHNfWzE1XSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBqYXZhX3BhY2thZ2VfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBqYXZhX291dGVyX2NsYXNzbmFtZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfbXVsdGlwbGVfZmlsZXNfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBvcHRpbWl6ZV9mb3JfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBnb19wYWNrYWdlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgY2NfZ2VuZXJpY19zZXJ2aWNlc18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIHB5X2dlbmVyaWNfc2VydmljZXNfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBkZXByZWNhdGVkXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgY2NfZW5hYmxlX2FyZW5hc18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIG9iamNfY2xhc3NfcHJlZml4XyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgY3NoYXJwX25hbWVzcGFjZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCi0gIH07Ci0gIEZpbGVPcHRpb25zX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBGaWxlT3B0aW9uc19kZXNjcmlwdG9yXywKLSAgICAgIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIEZpbGVPcHRpb25zX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIF9leHRlbnNpb25zXyksCi0gICAgICBzaXplb2YoRmlsZU9wdGlvbnMpLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yXyA9IEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfLT5lbnVtX3R5cGUoMCk7Ci0gIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEwKTsKLSAgc3RhdGljIGNvbnN0IGludCBNZXNzYWdlT3B0aW9uc19vZmZzZXRzX1s1XSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBkZXByZWNhdGVkXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgbWFwX2VudHJ5XyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKLSAgfTsKLSAgTWVzc2FnZU9wdGlvbnNfcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfLAotICAgICAgTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgTWVzc2FnZU9wdGlvbnNfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKLSAgICAgIHNpemVvZihNZXNzYWdlT3B0aW9ucyksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLSAgRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDExKTsKLSAgc3RhdGljIGNvbnN0IGludCBGaWVsZE9wdGlvbnNfb2Zmc2V0c19bN10gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIGN0eXBlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIHBhY2tlZF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBqc3R5cGVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgbGF6eV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBkZXByZWNhdGVkXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIHdlYWtfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKLSAgfTsKLSAgRmllbGRPcHRpb25zX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl8sCi0gICAgICBGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgRmllbGRPcHRpb25zX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKLSAgICAgIHNpemVvZihGaWVsZE9wdGlvbnMpLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcl8gPSBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKLSAgRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yXyA9IEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXy0+ZW51bV90eXBlKDEpOwotICBFbnVtT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRW51bU9wdGlvbnNfb2Zmc2V0c19bM10gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtT3B0aW9ucywgYWxsb3dfYWxpYXNfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBkZXByZWNhdGVkXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKLSAgfTsKLSAgRW51bU9wdGlvbnNfcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIEVudW1PcHRpb25zX2Rlc2NyaXB0b3JfLAotICAgICAgRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgRW51bU9wdGlvbnNfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKLSAgICAgIHNpemVvZihFbnVtT3B0aW9ucyksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLSAgRW51bVZhbHVlT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMyk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRW51bVZhbHVlT3B0aW9uc19vZmZzZXRzX1syXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIGRlcHJlY2F0ZWRfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCi0gIH07Ci0gIEVudW1WYWx1ZU9wdGlvbnNfcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl8sCi0gICAgICBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIEVudW1WYWx1ZU9wdGlvbnNfb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIF9leHRlbnNpb25zXyksCi0gICAgICBzaXplb2YoRW51bVZhbHVlT3B0aW9ucyksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgU2VydmljZU9wdGlvbnNfb2Zmc2V0c19bMl0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlT3B0aW9ucywgZGVwcmVjYXRlZF8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZU9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCi0gIH07Ci0gIFNlcnZpY2VPcHRpb25zX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXywKLSAgICAgIFNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFNlcnZpY2VPcHRpb25zX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlT3B0aW9ucywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZU9wdGlvbnMsIF9leHRlbnNpb25zXyksCi0gICAgICBzaXplb2YoU2VydmljZU9wdGlvbnMpLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTZXJ2aWNlT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTUpOwotICBzdGF0aWMgY29uc3QgaW50IE1ldGhvZE9wdGlvbnNfb2Zmc2V0c19bMl0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCBkZXByZWNhdGVkXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAotICB9OwotICBNZXRob2RPcHRpb25zX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBNZXRob2RPcHRpb25zX2Rlc2NyaXB0b3JfLAotICAgICAgTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBNZXRob2RPcHRpb25zX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCBfZXh0ZW5zaW9uc18pLAotICAgICAgc2l6ZW9mKE1ldGhvZE9wdGlvbnMpLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbl9vZmZzZXRzX1s3XSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIG5hbWVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIGlkZW50aWZpZXJfdmFsdWVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIHBvc2l0aXZlX2ludF92YWx1ZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgbmVnYXRpdmVfaW50X3ZhbHVlXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uLCBkb3VibGVfdmFsdWVfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIHN0cmluZ192YWx1ZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgYWdncmVnYXRlX3ZhbHVlXyksCi0gIH07Ci0gIFVuaW50ZXJwcmV0ZWRPcHRpb25fcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl8sCi0gICAgICBVbmludGVycHJldGVkT3B0aW9uOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIF9oYXNfYml0c19bMF0pLAotICAgICAgLTEsCi0gICAgICAtMSwKLSAgICAgIHNpemVvZihVbmludGVycHJldGVkT3B0aW9uKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl8gPSBVbmludGVycHJldGVkT3B0aW9uX2Rlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZSgwKTsKLSAgc3RhdGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X29mZnNldHNfWzJdID0gewotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgbmFtZV9wYXJ0XyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBpc19leHRlbnNpb25fKSwKLSAgfTsKLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9yZWZsZWN0aW9uXyA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZXNjcmlwdG9yXywKLSAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9vZmZzZXRzXywKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQpLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKLSAgICAgIC0xKTsKLSAgU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTcpOwotICBzdGF0aWMgY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvX29mZnNldHNfWzFdID0gewotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm8sIGxvY2F0aW9uXyksCi0gIH07Ci0gIFNvdXJjZUNvZGVJbmZvX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXywKLSAgICAgIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIFNvdXJjZUNvZGVJbmZvX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mbywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKFNvdXJjZUNvZGVJbmZvKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZXNjcmlwdG9yXyA9IFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZSgwKTsKLSAgc3RhdGljIGNvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9vZmZzZXRzX1s1XSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCBwYXRoXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgc3Bhbl8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIGxlYWRpbmdfY29tbWVudHNfKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCB0cmFpbGluZ19jb21tZW50c18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfKSwKLSAgfTsKLSAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fcmVmbGVjdGlvbl8gPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfLAotICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fb2Zmc2V0c18sCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgLTEsCi0gICAgICBzaXplb2YoU291cmNlQ29kZUluZm9fTG9jYXRpb24pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX2ludGVybmFsX21ldGFkYXRhXyksCi0gICAgICAtMSk7Ci0gIEdlbmVyYXRlZENvZGVJbmZvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDE4KTsKLSAgc3RhdGljIGNvbnN0IGludCBHZW5lcmF0ZWRDb2RlSW5mb19vZmZzZXRzX1sxXSA9IHsKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEdlbmVyYXRlZENvZGVJbmZvLCBhbm5vdGF0aW9uXyksCi0gIH07Ci0gIEdlbmVyYXRlZENvZGVJbmZvX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBHZW5lcmF0ZWRDb2RlSW5mb19kZXNjcmlwdG9yXywKLSAgICAgIEdlbmVyYXRlZENvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXywKLSAgICAgIEdlbmVyYXRlZENvZGVJbmZvX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mbywgX2hhc19iaXRzX1swXSksCi0gICAgICAtMSwKLSAgICAgIC0xLAotICAgICAgc2l6ZW9mKEdlbmVyYXRlZENvZGVJbmZvKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoR2VuZXJhdGVkQ29kZUluZm8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2Rlc2NyaXB0b3JfID0gR2VuZXJhdGVkQ29kZUluZm9fZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKDApOwotICBzdGF0aWMgY29uc3QgaW50IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fb2Zmc2V0c19bNF0gPSB7Ci0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBwYXRoXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBzb3VyY2VfZmlsZV8pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiwgYmVnaW5fKSwKLSAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24sIGVuZF8pLAotICB9OwotICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX3JlZmxlY3Rpb25fID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2Rlc2NyaXB0b3JfLAotICAgICAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX29mZnNldHNfLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIC0xLAotICAgICAgLTEsCi0gICAgICBzaXplb2YoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAotICAgICAgLTEpOwotfQotCi1uYW1lc3BhY2UgewotCi1HT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzX29uY2VfKTsKLWlubGluZSB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNfb25jZV8sCi0gICAgICAgICAgICAgICAgICZwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKTsKLX0KLQotdm9pZCBwcm90b2J1Zl9SZWdpc3RlclR5cGVzKGNvbnN0IDo6c3RkOjpzdHJpbmcmKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfLCAmRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgRmlsZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXywgJkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9kZXNjcmlwdG9yXywgJkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgT25lb2ZEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZPbmVvZkRlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJlNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmTWV0aG9kRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl8sICZNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl8sICZGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgRW51bU9wdGlvbnNfZGVzY3JpcHRvcl8sICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXywgJlNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl8sICZNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl8sICZVbmludGVycHJldGVkT3B0aW9uOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl8sICZVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfLCAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fZGVzY3JpcHRvcl8sICZTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgICBHZW5lcmF0ZWRDb2RlSW5mb19kZXNjcmlwdG9yXywgJkdlbmVyYXRlZENvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICAgIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fZGVzY3JpcHRvcl8sICZHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKSB7Ci0gIGRlbGV0ZSBGaWxlRGVzY3JpcHRvclNldDo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBGaWxlRGVzY3JpcHRvclNldF9yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgRmlsZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fOwotICBkZWxldGUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBGaWVsZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIE9uZW9mRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIE9uZW9mRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOwotICBkZWxldGUgRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBFbnVtRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOwotICBkZWxldGUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgU2VydmljZURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBNZXRob2REZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBGaWxlT3B0aW9uc19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIE1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIE1lc3NhZ2VPcHRpb25zX3JlZmxlY3Rpb25fOwotICBkZWxldGUgRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIEZpZWxkT3B0aW9uc19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIEVudW1PcHRpb25zX3JlZmxlY3Rpb25fOwotICBkZWxldGUgRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBFbnVtVmFsdWVPcHRpb25zX3JlZmxlY3Rpb25fOwotICBkZWxldGUgU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgU2VydmljZU9wdGlvbnNfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIE1ldGhvZE9wdGlvbnNfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBVbmludGVycHJldGVkT3B0aW9uOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFVuaW50ZXJwcmV0ZWRPcHRpb25fcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV87Ci0gIGRlbGV0ZSBTb3VyY2VDb2RlSW5mb19yZWZsZWN0aW9uXzsKLSAgZGVsZXRlIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3JlZmxlY3Rpb25fOwotICBkZWxldGUgR2VuZXJhdGVkQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2VfOwotICBkZWxldGUgR2VuZXJhdGVkQ29kZUluZm9fcmVmbGVjdGlvbl87Ci0gIGRlbGV0ZSBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpkZWZhdWx0X2luc3RhbmNlXzsKLSAgZGVsZXRlIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fcmVmbGVjdGlvbl87Ci19Ci0KLXZvaWQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpIHsKLSAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7Ci0gIGlmIChhbHJlYWR5X2hlcmUpIHJldHVybjsKLSAgYWxyZWFkeV9oZXJlID0gdHJ1ZTsKLSAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OkludGVybmFsQWRkR2VuZXJhdGVkRmlsZSgKLSAgICAiXG4gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cMDIyXDAxN2dvb2ciCi0gICAgImxlLnByb3RvYnVmXCJHXG5cMDIxRmlsZURlc2NyaXB0b3JTZXRcMDIyMlxuXDAwNGZpbGUiCi0gICAgIlwwMzBcMDAxIFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclAiCi0gICAgInJvdG9cIlwzMzNcMDAzXG5cMDIzRmlsZURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEiCi0gICAgIihcdFwwMjJcMDE3XG5cMDA3cGFja2FnZVwwMzBcMDAyIFwwMDEoXHRcMDIyXDAyMlxuXG5kZXBlbmRlbmN5XDAzMFwwMDMgXDAwMyhcdFwwMjIiCi0gICAgIlwwMzFcblwwMjFwdWJsaWNfZGVwZW5kZW5jeVwwMzBcbiBcMDAzKFwwMDVcMDIyXDAyN1xuXDAxN3dlYWtfZGVwZW4iCi0gICAgImRlbmN5XDAzMFwwMTMgXDAwMyhcMDA1XDAyMjZcblwwMTRtZXNzYWdlX3R5cGVcMDMwXDAwNCBcMDAzKFwwMTMyIC5nb29nIgotICAgICJsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9cMDIyN1xuXHRlbnVtX3R5cGUiCi0gICAgIlwwMzBcMDA1IFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclAiCi0gICAgInJvdG9cMDIyOFxuXDAwN3NlcnZpY2VcMDMwXDAwNiBcMDAzKFwwMTMyXCcuZ29vZ2xlLnByb3RvYnVmLiIKLSAgICAiU2VydmljZURlc2NyaXB0b3JQcm90b1wwMjI4XG5cdGV4dGVuc2lvblwwMzBcMDA3IFwwMDMoIgotICAgICJcMDEzMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIgotICAgICJcMDIyLVxuXDAwN29wdGlvbnNcMDMwXDAxMCBcMDAxKFwwMTMyXDAzNC5nb29nbGUucHJvdG9idWYuRmlsZSIKLSAgICAiT3B0aW9uc1wwMjI5XG5cMDIwc291cmNlX2NvZGVfaW5mb1wwMzBcdCBcMDAxKFwwMTMyXDAzNy5nb29nIgotICAgICJsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mb1wwMjJcMDE2XG5cMDA2c3ludGF4XDAzMFwwMTQgXDAwMSIKLSAgICAiKFx0XCJcMzYwXDAwNFxuXDAxN0Rlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyNFxuXDAwNSIKLSAgICAiZmllbGRcMDMwXDAwMiBcMDAzKFwwMTMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjciIKLSAgICAiaXB0b3JQcm90b1wwMjI4XG5cdGV4dGVuc2lvblwwMzBcMDA2IFwwMDMoXDAxMzIlLmdvb2dsZS5wIgotICAgICJyb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvXDAyMjVcblwwMTNuZXN0ZWRfdCIKLSAgICAieXBlXDAzMFwwMDMgXDAwMyhcMDEzMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQciIKLSAgICAib3RvXDAyMjdcblx0ZW51bV90eXBlXDAzMFwwMDQgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmIgotICAgICIuRW51bURlc2NyaXB0b3JQcm90b1wwMjJIXG5cMDE3ZXh0ZW5zaW9uX3JhbmdlXDAzMCIKLSAgICAiXDAwNSBcMDAzKFwwMTMyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLiIKLSAgICAiRXh0ZW5zaW9uUmFuZ2VcMDIyOVxuXG5vbmVvZl9kZWNsXDAzMFwwMTAgXDAwMyhcMDEzMiUuZ29vIgotICAgICJnbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG9cMDIyMFxuXDAwN29wdCIKLSAgICAiaW9uc1wwMzBcMDA3IFwwMDEoXDAxMzJcMDM3Lmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aSIKLSAgICAib25zXDAyMkZcblwwMTZyZXNlcnZlZF9yYW5nZVwwMzBcdCBcMDAzKFwwMTMyLi5nb29nbGUucHJvIgotICAgICJ0b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZVwwMjJcMDI1XG5ccnIiCi0gICAgImVzZXJ2ZWRfbmFtZVwwMzBcbiBcMDAzKFx0XDAzMixcblwwMTZFeHRlbnNpb25SYW5nZVwwMjJcclxuXDAwNSIKLSAgICAic3RhcnRcMDMwXDAwMSBcMDAxKFwwMDVcMDIyXDAxM1xuXDAwM2VuZFwwMzBcMDAyIFwwMDEoXDAwNVwwMzIrXG5cclJlc2VydmVkUmFuZyIKLSAgICAiZVwwMjJcclxuXDAwNXN0YXJ0XDAzMFwwMDEgXDAwMShcMDA1XDAyMlwwMTNcblwwMDNlbmRcMDMwXDAwMiBcMDAxKFwwMDVcIlwyNzRcMDA1XG5cMDI0RmllbGREIgotICAgICJlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAxNlxuXDAwNm51bWJlclwwMzBcMDAzIgotICAgICIgXDAwMShcMDA1XDAyMjpcblwwMDVsYWJlbFwwMzBcMDA0IFwwMDEoXDAxNjIrLmdvb2dsZS5wcm90b2J1Zi5GaSIKLSAgICAiZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsXDAyMjhcblwwMDR0eXBlXDAzMFwwMDUgXDAwMShcMDE2MioiCi0gICAgIi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHkiCi0gICAgInBlXDAyMlwwMjFcblx0dHlwZV9uYW1lXDAzMFwwMDYgXDAwMShcdFwwMjJcMDIwXG5cMDEwZXh0ZW5kZWVcMDMwXDAwMiBcMDAxKFx0XDAyMiIKLSAgICAiXDAyNVxuXHJkZWZhdWx0X3ZhbHVlXDAzMFwwMDcgXDAwMShcdFwwMjJcMDIzXG5cMDEzb25lb2ZfaW5kZXhcMDMwXHQgIgotICAgICJcMDAxKFwwMDVcMDIyXDAyMVxuXHRqc29uX25hbWVcMDMwXG4gXDAwMShcdFwwMjIuXG5cMDA3b3B0aW9uc1wwMzBcMDEwIFwwMDEoXDAxMzIiCi0gICAgIlwwMzUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9uc1wiXDI2NlwwMDJcblwwMDRUeXBlXDAyMiIKLSAgICAiXDAxN1xuXDAxM1RZUEVfRE9VQkxFXDAyMFwwMDFcMDIyXDAxNlxuXG5UWVBFX0ZMT0FUXDAyMFwwMDJcMDIyXDAxNlxuXG5UWVBFIgotICAgICJfSU5UNjRcMDIwXDAwM1wwMjJcMDE3XG5cMDEzVFlQRV9VSU5UNjRcMDIwXDAwNFwwMjJcMDE2XG5cblRZUEVfSU5UMzJcMDIwIgotICAgICJcMDA1XDAyMlwwMjBcblwwMTRUWVBFX0ZJWEVENjRcMDIwXDAwNlwwMjJcMDIwXG5cMDE0VFlQRV9GSVhFRDMyXDAyMFwwMDdcMDIyXHJcbiIKLSAgICAiXHRUWVBFX0JPT0xcMDIwXDAxMFwwMjJcMDE3XG5cMDEzVFlQRV9TVFJJTkdcMDIwXHRcMDIyXDAxNlxuXG5UWVBFX0dSIgotICAgICJPVVBcMDIwXG5cMDIyXDAyMFxuXDAxNFRZUEVfTUVTU0FHRVwwMjBcMDEzXDAyMlwwMTZcblxuVFlQRV9CWVRFU1wwMjBcMDE0XDAyMiIKLSAgICAiXDAxN1xuXDAxM1RZUEVfVUlOVDMyXDAyMFxyXDAyMlxyXG5cdFRZUEVfRU5VTVwwMjBcMDE2XDAyMlwwMjFcblxyVFlQRV8iCi0gICAgIlNGSVhFRDMyXDAyMFwwMTdcMDIyXDAyMVxuXHJUWVBFX1NGSVhFRDY0XDAyMFwwMjBcMDIyXDAxN1xuXDAxM1RZUEVfU0kiCi0gICAgIk5UMzJcMDIwXDAyMVwwMjJcMDE3XG5cMDEzVFlQRV9TSU5UNjRcMDIwXDAyMlwiQ1xuXDAwNUxhYmVsXDAyMlwwMjJcblwwMTZMQUJFIgotICAgICJMX09QVElPTkFMXDAyMFwwMDFcMDIyXDAyMlxuXDAxNkxBQkVMX1JFUVVJUkVEXDAyMFwwMDJcMDIyXDAyMlxuXDAxNkxBQkUiCi0gICAgIkxfUkVQRUFURURcMDIwXDAwM1wiJFxuXDAyNE9uZW9mRGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDQiCi0gICAgIm5hbWVcMDMwXDAwMSBcMDAxKFx0XCJcMjE0XDAwMVxuXDAyM0VudW1EZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hIgotICAgICJtZVwwMzBcMDAxIFwwMDEoXHRcMDIyOFxuXDAwNXZhbHVlXDAzMFwwMDIgXDAwMyhcMDEzMikuZ29vZ2xlLnByb3RvYnUiCi0gICAgImYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvXDAyMi1cblwwMDdvcHRpb25zXDAzMFwwMDMgIgotICAgICJcMDAxKFwwMTMyXDAzNC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNcImxcblwwMzBFbnUiCi0gICAgIm1WYWx1ZURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAxNlxuXDAwNm4iCi0gICAgInVtYmVyXDAzMFwwMDIgXDAwMShcMDA1XDAyMjJcblwwMDdvcHRpb25zXDAzMFwwMDMgXDAwMShcMDEzMiEuZ29vZ2xlLnByIgotICAgICJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1wiXDIyMFwwMDFcblwwMjZTZXJ2aWNlRGVzY3IiCi0gICAgImlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMjZcblwwMDZtZXRob2RcMDMwXDAwMiBcMDAzKFwwMTMiCi0gICAgIjImLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8iCi0gICAgIlwwMjIwXG5cMDA3b3B0aW9uc1wwMzBcMDAzIFwwMDEoXDAxMzJcMDM3Lmdvb2dsZS5wcm90b2J1Zi5TZXJ2IgotICAgICJpY2VPcHRpb25zXCJcMzAxXDAwMVxuXDAyNU1ldGhvZERlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0IgotICAgICJuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDIyXG5cbmlucHV0X3R5cGVcMDMwXDAwMiBcMDAxKFx0XDAyMlwwMjNcblwwMTNvdXRwdXQiCi0gICAgIl90eXBlXDAzMFwwMDMgXDAwMShcdFwwMjIvXG5cMDA3b3B0aW9uc1wwMzBcMDA0IFwwMDEoXDAxMzJcMDM2Lmdvb2dsZS5wciIKLSAgICAib3RvYnVmLk1ldGhvZE9wdGlvbnNcMDIyXDAzN1xuXDAyMGNsaWVudF9zdHJlYW1pbmciCi0gICAgIlwwMzBcMDA1IFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXDAzN1xuXDAyMHNlcnZlcl9zdHJlYW1pbmdcMDMwXDAwNiBcMDAxKFwwMTA6IgotICAgICJcMDA1ZmFsc2VcIlwyMDdcMDA1XG5cMDEzRmlsZU9wdGlvbnNcMDIyXDAyNFxuXDAxNGphdmFfcGFja2FnZVwwMzBcMDAxIgotICAgICIgXDAwMShcdFwwMjJcMDM0XG5cMDI0amF2YV9vdXRlcl9jbGFzc25hbWVcMDMwXDAxMCBcMDAxKFx0XDAyMlwiXG5cMDIzamEiCi0gICAgInZhX211bHRpcGxlX2ZpbGVzXDAzMFxuIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyLFxuXDAzNWphdmFfZyIKLSAgICAiZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hcMDMwXDAyNCBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMiVcblwwMjYiCi0gICAgImphdmFfc3RyaW5nX2NoZWNrX3V0ZjhcMDMwXDAzMyBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMkZcblwwMTRvIgotICAgICJwdGltaXplX2ZvclwwMzBcdCBcMDAxKFwwMTYyKS5nb29nbGUucHJvdG9idWYuRmlsZSIKLSAgICAiT3B0aW9ucy5PcHRpbWl6ZU1vZGU6XDAwNVNQRUVEXDAyMlwwMjJcblxuZ29fcGFja2FnIgotICAgICJlXDAzMFwwMTMgXDAwMShcdFwwMjJcIlxuXDAyM2NjX2dlbmVyaWNfc2VydmljZXNcMDMwXDAyMCBcMDAxKFwwMTA6XDAwNWZhIgotICAgICJsc2VcMDIyJFxuXDAyNWphdmFfZ2VuZXJpY19zZXJ2aWNlc1wwMzBcMDIxIFwwMDEoXDAxMDpcMDA1ZmFscyIKLSAgICAiZVwwMjJcIlxuXDAyM3B5X2dlbmVyaWNfc2VydmljZXNcMDMwXDAyMiBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMzFcbiIKLSAgICAiXG5kZXByZWNhdGVkXDAzMFwwMjcgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJcMDM3XG5cMDIwY2NfZW5hYmxlX2FyIgotICAgICJlbmFzXDAzMFwwMzcgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJcMDMxXG5cMDIxb2JqY19jbGFzc19wcmVmaXhcMDMwJCIKLSAgICAiIFwwMDEoXHRcMDIyXDAzMFxuXDAyMGNzaGFycF9uYW1lc3BhY2VcMDMwJSBcMDAxKFx0XDAyMkNcblwwMjR1bmludGUiCi0gICAgInJwcmV0ZWRfb3B0aW9uXDAzMFwzNDdcMDA3IFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi4iCi0gICAgIlVuaW50ZXJwcmV0ZWRPcHRpb25cIjpcblwwMTRPcHRpbWl6ZU1vZGVcMDIyXHRcblwwMDVTIgotICAgICJQRUVEXDAyMFwwMDFcMDIyXHJcblx0Q09ERV9TSVpFXDAyMFwwMDJcMDIyXDAyMFxuXDAxNExJVEVfUlVOVElNRVwwMjBcMDAzKiIKLSAgICAiXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJKXDAwNFwwMTAmXDAyMFwnXCJcMzQ2XDAwMVxuXDAxNk1lc3NhZ2VPcHRpb25zXDAyMiZcblwwMjdtIgotICAgICJlc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XDAzMFwwMDEgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjIuXG5cMDM3biIKLSAgICAib19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXDAzMFwwMDIgXDAwMShcMDEwOlwwMDVmYSIKLSAgICAibHNlXDAyMlwwMzFcblxuZGVwcmVjYXRlZFwwMzBcMDAzIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXDAyMVxuXHRtYXBfZW4iCi0gICAgInRyeVwwMzBcMDA3IFwwMDEoXDAxMFwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzIgotICAgICIyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdCIKLSAgICAiXDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJcMjMwXDAwM1xuXDAxNEZpZWxkT3B0aW9uc1wwMjI6XG5cMDA1Y3R5cGVcMDMwXDAwMSBcMDAxKCIKLSAgICAiXDAxNjIjLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGU6XDAwNiIKLSAgICAiU1RSSU5HXDAyMlwwMTZcblwwMDZwYWNrZWRcMDMwXDAwMiBcMDAxKFwwMTBcMDIyXD9cblwwMDZqc3R5cGVcMDMwXDAwNiBcMDAxKFwwMTYyJCIKLSAgICAiLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlOlx0SlMiCi0gICAgIl9OT1JNQUxcMDIyXDAyM1xuXDAwNGxhenlcMDMwXDAwNSBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMzFcblxuZGVwcmVjYXQiCi0gICAgImVkXDAzMFwwMDMgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJcMDIzXG5cMDA0d2Vha1wwMzBcbiBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMkNcblwwMjQiCi0gICAgInVuaW50ZXJwcmV0ZWRfb3B0aW9uXDAzMFwzNDdcMDA3IFwwMDMoXDAxMzIkLmdvb2dsZS5wcm8iCi0gICAgInRvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb25cIi9cblwwMDVDVHlwZVwwMjJcblxuXDAwNlNUIgotICAgICJSSU5HXDAyMFwwMDBcMDIyXDAxMFxuXDAwNENPUkRcMDIwXDAwMVwwMjJcMDIwXG5cMDE0U1RSSU5HX1BJRUNFXDAyMFwwMDJcIjVcblwwMDZKUyIKLSAgICAiVHlwZVwwMjJcclxuXHRKU19OT1JNQUxcMDIwXDAwMFwwMjJcclxuXHRKU19TVFJJTkdcMDIwXDAwMVwwMjJcclxuXHRKUyIKLSAgICAiX05VTUJFUlwwMjBcMDAyKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJcMjE1XDAwMVxuXDAxM0VudW1PcHRpb25zXDAyMlwwMjNcblwwMTMiCi0gICAgImFsbG93X2FsaWFzXDAzMFwwMDIgXDAwMShcMDEwXDAyMlwwMzFcblxuZGVwcmVjYXRlZFwwMzBcMDAzIFwwMDEoXDAxMDpcMDA1ZiIKLSAgICAiYWxzZVwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ28iCi0gICAgIm9nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwIgotICAgICJcMjAwXDIwMFwyMDBcMDAyXCJ9XG5cMDIwRW51bVZhbHVlT3B0aW9uc1wwMjJcMDMxXG5cbmRlcHJlY2F0ZWRcMDMwXDAwMSIKLSAgICAiIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXDAzMFwzNDdcMDA3IFwwMDMiCi0gICAgIihcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24iCi0gICAgIipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwie1xuXDAxNlNlcnZpY2VPcHRpb25zXDAyMlwwMzFcblxuZGVwcmVjYSIKLSAgICAidGVkXDAzMCEgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb24iCi0gICAgIlwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE8iCi0gICAgInB0aW9uKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJ6XG5cck1ldGhvZE9wdGlvbnNcMDIyXDAzMVxuXG5kZXAiCi0gICAgInJlY2F0ZWRcMDMwISBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wIgotICAgICJ0aW9uXDAzMFwzNDdcMDA3IFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJlIgotICAgICJ0ZWRPcHRpb24qXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcIlwyMzZcMDAyXG5cMDIzVW5pbnRlcnByZXRlZE9wIgotICAgICJ0aW9uXDAyMjtcblwwMDRuYW1lXDAzMFwwMDIgXDAwMyhcMDEzMi0uZ29vZ2xlLnByb3RvYnVmLlVuaSIKLSAgICAibnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydFwwMjJcMDMwXG5cMDIwaWRlbnRpZmllcl8iCi0gICAgInZhbHVlXDAzMFwwMDMgXDAwMShcdFwwMjJcMDMyXG5cMDIycG9zaXRpdmVfaW50X3ZhbHVlXDAzMFwwMDQgXDAwMShcMDA0XDAyMiIKLSAgICAiXDAzMlxuXDAyMm5lZ2F0aXZlX2ludF92YWx1ZVwwMzBcMDA1IFwwMDEoXDAwM1wwMjJcMDI0XG5cMDE0ZG91YmxlX3ZhIgotICAgICJsdWVcMDMwXDAwNiBcMDAxKFwwMDFcMDIyXDAyNFxuXDAxNHN0cmluZ192YWx1ZVwwMzBcMDA3IFwwMDEoXDAxNFwwMjJcMDI3XG5cMDE3YWdncmUiCi0gICAgImdhdGVfdmFsdWVcMDMwXDAxMCBcMDAxKFx0XDAzMjNcblwwMTBOYW1lUGFydFwwMjJcMDIxXG5cdG5hbWVfcGFyIgotICAgICJ0XDAzMFwwMDEgXDAwMihcdFwwMjJcMDI0XG5cMDE0aXNfZXh0ZW5zaW9uXDAzMFwwMDIgXDAwMihcMDEwXCJcMzI1XDAwMVxuXDAxNlNvdXJjZSIKLSAgICAiQ29kZUluZm9cMDIyOlxuXDAxMGxvY2F0aW9uXDAzMFwwMDEgXDAwMyhcMDEzMiguZ29vZ2xlLnByb3QiCi0gICAgIm9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb25cMDMyXDIwNlwwMDFcblwwMTBMb2NhdGlvIgotICAgICJuXDAyMlwwMjBcblwwMDRwYXRoXDAzMFwwMDEgXDAwMyhcMDA1QlwwMDJcMDIwXDAwMVwwMjJcMDIwXG5cMDA0c3BhblwwMzBcMDAyIFwwMDMoXDAwNUJcMDAyXDAyMFwwMDFcMDIyXDAzMFxuIgotICAgICJcMDIwbGVhZGluZ19jb21tZW50c1wwMzBcMDAzIFwwMDEoXHRcMDIyXDAzMVxuXDAyMXRyYWlsaW5nX2NvbW0iCi0gICAgImVudHNcMDMwXDAwNCBcMDAxKFx0XDAyMiFcblwwMzFsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXDAzMCIKLSAgICAiXDAwNiBcMDAzKFx0XCJcMjQ3XDAwMVxuXDAyMUdlbmVyYXRlZENvZGVJbmZvXDAyMkFcblxuYW5ub3RhdGlvIgotICAgICJuXDAzMFwwMDEgXDAwMyhcMDEzMi0uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJIgotICAgICJuZm8uQW5ub3RhdGlvblwwMzJPXG5cbkFubm90YXRpb25cMDIyXDAyMFxuXDAwNHBhdGhcMDMwXDAwMSBcMDAzIgotICAgICIoXDAwNUJcMDAyXDAyMFwwMDFcMDIyXDAyM1xuXDAxM3NvdXJjZV9maWxlXDAzMFwwMDIgXDAwMShcdFwwMjJcclxuXDAwNWJlZ2luXDAzMFwwMDMgXDAwMSIKLSAgICAiKFwwMDVcMDIyXDAxM1xuXDAwM2VuZFwwMzBcMDA0IFwwMDEoXDAwNUJYXG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcMDIwIgotICAgICJEZXNjcmlwdG9yUHJvdG9zSFwwMDFaXG5kZXNjcmlwdG9yXDI0MlwwMDJcMDAzR1BCXDI1MlwwMDJcMDMyRyIKLSAgICAib29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbiIsIDUxNDUpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZSgKLSAgICAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iLCAmcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyk7Ci0gIEZpbGVEZXNjcmlwdG9yU2V0OjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBGaWxlRGVzY3JpcHRvclNldCgpOwotICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBGaWxlRGVzY3JpcHRvclByb3RvKCk7Ci0gIERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRGVzY3JpcHRvclByb3RvKCk7Ci0gIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKCk7Ci0gIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSgpOwotICBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmllbGREZXNjcmlwdG9yUHJvdG8oKTsKLSAgT25lb2ZEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IE9uZW9mRGVzY3JpcHRvclByb3RvKCk7Ci0gIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEVudW1EZXNjcmlwdG9yUHJvdG8oKTsKLSAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKTsKLSAgU2VydmljZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU2VydmljZURlc2NyaXB0b3JQcm90bygpOwotICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IE1ldGhvZERlc2NyaXB0b3JQcm90bygpOwotICBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmlsZU9wdGlvbnMoKTsKLSAgTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IE1lc3NhZ2VPcHRpb25zKCk7Ci0gIEZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRmllbGRPcHRpb25zKCk7Ci0gIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBFbnVtT3B0aW9ucygpOwotICBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBFbnVtVmFsdWVPcHRpb25zKCk7Ci0gIFNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBTZXJ2aWNlT3B0aW9ucygpOwotICBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBNZXRob2RPcHRpb25zKCk7Ci0gIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFVuaW50ZXJwcmV0ZWRPcHRpb24oKTsKLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpOwotICBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU291cmNlQ29kZUluZm8oKTsKLSAgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCk7Ci0gIEdlbmVyYXRlZENvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBHZW5lcmF0ZWRDb2RlSW5mbygpOwotICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKCk7Ci0gIEZpbGVEZXNjcmlwdG9yU2V0OjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBPbmVvZkRlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBHZW5lcmF0ZWRDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok9uU2h1dGRvd24oJnByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90byk7Ci19Ci0KLS8vIEZvcmNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYmUgY2FsbGVkIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbiB0aW1lLgotc3RydWN0IFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90byB7Ci0gIFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpIHsKLSAgICBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIH0KLX0gc3RhdGljX2Rlc2NyaXB0b3JfaW5pdGlhbGl6ZXJfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fOwotCi1uYW1lc3BhY2UgewotCi1zdGF0aWMgdm9pZCBNZXJnZUZyb21GYWlsKGludCBsaW5lKSBHT09HTEVfQVRUUklCVVRFX0NPTEQ7Ci1zdGF0aWMgdm9pZCBNZXJnZUZyb21GYWlsKGludCBsaW5lKSB7Ci0gIEdPT0dMRV9DSEVDSyhmYWxzZSkgPDwgX19GSUxFX18gPDwgIjoiIDw8IGxpbmU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgRmlsZURlc2NyaXB0b3JTZXQ6OmtGaWxlRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLUZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVzY3JpcHRvclNldCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCi19Ci0KLXZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotRmlsZURlc2NyaXB0b3JTZXQ6OkZpbGVEZXNjcmlwdG9yU2V0KGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotRmlsZURlc2NyaXB0b3JTZXQ6On5GaWxlRGVzY3JpcHRvclNldCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yU2V0OjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBGaWxlRGVzY3JpcHRvclNldCYgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLUZpbGVEZXNjcmlwdG9yU2V0KiBGaWxlRGVzY3JpcHRvclNldDo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1GaWxlRGVzY3JpcHRvclNldCogRmlsZURlc2NyaXB0b3JTZXQ6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBGaWxlRGVzY3JpcHRvclNldCogbiA9IG5ldyBGaWxlRGVzY3JpcHRvclNldDsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSAgZmlsZV8uQ2xlYXIoKTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotICB9Ci19Ci0KLWJvb2wgRmlsZURlc2NyaXB0b3JTZXQ6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfZmlsZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2ZpbGUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2xvb3BfZmlsZTsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotICByZXR1cm4gdHJ1ZTsKLWZhaWx1cmU6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmZpbGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDEsIHRoaXMtPmZpbGUoaSksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRmlsZURlc2NyaXB0b3JTZXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZSA9IDE7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZmlsZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICAxLCB0aGlzLT5maWxlKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgRmlsZURlc2NyaXB0b3JTZXQ6OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZmlsZV9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+ZmlsZShpKSk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3JTZXQqIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBGaWxlRGVzY3JpcHRvclNldD4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6TWVyZ2VGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGZpbGVfLk1lcmdlRnJvbShmcm9tLmZpbGVfKTsKLSAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotICB9Ci19Ci0KLXZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6Q29weUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRmlsZURlc2NyaXB0b3JTZXQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0KLSAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT5maWxlKCkpKSByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpTd2FwKEZpbGVEZXNjcmlwdG9yU2V0KiBvdGhlcikgewotICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBJbnRlcm5hbFN3YXAob3RoZXIpOwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6SW50ZXJuYWxTd2FwKEZpbGVEZXNjcmlwdG9yU2V0KiBvdGhlcikgewotICBmaWxlXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5maWxlXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEZpbGVEZXNjcmlwdG9yU2V0OjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBGaWxlRGVzY3JpcHRvclNldF9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpbGVEZXNjcmlwdG9yU2V0X3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIEZpbGVEZXNjcmlwdG9yU2V0Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKLWludCBGaWxlRGVzY3JpcHRvclNldDo6ZmlsZV9zaXplKCkgY29uc3QgewotICByZXR1cm4gZmlsZV8uc2l6ZSgpOwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6Y2xlYXJfZmlsZSgpIHsKLSAgZmlsZV8uQ2xlYXIoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCi0gIHJldHVybiBmaWxlXy5HZXQoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclNldDo6bXV0YWJsZV9maWxlKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZSkKLSAgcmV0dXJuIGZpbGVfLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclNldDo6YWRkX2ZpbGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCi0gIHJldHVybiBmaWxlXy5BZGQoKTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4qCi1GaWxlRGVzY3JpcHRvclNldDo6bXV0YWJsZV9maWxlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQotICByZXR1cm4gJmZpbGVfOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yU2V0OjpmaWxlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZSkKLSAgcmV0dXJuIGZpbGVfOwotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1BhY2thZ2VGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprRGVwZW5kZW5jeUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQdWJsaWNEZXBlbmRlbmN5RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1dlYWtEZXBlbmRlbmN5RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1NlcnZpY2VGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprU291cmNlQ29kZUluZm9GaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprU3ludGF4RmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLUZpbGVEZXNjcmlwdG9yUHJvdG86OkZpbGVEZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi19Ci0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotICBvcHRpb25zXyA9IGNvbnN0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqPigmOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKLSAgc291cmNlX2NvZGVfaW5mb18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLUZpbGVEZXNjcmlwdG9yUHJvdG86OkZpbGVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBuYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIHBhY2thZ2VfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgb3B0aW9uc18gPSBOVUxMOwotICBzb3VyY2VfY29kZV9pbmZvXyA9IE5VTEw7Ci0gIHN5bnRheF8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1GaWxlRGVzY3JpcHRvclByb3RvOjp+RmlsZURlc2NyaXB0b3JQcm90bygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgewotICBuYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBwYWNrYWdlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBzeW50YXhfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gICAgZGVsZXRlIG9wdGlvbnNfOwotICAgIGRlbGV0ZSBzb3VyY2VfY29kZV9pbmZvXzsKLSAgfQotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEZpbGVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLUZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotRmlsZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG4gPSBuZXcgRmlsZURlc2NyaXB0b3JQcm90bzsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAzdSkgewotICAgIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNfcGFja2FnZSgpKSB7Ci0gICAgICBwYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAzNTg0dSkgewotICAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OkNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChoYXNfc291cmNlX2NvZGVfaW5mbygpKSB7Ci0gICAgICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7Ci0gICAgfQotICAgIGlmIChoYXNfc3ludGF4KCkpIHsKLSAgICAgIHN5bnRheF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgfQotICBkZXBlbmRlbmN5Xy5DbGVhcigpOwotICBwdWJsaWNfZGVwZW5kZW5jeV8uQ2xlYXIoKTsKLSAgd2Vha19kZXBlbmRlbmN5Xy5DbGVhcigpOwotICBtZXNzYWdlX3R5cGVfLkNsZWFyKCk7Ci0gIGVudW1fdHlwZV8uQ2xlYXIoKTsKLSAgc2VydmljZV8uQ2xlYXIoKTsKLSAgZXh0ZW5zaW9uXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX3BhY2thZ2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAxOCkgewotICAgICAgICAgcGFyc2VfcGFja2FnZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfcGFja2FnZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5wYWNrYWdlKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfZGVwZW5kZW5jeTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAodGFnID09IDI2KSB7Ci0gICAgICAgICBwYXJzZV9kZXBlbmRlbmN5OgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+YWRkX2RlcGVuZGVuY3koKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+ZGVwZW5kZW5jeSh0aGlzLT5kZXBlbmRlbmN5X3NpemUoKSAtIDEpLmRhdGEoKSwKLSAgICAgICAgICAgIHRoaXMtPmRlcGVuZGVuY3kodGhpcy0+ZGVwZW5kZW5jeV9zaXplKCkgLSAxKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9kZXBlbmRlbmN5OwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfbWVzc2FnZV90eXBlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKLSAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAodGFnID09IDM0KSB7Ci0gICAgICAgICBwYXJzZV9tZXNzYWdlX3R5cGU6Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfbWVzc2FnZV90eXBlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbWVzc2FnZV90eXBlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDM0KSkgZ290byBwYXJzZV9sb29wX21lc3NhZ2VfdHlwZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2xvb3BfZW51bV90eXBlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OwotICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNDIpIHsKLSAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOwotICAgICAgICAgcGFyc2VfbG9vcF9lbnVtX3R5cGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9lbnVtX3R5cGUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2xvb3BfZW51bV90eXBlOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1MCkpIGdvdG8gcGFyc2VfbG9vcF9zZXJ2aWNlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBpZiAodGFnID09IDUwKSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3Bfc2VydmljZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3NlcnZpY2UoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xvb3Bfc2VydmljZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKLSAgICAgIGNhc2UgNzogewotICAgICAgICBpZiAodGFnID09IDU4KSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZXh0ZW5zaW9uKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9sb29wX2V4dGVuc2lvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDY2KSkgZ290byBwYXJzZV9vcHRpb25zOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKLSAgICAgIGNhc2UgODogewotICAgICAgICBpZiAodGFnID09IDY2KSB7Ci0gICAgICAgICBwYXJzZV9vcHRpb25zOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc0KSkgZ290byBwYXJzZV9zb3VyY2VfY29kZV9pbmZvOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyBzb3VyY2VfY29kZV9pbmZvID0gOTsKLSAgICAgIGNhc2UgOTogewotICAgICAgICBpZiAodGFnID09IDc0KSB7Ci0gICAgICAgICBwYXJzZV9zb3VyY2VfY29kZV9pbmZvOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDgwKSkgZ290byBwYXJzZV9wdWJsaWNfZGVwZW5kZW5jeTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7Ci0gICAgICBjYXNlIDEwOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gODApIHsKLSAgICAgICAgIHBhcnNlX3B1YmxpY19kZXBlbmRlbmN5OgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIDEsIDgwLCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wdWJsaWNfZGVwZW5kZW5jeSgpKSkpOwotICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSA4MikgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3B1YmxpY19kZXBlbmRlbmN5KCkpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MCkpIGdvdG8gcGFyc2VfcHVibGljX2RlcGVuZGVuY3k7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDg4KSkgZ290byBwYXJzZV93ZWFrX2RlcGVuZGVuY3k7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKLSAgICAgIGNhc2UgMTE6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA4OCkgewotICAgICAgICAgcGFyc2Vfd2Vha19kZXBlbmRlbmN5OgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIDEsIDg4LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKSkpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gOTApIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKSkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDg4KSkgZ290byBwYXJzZV93ZWFrX2RlcGVuZGVuY3k7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDk4KSkgZ290byBwYXJzZV9zeW50YXg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7Ci0gICAgICBjYXNlIDEyOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gOTgpIHsKLSAgICAgICAgIHBhcnNlX3N5bnRheDoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfc3ludGF4KCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPnN5bnRheCgpLmRhdGEoKSwgdGhpcy0+c3ludGF4KCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiBmYWxzZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKLSAgaWYgKGhhc19wYWNrYWdlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPnBhY2thZ2UoKS5kYXRhKCksIHRoaXMtPnBhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgMiwgdGhpcy0+cGFja2FnZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmRlcGVuZGVuY3koaSkuZGF0YSgpLCB0aGlzLT5kZXBlbmRlbmN5KGkpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCi0gICAgICAzLCB0aGlzLT5kZXBlbmRlbmN5KGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDQsIHRoaXMtPm1lc3NhZ2VfdHlwZShpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgNSwgdGhpcy0+ZW51bV90eXBlKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDYsIHRoaXMtPnNlcnZpY2UoaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA3LCB0aGlzLT5leHRlbnNpb24oaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA4LCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OwotICBpZiAoaGFzX3NvdXJjZV9jb2RlX2luZm8oKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA5LCAqdGhpcy0+c291cmNlX2NvZGVfaW5mb18sIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoCi0gICAgICAxMCwgdGhpcy0+cHVibGljX2RlcGVuZGVuY3koaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT53ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigKLSAgICAgIDExLCB0aGlzLT53ZWFrX2RlcGVuZGVuY3koaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7Ci0gIGlmIChoYXNfc3ludGF4KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPnN5bnRheCgpLmRhdGEoKSwgdGhpcy0+c3ludGF4KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4Iik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgMTIsIHRoaXMtPnN5bnRheCgpLCBvdXRwdXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRmlsZURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAyOwotICBpZiAoaGFzX3BhY2thZ2UoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+cGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+cGFja2FnZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMiwgdGhpcy0+cGFja2FnZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmRlcGVuZGVuY3koaSkuZGF0YSgpLCB0aGlzLT5kZXBlbmRlbmN5KGkpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kiKTsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZVN0cmluZ1RvQXJyYXkoMywgdGhpcy0+ZGVwZW5kZW5jeShpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bWVzc2FnZV90eXBlX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDQsIHRoaXMtPm1lc3NhZ2VfdHlwZShpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICA1LCB0aGlzLT5lbnVtX3R5cGUoaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+c2VydmljZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICA2LCB0aGlzLT5zZXJ2aWNlKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICA3LCB0aGlzLT5leHRlbnNpb24oaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDgsICp0aGlzLT5vcHRpb25zXywgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7Ci0gIGlmIChoYXNfc291cmNlX2NvZGVfaW5mbygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgOSwgKnRoaXMtPnNvdXJjZV9jb2RlX2luZm9fLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlSW50MzJUb0FycmF5KDEwLCB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeShpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPndlYWtfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlSW50MzJUb0FycmF5KDExLCB0aGlzLT53ZWFrX2RlcGVuZGVuY3koaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7Ci0gIGlmIChoYXNfc3ludGF4KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPnN5bnRheCgpLmRhdGEoKSwgdGhpcy0+c3ludGF4KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4Iik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDEyLCB0aGlzLT5zeW50YXgoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgM3UpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAyOwotICAgIGlmIChoYXNfcGFja2FnZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5wYWNrYWdlKCkpOwotICAgIH0KLQotICB9Ci0gIGlmIChfaGFzX2JpdHNfWzkgLyAzMl0gJiAzNTg0dSkgewotICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7Ci0gICAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICAqdGhpcy0+b3B0aW9uc18pOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7Ci0gICAgaWYgKGhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICAqdGhpcy0+c291cmNlX2NvZGVfaW5mb18pOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzeW50YXggPSAxMjsKLSAgICBpZiAoaGFzX3N5bnRheCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5zeW50YXgoKSk7Ci0gICAgfQotCi0gIH0KLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5kZXBlbmRlbmN5X3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgIHRoaXMtPmRlcGVuZGVuY3koaSkpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKLSAgewotICAgIGludCBkYXRhX3NpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRhdGFfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICAgIEludDMyU2l6ZSh0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeShpKSk7Ci0gICAgfQotICAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKSArIGRhdGFfc2l6ZTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOwotICB7Ci0gICAgaW50IGRhdGFfc2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT53ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKLSAgICAgIGRhdGFfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICAgIEludDMyU2l6ZSh0aGlzLT53ZWFrX2RlcGVuZGVuY3koaSkpOwotICAgIH0KLSAgICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT53ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpICsgZGF0YV9zaXplOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bWVzc2FnZV90eXBlX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPm1lc3NhZ2VfdHlwZShpKSk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZW51bV90eXBlX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPmVudW1fdHlwZShpKSk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPnNlcnZpY2UoaSkpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+ZXh0ZW5zaW9uKGkpKTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogc291cmNlID0gCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgZGVwZW5kZW5jeV8uTWVyZ2VGcm9tKGZyb20uZGVwZW5kZW5jeV8pOwotICBwdWJsaWNfZGVwZW5kZW5jeV8uTWVyZ2VGcm9tKGZyb20ucHVibGljX2RlcGVuZGVuY3lfKTsKLSAgd2Vha19kZXBlbmRlbmN5Xy5NZXJnZUZyb20oZnJvbS53ZWFrX2RlcGVuZGVuY3lfKTsKLSAgbWVzc2FnZV90eXBlXy5NZXJnZUZyb20oZnJvbS5tZXNzYWdlX3R5cGVfKTsKLSAgZW51bV90eXBlXy5NZXJnZUZyb20oZnJvbS5lbnVtX3R5cGVfKTsKLSAgc2VydmljZV8uTWVyZ2VGcm9tKGZyb20uc2VydmljZV8pOwotICBleHRlbnNpb25fLk1lcmdlRnJvbShmcm9tLmV4dGVuc2lvbl8pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX25hbWUoKSkgewotICAgICAgc2V0X2hhc19uYW1lKCk7Ci0gICAgICBuYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV8pOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfcGFja2FnZSgpKSB7Ci0gICAgICBzZXRfaGFzX3BhY2thZ2UoKTsKLSAgICAgIHBhY2thZ2VfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5wYWNrYWdlXyk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bOSAvIDMyXSAmICgweGZmdSA8PCAoOSAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfb3B0aW9ucygpKSB7Ci0gICAgICBtdXRhYmxlX29wdGlvbnMoKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSkgewotICAgICAgbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86Ok1lcmdlRnJvbShmcm9tLnNvdXJjZV9jb2RlX2luZm8oKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19zeW50YXgoKSkgewotICAgICAgc2V0X2hhc19zeW50YXgoKTsKLSAgICAgIHN5bnRheF8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnN5bnRheF8pOwotICAgIH0KLSAgfQotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPm1lc3NhZ2VfdHlwZSgpKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPmVudW1fdHlwZSgpKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnNlcnZpY2UoKSkpIHJldHVybiBmYWxzZTsKLSAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT5leHRlbnNpb24oKSkpIHJldHVybiBmYWxzZTsKLSAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICBpZiAoIXRoaXMtPm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTd2FwKEZpbGVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChGaWxlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOwotICBwYWNrYWdlXy5Td2FwKCZvdGhlci0+cGFja2FnZV8pOwotICBkZXBlbmRlbmN5Xy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5kZXBlbmRlbmN5Xyk7Ci0gIHB1YmxpY19kZXBlbmRlbmN5Xy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5wdWJsaWNfZGVwZW5kZW5jeV8pOwotICB3ZWFrX2RlcGVuZGVuY3lfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPndlYWtfZGVwZW5kZW5jeV8pOwotICBtZXNzYWdlX3R5cGVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPm1lc3NhZ2VfdHlwZV8pOwotICBlbnVtX3R5cGVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmVudW1fdHlwZV8pOwotICBzZXJ2aWNlXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5zZXJ2aWNlXyk7Ci0gIGV4dGVuc2lvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZXh0ZW5zaW9uXyk7Ci0gIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKLSAgc3RkOjpzd2FwKHNvdXJjZV9jb2RlX2luZm9fLCBvdGhlci0+c291cmNlX2NvZGVfaW5mb18pOwotICBzeW50YXhfLlN3YXAoJm90aGVyLT5zeW50YXhfKTsKLSAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Ci0gIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRmlsZURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRmlsZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpbGVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotLy8gRmlsZURlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1ib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX25hbWUoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgY2xlYXJfaGFzX25hbWUoKTsKLSAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgfQotICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKLWJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX3BhY2thZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3BhY2thZ2UoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19wYWNrYWdlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcGFja2FnZSgpIHsKLSAgcGFja2FnZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfcGFja2FnZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVEZXNjcmlwdG9yUHJvdG86OnBhY2thZ2UoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKLSAgcmV0dXJuIHBhY2thZ2VfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9wYWNrYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfcGFja2FnZSgpOwotICBwYWNrYWdlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCi19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX3BhY2thZ2UoKTsKLSAgcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCi19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19wYWNrYWdlKCk7Ci0gIHBhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCi19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9wYWNrYWdlKCkgewotICBzZXRfaGFzX3BhY2thZ2UoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKLSAgcmV0dXJuIHBhY2thZ2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9wYWNrYWdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQotICBjbGVhcl9oYXNfcGFja2FnZSgpOwotICByZXR1cm4gcGFja2FnZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfcGFja2FnZSg6OnN0ZDo6c3RyaW5nKiBwYWNrYWdlKSB7Ci0gIGlmIChwYWNrYWdlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX3BhY2thZ2UoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfcGFja2FnZSgpOwotICB9Ci0gIHBhY2thZ2VfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBwYWNrYWdlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKLX0KLQotLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwotaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGRlcGVuZGVuY3lfLnNpemUoKTsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZGVwZW5kZW5jeSgpIHsKLSAgZGVwZW5kZW5jeV8uQ2xlYXIoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCi0gIHJldHVybiBkZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOwotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVwZW5kZW5jeShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLSAgcmV0dXJuIGRlcGVuZGVuY3lfLk11dGFibGUoaW5kZXgpOwotfQotIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCi0gIGRlcGVuZGVuY3lfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgewotICBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCi19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLSAgcmV0dXJuIGRlcGVuZGVuY3lfLkFkZCgpOwotfQotIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgZGVwZW5kZW5jeV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLX0KLSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIGRlcGVuZGVuY3lfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLX0KLSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBkZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQotfQotIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCi1GaWxlRGVzY3JpcHRvclByb3RvOjpkZXBlbmRlbmN5KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQotICByZXR1cm4gZGVwZW5kZW5jeV87Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVwZW5kZW5jeSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQotICByZXR1cm4gJmRlcGVuZGVuY3lfOwotfQotCi0vLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOwotaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBwdWJsaWNfZGVwZW5kZW5jeV8uc2l6ZSgpOwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9wdWJsaWNfZGVwZW5kZW5jeSgpIHsKLSAgcHVibGljX2RlcGVuZGVuY3lfLkNsZWFyKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWxlRGVzY3JpcHRvclByb3RvOjpwdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKLSAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOwotfQotIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3B1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBwdWJsaWNfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCi19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfcHVibGljX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBwdWJsaWNfZGVwZW5kZW5jeV8uQWRkKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKLX0KLSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKLSAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5XzsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCi0gIHJldHVybiAmcHVibGljX2RlcGVuZGVuY3lfOwotfQotCi0vLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKLWludCBGaWxlRGVzY3JpcHRvclByb3RvOjp3ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHdlYWtfZGVwZW5kZW5jeV8uc2l6ZSgpOwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl93ZWFrX2RlcGVuZGVuY3koKSB7Ci0gIHdlYWtfZGVwZW5kZW5jeV8uQ2xlYXIoKTsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEZpbGVEZXNjcmlwdG9yUHJvdG86OndlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCi0gIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfLkdldChpbmRleCk7Ci19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfd2Vha19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICB3ZWFrX2RlcGVuZGVuY3lfLlNldChpbmRleCwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLndlYWtfZGVwZW5kZW5jeSkKLX0KLSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF93ZWFrX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICB3ZWFrX2RlcGVuZGVuY3lfLkFkZCh2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQotfQotIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgotRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCi0gIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfOwotfQotIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgotRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQotICByZXR1cm4gJndlYWtfZGVwZW5kZW5jeV87Ci19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7Ci1pbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBtZXNzYWdlX3R5cGVfLnNpemUoKTsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbWVzc2FnZV90eXBlKCkgewotICBtZXNzYWdlX3R5cGVfLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSkKLSAgcmV0dXJuIG1lc3NhZ2VfdHlwZV8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQotICByZXR1cm4gbWVzc2FnZV90eXBlXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfbWVzc2FnZV90eXBlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSkKLSAgcmV0dXJuIG1lc3NhZ2VfdHlwZV8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCi1GaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUpCi0gIHJldHVybiAmbWVzc2FnZV90eXBlXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om1lc3NhZ2VfdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQotICByZXR1cm4gbWVzc2FnZV90eXBlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDU7Ci1pbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBlbnVtX3R5cGVfLnNpemUoKTsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZW51bV90eXBlKCkgewotICBlbnVtX3R5cGVfLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiBlbnVtX3R5cGVfLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZW51bV90eXBlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKLSAgcmV0dXJuIGVudW1fdHlwZV8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgotRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQotICByZXR1cm4gJmVudW1fdHlwZV87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgotRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiBlbnVtX3R5cGVfOwotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7Ci1pbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZV9zaXplKCkgY29uc3QgewotICByZXR1cm4gc2VydmljZV8uc2l6ZSgpOwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zZXJ2aWNlKCkgewotICBzZXJ2aWNlXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXJ2aWNlKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCi0gIHJldHVybiBzZXJ2aWNlXy5HZXQoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3NlcnZpY2UoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCi0gIHJldHVybiBzZXJ2aWNlXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3NlcnZpY2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKLSAgcmV0dXJuIHNlcnZpY2VfLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPioKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc2VydmljZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlKQotICByZXR1cm4gJnNlcnZpY2VfOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86OnNlcnZpY2UoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCi0gIHJldHVybiBzZXJ2aWNlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OwotaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgewotICByZXR1cm4gZXh0ZW5zaW9uXy5zaXplKCk7Ci19Ci12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2V4dGVuc2lvbigpIHsKLSAgZXh0ZW5zaW9uXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKLSAgcmV0dXJuIGV4dGVuc2lvbl8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCi1GaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiAmZXh0ZW5zaW9uXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgotRmlsZURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fOwotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OwotYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDIwMHUpICE9IDA7Ci19Ci12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAyMDB1OwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgewotICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OkNsZWFyKCk7Ci0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zJiBGaWxlRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKLSAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICByZXR1cm4gb3B0aW9uc187Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBOVUxMOwotICByZXR1cm4gdGVtcDsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnMpIHsKLSAgZGVsZXRlIG9wdGlvbnNfOwotICBvcHRpb25zXyA9IG9wdGlvbnM7Ci0gIGlmIChvcHRpb25zKSB7Ci0gICAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OwotYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDQwMHUpICE9IDA7Ci19Ci12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwNDAwdTsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3NvdXJjZV9jb2RlX2luZm8oKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA0MDB1OwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zb3VyY2VfY29kZV9pbmZvKCkgewotICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7Ci0gIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzb3VyY2VfY29kZV9pbmZvKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCi0gIHJldHVybiBzb3VyY2VfY29kZV9pbmZvXyAhPSBOVUxMID8gKnNvdXJjZV9jb2RlX2luZm9fIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5zb3VyY2VfY29kZV9pbmZvXzsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc291cmNlX2NvZGVfaW5mbygpIHsKLSAgc2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIGlmIChzb3VyY2VfY29kZV9pbmZvXyA9PSBOVUxMKSB7Ci0gICAgc291cmNlX2NvZGVfaW5mb18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbzsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQotICByZXR1cm4gc291cmNlX2NvZGVfaW5mb187Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3NvdXJjZV9jb2RlX2luZm8oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCi0gIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHRlbXAgPSBzb3VyY2VfY29kZV9pbmZvXzsKLSAgc291cmNlX2NvZGVfaW5mb18gPSBOVUxMOwotICByZXR1cm4gdGVtcDsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9zb3VyY2VfY29kZV9pbmZvKDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm8pIHsKLSAgZGVsZXRlIHNvdXJjZV9jb2RlX2luZm9fOwotICBzb3VyY2VfY29kZV9pbmZvXyA9IHNvdXJjZV9jb2RlX2luZm87Ci0gIGlmIChzb3VyY2VfY29kZV9pbmZvKSB7Ci0gICAgc2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX3NvdXJjZV9jb2RlX2luZm8oKTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7Ci1ib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19zeW50YXgoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDA4MDB1KSAhPSAwOwotfQotdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3N5bnRheCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwODAwdTsKLX0KLXZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3N5bnRheCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDgwMHU7Ci19Ci12b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3N5bnRheCgpIHsKLSAgc3ludGF4Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19zeW50YXgoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzeW50YXgoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQotICByZXR1cm4gc3ludGF4Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfc3ludGF4KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfc3ludGF4KCk7Ci0gIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCi19Ci0gdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfc3ludGF4KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfc3ludGF4KCk7Ci0gIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKLX0KLSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9zeW50YXgoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfc3ludGF4KCk7Ci0gIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc3ludGF4KCkgewotICBzZXRfaGFzX3N5bnRheCgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCi0gIHJldHVybiBzeW50YXhfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9zeW50YXgoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKLSAgY2xlYXJfaGFzX3N5bnRheCgpOwotICByZXR1cm4gc3ludGF4Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9zeW50YXgoOjpzdGQ6OnN0cmluZyogc3ludGF4KSB7Ci0gIGlmIChzeW50YXggIT0gTlVMTCkgewotICAgIHNldF9oYXNfc3ludGF4KCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX3N5bnRheCgpOwotICB9Ci0gIHN5bnRheF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHN5bnRheCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKLX0KLQotI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmtTdGFydEZpZWxkTnVtYmVyOwotY29uc3QgaW50IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6a0VuZEZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCi0gICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIHN0YXJ0XyA9IDA7Ci0gIGVuZF8gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6On5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIG4gPSBuZXcgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obik7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jZGVmaW5lIFpSX0hFTFBFUl8oZikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAotICBfX2J1aWx0aW5fb2Zmc2V0b2YoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBmKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcG9wIikKLSNlbHNlCi0jZGVmaW5lIFpSX0hFTFBFUl8oZikgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oXAotICAmcmVpbnRlcnByZXRfY2FzdDxEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqPigxNiktPmYpCi0jZW5kaWYKLQotI2RlZmluZSBaUl8oZmlyc3QsIGxhc3QpIGRvIHtcCi0gIDo6bWVtc2V0KCZmaXJzdCwgMCxcCi0gICAgICAgICAgIFpSX0hFTFBFUl8obGFzdCkgLSBaUl9IRUxQRVJfKGZpcnN0KSArIHNpemVvZihsYXN0KSk7XAotfSB3aGlsZSAoMCkKLQotICBaUl8oc3RhcnRfLCBlbmRfKTsKLQotI3VuZGVmIFpSX0hFTFBFUl8KLSN1bmRlZiBaUl8KLQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKLSAgZm9yICg7OykgewotICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA4KSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmc3RhcnRfKSkpOwotICAgICAgICAgIHNldF9oYXNfc3RhcnQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9lbmQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTYpIHsKLSAgICAgICAgIHBhcnNlX2VuZDoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZlbmRfKSkpOwotICAgICAgICAgIHNldF9oYXNfZW5kKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bnVzdWFsOgotICAgICAgICBpZiAodGFnID09IDAgfHwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgZ290byBzdWNjZXNzOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLXN1Y2Nlc3M6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gIGlmIChoYXNfc3RhcnQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPnN0YXJ0KCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOwotICBpZiAoaGFzX2VuZCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+ZW5kKCksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gIGlmIChoYXNfc3RhcnQoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgxLCB0aGlzLT5zdGFydCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLSAgaWYgKGhhc19lbmQoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5lbmQoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgM3UpIHsKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gICAgaWYgKGhhc19zdGFydCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPnN0YXJ0KCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7Ci0gICAgaWYgKGhhc19lbmQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5lbmQoKSk7Ci0gICAgfQotCi0gIH0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpNZXJnZUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX3N0YXJ0KCkpIHsKLSAgICAgIHNldF9zdGFydChmcm9tLnN0YXJ0KCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfZW5kKCkpIHsKLSAgICAgIHNldF9lbmQoZnJvbS5lbmQoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6U3dhcChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6SW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogb3RoZXIpIHsKLSAgc3RkOjpzd2FwKHN0YXJ0Xywgb3RoZXItPnN0YXJ0Xyk7Ci0gIHN0ZDo6c3dhcChlbmRfLCBvdGhlci0+ZW5kXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6a1N0YXJ0RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmtFbmRGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLQotRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCi0gICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBzdGFydF8gPSAwOwotICBlbmRfID0gMDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6On5EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLURlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogbiA9IG5ldyBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcHVzaCIpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCi0gIF9fYnVpbHRpbl9vZmZzZXRvZihEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgZikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCi0jZWxzZQotI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKLSAgJnJlaW50ZXJwcmV0X2Nhc3Q8RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqPigxNiktPmYpCi0jZW5kaWYKLQotI2RlZmluZSBaUl8oZmlyc3QsIGxhc3QpIGRvIHtcCi0gIDo6bWVtc2V0KCZmaXJzdCwgMCxcCi0gICAgICAgICAgIFpSX0hFTFBFUl8obGFzdCkgLSBaUl9IRUxQRVJfKGZpcnN0KSArIHNpemVvZihsYXN0KSk7XAotfSB3aGlsZSAoMCkKLQotICBaUl8oc3RhcnRfLCBlbmRfKTsKLQotI3VuZGVmIFpSX0hFTFBFUl8KLSN1bmRlZiBaUl8KLQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gOCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnN0YXJ0XykpKTsKLSAgICAgICAgICBzZXRfaGFzX3N0YXJ0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfZW5kOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE2KSB7Ci0gICAgICAgICBwYXJzZV9lbmQ6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmZW5kXykpKTsKLSAgICAgICAgICBzZXRfaGFzX2VuZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQotICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gIGlmIChoYXNfc3RhcnQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDEsIHRoaXMtPnN0YXJ0KCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOwotICBpZiAoaGFzX2VuZCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+ZW5kKCksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQotICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gIGlmIChoYXNfc3RhcnQoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgxLCB0aGlzLT5zdGFydCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLSAgaWYgKGhhc19lbmQoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgyLCB0aGlzLT5lbmQoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgM3UpIHsKLSAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gICAgaWYgKGhhc19zdGFydCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPnN0YXJ0KCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7Ci0gICAgaWYgKGhhc19lbmQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5lbmQoKSk7Ci0gICAgfQotCi0gIH0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Ok1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX3N0YXJ0KCkpIHsKLSAgICAgIHNldF9zdGFydChmcm9tLnN0YXJ0KCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfZW5kKCkpIHsKLSAgICAgIHNldF9lbmQoZnJvbS5lbmQoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpTd2FwKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBvdGhlcikgewotICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBJbnRlcm5hbFN3YXAob3RoZXIpOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6SW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBvdGhlcikgewotICBzdGQ6OnN3YXAoc3RhcnRfLCBvdGhlci0+c3RhcnRfKTsKLSAgc3RkOjpzd2FwKGVuZF8sIG90aGVyLT5lbmRfKTsKLSAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Ci0gIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtGaWVsZEZpZWxkTnVtYmVyOwotY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvbkZpZWxkTnVtYmVyOwotY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprT25lb2ZEZWNsRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOwotY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a1Jlc2VydmVkUmFuZ2VGaWVsZE51bWJlcjsKLWNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtSZXNlcnZlZE5hbWVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLQotRGVzY3JpcHRvclByb3RvOjpEZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLSAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLURlc2NyaXB0b3JQcm90bzo6RGVzY3JpcHRvclByb3RvKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbmFtZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBvcHRpb25zXyA9IE5VTEw7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLURlc2NyaXB0b3JQcm90bzo6fkRlc2NyaXB0b3JQcm90bygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKLSAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgICBkZWxldGUgb3B0aW9uc187Ci0gIH0KLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBEZXNjcmlwdG9yUHJvdG8qIG4gPSBuZXcgRGVzY3JpcHRvclByb3RvOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obik7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAxMjl1KSB7Ci0gICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gICAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICAgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9uczo6Q2xlYXIoKTsKLSAgICB9Ci0gIH0KLSAgZmllbGRfLkNsZWFyKCk7Ci0gIGV4dGVuc2lvbl8uQ2xlYXIoKTsKLSAgbmVzdGVkX3R5cGVfLkNsZWFyKCk7Ci0gIGVudW1fdHlwZV8uQ2xlYXIoKTsKLSAgZXh0ZW5zaW9uX3JhbmdlXy5DbGVhcigpOwotICBvbmVvZl9kZWNsXy5DbGVhcigpOwotICByZXNlcnZlZF9yYW5nZV8uQ2xlYXIoKTsKLSAgcmVzZXJ2ZWRfbmFtZV8uQ2xlYXIoKTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotICB9Ci19Ci0KLWJvb2wgRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9maWVsZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTgpIHsKLSAgICAgICAgIHBhcnNlX2ZpZWxkOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX2ZpZWxkOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZmllbGQoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2xvb3BfZmllbGQ7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9sb29wX25lc3RlZF90eXBlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAodGFnID09IDI2KSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfbmVzdGVkX3R5cGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9uZXN0ZWRfdHlwZSgpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfbG9vcF9uZXN0ZWRfdHlwZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX2xvb3BfZW51bV90eXBlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OwotICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMzQpIHsKLSAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOwotICAgICAgICAgcGFyc2VfbG9vcF9lbnVtX3R5cGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9lbnVtX3R5cGUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX2xvb3BfZW51bV90eXBlOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MikpIGdvdG8gcGFyc2VfbG9vcF9leHRlbnNpb25fcmFuZ2U7Ci0gICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKLSAgICAgIGNhc2UgNTogewotICAgICAgICBpZiAodGFnID09IDQyKSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfZXh0ZW5zaW9uX3JhbmdlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZXh0ZW5zaW9uX3JhbmdlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9sb29wX2V4dGVuc2lvbl9yYW5nZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNjsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBpZiAodGFnID09IDUwKSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZXh0ZW5zaW9uKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9sb29wX2V4dGVuc2lvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9vcHRpb25zOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKLSAgICAgIGNhc2UgNzogewotICAgICAgICBpZiAodGFnID09IDU4KSB7Ci0gICAgICAgICBwYXJzZV9vcHRpb25zOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDY2KSkgZ290byBwYXJzZV9vbmVvZl9kZWNsOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKLSAgICAgIGNhc2UgODogewotICAgICAgICBpZiAodGFnID09IDY2KSB7Ci0gICAgICAgICBwYXJzZV9vbmVvZl9kZWNsOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX29uZW9mX2RlY2w6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9vbmVvZl9kZWNsKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDY2KSkgZ290byBwYXJzZV9sb29wX29uZW9mX2RlY2w7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc0KSkgZ290byBwYXJzZV9sb29wX3Jlc2VydmVkX3JhbmdlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA5OwotICAgICAgY2FzZSA5OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNzQpIHsKLSAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOwotICAgICAgICAgcGFyc2VfbG9vcF9yZXNlcnZlZF9yYW5nZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3Jlc2VydmVkX3JhbmdlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc0KSkgZ290byBwYXJzZV9sb29wX3Jlc2VydmVkX3JhbmdlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODIpKSBnb3RvIHBhcnNlX3Jlc2VydmVkX25hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOwotICAgICAgY2FzZSAxMDogewotICAgICAgICBpZiAodGFnID09IDgyKSB7Ci0gICAgICAgICBwYXJzZV9yZXNlcnZlZF9uYW1lOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+YWRkX3Jlc2VydmVkX25hbWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+cmVzZXJ2ZWRfbmFtZSh0aGlzLT5yZXNlcnZlZF9uYW1lX3NpemUoKSAtIDEpLmRhdGEoKSwKLSAgICAgICAgICAgIHRoaXMtPnJlc2VydmVkX25hbWUodGhpcy0+cmVzZXJ2ZWRfbmFtZV9zaXplKCkgLSAxKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODIpKSBnb3RvIHBhcnNlX3Jlc2VydmVkX25hbWU7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKLSAgcmV0dXJuIHRydWU7Ci1mYWlsdXJlOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5maWVsZF9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMiwgdGhpcy0+ZmllbGQoaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDMsIHRoaXMtPm5lc3RlZF90eXBlKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZW51bV90eXBlX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA0LCB0aGlzLT5lbnVtX3R5cGUoaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSBleHRlbnNpb25fcmFuZ2UgPSA1OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgNSwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgNiwgdGhpcy0+ZXh0ZW5zaW9uKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKLSAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgNywgKnRoaXMtPm9wdGlvbnNfLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5vbmVvZl9kZWNsX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA4LCB0aGlzLT5vbmVvZl9kZWNsKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+cmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDksIHRoaXMtPnJlc2VydmVkX3JhbmdlKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5yZXNlcnZlZF9uYW1lX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5yZXNlcnZlZF9uYW1lKGkpLmRhdGEoKSwgdGhpcy0+cmVzZXJ2ZWRfbmFtZShpKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCi0gICAgICAxMCwgdGhpcy0+cmVzZXJ2ZWRfbmFtZShpKSwgb3V0cHV0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZmllbGRfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMiwgdGhpcy0+ZmllbGQoaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMywgdGhpcy0+bmVzdGVkX3R5cGUoaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgNCwgdGhpcy0+ZW51bV90eXBlKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgNSwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICA2LCB0aGlzLT5leHRlbnNpb24oaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDcsICp0aGlzLT5vcHRpb25zXywgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+b25lb2ZfZGVjbF9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICA4LCB0aGlzLT5vbmVvZl9kZWNsKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+cmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgOSwgdGhpcy0+cmVzZXJ2ZWRfcmFuZ2UoaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnJlc2VydmVkX25hbWVfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPnJlc2VydmVkX25hbWUoaSkuZGF0YSgpLCB0aGlzLT5yZXNlcnZlZF9uYW1lKGkpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSIpOwotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlU3RyaW5nVG9BcnJheSgxMCwgdGhpcy0+cmVzZXJ2ZWRfbmFtZShpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBEZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgMTI5dSkgewotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OwotICAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgICAgKnRoaXMtPm9wdGlvbnNfKTsKLSAgICB9Ci0KLSAgfQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZmllbGRfc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpZWxkX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT5maWVsZChpKSk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT5leHRlbnNpb24oaSkpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5uZXN0ZWRfdHlwZV9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPm5lc3RlZF90eXBlKGkpKTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+ZW51bV90eXBlKGkpKTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT5leHRlbnNpb25fcmFuZ2UoaSkpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+b25lb2ZfZGVjbF9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+b25lb2ZfZGVjbF9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+b25lb2ZfZGVjbChpKSk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gOTsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+cmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnJlc2VydmVkX3JhbmdlX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT5yZXNlcnZlZF9yYW5nZShpKSk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5yZXNlcnZlZF9uYW1lX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5yZXNlcnZlZF9uYW1lX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgIHRoaXMtPnJlc2VydmVkX25hbWUoaSkpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRGVzY3JpcHRvclByb3RvPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBmaWVsZF8uTWVyZ2VGcm9tKGZyb20uZmllbGRfKTsKLSAgZXh0ZW5zaW9uXy5NZXJnZUZyb20oZnJvbS5leHRlbnNpb25fKTsKLSAgbmVzdGVkX3R5cGVfLk1lcmdlRnJvbShmcm9tLm5lc3RlZF90eXBlXyk7Ci0gIGVudW1fdHlwZV8uTWVyZ2VGcm9tKGZyb20uZW51bV90eXBlXyk7Ci0gIGV4dGVuc2lvbl9yYW5nZV8uTWVyZ2VGcm9tKGZyb20uZXh0ZW5zaW9uX3JhbmdlXyk7Ci0gIG9uZW9mX2RlY2xfLk1lcmdlRnJvbShmcm9tLm9uZW9mX2RlY2xfKTsKLSAgcmVzZXJ2ZWRfcmFuZ2VfLk1lcmdlRnJvbShmcm9tLnJlc2VydmVkX3JhbmdlXyk7Ci0gIHJlc2VydmVkX25hbWVfLk1lcmdlRnJvbShmcm9tLnJlc2VydmVkX25hbWVfKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKLSAgICAgIHNldF9oYXNfbmFtZSgpOwotICAgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgewotICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+ZmllbGQoKSkpIHJldHVybiBmYWxzZTsKLSAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT5leHRlbnNpb24oKSkpIHJldHVybiBmYWxzZTsKLSAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT5uZXN0ZWRfdHlwZSgpKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPmVudW1fdHlwZSgpKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIGlmICghdGhpcy0+b3B0aW9uc18tPklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIERlc2NyaXB0b3JQcm90bzo6U3dhcChEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKLSAgbmFtZV8uU3dhcCgmb3RoZXItPm5hbWVfKTsKLSAgZmllbGRfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmZpZWxkXyk7Ci0gIGV4dGVuc2lvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZXh0ZW5zaW9uXyk7Ci0gIG5lc3RlZF90eXBlXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5uZXN0ZWRfdHlwZV8pOwotICBlbnVtX3R5cGVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmVudW1fdHlwZV8pOwotICBleHRlbnNpb25fcmFuZ2VfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmV4dGVuc2lvbl9yYW5nZV8pOwotICBvbmVvZl9kZWNsXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5vbmVvZl9kZWNsXyk7Ci0gIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKLSAgcmVzZXJ2ZWRfcmFuZ2VfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnJlc2VydmVkX3JhbmdlXyk7Ci0gIHJlc2VydmVkX25hbWVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnJlc2VydmVkX25hbWVfKTsKLSAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Ci0gIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotLy8gRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlCi0KLS8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKLWJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpoYXNfc3RhcnQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9oYXNfc3RhcnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfaGFzX3N0YXJ0KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpjbGVhcl9zdGFydCgpIHsKLSAgc3RhcnRfID0gMDsKLSAgY2xlYXJfaGFzX3N0YXJ0KCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnN0YXJ0KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2Uuc3RhcnQpCi0gIHJldHVybiBzdGFydF87Ci19Ci0gdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9zdGFydCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHNldF9oYXNfc3RhcnQoKTsKLSAgc3RhcnRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5zdGFydCkKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLWJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpoYXNfZW5kKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzZXRfaGFzX2VuZCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpjbGVhcl9oYXNfZW5kKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpjbGVhcl9lbmQoKSB7Ci0gIGVuZF8gPSAwOwotICBjbGVhcl9oYXNfZW5kKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmVuZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLmVuZCkKLSAgcmV0dXJuIGVuZF87Ci19Ci0gdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzZXRfaGFzX2VuZCgpOwotICBlbmRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5lbmQpCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UKLQotLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOwotYm9vbCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6aGFzX3N0YXJ0KCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnNldF9oYXNfc3RhcnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpjbGVhcl9oYXNfc3RhcnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Y2xlYXJfc3RhcnQoKSB7Ci0gIHN0YXJ0XyA9IDA7Ci0gIGNsZWFyX2hhc19zdGFydCgpOwotfQotIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnN0YXJ0KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5zdGFydCkKLSAgcmV0dXJuIHN0YXJ0XzsKLX0KLSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzZXRfc3RhcnQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzZXRfaGFzX3N0YXJ0KCk7Ci0gIHN0YXJ0XyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5zdGFydCkKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLWJvb2wgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Omhhc19lbmQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6c2V0X2hhc19lbmQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpjbGVhcl9oYXNfZW5kKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmNsZWFyX2VuZCgpIHsKLSAgZW5kXyA9IDA7Ci0gIGNsZWFyX2hhc19lbmQoKTsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjplbmQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlLmVuZCkKLSAgcmV0dXJuIGVuZF87Ci19Ci0gdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6c2V0X2VuZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHNldF9oYXNfZW5kKCk7Ci0gIGVuZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UuZW5kKQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIERlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1ib29sIERlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbmFtZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIERlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQotICBjbGVhcl9oYXNfbmFtZSgpOwotICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOwotaW50IERlc2NyaXB0b3JQcm90bzo6ZmllbGRfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGZpZWxkXy5zaXplKCk7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZmllbGQoKSB7Ci0gIGZpZWxkXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQotICByZXR1cm4gZmllbGRfLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZmllbGQoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCi0gIHJldHVybiBmaWVsZF8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9maWVsZCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQotICByZXR1cm4gZmllbGRfLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZmllbGQoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5maWVsZCkKLSAgcmV0dXJuICZmaWVsZF87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKLURlc2NyaXB0b3JQcm90bzo6ZmllbGQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCi0gIHJldHVybiBmaWVsZF87Ci19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNjsKLWludCBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgewotICByZXR1cm4gZXh0ZW5zaW9uXy5zaXplKCk7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5zaW9uKCkgewotICBleHRlbnNpb25fLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKLSAgcmV0dXJuIGV4dGVuc2lvbl8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb24oaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQotICByZXR1cm4gZXh0ZW5zaW9uXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKLSAgcmV0dXJuIGV4dGVuc2lvbl8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKLURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiAmZXh0ZW5zaW9uXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgotRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQotICByZXR1cm4gZXh0ZW5zaW9uXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOwotaW50IERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5lc3RlZF90eXBlXy5zaXplKCk7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmVzdGVkX3R5cGUoKSB7Ci0gIG5lc3RlZF90eXBlXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKLSAgcmV0dXJuIG5lc3RlZF90eXBlXy5HZXQoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uZXN0ZWRfdHlwZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKLSAgcmV0dXJuIG5lc3RlZF90eXBlXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9uZXN0ZWRfdHlwZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5lc3RlZF90eXBlKQotICByZXR1cm4gbmVzdGVkX3R5cGVfLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+KgotRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25lc3RlZF90eXBlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCi0gIHJldHVybiAmbmVzdGVkX3R5cGVfOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgotRGVzY3JpcHRvclByb3RvOjpuZXN0ZWRfdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKLSAgcmV0dXJuIG5lc3RlZF90eXBlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7Ci1pbnQgRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGVudW1fdHlwZV8uc2l6ZSgpOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2VudW1fdHlwZSgpIHsKLSAgZW51bV90eXBlXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKLSAgcmV0dXJuIGVudW1fdHlwZV8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiBlbnVtX3R5cGVfLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9lbnVtX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiBlbnVtX3R5cGVfLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPioKLURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiAmZW51bV90eXBlXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCi1EZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiBlbnVtX3R5cGVfOwotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSBleHRlbnNpb25fcmFuZ2UgPSA1OwotaW50IERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBleHRlbnNpb25fcmFuZ2VfLnNpemUoKTsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9leHRlbnNpb25fcmFuZ2UoKSB7Ci0gIGV4dGVuc2lvbl9yYW5nZV8uQ2xlYXIoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZSkKLSAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZSkKLSAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogRGVzY3JpcHRvclByb3RvOjphZGRfZXh0ZW5zaW9uX3JhbmdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQotICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXy5BZGQoKTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPioKLURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCi0gIHJldHVybiAmZXh0ZW5zaW9uX3JhbmdlXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPiYKLURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3JhbmdlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZSkKLSAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV87Ci19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7Ci1pbnQgRGVzY3JpcHRvclByb3RvOjpvbmVvZl9kZWNsX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBvbmVvZl9kZWNsXy5zaXplKCk7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb25lb2ZfZGVjbCgpIHsKLSAgb25lb2ZfZGVjbF8uQ2xlYXIoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6b25lb2ZfZGVjbChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCi0gIHJldHVybiBvbmVvZl9kZWNsXy5HZXQoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29uZW9mX2RlY2woaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKLSAgcmV0dXJuIG9uZW9mX2RlY2xfLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfb25lb2ZfZGVjbCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCi0gIHJldHVybiBvbmVvZl9kZWNsXy5BZGQoKTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+KgotRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29uZW9mX2RlY2woKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQotICByZXR1cm4gJm9uZW9mX2RlY2xfOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvID4mCi1EZXNjcmlwdG9yUHJvdG86Om9uZW9mX2RlY2woKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKLSAgcmV0dXJuIG9uZW9mX2RlY2xfOwotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OwotYm9vbCBEZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKLX0KLXZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7Ci19Ci12b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwODB1OwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7Ci0gIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9uczo6Q2xlYXIoKTsKLSAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMmIERlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgewotICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOwotICBvcHRpb25zXyA9IE5VTEw7Ci0gIHJldHVybiB0ZW1wOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vcHRpb25zKQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gOTsKLWludCBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX3JhbmdlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiByZXNlcnZlZF9yYW5nZV8uc2l6ZSgpOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3Jlc2VydmVkX3JhbmdlKCkgewotICByZXNlcnZlZF9yYW5nZV8uQ2xlYXIoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIERlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfcmFuZ2UoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKLSAgcmV0dXJuIHJlc2VydmVkX3JhbmdlXy5HZXQoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX3JhbmdlKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQotICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2VfLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfcmFuZ2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKLSAgcmV0dXJuIHJlc2VydmVkX3JhbmdlXy5BZGQoKTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSA+KgotRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX3JhbmdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCi0gIHJldHVybiAmcmVzZXJ2ZWRfcmFuZ2VfOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlID4mCi1EZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX3JhbmdlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQotICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2VfOwotfQotCi0vLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOwotaW50IERlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfbmFtZV9zaXplKCkgY29uc3QgewotICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV8uc2l6ZSgpOwotfQotdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3Jlc2VydmVkX25hbWUoKSB7Ci0gIHJlc2VydmVkX25hbWVfLkNsZWFyKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9uYW1lKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKLSAgcmV0dXJuIHJlc2VydmVkX25hbWVfLkdldChpbmRleCk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX25hbWUoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKLSAgcmV0dXJuIHJlc2VydmVkX25hbWVfLk11dGFibGUoaW5kZXgpOwotfQotIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotICByZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgewotICByZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKLX0KLSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgcmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCi0gIHJldHVybiByZXNlcnZlZF9uYW1lXy5BZGQoKTsKLX0KLSB2b2lkIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgcmVzZXJ2ZWRfbmFtZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotfQotIHZvaWQgRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICByZXNlcnZlZF9uYW1lXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKLX0KLSB2b2lkIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHJlc2VydmVkX25hbWVfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKLX0KLSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgotRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9uYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCi0gIHJldHVybiByZXNlcnZlZF9uYW1lXzsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgotRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX25hbWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotICByZXR1cm4gJnJlc2VydmVkX25hbWVfOwotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3JfOwotfQotYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgIGNhc2UgNDoKLSAgICBjYXNlIDU6Ci0gICAgY2FzZSA2OgotICAgIGNhc2UgNzoKLSAgICBjYXNlIDg6Ci0gICAgY2FzZSA5OgotICAgIGNhc2UgMTA6Ci0gICAgY2FzZSAxMToKLSAgICBjYXNlIDEyOgotICAgIGNhc2UgMTM6Ci0gICAgY2FzZSAxNDoKLSAgICBjYXNlIDE1OgotICAgIGNhc2UgMTY6Ci0gICAgY2FzZSAxNzoKLSAgICBjYXNlIDE4OgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRE9VQkxFOwotY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9GTE9BVDsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UNjQ7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1VJTlQ2NDsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzI7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVENjQ7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZJWEVEMzI7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JPT0w7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORzsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVA7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0U7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTOwotY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9VSU5UMzI7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0VOVU07Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NGSVhFRDMyOwotY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TRklYRUQ2NDsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU0lOVDMyOwotY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TSU5UNjQ7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlX01JTjsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGVfTUFYOwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlX0FSUkFZU0laRTsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcl87Ci19Ci1ib29sIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTDsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRDsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRDsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9NSU47Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfTUFYOwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbF9BUlJBWVNJWkU7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a051bWJlckZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprTGFiZWxGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVOYW1lRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtFeHRlbmRlZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprRGVmYXVsdFZhbHVlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtPbmVvZkluZGV4RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtKc29uTmFtZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1GaWVsZERlc2NyaXB0b3JQcm90bzo6RmllbGREZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci0gIG9wdGlvbnNfID0gY29uc3RfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqPigmOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLUZpZWxkRGVzY3JpcHRvclByb3RvOjpGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKLX0KLQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIG5hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgbnVtYmVyXyA9IDA7Ci0gIGxhYmVsXyA9IDE7Ci0gIHR5cGVfID0gMTsKLSAgdHlwZV9uYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGV4dGVuZGVlXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGRlZmF1bHRfdmFsdWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgb25lb2ZfaW5kZXhfID0gMDsKLSAganNvbl9uYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotRmllbGREZXNjcmlwdG9yUHJvdG86On5GaWVsZERlc2NyaXB0b3JQcm90bygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7Ci0gIG5hbWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIHR5cGVfbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgZXh0ZW5kZWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGRlZmF1bHRfdmFsdWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGpzb25fbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgICBkZWxldGUgb3B0aW9uc187Ci0gIH0KLX0KLQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLUZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1GaWVsZERlc2NyaXB0b3JQcm90byogRmllbGREZXNjcmlwdG9yUHJvdG86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBGaWVsZERlc2NyaXB0b3JQcm90byogbiA9IG5ldyBGaWVsZERlc2NyaXB0b3JQcm90bzsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDI1NXUpIHsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBudW1iZXJfID0gMDsKLSAgICBsYWJlbF8gPSAxOwotICAgIHR5cGVfID0gMTsKLSAgICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7Ci0gICAgICB0eXBlX25hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gICAgaWYgKGhhc19leHRlbmRlZSgpKSB7Ci0gICAgICBleHRlbmRlZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUoKSkgewotICAgICAgZGVmYXVsdF92YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBvbmVvZl9pbmRleF8gPSAwOwotICB9Ci0gIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiA3Njh1KSB7Ci0gICAgaWYgKGhhc19qc29uX25hbWUoKSkgewotICAgICAganNvbl9uYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOjpDbGVhcigpOwotICAgIH0KLSAgfQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2V4dGVuZGVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE4KSB7Ci0gICAgICAgICBwYXJzZV9leHRlbmRlZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfZXh0ZW5kZWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+ZXh0ZW5kZWUoKS5kYXRhKCksIHRoaXMtPmV4dGVuZGVlKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9udW1iZXI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOwotICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMjQpIHsKLSAgICAgICAgIHBhcnNlX251bWJlcjoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZudW1iZXJfKSkpOwotICAgICAgICAgIHNldF9oYXNfbnVtYmVyKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzMikpIGdvdG8gcGFyc2VfbGFiZWw7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKLSAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAodGFnID09IDMyKSB7Ci0gICAgICAgICBwYXJzZV9sYWJlbDoKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQodmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRfbGFiZWwoc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgPih2YWx1ZSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCg0LCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDApKSBnb3RvIHBhcnNlX3R5cGU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7Ci0gICAgICBjYXNlIDU6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA0MCkgewotICAgICAgICAgcGFyc2VfdHlwZToKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZCh2YWx1ZSkpIHsKLSAgICAgICAgICAgIHNldF90eXBlKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgPih2YWx1ZSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCg1LCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX3R5cGVfbmFtZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OwotICAgICAgY2FzZSA2OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNTApIHsKLSAgICAgICAgIHBhcnNlX3R5cGVfbmFtZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfdHlwZV9uYW1lKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPnR5cGVfbmFtZSgpLmRhdGEoKSwgdGhpcy0+dHlwZV9uYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1OCkpIGdvdG8gcGFyc2VfZGVmYXVsdF92YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKLSAgICAgIGNhc2UgNzogewotICAgICAgICBpZiAodGFnID09IDU4KSB7Ci0gICAgICAgICBwYXJzZV9kZWZhdWx0X3ZhbHVlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPmRlZmF1bHRfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmRlZmF1bHRfdmFsdWUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg2NikpIGdvdG8gcGFyc2Vfb3B0aW9uczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwotICAgICAgY2FzZSA4OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNjYpIHsKLSAgICAgICAgIHBhcnNlX29wdGlvbnM6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKLSAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzIpKSBnb3RvIHBhcnNlX29uZW9mX2luZGV4OwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OwotICAgICAgY2FzZSA5OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNzIpIHsKLSAgICAgICAgIHBhcnNlX29uZW9mX2luZGV4OgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJm9uZW9mX2luZGV4XykpKTsKLSAgICAgICAgICBzZXRfaGFzX29uZW9mX2luZGV4KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MikpIGdvdG8gcGFyc2VfanNvbl9uYW1lOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGpzb25fbmFtZSA9IDEwOwotICAgICAgY2FzZSAxMDogewotICAgICAgICBpZiAodGFnID09IDgyKSB7Ci0gICAgICAgICBwYXJzZV9qc29uX25hbWU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2pzb25fbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5qc29uX25hbWUoKS5kYXRhKCksIHRoaXMtPmpzb25fbmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOwotICBpZiAoaGFzX2V4dGVuZGVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmV4dGVuZGVlKCkuZGF0YSgpLCB0aGlzLT5leHRlbmRlZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDIsIHRoaXMtPmV4dGVuZGVlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOwotICBpZiAoaGFzX251bWJlcigpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMywgdGhpcy0+bnVtYmVyKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKLSAgaWYgKGhhc19sYWJlbCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDQsIHRoaXMtPmxhYmVsKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7Ci0gIGlmIChoYXNfdHlwZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDUsIHRoaXMtPnR5cGUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OwotICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT50eXBlX25hbWUoKS5kYXRhKCksIHRoaXMtPnR5cGVfbmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICA2LCB0aGlzLT50eXBlX25hbWUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKLSAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmRlZmF1bHRfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmRlZmF1bHRfdmFsdWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDcsIHRoaXMtPmRlZmF1bHRfdmFsdWUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA4LCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBpbnQzMiBvbmVvZl9pbmRleCA9IDk7Ci0gIGlmIChoYXNfb25lb2ZfaW5kZXgoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDksIHRoaXMtPm9uZW9mX2luZGV4KCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7Ci0gIGlmIChoYXNfanNvbl9uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmpzb25fbmFtZSgpLmRhdGEoKSwgdGhpcy0+anNvbl9uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDEwLCB0aGlzLT5qc29uX25hbWUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAxLCB0aGlzLT5uYW1lKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOwotICBpZiAoaGFzX2V4dGVuZGVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmV4dGVuZGVlKCkuZGF0YSgpLCB0aGlzLT5leHRlbmRlZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5leHRlbmRlZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKLSAgaWYgKGhhc19udW1iZXIoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgzLCB0aGlzLT5udW1iZXIoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OwotICBpZiAoaGFzX2xhYmVsKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDQsIHRoaXMtPmxhYmVsKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7Ci0gIGlmIChoYXNfdHlwZSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCi0gICAgICA1LCB0aGlzLT50eXBlKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKLSAgaWYgKGhhc190eXBlX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+dHlwZV9uYW1lKCkuZGF0YSgpLCB0aGlzLT50eXBlX25hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lIik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDYsIHRoaXMtPnR5cGVfbmFtZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OwotICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlIik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDcsIHRoaXMtPmRlZmF1bHRfdmFsdWUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDgsICp0aGlzLT5vcHRpb25zXywgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKLSAgaWYgKGhhc19vbmVvZl9pbmRleCgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDksIHRoaXMtPm9uZW9mX2luZGV4KCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7Ci0gIGlmIChoYXNfanNvbl9uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmpzb25fbmFtZSgpLmRhdGEoKSwgdGhpcy0+anNvbl9uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAxMCwgdGhpcy0+anNvbl9uYW1lKCksIHRhcmdldCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDI1NXUpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKLSAgICBpZiAoaGFzX251bWJlcigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPm51bWJlcigpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKLSAgICBpZiAoaGFzX2xhYmVsKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5sYWJlbCgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7Ci0gICAgaWYgKGhhc190eXBlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT50eXBlKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OwotICAgIGlmIChoYXNfdHlwZV9uYW1lKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPnR5cGVfbmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOwotICAgIGlmIChoYXNfZXh0ZW5kZWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+ZXh0ZW5kZWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OwotICAgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5kZWZhdWx0X3ZhbHVlKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKLSAgICBpZiAoaGFzX29uZW9mX2luZGV4KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+b25lb2ZfaW5kZXgoKSk7Ci0gICAgfQotCi0gIH0KLSAgaWYgKF9oYXNfYml0c19bOCAvIDMyXSAmIDc2OHUpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7Ci0gICAgaWYgKGhhc19qc29uX25hbWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+anNvbl9uYW1lKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwotICAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgICAgKnRoaXMtPm9wdGlvbnNfKTsKLSAgICB9Ci0KLSAgfQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90bz4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7Ci0gICAgICBzZXRfaGFzX25hbWUoKTsKLSAgICAgIG5hbWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5uYW1lXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19udW1iZXIoKSkgewotICAgICAgc2V0X251bWJlcihmcm9tLm51bWJlcigpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2xhYmVsKCkpIHsKLSAgICAgIHNldF9sYWJlbChmcm9tLmxhYmVsKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfdHlwZSgpKSB7Ci0gICAgICBzZXRfdHlwZShmcm9tLnR5cGUoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc190eXBlX25hbWUoKSkgewotICAgICAgc2V0X2hhc190eXBlX25hbWUoKTsKLSAgICAgIHR5cGVfbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnR5cGVfbmFtZV8pOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfZXh0ZW5kZWUoKSkgewotICAgICAgc2V0X2hhc19leHRlbmRlZSgpOwotICAgICAgZXh0ZW5kZWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5leHRlbmRlZV8pOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7Ci0gICAgICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgICAgIGRlZmF1bHRfdmFsdWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5kZWZhdWx0X3ZhbHVlXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19vbmVvZl9pbmRleCgpKSB7Ci0gICAgICBzZXRfb25lb2ZfaW5kZXgoZnJvbS5vbmVvZl9pbmRleCgpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGZyb20uX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19qc29uX25hbWUoKSkgewotICAgICAgc2V0X2hhc19qc29uX25hbWUoKTsKLSAgICAgIGpzb25fbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmpzb25fbmFtZV8pOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfb3B0aW9ucygpKSB7Ci0gICAgICBtdXRhYmxlX29wdGlvbnMoKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgaWYgKCF0aGlzLT5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OlN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIG5hbWVfLlN3YXAoJm90aGVyLT5uYW1lXyk7Ci0gIHN0ZDo6c3dhcChudW1iZXJfLCBvdGhlci0+bnVtYmVyXyk7Ci0gIHN0ZDo6c3dhcChsYWJlbF8sIG90aGVyLT5sYWJlbF8pOwotICBzdGQ6OnN3YXAodHlwZV8sIG90aGVyLT50eXBlXyk7Ci0gIHR5cGVfbmFtZV8uU3dhcCgmb3RoZXItPnR5cGVfbmFtZV8pOwotICBleHRlbmRlZV8uU3dhcCgmb3RoZXItPmV4dGVuZGVlXyk7Ci0gIGRlZmF1bHRfdmFsdWVfLlN3YXAoJm90aGVyLT5kZWZhdWx0X3ZhbHVlXyk7Ci0gIHN0ZDo6c3dhcChvbmVvZl9pbmRleF8sIG90aGVyLT5vbmVvZl9pbmRleF8pOwotICBqc29uX25hbWVfLlN3YXAoJm90aGVyLT5qc29uX25hbWVfKTsKLSAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWVsZERlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBGaWVsZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0jaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBGaWVsZERlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1ib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgewotICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19uYW1lKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIGNsZWFyX2hhc19uYW1lKCk7Ci0gIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfbmFtZSgpOwotICB9Ci0gIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7Ci1ib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfbnVtYmVyKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbnVtYmVyKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX251bWJlcigpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9udW1iZXIoKSB7Ci0gIG51bWJlcl8gPSAwOwotICBjbGVhcl9oYXNfbnVtYmVyKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5udW1iZXIpCi0gIHJldHVybiBudW1iZXJfOwotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzZXRfaGFzX251bWJlcigpOwotICBudW1iZXJfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm51bWJlcikKLX0KLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7Ci1ib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfbGFiZWwoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19sYWJlbCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19sYWJlbCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9sYWJlbCgpIHsKLSAgbGFiZWxfID0gMTsKLSAgY2xlYXJfaGFzX2xhYmVsKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6bGFiZWwoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmxhYmVsKQotICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgPihsYWJlbF8pOwotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9sYWJlbCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIHZhbHVlKSB7Ci0gIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQodmFsdWUpKTsKLSAgc2V0X2hhc19sYWJlbCgpOwotICBsYWJlbF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubGFiZWwpCi19Ci0KLS8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKLWJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc190eXBlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfdHlwZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc190eXBlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX3R5cGUoKSB7Ci0gIHR5cGVfID0gMTsKLSAgY2xlYXJfaGFzX3R5cGUoKTsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OnR5cGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGUpCi0gIHJldHVybiBzdGF0aWNfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlID4odHlwZV8pOwotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB2YWx1ZSkgewotICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQodmFsdWUpKTsKLSAgc2V0X2hhc190eXBlKCk7Ci0gIHR5cGVfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGUpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyB0eXBlX25hbWUgPSA2OwotYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX3R5cGVfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3R5cGVfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc190eXBlX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OwotfQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfdHlwZV9uYW1lKCkgewotICB0eXBlX25hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjp0eXBlX25hbWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKLSAgcmV0dXJuIHR5cGVfbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlX25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc190eXBlX25hbWUoKTsKLSAgdHlwZV9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCi19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX3R5cGVfbmFtZSgpOwotICB0eXBlX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfdHlwZV9uYW1lKCk7Ci0gIHR5cGVfbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKLX0KLSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV90eXBlX25hbWUoKSB7Ci0gIHNldF9oYXNfdHlwZV9uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCi0gIHJldHVybiB0eXBlX25hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfdHlwZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQotICBjbGVhcl9oYXNfdHlwZV9uYW1lKCk7Ci0gIHJldHVybiB0eXBlX25hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF90eXBlX25hbWUoOjpzdGQ6OnN0cmluZyogdHlwZV9uYW1lKSB7Ci0gIGlmICh0eXBlX25hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfdHlwZV9uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOwotICB9Ci0gIHR5cGVfbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHR5cGVfbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7Ci1ib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfZXh0ZW5kZWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOwotfQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19leHRlbmRlZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19leHRlbmRlZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9leHRlbmRlZSgpIHsKLSAgZXh0ZW5kZWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2V4dGVuZGVlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86OmV4dGVuZGVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKLSAgcmV0dXJuIGV4dGVuZGVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2V4dGVuZGVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfZXh0ZW5kZWUoKTsKLSAgZXh0ZW5kZWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlKQotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9leHRlbmRlZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2V4dGVuZGVlKCk7Ci0gIGV4dGVuZGVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlKQotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9leHRlbmRlZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19leHRlbmRlZSgpOwotICBleHRlbmRlZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlKQotfQotIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuZGVlKCkgewotICBzZXRfaGFzX2V4dGVuZGVlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKLSAgcmV0dXJuIGV4dGVuZGVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2V4dGVuZGVlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCi0gIGNsZWFyX2hhc19leHRlbmRlZSgpOwotICByZXR1cm4gZXh0ZW5kZWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9leHRlbmRlZSg6OnN0ZDo6c3RyaW5nKiBleHRlbmRlZSkgewotICBpZiAoZXh0ZW5kZWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfZXh0ZW5kZWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKLSAgfQotICBleHRlbmRlZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGV4dGVuZGVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7Ci1ib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA0MHUpICE9IDA7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9kZWZhdWx0X3ZhbHVlKCkgewotICBkZWZhdWx0X3ZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfdmFsdWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCi0gIHJldHVybiBkZWZhdWx0X3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIGRlZmF1bHRfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCi19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIGRlZmF1bHRfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKLX0KLSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZGVmYXVsdF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIGRlZmF1bHRfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQotfQotIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlZmF1bHRfdmFsdWUoKSB7Ci0gIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKLSAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfZGVmYXVsdF92YWx1ZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCi0gIGNsZWFyX2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIHJldHVybiBkZWZhdWx0X3ZhbHVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfZGVmYXVsdF92YWx1ZSg6OnN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlKSB7Ci0gIGlmIChkZWZhdWx0X3ZhbHVlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpOwotICB9Ci0gIGRlZmF1bHRfdmFsdWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBkZWZhdWx0X3ZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCi19Ci0KLS8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKLWJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19vbmVvZl9pbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29uZW9mX2luZGV4KCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OwotfQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29uZW9mX2luZGV4KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX29uZW9mX2luZGV4KCkgewotICBvbmVvZl9pbmRleF8gPSAwOwotICBjbGVhcl9oYXNfb25lb2ZfaW5kZXgoKTsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEZpZWxkRGVzY3JpcHRvclByb3RvOjpvbmVvZl9pbmRleCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXgpCi0gIHJldHVybiBvbmVvZl9pbmRleF87Ci19Ci0gdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X29uZW9mX2luZGV4KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgc2V0X2hhc19vbmVvZl9pbmRleCgpOwotICBvbmVvZl9pbmRleF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXgpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKLWJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19qc29uX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAxMDB1KSAhPSAwOwotfQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19qc29uX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7Ci19Ci12b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfanNvbl9uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMTAwdTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2pzb25fbmFtZSgpIHsKLSAganNvbl9uYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19qc29uX25hbWUoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6anNvbl9uYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCi0gIHJldHVybiBqc29uX25hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfanNvbl9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfanNvbl9uYW1lKCk7Ci0gIGpzb25fbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9qc29uX25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19qc29uX25hbWUoKTsKLSAganNvbl9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKLX0KLSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfanNvbl9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2pzb25fbmFtZSgpOwotICBqc29uX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCi19Ci0gOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfanNvbl9uYW1lKCkgewotICBzZXRfaGFzX2pzb25fbmFtZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQotICByZXR1cm4ganNvbl9uYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2pzb25fbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKLSAgY2xlYXJfaGFzX2pzb25fbmFtZSgpOwotICByZXR1cm4ganNvbl9uYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfanNvbl9uYW1lKDo6c3RkOjpzdHJpbmcqIGpzb25fbmFtZSkgewotICBpZiAoanNvbl9uYW1lICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2pzb25fbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19qc29uX25hbWUoKTsKLSAgfQotICBqc29uX25hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBqc29uX25hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKLWJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMjAwdSkgIT0gMDsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMjAwdTsKLX0KLXZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7Ci0gIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM6OkNsZWFyKCk7Ci0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyYgRmllbGREZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgewotICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOwotICBvcHRpb25zXyA9IE5VTEw7Ci0gIHJldHVybiB0ZW1wOwotfQotdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLU9uZW9mRGVzY3JpcHRvclByb3RvOjpPbmVvZkRlc2NyaXB0b3JQcm90bygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCi19Ci0KLXZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok9uZW9mRGVzY3JpcHRvclByb3RvKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbmFtZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1PbmVvZkRlc2NyaXB0b3JQcm90bzo6fk9uZW9mRGVzY3JpcHRvclByb3RvKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKLSAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogT25lb2ZEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gT25lb2ZEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotT25lb2ZEZXNjcmlwdG9yUHJvdG8qIE9uZW9mRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLU9uZW9mRGVzY3JpcHRvclByb3RvKiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIE9uZW9mRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IE9uZW9mRGVzY3JpcHRvclByb3RvOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obik7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotICBpZiAoaGFzX25hbWUoKSkgewotICAgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgfQotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogT25lb2ZEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgIHRoaXMtPm5hbWUoKSk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90bz4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7Ci0gICAgICBzZXRfaGFzX25hbWUoKTsKLSAgICAgIG5hbWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5uYW1lXyk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIE9uZW9mRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpTd2FwKE9uZW9mRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBJbnRlcm5hbFN3YXAob3RoZXIpOwotfQotdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKE9uZW9mRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBPbmVvZkRlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gT25lb2ZEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBPbmVvZkRlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0jaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBPbmVvZkRlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1ib29sIE9uZW9mRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci12b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgewotICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19uYW1lKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgT25lb2ZEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIE9uZW9mRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogT25lb2ZEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIGNsZWFyX2hhc19uYW1lKCk7Ci0gIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfbmFtZSgpOwotICB9Ci0gIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBFbnVtRGVzY3JpcHRvclByb3RvOjprVmFsdWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBFbnVtRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1FbnVtRGVzY3JpcHRvclByb3RvOjpFbnVtRGVzY3JpcHRvclByb3RvKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLSAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLUVudW1EZXNjcmlwdG9yUHJvdG86OkVudW1EZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBuYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotRW51bURlc2NyaXB0b3JQcm90bzo6fkVudW1EZXNjcmlwdG9yUHJvdG8oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKLSAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgICBkZWxldGUgb3B0aW9uc187Ci0gIH0KLX0KLQotdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1FbnVtRGVzY3JpcHRvclByb3RvKiBFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUVudW1EZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBFbnVtRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IEVudW1EZXNjcmlwdG9yUHJvdG87Ci0gIGlmIChhcmVuYSAhPSBOVUxMKSB7Ci0gICAgYXJlbmEtPk93bihuKTsKLSAgfQotICByZXR1cm4gbjsKLX0KLQotdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgNXUpIHsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOjpDbGVhcigpOwotICAgIH0KLSAgfQotICB2YWx1ZV8uQ2xlYXIoKTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotICB9Ci19Ci0KLWJvb2wgRW51bURlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKLSAgZm9yICg7OykgewotICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAxMCkgewotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV92YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE4KSB7Ci0gICAgICAgICBwYXJzZV92YWx1ZToKLSAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOwotICAgICAgICAgcGFyc2VfbG9vcF92YWx1ZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3ZhbHVlKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9sb29wX3ZhbHVlOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOwotICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMjYpIHsKLSAgICAgICAgIHBhcnNlX29wdGlvbnM6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKLSAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKLSAgcmV0dXJuIHRydWU7Ci1mYWlsdXJlOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnZhbHVlX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICAyLCB0aGlzLT52YWx1ZShpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci0gIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDMsICp0aGlzLT5vcHRpb25zXywgb3V0cHV0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEVudW1EZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lIik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT52YWx1ZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT52YWx1ZShpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci0gIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMywgKnRoaXMtPm9wdGlvbnNfLCB0YXJnZXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBFbnVtRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA1dSkgewotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOwotICAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgICAgKnRoaXMtPm9wdGlvbnNfKTsKLSAgICB9Ci0KLSAgfQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPnZhbHVlX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52YWx1ZV9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+dmFsdWUoaSkpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRW51bURlc2NyaXB0b3JQcm90bz4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICB2YWx1ZV8uTWVyZ2VGcm9tKGZyb20udmFsdWVfKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKLSAgICAgIHNldF9oYXNfbmFtZSgpOwotICAgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgewotICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+dmFsdWUoKSkpIHJldHVybiBmYWxzZTsKLSAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICBpZiAoIXRoaXMtPm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChFbnVtRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOwotICB2YWx1ZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+dmFsdWVfKTsKLSAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBFbnVtRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRW51bURlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0jaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBFbnVtRGVzY3JpcHRvclByb3RvCi0KLS8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLWJvb2wgRW51bURlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLXZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbmFtZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEVudW1EZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gOjpzdGQ6OnN0cmluZyogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRW51bURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQotICBjbGVhcl9oYXNfbmFtZSgpOwotICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7Ci0gIGlmIChuYW1lICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfbmFtZSgpOwotICB9Ci0gIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOwotaW50IEVudW1EZXNjcmlwdG9yUHJvdG86OnZhbHVlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiB2YWx1ZV8uc2l6ZSgpOwotfQotdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl92YWx1ZSgpIHsKLSAgdmFsdWVfLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUpCi0gIHJldHVybiB2YWx1ZV8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3ZhbHVlKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKLSAgcmV0dXJuIHZhbHVlXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBFbnVtRGVzY3JpcHRvclByb3RvOjphZGRfdmFsdWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUpCi0gIHJldHVybiB2YWx1ZV8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4qCi1FbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3ZhbHVlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQotICByZXR1cm4gJnZhbHVlXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPiYKLUVudW1EZXNjcmlwdG9yUHJvdG86OnZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKLSAgcmV0dXJuIHZhbHVlXzsKLX0KLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKLWJvb2wgRW51bURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Ci19Ci12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKLX0KLXZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKLSAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOjpDbGVhcigpOwotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyYgRW51bURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7Ci0gIHNldF9oYXNfb3B0aW9ucygpOwotICBpZiAob3B0aW9uc18gPT0gTlVMTCkgewotICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiB0ZW1wID0gb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgcmV0dXJuIHRlbXA7Ci19Ci12b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLX0KLQotI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprTnVtYmVyRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotICBvcHRpb25zXyA9IGNvbnN0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLUVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi19Ci0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbmFtZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBudW1iZXJfID0gMDsKLSAgb3B0aW9uc18gPSBOVUxMOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86On5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7Ci0gIG5hbWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gICAgZGVsZXRlIG9wdGlvbnNfOwotICB9Ci19Ci0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLUVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKLSAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgN3UpIHsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBudW1iZXJfID0gMDsKLSAgICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM6OkNsZWFyKCk7Ci0gICAgfQotICB9Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfbnVtYmVyOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE2KSB7Ci0gICAgICAgICBwYXJzZV9udW1iZXI6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmbnVtYmVyXykpKTsKLSAgICAgICAgICBzZXRfaGFzX251bWJlcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAyNikgewotICAgICAgICAgcGFyc2Vfb3B0aW9uczoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfb3B0aW9ucygpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bnVzdWFsOgotICAgICAgICBpZiAodGFnID09IDAgfHwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgZ290byBzdWNjZXNzOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLXN1Y2Nlc3M6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKLSAgaWYgKGhhc19udW1iZXIoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDIsIHRoaXMtPm51bWJlcigpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICAzLCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lIik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7Ci0gIGlmIChoYXNfbnVtYmVyKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMiwgdGhpcy0+bnVtYmVyKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci0gIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMywgKnRoaXMtPm9wdGlvbnNfLCB0YXJnZXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA3dSkgewotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+bmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOwotICAgIGlmIChoYXNfbnVtYmVyKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCi0gICAgICAgICAgdGhpcy0+bnVtYmVyKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKLSAgICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgICp0aGlzLT5vcHRpb25zXyk7Ci0gICAgfQotCi0gIH0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX25hbWUoKSkgewotICAgICAgc2V0X2hhc19uYW1lKCk7Ci0gICAgICBuYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV8pOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfbnVtYmVyKCkpIHsKLSAgICAgIHNldF9udW1iZXIoZnJvbS5udW1iZXIoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKLSAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgaWYgKCF0aGlzLT5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKLSAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKLSAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOwotICBzdGQ6OnN3YXAobnVtYmVyXywgb3RoZXItPm51bWJlcl8pOwotICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1ib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbmFtZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSA6OnN0ZDo6c3RyaW5nKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQotICBjbGVhcl9oYXNfbmFtZSgpOwotICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7Ci1ib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6aGFzX251bWJlcigpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19udW1iZXIoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX251bWJlcigpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbnVtYmVyKCkgewotICBudW1iZXJfID0gMDsKLSAgY2xlYXJfaGFzX251bWJlcigpOwotfQotIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpudW1iZXIoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5udW1iZXIpCi0gIHJldHVybiBudW1iZXJfOwotfQotIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbnVtYmVyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgc2V0X2hhc19udW1iZXIoKTsKLSAgbnVtYmVyXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci1ib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLXZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKLSAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM6OkNsZWFyKCk7Ci0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMmIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7Ci0gIHNldF9oYXNfb3B0aW9ucygpOwotICBpZiAob3B0aW9uc18gPT0gTlVMTCkgewotICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXzsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgcmV0dXJuIHRlbXA7Ci19Ci12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogb3B0aW9ucykgewotICBkZWxldGUgb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gb3B0aW9uczsKLSAgaWYgKG9wdGlvbnMpIHsKLSAgICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLX0KLQotI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtNZXRob2RGaWVsZE51bWJlcjsKLWNvbnN0IGludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1TZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLSAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLVNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBuYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotU2VydmljZURlc2NyaXB0b3JQcm90bzo6flNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKLSAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgICBkZWxldGUgb3B0aW9uc187Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogU2VydmljZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1TZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87Ci0gIGlmIChhcmVuYSAhPSBOVUxMKSB7Ci0gICAgYXJlbmEtPk93bihuKTsKLSAgfQotICByZXR1cm4gbjsKLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgNXUpIHsKLSAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpDbGVhcigpOwotICAgIH0KLSAgfQotICBtZXRob2RfLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfbWV0aG9kOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE4KSB7Ci0gICAgICAgICBwYXJzZV9tZXRob2Q6Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfbWV0aG9kOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbWV0aG9kKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9sb29wX21ldGhvZDsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9vcHRpb25zOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAodGFnID09IDI2KSB7Ci0gICAgICAgICBwYXJzZV9vcHRpb25zOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiBmYWxzZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bWV0aG9kX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICAyLCB0aGlzLT5tZXRob2QoaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICAzLCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAxLCB0aGlzLT5uYW1lKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byBtZXRob2QgPSAyOwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPm1ldGhvZF9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5tZXRob2QoaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDMsICp0aGlzLT5vcHRpb25zXywgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgNXUpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKLSAgICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgICp0aGlzLT5vcHRpb25zXyk7Ci0gICAgfQotCi0gIH0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bWV0aG9kX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXRob2Rfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPm1ldGhvZChpKSk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIG1ldGhvZF8uTWVyZ2VGcm9tKGZyb20ubWV0aG9kXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7Ci0gICAgICBzZXRfaGFzX25hbWUoKTsKLSAgICAgIG5hbWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5uYW1lXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKLSAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpNZXJnZUZyb20oZnJvbS5vcHRpb25zKCkpOwotICAgIH0KLSAgfQotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPm1ldGhvZCgpKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIGlmICghdGhpcy0+b3B0aW9uc18tPklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlN3YXAoU2VydmljZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKLSAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKLSAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLXZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIG5hbWVfLlN3YXAoJm90aGVyLT5uYW1lXyk7Ci0gIG1ldGhvZF8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+bWV0aG9kXyk7Ci0gIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKLSAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Ci0gIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgU2VydmljZURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotLy8gU2VydmljZURlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1ib29sIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLXZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OwotfQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX25hbWUoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgY2xlYXJfaGFzX25hbWUoKTsKLSAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgfQotICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7Ci1pbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBtZXRob2RfLnNpemUoKTsKLX0KLXZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbWV0aG9kKCkgewotICBtZXRob2RfLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byYgU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKLSAgcmV0dXJuIG1ldGhvZF8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21ldGhvZChpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQotICByZXR1cm4gbWV0aG9kXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjphZGRfbWV0aG9kKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKLSAgcmV0dXJuIG1ldGhvZF8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4qCi1TZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21ldGhvZCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5tZXRob2QpCi0gIHJldHVybiAmbWV0aG9kXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiYKLVNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om1ldGhvZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQotICByZXR1cm4gbWV0aG9kXzsKLX0KLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKLWJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Ci19Ci12b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKLX0KLXZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKLSAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpDbGVhcigpOwotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyYgU2VydmljZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7Ci0gIHNldF9oYXNfb3B0aW9ucygpOwotICBpZiAob3B0aW9uc18gPT0gTlVMTCkgewotICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnM7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogU2VydmljZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgcmV0dXJuIHRlbXA7Ci19Ci12b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLX0KLQotI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprSW5wdXRUeXBlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3V0cHV0VHlwZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtDbGllbnRTdHJlYW1pbmdGaWVsZE51bWJlcjsKLWNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtTZXJ2ZXJTdHJlYW1pbmdGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLQotTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXRob2REZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLX0KLQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLSAgb3B0aW9uc18gPSBjb25zdF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqPigmOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOwotfQotCi1NZXRob2REZXNjcmlwdG9yUHJvdG86Ok1ldGhvZERlc2NyaXB0b3JQcm90byhjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCi0gICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQotfQotCi12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIG5hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaW5wdXRfdHlwZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBvdXRwdXRfdHlwZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBvcHRpb25zXyA9IE5VTEw7Ci0gIGNsaWVudF9zdHJlYW1pbmdfID0gZmFsc2U7Ci0gIHNlcnZlcl9zdHJlYW1pbmdfID0gZmFsc2U7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLU1ldGhvZERlc2NyaXB0b3JQcm90bzo6fk1ldGhvZERlc2NyaXB0b3JQcm90bygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKLSAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaW5wdXRfdHlwZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgb3V0cHV0X3R5cGVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gICAgZGVsZXRlIG9wdGlvbnNfOwotICB9Ci19Ci0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLU1ldGhvZERlc2NyaXB0b3JQcm90byogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLU1ldGhvZERlc2NyaXB0b3JQcm90byogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKLSAgTWV0aG9kRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IE1ldGhvZERlc2NyaXB0b3JQcm90bzsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotI2RlZmluZSBaUl9IRUxQRVJfKGYpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2ludmFsaWQtb2Zmc2V0b2ZcIiIpIFwKLSAgX19idWlsdGluX29mZnNldG9mKE1ldGhvZERlc2NyaXB0b3JQcm90bywgZikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCi0jZWxzZQotI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKLSAgJnJlaW50ZXJwcmV0X2Nhc3Q8TWV0aG9kRGVzY3JpcHRvclByb3RvKj4oMTYpLT5mKQotI2VuZGlmCi0KLSNkZWZpbmUgWlJfKGZpcnN0LCBsYXN0KSBkbyB7XAotICA6Om1lbXNldCgmZmlyc3QsIDAsXAotICAgICAgICAgICBaUl9IRUxQRVJfKGxhc3QpIC0gWlJfSEVMUEVSXyhmaXJzdCkgKyBzaXplb2YobGFzdCkpO1wKLX0gd2hpbGUgKDApCi0KLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDYzdSkgewotICAgIFpSXyhjbGllbnRfc3RyZWFtaW5nXywgc2VydmVyX3N0cmVhbWluZ18pOwotICAgIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNfaW5wdXRfdHlwZSgpKSB7Ci0gICAgICBpbnB1dF90eXBlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNfb3V0cHV0X3R5cGUoKSkgewotICAgICAgb3V0cHV0X3R5cGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gICAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICAgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOjpDbGVhcigpOwotICAgIH0KLSAgfQotCi0jdW5kZWYgWlJfSEVMUEVSXwotI3VuZGVmIFpSXwotCi0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfaW5wdXRfdHlwZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE4KSB7Ci0gICAgICAgICBwYXJzZV9pbnB1dF90eXBlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pbnB1dF90eXBlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPmlucHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPmlucHV0X3R5cGUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX291dHB1dF90eXBlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAodGFnID09IDI2KSB7Ci0gICAgICAgICBwYXJzZV9vdXRwdXRfdHlwZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfb3V0cHV0X3R5cGUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+b3V0cHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPm91dHB1dF90eXBlKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2Vfb3B0aW9uczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKLSAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAodGFnID09IDM0KSB7Ci0gICAgICAgICBwYXJzZV9vcHRpb25zOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQwKSkgZ290byBwYXJzZV9jbGllbnRfc3RyZWFtaW5nOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBjbGllbnRfc3RyZWFtaW5nID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgNTogewotICAgICAgICBpZiAodGFnID09IDQwKSB7Ci0gICAgICAgICBwYXJzZV9jbGllbnRfc3RyZWFtaW5nOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmY2xpZW50X3N0cmVhbWluZ18pKSk7Ci0gICAgICAgICAgc2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0OCkpIGdvdG8gcGFyc2Vfc2VydmVyX3N0cmVhbWluZzsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA0OCkgewotICAgICAgICAgcGFyc2Vfc2VydmVyX3N0cmVhbWluZzoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnNlcnZlcl9zdHJlYW1pbmdfKSkpOwotICAgICAgICAgIHNldF9oYXNfc2VydmVyX3N0cmVhbWluZygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQotICByZXR1cm4gdHJ1ZTsKLWZhaWx1cmU6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCi0gIHJldHVybiBmYWxzZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKLSAgaWYgKGhhc19pbnB1dF90eXBlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmlucHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPmlucHV0X3R5cGUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAyLCB0aGlzLT5pbnB1dF90eXBlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOwotICBpZiAoaGFzX291dHB1dF90eXBlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm91dHB1dF90eXBlKCkuZGF0YSgpLCB0aGlzLT5vdXRwdXRfdHlwZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAzLCB0aGlzLT5vdXRwdXRfdHlwZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OwotICBpZiAoaGFzX29wdGlvbnMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA0LCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2NsaWVudF9zdHJlYW1pbmcoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woNSwgdGhpcy0+Y2xpZW50X3N0cmVhbWluZygpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nID0gNiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19zZXJ2ZXJfc3RyZWFtaW5nKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDYsIHRoaXMtPnNlcnZlcl9zdHJlYW1pbmcoKSwgb3V0cHV0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOwotICBpZiAoaGFzX2lucHV0X3R5cGUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+aW5wdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+aW5wdXRfdHlwZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5pbnB1dF90eXBlKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOwotICBpZiAoaGFzX291dHB1dF90eXBlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPm91dHB1dF90eXBlKCkuZGF0YSgpLCB0aGlzLT5vdXRwdXRfdHlwZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMywgdGhpcy0+b3V0cHV0X3R5cGUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKLSAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICA0LCAqdGhpcy0+b3B0aW9uc18sIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2NsaWVudF9zdHJlYW1pbmcoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDUsIHRoaXMtPmNsaWVudF9zdHJlYW1pbmcoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfc2VydmVyX3N0cmVhbWluZygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNiwgdGhpcy0+c2VydmVyX3N0cmVhbWluZygpLCB0YXJnZXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA2M3UpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPm5hbWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOwotICAgIGlmIChoYXNfaW5wdXRfdHlwZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5pbnB1dF90eXBlKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7Ci0gICAgaWYgKGhhc19vdXRwdXRfdHlwZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5vdXRwdXRfdHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7Ci0gICAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICAqdGhpcy0+b3B0aW9uc18pOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19jbGllbnRfc3RyZWFtaW5nKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nID0gNiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICBpZiAoaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0KLSAgfQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7Ci0gICAgICBzZXRfaGFzX25hbWUoKTsKLSAgICAgIG5hbWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5uYW1lXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19pbnB1dF90eXBlKCkpIHsKLSAgICAgIHNldF9oYXNfaW5wdXRfdHlwZSgpOwotICAgICAgaW5wdXRfdHlwZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmlucHV0X3R5cGVfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX291dHB1dF90eXBlKCkpIHsKLSAgICAgIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKLSAgICAgIG91dHB1dF90eXBlXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ub3V0cHV0X3R5cGVfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgewotICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2NsaWVudF9zdHJlYW1pbmcoKSkgewotICAgICAgc2V0X2NsaWVudF9zdHJlYW1pbmcoZnJvbS5jbGllbnRfc3RyZWFtaW5nKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfc2VydmVyX3N0cmVhbWluZygpKSB7Ci0gICAgICBzZXRfc2VydmVyX3N0cmVhbWluZyhmcm9tLnNlcnZlcl9zdHJlYW1pbmcoKSk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgaWYgKCF0aGlzLT5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTd2FwKE1ldGhvZERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKLSAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKLSAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOwotICBpbnB1dF90eXBlXy5Td2FwKCZvdGhlci0+aW5wdXRfdHlwZV8pOwotICBvdXRwdXRfdHlwZV8uU3dhcCgmb3RoZXItPm91dHB1dF90eXBlXyk7Ci0gIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKLSAgc3RkOjpzd2FwKGNsaWVudF9zdHJlYW1pbmdfLCBvdGhlci0+Y2xpZW50X3N0cmVhbWluZ18pOwotICBzdGQ6OnN3YXAoc2VydmVyX3N0cmVhbWluZ18sIG90aGVyLT5zZXJ2ZXJfc3RyZWFtaW5nXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gTWV0aG9kRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gTWV0aG9kRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIE1ldGhvZERlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1ib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbmFtZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0gdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQotICBjbGVhcl9oYXNfbmFtZSgpOwotICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKLWJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfaW5wdXRfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19pbnB1dF90eXBlKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19pbnB1dF90eXBlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9pbnB1dF90eXBlKCkgewotICBpbnB1dF90eXBlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjppbnB1dF90eXBlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKLSAgcmV0dXJuIGlucHV0X3R5cGVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19pbnB1dF90eXBlKCk7Ci0gIGlucHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQotfQotIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKLSAgaW5wdXRfdHlwZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKLX0KLSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfaW5wdXRfdHlwZSgpOwotICBpbnB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCi19Ci0gOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2lucHV0X3R5cGUoKSB7Ci0gIHNldF9oYXNfaW5wdXRfdHlwZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCi0gIHJldHVybiBpbnB1dF90eXBlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9pbnB1dF90eXBlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCi0gIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7Ci0gIHJldHVybiBpbnB1dF90eXBlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2lucHV0X3R5cGUoOjpzdGQ6OnN0cmluZyogaW5wdXRfdHlwZSkgewotICBpZiAoaW5wdXRfdHlwZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19pbnB1dF90eXBlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2lucHV0X3R5cGUoKTsKLSAgfQotICBpbnB1dF90eXBlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgaW5wdXRfdHlwZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKLWJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfb3V0cHV0X3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3V0cHV0X3R5cGUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Ci19Ci12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX291dHB1dF90eXBlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vdXRwdXRfdHlwZSgpIHsKLSAgb3V0cHV0X3R5cGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX291dHB1dF90eXBlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpvdXRwdXRfdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQotICByZXR1cm4gb3V0cHV0X3R5cGVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X291dHB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKLSAgb3V0cHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSkKLX0KLSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X291dHB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKLSAgb3V0cHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQotfQotIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKLSAgb3V0cHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCi19Ci0gOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX291dHB1dF90eXBlKCkgewotICBzZXRfaGFzX291dHB1dF90eXBlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCi0gIHJldHVybiBvdXRwdXRfdHlwZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3V0cHV0X3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCi0gIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOwotICByZXR1cm4gb3V0cHV0X3R5cGVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3V0cHV0X3R5cGUoOjpzdGQ6OnN0cmluZyogb3V0cHV0X3R5cGUpIHsKLSAgaWYgKG91dHB1dF90eXBlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX291dHB1dF90eXBlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX291dHB1dF90eXBlKCk7Ci0gIH0KLSAgb3V0cHV0X3R5cGVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBvdXRwdXRfdHlwZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCi19Ci0KLS8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKLWJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OwotfQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgewotICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9uczo6Q2xlYXIoKTsKLSAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKLSAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBOVUxMOwotICByZXR1cm4gdGVtcDsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQotfQotCi0vLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19jbGllbnRfc3RyZWFtaW5nKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2NsaWVudF9zdHJlYW1pbmcoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Ci19Ci12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2NsaWVudF9zdHJlYW1pbmcoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OwotfQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2NsaWVudF9zdHJlYW1pbmcoKSB7Ci0gIGNsaWVudF9zdHJlYW1pbmdfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19jbGllbnRfc3RyZWFtaW5nKCk7Ci19Ci0gYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsaWVudF9zdHJlYW1pbmcoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5jbGllbnRfc3RyZWFtaW5nKQotICByZXR1cm4gY2xpZW50X3N0cmVhbWluZ187Ci19Ci0gdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9jbGllbnRfc3RyZWFtaW5nKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKCk7Ci0gIGNsaWVudF9zdHJlYW1pbmdfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5jbGllbnRfc3RyZWFtaW5nKQotfQotCi0vLyBvcHRpb25hbCBib29sIHNlcnZlcl9zdHJlYW1pbmcgPSA2IFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19zZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKLX0KLXZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Ci19Ci12b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OwotfQotdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX3NlcnZlcl9zdHJlYW1pbmcoKSB7Ci0gIHNlcnZlcl9zdHJlYW1pbmdfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCk7Ci19Ci0gYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNlcnZlcl9zdHJlYW1pbmcoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5zZXJ2ZXJfc3RyZWFtaW5nKQotICByZXR1cm4gc2VydmVyX3N0cmVhbWluZ187Ci19Ci0gdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9zZXJ2ZXJfc3RyZWFtaW5nKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCk7Ci0gIHNlcnZlcl9zdHJlYW1pbmdfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5zZXJ2ZXJfc3RyZWFtaW5nKQotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yXzsKLX0KLWJvb2wgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgY2FzZSAzOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6U1BFRUQ7Ci1jb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6OkNPREVfU0laRTsKLWNvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOwotY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpPcHRpbWl6ZU1vZGVfTUlOOwotY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpPcHRpbWl6ZU1vZGVfTUFYOwotY29uc3QgaW50IEZpbGVPcHRpb25zOjpPcHRpbWl6ZU1vZGVfQVJSQVlTSVpFOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtKYXZhUGFja2FnZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YU91dGVyQ2xhc3NuYW1lRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtKYXZhTXVsdGlwbGVGaWxlc0ZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YUdlbmVyYXRlRXF1YWxzQW5kSGFzaEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YVN0cmluZ0NoZWNrVXRmOEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpbGVPcHRpb25zOjprT3B0aW1pemVGb3JGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlT3B0aW9uczo6a0dvUGFja2FnZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpbGVPcHRpb25zOjprQ2NHZW5lcmljU2VydmljZXNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlT3B0aW9uczo6a0phdmFHZW5lcmljU2VydmljZXNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlT3B0aW9uczo6a1B5R2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtEZXByZWNhdGVkRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtDY0VuYWJsZUFyZW5hc0ZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpbGVPcHRpb25zOjprT2JqY0NsYXNzUHJlZml4RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtDc2hhcnBOYW1lc3BhY2VGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLQotRmlsZU9wdGlvbnM6OkZpbGVPcHRpb25zKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKLX0KLQotdm9pZCBGaWxlT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1GaWxlT3B0aW9uczo6RmlsZU9wdGlvbnMoY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCi0gICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCi19Ci0KLXZvaWQgRmlsZU9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBqYXZhX3BhY2thZ2VfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgamF2YV9tdWx0aXBsZV9maWxlc18gPSBmYWxzZTsKLSAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gZmFsc2U7Ci0gIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfID0gZmFsc2U7Ci0gIG9wdGltaXplX2Zvcl8gPSAxOwotICBnb19wYWNrYWdlXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNjX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7Ci0gIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKLSAgcHlfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgY2NfZW5hYmxlX2FyZW5hc18gPSBmYWxzZTsKLSAgb2JqY19jbGFzc19wcmVmaXhfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY3NoYXJwX25hbWVzcGFjZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1GaWxlT3B0aW9uczo6fkZpbGVPcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBGaWxlT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKLSAgamF2YV9wYWNrYWdlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBqYXZhX291dGVyX2NsYXNzbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgZ29fcGFja2FnZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgb2JqY19jbGFzc19wcmVmaXhfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNzaGFycF9uYW1lc3BhY2VfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBGaWxlT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEZpbGVPcHRpb25zOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBGaWxlT3B0aW9ucyYgRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLUZpbGVPcHRpb25zKiBGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1GaWxlT3B0aW9ucyogRmlsZU9wdGlvbnM6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBGaWxlT3B0aW9ucyogbiA9IG5ldyBGaWxlT3B0aW9uczsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIEZpbGVPcHRpb25zOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKLSAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7Ci0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jZGVmaW5lIFpSX0hFTFBFUl8oZikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAotICBfX2J1aWx0aW5fb2Zmc2V0b2YoRmlsZU9wdGlvbnMsIGYpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwb3AiKQotI2Vsc2UKLSNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcCi0gICZyZWludGVycHJldF9jYXN0PEZpbGVPcHRpb25zKj4oMTYpLT5mKQotI2VuZGlmCi0KLSNkZWZpbmUgWlJfKGZpcnN0LCBsYXN0KSBkbyB7XAotICA6Om1lbXNldCgmZmlyc3QsIDAsXAotICAgICAgICAgICBaUl9IRUxQRVJfKGxhc3QpIC0gWlJfSEVMUEVSXyhmaXJzdCkgKyBzaXplb2YobGFzdCkpO1wKLX0gd2hpbGUgKDApCi0KLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDI1NXUpIHsKLSAgICBaUl8oamF2YV9tdWx0aXBsZV9maWxlc18sIGNjX2dlbmVyaWNfc2VydmljZXNfKTsKLSAgICBpZiAoaGFzX2phdmFfcGFja2FnZSgpKSB7Ci0gICAgICBqYXZhX3BhY2thZ2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gICAgaWYgKGhhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpKSB7Ci0gICAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBvcHRpbWl6ZV9mb3JfID0gMTsKLSAgICBpZiAoaGFzX2dvX3BhY2thZ2UoKSkgewotICAgICAgZ29fcGFja2FnZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgfQotICBpZiAoX2hhc19iaXRzX1s4IC8gMzJdICYgMTYxMjh1KSB7Ci0gICAgWlJfKGphdmFfZ2VuZXJpY19zZXJ2aWNlc18sIGNjX2VuYWJsZV9hcmVuYXNfKTsKLSAgICBpZiAoaGFzX29iamNfY2xhc3NfcHJlZml4KCkpIHsKLSAgICAgIG9iamNfY2xhc3NfcHJlZml4Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNfY3NoYXJwX25hbWVzcGFjZSgpKSB7Ci0gICAgICBjc2hhcnBfbmFtZXNwYWNlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICB9Ci0KLSN1bmRlZiBaUl9IRUxQRVJfCi0jdW5kZWYgWlJfCi0KLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIEZpbGVPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKLSAgZm9yICg7OykgewotICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxNjM4Myk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfamF2YV9wYWNrYWdlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPmphdmFfcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9wYWNrYWdlKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg2NikpIGdvdG8gcGFyc2VfamF2YV9vdXRlcl9jbGFzc25hbWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OwotICAgICAgY2FzZSA4OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNjYpIHsKLSAgICAgICAgIHBhcnNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzIpKSBnb3RvIHBhcnNlX29wdGltaXplX2ZvcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07Ci0gICAgICBjYXNlIDk6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA3MikgewotICAgICAgICAgcGFyc2Vfb3B0aW1pemVfZm9yOgotICAgICAgICAgIGludCB2YWx1ZTsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGludCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSk7Ci0gICAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0lzVmFsaWQodmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRfb3B0aW1pemVfZm9yKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSA+KHZhbHVlKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDksIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MCkpIGdvdG8gcGFyc2VfamF2YV9tdWx0aXBsZV9maWxlczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOwotICAgICAgY2FzZSAxMDogewotICAgICAgICBpZiAodGFnID09IDgwKSB7Ci0gICAgICAgICBwYXJzZV9qYXZhX211bHRpcGxlX2ZpbGVzOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmamF2YV9tdWx0aXBsZV9maWxlc18pKSk7Ci0gICAgICAgICAgc2V0X2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg5MCkpIGdvdG8gcGFyc2VfZ29fcGFja2FnZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBnb19wYWNrYWdlID0gMTE7Ci0gICAgICBjYXNlIDExOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gOTApIHsKLSAgICAgICAgIHBhcnNlX2dvX3BhY2thZ2U6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2dvX3BhY2thZ2UoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+Z29fcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+Z29fcGFja2FnZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyOCkpIGdvdG8gcGFyc2VfY2NfZ2VuZXJpY19zZXJ2aWNlczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOwotICAgICAgY2FzZSAxNjogewotICAgICAgICBpZiAodGFnID09IDEyOCkgewotICAgICAgICAgcGFyc2VfY2NfZ2VuZXJpY19zZXJ2aWNlczoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmNjX2dlbmVyaWNfc2VydmljZXNfKSkpOwotICAgICAgICAgIHNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTM2KSkgZ290byBwYXJzZV9qYXZhX2dlbmVyaWNfc2VydmljZXM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOwotICAgICAgY2FzZSAxNzogewotICAgICAgICBpZiAodGFnID09IDEzNikgewotICAgICAgICAgcGFyc2VfamF2YV9nZW5lcmljX3NlcnZpY2VzOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmamF2YV9nZW5lcmljX3NlcnZpY2VzXykpKTsKLSAgICAgICAgICBzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTQ0KSkgZ290byBwYXJzZV9weV9nZW5lcmljX3NlcnZpY2VzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgICBjYXNlIDE4OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTQ0KSB7Ci0gICAgICAgICBwYXJzZV9weV9nZW5lcmljX3NlcnZpY2VzOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmcHlfZ2VuZXJpY19zZXJ2aWNlc18pKSk7Ci0gICAgICAgICAgc2V0X2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNjApKSBnb3RvIHBhcnNlX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOwotICAgICAgY2FzZSAyMDogewotICAgICAgICBpZiAodGFnID09IDE2MCkgewotICAgICAgICAgcGFyc2VfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2g6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTg0KSkgZ290byBwYXJzZV9kZXByZWNhdGVkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgICBjYXNlIDIzOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTg0KSB7Ci0gICAgICAgICBwYXJzZV9kZXByZWNhdGVkOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmZGVwcmVjYXRlZF8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19kZXByZWNhdGVkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyMTYpKSBnb3RvIHBhcnNlX2phdmFfc3RyaW5nX2NoZWNrX3V0Zjg7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgMjc6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAyMTYpIHsKLSAgICAgICAgIHBhcnNlX2phdmFfc3RyaW5nX2NoZWNrX3V0Zjg6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZqYXZhX3N0cmluZ19jaGVja191dGY4XykpKTsKLSAgICAgICAgICBzZXRfaGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0OCkpIGdvdG8gcGFyc2VfY2NfZW5hYmxlX2FyZW5hczsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZW5hYmxlX2FyZW5hcyA9IDMxIFtkZWZhdWx0ID0gZmFsc2VdOwotICAgICAgY2FzZSAzMTogewotICAgICAgICBpZiAodGFnID09IDI0OCkgewotICAgICAgICAgcGFyc2VfY2NfZW5hYmxlX2FyZW5hczoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmNjX2VuYWJsZV9hcmVuYXNfKSkpOwotICAgICAgICAgIHNldF9oYXNfY2NfZW5hYmxlX2FyZW5hcygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjkwKSkgZ290byBwYXJzZV9vYmpjX2NsYXNzX3ByZWZpeDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBvYmpjX2NsYXNzX3ByZWZpeCA9IDM2OwotICAgICAgY2FzZSAzNjogewotICAgICAgICBpZiAodGFnID09IDI5MCkgewotICAgICAgICAgcGFyc2Vfb2JqY19jbGFzc19wcmVmaXg6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX29iamNfY2xhc3NfcHJlZml4KCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPm9iamNfY2xhc3NfcHJlZml4KCkuZGF0YSgpLCB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyOTgpKSBnb3RvIHBhcnNlX2NzaGFycF9uYW1lc3BhY2U7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OwotICAgICAgY2FzZSAzNzogewotICAgICAgICBpZiAodGFnID09IDI5OCkgewotICAgICAgICAgcGFyc2VfY3NoYXJwX25hbWVzcGFjZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfY3NoYXJwX25hbWVzcGFjZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5jc2hhcnBfbmFtZXNwYWNlKCkuZGF0YSgpLCB0aGlzLT5jc2hhcnBfbmFtZXNwYWNlKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAodGFnID09IDc5OTQpIHsKLSAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7Ci0gICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgRmlsZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKLSAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+amF2YV9wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5qYXZhX3BhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgMSwgdGhpcy0+amF2YV9wYWNrYWdlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OwotICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkuZGF0YSgpLCB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDgsIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOwotICBpZiAoaGFzX29wdGltaXplX2ZvcigpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDksIHRoaXMtPm9wdGltaXplX2ZvcigpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfamF2YV9tdWx0aXBsZV9maWxlcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxMCwgdGhpcy0+amF2YV9tdWx0aXBsZV9maWxlcygpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKLSAgaWYgKGhhc19nb19wYWNrYWdlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmdvX3BhY2thZ2UoKS5kYXRhKCksIHRoaXMtPmdvX3BhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDExLCB0aGlzLT5nb19wYWNrYWdlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGNjX2dlbmVyaWNfc2VydmljZXMgPSAxNiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDE2LCB0aGlzLT5jY19nZW5lcmljX3NlcnZpY2VzKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxNywgdGhpcy0+amF2YV9nZW5lcmljX3NlcnZpY2VzKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDE4LCB0aGlzLT5weV9nZW5lcmljX3NlcnZpY2VzKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMjAsIHRoaXMtPmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAyMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIzLCB0aGlzLT5kZXByZWNhdGVkKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDI3LCB0aGlzLT5qYXZhX3N0cmluZ19jaGVja191dGY4KCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19jY19lbmFibGVfYXJlbmFzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDMxLCB0aGlzLT5jY19lbmFibGVfYXJlbmFzKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKLSAgaWYgKGhhc19vYmpjX2NsYXNzX3ByZWZpeCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpLmRhdGEoKSwgdGhpcy0+b2JqY19jbGFzc19wcmVmaXgoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAzNiwgdGhpcy0+b2JqY19jbGFzc19wcmVmaXgoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7Ci0gIGlmIChoYXNfY3NoYXJwX25hbWVzcGFjZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5jc2hhcnBfbmFtZXNwYWNlKCkuZGF0YSgpLCB0aGlzLT5jc2hhcnBfbmFtZXNwYWNlKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAzNywgdGhpcy0+Y3NoYXJwX25hbWVzcGFjZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCi0gIF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICAxMDAwLCA1MzY4NzA5MTIsIG91dHB1dCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpbGVPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7Ci0gIGlmIChoYXNfamF2YV9wYWNrYWdlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmphdmFfcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+amF2YV9wYWNrYWdlKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAxLCB0aGlzLT5qYXZhX3BhY2thZ2UoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7Ci0gIGlmIChoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5kYXRhKCksIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lIik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDgsIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOwotICBpZiAoaGFzX29wdGltaXplX2ZvcigpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCi0gICAgICA5LCB0aGlzLT5vcHRpbWl6ZV9mb3IoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEwLCB0aGlzLT5qYXZhX211bHRpcGxlX2ZpbGVzKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgZ29fcGFja2FnZSA9IDExOwotICBpZiAoaGFzX2dvX3BhY2thZ2UoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+Z29fcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+Z29fcGFja2FnZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlIik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDExLCB0aGlzLT5nb19wYWNrYWdlKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGNjX2dlbmVyaWNfc2VydmljZXMgPSAxNiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxNiwgdGhpcy0+Y2NfZ2VuZXJpY19zZXJ2aWNlcygpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDE3LCB0aGlzLT5qYXZhX2dlbmVyaWNfc2VydmljZXMoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDE4LCB0aGlzLT5weV9nZW5lcmljX3NlcnZpY2VzKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDIwLCB0aGlzLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMjMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDI3LCB0aGlzLT5qYXZhX3N0cmluZ19jaGVja191dGY4KCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19jY19lbmFibGVfYXJlbmFzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzMSwgdGhpcy0+Y2NfZW5hYmxlX2FyZW5hcygpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG9iamNfY2xhc3NfcHJlZml4ID0gMzY7Ci0gIGlmIChoYXNfb2JqY19jbGFzc19wcmVmaXgoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+b2JqY19jbGFzc19wcmVmaXgoKS5kYXRhKCksIHRoaXMtPm9iamNfY2xhc3NfcHJlZml4KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4Iik7Ci0gICAgdGFyZ2V0ID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCi0gICAgICAgIDM2LCB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGNzaGFycF9uYW1lc3BhY2UgPSAzNzsKLSAgaWYgKGhhc19jc2hhcnBfbmFtZXNwYWNlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmNzaGFycF9uYW1lc3BhY2UoKS5kYXRhKCksIHRoaXMtPmNzaGFycF9uYW1lc3BhY2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAzNywgdGhpcy0+Y3NoYXJwX25hbWVzcGFjZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKLSAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgRmlsZU9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAyNTV1KSB7Ci0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7Ci0gICAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+amF2YV9wYWNrYWdlKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7Ci0gICAgaWYgKGhhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICBpZiAoaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDIgKyAxOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOwotICAgIGlmIChoYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDIgKyAxOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07Ci0gICAgaWYgKGhhc19vcHRpbWl6ZV9mb3IoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPm9wdGltaXplX2ZvcigpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgZ29fcGFja2FnZSA9IDExOwotICAgIGlmIChoYXNfZ29fcGFja2FnZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5nb19wYWNrYWdlKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOwotICAgIGlmIChoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDIgKyAxOwotICAgIH0KLQotICB9Ci0gIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAxNjEyOHUpIHsKLSAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOwotICAgIGlmIChoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19jY19lbmFibGVfYXJlbmFzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIG9iamNfY2xhc3NfcHJlZml4ID0gMzY7Ci0gICAgaWYgKGhhc19vYmpjX2NsYXNzX3ByZWZpeCgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDIgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OwotICAgIGlmIChoYXNfY3NoYXJwX25hbWVzcGFjZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDIgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5jc2hhcnBfbmFtZXNwYWNlKCkpOwotICAgIH0KLQotICB9Ci0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7Ci0gIH0KLQotICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOwotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBGaWxlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBjb25zdCBGaWxlT3B0aW9ucyogc291cmNlID0gCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IEZpbGVPcHRpb25zPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIEZpbGVPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfamF2YV9wYWNrYWdlKCkpIHsKLSAgICAgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gICAgICBqYXZhX3BhY2thZ2VfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5qYXZhX3BhY2thZ2VfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKLSAgICAgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uamF2YV9vdXRlcl9jbGFzc25hbWVfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSkgewotICAgICAgc2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoZnJvbS5qYXZhX211bHRpcGxlX2ZpbGVzKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSkgewotICAgICAgc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGZyb20uamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkpIHsKLSAgICAgIHNldF9qYXZhX3N0cmluZ19jaGVja191dGY4KGZyb20uamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX29wdGltaXplX2ZvcigpKSB7Ci0gICAgICBzZXRfb3B0aW1pemVfZm9yKGZyb20ub3B0aW1pemVfZm9yKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfZ29fcGFja2FnZSgpKSB7Ci0gICAgICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKLSAgICAgIGdvX3BhY2thZ2VfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5nb19wYWNrYWdlXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkpIHsKLSAgICAgIHNldF9jY19nZW5lcmljX3NlcnZpY2VzKGZyb20uY2NfZ2VuZXJpY19zZXJ2aWNlcygpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGZyb20uX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSkgewotICAgICAgc2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhmcm9tLmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSkgewotICAgICAgc2V0X3B5X2dlbmVyaWNfc2VydmljZXMoZnJvbS5weV9nZW5lcmljX3NlcnZpY2VzKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgICBzZXRfZGVwcmVjYXRlZChmcm9tLmRlcHJlY2F0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19jY19lbmFibGVfYXJlbmFzKCkpIHsKLSAgICAgIHNldF9jY19lbmFibGVfYXJlbmFzKGZyb20uY2NfZW5hYmxlX2FyZW5hcygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX29iamNfY2xhc3NfcHJlZml4KCkpIHsKLSAgICAgIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgICAgIG9iamNfY2xhc3NfcHJlZml4Xy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ub2JqY19jbGFzc19wcmVmaXhfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2NzaGFycF9uYW1lc3BhY2UoKSkgewotICAgICAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Ci0gICAgICBjc2hhcnBfbmFtZXNwYWNlXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uY3NoYXJwX25hbWVzcGFjZV8pOwotICAgIH0KLSAgfQotICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKLSAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotICB9Ci19Ci0KLXZvaWQgRmlsZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBGaWxlT3B0aW9uczo6Q29weUZyb20oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRmlsZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0KLSAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT51bmludGVycHJldGVkX29wdGlvbigpKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmlsZU9wdGlvbnM6OlN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpJbnRlcm5hbFN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKSB7Ci0gIGphdmFfcGFja2FnZV8uU3dhcCgmb3RoZXItPmphdmFfcGFja2FnZV8pOwotICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU3dhcCgmb3RoZXItPmphdmFfb3V0ZXJfY2xhc3NuYW1lXyk7Ci0gIHN0ZDo6c3dhcChqYXZhX211bHRpcGxlX2ZpbGVzXywgb3RoZXItPmphdmFfbXVsdGlwbGVfZmlsZXNfKTsKLSAgc3RkOjpzd2FwKGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXywgb3RoZXItPmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyk7Ci0gIHN0ZDo6c3dhcChqYXZhX3N0cmluZ19jaGVja191dGY4Xywgb3RoZXItPmphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfKTsKLSAgc3RkOjpzd2FwKG9wdGltaXplX2Zvcl8sIG90aGVyLT5vcHRpbWl6ZV9mb3JfKTsKLSAgZ29fcGFja2FnZV8uU3dhcCgmb3RoZXItPmdvX3BhY2thZ2VfKTsKLSAgc3RkOjpzd2FwKGNjX2dlbmVyaWNfc2VydmljZXNfLCBvdGhlci0+Y2NfZ2VuZXJpY19zZXJ2aWNlc18pOwotICBzdGQ6OnN3YXAoamF2YV9nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPmphdmFfZ2VuZXJpY19zZXJ2aWNlc18pOwotICBzdGQ6OnN3YXAocHlfZ2VuZXJpY19zZXJ2aWNlc18sIG90aGVyLT5weV9nZW5lcmljX3NlcnZpY2VzXyk7Ci0gIHN0ZDo6c3dhcChkZXByZWNhdGVkXywgb3RoZXItPmRlcHJlY2F0ZWRfKTsKLSAgc3RkOjpzd2FwKGNjX2VuYWJsZV9hcmVuYXNfLCBvdGhlci0+Y2NfZW5hYmxlX2FyZW5hc18pOwotICBvYmpjX2NsYXNzX3ByZWZpeF8uU3dhcCgmb3RoZXItPm9iamNfY2xhc3NfcHJlZml4Xyk7Ci0gIGNzaGFycF9uYW1lc3BhY2VfLlN3YXAoJm90aGVyLT5jc2hhcnBfbmFtZXNwYWNlXyk7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEZpbGVPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBGaWxlT3B0aW9uc19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpbGVPcHRpb25zX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIEZpbGVPcHRpb25zCi0KLS8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOwotYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfcGFja2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfcGFja2FnZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX3BhY2thZ2UoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9wYWNrYWdlKCkgewotICBqYXZhX3BhY2thZ2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOwotfQotIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpqYXZhX3BhY2thZ2UoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKLSAgcmV0dXJuIGphdmFfcGFja2FnZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKLSAgamF2YV9wYWNrYWdlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCi19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2phdmFfcGFja2FnZSgpOwotICBqYXZhX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIGphdmFfcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKLX0KLSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9qYXZhX3BhY2thZ2UoKSB7Ci0gIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCi0gIHJldHVybiBqYXZhX3BhY2thZ2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfamF2YV9wYWNrYWdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQotICBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIHJldHVybiBqYXZhX3BhY2thZ2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9qYXZhX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogamF2YV9wYWNrYWdlKSB7Ci0gIGlmIChqYXZhX3BhY2thZ2UgIT0gTlVMTCkgewotICAgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOwotICB9Ci0gIGphdmFfcGFja2FnZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGphdmFfcGFja2FnZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7Ci1ib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOwotfQotdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKLSAgcmV0dXJuIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgewotICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKLSAgcmV0dXJuIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCi0gIGNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotICByZXR1cm4gamF2YV9vdXRlcl9jbGFzc25hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9qYXZhX291dGVyX2NsYXNzbmFtZSg6OnN0ZDo6c3RyaW5nKiBqYXZhX291dGVyX2NsYXNzbmFtZSkgewotICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgfQotICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGphdmFfb3V0ZXJfY2xhc3NuYW1lKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQotfQotCi0vLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKLWJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfbXVsdGlwbGVfZmlsZXMoKSB7Ci0gIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7Ci19Ci0gYm9vbCBGaWxlT3B0aW9uczo6amF2YV9tdWx0aXBsZV9maWxlcygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9tdWx0aXBsZV9maWxlcykKLSAgcmV0dXJuIGphdmFfbXVsdGlwbGVfZmlsZXNfOwotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX211bHRpcGxlX2ZpbGVzKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7Ci0gIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfbXVsdGlwbGVfZmlsZXMpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdCA9IGZhbHNlXTsKLWJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OwotfQotdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgewotICBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7Ci19Ci0gYm9vbCBGaWxlT3B0aW9uczo6amF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKQotICByZXR1cm4gamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfOwotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKLSAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKQotfQotCi0vLyBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdCA9IGZhbHNlXTsKLWJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSB7Ci0gIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCk7Ci19Ci0gYm9vbCBGaWxlT3B0aW9uczo6amF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9zdHJpbmdfY2hlY2tfdXRmOCkKLSAgcmV0dXJuIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfOwotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3N0cmluZ19jaGVja191dGY4KGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCk7Ci0gIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgpCi19Ci0KLS8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07Ci1ib29sIEZpbGVPcHRpb25zOjpoYXNfb3B0aW1pemVfZm9yKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfb3B0aW1pemVfZm9yKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OwotfQotdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX29wdGltaXplX2ZvcigpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9vcHRpbWl6ZV9mb3IoKSB7Ci0gIG9wdGltaXplX2Zvcl8gPSAxOwotICBjbGVhcl9oYXNfb3B0aW1pemVfZm9yKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6Om9wdGltaXplX2ZvcigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub3B0aW1pemVfZm9yKQotICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlID4ob3B0aW1pemVfZm9yXyk7Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X29wdGltaXplX2Zvcig6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSB2YWx1ZSkgewotICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSkpOwotICBzZXRfaGFzX29wdGltaXplX2ZvcigpOwotICBvcHRpbWl6ZV9mb3JfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9wdGltaXplX2ZvcikKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKLWJvb2wgRmlsZU9wdGlvbnM6Omhhc19nb19wYWNrYWdlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfZ29fcGFja2FnZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19nb19wYWNrYWdlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2dvX3BhY2thZ2UoKSB7Ci0gIGdvX3BhY2thZ2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2dvX3BhY2thZ2UoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6Z29fcGFja2FnZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLSAgcmV0dXJuIGdvX3BhY2thZ2VfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKLSAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLX0KLSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKLSAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9nb19wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKLSAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCi19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfZ29fcGFja2FnZSgpIHsKLSAgc2V0X2hhc19nb19wYWNrYWdlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQotICByZXR1cm4gZ29fcGFja2FnZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9nb19wYWNrYWdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLSAgY2xlYXJfaGFzX2dvX3BhY2thZ2UoKTsKLSAgcmV0dXJuIGdvX3BhY2thZ2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9nb19wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGdvX3BhY2thZ2UpIHsKLSAgaWYgKGdvX3BhY2thZ2UgIT0gTlVMTCkgewotICAgIHNldF9oYXNfZ29fcGFja2FnZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7Ci0gIH0KLSAgZ29fcGFja2FnZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGdvX3BhY2thZ2UpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07Ci1ib29sIEZpbGVPcHRpb25zOjpoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jY19nZW5lcmljX3NlcnZpY2VzKCkgewotICBjY19nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOwotfQotIGJvb2wgRmlsZU9wdGlvbnM6OmNjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2dlbmVyaWNfc2VydmljZXMpCi0gIHJldHVybiBjY19nZW5lcmljX3NlcnZpY2VzXzsKLX0KLSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY2NfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBjY19nZW5lcmljX3NlcnZpY2VzXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19nZW5lcmljX3NlcnZpY2VzKQotfQotCi0vLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDEwMHUpICE9IDA7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAxMDB1OwotfQotdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgewotICBqYXZhX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKLX0KLSBib29sIEZpbGVPcHRpb25zOjpqYXZhX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJpY19zZXJ2aWNlcykKLSAgcmV0dXJuIGphdmFfZ2VuZXJpY19zZXJ2aWNlc187Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7Ci0gIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzKQotfQotCi0vLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKLWJvb2wgRmlsZU9wdGlvbnM6Omhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMjAwdSkgIT0gMDsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMjAwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX3B5X2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIHB5X2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7Ci19Ci0gYm9vbCBGaWxlT3B0aW9uczo6cHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucHlfZ2VuZXJpY19zZXJ2aWNlcykKLSAgcmV0dXJuIHB5X2dlbmVyaWNfc2VydmljZXNfOwotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9weV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7Ci0gIHB5X2dlbmVyaWNfc2VydmljZXNfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnB5X2dlbmVyaWNfc2VydmljZXMpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBGaWxlT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDA0MDB1KSAhPSAwOwotfQotdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDA0MDB1OwotfQotdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA0MDB1OwotfQotdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLX0KLSBib29sIEZpbGVPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5kZXByZWNhdGVkKQotICByZXR1cm4gZGVwcmVjYXRlZF87Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZGVwcmVjYXRlZCkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQgPSBmYWxzZV07Ci1ib29sIEZpbGVPcHRpb25zOjpoYXNfY2NfZW5hYmxlX2FyZW5hcygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDgwMHUpICE9IDA7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDgwMHU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY2NfZW5hYmxlX2FyZW5hcygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDgwMHU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jY19lbmFibGVfYXJlbmFzKCkgewotICBjY19lbmFibGVfYXJlbmFzXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfY2NfZW5hYmxlX2FyZW5hcygpOwotfQotIGJvb2wgRmlsZU9wdGlvbnM6OmNjX2VuYWJsZV9hcmVuYXMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2VuYWJsZV9hcmVuYXMpCi0gIHJldHVybiBjY19lbmFibGVfYXJlbmFzXzsKLX0KLSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY2NfZW5hYmxlX2FyZW5hcyhib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfY2NfZW5hYmxlX2FyZW5hcygpOwotICBjY19lbmFibGVfYXJlbmFzXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19lbmFibGVfYXJlbmFzKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKLWJvb2wgRmlsZU9wdGlvbnM6Omhhc19vYmpjX2NsYXNzX3ByZWZpeCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMTAwMHUpICE9IDA7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDEwMDB1OwotfQotdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAxMDAwdTsKLX0KLXZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX29iamNfY2xhc3NfcHJlZml4KCkgewotICBvYmpjX2NsYXNzX3ByZWZpeF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6b2JqY19jbGFzc19wcmVmaXgoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQotICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXhfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfb2JqY19jbGFzc19wcmVmaXgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOwotICBvYmpjX2NsYXNzX3ByZWZpeF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgb2JqY19jbGFzc19wcmVmaXhfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7Ci0gIG9iamNfY2xhc3NfcHJlZml4Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfb2JqY19jbGFzc19wcmVmaXgoKSB7Ci0gIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQotICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXhfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2Vfb2JqY19jbGFzc19wcmVmaXgoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCkKLSAgY2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7Ci0gIHJldHVybiBvYmpjX2NsYXNzX3ByZWZpeF8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfYWxsb2NhdGVkX29iamNfY2xhc3NfcHJlZml4KDo6c3RkOjpzdHJpbmcqIG9iamNfY2xhc3NfcHJlZml4KSB7Ci0gIGlmIChvYmpjX2NsYXNzX3ByZWZpeCAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOwotICB9Ci0gIG9iamNfY2xhc3NfcHJlZml4Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgb2JqY19jbGFzc19wcmVmaXgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7Ci1ib29sIEZpbGVPcHRpb25zOjpoYXNfY3NoYXJwX25hbWVzcGFjZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMjAwMHUpICE9IDA7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMjAwMHU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMjAwMHU7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jc2hhcnBfbmFtZXNwYWNlKCkgewotICBjc2hhcnBfbmFtZXNwYWNlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmNzaGFycF9uYW1lc3BhY2UoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCi0gIHJldHVybiBjc2hhcnBfbmFtZXNwYWNlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Ci0gIGNzaGFycF9uYW1lc3BhY2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCi19Ci0gdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Ci0gIGNzaGFycF9uYW1lc3BhY2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKLX0KLSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY3NoYXJwX25hbWVzcGFjZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Ci0gIGNzaGFycF9uYW1lc3BhY2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQotfQotIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2NzaGFycF9uYW1lc3BhY2UoKSB7Ci0gIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKLSAgcmV0dXJuIGNzaGFycF9uYW1lc3BhY2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfY3NoYXJwX25hbWVzcGFjZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCi0gIGNsZWFyX2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Ci0gIHJldHVybiBjc2hhcnBfbmFtZXNwYWNlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfY3NoYXJwX25hbWVzcGFjZSg6OnN0ZDo6c3RyaW5nKiBjc2hhcnBfbmFtZXNwYWNlKSB7Ci0gIGlmIChjc2hhcnBfbmFtZXNwYWNlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotICB9Ci0gIGNzaGFycF9uYW1lc3BhY2VfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBjc2hhcnBfbmFtZXNwYWNlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLWludCBGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Ci19Ci12b2lkIEZpbGVPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmlsZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmlsZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgotRmlsZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1GaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLQotI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBNZXNzYWdlT3B0aW9uczo6a01lc3NhZ2VTZXRXaXJlRm9ybWF0RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtEZXByZWNhdGVkRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtNYXBFbnRyeUZpZWxkTnVtYmVyOwotY29uc3QgaW50IE1lc3NhZ2VPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1NZXNzYWdlT3B0aW9uczo6TWVzc2FnZU9wdGlvbnMoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotfQotCi12b2lkIE1lc3NhZ2VPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLU1lc3NhZ2VPcHRpb25zOjpNZXNzYWdlT3B0aW9ucyhjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKLX0KLQotdm9pZCBNZXNzYWdlT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZhbHNlOwotICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IGZhbHNlOwotICBkZXByZWNhdGVkXyA9IGZhbHNlOwotICBtYXBfZW50cnlfID0gZmFsc2U7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLU1lc3NhZ2VPcHRpb25zOjp+TWVzc2FnZU9wdGlvbnMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIE1lc3NhZ2VPcHRpb25zOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZU9wdGlvbnM6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBNZXNzYWdlT3B0aW9uczo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBNZXNzYWdlT3B0aW9uc19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgTWVzc2FnZU9wdGlvbnMmIE1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1NZXNzYWdlT3B0aW9ucyogTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotTWVzc2FnZU9wdGlvbnMqIE1lc3NhZ2VPcHRpb25zOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKLSAgTWVzc2FnZU9wdGlvbnMqIG4gPSBuZXcgTWVzc2FnZU9wdGlvbnM7Ci0gIGlmIChhcmVuYSAhPSBOVUxMKSB7Ci0gICAgYXJlbmEtPk93bihuKTsKLSAgfQotICByZXR1cm4gbjsKLX0KLQotdm9pZCBNZXNzYWdlT3B0aW9uczo6Q2xlYXIoKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gIF9leHRlbnNpb25zXy5DbGVhcigpOwotI2lmIGRlZmluZWQoX19jbGFuZ19fKQotI2RlZmluZSBaUl9IRUxQRVJfKGYpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2ludmFsaWQtb2Zmc2V0b2ZcIiIpIFwKLSAgX19idWlsdGluX29mZnNldG9mKE1lc3NhZ2VPcHRpb25zLCBmKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcG9wIikKLSNlbHNlCi0jZGVmaW5lIFpSX0hFTFBFUl8oZikgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oXAotICAmcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlT3B0aW9ucyo+KDE2KS0+ZikKLSNlbmRpZgotCi0jZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKLSAgOjptZW1zZXQoJmZpcnN0LCAwLFwKLSAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCi19IHdoaWxlICgwKQotCi0gIFpSXyhtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8sIG1hcF9lbnRyeV8pOwotCi0jdW5kZWYgWlJfSEVMUEVSXwotI3VuZGVmIFpSXwotCi0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBNZXNzYWdlT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDgpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XykpKTsKLSAgICAgICAgICBzZXRfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2Vfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAxNikgewotICAgICAgICAgcGFyc2Vfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcjoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfKSkpOwotICAgICAgICAgIHNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjQpKSBnb3RvIHBhcnNlX2RlcHJlY2F0ZWQ7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOwotICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMjQpIHsKLSAgICAgICAgIHBhcnNlX2RlcHJlY2F0ZWQ6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZkZXByZWNhdGVkXykpKTsKLSAgICAgICAgICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU2KSkgZ290byBwYXJzZV9tYXBfZW50cnk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7Ci0gICAgICBjYXNlIDc6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA1NikgewotICAgICAgICAgcGFyc2VfbWFwX2VudHJ5OgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmbWFwX2VudHJ5XykpKTsKLSAgICAgICAgICBzZXRfaGFzX21hcF9lbnRyeSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAodGFnID09IDc5OTQpIHsKLSAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7Ci0gICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgTWVzc2FnZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxLCB0aGlzLT5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIsIHRoaXMtPm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgzLCB0aGlzLT5kZXByZWNhdGVkKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7Ci0gIGlmIChoYXNfbWFwX2VudHJ5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDcsIHRoaXMtPm1hcF9lbnRyeSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCi0gIF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICAxMDAwLCA1MzY4NzA5MTIsIG91dHB1dCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIE1lc3NhZ2VPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKLSAgLy8gb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEsIHRoaXMtPm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDIsIHRoaXMtPm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBtYXBfZW50cnkgPSA3OwotICBpZiAoaGFzX21hcF9lbnRyeSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNywgdGhpcy0+bWFwX2VudHJ5KCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQotICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBNZXNzYWdlT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDE1dSkgewotICAgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOwotICAgIGlmIChoYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwotICAgIGlmIChoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKyAxOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgYm9vbCBtYXBfZW50cnkgPSA3OwotICAgIGlmIChoYXNfbWFwX2VudHJ5KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotCi0gIH0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKLSAgfQotCi0gIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIE1lc3NhZ2VPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgTWVzc2FnZU9wdGlvbnM+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgTWVzc2FnZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7Ci0gICAgICBzZXRfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoZnJvbS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSkgewotICAgICAgc2V0X25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoZnJvbS5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgICBzZXRfZGVwcmVjYXRlZChmcm9tLmRlcHJlY2F0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19tYXBfZW50cnkoKSkgewotICAgICAgc2V0X21hcF9lbnRyeShmcm9tLm1hcF9lbnRyeSgpKTsKLSAgICB9Ci0gIH0KLSAgX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShmcm9tLl9leHRlbnNpb25zXyk7Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIE1lc3NhZ2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgTWVzc2FnZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIE1lc3NhZ2VPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oKSkpIHJldHVybiBmYWxzZTsKLQotICBpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsgIHJldHVybiB0cnVlOwotfQotCi12b2lkIE1lc3NhZ2VPcHRpb25zOjpTd2FwKE1lc3NhZ2VPcHRpb25zKiBvdGhlcikgewotICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBJbnRlcm5hbFN3YXAob3RoZXIpOwotfQotdm9pZCBNZXNzYWdlT3B0aW9uczo6SW50ZXJuYWxTd2FwKE1lc3NhZ2VPcHRpb25zKiBvdGhlcikgewotICBzdGQ6OnN3YXAobWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfLCBvdGhlci0+bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKTsKLSAgc3RkOjpzd2FwKG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfLCBvdGhlci0+bm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8pOwotICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7Ci0gIHN0ZDo6c3dhcChtYXBfZW50cnlfLCBvdGhlci0+bWFwX2VudHJ5Xyk7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIE1lc3NhZ2VPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBNZXNzYWdlT3B0aW9uc19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IE1lc3NhZ2VPcHRpb25zX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIE1lc3NhZ2VPcHRpb25zCi0KLS8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBNZXNzYWdlT3B0aW9uczo6aGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLXZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSB7Ci0gIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZhbHNlOwotICBjbGVhcl9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKLX0KLSBib29sIE1lc3NhZ2VPcHRpb25zOjptZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCi0gIHJldHVybiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF87Ci19Ci0gdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOwotICBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci1ib29sIE1lc3NhZ2VPcHRpb25zOjpoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci12b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci12b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci12b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgewotICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOwotfQotIGJvb2wgTWVzc2FnZU9wdGlvbnM6Om5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IpCi0gIHJldHVybiBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXzsKLX0KLSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcihib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOwotICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKQotfQotCi0vLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBNZXNzYWdlT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OwotfQotdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLX0KLSBib29sIE1lc3NhZ2VPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5kZXByZWNhdGVkKQotICByZXR1cm4gZGVwcmVjYXRlZF87Ci19Ci0gdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMuZGVwcmVjYXRlZCkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBtYXBfZW50cnkgPSA3OwotYm9vbCBNZXNzYWdlT3B0aW9uczo6aGFzX21hcF9lbnRyeSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci12b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfaGFzX21hcF9lbnRyeSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLXZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX2hhc19tYXBfZW50cnkoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfbWFwX2VudHJ5KCkgewotICBtYXBfZW50cnlfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19tYXBfZW50cnkoKTsKLX0KLSBib29sIE1lc3NhZ2VPcHRpb25zOjptYXBfZW50cnkoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeSkKLSAgcmV0dXJuIG1hcF9lbnRyeV87Ci19Ci0gdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X21hcF9lbnRyeShib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfbWFwX2VudHJ5KCk7Ci0gIG1hcF9lbnRyeV8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWFwX2VudHJ5KQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci1pbnQgTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOwotfQotdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBNZXNzYWdlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLU1lc3NhZ2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX2Rlc2NyaXB0b3JfOwotfQotYm9vbCBGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgc3dpdGNoKHZhbHVlKSB7Ci0gICAgY2FzZSAwOgotICAgIGNhc2UgMToKLSAgICBjYXNlIDI6Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICBkZWZhdWx0OgotICAgICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgRmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uczo6U1RSSU5HOwotY29uc3QgRmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uczo6Q09SRDsKLWNvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OlNUUklOR19QSUVDRTsKLWNvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OkNUeXBlX01JTjsKLWNvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OkNUeXBlX01BWDsKLWNvbnN0IGludCBGaWVsZE9wdGlvbnM6OkNUeXBlX0FSUkFZU0laRTsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkT3B0aW9uc19KU1R5cGVfZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3JfOwotfQotYm9vbCBGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gIHN3aXRjaCh2YWx1ZSkgewotICAgIGNhc2UgMDoKLSAgICBjYXNlIDE6Ci0gICAgY2FzZSAyOgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgZGVmYXVsdDoKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IEZpZWxkT3B0aW9uc19KU1R5cGUgRmllbGRPcHRpb25zOjpKU19OT1JNQUw7Ci1jb25zdCBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6SlNfU1RSSU5HOwotY29uc3QgRmllbGRPcHRpb25zX0pTVHlwZSBGaWVsZE9wdGlvbnM6OkpTX05VTUJFUjsKLWNvbnN0IEZpZWxkT3B0aW9uc19KU1R5cGUgRmllbGRPcHRpb25zOjpKU1R5cGVfTUlOOwotY29uc3QgRmllbGRPcHRpb25zX0pTVHlwZSBGaWVsZE9wdGlvbnM6OkpTVHlwZV9NQVg7Ci1jb25zdCBpbnQgRmllbGRPcHRpb25zOjpKU1R5cGVfQVJSQVlTSVpFOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgRmllbGRPcHRpb25zOjprQ3R5cGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtQYWNrZWRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtKc3R5cGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtMYXp5RmllbGROdW1iZXI7Ci1jb25zdCBpbnQgRmllbGRPcHRpb25zOjprRGVwcmVjYXRlZEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEZpZWxkT3B0aW9uczo6a1dlYWtGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLUZpZWxkT3B0aW9uczo6RmllbGRPcHRpb25zKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi19Ci0KLXZvaWQgRmllbGRPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLUZpZWxkT3B0aW9uczo6RmllbGRPcHRpb25zKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi19Ci0KLXZvaWQgRmllbGRPcHRpb25zOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgY3R5cGVfID0gMDsKLSAgcGFja2VkXyA9IGZhbHNlOwotICBqc3R5cGVfID0gMDsKLSAgbGF6eV8gPSBmYWxzZTsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgd2Vha18gPSBmYWxzZTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotRmllbGRPcHRpb25zOjp+RmllbGRPcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgRmllbGRPcHRpb25zOjpTaGFyZWREdG9yKCkgewotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgRmllbGRPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRmllbGRPcHRpb25zOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgRmllbGRPcHRpb25zJiBGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLUZpZWxkT3B0aW9ucyogRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUZpZWxkT3B0aW9ucyogRmllbGRPcHRpb25zOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKLSAgRmllbGRPcHRpb25zKiBuID0gbmV3IEZpZWxkT3B0aW9uczsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIEZpZWxkT3B0aW9uczo6Q2xlYXIoKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQotICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcHVzaCIpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCi0gIF9fYnVpbHRpbl9vZmZzZXRvZihGaWVsZE9wdGlvbnMsIGYpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwb3AiKQotI2Vsc2UKLSNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcCi0gICZyZWludGVycHJldF9jYXN0PEZpZWxkT3B0aW9ucyo+KDE2KS0+ZikKLSNlbmRpZgotCi0jZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKLSAgOjptZW1zZXQoJmZpcnN0LCAwLFwKLSAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCi19IHdoaWxlICgwKQotCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA2M3UpIHsKLSAgICBaUl8oY3R5cGVfLCBqc3R5cGVfKTsKLSAgICBaUl8ocGFja2VkXywgd2Vha18pOwotICB9Ci0KLSN1bmRlZiBaUl9IRUxQRVJfCi0jdW5kZWYgWlJfCi0KLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIEZpZWxkT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDE2MzgzKTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDgpIHsKLSAgICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkpOwotICAgICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZV9Jc1ZhbGlkKHZhbHVlKSkgewotICAgICAgICAgICAgc2V0X2N0eXBlKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSA+KHZhbHVlKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEsIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfcGFja2VkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTYpIHsKLSAgICAgICAgIHBhcnNlX3BhY2tlZDoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnBhY2tlZF8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19wYWNrZWQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9kZXByZWNhdGVkOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAodGFnID09IDI0KSB7Ci0gICAgICAgICBwYXJzZV9kZXByZWNhdGVkOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmZGVwcmVjYXRlZF8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19kZXByZWNhdGVkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MCkpIGdvdG8gcGFyc2VfbGF6eTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgICBjYXNlIDU6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA0MCkgewotICAgICAgICAgcGFyc2VfbGF6eToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmxhenlfKSkpOwotICAgICAgICAgIHNldF9oYXNfbGF6eSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDgpKSBnb3RvIHBhcnNlX2pzdHlwZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKLSAgICAgIGNhc2UgNjogewotICAgICAgICBpZiAodGFnID09IDQ4KSB7Ci0gICAgICAgICBwYXJzZV9qc3R5cGU6Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKLSAgICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQodmFsdWUpKSB7Ci0gICAgICAgICAgICBzZXRfanN0eXBlKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19KU1R5cGUgPih2YWx1ZSkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCg2LCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODApKSBnb3RvIHBhcnNlX3dlYWs7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgMTA6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA4MCkgewotICAgICAgICAgcGFyc2Vfd2VhazoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJndlYWtfKSkpOwotICAgICAgICAgIHNldF9oYXNfd2VhaygpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAodGFnID09IDc5OTQpIHsKLSAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7Ci0gICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQotICByZXR1cm4gdHJ1ZTsKLWZhaWx1cmU6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi0gIHJldHVybiBmYWxzZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBGaWVsZE9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKLSAgaWYgKGhhc19jdHlwZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKLSAgICAgIDEsIHRoaXMtPmN0eXBlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7Ci0gIGlmIChoYXNfcGFja2VkKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIsIHRoaXMtPnBhY2tlZCgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfbGF6eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCg1LCB0aGlzLT5sYXp5KCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07Ci0gIGlmIChoYXNfanN0eXBlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAotICAgICAgNiwgdGhpcy0+anN0eXBlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc193ZWFrKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDEwLCB0aGlzLT53ZWFrKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKLSAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpZWxkT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOwotICBpZiAoaGFzX2N0eXBlKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDEsIHRoaXMtPmN0eXBlKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7Ci0gIGlmIChoYXNfcGFja2VkKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5wYWNrZWQoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19sYXp5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg1LCB0aGlzLT5sYXp5KCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07Ci0gIGlmIChoYXNfanN0eXBlKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKLSAgICAgIDYsIHRoaXMtPmpzdHlwZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfd2VhaygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMTAsIHRoaXMtPndlYWsoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCi0gIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOwotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBGaWVsZE9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgNjN1KSB7Ci0gICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKLSAgICBpZiAoaGFzX2N0eXBlKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSh0aGlzLT5jdHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7Ci0gICAgaWYgKGhhc19wYWNrZWQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07Ci0gICAgaWYgKGhhc19qc3R5cGUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPmpzdHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotICAgIGlmIChoYXNfbGF6eSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKyAxOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc193ZWFrKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotCi0gIH0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKLSAgfQotCi0gIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEZpZWxkT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRmllbGRPcHRpb25zKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRmllbGRPcHRpb25zPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgRmllbGRPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19jdHlwZSgpKSB7Ci0gICAgICBzZXRfY3R5cGUoZnJvbS5jdHlwZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX3BhY2tlZCgpKSB7Ci0gICAgICBzZXRfcGFja2VkKGZyb20ucGFja2VkKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfanN0eXBlKCkpIHsKLSAgICAgIHNldF9qc3R5cGUoZnJvbS5qc3R5cGUoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19sYXp5KCkpIHsKLSAgICAgIHNldF9sYXp5KGZyb20ubGF6eSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2RlcHJlY2F0ZWQoKSkgewotICAgICAgc2V0X2RlcHJlY2F0ZWQoZnJvbS5kZXByZWNhdGVkKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfd2VhaygpKSB7Ci0gICAgICBzZXRfd2Vhayhmcm9tLndlYWsoKSk7Ci0gICAgfQotICB9Ci0gIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOwotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBGaWVsZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgRmllbGRPcHRpb25zOjpDb3B5RnJvbShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIEZpZWxkT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBGaWVsZE9wdGlvbnM6OlN3YXAoRmllbGRPcHRpb25zKiBvdGhlcikgewotICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBJbnRlcm5hbFN3YXAob3RoZXIpOwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OkludGVybmFsU3dhcChGaWVsZE9wdGlvbnMqIG90aGVyKSB7Ci0gIHN0ZDo6c3dhcChjdHlwZV8sIG90aGVyLT5jdHlwZV8pOwotICBzdGQ6OnN3YXAocGFja2VkXywgb3RoZXItPnBhY2tlZF8pOwotICBzdGQ6OnN3YXAoanN0eXBlXywgb3RoZXItPmpzdHlwZV8pOwotICBzdGQ6OnN3YXAobGF6eV8sIG90aGVyLT5sYXp5Xyk7Ci0gIHN0ZDo6c3dhcChkZXByZWNhdGVkXywgb3RoZXItPmRlcHJlY2F0ZWRfKTsKLSAgc3RkOjpzd2FwKHdlYWtfLCBvdGhlci0+d2Vha18pOwotICB1bmludGVycHJldGVkX29wdGlvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKLSAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Ci0gIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWVsZE9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEZpZWxkT3B0aW9uc19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEZpZWxkT3B0aW9uc19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0jaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBGaWVsZE9wdGlvbnMKLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKLWJvb2wgRmllbGRPcHRpb25zOjpoYXNfY3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfY3R5cGUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2N0eXBlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLXZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9jdHlwZSgpIHsKLSAgY3R5cGVfID0gMDsKLSAgY2xlYXJfaGFzX2N0eXBlKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpjdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlKQotICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlID4oY3R5cGVfKTsKLX0KLSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2N0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIHZhbHVlKSB7Ci0gIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIHNldF9oYXNfY3R5cGUoKTsKLSAgY3R5cGVfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5jdHlwZSkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOwotYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19wYWNrZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfcGFja2VkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19wYWNrZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX3BhY2tlZCgpIHsKLSAgcGFja2VkXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfcGFja2VkKCk7Ci19Ci0gYm9vbCBGaWVsZE9wdGlvbnM6OnBhY2tlZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnBhY2tlZCkKLSAgcmV0dXJuIHBhY2tlZF87Ci19Ci0gdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9wYWNrZWQoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX3BhY2tlZCgpOwotICBwYWNrZWRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5wYWNrZWQpCi19Ci0KLS8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKLWJvb2wgRmllbGRPcHRpb25zOjpoYXNfanN0eXBlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKLX0KLXZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX2pzdHlwZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLXZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9oYXNfanN0eXBlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKLX0KLXZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9qc3R5cGUoKSB7Ci0gIGpzdHlwZV8gPSAwOwotICBjbGVhcl9oYXNfanN0eXBlKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6anN0eXBlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlKQotICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSA+KGpzdHlwZV8pOwotfQotIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfanN0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSkgewotICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQodmFsdWUpKTsKLSAgc2V0X2hhc19qc3R5cGUoKTsKLSAganN0eXBlXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlKQotfQotCi0vLyBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19sYXp5KCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKLX0KLXZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX2xhenkoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7Ci19Ci12b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2xhenkoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2xhenkoKSB7Ci0gIGxhenlfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19sYXp5KCk7Ci19Ci0gYm9vbCBGaWVsZE9wdGlvbnM6OmxhenkoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5sYXp5KQotICByZXR1cm4gbGF6eV87Ci19Ci0gdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9sYXp5KGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19sYXp5KCk7Ci0gIGxhenlfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5sYXp5KQotfQotCi0vLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOwotYm9vbCBGaWVsZE9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKLX0KLXZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Ci19Ci12b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2RlcHJlY2F0ZWQoKSB7Ci0gIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7Ci19Ci0gYm9vbCBGaWVsZE9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5kZXByZWNhdGVkKQotICByZXR1cm4gZGVwcmVjYXRlZF87Ci19Ci0gdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19kZXByZWNhdGVkKCk7Ci0gIGRlcHJlY2F0ZWRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5kZXByZWNhdGVkKQotfQotCi0vLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKLWJvb2wgRmllbGRPcHRpb25zOjpoYXNfd2VhaygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7Ci19Ci12b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc193ZWFrKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OwotfQotdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc193ZWFrKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKLX0KLXZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl93ZWFrKCkgewotICB3ZWFrXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfd2VhaygpOwotfQotIGJvb2wgRmllbGRPcHRpb25zOjp3ZWFrKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMud2VhaykKLSAgcmV0dXJuIHdlYWtfOwotfQotIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfd2Vhayhib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfd2VhaygpOwotICB3ZWFrXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMud2VhaykKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotaW50IEZpZWxkT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Ci19Ci12b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBGaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmllbGRPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWVsZE9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLUZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1GaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgaW50IEVudW1PcHRpb25zOjprQWxsb3dBbGlhc0ZpZWxkTnVtYmVyOwotY29uc3QgaW50IEVudW1PcHRpb25zOjprRGVwcmVjYXRlZEZpZWxkTnVtYmVyOwotY29uc3QgaW50IEVudW1PcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1FbnVtT3B0aW9uczo6RW51bU9wdGlvbnMoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotfQotCi12b2lkIEVudW1PcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLUVudW1PcHRpb25zOjpFbnVtT3B0aW9ucyhjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKLX0KLQotdm9pZCBFbnVtT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGFsbG93X2FsaWFzXyA9IGZhbHNlOwotICBkZXByZWNhdGVkXyA9IGZhbHNlOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1FbnVtT3B0aW9uczo6fkVudW1PcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBFbnVtT3B0aW9uczo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEVudW1PcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bU9wdGlvbnM6OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gRW51bU9wdGlvbnNfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IEVudW1PcHRpb25zJiBFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotRW51bU9wdGlvbnMqIEVudW1PcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUVudW1PcHRpb25zKiBFbnVtT3B0aW9uczo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIEVudW1PcHRpb25zKiBuID0gbmV3IEVudW1PcHRpb25zOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obik7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgRW51bU9wdGlvbnM6OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcHVzaCIpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCi0gIF9fYnVpbHRpbl9vZmZzZXRvZihFbnVtT3B0aW9ucywgZikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCi0jZWxzZQotI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKLSAgJnJlaW50ZXJwcmV0X2Nhc3Q8RW51bU9wdGlvbnMqPigxNiktPmYpCi0jZW5kaWYKLQotI2RlZmluZSBaUl8oZmlyc3QsIGxhc3QpIGRvIHtcCi0gIDo6bWVtc2V0KCZmaXJzdCwgMCxcCi0gICAgICAgICAgIFpSX0hFTFBFUl8obGFzdCkgLSBaUl9IRUxQRVJfKGZpcnN0KSArIHNpemVvZihsYXN0KSk7XAotfSB3aGlsZSAoMCkKLQotICBaUl8oYWxsb3dfYWxpYXNfLCBkZXByZWNhdGVkXyk7Ci0KLSN1bmRlZiBaUl9IRUxQRVJfCi0jdW5kZWYgWlJfCi0KLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIEVudW1PcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKLSAgZm9yICg7OykgewotICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxNjM4Myk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTYpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmFsbG93X2FsaWFzXykpKTsKLSAgICAgICAgICBzZXRfaGFzX2FsbG93X2FsaWFzKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNCkpIGdvdG8gcGFyc2VfZGVwcmVjYXRlZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAyNCkgewotICAgICAgICAgcGFyc2VfZGVwcmVjYXRlZDoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmRlcHJlY2F0ZWRfKSkpOwotICAgICAgICAgIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAodGFnID09IDc5OTQpIHsKLSAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7Ci0gICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgRW51bU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotICAvLyBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMjsKLSAgaWYgKGhhc19hbGxvd19hbGlhcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgyLCB0aGlzLT5hbGxvd19hbGlhcygpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQotICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOwotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBFbnVtT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyOwotICBpZiAoaGFzX2FsbG93X2FsaWFzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5hbGxvd19hbGlhcygpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzLCB0aGlzLT5kZXByZWNhdGVkKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQotICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBFbnVtT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDN1KSB7Ci0gICAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7Ci0gICAgaWYgKGhhc19hbGxvd19hbGlhcygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKyAxOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gICAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gICAgfQotCi0gIH0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKLSAgfQotCi0gIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIEVudW1PcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IEVudW1PcHRpb25zKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRW51bU9wdGlvbnM+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgRW51bU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19hbGxvd19hbGlhcygpKSB7Ci0gICAgICBzZXRfYWxsb3dfYWxpYXMoZnJvbS5hbGxvd19hbGlhcygpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2RlcHJlY2F0ZWQoKSkgewotICAgICAgc2V0X2RlcHJlY2F0ZWQoZnJvbS5kZXByZWNhdGVkKCkpOwotICAgIH0KLSAgfQotICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKLSAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotICB9Ci19Ci0KLXZvaWQgRW51bU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBFbnVtT3B0aW9uczo6Q29weUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRW51bU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0KLSAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT51bmludGVycHJldGVkX29wdGlvbigpKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRW51bU9wdGlvbnM6OlN3YXAoRW51bU9wdGlvbnMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIEVudW1PcHRpb25zOjpJbnRlcm5hbFN3YXAoRW51bU9wdGlvbnMqIG90aGVyKSB7Ci0gIHN0ZDo6c3dhcChhbGxvd19hbGlhc18sIG90aGVyLT5hbGxvd19hbGlhc18pOwotICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEVudW1PcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBFbnVtT3B0aW9uc19kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IEVudW1PcHRpb25zX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIEVudW1PcHRpb25zCi0KLS8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyOwotYm9vbCBFbnVtT3B0aW9uczo6aGFzX2FsbG93X2FsaWFzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLXZvaWQgRW51bU9wdGlvbnM6OnNldF9oYXNfYWxsb3dfYWxpYXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIEVudW1PcHRpb25zOjpjbGVhcl9oYXNfYWxsb3dfYWxpYXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotdm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfYWxsb3dfYWxpYXMoKSB7Ci0gIGFsbG93X2FsaWFzXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfYWxsb3dfYWxpYXMoKTsKLX0KLSBib29sIEVudW1PcHRpb25zOjphbGxvd19hbGlhcygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMuYWxsb3dfYWxpYXMpCi0gIHJldHVybiBhbGxvd19hbGlhc187Ci19Ci0gdm9pZCBFbnVtT3B0aW9uczo6c2V0X2FsbG93X2FsaWFzKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19hbGxvd19hbGlhcygpOwotICBhbGxvd19hbGlhc18gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMuYWxsb3dfYWxpYXMpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci1ib29sIEVudW1PcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci12b2lkIEVudW1PcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci12b2lkIEVudW1PcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci12b2lkIEVudW1PcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgewotICBkZXByZWNhdGVkXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotfQotIGJvb2wgRW51bU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWQpCi0gIHJldHVybiBkZXByZWNhdGVkXzsKLX0KLSB2b2lkIEVudW1PcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBkZXByZWNhdGVkXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5kZXByZWNhdGVkKQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci1pbnQgRW51bU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOwotfQotdm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1PcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1PcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLUVudW1PcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotRW51bU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgRW51bVZhbHVlT3B0aW9uczo6a0RlcHJlY2F0ZWRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBFbnVtVmFsdWVPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1FbnVtVmFsdWVPcHRpb25zOjpFbnVtVmFsdWVPcHRpb25zKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotfQotCi12b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotRW51bVZhbHVlT3B0aW9uczo6RW51bVZhbHVlT3B0aW9ucyhjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCi19Ci0KLXZvaWQgRW51bVZhbHVlT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUVudW1WYWx1ZU9wdGlvbnM6On5FbnVtVmFsdWVPcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRW51bVZhbHVlT3B0aW9uczo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBFbnVtVmFsdWVPcHRpb25zJiBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1FbnVtVmFsdWVPcHRpb25zKiBFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZU9wdGlvbnM6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBFbnVtVmFsdWVPcHRpb25zKiBuID0gbmV3IEVudW1WYWx1ZU9wdGlvbnM7Ci0gIGlmIChhcmVuYSAhPSBOVUxMKSB7Ci0gICAgYXJlbmEtPk93bihuKTsKLSAgfQotICByZXR1cm4gbjsKLX0KLQotdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gOCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCAmZGVwcmVjYXRlZF8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19kZXByZWNhdGVkKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgICAgIGNhc2UgOTk5OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNzk5NCkgewotICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfdW5pbnRlcnByZXRlZF9vcHRpb246Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKLSAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCi0gICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLXN1Y2Nlc3M6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotICByZXR1cm4gdHJ1ZTsKLWZhaWx1cmU6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgRW51bVZhbHVlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKLSAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDEsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQotICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOwotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEVudW1WYWx1ZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMSwgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKLSAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBFbnVtVmFsdWVPcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7Ci0gIH0KLQotICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOwotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgRW51bVZhbHVlT3B0aW9ucyogc291cmNlID0gCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IEVudW1WYWx1ZU9wdGlvbnM+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgICBzZXRfZGVwcmVjYXRlZChmcm9tLmRlcHJlY2F0ZWQoKSk7Ci0gICAgfQotICB9Ci0gIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOwotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpDb3B5RnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgRW51bVZhbHVlT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpTd2FwKEVudW1WYWx1ZU9wdGlvbnMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkludGVybmFsU3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcikgewotICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEVudW1WYWx1ZU9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBFbnVtVmFsdWVPcHRpb25zX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIEVudW1WYWx1ZU9wdGlvbnMKLQotLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKLWJvb2wgRW51bVZhbHVlT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIEVudW1WYWx1ZU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLXZvaWQgRW51bVZhbHVlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLX0KLSBib29sIEVudW1WYWx1ZU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMuZGVwcmVjYXRlZCkKLSAgcmV0dXJuIGRlcHJlY2F0ZWRfOwotfQotIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy5kZXByZWNhdGVkKQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci1pbnQgRW51bVZhbHVlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Ci19Ci12b2lkIEVudW1WYWx1ZU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRW51bVZhbHVlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bVZhbHVlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1WYWx1ZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKLX0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCi1FbnVtVmFsdWVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1FbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgU2VydmljZU9wdGlvbnM6OmtEZXByZWNhdGVkRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgU2VydmljZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLVNlcnZpY2VPcHRpb25zOjpTZXJ2aWNlT3B0aW9ucygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCi19Ci0KLXZvaWQgU2VydmljZU9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotU2VydmljZU9wdGlvbnM6OlNlcnZpY2VPcHRpb25zKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotfQotCi12b2lkIFNlcnZpY2VPcHRpb25zOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotU2VydmljZU9wdGlvbnM6On5TZXJ2aWNlT3B0aW9ucygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgU2VydmljZU9wdGlvbnM6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlT3B0aW9uczo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFNlcnZpY2VPcHRpb25zOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBTZXJ2aWNlT3B0aW9ucyYgU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1TZXJ2aWNlT3B0aW9ucyogU2VydmljZU9wdGlvbnM6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBTZXJ2aWNlT3B0aW9ucyogbiA9IG5ldyBTZXJ2aWNlT3B0aW9uczsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIFNlcnZpY2VPcHRpb25zOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKLSAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7Ci0gIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBTZXJ2aWNlT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgMzM6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAyNjQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmRlcHJlY2F0ZWRfKSkpOwotICAgICAgICAgIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAodGFnID09IDc5OTQpIHsKLSAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7Ci0gICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgU2VydmljZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDMzLCB0aGlzLT5kZXByZWNhdGVkKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKLSAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VydmljZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKLSAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgU2VydmljZU9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgewotICAgIHRvdGFsX3NpemUgKz0gMiArIDE7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOwotICB9Ci0KLSAgdG90YWxfc2l6ZSArPSBfZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTsKLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgU2VydmljZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgU2VydmljZU9wdGlvbnMqIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBTZXJ2aWNlT3B0aW9ucz4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBTZXJ2aWNlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX2RlcHJlY2F0ZWQoKSkgewotICAgICAgc2V0X2RlcHJlY2F0ZWQoZnJvbS5kZXByZWNhdGVkKCkpOwotICAgIH0KLSAgfQotICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKLSAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotICB9Ci19Ci0KLXZvaWQgU2VydmljZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBTZXJ2aWNlT3B0aW9uczo6Q29weUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgU2VydmljZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0KLSAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT51bmludGVycHJldGVkX29wdGlvbigpKSkgcmV0dXJuIGZhbHNlOwotCi0gIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU2VydmljZU9wdGlvbnM6OlN3YXAoU2VydmljZU9wdGlvbnMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIFNlcnZpY2VPcHRpb25zOjpJbnRlcm5hbFN3YXAoU2VydmljZU9wdGlvbnMqIG90aGVyKSB7Ci0gIHN0ZDo6c3dhcChkZXByZWNhdGVkXywgb3RoZXItPmRlcHJlY2F0ZWRfKTsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICBfZXh0ZW5zaW9uc18uU3dhcCgmb3RoZXItPl9leHRlbnNpb25zXyk7Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgU2VydmljZU9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfOwotICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gU2VydmljZU9wdGlvbnNfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotLy8gU2VydmljZU9wdGlvbnMKLQotLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07Ci1ib29sIFNlcnZpY2VPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci12b2lkIFNlcnZpY2VPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci12b2lkIFNlcnZpY2VPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIFNlcnZpY2VPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgewotICBkZXByZWNhdGVkXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotfQotIGJvb2wgU2VydmljZU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLmRlcHJlY2F0ZWQpCi0gIHJldHVybiBkZXByZWNhdGVkXzsKLX0KLSB2b2lkIFNlcnZpY2VPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBkZXByZWNhdGVkXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy5kZXByZWNhdGVkKQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci1pbnQgU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOwotfQotdm9pZCBTZXJ2aWNlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBTZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIFNlcnZpY2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIFNlcnZpY2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLVNlcnZpY2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgTWV0aG9kT3B0aW9uczo6a0RlcHJlY2F0ZWRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBNZXRob2RPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1NZXRob2RPcHRpb25zOjpNZXRob2RPcHRpb25zKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQotfQotCi12b2lkIE1ldGhvZE9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotTWV0aG9kT3B0aW9uczo6TWV0aG9kT3B0aW9ucyhjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi19Ci0KLXZvaWQgTWV0aG9kT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLU1ldGhvZE9wdGlvbnM6On5NZXRob2RPcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIE1ldGhvZE9wdGlvbnM6OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBNZXRob2RPcHRpb25zOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogTWV0aG9kT3B0aW9uczo6ZGVzY3JpcHRvcigpIHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIHJldHVybiBNZXRob2RPcHRpb25zX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBNZXRob2RPcHRpb25zJiBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkgewotICBpZiAoZGVmYXVsdF9pbnN0YW5jZV8gPT0gTlVMTCkgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfOwotfQotCi1NZXRob2RPcHRpb25zKiBNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLU1ldGhvZE9wdGlvbnMqIE1ldGhvZE9wdGlvbnM6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBNZXRob2RPcHRpb25zKiBuID0gbmV3IE1ldGhvZE9wdGlvbnM7Ci0gIGlmIChhcmVuYSAhPSBOVUxMKSB7Ci0gICAgYXJlbmEtPk93bihuKTsKLSAgfQotICByZXR1cm4gbjsKLX0KLQotdm9pZCBNZXRob2RPcHRpb25zOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQotICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIE1ldGhvZE9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICAgIGNhc2UgMzM6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAyNjQpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmRlcHJlY2F0ZWRfKSkpOwotICAgICAgICAgIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAodGFnID09IDc5OTQpIHsKLSAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7Ci0gICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7Ci0gICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgICBjb250aW51ZTsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKLSAgcmV0dXJuIHRydWU7Ci1mYWlsdXJlOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIE1ldGhvZE9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMzMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQotICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOwotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIE1ldGhvZE9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDMzLCB0aGlzLT5kZXByZWNhdGVkKCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQotICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IE1ldGhvZE9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgdG90YWxfc2l6ZSArPSAyICsgMTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgdG90YWxfc2l6ZSArPSAyICogdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7Ci0gIH0KLQotICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOwotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBNZXRob2RPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgTWV0aG9kT3B0aW9ucyogc291cmNlID0gCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IE1ldGhvZE9wdGlvbnM+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIE1ldGhvZE9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfZGVwcmVjYXRlZCgpKSB7Ci0gICAgICBzZXRfZGVwcmVjYXRlZChmcm9tLmRlcHJlY2F0ZWQoKSk7Ci0gICAgfQotICB9Ci0gIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOwotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBNZXRob2RPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBNZXRob2RPcHRpb25zOjpDb3B5RnJvbShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgTWV0aG9kT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKSByZXR1cm4gZmFsc2U7Ci0KLSAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBNZXRob2RPcHRpb25zOjpTd2FwKE1ldGhvZE9wdGlvbnMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIE1ldGhvZE9wdGlvbnM6OkludGVybmFsU3dhcChNZXRob2RPcHRpb25zKiBvdGhlcikgewotICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIE1ldGhvZE9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBNZXRob2RPcHRpb25zX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIE1ldGhvZE9wdGlvbnMKLQotLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07Ci1ib29sIE1ldGhvZE9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLXZvaWQgTWV0aG9kT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OwotfQotdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIE1ldGhvZE9wdGlvbnM6OmNsZWFyX2RlcHJlY2F0ZWQoKSB7Ci0gIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7Ci19Ci0gYm9vbCBNZXRob2RPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLmRlcHJlY2F0ZWQpCi0gIHJldHVybiBkZXByZWNhdGVkXzsKLX0KLSB2b2lkIE1ldGhvZE9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19kZXByZWNhdGVkKCk7Ci0gIGRlcHJlY2F0ZWRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuZGVwcmVjYXRlZCkKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotaW50IE1ldGhvZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOwotfQotdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIE1ldGhvZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1ldGhvZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBNZXRob2RPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgotTWV0aG9kT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmtOYW1lUGFydEZpZWxkTnVtYmVyOwotY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmtJc0V4dGVuc2lvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotCi1VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydChjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi19Ci0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6U2hhcmVkQ3RvcigpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKLSAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIG5hbWVfcGFydF8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBpc19leHRlbnNpb25fID0gZmFsc2U7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLVVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6On5VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlNoYXJlZER0b3IoKSB7Ci0gIG5hbWVfcGFydF8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIG4gPSBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAzdSkgewotICAgIGlmIChoYXNfbmFtZV9wYXJ0KCkpIHsKLSAgICAgIG5hbWVfcGFydF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBpc19leHRlbnNpb25fID0gZmFsc2U7Ci0gIH0KLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotICB9Ci19Ci0KLWJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKLSAgZm9yICg7OykgewotICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWVfcGFydCgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT5uYW1lX3BhcnQoKS5kYXRhKCksIHRoaXMtPm5hbWVfcGFydCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0Iik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfaXNfZXh0ZW5zaW9uOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTYpIHsKLSAgICAgICAgIHBhcnNlX2lzX2V4dGVuc2lvbjoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmlzX2V4dGVuc2lvbl8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19pc19leHRlbnNpb24oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi0gIHJldHVybiBmYWxzZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICAvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKLSAgaWYgKGhhc19uYW1lX3BhcnQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkuZGF0YSgpLCB0aGlzLT5uYW1lX3BhcnQoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAxLCB0aGlzLT5uYW1lX3BhcnQoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIHJlcXVpcmVkIGJvb2wgaXNfZXh0ZW5zaW9uID0gMjsKLSAgaWYgKGhhc19pc19leHRlbnNpb24oKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMiwgdGhpcy0+aXNfZXh0ZW5zaW9uKCksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICAvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKLSAgaWYgKGhhc19uYW1lX3BhcnQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkuZGF0YSgpLCB0aGlzLT5uYW1lX3BhcnQoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+bmFtZV9wYXJ0KCksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7Ci0gIGlmIChoYXNfaXNfZXh0ZW5zaW9uKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5pc19leHRlbnNpb24oKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6UmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHJlcXVpcmVkX2ZpZWxkc19ieXRlX3NpemVfZmFsbGJhY2tfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoaGFzX25hbWVfcGFydCgpKSB7Ci0gICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7Ci0gICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICB0aGlzLT5uYW1lX3BhcnQoKSk7Ci0gIH0KLQotICBpZiAoaGFzX2lzX2V4dGVuc2lvbigpKSB7Ci0gICAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwotICAgIHRvdGFsX3NpemUgKz0gMSArIDE7Ci0gIH0KLQotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLWludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIGlmICgoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAzKSBeIDB4MDAwMDAwMDMpID09IDApIHsgIC8vIEFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCi0gICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7Ci0gICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICB0aGlzLT5uYW1lX3BhcnQoKSk7Ci0KLSAgICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7Ci0gICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLQotICB9IGVsc2UgewotICAgIHRvdGFsX3NpemUgKz0gUmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCk7Ci0gIH0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydD4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TWVyZ2VGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgaWYgKGZyb20uaGFzX25hbWVfcGFydCgpKSB7Ci0gICAgICBzZXRfaGFzX25hbWVfcGFydCgpOwotICAgICAgbmFtZV9wYXJ0Xy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV9wYXJ0Xyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19pc19leHRlbnNpb24oKSkgewotICAgICAgc2V0X2lzX2V4dGVuc2lvbihmcm9tLmlzX2V4dGVuc2lvbigpKTsKLSAgICB9Ci0gIH0KLSAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotICB9Ci19Ci0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Q29weUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIGlmICgoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDMpICE9IDB4MDAwMDAwMDMpIHJldHVybiBmYWxzZTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTd2FwKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkludGVybmFsU3dhcChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBvdGhlcikgewotICBuYW1lX3BhcnRfLlN3YXAoJm90aGVyLT5uYW1lX3BhcnRfKTsKLSAgc3RkOjpzd2FwKGlzX2V4dGVuc2lvbl8sIG90aGVyLT5pc19leHRlbnNpb25fKTsKLSAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7Ci0gIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfcmVmbGVjdGlvbl87Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OmtOYW1lRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0lkZW50aWZpZXJWYWx1ZUZpZWxkTnVtYmVyOwotY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OmtQb3NpdGl2ZUludFZhbHVlRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6a05lZ2F0aXZlSW50VmFsdWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprRG91YmxlVmFsdWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprU3RyaW5nVmFsdWVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprQWdncmVnYXRlVmFsdWVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLQotVW5pbnRlcnByZXRlZE9wdGlvbjo6VW5pbnRlcnByZXRlZE9wdGlvbigpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Ci19Ci0KLVVuaW50ZXJwcmV0ZWRPcHRpb246OlVuaW50ZXJwcmV0ZWRPcHRpb24oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKLSAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNoYXJlZEN0b3IoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBpZGVudGlmaWVyX3ZhbHVlXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIHBvc2l0aXZlX2ludF92YWx1ZV8gPSBHT09HTEVfVUxPTkdMT05HKDApOwotICBuZWdhdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX0xPTkdMT05HKDApOwotICBkb3VibGVfdmFsdWVfID0gMDsKLSAgc3RyaW5nX3ZhbHVlXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1VbmludGVycHJldGVkT3B0aW9uOjp+VW5pbnRlcnByZXRlZE9wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpTaGFyZWREdG9yKCkgewotICBpZGVudGlmaWVyX3ZhbHVlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBzdHJpbmdfdmFsdWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBVbmludGVycHJldGVkT3B0aW9uOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVVuaW50ZXJwcmV0ZWRPcHRpb24qIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKLQotVW5pbnRlcnByZXRlZE9wdGlvbiogVW5pbnRlcnByZXRlZE9wdGlvbjo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIFVuaW50ZXJwcmV0ZWRPcHRpb24qIG4gPSBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbjsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0jZGVmaW5lIFpSX0hFTFBFUl8oZikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAotICBfX2J1aWx0aW5fb2Zmc2V0b2YoVW5pbnRlcnByZXRlZE9wdGlvbiwgZikgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCi0jZWxzZQotI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKLSAgJnJlaW50ZXJwcmV0X2Nhc3Q8VW5pbnRlcnByZXRlZE9wdGlvbio+KDE2KS0+ZikKLSNlbmRpZgotCi0jZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKLSAgOjptZW1zZXQoJmZpcnN0LCAwLFwKLSAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCi19IHdoaWxlICgwKQotCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAxMjZ1KSB7Ci0gICAgWlJfKHBvc2l0aXZlX2ludF92YWx1ZV8sIGRvdWJsZV92YWx1ZV8pOwotICAgIGlmIChoYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7Ci0gICAgICBpZGVudGlmaWVyX3ZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKLSAgICAgIHN0cmluZ192YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICAgIH0KLSAgICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7Ci0gICAgICBhZ2dyZWdhdGVfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gIH0KLQotI3VuZGVmIFpSX0hFTFBFUl8KLSN1bmRlZiBaUl8KLQotICBuYW1lXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKLSAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAodGFnID09IDE4KSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfbmFtZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX25hbWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2xvb3BfbmFtZTsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9pZGVudGlmaWVyX3ZhbHVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOwotICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMjYpIHsKLSAgICAgICAgIHBhcnNlX2lkZW50aWZpZXJfdmFsdWU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2lkZW50aWZpZXJfdmFsdWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgICAgICAgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzIpKSBnb3RvIHBhcnNlX3Bvc2l0aXZlX2ludF92YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OwotICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMzIpIHsKLSAgICAgICAgIHBhcnNlX3Bvc2l0aXZlX2ludF92YWx1ZToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UNjQ+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJnBvc2l0aXZlX2ludF92YWx1ZV8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQwKSkgZ290byBwYXJzZV9uZWdhdGl2ZV9pbnRfdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OwotICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNDApIHsKLSAgICAgICAgIHBhcnNlX25lZ2F0aXZlX2ludF92YWx1ZToKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDY0PigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZuZWdhdGl2ZV9pbnRfdmFsdWVfKSkpOwotICAgICAgICAgIHNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0OSkpIGdvdG8gcGFyc2VfZG91YmxlX3ZhbHVlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA0OSkgewotICAgICAgICAgcGFyc2VfZG91YmxlX3ZhbHVlOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgZG91YmxlLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmRvdWJsZV92YWx1ZV8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19kb3VibGVfdmFsdWUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9zdHJpbmdfdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OwotICAgICAgY2FzZSA3OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNTgpIHsKLSAgICAgICAgIHBhcnNlX3N0cmluZ192YWx1ZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zdHJpbmdfdmFsdWUoKSkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX2FnZ3JlZ2F0ZV92YWx1ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OwotICAgICAgY2FzZSA4OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gNjYpIHsKLSAgICAgICAgIHBhcnNlX2FnZ3JlZ2F0ZV92YWx1ZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gIHJldHVybiBmYWxzZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bmFtZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMiwgdGhpcy0+bmFtZShpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKLSAgaWYgKGhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgMywgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7Ci0gIGlmIChoYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjQoNCwgdGhpcy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OwotICBpZiAoaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjQoNSwgdGhpcy0+bmVnYXRpdmVfaW50X3ZhbHVlKCksIG91dHB1dCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKLSAgaWYgKGhhc19kb3VibGVfdmFsdWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZSg2LCB0aGlzLT5kb3VibGVfdmFsdWUoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7Ci0gIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlc01heWJlQWxpYXNlZCgKLSAgICAgIDcsIHRoaXMtPnN0cmluZ192YWx1ZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7Ci0gIGlmIChoYXNfYWdncmVnYXRlX3ZhbHVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgOCwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBVbmludGVycHJldGVkT3B0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bmFtZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5uYW1lKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOwotICBpZiAoaGFzX2lkZW50aWZpZXJfdmFsdWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMywgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7Ci0gIGlmIChoYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KDQsIHRoaXMtPnBvc2l0aXZlX2ludF92YWx1ZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKLSAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSg1LCB0aGlzLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OwotICBpZiAoaGFzX2RvdWJsZV92YWx1ZSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlVG9BcnJheSg2LCB0aGlzLT5kb3VibGVfdmFsdWUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7Ci0gIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXNUb0FycmF5KAotICAgICAgICA3LCB0aGlzLT5zdHJpbmdfdmFsdWUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OwotICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAotICAgICAgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICA4LCB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gIGludCB0b3RhbF9zaXplID0gMDsKLQotICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgMTI2dSkgewotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKLSAgICBpZiAoaGFzX2lkZW50aWZpZXJfdmFsdWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCB1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlID0gNDsKLSAgICBpZiAoaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VUludDY0U2l6ZSgKLSAgICAgICAgICB0aGlzLT5wb3NpdGl2ZV9pbnRfdmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKLSAgICBpZiAoaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50NjRTaXplKAotICAgICAgICAgIHRoaXMtPm5lZ2F0aXZlX2ludF92YWx1ZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKLSAgICBpZiAoaGFzX2RvdWJsZV92YWx1ZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKyA4OwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7Ci0gICAgaWYgKGhhc19zdHJpbmdfdmFsdWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkJ5dGVzU2l6ZSgKLSAgICAgICAgICB0aGlzLT5zdHJpbmdfdmFsdWUoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7Ci0gICAgaWYgKGhhc19hZ2dyZWdhdGVfdmFsdWUoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkpOwotICAgIH0KLQotICB9Ci0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKLSAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bmFtZV9zaXplKCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmFtZV9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+bmFtZShpKSk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24qIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBVbmludGVycHJldGVkT3B0aW9uPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIG5hbWVfLk1lcmdlRnJvbShmcm9tLm5hbWVfKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKLSAgICAgIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOwotICAgICAgaWRlbnRpZmllcl92YWx1ZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmlkZW50aWZpZXJfdmFsdWVfKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7Ci0gICAgICBzZXRfcG9zaXRpdmVfaW50X3ZhbHVlKGZyb20ucG9zaXRpdmVfaW50X3ZhbHVlKCkpOwotICAgIH0KLSAgICBpZiAoZnJvbS5oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKLSAgICAgIHNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoZnJvbS5uZWdhdGl2ZV9pbnRfdmFsdWUoKSk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19kb3VibGVfdmFsdWUoKSkgewotICAgICAgc2V0X2RvdWJsZV92YWx1ZShmcm9tLmRvdWJsZV92YWx1ZSgpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX3N0cmluZ192YWx1ZSgpKSB7Ci0gICAgICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOwotICAgICAgc3RyaW5nX3ZhbHVlXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uc3RyaW5nX3ZhbHVlXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19hZ2dyZWdhdGVfdmFsdWUoKSkgewotICAgICAgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgICAgIGFnZ3JlZ2F0ZV92YWx1ZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmFnZ3JlZ2F0ZV92YWx1ZV8pOwotICAgIH0KLSAgfQotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPm5hbWUoKSkpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6U3dhcChVbmludGVycHJldGVkT3B0aW9uKiBvdGhlcikgewotICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBJbnRlcm5hbFN3YXAob3RoZXIpOwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpJbnRlcm5hbFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiogb3RoZXIpIHsKLSAgbmFtZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+bmFtZV8pOwotICBpZGVudGlmaWVyX3ZhbHVlXy5Td2FwKCZvdGhlci0+aWRlbnRpZmllcl92YWx1ZV8pOwotICBzdGQ6OnN3YXAocG9zaXRpdmVfaW50X3ZhbHVlXywgb3RoZXItPnBvc2l0aXZlX2ludF92YWx1ZV8pOwotICBzdGQ6OnN3YXAobmVnYXRpdmVfaW50X3ZhbHVlXywgb3RoZXItPm5lZ2F0aXZlX2ludF92YWx1ZV8pOwotICBzdGQ6OnN3YXAoZG91YmxlX3ZhbHVlXywgb3RoZXItPmRvdWJsZV92YWx1ZV8pOwotICBzdHJpbmdfdmFsdWVfLlN3YXAoJm90aGVyLT5zdHJpbmdfdmFsdWVfKTsKLSAgYWdncmVnYXRlX3ZhbHVlXy5Td2FwKCZvdGhlci0+YWdncmVnYXRlX3ZhbHVlXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFVuaW50ZXJwcmV0ZWRPcHRpb246OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IFVuaW50ZXJwcmV0ZWRPcHRpb25fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBVbmludGVycHJldGVkT3B0aW9uX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLSNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKLS8vIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQKLQotLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7Ci1ib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Omhhc19uYW1lX3BhcnQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaGFzX25hbWVfcGFydCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfaGFzX25hbWVfcGFydCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX25hbWVfcGFydCgpIHsKLSAgbmFtZV9wYXJ0Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19uYW1lX3BhcnQoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpuYW1lX3BhcnQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQotICByZXR1cm4gbmFtZV9wYXJ0Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfbmFtZV9wYXJ0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIG5hbWVfcGFydF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCi19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfbmFtZV9wYXJ0KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIG5hbWVfcGFydF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKLX0KLSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9uYW1lX3BhcnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIG5hbWVfcGFydF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQotfQotIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Om11dGFibGVfbmFtZV9wYXJ0KCkgewotICBzZXRfaGFzX25hbWVfcGFydCgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCi0gIHJldHVybiBuYW1lX3BhcnRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6cmVsZWFzZV9uYW1lX3BhcnQoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKLSAgY2xlYXJfaGFzX25hbWVfcGFydCgpOwotICByZXR1cm4gbmFtZV9wYXJ0Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2FsbG9jYXRlZF9uYW1lX3BhcnQoOjpzdGQ6OnN0cmluZyogbmFtZV9wYXJ0KSB7Ci0gIGlmIChuYW1lX3BhcnQgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWVfcGFydCgpOwotICB9Ci0gIG5hbWVfcGFydF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWVfcGFydCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKLX0KLQotLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwotYm9vbCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpoYXNfaXNfZXh0ZW5zaW9uKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2hhc19pc19leHRlbnNpb24oKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX2hhc19pc19leHRlbnNpb24oKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpjbGVhcl9pc19leHRlbnNpb24oKSB7Ci0gIGlzX2V4dGVuc2lvbl8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2lzX2V4dGVuc2lvbigpOwotfQotIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6aXNfZXh0ZW5zaW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0LmlzX2V4dGVuc2lvbikKLSAgcmV0dXJuIGlzX2V4dGVuc2lvbl87Ci19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaXNfZXh0ZW5zaW9uKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19pc19leHRlbnNpb24oKTsKLSAgaXNfZXh0ZW5zaW9uXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0LmlzX2V4dGVuc2lvbikKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBVbmludGVycHJldGVkT3B0aW9uCi0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKLWludCBVbmludGVycHJldGVkT3B0aW9uOjpuYW1lX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXy5zaXplKCk7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIFVuaW50ZXJwcmV0ZWRPcHRpb246Om5hbWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfbmFtZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBVbmludGVycHJldGVkT3B0aW9uOjphZGRfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQotICByZXR1cm4gbmFtZV8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgotVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCi0gIHJldHVybiAmbmFtZV87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+JgotVW5pbnRlcnByZXRlZE9wdGlvbjo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmFtZSkKLSAgcmV0dXJuIG5hbWVfOwotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7Ci1ib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19pZGVudGlmaWVyX3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2lkZW50aWZpZXJfdmFsdWUoKSB7Ci0gIGlkZW50aWZpZXJfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjppZGVudGlmaWVyX3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCi0gIHJldHVybiBpZGVudGlmaWVyX3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgaWRlbnRpZmllcl92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQotfQotIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIGlkZW50aWZpZXJfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQotfQotIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOwotICBpZGVudGlmaWVyX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQotfQotIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpIHsKLSAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCi0gIHJldHVybiBpZGVudGlmaWVyX3ZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246OnJlbGVhc2VfaWRlbnRpZmllcl92YWx1ZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSkKLSAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgcmV0dXJuIGlkZW50aWZpZXJfdmFsdWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWxsb2NhdGVkX2lkZW50aWZpZXJfdmFsdWUoOjpzdGQ6OnN0cmluZyogaWRlbnRpZmllcl92YWx1ZSkgewotICBpZiAoaWRlbnRpZmllcl92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgfQotICBpZGVudGlmaWVyX3ZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgaWRlbnRpZmllcl92YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCi19Ci0KLS8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OwotYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9wb3NpdGl2ZV9pbnRfdmFsdWUoKSB7Ci0gIHBvc2l0aXZlX2ludF92YWx1ZV8gPSBHT09HTEVfVUxPTkdMT05HKDApOwotICBjbGVhcl9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgVW5pbnRlcnByZXRlZE9wdGlvbjo6cG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnBvc2l0aXZlX2ludF92YWx1ZSkKLSAgcmV0dXJuIHBvc2l0aXZlX2ludF92YWx1ZV87Ci19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfcG9zaXRpdmVfaW50X3ZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IHZhbHVlKSB7Ci0gIHNldF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7Ci0gIHBvc2l0aXZlX2ludF92YWx1ZV8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5wb3NpdGl2ZV9pbnRfdmFsdWUpCi19Ci0KLS8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7Ci1ib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX25lZ2F0aXZlX2ludF92YWx1ZSgpIHsKLSAgbmVnYXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKLSAgY2xlYXJfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpOwotfQotIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgVW5pbnRlcnByZXRlZE9wdGlvbjo6bmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5lZ2F0aXZlX2ludF92YWx1ZSkKLSAgcmV0dXJuIG5lZ2F0aXZlX2ludF92YWx1ZV87Ci19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfbmVnYXRpdmVfaW50X3ZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpIHsKLSAgc2V0X2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKLSAgbmVnYXRpdmVfaW50X3ZhbHVlXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5lZ2F0aXZlX2ludF92YWx1ZSkKLX0KLQotLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7Ci1ib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19kb3VibGVfdmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX2RvdWJsZV92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX2RvdWJsZV92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2RvdWJsZV92YWx1ZSgpIHsKLSAgZG91YmxlX3ZhbHVlXyA9IDA7Ci0gIGNsZWFyX2hhc19kb3VibGVfdmFsdWUoKTsKLX0KLSBkb3VibGUgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZG91YmxlX3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmRvdWJsZV92YWx1ZSkKLSAgcmV0dXJuIGRvdWJsZV92YWx1ZV87Ci19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSkgewotICBzZXRfaGFzX2RvdWJsZV92YWx1ZSgpOwotICBkb3VibGVfdmFsdWVfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uZG91YmxlX3ZhbHVlKQotfQotCi0vLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OwotYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfc3RyaW5nX3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19zdHJpbmdfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9zdHJpbmdfdmFsdWUoKSB7Ci0gIHN0cmluZ192YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6c3RyaW5nX3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKLSAgcmV0dXJuIHN0cmluZ192YWx1ZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3N0cmluZ192YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOwotICBzdHJpbmdfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQotfQotIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3N0cmluZ192YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOwotICBzdHJpbmdfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCi19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOwotICBzdHJpbmdfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKLX0KLSA6OnN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uOjptdXRhYmxlX3N0cmluZ192YWx1ZSgpIHsKLSAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQotICByZXR1cm4gc3RyaW5nX3ZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246OnJlbGVhc2Vfc3RyaW5nX3ZhbHVlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCi0gIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgcmV0dXJuIHN0cmluZ192YWx1ZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hbGxvY2F0ZWRfc3RyaW5nX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIHN0cmluZ192YWx1ZSkgewotICBpZiAoc3RyaW5nX3ZhbHVlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgfQotICBzdHJpbmdfdmFsdWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBzdHJpbmdfdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OwotYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpoYXNfYWdncmVnYXRlX3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKLX0KLXZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Ci19Ci12b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OwotfQotdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9hZ2dyZWdhdGVfdmFsdWUoKSB7Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6YWdncmVnYXRlX3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKLSAgcmV0dXJuIGFnZ3JlZ2F0ZV92YWx1ZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICBhZ2dyZWdhdGVfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQotfQotIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICBhZ2dyZWdhdGVfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCi19Ci0gdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICBhZ2dyZWdhdGVfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKLX0KLSA6OnN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uOjptdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKLSAgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQotICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246OnJlbGVhc2VfYWdncmVnYXRlX3ZhbHVlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCi0gIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgcmV0dXJuIGFnZ3JlZ2F0ZV92YWx1ZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hbGxvY2F0ZWRfYWdncmVnYXRlX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZSkgewotICBpZiAoYWdncmVnYXRlX3ZhbHVlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgfQotICBhZ2dyZWdhdGVfdmFsdWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBhZ2dyZWdhdGVfdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCi19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi1jb25zdCBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmtQYXRoRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmtTcGFuRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmtMZWFkaW5nQ29tbWVudHNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a1RyYWlsaW5nQ29tbWVudHNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a0xlYWRpbmdEZXRhY2hlZENvbW1lbnRzRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLVNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbigpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCi19Ci0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTaGFyZWRDdG9yKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbGVhZGluZ19jb21tZW50c18uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICB0cmFpbGluZ19jb21tZW50c18uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6flNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2hhcmVkRHRvcigpIHsKLSAgbGVhZGluZ19jb21tZW50c18uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgdHJhaWxpbmdfY29tbWVudHNfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogbiA9IG5ldyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDEydSkgewotICAgIGlmIChoYXNfbGVhZGluZ19jb21tZW50cygpKSB7Ci0gICAgICBsZWFkaW5nX2NvbW1lbnRzXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gICAgfQotICAgIGlmIChoYXNfdHJhaWxpbmdfY29tbWVudHMoKSkgewotICAgICAgdHJhaWxpbmdfY29tbWVudHNfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gIH0KLSAgcGF0aF8uQ2xlYXIoKTsKLSAgc3Bhbl8uQ2xlYXIoKTsKLSAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQ2xlYXIoKTsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOwotICB9Ci19Ci0KLWJvb2wgU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3BhdGgoKSkpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gOCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgMSwgMTAsIGlucHV0LCB0aGlzLT5tdXRhYmxlX3BhdGgoKSkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9zcGFuOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOwotICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTgpIHsKLSAgICAgICAgIHBhcnNlX3NwYW46Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3NwYW4oKSkpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gMTYpIHsKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIDEsIDE4LCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zcGFuKCkpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfbGVhZGluZ19jb21tZW50czsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAodGFnID09IDI2KSB7Ci0gICAgICAgICBwYXJzZV9sZWFkaW5nX2NvbW1lbnRzOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKS5kYXRhKCksIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfdHJhaWxpbmdfY29tbWVudHM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OwotICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMzQpIHsKLSAgICAgICAgIHBhcnNlX3RyYWlsaW5nX2NvbW1lbnRzOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV90cmFpbGluZ19jb21tZW50cygpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICAgICAgICB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAotICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHM7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7Ci0gICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKHRhZyA9PSA1MCkgewotICAgICAgICAgcGFyc2VfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50czoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCi0gICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHModGhpcy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50c19zaXplKCkgLSAxKS5kYXRhKCksCi0gICAgICAgICAgICB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIC0gMSkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKLSAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHM7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQotICByZXR1cm4gdHJ1ZTsKLWZhaWx1cmU6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOwotICBpZiAodGhpcy0+cGF0aF9zaXplKCkgPiAwKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKDEsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOwotICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXyk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wYXRoX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZygKLSAgICAgIHRoaXMtPnBhdGgoaSksIG91dHB1dCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07Ci0gIGlmICh0aGlzLT5zcGFuX3NpemUoKSA+IDApIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7Ci0gICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNwYW5fc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnKAotICAgICAgdGhpcy0+c3BhbihpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKLSAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKS5kYXRhKCksIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cyIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIDMsIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFpbGluZ19jb21tZW50cyA9IDQ7Ci0gIGlmIChoYXNfdHJhaWxpbmdfY29tbWVudHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKS5kYXRhKCksIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzIik7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAotICAgICAgNCwgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGkpLmRhdGEoKSwgdGhpcy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyIpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKLSAgICAgIDYsIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaSksIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQotICAvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07Ci0gIGlmICh0aGlzLT5wYXRoX3NpemUoKSA+IDApIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgICAgdGFyZ2V0KTsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCi0gICAgICBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXywgdGFyZ2V0KTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnBhdGhfc2l6ZSgpOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZUludDMyTm9UYWdUb0FycmF5KHRoaXMtPnBhdGgoaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07Ci0gIGlmICh0aGlzLT5zcGFuX3NpemUoKSA+IDApIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgMiwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgICAgdGFyZ2V0KTsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCi0gICAgICBfc3Bhbl9jYWNoZWRfYnl0ZV9zaXplXywgdGFyZ2V0KTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNwYW5fc2l6ZSgpOyBpKyspIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICBXcml0ZUludDMyTm9UYWdUb0FycmF5KHRoaXMtPnNwYW4oaSksIHRhcmdldCk7Ci0gIH0KLQotICAvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7Ci0gIGlmIChoYXNfbGVhZGluZ19jb21tZW50cygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCkuZGF0YSgpLCB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgMywgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKLSAgaWYgKGhhc190cmFpbGluZ19jb21tZW50cygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMiKTsKLSAgICB0YXJnZXQgPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICAgICAgNCwgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGkpLmRhdGEoKSwgdGhpcy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyIpOwotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlU3RyaW5nVG9BcnJheSg2LCB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQotICByZXR1cm4gdGFyZ2V0OwotfQotCi1pbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIGlmIChfaGFzX2JpdHNfWzIgLyAzMl0gJiAxMnUpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7Ci0gICAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKSk7Ci0gICAgfQotCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKLSAgICBpZiAoaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCkpOwotICAgIH0KLQotICB9Ci0gIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgewotICAgIGludCBkYXRhX3NpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cGF0aF9zaXplKCk7IGkrKykgewotICAgICAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgICAgSW50MzJTaXplKHRoaXMtPnBhdGgoaSkpOwotICAgIH0KLSAgICBpZiAoZGF0YV9zaXplID4gMCkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShkYXRhX3NpemUpOwotICAgIH0KLSAgICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICAgIF9wYXRoX2NhY2hlZF9ieXRlX3NpemVfID0gZGF0YV9zaXplOwotICAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICAgIHRvdGFsX3NpemUgKz0gZGF0YV9zaXplOwotICB9Ci0KLSAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOwotICB7Ci0gICAgaW50IGRhdGFfc2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5zcGFuX3NpemUoKTsgaSsrKSB7Ci0gICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgICBJbnQzMlNpemUodGhpcy0+c3BhbihpKSk7Ci0gICAgfQotICAgIGlmIChkYXRhX3NpemUgPiAwKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGRhdGFfc2l6ZSk7Ci0gICAgfQotICAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gICAgX3NwYW5fY2FjaGVkX2J5dGVfc2l6ZV8gPSBkYXRhX3NpemU7Ci0gICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gICAgdG90YWxfc2l6ZSArPSBkYXRhX3NpemU7Ci0gIH0KLQotICAvLyByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpOyBpKyspIHsKLSAgICB0b3RhbF9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgdGhpcy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpKSk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbj4oCi0gICAgICAgICAgJmZyb20pOwotICBpZiAoc291cmNlID09IE5VTEwpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKLSAgfSBlbHNlIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIHBhdGhfLk1lcmdlRnJvbShmcm9tLnBhdGhfKTsKLSAgc3Bhbl8uTWVyZ2VGcm9tKGZyb20uc3Bhbl8pOwotICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5NZXJnZUZyb20oZnJvbS5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXyk7Ci0gIGlmIChmcm9tLl9oYXNfYml0c19bMiAvIDMyXSAmICgweGZmdSA8PCAoMiAlIDMyKSkpIHsKLSAgICBpZiAoZnJvbS5oYXNfbGVhZGluZ19jb21tZW50cygpKSB7Ci0gICAgICBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgICAgIGxlYWRpbmdfY29tbWVudHNfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5sZWFkaW5nX2NvbW1lbnRzXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc190cmFpbGluZ19jb21tZW50cygpKSB7Ci0gICAgICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gICAgICB0cmFpbGluZ19jb21tZW50c18uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnRyYWlsaW5nX2NvbW1lbnRzXyk7Ci0gICAgfQotICB9Ci0gIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKLSAgfQotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkNvcHlGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi1ib29sIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTd2FwKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBvdGhlcikgewotICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBJbnRlcm5hbFN3YXAob3RoZXIpOwotfQotdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6SW50ZXJuYWxTd2FwKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBvdGhlcikgewotICBwYXRoXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5wYXRoXyk7Ci0gIHNwYW5fLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnNwYW5fKTsKLSAgbGVhZGluZ19jb21tZW50c18uU3dhcCgmb3RoZXItPmxlYWRpbmdfY29tbWVudHNfKTsKLSAgdHJhaWxpbmdfY29tbWVudHNfLlN3YXAoJm90aGVyLT50cmFpbGluZ19jb21tZW50c18pOwotICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKLSAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7Ci0gIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZXNjcmlwdG9yXzsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBTb3VyY2VDb2RlSW5mbzo6a0xvY2F0aW9uRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLVNvdXJjZUNvZGVJbmZvOjpTb3VyY2VDb2RlSW5mbygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi19Ci0KLXZvaWQgU291cmNlQ29kZUluZm86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKLX0KLQotU291cmNlQ29kZUluZm86OlNvdXJjZUNvZGVJbmZvKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAotICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewotICBTaGFyZWRDdG9yKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvOjpTaGFyZWRDdG9yKCkgewotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLX0KLQotU291cmNlQ29kZUluZm86On5Tb3VyY2VDb2RlSW5mbygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQotICBTaGFyZWREdG9yKCk7Ci19Ci0KLXZvaWQgU291cmNlQ29kZUluZm86OlNoYXJlZER0b3IoKSB7Ci0gIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7Ci0gIH0KLX0KLQotdm9pZCBTb3VyY2VDb2RlSW5mbzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIFNvdXJjZUNvZGVJbmZvOjpkZXNjcmlwdG9yKCkgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgcmV0dXJuIFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfOwotfQotCi1jb25zdCBTb3VyY2VDb2RlSW5mbyYgU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Ci19Ci0KLVNvdXJjZUNvZGVJbmZvKiBTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1Tb3VyY2VDb2RlSW5mbyogU291cmNlQ29kZUluZm86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBTb3VyY2VDb2RlSW5mbyogbiA9IG5ldyBTb3VyY2VDb2RlSW5mbzsKLSAgaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgICBhcmVuYS0+T3duKG4pOwotICB9Ci0gIHJldHVybiBuOwotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvOjpDbGVhcigpIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKLSAgbG9jYXRpb25fLkNsZWFyKCk7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKLSAgfQotfQotCi1ib29sIFNvdXJjZUNvZGVJbmZvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKLSAgZm9yICg7OykgewotICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOwotICAgIHRhZyA9IHAuZmlyc3Q7Ci0gICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKLSAgICAgICAgIHBhcnNlX2xvb3BfbG9jYXRpb246Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9sb2NhdGlvbigpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMCkpIGdvdG8gcGFyc2VfbG9vcF9sb2NhdGlvbjsKLSAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQotICByZXR1cm4gdHJ1ZTsKLWZhaWx1cmU6Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKLSAgcmV0dXJuIGZhbHNlOwotI3VuZGVmIERPXwotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bG9jYXRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDEsIHRoaXMtPmxvY2F0aW9uKGkpLCBvdXRwdXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi19Ci0KLTo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNvdXJjZUNvZGVJbmZvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bG9jYXRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMSwgdGhpcy0+bG9jYXRpb24oaSksIHRhcmdldCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBTb3VyY2VDb2RlSW5mbzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7Ci0gIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmxvY2F0aW9uX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5sb2NhdGlvbl9zaXplKCk7IGkrKykgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgdGhpcy0+bG9jYXRpb24oaSkpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKLSAgfQotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi12b2lkIFNvdXJjZUNvZGVJbmZvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBzb3VyY2UgPSAKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgU291cmNlQ29kZUluZm8+KAotICAgICAgICAgICZmcm9tKTsKLSAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi0gICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwotICB9Ci19Ci0KLXZvaWQgU291cmNlQ29kZUluZm86Ok1lcmdlRnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBsb2NhdGlvbl8uTWVyZ2VGcm9tKGZyb20ubG9jYXRpb25fKTsKLSAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOwotICB9Ci19Ci0KLXZvaWQgU291cmNlQ29kZUluZm86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBTb3VyY2VDb2RlSW5mbzo6Q29weUZyb20oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgU291cmNlQ29kZUluZm86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgU291cmNlQ29kZUluZm86OlN3YXAoU291cmNlQ29kZUluZm8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIFNvdXJjZUNvZGVJbmZvOjpJbnRlcm5hbFN3YXAoU291cmNlQ29kZUluZm8qIG90aGVyKSB7Ci0gIGxvY2F0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5sb2NhdGlvbl8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBTb3VyY2VDb2RlSW5mbzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBTb3VyY2VDb2RlSW5mb19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0jaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbgotCi0vLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07Ci1pbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGhfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHBhdGhfLnNpemUoKTsKLX0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX3BhdGgoKSB7Ci0gIHBhdGhfLkNsZWFyKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKLSAgcmV0dXJuIHBhdGhfLkdldChpbmRleCk7Ci19Ci0gdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3BhdGgoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHBhdGhfLlNldChpbmRleCwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQotfQotIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9wYXRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgcGF0aF8uQWRkKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKLX0KLSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLVNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpwYXRoKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKLSAgcmV0dXJuIHBhdGhfOwotfQotIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgotU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfcGF0aCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKLSAgcmV0dXJuICZwYXRoXzsKLX0KLQotLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOwotaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzcGFuXy5zaXplKCk7Ci19Ci12b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9zcGFuKCkgewotICBzcGFuXy5DbGVhcigpOwotfQotIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW4oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCi0gIHJldHVybiBzcGFuXy5HZXQoaW5kZXgpOwotfQotIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9zcGFuKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzcGFuXy5TZXQoaW5kZXgsIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24uc3BhbikKLX0KLSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfc3Bhbig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHNwYW5fLkFkZCh2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCi19Ci0gY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c3BhbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCi0gIHJldHVybiBzcGFuXzsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKLVNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX3NwYW4oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCi0gIHJldHVybiAmc3Bhbl87Ci19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKLWJvb2wgU291cmNlQ29kZUluZm9fTG9jYXRpb246Omhhc19sZWFkaW5nX2NvbW1lbnRzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKLX0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX2hhc19sZWFkaW5nX2NvbW1lbnRzKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKLX0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX2xlYWRpbmdfY29tbWVudHMoKSB7Ci0gIGxlYWRpbmdfY29tbWVudHNfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bGVhZGluZ19jb21tZW50cygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKLSAgcmV0dXJuIGxlYWRpbmdfY29tbWVudHNfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19jb21tZW50cyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgbGVhZGluZ19jb21tZW50c18uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKLX0KLSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgbGVhZGluZ19jb21tZW50c18uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQotfQotIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgbGVhZGluZ19jb21tZW50c18uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCi19Ci0gOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfbGVhZGluZ19jb21tZW50cygpIHsKLSAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQotICByZXR1cm4gbGVhZGluZ19jb21tZW50c18uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSA6OnN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cmVsZWFzZV9sZWFkaW5nX2NvbW1lbnRzKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKLSAgY2xlYXJfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgcmV0dXJuIGxlYWRpbmdfY29tbWVudHNfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2FsbG9jYXRlZF9sZWFkaW5nX2NvbW1lbnRzKDo6c3RkOjpzdHJpbmcqIGxlYWRpbmdfY29tbWVudHMpIHsKLSAgaWYgKGxlYWRpbmdfY29tbWVudHMgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7Ci0gIH0KLSAgbGVhZGluZ19jb21tZW50c18uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGxlYWRpbmdfY29tbWVudHMpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKLWJvb2wgU291cmNlQ29kZUluZm9fTG9jYXRpb246Omhhc190cmFpbGluZ19jb21tZW50cygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci12b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OwotfQotdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKLX0KLXZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX3RyYWlsaW5nX2NvbW1lbnRzKCkgewotICB0cmFpbGluZ19jb21tZW50c18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6dHJhaWxpbmdfY29tbWVudHMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQotICByZXR1cm4gdHJhaWxpbmdfY29tbWVudHNfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOwotICB0cmFpbGluZ19jb21tZW50c18uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci0gdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKLSAgdHJhaWxpbmdfY29tbWVudHNfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci0gdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gIHRyYWlsaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci0gOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKSB7Ci0gIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQotICByZXR1cm4gdHJhaWxpbmdfY29tbWVudHNfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246OnJlbGVhc2VfdHJhaWxpbmdfY29tbWVudHMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKLSAgY2xlYXJfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gIHJldHVybiB0cmFpbGluZ19jb21tZW50c18uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfYWxsb2NhdGVkX3RyYWlsaW5nX2NvbW1lbnRzKDo6c3RkOjpzdHJpbmcqIHRyYWlsaW5nX2NvbW1lbnRzKSB7Ci0gIGlmICh0cmFpbGluZ19jb21tZW50cyAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc190cmFpbGluZ19jb21tZW50cygpOwotICB9Ci0gIHRyYWlsaW5nX2NvbW1lbnRzXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdHJhaWxpbmdfY29tbWVudHMpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci0KLS8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKLWludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bGVhZGluZ19kZXRhY2hlZF9jb21tZW50c19zaXplKCkgY29uc3QgewotICByZXR1cm4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uc2l6ZSgpOwotfQotdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIHsKLSAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQ2xlYXIoKTsKLX0KLSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLSAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkdldChpbmRleCk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCi0gIHJldHVybiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5NdXRhYmxlKGluZGV4KTsKLX0KLSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCi0gIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLX0KLSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLX0KLSA6OnN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLSAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkFkZCgpOwotfQotIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQotfQotIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCi19Ci0gdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQotfQotIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCi0gIHJldHVybiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXzsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgotU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLSAgcmV0dXJuICZsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTb3VyY2VDb2RlSW5mbwotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKLWludCBTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxvY2F0aW9uXy5zaXplKCk7Ci19Ci12b2lkIFNvdXJjZUNvZGVJbmZvOjpjbGVhcl9sb2NhdGlvbigpIHsKLSAgbG9jYXRpb25fLkNsZWFyKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQotICByZXR1cm4gbG9jYXRpb25fLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mbzo6bXV0YWJsZV9sb2NhdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQotICByZXR1cm4gbG9jYXRpb25fLk11dGFibGUoaW5kZXgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm86OmFkZF9sb2NhdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24pCi0gIHJldHVybiBsb2NhdGlvbl8uQWRkKCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPioKLVNvdXJjZUNvZGVJbmZvOjptdXRhYmxlX2xvY2F0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKLSAgcmV0dXJuICZsb2NhdGlvbl87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiYKLVNvdXJjZUNvZGVJbmZvOjpsb2NhdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQotICByZXR1cm4gbG9jYXRpb25fOwotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotY29uc3QgaW50IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmtQYXRoRmllbGROdW1iZXI7Ci1jb25zdCBpbnQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6a1NvdXJjZUZpbGVGaWVsZE51bWJlcjsKLWNvbnN0IGludCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjprQmVnaW5GaWVsZE51bWJlcjsKLWNvbnN0IGludCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjprRW5kRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCi0KLUdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKLSAgU2hhcmVkQ3RvcigpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi19Ci0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCi0gICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpTaGFyZWRDdG9yKCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwotICBfY2FjaGVkX3NpemVfID0gMDsKLSAgc291cmNlX2ZpbGVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgYmVnaW5fID0gMDsKLSAgZW5kXyA9IDA7Ci0gIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci19Ci0KLUdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246On5HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLSAgU2hhcmVkRHRvcigpOwotfQotCi12b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OlNoYXJlZER0b3IoKSB7Ci0gIHNvdXJjZV9maWxlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewotICB9Ci19Ci0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9kZXNjcmlwdG9yXzsKLX0KLQotY29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwotCi1HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKLSAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogbiA9IG5ldyBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obik7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Q2xlYXIoKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLSNpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcHVzaCIpIFwKLSAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCi0gIF9fYnVpbHRpbl9vZmZzZXRvZihHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBmKSBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcG9wIikKLSNlbHNlCi0jZGVmaW5lIFpSX0hFTFBFUl8oZikgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oXAotICAmcmVpbnRlcnByZXRfY2FzdDxHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKj4oMTYpLT5mKQotI2VuZGlmCi0KLSNkZWZpbmUgWlJfKGZpcnN0LCBsYXN0KSBkbyB7XAotICA6Om1lbXNldCgmZmlyc3QsIDAsXAotICAgICAgICAgICBaUl9IRUxQRVJfKGxhc3QpIC0gWlJfSEVMUEVSXyhmaXJzdCkgKyBzaXplb2YobGFzdCkpO1wKLX0gd2hpbGUgKDApCi0KLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDE0dSkgewotICAgIFpSXyhiZWdpbl8sIGVuZF8pOwotICAgIGlmIChoYXNfc291cmNlX2ZpbGUoKSkgewotICAgICAgc291cmNlX2ZpbGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgICB9Ci0gIH0KLQotI3VuZGVmIFpSX0hFTFBFUl8KLSN1bmRlZiBaUl8KLQotICBwYXRoXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQotICBmb3IgKDs7KSB7Ci0gICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7Ci0gICAgdGFnID0gcC5maXJzdDsKLSAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAodGFnID09IDEwKSB7Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCi0gICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3BhdGgoKSkpKTsKLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gOCkgewotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgMSwgMTAsIGlucHV0LCB0aGlzLT5tdXRhYmxlX3BhdGgoKSkpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9zb3VyY2VfZmlsZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7Ci0gICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAxOCkgewotICAgICAgICAgcGFyc2Vfc291cmNlX2ZpbGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAotICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3NvdXJjZV9maWxlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKLSAgICAgICAgICAgIHRoaXMtPnNvdXJjZV9maWxlKCkuZGF0YSgpLCB0aGlzLT5zb3VyY2VfZmlsZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCi0gICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9iZWdpbjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIGJlZ2luID0gMzsKLSAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAodGFnID09IDI0KSB7Ci0gICAgICAgICBwYXJzZV9iZWdpbjoKLSAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZiZWdpbl8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19iZWdpbigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzIpKSBnb3RvIHBhcnNlX2VuZDsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7Ci0gICAgICBjYXNlIDQ6IHsKLSAgICAgICAgaWYgKHRhZyA9PSAzMikgewotICAgICAgICAgcGFyc2VfZW5kOgotICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAotICAgICAgICAgICAgICAgICBpbnB1dCwgJmVuZF8pKSk7Ci0gICAgICAgICAgc2V0X2hhc19lbmQoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwotICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VudXN1YWw6Ci0gICAgICAgIGlmICh0YWcgPT0gMCB8fAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKLSAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotc3VjY2VzczoKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0gIHJldHVybiBmYWxzZTsKLSN1bmRlZiBET18KLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQotICAvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07Ci0gIGlmICh0aGlzLT5wYXRoX3NpemUoKSA+IDApIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoMSwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7Ci0gICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKF9wYXRoX2NhY2hlZF9ieXRlX3NpemVfKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnBhdGhfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnKAotICAgICAgdGhpcy0+cGF0aChpKSwgb3V0cHV0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7Ci0gIGlmIChoYXNfc291cmNlX2ZpbGUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAotICAgICAgdGhpcy0+c291cmNlX2ZpbGUoKS5kYXRhKCksIHRoaXMtPnNvdXJjZV9maWxlKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCi0gICAgICAiZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUiKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgICAyLCB0aGlzLT5zb3VyY2VfZmlsZSgpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOwotICBpZiAoaGFzX2JlZ2luKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigzLCB0aGlzLT5iZWdpbigpLCBvdXRwdXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gNDsKLSAgaWYgKGhhc19lbmQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDQsIHRoaXMtPmVuZCgpLCBvdXRwdXQpOwotICB9Ci0KLSAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLSAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOwotICBpZiAodGhpcy0+cGF0aF9zaXplKCkgPiAwKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKLSAgICAgIDEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKLSAgICAgIHRhcmdldCk7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAotICAgICAgX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV8sIHRhcmdldCk7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wYXRoX3NpemUoKTsgaSsrKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgV3JpdGVJbnQzMk5vVGFnVG9BcnJheSh0aGlzLT5wYXRoKGkpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHNvdXJjZV9maWxlID0gMjsKLSAgaWYgKGhhc19zb3VyY2VfZmlsZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgICB0aGlzLT5zb3VyY2VfZmlsZSgpLmRhdGEoKSwgdGhpcy0+c291cmNlX2ZpbGUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKLSAgICAgICJnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSIpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICAyLCB0aGlzLT5zb3VyY2VfZmlsZSgpLCB0YXJnZXQpOwotICB9Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOwotICBpZiAoaGFzX2JlZ2luKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMywgdGhpcy0+YmVnaW4oKSwgdGFyZ2V0KTsKLSAgfQotCi0gIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7Ci0gIGlmIChoYXNfZW5kKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoNCwgdGhpcy0+ZW5kKCksIHRhcmdldCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkJ5dGVTaXplKCkgY29uc3QgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgaWYgKF9oYXNfYml0c19bMSAvIDMyXSAmIDE0dSkgewotICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7Ci0gICAgaWYgKGhhc19zb3VyY2VfZmlsZSgpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5zb3VyY2VfZmlsZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBvcHRpb25hbCBpbnQzMiBiZWdpbiA9IDM7Ci0gICAgaWYgKGhhc19iZWdpbigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAotICAgICAgICAgIHRoaXMtPmJlZ2luKCkpOwotICAgIH0KLQotICAgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7Ci0gICAgaWYgKGhhc19lbmQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKLSAgICAgICAgICB0aGlzLT5lbmQoKSk7Ci0gICAgfQotCi0gIH0KLSAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOwotICB7Ci0gICAgaW50IGRhdGFfc2l6ZSA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wYXRoX3NpemUoKTsgaSsrKSB7Ci0gICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgotICAgICAgICBJbnQzMlNpemUodGhpcy0+cGF0aChpKSk7Ci0gICAgfQotICAgIGlmIChkYXRhX3NpemUgPiAwKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGRhdGFfc2l6ZSk7Ci0gICAgfQotICAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gICAgX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV8gPSBkYXRhX3NpemU7Ci0gICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Ci0gICAgdG90YWxfc2l6ZSArPSBkYXRhX3NpemU7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCi0gICAgICAgIHVua25vd25fZmllbGRzKCkpOwotICB9Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIHNvdXJjZSA9IAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci0gIH0gZWxzZSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKLSAgICBNZXJnZUZyb20oKnNvdXJjZSk7Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpNZXJnZUZyb20oY29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0gIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7Ci0gIHBhdGhfLk1lcmdlRnJvbShmcm9tLnBhdGhfKTsKLSAgaWYgKGZyb20uX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgewotICAgIGlmIChmcm9tLmhhc19zb3VyY2VfZmlsZSgpKSB7Ci0gICAgICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7Ci0gICAgICBzb3VyY2VfZmlsZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnNvdXJjZV9maWxlXyk7Ci0gICAgfQotICAgIGlmIChmcm9tLmhhc19iZWdpbigpKSB7Ci0gICAgICBzZXRfYmVnaW4oZnJvbS5iZWdpbigpKTsKLSAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2VuZCgpKSB7Ci0gICAgICBzZXRfZW5kKGZyb20uZW5kKCkpOwotICAgIH0KLSAgfQotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpDb3B5RnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQotICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20oZnJvbSk7Ci19Ci0KLWJvb2wgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpTd2FwKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIG90aGVyKSB7Ci0gIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci12b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkludGVybmFsU3dhcChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBvdGhlcikgewotICBwYXRoXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5wYXRoXyk7Ci0gIHNvdXJjZV9maWxlXy5Td2FwKCZvdGhlci0+c291cmNlX2ZpbGVfKTsKLSAgc3RkOjpzd2FwKGJlZ2luXywgb3RoZXItPmJlZ2luXyk7Ci0gIHN0ZDo6c3dhcChlbmRfLCBvdGhlci0+ZW5kXyk7Ci0gIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOwotICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkdldE1ldGFkYXRhKCkgY29uc3QgewotICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKLSAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX3JlZmxlY3Rpb25fOwotICByZXR1cm4gbWV0YWRhdGE7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLWNvbnN0IGludCBHZW5lcmF0ZWRDb2RlSW5mbzo6a0Fubm90YXRpb25GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKLQotR2VuZXJhdGVkQ29kZUluZm86OkdlbmVyYXRlZENvZGVJbmZvKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewotfQotCi1HZW5lcmF0ZWRDb2RlSW5mbzo6R2VuZXJhdGVkQ29kZUluZm8oY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCi0gICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi19Ci0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm86OlNoYXJlZEN0b3IoKSB7Ci0gIF9jYWNoZWRfc2l6ZV8gPSAwOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotfQotCi1HZW5lcmF0ZWRDb2RlSW5mbzo6fkdlbmVyYXRlZENvZGVJbmZvKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi0gIFNoYXJlZER0b3IoKTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKLSAgfQotfQotCi12b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7Ci0gIF9jYWNoZWRfc2l6ZV8gPSBzaXplOwotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKLX0KLWNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogR2VuZXJhdGVkQ29kZUluZm86OmRlc2NyaXB0b3IoKSB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICByZXR1cm4gR2VuZXJhdGVkQ29kZUluZm9fZGVzY3JpcHRvcl87Ci19Ci0KLWNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBHZW5lcmF0ZWRDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKLX0KLQotR2VuZXJhdGVkQ29kZUluZm8qIEdlbmVyYXRlZENvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7Ci0KLUdlbmVyYXRlZENvZGVJbmZvKiBHZW5lcmF0ZWRDb2RlSW5mbzo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7Ci0gIEdlbmVyYXRlZENvZGVJbmZvKiBuID0gbmV3IEdlbmVyYXRlZENvZGVJbmZvOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obik7Ci0gIH0KLSAgcmV0dXJuIG47Ci19Ci0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm86OkNsZWFyKCkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotICBhbm5vdGF0aW9uXy5DbGVhcigpOwotICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7Ci0gIH0KLX0KLQotYm9vbCBHZW5lcmF0ZWRDb2RlSW5mbzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi0gIGZvciAoOzspIHsKLSAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKLSAgICB0YWcgPSBwLmZpcnN0OwotICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7Ci0gICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAxOwotICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICh0YWcgPT0gMTApIHsKLSAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOwotICAgICAgICAgcGFyc2VfbG9vcF9hbm5vdGF0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfYW5ub3RhdGlvbigpKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKLSAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMCkpIGdvdG8gcGFyc2VfbG9vcF9hbm5vdGF0aW9uOwotICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW51c3VhbDoKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIGdvdG8gc3VjY2VzczsKLSAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAotICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci1zdWNjZXNzOgotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi0gIHJldHVybiB0cnVlOwotZmFpbHVyZToKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotICByZXR1cm4gZmFsc2U7Ci0jdW5kZWYgRE9fCi19Ci0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7Ci0gIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+YW5ub3RhdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMSwgdGhpcy0+YW5ub3RhdGlvbihpKSwgb3V0cHV0KTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCi0gICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotfQotCi06Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBHZW5lcmF0ZWRDb2RlSW5mbzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5hbm5vdGF0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKLSAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDEsIHRoaXMtPmFubm90YXRpb24oaSksIHRhcmdldCk7Ci0gIH0KLQotICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLWludCBHZW5lcmF0ZWRDb2RlSW5mbzo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAxOwotICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5hbm5vdGF0aW9uX3NpemUoKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5hbm5vdGF0aW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICB0aGlzLT5hbm5vdGF0aW9uKGkpKTsKLSAgfQotCi0gIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLSAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKLSAgX2NhY2hlZF9zaXplXyA9IHRvdGFsX3NpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwotICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyogc291cmNlID0gCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvPigKLSAgICAgICAgICAmZnJvbSk7Ci0gIGlmIChzb3VyY2UgPT0gTlVMTCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwotICB9IGVsc2UgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQotICAgIE1lcmdlRnJvbSgqc291cmNlKTsKLSAgfQotfQotCi12b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpNZXJnZUZyb20oY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGZyb20pIHsKLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKLSAgYW5ub3RhdGlvbl8uTWVyZ2VGcm9tKGZyb20uYW5ub3RhdGlvbl8pOwotICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewotICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKLSAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKLSAgQ2xlYXIoKTsKLSAgTWVyZ2VGcm9tKGZyb20pOwotfQotCi12b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpDb3B5RnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZnJvbSkgewotLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCi0gIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47Ci0gIENsZWFyKCk7Ci0gIE1lcmdlRnJvbShmcm9tKTsKLX0KLQotYm9vbCBHZW5lcmF0ZWRDb2RlSW5mbzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6U3dhcChHZW5lcmF0ZWRDb2RlSW5mbyogb3RoZXIpIHsKLSAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKLSAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm86OkludGVybmFsU3dhcChHZW5lcmF0ZWRDb2RlSW5mbyogb3RoZXIpIHsKLSAgYW5ub3RhdGlvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+YW5ub3RhdGlvbl8pOwotICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKLSAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLX0KLQotOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZW5lcmF0ZWRDb2RlSW5mbzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gR2VuZXJhdGVkQ29kZUluZm9fZGVzY3JpcHRvcl87Ci0gIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBHZW5lcmF0ZWRDb2RlSW5mb19yZWZsZWN0aW9uXzsKLSAgcmV0dXJuIG1ldGFkYXRhOwotfQotCi0jaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uCi0KLS8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKLWludCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpwYXRoX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBwYXRoXy5zaXplKCk7Ci19Ci12b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX3BhdGgoKSB7Ci0gIHBhdGhfLkNsZWFyKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpwYXRoKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCi0gIHJldHVybiBwYXRoXy5HZXQoaW5kZXgpOwotfQotIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X3BhdGgoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHBhdGhfLlNldChpbmRleCwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCi19Ci0gdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjphZGRfcGF0aCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHBhdGhfLkFkZCh2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCkKLX0KLSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLUdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnBhdGgoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCi0gIHJldHVybiBwYXRoXzsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKLUdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Om11dGFibGVfcGF0aCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQotICByZXR1cm4gJnBhdGhfOwotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOwotYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpoYXNfc291cmNlX2ZpbGUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOwotfQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfaGFzX3NvdXJjZV9maWxlKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9oYXNfc291cmNlX2ZpbGUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9zb3VyY2VfZmlsZSgpIHsKLSAgc291cmNlX2ZpbGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX3NvdXJjZV9maWxlKCk7Ci19Ci0gY29uc3QgOjpzdGQ6OnN0cmluZyYgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c291cmNlX2ZpbGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCi0gIHJldHVybiBzb3VyY2VfZmlsZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X3NvdXJjZV9maWxlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfc291cmNlX2ZpbGUoKTsKLSAgc291cmNlX2ZpbGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCi19Ci0gdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfc291cmNlX2ZpbGUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOwotICBzb3VyY2VfZmlsZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQotfQotIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X3NvdXJjZV9maWxlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7Ci0gIHNvdXJjZV9maWxlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKLX0KLSA6OnN0ZDo6c3RyaW5nKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjptdXRhYmxlX3NvdXJjZV9maWxlKCkgewotICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQotICByZXR1cm4gc291cmNlX2ZpbGVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gOjpzdGQ6OnN0cmluZyogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cmVsZWFzZV9zb3VyY2VfZmlsZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCi0gIGNsZWFyX2hhc19zb3VyY2VfZmlsZSgpOwotICByZXR1cm4gc291cmNlX2ZpbGVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci0gdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfYWxsb2NhdGVkX3NvdXJjZV9maWxlKDo6c3RkOjpzdHJpbmcqIHNvdXJjZV9maWxlKSB7Ci0gIGlmIChzb3VyY2VfZmlsZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19zb3VyY2VfZmlsZSgpOwotICB9Ci0gIHNvdXJjZV9maWxlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgc291cmNlX2ZpbGUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOwotYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpoYXNfYmVnaW4oKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfaGFzX2JlZ2luKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OwotfQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9oYXNfYmVnaW4oKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9iZWdpbigpIHsKLSAgYmVnaW5fID0gMDsKLSAgY2xlYXJfaGFzX2JlZ2luKCk7Ci19Ci0gOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpiZWdpbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5iZWdpbikKLSAgcmV0dXJuIGJlZ2luXzsKLX0KLSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9iZWdpbig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHNldF9oYXNfYmVnaW4oKTsKLSAgYmVnaW5fID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uYmVnaW4pCi19Ci0KLS8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7Ci1ib29sIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Omhhc19lbmQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOwotfQotdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfaGFzX2VuZCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLXZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfaGFzX2VuZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Ci19Ci12b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX2VuZCgpIHsKLSAgZW5kXyA9IDA7Ci0gIGNsZWFyX2hhc19lbmQoKTsKLX0KLSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmVuZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5lbmQpCi0gIHJldHVybiBlbmRfOwotfQotIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2VuZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHNldF9oYXNfZW5kKCk7Ci0gIGVuZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5lbmQpCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gR2VuZXJhdGVkQ29kZUluZm8KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAxOwotaW50IEdlbmVyYXRlZENvZGVJbmZvOjphbm5vdGF0aW9uX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBhbm5vdGF0aW9uXy5zaXplKCk7Ci19Ci12b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpjbGVhcl9hbm5vdGF0aW9uKCkgewotICBhbm5vdGF0aW9uXy5DbGVhcigpOwotfQotY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBHZW5lcmF0ZWRDb2RlSW5mbzo6YW5ub3RhdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKLSAgcmV0dXJuIGFubm90YXRpb25fLkdldChpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIEdlbmVyYXRlZENvZGVJbmZvOjptdXRhYmxlX2Fubm90YXRpb24oaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQotICByZXR1cm4gYW5ub3RhdGlvbl8uTXV0YWJsZShpbmRleCk7Ci19Ci06Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIEdlbmVyYXRlZENvZGVJbmZvOjphZGRfYW5ub3RhdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKLSAgcmV0dXJuIGFubm90YXRpb25fLkFkZCgpOwotfQotOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPioKLUdlbmVyYXRlZENvZGVJbmZvOjptdXRhYmxlX2Fubm90YXRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24pCi0gIHJldHVybiAmYW5ub3RhdGlvbl87Ci19Ci1jb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA+JgotR2VuZXJhdGVkQ29kZUluZm86OmFubm90YXRpb24oKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQotICByZXR1cm4gYW5ub3RhdGlvbl87Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTJhMGEzYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaAorKysgL2Rldi9udWxsCkBAIC0xLDc3MTQgKzAsMCBAQAotLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKLS8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KLQotI2lmbmRlZiBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b19fSU5DTFVERUQKLSNkZWZpbmUgUFJPVE9CVUZfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fX0lOQ0xVREVECi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLSNpZiBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8IDMwMDAwMDAKLSNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCi0jZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZSB1cGRhdGUKLSNlcnJvciB5b3VyIGhlYWRlcnMuCi0jZW5kaWYKLSNpZiAzMDAwMDAwIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgotI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCi0jZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZQotI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0vLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuCi12b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci12b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLXZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0KLWNsYXNzIERlc2NyaXB0b3JQcm90bzsKLWNsYXNzIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTsKLWNsYXNzIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOwotY2xhc3MgRW51bURlc2NyaXB0b3JQcm90bzsKLWNsYXNzIEVudW1PcHRpb25zOwotY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOwotY2xhc3MgRW51bVZhbHVlT3B0aW9uczsKLWNsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvOwotY2xhc3MgRmllbGRPcHRpb25zOwotY2xhc3MgRmlsZURlc2NyaXB0b3JQcm90bzsKLWNsYXNzIEZpbGVEZXNjcmlwdG9yU2V0OwotY2xhc3MgRmlsZU9wdGlvbnM7Ci1jbGFzcyBHZW5lcmF0ZWRDb2RlSW5mbzsKLWNsYXNzIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb247Ci1jbGFzcyBNZXNzYWdlT3B0aW9uczsKLWNsYXNzIE1ldGhvZERlc2NyaXB0b3JQcm90bzsKLWNsYXNzIE1ldGhvZE9wdGlvbnM7Ci1jbGFzcyBPbmVvZkRlc2NyaXB0b3JQcm90bzsKLWNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87Ci1jbGFzcyBTZXJ2aWNlT3B0aW9uczsKLWNsYXNzIFNvdXJjZUNvZGVJbmZvOwotY2xhc3MgU291cmNlQ29kZUluZm9fTG9jYXRpb247Ci1jbGFzcyBVbmludGVycHJldGVkT3B0aW9uOwotY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDsKLQotZW51bSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0RPVUJMRSA9IDEsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GTE9BVCA9IDIsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9JTlQ2NCA9IDMsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UNjQgPSA0LAotICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzIgPSA1LAotICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRklYRUQ2NCA9IDYsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDMyID0gNywKLSAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JPT0wgPSA4LAotICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU1RSSU5HID0gOSwKLSAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0dST1VQID0gMTAsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9NRVNTQUdFID0gMTEsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9CWVRFUyA9IDEyLAotICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfVUlOVDMyID0gMTMsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9FTlVNID0gMTQsCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TRklYRUQzMiA9IDE1LAotICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVENjQgPSAxNiwKLSAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQzMiA9IDE3LAotICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0ID0gMTgKLX07Ci1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQoaW50IHZhbHVlKTsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01JTiA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9ET1VCTEU7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVHlwZV9NQVggPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0OwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVHlwZV9BUlJBWVNJWkUgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfTUFYICsgMTsKLQotTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpOwotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfTmFtZShGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1BhcnNlKAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlPigKLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOwotfQotZW51bSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB7Ci0gIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX09QVElPTkFMID0gMSwKLSAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfUkVRVUlSRUQgPSAyLAotICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRFRCA9IDMKLX07Ci1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKGludCB2YWx1ZSk7Ci1jb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NSU4gPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTDsKLWNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xhYmVsX01BWCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUEVBVEVEOwotY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xhYmVsX0FSUkFZU0laRSA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xhYmVsX01BWCArIDE7Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yKCk7Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTmFtZShGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yKCksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX1BhcnNlKAotICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsKiB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWw+KAotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKSwgbmFtZSwgdmFsdWUpOwotfQotZW51bSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgewotICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfU1BFRUQgPSAxLAotICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfQ09ERV9TSVpFID0gMiwKLSAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0xJVEVfUlVOVElNRSA9IDMKLX07Ci1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfTUlOID0gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX1NQRUVEOwotY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfTUFYID0gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0xJVEVfUlVOVElNRTsKLWNvbnN0IGludCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfT3B0aW1pemVNb2RlX0FSUkFZU0laRSA9IEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfTUFYICsgMTsKLQotTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yKCk7Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX05hbWUoRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yKCksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9QYXJzZSgKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGU+KAotICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKLX0KLWVudW0gRmllbGRPcHRpb25zX0NUeXBlIHsKLSAgRmllbGRPcHRpb25zX0NUeXBlX1NUUklORyA9IDAsCi0gIEZpZWxkT3B0aW9uc19DVHlwZV9DT1JEID0gMSwKLSAgRmllbGRPcHRpb25zX0NUeXBlX1NUUklOR19QSUVDRSA9IDIKLX07Ci1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpOwotY29uc3QgRmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NSU4gPSBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HOwotY29uc3QgRmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NQVggPSBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HX1BJRUNFOwotY29uc3QgaW50IEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9BUlJBWVNJWkUgPSBGaWVsZE9wdGlvbnNfQ1R5cGVfQ1R5cGVfTUFYICsgMTsKLQotTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCk7Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGRPcHRpb25zX0NUeXBlX05hbWUoRmllbGRPcHRpb25zX0NUeXBlIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKAotICAgIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIEZpZWxkT3B0aW9uc19DVHlwZV9QYXJzZSgKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCBGaWVsZE9wdGlvbnNfQ1R5cGUqIHZhbHVlKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpQYXJzZU5hbWVkRW51bTxGaWVsZE9wdGlvbnNfQ1R5cGU+KAotICAgIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKLX0KLWVudW0gRmllbGRPcHRpb25zX0pTVHlwZSB7Ci0gIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfTk9STUFMID0gMCwKLSAgRmllbGRPcHRpb25zX0pTVHlwZV9KU19TVFJJTkcgPSAxLAotICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05VTUJFUiA9IDIKLX07Ci1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQoaW50IHZhbHVlKTsKLWNvbnN0IEZpZWxkT3B0aW9uc19KU1R5cGUgRmllbGRPcHRpb25zX0pTVHlwZV9KU1R5cGVfTUlOID0gRmllbGRPcHRpb25zX0pTVHlwZV9KU19OT1JNQUw7Ci1jb25zdCBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX01BWCA9IEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfTlVNQkVSOwotY29uc3QgaW50IEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX0FSUkFZU0laRSA9IEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX01BWCArIDE7Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3IoKTsKLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZE9wdGlvbnNfSlNUeXBlX05hbWUoRmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TmFtZU9mRW51bSgKLSAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3IoKSwgdmFsdWUpOwotfQotaW5saW5lIGJvb2wgRmllbGRPcHRpb25zX0pTVHlwZV9QYXJzZSgKLSAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLCBGaWVsZE9wdGlvbnNfSlNUeXBlKiB2YWx1ZSkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGRPcHRpb25zX0pTVHlwZT4oCi0gICAgRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yKCksIG5hbWUsIHZhbHVlKTsKLX0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpbGVEZXNjcmlwdG9yU2V0IDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBGaWxlRGVzY3JpcHRvclNldCgpOwotICB2aXJ0dWFsIH5GaWxlRGVzY3JpcHRvclNldCgpOwotCi0gIEZpbGVEZXNjcmlwdG9yU2V0KGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKTsKLQotICBpbmxpbmUgRmlsZURlc2NyaXB0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIEZpbGVEZXNjcmlwdG9yU2V0KiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBGaWxlRGVzY3JpcHRvclNldCogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOwotICBpbnQgZmlsZV9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZmlsZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtGaWxlRmllbGROdW1iZXIgPSAxOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUoaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2ZpbGUoaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBhZGRfZmlsZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgotICAgICAgbXV0YWJsZV9maWxlKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBmaWxlKCkgY29uc3Q7Ci0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKLSBwcml2YXRlOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiBmaWxlXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgRmlsZURlc2NyaXB0b3JTZXQqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpbGVEZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8oKTsKLSAgdmlydHVhbCB+RmlsZURlc2NyaXB0b3JQcm90bygpOwotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0KLSAgaW5saW5lIEZpbGVEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoRmlsZURlc2NyaXB0b3JQcm90byogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIEZpbGVEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKEZpbGVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7Ci0gIGJvb2wgaGFzX3BhY2thZ2UoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9wYWNrYWdlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1BhY2thZ2VGaWVsZE51bWJlciA9IDI7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHBhY2thZ2UoKSBjb25zdDsKLSAgdm9pZCBzZXRfcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfcGFja2FnZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3BhY2thZ2UoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogcGFja2FnZSk7Ci0KLSAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwotICBpbnQgZGVwZW5kZW5jeV9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZGVwZW5kZW5jeSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtEZXBlbmRlbmN5RmllbGROdW1iZXIgPSAzOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZGVwZW5kZW5jeShpbnQgaW5kZXgpOwotICB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogYWRkX2RlcGVuZGVuY3koKTsKLSAgdm9pZCBhZGRfZGVwZW5kZW5jeShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIGFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIGRlcGVuZGVuY3koKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9kZXBlbmRlbmN5KCk7Ci0KLSAgLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKLSAgaW50IHB1YmxpY19kZXBlbmRlbmN5X3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9wdWJsaWNfZGVwZW5kZW5jeSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtQdWJsaWNEZXBlbmRlbmN5RmllbGROdW1iZXIgPSAxMDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBwdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OwotICB2b2lkIHNldF9wdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICB2b2lkIGFkZF9wdWJsaWNfZGVwZW5kZW5jeSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi0gICAgICBwdWJsaWNfZGVwZW5kZW5jeSgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKLSAgICAgIG11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKTsKLQotICAvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKLSAgaW50IHdlYWtfZGVwZW5kZW5jeV9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfd2Vha19kZXBlbmRlbmN5KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1dlYWtEZXBlbmRlbmN5RmllbGROdW1iZXIgPSAxMTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB3ZWFrX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKLSAgdm9pZCBzZXRfd2Vha19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIHZvaWQgYWRkX3dlYWtfZGVwZW5kZW5jeSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi0gICAgICB3ZWFrX2RlcGVuZGVuY3koKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi0gICAgICBtdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpOwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7Ci0gIGludCBtZXNzYWdlX3R5cGVfc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX21lc3NhZ2VfdHlwZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyID0gNDsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogbXV0YWJsZV9tZXNzYWdlX3R5cGUoaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXNzYWdlX3R5cGUoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+KgotICAgICAgbXV0YWJsZV9tZXNzYWdlX3R5cGUoKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgotICAgICAgbWVzc2FnZV90eXBlKCkgY29uc3Q7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDU7Ci0gIGludCBlbnVtX3R5cGVfc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2VudW1fdHlwZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtFbnVtVHlwZUZpZWxkTnVtYmVyID0gNTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvJiBlbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIGFkZF9lbnVtX3R5cGUoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPioKLSAgICAgIG11dGFibGVfZW51bV90eXBlKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBlbnVtX3R5cGUoKSBjb25zdDsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7Ci0gIGludCBzZXJ2aWNlX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9zZXJ2aWNlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1NlcnZpY2VGaWVsZE51bWJlciA9IDY7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byYgc2VydmljZShpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfc2VydmljZShpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIGFkZF9zZXJ2aWNlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvID4qCi0gICAgICBtdXRhYmxlX3NlcnZpY2UoKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKLSAgICAgIHNlcnZpY2UoKSBjb25zdDsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7Ci0gIGludCBleHRlbnNpb25fc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2V4dGVuc2lvbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbnNpb25GaWVsZE51bWJlciA9IDc7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZXh0ZW5zaW9uKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgotICAgICAgbXV0YWJsZV9leHRlbnNpb24oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBleHRlbnNpb24oKSBjb25zdDsKLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OwotICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfb3B0aW9ucygpOwotICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSA4OwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogb3B0aW9ucyk7Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbyBzb3VyY2VfY29kZV9pbmZvID0gOTsKLSAgYm9vbCBoYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0OwotICB2b2lkIGNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU291cmNlQ29kZUluZm9GaWVsZE51bWJlciA9IDk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8mIHNvdXJjZV9jb2RlX2luZm8oKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHJlbGVhc2Vfc291cmNlX2NvZGVfaW5mbygpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfc291cmNlX2NvZGVfaW5mbyg6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvKTsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7Ci0gIGJvb2wgaGFzX3N5bnRheCgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3N5bnRheCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtTeW50YXhGaWVsZE51bWJlciA9IDEyOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzeW50YXgoKSBjb25zdDsKLSAgdm9pZCBzZXRfc3ludGF4KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfc3ludGF4KGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfc3ludGF4KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfc3ludGF4KCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfc3ludGF4KCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9zeW50YXgoOjpzdGQ6OnN0cmluZyogc3ludGF4KTsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfcGFja2FnZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcGFja2FnZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfc3ludGF4KCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19zeW50YXgoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBwYWNrYWdlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiBkZXBlbmRlbmN5XzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4gcHVibGljX2RlcGVuZGVuY3lfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiB3ZWFrX2RlcGVuZGVuY3lfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4gbWVzc2FnZV90eXBlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiBlbnVtX3R5cGVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+IHNlcnZpY2VfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiBleHRlbnNpb25fOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiBvcHRpb25zXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogc291cmNlX2NvZGVfaW5mb187Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHN5bnRheF87Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0KLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKCk7Ci0gIHZpcnR1YWwgfkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpOwotCi0gIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pOwotCi0gIGlubGluZSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgdm9pZCBTd2FwKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBvdGhlcik7Ci0gIHByaXZhdGU6Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOwotICB9Ci0gIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKLSAgfQotICBwdWJsaWM6Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gIGJvb2wgaGFzX3N0YXJ0KCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfc3RhcnQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU3RhcnRGaWVsZE51bWJlciA9IDE7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc3RhcnQoKSBjb25zdDsKLSAgdm9pZCBzZXRfc3RhcnQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLSAgYm9vbCBoYXNfZW5kKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZW5kKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0VuZEZpZWxkTnVtYmVyID0gMjsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBlbmQoKSBjb25zdDsKLSAgdm9pZCBzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQotIHByaXZhdGU6Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfc3RhcnQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3N0YXJ0KCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfZW5kKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19lbmQoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc3RhcnRfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVuZF87Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0KLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCk7Ci0gIHZpcnR1YWwgfkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCk7Ci0KLSAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIGZyb20pOwotCi0gIGlubGluZSBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgb3BlcmF0b3I9KGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgdm9pZCBTd2FwKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBvdGhlcik7Ci0gIHByaXZhdGU6Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOwotICB9Ci0gIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKLSAgfQotICBwdWJsaWM6Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci0gIGJvb2wgaGFzX3N0YXJ0KCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfc3RhcnQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU3RhcnRGaWVsZE51bWJlciA9IDE7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc3RhcnQoKSBjb25zdDsKLSAgdm9pZCBzZXRfc3RhcnQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLSAgYm9vbCBoYXNfZW5kKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZW5kKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0VuZEZpZWxkTnVtYmVyID0gMjsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBlbmQoKSBjb25zdDsKLSAgdm9pZCBzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19zdGFydCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc3RhcnQoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19lbmQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2VuZCgpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBzdGFydF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZW5kXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgRGVzY3JpcHRvclByb3RvKCk7Ci0gIHZpcnR1YWwgfkRlc2NyaXB0b3JQcm90bygpOwotCi0gIERlc2NyaXB0b3JQcm90byhjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotCi0gIGlubGluZSBEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgdm9pZCBTd2FwKERlc2NyaXB0b3JQcm90byogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIERlc2NyaXB0b3JQcm90byogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgRGVzY3JpcHRvclByb3RvKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoRGVzY3JpcHRvclByb3RvKiBvdGhlcik7Ci0gIHByaXZhdGU6Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOwotICB9Ci0gIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKLSAgfQotICBwdWJsaWM6Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgdHlwZWRlZiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgRXh0ZW5zaW9uUmFuZ2U7Ci0gIHR5cGVkZWYgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgUmVzZXJ2ZWRSYW5nZTsKLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKLSAgaW50IGZpZWxkX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9maWVsZCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZEZpZWxkTnVtYmVyID0gMjsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQoaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWVsZChpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZmllbGQoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCi0gICAgICBtdXRhYmxlX2ZpZWxkKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgotICAgICAgZmllbGQoKSBjb25zdDsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7Ci0gIGludCBleHRlbnNpb25fc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2V4dGVuc2lvbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbnNpb25GaWVsZE51bWJlciA9IDY7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZXh0ZW5zaW9uKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgotICAgICAgbXV0YWJsZV9leHRlbnNpb24oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBleHRlbnNpb24oKSBjb25zdDsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7Ci0gIGludCBuZXN0ZWRfdHlwZV9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbmVzdGVkX3R5cGUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmVzdGVkVHlwZUZpZWxkTnVtYmVyID0gMzsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIG5lc3RlZF90eXBlKGludCBpbmRleCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX25lc3RlZF90eXBlKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBhZGRfbmVzdGVkX3R5cGUoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+KgotICAgICAgbXV0YWJsZV9uZXN0ZWRfdHlwZSgpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4mCi0gICAgICBuZXN0ZWRfdHlwZSgpIGNvbnN0OwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OwotICBpbnQgZW51bV90eXBlX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9lbnVtX3R5cGUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRW51bVR5cGVGaWVsZE51bWJlciA9IDQ7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9lbnVtX3R5cGUoaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBhZGRfZW51bV90eXBlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCi0gICAgICBtdXRhYmxlX2VudW1fdHlwZSgpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgotICAgICAgZW51bV90eXBlKCkgY29uc3Q7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKLSAgaW50IGV4dGVuc2lvbl9yYW5nZV9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZXh0ZW5zaW9uX3JhbmdlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0V4dGVuc2lvblJhbmdlRmllbGROdW1iZXIgPSA1OwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBtdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogYWRkX2V4dGVuc2lvbl9yYW5nZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4qCi0gICAgICBtdXRhYmxlX2V4dGVuc2lvbl9yYW5nZSgpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4mCi0gICAgICBleHRlbnNpb25fcmFuZ2UoKSBjb25zdDsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvIG9uZW9mX2RlY2wgPSA4OwotICBpbnQgb25lb2ZfZGVjbF9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfb25lb2ZfZGVjbCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtPbmVvZkRlY2xGaWVsZE51bWJlciA9IDg7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8mIG9uZW9mX2RlY2woaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byogbXV0YWJsZV9vbmVvZl9kZWNsKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIGFkZF9vbmVvZl9kZWNsKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+KgotICAgICAgbXV0YWJsZV9vbmVvZl9kZWNsKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+JgotICAgICAgb25lb2ZfZGVjbCgpIGNvbnN0OwotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7Ci0gIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9vcHRpb25zKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDc7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBvcHRpb25zKTsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gOTsKLSAgaW50IHJlc2VydmVkX3JhbmdlX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9yZXNlcnZlZF9yYW5nZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtSZXNlcnZlZFJhbmdlRmllbGROdW1iZXIgPSA5OwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiByZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBtdXRhYmxlX3Jlc2VydmVkX3JhbmdlKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIGFkZF9yZXNlcnZlZF9yYW5nZSgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPioKLSAgICAgIG11dGFibGVfcmVzZXJ2ZWRfcmFuZ2UoKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlID4mCi0gICAgICByZXNlcnZlZF9yYW5nZSgpIGNvbnN0OwotCi0gIC8vIHJlcGVhdGVkIHN0cmluZyByZXNlcnZlZF9uYW1lID0gMTA7Ci0gIGludCByZXNlcnZlZF9uYW1lX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9yZXNlcnZlZF9uYW1lKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1Jlc2VydmVkTmFtZUZpZWxkTnVtYmVyID0gMTA7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHJlc2VydmVkX25hbWUoaW50IGluZGV4KSBjb25zdDsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9yZXNlcnZlZF9uYW1lKGludCBpbmRleCk7Ci0gIHZvaWQgc2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBhZGRfcmVzZXJ2ZWRfbmFtZSgpOwotICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBhZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgYWRkX3Jlc2VydmVkX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgcmVzZXJ2ZWRfbmFtZSgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX3Jlc2VydmVkX25hbWUoKTsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKLSBwcml2YXRlOgotICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4gZmllbGRfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiBleHRlbnNpb25fOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4gbmVzdGVkX3R5cGVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+IGVudW1fdHlwZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPiBleHRlbnNpb25fcmFuZ2VfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPiBvbmVvZl9kZWNsXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogb3B0aW9uc187Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSA+IHJlc2VydmVkX3JhbmdlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiByZXNlcnZlZF9uYW1lXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWVsZERlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8oKTsKLSAgdmlydHVhbCB+RmllbGREZXNjcmlwdG9yUHJvdG8oKTsKLQotICBGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0KLSAgaW5saW5lIEZpZWxkRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLQotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIGlubGluZSBGaWVsZERlc2NyaXB0b3JQcm90byogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgVHlwZTsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9ET1VCTEUgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9ET1VCTEU7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRkxPQVQgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GTE9BVDsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9JTlQ2NCA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDY0OwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1VJTlQ2NCA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQ2NDsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9JTlQzMiA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDMyOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZJWEVENjQgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0OwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZJWEVEMzIgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDMyOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0JPT0wgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9CT09MOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NUUklORyA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NUUklORzsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9HUk9VUCA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0dST1VQOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX01FU1NBR0UgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9NRVNTQUdFOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0JZVEVTID0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQllURVM7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfVUlOVDMyID0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfVUlOVDMyOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0VOVU0gPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9FTlVNOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NGSVhFRDMyID0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVEMzI7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0ZJWEVENjQgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TRklYRUQ2NDsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9TSU5UMzIgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UMzI7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0lOVDY0ID0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0OwotICBzdGF0aWMgaW5saW5lIGJvb2wgVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgewotICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX0lzVmFsaWQodmFsdWUpOwotICB9Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFR5cGVfTUlOID0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1R5cGVfTUlOOwotICBzdGF0aWMgY29uc3QgVHlwZSBUeXBlX01BWCA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX01BWDsKLSAgc3RhdGljIGNvbnN0IGludCBUeXBlX0FSUkFZU0laRSA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UeXBlX0FSUkFZU0laRTsKLSAgc3RhdGljIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKgotICBUeXBlX2Rlc2NyaXB0b3IoKSB7Ci0gICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgVHlwZV9OYW1lKFR5cGUgdmFsdWUpIHsKLSAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9OYW1lKHZhbHVlKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIGJvb2wgVHlwZV9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgVHlwZSogdmFsdWUpIHsKLSAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9QYXJzZShuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIExhYmVsOwotICBzdGF0aWMgY29uc3QgTGFiZWwgTEFCRUxfT1BUSU9OQUwgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX09QVElPTkFMOwotICBzdGF0aWMgY29uc3QgTGFiZWwgTEFCRUxfUkVRVUlSRUQgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUVVJUkVEOwotICBzdGF0aWMgY29uc3QgTGFiZWwgTEFCRUxfUkVQRUFURUQgPQotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUEVBVEVEOwotICBzdGF0aWMgaW5saW5lIGJvb2wgTGFiZWxfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfSXNWYWxpZCh2YWx1ZSk7Ci0gIH0KLSAgc3RhdGljIGNvbnN0IExhYmVsIExhYmVsX01JTiA9Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTGFiZWxfTUlOOwotICBzdGF0aWMgY29uc3QgTGFiZWwgTGFiZWxfTUFYID0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9NQVg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgTGFiZWxfQVJSQVlTSVpFID0KLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MYWJlbF9BUlJBWVNJWkU7Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcioKLSAgTGFiZWxfZGVzY3JpcHRvcigpIHsKLSAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcigpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgTGFiZWxfTmFtZShMYWJlbCB2YWx1ZSkgewotICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9OYW1lKHZhbHVlKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIGJvb2wgTGFiZWxfUGFyc2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgIExhYmVsKiB2YWx1ZSkgewotICAgIHJldHVybiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9QYXJzZShuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKLQotICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOwotICBib29sIGhhc19udW1iZXIoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9udW1iZXIoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTnVtYmVyRmllbGROdW1iZXIgPSAzOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcigpIGNvbnN0OwotICB2b2lkIHNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7Ci0gIGJvb2wgaGFzX2xhYmVsKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbGFiZWwoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTGFiZWxGaWVsZE51bWJlciA9IDQ7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgbGFiZWwoKSBjb25zdDsKLSAgdm9pZCBzZXRfbGFiZWwoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OwotICBib29sIGhhc190eXBlKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfdHlwZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtUeXBlRmllbGROdW1iZXIgPSA1OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdHlwZSgpIGNvbnN0OwotICB2b2lkIHNldF90eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7Ci0gIGJvb2wgaGFzX3R5cGVfbmFtZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3R5cGVfbmFtZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtUeXBlTmFtZUZpZWxkTnVtYmVyID0gNjsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgdHlwZV9uYW1lKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3R5cGVfbmFtZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3R5cGVfbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfdHlwZV9uYW1lKDo6c3RkOjpzdHJpbmcqIHR5cGVfbmFtZSk7Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKLSAgYm9vbCBoYXNfZXh0ZW5kZWUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9leHRlbmRlZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbmRlZUZpZWxkTnVtYmVyID0gMjsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgZXh0ZW5kZWUoKSBjb25zdDsKLSAgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9leHRlbmRlZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2V4dGVuZGVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXh0ZW5kZWUoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9leHRlbmRlZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfZXh0ZW5kZWUoOjpzdGQ6OnN0cmluZyogZXh0ZW5kZWUpOwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKLSAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2RlZmF1bHRfdmFsdWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFZhbHVlRmllbGROdW1iZXIgPSA3OwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfZGVmYXVsdF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2RlZmF1bHRfdmFsdWUoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9kZWZhdWx0X3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKLSAgYm9vbCBoYXNfb25lb2ZfaW5kZXgoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9vbmVvZl9pbmRleCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtPbmVvZkluZGV4RmllbGROdW1iZXIgPSA5OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG9uZW9mX2luZGV4KCkgY29uc3Q7Ci0gIHZvaWQgc2V0X29uZW9mX2luZGV4KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKLSAgYm9vbCBoYXNfanNvbl9uYW1lKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfanNvbl9uYW1lKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0pzb25OYW1lRmllbGROdW1iZXIgPSAxMDsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYganNvbl9uYW1lKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2pzb25fbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2pzb25fbmFtZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2pzb25fbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfanNvbl9uYW1lKDo6c3RkOjpzdHJpbmcqIGpzb25fbmFtZSk7Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7Ci0gIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9vcHRpb25zKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDg7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogb3B0aW9ucyk7Ci0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKLSBwcml2YXRlOgotICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19udW1iZXIoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX251bWJlcigpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2xhYmVsKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19sYWJlbCgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX3R5cGUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3R5cGUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc190eXBlX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2V4dGVuZGVlKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19leHRlbmRlZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19vbmVvZl9pbmRleCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb25lb2ZfaW5kZXgoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19qc29uX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2pzb25fbmFtZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcl87Ci0gIGludCBsYWJlbF87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHR5cGVfbmFtZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGV4dGVuZGVlXzsKLSAgaW50IHR5cGVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG9uZW9mX2luZGV4XzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZGVmYXVsdF92YWx1ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGpzb25fbmFtZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBvcHRpb25zXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgRmllbGREZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE9uZW9mRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBPbmVvZkRlc2NyaXB0b3JQcm90bygpOwotICB2aXJ0dWFsIH5PbmVvZkRlc2NyaXB0b3JQcm90bygpOwotCi0gIE9uZW9mRGVzY3JpcHRvclByb3RvKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLQotICBpbmxpbmUgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChPbmVvZkRlc2NyaXB0b3JQcm90byogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIE9uZW9mRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBPbmVvZkRlc2NyaXB0b3JQcm90byogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChPbmVvZkRlc2NyaXB0b3JQcm90byogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBib29sIGhhc19uYW1lKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbmFtZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOwotCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgT25lb2ZEZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVudW1EZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIEVudW1EZXNjcmlwdG9yUHJvdG8oKTsKLSAgdmlydHVhbCB+RW51bURlc2NyaXB0b3JQcm90bygpOwotCi0gIEVudW1EZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0KLSAgaW5saW5lIEVudW1EZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoRW51bURlc2NyaXB0b3JQcm90byogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIEVudW1EZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIEVudW1EZXNjcmlwdG9yUHJvdG8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7Ci0gIGludCB2YWx1ZV9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfdmFsdWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVmFsdWVGaWVsZE51bWJlciA9IDI7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiB2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV92YWx1ZShpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogYWRkX3ZhbHVlKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPioKLSAgICAgIG11dGFibGVfdmFsdWUoKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+JgotICAgICAgdmFsdWUoKSBjb25zdDsKLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOwotICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfb3B0aW9ucygpOwotICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSAzOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogb3B0aW9ucyk7Ci0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQotIHByaXZhdGU6Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4gdmFsdWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBvcHRpb25zXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgRW51bURlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKTsKLSAgdmlydHVhbCB+RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCk7Ci0KLSAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0KLSAgaW5saW5lIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKLQotICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOwotICBib29sIGhhc19udW1iZXIoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9udW1iZXIoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTnVtYmVyRmllbGROdW1iZXIgPSAyOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcigpIGNvbnN0OwotICB2b2lkIHNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOwotICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfb3B0aW9ucygpOwotICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSAzOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiBvcHRpb25zKTsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKLSBwcml2YXRlOgotICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19udW1iZXIoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX251bWJlcigpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnNfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcl87Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0KLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU2VydmljZURlc2NyaXB0b3JQcm90byA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgU2VydmljZURlc2NyaXB0b3JQcm90bygpOwotICB2aXJ0dWFsIH5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKCk7Ci0KLSAgU2VydmljZURlc2NyaXB0b3JQcm90byhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLQotICBpbmxpbmUgU2VydmljZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgU2VydmljZURlc2NyaXB0b3JQcm90byogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgU2VydmljZURlc2NyaXB0b3JQcm90byogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoU2VydmljZURlc2NyaXB0b3JQcm90byogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBib29sIGhhc19uYW1lKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbmFtZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7Ci0gIGludCBtZXRob2Rfc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX21ldGhvZCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtNZXRob2RGaWVsZE51bWJlciA9IDI7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBtZXRob2QoaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfbWV0aG9kKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBhZGRfbWV0aG9kKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPioKLSAgICAgIG11dGFibGVfbWV0aG9kKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiYKLSAgICAgIG1ldGhvZCgpIGNvbnN0OwotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci0gIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9vcHRpb25zKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDM7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBvcHRpb25zKTsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiBtZXRob2RfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBvcHRpb25zXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgU2VydmljZURlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTWV0aG9kRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBNZXRob2REZXNjcmlwdG9yUHJvdG8oKTsKLSAgdmlydHVhbCB+TWV0aG9kRGVzY3JpcHRvclByb3RvKCk7Ci0KLSAgTWV0aG9kRGVzY3JpcHRvclByb3RvKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0KLSAgaW5saW5lIE1ldGhvZERlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgTWV0aG9kRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBNZXRob2REZXNjcmlwdG9yUHJvdG8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7Ci0gIGJvb2wgaGFzX2lucHV0X3R5cGUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9pbnB1dF90eXBlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0lucHV0VHlwZUZpZWxkTnVtYmVyID0gMjsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgaW5wdXRfdHlwZSgpIGNvbnN0OwotICB2b2lkIHNldF9pbnB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9pbnB1dF90eXBlKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfaW5wdXRfdHlwZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfaW5wdXRfdHlwZSg6OnN0ZDo6c3RyaW5nKiBpbnB1dF90eXBlKTsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOwotICBib29sIGhhc19vdXRwdXRfdHlwZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX291dHB1dF90eXBlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga091dHB1dFR5cGVGaWVsZE51bWJlciA9IDM7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG91dHB1dF90eXBlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X291dHB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9vdXRwdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX291dHB1dF90eXBlKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfb3V0cHV0X3R5cGUoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX291dHB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIG91dHB1dF90eXBlKTsKLQotICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7Ci0gIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9vcHRpb25zKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDQ7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIG9wdGlvbnMpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGJvb2wgaGFzX2NsaWVudF9zdHJlYW1pbmcoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9jbGllbnRfc3RyZWFtaW5nKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NsaWVudFN0cmVhbWluZ0ZpZWxkTnVtYmVyID0gNTsKLSAgYm9vbCBjbGllbnRfc3RyZWFtaW5nKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2NsaWVudF9zdHJlYW1pbmcoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nID0gNiBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgYm9vbCBoYXNfc2VydmVyX3N0cmVhbWluZygpIGNvbnN0OwotICB2b2lkIGNsZWFyX3NlcnZlcl9zdHJlYW1pbmcoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrU2VydmVyU3RyZWFtaW5nRmllbGROdW1iZXIgPSA2OwotICBib29sIHNlcnZlcl9zdHJlYW1pbmcoKSBjb25zdDsKLSAgdm9pZCBzZXRfc2VydmVyX3N0cmVhbWluZyhib29sIHZhbHVlKTsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLSBwcml2YXRlOgotICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25hbWUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19pbnB1dF90eXBlKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX291dHB1dF90eXBlKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2NsaWVudF9zdHJlYW1pbmcoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2NsaWVudF9zdHJlYW1pbmcoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCk7Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgaW5wdXRfdHlwZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG91dHB1dF90eXBlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBvcHRpb25zXzsKLSAgYm9vbCBjbGllbnRfc3RyZWFtaW5nXzsKLSAgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgTWV0aG9kRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWxlT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgRmlsZU9wdGlvbnMoKTsKLSAgdmlydHVhbCB+RmlsZU9wdGlvbnMoKTsKLQotICBGaWxlT3B0aW9ucyhjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSk7Ci0KLSAgaW5saW5lIEZpbGVPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgRmlsZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKTsKLQotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIGlubGluZSBGaWxlT3B0aW9ucyogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgRmlsZU9wdGlvbnMqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB0eXBlZGVmIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBPcHRpbWl6ZU1vZGU7Ci0gIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgU1BFRUQgPQotICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9TUEVFRDsKLSAgc3RhdGljIGNvbnN0IE9wdGltaXplTW9kZSBDT0RFX1NJWkUgPQotICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9DT0RFX1NJWkU7Ci0gIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgTElURV9SVU5USU1FID0KLSAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTElURV9SVU5USU1FOwotICBzdGF0aWMgaW5saW5lIGJvb2wgT3B0aW1pemVNb2RlX0lzVmFsaWQoaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKHZhbHVlKTsKLSAgfQotICBzdGF0aWMgY29uc3QgT3B0aW1pemVNb2RlIE9wdGltaXplTW9kZV9NSU4gPQotICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfTUlOOwotICBzdGF0aWMgY29uc3QgT3B0aW1pemVNb2RlIE9wdGltaXplTW9kZV9NQVggPQotICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfTUFYOwotICBzdGF0aWMgY29uc3QgaW50IE9wdGltaXplTW9kZV9BUlJBWVNJWkUgPQotICAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9PcHRpbWl6ZU1vZGVfQVJSQVlTSVpFOwotICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqCi0gIE9wdGltaXplTW9kZV9kZXNjcmlwdG9yKCkgewotICAgIHJldHVybiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgT3B0aW1pemVNb2RlX05hbWUoT3B0aW1pemVNb2RlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9OYW1lKHZhbHVlKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIGJvb2wgT3B0aW1pemVNb2RlX1BhcnNlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUsCi0gICAgICBPcHRpbWl6ZU1vZGUqIHZhbHVlKSB7Ci0gICAgcmV0dXJuIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9QYXJzZShuYW1lLCB2YWx1ZSk7Ci0gIH0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOwotICBib29sIGhhc19qYXZhX3BhY2thZ2UoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9qYXZhX3BhY2thZ2UoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSmF2YVBhY2thZ2VGaWVsZE51bWJlciA9IDE7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGphdmFfcGFja2FnZSgpIGNvbnN0OwotICB2b2lkIHNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX3BhY2thZ2UoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9qYXZhX3BhY2thZ2UoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX2phdmFfcGFja2FnZSg6OnN0ZDo6c3RyaW5nKiBqYXZhX3BhY2thZ2UpOwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7Ci0gIGJvb2wgaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSmF2YU91dGVyQ2xhc3NuYW1lRmllbGROdW1iZXIgPSA4OwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBqYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0OwotICB2b2lkIHNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9qYXZhX291dGVyX2NsYXNzbmFtZSg6OnN0ZDo6c3RyaW5nKiBqYXZhX291dGVyX2NsYXNzbmFtZSk7Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGJvb2wgaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9qYXZhX211bHRpcGxlX2ZpbGVzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0phdmFNdWx0aXBsZUZpbGVzRmllbGROdW1iZXIgPSAxMDsKLSAgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0phdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hGaWVsZE51bWJlciA9IDIwOwotICBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtKYXZhU3RyaW5nQ2hlY2tVdGY4RmllbGROdW1iZXIgPSAyNzsKLSAgYm9vbCBqYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKLSAgYm9vbCBoYXNfb3B0aW1pemVfZm9yKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfb3B0aW1pemVfZm9yKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga09wdGltaXplRm9yRmllbGROdW1iZXIgPSA5OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IoKSBjb25zdDsKLSAgdm9pZCBzZXRfb3B0aW1pemVfZm9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKTsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgZ29fcGFja2FnZSA9IDExOwotICBib29sIGhhc19nb19wYWNrYWdlKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZ29fcGFja2FnZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtHb1BhY2thZ2VGaWVsZE51bWJlciA9IDExOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBnb19wYWNrYWdlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2dvX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9nb19wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfZ29fcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2dvX3BhY2thZ2UoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9nb19wYWNrYWdlKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9nb19wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGdvX3BhY2thZ2UpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBzdGF0aWMgY29uc3QgaW50IGtDY0dlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyID0gMTY7Ci0gIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OwotICB2b2lkIHNldF9jY19nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGJvb2wgaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OwotICB2b2lkIGNsZWFyX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBzdGF0aWMgY29uc3QgaW50IGtKYXZhR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXIgPSAxNzsKLSAgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKLSAgdm9pZCBzZXRfamF2YV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBzdGF0aWMgY29uc3QgaW50IGtQeUdlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyID0gMTg7Ci0gIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OwotICB2b2lkIHNldF9weV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAyMzsKLSAgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGJvb2wgaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9jY19lbmFibGVfYXJlbmFzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NjRW5hYmxlQXJlbmFzRmllbGROdW1iZXIgPSAzMTsKLSAgYm9vbCBjY19lbmFibGVfYXJlbmFzKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2NjX2VuYWJsZV9hcmVuYXMoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIG9iamNfY2xhc3NfcHJlZml4ID0gMzY7Ci0gIGJvb2wgaGFzX29iamNfY2xhc3NfcHJlZml4KCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrT2JqY0NsYXNzUHJlZml4RmllbGROdW1iZXIgPSAzNjsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgb2JqY19jbGFzc19wcmVmaXgoKSBjb25zdDsKLSAgdm9pZCBzZXRfb2JqY19jbGFzc19wcmVmaXgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9vYmpjX2NsYXNzX3ByZWZpeChjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9vYmpjX2NsYXNzX3ByZWZpeCgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfb2JqY19jbGFzc19wcmVmaXgoOjpzdGQ6OnN0cmluZyogb2JqY19jbGFzc19wcmVmaXgpOwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7Ci0gIGJvb2wgaGFzX2NzaGFycF9uYW1lc3BhY2UoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9jc2hhcnBfbmFtZXNwYWNlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0NzaGFycE5hbWVzcGFjZUZpZWxkTnVtYmVyID0gMzc7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGNzaGFycF9uYW1lc3BhY2UoKSBjb25zdDsKLSAgdm9pZCBzZXRfY3NoYXJwX25hbWVzcGFjZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9jc2hhcnBfbmFtZXNwYWNlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfY3NoYXJwX25hbWVzcGFjZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2NzaGFycF9uYW1lc3BhY2UoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX2NzaGFycF9uYW1lc3BhY2UoOjpzdGQ6OnN0cmluZyogY3NoYXJwX25hbWVzcGFjZSk7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLSAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLSAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7Ci0KLSAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoRmlsZU9wdGlvbnMpCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW1pemVfZm9yKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpbWl6ZV9mb3IoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19nb19wYWNrYWdlKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19jY19lbmFibGVfYXJlbmFzKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19jY19lbmFibGVfYXJlbmFzKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBqYXZhX3BhY2thZ2VfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBqYXZhX291dGVyX2NsYXNzbmFtZV87Ci0gIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlc187Ci0gIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfOwotICBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfOwotICBib29sIGNjX2dlbmVyaWNfc2VydmljZXNfOwotICBpbnQgb3B0aW1pemVfZm9yXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZ29fcGFja2FnZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG9iamNfY2xhc3NfcHJlZml4XzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgY3NoYXJwX25hbWVzcGFjZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotICBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlc187Ci0gIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlc187Ci0gIGJvb2wgZGVwcmVjYXRlZF87Ci0gIGJvb2wgY2NfZW5hYmxlX2FyZW5hc187Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0KLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIEZpbGVPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXNzYWdlT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgTWVzc2FnZU9wdGlvbnMoKTsKLSAgdmlydHVhbCB+TWVzc2FnZU9wdGlvbnMoKTsKLQotICBNZXNzYWdlT3B0aW9ucyhjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7Ci0KLSAgaW5saW5lIE1lc3NhZ2VPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgTWVzc2FnZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoTWVzc2FnZU9wdGlvbnMqIG90aGVyKTsKLQotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIGlubGluZSBNZXNzYWdlT3B0aW9ucyogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgTWVzc2FnZU9wdGlvbnMqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoTWVzc2FnZU9wdGlvbnMqIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0OwotICB2b2lkIGNsZWFyX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRXaXJlRm9ybWF0RmllbGROdW1iZXIgPSAxOwotICBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgY29uc3Q7Ci0gIHZvaWQgc2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGJvb2wgaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga05vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3JGaWVsZE51bWJlciA9IDI7Ci0gIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0OwotICB2b2lkIHNldF9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGJvb2wgaGFzX2RlcHJlY2F0ZWQoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9kZXByZWNhdGVkKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0RlcHJlY2F0ZWRGaWVsZE51bWJlciA9IDM7Ci0gIGJvb2wgZGVwcmVjYXRlZCgpIGNvbnN0OwotICB2b2lkIHNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgbWFwX2VudHJ5ID0gNzsKLSAgYm9vbCBoYXNfbWFwX2VudHJ5KCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbWFwX2VudHJ5KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga01hcEVudHJ5RmllbGROdW1iZXIgPSA3OwotICBib29sIG1hcF9lbnRyeSgpIGNvbnN0OwotICB2b2lkIHNldF9tYXBfZW50cnkoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLSAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLSAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7Ci0KLSAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoTWVzc2FnZU9wdGlvbnMpCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX21hcF9lbnRyeSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbWFwX2VudHJ5KCk7Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotICBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XzsKLSAgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXzsKLSAgYm9vbCBkZXByZWNhdGVkXzsKLSAgYm9vbCBtYXBfZW50cnlfOwotICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBNZXNzYWdlT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmllbGRPcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBGaWVsZE9wdGlvbnMoKTsKLSAgdmlydHVhbCB+RmllbGRPcHRpb25zKCk7Ci0KLSAgRmllbGRPcHRpb25zKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSk7Ci0KLSAgaW5saW5lIEZpZWxkT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBGaWVsZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoRmllbGRPcHRpb25zKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgRmllbGRPcHRpb25zKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBGaWVsZE9wdGlvbnMqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChGaWVsZE9wdGlvbnMqIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB0eXBlZGVmIEZpZWxkT3B0aW9uc19DVHlwZSBDVHlwZTsKLSAgc3RhdGljIGNvbnN0IENUeXBlIFNUUklORyA9Ci0gICAgRmllbGRPcHRpb25zX0NUeXBlX1NUUklORzsKLSAgc3RhdGljIGNvbnN0IENUeXBlIENPUkQgPQotICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DT1JEOwotICBzdGF0aWMgY29uc3QgQ1R5cGUgU1RSSU5HX1BJRUNFID0KLSAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HX1BJRUNFOwotICBzdGF0aWMgaW5saW5lIGJvb2wgQ1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKLSAgICByZXR1cm4gRmllbGRPcHRpb25zX0NUeXBlX0lzVmFsaWQodmFsdWUpOwotICB9Ci0gIHN0YXRpYyBjb25zdCBDVHlwZSBDVHlwZV9NSU4gPQotICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NSU47Ci0gIHN0YXRpYyBjb25zdCBDVHlwZSBDVHlwZV9NQVggPQotICAgIEZpZWxkT3B0aW9uc19DVHlwZV9DVHlwZV9NQVg7Ci0gIHN0YXRpYyBjb25zdCBpbnQgQ1R5cGVfQVJSQVlTSVpFID0KLSAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfQ1R5cGVfQVJSQVlTSVpFOwotICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqCi0gIENUeXBlX2Rlc2NyaXB0b3IoKSB7Ci0gICAgcmV0dXJuIEZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDVHlwZV9OYW1lKENUeXBlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIEZpZWxkT3B0aW9uc19DVHlwZV9OYW1lKHZhbHVlKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIGJvb2wgQ1R5cGVfUGFyc2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwKLSAgICAgIENUeXBlKiB2YWx1ZSkgewotICAgIHJldHVybiBGaWVsZE9wdGlvbnNfQ1R5cGVfUGFyc2UobmFtZSwgdmFsdWUpOwotICB9Ci0KLSAgdHlwZWRlZiBGaWVsZE9wdGlvbnNfSlNUeXBlIEpTVHlwZTsKLSAgc3RhdGljIGNvbnN0IEpTVHlwZSBKU19OT1JNQUwgPQotICAgIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfTk9STUFMOwotICBzdGF0aWMgY29uc3QgSlNUeXBlIEpTX1NUUklORyA9Ci0gICAgRmllbGRPcHRpb25zX0pTVHlwZV9KU19TVFJJTkc7Ci0gIHN0YXRpYyBjb25zdCBKU1R5cGUgSlNfTlVNQkVSID0KLSAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05VTUJFUjsKLSAgc3RhdGljIGlubGluZSBib29sIEpTVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgewotICAgIHJldHVybiBGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQodmFsdWUpOwotICB9Ci0gIHN0YXRpYyBjb25zdCBKU1R5cGUgSlNUeXBlX01JTiA9Ci0gICAgRmllbGRPcHRpb25zX0pTVHlwZV9KU1R5cGVfTUlOOwotICBzdGF0aWMgY29uc3QgSlNUeXBlIEpTVHlwZV9NQVggPQotICAgIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX01BWDsKLSAgc3RhdGljIGNvbnN0IGludCBKU1R5cGVfQVJSQVlTSVpFID0KLSAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9BUlJBWVNJWkU7Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcioKLSAgSlNUeXBlX2Rlc2NyaXB0b3IoKSB7Ci0gICAgcmV0dXJuIEZpZWxkT3B0aW9uc19KU1R5cGVfZGVzY3JpcHRvcigpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgSlNUeXBlX05hbWUoSlNUeXBlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIEZpZWxkT3B0aW9uc19KU1R5cGVfTmFtZSh2YWx1ZSk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSBib29sIEpTVHlwZV9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLAotICAgICAgSlNUeXBlKiB2YWx1ZSkgewotICAgIHJldHVybiBGaWVsZE9wdGlvbnNfSlNUeXBlX1BhcnNlKG5hbWUsIHZhbHVlKTsKLSAgfQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKLSAgYm9vbCBoYXNfY3R5cGUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9jdHlwZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtDdHlwZUZpZWxkTnVtYmVyID0gMTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGUgY3R5cGUoKSBjb25zdDsKLSAgdm9pZCBzZXRfY3R5cGUoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGUgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKLSAgYm9vbCBoYXNfcGFja2VkKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfcGFja2VkKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1BhY2tlZEZpZWxkTnVtYmVyID0gMjsKLSAgYm9vbCBwYWNrZWQoKSBjb25zdDsKLSAgdm9pZCBzZXRfcGFja2VkKGJvb2wgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKLSAgYm9vbCBoYXNfanN0eXBlKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfanN0eXBlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0pzdHlwZUZpZWxkTnVtYmVyID0gNjsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlIGpzdHlwZSgpIGNvbnN0OwotICB2b2lkIHNldF9qc3R5cGUoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlIHZhbHVlKTsKLQotICAvLyBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19sYXp5KCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbGF6eSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtMYXp5RmllbGROdW1iZXIgPSA1OwotICBib29sIGxhenkoKSBjb25zdDsKLSAgdm9pZCBzZXRfbGF6eShib29sIHZhbHVlKTsKLQotICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzOwotICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKLSAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKLQotICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgYm9vbCBoYXNfd2VhaygpIGNvbnN0OwotICB2b2lkIGNsZWFyX3dlYWsoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrV2Vha0ZpZWxkTnVtYmVyID0gMTA7Ci0gIGJvb2wgd2VhaygpIGNvbnN0OwotICB2b2lkIHNldF93ZWFrKGJvb2wgdmFsdWUpOwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCi0gICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi0gICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OwotCi0gIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKEZpZWxkT3B0aW9ucykKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19jdHlwZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfY3R5cGUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19wYWNrZWQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3BhY2tlZCgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2pzdHlwZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfanN0eXBlKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfbGF6eSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbGF6eSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc193ZWFrKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc193ZWFrKCk7Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIGludCBjdHlwZV87Ci0gIGludCBqc3R5cGVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLSAgYm9vbCBwYWNrZWRfOwotICBib29sIGxhenlfOwotICBib29sIGRlcHJlY2F0ZWRfOwotICBib29sIHdlYWtfOwotICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBGaWVsZE9wdGlvbnMqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVudW1PcHRpb25zIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBFbnVtT3B0aW9ucygpOwotICB2aXJ0dWFsIH5FbnVtT3B0aW9ucygpOwotCi0gIEVudW1PcHRpb25zKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKTsKLQotICBpbmxpbmUgRW51bU9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBFbnVtT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChFbnVtT3B0aW9ucyogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIEVudW1PcHRpb25zKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBFbnVtT3B0aW9ucyogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChFbnVtT3B0aW9ucyogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7Ci0gIGJvb2wgaGFzX2FsbG93X2FsaWFzKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfYWxsb3dfYWxpYXMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrQWxsb3dBbGlhc0ZpZWxkTnVtYmVyID0gMjsKLSAgYm9vbCBhbGxvd19hbGlhcygpIGNvbnN0OwotICB2b2lkIHNldF9hbGxvd19hbGlhcyhib29sIHZhbHVlKTsKLQotICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzOwotICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKLSAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKLQotICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgotICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKLQotICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhFbnVtT3B0aW9ucykKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKLSBwcml2YXRlOgotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2FsbG93X2FsaWFzKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19hbGxvd19hbGlhcygpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87Ci0gIGJvb2wgYWxsb3dfYWxpYXNfOwotICBib29sIGRlcHJlY2F0ZWRfOwotICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBFbnVtT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRW51bVZhbHVlT3B0aW9ucyA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgRW51bVZhbHVlT3B0aW9ucygpOwotICB2aXJ0dWFsIH5FbnVtVmFsdWVPcHRpb25zKCk7Ci0KLSAgRW51bVZhbHVlT3B0aW9ucyhjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKTsKLQotICBpbmxpbmUgRW51bVZhbHVlT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgRW51bVZhbHVlT3B0aW9ucyogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgRW51bVZhbHVlT3B0aW9ucyogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoRW51bVZhbHVlT3B0aW9ucyogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2RlcHJlY2F0ZWQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMTsKLSAgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLSAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLSAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7Ci0KLSAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoRW51bVZhbHVlT3B0aW9ucykKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotIHByaXZhdGU6Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLSAgYm9vbCBkZXByZWNhdGVkXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgRW51bVZhbHVlT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU2VydmljZU9wdGlvbnMgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIFNlcnZpY2VPcHRpb25zKCk7Ci0gIHZpcnR1YWwgflNlcnZpY2VPcHRpb25zKCk7Ci0KLSAgU2VydmljZU9wdGlvbnMoY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pOwotCi0gIGlubGluZSBTZXJ2aWNlT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFNlcnZpY2VPcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgdm9pZCBTd2FwKFNlcnZpY2VPcHRpb25zKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgU2VydmljZU9wdGlvbnMqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIFNlcnZpY2VPcHRpb25zKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKFNlcnZpY2VPcHRpb25zKiBvdGhlcik7Ci0gIHByaXZhdGU6Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOwotICB9Ci0gIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKLSAgfQotICBwdWJsaWM6Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2RlcHJlY2F0ZWQoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMzM7Ci0gIGJvb2wgZGVwcmVjYXRlZCgpIGNvbnN0OwotICB2b2lkIHNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOwotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCi0gICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi0gICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OwotCi0gIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKFNlcnZpY2VPcHRpb25zKQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQotIHByaXZhdGU6Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLSAgYm9vbCBkZXByZWNhdGVkXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgU2VydmljZU9wdGlvbnMqIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1ldGhvZE9wdGlvbnMgOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIE1ldGhvZE9wdGlvbnMoKTsKLSAgdmlydHVhbCB+TWV0aG9kT3B0aW9ucygpOwotCi0gIE1ldGhvZE9wdGlvbnMoY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSk7Ci0KLSAgaW5saW5lIE1ldGhvZE9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IE1ldGhvZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoTWV0aG9kT3B0aW9ucyogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIE1ldGhvZE9wdGlvbnMqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIE1ldGhvZE9wdGlvbnMqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBNZXRob2RPcHRpb25zJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKE1ldGhvZE9wdGlvbnMqIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOwotICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzMzsKLSAgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7Ci0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLSAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLSAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7Ci0KLSAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoTWV0aG9kT3B0aW9ucykKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQotIHByaXZhdGU6Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLSAgYm9vbCBkZXByZWNhdGVkXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgTWV0aG9kT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpOwotICB2aXJ0dWFsIH5VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCk7Ci0KLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydChjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKTsKLQotICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgb3BlcmF0b3I9KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7Ci0gIGJvb2wgaGFzX25hbWVfcGFydCgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWVfcGFydCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtOYW1lUGFydEZpZWxkTnVtYmVyID0gMTsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZV9wYXJ0KCkgY29uc3Q7Ci0gIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWVfcGFydCgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWVfcGFydCgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZV9wYXJ0KDo6c3RkOjpzdHJpbmcqIG5hbWVfcGFydCk7Ci0KLSAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwotICBib29sIGhhc19pc19leHRlbnNpb24oKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9pc19leHRlbnNpb24oKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDI7Ci0gIGJvb2wgaXNfZXh0ZW5zaW9uKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2lzX2V4dGVuc2lvbihib29sIHZhbHVlKTsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lX3BhcnQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX25hbWVfcGFydCgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2lzX2V4dGVuc2lvbigpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfaXNfZXh0ZW5zaW9uKCk7Ci0KLSAgLy8gaGVscGVyIGZvciBCeXRlU2l6ZSgpCi0gIGludCBSZXF1aXJlZEZpZWxkc0J5dGVTaXplRmFsbGJhY2soKSBjb25zdDsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfcGFydF87Ci0gIGJvb2wgaXNfZXh0ZW5zaW9uXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVW5pbnRlcnByZXRlZE9wdGlvbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgVW5pbnRlcnByZXRlZE9wdGlvbigpOwotICB2aXJ0dWFsIH5VbmludGVycHJldGVkT3B0aW9uKCk7Ci0KLSAgVW5pbnRlcnByZXRlZE9wdGlvbihjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKLQotICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3BlcmF0b3I9KGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChVbmludGVycHJldGVkT3B0aW9uKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgVW5pbnRlcnByZXRlZE9wdGlvbiogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgVW5pbnRlcnByZXRlZE9wdGlvbiogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHR5cGVkZWYgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCBOYW1lUGFydDsKLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKLSAgaW50IG5hbWVfc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX25hbWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMjsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBuYW1lKGludCBpbmRleCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogbXV0YWJsZV9uYW1lKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogYWRkX25hbWUoKTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPioKLSAgICAgIG11dGFibGVfbmFtZSgpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+JgotICAgICAgbmFtZSgpIGNvbnN0OwotCi0gIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKLSAgYm9vbCBoYXNfaWRlbnRpZmllcl92YWx1ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrSWRlbnRpZmllclZhbHVlRmllbGROdW1iZXIgPSAzOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpZGVudGlmaWVyX3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9pZGVudGlmaWVyX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGlkZW50aWZpZXJfdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OwotICBib29sIGhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUG9zaXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyID0gNDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X3Bvc2l0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCB2YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKLSAgYm9vbCBoYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfbmVnYXRpdmVfaW50X3ZhbHVlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga05lZ2F0aXZlSW50VmFsdWVGaWVsZE51bWJlciA9IDU7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X25lZ2F0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IHZhbHVlKTsKLQotICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKLSAgYm9vbCBoYXNfZG91YmxlX3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfZG91YmxlX3ZhbHVlKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0RvdWJsZVZhbHVlRmllbGROdW1iZXIgPSA2OwotICBkb3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2RvdWJsZV92YWx1ZShkb3VibGUgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7Ci0gIGJvb2wgaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3N0cmluZ192YWx1ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtTdHJpbmdWYWx1ZUZpZWxkTnVtYmVyID0gNzsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyaW5nX3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3N0cmluZ192YWx1ZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3N0cmluZ192YWx1ZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfc3RyaW5nX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIHN0cmluZ192YWx1ZSk7Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7Ci0gIGJvb2wgaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtBZ2dyZWdhdGVWYWx1ZUZpZWxkTnVtYmVyID0gODsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgYWdncmVnYXRlX3ZhbHVlKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfYWdncmVnYXRlX3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZSk7Ci0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQotIHByaXZhdGU6Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19kb3VibGVfdmFsdWUoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RvdWJsZV92YWx1ZSgpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4gbmFtZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGlkZW50aWZpZXJfdmFsdWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IG5lZ2F0aXZlX2ludF92YWx1ZV87Ci0gIGRvdWJsZSBkb3VibGVfdmFsdWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBzdHJpbmdfdmFsdWVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBhZ2dyZWdhdGVfdmFsdWVfOwotICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBVbmludGVycHJldGVkT3B0aW9uKiBkZWZhdWx0X2luc3RhbmNlXzsKLX07Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewotIHB1YmxpYzoKLSAgU291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKLSAgdmlydHVhbCB+U291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKLQotICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbihjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSk7Ci0KLSAgaW5saW5lIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBvcGVyYXRvcj0oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pIHsKLSAgICBDb3B5RnJvbShmcm9tKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoU291cmNlQ29kZUluZm9fTG9jYXRpb24qIG90aGVyKTsKLQotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIGlubGluZSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9Ci0KLSAgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKTsKLSAgdm9pZCBDbGVhcigpOwotICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLQotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLSAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9Ci0gIHByaXZhdGU6Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotICB2b2lkIFNoYXJlZER0b3IoKTsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLSAgdm9pZCBJbnRlcm5hbFN3YXAoU291cmNlQ29kZUluZm9fTG9jYXRpb24qIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgaW50IHBhdGhfc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3BhdGgoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUGF0aEZpZWxkTnVtYmVyID0gMTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBwYXRoKGludCBpbmRleCkgY29uc3Q7Ci0gIHZvaWQgc2V0X3BhdGgoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgdm9pZCBhZGRfcGF0aCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi0gICAgICBwYXRoKCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgotICAgICAgbXV0YWJsZV9wYXRoKCk7Ci0KLSAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOwotICBpbnQgc3Bhbl9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfc3BhbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtTcGFuRmllbGROdW1iZXIgPSAyOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHNwYW4oaW50IGluZGV4KSBjb25zdDsKLSAgdm9pZCBzZXRfc3BhbihpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICB2b2lkIGFkZF9zcGFuKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLSAgICAgIHNwYW4oKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi0gICAgICBtdXRhYmxlX3NwYW4oKTsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7Ci0gIGJvb2wgaGFzX2xlYWRpbmdfY29tbWVudHMoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9sZWFkaW5nX2NvbW1lbnRzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0xlYWRpbmdDb21tZW50c0ZpZWxkTnVtYmVyID0gMzsKLSAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbGVhZGluZ19jb21tZW50cygpIGNvbnN0OwotICB2b2lkIHNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfbGVhZGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbGVhZGluZ19jb21tZW50cygpOwotICB2b2lkIHNldF9hbGxvY2F0ZWRfbGVhZGluZ19jb21tZW50cyg6OnN0ZDo6c3RyaW5nKiBsZWFkaW5nX2NvbW1lbnRzKTsKLQotICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OwotICBib29sIGhhc190cmFpbGluZ19jb21tZW50cygpIGNvbnN0OwotICB2b2lkIGNsZWFyX3RyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1RyYWlsaW5nQ29tbWVudHNGaWVsZE51bWJlciA9IDQ7Ci0gIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHRyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgdm9pZCBzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF90cmFpbGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3RyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfdHJhaWxpbmdfY29tbWVudHMoKTsKLSAgdm9pZCBzZXRfYWxsb2NhdGVkX3RyYWlsaW5nX2NvbW1lbnRzKDo6c3RkOjpzdHJpbmcqIHRyYWlsaW5nX2NvbW1lbnRzKTsKLQotICAvLyByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7Ci0gIGludCBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0xlYWRpbmdEZXRhY2hlZENvbW1lbnRzRmllbGROdW1iZXIgPSA2OwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCkgY29uc3Q7Ci0gIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgpOwotICB2b2lkIHNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICB2b2lkIHNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIHNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogYWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKTsKLSAgdm9pZCBhZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgYWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpOwotICB2b2lkIGFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCk7Ci0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKLSBwcml2YXRlOgotICBpbmxpbmUgdm9pZCBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+IHBhdGhfOwotICBtdXRhYmxlIGludCBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4gc3Bhbl87Ci0gIG11dGFibGUgaW50IF9zcGFuX2NhY2hlZF9ieXRlX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBsZWFkaW5nX2NvbW1lbnRzXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgdHJhaWxpbmdfY29tbWVudHNfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfOwotICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotCi0gIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7Ci0gIHN0YXRpYyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogZGVmYXVsdF9pbnN0YW5jZV87Ci19OwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU291cmNlQ29kZUluZm8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIFNvdXJjZUNvZGVJbmZvKCk7Ci0gIHZpcnR1YWwgflNvdXJjZUNvZGVJbmZvKCk7Ci0KLSAgU291cmNlQ29kZUluZm8oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pOwotCi0gIGlubGluZSBTb3VyY2VDb2RlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0KLSAgdm9pZCBTd2FwKFNvdXJjZUNvZGVJbmZvKiBvdGhlcik7Ci0KLSAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBpbmxpbmUgU291cmNlQ29kZUluZm8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIFNvdXJjZUNvZGVJbmZvKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKFNvdXJjZUNvZGVJbmZvKiBvdGhlcik7Ci0gIHByaXZhdGU6Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOwotICB9Ci0gIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKLSAgfQotICBwdWJsaWM6Ci0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgdHlwZWRlZiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiBMb2NhdGlvbjsKLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOwotICBpbnQgbG9jYXRpb25fc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2xvY2F0aW9uKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0xvY2F0aW9uRmllbGROdW1iZXIgPSAxOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBsb2NhdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBtdXRhYmxlX2xvY2F0aW9uKGludCBpbmRleCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIGFkZF9sb2NhdGlvbigpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPioKLSAgICAgIG11dGFibGVfbG9jYXRpb24oKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4mCi0gICAgICBsb2NhdGlvbigpIGNvbnN0OwotCi0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCi0gcHJpdmF0ZToKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07Ci0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+IGxvY2F0aW9uXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgU291cmNlQ29kZUluZm8qIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKLSBwdWJsaWM6Ci0gIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oKTsKLSAgdmlydHVhbCB+R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbigpOwotCi0gIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oY29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgZnJvbSk7Ci0KLSAgaW5saW5lIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIG9wZXJhdG9yPShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKSB7Ci0gICAgQ29weUZyb20oZnJvbSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKLSAgc3RhdGljIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLQotICB2b2lkIFN3YXAoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQotCi0gIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgZnJvbSk7Ci0gIHZvaWQgQ2xlYXIoKTsKLSAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgaW50IEJ5dGVTaXplKCkgY29uc3Q7Ci0gIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7Ci0gIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQotICBwcml2YXRlOgotICB2b2lkIFNoYXJlZEN0b3IoKTsKLSAgdm9pZCBTaGFyZWREdG9yKCk7Ci0gIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0gIHZvaWQgSW50ZXJuYWxTd2FwKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIG90aGVyKTsKLSAgcHJpdmF0ZToKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7Ci0gIH0KLSAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOwotICB9Ci0gIHB1YmxpYzoKLQotICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgaW50IHBhdGhfc2l6ZSgpIGNvbnN0OwotICB2b2lkIGNsZWFyX3BhdGgoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUGF0aEZpZWxkTnVtYmVyID0gMTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBwYXRoKGludCBpbmRleCkgY29uc3Q7Ci0gIHZvaWQgc2V0X3BhdGgoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgdm9pZCBhZGRfcGF0aCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi0gICAgICBwYXRoKCkgY29uc3Q7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgotICAgICAgbXV0YWJsZV9wYXRoKCk7Ci0KLSAgLy8gb3B0aW9uYWwgc3RyaW5nIHNvdXJjZV9maWxlID0gMjsKLSAgYm9vbCBoYXNfc291cmNlX2ZpbGUoKSBjb25zdDsKLSAgdm9pZCBjbGVhcl9zb3VyY2VfZmlsZSgpOwotICBzdGF0aWMgY29uc3QgaW50IGtTb3VyY2VGaWxlRmllbGROdW1iZXIgPSAyOwotICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzb3VyY2VfZmlsZSgpIGNvbnN0OwotICB2b2lkIHNldF9zb3VyY2VfZmlsZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIHZvaWQgc2V0X3NvdXJjZV9maWxlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgdm9pZCBzZXRfc291cmNlX2ZpbGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9zb3VyY2VfZmlsZSgpOwotICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3NvdXJjZV9maWxlKCk7Ci0gIHZvaWQgc2V0X2FsbG9jYXRlZF9zb3VyY2VfZmlsZSg6OnN0ZDo6c3RyaW5nKiBzb3VyY2VfZmlsZSk7Ci0KLSAgLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOwotICBib29sIGhhc19iZWdpbigpIGNvbnN0OwotICB2b2lkIGNsZWFyX2JlZ2luKCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0JlZ2luRmllbGROdW1iZXIgPSAzOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGJlZ2luKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2JlZ2luKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotCi0gIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7Ci0gIGJvb2wgaGFzX2VuZCgpIGNvbnN0OwotICB2b2lkIGNsZWFyX2VuZCgpOwotICBzdGF0aWMgY29uc3QgaW50IGtFbmRGaWVsZE51bWJlciA9IDQ7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZW5kKCkgY29uc3Q7Ci0gIHZvaWQgc2V0X2VuZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCi0gcHJpdmF0ZToKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19zb3VyY2VfZmlsZSgpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc291cmNlX2ZpbGUoKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19iZWdpbigpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfYmVnaW4oKTsKLSAgaW5saW5lIHZvaWQgc2V0X2hhc19lbmQoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2VuZCgpOwotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4gcGF0aF87Ci0gIG11dGFibGUgaW50IF9wYXRoX2NhY2hlZF9ieXRlX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBzb3VyY2VfZmlsZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgYmVnaW5fOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVuZF87Ci0gIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0KLSAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKLSAgc3RhdGljIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEdlbmVyYXRlZENvZGVJbmZvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7Ci0gcHVibGljOgotICBHZW5lcmF0ZWRDb2RlSW5mbygpOwotICB2aXJ0dWFsIH5HZW5lcmF0ZWRDb2RlSW5mbygpOwotCi0gIEdlbmVyYXRlZENvZGVJbmZvKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBmcm9tKTsKLQotICBpbmxpbmUgR2VuZXJhdGVkQ29kZUluZm8mIG9wZXJhdG9yPShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZnJvbSkgewotICAgIENvcHlGcm9tKGZyb20pOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKLSAgfQotCi0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7Ci0gIHN0YXRpYyBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotCi0gIHZvaWQgU3dhcChHZW5lcmF0ZWRDb2RlSW5mbyogb3RoZXIpOwotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW5saW5lIEdlbmVyYXRlZENvZGVJbmZvKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KLQotICBHZW5lcmF0ZWRDb2RlSW5mbyogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwotICB2b2lkIENvcHlGcm9tKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBmcm9tKTsKLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGZyb20pOwotICB2b2lkIENsZWFyKCk7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OwotICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KLSAgcHJpdmF0ZToKLSAgdm9pZCBTaGFyZWRDdG9yKCk7Ci0gIHZvaWQgU2hhcmVkRHRvcigpOwotICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OwotICB2b2lkIEludGVybmFsU3dhcChHZW5lcmF0ZWRDb2RlSW5mbyogb3RoZXIpOwotICBwcml2YXRlOgotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKLSAgfQotICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKLSAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7Ci0gIH0KLSAgcHVibGljOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLQotICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHR5cGVkZWYgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiBBbm5vdGF0aW9uOwotCi0gIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAxOwotICBpbnQgYW5ub3RhdGlvbl9zaXplKCkgY29uc3Q7Ci0gIHZvaWQgY2xlYXJfYW5ub3RhdGlvbigpOwotICBzdGF0aWMgY29uc3QgaW50IGtBbm5vdGF0aW9uRmllbGROdW1iZXIgPSAxOwotICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGFubm90YXRpb24oaW50IGluZGV4KSBjb25zdDsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBtdXRhYmxlX2Fubm90YXRpb24oaW50IGluZGV4KTsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBhZGRfYW5ub3RhdGlvbigpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA+KgotICAgICAgbXV0YWJsZV9hbm5vdGF0aW9uKCk7Ci0gIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uID4mCi0gICAgICBhbm5vdGF0aW9uKCkgY29uc3Q7Ci0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKLSBwcml2YXRlOgotCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPiBhbm5vdGF0aW9uXzsKLSAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLQotICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwotICBzdGF0aWMgR2VuZXJhdGVkQ29kZUluZm8qIGRlZmF1bHRfaW5zdGFuY2VfOwotfTsKLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSNpZiAhUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyBGaWxlRGVzY3JpcHRvclNldAotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZSA9IDE7Ci1pbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yU2V0OjpmaWxlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBmaWxlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6Y2xlYXJfZmlsZSgpIHsKLSAgZmlsZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yU2V0OjpmaWxlKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQotICByZXR1cm4gZmlsZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yU2V0OjptdXRhYmxlX2ZpbGUoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQotICByZXR1cm4gZmlsZV8uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclNldDo6YWRkX2ZpbGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCi0gIHJldHVybiBmaWxlXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgotRmlsZURlc2NyaXB0b3JTZXQ6Om11dGFibGVfZmlsZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZSkKLSAgcmV0dXJuICZmaWxlXzsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgotRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQotICByZXR1cm4gZmlsZV87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRmlsZURlc2NyaXB0b3JQcm90bwotCi0vLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci1pbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgewotICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19uYW1lKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIGNsZWFyX2hhc19uYW1lKCk7Ci0gIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7Ci1pbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfcGFja2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3BhY2thZ2UoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfcGFja2FnZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9wYWNrYWdlKCkgewotICBwYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19wYWNrYWdlKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6cGFja2FnZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQotICByZXR1cm4gcGFja2FnZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19wYWNrYWdlKCk7Ci0gIHBhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfcGFja2FnZSgpOwotICBwYWNrYWdlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX3BhY2thZ2UoKTsKLSAgcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3BhY2thZ2UoKSB7Ci0gIHNldF9oYXNfcGFja2FnZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQotICByZXR1cm4gcGFja2FnZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3BhY2thZ2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCi0gIGNsZWFyX2hhc19wYWNrYWdlKCk7Ci0gIHJldHVybiBwYWNrYWdlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIHBhY2thZ2UpIHsKLSAgaWYgKHBhY2thZ2UgIT0gTlVMTCkgewotICAgIHNldF9oYXNfcGFja2FnZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19wYWNrYWdlKCk7Ci0gIH0KLSAgcGFja2FnZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHBhY2thZ2UpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQotfQotCi0vLyByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7Ci1pbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGRlcGVuZGVuY3lfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2RlcGVuZGVuY3koKSB7Ci0gIGRlcGVuZGVuY3lfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQotICByZXR1cm4gZGVwZW5kZW5jeV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlcGVuZGVuY3koaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCi0gIHJldHVybiBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQotICBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKLSAgZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCi0gIHJldHVybiBkZXBlbmRlbmN5Xy5BZGQoKTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIGRlcGVuZGVuY3lfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCi19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBkZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCi19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgZGVwZW5kZW5jeV8uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgotRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVwZW5kZW5jeSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLSAgcmV0dXJuIGRlcGVuZGVuY3lfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCi1GaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlcGVuZGVuY3koKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKLSAgcmV0dXJuICZkZXBlbmRlbmN5XzsKLX0KLQotLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKLWlubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6cHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5Xy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9wdWJsaWNfZGVwZW5kZW5jeSgpIHsKLSAgcHVibGljX2RlcGVuZGVuY3lfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWxlRGVzY3JpcHRvclByb3RvOjpwdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKLSAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3B1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBwdWJsaWNfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCi19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfcHVibGljX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBwdWJsaWNfZGVwZW5kZW5jeV8uQWRkKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKLSAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5XzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCi0gIHJldHVybiAmcHVibGljX2RlcGVuZGVuY3lfOwotfQotCi0vLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKLWlubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3dlYWtfZGVwZW5kZW5jeSgpIHsKLSAgd2Vha19kZXBlbmRlbmN5Xy5DbGVhcigpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLndlYWtfZGVwZW5kZW5jeSkKLSAgcmV0dXJuIHdlYWtfZGVwZW5kZW5jeV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF93ZWFrX2RlcGVuZGVuY3koaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHdlYWtfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3dlYWtfZGVwZW5kZW5jeSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHdlYWtfZGVwZW5kZW5jeV8uQWRkKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCi19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi1GaWxlRGVzY3JpcHRvclByb3RvOjp3ZWFrX2RlcGVuZGVuY3koKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLndlYWtfZGVwZW5kZW5jeSkKLSAgcmV0dXJuIHdlYWtfZGVwZW5kZW5jeV87Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi1GaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCi0gIHJldHVybiAmd2Vha19kZXBlbmRlbmN5XzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKLWlubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBtZXNzYWdlX3R5cGVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX21lc3NhZ2VfdHlwZSgpIHsKLSAgbWVzc2FnZV90eXBlXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjptZXNzYWdlX3R5cGUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQotICByZXR1cm4gbWVzc2FnZV90eXBlXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQotICByZXR1cm4gbWVzc2FnZV90eXBlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX21lc3NhZ2VfdHlwZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUpCi0gIHJldHVybiBtZXNzYWdlX3R5cGVfLkFkZCgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWVzc2FnZV90eXBlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSkKLSAgcmV0dXJuICZtZXNzYWdlX3R5cGVfOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om1lc3NhZ2VfdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQotICByZXR1cm4gbWVzc2FnZV90eXBlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDU7Ci1pbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZV9zaXplKCkgY29uc3QgewotICByZXR1cm4gZW51bV90eXBlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9lbnVtX3R5cGUoKSB7Ci0gIGVudW1fdHlwZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQotICByZXR1cm4gZW51bV90eXBlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9lbnVtX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQotICByZXR1cm4gZW51bV90eXBlXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgotRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQotICByZXR1cm4gJmVudW1fdHlwZV87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQotICByZXR1cm4gZW51bV90eXBlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OwotaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXJ2aWNlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zZXJ2aWNlKCkgewotICBzZXJ2aWNlXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlKQotICByZXR1cm4gc2VydmljZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc2VydmljZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKLSAgcmV0dXJuIHNlcnZpY2VfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3NlcnZpY2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKLSAgcmV0dXJuIHNlcnZpY2VfLkFkZCgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvID4qCi1GaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3NlcnZpY2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKLSAgcmV0dXJuICZzZXJ2aWNlXzsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+JgotRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKLSAgcmV0dXJuIHNlcnZpY2VfOwotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7Ci1pbmxpbmUgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgewotICByZXR1cm4gZXh0ZW5zaW9uXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9leHRlbnNpb24oKSB7Ci0gIGV4dGVuc2lvbl8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQotICByZXR1cm4gZXh0ZW5zaW9uXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9leHRlbnNpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQotICByZXR1cm4gZXh0ZW5zaW9uXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKLSAgcmV0dXJuICZleHRlbnNpb25fOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgotRmlsZURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fOwotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OwotaW5saW5lIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAyMDB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAyMDB1OwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAyMDB1OwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKLSAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zOjpDbGVhcigpOwotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMmIEZpbGVEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKLSAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICByZXR1cm4gb3B0aW9uc187Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgcmV0dXJuIHRlbXA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogb3B0aW9ucykgewotICBkZWxldGUgb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gb3B0aW9uczsKLSAgaWYgKG9wdGlvbnMpIHsKLSAgICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi19Ci0KLS8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7Ci1pbmxpbmUgYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDQwMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3NvdXJjZV9jb2RlX2luZm8oKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDQwMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDQwMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zb3VyY2VfY29kZV9pbmZvKCkgewotICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7Ci0gIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyYgRmlsZURlc2NyaXB0b3JQcm90bzo6c291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQotICByZXR1cm4gc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCA/ICpzb3VyY2VfY29kZV9pbmZvXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+c291cmNlX2NvZGVfaW5mb187Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCkgewotICBzZXRfaGFzX3NvdXJjZV9jb2RlX2luZm8oKTsKLSAgaWYgKHNvdXJjZV9jb2RlX2luZm9fID09IE5VTEwpIHsKLSAgICBzb3VyY2VfY29kZV9pbmZvXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCi0gIHJldHVybiBzb3VyY2VfY29kZV9pbmZvXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3NvdXJjZV9jb2RlX2luZm8oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCi0gIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHRlbXAgPSBzb3VyY2VfY29kZV9pbmZvXzsKLSAgc291cmNlX2NvZGVfaW5mb18gPSBOVUxMOwotICByZXR1cm4gdGVtcDsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfc291cmNlX2NvZGVfaW5mbyg6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvKSB7Ci0gIGRlbGV0ZSBzb3VyY2VfY29kZV9pbmZvXzsKLSAgc291cmNlX2NvZGVfaW5mb18gPSBzb3VyY2VfY29kZV9pbmZvOwotICBpZiAoc291cmNlX2NvZGVfaW5mbykgewotICAgIHNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc291cmNlX2NvZGVfaW5mbykKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOwotaW5saW5lIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX3N5bnRheCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDgwMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3N5bnRheCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwODAwdTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19zeW50YXgoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA4MDB1OwotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfc3ludGF4KCkgewotICBzeW50YXhfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX3N5bnRheCgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVEZXNjcmlwdG9yUHJvdG86OnN5bnRheCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCi0gIHJldHVybiBzeW50YXhfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9zeW50YXgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19zeW50YXgoKTsKLSAgc3ludGF4Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKLX0KLWlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9zeW50YXgoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19zeW50YXgoKTsKLSAgc3ludGF4Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQotfQotaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3N5bnRheChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19zeW50YXgoKTsKLSAgc3ludGF4Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9zeW50YXgoKSB7Ci0gIHNldF9oYXNfc3ludGF4KCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKLSAgcmV0dXJuIHN5bnRheF8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3N5bnRheCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQotICBjbGVhcl9oYXNfc3ludGF4KCk7Ci0gIHJldHVybiBzeW50YXhfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX3N5bnRheCg6OnN0ZDo6c3RyaW5nKiBzeW50YXgpIHsKLSAgaWYgKHN5bnRheCAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19zeW50YXgoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfc3ludGF4KCk7Ci0gIH0KLSAgc3ludGF4Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgc3ludGF4KTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZQotCi0vLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Ci1pbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Omhhc19zdGFydCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9oYXNfc3RhcnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmNsZWFyX2hhc19zdGFydCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmNsZWFyX3N0YXJ0KCkgewotICBzdGFydF8gPSAwOwotICBjbGVhcl9oYXNfc3RhcnQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c3RhcnQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5zdGFydCkKLSAgcmV0dXJuIHN0YXJ0XzsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X3N0YXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgc2V0X2hhc19zdGFydCgpOwotICBzdGFydF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLnN0YXJ0KQotfQotCi0vLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOwotaW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpoYXNfZW5kKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X2hhc19lbmQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmNsZWFyX2hhc19lbmQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpjbGVhcl9lbmQoKSB7Ci0gIGVuZF8gPSAwOwotICBjbGVhcl9oYXNfZW5kKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmVuZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLmVuZCkKLSAgcmV0dXJuIGVuZF87Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OnNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzZXRfaGFzX2VuZCgpOwotICBlbmRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5lbmQpCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UKLQotLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOwotaW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Omhhc19zdGFydCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6c2V0X2hhc19zdGFydCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpjbGVhcl9oYXNfc3RhcnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmNsZWFyX3N0YXJ0KCkgewotICBzdGFydF8gPSAwOwotICBjbGVhcl9oYXNfc3RhcnQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzdGFydCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2Uuc3RhcnQpCi0gIHJldHVybiBzdGFydF87Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6c2V0X3N0YXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgc2V0X2hhc19zdGFydCgpOwotICBzdGFydF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2Uuc3RhcnQpCi19Ci0KLS8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7Ci1pbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6aGFzX2VuZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6c2V0X2hhc19lbmQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Y2xlYXJfaGFzX2VuZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Y2xlYXJfZW5kKCkgewotICBlbmRfID0gMDsKLSAgY2xlYXJfaGFzX2VuZCgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmVuZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UuZW5kKQotICByZXR1cm4gZW5kXzsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgc2V0X2hhc19lbmQoKTsKLSAgZW5kXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5lbmQpCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRGVzY3JpcHRvclByb3RvCi0KLS8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLWlubGluZSBib29sIERlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbmFtZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIERlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQotICBjbGVhcl9oYXNfbmFtZSgpOwotICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOwotaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmZpZWxkX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBmaWVsZF8uc2l6ZSgpOwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9maWVsZCgpIHsKLSAgZmllbGRfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQotICByZXR1cm4gZmllbGRfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2ZpZWxkKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQotICByZXR1cm4gZmllbGRfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2ZpZWxkKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCi0gIHJldHVybiBmaWVsZF8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZmllbGQoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5maWVsZCkKLSAgcmV0dXJuICZmaWVsZF87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCi1EZXNjcmlwdG9yUHJvdG86OmZpZWxkKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQotICByZXR1cm4gZmllbGRfOwotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7Ci1pbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBleHRlbnNpb25fLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5zaW9uKCkgewotICBleHRlbnNpb25fLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKLSAgcmV0dXJuIGV4dGVuc2lvbl8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQotICByZXR1cm4gJmV4dGVuc2lvbl87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCi1EZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCi0gIHJldHVybiBleHRlbnNpb25fOwotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7Ci1pbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5lc3RlZF90eXBlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25lc3RlZF90eXBlKCkgewotICBuZXN0ZWRfdHlwZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpuZXN0ZWRfdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5lc3RlZF90eXBlKQotICByZXR1cm4gbmVzdGVkX3R5cGVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uZXN0ZWRfdHlwZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKLSAgcmV0dXJuIG5lc3RlZF90eXBlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfbmVzdGVkX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKLSAgcmV0dXJuIG5lc3RlZF90eXBlXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmVzdGVkX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKLSAgcmV0dXJuICZuZXN0ZWRfdHlwZV87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgotRGVzY3JpcHRvclByb3RvOjpuZXN0ZWRfdHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKLSAgcmV0dXJuIG5lc3RlZF90eXBlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7Ci1pbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBlbnVtX3R5cGVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZW51bV90eXBlKCkgewotICBlbnVtX3R5cGVfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKLSAgcmV0dXJuIGVudW1fdHlwZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQotICByZXR1cm4gZW51bV90eXBlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2VudW1fdHlwZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKLSAgcmV0dXJuIGVudW1fdHlwZV8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPioKLURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCi0gIHJldHVybiAmZW51bV90eXBlXzsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgotRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQotICByZXR1cm4gZW51bV90eXBlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKLWlubGluZSBpbnQgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2Vfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uc2l6ZSgpOwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9leHRlbnNpb25fcmFuZ2UoKSB7Ci0gIGV4dGVuc2lvbl9yYW5nZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCi0gIHJldHVybiBleHRlbnNpb25fcmFuZ2VfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQotICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogRGVzY3JpcHRvclByb3RvOjphZGRfZXh0ZW5zaW9uX3JhbmdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQotICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQotICByZXR1cm4gJmV4dGVuc2lvbl9yYW5nZV87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgotRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2UoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQotICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXzsKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKLWlubGluZSBpbnQgRGVzY3JpcHRvclByb3RvOjpvbmVvZl9kZWNsX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBvbmVvZl9kZWNsXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX29uZW9mX2RlY2woKSB7Ci0gIG9uZW9mX2RlY2xfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpvbmVvZl9kZWNsKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKLSAgcmV0dXJuIG9uZW9mX2RlY2xfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29uZW9mX2RlY2woaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKLSAgcmV0dXJuIG9uZW9mX2RlY2xfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX29uZW9mX2RlY2woKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQotICByZXR1cm4gb25lb2ZfZGVjbF8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvID4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb25lb2ZfZGVjbCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCi0gIHJldHVybiAmb25lb2ZfZGVjbF87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvID4mCi1EZXNjcmlwdG9yUHJvdG86Om9uZW9mX2RlY2woKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKLSAgcmV0dXJuIG9uZW9mX2RlY2xfOwotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OwotaW5saW5lIGJvb2wgRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDgwdTsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwODB1OwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgewotICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM6OkNsZWFyKCk7Ci0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyYgRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgewotICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBOVUxMOwotICByZXR1cm4gdGVtcDsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIG9wdGlvbnMpIHsKLSAgZGVsZXRlIG9wdGlvbnNfOwotICBvcHRpb25zXyA9IG9wdGlvbnM7Ci0gIGlmIChvcHRpb25zKSB7Ci0gICAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA5OwotaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX3JhbmdlX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiByZXNlcnZlZF9yYW5nZV8uc2l6ZSgpOwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9yZXNlcnZlZF9yYW5nZSgpIHsKLSAgcmVzZXJ2ZWRfcmFuZ2VfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQotICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2VfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3Jlc2VydmVkX3JhbmdlKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQotICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2VfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX3JhbmdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCi0gIHJldHVybiByZXNlcnZlZF9yYW5nZV8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlID4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcmVzZXJ2ZWRfcmFuZ2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKLSAgcmV0dXJuICZyZXNlcnZlZF9yYW5nZV87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlID4mCi1EZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX3JhbmdlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQotICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2VfOwotfQotCi0vLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOwotaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX25hbWVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHJlc2VydmVkX25hbWVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcmVzZXJ2ZWRfbmFtZSgpIHsKLSAgcmVzZXJ2ZWRfbmFtZV8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX25hbWUoaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCi0gIHJlc2VydmVkX25hbWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHJlc2VydmVkX25hbWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICByZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKLSAgcmV0dXJuIHJlc2VydmVkX25hbWVfLkFkZCgpOwotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICByZXNlcnZlZF9uYW1lXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCi19Ci1pbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHJlc2VydmVkX25hbWVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotfQotaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgcmVzZXJ2ZWRfbmFtZV8uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCi1EZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX25hbWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKLSAgcmV0dXJuIHJlc2VydmVkX25hbWVfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCi1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcmVzZXJ2ZWRfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCi0gIHJldHVybiAmcmVzZXJ2ZWRfbmFtZV87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRmllbGREZXNjcmlwdG9yUHJvdG8KLQotLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX25hbWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgY2xlYXJfaGFzX25hbWUoKTsKLSAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKLWlubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfbnVtYmVyKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX251bWJlcigpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbnVtYmVyKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9udW1iZXIoKSB7Ci0gIG51bWJlcl8gPSAwOwotICBjbGVhcl9oYXNfbnVtYmVyKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5udW1iZXIpCi0gIHJldHVybiBudW1iZXJfOwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzZXRfaGFzX251bWJlcigpOwotICBudW1iZXJfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm51bWJlcikKLX0KLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7Ci1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2xhYmVsKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2xhYmVsKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19sYWJlbCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbGFiZWwoKSB7Ci0gIGxhYmVsXyA9IDE7Ci0gIGNsZWFyX2hhc19sYWJlbCgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG86OmxhYmVsKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5sYWJlbCkKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsID4obGFiZWxfKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbGFiZWwoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSkgewotICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIHNldF9oYXNfbGFiZWwoKTsKLSAgbGFiZWxfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmxhYmVsKQotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7Ci1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfdHlwZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfdHlwZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfdHlwZSgpIHsKLSAgdHlwZV8gPSAxOwotICBjbGVhcl9oYXNfdHlwZSgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6dHlwZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZSkKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgPih0eXBlXyk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3R5cGUoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHZhbHVlKSB7Ci0gIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZCh2YWx1ZSkpOwotICBzZXRfaGFzX3R5cGUoKTsKLSAgdHlwZV8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZSkKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7Ci1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX3R5cGVfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc190eXBlX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3R5cGVfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfdHlwZV9uYW1lKCkgewotICB0eXBlX25hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjp0eXBlX25hbWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKLSAgcmV0dXJuIHR5cGVfbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlX25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc190eXBlX25hbWUoKTsKLSAgdHlwZV9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCi19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX3R5cGVfbmFtZSgpOwotICB0eXBlX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfdHlwZV9uYW1lKCk7Ci0gIHR5cGVfbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV90eXBlX25hbWUoKSB7Ci0gIHNldF9oYXNfdHlwZV9uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCi0gIHJldHVybiB0eXBlX25hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfdHlwZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQotICBjbGVhcl9oYXNfdHlwZV9uYW1lKCk7Ci0gIHJldHVybiB0eXBlX25hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF90eXBlX25hbWUoOjpzdGQ6OnN0cmluZyogdHlwZV9uYW1lKSB7Ci0gIGlmICh0eXBlX25hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfdHlwZV9uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOwotICB9Ci0gIHR5cGVfbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHR5cGVfbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7Ci1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2V4dGVuZGVlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2V4dGVuZGVlKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19leHRlbmRlZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5kZWUoKSB7Ci0gIGV4dGVuZGVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19leHRlbmRlZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpleHRlbmRlZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCi0gIHJldHVybiBleHRlbmRlZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9leHRlbmRlZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2V4dGVuZGVlKCk7Ci0gIGV4dGVuZGVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19leHRlbmRlZSgpOwotICBleHRlbmRlZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfZXh0ZW5kZWUoKTsKLSAgZXh0ZW5kZWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbmRlZSgpIHsKLSAgc2V0X2hhc19leHRlbmRlZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCi0gIHJldHVybiBleHRlbmRlZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9leHRlbmRlZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlKQotICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKLSAgcmV0dXJuIGV4dGVuZGVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfZXh0ZW5kZWUoOjpzdGQ6OnN0cmluZyogZXh0ZW5kZWUpIHsKLSAgaWYgKGV4dGVuZGVlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2V4dGVuZGVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2V4dGVuZGVlKCk7Ci0gIH0KLSAgZXh0ZW5kZWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBleHRlbmRlZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OwotaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19kZWZhdWx0X3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2RlZmF1bHRfdmFsdWUoKSB7Ci0gIGRlZmF1bHRfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF92YWx1ZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKLSAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZGVmYXVsdF92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgZGVmYXVsdF92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZGVmYXVsdF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgZGVmYXVsdF92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgZGVmYXVsdF92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVmYXVsdF92YWx1ZSgpIHsKLSAgc2V0X2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQotICByZXR1cm4gZGVmYXVsdF92YWx1ZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKLSAgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9kZWZhdWx0X3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUpIHsKLSAgaWYgKGRlZmF1bHRfdmFsdWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIH0KLSAgZGVmYXVsdF92YWx1ZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGRlZmF1bHRfdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKLX0KLQotLy8gb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OwotaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19vbmVvZl9pbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vbmVvZl9pbmRleCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDgwdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb25lb2ZfaW5kZXgoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwODB1OwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX29uZW9mX2luZGV4KCkgewotICBvbmVvZl9pbmRleF8gPSAwOwotICBjbGVhcl9oYXNfb25lb2ZfaW5kZXgoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEZpZWxkRGVzY3JpcHRvclByb3RvOjpvbmVvZl9pbmRleCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXgpCi0gIHJldHVybiBvbmVvZl9pbmRleF87Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X29uZW9mX2luZGV4KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgc2V0X2hhc19vbmVvZl9pbmRleCgpOwotICBvbmVvZl9pbmRleF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXgpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKLWlubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfanNvbl9uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMTAwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX2pzb25fbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfanNvbl9uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMTAwdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9qc29uX25hbWUoKSB7Ci0gIGpzb25fbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfanNvbl9uYW1lKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86Ompzb25fbmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQotICByZXR1cm4ganNvbl9uYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2pzb25fbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2pzb25fbmFtZSgpOwotICBqc29uX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfanNvbl9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfanNvbl9uYW1lKCk7Ci0gIGpzb25fbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCi19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19qc29uX25hbWUoKTsKLSAganNvbl9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2pzb25fbmFtZSgpIHsKLSAgc2V0X2hhc19qc29uX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKLSAgcmV0dXJuIGpzb25fbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9qc29uX25hbWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCi0gIGNsZWFyX2hhc19qc29uX25hbWUoKTsKLSAgcmV0dXJuIGpzb25fbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2pzb25fbmFtZSg6OnN0ZDo6c3RyaW5nKiBqc29uX25hbWUpIHsKLSAgaWYgKGpzb25fbmFtZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19qc29uX25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfanNvbl9uYW1lKCk7Ci0gIH0KLSAganNvbl9uYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwganNvbl9uYW1lKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKLX0KLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7Ci1pbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAyMDB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDIwMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKLSAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczo6Q2xlYXIoKTsKLSAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyYgRmllbGREZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKLSAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgcmV0dXJuIHRlbXA7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gT25lb2ZEZXNjcmlwdG9yUHJvdG8KLQotLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotaW5saW5lIGJvb2wgT25lb2ZEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX25hbWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogT25lb2ZEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgY2xlYXJfaGFzX25hbWUoKTsKLSAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFbnVtRGVzY3JpcHRvclByb3RvCi0KLS8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLWlubGluZSBib29sIEVudW1EZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX25hbWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBFbnVtRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEVudW1EZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgY2xlYXJfaGFzX25hbWUoKTsKLSAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgfQotICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKLWlubGluZSBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHZhbHVlXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl92YWx1ZSgpIHsKLSAgdmFsdWVfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIEVudW1EZXNjcmlwdG9yUHJvdG86OnZhbHVlKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQotICByZXR1cm4gdmFsdWVfLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdmFsdWUoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQotICByZXR1cm4gdmFsdWVfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBFbnVtRGVzY3JpcHRvclByb3RvOjphZGRfdmFsdWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUpCi0gIHJldHVybiB2YWx1ZV8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+KgotRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV92YWx1ZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKLSAgcmV0dXJuICZ2YWx1ZV87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+JgotRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQotICByZXR1cm4gdmFsdWVfOwotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOwotaW5saW5lIGJvb2wgRW51bURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OwotfQotaW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotaW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKLSAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOjpDbGVhcigpOwotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMmIEVudW1EZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKLSAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7Ci0gICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9uczsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICByZXR1cm4gb3B0aW9uc187Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogRW51bURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiB0ZW1wID0gb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gTlVMTDsKLSAgcmV0dXJuIHRlbXA7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogb3B0aW9ucykgewotICBkZWxldGUgb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gb3B0aW9uczsKLSAgaWYgKG9wdGlvbnMpIHsKLSAgICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRW51bVZhbHVlRGVzY3JpcHRvclByb3RvCi0KLS8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLWlubGluZSBib29sIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbmFtZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci1pbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQotICBjbGVhcl9oYXNfbmFtZSgpOwotICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKLSAgaWYgKG5hbWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIH0KLSAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7Ci1pbmxpbmUgYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Omhhc19udW1iZXIoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX251bWJlcigpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX251bWJlcigpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX251bWJlcigpIHsKLSAgbnVtYmVyXyA9IDA7Ci0gIGNsZWFyX2hhc19udW1iZXIoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQotICByZXR1cm4gbnVtYmVyXzsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X251bWJlcig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHNldF9oYXNfbnVtYmVyKCk7Ci0gIG51bWJlcl8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm51bWJlcikKLX0KLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOwotaW5saW5lIGJvb2wgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotaW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgewotICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczo6Q2xlYXIoKTsKLSAgY2xlYXJfaGFzX29wdGlvbnMoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMmIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgewotICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICByZXR1cm4gb3B0aW9uc187Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBOVUxMOwotICByZXR1cm4gdGVtcDsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogb3B0aW9ucykgewotICBkZWxldGUgb3B0aW9uc187Ci0gIG9wdGlvbnNfID0gb3B0aW9uczsKLSAgaWYgKG9wdGlvbnMpIHsKLSAgICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfb3B0aW9ucygpOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvCi0KLS8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLWlubGluZSBib29sIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX25hbWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgY2xlYXJfaGFzX25hbWUoKTsKLSAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgfQotICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7Ci1pbmxpbmUgaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om1ldGhvZF9zaXplKCkgY29uc3QgewotICByZXR1cm4gbWV0aG9kXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9tZXRob2QoKSB7Ci0gIG1ldGhvZF8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byYgU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKLSAgcmV0dXJuIG1ldGhvZF8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogU2VydmljZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9tZXRob2QoaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKLSAgcmV0dXJuIG1ldGhvZF8uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmFkZF9tZXRob2QoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQotICByZXR1cm4gbWV0aG9kXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4qCi1TZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21ldGhvZCgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5tZXRob2QpCi0gIHJldHVybiAmbWV0aG9kXzsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4mCi1TZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2QoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKLSAgcmV0dXJuIG1ldGhvZF87Ci19Ci0KLS8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci1pbmxpbmUgYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgewotICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnM6OkNsZWFyKCk7Ci0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyYgU2VydmljZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQotICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogU2VydmljZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgewotICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKLSAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOwotICB9Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBOVUxMOwotICByZXR1cm4gdGVtcDsKLX0KLWlubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBNZXRob2REZXNjcmlwdG9yUHJvdG8KLQotLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotaW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgewotICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19uYW1lKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKLSAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19uYW1lKCk7Ci0gIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX25hbWUoKTsKLSAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7Ci0gIHNldF9oYXNfbmFtZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCi0gIGNsZWFyX2hhc19uYW1lKCk7Ci0gIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgewotICBpZiAobmFtZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19uYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgfQotICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOwotaW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfaW5wdXRfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfaW5wdXRfdHlwZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2lucHV0X3R5cGUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9pbnB1dF90eXBlKCkgewotICBpbnB1dF90eXBlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjppbnB1dF90eXBlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKLSAgcmV0dXJuIGlucHV0X3R5cGVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19pbnB1dF90eXBlKCk7Ci0gIGlucHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKLSAgaW5wdXRfdHlwZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfaW5wdXRfdHlwZSgpOwotICBpbnB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2lucHV0X3R5cGUoKSB7Ci0gIHNldF9oYXNfaW5wdXRfdHlwZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCi0gIHJldHVybiBpbnB1dF90eXBlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9pbnB1dF90eXBlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCi0gIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7Ci0gIHJldHVybiBpbnB1dF90eXBlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2lucHV0X3R5cGUoOjpzdGQ6OnN0cmluZyogaW5wdXRfdHlwZSkgewotICBpZiAoaW5wdXRfdHlwZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19pbnB1dF90eXBlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2lucHV0X3R5cGUoKTsKLSAgfQotICBpbnB1dF90eXBlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgaW5wdXRfdHlwZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKLWlubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX291dHB1dF90eXBlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vdXRwdXRfdHlwZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX291dHB1dF90eXBlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3V0cHV0X3R5cGUoKSB7Ci0gIG91dHB1dF90eXBlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6b3V0cHV0X3R5cGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSkKLSAgcmV0dXJuIG91dHB1dF90eXBlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX291dHB1dF90eXBlKCk7Ci0gIG91dHB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCi19Ci1pbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX291dHB1dF90eXBlKCk7Ci0gIG91dHB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSkKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X291dHB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX291dHB1dF90eXBlKCk7Ci0gIG91dHB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vdXRwdXRfdHlwZSgpIHsKLSAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQotICByZXR1cm4gb3V0cHV0X3R5cGVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX291dHB1dF90eXBlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQotICBjbGVhcl9oYXNfb3V0cHV0X3R5cGUoKTsKLSAgcmV0dXJuIG91dHB1dF90eXBlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX291dHB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIG91dHB1dF90eXBlKSB7Ci0gIGlmIChvdXRwdXRfdHlwZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOwotICB9Ci0gIG91dHB1dF90eXBlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgb3V0cHV0X3R5cGUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7Ci1pbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7Ci0gIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOjpDbGVhcigpOwotICBjbGVhcl9oYXNfb3B0aW9ucygpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKLSAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7Ci0gIHNldF9oYXNfb3B0aW9ucygpOwotICBpZiAob3B0aW9uc18gPT0gTlVMTCkgewotICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9uczsKLSAgfQotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIHJldHVybiBvcHRpb25zXzsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCi0gIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOwotICBvcHRpb25zXyA9IE5VTEw7Ci0gIHJldHVybiB0ZW1wOwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBvcHRpb25zKSB7Ci0gIGRlbGV0ZSBvcHRpb25zXzsKLSAgb3B0aW9uc18gPSBvcHRpb25zOwotICBpZiAob3B0aW9ucykgewotICAgIHNldF9oYXNfb3B0aW9ucygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIH0KLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQotfQotCi0vLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfY2xpZW50X3N0cmVhbWluZygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfY2xpZW50X3N0cmVhbWluZygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2NsaWVudF9zdHJlYW1pbmcoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9jbGllbnRfc3RyZWFtaW5nKCkgewotICBjbGllbnRfc3RyZWFtaW5nXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfY2xpZW50X3N0cmVhbWluZygpOwotfQotaW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGllbnRfc3RyZWFtaW5nKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uY2xpZW50X3N0cmVhbWluZykKLSAgcmV0dXJuIGNsaWVudF9zdHJlYW1pbmdfOwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfY2xpZW50X3N0cmVhbWluZyhib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfY2xpZW50X3N0cmVhbWluZygpOwotICBjbGllbnRfc3RyZWFtaW5nXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uY2xpZW50X3N0cmVhbWluZykKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nID0gNiBbZGVmYXVsdCA9IGZhbHNlXTsKLWlubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX3NlcnZlcl9zdHJlYW1pbmcoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfc2VydmVyX3N0cmVhbWluZygpIHsKLSAgc2VydmVyX3N0cmVhbWluZ18gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKTsKLX0KLWlubGluZSBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2VydmVyX3N0cmVhbWluZygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLnNlcnZlcl9zdHJlYW1pbmcpCi0gIHJldHVybiBzZXJ2ZXJfc3RyZWFtaW5nXzsKLX0KLWlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X3NlcnZlcl9zdHJlYW1pbmcoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKTsKLSAgc2VydmVyX3N0cmVhbWluZ18gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLnNlcnZlcl9zdHJlYW1pbmcpCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRmlsZU9wdGlvbnMKLQotLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfcGFja2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX3BhY2thZ2UoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfcGFja2FnZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9wYWNrYWdlKCkgewotICBqYXZhX3BhY2thZ2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpqYXZhX3BhY2thZ2UoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKLSAgcmV0dXJuIGphdmFfcGFja2FnZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKLSAgamF2YV9wYWNrYWdlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCi19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2phdmFfcGFja2FnZSgpOwotICBqYXZhX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIGphdmFfcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9qYXZhX3BhY2thZ2UoKSB7Ci0gIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCi0gIHJldHVybiBqYXZhX3BhY2thZ2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfamF2YV9wYWNrYWdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQotICBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIHJldHVybiBqYXZhX3BhY2thZ2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9qYXZhX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogamF2YV9wYWNrYWdlKSB7Ci0gIGlmIChqYXZhX3BhY2thZ2UgIT0gTlVMTCkgewotICAgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOwotICB9Ci0gIGphdmFfcGFja2FnZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGphdmFfcGFja2FnZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9vdXRlcl9jbGFzc25hbWUoKSB7Ci0gIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpqYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCi0gIHJldHVybiBqYXZhX291dGVyX2NsYXNzbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKLSAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCi0gIHJldHVybiBqYXZhX291dGVyX2NsYXNzbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQotICBjbGVhcl9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgcmV0dXJuIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfamF2YV9vdXRlcl9jbGFzc25hbWUoOjpzdGQ6OnN0cmluZyogamF2YV9vdXRlcl9jbGFzc25hbWUpIHsKLSAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIH0KLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBqYXZhX291dGVyX2NsYXNzbmFtZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKLSAgamF2YV9tdWx0aXBsZV9maWxlc18gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKLX0KLWlubGluZSBib29sIEZpbGVPcHRpb25zOjpqYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX211bHRpcGxlX2ZpbGVzKQotICByZXR1cm4gamF2YV9tdWx0aXBsZV9maWxlc187Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKLSAgamF2YV9tdWx0aXBsZV9maWxlc18gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9tdWx0aXBsZV9maWxlcykKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgewotICBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6amF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKQotICByZXR1cm4gamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKLSAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKQotfQotCi0vLyBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdCA9IGZhbHNlXTsKLWlubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX3N0cmluZ19jaGVja191dGY4KCkgewotICBqYXZhX3N0cmluZ19jaGVja191dGY4XyA9IGZhbHNlOwotICBjbGVhcl9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpOwotfQotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgpCi0gIHJldHVybiBqYXZhX3N0cmluZ19jaGVja191dGY4XzsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9zdHJpbmdfY2hlY2tfdXRmOChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpOwotICBqYXZhX3N0cmluZ19jaGVja191dGY4XyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3N0cmluZ19jaGVja191dGY4KQotfQotCi0vLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0ID0gU1BFRURdOwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19vcHRpbWl6ZV9mb3IoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfb3B0aW1pemVfZm9yKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19vcHRpbWl6ZV9mb3IoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX29wdGltaXplX2ZvcigpIHsKLSAgb3B0aW1pemVfZm9yXyA9IDE7Ci0gIGNsZWFyX2hhc19vcHRpbWl6ZV9mb3IoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6b3B0aW1pemVfZm9yKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vcHRpbWl6ZV9mb3IpCi0gIHJldHVybiBzdGF0aWNfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgPihvcHRpbWl6ZV9mb3JfKTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfb3B0aW1pemVfZm9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKSB7Ci0gIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZV9Jc1ZhbGlkKHZhbHVlKSk7Ci0gIHNldF9oYXNfb3B0aW1pemVfZm9yKCk7Ci0gIG9wdGltaXplX2Zvcl8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub3B0aW1pemVfZm9yKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgZ29fcGFja2FnZSA9IDExOwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19nb19wYWNrYWdlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2dvX3BhY2thZ2UoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2dvX3BhY2thZ2UoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2dvX3BhY2thZ2UoKSB7Ci0gIGdvX3BhY2thZ2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2dvX3BhY2thZ2UoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6Z29fcGFja2FnZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLSAgcmV0dXJuIGdvX3BhY2thZ2VfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKLSAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKLSAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9nb19wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKLSAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfZ29fcGFja2FnZSgpIHsKLSAgc2V0X2hhc19nb19wYWNrYWdlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQotICByZXR1cm4gZ29fcGFja2FnZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9nb19wYWNrYWdlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLSAgY2xlYXJfaGFzX2dvX3BhY2thZ2UoKTsKLSAgcmV0dXJuIGdvX3BhY2thZ2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9nb19wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGdvX3BhY2thZ2UpIHsKLSAgaWYgKGdvX3BhY2thZ2UgIT0gTlVMTCkgewotICAgIHNldF9oYXNfZ29fcGFja2FnZSgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7Ci0gIH0KLSAgZ29fcGFja2FnZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGdvX3BhY2thZ2UpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwODB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDgwdTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKLX0KLWlubGluZSBib29sIEZpbGVPcHRpb25zOjpjY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19nZW5lcmljX3NlcnZpY2VzKQotICByZXR1cm4gY2NfZ2VuZXJpY19zZXJ2aWNlc187Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKLSAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY2NfZ2VuZXJpY19zZXJ2aWNlcykKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKLWlubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMTAwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMTAwdTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOwotfQotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzKQotICByZXR1cm4gamF2YV9nZW5lcmljX3NlcnZpY2VzXzsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKLSAgamF2YV9nZW5lcmljX3NlcnZpY2VzXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX2dlbmVyaWNfc2VydmljZXMpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMjAwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDIwMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAyMDB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX3B5X2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIHB5X2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6cHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucHlfZ2VuZXJpY19zZXJ2aWNlcykKLSAgcmV0dXJuIHB5X2dlbmVyaWNfc2VydmljZXNfOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9weV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7Ci0gIHB5X2dlbmVyaWNfc2VydmljZXNfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnB5X2dlbmVyaWNfc2VydmljZXMpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwNDAwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDQwMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA0MDB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2RlcHJlY2F0ZWQoKSB7Ci0gIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZGVwcmVjYXRlZCkKLSAgcmV0dXJuIGRlcHJlY2F0ZWRfOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19kZXByZWNhdGVkKCk7Ci0gIGRlcHJlY2F0ZWRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmRlcHJlY2F0ZWQpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgY2NfZW5hYmxlX2FyZW5hcyA9IDMxIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19jY19lbmFibGVfYXJlbmFzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwODAwdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDgwMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA4MDB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2NjX2VuYWJsZV9hcmVuYXMoKSB7Ci0gIGNjX2VuYWJsZV9hcmVuYXNfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19jY19lbmFibGVfYXJlbmFzKCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6Y2NfZW5hYmxlX2FyZW5hcygpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY2NfZW5hYmxlX2FyZW5hcykKLSAgcmV0dXJuIGNjX2VuYWJsZV9hcmVuYXNfOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9jY19lbmFibGVfYXJlbmFzKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19jY19lbmFibGVfYXJlbmFzKCk7Ci0gIGNjX2VuYWJsZV9hcmVuYXNfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2VuYWJsZV9hcmVuYXMpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBvYmpjX2NsYXNzX3ByZWZpeCA9IDM2OwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19vYmpjX2NsYXNzX3ByZWZpeCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMTAwMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAxMDAwdTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfb2JqY19jbGFzc19wcmVmaXgoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDEwMDB1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX29iamNfY2xhc3NfcHJlZml4KCkgewotICBvYmpjX2NsYXNzX3ByZWZpeF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6b2JqY19jbGFzc19wcmVmaXgoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQotICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXhfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfb2JqY19jbGFzc19wcmVmaXgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOwotICBvYmpjX2NsYXNzX3ByZWZpeF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgb2JqY19jbGFzc19wcmVmaXhfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7Ci0gIG9iamNfY2xhc3NfcHJlZml4Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfb2JqY19jbGFzc19wcmVmaXgoKSB7Ci0gIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQotICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXhfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2Vfb2JqY19jbGFzc19wcmVmaXgoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCkKLSAgY2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7Ci0gIHJldHVybiBvYmpjX2NsYXNzX3ByZWZpeF8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfYWxsb2NhdGVkX29iamNfY2xhc3NfcHJlZml4KDo6c3RkOjpzdHJpbmcqIG9iamNfY2xhc3NfcHJlZml4KSB7Ci0gIGlmIChvYmpjX2NsYXNzX3ByZWZpeCAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOwotICB9Ci0gIG9iamNfY2xhc3NfcHJlZml4Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgb2JqY19jbGFzc19wcmVmaXgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCi19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2NzaGFycF9uYW1lc3BhY2UoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDIwMDB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAyMDAwdTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMjAwMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfY3NoYXJwX25hbWVzcGFjZSgpIHsKLSAgY3NoYXJwX25hbWVzcGFjZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpjc2hhcnBfbmFtZXNwYWNlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQotICByZXR1cm4gY3NoYXJwX25hbWVzcGFjZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9jc2hhcnBfbmFtZXNwYWNlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotICBjc2hhcnBfbmFtZXNwYWNlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9jc2hhcnBfbmFtZXNwYWNlKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotICBjc2hhcnBfbmFtZXNwYWNlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCi19Ci1pbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotICBjc2hhcnBfbmFtZXNwYWNlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9jc2hhcnBfbmFtZXNwYWNlKCkgewotICBzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCi0gIHJldHVybiBjc2hhcnBfbmFtZXNwYWNlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX2NzaGFycF9uYW1lc3BhY2UoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQotICBjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOwotICByZXR1cm4gY3NoYXJwX25hbWVzcGFjZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfYWxsb2NhdGVkX2NzaGFycF9uYW1lc3BhY2UoOjpzdGQ6OnN0cmluZyogY3NoYXJwX25hbWVzcGFjZSkgewotICBpZiAoY3NoYXJwX25hbWVzcGFjZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKLSAgfQotICBjc2hhcnBfbmFtZXNwYWNlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgY3NoYXJwX25hbWVzcGFjZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci1pbmxpbmUgaW50IEZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgewotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWxlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmlsZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLUZpbGVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLUZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE1lc3NhZ2VPcHRpb25zCi0KLS8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgewotICBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQotICByZXR1cm4gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKLSAgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQotfQotCi0vLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSB7Ci0gIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6bm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcikKLSAgcmV0dXJuIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7Ci0gIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07Ci1pbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLX0KLWlubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5kZXByZWNhdGVkKQotICByZXR1cm4gZGVwcmVjYXRlZF87Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMuZGVwcmVjYXRlZCkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBtYXBfZW50cnkgPSA3OwotaW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tYXBfZW50cnkoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9oYXNfbWFwX2VudHJ5KCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX2hhc19tYXBfZW50cnkoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX21hcF9lbnRyeSgpIHsKLSAgbWFwX2VudHJ5XyA9IGZhbHNlOwotICBjbGVhcl9oYXNfbWFwX2VudHJ5KCk7Ci19Ci1pbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6bWFwX2VudHJ5KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5tYXBfZW50cnkpCi0gIHJldHVybiBtYXBfZW50cnlfOwotfQotaW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9tYXBfZW50cnkoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX21hcF9lbnRyeSgpOwotICBtYXBfZW50cnlfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeSkKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotaW5saW5lIGludCBNZXNzYWdlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWVzc2FnZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCi1NZXNzYWdlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1NZXNzYWdlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBGaWVsZE9wdGlvbnMKLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKLWlubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX2N0eXBlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19jdHlwZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2N0eXBlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfY3R5cGUoKSB7Ci0gIGN0eXBlXyA9IDA7Ci0gIGNsZWFyX2hhc19jdHlwZSgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uczo6Y3R5cGUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5jdHlwZSkKLSAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSA+KGN0eXBlXyk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9jdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSkgewotICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZCh2YWx1ZSkpOwotICBzZXRfaGFzX2N0eXBlKCk7Ci0gIGN0eXBlXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGUpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKLWlubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX3BhY2tlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfcGFja2VkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9oYXNfcGFja2VkKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfcGFja2VkKCkgewotICBwYWNrZWRfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19wYWNrZWQoKTsKLX0KLWlubGluZSBib29sIEZpZWxkT3B0aW9uczo6cGFja2VkKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkKQotICByZXR1cm4gcGFja2VkXzsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X3BhY2tlZChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfcGFja2VkKCk7Ci0gIHBhY2tlZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnBhY2tlZCkKLX0KLQotLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlIGpzdHlwZSA9IDYgW2RlZmF1bHQgPSBKU19OT1JNQUxdOwotaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfanN0eXBlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19qc3R5cGUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19qc3R5cGUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9qc3R5cGUoKSB7Ci0gIGpzdHlwZV8gPSAwOwotICBjbGVhcl9oYXNfanN0eXBlKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6anN0eXBlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlKQotICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSA+KGpzdHlwZV8pOwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfanN0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSkgewotICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQodmFsdWUpKTsKLSAgc2V0X2hhc19qc3R5cGUoKTsKLSAganN0eXBlXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlKQotfQotCi0vLyBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfbGF6eSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfbGF6eSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2xhenkoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9sYXp5KCkgewotICBsYXp5XyA9IGZhbHNlOwotICBjbGVhcl9oYXNfbGF6eSgpOwotfQotaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpsYXp5KCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKLSAgcmV0dXJuIGxhenlfOwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfbGF6eShib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfbGF6eSgpOwotICBsYXp5XyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKLWlubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKLSAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKLX0KLWlubGluZSBib29sIEZpZWxkT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmRlcHJlY2F0ZWQpCi0gIHJldHVybiBkZXByZWNhdGVkXzsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKLSAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmRlcHJlY2F0ZWQpCi19Ci0KLS8vIG9wdGlvbmFsIGJvb2wgd2VhayA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfd2VhaygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfd2VhaygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX3dlYWsoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl93ZWFrKCkgewotICB3ZWFrXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfd2VhaygpOwotfQotaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjp3ZWFrKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMud2VhaykKLSAgcmV0dXJuIHdlYWtfOwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfd2Vhayhib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfd2VhaygpOwotICB3ZWFrXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMud2VhaykKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotaW5saW5lIGludCBGaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOwotfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBGaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLUZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotRmllbGRPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBFbnVtT3B0aW9ucwotCi0vLyBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMjsKLWlubGluZSBib29sIEVudW1PcHRpb25zOjpoYXNfYWxsb3dfYWxpYXMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRW51bU9wdGlvbnM6OnNldF9oYXNfYWxsb3dfYWxpYXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfaGFzX2FsbG93X2FsaWFzKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEVudW1PcHRpb25zOjpjbGVhcl9hbGxvd19hbGlhcygpIHsKLSAgYWxsb3dfYWxpYXNfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19hbGxvd19hbGlhcygpOwotfQotaW5saW5lIGJvb2wgRW51bU9wdGlvbnM6OmFsbG93X2FsaWFzKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5hbGxvd19hbGlhcykKLSAgcmV0dXJuIGFsbG93X2FsaWFzXzsKLX0KLWlubGluZSB2b2lkIEVudW1PcHRpb25zOjpzZXRfYWxsb3dfYWxpYXMoYm9vbCB2YWx1ZSkgewotICBzZXRfaGFzX2FsbG93X2FsaWFzKCk7Ci0gIGFsbG93X2FsaWFzXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5hbGxvd19hbGlhcykKLX0KLQotLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKLWlubGluZSBib29sIEVudW1PcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgRW51bU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIEVudW1PcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgewotICBkZXByZWNhdGVkXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotfQotaW5saW5lIGJvb2wgRW51bU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWQpCi0gIHJldHVybiBkZXByZWNhdGVkXzsKLX0KLWlubGluZSB2b2lkIEVudW1PcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBkZXByZWNhdGVkXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5kZXByZWNhdGVkKQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci1pbmxpbmUgaW50IEVudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgewotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEVudW1PcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLUVudW1PcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLUVudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEVudW1WYWx1ZU9wdGlvbnMKLQotLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKLWlubGluZSBib29sIEVudW1WYWx1ZU9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OnNldF9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OmNsZWFyX2RlcHJlY2F0ZWQoKSB7Ci0gIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7Ci19Ci1pbmxpbmUgYm9vbCBFbnVtVmFsdWVPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLmRlcHJlY2F0ZWQpCi0gIHJldHVybiBkZXByZWNhdGVkXzsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19kZXByZWNhdGVkKCk7Ci0gIGRlcHJlY2F0ZWRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMuZGVwcmVjYXRlZCkKLX0KLQotLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotaW5saW5lIGludCBFbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgewotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEVudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtVmFsdWVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1WYWx1ZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgotRW51bVZhbHVlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLUVudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTZXJ2aWNlT3B0aW9ucwotCi0vLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKLWlubGluZSBib29sIFNlcnZpY2VPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBTZXJ2aWNlT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OwotfQotaW5saW5lIHZvaWQgU2VydmljZU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIFNlcnZpY2VPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgewotICBkZXByZWNhdGVkXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotfQotaW5saW5lIGJvb2wgU2VydmljZU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLmRlcHJlY2F0ZWQpCi0gIHJldHVybiBkZXByZWNhdGVkXzsKLX0KLWlubGluZSB2b2lkIFNlcnZpY2VPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBkZXByZWNhdGVkXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy5kZXByZWNhdGVkKQotfQotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci1pbmxpbmUgaW50IFNlcnZpY2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgewotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIFNlcnZpY2VPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBTZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBTZXJ2aWNlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogU2VydmljZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLVNlcnZpY2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLVNlcnZpY2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIE1ldGhvZE9wdGlvbnMKLQotLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07Ci1pbmxpbmUgYm9vbCBNZXRob2RPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgewotICBkZXByZWNhdGVkXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwotfQotaW5saW5lIGJvb2wgTWV0aG9kT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5kZXByZWNhdGVkKQotICByZXR1cm4gZGVwcmVjYXRlZF87Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfZGVwcmVjYXRlZCgpOwotICBkZXByZWNhdGVkXyA9IHZhbHVlOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLmRlcHJlY2F0ZWQpCi19Ci0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLWlubGluZSBpbnQgTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKLSAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBNZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWV0aG9kT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBNZXRob2RPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKLU1ldGhvZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1NZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCi0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydAotCi0vLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKLWlubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Omhhc19uYW1lX3BhcnQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2hhc19uYW1lX3BhcnQoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpjbGVhcl9oYXNfbmFtZV9wYXJ0KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX25hbWVfcGFydCgpIHsKLSAgbmFtZV9wYXJ0Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19uYW1lX3BhcnQoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpuYW1lX3BhcnQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQotICByZXR1cm4gbmFtZV9wYXJ0Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfbmFtZV9wYXJ0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIG5hbWVfcGFydF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCi19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfbmFtZV9wYXJ0KGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIG5hbWVfcGFydF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9uYW1lX3BhcnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIG5hbWVfcGFydF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Om11dGFibGVfbmFtZV9wYXJ0KCkgewotICBzZXRfaGFzX25hbWVfcGFydCgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCi0gIHJldHVybiBuYW1lX3BhcnRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6cmVsZWFzZV9uYW1lX3BhcnQoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKLSAgY2xlYXJfaGFzX25hbWVfcGFydCgpOwotICByZXR1cm4gbmFtZV9wYXJ0Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2FsbG9jYXRlZF9uYW1lX3BhcnQoOjpzdGQ6OnN0cmluZyogbmFtZV9wYXJ0KSB7Ci0gIGlmIChuYW1lX3BhcnQgIT0gTlVMTCkgewotICAgIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX25hbWVfcGFydCgpOwotICB9Ci0gIG5hbWVfcGFydF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWVfcGFydCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKLX0KLQotLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwotaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6aGFzX2lzX2V4dGVuc2lvbigpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaGFzX2lzX2V4dGVuc2lvbigpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX2hhc19pc19leHRlbnNpb24oKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfaXNfZXh0ZW5zaW9uKCkgewotICBpc19leHRlbnNpb25fID0gZmFsc2U7Ci0gIGNsZWFyX2hhc19pc19leHRlbnNpb24oKTsKLX0KLWlubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmlzX2V4dGVuc2lvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5pc19leHRlbnNpb24pCi0gIHJldHVybiBpc19leHRlbnNpb25fOwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X2lzX2V4dGVuc2lvbihib29sIHZhbHVlKSB7Ci0gIHNldF9oYXNfaXNfZXh0ZW5zaW9uKCk7Ci0gIGlzX2V4dGVuc2lvbl8gPSB2YWx1ZTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5pc19leHRlbnNpb24pCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gVW5pbnRlcnByZXRlZE9wdGlvbgotCi0vLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7Ci1pbmxpbmUgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246Om5hbWVfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5hbWVfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX25hbWUoKSB7Ci0gIG5hbWVfLkNsZWFyKCk7Ci19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBVbmludGVycHJldGVkT3B0aW9uOjpuYW1lKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCi0gIHJldHVybiBuYW1lXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQotICByZXR1cm4gbmFtZV8uTXV0YWJsZShpbmRleCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBVbmludGVycHJldGVkT3B0aW9uOjphZGRfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQotICByZXR1cm4gbmFtZV8uQWRkKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPioKLVVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfbmFtZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQotICByZXR1cm4gJm5hbWVfOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4mCi1VbmludGVycHJldGVkT3B0aW9uOjpuYW1lKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQotICByZXR1cm4gbmFtZV87Ci19Ci0KLS8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKLWlubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19pZGVudGlmaWVyX3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19pZGVudGlmaWVyX3ZhbHVlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2lkZW50aWZpZXJfdmFsdWUoKSB7Ci0gIGlkZW50aWZpZXJfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjppZGVudGlmaWVyX3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCi0gIHJldHVybiBpZGVudGlmaWVyX3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewotICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgaWRlbnRpZmllcl92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIGlkZW50aWZpZXJfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOwotICBpZGVudGlmaWVyX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpIHsKLSAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCi0gIHJldHVybiBpZGVudGlmaWVyX3ZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246OnJlbGVhc2VfaWRlbnRpZmllcl92YWx1ZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSkKLSAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgcmV0dXJuIGlkZW50aWZpZXJfdmFsdWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWxsb2NhdGVkX2lkZW50aWZpZXJfdmFsdWUoOjpzdGQ6OnN0cmluZyogaWRlbnRpZmllcl92YWx1ZSkgewotICBpZiAoaWRlbnRpZmllcl92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgfQotICBpZGVudGlmaWVyX3ZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgaWRlbnRpZmllcl92YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCi19Ci0KLS8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OwotaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfcG9zaXRpdmVfaW50X3ZhbHVlKCkgewotICBwb3NpdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX1VMT05HTE9ORygwKTsKLSAgY2xlYXJfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IFVuaW50ZXJwcmV0ZWRPcHRpb246OnBvc2l0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5wb3NpdGl2ZV9pbnRfdmFsdWUpCi0gIHJldHVybiBwb3NpdGl2ZV9pbnRfdmFsdWVfOwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3Bvc2l0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCB2YWx1ZSkgewotICBzZXRfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOwotICBwb3NpdGl2ZV9pbnRfdmFsdWVfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ucG9zaXRpdmVfaW50X3ZhbHVlKQotfQotCi0vLyBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OwotaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfbmVnYXRpdmVfaW50X3ZhbHVlKCkgewotICBuZWdhdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX0xPTkdMT05HKDApOwotICBjbGVhcl9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBVbmludGVycHJldGVkT3B0aW9uOjpuZWdhdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmVnYXRpdmVfaW50X3ZhbHVlKQotICByZXR1cm4gbmVnYXRpdmVfaW50X3ZhbHVlXzsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCB2YWx1ZSkgewotICBzZXRfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpOwotICBuZWdhdGl2ZV9pbnRfdmFsdWVfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmVnYXRpdmVfaW50X3ZhbHVlKQotfQotCi0vLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKLWlubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19kb3VibGVfdmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19kb3VibGVfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfZG91YmxlX3ZhbHVlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2RvdWJsZV92YWx1ZSgpIHsKLSAgZG91YmxlX3ZhbHVlXyA9IDA7Ci0gIGNsZWFyX2hhc19kb3VibGVfdmFsdWUoKTsKLX0KLWlubGluZSBkb3VibGUgVW5pbnRlcnByZXRlZE9wdGlvbjo6ZG91YmxlX3ZhbHVlKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmRvdWJsZV92YWx1ZSkKLSAgcmV0dXJuIGRvdWJsZV92YWx1ZV87Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSkgewotICBzZXRfaGFzX2RvdWJsZV92YWx1ZSgpOwotICBkb3VibGVfdmFsdWVfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uZG91YmxlX3ZhbHVlKQotfQotCi0vLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OwotaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX3N0cmluZ192YWx1ZSgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfc3RyaW5nX3ZhbHVlKCkgewotICBzdHJpbmdfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLSAgY2xlYXJfaGFzX3N0cmluZ192YWx1ZSgpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb246OnN0cmluZ192YWx1ZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCi0gIHJldHVybiBzdHJpbmdfdmFsdWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9zdHJpbmdfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgc3RyaW5nX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9zdHJpbmdfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgc3RyaW5nX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X3N0cmluZ192YWx1ZShjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgc3RyaW5nX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9zdHJpbmdfdmFsdWUoKSB7Ci0gIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKLSAgcmV0dXJuIHN0cmluZ192YWx1ZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uOjpyZWxlYXNlX3N0cmluZ192YWx1ZSgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQotICBjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCk7Ci0gIHJldHVybiBzdHJpbmdfdmFsdWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWxsb2NhdGVkX3N0cmluZ192YWx1ZSg6OnN0ZDo6c3RyaW5nKiBzdHJpbmdfdmFsdWUpIHsKLSAgaWYgKHN0cmluZ192YWx1ZSAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgfSBlbHNlIHsKLSAgICBjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCk7Ci0gIH0KLSAgc3RyaW5nX3ZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgc3RyaW5nX3ZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKLWlubGluZSBib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19hZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA0MHU7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKLSAgYWdncmVnYXRlX3ZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci0gIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjphZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQotICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCi19Ci1pbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKLX0KLWlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCi0gICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkgewotICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCi0gIHJldHVybiBhZ2dyZWdhdGVfdmFsdWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9hZ2dyZWdhdGVfdmFsdWUoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKLSAgY2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9hZ2dyZWdhdGVfdmFsdWUoOjpzdGQ6OnN0cmluZyogYWdncmVnYXRlX3ZhbHVlKSB7Ci0gIGlmIChhZ2dyZWdhdGVfdmFsdWUgIT0gTlVMTCkgewotICAgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICB9Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGFnZ3JlZ2F0ZV92YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbgotCi0vLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07Ci1pbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpwYXRoX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBwYXRoXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfcGF0aCgpIHsKLSAgcGF0aF8uQ2xlYXIoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpwYXRoKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQotICByZXR1cm4gcGF0aF8uR2V0KGluZGV4KTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfcGF0aChpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgcGF0aF8uU2V0KGluZGV4LCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgpCi19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX3BhdGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBwYXRoXy5BZGQodmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgotU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGgoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQotICByZXR1cm4gcGF0aF87Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9wYXRoKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQotICByZXR1cm4gJnBhdGhfOwotfQotCi0vLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07Ci1pbmxpbmUgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBzcGFuXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfc3BhbigpIHsKLSAgc3Bhbl8uQ2xlYXIoKTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQotICByZXR1cm4gc3Bhbl8uR2V0KGluZGV4KTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfc3BhbihpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKLSAgc3Bhbl8uU2V0KGluZGV4LCB2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCi19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX3NwYW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzcGFuXy5BZGQodmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgotU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW4oKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQotICByZXR1cm4gc3Bhbl87Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9zcGFuKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQotICByZXR1cm4gJnNwYW5fOwotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7Ci1pbmxpbmUgYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6aGFzX2xlYWRpbmdfY29tbWVudHMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfbGVhZGluZ19jb21tZW50cygpIHsKLSAgbGVhZGluZ19jb21tZW50c18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2NvbW1lbnRzKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQotICByZXR1cm4gbGVhZGluZ19jb21tZW50c18uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7Ci0gIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOwotICBsZWFkaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQotfQotaW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOwotICBsZWFkaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCi19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOwotICBsZWFkaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCkgewotICBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCi0gIHJldHVybiBsZWFkaW5nX2NvbW1lbnRzXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpyZWxlYXNlX2xlYWRpbmdfY29tbWVudHMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQotICBjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpOwotICByZXR1cm4gbGVhZGluZ19jb21tZW50c18uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfYWxsb2NhdGVkX2xlYWRpbmdfY29tbWVudHMoOjpzdGQ6OnN0cmluZyogbGVhZGluZ19jb21tZW50cykgewotICBpZiAobGVhZGluZ19jb21tZW50cyAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKLSAgfQotICBsZWFkaW5nX2NvbW1lbnRzXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbGVhZGluZ19jb21tZW50cyk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQotfQotCi0vLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OwotaW5saW5lIGJvb2wgU291cmNlQ29kZUluZm9fTG9jYXRpb246Omhhc190cmFpbGluZ19jb21tZW50cygpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2hhc190cmFpbGluZ19jb21tZW50cygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX3RyYWlsaW5nX2NvbW1lbnRzKCkgewotICB0cmFpbGluZ19jb21tZW50c18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6dHJhaWxpbmdfY29tbWVudHMoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQotICByZXR1cm4gdHJhaWxpbmdfY29tbWVudHNfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOwotICB0cmFpbGluZ19jb21tZW50c18uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKLSAgdHJhaWxpbmdfY29tbWVudHNfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gIHRyYWlsaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKLSAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKSB7Ci0gIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQotICByZXR1cm4gdHJhaWxpbmdfY29tbWVudHNfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246OnJlbGVhc2VfdHJhaWxpbmdfY29tbWVudHMoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKLSAgY2xlYXJfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7Ci0gIHJldHVybiB0cmFpbGluZ19jb21tZW50c18uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfYWxsb2NhdGVkX3RyYWlsaW5nX2NvbW1lbnRzKDo6c3RkOjpzdHJpbmcqIHRyYWlsaW5nX2NvbW1lbnRzKSB7Ci0gIGlmICh0cmFpbGluZ19jb21tZW50cyAhPSBOVUxMKSB7Ci0gICAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOwotICB9IGVsc2UgewotICAgIGNsZWFyX2hhc190cmFpbGluZ19jb21tZW50cygpOwotICB9Ci0gIHRyYWlsaW5nX2NvbW1lbnRzXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdHJhaWxpbmdfY29tbWVudHMpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCi19Ci0KLS8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKLWlubGluZSBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkgewotICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQotICByZXR1cm4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLSAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLSAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgewotICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQotfQotaW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCi0gICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQotICByZXR1cm4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCk7Ci19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCi19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCktPmFzc2lnbih2YWx1ZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLX0KLWlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKLSAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCi19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYKLVNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKLSAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQotICByZXR1cm4gJmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIFNvdXJjZUNvZGVJbmZvCi0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOwotaW5saW5lIGludCBTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGxvY2F0aW9uXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mbzo6Y2xlYXJfbG9jYXRpb24oKSB7Ci0gIGxvY2F0aW9uXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24mIFNvdXJjZUNvZGVJbmZvOjpsb2NhdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24pCi0gIHJldHVybiBsb2NhdGlvbl8uR2V0KGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mbzo6bXV0YWJsZV9sb2NhdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQotICByZXR1cm4gbG9jYXRpb25fLk11dGFibGUoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIFNvdXJjZUNvZGVJbmZvOjphZGRfbG9jYXRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQotICByZXR1cm4gbG9jYXRpb25fLkFkZCgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+KgotU291cmNlQ29kZUluZm86Om11dGFibGVfbG9jYXRpb24oKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQotICByZXR1cm4gJmxvY2F0aW9uXzsKLX0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiYKLVNvdXJjZUNvZGVJbmZvOjpsb2NhdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQotICByZXR1cm4gbG9jYXRpb25fOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24KLQotLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOwotaW5saW5lIGludCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpwYXRoX3NpemUoKSBjb25zdCB7Ci0gIHJldHVybiBwYXRoXy5zaXplKCk7Ci19Ci1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9wYXRoKCkgewotICBwYXRoXy5DbGVhcigpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQotICByZXR1cm4gcGF0aF8uR2V0KGluZGV4KTsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9wYXRoKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBwYXRoXy5TZXQoaW5kZXgsIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQotfQotaW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6YWRkX3BhdGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBwYXRoXy5BZGQodmFsdWUpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCi19Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCi1HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpwYXRoKCkgY29uc3QgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQotICByZXR1cm4gcGF0aF87Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCi1HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjptdXRhYmxlX3BhdGgoKSB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCkKLSAgcmV0dXJuICZwYXRoXzsKLX0KLQotLy8gb3B0aW9uYWwgc3RyaW5nIHNvdXJjZV9maWxlID0gMjsKLWlubGluZSBib29sIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Omhhc19zb3VyY2VfZmlsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Ci19Ci1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfaGFzX3NvdXJjZV9maWxlKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OwotfQotaW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfaGFzX3NvdXJjZV9maWxlKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX3NvdXJjZV9maWxlKCkgewotICBzb3VyY2VfZmlsZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwotICBjbGVhcl9oYXNfc291cmNlX2ZpbGUoKTsKLX0KLWlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzb3VyY2VfZmlsZSgpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKLSAgcmV0dXJuIHNvdXJjZV9maWxlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Ci19Ci1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfc291cmNlX2ZpbGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOwotICBzb3VyY2VfZmlsZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9zb3VyY2VfZmlsZShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7Ci0gIHNvdXJjZV9maWxlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOwotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCi19Ci1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfc291cmNlX2ZpbGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7Ci0gIHNldF9oYXNfc291cmNlX2ZpbGUoKTsKLSAgc291cmNlX2ZpbGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAotICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQotfQotaW5saW5lIDo6c3RkOjpzdHJpbmcqIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Om11dGFibGVfc291cmNlX2ZpbGUoKSB7Ci0gIHNldF9oYXNfc291cmNlX2ZpbGUoKTsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCi0gIHJldHVybiBzb3VyY2VfZmlsZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSA6OnN0ZDo6c3RyaW5nKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpyZWxlYXNlX3NvdXJjZV9maWxlKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKLSAgY2xlYXJfaGFzX3NvdXJjZV9maWxlKCk7Ci0gIHJldHVybiBzb3VyY2VfZmlsZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9hbGxvY2F0ZWRfc291cmNlX2ZpbGUoOjpzdGQ6OnN0cmluZyogc291cmNlX2ZpbGUpIHsKLSAgaWYgKHNvdXJjZV9maWxlICE9IE5VTEwpIHsKLSAgICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7Ci0gIH0gZWxzZSB7Ci0gICAgY2xlYXJfaGFzX3NvdXJjZV9maWxlKCk7Ci0gIH0KLSAgc291cmNlX2ZpbGVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBzb3VyY2VfZmlsZSk7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQotfQotCi0vLyBvcHRpb25hbCBpbnQzMiBiZWdpbiA9IDM7Ci1pbmxpbmUgYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpoYXNfYmVnaW4oKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2hhc19iZWdpbigpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX2hhc19iZWdpbigpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Ci19Ci1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9iZWdpbigpIHsKLSAgYmVnaW5fID0gMDsKLSAgY2xlYXJfaGFzX2JlZ2luKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpiZWdpbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5iZWdpbikKLSAgcmV0dXJuIGJlZ2luXzsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9iZWdpbig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7Ci0gIHNldF9oYXNfYmVnaW4oKTsKLSAgYmVnaW5fID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uYmVnaW4pCi19Ci0KLS8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7Ci1pbmxpbmUgYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpoYXNfZW5kKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9oYXNfZW5kKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfaGFzX2VuZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Ci19Ci1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9lbmQoKSB7Ci0gIGVuZF8gPSAwOwotICBjbGVhcl9oYXNfZW5kKCk7Ci19Ci1pbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjplbmQoKSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uZW5kKQotICByZXR1cm4gZW5kXzsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewotICBzZXRfaGFzX2VuZCgpOwotICBlbmRfID0gdmFsdWU7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uZW5kKQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEdlbmVyYXRlZENvZGVJbmZvCi0KLS8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKLWlubGluZSBpbnQgR2VuZXJhdGVkQ29kZUluZm86OmFubm90YXRpb25fc2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGFubm90YXRpb25fLnNpemUoKTsKLX0KLWlubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpjbGVhcl9hbm5vdGF0aW9uKCkgewotICBhbm5vdGF0aW9uXy5DbGVhcigpOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgR2VuZXJhdGVkQ29kZUluZm86OmFubm90YXRpb24oaW50IGluZGV4KSBjb25zdCB7Ci0gIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24pCi0gIHJldHVybiBhbm5vdGF0aW9uXy5HZXQoaW5kZXgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogR2VuZXJhdGVkQ29kZUluZm86Om11dGFibGVfYW5ub3RhdGlvbihpbnQgaW5kZXgpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24pCi0gIHJldHVybiBhbm5vdGF0aW9uXy5NdXRhYmxlKGluZGV4KTsKLX0KLWlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIEdlbmVyYXRlZENvZGVJbmZvOjphZGRfYW5ub3RhdGlvbigpIHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKLSAgcmV0dXJuIGFubm90YXRpb25fLkFkZCgpOwotfQotaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uID4qCi1HZW5lcmF0ZWRDb2RlSW5mbzo6bXV0YWJsZV9hbm5vdGF0aW9uKCkgewotICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQotICByZXR1cm4gJmFubm90YXRpb25fOwotfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uID4mCi1HZW5lcmF0ZWRDb2RlSW5mbzo6YW5ub3RhdGlvbigpIGNvbnN0IHsKLSAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24pCi0gIHJldHVybiBhbm5vdGF0aW9uXzsKLX0KLQotI2VuZGlmICAvLyAhUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi0vLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2lmbmRlZiBTV0lHCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLXRlbXBsYXRlIDw+IHN0cnVjdCBpc19wcm90b19lbnVtPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+IDogOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlIHt9OwotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZT4oKSB7Ci0gIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfZGVzY3JpcHRvcigpOwotfQotdGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWw+IDogOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlIHt9OwotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWw+KCkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yKCk7Ci19Ci10ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGU+IDogOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlIHt9OwotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlPigpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX2Rlc2NyaXB0b3IoKTsKLX0KLXRlbXBsYXRlIDw+IHN0cnVjdCBpc19wcm90b19lbnVtPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZT4gOiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUge307Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGU+KCkgewotICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpOwotfQotdGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZT4gOiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUge307Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlPigpIHsKLSAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBTV0lHCi0KLS8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpCi0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG9fX0lOQ0xVREVECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA4YjE1NTUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsODAzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGUgbWVzc2FnZXMgaW4gdGhpcyBmaWxlIGRlc2NyaWJlIHRoZSBkZWZpbml0aW9ucyBmb3VuZCBpbiAucHJvdG8gZmlsZXMuCi0vLyBBIHZhbGlkIC5wcm90byBmaWxlIGNhbiBiZSB0cmFuc2xhdGVkIGRpcmVjdGx5IHRvIGEgRmlsZURlc2NyaXB0b3JQcm90bwotLy8gd2l0aG91dCBhbnkgb3RoZXIgaW5mb3JtYXRpb24gKGUuZy4gd2l0aG91dCByZWFkaW5nIGl0cyBpbXBvcnRzKS4KLQotCi1zeW50YXggPSAicHJvdG8yIjsKLQotcGFja2FnZSBnb29nbGUucHJvdG9idWY7Ci1vcHRpb24gZ29fcGFja2FnZSA9ICJkZXNjcmlwdG9yIjsKLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiRGVzY3JpcHRvclByb3RvcyI7Ci1vcHRpb24gY3NoYXJwX25hbWVzcGFjZSA9ICJHb29nbGUuUHJvdG9idWYuUmVmbGVjdGlvbiI7Ci1vcHRpb24gb2JqY19jbGFzc19wcmVmaXggPSAiR1BCIjsKLQotLy8gZGVzY3JpcHRvci5wcm90byBtdXN0IGJlIG9wdGltaXplZCBmb3Igc3BlZWQgYmVjYXVzZSByZWZsZWN0aW9uLWJhc2VkCi0vLyBhbGdvcml0aG1zIGRvbid0IHdvcmsgZHVyaW5nIGJvb3RzdHJhcHBpbmcuCi1vcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7Ci0KLS8vIFRoZSBwcm90b2NvbCBjb21waWxlciBjYW4gb3V0cHV0IGEgRmlsZURlc2NyaXB0b3JTZXQgY29udGFpbmluZyB0aGUgLnByb3RvCi0vLyBmaWxlcyBpdCBwYXJzZXMuCi1tZXNzYWdlIEZpbGVEZXNjcmlwdG9yU2V0IHsKLSAgcmVwZWF0ZWQgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKLX0KLQotLy8gRGVzY3JpYmVzIGEgY29tcGxldGUgLnByb3RvIGZpbGUuCi1tZXNzYWdlIEZpbGVEZXNjcmlwdG9yUHJvdG8gewotICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7ICAgICAgIC8vIGZpbGUgbmFtZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZQotICBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7ICAgIC8vIGUuZy4gImZvbyIsICJmb28uYmFyIiwgZXRjLgotCi0gIC8vIE5hbWVzIG9mIGZpbGVzIGltcG9ydGVkIGJ5IHRoaXMgZmlsZS4KLSAgcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwotICAvLyBJbmRleGVzIG9mIHRoZSBwdWJsaWMgaW1wb3J0ZWQgZmlsZXMgaW4gdGhlIGRlcGVuZGVuY3kgbGlzdCBhYm92ZS4KLSAgcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKLSAgLy8gSW5kZXhlcyBvZiB0aGUgd2VhayBpbXBvcnRlZCBmaWxlcyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0LgotICAvLyBGb3IgR29vZ2xlLWludGVybmFsIG1pZ3JhdGlvbiBvbmx5LiBEbyBub3QgdXNlLgotICByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKLQotICAvLyBBbGwgdG9wLWxldmVsIGRlZmluaXRpb25zIGluIHRoaXMgZmlsZS4KLSAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7Ci0gIHJlcGVhdGVkIEVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKLSAgcmVwZWF0ZWQgU2VydmljZURlc2NyaXB0b3JQcm90byBzZXJ2aWNlID0gNjsKLSAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKLQotICBvcHRpb25hbCBGaWxlT3B0aW9ucyBvcHRpb25zID0gODsKLQotICAvLyBUaGlzIGZpZWxkIGNvbnRhaW5zIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KLSAgLy8gWW91IG1heSBzYWZlbHkgcmVtb3ZlIHRoaXMgZW50aXJlIGZpZWxkIHdpdGhvdXQgaGFybWluZyBydW50aW1lCi0gIC8vIGZ1bmN0aW9uYWxpdHkgb2YgdGhlIGRlc2NyaXB0b3JzIC0tIHRoZSBpbmZvcm1hdGlvbiBpcyBuZWVkZWQgb25seSBieQotICAvLyBkZXZlbG9wbWVudCB0b29scy4KLSAgb3B0aW9uYWwgU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7Ci0KLSAgLy8gVGhlIHN5bnRheCBvZiB0aGUgcHJvdG8gZmlsZS4KLSAgLy8gVGhlIHN1cHBvcnRlZCB2YWx1ZXMgYXJlICJwcm90bzIiIGFuZCAicHJvdG8zIi4KLSAgb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOwotfQotCi0vLyBEZXNjcmliZXMgYSBtZXNzYWdlIHR5cGUuCi1tZXNzYWdlIERlc2NyaXB0b3JQcm90byB7Ci0gIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLQotICByZXBlYXRlZCBGaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7Ci0gIHJlcGVhdGVkIEZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7Ci0KLSAgcmVwZWF0ZWQgRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKLSAgcmVwZWF0ZWQgRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OwotCi0gIG1lc3NhZ2UgRXh0ZW5zaW9uUmFuZ2UgewotICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKLSAgICBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOwotICB9Ci0gIHJlcGVhdGVkIEV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7Ci0KLSAgcmVwZWF0ZWQgT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7Ci0KLSAgb3B0aW9uYWwgTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7Ci0KLSAgLy8gUmFuZ2Ugb2YgcmVzZXJ2ZWQgdGFnIG51bWJlcnMuIFJlc2VydmVkIHRhZyBudW1iZXJzIG1heSBub3QgYmUgdXNlZCBieQotICAvLyBmaWVsZHMgb3IgZXh0ZW5zaW9uIHJhbmdlcyBpbiB0aGUgc2FtZSBtZXNzYWdlLiBSZXNlcnZlZCByYW5nZXMgbWF5Ci0gIC8vIG5vdCBvdmVybGFwLgotICBtZXNzYWdlIFJlc2VydmVkUmFuZ2UgewotICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsgLy8gSW5jbHVzaXZlLgotICAgIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7ICAgLy8gRXhjbHVzaXZlLgotICB9Ci0gIHJlcGVhdGVkIFJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA5OwotICAvLyBSZXNlcnZlZCBmaWVsZCBuYW1lcywgd2hpY2ggbWF5IG5vdCBiZSB1c2VkIGJ5IGZpZWxkcyBpbiB0aGUgc2FtZSBtZXNzYWdlLgotICAvLyBBIGdpdmVuIG5hbWUgbWF5IG9ubHkgYmUgcmVzZXJ2ZWQgb25jZS4KLSAgcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKLX0KLQotLy8gRGVzY3JpYmVzIGEgZmllbGQgd2l0aGluIGEgbWVzc2FnZS4KLW1lc3NhZ2UgRmllbGREZXNjcmlwdG9yUHJvdG8gewotICBlbnVtIFR5cGUgewotICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycy4KLSAgICAvLyBPcmRlciBpcyB3ZWlyZCBmb3IgaGlzdG9yaWNhbCByZWFzb25zLgotICAgIFRZUEVfRE9VQkxFICAgICAgICAgPSAxOwotICAgIFRZUEVfRkxPQVQgICAgICAgICAgPSAyOwotICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQ2NCBpZgotICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LgotICAgIFRZUEVfSU5UNjQgICAgICAgICAgPSAzOwotICAgIFRZUEVfVUlOVDY0ICAgICAgICAgPSA0OwotICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQzMiBpZgotICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LgotICAgIFRZUEVfSU5UMzIgICAgICAgICAgPSA1OwotICAgIFRZUEVfRklYRUQ2NCAgICAgICAgPSA2OwotICAgIFRZUEVfRklYRUQzMiAgICAgICAgPSA3OwotICAgIFRZUEVfQk9PTCAgICAgICAgICAgPSA4OwotICAgIFRZUEVfU1RSSU5HICAgICAgICAgPSA5OwotICAgIFRZUEVfR1JPVVAgICAgICAgICAgPSAxMDsgIC8vIFRhZy1kZWxpbWl0ZWQgYWdncmVnYXRlLgotICAgIFRZUEVfTUVTU0FHRSAgICAgICAgPSAxMTsgIC8vIExlbmd0aC1kZWxpbWl0ZWQgYWdncmVnYXRlLgotCi0gICAgLy8gTmV3IGluIHZlcnNpb24gMi4KLSAgICBUWVBFX0JZVEVTICAgICAgICAgID0gMTI7Ci0gICAgVFlQRV9VSU5UMzIgICAgICAgICA9IDEzOwotICAgIFRZUEVfRU5VTSAgICAgICAgICAgPSAxNDsKLSAgICBUWVBFX1NGSVhFRDMyICAgICAgID0gMTU7Ci0gICAgVFlQRV9TRklYRUQ2NCAgICAgICA9IDE2OwotICAgIFRZUEVfU0lOVDMyICAgICAgICAgPSAxNzsgIC8vIFVzZXMgWmlnWmFnIGVuY29kaW5nLgotICAgIFRZUEVfU0lOVDY0ICAgICAgICAgPSAxODsgIC8vIFVzZXMgWmlnWmFnIGVuY29kaW5nLgotICB9OwotCi0gIGVudW0gTGFiZWwgewotICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycwotICAgIExBQkVMX09QVElPTkFMICAgICAgPSAxOwotICAgIExBQkVMX1JFUVVJUkVEICAgICAgPSAyOwotICAgIExBQkVMX1JFUEVBVEVEICAgICAgPSAzOwotICAgIC8vIFRPRE8oc2FuamF5KTogU2hvdWxkIHdlIGFkZCBMQUJFTF9NQVA/Ci0gIH07Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOwotICBvcHRpb25hbCBMYWJlbCBsYWJlbCA9IDQ7Ci0KLSAgLy8gSWYgdHlwZV9uYW1lIGlzIHNldCwgdGhpcyBuZWVkIG5vdCBiZSBzZXQuICBJZiBib3RoIHRoaXMgYW5kIHR5cGVfbmFtZQotICAvLyBhcmUgc2V0LCB0aGlzIG11c3QgYmUgb25lIG9mIFRZUEVfRU5VTSwgVFlQRV9NRVNTQUdFIG9yIFRZUEVfR1JPVVAuCi0gIG9wdGlvbmFsIFR5cGUgdHlwZSA9IDU7Ci0KLSAgLy8gRm9yIG1lc3NhZ2UgYW5kIGVudW0gdHlwZXMsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUuICBJZiB0aGUgbmFtZQotICAvLyBzdGFydHMgd2l0aCBhICcuJywgaXQgaXMgZnVsbHktcXVhbGlmaWVkLiAgT3RoZXJ3aXNlLCBDKystbGlrZSBzY29waW5nCi0gIC8vIHJ1bGVzIGFyZSB1c2VkIHRvIGZpbmQgdGhlIHR5cGUgKGkuZS4gZmlyc3QgdGhlIG5lc3RlZCB0eXBlcyB3aXRoaW4gdGhpcwotICAvLyBtZXNzYWdlIGFyZSBzZWFyY2hlZCwgdGhlbiB3aXRoaW4gdGhlIHBhcmVudCwgb24gdXAgdG8gdGhlIHJvb3QKLSAgLy8gbmFtZXNwYWNlKS4KLSAgb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7Ci0KLSAgLy8gRm9yIGV4dGVuc2lvbnMsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUgYmVpbmcgZXh0ZW5kZWQuICBJdCBpcwotICAvLyByZXNvbHZlZCBpbiB0aGUgc2FtZSBtYW5uZXIgYXMgdHlwZV9uYW1lLgotICBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOwotCi0gIC8vIEZvciBudW1lcmljIHR5cGVzLCBjb250YWlucyB0aGUgb3JpZ2luYWwgdGV4dCByZXByZXNlbnRhdGlvbiBvZiB0aGUgdmFsdWUuCi0gIC8vIEZvciBib29sZWFucywgInRydWUiIG9yICJmYWxzZSIuCi0gIC8vIEZvciBzdHJpbmdzLCBjb250YWlucyB0aGUgZGVmYXVsdCB0ZXh0IGNvbnRlbnRzIChub3QgZXNjYXBlZCBpbiBhbnkgd2F5KS4KLSAgLy8gRm9yIGJ5dGVzLCBjb250YWlucyB0aGUgQyBlc2NhcGVkIHZhbHVlLiAgQWxsIGJ5dGVzID49IDEyOCBhcmUgZXNjYXBlZC4KLSAgLy8gVE9ETyhrZW50b24pOiAgQmFzZS02NCBlbmNvZGU/Ci0gIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKLQotICAvLyBJZiBzZXQsIGdpdmVzIHRoZSBpbmRleCBvZiBhIG9uZW9mIGluIHRoZSBjb250YWluaW5nIHR5cGUncyBvbmVvZl9kZWNsCi0gIC8vIGxpc3QuICBUaGlzIGZpZWxkIGlzIGEgbWVtYmVyIG9mIHRoYXQgb25lb2YuCi0gIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKLQotICAvLyBKU09OIG5hbWUgb2YgdGhpcyBmaWVsZC4gVGhlIHZhbHVlIGlzIHNldCBieSBwcm90b2NvbCBjb21waWxlci4gSWYgdGhlCi0gIC8vIHVzZXIgaGFzIHNldCBhICJqc29uX25hbWUiIG9wdGlvbiBvbiB0aGlzIGZpZWxkLCB0aGF0IG9wdGlvbidzIHZhbHVlCi0gIC8vIHdpbGwgYmUgdXNlZC4gT3RoZXJ3aXNlLCBpdCdzIGRlZHVjZWQgZnJvbSB0aGUgZmllbGQncyBuYW1lIGJ5IGNvbnZlcnRpbmcKLSAgLy8gaXQgdG8gY2FtZWxDYXNlLgotICBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7Ci0KLSAgb3B0aW9uYWwgRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwotfQotCi0vLyBEZXNjcmliZXMgYSBvbmVvZi4KLW1lc3NhZ2UgT25lb2ZEZXNjcmlwdG9yUHJvdG8gewotICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci19Ci0KLS8vIERlc2NyaWJlcyBhbiBlbnVtIHR5cGUuCi1tZXNzYWdlIEVudW1EZXNjcmlwdG9yUHJvdG8gewotICBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0KLSAgcmVwZWF0ZWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKLQotICBvcHRpb25hbCBFbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKLX0KLQotLy8gRGVzY3JpYmVzIGEgdmFsdWUgd2l0aGluIGFuIGVudW0uCi1tZXNzYWdlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB7Ci0gIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKLQotICBvcHRpb25hbCBFbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOwotfQotCi0vLyBEZXNjcmliZXMgYSBzZXJ2aWNlLgotbWVzc2FnZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHsKLSAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICByZXBlYXRlZCBNZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKLQotICBvcHRpb25hbCBTZXJ2aWNlT3B0aW9ucyBvcHRpb25zID0gMzsKLX0KLQotLy8gRGVzY3JpYmVzIGEgbWV0aG9kIG9mIGEgc2VydmljZS4KLW1lc3NhZ2UgTWV0aG9kRGVzY3JpcHRvclByb3RvIHsKLSAgb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotCi0gIC8vIElucHV0IGFuZCBvdXRwdXQgdHlwZSBuYW1lcy4gIFRoZXNlIGFyZSByZXNvbHZlZCBpbiB0aGUgc2FtZSB3YXkgYXMKLSAgLy8gRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lLCBidXQgbXVzdCByZWZlciB0byBhIG1lc3NhZ2UgdHlwZS4KLSAgb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOwotICBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOwotCi0gIG9wdGlvbmFsIE1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7Ci0KLSAgLy8gSWRlbnRpZmllcyBpZiBjbGllbnQgc3RyZWFtcyBtdWx0aXBsZSBjbGllbnQgbWVzc2FnZXMKLSAgb3B0aW9uYWwgYm9vbCBjbGllbnRfc3RyZWFtaW5nID0gNSBbZGVmYXVsdD1mYWxzZV07Ci0gIC8vIElkZW50aWZpZXMgaWYgc2VydmVyIHN0cmVhbXMgbXVsdGlwbGUgc2VydmVyIG1lc3NhZ2VzCi0gIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQ9ZmFsc2VdOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIE9wdGlvbnMKLQotLy8gRWFjaCBvZiB0aGUgZGVmaW5pdGlvbnMgYWJvdmUgbWF5IGhhdmUgIm9wdGlvbnMiIGF0dGFjaGVkLiAgVGhlc2UgYXJlCi0vLyBqdXN0IGFubm90YXRpb25zIHdoaWNoIG1heSBjYXVzZSBjb2RlIHRvIGJlIGdlbmVyYXRlZCBzbGlnaHRseSBkaWZmZXJlbnRseQotLy8gb3IgbWF5IGNvbnRhaW4gaGludHMgZm9yIGNvZGUgdGhhdCBtYW5pcHVsYXRlcyBwcm90b2NvbCBtZXNzYWdlcy4KLS8vCi0vLyBDbGllbnRzIG1heSBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgYXMgZXh0ZW5zaW9ucyBvZiB0aGUgKk9wdGlvbnMgbWVzc2FnZXMuCi0vLyBUaGVzZSBleHRlbnNpb25zIG1heSBub3QgeWV0IGJlIGtub3duIGF0IHBhcnNpbmcgdGltZSwgc28gdGhlIHBhcnNlciBjYW5ub3QKLS8vIHN0b3JlIHRoZSB2YWx1ZXMgaW4gdGhlbS4gIEluc3RlYWQgaXQgc3RvcmVzIHRoZW0gaW4gYSBmaWVsZCBpbiB0aGUgKk9wdGlvbnMKLS8vIG1lc3NhZ2UgY2FsbGVkIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLiBUaGlzIGZpZWxkIG11c3QgaGF2ZSB0aGUgc2FtZSBuYW1lCi0vLyBhY3Jvc3MgYWxsICpPcHRpb25zIG1lc3NhZ2VzLiBXZSB0aGVuIHVzZSB0aGlzIGZpZWxkIHRvIHBvcHVsYXRlIHRoZQotLy8gZXh0ZW5zaW9ucyB3aGVuIHdlIGJ1aWxkIGEgZGVzY3JpcHRvciwgYXQgd2hpY2ggcG9pbnQgYWxsIHByb3RvcyBoYXZlIGJlZW4KLS8vIHBhcnNlZCBhbmQgc28gYWxsIGV4dGVuc2lvbnMgYXJlIGtub3duLgotLy8KLS8vIEV4dGVuc2lvbiBudW1iZXJzIGZvciBjdXN0b20gb3B0aW9ucyBtYXkgYmUgY2hvc2VuIGFzIGZvbGxvd3M6Ci0vLyAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgb25seSBiZSB1c2VkIHdpdGhpbiBhIHNpbmdsZSBhcHBsaWNhdGlvbiBvcgotLy8gICBvcmdhbml6YXRpb24sIG9yIGZvciBleHBlcmltZW50YWwgb3B0aW9ucywgdXNlIGZpZWxkIG51bWJlcnMgNTAwMDAKLS8vICAgdGhyb3VnaCA5OTk5OS4gIEl0IGlzIHVwIHRvIHlvdSB0byBlbnN1cmUgdGhhdCB5b3UgZG8gbm90IHVzZSB0aGUKLS8vICAgc2FtZSBudW1iZXIgZm9yIG11bHRpcGxlIG9wdGlvbnMuCi0vLyAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCi0vLyAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCi0vLyAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCi0vLyAgIE9iamVjdGl2ZS1DIHBsdWdpbikgYW5kIHlvdXIgcHJvamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8KLS8vICAgbmVlZCB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lCi0vLyAgIGV4dGVuc2lvbiBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uCi0vLyAgIG51bWJlciBieSBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mCi0vLyAgIHRoZSBkb2NzIGZvciBleGFtcGxlczoKLS8vICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvI29wdGlvbnMKLS8vICAgSWYgdGhpcyB0dXJucyBvdXQgdG8gYmUgcG9wdWxhciwgYSB3ZWIgc2VydmljZSB3aWxsIGJlIHNldCB1cAotLy8gICB0byBhdXRvbWF0aWNhbGx5IGFzc2lnbiBvcHRpb24gbnVtYmVycy4KLQotCi1tZXNzYWdlIEZpbGVPcHRpb25zIHsKLQotICAvLyBTZXRzIHRoZSBKYXZhIHBhY2thZ2Ugd2hlcmUgY2xhc3NlcyBnZW5lcmF0ZWQgZnJvbSB0aGlzIC5wcm90byB3aWxsIGJlCi0gIC8vIHBsYWNlZC4gIEJ5IGRlZmF1bHQsIHRoZSBwcm90byBwYWNrYWdlIGlzIHVzZWQsIGJ1dCB0aGlzIGlzIG9mdGVuCi0gIC8vIGluYXBwcm9wcmlhdGUgYmVjYXVzZSBwcm90byBwYWNrYWdlcyBkbyBub3Qgbm9ybWFsbHkgc3RhcnQgd2l0aCBiYWNrd2FyZHMKLSAgLy8gZG9tYWluIG5hbWVzLgotICBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKLQotCi0gIC8vIElmIHNldCwgYWxsIHRoZSBjbGFzc2VzIGZyb20gdGhlIC5wcm90byBmaWxlIGFyZSB3cmFwcGVkIGluIGEgc2luZ2xlCi0gIC8vIG91dGVyIGNsYXNzIHdpdGggdGhlIGdpdmVuIG5hbWUuICBUaGlzIGFwcGxpZXMgdG8gYm90aCBQcm90bzEKLSAgLy8gKGVxdWl2YWxlbnQgdG8gdGhlIG9sZCAiLS1vbmVfamF2YV9maWxlIiBvcHRpb24pIGFuZCBQcm90bzIgKHdoZXJlCi0gIC8vIGEgLnByb3RvIGFsd2F5cyB0cmFuc2xhdGVzIHRvIGEgc2luZ2xlIGNsYXNzLCBidXQgeW91IG1heSB3YW50IHRvCi0gIC8vIGV4cGxpY2l0bHkgY2hvb3NlIHRoZSBjbGFzcyBuYW1lKS4KLSAgb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKLQotICAvLyBJZiBzZXQgdHJ1ZSwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGEgc2VwYXJhdGUgLmphdmEKLSAgLy8gZmlsZSBmb3IgZWFjaCB0b3AtbGV2ZWwgbWVzc2FnZSwgZW51bSwgYW5kIHNlcnZpY2UgZGVmaW5lZCBpbiB0aGUgLnByb3RvCi0gIC8vIGZpbGUuICBUaHVzLCB0aGVzZSB0eXBlcyB3aWxsICpub3QqIGJlIG5lc3RlZCBpbnNpZGUgdGhlIG91dGVyIGNsYXNzCi0gIC8vIG5hbWVkIGJ5IGphdmFfb3V0ZXJfY2xhc3NuYW1lLiAgSG93ZXZlciwgdGhlIG91dGVyIGNsYXNzIHdpbGwgc3RpbGwgYmUKLSAgLy8gZ2VuZXJhdGVkIHRvIGNvbnRhaW4gdGhlIGZpbGUncyBnZXREZXNjcmlwdG9yKCkgbWV0aG9kIGFzIHdlbGwgYXMgYW55Ci0gIC8vIHRvcC1sZXZlbCBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIGZpbGUuCi0gIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBJZiBzZXQgdHJ1ZSwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGVxdWFscygpIGFuZAotICAvLyBoYXNoQ29kZSgpIG1ldGhvZHMgZm9yIGFsbCBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KLSAgLy8gVGhpcyBpbmNyZWFzZXMgZ2VuZXJhdGVkIGNvZGUgc2l6ZSwgcG90ZW50aWFsbHkgc3Vic3RhbnRpYWxseSBmb3IgbGFyZ2UKLSAgLy8gcHJvdG9zLCB3aGljaCBtYXkgaGFybSBhIG1lbW9yeS1jb25zdHJhaW5lZCBhcHBsaWNhdGlvbi4KLSAgLy8gLSBJbiB0aGUgZnVsbCBydW50aW1lIHRoaXMgaXMgYSBzcGVlZCBvcHRpbWl6YXRpb24sIGFzIHRoZQotICAvLyBBYnN0cmFjdE1lc3NhZ2UgYmFzZSBjbGFzcyBpbmNsdWRlcyByZWZsZWN0aW9uLWJhc2VkIGltcGxlbWVudGF0aW9ucyBvZgotICAvLyB0aGVzZSBtZXRob2RzLgotICAvLyAtIEluIHRoZSBsaXRlIHJ1bnRpbWUsIHNldHRpbmcgdGhpcyBvcHRpb24gY2hhbmdlcyB0aGUgc2VtYW50aWNzIG9mCi0gIC8vIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIHRvIG1vcmUgY2xvc2VseSBtYXRjaCB0aG9zZSBvZiB0aGUgZnVsbCBydW50aW1lOwotICAvLyB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMgY29tcHV0ZSB0aGVpciByZXN1bHRzIGJhc2VkIG9uIGZpZWxkIHZhbHVlcyByYXRoZXIKLSAgLy8gdGhhbiBvYmplY3QgaWRlbnRpdHkuIChJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBoYXNoY29kZXMKLSAgLy8gd2lsbCBiZSBjb25zaXN0ZW50IGFjcm9zcyBydW50aW1lcyBvciB2ZXJzaW9ucyBvZiB0aGUgcHJvdG9jb2wgY29tcGlsZXIuKQotICBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQ9ZmFsc2VdOwotCi0gIC8vIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhMiBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdAotICAvLyB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW5ldmVyIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhc3NpZ24gYSBub24tVVRGLTgKLSAgLy8gYnl0ZSBzZXF1ZW5jZSB0byBhIHN0cmluZyBmaWVsZC4KLSAgLy8gTWVzc2FnZSByZWZsZWN0aW9uIHdpbGwgZG8gdGhlIHNhbWUuCi0gIC8vIEhvd2V2ZXIsIGFuIGV4dGVuc2lvbiBmaWVsZCBzdGlsbCBhY2NlcHRzIG5vbi1VVEYtOCBieXRlIHNlcXVlbmNlcy4KLSAgLy8gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB3aGVuIHVzZWQgd2l0aCB0aGUgbGl0ZSBydW50aW1lLgotICBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdD1mYWxzZV07Ci0KLQotICAvLyBHZW5lcmF0ZWQgY2xhc3NlcyBjYW4gYmUgb3B0aW1pemVkIGZvciBzcGVlZCBvciBjb2RlIHNpemUuCi0gIGVudW0gT3B0aW1pemVNb2RlIHsKLSAgICBTUEVFRCA9IDE7ICAgICAgICAvLyBHZW5lcmF0ZSBjb21wbGV0ZSBjb2RlIGZvciBwYXJzaW5nLCBzZXJpYWxpemF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgIC8vIGV0Yy4KLSAgICBDT0RFX1NJWkUgPSAyOyAgICAvLyBVc2UgUmVmbGVjdGlvbk9wcyB0byBpbXBsZW1lbnQgdGhlc2UgbWV0aG9kcy4KLSAgICBMSVRFX1JVTlRJTUUgPSAzOyAvLyBHZW5lcmF0ZSBjb2RlIHVzaW5nIE1lc3NhZ2VMaXRlIGFuZCB0aGUgbGl0ZSBydW50aW1lLgotICB9Ci0gIG9wdGlvbmFsIE9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0PVNQRUVEXTsKLQotICAvLyBTZXRzIHRoZSBHbyBwYWNrYWdlIHdoZXJlIHN0cnVjdHMgZ2VuZXJhdGVkIGZyb20gdGhpcyAucHJvdG8gd2lsbCBiZQotICAvLyBwbGFjZWQuIElmIG9taXR0ZWQsIHRoZSBHbyBwYWNrYWdlIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmc6Ci0gIC8vICAgLSBUaGUgYmFzZW5hbWUgb2YgdGhlIHBhY2thZ2UgaW1wb3J0IHBhdGgsIGlmIHByb3ZpZGVkLgotICAvLyAgIC0gT3RoZXJ3aXNlLCB0aGUgcGFja2FnZSBzdGF0ZW1lbnQgaW4gdGhlIC5wcm90byBmaWxlLCBpZiBwcmVzZW50LgotICAvLyAgIC0gT3RoZXJ3aXNlLCB0aGUgYmFzZW5hbWUgb2YgdGhlIC5wcm90byBmaWxlLCB3aXRob3V0IGV4dGVuc2lvbi4KLSAgb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKLQotCi0KLSAgLy8gU2hvdWxkIGdlbmVyaWMgc2VydmljZXMgYmUgZ2VuZXJhdGVkIGluIGVhY2ggbGFuZ3VhZ2U/ICAiR2VuZXJpYyIgc2VydmljZXMKLSAgLy8gYXJlIG5vdCBzcGVjaWZpYyB0byBhbnkgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhleSBhcmUgZ2VuZXJhdGVkIGJ5IHRoZQotICAvLyBtYWluIGNvZGUgZ2VuZXJhdG9ycyBpbiBlYWNoIGxhbmd1YWdlICh3aXRob3V0IGFkZGl0aW9uYWwgcGx1Z2lucykuCi0gIC8vIEdlbmVyaWMgc2VydmljZXMgd2VyZSB0aGUgb25seSBraW5kIG9mIHNlcnZpY2UgZ2VuZXJhdGlvbiBzdXBwb3J0ZWQgYnkKLSAgLy8gZWFybHkgdmVyc2lvbnMgb2YgZ29vZ2xlLnByb3RvYnVmLgotICAvLwotICAvLyBHZW5lcmljIHNlcnZpY2VzIGFyZSBub3cgY29uc2lkZXJlZCBkZXByZWNhdGVkIGluIGZhdm9yIG9mIHVzaW5nIHBsdWdpbnMKLSAgLy8gdGhhdCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHlvdXIgcGFydGljdWxhciBSUEMgc3lzdGVtLiAgVGhlcmVmb3JlLAotICAvLyB0aGVzZSBkZWZhdWx0IHRvIGZhbHNlLiAgT2xkIGNvZGUgd2hpY2ggZGVwZW5kcyBvbiBnZW5lcmljIHNlcnZpY2VzIHNob3VsZAotICAvLyBleHBsaWNpdGx5IHNldCB0aGVtIHRvIHRydWUuCi0gIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0PWZhbHNlXTsKLSAgb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdD1mYWxzZV07Ci0gIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBJcyB0aGlzIGZpbGUgZGVwcmVjYXRlZD8KLSAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwotICAvLyBmb3IgZXZlcnl0aGluZyBpbiB0aGUgZmlsZSwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5Ci0gIC8vIGxlYXN0LCB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgZmlsZXMuCi0gIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBFbmFibGVzIHRoZSB1c2Ugb2YgYXJlbmFzIGZvciB0aGUgcHJvdG8gbWVzc2FnZXMgaW4gdGhpcyBmaWxlLiBUaGlzIGFwcGxpZXMKLSAgLy8gb25seSB0byBnZW5lcmF0ZWQgY2xhc3NlcyBmb3IgQysrLgotICBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdD1mYWxzZV07Ci0KLQotICAvLyBTZXRzIHRoZSBvYmplY3RpdmUgYyBjbGFzcyBwcmVmaXggd2hpY2ggaXMgcHJlcGVuZGVkIHRvIGFsbCBvYmplY3RpdmUgYwotICAvLyBnZW5lcmF0ZWQgY2xhc3NlcyBmcm9tIHRoaXMgLnByb3RvLiBUaGVyZSBpcyBubyBkZWZhdWx0LgotICBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKLQotICAvLyBOYW1lc3BhY2UgZm9yIGdlbmVyYXRlZCBjbGFzc2VzOyBkZWZhdWx0cyB0byB0aGUgcGFja2FnZS4KLSAgb3B0aW9uYWwgc3RyaW5nIGNzaGFycF9uYW1lc3BhY2UgPSAzNzsKLQotICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KLSAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLQotICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KLSAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKLQotICByZXNlcnZlZCAzODsKLX0KLQotbWVzc2FnZSBNZXNzYWdlT3B0aW9ucyB7Ci0gIC8vIFNldCB0cnVlIHRvIHVzZSB0aGUgb2xkIHByb3RvMSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0IGZvciBleHRlbnNpb25zLgotICAvLyBUaGlzIGlzIHByb3ZpZGVkIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHRoZSBNZXNzYWdlU2V0IHdpcmUKLSAgLy8gZm9ybWF0LiAgWW91IHNob3VsZCBub3QgdXNlIHRoaXMgZm9yIGFueSBvdGhlciByZWFzb246ICBJdCdzIGxlc3MKLSAgLy8gZWZmaWNpZW50LCBoYXMgZmV3ZXIgZmVhdHVyZXMsIGFuZCBpcyBtb3JlIGNvbXBsaWNhdGVkLgotICAvLwotICAvLyBUaGUgbWVzc2FnZSBtdXN0IGJlIGRlZmluZWQgZXhhY3RseSBhcyBmb2xsb3dzOgotICAvLyAgIG1lc3NhZ2UgRm9vIHsKLSAgLy8gICAgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7Ci0gIC8vICAgICBleHRlbnNpb25zIDQgdG8gbWF4OwotICAvLyAgIH0KLSAgLy8gTm90ZSB0aGF0IHRoZSBtZXNzYWdlIGNhbm5vdCBoYXZlIGFueSBkZWZpbmVkIGZpZWxkczsgTWVzc2FnZVNldHMgb25seQotICAvLyBoYXZlIGV4dGVuc2lvbnMuCi0gIC8vCi0gIC8vIEFsbCBleHRlbnNpb25zIG9mIHlvdXIgdHlwZSBtdXN0IGJlIHNpbmd1bGFyIG1lc3NhZ2VzOyBlLmcuIHRoZXkgY2Fubm90Ci0gIC8vIGJlIGludDMycywgZW51bXMsIG9yIHJlcGVhdGVkIG1lc3NhZ2VzLgotICAvLwotICAvLyBCZWNhdXNlIHRoaXMgaXMgYW4gb3B0aW9uLCB0aGUgYWJvdmUgdHdvIHJlc3RyaWN0aW9ucyBhcmUgbm90IGVuZm9yY2VkIGJ5Ci0gIC8vIHRoZSBwcm90b2NvbCBjb21waWxlci4KLSAgb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQ9ZmFsc2VdOwotCi0gIC8vIERpc2FibGVzIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBzdGFuZGFyZCAiZGVzY3JpcHRvcigpIiBhY2Nlc3Nvciwgd2hpY2ggY2FuCi0gIC8vIGNvbmZsaWN0IHdpdGggYSBmaWVsZCBvZiB0aGUgc2FtZSBuYW1lLiAgVGhpcyBpcyBtZWFudCB0byBtYWtlIG1pZ3JhdGlvbgotICAvLyBmcm9tIHByb3RvMSBlYXNpZXI7IG5ldyBjb2RlIHNob3VsZCBhdm9pZCBmaWVsZHMgbmFtZWQgImRlc2NyaXB0b3IiLgotICBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBJcyB0aGlzIG1lc3NhZ2UgZGVwcmVjYXRlZD8KLSAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwotICAvLyBmb3IgdGhlIG1lc3NhZ2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKLSAgLy8gdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIG1lc3NhZ2VzLgotICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBXaGV0aGVyIHRoZSBtZXNzYWdlIGlzIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1hcCBlbnRyeSB0eXBlIGZvciB0aGUKLSAgLy8gbWFwcyBmaWVsZC4KLSAgLy8KLSAgLy8gRm9yIG1hcHMgZmllbGRzOgotICAvLyAgICAgbWFwPEtleVR5cGUsIFZhbHVlVHlwZT4gbWFwX2ZpZWxkID0gMTsKLSAgLy8gVGhlIHBhcnNlZCBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6Ci0gIC8vICAgICBtZXNzYWdlIE1hcEZpZWxkRW50cnkgewotICAvLyAgICAgICAgIG9wdGlvbiBtYXBfZW50cnkgPSB0cnVlOwotICAvLyAgICAgICAgIG9wdGlvbmFsIEtleVR5cGUga2V5ID0gMTsKLSAgLy8gICAgICAgICBvcHRpb25hbCBWYWx1ZVR5cGUgdmFsdWUgPSAyOwotICAvLyAgICAgfQotICAvLyAgICAgcmVwZWF0ZWQgTWFwRmllbGRFbnRyeSBtYXBfZmllbGQgPSAxOwotICAvLwotICAvLyBJbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSBub3QgdG8gZ2VuZXJhdGUgdGhlIG1hcF9lbnRyeT10cnVlIG1lc3NhZ2UsIGJ1dAotICAvLyB1c2UgYSBuYXRpdmUgbWFwIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdG8gaG9sZCB0aGUga2V5cyBhbmQgdmFsdWVzLgotICAvLyBUaGUgcmVmbGVjdGlvbiBBUElzIGluIHN1Y2ggaW1wbGVtZW50aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKLSAgLy8gaWYgdGhlIGZpZWxkIGlzIGEgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4KLSAgLy8KLSAgLy8gTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKLSAgLy8gaW5zdGVhZC4gVGhlIG9wdGlvbiBzaG91bGQgb25seSBiZSBpbXBsaWNpdGx5IHNldCBieSB0aGUgcHJvdG8gY29tcGlsZXIKLSAgLy8gcGFyc2VyLgotICBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7Ci0KLSAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCi0gIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0KLSAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCi0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci19Ci0KLW1lc3NhZ2UgRmllbGRPcHRpb25zIHsKLSAgLy8gVGhlIGN0eXBlIG9wdGlvbiBpbnN0cnVjdHMgdGhlIEMrKyBjb2RlIGdlbmVyYXRvciB0byB1c2UgYSBkaWZmZXJlbnQKLSAgLy8gcmVwcmVzZW50YXRpb24gb2YgdGhlIGZpZWxkIHRoYW4gaXQgbm9ybWFsbHkgd291bGQuICBTZWUgdGhlIHNwZWNpZmljCi0gIC8vIG9wdGlvbnMgYmVsb3cuICBUaGlzIG9wdGlvbiBpcyBub3QgeWV0IGltcGxlbWVudGVkIGluIHRoZSBvcGVuIHNvdXJjZQotICAvLyByZWxlYXNlIC0tIHNvcnJ5LCB3ZSdsbCB0cnkgdG8gaW5jbHVkZSBpdCBpbiBhIGZ1dHVyZSB2ZXJzaW9uIQotICBvcHRpb25hbCBDVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOwotICBlbnVtIENUeXBlIHsKLSAgICAvLyBEZWZhdWx0IG1vZGUuCi0gICAgU1RSSU5HID0gMDsKLQotICAgIENPUkQgPSAxOwotCi0gICAgU1RSSU5HX1BJRUNFID0gMjsKLSAgfQotICAvLyBUaGUgcGFja2VkIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyB0byBlbmFibGUKLSAgLy8gYSBtb3JlIGVmZmljaWVudCByZXByZXNlbnRhdGlvbiBvbiB0aGUgd2lyZS4gUmF0aGVyIHRoYW4gcmVwZWF0ZWRseQotICAvLyB3cml0aW5nIHRoZSB0YWcgYW5kIHR5cGUgZm9yIGVhY2ggZWxlbWVudCwgdGhlIGVudGlyZSBhcnJheSBpcyBlbmNvZGVkIGFzCi0gIC8vIGEgc2luZ2xlIGxlbmd0aC1kZWxpbWl0ZWQgYmxvYi4gSW4gcHJvdG8zLCBvbmx5IGV4cGxpY2l0IHNldHRpbmcgaXQgdG8KLSAgLy8gZmFsc2Ugd2lsbCBhdm9pZCB1c2luZyBwYWNrZWQgZW5jb2RpbmcuCi0gIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKLQotCi0gIC8vIFRoZSBqc3R5cGUgb3B0aW9uIGRldGVybWluZXMgdGhlIEphdmFTY3JpcHQgdHlwZSB1c2VkIGZvciB2YWx1ZXMgb2YgdGhlCi0gIC8vIGZpZWxkLiAgVGhlIG9wdGlvbiBpcyBwZXJtaXR0ZWQgb25seSBmb3IgNjQgYml0IGludGVncmFsIGFuZCBmaXhlZCB0eXBlcwotICAvLyAoaW50NjQsIHVpbnQ2NCwgc2ludDY0LCBmaXhlZDY0LCBzZml4ZWQ2NCkuICBCeSBkZWZhdWx0IHRoZXNlIHR5cGVzIGFyZQotICAvLyByZXByZXNlbnRlZCBhcyBKYXZhU2NyaXB0IHN0cmluZ3MuICBUaGlzIGF2b2lkcyBsb3NzIG9mIHByZWNpc2lvbiB0aGF0IGNhbgotICAvLyBoYXBwZW4gd2hlbiBhIGxhcmdlIHZhbHVlIGlzIGNvbnZlcnRlZCB0byBhIGZsb2F0aW5nIHBvaW50IEphdmFTY3JpcHQKLSAgLy8gbnVtYmVycy4gIFNwZWNpZnlpbmcgSlNfTlVNQkVSIGZvciB0aGUganN0eXBlIGNhdXNlcyB0aGUgZ2VuZXJhdGVkCi0gIC8vIEphdmFTY3JpcHQgY29kZSB0byB1c2UgdGhlIEphdmFTY3JpcHQgIm51bWJlciIgdHlwZSBpbnN0ZWFkIG9mIHN0cmluZ3MuCi0gIC8vIFRoaXMgb3B0aW9uIGlzIGFuIGVudW0gdG8gcGVybWl0IGFkZGl0aW9uYWwgdHlwZXMgdG8gYmUgYWRkZWQsCi0gIC8vIGUuZy4gZ29vZy5tYXRoLkludGVnZXIuCi0gIG9wdGlvbmFsIEpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKLSAgZW51bSBKU1R5cGUgewotICAgIC8vIFVzZSB0aGUgZGVmYXVsdCB0eXBlLgotICAgIEpTX05PUk1BTCA9IDA7Ci0KLSAgICAvLyBVc2UgSmF2YVNjcmlwdCBzdHJpbmdzLgotICAgIEpTX1NUUklORyA9IDE7Ci0KLSAgICAvLyBVc2UgSmF2YVNjcmlwdCBudW1iZXJzLgotICAgIEpTX05VTUJFUiA9IDI7Ci0gIH0KLQotICAvLyBTaG91bGQgdGhpcyBmaWVsZCBiZSBwYXJzZWQgbGF6aWx5PyAgTGF6eSBhcHBsaWVzIG9ubHkgdG8gbWVzc2FnZS10eXBlCi0gIC8vIGZpZWxkcy4gIEl0IG1lYW5zIHRoYXQgd2hlbiB0aGUgb3V0ZXIgbWVzc2FnZSBpcyBpbml0aWFsbHkgcGFyc2VkLCB0aGUKLSAgLy8gaW5uZXIgbWVzc2FnZSdzIGNvbnRlbnRzIHdpbGwgbm90IGJlIHBhcnNlZCBidXQgaW5zdGVhZCBzdG9yZWQgaW4gZW5jb2RlZAotICAvLyBmb3JtLiAgVGhlIGlubmVyIG1lc3NhZ2Ugd2lsbCBhY3R1YWxseSBiZSBwYXJzZWQgd2hlbiBpdCBpcyBmaXJzdCBhY2Nlc3NlZC4KLSAgLy8KLSAgLy8gVGhpcyBpcyBvbmx5IGEgaGludC4gIEltcGxlbWVudGF0aW9ucyBhcmUgZnJlZSB0byBjaG9vc2Ugd2hldGhlciB0byB1c2UKLSAgLy8gZWFnZXIgb3IgbGF6eSBwYXJzaW5nIHJlZ2FyZGxlc3Mgb2YgdGhlIHZhbHVlIG9mIHRoaXMgb3B0aW9uLiAgSG93ZXZlciwKLSAgLy8gc2V0dGluZyB0aGlzIG9wdGlvbiB0cnVlIHN1Z2dlc3RzIHRoYXQgdGhlIHByb3RvY29sIGF1dGhvciBiZWxpZXZlcyB0aGF0Ci0gIC8vIHVzaW5nIGxhenkgcGFyc2luZyBvbiB0aGlzIGZpZWxkIGlzIHdvcnRoIHRoZSBhZGRpdGlvbmFsIGJvb2trZWVwaW5nCi0gIC8vIG92ZXJoZWFkIHR5cGljYWxseSBuZWVkZWQgdG8gaW1wbGVtZW50IGl0LgotICAvLwotICAvLyBUaGlzIG9wdGlvbiBkb2VzIG5vdCBhZmZlY3QgdGhlIHB1YmxpYyBpbnRlcmZhY2Ugb2YgYW55IGdlbmVyYXRlZCBjb2RlOwotICAvLyBhbGwgbWV0aG9kIHNpZ25hdHVyZXMgcmVtYWluIHRoZSBzYW1lLiAgRnVydGhlcm1vcmUsIHRocmVhZC1zYWZldHkgb2YgdGhlCi0gIC8vIGludGVyZmFjZSBpcyBub3QgYWZmZWN0ZWQgYnkgdGhpcyBvcHRpb247IGNvbnN0IG1ldGhvZHMgcmVtYWluIHNhZmUgdG8KLSAgLy8gY2FsbCBmcm9tIG11bHRpcGxlIHRocmVhZHMgY29uY3VycmVudGx5LCB3aGlsZSBub24tY29uc3QgbWV0aG9kcyBjb250aW51ZQotICAvLyB0byByZXF1aXJlIGV4Y2x1c2l2ZSBhY2Nlc3MuCi0gIC8vCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCBpbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSBub3QgdG8gY2hlY2sgcmVxdWlyZWQgZmllbGRzIHdpdGhpbgotICAvLyBhIGxhenkgc3ViLW1lc3NhZ2UuICBUaGF0IGlzLCBjYWxsaW5nIElzSW5pdGlhbGl6ZWQoKSBvbiB0aGUgb3V0aGVyIG1lc3NhZ2UKLSAgLy8gbWF5IHJldHVybiB0cnVlIGV2ZW4gaWYgdGhlIGlubmVyIG1lc3NhZ2UgaGFzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgotICAvLyBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgaW5uZXIgbWVzc2FnZSB3b3VsZCBoYXZlIHRvIGJlCi0gIC8vIHBhcnNlZCBpbiBvcmRlciB0byBwZXJmb3JtIHRoZSBjaGVjaywgZGVmZWF0aW5nIHRoZSBwdXJwb3NlIG9mIGxhenkKLSAgLy8gcGFyc2luZy4gIEFuIGltcGxlbWVudGF0aW9uIHdoaWNoIGNob29zZXMgbm90IHRvIGNoZWNrIHJlcXVpcmVkIGZpZWxkcwotICAvLyBtdXN0IGJlIGNvbnNpc3RlbnQgYWJvdXQgaXQuICBUaGF0IGlzLCBmb3IgYW55IHBhcnRpY3VsYXIgc3ViLW1lc3NhZ2UsIHRoZQotICAvLyBpbXBsZW1lbnRhdGlvbiBtdXN0IGVpdGhlciAqYWx3YXlzKiBjaGVjayBpdHMgcmVxdWlyZWQgZmllbGRzLCBvciAqbmV2ZXIqCi0gIC8vIGNoZWNrIGl0cyByZXF1aXJlZCBmaWVsZHMsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciBvciBub3QgdGhlIG1lc3NhZ2UgaGFzCi0gIC8vIGJlZW4gcGFyc2VkLgotICBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBJcyB0aGlzIGZpZWxkIGRlcHJlY2F0ZWQ/Ci0gIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKLSAgLy8gZm9yIGFjY2Vzc29ycywgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LCB0aGlzCi0gIC8vIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgZmllbGRzLgotICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBGb3IgR29vZ2xlLWludGVybmFsIG1pZ3JhdGlvbiBvbmx5LiBEbyBub3QgdXNlLgotICBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdD1mYWxzZV07Ci0KLQotICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KLSAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLQotICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KLSAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKLX0KLQotbWVzc2FnZSBFbnVtT3B0aW9ucyB7Ci0KLSAgLy8gU2V0IHRoaXMgb3B0aW9uIHRvIHRydWUgdG8gYWxsb3cgbWFwcGluZyBkaWZmZXJlbnQgdGFnIG5hbWVzIHRvIHRoZSBzYW1lCi0gIC8vIHZhbHVlLgotICBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMjsKLQotICAvLyBJcyB0aGlzIGVudW0gZGVwcmVjYXRlZD8KLSAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwotICAvLyBmb3IgdGhlIGVudW0sIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwgdGhpcwotICAvLyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGVudW1zLgotICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0PWZhbHNlXTsKLQotICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KLSAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLQotICAvLyBDbGllbnRzIGNhbiBkZWZpbmUgY3VzdG9tIG9wdGlvbnMgaW4gZXh0ZW5zaW9ucyBvZiB0aGlzIG1lc3NhZ2UuIFNlZSBhYm92ZS4KLSAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKLX0KLQotbWVzc2FnZSBFbnVtVmFsdWVPcHRpb25zIHsKLSAgLy8gSXMgdGhpcyBlbnVtIHZhbHVlIGRlcHJlY2F0ZWQ/Ci0gIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKLSAgLy8gZm9yIHRoZSBlbnVtIHZhbHVlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCi0gIC8vIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBlbnVtIHZhbHVlcy4KLSAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdD1mYWxzZV07Ci0KLSAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCi0gIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0KLSAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCi0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci19Ci0KLW1lc3NhZ2UgU2VydmljZU9wdGlvbnMgewotCi0gIC8vIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQwotICAvLyAgIGZyYW1ld29yay4gIFdlIGFwb2xvZ2l6ZSBmb3IgaG9hcmRpbmcgdGhlc2UgbnVtYmVycyB0byBvdXJzZWx2ZXMsIGJ1dAotICAvLyAgIHdlIHdlcmUgYWxyZWFkeSB1c2luZyB0aGVtIGxvbmcgYmVmb3JlIHdlIGRlY2lkZWQgdG8gcmVsZWFzZSBQcm90b2NvbAotICAvLyAgIEJ1ZmZlcnMuCi0KLSAgLy8gSXMgdGhpcyBzZXJ2aWNlIGRlcHJlY2F0ZWQ/Ci0gIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKLSAgLy8gZm9yIHRoZSBzZXJ2aWNlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCi0gIC8vIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBzZXJ2aWNlcy4KLSAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQ9ZmFsc2VdOwotCi0gIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgotICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotCi0gIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgotICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotfQotCi1tZXNzYWdlIE1ldGhvZE9wdGlvbnMgewotCi0gIC8vIE5vdGU6ICBGaWVsZCBudW1iZXJzIDEgdGhyb3VnaCAzMiBhcmUgcmVzZXJ2ZWQgZm9yIEdvb2dsZSdzIGludGVybmFsIFJQQwotICAvLyAgIGZyYW1ld29yay4gIFdlIGFwb2xvZ2l6ZSBmb3IgaG9hcmRpbmcgdGhlc2UgbnVtYmVycyB0byBvdXJzZWx2ZXMsIGJ1dAotICAvLyAgIHdlIHdlcmUgYWxyZWFkeSB1c2luZyB0aGVtIGxvbmcgYmVmb3JlIHdlIGRlY2lkZWQgdG8gcmVsZWFzZSBQcm90b2NvbAotICAvLyAgIEJ1ZmZlcnMuCi0KLSAgLy8gSXMgdGhpcyBtZXRob2QgZGVwcmVjYXRlZD8KLSAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucwotICAvLyBmb3IgdGhlIG1ldGhvZCwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LAotICAvLyB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgbWV0aG9kcy4KLSAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQ9ZmFsc2VdOwotCi0gIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgotICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotCi0gIC8vIENsaWVudHMgY2FuIGRlZmluZSBjdXN0b20gb3B0aW9ucyBpbiBleHRlbnNpb25zIG9mIHRoaXMgbWVzc2FnZS4gU2VlIGFib3ZlLgotICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotfQotCi0KLS8vIEEgbWVzc2FnZSByZXByZXNlbnRpbmcgYSBvcHRpb24gdGhlIHBhcnNlciBkb2VzIG5vdCByZWNvZ25pemUuIFRoaXMgb25seQotLy8gYXBwZWFycyBpbiBvcHRpb25zIHByb3RvcyBjcmVhdGVkIGJ5IHRoZSBjb21waWxlcjo6UGFyc2VyIGNsYXNzLgotLy8gRGVzY3JpcHRvclBvb2wgcmVzb2x2ZXMgdGhlc2Ugd2hlbiBidWlsZGluZyBEZXNjcmlwdG9yIG9iamVjdHMuIFRoZXJlZm9yZSwKLS8vIG9wdGlvbnMgcHJvdG9zIGluIGRlc2NyaXB0b3Igb2JqZWN0cyAoZS5nLiByZXR1cm5lZCBieSBEZXNjcmlwdG9yOjpvcHRpb25zKCksCi0vLyBvciBwcm9kdWNlZCBieSBEZXNjcmlwdG9yOjpDb3B5VG8oKSkgd2lsbCBuZXZlciBoYXZlIFVuaW50ZXJwcmV0ZWRPcHRpb25zCi0vLyBpbiB0aGVtLgotbWVzc2FnZSBVbmludGVycHJldGVkT3B0aW9uIHsKLSAgLy8gVGhlIG5hbWUgb2YgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uLiAgRWFjaCBzdHJpbmcgcmVwcmVzZW50cyBhIHNlZ21lbnQgaW4KLSAgLy8gYSBkb3Qtc2VwYXJhdGVkIG5hbWUuICBpc19leHRlbnNpb24gaXMgdHJ1ZSBpZmYgYSBzZWdtZW50IHJlcHJlc2VudHMgYW4KLSAgLy8gZXh0ZW5zaW9uIChkZW5vdGVkIHdpdGggcGFyZW50aGVzZXMgaW4gb3B0aW9ucyBzcGVjcyBpbiAucHJvdG8gZmlsZXMpLgotICAvLyBFLmcuLHsgWyJmb28iLCBmYWxzZV0sIFsiYmFyLmJheiIsIHRydWVdLCBbInF1eCIsIGZhbHNlXSB9IHJlcHJlc2VudHMKLSAgLy8gImZvby4oYmFyLmJheikucXV4Ii4KLSAgbWVzc2FnZSBOYW1lUGFydCB7Ci0gICAgcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7Ci0gICAgcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwotICB9Ci0gIHJlcGVhdGVkIE5hbWVQYXJ0IG5hbWUgPSAyOwotCi0gIC8vIFRoZSB2YWx1ZSBvZiB0aGUgdW5pbnRlcnByZXRlZCBvcHRpb24sIGluIHdoYXRldmVyIHR5cGUgdGhlIHRva2VuaXplcgotICAvLyBpZGVudGlmaWVkIGl0IGFzIGR1cmluZyBwYXJzaW5nLiBFeGFjdGx5IG9uZSBvZiB0aGVzZSBzaG91bGQgYmUgc2V0LgotICBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7Ci0gIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OwotICBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OwotICBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKLSAgb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKLSAgb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIE9wdGlvbmFsIHNvdXJjZSBjb2RlIGluZm8KLQotLy8gRW5jYXBzdWxhdGVzIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgZmlsZSBmcm9tIHdoaWNoIGEKLS8vIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2FzIGdlbmVyYXRlZC4KLW1lc3NhZ2UgU291cmNlQ29kZUluZm8gewotICAvLyBBIExvY2F0aW9uIGlkZW50aWZpZXMgYSBwaWVjZSBvZiBzb3VyY2UgY29kZSBpbiBhIC5wcm90byBmaWxlIHdoaWNoCi0gIC8vIGNvcnJlc3BvbmRzIHRvIGEgcGFydGljdWxhciBkZWZpbml0aW9uLiAgVGhpcyBpbmZvcm1hdGlvbiBpcyBpbnRlbmRlZAotICAvLyB0byBiZSB1c2VmdWwgdG8gSURFcywgY29kZSBpbmRleGVycywgZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3JzLCBhbmQgc2ltaWxhcgotICAvLyB0b29scy4KLSAgLy8KLSAgLy8gRm9yIGV4YW1wbGUsIHNheSB3ZSBoYXZlIGEgZmlsZSBsaWtlOgotICAvLyAgIG1lc3NhZ2UgRm9vIHsKLSAgLy8gICAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxOwotICAvLyAgIH0KLSAgLy8gTGV0J3MgbG9vayBhdCBqdXN0IHRoZSBmaWVsZCBkZWZpbml0aW9uOgotICAvLyAgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxOwotICAvLyAgIF4gICAgICAgXl4gICAgIF5eICBeICBeXl4KLSAgLy8gICBhICAgICAgIGJjICAgICBkZSAgZiAgZ2hpCi0gIC8vIFdlIGhhdmUgdGhlIGZvbGxvd2luZyBsb2NhdGlvbnM6Ci0gIC8vICAgc3BhbiAgIHBhdGggICAgICAgICAgICAgICByZXByZXNlbnRzCi0gIC8vICAgW2EsaSkgIFsgNCwgMCwgMiwgMCBdICAgICBUaGUgd2hvbGUgZmllbGQgZGVmaW5pdGlvbi4KLSAgLy8gICBbYSxiKSAgWyA0LCAwLCAyLCAwLCA0IF0gIFRoZSBsYWJlbCAob3B0aW9uYWwpLgotICAvLyAgIFtjLGQpICBbIDQsIDAsIDIsIDAsIDUgXSAgVGhlIHR5cGUgKHN0cmluZykuCi0gIC8vICAgW2UsZikgIFsgNCwgMCwgMiwgMCwgMSBdICBUaGUgbmFtZSAoZm9vKS4KLSAgLy8gICBbZyxoKSAgWyA0LCAwLCAyLCAwLCAzIF0gIFRoZSBudW1iZXIgKDEpLgotICAvLwotICAvLyBOb3RlczoKLSAgLy8gLSBBIGxvY2F0aW9uIG1heSByZWZlciB0byBhIHJlcGVhdGVkIGZpZWxkIGl0c2VsZiAoaS5lLiBub3QgdG8gYW55Ci0gIC8vICAgcGFydGljdWxhciBpbmRleCB3aXRoaW4gaXQpLiAgVGhpcyBpcyB1c2VkIHdoZW5ldmVyIGEgc2V0IG9mIGVsZW1lbnRzIGFyZQotICAvLyAgIGxvZ2ljYWxseSBlbmNsb3NlZCBpbiBhIHNpbmdsZSBjb2RlIHNlZ21lbnQuICBGb3IgZXhhbXBsZSwgYW4gZW50aXJlCi0gIC8vICAgZXh0ZW5kIGJsb2NrIChwb3NzaWJseSBjb250YWluaW5nIG11bHRpcGxlIGV4dGVuc2lvbiBkZWZpbml0aW9ucykgd2lsbAotICAvLyAgIGhhdmUgYW4gb3V0ZXIgbG9jYXRpb24gd2hvc2UgcGF0aCByZWZlcnMgdG8gdGhlICJleHRlbnNpb25zIiByZXBlYXRlZAotICAvLyAgIGZpZWxkIHdpdGhvdXQgYW4gaW5kZXguCi0gIC8vIC0gTXVsdGlwbGUgbG9jYXRpb25zIG1heSBoYXZlIHRoZSBzYW1lIHBhdGguICBUaGlzIGhhcHBlbnMgd2hlbiBhIHNpbmdsZQotICAvLyAgIGxvZ2ljYWwgZGVjbGFyYXRpb24gaXMgc3ByZWFkIG91dCBhY3Jvc3MgbXVsdGlwbGUgcGxhY2VzLiAgVGhlIG1vc3QKLSAgLy8gICBvYnZpb3VzIGV4YW1wbGUgaXMgdGhlICJleHRlbmQiIGJsb2NrIGFnYWluIC0tIHRoZXJlIG1heSBiZSBtdWx0aXBsZQotICAvLyAgIGV4dGVuZCBibG9ja3MgaW4gdGhlIHNhbWUgc2NvcGUsIGVhY2ggb2Ygd2hpY2ggd2lsbCBoYXZlIHRoZSBzYW1lIHBhdGguCi0gIC8vIC0gQSBsb2NhdGlvbidzIHNwYW4gaXMgbm90IGFsd2F5cyBhIHN1YnNldCBvZiBpdHMgcGFyZW50J3Mgc3Bhbi4gIEZvcgotICAvLyAgIGV4YW1wbGUsIHRoZSAiZXh0ZW5kZWUiIG9mIGFuIGV4dGVuc2lvbiBkZWNsYXJhdGlvbiBhcHBlYXJzIGF0IHRoZQotICAvLyAgIGJlZ2lubmluZyBvZiB0aGUgImV4dGVuZCIgYmxvY2sgYW5kIGlzIHNoYXJlZCBieSBhbGwgZXh0ZW5zaW9ucyB3aXRoaW4KLSAgLy8gICB0aGUgYmxvY2suCi0gIC8vIC0gSnVzdCBiZWNhdXNlIGEgbG9jYXRpb24ncyBzcGFuIGlzIGEgc3Vic2V0IG9mIHNvbWUgb3RoZXIgbG9jYXRpb24ncyBzcGFuCi0gIC8vICAgZG9lcyBub3QgbWVhbiB0aGF0IGl0IGlzIGEgZGVzY2VuZGVudC4gIEZvciBleGFtcGxlLCBhICJncm91cCIgZGVmaW5lcwotICAvLyAgIGJvdGggYSB0eXBlIGFuZCBhIGZpZWxkIGluIGEgc2luZ2xlIGRlY2xhcmF0aW9uLiAgVGh1cywgdGhlIGxvY2F0aW9ucwotICAvLyAgIGNvcnJlc3BvbmRpbmcgdG8gdGhlIHR5cGUgYW5kIGZpZWxkIGFuZCB0aGVpciBjb21wb25lbnRzIHdpbGwgb3ZlcmxhcC4KLSAgLy8gLSBDb2RlIHdoaWNoIHRyaWVzIHRvIGludGVycHJldCBsb2NhdGlvbnMgc2hvdWxkIHByb2JhYmx5IGJlIGRlc2lnbmVkIHRvCi0gIC8vICAgaWdub3JlIHRob3NlIHRoYXQgaXQgZG9lc24ndCB1bmRlcnN0YW5kLCBhcyBtb3JlIHR5cGVzIG9mIGxvY2F0aW9ucyBjb3VsZAotICAvLyAgIGJlIHJlY29yZGVkIGluIHRoZSBmdXR1cmUuCi0gIHJlcGVhdGVkIExvY2F0aW9uIGxvY2F0aW9uID0gMTsKLSAgbWVzc2FnZSBMb2NhdGlvbiB7Ci0gICAgLy8gSWRlbnRpZmllcyB3aGljaCBwYXJ0IG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHdhcyBkZWZpbmVkIGF0IHRoaXMKLSAgICAvLyBsb2NhdGlvbi4KLSAgICAvLwotICAgIC8vIEVhY2ggZWxlbWVudCBpcyBhIGZpZWxkIG51bWJlciBvciBhbiBpbmRleC4gIFRoZXkgZm9ybSBhIHBhdGggZnJvbQotICAgIC8vIHRoZSByb290IEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIHBsYWNlIHdoZXJlIHRoZSBkZWZpbml0aW9uLiAgRm9yCi0gICAgLy8gZXhhbXBsZSwgdGhpcyBwYXRoOgotICAgIC8vICAgWyA0LCAzLCAyLCA3LCAxIF0KLSAgICAvLyByZWZlcnMgdG86Ci0gICAgLy8gICBmaWxlLm1lc3NhZ2VfdHlwZSgzKSAgLy8gNCwgMwotICAgIC8vICAgICAgIC5maWVsZCg3KSAgICAgICAgIC8vIDIsIDcKLSAgICAvLyAgICAgICAubmFtZSgpICAgICAgICAgICAvLyAxCi0gICAgLy8gVGhpcyBpcyBiZWNhdXNlIEZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlIGhhcyBmaWVsZCBudW1iZXIgNDoKLSAgICAvLyAgIHJlcGVhdGVkIERlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OwotICAgIC8vIGFuZCBEZXNjcmlwdG9yUHJvdG8uZmllbGQgaGFzIGZpZWxkIG51bWJlciAyOgotICAgIC8vICAgcmVwZWF0ZWQgRmllbGREZXNjcmlwdG9yUHJvdG8gZmllbGQgPSAyOwotICAgIC8vIGFuZCBGaWVsZERlc2NyaXB0b3JQcm90by5uYW1lIGhhcyBmaWVsZCBudW1iZXIgMToKLSAgICAvLyAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgICAvLwotICAgIC8vIFRodXMsIHRoZSBhYm92ZSBwYXRoIGdpdmVzIHRoZSBsb2NhdGlvbiBvZiBhIGZpZWxkIG5hbWUuICBJZiB3ZSByZW1vdmVkCi0gICAgLy8gdGhlIGxhc3QgZWxlbWVudDoKLSAgICAvLyAgIFsgNCwgMywgMiwgNyBdCi0gICAgLy8gdGhpcyBwYXRoIHJlZmVycyB0byB0aGUgd2hvbGUgZmllbGQgZGVjbGFyYXRpb24gKGZyb20gdGhlIGJlZ2lubmluZwotICAgIC8vIG9mIHRoZSBsYWJlbCB0byB0aGUgdGVybWluYXRpbmcgc2VtaWNvbG9uKS4KLSAgICByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkPXRydWVdOwotCi0gICAgLy8gQWx3YXlzIGhhcyBleGFjdGx5IHRocmVlIG9yIGZvdXIgZWxlbWVudHM6IHN0YXJ0IGxpbmUsIHN0YXJ0IGNvbHVtbiwKLSAgICAvLyBlbmQgbGluZSAob3B0aW9uYWwsIG90aGVyd2lzZSBhc3N1bWVkIHNhbWUgYXMgc3RhcnQgbGluZSksIGVuZCBjb2x1bW4uCi0gICAgLy8gVGhlc2UgYXJlIHBhY2tlZCBpbnRvIGEgc2luZ2xlIGZpZWxkIGZvciBlZmZpY2llbmN5LiAgTm90ZSB0aGF0IGxpbmUKLSAgICAvLyBhbmQgY29sdW1uIG51bWJlcnMgYXJlIHplcm8tYmFzZWQgLS0gdHlwaWNhbGx5IHlvdSB3aWxsIHdhbnQgdG8gYWRkCi0gICAgLy8gMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KLSAgICByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkPXRydWVdOwotCi0gICAgLy8gSWYgdGhpcyBTb3VyY2VDb2RlSW5mbyByZXByZXNlbnRzIGEgY29tcGxldGUgZGVjbGFyYXRpb24sIHRoZXNlIGFyZSBhbnkKLSAgICAvLyBjb21tZW50cyBhcHBlYXJpbmcgYmVmb3JlIGFuZCBhZnRlciB0aGUgZGVjbGFyYXRpb24gd2hpY2ggYXBwZWFyIHRvIGJlCi0gICAgLy8gYXR0YWNoZWQgdG8gdGhlIGRlY2xhcmF0aW9uLgotICAgIC8vCi0gICAgLy8gQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKLSAgICAvLyB0b2tlbnMgYXBwZWFyaW5nIG9uIHRob3NlIGxpbmVzLCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY29tbWVudC4KLSAgICAvLwotICAgIC8vIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgd2lsbCBrZWVwIHBhcmFncmFwaHMgb2YgY29tbWVudHMgdGhhdCBhcHBlYXIKLSAgICAvLyBiZWZvcmUgKGJ1dCBub3QgY29ubmVjdGVkIHRvKSB0aGUgY3VycmVudCBlbGVtZW50LiBFYWNoIHBhcmFncmFwaCwKLSAgICAvLyBzZXBhcmF0ZWQgYnkgZW1wdHkgbGluZXMsIHdpbGwgYmUgb25lIGNvbW1lbnQgZWxlbWVudCBpbiB0aGUgcmVwZWF0ZWQKLSAgICAvLyBmaWVsZC4KLSAgICAvLwotICAgIC8vIE9ubHkgdGhlIGNvbW1lbnQgY29udGVudCBpcyBwcm92aWRlZDsgY29tbWVudCBtYXJrZXJzIChlLmcuIC8vKSBhcmUKLSAgICAvLyBzdHJpcHBlZCBvdXQuICBGb3IgYmxvY2sgY29tbWVudHMsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgYW4gYXN0ZXJpc2sKLSAgICAvLyB3aWxsIGJlIHN0cmlwcGVkIGZyb20gdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb3RoZXIgdGhhbiB0aGUgZmlyc3QuCi0gICAgLy8gTmV3bGluZXMgYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0gICAgLy8KLSAgICAvLyBFeGFtcGxlczoKLSAgICAvLwotICAgIC8vICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gZm9vLgotICAgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCi0gICAgLy8gICBvcHRpb25hbCBpbnQzMiBiYXIgPSAyOwotICAgIC8vCi0gICAgLy8gICBvcHRpb25hbCBzdHJpbmcgYmF6ID0gMzsKLSAgICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gYmF6LgotICAgIC8vICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIGJhei4KLSAgICAvLwotICAgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBxdXguCi0gICAgLy8gICAvLwotICAgIC8vICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIHF1eC4KLSAgICAvLyAgIG9wdGlvbmFsIGRvdWJsZSBxdXggPSA0OwotICAgIC8vCi0gICAgLy8gICAvLyBEZXRhY2hlZCBjb21tZW50IGZvciBjb3JnZS4gVGhpcyBpcyBub3QgbGVhZGluZyBvciB0cmFpbGluZyBjb21tZW50cwotICAgIC8vICAgLy8gdG8gcXV4IG9yIGNvcmdlIGJlY2F1c2UgdGhlcmUgYXJlIGJsYW5rIGxpbmVzIHNlcGFyYXRpbmcgaXQgZnJvbQotICAgIC8vICAgLy8gYm90aC4KLSAgICAvLwotICAgIC8vICAgLy8gRGV0YWNoZWQgY29tbWVudCBmb3IgY29yZ2UgcGFyYWdyYXBoIDIuCi0gICAgLy8KLSAgICAvLyAgIG9wdGlvbmFsIHN0cmluZyBjb3JnZSA9IDU7Ci0gICAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkCi0gICAgLy8gICAgKiB0byBjb3JnZS4gIExlYWRpbmcgYXN0ZXJpc2tzCi0gICAgLy8gICAgKiB3aWxsIGJlIHJlbW92ZWQuICovCi0gICAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkIHRvCi0gICAgLy8gICAgKiBncmF1bHQuICovCi0gICAgLy8gICBvcHRpb25hbCBpbnQzMiBncmF1bHQgPSA2OwotICAgIC8vCi0gICAgLy8gICAvLyBpZ25vcmVkIGRldGFjaGVkIGNvbW1lbnRzLgotICAgIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKLSAgICBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OwotICAgIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKLSAgfQotfQotCi0vLyBEZXNjcmliZXMgdGhlIHJlbGF0aW9uc2hpcCBiZXR3ZWVuIGdlbmVyYXRlZCBjb2RlIGFuZCBpdHMgb3JpZ2luYWwgc291cmNlCi0vLyBmaWxlLiBBIEdlbmVyYXRlZENvZGVJbmZvIG1lc3NhZ2UgaXMgYXNzb2NpYXRlZCB3aXRoIG9ubHkgb25lIGdlbmVyYXRlZAotLy8gc291cmNlIGZpbGUsIGJ1dCBtYXkgY29udGFpbiByZWZlcmVuY2VzIHRvIGRpZmZlcmVudCBzb3VyY2UgLnByb3RvIGZpbGVzLgotbWVzc2FnZSBHZW5lcmF0ZWRDb2RlSW5mbyB7Ci0gIC8vIEFuIEFubm90YXRpb24gY29ubmVjdHMgc29tZSBzcGFuIG9mIHRleHQgaW4gZ2VuZXJhdGVkIGNvZGUgdG8gYW4gZWxlbWVudAotICAvLyBvZiBpdHMgZ2VuZXJhdGluZyAucHJvdG8gZmlsZS4KLSAgcmVwZWF0ZWQgQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKLSAgbWVzc2FnZSBBbm5vdGF0aW9uIHsKLSAgICAvLyBJZGVudGlmaWVzIHRoZSBlbGVtZW50IGluIHRoZSBvcmlnaW5hbCBzb3VyY2UgLnByb3RvIGZpbGUuIFRoaXMgZmllbGQKLSAgICAvLyBpcyBmb3JtYXR0ZWQgdGhlIHNhbWUgYXMgU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aC4KLSAgICByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkPXRydWVdOwotCi0gICAgLy8gSWRlbnRpZmllcyB0aGUgZmlsZXN5c3RlbSBwYXRoIHRvIHRoZSBvcmlnaW5hbCBzb3VyY2UgLnByb3RvLgotICAgIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7Ci0KLSAgICAvLyBJZGVudGlmaWVzIHRoZSBzdGFydGluZyBvZmZzZXQgaW4gYnl0ZXMgaW4gdGhlIGdlbmVyYXRlZCBjb2RlCi0gICAgLy8gdGhhdCByZWxhdGVzIHRvIHRoZSBpZGVudGlmaWVkIG9iamVjdC4KLSAgICBvcHRpb25hbCBpbnQzMiBiZWdpbiA9IDM7Ci0KLSAgICAvLyBJZGVudGlmaWVzIHRoZSBlbmRpbmcgb2Zmc2V0IGluIGJ5dGVzIGluIHRoZSBnZW5lcmF0ZWQgY29kZSB0aGF0Ci0gICAgLy8gcmVsYXRlcyB0byB0aGUgaWRlbnRpZmllZCBvZmZzZXQuIFRoZSBlbmQgb2Zmc2V0IHNob3VsZCBiZSBvbmUgcGFzdAotICAgIC8vIHRoZSBsYXN0IHJlbGV2YW50IGJ5dGUgKHNvIHRoZSBsZW5ndGggb2YgdGhlIHRleHQgPSBlbmQgLSBiZWdpbikuCi0gICAgb3B0aW9uYWwgaW50MzIgZW5kID0gNDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyMTE3YzAyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgotCi0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLURlc2NyaXB0b3JEYXRhYmFzZTo6fkRlc2NyaXB0b3JEYXRhYmFzZSgpIHt9Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgotYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkFkZEZpbGUoCi0gICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZSwKLSAgICBWYWx1ZSB2YWx1ZSkgewotICBpZiAoIUluc2VydElmTm90UHJlc2VudCgmYnlfbmFtZV8sIGZpbGUubmFtZSgpLCB2YWx1ZSkpIHsKLSAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRmlsZSBhbHJlYWR5IGV4aXN0cyBpbiBkYXRhYmFzZTogIiA8PCBmaWxlLm5hbWUoKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBXZSBtdXN0IGJlIGNhcmVmdWwgaGVyZSAtLSBjYWxsaW5nIGZpbGUucGFja2FnZSgpIGlmIGZpbGUuaGFzX3BhY2thZ2UoKSBpcwotICAvLyBmYWxzZSBjb3VsZCBhY2Nlc3MgYW4gdW5pbml0aWFsaXplZCBzdGF0aWMtc3RvcmFnZSB2YXJpYWJsZSBpZiB3ZSBhcmUgYmVpbmcKLSAgLy8gcnVuIGF0IHN0YXJ0dXAgdGltZS4KLSAgc3RyaW5nIHBhdGggPSBmaWxlLmhhc19wYWNrYWdlKCkgPyBmaWxlLnBhY2thZ2UoKSA6IHN0cmluZygpOwotICBpZiAoIXBhdGguZW1wdHkoKSkgcGF0aCArPSAnLic7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgewotICAgIGlmICghQWRkU3ltYm9sKHBhdGggKyBmaWxlLm1lc3NhZ2VfdHlwZShpKS5uYW1lKCksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgIGlmICghQWRkTmVzdGVkRXh0ZW5zaW9ucyhmaWxlLm1lc3NhZ2VfdHlwZShpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmVudW1fdHlwZV9zaXplKCk7IGkrKykgewotICAgIGlmICghQWRkU3ltYm9sKHBhdGggKyBmaWxlLmVudW1fdHlwZShpKS5uYW1lKCksIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIUFkZFN5bWJvbChwYXRoICsgZmlsZS5leHRlbnNpb24oaSkubmFtZSgpLCB2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICBpZiAoIUFkZEV4dGVuc2lvbihmaWxlLmV4dGVuc2lvbihpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLnNlcnZpY2Vfc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIUFkZFN5bWJvbChwYXRoICsgZmlsZS5zZXJ2aWNlKGkpLm5hbWUoKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgotYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkFkZFN5bWJvbCgKLSAgICBjb25zdCBzdHJpbmcmIG5hbWUsIFZhbHVlIHZhbHVlKSB7Ci0gIC8vIFdlIG5lZWQgdG8gbWFrZSBzdXJlIG5vdCB0byB2aW9sYXRlIG91ciBtYXAgaW52YXJpYW50LgotCi0gIC8vIElmIHRoZSBzeW1ib2wgbmFtZSBpcyBpbnZhbGlkIGl0IGNvdWxkIGJyZWFrIG91ciBsb29rdXAgYWxnb3JpdGhtICh3aGljaAotICAvLyByZWxpZXMgb24gdGhlIGZhY3QgdGhhdCAnLicgc29ydHMgYmVmb3JlIGFsbCBvdGhlciBjaGFyYWN0ZXJzIHRoYXQgYXJlCi0gIC8vIHZhbGlkIGluIHN5bWJvbCBuYW1lcykuCi0gIGlmICghVmFsaWRhdGVTeW1ib2xOYW1lKG5hbWUpKSB7Ci0gICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkludmFsaWQgc3ltYm9sIG5hbWU6ICIgPDwgbmFtZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBUcnkgdG8gbG9vayB1cCB0aGUgc3ltYm9sIHRvIG1ha2Ugc3VyZSBhIHN1cGVyLXN5bWJvbCBkb2Vzbid0IGFscmVhZHkKLSAgLy8gZXhpc3QuCi0gIHR5cGVuYW1lIG1hcDxzdHJpbmcsIFZhbHVlPjo6aXRlcmF0b3IgaXRlciA9IEZpbmRMYXN0TGVzc09yRXF1YWwobmFtZSk7Ci0KLSAgaWYgKGl0ZXIgPT0gYnlfc3ltYm9sXy5lbmQoKSkgewotICAgIC8vIEFwcGFyZW50bHkgdGhlIG1hcCBpcyBjdXJyZW50bHkgZW1wdHkuICBKdXN0IGluc2VydCBhbmQgYmUgZG9uZSB3aXRoIGl0LgotICAgIGJ5X3N5bWJvbF8uaW5zZXJ0KHR5cGVuYW1lIG1hcDxzdHJpbmcsIFZhbHVlPjo6dmFsdWVfdHlwZShuYW1lLCB2YWx1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgaWYgKElzU3ViU3ltYm9sKGl0ZXItPmZpcnN0LCBuYW1lKSkgewotICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJTeW1ib2wgbmFtZSBcIiIgPDwgbmFtZSA8PCAiXCIgY29uZmxpY3RzIHdpdGggdGhlIGV4aXN0aW5nICIKLSAgICAgICAgICAgICAgICAgICJzeW1ib2wgXCIiIDw8IGl0ZXItPmZpcnN0IDw8ICJcIi4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIE9LLCB0aGF0IHdvcmtlZC4gIE5vdyB3ZSBoYXZlIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIHN5bWJvbCBpbiB0aGUgbWFwIGlzCi0gIC8vIGEgc3ViLXN5bWJvbCBvZiB0aGUgb25lIHdlIGFyZSBpbnNlcnRpbmcuICBUaGUgb25seSBzeW1ib2wgd2hpY2ggY291bGQKLSAgLy8gYmUgc28gaXMgdGhlIGZpcnN0IHN5bWJvbCB0aGF0IGlzIGdyZWF0ZXIgdGhhbiB0aGUgbmV3IHN5bWJvbC4gIFNpbmNlCi0gIC8vIHxpdGVyfCBwb2ludHMgYXQgdGhlIGxhc3Qgc3ltYm9sIHRoYXQgaXMgbGVzcyB0aGFuIG9yIGVxdWFsLCB3ZSBqdXN0IGhhdmUKLSAgLy8gdG8gaW5jcmVtZW50IGl0LgotICArK2l0ZXI7Ci0KLSAgaWYgKGl0ZXIgIT0gYnlfc3ltYm9sXy5lbmQoKSAmJiBJc1N1YlN5bWJvbChuYW1lLCBpdGVyLT5maXJzdCkpIHsKLSAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiU3ltYm9sIG5hbWUgXCIiIDw8IG5hbWUgPDwgIlwiIGNvbmZsaWN0cyB3aXRoIHRoZSBleGlzdGluZyAiCi0gICAgICAgICAgICAgICAgICAic3ltYm9sIFwiIiA8PCBpdGVyLT5maXJzdCA8PCAiXCIuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBPSywgbm8gY29uZmxpY3RzLgotCi0gIC8vIEluc2VydCB0aGUgbmV3IHN5bWJvbCB1c2luZyB0aGUgaXRlcmF0b3IgYXMgYSBoaW50LCB0aGUgbmV3IGVudHJ5IHdpbGwKLSAgLy8gYXBwZWFyIGltbWVkaWF0ZWx5IGJlZm9yZSB0aGUgb25lIHRoZSBpdGVyYXRvciBpcyBwb2ludGluZyBhdC4KLSAgYnlfc3ltYm9sXy5pbnNlcnQoaXRlciwgdHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+Ojp2YWx1ZV90eXBlKG5hbWUsIHZhbHVlKSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KLWJvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpBZGROZXN0ZWRFeHRlbnNpb25zKAotICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgbWVzc2FnZV90eXBlLAotICAgIFZhbHVlIHZhbHVlKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV90eXBlLm5lc3RlZF90eXBlX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCFBZGROZXN0ZWRFeHRlbnNpb25zKG1lc3NhZ2VfdHlwZS5uZXN0ZWRfdHlwZShpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGUuZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCFBZGRFeHRlbnNpb24obWVzc2FnZV90eXBlLmV4dGVuc2lvbihpKSwgdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KLWJvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpBZGRFeHRlbnNpb24oCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkLAotICAgIFZhbHVlIHZhbHVlKSB7Ci0gIGlmICghZmllbGQuZXh0ZW5kZWUoKS5lbXB0eSgpICYmIGZpZWxkLmV4dGVuZGVlKClbMF0gPT0gJy4nKSB7Ci0gICAgLy8gVGhlIGV4dGVuc2lvbiBpcyBmdWxseS1xdWFsaWZpZWQuICBXZSBjYW4gdXNlIGl0IGFzIGEgbG9va3VwIGtleSBpbgotICAgIC8vIHRoZSBieV9zeW1ib2xfIHRhYmxlLgotICAgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KAotICAgICAgICAgICAgJmJ5X2V4dGVuc2lvbl8sCi0gICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihmaWVsZC5leHRlbmRlZSgpLnN1YnN0cigxKSwgZmllbGQubnVtYmVyKCkpLAotICAgICAgICAgICAgdmFsdWUpKSB7Ci0gICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXh0ZW5zaW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiBhbHJlYWR5IGluIGRhdGFiYXNlOiAiCi0gICAgICAgICAgICAgICAgICAgICJleHRlbmQgIiA8PCBmaWVsZC5leHRlbmRlZSgpIDw8ICIgeyAiCi0gICAgICAgICAgICAgICAgIDw8IGZpZWxkLm5hbWUoKSA8PCAiID0gIiA8PCBmaWVsZC5udW1iZXIoKSA8PCAiIH0iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICAvLyBOb3QgZnVsbHktcXVhbGlmaWVkLiAgV2UgY2FuJ3QgcmVhbGx5IGRvIGFueXRoaW5nIGhlcmUsIHVuZm9ydHVuYXRlbHkuCi0gICAgLy8gV2UgZG9uJ3QgY29uc2lkZXIgdGhpcyBhbiBlcnJvciwgdGhvdWdoLCBiZWNhdXNlIHRoZSBkZXNjcmlwdG9yIGlzCi0gICAgLy8gdmFsaWQuCi0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KLVZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEZpbGUoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICByZXR1cm4gRmluZFdpdGhEZWZhdWx0KGJ5X25hbWVfLCBmaWxlbmFtZSwgVmFsdWUoKSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KLVZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZFN5bWJvbCgKLSAgICBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgdHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+OjppdGVyYXRvciBpdGVyID0gRmluZExhc3RMZXNzT3JFcXVhbChuYW1lKTsKLQotICByZXR1cm4gKGl0ZXIgIT0gYnlfc3ltYm9sXy5lbmQoKSAmJiBJc1N1YlN5bWJvbChpdGVyLT5maXJzdCwgbmFtZSkpID8KLSAgICAgICAgIGl0ZXItPnNlY29uZCA6IFZhbHVlKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KLVZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEV4dGVuc2lvbigKLSAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKLSAgICBpbnQgZmllbGRfbnVtYmVyKSB7Ci0gIHJldHVybiBGaW5kV2l0aERlZmF1bHQoCi0gICAgICBieV9leHRlbnNpb25fLCBzdGQ6Om1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIGZpZWxkX251bWJlciksIFZhbHVlKCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Ci1ib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCi0gICAgY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCi0gICAgdmVjdG9yPGludD4qIG91dHB1dCkgewotICB0eXBlbmFtZSBtYXA8cGFpcjxzdHJpbmcsIGludD4sIFZhbHVlPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgYnlfZXh0ZW5zaW9uXy5sb3dlcl9ib3VuZChzdGQ6Om1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIDApKTsKLSAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0KLSAgZm9yICg7IGl0ICE9IGJ5X2V4dGVuc2lvbl8uZW5kKCkgJiYgaXQtPmZpcnN0LmZpcnN0ID09IGNvbnRhaW5pbmdfdHlwZTsKLSAgICAgICArK2l0KSB7Ci0gICAgb3V0cHV0LT5wdXNoX2JhY2soaXQtPmZpcnN0LnNlY29uZCk7Ci0gICAgc3VjY2VzcyA9IHRydWU7Ci0gIH0KLQotICByZXR1cm4gc3VjY2VzczsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgotdHlwZW5hbWUgbWFwPHN0cmluZywgVmFsdWU+OjppdGVyYXRvcgotU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpGaW5kTGFzdExlc3NPckVxdWFsKAotICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICAvLyBGaW5kIHRoZSBsYXN0IGtleSBpbiB0aGUgbWFwIHdoaWNoIHNvcnRzIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUKLSAgLy8gc3ltYm9sIG5hbWUuICBTaW5jZSB1cHBlcl9ib3VuZCgpIHJldHVybnMgdGhlICpmaXJzdCoga2V5IHRoYXQgc29ydHMKLSAgLy8gKmdyZWF0ZXIqIHRoYW4gdGhlIGlucHV0LCB3ZSB3YW50IHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGJlZm9yZSB0aGF0LgotICB0eXBlbmFtZSBtYXA8c3RyaW5nLCBWYWx1ZT46Oml0ZXJhdG9yIGl0ZXIgPSBieV9zeW1ib2xfLnVwcGVyX2JvdW5kKG5hbWUpOwotICBpZiAoaXRlciAhPSBieV9zeW1ib2xfLmJlZ2luKCkpIC0taXRlcjsKLSAgcmV0dXJuIGl0ZXI7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KLWJvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8VmFsdWU+OjpJc1N1YlN5bWJvbCgKLSAgICBjb25zdCBzdHJpbmcmIHN1Yl9zeW1ib2wsIGNvbnN0IHN0cmluZyYgc3VwZXJfc3ltYm9sKSB7Ci0gIHJldHVybiBzdWJfc3ltYm9sID09IHN1cGVyX3N5bWJvbCB8fAotICAgICAgICAgKEhhc1ByZWZpeFN0cmluZyhzdXBlcl9zeW1ib2wsIHN1Yl9zeW1ib2wpICYmCi0gICAgICAgICAgICAgc3VwZXJfc3ltYm9sW3N1Yl9zeW1ib2wuc2l6ZSgpXSA9PSAnLicpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVmFsdWU+Ci1ib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6VmFsaWRhdGVTeW1ib2xOYW1lKAotICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICBmb3IgKGludCBpID0gMDsgaSA8IG5hbWUuc2l6ZSgpOyBpKyspIHsKLSAgICAvLyBJIGRvbid0IHRydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuICA6KAotICAgIGlmIChuYW1lW2ldICE9ICcuJyAmJiBuYW1lW2ldICE9ICdfJyAmJgotICAgICAgICAobmFtZVtpXSA8ICcwJyB8fCBuYW1lW2ldID4gJzknKSAmJgotICAgICAgICAobmFtZVtpXSA8ICdBJyB8fCBuYW1lW2ldID4gJ1onKSAmJgotICAgICAgICAobmFtZVtpXSA8ICdhJyB8fCBuYW1lW2ldID4gJ3onKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OlNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSgpIHt9Ci1TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6On5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoKSB7Ci0gIFNUTERlbGV0ZUVsZW1lbnRzKCZmaWxlc190b19kZWxldGVfKTsKLX0KLQotYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkFkZChjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG5ld19maWxlID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG87Ci0gIG5ld19maWxlLT5Db3B5RnJvbShmaWxlKTsKLSAgcmV0dXJuIEFkZEFuZE93bihuZXdfZmlsZSk7Ci19Ci0KLWJvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpBZGRBbmRPd24oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSkgewotICBmaWxlc190b19kZWxldGVfLnB1c2hfYmFjayhmaWxlKTsKLSAgcmV0dXJuIGluZGV4Xy5BZGRGaWxlKCpmaWxlLCBmaWxlKTsKLX0KLQotYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKAotICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIHJldHVybiBNYXliZUNvcHkoaW5kZXhfLkZpbmRGaWxlKGZpbGVuYW1lKSwgb3V0cHV0KTsKLX0KLQotYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKLSAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICByZXR1cm4gTWF5YmVDb3B5KGluZGV4Xy5GaW5kU3ltYm9sKHN5bWJvbF9uYW1lKSwgb3V0cHV0KTsKLX0KLQotYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKLSAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKLSAgICBpbnQgZmllbGRfbnVtYmVyLAotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICByZXR1cm4gTWF5YmVDb3B5KGluZGV4Xy5GaW5kRXh0ZW5zaW9uKGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyKSwgb3V0cHV0KTsKLX0KLQotYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAotICAgIGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKLSAgICB2ZWN0b3I8aW50Piogb3V0cHV0KSB7Ci0gIHJldHVybiBpbmRleF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoZXh0ZW5kZWVfdHlwZSwgb3V0cHV0KTsKLX0KLQotCi1ib29sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6TWF5YmVDb3B5KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gIG91dHB1dC0+Q29weUZyb20oKmZpbGUpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1FbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCkge30KLUVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6On5FbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlKCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVzX3RvX2RlbGV0ZV8uc2l6ZSgpOyBpKyspIHsKLSAgICBvcGVyYXRvciBkZWxldGUoZmlsZXNfdG9fZGVsZXRlX1tpXSk7Ci0gIH0KLX0KLQotYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpBZGQoCi0gICAgY29uc3Qgdm9pZCogZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIGludCBzaXplKSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgaWYgKGZpbGUuUGFyc2VGcm9tQXJyYXkoZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIHNpemUpKSB7Ci0gICAgcmV0dXJuIGluZGV4Xy5BZGRGaWxlKGZpbGUsIHN0ZDo6bWFrZV9wYWlyKGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBzaXplKSk7Ci0gIH0gZWxzZSB7Ci0gICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkludmFsaWQgZmlsZSBkZXNjcmlwdG9yIGRhdGEgcGFzc2VkIHRvICIKLSAgICAgICAgICAgICAgICAgICJFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpBZGQoKS4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkFkZENvcHkoCi0gICAgY29uc3Qgdm9pZCogZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIGludCBzaXplKSB7Ci0gIHZvaWQqIGNvcHkgPSBvcGVyYXRvciBuZXcoc2l6ZSk7Ci0gIG1lbWNweShjb3B5LCBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgc2l6ZSk7Ci0gIGZpbGVzX3RvX2RlbGV0ZV8ucHVzaF9iYWNrKGNvcHkpOwotICByZXR1cm4gQWRkKGNvcHksIHNpemUpOwotfQotCi1ib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKAotICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIHJldHVybiBNYXliZVBhcnNlKGluZGV4Xy5GaW5kRmlsZShmaWxlbmFtZSksIG91dHB1dCk7Ci19Ci0KLWJvb2wgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAotICAgIGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIHJldHVybiBNYXliZVBhcnNlKGluZGV4Xy5GaW5kU3ltYm9sKHN5bWJvbF9uYW1lKSwgb3V0cHV0KTsKLX0KLQotYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woCi0gICAgY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKLSAgICBzdHJpbmcqIG91dHB1dCkgewotICBwYWlyPGNvbnN0IHZvaWQqLCBpbnQ+IGVuY29kZWRfZmlsZSA9IGluZGV4Xy5GaW5kU3ltYm9sKHN5bWJvbF9uYW1lKTsKLSAgaWYgKGVuY29kZWRfZmlsZS5maXJzdCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gT3B0aW1pemF0aW9uOiAgVGhlIG5hbWUgc2hvdWxkIGJlIHRoZSBmaXJzdCBmaWVsZCBpbiB0aGUgZW5jb2RlZCBtZXNzYWdlLgotICAvLyAgIFRyeSB0byBqdXN0IHJlYWQgaXQgZGlyZWN0bHkuCi0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihlbmNvZGVkX2ZpbGUuZmlyc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVkX2ZpbGUuc2Vjb25kKTsKLQotICBjb25zdCB1aW50MzIga05hbWVUYWcgPSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCi0gICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyLAotICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLQotICBpZiAoaW5wdXQuUmVhZFRhZygpID09IGtOYW1lVGFnKSB7Ci0gICAgLy8gU3VjY2VzcyEKLSAgICByZXR1cm4gaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKCZpbnB1dCwgb3V0cHV0KTsKLSAgfSBlbHNlIHsKLSAgICAvLyBTbG93IHBhdGguICBQYXJzZSB3aG9sZSBtZXNzYWdlLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgICBpZiAoIWZpbGVfcHJvdG8uUGFyc2VGcm9tQXJyYXkoZW5jb2RlZF9maWxlLmZpcnN0LCBlbmNvZGVkX2ZpbGUuc2Vjb25kKSkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAqb3V0cHV0ID0gZmlsZV9wcm90by5uYW1lKCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCi0gICAgY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCi0gICAgaW50IGZpZWxkX251bWJlciwKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgcmV0dXJuIE1heWJlUGFyc2UoaW5kZXhfLkZpbmRFeHRlbnNpb24oY29udGFpbmluZ190eXBlLCBmaWVsZF9udW1iZXIpLAotICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOwotfQotCi1ib29sIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAotICAgIGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKLSAgICB2ZWN0b3I8aW50Piogb3V0cHV0KSB7Ci0gIHJldHVybiBpbmRleF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoZXh0ZW5kZWVfdHlwZSwgb3V0cHV0KTsKLX0KLQotYm9vbCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOjpNYXliZVBhcnNlKAotICAgIHBhaXI8Y29uc3Qgdm9pZCosIGludD4gZW5jb2RlZF9maWxlLAotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICBpZiAoZW5jb2RlZF9maWxlLmZpcnN0ID09IE5VTEwpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIG91dHB1dC0+UGFyc2VGcm9tQXJyYXkoZW5jb2RlZF9maWxlLmZpcnN0LCBlbmNvZGVkX2ZpbGUuc2Vjb25kKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1EZXNjcmlwdG9yUG9vbERhdGFiYXNlOjpEZXNjcmlwdG9yUG9vbERhdGFiYXNlKGNvbnN0IERlc2NyaXB0b3JQb29sJiBwb29sKQotICA6IHBvb2xfKHBvb2wpIHt9Ci1EZXNjcmlwdG9yUG9vbERhdGFiYXNlOjp+RGVzY3JpcHRvclBvb2xEYXRhYmFzZSgpIHt9Ci0KLWJvb2wgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RmluZEZpbGVCeU5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sXy5GaW5kRmlsZUJ5TmFtZShmaWxlbmFtZSk7Ci0gIGlmIChmaWxlID09IE5VTEwpIHJldHVybiBmYWxzZTsKLSAgb3V0cHV0LT5DbGVhcigpOwotICBmaWxlLT5Db3B5VG8ob3V0cHV0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAotICAgIGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKHN5bWJvbF9uYW1lKTsKLSAgaWYgKGZpbGUgPT0gTlVMTCkgcmV0dXJuIGZhbHNlOwotICBvdXRwdXQtPkNsZWFyKCk7Ci0gIGZpbGUtPkNvcHlUbyhvdXRwdXQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlOjpGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCi0gICAgY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCi0gICAgaW50IGZpZWxkX251bWJlciwKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUgPSBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29udGFpbmluZ190eXBlKTsKLSAgaWYgKGV4dGVuZGVlID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbiA9Ci0gICAgcG9vbF8uRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuZGVlLCBmaWVsZF9udW1iZXIpOwotICBpZiAoZXh0ZW5zaW9uID09IE5VTEwpIHJldHVybiBmYWxzZTsKLQotICBvdXRwdXQtPkNsZWFyKCk7Ci0gIGV4dGVuc2lvbi0+ZmlsZSgpLT5Db3B5VG8ob3V0cHV0KTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTo6RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoCi0gICAgY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAotICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUgPSBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoZXh0ZW5kZWVfdHlwZSk7Ci0gIGlmIChleHRlbmRlZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGV4dGVuc2lvbnM7Ci0gIHBvb2xfLkZpbmRBbGxFeHRlbnNpb25zKGV4dGVuZGVlLCAmZXh0ZW5zaW9ucyk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLnNpemUoKTsgKytpKSB7Ci0gICAgb3V0cHV0LT5wdXNoX2JhY2soZXh0ZW5zaW9uc1tpXS0+bnVtYmVyKCkpOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoCi0gICAgRGVzY3JpcHRvckRhdGFiYXNlKiBzb3VyY2UxLAotICAgIERlc2NyaXB0b3JEYXRhYmFzZSogc291cmNlMikgewotICBzb3VyY2VzXy5wdXNoX2JhY2soc291cmNlMSk7Ci0gIHNvdXJjZXNfLnB1c2hfYmFjayhzb3VyY2UyKTsKLX0KLU1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6TWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKAotICAgIGNvbnN0IHZlY3RvcjxEZXNjcmlwdG9yRGF0YWJhc2UqPiYgc291cmNlcykKLSAgOiBzb3VyY2VzXyhzb3VyY2VzKSB7fQotTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjp+TWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKCkge30KLQotYm9vbCBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKAotICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlc18uc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoc291cmNlc19baV0tPkZpbmRGaWxlQnlOYW1lKGZpbGVuYW1lLCBvdXRwdXQpKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTo6RmluZEZpbGVDb250YWluaW5nU3ltYm9sKAotICAgIGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlc18uc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoc291cmNlc19baV0tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2xfbmFtZSwgb3V0cHV0KSkgewotICAgICAgLy8gVGhlIHN5bWJvbCB3YXMgZm91bmQgaW4gc291cmNlIGkuICBIb3dldmVyLCBpZiBvbmUgb2YgdGhlIHByZXZpb3VzCi0gICAgICAvLyBzb3VyY2VzIGRlZmluZXMgYSBmaWxlIHdpdGggdGhlIHNhbWUgbmFtZSAod2hpY2ggcHJlc3VtYWJseSBkb2Vzbid0Ci0gICAgICAvLyBjb250YWluIHRoZSBzeW1ib2wsIHNpbmNlIGl0IHdhc24ndCBmb3VuZCBpbiB0aGF0IHNvdXJjZSksIHRoZW4gd2UKLSAgICAgIC8vIG11c3QgaGlkZSBpdCBmcm9tIHRoZSBjYWxsZXIuCi0gICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHRlbXA7Ci0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IGk7IGorKykgewotICAgICAgICBpZiAoc291cmNlc19bal0tPkZpbmRGaWxlQnlOYW1lKG91dHB1dC0+bmFtZSgpLCAmdGVtcCkpIHsKLSAgICAgICAgICAvLyBGb3VuZCBjb25mbGljdGluZyBmaWxlIGluIGEgcHJldmlvdXMgc291cmNlLgotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotYm9vbCBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigKLSAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKLSAgICBpbnQgZmllbGRfbnVtYmVyLAotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IHNvdXJjZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgaWYgKHNvdXJjZXNfW2ldLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCi0gICAgICAgICAgY29udGFpbmluZ190eXBlLCBmaWVsZF9udW1iZXIsIG91dHB1dCkpIHsKLSAgICAgIC8vIFRoZSBzeW1ib2wgd2FzIGZvdW5kIGluIHNvdXJjZSBpLiAgSG93ZXZlciwgaWYgb25lIG9mIHRoZSBwcmV2aW91cwotICAgICAgLy8gc291cmNlcyBkZWZpbmVzIGEgZmlsZSB3aXRoIHRoZSBzYW1lIG5hbWUgKHdoaWNoIHByZXN1bWFibHkgZG9lc24ndAotICAgICAgLy8gY29udGFpbiB0aGUgc3ltYm9sLCBzaW5jZSBpdCB3YXNuJ3QgZm91bmQgaW4gdGhhdCBzb3VyY2UpLCB0aGVuIHdlCi0gICAgICAvLyBtdXN0IGhpZGUgaXQgZnJvbSB0aGUgY2FsbGVyLgotICAgICAgRmlsZURlc2NyaXB0b3JQcm90byB0ZW1wOwotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBpOyBqKyspIHsKLSAgICAgICAgaWYgKHNvdXJjZXNfW2pdLT5GaW5kRmlsZUJ5TmFtZShvdXRwdXQtPm5hbWUoKSwgJnRlbXApKSB7Ci0gICAgICAgICAgLy8gRm91bmQgY29uZmxpY3RpbmcgZmlsZSBpbiBhIHByZXZpb3VzIHNvdXJjZS4KLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlOjpGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygKLSAgICBjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCi0gICAgdmVjdG9yPGludD4qIG91dHB1dCkgewotICBzZXQ8aW50PiBtZXJnZWRfcmVzdWx0czsKLSAgdmVjdG9yPGludD4gcmVzdWx0czsKLSAgYm9vbCBzdWNjZXNzID0gZmFsc2U7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzb3VyY2VzXy5zaXplKCk7IGkrKykgewotICAgIGlmIChzb3VyY2VzX1tpXS0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoZXh0ZW5kZWVfdHlwZSwgJnJlc3VsdHMpKSB7Ci0gICAgICBzdGQ6OmNvcHkoCi0gICAgICAgICAgcmVzdWx0cy5iZWdpbigpLCByZXN1bHRzLmVuZCgpLAotICAgICAgICAgIGluc2VydF9pdGVyYXRvcjxzZXQ8aW50PiA+KG1lcmdlZF9yZXN1bHRzLCBtZXJnZWRfcmVzdWx0cy5iZWdpbigpKSk7Ci0gICAgICBzdWNjZXNzID0gdHJ1ZTsKLSAgICB9Ci0gICAgcmVzdWx0cy5jbGVhcigpOwotICB9Ci0KLSAgc3RkOjpjb3B5KG1lcmdlZF9yZXN1bHRzLmJlZ2luKCksIG1lcmdlZF9yZXN1bHRzLmVuZCgpLAotICAgICAgICAgICAgaW5zZXJ0X2l0ZXJhdG9yPHZlY3RvcjxpbnQ+ID4oKm91dHB1dCwgb3V0cHV0LT5lbmQoKSkpOwotCi0gIHJldHVybiBzdWNjZXNzOwotfQotCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODYwMDJkNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDM2OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gSW50ZXJmYWNlIGZvciBtYW5pcHVsYXRpbmcgZGF0YWJhc2VzIG9mIGRlc2NyaXB0b3JzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9ERVNDUklQVE9SX0RBVEFCQVNFX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9EQVRBQkFTRV9IX18KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCi1jbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2U7Ci1jbGFzcyBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U7Ci1jbGFzcyBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOwotY2xhc3MgRGVzY3JpcHRvclBvb2xEYXRhYmFzZTsKLWNsYXNzIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZTsKLQotLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGRhdGFiYXNlIG9mIGRlc2NyaXB0b3JzLgotLy8KLS8vIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSB3YW50IHRvIGNyZWF0ZSBhIERlc2NyaXB0b3JQb29sIHdoaWNoIGxvYWRzCi0vLyBkZXNjcmlwdG9ycyBvbi1kZW1hbmQgZnJvbSBzb21lIHNvcnQgb2YgbGFyZ2UgZGF0YWJhc2UuICBJZiB0aGUgZGF0YWJhc2UKLS8vIGlzIGxhcmdlLCBpdCBtYXkgYmUgaW5lZmZpY2llbnQgdG8gZW51bWVyYXRlIGV2ZXJ5IC5wcm90byBmaWxlIGluc2lkZSBpdAotLy8gY2FsbGluZyBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlKCkgZm9yIGVhY2ggb25lLiAgSW5zdGVhZCwgYSBEZXNjcmlwdG9yUG9vbAotLy8gY2FuIGJlIGNyZWF0ZWQgd2hpY2ggd3JhcHMgYSBEZXNjcmlwdG9yRGF0YWJhc2UgYW5kIG9ubHkgYnVpbGRzIHBhcnRpY3VsYXIKLS8vIGRlc2NyaXB0b3JzIHdoZW4gdGhleSBhcmUgbmVlZGVkLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JEYXRhYmFzZSB7Ci0gcHVibGljOgotICBpbmxpbmUgRGVzY3JpcHRvckRhdGFiYXNlKCkge30KLSAgdmlydHVhbCB+RGVzY3JpcHRvckRhdGFiYXNlKCk7Ci0KLSAgLy8gRmluZCBhIGZpbGUgYnkgZmlsZSBuYW1lLiAgRmlsbHMgaW4gaW4gKm91dHB1dCBhbmQgcmV0dXJucyB0cnVlIGlmIGZvdW5kLgotICAvLyBPdGhlcndpc2UsIHJldHVybnMgZmFsc2UsIGxlYXZpbmcgdGhlIGNvbnRlbnRzIG9mICpvdXRwdXQgdW5kZWZpbmVkLgotICB2aXJ0dWFsIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgPSAwOwotCi0gIC8vIEZpbmQgdGhlIGZpbGUgdGhhdCBkZWNsYXJlcyB0aGUgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIHN5bWJvbCBuYW1lLgotICAvLyBJZiBmb3VuZCwgZmlsbHMgaW4gKm91dHB1dCBhbmQgcmV0dXJucyB0cnVlLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZQotICAvLyBhbmQgbGVhdmVzICpvdXRwdXQgdW5kZWZpbmVkLgotICB2aXJ0dWFsIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSA9IDA7Ci0KLSAgLy8gRmluZCB0aGUgZmlsZSB3aGljaCBkZWZpbmVzIGFuIGV4dGVuc2lvbiBleHRlbmRpbmcgdGhlIGdpdmVuIG1lc3NhZ2UgdHlwZQotICAvLyB3aXRoIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIuICBJZiBmb3VuZCwgZmlsbHMgaW4gKm91dHB1dCBhbmQgcmV0dXJucyB0cnVlLAotICAvLyBvdGhlcndpc2UgcmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzICpvdXRwdXQgdW5kZWZpbmVkLiAgY29udGFpbmluZ190eXBlCi0gIC8vIG11c3QgYmUgYSBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lLgotICB2aXJ0dWFsIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSA9IDA7Ci0KLSAgLy8gRmluZHMgdGhlIHRhZyBudW1iZXJzIHVzZWQgYnkgYWxsIGtub3duIGV4dGVuc2lvbnMgb2YKLSAgLy8gZXh0ZW5kZWVfdHlwZSwgYW5kIGFwcGVuZHMgdGhlbSB0byBvdXRwdXQgaW4gYW4gdW5kZWZpbmVkCi0gIC8vIG9yZGVyLiBUaGlzIG1ldGhvZCBpcyBiZXN0LWVmZm9ydDogaXQncyBub3QgZ3VhcmFudGVlZCB0aGF0IHRoZQotICAvLyBkYXRhYmFzZSB3aWxsIGZpbmQgYWxsIGV4dGVuc2lvbnMsIGFuZCBpdCdzIG5vdCBndWFyYW50ZWVkIHRoYXQKLSAgLy8gRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uIHdpbGwgcmV0dXJuIHRydWUgb24gYWxsIG9mIHRoZSBmb3VuZAotICAvLyBudW1iZXJzLiBSZXR1cm5zIHRydWUgaWYgdGhlIHNlYXJjaCB3YXMgc3VjY2Vzc2Z1bCwgb3RoZXJ3aXNlCi0gIC8vIHJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyBvdXRwdXQgdW5jaGFuZ2VkLgotICAvLwotICAvLyBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMKLSAgLy8gZmFsc2UuCi0gIHZpcnR1YWwgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIC8qIGV4dGVuZGVlX3R5cGUgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiogLyogb3V0cHV0ICovKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmlwdG9yRGF0YWJhc2UpOwotfTsKLQotLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2UgaW50byB3aGljaCB5b3UgY2FuIGluc2VydCBmaWxlcyBtYW51YWxseS4KLS8vCi0vLyBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woKSBpcyBmdWxseS1pbXBsZW1lbnRlZC4gIFdoZW4geW91IGFkZCBhIGZpbGUsIGl0cwotLy8gc3ltYm9scyB3aWxsIGJlIGluZGV4ZWQgZm9yIHRoaXMgcHVycG9zZS4gIE5vdGUgdGhhdCB0aGUgaW1wbGVtZW50YXRpb24KLS8vIG1heSByZXR1cm4gZmFsc2UgcG9zaXRpdmVzLCBidXQgb25seSBpZiBpdCBpc24ndCBwb3NzaWJsZSBmb3IgdGhlIHN5bWJvbAotLy8gdG8gYmUgZGVmaW5lZCBpbiBhbnkgb3RoZXIgZmlsZS4gIEluIHBhcnRpY3VsYXIsIGlmIGEgZmlsZSBkZWZpbmVzIGEgc3ltYm9sCi0vLyAiRm9vIiwgdGhlbiBzZWFyY2hpbmcgZm9yICJGb28uW2FueXRoaW5nXSIgd2lsbCBtYXRjaCB0aGF0IGZpbGUuICBUaGlzIHdheSwKLS8vIHRoZSBkYXRhYmFzZSBkb2VzIG5vdCBuZWVkIHRvIGFnZ3Jlc3NpdmVseSBpbmRleCBhbGwgY2hpbGRyZW4gb2YgYSBzeW1ib2wuCi0vLwotLy8gRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgaXMgbW9zdGx5LWltcGxlbWVudGVkLiAgSXQgd29ya3MgaWYgYW5kIG9ubHkKLS8vIGlmIHRoZSBvcmlnaW5hbCBGaWVsZERlc2NyaXB0b3JQcm90byBkZWZpbmluZyB0aGUgZXh0ZW5zaW9uIGhhcyBhCi0vLyBmdWxseS1xdWFsaWZpZWQgdHlwZSBuYW1lIGluIGl0cyAiZXh0ZW5kZWUiIGZpZWxkIChpLmUuIHN0YXJ0cyB3aXRoIGEgJy4nKS4KLS8vIElmIHRoZSBleHRlbmRlZSBpcyBhIHJlbGF0aXZlIG5hbWUsIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSB3aWxsIG5vdAotLy8gYXR0ZW1wdCB0byByZXNvbHZlIHRoZSB0eXBlLCBzbyBpdCB3aWxsIG5vdCBrbm93IHdoYXQgdHlwZSB0aGUgZXh0ZW5zaW9uIGlzCi0vLyBleHRlbmRpbmcuICBUaGVyZWZvcmUsIGNhbGxpbmcgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgd2l0aCB0aGUKLS8vIGV4dGVuc2lvbidzIGNvbnRhaW5pbmcgdHlwZSB3aWxsIG5ldmVyIGFjdHVhbGx5IGZpbmQgdGhhdCBleHRlbnNpb24uICBOb3RlCi0vLyB0aGF0IHRoaXMgaXMgYW4gdW5saWtlbHkgcHJvYmxlbSwgYXMgYWxsIEZpbGVEZXNjcmlwdG9yUHJvdG9zIGNyZWF0ZWQgYnkgdGhlCi0vLyBwcm90b2NvbCBjb21waWxlciAoYXMgd2VsbCBhcyBvbmVzIGNyZWF0ZWQgYnkgY2FsbGluZwotLy8gRmlsZURlc2NyaXB0b3I6OkNvcHlUbygpKSB3aWxsIGFsd2F5cyB1c2UgZnVsbHktcXVhbGlmaWVkIG5hbWVzIGZvciBhbGwKLS8vIHR5cGVzLiAgWW91IG9ubHkgbmVlZCB0byB3b3JyeSBpZiB5b3UgYXJlIGNvbnN0cnVjdGluZyBGaWxlRGVzY3JpcHRvclByb3RvcwotLy8geW91cnNlbGYsIG9yIGFyZSBjYWxsaW5nIGNvbXBpbGVyOjpQYXJzZXIgZGlyZWN0bHkuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7Ci0gcHVibGljOgotICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UoKTsKLSAgflNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSgpOwotCi0gIC8vIEFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIGRhdGFiYXNlLCBtYWtpbmcgYSBjb3B5LiAgVGhlIG9iamVjdAotICAvLyBjYW4gYmUgZGVsZXRlZCBhZnRlciBBZGQoKSByZXR1cm5zLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgZmlsZSBjb25mbGljdGVkCi0gIC8vIHdpdGggYSBmaWxlIGFscmVhZHkgaW4gdGhlIGRhdGFiYXNlLCBpbiB3aGljaCBjYXNlIGFuIGVycm9yIHdpbGwgaGF2ZQotICAvLyBiZWVuIHdyaXR0ZW4gdG8gR09PR0xFX0xPRyhFUlJPUikuCi0gIGJvb2wgQWRkKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpOwotCi0gIC8vIEFkZHMgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8gdG8gdGhlIGRhdGFiYXNlIGFuZCB0YWtlcyBvd25lcnNoaXAgb2YgaXQuCi0gIGJvb2wgQWRkQW5kT3duKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUpOwotCi0gIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOwotICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOwotICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLSAgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGludD4qIG91dHB1dCk7Ci0KLSBwcml2YXRlOgotICAvLyBTbyB0aGF0IGl0IGNhbiB1c2UgRGVzY3JpcHRvckluZGV4LgotICBmcmllbmQgY2xhc3MgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZTsKLQotICAvLyBBbiBpbmRleCBtYXBwaW5nIGZpbGUgbmFtZXMsIHN5bWJvbCBuYW1lcywgYW5kIGV4dGVuc2lvbiBudW1iZXJzIHRvCi0gIC8vIHNvbWUgc29ydCBvZiB2YWx1ZXMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBWYWx1ZT4KLSAgY2xhc3MgRGVzY3JpcHRvckluZGV4IHsKLSAgIHB1YmxpYzoKLSAgICAvLyBIZWxwZXJzIHRvIHJlY3Vyc2l2ZWx5IGFkZCBwYXJ0aWN1bGFyIGRlc2NyaXB0b3JzIGFuZCBhbGwgdGhlaXIgY29udGVudHMKLSAgICAvLyB0byB0aGUgaW5kZXguCi0gICAgYm9vbCBBZGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUsCi0gICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlKTsKLSAgICBib29sIEFkZFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUsIFZhbHVlIHZhbHVlKTsKLSAgICBib29sIEFkZE5lc3RlZEV4dGVuc2lvbnMoY29uc3QgRGVzY3JpcHRvclByb3RvJiBtZXNzYWdlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlIHZhbHVlKTsKLSAgICBib29sIEFkZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgVmFsdWUgdmFsdWUpOwotCi0gICAgVmFsdWUgRmluZEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7Ci0gICAgVmFsdWUgRmluZFN5bWJvbChjb25zdCBzdHJpbmcmIG5hbWUpOwotICAgIFZhbHVlIEZpbmRFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsIGludCBmaWVsZF9udW1iZXIpOwotICAgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50Piogb3V0cHV0KTsKLQotICAgcHJpdmF0ZToKLSAgICBtYXA8c3RyaW5nLCBWYWx1ZT4gYnlfbmFtZV87Ci0gICAgbWFwPHN0cmluZywgVmFsdWU+IGJ5X3N5bWJvbF87Ci0gICAgbWFwPHBhaXI8c3RyaW5nLCBpbnQ+LCBWYWx1ZT4gYnlfZXh0ZW5zaW9uXzsKLQotICAgIC8vIEludmFyaWFudDogIFRoZSBieV9zeW1ib2xfIG1hcCBkb2VzIG5vdCBjb250YWluIGFueSBzeW1ib2xzIHdoaWNoIGFyZQotICAgIC8vIHByZWZpeGVzIG9mIG90aGVyIHN5bWJvbHMgaW4gdGhlIG1hcC4gIEZvciBleGFtcGxlLCAiZm9vLmJhciIgaXMgYQotICAgIC8vIHByZWZpeCBvZiAiZm9vLmJhci5iYXoiIChidXQgaXMgbm90IGEgcHJlZml4IG9mICJmb28uYmFyYmF6IikuCi0gICAgLy8KLSAgICAvLyBUaGlzIGludmFyaWFudCBpcyBpbXBvcnRhbnQgYmVjYXVzZSBpdCBtZWFucyB0aGF0IGdpdmVuIGEgc3ltYm9sIG5hbWUsCi0gICAgLy8gd2UgY2FuIGZpbmQgYSBrZXkgaW4gdGhlIG1hcCB3aGljaCBpcyBhIHByZWZpeCBvZiB0aGUgc3ltYm9sIGluIE8obGcgbikKLSAgICAvLyB0aW1lLCBhbmQgd2Uga25vdyB0aGF0IHRoZXJlIGlzIGF0IG1vc3Qgb25lIHN1Y2gga2V5LgotICAgIC8vCi0gICAgLy8gVGhlIHByZWZpeCBsb29rdXAgYWxnb3JpdGhtIHdvcmtzIGxpa2Ugc286Ci0gICAgLy8gMSkgRmluZCB0aGUgbGFzdCBrZXkgaW4gdGhlIG1hcCB3aGljaCBpcyBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlCi0gICAgLy8gICAgc2VhcmNoIGtleS4KLSAgICAvLyAyKSBJZiB0aGUgZm91bmQga2V5IGlzIGEgcHJlZml4IG9mIHRoZSBzZWFyY2gga2V5LCB0aGVuIHJldHVybiBpdC4KLSAgICAvLyAgICBPdGhlcndpc2UsIHRoZXJlIGlzIG5vIG1hdGNoLgotICAgIC8vCi0gICAgLy8gSSBhbSBzdXJlIHRoaXMgYWxnb3JpdGhtIGhhcyBiZWVuIGRlc2NyaWJlZCBlbHNld2hlcmUsIGJ1dCBzaW5jZSBJCi0gICAgLy8gd2Fzbid0IGFibGUgdG8gZmluZCBpdCBxdWlja2x5IEkgd2lsbCBpbnN0ZWFkIHByb3ZlIHRoYXQgaXQgd29ya3MKLSAgICAvLyBteXNlbGYuICBUaGUga2V5IHRvIHRoZSBhbGdvcml0aG0gaXMgdGhhdCBpZiBhIG1hdGNoIGV4aXN0cywgc3RlcCAoMSkKLSAgICAvLyB3aWxsIGZpbmQgaXQuICBQcm9vZjoKLSAgICAvLyAxKSBEZWZpbmUgdGhlICJzZWFyY2gga2V5IiB0byBiZSB0aGUga2V5IHdlIGFyZSBsb29raW5nIGZvciwgdGhlICJmb3VuZAotICAgIC8vICAgIGtleSIgdG8gYmUgdGhlIGtleSBmb3VuZCBpbiBzdGVwICgxKSwgYW5kIHRoZSAibWF0Y2gga2V5IiB0byBiZSB0aGUKLSAgICAvLyAgICBrZXkgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGUgc2VyYWNoIGtleSAoaS5lLiB0aGUga2V5IHdlJ3JlIHRyeWluZwotICAgIC8vICAgIHRvIGZpbmQpLgotICAgIC8vIDIpIFRoZSBmb3VuZCBrZXkgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkgYnkKLSAgICAvLyAgICBkZWZpbml0aW9uLgotICAgIC8vIDMpIFRoZSBtYXRjaCBrZXkgbXVzdCBhbHNvIGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2VhcmNoIGtleQotICAgIC8vICAgIChiZWNhdXNlIGl0IGlzIGEgcHJlZml4KS4KLSAgICAvLyA0KSBUaGUgbWF0Y2gga2V5IGNhbm5vdCBiZSBncmVhdGVyIHRoYW4gdGhlIGZvdW5kIGtleSwgYmVjYXVzZSBpZiBpdAotICAgIC8vICAgIHdlcmUsIHRoZW4gc3RlcCAoMSkgb2YgdGhlIGFsZ29yaXRobSB3b3VsZCBoYXZlIHJldHVybmVkIHRoZSBtYXRjaAotICAgIC8vICAgIGtleSBpbnN0ZWFkIChzaW5jZSBpdCBmaW5kcyB0aGUgKmdyZWF0ZXN0KiBrZXkgd2hpY2ggaXMgbGVzcyB0aGFuIG9yCi0gICAgLy8gICAgZXF1YWwgdG8gdGhlIHNlYXJjaCBrZXkpLgotICAgIC8vIDUpIFRoZXJlZm9yZSwgdGhlIGZvdW5kIGtleSBtdXN0IGJlIGJldHdlZW4gdGhlIG1hdGNoIGtleSBhbmQgdGhlIHNlYXJjaAotICAgIC8vICAgIGtleSwgaW5jbHVzaXZlLgotICAgIC8vIDYpIFNpbmNlIHRoZSBzZWFyY2gga2V5IG11c3QgYmUgYSBzdWItc3ltYm9sIG9mIHRoZSBtYXRjaCBrZXksIGlmIGl0IGlzCi0gICAgLy8gICAgbm90IGVxdWFsIHRvIHRoZSBtYXRjaCBrZXksIHRoZW4gc2VhcmNoX2tleVttYXRjaF9rZXkuc2l6ZSgpXSBtdXN0Ci0gICAgLy8gICAgYmUgJy4nLgotICAgIC8vIDcpIFNpbmNlICcuJyBzb3J0cyBiZWZvcmUgYW55IG90aGVyIGNoYXJhY3RlciB0aGF0IGlzIHZhbGlkIGluIGEgc3ltYm9sCi0gICAgLy8gICAgbmFtZSwgdGhlbiBpZiB0aGUgZm91bmQga2V5IGlzIG5vdCBlcXVhbCB0byB0aGUgbWF0Y2gga2V5LCB0aGVuCi0gICAgLy8gICAgZm91bmRfa2V5W21hdGNoX2tleS5zaXplKCldIG11c3QgYWxzbyBiZSAnLicsIGJlY2F1c2UgYW55IG90aGVyIHZhbHVlCi0gICAgLy8gICAgd291bGQgbWFrZSBpdCBzb3J0IGFmdGVyIHRoZSBzZWFyY2gga2V5LgotICAgIC8vIDgpIFRoZXJlZm9yZSwgaWYgdGhlIGZvdW5kIGtleSBpcyBub3QgZXF1YWwgdG8gdGhlIG1hdGNoIGtleSwgdGhlbiB0aGUKLSAgICAvLyAgICBmb3VuZCBrZXkgbXVzdCBiZSBhIHN1Yi1zeW1ib2wgb2YgdGhlIG1hdGNoIGtleS4gIEhvd2V2ZXIsIHRoaXMgd291bGQKLSAgICAvLyAgICBjb250cmFkaWN0IG91ciBtYXAgaW52YXJpYW50IHdoaWNoIHNheXMgdGhhdCBubyBzeW1ib2wgaW4gdGhlIG1hcCBpcwotICAgIC8vICAgIGEgc3ViLXN5bWJvbCBvZiBhbnkgb3RoZXIuCi0gICAgLy8gOSkgVGhlcmVmb3JlLCB0aGUgZm91bmQga2V5IG11c3QgbWF0Y2ggdGhlIG1hdGNoIGtleS4KLSAgICAvLwotICAgIC8vIFRoZSBhYm92ZSBwcm9vZiBhc3N1bWVzIHRoZSBtYXRjaCBrZXkgZXhpc3RzLiAgSW4gdGhlIGNhc2UgdGhhdCB0aGUKLSAgICAvLyBtYXRjaCBrZXkgZG9lcyBub3QgZXhpc3QsIHRoZW4gc3RlcCAoMSkgd2lsbCByZXR1cm4gc29tZSBvdGhlciBzeW1ib2wuCi0gICAgLy8gVGhhdCBzeW1ib2wgY2Fubm90IGJlIGEgc3VwZXItc3ltYm9sIG9mIHRoZSBzZWFyY2gga2V5IHNpbmNlIGlmIGl0IHdlcmUsCi0gICAgLy8gdGhlbiBpdCB3b3VsZCBiZSBhIG1hdGNoLCBhbmQgd2UncmUgYXNzdW1pbmcgdGhlIG1hdGNoIGtleSBkb2Vzbid0IGV4aXN0LgotICAgIC8vIFRoZXJlZm9yZSwgc3RlcCAyIHdpbGwgY29ycmVjdGx5IHJldHVybiBubyBtYXRjaC4KLQotICAgIC8vIEZpbmQgdGhlIGxhc3QgZW50cnkgaW4gdGhlIGJ5X3N5bWJvbF8gbWFwIHdob3NlIGtleSBpcyBsZXNzIHRoYW4gb3IKLSAgICAvLyBlcXVhbCB0byB0aGUgZ2l2ZW4gbmFtZS4KLSAgICB0eXBlbmFtZSBtYXA8c3RyaW5nLCBWYWx1ZT46Oml0ZXJhdG9yIEZpbmRMYXN0TGVzc09yRXF1YWwoCi0gICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgICAvLyBUcnVlIGlmIGVpdGhlciB0aGUgYXJndW1lbnRzIGFyZSBlcXVhbCBvciBzdXBlcl9zeW1ib2wgaWRlbnRpZmllcyBhCi0gICAgLy8gcGFyZW50IHN5bWJvbCBvZiBzdWJfc3ltYm9sIChlLmcuICJmb28uYmFyIiBpcyBhIHBhcmVudCBvZgotICAgIC8vICJmb28uYmFyLmJheiIsIGJ1dCBub3QgYSBwYXJlbnQgb2YgImZvby5iYXJiYXoiKS4KLSAgICBib29sIElzU3ViU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ViX3N5bWJvbCwgY29uc3Qgc3RyaW5nJiBzdXBlcl9zeW1ib2wpOwotCi0gICAgLy8gUmV0dXJucyB0cnVlIGlmIGFuZCBvbmx5IGlmIGFsbCBjaGFyYWN0ZXJzIGluIHRoZSBuYW1lIGFyZSBhbHBoYW51bWVyaWNzLAotICAgIC8vIHVuZGVyc2NvcmVzLCBvciBwZXJpb2RzLgotICAgIGJvb2wgVmFsaWRhdGVTeW1ib2xOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0gIH07Ci0KLQotICBEZXNjcmlwdG9ySW5kZXg8Y29uc3QgRmlsZURlc2NyaXB0b3JQcm90byo+IGluZGV4XzsKLSAgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qPiBmaWxlc190b19kZWxldGVfOwotCi0gIC8vIElmIGZpbGUgaXMgbm9uLU5VTEwsIGNvcHkgaXQgaW50byAqb3V0cHV0IGFuZCByZXR1cm4gdHJ1ZSwgb3RoZXJ3aXNlCi0gIC8vIHJldHVybiBmYWxzZS4KLSAgYm9vbCBNYXliZUNvcHkoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKLSAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlKTsKLX07Ci0KLS8vIFZlcnkgc2ltaWxhciB0byBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UsIGJ1dCBzdG9yZXMgYWxsIHRoZSBkZXNjcmlwdG9ycwotLy8gYXMgcmF3IGJ5dGVzIGFuZCBnZW5lcmFsbHkgdHJpZXMgdG8gdXNlIGFzIGxpdHRsZSBtZW1vcnkgYXMgcG9zc2libGUuCi0vLwotLy8gVGhlIHNhbWUgY2F2ZWF0cyByZWdhcmRpbmcgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCkgYXBwbHkgYXMgd2l0aAotLy8gU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKLSBwdWJsaWM6Ci0gIEVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKLSAgfkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKLQotICAvLyBBZGRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIHRvIHRoZSBkYXRhYmFzZS4gIFRoZSBkZXNjcmlwdG9yIGlzIHByb3ZpZGVkCi0gIC8vIGluIGVuY29kZWQgZm9ybS4gIFRoZSBkYXRhYmFzZSBkb2VzIG5vdCBtYWtlIGEgY29weSBvZiB0aGUgYnl0ZXMsIG5vcgotICAvLyBkb2VzIGl0IHRha2Ugb3duZXJzaGlwOyBpdCdzIHVwIHRvIHRoZSBjYWxsZXIgdG8gbWFrZSBzdXJlIHRoZSBieXRlcwotICAvLyByZW1haW4gdmFsaWQgZm9yIHRoZSBsaWZlIG9mIHRoZSBkYXRhYmFzZS4gIFJldHVybnMgZmFsc2UgYW5kIGxvZ3MgYW4gZXJyb3IKLSAgLy8gaWYgdGhlIGJ5dGVzIGFyZSBub3QgYSB2YWxpZCBGaWxlRGVzY3JpcHRvclByb3RvIG9yIGlmIHRoZSBmaWxlIGNvbmZsaWN0ZWQKLSAgLy8gd2l0aCBhIGZpbGUgYWxyZWFkeSBpbiB0aGUgZGF0YWJhc2UuCi0gIGJvb2wgQWRkKGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gTGlrZSBBZGQoKSwgYnV0IG1ha2VzIGEgY29weSBvZiB0aGUgZGF0YSwgc28gdGhhdCB0aGUgY2FsbGVyIGRvZXMgbm90Ci0gIC8vIG5lZWQgdG8ga2VlcCBpdCBhcm91bmQuCi0gIGJvb2wgQWRkQ29weShjb25zdCB2b2lkKiBlbmNvZGVkX2ZpbGVfZGVzY3JpcHRvciwgaW50IHNpemUpOwotCi0gIC8vIExpa2UgRmluZEZpbGVDb250YWluaW5nU3ltYm9sIGJ1dCByZXR1cm5zIG9ubHkgdGhlIG5hbWUgb2YgdGhlIGZpbGUuCi0gIGJvb2wgRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KTsKLQotICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLSAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLSAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7Ci0gIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpOwotCi0gcHJpdmF0ZToKLSAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpEZXNjcmlwdG9ySW5kZXg8cGFpcjxjb25zdCB2b2lkKiwgaW50PiA+IGluZGV4XzsKLSAgdmVjdG9yPHZvaWQqPiBmaWxlc190b19kZWxldGVfOwotCi0gIC8vIElmIGVuY29kZWRfZmlsZS5maXJzdCBpcyBub24tTlVMTCwgcGFyc2UgdGhlIGRhdGEgaW50byAqb3V0cHV0IGFuZCByZXR1cm4KLSAgLy8gdHJ1ZSwgb3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KLSAgYm9vbCBNYXliZVBhcnNlKHBhaXI8Y29uc3Qgdm9pZCosIGludD4gZW5jb2RlZF9maWxlLAotICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSk7Ci19OwotCi0vLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB0aGF0IGZldGNoZXMgZmlsZXMgZnJvbSBhIGdpdmVuIHBvb2wuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRGVzY3JpcHRvclBvb2xEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgRGVzY3JpcHRvclBvb2xEYXRhYmFzZShjb25zdCBEZXNjcmlwdG9yUG9vbCYgcG9vbCk7Ci0gIH5EZXNjcmlwdG9yUG9vbERhdGFiYXNlKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7Ci0gIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7Ci0gIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpOwotICBib29sIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGNvbnN0IHN0cmluZyYgZXh0ZW5kZWVfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50Piogb3V0cHV0KTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IERlc2NyaXB0b3JQb29sJiBwb29sXzsKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyaXB0b3JQb29sRGF0YWJhc2UpOwotfTsKLQotLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2UgdGhhdCB3cmFwcyB0d28gb3IgbW9yZSBvdGhlcnMuICBJdCBmaXJzdCBzZWFyY2hlcyB0aGUKLS8vIGZpcnN0IGRhdGFiYXNlIGFuZCwgaWYgdGhhdCBmYWlscywgdHJpZXMgdGhlIHNlY29uZCwgYW5kIHNvIG9uLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgewotIHB1YmxpYzoKLSAgLy8gTWVyZ2UganVzdCB0d28gZGF0YWJhc2VzLiAgVGhlIHNvdXJjZXMgcmVtYWluIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIuCi0gIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZShEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHNvdXJjZTIpOwotICAvLyBNZXJnZSBtb3JlIHRoYW4gdHdvIGRhdGFiYXNlcy4gIFRoZSBzb3VyY2VzIHJlbWFpbiBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyLgotICAvLyBUaGUgdmVjdG9yIG1heSBiZSBkZWxldGVkIGFmdGVyIHRoZSBjb25zdHJ1Y3RvciByZXR1cm5zIGJ1dCB0aGUKLSAgLy8gRGVzY3JpcHRvckRhdGFiYXNlcyBuZWVkIHRvIHN0aWNrIGFyb3VuZC4KLSAgZXhwbGljaXQgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKGNvbnN0IHZlY3RvcjxEZXNjcmlwdG9yRGF0YWJhc2UqPiYgc291cmNlcyk7Ci0gIH5NZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKLQotICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLSAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woY29uc3Qgc3RyaW5nJiBzeW1ib2xfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KTsKLSAgYm9vbCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oY29uc3Qgc3RyaW5nJiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCk7Ci0gIC8vIE1lcmdlcyB0aGUgcmVzdWx0cyBvZiBjYWxsaW5nIGFsbCBkYXRhYmFzZXMuIFJldHVybnMgdHJ1ZSBpZmYgYW55Ci0gIC8vIG9mIHRoZSBkYXRhYmFzZXMgcmV0dXJuZWQgdHJ1ZS4KLSAgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGludD4qIG91dHB1dCk7Ci0KLQotIHByaXZhdGU6Ci0gIHZlY3RvcjxEZXNjcmlwdG9yRGF0YWJhc2UqPiBzb3VyY2VzXzsKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9EQVRBQkFTRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZjMzgxNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw3NTQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgZmlsZSBtYWtlcyBleHRlbnNpdmUgdXNlIG9mIFJGQyAzMDkyLiAgOikKLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHsKLQotc3RhdGljIHZvaWQgQWRkVG9EYXRhYmFzZShTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3RleHQpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOwotICBkYXRhYmFzZS0+QWRkKGZpbGVfcHJvdG8pOwotfQotCi1zdGF0aWMgdm9pZCBFeHBlY3RDb250YWluc1R5cGUoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB0eXBlX25hbWUpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAocHJvdG8ubWVzc2FnZV90eXBlKGkpLm5hbWUoKSA9PSB0eXBlX25hbWUpIHJldHVybjsKLSAgfQotICBBRERfRkFJTFVSRSgpIDw8ICJcIiIgPDwgcHJvdG8ubmFtZSgpCi0gICAgICAgICAgICAgICAgPDwgIlwiIGRpZCBub3QgY29udGFpbiBleHBlY3RlZCB0eXBlIFwiIgotICAgICAgICAgICAgICAgIDw8IHR5cGVfbmFtZSA8PCAiXCIuIjsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0jaWYgR1RFU1RfSEFTX1BBUkFNX1RFU1QKLQotLy8gU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlLCBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlLCBhbmQKLS8vIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgY2FsbCBmb3IgdmVyeSBzaW1pbGFyIHRlc3RzLiAgSW5zdGVhZCBvZiB3cml0aW5nCi0vLyB0aHJlZSBuZWFybHktaWRlbnRpY2FsIHNldHMgb2YgdGVzdHMsIHdlIHVzZSBwYXJhbWV0ZXJpemVkIHRlc3RzIHRvIGFwcGx5Ci0vLyB0aGUgc2FtZSBjb2RlIHRvIGFsbCB0aHJlZS4KLQotLy8gVGhlIHBhcmFtZXRlcml6ZWQgdGVzdCBydW5zIGFnYWluc3QgYSBEZXNjcmlwdGFyRGF0YWJhc2VUZXN0Q2FzZS4gIFdlIGhhdmUKLS8vIGltcGxlbWVudGF0aW9ucyBmb3IgZWFjaCBvZiB0aGUgdGhyZWUgY2xhc3NlcyB3ZSB3YW50IHRvIHRlc3QuCi1jbGFzcyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5EZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9Ci0KLSAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgPSAwOwotICB2aXJ0dWFsIGJvb2wgQWRkVG9EYXRhYmFzZShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKSA9IDA7Ci19OwotCi0vLyBGYWN0b3J5IGZ1bmN0aW9uIHR5cGUuCi10eXBlZGVmIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlKiBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZUZhY3RvcnkoKTsKLQotLy8gU3BlY2lhbGl6YXRpb24gZm9yIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZS4KLWNsYXNzIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogTmV3KCkgewotICAgIHJldHVybiBuZXcgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U7Ci0gIH0KLQotICB2aXJ0dWFsIH5TaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSgpIHt9Ci0KLSAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgewotICAgIHJldHVybiAmZGF0YWJhc2VfOwotICB9Ci0gIHZpcnR1YWwgYm9vbCBBZGRUb0RhdGFiYXNlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpIHsKLSAgICByZXR1cm4gZGF0YWJhc2VfLkFkZChmaWxlKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKLX07Ci0KLS8vIFNwZWNpYWxpemF0aW9uIGZvciBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlLgotY2xhc3MgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogTmV3KCkgewotICAgIHJldHVybiBuZXcgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlOwotICB9Ci0KLSAgdmlydHVhbCB+RW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlKCkge30KLQotICB2aXJ0dWFsIERlc2NyaXB0b3JEYXRhYmFzZSogR2V0RGF0YWJhc2UoKSB7Ci0gICAgcmV0dXJuICZkYXRhYmFzZV87Ci0gIH0KLSAgdmlydHVhbCBib29sIEFkZFRvRGF0YWJhc2UoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZSkgewotICAgIHN0cmluZyBkYXRhOwotICAgIGZpbGUuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotICAgIHJldHVybiBkYXRhYmFzZV8uQWRkQ29weShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotICB9Ci0KLSBwcml2YXRlOgotICBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKLX07Ci0KLS8vIFNwZWNpYWxpemF0aW9uIGZvciBEZXNjcmlwdG9yUG9vbERhdGFiYXNlLgotY2xhc3MgRGVzY3JpcHRvclBvb2xEYXRhYmFzZVRlc3RDYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlIHsKLSBwdWJsaWM6Ci0gIHN0YXRpYyBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZSogTmV3KCkgewotICAgIHJldHVybiBuZXcgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlOwotICB9Ci0KLSAgRGVzY3JpcHRvclBvb2xEYXRhYmFzZVRlc3RDYXNlKCkgOiBkYXRhYmFzZV8ocG9vbF8pIHt9Ci0gIHZpcnR1YWwgfkRlc2NyaXB0b3JQb29sRGF0YWJhc2VUZXN0Q2FzZSgpIHt9Ci0KLSAgdmlydHVhbCBEZXNjcmlwdG9yRGF0YWJhc2UqIEdldERhdGFiYXNlKCkgewotICAgIHJldHVybiAmZGF0YWJhc2VfOwotICB9Ci0gIHZpcnR1YWwgYm9vbCBBZGRUb0RhdGFiYXNlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUpIHsKLSAgICByZXR1cm4gcG9vbF8uQnVpbGRGaWxlKGZpbGUpOwotICB9Ci0KLSBwcml2YXRlOgotICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKLSAgRGVzY3JpcHRvclBvb2xEYXRhYmFzZSBkYXRhYmFzZV87Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWNsYXNzIERlc2NyaXB0b3JEYXRhYmFzZVRlc3QKLSAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlRmFjdG9yeSo+IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICB0ZXN0X2Nhc2VfLnJlc2V0KEdldFBhcmFtKCkoKSk7Ci0gICAgZGF0YWJhc2VfID0gdGVzdF9jYXNlXy0+R2V0RGF0YWJhc2UoKTsKLSAgfQotCi0gIHZvaWQgQWRkVG9EYXRhYmFzZShjb25zdCBjaGFyKiBmaWxlX2Rlc2NyaXB0b3JfdGV4dCkgewotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV9kZXNjcmlwdG9yX3RleHQsICZmaWxlX3Byb3RvKSk7Ci0gICAgRVhQRUNUX1RSVUUodGVzdF9jYXNlXy0+QWRkVG9EYXRhYmFzZShmaWxlX3Byb3RvKSk7Ci0gIH0KLQotICB2b2lkIEFkZFRvRGF0YWJhc2VXaXRoRXJyb3IoY29uc3QgY2hhciogZmlsZV9kZXNjcmlwdG9yX3RleHQpIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gICAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKGZpbGVfZGVzY3JpcHRvcl90ZXh0LCAmZmlsZV9wcm90bykpOwotICAgIEVYUEVDVF9GQUxTRSh0ZXN0X2Nhc2VfLT5BZGRUb0RhdGFiYXNlKGZpbGVfcHJvdG8pKTsKLSAgfQotCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RGVzY3JpcHRvckRhdGFiYXNlVGVzdENhc2U+IHRlc3RfY2FzZV87Ci0gIERlc2NyaXB0b3JEYXRhYmFzZSogZGF0YWJhc2VfOwotfTsKLQotVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRGaWxlQnlOYW1lKSB7Ci0gIEFkZFRvRGF0YWJhc2UoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiRm9vXCIgfSIpOwotICBBZGRUb0RhdGFiYXNlKAotICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhclwiIH0iKTsKLQotICB7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVCeU5hbWUoImZvby5wcm90byIsICZmaWxlKSk7Ci0gICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7Ci0gICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGb28iKTsKLSAgfQotCi0gIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIiwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkJhciIpOwotICB9Ci0KLSAgewotICAgIC8vIEZhaWxzIHRvIGZpbmQgdW5kZWZpbmVkIGZpbGVzLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIiwgJmZpbGUpKTsKLSAgfQotfQotCi1URVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKSB7Ci0gIEFkZFRvRGF0YWJhc2UoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgIiAgbmFtZTogXCJGb29cIiAiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwicXV4XCIgfSIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiR3JhdWx0XCIgfSAiCi0gICAgIiAgZW51bV90eXBlIHsgbmFtZTogXCJHYXJwbHlcIiB9ICIKLSAgICAifSAiCi0gICAgImVudW1fdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIldhbGRvXCIgIgotICAgICIgIHZhbHVlIHsgbmFtZTpcIkZSRURcIiB9ICIKLSAgICAifSAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6IFwicGx1Z2hcIiB9ICIKLSAgICAic2VydmljZSB7ICIKLSAgICAiICBuYW1lOiBcIlh5enp5XCIgIgotICAgICIgIG1ldGhvZCB7IG5hbWU6IFwiVGh1ZFwiIH0gIgotICAgICJ9IgotICAgICk7Ci0gIEFkZFRvRGF0YWJhc2UoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcImNvcmdlXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKLQotICB7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28iLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbiBmaW5kIGZpZWxkcy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5xdXgiLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbiBmaW5kIG5lc3RlZCB0eXBlcy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5HcmF1bHQiLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbiBmaW5kIG5lc3RlZCBlbnVtcy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5HYXJwbHkiLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbiBmaW5kIGVudW0gdHlwZXMuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJXYWxkbyIsICZmaWxlKSk7Ci0gICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gQ2FuIGZpbmQgZW51bSB2YWx1ZXMuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJXYWxkby5GUkVEIiwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4gZmluZCBleHRlbnNpb25zLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgicGx1Z2giLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbiBmaW5kIHNlcnZpY2VzLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiWHl6enkiLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbiBmaW5kIG1ldGhvZHMuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJYeXp6eS5UaHVkIiwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4gZmluZCB0aGluZ3MgaW4gcGFja2FnZXMuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJjb3JnZS5CYXIiLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIEZhaWxzIHRvIGZpbmQgdW5kZWZpbmVkIHN5bWJvbHMuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiQmF6IiwgJmZpbGUpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBOYW1lcyBtdXN0IGJlIGZ1bGx5LXF1YWxpZmllZC4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJCYXIiLCAmZmlsZSkpOwotICB9Ci19Ci0KLVRFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24pIHsKLSAgQWRkVG9EYXRhYmFzZSgKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIkZvb1wiICIKLSAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCi0gICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcInF1eFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6NSAiCi0gICAgIiAgICAgICAgICAgICAgZXh0ZW5kZWU6IFwiLkZvb1wiIH0iCi0gICAgIn0iKTsKLSAgQWRkVG9EYXRhYmFzZSgKLSAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCi0gICAgInBhY2thZ2U6IFwiY29yZ2VcIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgIiAgbmFtZTogXCJCYXJcIiAiCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0gIgotICAgICJ9ICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImdyYXVsdFwiIGV4dGVuZGVlOiBcIi5Gb29cIiAgICAgICBudW1iZXI6MzIgfSAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6XCJnYXJwbHlcIiBleHRlbmRlZTogXCIuY29yZ2UuQmFyXCIgbnVtYmVyOjcwIH0gIgotICAgICJleHRlbnNpb24geyBuYW1lOlwid2FsZG9cIiAgZXh0ZW5kZWU6IFwiQmFyXCIgICAgICAgIG51bWJlcjo1NiB9ICIpOwotCi0gIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkZvbyIsIDUsICZmaWxlKSk7Ci0gICAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlLm5hbWUoKSk7Ci0gIH0KLQotICB7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJGb28iLCAzMiwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4gZmluZCBleHRlbnNpb25zIGZvciBxdWFsaWZpZWQgdHlwZSBuYW1lcy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oImNvcmdlLkJhciIsIDcwLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyB3aG9zZSBleHRlbmRlZSB3YXMgbm90IGZ1bGx5LXF1YWxpZmllZCBpbiB0aGUKLSAgICAvLyBGaWxlRGVzY3JpcHRvclByb3RvLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJhciIsIDU2LCAmZmlsZSkpOwotICAgIEVYUEVDVF9GQUxTRSgKLSAgICAgICAgZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oImNvcmdlLkJhciIsIDU2LCAmZmlsZSkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbid0IGZpbmQgbm9uLWV4aXN0ZW50IGV4dGVuc2lvbiBudW1iZXJzLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfRkFMU0UoZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkZvbyIsIDEyLCAmZmlsZSkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyBmb3Igbm9uLWV4aXN0ZW50IHR5cGVzLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfRkFMU0UoCi0gICAgICAgIGRhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKCJOb1N1Y2hUeXBlIiwgNSwgJmZpbGUpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIHVucXVhbGlmaWVkIHR5cGUgbmFtZXMuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiQmFyIiwgNzAsICZmaWxlKSk7Ci0gIH0KLX0KLQotVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIEZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKSB7Ci0gIEFkZFRvRGF0YWJhc2UoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgIiAgbmFtZTogXCJGb29cIiAiCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0gIgotICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJxdXhcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjUgIgotICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIi5Gb29cIiB9IgotICAgICJ9Iik7Ci0gIEFkZFRvRGF0YWJhc2UoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcImNvcmdlXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICIgIG5hbWU6IFwiQmFyXCIgIgotICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwMCB9ICIKLSAgICAifSAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6XCJncmF1bHRcIiBleHRlbmRlZTogXCIuRm9vXCIgICAgICAgbnVtYmVyOjMyIH0gIgotICAgICJleHRlbnNpb24geyBuYW1lOlwiZ2FycGx5XCIgZXh0ZW5kZWU6IFwiLmNvcmdlLkJhclwiIG51bWJlcjo3MCB9ICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcIndhbGRvXCIgIGV4dGVuZGVlOiBcIkJhclwiICAgICAgICBudW1iZXI6NTYgfSAiKTsKLQotICB7Ci0gICAgdmVjdG9yPGludD4gbnVtYmVyczsKLSAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJGb28iLCAmbnVtYmVycykpOwotICAgIEFTU0VSVF9FUSgyLCBudW1iZXJzLnNpemUoKSk7Ci0gICAgc3RkOjpzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKDUsIG51bWJlcnNbMF0pOwotICAgIEVYUEVDVF9FUSgzMiwgbnVtYmVyc1sxXSk7Ci0gIH0KLQotICB7Ci0gICAgdmVjdG9yPGludD4gbnVtYmVyczsKLSAgICBFWFBFQ1RfVFJVRShkYXRhYmFzZV8tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJjb3JnZS5CYXIiLCAmbnVtYmVycykpOwotICAgIC8vIE5vdGU6IHdvbid0IGZpbmQgZXh0ZW5zaW9uIDU2IGR1ZSB0byB0aGUgbmFtZSBub3QgYmVpbmcgZnVsbHkgcXVhbGlmaWVkLgotICAgIEFTU0VSVF9FUSgxLCBudW1iZXJzLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDcwLCBudW1iZXJzWzBdKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIG5vbi1leGlzdGVudCB0eXBlcy4KLSAgICB2ZWN0b3I8aW50PiBudW1iZXJzOwotICAgIEVYUEVDVF9GQUxTRShkYXRhYmFzZV8tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJOb1N1Y2hUeXBlIiwgJm51bWJlcnMpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4ndCBmaW5kIGV4dGVuc2lvbnMgZm9yIHVucXVhbGlmaWVkIHR5cGVzLgotICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7Ci0gICAgRVhQRUNUX0ZBTFNFKGRhdGFiYXNlXy0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJhciIsICZudW1iZXJzKSk7Ci0gIH0KLX0KLQotVEVTVF9QKERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsIENvbmZsaWN0aW5nRmlsZUVycm9yKSB7Ci0gIEFkZFRvRGF0YWJhc2UoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgIiAgbmFtZTogXCJGb29cIiAiCi0gICAgIn0iKTsKLSAgQWRkVG9EYXRhYmFzZVdpdGhFcnJvcigKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIkJhclwiICIKLSAgICAifSIpOwotfQotCi1URVNUX1AoRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgQ29uZmxpY3RpbmdUeXBlRXJyb3IpIHsKLSAgQWRkVG9EYXRhYmFzZSgKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIkZvb1wiICIKLSAgICAifSIpOwotICBBZGRUb0RhdGFiYXNlV2l0aEVycm9yKAotICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICIgIG5hbWU6IFwiRm9vXCIgIgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfUChEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBDb25mbGljdGluZ0V4dGVuc2lvbkVycm9yKSB7Ci0gIEFkZFRvRGF0YWJhc2UoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjo1ICIKLSAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiLkZvb1wiIH0iKTsKLSAgQWRkVG9EYXRhYmFzZVdpdGhFcnJvcigKLSAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXJcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjUgIgotICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCIuRm9vXCIgfSIpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChTaW1wbGUsIERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsCi0gICAgdGVzdGluZzo6VmFsdWVzKCZTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZTo6TmV3KSk7Ci1JTlNUQU5USUFURV9URVNUX0NBU0VfUChNZW1vcnlDb25zZXJ2aW5nLCBEZXNjcmlwdG9yRGF0YWJhc2VUZXN0LAotICAgIHRlc3Rpbmc6OlZhbHVlcygmRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3RDYXNlOjpOZXcpKTsKLUlOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKFBvb2wsIERlc2NyaXB0b3JEYXRhYmFzZVRlc3QsCi0gICAgdGVzdGluZzo6VmFsdWVzKCZEZXNjcmlwdG9yUG9vbERhdGFiYXNlVGVzdENhc2U6Ok5ldykpOwotCi0jZW5kaWYgIC8vIEdURVNUX0hBU19QQVJBTV9URVNUCi0KLVRFU1QoRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZUV4dHJhVGVzdCwgRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKSB7Ci0gIC8vIENyZWF0ZSB0d28gZmlsZXMsIG9uZSBvZiB3aGljaCBpcyBpbiB0d28gcGFydHMuCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTEsIGZpbGUyYSwgZmlsZTJiOwotICBmaWxlMS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0gIGZpbGUxLnNldF9wYWNrYWdlKCJmb28iKTsKLSAgZmlsZTEuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiRm9vIik7Ci0gIGZpbGUyYS5zZXRfbmFtZSgiYmFyLnByb3RvIik7Ci0gIGZpbGUyYi5zZXRfcGFja2FnZSgiYmFyIik7Ci0gIGZpbGUyYi5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJCYXIiKTsKLQotICAvLyBOb3JtYWwgc2VyaWFsaXphdGlvbiBhbGxvd3Mgb3VyIG9wdGltaXphdGlvbiB0byBraWNrIGluLgotICBzdHJpbmcgZGF0YTEgPSBmaWxlMS5TZXJpYWxpemVBc1N0cmluZygpOwotCi0gIC8vIEZvcmNlIG91dC1vZi1vcmRlciBzZXJpYWxpemF0aW9uIHRvIHRlc3Qgc2xvdyBwYXRoLgotICBzdHJpbmcgZGF0YTIgPSBmaWxlMmIuU2VyaWFsaXplQXNTdHJpbmcoKSArIGZpbGUyYS5TZXJpYWxpemVBc1N0cmluZygpOwotCi0gIC8vIENyZWF0ZSBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlIGNvbnRhaW5pbmcgYm90aCBmaWxlcy4KLSAgRW5jb2RlZERlc2NyaXB0b3JEYXRhYmFzZSBkYjsKLSAgZGIuQWRkKGRhdGExLmRhdGEoKSwgZGF0YTEuc2l6ZSgpKTsKLSAgZGIuQWRkKGRhdGEyLmRhdGEoKSwgZGF0YTIuc2l6ZSgpKTsKLQotICAvLyBUZXN0IQotICBzdHJpbmcgZmlsZW5hbWU7Ci0gIEVYUEVDVF9UUlVFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiZm9vLkZvbyIsICZmaWxlbmFtZSkpOwotICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGVuYW1lKTsKLSAgRVhQRUNUX1RSVUUoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJmb28uRm9vLkJsYWgiLCAmZmlsZW5hbWUpKTsKLSAgRVhQRUNUX0VRKCJmb28ucHJvdG8iLCBmaWxlbmFtZSk7Ci0gIEVYUEVDVF9UUlVFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiYmFyLkJhciIsICZmaWxlbmFtZSkpOwotICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGVuYW1lKTsKLSAgRVhQRUNUX0ZBTFNFKGRiLkZpbmROYW1lT2ZGaWxlQ29udGFpbmluZ1N5bWJvbCgiZm9vIiwgJmZpbGVuYW1lKSk7Ci0gIEVYUEVDVF9GQUxTRShkYi5GaW5kTmFtZU9mRmlsZUNvbnRhaW5pbmdTeW1ib2woImJhciIsICZmaWxlbmFtZSkpOwotICBFWFBFQ1RfRkFMU0UoZGIuRmluZE5hbWVPZkZpbGVDb250YWluaW5nU3ltYm9sKCJiYXouQmF6IiwgJmZpbGVuYW1lKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIE1lcmdlZERlc2NyaXB0b3JEYXRhYmFzZVRlc3QoKQotICAgIDogZm9yd2FyZF9tZXJnZWRfKCZkYXRhYmFzZTFfLCAmZGF0YWJhc2UyXyksCi0gICAgICByZXZlcnNlX21lcmdlZF8oJmRhdGFiYXNlMl8sICZkYXRhYmFzZTFfKSB7fQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBBZGRUb0RhdGFiYXNlKCZkYXRhYmFzZTFfLAotICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJGb29cIiBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMCB9IH0gIgotICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJmb29fZXh0XCIgZXh0ZW5kZWU6IFwiLkZvb1wiIG51bWJlcjozICIKLSAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKLSAgICBBZGRUb0RhdGFiYXNlKCZkYXRhYmFzZTJfLAotICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6XCJCYXJcIiBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMCB9IH0gIgotICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXJfZXh0XCIgZXh0ZW5kZWU6IFwiLkJhclwiIG51bWJlcjo1ICIKLSAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKLQotICAgIC8vIGJhei5wcm90byBleGlzdHMgaW4gYm90aCBwb29scywgd2l0aCBkaWZmZXJlbnQgZGVmaW5pdGlvbnMuCi0gICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2UxXywKLSAgICAgICJuYW1lOiBcImJhei5wcm90b1wiICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiQmF6XCIgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAgfSB9ICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiRnJvbVBvb2wxXCIgfSAiCi0gICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImJhel9leHRcIiBleHRlbmRlZTogXCIuQmF6XCIgbnVtYmVyOjEyICIKLSAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiCi0gICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImRhdGFiYXNlMV9vbmx5X2V4dFwiIGV4dGVuZGVlOiBcIi5CYXpcIiBudW1iZXI6MTMgIgotICAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIpOwotICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlMl8sCi0gICAgICAibmFtZTogXCJiYXoucHJvdG9cIiAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkJhelwiIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkZyb21Qb29sMlwiIH0gIgotICAgICAgImV4dGVuc2lvbiB7IG5hbWU6XCJiYXpfZXh0XCIgZXh0ZW5kZWU6IFwiLkJhelwiIG51bWJlcjoxMiAiCi0gICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIik7Ci0gIH0KLQotICBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UgZGF0YWJhc2UxXzsKLSAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlMl87Ci0KLSAgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlIGZvcndhcmRfbWVyZ2VkXzsKLSAgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlIHJldmVyc2VfbWVyZ2VkXzsKLX07Ci0KLVRFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUJ5TmFtZSkgewotICB7Ci0gICAgLy8gQ2FuIGZpbmQgZmlsZSB0aGF0IGlzIG9ubHkgaW4gZGF0YWJhc2UxXy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRm9vIik7Ci0gIH0KLQotICB7Ci0gICAgLy8gQ2FuIGZpbmQgZmlsZSB0aGF0IGlzIG9ubHkgaW4gZGF0YWJhc2UyXy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQnlOYW1lKCJiYXIucHJvdG8iLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiQmFyIik7Ci0gIH0KLQotICB7Ci0gICAgLy8gSW4gZm9yd2FyZF9tZXJnZWRfLCBkYXRhYmFzZTFfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIiwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZyb21Qb29sMSIpOwotICB9Ci0KLSAgewotICAgIC8vIEluIHJldmVyc2VfbWVyZ2VkXywgZGF0YWJhc2UyXydzIGJhei5wcm90byB0YWtlcyBwcmVjZWRlbmNlLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfVFJVRShyZXZlcnNlX21lcmdlZF8uRmluZEZpbGVCeU5hbWUoImJhei5wcm90byIsICZmaWxlKSk7Ci0gICAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBmaWxlLm5hbWUoKSk7Ci0gICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGcm9tUG9vbDIiKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4ndCBmaW5kIG5vbi1leGlzdGVudCBmaWxlLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfRkFMU0UoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQnlOYW1lKCJub19zdWNoLnByb3RvIiwgJmZpbGUpKTsKLSAgfQotfQotCi1URVNUX0YoTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKSB7Ci0gIHsKLSAgICAvLyBDYW4gZmluZCBmaWxlIHRoYXQgaXMgb25seSBpbiBkYXRhYmFzZTFfLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28iLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRm9vIik7Ci0gIH0KLQotICB7Ci0gICAgLy8gQ2FuIGZpbmQgZmlsZSB0aGF0IGlzIG9ubHkgaW4gZGF0YWJhc2UyXy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiQmFyIiwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkJhciIpOwotICB9Ci0KLSAgewotICAgIC8vIEluIGZvcndhcmRfbWVyZ2VkXywgZGF0YWJhc2UxXydzIGJhei5wcm90byB0YWtlcyBwcmVjZWRlbmNlLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJCYXoiLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wxIik7Ci0gIH0KLQotICB7Ci0gICAgLy8gSW4gcmV2ZXJzZV9tZXJnZWRfLCBkYXRhYmFzZTJfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKHJldmVyc2VfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkJheiIsICZmaWxlKSk7Ci0gICAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBmaWxlLm5hbWUoKSk7Ci0gICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGcm9tUG9vbDIiKTsKLSAgfQotCi0gIHsKLSAgICAvLyBGcm9tUG9vbDEgb25seSBzaG93cyB1cCBpbiBmb3J3YXJkX21lcmdlZF8gYmVjYXVzZSBpdCBpcyBtYXNrZWQgYnkKLSAgICAvLyBkYXRhYmFzZTJfJ3MgYmF6LnByb3RvIGluIHJldmVyc2VfbWVyZ2VkXy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRnJvbVBvb2wxIiwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRkFMU0UocmV2ZXJzZV9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRnJvbVBvb2wxIiwgJmZpbGUpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDYW4ndCBmaW5kIG5vbi1leGlzdGVudCBzeW1ib2wuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9GQUxTRSgKLSAgICAgIGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIk5vU3VjaFR5cGUiLCAmZmlsZSkpOwotICB9Ci19Ci0KLVRFU1RfRihNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2VUZXN0LCBGaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24pIHsKLSAgewotICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMV8uCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKAotICAgICAgZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiRm9vIiwgMywgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkZvbyIpOwotICB9Ci0KLSAgewotICAgIC8vIENhbiBmaW5kIGZpbGUgdGhhdCBpcyBvbmx5IGluIGRhdGFiYXNlMl8uCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKAotICAgICAgZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiQmFyIiwgNSwgJmZpbGUpKTsKLSAgICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGZpbGUubmFtZSgpKTsKLSAgICBFeHBlY3RDb250YWluc1R5cGUoZmlsZSwgIkJhciIpOwotICB9Ci0KLSAgewotICAgIC8vIEluIGZvcndhcmRfbWVyZ2VkXywgZGF0YWJhc2UxXydzIGJhei5wcm90byB0YWtlcyBwcmVjZWRlbmNlLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgICBFWFBFQ1RfVFJVRSgKLSAgICAgIGZvcndhcmRfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJheiIsIDEyLCAmZmlsZSkpOwotICAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgZmlsZS5uYW1lKCkpOwotICAgIEV4cGVjdENvbnRhaW5zVHlwZShmaWxlLCAiRnJvbVBvb2wxIik7Ci0gIH0KLQotICB7Ci0gICAgLy8gSW4gcmV2ZXJzZV9tZXJnZWRfLCBkYXRhYmFzZTJfJ3MgYmF6LnByb3RvIHRha2VzIHByZWNlZGVuY2UuCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICAgIEVYUEVDVF9UUlVFKAotICAgICAgcmV2ZXJzZV9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiQmF6IiwgMTIsICZmaWxlKSk7Ci0gICAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBmaWxlLm5hbWUoKSk7Ci0gICAgRXhwZWN0Q29udGFpbnNUeXBlKGZpbGUsICJGcm9tUG9vbDIiKTsKLSAgfQotCi0gIHsKLSAgICAvLyBCYXoncyBleHRlbnNpb24gMTMgb25seSBzaG93cyB1cCBpbiBmb3J3YXJkX21lcmdlZF8gYmVjYXVzZSBpdCBpcwotICAgIC8vIG1hc2tlZCBieSBkYXRhYmFzZTJfJ3MgYmF6LnByb3RvIGluIHJldmVyc2VfbWVyZ2VkXy4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiQmF6IiwgMTMsICZmaWxlKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKHJldmVyc2VfbWVyZ2VkXy5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oIkJheiIsIDEzLCAmZmlsZSkpOwotICB9Ci0KLSAgewotICAgIC8vIENhbid0IGZpbmQgbm9uLWV4aXN0ZW50IGV4dGVuc2lvbi4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgRVhQRUNUX0ZBTFNFKAotICAgICAgZm9yd2FyZF9tZXJnZWRfLkZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigiRm9vIiwgNiwgJmZpbGUpKTsKLSAgfQotfQotCi1URVNUX0YoTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlVGVzdCwgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMpIHsKLSAgewotICAgIC8vIE1lc3NhZ2Ugb25seSBoYXMgZXh0ZW5zaW9uIGluIGRhdGFiYXNlMV8KLSAgICB2ZWN0b3I8aW50PiBudW1iZXJzOwotICAgIEVYUEVDVF9UUlVFKGZvcndhcmRfbWVyZ2VkXy5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycygiRm9vIiwgJm51bWJlcnMpKTsKLSAgICBBU1NFUlRfRVEoMSwgbnVtYmVycy5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgzLCBudW1iZXJzWzBdKTsKLSAgfQotCi0gIHsKLSAgICAvLyBNZXNzYWdlIG9ubHkgaGFzIGV4dGVuc2lvbiBpbiBkYXRhYmFzZTJfCi0gICAgdmVjdG9yPGludD4gbnVtYmVyczsKLSAgICBFWFBFQ1RfVFJVRShmb3J3YXJkX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJhciIsICZudW1iZXJzKSk7Ci0gICAgQVNTRVJUX0VRKDEsIG51bWJlcnMuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoNSwgbnVtYmVyc1swXSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gTWVyZ2UgcmVzdWx0cyBmcm9tIHRoZSB0d28gZGF0YWJhc2VzLgotICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7Ci0gICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJCYXoiLCAmbnVtYmVycykpOwotICAgIEFTU0VSVF9FUSgyLCBudW1iZXJzLnNpemUoKSk7Ci0gICAgc3RkOjpzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKDEyLCBudW1iZXJzWzBdKTsKLSAgICBFWFBFQ1RfRVEoMTMsIG51bWJlcnNbMV0pOwotICB9Ci0KLSAgewotICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7Ci0gICAgRVhQRUNUX1RSVUUocmV2ZXJzZV9tZXJnZWRfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJCYXoiLCAmbnVtYmVycykpOwotICAgIEFTU0VSVF9FUSgyLCBudW1iZXJzLnNpemUoKSk7Ci0gICAgc3RkOjpzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7Ci0gICAgRVhQRUNUX0VRKDEyLCBudW1iZXJzWzBdKTsKLSAgICBFWFBFQ1RfRVEoMTMsIG51bWJlcnNbMV0pOwotICB9Ci0KLSAgewotICAgIC8vIENhbid0IGZpbmQgZXh0ZW5zaW9ucyBmb3IgYSBub24tZXhpc3RlbnQgbWVzc2FnZS4KLSAgICB2ZWN0b3I8aW50PiBudW1iZXJzOwotICAgIEVYUEVDVF9GQUxTRShyZXZlcnNlX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJsYWgiLCAmbnVtYmVycykpOwotICB9Ci19Ci0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmOTM3YjllLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDY2MTMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgZmlsZSBtYWtlcyBleHRlbnNpdmUgdXNlIG9mIFJGQyAzMDkyLiAgOikKLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0vLyBDYW4ndCB1c2UgYW4gYW5vbnltb3VzIG5hbWVzcGFjZSBoZXJlIGR1ZSB0byBicm9rZW5uZXNzIG9mIFRydTY0IGNvbXBpbGVyLgotbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QgewotCi0vLyBTb21lIGhlbHBlcnMgdG8gbWFrZSBhc3NlbWJsaW5nIGRlc2NyaXB0b3JzIGZhc3Rlci4KLURlc2NyaXB0b3JQcm90byogQWRkTWVzc2FnZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgRGVzY3JpcHRvclByb3RvKiByZXN1bHQgPSBmaWxlLT5hZGRfbWVzc2FnZV90eXBlKCk7Ci0gIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLURlc2NyaXB0b3JQcm90byogQWRkTmVzdGVkTWVzc2FnZShEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfbmVzdGVkX3R5cGUoKTsKLSAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRW51bURlc2NyaXB0b3JQcm90byogQWRkRW51bShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgRW51bURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZmlsZS0+YWRkX2VudW1fdHlwZSgpOwotICByZXN1bHQtPnNldF9uYW1lKG5hbWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1FbnVtRGVzY3JpcHRvclByb3RvKiBBZGROZXN0ZWRFbnVtKERlc2NyaXB0b3JQcm90byogcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgRW51bURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfZW51bV90eXBlKCk7Ci0gIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLVNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIEFkZFNlcnZpY2UoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IGZpbGUtPmFkZF9zZXJ2aWNlKCk7Ci0gIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUZpZWxkRGVzY3JpcHRvclByb3RvKiBBZGRGaWVsZChEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsIGxhYmVsLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUpIHsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IHBhcmVudC0+YWRkX2ZpZWxkKCk7Ci0gIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7Ci0gIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOwotICByZXN1bHQtPnNldF9sYWJlbChsYWJlbCk7Ci0gIHJlc3VsdC0+c2V0X3R5cGUodHlwZSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLUZpZWxkRGVzY3JpcHRvclByb3RvKiBBZGRFeHRlbnNpb24oRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBleHRlbmRlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWwgbGFiZWwsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUpIHsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IGZpbGUtPmFkZF9leHRlbnNpb24oKTsKLSAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKLSAgcmVzdWx0LT5zZXRfbnVtYmVyKG51bWJlcik7Ci0gIHJlc3VsdC0+c2V0X2xhYmVsKGxhYmVsKTsKLSAgcmVzdWx0LT5zZXRfdHlwZSh0eXBlKTsKLSAgcmVzdWx0LT5zZXRfZXh0ZW5kZWUoZXh0ZW5kZWUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1GaWVsZERlc2NyaXB0b3JQcm90byogQWRkTmVzdGVkRXh0ZW5zaW9uKERlc2NyaXB0b3JQcm90byogcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGV4dGVuZGVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGludCBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGUgdHlwZSkgewotICBGaWVsZERlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uKCk7Ci0gIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7Ci0gIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOwotICByZXN1bHQtPnNldF9sYWJlbChsYWJlbCk7Ci0gIHJlc3VsdC0+c2V0X3R5cGUodHlwZSk7Ci0gIHJlc3VsdC0+c2V0X2V4dGVuZGVlKGV4dGVuZGVlKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogQWRkRXh0ZW5zaW9uUmFuZ2UoRGVzY3JpcHRvclByb3RvKiBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgRGVzY3JpcHRvclByb3RvOjpFeHRlbnNpb25SYW5nZSogcmVzdWx0ID0gcGFyZW50LT5hZGRfZXh0ZW5zaW9uX3JhbmdlKCk7Ci0gIHJlc3VsdC0+c2V0X3N0YXJ0KHN0YXJ0KTsKLSAgcmVzdWx0LT5zZXRfZW5kKGVuZCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLURlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSogQWRkUmVzZXJ2ZWRSYW5nZShEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKLSAgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlKiByZXN1bHQgPSBwYXJlbnQtPmFkZF9yZXNlcnZlZF9yYW5nZSgpOwotICByZXN1bHQtPnNldF9zdGFydChzdGFydCk7Ci0gIHJlc3VsdC0+c2V0X2VuZChlbmQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEFkZEVudW1WYWx1ZShFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3Byb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgbnVtYmVyKSB7Ci0gIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZW51bV9wcm90by0+YWRkX3ZhbHVlKCk7Ci0gIHJlc3VsdC0+c2V0X25hbWUobmFtZSk7Ci0gIHJlc3VsdC0+c2V0X251bWJlcihudW1iZXIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1NZXRob2REZXNjcmlwdG9yUHJvdG8qIEFkZE1ldGhvZChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbnB1dF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvdXRwdXRfdHlwZSkgewotICBNZXRob2REZXNjcmlwdG9yUHJvdG8qIHJlc3VsdCA9IHNlcnZpY2UtPmFkZF9tZXRob2QoKTsKLSAgcmVzdWx0LT5zZXRfbmFtZShuYW1lKTsKLSAgcmVzdWx0LT5zZXRfaW5wdXRfdHlwZShpbnB1dF90eXBlKTsKLSAgcmVzdWx0LT5zZXRfb3V0cHV0X3R5cGUob3V0cHV0X3R5cGUpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBFbXB0eSBlbnVtcyB0ZWNobmljYWxseSBhcmVuJ3QgYWxsb3dlZC4gIFdlIG5lZWQgdG8gaW5zZXJ0IGEgZHVtbXkgdmFsdWUKLS8vIGludG8gdGhlbS4KLXZvaWQgQWRkRW1wdHlFbnVtKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsIGNvbnN0IHN0cmluZyYgbmFtZSkgewotICBBZGRFbnVtVmFsdWUoQWRkRW51bShmaWxlLCBuYW1lKSwgbmFtZSArICJfRFVNTVkiLCAxKTsKLX0KLQotY2xhc3MgTW9ja0Vycm9yQ29sbGVjdG9yIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7Ci0gcHVibGljOgotICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotICB+TW9ja0Vycm9yQ29sbGVjdG9yKCkge30KLQotICBzdHJpbmcgdGV4dF87Ci0gIHN0cmluZyB3YXJuaW5nX3RleHRfOwotCi0gIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBjb25zdCBjaGFyKiBsb2NhdGlvbl9uYW1lID0gTlVMTDsKLSAgICBzd2l0Y2ggKGxvY2F0aW9uKSB7Ci0gICAgICBjYXNlIE5BTUUgICAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiTkFNRSIgICAgICAgICA7IGJyZWFrOwotICAgICAgY2FzZSBOVU1CRVIgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk5VTUJFUiIgICAgICAgOyBicmVhazsKLSAgICAgIGNhc2UgVFlQRSAgICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJUWVBFIiAgICAgICAgIDsgYnJlYWs7Ci0gICAgICBjYXNlIEVYVEVOREVFICAgICA6IGxvY2F0aW9uX25hbWUgPSAiRVhURU5ERUUiICAgICA7IGJyZWFrOwotICAgICAgY2FzZSBERUZBVUxUX1ZBTFVFOiBsb2NhdGlvbl9uYW1lID0gIkRFRkFVTFRfVkFMVUUiOyBicmVhazsKLSAgICAgIGNhc2UgT1BUSU9OX05BTUUgIDogbG9jYXRpb25fbmFtZSA9ICJPUFRJT05fTkFNRSIgIDsgYnJlYWs7Ci0gICAgICBjYXNlIE9QVElPTl9WQUxVRSA6IGxvY2F0aW9uX25hbWUgPSAiT1BUSU9OX1ZBTFVFIiA7IGJyZWFrOwotICAgICAgY2FzZSBJTlBVVF9UWVBFICAgOiBsb2NhdGlvbl9uYW1lID0gIklOUFVUX1RZUEUiICAgOyBicmVhazsKLSAgICAgIGNhc2UgT1VUUFVUX1RZUEUgIDogbG9jYXRpb25fbmFtZSA9ICJPVVRQVVRfVFlQRSIgIDsgYnJlYWs7Ci0gICAgICBjYXNlIE9USEVSICAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiT1RIRVIiICAgICAgICA7IGJyZWFrOwotICAgIH0KLQotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoCi0gICAgICAmdGV4dF8sICIkMDogJDE6ICQyOiAkM1xuIiwKLSAgICAgIGZpbGVuYW1lLCBlbGVtZW50X25hbWUsIGxvY2F0aW9uX25hbWUsIG1lc3NhZ2UpOwotICB9Ci0KLSAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdm9pZCBBZGRXYXJuaW5nKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAotICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uX25hbWUgPSBOVUxMOwotICAgIHN3aXRjaCAobG9jYXRpb24pIHsKLSAgICAgIGNhc2UgTkFNRSAgICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJOQU1FIiAgICAgICAgIDsgYnJlYWs7Ci0gICAgICBjYXNlIE5VTUJFUiAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiTlVNQkVSIiAgICAgICA7IGJyZWFrOwotICAgICAgY2FzZSBUWVBFICAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIlRZUEUiICAgICAgICAgOyBicmVhazsKLSAgICAgIGNhc2UgRVhURU5ERUUgICAgIDogbG9jYXRpb25fbmFtZSA9ICJFWFRFTkRFRSIgICAgIDsgYnJlYWs7Ci0gICAgICBjYXNlIERFRkFVTFRfVkFMVUU6IGxvY2F0aW9uX25hbWUgPSAiREVGQVVMVF9WQUxVRSI7IGJyZWFrOwotICAgICAgY2FzZSBPUFRJT05fTkFNRSAgOiBsb2NhdGlvbl9uYW1lID0gIk9QVElPTl9OQU1FIiAgOyBicmVhazsKLSAgICAgIGNhc2UgT1BUSU9OX1ZBTFVFIDogbG9jYXRpb25fbmFtZSA9ICJPUFRJT05fVkFMVUUiIDsgYnJlYWs7Ci0gICAgICBjYXNlIElOUFVUX1RZUEUgICA6IGxvY2F0aW9uX25hbWUgPSAiSU5QVVRfVFlQRSIgICA7IGJyZWFrOwotICAgICAgY2FzZSBPVVRQVVRfVFlQRSAgOiBsb2NhdGlvbl9uYW1lID0gIk9VVFBVVF9UWVBFIiAgOyBicmVhazsKLSAgICAgIGNhc2UgT1RIRVIgICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJPVEhFUiIgICAgICAgIDsgYnJlYWs7Ci0gICAgfQotCi0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgKLSAgICAgICZ3YXJuaW5nX3RleHRfLCAiJDA6ICQxOiAkMjogJDNcbiIsCi0gICAgICBmaWxlbmFtZSwgZWxlbWVudF9uYW1lLCBsb2NhdGlvbl9uYW1lLCBtZXNzYWdlKTsKLSAgfQotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBUZXN0IHNpbXBsZSBmaWxlcy4KLWNsYXNzIEZpbGVEZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLSAgICAvLwotICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKLSAgICAvLyAgIG1lc3NhZ2UgRm9vTWVzc2FnZSB7IGV4dGVuc2lvbnMgMTsgfQotICAgIC8vICAgZW51bSBGb29FbnVtIHtGT09fRU5VTV9WQUxVRSA9IDE7fQotICAgIC8vICAgc2VydmljZSBGb29TZXJ2aWNlIHt9Ci0gICAgLy8gICBleHRlbmQgRm9vTWVzc2FnZSB7IG9wdGlvbmFsIGludDMyIGZvb19leHRlbnNpb24gPSAxOyB9Ci0gICAgLy8KLSAgICAvLyAgIC8vIGluICJiYXIucHJvdG8iCi0gICAgLy8gICBwYWNrYWdlIGJhcl9wYWNrYWdlOwotICAgIC8vICAgbWVzc2FnZSBCYXJNZXNzYWdlIHsgZXh0ZW5zaW9ucyAxOyB9Ci0gICAgLy8gICBlbnVtIEJhckVudW0ge0JBUl9FTlVNX1ZBTFVFID0gMTt9Ci0gICAgLy8gICBzZXJ2aWNlIEJhclNlcnZpY2Uge30KLSAgICAvLyAgIGV4dGVuZCBCYXJNZXNzYWdlIHsgb3B0aW9uYWwgaW50MzIgYmFyX2V4dGVuc2lvbiA9IDE7IH0KLSAgICAvLwotICAgIC8vIEFsc28sIHdlIGhhdmUgYW4gZW1wdHkgZmlsZSAiYmF6LnByb3RvIi4gIFRoaXMgZmlsZSdzIHB1cnBvc2UgaXMgdG8KLSAgICAvLyBtYWtlIHN1cmUgdGhhdCBldmVuIHRob3VnaCBpdCBoYXMgdGhlIHNhbWUgcGFja2FnZSBhcyBmb28ucHJvdG8sCi0gICAgLy8gc2VhcmNoaW5nIGl0IGZvciBtZW1iZXJzIG9mIGZvby5wcm90byB3b24ndCB3b3JrLgotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKLSAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0gICAgQWRkRXh0ZW5zaW9uUmFuZ2UoQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJGb29NZXNzYWdlIiksIDEsIDIpOwotICAgIEFkZEVudW1WYWx1ZShBZGRFbnVtKCZmb29fZmlsZSwgIkZvb0VudW0iKSwgIkZPT19FTlVNX1ZBTFVFIiwgMSk7Ci0gICAgQWRkU2VydmljZSgmZm9vX2ZpbGUsICJGb29TZXJ2aWNlIik7Ci0gICAgQWRkRXh0ZW5zaW9uKCZmb29fZmlsZSwgIkZvb01lc3NhZ2UiLCAiZm9vX2V4dGVuc2lvbiIsIDEsCi0gICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKLSAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7Ci0gICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImJhcl9wYWNrYWdlIik7Ci0gICAgYmFyX2ZpbGUuYWRkX2RlcGVuZGVuY3koImZvby5wcm90byIpOwotICAgIEFkZEV4dGVuc2lvblJhbmdlKEFkZE1lc3NhZ2UoJmJhcl9maWxlLCAiQmFyTWVzc2FnZSIpLCAxLCAyKTsKLSAgICBBZGRFbnVtVmFsdWUoQWRkRW51bSgmYmFyX2ZpbGUsICJCYXJFbnVtIiksICJCQVJfRU5VTV9WQUxVRSIsIDEpOwotICAgIEFkZFNlcnZpY2UoJmJhcl9maWxlLCAiQmFyU2VydmljZSIpOwotICAgIEFkZEV4dGVuc2lvbigmYmFyX2ZpbGUsICJiYXJfcGFja2FnZS5CYXJNZXNzYWdlIiwgImJhcl9leHRlbnNpb24iLCAxLAotICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLQotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmF6X2ZpbGU7Ci0gICAgYmF6X2ZpbGUuc2V0X25hbWUoImJhei5wcm90byIpOwotCi0gICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgotICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7Ci0gICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOwotCi0gICAgYmFyX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGJhcl9maWxlKTsKLSAgICBBU1NFUlRfVFJVRShiYXJfZmlsZV8gIT0gTlVMTCk7Ci0KLSAgICBiYXpfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmF6X2ZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGJhel9maWxlXyAhPSBOVUxMKTsKLQotICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBmb29fbWVzc2FnZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKLSAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSk7Ci0gICAgZm9vX2VudW1fID0gZm9vX2ZpbGVfLT5lbnVtX3R5cGUoMCk7Ci0gICAgQVNTRVJUX0VRKDEsIGZvb19lbnVtXy0+dmFsdWVfY291bnQoKSk7Ci0gICAgZm9vX2VudW1fdmFsdWVfID0gZm9vX2VudW1fLT52YWx1ZSgwKTsKLSAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5zZXJ2aWNlX2NvdW50KCkpOwotICAgIGZvb19zZXJ2aWNlXyA9IGZvb19maWxlXy0+c2VydmljZSgwKTsKLSAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5leHRlbnNpb25fY291bnQoKSk7Ci0gICAgZm9vX2V4dGVuc2lvbl8gPSBmb29fZmlsZV8tPmV4dGVuc2lvbigwKTsKLQotICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBiYXJfbWVzc2FnZV8gPSBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKLSAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5lbnVtX3R5cGVfY291bnQoKSk7Ci0gICAgYmFyX2VudW1fID0gYmFyX2ZpbGVfLT5lbnVtX3R5cGUoMCk7Ci0gICAgQVNTRVJUX0VRKDEsIGJhcl9lbnVtXy0+dmFsdWVfY291bnQoKSk7Ci0gICAgYmFyX2VudW1fdmFsdWVfID0gYmFyX2VudW1fLT52YWx1ZSgwKTsKLSAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5zZXJ2aWNlX2NvdW50KCkpOwotICAgIGJhcl9zZXJ2aWNlXyA9IGJhcl9maWxlXy0+c2VydmljZSgwKTsKLSAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5leHRlbnNpb25fY291bnQoKSk7Ci0gICAgYmFyX2V4dGVuc2lvbl8gPSBiYXJfZmlsZV8tPmV4dGVuc2lvbigwKTsKLSAgfQotCi0gIERlc2NyaXB0b3JQb29sIHBvb2xfOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXpfZmlsZV87Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogICAgICAgICAgZm9vX21lc3NhZ2VfOwotICBjb25zdCBFbnVtRGVzY3JpcHRvciogICAgICBmb29fZW51bV87Ci0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvb19lbnVtX3ZhbHVlXzsKLSAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqICAgZm9vX3NlcnZpY2VfOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqICAgICBmb29fZXh0ZW5zaW9uXzsKLQotICBjb25zdCBEZXNjcmlwdG9yKiAgICAgICAgICBiYXJfbWVzc2FnZV87Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiAgICAgIGJhcl9lbnVtXzsKLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYmFyX2VudW1fdmFsdWVfOwotICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogICBiYXJfc2VydmljZV87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogICAgIGJhcl9leHRlbnNpb25fOwotfTsKLQotVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgTmFtZSkgewotICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZvb19maWxlXy0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBiYXJfZmlsZV8tPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgYmF6X2ZpbGVfLT5uYW1lKCkpOwotfQotCi1URVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBQYWNrYWdlKSB7Ci0gIEVYUEVDVF9FUSgiIiwgZm9vX2ZpbGVfLT5wYWNrYWdlKCkpOwotICBFWFBFQ1RfRVEoImJhcl9wYWNrYWdlIiwgYmFyX2ZpbGVfLT5wYWNrYWdlKCkpOwotfQotCi1URVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBEZXBlbmRlbmNpZXMpIHsKLSAgRVhQRUNUX0VRKDAsIGZvb19maWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDEsIGJhcl9maWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKGZvb19maWxlXywgYmFyX2ZpbGVfLT5kZXBlbmRlbmN5KDApKTsKLX0KLQotVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZE1lc3NhZ2VUeXBlQnlOYW1lKSB7Ci0gIEVYUEVDVF9FUShmb29fbWVzc2FnZV8sIGZvb19maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29NZXNzYWdlIikpOwotICBFWFBFQ1RfRVEoYmFyX21lc3NhZ2VfLCBiYXJfZmlsZV8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQmFyTWVzc2FnZSIpKTsKLQotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQmFyTWVzc2FnZSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShiYXJfZmlsZV8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vTWVzc2FnZSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShiYXpfZmlsZV8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vTWVzc2FnZSIpID09IE5VTEwpOwotCi0gIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hNZXNzYWdlIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb29FbnVtIikgPT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRFbnVtVHlwZUJ5TmFtZSkgewotICBFWFBFQ1RfRVEoZm9vX2VudW1fLCBmb29fZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vRW51bSIpKTsKLSAgRVhQRUNUX0VRKGJhcl9lbnVtXywgYmFyX2ZpbGVfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJhckVudW0iKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJhckVudW0iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoYmFyX2ZpbGVfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkZvb0VudW0iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoYmF6X2ZpbGVfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkZvb0VudW0iKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoRW51bSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vTWVzc2FnZSIpID09IE5VTEwpOwotfQotCi1URVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVZhbHVlQnlOYW1lKSB7Ci0gIEVYUEVDVF9FUShmb29fZW51bV92YWx1ZV8sIGZvb19maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiRk9PX0VOVU1fVkFMVUUiKSk7Ci0gIEVYUEVDVF9FUShiYXJfZW51bV92YWx1ZV8sIGJhcl9maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQkFSX0VOVU1fVkFMVUUiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCQVJfRU5VTV9WQUxVRSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShiYXJfZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkZPT19FTlVNX1ZBTFVFIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiRk9PX0VOVU1fVkFMVUUiKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGb29NZXNzYWdlIikgPT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEZpbmRTZXJ2aWNlQnlOYW1lKSB7Ci0gIEVYUEVDVF9FUShmb29fc2VydmljZV8sIGZvb19maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIkZvb1NlcnZpY2UiKSk7Ci0gIEVYUEVDVF9FUShiYXJfc2VydmljZV8sIGJhcl9maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIkJhclNlcnZpY2UiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kU2VydmljZUJ5TmFtZSgiQmFyU2VydmljZSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShiYXJfZmlsZV8tPkZpbmRTZXJ2aWNlQnlOYW1lKCJGb29TZXJ2aWNlIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGJhel9maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIkZvb1NlcnZpY2UiKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRTZXJ2aWNlQnlOYW1lKCJOb1N1Y2hTZXJ2aWNlIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZFNlcnZpY2VCeU5hbWUoIkZvb01lc3NhZ2UiKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgRmluZEV4dGVuc2lvbkJ5TmFtZSkgewotICBFWFBFQ1RfRVEoZm9vX2V4dGVuc2lvbl8sIGZvb19maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX2V4dGVuc2lvbiIpKTsKLSAgRVhQRUNUX0VRKGJhcl9leHRlbnNpb25fLCBiYXJfZmlsZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImJhcl9leHRlbnNpb24iKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZm9vX2ZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJiYXJfZXh0ZW5zaW9uIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGJhcl9maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX2V4dGVuc2lvbiIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShiYXpfZmlsZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19leHRlbnNpb24iKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPkZpbmRFeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiRm9vTWVzc2FnZSIpID09IE5VTEwpOwotfQotCi1URVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOdW1iZXIpIHsKLSAgRVhQRUNUX0VRKGZvb19leHRlbnNpb25fLCBwb29sXy5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vX21lc3NhZ2VfLCAxKSk7Ci0gIEVYUEVDVF9FUShiYXJfZXh0ZW5zaW9uXywgcG9vbF8uRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGJhcl9tZXNzYWdlXywgMSkpOwotCi0gIEVYUEVDVF9UUlVFKHBvb2xfLkZpbmRFeHRlbnNpb25CeU51bWJlcihmb29fbWVzc2FnZV8sIDIpID09IE5VTEwpOwotfQotCi1URVNUX0YoRmlsZURlc2NyaXB0b3JUZXN0LCBCdWlsZEFnYWluKSB7Ci0gIC8vIFRlc3QgdGhhdCBpZiB0ZSBjYWxsIEJ1aWxkRmlsZSBhZ2FpbiBvbiB0aGUgc2FtZSBpbnB1dCB3ZSBnZXQgdGhlIHNhbWUKLSAgLy8gRmlsZURlc2NyaXB0b3IgYmFjay4KLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlOwotICBmb29fZmlsZV8tPkNvcHlUbygmZmlsZSk7Ci0gIEVYUEVDVF9FUShmb29fZmlsZV8sIHBvb2xfLkJ1aWxkRmlsZShmaWxlKSk7Ci0KLSAgLy8gQnV0IGlmIHdlIGNoYW5nZSB0aGUgZmlsZSB0aGVuIGl0IHdvbid0IHdvcmsuCi0gIGZpbGUuc2V0X3BhY2thZ2UoInNvbWUub3RoZXIucGFja2FnZSIpOwotICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGUoZmlsZSkgPT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEJ1aWxkQWdhaW5XaXRoU3ludGF4KSB7Ci0gIC8vIFRlc3QgdGhhdCBpZiB0ZSBjYWxsIEJ1aWxkRmlsZSBhZ2FpbiBvbiB0aGUgc2FtZSBpbnB1dCB3ZSBnZXQgdGhlIHNhbWUKLSAgLy8gRmlsZURlc2NyaXB0b3IgYmFjayBldmVuIGlmIHN5bnRheCBwYXJhbSBpcyBzcGVjaWZpZWQuCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fc3ludGF4MjsKLSAgcHJvdG9fc3ludGF4Mi5zZXRfbmFtZSgiZm9vX3N5bnRheDIiKTsKLSAgcHJvdG9fc3ludGF4Mi5zZXRfc3ludGF4KCJwcm90bzIiKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHJvdG8yX2Rlc2NyaXB0b3IgPSBwb29sXy5CdWlsZEZpbGUocHJvdG9fc3ludGF4Mik7Ci0gIEVYUEVDVF9UUlVFKHByb3RvMl9kZXNjcmlwdG9yICE9IE5VTEwpOwotICBFWFBFQ1RfRVEocHJvdG8yX2Rlc2NyaXB0b3IsIHBvb2xfLkJ1aWxkRmlsZShwcm90b19zeW50YXgyKSk7Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBpbXBsaWNpdF9wcm90bzI7Ci0gIGltcGxpY2l0X3Byb3RvMi5zZXRfbmFtZSgiZm9vX2ltcGxpY2l0X3N5bnRheDIiKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogaW1wbGljaXRfcHJvdG8yX2Rlc2NyaXB0b3IgPQotICAgICAgcG9vbF8uQnVpbGRGaWxlKGltcGxpY2l0X3Byb3RvMik7Ci0gIEVYUEVDVF9UUlVFKGltcGxpY2l0X3Byb3RvMl9kZXNjcmlwdG9yICE9IE5VTEwpOwotICAvLyBXZSBnZXQgdGhlIHNhbWUgRmlsZURlc2NyaXB0b3IgYmFjayBpZiBzeW50YXggcGFyYW0gaXMgZXhwbGljaXRseQotICAvLyBzcGVjaWZpZWQuCi0gIGltcGxpY2l0X3Byb3RvMi5zZXRfc3ludGF4KCJwcm90bzIiKTsKLSAgRVhQRUNUX0VRKGltcGxpY2l0X3Byb3RvMl9kZXNjcmlwdG9yLCBwb29sXy5CdWlsZEZpbGUoaW1wbGljaXRfcHJvdG8yKSk7Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19zeW50YXgzOwotICBwcm90b19zeW50YXgzLnNldF9uYW1lKCJmb29fc3ludGF4MyIpOwotICBwcm90b19zeW50YXgzLnNldF9zeW50YXgoInByb3RvMyIpOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwcm90bzNfZGVzY3JpcHRvciA9IHBvb2xfLkJ1aWxkRmlsZShwcm90b19zeW50YXgzKTsKLSAgRVhQRUNUX1RSVUUocHJvdG8zX2Rlc2NyaXB0b3IgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUShwcm90bzNfZGVzY3JpcHRvciwgcG9vbF8uQnVpbGRGaWxlKHByb3RvX3N5bnRheDMpKTsKLX0KLQotVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgU3ludGF4KSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG87Ci0gIHByb3RvLnNldF9uYW1lKCJmb28iKTsKLSAgLy8gRW5hYmxlIHRoZSB0ZXN0IHdoZW4gd2UgYWxzbyBwb3B1bGF0ZSB0aGUgc3ludGF4IGZvciBwcm90bzIuCi0jaWYgMAotICB7Ci0gICAgcHJvdG8uc2V0X3N5bnRheCgicHJvdG8yIik7Ci0gICAgRGVzY3JpcHRvclBvb2wgcG9vbDsKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKHByb3RvKTsKLSAgICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOwotICAgIEVYUEVDVF9FUShGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMiwgZmlsZS0+c3ludGF4KCkpOwotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXI7Ci0gICAgZmlsZS0+Q29weVRvKCZvdGhlcik7Ci0gICAgRVhQRUNUX0VRKCJwcm90bzIiLCBvdGhlci5zeW50YXgoKSk7Ci0gIH0KLSNlbmRpZgotICB7Ci0gICAgcHJvdG8uc2V0X3N5bnRheCgicHJvdG8zIik7Ci0gICAgRGVzY3JpcHRvclBvb2wgcG9vbDsKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKHByb3RvKTsKLSAgICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOwotICAgIEVYUEVDVF9FUShGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMywgZmlsZS0+c3ludGF4KCkpOwotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXI7Ci0gICAgZmlsZS0+Q29weVRvKCZvdGhlcik7Ci0gICAgRVhQRUNUX0VRKCJwcm90bzMiLCBvdGhlci5zeW50YXgoKSk7Ci0gIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBUZXN0IHNpbXBsZSBmbGF0IG1lc3NhZ2VzIGFuZCBmaWVsZHMuCi1jbGFzcyBEZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLSAgICAvLwotICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKLSAgICAvLyAgIG1lc3NhZ2UgVGVzdEZvcmVpZ24ge30KLSAgICAvLyAgIGVudW0gVGVzdEVudW0ge30KLSAgICAvLwotICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7Ci0gICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyAgICAgIGZvbyA9IDE7Ci0gICAgLy8gICAgIG9wdGlvbmFsIFRlc3RFbnVtICAgIGJhciA9IDY7Ci0gICAgLy8gICAgIHJlcGVhdGVkIFRlc3RGb3JlaWduIGJheiA9IDUwMDAwMDAwMDsKLSAgICAvLyAgICAgb3B0aW9uYWwgZ3JvdXAgICAgICAgcXV4ID0gMTUge30KLSAgICAvLyAgIH0KLSAgICAvLwotICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKLSAgICAvLyAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0OwotICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZTIgewotICAgIC8vICAgICByZXF1aXJlZCBzdHJpbmcgZm9vID0gMTsKLSAgICAvLyAgICAgcmVxdWlyZWQgc3RyaW5nIGJhciA9IDI7Ci0gICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyBxdXV4ID0gNjsKLSAgICAvLyAgIH0KLSAgICAvLwotICAgIC8vICAgLy8gaW4gIm1hcC5wcm90byIKLSAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UzIHsKLSAgICAvLyAgICAgbWFwPGludDMyLCBpbnQzMj4gbWFwX2ludDMyX2ludDMyID0gMTsKLSAgICAvLyAgIH0KLSAgICAvLwotICAgIC8vICAgLy8gaW4gImpzb24ucHJvdG8iCi0gICAgLy8gICBtZXNzYWdlIFRlc3RNZXNzYWdlNCB7Ci0gICAgLy8gICAgIG9wdGlvbmFsIGludDMyIGZpZWxkX25hbWUxID0gMTsKLSAgICAvLyAgICAgb3B0aW9uYWwgaW50MzIgZmllbGROYW1lMiA9IDI7Ci0gICAgLy8gICAgIG9wdGlvbmFsIGludDMyIEZpZWxkTmFtZTMgPSAzOwotICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBfZmllbGRfbmFtZTQgPSA0OwotICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBGSUVMRF9OQU1FNSA9IDU7Ci0gICAgLy8gICAgIG9wdGlvbmFsIGludDMyIGZpZWxkX25hbWU2ID0gNiBbanNvbl9uYW1lID0gIkB0eXBlIl07Ci0gICAgLy8gICB9Ci0gICAgLy8KLSAgICAvLyBXZSBjaGVhdCBhbmQgdXNlIFRlc3RGb3JlaWduIGFzIHRoZSB0eXBlIGZvciBxdXggcmF0aGVyIHRoYW4gY3JlYXRlCi0gICAgLy8gYW4gYWN0dWFsIG5lc3RlZCB0eXBlLgotICAgIC8vCi0gICAgLy8gU2luY2UgYWxsIHByaW1pdGl2ZSB0eXBlcyAoaW5jbHVkaW5nIHN0cmluZykgdXNlIHRoZSBzYW1lIGJ1aWxkaW5nCi0gICAgLy8gY29kZSwgdGhlcmUncyBubyBuZWVkIHRvIHRlc3QgZWFjaCBvbmUgaW5kaXZpZHVhbGx5LgotICAgIC8vCi0gICAgLy8gVGVzdE1lc3NhZ2UyIGlzIHByaW1hcmlseSBoZXJlIHRvIHRlc3QgRmluZEZpZWxkQnlOYW1lIGFuZCBmcmllbmRzLgotICAgIC8vIEFsbCBtZXNzYWdlcyBjcmVhdGVkIGZyb20gdGhlIHNhbWUgRGVzY3JpcHRvclBvb2wgc2hhcmUgdGhlIHNhbWUgbG9va3VwCi0gICAgLy8gdGFibGUsIHNvIHdlIG5lZWQgdG8gaW5zdXJlIHRoYXQgdGhleSBkb24ndCBpbnRlcmZlcmUuCi0KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOwotICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKLSAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlRlc3RGb3JlaWduIik7Ci0gICAgQWRkRW1wdHlFbnVtKCZmb29fZmlsZSwgIlRlc3RFbnVtIik7Ci0KLSAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlRlc3RNZXNzYWdlIik7Ci0gICAgQWRkRmllbGQobWVzc2FnZSwgImZvbyIsIDEsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7Ci0gICAgQWRkRmllbGQobWVzc2FnZSwgImJhciIsIDYsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0VOVU0pCi0gICAgICAtPnNldF90eXBlX25hbWUoIlRlc3RFbnVtIik7Ci0gICAgQWRkRmllbGQobWVzc2FnZSwgImJheiIsIDUwMDAwMDAwMCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVQRUFURUQsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRSkKLSAgICAgIC0+c2V0X3R5cGVfbmFtZSgiVGVzdEZvcmVpZ24iKTsKLSAgICBBZGRGaWVsZChtZXNzYWdlLCAicXV4IiwgMTUsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0dST1VQKQotICAgICAgLT5zZXRfdHlwZV9uYW1lKCJUZXN0Rm9yZWlnbiIpOwotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKLSAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7Ci0gICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImNvcmdlLmdyYXVsdCIpOwotCi0gICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlMiA9IEFkZE1lc3NhZ2UoJmJhcl9maWxlLCAiVGVzdE1lc3NhZ2UyIik7Ci0gICAgQWRkRmllbGQobWVzc2FnZTIsICJmb28iLCAxLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOwotICAgIEFkZEZpZWxkKG1lc3NhZ2UyLCAiYmFyIiwgMiwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKLSAgICBBZGRGaWVsZChtZXNzYWdlMiwgInF1dXgiLCA2LAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOwotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBtYXBfZmlsZTsKLSAgICBtYXBfZmlsZS5zZXRfbmFtZSgibWFwLnByb3RvIik7Ci0gICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlMyA9IEFkZE1lc3NhZ2UoJm1hcF9maWxlLCAiVGVzdE1lc3NhZ2UzIik7Ci0KLSAgICBEZXNjcmlwdG9yUHJvdG8qIGVudHJ5ID0gQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlMywgIk1hcEludDMySW50MzJFbnRyeSIpOwotICAgIEFkZEZpZWxkKGVudHJ5LCAia2V5IiwgMSwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICAgIEFkZEZpZWxkKGVudHJ5LCAidmFsdWUiLCAyLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgZW50cnktPm11dGFibGVfb3B0aW9ucygpLT5zZXRfbWFwX2VudHJ5KHRydWUpOwotCi0gICAgQWRkRmllbGQobWVzc2FnZTMsICJtYXBfaW50MzJfaW50MzIiLCAxLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFKQotICAgICAgICAtPnNldF90eXBlX25hbWUoIk1hcEludDMySW50MzJFbnRyeSIpOwotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBqc29uX2ZpbGU7Ci0gICAganNvbl9maWxlLnNldF9uYW1lKCJqc29uLnByb3RvIik7Ci0gICAganNvbl9maWxlLnNldF9zeW50YXgoInByb3RvMyIpOwotICAgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZTQgPSBBZGRNZXNzYWdlKCZqc29uX2ZpbGUsICJUZXN0TWVzc2FnZTQiKTsKLSAgICBBZGRGaWVsZChtZXNzYWdlNCwgImZpZWxkX25hbWUxIiwgMSwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICAgIEFkZEZpZWxkKG1lc3NhZ2U0LCAiZmllbGROYW1lMiIsIDIsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgICBBZGRGaWVsZChtZXNzYWdlNCwgIkZpZWxkTmFtZTMiLCAzLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgQWRkRmllbGQobWVzc2FnZTQsICJfZmllbGRfbmFtZTQiLCA0LAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgQWRkRmllbGQobWVzc2FnZTQsICJGSUVMRF9OQU1FNSIsIDUsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgICBBZGRGaWVsZChtZXNzYWdlNCwgImZpZWxkX25hbWU2IiwgNiwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpCi0gICAgICAgIC0+c2V0X2pzb25fbmFtZSgiQHR5cGUiKTsKLQotICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KLSAgICBmb29fZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoZm9vX2ZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGZvb19maWxlXyAhPSBOVUxMKTsKLQotICAgIGJhcl9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXJfZmlsZSk7Ci0gICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOwotCi0gICAgbWFwX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKG1hcF9maWxlKTsKLSAgICBBU1NFUlRfVFJVRShtYXBfZmlsZV8gIT0gTlVMTCk7Ci0KLSAgICBqc29uX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGpzb25fZmlsZSk7Ci0gICAgQVNTRVJUX1RSVUUoanNvbl9maWxlXyAhPSBOVUxMKTsKLQotICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKLSAgICBlbnVtXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDApOwotCi0gICAgQVNTRVJUX0VRKDIsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwotICAgIGZvcmVpZ25fID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7Ci0gICAgbWVzc2FnZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKLQotICAgIEFTU0VSVF9FUSg0LCBtZXNzYWdlXy0+ZmllbGRfY291bnQoKSk7Ci0gICAgZm9vXyA9IG1lc3NhZ2VfLT5maWVsZCgwKTsKLSAgICBiYXJfID0gbWVzc2FnZV8tPmZpZWxkKDEpOwotICAgIGJhel8gPSBtZXNzYWdlXy0+ZmllbGQoMik7Ci0gICAgcXV4XyA9IG1lc3NhZ2VfLT5maWVsZCgzKTsKLQotICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBtZXNzYWdlMl8gPSBiYXJfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKLQotICAgIEFTU0VSVF9FUSgzLCBtZXNzYWdlMl8tPmZpZWxkX2NvdW50KCkpOwotICAgIGZvbzJfICA9IG1lc3NhZ2UyXy0+ZmllbGQoMCk7Ci0gICAgYmFyMl8gID0gbWVzc2FnZTJfLT5maWVsZCgxKTsKLSAgICBxdXV4Ml8gPSBtZXNzYWdlMl8tPmZpZWxkKDIpOwotCi0gICAgQVNTRVJUX0VRKDEsIG1hcF9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwotICAgIG1lc3NhZ2UzXyA9IG1hcF9maWxlXy0+bWVzc2FnZV90eXBlKDApOwotCi0gICAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UzXy0+ZmllbGRfY291bnQoKSk7Ci0gICAgbWFwXyAgPSBtZXNzYWdlM18tPmZpZWxkKDApOwotCi0gICAgQVNTRVJUX0VRKDEsIGpzb25fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBtZXNzYWdlNF8gPSBqc29uX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7Ci0gIH0KLQotICB2b2lkIENvcHlXaXRoSnNvbk5hbWUoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwgRGVzY3JpcHRvclByb3RvKiBwcm90bykgewotICAgIG1lc3NhZ2UtPkNvcHlUbyhwcm90byk7Ci0gICAgbWVzc2FnZS0+Q29weUpzb25OYW1lVG8ocHJvdG8pOwotICB9Ci0KLSAgRGVzY3JpcHRvclBvb2wgcG9vbF87Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIG1hcF9maWxlXzsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGpzb25fZmlsZV87Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UyXzsKLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZTNfOwotICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlNF87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fOwotICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV87Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmb29fOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhcl87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmF6XzsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBxdXhfOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9vMl87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmFyMl87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcXV1eDJfOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWFwXzsKLX07Ci0KLVRFU1RfRihEZXNjcmlwdG9yVGVzdCwgTmFtZSkgewotICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UiLCBtZXNzYWdlXy0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBtZXNzYWdlXy0+ZmlsZSgpKTsKLQotICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlMiIsIG1lc3NhZ2UyXy0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyIiwgbWVzc2FnZTJfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUShiYXJfZmlsZV8sIG1lc3NhZ2UyXy0+ZmlsZSgpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBDb250YWluaW5nVHlwZSkgewotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRzQnlJbmRleCkgewotICBBU1NFUlRfRVEoNCwgbWVzc2FnZV8tPmZpZWxkX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPmZpZWxkKDApKTsKLSAgRVhQRUNUX0VRKGJhcl8sIG1lc3NhZ2VfLT5maWVsZCgxKSk7Ci0gIEVYUEVDVF9FUShiYXpfLCBtZXNzYWdlXy0+ZmllbGQoMikpOwotICBFWFBFQ1RfRVEocXV4XywgbWVzc2FnZV8tPmZpZWxkKDMpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU5hbWUpIHsKLSAgLy8gQWxsIG1lc3NhZ2VzIGluIHRoZSBzYW1lIERlc2NyaXB0b3JQb29sIHNoYXJlIGEgc2luZ2xlIGxvb2t1cCB0YWJsZSBmb3IKLSAgLy8gZmllbGRzLiAgU28sIGluIGFkZGl0aW9uIHRvIHRlc3RpbmcgdGhhdCBGaW5kRmllbGRCeU5hbWUgZmluZHMgdGhlIGZpZWxkcwotICAvLyBvZiB0aGUgbWVzc2FnZSwgd2UgbmVlZCB0byB0ZXN0IHRoYXQgaXQgZG9lcyAqbm90KiBmaW5kIHRoZSBmaWVsZHMgb2YKLSAgLy8gKm90aGVyKiBtZXNzYWdlcy4KLQotICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiZm9vIikpOwotICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiYmFyIikpOwotICBFWFBFQ1RfRVEoYmF6XywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiYmF6IikpOwotICBFWFBFQ1RfRVEocXV4XywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgicXV4IikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlOYW1lKCJub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoInF1dXgiKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfRVEoZm9vMl8gLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgiZm9vIiApKTsKLSAgRVhQRUNUX0VRKGJhcjJfICwgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU5hbWUoImJhciIgKSk7Ci0gIEVYUEVDVF9FUShxdXV4Ml8sIG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOYW1lKCJxdXV4IikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TmFtZSgiYmF6IikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOYW1lKCJxdXgiKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU51bWJlcikgewotICBFWFBFQ1RfRVEoZm9vXywgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKLSAgRVhQRUNUX0VRKGJhcl8sIG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcig2KSk7Ci0gIEVYUEVDVF9FUShiYXpfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoNTAwMDAwMDAwKSk7Ci0gIEVYUEVDVF9FUShxdXhfLCBtZXNzYWdlXy0+RmluZEZpZWxkQnlOdW1iZXIoMTUpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TnVtYmVyKDgzNzU5MikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU51bWJlcigyKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfRVEoZm9vMl8gLCBtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDEpKTsKLSAgRVhQRUNUX0VRKGJhcjJfICwgbWVzc2FnZTJfLT5GaW5kRmllbGRCeU51bWJlcigyKSk7Ci0gIEVYUEVDVF9FUShxdXV4Ml8sIG1lc3NhZ2UyXy0+RmluZEZpZWxkQnlOdW1iZXIoNikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMl8tPkZpbmRGaWVsZEJ5TnVtYmVyKDE1KSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRmllbGRCeU51bWJlcig1MDAwMDAwMDApID09IE5VTEwpOwotfQotCi1URVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkTmFtZSkgewotICBFWFBFQ1RfRVEoImZvbyIsIGZvb18tPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgYmFyXy0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXoiLCBiYXpfLT5uYW1lKCkpOwotICBFWFBFQ1RfRVEoInF1eCIsIHF1eF8tPm5hbWUoKSk7Ci19Ci0KLVRFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRGdWxsTmFtZSkgewotICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLmZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5iYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuYmF6IiwgYmF6Xy0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLnF1eCIsIHF1eF8tPmZ1bGxfbmFtZSgpKTsKLQotICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuZm9vIiwgZm9vMl8tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLmJhciIsIGJhcjJfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RNZXNzYWdlMi5xdXV4IiwgcXV1eDJfLT5mdWxsX25hbWUoKSk7Ci19Ci0KLVRFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRKc29uTmFtZSkgewotICBFWFBFQ1RfRVEoImZpZWxkTmFtZTEiLCBtZXNzYWdlNF8tPmZpZWxkKDApLT5qc29uX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZmllbGROYW1lMiIsIG1lc3NhZ2U0Xy0+ZmllbGQoMSktPmpzb25fbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmaWVsZE5hbWUzIiwgbWVzc2FnZTRfLT5maWVsZCgyKS0+anNvbl9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImZpZWxkTmFtZTQiLCBtZXNzYWdlNF8tPmZpZWxkKDMpLT5qc29uX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZklFTEROQU1FNSIsIG1lc3NhZ2U0Xy0+ZmllbGQoNCktPmpzb25fbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJAdHlwZSIsIG1lc3NhZ2U0Xy0+ZmllbGQoNSktPmpzb25fbmFtZSgpKTsKLQotICBEZXNjcmlwdG9yUHJvdG8gcHJvdG87Ci0gIG1lc3NhZ2U0Xy0+Q29weVRvKCZwcm90byk7Ci0gIEFTU0VSVF9FUSg2LCBwcm90by5maWVsZF9zaXplKCkpOwotICBFWFBFQ1RfRkFMU0UocHJvdG8uZmllbGQoMCkuaGFzX2pzb25fbmFtZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKHByb3RvLmZpZWxkKDEpLmhhc19qc29uX25hbWUoKSk7Ci0gIEVYUEVDVF9GQUxTRShwcm90by5maWVsZCgyKS5oYXNfanNvbl9uYW1lKCkpOwotICBFWFBFQ1RfRkFMU0UocHJvdG8uZmllbGQoMykuaGFzX2pzb25fbmFtZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKHByb3RvLmZpZWxkKDQpLmhhc19qc29uX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiQHR5cGUiLCBwcm90by5maWVsZCg1KS5qc29uX25hbWUoKSk7Ci0KLSAgcHJvdG8uQ2xlYXIoKTsKLSAgQ29weVdpdGhKc29uTmFtZShtZXNzYWdlNF8sICZwcm90byk7Ci0gIEFTU0VSVF9FUSg2LCBwcm90by5maWVsZF9zaXplKCkpOwotICBFWFBFQ1RfRVEoImZpZWxkTmFtZTEiLCBwcm90by5maWVsZCgwKS5qc29uX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZmllbGROYW1lMiIsIHByb3RvLmZpZWxkKDEpLmpzb25fbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmaWVsZE5hbWUzIiwgcHJvdG8uZmllbGQoMikuanNvbl9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImZpZWxkTmFtZTQiLCBwcm90by5maWVsZCgzKS5qc29uX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZklFTEROQU1FNSIsIHByb3RvLmZpZWxkKDQpLmpzb25fbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJAdHlwZSIsIHByb3RvLmZpZWxkKDUpLmpzb25fbmFtZSgpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEZpbGUpIHsKLSAgRVhQRUNUX0VRKGZvb19maWxlXywgZm9vXy0+ZmlsZSgpKTsKLSAgRVhQRUNUX0VRKGZvb19maWxlXywgYmFyXy0+ZmlsZSgpKTsKLSAgRVhQRUNUX0VRKGZvb19maWxlXywgYmF6Xy0+ZmlsZSgpKTsKLSAgRVhQRUNUX0VRKGZvb19maWxlXywgcXV4Xy0+ZmlsZSgpKTsKLQotICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBmb28yXy0+ZmlsZSgpKTsKLSAgRVhQRUNUX0VRKGJhcl9maWxlXywgYmFyMl8tPmZpbGUoKSk7Ci0gIEVYUEVDVF9FUShiYXJfZmlsZV8sIHF1dXgyXy0+ZmlsZSgpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEluZGV4KSB7Ci0gIEVYUEVDVF9FUSgwLCBmb29fLT5pbmRleCgpKTsKLSAgRVhQRUNUX0VRKDEsIGJhcl8tPmluZGV4KCkpOwotICBFWFBFQ1RfRVEoMiwgYmF6Xy0+aW5kZXgoKSk7Ci0gIEVYUEVDVF9FUSgzLCBxdXhfLT5pbmRleCgpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZE51bWJlcikgewotICBFWFBFQ1RfRVEoICAgICAgICAxLCBmb29fLT5udW1iZXIoKSk7Ci0gIEVYUEVDVF9FUSggICAgICAgIDYsIGJhcl8tPm51bWJlcigpKTsKLSAgRVhQRUNUX0VRKDUwMDAwMDAwMCwgYmF6Xy0+bnVtYmVyKCkpOwotICBFWFBFQ1RfRVEoICAgICAgIDE1LCBxdXhfLT5udW1iZXIoKSk7Ci19Ci0KLVRFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRUeXBlKSB7Ci0gIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICwgZm9vXy0+dHlwZSgpKTsKLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgLCBiYXJfLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIGJhel8tPnR5cGUoKSk7Ci0gIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICwgcXV4Xy0+dHlwZSgpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZExhYmVsKSB7Ci0gIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUVVJUkVELCBmb29fLT5sYWJlbCgpKTsKLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwsIGJhcl8tPmxhYmVsKCkpOwotICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgYmF6Xy0+bGFiZWwoKSk7Ci0gIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMLCBxdXhfLT5sYWJlbCgpKTsKLQotICBFWFBFQ1RfVFJVRSAoZm9vXy0+aXNfcmVxdWlyZWQoKSk7Ci0gIEVYUEVDVF9GQUxTRShmb29fLT5pc19vcHRpb25hbCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGZvb18tPmlzX3JlcGVhdGVkKCkpOwotCi0gIEVYUEVDVF9GQUxTRShiYXJfLT5pc19yZXF1aXJlZCgpKTsKLSAgRVhQRUNUX1RSVUUgKGJhcl8tPmlzX29wdGlvbmFsKCkpOwotICBFWFBFQ1RfRkFMU0UoYmFyXy0+aXNfcmVwZWF0ZWQoKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGJhel8tPmlzX3JlcXVpcmVkKCkpOwotICBFWFBFQ1RfRkFMU0UoYmF6Xy0+aXNfb3B0aW9uYWwoKSk7Ci0gIEVYUEVDVF9UUlVFIChiYXpfLT5pc19yZXBlYXRlZCgpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBJc01hcCkgewotICBFWFBFQ1RfVFJVRShtYXBfLT5pc19tYXAoKSk7Ci0gIEVYUEVDVF9GQUxTRShiYXpfLT5pc19tYXAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1hcF8tPm1lc3NhZ2VfdHlwZSgpLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpOwotfQotCi1URVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkSGFzRGVmYXVsdCkgewotICBFWFBFQ1RfRkFMU0UoZm9vXy0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci0gIEVYUEVDVF9GQUxTRShiYXJfLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKGJhel8tPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBFWFBFQ1RfRkFMU0UocXV4Xy0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci19Ci0KLVRFU1RfRihEZXNjcmlwdG9yVGVzdCwgRmllbGRDb250YWluaW5nVHlwZSkgewotICBFWFBFQ1RfRVEobWVzc2FnZV8sIGZvb18tPmNvbnRhaW5pbmdfdHlwZSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2VfLCBiYXJfLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXywgYmF6Xy0+Y29udGFpbmluZ190eXBlKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZV8sIHF1eF8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKLQotICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBmb28yXyAtPmNvbnRhaW5pbmdfdHlwZSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgYmFyMl8gLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMl8sIHF1dXgyXy0+Y29udGFpbmluZ190eXBlKCkpOwotfQotCi1URVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkTWVzc2FnZVR5cGUpIHsKLSAgRVhQRUNUX1RSVUUoZm9vXy0+bWVzc2FnZV90eXBlKCkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGJhcl8tPm1lc3NhZ2VfdHlwZSgpID09IE5VTEwpOwotCi0gIEVYUEVDVF9FUShmb3JlaWduXywgYmF6Xy0+bWVzc2FnZV90eXBlKCkpOwotICBFWFBFQ1RfRVEoZm9yZWlnbl8sIHF1eF8tPm1lc3NhZ2VfdHlwZSgpKTsKLX0KLQotVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEVudW1UeXBlKSB7Ci0gIEVYUEVDVF9UUlVFKGZvb18tPmVudW1fdHlwZSgpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShiYXpfLT5lbnVtX3R5cGUoKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocXV4Xy0+ZW51bV90eXBlKCkgPT0gTlVMTCk7Ci0KLSAgRVhQRUNUX0VRKGVudW1fLCBiYXJfLT5lbnVtX3R5cGUoKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gVGVzdCBzaW1wbGUgZmxhdCBtZXNzYWdlcyBhbmQgZmllbGRzLgotY2xhc3MgT25lb2ZEZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLSAgICAvLwotICAgIC8vICAgcGFja2FnZSBnYXJwbHk7Ci0gICAgLy8gICBtZXNzYWdlIFRlc3RPbmVvZiB7Ci0gICAgLy8gICAgIG9wdGlvbmFsIGludDMyIGEgPSAxOwotICAgIC8vICAgICBvbmVvZiBmb28gewotICAgIC8vICAgICAgIHN0cmluZyBiID0gMjsKLSAgICAvLyAgICAgICBUZXN0T25lb2YgYyA9IDM7Ci0gICAgLy8gICAgIH0KLSAgICAvLyAgICAgb25lb2YgYmFyIHsKLSAgICAvLyAgICAgICBmbG9hdCBkID0gNDsKLSAgICAvLyAgICAgfQotICAgIC8vICAgfQotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXpfZmlsZTsKLSAgICBiYXpfZmlsZS5zZXRfbmFtZSgiYmF6LnByb3RvIik7Ci0gICAgYmF6X2ZpbGUuc2V0X3BhY2thZ2UoImdhcnBseSIpOwotCi0gICAgRGVzY3JpcHRvclByb3RvKiBvbmVvZl9tZXNzYWdlID0gQWRkTWVzc2FnZSgmYmF6X2ZpbGUsICJUZXN0T25lb2YiKTsKLSAgICBvbmVvZl9tZXNzYWdlLT5hZGRfb25lb2ZfZGVjbCgpLT5zZXRfbmFtZSgiZm9vIik7Ci0gICAgb25lb2ZfbWVzc2FnZS0+YWRkX29uZW9mX2RlY2woKS0+c2V0X25hbWUoImJhciIpOwotCi0gICAgQWRkRmllbGQob25lb2ZfbWVzc2FnZSwgImEiLCAxLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgQWRkRmllbGQob25lb2ZfbWVzc2FnZSwgImIiLCAyLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpOwotICAgIG9uZW9mX21lc3NhZ2UtPm11dGFibGVfZmllbGQoMSktPnNldF9vbmVvZl9pbmRleCgwKTsKLSAgICBBZGRGaWVsZChvbmVvZl9tZXNzYWdlLCAiYyIsIDMsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0UpOwotICAgIG9uZW9mX21lc3NhZ2UtPm11dGFibGVfZmllbGQoMiktPnNldF9vbmVvZl9pbmRleCgwKTsKLSAgICBvbmVvZl9tZXNzYWdlLT5tdXRhYmxlX2ZpZWxkKDIpLT5zZXRfdHlwZV9uYW1lKCJUZXN0T25lb2YiKTsKLQotICAgIEFkZEZpZWxkKG9uZW9mX21lc3NhZ2UsICJkIiwgNCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQpOwotICAgIG9uZW9mX21lc3NhZ2UtPm11dGFibGVfZmllbGQoMyktPnNldF9vbmVvZl9pbmRleCgxKTsKLQotICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KLSAgICBiYXpfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmF6X2ZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGJhel9maWxlXyAhPSBOVUxMKTsKLQotICAgIEFTU0VSVF9FUSgxLCBiYXpfZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBvbmVvZl9tZXNzYWdlXyA9IGJhel9maWxlXy0+bWVzc2FnZV90eXBlKDApOwotCi0gICAgQVNTRVJUX0VRKDIsIG9uZW9mX21lc3NhZ2VfLT5vbmVvZl9kZWNsX2NvdW50KCkpOwotICAgIG9uZW9mXyA9IG9uZW9mX21lc3NhZ2VfLT5vbmVvZl9kZWNsKDApOwotICAgIG9uZW9mMl8gPSBvbmVvZl9tZXNzYWdlXy0+b25lb2ZfZGVjbCgxKTsKLQotICAgIEFTU0VSVF9FUSg0LCBvbmVvZl9tZXNzYWdlXy0+ZmllbGRfY291bnQoKSk7Ci0gICAgYV8gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMCk7Ci0gICAgYl8gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMSk7Ci0gICAgY18gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMik7Ci0gICAgZF8gPSBvbmVvZl9tZXNzYWdlXy0+ZmllbGQoMyk7Ci0gIH0KLQotICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmF6X2ZpbGVfOwotCi0gIGNvbnN0IERlc2NyaXB0b3IqIG9uZW9mX21lc3NhZ2VfOwotCi0gIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfOwotICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mMl87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYV87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYl87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogY187Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZF87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZV87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZl87Ci19OwotCi1URVNUX0YoT25lb2ZEZXNjcmlwdG9yVGVzdCwgTm9ybWFsKSB7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgb25lb2ZfLT5uYW1lKCkpOwotICBFWFBFQ1RfRVEoImdhcnBseS5UZXN0T25lb2YuZm9vIiwgb25lb2ZfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBvbmVvZl8tPmluZGV4KCkpOwotICBBU1NFUlRfRVEoMiwgb25lb2ZfLT5maWVsZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKGJfLCBvbmVvZl8tPmZpZWxkKDApKTsKLSAgRVhQRUNUX0VRKGNfLCBvbmVvZl8tPmZpZWxkKDEpKTsKLSAgRVhQRUNUX1RSVUUoYV8tPmNvbnRhaW5pbmdfb25lb2YoKSA9PSBOVUxMKTsKLSAgRVhQRUNUX0VRKG9uZW9mXywgYl8tPmNvbnRhaW5pbmdfb25lb2YoKSk7Ci0gIEVYUEVDVF9FUShvbmVvZl8sIGNfLT5jb250YWluaW5nX29uZW9mKCkpOwotfQotCi1URVNUX0YoT25lb2ZEZXNjcmlwdG9yVGVzdCwgRmluZEJ5TmFtZSkgewotICBFWFBFQ1RfRVEob25lb2ZfLCBvbmVvZl9tZXNzYWdlXy0+RmluZE9uZW9mQnlOYW1lKCJmb28iKSk7Ci0gIEVYUEVDVF9FUShvbmVvZjJfLCBvbmVvZl9tZXNzYWdlXy0+RmluZE9uZW9mQnlOYW1lKCJiYXIiKSk7Ci0gIEVYUEVDVF9UUlVFKG9uZW9mX21lc3NhZ2VfLT5GaW5kT25lb2ZCeU5hbWUoIm5vX3N1Y2hfb25lb2YiKSA9PSBOVUxMKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBTdHlsaXplZEZpZWxkTmFtZXNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRVcCgpIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7Ci0gICAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0KLSAgICBBZGRFeHRlbnNpb25SYW5nZShBZGRNZXNzYWdlKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiKSwgMSwgMTAwMCk7Ci0KLSAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmaWxlLCAiVGVzdE1lc3NhZ2UiKTsKLSAgICBBZGRGaWVsZChtZXNzYWdlLCAiZm9vX2ZvbyIsIDEsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgICBBZGRGaWVsZChtZXNzYWdlLCAiRm9vQmFyIiwgMiwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb29CYXoiLCAzLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgQWRkRmllbGQobWVzc2FnZSwgImZvb0ZvbyIsIDQsICAvLyBDYW1lbC1jYXNlIGNvbmZsaWN0IHdpdGggZm9vX2Zvby4KLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb29iYXIiLCA1LCAgLy8gTG93ZXItY2FzZSBjb25mbGljdCB3aXRoIEZvb0Jhci4KLSAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotCi0gICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJiYXJfZm9vIiwgMSwKLSAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgQWRkTmVzdGVkRXh0ZW5zaW9uKG1lc3NhZ2UsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXJCYXIiLCAyLAotICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgICBBZGROZXN0ZWRFeHRlbnNpb24obWVzc2FnZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgIkJhckJheiIsIDMsCi0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyRm9vIiwgNCwgIC8vIENvbmZsaWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICAgIEFkZE5lc3RlZEV4dGVuc2lvbihtZXNzYWdlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmFyYmFyIiwgNSwgIC8vIENvbmZsaWN0Ci0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotCi0gICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6X2ZvbyIsIDExLAotICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgICBBZGRFeHRlbnNpb24oJmZpbGUsICJFeHRlbmRhYmxlTWVzc2FnZSIsICJCYXpCYXIiLCAxMiwKLSAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiQmF6QmF6IiwgMTMsCi0gICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICAgIEFkZEV4dGVuc2lvbigmZmlsZSwgIkV4dGVuZGFibGVNZXNzYWdlIiwgImJhekZvbyIsIDE0LCAgLy8gQ29uZmxpY3QKLSAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gICAgQWRkRXh0ZW5zaW9uKCZmaWxlLCAiRXh0ZW5kYWJsZU1lc3NhZ2UiLCAiYmF6YmFyIiwgMTUsICAvLyBDb25mbGljdAotICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLQotICAgIGZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGZpbGVfICE9IE5VTEwpOwotICAgIEFTU0VSVF9FUSgyLCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwotICAgIG1lc3NhZ2VfID0gZmlsZV8tPm1lc3NhZ2VfdHlwZSgxKTsKLSAgICBBU1NFUlRfRVEoIlRlc3RNZXNzYWdlIiwgbWVzc2FnZV8tPm5hbWUoKSk7Ci0gICAgQVNTRVJUX0VRKDUsIG1lc3NhZ2VfLT5maWVsZF9jb3VudCgpKTsKLSAgICBBU1NFUlRfRVEoNSwgbWVzc2FnZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKLSAgICBBU1NFUlRfRVEoNSwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKLSAgfQotCi0gIERlc2NyaXB0b3JQb29sIHBvb2xfOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfOwotfTsKLQotVEVTVF9GKFN0eWxpemVkRmllbGROYW1lc1Rlc3QsIExvd2VyY2FzZU5hbWUpIHsKLSAgRVhQRUNUX0VRKCJmb29fZm9vIiwgbWVzc2FnZV8tPmZpZWxkKDApLT5sb3dlcmNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmb29iYXIiICwgbWVzc2FnZV8tPmZpZWxkKDEpLT5sb3dlcmNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmb29iYXoiICwgbWVzc2FnZV8tPmZpZWxkKDIpLT5sb3dlcmNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmb29mb28iICwgbWVzc2FnZV8tPmZpZWxkKDMpLT5sb3dlcmNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmb29iYXIiICwgbWVzc2FnZV8tPmZpZWxkKDQpLT5sb3dlcmNhc2VfbmFtZSgpKTsKLQotICBFWFBFQ1RfRVEoImJhcl9mb28iLCBtZXNzYWdlXy0+ZXh0ZW5zaW9uKDApLT5sb3dlcmNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXJiYXIiICwgbWVzc2FnZV8tPmV4dGVuc2lvbigxKS0+bG93ZXJjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmFyYmF6IiAsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmxvd2VyY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhcmZvbyIgLCBtZXNzYWdlXy0+ZXh0ZW5zaW9uKDMpLT5sb3dlcmNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXJiYXIiICwgbWVzc2FnZV8tPmV4dGVuc2lvbig0KS0+bG93ZXJjYXNlX25hbWUoKSk7Ci0KLSAgRVhQRUNUX0VRKCJiYXpfZm9vIiwgZmlsZV8tPmV4dGVuc2lvbigwKS0+bG93ZXJjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmF6YmFyIiAsIGZpbGVfLT5leHRlbnNpb24oMSktPmxvd2VyY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhemJheiIgLCBmaWxlXy0+ZXh0ZW5zaW9uKDIpLT5sb3dlcmNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJiYXpmb28iICwgZmlsZV8tPmV4dGVuc2lvbigzKS0+bG93ZXJjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmF6YmFyIiAsIGZpbGVfLT5leHRlbnNpb24oNCktPmxvd2VyY2FzZV9uYW1lKCkpOwotfQotCi1URVNUX0YoU3R5bGl6ZWRGaWVsZE5hbWVzVGVzdCwgQ2FtZWxjYXNlTmFtZSkgewotICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgwKS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vQmFyIiwgbWVzc2FnZV8tPmZpZWxkKDEpLT5jYW1lbGNhc2VfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJmb29CYXoiLCBtZXNzYWdlXy0+ZmllbGQoMiktPmNhbWVsY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImZvb0ZvbyIsIG1lc3NhZ2VfLT5maWVsZCgzKS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vYmFyIiwgbWVzc2FnZV8tPmZpZWxkKDQpLT5jYW1lbGNhc2VfbmFtZSgpKTsKLQotICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMCktPmNhbWVsY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhckJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMSktPmNhbWVsY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhckJheiIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMiktPmNhbWVsY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhckZvbyIsIG1lc3NhZ2VfLT5leHRlbnNpb24oMyktPmNhbWVsY2FzZV9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImJhcmJhciIsIG1lc3NhZ2VfLT5leHRlbnNpb24oNCktPmNhbWVsY2FzZV9uYW1lKCkpOwotCi0gIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigwKS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmF6QmFyIiwgZmlsZV8tPmV4dGVuc2lvbigxKS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmF6QmF6IiwgZmlsZV8tPmV4dGVuc2lvbigyKS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmF6Rm9vIiwgZmlsZV8tPmV4dGVuc2lvbigzKS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiYmF6YmFyIiwgZmlsZV8tPmV4dGVuc2lvbig0KS0+Y2FtZWxjYXNlX25hbWUoKSk7Ci19Ci0KLVRFU1RfRihTdHlsaXplZEZpZWxkTmFtZXNUZXN0LCBGaW5kQnlMb3dlcmNhc2VOYW1lKSB7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMCksCi0gICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJmb29fZm9vIikpOwotICBFWFBFQ1RfRVEobWVzc2FnZV8tPmZpZWxkKDEpLAotICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vYmFyIikpOwotICBFWFBFQ1RfRVEobWVzc2FnZV8tPmZpZWxkKDIpLAotICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vYmF6IikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlMb3dlcmNhc2VOYW1lKCJGb29CYXIiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgiZm9vQmF6IikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUxvd2VyY2FzZU5hbWUoImJhcl9mb28iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigwKSwKLSAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJfZm9vIikpOwotICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigxKSwKLSAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXJiYXIiKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXy0+ZXh0ZW5zaW9uKDIpLAotICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhcmJheiIpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoIkJhckJhciIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiYmFyQmF6IikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJmb29fZm9vIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOwotCi0gIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDApLAotICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhel9mb28iKSk7Ci0gIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDEpLAotICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoImJhemJhciIpKTsKLSAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMiksCi0gICAgICAgICAgICBmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiYmF6YmF6IikpOwotICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5TG93ZXJjYXNlTmFtZSgiQmF6QmFyIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlMb3dlcmNhc2VOYW1lKCJiYXpCYXoiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZmlsZV8tPkZpbmRFeHRlbnNpb25CeUxvd2VyY2FzZU5hbWUoIm5vc3VjaGZpZWxkIikgPT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihTdHlsaXplZEZpZWxkTmFtZXNUZXN0LCBGaW5kQnlDYW1lbGNhc2VOYW1lKSB7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMCksCi0gICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29Gb28iKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMSksCi0gICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29CYXIiKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXy0+ZmllbGQoMiksCi0gICAgICAgICAgICBtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJmb29CYXoiKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoImZvb19mb28iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgiRm9vQmFyIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeUNhbWVsY2FzZU5hbWUoImJhckZvbyIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEZpZWxkQnlDYW1lbGNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOwotCi0gIEVYUEVDVF9FUShtZXNzYWdlXy0+ZXh0ZW5zaW9uKDApLAotICAgICAgICAgICAgbWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImJhckZvbyIpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2VfLT5leHRlbnNpb24oMSksCi0gICAgICAgICAgICBtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmFyQmFyIikpOwotICBFWFBFQ1RfRVEobWVzc2FnZV8tPmV4dGVuc2lvbigyKSwKLSAgICAgICAgICAgIG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJCYXoiKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXJfZm9vIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJCYXJCYXIiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImZvb0ZvbyIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgibm9zdWNoZmllbGQiKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfRVEoZmlsZV8tPmV4dGVuc2lvbigwKSwKLSAgICAgICAgICAgIGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJiYXpGb28iKSk7Ci0gIEVYUEVDVF9FUShmaWxlXy0+ZXh0ZW5zaW9uKDEpLAotICAgICAgICAgICAgZmlsZV8tPkZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoImJhekJhciIpKTsKLSAgRVhQRUNUX0VRKGZpbGVfLT5leHRlbnNpb24oMiksCi0gICAgICAgICAgICBmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6QmF6IikpOwotICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiYmF6X2ZvbyIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmaWxlXy0+RmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZSgiQmF6QmFyIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZpbGVfLT5GaW5kRXh0ZW5zaW9uQnlDYW1lbGNhc2VOYW1lKCJub3N1Y2hmaWVsZCIpID09IE5VTEwpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIFRlc3QgZW51bSBkZXNjcmlwdG9ycy4KLWNsYXNzIEVudW1EZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLSAgICAvLwotICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKLSAgICAvLyAgIGVudW0gVGVzdEVudW0gewotICAgIC8vICAgICBGT08gPSAxOwotICAgIC8vICAgICBCQVIgPSAyOwotICAgIC8vICAgfQotICAgIC8vCi0gICAgLy8gICAvLyBpbiAiYmFyLnByb3RvIgotICAgIC8vICAgcGFja2FnZSBjb3JnZS5ncmF1bHQ7Ci0gICAgLy8gICBlbnVtIFRlc3RFbnVtMiB7Ci0gICAgLy8gICAgIEZPTyA9IDE7Ci0gICAgLy8gICAgIEJBWiA9IDM7Ci0gICAgLy8gICB9Ci0gICAgLy8KLSAgICAvLyBUZXN0RW51bTIgaXMgcHJpbWFyaWx5IGhlcmUgdG8gdGVzdCBGaW5kVmFsdWVCeU5hbWUgYW5kIGZyaWVuZHMuCi0gICAgLy8gQWxsIGVudW1zIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKLSAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KLQotICAgIC8vIFRlc3RFbnVtCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKLSAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0KLSAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3Byb3RvID0gQWRkRW51bSgmZm9vX2ZpbGUsICJUZXN0RW51bSIpOwotICAgIEFkZEVudW1WYWx1ZShlbnVtX3Byb3RvLCAiRk9PIiwgMSk7Ci0gICAgQWRkRW51bVZhbHVlKGVudW1fcHJvdG8sICJCQVIiLCAyKTsKLQotICAgIC8vIFRlc3RFbnVtMgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmFyX2ZpbGU7Ci0gICAgYmFyX2ZpbGUuc2V0X25hbWUoImJhci5wcm90byIpOwotICAgIGJhcl9maWxlLnNldF9wYWNrYWdlKCJjb3JnZS5ncmF1bHQiKTsKLQotICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW0yX3Byb3RvID0gQWRkRW51bSgmYmFyX2ZpbGUsICJUZXN0RW51bTIiKTsKLSAgICBBZGRFbnVtVmFsdWUoZW51bTJfcHJvdG8sICJGT08iLCAxKTsKLSAgICBBZGRFbnVtVmFsdWUoZW51bTJfcHJvdG8sICJCQVoiLCAzKTsKLQotICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KLSAgICBmb29fZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoZm9vX2ZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGZvb19maWxlXyAhPSBOVUxMKTsKLQotICAgIGJhcl9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXJfZmlsZSk7Ci0gICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOwotCi0gICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+ZW51bV90eXBlX2NvdW50KCkpOwotICAgIGVudW1fID0gZm9vX2ZpbGVfLT5lbnVtX3R5cGUoMCk7Ci0KLSAgICBBU1NFUlRfRVEoMiwgZW51bV8tPnZhbHVlX2NvdW50KCkpOwotICAgIGZvb18gPSBlbnVtXy0+dmFsdWUoMCk7Ci0gICAgYmFyXyA9IGVudW1fLT52YWx1ZSgxKTsKLQotICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKLSAgICBlbnVtMl8gPSBiYXJfZmlsZV8tPmVudW1fdHlwZSgwKTsKLQotICAgIEFTU0VSVF9FUSgyLCBlbnVtMl8tPnZhbHVlX2NvdW50KCkpOwotICAgIGZvbzJfID0gZW51bTJfLT52YWx1ZSgwKTsKLSAgICBiYXoyXyA9IGVudW0yXy0+dmFsdWUoMSk7Ci0gIH0KLQotICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZm9vX2ZpbGVfOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFyX2ZpbGVfOwotCi0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtXzsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW0yXzsKLQotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb29fOwotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXJfOwotCi0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvbzJfOwotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiYXoyXzsKLX07Ci0KLVRFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIE5hbWUpIHsKLSAgRVhQRUNUX0VRKCJUZXN0RW51bSIsIGVudW1fLT5uYW1lKCkpOwotICBFWFBFQ1RfRVEoIlRlc3RFbnVtIiwgZW51bV8tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKGZvb19maWxlXywgZW51bV8tPmZpbGUoKSk7Ci0KLSAgRVhQRUNUX0VRKCJUZXN0RW51bTIiLCBlbnVtMl8tPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RFbnVtMiIsIGVudW0yXy0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBlbnVtMl8tPmZpbGUoKSk7Ci19Ci0KLVRFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIENvbnRhaW5pbmdUeXBlKSB7Ci0gIEVYUEVDVF9UUlVFKGVudW1fLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZW51bTJfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVzQnlJbmRleCkgewotICBBU1NFUlRfRVEoMiwgZW51bV8tPnZhbHVlX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoZm9vXywgZW51bV8tPnZhbHVlKDApKTsKLSAgRVhQRUNUX0VRKGJhcl8sIGVudW1fLT52YWx1ZSgxKSk7Ci19Ci0KLVRFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIEZpbmRWYWx1ZUJ5TmFtZSkgewotICBFWFBFQ1RfRVEoZm9vXyAsIGVudW1fIC0+RmluZFZhbHVlQnlOYW1lKCJGT08iKSk7Ci0gIEVYUEVDVF9FUShiYXJfICwgZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIpKTsKLSAgRVhQRUNUX0VRKGZvbzJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TmFtZSgiRk9PIikpOwotICBFWFBFQ1RfRVEoYmF6Ml8sIGVudW0yXy0+RmluZFZhbHVlQnlOYW1lKCJCQVoiKSk7Ci0KLSAgRVhQRUNUX1RSVUUoZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZW51bV8gLT5GaW5kVmFsdWVCeU5hbWUoIkJBWiIgICAgICAgICAgKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZW51bTJfLT5GaW5kVmFsdWVCeU5hbWUoIkJBUiIgICAgICAgICAgKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgRmluZFZhbHVlQnlOdW1iZXIpIHsKLSAgRVhQRUNUX0VRKGZvb18gLCBlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDEpKTsKLSAgRVhQRUNUX0VRKGJhcl8gLCBlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDIpKTsKLSAgRVhQRUNUX0VRKGZvbzJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDEpKTsKLSAgRVhQRUNUX0VRKGJhejJfLCBlbnVtMl8tPkZpbmRWYWx1ZUJ5TnVtYmVyKDMpKTsKLQotICBFWFBFQ1RfVFJVRShlbnVtXyAtPkZpbmRWYWx1ZUJ5TnVtYmVyKDQxNikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGVudW1fIC0+RmluZFZhbHVlQnlOdW1iZXIoMykgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGVudW0yXy0+RmluZFZhbHVlQnlOdW1iZXIoMikgPT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlTmFtZSkgewotICBFWFBFQ1RfRVEoIkZPTyIsIGZvb18tPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiQkFSIiwgYmFyXy0+bmFtZSgpKTsKLX0KLQotVEVTVF9GKEVudW1EZXNjcmlwdG9yVGVzdCwgVmFsdWVGdWxsTmFtZSkgewotICBFWFBFQ1RfRVEoIkZPTyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJCQVIiLCBiYXJfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LkZPTyIsIGZvbzJfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LkJBWiIsIGJhejJfLT5mdWxsX25hbWUoKSk7Ci19Ci0KLVRFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlSW5kZXgpIHsKLSAgRVhQRUNUX0VRKDAsIGZvb18tPmluZGV4KCkpOwotICBFWFBFQ1RfRVEoMSwgYmFyXy0+aW5kZXgoKSk7Ci19Ci0KLVRFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlTnVtYmVyKSB7Ci0gIEVYUEVDVF9FUSgxLCBmb29fLT5udW1iZXIoKSk7Ci0gIEVYUEVDVF9FUSgyLCBiYXJfLT5udW1iZXIoKSk7Ci19Ci0KLVRFU1RfRihFbnVtRGVzY3JpcHRvclRlc3QsIFZhbHVlVHlwZSkgewotICBFWFBFQ1RfRVEoZW51bV8gLCBmb29fIC0+dHlwZSgpKTsKLSAgRVhQRUNUX0VRKGVudW1fICwgYmFyXyAtPnR5cGUoKSk7Ci0gIEVYUEVDVF9FUShlbnVtMl8sIGZvbzJfLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoZW51bTJfLCBiYXoyXy0+dHlwZSgpKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBUZXN0IHNlcnZpY2UgZGVzY3JpcHRvcnMuCi1jbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgbWVzc2FnZXMgYW5kIHNlcnZpY2U6Ci0gICAgLy8gICAgLy8gaW4gImZvby5wcm90byIKLSAgICAvLyAgICBtZXNzYWdlIEZvb1JlcXVlc3QgIHt9Ci0gICAgLy8gICAgbWVzc2FnZSBGb29SZXNwb25zZSB7fQotICAgIC8vICAgIG1lc3NhZ2UgQmFyUmVxdWVzdCAge30KLSAgICAvLyAgICBtZXNzYWdlIEJhclJlc3BvbnNlIHt9Ci0gICAgLy8gICAgbWVzc2FnZSBCYXpSZXF1ZXN0ICB7fQotICAgIC8vICAgIG1lc3NhZ2UgQmF6UmVzcG9uc2Uge30KLSAgICAvLwotICAgIC8vICAgIHNlcnZpY2UgVGVzdFNlcnZpY2UgewotICAgIC8vICAgICAgcnBjIEZvbyhGb29SZXF1ZXN0KSByZXR1cm5zIChGb29SZXNwb25zZSk7Ci0gICAgLy8gICAgICBycGMgQmFyKEJhclJlcXVlc3QpIHJldHVybnMgKEJhclJlc3BvbnNlKTsKLSAgICAvLyAgICB9Ci0gICAgLy8KLSAgICAvLyAgICAvLyBpbiAiYmFyLnByb3RvIgotICAgIC8vICAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0Ci0gICAgLy8gICAgc2VydmljZSBUZXN0U2VydmljZTIgewotICAgIC8vICAgICAgcnBjIEZvbyhGb29SZXF1ZXN0KSByZXR1cm5zIChGb29SZXNwb25zZSk7Ci0gICAgLy8gICAgICBycGMgQmF6KEJhelJlcXVlc3QpIHJldHVybnMgKEJhelJlc3BvbnNlKTsKLSAgICAvLyAgICB9Ci0KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOwotICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKLQotICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiRm9vUmVxdWVzdCIpOwotICAgIEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiRm9vUmVzcG9uc2UiKTsKLSAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhclJlcXVlc3QiKTsKLSAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkJhclJlc3BvbnNlIik7Ci0gICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJCYXpSZXF1ZXN0Iik7Ci0gICAgQWRkTWVzc2FnZSgmZm9vX2ZpbGUsICJCYXpSZXNwb25zZSIpOwotCi0gICAgU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSA9IEFkZFNlcnZpY2UoJmZvb19maWxlLCAiVGVzdFNlcnZpY2UiKTsKLSAgICBBZGRNZXRob2Qoc2VydmljZSwgIkZvbyIsICJGb29SZXF1ZXN0IiwgIkZvb1Jlc3BvbnNlIik7Ci0gICAgQWRkTWV0aG9kKHNlcnZpY2UsICJCYXIiLCAiQmFyUmVxdWVzdCIsICJCYXJSZXNwb25zZSIpOwotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKLSAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7Ci0gICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImNvcmdlLmdyYXVsdCIpOwotICAgIGJhcl9maWxlLmFkZF9kZXBlbmRlbmN5KCJmb28ucHJvdG8iKTsKLQotICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UyID0gQWRkU2VydmljZSgmYmFyX2ZpbGUsICJUZXN0U2VydmljZTIiKTsKLSAgICBBZGRNZXRob2Qoc2VydmljZTIsICJGb28iLCAiRm9vUmVxdWVzdCIsICJGb29SZXNwb25zZSIpOwotICAgIEFkZE1ldGhvZChzZXJ2aWNlMiwgIkJheiIsICJCYXpSZXF1ZXN0IiwgIkJhelJlc3BvbnNlIik7Ci0KLSAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCi0gICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKLSAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7Ci0KLSAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKLQotICAgIEFTU0VSVF9FUSg2LCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBmb29fcmVxdWVzdF8gID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7Ci0gICAgZm9vX3Jlc3BvbnNlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDEpOwotICAgIGJhcl9yZXF1ZXN0XyAgPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKLSAgICBiYXJfcmVzcG9uc2VfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMyk7Ci0gICAgYmF6X3JlcXVlc3RfICA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDQpOwotICAgIGJhel9yZXNwb25zZV8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSg1KTsKLQotICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7Ci0gICAgc2VydmljZV8gPSBmb29fZmlsZV8tPnNlcnZpY2UoMCk7Ci0KLSAgICBBU1NFUlRfRVEoMiwgc2VydmljZV8tPm1ldGhvZF9jb3VudCgpKTsKLSAgICBmb29fID0gc2VydmljZV8tPm1ldGhvZCgwKTsKLSAgICBiYXJfID0gc2VydmljZV8tPm1ldGhvZCgxKTsKLQotICAgIEFTU0VSVF9FUSgxLCBiYXJfZmlsZV8tPnNlcnZpY2VfY291bnQoKSk7Ci0gICAgc2VydmljZTJfID0gYmFyX2ZpbGVfLT5zZXJ2aWNlKDApOwotCi0gICAgQVNTRVJUX0VRKDIsIHNlcnZpY2UyXy0+bWV0aG9kX2NvdW50KCkpOwotICAgIGZvbzJfID0gc2VydmljZTJfLT5tZXRob2QoMCk7Ci0gICAgYmF6Ml8gPSBzZXJ2aWNlMl8tPm1ldGhvZCgxKTsKLSAgfQotCi0gIERlc2NyaXB0b3JQb29sIHBvb2xfOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogZm9vX3JlcXVlc3RfOwotICBjb25zdCBEZXNjcmlwdG9yKiBmb29fcmVzcG9uc2VfOwotICBjb25zdCBEZXNjcmlwdG9yKiBiYXJfcmVxdWVzdF87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGJhcl9yZXNwb25zZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGJhel9yZXF1ZXN0XzsKLSAgY29uc3QgRGVzY3JpcHRvciogYmF6X3Jlc3BvbnNlXzsKLQotICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV87Ci0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlMl87Ci0KLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogZm9vXzsKLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmFyXzsKLQotICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBmb28yXzsKLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogYmF6Ml87Ci19OwotCi1URVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBOYW1lKSB7Ci0gIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UiLCBzZXJ2aWNlXy0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJUZXN0U2VydmljZSIsIHNlcnZpY2VfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUShmb29fZmlsZV8sIHNlcnZpY2VfLT5maWxlKCkpOwotCi0gIEVYUEVDVF9FUSgiVGVzdFNlcnZpY2UyIiwgc2VydmljZTJfLT5uYW1lKCkpOwotICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0U2VydmljZTIiLCBzZXJ2aWNlMl8tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKGJhcl9maWxlXywgc2VydmljZTJfLT5maWxlKCkpOwotfQotCi1URVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2RzQnlJbmRleCkgewotICBBU1NFUlRfRVEoMiwgc2VydmljZV8tPm1ldGhvZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKGZvb18sIHNlcnZpY2VfLT5tZXRob2QoMCkpOwotICBFWFBFQ1RfRVEoYmFyXywgc2VydmljZV8tPm1ldGhvZCgxKSk7Ci19Ci0KLVRFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIEZpbmRNZXRob2RCeU5hbWUpIHsKLSAgRVhQRUNUX0VRKGZvb18gLCBzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKLSAgRVhQRUNUX0VRKGJhcl8gLCBzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkJhciIpKTsKLSAgRVhQRUNUX0VRKGZvbzJfLCBzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKLSAgRVhQRUNUX0VRKGJhejJfLCBzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkJheiIpKTsKLQotICBFWFBFQ1RfVFJVRShzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIk5vU3VjaE1ldGhvZCIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShzZXJ2aWNlXyAtPkZpbmRNZXRob2RCeU5hbWUoIkJheiIgICAgICAgICApID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShzZXJ2aWNlMl8tPkZpbmRNZXRob2RCeU5hbWUoIkJhciIgICAgICAgICApID09IE5VTEwpOwotfQotCi1URVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2ROYW1lKSB7Ci0gIEVYUEVDVF9FUSgiRm9vIiwgZm9vXy0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJCYXIiLCBiYXJfLT5uYW1lKCkpOwotfQotCi1URVNUX0YoU2VydmljZURlc2NyaXB0b3JUZXN0LCBNZXRob2RGdWxsTmFtZSkgewotICBFWFBFQ1RfRVEoIlRlc3RTZXJ2aWNlLkZvbyIsIGZvb18tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJUZXN0U2VydmljZS5CYXIiLCBiYXJfLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiY29yZ2UuZ3JhdWx0LlRlc3RTZXJ2aWNlMi5Gb28iLCBmb28yXy0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0U2VydmljZTIuQmF6IiwgYmF6Ml8tPmZ1bGxfbmFtZSgpKTsKLX0KLQotVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5kZXgpIHsKLSAgRVhQRUNUX0VRKDAsIGZvb18tPmluZGV4KCkpOwotICBFWFBFQ1RfRVEoMSwgYmFyXy0+aW5kZXgoKSk7Ci19Ci0KLVRFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZFBhcmVudCkgewotICBFWFBFQ1RfRVEoc2VydmljZV8sIGZvb18tPnNlcnZpY2UoKSk7Ci0gIEVYUEVDVF9FUShzZXJ2aWNlXywgYmFyXy0+c2VydmljZSgpKTsKLX0KLQotVEVTVF9GKFNlcnZpY2VEZXNjcmlwdG9yVGVzdCwgTWV0aG9kSW5wdXRUeXBlKSB7Ci0gIEVYUEVDVF9FUShmb29fcmVxdWVzdF8sIGZvb18tPmlucHV0X3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShiYXJfcmVxdWVzdF8sIGJhcl8tPmlucHV0X3R5cGUoKSk7Ci19Ci0KLVRFU1RfRihTZXJ2aWNlRGVzY3JpcHRvclRlc3QsIE1ldGhvZE91dHB1dFR5cGUpIHsKLSAgRVhQRUNUX0VRKGZvb19yZXNwb25zZV8sIGZvb18tPm91dHB1dF90eXBlKCkpOwotICBFWFBFQ1RfRVEoYmFyX3Jlc3BvbnNlXywgYmFyXy0+b3V0cHV0X3R5cGUoKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gVGVzdCBuZXN0ZWQgdHlwZXMuCi1jbGFzcyBOZXN0ZWREZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLSAgICAvLwotICAgIC8vICAgLy8gaW4gImZvby5wcm90byIKLSAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UgewotICAgIC8vICAgICBtZXNzYWdlIEZvbyB7fQotICAgIC8vICAgICBtZXNzYWdlIEJhciB7fQotICAgIC8vICAgICBlbnVtIEJheiB7IEEgPSAxOyB9Ci0gICAgLy8gICAgIGVudW0gUXV4IHsgQiA9IDE7IH0KLSAgICAvLyAgIH0KLSAgICAvLwotICAgIC8vICAgLy8gaW4gImJhci5wcm90byIKLSAgICAvLyAgIHBhY2thZ2UgY29yZ2UuZ3JhdWx0OwotICAgIC8vICAgbWVzc2FnZSBUZXN0TWVzc2FnZTIgewotICAgIC8vICAgICBtZXNzYWdlIEZvbyB7fQotICAgIC8vICAgICBtZXNzYWdlIEJheiB7fQotICAgIC8vICAgICBlbnVtIFF1eCAgeyBBID0gMTsgfQotICAgIC8vICAgICBlbnVtIFF1dXggeyBDID0gMTsgfQotICAgIC8vICAgfQotICAgIC8vCi0gICAgLy8gVGVzdE1lc3NhZ2UyIGlzIHByaW1hcmlseSBoZXJlIHRvIHRlc3QgRmluZE5lc3RlZFR5cGVCeU5hbWUgYW5kIGZyaWVuZHMuCi0gICAgLy8gQWxsIG1lc3NhZ2VzIGNyZWF0ZWQgZnJvbSB0aGUgc2FtZSBEZXNjcmlwdG9yUG9vbCBzaGFyZSB0aGUgc2FtZSBsb29rdXAKLSAgICAvLyB0YWJsZSwgc28gd2UgbmVlZCB0byBpbnN1cmUgdGhhdCB0aGV5IGRvbid0IGludGVyZmVyZS4KLSAgICAvLwotICAgIC8vIFdlIGFkZCBlbnVtIHZhbHVlcyB0byB0aGUgZW51bXMgaW4gb3JkZXIgdG8gdGVzdCBzZWFyY2hpbmcgZm9yIGVudW0KLSAgICAvLyB2YWx1ZXMgYWNyb3NzIGEgbWVzc2FnZSdzIHNjb3BlLgotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKLSAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0KLSAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlRlc3RNZXNzYWdlIik7Ci0gICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlLCAiRm9vIik7Ci0gICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlLCAiQmFyIik7Ci0gICAgRW51bURlc2NyaXB0b3JQcm90byogYmF6ID0gQWRkTmVzdGVkRW51bShtZXNzYWdlLCAiQmF6Iik7Ci0gICAgQWRkRW51bVZhbHVlKGJheiwgIkEiLCAxKTsKLSAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBxdXggPSBBZGROZXN0ZWRFbnVtKG1lc3NhZ2UsICJRdXgiKTsKLSAgICBBZGRFbnVtVmFsdWUocXV4LCAiQiIsIDEpOwotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBiYXJfZmlsZTsKLSAgICBiYXJfZmlsZS5zZXRfbmFtZSgiYmFyLnByb3RvIik7Ci0gICAgYmFyX2ZpbGUuc2V0X3BhY2thZ2UoImNvcmdlLmdyYXVsdCIpOwotCi0gICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlMiA9IEFkZE1lc3NhZ2UoJmJhcl9maWxlLCAiVGVzdE1lc3NhZ2UyIik7Ci0gICAgQWRkTmVzdGVkTWVzc2FnZShtZXNzYWdlMiwgIkZvbyIpOwotICAgIEFkZE5lc3RlZE1lc3NhZ2UobWVzc2FnZTIsICJCYXoiKTsKLSAgICBFbnVtRGVzY3JpcHRvclByb3RvKiBxdXgyID0gQWRkTmVzdGVkRW51bShtZXNzYWdlMiwgIlF1eCIpOwotICAgIEFkZEVudW1WYWx1ZShxdXgyLCAiQSIsIDEpOwotICAgIEVudW1EZXNjcmlwdG9yUHJvdG8qIHF1dXgyID0gQWRkTmVzdGVkRW51bShtZXNzYWdlMiwgIlF1dXgiKTsKLSAgICBBZGRFbnVtVmFsdWUocXV1eDIsICJDIiwgMSk7Ci0KLSAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCi0gICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKLSAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7Ci0KLSAgICBiYXJfZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoYmFyX2ZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGJhcl9maWxlXyAhPSBOVUxMKTsKLQotICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBtZXNzYWdlXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOwotCi0gICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2VfLT5uZXN0ZWRfdHlwZV9jb3VudCgpKTsKLSAgICBmb29fID0gbWVzc2FnZV8tPm5lc3RlZF90eXBlKDApOwotICAgIGJhcl8gPSBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMSk7Ci0KLSAgICBBU1NFUlRfRVEoMiwgbWVzc2FnZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKLSAgICBiYXpfID0gbWVzc2FnZV8tPmVudW1fdHlwZSgwKTsKLSAgICBxdXhfID0gbWVzc2FnZV8tPmVudW1fdHlwZSgxKTsKLQotICAgIEFTU0VSVF9FUSgxLCBiYXpfLT52YWx1ZV9jb3VudCgpKTsKLSAgICBhXyA9IGJhel8tPnZhbHVlKDApOwotICAgIEFTU0VSVF9FUSgxLCBxdXhfLT52YWx1ZV9jb3VudCgpKTsKLSAgICBiXyA9IHF1eF8tPnZhbHVlKDApOwotCi0gICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwotICAgIG1lc3NhZ2UyXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOwotCi0gICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UyXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7Ci0gICAgZm9vMl8gPSBtZXNzYWdlMl8tPm5lc3RlZF90eXBlKDApOwotICAgIGJhejJfID0gbWVzc2FnZTJfLT5uZXN0ZWRfdHlwZSgxKTsKLQotICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlMl8tPmVudW1fdHlwZV9jb3VudCgpKTsKLSAgICBxdXgyXyA9IG1lc3NhZ2UyXy0+ZW51bV90eXBlKDApOwotICAgIHF1dXgyXyA9IG1lc3NhZ2UyXy0+ZW51bV90eXBlKDEpOwotCi0gICAgQVNTRVJUX0VRKDEsIHF1eDJfLT52YWx1ZV9jb3VudCgpKTsKLSAgICBhMl8gPSBxdXgyXy0+dmFsdWUoMCk7Ci0gICAgQVNTRVJUX0VRKDEsIHF1dXgyXy0+dmFsdWVfY291bnQoKSk7Ci0gICAgYzJfID0gcXV1eDJfLT52YWx1ZSgwKTsKLSAgfQotCi0gIERlc2NyaXB0b3JQb29sIHBvb2xfOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UyXzsKLQotICBjb25zdCBEZXNjcmlwdG9yKiBmb29fOwotICBjb25zdCBEZXNjcmlwdG9yKiBiYXJfOwotICBjb25zdCBFbnVtRGVzY3JpcHRvciogYmF6XzsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIHF1eF87Ci0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGFfOwotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBiXzsKLQotICBjb25zdCBEZXNjcmlwdG9yKiBmb28yXzsKLSAgY29uc3QgRGVzY3JpcHRvciogYmF6Ml87Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBxdXgyXzsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIHF1dXgyXzsKLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogYTJfOwotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBjMl87Ci19OwotCi1URVNUX0YoTmVzdGVkRGVzY3JpcHRvclRlc3QsIE1lc3NhZ2VOYW1lKSB7Ci0gIEVYUEVDVF9FUSgiRm9vIiwgZm9vXyAtPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiQmFyIiwgYmFyXyAtPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiRm9vIiwgZm9vMl8tPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiQmF6IiwgYmF6Ml8tPm5hbWUoKSk7Ci0KLSAgRVhQRUNUX0VRKCJUZXN0TWVzc2FnZS5Gb28iLCBmb29fLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuQmFyIiwgYmFyXy0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImNvcmdlLmdyYXVsdC5UZXN0TWVzc2FnZTIuRm9vIiwgZm9vMl8tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLkJheiIsIGJhejJfLT5mdWxsX25hbWUoKSk7Ci19Ci0KLVRFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTWVzc2FnZUNvbnRhaW5pbmdUeXBlKSB7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXyAsIGZvb18gLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXyAsIGJhcl8gLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMl8sIGZvbzJfLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlMl8sIGJhejJfLT5jb250YWluaW5nX3R5cGUoKSk7Ci19Ci0KLVRFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTmVzdGVkTWVzc2FnZXNCeUluZGV4KSB7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7Ci0gIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMCkpOwotICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpKTsKLX0KLQotVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRmllbGRCeU5hbWVEb2VzbnRGaW5kTmVzdGVkVHlwZXMpIHsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8tPkZpbmRGaWVsZEJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRmllbGRCeU5hbWUoIlF1eCIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJRdXgiKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kTmVzdGVkVHlwZUJ5TmFtZSkgewotICBFWFBFQ1RfRVEoZm9vXyAsIG1lc3NhZ2VfIC0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkZvbyIpKTsKLSAgRVhQRUNUX0VRKGJhcl8gLCBtZXNzYWdlXyAtPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJCYXIiKSk7Ci0gIEVYUEVDVF9FUShmb28yXywgbWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiRm9vIikpOwotICBFWFBFQ1RfRVEoYmF6Ml8sIG1lc3NhZ2UyXy0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkJheiIpKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlXyAtPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfIC0+RmluZE5lc3RlZFR5cGVCeU5hbWUoIkJheiIgICAgICAgKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiQmFyIiAgICAgICApID09IE5VTEwpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiUXV4IikgPT0gTlVMTCk7Ci19Ci0KLVRFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgRW51bU5hbWUpIHsKLSAgRVhQRUNUX0VRKCJCYXoiICwgYmF6XyAtPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiUXV4IiAsIHF1eF8gLT5uYW1lKCkpOwotICBFWFBFQ1RfRVEoIlF1eCIgLCBxdXgyXy0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJRdXV4IiwgcXV1eDJfLT5uYW1lKCkpOwotCi0gIEVYUEVDVF9FUSgiVGVzdE1lc3NhZ2UuQmF6IiwgYmF6Xy0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoIlRlc3RNZXNzYWdlLlF1eCIsIHF1eF8tPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLlF1eCIgLCBxdXgyXyAtPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLlF1dXgiLCBxdXV4Ml8tPmZ1bGxfbmFtZSgpKTsKLX0KLQotVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBFbnVtQ29udGFpbmluZ1R5cGUpIHsKLSAgRVhQRUNUX0VRKG1lc3NhZ2VfICwgYmF6XyAgLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlXyAsIHF1eF8gIC0+Y29udGFpbmluZ190eXBlKCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZTJfLCBxdXgyXyAtPmNvbnRhaW5pbmdfdHlwZSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UyXywgcXV1eDJfLT5jb250YWluaW5nX3R5cGUoKSk7Ci19Ci0KLVRFU1RfRihOZXN0ZWREZXNjcmlwdG9yVGVzdCwgTmVzdGVkRW51bXNCeUluZGV4KSB7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGVfY291bnQoKSk7Ci0gIEVYUEVDVF9FUShmb29fLCBtZXNzYWdlXy0+bmVzdGVkX3R5cGUoMCkpOwotICBFWFBFQ1RfRVEoYmFyXywgbWVzc2FnZV8tPm5lc3RlZF90eXBlKDEpKTsKLX0KLQotVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVR5cGVCeU5hbWUpIHsKLSAgRVhQRUNUX0VRKGJhel8gICwgbWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIgKSk7Ci0gIEVYUEVDVF9FUShxdXhfICAsIG1lc3NhZ2VfIC0+RmluZEVudW1UeXBlQnlOYW1lKCJRdXgiICkpOwotICBFWFBFQ1RfRVEocXV4Ml8gLCBtZXNzYWdlMl8tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiUXV4IiApKTsKLSAgRVhQRUNUX0VRKHF1dXgyXywgbWVzc2FnZTJfLT5GaW5kRW51bVR5cGVCeU5hbWUoIlF1dXgiKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVR5cGVCeU5hbWUoIlF1dXgiICAgICAgKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTJfLT5GaW5kRW51bVR5cGVCeU5hbWUoIkJheiIgICAgICAgKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlXy0+RmluZEVudW1UeXBlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKE5lc3RlZERlc2NyaXB0b3JUZXN0LCBGaW5kRW51bVZhbHVlQnlOYW1lKSB7Ci0gIEVYUEVDVF9FUShhXyAsIG1lc3NhZ2VfIC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQSIpKTsKLSAgRVhQRUNUX0VRKGJfICwgbWVzc2FnZV8gLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJCIikpOwotICBFWFBFQ1RfRVEoYTJfLCBtZXNzYWdlMl8tPkZpbmRFbnVtVmFsdWVCeU5hbWUoIkEiKSk7Ci0gIEVYUEVDVF9FUShjMl8sIG1lc3NhZ2UyXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQyIpKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlXyAtPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV8gLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJDIiAgICAgICAgICAgICkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyXy0+RmluZEVudW1WYWx1ZUJ5TmFtZSgiQiIgICAgICAgICAgICApID09IE5VTEwpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2VfLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBUZXN0IGV4dGVuc2lvbnMuCi1jbGFzcyBFeHRlbnNpb25EZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLSAgICAvLwotICAgIC8vICAgZW51bSBCYXoge30KLSAgICAvLyAgIG1lc3NhZ2UgUXV4IHt9Ci0gICAgLy8KLSAgICAvLyAgIG1lc3NhZ2UgRm9vIHsKLSAgICAvLyAgICAgZXh0ZW5zaW9ucyAxMCB0byAxOTsKLSAgICAvLyAgICAgZXh0ZW5zaW9ucyAzMCB0byAzOTsKLSAgICAvLyAgIH0KLSAgICAvLyAgIGV4dGVuZHMgRm9vIHdpdGggb3B0aW9uYWwgaW50MzIgZm9vX2ludDMyID0gMTA7Ci0gICAgLy8gICBleHRlbmRzIEZvbyB3aXRoIHJlcGVhdGVkIFRlc3RFbnVtIGZvb19lbnVtID0gMTk7Ci0gICAgLy8gICBtZXNzYWdlIEJhciB7Ci0gICAgLy8gICAgIGV4dGVuZHMgRm9vIHdpdGggb3B0aW9uYWwgUXV4IGZvb19tZXNzYWdlID0gMzA7Ci0gICAgLy8gICAgIC8vICh1c2luZyBRdXggYXMgdGhlIGdyb3VwIHR5cGUpCi0gICAgLy8gICAgIGV4dGVuZHMgRm9vIHdpdGggcmVwZWF0ZWQgZ3JvdXAgZm9vX2dyb3VwID0gMzk7Ci0gICAgLy8gICB9Ci0KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZvb19maWxlOwotICAgIGZvb19maWxlLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKLQotICAgIEFkZEVtcHR5RW51bSgmZm9vX2ZpbGUsICJCYXoiKTsKLSAgICBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIlF1eCIpOwotCi0gICAgRGVzY3JpcHRvclByb3RvKiBmb28gPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkZvbyIpOwotICAgIEFkZEV4dGVuc2lvblJhbmdlKGZvbywgMTAsIDIwKTsKLSAgICBBZGRFeHRlbnNpb25SYW5nZShmb28sIDMwLCA0MCk7Ci0KLSAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19pbnQzMiIsIDEwLAotICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgICBBZGRFeHRlbnNpb24oJmZvb19maWxlLCAiRm9vIiwgImZvb19lbnVtIiwgMTksCi0gICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKLSAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTSkKLSAgICAgIC0+c2V0X3R5cGVfbmFtZSgiQmF6Iik7Ci0KLSAgICBEZXNjcmlwdG9yUHJvdG8qIGJhciA9IEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiQmFyIik7Ci0gICAgQWRkTmVzdGVkRXh0ZW5zaW9uKGJhciwgIkZvbyIsICJmb29fbWVzc2FnZSIsIDMwLAotICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0UpCi0gICAgICAtPnNldF90eXBlX25hbWUoIlF1eCIpOwotICAgIEFkZE5lc3RlZEV4dGVuc2lvbihiYXIsICJGb28iLCAiZm9vX2dyb3VwIiwgMzksCi0gICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfR1JPVVApCi0gICAgICAtPnNldF90eXBlX25hbWUoIlF1eCIpOwotCi0gICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgotICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7Ci0gICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOwotCi0gICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+ZW51bV90eXBlX2NvdW50KCkpOwotICAgIGJhel8gPSBmb29fZmlsZV8tPmVudW1fdHlwZSgwKTsKLQotICAgIEFTU0VSVF9FUSgzLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBxdXhfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7Ci0gICAgZm9vXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDEpOwotICAgIGJhcl8gPSBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZSgyKTsKLSAgfQotCi0gIERlc2NyaXB0b3JQb29sIHBvb2xfOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogZm9vXzsKLSAgY29uc3QgRGVzY3JpcHRvciogYmFyXzsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIGJhel87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIHF1eF87Ci19OwotCi1URVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEV4dGVuc2lvblJhbmdlcykgewotICBFWFBFQ1RfRVEoMCwgYmFyXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOwotICBBU1NFUlRfRVEoMiwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOwotCi0gIEVYUEVDVF9FUSgxMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDApLT5zdGFydCk7Ci0gIEVYUEVDVF9FUSgzMCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5zdGFydCk7Ci0KLSAgRVhQRUNUX0VRKDIwLCBmb29fLT5leHRlbnNpb25fcmFuZ2UoMCktPmVuZCk7Ci0gIEVYUEVDVF9FUSg0MCwgZm9vXy0+ZXh0ZW5zaW9uX3JhbmdlKDEpLT5lbmQpOwotfTsKLQotVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBFeHRlbnNpb25zKSB7Ci0gIEVYUEVDVF9FUSgwLCBmb29fLT5leHRlbnNpb25fY291bnQoKSk7Ci0gIEFTU0VSVF9FUSgyLCBmb29fZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpKTsKLSAgQVNTRVJUX0VRKDIsIGJhcl8tPmV4dGVuc2lvbl9jb3VudCgpKTsKLQotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+aXNfZXh0ZW5zaW9uKCkpOwotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+aXNfZXh0ZW5zaW9uKCkpOwotICBFWFBFQ1RfVFJVRShiYXJfLT5leHRlbnNpb24oMCktPmlzX2V4dGVuc2lvbigpKTsKLSAgRVhQRUNUX1RSVUUoYmFyXy0+ZXh0ZW5zaW9uKDEpLT5pc19leHRlbnNpb24oKSk7Ci0KLSAgRVhQRUNUX0VRKCJmb29faW50MzIiICAsIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5uYW1lKCkpOwotICBFWFBFQ1RfRVEoImZvb19lbnVtIiAgICwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vX21lc3NhZ2UiLCBiYXJfLT5leHRlbnNpb24oMCktPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vX2dyb3VwIiAgLCBiYXJfLT5leHRlbnNpb24oMSktPm5hbWUoKSk7Ci0KLSAgRVhQRUNUX0VRKDEwLCBmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOwotICBFWFBFQ1RfRVEoMTksIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5udW1iZXIoKSk7Ci0gIEVYUEVDVF9FUSgzMCwgYmFyXy0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSk7Ci0gIEVYUEVDVF9FUSgzOSwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5udW1iZXIoKSk7Ci0KLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgLCBmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+dHlwZSgpKTsKLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+dHlwZSgpKTsKLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXJfLT5leHRlbnNpb24oMCktPnR5cGUoKSk7Ci0gIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICwgYmFyXy0+ZXh0ZW5zaW9uKDEpLT50eXBlKCkpOwotCi0gIEVYUEVDVF9FUShiYXpfLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+ZW51bV90eXBlKCkpOwotICBFWFBFQ1RfRVEocXV4XywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5tZXNzYWdlX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShxdXhfLCBiYXJfLT5leHRlbnNpb24oMSktPm1lc3NhZ2VfdHlwZSgpKTsKLQotICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMCktPmxhYmVsKCkpOwotICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCwgZm9vX2ZpbGVfLT5leHRlbnNpb24oMSktPmxhYmVsKCkpOwotICBFWFBFQ1RfRVEoRmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTCwgYmFyXy0+ZXh0ZW5zaW9uKDApLT5sYWJlbCgpKTsKLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIGJhcl8tPmV4dGVuc2lvbigxKS0+bGFiZWwoKSk7Ci0KLSAgRVhQRUNUX0VRKGZvb18sIGZvb19maWxlXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShmb29fLCBmb29fZmlsZV8tPmV4dGVuc2lvbigxKS0+Y29udGFpbmluZ190eXBlKCkpOwotICBFWFBFQ1RfRVEoZm9vXywgYmFyXy0+ZXh0ZW5zaW9uKDApLT5jb250YWluaW5nX3R5cGUoKSk7Ci0gIEVYUEVDVF9FUShmb29fLCBiYXJfLT5leHRlbnNpb24oMSktPmNvbnRhaW5pbmdfdHlwZSgpKTsKLQotICBFWFBFQ1RfVFJVRShmb29fZmlsZV8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZvb19maWxlXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKTsKLSAgRVhQRUNUX0VRKGJhcl8sIGJhcl8tPmV4dGVuc2lvbigwKS0+ZXh0ZW5zaW9uX3Njb3BlKCkpOwotICBFWFBFQ1RfRVEoYmFyXywgYmFyXy0+ZXh0ZW5zaW9uKDEpLT5leHRlbnNpb25fc2NvcGUoKSk7Ci19OwotCi1URVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIElzRXh0ZW5zaW9uTnVtYmVyKSB7Ci0gIEVYUEVDVF9GQUxTRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlciggOSkpOwotICBFWFBFQ1RfVFJVRSAoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMTApKTsKLSAgRVhQRUNUX1RSVUUgKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDE5KSk7Ci0gIEVYUEVDVF9GQUxTRShmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigyMCkpOwotICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoMjkpKTsKLSAgRVhQRUNUX1RSVUUgKGZvb18tPklzRXh0ZW5zaW9uTnVtYmVyKDMwKSk7Ci0gIEVYUEVDVF9UUlVFIChmb29fLT5Jc0V4dGVuc2lvbk51bWJlcigzOSkpOwotICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNFeHRlbnNpb25OdW1iZXIoNDApKTsKLX0KLQotVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBGaW5kRXh0ZW5zaW9uQnlOYW1lKSB7Ci0gIC8vIE5vdGUgdGhhdCBGaWxlRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpIGlzIHRlc3RlZCBieQotICAvLyBGaWxlRGVzY3JpcHRvclRlc3QuCi0gIEFTU0VSVF9FUSgyLCBiYXJfLT5leHRlbnNpb25fY291bnQoKSk7Ci0KLSAgRVhQRUNUX0VRKGJhcl8tPmV4dGVuc2lvbigwKSwgYmFyXy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9FUShiYXJfLT5leHRlbnNpb24oMSksIGJhcl8tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19ncm91cCIgICkpOwotCi0gIEVYUEVDVF9UUlVFKGJhcl8tPkZpbmRFeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZvb18tPkZpbmRFeHRlbnNpb25CeU5hbWUoImZvb19pbnQzMiIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmb29fLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJmb29fbWVzc2FnZSIpID09IE5VTEwpOwotfQotCi1URVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIEZpbmRBbGxFeHRlbnNpb25zKSB7Ci0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOwotICBwb29sXy5GaW5kQWxsRXh0ZW5zaW9ucyhmb29fLCAmZXh0ZW5zaW9ucyk7Ci0gIEFTU0VSVF9FUSg0LCBleHRlbnNpb25zLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgxMCwgZXh0ZW5zaW9uc1swXS0+bnVtYmVyKCkpOwotICBFWFBFQ1RfRVEoMTksIGV4dGVuc2lvbnNbMV0tPm51bWJlcigpKTsKLSAgRVhQRUNUX0VRKDMwLCBleHRlbnNpb25zWzJdLT5udW1iZXIoKSk7Ci0gIEVYUEVDVF9FUSgzOSwgZXh0ZW5zaW9uc1szXS0+bnVtYmVyKCkpOwotfQotCi1URVNUX0YoRXh0ZW5zaW9uRGVzY3JpcHRvclRlc3QsIER1cGxpY2F0ZUZpZWxkTnVtYmVyKSB7Ci0gIERlc2NyaXB0b3JQb29sIHBvb2w7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgLy8gQWRkICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIuCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKLSAgLy8gQWRkICJmb28ucHJvdG8iOgotICAvLyAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOwotICAvLyAgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsKLSAgLy8gICAgIG9wdGlvbmFsIGludDMyIG9wdGlvbjEgPSAxMDAwOwotICAvLyAgIH0KLSAgZmlsZV9wcm90by5DbGVhcigpOwotICBmaWxlX3Byb3RvLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKLSAgZmlsZV9wcm90by5hZGRfZGVwZW5kZW5jeSgiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKTsKLSAgQWRkRXh0ZW5zaW9uKCZmaWxlX3Byb3RvLCAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyIsICJvcHRpb24xIiwgMTAwMCwKLSAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKLSAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7Ci0gIC8vIEFkZCAiYmFyLnByb3RvIjoKLSAgLy8gICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKLSAgLy8gICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyB7Ci0gIC8vICAgICBvcHRpb25hbCBpbnQzMiBvcHRpb24yID0gMTAwMDsKLSAgLy8gICB9Ci0gIGZpbGVfcHJvdG8uQ2xlYXIoKTsKLSAgZmlsZV9wcm90by5zZXRfbmFtZSgiYmFyLnByb3RvIik7Ci0gIGZpbGVfcHJvdG8uYWRkX2RlcGVuZGVuY3koImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIik7Ci0gIEFkZEV4dGVuc2lvbigmZmlsZV9wcm90bywgImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMiLCAib3B0aW9uMiIsIDEwMDAsCi0gICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7Ci0gIC8vIEN1cnJlbnRseSB3ZSBvbmx5IGdlbmVyYXRlIGEgd2FybmluZyBmb3IgY29uZmxpY3RpbmcgZXh0ZW5zaW9uIG51bWJlcnMuCi0gIC8vIFRPRE8oeGlhb2ZlbmcpOiBDaGFuZ2UgaXQgdG8gYW4gZXJyb3IuCi0gIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIFRlc3QgcmVzZXJ2ZWQgZmllbGRzLgotY2xhc3MgUmVzZXJ2ZWREZXNjcmlwdG9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICAvLyBCdWlsZCBkZXNjcmlwdG9ycyBmb3IgdGhlIGZvbGxvd2luZyBkZWZpbml0aW9uczoKLSAgICAvLwotICAgIC8vICAgbWVzc2FnZSBGb28gewotICAgIC8vICAgICByZXNlcnZlZCAyLCA5IHRvIDExLCAxNTsKLSAgICAvLyAgICAgcmVzZXJ2ZWQgImZvbyIsICJiYXIiOwotICAgIC8vICAgfQotCi0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fZmlsZTsKLSAgICBmb29fZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0KLSAgICBEZXNjcmlwdG9yUHJvdG8qIGZvbyA9IEFkZE1lc3NhZ2UoJmZvb19maWxlLCAiRm9vIik7Ci0gICAgQWRkUmVzZXJ2ZWRSYW5nZShmb28sIDIsIDMpOwotICAgIEFkZFJlc2VydmVkUmFuZ2UoZm9vLCA5LCAxMik7Ci0gICAgQWRkUmVzZXJ2ZWRSYW5nZShmb28sIDE1LCAxNik7Ci0KLSAgICBmb28tPmFkZF9yZXNlcnZlZF9uYW1lKCJmb28iKTsKLSAgICBmb28tPmFkZF9yZXNlcnZlZF9uYW1lKCJiYXIiKTsKLQotICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KLSAgICBmb29fZmlsZV8gPSBwb29sXy5CdWlsZEZpbGUoZm9vX2ZpbGUpOwotICAgIEFTU0VSVF9UUlVFKGZvb19maWxlXyAhPSBOVUxMKTsKLQotICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgICBmb29fID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7Ci0gIH0KLQotICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKLSAgY29uc3QgRGVzY3JpcHRvciogZm9vXzsKLX07Ci0KLVRFU1RfRihSZXNlcnZlZERlc2NyaXB0b3JUZXN0LCBSZXNlcnZlZFJhbmdlcykgewotICBBU1NFUlRfRVEoMywgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2VfY291bnQoKSk7Ci0KLSAgRVhQRUNUX0VRKDIsIGZvb18tPnJlc2VydmVkX3JhbmdlKDApLT5zdGFydCk7Ci0gIEVYUEVDVF9FUSgzLCBmb29fLT5yZXNlcnZlZF9yYW5nZSgwKS0+ZW5kKTsKLQotICBFWFBFQ1RfRVEoOSwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMSktPnN0YXJ0KTsKLSAgRVhQRUNUX0VRKDEyLCBmb29fLT5yZXNlcnZlZF9yYW5nZSgxKS0+ZW5kKTsKLQotICBFWFBFQ1RfRVEoMTUsIGZvb18tPnJlc2VydmVkX3JhbmdlKDIpLT5zdGFydCk7Ci0gIEVYUEVDVF9FUSgxNiwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMiktPmVuZCk7Ci19OwotCi1URVNUX0YoUmVzZXJ2ZWREZXNjcmlwdG9yVGVzdCwgSXNSZXNlcnZlZE51bWJlcikgewotICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigxKSk7Ci0gIEVYUEVDVF9UUlVFIChmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDIpKTsKLSAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMykpOwotICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNSZXNlcnZlZE51bWJlcig4KSk7Ci0gIEVYUEVDVF9UUlVFIChmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDkpKTsKLSAgRVhQRUNUX1RSVUUgKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTApKTsKLSAgRVhQRUNUX1RSVUUgKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTEpKTsKLSAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTIpKTsKLSAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTMpKTsKLSAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTQpKTsKLSAgRVhQRUNUX1RSVUUgKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTUpKTsKLSAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMTYpKTsKLX07Ci0KLVRFU1RfRihSZXNlcnZlZERlc2NyaXB0b3JUZXN0LCBSZXNlcnZlZE5hbWVzKSB7Ci0gIEFTU0VSVF9FUSgyLCBmb29fLT5yZXNlcnZlZF9uYW1lX2NvdW50KCkpOwotCi0gIEVYUEVDVF9FUSgiZm9vIiwgZm9vXy0+cmVzZXJ2ZWRfbmFtZSgwKSk7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgZm9vXy0+cmVzZXJ2ZWRfbmFtZSgxKSk7Ci19OwotCi1URVNUX0YoUmVzZXJ2ZWREZXNjcmlwdG9yVGVzdCwgSXNSZXNlcnZlZE5hbWUpIHsKLSAgRVhQRUNUX1RSVUUgKGZvb18tPklzUmVzZXJ2ZWROYW1lKCJmb28iKSk7Ci0gIEVYUEVDVF9UUlVFIChmb29fLT5Jc1Jlc2VydmVkTmFtZSgiYmFyIikpOwotICBFWFBFQ1RfRkFMU0UoZm9vXy0+SXNSZXNlcnZlZE5hbWUoImJheiIpKTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgTWlzY1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAvLyBGdW5jdGlvbiB3aGljaCBtYWtlcyBhIGZpZWxkIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIHR5cGUuCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICAgIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOwotICAgIEFkZEVtcHR5RW51bSgmZmlsZV9wcm90bywgIkR1bW15RW51bSIpOwotCi0gICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlID0gQWRkTWVzc2FnZSgmZmlsZV9wcm90bywgIlRlc3RNZXNzYWdlIik7Ci0gICAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkID0KLSAgICAgIEFkZEZpZWxkKG1lc3NhZ2UsICJmb28iLCAxLCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZT4oc3RhdGljX2Nhc3Q8aW50Pih0eXBlKSkpOwotCi0gICAgaWYgKHR5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgfHwKLSAgICAgICAgdHlwZSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKLSAgICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKCJUZXN0TWVzc2FnZSIpOwotICAgIH0gZWxzZSBpZiAodHlwZSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSkgewotICAgICAgZmllbGQtPnNldF90eXBlX25hbWUoIkR1bW15RW51bSIpOwotICAgIH0KLQotICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KLSAgICBwb29sXy5yZXNldChuZXcgRGVzY3JpcHRvclBvb2woKSk7Ci0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sXy0+QnVpbGRGaWxlKGZpbGVfcHJvdG8pOwotCi0gICAgaWYgKGZpbGUgIT0gTlVMTCAmJgotICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSA9PSAxICYmCi0gICAgICAgIGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGRfY291bnQoKSA9PSAxKSB7Ci0gICAgICByZXR1cm4gZmlsZS0+bWVzc2FnZV90eXBlKDApLT5maWVsZCgwKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICB9Ci0KLSAgY29uc3QgY2hhciogR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKHR5cGUpOwotICAgIHJldHVybiBmaWVsZCAhPSBOVUxMID8gZmllbGQtPnR5cGVfbmFtZSgpIDogIiI7Ci0gIH0KLQotICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBHZXRGaWVsZERlc2NyaXB0b3JPZlR5cGUodHlwZSk7Ci0gICAgcmV0dXJuIGZpZWxkICE9IE5VTEwgPyBmaWVsZC0+Y3BwX3R5cGUoKSA6Ci0gICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZT4oMCk7Ci0gIH0KLQotICBjb25zdCBjaGFyKiBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBHZXRGaWVsZERlc2NyaXB0b3JPZlR5cGUodHlwZSk7Ci0gICAgcmV0dXJuIGZpZWxkICE9IE5VTEwgPyBmaWVsZC0+Y3BwX3R5cGVfbmFtZSgpIDogIiI7Ci0gIH0KLQotICBjb25zdCBEZXNjcmlwdG9yKiBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZSgKLSAgICAgIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IEdldEZpZWxkRGVzY3JpcHRvck9mVHlwZSh0eXBlKTsKLSAgICByZXR1cm4gZmllbGQgIT0gTlVMTCA/IGZpZWxkLT5tZXNzYWdlX3R5cGUoKSA6IE5VTEw7Ci0gIH0KLQotICBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoCi0gICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKHR5cGUpOwotICAgIHJldHVybiBmaWVsZCAhPSBOVUxMID8gZmllbGQtPmVudW1fdHlwZSgpIDogTlVMTDsKLSAgfQotCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RGVzY3JpcHRvclBvb2w+IHBvb2xfOwotfTsKLQotVEVTVF9GKE1pc2NUZXN0LCBUeXBlTmFtZXMpIHsKLSAgLy8gVGVzdCB0aGF0IGNvcnJlY3QgdHlwZSBuYW1lcyBhcmUgcmV0dXJuZWQuCi0KLSAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3IgRkQ7ICAvLyBhdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKLQotICBFWFBFQ1RfU1RSRVEoImRvdWJsZSIgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRE9VQkxFICApKTsKLSAgRVhQRUNUX1NUUkVRKCJmbG9hdCIgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZMT0FUICAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgiaW50NjQiICAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQ2NCAgICkpOwotICBFWFBFQ1RfU1RSRVEoInVpbnQ2NCIgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0ICApKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDMyICAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgiZml4ZWQ2NCIgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDY0ICkpOwotICBFWFBFQ1RfU1RSRVEoImZpeGVkMzIiICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMiApKTsKLSAgRVhQRUNUX1NUUkVRKCJib29sIiAgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wgICAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgic3RyaW5nIiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TVFJJTkcgICkpOwotICBFWFBFQ1RfU1RSRVEoImdyb3VwIiAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfR1JPVVAgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UgKSk7Ci0gIEVYUEVDVF9TVFJFUSgiYnl0ZXMiICAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9CWVRFUyAgICkpOwotICBFWFBFQ1RfU1RSRVEoInVpbnQzMiIgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyICApKTsKLSAgRVhQRUNUX1NUUkVRKCJlbnVtIiAgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0gICAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgic2ZpeGVkMzIiLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQzMikpOwotICBFWFBFQ1RfU1RSRVEoInNmaXhlZDY0IiwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKLSAgRVhQRUNUX1NUUkVRKCJzaW50MzIiICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQzMiAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgic2ludDY0IiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TSU5UNjQgICkpOwotfQotCi1URVNUX0YoTWlzY1Rlc3QsIFN0YXRpY1R5cGVOYW1lcykgewotICAvLyBUZXN0IHRoYXQgY29ycmVjdCB0eXBlIG5hbWVzIGFyZSByZXR1cm5lZC4KLQotICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZwotCi0gIEVYUEVDVF9TVFJFUSgiZG91YmxlIiAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfRE9VQkxFICApKTsKLSAgRVhQRUNUX1NUUkVRKCJmbG9hdCIgICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9GTE9BVCAgICkpOwotICBFWFBFQ1RfU1RSRVEoImludDY0IiAgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0lOVDY0ICAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgidWludDY0IiAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfVUlOVDY0ICApKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9JTlQzMiAgICkpOwotICBFWFBFQ1RfU1RSRVEoImZpeGVkNjQiICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0ZJWEVENjQgKSk7Ci0gIEVYUEVDVF9TVFJFUSgiZml4ZWQzMiIgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfRklYRUQzMiApKTsKLSAgRVhQRUNUX1NUUkVRKCJib29sIiAgICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9CT09MICAgICkpOwotICBFWFBFQ1RfU1RSRVEoInN0cmluZyIgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX1NUUklORyAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgiZ3JvdXAiICAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfR1JPVVAgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9NRVNTQUdFICkpOwotICBFWFBFQ1RfU1RSRVEoImJ5dGVzIiAgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0JZVEVTICAgKSk7Ci0gIEVYUEVDVF9TVFJFUSgidWludDMyIiAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfVUlOVDMyICApKTsKLSAgRVhQRUNUX1NUUkVRKCJlbnVtIiAgICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9FTlVNICAgICkpOwotICBFWFBFQ1RfU1RSRVEoInNmaXhlZDMyIiwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX1NGSVhFRDMyKSk7Ci0gIEVYUEVDVF9TVFJFUSgic2ZpeGVkNjQiLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKLSAgRVhQRUNUX1NUUkVRKCJzaW50MzIiICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9TSU5UMzIgICkpOwotICBFWFBFQ1RfU1RSRVEoInNpbnQ2NCIgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX1NJTlQ2NCAgKSk7Ci19Ci0KLVRFU1RfRihNaXNjVGVzdCwgQ3BwVHlwZXMpIHsKLSAgLy8gVGVzdCB0aGF0IENQUCB0eXBlcyBhcmUgYXNzaWduZWQgY29ycmVjdGx5LgotCi0gIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCi0KLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0RPVUJMRSAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRE9VQkxFICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0ZMT0FUICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQgICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDY0ICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UNjQgICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQ2NCAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0ICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDMyICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIgICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQ2NCAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQ2NCApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQzMiAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMiApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0JPT0wgICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQk9PTCAgICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1NUUklORyAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU1RSSU5HICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX01FU1NBR0UsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfR1JPVVAgICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX01FU1NBR0UsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1NUUklORyAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQllURVMgICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX1VJTlQzMiAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0VOVU0gICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRU5VTSAgICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDMyICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVEMzIpKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDY0ICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDMyICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyICApKTsKLSAgRVhQRUNUX0VRKEZEOjpDUFBUWVBFX0lOVDY0ICAsIEdldENwcFR5cGVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0ICApKTsKLX0KLQotVEVTVF9GKE1pc2NUZXN0LCBDcHBUeXBlTmFtZXMpIHsKLSAgLy8gVGVzdCB0aGF0IGNvcnJlY3QgQ1BQIHR5cGUgbmFtZXMgYXJlIHJldHVybmVkLgotCi0gIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCi0KLSAgRVhQRUNUX1NUUkVRKCJkb3VibGUiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRE9VQkxFICApKTsKLSAgRVhQRUNUX1NUUkVRKCJmbG9hdCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UNjQgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0ICApKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQ2NCApKTsKLSAgRVhQRUNUX1NUUkVRKCJ1aW50MzIiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMiApKTsKLSAgRVhQRUNUX1NUUkVRKCJib29sIiAgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQk9PTCAgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJzdHJpbmciICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU1RSSU5HICApKTsKLSAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfR1JPVVAgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSApKTsKLSAgRVhQRUNUX1NUUkVRKCJzdHJpbmciICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQllURVMgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJ1aW50MzIiICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyICApKTsKLSAgRVhQRUNUX1NUUkVRKCJlbnVtIiAgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRU5VTSAgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVEMzIpKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyICApKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICwgR2V0Q3BwVHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0ICApKTsKLX0KLQotVEVTVF9GKE1pc2NUZXN0LCBTdGF0aWNDcHBUeXBlTmFtZXMpIHsKLSAgLy8gVGVzdCB0aGF0IGNvcnJlY3QgQ1BQIHR5cGUgbmFtZXMgYXJlIHJldHVybmVkLgotCi0gIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCi0KLSAgRVhQRUNUX1NUUkVRKCJpbnQzMiIgICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0lOVDMyICApKTsKLSAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0lOVDY0ICApKTsKLSAgRVhQRUNUX1NUUkVRKCJ1aW50MzIiICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX1VJTlQzMiApKTsKLSAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX1VJTlQ2NCApKTsKLSAgRVhQRUNUX1NUUkVRKCJkb3VibGUiICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0RPVUJMRSApKTsKLSAgRVhQRUNUX1NUUkVRKCJmbG9hdCIgICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0ZMT0FUICApKTsKLSAgRVhQRUNUX1NUUkVRKCJib29sIiAgICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0JPT0wgICApKTsKLSAgRVhQRUNUX1NUUkVRKCJlbnVtIiAgICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX0VOVU0gICApKTsKLSAgRVhQRUNUX1NUUkVRKCJzdHJpbmciICwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX1NUUklORyApKTsKLSAgRVhQRUNUX1NUUkVRKCJtZXNzYWdlIiwgRkQ6OkNwcFR5cGVOYW1lKEZEOjpDUFBUWVBFX01FU1NBR0UpKTsKLX0KLQotVEVTVF9GKE1pc2NUZXN0LCBNZXNzYWdlVHlwZSkgewotICAvLyBUZXN0IHRoYXQgbWVzc2FnZV90eXBlKCkgaXMgTlVMTCBmb3Igbm9uLWFnZ3JlZ2F0ZSBmaWVsZHMKLQotICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZwotCi0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRE9VQkxFICApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GTE9BVCAgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDY0ICAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDY0ICApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQzMiAgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZJWEVENjQgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQzMiApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9CT09MICAgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NUUklORyAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgIT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfR1JPVVAgICApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCAhPSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9NRVNTQUdFICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JZVEVTICAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfVUlOVDMyICApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9FTlVNICAgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDMyKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVENjQpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TSU5UMzIgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQ2NCAgKSk7Ci19Ci0KLVRFU1RfRihNaXNjVGVzdCwgRW51bVR5cGUpIHsKLSAgLy8gVGVzdCB0aGF0IGVudW1fdHlwZSgpIGlzIE5VTEwgZm9yIG5vbi1lbnVtIGZpZWxkcwotCi0gIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCi0KLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZMT0FUICAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UNjQgICApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UNjQgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDMyICAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQ2NCApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDMyICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wgICAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU1RSSU5HICApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9HUk9VUCAgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQllURVMgICApKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UMzIgICkpOwotICBFWFBFQ1RfVFJVRShOVUxMICE9IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0gICAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVEMzIpKTsKLSAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQ2NCkpOwotICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQzMiAgKSk7Ci0gIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0ICApKTsKLX0KLQotCi1URVNUX0YoTWlzY1Rlc3QsIERlZmF1bHRWYWx1ZXMpIHsKLSAgLy8gVGVzdCB0aGF0IHNldHRpbmcgZGVmYXVsdCB2YWx1ZXMgd29ya3MuCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgZmlsZV9wcm90by5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0KLSAgRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlX3Byb3RvID0gQWRkRW51bSgmZmlsZV9wcm90bywgIkR1bW15RW51bSIpOwotICBBZGRFbnVtVmFsdWUoZW51bV90eXBlX3Byb3RvLCAiQSIsIDEpOwotICBBZGRFbnVtVmFsdWUoZW51bV90eXBlX3Byb3RvLCAiQiIsIDIpOwotCi0gIERlc2NyaXB0b3JQcm90byogbWVzc2FnZV9wcm90byA9IEFkZE1lc3NhZ2UoJmZpbGVfcHJvdG8sICJUZXN0TWVzc2FnZSIpOwotCi0gIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yUHJvdG8gRkQ7ICAvLyBhdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKLSAgY29uc3QgRkQ6OkxhYmVsIGxhYmVsID0gRkQ6OkxBQkVMX09QVElPTkFMOwotCi0gIC8vIENyZWF0ZSBmaWVsZHMgb2YgZXZlcnkgQ1BQIHR5cGUgd2l0aCBkZWZhdWx0IHZhbHVlcy4KLSAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImludDMyIiAsIDEsIGxhYmVsLCBGRDo6VFlQRV9JTlQzMiApCi0gICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiLTEiKTsKLSAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImludDY0IiAsIDIsIGxhYmVsLCBGRDo6VFlQRV9JTlQ2NCApCi0gICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiLTEwMDAwMDAwMDAwMDAiKTsKLSAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgInVpbnQzMiIsIDMsIGxhYmVsLCBGRDo6VFlQRV9VSU5UMzIpCi0gICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiNDIiKTsKLSAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgInVpbnQ2NCIsIDQsIGxhYmVsLCBGRDo6VFlQRV9VSU5UNjQpCi0gICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiMjAwMDAwMDAwMDAwMCIpOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiZmxvYXQiICwgNSwgbGFiZWwsIEZEOjpUWVBFX0ZMT0FUICkKLSAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCI0LjUiKTsKLSAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImRvdWJsZSIsIDYsIGxhYmVsLCBGRDo6VFlQRV9ET1VCTEUpCi0gICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiMTBlMTAwIik7Ci0gIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJib29sIiAgLCA3LCBsYWJlbCwgRkQ6OlRZUEVfQk9PTCAgKQotICAgIC0+c2V0X2RlZmF1bHRfdmFsdWUoInRydWUiKTsKLSAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgInN0cmluZyIsIDgsIGxhYmVsLCBGRDo6VFlQRV9TVFJJTkcpCi0gICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiaGVsbG8iKTsKLSAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImRhdGEiICAsIDksIGxhYmVsLCBGRDo6VFlQRV9CWVRFUyApCi0gICAgLT5zZXRfZGVmYXVsdF92YWx1ZSgiXFwwMDFcXDAwMlxcMDAzIik7Ci0KLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGVudW1fZmllbGQgPQotICAgIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJlbnVtIiwgMTAsIGxhYmVsLCBGRDo6VFlQRV9FTlVNKTsKLSAgZW51bV9maWVsZC0+c2V0X3R5cGVfbmFtZSgiRHVtbXlFbnVtIik7Ci0gIGVudW1fZmllbGQtPnNldF9kZWZhdWx0X3ZhbHVlKCJCIik7Ci0KLSAgLy8gU3RyaW5ncyBhcmUgYWxsb3dlZCB0byBoYXZlIGVtcHR5IGRlZmF1bHRzLiAgKEF0IG9uZSBwb2ludCwgZHVlIHRvCi0gIC8vIGEgYnVnLCBlbXB0eSBkZWZhdWx0cyBmb3Igc3RyaW5ncyB3ZXJlIHJlamVjdGVkLiAgT29wcy4pCi0gIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJlbXB0eV9zdHJpbmciLCAxMSwgbGFiZWwsIEZEOjpUWVBFX1NUUklORykKLSAgICAtPnNldF9kZWZhdWx0X3ZhbHVlKCIiKTsKLQotICAvLyBBZGQgYSBzZWNvbmQgc2V0IG9mIGZpZWxkcyB3aXRoIGltcGxpY2l0IGRlZmFsdXQgdmFsdWVzLgotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfaW50MzIiICwgMjEsIGxhYmVsLCBGRDo6VFlQRV9JTlQzMiApOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfaW50NjQiICwgMjIsIGxhYmVsLCBGRDo6VFlQRV9JTlQ2NCApOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfdWludDMyIiwgMjMsIGxhYmVsLCBGRDo6VFlQRV9VSU5UMzIpOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfdWludDY0IiwgMjQsIGxhYmVsLCBGRDo6VFlQRV9VSU5UNjQpOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfZmxvYXQiICwgMjUsIGxhYmVsLCBGRDo6VFlQRV9GTE9BVCApOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfZG91YmxlIiwgMjYsIGxhYmVsLCBGRDo6VFlQRV9ET1VCTEUpOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfYm9vbCIgICwgMjcsIGxhYmVsLCBGRDo6VFlQRV9CT09MICApOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfc3RyaW5nIiwgMjgsIGxhYmVsLCBGRDo6VFlQRV9TVFJJTkcpOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfZGF0YSIgICwgMjksIGxhYmVsLCBGRDo6VFlQRV9CWVRFUyApOwotICBBZGRGaWVsZChtZXNzYWdlX3Byb3RvLCAiaW1wbGljaXRfZW51bSIgICwgMzAsIGxhYmVsLCBGRDo6VFlQRV9FTlVNKQotICAgIC0+c2V0X3R5cGVfbmFtZSgiRHVtbXlFbnVtIik7Ci0KLSAgLy8gQnVpbGQgaXQuCi0gIERlc2NyaXB0b3JQb29sIHBvb2w7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0KLSAgQVNTRVJUX0VRKDEsIGZpbGUtPmVudW1fdHlwZV9jb3VudCgpKTsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSA9IGZpbGUtPmVudW1fdHlwZSgwKTsKLSAgQVNTRVJUX0VRKDIsIGVudW1fdHlwZS0+dmFsdWVfY291bnQoKSk7Ci0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWVfYSA9IGVudW1fdHlwZS0+dmFsdWUoMCk7Ci0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWVfYiA9IGVudW1fdHlwZS0+dmFsdWUoMSk7Ci0KLSAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKTsKLQotICBBU1NFUlRfRVEoMjEsIG1lc3NhZ2UtPmZpZWxkX2NvdW50KCkpOwotCi0gIC8vIENoZWNrIHRoZSBkZWZhdWx0IHZhbHVlcy4KLSAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoMCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCgxKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci0gIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDIpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLSAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoMyktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg0KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci0gIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDUpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLSAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoNiktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCg3KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci0gIEFTU0VSVF9UUlVFKG1lc3NhZ2UtPmZpZWxkKDgpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLSAgQVNTRVJUX1RSVUUobWVzc2FnZS0+ZmllbGQoOSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBBU1NFUlRfVFJVRShtZXNzYWdlLT5maWVsZCgxMCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotCi0gIEVYUEVDVF9FUSgtMSAgICAgICAgICAgICAgLCBtZXNzYWdlLT5maWVsZCgwKS0+ZGVmYXVsdF92YWx1ZV9pbnQzMiAoKSk7Ci0gIEVYUEVDVF9FUSgtR09PR0xFX1VMT05HTE9ORygxMDAwMDAwMDAwMDAwKSwKLSAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkKDEpLT5kZWZhdWx0X3ZhbHVlX2ludDY0ICgpKTsKLSAgRVhQRUNUX0VRKDQyICAgICAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDIpLT5kZWZhdWx0X3ZhbHVlX3VpbnQzMigpKTsKLSAgRVhQRUNUX0VRKEdPT0dMRV9VTE9OR0xPTkcoMjAwMDAwMDAwMDAwMCksCi0gICAgICAgICAgICBtZXNzYWdlLT5maWVsZCgzKS0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSk7Ci0gIEVYUEVDVF9FUSg0LjUgICAgICAgICAgICAgLCBtZXNzYWdlLT5maWVsZCg0KS0+ZGVmYXVsdF92YWx1ZV9mbG9hdCAoKSk7Ci0gIEVYUEVDVF9FUSgxMGUxMDAgICAgICAgICAgLCBtZXNzYWdlLT5maWVsZCg1KS0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgICAgICAgICAgICBtZXNzYWdlLT5maWVsZCg2KS0+ZGVmYXVsdF92YWx1ZV9ib29sICAoKSk7Ci0gIEVYUEVDVF9FUSgiaGVsbG8iICAgICAgICAgLCBtZXNzYWdlLT5maWVsZCg3KS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgiXDAwMVwwMDJcMDAzIiAgLCBtZXNzYWdlLT5maWVsZCg4KS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShlbnVtX3ZhbHVlX2IgICAgLCBtZXNzYWdlLT5maWVsZCg5KS0+ZGVmYXVsdF92YWx1ZV9lbnVtICAoKSk7Ci0gIEVYUEVDVF9FUSgiIiAgICAgICAgICAgICAgLCBtZXNzYWdlLT5maWVsZCgxMCktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOwotCi0gIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxMSktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTIpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLSAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDEzKS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci0gIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxNCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTUpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLSAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE2KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci0gIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgxNyktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotICBBU1NFUlRfRkFMU0UobWVzc2FnZS0+ZmllbGQoMTgpLT5oYXNfZGVmYXVsdF92YWx1ZSgpKTsKLSAgQVNTRVJUX0ZBTFNFKG1lc3NhZ2UtPmZpZWxkKDE5KS0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7Ci0gIEFTU0VSVF9GQUxTRShtZXNzYWdlLT5maWVsZCgyMCktPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwotCi0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS0+ZmllbGQoMTEpLT5kZWZhdWx0X3ZhbHVlX2ludDMyICgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLT5maWVsZCgxMiktPmRlZmF1bHRfdmFsdWVfaW50NjQgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UtPmZpZWxkKDEzKS0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS0+ZmllbGQoMTQpLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKLSAgRVhQRUNUX0VRKDAuMGYgLCBtZXNzYWdlLT5maWVsZCgxNSktPmRlZmF1bHRfdmFsdWVfZmxvYXQgKCkpOwotICBFWFBFQ1RfRVEoMC4wICAsIG1lc3NhZ2UtPmZpZWxkKDE2KS0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKSk7Ci0gIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS0+ZmllbGQoMTcpLT5kZWZhdWx0X3ZhbHVlX2Jvb2wgICgpKTsKLSAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLT5maWVsZCgxOCktPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2UtPmZpZWxkKDE5KS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShlbnVtX3ZhbHVlX2EsIG1lc3NhZ2UtPmZpZWxkKDIwKS0+ZGVmYXVsdF92YWx1ZV9lbnVtKCkpOwotfQotCi1URVNUX0YoTWlzY1Rlc3QsIEZpZWxkT3B0aW9ucykgewotICAvLyBUcnkgc2V0dGluZyBmaWVsZCBvcHRpb25zLgotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgZmlsZV9wcm90by5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0KLSAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlX3Byb3RvID0gQWRkTWVzc2FnZSgmZmlsZV9wcm90bywgIlRlc3RNZXNzYWdlIik7Ci0gIEFkZEZpZWxkKG1lc3NhZ2VfcHJvdG8sICJmb28iLCAxLAotICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCi0gICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGJhcl9wcm90byA9Ci0gICAgQWRkRmllbGQobWVzc2FnZV9wcm90bywgImJhciIsIDIsCi0gICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKLQotICBGaWVsZE9wdGlvbnMqIG9wdGlvbnMgPSBiYXJfcHJvdG8tPm11dGFibGVfb3B0aW9ucygpOwotICBvcHRpb25zLT5zZXRfY3R5cGUoRmllbGRPcHRpb25zOjpDT1JEKTsKLQotICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCi0gIERlc2NyaXB0b3JQb29sIHBvb2w7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0KLSAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKTsKLQotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS0+ZmllbGRfY291bnQoKSk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZm9vID0gbWVzc2FnZS0+ZmllbGQoMCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmFyID0gbWVzc2FnZS0+ZmllbGQoMSk7Ci0KLSAgLy8gImZvbyIgaGFkIG5vIG9wdGlvbnMgc2V0LCBzbyBpdCBzaG91bGQgcmV0dXJuIHRoZSBkZWZhdWx0IG9wdGlvbnMuCi0gIEVYUEVDVF9FUSgmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCksICZmb28tPm9wdGlvbnMoKSk7Ci0KLSAgLy8gImJhciIgaGFkIG9wdGlvbnMgc2V0LgotICBFWFBFQ1RfTkUoJkZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBvcHRpb25zKTsKLSAgRVhQRUNUX1RSVUUoYmFyLT5vcHRpb25zKCkuaGFzX2N0eXBlKCkpOwotICBFWFBFQ1RfRVEoRmllbGRPcHRpb25zOjpDT1JELCBiYXItPm9wdGlvbnMoKS5jdHlwZSgpKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotZW51bSBEZXNjcmlwdG9yUG9vbE1vZGUgewotICBOT19EQVRBQkFTRSwKLSAgRkFMTEJBQ0tfREFUQUJBU0UKLX07Ci0KLWNsYXNzIEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QKLSAgICA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0V2l0aFBhcmFtPERlc2NyaXB0b3JQb29sTW9kZT4gewotIHByb3RlY3RlZDoKLSAgRGVzY3JpcHRvclBvb2xNb2RlIG1vZGUoKSB7Ci0gICAgcmV0dXJuIEdldFBhcmFtKCk7Ci0gICB9Ci0KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vX3Byb3RvLCBiYXJfcHJvdG87Ci0KLSAgICBzd2l0Y2ggKG1vZGUoKSkgewotICAgICAgY2FzZSBOT19EQVRBQkFTRToKLSAgICAgICAgcG9vbF8ucmVzZXQobmV3IERlc2NyaXB0b3JQb29sKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZBTExCQUNLX0RBVEFCQVNFOgotICAgICAgICBwb29sXy5yZXNldChuZXcgRGVzY3JpcHRvclBvb2woJmRiXykpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBwb29sXy0+QWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCk7Ci0KLSAgICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCi0gICAgICAibmFtZTogJ2Zvby5wcm90byciCi0gICAgICAiZGVwZW5kZW5jeTogJ2Jhci5wcm90byciCi0gICAgICAiZGVwZW5kZW5jeTogJ2Jhei5wcm90byciCi0gICAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgICAiICBuYW1lOiAnRm9vJyIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTonYmFyJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6J0JhcicgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTonYmF6JyBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6J0JheicgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZToncXV4JyBudW1iZXI6MyBsYWJlbDpMQUJFTF9PUFRJT05BTCIKLSAgICAgICIgICAgdHlwZV9uYW1lOiAnLmNvcmdlLlF1eCciCi0gICAgICAiICAgIHR5cGU6IFRZUEVfRU5VTSIKLSAgICAgICIgICAgb3B0aW9ucyB7IgotICAgICAgIiAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsiCi0gICAgICAiICAgICAgICBuYW1lIHsiCi0gICAgICAiICAgICAgICAgIG5hbWVfcGFydDogJ2dyYXVsdCciCi0gICAgICAiICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSIKLSAgICAgICIgICAgICAgIH0iCi0gICAgICAiICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQiCi0gICAgICAiICAgICAgfSIKLSAgICAgICIgICAgfSIKLSAgICAgICIgIH0iCi0gICAgICAifSIsCi0gICAgICAmZm9vX3Byb3RvKSk7Ci0gICAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAotICAgICAgIm5hbWU6ICdiYXIucHJvdG8nIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6ICdCYXInIH0iLAotICAgICAgJmJhcl9wcm90bykpOwotCi0gICAgLy8gQ29sbGVjdCBwb2ludGVycyB0byBzdHVmZi4KLSAgICBiYXJfZmlsZV8gPSBCdWlsZEZpbGUoYmFyX3Byb3RvKTsKLSAgICBBU1NFUlRfVFJVRShiYXJfZmlsZV8gIT0gTlVMTCk7Ci0KLSAgICBBU1NFUlRfRVEoMSwgYmFyX2ZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gICAgYmFyX3R5cGVfID0gYmFyX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7Ci0KLSAgICBmb29fZmlsZV8gPSBCdWlsZEZpbGUoZm9vX3Byb3RvKTsKLSAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7Ci0KLSAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gICAgZm9vX3R5cGVfID0gZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7Ci0KLSAgICBBU1NFUlRfRVEoMywgZm9vX3R5cGVfLT5maWVsZF9jb3VudCgpKTsKLSAgICBiYXJfZmllbGRfID0gZm9vX3R5cGVfLT5maWVsZCgwKTsKLSAgICBiYXpfZmllbGRfID0gZm9vX3R5cGVfLT5maWVsZCgxKTsKLSAgICBxdXhfZmllbGRfID0gZm9vX3R5cGVfLT5maWVsZCgyKTsKLSAgfQotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBCdWlsZEZpbGUoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgICBzd2l0Y2ggKG1vZGUoKSkgewotICAgICAgY2FzZSBOT19EQVRBQkFTRToKLSAgICAgICAgcmV0dXJuIHBvb2xfLT5CdWlsZEZpbGUocHJvdG8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRkFMTEJBQ0tfREFUQUJBU0U6IHsKLSAgICAgICAgRVhQRUNUX1RSVUUoZGJfLkFkZChwcm90bykpOwotICAgICAgICByZXR1cm4gcG9vbF8tPkZpbmRGaWxlQnlOYW1lKHByb3RvLm5hbWUoKSk7Ci0gICAgICB9Ci0gICAgfQotICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKLSAgY29uc3QgRGVzY3JpcHRvciogYmFyX3R5cGVfOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZm9vX2ZpbGVfOwotICBjb25zdCBEZXNjcmlwdG9yKiBmb29fdHlwZV87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYmFyX2ZpZWxkXzsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiYXpfZmllbGRfOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHF1eF9maWVsZF87Ci0KLSAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRiXzsgICAgICAgIC8vIHVzZWQgaWYgaW4gRkFMTEJBQ0tfREFUQUJBU0UgbW9kZS4KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxEZXNjcmlwdG9yUG9vbD4gcG9vbF87Ci19OwotCi1URVNUX1AoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgUGxhY2Vob2xkZXJGaWxlKSB7Ci0gIEFTU0VSVF9FUSgyLCBmb29fZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKSk7Ci0gIEVYUEVDVF9FUShiYXJfZmlsZV8sIGZvb19maWxlXy0+ZGVwZW5kZW5jeSgwKSk7Ci0gIEVYUEVDVF9GQUxTRShiYXJfZmlsZV8tPmlzX3BsYWNlaG9sZGVyKCkpOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXpfZmlsZSA9IGZvb19maWxlXy0+ZGVwZW5kZW5jeSgxKTsKLSAgRVhQRUNUX0VRKCJiYXoucHJvdG8iLCBiYXpfZmlsZS0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKDAsIGJhel9maWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gIEVYUEVDVF9UUlVFKGJhel9maWxlLT5pc19wbGFjZWhvbGRlcigpKTsKLQotICAvLyBQbGFjZWhvbGRlciBmaWxlcyBzaG91bGQgbm90IGJlIGZpbmRhYmxlLgotICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBwb29sXy0+RmluZEZpbGVCeU5hbWUoYmFyX2ZpbGVfLT5uYW1lKCkpKTsKLSAgRVhQRUNUX1RSVUUocG9vbF8tPkZpbmRGaWxlQnlOYW1lKGJhel9maWxlLT5uYW1lKCkpID09IE5VTEwpOwotCi0gIC8vIENvcHkqVG8gc2hvdWxkIG5vdCBjcmFzaCBmb3IgcGxhY2Vob2xkZXIgZmlsZXMuCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmF6X2ZpbGVfcHJvdG87Ci0gIGJhel9maWxlLT5Db3B5VG8oJmJhel9maWxlX3Byb3RvKTsKLSAgYmF6X2ZpbGUtPkNvcHlTb3VyY2VDb2RlSW5mb1RvKCZiYXpfZmlsZV9wcm90byk7Ci0gIEVYUEVDVF9GQUxTRShiYXpfZmlsZV9wcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKLX0KLQotVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFBsYWNlaG9sZGVyVHlwZXMpIHsKLSAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXJfZmllbGRfLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoYmFyX3R5cGVfLCBiYXJfZmllbGRfLT5tZXNzYWdlX3R5cGUoKSk7Ci0gIEVYUEVDVF9GQUxTRShiYXJfdHlwZV8tPmlzX3BsYWNlaG9sZGVyKCkpOwotCi0gIEFTU0VSVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSwgYmF6X2ZpZWxkXy0+dHlwZSgpKTsKLSAgY29uc3QgRGVzY3JpcHRvciogYmF6X3R5cGUgPSBiYXpfZmllbGRfLT5tZXNzYWdlX3R5cGUoKTsKLSAgRVhQRUNUX0VRKCJCYXoiLCBiYXpfdHlwZS0+bmFtZSgpKTsKLSAgRVhQRUNUX0VRKCJCYXoiLCBiYXpfdHlwZS0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoMCwgYmF6X3R5cGUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKLSAgRVhQRUNUX1RSVUUoYmF6X3R5cGUtPmlzX3BsYWNlaG9sZGVyKCkpOwotCi0gIEFTU0VSVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSwgcXV4X2ZpZWxkXy0+dHlwZSgpKTsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIHF1eF90eXBlID0gcXV4X2ZpZWxkXy0+ZW51bV90eXBlKCk7Ci0gIEVYUEVDVF9FUSgiUXV4IiwgcXV4X3R5cGUtPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUSgiY29yZ2UuUXV4IiwgcXV4X3R5cGUtPmZ1bGxfbmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUocXV4X3R5cGUtPmlzX3BsYWNlaG9sZGVyKCkpOwotCi0gIC8vIFBsYWNlaG9sZGVyIHR5cGVzIHNob3VsZCBub3QgYmUgZmluZGFibGUuCi0gIEVYUEVDVF9FUShiYXJfdHlwZV8sIHBvb2xfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoYmFyX3R5cGVfLT5mdWxsX25hbWUoKSkpOwotICBFWFBFQ1RfVFJVRShwb29sXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKGJhel90eXBlLT5mdWxsX25hbWUoKSkgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2xfLT5GaW5kRW51bVR5cGVCeU5hbWUocXV4X3R5cGUtPmZ1bGxfbmFtZSgpKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIENvcHlUbykgewotICAvLyBGaWVsZERlc2NyaXB0b3I6OkNvcHlUbygpIHNob3VsZCB3cml0ZSBub24tZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZXMKLSAgLy8gZm9yIHBsYWNlaG9sZGVyIHR5cGVzIHdoaWNoIHdlcmUgbm90IG9yaWdpbmFsbHkgZnVsbHktcXVhbGlmaWVkLgotICBGaWVsZERlc2NyaXB0b3JQcm90byBwcm90bzsKLQotICAvLyBCYXIgaXMgbm90IGEgcGxhY2Vob2xkZXIsIHNvIGl0IGlzIGZ1bGx5LXF1YWxpZmllZC4KLSAgYmFyX2ZpZWxkXy0+Q29weVRvKCZwcm90byk7Ci0gIEVYUEVDVF9FUSgiLkJhciIsIHByb3RvLnR5cGVfbmFtZSgpKTsKLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0UsIHByb3RvLnR5cGUoKSk7Ci0KLSAgLy8gQmF6IGlzIGFuIHVucXVhbGlmaWVkIHBsYWNlaG9sZGVyLgotICBwcm90by5DbGVhcigpOwotICBiYXpfZmllbGRfLT5Db3B5VG8oJnByb3RvKTsKLSAgRVhQRUNUX0VRKCJCYXoiLCBwcm90by50eXBlX25hbWUoKSk7Ci0gIEVYUEVDVF9GQUxTRShwcm90by5oYXNfdHlwZSgpKTsKLQotICAvLyBRdXggaXMgYSBmdWxseS1xdWFsaWZpZWQgcGxhY2Vob2xkZXIuCi0gIHByb3RvLkNsZWFyKCk7Ci0gIHF1eF9maWVsZF8tPkNvcHlUbygmcHJvdG8pOwotICBFWFBFQ1RfRVEoIi5jb3JnZS5RdXgiLCBwcm90by50eXBlX25hbWUoKSk7Ci0gIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9FTlVNLCBwcm90by50eXBlKCkpOwotfQotCi1URVNUX1AoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgQ3VzdG9tT3B0aW9ucykgewotICAvLyBRdXggc2hvdWxkIHN0aWxsIGhhdmUgdGhlIHVuaW50ZXJwcmV0ZWQgb3B0aW9uIGF0dGFjaGVkLgotICBBU1NFUlRfRVEoMSwgcXV4X2ZpZWxkXy0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSk7Ci0gIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIG9wdGlvbiA9Ci0gICAgcXV4X2ZpZWxkXy0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOwotICBBU1NFUlRfRVEoMSwgb3B0aW9uLm5hbWVfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCJncmF1bHQiLCBvcHRpb24ubmFtZSgwKS5uYW1lX3BhcnQoKSk7Ci19Ci0KLVRFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBVbmtub3duRXh0ZW5kZWUpIHsKLSAgLy8gVGVzdCB0aGF0IHdlIGNhbiBleHRlbmQgYW4gdW5rbm93biB0eXBlLiAgVGhpcyBpcyBzbGlnaHRseSB0cmlja3kgYmVjYXVzZQotICAvLyBpdCBtZWFucyB0aGF0IHRoZSBwbGFjZWhvbGRlciB0eXBlIG11c3QgaGF2ZSBhbiBleHRlbnNpb24gcmFuZ2UuCi0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBleHRlbnNpb25fcHJvdG87Ci0KLSAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAotICAgICJuYW1lOiAnZXh0ZW5zaW9uLnByb3RvJyIKLSAgICAiZXh0ZW5zaW9uIHsgZXh0ZW5kZWU6ICdVbmtub3duVHlwZScgbmFtZTonc29tZV9leHRlbnNpb24nIG51bWJlcjoxMjMiCi0gICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IiwKLSAgICAmZXh0ZW5zaW9uX3Byb3RvKSk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gQnVpbGRGaWxlKGV4dGVuc2lvbl9wcm90byk7Ci0KLSAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKLQotICBBU1NFUlRfRVEoMSwgZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCkpOwotICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSA9IGZpbGUtPmV4dGVuc2lvbigwKS0+Y29udGFpbmluZ190eXBlKCk7Ci0gIEVYUEVDVF9FUSgiVW5rbm93blR5cGUiLCBleHRlbmRlZS0+bmFtZSgpKTsKLSAgRVhQRUNUX1RSVUUoZXh0ZW5kZWUtPmlzX3BsYWNlaG9sZGVyKCkpOwotICBBU1NFUlRfRVEoMSwgZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDEsIGV4dGVuZGVlLT5leHRlbnNpb25fcmFuZ2UoMCktPnN0YXJ0KTsKLSAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciArIDEsIGV4dGVuZGVlLT5leHRlbnNpb25fcmFuZ2UoMCktPmVuZCk7Ci19Ci0KLVRFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBDdXN0b21PcHRpb24pIHsKLSAgLy8gVGVzdCB0aGF0IHdlIGNhbiB1c2UgYSBjdXN0b20gb3B0aW9uIHdpdGhvdXQgaGF2aW5nIHBhcnNlZAotICAvLyBkZXNjcmlwdG9yLnByb3RvLgotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3B0aW9uX3Byb3RvOwotCi0gIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKLSAgICAibmFtZTogXCJ1bmtub3duX2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJleHRlbnNpb24geyAiCi0gICAgIiAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgIgotICAgICIgIG5hbWU6IFwic29tZV9vcHRpb25cIiAiCi0gICAgIiAgbnVtYmVyOiAxMjM0NTYgIgotICAgICIgIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgIiAgdHlwZTogVFlQRV9JTlQzMiAiCi0gICAgIn0gIgotICAgICJvcHRpb25zIHsgIgotICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgbmFtZSB7ICIKLSAgICAiICAgICAgbmFtZV9wYXJ0OiBcInNvbWVfb3B0aW9uXCIgIgotICAgICIgICAgICBpc19leHRlbnNpb246IHRydWUgIgotICAgICIgICAgfSAiCi0gICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgotICAgICIgIH0gIgotICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgbmFtZSB7ICIKLSAgICAiICAgICAgbmFtZV9wYXJ0OiBcInVua25vd25fb3B0aW9uXCIgIgotICAgICIgICAgICBpc19leHRlbnNpb246IHRydWUgIgotICAgICIgICAgfSAiCi0gICAgIiAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgotICAgICIgIH0gIgotICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgbmFtZSB7ICIKLSAgICAiICAgICAgbmFtZV9wYXJ0OiBcIm9wdGltaXplX2ZvclwiICIKLSAgICAiICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCi0gICAgIiAgICB9ICIKLSAgICAiICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiU1BFRURcIiAiCi0gICAgIiAgfSAiCi0gICAgIn0iLAotICAgICZvcHRpb25fcHJvdG8pKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IEJ1aWxkRmlsZShvcHRpb25fcHJvdG8pOwotICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOwotCi0gIC8vIFZlcmlmeSB0aGF0IG5vIGV4dGVuc2lvbiBvcHRpb25zIHdlcmUgc2V0LCBidXQgdGhleSB3ZXJlIGxlZnQgYXMKLSAgLy8gdW5pbnRlcnByZXRlZF9vcHRpb25zLgotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICBmaWxlLT5vcHRpb25zKCkuR2V0UmVmbGVjdGlvbigpLT5MaXN0RmllbGRzKGZpbGUtPm9wdGlvbnMoKSwgJmZpZWxkcyk7Ci0gIEFTU0VSVF9FUSgyLCBmaWVsZHMuc2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoZmlsZS0+b3B0aW9ucygpLmhhc19vcHRpbWl6ZV9mb3IoKSk7Ci0gIEVYUEVDVF9FUSgyLCBmaWxlLT5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpKTsKLX0KLQotVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsCi0gICAgICAgVW5kZWNsYXJlZERlcGVuZGVuY3lUcmlnZ2Vyc0J1aWxkT2ZEZXBlbmRlbmN5KSB7Ci0gIC8vIENyYXp5IGNhc2U6IHN1cHBvc2UgZm9vLnByb3RvIHJlZmVycyB0byBhIHN5bWJvbCB3aXRob3V0IGRlY2xhcmluZyB0aGUKLSAgLy8gZGVwZW5kZW5jeSB0aGF0IGZpbmRzIGl0LiBJbiB0aGUgZXZlbnQgdGhhdCB0aGUgcG9vbCBpcyBiYWNrZWQgYnkgYQotICAvLyBEZXNjcmlwdG9yRGF0YWJhc2UsIHRoZSBwb29sIHdpbGwgYXR0ZW1wdCB0byBmaW5kIHRoZSBzeW1ib2wgaW4gdGhlCi0gIC8vIGRhdGFiYXNlLiBJZiBzdWNjZXNzZnVsLCBpdCB3aWxsIGJ1aWxkIHRoZSB1bmRlY2xhcmVkIGRlcGVuZGVuY3kgdG8gdmVyaWZ5Ci0gIC8vIHRoYXQgdGhlIGZpbGUgZG9lcyBpbmRlZWQgY29udGFpbiB0aGUgc3ltYm9sLiBJZiB0aGF0IGZpbGUgZmFpbHMgdG8gYnVpbGQsCi0gIC8vIHRoZW4gaXRzIGRlc2NyaXB0b3JzIG11c3QgYmUgcm9sbGVkIGJhY2suIEhvd2V2ZXIsIHdlIHN0aWxsIHdhbnQgZm9vLnByb3RvCi0gIC8vIHRvIGJ1aWxkIHN1Y2Nlc3NmdWxseSwgc2luY2Ugd2UgYXJlIGFsbG93aW5nIHVua25vd24gZGVwZW5kZW5jaWVzLgotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5kZWNsYXJlZF9kZXBfcHJvdG87Ci0gIC8vIFdlIG1ha2UgdGhpcyBmaWxlIGZhaWwgdG8gYnVpbGQgYnkgZ2l2aW5nIGl0IHR3byBmaWVsZHMgd2l0aCB0YWcgMS4KLSAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAotICAgICJuYW1lOiBcImludmFsaWRfZmlsZV9hc191bmRlY2xhcmVkX2RlcC5wcm90b1wiICIKLSAgICAicGFja2FnZTogXCJ1bmRlY2xhcmVkXCIgIgotICAgICJtZXNzYWdlX3R5cGU6IHsgICIKLSAgICAiICBuYW1lOiBcIlF1dXhcIiAgIgotICAgICIgIGZpZWxkIHsgIgotICAgICIgICAgbmFtZToncXV4JyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyICIKLSAgICAiICB9IgotICAgICIgIGZpZWxkIHsgIgotICAgICIgICAgbmFtZToncXV1eCcgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQ2NCAiCi0gICAgIiAgfSIKLSAgICAifSIsCi0gICAgJnVuZGVjbGFyZWRfZGVwX3Byb3RvKSk7Ci0gIC8vIFdlIGNhbid0IHVzZSB0aGUgQnVpbGRGaWxlKCkgaGVscGVyIGJlY2F1c2Ugd2UgZG9uJ3QgYWN0dWFsbHkgd2FudCB0byBidWlsZAotICAvLyBpdCBpbnRvIHRoZSBkZXNjcmlwdG9yIHBvb2wgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIGNhc2U6IGl0IGp1c3QgbmVlZHMgdG8KLSAgLy8gYmUgc2l0dGluZyBpbiB0aGUgZGF0YWJhc2Ugc28gdGhhdCBpdCBnZXRzIGJ1aWx0IGR1cmluZyB0aGUgYnVpbGRpbmcgb2YKLSAgLy8gdGVzdC5wcm90byBiZWxvdy4KLSAgc3dpdGNoIChtb2RlKCkpIHsKLSAgICBjYXNlIE5PX0RBVEFCQVNFOiB7Ci0gICAgICBBU1NFUlRfVFJVRShwb29sXy0+QnVpbGRGaWxlKHVuZGVjbGFyZWRfZGVwX3Byb3RvKSA9PSBOVUxMKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIEZBTExCQUNLX0RBVEFCQVNFOiB7Ci0gICAgICBBU1NFUlRfVFJVRShkYl8uQWRkKHVuZGVjbGFyZWRfZGVwX3Byb3RvKSk7Ci0gICAgfQotICB9Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byB0ZXN0X3Byb3RvOwotICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCi0gICAgIm5hbWU6IFwidGVzdC5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlOiB7ICIKLSAgICAiICBuYW1lOiBcIkNvcmdlXCIgIgotICAgICIgIGZpZWxkIHsgIgotICAgICIgICAgbmFtZToncXV1eCcgbnVtYmVyOjEgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgIHR5cGVfbmFtZTondW5kZWNsYXJlZC5RdXV4JyB0eXBlOiBUWVBFX01FU1NBR0UgIgotICAgICIgIH0iCi0gICAgIn0iLAotICAgICZ0ZXN0X3Byb3RvKSk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBCdWlsZEZpbGUodGVzdF9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0gIEdPT0dMRV9MT0coSU5GTykgPDwgZmlsZS0+RGVidWdTdHJpbmcoKTsKLQotICBFWFBFQ1RfRVEoMCwgZmlsZS0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKLSAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLSAgY29uc3QgRGVzY3JpcHRvciogY29yZ2VfZGVzYyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKTsKLSAgQVNTRVJUX0VRKCJDb3JnZSIsIGNvcmdlX2Rlc2MtPm5hbWUoKSk7Ci0gIEFTU0VSVF9FUSgxLCBjb3JnZV9kZXNjLT5maWVsZF9jb3VudCgpKTsKLSAgRVhQRUNUX0ZBTFNFKGNvcmdlX2Rlc2MtPmlzX3BsYWNlaG9sZGVyKCkpOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcXV1eF9maWVsZCA9IGNvcmdlX2Rlc2MtPmZpZWxkKDApOwotICBBU1NFUlRfRVEoRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UsIHF1dXhfZmllbGQtPnR5cGUoKSk7Ci0gIEFTU0VSVF9FUSgiUXV1eCIsIHF1dXhfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCkpOwotICBBU1NFUlRfRVEoInVuZGVjbGFyZWQuUXV1eCIsIHF1dXhfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKSk7Ci0gIEVYUEVDVF9UUlVFKHF1dXhfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5pc19wbGFjZWhvbGRlcigpKTsKLSAgLy8gVGhlIHBsYWNlIGhvbGRlciB0eXBlIHNob3VsZCBub3QgYmUgZmluZGFibGUuCi0gIEFTU0VSVF9UUlVFKHBvb2xfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInVuZGVjbGFyZWQuUXV1eCIpID09IE5VTEwpOwotfQotCi1JTlNUQU5USUFURV9URVNUX0NBU0VfUChEYXRhYmFzZVNvdXJjZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICB0ZXN0aW5nOjpWYWx1ZXMoTk9fREFUQUJBU0UsIEZBTExCQUNLX0RBVEFCQVNFKSk7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVEVTVChDdXN0b21PcHRpb25zLCBPcHRpb25Mb2NhdGlvbnMpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9Ci0gICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IG1lc3NhZ2UtPmZpbGUoKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG1lc3NhZ2UtPkZpbmRGaWVsZEJ5TmFtZSgiZmllbGQxIik7Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbm0gPSBtZXNzYWdlLT5GaW5kRW51bVR5cGVCeU5hbWUoIkFuRW51bSIpOwotICAvLyBUT0RPKGJlbmp5KTogU3VwcG9ydCBFbnVtVmFsdWUgb3B0aW9ucywgb25jZSB0aGUgY29tcGlsZXIgZG9lcy4KLSAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHNlcnZpY2UgPQotICAgICAgZmlsZS0+RmluZFNlcnZpY2VCeU5hbWUoIlRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMiKTsKLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kID0gc2VydmljZS0+RmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7Ci0KLSAgRVhQRUNUX0VRKEdPT0dMRV9MT05HTE9ORyg5ODc2NTQzMjEwKSwKLSAgICAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVfb3B0MSkpOwotICBFWFBFQ1RfRVEoLTU2LAotICAgICAgICAgICAgbWVzc2FnZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6bWVzc2FnZV9vcHQxKSk7Ci0gIEVYUEVDVF9FUShHT09HTEVfTE9OR0xPTkcoODc2NTQzMjEwOSksCi0gICAgICAgICAgICBmaWVsZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZmllbGRfb3B0MSkpOwotICBFWFBFQ1RfRVEoNDIsICAvLyBDaGVjayB0aGF0IHdlIGdldCB0aGUgZGVmYXVsdCBmb3IgYW4gb3B0aW9uIHdlIGRvbid0IHNldC4KLSAgICAgICAgICAgIGZpZWxkLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaWVsZF9vcHQyKSk7Ci0gIEVYUEVDVF9FUSgtNzg5LAotICAgICAgICAgICAgZW5tLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtX29wdDEpKTsKLSAgRVhQRUNUX0VRKDEyMywKLSAgICAgICAgICAgIGVubS0+dmFsdWUoMSktPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24oCi0gICAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtX3ZhbHVlX29wdDEpKTsKLSAgRVhQRUNUX0VRKEdPT0dMRV9MT05HTE9ORygtOTg3NjU0MzIxMCksCi0gICAgICAgICAgICBzZXJ2aWNlLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZXJ2aWNlX29wdDEpKTsKLSAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpNRVRIT0RPUFQxX1ZBTDIsCi0gICAgICAgICAgICBtZXRob2QtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6Om1ldGhvZF9vcHQxKSk7Ci0KLSAgLy8gU2VlIHRoYXQgdGhlIHJlZ3VsYXIgb3B0aW9ucyB3ZW50IHRocm91Z2ggdW5zY2F0aGVkLgotICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5vcHRpb25zKCkuaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpOwotICBFWFBFQ1RfRVEoRmllbGRPcHRpb25zOjpDT1JELCBmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpOwotfQotCi1URVNUKEN1c3RvbU9wdGlvbnMsIE9wdGlvblR5cGVzKSB7Ci0gIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBvcHRpb25zID0gTlVMTDsKLQotICBvcHRpb25zID0KLSAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6Q3VzdG9tT3B0aW9uTWluSW50ZWdlclZhbHVlczo6ZGVzY3JpcHRvcigpLT5vcHRpb25zKCk7Ci0gIEVYUEVDVF9FUShmYWxzZSAgICAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Ym9vbF9vcHQpKTsKLSAgRVhQRUNUX0VRKGtpbnQzMm1pbiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjppbnQzMl9vcHQpKTsKLSAgRVhQRUNUX0VRKGtpbnQ2NG1pbiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjppbnQ2NF9vcHQpKTsKLSAgRVhQRUNUX0VRKDAgICAgICAgICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojp1aW50MzJfb3B0KSk7Ci0gIEVYUEVDVF9FUSgwICAgICAgICAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6dWludDY0X29wdCkpOwotICBFWFBFQ1RfRVEoa2ludDMybWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNpbnQzMl9vcHQpKTsKLSAgRVhQRUNUX0VRKGtpbnQ2NG1pbiwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzaW50NjRfb3B0KSk7Ci0gIEVYUEVDVF9FUSgwICAgICAgICAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Zml4ZWQzMl9vcHQpKTsKLSAgRVhQRUNUX0VRKDAgICAgICAgICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaXhlZDY0X29wdCkpOwotICBFWFBFQ1RfRVEoa2ludDMybWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNmaXhlZDMyX29wdCkpOwotICBFWFBFQ1RfRVEoa2ludDY0bWluLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNmaXhlZDY0X29wdCkpOwotCi0gIG9wdGlvbnMgPQotICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKLSAgRVhQRUNUX0VRKHRydWUgICAgICAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Ym9vbF9vcHQpKTsKLSAgRVhQRUNUX0VRKGtpbnQzMm1heCAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6aW50MzJfb3B0KSk7Ci0gIEVYUEVDVF9FUShraW50NjRtYXggLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmludDY0X29wdCkpOwotICBFWFBFQ1RfRVEoa3VpbnQzMm1heCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojp1aW50MzJfb3B0KSk7Ci0gIEVYUEVDVF9FUShrdWludDY0bWF4LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnVpbnQ2NF9vcHQpKTsKLSAgRVhQRUNUX0VRKGtpbnQzMm1heCAsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2ludDMyX29wdCkpOwotICBFWFBFQ1RfRVEoa2ludDY0bWF4ICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzaW50NjRfb3B0KSk7Ci0gIEVYUEVDVF9FUShrdWludDMybWF4LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpeGVkMzJfb3B0KSk7Ci0gIEVYUEVDVF9FUShrdWludDY0bWF4LCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpeGVkNjRfb3B0KSk7Ci0gIEVYUEVDVF9FUShraW50MzJtYXggLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnNmaXhlZDMyX29wdCkpOwotICBFWFBFQ1RfRVEoa2ludDY0bWF4ICwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzZml4ZWQ2NF9vcHQpKTsKLQotICBvcHRpb25zID0KLSAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6Q3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXM6OmRlc2NyaXB0b3IoKS0+b3B0aW9ucygpOwotICBFWFBFQ1RfRVEoLTEwMCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjppbnQzMl9vcHQpKTsKLSAgRVhQRUNUX0ZMT0FUX0VRKDEyLjM0NTY3ODksCi0gICAgICAgICAgICAgICAgICBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZsb2F0X29wdCkpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDEuMjM0NTY3ODkwMTIzNDU2Nzg5LAotICAgICAgICAgICAgICAgICAgIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZG91YmxlX29wdCkpOwotICBFWFBFQ1RfRVEoIkhlbGxvLCBcIldvcmxkXCIiLAotICAgICAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpzdHJpbmdfb3B0KSk7Ci0KLSAgRVhQRUNUX0VRKHN0cmluZygiSGVsbG9cMFdvcmxkIiwgMTEpLAotICAgICAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpieXRlc19vcHQpKTsKLQotICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6OkR1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtOjpURVNUX09QVElPTl9FTlVNX1RZUEUyLAotICAgICAgICAgICAgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtX29wdCkpOwotCi0gIG9wdGlvbnMgPQotICAgICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpTZXR0aW5nUmVhbHNGcm9tUG9zaXRpdmVJbnRzOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKLSAgRVhQRUNUX0ZMT0FUX0VRKDEyLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZsb2F0X29wdCkpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDE1NCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpkb3VibGVfb3B0KSk7Ci0KLSAgb3B0aW9ucyA9Ci0gICAgICAmcHJvdG9idWZfdW5pdHRlc3Q6OlNldHRpbmdSZWFsc0Zyb21OZWdhdGl2ZUludHM6OmRlc2NyaXB0b3IoKS0+b3B0aW9ucygpOwotICBFWFBFQ1RfRkxPQVRfRVEoLTEyLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZsb2F0X29wdCkpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC0xNTQsIG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6ZG91YmxlX29wdCkpOwotfQotCi1URVNUKEN1c3RvbU9wdGlvbnMsIENvbXBsZXhFeHRlbnNpb25PcHRpb25zKSB7Ci0gIGNvbnN0IE1lc3NhZ2VPcHRpb25zKiBvcHRpb25zID0KLSAgICAgICZwcm90b2J1Zl91bml0dGVzdDo6VmFyaW91c0NvbXBsZXhPcHRpb25zOjpkZXNjcmlwdG9yKCktPm9wdGlvbnMoKTsKLSAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKS5mb28oKSwgNDIpOwotICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLgotICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpxdXV4KSwgMzI0KTsKLSAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQxKS4KLSAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29yZ2UpLnF1eCgpLCA4NzYpOwotICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJheigpLCA5ODcpOwotICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLgotICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpncmF1bHQpLCA2NTQpOwotICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcigpLmZvbygpLAotICAgICAgICAgICAgNzQzKTsKLSAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXIoKS4KLSAgICAgICAgICAgIEdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6cXV1eCksIDE5OTkpOwotICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcigpLgotICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb3JnZSkucXV4KCksIDIwMDgpOwotICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLgotICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpnYXJwbHkpLmZvbygpLCA3NDEpOwotICBFWFBFQ1RfRVEob3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLgotICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpnYXJwbHkpLgotICAgICAgICAgICAgR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpxdXV4KSwgMTk5OCk7Ci0gIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MikuCi0gICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmdhcnBseSkuCi0gICAgICAgICAgICBHZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvcmdlKS5xdXgoKSwgMjEyMSk7Ci0gIEVYUEVDVF9FUShvcHRpb25zLT5HZXRFeHRlbnNpb24oCi0gICAgICBwcm90b2J1Zl91bml0dGVzdDo6Q29tcGxleE9wdGlvblR5cGUyOjpDb21wbGV4T3B0aW9uVHlwZTQ6OmNvbXBsZXhfb3B0NCkuCi0gICAgICAgICAgICB3YWxkbygpLCAxOTcxKTsKLSAgRVhQRUNUX0VRKG9wdGlvbnMtPkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS4KLSAgICAgICAgICAgIGZyZWQoKS53YWxkbygpLCAzMjEpOwotICBFWFBFQ1RfRVEoOSwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDMpLnF1eCgpKTsKLSAgRVhQRUNUX0VRKDIyLCBvcHRpb25zLT5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MykuCi0gICAgICAgICAgICAgICAgY29tcGxleG9wdGlvbnR5cGU1KCkucGx1Z2goKSk7Ci0gIEVYUEVDVF9FUSgyNCwgb3B0aW9ucy0+R2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4b3B0NikueHl6enkoKSk7Ci19Ci0KLVRFU1QoQ3VzdG9tT3B0aW9ucywgT3B0aW9uc0Zyb21PdGhlckZpbGUpIHsKLSAgLy8gVGVzdCB0aGF0IHRvIHVzZSBhIGN1c3RvbSBvcHRpb24sIHdlIG9ubHkgbmVlZCB0byBpbXBvcnQgdGhlIGZpbGUKLSAgLy8gZGVmaW5pbmcgdGhlIG9wdGlvbjsgd2UgZG8gbm90IGFsc28gaGF2ZSB0byBpbXBvcnQgZGVzY3JpcHRvci5wcm90by4KLSAgRGVzY3JpcHRvclBvb2wgcG9vbDsKLQotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKLQotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpCi0gICAgLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOwotCi0gIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKLSAgICAibmFtZTogXCJjdXN0b21fb3B0aW9uc19pbXBvcnQucHJvdG9cIiAiCi0gICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIgotICAgICJvcHRpb25zIHsgIgotICAgICIgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgbmFtZSB7ICIKLSAgICAiICAgICAgbmFtZV9wYXJ0OiBcImZpbGVfb3B0MVwiICIKLSAgICAiICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKLSAgICAiICAgIH0gIgotICAgICIgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0ICIKLSAgICAiICB9ICIKLSAgICAvLyBUZXN0IGEgbm9uLWV4dGVuc2lvbiBvcHRpb24gdG9vLiAgKEF0IG9uZSBwb2ludCB0aGlzIGZhaWxlZCBkdWUgdG8gYQotICAgIC8vIGJ1Zy4pCi0gICAgIiAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICBuYW1lIHsgIgotICAgICIgICAgICBuYW1lX3BhcnQ6IFwiamF2YV9wYWNrYWdlXCIgIgotICAgICIgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKLSAgICAiICAgIH0gIgotICAgICIgICAgc3RyaW5nX3ZhbHVlOiBcImZvb1wiICIKLSAgICAiICB9ICIKLSAgICAvLyBUZXN0IHRoYXQgZW51bS10eXBlZCBvcHRpb25zIHN0aWxsIHdvcmsgdG9vLiAgKEF0IG9uZSBwb2ludCB0aGlzIGFsc28KLSAgICAvLyBmYWlsZWQgZHVlIHRvIGEgYnVnLikKLSAgICAiICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKLSAgICAiICAgIG5hbWUgeyAiCi0gICAgIiAgICAgIG5hbWVfcGFydDogXCJvcHRpbWl6ZV9mb3JcIiAiCi0gICAgIiAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgotICAgICIgICAgfSAiCi0gICAgIiAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIlNQRUVEXCIgIgotICAgICIgIH0gIgotICAgICJ9IgotICAgICwKLSAgICAmZmlsZV9wcm90bykpOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgxMjM0LCBmaWxlLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjpmaWxlX29wdDEpKTsKLSAgRVhQRUNUX1RSVUUoZmlsZS0+b3B0aW9ucygpLmhhc19qYXZhX3BhY2thZ2UoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgZmlsZS0+b3B0aW9ucygpLmphdmFfcGFja2FnZSgpKTsKLSAgRVhQRUNUX1RSVUUoZmlsZS0+b3B0aW9ucygpLmhhc19vcHRpbWl6ZV9mb3IoKSk7Ci0gIEVYUEVDVF9FUShGaWxlT3B0aW9uczo6U1BFRUQsIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSk7Ci19Ci0KLVRFU1QoQ3VzdG9tT3B0aW9ucywgTWVzc2FnZU9wdGlvblRocmVlRmllbGRzU2V0KSB7Ci0gIC8vIFRoaXMgdGVzdHMgYSBidWcgd2hpY2ggcHJldmlvdXNseSBleGlzdGVkIGluIGN1c3RvbSBvcHRpb25zIHBhcnNpbmcuICBUaGUKLSAgLy8gYnVnIG9jY3VycmVkIHdoZW4geW91IGRlZmluZWQgYSBjdXN0b20gb3B0aW9uIHdpdGggbWVzc2FnZSB0eXBlIGFuZCB0aGVuCi0gIC8vIHNldCB0aHJlZSBmaWVsZHMgb2YgdGhhdCBvcHRpb24gb24gYSBzaW5nbGUgZGVmaW5pdGlvbiAoc2VlIHRoZSBleGFtcGxlCi0gIC8vIGJlbG93KS4gIFRoZSBidWcgaXMgYSBiaXQgaGFyZCB0byBleHBsYWluLCBzbyBjaGVjayB0aGUgY2hhbmdlIGhpc3RvcnkgaWYKLSAgLy8geW91IHdhbnQgdG8ga25vdyBtb3JlLgotICBEZXNjcmlwdG9yUG9vbCBwb29sOwotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOwotCi0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zOjpkZXNjcmlwdG9yKCkKLSAgICAtPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKLSAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyByZXByZXNlbnRzIHRoZSBkZWZpbml0aW9uOgotICAvLwotICAvLyAgIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIgotICAvLyAgIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0gIC8vICAgbWVzc2FnZSBGb28gewotICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbyAgPSAxMjM0OwotICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbzIgPSAxMjM0OwotICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbzMgPSAxMjM0OwotICAvLyAgIH0KLSAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAotICAgICJuYW1lOiBcImN1c3RvbV9vcHRpb25zX2ltcG9ydC5wcm90b1wiICIKLSAgICAicGFja2FnZTogXCJwcm90b2J1Zl91bml0dGVzdFwiICIKLSAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIkZvb1wiICIKLSAgICAiICBvcHRpb25zIHsgIgotICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgbmFtZSB7ICIKLSAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMjM0ICIKLSAgICAiICAgIH0gIgotICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgbmFtZSB7ICIKLSAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiZm9vMlwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMTIzNCAiCi0gICAgIiAgICB9ICIKLSAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgICBuYW1lIHsgIgotICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDFcIiAiCi0gICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImZvbzNcIiAiCi0gICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCi0gICAgIiAgICAgIH0gIgotICAgICIgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEyMzQgIgotICAgICIgICAgfSAiCi0gICAgIiAgfSAiCi0gICAgIn0iLAotICAgICZmaWxlX3Byb3RvKSk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKLSAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKLSAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLQotICBjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+b3B0aW9ucygpOwotICBFWFBFQ1RfRVEoMTIzNCwgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuZm9vKCkpOwotfQotCi1URVNUKEN1c3RvbU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25SZXBlYXRlZExlYWZGaWVsZFNldCkgewotICAvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCByZXBlYXRlZCBmaWVsZHMgaW4gY3VzdG9tIG9wdGlvbnMgY2FuIGJlCi0gIC8vIGdpdmVuIG11bHRpcGxlIHZhbHVlcyBieSByZXBlYXRpbmcgdGhlIG9wdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgotICAvLyBUaGlzIHRlc3QgY2hlY2tzIHJlcGVhdGVkIGxlYWYgdmFsdWVzLiBFYWNoIHJlcGVhdGVkIGN1c3RvbSB2YWx1ZQotICAvLyBhcHBlYXJzIGluIGEgZGlmZmVyZW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCB3aGljaCB3aWxsIGJlIGNvbmNhdGVuYXRlZAotICAvLyB3aGVuIHRoZXkgYXJlIG1lcmdlZCBpbnRvIHRoZSBmaW5hbCBvcHRpb24gdmFsdWUuCi0gIERlc2NyaXB0b3JQb29sIHBvb2w7Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKLSAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7Ci0KLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKQotICAgIC0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKLQotICAvLyBUaGUgZm9sbG93aW5nIHJlcHJlc2VudHMgdGhlIGRlZmluaXRpb246Ci0gIC8vCi0gIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iCi0gIC8vICAgcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLSAgLy8gICBtZXNzYWdlIEZvbyB7Ci0gIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MSkuZm9vNCA9IDEyOwotICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbzQgPSAzNDsKLSAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQxKS5mb280ID0gNTY7Ci0gIC8vICAgfQotICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCi0gICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcInByb3RvYnVmX3VuaXR0ZXN0XCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICIgIG5hbWU6IFwiRm9vXCIgIgotICAgICIgIG9wdGlvbnMgeyAiCi0gICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKLSAgICAiICAgICAgbmFtZSB7ICIKLSAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiY29tcGxleF9vcHQxXCIgIgotICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCi0gICAgIiAgICAgIH0gIgotICAgICIgICAgICBuYW1lIHsgIgotICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb280XCIgIgotICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMiAiCi0gICAgIiAgICB9ICIKLSAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgICBuYW1lIHsgIgotICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDFcIiAiCi0gICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImZvbzRcIiAiCi0gICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCi0gICAgIiAgICAgIH0gIgotICAgICIgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDM0ICIKLSAgICAiICAgIH0gIgotICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgbmFtZSB7ICIKLSAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiZm9vNFwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogNTYgIgotICAgICIgICAgfSAiCi0gICAgIiAgfSAiCi0gICAgIn0iLAotICAgICZmaWxlX3Byb3RvKSk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKLSAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKLSAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKLQotICBjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+b3B0aW9ucygpOwotICBFWFBFQ1RfRVEoMywgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuZm9vNF9zaXplKCkpOwotICBFWFBFQ1RfRVEoMTIsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbzQoMCkpOwotICBFWFBFQ1RfRVEoMzQsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbzQoMSkpOwotICBFWFBFQ1RfRVEoNTYsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbzQoMikpOwotfQotCi1URVNUKEN1c3RvbU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25SZXBlYXRlZE1zZ0ZpZWxkU2V0KSB7Ci0gIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHJlcGVhdGVkIGZpZWxkcyBpbiBjdXN0b20gb3B0aW9ucyBjYW4gYmUKLSAgLy8gZ2l2ZW4gbXVsdGlwbGUgdmFsdWVzIGJ5IHJlcGVhdGluZyB0aGUgb3B0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuCi0gIC8vIFRoaXMgdGVzdCBjaGVja3MgcmVwZWF0ZWQgbWVzc2FnZSB2YWx1ZXMuIEVhY2ggcmVwZWF0ZWQgY3VzdG9tIHZhbHVlCi0gIC8vIGFwcGVhcnMgaW4gYSBkaWZmZXJlbnQgdW5pbnRlcnByZXRlZF9vcHRpb24sIHdoaWNoIHdpbGwgYmUgY29uY2F0ZW5hdGVkCi0gIC8vIHdoZW4gdGhleSBhcmUgbWVyZ2VkIGludG8gdGhlIGZpbmFsIG9wdGlvbiB2YWx1ZS4KLSAgRGVzY3JpcHRvclBvb2wgcG9vbDsKLQotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKLQotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpCi0gICAgLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOwotCi0gIC8vIFRoZSBmb2xsb3dpbmcgcmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbjoKLSAgLy8KLSAgLy8gICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIKLSAgLy8gICBwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotICAvLyAgIG1lc3NhZ2UgRm9vIHsKLSAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXJuZXkgPSB7d2FsZG86IDF9OwotICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhcm5leSA9IHt3YWxkbzogMTB9OwotICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhcm5leSA9IHt3YWxkbzogMTAwfTsKLSAgLy8gICB9Ci0gIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKLSAgICAibmFtZTogXCJjdXN0b21fb3B0aW9uc19pbXBvcnQucHJvdG9cIiAiCi0gICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgIiAgbmFtZTogXCJGb29cIiAiCi0gICAgIiAgb3B0aW9ucyB7ICIKLSAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICIgICAgICBuYW1lIHsgIgotICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDJcIiAiCi0gICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImJhcm5leVwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKLSAgICAiICAgICAgfSAiCi0gICAgIiAgICAgIGFnZ3JlZ2F0ZV92YWx1ZTogXCJ3YWxkbzogMVwiICIKLSAgICAiICAgIH0gIgotICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MlwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgbmFtZSB7ICIKLSAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiYmFybmV5XCIgIgotICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgYWdncmVnYXRlX3ZhbHVlOiBcIndhbGRvOiAxMFwiICIKLSAgICAiICAgIH0gIgotICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCi0gICAgIiAgICAgIG5hbWUgeyAiCi0gICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MlwiICIKLSAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgbmFtZSB7ICIKLSAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiYmFybmV5XCIgIgotICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgotICAgICIgICAgICB9ICIKLSAgICAiICAgICAgYWdncmVnYXRlX3ZhbHVlOiBcIndhbGRvOiAxMDBcIiAiCi0gICAgIiAgICB9ICIKLSAgICAiICB9ICIKLSAgICAifSIsCi0gICAgJmZpbGVfcHJvdG8pKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOwotICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOwotICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwotCi0gIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zID0gZmlsZS0+bWVzc2FnZV90eXBlKDApLT5vcHRpb25zKCk7Ci0gIEVYUEVDVF9FUSgzLCBvcHRpb25zLkdldEV4dGVuc2lvbigKLSAgICAgIHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcm5leV9zaXplKCkpOwotICBFWFBFQ1RfRVEoMSxvcHRpb25zLkdldEV4dGVuc2lvbigKLSAgICAgIHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcm5leSgwKS53YWxkbygpKTsKLSAgRVhQRUNUX0VRKDEwLCBvcHRpb25zLkdldEV4dGVuc2lvbigKLSAgICAgIHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcm5leSgxKS53YWxkbygpKTsKLSAgRVhQRUNUX0VRKDEwMCwgb3B0aW9ucy5HZXRFeHRlbnNpb24oCi0gICAgICBwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXJuZXkoMikud2FsZG8oKSk7Ci19Ci0KLS8vIENoZWNrIHRoYXQgYWdncmVnYXRlIG9wdGlvbnMgd2VyZSBwYXJzZWQgYW5kIHNhdmVkIGNvcnJlY3RseSBpbgotLy8gdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0b3JzLgotVEVTVChDdXN0b21PcHRpb25zLCBBZ2dyZWdhdGVPcHRpb25zKSB7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG1zZyA9IHByb3RvYnVmX3VuaXR0ZXN0OjpBZ2dyZWdhdGVNZXNzYWdlOjpkZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gbXNnLT5maWxlKCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtc2ctPkZpbmRGaWVsZEJ5TmFtZSgiZmllbGRuYW1lIik7Ci0gIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBlbnVtZCA9IGZpbGUtPkZpbmRFbnVtVHlwZUJ5TmFtZSgiQWdncmVnYXRlRW51bSIpOwotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtdiA9IGVudW1kLT5GaW5kVmFsdWVCeU5hbWUoIlZBTFVFIik7Ci0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlID0gZmlsZS0+RmluZFNlcnZpY2VCeU5hbWUoCi0gICAgICAiQWdncmVnYXRlU2VydmljZSIpOwotICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBzZXJ2aWNlLT5GaW5kTWV0aG9kQnlOYW1lKCJNZXRob2QiKTsKLQotICAvLyBUZXN0cyBmb3IgdGhlIGRpZmZlcmVudCB0eXBlcyBvZiBkYXRhIGVtYmVkZGVkIGluIGZpbGVvcHQKLSAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OkFnZ3JlZ2F0ZSYgZmlsZV9vcHRpb25zID0KLSAgICAgIGZpbGUtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVvcHQpOwotICBFWFBFQ1RfRVEoMTAwLCBmaWxlX29wdGlvbnMuaSgpKTsKLSAgRVhQRUNUX0VRKCJGaWxlQW5ub3RhdGlvbiIsIGZpbGVfb3B0aW9ucy5zKCkpOwotICBFWFBFQ1RfRVEoIk5lc3RlZEZpbGVBbm5vdGF0aW9uIiwgZmlsZV9vcHRpb25zLnN1YigpLnMoKSk7Ci0gIEVYUEVDVF9FUSgiRmlsZUV4dGVuc2lvbkFubm90YXRpb24iLAotICAgICAgICAgICAgZmlsZV9vcHRpb25zLmZpbGUoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpbGVvcHQpLnMoKSk7Ci0gIEVYUEVDVF9FUSgiRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCIsCi0gICAgICAgICAgICBmaWxlX29wdGlvbnMubXNldCgpLkdldEV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6QWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQKLSAgICAgICAgICAgICAgICA6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikucygpKTsKLQotICAvLyBTaW1wbGUgdGVzdHMgZm9yIGFsbCB0aGUgb3RoZXIgdHlwZXMgb2YgYW5ub3RhdGlvbnMKLSAgRVhQRUNUX0VRKCJNZXNzYWdlQW5ub3RhdGlvbiIsCi0gICAgICAgICAgICBtc2ctPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6Om1zZ29wdCkucygpKTsKLSAgRVhQRUNUX0VRKCJGaWVsZEFubm90YXRpb24iLAotICAgICAgICAgICAgZmllbGQtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmZpZWxkb3B0KS5zKCkpOwotICBFWFBFQ1RfRVEoIkVudW1Bbm5vdGF0aW9uIiwKLSAgICAgICAgICAgIGVudW1kLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjplbnVtb3B0KS5zKCkpOwotICBFWFBFQ1RfRVEoIkVudW1WYWx1ZUFubm90YXRpb24iLAotICAgICAgICAgICAgZW51bXYtPm9wdGlvbnMoKS5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmVudW12YWxvcHQpLnMoKSk7Ci0gIEVYUEVDVF9FUSgiU2VydmljZUFubm90YXRpb24iLAotICAgICAgICAgICAgc2VydmljZS0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6c2VydmljZW9wdCkucygpKTsKLSAgRVhQRUNUX0VRKCJNZXRob2RBbm5vdGF0aW9uIiwKLSAgICAgICAgICAgIG1ldGhvZC0+b3B0aW9ucygpLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6bWV0aG9kb3B0KS5zKCkpOwotfQotCi1URVNUKEN1c3RvbU9wdGlvbnMsIFVudXNlZEltcG9ydFdhcm5pbmcpIHsKLSAgRGVzY3JpcHRvclBvb2wgcG9vbDsKLQotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKLQotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpCi0gICAgICAtPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKLSAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7Ci0KLSAgcG9vbC5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoImN1c3RvbV9vcHRpb25zX2ltcG9ydC5wcm90byIpOwotICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCi0gICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcInByb3RvYnVmX3VuaXR0ZXN0XCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90b1wiICIsCi0gICAgJmZpbGVfcHJvdG8pKTsKLQotICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOwotICBFWFBFQ1RfVFJVRShwb29sLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywgJmVycm9yX2NvbGxlY3RvcikpOwotICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci53YXJuaW5nX3RleHRfKTsKLX0KLQotLy8gVmVyaWZpZXMgdGhhdCBwcm90byBmaWxlcyBjYW4gY29ycmVjdGx5IGJlIHBhcnNlZCwgZXZlbiBpZiB0aGUKLS8vIGN1c3RvbSBvcHRpb25zIGRlZmluZWQgaW4gdGhlIGZpbGUgYXJlIGluY29tcGF0aWJsZSB3aXRoIHRob3NlCi0vLyBjb21waWxlZCBpbiB0aGUgYmluYXJ5LiBTZWUgaHR0cDovL2IvMTkyNzYyNTAuCi1URVNUKEN1c3RvbU9wdGlvbnMsIE9wdGlvbnNXaXRoUmVxdWlyZWRFbnVtcykgewotICBEZXNjcmlwdG9yUG9vbCBwb29sOwotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgTWVzc2FnZU9wdGlvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKLQotICAvLyBDcmVhdGUgYSBuZXcgZmlsZSBkZXNjcmlwdG9yIHByb3RvIGNvbnRhaW5pbmcgYSBzdWJzZXQgb2YgdGhlCi0gIC8vIG1lc3NhZ2VzIGRlZmluZWQgaW4gZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvLgotICBmaWxlX3Byb3RvLkNsZWFyKCk7Ci0gIGZpbGVfcHJvdG8uc2V0X25hbWUoInVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIik7Ci0gIGZpbGVfcHJvdG8uc2V0X3BhY2thZ2UoInByb3RvYnVmX3VuaXR0ZXN0Iik7Ci0gIGZpbGVfcHJvdG8uYWRkX2RlcGVuZGVuY3koImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIik7Ci0KLSAgLy8gQWRkIHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIGV4dGVuc2lvbi4KLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGV4dGVuc2lvbiA9IGZpbGVfcHJvdG8uYWRkX2V4dGVuc2lvbigpOwotICBwcm90b2J1Zl91bml0dGVzdDo6T2xkT3B0aW9uVHlwZTo6ZGVzY3JpcHRvcigpLT5maWxlKCkKLSAgICAgIC0+RmluZEV4dGVuc2lvbkJ5TmFtZSgicmVxdWlyZWRfZW51bV9vcHQiKS0+Q29weVRvKGV4dGVuc2lvbik7Ci0KLSAgLy8gQWRkIGEgdGVzdCBtZXNzYWdlIHRoYXQgdXNlcyB0aGUgInJlcXVpcmVkX2VudW1fb3B0IiBvcHRpb24uCi0gIERlc2NyaXB0b3JQcm90byogdGVzdF9tZXNzYWdlX3R5cGUgPSBmaWxlX3Byb3RvLmFkZF9tZXNzYWdlX3R5cGUoKTsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aFJlcXVpcmVkRW51bU9wdGlvbjo6ZGVzY3JpcHRvcigpCi0gICAgICAtPkNvcHlUbyh0ZXN0X21lc3NhZ2VfdHlwZSk7Ci0KLSAgLy8gSW5zdHJ1Y3QgdGhlIGV4dGVuc2lvbiB0byB1c2UgTmV3T3B0aW9uVHlwZSBpbnN0ZWFkIG9mCi0gIC8vIE9sZE9wdGlvblR5cGUsIGFuZCBhZGQgdGhlIGRlc2NyaXB0b3Igb2YgTmV3T3B0aW9uVHlwZS4KLSAgZXh0ZW5zaW9uLT5zZXRfdHlwZV9uYW1lKCIucHJvdG9idWZfdW5pdHRlc3QuTmV3T3B0aW9uVHlwZSIpOwotICBEZXNjcmlwdG9yUHJvdG8qIG5ld19vcHRpb25fdHlwZSA9IGZpbGVfcHJvdG8uYWRkX21lc3NhZ2VfdHlwZSgpOwotICBwcm90b2J1Zl91bml0dGVzdDo6TmV3T3B0aW9uVHlwZTo6ZGVzY3JpcHRvcigpCi0gICAgICAtPkNvcHlUbyhuZXdfb3B0aW9uX3R5cGUpOwotCi0gIC8vIFJlcGxhY2UgdGhlIHZhbHVlIG9mIHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIG9wdGlvbiB1c2VkIGluIHRoZQotICAvLyB0ZXN0IG1lc3NhZ2Ugd2l0aCBhbiBlbnVtIHZhbHVlIHRoYXQgb25seSBleGlzdHMgaW4gTmV3T3B0aW9uVHlwZS4KLSAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKAotICAgICAgInVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgotICAgICAgIiAgbmFtZSB7ICIKLSAgICAgICIgICAgbmFtZV9wYXJ0OiAncmVxdWlyZWRfZW51bV9vcHQnICIKLSAgICAgICIgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKLSAgICAgICIgIH0gIgotICAgICAgIiAgYWdncmVnYXRlX3ZhbHVlOiAndmFsdWU6IE5FV19WQUxVRScgIgotICAgICAgIn0iLAotICAgICAgdGVzdF9tZXNzYWdlX3R5cGUtPm11dGFibGVfb3B0aW9ucygpKSk7Ci0KLSAgLy8gQWRkIHRoZSBmaWxlIGRlc2NyaXB0b3IgdG8gdGhlIHBvb2wuCi0gIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOwotCi0gIC8vIEZpbmQgdGhlIHRlc3QgbWVzc2FnZS4KLSAgY29uc3QgRGVzY3JpcHRvciogdGVzdF9tZXNzYWdlID0gcG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoCi0gICAgICAicHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VXaXRoUmVxdWlyZWRFbnVtT3B0aW9uIik7Ci0gIEFTU0VSVF9UUlVFKHRlc3RfbWVzc2FnZSAhPSBOVUxMKTsKLQotICBjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucyA9IHRlc3RfbWVzc2FnZS0+b3B0aW9ucygpOwotICAvLyBFeHRyYWN0IHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIG9wdGlvbi4gU2luY2UgdGhlIGJpbmFyeSBkb2VzIG5vdAotICAvLyBrbm93IHRoYXQgdGhlIGV4dGVuc2lvbiB3YXMgdXBkYXRlZCwgdGhpcyB3aWxsIHN0aWxsIHJldHVybiBhbgotICAvLyBPbGRPcHRpb25UeXBlIG1lc3NhZ2UuCi0gIEFTU0VSVF9UUlVFKAotICAgICAgb3B0aW9ucy5IYXNFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcXVpcmVkX2VudW1fb3B0KSk7Ci0gIGNvbnN0IHByb3RvYnVmX3VuaXR0ZXN0OjpPbGRPcHRpb25UeXBlJiBvbGRfZW51bV9vcHQgPQotICAgICAgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OnJlcXVpcmVkX2VudW1fb3B0KTsKLQotICAvLyBDb25maXJtIHRoYXQgdGhlIHJlcXVpcmVkIGVudW0gZmllbGQgaXMgbWlzc2luZy4KLSAgRVhQRUNUX0ZBTFNFKG9sZF9lbnVtX29wdC5Jc0luaXRpYWxpemVkKCkpOwotICBFWFBFQ1RfRkFMU0Uob2xkX2VudW1fb3B0Lmhhc192YWx1ZSgpKTsKLQotICBzdHJpbmcgYnVmOwotICAvLyBWZXJpZnkgdGhhdCB0aGUgcmVxdWlyZWQgZW51bSBmaWVsZCBkb2VzIHNob3cgdXAgd2hlbiB0aGUgb3B0aW9uCi0gIC8vIGlzIHJlLXBhcnNlZCBhcyBhIE5ld09wdGlvblR5cGUgbWVzc2FnZTsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6Ok5ld09wdGlvblR5cGUgbmV3X2VudW1fb3B0OwotICBFWFBFQ1RfVFJVRShvbGRfZW51bV9vcHQuQXBwZW5kUGFydGlhbFRvU3RyaW5nKCZidWYpKTsKLSAgRVhQRUNUX1RSVUUobmV3X2VudW1fb3B0LlBhcnNlRnJvbVN0cmluZyhidWYpKTsKLSAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpOZXdPcHRpb25UeXBlOjpORVdfVkFMVUUsIG5ld19lbnVtX29wdC52YWx1ZSgpKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBWYWxpZGF0aW9uRXJyb3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgLy8gUGFyc2UgZmlsZV90ZXh0IGFzIGEgRmlsZURlc2NyaXB0b3JQcm90byBpbiB0ZXh0IGZvcm1hdCBhbmQgYWRkIGl0Ci0gIC8vIHRvIHRoZSBEZXNjcmlwdG9yUG9vbC4gIEV4cGVjdCBubyBlcnJvcnMuCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBCdWlsZEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlX3RleHQpIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gICAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKGZpbGVfdGV4dCwgJmZpbGVfcHJvdG8pKTsKLSAgICByZXR1cm4gR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uQnVpbGRGaWxlKGZpbGVfcHJvdG8pKTsKLSAgfQotCi0gIC8vIFBhcnNlIGZpbGVfdGV4dCBhcyBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW4gdGV4dCBmb3JtYXQgYW5kIGFkZCBpdAotICAvLyB0byB0aGUgRGVzY3JpcHRvclBvb2wuICBFeHBlY3QgZXJyb3JzIHRvIGJlIHByb2R1Y2VkIHdoaWNoIG1hdGNoIHRoZQotICAvLyBnaXZlbiBlcnJvciB0ZXh0LgotICB2b2lkIEJ1aWxkRmlsZVdpdGhFcnJvcnMoY29uc3Qgc3RyaW5nJiBmaWxlX3RleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGV4cGVjdGVkX2Vycm9ycykgewotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOwotCi0gICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKLSAgICBFWFBFQ1RfVFJVRSgKLSAgICAgIHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywgJmVycm9yX2NvbGxlY3RvcikgPT0gTlVMTCk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkX2Vycm9ycywgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKLSAgfQotCi0gIC8vIFBhcnNlIGZpbGVfdGV4dCBhcyBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW4gdGV4dCBmb3JtYXQgYW5kIGFkZCBpdAotICAvLyB0byB0aGUgRGVzY3JpcHRvclBvb2wuICBFeHBlY3QgZXJyb3JzIHRvIGJlIHByb2R1Y2VkIHdoaWNoIG1hdGNoIHRoZQotICAvLyBnaXZlbiB3YXJuaW5nIHRleHQuCi0gIHZvaWQgQnVpbGRGaWxlV2l0aFdhcm5pbmdzKGNvbnN0IHN0cmluZyYgZmlsZV90ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3dhcm5pbmdzKSB7Ci0gICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7Ci0KLSAgICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOwotICAgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZUNvbGxlY3RpbmdFcnJvcnMoZmlsZV9wcm90bywgJmVycm9yX2NvbGxlY3RvcikpOwotICAgIEVYUEVDVF9FUShleHBlY3RlZF93YXJuaW5ncywgZXJyb3JfY29sbGVjdG9yLndhcm5pbmdfdGV4dF8pOwotICB9Ci0KLSAgLy8gQnVpbGRzIHNvbWUgYWxyZWFkeS1wYXJzZWQgZmlsZSBpbiBvdXIgdGVzdCBwb29sLgotICB2b2lkIEJ1aWxkRmlsZUluVGVzdFBvb2woY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gICAgZmlsZS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKLSAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7Ci0gIH0KLQotICAvLyBCdWlsZCBkZXNjcmlwdG9yLnByb3RvIGluIG91ciB0ZXN0IHBvb2wuIFRoaXMgYWxsb3dzIHVzIHRvIGV4dGVuZCBpdCBpbgotICAvLyB0aGUgdGVzdCBwb29sLCBzbyB3ZSBjYW4gdGVzdCBjdXN0b20gb3B0aW9ucy4KLSAgdm9pZCBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKSB7Ci0gICAgQnVpbGRGaWxlSW5UZXN0UG9vbChEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpKTsKLSAgfQotCi0gIERlc2NyaXB0b3JQb29sIHBvb2xfOwotfTsKLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFscmVhZHlEZWZpbmVkKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IFwiRm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBbHJlYWR5RGVmaW5lZEluUGFja2FnZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAicGFja2FnZTogXCJmb28uYmFyXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28uYmFyLkZvbzogTkFNRTogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgotICAgICAgIlwiZm9vLmJhclwiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBbHJlYWR5RGVmaW5lZEluT3RoZXJGaWxlKSB7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iLAotCi0gICAgImJhci5wcm90bzogRm9vOiBOQU1FOiBcIkZvb1wiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBmaWxlICIKLSAgICAgICJcImZvby5wcm90b1wiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBQYWNrYWdlQWxyZWFkeURlZmluZWQpIHsKLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJmb29cIiB9Iik7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcImZvby5iYXJcIiIsCi0KLSAgICAiYmFyLnByb3RvOiBmb286IE5BTUU6IFwiZm9vXCIgaXMgYWxyZWFkeSBkZWZpbmVkIChhcyBzb21ldGhpbmcgb3RoZXIgIgotICAgICAgInRoYW4gYSBwYWNrYWdlKSBpbiBmaWxlIFwiZm9vLnByb3RvXCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1WYWx1ZUFscmVhZHlEZWZpbmVkSW5QYXJlbnQpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vXCIgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMSB9IH0gIgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTogXCJGT09cIiBudW1iZXI6IDEgfSB9ICIsCi0KLSAgICAiZm9vLnByb3RvOiBGT086IE5BTUU6IFwiRk9PXCIgaXMgYWxyZWFkeSBkZWZpbmVkLlxuIgotICAgICJmb28ucHJvdG86IEZPTzogTkFNRTogTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgIgotICAgICAgIm1lYW5pbmcgdGhhdCBlbnVtIHZhbHVlcyBhcmUgc2libGluZ3Mgb2YgdGhlaXIgdHlwZSwgbm90IGNoaWxkcmVuIG9mICIKLSAgICAgICJpdC4gIFRoZXJlZm9yZSwgXCJGT09cIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gdGhlIGdsb2JhbCBzY29wZSwgbm90ICIKLSAgICAgICJqdXN0IHdpdGhpbiBcIkJhclwiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtVmFsdWVBbHJlYWR5RGVmaW5lZEluUGFyZW50Tm9uR2xvYmFsKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcInBrZ1wiICIKLSAgICAiZW51bV90eXBlIHsgbmFtZTogXCJGb29cIiB2YWx1ZSB7IG5hbWU6IFwiRk9PXCIgbnVtYmVyOiAxIH0gfSAiCi0gICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOiBcIkZPT1wiIG51bWJlcjogMSB9IH0gIiwKLQotICAgICJmb28ucHJvdG86IHBrZy5GT086IE5BTUU6IFwiRk9PXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIFwicGtnXCIuXG4iCi0gICAgImZvby5wcm90bzogcGtnLkZPTzogTkFNRTogTm90ZSB0aGF0IGVudW0gdmFsdWVzIHVzZSBDKysgc2NvcGluZyBydWxlcywgIgotICAgICAgIm1lYW5pbmcgdGhhdCBlbnVtIHZhbHVlcyBhcmUgc2libGluZ3Mgb2YgdGhlaXIgdHlwZSwgbm90IGNoaWxkcmVuIG9mICIKLSAgICAgICJpdC4gIFRoZXJlZm9yZSwgXCJGT09cIiBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gXCJwa2dcIiwgbm90IGp1c3Qgd2l0aGluICIKLSAgICAgICJcIkJhclwiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNaXNzaW5nTmFtZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgfSIsCi0KLSAgICAiZm9vLnByb3RvOiA6IE5BTUU6IE1pc3NpbmcgbmFtZS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZE5hbWUpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiJFwiIH0iLAotCi0gICAgImZvby5wcm90bzogJDogTkFNRTogXCIkXCIgaXMgbm90IGEgdmFsaWQgaWRlbnRpZmllci5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZFBhY2thZ2VOYW1lKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcImZvby4kXCIiLAotCi0gICAgImZvby5wcm90bzogZm9vLiQ6IE5BTUU6IFwiJFwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1pc3NpbmdGaWxlTmFtZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICIiLAotCi0gICAgIjogOiBPVEhFUjogTWlzc2luZyBmaWVsZDogRmlsZURlc2NyaXB0b3JQcm90by5uYW1lLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEdXBlRGVwZW5kZW5jeSkgewotICBCdWlsZEZpbGUoIm5hbWU6IFwiZm9vLnByb3RvXCIiKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIsCi0KLSAgICAiYmFyLnByb3RvOiBiYXIucHJvdG86IE9USEVSOiBJbXBvcnQgXCJmb28ucHJvdG9cIiB3YXMgbGlzdGVkIHR3aWNlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmtub3duRGVwZW5kZW5jeSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiLAotCi0gICAgImJhci5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW1wb3J0IFwiZm9vLnByb3RvXCIgaGFzIG5vdCBiZWVuIGxvYWRlZC5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZFB1YmxpY0RlcGVuZGVuY3lJbmRleCkgewotICBCdWlsZEZpbGUoIm5hbWU6IFwiZm9vLnByb3RvXCIiKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgotICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMSIsCi0gICAgImJhci5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRm9yZWlnblVuaW1wb3J0ZWRQYWNrYWdlTm9DcmFzaCkgewotICAvLyBVc2VkIHRvIGNyYXNoOiAgSWYgd2UgZGVwZW5kIG9uIGEgbm9uLWV4aXN0ZW50IGZpbGUgYW5kIHRoZW4gcmVmZXIgdG8gYQotICAvLyBwYWNrYWdlIGRlZmluZWQgaW4gYSBmaWxlIHRoYXQgd2UgZGlkbid0IGltcG9ydCwgYW5kIHRoYXQgcGFja2FnZSBpcwotICAvLyBuZXN0ZWQgd2l0aGluIGEgcGFyZW50IHBhY2thZ2Ugd2hpY2ggdGhpcyBmaWxlIGlzIGFsc28gaW4sIGFuZCB3ZSBkb24ndAotICAvLyBpbmNsdWRlIHRoYXQgcGFyZW50IHBhY2thZ2UgaW4gdGhlIG5hbWUgKGkuZS4gd2UgZG8gYSByZWxhdGl2ZSBsb29rdXApLi4uCi0gIC8vIFllcywgcmVhbGx5LgotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6ICdmb28ucHJvdG8nICIKLSAgICAicGFja2FnZTogJ291dGVyLmZvbycgIik7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6ICdiYXIucHJvdG8nICIKLSAgICAiZGVwZW5kZW5jeTogJ2Jhei5wcm90bycgIgotICAgICJwYWNrYWdlOiAnb3V0ZXIuYmFyJyAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiAnQmFyJyAiCi0gICAgIiAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTonZm9vLkZvbycgfSIKLSAgICAifSIsCi0KLSAgICAiYmFyLnByb3RvOiBiYXIucHJvdG86IE9USEVSOiBJbXBvcnQgXCJiYXoucHJvdG9cIiBoYXMgbm90IGJlZW4gbG9hZGVkLlxuIgotICAgICJiYXIucHJvdG86IG91dGVyLmJhci5CYXIuYmFyOiBUWVBFOiBcIm91dGVyLmZvb1wiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gIgotICAgICAgIlwiZm9vLnByb3RvXCIsIHdoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImJhci5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsICIKLSAgICAgICJwbGVhc2UgYWRkIHRoZSBuZWNlc3NhcnkgaW1wb3J0LlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEdXBlRmlsZSkgewotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0iKTsKLSAgLy8gTm90ZTogIFdlIHNob3VsZCAqbm90KiBnZXQgcmVkdW5kYW50IGVycm9ycyBhYm91dCAiRm9vIiBhbHJlYWR5IGJlaW5nCi0gIC8vICAgZGVmaW5lZC4KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCi0gICAgLy8gQWRkIGFub3RoZXIgdHlwZSBzbyB0aGF0IHRoZSBmaWxlcyBhcmVuJ3QgaWRlbnRpY2FsIChpbiB3aGljaCBjYXNlIHRoZXJlCi0gICAgLy8gd291bGQgYmUgbm8gZXJyb3IpLgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iLAotCi0gICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPVEhFUjogQSBmaWxlIHdpdGggdGhpcyBuYW1lIGlzIGFscmVhZHkgaW4gdGhlICIKLSAgICAgICJwb29sLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZEluRXh0ZW5zaW9uUmFuZ2UpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogIDkgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMTAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImJhelwiIG51bWJlcjogMTkgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcInF1eFwiIG51bWJlcjogMjAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZSAxMCB0byAxOSBpbmNsdWRlcyBmaWVsZCAiCi0gICAgICAiXCJiYXJcIiAoMTApLlxuIgotICAgICJmb28ucHJvdG86IEZvby5iYXo6IE5VTUJFUjogRXh0ZW5zaW9uIHJhbmdlIDEwIHRvIDE5IGluY2x1ZGVzIGZpZWxkICIKLSAgICAgICJcImJhelwiICgxOSkuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE92ZXJsYXBwaW5nRXh0ZW5zaW9uUmFuZ2VzKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDIwIGVuZDogMzAgfSIKLSAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTkgZW5kOiAyMSB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTkgdG8gMjAgb3ZlcmxhcHMgd2l0aCAiCi0gICAgICAiYWxyZWFkeS1kZWZpbmVkIHJhbmdlIDEwIHRvIDE5LlxuIgotICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTkgdG8gMjAgb3ZlcmxhcHMgd2l0aCAiCi0gICAgICAiYWxyZWFkeS1kZWZpbmVkIHJhbmdlIDIwIHRvIDI5LlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZEZpZWxkRXJyb3IpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMTUgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IE5VTUJFUjogRmllbGQgXCJmb29cIiB1c2VzIHJlc2VydmVkIG51bWJlciAxNS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWRFeHRlbnNpb25SYW5nZUVycm9yKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCi0gICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogNSBlbmQ6IDE1IH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IEV4dGVuc2lvbiByYW5nZSAxMCB0byAxOSIKLSAgICAiIG92ZXJsYXBzIHdpdGggcmVzZXJ2ZWQgcmFuZ2UgNSB0byAxNC5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWRFeHRlbnNpb25SYW5nZUFkamFjZW50KSB7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKLSAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiA1IGVuZDogMTAgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWRSYW5nZU92ZXJsYXApIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgotICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDUgZW5kOiAxNSB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBSZXNlcnZlZCByYW5nZSA1IHRvIDE0IgotICAgICIgb3ZlcmxhcHMgd2l0aCBhbHJlYWR5LWRlZmluZWQgcmFuZ2UgMTAgdG8gMTkuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkTmFtZUVycm9yKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDE1IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXJcIiBudW1iZXI6IDE2IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXpcIiBudW1iZXI6IDE3IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICIgIHJlc2VydmVkX25hbWU6IFwiZm9vXCIiCi0gICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJiYXJcIiIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOQU1FOiBGaWVsZCBuYW1lIFwiZm9vXCIgaXMgcmVzZXJ2ZWQuXG4iCi0gICAgImZvby5wcm90bzogRm9vLmJhcjogTkFNRTogRmllbGQgbmFtZSBcImJhclwiIGlzIHJlc2VydmVkLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZE5hbWVSZWR1bmRhbnQpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJmb29cIiIKLSAgICAiICByZXNlcnZlZF9uYW1lOiBcImZvb1wiIgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IGZvbzogTkFNRTogRmllbGQgbmFtZSBcImZvb1wiIGlzIHJlc2VydmVkIG11bHRpcGxlIHRpbWVzLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZEZpZWxkc0RlYnVnU3RyaW5nKSB7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICByZXNlcnZlZF9uYW1lOiBcImZvb1wiIgotICAgICIgIHJlc2VydmVkX25hbWU6IFwiYmFyXCIiCi0gICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogNSBlbmQ6IDYgfSIKLSAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCi0gICAgIn0iKTsKLQotICBBU1NFUlRfRVEoCi0gICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG5cbiIKLSAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICIgIHJlc2VydmVkIDUsIDEwIHRvIDE5O1xuIgotICAgICIgIHJlc2VydmVkIFwiZm9vXCIsIFwiYmFyXCI7XG4iCi0gICAgIn1cblxuIiwKLSAgICBmaWxlLT5EZWJ1Z1N0cmluZygpKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludmFsaWREZWZhdWx0cykgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLQotICAgIC8vIEludmFsaWQgbnVtYmVyLgotICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDEgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfSU5UMzIiCi0gICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcImFiY1wiIH0iCi0KLSAgICAvLyBFbXB0eSBkZWZhdWx0IHZhbHVlLgotICAgICIgIGZpZWxkIHsgbmFtZTogXCJiYXJcIiBudW1iZXI6IDIgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfSU5UMzIiCi0gICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcIlwiIH0iCi0KLSAgICAvLyBJbnZhbGlkIGJvb2xlYW4uCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImJhelwiIG51bWJlcjogMyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9CT09MIgotICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJhYmNcIiB9IgotCi0gICAgLy8gTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0cy4KLSAgICAiICBmaWVsZCB7IG5hbWU6IFwicXV4XCIgbnVtYmVyOiA0IGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX01FU1NBR0UiCi0gICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcImFiY1wiIHR5cGVfbmFtZTogXCJGb29cIiB9IgotCi0gICAgLy8gU2FtZSB0aGluZywgYnV0IHdlIGRvbid0IGtub3cgdGhhdCB0aGlzIGZpZWxkIGhhcyBtZXNzYWdlIHR5cGUgdW50aWwKLSAgICAvLyB3ZSBsb29rIHVwIHRoZSB0eXBlIG5hbWUuCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcInF1dXhcIiBudW1iZXI6IDUgbGFiZWw6IExBQkVMX09QVElPTkFMIgotICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCJhYmNcIiB0eXBlX25hbWU6IFwiRm9vXCIgfSIKLQotICAgIC8vIFJlcGVhdGVkcyBjYW4ndCBoYXZlIGRlZmF1bHRzLgotICAgICIgIGZpZWxkIHsgbmFtZTogXCJjb3JnZVwiIG51bWJlcjogNiBsYWJlbDogTEFCRUxfUkVQRUFURUQgdHlwZTogVFlQRV9JTlQzMiIKLSAgICAiICAgICAgICAgIGRlZmF1bHRfdmFsdWU6IFwiMVwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogREVGQVVMVF9WQUxVRTogQ291bGRuJ3QgcGFyc2UgZGVmYXVsdCB2YWx1ZSBcImFiY1wiLlxuIgotICAgICJmb28ucHJvdG86IEZvby5iYXI6IERFRkFVTFRfVkFMVUU6IENvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUgXCJcIi5cbiIKLSAgICAiZm9vLnByb3RvOiBGb28uYmF6OiBERUZBVUxUX1ZBTFVFOiBCb29sZWFuIGRlZmF1bHQgbXVzdCBiZSB0cnVlIG9yICIKLSAgICAgICJmYWxzZS5cbiIKLSAgICAiZm9vLnByb3RvOiBGb28ucXV4OiBERUZBVUxUX1ZBTFVFOiBNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLlxuIgotICAgICJmb28ucHJvdG86IEZvby5jb3JnZTogREVGQVVMVF9WQUxVRTogUmVwZWF0ZWQgZmllbGRzIGNhbid0IGhhdmUgZGVmYXVsdCAiCi0gICAgICAidmFsdWVzLlxuIgotICAgIC8vIFRoaXMgZW5kcyB1cCBiZWluZyByZXBvcnRlZCBsYXRlciBiZWNhdXNlIHRoZSBlcnJvciBpcyBkZXRlY3RlZCBhdAotICAgIC8vIGNyb3NzLWxpbmtpbmcgdGltZS4KLSAgICAiZm9vLnByb3RvOiBGb28ucXV1eDogREVGQVVMVF9WQUxVRTogTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0ICIKLSAgICAgICJ2YWx1ZXMuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5lZ2F0aXZlRmllbGROdW1iZXIpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogLTEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogTlVNQkVSOiBGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEh1Z2VGaWVsZE51bWJlcikgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAweDcwMDAwMDAwICIKLSAgICAiICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IE5VTUJFUjogRmllbGQgbnVtYmVycyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICIKLSAgICAgICI1MzY4NzA5MTEuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkRmllbGROdW1iZXIpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQge25hbWU6XCJmb29cIiBudW1iZXI6IDE4OTk5IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICIgIGZpZWxkIHtuYW1lOlwiYmFyXCIgbnVtYmVyOiAxOTAwMCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAiICBmaWVsZCB7bmFtZTpcImJhelwiIG51bWJlcjogMTk5OTkgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIiAgZmllbGQge25hbWU6XCJxdXhcIiBudW1iZXI6IDIwMDAwIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5iYXI6IE5VTUJFUjogRmllbGQgbnVtYmVycyAxOTAwMCB0aHJvdWdoIDE5OTk5IGFyZSAiCi0gICAgICAicmVzZXJ2ZWQgZm9yIHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBpbXBsZW1lbnRhdGlvbi5cbiIKLSAgICAiZm9vLnByb3RvOiBGb28uYmF6OiBOVU1CRVI6IEZpZWxkIG51bWJlcnMgMTkwMDAgdGhyb3VnaCAxOTk5OSBhcmUgIgotICAgICAgInJlc2VydmVkIGZvciB0aGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgaW1wbGVtZW50YXRpb24uXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEV4dGVuc2lvbk1pc3NpbmdFeHRlbmRlZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDogTEFCRUxfT1BUSU9OQUwiCi0gICAgIiAgICAgICAgICAgICAgdHlwZV9uYW1lOiBcIkZvb1wiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IEZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIG5vdCBzZXQgZm9yICIKLSAgICAgICJleHRlbnNpb24gZmllbGQuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vbkV4dGVuc2lvbldpdGhFeHRlbmRlZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJCYXJcIiIKLSAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDIgfSIKLSAgICAifSIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCIKLSAgICAiICAgICAgICAgIHR5cGVfbmFtZTogXCJGb29cIiBleHRlbmRlZTogXCJCYXJcIiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IEVYVEVOREVFOiBGaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSBzZXQgZm9yICIKLSAgICAgICJub24tZXh0ZW5zaW9uIGZpZWxkLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE9uZW9mSW5kZXhUb29MYXJnZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgotICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDEgfSIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJkdW1teVwiIG51bWJlcjoyIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogMCB9IgotICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiYmFyXCIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBPVEhFUjogRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXggMSBpcyBvdXQgb2YgIgotICAgICAgInJhbmdlIGZvciB0eXBlIFwiRm9vXCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkT25lb2ZJbmRleE5lZ2F0aXZlKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogLTEgfSIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJkdW1teVwiIG51bWJlcjoyIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogMCB9IgotICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiYmFyXCIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBPVEhFUjogRmllbGREZXNjcmlwdG9yUHJvdG8ub25lb2ZfaW5kZXggLTEgaXMgb3V0IG9mICIKLSAgICAgICJyYW5nZSBmb3IgdHlwZSBcIkZvb1wiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPbmVvZkZpZWxkc0NvbnNlY3V0aXZlRGVmaW5pdGlvbikgewotICAvLyBGaWVsZHMgYmVsb25naW5nIHRvIHRoZSBzYW1lIG9uZW9mIG11c3QgYmUgZGVmaW5lZCBjb25zZWN1dGl2ZWx5LgotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzFcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKLSAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhclwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzJcIiBudW1iZXI6IDMgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKLSAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKLSAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiZm9vc1wiIH0iCi0gICAgICAifSIsCi0KLSAgICAgICJmb28ucHJvdG86IEZvby5iYXI6IE9USEVSOiBGaWVsZHMgaW4gdGhlIHNhbWUgb25lb2YgbXVzdCBiZSBkZWZpbmVkICIKLSAgICAgICJjb25zZWN1dGl2ZWx5LiBcImJhclwiIGNhbm5vdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgIgotICAgICAgIlwiZm9vc1wiIG9uZW9mIGRlZmluaXRpb24uXG4iKTsKLQotICAvLyBQcmV2ZW50IGludGVybGVhdmVkIGZpZWxkcywgd2hpY2ggYmVsb25nIHRvIGRpZmZlcmVudCBvbmVvZnMuCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgICAibmFtZTogXCJmb28yLnByb3RvXCIgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICAgIiAgbmFtZTogXCJGb28yXCIiCi0gICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb28xXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0iCi0gICAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXIxXCIgbnVtYmVyOiAyIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAxIH0iCi0gICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb28yXCIgbnVtYmVyOiAzIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0iCi0gICAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXIyXCIgbnVtYmVyOiA0IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAxIH0iCi0gICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImZvb3NcIiB9IgotICAgICAgIiAgb25lb2ZfZGVjbCB7IG5hbWU6XCJiYXJzXCIgfSIKLSAgICAgICJ9IiwKLSAgICAgICJmb28yLnByb3RvOiBGb28yLmJhcjE6IE9USEVSOiBGaWVsZHMgaW4gdGhlIHNhbWUgb25lb2YgbXVzdCBiZSBkZWZpbmVkICIKLSAgICAgICJjb25zZWN1dGl2ZWx5LiBcImJhcjFcIiBjYW5ub3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGNvbXBsZXRpb24gb2YgdGhlICIKLSAgICAgICJcImZvb3NcIiBvbmVvZiBkZWZpbml0aW9uLlxuIgotICAgICAgImZvbzIucHJvdG86IEZvbzIuZm9vMjogT1RIRVI6IEZpZWxkcyBpbiB0aGUgc2FtZSBvbmVvZiBtdXN0IGJlIGRlZmluZWQgIgotICAgICAgImNvbnNlY3V0aXZlbHkuIFwiZm9vMlwiIGNhbm5vdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgIgotICAgICAgIlwiYmFyc1wiIG9uZW9mIGRlZmluaXRpb24uXG4iKTsKLQotICAvLyBBbm90aGVyIGNhc2UgZm9yIG5vcm1hbCBmaWVsZHMgYW5kIGRpZmZlcmVudCBvbmVvZiBmaWVsZHMgaW50ZXJsZWF2ZS4KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgICJuYW1lOiBcImZvbzMucHJvdG9cIiAiCi0gICAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgICAiICBuYW1lOiBcIkZvbzNcIiIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzFcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKLSAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhcjFcIiBudW1iZXI6IDIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKLSAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDEgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIG51bWJlcjogMyBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTpcImZvbzJcIiBudW1iZXI6IDQgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKLSAgICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKLSAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiZm9vc1wiIH0iCi0gICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImJhcnNcIiB9IgotICAgICAgIn0iLAotICAgICAgImZvbzMucHJvdG86IEZvbzMuYmF6OiBPVEhFUjogRmllbGRzIGluIHRoZSBzYW1lIG9uZW9mIG11c3QgYmUgZGVmaW5lZCAiCi0gICAgICAiY29uc2VjdXRpdmVseS4gXCJiYXpcIiBjYW5ub3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGNvbXBsZXRpb24gb2YgdGhlICIKLSAgICAgICJcImZvb3NcIiBvbmVvZiBkZWZpbml0aW9uLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE51bWJlckNvbmZsaWN0KSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBOVU1CRVI6IEZpZWxkIG51bWJlciAxIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiAiCi0gICAgICAiXCJGb29cIiBieSBmaWVsZCBcImZvb1wiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCYWRNZXNzYWdlU2V0RXh0ZW5zaW9uVHlwZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJNZXNzYWdlU2V0XCIiCi0gICAgIiAgb3B0aW9ucyB7IG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0OiB0cnVlIH0iCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDQgZW5kOiA1IH0iCi0gICAgIn0iCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZXh0ZW5zaW9uIHsgbmFtZTpcImZvb1wiIG51bWJlcjo0IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiIKLSAgICAiICAgICAgICAgICAgICBleHRlbmRlZTogXCJNZXNzYWdlU2V0XCIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgIgotICAgICAgIm1lc3NhZ2VzLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBCYWRNZXNzYWdlU2V0RXh0ZW5zaW9uTGFiZWwpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiTWVzc2FnZVNldFwiIgotICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9IgotICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiA0IGVuZDogNSB9IgotICAgICJ9IgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGV4dGVuc2lvbiB7IG5hbWU6XCJmb29cIiBudW1iZXI6NCBsYWJlbDpMQUJFTF9SRVBFQVRFRCB0eXBlOlRZUEVfTUVTU0FHRSIKLSAgICAiICAgICAgICAgICAgICB0eXBlX25hbWU6IFwiRm9vXCIgZXh0ZW5kZWU6IFwiTWVzc2FnZVNldFwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsICIKLSAgICAgICJtZXNzYWdlcy5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRJbk1lc3NhZ2VTZXQpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgb3B0aW9ucyB7IG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0OiB0cnVlIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOQU1FOiBNZXNzYWdlU2V0cyBjYW5ub3QgaGF2ZSBmaWVsZHMsIG9ubHkgIgotICAgICAgImV4dGVuc2lvbnMuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5lZ2F0aXZlRXh0ZW5zaW9uUmFuZ2VOdW1iZXIpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IC0xMCBlbmQ6IC0xIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vOiBOVU1CRVI6IEV4dGVuc2lvbiBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEh1Z2VFeHRlbnNpb25SYW5nZU51bWJlcikgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDB4NzAwMDAwMDAgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogRXh0ZW5zaW9uIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAiCi0gICAgICAiNTM2ODcwOTExLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFeHRlbnNpb25SYW5nZUVuZEJlZm9yZVN0YXJ0KSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDEwIH0iCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogNSB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAiCi0gICAgICAic3RhcnQgbnVtYmVyLlxuIgotICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgZW5kIG51bWJlciBtdXN0IGJlIGdyZWF0ZXIgdGhhbiAiCi0gICAgICAic3RhcnQgbnVtYmVyLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbXB0eUVudW0pIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImVudW1fdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSIKLSAgICAvLyBBbHNvIHVzZSB0aGUgZW1wdHkgZW51bSBpbiBhIG1lc3NhZ2UgdG8gbWFrZSBzdXJlIHRoZXJlIGFyZSBubyBjcmFzaGVzCi0gICAgLy8gZHVyaW5nIHZhbGlkYXRpb24gKHBvc3NpYmxlIGlmIHRoZSBjb2RlIGF0dGVtcHRzIHRvIGRlcml2ZSBhIGRlZmF1bHQKLSAgICAvLyB2YWx1ZSBmb3IgdGhlIGZpZWxkKS4KLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJCYXJcIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkZvb1wiIH0iCi0gICAgIiAgZmllbGQgeyBuYW1lOiBcImJhclwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6XCJGb29cIiAiCi0gICAgIiAgICAgICAgICBkZWZhdWx0X3ZhbHVlOiBcIk5PX1NVQ0hfVkFMVUVcIiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvbzogTkFNRTogRW51bXMgbXVzdCBjb250YWluIGF0IGxlYXN0IG9uZSB2YWx1ZS5cbiIKLSAgICAiZm9vLnByb3RvOiBCYXIuYmFyOiBERUZBVUxUX1ZBTFVFOiBFbnVtIHR5cGUgXCJGb29cIiBoYXMgbm8gdmFsdWUgbmFtZWQgIgotICAgICAgIlwiTk9fU1VDSF9WQUxVRVwiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWRFeHRlbmRlZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgotICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vbk1lc3NhZ2VFeHRlbmRlZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZW51bV90eXBlIHsgbmFtZTogXCJCYXJcIiB2YWx1ZSB7IG5hbWU6XCJEVU1NWVwiIG51bWJlcjowIH0gfSIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgotICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogRVhURU5ERUU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBOb3RBbkV4dGVuc2lvbk51bWJlcikgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJCYXJcIiIKLSAgICAifSIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBleHRlbnNpb24geyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIgotICAgICIgICAgICAgICAgICAgIGV4dGVuZGVlOiBcIkJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogTlVNQkVSOiBcIkJhclwiIGRvZXMgbm90IGRlY2xhcmUgMSBhcyBhbiBleHRlbnNpb24gIgotICAgICAgIm51bWJlci5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVxdWlyZWRFeHRlbnNpb24pIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiQmFyXCIiCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwMDAgZW5kOiAxMDAwMCB9IgotICAgICJ9IgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGV4dGVuc2lvbiB7IgotICAgICIgICAgbmFtZTpcImZvb1wiIgotICAgICIgICAgbnVtYmVyOjEwMDAiCi0gICAgIiAgICBsYWJlbDpMQUJFTF9SRVFVSVJFRCIKLSAgICAiICAgIHR5cGU6VFlQRV9JTlQzMiIKLSAgICAiICAgIGV4dGVuZGVlOiBcIkJhclwiIgotICAgICIgIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogTWVzc2FnZSBleHRlbnNpb25zIGNhbm5vdCBoYXZlIHJlcXVpcmVkICIKLSAgICAiZmllbGRzLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWRGaWVsZFR5cGUpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWRGaWVsZFR5cGVXaXRoRGVmYXVsdCkgewotICAvLyBTZWUgYi8xMjUzMzU4Mi4gUHJldmlvdXNseSB0aGlzIGZhaWxlZCBiZWNhdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdhcyBub3QKLSAgLy8gYWNjZXB0ZWQgYnkgdGhlIHBhcnNlciwgd2hpY2ggYXNzdW1lZCBhbiBlbnVtIHR5cGUsIGxlYWRpbmcgdG8gYW4gdW5jbGVhcgotICAvLyBlcnJvciBtZXNzYWdlLiBXZSB3YW50IHRoaXMgaW5wdXQgdG8geWllbGQgYSB2YWxpZGF0aW9uIGVycm9yIGluc3RlYWQsCi0gIC8vIHNpbmNlIHRoZSB1bmtub3duIHR5cGUgaXMgdGhlIHByaW1hcnkgcHJvYmxlbS4KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiaW50XCIgIgotICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTpcIjFcIiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiaW50XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVuZGVmaW5lZE5lc3RlZEZpZWxkVHlwZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6XCJCYXpcIiB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIgotICAgICIgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCi0gICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJGb28uQmF6LkJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJGb28uQmF6LkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVEZWZpbmVkSW5VbmRlY2xhcmVkRGVwZW5kZW5jeSkgewotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0gIik7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKLSAgICAifSIsCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluIFwiYmFyLnByb3RvXCIsICIKLSAgICAgICJ3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJmb28ucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgYWRkIHRoZSAiCi0gICAgICAibmVjZXNzYXJ5IGltcG9ydC5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlRGVmaW5lZEluSW5kaXJlY3REZXBlbmRlbmN5KSB7Ci0gIC8vIFRlc3QgZm9yIGhpZGRlbiBkZXBlbmRlbmNpZXMuCi0gIC8vCi0gIC8vIC8vIGJhci5wcm90bwotICAvLyBtZXNzYWdlIEJhcnt9Ci0gIC8vCi0gIC8vIC8vIGZvcndhcmQucHJvdG8KLSAgLy8gaW1wb3J0ICJiYXIucHJvdG8iCi0gIC8vCi0gIC8vIC8vIGZvby5wcm90bwotICAvLyBpbXBvcnQgImZvcndhcmQucHJvdG8iCi0gIC8vIG1lc3NhZ2UgRm9vIHsKLSAgLy8gICBvcHRpb25hbCBCYXIgZm9vID0gMTsgIC8vIEVycm9yLCBuZWVkcyB0byBpbXBvcnQgYmFyLnByb3RvIGV4cGxpY2l0bHkuCi0gIC8vIH0KLSAgLy8KLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7Ci0KLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImZvcndhcmQucHJvdG9cIiIKLSAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiIpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImZvcndhcmQucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKLSAgICAifSIsCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluIFwiYmFyLnByb3RvXCIsICIKLSAgICAgICJ3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJmb28ucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgYWRkIHRoZSAiCi0gICAgICAibmVjZXNzYXJ5IGltcG9ydC5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlRGVmaW5lZEluUHVibGljRGVwZW5kZW5jeSkgewotICAvLyBUZXN0IGZvciBwdWJsaWMgZGVwZW5kZW5jaWVzLgotICAvLwotICAvLyAvLyBiYXIucHJvdG8KLSAgLy8gbWVzc2FnZSBCYXJ7fQotICAvLwotICAvLyAvLyBmb3J3YXJkLnByb3RvCi0gIC8vIGltcG9ydCBwdWJsaWMgImJhci5wcm90byIKLSAgLy8KLSAgLy8gLy8gZm9vLnByb3RvCi0gIC8vIGltcG9ydCAiZm9yd2FyZC5wcm90byIKLSAgLy8gbWVzc2FnZSBGb28gewotICAvLyAgIG9wdGlvbmFsIEJhciBmb28gPSAxOyAgLy8gQ29ycmVjdC4gImJhci5wcm90byIgaXMgcHVibGljIGltcG9ydGVkIGludG8KLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvcndhcmQucHJvdG8sIHNvIHdoZW4gImZvby5wcm90byIgaW1wb3J0cwotICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gImZvcndhcmQucHJvdG8iLCBpdCBpbXBvcnRzICJiYXIucHJvdG8iIHRvby4KLSAgLy8gfQotICAvLwotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKLQotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgotICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiICIKLSAgICAicHVibGljX2RlcGVuZGVuY3k6IDAiKTsKLQotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImZvcndhcmQucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlRGVmaW5lZEluVHJhbnNpdGl2ZVB1YmxpY0RlcGVuZGVuY3kpIHsKLSAgLy8gVGVzdCBmb3IgcHVibGljIGRlcGVuZGVuY2llcy4KLSAgLy8KLSAgLy8gLy8gYmFyLnByb3RvCi0gIC8vIG1lc3NhZ2UgQmFye30KLSAgLy8KLSAgLy8gLy8gZm9yd2FyZC5wcm90bwotICAvLyBpbXBvcnQgcHVibGljICJiYXIucHJvdG8iCi0gIC8vCi0gIC8vIC8vIGZvcndhcmQyLnByb3RvCi0gIC8vIGltcG9ydCBwdWJsaWMgImZvcndhcmQucHJvdG8iCi0gIC8vCi0gIC8vIC8vIGZvby5wcm90bwotICAvLyBpbXBvcnQgImZvcndhcmQyLnByb3RvIgotICAvLyBtZXNzYWdlIEZvbyB7Ci0gIC8vICAgb3B0aW9uYWwgQmFyIGZvbyA9IDE7ICAvLyBDb3JyZWN0LCBwdWJsaWMgaW1wb3J0cyBhcmUgdHJhbnNpdGl2ZS4KLSAgLy8gfQotICAvLwotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkJhclwiIH0iKTsKLQotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiZm9yd2FyZC5wcm90b1wiIgotICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiICIKLSAgICAicHVibGljX2RlcGVuZGVuY3k6IDAiKTsKLQotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiZm9yd2FyZDIucHJvdG9cIiIKLSAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkLnByb3RvXCIgIgotICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMCIpOwotCi0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZDIucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwKLSAgICAgICBGaWVsZFR5cGVEZWZpbmVkSW5Qcml2YXRlRGVwZW5kZW5jeU9mUHVibGljRGVwZW5kZW5jeSkgewotICAvLyBUZXN0IGZvciBwdWJsaWMgZGVwZW5kZW5jaWVzLgotICAvLwotICAvLyAvLyBiYXIucHJvdG8KLSAgLy8gbWVzc2FnZSBCYXJ7fQotICAvLwotICAvLyAvLyBmb3J3YXJkLnByb3RvCi0gIC8vIGltcG9ydCAiYmFyLnByb3RvIgotICAvLwotICAvLyAvLyBmb3J3YXJkMi5wcm90bwotICAvLyBpbXBvcnQgcHVibGljICJmb3J3YXJkLnByb3RvIgotICAvLwotICAvLyAvLyBmb28ucHJvdG8KLSAgLy8gaW1wb3J0ICJmb3J3YXJkMi5wcm90byIKLSAgLy8gbWVzc2FnZSBGb28gewotICAvLyAgIG9wdGlvbmFsIEJhciBmb28gPSAxOyAgLy8gRXJyb3IsIHRoZSAiYmFyLnByb3RvIiBpcyBub3QgcHVibGljIGltcG9ydGVkCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvICJmb3J3YXJkLnByb3RvIiwgc28gd2lsbCBub3QgYmUgaW1wb3J0ZWQKLSAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludG8gZWl0aGVyICJmb3J3YXJkMi5wcm90byIgb3IgImZvby5wcm90byIuCi0gIC8vIH0KLSAgLy8KLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7Ci0KLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImZvcndhcmQucHJvdG9cIiIKLSAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiIpOwotCi0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJmb3J3YXJkMi5wcm90b1wiIgotICAgICJkZXBlbmRlbmN5OiBcImZvcndhcmQucHJvdG9cIiAiCi0gICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZDIucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKLSAgICAifSIsCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBzZWVtcyB0byBiZSBkZWZpbmVkIGluIFwiYmFyLnByb3RvXCIsICIKLSAgICAgICJ3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJmb28ucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgYWRkIHRoZSAiCi0gICAgICAibmVjZXNzYXJ5IGltcG9ydC5cbiIpOwotfQotCi0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBTZWFyY2hNb3N0TG9jYWxGaXJzdCkgewotICAvLyBUaGUgZm9sbG93aW5nIHNob3VsZCBwcm9kdWNlIGFuIGVycm9yIHRoYXQgQmFyLkJheiBpcyByZXNvbHZlZCBidXQKLSAgLy8gbm90IGRlZmluZWQ6Ci0gIC8vICAgbWVzc2FnZSBCYXIgeyBtZXNzYWdlIEJheiB7fSB9Ci0gIC8vICAgbWVzc2FnZSBGb28gewotICAvLyAgICAgbWVzc2FnZSBCYXIgewotICAvLyAgICAgICAvLyBQbGFjaW5nICJtZXNzYWdlIEJhent9IiBoZXJlLCBvciByZW1vdmluZyBGb28uQmFyIGFsdG9nZXRoZXIsCi0gIC8vICAgICAgIC8vIHdvdWxkIGZpeCB0aGUgZXJyb3IuCi0gIC8vICAgICB9Ci0gIC8vICAgICBvcHRpb25hbCBCYXIuQmF6IGJheiA9IDE7Ci0gIC8vICAgfQotICAvLyBBbiBvbmUgcG9pbnQgdGhlIGxvb2t1cCBjb2RlIGluY29ycmVjdGx5IGRpZCBub3QgcHJvZHVjZSBhbiBlcnJvciBpbiB0aGlzCi0gIC8vIGNhc2UsIGJlY2F1c2Ugd2hlbiBsb29raW5nIGZvciBCYXIuQmF6LCBpdCB3b3VsZCB0cnkgIkZvby5CYXIuQmF6IiBmaXJzdCwKLSAgLy8gZmFpbCwgYW5kIHRlbiB0cnkgIkJhci5CYXoiIGFuZCBzdWNjZWVkLCBldmVuIHRob3VnaCAiQmFyIiBzaG91bGQgYWN0dWFsbHkKLSAgLy8gcmVmZXIgdG8gdGhlIGlubmVyIEJhciwgbm90IHRoZSBvdXRlciBvbmUuCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkJhclwiIgotICAgICIgIG5lc3RlZF90eXBlIHsgbmFtZTogXCJCYXpcIiB9IgotICAgICJ9IgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIG5lc3RlZF90eXBlIHsgbmFtZTogXCJCYXJcIiB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIgotICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiQmFyLkJhelwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmJhejogVFlQRTogXCJCYXIuQmF6XCIgaXMgcmVzb2x2ZWQgdG8gXCJGb28uQmFyLkJhelwiLCIKLSAgICAiIHdoaWNoIGlzIG5vdCBkZWZpbmVkLiBUaGUgaW5uZXJtb3N0IHNjb3BlIGlzIHNlYXJjaGVkIGZpcnN0IGluIG5hbWUgIgotICAgICJyZXNvbHV0aW9uLiBDb25zaWRlciB1c2luZyBhIGxlYWRpbmcgJy4nKGkuZS4sIFwiLkJhci5CYXpcIikgdG8gc3RhcnQgIgotICAgICJmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFNlYXJjaE1vc3RMb2NhbEZpcnN0MikgewotICAvLyBUaGlzIHRlc3Qgd291bGQgZmluZCB0aGUgbW9zdCBsb2NhbCAiQmFyIiBmaXJzdCwgYW5kIGRvZXMsIGJ1dAotICAvLyBwcm9jZWVkcyB0byBmaW5kIHRoZSBvdXRlciBvbmUgYmVjYXVzZSB0aGUgaW5uZXIgb25lJ3Mgbm90IGFuCi0gIC8vIGFnZ3JlZ2F0ZS4KLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJCYXJcIiIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6IFwiQmF6XCIgfSIKLSAgICAifSIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6IFwiQmFyXCIgbnVtYmVyOjEgdHlwZTpUWVBFX0JZVEVTIH0gIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImJhelwiIG51bWJlcjoyIGxhYmVsOkxBQkVMX09QVElPTkFMIgotICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiQmFyLkJhelwiIH0iCi0gICAgIn0iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFBhY2thZ2VPcmlnaW5hbGx5RGVjbGFyZWRJblRyYW5zaXRpdmVEZXBlbmRlbnQpIHsKLSAgLy8gSW1hZ2luZSB3ZSBoYXZlIHRoZSBmb2xsb3dpbmc6Ci0gIC8vCi0gIC8vIGZvby5wcm90bzoKLSAgLy8gICBwYWNrYWdlIGZvby5iYXI7Ci0gIC8vIGJhci5wcm90bzoKLSAgLy8gICBwYWNrYWdlIGZvby5iYXI7Ci0gIC8vICAgaW1wb3J0ICJmb28ucHJvdG8iOwotICAvLyAgIG1lc3NhZ2UgQmFyIHt9Ci0gIC8vIGJhei5wcm90bzoKLSAgLy8gICBwYWNrYWdlIGZvbzsKLSAgLy8gICBpbXBvcnQgImJhci5wcm90byIKLSAgLy8gICBtZXNzYWdlIEJheiB7IG9wdGlvbmFsIGJhci5CYXIgcXV4ID0gMTsgfQotICAvLwotICAvLyBXaGVuIHZhbGlkYXRpbmcgYmF6LnByb3RvLCB3ZSB3aWxsIGxvb2sgdXAgImJhci5CYXIiLiAgQXMgcGFydCBvZiB0aGlzCi0gIC8vIGxvb2t1cCwgd2UgZmlyc3QgbG9va3VwICJiYXIiIHRoZW4gdHJ5IHRvIGZpbmQgIkJhciIgd2l0aGluIGl0LiAgImJhciIKLSAgLy8gc2hvdWxkIHJlc29sdmUgdG8gImZvby5iYXIiLiAgTm90ZSwgdGhvdWdoLCB0aGF0ICJmb28uYmFyIiB3YXMgb3JpZ2luYWxseQotICAvLyBkZWZpbmVkIGluIGZvby5wcm90bywgd2hpY2ggaXMgbm90IGEgZGlyZWN0IGRlcGVuZGVuY3kgb2YgYmF6LnByb3RvLiAgVGhlCi0gIC8vIGltcGxlbWVudGF0aW9uIG9mIEZpbmRTeW1ib2woKSBub3JtYWxseSBvbmx5IHJldHVybnMgc3ltYm9scyBpbiBkaXJlY3QKLSAgLy8gZGVwZW5kZW5jaWVzLCBub3QgaW5kaXJlY3Qgb25lcy4gIFRoaXMgdGVzdCBpbnN1cmVzIHRoYXQgdGhpcyBkb2VzIG5vdAotICAvLyBwcmV2ZW50IGl0IGZyb20gZmluZGluZyAiZm9vLmJhciIuCi0KLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAicGFja2FnZTogXCJmb28uYmFyXCIgIik7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCi0gICAgInBhY2thZ2U6IFwiZm9vLmJhclwiICIKLSAgICAiZGVwZW5kZW5jeTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOwotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiYmF6LnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcImZvb1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIkJhelwiICIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJxdXhcIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCi0gICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJiYXIuQmFyXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlTm90QVR5cGUpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgotICAgICIgICAgICAgICAgdHlwZV9uYW1lOlwiLkZvby5iYXJcIiB9IgotICAgICIgIGZpZWxkIHsgbmFtZTpcImJhclwiIG51bWJlcjoyIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiLkZvby5iYXJcIiBpcyBub3QgYSB0eXBlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZWxhdGl2ZUZpZWxkVHlwZU5vdEFUeXBlKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuZXN0ZWRfdHlwZSB7IgotICAgICIgICAgbmFtZTogXCJCYXJcIiIKLSAgICAiICAgIGZpZWxkIHsgbmFtZTpcIkJhelwiIG51bWJlcjoyIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgotICAgICIgIH0iCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCi0gICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJCYXIuQmF6XCIgfSIKLSAgICAifSIsCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXIuQmF6XCIgaXMgbm90IGEgdHlwZS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRUeXBlTWF5QmVJdHNOYW1lKSB7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiQmFyXCIiCi0gICAgIn0iCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiQmFyXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiQmFyXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bUZpZWxkVHlwZUlzTWVzc2FnZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9ICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfRU5VTSIKLSAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBpcyBub3QgYW4gZW51bSB0eXBlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNZXNzYWdlRmllbGRUeXBlSXNFbnVtKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTpcIkRVTU1ZXCIgbnVtYmVyOjAgfSB9ICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfTUVTU0FHRSIKLSAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJCYXJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEJhZEVudW1EZWZhdWx0VmFsdWUpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOlwiRFVNTVlcIiBudW1iZXI6MCB9IH0gIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIgotICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTpcIk5PX1NVQ0hfVkFMVUVcIiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IERFRkFVTFRfVkFMVUU6IEVudW0gdHlwZSBcIkJhclwiIGhhcyBubyB2YWx1ZSBuYW1lZCAiCi0gICAgICAiXCJOT19TVUNIX1ZBTFVFXCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1EZWZhdWx0VmFsdWVJc0ludGVnZXIpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOlwiRFVNTVlcIiBudW1iZXI6MCB9IH0gIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIgotICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTpcIjBcIiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IERFRkFVTFRfVkFMVUU6IERlZmF1bHQgdmFsdWUgZm9yIGFuIGVudW0gZmllbGQgbXVzdCAiCi0gICAgImJlIGFuIGlkZW50aWZpZXIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFByaW1pdGl2ZVdpdGhUeXBlTmFtZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb29cIiIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIiCi0gICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJGb29cIiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IEZpZWxkIHdpdGggcHJpbWl0aXZlIHR5cGUgaGFzIHR5cGVfbmFtZS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTm9uUHJpbWl0aXZlV2l0aG91dFR5cGVOYW1lKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9NRVNTQUdFIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogRmllbGQgd2l0aCBtZXNzYWdlIG9yIGVudW0gdHlwZSBtaXNzaW5nICIKLSAgICAgICJ0eXBlX25hbWUuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE9uZW9mV2l0aE5vRmllbGRzKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiYmFyXCIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBOQU1FOiBPbmVvZiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBPbmVvZkxhYmVsTWlzbWF0Y2gpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICIgIG5hbWU6IFwiRm9vXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfUkVQRUFURUQgdHlwZTpUWVBFX0lOVDMyICIKLSAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OjAgfSIKLSAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogRm9vLmZvbzogTkFNRTogRmllbGRzIG9mIG9uZW9mcyBtdXN0IHRoZW1zZWx2ZXMgaGF2ZSBsYWJlbCAiCi0gICAgICAiTEFCRUxfT1BUSU9OQUwuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIElucHV0VHlwZU5vdERlZmluZWQpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCi0gICAgInNlcnZpY2UgeyIKLSAgICAiICBuYW1lOiBcIlRlc3RTZXJ2aWNlXCIiCi0gICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJCYXJcIiBvdXRwdXRfdHlwZTogXCJGb29cIiB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IElOUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iCi0gICAgKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIElucHV0VHlwZU5vdEFNZXNzYWdlKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTpcIkRVTU1ZXCIgbnVtYmVyOjAgfSB9ICIKLSAgICAic2VydmljZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKLSAgICAiICBtZXRob2QgeyBuYW1lOiBcIkFcIiBpbnB1dF90eXBlOiBcIkJhclwiIG91dHB1dF90eXBlOiBcIkZvb1wiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQTogSU5QVVRfVFlQRTogXCJCYXJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuXG4iCi0gICAgKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE91dHB1dFR5cGVOb3REZWZpbmVkKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgotICAgICJzZXJ2aWNlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgotICAgICIgIG1ldGhvZCB7IG5hbWU6IFwiQVwiIGlucHV0X3R5cGU6IFwiRm9vXCIgb3V0cHV0X3R5cGU6IFwiQmFyXCIgfSIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBPVVRQVVRfVFlQRTogXCJCYXJcIiBpcyBub3QgZGVmaW5lZC5cbiIKLSAgICApOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgT3V0cHV0VHlwZU5vdEFNZXNzYWdlKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOiBcIkZvb1wiIH0gIgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkJhclwiIHZhbHVlIHsgbmFtZTpcIkRVTU1ZXCIgbnVtYmVyOjAgfSB9ICIKLSAgICAic2VydmljZSB7IgotICAgICIgIG5hbWU6IFwiVGVzdFNlcnZpY2VcIiIKLSAgICAiICBtZXRob2QgeyBuYW1lOiBcIkFcIiBpbnB1dF90eXBlOiBcIkZvb1wiIG91dHB1dF90eXBlOiBcIkJhclwiIH0iCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQTogT1VUUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLlxuIgotICAgICk7Ci19Ci0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIElsbGVnYWxQYWNrZWRGaWVsZCkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHtcbiIKLSAgICAiICBuYW1lOiBcIkZvb1wiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcInBhY2tlZF9zdHJpbmdcIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9SRVBFQVRFRCAiCi0gICAgIiAgICAgICAgICB0eXBlOlRZUEVfU1RSSU5HICIKLSAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IgotICAgICIgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcInBhY2tlZFwiIGlzX2V4dGVuc2lvbjogZmFsc2UgfSIKLSAgICAiICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJ0cnVlXCIgfX19XG4iCi0gICAgIiAgZmllbGQgeyBuYW1lOlwicGFja2VkX21lc3NhZ2VcIiBudW1iZXI6MyBsYWJlbDpMQUJFTF9SRVBFQVRFRCAiCi0gICAgIiAgICAgICAgICB0eXBlX25hbWU6IFwiRm9vXCIiCi0gICAgIiAgICAgICAgICBvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyIKLSAgICAiICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJwYWNrZWRcIiBpc19leHRlbnNpb246IGZhbHNlIH0iCi0gICAgIiAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwidHJ1ZVwiIH19fVxuIgotICAgICIgIGZpZWxkIHsgbmFtZTpcIm9wdGlvbmFsX2ludDMyXCIgbnVtYmVyOiA0IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgIiAgICAgICAgICB0eXBlOlRZUEVfSU5UMzIgIgotICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsiCi0gICAgIiAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwicGFja2VkXCIgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgotICAgICIgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcInRydWVcIiB9fX1cbiIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBGb28ucGFja2VkX3N0cmluZzogVFlQRTogW3BhY2tlZCA9IHRydWVdIGNhbiBvbmx5IGJlICIKLSAgICAgICAgInNwZWNpZmllZCBmb3IgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcy5cbiIKLSAgICAiZm9vLnByb3RvOiBGb28ucGFja2VkX21lc3NhZ2U6IFRZUEU6IFtwYWNrZWQgPSB0cnVlXSBjYW4gb25seSBiZSAiCi0gICAgICAgICJzcGVjaWZpZWQgZm9yIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMuXG4iCi0gICAgImZvby5wcm90bzogRm9vLm9wdGlvbmFsX2ludDMyOiBUWVBFOiBbcGFja2VkID0gdHJ1ZV0gY2FuIG9ubHkgYmUgIgotICAgICAgICAic3BlY2lmaWVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzLlxuIgotICAgICAgICApOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgT3B0aW9uV3JvbmdUeXBlKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiICIKLSAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfU1RSSU5HICIKLSAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiY3R5cGVcIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxIH0iCi0gICAgIiAgICAgICAgICB9IgotICAgICIgIH0iCi0gICAgIn1cbiIsCi0KLSAgICAiZm9vLnByb3RvOiBUZXN0TWVzc2FnZS5mb286IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBpZGVudGlmaWVyIGZvciAiCi0gICAgImVudW0tdmFsdWVkIG9wdGlvbiBcImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGVcIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgT3B0aW9uRXh0ZW5kc0F0b21pY1R5cGUpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIgIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9TVFJJTkcgIgotICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMSB9IgotICAgICIgICAgICAgICAgfSIKLSAgICAiICB9IgotICAgICJ9XG4iLAotCi0gICAgImZvby5wcm90bzogVGVzdE1lc3NhZ2UuZm9vOiBPUFRJT05fTkFNRTogT3B0aW9uIFwiY3R5cGVcIiBpcyBhbiAiCi0gICAgImF0b21pYyB0eXBlLCBub3QgYSBtZXNzYWdlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBEdXBPcHRpb24pIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIgIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9VSU5UMzIgIgotICAgICIgICAgICAgICAgb3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIkNPUkRcIiB9IgotICAgICIgICAgICAgICAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJjdHlwZVwiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0iCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcIkNPUkRcIiB9IgotICAgICIgICAgICAgICAgfSIKLSAgICAiICB9IgotICAgICJ9XG4iLAotCi0gICAgImZvby5wcm90bzogVGVzdE1lc3NhZ2UuZm9vOiBPUFRJT05fTkFNRTogT3B0aW9uIFwiY3R5cGVcIiB3YXMgIgotICAgICJhbHJlYWR5IHNldC5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZE9wdGlvbk5hbWUpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIgIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9CT09MICIKLSAgICAiICAgICAgICAgIG9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwidW5pbnRlcnByZXRlZF9vcHRpb25cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9IgotICAgICIgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxICIKLSAgICAiICAgICAgICAgICAgICAgICAgICB9IgotICAgICIgICAgICAgICAgfSIKLSAgICAiICB9IgotICAgICJ9XG4iLAotCi0gICAgImZvby5wcm90bzogVGVzdE1lc3NhZ2UuZm9vOiBPUFRJT05fTkFNRTogT3B0aW9uIG11c3Qgbm90IHVzZSAiCi0gICAgInJlc2VydmVkIG5hbWUgXCJ1bmludGVycHJldGVkX29wdGlvblwiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXBlYXRlZE1lc3NhZ2VPcHRpb24pIHsKLSAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZTogeyBuYW1lOiBcIkJhclwiIGZpZWxkOiB7ICIKLSAgICAiICBuYW1lOiBcImZvb1wiIG51bWJlcjogMSBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9JTlQzMiB9ICIKLSAgICAifSAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiYmFyXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9SRVBFQVRFRCAiCi0gICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfTUVTU0FHRSB0eXBlX25hbWU6IFwiQmFyXCIgIgotICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhclwiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgfSB9IiwKLQotICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX05BTUU6IE9wdGlvbiBmaWVsZCBcIihiYXIpXCIgaXMgYSAiCi0gICAgInJlcGVhdGVkIG1lc3NhZ2UuIFJlcGVhdGVkIG1lc3NhZ2Ugb3B0aW9ucyBtdXN0IGJlIGluaXRpYWxpemVkICIKLSAgICAidXNpbmcgYW4gYWdncmVnYXRlIHZhbHVlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNvbHZlVW5kZWZpbmVkT3B0aW9uKSB7Ci0gIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHByb2R1Y2UgYW4gZXJvciB0aGF0IGJhei5iYXIgaXMgcmVzb2x2ZWQgYnV0IG5vdAotICAvLyBkZWZpbmVkLgotICAvLyBmb28ucHJvdG86Ci0gIC8vICAgcGFja2FnZSBiYXoKLSAgLy8gICBpbXBvcnQgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KLSAgLy8gICBtZXNzYWdlIEJhciB7IG9wdGlvbmFsIGludDMyIGZvbyA9IDE7IH0KLSAgLy8gICBleHRlbmQgRmlsZU9wdGlvbnMgeyBvcHRpb25hbCBCYXIgYmFyID0gNzY3Mjc1NzsgfQotICAvLwotICAvLyBxdXgucHJvdG86Ci0gIC8vICAgcGFja2FnZSBxdXguYmF6Ci0gIC8vICAgb3B0aW9uIChiYXouYmFyKS5mb28gPSAxOwotICAvLwotICAvLyBBbHRob3VnaCAiYmF6LmJhciIgaXMgYWxyZWFkeSBkZWZpbmVkLCB0aGUgbG9va3VwIGNvZGUgd2lsbCB0cnkKLSAgLy8gInF1eC5iYXouYmFyIiwgc2luY2UgaXQncyB0aGUgbWF0Y2ggZnJvbSB0aGUgaW5uZXJtb3N0IHNjb3BlLCB3aGljaCB3aWxsCi0gIC8vIGNhdXNlIGEgc3ltYm9sIG5vdCBkZWZpbmVkIGVycm9yLgotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJwYWNrYWdlOiBcImJhelwiICIKLSAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlOiB7IG5hbWU6IFwiQmFyXCIgZmllbGQ6IHsgIgotICAgICIgIG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyIH0gIgotICAgICJ9ICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJiYXJcIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9NRVNTQUdFIHR5cGVfbmFtZTogXCJCYXJcIiAiCi0gICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcInF1eC5wcm90b1wiICIKLSAgICAicGFja2FnZTogXCJxdXguYmF6XCIgIgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhei5iYXJcIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxIH0gfSIsCi0KLSAgICAicXV4LnByb3RvOiBxdXgucHJvdG86IE9QVElPTl9OQU1FOiBPcHRpb24gXCIoYmF6LmJhcilcIiBpcyByZXNvbHZlZCB0byAiCi0gICAgIlwiKHF1eC5iYXouYmFyKVwiLCIKLSAgICAiIHdoaWNoIGlzIG5vdCBkZWZpbmVkLiBUaGUgaW5uZXJtb3N0IHNjb3BlIGlzIHNlYXJjaGVkIGZpcnN0IGluIG5hbWUgIgotICAgICJyZXNvbHV0aW9uLiBDb25zaWRlciB1c2luZyBhIGxlYWRpbmcgJy4nKGkuZS4sIFwiKC5iYXouYmFyKVwiKSB0byBzdGFydCAiCi0gICAgImZyb20gdGhlIG91dGVybW9zdCBzY29wZS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVW5rbm93bk9wdGlvbikgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcInF1eC5wcm90b1wiICIKLSAgICAicGFja2FnZTogXCJxdXguYmF6XCIgIgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImJhYXouYmFyXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMSB9IH0iLAotCi0gICAgInF1eC5wcm90bzogcXV4LnByb3RvOiBPUFRJT05fTkFNRTogT3B0aW9uIFwiKGJhYXouYmFyKVwiIHVua25vd24uXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEN1c3RvbU9wdGlvbkNvbmZsaWN0aW5nRmllbGROdW1iZXIpIHsKLSAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vMVwiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNcIiB9IgotICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvbzJcIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCIgfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28yOiBOVU1CRVI6IEV4dGVuc2lvbiBudW1iZXIgNzY3Mjc1NyBoYXMgYWxyZWFkeSBiZWVuIHVzZWQgIgotICAgICJpbiBcImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNcIiBieSBleHRlbnNpb24gXCJmb28xXCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludDMyT3B0aW9uVmFsdWVPdXRPZlBvc2l0aXZlUmFuZ2UpIHsKLSAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UMzIgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKLSAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMHg4MDAwMDAwMCB9ICIKLSAgICAifSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgb3V0IG9mIHJhbmdlICIKLSAgICAiZm9yIGludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQzMk9wdGlvblZhbHVlT3V0T2ZOZWdhdGl2ZVJhbmdlKSB7Ci0gIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCi0gICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZV9pbnRfdmFsdWU6IC0weDgwMDAwMDAxIH0gIgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBvdXQgb2YgcmFuZ2UgIgotICAgICJmb3IgaW50MzIgb3B0aW9uIFwiZm9vXCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEludDMyT3B0aW9uVmFsdWVJc05vdFBvc2l0aXZlSW50KSB7Ci0gIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCi0gICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwiNVwiIH0gfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBpbnRlZ2VyICIKLSAgICAiZm9yIGludDMyIG9wdGlvbiBcImZvb1wiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnQ2NE9wdGlvblZhbHVlT3V0T2ZSYW5nZSkgewotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQ2NCBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAweDgwMDAwMDAwMDAwMDAwMDAgfSAiCi0gICAgIn0iLAotCi0gICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG91dCBvZiByYW5nZSAiCi0gICAgImZvciBpbnQ2NCBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW50NjRPcHRpb25WYWx1ZUlzTm90UG9zaXRpdmVJbnQpIHsKLSAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfSU5UNjQgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKLSAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiNVwiIH0gfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBpbnRlZ2VyICIKLSAgICAiZm9yIGludDY0IG9wdGlvbiBcImZvb1wiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVSW50MzJPcHRpb25WYWx1ZU91dE9mUmFuZ2UpIHsKLSAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgImV4dGVuc2lvbiB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiA3NjcyNzU3IGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfVUlOVDMyIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCi0gICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDB4MTAwMDAwMDAwIH0gfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgb3V0IG9mIHJhbmdlICIKLSAgICAiZm9yIHVpbnQzMiBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVUludDMyT3B0aW9uVmFsdWVJc05vdFBvc2l0aXZlSW50KSB7Ci0gIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX1VJTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlX3ZhbHVlOiAtNS42IH0gfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBub24tbmVnYXRpdmUgaW50ZWdlciAiCi0gICAgImZvciB1aW50MzIgb3B0aW9uIFwiZm9vXCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVJbnQ2NE9wdGlvblZhbHVlSXNOb3RQb3NpdGl2ZUludCkgewotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9VSU5UNjQgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKLSAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lZ2F0aXZlX2ludF92YWx1ZTogLTUgfSB9IiwKLQotICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyICIKLSAgICAiZm9yIHVpbnQ2NCBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmxvYXRPcHRpb25WYWx1ZUlzTm90TnVtYmVyKSB7Ci0gIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0ZMT0FUIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCi0gICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU6IFwiYmFyXCIgfSB9IiwKLQotICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBWYWx1ZSBtdXN0IGJlIG51bWJlciAiCi0gICAgImZvciBmbG9hdCBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRG91YmxlT3B0aW9uVmFsdWVJc05vdE51bWJlcikgewotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9ET1VCTEUgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKLSAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ192YWx1ZTogXCJiYXJcIiB9IH0iLAotCi0gICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgbnVtYmVyICIKLSAgICAiZm9yIGRvdWJsZSBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQm9vbE9wdGlvblZhbHVlSXNOb3RUcnVlT3JGYWxzZSkgewotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9CT09MIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCi0gICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZGVudGlmaWVyX3ZhbHVlOiBcImJhclwiIH0gfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBcInRydWVcIiBvciBcImZhbHNlXCIgIgotICAgICJmb3IgYm9vbGVhbiBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU9wdGlvblZhbHVlSXNOb3RJZGVudGlmaWVyKSB7Ci0gIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW1cIiB2YWx1ZSB7IG5hbWU6IFwiQkFSXCIgbnVtYmVyOiAxIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiAyIH0gfSIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9FTlVNIHR5cGVfbmFtZTogXCJGb29FbnVtXCIgIgotICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX3ZhbHVlOiBcIlFVVVhcIiB9IH0iLAotCi0gICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fVkFMVUU6IFZhbHVlIG11c3QgYmUgaWRlbnRpZmllciBmb3IgIgotICAgICJlbnVtLXZhbHVlZCBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRW51bU9wdGlvblZhbHVlSXNOb3RFbnVtVmFsdWVOYW1lKSB7Ci0gIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW1cIiB2YWx1ZSB7IG5hbWU6IFwiQkFSXCIgbnVtYmVyOiAxIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSB7IG5hbWU6IFwiQkFaXCIgbnVtYmVyOiAyIH0gfSIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9FTlVNIHR5cGVfbmFtZTogXCJGb29FbnVtXCIgIgotICAgICIgICAgICAgICAgICBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWRlbnRpZmllcl92YWx1ZTogXCJRVVVYXCIgfSB9IiwKLQotICAgICJmb28ucHJvdG86IGZvby5wcm90bzogT1BUSU9OX1ZBTFVFOiBFbnVtIHR5cGUgXCJGb29FbnVtXCIgaGFzIG5vIHZhbHVlICIKLSAgICAibmFtZWQgXCJRVVVYXCIgZm9yIG9wdGlvbiBcImZvb1wiLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBFbnVtT3B0aW9uVmFsdWVJc1NpYmxpbmdFbnVtVmFsdWVOYW1lKSB7Ci0gIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOwotCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW0xXCIgdmFsdWUgeyBuYW1lOiBcIkJBUlwiIG51bWJlcjogMSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHsgbmFtZTogXCJCQVpcIiBudW1iZXI6IDIgfSB9IgotICAgICJlbnVtX3R5cGUgeyBuYW1lOiBcIkZvb0VudW0yXCIgdmFsdWUgeyBuYW1lOiBcIlFVWFwiIG51bWJlcjogMSB9ICIKLSAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlIHsgbmFtZTogXCJRVVVYXCIgbnVtYmVyOiAyIH0gfSIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9FTlVNIHR5cGVfbmFtZTogXCJGb29FbnVtMVwiICIKLSAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKLSAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiUVVVWFwiIH0gfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogRW51bSB0eXBlIFwiRm9vRW51bTFcIiBoYXMgbm8gdmFsdWUgIgotICAgICJuYW1lZCBcIlFVVVhcIiBmb3Igb3B0aW9uIFwiZm9vXCIuIFRoaXMgYXBwZWFycyB0byBiZSBhIHZhbHVlIGZyb20gYSAiCi0gICAgInNpYmxpbmcgdHlwZS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgU3RyaW5nT3B0aW9uVmFsdWVJc05vdFN0cmluZykgewotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9TVFJJTkcgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIKLSAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCi0gICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwiUVVVWFwiIH0gfSIsCi0KLSAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogVmFsdWUgbXVzdCBiZSBxdW90ZWQgc3RyaW5nIGZvciAiCi0gICAgInN0cmluZyBvcHRpb24gXCJmb29cIi5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRHVwbGljYXRlRXh0ZW5zaW9uRmllbGROdW1iZXIpIHsKLSAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7Ci0KLSAgQnVpbGRGaWxlKAotICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJvcHRpb24xXCIgbnVtYmVyOiAxMDAwIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9Iik7Ci0KLSAgQnVpbGRGaWxlV2l0aFdhcm5pbmdzKAotICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJvcHRpb24yXCIgbnVtYmVyOiAxMDAwIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IiwKLSAgICAgICJiYXIucHJvdG86IG9wdGlvbjI6IE5VTUJFUjogRXh0ZW5zaW9uIG51bWJlciAxMDAwIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCAiCi0gICAgICAiaW4gXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiBieSBleHRlbnNpb24gXCJvcHRpb24xXCIgZGVmaW5lZCBpbiAiCi0gICAgICAiZm9vLnByb3RvLlxuIik7Ci19Ci0KLS8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdGVzdHMgdGhhdCBjaGVjayBmb3IgYWdncmVnYXRlIHZhbHVlIHBhcnNpbmcKLS8vIGVycm9ycy4gIFRoZSAidmFsdWUiIGFyZ3VtZW50IGlzIGVtYmVkZGVkIGluc2lkZSB0aGUKLS8vICJ1bmludGVycHJldGVkX29wdGlvbiIgcG9ydGlvbiBvZiB0aGUgcmVzdWx0Lgotc3RhdGljIHN0cmluZyBFbWJlZEFnZ3JlZ2F0ZVZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7Ci0gIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJGb29cIiB9ICIKLSAgICAgICJleHRlbnNpb24geyBuYW1lOiBcImZvb1wiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICAgIiAgICAgICAgICAgIHR5cGU6IFRZUEVfTUVTU0FHRSB0eXBlX25hbWU6IFwiRm9vXCIgIgotICAgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCi0gICAgICAib3B0aW9ucyB7IHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAkMCB9IH0iLAotICAgICAgdmFsdWUpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQWdncmVnYXRlVmFsdWVOb3RGb3VuZCkgewotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgRW1iZWRBZ2dyZWdhdGVWYWx1ZSgic3RyaW5nX3ZhbHVlOiBcIlwiIiksCi0gICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogT3B0aW9uIFwiZm9vXCIgaXMgYSBtZXNzYWdlLiAiCi0gICAgICAiVG8gc2V0IHRoZSBlbnRpcmUgbWVzc2FnZSwgdXNlIHN5bnRheCBsaWtlICIKLSAgICAgICJcImZvbyA9IHsgPHByb3RvIHRleHQgZm9ybWF0PiB9XCIuIFRvIHNldCBmaWVsZHMgd2l0aGluIGl0LCB1c2UgIgotICAgICAgInN5bnRheCBsaWtlIFwiZm9vLmZvbyA9IHZhbHVlXCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFnZ3JlZ2F0ZVZhbHVlUGFyc2VFcnJvcikgewotICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgRW1iZWRBZ2dyZWdhdGVWYWx1ZSgiYWdncmVnYXRlX3ZhbHVlOiBcIjErMlwiIiksCi0gICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogRXJyb3Igd2hpbGUgcGFyc2luZyBvcHRpb24gIgotICAgICAgInZhbHVlIGZvciBcImZvb1wiOiBFeHBlY3RlZCBpZGVudGlmaWVyLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBBZ2dyZWdhdGVWYWx1ZVVua25vd25GaWVsZHMpIHsKLSAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgIEVtYmVkQWdncmVnYXRlVmFsdWUoImFnZ3JlZ2F0ZV92YWx1ZTogXCJ4OjEwMFwiIiksCi0gICAgICAiZm9vLnByb3RvOiBmb28ucHJvdG86IE9QVElPTl9WQUxVRTogRXJyb3Igd2hpbGUgcGFyc2luZyBvcHRpb24gIgotICAgICAgInZhbHVlIGZvciBcImZvb1wiOiBNZXNzYWdlIHR5cGUgXCJGb29cIiBoYXMgbm8gZmllbGQgbmFtZWQgXCJ4XCIuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE5vdExpdGVJbXBvcnRzTGl0ZSkgewotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJvcHRpb25zIHsgb3B0aW1pemVfZm9yOiBMSVRFX1JVTlRJTUUgfSAiKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiAiLAotCi0gICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPVEhFUjogRmlsZXMgdGhhdCBkbyBub3QgdXNlIG9wdGltaXplX2ZvciA9ICIKLSAgICAgICJMSVRFX1JVTlRJTUUgY2Fubm90IGltcG9ydCBmaWxlcyB3aGljaCBkbyB1c2UgdGhpcyBvcHRpb24uICBUaGlzIGZpbGUgIgotICAgICAgImlzIG5vdCBsaXRlLCBidXQgaXQgaW1wb3J0cyBcImJhci5wcm90b1wiIHdoaWNoIGlzLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBMaXRlRXh0ZW5kc05vdExpdGUpIHsKLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlOiB7IgotICAgICIgIG5hbWU6IFwiQmFyXCIiCi0gICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEgZW5kOiAxMDAwIH0iCi0gICAgIn0iKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiAiCi0gICAgIm9wdGlvbnMgeyBvcHRpbWl6ZV9mb3I6IExJVEVfUlVOVElNRSB9ICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJleHRcIiBudW1iZXI6IDEyMyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX0lOVDMyIGV4dGVuZGVlOiBcIkJhclwiIH0iLAotCi0gICAgImZvby5wcm90bzogZXh0OiBFWFRFTkRFRTogRXh0ZW5zaW9ucyB0byBub24tbGl0ZSB0eXBlcyBjYW4gb25seSBiZSAiCi0gICAgICAiZGVjbGFyZWQgaW4gbm9uLWxpdGUgZmlsZXMuICBOb3RlIHRoYXQgeW91IGNhbm5vdCBleHRlbmQgYSBub24tbGl0ZSAiCi0gICAgICAidHlwZSB0byBjb250YWluIGEgbGl0ZSB0eXBlLCBidXQgdGhlIHJldmVyc2UgaXMgYWxsb3dlZC5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTm9MaXRlU2VydmljZXMpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm9wdGlvbnMgeyIKLSAgICAiICBvcHRpbWl6ZV9mb3I6IExJVEVfUlVOVElNRSIKLSAgICAiICBjY19nZW5lcmljX3NlcnZpY2VzOiB0cnVlIgotICAgICIgIGphdmFfZ2VuZXJpY19zZXJ2aWNlczogdHJ1ZSIKLSAgICAifSAiCi0gICAgInNlcnZpY2UgeyBuYW1lOiBcIkZvb1wiIH0iLAotCi0gICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBGaWxlcyB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjYW5ub3QgIgotICAgICJkZWZpbmUgc2VydmljZXMgdW5sZXNzIHlvdSBzZXQgYm90aCBvcHRpb25zIGNjX2dlbmVyaWNfc2VydmljZXMgYW5kICIKLSAgICAiamF2YV9nZW5lcmljX3NldmljZXMgdG8gZmFsc2UuXG4iKTsKLQotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgotICAgICJvcHRpb25zIHsiCi0gICAgIiAgb3B0aW1pemVfZm9yOiBMSVRFX1JVTlRJTUUiCi0gICAgIiAgY2NfZ2VuZXJpY19zZXJ2aWNlczogZmFsc2UiCi0gICAgIiAgamF2YV9nZW5lcmljX3NlcnZpY2VzOiBmYWxzZSIKLSAgICAifSAiCi0gICAgInNlcnZpY2UgeyBuYW1lOiBcIkJhclwiIH0iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJvbGxiYWNrQWZ0ZXJFcnJvcikgewotICAvLyBCdWlsZCBhIGZpbGUgd2hpY2ggY29udGFpbnMgZXZlcnkga2luZCBvZiBjb25zdHJ1Y3QgYnV0IHJlZmVyZW5jZXMgYW4KLSAgLy8gdW5kZWZpbmVkIHR5cGUuICBBbGwgdGhlc2UgY29uc3RydWN0cyB3aWxsIGJlIGFkZGVkIHRvIHRoZSBzeW1ib2wgdGFibGUKLSAgLy8gYmVmb3JlIHRoZSB1bmRlZmluZWQgdHlwZSBlcnJvciBpcyBub3RpY2VkLiAgVGhlIERlc2NyaXB0b3JQb29sIHdpbGwgdGhlbgotICAvLyBoYXZlIHRvIHJvbGwgZXZlcnl0aGluZyBiYWNrLgotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgotICAgICJ9ICIKLSAgICAiZW51bV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0RW51bVwiIgotICAgICIgIHZhbHVlIHsgbmFtZTpcIkJBUlwiIG51bWJlcjoxIH0iCi0gICAgIn0gIgotICAgICJzZXJ2aWNlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgotICAgICIgIG1ldGhvZCB7IgotICAgICIgICAgbmFtZTogXCJCYXpcIiIKLSAgICAiICAgIGlucHV0X3R5cGU6IFwiTm9TdWNoVHlwZVwiIiAgICAvLyBlcnJvcgotICAgICIgICAgb3V0cHV0X3R5cGU6IFwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICB9IgotICAgICJ9IiwKLQotICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkJhejogSU5QVVRfVFlQRTogXCJOb1N1Y2hUeXBlXCIgaXMgbm90IGRlZmluZWQuXG4iCi0gICAgKTsKLQotICAvLyBNYWtlIHN1cmUgdGhhdCBpZiB3ZSBidWlsZCB0aGUgc2FtZSBmaWxlIGFnYWluIHdpdGggdGhlIGVycm9yIGZpeGVkLAotICAvLyBpdCB3b3Jrcy4gIElmIHRoZSBhYm92ZSByb2xsYmFjayB3YXMgaW5jb21wbGV0ZSwgdGhlbiBzb21lIHN5bWJvbHMgd2lsbAotICAvLyBiZSBsZWZ0IGRlZmluZWQsIGFuZCB0aGlzIHNlY29uZCBhdHRlbXB0IHdpbGwgZmFpbCBzaW5jZSBpdCB0cmllcyB0bwotICAvLyByZS1kZWZpbmUgdGhlIHNhbWUgc3ltYm9scy4KLSAgQnVpbGRGaWxlKAotICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgotICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSB9IgotICAgICJ9ICIKLSAgICAiZW51bV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0RW51bVwiIgotICAgICIgIHZhbHVlIHsgbmFtZTpcIkJBUlwiIG51bWJlcjoxIH0iCi0gICAgIn0gIgotICAgICJzZXJ2aWNlIHsiCi0gICAgIiAgbmFtZTogXCJUZXN0U2VydmljZVwiIgotICAgICIgIG1ldGhvZCB7IG5hbWU6XCJCYXpcIiIKLSAgICAiICAgICAgICAgICBpbnB1dF90eXBlOlwiVGVzdE1lc3NhZ2VcIiIKLSAgICAiICAgICAgICAgICBvdXRwdXRfdHlwZTpcIlRlc3RNZXNzYWdlXCIgfSIKLSAgICAifSIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRXJyb3JzUmVwb3J0ZWRUb0xvZ0Vycm9yKSB7Ci0gIC8vIFRlc3QgdGhhdCBlcnJvcnMgYXJlIHJlcG9ydGVkIHRvIEdPT0dMRV9MT0coRVJST1IpIGlmIG5vIGVycm9yIGNvbGxlY3RvciBpcwotICAvLyBwcm92aWRlZC4KLQotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiRm9vXCIgfSAiLAotICAgICZmaWxlX3Byb3RvKSk7Ci0KLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotCi0gIHsKLSAgICBTY29wZWRNZW1vcnlMb2cgbG9nOwotICAgIEVYUEVDVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSA9PSBOVUxMKTsKLSAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOwotICB9Ci0KLSAgQVNTRVJUX0VRKDIsIGVycm9ycy5zaXplKCkpOwotCi0gIEVYUEVDVF9FUSgiSW52YWxpZCBwcm90byBkZXNjcmlwdG9yIGZvciBmaWxlIFwiZm9vLnByb3RvXCI6IiwgZXJyb3JzWzBdKTsKLSAgRVhQRUNUX0VRKCIgIEZvbzogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgZXJyb3JzWzFdKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIERpc2FsbG93RW51bUFsaWFzKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJlbnVtX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkJhclwiIgotICAgICIgIHZhbHVlIHsgbmFtZTpcIkVOVU1fQVwiIG51bWJlcjowIH0iCi0gICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9CXCIgbnVtYmVyOjAgfSIKLSAgICAifSIsCi0gICAgImZvby5wcm90bzogQmFyOiBOVU1CRVI6ICIKLSAgICAiXCJFTlVNX0JcIiB1c2VzIHRoZSBzYW1lIGVudW0gdmFsdWUgYXMgXCJFTlVNX0FcIi4gIgotICAgICJJZiB0aGlzIGlzIGludGVuZGVkLCBzZXQgJ29wdGlvbiBhbGxvd19hbGlhcyA9IHRydWU7JyB0byB0aGUgZW51bSAiCi0gICAgImRlZmluaXRpb24uXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFsbG93RW51bUFsaWFzKSB7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgImVudW1fdHlwZSB7IgotICAgICIgIG5hbWU6IFwiQmFyXCIiCi0gICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9BXCIgbnVtYmVyOjAgfSIKLSAgICAiICB2YWx1ZSB7IG5hbWU6XCJFTlVNX0JcIiBudW1iZXI6MCB9IgotICAgICIgIG9wdGlvbnMgeyBhbGxvd19hbGlhczogdHJ1ZSB9IgotICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbnVzZWRJbXBvcnRXYXJuaW5nKSB7Ci0gIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiYmFyLnByb3RvIik7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOwotCi0gIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiYmFzZS5wcm90byIpOwotICBCdWlsZEZpbGUoCi0gICAgIm5hbWU6IFwiYmFzZS5wcm90b1wiICIKLSAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXNlXCIgfSIpOwotCi0gIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiYmF6LnByb3RvIik7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJiYXoucHJvdG9cIiAiCi0gICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmF6XCIgfSIpOwotCi0gIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgicHVibGljLnByb3RvIik7Ci0gIEJ1aWxkRmlsZSgKLSAgICAibmFtZTogXCJwdWJsaWMucHJvdG9cIiAiCi0gICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCi0gICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7Ci0KLSAgLy8gLy8gZm9yd2FyZC5wcm90bwotICAvLyBpbXBvcnQgImJhc2UucHJvdG8iICAgICAgIC8vIE5vIHdhcm5pbmc6IEJhc2UgbWVzc2FnZSBpcyB1c2VkLgotICAvLyBpbXBvcnQgImJhci5wcm90byIgICAgICAgIC8vIFdpbGwgbG9nIGEgd2FybmluZy4KLSAgLy8gaW1wb3J0IHB1YmxpYyAiYmF6LnByb3RvIiAvLyBObyB3YXJuaW5nOiBEbyBub3QgdHJhY2sgaW1wb3J0IHB1YmxpYy4KLSAgLy8gaW1wb3J0ICJwdWJsaWMucHJvdG8iICAgICAvLyBObyB3YXJuaW5nOiBwdWJsaWMucHJvdG8gaGFzIGltcG9ydCBwdWJsaWMuCi0gIC8vIG1lc3NhZ2UgRm9yd2FyZCB7Ci0gIC8vICAgb3B0aW9uYWwgQmFzZSBiYXNlID0gMTsKLSAgLy8gfQotICAvLwotICBwb29sXy5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoImZvcndhcmQucHJvdG8iKTsKLSAgQnVpbGRGaWxlV2l0aFdhcm5pbmdzKAotICAgICJuYW1lOiBcImZvcndhcmQucHJvdG9cIiIKLSAgICAiZGVwZW5kZW5jeTogXCJiYXNlLnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwiYmF6LnByb3RvXCIiCi0gICAgImRlcGVuZGVuY3k6IFwicHVibGljLnByb3RvXCIiCi0gICAgInB1YmxpY19kZXBlbmRlbmN5OiAyICIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogXCJGb3J3YXJkXCIiCi0gICAgIiAgZmllbGQgeyBuYW1lOlwiYmFzZVwiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhc2VcIiB9IgotICAgICJ9IiwKLSAgICAiZm9yd2FyZC5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW1wb3J0IGJhci5wcm90byBidXQgbm90IHVzZWQuXG4iKTsKLX0KLQotbmFtZXNwYWNlIHsKLXZvaWQgRmlsbFZhbGlkTWFwRW50cnkoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9wcm90bykgewotICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCi0gICAgICAibmFtZTogJ2Zvby5wcm90bycgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAgICIgIG5hbWU6ICdGb28nICIKLSAgICAgICIgIGZpZWxkIHsgIgotICAgICAgIiAgICBuYW1lOiAnZm9vX21hcCcgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX1JFUEVBVEVEICIKLSAgICAgICIgICAgdHlwZV9uYW1lOiAnRm9vTWFwRW50cnknICIKLSAgICAgICIgIH0gIgotICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCi0gICAgICAiICAgIG5hbWU6ICdGb29NYXBFbnRyeScgIgotICAgICAgIiAgICBvcHRpb25zIHsgIG1hcF9lbnRyeTogdHJ1ZSB9ICIKLSAgICAgICIgICAgZmllbGQgeyAiCi0gICAgICAiICAgICAgbmFtZTogJ2tleScgbnVtYmVyOiAxIHR5cGU6VFlQRV9JTlQzMiBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCi0gICAgICAiICAgIH0gIgotICAgICAgIiAgICBmaWVsZCB7ICIKLSAgICAgICIgICAgICBuYW1lOiAndmFsdWUnIG51bWJlcjogMiB0eXBlOlRZUEVfSU5UMzIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgotICAgICAgIiAgICB9ICIKLSAgICAgICIgIH0gIgotICAgICAgIn0gIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAgICIgIG5hbWU6ICdCYXInICIKLSAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAgfSIKLSAgICAgICJ9ICIsCi0gICAgICBmaWxlX3Byb3RvKSk7Ci19Ci1zdGF0aWMgY29uc3QgY2hhcioga01hcEVudHJ5RXJyb3JNZXNzYWdlID0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogT1RIRVI6IG1hcF9lbnRyeSBzaG91bGQgbm90IGJlIHNldCBleHBsaWNpdGx5LiAiCi0gICAgIlVzZSBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBpbnN0ZWFkLlxuIjsKLXN0YXRpYyBjb25zdCBjaGFyKiBrTWFwRW50cnlLZXlUeXBlRXJyb3JNZXNzYWdlID0KLSAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogS2V5IGluIG1hcCBmaWVsZHMgY2Fubm90IGJlIGZsb2F0L2RvdWJsZSwgIgotICAgICJieXRlcyBvciBtZXNzYWdlIHR5cGVzLlxuIjsKLQotfSAgLy8gbmFtZXNwYWNlCi0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUJhc2UpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIEJ1aWxkRmlsZShmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlFeHRlbnNpb25SYW5nZSkgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAotICAgICAgImV4dGVuc2lvbl9yYW5nZSB7ICIKLSAgICAgICIgIHN0YXJ0OiAxMCBlbmQ6IDIwICIKLSAgICAgICJ9ICIsCi0gICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUV4dGVuc2lvbikgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAotICAgICAgImV4dGVuc2lvbiB7ICIKLSAgICAgICIgIG5hbWU6ICdmb29fZXh0JyBleHRlbmRlZTogJy5CYXInIG51bWJlcjogNSIKLSAgICAgICJ9ICIsCi0gICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeU5lc3RlZFR5cGUpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKLSAgICAgICJuZXN0ZWRfdHlwZSB7ICIKLSAgICAgICIgIG5hbWU6ICdCYXInICIKLSAgICAgICJ9ICIsCi0gICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUVudW1UeXBlcykgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAotICAgICAgImVudW1fdHlwZSB7ICIKLSAgICAgICIgIG5hbWU6ICdCYXJFbnVtJyAiCi0gICAgICAiICB2YWx1ZSB7IG5hbWU6ICdCQVJfQkFSJyBudW1iZXI6MCB9ICIKLSAgICAgICJ9ICIsCi0gICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUV4dHJhRmllbGQpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKLSAgICAgICJmaWVsZCB7ICIKLSAgICAgICIgIG5hbWU6ICdvdGhlcl9maWVsZCcgIgotICAgICAgIiAgbGFiZWw6IExBQkVMX09QVElPTkFMICIKLSAgICAgICIgIHR5cGU6IFRZUEVfSU5UMzIgIgotICAgICAgIiAgbnVtYmVyOiAzICIKLSAgICAgICJ9ICIsCi0gICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeU1lc3NhZ2VOYW1lKSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOwotICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApLT5zZXRfbmFtZSgKLSAgICAgICJPdGhlck1hcEVudHJ5Iik7Ci0gIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfZmllbGQoMCktPnNldF90eXBlX25hbWUoCi0gICAgICAiT3RoZXJNYXBFbnRyeSIpOwotICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5Tm9uZVJlcGVhdGVkTWFwRW50cnkpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfZmllbGQoMCktPnNldF9sYWJlbCgKLSAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCk7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlEaWZmZXJlbnRDb250YWluaW5nVHlwZSkgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgLy8gTW92ZSB0aGUgbmVzdGVkIE1hcEVudHJ5IG1lc3NhZ2UgaW50byB0aGUgdG9wIGxldmVsLCB3aGljaCBzaG91bGQgbm90IHBhc3MKLSAgLy8gdGhlIHZhbGlkYXRpb24uCi0gIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+QWRkQWxsb2NhdGVkKAotICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLT5SZWxlYXNlTGFzdCgpKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleU5hbWUpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXkgPSBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApCi0gICAgICAtPm11dGFibGVfbmVzdGVkX3R5cGUoMCkKLSAgICAgIC0+bXV0YWJsZV9maWVsZCgwKTsKLSAga2V5LT5zZXRfbmFtZSgiS2V5Iik7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlLZXlMYWJlbCkgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKLSAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX2ZpZWxkKDApOwotICBrZXktPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQpOwotICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5S2V5TnVtYmVyKSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOwotICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCi0gICAgICAtPm11dGFibGVfZmllbGQoMCk7Ci0gIGtleS0+c2V0X251bWJlcigzKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeVZhbHVlTmFtZSkgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHZhbHVlID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCi0gICAgICAtPm11dGFibGVfZmllbGQoMSk7Ci0gIHZhbHVlLT5zZXRfbmFtZSgiVmFsdWUiKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeVZhbHVlTGFiZWwpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIEZpZWxkRGVzY3JpcHRvclByb3RvKiB2YWx1ZSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKLSAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX2ZpZWxkKDEpOwotICB2YWx1ZS0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCk7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlWYWx1ZU51bWJlcikgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHZhbHVlID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCi0gICAgICAtPm11dGFibGVfZmllbGQoMSk7Ci0gIHZhbHVlLT5zZXRfbnVtYmVyKDMpOwotICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5S2V5VHlwZUZsb2F0KSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOwotICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCi0gICAgICAtPm11dGFibGVfZmllbGQoMCk7Ci0gIGtleS0+c2V0X3R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQpOwotICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5S2V5VHlwZUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVEb3VibGUpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXkgPSBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApCi0gICAgICAtPm11dGFibGVfbmVzdGVkX3R5cGUoMCkKLSAgICAgIC0+bXV0YWJsZV9maWVsZCgwKTsKLSAga2V5LT5zZXRfdHlwZShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEUpOwotICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5S2V5VHlwZUVycm9yTWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVCeXRlcykgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKLSAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX2ZpZWxkKDApOwotICBrZXktPnNldF90eXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUtleVR5cGVFcnJvck1lc3NhZ2UpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlLZXlUeXBlRW51bSkgewotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKLSAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKLSAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX2ZpZWxkKDApOwotICBrZXktPmNsZWFyX3R5cGUoKTsKLSAga2V5LT5zZXRfdHlwZV9uYW1lKCJCYXJFbnVtIik7Ci0gIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fcHJvdG8gPSBmaWxlX3Byb3RvLmFkZF9lbnVtX3R5cGUoKTsKLSAgZW51bV9wcm90by0+c2V0X25hbWUoIkJhckVudW0iKTsKLSAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBlbnVtX3ZhbHVlX3Byb3RvID0gZW51bV9wcm90by0+YWRkX3ZhbHVlKCk7Ci0gIGVudW1fdmFsdWVfcHJvdG8tPnNldF9uYW1lKCJCQVJfVkFMVUUwIik7Ci0gIGVudW1fdmFsdWVfcHJvdG8tPnNldF9udW1iZXIoMCk7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLAotICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG86IEZvby5mb29fbWFwOiBUWVBFOiBLZXkgaW4gbWFwIGZpZWxkcyBjYW5ub3QgIgotICAgICAgICAgICAgICAgICAgICAgICJiZSBlbnVtIHR5cGVzLlxuIik7Ci0gIC8vIEVudW0ga2V5cyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zIGFzIHdlbGwuCi0gIC8vIEdldCByaWQgb2YgZXh0ZW5zaW9ucyBmb3IgcHJvdG8zIHRvIG1ha2UgaXQgcHJvdG8zIGNvbXBhdGlibGUuCi0gIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+UmVtb3ZlTGFzdCgpOwotICBmaWxlX3Byb3RvLnNldF9zeW50YXgoInByb3RvMyIpOwotICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogS2V5IGluIG1hcCBmaWVsZHMgY2Fubm90ICIKLSAgICAgICAgICAgICAgICAgICAgICAiYmUgZW51bSB0eXBlcy5cbiIpOwotfQotCi0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVNZXNzYWdlKSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOwotICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQotICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCi0gICAgICAtPm11dGFibGVfZmllbGQoMCk7Ci0gIGtleS0+Y2xlYXJfdHlwZSgpOwotICBrZXktPnNldF90eXBlX25hbWUoIi5CYXIiKTsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUtleVR5cGVFcnJvck1lc3NhZ2UpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlDb25mbGljdHNXaXRoRmllbGQpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKLSAgICAgICJmaWVsZCB7ICIKLSAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgotICAgICAgIiAgdHlwZTogVFlQRV9JTlQzMiAiCi0gICAgICAiICBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgotICAgICAgIiAgbnVtYmVyOiAxMDAgIgotICAgICAgIn0iLAotICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCi0gICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgotICAgICAgIlwiRm9vXCIuXG4iCi0gICAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogXCJGb29NYXBFbnRyeVwiIGlzIG5vdCBkZWZpbmVkLlxuIgotICAgICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSBGb29NYXBFbnRyeSBjb25mbGljdHMgIgotICAgICAgIndpdGggYW4gZXhpc3RpbmcgZmllbGQuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5Q29uZmxpY3RzV2l0aE1lc3NhZ2UpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7Ci0gIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKLSAgICAgICJuZXN0ZWRfdHlwZSB7ICIKLSAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgotICAgICAgIn0iLAotICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCi0gICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgotICAgICAgIlwiRm9vXCIuXG4iCi0gICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlIEZvb01hcEVudHJ5IGNvbmZsaWN0cyAiCi0gICAgICAid2l0aCBhbiBleGlzdGluZyBuZXN0ZWQgbWVzc2FnZSB0eXBlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUNvbmZsaWN0c1dpdGhFbnVtKSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOwotICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCi0gICAgICAiZW51bV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0Zvb01hcEVudHJ5JyAiCi0gICAgICAiICB2YWx1ZSB7IG5hbWU6ICdFTlRSWV9GT08nIG51bWJlcjogMCB9IgotICAgICAgIn0iLAotICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCi0gICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgotICAgICAgIlwiRm9vXCIuXG4iCi0gICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlIEZvb01hcEVudHJ5IGNvbmZsaWN0cyAiCi0gICAgICAid2l0aCBhbiBleGlzdGluZyBlbnVtIHR5cGUuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5Q29uZmxpY3RzV2l0aE9uZW9mKSB7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKLSAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOwotICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCi0gICAgICAib25lb2ZfZGVjbCB7ICIKLSAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgotICAgICAgIn0iCi0gICAgICAiZmllbGQgeyAiCi0gICAgICAiICBuYW1lOiAnaW50X2ZpZWxkJyAiCi0gICAgICAiICB0eXBlOiBUWVBFX0lOVDMyICIKLSAgICAgICIgIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCi0gICAgICAiICBvbmVvZl9pbmRleDogMCAiCi0gICAgICAiICBudW1iZXI6IDEwMCAiCi0gICAgICAifSAiLAotICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCi0gICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgotICAgICAgIlwiRm9vXCIuXG4iCi0gICAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogXCJGb29NYXBFbnRyeVwiIGlzIG5vdCBkZWZpbmVkLlxuIgotICAgICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSBGb29NYXBFbnRyeSBjb25mbGljdHMgIgotICAgICAgIndpdGggYW4gZXhpc3Rpbmcgb25lb2YgdHlwZS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlVc2VzTm9uZVplcm9FbnVtRGVmYXVsdFZhbHVlKSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgotICAgICJlbnVtX3R5cGUgeyIKLSAgICAiICBuYW1lOiBcIkJhclwiIgotICAgICIgIHZhbHVlIHsgbmFtZTpcIkVOVU1fQVwiIG51bWJlcjoxIH0iCi0gICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9CXCIgbnVtYmVyOjIgfSIKLSAgICAifSIKLSAgICAibWVzc2FnZV90eXBlIHsiCi0gICAgIiAgbmFtZTogJ0ZvbycgIgotICAgICIgIGZpZWxkIHsgIgotICAgICIgICAgbmFtZTogJ2Zvb19tYXAnIG51bWJlcjogMSBsYWJlbDpMQUJFTF9SRVBFQVRFRCAiCi0gICAgIiAgICB0eXBlX25hbWU6ICdGb29NYXBFbnRyeScgIgotICAgICIgIH0gIgotICAgICIgIG5lc3RlZF90eXBlIHsgIgotICAgICIgICAgbmFtZTogJ0Zvb01hcEVudHJ5JyAiCi0gICAgIiAgICBvcHRpb25zIHsgIG1hcF9lbnRyeTogdHJ1ZSB9ICIKLSAgICAiICAgIGZpZWxkIHsgIgotICAgICIgICAgICBuYW1lOiAna2V5JyBudW1iZXI6IDEgdHlwZTpUWVBFX0lOVDMyIGxhYmVsOkxBQkVMX09QVElPTkFMICIKLSAgICAiICAgIH0gIgotICAgICIgICAgZmllbGQgeyAiCi0gICAgIiAgICAgIG5hbWU6ICd2YWx1ZScgbnVtYmVyOiAyIHR5cGVfbmFtZTpcIkJhclwiIGxhYmVsOkxBQkVMX09QVElPTkFMICIKLSAgICAiICAgIH0gIgotICAgICIgIH0gIgotICAgICJ9IiwKLSAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogIgotICAgICJUWVBFOiBFbnVtIHZhbHVlIGluIG1hcCBtdXN0IGRlZmluZSAwIGFzIHRoZSBmaXJzdCB2YWx1ZS5cbiIpOwotfQotCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUHJvdG8zUmVxdWlyZWRGaWVsZHMpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0ZvbycgIgotICAgICAgIiAgZmllbGQgeyBuYW1lOidmb28nIG51bWJlcjoxIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiB9ICIKLSAgICAgICJ9IiwKLSAgICAgICJmb28ucHJvdG86IEZvby5mb286IE9USEVSOiBSZXF1aXJlZCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluICIKLSAgICAgICJwcm90bzMuXG4iKTsKLQotICAvLyBhcHBsaWVkIHRvIG5lc3RlZCB0eXBlcyBhcyB3ZWxsLgotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKLSAgICAgICJzeW50YXg6ICdwcm90bzMnICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgICAiICBuYW1lOiAnRm9vJyAiCi0gICAgICAiICBuZXN0ZWRfdHlwZSB7ICIKLSAgICAgICIgICAgbmFtZSA6ICdCYXInICIKLSAgICAgICIgICAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiB9ICIKLSAgICAgICIgIH0gIgotICAgICAgIn0iLAotICAgICAgImZvby5wcm90bzogRm9vLkJhci5iYXI6IE9USEVSOiBSZXF1aXJlZCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluICIKLSAgICAgICJwcm90bzMuXG4iKTsKLQotICAvLyBvcHRpb25hbCBhbmQgcmVwZWF0ZWQgZmllbGRzIGFyZSBPSy4KLSAgQnVpbGRGaWxlKAotICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKLSAgICAgICJzeW50YXg6ICdwcm90bzMnICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgICAiICBuYW1lOiAnRm9vJyAiCi0gICAgICAiICBmaWVsZCB7IG5hbWU6J2ZvbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIgotICAgICAgIiAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoyIGxhYmVsOkxBQkVMX1JFUEVBVEVEIHR5cGU6VFlQRV9JTlQzMiB9ICIKLSAgICAgICJ9Iik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0RlZmF1bHRWYWx1ZSkgewotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKLSAgICAgICJzeW50YXg6ICdwcm90bzMnICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgICAiICBuYW1lOiAnRm9vJyAiCi0gICAgICAiICBmaWVsZCB7IG5hbWU6J2ZvbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKLSAgICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogJzEnIH0iCi0gICAgICAifSIsCi0gICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBPVEhFUjogRXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkIGluICIKLSAgICAgICJwcm90bzMuXG4iKTsKLQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKLSAgICAgICJzeW50YXg6ICdwcm90bzMnICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgICAiICBuYW1lOiAnRm9vJyAiCi0gICAgICAiICBuZXN0ZWRfdHlwZSB7ICIKLSAgICAgICIgICAgbmFtZSA6ICdCYXInICIKLSAgICAgICIgICAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCi0gICAgICAiICAgICAgICAgICAgZGVmYXVsdF92YWx1ZTogJzEnIH0iCi0gICAgICAiICB9ICIKLSAgICAgICJ9IiwKLSAgICAgICJmb28ucHJvdG86IEZvby5CYXIuYmFyOiBPVEhFUjogRXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkICIKLSAgICAgICJpbiBwcm90bzMuXG4iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zRXh0ZW5zaW9uUmFuZ2UpIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0ZvbycgIgotICAgICAgIiAgZmllbGQgeyBuYW1lOidmb28nIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIKLSAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwIGVuZDoxMDAgfSAiCi0gICAgICAifSIsCi0gICAgICAiZm9vLnByb3RvOiBGb286IE9USEVSOiBFeHRlbnNpb24gcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiAiCi0gICAgICAicHJvdG8zLlxuIik7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0ZvbycgIgotICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCi0gICAgICAiICAgIG5hbWUgOiAnQmFyJyAiCi0gICAgICAiICAgIGZpZWxkIHsgbmFtZTonYmFyJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiCi0gICAgICAiICAgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwIGVuZDoxMDAgfSAiCi0gICAgICAiICB9ICIKLSAgICAgICJ9IiwKLSAgICAgICJmb28ucHJvdG86IEZvby5CYXI6IE9USEVSOiBFeHRlbnNpb24gcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiAiCi0gICAgICAicHJvdG8zLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM01lc3NhZ2VTZXRXaXJlRm9ybWF0KSB7Ci0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgICAibmFtZTogJ2Zvby5wcm90bycgIgotICAgICAgInN5bnRheDogJ3Byb3RvMycgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKLSAgICAgICIgIG5hbWU6ICdGb28nICIKLSAgICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9ICIKLSAgICAgICJ9IiwKLSAgICAgICJmb28ucHJvdG86IEZvbzogT1RIRVI6IE1lc3NhZ2VTZXQgaXMgbm90IHN1cHBvcnRlZCAiCi0gICAgICAiaW4gcHJvdG8zLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0VudW0pIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAiZW51bV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKLSAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19GT08nIG51bWJlcjoxIH0gIgotICAgICAgIn0iLAotICAgICAgImZvby5wcm90bzogRm9vRW51bTogT1RIRVI6IFRoZSBmaXJzdCBlbnVtIHZhbHVlIG11c3QgYmUgIgotICAgICAgInplcm8gaW4gcHJvdG8zLlxuIik7Ci0KLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0ZvbycgIgotICAgICAgIiAgZW51bV90eXBlIHsgIgotICAgICAgIiAgICBuYW1lOiAnRm9vRW51bScgIgotICAgICAgIiAgICB2YWx1ZSB7IG5hbWU6ICdGT09fRk9PJyBudW1iZXI6MSB9ICIKLSAgICAgICIgIH0gIgotICAgICAgIn0iLAotICAgICAgImZvby5wcm90bzogRm9vLkZvb0VudW06IE9USEVSOiBUaGUgZmlyc3QgZW51bSB2YWx1ZSBtdXN0IGJlICIKLSAgICAgICJ6ZXJvIGluIHByb3RvMy5cbiIpOwotCi0gIC8vIHZhbGlkIGNhc2UuCi0gIEJ1aWxkRmlsZSgKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAiZW51bV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKLSAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19GT08nIG51bWJlcjowIH0gIgotICAgICAgIn0iKTsKLX0KLQotVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zR3JvdXApIHsKLSAgQnVpbGRGaWxlV2l0aEVycm9ycygKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0ZvbycgIgotICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCi0gICAgICAiICAgIG5hbWU6ICdGb29Hcm91cCcgIgotICAgICAgIiAgfSAiCi0gICAgICAiICBmaWVsZCB7IG5hbWU6J2Zvb19ncm91cCcgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKLSAgICAgICIgICAgICAgICAgdHlwZTogVFlQRV9HUk9VUCB0eXBlX25hbWU6J0Zvb0dyb3VwJyB9ICIKLSAgICAgICJ9IiwKLSAgICAgICJmb28ucHJvdG86IEZvby5mb29fZ3JvdXA6IFRZUEU6IEdyb3VwcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMgIgotICAgICAgInN5bnRheC5cbiIpOwotfQotCi0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0VudW1Gcm9tUHJvdG8yKSB7Ci0gIC8vIERlZmluZSBhbiBlbnVtIGluIGEgcHJvdG8yIGZpbGUuCi0gIEJ1aWxkRmlsZSgKLSAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCi0gICAgICAicGFja2FnZTogJ2ZvbycgIgotICAgICAgInN5bnRheDogJ3Byb3RvMicgIgotICAgICAgImVudW1fdHlwZSB7ICIKLSAgICAgICIgIG5hbWU6ICdGb29FbnVtJyAiCi0gICAgICAiICB2YWx1ZSB7IG5hbWU6ICdERUZBVUxUX09QVElPTicgbnVtYmVyOjAgfSAiCi0gICAgICAifSIpOwotCi0gIC8vIE5vdyB0cnkgdG8gcmVmZXIgdG8gaXQuIChBbGwgdGVzdHMgaW4gdGhlIGZpeHR1cmUgdXNlIHRoZSBzYW1lIHBvb2wsIHNvIHdlCi0gIC8vIGNhbiByZWZlciB0byB0aGUgZW51bSBhYm92ZSBpbiB0aGlzIGRlZmluaXRpb24uKQotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKLSAgICAgICJkZXBlbmRlbmN5OiAnZm9vLnByb3RvJyAiCi0gICAgICAic3ludGF4OiAncHJvdG8zJyAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICAgIiAgbmFtZTogJ0ZvbycgIgotICAgICAgIiAgICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0VOVU0gIgotICAgICAgIiAgICAgICAgICAgIHR5cGVfbmFtZTogJ2Zvby5Gb29FbnVtJyB9IgotICAgICAgIn0iLAotICAgICAgImJhci5wcm90bzogRm9vLmJhcjogVFlQRTogRW51bSB0eXBlIFwiZm9vLkZvb0VudW1cIiBpcyBub3QgYSBwcm90bzMgIgotICAgICAgImVudW0sIGJ1dCBpcyB1c2VkIGluIFwiRm9vXCIgd2hpY2ggaXMgYSBwcm90bzMgbWVzc2FnZSB0eXBlLlxuIik7Ci19Ci0KLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0V4dGVuc2lvbikgewotICAvLyBWYWxpZCBmb3Igb3B0aW9ucy4KLSAgRGVzY3JpcHRvclBvb2wgcG9vbDsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICAvLyBBZGQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIi4KLSAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7Ci0gIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOwotICAvLyBBZGQgImZvby5wcm90byI6Ci0gIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7Ci0gIC8vICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgewotICAvLyAgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uMSA9IDEwMDA7Ci0gIC8vICAgfQotICBmaWxlX3Byb3RvLkNsZWFyKCk7Ci0gIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOwotICBmaWxlX3Byb3RvLnNldF9zeW50YXgoInByb3RvMyIpOwotICBmaWxlX3Byb3RvLmFkZF9kZXBlbmRlbmN5KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOwotICBBZGRFeHRlbnNpb24oJmZpbGVfcHJvdG8sICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIiwgIm9wdGlvbjEiLCAxMDAwLAotICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAotICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOwotICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKLQotICAvLyBDb3B5IGFuZCBjaGFuZ2UgdGhlIHBhY2thZ2Ugb2YgdGhlIGRlc2NyaXB0b3IucHJvdG8KLSAgQnVpbGRGaWxlKAotICAgICAgIm5hbWU6ICdnb29nbGUucHJvdG9idWYucHJvdG8nICIKLSAgICAgICJzeW50YXg6ICdwcm90bzInICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyAiCi0gICAgICAiICBuYW1lOiAnQ29udGFpbmVyJyBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCi0gICAgICAifSIpOwotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKLSAgICAgICJzeW50YXg6ICdwcm90bzMnICIKLSAgICAgICJkZXBlbmRlbmN5OiAnZ29vZ2xlLnByb3RvYnVmLnByb3RvJyAiCi0gICAgICAiZXh0ZW5zaW9uIHsgIgotICAgICAgIiAgbmFtZTogJ2JhcicgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyICIKLSAgICAgICIgIGV4dGVuZGVlOiAnQ29udGFpbmVyJyAiCi0gICAgICAifSIsCi0gICAgICAiYmFyLnByb3RvOiBiYXI6IE9USEVSOiBFeHRlbnNpb25zIGluIHByb3RvMyBhcmUgb25seSBhbGxvd2VkIGZvciAiCi0gICAgICAiZGVmaW5pbmcgb3B0aW9ucy5cbiIpOwotfQotCi0vLyBUZXN0IHRoYXQgZmllbGQgbmFtZXMgdGhhdCBtYXkgY29uZmxpY3QgaW4gSlNPTiBpcyBub3QgYWxsb3dlZCBieSBwcm90b2MuCi1URVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVmFsaWRhdGVQcm90bzNKc29uTmFtZSkgewotICAvLyBUaGUgY29tcGFyaXNvbiBpcyBjYXNlLWluc2Vuc2l0aXZlLgotICBCdWlsZEZpbGVXaXRoRXJyb3JzKAotICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKLSAgICAgICJzeW50YXg6ICdwcm90bzMnICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyIKLSAgICAgICIgIG5hbWU6ICdGb28nIgotICAgICAgIiAgZmllbGQgeyBuYW1lOiduYW1lJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTonTmFtZScgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCi0gICAgICAifSIsCi0gICAgICAiZm9vLnByb3RvOiBGb286IE9USEVSOiBUaGUgSlNPTiBjYW1jZWwtY2FzZSBuYW1lIG9mIGZpZWxkIFwiTmFtZVwiICIKLSAgICAgICJjb25mbGljdHMgd2l0aCBmaWVsZCBcIm5hbWVcIi4gVGhpcyBpcyBub3QgYWxsb3dlZCBpbiBwcm90bzMuXG4iKTsKLSAgLy8gVW5kZXJzY29yZXMgYXJlIGlnbm9yZWQuCi0gIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCi0gICAgICAibmFtZTogJ2Zvby5wcm90bycgIgotICAgICAgInN5bnRheDogJ3Byb3RvMycgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7IgotICAgICAgIiAgbmFtZTogJ0ZvbyciCi0gICAgICAiICBmaWVsZCB7IG5hbWU6J2FiJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAgICIgIGZpZWxkIHsgbmFtZTonX2FfX2JfJyBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKLSAgICAgICJ9IiwKLSAgICAgICJmb28ucHJvdG86IEZvbzogT1RIRVI6IFRoZSBKU09OIGNhbWNlbC1jYXNlIG5hbWUgb2YgZmllbGQgXCJfYV9fYl9cIiAiCi0gICAgICAiY29uZmxpY3RzIHdpdGggZmllbGQgXCJhYlwiLiBUaGlzIGlzIG5vdCBhbGxvd2VkIGluIHByb3RvMy5cbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBEZXNjcmlwdG9yRGF0YWJhc2UKLQotc3RhdGljIHZvaWQgQWRkVG9EYXRhYmFzZShTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2UqIGRhdGFiYXNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWxlX3RleHQpIHsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOwotICBkYXRhYmFzZS0+QWRkKGZpbGVfcHJvdG8pOwotfQotCi1jbGFzcyBEYXRhYmFzZUJhY2tlZFBvb2xUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgRGF0YWJhc2VCYWNrZWRQb29sVGVzdCgpIHt9Ci0KLSAgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2VfLAotICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOidGb28nIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCi0gICAgICAiZW51bV90eXBlIHsgbmFtZTonVGVzdEVudW0nIHZhbHVlIHsgbmFtZTonRFVNTVknIG51bWJlcjowIH0gfSAiCi0gICAgICAic2VydmljZSB7IG5hbWU6J1Rlc3RTZXJ2aWNlJyB9ICIpOwotICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlXywKLSAgICAgICJuYW1lOiAnYmFyLnByb3RvJyAiCi0gICAgICAiZGVwZW5kZW5jeTogJ2Zvby5wcm90bycgIgotICAgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6J0JhcicgfSAiCi0gICAgICAiZXh0ZW5zaW9uIHsgbmFtZTonZm9vX2V4dCcgZXh0ZW5kZWU6ICcuRm9vJyBudW1iZXI6NSAiCi0gICAgICAiICAgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIik7Ci0gICAgLy8gQmF6IGhhcyBhbiB1bmRlY2xhcmVkIGRlcGVuZGVuY3kgb24gRm9vLgotICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlXywKLSAgICAgICJuYW1lOiAnYmF6LnByb3RvJyAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgIgotICAgICAgIiAgbmFtZTonQmF6JyAiCi0gICAgICAiICBmaWVsZCB7IG5hbWU6J2ZvbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOidGb28nIH0gIgotICAgICAgIn0iKTsKLSAgfQotCi0gIC8vIFdlIGNhbid0IGluamVjdCBhIGZpbGUgY29udGFpbmluZyBlcnJvcnMgaW50byBhIERlc2NyaXB0b3JQb29sLCBzbyB3ZQotICAvLyBuZWVkIGFuIGFjdHVhbCBtb2NrIERlc2NyaXB0b3JEYXRhYmFzZSB0byB0ZXN0IGVycm9ycy4KLSAgY2xhc3MgRXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKLSAgIHB1YmxpYzoKLSAgICBFcnJvckRlc2NyaXB0b3JEYXRhYmFzZSgpIHt9Ci0gICAgfkVycm9yRGVzY3JpcHRvckRhdGFiYXNlKCkge30KLQotICAgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICAgICAgLy8gZXJyb3IucHJvdG8gYW5kIGVycm9yMi5wcm90byBjeWNsaWNhbGx5IGltcG9ydCBlYWNoIG90aGVyLgotICAgICAgaWYgKGZpbGVuYW1lID09ICJlcnJvci5wcm90byIpIHsKLSAgICAgICAgb3V0cHV0LT5DbGVhcigpOwotICAgICAgICBvdXRwdXQtPnNldF9uYW1lKCJlcnJvci5wcm90byIpOwotICAgICAgICBvdXRwdXQtPmFkZF9kZXBlbmRlbmN5KCJlcnJvcjIucHJvdG8iKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKGZpbGVuYW1lID09ICJlcnJvcjIucHJvdG8iKSB7Ci0gICAgICAgIG91dHB1dC0+Q2xlYXIoKTsKLSAgICAgICAgb3V0cHV0LT5zZXRfbmFtZSgiZXJyb3IyLnByb3RvIik7Ci0gICAgICAgIG91dHB1dC0+YWRkX2RlcGVuZGVuY3koImVycm9yLnByb3RvIik7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfTsKLQotICAvLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB0aGF0IGNvdW50cyBob3cgbWFueSB0aW1lcyBlYWNoIG1ldGhvZCBoYXMgYmVlbgotICAvLyBjYWxsZWQgYW5kIGZvcndhcmRzIHRvIHNvbWUgb3RoZXIgRGVzY3JpcHRvckRhdGFiYXNlLgotICBjbGFzcyBDYWxsQ291bnRpbmdEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgewotICAgcHVibGljOgotICAgIENhbGxDb3VudGluZ0RhdGFiYXNlKERlc2NyaXB0b3JEYXRhYmFzZSogd3JhcHBlZF9kYikKLSAgICAgIDogd3JhcHBlZF9kYl8od3JhcHBlZF9kYikgewotICAgICAgQ2xlYXIoKTsKLSAgICB9Ci0gICAgfkNhbGxDb3VudGluZ0RhdGFiYXNlKCkge30KLQotICAgIERlc2NyaXB0b3JEYXRhYmFzZSogd3JhcHBlZF9kYl87Ci0KLSAgICBpbnQgY2FsbF9jb3VudF87Ci0KLSAgICB2b2lkIENsZWFyKCkgewotICAgICAgY2FsbF9jb3VudF8gPSAwOwotICAgIH0KLQotICAgIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGJvb2wgRmluZEZpbGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICAgICAgKytjYWxsX2NvdW50XzsKLSAgICAgIHJldHVybiB3cmFwcGVkX2RiXy0+RmluZEZpbGVCeU5hbWUoZmlsZW5hbWUsIG91dHB1dCk7Ci0gICAgfQotICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gICAgICArK2NhbGxfY291bnRfOwotICAgICAgcmV0dXJuIHdyYXBwZWRfZGJfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woc3ltYm9sX25hbWUsIG91dHB1dCk7Ci0gICAgfQotICAgIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gICAgICArK2NhbGxfY291bnRfOwotICAgICAgcmV0dXJuIHdyYXBwZWRfZGJfLT5GaW5kRmlsZUNvbnRhaW5pbmdFeHRlbnNpb24oCi0gICAgICAgIGNvbnRhaW5pbmdfdHlwZSwgZmllbGRfbnVtYmVyLCBvdXRwdXQpOwotICAgIH0KLSAgfTsKLQotICAvLyBBIERlc2NyaXB0b3JEYXRhYmFzZSB3aGljaCBmYWxzZWx5IGFsd2F5cyByZXR1cm5zIGZvby5wcm90byB3aGVuIHNlYXJjaGluZwotICAvLyBmb3IgYW55IHN5bWJvbCBvciBleHRlbnNpb24gbnVtYmVyLiAgVGhpcyBzaG91bGRuJ3QgY2F1c2UgdGhlCi0gIC8vIERlc2NyaXB0b3JQb29sIHRvIHJlbG9hZCBmb28ucHJvdG8gaWYgaXQgaXMgYWxyZWFkeSBsb2FkZWQuCi0gIGNsYXNzIEZhbHNlUG9zaXRpdmVEYXRhYmFzZSA6IHB1YmxpYyBEZXNjcmlwdG9yRGF0YWJhc2UgewotICAgcHVibGljOgotICAgIEZhbHNlUG9zaXRpdmVEYXRhYmFzZShEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGIpCi0gICAgICA6IHdyYXBwZWRfZGJfKHdyYXBwZWRfZGIpIHt9Ci0gICAgfkZhbHNlUG9zaXRpdmVEYXRhYmFzZSgpIHt9Ci0KLSAgICBEZXNjcmlwdG9yRGF0YWJhc2UqIHdyYXBwZWRfZGJfOwotCi0gICAgLy8gaW1wbGVtZW50cyBEZXNjcmlwdG9yRGF0YWJhc2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gICAgICByZXR1cm4gd3JhcHBlZF9kYl8tPkZpbmRGaWxlQnlOYW1lKGZpbGVuYW1lLCBvdXRwdXQpOwotICAgIH0KLSAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICAgICAgcmV0dXJuIEZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCBvdXRwdXQpOwotICAgIH0KLSAgICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICAgICAgcmV0dXJuIEZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iLCBvdXRwdXQpOwotICAgIH0KLSAgfTsKLX07Ci0KLVRFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBGaW5kRmlsZUJ5TmFtZSkgewotICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKTsKLSAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZvby0+bmFtZSgpKTsKLSAgQVNTRVJUX0VRKDEsIGZvby0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoIkZvbyIsIGZvby0+bWVzc2FnZV90eXBlKDApLT5uYW1lKCkpOwotCi0gIEVYUEVDVF9FUShmb28sIHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpKTsKLQotICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJub19zdWNoX2ZpbGUucHJvdG8iKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbmN5QmVmb3JlRGVwZW5kZW50KSB7Ci0gIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOwotICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOwotICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOwotICBBU1NFUlRfVFJVRShiYXIgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOwotICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7Ci0KLSAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKLX0KLQotVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmREZXBlbmRlbnRCZWZvcmVEZXBlbmRlbmN5KSB7Ci0gIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhciA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImJhci5wcm90byIpOwotICBBU1NFUlRfVFJVRShiYXIgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgYmFyLT5uYW1lKCkpOwotICBBU1NFUlRfRVEoMSwgYmFyLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gIEFTU0VSVF9FUSgiQmFyIiwgYmFyLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOwotICBBU1NFUlRfVFJVRShmb28gIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZm9vLT5uYW1lKCkpOwotICBBU1NFUlRfRVEoMSwgZm9vLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7Ci0gIEFTU0VSVF9FUSgiRm9vIiwgZm9vLT5tZXNzYWdlX3R5cGUoMCktPm5hbWUoKSk7Ci0KLSAgQVNTRVJUX0VRKDEsIGJhci0+ZGVwZW5kZW5jeV9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKGZvbywgYmFyLT5kZXBlbmRlbmN5KDApKTsKLX0KLQotVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCkgewotICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvbyIpOwotICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGZpbGUtPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUShmaWxlLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7Ci0KLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIk5vU3VjaFN5bWJvbCIpID09IE5VTEwpOwotfQotCi1URVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZE1lc3NhZ2VUeXBlQnlOYW1lKSB7Ci0gIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7Ci0KLSAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKLSAgQVNTRVJUX1RSVUUodHlwZSAhPSBOVUxMKTsKLSAgRVhQRUNUX0VRKCJGb28iLCB0eXBlLT5uYW1lKCkpOwotICBFWFBFQ1RfRVEodHlwZS0+ZmlsZSgpLCBwb29sLkZpbmRGaWxlQnlOYW1lKCJmb28ucHJvdG8iKSk7Ci0KLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk5vU3VjaFR5cGUiKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIEZpbmRFeHRlbnNpb25CeU51bWJlcikgewotICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOwotCi0gIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKLSAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gcG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vLCA1KTsKLSAgQVNTRVJUX1RSVUUoZXh0ZW5zaW9uICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoImZvb19leHQiLCBleHRlbnNpb24tPm5hbWUoKSk7Ci0gIEVYUEVDVF9FUShleHRlbnNpb24tPmZpbGUoKSwgcG9vbC5GaW5kRmlsZUJ5TmFtZSgiYmFyLnByb3RvIikpOwotCi0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZvbywgMTIpID09IE5VTEwpOwotfQotCi1URVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRmluZEFsbEV4dGVuc2lvbnMpIHsKLSAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZGF0YWJhc2VfKTsKLQotICBjb25zdCBEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vIik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpIHsKLSAgICAvLyBSZXBlYXQgdGhlIGxvb2t1cCB0d2ljZSwgdG8gY2hlY2sgdGhhdCB3ZSBnZXQgY29uc2lzdGVudAotICAgIC8vIHJlc3VsdHMgZGVzcGl0ZSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgbG9va3VwIG11dGF0aW5nIHRoZSBwb29sLgotICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBleHRlbnNpb25zOwotICAgIHBvb2wuRmluZEFsbEV4dGVuc2lvbnMoZm9vLCAmZXh0ZW5zaW9ucyk7Ci0gICAgQVNTRVJUX0VRKDEsIGV4dGVuc2lvbnMuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoNSwgZXh0ZW5zaW9uc1swXS0+bnVtYmVyKCkpOwotICB9Ci19Ci0KLVRFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBFcnJvcldpdGhvdXRFcnJvckNvbGxlY3RvcikgewotICBFcnJvckRlc2NyaXB0b3JEYXRhYmFzZSBlcnJvcl9kYXRhYmFzZTsKLSAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZXJyb3JfZGF0YWJhc2UpOwotCi0gIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKLQotICB7Ci0gICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKLSAgICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IE5VTEwpOwotICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7Ci0gIH0KLQotICBFWFBFQ1RfRkFMU0UoZXJyb3JzLmVtcHR5KCkpOwotfQotCi1URVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRXJyb3JXaXRoRXJyb3JDb2xsZWN0b3IpIHsKLSAgRXJyb3JEZXNjcmlwdG9yRGF0YWJhc2UgZXJyb3JfZGF0YWJhc2U7Ci0gIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7Ci0gIERlc2NyaXB0b3JQb29sIHBvb2woJmVycm9yX2RhdGFiYXNlLCAmZXJyb3JfY29sbGVjdG9yKTsKLQotICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IE5VTEwpOwotICBFWFBFQ1RfRVEoCi0gICAgImVycm9yLnByb3RvOiBlcnJvci5wcm90bzogT1RIRVI6IEZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIKLSAgICAgICJlcnJvci5wcm90byAtPiBlcnJvcjIucHJvdG8gLT4gZXJyb3IucHJvdG9cbiIKLSAgICAiZXJyb3IyLnByb3RvOiBlcnJvcjIucHJvdG86IE9USEVSOiBJbXBvcnQgXCJlcnJvci5wcm90b1wiIHdhcyBub3QgIgotICAgICAgImZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iCi0gICAgImVycm9yLnByb3RvOiBlcnJvci5wcm90bzogT1RIRVI6IEltcG9ydCBcImVycm9yMi5wcm90b1wiIHdhcyBub3QgIgotICAgICAgImZvdW5kIG9yIGhhZCBlcnJvcnMuXG4iLAotICAgIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Ci19Ci0KLVRFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBVbmRlY2xhcmVkRGVwZW5kZW5jeU9uVW5idWlsdFR5cGUpIHsKLSAgLy8gQ2hlY2sgdGhhdCB3ZSBmaW5kIGFuZCByZXBvcnQgdW5kZWNsYXJlZCBkZXBlbmRlbmNpZXMgb24gdHlwZXMgdGhhdCBleGlzdAotICAvLyBpbiB0aGUgZGVzY3JpcHRvciBkYXRhYmFzZSBidXQgdGhhdCBoYXZlIG5vdCBub3QgYmVlbiBidWlsdCB5ZXQuCi0gIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7Ci0gIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXywgJmVycm9yX2NvbGxlY3Rvcik7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXoiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX0VRKAotICAgICJiYXoucHJvdG86IEJhei5mb286IFRZUEU6IFwiRm9vXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcImZvby5wcm90b1wiLCAiCi0gICAgIndoaWNoIGlzIG5vdCBpbXBvcnRlZCBieSBcImJhei5wcm90b1wiLiAgVG8gdXNlIGl0IGhlcmUsIHBsZWFzZSBhZGQgIgotICAgICJ0aGUgbmVjZXNzYXJ5IGltcG9ydC5cbiIsCi0gICAgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKLX0KLQotVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIFJvbGxiYWNrQWZ0ZXJFcnJvcikgewotICAvLyBNYWtlIHN1cmUgdGhhdCBhbGwgdHJhY2VzIG9mIGJhZCB0eXBlcyBhcmUgcmVtb3ZlZCBmcm9tIHRoZSBwb29sLiBUaGlzIHVzZWQKLSAgLy8gdG8gYmUgYi80NTI5NDM2LCBkdWUgdG8gdGhlIGZhY3QgdGhhdCBhIHN5bWJvbCByZXNvbHV0aW9uIGZhaWx1cmUgY291bGQKLSAgLy8gcG90ZW50aWFsbHkgY2F1c2UgYW5vdGhlciBmaWxlIHRvIGJlIHJlY3Vyc2l2ZWx5IGJ1aWx0LCB3aGljaCB3b3VsZCB0cmlnZ2VyCi0gIC8vIGEgY2hlY2twb2ludCBfcGFzdF8gcG9zc2libHkgaW52YWxpZCBzeW1ib2xzLgotICAvLyBCYXogaXMgZGVmaW5lZCBpbiB0aGUgZGF0YWJhc2UsIGJ1dCB0aGUgZmlsZSBpcyBpbnZhbGlkIGJlY2F1c2UgaXQgaXMKLSAgLy8gbWlzc2luZyBhIG5lY2Vzc2FyeSBpbXBvcnQuCi0gIERlc2NyaXB0b3JQb29sIHBvb2woJmRhdGFiYXNlXyk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXoiKSA9PSBOVUxMKTsKLSAgLy8gTWFrZSBzdXJlIHRoYXQgc2VhcmNoaW5nIGFnYWluIGZvciB0aGUgZmlsZSBvciB0aGUgdHlwZSBmYWlscy4KLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUJ5TmFtZSgiYmF6LnByb3RvIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJCYXoiKSA9PSBOVUxMKTsKLX0KLQotVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIFVuaXR0ZXN0UHJvdG8pIHsKLSAgLy8gVHJ5IHRvIGxvYWQgYWxsIG9mIHVuaXR0ZXN0LnByb3RvIGZyb20gYSBEZXNjcmlwdG9yRGF0YWJhc2UuICBUaGlzIHNob3VsZAotICAvLyB0aG9yb3VnaGx5IHRlc3QgYWxsIHBhdGhzIHRocm91Z2ggRGVzY3JpcHRvckJ1aWxkZXIgdG8gaW5zdXJlIHRoYXQgdGhlcmUKLSAgLy8gYXJlIG5vIGRlYWRsb2NraW5nIHByb2JsZW1zIHdoZW4gcG9vbF8tPm11dGV4XyBpcyBub24tTlVMTC4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIG9yaWdpbmFsX2ZpbGUgPQotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOwotCi0gIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgZGF0YWJhc2UoKkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKLSAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZGF0YWJhc2UpOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9mcm9tX2RhdGFiYXNlID0KLSAgICBwb29sLkZpbmRGaWxlQnlOYW1lKG9yaWdpbmFsX2ZpbGUtPm5hbWUoKSk7Ci0KLSAgQVNTRVJUX1RSVUUoZmlsZV9mcm9tX2RhdGFiYXNlICE9IE5VTEwpOwotCi0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWxfZmlsZV9wcm90bzsKLSAgb3JpZ2luYWxfZmlsZS0+Q29weVRvKCZvcmlnaW5hbF9maWxlX3Byb3RvKTsKLQotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfZnJvbV9kYXRhYmFzZV9wcm90bzsKLSAgZmlsZV9mcm9tX2RhdGFiYXNlLT5Db3B5VG8oJmZpbGVfZnJvbV9kYXRhYmFzZV9wcm90byk7Ci0KLSAgRVhQRUNUX0VRKG9yaWdpbmFsX2ZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwKLSAgICAgICAgICAgIGZpbGVfZnJvbV9kYXRhYmFzZV9wcm90by5EZWJ1Z1N0cmluZygpKTsKLQotICAvLyBBbHNvIHZlcmlmeSB0aGF0IENvcHlUbygpIGRpZCBub3Qgb21pdCBhbnkgaW5mb3JtYXRpb24uCi0gIEVYUEVDVF9FUShvcmlnaW5hbF9maWxlLT5EZWJ1Z1N0cmluZygpLAotICAgICAgICAgICAgZmlsZV9mcm9tX2RhdGFiYXNlLT5EZWJ1Z1N0cmluZygpKTsKLX0KLQotVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIERvZXNudFJldHJ5RGJVbm5lY2Vzc2FyaWx5KSB7Ci0gIC8vIFNlYXJjaGluZyBmb3IgYSBjaGlsZCBvZiBhbiBleGlzdGluZyBkZXNjcmlwdG9yIHNob3VsZCBuZXZlciBmYWxsIGJhY2sKLSAgLy8gdG8gdGhlIERlc2NyaXB0b3JEYXRhYmFzZSBldmVuIGlmIGl0IGlzbid0IGZvdW5kLCBiZWNhdXNlIHdlIGtub3cgYWxsCi0gIC8vIGNoaWxkcmVuIGFyZSBhbHJlYWR5IGxvYWRlZC4KLSAgQ2FsbENvdW50aW5nRGF0YWJhc2UgY2FsbF9jb3VudGVyKCZkYXRhYmFzZV8pOwotICBEZXNjcmlwdG9yUG9vbCBwb29sKCZjYWxsX2NvdW50ZXIpOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5GaW5kRmlsZUJ5TmFtZSgiZm9vLnByb3RvIik7Ci0gIEFTU0VSVF9UUlVFKGZpbGUgIT0gTlVMTCk7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKLSAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOwotICBjb25zdCBFbnVtRGVzY3JpcHRvciogdGVzdF9lbnVtID0gcG9vbC5GaW5kRW51bVR5cGVCeU5hbWUoIlRlc3RFbnVtIik7Ci0gIEFTU0VSVF9UUlVFKHRlc3RfZW51bSAhPSBOVUxMKTsKLSAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIHRlc3Rfc2VydmljZSA9IHBvb2wuRmluZFNlcnZpY2VCeU5hbWUoIlRlc3RTZXJ2aWNlIik7Ci0gIEFTU0VSVF9UUlVFKHRlc3Rfc2VydmljZSAhPSBOVUxMKTsKLQotICBFWFBFQ1RfTkUoMCwgY2FsbF9jb3VudGVyLmNhbGxfY291bnRfKTsKLSAgY2FsbF9jb3VudGVyLkNsZWFyKCk7Ci0KLSAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kRmllbGRCeU5hbWUoIm5vX3N1Y2hfZmllbGQiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dGVuc2lvbiIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmb28tPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJOb1N1Y2hNZXNzYWdlVHlwZSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmb28tPkZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoRW51bVR5cGUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZm9vLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHRlc3RfZW51bS0+RmluZFZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHRlc3Rfc2VydmljZS0+RmluZE1ldGhvZEJ5TmFtZSgiTm9TdWNoTWV0aG9kIikgPT0gTlVMTCk7Ci0KLSAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hNZXNzYWdlVHlwZSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmaWxlLT5GaW5kRW51bVR5cGVCeU5hbWUoIk5vU3VjaEVudW1UeXBlIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRFbnVtVmFsdWVCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZFNlcnZpY2VCeU5hbWUoIk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZmlsZS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibm9fc3VjaF9leHRlbnNpb24iKSA9PSBOVUxMKTsKLQotICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgiRm9vLm5vLnN1Y2guZmllbGQiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5ub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28uTm9TdWNoTWVzc2FnZVR5cGUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmllbGRCeU5hbWUoIkZvby5ub19zdWNoX2ZpZWxkIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZSgiRm9vLm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCJGb28uTm9TdWNoRW51bVR5cGUiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRW51bVZhbHVlQnlOYW1lKCJGb28uTk9fU1VDSF9WQUxVRSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXRob2RCeU5hbWUoIlRlc3RTZXJ2aWNlLk5vU3VjaE1ldGhvZCIpID09IE5VTEwpOwotCi0gIEVYUEVDVF9FUSgwLCBjYWxsX2NvdW50ZXIuY2FsbF9jb3VudF8pOwotfQotCi1URVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRG9lc250UmVsb2FkRmlsZXNVbmNlc2Vzc2FyaWx5KSB7Ci0gIC8vIElmIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgpIG9yIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbigpIHJldHVybiBhCi0gIC8vIGZpbGUgdGhhdCBpcyBhbHJlYWR5IGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgaXQgc2hvdWxkIG5vdCBhdHRlbXB0IHRvCi0gIC8vIHJlbG9hZCB0aGUgZmlsZS4KLSAgRmFsc2VQb3NpdGl2ZURhdGFiYXNlIGZhbHNlX3Bvc2l0aXZlX2RhdGFiYXNlKCZkYXRhYmFzZV8pOwotICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOwotICBEZXNjcmlwdG9yUG9vbCBwb29sKCZmYWxzZV9wb3NpdGl2ZV9kYXRhYmFzZSwgJmVycm9yX2NvbGxlY3Rvcik7Ci0KLSAgLy8gRmlyc3QgbWFrZSBzdXJlIGZvby5wcm90byBpcyBsb2FkZWQuCi0gIGNvbnN0IERlc2NyaXB0b3IqIGZvbyA9IHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb28iKTsKLSAgQVNTRVJUX1RSVUUoZm9vICE9IE5VTEwpOwotCi0gIC8vIFRyeSBpbmR1Y2luZyBmYWxzZSBwb3NpdGl2ZXMuCi0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hTeW1ib2wiKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZm9vLCAyMikgPT0gTlVMTCk7Ci0KLSAgLy8gTm8gZXJyb3JzIHNob3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQuICAoSWYgZm9vLnByb3RvIHdhcyBpbmNvcnJlY3RseQotICAvLyBsb2FkZWQgbXVsdGlwbGUgdGltZXMsIGVycm9ycyB3b3VsZCBoYXZlIGJlZW4gcmVwb3J0ZWQuKQotICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Ci19Ci0KLS8vIERlc2NyaXB0b3JEYXRhYmFzZSB0aGF0IGF0dGVtcHRzIHRvIGluZHVjZSBleHBvbmVudGlhbGx5LWJhZCBwZXJmb3JtYW5jZQotLy8gaW4gRGVzY3JpcHRvclBvb2wuIEZvciBldmVyeSBwb3NpdGl2ZSBOLCB0aGUgZGF0YWJhc2UgY29udGFpbnMgYSBmaWxlCi0vLyBmaWxlTi5wcm90bywgd2hpY2ggZGVmaW5lcyBhIG1lc3NhZ2UgTWVzc2FnZU4sIHdoaWNoIGNvbnRhaW5zIGZpZWxkcyBvZgotLy8gdHlwZSBNZXNzYWdlSyBmb3IgYWxsIEsgaW4gWzAsTikuIE1lc3NhZ2UwIGlzIG5vdCBkZWZpbmVkIGFueXdoZXJlCi0vLyAoZmlsZTAucHJvdG8gZXhpc3RzLCBidXQgaXMgZW1wdHkpLCBzbyBldmVyeSBvdGhlciBmaWxlIGFuZCBtZXNzYWdlIHR5cGUKLS8vIHdpbGwgZmFpbCB0byBidWlsZC4KLS8vCi0vLyBJZiB0aGUgRGVzY3JpcHRvclBvb2wgaXMgbm90IGNhcmVmdWwgdG8gbWVtb2l6ZSBlcnJvcnMsIGFuIGF0dGVtcHQgdG8KLS8vIGJ1aWxkIGEgZGVzY3JpcHRvciBmb3IgTWVzc2FnZU4gY2FuIHJlcXVpcmUgTygyXk4pIHRpbWUuCi1jbGFzcyBFeHBvbmVudGlhbEVycm9yRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKLSBwdWJsaWM6Ci0gIEV4cG9uZW50aWFsRXJyb3JEYXRhYmFzZSgpIHt9Ci0gIH5FeHBvbmVudGlhbEVycm9yRGF0YWJhc2UoKSB7fQotCi0gIC8vIGltcGxlbWVudHMgRGVzY3JpcHRvckRhdGFiYXNlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBib29sIEZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7Ci0gICAgaW50IGZpbGVfbnVtID0gLTE7Ci0gICAgRnVsbE1hdGNoKGZpbGVuYW1lLCAiZmlsZSIsICIucHJvdG8iLCAmZmlsZV9udW0pOwotICAgIGlmIChmaWxlX251bSA+IC0xKSB7Ci0gICAgICByZXR1cm4gUG9wdWxhdGVGaWxlKGZpbGVfbnVtLCBvdXRwdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGJvb2wgRmluZEZpbGVDb250YWluaW5nU3ltYm9sKGNvbnN0IHN0cmluZyYgc3ltYm9sX25hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICAgIGludCBmaWxlX251bSA9IC0xOwotICAgIEZ1bGxNYXRjaChzeW1ib2xfbmFtZSwgIk1lc3NhZ2UiLCAiIiwgJmZpbGVfbnVtKTsKLSAgICBpZiAoZmlsZV9udW0gPiAwKSB7Ci0gICAgICByZXR1cm4gUG9wdWxhdGVGaWxlKGZpbGVfbnVtLCBvdXRwdXQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gIGJvb2wgRmluZEZpbGVDb250YWluaW5nRXh0ZW5zaW9uKGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHZvaWQgRnVsbE1hdGNoKGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBiZWdpbl93aXRoLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVuZF93aXRoLAotICAgICAgICAgICAgICAgICBpbnQqIGZpbGVfbnVtKSB7Ci0gICAgaW50IGJlZ2luX3NpemUgPSBiZWdpbl93aXRoLnNpemUoKTsKLSAgICBpbnQgZW5kX3NpemUgPSBlbmRfd2l0aC5zaXplKCk7Ci0gICAgaWYgKG5hbWUuc3Vic3RyKDAsIGJlZ2luX3NpemUpICE9IGJlZ2luX3dpdGggfHwKLSAgICAgICAgbmFtZS5zdWJzdHIobmFtZS5zaXplKCktIGVuZF9zaXplLCBlbmRfc2l6ZSkgIT0gZW5kX3dpdGgpIHsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgc2FmZV9zdHJ0bzMyKG5hbWUuc3Vic3RyKGJlZ2luX3NpemUsIG5hbWUuc2l6ZSgpIC0gZW5kX3NpemUgLSBiZWdpbl9zaXplKSwKLSAgICAgICAgICAgICAgICAgZmlsZV9udW0pOwotICB9Ci0KLSAgYm9vbCBQb3B1bGF0ZUZpbGUoaW50IGZpbGVfbnVtLCBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKLSAgICB1c2luZyBzdHJpbmdzOjpTdWJzdGl0dXRlOwotICAgIEdPT0dMRV9DSEVDS19HRShmaWxlX251bSwgMCk7Ci0gICAgb3V0cHV0LT5DbGVhcigpOwotICAgIG91dHB1dC0+c2V0X25hbWUoU3Vic3RpdHV0ZSgiZmlsZSQwLnByb3RvIiwgZmlsZV9udW0pKTsKLSAgICAvLyBmaWxlMC5wcm90byBkb2Vzbid0IGRlZmluZSBNZXNzYWdlMAotICAgIGlmIChmaWxlX251bSA+IDApIHsKLSAgICAgIERlc2NyaXB0b3JQcm90byogbWVzc2FnZSA9IG91dHB1dC0+YWRkX21lc3NhZ2VfdHlwZSgpOwotICAgICAgbWVzc2FnZS0+c2V0X25hbWUoU3Vic3RpdHV0ZSgiTWVzc2FnZSQwIiwgZmlsZV9udW0pKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9udW07ICsraSkgewotICAgICAgICBvdXRwdXQtPmFkZF9kZXBlbmRlbmN5KFN1YnN0aXR1dGUoImZpbGUkMC5wcm90byIsIGkpKTsKLSAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkID0gbWVzc2FnZS0+YWRkX2ZpZWxkKCk7Ci0gICAgICAgIGZpZWxkLT5zZXRfbmFtZShTdWJzdGl0dXRlKCJmaWVsZCQwIiwgaSkpOwotICAgICAgICBmaWVsZC0+c2V0X251bWJlcihpKTsKLSAgICAgICAgZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwpOwotICAgICAgICBmaWVsZC0+c2V0X3R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfTUVTU0FHRSk7Ci0gICAgICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKFN1YnN0aXR1dGUoIk1lc3NhZ2UkMCIsIGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX07Ci0KLVRFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBEb2VzbnRSZWxvYWRLbm93bkJhZEZpbGVzKSB7Ci0gIEV4cG9uZW50aWFsRXJyb3JEYXRhYmFzZSBlcnJvcl9kYXRhYmFzZTsKLSAgRGVzY3JpcHRvclBvb2wgcG9vbCgmZXJyb3JfZGF0YWJhc2UpOwotCi0gIEdPT0dMRV9MT0coSU5GTykgPDwgIkEgdGltZW91dCBpbiB0aGlzIHRlc3QgcHJvYmFibHkgaW5kaWNhdGVzIGEgcmVhbCBidWcuIjsKLQotICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJmaWxlNDAucHJvdG8iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIk1lc3NhZ2U0MCIpID09IE5VTEwpOwotfQotCi1URVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRG9lc250RmFsbGJhY2tPbldyb25nVHlwZSkgewotICAvLyBJZiBhIGxvb2t1cCBmaW5kcyBhIHN5bWJvbCBvZiB0aGUgd3JvbmcgdHlwZSAoZS5nLiB3ZSBwYXNzIGEgdHlwZSBuYW1lCi0gIC8vIHRvIEZpbmRGaWVsZEJ5TmFtZSgpKSwgd2Ugc2hvdWxkIGZhaWwgZmFzdCwgd2l0aG91dCBjaGVja2luZyB0aGUgZmFsbGJhY2sKLSAgLy8gZGF0YWJhc2UuCi0gIENhbGxDb3VudGluZ0RhdGFiYXNlIGNhbGxfY291bnRlcigmZGF0YWJhc2VfKTsKLSAgRGVzY3JpcHRvclBvb2wgcG9vbCgmY2FsbF9jb3VudGVyKTsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuRmluZEZpbGVCeU5hbWUoImZvby5wcm90byIpOwotICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOwotICBjb25zdCBEZXNjcmlwdG9yKiBmb28gPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vIik7Ci0gIEFTU0VSVF9UUlVFKGZvbyAhPSBOVUxMKTsKLSAgY29uc3QgRW51bURlc2NyaXB0b3IqIHRlc3RfZW51bSA9IHBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCJUZXN0RW51bSIpOwotICBBU1NFUlRfVFJVRSh0ZXN0X2VudW0gIT0gTlVMTCk7Ci0KLSAgRVhQRUNUX05FKDAsIGNhbGxfY291bnRlci5jYWxsX2NvdW50Xyk7Ci0gIGNhbGxfY291bnRlci5DbGVhcigpOwotCi0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJUZXN0RW51bSIpID09IE5VTEwpOwotICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWVsZEJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZEV4dGVuc2lvbkJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZEVudW1UeXBlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRW51bVZhbHVlQnlOYW1lKCJGb28iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kU2VydmljZUJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1ldGhvZEJ5TmFtZSgiRm9vIikgPT0gTlVMTCk7Ci0KLSAgRVhQRUNUX0VRKDAsIGNhbGxfY291bnRlci5jYWxsX2NvdW50Xyk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgQWJvcnRpbmdFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IgewotIHB1YmxpYzoKLSAgQWJvcnRpbmdFcnJvckNvbGxlY3RvcigpIHt9Ci0KLSAgdmlydHVhbCB2b2lkIEFkZEVycm9yKAotICAgICAgY29uc3Qgc3RyaW5nICZmaWxlbmFtZSwKLSAgICAgIGNvbnN0IHN0cmluZyAmZWxlbWVudF9uYW1lLAotICAgICAgY29uc3QgTWVzc2FnZSAqbWVzc2FnZSwKLSAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCi0gICAgICBjb25zdCBzdHJpbmcgJmVycm9yX21lc3NhZ2UpIHsKLSAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQWRkRXJyb3IoKSBjYWxsZWQgdW5leHBlY3RlZGx5OiAiIDw8IGZpbGVuYW1lIDw8ICIgWyIKLSAgICAgICAgICAgICAgIDw8IGVsZW1lbnRfbmFtZSA8PCAiXTogIiA8PCBlcnJvcl9tZXNzYWdlOwotICB9Ci0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFib3J0aW5nRXJyb3JDb2xsZWN0b3IpOwotfTsKLQotLy8gQSBzb3VyY2UgdHJlZSBjb250YWluaW5nIG9ubHkgb25lIGZpbGUuCi1jbGFzcyBTaW5nbGV0b25Tb3VyY2VUcmVlIDogcHVibGljIGNvbXBpbGVyOjpTb3VyY2VUcmVlIHsKLSBwdWJsaWM6Ci0gIFNpbmdsZXRvblNvdXJjZVRyZWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBjb250ZW50cykKLSAgICAgIDogZmlsZW5hbWVfKGZpbGVuYW1lKSwgY29udGVudHNfKGNvbnRlbnRzKSB7fQotCi0gIHZpcnR1YWwgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICAgIHJldHVybiBmaWxlbmFtZSA9PSBmaWxlbmFtZV8gPwotICAgICAgICBuZXcgaW86OkFycmF5SW5wdXRTdHJlYW0oY29udGVudHNfLmRhdGEoKSwgY29udGVudHNfLnNpemUoKSkgOiBOVUxMOwotICB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBzdHJpbmcgZmlsZW5hbWVfOwotICBjb25zdCBzdHJpbmcgY29udGVudHNfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTaW5nbGV0b25Tb3VyY2VUcmVlKTsKLX07Ci0KLWNvbnN0IGNoYXIgKmNvbnN0IGtTb3VyY2VMb2NhdGlvblRlc3RJbnB1dCA9Ci0gICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAibWVzc2FnZSBBIHtcbiIKLSAgIiAgb3B0aW9uYWwgaW50MzIgYSA9IDE7XG4iCi0gICIgIG1lc3NhZ2UgQiB7XG4iCi0gICIgICAgcmVxdWlyZWQgZG91YmxlIGIgPSAxO1xuIgotICAiICB9XG4iCi0gICJ9XG4iCi0gICJlbnVtIEluZGVjaXNpb24ge1xuIgotICAiICBZRVMgICA9IDE7XG4iCi0gICIgIE5PICAgID0gMjtcbiIKLSAgIiAgTUFZQkUgPSAzO1xuIgotICAifVxuIgotICAic2VydmljZSBTIHtcbiIKLSAgIiAgcnBjIE1ldGhvZChBKSByZXR1cm5zIChBLkIpO1xuIgotICAvLyBQdXQgYW4gZW1wdHkgbGluZSBoZXJlIHRvIG1ha2UgdGhlIHNvdXJjZSBsb2NhdGlvbiByYW5nZSBtYXRjaC4KLSAgIlxuIgotICAifVxuIgotICAibWVzc2FnZSBNZXNzYWdlV2l0aEV4dGVuc2lvbnMge1xuIgotICAiICBleHRlbnNpb25zIDEwMDAgdG8gbWF4O1xuIgotICAifVxuIgotICAiZXh0ZW5kIE1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyB7XG4iCi0gICIgIG9wdGlvbmFsIGludDMyIGludDMyX2V4dGVuc2lvbiA9IDEwMDE7XG4iCi0gICJ9XG4iCi0gICJtZXNzYWdlIEMge1xuIgotICAiICBleHRlbmQgTWVzc2FnZVdpdGhFeHRlbnNpb25zIHtcbiIKLSAgIiAgICBvcHRpb25hbCBDIG1lc3NhZ2VfZXh0ZW5zaW9uID0gMTAwMjtcbiIKLSAgIiAgfVxuIgotICAifVxuIjsKLQotY2xhc3MgU291cmNlTG9jYXRpb25UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgU291cmNlTG9jYXRpb25UZXN0KCkKLSAgICAgIDogc291cmNlX3RyZWVfKCIvdGVzdC90ZXN0LnByb3RvIiwga1NvdXJjZUxvY2F0aW9uVGVzdElucHV0KSwKLSAgICAgICAgZGJfKCZzb3VyY2VfdHJlZV8pLAotICAgICAgICBwb29sXygmZGJfLCAmY29sbGVjdG9yXykge30KLQotICBzdGF0aWMgc3RyaW5nIFByaW50U291cmNlTG9jYXRpb24oY29uc3QgU291cmNlTG9jYXRpb24gJmxvYykgewotICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKCIkMDokMS0kMjokMyIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGxvYy5zdGFydF9saW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBsb2Muc3RhcnRfY29sdW1uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgKyBsb2MuZW5kX2xpbmUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGxvYy5lbmRfY29sdW1uKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQWJvcnRpbmdFcnJvckNvbGxlY3RvciBjb2xsZWN0b3JfOwotICBTaW5nbGV0b25Tb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKLSAgY29tcGlsZXI6OlNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgZGJfOwotCi0gcHJvdGVjdGVkOgotICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKLX07Ci0KLS8vIFRPRE8oYWRvbm92YW4pOiBpbXBsZW1lbnQgc3VwcG9ydCBmb3Igb3B0aW9uIGZpZWxkcyBhbmQgZm9yCi0vLyBzdWJwYXJ0cyBvZiBkZWNsYXJhdGlvbnMuCi0KLVRFU1RfRihTb3VyY2VMb2NhdGlvblRlc3QsIEdldFNvdXJjZUxvY2F0aW9uKSB7Ci0gIFNvdXJjZUxvY2F0aW9uIGxvYzsKLQotICBjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZV9kZXNjID0KLSAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOwotCi0gIGNvbnN0IERlc2NyaXB0b3IgKmFfZGVzYyA9IGZpbGVfZGVzYy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJBIik7Ci0gIEVYUEVDVF9UUlVFKGFfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOwotICBFWFBFQ1RfRVEoIjI6MS03OjIiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOwotCi0gIGNvbnN0IERlc2NyaXB0b3IgKmFfYl9kZXNjID0gYV9kZXNjLT5GaW5kTmVzdGVkVHlwZUJ5TmFtZSgiQiIpOwotICBFWFBFQ1RfVFJVRShhX2JfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOwotICBFWFBFQ1RfRVEoIjQ6My02OjQiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOwotCi0gIGNvbnN0IEVudW1EZXNjcmlwdG9yICplX2Rlc2MgPSBmaWxlX2Rlc2MtPkZpbmRFbnVtVHlwZUJ5TmFtZSgiSW5kZWNpc2lvbiIpOwotICBFWFBFQ1RfVFJVRShlX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKLSAgRVhQRUNUX0VRKCI4OjEtMTI6MiIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7Ci0KLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciAqeWVzX2Rlc2MgPSBlX2Rlc2MtPkZpbmRWYWx1ZUJ5TmFtZSgiWUVTIik7Ci0gIEVYUEVDVF9UUlVFKHllc19kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7Ci0gIEVYUEVDVF9FUSgiOTozLTk6MTMiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOwotCi0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yICpzX2Rlc2MgPSBmaWxlX2Rlc2MtPkZpbmRTZXJ2aWNlQnlOYW1lKCJTIik7Ci0gIEVYUEVDVF9UUlVFKHNfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOwotICBFWFBFQ1RfRVEoIjEzOjEtMTY6MiIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7Ci0KLSAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciAqbV9kZXNjID0gc19kZXNjLT5GaW5kTWV0aG9kQnlOYW1lKCJNZXRob2QiKTsKLSAgRVhQRUNUX1RSVUUobV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7Ci0gIEVYUEVDVF9FUSgiMTQ6My0xNDozMSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7Ci0KLX0KLQotVEVTVF9GKFNvdXJjZUxvY2F0aW9uVGVzdCwgRXh0ZW5zaW9uU291cmNlTG9jYXRpb24pIHsKLSAgU291cmNlTG9jYXRpb24gbG9jOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlX2Rlc2MgPQotICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yICppbnQzMl9leHRlbnNpb25fZGVzYyA9Ci0gICAgICBmaWxlX2Rlc2MtPkZpbmRFeHRlbnNpb25CeU5hbWUoImludDMyX2V4dGVuc2lvbiIpOwotICBFWFBFQ1RfVFJVRShpbnQzMl9leHRlbnNpb25fZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOwotICBFWFBFQ1RfRVEoIjIxOjMtMjE6NDEiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOwotCi0gIGNvbnN0IERlc2NyaXB0b3IgKmNfZGVzYyA9IGZpbGVfZGVzYy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJDIik7Ci0gIEVYUEVDVF9UUlVFKGNfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOwotICBFWFBFQ1RfRVEoIjIzOjEtMjc6MiIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yICptZXNzYWdlX2V4dGVuc2lvbl9kZXNjID0KLSAgICAgIGNfZGVzYy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgibWVzc2FnZV9leHRlbnNpb24iKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZV9leHRlbnNpb25fZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOwotICBFWFBFQ1RfRVEoIjI1OjUtMjU6NDEiLCBQcmludFNvdXJjZUxvY2F0aW9uKGxvYykpOwotfQotCi0vLyBNaXNzaW5nIFNvdXJjZUNvZGVJbmZvIGRvZXNuJ3QgY2F1c2UgY3Jhc2g6Ci1URVNUX0YoU291cmNlTG9jYXRpb25UZXN0LCBHZXRTb3VyY2VMb2NhdGlvbl9NaXNzaW5nU291cmNlQ29kZUluZm8pIHsKLSAgU291cmNlTG9jYXRpb24gbG9jOwotCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlX2Rlc2MgPQotICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7Ci0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgZmlsZV9kZXNjLT5Db3B5VG8oJnByb3RvKTsgIC8vIE5vdGUsIHRoaXMgZGlzY2FyZHMgdGhlIFNvdXJjZUNvZGVJbmZvLgotICBFWFBFQ1RfRkFMU0UocHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Ci0KLSAgRGVzY3JpcHRvclBvb2wgYmFkMV9wb29sKCZwb29sXyk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYWQxX2ZpbGVfZGVzYyA9Ci0gICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChiYWQxX3Bvb2wuQnVpbGRGaWxlKHByb3RvKSk7Ci0gIGNvbnN0IERlc2NyaXB0b3IgKmJhZDFfYV9kZXNjID0gYmFkMV9maWxlX2Rlc2MtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQSIpOwotICBFWFBFQ1RfRkFMU0UoYmFkMV9hX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKLX0KLQotLy8gQ29ycnVwdCBTb3VyY2VDb2RlSW5mbyBkb2Vzbid0IGNhdXNlIGNyYXNoOgotVEVTVF9GKFNvdXJjZUxvY2F0aW9uVGVzdCwgR2V0U291cmNlTG9jYXRpb25fQm9ndXNTb3VyY2VDb2RlSW5mbykgewotICBTb3VyY2VMb2NhdGlvbiBsb2M7Ci0KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGVfZGVzYyA9Ci0gICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKLQotICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOwotICBmaWxlX2Rlc2MtPkNvcHlUbygmcHJvdG8pOyAgLy8gTm90ZSwgdGhpcyBkaXNjYXJkcyB0aGUgU291cmNlQ29kZUluZm8uCi0gIEVYUEVDVF9GQUxTRShwcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKLSAgU291cmNlQ29kZUluZm9fTG9jYXRpb24gKmxvY19tc2cgPQotICAgICAgcHJvdG8ubXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCktPmFkZF9sb2NhdGlvbigpOwotICBsb2NfbXNnLT5hZGRfcGF0aCgxKTsKLSAgbG9jX21zZy0+YWRkX3BhdGgoMik7Ci0gIGxvY19tc2ctPmFkZF9wYXRoKDMpOwotICBsb2NfbXNnLT5hZGRfc3Bhbig0KTsKLSAgbG9jX21zZy0+YWRkX3NwYW4oNSk7Ci0gIGxvY19tc2ctPmFkZF9zcGFuKDYpOwotCi0gIERlc2NyaXB0b3JQb29sIGJhZDJfcG9vbCgmcG9vbF8pOwotICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmFkMl9maWxlX2Rlc2MgPQotICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwoYmFkMl9wb29sLkJ1aWxkRmlsZShwcm90bykpOwotICBjb25zdCBEZXNjcmlwdG9yICpiYWQyX2FfZGVzYyA9IGJhZDJfZmlsZV9kZXNjLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkEiKTsKLSAgRVhQRUNUX0ZBTFNFKGJhZDJfYV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY29uc3QgY2hhciogY29uc3Qga0NvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdElucHV0ID0KLSAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICJtZXNzYWdlIEZvbyB7fVxuIjsKLQotLy8gUmVxdWlyZWQgc2luY2Ugc291cmNlIGNvZGUgaW5mb3JtYXRpb24gaXMgbm90IHByZXNlcnZlZCBieQotLy8gRmlsZURlc2NyaXB0b3JUZXN0LgotY2xhc3MgQ29weVNvdXJjZUNvZGVJbmZvVG9UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgQ29weVNvdXJjZUNvZGVJbmZvVG9UZXN0KCkKLSAgICAgIDogc291cmNlX3RyZWVfKCIvdGVzdC90ZXN0LnByb3RvIiwga0NvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdElucHV0KSwKLSAgICAgICAgZGJfKCZzb3VyY2VfdHJlZV8pLAotICAgICAgICBwb29sXygmZGJfLCAmY29sbGVjdG9yXykge30KLQotIHByaXZhdGU6Ci0gIEFib3J0aW5nRXJyb3JDb2xsZWN0b3IgY29sbGVjdG9yXzsKLSAgU2luZ2xldG9uU291cmNlVHJlZSBzb3VyY2VfdHJlZV87Ci0gIGNvbXBpbGVyOjpTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIGRiXzsKLQotIHByb3RlY3RlZDoKLSAgRGVzY3JpcHRvclBvb2wgcG9vbF87Ci19OwotCi1URVNUX0YoQ29weVNvdXJjZUNvZGVJbmZvVG9UZXN0LCBDb3B5VG9fRG9lc05vdENvcHlTb3VyY2VDb2RlSW5mbykgewotICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjID0KLSAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOwotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfZGVzY19wcm90bzsKLSAgQVNTRVJUX0ZBTFNFKGZpbGVfZGVzY19wcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKLQotICBmaWxlX2Rlc2MtPkNvcHlUbygmZmlsZV9kZXNjX3Byb3RvKTsKLSAgRVhQRUNUX0ZBTFNFKGZpbGVfZGVzY19wcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKLX0KLQotVEVTVF9GKENvcHlTb3VyY2VDb2RlSW5mb1RvVGVzdCwgQ29weVNvdXJjZUNvZGVJbmZvVG8pIHsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfZGVzYyA9Ci0gICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKLSAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX2Rlc2NfcHJvdG87Ci0gIEFTU0VSVF9GQUxTRShmaWxlX2Rlc2NfcHJvdG8uaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Ci0KLSAgZmlsZV9kZXNjLT5Db3B5U291cmNlQ29kZUluZm9UbygmZmlsZV9kZXNjX3Byb3RvKTsKLSAgY29uc3QgU291cmNlQ29kZUluZm8mIGluZm8gPSBmaWxlX2Rlc2NfcHJvdG8uc291cmNlX2NvZGVfaW5mbygpOwotICBBU1NFUlRfRVEoNCwgaW5mby5sb2NhdGlvbl9zaXplKCkpOwotICAvLyBHZXQgdGhlIEZvbyBtZXNzYWdlIGxvY2F0aW9uCi0gIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmb29fbG9jYXRpb24gPSBpbmZvLmxvY2F0aW9uKDIpOwotICBBU1NFUlRfRVEoMiwgZm9vX2xvY2F0aW9uLnBhdGhfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyLCBmb29fbG9jYXRpb24ucGF0aCgwKSk7Ci0gIEVYUEVDVF9FUSgwLCBmb29fbG9jYXRpb24ucGF0aCgxKSk7ICAgICAgLy8gRm9vIGlzIHRoZSBmaXJzdCBtZXNzYWdlIGRlZmluZWQKLSAgQVNTRVJUX0VRKDMsIGZvb19sb2NhdGlvbi5zcGFuX3NpemUoKSk7ICAvLyBGb28gc3BhbnMgb25lIGxpbmUKLSAgRVhQRUNUX0VRKDEsIGZvb19sb2NhdGlvbi5zcGFuKDApKTsgICAgICAvLyBGb28gaXMgZGVjbGFyZWQgb24gbGluZSAxCi0gIEVYUEVDVF9FUSgwLCBmb29fbG9jYXRpb24uc3BhbigxKSk7ICAgICAgLy8gRm9vIHN0YXJ0cyBhdCBjb2x1bW4gMAotICBFWFBFQ1RfRVEoMTQsIGZvb19sb2NhdGlvbi5zcGFuKDIpKTsgICAgIC8vIEZvbyBlbmRzIG9uIGNvbHVtbiAxNAotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotfSAgLy8gbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWU4M2JkMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDg3NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gRHluYW1pY01lc3NhZ2UgaXMgaW1wbGVtZW50ZWQgYnkgY29uc3RydWN0aW5nIGEgZGF0YSBzdHJ1Y3R1cmUgd2hpY2gKLS8vIGhhcyByb3VnaGx5IHRoZSBzYW1lIG1lbW9yeSBsYXlvdXQgYXMgYSBnZW5lcmF0ZWQgbWVzc2FnZSB3b3VsZCBoYXZlLgotLy8gVGhlbiwgd2UgdXNlIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIHRvIGltcGxlbWVudCBvdXIgcmVmbGVjdGlvbgotLy8gaW50ZXJmYWNlLiAgQWxsIHRoZSBvdGhlciBvcGVyYXRpb25zIHdlIG5lZWQgdG8gaW1wbGVtZW50IChlLmcuCi0vLyBwYXJzaW5nLCBjb3B5aW5nLCBldGMuKSBhcmUgYWxyZWFkeSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZgotLy8gUmVmbGVjdGlvbiwgc28gdGhlIHJlc3QgaXMgZWFzeS4KLS8vCi0vLyBUaGUgdXAgc2lkZSBvZiB0aGlzIHN0cmF0ZWd5IGlzIHRoYXQgaXQncyB2ZXJ5IGVmZmljaWVudC4gIFdlIGRvbid0Ci0vLyBuZWVkIHRvIHVzZSBoYXNoX21hcHMgb3IgZ2VuZXJpYyByZXByZXNlbnRhdGlvbnMgb2YgZmllbGRzLiAgVGhlCi0vLyBkb3duIHNpZGUgaXMgdGhhdCB0aGlzIGlzIGEgbG93LWxldmVsIG1lbW9yeSBtYW5hZ2VtZW50IGhhY2sgd2hpY2gKLS8vIGNhbiBiZSB0cmlja3kgdG8gZ2V0IHJpZ2h0LgotLy8KLS8vIEFzIG1lbnRpb25lZCBpbiB0aGUgaGVhZGVyLCB3ZSBvbmx5IGV4cG9zZSBhIER5bmFtaWNNZXNzYWdlRmFjdG9yeQotLy8gcHVibGljbHksIG5vdCB0aGUgRHluYW1pY01lc3NhZ2UgY2xhc3MgaXRzZWxmLiAgVGhpcyBpcyBiZWNhdXNlCi0vLyBHZW5lcmljTWVzc2FnZVJlZmxlY3Rpb24gd2FudHMgdG8gaGF2ZSBhIHBvaW50ZXIgdG8gYSAiZGVmYXVsdCIKLS8vIGNvcHkgb2YgdGhlIGNsYXNzLCB3aXRoIGFsbCBmaWVsZHMgaW5pdGlhbGl6ZWQgdG8gdGhlaXIgZGVmYXVsdAotLy8gdmFsdWVzLiAgV2Ugb25seSB3YW50IHRvIGNvbnN0cnVjdCBvbmUgb2YgdGhlc2UgcGVyIG1lc3NhZ2UgdHlwZSwKLS8vIHNvIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBzdG9yZXMgYSBjYWNoZSBvZiBkZWZhdWx0IG1lc3NhZ2VzIGZvcgotLy8gZWFjaCB0eXBlIGl0IHNlZXMgKGVhY2ggdW5pcXVlIERlc2NyaXB0b3IgcG9pbnRlcikuICBUaGUgY29kZQotLy8gcmVmZXJzIHRvIHRoZSAiZGVmYXVsdCIgY29weSBvZiB0aGUgY2xhc3MgYXMgdGhlICJwcm90b3R5cGUiLgotLy8KLS8vIE5vdGUgb24gbWVtb3J5IGFsbG9jYXRpb246ICBUaGlzIG1vZHVsZSBvZnRlbiBjYWxscyAib3BlcmF0b3IgbmV3KCkiCi0vLyB0byBhbGxvY2F0ZSB1bnR5cGVkIG1lbW9yeSwgcmF0aGVyIHRoYW4gY2FsbGluZyBzb21ldGhpbmcgbGlrZQotLy8gIm5ldyB1aW50OFtdIi4gIFRoaXMgaXMgYmVjYXVzZSAib3BlcmF0b3IgbmV3KCkiIG1lYW5zICJHaXZlIG1lIHNvbWUKLS8vIHNwYWNlIHdoaWNoIEkgY2FuIHVzZSBhcyBJIHBsZWFzZS4iIHdoaWxlICJuZXcgdWludDhbXSIgbWVhbnMgIkdpdmUKLS8vIG1lIGFuIGFycmF5IG9mIDgtYml0IGludGVnZXJzLiIuICBJbiBwcmFjdGljZSwgdGhlIGxhdGVyIG1heSByZXR1cm4KLS8vIGEgcG9pbnRlciB0aGF0IGlzIG5vdCBhbGlnbmVkIGNvcnJlY3RseSBmb3IgZ2VuZXJhbCB1c2UuICBJIGJlbGlldmUKLS8vIEl0ZW0gOCBvZiAiTW9yZSBFZmZlY3RpdmUgQysrIiBkaXNjdXNzZXMgdGhpcyBpbiBtb3JlIGRldGFpbCwgdGhvdWdoCi0vLyBJIGRvbid0IGhhdmUgdGhlIGJvb2sgb24gbWUgcmlnaHQgbm93IHNvIEknbSBub3Qgc3VyZS4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2NvcGVkX3B0ci5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWFwX3R5cGVfaGFuZGxlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLXVzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwotdXNpbmcgaW50ZXJuYWw6OkV4dGVuc2lvblNldDsKLXVzaW5nIGludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKLXVzaW5nIGludGVybmFsOjpNYXBGaWVsZDsKLXVzaW5nIGludGVybmFsOjpEeW5hbWljTWFwRmllbGQ7Ci0KLQotdXNpbmcgaW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyOwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBTb21lIGhlbHBlciB0YWJsZXMgYW5kIGZ1bmN0aW9ucy4uLgotCi1uYW1lc3BhY2UgewotCi1ib29sIElzTWFwRmllbGRJbkFwaShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHJldHVybiBmaWVsZC0+aXNfbWFwKCk7Ci19Ci0KLS8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiB0aGUgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBmaWVsZC4KLWludCBGaWVsZFNwYWNlVXNlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgbGluZSB3cmFwcGluZwotICBpZiAoZmllbGQtPmxhYmVsKCkgPT0gRkQ6OkxBQkVMX1JFUEVBVEVEKSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQzMiAgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8aW50MzIgICA+KTsKLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfSU5UNjQgIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGludDY0ICAgPik7Ci0gICAgICBjYXNlIEZEOjpDUFBUWVBFX1VJTlQzMiA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDx1aW50MzIgID4pOwotICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9VSU5UNjQgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8dWludDY0ICA+KTsKLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRE9VQkxFIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGRvdWJsZSAgPik7Ci0gICAgICBjYXNlIEZEOjpDUFBUWVBFX0ZMT0FUICA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDxmbG9hdCAgID4pOwotICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9CT09MICAgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8Ym9vbCAgICA+KTsKLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRU5VTSAgIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGludCAgICAgPik7Ci0gICAgICBjYXNlIEZEOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICAgICAgcmV0dXJuIHNpemVvZihEeW5hbWljTWFwRmllbGQpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiBzaXplb2YoUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPik7Ci0gICAgICAgIH0KLQotICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKLSAgICAgICAgICAgIHJldHVybiBzaXplb2YoUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQzMiAgOiByZXR1cm4gc2l6ZW9mKGludDMyICAgKTsKLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfSU5UNjQgIDogcmV0dXJuIHNpemVvZihpbnQ2NCAgICk7Ci0gICAgICBjYXNlIEZEOjpDUFBUWVBFX1VJTlQzMiA6IHJldHVybiBzaXplb2YodWludDMyICApOwotICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9VSU5UNjQgOiByZXR1cm4gc2l6ZW9mKHVpbnQ2NCAgKTsKLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRE9VQkxFIDogcmV0dXJuIHNpemVvZihkb3VibGUgICk7Ci0gICAgICBjYXNlIEZEOjpDUFBUWVBFX0ZMT0FUICA6IHJldHVybiBzaXplb2YoZmxvYXQgICApOwotICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9CT09MICAgOiByZXR1cm4gc2l6ZW9mKGJvb2wgICAgKTsKLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRU5VTSAgIDogcmV0dXJuIHNpemVvZihpbnQgICAgICk7Ci0KLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIHNpemVvZihNZXNzYWdlKik7Ci0KLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgotICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICAgICByZXR1cm4gc2l6ZW9mKEFyZW5hU3RyaW5nUHRyKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gIHJldHVybiAwOwotfQotCi0vLyBDb21wdXRlIHRoZSBieXRlIHNpemUgb2YgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvbmVvZiBmaWVsZHMKLS8vIGluIGRlZmF1bHQgb25lb2YgaW5zdGFuY2UuCi1pbnQgT25lb2ZGaWVsZFNwYWNlVXNlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgbGluZSB3cmFwcGluZwotICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQzMiAgOiByZXR1cm4gc2l6ZW9mKGludDMyICAgKTsKLSAgICBjYXNlIEZEOjpDUFBUWVBFX0lOVDY0ICA6IHJldHVybiBzaXplb2YoaW50NjQgICApOwotICAgIGNhc2UgRkQ6OkNQUFRZUEVfVUlOVDMyIDogcmV0dXJuIHNpemVvZih1aW50MzIgICk7Ci0gICAgY2FzZSBGRDo6Q1BQVFlQRV9VSU5UNjQgOiByZXR1cm4gc2l6ZW9mKHVpbnQ2NCAgKTsKLSAgICBjYXNlIEZEOjpDUFBUWVBFX0RPVUJMRSA6IHJldHVybiBzaXplb2YoZG91YmxlICApOwotICAgIGNhc2UgRkQ6OkNQUFRZUEVfRkxPQVQgIDogcmV0dXJuIHNpemVvZihmbG9hdCAgICk7Ci0gICAgY2FzZSBGRDo6Q1BQVFlQRV9CT09MICAgOiByZXR1cm4gc2l6ZW9mKGJvb2wgICAgKTsKLSAgICBjYXNlIEZEOjpDUFBUWVBFX0VOVU0gICA6IHJldHVybiBzaXplb2YoaW50ICAgICApOwotCi0gICAgY2FzZSBGRDo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuIHNpemVvZihNZXNzYWdlKik7Ci0KLSAgICBjYXNlIEZEOjpDUFBUWVBFX1NUUklORzoKLSAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICAgcmV0dXJuIHNpemVvZihBcmVuYVN0cmluZ1B0cik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgfQotCi0gIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIDA7Ci19Ci0KLWlubGluZSBpbnQgRGl2aWRlUm91bmRpbmdVcChpbnQgaSwgaW50IGopIHsKLSAgcmV0dXJuIChpICsgKGogLSAxKSkgLyBqOwotfQotCi1zdGF0aWMgY29uc3QgaW50IGtTYWZlQWxpZ25tZW50ID0gc2l6ZW9mKHVpbnQ2NCk7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhPbmVvZlVuaW9uU2l6ZSA9IHNpemVvZih1aW50NjQpOwotCi1pbmxpbmUgaW50IEFsaWduVG8oaW50IG9mZnNldCwgaW50IGFsaWdubWVudCkgewotICByZXR1cm4gRGl2aWRlUm91bmRpbmdVcChvZmZzZXQsIGFsaWdubWVudCkgKiBhbGlnbm1lbnQ7Ci19Ci0KLS8vIFJvdW5kcyB0aGUgZ2l2ZW4gYnl0ZSBvZmZzZXQgdXAgdG8gdGhlIG5leHQgb2Zmc2V0IGFsaWduZWQgc3VjaCB0aGF0IGFueQotLy8gdHlwZSBtYXkgYmUgc3RvcmVkIGF0IGl0LgotaW5saW5lIGludCBBbGlnbk9mZnNldChpbnQgb2Zmc2V0KSB7Ci0gIHJldHVybiBBbGlnblRvKG9mZnNldCwga1NhZmVBbGlnbm1lbnQpOwotfQotCi0jZGVmaW5lIGJpdHNpemVvZihUKSAoc2l6ZW9mKFQpICogOCkKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotY2xhc3MgRHluYW1pY01lc3NhZ2UgOiBwdWJsaWMgTWVzc2FnZSB7Ci0gcHVibGljOgotICBzdHJ1Y3QgVHlwZUluZm8gewotICAgIGludCBzaXplOwotICAgIGludCBoYXNfYml0c19vZmZzZXQ7Ci0gICAgaW50IG9uZW9mX2Nhc2Vfb2Zmc2V0OwotICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQ7Ci0gICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0OwotICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldDsKLQotICAgIC8vIE5vdCBvd25lZCBieSB0aGUgVHlwZUluZm8uCi0gICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5OyAgLy8gVGhlIGZhY3RvcnkgdGhhdCBjcmVhdGVkIHRoaXMgb2JqZWN0LgotICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sOyAgICAgIC8vIFRoZSBmYWN0b3J5J3MgRGVzY3JpcHRvclBvb2wuCi0gICAgY29uc3QgRGVzY3JpcHRvciogdHlwZTsgICAgICAgICAgLy8gVHlwZSBvZiB0aGlzIER5bmFtaWNNZXNzYWdlLgotCi0gICAgLy8gV2FybmluZzogIFRoZSBvcmRlciBpbiB3aGljaCB0aGUgZm9sbG93aW5nIHBvaW50ZXJzIGFyZSBkZWZpbmVkIGlzCi0gICAgLy8gICBpbXBvcnRhbnQgKHRoZSBwcm90b3R5cGUgbXVzdCBiZSBkZWxldGVkICpiZWZvcmUqIHRoZSBvZmZzZXRzKS4KLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8aW50PiBvZmZzZXRzOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8Y29uc3QgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24+IHJlZmxlY3Rpb247Ci0gICAgLy8gRG9uJ3QgdXNlIGEgc2NvcGVkX3B0ciB0byBob2xkIHRoZSBwcm90b3R5cGU6IHRoZSBkZXN0cnVjdG9yIGZvcgotICAgIC8vIER5bmFtaWNNZXNzYWdlIG5lZWRzIHRvIGtub3cgd2hldGhlciBpdCBpcyB0aGUgcHJvdG90eXBlLCBhbmQgZG9lcyBzbyBieQotICAgIC8vIGxvb2tpbmcgYmFjayBhdCB0aGlzIGZpZWxkLiBUaGlzIHdvdWxkIGFzc3VtZSBkZXRhaWxzIGFib3V0IHRoZQotICAgIC8vIGltcGxlbWVudGF0aW9uIG9mIHNjb3BlZF9wdHIuCi0gICAgY29uc3QgRHluYW1pY01lc3NhZ2UqIHByb3RvdHlwZTsKLSAgICB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlOwotCi0gICAgVHlwZUluZm8oKSA6IHByb3RvdHlwZShOVUxMKSwgZGVmYXVsdF9vbmVvZl9pbnN0YW5jZShOVUxMKSB7fQotCi0gICAgflR5cGVJbmZvKCkgewotICAgICAgZGVsZXRlIHByb3RvdHlwZTsKLSAgICAgIG9wZXJhdG9yIGRlbGV0ZShkZWZhdWx0X29uZW9mX2luc3RhbmNlKTsKLSAgICB9Ci0gIH07Ci0KLSAgRHluYW1pY01lc3NhZ2UoY29uc3QgVHlwZUluZm8qIHR5cGVfaW5mbyk7Ci0gIH5EeW5hbWljTWVzc2FnZSgpOwotCi0gIC8vIENhbGxlZCBvbiB0aGUgcHJvdG90eXBlIGFmdGVyIGNvbnN0cnVjdGlvbiB0byBpbml0aWFsaXplIG1lc3NhZ2UgZmllbGRzLgotICB2b2lkIENyb3NzTGlua1Byb3RvdHlwZXMoKTsKLQotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIE1lc3NhZ2UqIE5ldygpIGNvbnN0OwotICBNZXNzYWdlKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwotICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH07Ci0KLSAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdDsKLSAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKLQotICBNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotCi0gIC8vIFdlIGFjdHVhbGx5IGFsbG9jYXRlIG1vcmUgbWVtb3J5IHRoYW4gc2l6ZW9mKCp0aGlzKSB3aGVuIHRoaXMKLSAgLy8gY2xhc3MncyBtZW1vcnkgaXMgYWxsb2NhdGVkIHZpYSB0aGUgZ2xvYmFsIG9wZXJhdG9yIG5ldy4gVGh1cywgd2UgbmVlZCB0bwotICAvLyBtYW51YWxseSBjYWxsIHRoZSBnbG9iYWwgb3BlcmF0b3IgZGVsZXRlLiBDYWxsaW5nIHRoZSBkZXN0cnVjdG9yIGlzIHRha2VuCi0gIC8vIGNhcmUgb2YgZm9yIHVzLiBUaGlzIG1ha2VzIER5bmFtaWNNZXNzYWdlIGNvbXBhdGlibGUgd2l0aCAtZnNpemVkLWRlbGV0ZS4KLSAgLy8gSXQgZG9lc24ndCB3b3JrIGZvciBNU1ZDIHRob3VnaC4KLSNpZm5kZWYgX01TQ19WRVIKLSAgc3RhdGljIHZvaWQgb3BlcmF0b3IgZGVsZXRlKHZvaWQqIHB0cikgewotICAgIDo6b3BlcmF0b3IgZGVsZXRlKHB0cik7Ci0gIH0KLSNlbmRpZiAgLy8gIV9NU0NfVkVSCi0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHluYW1pY01lc3NhZ2UpOwotICBEeW5hbWljTWVzc2FnZShjb25zdCBUeXBlSW5mbyogdHlwZV9pbmZvLCA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7Ci0gIHZvaWQgU2hhcmVkQ3RvcigpOwotCi0gIGlubGluZSBib29sIGlzX3Byb3RvdHlwZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gdHlwZV9pbmZvXy0+cHJvdG90eXBlID09IHRoaXMgfHwKLSAgICAgICAgICAgLy8gSWYgdHlwZV9pbmZvXy0+cHJvdG90eXBlIGlzIE5VTEwsIHRoZW4gd2UgbXVzdCBiZSBjb25zdHJ1Y3RpbmcKLSAgICAgICAgICAgLy8gdGhlIHByb3RvdHlwZSBub3csIHdoaWNoIG1lYW5zIHdlIG11c3QgYmUgdGhlIHByb3RvdHlwZS4KLSAgICAgICAgICAgdHlwZV9pbmZvXy0+cHJvdG90eXBlID09IE5VTEw7Ci0gIH0KLQotICBpbmxpbmUgdm9pZCogT2Zmc2V0VG9Qb2ludGVyKGludCBvZmZzZXQpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHRoaXMpICsgb2Zmc2V0OwotICB9Ci0gIGlubGluZSBjb25zdCB2b2lkKiBPZmZzZXRUb1BvaW50ZXIoaW50IG9mZnNldCkgY29uc3QgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4odGhpcykgKyBvZmZzZXQ7Ci0gIH0KLQotICBjb25zdCBUeXBlSW5mbyogdHlwZV9pbmZvXzsKLSAgLy8gVE9ETyhrZW50b24pOiAgTWFrZSB0aGlzIGFuIGF0b21pYzxpbnQ+IHdoZW4gQysrIHN1cHBvcnRzIGl0LgotICBtdXRhYmxlIGludCBjYWNoZWRfYnl0ZV9zaXplXzsKLX07Ci0KLUR5bmFtaWNNZXNzYWdlOjpEeW5hbWljTWVzc2FnZShjb25zdCBUeXBlSW5mbyogdHlwZV9pbmZvKQotICA6IHR5cGVfaW5mb18odHlwZV9pbmZvKSwKLSAgICBjYWNoZWRfYnl0ZV9zaXplXygwKSB7Ci0gIFNoYXJlZEN0b3IoKTsKLX0KLQotRHluYW1pY01lc3NhZ2U6OkR5bmFtaWNNZXNzYWdlKGNvbnN0IFR5cGVJbmZvKiB0eXBlX2luZm8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpCi0gIDogdHlwZV9pbmZvXyh0eXBlX2luZm8pLAotICAgIGNhY2hlZF9ieXRlX3NpemVfKDApIHsKLSAgU2hhcmVkQ3RvcigpOwotfQotCi12b2lkIER5bmFtaWNNZXNzYWdlOjpTaGFyZWRDdG9yKCkgewotICAvLyBXZSBuZWVkIHRvIGNhbGwgY29uc3RydWN0b3JzIGZvciB2YXJpb3VzIGZpZWxkcyBtYW51YWxseSBhbmQgc2V0Ci0gIC8vIGRlZmF1bHQgdmFsdWVzIHdoZXJlIGFwcHJvcHJpYXRlLiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgdG8gY2FsbAotICAvLyBjb25zdHJ1Y3RvcnMuICBJZiB5b3UgaGF2ZW4ndCBoZWFyZCBvZiBwbGFjZW1lbnQgbmV3LCBJIHN1Z2dlc3QgR29vZ2xpbmcKLSAgLy8gaXQgbm93LiAgV2UgdXNlIHBsYWNlbWVudCBuZXcgZXZlbiBmb3IgcHJpbWl0aXZlIHR5cGVzIHRoYXQgZG9uJ3QgaGF2ZQotICAvLyBjb25zdHJ1Y3RvcnMgZm9yIGNvbnNpc3RlbmN5LiAgKEluIHRoZW9yeSwgcGxhY2VtZW50IG5ldyBzaG91bGQgYmUgdXNlZAotICAvLyBhbnkgdGltZSB5b3UgYXJlIHRyeWluZyB0byBjb252ZXJ0IHVudHlwZWQgbWVtb3J5IHRvIHR5cGVkIG1lbW9yeSwgdGhvdWdoCi0gIC8vIGluIHByYWN0aWNlIHRoYXQncyBub3Qgc3RyaWN0bHkgbmVjZXNzYXJ5IGZvciB0eXBlcyB0aGF0IGRvbid0IGhhdmUgYQotICAvLyBjb25zdHJ1Y3Rvci4pCi0KLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHR5cGVfaW5mb18tPnR5cGU7Ci0KLSAgLy8gSW5pdGlhbGl6ZSBvbmVvZiBjYXNlcy4KLSAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZGVzY3JpcHRvci0+b25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKLSAgICBuZXcoT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPm9uZW9mX2Nhc2Vfb2Zmc2V0ICsgc2l6ZW9mKHVpbnQzMikgKiBpKSkKLSAgICAgICAgdWludDMyKDApOwotICB9Ci0KLSAgaWYgKHR5cGVfaW5mb18tPmlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0ICE9IC0xKSB7Ci0gICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Ym9vbCo+KAotICAgICAgICBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+aXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpKSA9IGZhbHNlOwotICB9Ci0KLSAgbmV3KE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT51bmtub3duX2ZpZWxkc19vZmZzZXQpKSBVbmtub3duRmllbGRTZXQ7Ci0KLSAgaWYgKHR5cGVfaW5mb18tPmV4dGVuc2lvbnNfb2Zmc2V0ICE9IC0xKSB7Ci0gICAgbmV3KE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5leHRlbnNpb25zX29mZnNldCkpIEV4dGVuc2lvblNldDsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOwotICAgIHZvaWQqIGZpZWxkX3B0ciA9IE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5vZmZzZXRzW2ldKTsKLSAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgY29udGludWU7Ci0gICAgfQotICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBuZXcoZmllbGRfcHRyKSBUWVBFKGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjVFlQRSgpKTsgICAgICAgICAgICAgICAgXAotICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmV3KGZpZWxkX3B0cikgUmVwZWF0ZWRGaWVsZDxUWVBFPigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhazsKLQotICAgICAgSEFORExFX1RZUEUoSU5UMzIgLCBpbnQzMiApOwotICAgICAgSEFORExFX1RZUEUoSU5UNjQgLCBpbnQ2NCApOwotICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIpOwotICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOwotICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOwotICAgICAgSEFORExFX1RZUEUoRkxPQVQgLCBmbG9hdCApOwotICAgICAgSEFORExFX1RZUEUoQk9PTCAgLCBib29sICApOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06Ci0gICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgICAgICBuZXcoZmllbGRfcHRyKSBpbnQoZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV3KGZpZWxkX3B0cikgUmVwZWF0ZWRGaWVsZDxpbnQ+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KLSAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgICBjb25zdCBzdHJpbmcqIGRlZmF1bHRfdmFsdWU7Ci0gICAgICAgICAgICAgIGlmIChpc19wcm90b3R5cGUoKSkgewotICAgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPSAmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICAmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgQXJlbmFTdHJpbmdQdHIqPigKLSAgICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvXy0+cHJvdG90eXBlLT5PZmZzZXRUb1BvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSkpLT5HZXQoTlVMTCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIEFyZW5hU3RyaW5nUHRyKiBhc3AgPSBuZXcoZmllbGRfcHRyKSBBcmVuYVN0cmluZ1B0cigpOwotICAgICAgICAgICAgICBhc3AtPlVuc2FmZVNldERlZmF1bHQoZGVmYXVsdF92YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBuZXcoZmllbGRfcHRyKSBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4oKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgICAgICBuZXcoZmllbGRfcHRyKSBNZXNzYWdlKihOVUxMKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgewotICAgICAgICAgICAgbmV3IChmaWVsZF9wdHIpIER5bmFtaWNNYXBGaWVsZCgKLSAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5mYWN0b3J5LT5HZXRQcm90b3R5cGVOb0xvY2soZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5ldyAoZmllbGRfcHRyKSBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KCk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1EeW5hbWljTWVzc2FnZTo6fkR5bmFtaWNNZXNzYWdlKCkgewotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gdHlwZV9pbmZvXy0+dHlwZTsKLQotICByZWludGVycHJldF9jYXN0PFVua25vd25GaWVsZFNldCo+KAotICAgIE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT51bmtub3duX2ZpZWxkc19vZmZzZXQpKS0+flVua25vd25GaWVsZFNldCgpOwotCi0gIGlmICh0eXBlX2luZm9fLT5leHRlbnNpb25zX29mZnNldCAhPSAtMSkgewotICAgIHJlaW50ZXJwcmV0X2Nhc3Q8RXh0ZW5zaW9uU2V0Kj4oCi0gICAgICBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+ZXh0ZW5zaW9uc19vZmZzZXQpKS0+fkV4dGVuc2lvblNldCgpOwotICB9Ci0KLSAgLy8gV2UgbmVlZCB0byBtYW51YWxseSBydW4gdGhlIGRlc3RydWN0b3JzIGZvciByZXBlYXRlZCBmaWVsZHMgYW5kIHN0cmluZ3MsCi0gIC8vIGp1c3QgYXMgd2UgcmFuIHRoZWlyIGNvbnN0cnVjdG9ycyBpbiB0aGUgRHluYW1pY01lc3NhZ2UgY29uc3RydWN0b3IuCi0gIC8vIFdlIGFsc28gbmVlZCB0byBtYW51YWxseSBkZWxldGUgb25lb2YgZmllbGRzIGlmIGl0IGlzIHNldCBhbmQgaXMgc3RyaW5nCi0gIC8vIG9yIG1lc3NhZ2UuCi0gIC8vIEFkZGl0aW9uYWxseSwgaWYgYW55IHNpbmd1bGFyIGVtYmVkZGVkIG1lc3NhZ2VzIGhhdmUgYmVlbiBhbGxvY2F0ZWQsIHdlCi0gIC8vIG5lZWQgdG8gZGVsZXRlIHRoZW0sIFVOTEVTUyB3ZSBhcmUgdGhlIHByb3RvdHlwZSBtZXNzYWdlIG9mIHRoaXMgdHlwZSwKLSAgLy8gaW4gd2hpY2ggY2FzZSBhbnkgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIG90aGVyIHByb3RvdHlwZXMgYW5kIHNob3VsZG4ndAotICAvLyBiZSB0b3VjaGVkLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKLSAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgdm9pZCogZmllbGRfcHRyID0gT2Zmc2V0VG9Qb2ludGVyKAotICAgICAgICAgIHR5cGVfaW5mb18tPm9uZW9mX2Nhc2Vfb2Zmc2V0Ci0gICAgICAgICAgKyBzaXplb2YodWludDMyKSAqIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCktPmluZGV4KCkpOwotICAgICAgaWYgKCoocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIqPihmaWVsZF9wdHIpKSA9PQotICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSkgewotICAgICAgICBmaWVsZF9wdHIgPSBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+b2Zmc2V0c1sKLSAgICAgICAgICAgIGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCkgKyBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpXSk7Ci0gICAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7Ci0gICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7Ci0gICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUgPQotICAgICAgICAgICAgICAgICAgJihyZWludGVycHJldF9jYXN0PGNvbnN0IEFyZW5hU3RyaW5nUHRyKj4oCi0gICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KAotICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5kZWZhdWx0X29uZW9mX2luc3RhbmNlKQotICAgICAgICAgICAgICAgICAgICAgICsgdHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSkKLSAgICAgICAgICAgICAgICAgICAgLT5HZXQoTlVMTCkpOwotICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyZW5hU3RyaW5nUHRyKj4oZmllbGRfcHRyKS0+RGVzdHJveSgKLSAgICAgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUsIE5VTEwpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgICAgICAgIGRlbGV0ZSAqcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlKio+KGZpZWxkX3B0cik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGNvbnRpbnVlOwotICAgIH0KLSAgICB2b2lkKiBmaWVsZF9wdHIgPSBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSk7Ci0KLSAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPio+KGZpZWxkX3B0cikgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+KCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhawotCi0gICAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKLSAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOwotICAgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKLSAgICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KLSAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Kj4oZmllbGRfcHRyKQotICAgICAgICAgICAgICAgICAgLT5+UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICAgICAgICByZWludGVycHJldF9jYXN0PER5bmFtaWNNYXBGaWVsZCo+KGZpZWxkX3B0ciktPn5EeW5hbWljTWFwRmllbGQoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+Kj4oZmllbGRfcHRyKQotICAgICAgICAgICAgICAgIC0+flJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKLSAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgotICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7Ci0gICAgICAgICAgY29uc3QgOjpzdGQ6OnN0cmluZyogZGVmYXVsdF92YWx1ZSA9Ci0gICAgICAgICAgICAgICYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBBcmVuYVN0cmluZ1B0cio+KAotICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvXy0+cHJvdG90eXBlLT5PZmZzZXRUb1BvaW50ZXIoCi0gICAgICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvXy0+b2Zmc2V0c1tpXSkpLT5HZXQoTlVMTCkpOwotICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJlbmFTdHJpbmdQdHIqPihmaWVsZF9wdHIpLT5EZXN0cm95KAotICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlLCBOVUxMKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgIGlmICghaXNfcHJvdG90eXBlKCkpIHsKLSAgICAgICAgTWVzc2FnZSogbWVzc2FnZSA9ICpyZWludGVycHJldF9jYXN0PE1lc3NhZ2UqKj4oZmllbGRfcHRyKTsKLSAgICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgewotICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRHluYW1pY01lc3NhZ2U6OkNyb3NzTGlua1Byb3RvdHlwZXMoKSB7Ci0gIC8vIFRoaXMgc2hvdWxkIG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBwcm90b3R5cGUgbWVzc2FnZS4KLSAgR09PR0xFX0NIRUNLKGlzX3Byb3RvdHlwZSgpKTsKLQotICBEeW5hbWljTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSB0eXBlX2luZm9fLT5mYWN0b3J5OwotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gdHlwZV9pbmZvXy0+dHlwZTsKLQotICAvLyBDcm9zcy1saW5rIGRlZmF1bHQgbWVzc2FnZXMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOwotICAgIHZvaWQqIGZpZWxkX3B0ciA9IE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5vZmZzZXRzW2ldKTsKLSAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgZmllbGRfcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KAotICAgICAgICAgIHR5cGVfaW5mb18tPmRlZmF1bHRfb25lb2ZfaW5zdGFuY2UpICsgdHlwZV9pbmZvXy0+b2Zmc2V0c1tpXTsKLSAgICB9Ci0KLSAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKLSAgICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAvLyBGb3IgZmllbGRzIHdpdGggbWVzc2FnZSB0eXBlcywgd2UgbmVlZCB0byBjcm9zcy1saW5rIHdpdGggdGhlCi0gICAgICAvLyBwcm90b3R5cGUgZm9yIHRoZSBmaWVsZCdzIHR5cGUuCi0gICAgICAvLyBGb3Igc2luZ3VsYXIgZmllbGRzLCB0aGUgZmllbGQgaXMganVzdCBhIHBvaW50ZXIgd2hpY2ggc2hvdWxkCi0gICAgICAvLyBwb2ludCB0byB0aGUgcHJvdG90eXBlLgotICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWVzc2FnZSoqPihmaWVsZF9wdHIpID0KLSAgICAgICAgZmFjdG9yeS0+R2V0UHJvdG90eXBlTm9Mb2NrKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gU2V0IGFzIHRoZSBkZWZhdWx0IGluc3RhbmNlIC0tIHRoaXMgYWZmZWN0cyBmaWVsZC1wcmVzZW5jZSBzZW1hbnRpY3MgZm9yCi0gIC8vIHByb3RvMy4KLSAgaWYgKHR5cGVfaW5mb18tPmlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0ICE9IC0xKSB7Ci0gICAgdm9pZCogaXNfZGVmYXVsdF9pbnN0YW5jZV9wdHIgPQotICAgICAgICBPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+aXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpOwotICAgICpyZWludGVycHJldF9jYXN0PGJvb2wqPihpc19kZWZhdWx0X2luc3RhbmNlX3B0cikgPSB0cnVlOwotICB9Ci19Ci0KLU1lc3NhZ2UqIER5bmFtaWNNZXNzYWdlOjpOZXcoKSBjb25zdCB7Ci0gIHZvaWQqIG5ld19iYXNlID0gb3BlcmF0b3IgbmV3KHR5cGVfaW5mb18tPnNpemUpOwotICBtZW1zZXQobmV3X2Jhc2UsIDAsIHR5cGVfaW5mb18tPnNpemUpOwotICByZXR1cm4gbmV3KG5ld19iYXNlKSBEeW5hbWljTWVzc2FnZSh0eXBlX2luZm9fKTsKLX0KLQotTWVzc2FnZSogRHluYW1pY01lc3NhZ2U6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBOZXcoKTsKLSAgICBhcmVuYS0+T3duKG1lc3NhZ2UpOwotICAgIHJldHVybiBtZXNzYWdlOwotICB9IGVsc2UgewotICAgIHJldHVybiBOZXcoKTsKLSAgfQotfQotCi1pbnQgRHluYW1pY01lc3NhZ2U6OkdldENhY2hlZFNpemUoKSBjb25zdCB7Ci0gIHJldHVybiBjYWNoZWRfYnl0ZV9zaXplXzsKLX0KLQotdm9pZCBEeW5hbWljTWVzc2FnZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgewotICAvLyBUaGlzIGlzIHRoZW9yZXRpY2FsbHkgbm90IHRocmVhZC1jb21wYXRpYmxlLCBidXQgaW4gcHJhY3RpY2UgaXQgd29ya3MKLSAgLy8gYmVjYXVzZSBpZiBtdWx0aXBsZSB0aHJlYWRzIHdyaXRlIHRoaXMgc2ltdWx0YW5lb3VzbHksIHRoZXkgd2lsbCBiZQotICAvLyB3cml0aW5nIHRoZSBleGFjdCBzYW1lIHZhbHVlLgotICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwotICBjYWNoZWRfYnl0ZV9zaXplXyA9IHNpemU7Ci0gIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOwotfQotCi1NZXRhZGF0YSBEeW5hbWljTWVzc2FnZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7Ci0gIE1ldGFkYXRhIG1ldGFkYXRhOwotICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gdHlwZV9pbmZvXy0+dHlwZTsKLSAgbWV0YWRhdGEucmVmbGVjdGlvbiA9IHR5cGVfaW5mb18tPnJlZmxlY3Rpb24uZ2V0KCk7Ci0gIHJldHVybiBtZXRhZGF0YTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1zdHJ1Y3QgRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpQcm90b3R5cGVNYXAgewotICB0eXBlZGVmIGhhc2hfbWFwPGNvbnN0IERlc2NyaXB0b3IqLCBjb25zdCBEeW5hbWljTWVzc2FnZTo6VHlwZUluZm8qPiBNYXA7Ci0gIE1hcCBtYXBfOwotfTsKLQotRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpEeW5hbWljTWVzc2FnZUZhY3RvcnkoKQotICA6IHBvb2xfKE5VTEwpLCBkZWxlZ2F0ZV90b19nZW5lcmF0ZWRfZmFjdG9yeV8oZmFsc2UpLAotICAgIHByb3RvdHlwZXNfKG5ldyBQcm90b3R5cGVNYXApIHsKLX0KLQotRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpEeW5hbWljTWVzc2FnZUZhY3RvcnkoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpCi0gIDogcG9vbF8ocG9vbCksIGRlbGVnYXRlX3RvX2dlbmVyYXRlZF9mYWN0b3J5XyhmYWxzZSksCi0gICAgcHJvdG90eXBlc18obmV3IFByb3RvdHlwZU1hcCkgewotfQotCi1EeW5hbWljTWVzc2FnZUZhY3Rvcnk6On5EeW5hbWljTWVzc2FnZUZhY3RvcnkoKSB7Ci0gIGZvciAoUHJvdG90eXBlTWFwOjpNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b3R5cGVzXy0+bWFwXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gcHJvdG90eXBlc18tPm1hcF8uZW5kKCk7ICsraXRlcikgewotICAgIERlbGV0ZURlZmF1bHRPbmVvZkluc3RhbmNlKGl0ZXItPnNlY29uZC0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPm9mZnNldHMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5kZWZhdWx0X29uZW9mX2luc3RhbmNlKTsKLSAgICBkZWxldGUgaXRlci0+c2Vjb25kOwotICB9Ci19Ci0KLWNvbnN0IE1lc3NhZ2UqIER5bmFtaWNNZXNzYWdlRmFjdG9yeTo6R2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKLSAgTXV0ZXhMb2NrIGxvY2soJnByb3RvdHlwZXNfbXV0ZXhfKTsKLSAgcmV0dXJuIEdldFByb3RvdHlwZU5vTG9jayh0eXBlKTsKLX0KLQotY29uc3QgTWVzc2FnZSogRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpHZXRQcm90b3R5cGVOb0xvY2soCi0gICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSkgewotICBpZiAoZGVsZWdhdGVfdG9fZ2VuZXJhdGVkX2ZhY3RvcnlfICYmCi0gICAgICB0eXBlLT5maWxlKCktPnBvb2woKSA9PSBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSkgewotICAgIHJldHVybiBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKHR5cGUpOwotICB9Ci0KLSAgY29uc3QgRHluYW1pY01lc3NhZ2U6OlR5cGVJbmZvKiogdGFyZ2V0ID0gJnByb3RvdHlwZXNfLT5tYXBfW3R5cGVdOwotICBpZiAoKnRhcmdldCAhPSBOVUxMKSB7Ci0gICAgLy8gQWxyZWFkeSBleGlzdHMuCi0gICAgcmV0dXJuICgqdGFyZ2V0KS0+cHJvdG90eXBlOwotICB9Ci0KLSAgRHluYW1pY01lc3NhZ2U6OlR5cGVJbmZvKiB0eXBlX2luZm8gPSBuZXcgRHluYW1pY01lc3NhZ2U6OlR5cGVJbmZvOwotICAqdGFyZ2V0ID0gdHlwZV9pbmZvOwotCi0gIHR5cGVfaW5mby0+dHlwZSA9IHR5cGU7Ci0gIHR5cGVfaW5mby0+cG9vbCA9IChwb29sXyA9PSBOVUxMKSA/IHR5cGUtPmZpbGUoKS0+cG9vbCgpIDogcG9vbF87Ci0gIHR5cGVfaW5mby0+ZmFjdG9yeSA9IHRoaXM7Ci0KLSAgLy8gV2UgbmVlZCB0byBjb25zdHJ1Y3QgYWxsIHRoZSBzdHJ1Y3R1cmVzIHBhc3NlZCB0bwotICAvLyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbidzIGNvbnN0cnVjdG9yLiAgVGhpcyBpbmNsdWRlczoKLSAgLy8gLSBBIGJsb2NrIG9mIG1lbW9yeSB0aGF0IGNvbnRhaW5zIHNwYWNlIGZvciBhbGwgdGhlIG1lc3NhZ2UncyBmaWVsZHMuCi0gIC8vIC0gQW4gYXJyYXkgb2YgaW50ZWdlcnMgaW5kaWNhdGluZyB0aGUgYnl0ZSBvZmZzZXQgb2YgZWFjaCBmaWVsZCB3aXRoaW4KLSAgLy8gICB0aGlzIGJsb2NrLgotICAvLyAtIEEgYmlnIGJpdGZpZWxkIGNvbnRhaW5pbmcgYSBiaXQgZm9yIGVhY2ggZmllbGQgaW5kaWNhdGluZyB3aGV0aGVyCi0gIC8vICAgb3Igbm90IHRoYXQgZmllbGQgaXMgc2V0LgotCi0gIC8vIENvbXB1dGUgc2l6ZSBhbmQgb2Zmc2V0cy4KLSAgaW50KiBvZmZzZXRzID0gbmV3IGludFt0eXBlLT5maWVsZF9jb3VudCgpICsgdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpXTsKLSAgdHlwZV9pbmZvLT5vZmZzZXRzLnJlc2V0KG9mZnNldHMpOwotCi0gIC8vIERlY2lkZSBhbGwgZmllbGQgb2Zmc2V0cyBieSBwYWNraW5nIGluIG9yZGVyLgotICAvLyBXZSBwbGFjZSB0aGUgRHluYW1pY01lc3NhZ2Ugb2JqZWN0IGl0c2VsZiBhdCB0aGUgYmVnaW5uaW5nIG9mIHRoZSBhbGxvY2F0ZWQKLSAgLy8gc3BhY2UuCi0gIGludCBzaXplID0gc2l6ZW9mKER5bmFtaWNNZXNzYWdlKTsKLSAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOwotCi0gIC8vIE5leHQgdGhlIGhhc19iaXRzLCB3aGljaCBpcyBhbiBhcnJheSBvZiB1aW50MzJzLgotICBpZiAodHlwZS0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgewotICAgIHR5cGVfaW5mby0+aGFzX2JpdHNfb2Zmc2V0ID0gLTE7Ci0gIH0gZWxzZSB7Ci0gICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQgPSBzaXplOwotICAgIGludCBoYXNfYml0c19hcnJheV9zaXplID0KLSAgICAgIERpdmlkZVJvdW5kaW5nVXAodHlwZS0+ZmllbGRfY291bnQoKSwgYml0c2l6ZW9mKHVpbnQzMikpOwotICAgIHNpemUgKz0gaGFzX2JpdHNfYXJyYXlfc2l6ZSAqIHNpemVvZih1aW50MzIpOwotICAgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKLSAgfQotCi0gIC8vIFRoZSBpc19kZWZhdWx0X2luc3RhbmNlIG1lbWJlciwgaWYgYW55LgotICBpZiAodHlwZS0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgewotICAgIHR5cGVfaW5mby0+aXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQgPSBzaXplOwotICAgIHNpemUgKz0gc2l6ZW9mKGJvb2wpOwotICAgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKLSAgfSBlbHNlIHsKLSAgICB0eXBlX2luZm8tPmlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0ID0gLTE7Ci0gIH0KLQotICAvLyBUaGUgb25lb2ZfY2FzZSwgaWYgYW55LiBJdCBpcyBhbiBhcnJheSBvZiB1aW50MzJzLgotICBpZiAodHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpID4gMCkgewotICAgIHR5cGVfaW5mby0+b25lb2ZfY2FzZV9vZmZzZXQgPSBzaXplOwotICAgIHNpemUgKz0gdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpICogc2l6ZW9mKHVpbnQzMik7Ci0gICAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOwotICB9Ci0KLSAgLy8gVGhlIEV4dGVuc2lvblNldCwgaWYgYW55LgotICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgdHlwZV9pbmZvLT5leHRlbnNpb25zX29mZnNldCA9IHNpemU7Ci0gICAgc2l6ZSArPSBzaXplb2YoRXh0ZW5zaW9uU2V0KTsKLSAgICBzaXplID0gQWxpZ25PZmZzZXQoc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gTm8gZXh0ZW5zaW9ucy4KLSAgICB0eXBlX2luZm8tPmV4dGVuc2lvbnNfb2Zmc2V0ID0gLTE7Ci0gIH0KLQotICAvLyBBbGwgdGhlIGZpZWxkcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICAvLyBNYWtlIHN1cmUgZmllbGQgaXMgYWxpZ25lZCB0byBhdm9pZCBidXMgZXJyb3JzLgotICAgIC8vIE9uZW9mIGZpZWxkcyBkbyBub3QgdXNlIGFueSBzcGFjZS4KLSAgICBpZiAoIXR5cGUtPmZpZWxkKGkpLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgIGludCBmaWVsZF9zaXplID0gRmllbGRTcGFjZVVzZWQodHlwZS0+ZmllbGQoaSkpOwotICAgICAgc2l6ZSA9IEFsaWduVG8oc2l6ZSwgc3RkOjptaW4oa1NhZmVBbGlnbm1lbnQsIGZpZWxkX3NpemUpKTsKLSAgICAgIG9mZnNldHNbaV0gPSBzaXplOwotICAgICAgc2l6ZSArPSBmaWVsZF9zaXplOwotICAgIH0KLSAgfQotCi0gIC8vIFRoZSBvbmVvZnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICBzaXplID0gQWxpZ25UbyhzaXplLCBrU2FmZUFsaWdubWVudCk7Ci0gICAgb2Zmc2V0c1t0eXBlLT5maWVsZF9jb3VudCgpICsgaV0gPSBzaXplOwotICAgIHNpemUgKz0ga01heE9uZW9mVW5pb25TaXplOwotICB9Ci0KLSAgLy8gQWRkIHRoZSBVbmtub3duRmllbGRTZXQgdG8gdGhlIGVuZC4KLSAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOwotICB0eXBlX2luZm8tPnVua25vd25fZmllbGRzX29mZnNldCA9IHNpemU7Ci0gIHNpemUgKz0gc2l6ZW9mKFVua25vd25GaWVsZFNldCk7Ci0KLSAgLy8gQWxpZ24gdGhlIGZpbmFsIHNpemUgdG8gbWFrZSBzdXJlIG5vIGNsZXZlciBhbGxvY2F0b3JzIHRoaW5rIHRoYXQKLSAgLy8gYWxpZ25tZW50IGlzIG5vdCBuZWNlc3NhcnkuCi0gIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKLSAgdHlwZV9pbmZvLT5zaXplID0gc2l6ZTsKLQotICAvLyBBbGxvY2F0ZSB0aGUgcHJvdG90eXBlLgotICB2b2lkKiBiYXNlID0gb3BlcmF0b3IgbmV3KHNpemUpOwotICBtZW1zZXQoYmFzZSwgMCwgc2l6ZSk7Ci0gIC8vIFRoZSBwcm90b3R5cGUgaW4gdHlwZV9pbmZvIGhhcyB0byBiZSBzZXQgYmVmb3JlIGNyZWF0aW5nIHRoZSBwcm90b3R5cGUKLSAgLy8gaW5zdGFuY2Ugb24gbWVtb3J5LiBlLmcuLCBtZXNzYWdlIEZvbyB7IG1hcDxpbnQzMiwgRm9vPiBhID0gMTsgfS4gV2hlbgotICAvLyBjcmVhdGluZyBwcm90b3R5cGUgZm9yIEZvbywgcHJvdG90eXBlIG9mIHRoZSBtYXAgZW50cnkgd2lsbCBhbHNvIGJlCi0gIC8vIGNyZWF0ZWQsIHdoaWNoIG5lZWRzIHRoZSBhZGRyZXNzIG9mIHRoZSBwcm90b3R5cGUgb2YgRm9vICh0aGUgdmFsdWUgaW4KLSAgLy8gbWFwKS4gVG8gYnJlYWsgdGhlIGN5Y2xpYyBkZXBlbmRlbmN5LCB3ZSBoYXZlIHRvIGFzc2dpbiB0aGUgYWRkcmVzcyBvZgotICAvLyBwcm90b3R5cGUgaW50byB0eXBlX2luZm8gZmlyc3QuCi0gIHR5cGVfaW5mby0+cHJvdG90eXBlID0gc3RhdGljX2Nhc3Q8RHluYW1pY01lc3NhZ2UqPihiYXNlKTsKLSAgRHluYW1pY01lc3NhZ2UqIHByb3RvdHlwZSA9IG5ldyhiYXNlKSBEeW5hbWljTWVzc2FnZSh0eXBlX2luZm8pOwotCi0gIC8vIENvbnN0cnVjdCB0aGUgcmVmbGVjdGlvbiBvYmplY3QuCi0gIGlmICh0eXBlLT5vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7Ci0gICAgLy8gQ29tcHV0ZSB0aGUgc2l6ZSBvZiBkZWZhdWx0IG9uZW9mIGluc3RhbmNlIGFuZCBvZmZzZXRzIG9mIGRlZmF1bHQKLSAgICAvLyBvbmVvZiBmaWVsZHMuCi0gICAgaW50IG9uZW9mX3NpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgdHlwZS0+b25lb2ZfZGVjbChpKS0+ZmllbGRfY291bnQoKTsgaisrKSB7Ci0gICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKLSAgICAgICAgaW50IGZpZWxkX3NpemUgPSBPbmVvZkZpZWxkU3BhY2VVc2VkKGZpZWxkKTsKLSAgICAgICAgb25lb2Zfc2l6ZSA9IEFsaWduVG8ob25lb2Zfc2l6ZSwgc3RkOjptaW4oa1NhZmVBbGlnbm1lbnQsIGZpZWxkX3NpemUpKTsKLSAgICAgICAgb2Zmc2V0c1tmaWVsZC0+aW5kZXgoKV0gPSBvbmVvZl9zaXplOwotICAgICAgICBvbmVvZl9zaXplICs9IGZpZWxkX3NpemU7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIENvbnN0cnVjdCBkZWZhdWx0IG9uZW9mIGluc3RhbmNlLgotICAgIHR5cGVfaW5mby0+ZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSA9IDo6b3BlcmF0b3IgbmV3KG9uZW9mX3NpemUpOwotICAgIENvbnN0cnVjdERlZmF1bHRPbmVvZkluc3RhbmNlKHR5cGVfaW5mby0+dHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm8tPm9mZnNldHMuZ2V0KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvLT5kZWZhdWx0X29uZW9mX2luc3RhbmNlKTsKLSAgICB0eXBlX2luZm8tPnJlZmxlY3Rpb24ucmVzZXQoCi0gICAgICAgIG5ldyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgICAgICAgIHR5cGVfaW5mby0+dHlwZSwKLSAgICAgICAgICAgIHR5cGVfaW5mby0+cHJvdG90eXBlLAotICAgICAgICAgICAgdHlwZV9pbmZvLT5vZmZzZXRzLmdldCgpLAotICAgICAgICAgICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQsCi0gICAgICAgICAgICB0eXBlX2luZm8tPnVua25vd25fZmllbGRzX29mZnNldCwKLSAgICAgICAgICAgIHR5cGVfaW5mby0+ZXh0ZW5zaW9uc19vZmZzZXQsCi0gICAgICAgICAgICB0eXBlX2luZm8tPmRlZmF1bHRfb25lb2ZfaW5zdGFuY2UsCi0gICAgICAgICAgICB0eXBlX2luZm8tPm9uZW9mX2Nhc2Vfb2Zmc2V0LAotICAgICAgICAgICAgdHlwZV9pbmZvLT5wb29sLAotICAgICAgICAgICAgdGhpcywKLSAgICAgICAgICAgIHR5cGVfaW5mby0+c2l6ZSwKLSAgICAgICAgICAgIC0xIC8qIGFyZW5hX29mZnNldCAqLywKLSAgICAgICAgICAgIHR5cGVfaW5mby0+aXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpKTsKLSAgfSBlbHNlIHsKLSAgICB0eXBlX2luZm8tPnJlZmxlY3Rpb24ucmVzZXQoCi0gICAgICAgIG5ldyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgICAgICAgIHR5cGVfaW5mby0+dHlwZSwKLSAgICAgICAgICAgIHR5cGVfaW5mby0+cHJvdG90eXBlLAotICAgICAgICAgICAgdHlwZV9pbmZvLT5vZmZzZXRzLmdldCgpLAotICAgICAgICAgICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQsCi0gICAgICAgICAgICB0eXBlX2luZm8tPnVua25vd25fZmllbGRzX29mZnNldCwKLSAgICAgICAgICAgIHR5cGVfaW5mby0+ZXh0ZW5zaW9uc19vZmZzZXQsCi0gICAgICAgICAgICB0eXBlX2luZm8tPnBvb2wsCi0gICAgICAgICAgICB0aGlzLAotICAgICAgICAgICAgdHlwZV9pbmZvLT5zaXplLAotICAgICAgICAgICAgLTEgLyogYXJlbmFfb2Zmc2V0ICovLAotICAgICAgICAgICAgdHlwZV9pbmZvLT5pc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCkpOwotICB9Ci0gIC8vIENyb3NzIGxpbmsgcHJvdG90eXBlcy4KLSAgcHJvdG90eXBlLT5Dcm9zc0xpbmtQcm90b3R5cGVzKCk7Ci0KLSAgcmV0dXJuIHByb3RvdHlwZTsKLX0KLQotdm9pZCBEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OkNvbnN0cnVjdERlZmF1bHRPbmVvZkluc3RhbmNlKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUsCi0gICAgY29uc3QgaW50IG9mZnNldHNbXSwKLSAgICB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGUtPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHR5cGUtPm9uZW9mX2RlY2woaSktPmZpZWxkKGopOwotICAgICAgdm9pZCogZmllbGRfcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KAotICAgICAgICAgIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2UpICsgb2Zmc2V0c1tmaWVsZC0+aW5kZXgoKV07Ci0gICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbmV3KGZpZWxkX3B0cikgVFlQRShmaWVsZC0+ZGVmYXVsdF92YWx1ZV8jI1RZUEUoKSk7ICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgSEFORExFX1RZUEUoSU5UMzIgLCBpbnQzMiApOwotICAgICAgICBIQU5ETEVfVFlQRShJTlQ2NCAsIGludDY0ICk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKEZMT0FUICwgZmxvYXQgKTsKLSAgICAgICAgSEFORExFX1RZUEUoQk9PTCAgLCBib29sICApOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgICAgICBuZXcoZmllbGRfcHRyKSBpbnQoZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICAgICAgIEFyZW5hU3RyaW5nUHRyKiBhc3AgPSBuZXcgKGZpZWxkX3B0cikgQXJlbmFTdHJpbmdQdHIoKTsKLSAgICAgICAgICAgICAgYXNwLT5VbnNhZmVTZXREZWZhdWx0KCZmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgICAgbmV3KGZpZWxkX3B0cikgTWVzc2FnZSooTlVMTCk7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBEeW5hbWljTWVzc2FnZUZhY3Rvcnk6OkRlbGV0ZURlZmF1bHRPbmVvZkluc3RhbmNlKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUsCi0gICAgY29uc3QgaW50IG9mZnNldHNbXSwKLSAgICB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGUtPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgewotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IHR5cGUtPm9uZW9mX2RlY2woaSktPmZpZWxkKGopOwotICAgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKLSAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNzRjZDdkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIERlZmluZXMgYW4gaW1wbGVtZW50YXRpb24gb2YgTWVzc2FnZSB3aGljaCBjYW4gZW11bGF0ZSB0eXBlcyB3aGljaCBhcmUgbm90Ci0vLyBrbm93biBhdCBjb21waWxlLXRpbWUuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0RZTkFNSUNfTUVTU0FHRV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0RZTkFNSUNfTUVTU0FHRV9IX18KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLS8vIERlZmluZWQgaW4gb3RoZXIgZmlsZXMuCi1jbGFzcyBEZXNjcmlwdG9yOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCi1jbGFzcyBEZXNjcmlwdG9yUG9vbDsgICAgLy8gZGVzY3JpcHRvci5oCi0KLS8vIENvbnN0cnVjdHMgaW1wbGVtZW50YXRpb25zIG9mIE1lc3NhZ2Ugd2hpY2ggY2FuIGVtdWxhdGUgdHlwZXMgd2hpY2ggYXJlIG5vdAotLy8ga25vd24gYXQgY29tcGlsZS10aW1lLgotLy8KLS8vIFNvbWV0aW1lcyB5b3Ugd2FudCB0byBiZSBhYmxlIHRvIG1hbmlwdWxhdGUgcHJvdG9jb2wgdHlwZXMgdGhhdCB5b3UgZG9uJ3QKLS8vIGtub3cgYWJvdXQgYXQgY29tcGlsZSB0aW1lLiAgSXQgd291bGQgYmUgbmljZSB0byBiZSBhYmxlIHRvIGNvbnN0cnVjdAotLy8gYSBNZXNzYWdlIG9iamVjdCB3aGljaCBpbXBsZW1lbnRzIHRoZSBtZXNzYWdlIHR5cGUgZ2l2ZW4gYnkgYW55IGFyYml0cmFyeQotLy8gRGVzY3JpcHRvci4gIER5bmFtaWNNZXNzYWdlIHByb3ZpZGVzIHRoaXMuCi0vLwotLy8gQXMgaXQgdHVybnMgb3V0LCBhIER5bmFtaWNNZXNzYWdlIG5lZWRzIHRvIGNvbnN0cnVjdCBleHRyYQotLy8gaW5mb3JtYXRpb24gYWJvdXQgaXRzIHR5cGUgaW4gb3JkZXIgdG8gb3BlcmF0ZS4gIE1vc3Qgb2YgdGhpcyBpbmZvcm1hdGlvbgotLy8gY2FuIGJlIHNoYXJlZCBiZXR3ZWVuIGFsbCBEeW5hbWljTWVzc2FnZXMgb2YgdGhlIHNhbWUgdHlwZS4gIEJ1dCwgY2FjaGluZwotLy8gdGhpcyBpbmZvcm1hdGlvbiBpbiBzb21lIHNvcnQgb2YgZ2xvYmFsIG1hcCB3b3VsZCBiZSBhIGJhZCBpZGVhLCBzaW5jZQotLy8gdGhlIGNhY2hlZCBpbmZvcm1hdGlvbiBmb3IgYSBwYXJ0aWN1bGFyIGRlc2NyaXB0b3IgY291bGQgb3V0bGl2ZSB0aGUKLS8vIGRlc2NyaXB0b3IgaXRzZWxmLiAgVG8gYXZvaWQgdGhpcyBwcm9ibGVtLCBEeW5hbWljTWVzc2FnZUZhY3RvcnkKLS8vIGVuY2Fwc3VsYXRlcyB0aGlzICJjYWNoZSIuICBBbGwgRHluYW1pY01lc3NhZ2VzIG9mIHRoZSBzYW1lIHR5cGUgY3JlYXRlZAotLy8gZnJvbSB0aGUgc2FtZSBmYWN0b3J5IHdpbGwgc2hhcmUgdGhlIHNhbWUgc3VwcG9ydCBkYXRhLiAgQW55IERlc2NyaXB0b3JzCi0vLyB1c2VkIHdpdGggYSBwYXJ0aWN1bGFyIGZhY3RvcnkgbXVzdCBvdXRsaXZlIHRoZSBmYWN0b3J5LgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIER5bmFtaWNNZXNzYWdlRmFjdG9yeSA6IHB1YmxpYyBNZXNzYWdlRmFjdG9yeSB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3QgYSBEeW5hbWljTWVzc2FnZUZhY3RvcnkgdGhhdCB3aWxsIHNlYXJjaCBmb3IgZXh0ZW5zaW9ucyBpbgotICAvLyB0aGUgRGVzY3JpcHRvclBvb2wgaW4gd2hpY2ggdGhlIGV4dGVuZGVlIGlzIGRlZmluZWQuCi0gIER5bmFtaWNNZXNzYWdlRmFjdG9yeSgpOwotCi0gIC8vIENvbnN0cnVjdCBhIER5bmFtaWNNZXNzYWdlRmFjdG9yeSB0aGF0IHdpbGwgc2VhcmNoIGZvciBleHRlbnNpb25zIGluCi0gIC8vIHRoZSBnaXZlbiBEZXNjcmlwdG9yUG9vbC4KLSAgLy8KLSAgLy8gREVQUkVDQVRFRDogIFVzZSBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeSgpIHRvIHRlbGwgdGhlCi0gIC8vICAgcGFyc2VyIHRvIGxvb2sgZm9yIGV4dGVuc2lvbnMgaW4gYW4gYWx0ZXJuYXRlIHBvb2wuICBIb3dldmVyLCBub3RlIHRoYXQKLSAgLy8gICB0aGlzIGlzIGFsbW9zdCBuZXZlciB3aGF0IHlvdSB3YW50IHRvIGRvLiAgQWxtb3N0IGFsbCB1c2VycyBzaG91bGQgdXNlCi0gIC8vICAgdGhlIHplcm8tYXJnIGNvbnN0cnVjdG9yLgotICBEeW5hbWljTWVzc2FnZUZhY3RvcnkoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wpOwotCi0gIH5EeW5hbWljTWVzc2FnZUZhY3RvcnkoKTsKLQotICAvLyBDYWxsIHRoaXMgdG8gdGVsbCB0aGUgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHRoYXQgaWYgaXQgaXMgZ2l2ZW4gYQotICAvLyBEZXNjcmlwdG9yIGQgZm9yIHdoaWNoOgotICAvLyAgIGQtPmZpbGUoKS0+cG9vbCgpID09IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAvLyB0aGVuIGl0IHNob3VsZCBkZWxlZ2F0ZSB0byBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSBpbnN0ZWFkCi0gIC8vIG9mIGNvbnN0cnVjdGluZyBhIGR5bmFtaWMgaW1wbGVtZW50YXRpb24gb2YgdGhlIG1lc3NhZ2UuICBJbiB0aGVvcnkgdGhlcmUKLSAgLy8gaXMgbm8gZG93biBzaWRlIHRvIGRvaW5nIHRoaXMsIHNvIGl0IG1heSBiZWNvbWUgdGhlIGRlZmF1bHQgaW4gdGhlIGZ1dHVyZS4KLSAgdm9pZCBTZXREZWxlZ2F0ZVRvR2VuZXJhdGVkRmFjdG9yeShib29sIGVuYWJsZSkgewotICAgIGRlbGVnYXRlX3RvX2dlbmVyYXRlZF9mYWN0b3J5XyA9IGVuYWJsZTsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgTWVzc2FnZUZhY3RvcnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gR2l2ZW4gYSBEZXNjcmlwdG9yLCBjb25zdHJ1Y3RzIHRoZSBkZWZhdWx0IChwcm90b3R5cGUpIE1lc3NhZ2Ugb2YgdGhhdAotICAvLyB0eXBlLiAgWW91IGNhbiB0aGVuIGNhbGwgdGhhdCBtZXNzYWdlJ3MgTmV3KCkgbWV0aG9kIHRvIGNvbnN0cnVjdCBhCi0gIC8vIG11dGFibGUgbWVzc2FnZSBvZiB0aGF0IHR5cGUuCi0gIC8vCi0gIC8vIENhbGxpbmcgdGhpcyBtZXRob2QgdHdpY2Ugd2l0aCB0aGUgc2FtZSBEZXNjcmlwdG9yIHJldHVybnMgdGhlIHNhbWUKLSAgLy8gb2JqZWN0LiAgVGhlIHJldHVybmVkIG9iamVjdCByZW1haW5zIHByb3BlcnR5IG9mIHRoZSBmYWN0b3J5IGFuZCB3aWxsCi0gIC8vIGJlIGRlc3Ryb3llZCB3aGVuIHRoZSBmYWN0b3J5IGlzIGRlc3Ryb3llZC4gIEFsc28sIGFueSBvYmplY3RzIGNyZWF0ZWQKLSAgLy8gYnkgY2FsbGluZyB0aGUgcHJvdG90eXBlJ3MgTmV3KCkgbWV0aG9kIHNoYXJlIHNvbWUgZGF0YSB3aXRoIHRoZQotICAvLyBwcm90b3R5cGUsIHNvIHRoZXNlIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSB0aGUgRHluYW1pY01lc3NhZ2VGYWN0b3J5Ci0gIC8vIGlzIGRlc3Ryb3llZC4KLSAgLy8KLSAgLy8gVGhlIGdpdmVuIGRlc2NyaXB0b3IgbXVzdCBvdXRsaXZlIHRoZSByZXR1cm5lZCBtZXNzYWdlLCBhbmQgaGVuY2UgbXVzdAotICAvLyBvdXRsaXZlIHRoZSBEeW5hbWljTWVzc2FnZUZhY3RvcnkuCi0gIC8vCi0gIC8vIFRoZSBtZXRob2QgaXMgdGhyZWFkLXNhZmUuCi0gIGNvbnN0IE1lc3NhZ2UqIEdldFByb3RvdHlwZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlKTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sXzsKLSAgYm9vbCBkZWxlZ2F0ZV90b19nZW5lcmF0ZWRfZmFjdG9yeV87Ci0KLSAgLy8gVGhpcyBzdHJ1Y3QganVzdCBjb250YWlucyBhIGhhc2hfbWFwLiAgV2UgY2FuJ3QgI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+IGZyb20KLSAgLy8gdGhpcyBoZWFkZXIgZHVlIHRvIGhhY2tzIG5lZWRlZCBmb3IgaGFzaF9tYXAgcG9ydGFiaWxpdHkgaW4gdGhlIG9wZW4gc291cmNlCi0gIC8vIHJlbGVhc2UuICBOYW1lbHksIHN0dWJzL2hhc2guaCwgd2hpY2ggZGVmaW5lcyBoYXNoX21hcCBwb3J0YWJseSwgaXMgbm90IGEKLSAgLy8gcHVibGljIGhlYWRlciAoZm9yIGdvb2QgcmVhc29uKSwgYnV0IGR5bmFtaWNfbWVzc2FnZS5oIGlzLCBhbmQgcHVibGljCi0gIC8vIGhlYWRlcnMgbWF5IG9ubHkgI2luY2x1ZGUgb3RoZXIgcHVibGljIGhlYWRlcnMuCi0gIHN0cnVjdCBQcm90b3R5cGVNYXA7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8UHJvdG90eXBlTWFwPiBwcm90b3R5cGVzXzsKLSAgbXV0YWJsZSBNdXRleCBwcm90b3R5cGVzX211dGV4XzsKLQotICBmcmllbmQgY2xhc3MgRHluYW1pY01lc3NhZ2U7Ci0gIGNvbnN0IE1lc3NhZ2UqIEdldFByb3RvdHlwZU5vTG9jayhjb25zdCBEZXNjcmlwdG9yKiB0eXBlKTsKLQotICAvLyBDb25zdHJ1Y3QgZGVmYXVsdCBvbmVvZiBpbnN0YW5jZSBmb3IgcmVmbGVjdGlvbiB1c2FnZSBpZiBvbmVvZgotICAvLyBpcyBkZWZpbmVkLgotICBzdGF0aWMgdm9pZCBDb25zdHJ1Y3REZWZhdWx0T25lb2ZJbnN0YW5jZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlKTsKLSAgLy8gRGVsZXRlIGRlZmF1bHQgb25lb2YgaW5zdGFuY2UuIENhbGxlZCBieSB+RHluYW1pY01lc3NhZ2VGYWN0b3J5LgotICBzdGF0aWMgdm9pZCBEZWxldGVEZWZhdWx0T25lb2ZJbnN0YW5jZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlKTsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRHluYW1pY01lc3NhZ2VGYWN0b3J5KTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9EWU5BTUlDX01FU1NBR0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MGU0MzdkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBTaW5jZSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UgZm9yIER5bmFtaWNNZXNzYWdlIGlzIGltcGxlbWVudGVkIGJ5Ci0vLyBHZW5lcmljTWVzc2FnZVJlZmxlY3Rpb24sIHRoZSBvbmx5IHRoaW5nIHdlIHJlYWxseSBoYXZlIHRvIHRlc3QgaXMKLS8vIHRoYXQgRHluYW1pY01lc3NhZ2UgY29ycmVjdGx5IHNldHMgdXAgdGhlIGluZm9ybWF0aW9uIHRoYXQKLS8vIEdlbmVyaWNNZXNzYWdlUmVmbGVjdGlvbiBuZWVkcyB0byB1c2UuICBTbywgd2UgZm9jdXMgb24gdGhhdCBpbiB0aGlzCi0vLyB0ZXN0LiAgT3RoZXIgdGVzdHMsIHN1Y2ggYXMgZ2VuZXJpY19tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QgYW5kCi0vLyByZWZsZWN0aW9uX29wc191bml0dGVzdCwgY292ZXIgdGhlIHJlc3Qgb2YgdGhlIGZ1bmN0aW9uYWxpdHkgdXNlZCBieQotLy8gRHluYW1pY01lc3NhZ2UuCi0KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2NvcGVkX3B0ci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucGIuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotY2xhc3MgRHluYW1pY01lc3NhZ2VUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgRGVzY3JpcHRvclBvb2wgcG9vbF87Ci0gIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5XzsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuc2lvbnNfZGVzY3JpcHRvcl87Ci0gIGNvbnN0IE1lc3NhZ2UqIGV4dGVuc2lvbnNfcHJvdG90eXBlXzsKLSAgY29uc3QgRGVzY3JpcHRvciogcGFja2VkX2Rlc2NyaXB0b3JfOwotICBjb25zdCBNZXNzYWdlKiBwYWNrZWRfcHJvdG90eXBlXzsKLSAgY29uc3QgRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcl87Ci0gIGNvbnN0IE1lc3NhZ2UqIG9uZW9mX3Byb3RvdHlwZV87Ci0gIGNvbnN0IERlc2NyaXB0b3IqIHByb3RvM19kZXNjcmlwdG9yXzsKLSAgY29uc3QgTWVzc2FnZSogcHJvdG8zX3Byb3RvdHlwZV87Ci0KLSAgRHluYW1pY01lc3NhZ2VUZXN0KCk6IGZhY3RvcnlfKCZwb29sXykge30KLQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgLy8gV2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCBEeW5hbWljTWVzc2FnZSB3b3JrcyAocGFydGljdWxhcmx5IHdpdGgKLSAgICAvLyBleHRlbnNpb25zKSBldmVuIGlmIHdlIHVzZSBkZXNjcmlwdG9ycyB0aGF0IGFyZSAqbm90KiBmcm9tIGNvbXBpbGVkLWluCi0gICAgLy8gdHlwZXMsIHNvIHdlIG1ha2UgY29waWVzIG9mIHRoZSBkZXNjcmlwdG9ycyBmb3IgdW5pdHRlc3QucHJvdG8gYW5kCi0gICAgLy8gdW5pdHRlc3RfaW1wb3J0LnByb3RvLgotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5pdHRlc3RfZmlsZTsKLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIHVuaXR0ZXN0X2ltcG9ydF9maWxlOwotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19maWxlOwotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2VfZmlsZTsKLQotICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJnVuaXR0ZXN0X2ZpbGUpOwotICAgIHVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygKLSAgICAgICZ1bml0dGVzdF9pbXBvcnRfZmlsZSk7Ci0gICAgdW5pdHRlc3RfaW1wb3J0OjpQdWJsaWNJbXBvcnRNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKAotICAgICAgJnVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfZmlsZSk7Ci0gICAgcHJvdG8yX25vZmllbGRwcmVzZW5jZV91bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPgotICAgICAgICBmaWxlKCktPkNvcHlUbygmdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2VfZmlsZSk7Ci0KLSAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3RfaW1wb3J0X3B1YmxpY19maWxlKSAhPSBOVUxMKTsKLSAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3RfaW1wb3J0X2ZpbGUpICE9IE5VTEwpOwotICAgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZSh1bml0dGVzdF9maWxlKSAhPSBOVUxMKTsKLSAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2VfZmlsZSkgIT0gTlVMTCk7Ci0KLSAgICBkZXNjcmlwdG9yXyA9IHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIik7Ci0gICAgQVNTRVJUX1RSVUUoZGVzY3JpcHRvcl8gIT0gTlVMTCk7Ci0gICAgcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShkZXNjcmlwdG9yXyk7Ci0KLSAgICBleHRlbnNpb25zX2Rlc2NyaXB0b3JfID0KLSAgICAgIHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbEV4dGVuc2lvbnMiKTsKLSAgICBBU1NFUlRfVFJVRShleHRlbnNpb25zX2Rlc2NyaXB0b3JfICE9IE5VTEwpOwotICAgIGV4dGVuc2lvbnNfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShleHRlbnNpb25zX2Rlc2NyaXB0b3JfKTsKLQotICAgIHBhY2tlZF9kZXNjcmlwdG9yXyA9Ci0gICAgICBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNrZWRUeXBlcyIpOwotICAgIEFTU0VSVF9UUlVFKHBhY2tlZF9kZXNjcmlwdG9yXyAhPSBOVUxMKTsKLSAgICBwYWNrZWRfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShwYWNrZWRfZGVzY3JpcHRvcl8pOwotCi0gICAgb25lb2ZfZGVzY3JpcHRvcl8gPQotICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0T25lb2YyIik7Ci0gICAgQVNTRVJUX1RSVUUob25lb2ZfZGVzY3JpcHRvcl8gIT0gTlVMTCk7Ci0gICAgb25lb2ZfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShvbmVvZl9kZXNjcmlwdG9yXyk7Ci0KLSAgICBwcm90bzNfZGVzY3JpcHRvcl8gPQotICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKAotICAgICAgICAgICJwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpOwotICAgIEFTU0VSVF9UUlVFKHByb3RvM19kZXNjcmlwdG9yXyAhPSBOVUxMKTsKLSAgICBwcm90bzNfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShwcm90bzNfZGVzY3JpcHRvcl8pOwotICB9Ci19OwotCi1URVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBEZXNjcmlwdG9yKSB7Ci0gIC8vIENoZWNrIHRoYXQgdGhlIGRlc2NyaXB0b3Igb24gdGhlIER5bmFtaWNNZXNzYWdlIG1hdGNoZXMgdGhlIGRlc2NyaXB0b3IKLSAgLy8gcGFzc2VkIHRvIEdldFByb3RvdHlwZSgpLgotICBFWFBFQ1RfRVEocHJvdG90eXBlXy0+R2V0RGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yXyk7Ci19Ci0KLVRFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIE9uZVByb3RvdHlwZSkgewotICAvLyBDaGVjayB0aGF0IHJlcXVlc3RpbmcgdGhlIHNhbWUgcHJvdG90eXBlIHR3aWNlIHByb2R1Y2VzIHRoZSBzYW1lIG9iamVjdC4KLSAgRVhQRUNUX0VRKHByb3RvdHlwZV8sIGZhY3RvcnlfLkdldFByb3RvdHlwZShkZXNjcmlwdG9yXykpOwotfQotCi1URVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBEZWZhdWx0cykgewotICAvLyBDaGVjayB0aGF0IGFsbCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgaW5pdGlhbCBtZXNzYWdlLgotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihkZXNjcmlwdG9yXyk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdENsZWFyVmlhUmVmbGVjdGlvbigqcHJvdG90eXBlXyk7Ci19Ci0KLVRFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIEluZGVwZW5kZW50T2Zmc2V0cykgewotICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSBpbmRlcGVuZGVudCBvZmZzZXRzIGJ5IHNldHRpbmcgZWFjaAotICAvLyBvbmUgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBjaGVja2luZyB0aGF0IHRoZXkgYWxsIHN0aWxsIGhhdmUgdGhvc2UKLSAgLy8gdW5pcXVlIHZhbHVlcyAoaS5lLiB0aGV5IGRvbid0IHN0b21wIGVhY2ggb3RoZXIpLgotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UocHJvdG90eXBlXy0+TmV3KCkpOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihkZXNjcmlwdG9yXyk7Ci0KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlLmdldCgpKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbigqbWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIEV4dGVuc2lvbnMpIHsKLSAgLy8gQ2hlY2sgdGhhdCBleHRlbnNpb25zIHdvcmsuCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShleHRlbnNpb25zX3Byb3RvdHlwZV8tPk5ldygpKTsKLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZXh0ZW5zaW9uc19kZXNjcmlwdG9yXyk7Ci0KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlLmdldCgpKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbigqbWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIFBhY2tlZEZpZWxkcykgewotICAvLyBDaGVjayB0aGF0IHBhY2tlZCBmaWVsZHMgd29yayBwcm9wZXJseS4KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKHBhY2tlZF9wcm90b3R5cGVfLT5OZXcoKSk7Ci0gIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKHBhY2tlZF9kZXNjcmlwdG9yXyk7Ci0KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihtZXNzYWdlLmdldCgpKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbigqbWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIE9uZW9mKSB7Ci0gIC8vIENoZWNrIHRoYXQgb25lb2YgZmllbGRzIHdvcmsgcHJvcGVybHkuCi0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShvbmVvZl9wcm90b3R5cGVfLT5OZXcoKSk7Ci0KLSAgLy8gQ2hlY2sgZGVmYXVsdCB2YWx1ZXMuCi0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRJbnQzMigKLSAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19pbnQiKSkpOwotICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmciKSkpOwotICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19jb3JkIikpKTsKLSAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fc3RyaW5nX3BpZWNlIikpKTsKLSAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fYnl0ZXMiKSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTywgcmVmbGVjdGlvbi0+R2V0RW51bSgKLSAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19lbnVtIikpLT5udW1iZXIoKSk7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG5lc3RlZF9kZXNjcmlwdG9yOwotICBjb25zdCBNZXNzYWdlKiBuZXN0ZWRfcHJvdG90eXBlOwotICBuZXN0ZWRfZGVzY3JpcHRvciA9Ci0gICAgICBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZSIpOwotICBuZXN0ZWRfcHJvdG90eXBlID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKG5lc3RlZF9kZXNjcmlwdG9yKTsKLSAgRVhQRUNUX0VRKG5lc3RlZF9wcm90b3R5cGUsCi0gICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKSk7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGZvb2dyb3VwX2Rlc2NyaXB0b3I7Ci0gIGNvbnN0IE1lc3NhZ2UqIGZvb2dyb3VwX3Byb3RvdHlwZTsKLSAgZm9vZ3JvdXBfZGVzY3JpcHRvciA9Ci0gICAgICBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVvZjIuRm9vR3JvdXAiKTsKLSAgZm9vZ3JvdXBfcHJvdG90eXBlID0gZmFjdG9yeV8uR2V0UHJvdG90eXBlKGZvb2dyb3VwX2Rlc2NyaXB0b3IpOwotICBFWFBFQ1RfRVEoZm9vZ3JvdXBfcHJvdG90eXBlLAotICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vZ3JvdXAiKSkpOwotICBFWFBFQ1RfTkUoZm9vZ3JvdXBfcHJvdG90eXBlLAotICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKSk7Ci0gIEVYUEVDVF9FUSg1LCByZWZsZWN0aW9uLT5HZXRJbnQzMigKLSAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9pbnQiKSkpOwotICBFWFBFQ1RfRVEoIlNUUklORyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9zdHJpbmciKSkpOwotICBFWFBFQ1RfRVEoIkNPUkQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpKSk7Ci0gIEVYUEVDVF9FUSgiU1BJRUNFIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAotICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZ19waWVjZSIpKSk7Ci0gIEVYUEVDVF9FUSgiQllURVMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfYnl0ZXMiKSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkJBUiwgcmVmbGVjdGlvbi0+R2V0RW51bSgKLSAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9lbnVtIikpLT5udW1iZXIoKSk7Ci0KLSAgLy8gQ2hlY2sgc2V0IGZ1bmN0aW9ucy4KLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIob25lb2ZfZGVzY3JpcHRvcl8pOwotICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRPbmVvZlZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE9uZW9mU2V0VmlhUmVmbGVjdGlvbigqbWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihEeW5hbWljTWVzc2FnZVRlc3QsIFNwYWNlVXNlZCkgewotICAvLyBUZXN0IHRoYXQgU3BhY2VVc2VkKCkgd29ya3MgcHJvcGVybHkKLQotICAvLyBTaW5jZSB3ZSBzaGFyZSB0aGUgaW1wbGVtZW50YXRpb24gd2l0aCBnZW5lcmF0ZWQgbWVzc2FnZXMsIHdlIGRvbid0IG5lZWQKLSAgLy8gdG8gdGVzdCB2ZXJ5IG11Y2ggaGVyZS4gIEp1c3QgbWFrZSBzdXJlIGl0IGFwcGVhcnMgdG8gYmUgd29ya2luZy4KLQotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UocHJvdG90eXBlXy0+TmV3KCkpOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihkZXNjcmlwdG9yXyk7Ci0KLSAgaW50IGluaXRpYWxfc3BhY2VfdXNlZCA9IG1lc3NhZ2UtPlNwYWNlVXNlZCgpOwotCi0gIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7Ci0gIEVYUEVDVF9MVChpbml0aWFsX3NwYWNlX3VzZWQsIG1lc3NhZ2UtPlNwYWNlVXNlZCgpKTsKLX0KLQotVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgQXJlbmEpIHsKLSAgQXJlbmEgYXJlbmE7Ci0gIE1lc3NhZ2UqIG1lc3NhZ2UgPSBwcm90b3R5cGVfLT5OZXcoJmFyZW5hKTsKLSAgKHZvaWQpbWVzc2FnZTsgIC8vIGF2b2lkIHVudXNlZC12YXJpYWJsZSBlcnJvci4KLSAgLy8gUmV0dXJuIHdpdGhvdXQgZnJlZWluZzogc2hvdWxkIG5vdCBsZWFrLgotfQotCi1URVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBQcm90bzMpIHsKLSAgTWVzc2FnZSogbWVzc2FnZSA9IHByb3RvM19wcm90b3R5cGVfLT5OZXcoKTsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbCA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzYyA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKLQotICAvLyBKdXN0IHRlc3QgYSBzaW5nbGUgcHJpbXRpdmUgYW5kIHNpbmdsZSBtZXNzYWdlIGZpZWxkIGhlcmUgdG8gbWFrZSBzdXJlIHdlCi0gIC8vIGFyZSBnZXR0aW5nIHRoZSBuby1maWVsZC1wcmVzZW5jZSBzZW1hbnRpY3MgZWxzZXdoZXJlLiBEeW5hbWljTWVzc2FnZSB1c2VzCi0gIC8vIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIHVuZGVyIHRoZSBob29kLCBzbyB0aGUgcmVzdCBzaG91bGQgYmUgZmluZSBhcwotICAvLyBsb25nIGFzIEdNUiByZWNvZ25pemVzIHRoYXQgd2UncmUgdXNpbmcgYSBwcm90bzMgbWVzc2FnZS4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25hbF9pbnQzMiA9Ci0gICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3B0aW9uYWxfbXNnID0KLSAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKLSAgRVhQRUNUX1RSVUUob3B0aW9uYWxfaW50MzIgIT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG9wdGlvbmFsX21zZyAhPSBOVUxMKTsKLQotICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmwtPkhhc0ZpZWxkKCptZXNzYWdlLCBvcHRpb25hbF9pbnQzMikpOwotICByZWZsLT5TZXRJbnQzMihtZXNzYWdlLCBvcHRpb25hbF9pbnQzMiwgNDIpOwotICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbC0+SGFzRmllbGQoKm1lc3NhZ2UsIG9wdGlvbmFsX2ludDMyKSk7Ci0gIHJlZmwtPlNldEludDMyKG1lc3NhZ2UsIG9wdGlvbmFsX2ludDMyLCAwKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCByZWZsLT5IYXNGaWVsZCgqbWVzc2FnZSwgb3B0aW9uYWxfaW50MzIpKTsKLQotICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmwtPkhhc0ZpZWxkKCptZXNzYWdlLCBvcHRpb25hbF9tc2cpKTsKLSAgcmVmbC0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgb3B0aW9uYWxfbXNnKTsKLSAgRVhQRUNUX0VRKHRydWUsIHJlZmwtPkhhc0ZpZWxkKCptZXNzYWdlLCBvcHRpb25hbF9tc2cpKTsKLSAgZGVsZXRlIHJlZmwtPlJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIG9wdGlvbmFsX21zZyk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgcmVmbC0+SGFzRmllbGQoKm1lc3NhZ2UsIG9wdGlvbmFsX21zZykpOwotCi0gIC8vIEFsc28gZW5zdXJlIHRoYXQgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaGFuZGxlcyBmaWVsZCBwcmVzZW5jZSBwcm9wZXJseS4KLSAgRVhQRUNUX0VRKGZhbHNlLCByZWZsLT5IYXNGaWVsZCgqcHJvdG8zX3Byb3RvdHlwZV8sIG9wdGlvbmFsX21zZykpOwotCi0gIGRlbGV0ZSBtZXNzYWdlOwotfQotCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YWZiMjM2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYworKysgL2Rldi9udWxsCkBAIC0xLDE4MTUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLW5hbWVzcGFjZSB7Ci0KLWlubGluZSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIHJlYWxfdHlwZShGaWVsZFR5cGUgdHlwZSkgewotICBHT09HTEVfRENIRUNLKHR5cGUgPiAwICYmIHR5cGUgPD0gV2lyZUZvcm1hdExpdGU6Ok1BWF9GSUVMRF9UWVBFKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KHR5cGUpOwotfQotCi1pbmxpbmUgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUgY3BwX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKLSAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGVUb0NwcFR5cGUocmVhbF90eXBlKHR5cGUpKTsKLX0KLQotaW5saW5lIGJvb2wgaXNfcGFja2FibGUoV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOgotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ6Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMjoKLSAgICAgIHJldHVybiB0cnVlOwotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQOgotICAgICAgcmV0dXJuIGZhbHNlOwotCi0gICAgLy8gRG8gbm90IGFkZCBhIGRlZmF1bHQgc3RhdGVtZW50LiBMZXQgdGhlIGNvbXBpbGVyIGNvbXBsYWluIHdoZW4gc29tZW9uZQotICAgIC8vIGFkZHMgYSBuZXcgd2lyZSB0eXBlLgotICB9Ci0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJjYW4ndCByZWFjaCBoZXJlLiI7Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotLy8gUmVnaXN0cnkgc3R1ZmYuCi10eXBlZGVmIGhhc2hfbWFwPHBhaXI8Y29uc3QgTWVzc2FnZUxpdGUqLCBpbnQ+LAotICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvPiBFeHRlbnNpb25SZWdpc3RyeTsKLUV4dGVuc2lvblJlZ2lzdHJ5KiByZWdpc3RyeV8gPSBOVUxMOwotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZWdpc3RyeV9pbml0Xyk7Ci0KLXZvaWQgRGVsZXRlUmVnaXN0cnkoKSB7Ci0gIGRlbGV0ZSByZWdpc3RyeV87Ci0gIHJlZ2lzdHJ5XyA9IE5VTEw7Ci19Ci0KLXZvaWQgSW5pdFJlZ2lzdHJ5KCkgewotICByZWdpc3RyeV8gPSBuZXcgRXh0ZW5zaW9uUmVnaXN0cnk7Ci0gIE9uU2h1dGRvd24oJkRlbGV0ZVJlZ2lzdHJ5KTsKLX0KLQotLy8gVGhpcyBmdW5jdGlvbiBpcyBvbmx5IGNhbGxlZCBhdCBzdGFydHVwLCBzbyB0aGVyZSBpcyBubyBuZWVkIGZvciB0aHJlYWQtCi0vLyBzYWZldHkuCi12b2lkIFJlZ2lzdGVyKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgIGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8gaW5mbykgewotICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZyZWdpc3RyeV9pbml0XywgJkluaXRSZWdpc3RyeSk7Ci0KLSAgaWYgKCFJbnNlcnRJZk5vdFByZXNlbnQocmVnaXN0cnlfLCBzdGQ6Om1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIG51bWJlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGluZm8pKSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk11bHRpcGxlIGV4dGVuc2lvbiByZWdpc3RyYXRpb25zIGZvciB0eXBlIFwiIgotICAgICAgICAgICAgICAgPDwgY29udGFpbmluZ190eXBlLT5HZXRUeXBlTmFtZSgpCi0gICAgICAgICAgICAgICA8PCAiXCIsIGZpZWxkIG51bWJlciAiIDw8IG51bWJlciA8PCAiLiI7Ci0gIH0KLX0KLQotY29uc3QgRXh0ZW5zaW9uSW5mbyogRmluZFJlZ2lzdGVyZWRFeHRlbnNpb24oCi0gICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwgaW50IG51bWJlcikgewotICByZXR1cm4gKHJlZ2lzdHJ5XyA9PSBOVUxMKQotICAgICAgICAgICAgID8gTlVMTAotICAgICAgICAgICAgIDogRmluZE9yTnVsbCgqcmVnaXN0cnlfLCBzdGQ6Om1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIG51bWJlcikpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotRXh0ZW5zaW9uRmluZGVyOjp+RXh0ZW5zaW9uRmluZGVyKCkge30KLQotYm9vbCBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXI6OkZpbmQoaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyogb3V0cHV0KSB7Ci0gIGNvbnN0IEV4dGVuc2lvbkluZm8qIGV4dGVuc2lvbiA9Ci0gICAgICBGaW5kUmVnaXN0ZXJlZEV4dGVuc2lvbihjb250YWluaW5nX3R5cGVfLCBudW1iZXIpOwotICBpZiAoZXh0ZW5zaW9uID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgKm91dHB1dCA9ICpleHRlbnNpb247Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLX0KLQotdm9pZCBFeHRlbnNpb25TZXQ6OlJlZ2lzdGVyRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQpIHsKLSAgR09PR0xFX0NIRUNLX05FKHR5cGUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0pOwotICBHT09HTEVfQ0hFQ0tfTkUodHlwZSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSk7Ci0gIEdPT0dMRV9DSEVDS19ORSh0eXBlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUCk7Ci0gIEV4dGVuc2lvbkluZm8gaW5mbyh0eXBlLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKTsKLSAgUmVnaXN0ZXIoY29udGFpbmluZ190eXBlLCBudW1iZXIsIGluZm8pOwotfQotCi1zdGF0aWMgYm9vbCBDYWxsTm9BcmdWYWxpZGl0eUZ1bmMoY29uc3Qgdm9pZCogYXJnLCBpbnQgbnVtYmVyKSB7Ci0gIC8vIE5vdGU6ICBNdXN0IHVzZSBDLXN0eWxlIGNhc3QgaGVyZSByYXRoZXIgdGhhbiByZWludGVycHJldF9jYXN0IGJlY2F1c2UKLSAgLy8gICB0aGUgQysrIHN0YW5kYXJkIGF0IG9uZSBwb2ludCBkaWQgbm90IGFsbG93IGNhc3RzIGJldHdlZW4gZnVuY3Rpb24gYW5kCi0gIC8vICAgZGF0YSBwb2ludGVycyBhbmQgc29tZSBjb21waWxlcnMgZW5mb3JjZSB0aGlzIGZvciBDKystc3R5bGUgY2FzdHMuICBObwotICAvLyAgIGNvbXBpbGVyIGVuZm9yY2VzIGl0IGZvciBDLXN0eWxlIGNhc3RzIHNpbmNlIGxvdHMgb2YgQy1zdHlsZSBjb2RlIGhhcwotICAvLyAgIHJlbGllZCBvbiB0aGVzZSBraW5kcyBvZiBjYXN0cyBmb3IgYSBsb25nIHRpbWUsIGRlc3BpdGUgYmVpbmcKLSAgLy8gICB0ZWNobmljYWxseSB1bmRlZmluZWQuICBTZWU6Ci0gIC8vICAgICBodHRwOi8vd3d3Lm9wZW4tc3RkLm9yZy9qdGMxL3NjMjIvd2cyMS9kb2NzL2N3Z19kZWZlY3RzLmh0bWwjMTk1Ci0gIC8vIEFsc28gbm90ZTogIFNvbWUgY29tcGlsZXJzIGRvIG5vdCBhbGxvdyBmdW5jdGlvbiBwb2ludGVycyB0byBiZSAiY29uc3QiLgotICAvLyAgIFdoaWNoIG1ha2VzIHNlbnNlLCBJIHN1cHBvc2UsIGJlY2F1c2UgaXQncyBtZWFuaW5nbGVzcy4KLSAgcmV0dXJuICgoRW51bVZhbGlkaXR5RnVuYyopYXJnKShudW1iZXIpOwotfQotCi12b2lkIEV4dGVuc2lvblNldDo6UmVnaXN0ZXJFbnVtRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcGVhdGVkLCBib29sIGlzX3BhY2tlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbGlkaXR5RnVuYyogaXNfdmFsaWQpIHsKLSAgR09PR0xFX0NIRUNLX0VRKHR5cGUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0pOwotICBFeHRlbnNpb25JbmZvIGluZm8odHlwZSwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk7Ci0gIGluZm8uZW51bV92YWxpZGl0eV9jaGVjay5mdW5jID0gQ2FsbE5vQXJnVmFsaWRpdHlGdW5jOwotICAvLyBTZWUgY29tbWVudCBpbiBDYWxsTm9BcmdWYWxpZGl0eUZ1bmMoKSBhYm91dCB3aHkgd2UgdXNlIGEgYy1zdHlsZSBjYXN0LgotICBpbmZvLmVudW1fdmFsaWRpdHlfY2hlY2suYXJnID0gKHZvaWQqKWlzX3ZhbGlkOwotICBSZWdpc3Rlcihjb250YWluaW5nX3R5cGUsIG51bWJlciwgaW5mbyk7Ci19Ci0KLXZvaWQgRXh0ZW5zaW9uU2V0OjpSZWdpc3Rlck1lc3NhZ2VFeHRlbnNpb24oY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlKSB7Ci0gIEdPT0dMRV9DSEVDSyh0eXBlID09IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UgfHwKLSAgICAgICAgdHlwZSA9PSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUCk7Ci0gIEV4dGVuc2lvbkluZm8gaW5mbyh0eXBlLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKTsKLSAgaW5mby5tZXNzYWdlX3Byb3RvdHlwZSA9IHByb3RvdHlwZTsKLSAgUmVnaXN0ZXIoY29udGFpbmluZ190eXBlLCBudW1iZXIsIGluZm8pOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIENvbnN0cnVjdG9ycyBhbmQgYmFzaWMgbWV0aG9kcy4KLQotRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb25TZXQoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIDogYXJlbmFfKGFyZW5hKSB7Ci0gIGlmIChhcmVuYV8gIT0gTlVMTCkgewotICAgIGFyZW5hXy0+T3duRGVzdHJ1Y3RvcigmZXh0ZW5zaW9uc18pOwotICB9Ci19Ci0KLUV4dGVuc2lvblNldDo6RXh0ZW5zaW9uU2V0KCkgOiBhcmVuYV8oTlVMTCkge30KLQotRXh0ZW5zaW9uU2V0Ojp+RXh0ZW5zaW9uU2V0KCkgewotICAvLyBEZWxldGVzIGFsbCBhbGxvY2F0ZWQgZXh0ZW5zaW9ucy4KLSAgaWYgKGFyZW5hXyA9PSBOVUxMKSB7Ci0gICAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKLSAgICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgewotICAgICAgaXRlci0+c2Vjb25kLkZyZWUoKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgotLy8gdm9pZCBFeHRlbnNpb25TZXQ6OkFwcGVuZFRvTGlzdChjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QKLQotYm9vbCBFeHRlbnNpb25TZXQ6OkhhcyhpbnQgbnVtYmVyKSBjb25zdCB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0gIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSByZXR1cm4gZmFsc2U7Ci0gIEdPT0dMRV9EQ0hFQ0soIWl0ZXItPnNlY29uZC5pc19yZXBlYXRlZCk7Ci0gIHJldHVybiAhaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQ7Ci19Ci0KLWludCBFeHRlbnNpb25TZXQ6Ok51bUV4dGVuc2lvbnMoKSBjb25zdCB7Ci0gIGludCByZXN1bHQgPSAwOwotICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgewotICAgIGlmICghaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQpIHsKLSAgICAgICsrcmVzdWx0OwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb25TaXplKGludCBudW1iZXIpIGNvbnN0IHsKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKLSAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIHJldHVybiBmYWxzZTsKLSAgcmV0dXJuIGl0ZXItPnNlY29uZC5HZXRTaXplKCk7Ci19Ci0KLUZpZWxkVHlwZSBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvblR5cGUoaW50IG51bWJlcikgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgewotICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiRG9uJ3QgbG9va3VwIGV4dGVuc2lvbiB0eXBlcyBpZiB0aGV5IGFyZW4ndCBwcmVzZW50ICgxKS4gIjsKLSAgICByZXR1cm4gMDsKLSAgfQotICBpZiAoaXRlci0+c2Vjb25kLmlzX2NsZWFyZWQpIHsKLSAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkRvbid0IGxvb2t1cCBleHRlbnNpb24gdHlwZXMgaWYgdGhleSBhcmVuJ3QgcHJlc2VudCAoMikuICI7Ci0gIH0KLSAgcmV0dXJuIGl0ZXItPnNlY29uZC50eXBlOwotfQotCi12b2lkIEV4dGVuc2lvblNldDo6Q2xlYXJFeHRlbnNpb24oaW50IG51bWJlcikgewotICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgcmV0dXJuOwotICBpdGVyLT5zZWNvbmQuQ2xlYXIoKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRmllbGQgYWNjZXNzb3JzCi0KLW5hbWVzcGFjZSB7Ci0KLWVudW0gQ2FyZGluYWxpdHkgewotICBSRVBFQVRFRCwKLSAgT1BUSU9OQUwKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfVFlQRShFWFRFTlNJT04sIExBQkVMLCBDUFBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBHT09HTEVfRENIRUNLX0VRKChFWFRFTlNJT04pLmlzX3JlcGVhdGVkID8gUkVQRUFURUQgOiBPUFRJT05BTCwgTEFCRUwpOyAgICAgICAgIFwKLSAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZSgoRVhURU5TSU9OKS50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNDUFBUWVBFKQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBQcmltaXRpdmVzCi0KLSNkZWZpbmUgUFJJTUlUSVZFX0FDQ0VTU09SUyhVUFBFUkNBU0UsIExPV0VSQ0FTRSwgQ0FNRUxDQVNFKSAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotTE9XRVJDQVNFIEV4dGVuc2lvblNldDo6R2V0IyNDQU1FTENBU0UoaW50IG51bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExPV0VSQ0FTRSBkZWZhdWx0X3ZhbHVlKSBjb25zdCB7ICAgICAgICBcCi0gIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7ICAgICAgICAgXAotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSB8fCBpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZCkgeyAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBVUFBFUkNBU0UpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIGl0ZXItPnNlY29uZC5MT1dFUkNBU0UjI192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdm9pZCBFeHRlbnNpb25TZXQ6OlNldCMjQ0FNRUxDQVNFKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMT1dFUkNBU0UgdmFsdWUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7ICAgICAgICAgXAotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0UpOyBcCi0gICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGV4dGVuc2lvbi0+TE9XRVJDQVNFIyNfdmFsdWUgPSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1MT1dFUkNBU0UgRXh0ZW5zaW9uU2V0OjpHZXRSZXBlYXRlZCMjQ0FNRUxDQVNFKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgeyAgXAotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOyAgICAgICAgIFwKLSAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsgXAotICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBSRVBFQVRFRCwgVVBQRVJDQVNFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJldHVybiBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGluZGV4KTsgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi12b2lkIEV4dGVuc2lvblNldDo6U2V0UmVwZWF0ZWQjI0NBTUVMQ0FTRSggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBudW1iZXIsIGludCBpbmRleCwgTE9XRVJDQVNFIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsgICAgICAgICAgICAgICBcCi0gIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7IFwKLSAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+U2V0KGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdm9pZCBFeHRlbnNpb25TZXQ6OkFkZCMjQ0FNRUxDQVNFKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhY2tlZCwgTE9XRVJDQVNFIHZhbHVlLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7ICAgICAgICAgXAotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0UpOyBcCi0gICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gcGFja2VkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihhcmVuYV8pOyAgICAgICAgICAgICAgICAgXAotICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIHBhY2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkFkZCh2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0KLQotUFJJTUlUSVZFX0FDQ0VTU09SUyggSU5UMzIsICBpbnQzMiwgIEludDMyKQotUFJJTUlUSVZFX0FDQ0VTU09SUyggSU5UNjQsICBpbnQ2NCwgIEludDY0KQotUFJJTUlUSVZFX0FDQ0VTU09SUyhVSU5UMzIsIHVpbnQzMiwgVUludDMyKQotUFJJTUlUSVZFX0FDQ0VTU09SUyhVSU5UNjQsIHVpbnQ2NCwgVUludDY0KQotUFJJTUlUSVZFX0FDQ0VTU09SUyggRkxPQVQsICBmbG9hdCwgIEZsb2F0KQotUFJJTUlUSVZFX0FDQ0VTU09SUyhET1VCTEUsIGRvdWJsZSwgRG91YmxlKQotUFJJTUlUSVZFX0FDQ0VTU09SUyggIEJPT0wsICAgYm9vbCwgICBCb29sKQotCi0jdW5kZWYgUFJJTUlUSVZFX0FDQ0VTU09SUwotCi1jb25zdCB2b2lkKiBFeHRlbnNpb25TZXQ6OkdldFJhd1JlcGVhdGVkRmllbGQoaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkZWZhdWx0X3ZhbHVlKSBjb25zdCB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0gIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSB7Ci0gICAgcmV0dXJuIGRlZmF1bHRfdmFsdWU7Ci0gIH0KLSAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIHRoZSBSZXBlYXRlZEZpZWxkPD4qIHBvaW50ZXJzIGhhdmUgdGhlIHNhbWUKLSAgLy8gc2l6ZSBhbmQgYWxpZ25tZW50IHdpdGhpbiB0aGUgYW5vbnltb3VzIHVuaW9uIGluIEV4dGVuc2lvbi4KLSAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9pbnQzMl92YWx1ZTsKLX0KLQotdm9pZCogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwYWNrZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzYykgewotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKLQotICAvLyBXZSBpbnN0YW50aWF0ZSBhbiBlbXB0eSBSZXBlYXRlZHssUHRyfUZpZWxkIGlmIG9uZSBkb2Vzbid0IGV4aXN0IGZvciB0aGlzCi0gIC8vIGV4dGVuc2lvbi4KLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzYywgJmV4dGVuc2lvbikpIHsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKLSAgICBleHRlbnNpb24tPnR5cGUgPSBmaWVsZF90eXBlOwotICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gcGFja2VkOwotCi0gICAgc3dpdGNoIChXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlVG9DcHBUeXBlKAotICAgICAgICBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPihmaWVsZF90eXBlKSkpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50MzJfdmFsdWUgPQotICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQzMj4gPihhcmVuYV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfSU5UNjQ6Ci0gICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50NjRfdmFsdWUgPQotICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQ2ND4gPihhcmVuYV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDMyOgotICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3VpbnQzMl92YWx1ZSA9Ci0gICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPHVpbnQzMj4gPihhcmVuYV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDY0OgotICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3VpbnQ2NF92YWx1ZSA9Ci0gICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPHVpbnQ2ND4gPihhcmVuYV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRE9VQkxFOgotICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2RvdWJsZV92YWx1ZSA9Ci0gICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGRvdWJsZT4gPihhcmVuYV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRkxPQVQ6Ci0gICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZmxvYXRfdmFsdWUgPQotICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxmbG9hdD4gPihhcmVuYV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfQk9PTDoKLSAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9ib29sX3ZhbHVlID0KLSAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8Ym9vbD4gPihhcmVuYV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKLSAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9lbnVtX3ZhbHVlID0KLSAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8aW50PiA+KGFyZW5hXyk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0KLSAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+ID4oYXJlbmFfKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSA9Ci0gICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiA+KGFyZW5hXyk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotCi0gIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCB0aGUgUmVwZWF0ZWRGaWVsZDw+KiBwb2ludGVycyBoYXZlIHRoZSBzYW1lCi0gIC8vIHNpemUgYW5kIGFsaWdubWVudCB3aXRoaW4gdGhlIGFub255bW91cyB1bmlvbiBpbiBFeHRlbnNpb24uCi0gIHJldHVybiBleHRlbnNpb24tPnJlcGVhdGVkX2ludDMyX3ZhbHVlOwotfQotCi0vLyBDb21wYXRpYmxlIHZlcnNpb24gdXNpbmcgb2xkIGNhbGwgc2lnbmF0dXJlLiBEb2VzIG5vdCBjcmVhdGUgZXh0ZW5zaW9ucyB3aGVuCi0vLyB0aGUgZG9uJ3QgYWxyZWFkeSBleGlzdDsgaW5zdGVhZCwganVzdCBHT09HTEVfQ0hFQ0stZmFpbHMuCi12b2lkKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVSYXdSZXBlYXRlZEZpZWxkKGludCBudW1iZXIpIHsKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKLSAgR09PR0xFX0NIRUNLKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJFeHRlbnNpb24gbm90IGZvdW5kLiI7Ci0gIC8vIFdlIGFzc3VtZSB0aGF0IGFsbCB0aGUgUmVwZWF0ZWRGaWVsZDw+KiBwb2ludGVycyBoYXZlIHRoZSBzYW1lCi0gIC8vIHNpemUgYW5kIGFsaWdubWVudCB3aXRoaW4gdGhlIGFub255bW91cyB1bmlvbiBpbiBFeHRlbnNpb24uCi0gIHJldHVybiBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfaW50MzJfdmFsdWU7Ci19Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW51bXMKLQotaW50IEV4dGVuc2lvblNldDo6R2V0RW51bShpbnQgbnVtYmVyLCBpbnQgZGVmYXVsdF92YWx1ZSkgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSB8fCBpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZCkgewotICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICB9IGVsc2UgewotICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBFTlVNKTsKLSAgICByZXR1cm4gaXRlci0+c2Vjb25kLmVudW1fdmFsdWU7Ci0gIH0KLX0KLQotdm9pZCBFeHRlbnNpb25TZXQ6OlNldEVudW0oaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKLSAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOwotICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTSk7Ci0gICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IGZhbHNlOwotICB9IGVsc2UgewotICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTCwgRU5VTSk7Ci0gIH0KLSAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7Ci0gIGV4dGVuc2lvbi0+ZW51bV92YWx1ZSA9IHZhbHVlOwotfQotCi1pbnQgRXh0ZW5zaW9uU2V0OjpHZXRSZXBlYXRlZEVudW0oaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdCB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0gIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7Ci0gIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBFTlVNKTsKLSAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9lbnVtX3ZhbHVlLT5HZXQoaW5kZXgpOwotfQotCi12b2lkIEV4dGVuc2lvblNldDo6U2V0UmVwZWF0ZWRFbnVtKGludCBudW1iZXIsIGludCBpbmRleCwgaW50IHZhbHVlKSB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0gIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7Ci0gIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBFTlVNKTsKLSAgaXRlci0+c2Vjb25kLnJlcGVhdGVkX2VudW1fdmFsdWUtPlNldChpbmRleCwgdmFsdWUpOwotfQotCi12b2lkIEV4dGVuc2lvblNldDo6QWRkRW51bShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgcGFja2VkLCBpbnQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgRXh0ZW5zaW9uKiBleHRlbnNpb247Ci0gIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7Ci0gICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKLSAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0VOVU0pOwotICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOwotICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gcGFja2VkOwotICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZSA9Ci0gICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8aW50PiA+KGFyZW5hXyk7Ci0gIH0gZWxzZSB7Ci0gICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIFJFUEVBVEVELCBFTlVNKTsKLSAgICBHT09HTEVfRENIRUNLX0VRKGV4dGVuc2lvbi0+aXNfcGFja2VkLCBwYWNrZWQpOwotICB9Ci0gIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZS0+QWRkKHZhbHVlKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU3RyaW5ncwotCi1jb25zdCBzdHJpbmcmIEV4dGVuc2lvblNldDo6R2V0U3RyaW5nKGludCBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGVmYXVsdF92YWx1ZSkgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSB8fCBpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZCkgewotICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICB9IGVsc2UgewotICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBTVFJJTkcpOwotICAgIHJldHVybiAqaXRlci0+c2Vjb25kLnN0cmluZ192YWx1ZTsKLSAgfQotfQotCi1zdHJpbmcqIEV4dGVuc2lvblNldDo6TXV0YWJsZVN0cmluZyhpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKLSAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOwotICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HKTsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7Ci0gICAgZXh0ZW5zaW9uLT5zdHJpbmdfdmFsdWUgPSBBcmVuYTo6Q3JlYXRlPHN0cmluZz4oYXJlbmFfKTsKLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIFNUUklORyk7Ci0gIH0KLSAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7Ci0gIHJldHVybiBleHRlbnNpb24tPnN0cmluZ192YWx1ZTsKLX0KLQotY29uc3Qgc3RyaW5nJiBFeHRlbnNpb25TZXQ6OkdldFJlcGVhdGVkU3RyaW5nKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOwotICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBSRVBFQVRFRCwgU1RSSU5HKTsKLSAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9zdHJpbmdfdmFsdWUtPkdldChpbmRleCk7Ci19Ci0KLXN0cmluZyogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlUmVwZWF0ZWRTdHJpbmcoaW50IG51bWJlciwgaW50IGluZGV4KSB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0gIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7Ci0gIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIFJFUEVBVEVELCBTVFJJTkcpOwotICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkX3N0cmluZ192YWx1ZS0+TXV0YWJsZShpbmRleCk7Ci19Ci0KLXN0cmluZyogRXh0ZW5zaW9uU2V0OjpBZGRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKG51bWJlciwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKLSAgICBleHRlbnNpb24tPnR5cGUgPSB0eXBlOwotICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HKTsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKLSAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IGZhbHNlOwotICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0KLSAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+ID4oYXJlbmFfKTsKLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIFNUUklORyk7Ci0gIH0KLSAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLT5BZGQoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWVzc2FnZXMKLQotY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0TWVzc2FnZSgKLSAgICBpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgZGVmYXVsdF92YWx1ZSkgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgewotICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlOwotICB9IGVsc2UgewotICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRShpdGVyLT5zZWNvbmQsIE9QVElPTkFMLCBNRVNTQUdFKTsKLSAgICBpZiAoaXRlci0+c2Vjb25kLmlzX2xhenkpIHsKLSAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWUtPkdldE1lc3NhZ2UoZGVmYXVsdF92YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7Ci0gICAgfQotICB9Ci19Ci0KLS8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KLS8vIGNvbnN0IE1lc3NhZ2VMaXRlJiBFeHRlbnNpb25TZXQ6OkdldE1lc3NhZ2UoaW50IG51bWJlciwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QKLQotTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZU1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIEV4dGVuc2lvbiogZXh0ZW5zaW9uOwotICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgewotICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7Ci0gICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7Ci0gICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7Ci0gICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gcHJvdG90eXBlLk5ldyhhcmVuYV8pOwotICAgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOwotICAgIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBNRVNTQUdFKTsKLSAgICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKLSAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TXV0YWJsZU1lc3NhZ2UocHJvdG90eXBlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgotLy8gTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZU1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkKLQotdm9pZCBFeHRlbnNpb25TZXQ6OlNldEFsbG9jYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgewotICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7Ci0gICAgQ2xlYXJFeHRlbnNpb24obnVtYmVyKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9IG1lc3NhZ2UtPkdldEFyZW5hKCk7Ci0gIEV4dGVuc2lvbiogZXh0ZW5zaW9uOwotICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgewotICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7Ci0gICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7Ci0gICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7Ci0gICAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gYXJlbmFfKSB7Ci0gICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOwotICAgIH0gZWxzZSBpZiAobWVzc2FnZV9hcmVuYSA9PSBOVUxMKSB7Ci0gICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOwotICAgICAgYXJlbmFfLT5Pd24obWVzc2FnZSk7ICAvLyBub3QgTlVMTCBiZWNhdXNlIG5vdCBlcXVhbCB0byBtZXNzYWdlX2FyZW5hCi0gICAgfSBlbHNlIHsKLSAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2UtPk5ldyhhcmVuYV8pOwotICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKm1lc3NhZ2UpOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOwotICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKLSAgICAgIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPlNldEFsbG9jYXRlZE1lc3NhZ2UobWVzc2FnZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlOwotICAgICAgfQotICAgICAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gYXJlbmFfKSB7Ci0gICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2U7Ci0gICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gTlVMTCkgewotICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOwotICAgICAgICBhcmVuYV8tPk93bihtZXNzYWdlKTsgIC8vIG5vdCBOVUxMIGJlY2F1c2Ugbm90IGVxdWFsIHRvIG1lc3NhZ2VfYXJlbmEKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2UtPk5ldyhhcmVuYV8pOwotICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgqbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOwotfQotCi12b2lkIEV4dGVuc2lvblNldDo6VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRNZXNzYWdlKAotICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKLSAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgewotICAgIENsZWFyRXh0ZW5zaW9uKG51bWJlcik7Ci0gICAgcmV0dXJuOwotICB9Ci0gIEV4dGVuc2lvbiogZXh0ZW5zaW9uOwotICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgewotICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7Ci0gICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7Ci0gICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7Ci0gICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gbWVzc2FnZTsKLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOwotICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKLSAgICAgIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlKTsKLSAgICB9IGVsc2UgewotICAgICAgaWYgKGFyZW5hXyA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7Ci0gICAgICB9Ci0gICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOwotICAgIH0KLSAgfQotICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKLX0KLQotCi1NZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSkgewotICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgewotICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIE5VTEwuCi0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIE1FU1NBR0UpOwotICAgIE1lc3NhZ2VMaXRlKiByZXQgPSBOVUxMOwotICAgIGlmIChpdGVyLT5zZWNvbmQuaXNfbGF6eSkgewotICAgICAgcmV0ID0gaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlLT5SZWxlYXNlTWVzc2FnZShwcm90b3R5cGUpOwotICAgICAgaWYgKGFyZW5hXyA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWU7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgewotICAgICAgICByZXQgPSBpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJlbGVhc2VNZXNzYWdlKCkgYWx3YXlzIHJldHVybnMgYSBoZWFwLWFsbG9jYXRlZCBtZXNzYWdlLCBhbmQgd2UgYXJlCi0gICAgICAgIC8vIG9uIGFuIGFyZW5hLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoaXMgbWVzc2FnZSB0byByZXR1cm4uCi0gICAgICAgIHJldCA9IChpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZSktPk5ldygpOwotICAgICAgICByZXQtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWUpOwotICAgICAgfQotICAgIH0KLSAgICBleHRlbnNpb25zXy5lcmFzZShudW1iZXIpOwotICAgIHJldHVybiByZXQ7Ci0gIH0KLX0KLQotTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6VW5zYWZlQXJlbmFSZWxlYXNlTWVzc2FnZSgKLSAgICBpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKSB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0gIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSB7Ci0gICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gTlVMTC4KLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBPUFRJT05BTCwgTUVTU0FHRSk7Ci0gICAgTWVzc2FnZUxpdGUqIHJldCA9IE5VTEw7Ci0gICAgaWYgKGl0ZXItPnNlY29uZC5pc19sYXp5KSB7Ci0gICAgICByZXQgPQotICAgICAgICBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWUtPlVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UocHJvdG90eXBlKTsKLSAgICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICByZXQgPSBpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZTsKLSAgICB9Ci0gICAgZXh0ZW5zaW9uc18uZXJhc2UobnVtYmVyKTsKLSAgICByZXR1cm4gcmV0OwotICB9Ci19Ci0KLS8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KLS8vIE1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OlJlbGVhc2VNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKLQotY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0UmVwZWF0ZWRNZXNzYWdlKAotICAgIGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOwotICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBSRVBFQVRFRCwgTUVTU0FHRSk7Ci0gIHJldHVybiBpdGVyLT5zZWNvbmQucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+R2V0KGluZGV4KTsKLX0KLQotTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIHsKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKLSAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKLSAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgUkVQRUFURUQsIE1FU1NBR0UpOwotICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPk11dGFibGUoaW5kZXgpOwotfQotCi1NZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpBZGRNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgRXh0ZW5zaW9uKiBleHRlbnNpb247Ci0gIGlmIChNYXliZU5ld0V4dGVuc2lvbihudW1iZXIsIGRlc2NyaXB0b3IsICZleHRlbnNpb24pKSB7Ci0gICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKLSAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOwotICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOwotICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSA9Ci0gICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+ID4oYXJlbmFfKTsKLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIE1FU1NBR0UpOwotICB9Ci0KLSAgLy8gUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4gZG9lcyBub3Qga25vdyBob3cgdG8gQWRkKCkgc2luY2UgaXQgY2Fubm90Ci0gIC8vIGFsbG9jYXRlIGFuIGFic3RyYWN0IG9iamVjdCwgc28gd2UgaGF2ZSB0byBiZSB0cmlja3kuCi0gIE1lc3NhZ2VMaXRlKiByZXN1bHQgPSBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUKLSAgICAgIC0+QWRkRnJvbUNsZWFyZWQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPiA+KCk7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgIHJlc3VsdCA9IHByb3RvdHlwZS5OZXcoYXJlbmFfKTsKLSAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZChyZXN1bHQpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KLS8vIE1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OkFkZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpCi0KLSN1bmRlZiBHT09HTEVfRENIRUNLX1RZUEUKLQotdm9pZCBFeHRlbnNpb25TZXQ6OlJlbW92ZUxhc3QoaW50IG51bWJlcikgewotICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOwotCi0gIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gJml0ZXItPnNlY29uZDsKLSAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKLQotICBzd2l0Y2goY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSkgewotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfSU5UMzI6Ci0gICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2ludDMyX3ZhbHVlLT5SZW1vdmVMYXN0KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDY0OgotICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQ2NF92YWx1ZS0+UmVtb3ZlTGFzdCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UMzI6Ci0gICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3VpbnQzMl92YWx1ZS0+UmVtb3ZlTGFzdCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3VpbnQ2NF92YWx1ZS0+UmVtb3ZlTGFzdCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9GTE9BVDoKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZmxvYXRfdmFsdWUtPlJlbW92ZUxhc3QoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRE9VQkxFOgotICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9kb3VibGVfdmFsdWUtPlJlbW92ZUxhc3QoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfQk9PTDoKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfYm9vbF92YWx1ZS0+UmVtb3ZlTGFzdCgpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9FTlVNOgotICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9lbnVtX3ZhbHVlLT5SZW1vdmVMYXN0KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORzoKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlLT5SZW1vdmVMYXN0KCk7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPlJlbW92ZUxhc3QoKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLU1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OlJlbGVhc2VMYXN0KGludCBudW1iZXIpIHsKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKLSAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKLQotICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9ICZpdGVyLT5zZWNvbmQ7Ci0gIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCk7Ci0gIEdPT0dMRV9EQ0hFQ0soY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSA9PSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKLSAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+UmVsZWFzZUxhc3QoKTsKLX0KLQotdm9pZCBFeHRlbnNpb25TZXQ6OlN3YXBFbGVtZW50cyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0gIEdPT0dMRV9DSEVDSyhpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpKSA8PCAiSW5kZXggb3V0LW9mLWJvdW5kcyAoZmllbGQgaXMgZW1wdHkpLiI7Ci0KLSAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSAmaXRlci0+c2Vjb25kOwotICBHT09HTEVfRENIRUNLKGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQpOwotCi0gIHN3aXRjaChjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpKSB7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQzMjoKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50MzJfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDY0OgotICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQ2NF92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfVUlOVDMyOgotICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF91aW50MzJfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1VJTlQ2NDoKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfdWludDY0X3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9GTE9BVDoKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZmxvYXRfdmFsdWUtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0RPVUJMRToKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZG91YmxlX3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9CT09MOgotICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9ib29sX3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9FTlVNOgotICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9lbnVtX3ZhbHVlLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICBleHRlbnNpb24tPnJlcGVhdGVkX3N0cmluZ192YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdm9pZCBFeHRlbnNpb25TZXQ6OkNsZWFyKCkgewotICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgewotICAgIGl0ZXItPnNlY29uZC5DbGVhcigpOwotICB9Ci19Ci0KLXZvaWQgRXh0ZW5zaW9uU2V0OjpNZXJnZUZyb20oY29uc3QgRXh0ZW5zaW9uU2V0JiBvdGhlcikgewotICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBvdGhlci5leHRlbnNpb25zXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gb3RoZXIuZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgewotICAgIGNvbnN0IEV4dGVuc2lvbiYgb3RoZXJfZXh0ZW5zaW9uID0gaXRlci0+c2Vjb25kOwotICAgIEludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKGl0ZXItPmZpcnN0LCBvdGhlcl9leHRlbnNpb24pOwotICB9Ci19Ci0KLXZvaWQgRXh0ZW5zaW9uU2V0OjpJbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbSgKLSAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uJiBvdGhlcl9leHRlbnNpb24pIHsKLSAgaWYgKG90aGVyX2V4dGVuc2lvbi5pc19yZXBlYXRlZCkgewotICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOwotICAgIGJvb2wgaXNfbmV3ID0gTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24pOwotICAgIGlmIChpc19uZXcpIHsKLSAgICAgIC8vIEV4dGVuc2lvbiBkaWQgbm90IGFscmVhZHkgZXhpc3QgaW4gc2V0LgotICAgICAgZXh0ZW5zaW9uLT50eXBlID0gb3RoZXJfZXh0ZW5zaW9uLnR5cGU7Ci0gICAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IG90aGVyX2V4dGVuc2lvbi5pc19wYWNrZWQ7Ci0gICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPnR5cGUsIG90aGVyX2V4dGVuc2lvbi50eXBlKTsKLSAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIG90aGVyX2V4dGVuc2lvbi5pc19wYWNrZWQpOwotICAgICAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKLSAgICB9Ci0KLSAgICBzd2l0Y2ggKGNwcF90eXBlKG90aGVyX2V4dGVuc2lvbi50eXBlKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSwgUkVQRUFURURfVFlQRSkgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChpc19uZXcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZSA9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJFUEVBVEVEX1RZUEUgPihhcmVuYV8pOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPk1lcmdlRnJvbSggICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyLCBSZXBlYXRlZEZpZWxkICAgPCAgaW50MzI+KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQsIFJlcGVhdGVkRmllbGQgICA8ICBpbnQ2ND4pOwotICAgICAgSEFORExFX1RZUEUoIFVJTlQzMiwgIHVpbnQzMiwgUmVwZWF0ZWRGaWVsZCAgIDwgdWludDMyPik7Ci0gICAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0LCBSZXBlYXRlZEZpZWxkICAgPCB1aW50NjQ+KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQsIFJlcGVhdGVkRmllbGQgICA8ICBmbG9hdD4pOwotICAgICAgSEFORExFX1RZUEUoIERPVUJMRSwgIGRvdWJsZSwgUmVwZWF0ZWRGaWVsZCAgIDwgZG91YmxlPik7Ci0gICAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sLCBSZXBlYXRlZEZpZWxkICAgPCAgIGJvb2w+KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0sIFJlcGVhdGVkRmllbGQgICA8ICAgIGludD4pOwotICAgICAgSEFORExFX1RZUEUoIFNUUklORywgIHN0cmluZywgUmVwZWF0ZWRQdHJGaWVsZDwgc3RyaW5nPik7Ci0jdW5kZWYgSEFORExFX1RZUEUKLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAoaXNfbmV3KSB7Ci0gICAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlID0KLSAgICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4gPihhcmVuYV8pOwotICAgICAgICB9Ci0gICAgICAgIC8vIFdlIGNhbid0IGNhbGwgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT46Ok1lcmdlRnJvbSgpIGJlY2F1c2UKLSAgICAgICAgLy8gaXQgd291bGQgYXR0ZW1wdCB0byBhbGxvY2F0ZSBuZXcgb2JqZWN0cy4KLSAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4qIG90aGVyX3JlcGVhdGVkX21lc3NhZ2UgPQotICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWU7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJfcmVwZWF0ZWRfbWVzc2FnZS0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXJfbWVzc2FnZSA9IG90aGVyX3JlcGVhdGVkX21lc3NhZ2UtPkdldChpKTsKLSAgICAgICAgICBNZXNzYWdlTGl0ZSogdGFyZ2V0ID0gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlCi0gICAgICAgICAgICAgICAgICAgLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+ID4oKTsKLSAgICAgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgIHRhcmdldCA9IG90aGVyX21lc3NhZ2UuTmV3KGFyZW5hXyk7Ci0gICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZCh0YXJnZXQpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0YXJnZXQtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbShvdGhlcl9tZXNzYWdlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFvdGhlcl9leHRlbnNpb24uaXNfY2xlYXJlZCkgewotICAgICAgc3dpdGNoIChjcHBfdHlwZShvdGhlcl9leHRlbnNpb24udHlwZSkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UsIENBTUVMQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBTZXQjI0NBTUVMQ0FTRShudW1iZXIsIG90aGVyX2V4dGVuc2lvbi50eXBlLCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uTE9XRVJDQVNFIyNfdmFsdWUsICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMiwgIEludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQsICBJbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyLCBVSW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCwgVUludDY0KTsKLSAgICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQsICBGbG9hdCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpOwotICAgICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCwgICBCb29sKTsKLSAgICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgIGVudW0sICAgRW51bSk7Ci0jdW5kZWYgSEFORExFX1RZUEUKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgU2V0U3RyaW5nKG51bWJlciwgb3RoZXJfZXh0ZW5zaW9uLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24uc3RyaW5nX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRTogewotICAgICAgICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOwotICAgICAgICAgIGJvb2wgaXNfbmV3ID0gTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uKTsKLSAgICAgICAgICBpZiAoaXNfbmV3KSB7Ci0gICAgICAgICAgICBleHRlbnNpb24tPnR5cGUgPSBvdGhlcl9leHRlbnNpb24udHlwZTsKLSAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gb3RoZXJfZXh0ZW5zaW9uLmlzX3BhY2tlZDsKLSAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKLSAgICAgICAgICAgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfbGF6eSkgewotICAgICAgICAgICAgICBleHRlbnNpb24tPmlzX2xhenkgPSB0cnVlOwotICAgICAgICAgICAgICBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlID0KLSAgICAgICAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5sYXp5bWVzc2FnZV92YWx1ZS0+TmV3KGFyZW5hXyk7Ci0gICAgICAgICAgICAgIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPk1lcmdlRnJvbSgKLSAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubGF6eW1lc3NhZ2VfdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7Ci0gICAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9Ci0gICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZS0+TmV3KGFyZW5hXyk7Ci0gICAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZS0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAotICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPnR5cGUsIG90aGVyX2V4dGVuc2lvbi50eXBlKTsKLSAgICAgICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsb3RoZXJfZXh0ZW5zaW9uLmlzX3BhY2tlZCk7Ci0gICAgICAgICAgICBHT09HTEVfRENIRUNLKCFleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKLSAgICAgICAgICAgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfbGF6eSkgewotICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TWVyZ2VGcm9tKAotICAgICAgICAgICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlKTsKLSAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKLSAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlLT5HZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TXV0YWJsZU1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSktPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKLSAgICAgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oCi0gICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBFeHRlbnNpb25TZXQ6OlN3YXAoRXh0ZW5zaW9uU2V0KiB4KSB7Ci0gIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IHgtPkdldEFyZW5hTm9WaXJ0dWFsKCkpIHsKLSAgICBleHRlbnNpb25zXy5zd2FwKHgtPmV4dGVuc2lvbnNfKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBUT0RPKGNmYWxsaW4sIHJvaGFuYW5pbCk6IFdlIG1heWJlIGFibGUgdG8gb3B0aW1pemUgYSBjYXNlIHdoZXJlIHdlIGFyZQotICAgIC8vIHN3YXBwaW5nIGZyb20gaGVhcCB0byBhcmVuYS1hbGxvY2F0ZWQgZXh0ZW5zaW9uIHNldCwgYnkganVzdCBPd24oKSdpbmcKLSAgICAvLyB0aGUgZXh0ZW5zaW9ucy4KLSAgICBFeHRlbnNpb25TZXQgZXh0ZW5zaW9uX3NldDsKLSAgICBleHRlbnNpb25fc2V0Lk1lcmdlRnJvbSgqeCk7Ci0gICAgeC0+Q2xlYXIoKTsKLSAgICB4LT5NZXJnZUZyb20oKnRoaXMpOwotICAgIENsZWFyKCk7Ci0gICAgTWVyZ2VGcm9tKGV4dGVuc2lvbl9zZXQpOwotICB9Ci19Ci0KLXZvaWQgRXh0ZW5zaW9uU2V0OjpTd2FwRXh0ZW5zaW9uKEV4dGVuc2lvblNldCogb3RoZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7Ci0gIGlmICh0aGlzID09IG90aGVyKSByZXR1cm47Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIHRoaXNfaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3Igb3RoZXJfaXRlciA9IG90aGVyLT5leHRlbnNpb25zXy5maW5kKG51bWJlcik7Ci0KLSAgaWYgKHRoaXNfaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSAmJgotICAgICAgb3RoZXJfaXRlciA9PSBvdGhlci0+ZXh0ZW5zaW9uc18uZW5kKCkpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAodGhpc19pdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpICYmCi0gICAgICBvdGhlcl9pdGVyICE9IG90aGVyLT5leHRlbnNpb25zXy5lbmQoKSkgewotICAgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKSB7Ci0gICAgICB1c2luZyBzdGQ6OnN3YXA7Ci0gICAgICBzd2FwKHRoaXNfaXRlci0+c2Vjb25kLCBvdGhlcl9pdGVyLT5zZWNvbmQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBUT0RPKGNmYWxsaW4sIHJvaGFuYW5pbCk6IFdlIGNvdWxkIGZ1cnRoZXIgb3B0aW1pemUgdGhlc2UgY2FzZXMsCi0gICAgICAvLyBlc3BlY2lhbGx5IGF2b2lkIGNyZWF0aW9uIG9mIEV4dGVuc2lvblNldCwgYW5kIG1vdmUgTWVyZ2VGcm9tIGxvZ2ljCi0gICAgICAvLyBpbnRvIEV4dGVuc2lvbnMgaXRzZWxmICh3aGljaCB0YWtlcyBhcmVuYSBhcyBhbiBhcmd1bWVudCkuCi0gICAgICAvLyBXZSBkbyBpdCB0aGlzIHdheSB0byByZXVzZSB0aGUgY29weS1hY3Jvc3MtYXJlbmFzIGxvZ2ljIGFscmVhZHkKLSAgICAgIC8vIGltcGxlbWVudGVkIGluIEV4dGVuc2lvblNldCdzIE1lcmdlRnJvbS4KLSAgICAgIEV4dGVuc2lvblNldCB0ZW1wOwotICAgICAgdGVtcC5JbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShudW1iZXIsIG90aGVyX2l0ZXItPnNlY29uZCk7Ci0gICAgICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciB0ZW1wX2l0ZXIgPSB0ZW1wLmV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKLSAgICAgIG90aGVyX2l0ZXItPnNlY29uZC5DbGVhcigpOwotICAgICAgb3RoZXItPkludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKG51bWJlciwgdGhpc19pdGVyLT5zZWNvbmQpOwotICAgICAgdGhpc19pdGVyLT5zZWNvbmQuQ2xlYXIoKTsKLSAgICAgIEludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKG51bWJlciwgdGVtcF9pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAodGhpc19pdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSB7Ci0gICAgaWYgKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gb3RoZXItPkdldEFyZW5hTm9WaXJ0dWFsKCkpIHsKLSAgICAgIGV4dGVuc2lvbnNfLmluc2VydChzdGQ6Om1ha2VfcGFpcihudW1iZXIsIG90aGVyX2l0ZXItPnNlY29uZCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBJbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShudW1iZXIsIG90aGVyX2l0ZXItPnNlY29uZCk7Ci0gICAgfQotICAgIG90aGVyLT5leHRlbnNpb25zXy5lcmFzZShudW1iZXIpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChvdGhlcl9pdGVyID09IG90aGVyLT5leHRlbnNpb25zXy5lbmQoKSkgewotICAgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKSB7Ci0gICAgICBvdGhlci0+ZXh0ZW5zaW9uc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG51bWJlciwgdGhpc19pdGVyLT5zZWNvbmQpKTsKLSAgICB9IGVsc2UgewotICAgICAgb3RoZXItPkludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKG51bWJlciwgdGhpc19pdGVyLT5zZWNvbmQpOwotICAgIH0KLSAgICBleHRlbnNpb25zXy5lcmFzZShudW1iZXIpOwotICAgIHJldHVybjsKLSAgfQotfQotCi1ib29sIEV4dGVuc2lvblNldDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgLy8gRXh0ZW5zaW9ucyBhcmUgbmV2ZXIgcmVxdWlyZWQuICBIb3dldmVyLCB3ZSBuZWVkIHRvIGNoZWNrIHRoYXQgYWxsCi0gIC8vIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBpbml0aWFsaXplZC4KLSAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBjb25zdCBFeHRlbnNpb24mIGV4dGVuc2lvbiA9IGl0ZXItPnNlY29uZDsKLSAgICBpZiAoY3BwX3R5cGUoZXh0ZW5zaW9uLnR5cGUpID09IFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb24ucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+c2l6ZSgpOyBpKyspIHsKLSAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5HZXQoaSkuSXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWV4dGVuc2lvbi5pc19jbGVhcmVkKSB7Ci0gICAgICAgICAgaWYgKGV4dGVuc2lvbi5pc19sYXp5KSB7Ci0gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5sYXp5bWVzc2FnZV92YWx1ZS0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLm1lc3NhZ2VfdmFsdWUtPklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEV4dGVuc2lvblNldDo6RmluZEV4dGVuc2lvbkluZm9Gcm9tVGFnKAotICAgIHVpbnQzMiB0YWcsIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwgaW50KiBmaWVsZF9udW1iZXIsCi0gICAgRXh0ZW5zaW9uSW5mbyogZXh0ZW5zaW9uLCBib29sKiB3YXNfcGFja2VkX29uX3dpcmUpIHsKLSAgKmZpZWxkX251bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOwotICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7Ci0gIHJldHVybiBGaW5kRXh0ZW5zaW9uSW5mb0Zyb21GaWVsZE51bWJlcih3aXJlX3R5cGUsICpmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fZmluZGVyLCBleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNfcGFja2VkX29uX3dpcmUpOwotfQotCi1ib29sIEV4dGVuc2lvblNldDo6RmluZEV4dGVuc2lvbkluZm9Gcm9tRmllbGROdW1iZXIoCi0gICAgaW50IHdpcmVfdHlwZSwgaW50IGZpZWxkX251bWJlciwgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAotICAgIEV4dGVuc2lvbkluZm8qIGV4dGVuc2lvbiwgYm9vbCogd2FzX3BhY2tlZF9vbl93aXJlKSB7Ci0gIGlmICghZXh0ZW5zaW9uX2ZpbmRlci0+RmluZChmaWVsZF9udW1iZXIsIGV4dGVuc2lvbikpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgZXhwZWN0ZWRfd2lyZV90eXBlID0KLSAgICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZUZvckZpZWxkVHlwZShyZWFsX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSk7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHBhY2tlZCBmaWVsZC4KLSAgKndhc19wYWNrZWRfb25fd2lyZSA9IGZhbHNlOwotICBpZiAoZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCAmJgotICAgICAgd2lyZV90eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEICYmCi0gICAgICBpc19wYWNrYWJsZShleHBlY3RlZF93aXJlX3R5cGUpKSB7Ci0gICAgKndhc19wYWNrZWRfb25fd2lyZSA9IHRydWU7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgLy8gT3RoZXJ3aXNlIHRoZSB3aXJlIHR5cGUgbXVzdCBtYXRjaC4KLSAgcmV0dXJuIGV4cGVjdGVkX3dpcmVfdHlwZSA9PSB3aXJlX3R5cGU7Ci19Ci0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcikgewotICBpbnQgbnVtYmVyOwotICBib29sIHdhc19wYWNrZWRfb25fd2lyZTsKLSAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247Ci0gIGlmICghRmluZEV4dGVuc2lvbkluZm9Gcm9tVGFnKAotICAgICAgdGFnLCBleHRlbnNpb25fZmluZGVyLCAmbnVtYmVyLCAmZXh0ZW5zaW9uLCAmd2FzX3BhY2tlZF9vbl93aXJlKSkgewotICAgIHJldHVybiBmaWVsZF9za2lwcGVyLT5Ta2lwRmllbGQoaW5wdXQsIHRhZyk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFBhcnNlRmllbGRXaXRoRXh0ZW5zaW9uSW5mbygKLSAgICAgICAgbnVtYmVyLCB3YXNfcGFja2VkX29uX3dpcmUsIGV4dGVuc2lvbiwgaW5wdXQsIGZpZWxkX3NraXBwZXIpOwotICB9Ci19Ci0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkV2l0aEV4dGVuc2lvbkluZm8oCi0gICAgaW50IG51bWJlciwgYm9vbCB3YXNfcGFja2VkX29uX3dpcmUsIGNvbnN0IEV4dGVuc2lvbkluZm8mIGV4dGVuc2lvbiwKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgRmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7Ci0gIC8vIEV4cGxpY2l0bHkgbm90IHJlYWQgZXh0ZW5zaW9uLmlzX3BhY2tlZCwgaW5zdGVhZCBjaGVjayB3aGV0aGVyIHRoZSBmaWVsZAotICAvLyB3YXMgZW5jb2RlZCBpbiBwYWNrZWQgZm9ybSBvbiB0aGUgd2lyZS4KLSAgaWYgKHdhc19wYWNrZWRfb25fd2lyZSkgewotICAgIHVpbnQzMiBzaXplOwotICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmc2l6ZSkpIHJldHVybiBmYWxzZTsKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBpbnB1dC0+UHVzaExpbWl0KHNpemUpOwotCi0gICAgc3dpdGNoIChleHRlbnNpb24udHlwZSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENQUF9DQU1FTENBU0UsIENQUF9MT1dFUkNBU0UpICAgICAgICBcCi0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICB3aGlsZSAoaW5wdXQtPkJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBDUFBfTE9XRVJDQVNFIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgQ1BQX0xPV0VSQ0FTRSwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U+KCAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgQWRkIyNDUFBfQ0FNRUxDQVNFKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0UsICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uaXNfcGFja2VkLCB2YWx1ZSwgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhawotCi0gICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgIEludDMyLCAgIGludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgSW50NjQsICAgaW50NjQpOwotICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsIFVJbnQzMiwgIHVpbnQzMik7Ci0gICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgVUludDY0LCAgdWludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgSW50MzIsICAgaW50MzIpOwotICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICBJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgVUludDMyLCAgdWludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCBVSW50NjQsICB1aW50NjQpOwotICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsICBJbnQzMiwgICBpbnQzMik7Ci0gICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgIEludDY0LCAgIGludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgRmxvYXQsICAgZmxvYXQpOwotICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsIERvdWJsZSwgIGRvdWJsZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICBCb29sLCAgICBib29sKTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU06Ci0gICAgICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgaWYgKGV4dGVuc2lvbi5lbnVtX3ZhbGlkaXR5X2NoZWNrLmZ1bmMoCi0gICAgICAgICAgICAgICAgICBleHRlbnNpb24uZW51bV92YWxpZGl0eV9jaGVjay5hcmcsIHZhbHVlKSkgewotICAgICAgICAgICAgQWRkRW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIGV4dGVuc2lvbi5pc19wYWNrZWQsCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlLCBleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEludmFsaWQgdmFsdWUuICBUcmVhdCBhcyB1bmtub3duLgotICAgICAgICAgICAgZmllbGRfc2tpcHBlci0+U2tpcFVua25vd25FbnVtKG51bWJlciwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc6Ci0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDoKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRToKLSAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChleHRlbnNpb24udHlwZSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENQUF9DQU1FTENBU0UsIENQUF9MT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENQUF9MT1dFUkNBU0UgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBDUFBfTE9XRVJDQVNFLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRT4oICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBBZGQjI0NQUF9DQU1FTENBU0UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1VQUEVSQ0FTRSwgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5pc19wYWNrZWQsIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgU2V0IyNDUFBfQ0FNRUxDQVNFKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0UsIHZhbHVlLCAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9IGJyZWFrCi0KLSAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgSW50MzIsICAgaW50MzIpOwotICAgICAgSEFORExFX1RZUEUoICAgSU5UNjQsICBJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgVUludDMyLCAgdWludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCBVSW50NjQsICB1aW50NjQpOwotICAgICAgSEFORExFX1RZUEUoICBTSU5UMzIsICBJbnQzMiwgICBpbnQzMik7Ci0gICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgIEludDY0LCAgIGludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCBVSW50MzIsICB1aW50MzIpOwotICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsIFVJbnQ2NCwgIHVpbnQ2NCk7Ci0gICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgIEludDMyLCAgIGludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCAgSW50NjQsICAgaW50NjQpOwotICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICBGbG9hdCwgICBmbG9hdCk7Ci0gICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgRG91YmxlLCAgZG91YmxlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgIEJvb2wsICAgIGJvb2wpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTTogewotICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotCi0gICAgICAgIGlmICghZXh0ZW5zaW9uLmVudW1fdmFsaWRpdHlfY2hlY2suZnVuYygKLSAgICAgICAgICAgICAgICBleHRlbnNpb24uZW51bV92YWxpZGl0eV9jaGVjay5hcmcsIHZhbHVlKSkgewotICAgICAgICAgIC8vIEludmFsaWQgdmFsdWUuICBUcmVhdCBhcyB1bmtub3duLgotICAgICAgICAgIGZpZWxkX3NraXBwZXItPlNraXBVbmtub3duRW51bShudW1iZXIsIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsKLSAgICAgICAgICBBZGRFbnVtKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTSwgZXh0ZW5zaW9uLmlzX3BhY2tlZCwgdmFsdWUsCi0gICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgU2V0RW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIHZhbHVlLAotICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORzogIHsKLSAgICAgICAgc3RyaW5nKiB2YWx1ZSA9IGV4dGVuc2lvbi5pc19yZXBlYXRlZCA/Ci0gICAgICAgICAgQWRkU3RyaW5nKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HLCBleHRlbnNpb24uZGVzY3JpcHRvcikgOgotICAgICAgICAgIE11dGFibGVTdHJpbmcobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkcsCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoaW5wdXQsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUzogIHsKLSAgICAgICAgc3RyaW5nKiB2YWx1ZSA9IGV4dGVuc2lvbi5pc19yZXBlYXRlZCA/Ci0gICAgICAgICAgQWRkU3RyaW5nKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVMsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKSA6Ci0gICAgICAgICAgTXV0YWJsZVN0cmluZyhudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTLAotICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOwotICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW5wdXQsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUDogewotICAgICAgICBNZXNzYWdlTGl0ZSogdmFsdWUgPSBleHRlbnNpb24uaXNfcmVwZWF0ZWQgPwotICAgICAgICAgICAgQWRkTWVzc2FnZShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQLAotICAgICAgICAgICAgICAgICAgICAgICAqZXh0ZW5zaW9uLm1lc3NhZ2VfcHJvdG90eXBlLCBleHRlbnNpb24uZGVzY3JpcHRvcikgOgotICAgICAgICAgICAgTXV0YWJsZU1lc3NhZ2UobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9HUk9VUCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9wcm90b3R5cGUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwKG51bWJlciwgaW5wdXQsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgIE1lc3NhZ2VMaXRlKiB2YWx1ZSA9IGV4dGVuc2lvbi5pc19yZXBlYXRlZCA/Ci0gICAgICAgICAgICBBZGRNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi5tZXNzYWdlX3Byb3RvdHlwZSwgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpIDoKLSAgICAgICAgICAgIE11dGFibGVNZXNzYWdlKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICpleHRlbnNpb24ubWVzc2FnZV9wcm90b3R5cGUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsKLSAgICAgICAgaWYgKCFXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2UoaW5wdXQsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSkgewotICBGaWVsZFNraXBwZXIgc2tpcHBlcjsKLSAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOwotICByZXR1cm4gUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZmluZGVyLCAmc2tpcHBlcik7Ci19Ci0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHVua25vd25fZmllbGRzKSB7Ci0gIENvZGVkT3V0cHV0U3RyZWFtRmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOwotICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7Ci0gIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKLX0KLQotLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgotLy8gYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpCi0KLS8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KLS8vIGJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLQotdm9pZCBFeHRlbnNpb25TZXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICBpbnQgc3RhcnRfZmllbGRfbnVtYmVyLCBpbnQgZW5kX2ZpZWxkX251bWJlciwKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyOwotICBmb3IgKGl0ZXIgPSBleHRlbnNpb25zXy5sb3dlcl9ib3VuZChzdGFydF9maWVsZF9udW1iZXIpOwotICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkgJiYgaXRlci0+Zmlyc3QgPCBlbmRfZmllbGRfbnVtYmVyOwotICAgICAgICsraXRlcikgewotICAgIGl0ZXItPnNlY29uZC5TZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcyhpdGVyLT5maXJzdCwgb3V0cHV0KTsKLSAgfQotfQotCi1pbnQgRXh0ZW5zaW9uU2V0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotCi0gIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgdG90YWxfc2l6ZSArPSBpdGVyLT5zZWNvbmQuQnl0ZVNpemUoaXRlci0+Zmlyc3QpOwotICB9Ci0KLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLS8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KLS8vIGludCBFeHRlbnNpb25TZXQ6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdAotCi1ib29sIEV4dGVuc2lvblNldDo6TWF5YmVOZXdFeHRlbnNpb24oaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKiogcmVzdWx0KSB7Ci0gIHBhaXI8bWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IsIGJvb2w+IGluc2VydF9yZXN1bHQgPQotICAgICAgZXh0ZW5zaW9uc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG51bWJlciwgRXh0ZW5zaW9uKCkpKTsKLSAgKnJlc3VsdCA9ICZpbnNlcnRfcmVzdWx0LmZpcnN0LT5zZWNvbmQ7Ci0gICgqcmVzdWx0KS0+ZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gIHJldHVybiBpbnNlcnRfcmVzdWx0LnNlY29uZDsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTWV0aG9kcyBvZiBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbgotCi12b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpDbGVhcigpIHsKLSAgaWYgKGlzX3JlcGVhdGVkKSB7Ci0gICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkNsZWFyKCk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhawotCi0gICAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQpOwotICAgICAgSEFORExFX1RZUEUoIFVJTlQzMiwgIHVpbnQzMik7Ci0gICAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQpOwotICAgICAgSEFORExFX1RZUEUoIERPVUJMRSwgIGRvdWJsZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0pOwotICAgICAgSEFORExFX1RZUEUoIFNUUklORywgIHN0cmluZyk7Ci0gICAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBtZXNzYWdlKTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAoIWlzX2NsZWFyZWQpIHsKLSAgICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgc3RyaW5nX3ZhbHVlLT5jbGVhcigpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgICAgaWYgKGlzX2xhenkpIHsKLSAgICAgICAgICAgIGxhenltZXNzYWdlX3ZhbHVlLT5DbGVhcigpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBtZXNzYWdlX3ZhbHVlLT5DbGVhcigpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICAvLyBObyBuZWVkIHRvIGRvIGFueXRoaW5nLiAgR2V0KigpIHdpbGwgcmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlCi0gICAgICAgICAgLy8gYXMgbG9uZyBhcyBpc19jbGVhcmVkIGlzIHRydWUgYW5kIFNldCooKSB3aWxsIG92ZXJ3cml0ZSB0aGUKLSAgICAgICAgICAvLyBwcmV2aW91cyB2YWx1ZS4KLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgaXNfY2xlYXJlZCA9IHRydWU7Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAotICAgIGludCBudW1iZXIsCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgaWYgKGlzX3JlcGVhdGVkKSB7Ci0gICAgaWYgKGlzX3BhY2tlZCkgewotICAgICAgaWYgKGNhY2hlZF9zaXplID09IDApIHJldHVybjsKLQotICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKG51bWJlciwKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihjYWNoZWRfc2l6ZSk7Ci0KLSAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7ICBcCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI0NBTUVMQ0FTRSMjTm9UYWcoICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSksIG91dHB1dCk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWsKLQotICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgaW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgICBVSW50MzIsICB1aW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICB1aW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgaW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgICBTSW50NjQsICAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICB1aW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICB1aW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICAgaW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgZmxvYXQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsICBkb3VibGUpOwotICAgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgIGJvb2wpOwotICAgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgIGVudW0pOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVM6Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVA6Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRToKLSAgICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm9uLXByaW1pdGl2ZSB0eXBlcyBjYW4ndCBiZSBwYWNrZWQuIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgIFwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ0FNRUxDQVNFKG51bWJlciwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpKSwgb3V0cHV0KTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhawotCi0gICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgICBJbnQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgIHVpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCAgIFVJbnQ2NCwgIHVpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMiwgIHVpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCwgIHVpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCwgICBmbG9hdCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgIGRvdWJsZSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgICAgQm9vbCwgICAgYm9vbCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU1RSSU5HLCAgIFN0cmluZywgIHN0cmluZyk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgIHN0cmluZyk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgZW51bSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIEdST1VQLCAgICBHcm91cCwgbWVzc2FnZSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgbWVzc2FnZSk7Ci0jdW5kZWYgSEFORExFX1RZUEUKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoIWlzX2NsZWFyZWQpIHsKLSAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgVkFMVUUpICAgICAgICAgICAgICAgICBcCi0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UobnVtYmVyLCBWQUxVRSwgb3V0cHV0KTsgXAotICAgICAgICBicmVhawotCi0gICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgIGludDMyX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICAgaW50NjRfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgIHVpbnQzMl92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICAgdWludDY0X3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICAgaW50MzJfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgICBpbnQ2NF92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICAgdWludDMyX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCwgICB1aW50NjRfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCAgICBpbnQzMl92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgIGludDY0X3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCwgICAgZmxvYXRfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlLCAgIGRvdWJsZV92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgICBib29sX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgU1RSSU5HLCAgIFN0cmluZywgICpzdHJpbmdfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICAgQllURVMsICAgIEJ5dGVzLCAgKnN0cmluZ192YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgICBlbnVtX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEdST1VQLCAgICBHcm91cCwgKm1lc3NhZ2VfdmFsdWUpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6Ci0gICAgICAgIGlmIChpc19sYXp5KSB7Ci0gICAgICAgICAgbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZShudW1iZXIsIG91dHB1dCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZShudW1iZXIsICptZXNzYWdlX3ZhbHVlLCBvdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1pbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OkJ5dGVTaXplKGludCBudW1iZXIpIGNvbnN0IHsKLSAgaW50IHJlc3VsdCA9IDA7Ci0KLSAgaWYgKGlzX3JlcGVhdGVkKSB7Ci0gICAgaWYgKGlzX3BhY2tlZCkgewotICAgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgIFwKLSAgICAgICAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6Q0FNRUxDQVNFIyNTaXplKCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhawotCi0gICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgICBJbnQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgIHVpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCAgIFVJbnQ2NCwgIHVpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgZW51bSk7Ci0jdW5kZWYgSEFORExFX1RZUEUKLQotICAgICAgICAvLyBTdHVmZiB3aXRoIGZpeGVkIHNpemUuCi0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXN1bHQgKz0gV2lyZUZvcm1hdExpdGU6OmsjI0NBTUVMQ0FTRSMjU2l6ZSAqICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJyZWFrCi0gICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMiwgdWludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsICBGaXhlZDY0LCB1aW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgIGludDY0KTsKLSAgICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICAgIEZsb2F0LCAgZmxvYXQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsIGRvdWJsZSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgICAgQm9vbCwgICBib29sKTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfU1RSSU5HOgotICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOgotICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0dST1VQOgotICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6Ci0gICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vbi1wcmltaXRpdmUgdHlwZXMgY2FuJ3QgYmUgcGFja2VkLiI7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhY2hlZF9zaXplID0gcmVzdWx0OwotICAgICAgaWYgKHJlc3VsdCA+IDApIHsKLSAgICAgICAgcmVzdWx0ICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHJlc3VsdCk7Ci0gICAgICAgIHJlc3VsdCArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKG51bWJlciwKLSAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpbnQgdGFnX3NpemUgPSBXaXJlRm9ybWF0TGl0ZTo6VGFnU2l6ZShudW1iZXIsIHJlYWxfdHlwZSh0eXBlKSk7Ci0KLSAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZXN1bHQgKz0gdGFnX3NpemUgKiByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7ICAgICAgICBcCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCk7IGkrKykgeyAgXAotICAgICAgICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpDQU1FTENBU0UjI1NpemUoICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+R2V0KGkpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGJyZWFrCi0KLSAgICAgICAgSEFORExFX1RZUEUoICAgSU5UMzIsICAgIEludDMyLCAgIGludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoICAgSU5UNjQsICAgIEludDY0LCAgIGludDY0KTsKLSAgICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgdWludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoICBVSU5UNjQsICAgVUludDY0LCAgdWludDY0KTsKLSAgICAgICAgSEFORExFX1RZUEUoICBTSU5UMzIsICAgU0ludDMyLCAgIGludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgIGludDY0KTsKLSAgICAgICAgSEFORExFX1RZUEUoICBTVFJJTkcsICAgU3RyaW5nLCAgc3RyaW5nKTsKLSAgICAgICAgSEFORExFX1RZUEUoICAgQllURVMsICAgIEJ5dGVzLCAgc3RyaW5nKTsKLSAgICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICBlbnVtKTsKLSAgICAgICAgSEFORExFX1RZUEUoICAgR1JPVVAsICAgIEdyb3VwLCBtZXNzYWdlKTsKLSAgICAgICAgSEFORExFX1RZUEUoIE1FU1NBR0UsICBNZXNzYWdlLCBtZXNzYWdlKTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICAgIC8vIFN0dWZmIHdpdGggZml4ZWQgc2l6ZS4KLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlc3VsdCArPSAodGFnX3NpemUgKyBXaXJlRm9ybWF0TGl0ZTo6ayMjQ0FNRUxDQVNFIyNTaXplKSAqICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWsKLSAgICAgICAgSEFORExFX1RZUEUoIEZJWEVEMzIsICBGaXhlZDMyLCB1aW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsIHVpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgIGludDMyKTsKLSAgICAgICAgSEFORExFX1RZUEUoU0ZJWEVENjQsIFNGaXhlZDY0LCAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICBmbG9hdCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgZG91YmxlKTsKLSAgICAgICAgSEFORExFX1RZUEUoICAgIEJPT0wsICAgICBCb29sLCAgIGJvb2wpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgaWYgKCFpc19jbGVhcmVkKSB7Ci0gICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKG51bWJlciwgcmVhbF90eXBlKHR5cGUpKTsKLSAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmVzdWx0ICs9IFdpcmVGb3JtYXRMaXRlOjpDQU1FTENBU0UjI1NpemUoTE9XRVJDQVNFKTsgICAgICAgICAgICAgXAotICAgICAgICBicmVhawotCi0gICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgIGludDMyX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICAgaW50NjRfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgIHVpbnQzMl92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICAgdWludDY0X3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICAgaW50MzJfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgICBpbnQ2NF92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggIFNUUklORywgICBTdHJpbmcsICAqc3RyaW5nX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgICpzdHJpbmdfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICAgZW51bV92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsICptZXNzYWdlX3ZhbHVlKTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgIGlmIChpc19sYXp5KSB7Ci0gICAgICAgICAgaW50IHNpemUgPSBsYXp5bWVzc2FnZV92YWx1ZS0+Qnl0ZVNpemUoKTsKLSAgICAgICAgICByZXN1bHQgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoc2l6ZSkgKyBzaXplOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoKm1lc3NhZ2VfdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBTdHVmZiB3aXRoIGZpeGVkIHNpemUuCi0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICByZXN1bHQgKz0gV2lyZUZvcm1hdExpdGU6OmsjI0NBTUVMQ0FTRSMjU2l6ZTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrCi0gICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIpOwotICAgICAgSEFORExFX1RZUEUoIEZJWEVENjQsICBGaXhlZDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMik7Ci0gICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQpOwotICAgICAgSEFORExFX1RZUEUoICAgRkxPQVQsICAgIEZsb2F0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpHZXRTaXplKCkgY29uc3QgewotICBHT09HTEVfRENIRUNLKGlzX3JlcGVhdGVkKTsKLSAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5zaXplKCkKLQotICAgIEhBTkRMRV9UWVBFKCAgSU5UMzIsICAgaW50MzIpOwotICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQpOwotICAgIEhBTkRMRV9UWVBFKCBVSU5UMzIsICB1aW50MzIpOwotICAgIEhBTkRMRV9UWVBFKCBVSU5UNjQsICB1aW50NjQpOwotICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQpOwotICAgIEhBTkRMRV9UWVBFKCBET1VCTEUsICBkb3VibGUpOwotICAgIEhBTkRMRV9UWVBFKCAgIEJPT0wsICAgIGJvb2wpOwotICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0pOwotICAgIEhBTkRMRV9UWVBFKCBTVFJJTkcsICBzdHJpbmcpOwotICAgIEhBTkRMRV9UWVBFKE1FU1NBR0UsIG1lc3NhZ2UpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0gIH0KLQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIDA7Ci19Ci0KLS8vIFRoaXMgZnVuY3Rpb24gZGVsZXRlcyBhbGwgYWxsb2NhdGVkIG9iamVjdHMuIFRoaXMgZnVuY3Rpb24gc2hvdWxkIGJlIG9ubHkKLS8vIGNhbGxlZCBpZiB0aGUgRXh0ZW5zaW9uIHdhcyBjcmVhdGVkIHdpdGggYW4gYXJlbmEuCi12b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpGcmVlKCkgewotICBpZiAoaXNfcmVwZWF0ZWQpIHsKLSAgICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgZGVsZXRlIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrCi0KLSAgICAgIEhBTkRMRV9UWVBFKCAgSU5UMzIsICAgaW50MzIpOwotICAgICAgSEFORExFX1RZUEUoICBJTlQ2NCwgICBpbnQ2NCk7Ci0gICAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBVSU5UNjQsICB1aW50NjQpOwotICAgICAgSEFORExFX1RZUEUoICBGTE9BVCwgICBmbG9hdCk7Ci0gICAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEJPT0wsICAgIGJvb2wpOwotICAgICAgSEFORExFX1RZUEUoICAgRU5VTSwgICAgZW51bSk7Ci0gICAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nKTsKLSAgICAgIEhBTkRMRV9UWVBFKE1FU1NBR0UsIG1lc3NhZ2UpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0gICAgfQotICB9IGVsc2UgewotICAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgICBkZWxldGUgc3RyaW5nX3ZhbHVlOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgaWYgKGlzX2xhenkpIHsKLSAgICAgICAgICBkZWxldGUgbGF6eW1lc3NhZ2VfdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZGVsZXRlIG1lc3NhZ2VfdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgotLy8gaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBEZWZhdWx0IHJlcGVhdGVkIGZpZWxkIGluc3RhbmNlcyBmb3IgaXRlcmF0b3ItY29tcGF0aWJsZSBhY2Nlc3NvcnMKLQotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZXBlYXRlZF9wcmltaXRpdmVfZ2VuZXJpY190eXBlX3RyYWl0c19vbmNlX2luaXRfKTsKLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocmVwZWF0ZWRfc3RyaW5nX3R5cGVfdHJhaXRzX29uY2VfaW5pdF8pOwotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZXBlYXRlZF9tZXNzYWdlX2dlbmVyaWNfdHlwZV90cmFpdHNfb25jZV9pbml0Xyk7Ci0KLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpIHsKLSAgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl8gPSBuZXcgUmVwZWF0ZWRGaWVsZDxpbnQzMj47Ci0gIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfaW50NjRfID0gbmV3IFJlcGVhdGVkRmllbGQ8aW50NjQ+OwotICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX3VpbnQzMl8gPSBuZXcgUmVwZWF0ZWRGaWVsZDx1aW50MzI+OwotICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX3VpbnQ2NF8gPSBuZXcgUmVwZWF0ZWRGaWVsZDx1aW50NjQ+OwotICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2RvdWJsZV8gPSBuZXcgUmVwZWF0ZWRGaWVsZDxkb3VibGU+OwotICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2Zsb2F0XyA9IG5ldyBSZXBlYXRlZEZpZWxkPGZsb2F0PjsKLSAgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9ib29sXyA9IG5ldyBSZXBlYXRlZEZpZWxkPGJvb2w+OwotICBPblNodXRkb3duKCZEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKTsKLX0KLQotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCkgewotICBkZWxldGUgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl87Ci0gIGRlbGV0ZSBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2ludDY0XzsKLSAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfdWludDMyXzsKLSAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfdWludDY0XzsKLSAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZG91YmxlXzsKLSAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZmxvYXRfOwotICBkZWxldGUgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9ib29sXzsKLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHM6OkluaXRpYWxpemVEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKSB7Ci0gIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfID0gbmV3IFJlcGVhdGVkRmllbGRUeXBlOwotICBPblNodXRkb3duKCZEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKTsKLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHM6OkRlc3Ryb3lEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKSB7Ci0gIGRlbGV0ZSBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkXzsKLX0KLQotdm9pZCBSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpIHsKLSAgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF8gPSBuZXcgUmVwZWF0ZWRGaWVsZFR5cGU7Ci0gIE9uU2h1dGRvd24oJkRlc3Ryb3lEZWZhdWx0UmVwZWF0ZWRGaWVsZHMpOwotfQotCi12b2lkIFJlcGVhdGVkTWVzc2FnZUdlbmVyaWNUeXBlVHJhaXRzOjpEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCkgewotICBkZWxldGUgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF87Ci19Ci0KLWNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzI+KgotUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6ZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl8gPSBOVUxMOwotY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2ND4qCi1SZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2ludDY0XyA9IE5VTEw7Ci1jb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMj4qCi1SZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX3VpbnQzMl8gPSBOVUxMOwotY29uc3QgUmVwZWF0ZWRGaWVsZDx1aW50NjQ+KgotUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6ZGVmYXVsdF9yZXBlYXRlZF9maWVsZF91aW50NjRfID0gTlVMTDsKLWNvbnN0IFJlcGVhdGVkRmllbGQ8ZG91YmxlPioKLVJlcGVhdGVkUHJpbWl0aXZlR2VuZXJpY1R5cGVUcmFpdHM6OmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZG91YmxlXyA9IE5VTEw7Ci1jb25zdCBSZXBlYXRlZEZpZWxkPGZsb2F0PioKLVJlcGVhdGVkUHJpbWl0aXZlR2VuZXJpY1R5cGVUcmFpdHM6OmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZmxvYXRfID0gTlVMTDsKLWNvbnN0IFJlcGVhdGVkRmllbGQ8Ym9vbD4qCi1SZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2Jvb2xfID0gTlVMTDsKLWNvbnN0IFJlcGVhdGVkU3RyaW5nVHlwZVRyYWl0czo6UmVwZWF0ZWRGaWVsZFR5cGUqCi1SZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHM6OmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfID0gTlVMTDsKLWNvbnN0IFJlcGVhdGVkTWVzc2FnZUdlbmVyaWNUeXBlVHJhaXRzOjpSZXBlYXRlZEZpZWxkVHlwZSoKLVJlcGVhdGVkTWVzc2FnZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkXyA9IE5VTEw7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiY2ExNzliLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI2NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCi0vLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9TRVRfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fU0VUX0hfXwotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDx1dGlsaXR5PgotI2luY2x1ZGUgPHN0cmluZz4KLQotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgY2xhc3MgQXJlbmE7Ci0gIGNsYXNzIERlc2NyaXB0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvci5oCi0gIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvci5oCi0gIGNsYXNzIERlc2NyaXB0b3JQb29sOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvci5oCi0gIGNsYXNzIE1lc3NhZ2VMaXRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZV9saXRlLmgKLSAgY2xhc3MgTWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLmgKLSAgY2xhc3MgTWVzc2FnZUZhY3Rvcnk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtZXNzYWdlLmgKLSAgY2xhc3MgVW5rbm93bkZpZWxkU2V0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCi0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb2RlZF9zdHJlYW0uaAotICAgIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29kZWRfc3RyZWFtLmgKLSAgfQotICBuYW1lc3BhY2UgaW50ZXJuYWwgewotICAgIGNsYXNzIEZpZWxkU2tpcHBlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lyZV9mb3JtYXRfbGl0ZS5oCi0gIH0KLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFVzZWQgdG8gc3RvcmUgdmFsdWVzIG9mIHR5cGUgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB3aXRob3V0IGhhdmluZyB0bwotLy8gI2luY2x1ZGUgd2lyZV9mb3JtYXRfbGl0ZS5oLiAgQWxzbywgZW5zdXJlcyB0aGF0IHdlIHVzZSBvbmx5IG9uZSBieXRlIHRvCi0vLyBzdG9yZSB0aGVzZSB2YWx1ZXMsIHdoaWNoIGlzIGltcG9ydGFudCB0byBrZWVwIHRoZSBsYXlvdXQgb2YKLS8vIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uIHNtYWxsLgotdHlwZWRlZiB1aW50OCBGaWVsZFR5cGU7Ci0KLS8vIEEgZnVuY3Rpb24gd2hpY2gsIGdpdmVuIGFuIGludGVnZXIgdmFsdWUsIHJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyCi0vLyBtYXRjaGVzIG9uZSBvZiB0aGUgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoZSBjb3JyZXNwb25kaW5nIGVudW0gdHlwZS4gIFRoaXMKLS8vIGlzIHVzZWQgd2l0aCBSZWdpc3RlckVudW1FeHRlbnNpb24sIGJlbG93LgotdHlwZWRlZiBib29sIEVudW1WYWxpZGl0eUZ1bmMoaW50IG51bWJlcik7Ci0KLS8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdoaWNoIHRha2VzIGFuIGFyZ3VtZW50LiAgVGhpcyBpcyBuZWVkZWQgdG8gZGVhbCB3aXRoCi0vLyBleHRlbnNpb25zIHRoYXQgYXJlIG5vdCBjb21waWxlZCBpbi4KLXR5cGVkZWYgYm9vbCBFbnVtVmFsaWRpdHlGdW5jV2l0aEFyZyhjb25zdCB2b2lkKiBhcmcsIGludCBudW1iZXIpOwotCi0vLyBJbmZvcm1hdGlvbiBhYm91dCBhIHJlZ2lzdGVyZWQgZXh0ZW5zaW9uLgotc3RydWN0IEV4dGVuc2lvbkluZm8gewotICBpbmxpbmUgRXh0ZW5zaW9uSW5mbygpIHt9Ci0gIGlubGluZSBFeHRlbnNpb25JbmZvKEZpZWxkVHlwZSB0eXBlX3BhcmFtLCBib29sIGlzcmVwZWF0ZWQsIGJvb2wgaXNwYWNrZWQpCi0gICAgICA6IHR5cGUodHlwZV9wYXJhbSksIGlzX3JlcGVhdGVkKGlzcmVwZWF0ZWQpLCBpc19wYWNrZWQoaXNwYWNrZWQpLAotICAgICAgICBkZXNjcmlwdG9yKE5VTEwpIHt9Ci0KLSAgRmllbGRUeXBlIHR5cGU7Ci0gIGJvb2wgaXNfcmVwZWF0ZWQ7Ci0gIGJvb2wgaXNfcGFja2VkOwotCi0gIHN0cnVjdCBFbnVtVmFsaWRpdHlDaGVjayB7Ci0gICAgRW51bVZhbGlkaXR5RnVuY1dpdGhBcmcqIGZ1bmM7Ci0gICAgY29uc3Qgdm9pZCogYXJnOwotICB9OwotCi0gIHVuaW9uIHsKLSAgICBFbnVtVmFsaWRpdHlDaGVjayBlbnVtX3ZhbGlkaXR5X2NoZWNrOwotICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBtZXNzYWdlX3Byb3RvdHlwZTsKLSAgfTsKLQotICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyBleHRlbnNpb24sIGlmIG9uZSBleGlzdHMgYW5kIGlzIGtub3duLiAgTWF5IGJlCi0gIC8vIE5VTEwuICBNdXN0IG5vdCBiZSBOVUxMIGlmIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgZXh0ZW5zaW9uIGRvZXMgbm90Ci0gIC8vIGxpdmUgaW4gdGhlIHNhbWUgcG9vbCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGNvbnRhaW5pbmcgdHlwZS4KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yOwotfTsKLQotLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBvYmplY3Qgd2hpY2ggbG9va3MgdXAgZXh0ZW5zaW9uIGRlZmluaXRpb25zLiAgVXNlZAotLy8gd2hlbiBwYXJzaW5nLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEV4dGVuc2lvbkZpbmRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5FeHRlbnNpb25GaW5kZXIoKTsKLQotICAvLyBGaW5kIHRoZSBleHRlbnNpb24gd2l0aCB0aGUgZ2l2ZW4gY29udGFpbmluZyB0eXBlIGFuZCBudW1iZXIuCi0gIHZpcnR1YWwgYm9vbCBGaW5kKGludCBudW1iZXIsIEV4dGVuc2lvbkluZm8qIG91dHB1dCkgPSAwOwotfTsKLQotLy8gSW1wbGVtZW50YXRpb24gb2YgRXh0ZW5zaW9uRmluZGVyIHdoaWNoIGZpbmRzIGV4dGVuc2lvbnMgZGVmaW5lZCBpbiAucHJvdG8KLS8vIGZpbGVzIHdoaWNoIGhhdmUgYmVlbiBjb21waWxlZCBpbnRvIHRoZSBiaW5hcnkuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIDogcHVibGljIEV4dGVuc2lvbkZpbmRlciB7Ci0gcHVibGljOgotICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIoY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSkKLSAgICAgIDogY29udGFpbmluZ190eXBlXyhjb250YWluaW5nX3R5cGUpIHt9Ci0gIHZpcnR1YWwgfkdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlcigpIHt9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGFuZCBmaWxscyBpbiAqb3V0cHV0IGlmIGZvdW5kLCBvdGhlcndpc2UgcmV0dXJucyBmYWxzZS4KLSAgdmlydHVhbCBib29sIEZpbmQoaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyogb3V0cHV0KTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGVfOwotfTsKLQotLy8gQSBGaWVsZFNraXBwZXIgdXNlZCBmb3IgcGFyc2luZyBNZXNzYWdlU2V0LgotY2xhc3MgTWVzc2FnZVNldEZpZWxkU2tpcHBlcjsKLQotLy8gTm90ZTogIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MgZGVmaW5lcyBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlciBmb3IKLS8vIGZpbmRpbmcgZXh0ZW5zaW9ucyBmcm9tIGEgRGVzY3JpcHRvclBvb2wuCi0KLS8vIFRoaXMgaXMgYW4gaW50ZXJuYWwgaGVscGVyIGNsYXNzIGludGVuZGVkIGZvciB1c2Ugd2l0aGluIHRoZSBwcm90b2NvbCBidWZmZXIKLS8vIGxpYnJhcnkgYW5kIGdlbmVyYXRlZCBjbGFzc2VzLiAgQ2xpZW50cyBzaG91bGQgbm90IHVzZSBpdCBkaXJlY3RseS4gIEluc3RlYWQsCi0vLyB1c2UgdGhlIGdlbmVyYXRlZCBhY2Nlc3NvcnMgc3VjaCBhcyBHZXRFeHRlbnNpb24oKSBvZiB0aGUgY2xhc3MgYmVpbmcKLS8vIGV4dGVuZGVkLgotLy8KLS8vIFRoaXMgY2xhc3MgbWFuYWdlcyBleHRlbnNpb25zIGZvciBhIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LiAgVGhlCi0vLyBtZXNzYWdlJ3MgSGFzRXh0ZW5zaW9uKCksIEdldEV4dGVuc2lvbigpLCBNdXRhYmxlRXh0ZW5zaW9uKCksIGFuZAotLy8gQ2xlYXJFeHRlbnNpb24oKSBtZXRob2RzIGFyZSBqdXN0IHRoaW4gd3JhcHBlcnMgYXJvdW5kIHRoZSBlbWJlZGRlZAotLy8gRXh0ZW5zaW9uU2V0LiAgV2hlbiBwYXJzaW5nLCBpZiBhIHRhZyBudW1iZXIgaXMgZW5jb3VudGVyZWQgd2hpY2ggaXMKLS8vIGluc2lkZSBvbmUgb2YgdGhlIG1lc3NhZ2UgdHlwZSdzIGV4dGVuc2lvbiByYW5nZXMsIHRoZSB0YWcgaXMgcGFzc2VkCi0vLyBvZmYgdG8gdGhlIEV4dGVuc2lvblNldCBmb3IgcGFyc2luZy4gIEV0Yy4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFeHRlbnNpb25TZXQgewotIHB1YmxpYzoKLSAgRXh0ZW5zaW9uU2V0KCk7Ci0gIGV4cGxpY2l0IEV4dGVuc2lvblNldCg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7Ci0gIH5FeHRlbnNpb25TZXQoKTsKLQotICAvLyBUaGVzZSBhcmUgY2FsbGVkIGF0IHN0YXJ0dXAgYnkgcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUgdG8KLSAgLy8gcmVnaXN0ZXIga25vd24gZXh0ZW5zaW9ucy4gIFRoZSByZWdpc3RyYXRpb25zIGFyZSB1c2VkIGJ5IFBhcnNlRmllbGQoKQotICAvLyB0byBsb29rIHVwIGV4dGVuc2lvbnMgZm9yIHBhcnNlZCBmaWVsZCBudW1iZXJzLiAgTm90ZSB0aGF0IGR5bmFtaWMgcGFyc2luZwotICAvLyBkb2VzIG5vdCB1c2UgUGFyc2VGaWVsZCgpOyBvbmx5IHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBwYXJzaW5nCi0gIC8vIG1ldGhvZHMgZG8uCi0gIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcGVhdGVkLCBib29sIGlzX3BhY2tlZCk7Ci0gIHN0YXRpYyB2b2lkIFJlZ2lzdGVyRW51bUV4dGVuc2lvbihjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3JlcGVhdGVkLCBib29sIGlzX3BhY2tlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1WYWxpZGl0eUZ1bmMqIGlzX3ZhbGlkKTsKLSAgc3RhdGljIHZvaWQgUmVnaXN0ZXJNZXNzYWdlRXh0ZW5zaW9uKGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcmVwZWF0ZWQsIGJvb2wgaXNfcGFja2VkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZSk7Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvLyBBZGQgYWxsIGZpZWxkcyB3aGljaCBhcmUgY3VycmVudGx5IHByZXNlbnQgdG8gdGhlIGdpdmVuIHZlY3Rvci4gIFRoaXMKLSAgLy8gaXMgdXNlZnVsIHRvIGltcGxlbWVudCBSZWZsZWN0aW9uOjpMaXN0RmllbGRzKCkuCi0gIHZvaWQgQXBwZW5kVG9MaXN0KGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0OwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIEFjY2Vzc29ycwotICAvLwotICAvLyBHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGluY2x1ZGUgdHlwZS1zYWZlIHRlbXBsYXRlZCB3cmFwcGVycyBhcm91bmQKLSAgLy8gdGhlc2UgbWV0aG9kcy4gIEdlbmVyYWxseSB5b3Ugc2hvdWxkIHVzZSB0aG9zZSByYXRoZXIgdGhhbiBjYWxsIHRoZXNlCi0gIC8vIGRpcmVjdGx5LCB1bmxlc3MgeW91IGFyZSBkb2luZyBsb3ctbGV2ZWwgbWVtb3J5IG1hbmFnZW1lbnQuCi0gIC8vCi0gIC8vIFdoZW4gY2FsbGluZyBhbnkgb2YgdGhlc2UgYWNjZXNzb3JzLCB0aGUgZXh0ZW5zaW9uIG51bWJlciByZXF1ZXN0ZWQKLSAgLy8gTVVTVCBleGlzdCBpbiB0aGUgRGVzY3JpcHRvclBvb2wgcHJvdmlkZWQgdG8gdGhlIGNvbnN0cnVjdG9yLiAgT3RoZXJ3aXNlLAotICAvLyB0aGUgbWV0aG9kIHdpbGwgZmFpbCBhbiBhc3NlcnQuICBOb3JtYWxseSwgdGhvdWdoLCB5b3Ugd291bGQgbm90IGNhbGwKLSAgLy8gdGhlc2UgZGlyZWN0bHk7IHlvdSB3b3VsZCBlaXRoZXIgY2FsbCB0aGUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBvZiB5b3VyCi0gIC8vIG1lc3NhZ2UgY2xhc3MgKGUuZy4gR2V0RXh0ZW5zaW9uKCkpIG9yIHlvdSB3b3VsZCBjYWxsIHRoZSBhY2Nlc3NvcnMKLSAgLy8gb2YgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgSW4gYm90aCBjYXNlcywgaXQgaXMgaW1wb3NzaWJsZSB0bwotICAvLyB0cmlnZ2VyIHRoaXMgYXNzZXJ0IGZhaWx1cmU6ICB0aGUgZ2VuZXJhdGVkIGFjY2Vzc29ycyBvbmx5IGFjY2VwdAotICAvLyBsaW5rZWQtaW4gZXh0ZW5zaW9uIHR5cGVzIGFzIHBhcmFtZXRlcnMsIHdoaWxlIHRoZSBSZWZsZWN0aW9uIGludGVyZmFjZQotICAvLyByZXF1aXJlcyB5b3UgdG8gcHJvdmlkZSB0aGUgRmllbGREZXNjcmlwdG9yIGRlc2NyaWJpbmcgdGhlIGV4dGVuc2lvbi4KLSAgLy8KLSAgLy8gV2hlbiBjYWxsaW5nIGFueSBvZiB0aGVzZSBhY2Nlc3NvcnMsIGEgcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkCi0gIC8vIGltcGxlbWVudGF0aW9uIG9mIHRoZSBleHRlbnNpb24gY29ycmVzcG9uZGluZyB0byB0aGUgbnVtYmVyIE1VU1QKLSAgLy8gYmUgbGlua2VkIGluLCBhbmQgdGhlIEZpZWxkRGVzY3JpcHRvciB1c2VkIHRvIHJlZmVyIHRvIGl0IE1VU1QgYmUKLSAgLy8gdGhlIG9uZSBnZW5lcmF0ZWQgYnkgdGhhdCBsaW5rZWQtaW4gY29kZS4gIE90aGVyd2lzZSwgdGhlIG1ldGhvZCB3aWxsCi0gIC8vIGRpZSBvbiBhbiBhc3NlcnQgZmFpbHVyZS4gIFRoZSBtZXNzYWdlIG9iamVjdHMgcmV0dXJuZWQgYnkgdGhlIG1lc3NhZ2UKLSAgLy8gYWNjZXNzb3JzIGFyZSBndWFyYW50ZWVkIHRvIGJlIG9mIHRoZSBjb3JyZWN0IGxpbmtlZC1pbiB0eXBlLgotICAvLwotICAvLyBUaGVzZSBtZXRob2RzIHByZXR0eSBtdWNoIG1hdGNoIFJlZmxlY3Rpb24gZXhjZXB0IHRoYXQ6Ci0gIC8vIC0gVGhleSdyZSBub3QgdmlydHVhbC4KLSAgLy8gLSBUaGV5IGlkZW50aWZ5IGZpZWxkcyBieSBudW1iZXIgcmF0aGVyIHRoYW4gRmllbGREZXNjcmlwdG9ycy4KLSAgLy8gLSBUaGV5IGlkZW50aWZ5IGVudW0gdmFsdWVzIHVzaW5nIGludGVnZXJzIHJhdGhlciB0aGFuIGRlc2NyaXB0b3JzLgotICAvLyAtIFN0cmluZ3MgcHJvdmlkZSBNdXRhYmxlKCkgaW4gYWRkaXRpb24gdG8gU2V0KCkgYWNjZXNzb3JzLgotCi0gIGJvb2wgSGFzKGludCBudW1iZXIpIGNvbnN0OwotICBpbnQgRXh0ZW5zaW9uU2l6ZShpbnQgbnVtYmVyKSBjb25zdDsgICAvLyBTaXplIG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLgotICBpbnQgTnVtRXh0ZW5zaW9ucygpIGNvbnN0OyAgLy8gVGhlIG51bWJlciBvZiBleHRlbnNpb25zCi0gIEZpZWxkVHlwZSBFeHRlbnNpb25UeXBlKGludCBudW1iZXIpIGNvbnN0OwotICB2b2lkIENsZWFyRXh0ZW5zaW9uKGludCBudW1iZXIpOwotCi0gIC8vIHNpbmd1bGFyIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaW50MzIgIEdldEludDMyIChpbnQgbnVtYmVyLCBpbnQzMiAgZGVmYXVsdF92YWx1ZSkgY29uc3Q7Ci0gIGludDY0ICBHZXRJbnQ2NCAoaW50IG51bWJlciwgaW50NjQgIGRlZmF1bHRfdmFsdWUpIGNvbnN0OwotICB1aW50MzIgR2V0VUludDMyKGludCBudW1iZXIsIHVpbnQzMiBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKLSAgdWludDY0IEdldFVJbnQ2NChpbnQgbnVtYmVyLCB1aW50NjQgZGVmYXVsdF92YWx1ZSkgY29uc3Q7Ci0gIGZsb2F0ICBHZXRGbG9hdCAoaW50IG51bWJlciwgZmxvYXQgIGRlZmF1bHRfdmFsdWUpIGNvbnN0OwotICBkb3VibGUgR2V0RG91YmxlKGludCBudW1iZXIsIGRvdWJsZSBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKLSAgYm9vbCAgIEdldEJvb2wgIChpbnQgbnVtYmVyLCBib29sICAgZGVmYXVsdF92YWx1ZSkgY29uc3Q7Ci0gIGludCAgICBHZXRFbnVtICAoaW50IG51bWJlciwgaW50ICAgIGRlZmF1bHRfdmFsdWUpIGNvbnN0OwotICBjb25zdCBzdHJpbmcgJiBHZXRTdHJpbmcgKGludCBudW1iZXIsIGNvbnN0IHN0cmluZyYgIGRlZmF1bHRfdmFsdWUpIGNvbnN0OwotICBjb25zdCBNZXNzYWdlTGl0ZSYgR2V0TWVzc2FnZShpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgZGVmYXVsdF92YWx1ZSkgY29uc3Q7Ci0gIGNvbnN0IE1lc3NhZ2VMaXRlJiBHZXRNZXNzYWdlKGludCBudW1iZXIsIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0OwotCi0gIC8vIHxkZXNjcmlwdG9yfCBtYXkgYmUgTlVMTCBzbyBsb25nIGFzIGl0IGlzIGtub3duIHRoYXQgdGhlIGRlc2NyaXB0b3IgZm9yCi0gIC8vIHRoZSBleHRlbnNpb24gbGl2ZXMgaW4gdGhlIHNhbWUgcG9vbCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGNvbnRhaW5pbmcKLSAgLy8gdHlwZS4KLSNkZWZpbmUgZGVzYyBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgIC8vIGF2b2lkIGxpbmUgd3JhcHBpbmcKLSAgdm9pZCBTZXRJbnQzMiAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGludDMyICB2YWx1ZSwgZGVzYyk7Ci0gIHZvaWQgU2V0SW50NjQgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBpbnQ2NCAgdmFsdWUsIGRlc2MpOwotICB2b2lkIFNldFVJbnQzMihpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgdWludDMyIHZhbHVlLCBkZXNjKTsKLSAgdm9pZCBTZXRVSW50NjQoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIHVpbnQ2NCB2YWx1ZSwgZGVzYyk7Ci0gIHZvaWQgU2V0RmxvYXQgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBmbG9hdCAgdmFsdWUsIGRlc2MpOwotICB2b2lkIFNldERvdWJsZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgZG91YmxlIHZhbHVlLCBkZXNjKTsKLSAgdm9pZCBTZXRCb29sICAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgICB2YWx1ZSwgZGVzYyk7Ci0gIHZvaWQgU2V0RW51bSAgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBpbnQgICAgdmFsdWUsIGRlc2MpOwotICB2b2lkIFNldFN0cmluZyhpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgZGVzYyk7Ci0gIHN0cmluZyAqIE11dGFibGVTdHJpbmcgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBkZXNjKTsKLSAgTWVzc2FnZUxpdGUqIE11dGFibGVNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwgZGVzYyk7Ci0gIE1lc3NhZ2VMaXRlKiBNdXRhYmxlTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlY3NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSk7Ci0gIC8vIEFkZHMgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIEV4dGVuc2lvblNldCwgdGFraW5nIG93bmVyc2hpcCBvZiB0aGUKLSAgLy8gbWVzc2FnZSBvYmplY3QuIEV4aXN0aW5nIG1lc3NhZ2Ugd2l0aCB0aGUgc2FtZSBudW1iZXIgd2lsbCBiZSBkZWxldGVkLgotICAvLyBJZiAibWVzc2FnZSIgaXMgTlVMTCwgdGhpcyBpcyBlcXVpdmFsZW50IHRvICJDbGVhckV4dGVuc2lvbihudW1iZXIpIi4KLSAgdm9pZCBTZXRBbGxvY2F0ZWRNZXNzYWdlKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpOwotICB2b2lkIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7Ci0gIE1lc3NhZ2VMaXRlKiBSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKTsKLSAgTWVzc2FnZUxpdGUqIFVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoCi0gICAgICBpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKTsKLQotICBNZXNzYWdlTGl0ZSogUmVsZWFzZU1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOwotI3VuZGVmIGRlc2MKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7IHJldHVybiBhcmVuYV87IH0KLQotICAvLyByZXBlYXRlZCBmaWVsZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIEZldGNoZXMgYSBSZXBlYXRlZEZpZWxkIGV4dGVuc2lvbiBieSBudW1iZXI7IHJldHVybnMgfGRlZmF1bHRfdmFsdWV8Ci0gIC8vIGlmIG5vIHN1Y2ggZXh0ZW5zaW9uIGV4aXN0cy4gVXNlciBzaG91bGQgbm90IHRvdWNoIHRoaXMgZGlyZWN0bHk7IGl0IGlzCi0gIC8vIHVzZWQgYnkgdGhlIEdldFJlcGVhdGVkRXh0ZW5zaW9uKCkgbWV0aG9kLgotICBjb25zdCB2b2lkKiBHZXRSYXdSZXBlYXRlZEZpZWxkKGludCBudW1iZXIsIGNvbnN0IHZvaWQqIGRlZmF1bHRfdmFsdWUpIGNvbnN0OwotICAvLyBGZXRjaGVzIGEgbXV0YWJsZSB2ZXJzaW9uIG9mIGEgUmVwZWF0ZWRGaWVsZCBleHRlbnNpb24gYnkgbnVtYmVyLAotICAvLyBpbnN0YW50aWF0aW5nIG9uZSBpZiBub25lIGV4aXN0cy4gU2ltaWxhciB0byBhYm92ZSwgdXNlciBzaG91bGQgbm90IHVzZQotICAvLyB0aGlzIGRpcmVjdGx5OyBpdCB1bmRlcmxpZXMgTXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKCkuCi0gIHZvaWQqIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhY2tlZCwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjKTsKLQotICAvLyBUaGlzIGlzIGFuIG92ZXJsb2FkIG9mIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkIHRvIG1haW50YWluIGNvbXBhdGliaWxpdHkKLSAgLy8gd2l0aCBvbGQgY29kZSB1c2luZyBhIHByZXZpb3VzIEFQSS4gVGhpcyB2ZXJzaW9uIG9mCi0gIC8vIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKCkgd2lsbCBHT09HTEVfQ0hFQ0stZmFpbCBvbiBhIG1pc3NpbmcgZXh0ZW5zaW9uLgotICAvLyAoRS5nLjogYm9yZy9jbGllbnRzL2ludGVybmFsL3Byb3RvMS9wcm90bzJfcmVmbGVjdGlvbi5jYy4pCi0gIHZvaWQqIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKGludCBudW1iZXIpOwotCi0gIGludDMyICBHZXRSZXBlYXRlZEludDMyIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQ2NCAgR2V0UmVwZWF0ZWRJbnQ2NCAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKLSAgdWludDMyIEdldFJlcGVhdGVkVUludDMyKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7Ci0gIHVpbnQ2NCBHZXRSZXBlYXRlZFVJbnQ2NChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OwotICBmbG9hdCAgR2V0UmVwZWF0ZWRGbG9hdCAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKLSAgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7Ci0gIGJvb2wgICBHZXRSZXBlYXRlZEJvb2wgIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQgICAgR2V0UmVwZWF0ZWRFbnVtICAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3Qgc3RyaW5nICYgR2V0UmVwZWF0ZWRTdHJpbmcgKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IE1lc3NhZ2VMaXRlJiBHZXRSZXBlYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKLQotICB2b2lkIFNldFJlcGVhdGVkSW50MzIgKGludCBudW1iZXIsIGludCBpbmRleCwgaW50MzIgIHZhbHVlKTsKLSAgdm9pZCBTZXRSZXBlYXRlZEludDY0IChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGludDY0ICB2YWx1ZSk7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRVSW50MzIoaW50IG51bWJlciwgaW50IGluZGV4LCB1aW50MzIgdmFsdWUpOwotICB2b2lkIFNldFJlcGVhdGVkVUludDY0KGludCBudW1iZXIsIGludCBpbmRleCwgdWludDY0IHZhbHVlKTsKLSAgdm9pZCBTZXRSZXBlYXRlZEZsb2F0IChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGZsb2F0ICB2YWx1ZSk7Ci0gIHZvaWQgU2V0UmVwZWF0ZWREb3VibGUoaW50IG51bWJlciwgaW50IGluZGV4LCBkb3VibGUgdmFsdWUpOwotICB2b2lkIFNldFJlcGVhdGVkQm9vbCAgKGludCBudW1iZXIsIGludCBpbmRleCwgYm9vbCAgIHZhbHVlKTsKLSAgdm9pZCBTZXRSZXBlYXRlZEVudW0gIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsIGludCAgICB2YWx1ZSk7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRTdHJpbmcoaW50IG51bWJlciwgaW50IGluZGV4LCBjb25zdCBzdHJpbmcmIHZhbHVlKTsKLSAgc3RyaW5nICogTXV0YWJsZVJlcGVhdGVkU3RyaW5nIChpbnQgbnVtYmVyLCBpbnQgaW5kZXgpOwotICBNZXNzYWdlTGl0ZSogTXV0YWJsZVJlcGVhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBpbnQgaW5kZXgpOwotCi0jZGVmaW5lIGRlc2MgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yICAvLyBhdm9pZCBsaW5lIHdyYXBwaW5nCi0gIHZvaWQgQWRkSW50MzIgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgaW50MzIgIHZhbHVlLCBkZXNjKTsKLSAgdm9pZCBBZGRJbnQ2NCAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBpbnQ2NCAgdmFsdWUsIGRlc2MpOwotICB2b2lkIEFkZFVJbnQzMihpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIHVpbnQzMiB2YWx1ZSwgZGVzYyk7Ci0gIHZvaWQgQWRkVUludDY0KGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgdWludDY0IHZhbHVlLCBkZXNjKTsKLSAgdm9pZCBBZGRGbG9hdCAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBmbG9hdCAgdmFsdWUsIGRlc2MpOwotICB2b2lkIEFkZERvdWJsZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgYm9vbCBwYWNrZWQsIGRvdWJsZSB2YWx1ZSwgZGVzYyk7Ci0gIHZvaWQgQWRkQm9vbCAgKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBib29sIHBhY2tlZCwgYm9vbCAgIHZhbHVlLCBkZXNjKTsKLSAgdm9pZCBBZGRFbnVtICAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGJvb2wgcGFja2VkLCBpbnQgICAgdmFsdWUsIGRlc2MpOwotICB2b2lkIEFkZFN0cmluZyhpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgZGVzYyk7Ci0gIHN0cmluZyAqIEFkZFN0cmluZyAoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsIGRlc2MpOwotICBNZXNzYWdlTGl0ZSogQWRkTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwgZGVzYyk7Ci0gIE1lc3NhZ2VMaXRlKiBBZGRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOwotICB2b2lkIEFkZEFsbG9jYXRlZE1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG5ld19lbnRyeSk7Ci0jdW5kZWYgZGVzYwotCi0gIHZvaWQgUmVtb3ZlTGFzdChpbnQgbnVtYmVyKTsKLSAgTWVzc2FnZUxpdGUqIFJlbGVhc2VMYXN0KGludCBudW1iZXIpOwotICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgbnVtYmVyLCBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUT0RPKGtlbnRvbik6ICBIYXJkY29yZSBtZW1vcnkgbWFuYWdlbWVudCBhY2Nlc3NvcnMKLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBjb252ZW5pZW5jZSBtZXRob2RzIGZvciBpbXBsZW1lbnRpbmcgbWV0aG9kcyBvZiBNZXNzYWdlCi0gIC8vCi0gIC8vIFRoZXNlIGNvdWxkIGFsbCBiZSBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiB0aGUgb3RoZXIgbWV0aG9kcyBvZiB0aGlzCi0gIC8vIGNsYXNzLCBidXQgcHJvdmlkaW5nIHRoZW0gaGVyZSBoZWxwcyBrZWVwIHRoZSBnZW5lcmF0ZWQgY29kZSBzaXplIGRvd24uCi0KLSAgdm9pZCBDbGVhcigpOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBFeHRlbnNpb25TZXQmIG90aGVyKTsKLSAgdm9pZCBTd2FwKEV4dGVuc2lvblNldCogb3RoZXIpOwotICB2b2lkIFN3YXBFeHRlbnNpb24oRXh0ZW5zaW9uU2V0KiBvdGhlciwgaW50IG51bWJlcik7Ci0gIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotCi0gIC8vIFBhcnNlcyBhIHNpbmdsZSBleHRlbnNpb24gZnJvbSB0aGUgaW5wdXQuIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQgb3V0Ci0gIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4KLSAgYm9vbCBQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKLSAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7Ci0KLSAgLy8gU3BlY2lmaWMgdmVyc2lvbnMgZm9yIGxpdGUgb3IgZnVsbCBtZXNzYWdlcyAoY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUKLSAgLy8gRmllbGRTa2lwcGVyIGF1dG9tYXRpY2FsbHkpLiAgfGNvbnRhaW5pbmdfdHlwZXwgaXMgdGhlIGRlZmF1bHQKLSAgLy8gaW5zdGFuY2UgZm9yIHRoZSBjb250YWluaW5nIG1lc3NhZ2U7IGl0IGlzIHVzZWQgb25seSB0byBsb29rIHVwIHRoZQotICAvLyBleHRlbnNpb24gYnkgbnVtYmVyLiAgU2VlIFJlZ2lzdGVyRXh0ZW5zaW9uKCksIGFib3ZlLiAgVW5saWtlIHRoZSBvdGhlcgotICAvLyBtZXRob2RzIG9mIEV4dGVuc2lvblNldCwgdGhpcyBvbmx5IHdvcmtzIGZvciBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlcyAtLQotICAvLyBpdCBsb29rcyB1cCBleHRlbnNpb25zIHJlZ2lzdGVyZWQgdXNpbmcgUmVnaXN0ZXJFeHRlbnNpb24oKS4KLSAgYm9vbCBQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUpOwotICBib29sIFBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7Ci0gIGJvb2wgUGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiB1bmtub3duX2ZpZWxkcyk7Ci0KLSAgLy8gUGFyc2UgYW4gZW50aXJlIG1lc3NhZ2UgaW4gTWVzc2FnZVNldCBmb3JtYXQuICBTdWNoIG1lc3NhZ2VzIGhhdmUgbm8KLSAgLy8gZmllbGRzLCBvbmx5IGV4dGVuc2lvbnMuCi0gIGJvb2wgUGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKTsKLQotICAvLyBTcGVjaWZpYyB2ZXJzaW9ucyBmb3IgbGl0ZSBvciBmdWxsIG1lc3NhZ2VzIChjb25zdHJ1Y3RzIHRoZSBhcHByb3ByaWF0ZQotICAvLyBGaWVsZFNraXBwZXIgYXV0b21hdGljYWxseSkuCi0gIGJvb2wgUGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSk7Ci0gIGJvb2wgUGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLQotICAvLyBXcml0ZSBhbGwgZXh0ZW5zaW9uIGZpZWxkcyB3aXRoIGZpZWxkIG51bWJlcnMgaW4gdGhlIHJhbmdlCi0gIC8vICAgW3N0YXJ0X2ZpZWxkX251bWJlciwgZW5kX2ZpZWxkX251bWJlcikKLSAgLy8gdG8gdGhlIG91dHB1dCBzdHJlYW0sIHVzaW5nIHRoZSBjYWNoZWQgc2l6ZXMgY29tcHV0ZWQgd2hlbiBCeXRlU2l6ZSgpIHdhcwotICAvLyBsYXN0IGNhbGxlZC4gIE5vdGUgdGhhdCB0aGUgcmFuZ2UgYm91bmRzIGFyZSBpbmNsdXNpdmUtZXhjbHVzaXZlLgotICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbnQgc3RhcnRfZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZW5kX2ZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotCi0gIC8vIFNhbWUgYXMgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzLCBidXQgd2l0aG91dCBhbnkgYm91bmRzIGNoZWNraW5nLgotICAvLyBUaGUgY2FsbGVyIG11c3QgZW5zdXJlIHRoYXQgdGFyZ2V0IGhhcyBzdWZmaWNpZW50IGNhcGFjaXR5IGZvciB0aGUKLSAgLy8gc2VyaWFsaXplZCBleHRlbnNpb25zLgotICAvLwotICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KLSAgdWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW50IHN0YXJ0X2ZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGVuZF9maWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIGNvbnN0OwotCi0gIC8vIExpa2UgYWJvdmUgYnV0IHNlcmlhbGl6ZXMgaW4gTWVzc2FnZVNldCBmb3JtYXQuCi0gIHZvaWQgU2VyaWFsaXplTWVzc2FnZVNldFdpdGhDYWNoZWRTaXplcyhpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIHVpbnQ4KiBTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzVG9BcnJheSh1aW50OCogdGFyZ2V0KSBjb25zdDsKLQotICAvLyBSZXR1cm5zIHRoZSB0b3RhbCBzZXJpYWxpemVkIHNpemUgb2YgYWxsIHRoZSBleHRlbnNpb25zLgotICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKLQotICAvLyBMaWtlIEJ5dGVTaXplKCkgYnV0IHVzZXMgTWVzc2FnZVNldCBmb3JtYXQuCi0gIGludCBNZXNzYWdlU2V0Qnl0ZVNpemUoKSBjb25zdDsKLQotICAvLyBSZXR1cm5zIChhbiBlc3RpbWF0ZSBvZikgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB1c2VkIGZvciBzdG9yaW5nIHRoZQotICAvLyBleHRlbnNpb25zIGluIG1lbW9yeSwgZXhjbHVkaW5nIHNpemVvZigqdGhpcykuICBJZiB0aGUgRXh0ZW5zaW9uU2V0IGlzCi0gIC8vIGZvciBhIGxpdGUgbWVzc2FnZSAoYW5kIHRodXMgcG9zc2libHkgY29udGFpbnMgbGl0ZSBtZXNzYWdlcyksIHRoZSByZXN1bHRzCi0gIC8vIGFyZSB1bmRlZmluZWQgKG1pZ2h0IHdvcmssIG1pZ2h0IGNyYXNoLCBtaWdodCBjb3JydXB0IGRhdGEsIG1pZ2h0IG5vdCBldmVuCi0gIC8vIGJlIGxpbmtlZCBpbikuICBJdCdzIHVwIHRvIHRoZSBwcm90b2NvbCBjb21waWxlciB0byBhdm9pZCBjYWxsaW5nIHRoaXMgb24KLSAgLy8gc3VjaCBFeHRlbnNpb25TZXRzIChlYXN5IGVub3VnaCBzaW5jZSBsaXRlIG1lc3NhZ2VzIGRvbid0IGltcGxlbWVudAotICAvLyBTcGFjZVVzZWQoKSkuCi0gIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotCi0gIC8vIEludGVyZmFjZSBvZiBhIGxhemlseSBwYXJzZWQgc2luZ3VsYXIgbWVzc2FnZSBleHRlbnNpb24uCi0gIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBMYXp5TWVzc2FnZUV4dGVuc2lvbiB7Ci0gICBwdWJsaWM6Ci0gICAgTGF6eU1lc3NhZ2VFeHRlbnNpb24oKSB7fQotICAgIHZpcnR1YWwgfkxhenlNZXNzYWdlRXh0ZW5zaW9uKCkge30KLQotICAgIHZpcnR1YWwgTGF6eU1lc3NhZ2VFeHRlbnNpb24qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgY29uc3QgTWVzc2FnZUxpdGUmIEdldE1lc3NhZ2UoCi0gICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIE1lc3NhZ2VMaXRlKiBNdXRhYmxlTWVzc2FnZShjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZUxpdGUgKm1lc3NhZ2UpID0gMDsKLSAgICB2aXJ0dWFsIHZvaWQgVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRNZXNzYWdlKE1lc3NhZ2VMaXRlICptZXNzYWdlKSA9IDA7Ci0gICAgdmlydHVhbCBNZXNzYWdlTGl0ZSogUmVsZWFzZU1lc3NhZ2UoY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSkgPSAwOwotICAgIHZpcnR1YWwgTWVzc2FnZUxpdGUqIFVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoCi0gICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUpID0gMDsKLQotICAgIHZpcnR1YWwgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50IEJ5dGVTaXplKCkgY29uc3QgPSAwOwotICAgIHZpcnR1YWwgaW50IFNwYWNlVXNlZCgpIGNvbnN0ID0gMDsKLQotICAgIHZpcnR1YWwgdm9pZCBNZXJnZUZyb20oY29uc3QgTGF6eU1lc3NhZ2VFeHRlbnNpb24mIG90aGVyKSA9IDA7Ci0gICAgdmlydHVhbCB2b2lkIENsZWFyKCkgPSAwOwotCi0gICAgdmlydHVhbCBib29sIFJlYWRNZXNzYWdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgPSAwOwotICAgIHZpcnR1YWwgdm9pZCBXcml0ZU1lc3NhZ2UoaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCA9IDA7Ci0gICAgdmlydHVhbCB1aW50OCogV3JpdGVNZXNzYWdlVG9BcnJheShpbnQgbnVtYmVyLCB1aW50OCogdGFyZ2V0KSBjb25zdCA9IDA7Ci0gICBwcml2YXRlOgotICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMYXp5TWVzc2FnZUV4dGVuc2lvbik7Ci0gIH07Ci0gIHN0cnVjdCBFeHRlbnNpb24gewotICAgIC8vIFRoZSBvcmRlciBvZiB0aGVzZSBmaWVsZHMgcGFja3MgRXh0ZW5zaW9uIGludG8gMjQgYnl0ZXMgd2hlbiB1c2luZyA4Ci0gICAgLy8gYnl0ZSBhbGlnbm1lbnQuIENvbnNpZGVyIHRoaXMgd2hlbiBhZGRpbmcgb3IgcmVtb3ZpbmcgZmllbGRzIGhlcmUuCi0gICAgdW5pb24gewotICAgICAgaW50MzIgICAgICAgICAgICAgICAgIGludDMyX3ZhbHVlOwotICAgICAgaW50NjQgICAgICAgICAgICAgICAgIGludDY0X3ZhbHVlOwotICAgICAgdWludDMyICAgICAgICAgICAgICAgIHVpbnQzMl92YWx1ZTsKLSAgICAgIHVpbnQ2NCAgICAgICAgICAgICAgICB1aW50NjRfdmFsdWU7Ci0gICAgICBmbG9hdCAgICAgICAgICAgICAgICAgZmxvYXRfdmFsdWU7Ci0gICAgICBkb3VibGUgICAgICAgICAgICAgICAgZG91YmxlX3ZhbHVlOwotICAgICAgYm9vbCAgICAgICAgICAgICAgICAgIGJvb2xfdmFsdWU7Ci0gICAgICBpbnQgICAgICAgICAgICAgICAgICAgZW51bV92YWx1ZTsKLSAgICAgIHN0cmluZyogICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU7Ci0gICAgICBNZXNzYWdlTGl0ZSogICAgICAgICAgbWVzc2FnZV92YWx1ZTsKLSAgICAgIExhenlNZXNzYWdlRXh0ZW5zaW9uKiBsYXp5bWVzc2FnZV92YWx1ZTsKLQotICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxpbnQzMiAgICAgID4qIHJlcGVhdGVkX2ludDMyX3ZhbHVlOwotICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxpbnQ2NCAgICAgID4qIHJlcGVhdGVkX2ludDY0X3ZhbHVlOwotICAgICAgUmVwZWF0ZWRGaWVsZCAgIDx1aW50MzIgICAgID4qIHJlcGVhdGVkX3VpbnQzMl92YWx1ZTsKLSAgICAgIFJlcGVhdGVkRmllbGQgICA8dWludDY0ICAgICA+KiByZXBlYXRlZF91aW50NjRfdmFsdWU7Ci0gICAgICBSZXBlYXRlZEZpZWxkICAgPGZsb2F0ICAgICAgPiogcmVwZWF0ZWRfZmxvYXRfdmFsdWU7Ci0gICAgICBSZXBlYXRlZEZpZWxkICAgPGRvdWJsZSAgICAgPiogcmVwZWF0ZWRfZG91YmxlX3ZhbHVlOwotICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxib29sICAgICAgID4qIHJlcGVhdGVkX2Jvb2xfdmFsdWU7Ci0gICAgICBSZXBlYXRlZEZpZWxkICAgPGludCAgICAgICAgPiogcmVwZWF0ZWRfZW51bV92YWx1ZTsKLSAgICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nICAgICA+KiByZXBlYXRlZF9zdHJpbmdfdmFsdWU7Ci0gICAgICBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiogcmVwZWF0ZWRfbWVzc2FnZV92YWx1ZTsKLSAgICB9OwotCi0gICAgRmllbGRUeXBlIHR5cGU7Ci0gICAgYm9vbCBpc19yZXBlYXRlZDsKLQotICAgIC8vIEZvciBzaW5ndWxhciB0eXBlcywgaW5kaWNhdGVzIGlmIHRoZSBleHRlbnNpb24gaXMgImNsZWFyZWQiLiAgVGhpcwotICAgIC8vIGhhcHBlbnMgd2hlbiBhbiBleHRlbnNpb24gaXMgc2V0IGFuZCB0aGVuIGxhdGVyIGNsZWFyZWQgYnkgdGhlIGNhbGxlci4KLSAgICAvLyBXZSB3YW50IHRvIGtlZXAgdGhlIEV4dGVuc2lvbiBvYmplY3QgYXJvdW5kIGZvciByZXVzZSwgc28gaW5zdGVhZCBvZgotICAgIC8vIHJlbW92aW5nIGl0IGZyb20gdGhlIG1hcCwgd2UganVzdCBzZXQgaXNfY2xlYXJlZCA9IHRydWUuICBUaGlzIGhhcyBubwotICAgIC8vIG1lYW5pbmcgZm9yIHJlcGVhdGVkIHR5cGVzOyBmb3IgdGhvc2UsIHRoZSBzaXplIG9mIHRoZSBSZXBlYXRlZEZpZWxkCi0gICAgLy8gc2ltcGx5IGJlY29tZXMgemVybyB3aGVuIGNsZWFyZWQuCi0gICAgYm9vbCBpc19jbGVhcmVkIDogNDsKLQotICAgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlIHR5cGVzLCBpbmRpY2F0ZXMgd2hldGhlciBsYXp5IHBhcnNpbmcgaXMgZW5hYmxlZAotICAgIC8vIGZvciB0aGlzIGV4dGVuc2lvbi4gVGhpcyBmaWVsZCBpcyBvbmx5IHZhbGlkIHdoZW4gdHlwZSA9PSBUWVBFX01FU1NBR0UKLSAgICAvLyBhbmQgIWlzX3JlcGVhdGVkIGJlY2F1c2Ugd2Ugb25seSBzdXBwb3J0IGxhenkgcGFyc2luZyBmb3Igc2luZ3VsYXIKLSAgICAvLyBtZXNzYWdlIHR5cGVzIGN1cnJlbnRseS4gSWYgaXNfbGF6eSA9IHRydWUsIHRoZSBleHRlbnNpb24gaXMgc3RvcmVkIGluCi0gICAgLy8gbGF6eW1lc3NhZ2VfdmFsdWUuIE90aGVyd2lzZSwgdGhlIGV4dGVuc2lvbiB3aWxsIGJlIG1lc3NhZ2VfdmFsdWUuCi0gICAgYm9vbCBpc19sYXp5IDogNDsKLQotICAgIC8vIEZvciByZXBlYXRlZCB0eXBlcywgdGhpcyBpbmRpY2F0ZXMgaWYgdGhlIFtwYWNrZWQ9dHJ1ZV0gb3B0aW9uIGlzIHNldC4KLSAgICBib29sIGlzX3BhY2tlZDsKLQotICAgIC8vIEZvciBwYWNrZWQgZmllbGRzLCB0aGUgc2l6ZSBvZiB0aGUgcGFja2VkIGRhdGEgaXMgcmVjb3JkZWQgaGVyZSB3aGVuCi0gICAgLy8gQnl0ZVNpemUoKSBpcyBjYWxsZWQgdGhlbiB1c2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLgotICAgIC8vIFRPRE8oa2VudG9uKTogIFVzZSBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KLSAgICBtdXRhYmxlIGludCBjYWNoZWRfc2l6ZTsKLQotICAgIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIGV4dGVuc2lvbiwgaWYgb25lIGV4aXN0cyBhbmQgaXMga25vd24uICBNYXkgYmUKLSAgICAvLyBOVUxMLiAgTXVzdCBub3QgYmUgTlVMTCBpZiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGV4dGVuc2lvbiBkb2VzIG5vdAotICAgIC8vIGxpdmUgaW4gdGhlIHNhbWUgcG9vbCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGNvbnRhaW5pbmcgdHlwZS4KLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7Ci0KLSAgICAvLyBTb21lIGhlbHBlciBtZXRob2RzIGZvciBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIEV4dGVuc2lvbi4KLSAgICB2b2lkIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAotICAgICAgICBpbnQgbnVtYmVyLAotICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gICAgdWludDgqIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgICAgaW50IG51bWJlciwKLSAgICAgICAgdWludDgqIHRhcmdldCkgY29uc3Q7Ci0gICAgdm9pZCBTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplcygKLSAgICAgICAgaW50IG51bWJlciwKLSAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICAgIHVpbnQ4KiBTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgICAgIGludCBudW1iZXIsCi0gICAgICAgIHVpbnQ4KiB0YXJnZXQpIGNvbnN0OwotICAgIGludCBCeXRlU2l6ZShpbnQgbnVtYmVyKSBjb25zdDsKLSAgICBpbnQgTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZShpbnQgbnVtYmVyKSBjb25zdDsKLSAgICB2b2lkIENsZWFyKCk7Ci0gICAgaW50IEdldFNpemUoKSBjb25zdDsKLSAgICB2b2lkIEZyZWUoKTsKLSAgICBpbnQgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0OwotICB9OwotCi0KLSAgLy8gTWVyZ2VzIGV4aXN0aW5nIEV4dGVuc2lvbiBmcm9tIG90aGVyX2V4dGVuc2lvbgotICB2b2lkIEludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvbiYgb3RoZXJfZXh0ZW5zaW9uKTsKLQotICAvLyBSZXR1cm5zIHRydWUgYW5kIGZpbGxzIGZpZWxkX251bWJlciBhbmQgZXh0ZW5zaW9uIGlmIGV4dGVuc2lvbiBpcyBmb3VuZC4KLSAgLy8gTm90ZSB0byBzdXBwb3J0IHBhY2tlZCByZXBlYXRlZCBmaWVsZCBjb21wYXRpYmlsaXR5LCBpdCBhbHNvIGZpbGxzIHdoZXRoZXIKLSAgLy8gdGhlIHRhZyBvbiB3aXJlIGlzIHBhY2tlZCwgd2hpY2ggY2FuIGJlIGRpZmZlcmVudCBmcm9tCi0gIC8vIGV4dGVuc2lvbi0+aXNfcGFja2VkICh3aGV0aGVyIHBhY2tlZD10cnVlIGlzIHNwZWNpZmllZCkuCi0gIGJvb2wgRmluZEV4dGVuc2lvbkluZm9Gcm9tVGFnKHVpbnQzMiB0YWcsIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBmaWVsZF9udW1iZXIsIEV4dGVuc2lvbkluZm8qIGV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FzX3BhY2tlZF9vbl93aXJlKTsKLQotICAvLyBSZXR1cm5zIHRydWUgYW5kIGZpbGxzIGV4dGVuc2lvbiBpZiBleHRlbnNpb24gaXMgZm91bmQuCi0gIC8vIE5vdGUgdG8gc3VwcG9ydCBwYWNrZWQgcmVwZWF0ZWQgZmllbGQgY29tcGF0aWJpbGl0eSwgaXQgYWxzbyBmaWxscyB3aGV0aGVyCi0gIC8vIHRoZSB0YWcgb24gd2lyZSBpcyBwYWNrZWQsIHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbQotICAvLyBleHRlbnNpb24tPmlzX3BhY2tlZCAod2hldGhlciBwYWNrZWQ9dHJ1ZSBpcyBzcGVjaWZpZWQpLgotICBib29sIEZpbmRFeHRlbnNpb25JbmZvRnJvbUZpZWxkTnVtYmVyKGludCB3aXJlX3R5cGUsIGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkluZm8qIGV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiB3YXNfcGFja2VkX29uX3dpcmUpOwotCi0gIC8vIFBhcnNlcyBhIHNpbmdsZSBleHRlbnNpb24gZnJvbSB0aGUgaW5wdXQuIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQgb3V0Ci0gIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHdpcmUgdGFnLiBUaGlzIG1ldGhvZCBpcyBjYWxsZWQgaW4KLSAgLy8gUGFyc2VGaWVsZCgpIGFmdGVyIGZpZWxkIG51bWJlciBhbmQgd2FzX3BhY2tlZF9vbl93aXJlIGlzIGV4dHJhY3RlZCBmcm9tCi0gIC8vIHRoZSB3aXJlIHRhZyBhbmQgRXh0ZW5zaW9uSW5mbyBpcyBmb3VuZCBieSB0aGUgZmllbGQgbnVtYmVyLgotICBib29sIFBhcnNlRmllbGRXaXRoRXh0ZW5zaW9uSW5mbyhpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHdhc19wYWNrZWRfb25fd2lyZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uSW5mbyYgZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7Ci0KLSAgLy8gTGlrZSBQYXJzZUZpZWxkKCksIGJ1dCB0aGlzIG1ldGhvZCBtYXkgcGFyc2Ugc2luZ3VsYXIgbWVzc2FnZSBleHRlbnNpb25zCi0gIC8vIGxhemlseSBkZXBlbmRpbmcgb24gdGhlIHZhbHVlIG9mIEZMQUdTX2VhZ2VybHlfcGFyc2VfbWVzc2FnZV9zZXRzLgotICBib29sIFBhcnNlRmllbGRNYXliZUxhemlseShpbnQgd2lyZV90eXBlLCBpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNldEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7Ci0KLSAgLy8gR2V0cyB0aGUgZXh0ZW5zaW9uIHdpdGggdGhlIGdpdmVuIG51bWJlciwgY3JlYXRpbmcgaXQgaWYgaXQgZG9lcyBub3QKLSAgLy8gYWxyZWFkeSBleGlzdC4gIFJldHVybnMgdHJ1ZSBpZiB0aGUgZXh0ZW5zaW9uIGRpZCBub3QgYWxyZWFkeSBleGlzdC4KLSAgYm9vbCBNYXliZU5ld0V4dGVuc2lvbihpbnQgbnVtYmVyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKiogcmVzdWx0KTsKLQotICAvLyBHZXRzIHRoZSByZXBlYXRlZCBleHRlbnNpb24gZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yLCBjcmVhdGluZyBpdCBpZgotICAvLyBpdCBkb2VzIG5vdCBleGlzdC4KLSAgRXh0ZW5zaW9uKiBNYXliZU5ld1JlcGVhdGVkRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0KLSAgLy8gUGFyc2UgYSBzaW5nbGUgTWVzc2FnZVNldCBpdGVtIC0tIGNhbGxlZCBqdXN0IGFmdGVyIHRoZSBpdGVtIGdyb3VwIHN0YXJ0Ci0gIC8vIHRhZyBoYXMgYmVlbiByZWFkLgotICBib29sIFBhcnNlTWVzc2FnZVNldEl0ZW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVNldEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7Ci0KLSAgLy8gSGFjazogIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRlY2xhcmVzIEV4dGVuc2lvblNldCBhcyBhIGZyaWVuZC4gIFRoaXMKLSAgLy8gICBmcmllbmRzaGlwIHNob3VsZCBhdXRvbWF0aWNhbGx5IGV4dGVuZCB0byBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiwgYnV0Ci0gIC8vICAgdW5mb3J0dW5hdGVseSBzb21lIG9sZGVyIGNvbXBpbGVycyAoZS5nLiBHQ0MgMy40LjQpIGRvIG5vdCBpbXBsZW1lbnQgdGhpcwotICAvLyAgIGNvcnJlY3RseS4gIFNvLCB3ZSBtdXN0IHByb3ZpZGUgaGVscGVycyBmb3IgY2FsbGluZyBtZXRob2RzIG9mIHRoYXQKLSAgLy8gICBjbGFzcy4KLQotICAvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCi0gIHN0YXRpYyBpbmxpbmUgaW50IFJlcGVhdGVkTWVzc2FnZV9TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKAotICAgICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIGZpZWxkKTsKLQotICAvLyBUaGUgRXh0ZW5zaW9uIHN0cnVjdCBpcyBzbWFsbCBlbm91Z2ggdG8gYmUgcGFzc2VkIGJ5IHZhbHVlLCBzbyB3ZSB1c2UgaXQKLSAgLy8gZGlyZWN0bHkgYXMgdGhlIHZhbHVlIHR5cGUgaW4gdGhlIG1hcCByYXRoZXIgdGhhbiB1c2UgcG9pbnRlcnMuICBXZSB1c2UKLSAgLy8gYSBtYXAgcmF0aGVyIHRoYW4gaGFzaF9tYXAgaGVyZSBiZWNhdXNlIHdlIGV4cGVjdCBtb3N0IEV4dGVuc2lvblNldHMgd2lsbAotICAvLyBvbmx5IGNvbnRhaW4gYSBzbWFsbCBudW1iZXIgb2YgZXh0ZW5zaW9ucyB3aGVyZWFzIGhhc2hfbWFwIGlzIG9wdGltaXplZAotICAvLyBmb3IgMTAwIGVsZW1lbnRzIG9yIG1vcmUuICBBbHNvLCB3ZSB3YW50IEFwcGVuZFRvTGlzdCgpIHRvIG9yZGVyIGZpZWxkcwotICAvLyBieSBmaWVsZCBudW1iZXIuCi0gIHN0ZDo6bWFwPGludCwgRXh0ZW5zaW9uPiBleHRlbnNpb25zXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmFfOwotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXh0ZW5zaW9uU2V0KTsKLX07Ci0KLS8vIFRoZXNlIGFyZSBqdXN0IGZvciBjb252ZW5pZW5jZS4uLgotaW5saW5lIHZvaWQgRXh0ZW5zaW9uU2V0OjpTZXRTdHJpbmcoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIE11dGFibGVTdHJpbmcobnVtYmVyLCB0eXBlLCBkZXNjcmlwdG9yKS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEV4dGVuc2lvblNldDo6U2V0UmVwZWF0ZWRTdHJpbmcoaW50IG51bWJlciwgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSB7Ci0gIE11dGFibGVSZXBlYXRlZFN0cmluZyhudW1iZXIsIGluZGV4KS0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEV4dGVuc2lvblNldDo6QWRkU3RyaW5nKGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBBZGRTdHJpbmcobnVtYmVyLCB0eXBlLCBkZXNjcmlwdG9yKS0+YXNzaWduKHZhbHVlKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gR2x1ZSBmb3IgZ2VuZXJhdGVkIGV4dGVuc2lvbiBhY2Nlc3NvcnMKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVGVtcGxhdGUgbWFnaWMKLQotLy8gRmlyc3Qgd2UgaGF2ZSBhIHNldCBvZiBjbGFzc2VzIHJlcHJlc2VudGluZyAidHlwZSB0cmFpdHMiIGZvciBkaWZmZXJlbnQKLS8vIGZpZWxkIHR5cGVzLiAgQSB0eXBlIHRyYWl0cyBjbGFzcyBrbm93cyBob3cgdG8gaW1wbGVtZW50IGJhc2ljIGFjY2Vzc29ycwotLy8gZm9yIGV4dGVuc2lvbnMgb2YgYSBwYXJ0aWN1bGFyIHR5cGUgZ2l2ZW4gYW4gRXh0ZW5zaW9uU2V0LiAgVGhlIHNpZ25hdHVyZQotLy8gZm9yIGEgdHlwZSB0cmFpdHMgY2xhc3MgbG9va3MgbGlrZSB0aGlzOgotLy8KLS8vICAgY2xhc3MgVHlwZVRyYWl0cyB7Ci0vLyAgICBwdWJsaWM6Ci0vLyAgICAgdHlwZWRlZiA/IENvbnN0VHlwZTsKLS8vICAgICB0eXBlZGVmID8gTXV0YWJsZVR5cGU7Ci0vLyAgICAgLy8gVHlwZVRyYWl0cyBmb3Igc2luZ3VsYXIgZmllbGRzIGFuZCByZXBlYXRlZCBmaWVsZHMgd2lsbCBkZWZpbmUgdGhlCi0vLyAgICAgLy8gc3ltYm9sICJTaW5ndWxhciIgb3IgIlJlcGVhdGVkIiByZXNwZWN0aXZlbHkuIFRoZXNlIHR3byBzeW1ib2xzIHdpbGwKLS8vICAgICAvLyBiZSB1c2VkIGluIGV4dGVuc2lvbiBhY2Nlc3NvcnMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaW5ndWxhcgotLy8gICAgIC8vIGV4dGVuc2lvbnMgYW5kIHJlcGVhdGVkIGV4dGVuc2lvbnMuIElmIHRoZSBUeXBlVHJhaXRzIGZvciB0aGUgcGFzc2VkCi0vLyAgICAgLy8gaW4gZXh0ZW5zaW9uIGRvZXNuJ3QgaGF2ZSB0aGUgZXhwZWN0ZWQgc3ltYm9sIGRlZmluZWQsIGl0IG1lYW5zIHRoZQotLy8gICAgIC8vIHVzZXIgaXMgcGFzc2luZyBhIHJlcGVhdGVkIGV4dGVuc2lvbiB0byBhIHNpbmd1bGFyIGFjY2Vzc29yLCBvciB0aGUKLS8vICAgICAvLyBvcHBvc2l0ZS4gSW4gdGhhdCBjYXNlIHRoZSBDKysgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvcgotLy8gICAgIC8vIG1lc3NhZ2UgIm5vIG1hdGNoaW5nIG1lbWJlciBmdW5jdGlvbiIgdG8gaW5mb3JtIHRoZSB1c2VyLgotLy8gICAgIHR5cGVkZWYgPyBTaW5ndWxhcgotLy8gICAgIHR5cGVkZWYgPyBSZXBlYXRlZAotLy8KLS8vICAgICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpOwotLy8gICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7Ci0vLyAgICAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBNdXRhYmxlKGludCBudW1iZXIsIEV4dGVuc2lvblNldCogc2V0KTsKLS8vCi0vLyAgICAgLy8gVmFyaWFudHMgZm9yIHJlcGVhdGVkIGZpZWxkcy4KLS8vICAgICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7Ci0vLyAgICAgc3RhdGljIGlubGluZSB2b2lkIFNldChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KTsKLS8vICAgICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIE11dGFibGUoaW50IG51bWJlciwgaW50IGluZGV4LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIHNldCk7Ci0vLyAgICAgc3RhdGljIGlubGluZSB2b2lkIEFkZChpbnQgbnVtYmVyLCBDb25zdFR5cGUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KTsKLS8vICAgICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIEFkZChpbnQgbnVtYmVyLCBFeHRlbnNpb25TZXQqIHNldCk7Ci0vLyAgIH07Ci0vLwotLy8gTm90IGFsbCBvZiB0aGVzZSBtZXRob2RzIG1ha2Ugc2Vuc2UgZm9yIGFsbCBmaWVsZCB0eXBlcy4gIEZvciBleGFtcGxlLCB0aGUKLS8vICJNdXRhYmxlIiBtZXRob2RzIG9ubHkgbWFrZSBzZW5zZSBmb3Igc3RyaW5ncyBhbmQgbWVzc2FnZXMsIGFuZCB0aGUKLS8vIHJlcGVhdGVkIG1ldGhvZHMgb25seSBtYWtlIHNlbnNlIGZvciByZXBlYXRlZCB0eXBlcy4gIFNvLCBlYWNoIHR5cGUKLS8vIHRyYWl0cyBjbGFzcyBpbXBsZW1lbnRzIG9ubHkgdGhlIHNldCBvZiBtZXRob2RzIGZyb20gdGhpcyBzaWduYXR1cmUgdGhhdCBpdAotLy8gYWN0dWFsbHkgc3VwcG9ydHMuICBUaGlzIHdpbGwgY2F1c2UgYSBjb21waWxlciBlcnJvciBpZiB0aGUgdXNlciB0cmllcyB0bwotLy8gYWNjZXNzIGFuIGV4dGVuc2lvbiB1c2luZyBhIG1ldGhvZCB0aGF0IGRvZXNuJ3QgbWFrZSBzZW5zZSBmb3IgaXRzIHR5cGUuCi0vLyBGb3IgZXhhbXBsZSwgaWYgImZvbyIgaXMgYW4gZXh0ZW5zaW9uIG9mIHR5cGUgIm9wdGlvbmFsIGludDMyIiwgdGhlbiBpZiB5b3UKLS8vIHRyeSB0byB3cml0ZSBjb2RlIGxpa2U6Ci0vLyAgIG15X21lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbihmb28pCi0vLyB5b3Ugd2lsbCBnZXQgYSBjb21waWxlIGVycm9yIGJlY2F1c2UgUHJpbWl0aXZlVHlwZVRyYWl0czxpbnQzMj4gZG9lcyBub3QKLS8vIGhhdmUgYSAiTXV0YWJsZSgpIiBtZXRob2QuCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFByaW1pdGl2ZVR5cGVUcmFpdHMKLQotLy8gU2luY2UgdGhlIEV4dGVuc2lvblNldCBoYXMgZGlmZmVyZW50IG1ldGhvZHMgZm9yIGVhY2ggcHJpbWl0aXZlIHR5cGUsCi0vLyB3ZSBtdXN0IGV4cGxpY2l0bHkgZGVmaW5lIHRoZSBtZXRob2RzIG9mIHRoZSB0eXBlIHRyYWl0cyBjbGFzcyBmb3IgZWFjaAotLy8ga25vd24gdHlwZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotY2xhc3MgUHJpbWl0aXZlVHlwZVRyYWl0cyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOwotICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7Ci0gIHR5cGVkZWYgUHJpbWl0aXZlVHlwZVRyYWl0czxUeXBlPiBTaW5ndWxhcjsKLQotICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb25zdFR5cGUgZGVmYXVsdF92YWx1ZSk7Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLWNsYXNzIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0cyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOwotICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7Ci0gIHR5cGVkZWYgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFR5cGU+IFJlcGVhdGVkOwotCi0gIHR5cGVkZWYgUmVwZWF0ZWRGaWVsZDxUeXBlPiBSZXBlYXRlZEZpZWxkVHlwZTsKLQotICBzdGF0aWMgaW5saW5lIFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBpbnQgaW5kZXgpOwotICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIGludCBpbmRleCwgVHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpOwotICBzdGF0aWMgaW5saW5lIHZvaWQgQWRkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLCBUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7Ci0KLSAgc3RhdGljIGlubGluZSBjb25zdCBSZXBlYXRlZEZpZWxkPENvbnN0VHlwZT4mCi0gICAgICBHZXRSZXBlYXRlZChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCk7Ci0gIHN0YXRpYyBpbmxpbmUgUmVwZWF0ZWRGaWVsZDxUeXBlPioKLSAgICAgIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwgRXh0ZW5zaW9uU2V0KiBzZXQpOwotCi0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSogR2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKTsKLX07Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gUHJvdG9idWZPbmNlVHlwZSByZXBlYXRlZF9wcmltaXRpdmVfZ2VuZXJpY190eXBlX3RyYWl0c19vbmNlX2luaXRfOwotCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0cyB7Ci0gcHJpdmF0ZToKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4gZnJpZW5kIGNsYXNzIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0czsKLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpOwotICBzdGF0aWMgdm9pZCBEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCk7Ci0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyPiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl87Ci0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGludDY0PiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQ2NF87Ci0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMj4qIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfdWludDMyXzsKLSAgc3RhdGljIGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDY0PiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF91aW50NjRfOwotICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZDxkb3VibGU+KiBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2RvdWJsZV87Ci0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGZsb2F0PiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9mbG9hdF87Ci0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGJvb2w+KiBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2Jvb2xfOwotfTsKLQotI2RlZmluZSBQUk9UT0JVRl9ERUZJTkVfUFJJTUlUSVZFX1RZUEUoVFlQRSwgTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiBpbmxpbmUgVFlQRSBQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpHZXQoICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBUWVBFIGRlZmF1bHRfdmFsdWUpIHsgICAgICAgICAgICAgXAotICByZXR1cm4gc2V0LkdldCMjTUVUSE9EKG51bWJlciwgZGVmYXVsdF92YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBQcmltaXRpdmVUeXBlVHJhaXRzPFRZUEU+OjpTZXQoICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLCBUWVBFIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgeyAgICAgXAotICBzZXQtPlNldCMjTUVUSE9EKG51bWJlciwgZmllbGRfdHlwZSwgdmFsdWUsIE5VTEwpOyAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiBpbmxpbmUgVFlQRSBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OkdldCggICAgICAgICAgICAgXAotICAgIGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBpbnQgaW5kZXgpIHsgICAgICAgICAgICAgICAgICAgICAgXAotICByZXR1cm4gc2V0LkdldFJlcGVhdGVkIyNNRVRIT0QobnVtYmVyLCBpbmRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OlNldCggICAgICAgICAgICAgXAotICAgIGludCBudW1iZXIsIGludCBpbmRleCwgVFlQRSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsgICAgICAgICAgICAgICAgXAotICBzZXQtPlNldFJlcGVhdGVkIyNNRVRIT0QobnVtYmVyLCBpbmRleCwgdmFsdWUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiBpbmxpbmUgdm9pZCBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OkFkZCggICAgICAgICAgICAgXAotICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLCBib29sIGlzX3BhY2tlZCwgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFRZUEUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBzZXQtPkFkZCMjTUVUSE9EKG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLCB2YWx1ZSwgTlVMTCk7ICAgICAgICAgICAgXAotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgUmVwZWF0ZWRGaWVsZDxUWVBFPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKSB7ICAgICAgICAgXAotICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAmcmVwZWF0ZWRfcHJpbWl0aXZlX2dlbmVyaWNfdHlwZV90cmFpdHNfb25jZV9pbml0XywgICAgICAgICAgICAgICAgICBcCi0gICAgICAmUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcyk7IFwKLSAgcmV0dXJuIFJlcGVhdGVkUHJpbWl0aXZlR2VuZXJpY1R5cGVUcmFpdHM6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfIyNUWVBFIyNfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPD4gaW5saW5lIGNvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OkdldFJlcGVhdGVkKGludCBudW1iZXIsICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpIHsgIFwKLSAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4qPiggICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuR2V0UmF3UmVwZWF0ZWRGaWVsZCggICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLCBHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpKSk7ICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPD4gaW5saW5lIFJlcGVhdGVkRmllbGQ8VFlQRT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46Ok11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZSBmaWVsZF90eXBlLCAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7ICAgIFwKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUWVBFPio+KCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHNldC0+TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBmaWVsZF90eXBlLCBpc19wYWNrZWQsIE5VTEwpKTsgIFwKLX0KLQotUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBpbnQzMiwgIEludDMyKQotUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBpbnQ2NCwgIEludDY0KQotUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKHVpbnQzMiwgVUludDMyKQotUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKHVpbnQ2NCwgVUludDY0KQotUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBmbG9hdCwgIEZsb2F0KQotUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKGRvdWJsZSwgRG91YmxlKQotUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCAgYm9vbCwgICBCb29sKQotCi0jdW5kZWYgUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFN0cmluZ1R5cGVUcmFpdHMKLQotLy8gU3RyaW5ncyBzdXBwb3J0IGJvdGggU2V0KCkgYW5kIE11dGFibGUoKS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdUeXBlVHJhaXRzIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgY29uc3Qgc3RyaW5nJiBDb25zdFR5cGU7Ci0gIHR5cGVkZWYgc3RyaW5nKiBNdXRhYmxlVHlwZTsKLSAgdHlwZWRlZiBTdHJpbmdUeXBlVHJhaXRzIFNpbmd1bGFyOwotCi0gIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RyaW5nJiBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpIHsKLSAgICByZXR1cm4gc2V0LkdldFN0cmluZyhudW1iZXIsIGRlZmF1bHRfdmFsdWUpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKLSAgICBzZXQtPlNldFN0cmluZyhudW1iZXIsIGZpZWxkX3R5cGUsIHZhbHVlLCBOVUxMKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIHN0cmluZyogTXV0YWJsZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKLSAgICByZXR1cm4gc2V0LT5NdXRhYmxlU3RyaW5nKG51bWJlciwgZmllbGRfdHlwZSwgTlVMTCk7Ci0gIH0KLX07Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gUHJvdG9idWZPbmNlVHlwZSByZXBlYXRlZF9zdHJpbmdfdHlwZV90cmFpdHNfb25jZV9pbml0XzsKLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFJlcGVhdGVkU3RyaW5nVHlwZVRyYWl0cyB7Ci0gcHVibGljOgotICB0eXBlZGVmIGNvbnN0IHN0cmluZyYgQ29uc3RUeXBlOwotICB0eXBlZGVmIHN0cmluZyogTXV0YWJsZVR5cGU7Ci0gIHR5cGVkZWYgUmVwZWF0ZWRTdHJpbmdUeXBlVHJhaXRzIFJlcGVhdGVkOwotCi0gIHR5cGVkZWYgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IFJlcGVhdGVkRmllbGRUeXBlOwotCi0gIHN0YXRpYyBpbmxpbmUgY29uc3Qgc3RyaW5nJiBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIHNldC5HZXRSZXBlYXRlZFN0cmluZyhudW1iZXIsIGluZGV4KTsKLSAgfQotICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgewotICAgIHNldC0+U2V0UmVwZWF0ZWRTdHJpbmcobnVtYmVyLCBpbmRleCwgdmFsdWUpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgc3RyaW5nKiBNdXRhYmxlKGludCBudW1iZXIsIGludCBpbmRleCwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKLSAgICByZXR1cm4gc2V0LT5NdXRhYmxlUmVwZWF0ZWRTdHJpbmcobnVtYmVyLCBpbmRleCk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSB2b2lkIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBib29sIC8qaXNfcGFja2VkKi8sIGNvbnN0IHN0cmluZyYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKLSAgICBzZXQtPkFkZFN0cmluZyhudW1iZXIsIGZpZWxkX3R5cGUsIHZhbHVlLCBOVUxMKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIHN0cmluZyogQWRkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7Ci0gICAgcmV0dXJuIHNldC0+QWRkU3RyaW5nKG51bWJlciwgZmllbGRfdHlwZSwgTlVMTCk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4mCi0gICAgICBHZXRSZXBlYXRlZChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCkgewotICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qPigKLSAgICAgICAgc2V0LkdldFJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpKSk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPioKLSAgICAgIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qPigKLSAgICAgICAgc2V0LT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGFja2VkLCBOVUxMKSk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnJlcGVhdGVkX3N0cmluZ190eXBlX3RyYWl0c19vbmNlX2luaXRfLAotICAgICAgICAgICAgICAgICAgICZJbml0aWFsaXplRGVmYXVsdFJlcGVhdGVkRmllbGRzKTsKLSAgICByZXR1cm4gZGVmYXVsdF9yZXBlYXRlZF9maWVsZF87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyB2b2lkIEluaXRpYWxpemVEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKTsKLSAgc3RhdGljIHZvaWQgRGVzdHJveURlZmF1bHRSZXBlYXRlZEZpZWxkcygpOwotICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUgKmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfOwotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRW51bVR5cGVUcmFpdHMKLQotLy8gRXh0ZW5zaW9uU2V0IHJlcHJlc2VudHMgZW51bXMgdXNpbmcgaW50ZWdlcnMgaW50ZXJuYWxseSwgc28gd2UgaGF2ZSB0bwotLy8gc3RhdGljX2Nhc3QgYXJvdW5kLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIGJvb2wgSXNWYWxpZChpbnQpPgotY2xhc3MgRW51bVR5cGVUcmFpdHMgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBUeXBlIENvbnN0VHlwZTsKLSAgdHlwZWRlZiBUeXBlIE11dGFibGVUeXBlOwotICB0eXBlZGVmIEVudW1UeXBlVHJhaXRzPFR5cGUsIElzVmFsaWQ+IFNpbmd1bGFyOwotCi0gIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHNldC5HZXRFbnVtKG51bWJlciwgZGVmYXVsdF92YWx1ZSkpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgewotICAgIEdPT0dMRV9EQ0hFQ0soSXNWYWxpZCh2YWx1ZSkpOwotICAgIHNldC0+U2V0RW51bShudW1iZXIsIGZpZWxkX3R5cGUsIHZhbHVlLCBOVUxMKTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGUsIGJvb2wgSXNWYWxpZChpbnQpPgotY2xhc3MgUmVwZWF0ZWRFbnVtVHlwZVRyYWl0cyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOwotICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7Ci0gIHR5cGVkZWYgUmVwZWF0ZWRFbnVtVHlwZVRyYWl0czxUeXBlLCBJc1ZhbGlkPiBSZXBlYXRlZDsKLQotICB0eXBlZGVmIFJlcGVhdGVkRmllbGQ8VHlwZT4gUmVwZWF0ZWRGaWVsZFR5cGU7Ci0KLSAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4oc2V0LkdldFJlcGVhdGVkRW51bShudW1iZXIsIGluZGV4KSk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSB2b2lkIFNldChpbnQgbnVtYmVyLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCkgewotICAgIEdPT0dMRV9EQ0hFQ0soSXNWYWxpZCh2YWx1ZSkpOwotICAgIHNldC0+U2V0UmVwZWF0ZWRFbnVtKG51bWJlciwgaW5kZXgsIHZhbHVlKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIHZvaWQgQWRkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLCBDb25zdFR5cGUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7Ci0gICAgR09PR0xFX0RDSEVDSyhJc1ZhbGlkKHZhbHVlKSk7Ci0gICAgc2V0LT5BZGRFbnVtKG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLCB2YWx1ZSwgTlVMTCk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSBjb25zdCBSZXBlYXRlZEZpZWxkPFR5cGU+JiBHZXRSZXBlYXRlZChpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuc2lvblNldCYKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQpIHsKLSAgICAvLyBIYWNrOiB0aGUgYEV4dGVuc2lvbmAgc3RydWN0IHN0b3JlcyBhIFJlcGVhdGVkRmllbGQ8aW50PiBmb3IgZW51bXMuCi0gICAgLy8gUmVwZWF0ZWRGaWVsZDxpbnQ+IGNhbm5vdCBpbXBsaWNpdGx5IGNvbnZlcnQgdG8gUmVwZWF0ZWRGaWVsZDxFbnVtVHlwZT4KLSAgICAvLyBzbyB3ZSBuZWVkIHRvIGRvIHNvbWUgY2FzdGluZyBtYWdpYy4gU2VlIG1lc3NhZ2UuaCBmb3Igc2ltaWxhcgotICAgIC8vIGNvbnRvcnRpb25zIGZvciBub24tZXh0ZW5zaW9uIGZpZWxkcy4KLSAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRGaWVsZDxUeXBlPio+KAotICAgICAgICBzZXQuR2V0UmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkpKTsKLSAgfQotCi0gIHN0YXRpYyBpbmxpbmUgUmVwZWF0ZWRGaWVsZDxUeXBlPiogTXV0YWJsZVJlcGVhdGVkKGludCBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZSBmaWVsZF90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZEZpZWxkPFR5cGU+Kj4oCi0gICAgICAgIHNldC0+TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBmaWVsZF90eXBlLCBpc19wYWNrZWQsIE5VTEwpKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSogR2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKSB7Ci0gICAgLy8gSGFjazogYXMgbm90ZWQgYWJvdmUsIHJlcGVhdGVkIGVudW0gZmllbGRzIGFyZSBpbnRlcm5hbGx5IHN0b3JlZCBhcyBhCi0gICAgLy8gUmVwZWF0ZWRGaWVsZDxpbnQ+LiBXZSBuZWVkIHRvIGJlIGFibGUgdG8gaW5zdGFudGlhdGUgZ2xvYmFsIHN0YXRpYwotICAgIC8vIG9iamVjdHMgdG8gcmV0dXJuIGFzIGRlZmF1bHQgKGVtcHR5KSByZXBlYXRlZCBmaWVsZHMgb24gbm9uLWV4aXN0ZW50Ci0gICAgLy8gZXh0ZW5zaW9ucy4gV2Ugd291bGQgbm90IGJlIGFibGUgdG8ga25vdyBhLXByaW9yaSBhbGwgb2YgdGhlIGVudW0gdHlwZXMKLSAgICAvLyAodmFsdWVzIG9mIHxUeXBlfCkgdG8gaW5zdGFudGlhdGUgYWxsIG9mIHRoZXNlLCBzbyB3ZSBqdXN0IHJlLXVzZSBpbnQzMidzCi0gICAgLy8gZGVmYXVsdCByZXBlYXRlZCBmaWVsZCBvYmplY3QuCi0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRGaWVsZDxUeXBlPio+KAotICAgICAgICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8aW50MzI+OjpHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpKTsKLSAgfQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTWVzc2FnZVR5cGVUcmFpdHMKLQotLy8gRXh0ZW5zaW9uU2V0IGd1YXJhbnRlZXMgdGhhdCB3aGVuIG1hbmlwdWxhdGluZyBleHRlbnNpb25zIHdpdGggbWVzc2FnZQotLy8gdHlwZXMsIHRoZSBpbXBsZW1lbnRhdGlvbiB1c2VkIHdpbGwgYmUgdGhlIGNvbXBpbGVkLWluIGNsYXNzIHJlcHJlc2VudGluZwotLy8gdGhhdCB0eXBlLiAgU28sIHdlIGNhbiBzdGF0aWNfY2FzdCBkb3duIHRvIHRoZSBleGFjdCB0eXBlIHdlIGV4cGVjdC4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotY2xhc3MgTWVzc2FnZVR5cGVUcmFpdHMgewotIHB1YmxpYzoKLSAgdHlwZWRlZiBjb25zdCBUeXBlJiBDb25zdFR5cGU7Ci0gIHR5cGVkZWYgVHlwZSogTXV0YWJsZVR5cGU7Ci0gIHR5cGVkZWYgTWVzc2FnZVR5cGVUcmFpdHM8VHlwZT4gU2luZ3VsYXI7Ci0KLSAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSY+KAotICAgICAgICBzZXQuR2V0TWVzc2FnZShudW1iZXIsIGRlZmF1bHRfdmFsdWUpKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIE11dGFibGUoaW50IG51bWJlciwgRmllbGRUeXBlIGZpZWxkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25TZXQqIHNldCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlKj4oCi0gICAgICBzZXQtPk11dGFibGVNZXNzYWdlKG51bWJlciwgZmllbGRfdHlwZSwgVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLCBOVUxMKSk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNdXRhYmxlVHlwZSBtZXNzYWdlLCBFeHRlbnNpb25TZXQqIHNldCkgewotICAgIHNldC0+U2V0QWxsb2NhdGVkTWVzc2FnZShudW1iZXIsIGZpZWxkX3R5cGUsIE5VTEwsIG1lc3NhZ2UpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgTXV0YWJsZVR5cGUgUmVsZWFzZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgLyogZmllbGRfdHlwZSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGUqPihzZXQtPlJlbGVhc2VNZXNzYWdlKAotICAgICAgICBudW1iZXIsIFR5cGU6OmRlZmF1bHRfaW5zdGFuY2UoKSkpOwotICB9Ci19OwotCi0vLyBmb3J3YXJkIGRlY2xhcmF0aW9uCi1jbGFzcyBSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0czsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1jbGFzcyBSZXBlYXRlZE1lc3NhZ2VUeXBlVHJhaXRzIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgY29uc3QgVHlwZSYgQ29uc3RUeXBlOwotICB0eXBlZGVmIFR5cGUqIE11dGFibGVUeXBlOwotICB0eXBlZGVmIFJlcGVhdGVkTWVzc2FnZVR5cGVUcmFpdHM8VHlwZT4gUmVwZWF0ZWQ7Ci0KLSAgdHlwZWRlZiBSZXBlYXRlZFB0ckZpZWxkPFR5cGU+IFJlcGVhdGVkRmllbGRUeXBlOwotCi0gIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PGNvbnN0IFR5cGUmPihzZXQuR2V0UmVwZWF0ZWRNZXNzYWdlKG51bWJlciwgaW5kZXgpKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIE11dGFibGUoaW50IG51bWJlciwgaW50IGluZGV4LCBFeHRlbnNpb25TZXQqIHNldCkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxUeXBlKj4oc2V0LT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKG51bWJlciwgaW5kZXgpKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIE11dGFibGVUeXBlIEFkZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KAotICAgICAgICBzZXQtPkFkZE1lc3NhZ2UobnVtYmVyLCBmaWVsZF90eXBlLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCksIE5VTEwpKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4mIEdldFJlcGVhdGVkKGludCBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uU2V0JgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCkgewotICAgIC8vIFNlZSBub3RlcyBhYm92ZSBpbiBSZXBlYXRlZEVudW1UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZCgpOiBzYW1lCi0gICAgLy8gY2FzdGluZyBoYWNrIGFwcGxpZXMgaGVyZSwgYmVjYXVzZSBhIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+Ci0gICAgLy8gY2Fubm90IG5hdHVyYWxseSBiZWNvbWUgYSBSZXBlYXRlZFB0clR5cGU8VHlwZT4gZXZlbiB0aG91Z2ggVHlwZSBpcwotICAgIC8vIHByZXN1bWFibHkgYSBtZXNzYWdlLiBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIGdvZXMgdGhyb3VnaCBzaW1pbGFyIGNvbnRvcnRpb25zCi0gICAgLy8gd2l0aCBhIHJlaW50ZXJwcmV0X2Nhc3Q8Pi4KLSAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxUeXBlPio+KAotICAgICAgICBzZXQuR2V0UmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkpKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGUgZmllbGRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7Ci0gICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxUeXBlPio+KAotICAgICAgICBzZXQtPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLCBOVUxMKSk7Ci0gIH0KLQotICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCk7Ci19OwotCi1MSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFByb3RvYnVmT25jZVR5cGUgcmVwZWF0ZWRfbWVzc2FnZV9nZW5lcmljX3R5cGVfdHJhaXRzX29uY2VfaW5pdF87Ci0KLS8vIFRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgdG8gaG9sZCBhIGdlbmVyaWMgZGVmYXVsdCBlbXB0eSByZXBlYXRlZCBmaWVsZCBmb3IgYWxsCi0vLyBtZXNzYWdlLXR5cGUgcmVwZWF0ZWQgZmllbGQgZXh0ZW5zaW9ucy4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0cyB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUqPiBSZXBlYXRlZEZpZWxkVHlwZTsKLSBwcml2YXRlOgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBmcmllbmQgY2xhc3MgUmVwZWF0ZWRNZXNzYWdlVHlwZVRyYWl0czsKLSAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpOwotICBzdGF0aWMgdm9pZCBEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCk7Ci0gIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF87Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBpbmxpbmUKLSAgICBjb25zdCB0eXBlbmFtZSBSZXBlYXRlZE1lc3NhZ2VUeXBlVHJhaXRzPFR5cGU+OjpSZXBlYXRlZEZpZWxkVHlwZSoKLSAgICBSZXBlYXRlZE1lc3NhZ2VUeXBlVHJhaXRzPFR5cGU+OjpHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgKLSAgICAgICZyZXBlYXRlZF9tZXNzYWdlX2dlbmVyaWNfdHlwZV90cmFpdHNfb25jZV9pbml0XywKLSAgICAgICZSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcyk7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGRUeXBlKj4oCi0gICAgICBSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0czo6ZGVmYXVsdF9yZXBlYXRlZF9maWVsZF8pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFeHRlbnNpb25JZGVudGlmaWVyCi0KLS8vIFRoaXMgaXMgdGhlIHR5cGUgb2YgYWN0dWFsIGV4dGVuc2lvbiBvYmplY3RzLiAgRS5nLiBpZiB5b3UgaGF2ZToKLS8vICAgZXh0ZW5kcyBGb28gd2l0aCBvcHRpb25hbCBpbnQzMiBiYXIgPSAxMjM0OwotLy8gdGhlbiAiYmFyIiB3aWxsIGJlIGRlZmluZWQgaW4gQysrIGFzOgotLy8gICBFeHRlbnNpb25JZGVudGlmaWVyPEZvbywgUHJpbWl0aXZlVHlwZVRyYWl0czxpbnQzMj4sIDEsIGZhbHNlPiBiYXIoMTIzNCk7Ci0vLwotLy8gTm90ZSB0aGF0IHdlIGNvdWxkLCBpbiB0aGVvcnksIHN1cHBseSB0aGUgZmllbGQgbnVtYmVyIGFzIGEgdGVtcGxhdGUKLS8vIHBhcmFtZXRlciwgYW5kIHRodXMgbWFrZSBhbiBpbnN0YW5jZSBvZiBFeHRlbnNpb25JZGVudGlmaWVyIGhhdmUgbm8KLS8vIGFjdHVhbCBjb250ZW50cy4gIEhvd2V2ZXIsIGlmIHdlIGRpZCB0aGF0LCB0aGVuIHVzaW5nIGF0IGV4dGVuc2lvbgotLy8gaWRlbnRpZmllciB3b3VsZCBub3QgbmVjZXNzYXJpbHkgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIG91dHB1dCBhbnkgc29ydAotLy8gb2YgcmVmZXJlbmNlIHRvIGFueSBzaW1wbGUgZGVmaW5lZCBpbiB0aGUgZXh0ZW5zaW9uJ3MgLnBiLm8gZmlsZS4gIFNvbWUKLS8vIGxpbmtlcnMgd2lsbCBhY3R1YWxseSBkcm9wIG9iamVjdCBmaWxlcyB0aGF0IGFyZSBub3QgZXhwbGljaXRseSByZWZlcmVuY2VkLAotLy8gYnV0IHRoYXQgd291bGQgYmUgYmFkIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgdGhpcyBleHRlbnNpb24gdG8gbm90IGJlCi0vLyByZWdpc3RlcmVkIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbiwgYW5kIHRoZXJlZm9yZSB1c2luZyBpdCB3b3VsZCBjcmFzaC4KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEV4dGVuZGVlVHlwZSwgdHlwZW5hbWUgVHlwZVRyYWl0c1R5cGUsCi0gICAgICAgICAgRmllbGRUeXBlIGZpZWxkX3R5cGUsIGJvb2wgaXNfcGFja2VkPgotY2xhc3MgRXh0ZW5zaW9uSWRlbnRpZmllciB7Ci0gcHVibGljOgotICB0eXBlZGVmIFR5cGVUcmFpdHNUeXBlIFR5cGVUcmFpdHM7Ci0gIHR5cGVkZWYgRXh0ZW5kZWVUeXBlIEV4dGVuZGVlOwotCi0gIEV4dGVuc2lvbklkZW50aWZpZXIoaW50IG51bWJlciwgdHlwZW5hbWUgVHlwZVRyYWl0czo6Q29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpCi0gICAgICA6IG51bWJlcl8obnVtYmVyKSwgZGVmYXVsdF92YWx1ZV8oZGVmYXVsdF92YWx1ZSkge30KLSAgaW5saW5lIGludCBudW1iZXIoKSBjb25zdCB7IHJldHVybiBudW1iZXJfOyB9Ci0gIHR5cGVuYW1lIFR5cGVUcmFpdHM6OkNvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKCkgY29uc3QgewotICAgIHJldHVybiBkZWZhdWx0X3ZhbHVlXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgaW50IG51bWJlcl87Ci0gIHR5cGVuYW1lIFR5cGVUcmFpdHM6OkNvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlXzsKLX07Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEdlbmVyYXRlZCBhY2Nlc3NvcnMKLQotLy8gVGhpcyBtYWNybyBzaG91bGQgYmUgZXhwYW5kZWQgaW4gdGhlIGNvbnRleHQgb2YgYSBnZW5lcmF0ZWQgdHlwZSB3aGljaAotLy8gaGFzIGV4dGVuc2lvbnMuCi0vLwotLy8gV2UgdXNlICJfcHJvdG9fVHlwZVRyYWl0cyIgYXMgYSB0eXBlIG5hbWUgYmVsb3cgYmVjYXVzZSAiVHlwZVRyYWl0cyIKLS8vIGNhdXNlcyBwcm9ibGVtcyBpZiB0aGUgY2xhc3MgaGFzIGEgbmVzdGVkIG1lc3NhZ2Ugb3IgZW51bSB0eXBlIHdpdGggdGhhdAotLy8gbmFtZSBhbmQgIl9UeXBlVHJhaXRzIiBpcyB0ZWNobmljYWxseSByZXNlcnZlZCBmb3IgdGhlIEMrKyBsaWJyYXJ5IHNpbmNlCi0vLyBpdCBzdGFydHMgd2l0aCBhbiB1bmRlcnNjb3JlIGZvbGxvd2VkIGJ5IGEgY2FwaXRhbCBsZXR0ZXIuCi0vLwotLy8gRm9yIHNpbWlsYXIgcmVhc29uLCB3ZSB1c2UgIl9maWVsZF90eXBlIiBhbmQgIl9pc19wYWNrZWQiIGFzIHBhcmFtZXRlciBuYW1lcwotLy8gYmVsb3csIHNvIHRoYXQgImZpZWxkX3R5cGUiIGFuZCAiaXNfcGFja2VkIiBjYW4gYmUgdXNlZCBhcyBmaWVsZCBuYW1lcy4KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoQ0xBU1NOQU1FKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogSGFzLCBTaXplLCBDbGVhciAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSBib29sIEhhc0V4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgXAotICAgIHJldHVybiBfZXh0ZW5zaW9uc18uSGFzKGlkLm51bWJlcigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIHZvaWQgQ2xlYXJFeHRlbnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsgICAgICAgICBcCi0gICAgX2V4dGVuc2lvbnNfLkNsZWFyRXh0ZW5zaW9uKGlkLm51bWJlcigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgaW50IEV4dGVuc2lvblNpemUoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgY29uc3QgeyAgIFwKLSAgICByZXR1cm4gX2V4dGVuc2lvbnNfLkV4dGVuc2lvblNpemUoaWQubnVtYmVyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgLyogU2luZ3VsYXIgYWNjZXNzb3JzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6OkNvbnN0VHlwZSBHZXRFeHRlbnNpb24oICAgICAgICBcCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgXAotICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0KGlkLm51bWJlcigpLCBfZXh0ZW5zaW9uc18sICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlkLmRlZmF1bHRfdmFsdWUoKSk7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgTXV0YWJsZUV4dGVuc2lvbiggIFwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsgICAgICAgICBcCi0gICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZXh0ZW5zaW9uc18pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgdm9pZCBTZXRFeHRlbnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwgICAgICAgICAgIFwKLSAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIHZhbHVlKSB7ICAgICAgICAgICAgICAgIFwKLSAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0KGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgdmFsdWUsICZfZXh0ZW5zaW9uc18pOyAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSB2b2lkIFNldEFsbG9jYXRlZEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAotICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlNpbmd1bGFyOjpNdXRhYmxlVHlwZSB2YWx1ZSkgeyAgICAgICAgICAgICAgXAotICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXRBbGxvY2F0ZWQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsICZfZXh0ZW5zaW9uc18pOyAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgUmVsZWFzZUV4dGVuc2lvbiggIFwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsgICAgICAgICBcCi0gICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpSZWxlYXNlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZXh0ZW5zaW9uc18pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIC8qIFJlcGVhdGVkIGFjY2Vzc29ycyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKCAgICAgICAgXAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwgICAgICAgICAgIFwKLSAgICAgIGludCBpbmRleCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkdldChpZC5udW1iZXIoKSwgX2V4dGVuc2lvbnNfLCBpbmRleCk7ICAgICAgICAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oICBcCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAotICAgICAgaW50IGluZGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZShpZC5udW1iZXIoKSwgaW5kZXgsICZfZXh0ZW5zaW9uc18pOyAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsICAgICAgICAgICBcCi0gICAgICBpbnQgaW5kZXgsIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6Q29uc3RUeXBlIHZhbHVlKSB7ICAgICBcCi0gICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLCAmX2V4dGVuc2lvbnNfKTsgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpNdXRhYmxlVHlwZSBBZGRFeHRlbnNpb24oICAgICAgXAotICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCkgeyAgICAgICAgIFwKLSAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6OkFkZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsICZfZXh0ZW5zaW9uc18pOyAgIFwKLSAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAotICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsgICAgICAgICAgICAgICAgXAotICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCBfaXNfcGFja2VkLCAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsICZfZXh0ZW5zaW9uc18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6UmVwZWF0ZWRGaWVsZFR5cGUmICAgICAgIFwKLSAgICAgIEdldFJlcGVhdGVkRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZChpZC5udW1iZXIoKSwgX2V4dGVuc2lvbnNfKTsgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSogICAgICAgICAgICAgXAotICAgICAgTXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgX2lzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaXNfcGFja2VkLCAmX2V4dGVuc2lvbnNfKTsgICAgIFwKLSAgfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fU0VUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MmUzZTA5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYworKysgL2Rldi9udWxsCkBAIC0xLDc1NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gQ29udGFpbnMgbWV0aG9kcyBkZWZpbmVkIGluIGV4dGVuc2lvbl9zZXQuaCB3aGljaCBjYW5ub3QgYmUgcGFydCBvZiB0aGUKLS8vIGxpdGUgbGlicmFyeSBiZWNhdXNlIHRoZXkgdXNlIGRlc2NyaXB0b3JzIG9yIHJlZmxlY3Rpb24uCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci0KLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBBIEZpZWxkU2tpcHBlciB1c2VkIHRvIHN0b3JlIHVua25vd24gTWVzc2FnZVNldCBmaWVsZHMgaW50byBVbmtub3duRmllbGRTZXQuCi1jbGFzcyBNZXNzYWdlU2V0RmllbGRTa2lwcGVyCi0gICAgOiBwdWJsaWMgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1lc3NhZ2VTZXRGaWVsZFNraXBwZXIoVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykKLSAgICAgIDogVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyKHVua25vd25fZmllbGRzKSB7fQotICB2aXJ0dWFsIH5NZXNzYWdlU2V0RmllbGRTa2lwcGVyKCkge30KLQotICB2aXJ0dWFsIGJvb2wgU2tpcE1lc3NhZ2VTZXRGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9udW1iZXIpOwotfTsKLWJvb2wgTWVzc2FnZVNldEZpZWxkU2tpcHBlcjo6U2tpcE1lc3NhZ2VTZXRGaWVsZCgKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIGludCBmaWVsZF9udW1iZXIpIHsKLSAgdWludDMyIGxlbmd0aDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIGlmICh1bmtub3duX2ZpZWxkc18gPT0gTlVMTCkgewotICAgIHJldHVybiBpbnB1dC0+U2tpcChsZW5ndGgpOwotICB9IGVsc2UgewotICAgIHJldHVybiBpbnB1dC0+UmVhZFN0cmluZygKLSAgICAgICAgdW5rbm93bl9maWVsZHNfLT5BZGRMZW5ndGhEZWxpbWl0ZWQoZmllbGRfbnVtYmVyKSwgbGVuZ3RoKTsKLSAgfQotfQotCi0KLS8vIEltcGxlbWVudGF0aW9uIG9mIEV4dGVuc2lvbkZpbmRlciB3aGljaCBmaW5kcyBleHRlbnNpb25zIGluIGEgZ2l2ZW4KLS8vIERlc2NyaXB0b3JQb29sLCB1c2luZyB0aGUgZ2l2ZW4gTWVzc2FnZUZhY3RvcnkgdG8gY29uc3RydWN0IHN1Yi1vYmplY3RzLgotLy8gVGhpcyBjbGFzcyBpcyBpbXBsZW1lbnRlZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgotY2xhc3MgRGVzY3JpcHRvclBvb2xFeHRlbnNpb25GaW5kZXIgOiBwdWJsaWMgRXh0ZW5zaW9uRmluZGVyIHsKLSBwdWJsaWM6Ci0gIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKQotICAgICAgOiBwb29sXyhwb29sKSwgZmFjdG9yeV8oZmFjdG9yeSksIGNvbnRhaW5pbmdfdHlwZV8oY29udGFpbmluZ190eXBlKSB7fQotICB2aXJ0dWFsIH5EZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlcigpIHt9Ci0KLSAgdmlydHVhbCBib29sIEZpbmQoaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyogb3V0cHV0KTsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sXzsKLSAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnlfOwotICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGVfOwotfTsKLQotdm9pZCBFeHRlbnNpb25TZXQ6OkFwcGVuZFRvTGlzdCgKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUsCi0gICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QgewotICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5iZWdpbigpOwotICAgICAgIGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgewotICAgIGJvb2wgaGFzID0gZmFsc2U7Ci0gICAgaWYgKGl0ZXItPnNlY29uZC5pc19yZXBlYXRlZCkgewotICAgICAgaGFzID0gaXRlci0+c2Vjb25kLkdldFNpemUoKSA+IDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGhhcyA9ICFpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZDsKLSAgICB9Ci0KLSAgICBpZiAoaGFzKSB7Ci0gICAgICAvLyBUT0RPKGtlbnRvbik6IExvb2tpbmcgdXAgZWFjaCBmaWVsZCBieSBudW1iZXIgaXMgc29tZXdoYXQgdW5mb3J0dW5hdGUuCi0gICAgICAvLyAgIElzIHRoZXJlIGEgYmV0dGVyIHdheT8gIFRoZSBwcm9ibGVtIGlzIHRoYXQgZGVzY3JpcHRvcnMgYXJlIGxhemlseS0KLSAgICAgIC8vICAgaW5pdGlhbGl6ZWQsIHNvIHRoZXkgbWlnaHQgbm90IGV2ZW4gYmUgY29uc3RydWN0ZWQgdW50aWwKLSAgICAgIC8vICAgQXBwZW5kVG9MaXN0KCkgaXMgY2FsbGVkLgotCi0gICAgICBpZiAoaXRlci0+c2Vjb25kLmRlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhwb29sLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCi0gICAgICAgICAgICBjb250YWluaW5nX3R5cGUsIGl0ZXItPmZpcnN0KSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhpdGVyLT5zZWNvbmQuZGVzY3JpcHRvcik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLWlubGluZSBGaWVsZERlc2NyaXB0b3I6OlR5cGUgcmVhbF90eXBlKEZpZWxkVHlwZSB0eXBlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0sodHlwZSA+IDAgJiYgdHlwZSA8PSBGaWVsZERlc2NyaXB0b3I6Ok1BWF9UWVBFKTsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4odHlwZSk7Ci19Ci0KLWlubGluZSBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgY3BwX3R5cGUoRmllbGRUeXBlIHR5cGUpIHsKLSAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvcjo6VHlwZVRvQ3BwVHlwZSgKLSAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4odHlwZSkpOwotfQotCi1pbmxpbmUgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBmaWVsZF90eXBlKEZpZWxkVHlwZSB0eXBlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0sodHlwZSA+IDAgJiYgdHlwZSA8PSBXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEUpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4odHlwZSk7Ci19Ci0KLSNkZWZpbmUgR09PR0xFX0RDSEVDS19UWVBFKEVYVEVOU0lPTiwgTEFCRUwsIENQUFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgR09PR0xFX0RDSEVDS19FUSgoRVhURU5TSU9OKS5pc19yZXBlYXRlZCA/IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwsICAgICAgXAotICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpMQUJFTF8jI0xBQkVMKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoKEVYVEVOU0lPTikudHlwZSksIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEUpCi0KLWNvbnN0IE1lc3NhZ2VMaXRlJiBFeHRlbnNpb25TZXQ6OkdldE1lc3NhZ2UoaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgewotICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwotICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSB8fCBpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZCkgewotICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIHJldHVybiAqZmFjdG9yeS0+R2V0UHJvdG90eXBlKG1lc3NhZ2VfdHlwZSk7Ci0gIH0gZWxzZSB7Ci0gICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIE1FU1NBR0UpOwotICAgIGlmIChpdGVyLT5zZWNvbmQuaXNfbGF6eSkgewotICAgICAgcmV0dXJuIGl0ZXItPnNlY29uZC5sYXp5bWVzc2FnZV92YWx1ZS0+R2V0TWVzc2FnZSgKLSAgICAgICAgICAqZmFjdG9yeS0+R2V0UHJvdG90eXBlKG1lc3NhZ2VfdHlwZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gKml0ZXItPnNlY29uZC5tZXNzYWdlX3ZhbHVlOwotICAgIH0KLSAgfQotfQotCi1NZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpNdXRhYmxlTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgewotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKGRlc2NyaXB0b3ItPm51bWJlcigpLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgewotICAgIGV4dGVuc2lvbi0+dHlwZSA9IGRlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKTsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7Ci0gICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBmYWxzZTsKLSAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlID0KLSAgICAgICAgZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKLSAgICBleHRlbnNpb24tPmlzX2xhenkgPSBmYWxzZTsKLSAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBwcm90b3R5cGUtPk5ldyhhcmVuYV8pOwotICAgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOwotICAgIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7Ci0gIH0gZWxzZSB7Ci0gICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBNRVNTQUdFKTsKLSAgICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKLSAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TXV0YWJsZU1lc3NhZ2UoCi0gICAgICAgICAgKmZhY3RvcnktPkdldFByb3RvdHlwZShkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlOwotICAgIH0KLSAgfQotfQotCi1NZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgewotICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChkZXNjcmlwdG9yLT5udW1iZXIoKSk7Ci0gIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSB7Ci0gICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gTlVMTC4KLSAgICByZXR1cm4gTlVMTDsKLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBPUFRJT05BTCwgTUVTU0FHRSk7Ci0gICAgTWVzc2FnZUxpdGUqIHJldCA9IE5VTEw7Ci0gICAgaWYgKGl0ZXItPnNlY29uZC5pc19sYXp5KSB7Ci0gICAgICByZXQgPSBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWUtPlJlbGVhc2VNZXNzYWdlKAotICAgICAgICAgICpmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpKTsKLSAgICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgewotICAgICAgICBkZWxldGUgaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBpZiAoYXJlbmFfICE9IE5VTEwpIHsKLSAgICAgICAgcmV0ID0gKGl0ZXItPnNlY29uZC5tZXNzYWdlX3ZhbHVlKS0+TmV3KCk7Ci0gICAgICAgIHJldC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCooaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWUpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldCA9IGl0ZXItPnNlY29uZC5tZXNzYWdlX3ZhbHVlOwotICAgICAgfQotICAgIH0KLSAgICBleHRlbnNpb25zXy5lcmFzZShkZXNjcmlwdG9yLT5udW1iZXIoKSk7Ci0gICAgcmV0dXJuIHJldDsKLSAgfQotfQotCi1FeHRlbnNpb25TZXQ6OkV4dGVuc2lvbiogRXh0ZW5zaW9uU2V0OjpNYXliZU5ld1JlcGVhdGVkRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKLSAgaWYgKE1heWJlTmV3RXh0ZW5zaW9uKGRlc2NyaXB0b3ItPm51bWJlcigpLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgewotICAgIGV4dGVuc2lvbi0+dHlwZSA9IGRlc2NyaXB0b3ItPnR5cGUoKTsKLSAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKTsKLSAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKLSAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+ID4oYXJlbmFfKTsKLSAgfSBlbHNlIHsKLSAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIE1FU1NBR0UpOwotICB9Ci0gIHJldHVybiBleHRlbnNpb247Ci19Ci0KLU1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OkFkZE1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgewotICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IE1heWJlTmV3UmVwZWF0ZWRFeHRlbnNpb24oZGVzY3JpcHRvcik7Ci0KLSAgLy8gUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiBkb2VzIG5vdCBrbm93IGhvdyB0byBBZGQoKSBzaW5jZSBpdCBjYW5ub3QKLSAgLy8gYWxsb2NhdGUgYW4gYWJzdHJhY3Qgb2JqZWN0LCBzbyB3ZSBoYXZlIHRvIGJlIHRyaWNreS4KLSAgTWVzc2FnZUxpdGUqIHJlc3VsdCA9IGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZQotICAgICAgLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+ID4oKTsKLSAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgY29uc3QgTWVzc2FnZUxpdGUqIHByb3RvdHlwZTsKLSAgICBpZiAoZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5zaXplKCkgPT0gMCkgewotICAgICAgcHJvdG90eXBlID0gZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKLSAgICAgIEdPT0dMRV9DSEVDSyhwcm90b3R5cGUgIT0gTlVMTCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByb3RvdHlwZSA9ICZleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkdldCgwKTsKLSAgICB9Ci0gICAgcmVzdWx0ID0gcHJvdG90eXBlLT5OZXcoYXJlbmFfKTsKLSAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZChyZXN1bHQpOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgRXh0ZW5zaW9uU2V0OjpBZGRBbGxvY2F0ZWRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBuZXdfZW50cnkpIHsKLSAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBNYXliZU5ld1JlcGVhdGVkRXh0ZW5zaW9uKGRlc2NyaXB0b3IpOwotCi0gIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+QWRkQWxsb2NhdGVkKG5ld19lbnRyeSk7Ci19Ci0KLXN0YXRpYyBib29sIFZhbGlkYXRlRW51bVVzaW5nRGVzY3JpcHRvcihjb25zdCB2b2lkKiBhcmcsIGludCBudW1iZXIpIHsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRW51bURlc2NyaXB0b3IqPihhcmcpCi0gICAgICAtPkZpbmRWYWx1ZUJ5TnVtYmVyKG51bWJlcikgIT0gTlVMTDsKLX0KLQotYm9vbCBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlcjo6RmluZChpbnQgbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBvdXRwdXQpIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPQotICAgICAgcG9vbF8tPkZpbmRFeHRlbnNpb25CeU51bWJlcihjb250YWluaW5nX3R5cGVfLCBudW1iZXIpOwotICBpZiAoZXh0ZW5zaW9uID09IE5VTEwpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgb3V0cHV0LT50eXBlID0gZXh0ZW5zaW9uLT50eXBlKCk7Ci0gICAgb3V0cHV0LT5pc19yZXBlYXRlZCA9IGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQoKTsKLSAgICBvdXRwdXQtPmlzX3BhY2tlZCA9IGV4dGVuc2lvbi0+b3B0aW9ucygpLnBhY2tlZCgpOwotICAgIG91dHB1dC0+ZGVzY3JpcHRvciA9IGV4dGVuc2lvbjsKLSAgICBpZiAoZXh0ZW5zaW9uLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBvdXRwdXQtPm1lc3NhZ2VfcHJvdG90eXBlID0KLSAgICAgICAgICBmYWN0b3J5Xy0+R2V0UHJvdG90eXBlKGV4dGVuc2lvbi0+bWVzc2FnZV90eXBlKCkpOwotICAgICAgR09PR0xFX0NIRUNLKG91dHB1dC0+bWVzc2FnZV9wcm90b3R5cGUgIT0gTlVMTCkKLSAgICAgICAgICA8PCAiRXh0ZW5zaW9uIGZhY3RvcnkncyBHZXRQcm90b3R5cGUoKSByZXR1cm5lZCBOVUxMIGZvciBleHRlbnNpb246ICIKLSAgICAgICAgICA8PCBleHRlbnNpb24tPmZ1bGxfbmFtZSgpOwotICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNKSB7Ci0gICAgICBvdXRwdXQtPmVudW1fdmFsaWRpdHlfY2hlY2suZnVuYyA9IFZhbGlkYXRlRW51bVVzaW5nRGVzY3JpcHRvcjsKLSAgICAgIG91dHB1dC0+ZW51bV92YWxpZGl0eV9jaGVjay5hcmcgPSBleHRlbnNpb24tPmVudW1fdHlwZSgpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKLSAgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOwotICBpZiAoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSA9PSBOVUxMKSB7Ci0gICAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOwotICAgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKLSAgfSBlbHNlIHsKLSAgICBEZXNjcmlwdG9yUG9vbEV4dGVuc2lvbkZpbmRlciBmaW5kZXIoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQtPkdldEV4dGVuc2lvbkZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlLT5HZXREZXNjcmlwdG9yKCkpOwotICAgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKLSAgfQotfQotCi1ib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7Ci0gIE1lc3NhZ2VTZXRGaWVsZFNraXBwZXIgc2tpcHBlcih1bmtub3duX2ZpZWxkcyk7Ci0gIGlmIChpbnB1dC0+R2V0RXh0ZW5zaW9uUG9vbCgpID09IE5VTEwpIHsKLSAgICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7Ci0gICAgcmV0dXJuIFBhcnNlTWVzc2FnZVNldChpbnB1dCwgJmZpbmRlciwgJnNraXBwZXIpOwotICB9IGVsc2UgewotICAgIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihpbnB1dC0+R2V0RXh0ZW5zaW9uUG9vbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPkdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmV0dXJuIFBhcnNlTWVzc2FnZVNldChpbnB1dCwgJmZpbmRlciwgJnNraXBwZXIpOwotICB9Ci19Ci0KLWludCBFeHRlbnNpb25TZXQ6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7Ci0gIGludCB0b3RhbF9zaXplID0KLSAgICAgIGV4dGVuc2lvbnNfLnNpemUoKSAqIHNpemVvZihtYXA8aW50LCBFeHRlbnNpb24+Ojp2YWx1ZV90eXBlKTsKLSAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKSwKLSAgICAgICBlbmQgPSBleHRlbnNpb25zXy5lbmQoKTsKLSAgICAgICBpdGVyICE9IGVuZDsKLSAgICAgICArK2l0ZXIpIHsKLSAgICB0b3RhbF9zaXplICs9IGl0ZXItPnNlY29uZC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCk7Ci0gIH0KLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLWlubGluZSBpbnQgRXh0ZW5zaW9uU2V0OjpSZXBlYXRlZE1lc3NhZ2VfU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigKLSAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZSogZmllbGQpIHsKLSAgcmV0dXJuIGZpZWxkLT5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7Ci19Ci0KLWludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6U3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGNvbnN0IHsKLSAgaW50IHRvdGFsX3NpemUgPSAwOwotICBpZiAoaXNfcmVwZWF0ZWQpIHsKLSAgICBzd2l0Y2ggKGNwcF90eXBlKHR5cGUpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUpICsgICAgICBcCi0gICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCk7XAotICAgICAgICBicmVhawotCi0gICAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQpOwotICAgICAgSEFORExFX1RZUEUoIFVJTlQzMiwgIHVpbnQzMik7Ci0gICAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQpOwotICAgICAgSEFORExFX1RZUEUoIERPVUJMRSwgIGRvdWJsZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0pOwotICAgICAgSEFORExFX1RZUEUoIFNUUklORywgIHN0cmluZyk7Ci0jdW5kZWYgSEFORExFX1RZUEUKLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgLy8gcmVwZWF0ZWRfbWVzc2FnZV92YWx1ZSBpcyBhY3R1YWxseSBhIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+LAotICAgICAgICAvLyBidXQgTWVzc2FnZUxpdGUgaGFzIG5vIFNwYWNlVXNlZCgpLCBzbyB3ZSBtdXN0IGRpcmVjdGx5IGNhbGwKLSAgICAgICAgLy8gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSB3aXRoIGEgZGlmZmVyZW50IHR5cGUKLSAgICAgICAgLy8gaGFuZGxlci4KLSAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUpICsKLSAgICAgICAgICAgIFJlcGVhdGVkTWVzc2FnZV9TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKHJlcGVhdGVkX21lc3NhZ2VfdmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgewotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgICB0b3RhbF9zaXplICs9IHNpemVvZigqc3RyaW5nX3ZhbHVlKSArCi0gICAgICAgICAgICAgICAgICAgICAgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigqc3RyaW5nX3ZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAoaXNfbGF6eSkgewotICAgICAgICAgIHRvdGFsX3NpemUgKz0gbGF6eW1lc3NhZ2VfdmFsdWUtPlNwYWNlVXNlZCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRvdGFsX3NpemUgKz0gZG93bl9jYXN0PE1lc3NhZ2UqPihtZXNzYWdlX3ZhbHVlKS0+U3BhY2VVc2VkKCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBObyBleHRyYSBzdG9yYWdlIGNvc3RzIGZvciBwcmltaXRpdmUgdHlwZXMuCi0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gdG90YWxfc2l6ZTsKLX0KLQotLy8gVGhlIFNlcmlhbGl6ZSpUb0FycmF5IG1ldGhvZHMgYXJlIG9ubHkgbmVlZGVkIGluIHRoZSBoZWF2eSBsaWJyYXJ5LCBhcwotLy8gdGhlIGxpdGUgbGlicmFyeSBvbmx5IGdlbmVyYXRlcyBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMuCi11aW50OCogRXh0ZW5zaW9uU2V0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIGludCBzdGFydF9maWVsZF9udW1iZXIsIGludCBlbmRfZmllbGRfbnVtYmVyLAotICAgIHVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gZXh0ZW5zaW9uc18ubG93ZXJfYm91bmQoc3RhcnRfZmllbGRfbnVtYmVyKTsKLSAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpICYmIGl0ZXItPmZpcnN0IDwgZW5kX2ZpZWxkX251bWJlcjsKLSAgICAgICArK2l0ZXIpIHsKLSAgICB0YXJnZXQgPSBpdGVyLT5zZWNvbmQuU2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGl0ZXItPmZpcnN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0KTsKLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi11aW50OCogRXh0ZW5zaW9uU2V0OjpTZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICB1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXI7Ci0gIGZvciAoaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7IGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgewotICAgIHRhcmdldCA9IGl0ZXItPnNlY29uZC5TZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgICAgIGl0ZXItPmZpcnN0LCB0YXJnZXQpOwotICB9Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLXVpbnQ4KiBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6U2VyaWFsaXplRmllbGRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAotICAgIGludCBudW1iZXIsIHVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgaWYgKGlzX3JlcGVhdGVkKSB7Ci0gICAgaWYgKGlzX3BhY2tlZCkgewotICAgICAgaWYgKGNhY2hlZF9zaXplID09IDApIHJldHVybiB0YXJnZXQ7Ci0KLSAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkobnVtYmVyLAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOwotICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZ1RvQXJyYXkoY2FjaGVkX3NpemUsIHRhcmdldCk7Ci0KLSAgICAgIHN3aXRjaCAocmVhbF90eXBlKHR5cGUpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPnNpemUoKTsgaSsrKSB7ICBcCi0gICAgICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI0NBTUVMQ0FTRSMjTm9UYWdUb0FycmF5KCAgICAgICAgXAotICAgICAgICAgICAgICByZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5HZXQoaSksIHRhcmdldCk7ICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWsKLQotICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgaW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggICBJTlQ2NCwgICAgSW50NjQsICAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQzMiwgICBVSW50MzIsICB1aW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICB1aW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQzMiwgICBTSW50MzIsICAgaW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggIFNJTlQ2NCwgICBTSW50NjQsICAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICB1aW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQsICB1aW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQzMiwgU0ZpeGVkMzIsICAgaW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgaW50NjQpOwotICAgICAgICBIQU5ETEVfVFlQRSggICBGTE9BVCwgICAgRmxvYXQsICAgZmxvYXQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIERPVUJMRSwgICBEb3VibGUsICBkb3VibGUpOwotICAgICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgIGJvb2wpOwotICAgICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgIGVudW0pOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkc6Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVM6Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfR1JPVVA6Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRToKLSAgICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm9uLXByaW1pdGl2ZSB0eXBlcyBjYW4ndCBiZSBwYWNrZWQuIjsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChyZWFsX3R5cGUodHlwZSkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBDQU1FTENBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVVBQRVJDQVNFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZS0+c2l6ZSgpOyBpKyspIHsgIFwKLSAgICAgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjQ0FNRUxDQVNFIyNUb0FycmF5KG51bWJlciwgICAgICBcCi0gICAgICAgICAgICAgIHJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPkdldChpKSwgdGFyZ2V0KTsgICAgICAgICAgICAgICAgXAotICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhawotCi0gICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDMyLCAgICBJbnQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDMyLCAgIFVJbnQzMiwgIHVpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgVUlOVDY0LCAgIFVJbnQ2NCwgIHVpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDY0LCAgIFNJbnQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMiwgIHVpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCwgIHVpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCBTRml4ZWQzMiwgICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCwgICBpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCwgICBmbG9hdCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgRE9VQkxFLCAgIERvdWJsZSwgIGRvdWJsZSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgICBCT09MLCAgICAgQm9vbCwgICAgYm9vbCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgU1RSSU5HLCAgIFN0cmluZywgIHN0cmluZyk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgIHN0cmluZyk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgZW51bSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIEdST1VQLCAgICBHcm91cCwgbWVzc2FnZSk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgbWVzc2FnZSk7Ci0jdW5kZWYgSEFORExFX1RZUEUKLSAgICAgIH0KLSAgICB9Ci0gIH0gZWxzZSBpZiAoIWlzX2NsZWFyZWQpIHsKLSAgICBzd2l0Y2ggKHJlYWxfdHlwZSh0eXBlKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIENBTUVMQ0FTRSwgVkFMVUUpICAgICAgICAgICAgICAgICBcCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlIyNDQU1FTENBU0UjI1RvQXJyYXkoICAgICAgXAotICAgICAgICAgICAgbnVtYmVyLCBWQUxVRSwgdGFyZ2V0KTsgXAotICAgICAgICBicmVhawotCi0gICAgICBIQU5ETEVfVFlQRSggICBJTlQzMiwgICAgSW50MzIsICAgIGludDMyX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIElOVDY0LCAgICBJbnQ2NCwgICAgaW50NjRfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBVSU5UMzIsICAgVUludDMyLCAgIHVpbnQzMl92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggIFVJTlQ2NCwgICBVSW50NjQsICAgdWludDY0X3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgU0lOVDMyLCAgIFNJbnQzMiwgICAgaW50MzJfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBTSU5UNjQsICAgU0ludDY0LCAgICBpbnQ2NF92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggRklYRUQzMiwgIEZpeGVkMzIsICAgdWludDMyX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCAgRml4ZWQ2NCwgICB1aW50NjRfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyLCAgICBpbnQzMl92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRShTRklYRUQ2NCwgU0ZpeGVkNjQsICAgIGludDY0X3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEZMT0FULCAgICBGbG9hdCwgICAgZmxvYXRfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICBET1VCTEUsICAgRG91YmxlLCAgIGRvdWJsZV92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICAgQk9PTCwgICAgIEJvb2wsICAgICBib29sX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgU1RSSU5HLCAgIFN0cmluZywgICpzdHJpbmdfdmFsdWUpOwotICAgICAgSEFORExFX1RZUEUoICAgQllURVMsICAgIEJ5dGVzLCAgKnN0cmluZ192YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggICAgRU5VTSwgICAgIEVudW0sICAgICBlbnVtX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgIEdST1VQLCAgICBHcm91cCwgKm1lc3NhZ2VfdmFsdWUpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAoaXNfbGF6eSkgewotICAgICAgICAgIHRhcmdldCA9IGxhenltZXNzYWdlX3ZhbHVlLT5Xcml0ZU1lc3NhZ2VUb0FycmF5KG51bWJlciwgdGFyZ2V0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlVG9BcnJheSgKLSAgICAgICAgICAgICAgbnVtYmVyLCAqbWVzc2FnZV92YWx1ZSwgdGFyZ2V0KTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotdWludDgqIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCi0gICAgaW50IG51bWJlciwKLSAgICB1aW50OCogdGFyZ2V0KSBjb25zdCB7Ci0gIGlmICh0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UgfHwgaXNfcmVwZWF0ZWQpIHsKLSAgICAvLyBOb3QgYSB2YWxpZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiwgYnV0IHNlcmlhbGl6ZSBpdCB0aGUgbm9ybWFsIHdheS4KLSAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJJbnZhbGlkIG1lc3NhZ2Ugc2V0IGV4dGVuc2lvbi4iOwotICAgIHJldHVybiBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplc1RvQXJyYXkobnVtYmVyLCB0YXJnZXQpOwotICB9Ci0KLSAgaWYgKGlzX2NsZWFyZWQpIHJldHVybiB0YXJnZXQ7Ci0KLSAgLy8gU3RhcnQgZ3JvdXAuCi0gIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnLCB0YXJnZXQpOwotICAvLyBXcml0ZSB0eXBlIElELgotICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJUb0FycmF5KAotICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkTnVtYmVyLCBudW1iZXIsIHRhcmdldCk7Ci0gIC8vIFdyaXRlIG1lc3NhZ2UuCi0gIGlmIChpc19sYXp5KSB7Ci0gICAgdGFyZ2V0ID0gbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZVRvQXJyYXkoCi0gICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsIHRhcmdldCk7Ci0gIH0gZWxzZSB7Ci0gICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZVRvQXJyYXkoCi0gICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsICptZXNzYWdlX3ZhbHVlLCB0YXJnZXQpOwotICB9Ci0gIC8vIEVuZCBncm91cC4KLSAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZ1RvQXJyYXkoCi0gICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnLCB0YXJnZXQpOwotICByZXR1cm4gdGFyZ2V0OwotfQotCi0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkTWF5YmVMYXppbHkoCi0gICAgaW50IHdpcmVfdHlwZSwgaW50IGZpZWxkX251bWJlciwgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKLSAgICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7Ci0gIHJldHVybiBQYXJzZUZpZWxkKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAotICAgICAgZmllbGRfbnVtYmVyLCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU+KHdpcmVfdHlwZSkpLAotICAgICAgICAgICAgICAgICAgICBpbnB1dCwgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcik7Ci19Ci0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTZXRGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICBjb25zdCB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKLSAgICBzd2l0Y2ggKHRhZykgewotICAgICAgY2FzZSAwOgotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnOgotICAgICAgICBpZiAoIVBhcnNlTWVzc2FnZVNldEl0ZW0oaW5wdXQsIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgaWYgKCFQYXJzZUZpZWxkKHRhZywgaW5wdXQsIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1ib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSkgewotICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyIHNraXBwZXIoTlVMTCk7Ci0gIEdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlciBmaW5kZXIoY29udGFpbmluZ190eXBlKTsKLSAgcmV0dXJuIFBhcnNlTWVzc2FnZVNldChpbnB1dCwgJmZpbmRlciwgJnNraXBwZXIpOwotfQotCi1ib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0SXRlbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7Ci0gIC8vIFRPRE8oa2VudG9uKTogIEl0IHdvdWxkIGJlIG5pY2UgdG8gc2hhcmUgY29kZSBiZXR3ZWVuIHRoaXMgYW5kCi0gIC8vIFdpcmVGb3JtYXRMaXRlOjpQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEl0ZW0oKSwgYnV0IEkgdGhpbmsgdGhlCi0gIC8vIGRpZmZlcmVuY2VzIHdvdWxkIGJlIGhhcmQgdG8gZmFjdG9yIG91dC4KLQotICAvLyBUaGlzIG1ldGhvZCBwYXJzZXMgYSBncm91cCB3aGljaCBzaG91bGQgY29udGFpbiB0d28gZmllbGRzOgotICAvLyAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOwotICAvLyAgIHJlcXVpcmVkIGRhdGEgbWVzc2FnZSA9IDM7Ci0KLSAgdWludDMyIGxhc3RfdHlwZV9pZCA9IDA7Ci0KLSAgLy8gSWYgd2Ugc2VlIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQsIHdlJ2xsIGFwcGVuZCBpdCB0byB0aGlzIHNvCi0gIC8vIHdlIGNhbiBwYXJzZSBpdCBsYXRlci4KLSAgc3RyaW5nIG1lc3NhZ2VfZGF0YTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGNvbnN0IHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOwotICAgIGlmICh0YWcgPT0gMCkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoICh0YWcpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnOiB7Ci0gICAgICAgIHVpbnQzMiB0eXBlX2lkOwotICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnR5cGVfaWQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGxhc3RfdHlwZV9pZCA9IHR5cGVfaWQ7Ci0KLSAgICAgICAgaWYgKCFtZXNzYWdlX2RhdGEuZW1wdHkoKSkgewotICAgICAgICAgIC8vIFdlIHNhdyBzb21lIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQuICBIYXZlIHRvIHBhcnNlIGl0Ci0gICAgICAgICAgLy8gbm93LgotICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIHN1Yl9pbnB1dCgKLSAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KG1lc3NhZ2VfZGF0YS5kYXRhKCkpLAotICAgICAgICAgICAgICBtZXNzYWdlX2RhdGEuc2l6ZSgpKTsKLSAgICAgICAgICBpZiAoIVBhcnNlRmllbGRNYXliZUxhemlseShXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3R5cGVfaWQsICZzdWJfaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbWVzc2FnZV9kYXRhLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnOiB7Ci0gICAgICAgIGlmIChsYXN0X3R5cGVfaWQgPT0gMCkgewotICAgICAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiBhIHR5cGVfaWQgeWV0LiAgQXBwZW5kIHRoaXMgZGF0YSB0byBtZXNzYWdlX2RhdGEuCi0gICAgICAgICAgc3RyaW5nIHRlbXA7Ci0gICAgICAgICAgdWludDMyIGxlbmd0aDsKLSAgICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKCZ0ZW1wLCBsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZtZXNzYWdlX2RhdGEpOwotICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dF9zdHJlYW0pOwotICAgICAgICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyKGxlbmd0aCk7Ci0gICAgICAgICAgY29kZWRfb3V0cHV0LldyaXRlU3RyaW5nKHRlbXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIEFscmVhZHkgc2F3IHR5cGVfaWQsIHNvIHdlIGNhbiBwYXJzZSB0aGlzIGRpcmVjdGx5LgotICAgICAgICAgIGlmICghUGFyc2VGaWVsZE1heWJlTGF6aWx5KFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfdHlwZV9pZCwgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnOiB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGlmICghZmllbGRfc2tpcHBlci0+U2tpcEZpZWxkKGlucHV0LCB0YWcpKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzKAotICAgIGludCBudW1iZXIsCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgaWYgKHR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSB8fCBpc19yZXBlYXRlZCkgewotICAgIC8vIE5vdCBhIHZhbGlkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLCBidXQgc2VyaWFsaXplIGl0IHRoZSBub3JtYWwgd2F5LgotICAgIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKG51bWJlciwgb3V0cHV0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoaXNfY2xlYXJlZCkgcmV0dXJuOwotCi0gIC8vIFN0YXJ0IGdyb3VwLgotICBvdXRwdXQtPldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZyk7Ci0KLSAgLy8gV3JpdGUgdHlwZSBJRC4KLSAgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Ci0gIC8vIFdyaXRlIG1lc3NhZ2UuCi0gIGlmIChpc19sYXp5KSB7Ci0gICAgbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZSgKLSAgICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwgb3V0cHV0KTsKLSAgfSBlbHNlIHsKLSAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLAotICAgICAgICAqbWVzc2FnZV92YWx1ZSwKLSAgICAgICAgb3V0cHV0KTsKLSAgfQotCi0gIC8vIEVuZCBncm91cC4KLSAgb3V0cHV0LT5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKLX0KLQotaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGludCBudW1iZXIpIGNvbnN0IHsKLSAgaWYgKHR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSB8fCBpc19yZXBlYXRlZCkgewotICAgIC8vIE5vdCBhIHZhbGlkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLCBidXQgY29tcHV0ZSB0aGUgYnl0ZSBzaXplIGZvciBpdCB0aGUKLSAgICAvLyBub3JtYWwgd2F5LgotICAgIHJldHVybiBCeXRlU2l6ZShudW1iZXIpOwotICB9Ci0KLSAgaWYgKGlzX2NsZWFyZWQpIHJldHVybiAwOwotCi0gIGludCBvdXJfc2l6ZSA9IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZTsKLQotICAvLyB0eXBlX2lkCi0gIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKG51bWJlcik7Ci0KLSAgLy8gbWVzc2FnZQotICBpbnQgbWVzc2FnZV9zaXplID0gMDsKLSAgaWYgKGlzX2xhenkpIHsKLSAgICBtZXNzYWdlX3NpemUgPSBsYXp5bWVzc2FnZV92YWx1ZS0+Qnl0ZVNpemUoKTsKLSAgfSBlbHNlIHsKLSAgICBtZXNzYWdlX3NpemUgPSBtZXNzYWdlX3ZhbHVlLT5CeXRlU2l6ZSgpOwotICB9Ci0KLSAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobWVzc2FnZV9zaXplKTsKLSAgb3VyX3NpemUgKz0gbWVzc2FnZV9zaXplOwotCi0gIHJldHVybiBvdXJfc2l6ZTsKLX0KLQotdm9pZCBFeHRlbnNpb25TZXQ6OlNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICBpdGVyLT5zZWNvbmQuU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoaXRlci0+Zmlyc3QsIG91dHB1dCk7Ci0gIH0KLX0KLQotaW50IEV4dGVuc2lvblNldDo6TWVzc2FnZVNldEJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICB0b3RhbF9zaXplICs9IGl0ZXItPnNlY29uZC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGl0ZXItPmZpcnN0KTsKLSAgfQotCi0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNDBmY2JjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEyMDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1uYW1lc3BhY2UgewotCi0vLyBUaGlzIHRlc3QgY2xvc2VseSBtaXJyb3JzIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvdW5pdHRlc3QuY2MKLS8vIGV4Y2VwdCB0aGF0IGl0IHVzZXMgZXh0ZW5zaW9ucyByYXRoZXIgdGhhbiByZWd1bGFyIGZpZWxkcy4KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBEZWZhdWx0cykgewotICAvLyBDaGVjayB0aGF0IGFsbCBkZWZhdWx0IHZhbHVlcyBhcmUgc2V0IGNvcnJlY3RseSBpbiB0aGUgaW5pdGlhbCBtZXNzYWdlLgotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLQotICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOwotCi0gIC8vIE1lc3NhZ2VzIHNob3VsZCByZXR1cm4gcG9pbnRlcnMgdG8gZGVmYXVsdCBpbnN0YW5jZXMgdW50aWwgZmlyc3QgdXNlLgotICAvLyAoVGhpcyBpcyBub3QgY2hlY2tlZCBieSBFeHBlY3RDbGVhcigpIHNpbmNlIGl0IGlzIG5vdCBhY3R1YWxseSB0cnVlIGFmdGVyCi0gIC8vIHRoZSBmaWVsZHMgaGF2ZSBiZWVuIHNldCBhbmQgdGhlbiBjbGVhcmVkLikKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6T3B0aW9uYWxHcm91cF9leHRlbnNpb246OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBBY2Nlc3NvcnMpIHsKLSAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gZ28gYmFjayBhbmQgY2hlY2sgYWxsIHRob3NlCi0gIC8vIHZhbHVlcy4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLQotICBUZXN0VXRpbDo6TW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIENsZWFyKSB7Ci0gIC8vIFNldCBldmVyeSBmaWVsZCB0byBhIHVuaXF1ZSB2YWx1ZSwgY2xlYXIgdGhlIG1lc3NhZ2UsIHRoZW4gY2hlY2sgdGhhdAotICAvLyBpdCBpcyBjbGVhcmVkLgotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKLQotICAvLyBVbmxpa2Ugd2l0aCB0aGUgZGVmYXVsdHMgdGVzdCwgd2UgZG8gTk9UIGV4cGVjdCB0aGF0IHJlcXVlc3RpbmcgZW1iZWRkZWQKLSAgLy8gbWVzc2FnZXMgd2lsbCByZXR1cm4gYSBwb2ludGVyIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlLiAgSW5zdGVhZCwgdGhleQotICAvLyBzaG91bGQgcmV0dXJuIHRoZSBvYmplY3RzIHRoYXQgd2VyZSBjcmVhdGVkIHdoZW4gbXV0YWJsZV9ibGFoKCkgd2FzCi0gIC8vIGNhbGxlZC4KLSAgRVhQRUNUX05FKCZ1bml0dGVzdDo6T3B0aW9uYWxHcm91cF9leHRlbnNpb246OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24pKTsKLSAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKAotICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pKTsKLQotICAvLyBNYWtlIHN1cmUgc2V0dGluZyBzdHVmZiBhZ2FpbiBhZnRlciBjbGVhcmluZyB3b3Jrcy4gIChUaGlzIHRha2VzIHNsaWdodGx5Ci0gIC8vIGRpZmZlcmVudCBjb2RlIHBhdGhzIHNpbmNlIHRoZSBvYmplY3RzIGFyZSByZXVzZWQuKQotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIENsZWFyT25lRmllbGQpIHsKLSAgLy8gU2V0IGV2ZXJ5IGZpZWxkIHRvIGEgdW5pcXVlIHZhbHVlLCB0aGVuIGNsZWFyIG9uZSB2YWx1ZSBhbmQgaW5zdXJlIHRoYXQKLSAgLy8gb25seSB0aGF0IG9uZSB2YWx1ZSBpcyBjbGVhcmVkLgotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gIGludDY0IG9yaWdpbmFsX3ZhbHVlID0KLSAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uKTsKLQotICAvLyBDbGVhciB0aGUgZmllbGQgYW5kIG1ha2Ugc3VyZSBpdCBzaG93cyB1cCBhcyBjbGVhcmVkLgotICBtZXNzYWdlLkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24pOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbikpOwotCi0gIC8vIE90aGVyIGFkamFjZW50IGZpZWxkcyBzaG91bGQgbm90IGJlIGNsZWFyZWQuCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb24pKTsKLQotICAvLyBNYWtlIHN1cmUgaWYgd2Ugc2V0IGl0IGFnYWluLCB0aGVuIGFsbCBmaWVsZHMgYXJlIHNldC4KLSAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiwgb3JpZ2luYWxfdmFsdWUpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTZXRBbGxvY2F0ZWRFeHRlbnNpb24pIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIC8vIEFkZCBhIGV4dGVuc2lvbiB1c2luZyBTZXRBbGxvY2F0ZWRFeHRlbnNpb24KLSAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBmb3JlaWduX21lc3NhZ2UgPSBuZXcgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKCk7Ci0gIG1lc3NhZ2UuU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduX21lc3NhZ2UpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUShmb3JlaWduX21lc3NhZ2UsCi0gICAgICAgICAgICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24oCi0gICAgICAgICAgICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKGZvcmVpZ25fbWVzc2FnZSwKLSAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotCi0gIC8vIFNldEFsbG9jYXRlZEV4dGVuc2lvbiBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGV4dGVuc2lvbi4KLSAgLy8gKFdlIHJlcGx5IG9uIHVuaXR0ZXN0IHRvIGNoZWNrIG1lbW9yeSBsZWFrcyBmb3IgdGhpcyBjYXNlKQotICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSgpKTsKLQotICAvLyBTZXRBbGxvY2F0ZWRFeHRlbnNpb24gd2l0aCBhIE5VTEwgcGFyYW1ldGVyIGlzIGVxdWl2YWxlbnQgdG8gQ2xlYXJFeHRlbmlvbi4KLSAgbWVzc2FnZS5TZXRBbGxvY2F0ZWRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oCi0gICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIFJlbGVhc2VFeHRlbnNpb24pIHsKLSAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2U7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikpOwotICAvLyBBZGQgYSBleHRlbnNpb24gdXNpbmcgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uCi0gIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIGV4dGVuc2lvbiA9Ci0gICAgICBuZXcgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpOwotICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiwKLSAgICAgIGV4dGVuc2lvbik7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAotICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKSk7Ci0gIC8vIFJlbGVhc2UgdGhlIGV4dGVuc2lvbiB1c2luZyBSZWxlYXNlRXh0ZW5zaW9uCi0gIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIHJlbGVhc2VkX2V4dGVuc2lvbiA9Ci0gICAgICBtZXNzYWdlLlJlbGVhc2VFeHRlbnNpb24oCi0gICAgICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKLSAgRVhQRUNUX0VRKGV4dGVuc2lvbiwgcmVsZWFzZWRfZXh0ZW5zaW9uKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAotICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKSk7Ci0gIC8vIFJlbGVhc2VFeHRlbnNpb24gd2lsbCByZXR1cm4gdGhlIHVuZGVybHlpbmcgb2JqZWN0IGV2ZW4gYWZ0ZXIKLSAgLy8gQ2xlYXJFeHRlbnNpb24gaXMgY2FsbGVkLgotICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiwKLSAgICAgIGV4dGVuc2lvbik7Ci0gIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24oCi0gICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOwotICByZWxlYXNlZF9leHRlbnNpb24gPSBtZXNzYWdlLlJlbGVhc2VFeHRlbnNpb24oCi0gICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOwotICBFWFBFQ1RfVFJVRShyZWxlYXNlZF9leHRlbnNpb24gIT0gTlVMTCk7Ci0gIGRlbGV0ZSByZWxlYXNlZF9leHRlbnNpb247Ci19Ci0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBDb3B5RnJvbSkgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEsIG1lc3NhZ2UyOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7Ci0gIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwotICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7ICAvLyBleGVyY2lzZSBjb3B5IHdoZW4gZmllbGRzIGFscmVhZHkgZXhpc3QKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwotfQotCi1URVNUKEV4dGVuc2lvU2V0VGVzdCwgQ29weUZyb21QYWNrZWQpIHsKLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLQotICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZTEpOwotICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLSAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTEpOyAgLy8gZXhlcmNpc2UgY29weSB3aGVuIGZpZWxkcyBhbHJlYWR5IGV4aXN0Ci0gIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBDb3B5RnJvbVVwY2FzdGVkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIGNvbnN0IE1lc3NhZ2UmIHVwY2FzdGVkX21lc3NhZ2UgPSBtZXNzYWdlMTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOwotICBtZXNzYWdlMi5Db3B5RnJvbSh1cGNhc3RlZF9tZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwotICAvLyBleGVyY2lzZSBjb3B5IHdoZW4gZmllbGRzIGFscmVhZHkgZXhpc3QKLSAgbWVzc2FnZTIuQ29weUZyb20odXBjYXN0ZWRfbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwV2l0aEVtcHR5KSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UyKTsKLSAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Ci0gIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTEpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBXaXRoU2VsZikgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOwotICBtZXNzYWdlLlN3YXAoJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwRXh0ZW5zaW9uKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7Ci0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0KLSAgLy8gU3dhcCBlbXB0eSBmaWVsZHMuCi0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMik7Ci0KLSAgLy8gU3dhcCB0d28gZXh0ZW5zaW9ucy4KLSAgZmllbGRzLnB1c2hfYmFjaygKLSAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKDEyKSk7Ci0gIGZpZWxkcy5wdXNoX2JhY2soCi0gICAgICByZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcigyNSkpOwotICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlMS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24pKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZTIuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24pKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwRXh0ZW5zaW9uV2l0aEVtcHR5KSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOwotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTM7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UzKTsKLQotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTMuR2V0UmVmbGVjdGlvbigpOwotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UzLCAmZmllbGRzKTsKLQotICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UyKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwRXh0ZW5zaW9uQm90aEZ1bGwpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UxOwotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTI7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UyKTsKLQotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOwotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UxLCAmZmllbGRzKTsKLQotICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIEFyZW5hU2V0QWxsRXh0ZW5zaW9uKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmExOwotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UxID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmExKTsKLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTEpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIEFyZW5hQ29weUNvbnN0cnVjdG9yKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmExOwotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UxID0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmExKTsKLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOwotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTIoKm1lc3NhZ2UxKTsKLSAgYXJlbmExLlJlc2V0KCk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBBcmVuYU1lcmdlRnJvbSkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hIGFyZW5hMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMSA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hMSk7Ci0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UxKTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOwotICBtZXNzYWdlMi5NZXJnZUZyb20oKm1lc3NhZ2UxKTsKLSAgYXJlbmExLlJlc2V0KCk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2VBbmRSZWxlYXNlKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmE7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UtPkhhc0V4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIC8vIEFkZCBhIGV4dGVuc2lvbiB1c2luZyBTZXRBbGxvY2F0ZWRFeHRlbnNpb24KLSAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBmb3JlaWduX21lc3NhZ2UgPSBuZXcgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKCk7Ci0gIG1lc3NhZ2UtPlNldEFsbG9jYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvcmVpZ25fbWVzc2FnZSk7Ci0gIC8vIGZvcmVpZ25fbWVzc2FnZSBpcyBub3cgb3duZWQgYnkgdGhlIGFyZW5hLgotICBFWFBFQ1RfRVEoZm9yZWlnbl9tZXNzYWdlLAotICAgICAgICAgICAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbigKLSAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotCi0gIC8vIFVuZGVybHlpbmcgbWVzc2FnZSBpcyBjb3BpZWQsIGFuZCByZXR1cm5lZC4KLSAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiByZWxlYXNlZF9tZXNzYWdlID0gbWVzc2FnZS0+UmVsZWFzZUV4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKTsKLSAgZGVsZXRlIHJlbGVhc2VkX21lc3NhZ2U7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLT5IYXNFeHRlbnNpb24oCi0gICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBFeHRlbnNpb25Cb3RoRnVsbFdpdGhBcmVuYSkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hIGFyZW5hMTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxnb29nbGU6OnByb3RvYnVmOjpBcmVuYT4gYXJlbmEyKG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKCkpOwotCi0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTEgPQotICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmExKTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMiA9Ci0gICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KGFyZW5hMi5nZXQoKSk7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOwotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMik7Ci0gIG1lc3NhZ2UxLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMSk7Ci0gIG1lc3NhZ2UyLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMik7Ci0gIG1lc3NhZ2UxLT5Td2FwKG1lc3NhZ2UyKTsKLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLT5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTItPkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKSk7Ci0gIC8vIFJlLXNldCB0aGUgb3JpZ2luYWwgdmFsdWVzIHNvIEV4cGVjdEFsbEV4dGVuc2lvbnNTZXQgaXMgaGFwcHkuCi0gIG1lc3NhZ2UxLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiwgMTAxKTsKLSAgbWVzc2FnZTItPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLCAxMDEpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTIpOwotICBhcmVuYTIucmVzZXQoTlVMTCk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMSk7Ci0gIC8vIFRlc3QgY29ybmVyIGNhc2VzLCB3aGVuIG9uZSBpcyBlbXB0eSBhbmQgb3RoZXIgaXMgbm90LgotICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hIGFyZW5hMywgYXJlbmE0OwotCi0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTMgPQotICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmEzKTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlNCA9Ci0gICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYTQpOwotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMyk7Ci0gIG1lc3NhZ2UzLT5Td2FwKG1lc3NhZ2U0KTsKLSAgYXJlbmEzLlJlc2V0KCk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlNCk7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcEZpZWxkc09mRXh0ZW5zaW9uQm90aEZ1bGxXaXRoQXJlbmEpIHsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmExOwotICBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEyID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEoKTsKLQotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UxID0KLSAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hMSk7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTIgPQotICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPihhcmVuYTIpOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTIpOwotCi0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS0+R2V0UmVmbGVjdGlvbigpOwotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlMSwgJmZpZWxkcyk7Ci0gIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZHMpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTIpOwotICBkZWxldGUgYXJlbmEyOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgqbWVzc2FnZTEpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBFeHRlbnNpb25XaXRoU2VsZikgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTE7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UxKTsKLQotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOwotICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UxLCAmZmllbGRzKTsKLSAgcmVmbGVjdGlvbi0+U3dhcEZpZWxkcygmbWVzc2FnZTEsICZtZXNzYWdlMSwgZmllbGRzKTsKLQotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMSk7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU2VyaWFsaXphdGlvblRvQXJyYXkpIHsKLSAgLy8gU2VyaWFsaXplIGFzIFRlc3RBbGxFeHRlbnNpb25zIGFuZCBwYXJzZSBhcyBUZXN0QWxsVHlwZXMgdG8gaW5zdXJlIHdpcmUKLSAgLy8gY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLgotICAvLwotICAvLyBUaGlzIGNoZWNrcyBzZXJpYWxpemF0aW9uIHRvIGEgZmxhdCBhcnJheSBieSBleHBsaWNpdGx5IHJlc2VydmluZyBzcGFjZSBpbgotICAvLyB0aGUgc3RyaW5nIGFuZCBjYWxsaW5nIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSdzCi0gIC8vIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBzb3VyY2U7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgZGVzdGluYXRpb247Ci0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZzb3VyY2UpOwotICBpbnQgc2l6ZSA9IHNvdXJjZS5CeXRlU2l6ZSgpOwotICBzdHJpbmcgZGF0YTsKLSAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0gIHVpbnQ4KiB0YXJnZXQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7Ci0gIHVpbnQ4KiBlbmQgPSBzb3VyY2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOwotICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gdGFyZ2V0KTsKLSAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChkZXN0aW5hdGlvbik7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7Ci0gIC8vIFNlcmlhbGl6ZSBhcyBUZXN0QWxsRXh0ZW5zaW9ucyBhbmQgcGFyc2UgYXMgVGVzdEFsbFR5cGVzIHRvIGluc3VyZSB3aXJlCi0gIC8vIGNvbXBhdGliaWxpdHkgb2YgZXh0ZW5zaW9ucy4KLSAgLy8KLSAgLy8gVGhpcyBjaGVja3Mgc2VyaWFsaXphdGlvbiB0byBhbiBvdXRwdXQgc3RyZWFtIGJ5IGNyZWF0aW5nIGFuIGFycmF5IG91dHB1dAotICAvLyBzdHJlYW0gdGhhdCBjYW4gb25seSBidWZmZXIgMSBieXRlIGF0IGEgdGltZSAtIHRoaXMgcHJldmVudHMgdGhlIG1lc3NhZ2UKLSAgLy8gZnJvbSBldmVyIGp1bXBpbmcgdG8gdGhlIGZhc3QgcGF0aCwgZW5zdXJpbmcgdGhhdCBzZXJpYWxpemF0aW9uIGhhcHBlbnMgdmlhCi0gIC8vIHRoZSBDb2RlZE91dHB1dFN0cmVhbS4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHNvdXJjZTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBkZXN0aW5hdGlvbjsKLSAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJnNvdXJjZSk7Ci0gIGludCBzaXplID0gc291cmNlLkJ5dGVTaXplKCk7Ci0gIHN0cmluZyBkYXRhOwotICBkYXRhLnJlc2l6ZShzaXplKTsKLSAgewotICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7Ci0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgc291cmNlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChkZXN0aW5hdGlvbik7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUGFja2VkU2VyaWFsaXphdGlvblRvQXJyYXkpIHsKLSAgLy8gU2VyaWFsaXplIGFzIFRlc3RQYWNrZWRFeHRlbnNpb25zIGFuZCBwYXJzZSBhcyBUZXN0UGFja2VkVHlwZXMgdG8gaW5zdXJlCi0gIC8vIHdpcmUgY29tcGF0aWJpbGl0eSBvZiBleHRlbnNpb25zLgotICAvLwotICAvLyBUaGlzIGNoZWNrcyBzZXJpYWxpemF0aW9uIHRvIGEgZmxhdCBhcnJheSBieSBleHBsaWNpdGx5IHJlc2VydmluZyBzcGFjZSBpbgotICAvLyB0aGUgc3RyaW5nIGFuZCBjYWxsaW5nIHRoZSBnZW5lcmF0ZWQgbWVzc2FnZSdzCi0gIC8vIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkuCi0gIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBzb3VyY2U7Ci0gIHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMgZGVzdGluYXRpb247Ci0gIFRlc3RVdGlsOjpTZXRQYWNrZWRFeHRlbnNpb25zKCZzb3VyY2UpOwotICBpbnQgc2l6ZSA9IHNvdXJjZS5CeXRlU2l6ZSgpOwotICBzdHJpbmcgZGF0YTsKLSAgZGF0YS5yZXNpemUoc2l6ZSk7Ci0gIHVpbnQ4KiB0YXJnZXQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7Ci0gIHVpbnQ4KiBlbmQgPSBzb3VyY2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOwotICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gdGFyZ2V0KTsKLSAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChkZXN0aW5hdGlvbik7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUGFja2VkU2VyaWFsaXphdGlvblRvU3RyZWFtKSB7Ci0gIC8vIFNlcmlhbGl6ZSBhcyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBhbmQgcGFyc2UgYXMgVGVzdFBhY2tlZFR5cGVzIHRvIGluc3VyZQotICAvLyB3aXJlIGNvbXBhdGliaWxpdHkgb2YgZXh0ZW5zaW9ucy4KLSAgLy8KLSAgLy8gVGhpcyBjaGVja3Mgc2VyaWFsaXphdGlvbiB0byBhbiBvdXRwdXQgc3RyZWFtIGJ5IGNyZWF0aW5nIGFuIGFycmF5IG91dHB1dAotICAvLyBzdHJlYW0gdGhhdCBjYW4gb25seSBidWZmZXIgMSBieXRlIGF0IGEgdGltZSAtIHRoaXMgcHJldmVudHMgdGhlIG1lc3NhZ2UKLSAgLy8gZnJvbSBldmVyIGp1bXBpbmcgdG8gdGhlIGZhc3QgcGF0aCwgZW5zdXJpbmcgdGhhdCBzZXJpYWxpemF0aW9uIGhhcHBlbnMgdmlhCi0gIC8vIHRoZSBDb2RlZE91dHB1dFN0cmVhbS4KLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIHNvdXJjZTsKLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBkZXN0aW5hdGlvbjsKLSAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJnNvdXJjZSk7Ci0gIGludCBzaXplID0gc291cmNlLkJ5dGVTaXplKCk7Ci0gIHN0cmluZyBkYXRhOwotICBkYXRhLnJlc2l6ZShzaXplKTsKLSAgewotICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7Ci0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7Ci0gICAgc291cmNlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChkZXN0aW5hdGlvbik7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUGFyc2luZykgewotICAvLyBTZXJpYWxpemUgYXMgVGVzdEFsbFR5cGVzIGFuZCBwYXJzZSBhcyBUZXN0QWxsRXh0ZW5zaW9ucy4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBzb3VyY2U7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBkZXN0aW5hdGlvbjsKLSAgc3RyaW5nIGRhdGE7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmc291cmNlKTsKLSAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLSAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgVGVzdFV0aWw6OlNldE9uZW9mRmllbGRzKCZkZXN0aW5hdGlvbik7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBQYWNrZWRQYXJzaW5nKSB7Ci0gIC8vIFNlcmlhbGl6ZSBhcyBUZXN0UGFja2VkVHlwZXMgYW5kIHBhcnNlIGFzIFRlc3RQYWNrZWRFeHRlbnNpb25zLgotICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZTsKLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIGRlc3RpbmF0aW9uOwotICBzdHJpbmcgZGF0YTsKLQotICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZzb3VyY2UpOwotICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChkZXN0aW5hdGlvbik7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUGFja2VkVG9VbnBhY2tlZFBhcnNpbmcpIHsKLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBzb3VyY2U7Ci0gIHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRFeHRlbnNpb25zIGRlc3RpbmF0aW9uOwotICBzdHJpbmcgZGF0YTsKLQotICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZzb3VyY2UpOwotICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICBUZXN0VXRpbDo6RXhwZWN0VW5wYWNrZWRFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKLQotICAvLyBSZXNlcmlhbGl6ZQotICB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMgdW5wYWNrZWQ7Ci0gIFRlc3RVdGlsOjpTZXRVbnBhY2tlZEZpZWxkcygmdW5wYWNrZWQpOwotICBFWFBFQ1RfVFJVRSh1bnBhY2tlZC5TZXJpYWxpemVBc1N0cmluZygpID09IGRlc3RpbmF0aW9uLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOwotCi0gIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gYWRkIGV4dGVuc2lvbnMuCi0gIGRlc3RpbmF0aW9uLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCAxKTsKLSAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpGT1JFSUdOX0JBUik7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgVW5wYWNrZWRUb1BhY2tlZFBhcnNpbmcpIHsKLSAgdW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzIHNvdXJjZTsKLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIGRlc3RpbmF0aW9uOwotICBzdHJpbmcgZGF0YTsKLQotICBUZXN0VXRpbDo6U2V0VW5wYWNrZWRGaWVsZHMoJnNvdXJjZSk7Ci0gIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7Ci0gIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKLQotICAvLyBSZXNlcmlhbGl6ZQotICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHBhY2tlZDsKLSAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmcGFja2VkKTsKLSAgRVhQRUNUX1RSVUUocGFja2VkLlNlcmlhbGl6ZUFzU3RyaW5nKCkgPT0gZGVzdGluYXRpb24uU2VyaWFsaXplQXNTdHJpbmcoKSk7Ci0KLSAgLy8gTWFrZSBzdXJlIHdlIGNhbiBhZGQgZXh0ZW5zaW9ucy4KLSAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCAxKTsKLSAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6Rk9SRUlHTl9CQVIpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIElzSW5pdGlhbGl6ZWQpIHsKLSAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBpbiBuZXN0ZWQKLSAgLy8gZXh0ZW5zaW9ucyBhcmUgbWlzc2luZy4KLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotCi0gIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotCi0gIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYSgxKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKLSAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9iKDIpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2MoMyk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKLQotICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2EoMSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7Ci0gIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9iKDIpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYygzKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotfQotCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIE11dGFibGVTdHJpbmcpIHsKLSAgLy8gVGVzdCB0aGUgbXV0YWJsZSBzdHJpbmcgYWNjZXNzb3JzLgotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLQotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24pLT5hc3NpZ24oImZvbyIpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoImZvbyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uKSk7Ci0KLSAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pLT5hc3NpZ24oImJhciIpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUSgiYmFyIiwKLSAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCAwKSk7Ci19Ci0KLVRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZikgewotICAvLyBTY2FsYXIgcHJpbWl0aXZlIGV4dGVuc2lvbnMgc2hvdWxkIGluY3JlYXNlIHRoZSBleHRlbnNpb24gc2V0IHNpemUgYnkgYQotICAvLyBtaW5pbXVtIG9mIHRoZSBzaXplIG9mIHRoZSBwcmltaXRpdmUgdHlwZS4KLSNkZWZpbmUgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHR5cGUsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfIyN0eXBlIyNfZXh0ZW5zaW9uLCB2YWx1ZSk7ICAgICAgIFwKLSAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBiYXNlX3NpemUgKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgc2l6ZW9mKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF8jI3R5cGUjI19leHRlbnNpb24pKTsgIFwKLSAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoaW50MzIgICAsIDEwMSk7Ci0gIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQ2NCAgICwgMTAyKTsKLSAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHVpbnQzMiAgLCAxMDMpOwotICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQodWludDY0ICAsIDEwNCk7Ci0gIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzaW50MzIgICwgMTA1KTsKLSAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNpbnQ2NCAgLCAxMDYpOwotICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoZml4ZWQzMiAsIDEwNyk7Ci0gIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDY0ICwgMTA4KTsKLSAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKHNmaXhlZDMyLCAxMDkpOwotICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoc2ZpeGVkNjQsIDExMCk7Ci0gIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmbG9hdCAgICwgMTExKTsKLSAgVEVTVF9TQ0FMQVJfRVhURU5TSU9OU19TUEFDRV9VU0VEKGRvdWJsZSAgLCAxMTIpOwotICBURVNUX1NDQUxBUl9FWFRFTlNJT05TX1NQQUNFX1VTRUQoYm9vbCAgICAsIHRydWUpOwotI3VuZGVmIFRFU1RfU0NBTEFSX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRAotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0gICAgY29uc3QgaW50IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7Ci0gICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOwotICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IGJhc2Vfc2l6ZSArCi0gICAgICAgIHNpemVvZihtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7Ci0gICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKTsKLSAgfQotICB7Ci0gICAgLy8gU3RyaW5ncyBtYXkgY2F1c2UgZXh0cmEgYWxsb2NhdGlvbnMgZGVwZW5kaW5nIG9uIHRoZWlyIGxlbmd0aDsgZW5zdXJlCi0gICAgLy8gdGhhdCBnZXRzIGluY2x1ZGVkIGFzIHdlbGwuCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0gICAgY29uc3QgaW50IGJhc2Vfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7Ci0gICAgY29uc3Qgc3RyaW5nIHMoInRoaXMgaXMgYSBmYWlybHkgbGFyZ2Ugc3RyaW5nIHRoYXQgd2lsbCBjYXVzZSBzb21lICIKLSAgICAgICAgICAgICAgICAgICAiYWxsb2NhdGlvbiBpbiBvcmRlciB0byBzdG9yZSBpdCBpbiB0aGUgZXh0ZW5zaW9uIik7Ci0gICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24sIHMpOwotICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IGJhc2Vfc2l6ZSArIHMubGVuZ3RoKCk7Ci0gICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKTsKLSAgfQotICB7Ci0gICAgLy8gTWVzc2FnZXMgYWxzbyBoYXZlIGFkZGl0aW9uYWwgYWxsb2NhdGlvbiB0aGF0IG5lZWQgdG8gYmUgY291bnRlZC4KLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsKLSAgICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UgZm9yZWlnbjsKLSAgICBmb3JlaWduLnNldF9jKDQyKTsKLSAgICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT4KLSAgICAgICAgQ29weUZyb20oZm9yZWlnbik7Ci0gICAgaW50IG1pbl9leHBlY3RlZF9zaXplID0gYmFzZV9zaXplICsgZm9yZWlnbi5TcGFjZVVzZWQoKTsKLSAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOwotICB9Ci0KLSAgLy8gUmVwZWF0ZWQgcHJpbWl0aXZlIGV4dGVuc2lvbnMgd2lsbCBpbmNyZWFzZSBzcGFjZSB1c2VkIGJ5IGF0IGxlYXN0IGEKLSAgLy8gUmVwZWF0ZWRGaWVsZDxUPiwgYW5kIHdpbGwgY2F1c2UgYWRkaXRpb25hbCBhbGxvY2F0aW9ucyB3aGVuIHRoZSBhcnJheQotICAvLyBnZXRzIHRvbyBiaWcgZm9yIHRoZSBpbml0aWFsIHNwYWNlLgotICAvLyBUaGlzIG1hY3JvOgotICAvLyAgIC0gQWRkcyBhIHZhbHVlIHRvIHRoZSByZXBlYXRlZCBleHRlbnNpb24sIHRoZW4gY2xlYXJzIGl0LCBlc3RhYmxpc2hpbmcKLSAgLy8gICAgIHRoZSBiYXNlIHNpemUuCi0gIC8vICAgLSBBZGRzIGEgc21hbGwgbnVtYmVyIG9mIHZhbHVlcywgdGVzdGluZyB0aGF0IGl0IGRvZXNuJ3QgaW5jcmVhc2UgdGhlCi0gIC8vICAgICBTcGFjZVVzZWQoKQotICAvLyAgIC0gQWRkcyBhIGxhcmdlIG51bWJlciBvZiB2YWx1ZXMgKHJlcXVpcmluZyBhbGxvY2F0aW9uIGluIHRoZSByZXBlYXRlZAotICAvLyAgICAgZmllbGQpLCBhbmQgZW5zdXJlcyB0aGF0IHRoYXQgYWxsb2NhdGlvbiBpcyBpbmNsdWRlZCBpbiBTcGFjZVVzZWQoKQotI2RlZmluZSBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRCh0eXBlLCBjcHB0eXBlLCB2YWx1ZSkgICAgICAgICAgICAgIFwKLSAgZG8geyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNvbnN0IGludCBiYXNlX3NpemUgPSBtZXNzYWdlLlNwYWNlVXNlZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBzaXplb2YoUmVwZWF0ZWRGaWVsZDxjcHB0eXBlPikgKyBiYXNlX3NpemU7ICAgICAgICBcCi0gICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbiwgdmFsdWUpOyAgICAgICAgXAotICAgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbik7ICAgICAgICAgICAgIFwKLSAgICBjb25zdCBpbnQgZW1wdHlfcmVwZWF0ZWRfZmllbGRfc2l6ZSA9IG1lc3NhZ2UuU3BhY2VVc2VkKCk7ICAgICAgICAgICAgICAgICBcCi0gICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBlbXB0eV9yZXBlYXRlZF9maWVsZF9zaXplKSA8PCAjdHlwZTsgICAgICAgICAgXAotICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICAgIFwKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uLCB2YWx1ZSk7ICAgICAgICBcCi0gICAgRVhQRUNUX0VRKGVtcHR5X3JlcGVhdGVkX2ZpZWxkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpIDw8ICN0eXBlOyAgICAgICAgXAotICAgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkXyMjdHlwZSMjX2V4dGVuc2lvbik7ICAgICAgICAgICAgIFwKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfIyN0eXBlIyNfZXh0ZW5zaW9uLCB2YWx1ZSk7ICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihjcHB0eXBlKSAqICgxNiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUpICsgZW1wdHlfcmVwZWF0ZWRfZmllbGRfc2l6ZTsgICAgICAgICAgXAotICAgIEVYUEVDVF9FUShleHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKSA8PCAjdHlwZTsgICAgICAgICAgICAgICAgICAgIFwKLSAgfSB3aGlsZSAoMCkKLQotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQzMiAgICwgaW50MzIgLCAxMDEpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChpbnQ2NCAgICwgaW50NjQgLCAxMDIpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRCh1aW50MzIgICwgdWludDMyLCAxMDMpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRCh1aW50NjQgICwgdWludDY0LCAxMDQpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzaW50MzIgICwgaW50MzIgLCAxMDUpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzaW50NjQgICwgaW50NjQgLCAxMDYpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDMyICwgdWludDMyLCAxMDcpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmaXhlZDY0ICwgdWludDY0LCAxMDgpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzZml4ZWQzMiwgaW50MzIgLCAxMDkpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChzZml4ZWQ2NCwgaW50NjQgLCAxMTApOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChmbG9hdCAgICwgZmxvYXQgLCAxMTEpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChkb3VibGUgICwgZG91YmxlLCAxMTIpOwotICBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRChib29sICAgICwgYm9vbCAgLCB0cnVlKTsKLSAgVEVTVF9SRVBFQVRFRF9FWFRFTlNJT05TX1NQQUNFX1VTRUQobmVzdGVkX2VudW0sIGludCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKLSN1bmRlZiBURVNUX1JFUEVBVEVEX0VYVEVOU0lPTlNfU1BBQ0VfVVNFRAotICAvLyBSZXBlYXRlZCBzdHJpbmdzCi0gIHsKLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgICBjb25zdCBpbnQgYmFzZV9zaXplID0gbWVzc2FnZS5TcGFjZVVzZWQoKTsKLSAgICBpbnQgbWluX2V4cGVjdGVkX3NpemUgPSBzaXplb2YoUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KSArIGJhc2Vfc2l6ZTsKLSAgICBjb25zdCBzdHJpbmcgdmFsdWUoMjU2LCAneCcpOwotICAgIC8vIE9uY2UgaXRlbXMgYXJlIGFsbG9jYXRlZCwgdGhleSBtYXkgc3RpY2sgYXJvdW5kIGV2ZW4gd2hlbiBjbGVhcmVkIHNvCi0gICAgLy8gd2l0aG91dCB0aGUgaGFyZGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYWNjZXNzb3JzIHRoZXJlIGlzbid0IGEgbm90aW9uIG9mCi0gICAgLy8gdGhlIGVtcHR5IHJlcGVhdGVkIGZpZWxkIG1lbW9yeSB1c2FnZSBhcyB0aGVyZSBpcyB3aXRoIHByaW1pdGl2ZSB0eXBlcy4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyArK2kpIHsKLSAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLCB2YWx1ZSk7Ci0gICAgfQotICAgIG1pbl9leHBlY3RlZF9zaXplICs9IChzaXplb2YodmFsdWUpICsgdmFsdWUuc2l6ZSgpKSAqCi0gICAgICAgICgxNiAtIGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUpOwotICAgIEVYUEVDVF9MRShtaW5fZXhwZWN0ZWRfc2l6ZSwgbWVzc2FnZS5TcGFjZVVzZWQoKSk7Ci0gIH0KLSAgLy8gUmVwZWF0ZWQgbWVzc2FnZXMKLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotICAgIGNvbnN0IGludCBiYXNlX3NpemUgPSBtZXNzYWdlLlNwYWNlVXNlZCgpOwotICAgIGludCBtaW5fZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihSZXBlYXRlZFB0ckZpZWxkPHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZT4pICsKLSAgICAgICAgYmFzZV9zaXplOwotICAgIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSBwcm90b3R5cGU7Ci0gICAgcHJvdG90eXBlLnNldF9jKDIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgewotICAgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT4KLSAgICAgICAgICBDb3B5RnJvbShwcm90b3R5cGUpOwotICAgIH0KLSAgICBtaW5fZXhwZWN0ZWRfc2l6ZSArPQotICAgICAgICAoMTYgLSBrTWluUmVwZWF0ZWRGaWVsZEFsbG9jYXRpb25TaXplKSAqIHByb3RvdHlwZS5TcGFjZVVzZWQoKTsKLSAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOwotICB9Ci19Ci0KLS8vIE4uQi46IFdlIGRvIG5vdCB0ZXN0IHJhbmdlLWJhc2VkIGZvciBoZXJlIGJlY2F1c2Ugd2UgcmVtYWluIEMrKzAzIGNvbXBhdGlibGUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBNLCB0eXBlbmFtZSBJRD4KLWlubGluZSBUIFN1bUFsbEV4dGVuc2lvbnMoY29uc3QgTSYgbWVzc2FnZSwgSUQgZXh0ZW5zaW9uLCBUIHplcm8pIHsKLSAgVCBzdW0gPSB6ZXJvOwotICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0KLSAgICAgIG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oZXh0ZW5zaW9uKS5iZWdpbigpOwotICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPQotICAgICAgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbihleHRlbnNpb24pLmVuZCgpOwotICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsraXRlcikgewotICAgIHN1bSArPSAqaXRlcjsKLSAgfQotICByZXR1cm4gc3VtOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBNLCB0eXBlbmFtZSBJRD4KLWlubGluZSB2b2lkIEluY0FsbEV4dGVuc2lvbnMoTSogbWVzc2FnZSwgSUQgZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICBUIHZhbCkgewotICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+OjppdGVyYXRvciBpdGVyID0KLSAgICAgIG1lc3NhZ2UtPk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbihleHRlbnNpb24pLT5iZWdpbigpOwotICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+OjppdGVyYXRvciBlbmQgID0KLSAgICAgIG1lc3NhZ2UtPk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbihleHRlbnNpb24pLT5lbmQoKTsKLSAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKLSAgICAqaXRlciArPSB2YWw7Ci0gIH0KLX0KLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBSZXBlYXRlZEZpZWxkcykgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLQotICAvLyBUZXN0IGVtcHR5IHJlcGVhdGVkLWZpZWxkIGNhc2UgKGIvMTI5MjYxNjMpCi0gIEFTU0VSVF9FUSgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKAotICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbikuc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKS5zaXplKCkpOwotICBBU1NFUlRfRVEoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKS5zaXplKCkpOwotICBBU1NFUlRfRVEoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLnNpemUoKSk7Ci0KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSBuZXN0ZWRfbWVzc2FnZTsKLSAgbmVzdGVkX21lc3NhZ2Uuc2V0X2JiKDQyKTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bSBuZXN0ZWRfZW51bSA9Ci0gICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAxKTsKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAyKTsKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMyk7Ci0gICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDQpOwotICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uLCA1KTsKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgNik7Ci0gICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCA3KTsKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24sIDgpOwotICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDcpOwotICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDgpOwotICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24sIDkuMCk7Ci0gICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDEwLjApOwotICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiwgdHJ1ZSk7Ci0gICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwgbmVzdGVkX2VudW0pOwotICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoInRlc3QiKSk7Ci0gICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJ0ZXN0XHhGRiIpKTsKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbigKLSAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiktPkNvcHlGcm9tKG5lc3RlZF9tZXNzYWdlKTsKLSAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZF9lbnVtKTsKLSAgfQotCi0gIEFTU0VSVF9FUSgxMCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMj4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAwKSk7Ci0gIEluY0FsbEV4dGVuc2lvbnM8aW50MzI+KAotICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDEpOwotICBBU1NFUlRfRVEoMjAsIFN1bUFsbEV4dGVuc2lvbnM8aW50MzI+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMCkpOwotCi0gIEFTU0VSVF9FUSgyMCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2ND4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAwKSk7Ci0gIEluY0FsbEV4dGVuc2lvbnM8aW50NjQ+KAotICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sIDEpOwotICBBU1NFUlRfRVEoMzAsIFN1bUFsbEV4dGVuc2lvbnM8aW50NjQ+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMCkpOwotCi0gIEFTU0VSVF9FUSgzMCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50MzI+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDApKTsKLSAgSW5jQWxsRXh0ZW5zaW9uczx1aW50MzI+KAotICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uLCAxKTsKLSAgQVNTRVJUX0VRKDQwLCBTdW1BbGxFeHRlbnNpb25zPHVpbnQzMj4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMCkpOwotCi0gIEFTU0VSVF9FUSg0MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50NjQ+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDApKTsKLSAgSW5jQWxsRXh0ZW5zaW9uczx1aW50NjQ+KAotICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uLCAxKTsKLSAgQVNTRVJUX0VRKDUwLCBTdW1BbGxFeHRlbnNpb25zPHVpbnQ2ND4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMCkpOwotCi0gIEFTU0VSVF9FUSg1MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMj4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMCkpOwotICBJbmNBbGxFeHRlbnNpb25zPGludDMyPigKLSAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMSk7Ci0gIEFTU0VSVF9FUSg2MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMj4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMCkpOwotCi0gIEFTU0VSVF9FUSg2MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2ND4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMCkpOwotICBJbmNBbGxFeHRlbnNpb25zPGludDY0PigKLSAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMSk7Ci0gIEFTU0VSVF9FUSg3MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2ND4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMCkpOwotCi0gIEFTU0VSVF9FUSg3MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50MzI+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7Ci0gIEluY0FsbEV4dGVuc2lvbnM8dWludDMyPigKLSAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDEpOwotICBBU1NFUlRfRVEoODAsIFN1bUFsbEV4dGVuc2lvbnM8dWludDMyPigKLSAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiwgMCkpOwotCi0gIEFTU0VSVF9FUSg4MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50NjQ+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7Ci0gIEluY0FsbEV4dGVuc2lvbnM8dWludDY0PigKLSAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24sIDEpOwotICBBU1NFUlRfRVEoOTAsIFN1bUFsbEV4dGVuc2lvbnM8dWludDY0PigKLSAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiwgMCkpOwotCi0gIC8vIFVzdWFsbHksIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMgY2Fubm90IGJlIHRydXN0ZWQgdG8gYmUgZXhhY3QsIHNvIGl0IGlzCi0gIC8vIGEgQmFkIElkZWEgdG8gYXNzZXJ0IGVxdWFsaXR5IGluIGEgdGVzdCBsaWtlIHRoaXMuIEhvd2V2ZXIsIHdlJ3JlIGRlYWxpbmcKLSAgLy8gd2l0aCBpbnRlZ2VycyB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIHNpZ25pZmljYW50IG1hbnRpc3NhIGJpdHMsIHNvIHdlCi0gIC8vIHNob3VsZCBhY3R1YWxseSBoYXZlIGV4YWN0IHByZWNpc2lvbiBoZXJlLgotICBBU1NFUlRfRVEoOTAsIFN1bUFsbEV4dGVuc2lvbnM8ZmxvYXQ+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiwgMCkpOwotICBJbmNBbGxFeHRlbnNpb25zPGZsb2F0PigKLSAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAxKTsKLSAgQVNTRVJUX0VRKDEwMCwgU3VtQWxsRXh0ZW5zaW9uczxmbG9hdD4oCi0gICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAwKSk7Ci0KLSAgQVNTRVJUX0VRKDEwMCwgU3VtQWxsRXh0ZW5zaW9uczxkb3VibGU+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDApKTsKLSAgSW5jQWxsRXh0ZW5zaW9uczxkb3VibGU+KAotICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uLCAxKTsKLSAgQVNTRVJUX0VRKDExMCwgU3VtQWxsRXh0ZW5zaW9uczxkb3VibGU+KAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDApKTsKLQotICBSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPjo6aXRlcmF0b3Igc3RyaW5nX2l0ZXI7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+OjppdGVyYXRvciBzdHJpbmdfZW5kOwotICBmb3IgKHN0cmluZ19pdGVyID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pLT5iZWdpbigpLAotICAgICAgIHN0cmluZ19lbmQgID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKS0+ZW5kKCk7Ci0gICAgICAgc3RyaW5nX2l0ZXIgIT0gc3RyaW5nX2VuZDsgKytzdHJpbmdfaXRlcikgewotICAgICpzdHJpbmdfaXRlciArPSAidGVzdCI7Ci0gIH0KLSAgUmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19jb25zdF9pdGVyOwotICBSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc3RyaW5nX2NvbnN0X2VuZDsKLSAgZm9yIChzdHJpbmdfY29uc3RfaXRlciA9IG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKS5iZWdpbigpLAotICAgICAgIHN0cmluZ19jb25zdF9lbmQgID0gbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pLmVuZCgpOwotICAgICAgIHN0cmluZ19pdGVyICE9IHN0cmluZ19lbmQ7ICsrc3RyaW5nX2l0ZXIpIHsKLSAgICBBU1NFUlRfVFJVRSgqc3RyaW5nX2l0ZXIgPT0gInRlc3R0ZXN0Iik7Ci0gIH0KLQotICBSZXBlYXRlZEZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkRW51bT46Oml0ZXJhdG9yIGVudW1faXRlcjsKLSAgUmVwZWF0ZWRGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZEVudW0+OjppdGVyYXRvciBlbnVtX2VuZDsKLSAgZm9yIChlbnVtX2l0ZXIgPSBtZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiktPmJlZ2luKCksCi0gICAgICAgZW51bV9lbmQgID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24pLT5lbmQoKTsKLSAgICAgICBlbnVtX2l0ZXIgIT0gZW51bV9lbmQ7ICsrZW51bV9pdGVyKSB7Ci0gICAgKmVudW1faXRlciA9IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fTUFYOwotICB9Ci0gIFJlcGVhdGVkRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtPjo6Y29uc3RfaXRlcmF0b3IKLSAgICAgIGVudW1fY29uc3RfaXRlcjsKLSAgUmVwZWF0ZWRGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZEVudW0+Ojpjb25zdF9pdGVyYXRvcgotICAgICAgZW51bV9jb25zdF9lbmQ7Ci0gIGZvciAoZW51bV9jb25zdF9pdGVyID0gbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbikuYmVnaW4oKSwKLSAgICAgICBlbnVtX2NvbnN0X2VuZCAgPSBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKAotICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKS5lbmQoKTsKLSAgICAgICBlbnVtX2l0ZXIgIT0gZW51bV9lbmQ7ICsrZW51bV9pdGVyKSB7Ci0gICAgQVNTRVJUX0VRKCplbnVtX2NvbnN0X2l0ZXIsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fTUFYKTsKLSAgfQotCi0gIFJlcGVhdGVkUHRyRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlPjo6aXRlcmF0b3IKLSAgICAgIG1zZ19pdGVyOwotICBSZXBlYXRlZFB0ckZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZT46Oml0ZXJhdG9yCi0gICAgICBtc2dfZW5kOwotICBmb3IgKG1zZ19pdGVyID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLT5iZWdpbigpLAotICAgICAgIG1zZ19lbmQgID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLT5lbmQoKTsKLSAgICAgICBtc2dfaXRlciAhPSBtc2dfZW5kOyArK21zZ19pdGVyKSB7Ci0gICAgbXNnX2l0ZXItPnNldF9iYigxMjM0KTsKLSAgfQotICBSZXBlYXRlZFB0ckZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZT46OgotICAgICAgY29uc3RfaXRlcmF0b3IgbXNnX2NvbnN0X2l0ZXI7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlPjo6Ci0gICAgICBjb25zdF9pdGVyYXRvciBtc2dfY29uc3RfZW5kOwotICBmb3IgKG1zZ19jb25zdF9pdGVyID0gbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikuYmVnaW4oKSwKLSAgICAgICBtc2dfY29uc3RfZW5kICA9IG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLmVuZCgpOwotICAgICAgIG1zZ19jb25zdF9pdGVyICE9IG1zZ19jb25zdF9lbmQ7ICsrbXNnX2NvbnN0X2l0ZXIpIHsKLSAgICBBU1NFUlRfRVEobXNnX2NvbnN0X2l0ZXItPmJiKCksIDEyMzQpOwotICB9Ci0KLSAgLy8gVGVzdCByYW5nZS1iYXNlZCBmb3IgYXMgd2VsbCwgYnV0IG9ubHkgaWYgY29tcGlsZWQgYXMgQysrMTEuCi0jaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAotICAvLyBUZXN0IG9uZSBwcmltaXRpdmUgZmllbGQuCi0gIGZvciAoYXV0byYgeCA6ICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKSkgewotICAgIHggPSA0MzIxOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgeCA6IG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbikpIHsKLSAgICBBU1NFUlRfRVEoeCwgNDMyMSk7Ci0gIH0KLSAgLy8gVGVzdCBvbmUgc3RyaW5nIGZpZWxkLgotICBmb3IgKGF1dG8mIHggOiAqbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pKSB7Ci0gICAgeCA9ICJ0ZXN0X3JhbmdlX2Jhc2VkX2ZvciI7Ci0gIH0KLSAgZm9yIChjb25zdCBhdXRvJiB4IDogbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbikpIHsKLSAgICBBU1NFUlRfVFJVRSh4ID09ICJ0ZXN0X3JhbmdlX2Jhc2VkX2ZvciIpOwotICB9Ci0gIC8vIFRlc3Qgb25lIG1lc3NhZ2UgZmllbGQuCi0gIGZvciAoYXV0byYgeCA6ICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSkgewotICAgIHguc2V0X2JiKDQzMjEpOwotICB9Ci0gIGZvciAoY29uc3QgYXV0byYgeCA6ICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSkgewotICAgIEFTU0VSVF9FUSh4LmJiKCksIDQzMjEpOwotICB9Ci0jZW5kaWYKLX0KLQotLy8gRnJvbSBiLzEyOTI2MTYzCi1URVNUKEV4dGVuc2lvblNldFRlc3QsIEFic2VudEV4dGVuc2lvbikgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKLSAgICAgIC0+QWRkKCktPnNldF9iYigxMjMpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKAotICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoCi0gICAgICAxMjMsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKAotICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApLmJiKCkpOwotfQotCi0jaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBJbnZhbGlkRW51bURlYXRoKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotICBFWFBFQ1RfREVCVUdfREVBVEgoCi0gICAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5pdHRlc3Q6OkZvcmVpZ25FbnVtPig1MykpLAotICAgICJJc1ZhbGlkIik7Ci19Ci0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLQotVEVTVChFeHRlbnNpb25TZXRUZXN0LCBEeW5hbWljRXh0ZW5zaW9ucykgewotICAvLyBUZXN0IGFkZGluZyBhIGR5bmFtaWMgZXh0ZW5zaW9uIHRvIGEgY29tcGlsZWQtaW4gbWVzc2FnZSBvYmplY3QuCi0KLSAgRmlsZURlc2NyaXB0b3JQcm90byBkeW5hbWljX3Byb3RvOwotICBkeW5hbWljX3Byb3RvLnNldF9uYW1lKCJkeW5hbWljX2V4dGVuc2lvbnNfdGVzdC5wcm90byIpOwotICBkeW5hbWljX3Byb3RvLmFkZF9kZXBlbmRlbmN5KAotICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+bmFtZSgpKTsKLSAgZHluYW1pY19wcm90by5zZXRfcGFja2FnZSgiZHluYW1pY19leHRlbnNpb25zIik7Ci0KLSAgLy8gQ29weSB0aGUgZmllbGRzIGFuZCBuZXN0ZWQgdHlwZXMgZnJvbSBUZXN0RHluYW1pY0V4dGVuc2lvbnMgaW50byBvdXIgbmV3Ci0gIC8vIHByb3RvLCBjb252ZXJ0aW5nIHRoZSBmaWVsZHMgaW50byBleHRlbnNpb25zLgotICBjb25zdCBEZXNjcmlwdG9yKiB0ZW1wbGF0ZV9kZXNjcmlwdG9yID0KLSAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKTsKLSAgRGVzY3JpcHRvclByb3RvIHRlbXBsYXRlX2Rlc2NyaXB0b3JfcHJvdG87Ci0gIHRlbXBsYXRlX2Rlc2NyaXB0b3ItPkNvcHlUbygmdGVtcGxhdGVfZGVzY3JpcHRvcl9wcm90byk7Ci0gIGR5bmFtaWNfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+TWVyZ2VGcm9tKAotICAgICAgdGVtcGxhdGVfZGVzY3JpcHRvcl9wcm90by5uZXN0ZWRfdHlwZSgpKTsKLSAgZHluYW1pY19wcm90by5tdXRhYmxlX2VudW1fdHlwZSgpLT5NZXJnZUZyb20oCi0gICAgICB0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvLmVudW1fdHlwZSgpKTsKLSAgZHluYW1pY19wcm90by5tdXRhYmxlX2V4dGVuc2lvbigpLT5NZXJnZUZyb20oCi0gICAgICB0ZW1wbGF0ZV9kZXNjcmlwdG9yX3Byb3RvLmZpZWxkKCkpOwotCi0gIC8vIEZvciBlYWNoIGV4dGVuc2lvbiB0aGF0IHdlIGFkZGVkLi4uCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZHluYW1pY19wcm90by5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKLSAgICAvLyBTZXQgaXRzIGV4dGVuZGVlIHRvIFRlc3RBbGxFeHRlbnNpb25zLgotICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBleHRlbnNpb24gPSBkeW5hbWljX3Byb3RvLm11dGFibGVfZXh0ZW5zaW9uKGkpOwotICAgIGV4dGVuc2lvbi0+c2V0X2V4dGVuZGVlKAotICAgICAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpOwotCi0gICAgLy8gSWYgdGhlIGZpZWxkIHJlZmVycyB0byBvbmUgb2YgdGhlIHR5cGVzIG5lc3RlZCBpbiBUZXN0RHluYW1pY0V4dGVuc2lvbnMsCi0gICAgLy8gbWFrZSBpdCByZWZlciB0byB0aGUgdHlwZSBpbiBvdXIgZHluYW1pYyBwcm90byBpbnN0ZWFkLgotICAgIHN0cmluZyBwcmVmaXggPSAiLiIgKyB0ZW1wbGF0ZV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICIuIjsKLSAgICBpZiAoZXh0ZW5zaW9uLT5oYXNfdHlwZV9uYW1lKCkpIHsKLSAgICAgIHN0cmluZyogdHlwZV9uYW1lID0gZXh0ZW5zaW9uLT5tdXRhYmxlX3R5cGVfbmFtZSgpOwotICAgICAgaWYgKEhhc1ByZWZpeFN0cmluZygqdHlwZV9uYW1lLCBwcmVmaXgpKSB7Ci0gICAgICAgIHR5cGVfbmFtZS0+cmVwbGFjZSgwLCBwcmVmaXguc2l6ZSgpLCAiLmR5bmFtaWNfZXh0ZW5zaW9ucy4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgYnVpbGQgdGhlIGZpbGUsIHVzaW5nIHRoZSBnZW5lcmF0ZWQgcG9vbCBhcyBhbiB1bmRlcmxheS4KLSAgRGVzY3JpcHRvclBvb2wgZHluYW1pY19wb29sKERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKTsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBkeW5hbWljX3Bvb2wuQnVpbGRGaWxlKGR5bmFtaWNfcHJvdG8pOwotICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOwotICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZHluYW1pY19mYWN0b3J5KCZkeW5hbWljX3Bvb2wpOwotICBkeW5hbWljX2ZhY3RvcnkuU2V0RGVsZWdhdGVUb0dlbmVyYXRlZEZhY3RvcnkodHJ1ZSk7Ci0KLSAgLy8gQ29uc3RydWN0IGEgbWVzc2FnZSB0aGF0IHdlIGNhbiBwYXJzZSB3aXRoIHRoZSBleHRlbnNpb25zIHdlIGRlZmluZWQuCi0gIC8vIFNpbmNlIHRoZSBleHRlbnNpb25zIHdlcmUgYmFzZWQgb2ZmIG9mIHRoZSBmaWVsZHMgb2YgVGVzdER5bmFtaWNFeHRlbnNpb25zLAotICAvLyB3ZSBjYW4gdXNlIHRoYXQgbWVzc2FnZSB0byBjcmVhdGUgdGhpcyB0ZXN0IG1lc3NhZ2UuCi0gIHN0cmluZyBkYXRhOwotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3REeW5hbWljRXh0ZW5zaW9ucyBtZXNzYWdlOwotICAgIG1lc3NhZ2Uuc2V0X3NjYWxhcl9leHRlbnNpb24oMTIzKTsKLSAgICBtZXNzYWdlLnNldF9lbnVtX2V4dGVuc2lvbih1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOwotICAgIG1lc3NhZ2Uuc2V0X2R5bmFtaWNfZW51bV9leHRlbnNpb24oCi0gICAgICAgIHVuaXR0ZXN0OjpUZXN0RHluYW1pY0V4dGVuc2lvbnM6OkRZTkFNSUNfQkFaKTsKLSAgICBtZXNzYWdlLm11dGFibGVfbWVzc2FnZV9leHRlbnNpb24oKS0+c2V0X2MoNDU2KTsKLSAgICBtZXNzYWdlLm11dGFibGVfZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbigpLT5zZXRfZHluYW1pY19maWVsZCg3ODkpOwotICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2V4dGVuc2lvbigiZm9vIik7Ci0gICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZXh0ZW5zaW9uKCJiYXIiKTsKLSAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKDEyKTsKLSAgICBtZXNzYWdlLmFkZF9wYWNrZWRfZXh0ZW5zaW9uKC0zNCk7Ci0gICAgbWVzc2FnZS5hZGRfcGFja2VkX2V4dGVuc2lvbig1Nik7Ci0gICAgbWVzc2FnZS5hZGRfcGFja2VkX2V4dGVuc2lvbigtNzgpOwotCi0gICAgLy8gQWxzbyBhZGQgc29tZSB1bmtub3duIGZpZWxkcy4KLQotICAgIC8vIEFuIHVua25vd24gZW51bSB2YWx1ZSAoZm9yIGEga25vd24gZmllbGQpLgotICAgIG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoCi0gICAgICB1bml0dGVzdDo6VGVzdER5bmFtaWNFeHRlbnNpb25zOjprRHluYW1pY0VudW1FeHRlbnNpb25GaWVsZE51bWJlciwKLSAgICAgIDEyMzQ1KTsKLSAgICAvLyBBIHJlZ3VsYXIgdW5rbm93biBmaWVsZC4KLSAgICBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkTGVuZ3RoRGVsaW1pdGVkKDU0MzIxLCAidW5rbm93biIpOwotCi0gICAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7Ci0gIH0KLQotICAvLyBOb3cgd2UgY2FuIHBhcnNlIHRoaXMgdXNpbmcgb3VyIGR5bmFtaWMgZXh0ZW5zaW9uIGRlZmluaXRpb25zLi4uCi0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotICB7Ci0gICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7Ci0gICAgaW5wdXQuU2V0RXh0ZW5zaW9uUmVnaXN0cnkoJmR5bmFtaWNfcG9vbCwgJmR5bmFtaWNfZmFjdG9yeSk7Ci0gICAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKLSAgICBBU1NFUlRfVFJVRShpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7Ci0gIH0KLQotICAvLyBDYW4gd2UgcHJpbnQgaXQ/Ci0gIEVYUEVDVF9FUSgKLSAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5zY2FsYXJfZXh0ZW5zaW9uXTogMTIzXG4iCi0gICAgIltkeW5hbWljX2V4dGVuc2lvbnMuZW51bV9leHRlbnNpb25dOiBGT1JFSUdOX0JBUlxuIgotICAgICJbZHluYW1pY19leHRlbnNpb25zLmR5bmFtaWNfZW51bV9leHRlbnNpb25dOiBEWU5BTUlDX0JBWlxuIgotICAgICJbZHluYW1pY19leHRlbnNpb25zLm1lc3NhZ2VfZXh0ZW5zaW9uXSB7XG4iCi0gICAgIiAgYzogNDU2XG4iCi0gICAgIn1cbiIKLSAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5keW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uXSB7XG4iCi0gICAgIiAgZHluYW1pY19maWVsZDogNzg5XG4iCi0gICAgIn1cbiIKLSAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5yZXBlYXRlZF9leHRlbnNpb25dOiBcImZvb1wiXG4iCi0gICAgIltkeW5hbWljX2V4dGVuc2lvbnMucmVwZWF0ZWRfZXh0ZW5zaW9uXTogXCJiYXJcIlxuIgotICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiAxMlxuIgotICAgICJbZHluYW1pY19leHRlbnNpb25zLnBhY2tlZF9leHRlbnNpb25dOiAtMzRcbiIKLSAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5wYWNrZWRfZXh0ZW5zaW9uXTogNTZcbiIKLSAgICAiW2R5bmFtaWNfZXh0ZW5zaW9ucy5wYWNrZWRfZXh0ZW5zaW9uXTogLTc4XG4iCi0gICAgIjIwMDI6IDEyMzQ1XG4iCi0gICAgIjU0MzIxOiBcInVua25vd25cIlxuIiwKLSAgICBtZXNzYWdlLkRlYnVnU3RyaW5nKCkpOwotCi0gIC8vIENhbiB3ZSBzZXJpYWxpemUgaXQ/Ci0gIC8vIChEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0byB0aGUKLSAgLy8gdGVybWluYWwgb24gZmFpbHVyZS4pCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKSA9PSBkYXRhKTsKLQotICAvLyBXaGF0IGlmIHdlIHBhcnNlIHVzaW5nIHRoZSByZWZsZWN0aW9uLWJhc2VkIHBhcnNlcj8KLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMjsKLSAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKLSAgICBpbnB1dC5TZXRFeHRlbnNpb25SZWdpc3RyeSgmZHluYW1pY19wb29sLCAmZHluYW1pY19mYWN0b3J5KTsKLSAgICBBU1NFUlRfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZtZXNzYWdlMikpOwotICAgIEFTU0VSVF9UUlVFKGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKLSAgICBFWFBFQ1RfRVEobWVzc2FnZS5EZWJ1Z1N0cmluZygpLCBtZXNzYWdlMi5EZWJ1Z1N0cmluZygpKTsKLSAgfQotCi0gIC8vIEFyZSB0aGUgZW1iZWRkZWQgZ2VuZXJhdGVkIHR5cGVzIGFjdHVhbGx5IHVzaW5nIHRoZSBnZW5lcmF0ZWQgb2JqZWN0cz8KLSAgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbWVzc2FnZV9leHRlbnNpb24gPQotICAgICAgICBmaWxlLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJtZXNzYWdlX2V4dGVuc2lvbiIpOwotICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2VfZXh0ZW5zaW9uICE9IE5VTEwpOwotICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KLSAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2UobWVzc2FnZSwgbWVzc2FnZV9leHRlbnNpb24pOwotICAgIGNvbnN0IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogdHlwZWRfc3ViX21lc3NhZ2UgPQotI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJCi0gICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSo+KCZzdWJfbWVzc2FnZSk7Ci0jZWxzZQotICAgICAgICBkeW5hbWljX2Nhc3Q8Y29uc3QgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKLSNlbmRpZgotICAgIEFTU0VSVF9UUlVFKHR5cGVkX3N1Yl9tZXNzYWdlICE9IE5VTEwpOwotICAgIEVYUEVDVF9FUSg0NTYsIHR5cGVkX3N1Yl9tZXNzYWdlLT5jKCkpOwotICB9Ci0KLSAgLy8gV2hhdCBkb2VzIEdldE1lc3NhZ2UoKSByZXR1cm4gZm9yIHRoZSBlbWJlZGRlZCBkeW5hbWljIHR5cGUgaWYgaXQgaXNuJ3QKLSAgLy8gcHJlc2VudD8KLSAgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZHluYW1pY19tZXNzYWdlX2V4dGVuc2lvbiA9Ci0gICAgICAgIGZpbGUtPkZpbmRFeHRlbnNpb25CeU5hbWUoImR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24iKTsKLSAgICBBU1NFUlRfVFJVRShkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uICE9IE5VTEwpOwotICAgIGNvbnN0IE1lc3NhZ2UmIHBhcmVudCA9IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpOwotICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KLSAgICAgICAgcGFyZW50LkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZShwYXJlbnQsIGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmR5bmFtaWNfZmFjdG9yeSk7Ci0gICAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlID0KLSAgICAgICAgZHluYW1pY19mYWN0b3J5LkdldFByb3RvdHlwZShkeW5hbWljX21lc3NhZ2VfZXh0ZW5zaW9uLT5tZXNzYWdlX3R5cGUoKSk7Ci0gICAgRVhQRUNUX0VRKHByb3RvdHlwZSwgJnN1Yl9tZXNzYWdlKTsKLSAgfQotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDIzMTMxODEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjMxOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8c2V0PgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLQotCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfT05FT0YKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotbmFtZXNwYWNlIHsKLWJvb2wgSXNNYXBGaWVsZEluQXBpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgcmV0dXJuIGZpZWxkLT5pc19tYXAoKTsKLX0KLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKLQotYm9vbCBQYXJzZU5hbWVkRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbHVlKSB7Ci0gIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGQgPSBkZXNjcmlwdG9yLT5GaW5kVmFsdWVCeU5hbWUobmFtZSk7Ci0gIGlmIChkID09IE5VTEwpIHJldHVybiBmYWxzZTsKLSAgKnZhbHVlID0gZC0+bnVtYmVyKCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1jb25zdCBzdHJpbmcmIE5hbWVPZkVudW0oY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCB2YWx1ZSkgewotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkID0gZGVzY3JpcHRvci0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICByZXR1cm4gKGQgPT0gTlVMTCA/IEdldEVtcHR5U3RyaW5nKCkgOiBkLT5uYW1lKCkpOwotfQotCi1uYW1lc3BhY2UgewotaW5saW5lIGJvb2wgU3VwcG9ydHNBcmVuYXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkuY2NfZW5hYmxlX2FyZW5hcygpOwotfQotfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBIZWxwZXJzIGZvciByZXBvcnRpbmcgdXNhZ2UgZXJyb3JzIChlLmcuIHRyeWluZyB0byB1c2UgR2V0SW50MzIoKSBvbgotLy8gYSBzdHJpbmcgZmllbGQpLgotCi1uYW1lc3BhY2UgewotCi12b2lkIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZUVycm9yKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgY29uc3QgY2hhciogbWV0aG9kLCBjb25zdCBjaGFyKiBkZXNjcmlwdGlvbikgewotICBHT09HTEVfTE9HKEZBVEFMKQotICAgIDw8ICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKLSAgICAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246OiIgPDwgbWV0aG9kIDw8ICJcbiIKLSAgICAgICAiICBNZXNzYWdlIHR5cGU6ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIlxuIgotICAgICAgICIgIEZpZWxkICAgICAgIDogIiA8PCBmaWVsZC0+ZnVsbF9uYW1lKCkgPDwgIlxuIgotICAgICAgICIgIFByb2JsZW0gICAgIDogIiA8PCBkZXNjcmlwdGlvbjsKLX0KLQotY29uc3QgY2hhciogY3BwdHlwZV9uYW1lc19bRmllbGREZXNjcmlwdG9yOjpNQVhfQ1BQVFlQRSArIDFdID0gewotICAiSU5WQUxJRF9DUFBUWVBFIiwKLSAgIkNQUFRZUEVfSU5UMzIiLAotICAiQ1BQVFlQRV9JTlQ2NCIsCi0gICJDUFBUWVBFX1VJTlQzMiIsCi0gICJDUFBUWVBFX1VJTlQ2NCIsCi0gICJDUFBUWVBFX0RPVUJMRSIsCi0gICJDUFBUWVBFX0ZMT0FUIiwKLSAgIkNQUFRZUEVfQk9PTCIsCi0gICJDUFBUWVBFX0VOVU0iLAotICAiQ1BQVFlQRV9TVFJJTkciLAotICAiQ1BQVFlQRV9NRVNTQUdFIgotfTsKLQotc3RhdGljIHZvaWQgUmVwb3J0UmVmbGVjdGlvblVzYWdlVHlwZUVycm9yKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgY29uc3QgY2hhciogbWV0aG9kLAotICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBleHBlY3RlZF90eXBlKSB7Ci0gIEdPT0dMRV9MT0coRkFUQUwpCi0gICAgPDwgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgotICAgICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6IiA8PCBtZXRob2QgPDwgIlxuIgotICAgICAgICIgIE1lc3NhZ2UgdHlwZTogIiA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSA8PCAiXG4iCi0gICAgICAgIiAgRmllbGQgICAgICAgOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKSA8PCAiXG4iCi0gICAgICAgIiAgUHJvYmxlbSAgICAgOiBGaWVsZCBpcyBub3QgdGhlIHJpZ2h0IHR5cGUgZm9yIHRoaXMgbWVzc2FnZTpcbiIKLSAgICAgICAiICAgIEV4cGVjdGVkICA6ICIgPDwgY3BwdHlwZV9uYW1lc19bZXhwZWN0ZWRfdHlwZV0gPDwgIlxuIgotICAgICAgICIgICAgRmllbGQgdHlwZTogIiA8PCBjcHB0eXBlX25hbWVzX1tmaWVsZC0+Y3BwX3R5cGUoKV07Ci19Ci0KLXN0YXRpYyB2b2lkIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZUVudW1UeXBlRXJyb3IoCi0gICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBjb25zdCBjaGFyKiBtZXRob2QsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSB7Ci0gIEdPT0dMRV9MT0coRkFUQUwpCi0gICAgPDwgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgotICAgICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6IiA8PCBtZXRob2QgPDwgIlxuIgotICAgICAgICIgIE1lc3NhZ2UgdHlwZTogIiA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSA8PCAiXG4iCi0gICAgICAgIiAgRmllbGQgICAgICAgOiAiIDw8IGZpZWxkLT5mdWxsX25hbWUoKSA8PCAiXG4iCi0gICAgICAgIiAgUHJvYmxlbSAgICAgOiBFbnVtIHZhbHVlIGRpZCBub3QgbWF0Y2ggZmllbGQgdHlwZTpcbiIKLSAgICAgICAiICAgIEV4cGVjdGVkICA6ICIgPDwgZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSA8PCAiXG4iCi0gICAgICAgIiAgICBBY3R1YWwgICAgOiAiIDw8IHZhbHVlLT5mdWxsX25hbWUoKTsKLX0KLQotI2RlZmluZSBVU0FHRV9DSEVDSyhDT05ESVRJT04sIE1FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaWYgKCEoQ09ORElUSU9OKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUmVwb3J0UmVmbGVjdGlvblVzYWdlRXJyb3IoZGVzY3JpcHRvcl8sIGZpZWxkLCAjTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikKLSNkZWZpbmUgVVNBR0VfQ0hFQ0tfRVEoQSwgQiwgTUVUSE9ELCBFUlJPUl9ERVNDUklQVElPTikgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVTQUdFX0NIRUNLKChBKSA9PSAoQiksIE1FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pCi0jZGVmaW5lIFVTQUdFX0NIRUNLX05FKEEsIEIsIE1FVEhPRCwgRVJST1JfREVTQ1JJUFRJT04pICAgICAgICAgICAgICAgICAgICAgICAgXAotICBVU0FHRV9DSEVDSygoQSkgIT0gKEIpLCBNRVRIT0QsIEVSUk9SX0RFU0NSSVBUSU9OKQotCi0jZGVmaW5lIFVTQUdFX0NIRUNLX1RZUEUoTUVUSE9ELCBDUFBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpZiAoZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRSkgICAgICAgICAgICAgICAgIFwKLSAgICBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VUeXBlRXJyb3IoZGVzY3JpcHRvcl8sIGZpZWxkLCAjTUVUSE9ELCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEUpCi0KLSNkZWZpbmUgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGlmICh2YWx1ZS0+dHlwZSgpICE9IGZpZWxkLT5lbnVtX3R5cGUoKSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZUVudW1UeXBlRXJyb3IoZGVzY3JpcHRvcl8sIGZpZWxkLCAjTUVUSE9ELCB2YWx1ZSkKLQotI2RlZmluZSBVU0FHRV9DSEVDS19NRVNTQUdFX1RZUEUoTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVNBR0VfQ0hFQ0tfRVEoZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBkZXNjcmlwdG9yXywgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgIE1FVEhPRCwgIkZpZWxkIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKLSNkZWZpbmUgVVNBR0VfQ0hFQ0tfU0lOR1VMQVIoTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFVTQUdFX0NIRUNLX05FKGZpZWxkLT5sYWJlbCgpLCBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVELCBNRVRIT0QsICAgICAgXAotICAgICAgICAgICAgICAgICAiRmllbGQgaXMgcmVwZWF0ZWQ7IHRoZSBtZXRob2QgcmVxdWlyZXMgYSBzaW5ndWxhciBmaWVsZC4iKQotI2RlZmluZSBVU0FHRV9DSEVDS19SRVBFQVRFRChNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVVNBR0VfQ0hFQ0tfRVEoZmllbGQtPmxhYmVsKCksIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQsIE1FVEhPRCwgICAgICBcCi0gICAgICAgICAgICAgICAgICJGaWVsZCBpcyBzaW5ndWxhcjsgdGhlIG1ldGhvZCByZXF1aXJlcyBhIHJlcGVhdGVkIGZpZWxkLiIpCi0KLSNkZWZpbmUgVVNBR0VfQ0hFQ0tfQUxMKE1FVEhPRCwgTEFCRUwsIENQUFRZUEUpICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKE1FVEhPRCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVTQUdFX0NIRUNLXyMjTEFCRUwoTUVUSE9EKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBVU0FHRV9DSEVDS19UWVBFKE1FVEhPRCwgQ1BQVFlQRSkKLQotfSAgLy8gbmFtZXNwYWNlCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9pbnN0YW5jZSwKLSAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAotICAgIGludCBoYXNfYml0c19vZmZzZXQsCi0gICAgaW50IHVua25vd25fZmllbGRzX29mZnNldCwKLSAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQsCi0gICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIGRlc2NyaXB0b3JfcG9vbCwKLSAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSwKLSAgICBpbnQgb2JqZWN0X3NpemUsCi0gICAgaW50IGFyZW5hX29mZnNldCwKLSAgICBpbnQgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpCi0gIDogZGVzY3JpcHRvcl8gICAgICAgKGRlc2NyaXB0b3IpLAotICAgIGRlZmF1bHRfaW5zdGFuY2VfIChkZWZhdWx0X2luc3RhbmNlKSwKLSAgICBvZmZzZXRzXyAgICAgICAgICAob2Zmc2V0cyksCi0gICAgaGFzX2JpdHNfb2Zmc2V0XyAgKGhhc19iaXRzX29mZnNldCksCi0gICAgdW5rbm93bl9maWVsZHNfb2Zmc2V0Xyh1bmtub3duX2ZpZWxkc19vZmZzZXQpLAotICAgIGV4dGVuc2lvbnNfb2Zmc2V0XyhleHRlbnNpb25zX29mZnNldCksCi0gICAgYXJlbmFfb2Zmc2V0XyAgICAgKGFyZW5hX29mZnNldCksCi0gICAgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXRfKGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0KSwKLSAgICBvYmplY3Rfc2l6ZV8gICAgICAob2JqZWN0X3NpemUpLAotICAgIGRlc2NyaXB0b3JfcG9vbF8gICgoZGVzY3JpcHRvcl9wb29sID09IE5VTEwpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSA6Ci0gICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sKSwKLSAgICBtZXNzYWdlX2ZhY3RvcnlfICAoZmFjdG9yeSkgewotfQotCi1HZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCi0gICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlLAotICAgIGNvbnN0IGludCBvZmZzZXRzW10sCi0gICAgaW50IGhhc19iaXRzX29mZnNldCwKLSAgICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0LAotICAgIGludCBleHRlbnNpb25zX29mZnNldCwKLSAgICBjb25zdCB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlLAotICAgIGludCBvbmVvZl9jYXNlX29mZnNldCwKLSAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogZGVzY3JpcHRvcl9wb29sLAotICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAotICAgIGludCBvYmplY3Rfc2l6ZSwKLSAgICBpbnQgYXJlbmFfb2Zmc2V0LAotICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCkKLSAgOiBkZXNjcmlwdG9yXyAgICAgICAoZGVzY3JpcHRvciksCi0gICAgZGVmYXVsdF9pbnN0YW5jZV8gKGRlZmF1bHRfaW5zdGFuY2UpLAotICAgIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2VfIChkZWZhdWx0X29uZW9mX2luc3RhbmNlKSwKLSAgICBvZmZzZXRzXyAgICAgICAgICAob2Zmc2V0cyksCi0gICAgaGFzX2JpdHNfb2Zmc2V0XyAgKGhhc19iaXRzX29mZnNldCksCi0gICAgb25lb2ZfY2FzZV9vZmZzZXRfKG9uZW9mX2Nhc2Vfb2Zmc2V0KSwKLSAgICB1bmtub3duX2ZpZWxkc19vZmZzZXRfKHVua25vd25fZmllbGRzX29mZnNldCksCi0gICAgZXh0ZW5zaW9uc19vZmZzZXRfKGV4dGVuc2lvbnNfb2Zmc2V0KSwKLSAgICBhcmVuYV9vZmZzZXRfICAgICAoYXJlbmFfb2Zmc2V0KSwKLSAgICBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldF8oaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpLAotICAgIG9iamVjdF9zaXplXyAgICAgIChvYmplY3Rfc2l6ZSksCi0gICAgZGVzY3JpcHRvcl9wb29sXyAgKChkZXNjcmlwdG9yX3Bvb2wgPT0gTlVMTCkgPwotICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpIDoKLSAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3Bvb2wpLAotICAgIG1lc3NhZ2VfZmFjdG9yeV8gIChmYWN0b3J5KSB7Ci19Ci0KLUdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjp+R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oKSB7fQotCi1uYW1lc3BhY2UgewotVW5rbm93bkZpZWxkU2V0KiBlbXB0eV91bmtub3duX2ZpZWxkX3NldF8gPSBOVUxMOwotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShlbXB0eV91bmtub3duX2ZpZWxkX3NldF9vbmNlXyk7Ci0KLXZvaWQgRGVsZXRlRW1wdHlVbmtub3duRmllbGRTZXQoKSB7Ci0gIGRlbGV0ZSBlbXB0eV91bmtub3duX2ZpZWxkX3NldF87Ci0gIGVtcHR5X3Vua25vd25fZmllbGRfc2V0XyA9IE5VTEw7Ci19Ci0KLXZvaWQgSW5pdEVtcHR5VW5rbm93bkZpZWxkU2V0KCkgewotICBlbXB0eV91bmtub3duX2ZpZWxkX3NldF8gPSBuZXcgVW5rbm93bkZpZWxkU2V0OwotICBpbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlRW1wdHlVbmtub3duRmllbGRTZXQpOwotfQotCi1jb25zdCBVbmtub3duRmllbGRTZXQmIEdldEVtcHR5VW5rbm93bkZpZWxkU2V0KCkgewotICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZlbXB0eV91bmtub3duX2ZpZWxkX3NldF9vbmNlXywgJkluaXRFbXB0eVVua25vd25GaWVsZFNldCk7Ci0gIHJldHVybiAqZW1wdHlfdW5rbm93bl9maWVsZF9zZXRfOwotfQotfSAgLy8gbmFtZXNwYWNlCi0KLWNvbnN0IFVua25vd25GaWVsZFNldCYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFVua25vd25GaWVsZHMoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgewotICBpZiAoZGVzY3JpcHRvcl8tPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMpIHsKLSAgICByZXR1cm4gR2V0RW1wdHlVbmtub3duRmllbGRTZXQoKTsKLSAgfQotICBpZiAodW5rbm93bl9maWVsZHNfb2Zmc2V0XyA9PSBrVW5rbm93bkZpZWxkU2V0SW5NZXRhZGF0YSkgewotICAgIHJldHVybiBHZXRJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKG1lc3NhZ2UpLnVua25vd25fZmllbGRzKCk7Ci0gIH0KLSAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArCi0gICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRzX29mZnNldF87Ci0gIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbmtub3duRmllbGRTZXQqPihwdHIpOwotfQotCi1Vbmtub3duRmllbGRTZXQqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNdXRhYmxlVW5rbm93bkZpZWxkcygKLSAgICBNZXNzYWdlKiBtZXNzYWdlKSBjb25zdCB7Ci0gIGlmICh1bmtub3duX2ZpZWxkc19vZmZzZXRfID09IGtVbmtub3duRmllbGRTZXRJbk1ldGFkYXRhKSB7Ci0gICAgcmV0dXJuIE11dGFibGVJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKG1lc3NhZ2UpLT4KLSAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0gIHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArIHVua25vd25fZmllbGRzX29mZnNldF87Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFVua25vd25GaWVsZFNldCo+KHB0cik7Ci19Ci0KLWludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3BhY2VVc2VkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKLSAgLy8gb2JqZWN0X3NpemVfIGFscmVhZHkgaW5jbHVkZXMgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiBlYWNoIGZpZWxkCi0gIC8vIGluIHRoZSBtZXNzYWdlLCBzbyB3ZSBvbmx5IG5lZWQgdG8gYWNjb3VudCBmb3IgYWRkaXRpb25hbCBtZW1vcnkgdXNlZCBieQotICAvLyB0aGUgZmllbGRzLgotICBpbnQgdG90YWxfc2l6ZSA9IG9iamVjdF9zaXplXzsKLQotICB0b3RhbF9zaXplICs9IEdldFVua25vd25GaWVsZHMobWVzc2FnZSkuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOwotCi0gIGlmIChleHRlbnNpb25zX29mZnNldF8gIT0gLTEpIHsKLSAgICB0b3RhbF9zaXplICs9IEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCk7Ci0gIH0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotCi0gICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFIDogICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdG90YWxfc2l6ZSArPSBHZXRSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWsKLQotICAgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCBJTlQ2NCwgIGludDY0KTsKLSAgICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKLSAgICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQpOwotICAgICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgRU5VTSwgICAgaW50KTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgICB0b3RhbF9zaXplICs9IEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gPihtZXNzYWdlLCBmaWVsZCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICAgICAgICB0b3RhbF9zaXplICs9Ci0gICAgICAgICAgICAgICAgR2V0UmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGljaCBzdWJjbGFzcyBvZiBSZXBlYXRlZFB0ckZpZWxkQmFzZSB0aGUgdHlwZSBpcywKLSAgICAgICAgICAgIC8vIHNvIHdlIHVzZSBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkaXJlY3RseS4KLSAgICAgICAgICAgIHRvdGFsX3NpemUgKz0KLSAgICAgICAgICAgICAgICBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQotICAgICAgICAgICAgICAgICAgLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGY8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgJiYgIUhhc09uZW9mRmllbGQobWVzc2FnZSwgZmllbGQpKSB7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMiA6Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0IDoKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQgOgotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MICA6Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU0gIDoKLSAgICAgICAgICAvLyBGaWVsZCBpcyBpbmxpbmUsIHNvIHdlJ3ZlIGFscmVhZHkgY291bnRlZCBpdC4KLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKLSAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7Ci0gICAgICAgICAgICAgIC8vIEluaXRpYWxseSwgdGhlIHN0cmluZyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgc3RvcmVkIGluCi0gICAgICAgICAgICAgIC8vIHRoZSBwcm90b3R5cGUuIE9ubHkgY291bnQgdGhlIHN0cmluZyBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkCi0gICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPQotICAgICAgICAgICAgICAgICAgJkRlZmF1bHRSYXc8QXJlbmFTdHJpbmdQdHI+KGZpZWxkKS5HZXQoTlVMTCk7Ci0gICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogcHRyID0KLSAgICAgICAgICAgICAgICAgICZHZXRGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLkdldChkZWZhdWx0X3B0cik7Ci0KLSAgICAgICAgICAgICAgaWYgKHB0ciAhPSBkZWZhdWx0X3B0cikgewotICAgICAgICAgICAgICAgIC8vIHN0cmluZyBmaWVsZHMgYXJlIHJlcHJlc2VudGVkIGJ5IGp1c3QgYSBwb2ludGVyLCBzbyBhbHNvCi0gICAgICAgICAgICAgICAgLy8gaW5jbHVkZSBzaXplb2Yoc3RyaW5nKSBhcyB3ZWxsLgotICAgICAgICAgICAgICAgIHRvdGFsX3NpemUgKz0gc2l6ZW9mKCpwdHIpICsgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigqcHRyKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGlmICgmbWVzc2FnZSA9PSBkZWZhdWx0X2luc3RhbmNlXykgewotICAgICAgICAgICAgLy8gRm9yIHNpbmd1bGFyIGZpZWxkcywgdGhlIHByb3RvdHlwZSBqdXN0IHN0b3JlcyBhIHBvaW50ZXIgdG8gdGhlCi0gICAgICAgICAgICAvLyBleHRlcm5hbCB0eXBlJ3MgcHJvdG90eXBlLCBzbyB0aGVyZSBpcyBubyBleHRyYSBtZW1vcnkgdXNhZ2UuCi0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlID0gR2V0UmF3PGNvbnN0IE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7Ci0gICAgICAgICAgICBpZiAoc3ViX21lc3NhZ2UgIT0gTlVMTCkgewotICAgICAgICAgICAgICB0b3RhbF9zaXplICs9IHN1Yl9tZXNzYWdlLT5TcGFjZVVzZWQoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRvdGFsX3NpemU7Ci19Ci0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlN3YXBGaWVsZCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlMSwKLSAgICBNZXNzYWdlKiBtZXNzYWdlMiwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgU1dBUF9BUlJBWVMoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPFRZUEU+ID4obWVzc2FnZTEsIGZpZWxkKS0+U3dhcCggICAgICAgIFwKLSAgICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUWVBFPiA+KG1lc3NhZ2UyLCBmaWVsZCkpOyAgICAgICAgIFwKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIFNXQVBfQVJSQVlTKElOVDMyICwgaW50MzIgKTsKLSAgICAgIFNXQVBfQVJSQVlTKElOVDY0ICwgaW50NjQgKTsKLSAgICAgIFNXQVBfQVJSQVlTKFVJTlQzMiwgdWludDMyKTsKLSAgICAgIFNXQVBfQVJSQVlTKFVJTlQ2NCwgdWludDY0KTsKLSAgICAgIFNXQVBfQVJSQVlTKEZMT0FUICwgZmxvYXQgKTsKLSAgICAgIFNXQVBfQVJSQVlTKERPVUJMRSwgZG91YmxlKTsKLSAgICAgIFNXQVBfQVJSQVlTKEJPT0wgICwgYm9vbCAgKTsKLSAgICAgIFNXQVBfQVJSQVlTKEVOVU0gICwgaW50ICAgKTsKLSN1bmRlZiBTV0FQX0FSUkFZUwotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKLSAgICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UxLCBmaWVsZCktPgotICAgICAgICAgICAgICAgIFN3YXA8R2VuZXJpY1R5cGVIYW5kbGVyPHN0cmluZz4gPigKLSAgICAgICAgICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZTIsIGZpZWxkKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICAgICAgTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UxLCBmaWVsZCktPgotICAgICAgICAgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoKS0+Ci0gICAgICAgICAgICAgIFN3YXA8R2VuZXJpY1R5cGVIYW5kbGVyPGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2U+ID4oCi0gICAgICAgICAgICAgICAgTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UyLCBmaWVsZCktPgotICAgICAgICAgICAgICAgICAgTXV0YWJsZVJlcGVhdGVkRmllbGQoKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZTEsIGZpZWxkKS0+Ci0gICAgICAgICAgICBTd2FwPEdlbmVyaWNUeXBlSGFuZGxlcjxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlPiA+KAotICAgICAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlMiwgZmllbGQpKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZC0+Y3BwX3R5cGUoKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotI2RlZmluZSBTV0FQX1ZBTFVFUyhDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBzdGQ6OnN3YXAoKk11dGFibGVSYXc8VFlQRT4obWVzc2FnZTEsIGZpZWxkKSwgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgKk11dGFibGVSYXc8VFlQRT4obWVzc2FnZTIsIGZpZWxkKSk7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhazsKLQotICAgICAgU1dBUF9WQUxVRVMoSU5UMzIgLCBpbnQzMiApOwotICAgICAgU1dBUF9WQUxVRVMoSU5UNjQgLCBpbnQ2NCApOwotICAgICAgU1dBUF9WQUxVRVMoVUlOVDMyLCB1aW50MzIpOwotICAgICAgU1dBUF9WQUxVRVMoVUlOVDY0LCB1aW50NjQpOwotICAgICAgU1dBUF9WQUxVRVMoRkxPQVQgLCBmbG9hdCApOwotICAgICAgU1dBUF9WQUxVRVMoRE9VQkxFLCBkb3VibGUpOwotICAgICAgU1dBUF9WQUxVRVMoQk9PTCAgLCBib29sICApOwotICAgICAgU1dBUF9WQUxVRVMoRU5VTSAgLCBpbnQgICApOwotI3VuZGVmIFNXQVBfVkFMVUVTCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAoR2V0QXJlbmEobWVzc2FnZTEpID09IEdldEFyZW5hKG1lc3NhZ2UyKSkgewotICAgICAgICAgIHN0ZDo6c3dhcCgqTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZTEsIGZpZWxkKSwKLSAgICAgICAgICAgICAgICAgICAgKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UyLCBmaWVsZCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIE1lc3NhZ2UqKiBzdWJfbXNnMSA9IE11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UxLCBmaWVsZCk7Ci0gICAgICAgICAgTWVzc2FnZSoqIHN1Yl9tc2cyID0gTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZTIsIGZpZWxkKTsKLSAgICAgICAgICBpZiAoKnN1Yl9tc2cxID09IE5VTEwgJiYgKnN1Yl9tc2cyID09IE5VTEwpIGJyZWFrOwotICAgICAgICAgIGlmICgqc3ViX21zZzEgJiYgKnN1Yl9tc2cyKSB7Ci0gICAgICAgICAgICAoKnN1Yl9tc2cxKS0+R2V0UmVmbGVjdGlvbigpLT5Td2FwKCpzdWJfbXNnMSwgKnN1Yl9tc2cyKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgIH0KLSAgICAgICAgICBpZiAoKnN1Yl9tc2cxID09IE5VTEwpIHsKLSAgICAgICAgICAgICpzdWJfbXNnMSA9ICgqc3ViX21zZzIpLT5OZXcobWVzc2FnZTEtPkdldEFyZW5hKCkpOwotICAgICAgICAgICAgKCpzdWJfbXNnMSktPkNvcHlGcm9tKCoqc3ViX21zZzIpOwotICAgICAgICAgICAgQ2xlYXJGaWVsZChtZXNzYWdlMiwgZmllbGQpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAqc3ViX21zZzIgPSAoKnN1Yl9tc2cxKS0+TmV3KG1lc3NhZ2UyLT5HZXRBcmVuYSgpKTsKLSAgICAgICAgICAgICgqc3ViX21zZzIpLT5Db3B5RnJvbSgqKnN1Yl9tc2cxKTsKLSAgICAgICAgICAgIENsZWFyRmllbGQobWVzc2FnZTEsIGZpZWxkKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KLSAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgewotICAgICAgICAgICAgICBBcmVuYSogYXJlbmExID0gR2V0QXJlbmEobWVzc2FnZTEpOwotICAgICAgICAgICAgICBBcmVuYSogYXJlbmEyID0gR2V0QXJlbmEobWVzc2FnZTIpOwotICAgICAgICAgICAgICBBcmVuYVN0cmluZ1B0ciogc3RyaW5nMSA9Ci0gICAgICAgICAgICAgICAgICBNdXRhYmxlUmF3PEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlMSwgZmllbGQpOwotICAgICAgICAgICAgICBBcmVuYVN0cmluZ1B0ciogc3RyaW5nMiA9Ci0gICAgICAgICAgICAgICAgICBNdXRhYmxlUmF3PEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlMiwgZmllbGQpOwotICAgICAgICAgICAgICBpZiAoYXJlbmExID09IGFyZW5hMikgewotICAgICAgICAgICAgICAgIHN0cmluZzEtPlN3YXAoc3RyaW5nMik7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3B0ciA9Ci0gICAgICAgICAgICAgICAgICAgICZEZWZhdWx0UmF3PEFyZW5hU3RyaW5nUHRyPihmaWVsZCkuR2V0KE5VTEwpOwotICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyB0ZW1wID0gc3RyaW5nMS0+R2V0KGRlZmF1bHRfcHRyKTsKLSAgICAgICAgICAgICAgICBzdHJpbmcxLT5TZXQoZGVmYXVsdF9wdHIsIHN0cmluZzItPkdldChkZWZhdWx0X3B0ciksIGFyZW5hMSk7Ci0gICAgICAgICAgICAgICAgc3RyaW5nMi0+U2V0KGRlZmF1bHRfcHRyLCB0ZW1wLCBhcmVuYTIpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZC0+Y3BwX3R5cGUoKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcE9uZW9mRmllbGQoCi0gICAgTWVzc2FnZSogbWVzc2FnZTEsCi0gICAgTWVzc2FnZSogbWVzc2FnZTIsCi0gICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdCB7Ci0gIHVpbnQzMiBvbmVvZl9jYXNlMSA9IEdldE9uZW9mQ2FzZSgqbWVzc2FnZTEsIG9uZW9mX2Rlc2NyaXB0b3IpOwotICB1aW50MzIgb25lb2ZfY2FzZTIgPSBHZXRPbmVvZkNhc2UoKm1lc3NhZ2UyLCBvbmVvZl9kZXNjcmlwdG9yKTsKLQotICBpbnQzMiB0ZW1wX2ludDMyOwotICBpbnQ2NCB0ZW1wX2ludDY0OwotICB1aW50MzIgdGVtcF91aW50MzI7Ci0gIHVpbnQ2NCB0ZW1wX3VpbnQ2NDsKLSAgZmxvYXQgdGVtcF9mbG9hdDsKLSAgZG91YmxlIHRlbXBfZG91YmxlOwotICBib29sIHRlbXBfYm9vbDsKLSAgaW50IHRlbXBfaW50OwotICBNZXNzYWdlKiB0ZW1wX21lc3NhZ2UgPSBOVUxMOwotICBzdHJpbmcgdGVtcF9zdHJpbmc7Ci0KLSAgLy8gU3RvcmVzIG1lc3NhZ2UxJ3Mgb25lb2YgZmllbGQgdG8gYSB0ZW1wIHZhcmlhYmxlLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkMSA9IE5VTEw7Ci0gIGlmIChvbmVvZl9jYXNlMSA+IDApIHsKLSAgICBmaWVsZDEgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOdW1iZXIob25lb2ZfY2FzZTEpOwotICAgIC8vb25lb2ZfZGVzY3JpcHRvci0+ZmllbGQob25lb2ZfY2FzZTEpOwotICAgIHN3aXRjaCAoZmllbGQxLT5jcHBfdHlwZSgpKSB7Ci0jZGVmaW5lIEdFVF9URU1QX1ZBTFVFKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIHRlbXBfIyNUWVBFID0gR2V0RmllbGQ8VFlQRT4oKm1lc3NhZ2UxLCBmaWVsZDEpOyAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBHRVRfVEVNUF9WQUxVRShJTlQzMiAsIGludDMyICk7Ci0gICAgICBHRVRfVEVNUF9WQUxVRShJTlQ2NCAsIGludDY0ICk7Ci0gICAgICBHRVRfVEVNUF9WQUxVRShVSU5UMzIsIHVpbnQzMik7Ci0gICAgICBHRVRfVEVNUF9WQUxVRShVSU5UNjQsIHVpbnQ2NCk7Ci0gICAgICBHRVRfVEVNUF9WQUxVRShGTE9BVCAsIGZsb2F0ICk7Ci0gICAgICBHRVRfVEVNUF9WQUxVRShET1VCTEUsIGRvdWJsZSk7Ci0gICAgICBHRVRfVEVNUF9WQUxVRShCT09MICAsIGJvb2wgICk7Ci0gICAgICBHRVRfVEVNUF9WQUxVRShFTlVNICAsIGludCAgICk7Ci0jdW5kZWYgR0VUX1RFTVBfVkFMVUUKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIHRlbXBfbWVzc2FnZSA9IFJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UxLCBmaWVsZDEpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgICB0ZW1wX3N0cmluZyA9IEdldFN0cmluZygqbWVzc2FnZTEsIGZpZWxkMSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCB0eXBlOiAiIDw8IGZpZWxkMS0+Y3BwX3R5cGUoKTsKLSAgICB9Ci0gIH0KLQotICAvLyBTZXRzIG1lc3NhZ2UxJ3Mgb25lb2YgZmllbGQgZnJvbSB0aGUgbWVzc2FnZTIncyBvbmVvZiBmaWVsZC4KLSAgaWYgKG9uZW9mX2Nhc2UyID4gMCkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQyID0KLSAgICAgICAgZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TnVtYmVyKG9uZW9mX2Nhc2UyKTsKLSAgICBzd2l0Y2ggKGZpZWxkMi0+Y3BwX3R5cGUoKSkgewotI2RlZmluZSBTRVRfT05FT0ZfVkFMVUUxKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBTZXRGaWVsZDxUWVBFPihtZXNzYWdlMSwgZmllbGQyLCBHZXRGaWVsZDxUWVBFPigqbWVzc2FnZTIsIGZpZWxkMikpOyBcCi0gICAgICAgIGJyZWFrOwotCi0gICAgICBTRVRfT05FT0ZfVkFMVUUxKElOVDMyICwgaW50MzIgKTsKLSAgICAgIFNFVF9PTkVPRl9WQUxVRTEoSU5UNjQgLCBpbnQ2NCApOwotICAgICAgU0VUX09ORU9GX1ZBTFVFMShVSU5UMzIsIHVpbnQzMik7Ci0gICAgICBTRVRfT05FT0ZfVkFMVUUxKFVJTlQ2NCwgdWludDY0KTsKLSAgICAgIFNFVF9PTkVPRl9WQUxVRTEoRkxPQVQgLCBmbG9hdCApOwotICAgICAgU0VUX09ORU9GX1ZBTFVFMShET1VCTEUsIGRvdWJsZSk7Ci0gICAgICBTRVRfT05FT0ZfVkFMVUUxKEJPT0wgICwgYm9vbCAgKTsKLSAgICAgIFNFVF9PTkVPRl9WQUxVRTEoRU5VTSAgLCBpbnQgICApOwotI3VuZGVmIFNFVF9PTkVPRl9WQUxVRTEKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIFNldEFsbG9jYXRlZE1lc3NhZ2UobWVzc2FnZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVsZWFzZU1lc3NhZ2UobWVzc2FnZTIsIGZpZWxkMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQyKTsKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgU2V0U3RyaW5nKG1lc3NhZ2UxLCBmaWVsZDIsIEdldFN0cmluZygqbWVzc2FnZTIsIGZpZWxkMikpOwotICAgICAgICBicmVhazsKLQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZDItPmNwcF90eXBlKCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIENsZWFyT25lb2YobWVzc2FnZTEsIG9uZW9mX2Rlc2NyaXB0b3IpOwotICB9Ci0KLSAgLy8gU2V0cyBtZXNzYWdlMidzIG9uZW9mIGZpZWxkIGZyb20gdGhlIHRlbXAgdmFyaWFibGUuCi0gIGlmIChvbmVvZl9jYXNlMSA+IDApIHsKLSAgICBzd2l0Y2ggKGZpZWxkMS0+Y3BwX3R5cGUoKSkgewotI2RlZmluZSBTRVRfT05FT0ZfVkFMVUUyKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBTZXRGaWVsZDxUWVBFPihtZXNzYWdlMiwgZmllbGQxLCB0ZW1wXyMjVFlQRSk7ICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhazsKLQotICAgICAgU0VUX09ORU9GX1ZBTFVFMihJTlQzMiAsIGludDMyICk7Ci0gICAgICBTRVRfT05FT0ZfVkFMVUUyKElOVDY0ICwgaW50NjQgKTsKLSAgICAgIFNFVF9PTkVPRl9WQUxVRTIoVUlOVDMyLCB1aW50MzIpOwotICAgICAgU0VUX09ORU9GX1ZBTFVFMihVSU5UNjQsIHVpbnQ2NCk7Ci0gICAgICBTRVRfT05FT0ZfVkFMVUUyKEZMT0FUICwgZmxvYXQgKTsKLSAgICAgIFNFVF9PTkVPRl9WQUxVRTIoRE9VQkxFLCBkb3VibGUpOwotICAgICAgU0VUX09ORU9GX1ZBTFVFMihCT09MICAsIGJvb2wgICk7Ci0gICAgICBTRVRfT05FT0ZfVkFMVUUyKEVOVU0gICwgaW50ICAgKTsKLSN1bmRlZiBTRVRfT05FT0ZfVkFMVUUyCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBTZXRBbGxvY2F0ZWRNZXNzYWdlKG1lc3NhZ2UyLCB0ZW1wX21lc3NhZ2UsIGZpZWxkMSk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIFNldFN0cmluZyhtZXNzYWdlMiwgZmllbGQxLCB0ZW1wX3N0cmluZyk7Ci0gICAgICAgIGJyZWFrOwotCi0gICAgICBkZWZhdWx0OgotICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCB0eXBlOiAiIDw8IGZpZWxkMS0+Y3BwX3R5cGUoKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgQ2xlYXJPbmVvZihtZXNzYWdlMiwgb25lb2ZfZGVzY3JpcHRvcik7Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlMSwKLSAgICBNZXNzYWdlKiBtZXNzYWdlMikgY29uc3QgewotICBpZiAobWVzc2FnZTEgPT0gbWVzc2FnZTIpIHJldHVybjsKLQotICAvLyBUT0RPKGtlbnRvbik6ICBPdGhlciBSZWZsZWN0aW9uIG1ldGhvZHMgc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoaXMgdG9vLgotICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKLSAgICA8PCAiRmlyc3QgYXJndW1lbnQgdG8gU3dhcCgpIChvZiB0eXBlIFwiIgotICAgIDw8IG1lc3NhZ2UxLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCi0gICAgPDwgIlwiKSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgcmVmbGVjdGlvbiBvYmplY3QgKHdoaWNoIGlzIGZvciB0eXBlIFwiIgotICAgIDw8IGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKQotICAgIDw8ICJcIikuICBOb3RlIHRoYXQgdGhlIGV4YWN0IHNhbWUgY2xhc3MgaXMgcmVxdWlyZWQ7IG5vdCBqdXN0IHRoZSBzYW1lICIKLSAgICAgICAiZGVzY3JpcHRvci4iOwotICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTItPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKLSAgICA8PCAiU2Vjb25kIGFyZ3VtZW50IHRvIFN3YXAoKSAob2YgdHlwZSBcIiIKLSAgICA8PCBtZXNzYWdlMi0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKQotICAgIDw8ICJcIikgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlZmxlY3Rpb24gb2JqZWN0ICh3aGljaCBpcyBmb3IgdHlwZSBcIiIKLSAgICA8PCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkKLSAgICA8PCAiXCIpLiAgTm90ZSB0aGF0IHRoZSBleGFjdCBzYW1lIGNsYXNzIGlzIHJlcXVpcmVkOyBub3QganVzdCB0aGUgc2FtZSAiCi0gICAgICAgImRlc2NyaXB0b3IuIjsKLQotICAvLyBDaGVjayB0aGF0IGJvdGggbWVzc2FnZXMgYXJlIGluIHRoZSBzYW1lIGFyZW5hIChvciBib3RoIG9uIHRoZSBoZWFwKS4gV2UKLSAgLy8gbmVlZCB0byBjb3B5IGFsbCBkYXRhIGlmIG5vdCwgZHVlIHRvIG93bmVyc2hpcCBzZW1hbnRpY3MuCi0gIGlmIChHZXRBcmVuYShtZXNzYWdlMSkgIT0gR2V0QXJlbmEobWVzc2FnZTIpKSB7Ci0gICAgLy8gU2xvdyBjb3B5IHBhdGguCi0gICAgLy8gVXNlIG91ciBhcmVuYSBhcyB0ZW1wIHNwYWNlLCBpZiBhdmFpbGFibGUuCi0gICAgTWVzc2FnZSogdGVtcCA9IG1lc3NhZ2UxLT5OZXcoR2V0QXJlbmEobWVzc2FnZTEpKTsKLSAgICB0ZW1wLT5NZXJnZUZyb20oKm1lc3NhZ2UxKTsKLSAgICBtZXNzYWdlMS0+Q29weUZyb20oKm1lc3NhZ2UyKTsKLSAgICBtZXNzYWdlMi0+Q29weUZyb20oKnRlbXApOwotICAgIGlmIChHZXRBcmVuYShtZXNzYWdlMSkgPT0gTlVMTCkgewotICAgICAgZGVsZXRlIHRlbXA7Ci0gICAgfQotICAgIHJldHVybjsKLSAgfQotCi0gIGlmIChoYXNfYml0c19vZmZzZXRfICE9IC0xKSB7Ci0gICAgdWludDMyKiBoYXNfYml0czEgPSBNdXRhYmxlSGFzQml0cyhtZXNzYWdlMSk7Ci0gICAgdWludDMyKiBoYXNfYml0czIgPSBNdXRhYmxlSGFzQml0cyhtZXNzYWdlMik7Ci0gICAgaW50IGhhc19iaXRzX3NpemUgPSAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgKyAzMSkgLyAzMjsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzX2JpdHNfc2l6ZTsgaSsrKSB7Ci0gICAgICBzdGQ6OnN3YXAoaGFzX2JpdHMxW2ldLCBoYXNfYml0czJbaV0pOwotICAgIH0KLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0gICAgaWYgKCFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICBTd2FwRmllbGQobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZCk7Ci0gICAgfQotICB9Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKLSAgICBTd2FwT25lb2ZGaWVsZChtZXNzYWdlMSwgbWVzc2FnZTIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpKTsKLSAgfQotCi0gIGlmIChleHRlbnNpb25zX29mZnNldF8gIT0gLTEpIHsKLSAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UxKS0+U3dhcChNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UyKSk7Ci0gIH0KLQotICBNdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlMSktPlN3YXAoTXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZTIpKTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcEZpZWxkcygKLSAgICBNZXNzYWdlKiBtZXNzYWdlMSwKLSAgICBNZXNzYWdlKiBtZXNzYWdlMiwKLSAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgY29uc3QgewotICBpZiAobWVzc2FnZTEgPT0gbWVzc2FnZTIpIHJldHVybjsKLQotICAvLyBUT0RPKGtlbnRvbik6ICBPdGhlciBSZWZsZWN0aW9uIG1ldGhvZHMgc2hvdWxkIHByb2JhYmx5IGNoZWNrIHRoaXMgdG9vLgotICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTEtPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKLSAgICA8PCAiRmlyc3QgYXJndW1lbnQgdG8gU3dhcEZpZWxkcygpIChvZiB0eXBlIFwiIgotICAgIDw8IG1lc3NhZ2UxLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCi0gICAgPDwgIlwiKSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgcmVmbGVjdGlvbiBvYmplY3QgKHdoaWNoIGlzIGZvciB0eXBlIFwiIgotICAgIDw8IGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKQotICAgIDw8ICJcIikuICBOb3RlIHRoYXQgdGhlIGV4YWN0IHNhbWUgY2xhc3MgaXMgcmVxdWlyZWQ7IG5vdCBqdXN0IHRoZSBzYW1lICIKLSAgICAgICAiZGVzY3JpcHRvci4iOwotICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZTItPkdldFJlZmxlY3Rpb24oKSwgdGhpcykKLSAgICA8PCAiU2Vjb25kIGFyZ3VtZW50IHRvIFN3YXBGaWVsZHMoKSAob2YgdHlwZSBcIiIKLSAgICA8PCBtZXNzYWdlMi0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKQotICAgIDw8ICJcIikgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlZmxlY3Rpb24gb2JqZWN0ICh3aGljaCBpcyBmb3IgdHlwZSBcIiIKLSAgICA8PCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkKLSAgICA8PCAiXCIpLiAgTm90ZSB0aGF0IHRoZSBleGFjdCBzYW1lIGNsYXNzIGlzIHJlcXVpcmVkOyBub3QganVzdCB0aGUgc2FtZSAiCi0gICAgICAgImRlc2NyaXB0b3IuIjsKLQotICBzdGQ6OnNldDxpbnQ+IHN3YXBwZWRfb25lb2Y7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOwotICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZTEpLT5Td2FwRXh0ZW5zaW9uKAotICAgICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZTIpLAotICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICAgIGludCBvbmVvZl9pbmRleCA9IGZpZWxkLT5jb250YWluaW5nX29uZW9mKCktPmluZGV4KCk7Ci0gICAgICAgIC8vIE9ubHkgc3dhcCB0aGUgb25lb2YgZmllbGQgb25jZS4KLSAgICAgICAgaWYgKHN3YXBwZWRfb25lb2YuZmluZChvbmVvZl9pbmRleCkgIT0gc3dhcHBlZF9vbmVvZi5lbmQoKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9Ci0gICAgICAgIHN3YXBwZWRfb25lb2YuaW5zZXJ0KG9uZW9mX2luZGV4KTsKLSAgICAgICAgU3dhcE9uZW9mRmllbGQobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFN3YXAgaGFzIGJpdC4KLSAgICAgICAgU3dhcEJpdChtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkKTsKLSAgICAgICAgLy8gU3dhcCBmaWVsZC4KLSAgICAgICAgU3dhcEZpZWxkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWJvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Okhhc0ZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShIYXNGaWVsZCk7Ci0gIFVTQUdFX0NIRUNLX1NJTkdVTEFSKEhhc0ZpZWxkKTsKLQotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5IYXMoZmllbGQtPm51bWJlcigpKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgcmV0dXJuIEhhc09uZW9mRmllbGQobWVzc2FnZSwgZmllbGQpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gSGFzQml0KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICB9Ci0gIH0KLX0KLQotaW50IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpGaWVsZFNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfTUVTU0FHRV9UWVBFKEZpZWxkU2l6ZSk7Ci0gIFVTQUdFX0NIRUNLX1JFUEVBVEVEKEZpZWxkU2l6ZSk7Ci0KLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuRXh0ZW5zaW9uU2l6ZShmaWVsZC0+bnVtYmVyKCkpOwotICB9IGVsc2UgewotICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCkuc2l6ZSgpCi0KLSAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBJTlQ2NCwgIGludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBGTE9BVCwgIGZsb2F0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgRU5VTSwgICAgaW50KTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgewotICAgICAgICAgIHJldHVybiBHZXRSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkuR2V0UmVwZWF0ZWRGaWVsZCgpLnNpemUoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gR2V0UmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkuc2l6ZSgpOwotICAgICAgICB9Ci0gICAgfQotCi0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6Q2xlYXJGaWVsZCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShDbGVhckZpZWxkKTsKLQotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+Q2xlYXJFeHRlbnNpb24oZmllbGQtPm51bWJlcigpKTsKLSAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgewotICAgICAgQ2xlYXJPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoSGFzQml0KCptZXNzYWdlLCBmaWVsZCkpIHsKLSAgICAgIENsZWFyQml0KG1lc3NhZ2UsIGZpZWxkKTsKLQotICAgICAgLy8gV2UgbmVlZCB0byBzZXQgdGhlIGZpZWxkIGJhY2sgdG8gaXRzIGRlZmF1bHQgdmFsdWUuCi0gICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0jZGVmaW5lIENMRUFSX1RZUEUoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICpNdXRhYmxlUmF3PFRZUEU+KG1lc3NhZ2UsIGZpZWxkKSA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV8jI1RZUEUoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBDTEVBUl9UWVBFKElOVDMyICwgaW50MzIgKTsKLSAgICAgICAgQ0xFQVJfVFlQRShJTlQ2NCAsIGludDY0ICk7Ci0gICAgICAgIENMRUFSX1RZUEUoVUlOVDMyLCB1aW50MzIpOwotICAgICAgICBDTEVBUl9UWVBFKFVJTlQ2NCwgdWludDY0KTsKLSAgICAgICAgQ0xFQVJfVFlQRShGTE9BVCAsIGZsb2F0ICk7Ci0gICAgICAgIENMRUFSX1RZUEUoRE9VQkxFLCBkb3VibGUpOwotICAgICAgICBDTEVBUl9UWVBFKEJPT0wgICwgYm9vbCAgKTsKLSN1bmRlZiBDTEVBUl9UWVBFCi0KLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgICAgICAqTXV0YWJsZVJhdzxpbnQ+KG1lc3NhZ2UsIGZpZWxkKSA9Ci0gICAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogewotICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KLSAgICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6IHsKLSAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3B0ciA9Ci0gICAgICAgICAgICAgICAgICAmRGVmYXVsdFJhdzxBcmVuYVN0cmluZ1B0cj4oZmllbGQpLkdldChOVUxMKTsKLSAgICAgICAgICAgICAgTXV0YWJsZVJhdzxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLT5EZXN0cm95KGRlZmF1bHRfcHRyLAotICAgICAgICAgICAgICAgICAgR2V0QXJlbmEobWVzc2FnZSkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGlmIChoYXNfYml0c19vZmZzZXRfID09IC0xKSB7Ci0gICAgICAgICAgICAvLyBQcm90bzMgZG9lcyBub3QgaGF2ZSBoYXMtYml0cyBhbmQgd2UgbmVlZCB0byBzZXQgYSBtZXNzYWdlIGZpZWxkCi0gICAgICAgICAgICAvLyB0byBOVUxMIGluIG9yZGVyIHRvIGluZGljYXRlIGl0cyB1bi1wcmVzZW5jZS4KLSAgICAgICAgICAgIGlmIChHZXRBcmVuYShtZXNzYWdlKSA9PSBOVUxMKSB7Ci0gICAgICAgICAgICAgIGRlbGV0ZSAqTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKSA9IE5VTEw7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICgqTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpKS0+Q2xlYXIoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9IGVsc2UgewotICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjVVBQRVJDQVNFIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihtZXNzYWdlLCBmaWVsZCktPkNsZWFyKCk7ICAgICAgIFwKLSAgICAgICAgYnJlYWsKLQotICAgICAgSEFORExFX1RZUEUoIElOVDMyLCAgaW50MzIpOwotICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQpOwotICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIpOwotICAgICAgSEFORExFX1RZUEUoVUlOVDY0LCB1aW50NjQpOwotICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOwotICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQpOwotICAgICAgSEFORExFX1RZUEUoICBCT09MLCAgIGJvb2wpOwotICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgICBpbnQpOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogewotICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgotICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiA+KG1lc3NhZ2UsIGZpZWxkKS0+Q2xlYXIoKTsKLSAgICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICAgICAgTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQotICAgICAgICAgICAgICAtPk11dGFibGVSZXBlYXRlZEZpZWxkKCkKLSAgICAgICAgICAgICAgLT5DbGVhcjxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hpY2ggc3ViY2xhc3Mgb2YgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgdGhlIHR5cGUgaXMsCi0gICAgICAgICAgLy8gc28gd2UgdXNlIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRpcmVjdGx5LgotICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQotICAgICAgICAgICAgICAtPkNsZWFyPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlJlbW92ZUxhc3QoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX01FU1NBR0VfVFlQRShSZW1vdmVMYXN0KTsKLSAgVVNBR0VfQ0hFQ0tfUkVQRUFURUQoUmVtb3ZlTGFzdCk7Ci0KLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlJlbW92ZUxhc3QoZmllbGQtPm51bWJlcigpKTsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxMT1dFUkNBU0U+ID4obWVzc2FnZSwgZmllbGQpLT5SZW1vdmVMYXN0KCk7ICBcCi0gICAgICAgIGJyZWFrCi0KLSAgICAgIEhBTkRMRV9UWVBFKCBJTlQzMiwgIGludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBJTlQ2NCwgIGludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyKTsKLSAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKLSAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBGTE9BVCwgIGZsb2F0KTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgQk9PTCwgICBib29sKTsKLSAgICAgIEhBTkRMRV9UWVBFKCAgRU5VTSwgICAgaW50KTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKLSAgICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+ID4obWVzc2FnZSwgZmllbGQpLT5SZW1vdmVMYXN0KCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKLSAgICAgICAgICBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCi0gICAgICAgICAgICAgIC0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKQotICAgICAgICAgICAgICAtPlJlbW92ZUxhc3Q8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKLSAgICAgICAgICAgIC0+UmVtb3ZlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi1NZXNzYWdlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6UmVsZWFzZUxhc3QoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChSZWxlYXNlTGFzdCwgUkVQRUFURUQsIE1FU1NBR0UpOwotCi0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWVzc2FnZSo+KAotICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5SZWxlYXNlTGFzdChmaWVsZC0+bnVtYmVyKCkpKTsKLSAgfSBlbHNlIHsKLSAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgewotICAgICAgcmV0dXJuIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKLSAgICAgICAgICAtPk11dGFibGVSZXBlYXRlZEZpZWxkKCkKLSAgICAgICAgICAtPlJlbGVhc2VMYXN0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKLSAgICAgICAgLT5SZWxlYXNlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOwotICAgIH0KLSAgfQotfQotCi12b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTd2FwRWxlbWVudHMoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGludCBpbmRleDEsCi0gICAgaW50IGluZGV4MikgY29uc3QgewotICBVU0FHRV9DSEVDS19NRVNTQUdFX1RZUEUoU3dhcCk7Ci0gIFVTQUdFX0NIRUNLX1JFUEVBVEVEKFN3YXApOwotCi0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5Td2FwRWxlbWVudHMoZmllbGQtPm51bWJlcigpLCBpbmRleDEsIGluZGV4Mik7Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNVUFBFUkNBU0UgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkRmllbGQ8TE9XRVJDQVNFPiA+KG1lc3NhZ2UsIGZpZWxkKSAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgLT5Td2FwRWxlbWVudHMoaW5kZXgxLCBpbmRleDIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhawotCi0gICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMik7Ci0gICAgICBIQU5ETEVfVFlQRSggSU5UNjQsICBpbnQ2NCk7Ci0gICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7Ci0gICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCk7Ci0gICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCk7Ci0gICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCk7Ci0gICAgICBIQU5ETEVfVFlQRSggIEVOVU0sICAgIGludCk7Ci0jdW5kZWYgSEFORExFX1RZUEUKLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKLSAgICAgICAgICBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCi0gICAgICAgICAgICAgIC0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKQotICAgICAgICAgICAgICAtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCi0gICAgICAgICAgICAtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLW5hbWVzcGFjZSB7Ci0vLyBDb21wYXJpc29uIGZ1bmN0b3IgZm9yIHNvcnRpbmcgRmllbGREZXNjcmlwdG9ycyBieSBmaWVsZCBudW1iZXIuCi1zdHJ1Y3QgRmllbGROdW1iZXJTb3J0ZXIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBsZWZ0LAotICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByaWdodCkgY29uc3QgewotICAgIHJldHVybiBsZWZ0LT5udW1iZXIoKSA8IHJpZ2h0LT5udW1iZXIoKTsKLSAgfQotfTsKLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpMaXN0RmllbGRzKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0IHsKLSAgb3V0cHV0LT5jbGVhcigpOwotCi0gIC8vIE9wdGltaXphdGlvbjogIFRoZSBkZWZhdWx0IGluc3RhbmNlIG5ldmVyIGhhcyBhbnkgZmllbGRzIHNldC4KLSAgaWYgKCZtZXNzYWdlID09IGRlZmF1bHRfaW5zdGFuY2VfKSByZXR1cm47Ci0KLSAgb3V0cHV0LT5yZXNlcnZlKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIGlmIChGaWVsZFNpemUobWVzc2FnZSwgZmllbGQpID4gMCkgewotICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhmaWVsZCk7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICAgIGlmIChIYXNPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgewotICAgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChIYXNCaXQobWVzc2FnZSwgZmllbGQpKSB7Ci0gICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBpZiAoZXh0ZW5zaW9uc19vZmZzZXRfICE9IC0xKSB7Ci0gICAgR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkFwcGVuZFRvTGlzdChkZXNjcmlwdG9yXywgZGVzY3JpcHRvcl9wb29sXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7Ci0gIH0KLQotICAvLyBMaXN0RmllbGRzKCkgbXVzdCBzb3J0IG91dHB1dCBieSBmaWVsZCBudW1iZXIuCi0gIHN0ZDo6c29ydChvdXRwdXQtPmJlZ2luKCksIG91dHB1dC0+ZW5kKCksIEZpZWxkTnVtYmVyU29ydGVyKCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSN1bmRlZiBERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUwotI2RlZmluZSBERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhUWVBFTkFNRSwgVFlQRSwgUEFTU1RZUEUsIENQUFRZUEUpICAgICAgICBcCi0gIFBBU1NUWVBFIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsgICAgICAgICAgXAotICAgIFVTQUdFX0NIRUNLX0FMTChHZXQjI1RZUEVOQU1FLCBTSU5HVUxBUiwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0IyNUWVBFTkFNRSggICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT5kZWZhdWx0X3ZhbHVlXyMjUEFTU1RZUEUoKSk7ICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBHZXRGaWVsZDxUWVBFPihtZXNzYWdlLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVTQUdFX0NIRUNLX0FMTChTZXQjI1RZUEVOQU1FLCBTSU5HVUxBUiwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5TZXQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIHZhbHVlLCBmaWVsZCk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFNldEZpZWxkPFRZUEU+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBQQVNTVFlQRSBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICBcCi0gICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeyAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZCMjVFlQRU5BTUUsIFJFUEVBVEVELCBDUFBUWVBFKTsgICAgICAgICAgICAgICBcCi0gICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0UmVwZWF0ZWQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgXAotICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJldHVybiBHZXRSZXBlYXRlZEZpZWxkPFRZUEU+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7ICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZCMjVFlQRU5BTUUoICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGludCBpbmRleCwgUEFTU1RZUEUgdmFsdWUpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVTQUdFX0NIRUNLX0FMTChTZXRSZXBlYXRlZCMjVFlQRU5BTUUsIFJFUEVBVEVELCBDUFBUWVBFKTsgICAgICAgICAgICAgICBcCi0gICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkIyNUWVBFTkFNRSggICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFNldFJlcGVhdGVkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIGluZGV4LCB2YWx1ZSk7ICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGQjI1RZUEVOQU1FKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIFBBU1NUWVBFIHZhbHVlKSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIFVTQUdFX0NIRUNLX0FMTChBZGQjI1RZUEVOQU1FLCBSRVBFQVRFRCwgQ1BQVFlQRSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZCMjVFlQRU5BTUUoICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCksIHZhbHVlLCAgICBcCi0gICAgICAgIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgQWRkRmllbGQ8VFlQRT4obWVzc2FnZSwgZmllbGQsIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgfQotCi1ERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhJbnQzMiAsIGludDMyICwgaW50MzIgLCBJTlQzMiApCi1ERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhJbnQ2NCAsIGludDY0ICwgaW50NjQgLCBJTlQ2NCApCi1ERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhVSW50MzIsIHVpbnQzMiwgdWludDMyLCBVSU5UMzIpCi1ERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhVSW50NjQsIHVpbnQ2NCwgdWludDY0LCBVSU5UNjQpCi1ERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhGbG9hdCAsIGZsb2F0ICwgZmxvYXQgLCBGTE9BVCApCi1ERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhEb3VibGUsIGRvdWJsZSwgZG91YmxlLCBET1VCTEUpCi1ERUZJTkVfUFJJTUlUSVZFX0FDQ0VTU09SUyhCb29sICAsIGJvb2wgICwgYm9vbCAgLCBCT09MICApCi0jdW5kZWYgREVGSU5FX1BSSU1JVElWRV9BQ0NFU1NPUlMKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJpbmcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFN0cmluZygKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChHZXRTdHJpbmcsIFNJTkdVTEFSLCBTVFJJTkcpOwotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRTdHJpbmcoZmllbGQtPm51bWJlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7Ci0gICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPQotICAgICAgICAgICAgJkRlZmF1bHRSYXc8QXJlbmFTdHJpbmdQdHI+KGZpZWxkKS5HZXQoTlVMTCk7Ci0gICAgICAgIHJldHVybiBHZXRGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLkdldChkZWZhdWx0X3B0cik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gICAgcmV0dXJuIEdldEVtcHR5U3RyaW5nKCk7ICAvLyBNYWtlIGNvbXBpbGVyIGhhcHB5LgotICB9Ci19Ci0KLWNvbnN0IHN0cmluZyYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFN0cmluZ1JlZmVyZW5jZSgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHN0cmluZyogc2NyYXRjaCkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoR2V0U3RyaW5nUmVmZXJlbmNlLCBTSU5HVUxBUiwgU1RSSU5HKTsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0U3RyaW5nKGZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgotICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogewotICAgICAgICBjb25zdCBzdHJpbmcqIGRlZmF1bHRfcHRyID0KLSAgICAgICAgICAgICZEZWZhdWx0UmF3PEFyZW5hU3RyaW5nUHRyPihmaWVsZCkuR2V0KE5VTEwpOwotICAgICAgICByZXR1cm4gR2V0RmllbGQ8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKS5HZXQoZGVmYXVsdF9wdHIpOwotICAgICAgfQotICAgIH0KLQotICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICAgIHJldHVybiBHZXRFbXB0eVN0cmluZygpOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KLSAgfQotfQotCi0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldFN0cmluZygKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfQUxMKFNldFN0cmluZywgU0lOR1VMQVIsIFNUUklORyk7Ci0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICByZXR1cm4gTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0U3RyaW5nKGZpZWxkLT5udW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT50eXBlKCksIHZhbHVlLCBmaWVsZCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgotICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogewotICAgICAgICBjb25zdCBzdHJpbmcqIGRlZmF1bHRfcHRyID0KLSAgICAgICAgICAgICZEZWZhdWx0UmF3PEFyZW5hU3RyaW5nUHRyPihmaWVsZCkuR2V0KE5VTEwpOwotICAgICAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAmJiAhSGFzT25lb2ZGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7Ci0gICAgICAgICAgQ2xlYXJPbmVvZihtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKLSAgICAgICAgICBNdXRhYmxlRmllbGQ8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKS0+VW5zYWZlU2V0RGVmYXVsdCgKLSAgICAgICAgICAgICAgZGVmYXVsdF9wdHIpOwotICAgICAgICB9Ci0gICAgICAgIE11dGFibGVGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLT5TZXQoZGVmYXVsdF9wdHIsCi0gICAgICAgICAgICB2YWx1ZSwgR2V0QXJlbmEobWVzc2FnZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotCi1zdHJpbmcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJlcGVhdGVkU3RyaW5nKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRTdHJpbmcsIFJFUEVBVEVELCBTVFJJTkcpOwotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZFN0cmluZyhmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICByZXR1cm4gR2V0UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCk7Ci0gICAgfQotCi0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gICAgcmV0dXJuIEdldEVtcHR5U3RyaW5nKCk7ICAvLyBNYWtlIGNvbXBpbGVyIGhhcHB5LgotICB9Ci19Ci0KLWNvbnN0IHN0cmluZyYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgaW50IGluZGV4LCBzdHJpbmcqIHNjcmF0Y2gpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfQUxMKEdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlLCBSRVBFQVRFRCwgU1RSSU5HKTsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0UmVwZWF0ZWRTdHJpbmcoZmllbGQtPm51bWJlcigpLCBpbmRleCk7Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgotICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKLSAgICAgICAgcmV0dXJuIEdldFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPihtZXNzYWdlLCBmaWVsZCwgaW5kZXgpOwotICAgIH0KLQotICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICAgIHJldHVybiBHZXRFbXB0eVN0cmluZygpOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KLSAgfQotfQotCi0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldFJlcGVhdGVkU3RyaW5nKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgaW50IGluZGV4LCBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChTZXRSZXBlYXRlZFN0cmluZywgUkVQRUFURUQsIFNUUklORyk7Ci0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5TZXRSZXBlYXRlZFN0cmluZygKLSAgICAgIGZpZWxkLT5udW1iZXIoKSwgaW5kZXgsIHZhbHVlKTsKLSAgfSBlbHNlIHsKLSAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAqTXV0YWJsZVJlcGVhdGVkRmllbGQ8c3RyaW5nPihtZXNzYWdlLCBmaWVsZCwgaW5kZXgpID0gdmFsdWU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZFN0cmluZygKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfQUxMKEFkZFN0cmluZywgUkVQRUFURUQsIFNUUklORyk7Ci0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5BZGRTdHJpbmcoZmllbGQtPm51bWJlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+dHlwZSgpLCB2YWx1ZSwgZmllbGQpOwotICB9IGVsc2UgewotICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7Ci0gICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KLSAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICpBZGRGaWVsZDxzdHJpbmc+KG1lc3NhZ2UsIGZpZWxkKSA9IHZhbHVlOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlubGluZSBib29sIENyZWF0ZVVua25vd25FbnVtVmFsdWVzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIHJldHVybiBmaWxlLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKLX0KLQotY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEVudW0oCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICAvLyBVc2FnZSBjaGVja2VkIGJ5IEdldEVudW1WYWx1ZS4KLSAgaW50IHZhbHVlID0gR2V0RW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkKTsKLSAgcmV0dXJuIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSk7Ci19Ci0KLWludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0RW51bVZhbHVlKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfQUxMKEdldEVudW1WYWx1ZSwgU0lOR1VMQVIsIEVOVU0pOwotCi0gIGludDMyIHZhbHVlOwotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgdmFsdWUgPSBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0RW51bSgKLSAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFsdWUgPSBHZXRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkKTsKLSAgfQotICByZXR1cm4gdmFsdWU7Ci19Ci0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEVudW0oCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgewotICAvLyBVc2FnZSBjaGVja2VkIGJ5IFNldEVudW1WYWx1ZS4KLSAgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShTZXRFbnVtKTsKLSAgU2V0RW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLT5udW1iZXIoKSk7Ci19Ci0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEVudW1WYWx1ZSgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGludCB2YWx1ZSkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoU2V0RW51bVZhbHVlLCBTSU5HVUxBUiwgRU5VTSk7Ci0gIGlmICghQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyB2YWxpZCBpZiB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBzdG9yYWdlIG9mCi0gICAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjID0KLSAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7Ci0gICAgaWYgKHZhbHVlX2Rlc2MgPT0gTlVMTCkgewotICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJTZXRFbnVtVmFsdWUgYWNjZXB0cyBvbmx5IHZhbGlkIGludGVnZXIgdmFsdWVzOiB2YWx1ZSAiCi0gICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiIHVuZXhwZWN0ZWQgZm9yIGZpZWxkICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOwotICAgICAgLy8gSW4gcHJvZHVjdGlvbiBidWlsZHMsIERGQVRBTCB3aWxsIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIHNvIHdlIGhhdmUKLSAgICAgIC8vIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlOiBqdXN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKTsKLSAgICB9Ci0gIH0KLSAgU2V0RW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0RW51bVZhbHVlSW50ZXJuYWwoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBpbnQgdmFsdWUpIGNvbnN0IHsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldEVudW0oZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICBTZXRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7Ci0gIH0KLX0KLQotY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJlcGVhdGVkRW51bSgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKLSAgLy8gVXNhZ2UgY2hlY2tlZCBieSBHZXRSZXBlYXRlZEVudW1WYWx1ZS4KLSAgaW50IHZhbHVlID0gR2V0UmVwZWF0ZWRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIGluZGV4KTsKLSAgcmV0dXJuIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSk7Ci19Ci0KLWludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRFbnVtVmFsdWUoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZEVudW1WYWx1ZSwgUkVQRUFURUQsIEVOVU0pOwotCi0gIGludCB2YWx1ZTsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHZhbHVlID0gR2V0RXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLkdldFJlcGVhdGVkRW51bShmaWVsZC0+bnVtYmVyKCksIGluZGV4KTsKLSAgfSBlbHNlIHsKLSAgICB2YWx1ZSA9IEdldFJlcGVhdGVkRmllbGQ8aW50PihtZXNzYWdlLCBmaWVsZCwgaW5kZXgpOwotICB9Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRFbnVtKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCB7Ci0gIC8vIFVzYWdlIGNoZWNrZWQgYnkgU2V0UmVwZWF0ZWRFbnVtVmFsdWUuCi0gIFVTQUdFX0NIRUNLX0VOVU1fVkFMVUUoU2V0UmVwZWF0ZWRFbnVtKTsKLSAgU2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgaW5kZXgsIHZhbHVlLT5udW1iZXIoKSk7Ci19Ci0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldFJlcGVhdGVkRW51bVZhbHVlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAotICAgIGludCB2YWx1ZSkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoU2V0UmVwZWF0ZWRFbnVtLCBSRVBFQVRFRCwgRU5VTSk7Ci0gIGlmICghQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyB2YWxpZCBpZiB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBzdG9yYWdlIG9mCi0gICAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjID0KLSAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7Ci0gICAgaWYgKHZhbHVlX2Rlc2MgPT0gTlVMTCkgewotICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJTZXRSZXBlYXRlZEVudW1WYWx1ZSBhY2NlcHRzIG9ubHkgdmFsaWQgaW50ZWdlciB2YWx1ZXM6ICIKLSAgICAgICAgICAgICAgICAgIDw8ICJ2YWx1ZSAiIDw8IHZhbHVlIDw8ICIgdW5leHBlY3RlZCBmb3IgZmllbGQgIgotICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOwotICAgICAgLy8gSW4gcHJvZHVjdGlvbiBidWlsZHMsIERGQVRBTCB3aWxsIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIHNvIHdlIGhhdmUKLSAgICAgIC8vIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlOiBqdXN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKTsKLSAgICB9Ci0gIH0KLSAgU2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgaW5kZXgsIHZhbHVlKTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKLSAgICBpbnQgdmFsdWUpIGNvbnN0IHsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkRW51bSgKLSAgICAgIGZpZWxkLT5udW1iZXIoKSwgaW5kZXgsIHZhbHVlKTsKLSAgfSBlbHNlIHsKLSAgICBTZXRSZXBlYXRlZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIGluZGV4LCB2YWx1ZSk7Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkRW51bSgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCB7Ci0gIC8vIFVzYWdlIGNoZWNrZWQgYnkgQWRkRW51bVZhbHVlLgotICBVU0FHRV9DSEVDS19FTlVNX1ZBTFVFKEFkZEVudW0pOwotICBBZGRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgdmFsdWUtPm51bWJlcigpKTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkRW51bVZhbHVlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgaW50IHZhbHVlKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChBZGRFbnVtLCBSRVBFQVRFRCwgRU5VTSk7Ci0gIGlmICghQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyB2YWxpZCBpZiB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBzdG9yYWdlIG9mCi0gICAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjID0KLSAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7Ci0gICAgaWYgKHZhbHVlX2Rlc2MgPT0gTlVMTCkgewotICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJBZGRFbnVtVmFsdWUgYWNjZXB0cyBvbmx5IHZhbGlkIGludGVnZXIgdmFsdWVzOiB2YWx1ZSAiCi0gICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiIHVuZXhwZWN0ZWQgZm9yIGZpZWxkICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOwotICAgICAgLy8gSW4gcHJvZHVjdGlvbiBidWlsZHMsIERGQVRBTCB3aWxsIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIHNvIHdlIGhhdmUKLSAgICAgIC8vIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlOiBqdXN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZS4KLSAgICAgIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKTsKLSAgICB9Ci0gIH0KLSAgQWRkRW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkRW51bVZhbHVlSW50ZXJuYWwoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBpbnQgdmFsdWUpIGNvbnN0IHsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZEVudW0oZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBmaWVsZCk7Ci0gIH0gZWxzZSB7Ci0gICAgQWRkRmllbGQ8aW50PihtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOwotICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY29uc3QgTWVzc2FnZSYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldE1lc3NhZ2UoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoR2V0TWVzc2FnZSwgU0lOR1VMQVIsIE1FU1NBR0UpOwotCi0gIGlmIChmYWN0b3J5ID09IE5VTEwpIGZhY3RvcnkgPSBtZXNzYWdlX2ZhY3RvcnlfOwotCi0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTWVzc2FnZSY+KAotICAgICAgICBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0TWVzc2FnZSgKLSAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgZmFjdG9yeSkpOwotICB9IGVsc2UgewotICAgIGNvbnN0IE1lc3NhZ2UqIHJlc3VsdDsKLSAgICByZXN1bHQgPSBHZXRSYXc8Y29uc3QgTWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAgIHJlc3VsdCA9IERlZmF1bHRSYXc8Y29uc3QgTWVzc2FnZSo+KGZpZWxkKTsKLSAgICB9Ci0gICAgcmV0dXJuICpyZXN1bHQ7Ci0gIH0KLX0KLQotTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVNZXNzYWdlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfQUxMKE11dGFibGVNZXNzYWdlLCBTSU5HVUxBUiwgTUVTU0FHRSk7Ci0KLSAgaWYgKGZhY3RvcnkgPT0gTlVMTCkgZmFjdG9yeSA9IG1lc3NhZ2VfZmFjdG9yeV87Ci0KLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCi0gICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVNZXNzYWdlKGZpZWxkLCBmYWN0b3J5KSk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVzc2FnZSogcmVzdWx0OwotICAgIE1lc3NhZ2UqKiByZXN1bHRfaG9sZGVyID0gTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOwotCi0gICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgIGlmICghSGFzT25lb2ZGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7Ci0gICAgICAgIENsZWFyT25lb2YobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7Ci0gICAgICAgIHJlc3VsdF9ob2xkZXIgPSBNdXRhYmxlRmllbGQ8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICAgICAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9tZXNzYWdlID0gRGVmYXVsdFJhdzxjb25zdCBNZXNzYWdlKj4oZmllbGQpOwotICAgICAgICAqcmVzdWx0X2hvbGRlciA9IGRlZmF1bHRfbWVzc2FnZS0+TmV3KG1lc3NhZ2UtPkdldEFyZW5hKCkpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBTZXRCaXQobWVzc2FnZSwgZmllbGQpOwotICAgIH0KLQotICAgIGlmICgqcmVzdWx0X2hvbGRlciA9PSBOVUxMKSB7Ci0gICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X21lc3NhZ2UgPSBEZWZhdWx0UmF3PGNvbnN0IE1lc3NhZ2UqPihmaWVsZCk7Ci0gICAgICAqcmVzdWx0X2hvbGRlciA9IGRlZmF1bHRfbWVzc2FnZS0+TmV3KG1lc3NhZ2UtPkdldEFyZW5hKCkpOwotICAgIH0KLSAgICByZXN1bHQgPSAqcmVzdWx0X2hvbGRlcjsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19Ci0KLXZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZSgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLAotICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfQUxMKFNldEFsbG9jYXRlZE1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKLQotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0QWxsb2NhdGVkTWVzc2FnZSgKLSAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCBmaWVsZCwgc3ViX21lc3NhZ2UpOwotICB9IGVsc2UgewotICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7Ci0gICAgICBpZiAoc3ViX21lc3NhZ2UgPT0gTlVMTCkgewotICAgICAgICBDbGVhck9uZW9mKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9Ci0gICAgICAgIENsZWFyT25lb2YobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7Ci0gICAgICAgICpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCkgPSBzdWJfbWVzc2FnZTsKLSAgICAgIFNldE9uZW9mQ2FzZShtZXNzYWdlLCBmaWVsZCk7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKHN1Yl9tZXNzYWdlID09IE5VTEwpIHsKLSAgICAgIENsZWFyQml0KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICB9IGVsc2UgewotICAgICAgU2V0Qml0KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICB9Ci0gICAgTWVzc2FnZSoqIHN1Yl9tZXNzYWdlX2hvbGRlciA9IE11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICBpZiAoR2V0QXJlbmEobWVzc2FnZSkgPT0gTlVMTCkgewotICAgICAgZGVsZXRlICpzdWJfbWVzc2FnZV9ob2xkZXI7Ci0gICAgfQotICAgICpzdWJfbWVzc2FnZV9ob2xkZXIgPSBzdWJfbWVzc2FnZTsKLSAgfQotfQotCi12b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRBbGxvY2F0ZWRNZXNzYWdlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgTWVzc2FnZSogc3ViX21lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICAvLyBJZiBtZXNzYWdlIGFuZCBzdWItbWVzc2FnZSBhcmUgaW4gZGlmZmVyZW50IG1lbW9yeSBvd25lcnNoaXAgZG9tYWlucwotICAvLyAoZGlmZmVyZW50IGFyZW5hcywgb3Igb25lIGlzIG9uIGhlYXAgYW5kIG9uZSBpcyBub3QpLCB0aGVuIHdlIG1heSBuZWVkIHRvCi0gIC8vIGRvIGEgY29weS4KLSAgaWYgKHN1Yl9tZXNzYWdlICE9IE5VTEwgJiYKLSAgICAgIHN1Yl9tZXNzYWdlLT5HZXRBcmVuYSgpICE9IG1lc3NhZ2UtPkdldEFyZW5hKCkpIHsKLSAgICBpZiAoc3ViX21lc3NhZ2UtPkdldEFyZW5hKCkgPT0gTlVMTCAmJiBtZXNzYWdlLT5HZXRBcmVuYSgpICE9IE5VTEwpIHsKLSAgICAgIC8vIENhc2UgMTogcGFyZW50IGlzIG9uIGFuIGFyZW5hIGFuZCBjaGlsZCBpcyBoZWFwLWFsbG9jYXRlZC4gV2UgY2FuIGFkZAotICAgICAgLy8gdGhlIGNoaWxkIHRvIHRoZSBhcmVuYSdzIE93bigpIGxpc3QgdG8gZnJlZSBvbiBhcmVuYSBkZXN0cnVjdGlvbiwgdGhlbgotICAgICAgLy8gc2V0IG91ciBwb2ludGVyLgotICAgICAgbWVzc2FnZS0+R2V0QXJlbmEoKS0+T3duKHN1Yl9tZXNzYWdlKTsKLSAgICAgIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBzdWJfbWVzc2FnZSwgZmllbGQpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBDYXNlIDI6IGFsbCBvdGhlciBjYXNlcy4gV2UgbmVlZCB0byBtYWtlIGEgY29weS4gTXV0YWJsZU1lc3NhZ2UoKSB3aWxsCi0gICAgICAvLyBlaXRoZXIgZ2V0IHRoZSBleGlzdGluZyBtZXNzYWdlIG9iamVjdCwgb3IgaW5zdGFudGlhdGUgYSBuZXcgb25lIGFzCi0gICAgICAvLyBhcHByb3ByaWF0ZSB3LnIudC4gb3VyIGFyZW5hLgotICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2VfY29weSA9IE11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKTsKLSAgICAgIHN1Yl9tZXNzYWdlX2NvcHktPkNvcHlGcm9tKCpzdWJfbWVzc2FnZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIFNhbWUgbWVtb3J5IG93bmVyc2hpcCBkb21haW5zLgotICAgIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBzdWJfbWVzc2FnZSwgZmllbGQpOwotICB9Ci19Ci0KLU1lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpVbnNhZmVBcmVuYVJlbGVhc2VNZXNzYWdlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoUmVsZWFzZU1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKLQotICBpZiAoZmFjdG9yeSA9PSBOVUxMKSBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5XzsKLQotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKLSAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+UmVsZWFzZU1lc3NhZ2UoZmllbGQsIGZhY3RvcnkpKTsKLSAgfSBlbHNlIHsKLSAgICBDbGVhckJpdChtZXNzYWdlLCBmaWVsZCk7Ci0gICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKLSAgICAgIGlmIChIYXNPbmVvZkZpZWxkKCptZXNzYWdlLCBmaWVsZCkpIHsKLSAgICAgICAgKk11dGFibGVPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgPSAwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICB9Ci0gICAgfQotICAgIE1lc3NhZ2UqKiByZXN1bHQgPSBNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7Ci0gICAgTWVzc2FnZSogcmV0ID0gKnJlc3VsdDsKLSAgICAqcmVzdWx0ID0gTlVMTDsKLSAgICByZXR1cm4gcmV0OwotICB9Ci19Ci0KLU1lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpSZWxlYXNlTWVzc2FnZSgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKLSAgTWVzc2FnZSogcmVsZWFzZWQgPSBVbnNhZmVBcmVuYVJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBmYWN0b3J5KTsKLSAgaWYgKEdldEFyZW5hKG1lc3NhZ2UpICE9IE5VTEwgJiYgcmVsZWFzZWQgIT0gTlVMTCkgewotICAgIE1lc3NhZ2UqIGNvcHlfZnJvbV9hcmVuYSA9IHJlbGVhc2VkLT5OZXcoKTsKLSAgICBjb3B5X2Zyb21fYXJlbmEtPkNvcHlGcm9tKCpyZWxlYXNlZCk7Ci0gICAgcmVsZWFzZWQgPSBjb3B5X2Zyb21fYXJlbmE7Ci0gIH0KLSAgcmV0dXJuIHJlbGVhc2VkOwotfQotCi1jb25zdCBNZXNzYWdlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRNZXNzYWdlKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7Ci0KLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBNZXNzYWdlJj4oCi0gICAgICAgIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZE1lc3NhZ2UoZmllbGQtPm51bWJlcigpLCBpbmRleCkpOwotICB9IGVsc2UgewotICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICByZXR1cm4gR2V0UmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCi0gICAgICAgICAgLkdldFJlcGVhdGVkRmllbGQoKQotICAgICAgICAgIC5HZXQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oaW5kZXgpOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gR2V0UmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKLSAgICAgICAgICAuR2V0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KGluZGV4KTsKLSAgICB9Ci0gIH0KLX0KLQotTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZE1lc3NhZ2UoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7Ci0KLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCi0gICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UoCi0gICAgICAgICAgZmllbGQtPm51bWJlcigpLCBpbmRleCkpOwotICB9IGVsc2UgewotICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICByZXR1cm4gTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQotICAgICAgICAgIC0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKQotICAgICAgICAgIC0+TXV0YWJsZTxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihpbmRleCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKLSAgICAgICAgLT5NdXRhYmxlPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KGluZGV4KTsKLSAgICB9Ci0gIH0KLX0KLQotTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZE1lc3NhZ2UoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoQWRkTWVzc2FnZSwgUkVQRUFURUQsIE1FU1NBR0UpOwotCi0gIGlmIChmYWN0b3J5ID09IE5VTEwpIGZhY3RvcnkgPSBtZXNzYWdlX2ZhY3RvcnlfOwotCi0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8TWVzc2FnZSo+KAotICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5BZGRNZXNzYWdlKGZpZWxkLCBmYWN0b3J5KSk7Ci0gIH0gZWxzZSB7Ci0gICAgTWVzc2FnZSogcmVzdWx0ID0gTlVMTDsKLQotICAgIC8vIFdlIGNhbid0IHVzZSBBZGRGaWVsZDxNZXNzYWdlPigpIGJlY2F1c2UgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZG9lc24ndAotICAgIC8vIGtub3cgaG93IHRvIGFsbG9jYXRlIG9uZS4KLSAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZSogcmVwZWF0ZWQgPSBOVUxMOwotICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7Ci0gICAgICByZXBlYXRlZCA9Ci0gICAgICAgICAgTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKS0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKTsKLSAgICB9IGVsc2UgewotICAgICAgcmVwZWF0ZWQgPSBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCk7Ci0gICAgfQotICAgIHJlc3VsdCA9IHJlcGVhdGVkLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOwotICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgLy8gV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBvYmplY3QuCi0gICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGU7Ci0gICAgICBpZiAocmVwZWF0ZWQtPnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHByb3RvdHlwZSA9IGZhY3RvcnktPkdldFByb3RvdHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJvdG90eXBlID0gJnJlcGVhdGVkLT5HZXQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oMCk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgPSBwcm90b3R5cGUtPk5ldyhtZXNzYWdlLT5HZXRBcmVuYSgpKTsKLSAgICAgIC8vIFdlIGNhbiBndWFyYW50ZWUgaGVyZSB0aGF0IHJlcGVhdGVkIGFuZCByZXN1bHQgYXJlIGVpdGhlciBib3RoIGhlYXAKLSAgICAgIC8vIGFsbG9jYXRlZCBvciBhcmVuYSBvd25lZC4gU28gaXQgaXMgc2FmZSB0byBjYWxsIHRoZSB1bnNhZmUgdmVyc2lvbgotICAgICAgLy8gb2YgQWRkQWxsb2NhdGVkLgotICAgICAgcmVwZWF0ZWQtPlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KHJlc3VsdCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi12b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpBZGRBbGxvY2F0ZWRNZXNzYWdlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgTWVzc2FnZSogbmV3X2VudHJ5KSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChBZGRBbGxvY2F0ZWRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7Ci0KLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZEFsbG9jYXRlZE1lc3NhZ2UoZmllbGQsIG5ld19lbnRyeSk7Ci0gIH0gZWxzZSB7Ci0gICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIHJlcGVhdGVkID0gTlVMTDsKLSAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgewotICAgICAgcmVwZWF0ZWQgPQotICAgICAgICAgIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCktPk11dGFibGVSZXBlYXRlZEZpZWxkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJlcGVhdGVkID0gTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpOwotICAgIH0KLSAgICByZXBlYXRlZC0+QWRkQWxsb2NhdGVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KG5ld19lbnRyeSk7Ci0gIH0KLX0KLQotdm9pZCogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcHR5cGUsCi0gICAgaW50IGN0eXBlLCBjb25zdCBEZXNjcmlwdG9yKiBkZXNjKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX1JFUEVBVEVEKCJNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCIpOwotICBpZiAoZmllbGQtPmNwcF90eXBlKCkgIT0gY3BwdHlwZSkKLSAgICBSZXBvcnRSZWZsZWN0aW9uVXNhZ2VUeXBlRXJyb3IoZGVzY3JpcHRvcl8sCi0gICAgICAgIGZpZWxkLCAiTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQiLCBjcHB0eXBlKTsKLSAgaWYgKGN0eXBlID49IDApCi0gICAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSwgY3R5cGUpIDw8ICJzdWJ0eXBlIG1pc21hdGNoIjsKLSAgaWYgKGRlc2MgIT0gTlVMTCkKLSAgICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBkZXNjKSA8PCAid3Jvbmcgc3VibWVzc2FnZSB0eXBlIjsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCBmaWVsZC0+aXNfcGFja2VkKCksIGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBUcmlnZ2VyIHRyYW5zZm9ybSBmb3IgTWFwRmllbGQKLSAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgewotICAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8TWFwRmllbGRCYXNlKj4ocmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXSkKLSAgICAgICAgICAtPk11dGFibGVSZXBlYXRlZEZpZWxkKCk7Ci0gICAgfQotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV07Ci0gIH0KLX0KLQotY29uc3Qgdm9pZCogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJhd1JlcGVhdGVkRmllbGQoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgY3BwdHlwZSwKLSAgICBpbnQgY3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfUkVQRUFURUQoIkdldFJhd1JlcGVhdGVkRmllbGQiKTsKLSAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IGNwcHR5cGUpCi0gICAgUmVwb3J0UmVmbGVjdGlvblVzYWdlVHlwZUVycm9yKGRlc2NyaXB0b3JfLAotICAgICAgICBmaWVsZCwgIkdldFJhd1JlcGVhdGVkRmllbGQiLCBjcHB0eXBlKTsKLSAgaWYgKGN0eXBlID49IDApCi0gICAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSwgY3R5cGUpIDw8ICJzdWJ0eXBlIG1pc21hdGNoIjsKLSAgaWYgKGRlc2MgIT0gTlVMTCkKLSAgICBHT09HTEVfQ0hFQ0tfRVEoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBkZXNjKSA8PCAid3Jvbmcgc3VibWVzc2FnZSB0eXBlIjsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIC8vIFNob3VsZCB1c2UgZXh0ZW5zaW9uX3NldDo6R2V0UmF3UmVwZWF0ZWRGaWVsZC4gSG93ZXZlciwgdGhlIHJlcXVpcmVkCi0gICAgLy8gcGFyYW1ldGVyICJkZWZhdWx0IHJlcGVhdGVkIHZhbHVlIiBpcyBub3QgdmVyeSBlYXN5IHRvIGdldCBoZXJlLgotICAgIC8vIE1hcCBpcyBub3Qgc3VwcG9ydGVkIGluIGV4dGVuc2lvbnMsIGl0IGlzIGFjY2VwdGFibGUgdG8gdXNlCi0gICAgLy8gZXh0ZW5zaW9uX3NldDo6TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQgd2hpY2ggZG9lcyBub3QgY2hhbmdlIHRoZSBtZXNzYWdlLgotICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSkKLSAgICAgICAgLT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCBmaWVsZC0+aXNfcGFja2VkKCksIGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBUcmlnZ2VyIHRyYW5zZm9ybSBmb3IgTWFwRmllbGQKLSAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgewotICAgICAgcmV0dXJuICYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBNYXBGaWVsZEJhc2UqPigKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oJm1lc3NhZ2UpICsKLSAgICAgICAgICBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV0pLT5HZXRSZXBlYXRlZEZpZWxkKCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArIG9mZnNldHNfW2ZpZWxkLT5pbmRleCgpXTsKLSAgfQotfQotCi1jb25zdCBGaWVsZERlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3QgewotICB1aW50MzIgZmllbGRfbnVtYmVyID0gR2V0T25lb2ZDYXNlKG1lc3NhZ2UsIG9uZW9mX2Rlc2NyaXB0b3IpOwotICBpZiAoZmllbGRfbnVtYmVyID09IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICByZXR1cm4gZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TnVtYmVyKGZpZWxkX251bWJlcik7Ci19Ci0KLWJvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkNvbnRhaW5zTWFwS2V5KAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBjb25zdCBNYXBLZXkmIGtleSkgY29uc3QgewotICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLAotICAgICAgICAgICAgICAiTG9va3VwTWFwVmFsdWUiLAotICAgICAgICAgICAgICAiRmllbGQgaXMgbm90IGEgbWFwIGZpZWxkLiIpOwotICByZXR1cm4gR2V0UmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLkNvbnRhaW5zTWFwS2V5KGtleSk7Ci19Ci0KLWJvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Okluc2VydE9yTG9va3VwTWFwVmFsdWUoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGNvbnN0IE1hcEtleSYga2V5LAotICAgIE1hcFZhbHVlUmVmKiB2YWwpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0soSXNNYXBGaWVsZEluQXBpKGZpZWxkKSwKLSAgICAgICAgICAgICAgIkluc2VydE9yTG9va3VwTWFwVmFsdWUiLAotICAgICAgICAgICAgICAiRmllbGQgaXMgbm90IGEgbWFwIGZpZWxkLiIpOwotICB2YWwtPlNldFR5cGUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5GaW5kRmllbGRCeU5hbWUoInZhbHVlIiktPmNwcF90eXBlKCkpOwotICByZXR1cm4gTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKS0+SW5zZXJ0T3JMb29rdXBNYXBWYWx1ZSgKLSAgICAgIGtleSwgdmFsKTsKLX0KLQotYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6RGVsZXRlTWFwVmFsdWUoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGNvbnN0IE1hcEtleSYga2V5KSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksCi0gICAgICAgICAgICAgICJEZWxldGVNYXBWYWx1ZSIsCi0gICAgICAgICAgICAgICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7Ci0gIHJldHVybiBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLT5EZWxldGVNYXBWYWx1ZShrZXkpOwotfQotCi1NYXBJdGVyYXRvciBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TWFwQmVnaW4oCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksCi0gICAgICAgICAgICAgICJNYXBCZWdpbiIsCi0gICAgICAgICAgICAgICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7Ci0gIE1hcEl0ZXJhdG9yIGl0ZXIobWVzc2FnZSwgZmllbGQpOwotICBHZXRSYXc8TWFwRmllbGRCYXNlPigqbWVzc2FnZSwgZmllbGQpLk1hcEJlZ2luKCZpdGVyKTsKLSAgcmV0dXJuIGl0ZXI7Ci19Ci0KLU1hcEl0ZXJhdG9yIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNYXBFbmQoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksCi0gICAgICAgICAgICAgICJNYXBFbmQiLAotICAgICAgICAgICAgICAiRmllbGQgaXMgbm90IGEgbWFwIGZpZWxkLiIpOwotICBNYXBJdGVyYXRvciBpdGVyKG1lc3NhZ2UsIGZpZWxkKTsKLSAgR2V0UmF3PE1hcEZpZWxkQmFzZT4oKm1lc3NhZ2UsIGZpZWxkKS5NYXBFbmQoJml0ZXIpOwotICByZXR1cm4gaXRlcjsKLX0KLQotaW50IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNYXBTaXplKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLAotICAgICAgICAgICAgICAiTWFwU2l6ZSIsCi0gICAgICAgICAgICAgICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7Ci0gIHJldHVybiBHZXRSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkuc2l6ZSgpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jb25zdCBGaWVsZERlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpGaW5kS25vd25FeHRlbnNpb25CeU5hbWUoCi0gICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7Ci0gIGlmIChleHRlbnNpb25zX29mZnNldF8gPT0gLTEpIHJldHVybiBOVUxMOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0gZGVzY3JpcHRvcl9wb29sXy0+RmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lKTsKLSAgaWYgKHJlc3VsdCAhPSBOVUxMICYmIHJlc3VsdC0+Y29udGFpbmluZ190eXBlKCkgPT0gZGVzY3JpcHRvcl8pIHsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIC8vIE1lc3NhZ2VTZXQgZXh0ZW5zaW9ucyBtYXkgYmUgaWRlbnRpZmllZCBieSB0eXBlIG5hbWUuCi0gICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IGRlc2NyaXB0b3JfcG9vbF8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShuYW1lKTsKLSAgICBpZiAodHlwZSAhPSBOVUxMKSB7Ci0gICAgICAvLyBMb29rIGZvciBhIG1hdGNoaW5nIGV4dGVuc2lvbiBpbiB0aGUgZm9yZWlnbiB0eXBlJ3Mgc2NvcGUuCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24gPSB0eXBlLT5leHRlbnNpb24oaSk7Ci0gICAgICAgIGlmIChleHRlbnNpb24tPmNvbnRhaW5pbmdfdHlwZSgpID09IGRlc2NyaXB0b3JfICYmCi0gICAgICAgICAgICBleHRlbnNpb24tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSAmJgotICAgICAgICAgICAgZXh0ZW5zaW9uLT5pc19vcHRpb25hbCgpICYmCi0gICAgICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdHlwZSgpID09IHR5cGUpIHsKLSAgICAgICAgICAvLyBGb3VuZCBpdC4KLSAgICAgICAgICByZXR1cm4gZXh0ZW5zaW9uOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLWNvbnN0IEZpZWxkRGVzY3JpcHRvciogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKAotICAgIGludCBudW1iZXIpIGNvbnN0IHsKLSAgaWYgKGV4dGVuc2lvbnNfb2Zmc2V0XyA9PSAtMSkgcmV0dXJuIE5VTEw7Ci0gIHJldHVybiBkZXNjcmlwdG9yX3Bvb2xfLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZGVzY3JpcHRvcl8sIG51bWJlcik7Ci19Ci0KLWJvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSBjb25zdCB7Ci0gIHJldHVybiBDcmVhdGVVbmtub3duRW51bVZhbHVlcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gU29tZSBwcml2YXRlIGhlbHBlcnMuCi0KLS8vIFRoZXNlIHNpbXBsZSB0ZW1wbGF0ZSBhY2Nlc3NvcnMgb2J0YWluIHBvaW50ZXJzIChvciByZWZlcmVuY2VzKSB0bwotLy8gdGhlIGdpdmVuIGZpZWxkLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1pbmxpbmUgY29uc3QgVHlwZSYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFJhdygKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpICYmICFIYXNPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgewotICAgIHJldHVybiBEZWZhdWx0UmF3PFR5cGU+KGZpZWxkKTsKLSAgfQotICBpbnQgaW5kZXggPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID8KLSAgICAgIGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKSA6Ci0gICAgICBmaWVsZC0+aW5kZXgoKTsKLSAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArCi0gICAgICBvZmZzZXRzX1tpbmRleF07Ci0gIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUeXBlKj4ocHRyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1pbmxpbmUgVHlwZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVSYXcoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBpbnQgaW5kZXggPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID8KLSAgICAgIGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKSA6Ci0gICAgICBmaWVsZC0+aW5kZXgoKTsKLSAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgb2Zmc2V0c19baW5kZXhdOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxUeXBlKj4ocHRyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1pbmxpbmUgY29uc3QgVHlwZSYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkRlZmF1bHRSYXcoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBjb25zdCB2b2lkKiBwdHIgPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID8KLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkZWZhdWx0X29uZW9mX2luc3RhbmNlXykgKwotICAgICAgb2Zmc2V0c19bZmllbGQtPmluZGV4KCldIDoKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkZWZhdWx0X2luc3RhbmNlXykgKwotICAgICAgb2Zmc2V0c19bZmllbGQtPmluZGV4KCldOwotICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVHlwZSo+KHB0cik7Ci19Ci0KLWlubGluZSBjb25zdCB1aW50MzIqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRIYXNCaXRzKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKLSAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHsgIC8vIHByb3RvMyB3aXRoIG5vIGhhcy1iaXRzLgotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKyBoYXNfYml0c19vZmZzZXRfOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIqPihwdHIpOwotfQotaW5saW5lIHVpbnQzMiogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVIYXNCaXRzKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKLSAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBoYXNfYml0c19vZmZzZXRfOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50MzIqPihwdHIpOwotfQotCi1pbmxpbmUgdWludDMyIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRPbmVvZkNhc2UoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKLSAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKQotICAgICAgKyBvbmVvZl9jYXNlX29mZnNldF87Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMio+KHB0cilbb25lb2ZfZGVzY3JpcHRvci0+aW5kZXgoKV07Ci19Ci0KLWlubGluZSB1aW50MzIqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNdXRhYmxlT25lb2ZDYXNlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdCB7Ci0gIHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArIG9uZW9mX2Nhc2Vfb2Zmc2V0XzsKLSAgcmV0dXJuICYocmVpbnRlcnByZXRfY2FzdDx1aW50MzIqPihwdHIpW29uZW9mX2Rlc2NyaXB0b3ItPmluZGV4KCldKTsKLX0KLQotaW5saW5lIGNvbnN0IEV4dGVuc2lvblNldCYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEV4dGVuc2lvblNldCgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTkUoZXh0ZW5zaW9uc19vZmZzZXRfLCAtMSk7Ci0gIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKwotICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zX29mZnNldF87Ci0gIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBFeHRlbnNpb25TZXQqPihwdHIpOwotfQotaW5saW5lIEV4dGVuc2lvblNldCogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVFeHRlbnNpb25TZXQoCi0gICAgTWVzc2FnZSogbWVzc2FnZSkgY29uc3QgewotICBHT09HTEVfRENIRUNLX05FKGV4dGVuc2lvbnNfb2Zmc2V0XywgLTEpOwotICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBleHRlbnNpb25zX29mZnNldF87Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PEV4dGVuc2lvblNldCo+KHB0cik7Ci19Ci0KLWlubGluZSBBcmVuYSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEFyZW5hKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKLSAgaWYgKGFyZW5hX29mZnNldF8gPT0ga05vQXJlbmFQb2ludGVyKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBpZiAodW5rbm93bl9maWVsZHNfb2Zmc2V0XyA9PSBrVW5rbm93bkZpZWxkU2V0SW5NZXRhZGF0YSkgewotICAgIC8vIHplcm8tb3ZlcmhlYWQgYXJlbmEgcG9pbnRlciBvdmVybG9hZGluZyBVbmtub3duRmllbGRzCi0gICAgcmV0dXJuIEdldEludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEoKm1lc3NhZ2UpLmFyZW5hKCk7Ci0gIH0KLQotICAvLyBCYXNlbGluZSBjYXNlOiBtZXNzYWdlIGNsYXNzIGhhcyBhIGRlZGljYXRlZCBhcmVuYSBwb2ludGVyLgotICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBhcmVuYV9vZmZzZXRfOwotICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QXJlbmEqKj4ocHRyKTsKLX0KLQotaW5saW5lIGNvbnN0IEludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEmCi1HZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7Ci0gIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKyBhcmVuYV9vZmZzZXRfOwotICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSo+KHB0cik7Ci19Ci0KLWlubGluZSBJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKgotR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKLSAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgYXJlbmFfb2Zmc2V0XzsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSo+KHB0cik7Ci19Ci0KLWlubGluZSBib29sCi1HZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0SXNEZWZhdWx0SW5zdGFuY2UoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgewotICBpZiAoaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXRfID09IGtIYXNOb0RlZmF1bHRJbnN0YW5jZUZpZWxkKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKwotICAgICAgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXRfOwotICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYm9vbCo+KHB0cik7Ci19Ci0KLS8vIFNpbXBsZSBhY2Nlc3NvcnMgZm9yIG1hbmlwdWxhdGluZyBoYXNfYml0c18uCi1pbmxpbmUgYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6SGFzQml0KAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHsKLSAgICAvLyBwcm90bzM6IG5vIGhhcy1iaXRzLiBBbGwgZmllbGRzIHByZXNlbnQgZXhjZXB0IG1lc3NhZ2VzLCB3aGljaCBhcmUKLSAgICAvLyBwcmVzZW50IG9ubHkgaWYgdGhlaXIgbWVzc2FnZS1maWVsZCBwb2ludGVyIGlzIG5vbi1OVUxMLgotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgcmV0dXJuICFHZXRJc0RlZmF1bHRJbnN0YW5jZShtZXNzYWdlKSAmJgotICAgICAgICAgIEdldFJhdzxjb25zdCBNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpICE9IE5VTEw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE5vbi1tZXNzYWdlIGZpZWxkIChhbmQgbm9uLW9uZW9mLCBzaW5jZSB0aGF0IHdhcyBoYW5kbGVkIGluIEhhc0ZpZWxkKCkKLSAgICAgIC8vIGJlZm9yZSBjYWxsaW5nIHVzKSwgYW5kIHNpbmd1bGFyIChhZ2FpbiwgY2hlY2tlZCBpbiBIYXNGaWVsZCkuIFNvLCB0aGlzCi0gICAgICAvLyBmaWVsZCBtdXN0IGJlIGEgc2NhbGFyLgotCi0gICAgICAvLyBTY2FsYXIgcHJpbWl0aXZlIChudW1lcmljIG9yIHN0cmluZy9ieXRlcykgZmllbGRzIGFyZSBwcmVzZW50IGlmCi0gICAgICAvLyB0aGVpciB2YWx1ZSBpcyBub24temVybyAobnVtZXJpYykgb3Igbm9uLWVtcHR5IChzdHJpbmcvYnl0ZXMpLiAgTi5CLjoKLSAgICAgIC8vIHdlIG11c3QgdXNlIHRoaXMgZGVmaW5pdGlvbiBoZXJlLCByYXRoZXIgdGhhbiB0aGUgInNjYWxhciBmaWVsZHMKLSAgICAgIC8vIGFsd2F5cyBwcmVzZW50IiBpbiB0aGUgcHJvdG8zIGRvY3MsIGJlY2F1c2UgTWVyZ2VGcm9tKCkgc2VtYW50aWNzCi0gICAgICAvLyByZXF1aXJlIHByZXNlbmNlIGFzICJwcmVzZW50IG9uIHdpcmUiLCBhbmQgcmVmbGVjdGlvbi1iYXNlZCBtZXJnZQotICAgICAgLy8gKHdoaWNoIHVzZXMgSGFzRmllbGQoKSkgbmVlZHMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoaXMuCi0gICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgICAgZGVmYXVsdDogewotICAgICAgICAgICAgICBjb25zdCBzdHJpbmcqIGRlZmF1bHRfcHRyID0KLSAgICAgICAgICAgICAgICAgICZEZWZhdWx0UmF3PEFyZW5hU3RyaW5nUHRyPihmaWVsZCkuR2V0KE5VTEwpOwotICAgICAgICAgICAgICByZXR1cm4gR2V0RmllbGQ8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKS5HZXQoCi0gICAgICAgICAgICAgICAgICBkZWZhdWx0X3B0cikuc2l6ZSgpID4gMDsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgotICAgICAgICAgIHJldHVybiBHZXRSYXc8Ym9vbD4obWVzc2FnZSwgZmllbGQpICE9IGZhbHNlOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKLSAgICAgICAgICByZXR1cm4gR2V0UmF3PGludDMyPihtZXNzYWdlLCBmaWVsZCkgIT0gMDsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6Ci0gICAgICAgICAgcmV0dXJuIEdldFJhdzxpbnQ2ND4obWVzc2FnZSwgZmllbGQpICE9IDA7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKLSAgICAgICAgICByZXR1cm4gR2V0UmF3PHVpbnQzMj4obWVzc2FnZSwgZmllbGQpICE9IDA7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKLSAgICAgICAgICByZXR1cm4gR2V0UmF3PHVpbnQ2ND4obWVzc2FnZSwgZmllbGQpICE9IDA7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgotICAgICAgICAgIHJldHVybiBHZXRSYXc8ZmxvYXQ+KG1lc3NhZ2UsIGZpZWxkKSAhPSAwLjA7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKLSAgICAgICAgICByZXR1cm4gR2V0UmF3PGRvdWJsZT4obWVzc2FnZSwgZmllbGQpICE9IDAuMDsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgICAgICByZXR1cm4gR2V0UmF3PGludD4obWVzc2FnZSwgZmllbGQpICE9IDA7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgICAgLy8gaGFuZGxlZCBhYm92ZTsgYXZvaWQgd2FybmluZwotICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJSZWFjaGVkIGltcG9zc2libGUgY2FzZSBpbiBIYXNCaXQoKS4iOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotICByZXR1cm4gR2V0SGFzQml0cyhtZXNzYWdlKVtmaWVsZC0+aW5kZXgoKSAvIDMyXSAmCi0gICAgKDEgPDwgKGZpZWxkLT5pbmRleCgpICUgMzIpKTsKLX0KLQotaW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEJpdCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIGlmIChoYXNfYml0c19vZmZzZXRfID09IC0xKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIE11dGFibGVIYXNCaXRzKG1lc3NhZ2UpW2ZpZWxkLT5pbmRleCgpIC8gMzJdIHw9ICgxIDw8IChmaWVsZC0+aW5kZXgoKSAlIDMyKSk7Ci19Ci0KLWlubGluZSB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpDbGVhckJpdCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIGlmIChoYXNfYml0c19vZmZzZXRfID09IC0xKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIE11dGFibGVIYXNCaXRzKG1lc3NhZ2UpW2ZpZWxkLT5pbmRleCgpIC8gMzJdICY9IH4oMSA8PCAoZmllbGQtPmluZGV4KCkgJSAzMikpOwotfQotCi1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcEJpdCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgYm9vbCB0ZW1wX2hhc19iaXQgPSBIYXNCaXQoKm1lc3NhZ2UxLCBmaWVsZCk7Ci0gIGlmIChIYXNCaXQoKm1lc3NhZ2UyLCBmaWVsZCkpIHsKLSAgICBTZXRCaXQobWVzc2FnZTEsIGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICBDbGVhckJpdChtZXNzYWdlMSwgZmllbGQpOwotICB9Ci0gIGlmICh0ZW1wX2hhc19iaXQpIHsKLSAgICBTZXRCaXQobWVzc2FnZTIsIGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICBDbGVhckJpdChtZXNzYWdlMiwgZmllbGQpOwotICB9Ci19Ci0KLWlubGluZSBib29sIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpIYXNPbmVvZigKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKLSAgcmV0dXJuIChHZXRPbmVvZkNhc2UobWVzc2FnZSwgb25lb2ZfZGVzY3JpcHRvcikgPiAwKTsKLX0KLQotaW5saW5lIGJvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Okhhc09uZW9mRmllbGQoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICByZXR1cm4gKEdldE9uZW9mQ2FzZShtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSA9PSBmaWVsZC0+bnVtYmVyKCkpOwotfQotCi1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0T25lb2ZDYXNlKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgKk11dGFibGVPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgPSBmaWVsZC0+bnVtYmVyKCk7Ci19Ci0KLWlubGluZSB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpDbGVhck9uZW9mRmllbGQoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBpZiAoSGFzT25lb2ZGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7Ci0gICAgQ2xlYXJPbmVvZihtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKLSAgfQotfQotCi1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6Q2xlYXJPbmVvZigKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKLSAgLy8gVE9ETyhqaWVsdW8pOiBDb25zaWRlciB0byBjYWNoZSB0aGUgdW51c2VkIG9iamVjdCBpbnN0ZWFkIG9mIGRlbGV0aW5nCi0gIC8vIGl0LiBJdCB3aWxsIGJlIG11Y2ggZmFzdGVyIGlmIGFuIGFwbGljYXRpb24gc3dpdGNoZXMgYSBsb3QgZnJvbQotICAvLyBhIGZldyBvbmVvZiBmaWVsZHMuICBUaW1lL3NwYWNlIHRyYWRlb2ZmCi0gIHVpbnQzMiBvbmVvZl9jYXNlID0gR2V0T25lb2ZDYXNlKCptZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yKTsKLSAgaWYgKG9uZW9mX2Nhc2UgPiAwKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU51bWJlcihvbmVvZl9jYXNlKTsKLSAgICBpZiAoR2V0QXJlbmEobWVzc2FnZSkgPT0gTlVMTCkgewotICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKLSAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7Ci0gICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPQotICAgICAgICAgICAgICAgICAgJkRlZmF1bHRSYXc8QXJlbmFTdHJpbmdQdHI+KGZpZWxkKS5HZXQoTlVMTCk7Ci0gICAgICAgICAgICAgIE11dGFibGVGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLT4KLSAgICAgICAgICAgICAgICAgIERlc3Ryb3koZGVmYXVsdF9wdHIsIEdldEFyZW5hKG1lc3NhZ2UpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICBkZWxldGUgKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAqTXV0YWJsZU9uZW9mQ2FzZShtZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yKSA9IDA7Ci0gIH0KLX0KLQotLy8gVGVtcGxhdGUgaW1wbGVtZW50YXRpb25zIG9mIGJhc2ljIGFjY2Vzc29ycy4gIElubGluZSBiZWNhdXNlIGVhY2gKLS8vIHRlbXBsYXRlIGluc3RhbmNlIGlzIG9ubHkgY2FsbGVkIGZyb20gb25lIGxvY2F0aW9uLiAgVGhlc2UgYXJlCi0vLyB1c2VkIGZvciBhbGwgdHlwZXMgZXhjZXB0IG1lc3NhZ2VzLgotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1pbmxpbmUgY29uc3QgVHlwZSYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEZpZWxkKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFJhdzxUeXBlPihtZXNzYWdlLCBmaWVsZCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotaW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEZpZWxkKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdCB7Ci0gIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpICYmICFIYXNPbmVvZkZpZWxkKCptZXNzYWdlLCBmaWVsZCkpIHsKLSAgICBDbGVhck9uZW9mKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpOwotICB9Ci0gICpNdXRhYmxlUmF3PFR5cGU+KG1lc3NhZ2UsIGZpZWxkKSA9IHZhbHVlOwotICBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID8KLSAgICAgIFNldE9uZW9mQ2FzZShtZXNzYWdlLCBmaWVsZCkgOiBTZXRCaXQobWVzc2FnZSwgZmllbGQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLWlubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZUZpZWxkKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSA/Ci0gICAgICBTZXRPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQpIDogU2V0Qml0KG1lc3NhZ2UsIGZpZWxkKTsKLSAgcmV0dXJuIE11dGFibGVSYXc8VHlwZT4obWVzc2FnZSwgZmllbGQpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLWlubGluZSBjb25zdCBUeXBlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRGaWVsZCgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZEZpZWxkPFR5cGU+ID4obWVzc2FnZSwgZmllbGQpLkdldChpbmRleCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotaW5saW5lIGNvbnN0IFR5cGUmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZFB0ckZpZWxkKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gR2V0UmF3PFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCkuR2V0KGluZGV4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1pbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRGaWVsZCgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGludCBpbmRleCwgVHlwZSB2YWx1ZSkgY29uc3QgewotICBNdXRhYmxlUmF3PFJlcGVhdGVkRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCktPlNldChpbmRleCwgdmFsdWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLWlubGluZSBUeXBlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkRmllbGQoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qIHJlcGVhdGVkID0KLSAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4gPihtZXNzYWdlLCBmaWVsZCk7Ci0gIHJldHVybiByZXBlYXRlZC0+TXV0YWJsZShpbmRleCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotaW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZEZpZWxkKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdCB7Ci0gIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKS0+QWRkKHZhbHVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci1pbmxpbmUgVHlwZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkFkZEZpZWxkKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiogcmVwZWF0ZWQgPQotICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZDxUeXBlPiA+KG1lc3NhZ2UsIGZpZWxkKTsKLSAgcmV0dXJuIHJlcGVhdGVkLT5BZGQoKTsKLX0KLQotTWVzc2FnZUZhY3RvcnkqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRNZXNzYWdlRmFjdG9yeSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1lc3NhZ2VfZmFjdG9yeV87Ci19Ci0KLXZvaWQqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpSZXBlYXRlZEZpZWxkRGF0YSgKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSwKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIGNvbnN0IHsKLSAgR09PR0xFX0NIRUNLKGZpZWxkLT5pc19yZXBlYXRlZCgpKTsKLSAgR09PR0xFX0NIRUNLKGZpZWxkLT5jcHBfdHlwZSgpID09IGNwcF90eXBlIHx8Ci0gICAgICAgIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSAmJgotICAgICAgICAgY3BwX3R5cGUgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyKSkKLSAgICAgIDw8ICJUaGUgdHlwZSBwYXJhbWV0ZXIgVCBpbiBSZXBlYXRlZEZpZWxkUmVmPFQ+IEFQSSBkb2Vzbid0IG1hdGNoICIKLSAgICAgIDw8ICJ0aGUgYWN0dWFsIGZpZWxkIHR5cGUgKGZvciBlbnVtcyBUIHNob3VsZCBiZSB0aGUgZ2VuZXJhdGVkIGVudW0gIgotICAgICAgPDwgInR5cGUgb3IgaW50MzIpLiI7Ci0gIGlmIChtZXNzYWdlX3R5cGUgIT0gTlVMTCkgewotICAgIEdPT0dMRV9DSEVDS19FUShtZXNzYWdlX3R5cGUsIGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7Ci0gIH0KLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIHJldHVybiBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCBmaWVsZC0+aXNfcGFja2VkKCksIGZpZWxkKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgb2Zmc2V0c19bZmllbGQtPmluZGV4KCldOwotICB9Ci19Ci0KLU1hcEZpZWxkQmFzZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok1hcERhdGEoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLAotICAgICAgICAgICAgICAiR2V0TWFwRGF0YSIsCi0gICAgICAgICAgICAgICJGaWVsZCBpcyBub3QgYSBtYXAgZmllbGQuIik7Ci0gIHJldHVybiBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpOwotfQotCi1HZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLUdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UsCi0gICAgY29uc3QgaW50IG9mZnNldHNbXSwKLSAgICBpbnQgaGFzX2JpdHNfb2Zmc2V0LAotICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQsCi0gICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0LAotICAgIGNvbnN0IHZvaWQqIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2UsCi0gICAgaW50IG9uZW9mX2Nhc2Vfb2Zmc2V0LAotICAgIGludCBvYmplY3Rfc2l6ZSwKLSAgICBpbnQgYXJlbmFfb2Zmc2V0LAotICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCkgewotICByZXR1cm4gbmV3IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19iaXRzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkc19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbmVvZl9jYXNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVuYV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpOwotfQotCi1HZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKLUdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UsCi0gICAgY29uc3QgaW50IG9mZnNldHNbXSwKLSAgICBpbnQgaGFzX2JpdHNfb2Zmc2V0LAotICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQsCi0gICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0LAotICAgIGludCBvYmplY3Rfc2l6ZSwKLSAgICBpbnQgYXJlbmFfb2Zmc2V0LAotICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCkgewotICByZXR1cm4gbmV3IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9pbnN0YW5jZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGhhc19iaXRzX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2ZpZWxkc19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uc19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2JqZWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJlbmFfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1ZmM4MDIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmgKKysrIC9kZXYvbnVsbApAQCAtMSw2ODMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgaGVhZGVyIGlzIGxvZ2ljYWxseSBpbnRlcm5hbCwgYnV0IGlzIG1hZGUgcHVibGljIGJlY2F1c2UgaXQgaXMgdXNlZAotLy8gZnJvbSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgY29kZSwgd2hpY2ggbWF5IHJlc2lkZSBpbiBvdGhlciBjb21wb25lbnRzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9SRUZMRUNUSU9OX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfUkVGTEVDVElPTl9IX18KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotLy8gVE9ETyhqYXNvbmgpOiBSZW1vdmUgdGhpcyBvbmNlIHRoZSBjb21waWxlciBjaGFuZ2UgdG8gZGlyZWN0bHkgaW5jbHVkZSB0aGlzCi0vLyBpcyByZWxlYXNlZCB0byBjb21wb25lbnRzLgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KLQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSB1cGIgewotbmFtZXNwYWNlIGdvb2dsZV9vcGVuc291cmNlIHsKLWNsYXNzIEdNUl9IYW5kbGVyczsKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGVfb3BlbnNvdXJjZQotfSAgLy8gbmFtZXNwYWNlIHVwYgotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotY2xhc3MgRGVzY3JpcHRvclBvb2w7Ci1jbGFzcyBNYXBLZXk7Ci1jbGFzcyBNYXBWYWx1ZVJlZjsKLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci1jbGFzcyBEZWZhdWx0RW1wdHlPbmVvZjsKLQotLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCi1jbGFzcyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKLQotLy8gRGVmaW5lZCBpbiBvdGhlciBmaWxlcy4KLWNsYXNzIEV4dGVuc2lvblNldDsgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uX3NldC5oCi0KLS8vIFRISVMgQ0xBU1MgSVMgTk9UIElOVEVOREVEIEZPUiBESVJFQ1QgVVNFLiAgSXQgaXMgaW50ZW5kZWQgZm9yIHVzZQotLy8gYnkgZ2VuZXJhdGVkIGNvZGUuICBUaGlzIGNsYXNzIGlzIGp1c3QgYSBiaWcgaGFjayB0aGF0IHJlZHVjZXMgY29kZQotLy8gc2l6ZS4KLS8vCi0vLyBBIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIGlzIGFuIGltcGxlbWVudGF0aW9uIG9mIFJlZmxlY3Rpb24KLS8vIHdoaWNoIGV4cGVjdHMgYWxsIGZpZWxkcyB0byBiZSBiYWNrZWQgYnkgc2ltcGxlIHZhcmlhYmxlcyBsb2NhdGVkIGluCi0vLyBtZW1vcnkuICBUaGUgbG9jYXRpb25zIGFyZSBnaXZlbiB1c2luZyBhIGJhc2UgcG9pbnRlciBhbmQgYSBzZXQgb2YKLS8vIG9mZnNldHMuCi0vLwotLy8gSXQgaXMgcmVxdWlyZWQgdGhhdCB0aGUgdXNlciByZXByZXNlbnRzIGZpZWxkcyBvZiBlYWNoIHR5cGUgaW4gYSBzdGFuZGFyZAotLy8gd2F5LCBzbyB0aGF0IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIGNhbiBjYXN0IHRoZSB2b2lkKiBwb2ludGVyIHRvCi0vLyB0aGUgYXBwcm9wcmlhdGUgdHlwZS4gIEZvciBwcmltaXRpdmUgZmllbGRzIGFuZCBzdHJpbmcgZmllbGRzLCBlYWNoIGZpZWxkCi0vLyBzaG91bGQgYmUgcmVwcmVzZW50ZWQgdXNpbmcgdGhlIG9idmlvdXMgQysrIHByaW1pdGl2ZSB0eXBlLiAgRW51bXMgYW5kCi0vLyBNZXNzYWdlcyBhcmUgZGlmZmVyZW50OgotLy8gIC0gU2luZ3VsYXIgTWVzc2FnZSBmaWVsZHMgYXJlIHN0b3JlZCBhcyBhIHBvaW50ZXIgdG8gYSBNZXNzYWdlLiAgVGhlc2UKLS8vICAgIHNob3VsZCBzdGFydCBvdXQgTlVMTCwgZXhjZXB0IGZvciBpbiB0aGUgZGVmYXVsdCBpbnN0YW5jZSB3aGVyZSB0aGV5Ci0vLyAgICBzaG91bGQgc3RhcnQgb3V0IHBvaW50aW5nIHRvIG90aGVyIGRlZmF1bHQgaW5zdGFuY2VzLgotLy8gIC0gRW51bSBmaWVsZHMgYXJlIHN0b3JlZCBhcyBhbiBpbnQuICBUaGlzIGludCBtdXN0IGFsd2F5cyBjb250YWluCi0vLyAgICBhIHZhbGlkIHZhbHVlLCBzdWNoIHRoYXQgRW51bURlc2NyaXB0b3I6OkZpbmRWYWx1ZUJ5TnVtYmVyKCkgd291bGQKLS8vICAgIG5vdCByZXR1cm4gTlVMTC4KLS8vICAtIFJlcGVhdGVkIGZpZWxkcyBhcmUgc3RvcmVkIGFzIFJlcGVhdGVkRmllbGRzIG9yIFJlcGVhdGVkUHRyRmllbGRzCi0vLyAgICBvZiB3aGF0ZXZlciB0eXBlIHRoZSBpbmRpdmlkdWFsIGZpZWxkIHdvdWxkIGJlLiAgU3RyaW5ncyBhbmQKLS8vICAgIE1lc3NhZ2VzIHVzZSBSZXBlYXRlZFB0ckZpZWxkcyB3aGlsZSBldmVyeXRoaW5nIGVsc2UgdXNlcwotLy8gICAgUmVwZWF0ZWRGaWVsZHMuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24gOiBwdWJsaWMgUmVmbGVjdGlvbiB7Ci0gcHVibGljOgotICAvLyBDb25zdHJ1Y3RzIGEgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24uCi0gIC8vIFBhcmFtZXRlcnM6Ci0gIC8vICAgZGVzY3JpcHRvcjogICAgVGhlIGRlc2NyaXB0b3IgZm9yIHRoZSBtZXNzYWdlIHR5cGUgYmVpbmcgaW1wbGVtZW50ZWQuCi0gIC8vICAgZGVmYXVsdF9pbnN0YW5jZTogIFRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBtZXNzYWdlLiAgVGhpcyBpcyBvbmx5Ci0gIC8vICAgICAgICAgICAgICAgICAgdXNlZCB0byBvYnRhaW4gcG9pbnRlcnMgdG8gZGVmYXVsdCBpbnN0YW5jZXMgb2YgZW1iZWRkZWQKLSAgLy8gICAgICAgICAgICAgICAgICBtZXNzYWdlcywgd2hpY2ggR2V0TWVzc2FnZSgpIHdpbGwgcmV0dXJuIGlmIHRoZSBwYXJ0aWN1bGFyCi0gIC8vICAgICAgICAgICAgICAgICAgc3ViLW1lc3NhZ2UgaGFzIG5vdCBiZWVuIGluaXRpYWxpemVkIHlldC4gIChUaHVzLCBhbGwKLSAgLy8gICAgICAgICAgICAgICAgICBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcyAqbXVzdCogaGF2ZSBub24tTlVMTCBwb2ludGVycwotICAvLyAgICAgICAgICAgICAgICAgIGluIHRoZSBkZWZhdWx0IGluc3RhbmNlLikKLSAgLy8gICBvZmZzZXRzOiAgICAgICBBbiBhcnJheSBvZiBpbnRzIGdpdmluZyB0aGUgYnl0ZSBvZmZzZXRzLCByZWxhdGl2ZSB0bwotICAvLyAgICAgICAgICAgICAgICAgIHRoZSBzdGFydCBvZiB0aGUgbWVzc2FnZSBvYmplY3QsIG9mIGVhY2ggZmllbGQuICBUaGVzZSBjYW4KLSAgLy8gICAgICAgICAgICAgICAgICBiZSBjb21wdXRlZCBhdCBjb21waWxlIHRpbWUgdXNpbmcgdGhlCi0gIC8vICAgICAgICAgICAgICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgpIG1hY3JvLCBkZWZpbmVkCi0gIC8vICAgICAgICAgICAgICAgICAgYmVsb3cuCi0gIC8vICAgaGFzX2JpdHNfb2Zmc2V0OiAgT2Zmc2V0IGluIHRoZSBtZXNzYWdlIG9mIGFuIGFycmF5IG9mIHVpbnQzMnMgb2Ygc2l6ZQotICAvLyAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCkvMzIsIHJvdW5kZWQgdXAuICBUaGlzIGlzIGEKLSAgLy8gICAgICAgICAgICAgICAgICBiaXRmaWVsZCB3aGVyZSBlYWNoIGJpdCBpbmRpY2F0ZXMgd2hldGhlciBvciBub3QgdGhlCi0gIC8vICAgICAgICAgICAgICAgICAgY29ycmVzcG9uZGluZyBmaWVsZCBvZiB0aGUgbWVzc2FnZSBoYXMgYmVlbiBpbml0aWFsaXplZC4KLSAgLy8gICAgICAgICAgICAgICAgICBUaGUgYml0IGZvciBmaWVsZCBpbmRleCBpIGlzIG9idGFpbmVkIGJ5IHRoZSBleHByZXNzaW9uOgotICAvLyAgICAgICAgICAgICAgICAgICAgaGFzX2JpdHNbaSAvIDMyXSAmICgxIDw8IChpICUgMzIpKQotICAvLyAgIHVua25vd25fZmllbGRzX29mZnNldDogIE9mZnNldCBpbiB0aGUgbWVzc2FnZSBvZiB0aGUgVW5rbm93bkZpZWxkU2V0IGZvcgotICAvLyAgICAgICAgICAgICAgICAgIHRoZSBtZXNzYWdlLgotICAvLyAgIGV4dGVuc2lvbnNfb2Zmc2V0OiAgT2Zmc2V0IGluIHRoZSBtZXNzYWdlIG9mIHRoZSBFeHRlbnNpb25TZXQgZm9yIHRoZQotICAvLyAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIG9yIC0xIGlmIHRoZSBtZXNzYWdlIHR5cGUgaGFzIG5vIGV4dGVuc2lvbgotICAvLyAgICAgICAgICAgICAgICAgIHJhbmdlcy4KLSAgLy8gICBwb29sOiAgICAgICAgICBEZXNjcmlwdG9yUG9vbCB0byBzZWFyY2ggZm9yIGV4dGVuc2lvbiBkZWZpbml0aW9ucy4gIE9ubHkKLSAgLy8gICAgICAgICAgICAgICAgICB1c2VkIGJ5IEZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSgpIGFuZAotICAvLyAgICAgICAgICAgICAgICAgIEZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKCkuCi0gIC8vICAgZmFjdG9yeTogICAgICAgTWVzc2FnZUZhY3RvcnkgdG8gdXNlIHRvIGNvbnN0cnVjdCBleHRlbnNpb24gbWVzc2FnZXMuCi0gIC8vICAgb2JqZWN0X3NpemU6ICAgVGhlIHNpemUgb2YgYSBtZXNzYWdlIG9iamVjdCBvZiB0aGlzIHR5cGUsIGFzIG1lYXN1cmVkCi0gIC8vICAgICAgICAgICAgICAgICAgYnkgc2l6ZW9mKCkuCi0gIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXRzW10sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfYml0c19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRlbnNpb25zX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2JqZWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmVuYV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCA9IC0xKTsKLQotICAvLyBTaW1pbGFyIHdpdGggdGhlIGNvbnN0cnVjdGlvbiBhYm92ZS4gQ2FsbCB0aGlzIGNvbnN0cnVjdGlvbiBpZiB0aGUKLSAgLy8gbWVzc2FnZSBoYXMgb25lb2YgZGVmaW5pdGlvbi4KLSAgLy8gUGFyYW1ldGVyczoKLSAgLy8gICBvZmZzZXRzOiAgICAgICBBbiBhcnJheSBvZiBpbnRzIGdpdmluZyB0aGUgYnl0ZSBvZmZzZXRzLgotICAvLyAgICAgICAgICAgICAgICAgIEZvciBlYWNoIG9uZW9mIGZpZWxkLCB0aGUgb2Zmc2V0IGlzIHJlbGF0aXZlIHRvIHRoZQotICAvLyAgICAgICAgICAgICAgICAgIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2UuIFRoZXNlIGNhbiBiZSBjb21wdXRlZCBhdCBjb21waWxlCi0gIC8vICAgICAgICAgICAgICAgICAgdGltZSB1c2luZyB0aGUKLSAgLy8gICAgICAgICAgICAgICAgICBQUk9UTzJfR0VORVJBVEVEX0RFRkFVTFRfT05FT0ZfRklFTERfT0ZGU0VUKCkgbWFjcm8uCi0gIC8vICAgICAgICAgICAgICAgICAgRm9yIGVhY2ggbm9uZSBvbmVvZiBmaWVsZCwgdGhlIG9mZnNldCBpcyByZWxhdGVkIHRvCi0gIC8vICAgICAgICAgICAgICAgICAgdGhlIHN0YXJ0IG9mIHRoZSBtZXNzYWdlIG9iamVjdC4gIFRoZXNlIGNhbiBiZSBjb21wdXRlZAotICAvLyAgICAgICAgICAgICAgICAgIGF0IGNvbXBpbGUgdGltZSB1c2luZyB0aGUKLSAgLy8gICAgICAgICAgICAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCkgbWFjcm8uCi0gIC8vICAgICAgICAgICAgICAgICAgQmVzaWRlcyBvZmZzZXRzIGZvciBhbGwgZmllbGRzLCB0aGlzIGFycmF5IGFsc28gY29udGFpbnMKLSAgLy8gICAgICAgICAgICAgICAgICBvZmZzZXRzIGZvciBvbmVvZiB1bmlvbnMuIFRoZSBvZmZzZXQgb2YgdGhlIGktdGggb25lb2YKLSAgLy8gICAgICAgICAgICAgICAgICB1bmlvbiBpcyBvZmZzZXRzW2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCkgKyBpXS4KLSAgLy8gICBkZWZhdWx0X29uZW9mX2luc3RhbmNlOiBUaGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgb25lb2ZzLiBJdCBpcyBhCi0gIC8vICAgICAgICAgICAgICAgICAgc3RydWN0IGhvbGRpbmcgdGhlIGRlZmF1bHQgdmFsdWUgb2YgYWxsIG9uZW9mIGZpZWxkcwotICAvLyAgICAgICAgICAgICAgICAgIGZvciB0aGlzIG1lc3NhZ2UuIEl0IGlzIG9ubHkgdXNlZCB0byBvYnRhaW4gcG9pbnRlcnMKLSAgLy8gICAgICAgICAgICAgICAgICB0byBkZWZhdWx0IGluc3RhbmNlcyBvZiBvbmVvZiBmaWVsZHMsIHdoaWNoIEdldAotICAvLyAgICAgICAgICAgICAgICAgIG1ldGhvZHMgd2lsbCByZXR1cm4gaWYgdGhlIGZpZWxkIGlzIG5vdCBzZXQuCi0gIC8vICAgb25lb2ZfY2FzZV9vZmZzZXQ6ICBPZmZzZXQgaW4gdGhlIG1lc3NhZ2Ugb2YgYW4gYXJyYXkgb2YgdWludDMycyBvZgotICAvLyAgICAgICAgICAgICAgICAgIHNpemUgZGVzY3JpcHRvci0+b25lb2ZfZGVjbF9jb3VudCgpLiAgRWFjaCB1aW50MzIKLSAgLy8gICAgICAgICAgICAgICAgICBpbmRpY2F0ZXMgd2hhdCBmaWVsZCBpcyBzZXQgZm9yIGVhY2ggb25lb2YuCi0gIC8vICAgb3RoZXIgcGFyYW1ldGVycyBhcmUgdGhlIHNhbWUgd2l0aCB0aGUgY29uc3RydWN0aW9uIGFib3ZlLgotICBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaGFzX2JpdHNfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvbmVvZl9jYXNlX29mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2JqZWN0X3NpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmVuYV9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCA9IC0xKTsKLSAgfkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKCk7Ci0KLSAgLy8gU2hvcnRlci10by1jYWxsIGhlbHBlcnMgZm9yIHRoZSBhYm92ZSB0d28gY29uc3RydWN0aW9ucyB0aGF0IHdvcmsgaWYgdGhlCi0gIC8vIHBvb2wgYW5kIGZhY3RvcnkgYXJlIHRoZSB1c3VhbCwgbmFtZWx5LCBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKQotICAvLyBhbmQgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkuCi0KLSAgc3RhdGljIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKiBOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlLAotICAgICAgY29uc3QgaW50IG9mZnNldHNbXSwKLSAgICAgIGludCBoYXNfYml0c19vZmZzZXQsCi0gICAgICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0LAotICAgICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0LAotICAgICAgY29uc3Qgdm9pZCogZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSwKLSAgICAgIGludCBvbmVvZl9jYXNlX29mZnNldCwKLSAgICAgIGludCBvYmplY3Rfc2l6ZSwKLSAgICAgIGludCBhcmVuYV9vZmZzZXQsCi0gICAgICBpbnQgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQgPSAtMSk7Ci0KLSAgc3RhdGljIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKiBOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKLSAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlLAotICAgICAgY29uc3QgaW50IG9mZnNldHNbXSwKLSAgICAgIGludCBoYXNfYml0c19vZmZzZXQsCi0gICAgICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0LAotICAgICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0LAotICAgICAgaW50IG9iamVjdF9zaXplLAotICAgICAgaW50IGFyZW5hX29mZnNldCwKLSAgICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCA9IC0xKTsKLQotICAvLyBpbXBsZW1lbnRzIFJlZmxlY3Rpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIGNvbnN0IFVua25vd25GaWVsZFNldCYgR2V0VW5rbm93bkZpZWxkcyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdDsKLSAgVW5rbm93bkZpZWxkU2V0KiBNdXRhYmxlVW5rbm93bkZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlKSBjb25zdDsKLQotICBpbnQgU3BhY2VVc2VkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OwotCi0gIGJvb2wgSGFzRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGludCBGaWVsZFNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIHZvaWQgQ2xlYXJGaWVsZChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgYm9vbCBIYXNPbmVvZihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3Q7Ci0gIHZvaWQgQ2xlYXJPbmVvZihNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgdm9pZCBSZW1vdmVMYXN0KE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICBNZXNzYWdlKiBSZWxlYXNlTGFzdChNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgdm9pZCBTd2FwKE1lc3NhZ2UqIG1lc3NhZ2UxLCBNZXNzYWdlKiBtZXNzYWdlMikgY29uc3Q7Ci0gIHZvaWQgU3dhcEZpZWxkcyhNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsCi0gICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykgY29uc3Q7Ci0gIHZvaWQgU3dhcEVsZW1lbnRzKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgIGludCBpbmRleDEsIGludCBpbmRleDIpIGNvbnN0OwotICB2b2lkIExpc3RGaWVsZHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdDsKLQotICBpbnQzMiAgR2V0SW50MzIgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGludDY0ICBHZXRJbnQ2NCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgdWludDMyIEdldFVJbnQzMihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICB1aW50NjQgR2V0VUludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGZsb2F0ICBHZXRGbG9hdCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgZG91YmxlIEdldERvdWJsZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICBib29sICAgR2V0Qm9vbCAgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIHN0cmluZyBHZXRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgY29uc3Qgc3RyaW5nJiBHZXRTdHJpbmdSZWZlcmVuY2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBzY3JhdGNoKSBjb25zdDsKLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0RW51bShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICBpbnQgR2V0RW51bVZhbHVlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGNvbnN0IE1lc3NhZ2UmIEdldE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3Q7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgYm9vbCBDb250YWluc01hcEtleShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiBrZXkpIGNvbnN0OwotICBib29sIEluc2VydE9yTG9va3VwTWFwVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIGtleSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcFZhbHVlUmVmKiB2YWwpIGNvbnN0OwotICBib29sIERlbGV0ZU1hcFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIGtleSkgY29uc3Q7Ci0gIE1hcEl0ZXJhdG9yIE1hcEJlZ2luKAotICAgICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICBNYXBJdGVyYXRvciBNYXBFbmQoCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGludCBNYXBTaXplKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi0gcHVibGljOgotICB2b2lkIFNldEludDMyIChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQzMiAgdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldEludDY0IChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQ2NCAgdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50MzIgdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50NjQgdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldEZsb2F0IChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBmbG9hdCAgdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBkb3VibGUgdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldEJvb2wgIChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sICAgdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdDsKLSAgdm9pZCBTZXRFbnVtICAoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldEVudW1WYWx1ZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0OwotICBNZXNzYWdlKiBNdXRhYmxlTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OwotICB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIE1lc3NhZ2UqIFJlbGVhc2VNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3Q7Ci0KLSAgaW50MzIgIEdldFJlcGVhdGVkSW50MzIgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OwotICBpbnQ2NCAgR2V0UmVwZWF0ZWRJbnQ2NCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7Ci0gIHVpbnQzMiBHZXRSZXBlYXRlZFVJbnQzMihjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKLSAgdWludDY0IEdldFJlcGVhdGVkVUludDY0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OwotICBmbG9hdCAgR2V0UmVwZWF0ZWRGbG9hdCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7Ci0gIGRvdWJsZSBHZXRSZXBlYXRlZERvdWJsZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKLSAgYm9vbCAgIEdldFJlcGVhdGVkQm9vbCAgKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OwotICBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7Ci0gIGNvbnN0IHN0cmluZyYgR2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgc3RyaW5nKiBzY3JhdGNoKSBjb25zdDsKLSAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0UmVwZWF0ZWRFbnVtKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKLSAgaW50IEdldFJlcGVhdGVkRW51bVZhbHVlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKLSAgY29uc3QgTWVzc2FnZSYgR2V0UmVwZWF0ZWRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKLQotICAvLyBTZXQgdGhlIHZhbHVlIG9mIGEgZmllbGQuCi0gIHZvaWQgU2V0UmVwZWF0ZWRJbnQzMiAoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGludDMyICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRJbnQ2NCAoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGludDY0ICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRVSW50MzIoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIHVpbnQzMiB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRVSW50NjQoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIHVpbnQ2NCB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRGbG9hdCAoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGZsb2F0ICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWREb3VibGUoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGRvdWJsZSB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRCb29sICAoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsIGJvb2wgICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgU2V0UmVwZWF0ZWRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0OwotICB2b2lkIFNldFJlcGVhdGVkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgdmFsdWUpIGNvbnN0OwotICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gYSBmaWVsZCB3aXRoIGEgbWVzc2FnZSB0eXBlLgotICBNZXNzYWdlKiBNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OwotCi0gIHZvaWQgQWRkSW50MzIgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDMyICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkSW50NjQgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDY0ICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkVUludDMyKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQzMiB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkVUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQ2NCB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkRmxvYXQgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGZsb2F0ICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkRG91YmxlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkQm9vbCAgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgICB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkU3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0OwotICB2b2lkIEFkZEVudW0oTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3Q7Ci0gIHZvaWQgQWRkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7Ci0gIE1lc3NhZ2UqIEFkZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OwotICB2b2lkIEFkZEFsbG9jYXRlZE1lc3NhZ2UoCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgTWVzc2FnZSogbmV3X2VudHJ5KSBjb25zdDsKLQotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGludCBudW1iZXIpIGNvbnN0OwotCi0gIGJvb2wgU3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpIGNvbnN0OwotCi0gIC8vIFRoaXMgdmFsdWUgZm9yIGFyZW5hX29mZnNldF8gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8gYXJlbmEgcG9pbnRlciBpbgotICAvLyB0aGlzIG1lc3NhZ2UgKGUuZy4sIG9sZCBnZW5lcmF0ZWQgY29kZSkuCi0gIHN0YXRpYyBjb25zdCBpbnQga05vQXJlbmFQb2ludGVyID0gLTE7Ci0KLSAgLy8gVGhpcyB2YWx1ZSBmb3IgdW5rbm93bl9maWVsZF9vZmZzZXRfIGluZGljYXRlcyB0aGF0IHRoZXJlIGlzIG5vCi0gIC8vIFVua25vd25GaWVsZFNldCBpbiB0aGlzIG1lc3NhZ2UsIGFuZCB0aGF0IGluc3RlYWQsIHdlIGFyZSB1c2luZyB0aGUKLSAgLy8gWmVyby1PdmVyaGVhZCBBcmVuYSBQb2ludGVyIHRyaWNrLiBXaGVuIHRoaXMgaXMgdGhlIGNhc2UsIGFyZW5hX29mZnNldF8KLSAgLy8gYWN0dWFsbHkgaW5kZXhlcyB0byBhbiBJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIGluc3RhbmNlLCB3aGljaCBjYW4gcmV0dXJuCi0gIC8vIGVpdGhlciBhbiBhcmVuYSBwb2ludGVyIG9yIGFuIFVua25vd25GaWVsZFNldCBvciBib3RoLiBJdCBpcyBuZXZlciB0aGUgY2FzZQotICAvLyB0aGF0IHVua25vd25fZmllbGRfb2Zmc2V0XyA9PSBrVW5rbm93bkZpZWxkU2V0SW5NZXRhZGF0YSAmJiBhcmVuYV9vZmZzZXRfCi0gIC8vID09IGtOb0FyZW5hUG9pbnRlci4KLSAgc3RhdGljIGNvbnN0IGludCBrVW5rbm93bkZpZWxkU2V0SW5NZXRhZGF0YSA9IC0xOwotCi0gcHJvdGVjdGVkOgotICB2b2lkKiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgKLSAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSwKLSAgICAgIGludCBjdHlwZSwgY29uc3QgRGVzY3JpcHRvciogZGVzYykgY29uc3Q7Ci0KLSAgY29uc3Qgdm9pZCogR2V0UmF3UmVwZWF0ZWRGaWVsZCgKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUsIGludCBjdHlwZSwKLSAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2MpIGNvbnN0OwotCi0gIHZpcnR1YWwgTWVzc2FnZUZhY3RvcnkqIEdldE1lc3NhZ2VGYWN0b3J5KCkgY29uc3Q7Ci0KLSAgdmlydHVhbCB2b2lkKiBSZXBlYXRlZEZpZWxkRGF0YSgKLSAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgY3BwX3R5cGUsCi0gICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgZnJpZW5kIGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2U7Ci0KLSAgLy8gVG8gcGFyc2UgZGlyZWN0bHkgaW50byBhIHByb3RvMiBnZW5lcmF0ZWQgY2xhc3MsIHRoZSBjbGFzcyBHTVJfSGFuZGxlcnMKLSAgLy8gbmVlZHMgYWNjZXNzIHRvIG1lbWJlciBvZmZzZXRzIGFuZCBoYXNiaXRzLgotICBmcmllbmQgY2xhc3MgdXBiOjpnb29nbGVfb3BlbnNvdXJjZTo6R01SX0hhbmRsZXJzOwotCi0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlXzsKLSAgY29uc3Qgdm9pZCogZGVmYXVsdF9vbmVvZl9pbnN0YW5jZV87Ci0gIGNvbnN0IGludCogb2Zmc2V0c187Ci0KLSAgaW50IGhhc19iaXRzX29mZnNldF87Ci0gIGludCBvbmVvZl9jYXNlX29mZnNldF87Ci0gIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXRfOwotICBpbnQgZXh0ZW5zaW9uc19vZmZzZXRfOwotICBpbnQgYXJlbmFfb2Zmc2V0XzsKLSAgaW50IGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0XzsKLSAgaW50IG9iamVjdF9zaXplXzsKLQotICBzdGF0aWMgY29uc3QgaW50IGtIYXNOb0RlZmF1bHRJbnN0YW5jZUZpZWxkID0gLTE7Ci0KLSAgY29uc3QgRGVzY3JpcHRvclBvb2wqIGRlc2NyaXB0b3JfcG9vbF87Ci0gIE1lc3NhZ2VGYWN0b3J5KiBtZXNzYWdlX2ZhY3RvcnlfOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotICBpbmxpbmUgY29uc3QgVHlwZSYgR2V0UmF3KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotICBpbmxpbmUgVHlwZSogTXV0YWJsZVJhdyhNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci0gIGlubGluZSBjb25zdCBUeXBlJiBEZWZhdWx0UmF3KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLSAgaW5saW5lIGNvbnN0IFR5cGUmIERlZmF1bHRPbmVvZlJhdyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLQotICBpbmxpbmUgY29uc3QgdWludDMyKiBHZXRIYXNCaXRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OwotICBpbmxpbmUgdWludDMyKiBNdXRhYmxlSGFzQml0cyhNZXNzYWdlKiBtZXNzYWdlKSBjb25zdDsKLSAgaW5saW5lIHVpbnQzMiBHZXRPbmVvZkNhc2UoCi0gICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKLSAgaW5saW5lIHVpbnQzMiogTXV0YWJsZU9uZW9mQ2FzZSgKLSAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0OwotICBpbmxpbmUgY29uc3QgRXh0ZW5zaW9uU2V0JiBHZXRFeHRlbnNpb25TZXQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7Ci0gIGlubGluZSBFeHRlbnNpb25TZXQqIE11dGFibGVFeHRlbnNpb25TZXQoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7Ci0gIGlubGluZSBBcmVuYSogR2V0QXJlbmEoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7Ci0gIGlubGluZSBjb25zdCBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSYKLSAgICAgIEdldEludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7Ci0gIGlubGluZSBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSoKLSAgICAgIE11dGFibGVJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OwotCi0gIGlubGluZSBib29sIEdldElzRGVmYXVsdEluc3RhbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OwotCi0gIGlubGluZSBib29sIEhhc0JpdChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIFNldEJpdChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIENsZWFyQml0KE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBTd2FwQml0KE1lc3NhZ2UqIG1lc3NhZ2UxLAotICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi0gIC8vIFRoaXMgZnVuY3Rpb24gb25seSBzd2FwcyB0aGUgZmllbGQuIFNob3VsZCBzd2FwIGNvcnJlc3BvbmRpbmcgaGFzX2JpdAotICAvLyBiZWZvcmUgb3IgYWZ0ZXIgdXNpbmcgdGhpcyBmdW5jdGlvbi4KLSAgdm9pZCBTd2FwRmllbGQoTWVzc2FnZSogbWVzc2FnZTEsCi0gICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UyLAotICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLQotICB2b2lkIFN3YXBPbmVvZkZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UxLAotICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UyLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3Q7Ci0KLSAgaW5saW5lIGJvb2wgSGFzT25lb2ZGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBTZXRPbmVvZkNhc2UoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBDbGVhck9uZW9mRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotICBpbmxpbmUgY29uc3QgVHlwZSYgR2V0RmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLSAgaW5saW5lIHZvaWQgU2V0RmllbGQoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgVHlwZSYgdmFsdWUpIGNvbnN0OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLSAgaW5saW5lIFR5cGUqIE11dGFibGVGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLSAgaW5saW5lIGNvbnN0IFR5cGUmIEdldFJlcGVhdGVkRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci0gIGlubGluZSBjb25zdCBUeXBlJiBHZXRSZXBlYXRlZFB0ckZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgotICBpbmxpbmUgdm9pZCBTZXRSZXBlYXRlZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFR5cGUgdmFsdWUpIGNvbnN0OwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KLSAgaW5saW5lIFR5cGUqIE11dGFibGVSZXBlYXRlZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdDsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci0gIGlubGluZSB2b2lkIEFkZEZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGNvbnN0IFR5cGUmIHZhbHVlKSBjb25zdDsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+Ci0gIGlubGluZSBUeXBlKiBBZGRGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0KLSAgaW50IEdldEV4dGVuc2lvbk51bWJlck9yRGllKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIGNvbnN0OwotCi0gIC8vIEludGVybmFsIHZlcnNpb25zIG9mIEVudW1WYWx1ZSBBUEkgcGVyZm9ybSBubyBjaGVja2luZy4gQ2FsbGVkIGFmdGVyIGNoZWNrcwotICAvLyBieSBwdWJsaWMgbWV0aG9kcy4KLSAgdm9pZCBTZXRFbnVtVmFsdWVJbnRlcm5hbChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKLSAgdm9pZCBTZXRSZXBlYXRlZEVudW1WYWx1ZUludGVybmFsKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKLSAgdm9pZCBBZGRFbnVtVmFsdWVJbnRlcm5hbChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKLQotCi0gIE1lc3NhZ2UqIFVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3Q7Ci0KLSAgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi0gIGludGVybmFsOjpNYXBGaWVsZEJhc2UqIE1hcERhdGEoCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24pOwotfTsKLQotLy8gUmV0dXJucyB0aGUgb2Zmc2V0IG9mIHRoZSBnaXZlbiBmaWVsZCB3aXRoaW4gdGhlIGdpdmVuIGFnZ3JlZ2F0ZSB0eXBlLgotLy8gVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSBBTlNJIEMgb2Zmc2V0b2YoKSBtYWNyby4gIEhvd2V2ZXIsIGFjY29yZGluZwotLy8gdG8gdGhlIEMrKyBzdGFuZGFyZCwgb2Zmc2V0b2YoKSBvbmx5IHdvcmtzIG9uIFBPRCB0eXBlcywgYW5kIEdDQwotLy8gZW5mb3JjZXMgdGhpcyByZXF1aXJlbWVudCB3aXRoIGEgd2FybmluZy4gIEluIHByYWN0aWNlLCB0aGlzIHJ1bGUgaXMKLS8vIHVubmVjZXNzYXJpbHkgc3RyaWN0OyB0aGVyZSBpcyBwcm9iYWJseSBubyBjb21waWxlciBvciBwbGF0Zm9ybSBvbgotLy8gd2hpY2ggdGhlIG9mZnNldHMgb2YgdGhlIGRpcmVjdCBmaWVsZHMgb2YgYSBjbGFzcyBhcmUgbm9uLWNvbnN0YW50LgotLy8gRmllbGRzIGluaGVyaXRlZCBmcm9tIHN1cGVyY2xhc3NlcyAqY2FuKiBoYXZlIG5vbi1jb25zdGFudCBvZmZzZXRzLAotLy8gYnV0IHRoYXQncyBub3Qgd2hhdCB0aGlzIG1hY3JvIHdpbGwgYmUgdXNlZCBmb3IuCi0jaWYgZGVmaW5lZChfX2NsYW5nX18pCi0vLyBGb3IgQ2xhbmcgd2UgdXNlIF9fYnVpbHRpbl9vZmZzZXRvZigpIGFuZCBzdXBwcmVzcyB0aGUgd2FybmluZywKLS8vIHRvIGF2b2lkIENvbnRyb2wgRmxvdyBJbnRlZ3JpdHkgYW5kIFVCU2FuIHZwdHIgc2FuaXRpemVycyBmcm9tCi0vLyBjcmFzaGluZyB3aGlsZSB0cnlpbmcgdG8gdmFsaWRhdGUgdGhlIGludmFsaWQgcmVpbnRlcnBldF9jYXN0cy4KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChUWVBFLCBGSUVMRCkgICAgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgIFwKLSAgX19idWlsdGluX29mZnNldG9mKFRZUEUsIEZJRUxEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCi0jZWxzZQotLy8gTm90ZSB0aGF0IHdlIGNhbGN1bGF0ZSByZWxhdGl2ZSB0byB0aGUgcG9pbnRlciB2YWx1ZSAxNiBoZXJlIHNpbmNlIGlmIHdlCi0vLyBqdXN0IHVzZSB6ZXJvLCBHQ0MgY29tcGxhaW5zIGFib3V0IGRlcmVmZXJlbmNpbmcgYSBOVUxMIHBvaW50ZXIuICBXZQotLy8gY2hvb3NlIDE2IHJhdGhlciB0aGFuIHNvbWUgb3RoZXIgbnVtYmVyIGp1c3QgaW4gY2FzZSB0aGUgY29tcGlsZXIgd291bGQKLS8vIGJlIGNvbmZ1c2VkIGJ5IGFuIHVuYWxpZ25lZCBwb2ludGVyLgotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFRZUEUsIEZJRUxEKSAgICBcCi0gIHN0YXRpY19jYXN0PGludD4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICZyZWludGVycHJldF9jYXN0PGNvbnN0IFRZUEUqPigxNiktPkZJRUxEKSAtICAgICAgICBcCi0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigxNikpCi0jZW5kaWYKLQotI2RlZmluZSBQUk9UTzJfR0VORVJBVEVEX0RFRkFVTFRfT05FT0ZfRklFTERfT0ZGU0VUKE9ORU9GLCBGSUVMRCkgICAgIFwKLSAgc3RhdGljX2Nhc3Q8aW50PiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigmKE9ORU9GLT5GSUVMRCkpICAgICAgICAgICAgICAgICAgXAotICAgICAgLSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihPTkVPRikpCi0KLS8vIFRoZXJlIGFyZSBzb21lIHBsYWNlcyBpbiBwcm90bzIgd2hlcmUgZHluYW1pY19jYXN0IHdvdWxkIGJlIHVzZWZ1bCBhcyBhbgotLy8gb3B0aW1pemF0aW9uLiAgRm9yIGV4YW1wbGUsIHRha2UgTWVzc2FnZTo6TWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIG90aGVyKS4KLS8vIEZvciBhIGdpdmVuIGdlbmVyYXRlZCBtZXNzYWdlIEZvb01lc3NhZ2UsIHdlIGdlbmVyYXRlIHRoZXNlIHR3byBtZXRob2RzOgotLy8gICB2b2lkIE1lcmdlRnJvbShjb25zdCBGb29NZXNzYWdlJiBvdGhlcik7Ci0vLyAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIG90aGVyKTsKLS8vIFRoZSBmb3JtZXIgbWV0aG9kIGNhbiBiZSBpbXBsZW1lbnRlZCBkaXJlY3RseSBpbiB0ZXJtcyBvZiBGb29NZXNzYWdlJ3MKLS8vIGlubGluZSBhY2Nlc3NvcnMsIGJ1dCB0aGUgbGF0dGVyIG1ldGhvZCBtdXN0IHdvcmsgd2l0aCB0aGUgcmVmbGVjdGlvbgotLy8gaW50ZXJmYWNlLiAgSG93ZXZlciwgaWYgdGhlIHBhcmFtZXRlciB0byB0aGUgbGF0dGVyIG1ldGhvZCBpcyBhY3R1YWxseSBvZgotLy8gdHlwZSBGb29NZXNzYWdlLCB0aGVuIHdlJ2QgbGlrZSB0byBiZSBhYmxlIHRvIGp1c3QgY2FsbCB0aGUgb3RoZXIgbWV0aG9kCi0vLyBhcyBhbiBvcHRpbWl6YXRpb24uICBTbywgd2UgdXNlIGR5bmFtaWNfY2FzdCB0byBjaGVjayB0aGlzLgotLy8KLS8vIFRoYXQgc2FpZCwgZHluYW1pY19jYXN0IHJlcXVpcmVzIFJUVEksIHdoaWNoIG1hbnkgcGVvcGxlIGxpa2UgdG8gZGlzYWJsZQotLy8gZm9yIHBlcmZvcm1hbmNlIGFuZCBjb2RlIHNpemUgcmVhc29ucy4gIFdoZW4gUlRUSSBpcyBub3QgYXZhaWxhYmxlLCB3ZQotLy8gc3RpbGwgbmVlZCB0byBwcm9kdWNlIGNvcnJlY3QgcmVzdWx0cy4gIFNvLCBpbiB0aGlzIGNhc2Ugd2UgaGF2ZSB0byBmYWxsCi0vLyBiYWNrIHRvIHVzaW5nIHJlZmxlY3Rpb24sIHdoaWNoIGlzIHdoYXQgd2Ugd291bGQgaGF2ZSBkb25lIGFueXdheSBpZiB0aGUKLS8vIG9iamVjdHMgd2VyZSBub3Qgb2YgdGhlIGV4YWN0IHNhbWUgY2xhc3MuCi0vLwotLy8gZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZSgpIGltcGxlbWVudHMgdGhpcyBsb2dpYy4gIElmIFJUVEkgaXMKLS8vIGVuYWJsZWQsIGl0IGRvZXMgYSBkeW5hbWljX2Nhc3QuICBJZiBSVFRJIGlzIGRpc2FibGVkLCBpdCBqdXN0IHJldHVybnMKLS8vIE5VTEwuCi0vLwotLy8gSWYgeW91IG5lZWQgdG8gY29tcGlsZSB3aXRob3V0IFJUVEksIHNpbXBseSAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJLgotLy8gT24gTVNWQywgdGhpcyBzaG91bGQgYmUgZGV0ZWN0ZWQgYXV0b21hdGljYWxseS4KLXRlbXBsYXRlPHR5cGVuYW1lIFRvLCB0eXBlbmFtZSBGcm9tPgotaW5saW5lIFRvIGR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGUoRnJvbSBmcm9tKSB7Ci0jaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSkgfHwgKGRlZmluZWQoX01TQ19WRVIpJiYhZGVmaW5lZChfQ1BQUlRUSSkpCi0gIHJldHVybiBOVUxMOwotI2Vsc2UKLSAgcmV0dXJuIGR5bmFtaWNfY2FzdDxUbz4oZnJvbSk7Ci0jZW5kaWYKLX0KLQotLy8gVHJpZXMgdG8gZG93bmNhc3QgdGhpcyBtZXNzYWdlIHRvIGEgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZS4KLS8vIFJldHVybnMgTlVMTCBpZiB0aGlzIGNsYXNzIGlzIG5vdCBhbiBpbnN0YW5jZSBvZiBULgotLy8KLS8vIFRoaXMgaXMgbGlrZSBkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlLCBleGNlcHQgaXQgd29ya3MgZXZlbiB3aGVuCi0vLyBkeW5hbWljX2Nhc3QgaXMgbm90IGF2YWlsYWJsZSBieSB1c2luZyBSZWZsZWN0aW9uLiAgSG93ZXZlciBpdCBvbmx5IHdvcmtzCi0vLyB3aXRoIE1lc3NhZ2Ugb2JqZWN0cy4KLS8vCi0vLyBUT0RPKGhhYmVybWFuKTogY2FuIHdlIHJlbW92ZSBkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlIGluIGZhdm9yIG9mIHRoaXM/Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLVQqIER5bmFtaWNDYXN0VG9HZW5lcmF0ZWQoY29uc3QgTWVzc2FnZSogZnJvbSkgewotICAvLyBDb21waWxlLXRpbWUgYXNzZXJ0IHRoYXQgVCBpcyBhIGdlbmVyYXRlZCB0eXBlIHRoYXQgaGFzIGEKLSAgLy8gZGVmYXVsdF9pbnN0YW5jZSgpIGFjY2Vzc29yLCBidXQgYXZvaWQgYWN0dWFsbHkgY2FsbGluZyBpdC4KLSAgY29uc3QgVCYoKmdldF9kZWZhdWx0X2luc3RhbmNlKSgpID0gJlQ6OmRlZmF1bHRfaW5zdGFuY2U7Ci0gICh2b2lkKWdldF9kZWZhdWx0X2luc3RhbmNlOwotCi0gIC8vIENvbXBpbGUtdGltZSBhc3NlcnQgdGhhdCBUIGlzIGEgc3ViY2xhc3Mgb2YgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZS4KLSAgY29uc3QgTWVzc2FnZSogdW51c2VkID0gc3RhdGljX2Nhc3Q8VCo+KE5VTEwpOwotICAodm9pZCl1bnVzZWQ7Ci0KLSNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJKSB8fCBcCi0gIChkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfQ1BQUlRUSSkpCi0gIGJvb2wgb2sgPSAmVDo6ZGVmYXVsdF9pbnN0YW5jZSgpID09Ci0gICAgICAgICAgICBmcm9tLT5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2VGYWN0b3J5KCktPkdldFByb3RvdHlwZSgKLSAgICAgICAgICAgICAgICBmcm9tLT5HZXREZXNjcmlwdG9yKCkpOwotICByZXR1cm4gb2sgPyBkb3duX2Nhc3Q8VCo+KGZyb20pIDogTlVMTDsKLSNlbHNlCi0gIHJldHVybiBkeW5hbWljX2Nhc3Q8VCo+KGZyb20pOwotI2VuZGlmCi19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPgotVCogRHluYW1pY0Nhc3RUb0dlbmVyYXRlZChNZXNzYWdlKiBmcm9tKSB7Ci0gIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2VfY29uc3QgPSBmcm9tOwotICByZXR1cm4gY29uc3RfY2FzdDxUKj4oRHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBUPihtZXNzYWdlX2NvbnN0KSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1JFRkxFQ1RJT05fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1ZWJkZWYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsODUyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUbyB0ZXN0IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uLCB3ZSBhY3R1YWxseSBsZXQgdGhlIHByb3RvY29sIGNvbXBpbGVyCi0vLyBnZW5lcmF0ZSBhIGZ1bGwgcHJvdG9jb2wgbWVzc2FnZSBpbXBsZW1lbnRhdGlvbiBhbmQgdGhlbiB0ZXN0IGl0cwotLy8gcmVmbGVjdGlvbiBpbnRlcmZhY2UuICBUaGlzIGlzIG11Y2ggZWFzaWVyIGFuZCBtb3JlIG1haW50YWluYWJsZSB0aGFuCi0vLyB0cnlpbmcgdG8gY3JlYXRlIG91ciBvd24gTWVzc2FnZSBjbGFzcyBmb3IgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24KLS8vIHRvIHdyYXAuCi0vLwotLy8gVGhlIHRlc3RzIGhlcmUgY2xvc2VseSBtaXJyb3Igc29tZSBvZiB0aGUgdGVzdHMgaW4KLS8vIGNvbXBpbGVyL2NwcC91bml0dGVzdCwgZXhjZXB0IHVzaW5nIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZQotLy8gcmF0aGVyIHRoYW4gZ2VuZXJhdGVkIGFjY2Vzc29ycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+Ci0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1uYW1lc3BhY2UgewotCi0vLyBTaG9ydGhhbmQgdG8gZ2V0IGEgRmllbGREZXNjcmlwdG9yIGZvciBhIGZpZWxkIG9mIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMuCi1jb25zdCBGaWVsZERlc2NyaXB0b3IqIEYoY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVzdWx0ID0KLSAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgR09PR0xFX0NIRUNLKHJlc3VsdCAhPSBOVUxMKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIERlZmF1bHRzKSB7Ci0gIC8vIENoZWNrIHRoYXQgYWxsIGRlZmF1bHQgdmFsdWVzIGFyZSBzZXQgY29ycmVjdGx5IGluIHRoZSBpbml0aWFsIG1lc3NhZ2UuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKLQotICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RDbGVhclZpYVJlZmxlY3Rpb24obWVzc2FnZSk7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotCi0gIC8vIE1lc3NhZ2VzIHNob3VsZCByZXR1cm4gcG9pbnRlcnMgdG8gZGVmYXVsdCBpbnN0YW5jZXMgdW50aWwgZmlyc3QgdXNlLgotICAvLyAoVGhpcyBpcyBub3QgY2hlY2tlZCBieSBFeHBlY3RDbGVhcigpIHNpbmNlIGl0IGlzIG5vdCBhY3R1YWxseSB0cnVlIGFmdGVyCi0gIC8vIHRoZSBmaWVsZHMgaGF2ZSBiZWVuIHNldCBhbmQgdGhlbiBjbGVhcmVkLikKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpKTsKLSAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKSk7Ci0gIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOwotICBFWFBFQ1RfRVEoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgQWNjZXNzb3JzKSB7Ci0gIC8vIFNldCBldmVyeSBmaWVsZCB0byBhIHVuaXF1ZSB2YWx1ZSB0aGVuIGdvIGJhY2sgYW5kIGNoZWNrIGFsbCB0aG9zZQotICAvLyB2YWx1ZXMuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKLQotICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLQotICByZWZsZWN0aW9uX3Rlc3Rlci5Nb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEdldFN0cmluZ1JlZmVyZW5jZSkgewotICAvLyBUZXN0IHRoYXQgR2V0U3RyaW5nUmVmZXJlbmNlKCkgcmV0dXJucyB0aGUgdW5kZXJseWluZyBzdHJpbmcgd2hlbiBpdCBpcwotICAvLyBhIG5vcm1hbCBzdHJpbmcgZmllbGQuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJmb28iKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJmb28iKTsKLQotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHN0cmluZyBzY3JhdGNoOwotCi0gIEVYUEVDVF9FUSgmbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSwKLSAgICAgICZyZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIiksICZzY3JhdGNoKSkKLSAgICA8PCAiRm9yIHNpbXBsZSBzdHJpbmcgZmllbGRzLCBHZXRTdHJpbmdSZWZlcmVuY2UoKSBzaG91bGQgcmV0dXJuIGEgIgotICAgICAgICJyZWZlcmVuY2UgdG8gdGhlIHVuZGVybHlpbmcgc3RyaW5nLiI7Ci0gIEVYUEVDVF9FUSgmbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcoMCksCi0gICAgICAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgJnNjcmF0Y2gpKQotICAgIDw8ICJGb3Igc2ltcGxlIHN0cmluZyBmaWVsZHMsIEdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKCkgc2hvdWxkIHJldHVybiAiCi0gICAgICAgImEgcmVmZXJlbmNlIHRvIHRoZSB1bmRlcmx5aW5nIHN0cmluZy4iOwotfQotCi0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBEZWZhdWx0c0FmdGVyQ2xlYXIpIHsKLSAgLy8gQ2hlY2sgdGhhdCBhZnRlciBzZXR0aW5nIGFsbCBmaWVsZHMgYW5kIHRoZW4gY2xlYXJpbmcsIGdldHRpbmcgYW4KLSAgLy8gZW1iZWRkZWQgbWVzc2FnZSBkb2VzIE5PVCByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2UuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKLSAgbWVzc2FnZS5DbGVhcigpOwotCi0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLQotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok9wdGlvbmFsR3JvdXA6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiKSkpOwotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKTsKLSAgRVhQRUNUX05FKCZ1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Ci0gIEVYUEVDVF9ORSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSk7Ci19Ci0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXApIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMjsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKLSAgcmVmbGVjdGlvbi0+U3dhcCgmbWVzc2FnZTEsICZtZXNzYWdlMik7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwV2l0aEJvdGhTZXQpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMjsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UyKTsKLSAgVGVzdFV0aWw6Ok1vZGlmeVJlcGVhdGVkRmllbGRzKCZtZXNzYWdlMik7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKLSAgcmVmbGVjdGlvbi0+U3dhcCgmbWVzc2FnZTEsICZtZXNzYWdlMik7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLQotICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfaW50MzIoNTMyODE5KTsKLQotICByZWZsZWN0aW9uLT5Td2FwKCZtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKLQotICBFWFBFQ1RfRVEoNTMyODE5LCBtZXNzYWdlMi5vcHRpb25hbF9pbnQzMigpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBFeHRlbnNpb25zKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKLSAgcmVmbGVjdGlvbi0+U3dhcCgmbWVzc2FnZTEsICZtZXNzYWdlMik7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBVbmtub3duKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLQotICBtZXNzYWdlMS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgxMjM0LCAxKTsKLQotICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTEudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UyLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZTEudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UyLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwRmllbGRzKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICBtZXNzYWdlMS5zZXRfb3B0aW9uYWxfZG91YmxlKDEyLjMpOwotICBtZXNzYWdlMS5tdXRhYmxlX3JlcGVhdGVkX2ludDMyKCktPkFkZCgxMCk7Ci0gIG1lc3NhZ2UxLm11dGFibGVfcmVwZWF0ZWRfaW50MzIoKS0+QWRkKDIwKTsKLQotICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfc3RyaW5nKCJoZWxsbyIpOwotICBtZXNzYWdlMi5tdXRhYmxlX3JlcGVhdGVkX2ludDY0KCktPkFkZCgzMCk7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UxLkdldERlc2NyaXB0b3IoKTsKLSAgZmllbGRzLnB1c2hfYmFjayhkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2RvdWJsZSIpKTsKLSAgZmllbGRzLnB1c2hfYmFjayhkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIikpOwotICBmaWVsZHMucHVzaF9iYWNrKGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfc3RyaW5nIikpOwotICBmaWVsZHMucHVzaF9iYWNrKGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfdWludDY0IikpOwotCi0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLmhhc19vcHRpb25hbF9kb3VibGUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlMS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMS5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZTEub3B0aW9uYWxfc3RyaW5nKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZTEucmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLmhhc19vcHRpb25hbF91aW50NjQoKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX29wdGlvbmFsX2RvdWJsZSgpKTsKLSAgRVhQRUNUX0VRKDEyLjMsIG1lc3NhZ2UyLm9wdGlvbmFsX2RvdWJsZSgpKTsKLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgxMCwgbWVzc2FnZTIucmVwZWF0ZWRfaW50MzIoMCkpOwotICBFWFBFQ1RfRVEoMjAsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUSgxLCBtZXNzYWdlMi5yZXBlYXRlZF9pbnQ2NF9zaXplKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZTIuaGFzX29wdGlvbmFsX3VpbnQ2NCgpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBGaWVsZHNBbGwpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlMjsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlMik7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlMiwgJmZpZWxkcyk7Ci0gIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMik7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwRmllbGRzQWxsRXh0ZW5zaW9uKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UyOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlMSwgJmZpZWxkcyk7Ci0gIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBPbmVvZikgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UxKTsKLQotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOwotICByZWZsZWN0aW9uLT5Td2FwKCZtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKLQotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZDbGVhcihtZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEobWVzc2FnZTIpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcE9uZW9mQm90aFNldCkgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UxKTsKLSAgVGVzdFV0aWw6OlNldE9uZW9mMigmbWVzc2FnZTIpOwotCi0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHJlZmxlY3Rpb24tPlN3YXAoJm1lc3NhZ2UxLCAmbWVzc2FnZTIpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDIobWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UyKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBGaWVsZHNPbmVvZikgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0gIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UxKTsKLQotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZTEuR2V0RGVzY3JpcHRvcigpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+ZmllbGQoaSkpOwotICB9Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIobWVzc2FnZTEpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UyKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbW92ZUxhc3QpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKLSAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotCi0gIHJlZmxlY3Rpb25fdGVzdGVyLlJlbW92ZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKLQotICBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkc1JlbW92ZWQobWVzc2FnZSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZW1vdmVMYXN0RXh0ZW5zaW9ucykgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLQotICByZWZsZWN0aW9uX3Rlc3Rlci5SZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZW1vdmVkKG1lc3NhZ2UpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZUxhc3QpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7Ci0gIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3IpOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotCi0gIHJlZmxlY3Rpb25fdGVzdGVyLlJlbGVhc2VMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSwgZmFsc2UpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRzUmVsZWFzZWQobWVzc2FnZSk7Ci0KLSAgLy8gTm93IHRlc3QgdGhhdCB3ZSBhY3R1YWxseSByZWxlYXNlIHRoZSByaWdodCBtZXNzYWdlLgotICBtZXNzYWdlLkNsZWFyKCk7Ci0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBleHBlY3RlZCA9Ci0gICAgICBtZXNzYWdlLm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpOwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IHJlbGVhc2VkKG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTGFzdCgKLSAgICAgICZtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Ci0gIEVYUEVDVF9FUShleHBlY3RlZCwgcmVsZWFzZWQuZ2V0KCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZUxhc3RFeHRlbnNpb25zKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7Ci0gIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3IpOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLQotICByZWZsZWN0aW9uX3Rlc3Rlci5SZWxlYXNlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UsIHRydWUpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVsZWFzZWQobWVzc2FnZSk7Ci0KLSAgLy8gTm93IHRlc3QgdGhhdCB3ZSBhY3R1YWxseSByZWxlYXNlIHRoZSByaWdodCBtZXNzYWdlLgotICBtZXNzYWdlLkNsZWFyKCk7Ci0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSgKLSAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIGNvbnN0IHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogZXhwZWN0ZWQgPSBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24oCi0gICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSk7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gcmVsZWFzZWQobWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPlJlbGVhc2VMYXN0KAotICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKLSAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24iKSkpOwotICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlbGVhc2VkLmdldCgpKTsKLQotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcFJlcGVhdGVkRWxlbWVudHMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKLSAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotCi0gIC8vIFN3YXAgYW5kIHRlc3QgdGhhdCBmaWVsZHMgYXJlIGFsbCBzd2FwcGVkLgotICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZHNTd2FwcGVkKG1lc3NhZ2UpOwotCi0gIC8vIFN3YXAgYmFjayBhbmQgdGVzdCB0aGF0IGZpZWxkcyBhcmUgYWxsIGJhY2sgdG8gb3JpZ2luYWwgdmFsdWVzLgotICByZWZsZWN0aW9uX3Rlc3Rlci5Td2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwUmVwZWF0ZWRFbGVtZW50c0V4dGVuc2lvbikgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCkpOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLQotICAvLyBTd2FwIGFuZCB0ZXN0IHRoYXQgZmllbGRzIGFyZSBhbGwgc3dhcHBlZC4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zU3dhcHBlZChtZXNzYWdlKTsKLQotICAvLyBTd2FwIGJhY2sgYW5kIHRlc3QgdGhhdCBmaWVsZHMgYXJlIGFsbCBiYWNrIHRvIG9yaWdpbmFsIHZhbHVlcy4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEV4dGVuc2lvbnMpIHsKLSAgLy8gU2V0IGV2ZXJ5IGV4dGVuc2lvbiB0byBhIHVuaXF1ZSB2YWx1ZSB0aGVuIGdvIGJhY2sgYW5kIGNoZWNrIGFsbCB0aG9zZQotICAvLyB2YWx1ZXMuCi0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7Ci0KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOwotICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOwotCi0gIHJlZmxlY3Rpb25fdGVzdGVyLk1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEZpbmRFeHRlbnNpb25UeXBlQnlOdW1iZXIpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9Ci0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uMSA9Ci0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+RmluZEV4dGVuc2lvbkJ5TmFtZSgKLSAgICAgICJvcHRpb25hbF9pbnQzMl9leHRlbnNpb24iKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24yID0KLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAotICAgICAgInJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24iKTsKLQotICBFWFBFQ1RfRVEoZXh0ZW5zaW9uMSwKLSAgICAgICAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuc2lvbjEtPm51bWJlcigpKSk7Ci0gIEVYUEVDVF9FUShleHRlbnNpb24yLAotICAgICAgICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5zaW9uMi0+bnVtYmVyKCkpKTsKLQotICAvLyBOb24tZXhpc3RlbnQgZXh0ZW5zaW9uLgotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU51bWJlcig2MjM0MSkgPT0gTlVMTCk7Ci0KLSAgLy8gRXh0ZW5zaW9ucyBvZiBUZXN0QWxsRXh0ZW5zaW9ucyBzaG91bGQgbm90IHNob3cgdXAgYXMgZXh0ZW5zaW9ucyBvZgotICAvLyBvdGhlciB0eXBlcy4KLSAgRVhQRUNUX1RSVUUodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldFJlZmxlY3Rpb24oKS0+Ci0gICAgICAgICAgICAgIEZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKGV4dGVuc2lvbjEtPm51bWJlcigpKSA9PSBOVUxMKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSkgewotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0KLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb24xID0KLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKAotICAgICAgIm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIpOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbjIgPQotICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkZpbmRFeHRlbnNpb25CeU5hbWUoCi0gICAgICAicmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiIpOwotCi0gIEVYUEVDVF9FUShleHRlbnNpb24xLAotICAgICAgICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGV4dGVuc2lvbjEtPmZ1bGxfbmFtZSgpKSk7Ci0gIEVYUEVDVF9FUShleHRlbnNpb24yLAotICAgICAgICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGV4dGVuc2lvbjItPmZ1bGxfbmFtZSgpKSk7Ci0KLSAgLy8gTm9uLWV4aXN0ZW50IGV4dGVuc2lvbi4KLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dCIpID09IE5VTEwpOwotCi0gIC8vIEV4dGVuc2lvbnMgb2YgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIG5vdCBzaG93IHVwIGFzIGV4dGVuc2lvbnMgb2YKLSAgLy8gb3RoZXIgdHlwZXMuCi0gIEVYUEVDVF9UUlVFKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXRSZWZsZWN0aW9uKCktPgotICAgICAgICAgICAgICBGaW5kS25vd25FeHRlbnNpb25CeU5hbWUoZXh0ZW5zaW9uMS0+ZnVsbF9uYW1lKCkpID09IE5VTEwpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU2V0QWxsb2NhdGVkTWVzc2FnZVRlc3QpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBmcm9tX21lc3NhZ2UxOwotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGZyb21fbWVzc2FnZTI7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgdG9fbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJmZyb21fbWVzc2FnZTIpOwotCi0gIC8vIEJlZm9yZSBtb3ZpbmcgZmllbGRzLCB3ZSBleHBlY3QgdGhlIG5lc3RlZCBtZXNzYWdlcyB0byBiZSBOVUxMLgotICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKLSAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7Ci0KLSAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBtb3ZlZCB3ZSBzaG91bGQgZ2V0IG5vbi1OVUxMIHJlbGVhc2VzLgotICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAotICAgICAgJmZyb21fbWVzc2FnZTEsICZ0b19tZXNzYWdlKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCi0gICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKLQotICAvLyBBbm90aGVyIG1vdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2FuIFNldEFsbG9jYXRlZCBzZXZlcmFsIHRpbWVzLgotICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAotICAgICAgJmZyb21fbWVzc2FnZTIsICZ0b19tZXNzYWdlKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCi0gICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKLQotICAvLyBBZnRlciBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKCkgd2UgZXhwZWN0IHRoZQotICAvLyByZWxlYXNlcyB0byBiZSBOVUxMIGFnYWluLgotICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKAotICAgICAgJnRvX21lc3NhZ2UpOwotICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKLSAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTZXRBbGxvY2F0ZWRFeHRlbnNpb25NZXNzYWdlVGVzdCkgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgZnJvbV9tZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIGZyb21fbWVzc2FnZTI7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyB0b19tZXNzYWdlOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJmZyb21fbWVzc2FnZTEpOwotICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UyKTsKLQotICAvLyBCZWZvcmUgbW92aW5nIGZpZWxkcywgd2UgZXhwZWN0IHRoZSBuZXN0ZWQgbWVzc2FnZXMgdG8gYmUgTlVMTC4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCi0gICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OklTX05VTEwpOwotCi0gIC8vIEFmdGVyIGZpZWxkcyBhcmUgbW92ZWQgd2Ugc2hvdWxkIGdldCBub24tTlVMTCByZWxlYXNlcy4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9NZXNzYWdlVmlhUmVmbGVjdGlvbigKLSAgICAgICZmcm9tX21lc3NhZ2UxLCAmdG9fbWVzc2FnZSk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAotICAgICAgJnRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7Ci0KLSAgLy8gQW5vdGhlciBtb3ZlIHRvIG1ha2Ugc3VyZSB0aGF0IHdlIGNhbiBTZXRBbGxvY2F0ZWQgc2V2ZXJhbCB0aW1lcy4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9NZXNzYWdlVmlhUmVmbGVjdGlvbigKLSAgICAgICZmcm9tX21lc3NhZ2UyLCAmdG9fbWVzc2FnZSk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAotICAgICAgJnRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7Ci0KLSAgLy8gQWZ0ZXIgU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9OdWxsVmlhUmVmbGVjdGlvbigpIHdlIGV4cGVjdCB0aGUKLSAgLy8gcmVsZWFzZXMgdG8gYmUgTlVMTCBhZ2Fpbi4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9OdWxsVmlhUmVmbGVjdGlvbigKLSAgICAgICZ0b19tZXNzYWdlKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCi0gICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OklTX05VTEwpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgQWRkUmVwZWF0ZWRNZXNzYWdlKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIG5lc3RlZF9yZWZsZWN0aW9uID0KLSAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfYmIgPQotICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoCi0gICAgICAgICAgImJiIik7Ci0KLSAgTWVzc2FnZSogbmVzdGVkID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZSgKLSAgICAgICZtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgbmVzdGVkX3JlZmxlY3Rpb24tPlNldEludDMyKG5lc3RlZCwgbmVzdGVkX2JiLCAxMSk7Ci0KLSAgRVhQRUNUX0VRKDExLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgTXV0YWJsZVJlcGVhdGVkTWVzc2FnZSkgewotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotICBjb25zdCBSZWZsZWN0aW9uKiBuZXN0ZWRfcmVmbGVjdGlvbiA9Ci0gICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0UmVmbGVjdGlvbigpOwotCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbmVzdGVkX2JiID0KLSAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKAotICAgICAgICAgICJiYiIpOwotCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMik7Ci0KLSAgTWVzc2FnZSogbmVzdGVkID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKLSAgICAgICZtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAwKTsKLSAgRVhQRUNUX0VRKDEyLCBuZXN0ZWRfcmVmbGVjdGlvbi0+R2V0SW50MzIoKm5lc3RlZCwgbmVzdGVkX2JiKSk7Ci0gIG5lc3RlZF9yZWZsZWN0aW9uLT5TZXRJbnQzMihuZXN0ZWQsIG5lc3RlZF9iYiwgMTMpOwotICBFWFBFQ1RfRVEoMTMsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBBZGRBbGxvY2F0ZWRNZXNzYWdlKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSogbmVzdGVkID0KLSAgICAgIG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKCk7Ci0gIG5lc3RlZC0+c2V0X2JiKDExKTsKLSAgcmVmbGVjdGlvbi0+QWRkQWxsb2NhdGVkTWVzc2FnZSgmbWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgbmVzdGVkKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDExLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgTGlzdEZpZWxkc09uZU9mKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0gIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UpOwotCi0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKLSAgRVhQRUNUX0VRKDQsIGZpZWxkcy5zaXplKCkpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgT25lb2YpIHsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgLy8gQ2hlY2sgZGVmYXVsdCB2YWx1ZXMuCi0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5HZXRJbnQzMigKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2ludCIpKSk7Ci0gIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fc3RyaW5nIikpKTsKLSAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19jb3JkIikpKTsKLSAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmdfcGllY2UiKSkpOwotICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2J5dGVzIikpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08sIHJlZmxlY3Rpb24tPkdldEVudW0oCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19lbnVtIikpLT5udW1iZXIoKSk7Ci0gIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RPbmVvZjI6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAotICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX21lc3NhZ2UiKSkpOwotICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGb29Hcm91cDo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29ncm91cCIpKSk7Ci0gIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZvb0dyb3VwOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSkpOwotICBFWFBFQ1RfRVEoNSwgcmVmbGVjdGlvbi0+R2V0SW50MzIoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9pbnQiKSkpOwotICBFWFBFQ1RfRVEoIlNUUklORyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZyIpKSk7Ci0gIEVYUEVDVF9FUSgiQ09SRCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSkpOwotICBFWFBFQ1RfRVEoIlNQSUVDRSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZ19waWVjZSIpKSk7Ci0gIEVYUEVDVF9FUSgiQllURVMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9ieXRlcyIpKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6QkFSLCByZWZsZWN0aW9uLT5HZXRFbnVtKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfZW51bSIpKS0+bnVtYmVyKCkpOwotCi0gIC8vIENoZWNrIFNldCBmdW5jdGlvbnMuCi0gIHJlZmxlY3Rpb24tPlNldEludDMyKAotICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2ludCIpLCAxMjMpOwotICBFWFBFQ1RfRVEoMTIzLCByZWZsZWN0aW9uLT5HZXRJbnQzMigKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2ludCIpKSk7Ci0gIHJlZmxlY3Rpb24tPlNldFN0cmluZygKLSAgICAgICZtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmciKSwgImFiYyIpOwotICBFWFBFQ1RfRVEoImFiYyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX3N0cmluZyIpKSk7Ci0gIHJlZmxlY3Rpb24tPlNldFN0cmluZygKLSAgICAgICZtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19ieXRlcyIpLCAiYnl0ZXMiKTsKLSAgRVhQRUNUX0VRKCJieXRlcyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2J5dGVzIikpKTsKLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKAotICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSwgImNoYW5nZV9jb3JkIik7Ci0gIEVYUEVDVF9FUSgiY2hhbmdlX2NvcmQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9jb3JkIikpKTsKLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKAotICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZ19waWVjZSIpLAotICAgICAgImNoYW5nZV9zcGllY2UiKTsKLSAgRVhQRUNUX0VRKCJjaGFuZ2Vfc3BpZWNlIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfc3RyaW5nX3BpZWNlIikpKTsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFNldEFsbG9jYXRlZE9uZW9mTWVzc2FnZVRlc3QpIHsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgZnJvbV9tZXNzYWdlMTsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgZnJvbV9tZXNzYWdlMjsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgdG9fbWVzc2FnZTsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpkZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSB0b19tZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLQotICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKAotICAgICAgJnRvX21lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKLSAgRVhQRUNUX1RSVUUocmVsZWFzZWQgPT0gTlVMTCk7Ci0gIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCi0gICAgICAmdG9fbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKTsKLSAgRVhQRUNUX1RSVUUocmVsZWFzZWQgPT0gTlVMTCk7Ci0KLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldE9uZW9mVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSk7Ci0gIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RPbmVvZlNldFZpYVJlZmxlY3Rpb24oZnJvbV9tZXNzYWdlMSk7Ci0KLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OgotICAgICAgU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9NZXNzYWdlVmlhUmVmbGVjdGlvbigKLSAgICAgICAgICAmZnJvbV9tZXNzYWdlMSwgJnRvX21lc3NhZ2UpOwotICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCi0gICAgICB0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7Ci0gIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCi0gICAgICAmdG9fbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOwotICBFWFBFQ1RfVFJVRShyZWxlYXNlZCAhPSBOVUxMKTsKLSAgRVhQRUNUX0VRKCZzdWJfbWVzc2FnZSwgcmVsZWFzZWQpOwotICBkZWxldGUgcmVsZWFzZWQ7Ci0KLSAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldE9uZW9mVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMik7Ci0KLSAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UoCi0gICAgICAmZnJvbV9tZXNzYWdlMiwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKTsKLQotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Ci0gICAgICBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAotICAgICAgICAgICZmcm9tX21lc3NhZ2UyLCAmdG9fbWVzc2FnZSk7Ci0KLSAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UyID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKLSAgICAgIHRvX21lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX21lc3NhZ2UiKSk7Ci0gIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCi0gICAgICAmdG9fbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKTsKLSAgRVhQRUNUX1RSVUUocmVsZWFzZWQgIT0gTlVMTCk7Ci0gIEVYUEVDVF9FUSgmc3ViX21lc3NhZ2UyLCByZWxlYXNlZCk7Ci0gIGRlbGV0ZSByZWxlYXNlZDsKLX0KLQotVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbGVhc2VNZXNzYWdlVGVzdCkgewotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0gIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAotICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSk7Ci0KLSAgLy8gV2hlbiBub3RoaW5nIGlzIHNldCwgd2UgZXhwZWN0IGFsbCByZWxlYXNlZCBtZXNzYWdlcyB0byBiZSBOVUxMLgotICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKLSAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7Ci0KLSAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBzZXQgd2Ugc2hvdWxkIGdldCBub24tTlVMTCByZWxlYXNlcy4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAotICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7Ci0KLSAgLy8gQWZ0ZXIgQ2xlYXIoKSB3ZSBtYXkgb3IgbWF5IG5vdCBnZXQgYSBtZXNzYWdlIGZyb20gUmVsZWFzZU1lc3NhZ2UoKS4KLSAgLy8gVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCi0gICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkNBTl9CRV9OVUxMKTsKLQotICAvLyBUZXN0IGEgZGlmZmVyZW50IGNvZGUgcGF0aCBmb3Igc2V0dGluZyBhZnRlciByZWxlYXNpbmcuCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOwotfQotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZUV4dGVuc2lvbk1lc3NhZ2VUZXN0KSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKLSAgICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM6OmRlc2NyaXB0b3IoKSk7Ci0KLSAgLy8gV2hlbiBub3RoaW5nIGlzIHNldCwgd2UgZXhwZWN0IGFsbCByZWxlYXNlZCBtZXNzYWdlcyB0byBiZSBOVUxMLgotICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKLSAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7Ci0KLSAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBzZXQgd2Ugc2hvdWxkIGdldCBub24tTlVMTCByZWxlYXNlcy4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAotICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpOT1RfTlVMTCk7Ci0KLSAgLy8gQWZ0ZXIgQ2xlYXIoKSB3ZSBtYXkgb3IgbWF5IG5vdCBnZXQgYSBtZXNzYWdlIGZyb20gUmVsZWFzZU1lc3NhZ2UoKS4KLSAgLy8gVGhpcyBpcyBpbXBsZW1lbnRhdGlvbiBzcGVjaWZpYy4KLSAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmbWVzc2FnZSk7Ci0gIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCi0gICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkNBTl9CRV9OVUxMKTsKLQotICAvLyBUZXN0IGEgZGlmZmVyZW50IGNvZGUgcGF0aCBmb3Igc2V0dGluZyBhZnRlciByZWxlYXNpbmcuCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Ci19Ci0KLVRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZWxlYXNlT25lb2ZNZXNzYWdlVGVzdCkgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOwotICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKLQotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmRlc2NyaXB0b3IoKTsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7Ci0gIE1lc3NhZ2UqIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCi0gICAgICAmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOwotCi0gIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IE5VTEwpOwotICBFWFBFQ1RfRVEoJnN1Yl9tZXNzYWdlLCByZWxlYXNlZCk7Ci0gIGRlbGV0ZSByZWxlYXNlZDsKLQotICByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKAotICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKLSAgRVhQRUNUX1RSVUUocmVsZWFzZWQgPT0gTlVMTCk7Ci19Ci0KLSNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAotCi1URVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgVXNhZ2VFcnJvcnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKLQotI2RlZmluZSBmKE5BTUUpIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZShOQU1FKQotCi0gIC8vIFRlc3RpbmcgZXZlcnkgc2luZ2xlIGZhaWx1cmUgbW9kZSB3b3VsZCBiZSB0b28gbXVjaCB3b3JrLiAgTGV0J3MganVzdAotICAvLyBjaGVjayBhIGZldy4KLSAgRVhQRUNUX0RFQVRIKAotICAgIHJlZmxlY3Rpb24tPkdldEludDMyKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQ2NCIpKSwKLSAgICAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCi0gICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjpHZXRJbnQzMlxuIgotICAgICIgIE1lc3NhZ2UgdHlwZTogcHJvdG9idWZfdW5pdHRlc3RcXC5UZXN0QWxsVHlwZXNcbiIKLSAgICAiICBGaWVsZCAgICAgICA6IHByb3RvYnVmX3VuaXR0ZXN0XFwuVGVzdEFsbFR5cGVzXFwub3B0aW9uYWxfaW50NjRcbiIKLSAgICAiICBQcm9ibGVtICAgICA6IEZpZWxkIGlzIG5vdCB0aGUgcmlnaHQgdHlwZSBmb3IgdGhpcyBtZXNzYWdlOlxuIgotICAgICIgICAgRXhwZWN0ZWQgIDogQ1BQVFlQRV9JTlQzMlxuIgotICAgICIgICAgRmllbGQgdHlwZTogQ1BQVFlQRV9JTlQ2NCIpOwotICBFWFBFQ1RfREVBVEgoCi0gICAgcmVmbGVjdGlvbi0+R2V0SW50MzIoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIikpLAotICAgICJQcm90b2NvbCBCdWZmZXIgcmVmbGVjdGlvbiB1c2FnZSBlcnJvcjpcbiIKLSAgICAiICBNZXRob2QgICAgICA6IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb246OkdldEludDMyXG4iCi0gICAgIiAgTWVzc2FnZSB0eXBlOiBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcbiIKLSAgICAiICBGaWVsZCAgICAgICA6IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5yZXBlYXRlZF9pbnQzMlxuIgotICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgaXMgcmVwZWF0ZWQ7IHRoZSBtZXRob2QgcmVxdWlyZXMgYSBzaW5ndWxhciBmaWVsZC4iKTsKLSAgRVhQRUNUX0RFQVRIKAotICAgIHJlZmxlY3Rpb24tPkdldEludDMyKAotICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgiYyIpKSwKLSAgICAiUHJvdG9jb2wgQnVmZmVyIHJlZmxlY3Rpb24gdXNhZ2UgZXJyb3I6XG4iCi0gICAgIiAgTWV0aG9kICAgICAgOiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uOjpHZXRJbnQzMlxuIgotICAgICIgIE1lc3NhZ2UgdHlwZTogcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXG4iCi0gICAgIiAgRmllbGQgICAgICAgOiBwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZS5jXG4iCi0gICAgIiAgUHJvYmxlbSAgICAgOiBGaWVsZCBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7Ci0gIEVYUEVDVF9ERUFUSCgKLSAgICByZWZsZWN0aW9uLT5IYXNGaWVsZCgKLSAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImMiKSksCi0gICAgIlByb3RvY29sIEJ1ZmZlciByZWZsZWN0aW9uIHVzYWdlIGVycm9yOlxuIgotICAgICIgIE1ldGhvZCAgICAgIDogZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbjo6SGFzRmllbGRcbiIKLSAgICAiICBNZXNzYWdlIHR5cGU6IHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1xuIgotICAgICIgIEZpZWxkICAgICAgIDogcHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2UuY1xuIgotICAgICIgIFByb2JsZW0gICAgIDogRmllbGQgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOwotCi0jdW5kZWYgZgotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCi0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMzM0MDUxYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw4NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgotCi0jaW5jbHVkZSA8bGltaXRzPgotCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWRvdWJsZSBJbmZpbml0eSgpIHsKLSAgcmV0dXJuIHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKTsKLX0KLWRvdWJsZSBOYU4oKSB7Ci0gIHJldHVybiBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpOwotfQotCi1jb25zdCA6OnN0ZDo6c3RyaW5nKiBlbXB0eV9zdHJpbmdfOwotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShlbXB0eV9zdHJpbmdfb25jZV9pbml0Xyk7Ci0KLXZvaWQgRGVsZXRlRW1wdHlTdHJpbmcoKSB7Ci0gIGRlbGV0ZSBlbXB0eV9zdHJpbmdfOwotfQotCi12b2lkIEluaXRFbXB0eVN0cmluZygpIHsKLSAgZW1wdHlfc3RyaW5nXyA9IG5ldyBzdHJpbmc7Ci0gIE9uU2h1dGRvd24oJkRlbGV0ZUVtcHR5U3RyaW5nKTsKLX0KLQotY29uc3QgOjpzdGQ6OnN0cmluZyYgR2V0RW1wdHlTdHJpbmcoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJmVtcHR5X3N0cmluZ19vbmNlX2luaXRfLCAmSW5pdEVtcHR5U3RyaW5nKTsKLSAgcmV0dXJuIEdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpOwotfQotCi0KLWludCBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIGNvbnN0IHZvaWQqIHN0YXJ0ID0gJnN0cjsKLSAgY29uc3Qgdm9pZCogZW5kID0gJnN0ciArIDE7Ci0gIGlmIChzdGFydCA8PSBzdHIuZGF0YSgpICYmIHN0ci5kYXRhKCkgPCBlbmQpIHsKLSAgICAvLyBUaGUgc3RyaW5nJ3MgZGF0YSBpcyBzdG9yZWQgaW5zaWRlIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZi4KLSAgICByZXR1cm4gMDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3RyLmNhcGFjaXR5KCk7Ci0gIH0KLX0KLQotCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNmYxOGRhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTIwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgbWlzY2VsbGFuZW91cyBoZWxwZXIgY29kZSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlIC0tCi0vLyBpbmNsdWRpbmcgbGl0ZSB0eXBlcyAtLSBidXQgd2hpY2ggc2hvdWxkIG5vdCBiZSB1c2VkIGRpcmVjdGx5IGJ5IHVzZXJzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9VVElMX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVVRJTF9IX18KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotY2xhc3MgQXJlbmE7Ci1uYW1lc3BhY2UgaW8geyBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyB9Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLQotLy8gQW5ub3RhdGlvbiBmb3IgdGhlIGNvbXBpbGVyIHRvIGVtaXQgYSBkZXByZWNhdGlvbiBtZXNzYWdlIGlmIGEgZmllbGQgbWFya2VkCi0vLyB3aXRoIG9wdGlvbiAnZGVwcmVjYXRlZD10cnVlJyBpcyB1c2VkIGluIHRoZSBjb2RlLCBvciBmb3Igb3RoZXIgdGhpbmdzIGluCi0vLyBnZW5lcmF0ZWQgY29kZSB3aGljaCBhcmUgZGVwcmVjYXRlZC4KLS8vCi0vLyBGb3IgaW50ZXJuYWwgdXNlIGluIHRoZSBwYi5jYyBmaWxlcywgZGVwcmVjYXRpb24gd2FybmluZ3MgYXJlIHN1cHByZXNzZWQKLS8vIHRoZXJlLgotI3VuZGVmIERFUFJFQ0FURURfUFJPVE9CVUZfRklFTEQKLSNkZWZpbmUgUFJPVE9CVUZfREVQUkVDQVRFRAotCi0jZGVmaW5lIFBST1RPQlVGX0RFUFJFQ0FURURfQVRUUgotCi0KLS8vIENvbnN0YW50cyBmb3Igc3BlY2lhbCBmbG9hdGluZyBwb2ludCB2YWx1ZXMuCi1MSUJQUk9UT0JVRl9FWFBPUlQgZG91YmxlIEluZmluaXR5KCk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgZG91YmxlIE5hTigpOwotCi0vLyBUT0RPKGppZWx1byk6IENoYW5nZSB0byB0ZW1wbGF0ZS4gV2UgaGF2ZSB0cmllZCB0byB1c2UgdGVtcGxhdGUsCi0vLyBidXQgaXQgY2F1c2VzIG5ldC9ycGMvcHl0aG9uOnJwY3V0aWxfdGVzdCBmYWlsICh0aGUgZW1wdHkgc3RyaW5nIHdpbGwKLS8vIGluaXQgdHdpY2UpLiBJdCBtYXkgcmVsYXRlZCB0byBzd2lnLiBDaGFuZ2UgdG8gdGVtcGxhdGUgYWZ0ZXIgd2UKLS8vIGZvdW5kIHRoZSBzb2x1dGlvbi4KLQotLy8gRGVmYXVsdCBlbXB0eSBzdHJpbmcgb2JqZWN0LiBEb24ndCB1c2UgdGhlIHBvaW50ZXIgZGlyZWN0bHkuIEluc3RlYWQsIGNhbGwKLS8vIEdldEVtcHR5U3RyaW5nKCkgdG8gZ2V0IHRoZSByZWZlcmVuY2UuCi1MSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6c3RkOjpzdHJpbmcqIGVtcHR5X3N0cmluZ187Ci1MSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFByb3RvYnVmT25jZVR5cGUgZW1wdHlfc3RyaW5nX29uY2VfaW5pdF87Ci1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBJbml0RW1wdHlTdHJpbmcoKTsKLQotCi1MSUJQUk9UT0JVRl9FWFBPUlQgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpIHsKLSAgYXNzZXJ0KGVtcHR5X3N0cmluZ18gIT0gTlVMTCk7Ci0gIHJldHVybiAqZW1wdHlfc3RyaW5nXzsKLX0KLQotTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEdldEVtcHR5U3RyaW5nKCk7Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBpbnQgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZihjb25zdCBzdHJpbmcmIHN0cik7Ci0KLQotLy8gVHJ1ZSBpZiBJc0luaXRpYWxpemVkKCkgaXMgdHJ1ZSBmb3IgYWxsIGVsZW1lbnRzIG9mIHQuICBUeXBlIGlzIGV4cGVjdGVkCi0vLyB0byBiZSBhIFJlcGVhdGVkUHRyRmllbGQ8c29tZSBtZXNzYWdlIHR5cGU+LiAgSXQncyB1c2VmdWwgdG8gaGF2ZSB0aGlzCi0vLyBoZWxwZXIgaGVyZSB0byBrZWVwIHRoZSBwcm90b2J1ZiBjb21waWxlciBmcm9tIGV2ZXIgaGF2aW5nIHRvIGVtaXQgbG9vcHMgaW4KLS8vIElzSW5pdGlhbGl6ZWQoKSBtZXRob2RzLiAgV2Ugd2FudCB0aGUgQysrIGNvbXBpbGVyIHRvIGlubGluZSB0aGlzIG9yIG5vdAotLy8gYXMgaXQgc2VlcyBmaXQuCi10ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gYm9vbCBBbGxBcmVJbml0aWFsaXplZChjb25zdCBUeXBlJiB0KSB7Ci0gIGZvciAoaW50IGkgPSB0LnNpemUoKTsgLS1pID49IDA7ICkgewotICAgIGlmICghdC5HZXQoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWNsYXNzIEFyZW5hU3RyaW5nOwotCi0vLyBSZWFkIGEgbGVuZ3RoICh2YXJpbnQzMiksIGZvbGxvd2VkIGJ5IGEgc3RyaW5nLCBmcm9tICppbnB1dC4gIFJldHVybiBhCi0vLyBwb2ludGVyIHRvIGEgY29weSBvZiB0aGUgc3RyaW5nIHRoYXQgcmVzaWRlcyBpbiAqYXJlbmEuICBSZXF1aXJlcyBib3RoCi0vLyBhcmdzIHRvIGJlIG5vbi1OVUxMLiAgSWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2hpbGUgcmVhZGluZyB0aGUgZGF0YQotLy8gdGhlbiBOVUxMIGlzIHJldHVybmVkIChlLmcuLCBpbnB1dCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgdmFsaWQgdmFyaW50KS4KLUFyZW5hU3RyaW5nKiBSZWFkQXJlbmFTdHJpbmcoOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ4MzU0YzEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MKKysrIC9kZXYvbnVsbApAQCAtMSw5MTcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgaW1wbGVtZW50YXRpb24gaXMgaGVhdmlseSBvcHRpbWl6ZWQgdG8gbWFrZSByZWFkcyBhbmQgd3JpdGVzCi0vLyBvZiBzbWFsbCB2YWx1ZXMgKGVzcGVjaWFsbHkgdmFyaW50cykgYXMgZmFzdCBhcyBwb3NzaWJsZS4gIEluCi0vLyBwYXJ0aWN1bGFyLCB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIHRoYXQgYSByZWFkIG9yIGEgd3JpdGUKLS8vIHdpbGwgbm90IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgc2luY2Ugd2UgY2FuIGF2b2lkIGEgbG90Ci0vLyBvZiBicmFuY2hpbmcgaW4gdGhpcyBjYXNlLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgotCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLXN0YXRpYyBjb25zdCBpbnQga01heFZhcmludEJ5dGVzID0gMTA7Ci1zdGF0aWMgY29uc3QgaW50IGtNYXhWYXJpbnQzMkJ5dGVzID0gNTsKLQotCi1pbmxpbmUgYm9vbCBOZXh0Tm9uRW1wdHkoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgewotICBib29sIHN1Y2Nlc3M7Ci0gIGRvIHsKLSAgICBzdWNjZXNzID0gaW5wdXQtPk5leHQoZGF0YSwgc2l6ZSk7Ci0gIH0gd2hpbGUgKHN1Y2Nlc3MgJiYgKnNpemUgPT0gMCk7Ci0gIHJldHVybiBzdWNjZXNzOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gQ29kZWRJbnB1dFN0cmVhbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db2RlZElucHV0U3RyZWFtOjp+Q29kZWRJbnB1dFN0cmVhbSgpIHsKLSAgaWYgKGlucHV0XyAhPSBOVUxMKSB7Ci0gICAgQmFja1VwSW5wdXRUb0N1cnJlbnRQb3NpdGlvbigpOwotICB9Ci0KLSAgaWYgKHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXyA9PSAtMikgewotICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCB3YXMgIiA8PCB0b3RhbF9ieXRlc19yZWFkXzsKLSAgfQotfQotCi0vLyBTdGF0aWMuCi1pbnQgQ29kZWRJbnB1dFN0cmVhbTo6ZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfID0gMTAwOwotCi0KLXZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OkVuYWJsZUFsaWFzaW5nKGJvb2wgZW5hYmxlZCkgewotICBhbGlhc2luZ19lbmFibGVkXyA9IGVuYWJsZWQgJiYgb3V0cHV0Xy0+QWxsb3dzQWxpYXNpbmcoKTsKLX0KLQotdm9pZCBDb2RlZElucHV0U3RyZWFtOjpCYWNrVXBJbnB1dFRvQ3VycmVudFBvc2l0aW9uKCkgewotICBpbnQgYmFja3VwX2J5dGVzID0gQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfICsgb3ZlcmZsb3dfYnl0ZXNfOwotICBpZiAoYmFja3VwX2J5dGVzID4gMCkgewotICAgIGlucHV0Xy0+QmFja1VwKGJhY2t1cF9ieXRlcyk7Ci0KLSAgICAvLyB0b3RhbF9ieXRlc19yZWFkXyBkb2Vzbid0IGluY2x1ZGUgb3ZlcmZsb3dfYnl0ZXNfLgotICAgIHRvdGFsX2J5dGVzX3JlYWRfIC09IEJ1ZmZlclNpemUoKSArIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKLSAgICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl87Ci0gICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID0gMDsKLSAgICBvdmVyZmxvd19ieXRlc18gPSAwOwotICB9Ci19Ci0KLWlubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OlJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpIHsKLSAgYnVmZmVyX2VuZF8gKz0gYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOwotICBpbnQgY2xvc2VzdF9saW1pdCA9IHN0ZDo6bWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOwotICBpZiAoY2xvc2VzdF9saW1pdCA8IHRvdGFsX2J5dGVzX3JlYWRfKSB7Ci0gICAgLy8gVGhlIGxpbWl0IHBvc2l0aW9uIGlzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4gIFdlIG11c3QgYWRqdXN0Ci0gICAgLy8gdGhlIGJ1ZmZlciBzaXplIGFjY29yZGluZ2x5LgotICAgIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyA9IHRvdGFsX2J5dGVzX3JlYWRfIC0gY2xvc2VzdF9saW1pdDsKLSAgICBidWZmZXJfZW5kXyAtPSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF87Ci0gIH0gZWxzZSB7Ci0gICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID0gMDsKLSAgfQotfQotCi1Db2RlZElucHV0U3RyZWFtOjpMaW1pdCBDb2RlZElucHV0U3RyZWFtOjpQdXNoTGltaXQoaW50IGJ5dGVfbGltaXQpIHsKLSAgLy8gQ3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0uCi0gIGludCBjdXJyZW50X3Bvc2l0aW9uID0gQ3VycmVudFBvc2l0aW9uKCk7Ci0KLSAgTGltaXQgb2xkX2xpbWl0ID0gY3VycmVudF9saW1pdF87Ci0KLSAgLy8gc2VjdXJpdHk6IGJ5dGVfbGltaXQgaXMgcG9zc2libHkgZXZpbCwgc28gY2hlY2sgZm9yIG5lZ2F0aXZlIHZhbHVlcwotICAvLyBhbmQgb3ZlcmZsb3cuCi0gIGlmIChieXRlX2xpbWl0ID49IDAgJiYKLSAgICAgIGJ5dGVfbGltaXQgPD0gSU5UX01BWCAtIGN1cnJlbnRfcG9zaXRpb24pIHsKLSAgICBjdXJyZW50X2xpbWl0XyA9IGN1cnJlbnRfcG9zaXRpb24gKyBieXRlX2xpbWl0OwotICB9IGVsc2UgewotICAgIC8vIE5lZ2F0aXZlIG9yIG92ZXJmbG93LgotICAgIGN1cnJlbnRfbGltaXRfID0gSU5UX01BWDsKLSAgfQotCi0gIC8vIFdlIG5lZWQgdG8gZW5mb3JjZSBhbGwgbGltaXRzLCBub3QganVzdCB0aGUgbmV3IG9uZSwgc28gaWYgdGhlIHByZXZpb3VzCi0gIC8vIGxpbWl0IHdhcyBiZWZvcmUgdGhlIG5ldyByZXF1ZXN0ZWQgbGltaXQsIHdlIGNvbnRpbnVlIHRvIGVuZm9yY2UgdGhlCi0gIC8vIHByZXZpb3VzIGxpbWl0LgotICBjdXJyZW50X2xpbWl0XyA9IHN0ZDo6bWluKGN1cnJlbnRfbGltaXRfLCBvbGRfbGltaXQpOwotCi0gIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOwotICByZXR1cm4gb2xkX2xpbWl0OwotfQotCi12b2lkIENvZGVkSW5wdXRTdHJlYW06OlBvcExpbWl0KExpbWl0IGxpbWl0KSB7Ci0gIC8vIFRoZSBsaW1pdCBwYXNzZWQgaW4gaXMgYWN0dWFsbHkgdGhlICpvbGQqIGxpbWl0LCB3aGljaCB3ZSByZXR1cm5lZCBmcm9tCi0gIC8vIFB1c2hMaW1pdCgpLgotICBjdXJyZW50X2xpbWl0XyA9IGxpbWl0OwotICBSZWNvbXB1dGVCdWZmZXJMaW1pdHMoKTsKLQotICAvLyBXZSBtYXkgbm8gbG9uZ2VyIGJlIGF0IGEgbGVnaXRpbWF0ZSBtZXNzYWdlIGVuZC4gIFJlYWRUYWcoKSBuZWVkcyB0byBiZQotICAvLyBjYWxsZWQgYWdhaW4gdG8gZmluZCBvdXQuCi0gIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfID0gZmFsc2U7Ci19Ci0KLXN0ZDo6cGFpcjxDb2RlZElucHV0U3RyZWFtOjpMaW1pdCwgaW50PgotQ29kZWRJbnB1dFN0cmVhbTo6SW5jcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQdXNoTGltaXQoaW50IGJ5dGVfbGltaXQpIHsKLSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFB1c2hMaW1pdChieXRlX2xpbWl0KSwgLS1yZWN1cnNpb25fYnVkZ2V0Xyk7Ci19Ci0KLUNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IENvZGVkSW5wdXRTdHJlYW06OlJlYWRMZW5ndGhBbmRQdXNoTGltaXQoKSB7Ci0gIHVpbnQzMiBsZW5ndGg7Ci0gIHJldHVybiBQdXNoTGltaXQoUmVhZFZhcmludDMyKCZsZW5ndGgpID8gbGVuZ3RoIDogMCk7Ci19Ci0KLWJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6RGVjcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQb3BMaW1pdChMaW1pdCBsaW1pdCkgewotICBib29sIHJlc3VsdCA9IENvbnN1bWVkRW50aXJlTWVzc2FnZSgpOwotICBQb3BMaW1pdChsaW1pdCk7Ci0gIEdPT0dMRV9EQ0hFQ0tfTFQocmVjdXJzaW9uX2J1ZGdldF8sIHJlY3Vyc2lvbl9saW1pdF8pOwotICArK3JlY3Vyc2lvbl9idWRnZXRfOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1ib29sIENvZGVkSW5wdXRTdHJlYW06OkNoZWNrRW50aXJlTWVzc2FnZUNvbnN1bWVkQW5kUG9wTGltaXQoTGltaXQgbGltaXQpIHsKLSAgYm9vbCByZXN1bHQgPSBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKLSAgUG9wTGltaXQobGltaXQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1pbnQgQ29kZWRJbnB1dFN0cmVhbTo6Qnl0ZXNVbnRpbExpbWl0KCkgY29uc3QgewotICBpZiAoY3VycmVudF9saW1pdF8gPT0gSU5UX01BWCkgcmV0dXJuIC0xOwotICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IEN1cnJlbnRQb3NpdGlvbigpOwotCi0gIHJldHVybiBjdXJyZW50X2xpbWl0XyAtIGN1cnJlbnRfcG9zaXRpb247Ci19Ci0KLXZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6U2V0VG90YWxCeXRlc0xpbWl0KAotICAgIGludCB0b3RhbF9ieXRlc19saW1pdCwgaW50IHdhcm5pbmdfdGhyZXNob2xkKSB7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgbGltaXQgaXNuJ3QgYWxyZWFkeSBwYXN0LCBzaW5jZSB0aGlzIGNvdWxkIGNvbmZ1c2Ugb3RoZXIKLSAgLy8gY29kZS4KLSAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSBDdXJyZW50UG9zaXRpb24oKTsKLSAgdG90YWxfYnl0ZXNfbGltaXRfID0gc3RkOjptYXgoY3VycmVudF9wb3NpdGlvbiwgdG90YWxfYnl0ZXNfbGltaXQpOwotICBpZiAod2FybmluZ190aHJlc2hvbGQgPj0gMCkgewotICAgIHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXyA9IHdhcm5pbmdfdGhyZXNob2xkOwotICB9IGVsc2UgewotICAgIC8vIHdhcm5pbmdfdGhyZXNob2xkIGlzIG5lZ2F0aXZlCi0gICAgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfID0gLTE7Ci0gIH0KLSAgUmVjb21wdXRlQnVmZmVyTGltaXRzKCk7Ci19Ci0KLWludCBDb2RlZElucHV0U3RyZWFtOjpCeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkgY29uc3QgewotICBpZiAodG90YWxfYnl0ZXNfbGltaXRfID09IElOVF9NQVgpIHJldHVybiAtMTsKLSAgcmV0dXJuIHRvdGFsX2J5dGVzX2xpbWl0XyAtIEN1cnJlbnRQb3NpdGlvbigpOwotfQotCi12b2lkIENvZGVkSW5wdXRTdHJlYW06OlByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKSB7Ci0gIEdPT0dMRV9MT0coRVJST1IpIDw8ICJBIHByb3RvY29sIG1lc3NhZ2Ugd2FzIHJlamVjdGVkIGJlY2F1c2UgaXQgd2FzIHRvbyAiCi0gICAgICAgICAgICAgICAgImJpZyAobW9yZSB0aGFuICIgPDwgdG90YWxfYnl0ZXNfbGltaXRfCi0gICAgICAgICAgICAgPDwgIiBieXRlcykuICBUbyBpbmNyZWFzZSB0aGUgbGltaXQgKG9yIHRvIGRpc2FibGUgdGhlc2UgIgotICAgICAgICAgICAgICAgICJ3YXJuaW5ncyksIHNlZSBDb2RlZElucHV0U3RyZWFtOjpTZXRUb3RhbEJ5dGVzTGltaXQoKSAiCi0gICAgICAgICAgICAgICAgImluIGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaC4iOwotfQotCi1ib29sIENvZGVkSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7Ci0gIGlmIChjb3VudCA8IDApIHJldHVybiBmYWxzZTsgIC8vIHNlY3VyaXR5OiBjb3VudCBpcyBvZnRlbiB1c2VyLXN1cHBsaWVkCi0KLSAgY29uc3QgaW50IG9yaWdpbmFsX2J1ZmZlcl9zaXplID0gQnVmZmVyU2l6ZSgpOwotCi0gIGlmIChjb3VudCA8PSBvcmlnaW5hbF9idWZmZXJfc2l6ZSkgewotICAgIC8vIEp1c3Qgc2tpcHBpbmcgd2l0aGluIHRoZSBjdXJyZW50IGJ1ZmZlci4gIEVhc3kuCi0gICAgQWR2YW5jZShjb3VudCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBpZiAoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCkgewotICAgIC8vIFdlIGhpdCBhIGxpbWl0IGluc2lkZSB0aGlzIGJ1ZmZlci4gIEFkdmFuY2UgdG8gdGhlIGxpbWl0IGFuZCBmYWlsLgotICAgIEFkdmFuY2Uob3JpZ2luYWxfYnVmZmVyX3NpemUpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGNvdW50IC09IG9yaWdpbmFsX2J1ZmZlcl9zaXplOwotICBidWZmZXJfID0gTlVMTDsKLSAgYnVmZmVyX2VuZF8gPSBidWZmZXJfOwotCi0gIC8vIE1ha2Ugc3VyZSB0aGlzIHNraXAgZG9lc24ndCB0cnkgdG8gc2tpcCBwYXN0IHRoZSBjdXJyZW50IGxpbWl0LgotICBpbnQgY2xvc2VzdF9saW1pdCA9IHN0ZDo6bWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOwotICBpbnQgYnl0ZXNfdW50aWxfbGltaXQgPSBjbG9zZXN0X2xpbWl0IC0gdG90YWxfYnl0ZXNfcmVhZF87Ci0gIGlmIChieXRlc191bnRpbF9saW1pdCA8IGNvdW50KSB7Ci0gICAgLy8gV2UgaGl0IHRoZSBsaW1pdC4gIFNraXAgdXAgdG8gaXQgdGhlbiBmYWlsLgotICAgIGlmIChieXRlc191bnRpbF9saW1pdCA+IDApIHsKLSAgICAgIHRvdGFsX2J5dGVzX3JlYWRfID0gY2xvc2VzdF9saW1pdDsKLSAgICAgIGlucHV0Xy0+U2tpcChieXRlc191bnRpbF9saW1pdCk7Ci0gICAgfQotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHRvdGFsX2J5dGVzX3JlYWRfICs9IGNvdW50OwotICByZXR1cm4gaW5wdXRfLT5Ta2lwKGNvdW50KTsKLX0KLQotYm9vbCBDb2RlZElucHV0U3RyZWFtOjpHZXREaXJlY3RCdWZmZXJQb2ludGVyKGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgaWYgKEJ1ZmZlclNpemUoKSA9PSAwICYmICFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKLQotICAqZGF0YSA9IGJ1ZmZlcl87Ci0gICpzaXplID0gQnVmZmVyU2l6ZSgpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkUmF3KHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKLSAgcmV0dXJuIEludGVybmFsUmVhZFJhd0lubGluZShidWZmZXIsIHNpemUpOwotfQotCi1ib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRTdHJpbmcoc3RyaW5nKiBidWZmZXIsIGludCBzaXplKSB7Ci0gIGlmIChzaXplIDwgMCkgcmV0dXJuIGZhbHNlOyAgLy8gc2VjdXJpdHk6IHNpemUgaXMgb2Z0ZW4gdXNlci1zdXBwbGllZAotICByZXR1cm4gSW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKGJ1ZmZlciwgc2l6ZSk7Ci19Ci0KLWJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFN0cmluZ0ZhbGxiYWNrKHN0cmluZyogYnVmZmVyLCBpbnQgc2l6ZSkgewotICBpZiAoIWJ1ZmZlci0+ZW1wdHkoKSkgewotICAgIGJ1ZmZlci0+Y2xlYXIoKTsKLSAgfQotCi0gIGludCBjbG9zZXN0X2xpbWl0ID0gc3RkOjptaW4oY3VycmVudF9saW1pdF8sIHRvdGFsX2J5dGVzX2xpbWl0Xyk7Ci0gIGlmIChjbG9zZXN0X2xpbWl0ICE9IElOVF9NQVgpIHsKLSAgICBpbnQgYnl0ZXNfdG9fbGltaXQgPSBjbG9zZXN0X2xpbWl0IC0gQ3VycmVudFBvc2l0aW9uKCk7Ci0gICAgaWYgKGJ5dGVzX3RvX2xpbWl0ID4gMCAmJiBzaXplID4gMCAmJiBzaXplIDw9IGJ5dGVzX3RvX2xpbWl0KSB7Ci0gICAgICBidWZmZXItPnJlc2VydmUoc2l6ZSk7Ci0gICAgfQotICB9Ci0KLSAgaW50IGN1cnJlbnRfYnVmZmVyX3NpemU7Ci0gIHdoaWxlICgoY3VycmVudF9idWZmZXJfc2l6ZSA9IEJ1ZmZlclNpemUoKSkgPCBzaXplKSB7Ci0gICAgLy8gU29tZSBTVEwgaW1wbGVtZW50YXRpb25zICJoZWxwZnVsbHkiIGNyYXNoIG9uIGJ1ZmZlci0+YXBwZW5kKE5VTEwsIDApLgotICAgIGlmIChjdXJyZW50X2J1ZmZlcl9zaXplICE9IDApIHsKLSAgICAgIC8vIE5vdGU6ICBzdHJpbmcxLmFwcGVuZChzdHJpbmcyKSBpcyBPKHN0cmluZzIuc2l6ZSgpKSAoYXMgb3Bwb3NlZCB0bwotICAgICAgLy8gICBPKHN0cmluZzEuc2l6ZSgpICsgc3RyaW5nMi5zaXplKCkpLCB3aGljaCB3b3VsZCBiZSBiYWQpLgotICAgICAgYnVmZmVyLT5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oYnVmZmVyXyksCi0gICAgICAgICAgICAgICAgICAgICBjdXJyZW50X2J1ZmZlcl9zaXplKTsKLSAgICB9Ci0gICAgc2l6ZSAtPSBjdXJyZW50X2J1ZmZlcl9zaXplOwotICAgIEFkdmFuY2UoY3VycmVudF9idWZmZXJfc2l6ZSk7Ci0gICAgaWYgKCFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGJ1ZmZlci0+YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlcl8pLCBzaXplKTsKLSAgQWR2YW5jZShzaXplKTsKLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotCi1ib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZhbGxiYWNrKHVpbnQzMiogdmFsdWUpIHsKLSAgdWludDggYnl0ZXNbc2l6ZW9mKCp2YWx1ZSldOwotCi0gIGNvbnN0IHVpbnQ4KiBwdHI7Ci0gIGlmIChCdWZmZXJTaXplKCkgPj0gc2l6ZW9mKCp2YWx1ZSkpIHsKLSAgICAvLyBGYXN0IHBhdGg6ICBFbm91Z2ggYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkIGRpcmVjdGx5LgotICAgIHB0ciA9IGJ1ZmZlcl87Ci0gICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gU2xvdyBwYXRoOiAgSGFkIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0gICAgaWYgKCFSZWFkUmF3KGJ5dGVzLCBzaXplb2YoKnZhbHVlKSkpIHJldHVybiBmYWxzZTsKLSAgICBwdHIgPSBieXRlczsKLSAgfQotICBSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkocHRyLCB2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHVpbnQ2NCogdmFsdWUpIHsKLSAgdWludDggYnl0ZXNbc2l6ZW9mKCp2YWx1ZSldOwotCi0gIGNvbnN0IHVpbnQ4KiBwdHI7Ci0gIGlmIChCdWZmZXJTaXplKCkgPj0gc2l6ZW9mKCp2YWx1ZSkpIHsKLSAgICAvLyBGYXN0IHBhdGg6ICBFbm91Z2ggYnl0ZXMgaW4gdGhlIGJ1ZmZlciB0byByZWFkIGRpcmVjdGx5LgotICAgIHB0ciA9IGJ1ZmZlcl87Ci0gICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gU2xvdyBwYXRoOiAgSGFkIHRvIHJlYWQgcGFzdCB0aGUgZW5kIG9mIHRoZSBidWZmZXIuCi0gICAgaWYgKCFSZWFkUmF3KGJ5dGVzLCBzaXplb2YoKnZhbHVlKSkpIHJldHVybiBmYWxzZTsKLSAgICBwdHIgPSBieXRlczsKLSAgfQotICBSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXkocHRyLCB2YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1uYW1lc3BhY2UgewotCi0vLyBSZWFkIGEgdmFyaW50IGZyb20gdGhlIGdpdmVuIGJ1ZmZlciwgd3JpdGUgaXQgdG8gKnZhbHVlLCBhbmQgcmV0dXJuIGEgcGFpci4KLS8vIFRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBwYWlyIGlzIHRydWUgaWZmIHRoZSByZWFkIHdhcyBzdWNjZXNzZnVsLiAgVGhlIHNlY29uZAotLy8gcGFydCBpcyBidWZmZXIgKyAobnVtYmVyIG9mIGJ5dGVzIHJlYWQpLiAgVGhpcyBmdW5jdGlvbiBpcyBhbHdheXMgaW5saW5lZCwKLS8vIHNvIHJldHVybmluZyBhIHBhaXIgaXMgY29zdGxlc3MuCi1HT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDgqPiBSZWFkVmFyaW50MzJGcm9tQXJyYXkoCi0gICAgdWludDMyIGZpcnN0X2J5dGUsIGNvbnN0IHVpbnQ4KiBidWZmZXIsCi0gICAgdWludDMyKiB2YWx1ZSk7Ci1pbmxpbmUgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDgqPiBSZWFkVmFyaW50MzJGcm9tQXJyYXkoCi0gICAgdWludDMyIGZpcnN0X2J5dGUsIGNvbnN0IHVpbnQ4KiBidWZmZXIsIHVpbnQzMiogdmFsdWUpIHsKLSAgLy8gRmFzdCBwYXRoOiAgV2UgaGF2ZSBlbm91Z2ggYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyIHRvIGd1YXJhbnRlZSB0aGF0Ci0gIC8vIHRoaXMgcmVhZCB3b24ndCBjcm9zcyB0aGUgZW5kLCBzbyB3ZSBjYW4gc2tpcCB0aGUgY2hlY2tzLgotICBHT09HTEVfRENIRUNLX0VRKCpidWZmZXIsIGZpcnN0X2J5dGUpOwotICBHT09HTEVfRENIRUNLX0VRKGZpcnN0X2J5dGUgJiAweDgwLCAweDgwKSA8PCBmaXJzdF9ieXRlOwotICBjb25zdCB1aW50OCogcHRyID0gYnVmZmVyOwotICB1aW50MzIgYjsKLSAgdWludDMyIHJlc3VsdCA9IGZpcnN0X2J5dGUgLSAweDgwOwotICArK3B0cjsgIC8vIFdlIGp1c3QgcHJvY2Vzc2VkIHRoZSBmaXJzdCBieXRlLiAgTW92ZSBvbiB0byB0aGUgc2Vjb25kLgotICBiID0gKihwdHIrKyk7IHJlc3VsdCArPSBiIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgcmVzdWx0IC09IDB4ODAgPDwgNzsKLSAgYiA9ICoocHRyKyspOyByZXN1bHQgKz0gYiA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIHJlc3VsdCAtPSAweDgwIDw8IDE0OwotICBiID0gKihwdHIrKyk7IHJlc3VsdCArPSBiIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgcmVzdWx0IC09IDB4ODAgPDwgMjE7Ci0gIGIgPSAqKHB0cisrKTsgcmVzdWx0ICs9IGIgPDwgMjg7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAvLyAicmVzdWx0IC09IDB4ODAgPDwgMjgiIGlzIGlycmV2ZWxhbnQuCi0KLSAgLy8gSWYgdGhlIGlucHV0IGlzIGxhcmdlciB0aGFuIDMyIGJpdHMsIHdlIHN0aWxsIG5lZWQgdG8gcmVhZCBpdCBhbGwKLSAgLy8gYW5kIGRpc2NhcmQgdGhlIGhpZ2gtb3JkZXIgYml0cy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrTWF4VmFyaW50Qnl0ZXMgLSBrTWF4VmFyaW50MzJCeXRlczsgaSsrKSB7Ci0gICAgYiA9ICoocHRyKyspOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgfQotCi0gIC8vIFdlIGhhdmUgb3ZlcnJ1biB0aGUgbWF4aW11bSBzaXplIG9mIGEgdmFyaW50ICgxMCBieXRlcykuICBBc3N1bWUKLSAgLy8gdGhlIGRhdGEgaXMgY29ycnVwdC4KLSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCBwdHIpOwotCi0gZG9uZToKLSAgKnZhbHVlID0gcmVzdWx0OwotICByZXR1cm4gc3RkOjptYWtlX3BhaXIodHJ1ZSwgcHRyKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KLWJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyU2xvdyh1aW50MzIqIHZhbHVlKSB7Ci0gIC8vIERpcmVjdGx5IGludm9rZSBSZWFkVmFyaW50NjRGYWxsYmFjaywgc2luY2Ugd2UgYWxyZWFkeSB0cmllZCB0byBvcHRpbWl6ZQotICAvLyBmb3Igb25lLWJ5dGUgdmFyaW50cy4KLSAgc3RkOjpwYWlyPHVpbnQ2NCwgYm9vbD4gcCA9IFJlYWRWYXJpbnQ2NEZhbGxiYWNrKCk7Ci0gICp2YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQzMj4ocC5maXJzdCk7Ci0gIHJldHVybiBwLnNlY29uZDsKLX0KLQotaW50NjQgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyRmFsbGJhY2sodWludDMyIGZpcnN0X2J5dGVfb3JfemVybykgewotICBpZiAoQnVmZmVyU2l6ZSgpID49IGtNYXhWYXJpbnRCeXRlcyB8fAotICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UncmUgYWxzbyBzYWZlIGlmIHRoZSBidWZmZXIgaXMgbm9uLWVtcHR5IGFuZCBpdCBlbmRzCi0gICAgICAvLyB3aXRoIGEgYnl0ZSB0aGF0IHdvdWxkIHRlcm1pbmF0ZSBhIHZhcmludC4KLSAgICAgIChidWZmZXJfZW5kXyA+IGJ1ZmZlcl8gJiYgIShidWZmZXJfZW5kX1stMV0gJiAweDgwKSkpIHsKLSAgICBHT09HTEVfRENIRUNLX05FKGZpcnN0X2J5dGVfb3JfemVybywgMCkKLSAgICAgICAgPDwgIkNhbGxlciBzaG91bGQgcHJvdmlkZSB1cyB3aXRoICpidWZmZXJfIHdoZW4gYnVmZmVyIGlzIG5vbi1lbXB0eSI7Ci0gICAgdWludDMyIHRlbXA7Ci0gICAgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDgqPiBwID0KLSAgICAgICAgICBSZWFkVmFyaW50MzJGcm9tQXJyYXkoZmlyc3RfYnl0ZV9vcl96ZXJvLCBidWZmZXJfLCAmdGVtcCk7Ci0gICAgaWYgKCFwLmZpcnN0KSByZXR1cm4gLTE7Ci0gICAgYnVmZmVyXyA9IHAuc2Vjb25kOwotICAgIHJldHVybiB0ZW1wOwotICB9IGVsc2UgewotICAgIC8vIFJlYWxseSBzbG93IGNhc2U6IHdlIHdpbGwgaW5jdXIgdGhlIGNvc3Qgb2YgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbCBoZXJlLAotICAgIC8vIGJ1dCBtb3ZpbmcgdGhpcyBvdXQgb2YgbGluZSByZWR1Y2VzIHRoZSBzaXplIG9mIHRoaXMgZnVuY3Rpb24sIHdoaWNoCi0gICAgLy8gaW1wcm92ZXMgdGhlIGNvbW1vbiBjYXNlLiBJbiBtaWNybyBiZW5jaG1hcmtzLCB0aGlzIGlzIHdvcnRoIGFib3V0IDEwLTE1JQotICAgIHVpbnQzMiB0ZW1wOwotICAgIHJldHVybiBSZWFkVmFyaW50MzJTbG93KCZ0ZW1wKSA/IHN0YXRpY19jYXN0PGludDY0Pih0ZW1wKSA6IC0xOwotICB9Ci19Ci0KLXVpbnQzMiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnU2xvdygpIHsKLSAgaWYgKGJ1ZmZlcl8gPT0gYnVmZmVyX2VuZF8pIHsKLSAgICAvLyBDYWxsIHJlZnJlc2guCi0gICAgaWYgKCFSZWZyZXNoKCkpIHsKLSAgICAgIC8vIFJlZnJlc2ggZmFpbGVkLiAgTWFrZSBzdXJlIHRoYXQgaXQgZmFpbGVkIGR1ZSB0byBFT0YsIG5vdCBiZWNhdXNlCi0gICAgICAvLyB3ZSBoaXQgdG90YWxfYnl0ZXNfbGltaXRfLCB3aGljaCwgdW5saWtlIG5vcm1hbCBsaW1pdHMsIGlzIG5vdCBhCi0gICAgICAvLyB2YWxpZCBwbGFjZSB0byBlbmQgYSBtZXNzYWdlLgotICAgICAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSB0b3RhbF9ieXRlc19yZWFkXyAtIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKLSAgICAgIGlmIChjdXJyZW50X3Bvc2l0aW9uID49IHRvdGFsX2J5dGVzX2xpbWl0XykgewotICAgICAgICAvLyBIaXQgdG90YWxfYnl0ZXNfbGltaXRfLiAgQnV0IGlmIHdlIGFsc28gaGl0IHRoZSBub3JtYWwgbGltaXQsCi0gICAgICAgIC8vIHdlJ3JlIHN0aWxsIE9LLgotICAgICAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IGN1cnJlbnRfbGltaXRfID09IHRvdGFsX2J5dGVzX2xpbWl0XzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGxlZ2l0aW1hdGVfbWVzc2FnZV9lbmRfID0gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAwOwotICAgIH0KLSAgfQotCi0gIC8vIEZvciB0aGUgc2xvdyBwYXRoLCBqdXN0IGRvIGEgNjQtYml0IHJlYWQuIFRyeSB0byBvcHRpbWl6ZSBmb3Igb25lLWJ5dGUgdGFncwotICAvLyBhZ2Fpbiwgc2luY2Ugd2UgaGF2ZSBub3cgcmVmcmVzaGVkIHRoZSBidWZmZXIuCi0gIHVpbnQ2NCByZXN1bHQgPSAwOwotICBpZiAoIVJlYWRWYXJpbnQ2NCgmcmVzdWx0KSkgcmV0dXJuIDA7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzI+KHJlc3VsdCk7Ci19Ci0KLXVpbnQzMiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnRmFsbGJhY2sodWludDMyIGZpcnN0X2J5dGVfb3JfemVybykgewotICBjb25zdCBpbnQgYnVmX3NpemUgPSBCdWZmZXJTaXplKCk7Ci0gIGlmIChidWZfc2l6ZSA+PSBrTWF4VmFyaW50Qnl0ZXMgfHwKLSAgICAgIC8vIE9wdGltaXphdGlvbjogIFdlJ3JlIGFsc28gc2FmZSBpZiB0aGUgYnVmZmVyIGlzIG5vbi1lbXB0eSBhbmQgaXQgZW5kcwotICAgICAgLy8gd2l0aCBhIGJ5dGUgdGhhdCB3b3VsZCB0ZXJtaW5hdGUgYSB2YXJpbnQuCi0gICAgICAoYnVmX3NpemUgPiAwICYmICEoYnVmZmVyX2VuZF9bLTFdICYgMHg4MCkpKSB7Ci0gICAgR09PR0xFX0RDSEVDS19FUShmaXJzdF9ieXRlX29yX3plcm8sIGJ1ZmZlcl9bMF0pOwotICAgIGlmIChmaXJzdF9ieXRlX29yX3plcm8gPT0gMCkgewotICAgICAgKytidWZmZXJfOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHVpbnQzMiB0YWc7Ci0gICAgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDgqPiBwID0KLSAgICAgICAgUmVhZFZhcmludDMyRnJvbUFycmF5KGZpcnN0X2J5dGVfb3JfemVybywgYnVmZmVyXywgJnRhZyk7Ci0gICAgaWYgKCFwLmZpcnN0KSB7Ci0gICAgICByZXR1cm4gMDsKLSAgICB9Ci0gICAgYnVmZmVyXyA9IHAuc2Vjb25kOwotICAgIHJldHVybiB0YWc7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gV2UgYXJlIGNvbW1vbmx5IGF0IGEgbGltaXQgd2hlbiBhdHRlbXB0aW5nIHRvIHJlYWQgdGFncy4gVHJ5IHRvIHF1aWNrbHkKLSAgICAvLyBkZXRlY3QgdGhpcyBjYXNlIHdpdGhvdXQgbWFraW5nIGFub3RoZXIgZnVuY3Rpb24gY2FsbC4KLSAgICBpZiAoKGJ1Zl9zaXplID09IDApICYmCi0gICAgICAgICgoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCkgfHwKLSAgICAgICAgICh0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykpICYmCi0gICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsaW1pdCB3ZSBoaXQgaXMgbm90IHRvdGFsX2J5dGVzX2xpbWl0Xywgc2luY2UKLSAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIHN0aWxsIG5lZWQgdG8gY2FsbCBSZWZyZXNoKCkgc28gdGhhdCBpdCBwcmludHMgYW4KLSAgICAgICAgLy8gZXJyb3IuCi0gICAgICAgIHRvdGFsX2J5dGVzX3JlYWRfIC0gYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfIDwgdG90YWxfYnl0ZXNfbGltaXRfKSB7Ci0gICAgICAvLyBXZSBoaXQgYSBieXRlIGxpbWl0LgotICAgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gPSB0cnVlOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotICAgIHJldHVybiBSZWFkVGFnU2xvdygpOwotICB9Ci19Ci0KLWJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDY0U2xvdyh1aW50NjQqIHZhbHVlKSB7Ci0gIC8vIFNsb3cgcGF0aDogIFRoaXMgcmVhZCBtaWdodCBjcm9zcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHNvIHdlCi0gIC8vIG5lZWQgdG8gY2hlY2sgYW5kIHJlZnJlc2ggdGhlIGJ1ZmZlciBpZiBhbmQgd2hlbiBpdCBkb2VzLgotCi0gIHVpbnQ2NCByZXN1bHQgPSAwOwotICBpbnQgY291bnQgPSAwOwotICB1aW50MzIgYjsKLQotICBkbyB7Ci0gICAgaWYgKGNvdW50ID09IGtNYXhWYXJpbnRCeXRlcykgcmV0dXJuIGZhbHNlOwotICAgIHdoaWxlIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfKSB7Ci0gICAgICBpZiAoIVJlZnJlc2goKSkgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBiID0gKmJ1ZmZlcl87Ci0gICAgcmVzdWx0IHw9IHN0YXRpY19jYXN0PHVpbnQ2ND4oYiAmIDB4N0YpIDw8ICg3ICogY291bnQpOwotICAgIEFkdmFuY2UoMSk7Ci0gICAgKytjb3VudDsKLSAgfSB3aGlsZSAoYiAmIDB4ODApOwotCi0gICp2YWx1ZSA9IHJlc3VsdDsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXN0ZDo6cGFpcjx1aW50NjQsIGJvb2w+IENvZGVkSW5wdXRTdHJlYW06OlJlYWRWYXJpbnQ2NEZhbGxiYWNrKCkgewotICBpZiAoQnVmZmVyU2l6ZSgpID49IGtNYXhWYXJpbnRCeXRlcyB8fAotICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UncmUgYWxzbyBzYWZlIGlmIHRoZSBidWZmZXIgaXMgbm9uLWVtcHR5IGFuZCBpdCBlbmRzCi0gICAgICAvLyB3aXRoIGEgYnl0ZSB0aGF0IHdvdWxkIHRlcm1pbmF0ZSBhIHZhcmludC4KLSAgICAgIChidWZmZXJfZW5kXyA+IGJ1ZmZlcl8gJiYgIShidWZmZXJfZW5kX1stMV0gJiAweDgwKSkpIHsKLSAgICAvLyBGYXN0IHBhdGg6ICBXZSBoYXZlIGVub3VnaCBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIgdG8gZ3VhcmFudGVlIHRoYXQKLSAgICAvLyB0aGlzIHJlYWQgd29uJ3QgY3Jvc3MgdGhlIGVuZCwgc28gd2UgY2FuIHNraXAgdGhlIGNoZWNrcy4KLQotICAgIGNvbnN0IHVpbnQ4KiBwdHIgPSBidWZmZXJfOwotICAgIHVpbnQzMiBiOwotCi0gICAgLy8gU3BsaXR0aW5nIGludG8gMzItYml0IHBpZWNlcyBnaXZlcyBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gMzItYml0Ci0gICAgLy8gcHJvY2Vzc29ycy4KLSAgICB1aW50MzIgcGFydDAgPSAwLCBwYXJ0MSA9IDAsIHBhcnQyID0gMDsKLQotICAgIGIgPSAqKHB0cisrKTsgcGFydDAgID0gYiAgICAgIDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gICAgcGFydDAgLT0gMHg4MDsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQwICs9IGIgPDwgIDc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIHBhcnQwIC09IDB4ODAgPDwgNzsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQwICs9IGIgPDwgMTQ7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIHBhcnQwIC09IDB4ODAgPDwgMTQ7Ci0gICAgYiA9ICoocHRyKyspOyBwYXJ0MCArPSBiIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgICBwYXJ0MCAtPSAweDgwIDw8IDIxOwotICAgIGIgPSAqKHB0cisrKTsgcGFydDEgID0gYiAgICAgIDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gICAgcGFydDEgLT0gMHg4MDsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQxICs9IGIgPDwgIDc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIHBhcnQxIC09IDB4ODAgPDwgNzsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQxICs9IGIgPDwgMTQ7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIHBhcnQxIC09IDB4ODAgPDwgMTQ7Ci0gICAgYiA9ICoocHRyKyspOyBwYXJ0MSArPSBiIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgICBwYXJ0MSAtPSAweDgwIDw8IDIxOwotICAgIGIgPSAqKHB0cisrKTsgcGFydDIgID0gYiAgICAgIDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gICAgcGFydDIgLT0gMHg4MDsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQyICs9IGIgPDwgIDc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIC8vICJwYXJ0MiAtPSAweDgwIDw8IDciIGlzIGlycmVsZXZhbnQgYmVjYXVzZSAoMHg4MCA8PCA3KSA8PCA1NiBpcyAwLgotCi0gICAgLy8gV2UgaGF2ZSBvdmVycnVuIHRoZSBtYXhpbXVtIHNpemUgb2YgYSB2YXJpbnQgKDEwIGJ5dGVzKS4gIFRoZSBkYXRhCi0gICAgLy8gbXVzdCBiZSBjb3JydXB0LgotICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcigwLCBmYWxzZSk7Ci0KLSAgIGRvbmU6Ci0gICAgQWR2YW5jZShwdHIgLSBidWZmZXJfKTsKLSAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIoKHN0YXRpY19jYXN0PHVpbnQ2ND4ocGFydDApKSB8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MSkgPDwgMjgpIHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjQ+KHBhcnQyKSA8PCA1NiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICB9IGVsc2UgewotICAgIHVpbnQ2NCB0ZW1wOwotICAgIGJvb2wgc3VjY2VzcyA9IFJlYWRWYXJpbnQ2NFNsb3coJnRlbXApOwotICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0ZW1wLCBzdWNjZXNzKTsKLSAgfQotfQotCi1ib29sIENvZGVkSW5wdXRTdHJlYW06OlJlZnJlc2goKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEoMCwgQnVmZmVyU2l6ZSgpKTsKLQotICBpZiAoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCB8fCBvdmVyZmxvd19ieXRlc18gPiAwIHx8Ci0gICAgICB0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykgewotICAgIC8vIFdlJ3ZlIGhpdCBhIGxpbWl0LiAgU3RvcC4KLSAgICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2J5dGVzX3JlYWRfIC0gYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfOwotCi0gICAgaWYgKGN1cnJlbnRfcG9zaXRpb24gPj0gdG90YWxfYnl0ZXNfbGltaXRfICYmCi0gICAgICAgIHRvdGFsX2J5dGVzX2xpbWl0XyAhPSBjdXJyZW50X2xpbWl0XykgewotICAgICAgLy8gSGl0IHRvdGFsX2J5dGVzX2xpbWl0Xy4KLSAgICAgIFByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAodG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfID49IDAgJiYKLSAgICAgIHRvdGFsX2J5dGVzX3JlYWRfID49IHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXykgewotICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiUmVhZGluZyBkYW5nZXJvdXNseSBsYXJnZSBwcm90b2NvbCBtZXNzYWdlLiAgSWYgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAibWVzc2FnZSB0dXJucyBvdXQgdG8gYmUgbGFyZ2VyIHRoYW4gIgotICAgICAgICAgICAgICAgICAgIDw8IHRvdGFsX2J5dGVzX2xpbWl0XyA8PCAiIGJ5dGVzLCBwYXJzaW5nIHdpbGwgYmUgaGFsdGVkICIKLSAgICAgICAgICAgICAgICAgICAgICAiZm9yIHNlY3VyaXR5IHJlYXNvbnMuICBUbyBpbmNyZWFzZSB0aGUgbGltaXQgKG9yIHRvICIKLSAgICAgICAgICAgICAgICAgICAgICAiZGlzYWJsZSB0aGVzZSB3YXJuaW5ncyksIHNlZSAiCi0gICAgICAgICAgICAgICAgICAgICAgIkNvZGVkSW5wdXRTdHJlYW06OlNldFRvdGFsQnl0ZXNMaW1pdCgpIGluICIKLSAgICAgICAgICAgICAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oLiI7Ci0KLSAgICAvLyBEb24ndCB3YXJuIGFnYWluIGZvciB0aGlzIHN0cmVhbSwgYW5kIHByaW50IHRvdGFsIHNpemUgYXQgdGhlIGVuZC4KLSAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8gPSAtMjsKLSAgfQotCi0gIGNvbnN0IHZvaWQqIHZvaWRfYnVmZmVyOwotICBpbnQgYnVmZmVyX3NpemU7Ci0gIGlmIChOZXh0Tm9uRW1wdHkoaW5wdXRfLCAmdm9pZF9idWZmZXIsICZidWZmZXJfc2l6ZSkpIHsKLSAgICBidWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHZvaWRfYnVmZmVyKTsKLSAgICBidWZmZXJfZW5kXyA9IGJ1ZmZlcl8gKyBidWZmZXJfc2l6ZTsKLSAgICBHT09HTEVfQ0hFQ0tfR0UoYnVmZmVyX3NpemUsIDApOwotCi0gICAgaWYgKHRvdGFsX2J5dGVzX3JlYWRfIDw9IElOVF9NQVggLSBidWZmZXJfc2l6ZSkgewotICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gKz0gYnVmZmVyX3NpemU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE92ZXJmbG93LiAgUmVzZXQgYnVmZmVyX2VuZF8gdG8gbm90IGluY2x1ZGUgdGhlIGJ5dGVzIGJleW9uZCBJTlRfTUFYLgotICAgICAgLy8gV2UgY2FuJ3QgZ2V0IHRoYXQgZmFyIGFueXdheSwgYmVjYXVzZSB0b3RhbF9ieXRlc19saW1pdF8gaXMgZ3VhcmFudGVlZAotICAgICAgLy8gdG8gYmUgbGVzcyB0aGFuIGl0LiAgV2UgbmVlZCB0byBrZWVwIHRyYWNrIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgICAgIC8vIHdlIGRpc2NhcmRlZCwgdGhvdWdoLCBzbyB0aGF0IHdlIGNhbiBjYWxsIGlucHV0Xy0+QmFja1VwKCkgdG8gYmFjawotICAgICAgLy8gdXAgb3ZlciB0aGVtIG9uIGRlc3RydWN0aW9uLgotCi0gICAgICAvLyBUaGUgZm9sbG93aW5nIGxpbmUgaXMgZXF1aXZhbGVudCB0bzoKLSAgICAgIC8vICAgb3ZlcmZsb3dfYnl0ZXNfID0gdG90YWxfYnl0ZXNfcmVhZF8gKyBidWZmZXJfc2l6ZSAtIElOVF9NQVg7Ci0gICAgICAvLyBleGNlcHQgdGhhdCBpdCBhdm9pZHMgb3ZlcmZsb3dzLiAgU2lnbmVkIGludGVnZXIgb3ZlcmZsb3cgaGFzCi0gICAgICAvLyB1bmRlZmluZWQgcmVzdWx0cyBhY2NvcmRpbmcgdG8gdGhlIEMgc3RhbmRhcmQuCi0gICAgICBvdmVyZmxvd19ieXRlc18gPSB0b3RhbF9ieXRlc19yZWFkXyAtIChJTlRfTUFYIC0gYnVmZmVyX3NpemUpOwotICAgICAgYnVmZmVyX2VuZF8gLT0gb3ZlcmZsb3dfYnl0ZXNfOwotICAgICAgdG90YWxfYnl0ZXNfcmVhZF8gPSBJTlRfTUFYOwotICAgIH0KLQotICAgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGJ1ZmZlcl8gPSBOVUxMOwotICAgIGJ1ZmZlcl9lbmRfID0gTlVMTDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotLy8gQ29kZWRPdXRwdXRTdHJlYW0gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db2RlZE91dHB1dFN0cmVhbTo6Q29kZWRPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkKLSAgOiBvdXRwdXRfKG91dHB1dCksCi0gICAgYnVmZmVyXyhOVUxMKSwKLSAgICBidWZmZXJfc2l6ZV8oMCksCi0gICAgdG90YWxfYnl0ZXNfKDApLAotICAgIGhhZF9lcnJvcl8oZmFsc2UpLAotICAgIGFsaWFzaW5nX2VuYWJsZWRfKGZhbHNlKSB7Ci0gIC8vIEVhZ2VybHkgUmVmcmVzaCgpIHNvIGJ1ZmZlciBzcGFjZSBpcyBpbW1lZGlhdGVseSBhdmFpbGFibGUuCi0gIFJlZnJlc2goKTsKLSAgLy8gVGhlIFJlZnJlc2goKSBtYXkgaGF2ZSBmYWlsZWQuIElmIHRoZSBjbGllbnQgZG9lc24ndCB3cml0ZSBhbnkgZGF0YSwKLSAgLy8gdGhvdWdoLCBkb24ndCBjb25zaWRlciB0aGlzIGFuIGVycm9yLiBJZiB0aGUgY2xpZW50IGRvZXMgd3JpdGUgZGF0YSwgdGhlbgotICAvLyBhbm90aGVyIFJlZnJlc2goKSB3aWxsIGJlIGF0dGVtcHRlZCBhbmQgaXQgd2lsbCBzZXQgdGhlIGVycm9yIG9uY2UgYWdhaW4uCi0gIGhhZF9lcnJvcl8gPSBmYWxzZTsKLX0KLQotQ29kZWRPdXRwdXRTdHJlYW06OkNvZGVkT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb19lYWdlcl9yZWZyZXNoKQotICA6IG91dHB1dF8ob3V0cHV0KSwKLSAgICBidWZmZXJfKE5VTEwpLAotICAgIGJ1ZmZlcl9zaXplXygwKSwKLSAgICB0b3RhbF9ieXRlc18oMCksCi0gICAgaGFkX2Vycm9yXyhmYWxzZSksCi0gICAgYWxpYXNpbmdfZW5hYmxlZF8oZmFsc2UpIHsKLSAgaWYgKGRvX2VhZ2VyX3JlZnJlc2gpIHsKLSAgICAvLyBFYWdlcmx5IFJlZnJlc2goKSBzbyBidWZmZXIgc3BhY2UgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgotICAgIFJlZnJlc2goKTsKLSAgICAvLyBUaGUgUmVmcmVzaCgpIG1heSBoYXZlIGZhaWxlZC4gSWYgdGhlIGNsaWVudCBkb2Vzbid0IHdyaXRlIGFueSBkYXRhLAotICAgIC8vIHRob3VnaCwgZG9uJ3QgY29uc2lkZXIgdGhpcyBhbiBlcnJvci4gSWYgdGhlIGNsaWVudCBkb2VzIHdyaXRlIGRhdGEsIHRoZW4KLSAgICAvLyBhbm90aGVyIFJlZnJlc2goKSB3aWxsIGJlIGF0dGVtcHRlZCBhbmQgaXQgd2lsbCBzZXQgdGhlIGVycm9yIG9uY2UgYWdhaW4uCi0gICAgaGFkX2Vycm9yXyA9IGZhbHNlOwotICB9Ci19Ci0KLUNvZGVkT3V0cHV0U3RyZWFtOjp+Q29kZWRPdXRwdXRTdHJlYW0oKSB7Ci0gIFRyaW0oKTsKLX0KLQotdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6VHJpbSgpIHsKLSAgaWYgKGJ1ZmZlcl9zaXplXyA+IDApIHsKLSAgICBvdXRwdXRfLT5CYWNrVXAoYnVmZmVyX3NpemVfKTsKLSAgICB0b3RhbF9ieXRlc18gLT0gYnVmZmVyX3NpemVfOwotICAgIGJ1ZmZlcl9zaXplXyA9IDA7Ci0gICAgYnVmZmVyXyA9IE5VTEw7Ci0gIH0KLX0KLQotYm9vbCBDb2RlZE91dHB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKLSAgaWYgKGNvdW50IDwgMCkgcmV0dXJuIGZhbHNlOwotCi0gIHdoaWxlIChjb3VudCA+IGJ1ZmZlcl9zaXplXykgewotICAgIGNvdW50IC09IGJ1ZmZlcl9zaXplXzsKLSAgICBpZiAoIVJlZnJlc2goKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgQWR2YW5jZShjb3VudCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIENvZGVkT3V0cHV0U3RyZWFtOjpHZXREaXJlY3RCdWZmZXJQb2ludGVyKHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgaWYgKGJ1ZmZlcl9zaXplXyA9PSAwICYmICFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKLQotICAqZGF0YSA9IGJ1ZmZlcl87Ci0gICpzaXplID0gYnVmZmVyX3NpemVfOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVSYXcoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKLSAgd2hpbGUgKGJ1ZmZlcl9zaXplXyA8IHNpemUpIHsKLSAgICBtZW1jcHkoYnVmZmVyXywgZGF0YSwgYnVmZmVyX3NpemVfKTsKLSAgICBzaXplIC09IGJ1ZmZlcl9zaXplXzsKLSAgICBkYXRhID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEpICsgYnVmZmVyX3NpemVfOwotICAgIGlmICghUmVmcmVzaCgpKSByZXR1cm47Ci0gIH0KLQotICBtZW1jcHkoYnVmZmVyXywgZGF0YSwgc2l6ZSk7Ci0gIEFkdmFuY2Uoc2l6ZSk7Ci19Ci0KLXVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVSYXdUb0FycmF5KAotICAgIGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCB1aW50OCogdGFyZ2V0KSB7Ci0gIG1lbWNweSh0YXJnZXQsIGRhdGEsIHNpemUpOwotICByZXR1cm4gdGFyZ2V0ICsgc2l6ZTsKLX0KLQotCi12b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKLSAgaWYgKHNpemUgPCBidWZmZXJfc2l6ZV8KLSAgICAgICkgewotICAgIFdyaXRlUmF3KGRhdGEsIHNpemUpOwotICB9IGVsc2UgewotICAgIFRyaW0oKTsKLQotICAgIHRvdGFsX2J5dGVzXyArPSBzaXplOwotICAgIGhhZF9lcnJvcl8gfD0gIW91dHB1dF8tPldyaXRlQWxpYXNlZFJhdyhkYXRhLCBzaXplKTsKLSAgfQotfQotCi12b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyKHVpbnQzMiB2YWx1ZSkgewotICB1aW50OCBieXRlc1tzaXplb2YodmFsdWUpXTsKLQotICBib29sIHVzZV9mYXN0ID0gYnVmZmVyX3NpemVfID49IHNpemVvZih2YWx1ZSk7Ci0gIHVpbnQ4KiBwdHIgPSB1c2VfZmFzdCA/IGJ1ZmZlcl8gOiBieXRlczsKLQotICBXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSh2YWx1ZSwgcHRyKTsKLQotICBpZiAodXNlX2Zhc3QpIHsKLSAgICBBZHZhbmNlKHNpemVvZih2YWx1ZSkpOwotICB9IGVsc2UgewotICAgIFdyaXRlUmF3KGJ5dGVzLCBzaXplb2YodmFsdWUpKTsKLSAgfQotfQotCi12b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0KHVpbnQ2NCB2YWx1ZSkgewotICB1aW50OCBieXRlc1tzaXplb2YodmFsdWUpXTsKLQotICBib29sIHVzZV9mYXN0ID0gYnVmZmVyX3NpemVfID49IHNpemVvZih2YWx1ZSk7Ci0gIHVpbnQ4KiBwdHIgPSB1c2VfZmFzdCA/IGJ1ZmZlcl8gOiBieXRlczsKLQotICBXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh2YWx1ZSwgcHRyKTsKLQotICBpZiAodXNlX2Zhc3QpIHsKLSAgICBBZHZhbmNlKHNpemVvZih2YWx1ZSkpOwotICB9IGVsc2UgewotICAgIFdyaXRlUmF3KGJ5dGVzLCBzaXplb2YodmFsdWUpKTsKLSAgfQotfQotCi12b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyU2xvd1BhdGgodWludDMyIHZhbHVlKSB7Ci0gIHVpbnQ4IGJ5dGVzW2tNYXhWYXJpbnQzMkJ5dGVzXTsKLSAgdWludDgqIHRhcmdldCA9ICZieXRlc1swXTsKLSAgdWludDgqIGVuZCA9IFdyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotICBpbnQgc2l6ZSA9IGVuZCAtIHRhcmdldDsKLSAgV3JpdGVSYXcoYnl0ZXMsIHNpemUpOwotfQotCi1pbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSgKLSAgICB1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKLSAgLy8gU3BsaXR0aW5nIGludG8gMzItYml0IHBpZWNlcyBnaXZlcyBiZXR0ZXIgcGVyZm9ybWFuY2Ugb24gMzItYml0Ci0gIC8vIHByb2Nlc3NvcnMuCi0gIHVpbnQzMiBwYXJ0MCA9IHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUgICAgICApOwotICB1aW50MzIgcGFydDEgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlID4+IDI4KTsKLSAgdWludDMyIHBhcnQyID0gc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSA+PiA1Nik7Ci0KLSAgaW50IHNpemU7Ci0KLSAgLy8gSGVyZSB3ZSBjYW4ndCByZWFsbHkgb3B0aW1pemUgZm9yIHNtYWxsIG51bWJlcnMsIHNpbmNlIHRoZSB2YWx1ZSBpcwotICAvLyBzcGxpdCBpbnRvIHRocmVlIHBhcnRzLiAgQ2hla2luZyBmb3IgbnVtYmVycyA8IDEyOCwgZm9yIGluc3RhbmNlLAotICAvLyB3b3VsZCByZXF1aXJlIHRocmVlIGNvbXBhcmlzb25zLCBzaW5jZSB5b3UnZCBoYXZlIHRvIG1ha2Ugc3VyZSBwYXJ0MQotICAvLyBhbmQgcGFydDIgYXJlIHplcm8uICBIb3dldmVyLCBpZiB0aGUgY2FsbGVyIGlzIHVzaW5nIDY0LWJpdCBpbnRlZ2VycywKLSAgLy8gaXQgaXMgbGlrZWx5IHRoYXQgdGhleSBleHBlY3QgdGhlIG51bWJlcnMgdG8gb2Z0ZW4gYmUgdmVyeSBsYXJnZSwgc28KLSAgLy8gd2UgcHJvYmFibHkgZG9uJ3Qgd2FudCB0byBvcHRpbWl6ZSBmb3Igc21hbGwgbnVtYmVycyBhbnl3YXkuICBUaHVzLAotICAvLyB3ZSBlbmQgdXAgd2l0aCBhIGhhcmRjb2RlZCBiaW5hcnkgc2VhcmNoIHRyZWUuLi4KLSAgaWYgKHBhcnQyID09IDApIHsKLSAgICBpZiAocGFydDEgPT0gMCkgewotICAgICAgaWYgKHBhcnQwIDwgKDEgPDwgMTQpKSB7Ci0gICAgICAgIGlmIChwYXJ0MCA8ICgxIDw8IDcpKSB7Ci0gICAgICAgICAgc2l6ZSA9IDE7IGdvdG8gc2l6ZTE7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgc2l6ZSA9IDI7IGdvdG8gc2l6ZTI7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChwYXJ0MCA8ICgxIDw8IDIxKSkgewotICAgICAgICAgIHNpemUgPSAzOyBnb3RvIHNpemUzOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNpemUgPSA0OyBnb3RvIHNpemU0OwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChwYXJ0MSA8ICgxIDw8IDE0KSkgewotICAgICAgICBpZiAocGFydDEgPCAoMSA8PCA3KSkgewotICAgICAgICAgIHNpemUgPSA1OyBnb3RvIHNpemU1OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNpemUgPSA2OyBnb3RvIHNpemU2OwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAocGFydDEgPCAoMSA8PCAyMSkpIHsKLSAgICAgICAgICBzaXplID0gNzsgZ290byBzaXplNzsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzaXplID0gODsgZ290byBzaXplODsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBpZiAocGFydDIgPCAoMSA8PCA3KSkgewotICAgICAgc2l6ZSA9IDk7IGdvdG8gc2l6ZTk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHNpemUgPSAxMDsgZ290byBzaXplMTA7Ci0gICAgfQotICB9Ci0KLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0KLSAgc2l6ZTEwOiB0YXJnZXRbOV0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQyID4+ICA3KSB8IDB4ODApOwotICBzaXplOSA6IHRhcmdldFs4XSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDIgICAgICApIHwgMHg4MCk7Ci0gIHNpemU4IDogdGFyZ2V0WzddID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MSA+PiAyMSkgfCAweDgwKTsKLSAgc2l6ZTcgOiB0YXJnZXRbNl0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQxID4+IDE0KSB8IDB4ODApOwotICBzaXplNiA6IHRhcmdldFs1XSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDEgPj4gIDcpIHwgMHg4MCk7Ci0gIHNpemU1IDogdGFyZ2V0WzRdID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MSAgICAgICkgfCAweDgwKTsKLSAgc2l6ZTQgOiB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQwID4+IDIxKSB8IDB4ODApOwotICBzaXplMyA6IHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigocGFydDAgPj4gMTQpIHwgMHg4MCk7Ci0gIHNpemUyIDogdGFyZ2V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDg+KChwYXJ0MCA+PiAgNykgfCAweDgwKTsKLSAgc2l6ZTEgOiB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHBhcnQwICAgICAgKSB8IDB4ODApOwotCi0gIHRhcmdldFtzaXplLTFdICY9IDB4N0Y7Ci0gIHJldHVybiB0YXJnZXQgKyBzaXplOwotfQotCi12b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0KHVpbnQ2NCB2YWx1ZSkgewotICBpZiAoYnVmZmVyX3NpemVfID49IGtNYXhWYXJpbnRCeXRlcykgewotICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAotICAgIC8vIHRoaXMgd3JpdGUgd29uJ3QgY3Jvc3MgdGhlIGVuZCwgc28gd2UgY2FuIHNraXAgdGhlIGNoZWNrcy4KLSAgICB1aW50OCogdGFyZ2V0ID0gYnVmZmVyXzsKLQotICAgIHVpbnQ4KiBlbmQgPSBXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSh2YWx1ZSwgdGFyZ2V0KTsKLSAgICBpbnQgc2l6ZSA9IGVuZCAtIHRhcmdldDsKLSAgICBBZHZhbmNlKHNpemUpOwotICB9IGVsc2UgewotICAgIC8vIFNsb3cgcGF0aDogIFRoaXMgd3JpdGUgbWlnaHQgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCBzbyB3ZQotICAgIC8vIGNvbXBvc2UgdGhlIGJ5dGVzIGZpcnN0IHRoZW4gdXNlIFdyaXRlUmF3KCkuCi0gICAgdWludDggYnl0ZXNba01heFZhcmludEJ5dGVzXTsKLSAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgd2hpbGUgKHZhbHVlID4gMHg3RikgewotICAgICAgYnl0ZXNbc2l6ZSsrXSA9IChzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpICYgMHg3RikgfCAweDgwOwotICAgICAgdmFsdWUgPj49IDc7Ci0gICAgfQotICAgIGJ5dGVzW3NpemUrK10gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpICYgMHg3RjsKLSAgICBXcml0ZVJhdyhieXRlcywgc2l6ZSk7Ci0gIH0KLX0KLQotdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheSgKLSAgICB1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKLSAgcmV0dXJuIFdyaXRlVmFyaW50NjRUb0FycmF5SW5saW5lKHZhbHVlLCB0YXJnZXQpOwotfQotCi1ib29sIENvZGVkT3V0cHV0U3RyZWFtOjpSZWZyZXNoKCkgewotICB2b2lkKiB2b2lkX2J1ZmZlcjsKLSAgaWYgKG91dHB1dF8tPk5leHQoJnZvaWRfYnVmZmVyLCAmYnVmZmVyX3NpemVfKSkgewotICAgIGJ1ZmZlcl8gPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4odm9pZF9idWZmZXIpOwotICAgIHRvdGFsX2J5dGVzXyArPSBidWZmZXJfc2l6ZV87Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgYnVmZmVyXyA9IE5VTEw7Ci0gICAgYnVmZmVyX3NpemVfID0gMDsKLSAgICBoYWRfZXJyb3JfID0gdHJ1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotaW50IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJGYWxsYmFjayh1aW50MzIgdmFsdWUpIHsKLSAgaWYgKHZhbHVlIDwgKDEgPDwgNykpIHsKLSAgICByZXR1cm4gMTsKLSAgfSBlbHNlIGlmICh2YWx1ZSA8ICgxIDw8IDE0KSkgewotICAgIHJldHVybiAyOwotICB9IGVsc2UgaWYgKHZhbHVlIDwgKDEgPDwgMjEpKSB7Ci0gICAgcmV0dXJuIDM7Ci0gIH0gZWxzZSBpZiAodmFsdWUgPCAoMSA8PCAyOCkpIHsKLSAgICByZXR1cm4gNDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gNTsKLSAgfQotfQotCi1pbnQgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NCh1aW50NjQgdmFsdWUpIHsKLSAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgMzUpKSB7Ci0gICAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNykpIHsKLSAgICAgIHJldHVybiAxOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAxNCkpIHsKLSAgICAgIHJldHVybiAyOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAyMSkpIHsKLSAgICAgIHJldHVybiAzOwotICAgIH0gZWxzZSBpZiAodmFsdWUgPCAoMXVsbCA8PCAyOCkpIHsKLSAgICAgIHJldHVybiA0OwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gNTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNDIpKSB7Ci0gICAgICByZXR1cm4gNjsKLSAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNDkpKSB7Ci0gICAgICByZXR1cm4gNzsKLSAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNTYpKSB7Ci0gICAgICByZXR1cm4gODsKLSAgICB9IGVsc2UgaWYgKHZhbHVlIDwgKDF1bGwgPDwgNjMpKSB7Ci0gICAgICByZXR1cm4gOTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIDEwOwotICAgIH0KLSAgfQotfQotCi11aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nV2l0aFNpemVUb0FycmF5KGNvbnN0IHN0cmluZyYgc3RyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTEUoc3RyLnNpemUoKSwga3VpbnQzMm1heCk7Ci0gIHRhcmdldCA9IFdyaXRlVmFyaW50MzJUb0FycmF5KHN0ci5zaXplKCksIHRhcmdldCk7Ci0gIHJldHVybiBXcml0ZVN0cmluZ1RvQXJyYXkoc3RyLCB0YXJnZXQpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW8KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM4MWEzM2EuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDEyOTQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgQ29kZWRJbnB1dFN0cmVhbSBhbmQgQ29kZWRPdXRwdXRTdHJlYW0gY2xhc3NlcywKLS8vIHdoaWNoIHdyYXAgYSBaZXJvQ29weUlucHV0U3RyZWFtIG9yIFplcm9Db3B5T3V0cHV0U3RyZWFtLCByZXNwZWN0aXZlbHksCi0vLyBhbmQgYWxsb3cgeW91IHRvIHJlYWQgb3Igd3JpdGUgaW5kaXZpZHVhbCBwaWVjZXMgb2YgZGF0YSBpbiB2YXJpb3VzCi0vLyBmb3JtYXRzLiAgSW4gcGFydGljdWxhciwgdGhlc2UgaW1wbGVtZW50IHRoZSB2YXJpbnQgZW5jb2RpbmcgZm9yCi0vLyBpbnRlZ2VycywgYSBzaW1wbGUgdmFyaWFibGUtbGVuZ3RoIGVuY29kaW5nIGluIHdoaWNoIHNtYWxsZXIgbnVtYmVycwotLy8gdGFrZSBmZXdlciBieXRlcy4KLS8vCi0vLyBUeXBpY2FsbHkgdGhlc2UgY2xhc3NlcyB3aWxsIG9ubHkgYmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBwcm90b2NvbAotLy8gYnVmZmVyIGxpYnJhcnkgaW4gb3JkZXIgdG8gZW5jb2RlIGFuZCBkZWNvZGUgcHJvdG9jb2wgYnVmZmVycy4gIENsaWVudHMKLS8vIG9mIHRoZSBsaWJyYXJ5IG9ubHkgbmVlZCB0byBrbm93IGFib3V0IHRoaXMgY2xhc3MgaWYgdGhleSB3aXNoIHRvIHdyaXRlCi0vLyBjdXN0b20gbWVzc2FnZSBwYXJzaW5nIG9yIHNlcmlhbGl6YXRpb24gcHJvY2VkdXJlcy4KLS8vCi0vLyBDb2RlZE91dHB1dFN0cmVhbSBleGFtcGxlOgotLy8gICAvLyBXcml0ZSBzb21lIGRhdGEgdG8gIm15ZmlsZSIuICBGaXJzdCB3ZSB3cml0ZSBhIDQtYnl0ZSAibWFnaWMgbnVtYmVyIgotLy8gICAvLyB0byBpZGVudGlmeSB0aGUgZmlsZSB0eXBlLCB0aGVuIHdyaXRlIGEgbGVuZ3RoLWRlbGltaXRlZCBzdHJpbmcuICBUaGUKLS8vICAgLy8gc3RyaW5nIGlzIGNvbXBvc2VkIG9mIGEgdmFyaW50IGdpdmluZyB0aGUgbGVuZ3RoIGZvbGxvd2VkIGJ5IHRoZSByYXcKLS8vICAgLy8gYnl0ZXMuCi0vLyAgIGludCBmZCA9IG9wZW4oIm15ZmlsZSIsIE9fQ1JFQVQgfCBPX1dST05MWSk7Ci0vLyAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiByYXdfb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0oZmQpOwotLy8gICBDb2RlZE91dHB1dFN0cmVhbSogY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd19vdXRwdXQpOwotLy8KLS8vICAgaW50IG1hZ2ljX251bWJlciA9IDEyMzQ7Ci0vLyAgIGNoYXIgdGV4dFtdID0gIkhlbGxvIHdvcmxkISI7Ci0vLyAgIGNvZGVkX291dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihtYWdpY19udW1iZXIpOwotLy8gICBjb2RlZF9vdXRwdXQtPldyaXRlVmFyaW50MzIoc3RybGVuKHRleHQpKTsKLS8vICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyh0ZXh0LCBzdHJsZW4odGV4dCkpOwotLy8KLS8vICAgZGVsZXRlIGNvZGVkX291dHB1dDsKLS8vICAgZGVsZXRlIHJhd19vdXRwdXQ7Ci0vLyAgIGNsb3NlKGZkKTsKLS8vCi0vLyBDb2RlZElucHV0U3RyZWFtIGV4YW1wbGU6Ci0vLyAgIC8vIFJlYWQgYSBmaWxlIGNyZWF0ZWQgYnkgdGhlIGFib3ZlIGNvZGUuCi0vLyAgIGludCBmZCA9IG9wZW4oIm15ZmlsZSIsIE9fUkRPTkxZKTsKLS8vICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogcmF3X2lucHV0ID0gbmV3IEZpbGVJbnB1dFN0cmVhbShmZCk7Ci0vLyAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShyYXdfaW5wdXQpOwotLy8KLS8vICAgY29kZWRfaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmbWFnaWNfbnVtYmVyKTsKLS8vICAgaWYgKG1hZ2ljX251bWJlciAhPSAxMjM0KSB7Ci0vLyAgICAgY2VyciA8PCAiRmlsZSBub3QgaW4gZXhwZWN0ZWQgZm9ybWF0LiIgPDwgZW5kbDsKLS8vICAgICByZXR1cm47Ci0vLyAgIH0KLS8vCi0vLyAgIHVpbnQzMiBzaXplOwotLy8gICBjb2RlZF9pbnB1dC0+UmVhZFZhcmludDMyKCZzaXplKTsKLS8vCi0vLyAgIGNoYXIqIHRleHQgPSBuZXcgY2hhcltzaXplICsgMV07Ci0vLyAgIGNvZGVkX2lucHV0LT5SZWFkUmF3KGJ1ZmZlciwgc2l6ZSk7Ci0vLyAgIHRleHRbc2l6ZV0gPSAnXDAnOwotLy8KLS8vICAgZGVsZXRlIGNvZGVkX2lucHV0OwotLy8gICBkZWxldGUgcmF3X2lucHV0OwotLy8gICBjbG9zZShmZCk7Ci0vLwotLy8gICBjb3V0IDw8ICJUZXh0IGlzOiAiIDw8IHRleHQgPDwgZW5kbDsKLS8vICAgZGVsZXRlIFtdIHRleHQ7Ci0vLwotLy8gRm9yIHRob3NlIHdobyBhcmUgaW50ZXJlc3RlZCwgdmFyaW50IGVuY29kaW5nIGlzIGRlZmluZWQgYXMgZm9sbG93czoKLS8vCi0vLyBUaGUgZW5jb2Rpbmcgb3BlcmF0ZXMgb24gdW5zaWduZWQgaW50ZWdlcnMgb2YgdXAgdG8gNjQgYml0cyBpbiBsZW5ndGguCi0vLyBFYWNoIGJ5dGUgb2YgdGhlIGVuY29kZWQgdmFsdWUgaGFzIHRoZSBmb3JtYXQ6Ci0vLyAqIGJpdHMgMC02OiBTZXZlbiBiaXRzIG9mIHRoZSBudW1iZXIgYmVpbmcgZW5jb2RlZC4KLS8vICogYml0IDc6IFplcm8gaWYgdGhpcyBpcyB0aGUgbGFzdCBieXRlIGluIHRoZSBlbmNvZGluZyAoaW4gd2hpY2gKLS8vICAgY2FzZSBhbGwgcmVtYWluaW5nIGJpdHMgb2YgdGhlIG51bWJlciBhcmUgemVybykgb3IgMSBpZgotLy8gICBtb3JlIGJ5dGVzIGZvbGxvdy4KLS8vIFRoZSBmaXJzdCBieXRlIGNvbnRhaW5zIHRoZSBsZWFzdC1zaWduaWZpY2FudCA3IGJpdHMgb2YgdGhlIG51bWJlciwgdGhlCi0vLyBzZWNvbmQgYnl0ZSAoaWYgcHJlc2VudCkgY29udGFpbnMgdGhlIG5leHQtbGVhc3Qtc2lnbmlmaWNhbnQgNyBiaXRzLAotLy8gYW5kIHNvIG9uLiAgU28sIHRoZSBiaW5hcnkgbnVtYmVyIDEwMTEwMDAxMDEwMTEgd291bGQgYmUgZW5jb2RlZCBpbiB0d28KLS8vIGJ5dGVzIGFzICIxMDEwMTAxMSAwMDEwMTEwMCIuCi0vLwotLy8gSW4gdGhlb3J5LCB2YXJpbnQgY291bGQgYmUgdXNlZCB0byBlbmNvZGUgaW50ZWdlcnMgb2YgYW55IGxlbmd0aC4KLS8vIEhvd2V2ZXIsIGZvciBwcmFjdGljYWxpdHkgd2Ugc2V0IGEgbGltaXQgYXQgNjQgYml0cy4gIFRoZSBtYXhpbXVtIGVuY29kZWQKLS8vIGxlbmd0aCBvZiBhIG51bWJlciBpcyB0aHVzIDEwIGJ5dGVzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KLSNpZmRlZiBfTVNDX1ZFUgotICAvLyBBc3N1bWluZyB3aW5kb3dzIGlzIGFsd2F5cyBsaXR0bGUtZW5kaWFuLgotICAjaWYgIWRlZmluZWQoUFJPVE9CVUZfRElTQUJMRV9MSVRUTEVfRU5ESUFOX09QVF9GT1JfVEVTVCkKLSAgICAjZGVmaW5lIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gMQotICAjZW5kaWYKLSAgI2lmIF9NU0NfVkVSID49IDEzMDAgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKLSAgICAvLyBJZiBNU1ZDIGhhcyAiL1JUQ2MiIHNldCwgaXQgd2lsbCBjb21wbGFpbiBhYm91dCB0cnVuY2F0aW5nIGNhc3RzIGF0Ci0gICAgLy8gcnVudGltZS4gIFRoaXMgZmlsZSBjb250YWlucyBzb21lIGludGVudGlvbmFsIHRydW5jYXRpbmcgY2FzdHMuCi0gICAgI3ByYWdtYSBydW50aW1lX2NoZWNrcygiYyIsIG9mZikKLSAgI2VuZGlmCi0jZWxzZQotICAjaW5jbHVkZSA8c3lzL3BhcmFtLmg+ICAgLy8gX19CWVRFX09SREVSCi0gICNpZiAoKGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pICYmICFkZWZpbmVkKF9fQklHX0VORElBTl9fKSkgfHwgXAotICAgICAgICAgKGRlZmluZWQoX19CWVRFX09SREVSKSAmJiBfX0JZVEVfT1JERVIgPT0gX19MSVRUTEVfRU5ESUFOKSkgJiYgXAotICAgICAgIWRlZmluZWQoUFJPVE9CVUZfRElTQUJMRV9MSVRUTEVfRU5ESUFOX09QVF9GT1JfVEVTVCkKLSAgICAjZGVmaW5lIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gMQotICAjZW5kaWYKLSNlbmRpZgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci0KLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLWNsYXNzIERlc2NyaXB0b3JQb29sOwotY2xhc3MgTWVzc2FnZUZhY3Rvcnk7Ci0KLW5hbWVzcGFjZSBpbyB7Ci0KLS8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgotY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsKLWNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOwotCi0vLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgotY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsgICAgICAgICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAotY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07ICAgICAgICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAotCi0vLyBDbGFzcyB3aGljaCByZWFkcyBhbmQgZGVjb2RlcyBiaW5hcnkgZGF0YSB3aGljaCBpcyBjb21wb3NlZCBvZiB2YXJpbnQtCi0vLyBlbmNvZGVkIGludGVnZXJzIGFuZCBmaXhlZC13aWR0aCBwaWVjZXMuICBXcmFwcyBhIFplcm9Db3B5SW5wdXRTdHJlYW0uCi0vLyBNb3N0IHVzZXJzIHdpbGwgbm90IG5lZWQgdG8gZGVhbCB3aXRoIENvZGVkSW5wdXRTdHJlYW0uCi0vLwotLy8gTW9zdCBtZXRob2RzIG9mIENvZGVkSW5wdXRTdHJlYW0gdGhhdCByZXR1cm4gYSBib29sIHJldHVybiBmYWxzZSBpZiBhbgotLy8gdW5kZXJseWluZyBJL08gZXJyb3Igb2NjdXJzIG9yIGlmIHRoZSBkYXRhIGlzIG1hbGZvcm1lZC4gIE9uY2Ugc3VjaCBhCi0vLyBmYWlsdXJlIG9jY3VycywgdGhlIENvZGVkSW5wdXRTdHJlYW0gaXMgYnJva2VuIGFuZCBpcyBubyBsb25nZXIgdXNlZnVsLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvZGVkSW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGEgQ29kZWRJbnB1dFN0cmVhbSB0aGF0IHJlYWRzIGZyb20gdGhlIGdpdmVuIFplcm9Db3B5SW5wdXRTdHJlYW0uCi0gIGV4cGxpY2l0IENvZGVkSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOwotCi0gIC8vIENyZWF0ZSBhIENvZGVkSW5wdXRTdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBmbGF0IGFycmF5LiAgVGhpcyBpcwotICAvLyBmYXN0ZXIgdGhhbiB1c2luZyBhbiBBcnJheUlucHV0U3RyZWFtLiAgUHVzaExpbWl0KHNpemUpIGlzIGltcGxpZWQgYnkKLSAgLy8gdGhpcyBjb25zdHJ1Y3Rvci4KLSAgZXhwbGljaXQgQ29kZWRJbnB1dFN0cmVhbShjb25zdCB1aW50OCogYnVmZmVyLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gRGVzdHJveSB0aGUgQ29kZWRJbnB1dFN0cmVhbSBhbmQgcG9zaXRpb24gdGhlIHVuZGVybHlpbmcKLSAgLy8gWmVyb0NvcHlJbnB1dFN0cmVhbSBhdCB0aGUgZmlyc3QgdW5yZWFkIGJ5dGUuICBJZiBhbiBlcnJvciBvY2N1cnJlZCB3aGlsZQotICAvLyByZWFkaW5nIChjYXVzaW5nIGEgbWV0aG9kIHRvIHJldHVybiBmYWxzZSksIHRoZW4gdGhlIGV4YWN0IHBvc2l0aW9uIG9mCi0gIC8vIHRoZSBpbnB1dCBzdHJlYW0gbWF5IGJlIGFueXdoZXJlIGJldHdlZW4gdGhlIGxhc3QgdmFsdWUgdGhhdCB3YXMgcmVhZAotICAvLyBzdWNjZXNzZnVsbHkgYW5kIHRoZSBzdHJlYW0ncyBieXRlIGxpbWl0LgotICB+Q29kZWRJbnB1dFN0cmVhbSgpOwotCi0gIC8vIFJldHVybiB0cnVlIGlmIHRoaXMgQ29kZWRJbnB1dFN0cmVhbSByZWFkcyBmcm9tIGEgZmxhdCBhcnJheSBpbnN0ZWFkIG9mCi0gIC8vIGEgWmVyb0NvcHlJbnB1dFN0cmVhbS4KLSAgaW5saW5lIGJvb2wgSXNGbGF0KCkgY29uc3Q7Ci0KLSAgLy8gU2tpcHMgYSBudW1iZXIgb2YgYnl0ZXMuICBSZXR1cm5zIGZhbHNlIGlmIGFuIHVuZGVybHlpbmcgcmVhZCBlcnJvcgotICAvLyBvY2N1cnMuCi0gIGJvb2wgU2tpcChpbnQgY291bnQpOwotCi0gIC8vIFNldHMgKmRhdGEgdG8gcG9pbnQgZGlyZWN0bHkgYXQgdGhlIHVucmVhZCBwYXJ0IG9mIHRoZSBDb2RlZElucHV0U3RyZWFtJ3MKLSAgLy8gdW5kZXJseWluZyBidWZmZXIsIGFuZCAqc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGF0IGJ1ZmZlciwgYnV0IGRvZXMgbm90Ci0gIC8vIGFkdmFuY2UgdGhlIHN0cmVhbSdzIGN1cnJlbnQgcG9zaXRpb24uICBUaGlzIHdpbGwgYWx3YXlzIGVpdGhlciBwcm9kdWNlCi0gIC8vIGEgbm9uLWVtcHR5IGJ1ZmZlciBvciByZXR1cm4gZmFsc2UuICBJZiB0aGUgY2FsbGVyIGNvbnN1bWVzIGFueSBvZgotICAvLyB0aGlzIGRhdGEsIGl0IHNob3VsZCB0aGVuIGNhbGwgU2tpcCgpIHRvIHNraXAgb3ZlciB0aGUgY29uc3VtZWQgYnl0ZXMuCi0gIC8vIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nIGV4dGVybmFsIGZhc3QgcGFyc2luZyByb3V0aW5lcyBmb3IKLSAgLy8gdHlwZXMgb2YgZGF0YSBub3QgY292ZXJlZCBieSB0aGUgQ29kZWRJbnB1dFN0cmVhbSBpbnRlcmZhY2UuCi0gIGJvb2wgR2V0RGlyZWN0QnVmZmVyUG9pbnRlcihjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKLQotICAvLyBMaWtlIEdldERpcmVjdEJ1ZmZlclBvaW50ZXIsIGJ1dCB0aGlzIG1ldGhvZCBpcyBpbmxpbmVkLCBhbmQgZG9lcyBub3QKLSAgLy8gYXR0ZW1wdCB0byBSZWZyZXNoKCkgaWYgdGhlIGJ1ZmZlciBpcyBjdXJyZW50bHkgZW1wdHkuCi0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSB2b2lkIEdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoY29uc3Qgdm9pZCoqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemUpOwotCi0gIC8vIFJlYWQgcmF3IGJ5dGVzLCBjb3B5aW5nIHRoZW0gaW50byB0aGUgZ2l2ZW4gYnVmZmVyLgotICBib29sIFJlYWRSYXcodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gTGlrZSB0aGUgYWJvdmUsIHdpdGggaW5saW5lZCBvcHRpbWl6YXRpb25zLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQKLSAgLy8gYnkgdGhlIHByb3RvYnVmIGltcGxlbWVudGF0aW9uLgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBJbnRlcm5hbFJlYWRSYXdJbmxpbmUodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gTGlrZSBSZWFkUmF3LCBidXQgcmVhZHMgaW50byBhIHN0cmluZy4KLSAgLy8KLSAgLy8gSW1wbGVtZW50YXRpb24gTm90ZTogIFJlYWRTdHJpbmcoKSBncm93cyB0aGUgc3RyaW5nIGdyYWR1YWxseSBhcyBpdAotICAvLyByZWFkcyBpbiB0aGUgZGF0YSwgcmF0aGVyIHRoYW4gYWxsb2NhdGluZyB0aGUgZW50aXJlIHJlcXVlc3RlZCBzaXplCi0gIC8vIHVwZnJvbnQuICBUaGlzIHByZXZlbnRzIGRlbmlhbC1vZi1zZXJ2aWNlIGF0dGFja3MgaW4gd2hpY2ggYSBjbGllbnQKLSAgLy8gY291bGQgY2xhaW0gdGhhdCBhIHN0cmluZyBpcyBnb2luZyB0byBiZSBNQVhfSU5UIGJ5dGVzIGxvbmcgaW4gb3JkZXIgdG8KLSAgLy8gY3Jhc2ggdGhlIHNlcnZlciBiZWNhdXNlIGl0IGNhbid0IGFsbG9jYXRlIHRoaXMgbXVjaCBzcGFjZSBhdCBvbmNlLgotICBib29sIFJlYWRTdHJpbmcoc3RyaW5nKiBidWZmZXIsIGludCBzaXplKTsKLSAgLy8gTGlrZSB0aGUgYWJvdmUsIHdpdGggaW5saW5lZCBvcHRpbWl6YXRpb25zLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQKLSAgLy8gYnkgdGhlIHByb3RvYnVmIGltcGxlbWVudGF0aW9uLgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBJbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUoc3RyaW5nKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKLQotCi0gIC8vIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgotICBib29sIFJlYWRMaXR0bGVFbmRpYW4zMih1aW50MzIqIHZhbHVlKTsKLSAgLy8gUmVhZCBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIuCi0gIGJvb2wgUmVhZExpdHRsZUVuZGlhbjY0KHVpbnQ2NCogdmFsdWUpOwotCi0gIC8vIFRoZXNlIG1ldGhvZHMgcmVhZCBmcm9tIGFuIGV4dGVybmFsbHkgcHJvdmlkZWQgYnVmZmVyLiBUaGUgY2FsbGVyIGlzCi0gIC8vIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBidWZmZXIgaGFzIHN1ZmZpY2llbnQgc3BhY2UuCi0gIC8vIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgotICBzdGF0aWMgY29uc3QgdWludDgqIFJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheShjb25zdCB1aW50OCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyKiB2YWx1ZSk7Ci0gIC8vIFJlYWQgYSA2NC1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgotICBzdGF0aWMgY29uc3QgdWludDgqIFJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShjb25zdCB1aW50OCogYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0KiB2YWx1ZSk7Ci0KLSAgLy8gUmVhZCBhbiB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggVmFyaW50IGVuY29kaW5nLCB0cnVuY2F0aW5nIHRvIDMyIGJpdHMuCi0gIC8vIFJlYWRpbmcgYSAzMi1iaXQgdmFsdWUgaXMgZXF1aXZhbGVudCB0byByZWFkaW5nIGEgNjQtYml0IG9uZSBhbmQgY2FzdGluZwotICAvLyBpdCB0byB1aW50MzIsIGJ1dCBtYXkgYmUgbW9yZSBlZmZpY2llbnQuCi0gIGJvb2wgUmVhZFZhcmludDMyKHVpbnQzMiogdmFsdWUpOwotICAvLyBSZWFkIGFuIHVuc2lnbmVkIGludGVnZXIgd2l0aCBWYXJpbnQgZW5jb2RpbmcuCi0gIGJvb2wgUmVhZFZhcmludDY0KHVpbnQ2NCogdmFsdWUpOwotCi0gIC8vIFJlYWQgYSB0YWcuICBUaGlzIGNhbGxzIFJlYWRWYXJpbnQzMigpIGFuZCByZXR1cm5zIHRoZSByZXN1bHQsIG9yIHJldHVybnMKLSAgLy8gemVybyAod2hpY2ggaXMgbm90IGEgdmFsaWQgdGFnKSBpZiBSZWFkVmFyaW50MzIoKSBmYWlscy4gIEFsc28sIGl0IHVwZGF0ZXMKLSAgLy8gdGhlIGxhc3QgdGFnIHZhbHVlLCB3aGljaCBjYW4gYmUgY2hlY2tlZCB3aXRoIExhc3RUYWdXYXMoKS4KLSAgLy8gQWx3YXlzIGlubGluZSBiZWNhdXNlIHRoaXMgaXMgb25seSBjYWxsZWQgaW4gb25lIHBsYWNlIHBlciBwYXJzZSBsb29wCi0gIC8vIGJ1dCBpdCBpcyBjYWxsZWQgZm9yIGV2ZXJ5IGl0ZXJhdGlvbiBvZiBzYWlkIGxvb3AsIHNvIGl0IHNob3VsZCBiZSBmYXN0LgotICAvLyBHQ0MgZG9lc24ndCB3YW50IHRvIGlubGluZSB0aGlzIGJ5IGRlZmF1bHQuCi0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSB1aW50MzIgUmVhZFRhZygpOwotCi0gIC8vIFRoaXMgdXN1YWxseSBhIGZhc3RlciBhbHRlcm5hdGl2ZSB0byBSZWFkVGFnKCkgd2hlbiBjdXRvZmYgaXMgYSBtYW5pZmVzdAotICAvLyBjb25zdGFudC4gIEl0IGRvZXMgcGFydGljdWxhcmx5IHdlbGwgZm9yIGN1dG9mZiA+PSAxMjcuICBUaGUgZmlyc3QgcGFydAotICAvLyBvZiB0aGUgcmV0dXJuIHZhbHVlIGlzIHRoZSB0YWcgdGhhdCB3YXMgcmVhZCwgdGhvdWdoIGl0IGNhbiBhbHNvIGJlIDAgaW4KLSAgLy8gdGhlIGNhc2VzIHdoZXJlIFJlYWRUYWcoKSB3b3VsZCByZXR1cm4gMC4gIElmIHRoZSBzZWNvbmQgcGFydCBpcyB0cnVlCi0gIC8vIHRoZW4gdGhlIHRhZyBpcyBrbm93biB0byBiZSBpbiBbMCwgY3V0b2ZmXS4gIElmIG5vdCwgdGhlIHRhZyBlaXRoZXIgaXMKLSAgLy8gYWJvdmUgY3V0b2ZmIG9yIGlzIDAuICAoVGhlcmUncyBpbnRlbnRpb25hbCB3aWdnbGUgcm9vbSB3aGVuIHRhZyBpcyAwLAotICAvLyBiZWNhdXNlIHRoYXQgY2FuIGFyaXNlIGluIHNldmVyYWwgd2F5cywgYW5kIGZvciBiZXN0IHBlcmZvcm1hbmNlIHdlIHdhbnQKLSAgLy8gdG8gYXZvaWQgYW4gZXh0cmEgImlzIHRhZyA9PSAwPyIgY2hlY2sgaGVyZS4pCi0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGQ6OnBhaXI8dWludDMyLCBib29sPiBSZWFkVGFnV2l0aEN1dG9mZigKLSAgICAgIHVpbnQzMiBjdXRvZmYpOwotCi0gIC8vIFVzdWFsbHkgcmV0dXJucyB0cnVlIGlmIGNhbGxpbmcgUmVhZFZhcmludDMyKCkgbm93IHdvdWxkIHByb2R1Y2UgdGhlIGdpdmVuCi0gIC8vIHZhbHVlLiAgV2lsbCBhbHdheXMgcmV0dXJuIGZhbHNlIGlmIFJlYWRWYXJpbnQzMigpIHdvdWxkIG5vdCByZXR1cm4gdGhlCi0gIC8vIGdpdmVuIHZhbHVlLiAgSWYgRXhwZWN0VGFnKCkgcmV0dXJucyB0cnVlLCBpdCBhbHNvIGFkdmFuY2VzIHBhc3QKLSAgLy8gdGhlIHZhcmludC4gIEZvciBiZXN0IHBlcmZvcm1hbmNlLCB1c2UgYSBjb21waWxlLXRpbWUgY29uc3RhbnQgYXMgdGhlCi0gIC8vIHBhcmFtZXRlci4KLSAgLy8gQWx3YXlzIGlubGluZSBiZWNhdXNlIHRoaXMgY29sbGFwc2VzIHRvIGEgc21hbGwgbnVtYmVyIG9mIGluc3RydWN0aW9ucwotICAvLyB3aGVuIGdpdmVuIGEgY29uc3RhbnQgcGFyYW1ldGVyLCBidXQgR0NDIGRvZXNuJ3Qgd2FudCB0byBpbmxpbmUgYnkgZGVmYXVsdC4KLSAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGJvb2wgRXhwZWN0VGFnKHVpbnQzMiBleHBlY3RlZCk7Ci0KLSAgLy8gTGlrZSBhYm92ZSwgZXhjZXB0IHRoaXMgcmVhZHMgZnJvbSB0aGUgc3BlY2lmaWVkIGJ1ZmZlci4gVGhlIGNhbGxlciBpcwotICAvLyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdCB0aGUgYnVmZmVyIGlzIGxhcmdlIGVub3VnaCB0byByZWFkIGEgdmFyaW50Ci0gIC8vIG9mIHRoZSBleHBlY3RlZCBzaXplLiBGb3IgYmVzdCBwZXJmb3JtYW5jZSwgdXNlIGEgY29tcGlsZS10aW1lIGNvbnN0YW50IGFzCi0gIC8vIHRoZSBleHBlY3RlZCB0YWcgcGFyYW1ldGVyLgotICAvLwotICAvLyBSZXR1cm5zIGEgcG9pbnRlciBiZXlvbmQgdGhlIGV4cGVjdGVkIHRhZyBpZiBpdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgaXQKLSAgLy8gd2FzIG5vdC4KLSAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHN0YXRpYyBjb25zdCB1aW50OCogRXhwZWN0VGFnRnJvbUFycmF5KAotICAgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKLSAgICAgIHVpbnQzMiBleHBlY3RlZCk7Ci0KLSAgLy8gVXN1YWxseSByZXR1cm5zIHRydWUgaWYgbm8gbW9yZSBieXRlcyBjYW4gYmUgcmVhZC4gIEFsd2F5cyByZXR1cm5zIGZhbHNlCi0gIC8vIGlmIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBJZiBFeHBlY3RBdEVuZCgpIHJldHVybnMgdHJ1ZSwgYSBzdWJzZXF1ZW50Ci0gIC8vIGNhbGwgdG8gTGFzdFRhZ1dhcygpIHdpbGwgYWN0IGFzIGlmIFJlYWRUYWcoKSBoYWQgYmVlbiBjYWxsZWQgYW5kIHJldHVybmVkCi0gIC8vIHplcm8sIGFuZCBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKSB3aWxsIHJldHVybiB0cnVlLgotICBib29sIEV4cGVjdEF0RW5kKCk7Ci0KLSAgLy8gSWYgdGhlIGxhc3QgY2FsbCB0byBSZWFkVGFnKCkgb3IgUmVhZFRhZ1dpdGhDdXRvZmYoKSByZXR1cm5lZCB0aGUKLSAgLy8gZ2l2ZW4gdmFsdWUsIHJldHVybnMgdHJ1ZS4gIE90aGVyd2lzZSwgcmV0dXJucyBmYWxzZTsKLSAgLy8KLSAgLy8gVGhpcyBpcyBuZWVkZWQgYmVjYXVzZSBwYXJzZXJzIGZvciBzb21lIHR5cGVzIG9mIGVtYmVkZGVkIG1lc3NhZ2VzCi0gIC8vICh3aXRoIGZpZWxkIHR5cGUgVFlQRV9HUk9VUCkgZG9uJ3QgYWN0dWFsbHkga25vdyB0aGF0IHRoZXkndmUgcmVhY2hlZCB0aGUKLSAgLy8gZW5kIG9mIGEgbWVzc2FnZSB1bnRpbCB0aGV5IHNlZSBhbiBFTkRHUk9VUCB0YWcsIHdoaWNoIHdhcyBhY3R1YWxseSBwYXJ0Ci0gIC8vIG9mIHRoZSBlbmNsb3NpbmcgbWVzc2FnZS4gIFRoZSBlbmNsb3NpbmcgbWVzc2FnZSB3b3VsZCBsaWtlIHRvIGNoZWNrIHRoYXQKLSAgLy8gdGFnIHRvIG1ha2Ugc3VyZSBpdCBoYWQgdGhlIHJpZ2h0IG51bWJlciwgc28gaXQgY2FsbHMgTGFzdFRhZ1dhcygpIG9uCi0gIC8vIHJldHVybiBmcm9tIHRoZSBlbWJlZGRlZCBwYXJzZXIgdG8gY2hlY2suCi0gIGJvb2wgTGFzdFRhZ1dhcyh1aW50MzIgZXhwZWN0ZWQpOwotCi0gIC8vIFdoZW4gcGFyc2luZyBtZXNzYWdlIChidXQgTk9UIGEgZ3JvdXApLCB0aGlzIG1ldGhvZCBtdXN0IGJlIGNhbGxlZAotICAvLyBpbW1lZGlhdGVseSBhZnRlciBNZXJnZUZyb21Db2RlZFN0cmVhbSgpIHJldHVybnMgKGlmIGl0IHJldHVybnMgdHJ1ZSkKLSAgLy8gdG8gZnVydGhlciB2ZXJpZnkgdGhhdCB0aGUgbWVzc2FnZSBlbmRlZCBpbiBhIGxlZ2l0aW1hdGUgd2F5LiAgRm9yCi0gIC8vIGV4YW1wbGUsIHRoaXMgdmVyaWZpZXMgdGhhdCBwYXJzaW5nIGRpZCBub3QgZW5kIG9uIGFuIGVuZC1ncm91cCB0YWcuCi0gIC8vIEl0IGFsc28gY2hlY2tzIGZvciBzb21lIGNhc2VzIHdoZXJlLCBkdWUgdG8gb3B0aW1pemF0aW9ucywKLSAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSBjYW4gaW5jb3JyZWN0bHkgcmV0dXJuIHRydWUuCi0gIGJvb2wgQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7Ci0KLSAgLy8gTGltaXRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gTGltaXRzIGFyZSB1c2VkIHdoZW4gcGFyc2luZyBsZW5ndGgtZGVsaW1pdGVkIGVtYmVkZGVkIG1lc3NhZ2VzLgotICAvLyBBZnRlciB0aGUgbWVzc2FnZSdzIGxlbmd0aCBpcyByZWFkLCBQdXNoTGltaXQoKSBpcyB1c2VkIHRvIHByZXZlbnQKLSAgLy8gdGhlIENvZGVkSW5wdXRTdHJlYW0gZnJvbSByZWFkaW5nIGJleW9uZCB0aGF0IGxlbmd0aC4gIE9uY2UgdGhlCi0gIC8vIGVtYmVkZGVkIG1lc3NhZ2UgaGFzIGJlZW4gcGFyc2VkLCBQb3BMaW1pdCgpIGlzIGNhbGxlZCB0byB1bmRvIHRoZQotICAvLyBsaW1pdC4KLQotICAvLyBPcGFxdWUgdHlwZSB1c2VkIHdpdGggUHVzaExpbWl0KCkgYW5kIFBvcExpbWl0KCkuICBEbyBub3QgbW9kaWZ5Ci0gIC8vIHZhbHVlcyBvZiB0aGlzIHR5cGUgeW91cnNlbGYuICBUaGUgb25seSByZWFzb24gdGhhdCB0aGlzIGlzbid0IGEKLSAgLy8gc3RydWN0IHdpdGggcHJpdmF0ZSBpbnRlcm5hbHMgaXMgZm9yIGVmZmljaWVuY3kuCi0gIHR5cGVkZWYgaW50IExpbWl0OwotCi0gIC8vIFBsYWNlcyBhIGxpbWl0IG9uIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGUgc3RyZWFtIG1heSByZWFkLAotICAvLyBzdGFydGluZyBmcm9tIHRoZSBjdXJyZW50IHBvc2l0aW9uLiAgT25jZSB0aGUgc3RyZWFtIGhpdHMgdGhpcyBsaW1pdCwKLSAgLy8gaXQgd2lsbCBhY3QgbGlrZSB0aGUgZW5kIG9mIHRoZSBpbnB1dCBoYXMgYmVlbiByZWFjaGVkIHVudGlsIFBvcExpbWl0KCkKLSAgLy8gaXMgY2FsbGVkLgotICAvLwotICAvLyBBcyB0aGUgbmFtZXMgaW1wbHksIHRoZSBzdHJlYW0gY29uY2VwdHVhbGx5IGhhcyBhIHN0YWNrIG9mIGxpbWl0cy4gIFRoZQotICAvLyBzaG9ydGVzdCBsaW1pdCBvbiB0aGUgc3RhY2sgaXMgYWx3YXlzIGVuZm9yY2VkLCBldmVuIGlmIGl0IGlzIG5vdCB0aGUKLSAgLy8gdG9wIGxpbWl0LgotICAvLwotICAvLyBUaGUgdmFsdWUgcmV0dXJuZWQgYnkgUHVzaExpbWl0KCkgaXMgb3BhcXVlIHRvIHRoZSBjYWxsZXIsIGFuZCBtdXN0Ci0gIC8vIGJlIHBhc3NlZCB1bmNoYW5nZWQgdG8gdGhlIGNvcnJlc3BvbmRpbmcgY2FsbCB0byBQb3BMaW1pdCgpLgotICBMaW1pdCBQdXNoTGltaXQoaW50IGJ5dGVfbGltaXQpOwotCi0gIC8vIFBvcHMgdGhlIGxhc3QgbGltaXQgcHVzaGVkIGJ5IFB1c2hMaW1pdCgpLiAgVGhlIGlucHV0IG11c3QgYmUgdGhlIHZhbHVlCi0gIC8vIHJldHVybmVkIGJ5IHRoYXQgY2FsbCB0byBQdXNoTGltaXQoKS4KLSAgdm9pZCBQb3BMaW1pdChMaW1pdCBsaW1pdCk7Ci0KLSAgLy8gUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIGxlZnQgdW50aWwgdGhlIG5lYXJlc3QgbGltaXQgb24gdGhlCi0gIC8vIHN0YWNrIGlzIGhpdCwgb3IgLTEgaWYgbm8gbGltaXRzIGFyZSBpbiBwbGFjZS4KLSAgaW50IEJ5dGVzVW50aWxMaW1pdCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJlYW0uCi0gIGludCBDdXJyZW50UG9zaXRpb24oKSBjb25zdDsKLQotICAvLyBUb3RhbCBCeXRlcyBMaW1pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUbyBwcmV2ZW50IG1hbGljaW91cyB1c2VycyBmcm9tIHNlbmRpbmcgZXhjZXNzaXZlbHkgbGFyZ2UgbWVzc2FnZXMKLSAgLy8gYW5kIGNhdXNpbmcgaW50ZWdlciBvdmVyZmxvd3Mgb3IgbWVtb3J5IGV4aGF1c3Rpb24sIENvZGVkSW5wdXRTdHJlYW0KLSAgLy8gaW1wb3NlcyBhIGhhcmQgbGltaXQgb24gdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyBpdCB3aWxsIHJlYWQuCi0KLSAgLy8gU2V0cyB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB0aGlzIENvZGVkSW5wdXRTdHJlYW0gd2lsbCByZWFkCi0gIC8vIGJlZm9yZSByZWZ1c2luZyB0byBjb250aW51ZS4gIFRvIHByZXZlbnQgaW50ZWdlciBvdmVyZmxvd3MgaW4gdGhlCi0gIC8vIHByb3RvY29sIGJ1ZmZlcnMgaW1wbGVtZW50YXRpb24sIGFzIHdlbGwgYXMgdG8gcHJldmVudCBzZXJ2ZXJzIGZyb20KLSAgLy8gYWxsb2NhdGluZyBlbm9ybW91cyBhbW91bnRzIG9mIG1lbW9yeSB0byBob2xkIHBhcnNlZCBtZXNzYWdlcywgdGhlCi0gIC8vIG1heGltdW0gbWVzc2FnZSBsZW5ndGggc2hvdWxkIGJlIGxpbWl0ZWQgdG8gdGhlIHNob3J0ZXN0IGxlbmd0aCB0aGF0Ci0gIC8vIHdpbGwgbm90IGhhcm0gdXNhYmlsaXR5LiAgVGhlIHRoZW9yZXRpY2FsIHNob3J0ZXN0IG1lc3NhZ2UgdGhhdCBjb3VsZAotICAvLyBjYXVzZSBpbnRlZ2VyIG92ZXJmbG93cyBpcyA1MTJNQi4gIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0TUIuICBBcHBzCi0gIC8vIHNob3VsZCBzZXQgc2hvcnRlciBsaW1pdHMgaWYgcG9zc2libGUuICBJZiB3YXJuaW5nX3RocmVzaG9sZCBpcyBub3QgLTEsCi0gIC8vIGEgd2FybmluZyB3aWxsIGJlIHByaW50ZWQgdG8gc3RkZXJyIGFmdGVyIHdhcm5pbmdfdGhyZXNob2xkIGJ5dGVzIGFyZQotICAvLyByZWFkLiAgRm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IGFsbCBuZWdhdGl2ZSB2YWx1ZXMgZ2V0IHNxdWFzaGVkIHRvIC0xLAotICAvLyBhcyBvdGhlciBuZWdhdGl2ZSB2YWx1ZXMgbWlnaHQgaGF2ZSBzcGVjaWFsIGludGVybmFsIG1lYW5pbmdzLgotICAvLyBBbiBlcnJvciB3aWxsIGFsd2F5cyBiZSBwcmludGVkIHRvIHN0ZGVyciBpZiB0aGUgbGltaXQgaXMgcmVhY2hlZC4KLSAgLy8KLSAgLy8gVGhpcyBpcyB1bnJlbGF0ZWQgdG8gUHVzaExpbWl0KCkvUG9wTGltaXQoKS4KLSAgLy8KLSAgLy8gSGludDogIElmIHlvdSBhcmUgcmVhZGluZyB0aGlzIGJlY2F1c2UgeW91ciBwcm9ncmFtIGlzIHByaW50aW5nIGEKLSAgLy8gICB3YXJuaW5nIGFib3V0IGRhbmdlcm91c2x5IGxhcmdlIHByb3RvY29sIG1lc3NhZ2VzLCB5b3UgbWF5IGJlCi0gIC8vICAgY29uZnVzZWQgYWJvdXQgd2hhdCB0byBkbyBuZXh0LiAgVGhlIGJlc3Qgb3B0aW9uIGlzIHRvIGNoYW5nZSB5b3VyCi0gIC8vICAgZGVzaWduIHN1Y2ggdGhhdCBleGNlc3NpdmVseSBsYXJnZSBtZXNzYWdlcyBhcmUgbm90IG5lY2Vzc2FyeS4KLSAgLy8gICBGb3IgZXhhbXBsZSwgdHJ5IHRvIGRlc2lnbiBmaWxlIGZvcm1hdHMgdG8gY29uc2lzdCBvZiBtYW55IHNtYWxsCi0gIC8vICAgbWVzc2FnZXMgcmF0aGVyIHRoYW4gYSBzaW5nbGUgbGFyZ2Ugb25lLiAgSWYgdGhpcyBpcyBpbmZlYXNpYmxlLAotICAvLyAgIHlvdSB3aWxsIG5lZWQgdG8gaW5jcmVhc2UgdGhlIGxpbWl0LiAgQ2hhbmNlcyBhcmUsIHRob3VnaCwgdGhhdAotICAvLyAgIHlvdXIgY29kZSBuZXZlciBjb25zdHJ1Y3RzIGEgQ29kZWRJbnB1dFN0cmVhbSBvbiB3aGljaCB0aGUgbGltaXQKLSAgLy8gICBjYW4gYmUgc2V0LiAgWW91IHByb2JhYmx5IHBhcnNlIG1lc3NhZ2VzIGJ5IGNhbGxpbmcgdGhpbmdzIGxpa2UKLSAgLy8gICBNZXNzYWdlOjpQYXJzZUZyb21TdHJpbmcoKS4gIEluIHRoaXMgY2FzZSwgeW91IHdpbGwgbmVlZCB0byBjaGFuZ2UKLSAgLy8gICB5b3VyIGNvZGUgdG8gaW5zdGVhZCBjb25zdHJ1Y3Qgc29tZSBzb3J0IG9mIFplcm9Db3B5SW5wdXRTdHJlYW0KLSAgLy8gICAoZS5nLiBhbiBBcnJheUlucHV0U3RyZWFtKSwgY29uc3RydWN0IGEgQ29kZWRJbnB1dFN0cmVhbSBhcm91bmQKLSAgLy8gICB0aGF0LCB0aGVuIGNhbGwgTWVzc2FnZTo6UGFyc2VGcm9tQ29kZWRTdHJlYW0oKSBpbnN0ZWFkLiAgVGhlbgotICAvLyAgIHlvdSBjYW4gYWRqdXN0IHRoZSBsaW1pdC4gIFllcywgaXQncyBtb3JlIHdvcmssIGJ1dCB5b3UncmUgZG9pbmcKLSAgLy8gICBzb21ldGhpbmcgdW51c3VhbC4KLSAgdm9pZCBTZXRUb3RhbEJ5dGVzTGltaXQoaW50IHRvdGFsX2J5dGVzX2xpbWl0LCBpbnQgd2FybmluZ190aHJlc2hvbGQpOwotCi0gIC8vIFRoZSBUb3RhbCBCeXRlcyBMaW1pdCBtaW51cyB0aGUgQ3VycmVudCBQb3NpdGlvbiwgb3IgLTEgaWYgdGhlcmUKLSAgLy8gaXMgbm8gVG90YWwgQnl0ZXMgTGltaXQuCi0gIGludCBCeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkgY29uc3Q7Ci0KLSAgLy8gUmVjdXJzaW9uIExpbWl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVG8gcHJldmVudCBjb3JydXB0IG9yIG1hbGljaW91cyBtZXNzYWdlcyBmcm9tIGNhdXNpbmcgc3RhY2sgb3ZlcmZsb3dzLAotICAvLyB3ZSBtdXN0IGtlZXAgdHJhY2sgb2YgdGhlIGRlcHRoIG9mIHJlY3Vyc2lvbiB3aGVuIHBhcnNpbmcgZW1iZWRkZWQKLSAgLy8gbWVzc2FnZXMgYW5kIGdyb3Vwcy4gIENvZGVkSW5wdXRTdHJlYW0ga2VlcHMgdHJhY2sgb2YgdGhpcyBiZWNhdXNlIGl0Ci0gIC8vIGlzIHRoZSBvbmx5IG9iamVjdCB0aGF0IGlzIHBhc3NlZCBkb3duIHRoZSBzdGFjayBkdXJpbmcgcGFyc2luZy4KLQotICAvLyBTZXRzIHRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC4gIFRoZSBkZWZhdWx0IGlzIDEwMC4KLSAgdm9pZCBTZXRSZWN1cnNpb25MaW1pdChpbnQgbGltaXQpOwotCi0KLSAgLy8gSW5jcmVtZW50cyB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguICBSZXR1cm5zIHRydWUgaWYgdGhlIGRlcHRoIGlzCi0gIC8vIHVuZGVyIHRoZSBsaW1pdCwgZmFsc2UgaWYgaXQgaGFzIGdvbmUgb3Zlci4KLSAgYm9vbCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwotCi0gIC8vIERlY3JlbWVudHMgdGhlIHJlY3Vyc2lvbiBkZXB0aCBpZiBwb3NzaWJsZS4KLSAgdm9pZCBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwotCi0gIC8vIERlY3JlbWVudHMgdGhlIHJlY3Vyc2lvbiBkZXB0aCBibGluZGx5LiAgVGhpcyBpcyBmYXN0ZXIgdGhhbgotICAvLyBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpLiAgSXQgc2hvdWxkIGJlIHVzZWQgb25seSBpZiBhbGwgcHJldmlvdXMKLSAgLy8gaW5jcmVtZW50cyB0byByZWN1cnNpb24gZGVwdGggd2VyZSBzdWNjZXNzZnVsLgotICB2b2lkIFVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0KLSAgLy8gU2hvcnRoYW5kIGZvciBtYWtlX3BhaXIoUHVzaExpbWl0KGJ5dGVfbGltaXQpLCAtLXJlY3Vyc2lvbl9idWRnZXRfKS4KLSAgLy8gVXNpbmcgdGhpcyBjYW4gcmVkdWNlIGNvZGUgc2l6ZSBhbmQgY29tcGxleGl0eSBpbiBzb21lIGNhc2VzLiAgVGhlIGNhbGxlcgotICAvLyBpcyBleHBlY3RlZCB0byBjaGVjayB0aGF0IHRoZSBzZWNvbmQgcGFydCBvZiB0aGUgcmVzdWx0IGlzIG5vbi1uZWdhdGl2ZSAodG8KLSAgLy8gYmFpbCBvdXQgaWYgdGhlIGRlcHRoIG9mIHJlY3Vyc2lvbiBpcyB0b28gaGlnaCkgYW5kLCBpZiBhbGwgaXMgd2VsbCwgdG8KLSAgLy8gbGF0ZXIgcGFzcyB0aGUgZmlyc3QgcGFydCBvZiB0aGUgcmVzdWx0IHRvIFBvcExpbWl0KCkgb3Igc2ltaWxhci4KLSAgc3RkOjpwYWlyPENvZGVkSW5wdXRTdHJlYW06OkxpbWl0LCBpbnQ+IEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUHVzaExpbWl0KAotICAgICAgaW50IGJ5dGVfbGltaXQpOwotCi0gIC8vIFNob3J0aGFuZCBmb3IgUHVzaExpbWl0KFJlYWRWYXJpbnQzMigmbGVuZ3RoKSA/IGxlbmd0aCA6IDApLgotICBMaW1pdCBSZWFkTGVuZ3RoQW5kUHVzaExpbWl0KCk7Ci0KLSAgLy8gSGVscGVyIHRoYXQgaXMgZXF1aXZhbGVudCB0bzogewotICAvLyAgYm9vbCByZXN1bHQgPSBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKLSAgLy8gIFBvcExpbWl0KGxpbWl0KTsKLSAgLy8gIFVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gIC8vICByZXR1cm4gcmVzdWx0OyB9Ci0gIC8vIFVzaW5nIHRoaXMgY2FuIHJlZHVjZSBjb2RlIHNpemUgYW5kIGNvbXBsZXhpdHkgaW4gc29tZSBjYXNlcy4KLSAgLy8gRG8gbm90IHVzZSB1bmxlc3MgdGhlIGN1cnJlbnQgcmVjdXJzaW9uIGRlcHRoIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLgotICBib29sIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUG9wTGltaXQoTGltaXQgbGltaXQpOwotCi0gIC8vIEhlbHBlciB0aGF0IGlzIGVxdWl2YWxlbnQgdG86IHsKLSAgLy8gIGJvb2wgcmVzdWx0ID0gQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7Ci0gIC8vICBQb3BMaW1pdChsaW1pdCk7Ci0gIC8vICByZXR1cm4gcmVzdWx0OyB9Ci0gIC8vIFVzaW5nIHRoaXMgY2FuIHJlZHVjZSBjb2RlIHNpemUgYW5kIGNvbXBsZXhpdHkgaW4gc29tZSBjYXNlcy4KLSAgYm9vbCBDaGVja0VudGlyZU1lc3NhZ2VDb25zdW1lZEFuZFBvcExpbWl0KExpbWl0IGxpbWl0KTsKLQotICAvLyBFeHRlbnNpb24gUmVnaXN0cnkgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBBRFZBTkNFRCBVU0FHRTogIDk5LjklIG9mIHBlb3BsZSBjYW4gaWdub3JlIHRoaXMgc2VjdGlvbi4KLSAgLy8KLSAgLy8gQnkgZGVmYXVsdCwgd2hlbiBwYXJzaW5nIGV4dGVuc2lvbnMsIHRoZSBwYXJzZXIgbG9va3MgZm9yIGV4dGVuc2lvbgotICAvLyBkZWZpbml0aW9ucyBpbiB0aGUgcG9vbCB3aGljaCBvd25zIHRoZSBvdXRlciBtZXNzYWdlJ3MgRGVzY3JpcHRvci4KLSAgLy8gSG93ZXZlciwgeW91IG1heSBjYWxsIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCkgdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZQotICAvLyBwb29sIGluc3RlYWQuICBUaGlzIG1ha2VzIGl0IHBvc3NpYmxlLCBmb3IgZXhhbXBsZSwgdG8gcGFyc2UgYSBtZXNzYWdlCi0gIC8vIHVzaW5nIGEgZ2VuZXJhdGVkIGNsYXNzLCBidXQgcmVwcmVzZW50IHNvbWUgZXh0ZW5zaW9ucyB1c2luZwotICAvLyBEeW5hbWljTWVzc2FnZS4KLQotICAvLyBTZXQgdGhlIHBvb2wgdXNlZCB0byBsb29rIHVwIGV4dGVuc2lvbnMuICBNb3N0IHVzZXJzIGRvIG5vdCBuZWVkIHRvIGNhbGwKLSAgLy8gdGhpcyBhcyB0aGUgY29ycmVjdCBwb29sIHdpbGwgYmUgY2hvc2VuIGF1dG9tYXRpY2FsbHkuCi0gIC8vCi0gIC8vIFdBUk5JTkc6ICBJdCBpcyB2ZXJ5IGVhc3kgdG8gbWlzdXNlIHRoaXMuICBDYXJlZnVsbHkgcmVhZCB0aGUgcmVxdWlyZW1lbnRzCi0gIC8vICAgYmVsb3cuICBEbyBub3QgdXNlIHRoaXMgdW5sZXNzIHlvdSBhcmUgc3VyZSB5b3UgbmVlZCBpdC4gIEFsbW9zdCBubyBvbmUKLSAgLy8gICBkb2VzLgotICAvLwotICAvLyBMZXQncyBzYXkgeW91IGFyZSBwYXJzaW5nIGEgbWVzc2FnZSBpbnRvIG1lc3NhZ2Ugb2JqZWN0IG0sIGFuZCB5b3Ugd2FudAotICAvLyB0byB0YWtlIGFkdmFudGFnZSBvZiBTZXRFeHRlbnNpb25SZWdpc3RyeSgpLiAgWW91IG11c3QgZm9sbG93IHRoZXNlCi0gIC8vIHJlcXVpcmVtZW50czoKLSAgLy8KLSAgLy8gVGhlIGdpdmVuIERlc2NyaXB0b3JQb29sIG11c3QgY29udGFpbiBtLT5HZXREZXNjcmlwdG9yKCkuICBJdCBpcyBub3QKLSAgLy8gc3VmZmljaWVudCBmb3IgaXQgdG8gc2ltcGx5IGNvbnRhaW4gYSBkZXNjcmlwdG9yIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUKLSAgLy8gYW5kIGNvbnRlbnQgLS0gaXQgbXVzdCBiZSB0aGUgKmV4YWN0IG9iamVjdCouICBJbiBvdGhlciB3b3JkczoKLSAgLy8gICBhc3NlcnQocG9vbC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKG0tPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpID09Ci0gIC8vICAgICAgICAgIG0tPkdldERlc2NyaXB0b3IoKSk7Ci0gIC8vIFRoZXJlIGFyZSB0d28gd2F5cyB0byBzYXRpc2Z5IHRoaXMgcmVxdWlyZW1lbnQ6Ci0gIC8vIDEpIFVzZSBtLT5HZXREZXNjcmlwdG9yKCktPnBvb2woKSBhcyB0aGUgcG9vbC4gIFRoaXMgaXMgZ2VuZXJhbGx5IHVzZWxlc3MKLSAgLy8gICAgYmVjYXVzZSB0aGlzIGlzIHRoZSBwb29sIHRoYXQgd291bGQgYmUgdXNlZCBhbnl3YXkgaWYgeW91IGRpZG4ndCBjYWxsCi0gIC8vICAgIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCkgYXQgYWxsLgotICAvLyAyKSBVc2UgYSBEZXNjcmlwdG9yUG9vbCB3aGljaCBoYXMgbS0+R2V0RGVzY3JpcHRvcigpLT5wb29sKCkgYXMgYW4KLSAgLy8gICAgInVuZGVybGF5Ii4gIFJlYWQgdGhlIGRvY3VtZW50YXRpb24gZm9yIERlc2NyaXB0b3JQb29sIGZvciBtb3JlCi0gIC8vICAgIGluZm9ybWF0aW9uIGFib3V0IHVuZGVybGF5cy4KLSAgLy8KLSAgLy8gWW91IG11c3QgYWxzbyBwcm92aWRlIGEgTWVzc2FnZUZhY3RvcnkuICBUaGlzIGZhY3Rvcnkgd2lsbCBiZSB1c2VkIHRvCi0gIC8vIGNvbnN0cnVjdCBNZXNzYWdlIG9iamVjdHMgcmVwcmVzZW50aW5nIGV4dGVuc2lvbnMuICBUaGUgZmFjdG9yeSdzCi0gIC8vIEdldFByb3RvdHlwZSgpIE1VU1QgcmV0dXJuIG5vbi1OVUxMIGZvciBhbnkgRGVzY3JpcHRvciB3aGljaCBjYW4gYmUgZm91bmQKLSAgLy8gdGhyb3VnaCB0aGUgcHJvdmlkZWQgcG9vbC4KLSAgLy8KLSAgLy8gSWYgdGhlIHByb3ZpZGVkIGZhY3RvcnkgbWlnaHQgcmV0dXJuIGluc3RhbmNlcyBvZiBwcm90b2NvbC1jb21waWxlci0KLSAgLy8gZ2VuZXJhdGVkIChpLmUuIGNvbXBpbGVkLWluKSB0eXBlcywgb3IgaWYgdGhlIG91dGVyIG1lc3NhZ2Ugb2JqZWN0IG0gaXMKLSAgLy8gYSBnZW5lcmF0ZWQgdHlwZSwgdGhlbiB0aGUgZ2l2ZW4gZmFjdG9yeSBNVVNUIGhhdmUgdGhpcyBwcm9wZXJ0eTogIElmCi0gIC8vIEdldFByb3RvdHlwZSgpIGlzIGdpdmVuIGEgRGVzY3JpcHRvciB3aGljaCByZXNpZGVzIGluCi0gIC8vIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLCB0aGUgZmFjdG9yeSBNVVNUIHJldHVybiB0aGUgc2FtZQotICAvLyBwcm90b3R5cGUgd2hpY2ggTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkgd291bGQgcmV0dXJuLiAgVGhhdAotICAvLyBpcywgZ2l2ZW4gYSBkZXNjcmlwdG9yIGZvciBhIGdlbmVyYXRlZCB0eXBlLCB0aGUgZmFjdG9yeSBtdXN0IHJldHVybiBhbgotICAvLyBpbnN0YW5jZSBvZiB0aGUgZ2VuZXJhdGVkIGNsYXNzIChOT1QgRHluYW1pY01lc3NhZ2UpLiAgSG93ZXZlciwgd2hlbgotICAvLyBnaXZlbiBhIGRlc2NyaXB0b3IgZm9yIGEgdHlwZSB0aGF0IGlzIE5PVCBpbiBnZW5lcmF0ZWRfcG9vbCwgdGhlIGZhY3RvcnkKLSAgLy8gaXMgZnJlZSB0byByZXR1cm4gYW55IGltcGxlbWVudGF0aW9uLgotICAvLwotICAvLyBUaGUgcmVhc29uIGZvciB0aGlzIHJlcXVpcmVtZW50IGlzIHRoYXQgZ2VuZXJhdGVkIHN1Yi1vYmplY3RzIG1heSBiZQotICAvLyBhY2Nlc3NlZCB2aWEgdGhlIHN0YW5kYXJkIChub24tcmVmbGVjdGlvbikgZXh0ZW5zaW9uIGFjY2Vzc29yIG1ldGhvZHMsCi0gIC8vIGFuZCB0aGVzZSBtZXRob2RzIHdpbGwgZG93bi1jYXN0IHRoZSBvYmplY3QgdG8gdGhlIGdlbmVyYXRlZCBjbGFzcyB0eXBlLgotICAvLyBJZiB0aGUgb2JqZWN0IGlzIG5vdCBhY3R1YWxseSBvZiB0aGF0IHR5cGUsIHRoZSByZXN1bHRzIHdvdWxkIGJlIHVuZGVmaW5lZC4KLSAgLy8gT24gdGhlIG90aGVyIGhhbmQsIGlmIGFuIGV4dGVuc2lvbiBpcyBub3QgY29tcGlsZWQgaW4sIHRoZW4gdGhlcmUgaXMgbm8KLSAgLy8gd2F5IHRoZSBjb2RlIGNvdWxkIGVuZCB1cCBhY2Nlc3NpbmcgaXQgdmlhIHRoZSBzdGFuZGFyZCBhY2Nlc3NvcnMgLS0gdGhlCi0gIC8vIG9ubHkgd2F5IHRvIGFjY2VzcyB0aGUgZXh0ZW5zaW9uIGlzIHZpYSByZWZsZWN0aW9uLiAgV2hlbiB1c2luZyByZWZsZWN0aW9uLAotICAvLyBEeW5hbWljTWVzc2FnZSBhbmQgZ2VuZXJhdGVkIG1lc3NhZ2VzIGFyZSBpbmRpc3Rpbmd1aXNoYWJsZSwgc28gaXQncyBmaW5lCi0gIC8vIGlmIHRoZXNlIG9iamVjdHMgYXJlIHJlcHJlc2VudGVkIHVzaW5nIER5bmFtaWNNZXNzYWdlLgotICAvLwotICAvLyBVc2luZyBEeW5hbWljTWVzc2FnZUZhY3Rvcnkgb24gd2hpY2ggeW91IGhhdmUgY2FsbGVkCi0gIC8vIFNldERlbGVnYXRlVG9HZW5lcmF0ZWRGYWN0b3J5KHRydWUpIHNob3VsZCBiZSBzdWZmaWNpZW50IHRvIHNhdGlzZnkgdGhlCi0gIC8vIGFib3ZlIHJlcXVpcmVtZW50LgotICAvLwotICAvLyBJZiBlaXRoZXIgcG9vbCBvciBmYWN0b3J5IGlzIE5VTEwsIGJvdGggbXVzdCBiZSBOVUxMLgotICAvLwotICAvLyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIGlnbm9yZWQgd2hlbiBwYXJzaW5nICJsaXRlIiBtZXNzYWdlcyBhcyB0aGV5IGRvCi0gIC8vIG5vdCBoYXZlIGRlc2NyaXB0b3JzLgotICB2b2lkIFNldEV4dGVuc2lvblJlZ2lzdHJ5KGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKLQotICAvLyBHZXQgdGhlIERlc2NyaXB0b3JQb29sIHNldCB2aWEgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSwgb3IgTlVMTCBpZiBubyBwb29sCi0gIC8vIGhhcyBiZWVuIHByb3ZpZGVkLgotICBjb25zdCBEZXNjcmlwdG9yUG9vbCogR2V0RXh0ZW5zaW9uUG9vbCgpOwotCi0gIC8vIEdldCB0aGUgTWVzc2FnZUZhY3Rvcnkgc2V0IHZpYSBTZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBvciBOVUxMIGlmIG5vCi0gIC8vIGZhY3RvcnkgaGFzIGJlZW4gcHJvdmlkZWQuCi0gIE1lc3NhZ2VGYWN0b3J5KiBHZXRFeHRlbnNpb25GYWN0b3J5KCk7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29kZWRJbnB1dFN0cmVhbSk7Ci0KLSAgY29uc3QgdWludDgqIGJ1ZmZlcl87Ci0gIGNvbnN0IHVpbnQ4KiBidWZmZXJfZW5kXzsgICAgIC8vIHBvaW50ZXIgdG8gdGhlIGVuZCBvZiB0aGUgYnVmZmVyLgotICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87Ci0gIGludCB0b3RhbF9ieXRlc19yZWFkXzsgIC8vIHRvdGFsIGJ5dGVzIHJlYWQgZnJvbSBpbnB1dF8sIGluY2x1ZGluZwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY3VycmVudCBidWZmZXIKLQotICAvLyBJZiB0b3RhbF9ieXRlc19yZWFkXyBzdXJwYXNzZXMgSU5UX01BWCwgd2UgcmVjb3JkIHRoZSBleHRyYSBieXRlcyBoZXJlCi0gIC8vIHNvIHRoYXQgd2UgY2FuIEJhY2tVcCgpIG9uIGRlc3RydWN0aW9uLgotICBpbnQgb3ZlcmZsb3dfYnl0ZXNfOwotCi0gIC8vIExhc3RUYWdXYXMoKSBzdHVmZi4KLSAgdWludDMyIGxhc3RfdGFnXzsgICAgICAgICAvLyByZXN1bHQgb2YgbGFzdCBSZWFkVGFnKCkgb3IgUmVhZFRhZ1dpdGhDdXRvZmYoKS4KLQotICAvLyBUaGlzIGlzIHNldCB0cnVlIGJ5IFJlYWRUYWd7RmFsbGJhY2svU2xvd30oKSBpZiBpdCBpcyBjYWxsZWQgd2hlbiBleGFjdGx5Ci0gIC8vIGF0IEVPRiwgb3IgYnkgRXhwZWN0QXRFbmQoKSB3aGVuIGl0IHJldHVybnMgdHJ1ZS4gIFRoaXMgaGFwcGVucyB3aGVuIHdlCi0gIC8vIHJlYWNoIHRoZSBlbmQgb2YgYSBtZXNzYWdlIGFuZCBhdHRlbXB0IHRvIHJlYWQgYW5vdGhlciB0YWcuCi0gIGJvb2wgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF87Ci0KLSAgLy8gU2VlIEVuYWJsZUFsaWFzaW5nKCkuCi0gIGJvb2wgYWxpYXNpbmdfZW5hYmxlZF87Ci0KLSAgLy8gTGltaXRzCi0gIExpbWl0IGN1cnJlbnRfbGltaXRfOyAgIC8vIGlmIHBvc2l0aW9uID0gLTEsIG5vIGxpbWl0IGlzIGFwcGxpZWQKLQotICAvLyBGb3Igc2ltcGxpY2l0eSwgaWYgdGhlIGN1cnJlbnQgYnVmZmVyIGNyb3NzZXMgYSBsaW1pdCAoZWl0aGVyIGEgbm9ybWFsCi0gIC8vIGxpbWl0IGNyZWF0ZWQgYnkgUHVzaExpbWl0KCkgb3IgdGhlIHRvdGFsIGJ5dGVzIGxpbWl0KSwgYnVmZmVyX3NpemVfCi0gIC8vIG9ubHkgdHJhY2tzIHRoZSBudW1iZXIgb2YgYnl0ZXMgYmVmb3JlIHRoYXQgbGltaXQuICBUaGlzIGZpZWxkCi0gIC8vIGNvbnRhaW5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgYWZ0ZXIgaXQuICBOb3RlIHRoYXQgdGhpcyBpbXBsaWVzIHRoYXQgaWYKLSAgLy8gYnVmZmVyX3NpemVfID09IDAgYW5kIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyA+IDAsIHdlIGtub3cgd2UndmUKLSAgLy8gaGl0IGEgbGltaXQuICBIb3dldmVyLCBpZiBib3RoIGFyZSB6ZXJvLCBpdCBkb2Vzbid0IG5lY2Vzc2FyaWx5IG1lYW4KLSAgLy8gd2UgYXJlbid0IGF0IGEgbGltaXQgLS0gdGhlIGJ1ZmZlciBtYXkgaGF2ZSBlbmRlZCBleGFjdGx5IGF0IHRoZSBsaW1pdC4KLSAgaW50IGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XzsKLQotICAvLyBNYXhpbXVtIG51bWJlciBvZiBieXRlcyB0byByZWFkLCBwZXJpb2QuICBUaGlzIGlzIHVucmVsYXRlZCB0bwotICAvLyBjdXJyZW50X2xpbWl0Xy4gIFNldCB1c2luZyBTZXRUb3RhbEJ5dGVzTGltaXQoKS4KLSAgaW50IHRvdGFsX2J5dGVzX2xpbWl0XzsKLQotICAvLyBJZiBwb3NpdGl2ZS8wOiBMaW1pdCBmb3IgYnl0ZXMgcmVhZCBhZnRlciB3aGljaCBhIHdhcm5pbmcgZHVlIHRvIHNpemUKLSAgLy8gc2hvdWxkIGJlIGxvZ2dlZC4KLSAgLy8gSWYgLTE6IFByaW50aW5nIG9mIHdhcm5pbmcgZGlzYWJsZWQuIENhbiBiZSBzZXQgYnkgY2xpZW50LgotICAvLyBJZiAtMjogSW50ZXJuYWw6IExpbWl0IGhhcyBiZWVuIHJlYWNoZWQsIHByaW50IGZ1bGwgc2l6ZSB3aGVuIGRlc3RydWN0aW5nLgotICBpbnQgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfOwotCi0gIC8vIEN1cnJlbnQgcmVjdXJzaW9uIGJ1ZGdldCwgY29udHJvbGxlZCBieSBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIGFuZAotICAvLyBzaW1pbGFyLiAgU3RhcnRzIGF0IHJlY3Vyc2lvbl9saW1pdF8gYW5kIGdvZXMgZG93bjogaWYgdGhpcyByZWFjaGVzCi0gIC8vIC0xIHdlIGFyZSBvdmVyIGJ1ZGdldC4KLSAgaW50IHJlY3Vyc2lvbl9idWRnZXRfOwotICAvLyBSZWN1cnNpb24gZGVwdGggbGltaXQsIHNldCBieSBTZXRSZWN1cnNpb25MaW1pdCgpLgotICBpbnQgcmVjdXJzaW9uX2xpbWl0XzsKLQotICAvLyBTZWUgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoKS4KLSAgY29uc3QgRGVzY3JpcHRvclBvb2wqIGV4dGVuc2lvbl9wb29sXzsKLSAgTWVzc2FnZUZhY3RvcnkqIGV4dGVuc2lvbl9mYWN0b3J5XzsKLQotICAvLyBQcml2YXRlIG1lbWJlciBmdW5jdGlvbnMuCi0KLSAgLy8gQWR2YW5jZSB0aGUgYnVmZmVyIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgotICB2b2lkIEFkdmFuY2UoaW50IGFtb3VudCk7Ci0KLSAgLy8gQmFjayB1cCBpbnB1dF8gdG8gdGhlIGN1cnJlbnQgYnVmZmVyIHBvc2l0aW9uLgotICB2b2lkIEJhY2tVcElucHV0VG9DdXJyZW50UG9zaXRpb24oKTsKLQotICAvLyBSZWNvbXB1dGVzIHRoZSB2YWx1ZSBvZiBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8uICBNdXN0IGJlIGNhbGxlZCBhZnRlcgotICAvLyBjdXJyZW50X2xpbWl0XyBvciB0b3RhbF9ieXRlc19saW1pdF8gY2hhbmdlcy4KLSAgdm9pZCBSZWNvbXB1dGVCdWZmZXJMaW1pdHMoKTsKLQotICAvLyBXcml0ZXMgYW4gZXJyb3IgbWVzc2FnZSBzYXlpbmcgdGhhdCB3ZSBoaXQgdG90YWxfYnl0ZXNfbGltaXRfLgotICB2b2lkIFByaW50VG90YWxCeXRlc0xpbWl0RXJyb3IoKTsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGUgYnVmZmVyIHJ1bnMgb3V0IHRvIHJlcXVlc3QgbW9yZSBkYXRhLiAgSW1wbGllcyBhbgotICAvLyBBZHZhbmNlKEJ1ZmZlclNpemUoKSkuCi0gIGJvb2wgUmVmcmVzaCgpOwotCi0gIC8vIFdoZW4gcGFyc2luZyB2YXJpbnRzLCB3ZSBvcHRpbWl6ZSBmb3IgdGhlIGNvbW1vbiBjYXNlIG9mIHNtYWxsIHZhbHVlcywgYW5kCi0gIC8vIHRoZW4gb3B0aW1pemUgZm9yIHRoZSBjYXNlIHdoZW4gdGhlIHZhcmludCBmaXRzIHdpdGhpbiB0aGUgY3VycmVudCBidWZmZXIKLSAgLy8gcGllY2UuIFRoZSBGYWxsYmFjayBtZXRob2QgaXMgdXNlZCB3aGVuIHdlIGNhbid0IHVzZSB0aGUgb25lLWJ5dGUKLSAgLy8gb3B0aW1pemF0aW9uLiBUaGUgU2xvdyBtZXRob2QgaXMgeWV0IGFub3RoZXIgZmFsbGJhY2sgd2hlbiB0aGUgYnVmZmVyIGlzCi0gIC8vIG5vdCBsYXJnZSBlbm91Z2guIE1ha2luZyB0aGUgc2xvdyBwYXRoIG91dC1vZi1saW5lIHNwZWVkcyB1cCB0aGUgY29tbW9uCi0gIC8vIGNhc2UgYnkgMTAtMTUlLiBUaGUgc2xvdyBwYXRoIGlzIGZhaXJseSB1bmNvbW1vbjogaXQgb25seSB0cmlnZ2VycyB3aGVuIGEKLSAgLy8gbWVzc2FnZSBjcm9zc2VzIG11bHRpcGxlIGJ1ZmZlcnMuICBOb3RlOiBSZWFkVmFyaW50MzJGYWxsYmFjaygpIGFuZAotICAvLyBSZWFkVmFyaW50NjRGYWxsYmFjaygpIGFyZSBjYWxsZWQgZnJlcXVlbnRseSBhbmQgZ2VuZXJhbGx5IG5vdCBpbmxpbmVkLCBzbwotICAvLyB0aGV5IGhhdmUgYmVlbiBvcHRpbWl6ZWQgdG8gYXZvaWQgIm91dCIgcGFyYW1ldGVycy4gIFRoZSBmb3JtZXIgcmV0dXJucyAtMQotICAvLyBpZiBpdCBmYWlscyBhbmQgdGhlIHVpbnQzMiBpdCByZWFkIG90aGVyd2lzZS4gIFRoZSBsYXR0ZXIgaGFzIGEgYm9vbAotICAvLyBpbmRpY2F0aW5nIHN1Y2Nlc3Mgb3IgZmFpbHVyZSBhcyBwYXJ0IG9mIGl0cyByZXR1cm4gdHlwZS4KLSAgaW50NjQgUmVhZFZhcmludDMyRmFsbGJhY2sodWludDMyIGZpcnN0X2J5dGVfb3JfemVybyk7Ci0gIHN0ZDo6cGFpcjx1aW50NjQsIGJvb2w+IFJlYWRWYXJpbnQ2NEZhbGxiYWNrKCk7Ci0gIGJvb2wgUmVhZFZhcmludDMyU2xvdyh1aW50MzIqIHZhbHVlKTsKLSAgYm9vbCBSZWFkVmFyaW50NjRTbG93KHVpbnQ2NCogdmFsdWUpOwotICBib29sIFJlYWRMaXR0bGVFbmRpYW4zMkZhbGxiYWNrKHVpbnQzMiogdmFsdWUpOwotICBib29sIFJlYWRMaXR0bGVFbmRpYW42NEZhbGxiYWNrKHVpbnQ2NCogdmFsdWUpOwotICAvLyBGYWxsYmFjay9zbG93IG1ldGhvZHMgZm9yIHJlYWRpbmcgdGFncy4gVGhlc2UgZG8gbm90IHVwZGF0ZSBsYXN0X3RhZ18sCi0gIC8vIGJ1dCB3aWxsIHNldCBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyBpZiB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQKLSAgLy8gc3RyZWFtLgotICB1aW50MzIgUmVhZFRhZ0ZhbGxiYWNrKHVpbnQzMiBmaXJzdF9ieXRlX29yX3plcm8pOwotICB1aW50MzIgUmVhZFRhZ1Nsb3coKTsKLSAgYm9vbCBSZWFkU3RyaW5nRmFsbGJhY2soc3RyaW5nKiBidWZmZXIsIGludCBzaXplKTsKLQotICAvLyBSZXR1cm4gdGhlIHNpemUgb2YgdGhlIGJ1ZmZlci4KLSAgaW50IEJ1ZmZlclNpemUoKSBjb25zdDsKLQotICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0VG90YWxCeXRlc0xpbWl0ID0gNjQgPDwgMjA7ICAvLyA2NE1CCi0KLSAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFRvdGFsQnl0ZXNXYXJuaW5nVGhyZXNob2xkID0gMzIgPDwgMjA7ICAvLyAzMk1CCi0KLSAgc3RhdGljIGludCBkZWZhdWx0X3JlY3Vyc2lvbl9saW1pdF87ICAvLyAxMDAgYnkgZGVmYXVsdC4KLX07Ci0KLS8vIENsYXNzIHdoaWNoIGVuY29kZXMgYW5kIHdyaXRlcyBiaW5hcnkgZGF0YSB3aGljaCBpcyBjb21wb3NlZCBvZiB2YXJpbnQtCi0vLyBlbmNvZGVkIGludGVnZXJzIGFuZCBmaXhlZC13aWR0aCBwaWVjZXMuICBXcmFwcyBhIFplcm9Db3B5T3V0cHV0U3RyZWFtLgotLy8gTW9zdCB1c2VycyB3aWxsIG5vdCBuZWVkIHRvIGRlYWwgd2l0aCBDb2RlZE91dHB1dFN0cmVhbS4KLS8vCi0vLyBNb3N0IG1ldGhvZHMgb2YgQ29kZWRPdXRwdXRTdHJlYW0gd2hpY2ggcmV0dXJuIGEgYm9vbCByZXR1cm4gZmFsc2UgaWYgYW4KLS8vIHVuZGVybHlpbmcgSS9PIGVycm9yIG9jY3Vycy4gIE9uY2Ugc3VjaCBhIGZhaWx1cmUgb2NjdXJzLCB0aGUKLS8vIENvZGVkT3V0cHV0U3RyZWFtIGlzIGJyb2tlbiBhbmQgaXMgbm8gbG9uZ2VyIHVzZWZ1bC4gVGhlIFdyaXRlKiBtZXRob2RzIGRvCi0vLyBub3QgcmV0dXJuIHRoZSBzdHJlYW0gc3RhdHVzLCBidXQgd2lsbCBpbnZhbGlkYXRlIHRoZSBzdHJlYW0gaWYgYW4gZXJyb3IKLS8vIG9jY3Vycy4gVGhlIGNsaWVudCBjYW4gcHJvYmUgSGFkRXJyb3IoKSB0byBkZXRlcm1pbmUgdGhlIHN0YXR1cy4KLS8vCi0vLyBOb3RlIHRoYXQgZXZlcnkgbWV0aG9kIG9mIENvZGVkT3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlcyBzb21lIGRhdGEgaGFzCi0vLyBhIGNvcnJlc3BvbmRpbmcgc3RhdGljICJUb0FycmF5IiB2ZXJzaW9uLiBUaGVzZSB2ZXJzaW9ucyB3cml0ZSBkaXJlY3RseQotLy8gdG8gdGhlIHByb3ZpZGVkIGJ1ZmZlciwgcmV0dXJuaW5nIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KLS8vIFRoZXkgcmVxdWlyZSB0aGF0IHRoZSBidWZmZXIgaGFzIHN1ZmZpY2llbnQgY2FwYWNpdHkgZm9yIHRoZSBlbmNvZGVkIGRhdGEuCi0vLyBUaGlzIGFsbG93cyBhbiBvcHRpbWl6YXRpb24gd2hlcmUgd2UgY2hlY2sgaWYgYW4gb3V0cHV0IHN0cmVhbSBoYXMgZW5vdWdoCi0vLyBzcGFjZSBmb3IgYW4gZW50aXJlIG1lc3NhZ2UgYmVmb3JlIHdlIHN0YXJ0IHdyaXRpbmcgYW5kLCBpZiB0aGVyZSBpcywgd2UKLS8vIGNhbGwgb25seSB0aGUgVG9BcnJheSBtZXRob2RzIHRvIGF2b2lkIGRvaW5nIGJvdW5kIGNoZWNrcyBmb3IgZWFjaAotLy8gaW5kaXZpZHVhbCB2YWx1ZS4KLS8vIGkuZS4sIGluIHRoZSBleGFtcGxlIGFib3ZlOgotLy8KLS8vICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0ID0gbmV3IENvZGVkT3V0cHV0U3RyZWFtKHJhd19vdXRwdXQpOwotLy8gICBpbnQgbWFnaWNfbnVtYmVyID0gMTIzNDsKLS8vICAgY2hhciB0ZXh0W10gPSAiSGVsbG8gd29ybGQhIjsKLS8vCi0vLyAgIGludCBjb2RlZF9zaXplID0gc2l6ZW9mKG1hZ2ljX251bWJlcikgKwotLy8gICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoc3RybGVuKHRleHQpKSArCi0vLyAgICAgICAgICAgICAgICAgICAgc3RybGVuKHRleHQpOwotLy8KLS8vICAgdWludDgqIGJ1ZmZlciA9Ci0vLyAgICAgICBjb2RlZF9vdXRwdXQtPkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2UoY29kZWRfc2l6ZSk7Ci0vLyAgIGlmIChidWZmZXIgIT0gTlVMTCkgewotLy8gICAgIC8vIFRoZSBvdXRwdXQgc3RyZWFtIGhhcyBlbm91Z2ggc3BhY2UgaW4gdGhlIGJ1ZmZlcjogd3JpdGUgZGlyZWN0bHkgdG8KLS8vICAgICAvLyB0aGUgYXJyYXkuCi0vLyAgICAgYnVmZmVyID0gQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KG1hZ2ljX251bWJlciwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyKTsKLS8vICAgICBidWZmZXIgPSBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoc3RybGVuKHRleHQpLCBidWZmZXIpOwotLy8gICAgIGJ1ZmZlciA9IENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVJhd1RvQXJyYXkodGV4dCwgc3RybGVuKHRleHQpLCBidWZmZXIpOwotLy8gICB9IGVsc2UgewotLy8gICAgIC8vIE1ha2UgYm91bmQtY2hlY2tlZCB3cml0ZXMsIHdoaWNoIHdpbGwgYXNrIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBmb3IKLS8vICAgICAvLyBtb3JlIHNwYWNlIGFzIG5lZWRlZC4KLS8vICAgICBjb2RlZF9vdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIobWFnaWNfbnVtYmVyKTsKLS8vICAgICBjb2RlZF9vdXRwdXQtPldyaXRlVmFyaW50MzIoc3RybGVuKHRleHQpKTsKLS8vICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHRleHQsIHN0cmxlbih0ZXh0KSk7Ci0vLyAgIH0KLS8vCi0vLyAgIGRlbGV0ZSBjb2RlZF9vdXRwdXQ7Ci1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29kZWRPdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGFuIENvZGVkT3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBaZXJvQ29weU91dHB1dFN0cmVhbS4KLSAgZXhwbGljaXQgQ29kZWRPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCk7Ci0gIENvZGVkT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsIGJvb2wgZG9fZWFnZXJfcmVmcmVzaCk7Ci0KLSAgLy8gRGVzdHJveSB0aGUgQ29kZWRPdXRwdXRTdHJlYW0gYW5kIHBvc2l0aW9uIHRoZSB1bmRlcmx5aW5nCi0gIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbi4KLSAgfkNvZGVkT3V0cHV0U3RyZWFtKCk7Ci0KLSAgLy8gVHJpbXMgYW55IHVudXNlZCBzcGFjZSBpbiB0aGUgdW5kZXJseWluZyBidWZmZXIgc28gdGhhdCBpdHMgc2l6ZSBtYXRjaGVzCi0gIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGlzIHN0cmVhbS4gVGhlIHVuZGVybHlpbmcgYnVmZmVyIHdpbGwKLSAgLy8gYXV0b21hdGljYWxseSBiZSB0cmltbWVkIHdoZW4gdGhpcyBzdHJlYW0gaXMgZGVzdHJveWVkOyB0aGlzIGNhbGwgaXMgb25seQotICAvLyBuZWNlc3NhcnkgaWYgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIGFjY2Vzc2VkICpiZWZvcmUqIHRoZSBzdHJlYW0gaXMKLSAgLy8gZGVzdHJveWVkLgotICB2b2lkIFRyaW0oKTsKLQotICAvLyBTa2lwcyBhIG51bWJlciBvZiBieXRlcywgbGVhdmluZyB0aGUgYnl0ZXMgdW5tb2RpZmllZCBpbiB0aGUgdW5kZXJseWluZwotICAvLyBidWZmZXIuICBSZXR1cm5zIGZhbHNlIGlmIGFuIHVuZGVybHlpbmcgd3JpdGUgZXJyb3Igb2NjdXJzLiAgVGhpcyBpcwotICAvLyBtYWlubHkgdXNlZnVsIHdpdGggR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigpLgotICBib29sIFNraXAoaW50IGNvdW50KTsKLQotICAvLyBTZXRzICpkYXRhIHRvIHBvaW50IGRpcmVjdGx5IGF0IHRoZSB1bndyaXR0ZW4gcGFydCBvZiB0aGUKLSAgLy8gQ29kZWRPdXRwdXRTdHJlYW0ncyB1bmRlcmx5aW5nIGJ1ZmZlciwgYW5kICpzaXplIHRvIHRoZSBzaXplIG9mIHRoYXQKLSAgLy8gYnVmZmVyLCBidXQgZG9lcyBub3QgYWR2YW5jZSB0aGUgc3RyZWFtJ3MgY3VycmVudCBwb3NpdGlvbi4gIFRoaXMgd2lsbAotICAvLyBhbHdheXMgZWl0aGVyIHByb2R1Y2UgYSBub24tZW1wdHkgYnVmZmVyIG9yIHJldHVybiBmYWxzZS4gIElmIHRoZSBjYWxsZXIKLSAgLy8gd3JpdGVzIGFueSBkYXRhIHRvIHRoaXMgYnVmZmVyLCBpdCBzaG91bGQgdGhlbiBjYWxsIFNraXAoKSB0byBza2lwIG92ZXIKLSAgLy8gdGhlIGNvbnN1bWVkIGJ5dGVzLiAgVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgZXh0ZXJuYWwgZmFzdAotICAvLyBzZXJpYWxpemF0aW9uIHJvdXRpbmVzIGZvciB0eXBlcyBvZiBkYXRhIG5vdCBjb3ZlcmVkIGJ5IHRoZQotICAvLyBDb2RlZE91dHB1dFN0cmVhbSBpbnRlcmZhY2UuCi0gIGJvb2wgR2V0RGlyZWN0QnVmZmVyUG9pbnRlcih2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKLQotICAvLyBJZiB0aGVyZSBhcmUgYXQgbGVhc3QgInNpemUiIGJ5dGVzIGF2YWlsYWJsZSBpbiB0aGUgY3VycmVudCBidWZmZXIsCi0gIC8vIHJldHVybnMgYSBwb2ludGVyIGRpcmVjdGx5IGludG8gdGhlIGJ1ZmZlciBhbmQgYWR2YW5jZXMgb3ZlciB0aGVzZSBieXRlcy4KLSAgLy8gVGhlIGNhbGxlciBtYXkgdGhlbiB3cml0ZSBkaXJlY3RseSBpbnRvIHRoaXMgYnVmZmVyIChlLmcuIHVzaW5nIHRoZQotICAvLyAqVG9BcnJheSBzdGF0aWMgbWV0aG9kcykgcmF0aGVyIHRoYW4gZ28gdGhyb3VnaCBDb2RlZE91dHB1dFN0cmVhbS4gIElmCi0gIC8vIHRoZXJlIGFyZSBub3QgZW5vdWdoIGJ5dGVzIGF2YWlsYWJsZSwgcmV0dXJucyBOVUxMLiAgVGhlIHJldHVybiBwb2ludGVyIGlzCi0gIC8vIGludmFsaWRhdGVkIGFzIHNvb24gYXMgYW55IG90aGVyIG5vbi1jb25zdCBtZXRob2Qgb2YgQ29kZWRPdXRwdXRTdHJlYW0KLSAgLy8gaXMgY2FsbGVkLgotICBpbmxpbmUgdWludDgqIEdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2UoaW50IHNpemUpOwotCi0gIC8vIFdyaXRlIHJhdyBieXRlcywgY29weWluZyB0aGVtIGZyb20gdGhlIGdpdmVuIGJ1ZmZlci4KLSAgdm9pZCBXcml0ZVJhdyhjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplKTsKLSAgLy8gTGlrZSBXcml0ZVJhdygpICBidXQgd2lsbCB0cnkgdG8gd3JpdGUgYWxpYXNlZCBkYXRhIGlmIGFsaWFzaW5nIGlzCi0gIC8vIHR1cm5lZCBvbi4KLSAgdm9pZCBXcml0ZVJhd01heWJlQWxpYXNlZChjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7Ci0gIC8vIExpa2UgV3JpdGVSYXcoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KLSAgLy8gVGhpcyBpcyBfbm90XyBpbmxpbmVkLCBhcyB0aGUgY29tcGlsZXIgb2Z0ZW4gb3B0aW1pemVzIG1lbWNweSBpbnRvIGlubGluZQotICAvLyBjb3B5IGxvb3BzLiBTaW5jZSB0aGlzIGdldHMgY2FsbGVkIGJ5IGV2ZXJ5IGZpZWxkIHdpdGggc3RyaW5nIG9yIGJ5dGVzCi0gIC8vIHR5cGUsIGlubGluaW5nIG1heSBsZWFkIHRvIGEgc2lnbmlmaWNhbnQgYW1vdW50IG9mIGNvZGUgYmxvYXQsIHdpdGggb25seSBhCi0gIC8vIG1pbm9yIHBlcmZvcm1hbmNlIGdhaW4uCi0gIHN0YXRpYyB1aW50OCogV3JpdGVSYXdUb0FycmF5KGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUsIHVpbnQ4KiB0YXJnZXQpOwotCi0gIC8vIEVxdWl2YWxlbnQgdG8gV3JpdGVSYXcoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSkuCi0gIHZvaWQgV3JpdGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIpOwotICAvLyBMaWtlIFdyaXRlU3RyaW5nKCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCi0gIHN0YXRpYyB1aW50OCogV3JpdGVTdHJpbmdUb0FycmF5KGNvbnN0IHN0cmluZyYgc3RyLCB1aW50OCogdGFyZ2V0KTsKLSAgLy8gV3JpdGUgdGhlIHZhcmludC1lbmNvZGVkIHNpemUgb2Ygc3RyIGZvbGxvd2VkIGJ5IHN0ci4KLSAgc3RhdGljIHVpbnQ4KiBXcml0ZVN0cmluZ1dpdGhTaXplVG9BcnJheShjb25zdCBzdHJpbmcmIHN0ciwgdWludDgqIHRhcmdldCk7Ci0KLQotICAvLyBJbnN0cnVjdHMgdGhlIENvZGVkT3V0cHV0U3RyZWFtIHRvIGFsbG93IHRoZSB1bmRlcmx5aW5nCi0gIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtIHRvIGhvbGQgcG9pbnRlcnMgdG8gdGhlIG9yaWdpbmFsIHN0cnVjdHVyZSBpbnN0ZWFkIG9mCi0gIC8vIGNvcHlpbmcsIGlmIGl0IHN1cHBvcnRzIGl0IChpLmUuIG91dHB1dC0+QWxsb3dzQWxpYXNpbmcoKSBpcyB0cnVlKS4gIElmIHRoZQotICAvLyB1bmRlcmx5aW5nIHN0cmVhbSBkb2VzIG5vdCBzdXBwb3J0IGFsaWFzaW5nLCB0aGVuIGVuYWJsaW5nIGl0IGhhcyBubwotICAvLyBhZmZlY3QuICBGb3Igbm93LCB0aGlzIG9ubHkgYWZmZWN0cyB0aGUgYmVoYXZpb3Igb2YKLSAgLy8gV3JpdGVSYXdNYXliZUFsaWFzZWQoKS4KLSAgLy8KLSAgLy8gTk9URTogSXQgaXMgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGNodW5rIG9mIG1lbW9yeQotICAvLyByZW1haW5zIGxpdmUgdW50aWwgYWxsIG9mIHRoZSBkYXRhIGhhcyBiZWVuIGNvbnN1bWVkIGZyb20gdGhlIHN0cmVhbS4KLSAgdm9pZCBFbmFibGVBbGlhc2luZyhib29sIGVuYWJsZWQpOwotCi0gIC8vIFdyaXRlIGEgMzItYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlci4KLSAgdm9pZCBXcml0ZUxpdHRsZUVuZGlhbjMyKHVpbnQzMiB2YWx1ZSk7Ci0gIC8vIExpa2UgV3JpdGVMaXR0bGVFbmRpYW4zMigpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgotICBzdGF0aWMgdWludDgqIFdyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCk7Ci0gIC8vIFdyaXRlIGEgNjQtYml0IGxpdHRsZS1lbmRpYW4gaW50ZWdlci4KLSAgdm9pZCBXcml0ZUxpdHRsZUVuZGlhbjY0KHVpbnQ2NCB2YWx1ZSk7Ci0gIC8vIExpa2UgV3JpdGVMaXR0bGVFbmRpYW42NCgpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgotICBzdGF0aWMgdWludDgqIFdyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KHVpbnQ2NCB2YWx1ZSwgdWludDgqIHRhcmdldCk7Ci0KLSAgLy8gV3JpdGUgYW4gdW5zaWduZWQgaW50ZWdlciB3aXRoIFZhcmludCBlbmNvZGluZy4gIFdyaXRpbmcgYSAzMi1iaXQgdmFsdWUKLSAgLy8gaXMgZXF1aXZhbGVudCB0byBjYXN0aW5nIGl0IHRvIHVpbnQ2NCBhbmQgd3JpdGluZyBpdCBhcyBhIDY0LWJpdCB2YWx1ZSwKLSAgLy8gYnV0IG1heSBiZSBtb3JlIGVmZmljaWVudC4KLSAgdm9pZCBXcml0ZVZhcmludDMyKHVpbnQzMiB2YWx1ZSk7Ci0gIC8vIExpa2UgV3JpdGVWYXJpbnQzMigpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgotICBzdGF0aWMgdWludDgqIFdyaXRlVmFyaW50MzJUb0FycmF5KHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCk7Ci0gIC8vIFdyaXRlIGFuIHVuc2lnbmVkIGludGVnZXIgd2l0aCBWYXJpbnQgZW5jb2RpbmcuCi0gIHZvaWQgV3JpdGVWYXJpbnQ2NCh1aW50NjQgdmFsdWUpOwotICAvLyBMaWtlIFdyaXRlVmFyaW50NjQoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KLSAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDY0VG9BcnJheSh1aW50NjQgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpOwotCi0gIC8vIEVxdWl2YWxlbnQgdG8gV3JpdGVWYXJpbnQzMigpIGV4Y2VwdCB3aGVuIHRoZSB2YWx1ZSBpcyBuZWdhdGl2ZSwKLSAgLy8gaW4gd2hpY2ggY2FzZSBpdCBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gYSBmdWxsIDEwIGJ5dGVzLgotICB2b2lkIFdyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQoaW50MzIgdmFsdWUpOwotICAvLyBMaWtlIFdyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KLSAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkVG9BcnJheShpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCk7Ci0KLSAgLy8gVGhpcyBpcyBpZGVudGljYWwgdG8gV3JpdGVWYXJpbnQzMigpLCBidXQgb3B0aW1pemVkIGZvciB3cml0aW5nIHRhZ3MuCi0gIC8vIEluIHBhcnRpY3VsYXIsIGlmIHRoZSBpbnB1dCBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgdGhpcyBtZXRob2QKLSAgLy8gY29tcGlsZXMgZG93biB0byBhIGNvdXBsZSBpbnN0cnVjdGlvbnMuCi0gIC8vIEFsd2F5cyBpbmxpbmUgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGFmb3JtZW50aW9uZWQgb3B0aW1pemF0aW9uIGNhbid0IHdvcmssCi0gIC8vIGJ1dCBHQ0MgYnkgZGVmYXVsdCBkb2Vzbid0IHdhbnQgdG8gaW5saW5lIHRoaXMuCi0gIHZvaWQgV3JpdGVUYWcodWludDMyIHZhbHVlKTsKLSAgLy8gTGlrZSBXcml0ZVRhZygpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgotICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgc3RhdGljIHVpbnQ4KiBXcml0ZVRhZ1RvQXJyYXkodWludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KTsKLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSB0aGUgZ2l2ZW4gdmFsdWUgYXMgYSB2YXJpbnQuCi0gIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyKHVpbnQzMiB2YWx1ZSk7Ci0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHZhcmludC4KLSAgc3RhdGljIGludCBWYXJpbnRTaXplNjQodWludDY0IHZhbHVlKTsKLQotICAvLyBJZiBuZWdhdGl2ZSwgMTAgYnl0ZXMuICBPdGhlcml3c2UsIHNhbWUgYXMgVmFyaW50U2l6ZTMyKCkuCi0gIHN0YXRpYyBpbnQgVmFyaW50U2l6ZTMyU2lnbkV4dGVuZGVkKGludDMyIHZhbHVlKTsKLQotICAvLyBDb21waWxlLXRpbWUgZXF1aXZhbGVudCBvZiBWYXJpbnRTaXplMzIoKS4KLSAgdGVtcGxhdGUgPHVpbnQzMiBWYWx1ZT4KLSAgc3RydWN0IFN0YXRpY1ZhcmludFNpemUzMiB7Ci0gICAgc3RhdGljIGNvbnN0IGludCB2YWx1ZSA9Ci0gICAgICAgIChWYWx1ZSA8ICgxIDw8IDcpKQotICAgICAgICAgICAgPyAxCi0gICAgICAgICAgICA6IChWYWx1ZSA8ICgxIDw8IDE0KSkKLSAgICAgICAgICAgICAgICA/IDIKLSAgICAgICAgICAgICAgICA6IChWYWx1ZSA8ICgxIDw8IDIxKSkKLSAgICAgICAgICAgICAgICAgICAgPyAzCi0gICAgICAgICAgICAgICAgICAgIDogKFZhbHVlIDwgKDEgPDwgMjgpKQotICAgICAgICAgICAgICAgICAgICAgICAgPyA0Ci0gICAgICAgICAgICAgICAgICAgICAgICA6IDU7Ci0gIH07Ci0KLSAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCi0gIGlubGluZSBpbnQgQnl0ZUNvdW50KCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZXJlIHdhcyBhbiB1bmRlcmx5aW5nIEkvTyBlcnJvciBzaW5jZSB0aGlzIG9iamVjdCB3YXMKLSAgLy8gY3JlYXRlZC4KLSAgYm9vbCBIYWRFcnJvcigpIGNvbnN0IHsgcmV0dXJuIGhhZF9lcnJvcl87IH0KLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlZE91dHB1dFN0cmVhbSk7Ci0KLSAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dF87Ci0gIHVpbnQ4KiBidWZmZXJfOwotICBpbnQgYnVmZmVyX3NpemVfOwotICBpbnQgdG90YWxfYnl0ZXNfOyAgLy8gU3VtIG9mIHNpemVzIG9mIGFsbCBidWZmZXJzIHNlZW4gc28gZmFyLgotICBib29sIGhhZF9lcnJvcl87ICAgLy8gV2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgb3V0cHV0LgotICBib29sIGFsaWFzaW5nX2VuYWJsZWRfOyAgLy8gU2VlIEVuYWJsZUFsaWFzaW5nKCkuCi0KLSAgLy8gQWR2YW5jZSB0aGUgYnVmZmVyIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgotICB2b2lkIEFkdmFuY2UoaW50IGFtb3VudCk7Ci0KLSAgLy8gQ2FsbGVkIHdoZW4gdGhlIGJ1ZmZlciBydW5zIG91dCB0byByZXF1ZXN0IG1vcmUgZGF0YS4gIEltcGxpZXMgYW4KLSAgLy8gQWR2YW5jZShidWZmZXJfc2l6ZV8pLgotICBib29sIFJlZnJlc2goKTsKLQotICAvLyBMaWtlIFdyaXRlUmF3KCkgYnV0IG1heSBhdm9pZCBjb3B5aW5nIGlmIHRoZSB1bmRlcmx5aW5nCi0gIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtIHN1cHBvcnRzIGl0LgotICB2b2lkIFdyaXRlQWxpYXNlZFJhdyhjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplKTsKLQotICAvLyBJZiB0aGlzIHdyaXRlIG1pZ2h0IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgd2UgY29tcG9zZSB0aGUgYnl0ZXMgZmlyc3QKLSAgLy8gdGhlbiB1c2UgV3JpdGVSYXcoKS4KLSAgdm9pZCBXcml0ZVZhcmludDMyU2xvd1BhdGgodWludDMyIHZhbHVlKTsKLQotICAvLyBBbHdheXMtaW5saW5lZCB2ZXJzaW9ucyBvZiBXcml0ZVZhcmludCogZnVuY3Rpb25zIHNvIHRoYXQgY29kZSBjYW4gYmUKLSAgLy8gcmV1c2VkLCB3aGlsZSBzdGlsbCBjb250cm9sbGluZyBzaXplLiBGb3IgaW5zdGFuY2UsIFdyaXRlVmFyaW50MzJUb0FycmF5KCkKLSAgLy8gc2hvdWxkIG5vdCBkaXJlY3RseSBjYWxsIHRoaXM6IHNpbmNlIGl0IGlzIGlubGluZWQgaXRzZWxmLCBkb2luZyBzbwotICAvLyB3b3VsZCBncmVhdGx5IGluY3JlYXNlIHRoZSBzaXplIG9mIGdlbmVyYXRlZCBjb2RlLiBJbnN0ZWFkLCBpdCBzaG91bGQgY2FsbAotICAvLyBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5LiAgTWVhbndoaWxlLCBXcml0ZVZhcmludDMyKCkgaXMgYWxyZWFkeQotICAvLyBvdXQtb2YtbGluZSwgc28gaXQgc2hvdWxkIGp1c3QgaW52b2tlIHRoaXMgZGlyZWN0bHkgdG8gYXZvaWQgYW55IGV4dHJhCi0gIC8vIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgdWludDgqIFdyaXRlVmFyaW50NjRUb0FycmF5SW5saW5lKAotICAgICAgdWludDY0IHZhbHVlLCB1aW50OCogdGFyZ2V0KTsKLQotICBzdGF0aWMgaW50IFZhcmludFNpemUzMkZhbGxiYWNrKHVpbnQzMiB2YWx1ZSk7Ci19OwotCi0vLyBpbmxpbmUgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBUaGUgdmFzdCBtYWpvcml0eSBvZiB2YXJpbnRzIGFyZSBvbmx5IG9uZSBieXRlLiAgVGhlc2UgaW5saW5lCi0vLyBtZXRob2RzIG9wdGltaXplIGZvciB0aGF0IGNhc2UuCi0KLWlubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRWYXJpbnQzMih1aW50MzIqIHZhbHVlKSB7Ci0gIHVpbnQzMiB2ID0gMDsKLSAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSkgewotICAgIHYgPSAqYnVmZmVyXzsKLSAgICBpZiAodiA8IDB4ODApIHsKLSAgICAgICp2YWx1ZSA9IHY7Ci0gICAgICBBZHZhbmNlKDEpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIGludDY0IHJlc3VsdCA9IFJlYWRWYXJpbnQzMkZhbGxiYWNrKHYpOwotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHJlc3VsdCk7Ci0gIHJldHVybiByZXN1bHQgPj0gMDsKLX0KLQotaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDY0KHVpbnQ2NCogdmFsdWUpIHsKLSAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiAqYnVmZmVyXyA8IDB4ODApIHsKLSAgICAqdmFsdWUgPSAqYnVmZmVyXzsKLSAgICBBZHZhbmNlKDEpOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHN0ZDo6cGFpcjx1aW50NjQsIGJvb2w+IHAgPSBSZWFkVmFyaW50NjRGYWxsYmFjaygpOwotICAqdmFsdWUgPSBwLmZpcnN0OwotICByZXR1cm4gcC5zZWNvbmQ7Ci19Ci0KLS8vIHN0YXRpYwotaW5saW5lIGNvbnN0IHVpbnQ4KiBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoCi0gICAgY29uc3QgdWludDgqIGJ1ZmZlciwKLSAgICB1aW50MzIqIHZhbHVlKSB7Ci0jaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQotICBtZW1jcHkodmFsdWUsIGJ1ZmZlciwgc2l6ZW9mKCp2YWx1ZSkpOwotICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7Ci0jZWxzZQotICAqdmFsdWUgPSAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMF0pICAgICAgKSB8Ci0gICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclsxXSkgPDwgIDgpIHwKLSAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzJdKSA8PCAxNikgfAotICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbM10pIDw8IDI0KTsKLSAgcmV0dXJuIGJ1ZmZlciArIHNpemVvZigqdmFsdWUpOwotI2VuZGlmCi19Ci0vLyBzdGF0aWMKLWlubGluZSBjb25zdCB1aW50OCogQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KAotICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCi0gICAgdWludDY0KiB2YWx1ZSkgewotI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKLSAgbWVtY3B5KHZhbHVlLCBidWZmZXIsIHNpemVvZigqdmFsdWUpKTsKLSAgcmV0dXJuIGJ1ZmZlciArIHNpemVvZigqdmFsdWUpOwotI2Vsc2UKLSAgdWludDMyIHBhcnQwID0gKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzBdKSAgICAgICkgfAotICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMV0pIDw8ICA4KSB8Ci0gICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlclsyXSkgPDwgMTYpIHwKLSAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzNdKSA8PCAyNCk7Ci0gIHVpbnQzMiBwYXJ0MSA9IChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlcls0XSkgICAgICApIHwKLSAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQzMj4oYnVmZmVyWzVdKSA8PCAgOCkgfAotICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbNl0pIDw8IDE2KSB8Ci0gICAgICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50MzI+KGJ1ZmZlcls3XSkgPDwgMjQpOwotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50NjQ+KHBhcnQwKSB8Ci0gICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2ND4ocGFydDEpIDw8IDMyKTsKLSAgcmV0dXJuIGJ1ZmZlciArIHNpemVvZigqdmFsdWUpOwotI2VuZGlmCi19Ci0KLWlubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMih1aW50MzIqIHZhbHVlKSB7Ci0jaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQotICBpZiAoR09PR0xFX1BSRURJQ1RfVFJVRShCdWZmZXJTaXplKCkgPj0gc3RhdGljX2Nhc3Q8aW50PihzaXplb2YoKnZhbHVlKSkpKSB7Ci0gICAgbWVtY3B5KHZhbHVlLCBidWZmZXJfLCBzaXplb2YoKnZhbHVlKSk7Ci0gICAgQWR2YW5jZShzaXplb2YoKnZhbHVlKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFJlYWRMaXR0bGVFbmRpYW4zMkZhbGxiYWNrKHZhbHVlKTsKLSAgfQotI2Vsc2UKLSAgcmV0dXJuIFJlYWRMaXR0bGVFbmRpYW4zMkZhbGxiYWNrKHZhbHVlKTsKLSNlbmRpZgotfQotCi1pbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuNjQodWludDY0KiB2YWx1ZSkgewotI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKLSAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoQnVmZmVyU2l6ZSgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKCp2YWx1ZSkpKSkgewotICAgIG1lbWNweSh2YWx1ZSwgYnVmZmVyXywgc2l6ZW9mKCp2YWx1ZSkpOwotICAgIEFkdmFuY2Uoc2l6ZW9mKCp2YWx1ZSkpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBSZWFkTGl0dGxlRW5kaWFuNjRGYWxsYmFjayh2YWx1ZSk7Ci0gIH0KLSNlbHNlCi0gIHJldHVybiBSZWFkTGl0dGxlRW5kaWFuNjRGYWxsYmFjayh2YWx1ZSk7Ci0jZW5kaWYKLX0KLQotaW5saW5lIHVpbnQzMiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnKCkgewotICB1aW50MzIgdiA9IDA7Ci0gIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKGJ1ZmZlcl8gPCBidWZmZXJfZW5kXykpIHsKLSAgICB2ID0gKmJ1ZmZlcl87Ci0gICAgaWYgKHYgPCAweDgwKSB7Ci0gICAgICBsYXN0X3RhZ18gPSB2OwotICAgICAgQWR2YW5jZSgxKTsKLSAgICAgIHJldHVybiB2OwotICAgIH0KLSAgfQotICBsYXN0X3RhZ18gPSBSZWFkVGFnRmFsbGJhY2sodik7Ci0gIHJldHVybiBsYXN0X3RhZ187Ci19Ci0KLWlubGluZSBzdGQ6OnBhaXI8dWludDMyLCBib29sPiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnV2l0aEN1dG9mZigKLSAgICB1aW50MzIgY3V0b2ZmKSB7Ci0gIC8vIEluIHBlcmZvcm1hbmNlLXNlbnNpdGl2ZSBjb2RlIHdlIGNhbiBleHBlY3QgY3V0b2ZmIHRvIGJlIGEgY29tcGlsZS10aW1lCi0gIC8vIGNvbnN0YW50LCBhbmQgdGhpbmdzIGxpa2UgImN1dG9mZiA+PSBrTWF4MUJ5dGVWYXJpbnQiIHRvIGJlIGV2YWx1YXRlZCBhdAotICAvLyBjb21waWxlIHRpbWUuCi0gIHVpbnQzMiBmaXJzdF9ieXRlX29yX3plcm8gPSAwOwotICBpZiAoR09PR0xFX1BSRURJQ1RfVFJVRShidWZmZXJfIDwgYnVmZmVyX2VuZF8pKSB7Ci0gICAgLy8gSG90IGNhc2U6IGJ1ZmZlcl8gbm9uX2VtcHR5LCBidWZmZXJfWzBdIGluIFsxLCAxMjgpLgotICAgIC8vIFRPRE8oZ3Bpa2UpOiBJcyBpdCB3b3J0aCByZWFycmFuZ2luZyB0aGlzPyBFLmcuLCBpZiB0aGUgbnVtYmVyIG9mIGZpZWxkcwotICAgIC8vIGlzIGxhcmdlIGVub3VnaCB0aGVuIGlzIGl0IGJldHRlciB0byBjaGVjayBmb3IgdGhlIHR3by1ieXRlIGNhc2UgZmlyc3Q/Ci0gICAgZmlyc3RfYnl0ZV9vcl96ZXJvID0gYnVmZmVyX1swXTsKLSAgICBpZiAoc3RhdGljX2Nhc3Q8aW50OD4oYnVmZmVyX1swXSkgPiAwKSB7Ci0gICAgICBjb25zdCB1aW50MzIga01heDFCeXRlVmFyaW50ID0gMHg3ZjsKLSAgICAgIHVpbnQzMiB0YWcgPSBsYXN0X3RhZ18gPSBidWZmZXJfWzBdOwotICAgICAgQWR2YW5jZSgxKTsKLSAgICAgIHJldHVybiBzdGQ6Om1ha2VfcGFpcih0YWcsIGN1dG9mZiA+PSBrTWF4MUJ5dGVWYXJpbnQgfHwgdGFnIDw9IGN1dG9mZik7Ci0gICAgfQotICAgIC8vIE90aGVyIGhvdCBjYXNlOiBjdXRvZmYgPj0gMHg4MCwgYnVmZmVyXyBoYXMgYXQgbGVhc3QgdHdvIGJ5dGVzIGF2YWlsYWJsZSwKLSAgICAvLyBhbmQgdGFnIGlzIHR3byBieXRlcy4gIFRoZSBsYXR0ZXIgaXMgdGVzdGVkIGJ5IGJpdHdpc2UtYW5kLW5vdCBvZiB0aGUKLSAgICAvLyBmaXJzdCBieXRlIGFuZCB0aGUgc2Vjb25kIGJ5dGUuCi0gICAgaWYgKGN1dG9mZiA+PSAweDgwICYmCi0gICAgICAgIEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyArIDEgPCBidWZmZXJfZW5kXykgJiYKLSAgICAgICAgR09PR0xFX1BSRURJQ1RfVFJVRSgoYnVmZmVyX1swXSAmIH5idWZmZXJfWzFdKSA+PSAweDgwKSkgewotICAgICAgY29uc3QgdWludDMyIGtNYXgyQnl0ZVZhcmludCA9ICgweDdmIDw8IDcpICsgMHg3ZjsKLSAgICAgIHVpbnQzMiB0YWcgPSBsYXN0X3RhZ18gPSAoMXUgPDwgNykgKiBidWZmZXJfWzFdICsgKGJ1ZmZlcl9bMF0gLSAweDgwKTsKLSAgICAgIEFkdmFuY2UoMik7Ci0gICAgICAvLyBJdCBtaWdodCBtYWtlIHNlbnNlIHRvIHRlc3QgZm9yIHRhZyA9PSAwIG5vdywgYnV0IGl0IGlzIHNvIHJhcmUgdGhhdAotICAgICAgLy8gdGhhdCB3ZSBkb24ndCBib3RoZXIuICBBIHZhcmludC1lbmNvZGVkIDAgc2hvdWxkIGJlIG9uZSBieXRlIHVubGVzcwotICAgICAgLy8gdGhlIGVuY29kZXIgbG9zdCBpdHMgbWluZC4gIFRoZSBzZWNvbmQgcGFydCBvZiB0aGUgcmV0dXJuIHZhbHVlIG9mCi0gICAgICAvLyB0aGlzIGZ1bmN0aW9uIGlzIGFsbG93ZWQgdG8gYmUgZWl0aGVyIHRydWUgb3IgZmFsc2UgaWYgdGhlIHRhZyBpcyAwLAotICAgICAgLy8gc28gd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBmb3IgdGFnID09IDAuICBXZSBtYXkgbmVlZCB0byBjaGVjayB3aGV0aGVyCi0gICAgICAvLyBpdCBleGNlZWRzIGN1dG9mZi4KLSAgICAgIGJvb2wgYXRfb3JfYmVsb3dfY3V0b2ZmID0gY3V0b2ZmID49IGtNYXgyQnl0ZVZhcmludCB8fCB0YWcgPD0gY3V0b2ZmOwotICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRhZywgYXRfb3JfYmVsb3dfY3V0b2ZmKTsKLSAgICB9Ci0gIH0KLSAgLy8gU2xvdyBwYXRoCi0gIGxhc3RfdGFnXyA9IFJlYWRUYWdGYWxsYmFjayhmaXJzdF9ieXRlX29yX3plcm8pOwotICByZXR1cm4gc3RkOjptYWtlX3BhaXIobGFzdF90YWdfLCBzdGF0aWNfY2FzdDx1aW50MzI+KGxhc3RfdGFnXyAtIDEpIDwgY3V0b2ZmKTsKLX0KLQotaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6TGFzdFRhZ1dhcyh1aW50MzIgZXhwZWN0ZWQpIHsKLSAgcmV0dXJuIGxhc3RfdGFnXyA9PSBleHBlY3RlZDsKLX0KLQotaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgewotICByZXR1cm4gbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF87Ci19Ci0KLWlubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZyh1aW50MzIgZXhwZWN0ZWQpIHsKLSAgaWYgKGV4cGVjdGVkIDwgKDEgPDwgNykpIHsKLSAgICBpZiAoR09PR0xFX1BSRURJQ1RfVFJVRShidWZmZXJfIDwgYnVmZmVyX2VuZF8pICYmIGJ1ZmZlcl9bMF0gPT0gZXhwZWN0ZWQpIHsKLSAgICAgIEFkdmFuY2UoMSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfSBlbHNlIGlmIChleHBlY3RlZCA8ICgxIDw8IDE0KSkgewotICAgIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKEJ1ZmZlclNpemUoKSA+PSAyKSAmJgotICAgICAgICBidWZmZXJfWzBdID09IHN0YXRpY19jYXN0PHVpbnQ4PihleHBlY3RlZCB8IDB4ODApICYmCi0gICAgICAgIGJ1ZmZlcl9bMV0gPT0gc3RhdGljX2Nhc3Q8dWludDg+KGV4cGVjdGVkID4+IDcpKSB7Ci0gICAgICBBZHZhbmNlKDIpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgLy8gRG9uJ3QgYm90aGVyIG9wdGltaXppbmcgZm9yIGxhcmdlciB2YWx1ZXMuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWlubGluZSBjb25zdCB1aW50OCogQ29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KAotICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsIHVpbnQzMiBleHBlY3RlZCkgewotICBpZiAoZXhwZWN0ZWQgPCAoMSA8PCA3KSkgewotICAgIGlmIChidWZmZXJbMF0gPT0gZXhwZWN0ZWQpIHsKLSAgICAgIHJldHVybiBidWZmZXIgKyAxOwotICAgIH0KLSAgfSBlbHNlIGlmIChleHBlY3RlZCA8ICgxIDw8IDE0KSkgewotICAgIGlmIChidWZmZXJbMF0gPT0gc3RhdGljX2Nhc3Q8dWludDg+KGV4cGVjdGVkIHwgMHg4MCkgJiYKLSAgICAgICAgYnVmZmVyWzFdID09IHN0YXRpY19jYXN0PHVpbnQ4PihleHBlY3RlZCA+PiA3KSkgewotICAgICAgcmV0dXJuIGJ1ZmZlciArIDI7Ci0gICAgfQotICB9Ci0gIHJldHVybiBOVUxMOwotfQotCi1pbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpHZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKGNvbnN0IHZvaWQqKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQqIHNpemUpIHsKLSAgKmRhdGEgPSBidWZmZXJfOwotICAqc2l6ZSA9IHN0YXRpY19jYXN0PGludD4oYnVmZmVyX2VuZF8gLSBidWZmZXJfKTsKLX0KLQotaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0QXRFbmQoKSB7Ci0gIC8vIElmIHdlIGFyZSBhdCBhIGxpbWl0IHdlIGtub3cgbm8gbW9yZSBieXRlcyBjYW4gYmUgcmVhZC4gIE90aGVyd2lzZSwgaXQncwotICAvLyBoYXJkIHRvIHNheSB3aXRob3V0IGNhbGxpbmcgUmVmcmVzaCgpLCBhbmQgd2UnZCByYXRoZXIgbm90IGRvIHRoYXQuCi0KLSAgaWYgKGJ1ZmZlcl8gPT0gYnVmZmVyX2VuZF8gJiYKLSAgICAgICgoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfICE9IDApIHx8Ci0gICAgICAgKHRvdGFsX2J5dGVzX3JlYWRfID09IGN1cnJlbnRfbGltaXRfKSkpIHsKLSAgICBsYXN0X3RhZ18gPSAwOyAgICAgICAgICAgICAgICAgICAvLyBQcmV0ZW5kIHdlIGNhbGxlZCBSZWFkVGFnKCkuLi4KLSAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyA9IHRydWU7ICAvLyAuLi4gYW5kIGl0IGhpdCBFT0YuCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWlubGluZSBpbnQgQ29kZWRJbnB1dFN0cmVhbTo6Q3VycmVudFBvc2l0aW9uKCkgY29uc3QgewotICByZXR1cm4gdG90YWxfYnl0ZXNfcmVhZF8gLSAoQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKTsKLX0KLQotaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6R2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShpbnQgc2l6ZSkgewotICBpZiAoYnVmZmVyX3NpemVfIDwgc2l6ZSkgewotICAgIHJldHVybiBOVUxMOwotICB9IGVsc2UgewotICAgIHVpbnQ4KiByZXN1bHQgPSBidWZmZXJfOwotICAgIEFkdmFuY2Uoc2l6ZSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi1pbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh1aW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHdoaWxlICh2YWx1ZSA+PSAweDgwKSB7Ci0gICAgKnRhcmdldCA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSB8IDB4ODApOwotICAgIHZhbHVlID4+PSA3OwotICAgICsrdGFyZ2V0OwotICB9Ci0gICp0YXJnZXQgPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpOwotICByZXR1cm4gdGFyZ2V0ICsgMTsKLX0KLQotaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQoaW50MzIgdmFsdWUpIHsKLSAgaWYgKHZhbHVlIDwgMCkgewotICAgIFdyaXRlVmFyaW50NjQoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOwotICB9IGVsc2UgewotICAgIFdyaXRlVmFyaW50MzIoc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOwotICB9Ci19Ci0KLWlubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWRUb0FycmF5KAotICAgIGludDMyIHZhbHVlLCB1aW50OCogdGFyZ2V0KSB7Ci0gIGlmICh2YWx1ZSA8IDApIHsKLSAgICByZXR1cm4gV3JpdGVWYXJpbnQ2NFRvQXJyYXkoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSksIHRhcmdldCk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFdyaXRlVmFyaW50MzJUb0FycmF5KHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpLCB0YXJnZXQpOwotICB9Ci19Ci0KLWlubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHVpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCi0gIG1lbWNweSh0YXJnZXQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7Ci0jZWxzZQotICB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpOwotICB0YXJnZXRbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gIDgpOwotICB0YXJnZXRbMl0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gMTYpOwotICB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gMjQpOwotI2VuZGlmCi0gIHJldHVybiB0YXJnZXQgKyBzaXplb2YodmFsdWUpOwotfQotCi1pbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSh1aW50NjQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0jaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQotICBtZW1jcHkodGFyZ2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOwotI2Vsc2UKLSAgdWludDMyIHBhcnQwID0gc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSk7Ci0gIHVpbnQzMiBwYXJ0MSA9IHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUgPj4gMzIpOwotCi0gIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCk7Ci0gIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAgOCk7Ci0gIHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAxNik7Ci0gIHRhcmdldFszXSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MCA+PiAyNCk7Ci0gIHRhcmdldFs0XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSk7Ci0gIHRhcmdldFs1XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAgOCk7Ci0gIHRhcmdldFs2XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAxNik7Ci0gIHRhcmdldFs3XSA9IHN0YXRpY19jYXN0PHVpbnQ4PihwYXJ0MSA+PiAyNCk7Ci0jZW5kaWYKLSAgcmV0dXJuIHRhcmdldCArIHNpemVvZih2YWx1ZSk7Ci19Ci0KLWlubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyKHVpbnQzMiB2YWx1ZSkgewotICBpZiAoYnVmZmVyX3NpemVfID49IDUpIHsKLSAgICAvLyBGYXN0IHBhdGg6ICBXZSBoYXZlIGVub3VnaCBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIgdG8gZ3VhcmFudGVlIHRoYXQKLSAgICAvLyB0aGlzIHdyaXRlIHdvbid0IGNyb3NzIHRoZSBlbmQsIHNvIHdlIGNhbiBza2lwIHRoZSBjaGVja3MuCi0gICAgdWludDgqIHRhcmdldCA9IGJ1ZmZlcl87Ci0gICAgdWludDgqIGVuZCA9IFdyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotICAgIGludCBzaXplID0gc3RhdGljX2Nhc3Q8aW50PihlbmQgLSB0YXJnZXQpOwotICAgIEFkdmFuY2Uoc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgV3JpdGVWYXJpbnQzMlNsb3dQYXRoKHZhbHVlKTsKLSAgfQotfQotCi1pbmxpbmUgdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWcodWludDMyIHZhbHVlKSB7Ci0gIFdyaXRlVmFyaW50MzIodmFsdWUpOwotfQotCi1pbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZ1RvQXJyYXkoCi0gICAgdWludDMyIHZhbHVlLCB1aW50OCogdGFyZ2V0KSB7Ci0gIHJldHVybiBXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLQotaW5saW5lIGludCBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHVpbnQzMiB2YWx1ZSkgewotICBpZiAodmFsdWUgPCAoMSA8PCA3KSkgewotICAgIHJldHVybiAxOwotICB9IGVsc2UgIHsKLSAgICByZXR1cm4gVmFyaW50U2l6ZTMyRmFsbGJhY2sodmFsdWUpOwotICB9Ci19Ci0KLWlubGluZSBpbnQgQ29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMlNpZ25FeHRlbmRlZChpbnQzMiB2YWx1ZSkgewotICBpZiAodmFsdWUgPCAwKSB7Ci0gICAgcmV0dXJuIDEwOyAgICAgLy8gVE9ETyhrZW50b24pOiAgTWFrZSB0aGlzIGEgc3ltYm9saWMgY29uc3RhbnQuCi0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFZhcmludFNpemUzMihzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlKSk7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIFdyaXRlUmF3KHN0ci5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oc3RyLnNpemUoKSkpOwotfQotCi1pbmxpbmUgdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVSYXdNYXliZUFsaWFzZWQoCi0gICAgY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKLSAgaWYgKGFsaWFzaW5nX2VuYWJsZWRfKSB7Ci0gICAgV3JpdGVBbGlhc2VkUmF3KGRhdGEsIHNpemUpOwotICB9IGVsc2UgewotICAgIFdyaXRlUmF3KGRhdGEsIHNpemUpOwotICB9Ci19Ci0KLWlubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nVG9BcnJheSgKLSAgICBjb25zdCBzdHJpbmcmIHN0ciwgdWludDgqIHRhcmdldCkgewotICByZXR1cm4gV3JpdGVSYXdUb0FycmF5KHN0ci5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oc3RyLnNpemUoKSksIHRhcmdldCk7Ci19Ci0KLWlubGluZSBpbnQgQ29kZWRPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRvdGFsX2J5dGVzXyAtIGJ1ZmZlcl9zaXplXzsKLX0KLQotaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6QWR2YW5jZShpbnQgYW1vdW50KSB7Ci0gIGJ1ZmZlcl8gKz0gYW1vdW50OwotfQotCi1pbmxpbmUgdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6QWR2YW5jZShpbnQgYW1vdW50KSB7Ci0gIGJ1ZmZlcl8gKz0gYW1vdW50OwotICBidWZmZXJfc2l6ZV8gLT0gYW1vdW50OwotfQotCi1pbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpTZXRSZWN1cnNpb25MaW1pdChpbnQgbGltaXQpIHsKLSAgcmVjdXJzaW9uX2J1ZGdldF8gKz0gbGltaXQgLSByZWN1cnNpb25fbGltaXRfOwotICByZWN1cnNpb25fbGltaXRfID0gbGltaXQ7Ci19Ci0KLWlubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgewotICAtLXJlY3Vyc2lvbl9idWRnZXRfOwotICByZXR1cm4gcmVjdXJzaW9uX2J1ZGdldF8gPj0gMDsKLX0KLQotaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSB7Ci0gIGlmIChyZWN1cnNpb25fYnVkZ2V0XyA8IHJlY3Vyc2lvbl9saW1pdF8pICsrcmVjdXJzaW9uX2J1ZGdldF87Ci19Ci0KLWlubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgewotICBhc3NlcnQocmVjdXJzaW9uX2J1ZGdldF8gPCByZWN1cnNpb25fbGltaXRfKTsKLSAgKytyZWN1cnNpb25fYnVkZ2V0XzsKLX0KLQotaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6U2V0RXh0ZW5zaW9uUmVnaXN0cnkoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgewotICBleHRlbnNpb25fcG9vbF8gPSBwb29sOwotICBleHRlbnNpb25fZmFjdG9yeV8gPSBmYWN0b3J5OwotfQotCi1pbmxpbmUgY29uc3QgRGVzY3JpcHRvclBvb2wqIENvZGVkSW5wdXRTdHJlYW06OkdldEV4dGVuc2lvblBvb2woKSB7Ci0gIHJldHVybiBleHRlbnNpb25fcG9vbF87Ci19Ci0KLWlubGluZSBNZXNzYWdlRmFjdG9yeSogQ29kZWRJbnB1dFN0cmVhbTo6R2V0RXh0ZW5zaW9uRmFjdG9yeSgpIHsKLSAgcmV0dXJuIGV4dGVuc2lvbl9mYWN0b3J5XzsKLX0KLQotaW5saW5lIGludCBDb2RlZElucHV0U3RyZWFtOjpCdWZmZXJTaXplKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihidWZmZXJfZW5kXyAtIGJ1ZmZlcl8pOwotfQotCi1pbmxpbmUgQ29kZWRJbnB1dFN0cmVhbTo6Q29kZWRJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCkKLSAgOiBidWZmZXJfKE5VTEwpLAotICAgIGJ1ZmZlcl9lbmRfKE5VTEwpLAotICAgIGlucHV0XyhpbnB1dCksCi0gICAgdG90YWxfYnl0ZXNfcmVhZF8oMCksCi0gICAgb3ZlcmZsb3dfYnl0ZXNfKDApLAotICAgIGxhc3RfdGFnXygwKSwKLSAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyhmYWxzZSksCi0gICAgYWxpYXNpbmdfZW5hYmxlZF8oZmFsc2UpLAotICAgIGN1cnJlbnRfbGltaXRfKGtpbnQzMm1heCksCi0gICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKDApLAotICAgIHRvdGFsX2J5dGVzX2xpbWl0XyhrRGVmYXVsdFRvdGFsQnl0ZXNMaW1pdCksCi0gICAgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfKGtEZWZhdWx0VG90YWxCeXRlc1dhcm5pbmdUaHJlc2hvbGQpLAotICAgIHJlY3Vyc2lvbl9idWRnZXRfKGRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XyksCi0gICAgcmVjdXJzaW9uX2xpbWl0XyhkZWZhdWx0X3JlY3Vyc2lvbl9saW1pdF8pLAotICAgIGV4dGVuc2lvbl9wb29sXyhOVUxMKSwKLSAgICBleHRlbnNpb25fZmFjdG9yeV8oTlVMTCkgewotICAvLyBFYWdlcmx5IFJlZnJlc2goKSBzbyBidWZmZXIgc3BhY2UgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgotICBSZWZyZXNoKCk7Ci19Ci0KLWlubGluZSBDb2RlZElucHV0U3RyZWFtOjpDb2RlZElucHV0U3RyZWFtKGNvbnN0IHVpbnQ4KiBidWZmZXIsIGludCBzaXplKQotICA6IGJ1ZmZlcl8oYnVmZmVyKSwKLSAgICBidWZmZXJfZW5kXyhidWZmZXIgKyBzaXplKSwKLSAgICBpbnB1dF8oTlVMTCksCi0gICAgdG90YWxfYnl0ZXNfcmVhZF8oc2l6ZSksCi0gICAgb3ZlcmZsb3dfYnl0ZXNfKDApLAotICAgIGxhc3RfdGFnXygwKSwKLSAgICBsZWdpdGltYXRlX21lc3NhZ2VfZW5kXyhmYWxzZSksCi0gICAgYWxpYXNpbmdfZW5hYmxlZF8oZmFsc2UpLAotICAgIGN1cnJlbnRfbGltaXRfKHNpemUpLAotICAgIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XygwKSwKLSAgICB0b3RhbF9ieXRlc19saW1pdF8oa0RlZmF1bHRUb3RhbEJ5dGVzTGltaXQpLAotICAgIHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXyhrRGVmYXVsdFRvdGFsQnl0ZXNXYXJuaW5nVGhyZXNob2xkKSwKLSAgICByZWN1cnNpb25fYnVkZ2V0XyhkZWZhdWx0X3JlY3Vyc2lvbl9saW1pdF8pLAotICAgIHJlY3Vyc2lvbl9saW1pdF8oZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfKSwKLSAgICBleHRlbnNpb25fcG9vbF8oTlVMTCksCi0gICAgZXh0ZW5zaW9uX2ZhY3RvcnlfKE5VTEwpIHsKLSAgLy8gTm90ZSB0aGF0IHNldHRpbmcgY3VycmVudF9saW1pdF8gPT0gc2l6ZSBpcyBpbXBvcnRhbnQgdG8gcHJldmVudCBzb21lCi0gIC8vIGNvZGUgcGF0aHMgZnJvbSB0cnlpbmcgdG8gYWNjZXNzIGlucHV0XyBhbmQgc2VnZmF1bHRpbmcuCi19Ci0KLWlubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OklzRmxhdCgpIGNvbnN0IHsKLSAgcmV0dXJuIGlucHV0XyA9PSBOVUxMOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW8KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi0KLSNpZiBfTVNDX1ZFUiA+PSAxMzAwICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCi0gICNwcmFnbWEgcnVudGltZV9jaGVja3MoImMiLCByZXN0b3JlKQotI2VuZGlmICAvLyBfTVNDX1ZFUiAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTViMDZlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oCisrKyAvZGV2L251bGwKQEAgLTEsOTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogamFzb25oQGdvb2dsZS5jb20gKEphc29uIEhzdWVoKQotLy8KLS8vIEltcGxlbWVudHMgbWV0aG9kcyBvZiBjb2RlZF9zdHJlYW0uaCB0aGF0IG5lZWQgdG8gYmUgaW5saW5lZCBmb3IgcGVyZm9ybWFuY2UKLS8vIHJlYXNvbnMsIGJ1dCBzaG91bGQgbm90IGJlIGRlZmluZWQgaW4gYSBwdWJsaWMgaGVhZGVyLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSU5MX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fQ09ERURfU1RSRUFNX0lOTF9IX18KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbyB7Ci0KLWlubGluZSBib29sIENvZGVkSW5wdXRTdHJlYW06OkludGVybmFsUmVhZFN0cmluZ0lubGluZShzdHJpbmcqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgewotICBpZiAoc2l6ZSA8IDApIHJldHVybiBmYWxzZTsgIC8vIHNlY3VyaXR5OiBzaXplIGlzIG9mdGVuIHVzZXItc3VwcGxpZWQKLQotICBpZiAoQnVmZmVyU2l6ZSgpID49IHNpemUpIHsKLSAgICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKGJ1ZmZlciwgc2l6ZSk7Ci0gICAgc3RkOjpwYWlyPGNoYXIqLCBib29sPiB6ID0gYXNfc3RyaW5nX2RhdGEoYnVmZmVyKTsKLSAgICBpZiAoei5zZWNvbmQpIHsKLSAgICAgIC8vIE9kZGx5IGVub3VnaCwgbWVtY3B5KCkgcmVxdWlyZXMgaXRzIGZpcnN0IHR3byBhcmdzIHRvIGJlIG5vbi1OVUxMIGV2ZW4KLSAgICAgIC8vIGlmIHdlIGNvcHkgMCBieXRlcy4gIFNvLCB3ZSBoYXZlIGVuc3VyZWQgdGhhdCB6LmZpcnN0IGlzIG5vbi1OVUxMIGhlcmUuCi0gICAgICBHT09HTEVfRENIRUNLKHouZmlyc3QgIT0gTlVMTCk7Ci0gICAgICBtZW1jcHkoei5maXJzdCwgYnVmZmVyXywgc2l6ZSk7Ci0gICAgICBBZHZhbmNlKHNpemUpOwotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIHJldHVybiBSZWFkU3RyaW5nRmFsbGJhY2soYnVmZmVyLCBzaXplKTsKLX0KLQotaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6SW50ZXJuYWxSZWFkUmF3SW5saW5lKHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKLSAgaW50IGN1cnJlbnRfYnVmZmVyX3NpemU7Ci0gIHdoaWxlICgoY3VycmVudF9idWZmZXJfc2l6ZSA9IEJ1ZmZlclNpemUoKSkgPCBzaXplKSB7Ci0gICAgLy8gUmVhZGluZyBwYXN0IGVuZCBvZiBidWZmZXIuICBDb3B5IHdoYXQgd2UgaGF2ZSwgdGhlbiByZWZyZXNoLgotICAgIG1lbWNweShidWZmZXIsIGJ1ZmZlcl8sIGN1cnJlbnRfYnVmZmVyX3NpemUpOwotICAgIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihidWZmZXIpICsgY3VycmVudF9idWZmZXJfc2l6ZTsKLSAgICBzaXplIC09IGN1cnJlbnRfYnVmZmVyX3NpemU7Ci0gICAgQWR2YW5jZShjdXJyZW50X2J1ZmZlcl9zaXplKTsKLSAgICBpZiAoIVJlZnJlc2goKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgbWVtY3B5KGJ1ZmZlciwgYnVmZmVyXywgc2l6ZSk7Ci0gIEFkdmFuY2Uoc2l6ZSk7Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9JT19DT0RFRF9TVFJFQU1fSU5MX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTgxMDhlNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEzODUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0ZXN0cyBhbmQgYmVuY2htYXJrcy4KLQotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotCi0KLS8vIFRoaXMgZGVjbGFyZXMgYW4gdW5zaWduZWQgbG9uZyBsb25nIGludGVnZXIgbGl0ZXJhbCBpbiBhIHBvcnRhYmxlIHdheS4KLS8vIChUaGUgb3JpZ2luYWwgbWFjcm8gaXMgd2F5IHRvbyBiaWcgYW5kIHJ1aW5zIG15IGZvcm1hdHRpbmcuKQotI3VuZGVmIFVMTAotI2RlZmluZSBVTEwoeCkgR09PR0xFX1VMT05HTE9ORyh4KQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotbmFtZXNwYWNlIHsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRGF0YS1Ecml2ZW4gVGVzdCBJbmZyYXN0cnVjdHVyZQotCi0vLyBURVNUXzFEIGFuZCBURVNUXzJEIGFyZSBtYWNyb3MgSSdkIGV2ZW50dWFsbHkgbGlrZSB0byBzZWUgYWRkZWQgdG8KLS8vIGdUZXN0LiAgVGhlc2UgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUgdGVzdHMgd2hpY2ggc2hvdWxkIGJlCi0vLyBydW4gbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yIGVhY2ggaXRlbSBpbiBzb21lIGlucHV0IGFycmF5LiAgVEVTVF8xRAotLy8gdGVzdHMgYWxsIGNhc2VzIGluIGEgc2luZ2xlIGlucHV0IGFycmF5LiAgVEVTVF8yRCB0ZXN0cyBhbGwKLS8vIGNvbWJpbmF0aW9ucyBvZiBjYXNlcyBmcm9tIHR3byBhcnJheXMuICBUaGUgYXJyYXlzIG11c3QgYmUgc3RhdGljYWxseQotLy8gZGVmaW5lZCBzdWNoIHRoYXQgdGhlIEdPT0dMRV9BUlJBWVNJWkUoKSBtYWNybyB3b3JrcyBvbiB0aGVtLiAgRXhhbXBsZToKLS8vCi0vLyBpbnQga0Nhc2VzW10gPSB7MSwgMiwgMywgNH0KLS8vIFRFU1RfMUQoTXlGaXh0dXJlLCBNeVRlc3QsIGtDYXNlcykgewotLy8gICBFWFBFQ1RfR1Qoa0Nhc2VzX2Nhc2UsIDApOwotLy8gfQotLy8KLS8vIFRoaXMgdGVzdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBudW1iZXJzIDEsIDIsIDMsIGFuZCA0IGFuZCB0ZXN0cyB0aGF0Ci0vLyB0aGV5IGFyZSBhbGwgZ3JhdGVyIHRoYW4gemVyby4gIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIGV4YWN0IGNhc2UKLS8vIHdoaWNoIGZhaWxlZCB3aWxsIGJlIHByaW50ZWQuICBUaGUgY2FzZSB0eXBlIG11c3QgYmUgcHJpbnRhYmxlIHVzaW5nCi0vLyBvc3RyZWFtOjpvcGVyYXRvcjw8LgotCi0vLyBUT0RPKGtlbnRvbik6ICBnVGVzdCBub3cgc3VwcG9ydHMgInBhcmFtZXRlcml6ZWQgdGVzdHMiIHdoaWNoIHdvdWxkIGJlCi0vLyAgIGEgYmV0dGVyIHdheSB0byBhY2NvbXBsaXNoIHRoaXMuICBSZXdyaXRlIHdoZW4gdGltZSBwZXJtaXRzLgotCi0jZGVmaW5lIFRFU1RfMUQoRklYVFVSRSwgTkFNRSwgQ0FTRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIEZJWFRVUkUjI18jI05BTUUjI19ERCA6IHB1YmxpYyBGSVhUVVJFIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdm9pZCBEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUmIENBU0VTIyNfY2FzZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRFU1RfRihGSVhUVVJFIyNfIyNOQU1FIyNfREQsIE5BTUUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICA8PCAjQ0FTRVMgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFU1tpXSk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRG9TaW5nbGVDYXNlKENBU0VTW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIEZJWFRVUkUjI18jI05BTUUjI19ERDo6RG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlJiBDQVNFUyMjX2Nhc2UpCi0KLSNkZWZpbmUgVEVTVF8yRChGSVhUVVJFLCBOQU1FLCBDQVNFUzEsIENBU0VTMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgRklYVFVSRSMjXyMjTkFNRSMjX0REIDogcHVibGljIEZJWFRVUkUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGUxLCB0eXBlbmFtZSBDYXNlVHlwZTI+ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b2lkIERvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZTEmIENBU0VTMSMjX2Nhc2UsICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXNlVHlwZTImIENBU0VTMiMjX2Nhc2UpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVEVTVF9GKEZJWFRVUkUjI18jI05BTUUjI19ERCwgTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMxKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMyKTsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIDw8ICNDQVNFUzEgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFUzFbaV0gPDwgIiwgIiAgICAgICAgICAgXAotICAgICAgICAgIDw8ICNDQVNFUzIgIiBjYXNlICMiIDw8IGogPDwgIjogIiA8PCBDQVNFUzJbal0pOyAgICAgICAgICAgICAgICAgXAotICAgICAgICBEb1NpbmdsZUNhc2UoQ0FTRVMxW2ldLCBDQVNFUzJbal0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGUxLCB0eXBlbmFtZSBDYXNlVHlwZTI+ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIEZJWFRVUkUjI18jI05BTUUjI19ERDo6RG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlMSYgQ0FTRVMxIyNfY2FzZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc2VUeXBlMiYgQ0FTRVMyIyNfY2FzZSkKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1jbGFzcyBDb2RlZFN0cmVhbVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICAvLyBIZWxwZXIgbWV0aG9kIHVzZWQgYnkgdGVzdHMgZm9yIGJ5dGVzIHdhcm5pbmcuIFNlZSBpbXBsZW1lbnRhdGlvbiBjb21tZW50Ci0gIC8vIGZvciBmdXJ0aGVyIGluZm9ybWF0aW9uLgotICBzdGF0aWMgdm9pZCBTZXR1cFRvdGFsQnl0ZXNMaW1pdFdhcm5pbmdUZXN0KAotICAgICAgaW50IHRvdGFsX2J5dGVzX2xpbWl0LCBpbnQgd2FybmluZ190aHJlc2hvbGQsCi0gICAgICB2ZWN0b3I8c3RyaW5nPiogb3V0X2Vycm9ycywgdmVjdG9yPHN0cmluZz4qIG91dF93YXJuaW5ncyk7Ci0KLSAgLy8gQnVmZmVyIHVzZWQgZHVyaW5nIG1vc3Qgb2YgdGhlIHRlc3RzLiBUaGlzIGFzc3VtZXMgdGVzdHMgcnVuIHNlcXVlbnRpYWxseS4KLSAgc3RhdGljIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDEwMjQgKiA2NDsKLSAgc3RhdGljIHVpbnQ4IGJ1ZmZlcl9ba0J1ZmZlclNpemVdOwotfTsKLQotdWludDggQ29kZWRTdHJlYW1UZXN0OjpidWZmZXJfW0NvZGVkU3RyZWFtVGVzdDo6a0J1ZmZlclNpemVdOwotCi0vLyBXZSB0ZXN0IGVhY2ggb3BlcmF0aW9uIG92ZXIgYSB2YXJpZXR5IG9mIGJsb2NrIHNpemVzIHRvIGluc3VyZSB0aGF0Ci0vLyB3ZSB0ZXN0IGNhc2VzIHdoZXJlIHJlYWRzIG9yIHdyaXRlcyBjcm9zcyBidWZmZXIgYm91bmRhcmllcywgY2FzZXMKLS8vIHdoZXJlIHRoZXkgZG9uJ3QsIGFuZCBjYXNlcyB3aGVyZSB0aGVyZSBpcyBzbyBtdWNoIGJ1ZmZlciBsZWZ0IHRoYXQKLS8vIHdlIGNhbiB1c2Ugc3BlY2lhbCBvcHRpbWl6ZWQgcGF0aHMgdGhhdCBkb24ndCB3b3JyeSBhYm91dCBib3VuZHMKLS8vIGNoZWNrcy4KLWNvbnN0IGludCBrQmxvY2tTaXplc1tdID0gezEsIDIsIDMsIDUsIDcsIDEzLCAzMiwgMTAyNH07Ci0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVmFyaW50IHRlc3RzLgotCi1zdHJ1Y3QgVmFyaW50Q2FzZSB7Ci0gIHVpbnQ4IGJ5dGVzWzEwXTsgICAgICAgICAgLy8gRW5jb2RlZCBieXRlcy4KLSAgaW50IHNpemU7ICAgICAgICAgICAgICAgICAvLyBFbmNvZGVkIHNpemUsIGluIGJ5dGVzLgotICB1aW50NjQgdmFsdWU7ICAgICAgICAgICAgIC8vIFBhcnNlZCB2YWx1ZS4KLX07Ci0KLWlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgVmFyaW50Q2FzZSYgYykgewotICByZXR1cm4gb3MgPDwgYy52YWx1ZTsKLX0KLQotVmFyaW50Q2FzZSBrVmFyaW50Q2FzZXNbXSA9IHsKLSAgLy8gMzItYml0IHZhbHVlcwotICB7ezB4MDB9ICAgICAgLCAxLCAwfSwKLSAge3sweDAxfSAgICAgICwgMSwgMX0sCi0gIHt7MHg3Zn0gICAgICAsIDEsIDEyN30sCi0gIHt7MHhhMiwgMHg3NH0sIDIsICgweDIyIDw8IDApIHwgKDB4NzQgPDwgNyl9LCAgICAgICAgICAvLyAxNDg4MgotICB7ezB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MGJ9LCA1LCAgICAgICAgICAgICAgICAgICAgLy8gMjk2MTQ4ODgzMAotICAgICgweDNlIDw8IDApIHwgKDB4NzcgPDwgNykgfCAoMHgxMiA8PCAxNCkgfCAoMHgwNCA8PCAyMSkgfAotICAgIChVTEwoMHgwYikgPDwgMjgpfSwKLQotICAvLyA2NC1iaXQKLSAge3sweGJlLCAweGY3LCAweDkyLCAweDg0LCAweDFifSwgNSwgICAgICAgICAgICAgICAgICAgIC8vIDcyNTY0NTYxMjYKLSAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAoVUxMKDB4MWIpIDw8IDI4KX0sCi0gIHt7MHg4MCwgMHhlNiwgMHhlYiwgMHg5YywgMHhjMywgMHhjOSwgMHhhNCwgMHg0OX0sIDgsICAvLyA0MTI1NjIwMjU4MDcxODMzNgotICAgICgweDAwIDw8IDApIHwgKDB4NjYgPDwgNykgfCAoMHg2YiA8PCAxNCkgfCAoMHgxYyA8PCAyMSkgfAotICAgIChVTEwoMHg0MykgPDwgMjgpIHwgKFVMTCgweDQ5KSA8PCAzNSkgfCAoVUxMKDB4MjQpIDw8IDQyKSB8Ci0gICAgKFVMTCgweDQ5KSA8PCA0OSl9LAotICAvLyAxMTk2NDM3ODMzMDk3ODczNTEzMQotICB7ezB4OWIsIDB4YTgsIDB4ZjksIDB4YzIsIDB4YmIsIDB4ZDYsIDB4ODAsIDB4ODUsIDB4YTYsIDB4MDF9LCAxMCwKLSAgICAoMHgxYiA8PCAwKSB8ICgweDI4IDw8IDcpIHwgKDB4NzkgPDwgMTQpIHwgKDB4NDIgPDwgMjEpIHwKLSAgICAoVUxMKDB4M2IpIDw8IDI4KSB8IChVTEwoMHg1NikgPDwgMzUpIHwgKFVMTCgweDAwKSA8PCA0MikgfAotICAgIChVTEwoMHgwNSkgPDwgNDkpIHwgKFVMTCgweDI2KSA8PCA1NikgfCAoVUxMKDB4MDEpIDw8IDYzKX0sCi19OwotCi1URVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFZhcmludDMyLCBrVmFyaW50Q2FzZXMsIGtCbG9ja1NpemVzKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSk7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gICAgdWludDMyIHZhbHVlOwotICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRWYXJpbnQzMigmdmFsdWUpKTsKLSAgICBFWFBFQ1RfRVEoc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSksIHZhbHVlKTsKLSAgfQotCi0gIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS5zaXplLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci19Ci0KLVRFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVGFnLCBrVmFyaW50Q2FzZXMsIGtCbG9ja1NpemVzKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSk7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gICAgdWludDMyIGV4cGVjdGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSk7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkX3ZhbHVlLCBjb2RlZF9pbnB1dC5SZWFkVGFnKCkpOwotCi0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuTGFzdFRhZ1dhcyhleHBlY3RlZF92YWx1ZSkpOwotICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5MYXN0VGFnV2FzKGV4cGVjdGVkX3ZhbHVlICsgMSkpOwotICB9Ci0KLSAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGlucHV0LkJ5dGVDb3VudCgpKTsKLX0KLQotLy8gVGhpcyBpcyB0aGUgcmVncmVzc2lvbiB0ZXN0IHRoYXQgdmVyaWZpZXMgdGhhdCB0aGVyZSBpcyBubyBpc3N1ZXMKLS8vIHdpdGggdGhlIGVtcHR5IGlucHV0IGJ1ZmZlcnMgaGFuZGxpbmcuCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBFbXB0eUlucHV0QmVmb3JlRW9zKSB7Ci0gIGNsYXNzIEluIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0gewotICAgcHVibGljOgotICAgIEluKCkgOiBjb3VudF8oMCkge30KLSAgIHByaXZhdGU6Ci0gICAgdmlydHVhbCBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgewotICAgICAgKmRhdGEgPSBOVUxMOwotICAgICAgKnNpemUgPSAwOwotICAgICAgcmV0dXJuIGNvdW50XysrIDwgMjsKLSAgICB9Ci0gICAgdmlydHVhbCB2b2lkIEJhY2tVcChpbnQgY291bnQpICB7Ci0gICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGVzdHMgbmV2ZXIgY2FsbCB0aGlzLiI7Ci0gICAgfQotICAgIHZpcnR1YWwgYm9vbCBTa2lwKGludCBjb3VudCkgewotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRlc3RzIG5ldmVyIGNhbGwgdGhpcy4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB2aXJ0dWFsIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIDA7IH0KLSAgICBpbnQgY291bnRfOwotICB9IGluOwotICBDb2RlZElucHV0U3RyZWFtIGlucHV0KCZpbik7Ci0gIGlucHV0LlJlYWRUYWcoKTsKLSAgRVhQRUNUX1RSVUUoaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOwotfQotCi1URVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgRXhwZWN0VGFnLCBrVmFyaW50Q2FzZXMpIHsKLSAgLy8gTGVhdmUgb25lIGJ5dGUgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyIHNvIHdlIGNhbiByZWFkIGl0Ci0gIC8vIHRvIGZvcmNlIHRoZSBmaXJzdCBidWZmZXIgdG8gYmUgbG9hZGVkLgotICBidWZmZXJfWzBdID0gJ1wwJzsKLSAgbWVtY3B5KGJ1ZmZlcl8gKyAxLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSk7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gICAgLy8gUmVhZCBvbmUgYnl0ZSB0byBmb3JjZSBjb2RlZF9pbnB1dC5SZWZpbGwoKSB0byBiZSBjYWxsZWQuICBPdGhlcndpc2UsCi0gICAgLy8gRXhwZWN0VGFnKCkgd2lsbCByZXR1cm4gYSBmYWxzZSBuZWdhdGl2ZS4KLSAgICB1aW50OCBkdW1teTsKLSAgICBjb2RlZF9pbnB1dC5SZWFkUmF3KCZkdW1teSwgMSk7Ci0gICAgRVhQRUNUX0VRKCh1aW50KSdcMCcsICh1aW50KWR1bW15KTsKLQotICAgIHVpbnQzMiBleHBlY3RlZF92YWx1ZSA9IHN0YXRpY19jYXN0PHVpbnQzMj4oa1ZhcmludENhc2VzX2Nhc2UudmFsdWUpOwotCi0gICAgLy8gRXhwZWN0VGFnKCkgcHJvZHVjZXMgZmFsc2UgbmVnYXRpdmVzIGZvciBsYXJnZSB2YWx1ZXMuCi0gICAgaWYgKGtWYXJpbnRDYXNlc19jYXNlLnNpemUgPD0gMikgewotICAgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkV4cGVjdFRhZyhleHBlY3RlZF92YWx1ZSArIDEpKTsKLSAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkV4cGVjdFRhZyhleHBlY3RlZF92YWx1ZSkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuRXhwZWN0VGFnKGV4cGVjdGVkX3ZhbHVlKSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGtWYXJpbnRDYXNlc19jYXNlLnNpemUgPD0gMikgewotICAgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS5zaXplICsgMSwgaW5wdXQuQnl0ZUNvdW50KCkpOwotICB9IGVsc2UgewotICAgIEVYUEVDVF9FUSgxLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci0gIH0KLX0KLQotVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIEV4cGVjdFRhZ0Zyb21BcnJheSwga1ZhcmludENhc2VzKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSk7Ci0KLSAgY29uc3QgdWludDMyIGV4cGVjdGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSk7Ci0KLSAgLy8gSWYgdGhlIGV4cGVjdGF0aW9uIHN1Y2NlZWRzLCBpdCBzaG91bGQgcmV0dXJuIGEgcG9pbnRlciBwYXN0IHRoZSB0YWcuCi0gIGlmIChrVmFyaW50Q2FzZXNfY2FzZS5zaXplIDw9IDIpIHsKLSAgICBFWFBFQ1RfVFJVRShOVUxMID09Ci0gICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KGJ1ZmZlcl8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3ZhbHVlICsgMSkpOwotICAgIEVYUEVDVF9UUlVFKGJ1ZmZlcl8gKyBrVmFyaW50Q2FzZXNfY2FzZS5zaXplID09Ci0gICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbTo6RXhwZWN0VGFnRnJvbUFycmF5KGJ1ZmZlcl8sIGV4cGVjdGVkX3ZhbHVlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgRVhQRUNUX1RSVUUoTlVMTCA9PQotICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZ0Zyb21BcnJheShidWZmZXJfLCBleHBlY3RlZF92YWx1ZSkpOwotICB9Ci19Ci0KLVRFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkVmFyaW50NjQsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKTsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOwotCi0gIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7Ci0KLSAgICB1aW50NjQgdmFsdWU7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFZhcmludDY0KCZ2YWx1ZSkpOwotICAgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSwgdmFsdWUpOwotICB9Ci0KLSAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGlucHV0LkJ5dGVDb3VudCgpKTsKLX0KLQotVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlVmFyaW50MzIsIGtWYXJpbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKLSAgaWYgKGtWYXJpbnRDYXNlc19jYXNlLnZhbHVlID4gVUxMKDB4MDAwMDAwMDBGRkZGRkZGRikpIHsKLSAgICAvLyBTa2lwIHRoaXMgdGVzdCBmb3IgdGhlIDY0LWJpdCB2YWx1ZXMuCi0gICAgcmV0dXJuOwotICB9Ci0KLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0KLSAgewotICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKLQotICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyKHN0YXRpY19jYXN0PHVpbnQzMj4oa1ZhcmludENhc2VzX2Nhc2UudmFsdWUpKTsKLSAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOwotCi0gICAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSk7Ci0gIH0KLQotICBFWFBFQ1RfRVEoa1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsCi0gICAgbWVtY21wKGJ1ZmZlcl8sIGtWYXJpbnRDYXNlc19jYXNlLmJ5dGVzLCBrVmFyaW50Q2FzZXNfY2FzZS5zaXplKSk7Ci19Ci0KLVRFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBXcml0ZVZhcmludDY0LCBrVmFyaW50Q2FzZXMsIGtCbG9ja1NpemVzKSB7Ci0gIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOwotCi0gIHsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dCk7Ci0KLSAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQ2NChrVmFyaW50Q2FzZXNfY2FzZS52YWx1ZSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX291dHB1dC5IYWRFcnJvcigpKTsKLQotICAgIEVYUEVDVF9FUShrVmFyaW50Q2FzZXNfY2FzZS5zaXplLCBjb2RlZF9vdXRwdXQuQnl0ZUNvdW50KCkpOwotICB9Ci0KLSAgRVhQRUNUX0VRKGtWYXJpbnRDYXNlc19jYXNlLnNpemUsIG91dHB1dC5CeXRlQ291bnQoKSk7Ci0gIEVYUEVDVF9FUSgwLAotICAgIG1lbWNtcChidWZmZXJfLCBrVmFyaW50Q2FzZXNfY2FzZS5ieXRlcywga1ZhcmludENhc2VzX2Nhc2Uuc2l6ZSkpOwotfQotCi0vLyBUaGlzIHRlc3QgY2F1c2VzIGdjYyAzLjMuNSAoYW5kIGVhcmxpZXI/KSB0byBnaXZlIHRoZSBjcnlwdGljIGVycm9yOgotLy8gICAic29ycnksIHVuaW1wbGVtZW50ZWQ6IGBtZXRob2RfY2FsbF9leHByJyBub3Qgc3VwcG9ydGVkIGJ5IGR1bXBfZXhwciIKLSNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMykKLQotaW50MzIga1NpZ25FeHRlbmRlZFZhcmludENhc2VzW10gPSB7Ci0gIDAsIDEsIC0xLCAxMjM3ODk0LCAtMzc4OTUxMzgKLX07Ci0KLVRFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBXcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkLAotICAgICAgICBrU2lnbkV4dGVuZGVkVmFyaW50Q2FzZXMsIGtCbG9ja1NpemVzKSB7Ci0gIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOwotCi0gIHsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dCk7Ci0KLSAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZChrU2lnbkV4dGVuZGVkVmFyaW50Q2FzZXNfY2FzZSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX291dHB1dC5IYWRFcnJvcigpKTsKLQotICAgIGlmIChrU2lnbkV4dGVuZGVkVmFyaW50Q2FzZXNfY2FzZSA8IDApIHsKLSAgICAgIEVYUEVDVF9FUSgxMCwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgRVhQRUNUX0xFKGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSwgNSk7Ci0gICAgfQotICB9Ci0KLSAgaWYgKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlIDwgMCkgewotICAgIEVYUEVDVF9FUSgxMCwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKLSAgfSBlbHNlIHsKLSAgICBFWFBFQ1RfTEUob3V0cHV0LkJ5dGVDb3VudCgpLCA1KTsKLSAgfQotCi0gIC8vIFJlYWQgdmFsdWUgYmFjayBpbiBhcyBhIHZhcmludDY0IGFuZCBpbnN1cmUgaXQgbWF0Y2hlcy4KLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOwotCi0gIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7Ci0KLSAgICB1aW50NjQgdmFsdWU7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFZhcmludDY0KCZ2YWx1ZSkpOwotCi0gICAgRVhQRUNUX0VRKGtTaWduRXh0ZW5kZWRWYXJpbnRDYXNlc19jYXNlLCBzdGF0aWNfY2FzdDxpbnQ2ND4odmFsdWUpKTsKLSAgfQotCi0gIEVYUEVDVF9FUShvdXRwdXQuQnl0ZUNvdW50KCksIGlucHV0LkJ5dGVDb3VudCgpKTsKLX0KLQotI2VuZGlmCi0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVmFyaW50IGZhaWx1cmUgdGVzdC4KLQotc3RydWN0IFZhcmludEVycm9yQ2FzZSB7Ci0gIHVpbnQ4IGJ5dGVzWzEyXTsKLSAgaW50IHNpemU7Ci0gIGJvb2wgY2FuX3BhcnNlOwotfTsKLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBWYXJpbnRFcnJvckNhc2UmIGMpIHsKLSAgcmV0dXJuIG9zIDw8ICJzaXplICIgPDwgYy5zaXplOwotfQotCi1jb25zdCBWYXJpbnRFcnJvckNhc2Uga1ZhcmludEVycm9yQ2FzZXNbXSA9IHsKLSAgLy8gQ29udHJvbCBjYXNlLiAgKEluc3VyZXMgdGhhdCB0aGVyZSBpc24ndCBzb21ldGhpbmcgZWxzZSB3cm9uZyB0aGF0Ci0gIC8vIG1ha2VzIHBhcnNpbmcgYWx3YXlzIGZhaWwuKQotICB7ezB4MDB9LCAxLCB0cnVlfSwKLQotICAvLyBObyBpbnB1dCBkYXRhLgotICB7e30sIDAsIGZhbHNlfSwKLQotICAvLyBJbnB1dCBlbmRzIHVuZXhwZWN0ZWRseS4KLSAge3sweGYwLCAweGFifSwgMiwgZmFsc2V9LAotCi0gIC8vIElucHV0IGVuZHMgdW5leHBlY3RlZGx5IGFmdGVyIDMyIGJpdHMuCi0gIHt7MHhmMCwgMHhhYiwgMHhjOSwgMHg5YSwgMHhmOCwgMHhiMn0sIDYsIGZhbHNlfSwKLQotICAvLyBMb25nZXIgdGhhbiAxMCBieXRlcy4KLSAge3sweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweGZmLCAweDAxfSwKLSAgIDExLCBmYWxzZX0sCi19OwotCi1URVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFZhcmludDMyRXJyb3IsIGtWYXJpbnRFcnJvckNhc2VzLCBrQmxvY2tTaXplcykgewotICBtZW1jcHkoYnVmZmVyXywga1ZhcmludEVycm9yQ2FzZXNfY2FzZS5ieXRlcywga1ZhcmludEVycm9yQ2FzZXNfY2FzZS5zaXplKTsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0gIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICB1aW50MzIgdmFsdWU7Ci0gIEVYUEVDVF9FUShrVmFyaW50RXJyb3JDYXNlc19jYXNlLmNhbl9wYXJzZSwgY29kZWRfaW5wdXQuUmVhZFZhcmludDMyKCZ2YWx1ZSkpOwotfQotCi1URVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFZhcmludDY0RXJyb3IsIGtWYXJpbnRFcnJvckNhc2VzLCBrQmxvY2tTaXplcykgewotICBtZW1jcHkoYnVmZmVyXywga1ZhcmludEVycm9yQ2FzZXNfY2FzZS5ieXRlcywga1ZhcmludEVycm9yQ2FzZXNfY2FzZS5zaXplKTsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBrVmFyaW50RXJyb3JDYXNlc19jYXNlLnNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0gIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICB1aW50NjQgdmFsdWU7Ci0gIEVYUEVDVF9FUShrVmFyaW50RXJyb3JDYXNlc19jYXNlLmNhbl9wYXJzZSwgY29kZWRfaW5wdXQuUmVhZFZhcmludDY0KCZ2YWx1ZSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBWYXJpbnRTaXplCi0KLXN0cnVjdCBWYXJpbnRTaXplQ2FzZSB7Ci0gIHVpbnQ2NCB2YWx1ZTsKLSAgaW50IHNpemU7Ci19OwotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IFZhcmludFNpemVDYXNlJiBjKSB7Ci0gIHJldHVybiBvcyA8PCBjLnZhbHVlOwotfQotCi1WYXJpbnRTaXplQ2FzZSBrVmFyaW50U2l6ZUNhc2VzW10gPSB7Ci0gIHswdSwgMX0sCi0gIHsxdSwgMX0sCi0gIHsxMjd1LCAxfSwKLSAgezEyOHUsIDJ9LAotICB7NzU4OTIzdSwgM30sCi0gIHs0MDAwMDAwMDAwdSwgNX0sCi0gIHtVTEwoNDEyNTYyMDI1ODA3MTgzMzYpLCA4fSwKLSAge1VMTCgxMTk2NDM3ODMzMDk3ODczNTEzMSksIDEwfSwKLX07Ci0KLVRFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBWYXJpbnRTaXplMzIsIGtWYXJpbnRTaXplQ2FzZXMpIHsKLSAgaWYgKGtWYXJpbnRTaXplQ2FzZXNfY2FzZS52YWx1ZSA+IDB4ZmZmZmZmZmZ1KSB7Ci0gICAgLy8gU2tpcCA2NC1iaXQgdmFsdWVzLgotICAgIHJldHVybjsKLSAgfQotCi0gIEVYUEVDVF9FUShrVmFyaW50U2l6ZUNhc2VzX2Nhc2Uuc2l6ZSwKLSAgICBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAotICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPihrVmFyaW50U2l6ZUNhc2VzX2Nhc2UudmFsdWUpKSk7Ci19Ci0KLVRFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBWYXJpbnRTaXplNjQsIGtWYXJpbnRTaXplQ2FzZXMpIHsKLSAgRVhQRUNUX0VRKGtWYXJpbnRTaXplQ2FzZXNfY2FzZS5zaXplLAotICAgIENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQoa1ZhcmludFNpemVDYXNlc19jYXNlLnZhbHVlKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZpeGVkLXNpemUgaW50IHRlc3RzCi0KLXN0cnVjdCBGaXhlZDMyQ2FzZSB7Ci0gIHVpbnQ4IGJ5dGVzW3NpemVvZih1aW50MzIpXTsgICAgICAgICAgLy8gRW5jb2RlZCBieXRlcy4KLSAgdWludDMyIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAvLyBQYXJzZWQgdmFsdWUuCi19OwotCi1zdHJ1Y3QgRml4ZWQ2NENhc2UgewotICB1aW50OCBieXRlc1tzaXplb2YodWludDY0KV07ICAgICAgICAgIC8vIEVuY29kZWQgYnl0ZXMuCi0gIHVpbnQ2NCB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgLy8gUGFyc2VkIHZhbHVlLgotfTsKLQotaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBGaXhlZDMyQ2FzZSYgYykgewotICByZXR1cm4gb3MgPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCBjLnZhbHVlIDw8IHN0ZDo6ZGVjOwotfQotCi1pbmxpbmUgc3RkOjpvc3RyZWFtJiBvcGVyYXRvcjw8KHN0ZDo6b3N0cmVhbSYgb3MsIGNvbnN0IEZpeGVkNjRDYXNlJiBjKSB7Ci0gIHJldHVybiBvcyA8PCAiMHgiIDw8IHN0ZDo6aGV4IDw8IGMudmFsdWUgPDwgc3RkOjpkZWM7Ci19Ci0KLUZpeGVkMzJDYXNlIGtGaXhlZDMyQ2FzZXNbXSA9IHsKLSAge3sweGVmLCAweGNkLCAweGFiLCAweDkwfSwgMHg5MGFiY2RlZnV9LAotICB7ezB4MTIsIDB4MzQsIDB4NTYsIDB4Nzh9LCAweDc4NTYzNDEydX0sCi19OwotCi1GaXhlZDY0Q2FzZSBrRml4ZWQ2NENhc2VzW10gPSB7Ci0gIHt7MHhlZiwgMHhjZCwgMHhhYiwgMHg5MCwgMHgxMiwgMHgzNCwgMHg1NiwgMHg3OH0sIFVMTCgweDc4NTYzNDEyOTBhYmNkZWYpfSwKLSAge3sweDExLCAweDIyLCAweDMzLCAweDQ0LCAweDU1LCAweDY2LCAweDc3LCAweDg4fSwgVUxMKDB4ODg3NzY2NTU0NDMzMjIxMSl9LAotfTsKLQotVEVTVF8yRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRMaXR0bGVFbmRpYW4zMiwga0ZpeGVkMzJDYXNlcywga0Jsb2NrU2l6ZXMpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDMyQ2FzZXNfY2FzZS5ieXRlcykpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0KLSAgewotICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICAgIHVpbnQzMiB2YWx1ZTsKLSAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7Ci0gICAgRVhQRUNUX0VRKGtGaXhlZDMyQ2FzZXNfY2FzZS52YWx1ZSwgdmFsdWUpOwotICB9Ci0KLSAgRVhQRUNUX0VRKHNpemVvZih1aW50MzIpLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci19Ci0KLVRFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkTGl0dGxlRW5kaWFuNjQsIGtGaXhlZDY0Q2FzZXMsIGtCbG9ja1NpemVzKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrRml4ZWQ2NENhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZihrRml4ZWQ2NENhc2VzX2Nhc2UuYnl0ZXMpKTsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOwotCi0gIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7Ci0KLSAgICB1aW50NjQgdmFsdWU7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjY0KCZ2YWx1ZSkpOwotICAgIEVYUEVDVF9FUShrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKLSAgfQotCi0gIEVYUEVDVF9FUShzaXplb2YodWludDY0KSwgaW5wdXQuQnl0ZUNvdW50KCkpOwotfQotCi1URVNUXzJEKENvZGVkU3RyZWFtVGVzdCwgV3JpdGVMaXR0bGVFbmRpYW4zMiwga0ZpeGVkMzJDYXNlcywga0Jsb2NrU2l6ZXMpIHsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0KLSAgewotICAgIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmb3V0cHV0KTsKLQotICAgIGNvZGVkX291dHB1dC5Xcml0ZUxpdHRsZUVuZGlhbjMyKGtGaXhlZDMyQ2FzZXNfY2FzZS52YWx1ZSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX291dHB1dC5IYWRFcnJvcigpKTsKLQotICAgIEVYUEVDVF9FUShzaXplb2YodWludDMyKSwgY29kZWRfb3V0cHV0LkJ5dGVDb3VudCgpKTsKLSAgfQotCi0gIEVYUEVDVF9FUShzaXplb2YodWludDMyKSwgb3V0cHV0LkJ5dGVDb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lbWNtcChidWZmZXJfLCBrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZih1aW50MzIpKSk7Ci19Ci0KLVRFU1RfMkQoQ29kZWRTdHJlYW1UZXN0LCBXcml0ZUxpdHRsZUVuZGlhbjY0LCBrRml4ZWQ2NENhc2VzLCBrQmxvY2tTaXplcykgewotICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICB7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOwotCi0gICAgY29kZWRfb3V0cHV0LldyaXRlTGl0dGxlRW5kaWFuNjQoa0ZpeGVkNjRDYXNlc19jYXNlLnZhbHVlKTsKLSAgICBFWFBFQ1RfRkFMU0UoY29kZWRfb3V0cHV0LkhhZEVycm9yKCkpOwotCi0gICAgRVhQRUNUX0VRKHNpemVvZih1aW50NjQpLCBjb2RlZF9vdXRwdXQuQnl0ZUNvdW50KCkpOwotICB9Ci0KLSAgRVhQRUNUX0VRKHNpemVvZih1aW50NjQpLCBvdXRwdXQuQnl0ZUNvdW50KCkpOwotICBFWFBFQ1RfRVEoMCwgbWVtY21wKGJ1ZmZlcl8sIGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKHVpbnQ2NCkpKTsKLX0KLQotLy8gVGVzdHMgdXNpbmcgdGhlIHN0YXRpYyBtZXRob2RzIHRvIHJlYWQgZml4ZWQtc2l6ZSB2YWx1ZXMgZnJvbSByYXcgYXJyYXlzLgotCi1URVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5LCBrRml4ZWQzMkNhc2VzKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMsIHNpemVvZihrRml4ZWQzMkNhc2VzX2Nhc2UuYnl0ZXMpKTsKLQotICB1aW50MzIgdmFsdWU7Ci0gIGNvbnN0IHVpbnQ4KiBlbmQgPSBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoCi0gICAgICBidWZmZXJfLCAmdmFsdWUpOwotICBFWFBFQ1RfRVEoa0ZpeGVkMzJDYXNlc19jYXNlLnZhbHVlLCB2YWx1ZSk7Ci0gIEVYUEVDVF9UUlVFKGVuZCA9PSBidWZmZXJfICsgc2l6ZW9mKHZhbHVlKSk7Ci19Ci0KLVRFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkTGl0dGxlRW5kaWFuNjRGcm9tQXJyYXksIGtGaXhlZDY0Q2FzZXMpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcywgc2l6ZW9mKGtGaXhlZDY0Q2FzZXNfY2FzZS5ieXRlcykpOwotCi0gIHVpbnQ2NCB2YWx1ZTsKLSAgY29uc3QgdWludDgqIGVuZCA9IENvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheSgKLSAgICAgIGJ1ZmZlcl8sICZ2YWx1ZSk7Ci0gIEVYUEVDVF9FUShrRml4ZWQ2NENhc2VzX2Nhc2UudmFsdWUsIHZhbHVlKTsKLSAgRVhQRUNUX1RSVUUoZW5kID09IGJ1ZmZlcl8gKyBzaXplb2YodmFsdWUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gUmF3IHJlYWRzIGFuZCB3cml0ZXMKLQotY29uc3QgY2hhciBrUmF3Qnl0ZXNbXSA9ICJTb21lIGJ5dGVzIHdoaWNoIHdpbGwgYmUgd3JpdHRlbiBhbmQgcmVhZCByYXcuIjsKLQotVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRSYXcsIGtCbG9ja1NpemVzKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOwotICBjaGFyIHJlYWRfYnVmZmVyW3NpemVvZihrUmF3Qnl0ZXMpXTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFJhdyhyZWFkX2J1ZmZlciwgc2l6ZW9mKGtSYXdCeXRlcykpKTsKLSAgICBFWFBFQ1RfRVEoMCwgbWVtY21wKGtSYXdCeXRlcywgcmVhZF9idWZmZXIsIHNpemVvZihrUmF3Qnl0ZXMpKSk7Ci0gIH0KLQotICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKLX0KLQotVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFdyaXRlUmF3LCBrQmxvY2tTaXplcykgewotICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICB7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOwotCi0gICAgY29kZWRfb3V0cHV0LldyaXRlUmF3KGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOwotICAgIEVYUEVDVF9GQUxTRShjb2RlZF9vdXRwdXQuSGFkRXJyb3IoKSk7Ci0KLSAgICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIGNvZGVkX291dHB1dC5CeXRlQ291bnQoKSk7Ci0gIH0KLQotICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIG91dHB1dC5CeXRlQ291bnQoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZW1jbXAoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSkpOwotfQotCi1URVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZywga0Jsb2NrU2l6ZXMpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0KLSAgewotICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICAgIHN0cmluZyBzdHI7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOwotICAgIEVYUEVDVF9FUShrUmF3Qnl0ZXMsIHN0cik7Ci0gIH0KLQotICBFWFBFQ1RfRVEoc3RybGVuKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKLX0KLQotLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIFJlYWRTdHJpbmcgZG9lc24ndCBjcmFzaCBvbiBpbXBvc3NpYmx5IGxhcmdlIHN0cmluZ3MuCi1URVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ0ltcG9zc2libHlMYXJnZSwga0Jsb2NrU2l6ZXMpIHsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOwotCi0gIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7Ci0KLSAgICBzdHJpbmcgc3RyOwotICAgIC8vIFRyeSB0byByZWFkIGEgZ2lnYWJ5dGUuCi0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOwotICB9Ci19Ci0KLVRFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdJbXBvc3NpYmx5TGFyZ2VGcm9tU3RyaW5nT25TdGFjaykgewotICAvLyBTYW1lIHRlc3QgYXMgYWJvdmUsIGV4Y2VwdCBkaXJlY3RseSB1c2UgYSBidWZmZXIuIFRoaXMgdXNlZCB0byBjYXVzZQotICAvLyBjcmFzaGVzIHdoaWxlIHRoZSBhYm92ZSBkaWQgbm90LgotICB1aW50OCBidWZmZXJbOF07Ci0gIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoYnVmZmVyLCA4KTsKLSAgc3RyaW5nIHN0cjsKLSAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOwotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nSW1wb3NzaWJseUxhcmdlRnJvbVN0cmluZ09uSGVhcCkgewotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8dWludDg+IGJ1ZmZlcihuZXcgdWludDhbOF0pOwotICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KGJ1ZmZlci5nZXQoKSwgOCk7Ci0gIHN0cmluZyBzdHI7Ci0gIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEgPDwgMzApKTsKLX0KLQotVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdSZXNlcnZlc01lbW9yeU9uVG90YWxMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0KLSAgewotICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLSAgICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoc2l6ZW9mKGtSYXdCeXRlcyksIHNpemVvZihrUmF3Qnl0ZXMpKTsKLSAgICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcyksIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7Ci0KLSAgICBzdHJpbmcgc3RyOwotICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKGtSYXdCeXRlcykpKTsKLSAgICBFWFBFQ1RfRVEoc2l6ZW9mKGtSYXdCeXRlcykgLSBzdHJsZW4oa1Jhd0J5dGVzKSwKLSAgICAgICAgICAgICAgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKLSAgICBFWFBFQ1RfRVEoa1Jhd0J5dGVzLCBzdHIpOwotICAgIC8vIFRPRE8obGl1amlzaSk6IFJlcGxhY2Ugd2l0aCBhIG1vcmUgbWVhbmluZ2Z1bCB0ZXN0IChzZWUgY2wvNjA5NjYwMjMpLgotICAgIEVYUEVDVF9HRShzdHIuY2FwYWNpdHkoKSwgc3RybGVuKGtSYXdCeXRlcykpOwotICB9Ci0KLSAgRVhQRUNUX0VRKHN0cmxlbihrUmF3Qnl0ZXMpLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci19Ci0KLVRFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nUmVzZXJ2ZXNNZW1vcnlPblB1c2hlZExpbWl0LCBrQmxvY2tTaXplcykgewotICBtZW1jcHkoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotICAgIGNvZGVkX2lucHV0LlB1c2hMaW1pdChzaXplb2YoYnVmZmVyXykpOwotCi0gICAgc3RyaW5nIHN0cjsKLSAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7Ci0gICAgRVhQRUNUX0VRKGtSYXdCeXRlcywgc3RyKTsKLSAgICAvLyBUT0RPKGxpdWppc2kpOiBSZXBsYWNlIHdpdGggYSBtb3JlIG1lYW5pbmdmdWwgdGVzdCAoc2VlIGNsLzYwOTY2MDIzKS4KLSAgICBFWFBFQ1RfR0Uoc3RyLmNhcGFjaXR5KCksIHN0cmxlbihrUmF3Qnl0ZXMpKTsKLSAgfQotCi0gIEVYUEVDVF9FUShzdHJsZW4oa1Jhd0J5dGVzKSwgaW5wdXQuQnl0ZUNvdW50KCkpOwotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvbklmTGltaXRzTm90U2V0KSB7Ci0gIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKLSAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAotICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCi0gIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCi0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7Ci0KLSAgewotICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICAgIHN0cmluZyBzdHI7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOwotICAgIEVYUEVDVF9FUShrUmF3Qnl0ZXMsIHN0cik7Ci0gICAgLy8gTm90ZTogdGhpcyBjaGVjayBkZXBlbmRzIG9uIHN0cmluZyBjbGFzcyBpbXBsZW1lbnRhdGlvbi4gSXQKLSAgICAvLyBleHBlY3RzIHRoYXQgc3RyaW5nIHdpbGwgYWxsb2NhdGUgbW9yZSB0aGFuIHN0cmxlbihrUmF3Qnl0ZXMpCi0gICAgLy8gaWYgdGhlIGNvbnRlbnQgb2Yga1Jhd0J5dGVzIGlzIGFwcGVuZGVkIHRvIHN0cmluZyBpbiBzbWFsbAotICAgIC8vIGNodW5rcy4KLSAgICAvLyBUT0RPKGxpdWppc2kpOiBSZXBsYWNlIHdpdGggYSBtb3JlIG1lYW5pbmdmdWwgdGVzdCAoc2VlIGNsLzYwOTY2MDIzKS4KLSAgICBFWFBFQ1RfR0Uoc3RyLmNhcGFjaXR5KCksIHN0cmxlbihrUmF3Qnl0ZXMpKTsKLSAgfQotCi0gIEVYUEVDVF9FUShzdHJsZW4oa1Jhd0J5dGVzKSwgaW5wdXQuQnl0ZUNvdW50KCkpOwotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvblNpemVJc05lZ2F0aXZlKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKLSAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAotICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCi0gIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCi0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7Ci0KLSAgewotICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLSAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoc2l6ZW9mKGJ1ZmZlcl8pKTsKLQotICAgIHN0cmluZyBzdHI7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgLTEpKTsKLSAgICAvLyBOb3RlOiB0aGlzIGNoZWNrIGRlcGVuZHMgb24gc3RyaW5nIGNsYXNzIGltcGxlbWVudGF0aW9uLiBJdAotICAgIC8vIGV4cGVjdHMgdGhhdCBzdHJpbmcgd2lsbCBhbHdheXMgYWxsb2NhdGUgdGhlIHNhbWUgYW1vdW50IG9mCi0gICAgLy8gbWVtb3J5IGZvciBhbiBlbXB0eSBzdHJpbmcuCi0gICAgRVhQRUNUX0VRKHN0cmluZygpLmNhcGFjaXR5KCksIHN0ci5jYXBhY2l0eSgpKTsKLSAgfQotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvblNpemVJc0xhcmdlKSB7Ci0gIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKLSAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAotICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCi0gIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCi0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7Ci0KLSAgewotICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLSAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoc2l6ZW9mKGJ1ZmZlcl8pKTsKLQotICAgIHN0cmluZyBzdHI7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSA8PCAzMCkpOwotICAgIEVYUEVDVF9HVCgxIDw8IDMwLCBzdHIuY2FwYWNpdHkoKSk7Ci0gIH0KLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ05vUmVzZXJ2YXRpb25TaXplSXNPdmVyVGhlTGltaXQpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOwotICAvLyBCdWZmZXIgc2l6ZSBpbiB0aGUgaW5wdXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKGtSYXdCeXRlcyksCi0gIC8vIG90aGVyd2lzZSBjaGVjayBhZ2FpbnN0IGNhcGFjaXR5IHdpbGwgZmFpbCBhcyBSZWFkU3RyaW5nSW5saW5lKCkKLSAgLy8gd2lsbCBoYW5kbGUgdGhlIHJlYWRpbmcgYW5kIHdpbGwgcmVzZXJ2ZSB0aGUgbWVtb3J5IGFzIG5lZWRlZC4KLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDMyKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotICAgIGNvZGVkX2lucHV0LlB1c2hMaW1pdCgxNik7Ci0KLSAgICBzdHJpbmcgc3RyOwotICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7Ci0gICAgLy8gTm90ZTogdGhpcyBjaGVjayBkZXBlbmRzIG9uIHN0cmluZyBjbGFzcyBpbXBsZW1lbnRhdGlvbi4gSXQKLSAgICAvLyBleHBlY3RzIHRoYXQgc3RyaW5nIHdpbGwgYWxsb2NhdGUgbGVzcyB0aGFuIHN0cmxlbihrUmF3Qnl0ZXMpCi0gICAgLy8gZm9yIGFuIGVtcHR5IHN0cmluZy4KLSAgICBFWFBFQ1RfR1Qoc3RybGVuKGtSYXdCeXRlcyksIHN0ci5jYXBhY2l0eSgpKTsKLSAgfQotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvblNpemVJc092ZXJUaGVUb3RhbEJ5dGVzTGltaXQpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOwotICAvLyBCdWZmZXIgc2l6ZSBpbiB0aGUgaW5wdXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKGtSYXdCeXRlcyksCi0gIC8vIG90aGVyd2lzZSBjaGVjayBhZ2FpbnN0IGNhcGFjaXR5IHdpbGwgZmFpbCBhcyBSZWFkU3RyaW5nSW5saW5lKCkKLSAgLy8gd2lsbCBoYW5kbGUgdGhlIHJlYWRpbmcgYW5kIHdpbGwgcmVzZXJ2ZSB0aGUgbWVtb3J5IGFzIG5lZWRlZC4KLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDMyKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotICAgIGNvZGVkX2lucHV0LlNldFRvdGFsQnl0ZXNMaW1pdCgxNiwgMTYpOwotCi0gICAgc3RyaW5nIHN0cjsKLSAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOwotICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgZGVwZW5kcyBvbiBzdHJpbmcgY2xhc3MgaW1wbGVtZW50YXRpb24uIEl0Ci0gICAgLy8gZXhwZWN0cyB0aGF0IHN0cmluZyB3aWxsIGFsbG9jYXRlIGxlc3MgdGhhbiBzdHJsZW4oa1Jhd0J5dGVzKQotICAgIC8vIGZvciBhbiBlbXB0eSBzdHJpbmcuCi0gICAgRVhQRUNUX0dUKHN0cmxlbihrUmF3Qnl0ZXMpLCBzdHIuY2FwYWNpdHkoKSk7Ci0gIH0KLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwKLSAgICAgICBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvblNpemVJc092ZXJUaGVDbG9zZXN0TGltaXRfR2xvYmFsTGltaXRJc0Nsb3NlcikgewotICBtZW1jcHkoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7Ci0gIC8vIEJ1ZmZlciBzaXplIGluIHRoZSBpbnB1dCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBzaXplb2Yoa1Jhd0J5dGVzKSwKLSAgLy8gb3RoZXJ3aXNlIGNoZWNrIGFnYWluc3QgY2FwYWNpdHkgd2lsbCBmYWlsIGFzIFJlYWRTdHJpbmdJbmxpbmUoKQotICAvLyB3aWxsIGhhbmRsZSB0aGUgcmVhZGluZyBhbmQgd2lsbCByZXNlcnZlIHRoZSBtZW1vcnkgYXMgbmVlZGVkLgotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgMzIpOwotCi0gIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7Ci0gICAgY29kZWRfaW5wdXQuUHVzaExpbWl0KHNpemVvZihidWZmZXJfKSk7Ci0gICAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KDE2LCAxNik7Ci0KLSAgICBzdHJpbmcgc3RyOwotICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7Ci0gICAgLy8gTm90ZTogdGhpcyBjaGVjayBkZXBlbmRzIG9uIHN0cmluZyBjbGFzcyBpbXBsZW1lbnRhdGlvbi4gSXQKLSAgICAvLyBleHBlY3RzIHRoYXQgc3RyaW5nIHdpbGwgYWxsb2NhdGUgbGVzcyB0aGFuIHN0cmxlbihrUmF3Qnl0ZXMpCi0gICAgLy8gZm9yIGFuIGVtcHR5IHN0cmluZy4KLSAgICBFWFBFQ1RfR1Qoc3RybGVuKGtSYXdCeXRlcyksIHN0ci5jYXBhY2l0eSgpKTsKLSAgfQotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LAotICAgICAgIFJlYWRTdHJpbmdOb1Jlc2VydmF0aW9uU2l6ZUlzT3ZlclRoZUNsb3Nlc3RMaW1pdF9Mb2NhbExpbWl0SXNDbG9zZXIpIHsKLSAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOwotICAvLyBCdWZmZXIgc2l6ZSBpbiB0aGUgaW5wdXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKGtSYXdCeXRlcyksCi0gIC8vIG90aGVyd2lzZSBjaGVjayBhZ2FpbnN0IGNhcGFjaXR5IHdpbGwgZmFpbCBhcyBSZWFkU3RyaW5nSW5saW5lKCkKLSAgLy8gd2lsbCBoYW5kbGUgdGhlIHJlYWRpbmcgYW5kIHdpbGwgcmVzZXJ2ZSB0aGUgbWVtb3J5IGFzIG5lZWRlZC4KLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDMyKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotICAgIGNvZGVkX2lucHV0LlB1c2hMaW1pdCgxNik7Ci0gICAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KHNpemVvZihidWZmZXJfKSwgc2l6ZW9mKGJ1ZmZlcl8pKTsKLSAgICBFWFBFQ1RfRVEoc2l6ZW9mKGJ1ZmZlcl8pLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkpOwotCi0gICAgc3RyaW5nIHN0cjsKLSAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOwotICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgZGVwZW5kcyBvbiBzdHJpbmcgY2xhc3MgaW1wbGVtZW50YXRpb24uIEl0Ci0gICAgLy8gZXhwZWN0cyB0aGF0IHN0cmluZyB3aWxsIGFsbG9jYXRlIGxlc3MgdGhhbiBzdHJsZW4oa1Jhd0J5dGVzKQotICAgIC8vIGZvciBhbiBlbXB0eSBzdHJpbmcuCi0gICAgRVhQRUNUX0dUKHN0cmxlbihrUmF3Qnl0ZXMpLCBzdHIuY2FwYWNpdHkoKSk7Ci0gIH0KLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTa2lwCi0KLWNvbnN0IGNoYXIga1NraXBUZXN0Qnl0ZXNbXSA9Ci0gICI8QmVmb3JlIHNraXBwaW5nPjxUbyBiZSBza2lwcGVkPjxBZnRlciBza2lwcGluZz4iOwotCi1URVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgU2tpcElucHV0LCBrQmxvY2tTaXplcykgewotICBtZW1jcHkoYnVmZmVyXywga1NraXBUZXN0Qnl0ZXMsIHNpemVvZihrU2tpcFRlc3RCeXRlcykpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0KLSAgewotICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICAgIHN0cmluZyBzdHI7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oIjxCZWZvcmUgc2tpcHBpbmc+IikpKTsKLSAgICBFWFBFQ1RfRVEoIjxCZWZvcmUgc2tpcHBpbmc+Iiwgc3RyKTsKLSAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKHN0cmxlbigiPFRvIGJlIHNraXBwZWQ+IikpKTsKLSAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbigiPEFmdGVyIHNraXBwaW5nPiIpKSk7Ci0gICAgRVhQRUNUX0VRKCI8QWZ0ZXIgc2tpcHBpbmc+Iiwgc3RyKTsKLSAgfQotCi0gIEVYUEVDVF9FUShzdHJsZW4oa1NraXBUZXN0Qnl0ZXMpLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEdldERpcmVjdEJ1ZmZlclBvaW50ZXIKLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklucHV0KSB7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCA4KTsKLSAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gIGNvbnN0IHZvaWQqIHB0cjsKLSAgaW50IHNpemU7Ci0KLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOwotICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKLSAgRVhQRUNUX0VRKDgsIHNpemUpOwotCi0gIC8vIFBlZWtpbmcgYWdhaW4gc2hvdWxkIHJldHVybiB0aGUgc2FtZSBwb2ludGVyLgotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7Ci0gIEVYUEVDVF9FUShidWZmZXJfLCBwdHIpOwotICBFWFBFQ1RfRVEoOCwgc2l6ZSk7Ci0KLSAgLy8gU2tpcCBmb3J3YXJkIGluIHRoZSBzYW1lIGJ1ZmZlciB0aGVuIHBlZWsgYWdhaW4uCi0gIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlNraXAoMykpOwotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5HZXREaXJlY3RCdWZmZXJQb2ludGVyKCZwdHIsICZzaXplKSk7Ci0gIEVYUEVDVF9FUShidWZmZXJfICsgMywgcHRyKTsKLSAgRVhQRUNUX0VRKDUsIHNpemUpOwotCi0gIC8vIFNraXAgdG8gZW5kIG9mIGJ1ZmZlciBhbmQgcGVlayAtLSBzaG91bGQgZ2V0IG5leHQgYnVmZmVyLgotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDUpKTsKLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOwotICBFWFBFQ1RfRVEoYnVmZmVyXyArIDgsIHB0cik7Ci0gIEVYUEVDVF9FUSg4LCBzaXplKTsKLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZUlucHV0KSB7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCA4KTsKLSAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gIGNvbnN0IHZvaWQqIHB0cjsKLSAgaW50IHNpemU7Ci0KLSAgY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZSgmcHRyLCAmc2l6ZSk7Ci0gIEVYUEVDVF9FUShidWZmZXJfLCBwdHIpOwotICBFWFBFQ1RfRVEoOCwgc2l6ZSk7Ci0KLSAgLy8gUGVla2luZyBhZ2FpbiBzaG91bGQgcmV0dXJuIHRoZSBzYW1lIHBvaW50ZXIuCi0gIGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoJnB0ciwgJnNpemUpOwotICBFWFBFQ1RfRVEoYnVmZmVyXywgcHRyKTsKLSAgRVhQRUNUX0VRKDgsIHNpemUpOwotCi0gIC8vIFNraXAgZm9yd2FyZCBpbiB0aGUgc2FtZSBidWZmZXIgdGhlbiBwZWVrIGFnYWluLgotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDMpKTsKLSAgY29kZWRfaW5wdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcklubGluZSgmcHRyLCAmc2l6ZSk7Ci0gIEVYUEVDVF9FUShidWZmZXJfICsgMywgcHRyKTsKLSAgRVhQRUNUX0VRKDUsIHNpemUpOwotCi0gIC8vIFNraXAgdG8gZW5kIG9mIGJ1ZmZlciBhbmQgcGVlayAtLSBzaG91bGQgcmV0dXJuIGZhbHNlIGFuZCBwcm92aWRlIGFuIGVtcHR5Ci0gIC8vIGJ1ZmZlci4gSXQgZG9lcyBub3QgdHJ5IHRvIFJlZnJlc2goKS4KLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuU2tpcCg1KSk7Ci0gIGNvZGVkX2lucHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXJJbmxpbmUoJnB0ciwgJnNpemUpOwotICBFWFBFQ1RfRVEoYnVmZmVyXyArIDgsIHB0cik7Ci0gIEVYUEVDVF9FUSgwLCBzaXplKTsKLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgR2V0RGlyZWN0QnVmZmVyUG9pbnRlck91dHB1dCkgewotICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCA4KTsKLSAgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXQpOwotCi0gIHZvaWQqIHB0cjsKLSAgaW50IHNpemU7Ci0KLSAgRVhQRUNUX1RSVUUoY29kZWRfb3V0cHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKLSAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7Ci0gIEVYUEVDVF9FUSg4LCBzaXplKTsKLQotICAvLyBQZWVraW5nIGFnYWluIHNob3VsZCByZXR1cm4gdGhlIHNhbWUgcG9pbnRlci4KLSAgRVhQRUNUX1RSVUUoY29kZWRfb3V0cHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKLSAgRVhQRUNUX0VRKGJ1ZmZlcl8sIHB0cik7Ci0gIEVYUEVDVF9FUSg4LCBzaXplKTsKLQotICAvLyBTa2lwIGZvcndhcmQgaW4gdGhlIHNhbWUgYnVmZmVyIHRoZW4gcGVlayBhZ2Fpbi4KLSAgRVhQRUNUX1RSVUUoY29kZWRfb3V0cHV0LlNraXAoMykpOwotICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOwotICBFWFBFQ1RfRVEoYnVmZmVyXyArIDMsIHB0cik7Ci0gIEVYUEVDVF9FUSg1LCBzaXplKTsKLQotICAvLyBTa2lwIHRvIGVuZCBvZiBidWZmZXIgYW5kIHBlZWsgLS0gc2hvdWxkIGdldCBuZXh0IGJ1ZmZlci4KLSAgRVhQRUNUX1RSVUUoY29kZWRfb3V0cHV0LlNraXAoNSkpOwotICBFWFBFQ1RfVFJVRShjb2RlZF9vdXRwdXQuR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigmcHRyLCAmc2l6ZSkpOwotICBFWFBFQ1RfRVEoYnVmZmVyXyArIDgsIHB0cik7Ci0gIEVYUEVDVF9FUSg4LCBzaXplKTsKLQotICAvLyBTa2lwIG92ZXIgbXVsdGlwbGUgYnVmZmVycy4KLSAgRVhQRUNUX1RSVUUoY29kZWRfb3V0cHV0LlNraXAoMjIpKTsKLSAgRVhQRUNUX1RSVUUoY29kZWRfb3V0cHV0LkdldERpcmVjdEJ1ZmZlclBvaW50ZXIoJnB0ciwgJnNpemUpKTsKLSAgRVhQRUNUX0VRKGJ1ZmZlcl8gKyAzMCwgcHRyKTsKLSAgRVhQRUNUX0VRKDIsIHNpemUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMaW1pdHMKLQotVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIEJhc2ljTGltaXQsIGtCbG9ja1NpemVzKSB7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gICAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoOCk7Ci0KLSAgICAvLyBSZWFkIHVudGlsIHdlIGhpdCB0aGUgbGltaXQuCi0gICAgdWludDMyIHZhbHVlOwotICAgIEVYUEVDVF9FUSg4LCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICAgIEVYUEVDVF9FUSg0LCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKLSAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOwotCi0gICAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQpOwotCi0gICAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICB9Ci0KLSAgRVhQRUNUX0VRKDEyLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci19Ci0KLS8vIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gd2UgcHVzaCB0d28gbGltaXRzIHdoZXJlIHRoZSBzZWNvbmQgKHRvcCkgb25lIGlzCi0vLyBzaG9ydGVyLgotVEVTVF8xRChDb2RlZFN0cmVhbVRlc3QsIFNtYWxsTGltaXRPblRvcE9mQmlnTGltaXQsIGtCbG9ja1NpemVzKSB7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gICAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQxID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KDgpOwotICAgIEVYUEVDVF9FUSg4LCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQyID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KDQpOwotCi0gICAgdWludDMyIHZhbHVlOwotCi0gICAgLy8gUmVhZCB1bnRpbCB3ZSBoaXQgbGltaXQyLCB0aGUgdG9wIGFuZCBzaG9ydGVzdCBsaW1pdC4KLSAgICBFWFBFQ1RfRVEoNCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOwotICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKLSAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOwotICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7Ci0gICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKLQotICAgIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0Mik7Ci0KLSAgICAvLyBSZWFkIHVudGlsIHdlIGhpdCBsaW1pdDEuCi0gICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKLSAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSk7Ci0gICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKLSAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0KLSAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdDEpOwotCi0gICAgLy8gTm8gbW9yZSBsaW1pdHMuCi0gICAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICB9Ci0KLSAgRVhQRUNUX0VRKDEyLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci19Ci0KLS8vIFRlc3Qgd2hhdCBoYXBwZW5zIHdoZW4gd2UgcHVzaCB0d28gbGltaXRzIHdoZXJlIHRoZSBzZWNvbmQgKHRvcCkgb25lIGlzCi0vLyBsb25nZXIuICBJbiB0aGlzIGNhc2UsIHRoZSB0b3AgbGltaXQgaXMgc2hvcnRlbmVkIHRvIG1hdGNoIHRoZSBwcmV2aW91cwotLy8gbGltaXQuCi1URVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgQmlnTGltaXRPblRvcE9mU21hbGxMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOwotCi0gIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7Ci0KLSAgICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKLSAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDEgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoNCk7Ci0gICAgRVhQRUNUX0VRKDQsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKLSAgICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdDIgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoOCk7Ci0KLSAgICB1aW50MzIgdmFsdWU7Ci0KLSAgICAvLyBSZWFkIHVudGlsIHdlIGhpdCBsaW1pdDIuICBFeGNlcHQsIHdhaXQhICBsaW1pdDEgaXMgc2hvcnRlciwgc28KLSAgICAvLyB3ZSBlbmQgdXAgaGl0dGluZyB0aGF0IGZpcnN0LCBkZXNwaXRlIGhhdmluZyA0IGJ5dGVzIHRvIGdvIG9uCi0gICAgLy8gbGltaXQyLgotICAgIEVYUEVDVF9FUSg0LCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKLSAgICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbExpbWl0KCkpOwotCi0gICAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQyKTsKLQotICAgIC8vIE9LLCBwb3BwZWQgbGltaXQyLCBub3cgbGltaXQxIGlzIG9uIHRvcCwgd2hpY2ggd2UndmUgYWxyZWFkeSBoaXQuCi0gICAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKLSAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICAgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0KLSAgICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdDEpOwotCi0gICAgLy8gTm8gbW9yZSBsaW1pdHMuCi0gICAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpOwotICB9Ci0KLSAgRVhQRUNUX0VRKDgsIGlucHV0LkJ5dGVDb3VudCgpKTsKLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgRXhwZWN0QXRFbmQpIHsKLSAgLy8gVGVzdCBFeHBlY3RBdEVuZCgpLCB3aGljaCBpcyBiYXNlZCBvbiBsaW1pdHMuCi0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKLSAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotCi0gIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5FeHBlY3RBdEVuZCgpKTsKLQotICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCg0KTsKLQotICB1aW50MzIgdmFsdWU7Ci0gIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKTsKLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuRXhwZWN0QXRFbmQoKSk7Ci0KLSAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQpOwotICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuRXhwZWN0QXRFbmQoKSk7Ci19Ci0KLVRFU1RfRihDb2RlZFN0cmVhbVRlc3QsIE5lZ2F0aXZlTGltaXQpIHsKLSAgLy8gQ2hlY2sgd2hhdCBoYXBwZW5zIHdoZW4gd2UgcHVzaCBhIG5lZ2F0aXZlIGxpbWl0LgotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7Ci0gIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdCgtMTIzNCk7Ci0gIC8vIEJ5dGVzVW50aWxMaW1pdCgpIHJldHVybnMgLTEgdG8gbWVhbiAibm8gbGltaXQiLCB3aGljaCBhY3R1YWxseSBtZWFucwotICAvLyAidGhlIGxpbWl0IGlzIElOVF9NQVggcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtIi4KLSAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgTmVnYXRpdmVMaW1pdEFmdGVyUmVhZGluZykgewotICAvLyBDaGVjayB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIGEgbmVnYXRpdmUgbGltaXQuCi0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKLSAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotICBBU1NFUlRfVFJVRShjb2RlZF9pbnB1dC5Ta2lwKDEyOCkpOwotCi0gIENvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gY29kZWRfaW5wdXQuUHVzaExpbWl0KC02NCk7Ci0gIC8vIEJ5dGVzVW50aWxMaW1pdCgpIHJldHVybnMgLTEgdG8gbWVhbiAibm8gbGltaXQiLCB3aGljaCBhY3R1YWxseSBtZWFucwotICAvLyAidGhlIGxpbWl0IGlzIElOVF9NQVggcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtIi4KLSAgRVhQRUNUX0VRKC0xLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsTGltaXQoKSk7Ci0gIGNvZGVkX2lucHV0LlBvcExpbWl0KGxpbWl0KTsKLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgT3ZlcmZsb3dMaW1pdCkgewotICAvLyBDaGVjayB3aGF0IGhhcHBlbnMgd2hlbiB3ZSBwdXNoIGEgbGltaXQgbGFyZ2UgZW5vdWdoIHRoYXQgaXRzIGFic29sdXRlCi0gIC8vIHBvc2l0aW9uIGlzIG1vcmUgdGhhbiAyR0IgaW50byB0aGUgc3RyZWFtLgotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7Ci0gIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLSAgQVNTRVJUX1RSVUUoY29kZWRfaW5wdXQuU2tpcCgxMjgpKTsKLQotICBDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGNvZGVkX2lucHV0LlB1c2hMaW1pdChJTlRfTUFYKTsKLSAgLy8gQnl0ZXNVbnRpbExpbWl0KCkgcmV0dXJucyAtMSB0byBtZWFuICJubyBsaW1pdCIsIHdoaWNoIGFjdHVhbGx5IG1lYW5zCi0gIC8vICJ0aGUgbGltaXQgaXMgSU5UX01BWCByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBzdHJlYW0iLgotICBFWFBFQ1RfRVEoLTEsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxMaW1pdCgpKTsKLSAgY29kZWRfaW5wdXQuUG9wTGltaXQobGltaXQpOwotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBUb3RhbEJ5dGVzTGltaXQpIHsKLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOwotICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7Ci0gIGNvZGVkX2lucHV0LlNldFRvdGFsQnl0ZXNMaW1pdCgxNiwgLTEpOwotICBFWFBFQ1RfRVEoMTYsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7Ci0KLSAgc3RyaW5nIHN0cjsKLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOwotICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKLQotICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7Ci0KLSAgewotICAgIFNjb3BlZE1lbW9yeUxvZyBlcnJvcl9sb2c7Ci0gICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMSkpOwotICAgIGVycm9ycyA9IGVycm9yX2xvZy5HZXRNZXNzYWdlcyhFUlJPUik7Ci0gIH0KLQotICBBU1NFUlRfRVEoMSwgZXJyb3JzLnNpemUoKSk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsCi0gICAgIkEgcHJvdG9jb2wgbWVzc2FnZSB3YXMgcmVqZWN0ZWQgYmVjYXVzZSBpdCB3YXMgdG9vIGJpZyIsIGVycm9yc1swXSk7Ci0KLSAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KDMyLCAtMSk7Ci0gIEVYUEVDVF9FUSgxNiwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOwotICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgVG90YWxCeXRlc0xpbWl0Tm90VmFsaWRNZXNzYWdlRW5kKSB7Ci0gIC8vIHRvdGFsX2J5dGVzX2xpbWl0XyBpcyBub3QgYSB2YWxpZCBwbGFjZSBmb3IgYSBtZXNzYWdlIHRvIGVuZC4KLQotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7Ci0gIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKLQotICAvLyBTZXQgYm90aCB0b3RhbF9ieXRlc19saW1pdCBhbmQgYSByZWd1bGFyIGxpbWl0IGF0IDE2IGJ5dGVzLgotICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMTYsIC0xKTsKLSAgQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBjb2RlZF9pbnB1dC5QdXNoTGltaXQoMTYpOwotCi0gIC8vIFJlYWQgMTYgYnl0ZXMuCi0gIHN0cmluZyBzdHI7Ci0gIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgMTYpKTsKLQotICAvLyBSZWFkIGEgdGFnLiAgU2hvdWxkIGZhaWwsIGJ1dCByZXBvcnQgYmVpbmcgYSB2YWxpZCBlbmRwb2ludCBzaW5jZSBpdCdzCi0gIC8vIGEgcmVndWxhciBsaW1pdC4KLSAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LlJlYWRUYWcoKSk7Ci0gIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKLQotICAvLyBQb3AgdGhlIGxpbWl0LgotICBjb2RlZF9pbnB1dC5Qb3BMaW1pdChsaW1pdCk7Ci0KLSAgLy8gUmVhZCBhIHRhZy4gIFNob3VsZCBmYWlsLCBhbmQgcmVwb3J0ICpub3QqIGJlaW5nIGEgdmFsaWQgZW5kcG9pbnQsIHNpbmNlCi0gIC8vIHRoaXMgdGltZSB3ZSdyZSBoaXR0aW5nIHRoZSB0b3RhbCBieXRlcyBsaW1pdC4KLSAgRVhQRUNUX0VRKDAsIGNvZGVkX2lucHV0LlJlYWRUYWcoKSk7Ci0gIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSk7Ci19Ci0KLS8vIFRoaXMgbWV0aG9kIGlzIHVzZWQgYnkgdGhlIHRlc3RzIGJlbG93LgotLy8gSXQgY29uc3RydWN0cyBhIENvZGVkSW5wdXRTdHJlYW0gd2l0aCB0aGUgZ2l2ZW4gbGltaXRzIGFuZCB0cmllcyB0byByZWFkIDJLaUIKLS8vIG9mIGRhdGEgZnJvbSBpdC4gVGhlbiBpdCByZXR1cm5zIHRoZSBsb2dnZWQgZXJyb3JzIGFuZCB3YXJuaW5ncyBpbiB0aGUgZ2l2ZW4KLS8vIHZlY3RvcnMuCi12b2lkIENvZGVkU3RyZWFtVGVzdDo6U2V0dXBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nVGVzdCgKLSAgICBpbnQgdG90YWxfYnl0ZXNfbGltaXQsIGludCB3YXJuaW5nX3RocmVzaG9sZCwKLSAgICB2ZWN0b3I8c3RyaW5nPiogb3V0X2Vycm9ycywgdmVjdG9yPHN0cmluZz4qIG91dF93YXJuaW5ncykgewotICBBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDEyOCk7Ci0KLSAgU2NvcGVkTWVtb3J5TG9nIHNjb3BlZF9sb2c7Ci0gIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOwotICAgIGlucHV0LlNldFRvdGFsQnl0ZXNMaW1pdCh0b3RhbF9ieXRlc19saW1pdCwgd2FybmluZ190aHJlc2hvbGQpOwotICAgIHN0cmluZyBzdHI7Ci0gICAgRVhQRUNUX1RSVUUoaW5wdXQuUmVhZFN0cmluZygmc3RyLCAyMDQ4KSk7Ci0gIH0KLQotICAqb3V0X2Vycm9ycyA9IHNjb3BlZF9sb2cuR2V0TWVzc2FnZXMoRVJST1IpOwotICAqb3V0X3dhcm5pbmdzID0gc2NvcGVkX2xvZy5HZXRNZXNzYWdlcyhXQVJOSU5HKTsKLX0KLQotVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgVG90YWxCeXRlc0xpbWl0V2FybmluZykgewotICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7Ci0gIHZlY3RvcjxzdHJpbmc+IHdhcm5pbmdzOwotICBTZXR1cFRvdGFsQnl0ZXNMaW1pdFdhcm5pbmdUZXN0KDEwMjQwLCAxMDI0LCAmZXJyb3JzLCAmd2FybmluZ3MpOwotCi0gIEVYUEVDVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKLQotICBBU1NFUlRfRVEoMiwgd2FybmluZ3Muc2l6ZSgpKTsKLSAgRVhQRUNUX1BSRURfRk9STUFUMih0ZXN0aW5nOjpJc1N1YnN0cmluZywKLSAgICAiUmVhZGluZyBkYW5nZXJvdXNseSBsYXJnZSBwcm90b2NvbCBtZXNzYWdlLiAgSWYgdGhlIG1lc3NhZ2UgdHVybnMgb3V0IHRvICIKLSAgICAiYmUgbGFyZ2VyIHRoYW4gMTAyNDAgYnl0ZXMsIHBhcnNpbmcgd2lsbCBiZSBoYWx0ZWQgZm9yIHNlY3VyaXR5IHJlYXNvbnMuIiwKLSAgICB3YXJuaW5nc1swXSk7Ci0gIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsCi0gICAgIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCB3YXMgMjA0OCIsCi0gICAgd2FybmluZ3NbMV0pOwotfQotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nRGlzYWJsZWQpIHsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotICB2ZWN0b3I8c3RyaW5nPiB3YXJuaW5nczsKLQotICAvLyBUZXN0IHdpdGggLTEKLSAgU2V0dXBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nVGVzdCgxMDI0MCwgLTEsICZlcnJvcnMsICZ3YXJuaW5ncyk7Ci0gIEVYUEVDVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIHdhcm5pbmdzLnNpemUoKSk7Ci0KLSAgLy8gVGVzdCBhZ2FpbiB3aXRoIC0yLCBleHBlY3RpbmcgdGhlIHNhbWUgcmVzdWx0Ci0gIFNldHVwVG90YWxCeXRlc0xpbWl0V2FybmluZ1Rlc3QoMTAyNDAsIC0yLCAmZXJyb3JzLCAmd2FybmluZ3MpOwotICBFWFBFQ1RfRVEoMCwgZXJyb3JzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgwLCB3YXJuaW5ncy5zaXplKCkpOwotfQotCi0KLVRFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFJlY3Vyc2lvbkxpbWl0KSB7Ci0gIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pKTsKLSAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotICBjb2RlZF9pbnB1dC5TZXRSZWN1cnNpb25MaW1pdCg0KTsKLQotICAvLyBUaGlzIGlzIHdheSB0b28gbXVjaCB0ZXN0aW5nIGZvciBhIGNvdW50ZXIuCi0gIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDEKLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gMgotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyAzCi0gIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDQKLSAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgLy8gNQotICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAvLyA2Ci0gIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDUKLSAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgLy8gNgotICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyA1Ci0gIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDQKLSAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gMwotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyA0Ci0gIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgIC8vIDUKLSAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gNAotICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyAzCi0gIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDIKLSAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gMQotICBjb2RlZF9pbnB1dC5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOyAgICAgICAgICAgICAgICAgICAvLyAwCi0gIGNvZGVkX2lucHV0LkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7ICAgICAgICAgICAgICAgICAgIC8vIDAKLSAgY29kZWRfaW5wdXQuRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsgICAgICAgICAgICAgICAgICAgLy8gMAotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyAxCi0gIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOyAgICAgIC8vIDIKLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gMwotICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgICAvLyA0Ci0gIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsgICAgIC8vIDUKLQotICBjb2RlZF9pbnB1dC5TZXRSZWN1cnNpb25MaW1pdCg2KTsKLSAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAgLy8gNgotICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAvLyA3Ci19Ci0KLQotY2xhc3MgUmVhbGx5QmlnSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICBSZWFsbHlCaWdJbnB1dFN0cmVhbSgpIDogYmFja3VwX2Ftb3VudF8oMCksIGJ1ZmZlcl9jb3VudF8oMCkge30KLSAgflJlYWxseUJpZ0lucHV0U3RyZWFtKCkge30KLQotICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgewotICAgIC8vIFdlIG9ubHkgZXhwZWN0IEJhY2tVcCgpIHRvIGJlIGNhbGxlZCBhdCB0aGUgZW5kLgotICAgIEVYUEVDVF9FUSgwLCBiYWNrdXBfYW1vdW50Xyk7Ci0KLSAgICBzd2l0Y2ggKGJ1ZmZlcl9jb3VudF8rKykgewotICAgICAgY2FzZSAwOgotICAgICAgICAqZGF0YSA9IGJ1ZmZlcl87Ci0gICAgICAgICpzaXplID0gc2l6ZW9mKGJ1ZmZlcl8pOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgMToKLSAgICAgICAgLy8gUmV0dXJuIGFuIGVub3Jtb3VzbHkgbGFyZ2UgYnVmZmVyIHRoYXQsIHdoZW4gY29tYmluZWQgd2l0aCB0aGUgMWsKLSAgICAgICAgLy8gcmV0dXJuZWQgYWxyZWFkeSwgc2hvdWxkIG92ZXJmbG93IHRoZSB0b3RhbF9ieXRlc19yZWFkXyBjb3VudGVyIGluCi0gICAgICAgIC8vIENvZGVkSW5wdXRTdHJlYW0uICBOb3RlIHRoYXQgd2UnbGwgb25seSByZWFkIHRoZSBmaXJzdCAxMDI0IGJ5dGVzCi0gICAgICAgIC8vIG9mIHRoaXMgYnVmZmVyIHNvIGl0J3MgT0sgdGhhdCB3ZSBoYXZlIGl0IHBvaW50IGF0IGJ1ZmZlcl8uCi0gICAgICAgICpkYXRhID0gYnVmZmVyXzsKLSAgICAgICAgKnNpemUgPSBJTlRfTUFYOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEJhY2tVcChpbnQgY291bnQpIHsKLSAgICBiYWNrdXBfYW1vdW50XyA9IGNvdW50OwotICB9Ci0KLSAgYm9vbCBTa2lwKGludCBjb3VudCkgICAgeyBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm90IGltcGxlbWVudGVkLiI7IHJldHVybiBmYWxzZTsgfQotICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdCB7IEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgaW1wbGVtZW50ZWQuIjsgcmV0dXJuIDA7IH0KLQotICBpbnQgYmFja3VwX2Ftb3VudF87Ci0KLSBwcml2YXRlOgotICBjaGFyIGJ1ZmZlcl9bMTAyNF07Ci0gIGludDY0IGJ1ZmZlcl9jb3VudF87Ci19OwotCi1URVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBJbnB1dE92ZXIyRykgewotICAvLyBDb2RlZElucHV0U3RyZWFtIHNob3VsZCBncmFjZWZ1bGx5IGhhbmRsZSBpbnB1dCBvdmVyIDJHIGFuZCBjYWxsCi0gIC8vIGlucHV0LkJhY2tVcCgpIHdpdGggdGhlIGNvcnJlY3QgbnVtYmVyIG9mIGJ5dGVzIG9uIGRlc3RydWN0aW9uLgotICBSZWFsbHlCaWdJbnB1dFN0cmVhbSBpbnB1dDsKLQotICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7Ci0KLSAgewotICAgIFNjb3BlZE1lbW9yeUxvZyBlcnJvcl9sb2c7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOwotICAgIHN0cmluZyBzdHI7Ci0gICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCA1MTIpKTsKLSAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEwMjQpKTsKLSAgICBlcnJvcnMgPSBlcnJvcl9sb2cuR2V0TWVzc2FnZXMoRVJST1IpOwotICB9Ci0KLSAgRVhQRUNUX0VRKElOVF9NQVggLSA1MTIsIGlucHV0LmJhY2t1cF9hbW91bnRfKTsKLSAgRVhQRUNUX0VRKDAsIGVycm9ycy5zaXplKCkpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgaW8KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljNjIxYjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzMCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBicmlhbm9sc29uQGdvb2dsZS5jb20gKEJyaWFuIE9sc29uKQotLy8KLS8vIFRoaXMgZmlsZSBjb250YWlucyB0aGUgaW1wbGVtZW50YXRpb24gb2YgY2xhc3NlcyBHemlwSW5wdXRTdHJlYW0gYW5kCi0vLyBHemlwT3V0cHV0U3RyZWFtLgotCi0KLSNpZiBIQVZFX1pMSUIKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotCi1zdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0QnVmZmVyU2l6ZSA9IDY1NTM2OwotCi1HemlwSW5wdXRTdHJlYW06Okd6aXBJbnB1dFN0cmVhbSgKLSAgICBaZXJvQ29weUlucHV0U3RyZWFtKiBzdWJfc3RyZWFtLCBGb3JtYXQgZm9ybWF0LCBpbnQgYnVmZmVyX3NpemUpCi0gICAgOiBmb3JtYXRfKGZvcm1hdCksIHN1Yl9zdHJlYW1fKHN1Yl9zdHJlYW0pLCB6ZXJyb3JfKFpfT0spLCBieXRlX2NvdW50XygwKSB7Ci0gIHpjb250ZXh0Xy5zdGF0ZSA9IFpfTlVMTDsKLSAgemNvbnRleHRfLnphbGxvYyA9IFpfTlVMTDsKLSAgemNvbnRleHRfLnpmcmVlID0gWl9OVUxMOwotICB6Y29udGV4dF8ub3BhcXVlID0gWl9OVUxMOwotICB6Y29udGV4dF8udG90YWxfb3V0ID0gMDsKLSAgemNvbnRleHRfLm5leHRfaW4gPSBOVUxMOwotICB6Y29udGV4dF8uYXZhaWxfaW4gPSAwOwotICB6Y29udGV4dF8udG90YWxfaW4gPSAwOwotICB6Y29udGV4dF8ubXNnID0gTlVMTDsKLSAgaWYgKGJ1ZmZlcl9zaXplID09IC0xKSB7Ci0gICAgb3V0cHV0X2J1ZmZlcl9sZW5ndGhfID0ga0RlZmF1bHRCdWZmZXJTaXplOwotICB9IGVsc2UgewotICAgIG91dHB1dF9idWZmZXJfbGVuZ3RoXyA9IGJ1ZmZlcl9zaXplOwotICB9Ci0gIG91dHB1dF9idWZmZXJfID0gb3BlcmF0b3IgbmV3KG91dHB1dF9idWZmZXJfbGVuZ3RoXyk7Ci0gIEdPT0dMRV9DSEVDSyhvdXRwdXRfYnVmZmVyXyAhPSBOVUxMKTsKLSAgemNvbnRleHRfLm5leHRfb3V0ID0gc3RhdGljX2Nhc3Q8Qnl0ZWYqPihvdXRwdXRfYnVmZmVyXyk7Ci0gIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSBvdXRwdXRfYnVmZmVyX2xlbmd0aF87Ci0gIG91dHB1dF9wb3NpdGlvbl8gPSBvdXRwdXRfYnVmZmVyXzsKLX0KLUd6aXBJbnB1dFN0cmVhbTo6fkd6aXBJbnB1dFN0cmVhbSgpIHsKLSAgb3BlcmF0b3IgZGVsZXRlKG91dHB1dF9idWZmZXJfKTsKLSAgemVycm9yXyA9IGluZmxhdGVFbmQoJnpjb250ZXh0Xyk7Ci19Ci0KLXN0YXRpYyBpbmxpbmUgaW50IGludGVybmFsSW5mbGF0ZUluaXQyKAotICAgIHpfc3RyZWFtKiB6Y29udGV4dCwgR3ppcElucHV0U3RyZWFtOjpGb3JtYXQgZm9ybWF0KSB7Ci0gIGludCB3aW5kb3dCaXRzRm9ybWF0ID0gMDsKLSAgc3dpdGNoIChmb3JtYXQpIHsKLSAgICBjYXNlIEd6aXBJbnB1dFN0cmVhbTo6R1pJUDogd2luZG93Qml0c0Zvcm1hdCA9IDE2OyBicmVhazsKLSAgICBjYXNlIEd6aXBJbnB1dFN0cmVhbTo6QVVUTzogd2luZG93Qml0c0Zvcm1hdCA9IDMyOyBicmVhazsKLSAgICBjYXNlIEd6aXBJbnB1dFN0cmVhbTo6WkxJQjogd2luZG93Qml0c0Zvcm1hdCA9IDA7IGJyZWFrOwotICB9Ci0gIHJldHVybiBpbmZsYXRlSW5pdDIoemNvbnRleHQsIC8qIHdpbmRvd0JpdHMgKi8xNSB8IHdpbmRvd0JpdHNGb3JtYXQpOwotfQotCi1pbnQgR3ppcElucHV0U3RyZWFtOjpJbmZsYXRlKGludCBmbHVzaCkgewotICBpZiAoKHplcnJvcl8gPT0gWl9PSykgJiYgKHpjb250ZXh0Xy5hdmFpbF9vdXQgPT0gMCkpIHsKLSAgICAvLyBwcmV2aW91cyBpbmZsYXRlIGZpbGxlZCBvdXRwdXQgYnVmZmVyLiBkb24ndCBjaGFuZ2UgaW5wdXQgcGFyYW1zIHlldC4KLSAgfSBlbHNlIGlmICh6Y29udGV4dF8uYXZhaWxfaW4gPT0gMCkgewotICAgIGNvbnN0IHZvaWQqIGluOwotICAgIGludCBpbl9zaXplOwotICAgIGJvb2wgZmlyc3QgPSB6Y29udGV4dF8ubmV4dF9pbiA9PSBOVUxMOwotICAgIGJvb2wgb2sgPSBzdWJfc3RyZWFtXy0+TmV4dCgmaW4sICZpbl9zaXplKTsKLSAgICBpZiAoIW9rKSB7Ci0gICAgICB6Y29udGV4dF8ubmV4dF9vdXQgPSBOVUxMOwotICAgICAgemNvbnRleHRfLmF2YWlsX291dCA9IDA7Ci0gICAgICByZXR1cm4gWl9TVFJFQU1fRU5EOwotICAgIH0KLSAgICB6Y29udGV4dF8ubmV4dF9pbiA9IHN0YXRpY19jYXN0PEJ5dGVmKj4oY29uc3RfY2FzdDx2b2lkKj4oaW4pKTsKLSAgICB6Y29udGV4dF8uYXZhaWxfaW4gPSBpbl9zaXplOwotICAgIGlmIChmaXJzdCkgewotICAgICAgaW50IGVycm9yID0gaW50ZXJuYWxJbmZsYXRlSW5pdDIoJnpjb250ZXh0XywgZm9ybWF0Xyk7Ci0gICAgICBpZiAoZXJyb3IgIT0gWl9PSykgewotICAgICAgICByZXR1cm4gZXJyb3I7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIHpjb250ZXh0Xy5uZXh0X291dCA9IHN0YXRpY19jYXN0PEJ5dGVmKj4ob3V0cHV0X2J1ZmZlcl8pOwotICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gb3V0cHV0X2J1ZmZlcl9sZW5ndGhfOwotICBvdXRwdXRfcG9zaXRpb25fID0gb3V0cHV0X2J1ZmZlcl87Ci0gIGludCBlcnJvciA9IGluZmxhdGUoJnpjb250ZXh0XywgZmx1c2gpOwotICByZXR1cm4gZXJyb3I7Ci19Ci0KLXZvaWQgR3ppcElucHV0U3RyZWFtOjpEb05leHRPdXRwdXQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgewotICAqZGF0YSA9IG91dHB1dF9wb3NpdGlvbl87Ci0gICpzaXplID0gKCh1aW50cHRyX3QpemNvbnRleHRfLm5leHRfb3V0KSAtICgodWludHB0cl90KW91dHB1dF9wb3NpdGlvbl8pOwotICBvdXRwdXRfcG9zaXRpb25fID0gemNvbnRleHRfLm5leHRfb3V0OwotfQotCi0vLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotYm9vbCBHemlwSW5wdXRTdHJlYW06Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgewotICBib29sIG9rID0gKHplcnJvcl8gPT0gWl9PSykgfHwgKHplcnJvcl8gPT0gWl9TVFJFQU1fRU5EKQotICAgICAgfHwgKHplcnJvcl8gPT0gWl9CVUZfRVJST1IpOwotICBpZiAoKCFvaykgfHwgKHpjb250ZXh0Xy5uZXh0X291dCA9PSBOVUxMKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoemNvbnRleHRfLm5leHRfb3V0ICE9IG91dHB1dF9wb3NpdGlvbl8pIHsKLSAgICBEb05leHRPdXRwdXQoZGF0YSwgc2l6ZSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgaWYgKHplcnJvcl8gPT0gWl9TVFJFQU1fRU5EKSB7Ci0gICAgaWYgKHpjb250ZXh0Xy5uZXh0X291dCAhPSBOVUxMKSB7Ci0gICAgICAvLyBzdWJfc3RyZWFtXyBtYXkgaGF2ZSBjb25jYXRlbmF0ZWQgc3RyZWFtcyB0byBmb2xsb3cKLSAgICAgIHplcnJvcl8gPSBpbmZsYXRlRW5kKCZ6Y29udGV4dF8pOwotICAgICAgYnl0ZV9jb3VudF8gKz0gemNvbnRleHRfLnRvdGFsX291dDsKLSAgICAgIGlmICh6ZXJyb3JfICE9IFpfT0spIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgemVycm9yXyA9IGludGVybmFsSW5mbGF0ZUluaXQyKCZ6Y29udGV4dF8sIGZvcm1hdF8pOwotICAgICAgaWYgKHplcnJvcl8gIT0gWl9PSykgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgICpkYXRhID0gTlVMTDsKLSAgICAgICpzaXplID0gMDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgemVycm9yXyA9IEluZmxhdGUoWl9OT19GTFVTSCk7Ci0gIGlmICgoemVycm9yXyA9PSBaX1NUUkVBTV9FTkQpICYmICh6Y29udGV4dF8ubmV4dF9vdXQgPT0gTlVMTCkpIHsKLSAgICAvLyBUaGUgdW5kZXJseWluZyBzdHJlYW0ncyBOZXh0IHJldHVybmVkIGZhbHNlIGluc2lkZSBJbmZsYXRlLgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBvayA9ICh6ZXJyb3JfID09IFpfT0spIHx8ICh6ZXJyb3JfID09IFpfU1RSRUFNX0VORCkKLSAgICAgIHx8ICh6ZXJyb3JfID09IFpfQlVGX0VSUk9SKTsKLSAgaWYgKCFvaykgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBEb05leHRPdXRwdXQoZGF0YSwgc2l6ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotdm9pZCBHemlwSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKLSAgb3V0cHV0X3Bvc2l0aW9uXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG91dHB1dF9wb3NpdGlvbl8pIC0gY291bnQpOwotfQotYm9vbCBHemlwSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7Ci0gIGNvbnN0IHZvaWQqIGRhdGE7Ci0gIGludCBzaXplOwotICBib29sIG9rID0gTmV4dCgmZGF0YSwgJnNpemUpOwotICB3aGlsZSAob2sgJiYgKHNpemUgPCBjb3VudCkpIHsKLSAgICBjb3VudCAtPSBzaXplOwotICAgIG9rID0gTmV4dCgmZGF0YSwgJnNpemUpOwotICB9Ci0gIGlmIChzaXplID4gY291bnQpIHsKLSAgICBCYWNrVXAoc2l6ZSAtIGNvdW50KTsKLSAgfQotICByZXR1cm4gb2s7Ci19Ci1pbnQ2NCBHemlwSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgaW50NjQgcmV0ID0gYnl0ZV9jb3VudF8gKyB6Y29udGV4dF8udG90YWxfb3V0OwotICBpZiAoemNvbnRleHRfLm5leHRfb3V0ICE9IE5VTEwgJiYgb3V0cHV0X3Bvc2l0aW9uXyAhPSBOVUxMKSB7Ci0gICAgcmV0ICs9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludHB0cl90Pih6Y29udGV4dF8ubmV4dF9vdXQpIC0KLSAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KG91dHB1dF9wb3NpdGlvbl8pOwotICB9Ci0gIHJldHVybiByZXQ7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9uczo6T3B0aW9ucygpCi0gICAgOiBmb3JtYXQoR1pJUCksCi0gICAgICBidWZmZXJfc2l6ZShrRGVmYXVsdEJ1ZmZlclNpemUpLAotICAgICAgY29tcHJlc3Npb25fbGV2ZWwoWl9ERUZBVUxUX0NPTVBSRVNTSU9OKSwKLSAgICAgIGNvbXByZXNzaW9uX3N0cmF0ZWd5KFpfREVGQVVMVF9TVFJBVEVHWSkge30KLQotR3ppcE91dHB1dFN0cmVhbTo6R3ppcE91dHB1dFN0cmVhbShaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSkgewotICBJbml0KHN1Yl9zdHJlYW0sIE9wdGlvbnMoKSk7Ci19Ci0KLUd6aXBPdXRwdXRTdHJlYW06Okd6aXBPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgSW5pdChzdWJfc3RyZWFtLCBvcHRpb25zKTsKLX0KLQotdm9pZCBHemlwT3V0cHV0U3RyZWFtOjpJbml0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgc3ViX3N0cmVhbV8gPSBzdWJfc3RyZWFtOwotICBzdWJfZGF0YV8gPSBOVUxMOwotICBzdWJfZGF0YV9zaXplXyA9IDA7Ci0KLSAgaW5wdXRfYnVmZmVyX2xlbmd0aF8gPSBvcHRpb25zLmJ1ZmZlcl9zaXplOwotICBpbnB1dF9idWZmZXJfID0gb3BlcmF0b3IgbmV3KGlucHV0X2J1ZmZlcl9sZW5ndGhfKTsKLSAgR09PR0xFX0NIRUNLKGlucHV0X2J1ZmZlcl8gIT0gTlVMTCk7Ci0KLSAgemNvbnRleHRfLnphbGxvYyA9IFpfTlVMTDsKLSAgemNvbnRleHRfLnpmcmVlID0gWl9OVUxMOwotICB6Y29udGV4dF8ub3BhcXVlID0gWl9OVUxMOwotICB6Y29udGV4dF8ubmV4dF9vdXQgPSBOVUxMOwotICB6Y29udGV4dF8uYXZhaWxfb3V0ID0gMDsKLSAgemNvbnRleHRfLnRvdGFsX291dCA9IDA7Ci0gIHpjb250ZXh0Xy5uZXh0X2luID0gTlVMTDsKLSAgemNvbnRleHRfLmF2YWlsX2luID0gMDsKLSAgemNvbnRleHRfLnRvdGFsX2luID0gMDsKLSAgemNvbnRleHRfLm1zZyA9IE5VTEw7Ci0gIC8vIGRlZmF1bHQgdG8gR1pJUCBmb3JtYXQKLSAgaW50IHdpbmRvd0JpdHNGb3JtYXQgPSAxNjsKLSAgaWYgKG9wdGlvbnMuZm9ybWF0ID09IFpMSUIpIHsKLSAgICB3aW5kb3dCaXRzRm9ybWF0ID0gMDsKLSAgfQotICB6ZXJyb3JfID0gZGVmbGF0ZUluaXQyKAotICAgICAgJnpjb250ZXh0XywKLSAgICAgIG9wdGlvbnMuY29tcHJlc3Npb25fbGV2ZWwsCi0gICAgICBaX0RFRkxBVEVELAotICAgICAgLyogd2luZG93Qml0cyAqLzE1IHwgd2luZG93Qml0c0Zvcm1hdCwKLSAgICAgIC8qIG1lbUxldmVsIChkZWZhdWx0KSAqLzgsCi0gICAgICBvcHRpb25zLmNvbXByZXNzaW9uX3N0cmF0ZWd5KTsKLX0KLQotR3ppcE91dHB1dFN0cmVhbTo6fkd6aXBPdXRwdXRTdHJlYW0oKSB7Ci0gIENsb3NlKCk7Ci0gIG9wZXJhdG9yIGRlbGV0ZShpbnB1dF9idWZmZXJfKTsKLX0KLQotLy8gcHJpdmF0ZQotaW50IEd6aXBPdXRwdXRTdHJlYW06OkRlZmxhdGUoaW50IGZsdXNoKSB7Ci0gIGludCBlcnJvciA9IFpfT0s7Ci0gIGRvIHsKLSAgICBpZiAoKHN1Yl9kYXRhXyA9PSBOVUxMKSB8fCAoemNvbnRleHRfLmF2YWlsX291dCA9PSAwKSkgewotICAgICAgYm9vbCBvayA9IHN1Yl9zdHJlYW1fLT5OZXh0KCZzdWJfZGF0YV8sICZzdWJfZGF0YV9zaXplXyk7Ci0gICAgICBpZiAoIW9rKSB7Ci0gICAgICAgIHN1Yl9kYXRhXyA9IE5VTEw7Ci0gICAgICAgIHN1Yl9kYXRhX3NpemVfID0gMDsKLSAgICAgICAgcmV0dXJuIFpfQlVGX0VSUk9SOwotICAgICAgfQotICAgICAgR09PR0xFX0NIRUNLX0dUKHN1Yl9kYXRhX3NpemVfLCAwKTsKLSAgICAgIHpjb250ZXh0Xy5uZXh0X291dCA9IHN0YXRpY19jYXN0PEJ5dGVmKj4oc3ViX2RhdGFfKTsKLSAgICAgIHpjb250ZXh0Xy5hdmFpbF9vdXQgPSBzdWJfZGF0YV9zaXplXzsKLSAgICB9Ci0gICAgZXJyb3IgPSBkZWZsYXRlKCZ6Y29udGV4dF8sIGZsdXNoKTsKLSAgfSB3aGlsZSAoZXJyb3IgPT0gWl9PSyAmJiB6Y29udGV4dF8uYXZhaWxfb3V0ID09IDApOwotICBpZiAoKGZsdXNoID09IFpfRlVMTF9GTFVTSCkgfHwgKGZsdXNoID09IFpfRklOSVNIKSkgewotICAgIC8vIE5vdGlmeSBsb3dlciBsYXllciBvZiBkYXRhLgotICAgIHN1Yl9zdHJlYW1fLT5CYWNrVXAoemNvbnRleHRfLmF2YWlsX291dCk7Ci0gICAgLy8gV2UgZG9uJ3Qgb3duIHRoZSBidWZmZXIgYW55bW9yZS4KLSAgICBzdWJfZGF0YV8gPSBOVUxMOwotICAgIHN1Yl9kYXRhX3NpemVfID0gMDsKLSAgfQotICByZXR1cm4gZXJyb3I7Ci19Ci0KLS8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1ib29sIEd6aXBPdXRwdXRTdHJlYW06Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgewotICBpZiAoKHplcnJvcl8gIT0gWl9PSykgJiYgKHplcnJvcl8gIT0gWl9CVUZfRVJST1IpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmICh6Y29udGV4dF8uYXZhaWxfaW4gIT0gMCkgewotICAgIHplcnJvcl8gPSBEZWZsYXRlKFpfTk9fRkxVU0gpOwotICAgIGlmICh6ZXJyb3JfICE9IFpfT0spIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLSAgaWYgKHpjb250ZXh0Xy5hdmFpbF9pbiA9PSAwKSB7Ci0gICAgLy8gYWxsIGlucHV0IHdhcyBjb25zdW1lZC4gcmVzZXQgdGhlIGJ1ZmZlci4KLSAgICB6Y29udGV4dF8ubmV4dF9pbiA9IHN0YXRpY19jYXN0PEJ5dGVmKj4oaW5wdXRfYnVmZmVyXyk7Ci0gICAgemNvbnRleHRfLmF2YWlsX2luID0gaW5wdXRfYnVmZmVyX2xlbmd0aF87Ci0gICAgKmRhdGEgPSBpbnB1dF9idWZmZXJfOwotICAgICpzaXplID0gaW5wdXRfYnVmZmVyX2xlbmd0aF87Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVGhlIGxvb3AgaW4gRGVmbGF0ZSBzaG91bGQgY29uc3VtZSBhbGwgYXZhaWxfaW4KLSAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkRlZmxhdGUgbGVmdCBieXRlcyB1bmNvbnN1bWVkIjsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLXZvaWQgR3ppcE91dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgewotICBHT09HTEVfQ0hFQ0tfR0UoemNvbnRleHRfLmF2YWlsX2luLCBjb3VudCk7Ci0gIHpjb250ZXh0Xy5hdmFpbF9pbiAtPSBjb3VudDsKLX0KLWludDY0IEd6aXBPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHpjb250ZXh0Xy50b3RhbF9pbiArIHpjb250ZXh0Xy5hdmFpbF9pbjsKLX0KLQotYm9vbCBHemlwT3V0cHV0U3RyZWFtOjpGbHVzaCgpIHsKLSAgemVycm9yXyA9IERlZmxhdGUoWl9GVUxMX0ZMVVNIKTsKLSAgLy8gUmV0dXJuIHRydWUgaWYgdGhlIGZsdXNoIHN1Y2NlZWRlZCBvciBpZiBpdCB3YXMgYSBuby1vcC4KLSAgcmV0dXJuICAoemVycm9yXyA9PSBaX09LKSB8fAotICAgICAgKHplcnJvcl8gPT0gWl9CVUZfRVJST1IgJiYgemNvbnRleHRfLmF2YWlsX2luID09IDAgJiYKLSAgICAgICB6Y29udGV4dF8uYXZhaWxfb3V0ICE9IDApOwotfQotCi1ib29sIEd6aXBPdXRwdXRTdHJlYW06OkNsb3NlKCkgewotICBpZiAoKHplcnJvcl8gIT0gWl9PSykgJiYgKHplcnJvcl8gIT0gWl9CVUZfRVJST1IpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGRvIHsKLSAgICB6ZXJyb3JfID0gRGVmbGF0ZShaX0ZJTklTSCk7Ci0gIH0gd2hpbGUgKHplcnJvcl8gPT0gWl9PSyk7Ci0gIHplcnJvcl8gPSBkZWZsYXRlRW5kKCZ6Y29udGV4dF8pOwotICBib29sIG9rID0gemVycm9yXyA9PSBaX09LOwotICB6ZXJyb3JfID0gWl9TVFJFQU1fRU5EOwotICByZXR1cm4gb2s7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLSNlbmRpZiAgLy8gSEFWRV9aTElCCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE1YjAyZmUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjA5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGJyaWFub2xzb25AZ29vZ2xlLmNvbSAoQnJpYW4gT2xzb24pCi0vLwotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBkZWZpbml0aW9uIGZvciBjbGFzc2VzIEd6aXBJbnB1dFN0cmVhbSBhbmQKLS8vIEd6aXBPdXRwdXRTdHJlYW0uCi0vLwotLy8gR3ppcElucHV0U3RyZWFtIGRlY29tcHJlc3NlcyBkYXRhIGZyb20gYW4gdW5kZXJseWluZwotLy8gWmVyb0NvcHlJbnB1dFN0cmVhbSBhbmQgcHJvdmlkZXMgdGhlIGRlY29tcHJlc3NlZCBkYXRhIGFzIGEKLS8vIFplcm9Db3B5SW5wdXRTdHJlYW0uCi0vLwotLy8gR3ppcE91dHB1dFN0cmVhbSBpcyBhbiBaZXJvQ29weU91dHB1dFN0cmVhbSB0aGF0IGNvbXByZXNzZXMgZGF0YSB0bwotLy8gYW4gdW5kZXJseWluZyBaZXJvQ29weU91dHB1dFN0cmVhbS4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fR1pJUF9TVFJFQU1fSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19HWklQX1NUUkVBTV9IX18KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgotI2luY2x1ZGUgPHpsaWIuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGlvIHsKLQotLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHRoYXQgcmVhZHMgY29tcHJlc3NlZCBkYXRhIHRocm91Z2ggemxpYgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEd6aXBJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIEZvcm1hdCBrZXkgZm9yIGNvbnN0cnVjdG9yCi0gIGVudW0gRm9ybWF0IHsKLSAgICAvLyB6bGliIHdpbGwgYXV0b2RldGVjdCBnemlwIGhlYWRlciBvciBkZWZsYXRlIHN0cmVhbQotICAgIEFVVE8gPSAwLAotCi0gICAgLy8gR1pJUCBzdHJlYW1zIGhhdmUgc29tZSBleHRyYSBoZWFkZXIgZGF0YSBmb3IgZmlsZSBhdHRyaWJ1dGVzLgotICAgIEdaSVAgPSAxLAotCi0gICAgLy8gU2ltcGxlciB6bGliIHN0cmVhbSBmb3JtYXQuCi0gICAgWkxJQiA9IDIsCi0gIH07Ci0KLSAgLy8gYnVmZmVyX3NpemUgYW5kIGZvcm1hdCBtYXkgYmUgLTEgZm9yIGRlZmF1bHQgb2YgNjRrQiBhbmQgR1pJUCBmb3JtYXQKLSAgZXhwbGljaXQgR3ppcElucHV0U3RyZWFtKAotICAgICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogc3ViX3N0cmVhbSwKLSAgICAgIEZvcm1hdCBmb3JtYXQgPSBBVVRPLAotICAgICAgaW50IGJ1ZmZlcl9zaXplID0gLTEpOwotICB2aXJ0dWFsIH5HemlwSW5wdXRTdHJlYW0oKTsKLQotICAvLyBSZXR1cm4gbGFzdCBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgbm8gZXJyb3IuCi0gIGlubGluZSBjb25zdCBjaGFyKiBabGliRXJyb3JNZXNzYWdlKCkgY29uc3QgewotICAgIHJldHVybiB6Y29udGV4dF8ubXNnOwotICB9Ci0gIGlubGluZSBpbnQgWmxpYkVycm9yQ29kZSgpIGNvbnN0IHsKLSAgICByZXR1cm4gemVycm9yXzsKLSAgfQotCi0gIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKLSAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKLSAgYm9vbCBTa2lwKGludCBjb3VudCk7Ci0gIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgRm9ybWF0IGZvcm1hdF87Ci0KLSAgWmVyb0NvcHlJbnB1dFN0cmVhbSogc3ViX3N0cmVhbV87Ci0KLSAgel9zdHJlYW0gemNvbnRleHRfOwotICBpbnQgemVycm9yXzsKLQotICB2b2lkKiBvdXRwdXRfYnVmZmVyXzsKLSAgdm9pZCogb3V0cHV0X3Bvc2l0aW9uXzsKLSAgc2l6ZV90IG91dHB1dF9idWZmZXJfbGVuZ3RoXzsKLSAgaW50NjQgYnl0ZV9jb3VudF87Ci0KLSAgaW50IEluZmxhdGUoaW50IGZsdXNoKTsKLSAgdm9pZCBEb05leHRPdXRwdXQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEd6aXBJbnB1dFN0cmVhbSk7Ci19OwotCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBHemlwT3V0cHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5T3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIEZvcm1hdCBrZXkgZm9yIGNvbnN0cnVjdG9yCi0gIGVudW0gRm9ybWF0IHsKLSAgICAvLyBHWklQIHN0cmVhbXMgaGF2ZSBzb21lIGV4dHJhIGhlYWRlciBkYXRhIGZvciBmaWxlIGF0dHJpYnV0ZXMuCi0gICAgR1pJUCA9IDEsCi0KLSAgICAvLyBTaW1wbGVyIHpsaWIgc3RyZWFtIGZvcm1hdC4KLSAgICBaTElCID0gMiwKLSAgfTsKLQotICBzdHJ1Y3QgT3B0aW9ucyB7Ci0gICAgLy8gRGVmYXVsdHMgdG8gR1pJUC4KLSAgICBGb3JtYXQgZm9ybWF0OwotCi0gICAgLy8gV2hhdCBzaXplIGJ1ZmZlciB0byB1c2UgaW50ZXJuYWxseS4gIERlZmF1bHRzIHRvIDY0a0IuCi0gICAgaW50IGJ1ZmZlcl9zaXplOwotCi0gICAgLy8gQSBudW1iZXIgYmV0d2VlbiAwIGFuZCA5LCB3aGVyZSAwIGlzIG5vIGNvbXByZXNzaW9uIGFuZCA5IGlzIGJlc3QKLSAgICAvLyBjb21wcmVzc2lvbi4gIERlZmF1bHRzIHRvIFpfREVGQVVMVF9DT01QUkVTU0lPTiAoc2VlIHpsaWIuaCkuCi0gICAgaW50IGNvbXByZXNzaW9uX2xldmVsOwotCi0gICAgLy8gRGVmYXVsdHMgdG8gWl9ERUZBVUxUX1NUUkFURUdZLiAgQ2FuIGFsc28gYmUgc2V0IHRvIFpfRklMVEVSRUQsCi0gICAgLy8gWl9IVUZGTUFOX09OTFksIG9yIFpfUkxFLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uIGZvciBkZWZsYXRlSW5pdDIgaW4KLSAgICAvLyB6bGliLmggZm9yIGRlZmluaXRpb25zIG9mIHRoZXNlIGNvbnN0YW50cy4KLSAgICBpbnQgY29tcHJlc3Npb25fc3RyYXRlZ3k7Ci0KLSAgICBPcHRpb25zKCk7ICAvLyBJbml0aWFsaXplcyB3aXRoIGRlZmF1bHQgdmFsdWVzLgotICB9OwotCi0gIC8vIENyZWF0ZSBhIEd6aXBPdXRwdXRTdHJlYW0gd2l0aCBkZWZhdWx0IG9wdGlvbnMuCi0gIGV4cGxpY2l0IEd6aXBPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0pOwotCi0gIC8vIENyZWF0ZSBhIEd6aXBPdXRwdXRTdHJlYW0gd2l0aCB0aGUgZ2l2ZW4gb3B0aW9ucy4KLSAgR3ppcE91dHB1dFN0cmVhbSgKLSAgICAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLAotICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7Ci0KLSAgdmlydHVhbCB+R3ppcE91dHB1dFN0cmVhbSgpOwotCi0gIC8vIFJldHVybiBsYXN0IGVycm9yIG1lc3NhZ2Ugb3IgTlVMTCBpZiBubyBlcnJvci4KLSAgaW5saW5lIGNvbnN0IGNoYXIqIFpsaWJFcnJvck1lc3NhZ2UoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHpjb250ZXh0Xy5tc2c7Ci0gIH0KLSAgaW5saW5lIGludCBabGliRXJyb3JDb2RlKCkgY29uc3QgewotICAgIHJldHVybiB6ZXJyb3JfOwotICB9Ci0KLSAgLy8gRmx1c2hlcyBkYXRhIHdyaXR0ZW4gc28gZmFyIHRvIHppcHBlZCBkYXRhIGluIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgLy8gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGZsdXNoIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBpZgotICAvLyBuZWNlc3NhcnkuCi0gIC8vIENvbXByZXNzaW9uIG1heSBiZSBsZXNzIGVmZmljaWVudCBzdG9wcGluZyBhbmQgc3RhcnRpbmcgYXJvdW5kIGZsdXNoZXMuCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBubyBlcnJvci4KLSAgLy8KLSAgLy8gUGxlYXNlIGVuc3VyZSB0aGF0IGJsb2NrIHNpemUgaXMgPiA2LiBIZXJlIGlzIGFuIGV4Y2VycHQgZnJvbSB0aGUgemxpYgotICAvLyBkb2MgdGhhdCBleHBsYWlucyB3aHk6Ci0gIC8vCi0gIC8vIEluIHRoZSBjYXNlIG9mIGEgWl9GVUxMX0ZMVVNIIG9yIFpfU1lOQ19GTFVTSCwgbWFrZSBzdXJlIHRoYXQgYXZhaWxfb3V0Ci0gIC8vIGlzIGdyZWF0ZXIgdGhhbiBzaXggdG8gYXZvaWQgcmVwZWF0ZWQgZmx1c2ggbWFya2VycyBkdWUgdG8KLSAgLy8gYXZhaWxfb3V0ID09IDAgb24gcmV0dXJuLgotICBib29sIEZsdXNoKCk7Ci0KLSAgLy8gV3JpdGVzIG91dCBhbGwgZGF0YSBhbmQgY2xvc2VzIHRoZSBnemlwIHN0cmVhbS4KLSAgLy8gSXQgaXMgdGhlIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGNsb3NlIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSBpZgotICAvLyBuZWNlc3NhcnkuCi0gIC8vIFJldHVybnMgdHJ1ZSBpZiBubyBlcnJvci4KLSAgYm9vbCBDbG9zZSgpOwotCi0gIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKLSAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKLSAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbV87Ci0gIC8vIFJlc3VsdCBmcm9tIGNhbGxpbmcgTmV4dCgpIG9uIHN1Yl9zdHJlYW1fCi0gIHZvaWQqIHN1Yl9kYXRhXzsKLSAgaW50IHN1Yl9kYXRhX3NpemVfOwotCi0gIHpfc3RyZWFtIHpjb250ZXh0XzsKLSAgaW50IHplcnJvcl87Ci0gIHZvaWQqIGlucHV0X2J1ZmZlcl87Ci0gIHNpemVfdCBpbnB1dF9idWZmZXJfbGVuZ3RoXzsKLQotICAvLyBTaGFyZWQgY29uc3RydWN0b3IgY29kZS4KLSAgdm9pZCBJbml0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKLQotICAvLyBEbyBzb21lIGNvbXByZXNzaW9uLgotICAvLyBUYWtlcyB6bGliIGZsdXNoIG1vZGUuCi0gIC8vIFJldHVybnMgemxpYiBlcnJvciBjb2RlLgotICBpbnQgRGVmbGF0ZShpbnQgZmx1c2gpOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhHemlwT3V0cHV0U3RyZWFtKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX0daSVBfU1RSRUFNX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDE2MjUxYTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaAorKysgL2Rldi9udWxsCkBAIC0xLDQ0ICswLDAgQEAKLSMhL2Jpbi9zaCAteAotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotIwotIyBBdXRob3I6IGJyaWFub2xzb25AZ29vZ2xlLmNvbSAoQnJpYW4gT2xzb24pCi0jCi0jIFRlc3QgY29tcGF0aWJpbGl0eSBiZXR3ZWVuIGNvbW1hbmQgbGluZSBnemlwL2d1bnppcCBiaW5hcmllcyBhbmQKLSMgWmVyb0NvcHlTdHJlYW0gdmVyc2lvbnMuCi0KLVRFU1RGSUxFPU1ha2VmaWxlCi0KLSguL3pjZ3ppcCA8ICR7VEVTVEZJTEV9IHwgZ3VuemlwIHwgY21wIC0gJHtURVNURklMRX0pICYmIFwKLShnemlwIDwgJHtURVNURklMRX0gfCAuL3pjZ3VuemlwIHwgY21wIC0gJHtURVNURklMRX0pCi0KLSMgUmVzdWx0IG9mICIoY21kKSAmJiAoY21kKSIgaW1wbGljaXRseSBiZWNvbWVzIHJlc3VsdCBvZiB0aGlzIHNjcmlwdAotIyBhbmQgdGh1cyB0aGUgdGVzdC4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkYzFmYzkxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcGFja2FnZV9pbmZvLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gVGhpcyBmaWxlIGV4aXN0cyBzb2xlbHkgdG8gZG9jdW1lbnQgdGhlIGdvb2dsZTo6cHJvdG9idWY6OmlvIG5hbWVzcGFjZS4KLS8vIEl0IGlzIG5vdCBjb21waWxlZCBpbnRvIGFueXRoaW5nLCBidXQgaXQgbWF5IGJlIHJlYWQgYnkgYW4gYXV0b21hdGVkCi0vLyBkb2N1bWVudGF0aW9uIGdlbmVyYXRvci4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci0KLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLS8vIEF1eGlsaWFyeSBjbGFzc2VzIHVzZWQgZm9yIEkvTy4KLS8vCi0vLyBUaGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkgdXNlcyB0aGUgY2xhc3NlcyBpbiB0aGlzIHBhY2thZ2UgdG8gZGVhbCB3aXRoCi0vLyBJL08gYW5kIGVuY29kaW5nL2RlY29kaW5nIHJhdyBieXRlcy4gIE1vc3QgdXNlcnMgd2lsbCBub3QgbmVlZCB0bwotLy8gZGVhbCB3aXRoIHRoaXMgcGFja2FnZS4gIEhvd2V2ZXIsIHVzZXJzIHdobyB3YW50IHRvIGFkYXB0IHRoZSBzeXN0ZW0gdG8KLS8vIHdvcmsgd2l0aCB0aGVpciBvd24gSS9PIGFic3RyYWN0aW9ucyAtLSBlLmcuLCB0byBhbGxvdyBQcm90b2NvbCBCdWZmZXJzCi0vLyB0byBiZSByZWFkIGZyb20gYSBkaWZmZXJlbnQga2luZCBvZiBpbnB1dCBzdHJlYW0gd2l0aG91dCB0aGUgbmVlZCBmb3IgYQotLy8gdGVtcG9yYXJ5IGJ1ZmZlciAtLSBzaG91bGQgdGFrZSBhIGNsb3NlciBsb29rLgotbmFtZXNwYWNlIGlvIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NTMyYjA5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYworKysgL2Rldi9udWxsCkBAIC0xLDM0NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbyB7Ci0KLVByaW50ZXI6OlByaW50ZXIoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY2hhciB2YXJpYWJsZV9kZWxpbWl0ZXIpCi0gICAgOiB2YXJpYWJsZV9kZWxpbWl0ZXJfKHZhcmlhYmxlX2RlbGltaXRlciksCi0gICAgICBvdXRwdXRfKG91dHB1dCksCi0gICAgICBidWZmZXJfKE5VTEwpLAotICAgICAgYnVmZmVyX3NpemVfKDApLAotICAgICAgb2Zmc2V0XygwKSwKLSAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAotICAgICAgZmFpbGVkXyhmYWxzZSksCi0gICAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8oTlVMTCkge30KLQotUHJpbnRlcjo6UHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlciwKLSAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbGxlY3RvciogYW5ub3RhdGlvbl9jb2xsZWN0b3IpCi0gICAgOiB2YXJpYWJsZV9kZWxpbWl0ZXJfKHZhcmlhYmxlX2RlbGltaXRlciksCi0gICAgICBvdXRwdXRfKG91dHB1dCksCi0gICAgICBidWZmZXJfKE5VTEwpLAotICAgICAgYnVmZmVyX3NpemVfKDApLAotICAgICAgb2Zmc2V0XygwKSwKLSAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAotICAgICAgZmFpbGVkXyhmYWxzZSksCi0gICAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8oYW5ub3RhdGlvbl9jb2xsZWN0b3IpIHt9Ci0KLVByaW50ZXI6On5QcmludGVyKCkgewotICAvLyBPbmx5IEJhY2tVcCgpIGlmIHdlIGhhdmUgY2FsbGVkIE5leHQoKSBhdCBsZWFzdCBvbmNlIGFuZCBuZXZlciBmYWlsZWQuCi0gIGlmIChidWZmZXJfc2l6ZV8gPiAwICYmICFmYWlsZWRfKSB7Ci0gICAgb3V0cHV0Xy0+QmFja1VwKGJ1ZmZlcl9zaXplXyk7Ci0gIH0KLX0KLQotYm9vbCBQcmludGVyOjpHZXRTdWJzdGl0dXRpb25SYW5nZShjb25zdCBjaGFyKiB2YXJuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYWlyPHNpemVfdCwgc2l6ZV90PiogcmFuZ2UpIHsKLSAgbWFwPHN0cmluZywgcGFpcjxzaXplX3QsIHNpemVfdD4gPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9Ci0gICAgICBzdWJzdGl0dXRpb25zXy5maW5kKHZhcm5hbWUpOwotICBpZiAoaXRlciA9PSBzdWJzdGl0dXRpb25zXy5lbmQoKSkgewotICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIFVuZGVmaW5lZCB2YXJpYWJsZSBpbiBhbm5vdGF0aW9uOiAiIDw8IHZhcm5hbWU7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGlmIChpdGVyLT5zZWNvbmQuZmlyc3QgPiBpdGVyLT5zZWNvbmQuc2Vjb25kKSB7Ci0gICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgVmFyaWFibGUgdXNlZCBmb3IgYW5ub3RhdGlvbiB1c2VkIG11bHRpcGxlIHRpbWVzOiAiCi0gICAgICAgICAgICAgICAgPDwgdmFybmFtZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgKnJhbmdlID0gaXRlci0+c2Vjb25kOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBQcmludGVyOjpBbm5vdGF0ZShjb25zdCBjaGFyKiBiZWdpbl92YXJuYW1lLCBjb25zdCBjaGFyKiBlbmRfdmFybmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgsIGNvbnN0IHZlY3RvcjxpbnQ+JiBwYXRoKSB7Ci0gIGlmIChhbm5vdGF0aW9uX2NvbGxlY3Rvcl8gPT0gTlVMTCkgewotICAgIC8vIENhbid0IGdlbmVyYXRlIHNpZ25hdHVyZXMgd2l0aCB0aGlzIFByaW50ZXIuCi0gICAgcmV0dXJuOwotICB9Ci0gIHBhaXI8c2l6ZV90LCBzaXplX3Q+IGJlZ2luLCBlbmQ7Ci0gIGlmICghR2V0U3Vic3RpdHV0aW9uUmFuZ2UoYmVnaW5fdmFybmFtZSwgJmJlZ2luKSB8fAotICAgICAgIUdldFN1YnN0aXR1dGlvblJhbmdlKGVuZF92YXJuYW1lLCAmZW5kKSkgewotICAgIHJldHVybjsKLSAgfQotICBpZiAoYmVnaW4uZmlyc3QgPiBlbmQuc2Vjb25kKSB7Ci0gICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgIEFubm90YXRpb24gaGFzIG5lZ2F0aXZlIGxlbmd0aCBmcm9tICIgPDwgYmVnaW5fdmFybmFtZQotICAgICAgICAgICAgICAgIDw8ICIgdG8gIiA8PCBlbmRfdmFybmFtZTsKLSAgfSBlbHNlIHsKLSAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8tPkFkZEFubm90YXRpb24oYmVnaW4uZmlyc3QsIGVuZC5zZWNvbmQsIGZpbGVfcGF0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0aCk7Ci0gIH0KLX0KLQotdm9pZCBQcmludGVyOjpQcmludChjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsIGNvbnN0IGNoYXIqIHRleHQpIHsKLSAgaW50IHNpemUgPSBzdHJsZW4odGV4dCk7Ci0gIGludCBwb3MgPSAwOyAgLy8gVGhlIG51bWJlciBvZiBieXRlcyB3ZSd2ZSB3cml0dGVuIHNvIGZhci4KLSAgc3Vic3RpdHV0aW9uc18uY2xlYXIoKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgIGlmICh0ZXh0W2ldID09ICdcbicpIHsKLSAgICAgIC8vIFNhdyBuZXdsaW5lLiAgSWYgdGhlcmUgaXMgbW9yZSB0ZXh0LCB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgYW4gaW5kZW50Ci0gICAgICAvLyBoZXJlLiAgU28sIHdyaXRlIHdoYXQgd2UgaGF2ZSBzbyBmYXIsIGluY2x1ZGluZyB0aGUgJ1xuJy4KLSAgICAgIFdyaXRlUmF3KHRleHQgKyBwb3MsIGkgLSBwb3MgKyAxKTsKLSAgICAgIHBvcyA9IGkgKyAxOwotCi0gICAgICAvLyBTZXR0aW5nIHRoaXMgdHJ1ZSB3aWxsIGNhdXNlIHRoZSBuZXh0IFdyaXRlUmF3KCkgdG8gaW5zZXJ0IGFuIGluZGVudAotICAgICAgLy8gZmlyc3QuCi0gICAgICBhdF9zdGFydF9vZl9saW5lXyA9IHRydWU7Ci0KLSAgICB9IGVsc2UgaWYgKHRleHRbaV0gPT0gdmFyaWFibGVfZGVsaW1pdGVyXykgewotICAgICAgLy8gU2F3IHRoZSBzdGFydCBvZiBhIHZhcmlhYmxlIG5hbWUuCi0KLSAgICAgIC8vIFdyaXRlIHdoYXQgd2UgaGF2ZSBzbyBmYXIuCi0gICAgICBXcml0ZVJhdyh0ZXh0ICsgcG9zLCBpIC0gcG9zKTsKLSAgICAgIHBvcyA9IGkgKyAxOwotCi0gICAgICAvLyBGaW5kIGNsb3NpbmcgZGVsaW1pdGVyLgotICAgICAgY29uc3QgY2hhciogZW5kID0gc3RyY2hyKHRleHQgKyBwb3MsIHZhcmlhYmxlX2RlbGltaXRlcl8pOwotICAgICAgaWYgKGVuZCA9PSBOVUxMKSB7Ci0gICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIFVuY2xvc2VkIHZhcmlhYmxlIG5hbWUuIjsKLSAgICAgICAgZW5kID0gdGV4dCArIHBvczsKLSAgICAgIH0KLSAgICAgIGludCBlbmRwb3MgPSBlbmQgLSB0ZXh0OwotCi0gICAgICBzdHJpbmcgdmFybmFtZSh0ZXh0ICsgcG9zLCBlbmRwb3MgLSBwb3MpOwotICAgICAgaWYgKHZhcm5hbWUuZW1wdHkoKSkgewotICAgICAgICAvLyBUd28gZGVsaW1pdGVycyBpbiBhIHJvdyByZWR1Y2UgdG8gYSBsaXRlcmFsIGRlbGltaXRlciBjaGFyYWN0ZXIuCi0gICAgICAgIFdyaXRlUmF3KCZ2YXJpYWJsZV9kZWxpbWl0ZXJfLCAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFJlcGxhY2Ugd2l0aCB0aGUgdmFyaWFibGUncyB2YWx1ZS4KLSAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IHZhcmlhYmxlcy5maW5kKHZhcm5hbWUpOwotICAgICAgICBpZiAoaXRlciA9PSB2YXJpYWJsZXMuZW5kKCkpIHsKLSAgICAgICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIiBVbmRlZmluZWQgdmFyaWFibGU6ICIgPDwgdmFybmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzaXplX3QgYmVnaW4gPSBvZmZzZXRfOwotICAgICAgICAgIFdyaXRlUmF3KGl0ZXItPnNlY29uZC5kYXRhKCksIGl0ZXItPnNlY29uZC5zaXplKCkpOwotICAgICAgICAgIHBhaXI8bWFwPHN0cmluZywgcGFpcjxzaXplX3QsIHNpemVfdD4gPjo6aXRlcmF0b3IsIGJvb2w+IGluc2VydGVkID0KLSAgICAgICAgICAgICAgc3Vic3RpdHV0aW9uc18uaW5zZXJ0KAotICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIodmFybmFtZSwgc3RkOjptYWtlX3BhaXIoYmVnaW4sIG9mZnNldF8pKSk7Ci0gICAgICAgICAgaWYgKCFpbnNlcnRlZC5zZWNvbmQpIHsKLSAgICAgICAgICAgIC8vIFRoaXMgdmFyaWFibGUgd2FzIHVzZWQgbXVsdGlwbGUgdGltZXMuICBNYWtlIGl0cyBzcGFuIGhhdmUKLSAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGxlbmd0aCBzbyB3ZSBjYW4gZGV0ZWN0IGl0IGlmIGl0IGdldHMgdXNlZCBpbiBhbgotICAgICAgICAgICAgLy8gYW5ub3RhdGlvbi4KLSAgICAgICAgICAgIGluc2VydGVkLmZpcnN0LT5zZWNvbmQgPSBzdGQ6Om1ha2VfcGFpcigxLCAwKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gQWR2YW5jZSBwYXN0IHRoaXMgdmFyaWFibGUuCi0gICAgICBpID0gZW5kcG9zOwotICAgICAgcG9zID0gZW5kcG9zICsgMTsKLSAgICB9Ci0gIH0KLQotICAvLyBXcml0ZSB0aGUgcmVzdC4KLSAgV3JpdGVSYXcodGV4dCArIHBvcywgc2l6ZSAtIHBvcyk7Ci19Ci0KLXZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCkgewotICBzdGF0aWMgbWFwPHN0cmluZywgc3RyaW5nPiBlbXB0eTsKLSAgUHJpbnQoZW1wdHksIHRleHQpOwotfQotCi12b2lkIFByaW50ZXI6OlByaW50KGNvbnN0IGNoYXIqIHRleHQsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlLCBjb25zdCBzdHJpbmcmIHZhbHVlKSB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1t2YXJpYWJsZV0gPSB2YWx1ZTsKLSAgUHJpbnQodmFycywgdGV4dCk7Ci19Ci0KLXZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMikgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKLSAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOwotICBQcmludCh2YXJzLCB0ZXh0KTsKLX0KLQotdm9pZCBQcmludGVyOjpQcmludChjb25zdCBjaGFyKiB0ZXh0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTMsIGNvbnN0IHN0cmluZyYgdmFsdWUzKSB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1t2YXJpYWJsZTFdID0gdmFsdWUxOwotICB2YXJzW3ZhcmlhYmxlMl0gPSB2YWx1ZTI7Ci0gIHZhcnNbdmFyaWFibGUzXSA9IHZhbHVlMzsKLSAgUHJpbnQodmFycywgdGV4dCk7Ci19Ci0KLXZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCkgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKLSAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOwotICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7Ci0gIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKLSAgUHJpbnQodmFycywgdGV4dCk7Ci19Ci0KLXZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSkgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKLSAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOwotICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7Ci0gIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKLSAgdmFyc1t2YXJpYWJsZTVdID0gdmFsdWU1OwotICBQcmludCh2YXJzLCB0ZXh0KTsKLX0KLQotdm9pZCBQcmludGVyOjpQcmludChjb25zdCBjaGFyKiB0ZXh0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTMsIGNvbnN0IHN0cmluZyYgdmFsdWUzLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTQsIGNvbnN0IHN0cmluZyYgdmFsdWU0LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTUsIGNvbnN0IHN0cmluZyYgdmFsdWU1LAotICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTYsIGNvbnN0IHN0cmluZyYgdmFsdWU2KSB7Ci0gIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgdmFyc1t2YXJpYWJsZTFdID0gdmFsdWUxOwotICB2YXJzW3ZhcmlhYmxlMl0gPSB2YWx1ZTI7Ci0gIHZhcnNbdmFyaWFibGUzXSA9IHZhbHVlMzsKLSAgdmFyc1t2YXJpYWJsZTRdID0gdmFsdWU0OwotICB2YXJzW3ZhcmlhYmxlNV0gPSB2YWx1ZTU7Ci0gIHZhcnNbdmFyaWFibGU2XSA9IHZhbHVlNjsKLSAgUHJpbnQodmFycywgdGV4dCk7Ci19Ci0KLXZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU2LCBjb25zdCBzdHJpbmcmIHZhbHVlNiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU3LCBjb25zdCBzdHJpbmcmIHZhbHVlNykgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKLSAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOwotICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7Ci0gIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKLSAgdmFyc1t2YXJpYWJsZTVdID0gdmFsdWU1OwotICB2YXJzW3ZhcmlhYmxlNl0gPSB2YWx1ZTY7Ci0gIHZhcnNbdmFyaWFibGU3XSA9IHZhbHVlNzsKLSAgUHJpbnQodmFycywgdGV4dCk7Ci19Ci0KLXZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU2LCBjb25zdCBzdHJpbmcmIHZhbHVlNiwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU3LCBjb25zdCBzdHJpbmcmIHZhbHVlNywKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU4LCBjb25zdCBzdHJpbmcmIHZhbHVlOCkgewotICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKLSAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOwotICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7Ci0gIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKLSAgdmFyc1t2YXJpYWJsZTVdID0gdmFsdWU1OwotICB2YXJzW3ZhcmlhYmxlNl0gPSB2YWx1ZTY7Ci0gIHZhcnNbdmFyaWFibGU3XSA9IHZhbHVlNzsKLSAgdmFyc1t2YXJpYWJsZThdID0gdmFsdWU4OwotICBQcmludCh2YXJzLCB0ZXh0KTsKLX0KLQotdm9pZCBQcmludGVyOjpJbmRlbnQoKSB7Ci0gIGluZGVudF8gKz0gIiAgIjsKLX0KLQotdm9pZCBQcmludGVyOjpPdXRkZW50KCkgewotICBpZiAoaW5kZW50Xy5lbXB0eSgpKSB7Ci0gICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgT3V0ZGVudCgpIHdpdGhvdXQgbWF0Y2hpbmcgSW5kZW50KCkuIjsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpbmRlbnRfLnJlc2l6ZShpbmRlbnRfLnNpemUoKSAtIDIpOwotfQotCi12b2lkIFByaW50ZXI6OlByaW50UmF3KGNvbnN0IHN0cmluZyYgZGF0YSkgewotICBXcml0ZVJhdyhkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotfQotCi12b2lkIFByaW50ZXI6OlByaW50UmF3KGNvbnN0IGNoYXIqIGRhdGEpIHsKLSAgaWYgKGZhaWxlZF8pIHJldHVybjsKLSAgV3JpdGVSYXcoZGF0YSwgc3RybGVuKGRhdGEpKTsKLX0KLQotdm9pZCBQcmludGVyOjpXcml0ZVJhdyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSkgewotICBpZiAoZmFpbGVkXykgcmV0dXJuOwotICBpZiAoc2l6ZSA9PSAwKSByZXR1cm47Ci0KLSAgaWYgKGF0X3N0YXJ0X29mX2xpbmVfICYmIChzaXplID4gMCkgJiYgKGRhdGFbMF0gIT0gJ1xuJykpIHsKLSAgICAvLyBJbnNlcnQgYW4gaW5kZW50LgotICAgIGF0X3N0YXJ0X29mX2xpbmVfID0gZmFsc2U7Ci0gICAgV3JpdGVSYXcoaW5kZW50Xy5kYXRhKCksIGluZGVudF8uc2l6ZSgpKTsKLSAgICBpZiAoZmFpbGVkXykgcmV0dXJuOwotICB9Ci0KLSAgd2hpbGUgKHNpemUgPiBidWZmZXJfc2l6ZV8pIHsKLSAgICAvLyBEYXRhIGV4Y2VlZHMgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBjYW4gYW5kIHJlcXVlc3QgYQotICAgIC8vIG5ldyBidWZmZXIuCi0gICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIGJ1ZmZlcl9zaXplXyk7Ci0gICAgb2Zmc2V0XyArPSBidWZmZXJfc2l6ZV87Ci0gICAgZGF0YSArPSBidWZmZXJfc2l6ZV87Ci0gICAgc2l6ZSAtPSBidWZmZXJfc2l6ZV87Ci0gICAgdm9pZCogdm9pZF9idWZmZXI7Ci0gICAgZmFpbGVkXyA9ICFvdXRwdXRfLT5OZXh0KCZ2b2lkX2J1ZmZlciwgJmJ1ZmZlcl9zaXplXyk7Ci0gICAgaWYgKGZhaWxlZF8pIHJldHVybjsKLSAgICBidWZmZXJfID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4odm9pZF9idWZmZXIpOwotICB9Ci0KLSAgLy8gQnVmZmVyIGlzIGJpZyBlbm91Z2ggdG8gcmVjZWl2ZSB0aGUgZGF0YTsgY29weSBpdC4KLSAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIHNpemUpOwotICBidWZmZXJfICs9IHNpemU7Ci0gIGJ1ZmZlcl9zaXplXyAtPSBzaXplOwotICBvZmZzZXRfICs9IHNpemU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYmE4NDU1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oCisrKyAvZGV2L251bGwKQEAgLTEsMzMzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBVdGlsaXR5IGNsYXNzIGZvciB3cml0aW5nIHRleHQgdG8gYSBaZXJvQ29weU91dHB1dFN0cmVhbS4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fUFJJTlRFUl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX1BSSU5URVJfSF9fCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbyB7Ci0KLWNsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOyAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCi0KLS8vIFJlY29yZHMgYW5ub3RhdGlvbnMgYWJvdXQgYSBQcmludGVyJ3Mgb3V0cHV0LgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEFubm90YXRpb25Db2xsZWN0b3IgewotIHB1YmxpYzoKLSAgLy8gUmVjb3JkcyB0aGF0IHRoZSBieXRlcyBpbiBmaWxlX3BhdGggYmVnaW5uaW5nIHdpdGggYmVnaW5fb2Zmc2V0IGFuZCBlbmRpbmcKLSAgLy8gYmVmb3JlIGVuZF9vZmZzZXQgYXJlIGFzc29jaWF0ZWQgd2l0aCB0aGUgU291cmNlQ29kZUluZm8tc3R5bGUgcGF0aC4KLSAgdmlydHVhbCB2b2lkIEFkZEFubm90YXRpb24oc2l6ZV90IGJlZ2luX29mZnNldCwgc2l6ZV90IGVuZF9vZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50PiYgcGF0aCkgPSAwOwotCi0gIHZpcnR1YWwgfkFubm90YXRpb25Db2xsZWN0b3IoKSB7fQotfTsKLQotLy8gUmVjb3JkcyBhbm5vdGF0aW9ucyBhYm91dCBhIFByaW50ZXIncyBvdXRwdXQgdG8gdGhlIGdpdmVuIHByb3RvY29sIGJ1ZmZlciwKLS8vIGFzc3VtaW5nIHRoYXQgdGhlIGJ1ZmZlciBoYXMgYW4gOjpBbm5vdGF0aW9uIG1lc3NhZ2UgZXhwb3NpbmcgcGF0aCwKLS8vIHNvdXJjZV9maWxlLCBiZWdpbiBhbmQgZW5kIGZpZWxkcy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBbm5vdGF0aW9uUHJvdG8+Ci1jbGFzcyBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3IgOiBwdWJsaWMgQW5ub3RhdGlvbkNvbGxlY3RvciB7Ci0gcHVibGljOgotICAvLyBhbm5vdGF0aW9uX3Byb3RvIGlzIHRoZSBwcm90b2NvbCBidWZmZXIgdG8gd2hpY2ggbmV3IEFubm90YXRpb25zIHNob3VsZCBiZQotICAvLyBhZGRlZC4gSXQgaXMgbm90IG93bmVkIGJ5IHRoZSBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3IuCi0gIGV4cGxpY2l0IEFubm90YXRpb25Qcm90b0NvbGxlY3RvcihBbm5vdGF0aW9uUHJvdG8qIGFubm90YXRpb25fcHJvdG8pCi0gICAgICA6IGFubm90YXRpb25fcHJvdG9fKGFubm90YXRpb25fcHJvdG8pIHt9Ci0KLSAgLy8gT3ZlcnJpZGUgZm9yIEFubm90YXRpb25Db2xsZWN0b3I6OkFkZEFubm90YXRpb24uCi0gIHZpcnR1YWwgdm9pZCBBZGRBbm5vdGF0aW9uKHNpemVfdCBiZWdpbl9vZmZzZXQsIHNpemVfdCBlbmRfb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCwgY29uc3QgdmVjdG9yPGludD4mIHBhdGgpIHsKLSAgICB0eXBlbmFtZSBBbm5vdGF0aW9uUHJvdG86OkFubm90YXRpb24qIGFubm90YXRpb24gPQotICAgICAgICBhbm5vdGF0aW9uX3Byb3RvXy0+YWRkX2Fubm90YXRpb24oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhdGguc2l6ZSgpOyArK2kpIHsKLSAgICAgIGFubm90YXRpb24tPmFkZF9wYXRoKHBhdGhbaV0pOwotICAgIH0KLSAgICBhbm5vdGF0aW9uLT5zZXRfc291cmNlX2ZpbGUoZmlsZV9wYXRoKTsKLSAgICBhbm5vdGF0aW9uLT5zZXRfYmVnaW4oYmVnaW5fb2Zmc2V0KTsKLSAgICBhbm5vdGF0aW9uLT5zZXRfZW5kKGVuZF9vZmZzZXQpOwotICB9Ci0KLSBwcml2YXRlOgotICAvLyBUaGUgcHJvdG9jb2wgYnVmZmVyIHRvIHdoaWNoIG5ldyBhbm5vdGF0aW9ucyBzaG91bGQgYmUgYWRkZWQuCi0gIEFubm90YXRpb25Qcm90byogY29uc3QgYW5ub3RhdGlvbl9wcm90b187Ci19OwotCi0vLyBUaGlzIHNpbXBsZSB1dGlsaXR5IGNsYXNzIGFzc2lzdHMgaW4gY29kZSBnZW5lcmF0aW9uLiAgSXQgYmFzaWNhbGx5Ci0vLyBhbGxvd3MgdGhlIGNhbGxlciB0byBkZWZpbmUgYSBzZXQgb2YgdmFyaWFibGVzIGFuZCB0aGVuIG91dHB1dCBzb21lCi0vLyB0ZXh0IHdpdGggdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIEV4YW1wbGUgdXNhZ2U6Ci0vLwotLy8gICBQcmludGVyIHByaW50ZXIob3V0cHV0LCAnJCcpOwotLy8gICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0vLyAgIHZhcnNbIm5hbWUiXSA9ICJCb2IiOwotLy8gICBwcmludGVyLlByaW50KHZhcnMsICJNeSBuYW1lIGlzICRuYW1lJC4iKTsKLS8vCi0vLyBUaGUgYWJvdmUgd3JpdGVzICJNeSBuYW1lIGlzIEJvYi4iIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotLy8KLS8vIFByaW50ZXIgYWdncmVzc2l2ZWx5IGVuZm9yY2VzIGNvcnJlY3QgdXNhZ2UsIGNyYXNoaW5nICh3aXRoIGFzc2VydCBmYWlsdXJlcykKLS8vIGluIHRoZSBjYXNlIG9mIHVuZGVmaW5lZCB2YXJpYWJsZXMgaW4gZGVidWcgYnVpbGRzLiBUaGlzIGhlbHBzIGdyZWF0bHkgaW4KLS8vIGRlYnVnZ2luZyBjb2RlIHdoaWNoIHVzZXMgaXQuCi0vLwotLy8gSWYgYSBQcmludGVyIGlzIGNvbnN0cnVjdGVkIHdpdGggYW4gQW5ub3RhdGlvbkNvbGxlY3RvciwgaXQgd2lsbCBwcm92aWRlIGl0Ci0vLyB3aXRoIGFubm90YXRpb25zIHRoYXQgY29ubmVjdCB0aGUgUHJpbnRlcidzIG91dHB1dCB0byBwYXRocyB0aGF0IGNhbiBpZGVudGlmeQotLy8gdmFyaW91cyBkZXNjcmlwdG9ycy4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCBpZiBwZXJzb25fIGlzIGEgZGVzY3JpcHRvciB0aGF0Ci0vLyBpZGVudGlmaWVzIEJvYiwgd2UgY2FuIGFzc29jaWF0ZSB0aGUgb3V0cHV0IHN0cmluZyAiTXkgbmFtZSBpcyBCb2IuIiB3aXRoCi0vLyBhIHNvdXJjZSBwYXRoIHBvaW50aW5nIHRvIHRoYXQgZGVzY3JpcHRvciB3aXRoOgotLy8KLS8vICAgcHJpbnRlci5Bbm5vdGF0ZSgibmFtZSIsIHBlcnNvbl8pOwotLy8KLS8vIFRoZSBBbm5vdGF0aW9uQ29sbGVjdG9yIHdpbGwgYmUgc2VudCBhbiBhbm5vdGF0aW9uIGxpbmtpbmcgdGhlIG91dHB1dCByYW5nZQotLy8gY292ZXJpbmcgIkJvYiIgdG8gdGhlIGxvZ2ljYWwgcGF0aCBwcm92aWRlZCBieSBwZXJzb25fLiAgVG9vbHMgbWF5IHVzZQotLy8gdGhpcyBhc3NvY2lhdGlvbiB0byAoZm9yIGV4YW1wbGUpIGxpbmsgIkJvYiIgaW4gdGhlIG91dHB1dCBiYWNrIHRvIHRoZQotLy8gc291cmNlIGZpbGUgdGhhdCBkZWZpbmVkIHRoZSBwZXJzb25fIGRlc2NyaXB0b3IgaWRlbnRpZnlpbmcgQm9iLgotLy8KLS8vIEFubm90YXRlIGNhbiBvbmx5IGV4YW1pbmUgdmFyaWFibGVzIHN1YnN0aXR1dGVkIGR1cmluZyB0aGUgbGFzdCBjYWxsIHRvCi0vLyBQcmludC4gIEl0IGlzIGludmFsaWQgdG8gcmVmZXIgdG8gYSB2YXJpYWJsZSB0aGF0IHdhcyB1c2VkIG11bHRpcGxlIHRpbWVzCi0vLyBpbiBhIHNpbmdsZSBQcmludCBjYWxsLgotLy8KLS8vIEluIGZ1bGwgZ2VuZXJhbGl0eSwgb25lIG1heSBzcGVjaWZ5IGEgcmFuZ2Ugb2Ygb3V0cHV0IHRleHQgdXNpbmcgYSBiZWdpbm5pbmcKLS8vIHN1YnN0aXR1dGlvbiB2YXJpYWJsZSBhbmQgYW4gZW5kaW5nIHZhcmlhYmxlLiAgVGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uIHdpbGwKLS8vIHNwYW4gZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdGl0dXRlZCB2YWx1ZSBmb3IgdGhlIGJlZ2lubmluZwotLy8gdmFyaWFibGUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdGl0dXRlZCB2YWx1ZSBmb3IgdGhlIGVuZGluZwotLy8gdmFyaWFibGUuICBGb3IgZXhhbXBsZSwgdGhlIEFubm90YXRlIGNhbGwgYWJvdmUgaXMgZXF1aXZhbGVudCB0byB0aGlzIG9uZToKLS8vCi0vLyAgIHByaW50ZXIuQW5ub3RhdGUoIm5hbWUiLCAibmFtZSIsIHBlcnNvbl8pOwotLy8KLS8vIFRoaXMgaXMgdXNlZnVsIGlmIG11bHRpcGxlIHZhcmlhYmxlcyBjb21iaW5lIHRvIGZvcm0gYSBzaW5nbGUgc3BhbiBvZiBvdXRwdXQKLS8vIHRoYXQgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBwYXRoLiAgRm9yIGV4YW1wbGU6Ci0vLwotLy8gICBQcmludGVyIHByaW50ZXIob3V0cHV0LCAnJCcpOwotLy8gICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0vLyAgIHZhcnNbImZpcnN0Il0gPSAiQWxpY2UiOwotLy8gICB2YXJzWyJsYXN0Il0gPSAiU21pdGgiOwotLy8gICBwcmludGVyLlByaW50KHZhcnMsICJNeSBuYW1lIGlzICRmaXJzdCQgJGxhc3QkLiIpOwotLy8gICBwcmludGVyLkFubm90YXRlKCJmaXJzdCIsICJsYXN0IiwgcGVyc29uXyk7Ci0vLwotLy8gVGhpcyBjb2RlIHdvdWxkIGFzc29jaWF0ZSB0aGUgc3BhbiBjb3ZlcmluZyAiQWxpY2UgU21pdGgiIGluIHRoZSBvdXRwdXQgd2l0aAotLy8gdGhlIHBlcnNvbl8gZGVzY3JpcHRvci4KLS8vCi0vLyBOb3RlIHRoYXQgdGhlIGJlZ2lubmluZyB2YXJpYWJsZSBtdXN0IGNvbWUgYmVmb3JlIChvciBvdmVybGFwIHdpdGgsIGluIHRoZQotLy8gY2FzZSBvZiB6ZXJvLXNpemVkIHN1YnN0aXR1dGlvbiB2YWx1ZXMpIHRoZSBlbmRpbmcgdmFyaWFibGUuCi0vLwotLy8gSXQgaXMgYWxzbyBzb21ldGltZXMgdXNlZnVsIHRvIHVzZSB2YXJpYWJsZXMgd2l0aCB6ZXJvLXNpemVkIHZhbHVlcyBhcwotLy8gbWFya2Vycy4gIFRoaXMgYXZvaWRzIGlzc3VlcyB3aXRoIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgdmFyaWFibGUKLS8vIGFuZCBhbHNvIGFsbG93cyBhbm5vdGF0aW9uIHJhbmdlcyB0byBzcGFuIGxpdGVyYWwgdGV4dCBmcm9tIHRoZSBQcmludAotLy8gdGVtcGxhdGVzOgotLy8KLS8vICAgUHJpbnRlciBwcmludGVyKG91dHB1dCwgJyQnKTsKLS8vICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotLy8gICB2YXJzWyJmb28iXSA9ICJiYXIiOwotLy8gICB2YXJzWyJmdW5jdGlvbiJdID0gImNhbGwiOwotLy8gICB2YXJzWyJtYXJrIl0gPSAiIjsKLS8vICAgcHJpbnRlci5QcmludCh2YXJzLCAiJGZ1bmN0aW9uJCgkZm9vJCwkZm9vJCkkbWFyayQiKTsKLS8vICAgcHJpbnRlci5Bbm5vdGF0ZSgiZnVuY3Rpb24iLCAicm1hcmsiLCBjYWxsXyk7Ci0vLwotLy8gVGhpcyBjb2RlIGFzc29jaWF0ZXMgdGhlIHNwYW4gY292ZXJpbmcgImNhbGwoYmFyLGJhcikiIGluIHRoZSBvdXRwdXQgd2l0aCB0aGUKLS8vIGNhbGxfIGRlc2NyaXB0b3IuCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBQcmludGVyIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZSBhIHByaW50ZXIgdGhhdCB3cml0ZXMgdGV4dCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4gIFVzZSB0aGUKLSAgLy8gZ2l2ZW4gY2hhcmFjdGVyIGFzIHRoZSBkZWxpbWl0ZXIgZm9yIHZhcmlhYmxlcy4KLSAgUHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlcik7Ci0KLSAgLy8gQ3JlYXRlIGEgcHJpbnRlciB0aGF0IHdyaXRlcyB0ZXh0IHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLiAgVXNlIHRoZQotICAvLyBnaXZlbiBjaGFyYWN0ZXIgYXMgdGhlIGRlbGltaXRlciBmb3IgdmFyaWFibGVzLiAgSWYgYW5ub3RhdGlvbl9jb2xsZWN0b3IKLSAgLy8gaXMgbm90IG51bGwsIFByaW50ZXIgd2lsbCBwcm92aWRlIGl0IHdpdGggYW5ub3RhdGlvbnMgYWJvdXQgY29kZSB3cml0dGVuCi0gIC8vIHRvIHRoZSBzdHJlYW0uICBhbm5vdGF0aW9uX2NvbGxlY3RvciBpcyBub3Qgb3duZWQgYnkgUHJpbnRlci4KLSAgUHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlciwKLSAgICAgICAgICBBbm5vdGF0aW9uQ29sbGVjdG9yKiBhbm5vdGF0aW9uX2NvbGxlY3Rvcik7Ci0KLSAgflByaW50ZXIoKTsKLQotICAvLyBMaW5rIGEgc3Vic2l0dXRpb24gdmFyaWFibGUgZW1pdHRlZCBieSB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBvYmplY3QKLSAgLy8gZGVzY3JpYmVkIGJ5IGRlc2NyaXB0b3IuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBTb21lRGVzY3JpcHRvcj4KLSAgdm9pZCBBbm5vdGF0ZShjb25zdCBjaGFyKiB2YXJuYW1lLCBjb25zdCBTb21lRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICAgIEFubm90YXRlKHZhcm5hbWUsIHZhcm5hbWUsIGRlc2NyaXB0b3IpOwotICB9Ci0KLSAgLy8gTGluayB0aGUgb3V0cHV0IHJhbmdlIGRlZmluZWQgYnkgdGhlIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgYXMgZW1pdHRlZCBieQotICAvLyB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBvYmplY3QgZGVzY3JpYmVkIGJ5IGRlc2NyaXB0b3IuIFRoZSByYW5nZQotICAvLyBiZWdpbnMgYXQgYmVnaW5fdmFybmFtZSdzIHZhbHVlIGFuZCBlbmRzIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKLSAgLy8gdmFsdWUgc3Vic3RpdHV0ZWQgZm9yIGVuZF92YXJuYW1lLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU29tZURlc2NyaXB0b3I+Ci0gIHZvaWQgQW5ub3RhdGUoY29uc3QgY2hhciogYmVnaW5fdmFybmFtZSwgY29uc3QgY2hhciogZW5kX3Zhcm5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3QgU29tZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgICBpZiAoYW5ub3RhdGlvbl9jb2xsZWN0b3JfID09IE5VTEwpIHsKLSAgICAgIC8vIEFubm90YXRpb25zIGFyZW4ndCB0dXJuZWQgb24gZm9yIHRoaXMgUHJpbnRlciwgc28gZG9uJ3QgcGF5IHRoZSBjb3N0Ci0gICAgICAvLyBvZiBidWlsZGluZyB0aGUgbG9jYXRpb24gcGF0aC4KLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgdmVjdG9yPGludD4gcGF0aDsKLSAgICBkZXNjcmlwdG9yLT5HZXRMb2NhdGlvblBhdGgoJnBhdGgpOwotICAgIEFubm90YXRlKGJlZ2luX3Zhcm5hbWUsIGVuZF92YXJuYW1lLCBkZXNjcmlwdG9yLT5maWxlKCktPm5hbWUoKSwgcGF0aCk7Ci0gIH0KLQotICAvLyBQcmludCBzb21lIHRleHQgYWZ0ZXIgYXBwbHlpbmcgdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIElmIGEgcGFydGljdWxhcgotICAvLyB2YXJpYWJsZSBpbiB0aGUgdGV4dCBpcyBub3QgZGVmaW5lZCwgdGhpcyB3aWxsIGNyYXNoLiAgVmFyaWFibGVzIHRvIGJlCi0gIC8vIHN1YnN0aXR1dGVkIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIG5hbWVzIHN1cnJvdW5kZWQgYnkgZGVsaW1pdGVyCi0gIC8vIGNoYXJhY3RlcnMgKGFzIGdpdmVuIHRvIHRoZSBjb25zdHJ1Y3RvcikuICBUaGUgdmFyaWFibGUgYmluZGluZ3MgYXJlCi0gIC8vIGRlZmluZWQgYnkgdGhlIGdpdmVuIG1hcC4KLSAgdm9pZCBQcmludChjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsIGNvbnN0IGNoYXIqIHRleHQpOwotCi0gIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KLSAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0KTsKLSAgLy8gTGlrZSB0aGUgZmlyc3QgUHJpbnQoKSwgZXhjZXB0IHRoZSBzdWJzdGl0dXRpb25zIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzLgotICB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIHZhcmlhYmxlLCBjb25zdCBzdHJpbmcmIHZhbHVlKTsKLSAgLy8gTGlrZSB0aGUgZmlyc3QgUHJpbnQoKSwgZXhjZXB0IHRoZSBzdWJzdGl0dXRpb25zIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzLgotICB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIHZhcmlhYmxlMSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMik7Ci0gIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KLSAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMyk7Ci0gIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KLSAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTQsIGNvbnN0IHN0cmluZyYgdmFsdWU0KTsKLSAgLy8gTGlrZSB0aGUgZmlyc3QgUHJpbnQoKSwgZXhjZXB0IHRoZSBzdWJzdGl0dXRpb25zIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzLgotICB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIHZhcmlhYmxlMSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTMsIGNvbnN0IHN0cmluZyYgdmFsdWUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNCwgY29uc3Qgc3RyaW5nJiB2YWx1ZTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSk7Ci0gIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KLSAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTQsIGNvbnN0IHN0cmluZyYgdmFsdWU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU2LCBjb25zdCBzdHJpbmcmIHZhbHVlNik7Ci0gIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KLSAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTQsIGNvbnN0IHN0cmluZyYgdmFsdWU0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU2LCBjb25zdCBzdHJpbmcmIHZhbHVlNiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTcsIGNvbnN0IHN0cmluZyYgdmFsdWU3KTsKLSAgLy8gTGlrZSB0aGUgZmlyc3QgUHJpbnQoKSwgZXhjZXB0IHRoZSBzdWJzdGl0dXRpb25zIGFyZSBnaXZlbiBhcyBwYXJhbWV0ZXJzLgotICB2b2lkIFByaW50KGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IGNoYXIqIHZhcmlhYmxlMSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTMsIGNvbnN0IHN0cmluZyYgdmFsdWUzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNCwgY29uc3Qgc3RyaW5nJiB2YWx1ZTQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTYsIGNvbnN0IHN0cmluZyYgdmFsdWU2LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNywgY29uc3Qgc3RyaW5nJiB2YWx1ZTcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU4LCBjb25zdCBzdHJpbmcmIHZhbHVlOCk7Ci0KLSAgLy8gSW5kZW50IHRleHQgYnkgdHdvIHNwYWNlcy4gIEFmdGVyIGNhbGxpbmcgSW5kZW50KCksIHR3byBzcGFjZXMgd2lsbCBiZQotICAvLyBpbnNlcnRlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvZiB0ZXh0LiAgSW5kZW50KCkgbWF5IGJlIGNhbGxlZAotICAvLyBtdWx0aXBsZSB0aW1lcyB0byBwcm9kdWNlIGRlZXBlciBpbmRlbnRzLgotICB2b2lkIEluZGVudCgpOwotCi0gIC8vIFJlZHVjZXMgdGhlIGN1cnJlbnQgaW5kZW50IGxldmVsIGJ5IHR3byBzcGFjZXMsIG9yIGNyYXNoZXMgaWYgdGhlIGluZGVudAotICAvLyBsZXZlbCBpcyB6ZXJvLgotICB2b2lkIE91dGRlbnQoKTsKLQotICAvLyBXcml0ZSBhIHN0cmluZyB0byB0aGUgb3V0cHV0IGJ1ZmZlci4KLSAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgbG9vayBmb3IgbmV3bGluZXMgdG8gYWRkIGluZGVudGF0aW9uLgotICB2b2lkIFByaW50UmF3KGNvbnN0IHN0cmluZyYgZGF0YSk7Ci0KLSAgLy8gV3JpdGUgYSB6ZXJvLWRlbGltaXRlZCBzdHJpbmcgdG8gb3V0cHV0IGJ1ZmZlci4KLSAgLy8gVGhpcyBtZXRob2QgZG9lcyBub3QgbG9vayBmb3IgbmV3bGluZXMgdG8gYWRkIGluZGVudGF0aW9uLgotICB2b2lkIFByaW50UmF3KGNvbnN0IGNoYXIqIGRhdGEpOwotCi0gIC8vIFdyaXRlIHNvbWUgYnl0ZXMgdG8gdGhlIG91dHB1dCBidWZmZXIuCi0gIC8vIFRoaXMgbWV0aG9kIGRvZXMgbm90IGxvb2sgZm9yIG5ld2xpbmVzIHRvIGFkZCBpbmRlbnRhdGlvbi4KLSAgdm9pZCBXcml0ZVJhdyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSk7Ci0KLSAgLy8gVHJ1ZSBpZiBhbnkgd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGZhaWxlZC4gIChXZSBkb24ndCBqdXN0Ci0gIC8vIGNyYXNoIGluIHRoaXMgY2FzZSBiZWNhdXNlIHRoaXMgaXMgYW4gSS9PIGZhaWx1cmUsIG5vdCBhIHByb2dyYW1taW5nCi0gIC8vIGVycm9yLikKLSAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiBmYWlsZWRfOyB9Ci0KLSBwcml2YXRlOgotICAvLyBMaW5rIHRoZSBvdXRwdXQgcmFuZ2UgZGVmaW5lZCBieSB0aGUgc3Vic3RpdHV0aW9uIHZhcmlhYmxlcyBhcyBlbWl0dGVkIGJ5Ci0gIC8vIHRoZSBsYXN0IGNhbGwgdG8gUHJpbnQgdG8gdGhlIG9iamVjdCBmb3VuZCBhdCB0aGUgU291cmNlQ29kZUluZm8tc3R5bGUgcGF0aAotICAvLyBpbiBhIGZpbGUgd2l0aCBwYXRoIGZpbGVfcGF0aC4gVGhlIHJhbmdlIGJlZ2lucyBhdCB0aGUgc3RhcnQgb2YKLSAgLy8gYmVnaW5fdmFybmFtZSdzIHZhbHVlIGFuZCBlbmRzIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUgdmFsdWUKLSAgLy8gc3Vic3RpdHV0ZWQgZm9yIGVuZF92YXJuYW1lLiBOb3RlIHRoYXQgYmVnaW5fdmFybmFtZSBhbmQgZW5kX3Zhcm5hbWUKLSAgLy8gbWF5IHJlZmVyIHRvIHRoZSBzYW1lIHZhcmlhYmxlLgotICB2b2lkIEFubm90YXRlKGNvbnN0IGNoYXIqIGJlZ2luX3Zhcm5hbWUsIGNvbnN0IGNoYXIqIGVuZF92YXJuYW1lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoLCBjb25zdCB2ZWN0b3I8aW50PiYgcGF0aCk7Ci0KLSAgY29uc3QgY2hhciB2YXJpYWJsZV9kZWxpbWl0ZXJfOwotCi0gIFplcm9Db3B5T3V0cHV0U3RyZWFtKiBjb25zdCBvdXRwdXRfOwotICBjaGFyKiBidWZmZXJfOwotICBpbnQgYnVmZmVyX3NpemVfOwotICAvLyBUaGUgY3VycmVudCBwb3NpdGlvbiwgaW4gYnl0ZXMsIGluIHRoZSBvdXRwdXQgc3RyZWFtLiAgVGhpcyBpcyBlcXVpdmFsZW50Ci0gIC8vIHRvIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgdGhhdCBoYXZlIGJlZW4gd3JpdHRlbiBzbyBmYXIuICBUaGlzIHZhbHVlIGlzCi0gIC8vIHVzZWQgdG8gY2FsY3VsYXRlIGFubm90YXRpb24gcmFuZ2VzIGluIHRoZSBzdWJzdGl0dXRpb25zXyBtYXAgYmVsb3cuCi0gIHNpemVfdCBvZmZzZXRfOwotCi0gIHN0cmluZyBpbmRlbnRfOwotICBib29sIGF0X3N0YXJ0X29mX2xpbmVfOwotICBib29sIGZhaWxlZF87Ci0KLSAgLy8gQSBtYXAgZnJvbSB2YXJpYWJsZSBuYW1lIHRvIFtzdGFydCwgZW5kKSBvZmZzZXRzIGluIHRoZSBvdXRwdXQgYnVmZmVyLgotICAvLyBUaGVzZSByZWZlciB0byB0aGUgb2Zmc2V0cyB1c2VkIGZvciBhIHZhcmlhYmxlIGFmdGVyIHRoZSBsYXN0IGNhbGwgdG8KLSAgLy8gUHJpbnQuICBJZiBhIHZhcmlhYmxlIHdhcyB1c2VkIG1vcmUgdGhhbiBvbmNlLCB0aGUgZW50cnkgdXNlZCBpbgotICAvLyB0aGlzIG1hcCBpcyBzZXQgdG8gYSBuZWdhdGl2ZS1sZW5ndGggc3Bhbi4gIEZvciBzaW5nbHktdXNlZCB2YXJpYWJsZXMsIHRoZQotICAvLyBzdGFydCBvZmZzZXQgaXMgdGhlIGJlZ2lubmluZyBvZiB0aGUgc3Vic3RpdHV0aW9uOyB0aGUgZW5kIG9mZnNldCBpcyB0aGUKLSAgLy8gbGFzdCBieXRlIG9mIHRoZSBzdWJzdGl0dXRpb24gcGx1cyBvbmUgKHN1Y2ggdGhhdCAoZW5kIC0gc3RhcnQpIGlzIHRoZQotICAvLyBsZW5ndGggb2YgdGhlIHN1YnN0aXR1dGVkIHN0cmluZykuCi0gIG1hcDxzdHJpbmcsIHBhaXI8c2l6ZV90LCBzaXplX3Q+ID4gc3Vic3RpdHV0aW9uc187Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGFuZCBzZXRzIHJhbmdlIHRvIHRoZSBzdWJzdGl0dXRpb24gcmFuZ2UgaW4gdGhlIG91dHB1dCBmb3IKLSAgLy8gdmFybmFtZSBpZiB2YXJuYW1lIHdhcyB1c2VkIG9uY2UgaW4gdGhlIGxhc3QgY2FsbCB0byBQcmludC4gSWYgdmFybmFtZQotICAvLyB3YXMgbm90IHVzZWQsIG9yIGlmIGl0IHdhcyB1c2VkIG11bHRpcGxlIHRpbWVzLCByZXR1cm5zIGZhbHNlIChhbmQKLSAgLy8gZmFpbHMgYSBkZWJ1ZyBhc3NlcnRpb24pLgotICBib29sIEdldFN1YnN0aXR1dGlvblJhbmdlKGNvbnN0IGNoYXIqIHZhcm5hbWUsIHBhaXI8c2l6ZV90LCBzaXplX3Q+KiByYW5nZSk7Ci0KLSAgLy8gSWYgbm9uLW51bGwsIGFubm90YXRpb25fY29sbGVjdG9yXyBpcyB1c2VkIHRvIHN0b3JlIGFubm90YXRpb25zIGFib3V0Ci0gIC8vIGdlbmVyYXRlZCBjb2RlLgotICBBbm5vdGF0aW9uQ29sbGVjdG9yKiBjb25zdCBhbm5vdGF0aW9uX2NvbGxlY3Rvcl87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW50ZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGlvCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fUFJJTlRFUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTVmM2FmYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw1MjMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotbmFtZXNwYWNlIHsKLQotLy8gRWFjaCB0ZXN0IHJlcGVhdHMgb3ZlciBzZXZlcmFsIGJsb2NrIHNpemVzIGluIG9yZGVyIHRvIHRlc3QgYm90aCBjYXNlcwotLy8gd2hlcmUgcGFydGljdWxhciB3cml0ZXMgY3Jvc3MgYSBidWZmZXIgYm91bmRhcnkgYW5kIGNhc2VzIHdoZXJlIHRoZXkgZG8KLS8vIG5vdC4KLQotVEVTVChQcmludGVyLCBFbXB0eVByaW50ZXIpIHsKLSAgY2hhciBidWZmZXJbODE5Ml07Ci0gIGNvbnN0IGludCBibG9ja19zaXplID0gMTAwOwotICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBHT09HTEVfQVJSQVlTSVpFKGJ1ZmZlciksIGJsb2NrX3NpemUpOwotICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJ1wwJyk7Ci0gIEVYUEVDVF9UUlVFKCFwcmludGVyLmZhaWxlZCgpKTsKLX0KLQotVEVTVChQcmludGVyLCBCYXNpY1ByaW50aW5nKSB7Ci0gIGNoYXIgYnVmZmVyWzgxOTJdOwotCi0gIGZvciAoaW50IGJsb2NrX3NpemUgPSAxOyBibG9ja19zaXplIDwgNTEyOyBibG9ja19zaXplICo9IDIpIHsKLSAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgYmxvY2tfc2l6ZSk7Ci0KLSAgICB7Ci0gICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJ1wwJyk7Ci0KLSAgICAgIHByaW50ZXIuUHJpbnQoIkhlbGxvIFdvcmxkISIpOwotICAgICAgcHJpbnRlci5QcmludCgiICBUaGlzIGlzIHRoZSBzYW1lIGxpbmUuXG4iKTsKLSAgICAgIHByaW50ZXIuUHJpbnQoIkJ1dCB0aGlzIGlzIGEgbmV3IG9uZS5cbkFuZCB0aGlzIGlzIGFub3RoZXIgb25lLiIpOwotCi0gICAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7Ci0gICAgfQotCi0gICAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOwotCi0gICAgRVhQRUNUX1NUUkVRKCJIZWxsbyBXb3JsZCEgIFRoaXMgaXMgdGhlIHNhbWUgbGluZS5cbiIKLSAgICAgICAgICAgICAgICAgIkJ1dCB0aGlzIGlzIGEgbmV3IG9uZS5cbiIKLSAgICAgICAgICAgICAgICAgIkFuZCB0aGlzIGlzIGFub3RoZXIgb25lLiIsCi0gICAgICAgICAgICAgICAgIGJ1ZmZlcik7Ci0gIH0KLX0KLQotVEVTVChQcmludGVyLCBXcml0ZVJhdykgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLQotICBmb3IgKGludCBibG9ja19zaXplID0gMTsgYmxvY2tfc2l6ZSA8IDUxMjsgYmxvY2tfc2l6ZSAqPSAyKSB7Ci0gICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGJsb2NrX3NpemUpOwotCi0gICAgewotICAgICAgc3RyaW5nIHN0cmluZ19vYmogPSAiRnJvbSBhbiBvYmplY3RcbiI7Ci0gICAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKLSAgICAgIHByaW50ZXIuV3JpdGVSYXcoIkhlbGxvIFdvcmxkISIsIDEyKTsKLSAgICAgIHByaW50ZXIuUHJpbnRSYXcoIiAgVGhpcyBpcyB0aGUgc2FtZSBsaW5lLlxuIik7Ci0gICAgICBwcmludGVyLlByaW50UmF3KCJCdXQgdGhpcyBpcyBhIG5ldyBvbmUuXG5BbmQgdGhpcyBpcyBhbm90aGVyIG9uZS4iKTsKLSAgICAgIHByaW50ZXIuV3JpdGVSYXcoIlxuIiwgMSk7Ci0gICAgICBwcmludGVyLlByaW50UmF3KHN0cmluZ19vYmopOwotICAgICAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOwotICAgIH0KLQotICAgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKLQotICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8gV29ybGQhICBUaGlzIGlzIHRoZSBzYW1lIGxpbmUuXG4iCi0gICAgICAgICAgICAgICAgICJCdXQgdGhpcyBpcyBhIG5ldyBvbmUuXG4iCi0gICAgICAgICAgICAgICAgICJBbmQgdGhpcyBpcyBhbm90aGVyIG9uZS4iCi0gICAgICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICAgICAgIkZyb20gYW4gb2JqZWN0XG4iLAotICAgICAgICAgICAgICAgICBidWZmZXIpOwotICB9Ci19Ci0KLVRFU1QoUHJpbnRlciwgVmFyaWFibGVTdWJzdGl0dXRpb24pIHsKLSAgY2hhciBidWZmZXJbODE5Ml07Ci0KLSAgZm9yIChpbnQgYmxvY2tfc2l6ZSA9IDE7IGJsb2NrX3NpemUgPCA1MTI7IGJsb2NrX3NpemUgKj0gMikgewotICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpLCBibG9ja19zaXplKTsKLQotICAgIHsKLSAgICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOwotICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotCi0gICAgICB2YXJzWyJmb28iXSA9ICJXb3JsZCI7Ci0gICAgICB2YXJzWyJiYXIiXSA9ICIkZm9vJCI7Ci0gICAgICB2YXJzWyJhYmNkZWZnIl0gPSAiMTIzNCI7Ci0KLSAgICAgIHByaW50ZXIuUHJpbnQodmFycywgIkhlbGxvICRmb28kIVxuYmFyID0gJGJhciRcbiIpOwotICAgICAgcHJpbnRlci5QcmludFJhdygiUmF3Qml0XG4iKTsKLSAgICAgIHByaW50ZXIuUHJpbnQodmFycywgIiRhYmNkZWZnJFxuQSBsaXRlcmFsIGRvbGxhciBzaWduOiAgJCQiKTsKLQotICAgICAgdmFyc1siZm9vIl0gPSAiYmxhaCI7Ci0gICAgICBwcmludGVyLlByaW50KHZhcnMsICJcbk5vdyBmb28gPSAkZm9vJC4iKTsKLQotICAgICAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOwotICAgIH0KLQotICAgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKLQotICAgIEVYUEVDVF9TVFJFUSgiSGVsbG8gV29ybGQhXG4iCi0gICAgICAgICAgICAgICAgICJiYXIgPSAkZm9vJFxuIgotICAgICAgICAgICAgICAgICAiUmF3Qml0XG4iCi0gICAgICAgICAgICAgICAgICIxMjM0XG4iCi0gICAgICAgICAgICAgICAgICJBIGxpdGVyYWwgZG9sbGFyIHNpZ246ICAkXG4iCi0gICAgICAgICAgICAgICAgICJOb3cgZm9vID0gYmxhaC4iLAotICAgICAgICAgICAgICAgICBidWZmZXIpOwotICB9Ci19Ci0KLVRFU1QoUHJpbnRlciwgSW5saW5lVmFyaWFibGVTdWJzdGl0dXRpb24pIHsKLSAgY2hhciBidWZmZXJbODE5Ml07Ci0KLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotCi0gIHsKLSAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKLSAgICBwcmludGVyLlByaW50KCJIZWxsbyAkZm9vJCFcbiIsICJmb28iLCAiV29ybGQiKTsKLSAgICBwcmludGVyLlByaW50UmF3KCJSYXdCaXRcbiIpOwotICAgIHByaW50ZXIuUHJpbnQoIiRmb28kICRiYXIkXG4iLCAiZm9vIiwgIm9uZSIsICJiYXIiLCAidHdvIik7Ci0gICAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOwotICB9Ci0KLSAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOwotCi0gIEVYUEVDVF9TVFJFUSgiSGVsbG8gV29ybGQhXG4iCi0gICAgICAgICAgICAgICAiUmF3Qml0XG4iCi0gICAgICAgICAgICAgICAib25lIHR3b1xuIiwKLSAgICAgICAgICAgICAgIGJ1ZmZlcik7Ci19Ci0KLS8vIE1vY2tEZXNjcmlwdG9yRmlsZSBkZWZpbmVzIG9ubHkgdGhvc2UgbWVtYmVycyB0aGF0IFByaW50ZXIgdXNlcyB0byB3cml0ZSBvdXQKLS8vIGFubm90YXRpb25zLgotY2xhc3MgTW9ja0Rlc2NyaXB0b3JGaWxlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1vY2tEZXNjcmlwdG9yRmlsZShjb25zdCBzdHJpbmcmIGZpbGUpIDogZmlsZV8oZmlsZSkge30KLQotICAvLyBUaGUgbW9jayBmaWxlbmFtZSBmb3IgdGhpcyBmaWxlLgotICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQotCi0gcHJpdmF0ZToKLSAgc3RyaW5nIGZpbGVfOwotfTsKLQotLy8gTW9ja0Rlc2NyaXB0b3IgZGVmaW5lcyBvbmx5IHRob3NlIG1lbWJlcnMgdGhhdCBQcmludGVyIHVzZXMgdG8gd3JpdGUgb3V0Ci0vLyBhbm5vdGF0aW9ucy4KLWNsYXNzIE1vY2tEZXNjcmlwdG9yIHsKLSBwdWJsaWM6Ci0gIE1vY2tEZXNjcmlwdG9yKGNvbnN0IHN0cmluZyYgZmlsZSwgY29uc3QgdmVjdG9yPGludD4mIHBhdGgpCi0gICAgICA6IGZpbGVfKGZpbGUpLCBwYXRoXyhwYXRoKSB7fQotCi0gIC8vIFRoZSBtb2NrIGZpbGUgaW4gd2hpY2ggdGhpcyBkZXNjcmlwdG9yIHdhcyBkZWZpbmVkLgotICBjb25zdCBNb2NrRGVzY3JpcHRvckZpbGUqIGZpbGUoKSBjb25zdCB7IHJldHVybiAmZmlsZV87IH0KLQotIHByaXZhdGU6Ci0gIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoLgotICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6UHJpbnRlcjsKLQotICAvLyBDb3BpZXMgdGhlIHByZS1zdG9yZWQgcGF0aCB0byBvdXRwdXQuCi0gIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3QgeyAqb3V0cHV0ID0gcGF0aF87IH0KLQotICBNb2NrRGVzY3JpcHRvckZpbGUgZmlsZV87Ci0gIHZlY3RvcjxpbnQ+IHBhdGhfOwotfTsKLQotVEVTVChQcmludGVyLCBBbm5vdGF0ZU1hcCkgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOwotICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKLSAgewotICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbImZvbyJdID0gIjMiOwotICAgIHZhcnNbImJhciJdID0gIjUiOwotICAgIHByaW50ZXIuUHJpbnQodmFycywgIjAxMiRmb28kNCRiYXIkXG4iKTsKLSAgICB2ZWN0b3I8aW50PiBwYXRoXzE7Ci0gICAgcGF0aF8xLnB1c2hfYmFjaygzMyk7Ci0gICAgdmVjdG9yPGludD4gcGF0aF8yOwotICAgIHBhdGhfMi5wdXNoX2JhY2soMTEpOwotICAgIHBhdGhfMi5wdXNoX2JhY2soMjIpOwotICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfMSgicGF0aF8xIiwgcGF0aF8xKTsKLSAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yXzIoInBhdGhfMiIsIHBhdGhfMik7Ci0gICAgcHJpbnRlci5Bbm5vdGF0ZSgiZm9vIiwgImZvbyIsICZkZXNjcmlwdG9yXzEpOwotICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcl8yKTsKLSAgfQotICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7Ci0gIEVYUEVDVF9TVFJFUSgiMDEyMzQ1XG4iLCBidWZmZXIpOwotICBBU1NFUlRfRVEoMiwgaW5mby5hbm5vdGF0aW9uX3NpemUoKSk7Ci0gIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBmb28gPSBpbmZvLmFubm90YXRpb24oMCkucGF0aF9zaXplKCkgPT0gMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmluZm8uYW5ub3RhdGlvbigwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmluZm8uYW5ub3RhdGlvbigxKTsKLSAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9IGluZm8uYW5ub3RhdGlvbigwKS5wYXRoX3NpemUoKSA9PSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmaW5mby5hbm5vdGF0aW9uKDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmaW5mby5hbm5vdGF0aW9uKDApOwotICBBU1NFUlRfRVEoMSwgZm9vLT5wYXRoX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBiYXItPnBhdGhfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDMzLCBmb28tPnBhdGgoMCkpOwotICBFWFBFQ1RfRVEoMTEsIGJhci0+cGF0aCgwKSk7Ci0gIEVYUEVDVF9FUSgyMiwgYmFyLT5wYXRoKDEpKTsKLSAgRVhQRUNUX0VRKCJwYXRoXzEiLCBmb28tPnNvdXJjZV9maWxlKCkpOwotICBFWFBFQ1RfRVEoInBhdGhfMiIsIGJhci0+c291cmNlX2ZpbGUoKSk7Ci0gIEVYUEVDVF9FUSgzLCBmb28tPmJlZ2luKCkpOwotICBFWFBFQ1RfRVEoNCwgZm9vLT5lbmQoKSk7Ci0gIEVYUEVDVF9FUSg1LCBiYXItPmJlZ2luKCkpOwotICBFWFBFQ1RfRVEoNiwgYmFyLT5lbmQoKSk7Ci19Ci0KLVRFU1QoUHJpbnRlciwgQW5ub3RhdGVJbmxpbmUpIHsKLSAgY2hhciBidWZmZXJbODE5Ml07Ci0gIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgR2VuZXJhdGVkQ29kZUluZm8gaW5mbzsKLSAgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBpbmZvX2NvbGxlY3RvcigmaW5mbyk7Ci0gIHsKLSAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnLCAmaW5mb19jb2xsZWN0b3IpOwotICAgIHByaW50ZXIuUHJpbnQoIjAxMiRmb28kNCRiYXIkXG4iLCAiZm9vIiwgIjMiLCAiYmFyIiwgIjUiKTsKLSAgICB2ZWN0b3I8aW50PiBwYXRoXzE7Ci0gICAgcGF0aF8xLnB1c2hfYmFjaygzMyk7Ci0gICAgdmVjdG9yPGludD4gcGF0aF8yOwotICAgIHBhdGhfMi5wdXNoX2JhY2soMTEpOwotICAgIHBhdGhfMi5wdXNoX2JhY2soMjIpOwotICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfMSgicGF0aF8xIiwgcGF0aF8xKTsKLSAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yXzIoInBhdGhfMiIsIHBhdGhfMik7Ci0gICAgcHJpbnRlci5Bbm5vdGF0ZSgiZm9vIiwgImZvbyIsICZkZXNjcmlwdG9yXzEpOwotICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcl8yKTsKLSAgfQotICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7Ci0gIEVYUEVDVF9TVFJFUSgiMDEyMzQ1XG4iLCBidWZmZXIpOwotICBBU1NFUlRfRVEoMiwgaW5mby5hbm5vdGF0aW9uX3NpemUoKSk7Ci0gIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBmb28gPSBpbmZvLmFubm90YXRpb24oMCkucGF0aF9zaXplKCkgPT0gMQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmluZm8uYW5ub3RhdGlvbigwKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmluZm8uYW5ub3RhdGlvbigxKTsKLSAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9IGluZm8uYW5ub3RhdGlvbigwKS5wYXRoX3NpemUoKSA9PSAxCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmaW5mby5hbm5vdGF0aW9uKDEpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmaW5mby5hbm5vdGF0aW9uKDApOwotICBBU1NFUlRfRVEoMSwgZm9vLT5wYXRoX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBiYXItPnBhdGhfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDMzLCBmb28tPnBhdGgoMCkpOwotICBFWFBFQ1RfRVEoMTEsIGJhci0+cGF0aCgwKSk7Ci0gIEVYUEVDVF9FUSgyMiwgYmFyLT5wYXRoKDEpKTsKLSAgRVhQRUNUX0VRKCJwYXRoXzEiLCBmb28tPnNvdXJjZV9maWxlKCkpOwotICBFWFBFQ1RfRVEoInBhdGhfMiIsIGJhci0+c291cmNlX2ZpbGUoKSk7Ci0gIEVYUEVDVF9FUSgzLCBmb28tPmJlZ2luKCkpOwotICBFWFBFQ1RfRVEoNCwgZm9vLT5lbmQoKSk7Ci0gIEVYUEVDVF9FUSg1LCBiYXItPmJlZ2luKCkpOwotICBFWFBFQ1RfRVEoNiwgYmFyLT5lbmQoKSk7Ci19Ci0KLVRFU1QoUHJpbnRlciwgQW5ub3RhdGVSYW5nZSkgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOwotICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKLSAgewotICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7Ci0gICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGJhciRcbiIsICJmb28iLCAiMyIsICJiYXIiLCAiNSIpOwotICAgIHZlY3RvcjxpbnQ+IHBhdGg7Ci0gICAgcGF0aC5wdXNoX2JhY2soMzMpOwotICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IoInBhdGgiLCBwYXRoKTsKLSAgICBwcmludGVyLkFubm90YXRlKCJmb28iLCAiYmFyIiwgJmRlc2NyaXB0b3IpOwotICB9Ci0gIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKLSAgRVhQRUNUX1NUUkVRKCIwMTIzNDVcbiIsIGJ1ZmZlcik7Ci0gIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKLSAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGZvb2JhciA9ICZpbmZvLmFubm90YXRpb24oMCk7Ci0gIEFTU0VSVF9FUSgxLCBmb29iYXItPnBhdGhfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDMzLCBmb29iYXItPnBhdGgoMCkpOwotICBFWFBFQ1RfRVEoInBhdGgiLCBmb29iYXItPnNvdXJjZV9maWxlKCkpOwotICBFWFBFQ1RfRVEoMywgZm9vYmFyLT5iZWdpbigpKTsKLSAgRVhQRUNUX0VRKDYsIGZvb2Jhci0+ZW5kKCkpOwotfQotCi1URVNUKFByaW50ZXIsIEFubm90YXRlRW1wdHlSYW5nZSkgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOwotICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKLSAgewotICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7Ci0gICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGJheiQkYmFtJCRiYXIkXG4iLCAiZm9vIiwgIjMiLCAiYmFyIiwgIjUiLCAiYmF6IiwKLSAgICAgICAgICAgICAgICAgICIiLCAiYmFtIiwgIiIpOwotICAgIHZlY3RvcjxpbnQ+IHBhdGg7Ci0gICAgcGF0aC5wdXNoX2JhY2soMzMpOwotICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IoInBhdGgiLCBwYXRoKTsKLSAgICBwcmludGVyLkFubm90YXRlKCJiYXoiLCAiYmFtIiwgJmRlc2NyaXB0b3IpOwotICB9Ci0gIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKLSAgRVhQRUNUX1NUUkVRKCIwMTIzNDVcbiIsIGJ1ZmZlcik7Ci0gIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKLSAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhemJhbSA9ICZpbmZvLmFubm90YXRpb24oMCk7Ci0gIEFTU0VSVF9FUSgxLCBiYXpiYW0tPnBhdGhfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDMzLCBiYXpiYW0tPnBhdGgoMCkpOwotICBFWFBFQ1RfRVEoInBhdGgiLCBiYXpiYW0tPnNvdXJjZV9maWxlKCkpOwotICBFWFBFQ1RfRVEoNSwgYmF6YmFtLT5iZWdpbigpKTsKLSAgRVhQRUNUX0VRKDUsIGJhemJhbS0+ZW5kKCkpOwotfQotCi1URVNUKFByaW50ZXIsIEFubm90YXRlRGVzcGl0ZVVucmVsYXRlZE11bHRpcGxlVXNlcykgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOwotICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKLSAgewotICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7Ci0gICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGZvbyQkYmFyJFxuIiwgImZvbyIsICIzIiwgImJhciIsICI1Iik7Ci0gICAgdmVjdG9yPGludD4gcGF0aDsKLSAgICBwYXRoLnB1c2hfYmFjaygzMyk7Ci0gICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcigicGF0aCIsIHBhdGgpOwotICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcik7Ci0gIH0KLSAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOwotICBFWFBFQ1RfU1RSRVEoIjAxMjM0MzVcbiIsIGJ1ZmZlcik7Ci0gIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKLSAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9ICZpbmZvLmFubm90YXRpb24oMCk7Ci0gIEFTU0VSVF9FUSgxLCBiYXItPnBhdGhfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDMzLCBiYXItPnBhdGgoMCkpOwotICBFWFBFQ1RfRVEoInBhdGgiLCBiYXItPnNvdXJjZV9maWxlKCkpOwotICBFWFBFQ1RfRVEoNiwgYmFyLT5iZWdpbigpKTsKLSAgRVhQRUNUX0VRKDcsIGJhci0+ZW5kKCkpOwotfQotCi1URVNUKFByaW50ZXIsIEluZGVudGluZykgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLQotICBmb3IgKGludCBibG9ja19zaXplID0gMTsgYmxvY2tfc2l6ZSA8IDUxMjsgYmxvY2tfc2l6ZSAqPSAyKSB7Ci0gICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlciksIGJsb2NrX3NpemUpOwotCi0gICAgewotICAgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJyk7Ci0gICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0KLSAgICAgIHZhcnNbIm5ld2xpbmUiXSA9ICJcbiI7Ci0KLSAgICAgIHByaW50ZXIuUHJpbnQoIlRoaXMgaXMgbm90IGluZGVudGVkLlxuIik7Ci0gICAgICBwcmludGVyLkluZGVudCgpOwotICAgICAgcHJpbnRlci5QcmludCgiVGhpcyBpcyBpbmRlbnRlZFxuQW5kIHNvIGlzIHRoaXNcbiIpOwotICAgICAgcHJpbnRlci5PdXRkZW50KCk7Ci0gICAgICBwcmludGVyLlByaW50KCJCdXQgdGhpcyBpcyBub3QuIik7Ci0gICAgICBwcmludGVyLkluZGVudCgpOwotICAgICAgcHJpbnRlci5QcmludCgiICBBbmQgdGhpcyBpcyBzdGlsbCB0aGUgc2FtZSBsaW5lLlxuIgotICAgICAgICAgICAgICAgICAgICAiQnV0IHRoaXMgaXMgaW5kZW50ZWQuXG4iKTsKLSAgICAgIHByaW50ZXIuUHJpbnRSYXcoIlJhd0JpdCBoYXMgaW5kZW50IGF0IHN0YXJ0XG4iKTsKLSAgICAgIHByaW50ZXIuUHJpbnRSYXcoImJ1dCBub3QgYWZ0ZXIgYSByYXcgbmV3bGluZVxuIik7Ci0gICAgICBwcmludGVyLlByaW50KHZhcnMsICJOb3RlIHRoYXQgYSBuZXdsaW5lIGluIGEgdmFyaWFibGUgd2lsbCBicmVhayAiCi0gICAgICAgICAgICAgICAgICAgICJpbmRlbnRpbmcsIGFzIHdlIHNlZSRuZXdsaW5lJGhlcmUuXG4iKTsKLSAgICAgIHByaW50ZXIuSW5kZW50KCk7Ci0gICAgICBwcmludGVyLlByaW50KCJBbmQgdGhpcyIpOwotICAgICAgcHJpbnRlci5PdXRkZW50KCk7Ci0gICAgICBwcmludGVyLk91dGRlbnQoKTsKLSAgICAgIHByaW50ZXIuUHJpbnQoIiBpcyBkb3VibGUtaW5kZW50ZWRcbkJhY2sgdG8gbm9ybWFsLiIpOwotCi0gICAgICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7Ci0gICAgfQotCi0gICAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOwotCi0gICAgRVhQRUNUX1NUUkVRKAotICAgICAgIlRoaXMgaXMgbm90IGluZGVudGVkLlxuIgotICAgICAgIiAgVGhpcyBpcyBpbmRlbnRlZFxuIgotICAgICAgIiAgQW5kIHNvIGlzIHRoaXNcbiIKLSAgICAgICJCdXQgdGhpcyBpcyBub3QuICBBbmQgdGhpcyBpcyBzdGlsbCB0aGUgc2FtZSBsaW5lLlxuIgotICAgICAgIiAgQnV0IHRoaXMgaXMgaW5kZW50ZWQuXG4iCi0gICAgICAiICBSYXdCaXQgaGFzIGluZGVudCBhdCBzdGFydFxuIgotICAgICAgImJ1dCBub3QgYWZ0ZXIgYSByYXcgbmV3bGluZVxuIgotICAgICAgIk5vdGUgdGhhdCBhIG5ld2xpbmUgaW4gYSB2YXJpYWJsZSB3aWxsIGJyZWFrIGluZGVudGluZywgYXMgd2Ugc2VlXG4iCi0gICAgICAiaGVyZS5cbiIKLSAgICAgICIgICAgQW5kIHRoaXMgaXMgZG91YmxlLWluZGVudGVkXG4iCi0gICAgICAiQmFjayB0byBub3JtYWwuIiwKLSAgICAgIGJ1ZmZlcik7Ci0gIH0KLX0KLQotLy8gRGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyBhcyBvZiB5ZXQuCi0jaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLVRFU1QoUHJpbnRlciwgRGVhdGgpIHsKLSAgY2hhciBidWZmZXJbODE5Ml07Ci0KLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKLQotICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5QcmludCgiJG5vc3VjaHZhciQiKSwgIlVuZGVmaW5lZCB2YXJpYWJsZSIpOwotICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5QcmludCgiJHVuY2xvc2VkIiksICJVbmNsb3NlZCB2YXJpYWJsZSBuYW1lIik7Ci0gIEVYUEVDVF9ERUJVR19ERUFUSChwcmludGVyLk91dGRlbnQoKSwgIndpdGhvdXQgbWF0Y2hpbmcgSW5kZW50Iik7Ci19Ci0KLVRFU1QoUHJpbnRlciwgQW5ub3RhdGVNdWx0aXBsZVVzZXNEZWF0aCkgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOwotICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKLSAgewotICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7Ci0gICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGZvbyRcbiIsICJmb28iLCAiMyIpOwotICAgIHZlY3RvcjxpbnQ+IHBhdGg7Ci0gICAgcGF0aC5wdXNoX2JhY2soMzMpOwotICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IoInBhdGgiLCBwYXRoKTsKLSAgICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5Bbm5vdGF0ZSgiZm9vIiwgImZvbyIsICZkZXNjcmlwdG9yKSwgIm11bHRpcGxlIik7Ci0gIH0KLX0KLQotVEVTVChQcmludGVyLCBBbm5vdGF0ZU5lZ2F0aXZlTGVuZ3RoRGVhdGgpIHsKLSAgY2hhciBidWZmZXJbODE5Ml07Ci0gIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKLSAgR2VuZXJhdGVkQ29kZUluZm8gaW5mbzsKLSAgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBpbmZvX2NvbGxlY3RvcigmaW5mbyk7Ci0gIHsKLSAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnLCAmaW5mb19jb2xsZWN0b3IpOwotICAgIHByaW50ZXIuUHJpbnQoIjAxMiRmb28kNCRiYXIkXG4iLCAiZm9vIiwgIjMiLCAiYmFyIiwgIjUiKTsKLSAgICB2ZWN0b3I8aW50PiBwYXRoOwotICAgIHBhdGgucHVzaF9iYWNrKDMzKTsKLSAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yKCJwYXRoIiwgcGF0aCk7Ci0gICAgRVhQRUNUX0RFQlVHX0RFQVRIKHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJmb28iLCAmZGVzY3JpcHRvciksICJuZWdhdGl2ZSIpOwotICB9Ci19Ci0KLVRFU1QoUHJpbnRlciwgQW5ub3RhdGVVbmRlZmluZWREZWF0aCkgewotICBjaGFyIGJ1ZmZlcls4MTkyXTsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOwotICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKLSAgewotICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7Ci0gICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGZvbyRcbiIsICJmb28iLCAiMyIpOwotICAgIHZlY3RvcjxpbnQ+IHBhdGg7Ci0gICAgcGF0aC5wdXNoX2JhY2soMzMpOwotICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IoInBhdGgiLCBwYXRoKTsKLSAgICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5Bbm5vdGF0ZSgiYmFyIiwgImJhciIsICZkZXNjcmlwdG9yKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIlVuZGVmaW5lZCIpOwotICB9Ci19Ci0jZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCi0KLVRFU1QoUHJpbnRlciwgV3JpdGVGYWlsdXJlUGFydGlhbCkgewotICBjaGFyIGJ1ZmZlclsxN107Ci0KLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKLQotICAvLyBQcmludCAxNiBieXRlcyB0byBhbG1vc3QgZmlsbCB0aGUgYnVmZmVyIChzaG91bGQgbm90IGZhaWwpLgotICBwcmludGVyLlByaW50KCIwMTIzNDU2Nzg5YWJjZGVmIik7Ci0gIEVYUEVDVF9GQUxTRShwcmludGVyLmZhaWxlZCgpKTsKLQotICAvLyBUcnkgdG8gcHJpbnQgMiBjaGFycy4gT25seSBvbmUgZml0cy4KLSAgcHJpbnRlci5QcmludCgiPD4iKTsKLSAgRVhQRUNUX1RSVUUocHJpbnRlci5mYWlsZWQoKSk7Ci0KLSAgLy8gQW55dGhpbmcgZWxzZSBzaG91bGQgZmFpbCB0b28uCi0gIHByaW50ZXIuUHJpbnQoIiAiKTsKLSAgRVhQRUNUX1RSVUUocHJpbnRlci5mYWlsZWQoKSk7Ci0gIHByaW50ZXIuUHJpbnQoImJsYWgiKTsKLSAgRVhQRUNUX1RSVUUocHJpbnRlci5mYWlsZWQoKSk7Ci0KLSAgLy8gQnVmZmVyIHNob3VsZCBjb250YWluIHRoZSBmaXJzdCAxNyBieXRlcyB3cml0dGVuLgotICBFWFBFQ1RfRVEoIjAxMjM0NTY3ODlhYmNkZWY8Iiwgc3RyaW5nKGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpKTsKLX0KLQotVEVTVChQcmludGVyLCBXcml0ZUZhaWx1cmVFeGFjdCkgewotICBjaGFyIGJ1ZmZlclsxNl07Ci0KLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOwotICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnKTsKLQotICAvLyBQcmludCAxNiBieXRlcyB0byBmaWxsIHRoZSBidWZmZXIgZXhhY3RseSAoc2hvdWxkIG5vdCBmYWlsKS4KLSAgcHJpbnRlci5QcmludCgiMDEyMzQ1Njc4OWFiY2RlZiIpOwotICBFWFBFQ1RfRkFMU0UocHJpbnRlci5mYWlsZWQoKSk7Ci0KLSAgLy8gVHJ5IHRvIHByaW50IG9uZSBtb3JlIGJ5dGUgKHNob3VsZCBmYWlsKS4KLSAgcHJpbnRlci5QcmludCgiICIpOwotICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKLQotICAvLyBTaG91bGQgbm90IGNyYXNoCi0gIHByaW50ZXIuUHJpbnQoImJsYWgiKTsKLSAgRVhQRUNUX1RSVUUocHJpbnRlci5mYWlsZWQoKSk7Ci0KLSAgLy8gQnVmZmVyIHNob3VsZCBjb250YWluIHRoZSBmaXJzdCAxNiBieXRlcyB3cml0dGVuLgotICBFWFBFQ1RfRVEoIjAxMjM0NTY3ODlhYmNkZWYiLCBzdHJpbmcoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiMzU1MGRmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTEzOSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gSGVyZSB3ZSBoYXZlIGEgaGFuZC13cml0dGVuIGxleGVyLiAgQXQgZmlyc3QgeW91IG1pZ2h0IGFzayB5b3Vyc2VsZiwKLS8vICJIYW5kLXdyaXR0ZW4gdGV4dCBwcm9jZXNzaW5nPyAgSXMgS2VudG9uIGNyYXp5PyEiICBXZWxsLCBmaXJzdCBvZiBhbGwsCi0vLyB5ZXMgSSBhbSBjcmF6eSwgYnV0IHRoYXQncyBiZXNpZGUgdGhlIHBvaW50LiAgVGhlcmUgYXJlIGFjdHVhbGx5IHJlYXNvbnMKLS8vIHdoeSBJIGVuZGVkIHVwIHdyaXRpbmcgdGhpcyB0aGlzIHdheS4KLS8vCi0vLyBUaGUgdHJhZGl0aW9uYWwgYXBwcm9hY2ggdG8gbGV4aW5nIGlzIHRvIHVzZSBsZXggdG8gZ2VuZXJhdGUgYSBsZXhlciBmb3IKLS8vIHlvdS4gIFVuZm9ydHVuYXRlbHksIGxleCdzIG91dHB1dCBpcyByaWRpY3Vsb3VzbHkgdWdseSBhbmQgZGlmZmljdWx0IHRvCi0vLyBpbnRlZ3JhdGUgY2xlYW5seSB3aXRoIEMrKyBjb2RlLCBlc3BlY2lhbGx5IGFic3RyYWN0IGNvZGUgb3IgY29kZSBtZWFudAotLy8gYXMgYSBsaWJyYXJ5LiAgQmV0dGVyIHBhcnNlci1nZW5lcmF0b3JzIGV4aXN0IGJ1dCB3b3VsZCBhZGQgZGVwZW5kZW5jaWVzCi0vLyB3aGljaCBtb3N0IHVzZXJzIHdvbid0IGFscmVhZHkgaGF2ZSwgd2hpY2ggd2UnZCBsaWtlIHRvIGF2b2lkLiAgKEdOVSBmbGV4Ci0vLyBoYXMgYSBDKysgb3V0cHV0IG9wdGlvbiwgYnV0IGl0J3Mgc3RpbGwgcmlkaWN1bG91c2x5IHVnbHksIG5vbi1hYnN0cmFjdCwKLS8vIGFuZCBub3QgbGlicmFyeS1mcmllbmRseS4pCi0vLwotLy8gVGhlIG5leHQgYXBwcm9hY2ggdGhhdCBhbnkgZ29vZCBzb2Z0d2FyZSBlbmdpbmVlciBzaG91bGQgbG9vayBhdCBpcyB0bwotLy8gdXNlIHJlZ3VsYXIgZXhwcmVzc2lvbnMuICBBbmQsIGluZGVlZCwgSSBkaWQuICBJIGhhdmUgY29kZSB3aGljaAotLy8gaW1wbGVtZW50cyB0aGlzIHNhbWUgY2xhc3MgdXNpbmcgcmVndWxhciBleHByZXNzaW9ucy4gIEl0J3MgYWJvdXQgMjAwCi0vLyBsaW5lcyBzaG9ydGVyLiAgSG93ZXZlcjoKLS8vIC0gUmF0aGVyIHRoYW4gZXJyb3IgbWVzc2FnZXMgdGVsbGluZyB5b3UgIlRoaXMgc3RyaW5nIGhhcyBhbiBpbnZhbGlkCi0vLyAgIGVzY2FwZSBzZXF1ZW5jZSBhdCBsaW5lIDUsIGNvbHVtbiA0NSIsIHlvdSBnZXQgZXJyb3IgbWVzc2FnZXMgbGlrZQotLy8gICAiUGFyc2UgZXJyb3Igb24gbGluZSA1Ii4gIEdpdmluZyBtb3JlIHByZWNpc2UgZXJyb3JzIHJlcXVpcmVzIGFkZGluZwotLy8gICBhIGxvdCBvZiBjb2RlIHRoYXQgZW5kcyB1cCBiYXNpY2FsbHkgYXMgY29tcGxleCBhcyB0aGUgaGFuZC1jb2RlZAotLy8gICB2ZXJzaW9uIGFueXdheS4KLS8vIC0gVGhlIHJlZ3VsYXIgZXhwcmVzc2lvbiB0byBtYXRjaCBhIHN0cmluZyBsaXRlcmFsIGxvb2tzIGxpa2UgdGhpczoKLS8vICAgICBrU3RyaW5nICA9IG5ldyBSRSgiKFwiKFteXCJcXFxcXXwiICAgICAgICAgICAgICAvLyBub24tZXNjYXBlZAotLy8gICAgICAgICAgICAgICAgICAgICAgICJcXFxcW2FiZm5ydHY/XCInXFxcXDAtN118IiAgIC8vIG5vcm1hbCBlc2NhcGUKLS8vICAgICAgICAgICAgICAgICAgICAgICAiXFxcXHhbMC05YS1mQS1GXSkqXCJ8IiAgICAgICAvLyBoZXggZXNjYXBlCi0vLyAgICAgICAgICAgICAgICAgICAgICAgIlwnKFteXCdcXFxcXXwiICAgICAgICAvLyBBbHNvIHN1cHBvcnQgc2luZ2xlLXF1b3Rlcy4KLS8vICAgICAgICAgICAgICAgICAgICAgICAiXFxcXFthYmZucnR2P1wiJ1xcXFwwLTddfCIKLS8vICAgICAgICAgICAgICAgICAgICAgICAiXFxcXHhbMC05YS1mQS1GXSkqXCcpIik7Ci0vLyAgIFZlcmlmeWluZyB0aGUgY29ycmVjdG5lc3Mgb2YgdGhpcyBsaW5lIG5vaXNlIGlzIGFjdHVhbGx5IGhhcmRlciB0aGFuCi0vLyAgIHZlcmlmeWluZyB0aGUgY29ycmVjdG5lc3Mgb2YgQ29uc3VtZVN0cmluZygpLCBkZWZpbmVkIGJlbG93LiAgSSdtIG5vdAotLy8gICBldmVuIGNvbmZpZGVudCB0aGF0IHRoZSBhYm92ZSBpcyBjb3JyZWN0LCBhZnRlciBzdGFyaW5nIGF0IGl0IGZvciBzb21lCi0vLyAgIHRpbWUuCi0vLyAtIFBDUkUgaXMgZmFzdCwgYnV0IHRoZXJlJ3Mgc3RpbGwgbW9yZSBvdmVyaGVhZCBpbnZvbHZlZCB0aGFuIHRoZSBjb2RlCi0vLyAgIGJlbG93LgotLy8gLSBTYWRseSwgcmVndWxhciBleHByZXNzaW9ucyBhcmUgbm90IHBhcnQgb2YgdGhlIEMgc3RhbmRhcmQgbGlicmFyeSwgc28KLS8vICAgdXNpbmcgdGhlbSB3b3VsZCByZXF1aXJlIGRlcGVuZGluZyBvbiBzb21lIG90aGVyIGxpYnJhcnkuICBGb3IgdGhlCi0vLyAgIG9wZW4gc291cmNlIHJlbGVhc2UsIHRoaXMgY291bGQgYmUgcmVhbGx5IGFubm95aW5nLiAgTm9ib2R5IGxpa2VzCi0vLyAgIGRvd25sb2FkaW5nIG9uZSBwaWVjZSBvZiBzb2Z0d2FyZSBqdXN0IHRvIGZpbmQgdGhhdCB0aGV5IG5lZWQgdG8KLS8vICAgZG93bmxvYWQgc29tZXRoaW5nIGVsc2UgdG8gbWFrZSBpdCB3b3JrLCBhbmQgaW4gYWxsIGxpa2VsaWhvb2QKLS8vICAgcGVvcGxlIGRvd25sb2FkaW5nIFByb3RvY29sIEJ1ZmZlcnMgd2lsbCBhbHJlYWR5IGJlIGRvaW5nIHNvIGp1c3QKLS8vICAgdG8gbWFrZSBzb21ldGhpbmcgZWxzZSB3b3JrLiAgV2UgY291bGQgaW5jbHVkZSBhIGNvcHkgb2YgUENSRSB3aXRoCi0vLyAgIG91ciBjb2RlLCBidXQgdGhhdCBvYmxpZ2F0ZXMgdXMgdG8ga2VlcCBpdCB1cC10by1kYXRlIGFuZCBqdXN0IHNlZW1zCi0vLyAgIGxpa2UgYSBiaWcgd2FzdGUganVzdCB0byBzYXZlIDIwMCBsaW5lcyBvZiBjb2RlLgotLy8KLS8vIE9uIGEgc2ltaWxhciBidXQgdW5yZWxhdGVkIG5vdGUsIEknbSBldmVuIHNjYXJlZCB0byB1c2UgY3R5cGUuaC4KLS8vIEFwcGFyZW50bHkgZnVuY3Rpb25zIGxpa2UgaXNhbHBoYSgpIGFyZSBsb2NhbGUtZGVwZW5kZW50LiAgU28sIGlmIHdlIHVzZWQKLS8vIHRoYXQsIHRoZW4gaWYgdGhpcyBjb2RlIGlzIGJlaW5nIGNhbGxlZCBmcm9tIHNvbWUgcHJvZ3JhbSB0aGF0IGRvZXNuJ3QKLS8vIGhhdmUgaXRzIGxvY2FsZSBzZXQgdG8gIkMiLCBpdCB3b3VsZCBiZWhhdmUgc3RyYW5nZWx5LiAgV2UgY2FuJ3QganVzdCBzZXQKLS8vIHRoZSBsb2NhbGUgdG8gIkMiIG91cnNlbHZlcyBzaW5jZSB3ZSBtaWdodCBicmVhayB0aGUgY2FsbGluZyBwcm9ncmFtIHRoYXQKLS8vIHdheSwgcGFydGljdWxhcmx5IGlmIGl0IGlzIG11bHRpLXRocmVhZGVkLiAgV1RGPyAgU29tZW9uZSBwbGVhc2UgbGV0IG1lCi0vLyAoS2VudG9uKSBrbm93IGlmIEknbSBtaXNzaW5nIHNvbWV0aGluZyBoZXJlLi4uCi0vLwotLy8gSSdkIGxvdmUgdG8gaGVhciBhYm91dCBvdGhlciBhbHRlcm5hdGl2ZXMsIHRob3VnaCwgYXMgdGhpcyBjb2RlIGlzbid0Ci0vLyBleGFjdGx5IHByZXR0eS4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGlvIHsKLW5hbWVzcGFjZSB7Ci0KLS8vIEFzIG1lbnRpb25lZCBhYm92ZSwgSSBkb24ndCB0cnVzdCBjdHlwZS5oIGR1ZSB0byB0aGUgcHJlc2VuY2Ugb2YgImxvY2FsZXMiLgotLy8gU28sIEkgaGF2ZSB3cml0dGVuIHJlcGxhY2VtZW50IGZ1bmN0aW9ucyBoZXJlLiAgU29tZW9uZSBwbGVhc2Ugc21hY2sgbWUgaWYKLS8vIHRoaXMgaXMgYSBiYWQgaWRlYSBvciBpZiB0aGVyZSBpcyBzb21lIHdheSBhcm91bmQgdGhpcy4KLS8vCi0vLyBUaGVzZSAiY2hhcmFjdGVyIGNsYXNzZXMiIGFyZSBkZXNpZ25lZCB0byBiZSB1c2VkIGluIHRlbXBsYXRlIG1ldGhvZHMuCi0vLyBGb3IgaW5zdGFuY2UsIFRva2VuaXplcjo6Q29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZT4oKSB3aWxsIGVhdAotLy8gd2hpdGVzcGFjZS4KLQotLy8gTm90ZTogIE5vIGNsYXNzIGlzIGFsbG93ZWQgdG8gY29udGFpbiAnXDAnLCBzaW5jZSB0aGlzIGlzIHVzZWQgdG8gbWFyayBlbmQtCi0vLyAgIG9mLWlucHV0IGFuZCBpcyBoYW5kbGVkIHNwZWNpYWxseS4KLQotI2RlZmluZSBDSEFSQUNURVJfQ0xBU1MoTkFNRSwgRVhQUkVTU0lPTikgICAgICBcCi0gIGNsYXNzIE5BTUUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHB1YmxpYzogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHN0YXRpYyBpbmxpbmUgYm9vbCBJbkNsYXNzKGNoYXIgYykgeyAgICAgICBcCi0gICAgICByZXR1cm4gRVhQUkVTU0lPTjsgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLUNIQVJBQ1RFUl9DTEFTUyhXaGl0ZXNwYWNlLCBjID09ICcgJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHQnIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnXHInIHx8IGMgPT0gJ1x2JyB8fCBjID09ICdcZicpOwotQ0hBUkFDVEVSX0NMQVNTKFdoaXRlc3BhY2VOb05ld2xpbmUsIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJ1xyJyB8fCBjID09ICdcdicgfHwgYyA9PSAnXGYnKTsKLQotQ0hBUkFDVEVSX0NMQVNTKFVucHJpbnRhYmxlLCBjIDwgJyAnICYmIGMgPiAnXDAnKTsKLQotQ0hBUkFDVEVSX0NMQVNTKERpZ2l0LCAnMCcgPD0gYyAmJiBjIDw9ICc5Jyk7Ci1DSEFSQUNURVJfQ0xBU1MoT2N0YWxEaWdpdCwgJzAnIDw9IGMgJiYgYyA8PSAnNycpOwotQ0hBUkFDVEVSX0NMQVNTKEhleERpZ2l0LCAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICgnYScgPD0gYyAmJiBjIDw9ICdmJykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKSk7Ci0KLUNIQVJBQ1RFUl9DTEFTUyhMZXR0ZXIsICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIChjID09ICdfJykpOwotCi1DSEFSQUNURVJfQ0xBU1MoQWxwaGFudW1lcmljLCAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYyA9PSAnXycpKTsKLQotQ0hBUkFDVEVSX0NMQVNTKEVzY2FwZSwgYyA9PSAnYScgfHwgYyA9PSAnYicgfHwgYyA9PSAnZicgfHwgYyA9PSAnbicgfHwKLSAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJ3InIHx8IGMgPT0gJ3QnIHx8IGMgPT0gJ3YnIHx8IGMgPT0gJ1xcJyB8fAotICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnPycgfHwgYyA9PSAnXCcnIHx8IGMgPT0gJ1wiJyk7Ci0KLSN1bmRlZiBDSEFSQUNURVJfQ0xBU1MKLQotLy8gR2l2ZW4gYSBjaGFyLCBpbnRlcnByZXQgaXQgYXMgYSBudW1lcmljIGRpZ2l0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgotLy8gVGhpcyBzdXBwb3J0cyBhbnkgbnVtYmVyIGJhc2UgdXAgdG8gMzYuCi1pbmxpbmUgaW50IERpZ2l0VmFsdWUoY2hhciBkaWdpdCkgewotICBpZiAoJzAnIDw9IGRpZ2l0ICYmIGRpZ2l0IDw9ICc5JykgcmV0dXJuIGRpZ2l0IC0gJzAnOwotICBpZiAoJ2EnIDw9IGRpZ2l0ICYmIGRpZ2l0IDw9ICd6JykgcmV0dXJuIGRpZ2l0IC0gJ2EnICsgMTA7Ci0gIGlmICgnQScgPD0gZGlnaXQgJiYgZGlnaXQgPD0gJ1onKSByZXR1cm4gZGlnaXQgLSAnQScgKyAxMDsKLSAgcmV0dXJuIC0xOwotfQotCi0vLyBJbmxpbmUgYmVjYXVzZSBpdCdzIG9ubHkgdXNlZCBpbiBvbmUgcGxhY2UuCi1pbmxpbmUgY2hhciBUcmFuc2xhdGVFc2NhcGUoY2hhciBjKSB7Ci0gIHN3aXRjaCAoYykgewotICAgIGNhc2UgJ2EnOiAgcmV0dXJuICdcYSc7Ci0gICAgY2FzZSAnYic6ICByZXR1cm4gJ1xiJzsKLSAgICBjYXNlICdmJzogIHJldHVybiAnXGYnOwotICAgIGNhc2UgJ24nOiAgcmV0dXJuICdcbic7Ci0gICAgY2FzZSAncic6ICByZXR1cm4gJ1xyJzsKLSAgICBjYXNlICd0JzogIHJldHVybiAnXHQnOwotICAgIGNhc2UgJ3YnOiAgcmV0dXJuICdcdic7Ci0gICAgY2FzZSAnXFwnOiByZXR1cm4gJ1xcJzsKLSAgICBjYXNlICc/JzogIHJldHVybiAnXD8nOyAgICAvLyBUcmlncmFwaHMgPSA6KAotICAgIGNhc2UgJ1wnJzogcmV0dXJuICdcJyc7Ci0gICAgY2FzZSAnIic6ICByZXR1cm4gJ1wiJzsKLQotICAgIC8vIFdlIGV4cGVjdCBlc2NhcGUgc2VxdWVuY2VzIHRvIGhhdmUgYmVlbiB2YWxpZGF0ZWQgc2VwYXJhdGVseS4KLSAgICBkZWZhdWx0OiAgIHJldHVybiAnPyc7Ci0gIH0KLX0KLQotfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotCi1FcnJvckNvbGxlY3Rvcjo6fkVycm9yQ29sbGVjdG9yKCkge30KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Ub2tlbml6ZXI6OlRva2VuaXplcihaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCi0gIDogaW5wdXRfKGlucHV0KSwKLSAgICBlcnJvcl9jb2xsZWN0b3JfKGVycm9yX2NvbGxlY3RvciksCi0gICAgYnVmZmVyXyhOVUxMKSwKLSAgICBidWZmZXJfc2l6ZV8oMCksCi0gICAgYnVmZmVyX3Bvc18oMCksCi0gICAgcmVhZF9lcnJvcl8oZmFsc2UpLAotICAgIGxpbmVfKDApLAotICAgIGNvbHVtbl8oMCksCi0gICAgcmVjb3JkX3RhcmdldF8oTlVMTCksCi0gICAgcmVjb3JkX3N0YXJ0XygtMSksCi0gICAgYWxsb3dfZl9hZnRlcl9mbG9hdF8oZmFsc2UpLAotICAgIGNvbW1lbnRfc3R5bGVfKENQUF9DT01NRU5UX1NUWUxFKSwKLSAgICByZXF1aXJlX3NwYWNlX2FmdGVyX251bWJlcl8odHJ1ZSksCi0gICAgYWxsb3dfbXVsdGlsaW5lX3N0cmluZ3NfKGZhbHNlKSB7Ci0KLSAgY3VycmVudF8ubGluZSA9IDA7Ci0gIGN1cnJlbnRfLmNvbHVtbiA9IDA7Ci0gIGN1cnJlbnRfLmVuZF9jb2x1bW4gPSAwOwotICBjdXJyZW50Xy50eXBlID0gVFlQRV9TVEFSVDsKLQotICBSZWZyZXNoKCk7Ci19Ci0KLVRva2VuaXplcjo6flRva2VuaXplcigpIHsKLSAgLy8gSWYgd2UgaGFkIGFueSBidWZmZXIgbGVmdCB1bnJlYWQsIHJldHVybiBpdCB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0KLSAgLy8gc28gdGhhdCBzb21lb25lIGVsc2UgY2FuIHJlYWQgaXQuCi0gIGlmIChidWZmZXJfc2l6ZV8gPiBidWZmZXJfcG9zXykgewotICAgIGlucHV0Xy0+QmFja1VwKGJ1ZmZlcl9zaXplXyAtIGJ1ZmZlcl9wb3NfKTsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBJbnRlcm5hbCBoZWxwZXJzLgotCi12b2lkIFRva2VuaXplcjo6TmV4dENoYXIoKSB7Ci0gIC8vIFVwZGF0ZSBvdXIgbGluZSBhbmQgY29sdW1uIGNvdW50ZXJzIGJhc2VkIG9uIHRoZSBjaGFyYWN0ZXIgYmVpbmcKLSAgLy8gY29uc3VtZWQuCi0gIGlmIChjdXJyZW50X2NoYXJfID09ICdcbicpIHsKLSAgICArK2xpbmVfOwotICAgIGNvbHVtbl8gPSAwOwotICB9IGVsc2UgaWYgKGN1cnJlbnRfY2hhcl8gPT0gJ1x0JykgewotICAgIGNvbHVtbl8gKz0ga1RhYldpZHRoIC0gY29sdW1uXyAlIGtUYWJXaWR0aDsKLSAgfSBlbHNlIHsKLSAgICArK2NvbHVtbl87Ci0gIH0KLQotICAvLyBBZHZhbmNlIHRvIHRoZSBuZXh0IGNoYXJhY3Rlci4KLSAgKytidWZmZXJfcG9zXzsKLSAgaWYgKGJ1ZmZlcl9wb3NfIDwgYnVmZmVyX3NpemVfKSB7Ci0gICAgY3VycmVudF9jaGFyXyA9IGJ1ZmZlcl9bYnVmZmVyX3Bvc19dOwotICB9IGVsc2UgewotICAgIFJlZnJlc2goKTsKLSAgfQotfQotCi12b2lkIFRva2VuaXplcjo6UmVmcmVzaCgpIHsKLSAgaWYgKHJlYWRfZXJyb3JfKSB7Ci0gICAgY3VycmVudF9jaGFyXyA9ICdcMCc7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgLy8gSWYgd2UncmUgaW4gYSB0b2tlbiwgYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgdG8gaXQuCi0gIGlmIChyZWNvcmRfdGFyZ2V0XyAhPSBOVUxMICYmIHJlY29yZF9zdGFydF8gPCBidWZmZXJfc2l6ZV8pIHsKLSAgICByZWNvcmRfdGFyZ2V0Xy0+YXBwZW5kKGJ1ZmZlcl8gKyByZWNvcmRfc3RhcnRfLCBidWZmZXJfc2l6ZV8gLSByZWNvcmRfc3RhcnRfKTsKLSAgICByZWNvcmRfc3RhcnRfID0gMDsKLSAgfQotCi0gIGNvbnN0IHZvaWQqIGRhdGEgPSBOVUxMOwotICBidWZmZXJfID0gTlVMTDsKLSAgYnVmZmVyX3Bvc18gPSAwOwotICBkbyB7Ci0gICAgaWYgKCFpbnB1dF8tPk5leHQoJmRhdGEsICZidWZmZXJfc2l6ZV8pKSB7Ci0gICAgICAvLyBlbmQgb2Ygc3RyZWFtIChvciByZWFkIGVycm9yKQotICAgICAgYnVmZmVyX3NpemVfID0gMDsKLSAgICAgIHJlYWRfZXJyb3JfID0gdHJ1ZTsKLSAgICAgIGN1cnJlbnRfY2hhcl8gPSAnXDAnOwotICAgICAgcmV0dXJuOwotICAgIH0KLSAgfSB3aGlsZSAoYnVmZmVyX3NpemVfID09IDApOwotCi0gIGJ1ZmZlcl8gPSBzdGF0aWNfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7Ci0KLSAgY3VycmVudF9jaGFyXyA9IGJ1ZmZlcl9bMF07Ci19Ci0KLWlubGluZSB2b2lkIFRva2VuaXplcjo6UmVjb3JkVG8oc3RyaW5nKiB0YXJnZXQpIHsKLSAgcmVjb3JkX3RhcmdldF8gPSB0YXJnZXQ7Ci0gIHJlY29yZF9zdGFydF8gPSBidWZmZXJfcG9zXzsKLX0KLQotaW5saW5lIHZvaWQgVG9rZW5pemVyOjpTdG9wUmVjb3JkaW5nKCkgewotICAvLyBOb3RlOiAgVGhlIGlmKCkgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBTVEwgaW1wbGVtZW50YXRpb25zIGNyYXNoIHdoZW4KLSAgLy8gICB5b3UgY2FsbCBzdHJpbmc6OmFwcGVuZChOVUxMLCAwKSwgcHJlc3VtYWJseSBiZWNhdXNlIHRoZXkgYXJlIHRyeWluZyB0bwotICAvLyAgIGJlIGhlbHBmdWwgYnkgZGV0ZWN0aW5nIHRoZSBOVUxMIHBvaW50ZXIsIGV2ZW4gdGhvdWdoIHRoZXJlJ3Mgbm90aGluZwotICAvLyAgIHdyb25nIHdpdGggcmVhZGluZyB6ZXJvIGJ5dGVzIGZyb20gTlVMTC4KLSAgaWYgKGJ1ZmZlcl9wb3NfICE9IHJlY29yZF9zdGFydF8pIHsKLSAgICByZWNvcmRfdGFyZ2V0Xy0+YXBwZW5kKGJ1ZmZlcl8gKyByZWNvcmRfc3RhcnRfLCBidWZmZXJfcG9zXyAtIHJlY29yZF9zdGFydF8pOwotICB9Ci0gIHJlY29yZF90YXJnZXRfID0gTlVMTDsKLSAgcmVjb3JkX3N0YXJ0XyA9IC0xOwotfQotCi1pbmxpbmUgdm9pZCBUb2tlbml6ZXI6OlN0YXJ0VG9rZW4oKSB7Ci0gIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUQVJUOyAgICAvLyBKdXN0IGZvciB0aGUgc2FrZSBvZiBpbml0aWFsaXppbmcgaXQuCi0gIGN1cnJlbnRfLnRleHQuY2xlYXIoKTsKLSAgY3VycmVudF8ubGluZSA9IGxpbmVfOwotICBjdXJyZW50Xy5jb2x1bW4gPSBjb2x1bW5fOwotICBSZWNvcmRUbygmY3VycmVudF8udGV4dCk7Ci19Ci0KLWlubGluZSB2b2lkIFRva2VuaXplcjo6RW5kVG9rZW4oKSB7Ci0gIFN0b3BSZWNvcmRpbmcoKTsKLSAgY3VycmVudF8uZW5kX2NvbHVtbiA9IGNvbHVtbl87Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEhlbHBlciBtZXRob2RzIHRoYXQgY29uc3VtZSBjaGFyYWN0ZXJzLgotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KLWlubGluZSBib29sIFRva2VuaXplcjo6TG9va2luZ0F0KCkgewotICByZXR1cm4gQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXyk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgotaW5saW5lIGJvb2wgVG9rZW5pemVyOjpUcnlDb25zdW1lT25lKCkgewotICBpZiAoQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3MoY3VycmVudF9jaGFyXykpIHsKLSAgICBOZXh0Q2hhcigpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1pbmxpbmUgYm9vbCBUb2tlbml6ZXI6OlRyeUNvbnN1bWUoY2hhciBjKSB7Ci0gIGlmIChjdXJyZW50X2NoYXJfID09IGMpIHsKLSAgICBOZXh0Q2hhcigpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KLWlubGluZSB2b2lkIFRva2VuaXplcjo6Q29uc3VtZVplcm9Pck1vcmUoKSB7Ci0gIHdoaWxlIChDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhjdXJyZW50X2NoYXJfKSkgewotICAgIE5leHRDaGFyKCk7Ci0gIH0KLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+Ci1pbmxpbmUgdm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVPbmVPck1vcmUoY29uc3QgY2hhciogZXJyb3IpIHsKLSAgaWYgKCFDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhjdXJyZW50X2NoYXJfKSkgewotICAgIEFkZEVycm9yKGVycm9yKTsKLSAgfSBlbHNlIHsKLSAgICBkbyB7Ci0gICAgICBOZXh0Q2hhcigpOwotICAgIH0gd2hpbGUgKENoYXJhY3RlckNsYXNzOjpJbkNsYXNzKGN1cnJlbnRfY2hhcl8pKTsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBNZXRob2RzIHRoYXQgcmVhZCB3aG9sZSBwYXR0ZXJucyBtYXRjaGluZyBjZXJ0YWluIGtpbmRzIG9mIHRva2VucwotLy8gb3IgY29tbWVudHMuCi0KLXZvaWQgVG9rZW5pemVyOjpDb25zdW1lU3RyaW5nKGNoYXIgZGVsaW1pdGVyKSB7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgc3dpdGNoIChjdXJyZW50X2NoYXJfKSB7Ci0gICAgICBjYXNlICdcMCc6Ci0gICAgICAgIEFkZEVycm9yKCJVbmV4cGVjdGVkIGVuZCBvZiBzdHJpbmcuIik7Ci0gICAgICAgIHJldHVybjsKLQotICAgICAgY2FzZSAnXG4nOiB7Ci0gICAgICAgIGlmICghYWxsb3dfbXVsdGlsaW5lX3N0cmluZ3NfKSB7Ci0gICAgICAgICAgQWRkRXJyb3IoIlN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLiIpOwotICAgICAgICAgIHJldHVybjsKLSAgICAgICAgfQotICAgICAgICBOZXh0Q2hhcigpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSAnXFwnOiB7Ci0gICAgICAgIC8vIEFuIGVzY2FwZSBzZXF1ZW5jZS4KLSAgICAgICAgTmV4dENoYXIoKTsKLSAgICAgICAgaWYgKFRyeUNvbnN1bWVPbmU8RXNjYXBlPigpKSB7Ci0gICAgICAgICAgLy8gVmFsaWQgZXNjYXBlIHNlcXVlbmNlLgotICAgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWVPbmU8T2N0YWxEaWdpdD4oKSkgewotICAgICAgICAgIC8vIFBvc3NpYmx5IGZvbGxvd2VkIGJ5IHR3byBtb3JlIG9jdGFsIGRpZ2l0cywgYnV0IHRoZXNlIHdpbGwKLSAgICAgICAgICAvLyBqdXN0IGJlIGNvbnN1bWVkIGJ5IHRoZSBtYWluIGxvb3AgYW55d2F5IHNvIHdlIGRvbid0IG5lZWQKLSAgICAgICAgICAvLyB0byBkbyBzbyBleHBsaWNpdGx5IGhlcmUuCi0gICAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgneCcpKSB7Ci0gICAgICAgICAgaWYgKCFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpKSB7Ci0gICAgICAgICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgaGV4IGRpZ2l0cyBmb3IgZXNjYXBlIHNlcXVlbmNlLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBQb3NzaWJseSBmb2xsb3dlZCBieSBhbm90aGVyIGhleCBkaWdpdCwgYnV0IGFnYWluIHdlIGRvbid0IGNhcmUuCi0gICAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgndScpKSB7Ci0gICAgICAgICAgaWYgKCFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpIHx8Ci0gICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpIHx8Ci0gICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpIHx8Ci0gICAgICAgICAgICAgICFUcnlDb25zdW1lT25lPEhleERpZ2l0PigpKSB7Ci0gICAgICAgICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgZm91ciBoZXggZGlnaXRzIGZvciBcXHUgZXNjYXBlIHNlcXVlbmNlLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCdVJykpIHsKLSAgICAgICAgICAvLyBXZSBleHBlY3QgOCBoZXggZGlnaXRzOyBidXQgb25seSB0aGUgcmFuZ2UgdXAgdG8gMHgxMGZmZmYgaXMKLSAgICAgICAgICAvLyBsZWdhbC4KLSAgICAgICAgICBpZiAoIVRyeUNvbnN1bWUoJzAnKSB8fAotICAgICAgICAgICAgICAhVHJ5Q29uc3VtZSgnMCcpIHx8Ci0gICAgICAgICAgICAgICEoVHJ5Q29uc3VtZSgnMCcpIHx8IFRyeUNvbnN1bWUoJzEnKSkgfHwKLSAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKLSAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKLSAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKLSAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKLSAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkpIHsKLSAgICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBlaWdodCBoZXggZGlnaXRzIHVwIHRvIDEwZmZmZiBmb3IgXFxVIGVzY2FwZSAiCi0gICAgICAgICAgICAgICAgICAgICAic2VxdWVuY2UiKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsLiIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGlmIChjdXJyZW50X2NoYXJfID09IGRlbGltaXRlcikgewotICAgICAgICAgIE5leHRDaGFyKCk7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIE5leHRDaGFyKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1Ub2tlbml6ZXI6OlRva2VuVHlwZSBUb2tlbml6ZXI6OkNvbnN1bWVOdW1iZXIoYm9vbCBzdGFydGVkX3dpdGhfemVybywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHN0YXJ0ZWRfd2l0aF9kb3QpIHsKLSAgYm9vbCBpc19mbG9hdCA9IGZhbHNlOwotCi0gIGlmIChzdGFydGVkX3dpdGhfemVybyAmJiAoVHJ5Q29uc3VtZSgneCcpIHx8IFRyeUNvbnN1bWUoJ1gnKSkpIHsKLSAgICAvLyBBIGhleCBudW1iZXIgKHN0YXJ0ZWQgd2l0aCAiMHgiKS4KLSAgICBDb25zdW1lT25lT3JNb3JlPEhleERpZ2l0PigiXCIweFwiIG11c3QgYmUgZm9sbG93ZWQgYnkgaGV4IGRpZ2l0cy4iKTsKLQotICB9IGVsc2UgaWYgKHN0YXJ0ZWRfd2l0aF96ZXJvICYmIExvb2tpbmdBdDxEaWdpdD4oKSkgewotICAgIC8vIEFuIG9jdGFsIG51bWJlciAoaGFkIGEgbGVhZGluZyB6ZXJvKS4KLSAgICBDb25zdW1lWmVyb09yTW9yZTxPY3RhbERpZ2l0PigpOwotICAgIGlmIChMb29raW5nQXQ8RGlnaXQ+KCkpIHsKLSAgICAgIEFkZEVycm9yKCJOdW1iZXJzIHN0YXJ0aW5nIHdpdGggbGVhZGluZyB6ZXJvIG11c3QgYmUgaW4gb2N0YWwuIik7Ci0gICAgICBDb25zdW1lWmVyb09yTW9yZTxEaWdpdD4oKTsKLSAgICB9Ci0KLSAgfSBlbHNlIHsKLSAgICAvLyBBIGRlY2ltYWwgbnVtYmVyLgotICAgIGlmIChzdGFydGVkX3dpdGhfZG90KSB7Ci0gICAgICBpc19mbG9hdCA9IHRydWU7Ci0gICAgICBDb25zdW1lWmVyb09yTW9yZTxEaWdpdD4oKTsKLSAgICB9IGVsc2UgewotICAgICAgQ29uc3VtZVplcm9Pck1vcmU8RGlnaXQ+KCk7Ci0KLSAgICAgIGlmIChUcnlDb25zdW1lKCcuJykpIHsKLSAgICAgICAgaXNfZmxvYXQgPSB0cnVlOwotICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxEaWdpdD4oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBpZiAoVHJ5Q29uc3VtZSgnZScpIHx8IFRyeUNvbnN1bWUoJ0UnKSkgewotICAgICAgaXNfZmxvYXQgPSB0cnVlOwotICAgICAgVHJ5Q29uc3VtZSgnLScpIHx8IFRyeUNvbnN1bWUoJysnKTsKLSAgICAgIENvbnN1bWVPbmVPck1vcmU8RGlnaXQ+KCJcImVcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGV4cG9uZW50LiIpOwotICAgIH0KLQotICAgIGlmIChhbGxvd19mX2FmdGVyX2Zsb2F0XyAmJiAoVHJ5Q29uc3VtZSgnZicpIHx8IFRyeUNvbnN1bWUoJ0YnKSkpIHsKLSAgICAgIGlzX2Zsb2F0ID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLQotICBpZiAoTG9va2luZ0F0PExldHRlcj4oKSAmJiByZXF1aXJlX3NwYWNlX2FmdGVyX251bWJlcl8pIHsKLSAgICBBZGRFcnJvcigiTmVlZCBzcGFjZSBiZXR3ZWVuIG51bWJlciBhbmQgaWRlbnRpZmllci4iKTsKLSAgfSBlbHNlIGlmIChjdXJyZW50X2NoYXJfID09ICcuJykgewotICAgIGlmIChpc19mbG9hdCkgewotICAgICAgQWRkRXJyb3IoCi0gICAgICAgICJBbHJlYWR5IHNhdyBkZWNpbWFsIHBvaW50IG9yIGV4cG9uZW50OyBjYW4ndCBoYXZlIGFub3RoZXIgb25lLiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBBZGRFcnJvcigiSGV4IGFuZCBvY3RhbCBudW1iZXJzIG11c3QgYmUgaW50ZWdlcnMuIik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGlzX2Zsb2F0ID8gVFlQRV9GTE9BVCA6IFRZUEVfSU5URUdFUjsKLX0KLQotdm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVMaW5lQ29tbWVudChzdHJpbmcqIGNvbnRlbnQpIHsKLSAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgUmVjb3JkVG8oY29udGVudCk7Ci0KLSAgd2hpbGUgKGN1cnJlbnRfY2hhcl8gIT0gJ1wwJyAmJiBjdXJyZW50X2NoYXJfICE9ICdcbicpIHsKLSAgICBOZXh0Q2hhcigpOwotICB9Ci0gIFRyeUNvbnN1bWUoJ1xuJyk7Ci0KLSAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgU3RvcFJlY29yZGluZygpOwotfQotCi12b2lkIFRva2VuaXplcjo6Q29uc3VtZUJsb2NrQ29tbWVudChzdHJpbmcqIGNvbnRlbnQpIHsKLSAgaW50IHN0YXJ0X2xpbmUgPSBsaW5lXzsKLSAgaW50IHN0YXJ0X2NvbHVtbiA9IGNvbHVtbl8gLSAyOwotCi0gIGlmIChjb250ZW50ICE9IE5VTEwpIFJlY29yZFRvKGNvbnRlbnQpOwotCi0gIHdoaWxlICh0cnVlKSB7Ci0gICAgd2hpbGUgKGN1cnJlbnRfY2hhcl8gIT0gJ1wwJyAmJgotICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICcqJyAmJgotICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICcvJyAmJgotICAgICAgICAgICBjdXJyZW50X2NoYXJfICE9ICdcbicpIHsKLSAgICAgIE5leHRDaGFyKCk7Ci0gICAgfQotCi0gICAgaWYgKFRyeUNvbnN1bWUoJ1xuJykpIHsKLSAgICAgIGlmIChjb250ZW50ICE9IE5VTEwpIFN0b3BSZWNvcmRpbmcoKTsKLQotICAgICAgLy8gQ29uc3VtZSBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFzdGVyaXNrOwotICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZU5vTmV3bGluZT4oKTsKLSAgICAgIGlmIChUcnlDb25zdW1lKCcqJykpIHsKLSAgICAgICAgaWYgKFRyeUNvbnN1bWUoJy8nKSkgewotICAgICAgICAgIC8vIEVuZCBvZiBjb21tZW50LgotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChjb250ZW50ICE9IE5VTEwpIFJlY29yZFRvKGNvbnRlbnQpOwotICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgnKicpICYmIFRyeUNvbnN1bWUoJy8nKSkgewotICAgICAgLy8gRW5kIG9mIGNvbW1lbnQuCi0gICAgICBpZiAoY29udGVudCAhPSBOVUxMKSB7Ci0gICAgICAgIFN0b3BSZWNvcmRpbmcoKTsKLSAgICAgICAgLy8gU3RyaXAgdHJhaWxpbmcgIiovIi4KLSAgICAgICAgY29udGVudC0+ZXJhc2UoY29udGVudC0+c2l6ZSgpIC0gMik7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJy8nKSAmJiBjdXJyZW50X2NoYXJfID09ICcqJykgewotICAgICAgLy8gTm90ZTogIFdlIGRpZG4ndCBjb25zdW1lIHRoZSAnKicgYmVjYXVzZSBpZiB0aGVyZSBpcyBhICcvJyBhZnRlciBpdAotICAgICAgLy8gICB3ZSB3YW50IHRvIGludGVycHJldCB0aGF0IGFzIHRoZSBlbmQgb2YgdGhlIGNvbW1lbnQuCi0gICAgICBBZGRFcnJvcigKLSAgICAgICAgIlwiLypcIiBpbnNpZGUgYmxvY2sgY29tbWVudC4gIEJsb2NrIGNvbW1lbnRzIGNhbm5vdCBiZSBuZXN0ZWQuIik7Ci0gICAgfSBlbHNlIGlmIChjdXJyZW50X2NoYXJfID09ICdcMCcpIHsKLSAgICAgIEFkZEVycm9yKCJFbmQtb2YtZmlsZSBpbnNpZGUgYmxvY2sgY29tbWVudC4iKTsKLSAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKAotICAgICAgICBzdGFydF9saW5lLCBzdGFydF9jb2x1bW4sICIgIENvbW1lbnQgc3RhcnRlZCBoZXJlLiIpOwotICAgICAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgU3RvcFJlY29yZGluZygpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLVRva2VuaXplcjo6TmV4dENvbW1lbnRTdGF0dXMgVG9rZW5pemVyOjpUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkgewotICBpZiAoY29tbWVudF9zdHlsZV8gPT0gQ1BQX0NPTU1FTlRfU1RZTEUgJiYgVHJ5Q29uc3VtZSgnLycpKSB7Ci0gICAgaWYgKFRyeUNvbnN1bWUoJy8nKSkgewotICAgICAgcmV0dXJuIExJTkVfQ09NTUVOVDsKLSAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJyonKSkgewotICAgICAgcmV0dXJuIEJMT0NLX0NPTU1FTlQ7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE9vcHMsIGl0IHdhcyBqdXN0IGEgc2xhc2guICBSZXR1cm4gaXQuCi0gICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9TWU1CT0w7Ci0gICAgICBjdXJyZW50Xy50ZXh0ID0gIi8iOwotICAgICAgY3VycmVudF8ubGluZSA9IGxpbmVfOwotICAgICAgY3VycmVudF8uY29sdW1uID0gY29sdW1uXyAtIDE7Ci0gICAgICBjdXJyZW50Xy5lbmRfY29sdW1uID0gY29sdW1uXzsKLSAgICAgIHJldHVybiBTTEFTSF9OT1RfQ09NTUVOVDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoY29tbWVudF9zdHlsZV8gPT0gU0hfQ09NTUVOVF9TVFlMRSAmJiBUcnlDb25zdW1lKCcjJykpIHsKLSAgICByZXR1cm4gTElORV9DT01NRU5UOwotICB9IGVsc2UgewotICAgIHJldHVybiBOT19DT01NRU5UOwotICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotYm9vbCBUb2tlbml6ZXI6Ok5leHQoKSB7Ci0gIHByZXZpb3VzXyA9IGN1cnJlbnRfOwotCi0gIHdoaWxlICghcmVhZF9lcnJvcl8pIHsKLSAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlPigpOwotCi0gICAgc3dpdGNoIChUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkpIHsKLSAgICAgIGNhc2UgTElORV9DT01NRU5UOgotICAgICAgICBDb25zdW1lTGluZUNvbW1lbnQoTlVMTCk7Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgY2FzZSBCTE9DS19DT01NRU5UOgotICAgICAgICBDb25zdW1lQmxvY2tDb21tZW50KE5VTEwpOwotICAgICAgICBjb250aW51ZTsKLSAgICAgIGNhc2UgU0xBU0hfTk9UX0NPTU1FTlQ6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBOT19DT01NRU5UOgotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICAvLyBDaGVjayBmb3IgRU9GIGJlZm9yZSBjb250aW51aW5nLgotICAgIGlmIChyZWFkX2Vycm9yXykgYnJlYWs7Ci0KLSAgICBpZiAoTG9va2luZ0F0PFVucHJpbnRhYmxlPigpIHx8IGN1cnJlbnRfY2hhcl8gPT0gJ1wwJykgewotICAgICAgQWRkRXJyb3IoIkludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuIik7Ci0gICAgICBOZXh0Q2hhcigpOwotICAgICAgLy8gU2tpcCBtb3JlIHVucHJpbnRhYmxlIGNoYXJhY3RlcnMsIHRvby4gIEJ1dCwgcmVtZW1iZXIgdGhhdCAnXDAnIGlzCi0gICAgICAvLyBhbHNvIHdoYXQgY3VycmVudF9jaGFyXyBpcyBzZXQgdG8gYWZ0ZXIgRU9GIC8gcmVhZCBlcnJvci4gIFdlIGhhdmUKLSAgICAgIC8vIHRvIGJlIGNhcmVmdWwgbm90IHRvIGdvIGludG8gYW4gaW5maW5pdGUgbG9vcCBvZiB0cnlpbmcgdG8gY29uc3VtZQotICAgICAgLy8gaXQsIHNvIG1ha2Ugc3VyZSB0byBjaGVjayByZWFkX2Vycm9yXyBleHBsaWNpdGx5IGJlZm9yZSBjb25zdW1pbmcKLSAgICAgIC8vICdcMCcuCi0gICAgICB3aGlsZSAoVHJ5Q29uc3VtZU9uZTxVbnByaW50YWJsZT4oKSB8fAotICAgICAgICAgICAgICghcmVhZF9lcnJvcl8gJiYgVHJ5Q29uc3VtZSgnXDAnKSkpIHsKLSAgICAgICAgLy8gSWdub3JlLgotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFJlYWRpbmcgc29tZSBzb3J0IG9mIHRva2VuLgotICAgICAgU3RhcnRUb2tlbigpOwotCi0gICAgICBpZiAoVHJ5Q29uc3VtZU9uZTxMZXR0ZXI+KCkpIHsKLSAgICAgICAgQ29uc3VtZVplcm9Pck1vcmU8QWxwaGFudW1lcmljPigpOwotICAgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9JREVOVElGSUVSOwotICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcwJykpIHsKLSAgICAgICAgY3VycmVudF8udHlwZSA9IENvbnN1bWVOdW1iZXIodHJ1ZSwgZmFsc2UpOwotICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcuJykpIHsKLSAgICAgICAgLy8gVGhpcyBjb3VsZCBiZSB0aGUgYmVnaW5uaW5nIG9mIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLCBvciBpdCBjb3VsZAotICAgICAgICAvLyBqdXN0IGJlIGEgJy4nIHN5bWJvbC4KLQotICAgICAgICBpZiAoVHJ5Q29uc3VtZU9uZTxEaWdpdD4oKSkgewotICAgICAgICAgIC8vIEl0J3MgYSBmbG9hdGluZy1wb2ludCBudW1iZXIuCi0gICAgICAgICAgaWYgKHByZXZpb3VzXy50eXBlID09IFRZUEVfSURFTlRJRklFUiAmJgotICAgICAgICAgICAgICBjdXJyZW50Xy5saW5lID09IHByZXZpb3VzXy5saW5lICYmCi0gICAgICAgICAgICAgIGN1cnJlbnRfLmNvbHVtbiA9PSBwcmV2aW91c18uZW5kX2NvbHVtbikgewotICAgICAgICAgICAgLy8gV2UgZG9uJ3QgYWNjZXB0IHN5bnRheCBsaWtlICJibGFoLjEyMyIuCi0gICAgICAgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihsaW5lXywgY29sdW1uXyAtIDIsCi0gICAgICAgICAgICAgICJOZWVkIHNwYWNlIGJldHdlZW4gaWRlbnRpZmllciBhbmQgZGVjaW1hbCBwb2ludC4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY3VycmVudF8udHlwZSA9IENvbnN1bWVOdW1iZXIoZmFsc2UsIHRydWUpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NZTUJPTDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lT25lPERpZ2l0PigpKSB7Ci0gICAgICAgIGN1cnJlbnRfLnR5cGUgPSBDb25zdW1lTnVtYmVyKGZhbHNlLCBmYWxzZSk7Ci0gICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ1wiJykpIHsKLSAgICAgICAgQ29uc3VtZVN0cmluZygnXCInKTsKLSAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1RSSU5HOwotICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCdcJycpKSB7Ci0gICAgICAgIENvbnN1bWVTdHJpbmcoJ1wnJyk7Ci0gICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUUklORzsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENoZWNrIGlmIHRoZSBoaWdoIG9yZGVyIGJpdCBpcyBzZXQuCi0gICAgICAgIGlmIChjdXJyZW50X2NoYXJfICYgMHg4MCkgewotICAgICAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmVfLCBjb2x1bW5fLAotICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIkludGVycHJldGluZyBub24gYXNjaWkgY29kZXBvaW50ICVkLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihjdXJyZW50X2NoYXJfKSkpOwotICAgICAgICB9Ci0gICAgICAgIE5leHRDaGFyKCk7Ci0gICAgICAgIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NZTUJPTDsKLSAgICAgIH0KLQotICAgICAgRW5kVG9rZW4oKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8vIEVPRgotICBjdXJyZW50Xy50eXBlID0gVFlQRV9FTkQ7Ci0gIGN1cnJlbnRfLnRleHQuY2xlYXIoKTsKLSAgY3VycmVudF8ubGluZSA9IGxpbmVfOwotICBjdXJyZW50Xy5jb2x1bW4gPSBjb2x1bW5fOwotICBjdXJyZW50Xy5lbmRfY29sdW1uID0gY29sdW1uXzsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1uYW1lc3BhY2UgewotCi0vLyBIZWxwZXIgY2xhc3MgZm9yIGNvbGxlY3RpbmcgY29tbWVudHMgYW5kIHB1dHRpbmcgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2VzLgotLy8KLS8vIFRoaXMgYmFzaWNhbGx5IGp1c3QgYnVmZmVycyB0aGUgbW9zdCByZWNlbnQgY29tbWVudCB1bnRpbCBpdCBjYW4gYmUgZGVjaWRlZAotLy8gZXhhY3RseSB3aGVyZSB0aGF0IGNvbW1lbnQgc2hvdWxkIGJlIHBsYWNlZC4gIFdoZW4gRmx1c2goKSBpcyBjYWxsZWQsIHRoZQotLy8gY3VycmVudCBjb21tZW50IGdvZXMgaW50byBlaXRoZXIgcHJldl90cmFpbGluZ19jb21tZW50cyBvciBkZXRhY2hlZF9jb21tZW50cy4KLS8vIFdoZW4gdGhlIENvbW1lbnRDb2xsZWN0b3IgaXMgZGVzdHJveWVkLCB0aGUgbGFzdCBidWZmZXJlZCBjb21tZW50IGdvZXMgaW50bwotLy8gbmV4dF9sZWFkaW5nX2NvbW1lbnRzLgotY2xhc3MgQ29tbWVudENvbGxlY3RvciB7Ci0gcHVibGljOgotICBDb21tZW50Q29sbGVjdG9yKHN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKLSAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMsCi0gICAgICAgICAgICAgICAgICAgc3RyaW5nKiBuZXh0X2xlYWRpbmdfY29tbWVudHMpCi0gICAgICA6IHByZXZfdHJhaWxpbmdfY29tbWVudHNfKHByZXZfdHJhaWxpbmdfY29tbWVudHMpLAotICAgICAgICBkZXRhY2hlZF9jb21tZW50c18oZGV0YWNoZWRfY29tbWVudHMpLAotICAgICAgICBuZXh0X2xlYWRpbmdfY29tbWVudHNfKG5leHRfbGVhZGluZ19jb21tZW50cyksCi0gICAgICAgIGhhc19jb21tZW50XyhmYWxzZSksCi0gICAgICAgIGlzX2xpbmVfY29tbWVudF8oZmFsc2UpLAotICAgICAgICBjYW5fYXR0YWNoX3RvX3ByZXZfKHRydWUpIHsKLSAgICBpZiAocHJldl90cmFpbGluZ19jb21tZW50cyAhPSBOVUxMKSBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzLT5jbGVhcigpOwotICAgIGlmIChkZXRhY2hlZF9jb21tZW50cyAhPSBOVUxMKSBkZXRhY2hlZF9jb21tZW50cy0+Y2xlYXIoKTsKLSAgICBpZiAobmV4dF9sZWFkaW5nX2NvbW1lbnRzICE9IE5VTEwpIG5leHRfbGVhZGluZ19jb21tZW50cy0+Y2xlYXIoKTsKLSAgfQotCi0gIH5Db21tZW50Q29sbGVjdG9yKCkgewotICAgIC8vIFdoYXRldmVyIGlzIGluIHRoZSBidWZmZXIgaXMgYSBsZWFkaW5nIGNvbW1lbnQuCi0gICAgaWYgKG5leHRfbGVhZGluZ19jb21tZW50c18gIT0gTlVMTCAmJiBoYXNfY29tbWVudF8pIHsKLSAgICAgIGNvbW1lbnRfYnVmZmVyXy5zd2FwKCpuZXh0X2xlYWRpbmdfY29tbWVudHNfKTsKLSAgICB9Ci0gIH0KLQotICAvLyBBYm91dCB0byByZWFkIGEgbGluZSBjb21tZW50LiAgR2V0IHRoZSBjb21tZW50IGJ1ZmZlciBwb2ludGVyIGluIG9yZGVyIHRvCi0gIC8vIHJlYWQgaW50byBpdC4KLSAgc3RyaW5nKiBHZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpIHsKLSAgICAvLyBXZSB3YW50IHRvIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBsaW5lIGNvbW1lbnRzLCBidXQgbm90IGJsb2NrIGNvbW1lbnRzLgotICAgIGlmIChoYXNfY29tbWVudF8gJiYgIWlzX2xpbmVfY29tbWVudF8pIHsKLSAgICAgIEZsdXNoKCk7Ci0gICAgfQotICAgIGhhc19jb21tZW50XyA9IHRydWU7Ci0gICAgaXNfbGluZV9jb21tZW50XyA9IHRydWU7Ci0gICAgcmV0dXJuICZjb21tZW50X2J1ZmZlcl87Ci0gIH0KLQotICAvLyBBYm91dCB0byByZWFkIGEgYmxvY2sgY29tbWVudC4gIEdldCB0aGUgY29tbWVudCBidWZmZXIgcG9pbnRlciBpbiBvcmRlciB0bwotICAvLyByZWFkIGludG8gaXQuCi0gIHN0cmluZyogR2V0QnVmZmVyRm9yQmxvY2tDb21tZW50KCkgewotICAgIGlmIChoYXNfY29tbWVudF8pIHsKLSAgICAgIEZsdXNoKCk7Ci0gICAgfQotICAgIGhhc19jb21tZW50XyA9IHRydWU7Ci0gICAgaXNfbGluZV9jb21tZW50XyA9IGZhbHNlOwotICAgIHJldHVybiAmY29tbWVudF9idWZmZXJfOwotICB9Ci0KLSAgdm9pZCBDbGVhckJ1ZmZlcigpIHsKLSAgICBjb21tZW50X2J1ZmZlcl8uY2xlYXIoKTsKLSAgICBoYXNfY29tbWVudF8gPSBmYWxzZTsKLSAgfQotCi0gIC8vIENhbGxlZCBvbmNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWVudCBidWZmZXIgaXMgY29tcGxldGUgYW5kIGlzICpub3QqCi0gIC8vIGNvbm5lY3RlZCB0byB0aGUgbmV4dCB0b2tlbi4KLSAgdm9pZCBGbHVzaCgpIHsKLSAgICBpZiAoaGFzX2NvbW1lbnRfKSB7Ci0gICAgICBpZiAoY2FuX2F0dGFjaF90b19wcmV2XykgewotICAgICAgICBpZiAocHJldl90cmFpbGluZ19jb21tZW50c18gIT0gTlVMTCkgewotICAgICAgICAgIHByZXZfdHJhaWxpbmdfY29tbWVudHNfLT5hcHBlbmQoY29tbWVudF9idWZmZXJfKTsKLSAgICAgICAgfQotICAgICAgICBjYW5fYXR0YWNoX3RvX3ByZXZfID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoZGV0YWNoZWRfY29tbWVudHNfICE9IE5VTEwpIHsKLSAgICAgICAgICBkZXRhY2hlZF9jb21tZW50c18tPnB1c2hfYmFjayhjb21tZW50X2J1ZmZlcl8pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBDbGVhckJ1ZmZlcigpOwotICAgIH0KLSAgfQotCi0gIHZvaWQgRGV0YWNoRnJvbVByZXYoKSB7Ci0gICAgY2FuX2F0dGFjaF90b19wcmV2XyA9IGZhbHNlOwotICB9Ci0KLSBwcml2YXRlOgotICBzdHJpbmcqIHByZXZfdHJhaWxpbmdfY29tbWVudHNfOwotICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHNfOwotICBzdHJpbmcqIG5leHRfbGVhZGluZ19jb21tZW50c187Ci0KLSAgc3RyaW5nIGNvbW1lbnRfYnVmZmVyXzsKLQotICAvLyBUcnVlIGlmIGFueSBjb21tZW50cyB3ZXJlIHJlYWQgaW50byBjb21tZW50X2J1ZmZlcl8uICBUaGlzIGNhbiBiZSB0cnVlIGV2ZW4KLSAgLy8gaWYgY29tbWVudF9idWZmZXJfIGlzIGVtcHR5LCBuYW1lbHkgaWYgdGhlIGNvbW1lbnQgd2FzICIvKiovIi4KLSAgYm9vbCBoYXNfY29tbWVudF87Ci0KLSAgLy8gSXMgdGhlIGNvbW1lbnQgaW4gdGhlIGNvbW1lbnQgYnVmZmVyIGEgbGluZSBjb21tZW50PwotICBib29sIGlzX2xpbmVfY29tbWVudF87Ci0KLSAgLy8gSXMgaXQgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSBjb3VsZCBiZSByZWFkaW5nIGEgY29tbWVudCBhdHRhY2hlZCB0byB0aGUKLSAgLy8gcHJldmlvdXMgdG9rZW4/Ci0gIGJvb2wgY2FuX2F0dGFjaF90b19wcmV2XzsKLX07Ci0KLX0gLy8gbmFtZXNwYWNlCi0KLWJvb2wgVG9rZW5pemVyOjpOZXh0V2l0aENvbW1lbnRzKHN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogbmV4dF9sZWFkaW5nX2NvbW1lbnRzKSB7Ci0gIENvbW1lbnRDb2xsZWN0b3IgY29sbGVjdG9yKHByZXZfdHJhaWxpbmdfY29tbWVudHMsIGRldGFjaGVkX2NvbW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xlYWRpbmdfY29tbWVudHMpOwotCi0gIGlmIChjdXJyZW50Xy50eXBlID09IFRZUEVfU1RBUlQpIHsKLSAgICAvLyBJZ25vcmUgdW5pY29kZSBieXRlIG9yZGVyIG1hcmsoQk9NKSBpZiBpdCBhcHBlYXJzIGF0IHRoZSBmaWxlCi0gICAgLy8gYmVnaW5uaW5nLiBPbmx5IFVURi04IEJPTSAoMHhFRiAweEJCIDB4QkYpIGlzIGFjY2VwdGVkLgotICAgIGlmIChUcnlDb25zdW1lKChjaGFyKTB4RUYpKSB7Ci0gICAgICBpZiAoIVRyeUNvbnN1bWUoKGNoYXIpMHhCQikgfHwgIVRyeUNvbnN1bWUoKGNoYXIpMHhCRikpIHsKLSAgICAgICAgQWRkRXJyb3IoIlByb3RvIGZpbGUgc3RhcnRzIHdpdGggMHhFRiBidXQgbm90IFVURi04IEJPTS4gIgotICAgICAgICAgICAgICAgICAiT25seSBVVEYtOCBpcyBhY2NlcHRlZCBmb3IgcHJvdG8gZmlsZS4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBBIGNvbW1lbnQgYXBwZWFyaW5nIG9uIHRoZSBzYW1lIGxpbmUgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMKLSAgICAvLyBkZWNsYXJhdGlvbi4KLSAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOwotICAgIHN3aXRjaCAoVHJ5Q29uc3VtZUNvbW1lbnRTdGFydCgpKSB7Ci0gICAgICBjYXNlIExJTkVfQ09NTUVOVDoKLSAgICAgICAgQ29uc3VtZUxpbmVDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpKTsKLQotICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKLSAgICAgICAgLy8gY29tbWVudC4KLSAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBCTE9DS19DT01NRU5UOgotICAgICAgICBDb25zdW1lQmxvY2tDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JCbG9ja0NvbW1lbnQoKSk7Ci0KLSAgICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZU5vTmV3bGluZT4oKTsKLSAgICAgICAgaWYgKCFUcnlDb25zdW1lKCdcbicpKSB7Ci0gICAgICAgICAgLy8gT29wcywgdGhlIG5leHQgdG9rZW4gaXMgb24gdGhlIHNhbWUgbGluZS4gIElmIHdlIHJlY29yZGVkIGEgY29tbWVudAotICAgICAgICAgIC8vIHdlIHJlYWxseSBoYXZlIG5vIGlkZWEgd2hpY2ggdG9rZW4gaXQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgotICAgICAgICAgIGNvbGxlY3Rvci5DbGVhckJ1ZmZlcigpOwotICAgICAgICAgIHJldHVybiBOZXh0KCk7Ci0gICAgICAgIH0KLQotICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKLSAgICAgICAgLy8gY29tbWVudC4KLSAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBTTEFTSF9OT1RfQ09NTUVOVDoKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIE5PX0NPTU1FTlQ6Ci0gICAgICAgIGlmICghVHJ5Q29uc3VtZSgnXG4nKSkgewotICAgICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIG9uIHRoZSBzYW1lIGxpbmUuICBUaGVyZSBhcmUgbm8gY29tbWVudHMuCi0gICAgICAgICAgcmV0dXJuIE5leHQoKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICAvLyBPSywgd2UgYXJlIG5vdyBvbiB0aGUgbGluZSAqYWZ0ZXIqIHRoZSBwcmV2aW91cyB0b2tlbi4KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOwotCi0gICAgc3dpdGNoIChUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkpIHsKLSAgICAgIGNhc2UgTElORV9DT01NRU5UOgotICAgICAgICBDb25zdW1lTGluZUNvbW1lbnQoY29sbGVjdG9yLkdldEJ1ZmZlckZvckxpbmVDb21tZW50KCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgQkxPQ0tfQ09NTUVOVDoKLSAgICAgICAgQ29uc3VtZUJsb2NrQ29tbWVudChjb2xsZWN0b3IuR2V0QnVmZmVyRm9yQmxvY2tDb21tZW50KCkpOwotCi0gICAgICAgIC8vIENvbnN1bWUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgc28gdGhhdCB3ZSBkb24ndCBpbnRlcnByZXQgaXQgYXMgYQotICAgICAgICAvLyBibGFuayBsaW5lIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wLgotICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOwotICAgICAgICBUcnlDb25zdW1lKCdcbicpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0xBU0hfTk9UX0NPTU1FTlQ6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBOT19DT01NRU5UOgotICAgICAgICBpZiAoVHJ5Q29uc3VtZSgnXG4nKSkgewotICAgICAgICAgIC8vIENvbXBsZXRlbHkgYmxhbmsgbGluZS4KLSAgICAgICAgICBjb2xsZWN0b3IuRmx1c2goKTsKLSAgICAgICAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBib29sIHJlc3VsdCA9IE5leHQoKTsKLSAgICAgICAgICBpZiAoIXJlc3VsdCB8fAotICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICJ9IiB8fAotICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICJdIiB8fAotICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICIpIikgewotICAgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgc2NvcGUuICBJbiB0aGlzIGNhc2UgaXQKLSAgICAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIGF0dGFjaCBhIGNvbW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0b2tlbi4KLSAgICAgICAgICAgIGNvbGxlY3Rvci5GbHVzaCgpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUb2tlbi1wYXJzaW5nIGhlbHBlcnMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGRvbid0IG5lZWQgdG8gcmVwb3J0Ci0vLyBlcnJvcnMgc2luY2UgYW55IGVycm9ycyBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gcmVwb3J0ZWQgd2hpbGUKLS8vIHRva2VuaXppbmcuICBBbHNvLCB0aGVzZSBjYW4gYXNzdW1lIHRoYXQgd2hhdGV2ZXIgdGV4dCB0aGV5Ci0vLyBhcmUgZ2l2ZW4gaXMgdGV4dCB0aGF0IHRoZSB0b2tlbml6ZXIgYWN0dWFsbHkgcGFyc2VkIGFzIGEgdG9rZW4KLS8vIG9mIHRoZSBnaXZlbiB0eXBlLgotCi1ib29sIFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKGNvbnN0IHN0cmluZyYgdGV4dCwgdWludDY0IG1heF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0KiBvdXRwdXQpIHsKLSAgLy8gU2FkbHksIHdlIGNhbid0IGp1c3QgdXNlIHN0cnRvdWwoKSBzaW5jZSBpdCBpcyBvbmx5IDMyLWJpdCBhbmQgc3RydG91bGwoKQotICAvLyBpcyBub24tc3RhbmRhcmQuICBJIGhhdGUgdGhlIEMgc3RhbmRhcmQgbGlicmFyeS4gIDooCi0KLS8vICByZXR1cm4gc3RydG91bGwodGV4dC5jX3N0cigpLCBOVUxMLCAwKTsKLQotICBjb25zdCBjaGFyKiBwdHIgPSB0ZXh0LmNfc3RyKCk7Ci0gIGludCBiYXNlID0gMTA7Ci0gIGlmIChwdHJbMF0gPT0gJzAnKSB7Ci0gICAgaWYgKHB0clsxXSA9PSAneCcgfHwgcHRyWzFdID09ICdYJykgewotICAgICAgLy8gVGhpcyBpcyBoZXguCi0gICAgICBiYXNlID0gMTY7Ci0gICAgICBwdHIgKz0gMjsKLSAgICB9IGVsc2UgewotICAgICAgLy8gVGhpcyBpcyBvY3RhbC4KLSAgICAgIGJhc2UgPSA4OwotICAgIH0KLSAgfQotCi0gIHVpbnQ2NCByZXN1bHQgPSAwOwotICBmb3IgKDsgKnB0ciAhPSAnXDAnOyBwdHIrKykgewotICAgIGludCBkaWdpdCA9IERpZ2l0VmFsdWUoKnB0cik7Ci0gICAgaWYgKGRpZ2l0IDwgMCB8fCBkaWdpdCA+PSBiYXNlKSB7Ci0gICAgICAvLyBUaGUgdG9rZW4gcHJvdmlkZWQgYnkgVG9rZW5pemVyIGlzIGludmFsaWQuIGkuZS4sIDA5OSBpcyBhbiBpbnZhbGlkCi0gICAgICAvLyB0b2tlbiwgYnV0IFRva2VuaXplciBzdGlsbCB0aGluayBpdCdzIGludGVnZXIuCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChkaWdpdCA+IG1heF92YWx1ZSB8fCByZXN1bHQgPiAobWF4X3ZhbHVlIC0gZGlnaXQpIC8gYmFzZSkgewotICAgICAgLy8gT3ZlcmZsb3cuCi0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJlc3VsdCA9IHJlc3VsdCAqIGJhc2UgKyBkaWdpdDsKLSAgfQotCi0gICpvdXRwdXQgPSByZXN1bHQ7Ci0gIHJldHVybiB0cnVlOwotfQotCi1kb3VibGUgVG9rZW5pemVyOjpQYXJzZUZsb2F0KGNvbnN0IHN0cmluZyYgdGV4dCkgewotICBjb25zdCBjaGFyKiBzdGFydCA9IHRleHQuY19zdHIoKTsKLSAgY2hhciogZW5kOwotICBkb3VibGUgcmVzdWx0ID0gTm9Mb2NhbGVTdHJ0b2Qoc3RhcnQsICZlbmQpOwotCi0gIC8vICIxZSIgaXMgbm90IGEgdmFsaWQgZmxvYXQsIGJ1dCBpZiB0aGUgdG9rZW5pemVyIHJlYWRzIGl0LCBpdCB3aWxsCi0gIC8vIHJlcG9ydCBhbiBlcnJvciBidXQgc3RpbGwgcmV0dXJuIGl0IGFzIGEgdmFsaWQgdG9rZW4uICBXZSBuZWVkIHRvCi0gIC8vIGFjY2VwdCBhbnl0aGluZyB0aGUgdG9rZW5pemVyIGNvdWxkIHBvc3NpYmx5IHJldHVybiwgZXJyb3Igb3Igbm90LgotICBpZiAoKmVuZCA9PSAnZScgfHwgKmVuZCA9PSAnRScpIHsKLSAgICArK2VuZDsKLSAgICBpZiAoKmVuZCA9PSAnLScgfHwgKmVuZCA9PSAnKycpICsrZW5kOwotICB9Ci0KLSAgLy8gSWYgdGhlIFRva2VuaXplciBoYWQgYWxsb3dfZl9hZnRlcl9mbG9hdF8gZW5hYmxlZCwgdGhlIGZsb2F0IG1heSBiZQotICAvLyBzdWZmaXhlZCB3aXRoIHRoZSBsZXR0ZXIgJ2YnLgotICBpZiAoKmVuZCA9PSAnZicgfHwgKmVuZCA9PSAnRicpIHsKLSAgICArK2VuZDsKLSAgfQotCi0gIEdPT0dMRV9MT0dfSUYoREZBVEFMLCBlbmQgLSBzdGFydCAhPSB0ZXh0LnNpemUoKSB8fCAqc3RhcnQgPT0gJy0nKQotICAgIDw8ICIgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCkgcGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIgotICAgICAgICIgdG9rZW5pemVkIGFzIGEgZmxvYXQ6ICIgPDwgQ0VzY2FwZSh0ZXh0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gSGVscGVyIHRvIGFwcGVuZCBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIHN0cmluZyBhcyBVVEY4LCB3aXRob3V0IGJyaW5naW5nCi0vLyBpbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLgotc3RhdGljIHZvaWQgQXBwZW5kVVRGOCh1aW50MzIgY29kZV9wb2ludCwgc3RyaW5nKiBvdXRwdXQpIHsKLSAgdWludDMyIHRtcCA9IDA7Ci0gIGludCBsZW4gPSAwOwotICBpZiAoY29kZV9wb2ludCA8PSAweDdmKSB7Ci0gICAgdG1wID0gY29kZV9wb2ludDsKLSAgICBsZW4gPSAxOwotICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0gMHgwN2ZmKSB7Ci0gICAgdG1wID0gMHgwMDAwYzA4MCB8Ci0gICAgICAgICgoY29kZV9wb2ludCAmIDB4MDdjMCkgPDwgMikgfAotICAgICAgICAoY29kZV9wb2ludCAmIDB4MDAzZik7Ci0gICAgbGVuID0gMjsKLSAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4ZmZmZikgewotICAgIHRtcCA9IDB4MDBlMDgwODAgfAotICAgICAgICAoKGNvZGVfcG9pbnQgJiAweGYwMDApIDw8IDQpIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwZmMwKSA8PCAyKSB8Ci0gICAgICAgIChjb2RlX3BvaW50ICYgMHgwMDNmKTsKLSAgICBsZW4gPSAzOwotICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0gMHgxZmZmZmYpIHsKLSAgICB0bXAgPSAweGYwODA4MDgwIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgxYzAwMDApIDw8IDYpIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwM2YwMDApIDw8IDQpIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwMDBmYzApIDw8IDIpIHwKLSAgICAgICAgKGNvZGVfcG9pbnQgJiAweDAwM2YpOwotICAgIGxlbiA9IDQ7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gVVRGLTE2IGlzIG9ubHkgZGVmaW5lZCBmb3IgY29kZSBwb2ludHMgdXAgdG8gMHgxMEZGRkYsIGFuZCBVVEYtOCBpcwotICAgIC8vIG5vcm1hbGx5IG9ubHkgZGVmaW5lZCB1cCB0byB0aGVyZSBhcyB3ZWxsLgotICAgIFN0cmluZ0FwcGVuZEYob3V0cHV0LCAiXFxVJTA4eCIsIGNvZGVfcG9pbnQpOwotICAgIHJldHVybjsKLSAgfQotICB0bXAgPSBnaHRvbmwodG1wKTsKLSAgb3V0cHV0LT5hcHBlbmQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnRtcCkgKyBzaXplb2YodG1wKSAtIGxlbiwgbGVuKTsKLX0KLQotLy8gVHJ5IHRvIHJlYWQgPGxlbj4gaGV4IGRpZ2l0cyBmcm9tIHB0ciwgYW5kIHN0dWZmIHRoZSBudW1lcmljIHJlc3VsdCBpbnRvCi0vLyAqcmVzdWx0LiBSZXR1cm5zIHRydWUgaWYgdGhhdCBtYW55IGRpZ2l0cyB3ZXJlIHN1Y2Nlc3NmdWxseSBjb25zdW1lZC4KLXN0YXRpYyBib29sIFJlYWRIZXhEaWdpdHMoY29uc3QgY2hhciogcHRyLCBpbnQgbGVuLCB1aW50MzIqIHJlc3VsdCkgewotICAqcmVzdWx0ID0gMDsKLSAgaWYgKGxlbiA9PSAwKSByZXR1cm4gZmFsc2U7Ci0gIGZvciAoY29uc3QgY2hhciogZW5kID0gcHRyICsgbGVuOyBwdHIgPCBlbmQ7ICsrcHRyKSB7Ci0gICAgaWYgKCpwdHIgPT0gJ1wwJykgcmV0dXJuIGZhbHNlOwotICAgICpyZXN1bHQgPSAoKnJlc3VsdCA8PCA0KSArIERpZ2l0VmFsdWUoKnB0cik7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEhhbmRsaW5nIFVURi0xNiBzdXJyb2dhdGUgcGFpcnMuIFVURi0xNiBlbmNvZGVzIGNvZGUgcG9pbnRzIGluIHRoZSByYW5nZQotLy8gMHgxMDAwMC4uLjB4MTBmZmZmIGFzIGEgcGFpciBvZiBudW1iZXJzLCBhIGhlYWQgc3Vycm9nYXRlIGZvbGxvd2VkIGJ5IGEgdHJhaWwKLS8vIHN1cnJvZ2F0ZS4gVGhlc2UgbnVtYmVycyBhcmUgaW4gYSByZXNlcnZlZCByYW5nZSBvZiBVbmljb2RlIGNvZGUgcG9pbnRzLCBzbwotLy8gaWYgd2UgZW5jb3VudGVyIHN1Y2ggYSBwYWlyIHdlIGtub3cgaG93IHRvIHBhcnNlIGl0IGFuZCBjb252ZXJ0IGl0IGludG8gYQotLy8gc2luZ2xlIGNvZGUgcG9pbnQuCi1zdGF0aWMgY29uc3QgdWludDMyIGtNaW5IZWFkU3Vycm9nYXRlID0gMHhkODAwOwotc3RhdGljIGNvbnN0IHVpbnQzMiBrTWF4SGVhZFN1cnJvZ2F0ZSA9IDB4ZGMwMDsKLXN0YXRpYyBjb25zdCB1aW50MzIga01pblRyYWlsU3Vycm9nYXRlID0gMHhkYzAwOwotc3RhdGljIGNvbnN0IHVpbnQzMiBrTWF4VHJhaWxTdXJyb2dhdGUgPSAweGUwMDA7Ci0KLXN0YXRpYyBpbmxpbmUgYm9vbCBJc0hlYWRTdXJyb2dhdGUodWludDMyIGNvZGVfcG9pbnQpIHsKLSAgcmV0dXJuIChjb2RlX3BvaW50ID49IGtNaW5IZWFkU3Vycm9nYXRlKSAmJiAoY29kZV9wb2ludCA8IGtNYXhIZWFkU3Vycm9nYXRlKTsKLX0KLQotc3RhdGljIGlubGluZSBib29sIElzVHJhaWxTdXJyb2dhdGUodWludDMyIGNvZGVfcG9pbnQpIHsKLSAgcmV0dXJuIChjb2RlX3BvaW50ID49IGtNaW5UcmFpbFN1cnJvZ2F0ZSkgJiYKLSAgICAgIChjb2RlX3BvaW50IDwga01heFRyYWlsU3Vycm9nYXRlKTsKLX0KLQotLy8gQ29tYmluZSBhIGhlYWQgYW5kIHRyYWlsIHN1cnJvZ2F0ZSBpbnRvIGEgc2luZ2xlIFVuaWNvZGUgY29kZSBwb2ludC4KLXN0YXRpYyB1aW50MzIgQXNzZW1ibGVVVEYxNih1aW50MzIgaGVhZF9zdXJyb2dhdGUsIHVpbnQzMiB0cmFpbF9zdXJyb2dhdGUpIHsKLSAgR09PR0xFX0RDSEVDSyhJc0hlYWRTdXJyb2dhdGUoaGVhZF9zdXJyb2dhdGUpKTsKLSAgR09PR0xFX0RDSEVDSyhJc1RyYWlsU3Vycm9nYXRlKHRyYWlsX3N1cnJvZ2F0ZSkpOwotICByZXR1cm4gMHgxMDAwMCArICgoKGhlYWRfc3Vycm9nYXRlIC0ga01pbkhlYWRTdXJyb2dhdGUpIDw8IDEwKSB8Ci0gICAgICAodHJhaWxfc3Vycm9nYXRlIC0ga01pblRyYWlsU3Vycm9nYXRlKSk7Ci19Ci0KLS8vIENvbnZlcnQgdGhlIGVzY2FwZSBzZXF1ZW5jZSBwYXJhbWV0ZXIgdG8gYSBudW1iZXIgb2YgZXhwZWN0ZWQgaGV4IGRpZ2l0cy4KLXN0YXRpYyBpbmxpbmUgaW50IFVuaWNvZGVMZW5ndGgoY2hhciBrZXkpIHsKLSAgaWYgKGtleSA9PSAndScpIHJldHVybiA0OwotICBpZiAoa2V5ID09ICdVJykgcmV0dXJuIDg7Ci0gIHJldHVybiAwOwotfQotCi0vLyBHaXZlbiBhIHBvaW50ZXIgdG8gdGhlICd1JyBvciAnVScgc3RhcnRpbmcgYSBVbmljb2RlIGVzY2FwZSBzZXF1ZW5jZSwgYXR0ZW1wdAotLy8gdG8gcGFyc2UgdGhhdCBzZXF1ZW5jZS4gT24gc3VjY2VzcywgcmV0dXJucyBhIHBvaW50ZXIgdG8gdGhlIGZpcnN0IGNoYXIKLS8vIGJleW9uZCB0aGF0IHNlcXVlbmNlLCBhbmQgZmlsbHMgaW4gKmNvZGVfcG9pbnQuIE9uIGZhaWx1cmUsIHJldHVybnMgcHRyCi0vLyBpdHNlbGYuCi1zdGF0aWMgY29uc3QgY2hhciogRmV0Y2hVbmljb2RlUG9pbnQoY29uc3QgY2hhciogcHRyLCB1aW50MzIqIGNvZGVfcG9pbnQpIHsKLSAgY29uc3QgY2hhciogcCA9IHB0cjsKLSAgLy8gRmV0Y2ggdGhlIGNvZGUgcG9pbnQuCi0gIGNvbnN0IGludCBsZW4gPSBVbmljb2RlTGVuZ3RoKCpwKyspOwotICBpZiAoIVJlYWRIZXhEaWdpdHMocCwgbGVuLCBjb2RlX3BvaW50KSkKLSAgICByZXR1cm4gcHRyOwotICBwICs9IGxlbjsKLQotICAvLyBDaGVjayBpZiB0aGUgY29kZSBwb2ludCB3ZSByZWFkIGlzIGEgImhlYWQgc3Vycm9nYXRlLiIgSWYgc28sIHRoZW4gd2UKLSAgLy8gZXhwZWN0IGl0IHRvIGJlIGltbWVkaWF0ZWx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgY29kZSBwb2ludCB3aGljaCBpcyBhIHZhbGlkCi0gIC8vICJ0cmFpbCBzdXJyb2dhdGUsIiBhbmQgdG9nZXRoZXIgdGhleSBmb3JtIGEgVVRGLTE2IHBhaXIgd2hpY2ggZGVjb2RlcyBpbnRvCi0gIC8vIGEgc2luZ2xlIFVuaWNvZGUgcG9pbnQuIFRyYWlsIHN1cnJvZ2F0ZXMgbWF5IG9ubHkgdXNlIFx1LCBub3QgXFUuCi0gIGlmIChJc0hlYWRTdXJyb2dhdGUoKmNvZGVfcG9pbnQpICYmICpwID09ICdcXCcgJiYgKihwICsgMSkgPT0gJ3UnKSB7Ci0gICAgdWludDMyIHRyYWlsX3N1cnJvZ2F0ZTsKLSAgICBpZiAoUmVhZEhleERpZ2l0cyhwICsgMiwgNCwgJnRyYWlsX3N1cnJvZ2F0ZSkgJiYKLSAgICAgICAgSXNUcmFpbFN1cnJvZ2F0ZSh0cmFpbF9zdXJyb2dhdGUpKSB7Ci0gICAgICAqY29kZV9wb2ludCA9IEFzc2VtYmxlVVRGMTYoKmNvZGVfcG9pbnQsIHRyYWlsX3N1cnJvZ2F0ZSk7Ci0gICAgICBwICs9IDY7Ci0gICAgfQotICAgIC8vIElmIHRoaXMgZmFpbGVkLCB0aGVuIHdlIGp1c3QgZW1pdCB0aGUgaGVhZCBzdXJyb2dhdGUgYXMgYSBjb2RlIHBvaW50LgotICAgIC8vIEl0J3MgYm9ndXMsIGJ1dCBzbyBpcyB0aGUgc3RyaW5nLgotICB9Ci0KLSAgcmV0dXJuIHA7Ci19Ci0KLS8vIFRoZSB0ZXh0IHN0cmluZyBtdXN0IGJlZ2luIGFuZCBlbmQgd2l0aCBzaW5nbGUgb3IgZG91YmxlIHF1b3RlCi0vLyBjaGFyYWN0ZXJzLgotdm9pZCBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nQXBwZW5kKGNvbnN0IHN0cmluZyYgdGV4dCwgc3RyaW5nKiBvdXRwdXQpIHsKLSAgLy8gUmVtaW5kZXI6IHRleHRbMF0gaXMgYWx3YXlzIGEgcXVvdGUgY2hhcmFjdGVyLiAgKElmIHRleHQgaXMKLSAgLy8gZW1wdHksIGl0J3MgaW52YWxpZCwgc28gd2UnbGwganVzdCByZXR1cm4pLgotICBjb25zdCBzaXplX3QgdGV4dF9zaXplID0gdGV4dC5zaXplKCk7Ci0gIGlmICh0ZXh0X3NpemUgPT0gMCkgewotICAgIEdPT0dMRV9MT0coREZBVEFMKQotICAgICAgPDwgIiBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nQXBwZW5kKCkgcGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QiCi0gICAgICAgICAiIGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBzdHJpbmc6ICIgPDwgQ0VzY2FwZSh0ZXh0KTsKLSAgICByZXR1cm47Ci0gIH0KLQotICAvLyBSZXNlcnZlIHJvb20gZm9yIG5ldyBzdHJpbmcuIFRoZSBicmFuY2ggaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaWYKLSAgLy8gdGhlcmUgaXMgYWxyZWFkeSBzcGFjZSBhdmFpbGFibGUgdGhlIHJlc2VydmUoKSBjYWxsIG1pZ2h0Ci0gIC8vIGRvd25zaXplIHRoZSBvdXRwdXQuCi0gIGNvbnN0IHNpemVfdCBuZXdfbGVuID0gdGV4dF9zaXplICsgb3V0cHV0LT5zaXplKCk7Ci0gIGlmIChuZXdfbGVuID4gb3V0cHV0LT5jYXBhY2l0eSgpKSB7Ci0gICAgb3V0cHV0LT5yZXNlcnZlKG5ld19sZW4pOwotICB9Ci0KLSAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzdHJpbmcgY29weWluZyBjaGFyYWN0ZXJzIHRvICJvdXRwdXQiIGFuZAotICAvLyBpbnRlcnByZXRpbmcgZXNjYXBlIHNlcXVlbmNlcy4gIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBlc2NhcGUKLSAgLy8gc2VxdWVuY2VzIG9yIG90aGVyIGVycm9ycyB3ZXJlIGFscmVhZHkgcmVwb3J0ZWQgd2hpbGUgdG9rZW5pemluZy4KLSAgLy8gSW4gdGhpcyBjYXNlIHdlIGRvIG5vdCBuZWVkIHRvIHByb2R1Y2UgdmFsaWQgcmVzdWx0cy4KLSAgZm9yIChjb25zdCBjaGFyKiBwdHIgPSB0ZXh0LmNfc3RyKCkgKyAxOyAqcHRyICE9ICdcMCc7IHB0cisrKSB7Ci0gICAgaWYgKCpwdHIgPT0gJ1xcJyAmJiBwdHJbMV0gIT0gJ1wwJykgewotICAgICAgLy8gQW4gZXNjYXBlIHNlcXVlbmNlLgotICAgICAgKytwdHI7Ci0KLSAgICAgIGlmIChPY3RhbERpZ2l0OjpJbkNsYXNzKCpwdHIpKSB7Ci0gICAgICAgIC8vIEFuIG9jdGFsIGVzY2FwZS4gIE1heSBvbmUsIHR3bywgb3IgdGhyZWUgZGlnaXRzLgotICAgICAgICBpbnQgY29kZSA9IERpZ2l0VmFsdWUoKnB0cik7Ci0gICAgICAgIGlmIChPY3RhbERpZ2l0OjpJbkNsYXNzKHB0clsxXSkpIHsKLSAgICAgICAgICArK3B0cjsKLSAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBEaWdpdFZhbHVlKCpwdHIpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChPY3RhbERpZ2l0OjpJbkNsYXNzKHB0clsxXSkpIHsKLSAgICAgICAgICArK3B0cjsKLSAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBEaWdpdFZhbHVlKCpwdHIpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGNvZGUpKTsKLQotICAgICAgfSBlbHNlIGlmICgqcHRyID09ICd4JykgewotICAgICAgICAvLyBBIGhleCBlc2NhcGUuICBNYXkgemVybywgb25lLCBvciB0d28gZGlnaXRzLiAgKFRoZSB6ZXJvIGNhc2UKLSAgICAgICAgLy8gd2lsbCBoYXZlIGJlZW4gY2F1Z2h0IGFzIGFuIGVycm9yIGVhcmxpZXIuKQotICAgICAgICBpbnQgY29kZSA9IDA7Ci0gICAgICAgIGlmIChIZXhEaWdpdDo6SW5DbGFzcyhwdHJbMV0pKSB7Ci0gICAgICAgICAgKytwdHI7Ci0gICAgICAgICAgY29kZSA9IERpZ2l0VmFsdWUoKnB0cik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKEhleERpZ2l0OjpJbkNsYXNzKHB0clsxXSkpIHsKLSAgICAgICAgICArK3B0cjsKLSAgICAgICAgICBjb2RlID0gY29kZSAqIDE2ICsgRGlnaXRWYWx1ZSgqcHRyKTsKLSAgICAgICAgfQotICAgICAgICBvdXRwdXQtPnB1c2hfYmFjayhzdGF0aWNfY2FzdDxjaGFyPihjb2RlKSk7Ci0KLSAgICAgIH0gZWxzZSBpZiAoKnB0ciA9PSAndScgfHwgKnB0ciA9PSAnVScpIHsKLSAgICAgICAgdWludDMyIHVuaWNvZGU7Ci0gICAgICAgIGNvbnN0IGNoYXIqIGVuZCA9IEZldGNoVW5pY29kZVBvaW50KHB0ciwgJnVuaWNvZGUpOwotICAgICAgICBpZiAoZW5kID09IHB0cikgewotICAgICAgICAgIC8vIEZhaWx1cmU6IEp1c3QgZHVtcCBvdXQgd2hhdCB3ZSBzYXcsIGRvbid0IHRyeSB0byBwYXJzZSBpdC4KLSAgICAgICAgICBvdXRwdXQtPnB1c2hfYmFjaygqcHRyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBBcHBlbmRVVEY4KHVuaWNvZGUsIG91dHB1dCk7Ci0gICAgICAgICAgcHRyID0gZW5kIC0gMTsgIC8vIEJlY2F1c2Ugd2UncmUgYWJvdXQgdG8gKytwdHIuCi0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFNvbWUgb3RoZXIgZXNjYXBlIGNvZGUuCi0gICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKFRyYW5zbGF0ZUVzY2FwZSgqcHRyKSk7Ci0gICAgICB9Ci0KLSAgICB9IGVsc2UgaWYgKCpwdHIgPT0gdGV4dFswXSAmJiBwdHJbMV0gPT0gJ1wwJykgewotICAgICAgLy8gSWdub3JlIGZpbmFsIHF1b3RlIG1hdGNoaW5nIHRoZSBzdGFydGluZyBxdW90ZS4KLSAgICB9IGVsc2UgewotICAgICAgb3V0cHV0LT5wdXNoX2JhY2soKnB0cik7Ci0gICAgfQotICB9Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgotc3RhdGljIGJvb2wgQWxsSW5DbGFzcyhjb25zdCBzdHJpbmcmIHMpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzLnNpemUoKTsgKytpKSB7Ci0gICAgaWYgKCFDaGFyYWN0ZXJDbGFzczo6SW5DbGFzcyhzW2ldKSkKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotYm9vbCBUb2tlbml6ZXI6OklzSWRlbnRpZmllcihjb25zdCBzdHJpbmcmIHRleHQpIHsKLSAgLy8gTWlycm9ycyBJREVOVElGSUVSIGRlZmluaXRpb24gaW4gVG9rZW5pemVyOjpOZXh0KCkgYWJvdmUuCi0gIGlmICh0ZXh0LnNpemUoKSA9PSAwKQotICAgIHJldHVybiBmYWxzZTsKLSAgaWYgKCFMZXR0ZXI6OkluQ2xhc3ModGV4dC5hdCgwKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICBpZiAoIUFsbEluQ2xhc3M8QWxwaGFudW1lcmljPih0ZXh0LnN1YnN0cigxKSkpCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGlvCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NGVlN2Q4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0MTEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIENsYXNzIGZvciBwYXJzaW5nIHRva2VuaXplZCB0ZXh0IGZyb20gYSBaZXJvQ29weUlucHV0U3RyZWFtLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19UT0tFTklaRVJfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9JT19UT0tFTklaRVJfSF9fCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotCi1jbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOyAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCi0KLS8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgotY2xhc3MgRXJyb3JDb2xsZWN0b3I7Ci1jbGFzcyBUb2tlbml6ZXI7Ci0KLS8vIEJ5ICJjb2x1bW4gbnVtYmVyIiwgdGhlIHByb3RvIGNvbXBpbGVyIHJlZmVycyB0byBhIGNvdW50IG9mIHRoZSBudW1iZXIKLS8vIG9mIGJ5dGVzIGJlZm9yZSBhIGdpdmVuIGJ5dGUsIGV4Y2VwdCB0aGF0IGEgdGFiIGNoYXJhY3RlciBhZHZhbmNlcyB0bwotLy8gdGhlIG5leHQgbXVsdGlwbGUgb2YgOCBieXRlcy4gIE5vdGUgaW4gcGFydGljdWxhciB0aGF0IGNvbHVtbiBudW1iZXJzCi0vLyBhcmUgemVyby1iYXNlZCwgd2hpbGUgbWFueSB1c2VyIGludGVyZmFjZXMgdXNlIG9uZS1iYXNlZCBjb2x1bW4gbnVtYmVycy4KLXR5cGVkZWYgaW50IENvbHVtbk51bWJlcjsKLQotLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBvYmplY3Qgd2hpY2ggY29sbGVjdHMgdGhlIGVycm9ycyB0aGF0IG9jY3VyCi0vLyBkdXJpbmcgcGFyc2luZy4gIEEgdHlwaWNhbCBpbXBsZW1lbnRhdGlvbiBtaWdodCBzaW1wbHkgcHJpbnQgdGhlIGVycm9ycwotLy8gdG8gc3Rkb3V0LgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEVycm9yQ29sbGVjdG9yIHsKLSBwdWJsaWM6Ci0gIGlubGluZSBFcnJvckNvbGxlY3RvcigpIHt9Ci0gIHZpcnR1YWwgfkVycm9yQ29sbGVjdG9yKCk7Ci0KLSAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIGFuIGVycm9yIGluIHRoZSBpbnB1dCBhdCB0aGUgZ2l2ZW4gbGluZSBhbmQKLSAgLy8gY29sdW1uIG51bWJlcnMuICBUaGUgbnVtYmVycyBhcmUgemVyby1iYXNlZCwgc28geW91IG1heSB3YW50IHRvIGFkZAotICAvLyAxIHRvIGVhY2ggYmVmb3JlIHByaW50aW5nIHRoZW0uCi0gIHZpcnR1YWwgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgQ29sdW1uTnVtYmVyIGNvbHVtbiwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgPSAwOwotCi0gIC8vIEluZGljYXRlcyB0aGF0IHRoZXJlIHdhcyBhIHdhcm5pbmcgaW4gdGhlIGlucHV0IGF0IHRoZSBnaXZlbiBsaW5lIGFuZAotICAvLyBjb2x1bW4gbnVtYmVycy4gIFRoZSBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkLCBzbyB5b3UgbWF5IHdhbnQgdG8gYWRkCi0gIC8vIDEgdG8gZWFjaCBiZWZvcmUgcHJpbnRpbmcgdGhlbS4KLSAgdmlydHVhbCB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIENvbHVtbk51bWJlciBjb2x1bW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeyB9Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXJyb3JDb2xsZWN0b3IpOwotfTsKLQotLy8gVGhpcyBjbGFzcyBjb252ZXJ0cyBhIHN0cmVhbSBvZiByYXcgdGV4dCBpbnRvIGEgc3RyZWFtIG9mIHRva2VucyBmb3IKLS8vIHRoZSBwcm90b2NvbCBkZWZpbml0aW9uIHBhcnNlciB0byBwYXJzZS4gIFRoZSB0b2tlbnMgcmVjb2duaXplZCBhcmUKLS8vIHNpbWlsYXIgdG8gdGhvc2UgdGhhdCBtYWtlIHVwIHRoZSBDIGxhbmd1YWdlOyBzZWUgdGhlIFRva2VuVHlwZSBlbnVtIGZvcgotLy8gcHJlY2lzZSBkZXNjcmlwdGlvbnMuICBXaGl0ZXNwYWNlIGFuZCBjb21tZW50cyBhcmUgc2tpcHBlZC4gIEJ5IGRlZmF1bHQsCi0vLyBDLSBhbmQgQysrLXN0eWxlIGNvbW1lbnRzIGFyZSByZWNvZ25pemVkLCBidXQgb3RoZXIgc3R5bGVzIGNhbiBiZSB1c2VkIGJ5Ci0vLyBjYWxsaW5nIHNldF9jb21tZW50X3N0eWxlKCkuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVG9rZW5pemVyIHsKLSBwdWJsaWM6Ci0gIC8vIENvbnN0cnVjdCBhIFRva2VuaXplciB0aGF0IHJlYWRzIGFuZCB0b2tlbml6ZXMgdGV4dCBmcm9tIHRoZSBnaXZlbgotICAvLyBpbnB1dCBzdHJlYW0gYW5kIHdyaXRlcyBlcnJvcnMgdG8gdGhlIGdpdmVuIGVycm9yX2NvbGxlY3Rvci4KLSAgLy8gVGhlIGNhbGxlciBrZWVwcyBvd25lcnNoaXAgb2YgaW5wdXQgYW5kIGVycm9yX2NvbGxlY3Rvci4KLSAgVG9rZW5pemVyKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yKTsKLSAgflRva2VuaXplcigpOwotCi0gIGVudW0gVG9rZW5UeXBlIHsKLSAgICBUWVBFX1NUQVJULCAgICAgICAvLyBOZXh0KCkgaGFzIG5vdCB5ZXQgYmVlbiBjYWxsZWQuCi0gICAgVFlQRV9FTkQsICAgICAgICAgLy8gRW5kIG9mIGlucHV0IHJlYWNoZWQuICAidGV4dCIgaXMgZW1wdHkuCi0KLSAgICBUWVBFX0lERU5USUZJRVIsICAvLyBBIHNlcXVlbmNlIG9mIGxldHRlcnMsIGRpZ2l0cywgYW5kIHVuZGVyc2NvcmVzLCBub3QKLSAgICAgICAgICAgICAgICAgICAgICAvLyBzdGFydGluZyB3aXRoIGEgZGlnaXQuICBJdCBpcyBhbiBlcnJvciBmb3IgYSBudW1iZXIKLSAgICAgICAgICAgICAgICAgICAgICAvLyB0byBiZSBmb2xsb3dlZCBieSBhbiBpZGVudGlmaWVyIHdpdGggbm8gc3BhY2UgaW4KLSAgICAgICAgICAgICAgICAgICAgICAvLyBiZXR3ZWVuLgotICAgIFRZUEVfSU5URUdFUiwgICAgIC8vIEEgc2VxdWVuY2Ugb2YgZGlnaXRzIHJlcHJlc2VudGluZyBhbiBpbnRlZ2VyLiAgTm9ybWFsbHkKLSAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgZGlnaXRzIGFyZSBkZWNpbWFsLCBidXQgYSBwcmVmaXggb2YgIjB4IiBpbmRpY2F0ZXMKLSAgICAgICAgICAgICAgICAgICAgICAvLyBhIGhleCBudW1iZXIgYW5kIGEgbGVhZGluZyB6ZXJvIGluZGljYXRlcyBvY3RhbCwganVzdAotICAgICAgICAgICAgICAgICAgICAgIC8vIGxpa2Ugd2l0aCBDIG51bWVyaWMgbGl0ZXJhbHMuICBBIGxlYWRpbmcgbmVnYXRpdmUgc2lnbgotICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIE5PVCBpbmNsdWRlZCBpbiB0aGUgdG9rZW47IGl0J3MgdXAgdG8gdGhlIHBhcnNlciB0bwotICAgICAgICAgICAgICAgICAgICAgIC8vIGludGVycHJldCB0aGUgdW5hcnkgbWludXMgb3BlcmF0b3Igb24gaXRzIG93bi4KLSAgICBUWVBFX0ZMT0FULCAgICAgICAvLyBBIGZsb2F0aW5nIHBvaW50IGxpdGVyYWwsIHdpdGggYSBmcmFjdGlvbmFsIHBhcnQgYW5kL29yCi0gICAgICAgICAgICAgICAgICAgICAgLy8gYW4gZXhwb25lbnQuICBBbHdheXMgaW4gZGVjaW1hbC4gIEFnYWluLCBuZXZlcgotICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZ2F0aXZlLgotICAgIFRZUEVfU1RSSU5HLCAgICAgIC8vIEEgcXVvdGVkIHNlcXVlbmNlIG9mIGVzY2FwZWQgY2hhcmFjdGVycy4gIEVpdGhlciBzaW5nbGUKLSAgICAgICAgICAgICAgICAgICAgICAvLyBvciBkb3VibGUgcXVvdGVzIGNhbiBiZSB1c2VkLCBidXQgdGhleSBtdXN0IG1hdGNoLgotICAgICAgICAgICAgICAgICAgICAgIC8vIEEgc3RyaW5nIGxpdGVyYWwgY2Fubm90IGNyb3NzIGEgbGluZSBicmVhay4KLSAgICBUWVBFX1NZTUJPTCwgICAgICAvLyBBbnkgb3RoZXIgcHJpbnRhYmxlIGNoYXJhY3RlciwgbGlrZSAnIScgb3IgJysnLgotICAgICAgICAgICAgICAgICAgICAgIC8vIFN5bWJvbHMgYXJlIGFsd2F5cyBhIHNpbmdsZSBjaGFyYWN0ZXIsIHNvICIhKyQlIiBpcwotICAgICAgICAgICAgICAgICAgICAgIC8vIGZvdXIgdG9rZW5zLgotICB9OwotCi0gIC8vIFN0cnVjdHVyZSByZXByZXNlbnRpbmcgYSB0b2tlbiByZWFkIGZyb20gdGhlIHRva2VuIHN0cmVhbS4KLSAgc3RydWN0IFRva2VuIHsKLSAgICBUb2tlblR5cGUgdHlwZTsKLSAgICBzdHJpbmcgdGV4dDsgICAgICAgLy8gVGhlIGV4YWN0IHRleHQgb2YgdGhlIHRva2VuIGFzIGl0IGFwcGVhcmVkIGluCi0gICAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBpbnB1dC4gIGUuZy4gdG9rZW5zIG9mIFRZUEVfU1RSSU5HIHdpbGwgc3RpbGwKLSAgICAgICAgICAgICAgICAgICAgICAgLy8gYmUgZXNjYXBlZCBhbmQgaW4gcXVvdGVzLgotCi0gICAgLy8gImxpbmUiIGFuZCAiY29sdW1uIiBzcGVjaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCi0gICAgLy8gdGhlIHRva2VuIHdpdGhpbiB0aGUgaW5wdXQgc3RyZWFtLiAgVGhleSBhcmUgemVyby1iYXNlZC4KLSAgICBpbnQgbGluZTsKLSAgICBDb2x1bW5OdW1iZXIgY29sdW1uOwotICAgIENvbHVtbk51bWJlciBlbmRfY29sdW1uOwotICB9OwotCi0gIC8vIEdldCB0aGUgY3VycmVudCB0b2tlbi4gIFRoaXMgaXMgdXBkYXRlZCB3aGVuIE5leHQoKSBpcyBjYWxsZWQuICBCZWZvcmUKLSAgLy8gdGhlIGZpcnN0IGNhbGwgdG8gTmV4dCgpLCBjdXJyZW50KCkgaGFzIHR5cGUgVFlQRV9TVEFSVCBhbmQgbm8gY29udGVudHMuCi0gIGNvbnN0IFRva2VuJiBjdXJyZW50KCk7Ci0KLSAgLy8gUmV0dXJuIHRoZSBwcmV2aW91cyB0b2tlbiAtLSBpLmUuIHdoYXQgY3VycmVudCgpIHJldHVybmVkIGJlZm9yZSB0aGUKLSAgLy8gcHJldmlvdXMgY2FsbCB0byBOZXh0KCkuCi0gIGNvbnN0IFRva2VuJiBwcmV2aW91cygpOwotCi0gIC8vIEFkdmFuY2UgdG8gdGhlIG5leHQgdG9rZW4uICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBlbmQgb2YgdGhlIGlucHV0IGlzCi0gIC8vIHJlYWNoZWQuCi0gIGJvb2wgTmV4dCgpOwotCi0gIC8vIExpa2UgTmV4dCgpLCBidXQgYWxzbyBjb2xsZWN0cyBjb21tZW50cyB3aGljaCBhcHBlYXIgYmV0d2VlbiB0aGUgcHJldmlvdXMKLSAgLy8gYW5kIG5leHQgdG9rZW5zLgotICAvLwotICAvLyBDb21tZW50cyB3aGljaCBhcHBlYXIgdG8gYmUgYXR0YWNoZWQgdG8gdGhlIHByZXZpb3VzIHRva2VuIGFyZSBzdG9yZWQKLSAgLy8gaW4gKnByZXZfdGFpbGluZ19jb21tZW50cy4gIENvbW1lbnRzIHdoaWNoIGFwcGVhciB0byBiZSBhdHRhY2hlZCB0byB0aGUKLSAgLy8gbmV4dCB0b2tlbiBhcmUgc3RvcmVkIGluICpuZXh0X2xlYWRpbmdfY29tbWVudHMuICBDb21tZW50cyBhcHBlYXJpbmcgaW4KLSAgLy8gYmV0d2VlbiB3aGljaCBkbyBub3QgYXBwZWFyIHRvIGJlIGF0dGFjaGVkIHRvIGVpdGhlciB3aWxsIGJlIGFkZGVkIHRvCi0gIC8vIGRldGFjaGVkX2NvbW1lbnRzLiAgQW55IG9mIHRoZXNlIHBhcmFtZXRlcnMgY2FuIGJlIE5VTEwgdG8gc2ltcGx5IGRpc2NhcmQKLSAgLy8gdGhlIGNvbW1lbnRzLgotICAvLwotICAvLyBBIHNlcmllcyBvZiBsaW5lIGNvbW1lbnRzIGFwcGVhcmluZyBvbiBjb25zZWN1dGl2ZSBsaW5lcywgd2l0aCBubyBvdGhlcgotICAvLyB0b2tlbnMgYXBwZWFyaW5nIG9uIHRob3NlIGxpbmVzLCB3aWxsIGJlIHRyZWF0ZWQgYXMgYSBzaW5nbGUgY29tbWVudC4KLSAgLy8KLSAgLy8gT25seSB0aGUgY29tbWVudCBjb250ZW50IGlzIHJldHVybmVkOyBjb21tZW50IG1hcmtlcnMgKGUuZy4gLy8pIGFyZQotICAvLyBzdHJpcHBlZCBvdXQuICBGb3IgYmxvY2sgY29tbWVudHMsIGxlYWRpbmcgd2hpdGVzcGFjZSBhbmQgYW4gYXN0ZXJpc2sgd2lsbAotICAvLyBiZSBzdHJpcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIG90aGVyIHRoYW4gdGhlIGZpcnN0LiAgTmV3bGluZXMKLSAgLy8gYXJlIGluY2x1ZGVkIGluIHRoZSBvdXRwdXQuCi0gIC8vCi0gIC8vIEV4YW1wbGVzOgotICAvLwotICAvLyAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7ICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGZvby4KLSAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhci4KLSAgLy8gICBvcHRpb25hbCBpbnQzMiBiYXIgPSAyOwotICAvLwotICAvLyAgIG9wdGlvbmFsIHN0cmluZyBiYXogPSAzOwotICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gYmF6LgotICAvLyAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBiYXouCi0gIC8vCi0gIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBxdXguCi0gIC8vICAgLy8KLSAgLy8gICAvLyBBbm90aGVyIGxpbmUgYXR0YWNoZWQgdG8gcXV4LgotICAvLyAgIG9wdGlvbmFsIGRvdWJsZSBxdXggPSA0OwotICAvLwotICAvLyAgIC8vIERldGFjaGVkIGNvbW1lbnQuICBUaGlzIGlzIG5vdCBhdHRhY2hlZCB0byBxdXggb3IgY29yZ2UKLSAgLy8gICAvLyBiZWNhdXNlIHRoZXJlIGFyZSBibGFuayBsaW5lcyBzZXBhcmF0aW5nIGl0IGZyb20gYm90aC4KLSAgLy8KLSAgLy8gICBvcHRpb25hbCBzdHJpbmcgY29yZ2UgPSA1OwotICAvLyAgIC8qIEJsb2NrIGNvbW1lbnQgYXR0YWNoZWQKLSAgLy8gICAgKiB0byBjb3JnZS4gIExlYWRpbmcgYXN0ZXJpc2tzCi0gIC8vICAgICogd2lsbCBiZSByZW1vdmVkLiAqLwotICAvLyAgIC8qIEJsb2NrIGNvbW1lbnQgYXR0YWNoZWQgdG8KLSAgLy8gICAgKiBncmF1bHQuICovCi0gIC8vICAgb3B0aW9uYWwgaW50MzIgZ3JhdWx0ID0gNjsKLSAgYm9vbCBOZXh0V2l0aENvbW1lbnRzKHN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKLQotICAvLyBQYXJzZSBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIFBhcnNlcyBhIFRZUEVfRkxPQVQgdG9rZW4uICBUaGlzIG5ldmVyIGZhaWxzLCBzbyBsb25nIGFzIHRoZSB0ZXh0IGFjdHVhbGx5Ci0gIC8vIGNvbWVzIGZyb20gYSBUWVBFX0ZMT0FUIHRva2VuIHBhcnNlZCBieSBUb2tlbml6ZXIuICBJZiBpdCBkb2Vzbid0LCB0aGUKLSAgLy8gcmVzdWx0IGlzIHVuZGVmaW5lZCAocG9zc2libHkgYW4gYXNzZXJ0IGZhaWx1cmUpLgotICBzdGF0aWMgZG91YmxlIFBhcnNlRmxvYXQoY29uc3Qgc3RyaW5nJiB0ZXh0KTsKLQotICAvLyBQYXJzZXMgYSBUWVBFX1NUUklORyB0b2tlbi4gIFRoaXMgbmV2ZXIgZmFpbHMsIHNvIGxvbmcgYXMgdGhlIHRleHQgYWN0dWFsbHkKLSAgLy8gY29tZXMgZnJvbSBhIFRZUEVfU1RSSU5HIHRva2VuIHBhcnNlZCBieSBUb2tlbml6ZXIuICBJZiBpdCBkb2Vzbid0LCB0aGUKLSAgLy8gcmVzdWx0IGlzIHVuZGVmaW5lZCAocG9zc2libHkgYW4gYXNzZXJ0IGZhaWx1cmUpLgotICBzdGF0aWMgdm9pZCBQYXJzZVN0cmluZyhjb25zdCBzdHJpbmcmIHRleHQsIHN0cmluZyogb3V0cHV0KTsKLQotICAvLyBJZGVudGljYWwgdG8gUGFyc2VTdHJpbmcsIGJ1dCBhcHBlbmRzIHRvIG91dHB1dC4KLSAgc3RhdGljIHZvaWQgUGFyc2VTdHJpbmdBcHBlbmQoY29uc3Qgc3RyaW5nJiB0ZXh0LCBzdHJpbmcqIG91dHB1dCk7Ci0KLSAgLy8gUGFyc2VzIGEgVFlQRV9JTlRFR0VSIHRva2VuLiAgUmV0dXJucyBmYWxzZSBpZiB0aGUgcmVzdWx0IHdvdWxkIGJlCi0gIC8vIGdyZWF0ZXIgdGhhbiBtYXhfdmFsdWUuICBPdGhlcndpc2UsIHJldHVybnMgdHJ1ZSBhbmQgc2V0cyAqb3V0cHV0IHRvIHRoZQotICAvLyByZXN1bHQuICBJZiB0aGUgdGV4dCBpcyBub3QgZnJvbSBhIFRva2VuIG9mIHR5cGUgVFlQRV9JTlRFR0VSIG9yaWdpbmFsbHkKLSAgLy8gcGFyc2VkIGJ5IGEgVG9rZW5pemVyLCB0aGUgcmVzdWx0IGlzIHVuZGVmaW5lZCAocG9zc2libHkgYW4gYXNzZXJ0Ci0gIC8vIGZhaWx1cmUpLgotICBzdGF0aWMgYm9vbCBQYXJzZUludGVnZXIoY29uc3Qgc3RyaW5nJiB0ZXh0LCB1aW50NjQgbWF4X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0KiBvdXRwdXQpOwotCi0gIC8vIE9wdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gU2V0IHRydWUgdG8gYWxsb3cgZmxvYXRzIHRvIGJlIHN1ZmZpeGVkIHdpdGggdGhlIGxldHRlciAnZicuICBUb2tlbnMKLSAgLy8gd2hpY2ggd291bGQgb3RoZXJ3aXNlIGJlIGludGVnZXJzIGJ1dCB3aGljaCBoYXZlIHRoZSAnZicgc3VmZml4IHdpbGwgYmUKLSAgLy8gZm9yY2VkIHRvIGJlIGludGVycHJldGVkIGFzIGZsb2F0cy4gIEZvciBhbGwgb3RoZXIgcHVycG9zZXMsIHRoZSAnZicgaXMKLSAgLy8gaWdub3JlZC4KLSAgdm9pZCBzZXRfYWxsb3dfZl9hZnRlcl9mbG9hdChib29sIHZhbHVlKSB7IGFsbG93X2ZfYWZ0ZXJfZmxvYXRfID0gdmFsdWU7IH0KLQotICAvLyBWYWxpZCB2YWx1ZXMgZm9yIHNldF9jb21tZW50X3N0eWxlKCkuCi0gIGVudW0gQ29tbWVudFN0eWxlIHsKLSAgICAvLyBMaW5lIGNvbW1lbnRzIGJlZ2luIHdpdGggIi8vIiwgYmxvY2sgY29tbWVudHMgYXJlIGRlbGltaXRlZCBieSAiLyoiIGFuZAotICAgIC8vICIqLyIuCi0gICAgQ1BQX0NPTU1FTlRfU1RZTEUsCi0gICAgLy8gTGluZSBjb21tZW50cyBiZWdpbiB3aXRoICIjIi4gIE5vIHdheSB0byB3cml0ZSBibG9jayBjb21tZW50cy4KLSAgICBTSF9DT01NRU5UX1NUWUxFCi0gIH07Ci0KLSAgLy8gU2V0cyB0aGUgY29tbWVudCBzdHlsZS4KLSAgdm9pZCBzZXRfY29tbWVudF9zdHlsZShDb21tZW50U3R5bGUgc3R5bGUpIHsgY29tbWVudF9zdHlsZV8gPSBzdHlsZTsgfQotCi0gIC8vIFdoZXRoZXIgdG8gcmVxdWlyZSB3aGl0ZXNwYWNlIGJldHdlZW4gYSBudW1iZXIgYW5kIGEgZmllbGQgbmFtZS4KLSAgLy8gRGVmYXVsdCBpcyB0cnVlLiBEbyBub3QgdXNlIHRoaXM7IGZvciBHb29nbGUtaW50ZXJuYWwgY2xlYW51cCBvbmx5LgotICB2b2lkIHNldF9yZXF1aXJlX3NwYWNlX2FmdGVyX251bWJlcihib29sIHJlcXVpcmUpIHsKLSAgICByZXF1aXJlX3NwYWNlX2FmdGVyX251bWJlcl8gPSByZXF1aXJlOwotICB9Ci0KLSAgLy8gV2hldGhlciB0byBhbGxvdyBzdHJpbmcgbGl0ZXJhbHMgdG8gc3BhbiBtdWx0aXBsZSBsaW5lcy4gRGVmYXVsdCBpcyBmYWxzZS4KLSAgLy8gRG8gbm90IHVzZSB0aGlzOyBmb3IgR29vZ2xlLWludGVybmFsIGNsZWFudXAgb25seS4KLSAgdm9pZCBzZXRfYWxsb3dfbXVsdGlsaW5lX3N0cmluZ3MoYm9vbCBhbGxvdykgewotICAgIGFsbG93X211bHRpbGluZV9zdHJpbmdzXyA9IGFsbG93OwotICB9Ci0KLSAgLy8gRXh0ZXJuYWwgaGVscGVyOiB2YWxpZGF0ZSBhbiBpZGVudGlmaWVyLgotICBzdGF0aWMgYm9vbCBJc0lkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiB0ZXh0KTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUb2tlbml6ZXIpOwotCi0gIFRva2VuIGN1cnJlbnRfOyAgICAgICAgICAgLy8gUmV0dXJuZWQgYnkgY3VycmVudCgpLgotICBUb2tlbiBwcmV2aW91c187ICAgICAgICAgIC8vIFJldHVybmVkIGJ5IHByZXZpb3VzKCkuCi0KLSAgWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXRfOwotICBFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKLQotICBjaGFyIGN1cnJlbnRfY2hhcl87ICAgICAgIC8vID09IGJ1ZmZlcl9bYnVmZmVyX3Bvc19dLCB1cGRhdGVkIGJ5IE5leHRDaGFyKCkuCi0gIGNvbnN0IGNoYXIqIGJ1ZmZlcl87ICAgICAgLy8gQ3VycmVudCBidWZmZXIgcmV0dXJuZWQgZnJvbSBpbnB1dF8uCi0gIGludCBidWZmZXJfc2l6ZV87ICAgICAgICAgLy8gU2l6ZSBvZiBidWZmZXJfLgotICBpbnQgYnVmZmVyX3Bvc187ICAgICAgICAgIC8vIEN1cnJlbnQgcG9zaXRpb24gd2l0aGluIHRoZSBidWZmZXIuCi0gIGJvb2wgcmVhZF9lcnJvcl87ICAgICAgICAgLy8gRGlkIHdlIHByZXZpb3VzbHkgZW5jb3VudGVyIGEgcmVhZCBlcnJvcj8KLQotICAvLyBMaW5lIGFuZCBjb2x1bW4gbnVtYmVyIG9mIGN1cnJlbnRfY2hhcl8gd2l0aGluIHRoZSB3aG9sZSBpbnB1dCBzdHJlYW0uCi0gIGludCBsaW5lXzsKLSAgQ29sdW1uTnVtYmVyIGNvbHVtbl87Ci0KLSAgLy8gU3RyaW5nIHRvIHdoaWNoIHRleHQgc2hvdWxkIGJlIGFwcGVuZGVkIGFzIHdlIGFkdmFuY2UgdGhyb3VnaCBpdC4KLSAgLy8gQ2FsbCBSZWNvcmRUbygmc3RyKSB0byBzdGFydCByZWNvcmRpbmcgYW5kIFN0b3BSZWNvcmRpbmcoKSB0byBzdG9wLgotICAvLyBFLmcuIFN0YXJ0VG9rZW4oKSBjYWxscyBSZWNvcmRUbygmY3VycmVudF8udGV4dCkuICByZWNvcmRfc3RhcnRfIGlzIHRoZQotICAvLyBwb3NpdGlvbiB3aXRoaW4gdGhlIGN1cnJlbnQgYnVmZmVyIHdoZXJlIHJlY29yZGluZyBzdGFydGVkLgotICBzdHJpbmcqIHJlY29yZF90YXJnZXRfOwotICBpbnQgcmVjb3JkX3N0YXJ0XzsKLQotICAvLyBPcHRpb25zLgotICBib29sIGFsbG93X2ZfYWZ0ZXJfZmxvYXRfOwotICBDb21tZW50U3R5bGUgY29tbWVudF9zdHlsZV87Ci0gIGJvb2wgcmVxdWlyZV9zcGFjZV9hZnRlcl9udW1iZXJfOwotICBib29sIGFsbG93X211bHRpbGluZV9zdHJpbmdzXzsKLQotICAvLyBTaW5jZSB3ZSBjb3VudCBjb2x1bW5zIHdlIG5lZWQgdG8gaW50ZXJwcmV0IHRhYnMgc29tZWhvdy4gIFdlJ2xsIHRha2UKLSAgLy8gdGhlIHN0YW5kYXJkIDgtY2hhcmFjdGVyIGRlZmluaXRpb24gZm9yIGxhY2sgb2YgYW55IHdheSB0byBkbyBiZXR0ZXIuCi0gIC8vIFRoaXMgbXVzdCBtYXRjaCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBDb2x1bW5OdW1iZXIuCi0gIHN0YXRpYyBjb25zdCBpbnQga1RhYldpZHRoID0gODsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBIZWxwZXIgbWV0aG9kcy4KLQotICAvLyBDb25zdW1lIHRoaXMgY2hhcmFjdGVyIGFuZCBhZHZhbmNlIHRvIHRoZSBuZXh0IG9uZS4KLSAgdm9pZCBOZXh0Q2hhcigpOwotCi0gIC8vIFJlYWQgYSBuZXcgYnVmZmVyIGZyb20gdGhlIGlucHV0LgotICB2b2lkIFJlZnJlc2goKTsKLQotICBpbmxpbmUgdm9pZCBSZWNvcmRUbyhzdHJpbmcqIHRhcmdldCk7Ci0gIGlubGluZSB2b2lkIFN0b3BSZWNvcmRpbmcoKTsKLQotICAvLyBDYWxsZWQgd2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBvZiBhIG5ldwotICAvLyB0b2tlbiAobm90IGluY2x1ZGluZyB3aGl0ZXNwYWNlIG9yIGNvbW1lbnRzKS4KLSAgaW5saW5lIHZvaWQgU3RhcnRUb2tlbigpOwotICAvLyBDYWxsZWQgd2hlbiB0aGUgY3VycmVudCBjaGFyYWN0ZXIgaXMgdGhlIGZpcnN0IGNoYXJhY3RlciBhZnRlciB0aGUKLSAgLy8gZW5kIG9mIHRoZSBsYXN0IHRva2VuLiAgQWZ0ZXIgdGhpcyByZXR1cm5zLCBjdXJyZW50Xy50ZXh0IHdpbGwKLSAgLy8gY29udGFpbiBhbGwgdGV4dCBjb25zdW1lZCBzaW5jZSBTdGFydFRva2VuKCkgd2FzIGNhbGxlZC4KLSAgaW5saW5lIHZvaWQgRW5kVG9rZW4oKTsKLQotICAvLyBDb252ZW5pZW5jZSBtZXRob2QgdG8gYWRkIGFuIGVycm9yIGF0IHRoZSBjdXJyZW50IGxpbmUgYW5kIGNvbHVtbi4KLSAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihsaW5lXywgY29sdW1uXywgbWVzc2FnZSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUaGUgZm9sbG93aW5nIGZvdXIgbWV0aG9kcyBhcmUgdXNlZCB0byBjb25zdW1lIHRva2VucyBvZiBzcGVjaWZpYwotICAvLyB0eXBlcy4gIFRoZXkgYXJlIGFjdHVhbGx5IHVzZWQgdG8gY29uc3VtZSBhbGwgY2hhcmFjdGVycyAqYWZ0ZXIqCi0gIC8vIHRoZSBmaXJzdCwgc2luY2UgdGhlIGNhbGxpbmcgZnVuY3Rpb24gY29uc3VtZXMgdGhlIGZpcnN0IGNoYXJhY3RlcgotICAvLyBpbiBvcmRlciB0byBkZWNpZGUgd2hhdCBraW5kIG9mIHRva2VuIGlzIGJlaW5nIHJlYWQuCi0KLSAgLy8gUmVhZCBhbmQgY29uc3VtZSBhIHN0cmluZywgZW5kaW5nIHdoZW4gdGhlIGdpdmVuIGRlbGltaXRlciBpcwotICAvLyBjb25zdW1lZC4KLSAgdm9pZCBDb25zdW1lU3RyaW5nKGNoYXIgZGVsaW1pdGVyKTsKLQotICAvLyBSZWFkIGFuZCBjb25zdW1lIGEgbnVtYmVyLCByZXR1cm5pbmcgVFlQRV9GTE9BVCBvciBUWVBFX0lOVEVHRVIKLSAgLy8gZGVwZW5kaW5nIG9uIHdoYXQgd2FzIHJlYWQuICBUaGlzIG5lZWRzIHRvIGtub3cgaWYgdGhlIGZpcnN0Ci0gIC8vIGNoYXJhY3RlciB3YXMgYSB6ZXJvIGluIG9yZGVyIHRvIGNvcnJlY3RseSByZWNvZ25pemUgaGV4IGFuZCBvY3RhbAotICAvLyBudW1iZXJzLgotICAvLyBJdCBhbHNvIG5lZWRzIHRvIGtub3cgaWYgdGhlIGZpcnN0IGNoYXJhY3RlZCB3YXMgYSAuIHRvIHBhcnNlIGZsb2F0aW5nCi0gIC8vIHBvaW50IGNvcnJlY3RseS4KLSAgVG9rZW5UeXBlIENvbnN1bWVOdW1iZXIoYm9vbCBzdGFydGVkX3dpdGhfemVybywgYm9vbCBzdGFydGVkX3dpdGhfZG90KTsKLQotICAvLyBDb25zdW1lIHRoZSByZXN0IG9mIGEgbGluZS4KLSAgdm9pZCBDb25zdW1lTGluZUNvbW1lbnQoc3RyaW5nKiBjb250ZW50KTsKLSAgLy8gQ29uc3VtZSB1bnRpbCAiKi8iLgotICB2b2lkIENvbnN1bWVCbG9ja0NvbW1lbnQoc3RyaW5nKiBjb250ZW50KTsKLQotICBlbnVtIE5leHRDb21tZW50U3RhdHVzIHsKLSAgICAvLyBTdGFydGVkIGEgbGluZSBjb21tZW50LgotICAgIExJTkVfQ09NTUVOVCwKLQotICAgIC8vIFN0YXJ0ZWQgYSBibG9jayBjb21tZW50LgotICAgIEJMT0NLX0NPTU1FTlQsCi0KLSAgICAvLyBDb25zdW1lZCBhIHNsYXNoLCB0aGVuIHJlYWxpemVkIGl0IHdhc24ndCBhIGNvbW1lbnQuICBjdXJyZW50XyBoYXMKLSAgICAvLyBiZWVuIGZpbGxlZCBpbiB3aXRoIGEgc2xhc2ggdG9rZW4uICBUaGUgY2FsbGVyIHNob3VsZCByZXR1cm4gaXQuCi0gICAgU0xBU0hfTk9UX0NPTU1FTlQsCi0KLSAgICAvLyBXZSBkbyBub3QgYXBwZWFyIHRvIGJlIHN0YXJ0aW5nIGEgY29tbWVudCBoZXJlLgotICAgIE5PX0NPTU1FTlQKLSAgfTsKLQotICAvLyBJZiB3ZSdyZSBhdCB0aGUgc3RhcnQgb2YgYSBuZXcgY29tbWVudCwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIHdoYXQga2luZAotICAvLyBvZiBjb21tZW50IGl0IGlzLgotICBOZXh0Q29tbWVudFN0YXR1cyBUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlc2UgaGVscGVyIG1ldGhvZHMgbWFrZSB0aGUgcGFyc2luZyBjb2RlIG1vcmUgcmVhZGFibGUuICBUaGUKLSAgLy8gImNoYXJhY3RlciBjbGFzc2VzIiByZWZlcnJlZCB0byBhcmUgZGVmaW5lZCBhdCB0aGUgdG9wIG9mIHRoZSAuY2MgZmlsZS4KLSAgLy8gQmFzaWNhbGx5IGl0IGlzIGEgQysrIGNsYXNzIHdpdGggb25lIG1ldGhvZDoKLSAgLy8gICBzdGF0aWMgYm9vbCBJbkNsYXNzKGNoYXIgYyk7Ci0gIC8vIFRoZSBtZXRob2QgcmV0dXJucyB0cnVlIGlmIGMgaXMgYSBtZW1iZXIgb2YgdGhpcyAiY2xhc3MiLCBsaWtlICJMZXR0ZXIiCi0gIC8vIG9yICJEaWdpdCIuCi0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBvZiB0aGUgZ2l2ZW4gY2hhcmFjdGVyCi0gIC8vIGNsYXNzLCBidXQgZG9lcyBub3QgY29uc3VtZSBhbnl0aGluZy4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+Ci0gIGlubGluZSBib29sIExvb2tpbmdBdCgpOwotCi0gIC8vIElmIHRoZSBjdXJyZW50IGNoYXJhY3RlciBpcyBpbiB0aGUgZ2l2ZW4gY2xhc3MsIGNvbnN1bWUgaXQgYW5kIHJldHVybgotICAvLyB0cnVlLiAgT3RoZXJ3aXNlIHJldHVybiBmYWxzZS4KLSAgLy8gZS5nLiBUcnlDb25zdW1lT25lPExldHRlcj4oKQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KLSAgaW5saW5lIGJvb2wgVHJ5Q29uc3VtZU9uZSgpOwotCi0gIC8vIExpa2UgYWJvdmUsIGJ1dCB0cnkgdG8gY29uc3VtZSB0aGUgc3BlY2lmaWMgY2hhcmFjdGVyIGluZGljYXRlZC4KLSAgaW5saW5lIGJvb2wgVHJ5Q29uc3VtZShjaGFyIGMpOwotCi0gIC8vIENvbnN1bWUgemVybyBvciBtb3JlIG9mIHRoZSBnaXZlbiBjaGFyYWN0ZXIgY2xhc3MuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIENoYXJhY3RlckNsYXNzPgotICBpbmxpbmUgdm9pZCBDb25zdW1lWmVyb09yTW9yZSgpOwotCi0gIC8vIENvbnN1bWUgb25lIG9yIG1vcmUgb2YgdGhlIGdpdmVuIGNoYXJhY3RlciBjbGFzcyBvciBsb2cgdGhlIGdpdmVuCi0gIC8vIGVycm9yIG1lc3NhZ2UuCi0gIC8vIGUuZy4gQ29uc3VtZU9uZU9yTW9yZTxEaWdpdD4oIkV4cGVjdGVkIGRpZ2l0cy4iKTsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgQ2hhcmFjdGVyQ2xhc3M+Ci0gIGlubGluZSB2b2lkIENvbnN1bWVPbmVPck1vcmUoY29uc3QgY2hhciogZXJyb3IpOwotfTsKLQotLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotaW5saW5lIGNvbnN0IFRva2VuaXplcjo6VG9rZW4mIFRva2VuaXplcjo6Y3VycmVudCgpIHsKLSAgcmV0dXJuIGN1cnJlbnRfOwotfQotCi1pbmxpbmUgY29uc3QgVG9rZW5pemVyOjpUb2tlbiYgVG9rZW5pemVyOjpwcmV2aW91cygpIHsKLSAgcmV0dXJuIHByZXZpb3VzXzsKLX0KLQotaW5saW5lIHZvaWQgVG9rZW5pemVyOjpQYXJzZVN0cmluZyhjb25zdCBzdHJpbmcmIHRleHQsIHN0cmluZyogb3V0cHV0KSB7Ci0gIG91dHB1dC0+Y2xlYXIoKTsKLSAgUGFyc2VTdHJpbmdBcHBlbmQodGV4dCwgb3V0cHV0KTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGlvCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fVE9LRU5JWkVSX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWUwODExZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDk5NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotbmFtZXNwYWNlIHsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gRGF0YS1Ecml2ZW4gVGVzdCBJbmZyYXN0cnVjdHVyZQotCi0vLyBUT0RPKGtlbnRvbik6ICBUaGlzIGlzIGNvcGllZCBmcm9tIGNvZGVkX3N0cmVhbV91bml0dGVzdC4gIFRoaXMgaXMKLS8vICAgdGVtcG9yYXJ5IHVudGlsIHRoZXNlIGZldGF1cmVzIGFyZSBpbnRlZ3JhdGVkIGludG8gZ1Rlc3QgaXRzZWxmLgotCi0vLyBURVNUXzFEIGFuZCBURVNUXzJEIGFyZSBtYWNyb3MgSSdkIGV2ZW50dWFsbHkgbGlrZSB0byBzZWUgYWRkZWQgdG8KLS8vIGdUZXN0LiAgVGhlc2UgbWFjcm9zIGNhbiBiZSB1c2VkIHRvIGRlY2xhcmUgdGVzdHMgd2hpY2ggc2hvdWxkIGJlCi0vLyBydW4gbXVsdGlwbGUgdGltZXMsIG9uY2UgZm9yIGVhY2ggaXRlbSBpbiBzb21lIGlucHV0IGFycmF5LiAgVEVTVF8xRAotLy8gdGVzdHMgYWxsIGNhc2VzIGluIGEgc2luZ2xlIGlucHV0IGFycmF5LiAgVEVTVF8yRCB0ZXN0cyBhbGwKLS8vIGNvbWJpbmF0aW9ucyBvZiBjYXNlcyBmcm9tIHR3byBhcnJheXMuICBUaGUgYXJyYXlzIG11c3QgYmUgc3RhdGljYWxseQotLy8gZGVmaW5lZCBzdWNoIHRoYXQgdGhlIEdPT0dMRV9BUlJBWVNJWkUoKSBtYWNybyB3b3JrcyBvbiB0aGVtLiAgRXhhbXBsZToKLS8vCi0vLyBpbnQga0Nhc2VzW10gPSB7MSwgMiwgMywgNH0KLS8vIFRFU1RfMUQoTXlGaXh0dXJlLCBNeVRlc3QsIGtDYXNlcykgewotLy8gICBFWFBFQ1RfR1Qoa0Nhc2VzX2Nhc2UsIDApOwotLy8gfQotLy8KLS8vIFRoaXMgdGVzdCBpdGVyYXRlcyB0aHJvdWdoIHRoZSBudW1iZXJzIDEsIDIsIDMsIGFuZCA0IGFuZCB0ZXN0cyB0aGF0Ci0vLyB0aGV5IGFyZSBhbGwgZ3JhdGVyIHRoYW4gemVyby4gIEluIGNhc2Ugb2YgZmFpbHVyZSwgdGhlIGV4YWN0IGNhc2UKLS8vIHdoaWNoIGZhaWxlZCB3aWxsIGJlIHByaW50ZWQuICBUaGUgY2FzZSB0eXBlIG11c3QgYmUgcHJpbnRhYmxlIHVzaW5nCi0vLyBvc3RyZWFtOjpvcGVyYXRvcjw8LgotCi0jZGVmaW5lIFRFU1RfMUQoRklYVFVSRSwgTkFNRSwgQ0FTRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGNsYXNzIEZJWFRVUkUjI18jI05BTUUjI19ERCA6IHB1YmxpYyBGSVhUVVJFIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICBwcm90ZWN0ZWQ6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGUgPHR5cGVuYW1lIENhc2VUeXBlPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdm9pZCBEb1NpbmdsZUNhc2UoY29uc3QgQ2FzZVR5cGUmIENBU0VTIyNfY2FzZSk7ICAgICAgICAgICAgICAgICAgICAgICBcCi0gIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIFRFU1RfRihGSVhUVVJFIyNfIyNOQU1FIyNfREQsIE5BTUUpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKENBU0VTKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgU0NPUEVEX1RSQUNFKHRlc3Rpbmc6Ok1lc3NhZ2UoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICA8PCAjQ0FTRVMgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFU1tpXSk7ICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgRG9TaW5nbGVDYXNlKENBU0VTW2ldKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGU+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIEZJWFRVUkUjI18jI05BTUUjI19ERDo6RG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlJiBDQVNFUyMjX2Nhc2UpCi0KLSNkZWZpbmUgVEVTVF8yRChGSVhUVVJFLCBOQU1FLCBDQVNFUzEsIENBU0VTMikgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgY2xhc3MgRklYVFVSRSMjXyMjTkFNRSMjX0REIDogcHVibGljIEZJWFRVUkUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgIHByb3RlY3RlZDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGUxLCB0eXBlbmFtZSBDYXNlVHlwZTI+ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB2b2lkIERvU2luZ2xlQ2FzZShjb25zdCBDYXNlVHlwZTEmIENBU0VTMSMjX2Nhc2UsICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDYXNlVHlwZTImIENBU0VTMiMjX2Nhc2UpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgVEVTVF9GKEZJWFRVUkUjI18jI05BTUUjI19ERCwgTkFNRSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMxKTsgaSsrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBmb3IgKGludCBqID0gMDsgaiA8IEdPT0dMRV9BUlJBWVNJWkUoQ0FTRVMyKTsgaisrKSB7ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBTQ09QRURfVFJBQ0UodGVzdGluZzo6TWVzc2FnZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIDw8ICNDQVNFUzEgIiBjYXNlICMiIDw8IGkgPDwgIjogIiA8PCBDQVNFUzFbaV0gPDwgIiwgIiAgICAgICAgICAgXAotICAgICAgICAgIDw8ICNDQVNFUzIgIiBjYXNlICMiIDw8IGogPDwgIjogIiA8PCBDQVNFUzJbal0pOyAgICAgICAgICAgICAgICAgXAotICAgICAgICBEb1NpbmdsZUNhc2UoQ0FTRVMxW2ldLCBDQVNFUzJbal0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ2FzZVR5cGUxLCB0eXBlbmFtZSBDYXNlVHlwZTI+ICAgICAgICAgICAgICAgICAgICAgICAgXAotICB2b2lkIEZJWFRVUkUjI18jI05BTUUjI19ERDo6RG9TaW5nbGVDYXNlKGNvbnN0IENhc2VUeXBlMSYgQ0FTRVMxIyNfY2FzZSwgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENhc2VUeXBlMiYgQ0FTRVMyIyNfY2FzZSkKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBBbiBpbnB1dCBzdHJlYW0gdGhhdCBpcyBiYXNpY2FsbHkgbGlrZSBhbiBBcnJheUlucHV0U3RyZWFtIGJ1dCBzb21ldGltZXMKLS8vIHJldHVybnMgZW1wdHkgYnVmZmVycywganVzdCB0byB0aHJvdyB1cyBvZmYuCi1jbGFzcyBUZXN0SW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICBUZXN0SW5wdXRTdHJlYW0oY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplKQotICAgIDogYXJyYXlfc3RyZWFtXyhkYXRhLCBzaXplLCBibG9ja19zaXplKSwgY291bnRlcl8oMCkge30KLSAgflRlc3RJbnB1dFN0cmVhbSgpIHt9Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgICAvLyBXZSdsbCByZXR1cm4gZW1wdHkgYnVmZmVycyBzdGFydGluZyB3aXRoIHRoZSBmaXJzdCBidWZmZXIsIGFuZCBldmVyeQotICAgIC8vIDMgYW5kIDUgYnVmZmVycyBhZnRlciB0aGF0LgotICAgIGlmIChjb3VudGVyXyAlIDMgPT0gMCB8fCBjb3VudGVyXyAlIDUgPT0gMCkgewotICAgICAgKmRhdGEgPSBOVUxMOwotICAgICAgKnNpemUgPSAwOwotICAgICAgKytjb3VudGVyXzsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICArK2NvdW50ZXJfOwotICAgICAgcmV0dXJuIGFycmF5X3N0cmVhbV8uTmV4dChkYXRhLCBzaXplKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIEJhY2tVcChpbnQgY291bnQpICB7IHJldHVybiBhcnJheV9zdHJlYW1fLkJhY2tVcChjb3VudCk7IH0KLSAgYm9vbCBTa2lwKGludCBjb3VudCkgICAgeyByZXR1cm4gYXJyYXlfc3RyZWFtXy5Ta2lwKGNvdW50KTsgICB9Ci0gIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0IHsgcmV0dXJuIGFycmF5X3N0cmVhbV8uQnl0ZUNvdW50KCk7ICAgfQotCi0gcHJpdmF0ZToKLSAgQXJyYXlJbnB1dFN0cmVhbSBhcnJheV9zdHJlYW1fOwotICBpbnQgY291bnRlcl87Ci19OwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEFuIGVycm9yIGNvbGxlY3RvciB3aGljaCBzaW1wbHkgY29uY2F0ZW5hdGVzIGFsbCBpdHMgZXJyb3JzIGludG8gYSBiaWcKLS8vIGJsb2NrIG9mIHRleHQgd2hpY2ggY2FuIGJlIGNoZWNrZWQuCi1jbGFzcyBUZXN0RXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRXJyb3JDb2xsZWN0b3IgewotIHB1YmxpYzoKLSAgVGVzdEVycm9yQ29sbGVjdG9yKCkge30KLSAgflRlc3RFcnJvckNvbGxlY3RvcigpIHt9Ci0KLSAgc3RyaW5nIHRleHRfOwotCi0gIC8vIGltcGxlbWVudHMgRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnRleHRfLCAiJDA6JDE6ICQyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLSAgfQotfTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBXZSB0ZXN0IGVhY2ggb3BlcmF0aW9uIG92ZXIgYSB2YXJpZXR5IG9mIGJsb2NrIHNpemVzIHRvIGluc3VyZSB0aGF0Ci0vLyB3ZSB0ZXN0IGNhc2VzIHdoZXJlIHJlYWRzIGNyb3NzIGJ1ZmZlciBib3VuZGFyaWVzIGFzIHdlbGwgYXMgY2FzZXMKLS8vIHdoZXJlIHRoZXkgZG9uJ3QuICBUaGlzIGlzIHNvcnQgb2YgYSBicnV0ZS1mb3JjZSBhcHByb2FjaCB0byB0aGlzLAotLy8gYnV0IGl0J3MgZWFzeSB0byB3cml0ZSBhbmQgZWFzeSB0byB1bmRlcnN0YW5kLgotY29uc3QgaW50IGtCbG9ja1NpemVzW10gPSB7MSwgMiwgMywgNSwgNywgMTMsIDMyLCAxMDI0fTsKLQotY2xhc3MgVG9rZW5pemVyVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIC8vIEZvciBlYXN5IHRlc3RpbmcuCi0gIHVpbnQ2NCBQYXJzZUludGVnZXIoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7Ci0gICAgdWludDY0IHJlc3VsdDsKLSAgICBFWFBFQ1RfVFJVRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0ZXh0LCBrdWludDY0bWF4LCAmcmVzdWx0KSk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBUaGVzZSB0ZXN0cyBjYXVzZXMgZ2NjIDMuMy41IChhbmQgZWFybGllcj8pIHRvIGdpdmUgdGhlIGNyeXB0aWMgZXJyb3I6Ci0vLyAgICJzb3JyeSwgdW5pbXBsZW1lbnRlZDogYG1ldGhvZF9jYWxsX2V4cHInIG5vdCBzdXBwb3J0ZWQgYnkgZHVtcF9leHByIgotI2lmICFkZWZpbmVkKF9fR05VQ19fKSB8fCBfX0dOVUNfXyA+IDMgfHwgKF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPiAzKQotCi0vLyBJbiBlYWNoIHRlc3QgY2FzZSwgdGhlIGVudGlyZSBpbnB1dCB0ZXh0IHNob3VsZCBwYXJzZSBhcyBhIHNpbmdsZSB0b2tlbgotLy8gb2YgdGhlIGdpdmVuIHR5cGUuCi1zdHJ1Y3QgU2ltcGxlVG9rZW5DYXNlIHsKLSAgc3RyaW5nIGlucHV0OwotICBUb2tlbml6ZXI6OlRva2VuVHlwZSB0eXBlOwotfTsKLQotaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2ltcGxlVG9rZW5DYXNlJiB0ZXN0X2Nhc2UpIHsKLSAgcmV0dXJuIG91dCA8PCBDRXNjYXBlKHRlc3RfY2FzZS5pbnB1dCk7Ci19Ci0KLVNpbXBsZVRva2VuQ2FzZSBrU2ltcGxlVG9rZW5DYXNlc1tdID0gewotICAvLyBUZXN0IGlkZW50aWZpZXJzLgotICB7ICJoZWxsbyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSIH0sCi0KLSAgLy8gVGVzdCBpbnRlZ2Vycy4KLSAgeyAiMTIzIiwgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAotICB7ICIweGFiNiIsICAgICAgIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSIH0sCi0gIHsgIjBYQUI2IiwgICAgICAgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVIgfSwKLSAgeyAiMFgxMjM0NTY3IiwgICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAotICB7ICIweDg5YWJjZGVmIiwgIFRva2VuaXplcjo6VFlQRV9JTlRFR0VSIH0sCi0gIHsgIjB4ODlBQkNERUYiLCAgVG9rZW5pemVyOjpUWVBFX0lOVEVHRVIgfSwKLSAgeyAiMDEyMzQ1NjciLCAgICBUb2tlbml6ZXI6OlRZUEVfSU5URUdFUiB9LAotCi0gIC8vIFRlc3QgZmxvYXRzLgotICB7ICIxMjMuNDUiLCAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIxLiIsICAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIxZTMiLCAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIxRTMiLCAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIxZS0zIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIxZSszIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIxLmUzIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIxLjJlMyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIuMSIsICAgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIuMWUzIiwgICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIuMWUtMyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotICB7ICIuMWUrMyIsICAgICAgIFRva2VuaXplcjo6VFlQRV9GTE9BVCB9LAotCi0gIC8vIFRlc3Qgc3RyaW5ncy4KLSAgeyAiJ2hlbGxvJyIsICAgICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCi0gIHsgIlwiZm9vXCIiLCAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAotICB7ICInYVwiYiciLCAgICAgIFRva2VuaXplcjo6VFlQRV9TVFJJTkcgfSwKLSAgeyAiXCJhJ2JcIiIsICAgICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCi0gIHsgIidhXFwnYiciLCAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAotICB7ICJcImFcXFwiYlwiIiwgIFRva2VuaXplcjo6VFlQRV9TVFJJTkcgfSwKLSAgeyAiJ1xceGYnIiwgICAgICBUb2tlbml6ZXI6OlRZUEVfU1RSSU5HIH0sCi0gIHsgIidcXDAnIiwgICAgICAgVG9rZW5pemVyOjpUWVBFX1NUUklORyB9LAotCi0gIC8vIFRlc3Qgc3ltYm9scy4KLSAgeyAiKyIsICAgICAgICAgICBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MIH0sCi0gIHsgIi4iLCAgICAgICAgICAgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCB9LAotfTsKLQotVEVTVF8yRChUb2tlbml6ZXJUZXN0LCBTaW1wbGVUb2tlbnMsIGtTaW1wbGVUb2tlbkNhc2VzLCBrQmxvY2tTaXplcykgewotICAvLyBTZXQgdXAgdGhlIHRva2VuaXplci4KLSAgVGVzdElucHV0U3RyZWFtIGlucHV0KGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAga1NpbXBsZVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKLSAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKLSAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOwotCi0gIC8vIEJlZm9yZSBOZXh0KCkgaXMgY2FsbGVkLCB0aGUgaW5pdGlhbCB0b2tlbiBzaG91bGQgYWx3YXlzIGJlIFRZUEVfU1RBUlQuCi0gIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfU1RBUlQsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7Ci0gIEVYUEVDVF9FUSgiIiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKLSAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7Ci0gIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7Ci0gIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOwotCi0gIC8vIFBhcnNlIHRoZSB0b2tlbi4KLSAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCBpdCBoYXMgdGhlIHJpZ2h0IHR5cGUuCi0gIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLnR5cGUsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7Ci0gIC8vIENoZWNrIHRoYXQgaXQgY29udGFpbnMgdGhlIGNvbXBsZXRlIGlucHV0IHRleHQuCi0gIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOwotICAvLyBDaGVjayB0aGF0IGl0IGlzIGxvY2F0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiB0aGUgaW5wdXQKLSAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7Ci0gIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7Ci0gIEVYUEVDVF9FUShrU2ltcGxlVG9rZW5DYXNlc19jYXNlLmlucHV0LnNpemUoKSwKLSAgICAgICAgICAgIHRva2VuaXplci5jdXJyZW50KCkuZW5kX2NvbHVtbik7Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIG1vcmUgaW5wdXQuCi0gIEVYUEVDVF9GQUxTRSh0b2tlbml6ZXIuTmV4dCgpKTsKLQotICAvLyBBZnRlciBOZXh0KCkgcmV0dXJucyBmYWxzZSwgdGhlIHRva2VuIHNob3VsZCBoYXZlIHR5cGUgVFlQRV9FTkQuCi0gIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfRU5ELCB0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUpOwotICBFWFBFQ1RfRVEoIiIsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7Ci0gIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmxpbmUpOwotICBFWFBFQ1RfRVEoa1NpbXBsZVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksIHRva2VuaXplci5jdXJyZW50KCkuY29sdW1uKTsKLSAgRVhQRUNUX0VRKGtTaW1wbGVUb2tlbkNhc2VzX2Nhc2UuaW5wdXQuc2l6ZSgpLAotICAgICAgICAgICAgdG9rZW5pemVyLmN1cnJlbnQoKS5lbmRfY29sdW1uKTsKLQotICAvLyBUaGVyZSBzaG91bGQgYmUgbm8gZXJyb3JzLgotICBFWFBFQ1RfVFJVRShlcnJvcl9jb2xsZWN0b3IudGV4dF8uZW1wdHkoKSk7Ci19Ci0KLVRFU1RfMUQoVG9rZW5pemVyVGVzdCwgRmxvYXRTdWZmaXgsIGtCbG9ja1NpemVzKSB7Ci0gIC8vIFRlc3QgdGhlICJhbGxvd19mX2FmdGVyX2Zsb2F0IiBvcHRpb24uCi0KLSAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCi0gIGNvbnN0IGNoYXIqIHRleHQgPSAiMWYgMi41ZiA2ZTNmIDdGIjsKLSAgVGVzdElucHV0U3RyZWFtIGlucHV0KHRleHQsIHN0cmxlbih0ZXh0KSwga0Jsb2NrU2l6ZXNfY2FzZSk7Ci0gIFRlc3RFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7Ci0gIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKLSAgdG9rZW5pemVyLnNldF9hbGxvd19mX2FmdGVyX2Zsb2F0KHRydWUpOwotCi0gIC8vIEFkdmFuY2UgdGhyb3VnaCB0b2tlbnMgYW5kIGNoZWNrIHRoYXQgdGhleSBhcmUgcGFyc2VkIGFzIGV4cGVjdGVkLgotICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKLSAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwgIjFmIik7Ci0gIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnR5cGUsIFRva2VuaXplcjo6VFlQRV9GTE9BVCk7Ci0gIEFTU0VSVF9UUlVFKHRva2VuaXplci5OZXh0KCkpOwotICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0LCAiMi41ZiIpOwotICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50eXBlLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVQpOwotICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKLSAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudGV4dCwgIjZlM2YiKTsKLSAgRVhQRUNUX0VRKHRva2VuaXplci5jdXJyZW50KCkudHlwZSwgVG9rZW5pemVyOjpUWVBFX0ZMT0FUKTsKLSAgQVNTRVJUX1RSVUUodG9rZW5pemVyLk5leHQoKSk7Ci0gIEVYUEVDVF9FUSh0b2tlbml6ZXIuY3VycmVudCgpLnRleHQsICI3RiIpOwotICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50eXBlLCBUb2tlbml6ZXI6OlRZUEVfRkxPQVQpOwotCi0gIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGlucHV0LgotICBFWFBFQ1RfRkFMU0UodG9rZW5pemVyLk5leHQoKSk7Ci0gIC8vIFRoZXJlIHNob3VsZCBiZSBubyBlcnJvcnMuCi0gIEVYUEVDVF9UUlVFKGVycm9yX2NvbGxlY3Rvci50ZXh0Xy5lbXB0eSgpKTsKLX0KLQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gSW4gZWFjaCBjYXNlLCB0aGUgaW5wdXQgaXMgcGFyc2VkIHRvIHByb2R1Y2UgYSBsaXN0IG9mIHRva2Vucy4gIFRoZQotLy8gbGFzdCB0b2tlbiBpbiAib3V0cHV0IiBtdXN0IGhhdmUgdHlwZSBUWVBFX0VORC4KLXN0cnVjdCBNdWx0aVRva2VuQ2FzZSB7Ci0gIHN0cmluZyBpbnB1dDsKLSAgVG9rZW5pemVyOjpUb2tlbiBvdXRwdXRbMTBdOyAgLy8gVGhlIGNvbXBpbGVyIHdhbnRzIGEgY29uc3RhbnQgYXJyYXkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2l6ZSBmb3IgaW5pdGlhbGl6YXRpb24gdG8gd29yay4gIFRoZXJlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlzIG5vIHJlYXNvbiB0aGlzIGNhbid0IGJlIGluY3JlYXNlZCBpZgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkZWQuCi19OwotCi1pbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNdWx0aVRva2VuQ2FzZSYgdGVzdF9jYXNlKSB7Ci0gIHJldHVybiBvdXQgPDwgQ0VzY2FwZSh0ZXN0X2Nhc2UuaW5wdXQpOwotfQotCi1NdWx0aVRva2VuQ2FzZSBrTXVsdGlUb2tlbkNhc2VzW10gPSB7Ci0gIC8vIFRlc3QgZW1wdHkgaW5wdXQuCi0gIHsgIiIsIHsKLSAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICAgLCAwLCAgMCB9LAotICB9fSwKLQotICAvLyBUZXN0IGFsbCB0b2tlbiB0eXBlcyBhdCB0aGUgc2FtZSB0aW1lLgotICB7ICJmb28gMSAxLjIgKyAnYmFyJyIsIHsKLSAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiZm9vIiAgLCAwLCAgMCwgIDMgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9JTlRFR0VSICAgLCAiMSIgICAgLCAwLCAgNCwgIDUgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9GTE9BVCAgICAgLCAiMS4yIiAgLCAwLCAgNiwgIDkgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9TWU1CT0wgICAgLCAiKyIgICAgLCAwLCAxMCwgMTEgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9TVFJJTkcgICAgLCAiJ2JhciciLCAwLCAxMiwgMTcgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICAgLCAwLCAxNywgMTcgfSwKLSAgfX0sCi0KLSAgLy8gVGVzdCB0aGF0IGNvbnNlY3V0aXZlIHN5bWJvbHMgYXJlIHBhcnNlZCBhcyBzZXBhcmF0ZSB0b2tlbnMuCi0gIHsgIiFAKyUiLCB7Ci0gICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIiEiICAgICwgMCwgMCwgMSB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCAgICAsICJAIiAgICAsIDAsIDEsIDIgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9TWU1CT0wgICAgLCAiKyIgICAgLCAwLCAyLCAzIH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIiUiICAgICwgMCwgMywgNCB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgICAsIDAsIDQsIDQgfSwKLSAgfX0sCi0KLSAgLy8gVGVzdCB0aGF0IG5ld2xpbmVzIGFmZmVjdCBsaW5lIG51bWJlcnMgY29ycmVjdGx5LgotICB7ICJmb28gYmFyXG5yYWIgb29mIiwgewotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAgMCwgMyB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAwLCAgNCwgNyB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJyYWIiLCAxLCAgMCwgMyB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJvb2YiLCAxLCAgNCwgNyB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgLCAxLCAgNywgNyB9LAotICB9fSwKLQotICAvLyBUZXN0IHRoYXQgdGFicyBhZmZlY3QgY29sdW1uIG51bWJlcnMgY29ycmVjdGx5LgotICB7ICJmb29cdGJhciAgXHRiYXoiLCB7Ci0gICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsICAwLCAgMyB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAwLCAgOCwgMTEgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmF6IiwgMCwgMTYsIDE5IH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAsIDAsIDE5LCAxOSB9LAotICB9fSwKLQotICAvLyBUZXN0IHRoYXQgdGFicyBpbiBzdHJpbmcgbGl0ZXJhbHMgYWZmZWN0IGNvbHVtbiBudW1iZXJzIGNvcnJlY3RseS4KLSAgeyAiXCJmb29cdGJhclwiIGJheiIsIHsKLSAgICB7IFRva2VuaXplcjo6VFlQRV9TVFJJTkcgICAgLCAiXCJmb29cdGJhclwiIiwgMCwgIDAsIDEyIH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJheiIgICAgICAgICAsIDAsIDEzLCAxNiB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgICAgICAgICAgLCAwLCAxNiwgMTYgfSwKLSAgfX0sCi0KLSAgLy8gVGVzdCB0aGF0IGxpbmUgY29tbWVudHMgYXJlIGlnbm9yZWQuCi0gIHsgImZvbyAvLyBUaGlzIGlzIGEgY29tbWVudFxuIgotICAgICJiYXIgLy8gVGhpcyBpcyBhbm90aGVyIGNvbW1lbnQiLCB7Ci0gICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImZvbyIsIDAsICAwLCAgMyB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXIiLCAxLCAgMCwgIDMgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9FTkQgICAgICAgLCAiIiAgICwgMSwgMzAsIDMwIH0sCi0gIH19LAotCi0gIC8vIFRlc3QgdGhhdCBibG9jayBjb21tZW50cyBhcmUgaWdub3JlZC4KLSAgeyAiZm9vIC8qIFRoaXMgaXMgYSBibG9jayBjb21tZW50ICovIGJhciIsIHsKLSAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiZm9vIiwgMCwgIDAsICAzIH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUiwgImJhciIsIDAsIDM0LCAzNyB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgLCAwLCAzNywgMzcgfSwKLSAgfX0sCi0KLSAgLy8gVGVzdCB0aGF0IHNoLXN0eWxlIGNvbW1lbnRzIGFyZSBub3QgaWdub3JlZCBieSBkZWZhdWx0LgotICB7ICJmb28gIyBiYXJcbiIKLSAgICAiYmF6IiwgewotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAwLCAzIH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfU1lNQk9MICAgICwgIiMiICAsIDAsIDQsIDUgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMCwgNiwgOSB9LAotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJiYXoiLCAxLCAwLCAzIH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAsIDEsIDMsIDMgfSwKLSAgfX0sCi0KLSAgLy8gVGVzdCBhbGwgd2hpdGVzcGFjZSBjaGFycwotICB7ICJmb29cblx0XHJcdlxmYmFyIiwgewotICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAgMCwgIDMgfSwKLSAgICB7IFRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSLCAiYmFyIiwgMSwgMTEsIDE0IH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgICAgICwgIiIgICAsIDEsIDE0LCAxNCB9LAotICB9fSwKLX07Ci0KLVRFU1RfMkQoVG9rZW5pemVyVGVzdCwgTXVsdGlwbGVUb2tlbnMsIGtNdWx0aVRva2VuQ2FzZXMsIGtCbG9ja1NpemVzKSB7Ci0gIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgotICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQoa011bHRpVG9rZW5DYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtNdWx0aVRva2VuQ2FzZXNfY2FzZS5pbnB1dC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKLSAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKLSAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOwotCi0gIC8vIEJlZm9yZSBOZXh0KCkgaXMgY2FsbGVkLCB0aGUgaW5pdGlhbCB0b2tlbiBzaG91bGQgYWx3YXlzIGJlIFRZUEVfU1RBUlQuCi0gIEVYUEVDVF9FUShUb2tlbml6ZXI6OlRZUEVfU1RBUlQsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7Ci0gIEVYUEVDVF9FUSgiIiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKLSAgRVhQRUNUX0VRKDAsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7Ci0gIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmNvbHVtbik7Ci0gIEVYUEVDVF9FUSgwLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOwotCi0gIC8vIExvb3AgdGhyb3VnaCBhbGwgZXhwZWN0ZWQgdG9rZW5zLgotICBpbnQgaSA9IDA7Ci0gIFRva2VuaXplcjo6VG9rZW4gdG9rZW47Ci0gIGRvIHsKLSAgICB0b2tlbiA9IGtNdWx0aVRva2VuQ2FzZXNfY2FzZS5vdXRwdXRbaSsrXTsKLQotICAgIFNDT1BFRF9UUkFDRSh0ZXN0aW5nOjpNZXNzYWdlKCkgPDwgIlRva2VuICMiIDw8IGkgPDwgIjogIiA8PCB0b2tlbi50ZXh0KTsKLQotICAgIFRva2VuaXplcjo6VG9rZW4gcHJldmlvdXMgPSB0b2tlbml6ZXIuY3VycmVudCgpOwotCi0gICAgLy8gTmV4dCgpIHNob3VsZCBvbmx5IHJldHVybiBmYWxzZSB3aGVuIGl0IGhpdHMgdGhlIGVuZCB0b2tlbi4KLSAgICBpZiAodG9rZW4udHlwZSAhPSBUb2tlbml6ZXI6OlRZUEVfRU5EKSB7Ci0gICAgICBBU1NFUlRfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKLSAgICB9IGVsc2UgewotICAgICAgQVNTRVJUX0ZBTFNFKHRva2VuaXplci5OZXh0KCkpOwotICAgIH0KLQotICAgIC8vIENoZWNrIHRoYXQgdGhlIHByZXZpb3VzIHRva2VuIGlzIHNldCBjb3JyZWN0bHkuCi0gICAgRVhQRUNUX0VRKHByZXZpb3VzLnR5cGUsIHRva2VuaXplci5wcmV2aW91cygpLnR5cGUpOwotICAgIEVYUEVDVF9FUShwcmV2aW91cy50ZXh0LCB0b2tlbml6ZXIucHJldmlvdXMoKS50ZXh0KTsKLSAgICBFWFBFQ1RfRVEocHJldmlvdXMubGluZSwgdG9rZW5pemVyLnByZXZpb3VzKCkubGluZSk7Ci0gICAgRVhQRUNUX0VRKHByZXZpb3VzLmNvbHVtbiwgdG9rZW5pemVyLnByZXZpb3VzKCkuY29sdW1uKTsKLSAgICBFWFBFQ1RfRVEocHJldmlvdXMuZW5kX2NvbHVtbiwgdG9rZW5pemVyLnByZXZpb3VzKCkuZW5kX2NvbHVtbik7Ci0KLSAgICAvLyBDaGVjayB0aGF0IHRoZSB0b2tlbiBtYXRjaGVzIHRoZSBleHBlY3RlZCBvbmUuCi0gICAgRVhQRUNUX0VRKHRva2VuLnR5cGUsIHRva2VuaXplci5jdXJyZW50KCkudHlwZSk7Ci0gICAgRVhQRUNUX0VRKHRva2VuLnRleHQsIHRva2VuaXplci5jdXJyZW50KCkudGV4dCk7Ci0gICAgRVhQRUNUX0VRKHRva2VuLmxpbmUsIHRva2VuaXplci5jdXJyZW50KCkubGluZSk7Ci0gICAgRVhQRUNUX0VRKHRva2VuLmNvbHVtbiwgdG9rZW5pemVyLmN1cnJlbnQoKS5jb2x1bW4pOwotICAgIEVYUEVDVF9FUSh0b2tlbi5lbmRfY29sdW1uLCB0b2tlbml6ZXIuY3VycmVudCgpLmVuZF9jb2x1bW4pOwotCi0gIH0gd2hpbGUgKHRva2VuLnR5cGUgIT0gVG9rZW5pemVyOjpUWVBFX0VORCk7Ci0KLSAgLy8gVGhlcmUgc2hvdWxkIGJlIG5vIGVycm9ycy4KLSAgRVhQRUNUX1RSVUUoZXJyb3JfY29sbGVjdG9yLnRleHRfLmVtcHR5KCkpOwotfQotCi0vLyBUaGlzIHRlc3QgY2F1c2VzIGdjYyAzLjMuNSAoYW5kIGVhcmxpZXI/KSB0byBnaXZlIHRoZSBjcnlwdGljIGVycm9yOgotLy8gICAic29ycnksIHVuaW1wbGVtZW50ZWQ6IGBtZXRob2RfY2FsbF9leHByJyBub3Qgc3VwcG9ydGVkIGJ5IGR1bXBfZXhwciIKLSNpZiAhZGVmaW5lZChfX0dOVUNfXykgfHwgX19HTlVDX18gPiAzIHx8IChfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID4gMykKLQotVEVTVF8xRChUb2tlbml6ZXJUZXN0LCBTaENvbW1lbnRTdHlsZSwga0Jsb2NrU2l6ZXMpIHsKLSAgLy8gVGVzdCB0aGUgImNvbW1lbnRfc3R5bGUiIG9wdGlvbi4KLQotICBjb25zdCBjaGFyKiB0ZXh0ID0gImZvbyAjIGJhclxuIgotICAgICAgICAgICAgICAgICAgICAgImJheiAvLyBxdXhcbiIKLSAgICAgICAgICAgICAgICAgICAgICJjb3JnZSAvKiBncmF1bHQgKi9cbiIKLSAgICAgICAgICAgICAgICAgICAgICJnYXJwbHkiOwotICBjb25zdCBjaGFyKiBjb25zdCBrVG9rZW5zW10gPSB7ImZvbyIsICAvLyAiIyBiYXIiIGlzIGlnbm9yZWQKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJiYXoiLCAiLyIsICIvIiwgInF1eCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiY29yZ2UiLCAiLyIsICIqIiwgImdyYXVsdCIsICIqIiwgIi8iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImdhcnBseSJ9OwotCi0gIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgotICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQodGV4dCwgc3RybGVuKHRleHQpLCBrQmxvY2tTaXplc19jYXNlKTsKLSAgVGVzdEVycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKLSAgVG9rZW5pemVyIHRva2VuaXplcigmaW5wdXQsICZlcnJvcl9jb2xsZWN0b3IpOwotICB0b2tlbml6ZXIuc2V0X2NvbW1lbnRfc3R5bGUoVG9rZW5pemVyOjpTSF9DT01NRU5UX1NUWUxFKTsKLQotICAvLyBBZHZhbmNlIHRocm91Z2ggdG9rZW5zIGFuZCBjaGVjayB0aGF0IHRoZXkgYXJlIHBhcnNlZCBhcyBleHBlY3RlZC4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGtUb2tlbnMpOyBpKyspIHsKLSAgICBFWFBFQ1RfVFJVRSh0b2tlbml6ZXIuTmV4dCgpKTsKLSAgICBFWFBFQ1RfRVEodG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0LCBrVG9rZW5zW2ldKTsKLSAgfQotCi0gIC8vIFRoZXJlIHNob3VsZCBiZSBubyBtb3JlIGlucHV0LgotICBFWFBFQ1RfRkFMU0UodG9rZW5pemVyLk5leHQoKSk7Ci0gIC8vIFRoZXJlIHNob3VsZCBiZSBubyBlcnJvcnMuCi0gIEVYUEVDVF9UUlVFKGVycm9yX2NvbGxlY3Rvci50ZXh0Xy5lbXB0eSgpKTsKLX0KLQotI2VuZGlmCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gSW4gZWFjaCBjYXNlLCB0aGUgaW5wdXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSB0d28gdG9rZW5zIG5hbWVkICJwcmV2IiBhbmQKLS8vICJuZXh0IiB3aXRoIGNvbW1lbnRzIGluIGJldHdlZW4uCi1zdHJ1Y3QgRG9jQ29tbWVudENhc2UgewotICBzdHJpbmcgaW5wdXQ7Ci0KLSAgY29uc3QgY2hhciogcHJldl90cmFpbGluZ19jb21tZW50czsKLSAgY29uc3QgY2hhciogZGV0YWNoZWRfY29tbWVudHNbMTBdOwotICBjb25zdCBjaGFyKiBuZXh0X2xlYWRpbmdfY29tbWVudHM7Ci19OwotCi1pbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb2NDb21tZW50Q2FzZSYgdGVzdF9jYXNlKSB7Ci0gIHJldHVybiBvdXQgPDwgQ0VzY2FwZSh0ZXN0X2Nhc2UuaW5wdXQpOwotfQotCi1Eb2NDb21tZW50Q2FzZSBrRG9jQ29tbWVudENhc2VzW10gPSB7Ci0gIHsKLSAgICAicHJldiBuZXh0IiwKLQotICAgICIiLAotICAgIHt9LAotICAgICIiCi0gICAgICB9LAotCi0gICAgICAgIHsKLSAgICAgICJwcmV2IC8qIGlnbm9yZWQgKi8gbmV4dCIsCi0KLSAgICAgICIiLAotICAgICAge30sCi0gICAgICAiIgotICAgICAgICB9LAotCi0gICAgICAgICAgewotICAgICAgICAicHJldiAvLyB0cmFpbGluZyBjb21tZW50XG4iCi0gICAgICAgICAgICAibmV4dCIsCi0KLSAgICAgICAgICAgICIgdHJhaWxpbmcgY29tbWVudFxuIiwKLSAgICAgICAgICAgIHt9LAotICAgICAgICAgICAgIiIKLSAgICAgICAgICB9LAotCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgInByZXZcbiIKLSAgICAgICAgICAgICAgIi8vIGxlYWRpbmcgY29tbWVudFxuIgotICAgICAgICAgICAgICAiLy8gbGluZSAyXG4iCi0gICAgICAgICAgICAgICJuZXh0IiwKLQotICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAge30sCi0gICAgICAgICAgICAgICIgbGVhZGluZyBjb21tZW50XG4iCi0gICAgICAgICAgICAgICIgbGluZSAyXG4iCi0gICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICJwcmV2XG4iCi0gICAgICAgICAgICAgICAgIi8vIHRyYWlsaW5nIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAiLy8gbGluZSAyXG4iCi0gICAgICAgICAgICAgICAgIlxuIgotICAgICAgICAgICAgICAgICJuZXh0IiwKLQotICAgICAgICAgICAgICAgICIgdHJhaWxpbmcgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICIgbGluZSAyXG4iLAotICAgICAgICAgICAgICAgIHt9LAotICAgICAgICAgICAgICAgICIiCi0gICAgICAgICAgICAgIH0sCi0KLSAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICJwcmV2IC8vIHRyYWlsaW5nIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICIvLyBsZWFkaW5nIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICIvLyBsaW5lIDJcbiIKLSAgICAgICAgICAgICAgICAgICJuZXh0IiwKLQotICAgICAgICAgICAgICAgICAgIiB0cmFpbGluZyBjb21tZW50XG4iLAotICAgICAgICAgICAgICAgICAge30sCi0gICAgICAgICAgICAgICAgICAiIGxlYWRpbmcgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICAgIiBsaW5lIDJcbiIKLSAgICAgICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgInByZXYgLyogdHJhaWxpbmcgYmxvY2sgY29tbWVudCAqL1xuIgotICAgICAgICAgICAgICAgICAgICAiLyogbGVhZGluZyBibG9jayBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICIgKiBsaW5lIDJcbiIKLSAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMyAqLyIKLSAgICAgICAgICAgICAgICAgICAgIm5leHQiLAotCi0gICAgICAgICAgICAgICAgICAgICIgdHJhaWxpbmcgYmxvY2sgY29tbWVudCAiLAotICAgICAgICAgICAgICAgICAgICB7fSwKLSAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGJsb2NrIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDJcbiIKLSAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDMgIgotICAgICAgICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAicHJldlxuIgotICAgICAgICAgICAgICAgICAgICAgICIvKiB0cmFpbGluZyBibG9jayBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMlxuIgotICAgICAgICAgICAgICAgICAgICAgICIgKiBsaW5lIDNcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiICovXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIi8qIGxlYWRpbmcgYmxvY2sgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICAgICAgICIgKiBsaW5lIDJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiICogbGluZSAzICovIgotICAgICAgICAgICAgICAgICAgICAgICJuZXh0IiwKLQotICAgICAgICAgICAgICAgICAgICAgICIgdHJhaWxpbmcgYmxvY2sgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICAgICAgICIgbGluZSAyXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDNcbiIsCi0gICAgICAgICAgICAgICAgICAgICAge30sCi0gICAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGJsb2NrIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAiIGxpbmUgMlxuIgotICAgICAgICAgICAgICAgICAgICAgICIgbGluZSAzICIKLSAgICAgICAgICAgICAgICAgICAgfSwKLQotICAgICAgICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICAgInByZXZcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICIvLyB0cmFpbGluZyBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiLy8gZGV0YWNoZWQgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIi8vIGxpbmUgMlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIi8vIHNlY29uZCBkZXRhY2hlZCBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAiLyogdGhpcmQgZGV0YWNoZWQgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMiAqL1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgIi8vIGxlYWRpbmcgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgIm5leHQiLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAiIHRyYWlsaW5nIGNvbW1lbnRcbiIsCi0gICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgIiBkZXRhY2hlZCBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIgbGluZSAyXG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNlY29uZCBkZXRhY2hlZCBjb21tZW50XG4iLAotICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoaXJkIGRldGFjaGVkIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDIgIgotICAgICAgICAgICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIH0sCi0KLSAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgInByZXYgLyoqL1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gZGV0YWNoZWQgY29tbWVudFxuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gbGVhZGluZyBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5leHQiLAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRldGFjaGVkIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZXYgLyoqL1xuIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gbGVhZGluZyBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXh0IiwKLQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbGVhZGluZyBjb21tZW50XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKLQotVEVTVF8yRChUb2tlbml6ZXJUZXN0LCBEb2NDb21tZW50cywga0RvY0NvbW1lbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKLSAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCi0gIFRlc3RJbnB1dFN0cmVhbSBpbnB1dChrRG9jQ29tbWVudENhc2VzX2Nhc2UuaW5wdXQuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAga0RvY0NvbW1lbnRDYXNlc19jYXNlLmlucHV0LnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOwotICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOwotICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7Ci0KLSAgLy8gU2V0IHVwIGEgc2Vjb25kIHRva2VuaXplciB3aGVyZSB3ZSdsbCBwYXNzIGFsbCBOVUxMcyB0byBOZXh0V2l0aENvbW1lbnRzKCkuCi0gIFRlc3RJbnB1dFN0cmVhbSBpbnB1dDIoa0RvY0NvbW1lbnRDYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtEb2NDb21tZW50Q2FzZXNfY2FzZS5pbnB1dC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKLSAgVG9rZW5pemVyIHRva2VuaXplcjIoJmlucHV0MiwgJmVycm9yX2NvbGxlY3Rvcik7Ci0KLSAgdG9rZW5pemVyLk5leHQoKTsKLSAgdG9rZW5pemVyMi5OZXh0KCk7Ci0KLSAgRVhQRUNUX0VRKCJwcmV2IiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKLSAgRVhQRUNUX0VRKCJwcmV2IiwgdG9rZW5pemVyMi5jdXJyZW50KCkudGV4dCk7Ci0KLSAgc3RyaW5nIHByZXZfdHJhaWxpbmdfY29tbWVudHM7Ci0gIHZlY3RvcjxzdHJpbmc+IGRldGFjaGVkX2NvbW1lbnRzOwotICBzdHJpbmcgbmV4dF9sZWFkaW5nX2NvbW1lbnRzOwotICB0b2tlbml6ZXIuTmV4dFdpdGhDb21tZW50cygmcHJldl90cmFpbGluZ19jb21tZW50cywgJmRldGFjaGVkX2NvbW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKLSAgdG9rZW5pemVyMi5OZXh0V2l0aENvbW1lbnRzKE5VTEwsIE5VTEwsIE5VTEwpOwotICBFWFBFQ1RfRVEoIm5leHQiLCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOwotICBFWFBFQ1RfRVEoIm5leHQiLCB0b2tlbml6ZXIyLmN1cnJlbnQoKS50ZXh0KTsKLQotICBFWFBFQ1RfRVEoa0RvY0NvbW1lbnRDYXNlc19jYXNlLnByZXZfdHJhaWxpbmdfY29tbWVudHMsCi0gICAgICAgICAgICBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGRldGFjaGVkX2NvbW1lbnRzLnNpemUoKTsgaSsrKSB7Ci0gICAgQVNTRVJUX0xUKGksIEdPT0dMRV9BUlJBWVNJWkUoa0RvY0NvbW1lbnRDYXNlcykpOwotICAgIEFTU0VSVF9UUlVFKGtEb2NDb21tZW50Q2FzZXNfY2FzZS5kZXRhY2hlZF9jb21tZW50c1tpXSAhPSBOVUxMKTsKLSAgICBFWFBFQ1RfRVEoa0RvY0NvbW1lbnRDYXNlc19jYXNlLmRldGFjaGVkX2NvbW1lbnRzW2ldLAotICAgICAgICAgICAgICBkZXRhY2hlZF9jb21tZW50c1tpXSk7Ci0gIH0KLQotICAvLyBWZXJpZnkgdGhhdCB3ZSBtYXRjaGVkIGFsbCB0aGUgZGV0YWNoZWQgY29tbWVudHMuCi0gIEVYUEVDVF9FUShOVUxMLAotICAgICAga0RvY0NvbW1lbnRDYXNlc19jYXNlLmRldGFjaGVkX2NvbW1lbnRzW2RldGFjaGVkX2NvbW1lbnRzLnNpemUoKV0pOwotCi0gIEVYUEVDVF9FUShrRG9jQ29tbWVudENhc2VzX2Nhc2UubmV4dF9sZWFkaW5nX2NvbW1lbnRzLAotICAgICAgICAgICAgbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBUZXN0IHBhcnNlIGhlbHBlcnMuICBJdCdzIG5vdCByZWFsbHkgd29ydGggc2V0dGluZyB1cCBhIGZ1bGwgZGF0YS1kcml2ZW4KLS8vIHRlc3QgaGVyZS4KLVRFU1RfRihUb2tlbml6ZXJUZXN0LCBQYXJzZUludGVnZXIpIHsKLSAgRVhQRUNUX0VRKDAsIFBhcnNlSW50ZWdlcigiMCIpKTsKLSAgRVhQRUNUX0VRKDEyMywgUGFyc2VJbnRlZ2VyKCIxMjMiKSk7Ci0gIEVYUEVDVF9FUSgweGFiY2RlZjEydSwgUGFyc2VJbnRlZ2VyKCIweGFiY2RlZjEyIikpOwotICBFWFBFQ1RfRVEoMHhhYmNkZWYxMnUsIFBhcnNlSW50ZWdlcigiMHhBQkNERUYxMiIpKTsKLSAgRVhQRUNUX0VRKGt1aW50NjRtYXgsIFBhcnNlSW50ZWdlcigiMHhGRkZGRkZGRkZGRkZGRkZGIikpOwotICBFWFBFQ1RfRVEoMDEyMzQ1NjcsIFBhcnNlSW50ZWdlcigiMDEyMzQ1NjciKSk7Ci0gIEVYUEVDVF9FUSgwWDEyMywgUGFyc2VJbnRlZ2VyKCIwWDEyMyIpKTsKLQotICAvLyBUZXN0IGludmFsaWQgaW50ZWdlcnMgdGhhdCBtYXkgc3RpbGwgYmUgdG9rZW5pemVkIGFzIGludGVnZXJzLgotICBFWFBFQ1RfRVEoMCwgUGFyc2VJbnRlZ2VyKCIweCIpKTsKLQotICB1aW50NjQgaTsKLQotICAvLyBUZXN0IGludmFsaWQgaW50ZWdlcnMgdGhhdCB3aWxsIG5ldmVyIGJlIHRva2VuaXplZCBhcyBpbnRlZ2Vycy4KLSAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCJ6eHkiLCBrdWludDY0bWF4LCAmaSkpOwotICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjEuMiIsIGt1aW50NjRtYXgsICZpKSk7Ci0gIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMDgiLCBrdWludDY0bWF4LCAmaSkpOwotICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjB4ZyIsIGt1aW50NjRtYXgsICZpKSk7Ci0gIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiLTEiLCBrdWludDY0bWF4LCAmaSkpOwotCi0gIC8vIFRlc3Qgb3ZlcmZsb3dzLgotICBFWFBFQ1RfVFJVRSAoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjAiLCAwLCAmaSkpOwotICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjEiLCAwLCAmaSkpOwotICBFWFBFQ1RfVFJVRSAoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjEiLCAxLCAmaSkpOwotICBFWFBFQ1RfVFJVRSAoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjEyMzQ1IiwgMTIzNDUsICZpKSk7Ci0gIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMTIzNDYiLCAxMjM0NSwgJmkpKTsKLSAgRVhQRUNUX1RSVUUgKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIweEZGRkZGRkZGRkZGRkZGRkYiICwga3VpbnQ2NG1heCwgJmkpKTsKLSAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIweDEwMDAwMDAwMDAwMDAwMDAwIiwga3VpbnQ2NG1heCwgJmkpKTsKLX0KLQotVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlRmxvYXQpIHsKLSAgRVhQRUNUX0RPVUJMRV9FUSgxICAgICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxLiIpKTsKLSAgRVhQRUNUX0RPVUJMRV9FUSgxZTMgICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIxZTMiKSk7Ci0gIEVYUEVDVF9ET1VCTEVfRVEoMWUzICAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMUUzIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDEuNWUzLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjEuNWUzIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC4xICAgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4xIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC4yNSAgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4yNSIpKTsKLSAgRVhQRUNUX0RPVUJMRV9FUSguMWUzICwgVG9rZW5pemVyOjpQYXJzZUZsb2F0KCIuMWUzIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC4yNWUzLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4yNWUzIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC4xZSszLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4xZSszIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKC4xZS0zLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIi4xZS0zIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDUgICAgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjUiKSk7Ci0gIEVYUEVDVF9ET1VCTEVfRVEoNmUtMTIsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiNmUtMTIiKSk7Ci0gIEVYUEVDVF9ET1VCTEVfRVEoMS4yICAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS4yIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDEuZTIgLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjEuZTIiKSk7Ci0KLSAgLy8gVGVzdCBpbnZhbGlkIGludGVnZXJzIHRoYXQgbWF5IHN0aWxsIGJlIHRva2VuaXplZCBhcyBpbnRlZ2Vycy4KLSAgRVhQRUNUX0RPVUJMRV9FUSgxLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUtIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS5lIikpOwotCi0gIC8vIFRlc3QgJ2YnIHN1ZmZpeC4KLSAgRVhQRUNUX0RPVUJMRV9FUSgxLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFmIikpOwotICBFWFBFQ1RfRE9VQkxFX0VRKDEsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS4wZiIpKTsKLSAgRVhQRUNUX0RPVUJMRV9FUSgxLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFGIikpOwotCi0gIC8vIFRoZXNlIHNob3VsZCBwYXJzZSBzdWNjZXNzZnVsbHkgZXZlbiB0aG91Z2ggdGhleSBhcmUgb3V0IG9mIHJhbmdlLgotICAvLyBPdmVyZmxvd3MgYmVjb21lIGluZmluaXR5IGFuZCB1bmRlcmZsb3dzIGJlY29tZSB6ZXJvLgotICBFWFBFQ1RfRVEoICAgICAwLjAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpKTsKLSAgRVhQRUNUX0VRKEhVR0VfVkFMLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlKzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKSk7Ci0KLSNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQKLSAgLy8gVGVzdCBpbnZhbGlkIGludGVnZXJzIHRoYXQgd2lsbCBuZXZlciBiZSB0b2tlbml6ZWQgYXMgaW50ZWdlcnMuCi0gIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlRmxvYXQoInp4eSIpLAotICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKLSAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMS1lMCIpLAotICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKLSAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLTEuMCIpLAotICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKLSNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLX0KLQotVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlU3RyaW5nKSB7Ci0gIHN0cmluZyBvdXRwdXQ7Ci0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidoZWxsbyciLCAmb3V0cHV0KTsKLSAgRVhQRUNUX0VRKCJoZWxsbyIsIG91dHB1dCk7Ci0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIlwiYmxhaFxcbmJsYWgyXCIiLCAmb3V0cHV0KTsKLSAgRVhQRUNUX0VRKCJibGFoXG5ibGFoMiIsIG91dHB1dCk7Ci0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXDF4XFwxXFwxMjNcXDczOVxcNTJcXDMzNG5cXDMnIiwgJm91dHB1dCk7Ci0gIEVYUEVDVF9FUSgiXDF4XDFcMTIzXDczOVw1MlwzMzRuXDMiLCBvdXRwdXQpOwotICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInXFx4MjBcXHg0JyIsICZvdXRwdXQpOwotICBFWFBFQ1RfRVEoIlx4MjBceDQiLCBvdXRwdXQpOwotCi0gIC8vIFRlc3QgaW52YWxpZCBzdHJpbmdzIHRoYXQgbWF5IHN0aWxsIGJlIHRva2VuaXplZCBhcyBzdHJpbmdzLgotICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCJcIlxcYVxcbFxcdlxcdCIsICZvdXRwdXQpOyAgLy8gXGwgaXMgaW52YWxpZAotICBFWFBFQ1RfRVEoIlxhP1x2XHQiLCBvdXRwdXQpOwotICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInIiwgJm91dHB1dCk7Ci0gIEVYUEVDVF9FUSgiIiwgb3V0cHV0KTsKLSAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcIiwgJm91dHB1dCk7Ci0gIEVYUEVDVF9FUSgiXFwiLCBvdXRwdXQpOwotCi0gIC8vIEV4cGVyaW1lbnQgd2l0aCBVbmljb2RlIGVzY2FwZXMuIEhlcmUgYXJlIG9uZS0sIHR3by0gYW5kIHRocmVlLWJ5dGUgVW5pY29kZQotICAvLyBjaGFyYWN0ZXJzLgotICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInXFx1MDAyNFxcdTAwYTJcXHUyMGFjXFxVMDAwMjRiNjJYWCciLCAmb3V0cHV0KTsKLSAgRVhQRUNUX0VRKCIkwqLigqzwpK2iWFgiLCBvdXRwdXQpOwotICAvLyBTYW1lIHRoaW5nIGVuY29kZWQgdXNpbmcgVVRGMTYuCi0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHUwMDI0XFx1MDBhMlxcdTIwYWNcXHVkODUyXFx1ZGY2MlhYJyIsICZvdXRwdXQpOwotICBFWFBFQ1RfRVEoIiTCouKCrPCkraJYWCIsIG91dHB1dCk7Ci0gIC8vIEhlcmUncyBzb21lIGJyb2tlbiBVVEYxNjsgdGhlcmUncyBhIGhlYWQgc3Vycm9nYXRlIHdpdGggbm8gdGFpbCBzdXJyb2dhdGUuCi0gIC8vIFdlIGp1c3Qgb3V0cHV0IHRoaXMgYXMgaWYgaXQgd2VyZSBVVEY4OyBpdCdzIG5vdCBhIGRlZmluZWQgY29kZSBwb2ludCwgYnV0Ci0gIC8vIGl0IGhhcyBhIGRlZmluZWQgZW5jb2RpbmcuCi0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHVkODUyWFgnIiwgJm91dHB1dCk7Ci0gIEVYUEVDVF9FUSgiXHhlZFx4YTFceDkyWFgiLCBvdXRwdXQpOwotICAvLyBNYWxmb3JtZWQgZXNjYXBlOiBEZW1vbnMgbWF5IGZseSBvdXQgb2YgdGhlIG5vc2UuCi0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIlxcdTAiLCAmb3V0cHV0KTsKLSAgRVhQRUNUX0VRKCJ1MCIsIG91dHB1dCk7Ci0KLSAgLy8gVGVzdCBpbnZhbGlkIHN0cmluZ3MgdGhhdCB3aWxsIG5ldmVyIGJlIHRva2VuaXplZCBhcyBzdHJpbmdzLgotI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUICAvLyBkZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIHlldAotICBFWFBFQ1RfREVCVUdfREVBVEgoVG9rZW5pemVyOjpQYXJzZVN0cmluZygiIiwgJm91dHB1dCksCi0gICAgInBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IGhhdmUgYmVlbiB0b2tlbml6ZWQgYXMgYSBzdHJpbmciKTsKLSNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLX0KLQotVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlU3RyaW5nQXBwZW5kKSB7Ci0gIC8vIENoZWNrIHRoYXQgUGFyc2VTdHJpbmcgYW5kIFBhcnNlU3RyaW5nQXBwZW5kIGRpZmZlci4KLSAgc3RyaW5nIG91dHB1dCgic3R1ZmYrIik7Ci0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQoIidoZWxsbyciLCAmb3V0cHV0KTsKLSAgRVhQRUNUX0VRKCJzdHVmZitoZWxsbyIsIG91dHB1dCk7Ci0gIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidoZWxsbyciLCAmb3V0cHV0KTsKLSAgRVhQRUNUX0VRKCJoZWxsbyIsIG91dHB1dCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gRWFjaCBjYXNlIHBhcnNlcyBzb21lIGlucHV0IHRleHQsIGlnbm9yaW5nIHRoZSB0b2tlbnMgcHJvZHVjZWQsIGFuZAotLy8gY2hlY2tzIHRoYXQgdGhlIGVycm9yIG91dHB1dCBtYXRjaGVzIHdoYXQgaXMgZXhwZWN0ZWQuCi1zdHJ1Y3QgRXJyb3JDYXNlIHsKLSAgc3RyaW5nIGlucHV0OwotICBib29sIHJlY292ZXJhYmxlOyAgLy8gVHJ1ZSBpZiB0aGUgdG9rZW5pemVyIHNob3VsZCBiZSBhYmxlIHRvIHJlY292ZXIgYW5kCi0gICAgICAgICAgICAgICAgICAgICAvLyBwYXJzZSBtb3JlIHRva2VucyBhZnRlciBzZWVpbmcgdGhpcyBlcnJvci4gIENhc2VzCi0gICAgICAgICAgICAgICAgICAgICAvLyBmb3Igd2hpY2ggdGhpcyBpcyB0cnVlIG11c3QgZW5kIHdpdGggImZvbyIgYXMKLSAgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBsYXN0IHRva2VuLCB3aGljaCB0aGUgdGVzdCB3aWxsIGNoZWNrIGZvci4KLSAgY29uc3QgY2hhciogZXJyb3JzOwotfTsKLQotaW5saW5lIG9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXJyb3JDYXNlJiB0ZXN0X2Nhc2UpIHsKLSAgcmV0dXJuIG91dCA8PCBDRXNjYXBlKHRlc3RfY2FzZS5pbnB1dCk7Ci19Ci0KLUVycm9yQ2FzZSBrRXJyb3JDYXNlc1tdID0gewotICAvLyBTdHJpbmcgZXJyb3JzLgotICB7ICInXFxsJyBmb28iLCB0cnVlLAotICAgICIwOjI6IEludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsLlxuIiB9LAotICB7ICInXFxYJyBmb28iLCB0cnVlLAotICAgICIwOjI6IEludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGluIHN0cmluZyBsaXRlcmFsLlxuIiB9LAotICB7ICInXFx4JyBmb28iLCB0cnVlLAotICAgICIwOjM6IEV4cGVjdGVkIGhleCBkaWdpdHMgZm9yIGVzY2FwZSBzZXF1ZW5jZS5cbiIgfSwKLSAgeyAiJ2ZvbyIsIGZhbHNlLAotICAgICIwOjQ6IFVuZXhwZWN0ZWQgZW5kIG9mIHN0cmluZy5cbiIgfSwKLSAgeyAiJ2JhclxuZm9vIiwgdHJ1ZSwKLSAgICAiMDo0OiBTdHJpbmcgbGl0ZXJhbHMgY2Fubm90IGNyb3NzIGxpbmUgYm91bmRhcmllcy5cbiIgfSwKLSAgeyAiJ1xcdTAxJyBmb28iLCB0cnVlLAotICAgICIwOjU6IEV4cGVjdGVkIGZvdXIgaGV4IGRpZ2l0cyBmb3IgXFx1IGVzY2FwZSBzZXF1ZW5jZS5cbiIgfSwKLSAgeyAiJ1xcdTAxJyBmb28iLCB0cnVlLAotICAgICIwOjU6IEV4cGVjdGVkIGZvdXIgaGV4IGRpZ2l0cyBmb3IgXFx1IGVzY2FwZSBzZXF1ZW5jZS5cbiIgfSwKLSAgeyAiJ1xcdVhZWicgZm9vIiwgdHJ1ZSwKLSAgICAiMDozOiBFeHBlY3RlZCBmb3VyIGhleCBkaWdpdHMgZm9yIFxcdSBlc2NhcGUgc2VxdWVuY2UuXG4iIH0sCi0KLSAgLy8gSW50ZWdlciBlcnJvcnMuCi0gIHsgIjEyM2ZvbyIsIHRydWUsCi0gICAgIjA6MzogTmVlZCBzcGFjZSBiZXR3ZWVuIG51bWJlciBhbmQgaWRlbnRpZmllci5cbiIgfSwKLQotICAvLyBIZXgvb2N0YWwgZXJyb3JzLgotICB7ICIweCBmb28iLCB0cnVlLAotICAgICIwOjI6IFwiMHhcIiBtdXN0IGJlIGZvbGxvd2VkIGJ5IGhleCBkaWdpdHMuXG4iIH0sCi0gIHsgIjA1NDE4MjMgZm9vIiwgdHJ1ZSwKLSAgICAiMDo0OiBOdW1iZXJzIHN0YXJ0aW5nIHdpdGggbGVhZGluZyB6ZXJvIG11c3QgYmUgaW4gb2N0YWwuXG4iIH0sCi0gIHsgIjB4MTIzeiBmb28iLCB0cnVlLAotICAgICIwOjU6IE5lZWQgc3BhY2UgYmV0d2VlbiBudW1iZXIgYW5kIGlkZW50aWZpZXIuXG4iIH0sCi0gIHsgIjB4MTIzLjQgZm9vIiwgdHJ1ZSwKLSAgICAiMDo1OiBIZXggYW5kIG9jdGFsIG51bWJlcnMgbXVzdCBiZSBpbnRlZ2Vycy5cbiIgfSwKLSAgeyAiMDEyMy40IGZvbyIsIHRydWUsCi0gICAgIjA6NDogSGV4IGFuZCBvY3RhbCBudW1iZXJzIG11c3QgYmUgaW50ZWdlcnMuXG4iIH0sCi0KLSAgLy8gRmxvYXQgZXJyb3JzLgotICB7ICIxZSBmb28iLCB0cnVlLAotICAgICIwOjI6IFwiZVwiIG11c3QgYmUgZm9sbG93ZWQgYnkgZXhwb25lbnQuXG4iIH0sCi0gIHsgIjFlLSBmb28iLCB0cnVlLAotICAgICIwOjM6IFwiZVwiIG11c3QgYmUgZm9sbG93ZWQgYnkgZXhwb25lbnQuXG4iIH0sCi0gIHsgIjEuMi4zIGZvbyIsIHRydWUsCi0gICAgIjA6MzogQWxyZWFkeSBzYXcgZGVjaW1hbCBwb2ludCBvciBleHBvbmVudDsgY2FuJ3QgaGF2ZSBhbm90aGVyIG9uZS5cbiIgfSwKLSAgeyAiMWUyLjMgZm9vIiwgdHJ1ZSwKLSAgICAiMDozOiBBbHJlYWR5IHNhdyBkZWNpbWFsIHBvaW50IG9yIGV4cG9uZW50OyBjYW4ndCBoYXZlIGFub3RoZXIgb25lLlxuIiB9LAotICB7ICJhLjEgZm9vIiwgdHJ1ZSwKLSAgICAiMDoxOiBOZWVkIHNwYWNlIGJldHdlZW4gaWRlbnRpZmllciBhbmQgZGVjaW1hbCBwb2ludC5cbiIgfSwKLSAgLy8gYWxsb3dfZl9hZnRlcl9mbG9hdCBub3QgZW5hYmxlZCwgc28gdGhpcyBzaG91bGQgYmUgYW4gZXJyb3IuCi0gIHsgIjEuMGYgZm9vIiwgdHJ1ZSwKLSAgICAiMDozOiBOZWVkIHNwYWNlIGJldHdlZW4gbnVtYmVyIGFuZCBpZGVudGlmaWVyLlxuIiB9LAotCi0gIC8vIEJsb2NrIGNvbW1lbnQgZXJyb3JzLgotICB7ICIvKiIsIGZhbHNlLAotICAgICIwOjI6IEVuZC1vZi1maWxlIGluc2lkZSBibG9jayBjb21tZW50LlxuIgotICAgICIwOjA6ICAgQ29tbWVudCBzdGFydGVkIGhlcmUuXG4ifSwKLSAgeyAiLyovKi8gZm9vIiwgdHJ1ZSwKLSAgICAiMDozOiBcIi8qXCIgaW5zaWRlIGJsb2NrIGNvbW1lbnQuICBCbG9jayBjb21tZW50cyBjYW5ub3QgYmUgbmVzdGVkLlxuIn0sCi0KLSAgLy8gQ29udHJvbCBjaGFyYWN0ZXJzLiAgTXVsdGlwbGUgY29uc2VjdXRpdmUgY29udHJvbCBjaGFyYWN0ZXJzIHNob3VsZCBvbmx5Ci0gIC8vIHByb2R1Y2Ugb25lIGVycm9yLgotICB7ICJcYiBmb28iLCB0cnVlLAotICAgICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4iIH0sCi0gIHsgIlxiXGIgZm9vIiwgdHJ1ZSwKLSAgICAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIiB9LAotCi0gIC8vIENoZWNrIHRoYXQgY29udHJvbCBjaGFyYWN0ZXJzIGF0IGVuZCBvZiBpbnB1dCBkb24ndCByZXN1bHQgaW4gYW4KLSAgLy8gaW5maW5pdGUgbG9vcC4KLSAgeyAiXGIiLCBmYWxzZSwKLSAgICAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIiB9LAotCi0gIC8vIENoZWNrIHJlY292ZXJ5IGZyb20gJ1wwJy4gIFdlIGhhdmUgdG8gZXhwbGljaXRseSBzcGVjaWZ5IHRoZSBsZW5ndGggb2YKLSAgLy8gdGhlc2Ugc3RyaW5ncyBiZWNhdXNlIG90aGVyd2lzZSB0aGUgc3RyaW5nIGNvbnN0cnVjdG9yIHdpbGwganVzdCBjYWxsCi0gIC8vIHN0cmxlbigpIHdoaWNoIHdpbGwgc2VlIHRoZSBmaXJzdCAnXDAnIGFuZCB0aGluayB0aGF0IGlzIHRoZSBlbmQgb2YgdGhlCi0gIC8vIHN0cmluZy4KLSAgeyBzdHJpbmcoIlwwZm9vIiwgNCksIHRydWUsCi0gICAgIjA6MDogSW52YWxpZCBjb250cm9sIGNoYXJhY3RlcnMgZW5jb3VudGVyZWQgaW4gdGV4dC5cbiIgfSwKLSAgeyBzdHJpbmcoIlwwXDBmb28iLCA1KSwgdHJ1ZSwKLSAgICAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIiB9LAotCi0gIC8vIENoZWNrIGVycm9yIGZyb20gaGlnaCBvcmRlciBiaXRzIHNldAotICB7ICJcMzAwZm9vIiwgdHJ1ZSwKLSAgICAiMDowOiBJbnRlcnByZXRpbmcgbm9uIGFzY2lpIGNvZGVwb2ludCAxOTIuXG4iIH0sCi19OwotCi1URVNUXzJEKFRva2VuaXplclRlc3QsIEVycm9ycywga0Vycm9yQ2FzZXMsIGtCbG9ja1NpemVzKSB7Ci0gIC8vIFNldCB1cCB0aGUgdG9rZW5pemVyLgotICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQoa0Vycm9yQ2FzZXNfY2FzZS5pbnB1dC5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBrRXJyb3JDYXNlc19jYXNlLmlucHV0LnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOwotICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOwotICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7Ci0KLSAgLy8gSWdub3JlIGFsbCBpbnB1dCwgZXhjZXB0IHJlbWVtYmVyIGlmIHRoZSBsYXN0IHRva2VuIHdhcyAiZm9vIi4KLSAgYm9vbCBsYXN0X3dhc19mb28gPSBmYWxzZTsKLSAgd2hpbGUgKHRva2VuaXplci5OZXh0KCkpIHsKLSAgICBsYXN0X3dhc19mb28gPSB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQgPT0gImZvbyI7Ci0gIH0KLQotICAvLyBDaGVjayB0aGF0IHRoZSBlcnJvcnMgbWF0Y2ggd2hhdCB3YXMgZXhwZWN0ZWQuCi0gIEVYUEVDVF9FUShrRXJyb3JDYXNlc19jYXNlLmVycm9ycywgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKLQotICAvLyBJZiB0aGUgZXJyb3Igd2FzIHJlY292ZXJhYmxlLCBtYWtlIHN1cmUgd2Ugc2F3ICJmb28iIGFmdGVyIGl0LgotICBpZiAoa0Vycm9yQ2FzZXNfY2FzZS5yZWNvdmVyYWJsZSkgewotICAgIEVYUEVDVF9UUlVFKGxhc3Rfd2FzX2Zvbyk7Ci0gIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1URVNUXzFEKFRva2VuaXplclRlc3QsIEJhY2tVcE9uRGVzdHJ1Y3Rpb24sIGtCbG9ja1NpemVzKSB7Ci0gIHN0cmluZyB0ZXh0ID0gImZvbyBiYXIiOwotICBUZXN0SW5wdXRTdHJlYW0gaW5wdXQodGV4dC5kYXRhKCksIHRleHQuc2l6ZSgpLCBrQmxvY2tTaXplc19jYXNlKTsKLQotICAvLyBDcmVhdGUgYSB0b2tlbml6ZXIsIHJlYWQgb25lIHRva2VuLCB0aGVuIGRlc3Ryb3kgaXQuCi0gIHsKLSAgICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOwotICAgIFRva2VuaXplciB0b2tlbml6ZXIoJmlucHV0LCAmZXJyb3JfY29sbGVjdG9yKTsKLQotICAgIHRva2VuaXplci5OZXh0KCk7Ci0gIH0KLQotICAvLyBPbmx5ICJmb28iIHNob3VsZCBoYXZlIGJlZW4gcmVhZC4KLSAgRVhQRUNUX0VRKHN0cmxlbigiZm9vIiksIGlucHV0LkJ5dGVDb3VudCgpKTsKLX0KLQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE4NmRlMDAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotCi1aZXJvQ29weUlucHV0U3RyZWFtOjp+WmVyb0NvcHlJbnB1dFN0cmVhbSgpIHt9Ci1aZXJvQ29weU91dHB1dFN0cmVhbTo6flplcm9Db3B5T3V0cHV0U3RyZWFtKCkge30KLQotCi1ib29sIFplcm9Db3B5T3V0cHV0U3RyZWFtOjpXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogLyogZGF0YSAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgewotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBaZXJvQ29weU91dHB1dFN0cmVhbSBkb2Vzbid0IHN1cHBvcnQgYWxpYXNpbmcuICIKLSAgICAgICAgICAgICAgICAiUmVhY2hpbmcgaGVyZSB1c3VhbGx5IG1lYW5zIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gIgotICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbiBidWcuIjsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW8KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTI2NTBmYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaAorKysgL2Rldi9udWxsCkBAIC0xLDI0OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBaZXJvQ29weUlucHV0U3RyZWFtIGFuZCBaZXJvQ29weU91dHB1dFN0cmVhbQotLy8gaW50ZXJmYWNlcywgd2hpY2ggcmVwcmVzZW50IGFic3RyYWN0IEkvTyBzdHJlYW1zIHRvIGFuZCBmcm9tIHdoaWNoCi0vLyBwcm90b2NvbCBidWZmZXJzIGNhbiBiZSByZWFkIGFuZCB3cml0dGVuLiAgRm9yIGEgZmV3IHNpbXBsZQotLy8gaW1wbGVtZW50YXRpb25zIG9mIHRoZXNlIGludGVyZmFjZXMsIHNlZSB6ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaC4KLS8vCi0vLyBUaGVzZSBpbnRlcmZhY2VzIGFyZSBkaWZmZXJlbnQgZnJvbSBjbGFzc2ljIEkvTyBzdHJlYW1zIGluIHRoYXQgdGhleQotLy8gdHJ5IHRvIG1pbmltaXplIHRoZSBhbW91bnQgb2YgZGF0YSBjb3B5aW5nIHRoYXQgbmVlZHMgdG8gYmUgZG9uZS4KLS8vIFRvIGFjY29tcGxpc2ggdGhpcywgcmVzcG9uc2liaWxpdHkgZm9yIGFsbG9jYXRpbmcgYnVmZmVycyBpcyBtb3ZlZCB0bwotLy8gdGhlIHN0cmVhbSBvYmplY3QsIHJhdGhlciB0aGFuIGJlaW5nIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyLgotLy8gU28sIHRoZSBzdHJlYW0gY2FuIHJldHVybiBhIGJ1ZmZlciB3aGljaCBhY3R1YWxseSBwb2ludHMgZGlyZWN0bHkgaW50bwotLy8gdGhlIGZpbmFsIGRhdGEgc3RydWN0dXJlIHdoZXJlIHRoZSBieXRlcyBhcmUgdG8gYmUgc3RvcmVkLCBhbmQgdGhlIGNhbGxlcgotLy8gY2FuIGludGVyYWN0IGRpcmVjdGx5IHdpdGggdGhhdCBidWZmZXIsIGVsaW1pbmF0aW5nIGFuIGludGVybWVkaWF0ZSBjb3B5Ci0vLyBvcGVyYXRpb24uCi0vLwotLy8gQXMgYW4gZXhhbXBsZSwgY29uc2lkZXIgdGhlIGNvbW1vbiBjYXNlIGluIHdoaWNoIHlvdSBhcmUgcmVhZGluZyBieXRlcwotLy8gZnJvbSBhbiBhcnJheSB0aGF0IGlzIGFscmVhZHkgaW4gbWVtb3J5IChvciBwZXJoYXBzIGFuIG1tYXAoKWVkIGZpbGUpLgotLy8gV2l0aCBjbGFzc2ljIEkvTyBzdHJlYW1zLCB5b3Ugd291bGQgZG8gc29tZXRoaW5nIGxpa2U6Ci0vLyAgIGNoYXIgYnVmZmVyW0JVRkZFUl9TSVpFXTsKLS8vICAgaW5wdXQtPlJlYWQoYnVmZmVyLCBCVUZGRVJfU0laRSk7Ci0vLyAgIERvU29tZXRoaW5nKGJ1ZmZlciwgQlVGRkVSX1NJWkUpOwotLy8gVGhlbiwgdGhlIHN0cmVhbSBiYXNpY2FsbHkganVzdCBjYWxscyBtZW1jcHkoKSB0byBjb3B5IHRoZSBkYXRhIGZyb20KLS8vIHRoZSBhcnJheSBpbnRvIHlvdXIgYnVmZmVyLiAgV2l0aCBhIFplcm9Db3B5SW5wdXRTdHJlYW0sIHlvdSB3b3VsZCBkbwotLy8gdGhpcyBpbnN0ZWFkOgotLy8gICBjb25zdCB2b2lkKiBidWZmZXI7Ci0vLyAgIGludCBzaXplOwotLy8gICBpbnB1dC0+TmV4dCgmYnVmZmVyLCAmc2l6ZSk7Ci0vLyAgIERvU29tZXRoaW5nKGJ1ZmZlciwgc2l6ZSk7Ci0vLyBIZXJlLCBubyBjb3B5IGlzIHBlcmZvcm1lZC4gIFRoZSBpbnB1dCBzdHJlYW0gcmV0dXJucyBhIHBvaW50ZXIgZGlyZWN0bHkKLS8vIGludG8gdGhlIGJhY2tpbmcgYXJyYXksIGFuZCB0aGUgY2FsbGVyIGVuZHMgdXAgcmVhZGluZyBkaXJlY3RseSBmcm9tIGl0LgotLy8KLS8vIElmIHlvdSB3YW50IHRvIGJlIGFibGUgdG8gcmVhZCB0aGUgb2xkLWZhc2hpb24gd2F5LCB5b3UgY2FuIGNyZWF0ZQotLy8gYSBDb2RlZElucHV0U3RyZWFtIG9yIENvZGVkT3V0cHV0U3RyZWFtIHdyYXBwaW5nIHRoZXNlIG9iamVjdHMgYW5kIHVzZQotLy8gdGhlaXIgUmVhZFJhdygpL1dyaXRlUmF3KCkgbWV0aG9kcy4gIFRoZXNlIHdpbGwsIG9mIGNvdXJzZSwgYWRkIGEgY29weQotLy8gc3RlcCwgYnV0IENvZGVkKlN0cmVhbSB3aWxsIGhhbmRsZSBidWZmZXJpbmcgc28gYXQgbGVhc3QgaXQgd2lsbCBiZQotLy8gcmVhc29uYWJseSBlZmZpY2llbnQuCi0vLwotLy8gWmVyb0NvcHlJbnB1dFN0cmVhbSBleGFtcGxlOgotLy8gICAvLyBSZWFkIGluIGEgZmlsZSBhbmQgcHJpbnQgaXRzIGNvbnRlbnRzIHRvIHN0ZG91dC4KLS8vICAgaW50IGZkID0gb3BlbigibXlmaWxlIiwgT19SRE9OTFkpOwotLy8gICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCA9IG5ldyBGaWxlSW5wdXRTdHJlYW0oZmQpOwotLy8KLS8vICAgY29uc3Qgdm9pZCogYnVmZmVyOwotLy8gICBpbnQgc2l6ZTsKLS8vICAgd2hpbGUgKGlucHV0LT5OZXh0KCZidWZmZXIsICZzaXplKSkgewotLy8gICAgIGNvdXQud3JpdGUoYnVmZmVyLCBzaXplKTsKLS8vICAgfQotLy8KLS8vICAgZGVsZXRlIGlucHV0OwotLy8gICBjbG9zZShmZCk7Ci0vLwotLy8gWmVyb0NvcHlPdXRwdXRTdHJlYW0gZXhhbXBsZToKLS8vICAgLy8gQ29weSB0aGUgY29udGVudHMgb2YgImluZmlsZSIgdG8gIm91dGZpbGUiLCB1c2luZyBwbGFpbiByZWFkKCkgZm9yCi0vLyAgIC8vICJpbmZpbGUiIGJ1dCBhIFplcm9Db3B5T3V0cHV0U3RyZWFtIGZvciAib3V0ZmlsZSIuCi0vLyAgIGludCBpbmZkID0gb3BlbigiaW5maWxlIiwgT19SRE9OTFkpOwotLy8gICBpbnQgb3V0ZmQgPSBvcGVuKCJvdXRmaWxlIiwgT19XUk9OTFkpOwotLy8gICBaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0ID0gbmV3IEZpbGVPdXRwdXRTdHJlYW0ob3V0ZmQpOwotLy8KLS8vICAgdm9pZCogYnVmZmVyOwotLy8gICBpbnQgc2l6ZTsKLS8vICAgd2hpbGUgKG91dHB1dC0+TmV4dCgmYnVmZmVyLCAmc2l6ZSkpIHsKLS8vICAgICBpbnQgYnl0ZXMgPSByZWFkKGluZmQsIGJ1ZmZlciwgc2l6ZSk7Ci0vLyAgICAgaWYgKGJ5dGVzIDwgc2l6ZSkgewotLy8gICAgICAgLy8gUmVhY2hlZCBFT0YuCi0vLyAgICAgICBvdXRwdXQtPkJhY2tVcChzaXplIC0gYnl0ZXMpOwotLy8gICAgICAgYnJlYWs7Ci0vLyAgICAgfQotLy8gICB9Ci0vLwotLy8gICBkZWxldGUgb3V0cHV0OwotLy8gICBjbG9zZShpbmZkKTsKLS8vICAgY2xvc2Uob3V0ZmQpOwotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9IX18KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGlvIHsKLQotLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCi1jbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOwotY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07Ci0KLS8vIEFic3RyYWN0IGludGVyZmFjZSBzaW1pbGFyIHRvIGFuIGlucHV0IHN0cmVhbSBidXQgZGVzaWduZWQgdG8gbWluaW1pemUKLS8vIGNvcHlpbmcuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgWmVyb0NvcHlJbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICBpbmxpbmUgWmVyb0NvcHlJbnB1dFN0cmVhbSgpIHt9Ci0gIHZpcnR1YWwgflplcm9Db3B5SW5wdXRTdHJlYW0oKTsKLQotICAvLyBPYnRhaW5zIGEgY2h1bmsgb2YgZGF0YSBmcm9tIHRoZSBzdHJlYW0uCi0gIC8vCi0gIC8vIFByZWNvbmRpdGlvbnM6Ci0gIC8vICogInNpemUiIGFuZCAiZGF0YSIgYXJlIG5vdCBOVUxMLgotICAvLwotICAvLyBQb3N0Y29uZGl0aW9uczoKLSAgLy8gKiBJZiB0aGUgcmV0dXJuZWQgdmFsdWUgaXMgZmFsc2UsIHRoZXJlIGlzIG5vIG1vcmUgZGF0YSB0byByZXR1cm4gb3IKLSAgLy8gICBhbiBlcnJvciBvY2N1cnJlZC4gIEFsbCBlcnJvcnMgYXJlIHBlcm1hbmVudC4KLSAgLy8gKiBPdGhlcndpc2UsICJzaXplIiBwb2ludHMgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCBhbmQgImRhdGEiCi0gIC8vICAgcG9pbnRzIHRvIGEgcG9pbnRlciB0byBhIGJ1ZmZlciBjb250YWluaW5nIHRoZXNlIGJ5dGVzLgotICAvLyAqIE93bmVyc2hpcCBvZiB0aGlzIGJ1ZmZlciByZW1haW5zIHdpdGggdGhlIHN0cmVhbSwgYW5kIHRoZSBidWZmZXIKLSAgLy8gICByZW1haW5zIHZhbGlkIG9ubHkgdW50aWwgc29tZSBvdGhlciBtZXRob2Qgb2YgdGhlIHN0cmVhbSBpcyBjYWxsZWQKLSAgLy8gICBvciB0aGUgc3RyZWFtIGlzIGRlc3Ryb3llZC4KLSAgLy8gKiBJdCBpcyBsZWdhbCBmb3IgdGhlIHJldHVybmVkIGJ1ZmZlciB0byBoYXZlIHplcm8gc2l6ZSwgYXMgbG9uZwotICAvLyAgIGFzIHJlcGVhdGVkbHkgY2FsbGluZyBOZXh0KCkgZXZlbnR1YWxseSB5aWVsZHMgYSBidWZmZXIgd2l0aCBub24temVybwotICAvLyAgIHNpemUuCi0gIHZpcnR1YWwgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpID0gMDsKLQotICAvLyBCYWNrcyB1cCBhIG51bWJlciBvZiBieXRlcywgc28gdGhhdCB0aGUgbmV4dCBjYWxsIHRvIE5leHQoKSByZXR1cm5zCi0gIC8vIGRhdGEgYWdhaW4gdGhhdCB3YXMgYWxyZWFkeSByZXR1cm5lZCBieSB0aGUgbGFzdCBjYWxsIHRvIE5leHQoKS4gIFRoaXMKLSAgLy8gaXMgdXNlZnVsIHdoZW4gd3JpdGluZyBwcm9jZWR1cmVzIHRoYXQgYXJlIG9ubHkgc3VwcG9zZWQgdG8gcmVhZCB1cAotICAvLyB0byBhIGNlcnRhaW4gcG9pbnQgaW4gdGhlIGlucHV0LCB0aGVuIHJldHVybi4gIElmIE5leHQoKSByZXR1cm5zIGEKLSAgLy8gYnVmZmVyIHRoYXQgZ29lcyBiZXlvbmQgd2hhdCB5b3Ugd2FudGVkIHRvIHJlYWQsIHlvdSBjYW4gdXNlIEJhY2tVcCgpCi0gIC8vIHRvIHJldHVybiB0byB0aGUgcG9pbnQgd2hlcmUgeW91IGludGVuZGVkIHRvIGZpbmlzaC4KLSAgLy8KLSAgLy8gUHJlY29uZGl0aW9uczoKLSAgLy8gKiBUaGUgbGFzdCBtZXRob2QgY2FsbGVkIG11c3QgaGF2ZSBiZWVuIE5leHQoKS4KLSAgLy8gKiBjb3VudCBtdXN0IGJlIGxlc3MgdGhhbiBvciBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgbGFzdCBidWZmZXIKLSAgLy8gICByZXR1cm5lZCBieSBOZXh0KCkuCi0gIC8vCi0gIC8vIFBvc3Rjb25kaXRpb25zOgotICAvLyAqIFRoZSBsYXN0ICJjb3VudCIgYnl0ZXMgb2YgdGhlIGxhc3QgYnVmZmVyIHJldHVybmVkIGJ5IE5leHQoKSB3aWxsIGJlCi0gIC8vICAgcHVzaGVkIGJhY2sgaW50byB0aGUgc3RyZWFtLiAgU3Vic2VxdWVudCBjYWxscyB0byBOZXh0KCkgd2lsbCByZXR1cm4KLSAgLy8gICB0aGUgc2FtZSBkYXRhIGFnYWluIGJlZm9yZSBwcm9kdWNpbmcgbmV3IGRhdGEuCi0gIHZpcnR1YWwgdm9pZCBCYWNrVXAoaW50IGNvdW50KSA9IDA7Ci0KLSAgLy8gU2tpcHMgYSBudW1iZXIgb2YgYnl0ZXMuICBSZXR1cm5zIGZhbHNlIGlmIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBpcwotICAvLyByZWFjaGVkIG9yIHNvbWUgaW5wdXQgZXJyb3Igb2NjdXJyZWQuICBJbiB0aGUgZW5kLW9mLXN0cmVhbSBjYXNlLCB0aGUKLSAgLy8gc3RyZWFtIGlzIGFkdmFuY2VkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSAoc28gQnl0ZUNvdW50KCkgd2lsbCByZXR1cm4KLSAgLy8gdGhlIHRvdGFsIHNpemUgb2YgdGhlIHN0cmVhbSkuCi0gIHZpcnR1YWwgYm9vbCBTa2lwKGludCBjb3VudCkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIHNpbmNlIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkLgotICB2aXJ0dWFsIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0ID0gMDsKLQotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFplcm9Db3B5SW5wdXRTdHJlYW0pOwotfTsKLQotLy8gQWJzdHJhY3QgaW50ZXJmYWNlIHNpbWlsYXIgdG8gYW4gb3V0cHV0IHN0cmVhbSBidXQgZGVzaWduZWQgdG8gbWluaW1pemUKLS8vIGNvcHlpbmcuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgWmVyb0NvcHlPdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgaW5saW5lIFplcm9Db3B5T3V0cHV0U3RyZWFtKCkge30KLSAgdmlydHVhbCB+WmVyb0NvcHlPdXRwdXRTdHJlYW0oKTsKLQotICAvLyBPYnRhaW5zIGEgYnVmZmVyIGludG8gd2hpY2ggZGF0YSBjYW4gYmUgd3JpdHRlbi4gIEFueSBkYXRhIHdyaXR0ZW4KLSAgLy8gaW50byB0aGlzIGJ1ZmZlciB3aWxsIGV2ZW50dWFsbHkgKG1heWJlIGluc3RhbnRseSwgbWF5YmUgbGF0ZXIgb24pCi0gIC8vIGJlIHdyaXR0ZW4gdG8gdGhlIG91dHB1dC4KLSAgLy8KLSAgLy8gUHJlY29uZGl0aW9uczoKLSAgLy8gKiAic2l6ZSIgYW5kICJkYXRhIiBhcmUgbm90IE5VTEwuCi0gIC8vCi0gIC8vIFBvc3Rjb25kaXRpb25zOgotICAvLyAqIElmIHRoZSByZXR1cm5lZCB2YWx1ZSBpcyBmYWxzZSwgYW4gZXJyb3Igb2NjdXJyZWQuICBBbGwgZXJyb3JzIGFyZQotICAvLyAgIHBlcm1hbmVudC4KLSAgLy8gKiBPdGhlcndpc2UsICJzaXplIiBwb2ludHMgdG8gdGhlIGFjdHVhbCBudW1iZXIgb2YgYnl0ZXMgaW4gdGhlIGJ1ZmZlcgotICAvLyAgIGFuZCAiZGF0YSIgcG9pbnRzIHRvIHRoZSBidWZmZXIuCi0gIC8vICogT3duZXJzaGlwIG9mIHRoaXMgYnVmZmVyIHJlbWFpbnMgd2l0aCB0aGUgc3RyZWFtLCBhbmQgdGhlIGJ1ZmZlcgotICAvLyAgIHJlbWFpbnMgdmFsaWQgb25seSB1bnRpbCBzb21lIG90aGVyIG1ldGhvZCBvZiB0aGUgc3RyZWFtIGlzIGNhbGxlZAotICAvLyAgIG9yIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgotICAvLyAqIEFueSBkYXRhIHdoaWNoIHRoZSBjYWxsZXIgc3RvcmVzIGluIHRoaXMgYnVmZmVyIHdpbGwgZXZlbnR1YWxseSBiZQotICAvLyAgIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCAodW5sZXNzIEJhY2tVcCgpIGlzIGNhbGxlZCkuCi0gIC8vICogSXQgaXMgbGVnYWwgZm9yIHRoZSByZXR1cm5lZCBidWZmZXIgdG8gaGF2ZSB6ZXJvIHNpemUsIGFzIGxvbmcKLSAgLy8gICBhcyByZXBlYXRlZGx5IGNhbGxpbmcgTmV4dCgpIGV2ZW50dWFsbHkgeWllbGRzIGEgYnVmZmVyIHdpdGggbm9uLXplcm8KLSAgLy8gICBzaXplLgotICB2aXJ0dWFsIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSA9IDA7Ci0KLSAgLy8gQmFja3MgdXAgYSBudW1iZXIgb2YgYnl0ZXMsIHNvIHRoYXQgdGhlIGVuZCBvZiB0aGUgbGFzdCBidWZmZXIgcmV0dXJuZWQKLSAgLy8gYnkgTmV4dCgpIGlzIG5vdCBhY3R1YWxseSB3cml0dGVuLiAgVGhpcyBpcyBuZWVkZWQgd2hlbiB5b3UgZmluaXNoCi0gIC8vIHdyaXRpbmcgYWxsIHRoZSBkYXRhIHlvdSB3YW50IHRvIHdyaXRlLCBidXQgdGhlIGxhc3QgYnVmZmVyIHdhcyBiaWdnZXIKLSAgLy8gdGhhbiB5b3UgbmVlZGVkLiAgWW91IGRvbid0IHdhbnQgdG8gd3JpdGUgYSBidW5jaCBvZiBnYXJiYWdlIGFmdGVyIHRoZQotICAvLyBlbmQgb2YgeW91ciBkYXRhLCBzbyB5b3UgdXNlIEJhY2tVcCgpIHRvIGJhY2sgdXAuCi0gIC8vCi0gIC8vIFByZWNvbmRpdGlvbnM6Ci0gIC8vICogVGhlIGxhc3QgbWV0aG9kIGNhbGxlZCBtdXN0IGhhdmUgYmVlbiBOZXh0KCkuCi0gIC8vICogY291bnQgbXVzdCBiZSBsZXNzIHRoYW4gb3IgZXF1YWwgdG8gdGhlIHNpemUgb2YgdGhlIGxhc3QgYnVmZmVyCi0gIC8vICAgcmV0dXJuZWQgYnkgTmV4dCgpLgotICAvLyAqIFRoZSBjYWxsZXIgbXVzdCBub3QgaGF2ZSB3cml0dGVuIGFueXRoaW5nIHRvIHRoZSBsYXN0ICJjb3VudCIgYnl0ZXMKLSAgLy8gICBvZiB0aGF0IGJ1ZmZlci4KLSAgLy8KLSAgLy8gUG9zdGNvbmRpdGlvbnM6Ci0gIC8vICogVGhlIGxhc3QgImNvdW50IiBieXRlcyBvZiB0aGUgbGFzdCBidWZmZXIgcmV0dXJuZWQgYnkgTmV4dCgpIHdpbGwgYmUKLSAgLy8gICBpZ25vcmVkLgotICB2aXJ0dWFsIHZvaWQgQmFja1VwKGludCBjb3VudCkgPSAwOwotCi0gIC8vIFJldHVybnMgdGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHNpbmNlIHRoaXMgb2JqZWN0IHdhcyBjcmVhdGVkLgotICB2aXJ0dWFsIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0ID0gMDsKLQotICAvLyBXcml0ZSBhIGdpdmVuIGNodW5rIG9mIGRhdGEgdG8gdGhlIG91dHB1dC4gIFNvbWUgb3V0cHV0IHN0cmVhbXMgbWF5Ci0gIC8vIGltcGxlbWVudCB0aGlzIGluIGEgd2F5IHRoYXQgYXZvaWRzIGNvcHlpbmcuIENoZWNrIEFsbG93c0FsaWFzaW5nKCkgYmVmb3JlCi0gIC8vIGNhbGxpbmcgV3JpdGVBbGlhc2VkUmF3KCkuIEl0IHdpbGwgR09PR0xFX0NIRUNLIGZhaWwgaWYgV3JpdGVBbGlhc2VkUmF3KCkgaXMKLSAgLy8gY2FsbGVkIG9uIGEgc3RyZWFtIHRoYXQgZG9lcyBub3QgYWxsb3cgYWxpYXNpbmcuCi0gIC8vCi0gIC8vIE5PVEU6IEl0IGlzIGNhbGxlcidzIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBjaHVuayBvZiBtZW1vcnkKLSAgLy8gcmVtYWlucyBsaXZlIHVudGlsIGFsbCBvZiB0aGUgZGF0YSBoYXMgYmVlbiBjb25zdW1lZCBmcm9tIHRoZSBzdHJlYW0uCi0gIHZpcnR1YWwgYm9vbCBXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpOwotICB2aXJ0dWFsIGJvb2wgQWxsb3dzQWxpYXNpbmcoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQotCi0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoWmVyb0NvcHlPdXRwdXRTdHJlYW0pOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGlvCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdlYzJiNWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlIDxpby5oPgotI2Vsc2UKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPGZjbnRsLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotCi0jaWZkZWYgX1dJTjMyCi0vLyBXaW4zMiBsc2VlayBpcyBicm9rZW46ICBJZiBpbnZva2VkIG9uIGEgbm9uLXNlZWthYmxlIGZpbGUgZGVzY3JpcHRvciwgaXRzCi0vLyByZXR1cm4gdmFsdWUgaXMgdW5kZWZpbmVkLiAgV2UgcmUtZGVmaW5lIGl0IHRvIGFsd2F5cyBwcm9kdWNlIGFuIGVycm9yLgotI2RlZmluZSBsc2VlayhmZCwgb2Zmc2V0LCBvcmlnaW4pICgob2ZmX3QpLTEpCi0jZW5kaWYKLQotbmFtZXNwYWNlIHsKLQotLy8gRUlOVFIgc3Vja3MuCi1pbnQgY2xvc2Vfbm9fZWludHIoaW50IGZkKSB7Ci0gIGludCByZXN1bHQ7Ci0gIGRvIHsKLSAgICByZXN1bHQgPSBjbG9zZShmZCk7Ci0gIH0gd2hpbGUgKHJlc3VsdCA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUZpbGVJbnB1dFN0cmVhbTo6RmlsZUlucHV0U3RyZWFtKGludCBmaWxlX2Rlc2NyaXB0b3IsIGludCBibG9ja19zaXplKQotICA6IGNvcHlpbmdfaW5wdXRfKGZpbGVfZGVzY3JpcHRvciksCi0gICAgaW1wbF8oJmNvcHlpbmdfaW5wdXRfLCBibG9ja19zaXplKSB7Ci19Ci0KLUZpbGVJbnB1dFN0cmVhbTo6fkZpbGVJbnB1dFN0cmVhbSgpIHt9Ci0KLWJvb2wgRmlsZUlucHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgcmV0dXJuIGNvcHlpbmdfaW5wdXRfLkNsb3NlKCk7Ci19Ci0KLWJvb2wgRmlsZUlucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgcmV0dXJuIGltcGxfLk5leHQoZGF0YSwgc2l6ZSk7Ci19Ci0KLXZvaWQgRmlsZUlucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7Ci0gIGltcGxfLkJhY2tVcChjb3VudCk7Ci19Ci0KLWJvb2wgRmlsZUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgewotICByZXR1cm4gaW1wbF8uU2tpcChjb3VudCk7Ci19Ci0KLWludDY0IEZpbGVJbnB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbF8uQnl0ZUNvdW50KCk7Ci19Ci0KLUZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbSgKLSAgICBpbnQgZmlsZV9kZXNjcmlwdG9yKQotICA6IGZpbGVfKGZpbGVfZGVzY3JpcHRvciksCi0gICAgY2xvc2Vfb25fZGVsZXRlXyhmYWxzZSksCi0gICAgaXNfY2xvc2VkXyhmYWxzZSksCi0gICAgZXJybm9fKDApLAotICAgIHByZXZpb3VzX3NlZWtfZmFpbGVkXyhmYWxzZSkgewotfQotCi1GaWxlSW5wdXRTdHJlYW06OkNvcHlpbmdGaWxlSW5wdXRTdHJlYW06On5Db3B5aW5nRmlsZUlucHV0U3RyZWFtKCkgewotICBpZiAoY2xvc2Vfb25fZGVsZXRlXykgewotICAgIGlmICghQ2xvc2UoKSkgewotICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgImNsb3NlKCkgZmFpbGVkOiAiIDw8IHN0cmVycm9yKGVycm5vXyk7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgRmlsZUlucHV0U3RyZWFtOjpDb3B5aW5nRmlsZUlucHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgR09PR0xFX0NIRUNLKCFpc19jbG9zZWRfKTsKLQotICBpc19jbG9zZWRfID0gdHJ1ZTsKLSAgaWYgKGNsb3NlX25vX2VpbnRyKGZpbGVfKSAhPSAwKSB7Ci0gICAgLy8gVGhlIGRvY3Mgb24gY2xvc2UoKSBkbyBub3Qgc3BlY2lmeSB3aGV0aGVyIGEgZmlsZSBkZXNjcmlwdG9yIGlzIHN0aWxsCi0gICAgLy8gb3BlbiBhZnRlciBjbG9zZSgpIGZhaWxzIHdpdGggRUlPLiAgSG93ZXZlciwgdGhlIGdsaWJjIHNvdXJjZSBjb2RlCi0gICAgLy8gc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBub3QuCi0gICAgZXJybm9fID0gZXJybm87Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWludCBGaWxlSW5wdXRTdHJlYW06OkNvcHlpbmdGaWxlSW5wdXRTdHJlYW06OlJlYWQodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgewotICBHT09HTEVfQ0hFQ0soIWlzX2Nsb3NlZF8pOwotCi0gIGludCByZXN1bHQ7Ci0gIGRvIHsKLSAgICByZXN1bHQgPSByZWFkKGZpbGVfLCBidWZmZXIsIHNpemUpOwotICB9IHdoaWxlIChyZXN1bHQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKLQotICBpZiAocmVzdWx0IDwgMCkgewotICAgIC8vIFJlYWQgZXJyb3IgKG5vdCBFT0YpLgotICAgIGVycm5vXyA9IGVycm5vOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotaW50IEZpbGVJbnB1dFN0cmVhbTo6Q29weWluZ0ZpbGVJbnB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKLSAgR09PR0xFX0NIRUNLKCFpc19jbG9zZWRfKTsKLQotICBpZiAoIXByZXZpb3VzX3NlZWtfZmFpbGVkXyAmJgotICAgICAgbHNlZWsoZmlsZV8sIGNvdW50LCBTRUVLX0NVUikgIT0gKG9mZl90KS0xKSB7Ci0gICAgLy8gU2VlayBzdWNjZWVkZWQuCi0gICAgcmV0dXJuIGNvdW50OwotICB9IGVsc2UgewotICAgIC8vIEZhaWxlZCB0byBzZWVrLgotCi0gICAgLy8gTm90ZSB0byBzZWxmOiAgRG9uJ3Qgc2VlayBhZ2Fpbi4gIFRoaXMgZmlsZSBkZXNjcmlwdG9yIGRvZXNuJ3QKLSAgICAvLyBzdXBwb3J0IGl0LgotICAgIHByZXZpb3VzX3NlZWtfZmFpbGVkXyA9IHRydWU7Ci0KLSAgICAvLyBVc2UgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24uCi0gICAgcmV0dXJuIENvcHlpbmdJbnB1dFN0cmVhbTo6U2tpcChjb3VudCk7Ci0gIH0KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1GaWxlT3V0cHV0U3RyZWFtOjpGaWxlT3V0cHV0U3RyZWFtKGludCBmaWxlX2Rlc2NyaXB0b3IsIGludCBibG9ja19zaXplKQotICA6IGNvcHlpbmdfb3V0cHV0XyhmaWxlX2Rlc2NyaXB0b3IpLAotICAgIGltcGxfKCZjb3B5aW5nX291dHB1dF8sIGJsb2NrX3NpemUpIHsKLX0KLQotRmlsZU91dHB1dFN0cmVhbTo6fkZpbGVPdXRwdXRTdHJlYW0oKSB7Ci0gIGltcGxfLkZsdXNoKCk7Ci19Ci0KLWJvb2wgRmlsZU91dHB1dFN0cmVhbTo6Q2xvc2UoKSB7Ci0gIGJvb2wgZmx1c2hfc3VjY2VlZGVkID0gaW1wbF8uRmx1c2goKTsKLSAgcmV0dXJuIGNvcHlpbmdfb3V0cHV0Xy5DbG9zZSgpICYmIGZsdXNoX3N1Y2NlZWRlZDsKLX0KLQotYm9vbCBGaWxlT3V0cHV0U3RyZWFtOjpGbHVzaCgpIHsKLSAgcmV0dXJuIGltcGxfLkZsdXNoKCk7Ci19Ci0KLWJvb2wgRmlsZU91dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7Ci0gIHJldHVybiBpbXBsXy5OZXh0KGRhdGEsIHNpemUpOwotfQotCi12b2lkIEZpbGVPdXRwdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKLSAgaW1wbF8uQmFja1VwKGNvdW50KTsKLX0KLQotaW50NjQgRmlsZU91dHB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbF8uQnl0ZUNvdW50KCk7Ci19Ci0KLUZpbGVPdXRwdXRTdHJlYW06OkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtOjpDb3B5aW5nRmlsZU91dHB1dFN0cmVhbSgKLSAgICBpbnQgZmlsZV9kZXNjcmlwdG9yKQotICA6IGZpbGVfKGZpbGVfZGVzY3JpcHRvciksCi0gICAgY2xvc2Vfb25fZGVsZXRlXyhmYWxzZSksCi0gICAgaXNfY2xvc2VkXyhmYWxzZSksCi0gICAgZXJybm9fKDApIHsKLX0KLQotRmlsZU91dHB1dFN0cmVhbTo6Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW06On5Db3B5aW5nRmlsZU91dHB1dFN0cmVhbSgpIHsKLSAgaWYgKGNsb3NlX29uX2RlbGV0ZV8pIHsKLSAgICBpZiAoIUNsb3NlKCkpIHsKLSAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJjbG9zZSgpIGZhaWxlZDogIiA8PCBzdHJlcnJvcihlcnJub18pOwotICAgIH0KLSAgfQotfQotCi1ib29sIEZpbGVPdXRwdXRTdHJlYW06OkNvcHlpbmdGaWxlT3V0cHV0U3RyZWFtOjpDbG9zZSgpIHsKLSAgR09PR0xFX0NIRUNLKCFpc19jbG9zZWRfKTsKLQotICBpc19jbG9zZWRfID0gdHJ1ZTsKLSAgaWYgKGNsb3NlX25vX2VpbnRyKGZpbGVfKSAhPSAwKSB7Ci0gICAgLy8gVGhlIGRvY3Mgb24gY2xvc2UoKSBkbyBub3Qgc3BlY2lmeSB3aGV0aGVyIGEgZmlsZSBkZXNjcmlwdG9yIGlzIHN0aWxsCi0gICAgLy8gb3BlbiBhZnRlciBjbG9zZSgpIGZhaWxzIHdpdGggRUlPLiAgSG93ZXZlciwgdGhlIGdsaWJjIHNvdXJjZSBjb2RlCi0gICAgLy8gc2VlbXMgdG8gaW5kaWNhdGUgdGhhdCBpdCBpcyBub3QuCi0gICAgZXJybm9fID0gZXJybm87Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgRmlsZU91dHB1dFN0cmVhbTo6Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW06OldyaXRlKAotICAgIGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKLSAgR09PR0xFX0NIRUNLKCFpc19jbG9zZWRfKTsKLSAgaW50IHRvdGFsX3dyaXR0ZW4gPSAwOwotCi0gIGNvbnN0IHVpbnQ4KiBidWZmZXJfYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihidWZmZXIpOwotCi0gIHdoaWxlICh0b3RhbF93cml0dGVuIDwgc2l6ZSkgewotICAgIGludCBieXRlczsKLSAgICBkbyB7Ci0gICAgICBieXRlcyA9IHdyaXRlKGZpbGVfLCBidWZmZXJfYmFzZSArIHRvdGFsX3dyaXR0ZW4sIHNpemUgLSB0b3RhbF93cml0dGVuKTsKLSAgICB9IHdoaWxlIChieXRlcyA8IDAgJiYgZXJybm8gPT0gRUlOVFIpOwotCi0gICAgaWYgKGJ5dGVzIDw9IDApIHsKLSAgICAgIC8vIFdyaXRlIGVycm9yLgotCi0gICAgICAvLyBGSVhNRShrZW50b24pOiAgQWNjb3JkaW5nIHRvIHRoZSBtYW4gcGFnZSwgaWYgd3JpdGUoKSByZXR1cm5zIHplcm8sCi0gICAgICAvLyAgIHRoZXJlIHdhcyBubyBlcnJvcjsgd3JpdGUoKSBzaW1wbHkgZGlkIG5vdCB3cml0ZSBhbnl0aGluZy4gIEl0J3MKLSAgICAgIC8vICAgdW5jbGVhciB1bmRlciB3aGF0IGNpcmN1bXN0YW5jZXMgdGhpcyBtaWdodCBoYXBwZW4sIGJ1dCBwcmVzdW1hYmx5Ci0gICAgICAvLyAgIGVycm5vIHdvbid0IGJlIHNldCBpbiB0aGlzIGNhc2UuICBJIGFtIGNvbmZ1c2VkIGFzIHRvIGhvdyBzdWNoIGFuCi0gICAgICAvLyAgIGV2ZW50IHNob3VsZCBiZSBoYW5kbGVkLiAgRm9yIG5vdyBJJ20gdHJlYXRpbmcgaXQgYXMgYW4gZXJyb3IsIHNpbmNlCi0gICAgICAvLyAgIHJldHJ5aW5nIHNlZW1zIGxpa2UgaXQgY291bGQgbGVhZCB0byBhbiBpbmZpbml0ZSBsb29wLiAgSSBzdXNwZWN0Ci0gICAgICAvLyAgIHRoaXMgbmV2ZXIgYWN0dWFsbHkgaGFwcGVucyBhbnl3YXkuCi0KLSAgICAgIGlmIChieXRlcyA8IDApIHsKLSAgICAgICAgZXJybm9fID0gZXJybm87Ci0gICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHRvdGFsX3dyaXR0ZW4gKz0gYnl0ZXM7Ci0gIH0KLQotICByZXR1cm4gdHJ1ZTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Jc3RyZWFtSW5wdXRTdHJlYW06OklzdHJlYW1JbnB1dFN0cmVhbShpc3RyZWFtKiBpbnB1dCwgaW50IGJsb2NrX3NpemUpCi0gIDogY29weWluZ19pbnB1dF8oaW5wdXQpLAotICAgIGltcGxfKCZjb3B5aW5nX2lucHV0XywgYmxvY2tfc2l6ZSkgewotfQotCi1Jc3RyZWFtSW5wdXRTdHJlYW06On5Jc3RyZWFtSW5wdXRTdHJlYW0oKSB7fQotCi1ib29sIElzdHJlYW1JbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7Ci0gIHJldHVybiBpbXBsXy5OZXh0KGRhdGEsIHNpemUpOwotfQotCi12b2lkIElzdHJlYW1JbnB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgewotICBpbXBsXy5CYWNrVXAoY291bnQpOwotfQotCi1ib29sIElzdHJlYW1JbnB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKLSAgcmV0dXJuIGltcGxfLlNraXAoY291bnQpOwotfQotCi1pbnQ2NCBJc3RyZWFtSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGltcGxfLkJ5dGVDb3VudCgpOwotfQotCi1Jc3RyZWFtSW5wdXRTdHJlYW06OkNvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW06OkNvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW0oCi0gICAgaXN0cmVhbSogaW5wdXQpCi0gIDogaW5wdXRfKGlucHV0KSB7Ci19Ci0KLUlzdHJlYW1JbnB1dFN0cmVhbTo6Q29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbTo6fkNvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW0oKSB7fQotCi1pbnQgSXN0cmVhbUlucHV0U3RyZWFtOjpDb3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtOjpSZWFkKAotICAgIHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpIHsKLSAgaW5wdXRfLT5yZWFkKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGJ1ZmZlciksIHNpemUpOwotICBpbnQgcmVzdWx0ID0gaW5wdXRfLT5nY291bnQoKTsKLSAgaWYgKHJlc3VsdCA9PSAwICYmIGlucHV0Xy0+ZmFpbCgpICYmICFpbnB1dF8tPmVvZigpKSB7Ci0gICAgcmV0dXJuIC0xOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotT3N0cmVhbU91dHB1dFN0cmVhbTo6T3N0cmVhbU91dHB1dFN0cmVhbShvc3RyZWFtKiBvdXRwdXQsIGludCBibG9ja19zaXplKQotICA6IGNvcHlpbmdfb3V0cHV0XyhvdXRwdXQpLAotICAgIGltcGxfKCZjb3B5aW5nX291dHB1dF8sIGJsb2NrX3NpemUpIHsKLX0KLQotT3N0cmVhbU91dHB1dFN0cmVhbTo6fk9zdHJlYW1PdXRwdXRTdHJlYW0oKSB7Ci0gIGltcGxfLkZsdXNoKCk7Ci19Ci0KLWJvb2wgT3N0cmVhbU91dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7Ci0gIHJldHVybiBpbXBsXy5OZXh0KGRhdGEsIHNpemUpOwotfQotCi12b2lkIE9zdHJlYW1PdXRwdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKLSAgaW1wbF8uQmFja1VwKGNvdW50KTsKLX0KLQotaW50NjQgT3N0cmVhbU91dHB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgewotICByZXR1cm4gaW1wbF8uQnl0ZUNvdW50KCk7Ci19Ci0KLU9zdHJlYW1PdXRwdXRTdHJlYW06OkNvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtOjpDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSgKLSAgICBvc3RyZWFtKiBvdXRwdXQpCi0gIDogb3V0cHV0XyhvdXRwdXQpIHsKLX0KLQotT3N0cmVhbU91dHB1dFN0cmVhbTo6Q29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW06On5Db3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSgpIHsKLX0KLQotYm9vbCBPc3RyZWFtT3V0cHV0U3RyZWFtOjpDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbTo6V3JpdGUoCi0gICAgY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgewotICBvdXRwdXRfLT53cml0ZShyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPihidWZmZXIpLCBzaXplKTsKLSAgcmV0dXJuIG91dHB1dF8tPmdvb2QoKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db25jYXRlbmF0aW5nSW5wdXRTdHJlYW06OkNvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSgKLSAgICBaZXJvQ29weUlucHV0U3RyZWFtKiBjb25zdCBzdHJlYW1zW10sIGludCBjb3VudCkKLSAgOiBzdHJlYW1zXyhzdHJlYW1zKSwgc3RyZWFtX2NvdW50Xyhjb3VudCksIGJ5dGVzX3JldGlyZWRfKDApIHsKLX0KLQotQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjp+Q29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKCkgewotfQotCi1ib29sIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7Ci0gIHdoaWxlIChzdHJlYW1fY291bnRfID4gMCkgewotICAgIGlmIChzdHJlYW1zX1swXS0+TmV4dChkYXRhLCBzaXplKSkgcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBUaGF0IHN0cmVhbSBpcyBkb25lLiAgQWR2YW5jZSB0byB0aGUgbmV4dCBvbmUuCi0gICAgYnl0ZXNfcmV0aXJlZF8gKz0gc3RyZWFtc19bMF0tPkJ5dGVDb3VudCgpOwotICAgICsrc3RyZWFtc187Ci0gICAgLS1zdHJlYW1fY291bnRfOwotICB9Ci0KLSAgLy8gTm8gbW9yZSBzdHJlYW1zLgotICByZXR1cm4gZmFsc2U7Ci19Ci0KLXZvaWQgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7Ci0gIGlmIChzdHJlYW1fY291bnRfID4gMCkgewotICAgIHN0cmVhbXNfWzBdLT5CYWNrVXAoY291bnQpOwotICB9IGVsc2UgewotICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiQ2FuJ3QgQmFja1VwKCkgYWZ0ZXIgZmFpbGVkIE5leHQoKS4iOwotICB9Ci19Ci0KLWJvb2wgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgewotICB3aGlsZSAoc3RyZWFtX2NvdW50XyA+IDApIHsKLSAgICAvLyBBc3N1bWUgdGhhdCBCeXRlQ291bnQoKSBjYW4gYmUgdXNlZCB0byBmaW5kIG91dCBob3cgbXVjaCB3ZSBhY3R1YWxseQotICAgIC8vIHNraXBwZWQgd2hlbiBTa2lwKCkgZmFpbHMuCi0gICAgaW50NjQgdGFyZ2V0X2J5dGVfY291bnQgPSBzdHJlYW1zX1swXS0+Qnl0ZUNvdW50KCkgKyBjb3VudDsKLSAgICBpZiAoc3RyZWFtc19bMF0tPlNraXAoY291bnQpKSByZXR1cm4gdHJ1ZTsKLQotICAgIC8vIEhpdCB0aGUgZW5kIG9mIHRoZSBzdHJlYW0uICBGaWd1cmUgb3V0IGhvdyBtYW55IG1vcmUgYnl0ZXMgd2Ugc3RpbGwgaGF2ZQotICAgIC8vIHRvIHNraXAuCi0gICAgaW50NjQgZmluYWxfYnl0ZV9jb3VudCA9IHN0cmVhbXNfWzBdLT5CeXRlQ291bnQoKTsKLSAgICBHT09HTEVfRENIRUNLX0xUKGZpbmFsX2J5dGVfY291bnQsIHRhcmdldF9ieXRlX2NvdW50KTsKLSAgICBjb3VudCA9IHRhcmdldF9ieXRlX2NvdW50IC0gZmluYWxfYnl0ZV9jb3VudDsKLQotICAgIC8vIFRoYXQgc3RyZWFtIGlzIGRvbmUuICBBZHZhbmNlIHRvIHRoZSBuZXh0IG9uZS4KLSAgICBieXRlc19yZXRpcmVkXyArPSBmaW5hbF9ieXRlX2NvdW50OwotICAgICsrc3RyZWFtc187Ci0gICAgLS1zdHJlYW1fY291bnRfOwotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1pbnQ2NCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgaWYgKHN0cmVhbV9jb3VudF8gPT0gMCkgewotICAgIHJldHVybiBieXRlc19yZXRpcmVkXzsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gYnl0ZXNfcmV0aXJlZF8gKyBzdHJlYW1zX1swXS0+Qnl0ZUNvdW50KCk7Ci0gIH0KLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUxpbWl0aW5nSW5wdXRTdHJlYW06OkxpbWl0aW5nSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDY0IGxpbWl0KQotICA6IGlucHV0XyhpbnB1dCksIGxpbWl0XyhsaW1pdCkgewotICBwcmlvcl9ieXRlc19yZWFkXyA9IGlucHV0Xy0+Qnl0ZUNvdW50KCk7Ci19Ci0KLUxpbWl0aW5nSW5wdXRTdHJlYW06On5MaW1pdGluZ0lucHV0U3RyZWFtKCkgewotICAvLyBJZiB3ZSBvdmVyc2hvdCB0aGUgbGltaXQsIGJhY2sgdXAuCi0gIGlmIChsaW1pdF8gPCAwKSBpbnB1dF8tPkJhY2tVcCgtbGltaXRfKTsKLX0KLQotYm9vbCBMaW1pdGluZ0lucHV0U3RyZWFtOjpOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgaWYgKGxpbWl0XyA8PSAwKSByZXR1cm4gZmFsc2U7Ci0gIGlmICghaW5wdXRfLT5OZXh0KGRhdGEsIHNpemUpKSByZXR1cm4gZmFsc2U7Ci0KLSAgbGltaXRfIC09ICpzaXplOwotICBpZiAobGltaXRfIDwgMCkgewotICAgIC8vIFdlIG92ZXJzaG90IHRoZSBsaW1pdC4gIFJlZHVjZSAqc2l6ZSB0byBoaWRlIHRoZSByZXN0IG9mIHRoZSBidWZmZXIuCi0gICAgKnNpemUgKz0gbGltaXRfOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIExpbWl0aW5nSW5wdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKLSAgaWYgKGxpbWl0XyA8IDApIHsKLSAgICBpbnB1dF8tPkJhY2tVcChjb3VudCAtIGxpbWl0Xyk7Ci0gICAgbGltaXRfID0gY291bnQ7Ci0gIH0gZWxzZSB7Ci0gICAgaW5wdXRfLT5CYWNrVXAoY291bnQpOwotICAgIGxpbWl0XyArPSBjb3VudDsKLSAgfQotfQotCi1ib29sIExpbWl0aW5nSW5wdXRTdHJlYW06OlNraXAoaW50IGNvdW50KSB7Ci0gIGlmIChjb3VudCA+IGxpbWl0XykgewotICAgIGlmIChsaW1pdF8gPCAwKSByZXR1cm4gZmFsc2U7Ci0gICAgaW5wdXRfLT5Ta2lwKGxpbWl0Xyk7Ci0gICAgbGltaXRfID0gMDsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKCFpbnB1dF8tPlNraXAoY291bnQpKSByZXR1cm4gZmFsc2U7Ci0gICAgbGltaXRfIC09IGNvdW50OwotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLWludDY0IExpbWl0aW5nSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgaWYgKGxpbWl0XyA8IDApIHsKLSAgICByZXR1cm4gaW5wdXRfLT5CeXRlQ291bnQoKSArIGxpbWl0XyAtIHByaW9yX2J5dGVzX3JlYWRfOwotICB9IGVsc2UgewotICAgIHJldHVybiBpbnB1dF8tPkJ5dGVDb3VudCgpIC0gcHJpb3JfYnl0ZXNfcmVhZF87Ci0gIH0KLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDc0NmZhNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMzU4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlcyBkZWZpbmVkIGluCi0vLyB6ZXJvX2NvcHlfc3RyZWFtLmggd2hpY2ggYXJlIG9ubHkgaW5jbHVkZWQgaW4gdGhlIGZ1bGwgKG5vbi1saXRlKQotLy8gcHJvdG9idWYgbGlicmFyeS4gIFRoZXNlIGltcGxlbWVudGF0aW9ucyBpbmNsdWRlIFVuaXggZmlsZSBkZXNjcmlwdG9ycwotLy8gYW5kIEMrKyBpb3N0cmVhbXMuICBTZWUgYWxzbzogIHplcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fWkVST19DT1BZX1NUUkVBTV9JTVBMX0hfXwotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc2Z3ZD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gQSBaZXJvQ29weUlucHV0U3RyZWFtIHdoaWNoIHJlYWRzIGZyb20gYSBmaWxlIGRlc2NyaXB0b3IuCi0vLwotLy8gRmlsZUlucHV0U3RyZWFtIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIGFuIGlmc3RyZWFtIHdpdGggSXN0cmVhbUlucHV0U3RyZWFtLgotLy8gVGhlIGxhdHRlciB3aWxsIGludHJvZHVjZSBhbiBleHRyYSBsYXllciBvZiBidWZmZXJpbmcsIGhhcm1pbmcgcGVyZm9ybWFuY2UuCi0vLyBBbHNvLCBpdCdzIGNvbmNlaXZhYmxlIHRoYXQgRmlsZUlucHV0U3RyZWFtIGNvdWxkIHNvbWVkYXkgYmUgZW5oYW5jZWQKLS8vIHRvIHVzZSB6ZXJvLWNvcHkgZmlsZSBkZXNjcmlwdG9ycyBvbiBPU3Mgd2hpY2ggc3VwcG9ydCB0aGVtLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEZpbGVJbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBVbml4IGZpbGUgZGVzY3JpcHRvci4KLSAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0Ci0gIC8vIHNob3VsZCBiZSByZWFkIGFuZCByZXR1cm5lZCB3aXRoIGVhY2ggY2FsbCB0byBOZXh0KCkuICBPdGhlcndpc2UsCi0gIC8vIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCi0gIGV4cGxpY2l0IEZpbGVJbnB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yLCBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKLSAgfkZpbGVJbnB1dFN0cmVhbSgpOwotCi0gIC8vIEZsdXNoZXMgYW55IGJ1ZmZlcnMgYW5kIGNsb3NlcyB0aGUgdW5kZXJseWluZyBmaWxlLiAgUmV0dXJucyBmYWxzZSBpZgotICAvLyBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBwcm9jZXNzOyB1c2UgR2V0RXJybm8oKSB0byBleGFtaW5lIHRoZSBlcnJvci4KLSAgLy8gRXZlbiBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkIHdoZW4gdGhpcyByZXR1cm5zLgotICBib29sIENsb3NlKCk7Ci0KLSAgLy8gQnkgZGVmYXVsdCwgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHN0cmVhbSBpcwotICAvLyBkZXN0cm95ZWQuICBDYWxsIFNldENsb3NlT25EZWxldGUodHJ1ZSkgdG8gY2hhbmdlIHRoYXQuICBXQVJOSU5HOgotICAvLyBUaGlzIGxlYXZlcyBubyB3YXkgZm9yIHRoZSBjYWxsZXIgdG8gZGV0ZWN0IGlmIGNsb3NlKCkgZmFpbHMuICBJZgotICAvLyBkZXRlY3RpbmcgY2xvc2UoKSBlcnJvcnMgaXMgaW1wb3J0YW50IHRvIHlvdSwgeW91IHNob3VsZCBhcnJhbmdlCi0gIC8vIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIHlvdXJzZWxmLgotICB2b2lkIFNldENsb3NlT25EZWxldGUoYm9vbCB2YWx1ZSkgeyBjb3B5aW5nX2lucHV0Xy5TZXRDbG9zZU9uRGVsZXRlKHZhbHVlKTsgfQotCi0gIC8vIElmIGFuIEkvTyBlcnJvciBoYXMgb2NjdXJyZWQgb24gdGhpcyBmaWxlIGRlc2NyaXB0b3IsIHRoaXMgaXMgdGhlCi0gIC8vIGVycm5vIGZyb20gdGhhdCBlcnJvci4gIE90aGVyd2lzZSwgdGhpcyBpcyB6ZXJvLiAgT25jZSBhbiBlcnJvcgotICAvLyBvY2N1cnMsIHRoZSBzdHJlYW0gaXMgYnJva2VuIGFuZCBhbGwgc3Vic2VxdWVudCBvcGVyYXRpb25zIHdpbGwKLSAgLy8gZmFpbC4KLSAgaW50IEdldEVycm5vKCkgeyByZXR1cm4gY29weWluZ19pbnB1dF8uR2V0RXJybm8oKTsgfQotCi0gIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKLSAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKLSAgYm9vbCBTa2lwKGludCBjb3VudCk7Ci0gIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdGaWxlSW5wdXRTdHJlYW0gOiBwdWJsaWMgQ29weWluZ0lucHV0U3RyZWFtIHsKLSAgIHB1YmxpYzoKLSAgICBDb3B5aW5nRmlsZUlucHV0U3RyZWFtKGludCBmaWxlX2Rlc2NyaXB0b3IpOwotICAgIH5Db3B5aW5nRmlsZUlucHV0U3RyZWFtKCk7Ci0KLSAgICBib29sIENsb3NlKCk7Ci0gICAgdm9pZCBTZXRDbG9zZU9uRGVsZXRlKGJvb2wgdmFsdWUpIHsgY2xvc2Vfb25fZGVsZXRlXyA9IHZhbHVlOyB9Ci0gICAgaW50IEdldEVycm5vKCkgeyByZXR1cm4gZXJybm9fOyB9Ci0KLSAgICAvLyBpbXBsZW1lbnRzIENvcHlpbmdJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpbnQgUmVhZCh2b2lkKiBidWZmZXIsIGludCBzaXplKTsKLSAgICBpbnQgU2tpcChpbnQgY291bnQpOwotCi0gICBwcml2YXRlOgotICAgIC8vIFRoZSBmaWxlIGRlc2NyaXB0b3IuCi0gICAgY29uc3QgaW50IGZpbGVfOwotICAgIGJvb2wgY2xvc2Vfb25fZGVsZXRlXzsKLSAgICBib29sIGlzX2Nsb3NlZF87Ci0KLSAgICAvLyBUaGUgZXJybm8gb2YgdGhlIEkvTyBlcnJvciwgaWYgb25lIGhhcyBvY2N1cnJlZC4gIE90aGVyd2lzZSwgemVyby4KLSAgICBpbnQgZXJybm9fOwotCi0gICAgLy8gRGlkIHdlIHRyeSB0byBzZWVrIG9uY2UgYW5kIGZhaWw/ICBJZiBzbywgd2UgYXNzdW1lIHRoaXMgZmlsZSBkZXNjcmlwdG9yCi0gICAgLy8gZG9lc24ndCBzdXBwb3J0IHNlZWtpbmcgYW5kIHdvbid0IHRyeSBhZ2Fpbi4KLSAgICBib29sIHByZXZpb3VzX3NlZWtfZmFpbGVkXzsKLQotICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb3B5aW5nRmlsZUlucHV0U3RyZWFtKTsKLSAgfTsKLQotICBDb3B5aW5nRmlsZUlucHV0U3RyZWFtIGNvcHlpbmdfaW5wdXRfOwotICBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yIGltcGxfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlSW5wdXRTdHJlYW0pOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlcyB0byBhIGZpbGUgZGVzY3JpcHRvci4KLS8vCi0vLyBGaWxlT3V0cHV0U3RyZWFtIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIGFuIG9mc3RyZWFtIHdpdGgKLS8vIE9zdHJlYW1PdXRwdXRTdHJlYW0uICBUaGUgbGF0dGVyIHdpbGwgaW50cm9kdWNlIGFuIGV4dHJhIGxheWVyIG9mIGJ1ZmZlcmluZywKLS8vIGhhcm1pbmcgcGVyZm9ybWFuY2UuICBBbHNvLCBpdCdzIGNvbmNlaXZhYmxlIHRoYXQgRmlsZU91dHB1dFN0cmVhbSBjb3VsZAotLy8gc29tZWRheSBiZSBlbmhhbmNlZCB0byB1c2UgemVyby1jb3B5IGZpbGUgZGVzY3JpcHRvcnMgb24gT1NzIHdoaWNoCi0vLyBzdXBwb3J0IHRoZW0uCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmlsZU91dHB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBVbml4IGZpbGUgZGVzY3JpcHRvci4KLSAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMKLSAgLy8gdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYnkgTmV4dCgpLiAgT3RoZXJ3aXNlLCBhIHJlYXNvbmFibGUgZGVmYXVsdAotICAvLyBpcyB1c2VkLgotICBleHBsaWNpdCBGaWxlT3V0cHV0U3RyZWFtKGludCBmaWxlX2Rlc2NyaXB0b3IsIGludCBibG9ja19zaXplID0gLTEpOwotICB+RmlsZU91dHB1dFN0cmVhbSgpOwotCi0gIC8vIEZsdXNoZXMgYW55IGJ1ZmZlcnMgYW5kIGNsb3NlcyB0aGUgdW5kZXJseWluZyBmaWxlLiAgUmV0dXJucyBmYWxzZSBpZgotICAvLyBhbiBlcnJvciBvY2N1cnMgZHVyaW5nIHRoZSBwcm9jZXNzOyB1c2UgR2V0RXJybm8oKSB0byBleGFtaW5lIHRoZSBlcnJvci4KLSAgLy8gRXZlbiBpZiBhbiBlcnJvciBvY2N1cnMsIHRoZSBmaWxlIGRlc2NyaXB0b3IgaXMgY2xvc2VkIHdoZW4gdGhpcyByZXR1cm5zLgotICBib29sIENsb3NlKCk7Ci0KLSAgLy8gRmx1c2hlcyBGaWxlT3V0cHV0U3RyZWFtJ3MgYnVmZmVycyBidXQgZG9lcyBub3QgY2xvc2UgdGhlCi0gIC8vIHVuZGVybHlpbmcgZmlsZS4gTm8gc3BlY2lhbCBtZWFzdXJlcyBhcmUgdGFrZW4gdG8gZW5zdXJlIHRoYXQKLSAgLy8gdW5kZXJseWluZyBvcGVyYXRpbmcgc3lzdGVtIGZpbGUgb2JqZWN0IGlzIHN5bmNocm9uaXplZCB0byBkaXNrLgotICBib29sIEZsdXNoKCk7Ci0KLSAgLy8gQnkgZGVmYXVsdCwgdGhlIGZpbGUgZGVzY3JpcHRvciBpcyBub3QgY2xvc2VkIHdoZW4gdGhlIHN0cmVhbSBpcwotICAvLyBkZXN0cm95ZWQuICBDYWxsIFNldENsb3NlT25EZWxldGUodHJ1ZSkgdG8gY2hhbmdlIHRoYXQuICBXQVJOSU5HOgotICAvLyBUaGlzIGxlYXZlcyBubyB3YXkgZm9yIHRoZSBjYWxsZXIgdG8gZGV0ZWN0IGlmIGNsb3NlKCkgZmFpbHMuICBJZgotICAvLyBkZXRlY3RpbmcgY2xvc2UoKSBlcnJvcnMgaXMgaW1wb3J0YW50IHRvIHlvdSwgeW91IHNob3VsZCBhcnJhbmdlCi0gIC8vIHRvIGNsb3NlIHRoZSBkZXNjcmlwdG9yIHlvdXJzZWxmLgotICB2b2lkIFNldENsb3NlT25EZWxldGUoYm9vbCB2YWx1ZSkgeyBjb3B5aW5nX291dHB1dF8uU2V0Q2xvc2VPbkRlbGV0ZSh2YWx1ZSk7IH0KLQotICAvLyBJZiBhbiBJL08gZXJyb3IgaGFzIG9jY3VycmVkIG9uIHRoaXMgZmlsZSBkZXNjcmlwdG9yLCB0aGlzIGlzIHRoZQotICAvLyBlcnJubyBmcm9tIHRoYXQgZXJyb3IuICBPdGhlcndpc2UsIHRoaXMgaXMgemVyby4gIE9uY2UgYW4gZXJyb3IKLSAgLy8gb2NjdXJzLCB0aGUgc3RyZWFtIGlzIGJyb2tlbiBhbmQgYWxsIHN1YnNlcXVlbnQgb3BlcmF0aW9ucyB3aWxsCi0gIC8vIGZhaWwuCi0gIGludCBHZXRFcnJubygpIHsgcmV0dXJuIGNvcHlpbmdfb3V0cHV0Xy5HZXRFcnJubygpOyB9Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwotICB2b2lkIEJhY2tVcChpbnQgY291bnQpOwotICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nRmlsZU91dHB1dFN0cmVhbSA6IHB1YmxpYyBDb3B5aW5nT3V0cHV0U3RyZWFtIHsKLSAgIHB1YmxpYzoKLSAgICBDb3B5aW5nRmlsZU91dHB1dFN0cmVhbShpbnQgZmlsZV9kZXNjcmlwdG9yKTsKLSAgICB+Q29weWluZ0ZpbGVPdXRwdXRTdHJlYW0oKTsKLQotICAgIGJvb2wgQ2xvc2UoKTsKLSAgICB2b2lkIFNldENsb3NlT25EZWxldGUoYm9vbCB2YWx1ZSkgeyBjbG9zZV9vbl9kZWxldGVfID0gdmFsdWU7IH0KLSAgICBpbnQgR2V0RXJybm8oKSB7IHJldHVybiBlcnJub187IH0KLQotICAgIC8vIGltcGxlbWVudHMgQ29weWluZ091dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIGJvb2wgV3JpdGUoY29uc3Qgdm9pZCogYnVmZmVyLCBpbnQgc2l6ZSk7Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gVGhlIGZpbGUgZGVzY3JpcHRvci4KLSAgICBjb25zdCBpbnQgZmlsZV87Ci0gICAgYm9vbCBjbG9zZV9vbl9kZWxldGVfOwotICAgIGJvb2wgaXNfY2xvc2VkXzsKLQotICAgIC8vIFRoZSBlcnJubyBvZiB0aGUgSS9PIGVycm9yLCBpZiBvbmUgaGFzIG9jY3VycmVkLiAgT3RoZXJ3aXNlLCB6ZXJvLgotICAgIGludCBlcnJub187Ci0KLSAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ0ZpbGVPdXRwdXRTdHJlYW0pOwotICB9OwotCi0gIENvcHlpbmdGaWxlT3V0cHV0U3RyZWFtIGNvcHlpbmdfb3V0cHV0XzsKLSAgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgaW1wbF87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVPdXRwdXRTdHJlYW0pOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBhIEMrKyBpc3RyZWFtLgotLy8KLS8vIE5vdGUgdGhhdCBmb3IgcmVhZGluZyBmaWxlcyAob3IgYW55dGhpbmcgcmVwcmVzZW50ZWQgYnkgYSBmaWxlIGRlc2NyaXB0b3IpLAotLy8gRmlsZUlucHV0U3RyZWFtIGlzIG1vcmUgZWZmaWNpZW50LgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIElzdHJlYW1JbnB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBDKysgaXN0cmVhbS4KLSAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0Ci0gIC8vIHNob3VsZCBiZSByZWFkIGFuZCByZXR1cm5lZCB3aXRoIGVhY2ggY2FsbCB0byBOZXh0KCkuICBPdGhlcndpc2UsCi0gIC8vIGEgcmVhc29uYWJsZSBkZWZhdWx0IGlzIHVzZWQuCi0gIGV4cGxpY2l0IElzdHJlYW1JbnB1dFN0cmVhbShpc3RyZWFtKiBzdHJlYW0sIGludCBibG9ja19zaXplID0gLTEpOwotICB+SXN0cmVhbUlucHV0U3RyZWFtKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwotICB2b2lkIEJhY2tVcChpbnQgY291bnQpOwotICBib29sIFNraXAoaW50IGNvdW50KTsKLSAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSA6IHB1YmxpYyBDb3B5aW5nSW5wdXRTdHJlYW0gewotICAgcHVibGljOgotICAgIENvcHlpbmdJc3RyZWFtSW5wdXRTdHJlYW0oaXN0cmVhbSogaW5wdXQpOwotICAgIH5Db3B5aW5nSXN0cmVhbUlucHV0U3RyZWFtKCk7Ci0KLSAgICAvLyBpbXBsZW1lbnRzIENvcHlpbmdJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICBpbnQgUmVhZCh2b2lkKiBidWZmZXIsIGludCBzaXplKTsKLSAgICAvLyAoV2UgdXNlIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIG9mIFNraXAoKS4pCi0KLSAgIHByaXZhdGU6Ci0gICAgLy8gVGhlIHN0cmVhbS4KLSAgICBpc3RyZWFtKiBpbnB1dF87Ci0KLSAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSk7Ci0gIH07Ci0KLSAgQ29weWluZ0lzdHJlYW1JbnB1dFN0cmVhbSBjb3B5aW5nX2lucHV0XzsKLSAgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvciBpbXBsXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSXN0cmVhbUlucHV0U3RyZWFtKTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gQSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCB3cml0ZXMgdG8gYSBDKysgb3N0cmVhbS4KLS8vCi0vLyBOb3RlIHRoYXQgZm9yIHdyaXRpbmcgZmlsZXMgKG9yIGFueXRoaW5nIHJlcHJlc2VudGVkIGJ5IGEgZmlsZSBkZXNjcmlwdG9yKSwKLS8vIEZpbGVPdXRwdXRTdHJlYW0gaXMgbW9yZSBlZmZpY2llbnQuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgT3N0cmVhbU91dHB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGVzIGEgc3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBDKysgb3N0cmVhbS4KLSAgLy8gSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBpdCBzcGVjaWZpZXMgdGhlIHNpemUgb2YgdGhlIGJ1ZmZlcnMKLSAgLy8gdGhhdCBzaG91bGQgYmUgcmV0dXJuZWQgYnkgTmV4dCgpLiAgT3RoZXJ3aXNlLCBhIHJlYXNvbmFibGUgZGVmYXVsdAotICAvLyBpcyB1c2VkLgotICBleHBsaWNpdCBPc3RyZWFtT3V0cHV0U3RyZWFtKG9zdHJlYW0qIHN0cmVhbSwgaW50IGJsb2NrX3NpemUgPSAtMSk7Ci0gIH5Pc3RyZWFtT3V0cHV0U3RyZWFtKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwotICB2b2lkIEJhY2tVcChpbnQgY291bnQpOwotICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSA6IHB1YmxpYyBDb3B5aW5nT3V0cHV0U3RyZWFtIHsKLSAgIHB1YmxpYzoKLSAgICBDb3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbShvc3RyZWFtKiBvdXRwdXQpOwotICAgIH5Db3B5aW5nT3N0cmVhbU91dHB1dFN0cmVhbSgpOwotCi0gICAgLy8gaW1wbGVtZW50cyBDb3B5aW5nT3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgYm9vbCBXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplKTsKLQotICAgcHJpdmF0ZToKLSAgICAvLyBUaGUgc3RyZWFtLgotICAgIG9zdHJlYW0qIG91dHB1dF87Ci0KLSAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQ29weWluZ09zdHJlYW1PdXRwdXRTdHJlYW0pOwotICB9OwotCi0gIENvcHlpbmdPc3RyZWFtT3V0cHV0U3RyZWFtIGNvcHlpbmdfb3V0cHV0XzsKLSAgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgaW1wbF87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE9zdHJlYW1PdXRwdXRTdHJlYW0pOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBBIFplcm9Db3B5SW5wdXRTdHJlYW0gd2hpY2ggcmVhZHMgZnJvbSBzZXZlcmFsIG90aGVyIHN0cmVhbXMgaW4gc2VxdWVuY2UuCi0vLyBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaXMgdW5hYmxlIHRvIGRpc3Rpbmd1aXNoIGJldHdlZW4gZW5kLW9mLXN0cmVhbQotLy8gYW5kIHJlYWQgZXJyb3JzIGluIHRoZSB1bmRlcmx5aW5nIHN0cmVhbXMsIHNvIGl0IGFzc3VtZXMgYW55IGVycm9ycyBtZWFuCi0vLyBlbmQtb2Ytc3RyZWFtLiAgU28sIGlmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbXMgZmFpbCBmb3IgYW55IG90aGVyIHJlYXNvbiwKLS8vIENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSBtYXkgZG8gb2RkIHRoaW5ncy4gIEl0IGlzIHN1Z2dlc3RlZCB0aGF0IHlvdSBkbwotLy8gbm90IHVzZSBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gb24gc3RyZWFtcyB0aGF0IG1pZ2h0IHByb2R1Y2UgcmVhZCBlcnJvcnMKLS8vIG90aGVyIHRoYW4gZW5kLW9mLXN0cmVhbS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBBbGwgc3RyZWFtcyBwYXNzZWQgaW4gYXMgd2VsbCBhcyB0aGUgYXJyYXkgaXRzZWxmIG11c3QgcmVtYWluIHZhbGlkCi0gIC8vIHVudGlsIHRoZSBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaXMgZGVzdHJveWVkLgotICBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogY29uc3Qgc3RyZWFtc1tdLCBpbnQgY291bnQpOwotICB+Q29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwotICB2b2lkIEJhY2tVcChpbnQgY291bnQpOwotICBib29sIFNraXAoaW50IGNvdW50KTsKLSAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7Ci0KLQotIHByaXZhdGU6Ci0gIC8vIEFzIHN0cmVhbXMgYXJlIHJldGlyZWQsIHN0cmVhbXNfIGlzIGluY3JlbWVudGVkIGFuZCBjb3VudF8gaXMKLSAgLy8gZGVjcmVtZW50ZWQuCi0gIFplcm9Db3B5SW5wdXRTdHJlYW0qIGNvbnN0KiBzdHJlYW1zXzsKLSAgaW50IHN0cmVhbV9jb3VudF87Ci0gIGludDY0IGJ5dGVzX3JldGlyZWRfOyAgLy8gQnl0ZXMgcmVhZCBmcm9tIHByZXZpb3VzIHN0cmVhbXMuCi0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKENvbmNhdGVuYXRpbmdJbnB1dFN0cmVhbSk7Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSB3aGljaCB3cmFwcyBzb21lIG90aGVyIHN0cmVhbSBhbmQgbGltaXRzIGl0IHRvCi0vLyBhIHBhcnRpY3VsYXIgYnl0ZSBjb3VudC4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBMaW1pdGluZ0lucHV0U3RyZWFtIDogcHVibGljIFplcm9Db3B5SW5wdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgTGltaXRpbmdJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgaW50NjQgbGltaXQpOwotICB+TGltaXRpbmdJbnB1dFN0cmVhbSgpOwotCi0gIC8vIGltcGxlbWVudHMgWmVyb0NvcHlJbnB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIGJvb2wgTmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKLSAgdm9pZCBCYWNrVXAoaW50IGNvdW50KTsKLSAgYm9vbCBTa2lwKGludCBjb3VudCk7Ci0gIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OwotCi0KLSBwcml2YXRlOgotICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87Ci0gIGludDY0IGxpbWl0XzsgIC8vIERlY3JlYXNlcyBhcyB3ZSBnbywgYmVjb21lcyBuZWdhdGl2ZSBpZiB3ZSBvdmVyc2hvb3QuCi0gIGludDY0IHByaW9yX2J5dGVzX3JlYWRfOyAgLy8gQnl0ZXMgcmVhZCBvbiB1bmRlcmx5aW5nIHN0cmVhbSBhdCBjb25zdHJ1Y3Rpb24KLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTGltaXRpbmdJbnB1dFN0cmVhbSk7Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNmNhODhjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jaW5jbHVkZSA8bGltaXRzPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbyB7Ci0KLW5hbWVzcGFjZSB7Ci0KLS8vIERlZmF1bHQgYmxvY2sgc2l6ZSBmb3IgQ29weWluZ3tJbixPdXR9cHV0U3RyZWFtQWRhcHRvci4KLXN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRCbG9ja1NpemUgPSA4MTkyOwotCi19ICAvLyBuYW1lc3BhY2UKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1BcnJheUlucHV0U3RyZWFtOjpBcnJheUlucHV0U3RyZWFtKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYmxvY2tfc2l6ZSkKLSAgOiBkYXRhXyhyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZGF0YSkpLAotICAgIHNpemVfKHNpemUpLAotICAgIGJsb2NrX3NpemVfKGJsb2NrX3NpemUgPiAwID8gYmxvY2tfc2l6ZSA6IHNpemUpLAotICAgIHBvc2l0aW9uXygwKSwKLSAgICBsYXN0X3JldHVybmVkX3NpemVfKDApIHsKLX0KLQotQXJyYXlJbnB1dFN0cmVhbTo6fkFycmF5SW5wdXRTdHJlYW0oKSB7Ci19Ci0KLWJvb2wgQXJyYXlJbnB1dFN0cmVhbTo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7Ci0gIGlmIChwb3NpdGlvbl8gPCBzaXplXykgewotICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSBzdGQ6Om1pbihibG9ja19zaXplXywgc2l6ZV8gLSBwb3NpdGlvbl8pOwotICAgICpkYXRhID0gZGF0YV8gKyBwb3NpdGlvbl87Ci0gICAgKnNpemUgPSBsYXN0X3JldHVybmVkX3NpemVfOwotICAgIHBvc2l0aW9uXyArPSBsYXN0X3JldHVybmVkX3NpemVfOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIC8vIFdlJ3JlIGF0IHRoZSBlbmQgb2YgdGhlIGFycmF5LgotICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSAwOyAgIC8vIERvbid0IGxldCBjYWxsZXIgYmFjayB1cC4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLX0KLQotdm9pZCBBcnJheUlucHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7Ci0gIEdPT0dMRV9DSEVDS19HVChsYXN0X3JldHVybmVkX3NpemVfLCAwKQotICAgICAgPDwgIkJhY2tVcCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgTmV4dCgpLiI7Ci0gIEdPT0dMRV9DSEVDS19MRShjb3VudCwgbGFzdF9yZXR1cm5lZF9zaXplXyk7Ci0gIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7Ci0gIHBvc2l0aW9uXyAtPSBjb3VudDsKLSAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAvLyBEb24ndCBsZXQgY2FsbGVyIGJhY2sgdXAgZnVydGhlci4KLX0KLQotYm9vbCBBcnJheUlucHV0U3RyZWFtOjpTa2lwKGludCBjb3VudCkgewotICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOwotICBsYXN0X3JldHVybmVkX3NpemVfID0gMDsgICAvLyBEb24ndCBsZXQgY2FsbGVyIGJhY2sgdXAuCi0gIGlmIChjb3VudCA+IHNpemVfIC0gcG9zaXRpb25fKSB7Ci0gICAgcG9zaXRpb25fID0gc2l6ZV87Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIHBvc2l0aW9uXyArPSBjb3VudDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotfQotCi1pbnQ2NCBBcnJheUlucHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBwb3NpdGlvbl87Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1BcnJheU91dHB1dFN0cmVhbTo6QXJyYXlPdXRwdXRTdHJlYW0odm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplKQotICA6IGRhdGFfKHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihkYXRhKSksCi0gICAgc2l6ZV8oc2l6ZSksCi0gICAgYmxvY2tfc2l6ZV8oYmxvY2tfc2l6ZSA+IDAgPyBibG9ja19zaXplIDogc2l6ZSksCi0gICAgcG9zaXRpb25fKDApLAotICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8oMCkgewotfQotCi1BcnJheU91dHB1dFN0cmVhbTo6fkFycmF5T3V0cHV0U3RyZWFtKCkgewotfQotCi1ib29sIEFycmF5T3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgaWYgKHBvc2l0aW9uXyA8IHNpemVfKSB7Ci0gICAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IHN0ZDo6bWluKGJsb2NrX3NpemVfLCBzaXplXyAtIHBvc2l0aW9uXyk7Ci0gICAgKmRhdGEgPSBkYXRhXyArIHBvc2l0aW9uXzsKLSAgICAqc2l6ZSA9IGxhc3RfcmV0dXJuZWRfc2l6ZV87Ci0gICAgcG9zaXRpb25fICs9IGxhc3RfcmV0dXJuZWRfc2l6ZV87Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gV2UncmUgYXQgdGhlIGVuZCBvZiB0aGUgYXJyYXkuCi0gICAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAgLy8gRG9uJ3QgbGV0IGNhbGxlciBiYWNrIHVwLgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi12b2lkIEFycmF5T3V0cHV0U3RyZWFtOjpCYWNrVXAoaW50IGNvdW50KSB7Ci0gIEdPT0dMRV9DSEVDS19HVChsYXN0X3JldHVybmVkX3NpemVfLCAwKQotICAgICAgPDwgIkJhY2tVcCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBhIHN1Y2Nlc3NmdWwgTmV4dCgpLiI7Ci0gIEdPT0dMRV9DSEVDS19MRShjb3VudCwgbGFzdF9yZXR1cm5lZF9zaXplXyk7Ci0gIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7Ci0gIHBvc2l0aW9uXyAtPSBjb3VudDsKLSAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IDA7ICAvLyBEb24ndCBsZXQgY2FsbGVyIGJhY2sgdXAgZnVydGhlci4KLX0KLQotaW50NjQgQXJyYXlPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBvc2l0aW9uXzsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1TdHJpbmdPdXRwdXRTdHJlYW06OlN0cmluZ091dHB1dFN0cmVhbShzdHJpbmcqIHRhcmdldCkKLSAgOiB0YXJnZXRfKHRhcmdldCkgewotfQotCi1TdHJpbmdPdXRwdXRTdHJlYW06On5TdHJpbmdPdXRwdXRTdHJlYW0oKSB7Ci19Ci0KLWJvb2wgU3RyaW5nT3V0cHV0U3RyZWFtOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgR09PR0xFX0NIRUNLKHRhcmdldF8gIT0gTlVMTCk7Ci0gIGludCBvbGRfc2l6ZSA9IHRhcmdldF8tPnNpemUoKTsKLQotICAvLyBHcm93IHRoZSBzdHJpbmcuCi0gIGlmIChvbGRfc2l6ZSA8IHRhcmdldF8tPmNhcGFjaXR5KCkpIHsKLSAgICAvLyBSZXNpemUgdGhlIHN0cmluZyB0byBtYXRjaCBpdHMgY2FwYWNpdHksIHNpbmNlIHdlIGNhbiBnZXQgYXdheQotICAgIC8vIHdpdGhvdXQgYSBtZW1vcnkgYWxsb2NhdGlvbiB0aGlzIHdheS4KLSAgICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKHRhcmdldF8sIHRhcmdldF8tPmNhcGFjaXR5KCkpOwotICB9IGVsc2UgewotICAgIC8vIFNpemUgaGFzIHJlYWNoZWQgY2FwYWNpdHksIHRyeSB0byBkb3VibGUgdGhlIHNpemUuCi0gICAgaWYgKG9sZF9zaXplID4gc3RkOjpudW1lcmljX2xpbWl0czxpbnQ+OjptYXgoKSAvIDIpIHsKLSAgICAgIC8vIENhbiBub3QgZG91YmxlIHRoZSBzaXplIG90aGVyd2lzZSBpdCBpcyBnb2luZyB0byBjYXVzZSBpbnRlZ2VyCi0gICAgICAvLyBvdmVyZmxvdyBpbiB0aGUgZXhwcmVzc2lvbiBiZWxvdzogb2xkX3NpemUgKiAyICI7Ci0gICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiQ2Fubm90IGFsbG9jYXRlIGJ1ZmZlciBsYXJnZXIgdGhhbiBraW50MzJtYXggZm9yICIKLSAgICAgICAgICAgICAgICAgPDwgIlN0cmluZ091dHB1dFN0cmVhbS4iOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICAvLyBEb3VibGUgdGhlIHNpemUsIGFsc28gbWFrZSBzdXJlIHRoYXQgdGhlIG5ldyBzaXplIGlzIGF0IGxlYXN0Ci0gICAgLy8ga01pbmltdW1TaXplLgotICAgIFNUTFN0cmluZ1Jlc2l6ZVVuaW5pdGlhbGl6ZWQoCi0gICAgICAgIHRhcmdldF8sCi0gICAgICAgIHN0ZDo6bWF4KG9sZF9zaXplICogMiwKLSAgICAgICAgICAgICAgICAga01pbmltdW1TaXplICsgMCkpOyAgLy8gIisgMCIgd29ya3MgYXJvdW5kIEdDQzQgd2VpcmRuZXNzLgotICB9Ci0KLSAgKmRhdGEgPSBtdXRhYmxlX3N0cmluZ19kYXRhKHRhcmdldF8pICsgb2xkX3NpemU7Ci0gICpzaXplID0gdGFyZ2V0Xy0+c2l6ZSgpIC0gb2xkX3NpemU7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFN0cmluZ091dHB1dFN0cmVhbTo6QmFja1VwKGludCBjb3VudCkgewotICBHT09HTEVfQ0hFQ0tfR0UoY291bnQsIDApOwotICBHT09HTEVfQ0hFQ0sodGFyZ2V0XyAhPSBOVUxMKTsKLSAgR09PR0xFX0NIRUNLX0xFKGNvdW50LCB0YXJnZXRfLT5zaXplKCkpOwotICB0YXJnZXRfLT5yZXNpemUodGFyZ2V0Xy0+c2l6ZSgpIC0gY291bnQpOwotfQotCi1pbnQ2NCBTdHJpbmdPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgR09PR0xFX0NIRUNLKHRhcmdldF8gIT0gTlVMTCk7Ci0gIHJldHVybiB0YXJnZXRfLT5zaXplKCk7Ci19Ci0KLXZvaWQgU3RyaW5nT3V0cHV0U3RyZWFtOjpTZXRTdHJpbmcoc3RyaW5nKiB0YXJnZXQpIHsKLSAgdGFyZ2V0XyA9IHRhcmdldDsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1MYXp5U3RyaW5nT3V0cHV0U3RyZWFtOjpMYXp5U3RyaW5nT3V0cHV0U3RyZWFtKAotICAgIFJlc3VsdENhbGxiYWNrPHN0cmluZyo+KiBjYWxsYmFjaykKLSAgICA6IFN0cmluZ091dHB1dFN0cmVhbShOVUxMKSwKLSAgICAgIGNhbGxiYWNrXyhHT09HTEVfQ0hFQ0tfTk9UTlVMTChjYWxsYmFjaykpLAotICAgICAgc3RyaW5nX2lzX3NldF8oZmFsc2UpIHsKLX0KLQotTGF6eVN0cmluZ091dHB1dFN0cmVhbTo6fkxhenlTdHJpbmdPdXRwdXRTdHJlYW0oKSB7Ci19Ci0KLWJvb2wgTGF6eVN0cmluZ091dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7Ci0gIGlmICghc3RyaW5nX2lzX3NldF8pIHsKLSAgICBTZXRTdHJpbmcoY2FsbGJhY2tfLT5SdW4oKSk7Ci0gICAgc3RyaW5nX2lzX3NldF8gPSB0cnVlOwotICB9Ci0gIHJldHVybiBTdHJpbmdPdXRwdXRTdHJlYW06Ok5leHQoZGF0YSwgc2l6ZSk7Ci19Ci0KLWludDY0IExhenlTdHJpbmdPdXRwdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHN0cmluZ19pc19zZXRfID8gU3RyaW5nT3V0cHV0U3RyZWFtOjpCeXRlQ291bnQoKSA6IDA7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ29weWluZ0lucHV0U3RyZWFtOjp+Q29weWluZ0lucHV0U3RyZWFtKCkge30KLQotaW50IENvcHlpbmdJbnB1dFN0cmVhbTo6U2tpcChpbnQgY291bnQpIHsKLSAgY2hhciBqdW5rWzQwOTZdOwotICBpbnQgc2tpcHBlZCA9IDA7Ci0gIHdoaWxlIChza2lwcGVkIDwgY291bnQpIHsKLSAgICBpbnQgYnl0ZXMgPQotICAgICAgICBSZWFkKGp1bmssIHN0ZDo6bWluKGNvdW50IC0gc2tpcHBlZCwgaW1wbGljaXRfY2FzdDxpbnQ+KHNpemVvZihqdW5rKSkpKTsKLSAgICBpZiAoYnl0ZXMgPD0gMCkgewotICAgICAgLy8gRU9GIG9yIHJlYWQgZXJyb3IuCi0gICAgICByZXR1cm4gc2tpcHBlZDsKLSAgICB9Ci0gICAgc2tpcHBlZCArPSBieXRlczsKLSAgfQotICByZXR1cm4gc2tpcHBlZDsKLX0KLQotQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6Q29weWluZ0lucHV0U3RyZWFtQWRhcHRvcigKLSAgICBDb3B5aW5nSW5wdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtLCBpbnQgYmxvY2tfc2l6ZSkKLSAgOiBjb3B5aW5nX3N0cmVhbV8oY29weWluZ19zdHJlYW0pLAotICAgIG93bnNfY29weWluZ19zdHJlYW1fKGZhbHNlKSwKLSAgICBmYWlsZWRfKGZhbHNlKSwKLSAgICBwb3NpdGlvbl8oMCksCi0gICAgYnVmZmVyX3NpemVfKGJsb2NrX3NpemUgPiAwID8gYmxvY2tfc2l6ZSA6IGtEZWZhdWx0QmxvY2tTaXplKSwKLSAgICBidWZmZXJfdXNlZF8oMCksCi0gICAgYmFja3VwX2J5dGVzXygwKSB7Ci19Ci0KLUNvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6On5Db3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yKCkgewotICBpZiAob3duc19jb3B5aW5nX3N0cmVhbV8pIHsKLSAgICBkZWxldGUgY29weWluZ19zdHJlYW1fOwotICB9Ci19Ci0KLWJvb2wgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6TmV4dChjb25zdCB2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7Ci0gIGlmIChmYWlsZWRfKSB7Ci0gICAgLy8gQWxyZWFkeSBmYWlsZWQgb24gYSBwcmV2aW91cyByZWFkLgotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKTsKLQotICBpZiAoYmFja3VwX2J5dGVzXyA+IDApIHsKLSAgICAvLyBXZSBoYXZlIGRhdGEgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBCYWNrVXAoKSwgc28ganVzdCByZXR1cm4gdGhhdC4KLSAgICAqZGF0YSA9IGJ1ZmZlcl8uZ2V0KCkgKyBidWZmZXJfdXNlZF8gLSBiYWNrdXBfYnl0ZXNfOwotICAgICpzaXplID0gYmFja3VwX2J5dGVzXzsKLSAgICBiYWNrdXBfYnl0ZXNfID0gMDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFJlYWQgbmV3IGRhdGEgaW50byB0aGUgYnVmZmVyLgotICBidWZmZXJfdXNlZF8gPSBjb3B5aW5nX3N0cmVhbV8tPlJlYWQoYnVmZmVyXy5nZXQoKSwgYnVmZmVyX3NpemVfKTsKLSAgaWYgKGJ1ZmZlcl91c2VkXyA8PSAwKSB7Ci0gICAgLy8gRU9GIG9yIHJlYWQgZXJyb3IuICBXZSBkb24ndCBuZWVkIHRoZSBidWZmZXIgYW55bW9yZS4KLSAgICBpZiAoYnVmZmVyX3VzZWRfIDwgMCkgewotICAgICAgLy8gUmVhZCBlcnJvciAobm90IEVPRikuCi0gICAgICBmYWlsZWRfID0gdHJ1ZTsKLSAgICB9Ci0gICAgRnJlZUJ1ZmZlcigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBwb3NpdGlvbl8gKz0gYnVmZmVyX3VzZWRfOwotCi0gICpzaXplID0gYnVmZmVyX3VzZWRfOwotICAqZGF0YSA9IGJ1ZmZlcl8uZ2V0KCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OkJhY2tVcChpbnQgY291bnQpIHsKLSAgR09PR0xFX0NIRUNLKGJhY2t1cF9ieXRlc18gPT0gMCAmJiBidWZmZXJfLmdldCgpICE9IE5VTEwpCi0gICAgPDwgIiBCYWNrVXAoKSBjYW4gb25seSBiZSBjYWxsZWQgYWZ0ZXIgTmV4dCgpLiI7Ci0gIEdPT0dMRV9DSEVDS19MRShjb3VudCwgYnVmZmVyX3VzZWRfKQotICAgIDw8ICIgQ2FuJ3QgYmFjayB1cCBvdmVyIG1vcmUgYnl0ZXMgdGhhbiB3ZXJlIHJldHVybmVkIGJ5IHRoZSBsYXN0IGNhbGwiCi0gICAgICAgIiB0byBOZXh0KCkuIjsKLSAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKQotICAgIDw8ICIgUGFyYW1ldGVyIHRvIEJhY2tVcCgpIGNhbid0IGJlIG5lZ2F0aXZlLiI7Ci0KLSAgYmFja3VwX2J5dGVzXyA9IGNvdW50OwotfQotCi1ib29sIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OlNraXAoaW50IGNvdW50KSB7Ci0gIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7Ci0KLSAgaWYgKGZhaWxlZF8pIHsKLSAgICAvLyBBbHJlYWR5IGZhaWxlZCBvbiBhIHByZXZpb3VzIHJlYWQuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRmlyc3Qgc2tpcCBhbnkgYnl0ZXMgbGVmdCBvdmVyIGZyb20gYSBwcmV2aW91cyBCYWNrVXAoKS4KLSAgaWYgKGJhY2t1cF9ieXRlc18gPj0gY291bnQpIHsKLSAgICAvLyBXZSBoYXZlIG1vcmUgZGF0YSBsZWZ0IG92ZXIgdGhhbiB3ZSdyZSB0cnlpbmcgdG8gc2tpcC4gIEp1c3QgY2hvcCBpdC4KLSAgICBiYWNrdXBfYnl0ZXNfIC09IGNvdW50OwotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgY291bnQgLT0gYmFja3VwX2J5dGVzXzsKLSAgYmFja3VwX2J5dGVzXyA9IDA7Ci0KLSAgaW50IHNraXBwZWQgPSBjb3B5aW5nX3N0cmVhbV8tPlNraXAoY291bnQpOwotICBwb3NpdGlvbl8gKz0gc2tpcHBlZDsKLSAgcmV0dXJuIHNraXBwZWQgPT0gY291bnQ7Ci19Ci0KLWludDY0IENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3I6OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBvc2l0aW9uXyAtIGJhY2t1cF9ieXRlc187Ci19Ci0KLXZvaWQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6QWxsb2NhdGVCdWZmZXJJZk5lZWRlZCgpIHsKLSAgaWYgKGJ1ZmZlcl8uZ2V0KCkgPT0gTlVMTCkgewotICAgIGJ1ZmZlcl8ucmVzZXQobmV3IHVpbnQ4W2J1ZmZlcl9zaXplX10pOwotICB9Ci19Ci0KLXZvaWQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvcjo6RnJlZUJ1ZmZlcigpIHsKLSAgR09PR0xFX0NIRUNLX0VRKGJhY2t1cF9ieXRlc18sIDApOwotICBidWZmZXJfdXNlZF8gPSAwOwotICBidWZmZXJfLnJlc2V0KCk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotQ29weWluZ091dHB1dFN0cmVhbTo6fkNvcHlpbmdPdXRwdXRTdHJlYW0oKSB7fQotCi1Db3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6Q29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IoCi0gICAgQ29weWluZ091dHB1dFN0cmVhbSogY29weWluZ19zdHJlYW0sIGludCBibG9ja19zaXplKQotICA6IGNvcHlpbmdfc3RyZWFtXyhjb3B5aW5nX3N0cmVhbSksCi0gICAgb3duc19jb3B5aW5nX3N0cmVhbV8oZmFsc2UpLAotICAgIGZhaWxlZF8oZmFsc2UpLAotICAgIHBvc2l0aW9uXygwKSwKLSAgICBidWZmZXJfc2l6ZV8oYmxvY2tfc2l6ZSA+IDAgPyBibG9ja19zaXplIDoga0RlZmF1bHRCbG9ja1NpemUpLAotICAgIGJ1ZmZlcl91c2VkXygwKSB7Ci19Ci0KLUNvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjp+Q29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IoKSB7Ci0gIFdyaXRlQnVmZmVyKCk7Ci0gIGlmIChvd25zX2NvcHlpbmdfc3RyZWFtXykgewotICAgIGRlbGV0ZSBjb3B5aW5nX3N0cmVhbV87Ci0gIH0KLX0KLQotYm9vbCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6Rmx1c2goKSB7Ci0gIHJldHVybiBXcml0ZUJ1ZmZlcigpOwotfQotCi1ib29sIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpIHsKLSAgaWYgKGJ1ZmZlcl91c2VkXyA9PSBidWZmZXJfc2l6ZV8pIHsKLSAgICBpZiAoIVdyaXRlQnVmZmVyKCkpIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIEFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKTsKLQotICAqZGF0YSA9IGJ1ZmZlcl8uZ2V0KCkgKyBidWZmZXJfdXNlZF87Ci0gICpzaXplID0gYnVmZmVyX3NpemVfIC0gYnVmZmVyX3VzZWRfOwotICBidWZmZXJfdXNlZF8gPSBidWZmZXJfc2l6ZV87Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpCYWNrVXAoaW50IGNvdW50KSB7Ci0gIEdPT0dMRV9DSEVDS19HRShjb3VudCwgMCk7Ci0gIEdPT0dMRV9DSEVDS19FUShidWZmZXJfdXNlZF8sIGJ1ZmZlcl9zaXplXykKLSAgICA8PCAiIEJhY2tVcCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBhZnRlciBOZXh0KCkuIjsKLSAgR09PR0xFX0NIRUNLX0xFKGNvdW50LCBidWZmZXJfdXNlZF8pCi0gICAgPDwgIiBDYW4ndCBiYWNrIHVwIG92ZXIgbW9yZSBieXRlcyB0aGFuIHdlcmUgcmV0dXJuZWQgYnkgdGhlIGxhc3QgY2FsbCIKLSAgICAgICAiIHRvIE5leHQoKS4iOwotCi0gIGJ1ZmZlcl91c2VkXyAtPSBjb3VudDsKLX0KLQotaW50NjQgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3I6OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHBvc2l0aW9uXyArIGJ1ZmZlcl91c2VkXzsKLX0KLQotYm9vbCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6V3JpdGVCdWZmZXIoKSB7Ci0gIGlmIChmYWlsZWRfKSB7Ci0gICAgLy8gQWxyZWFkeSBmYWlsZWQgb24gYSBwcmV2aW91cyB3cml0ZS4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoYnVmZmVyX3VzZWRfID09IDApIHJldHVybiB0cnVlOwotCi0gIGlmIChjb3B5aW5nX3N0cmVhbV8tPldyaXRlKGJ1ZmZlcl8uZ2V0KCksIGJ1ZmZlcl91c2VkXykpIHsKLSAgICBwb3NpdGlvbl8gKz0gYnVmZmVyX3VzZWRfOwotICAgIGJ1ZmZlcl91c2VkXyA9IDA7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgZmFpbGVkXyA9IHRydWU7Ci0gICAgRnJlZUJ1ZmZlcigpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi12b2lkIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yOjpBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCkgewotICBpZiAoYnVmZmVyXyA9PSBOVUxMKSB7Ci0gICAgYnVmZmVyXy5yZXNldChuZXcgdWludDhbYnVmZmVyX3NpemVfXSk7Ci0gIH0KLX0KLQotdm9pZCBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcjo6RnJlZUJ1ZmZlcigpIHsKLSAgYnVmZmVyX3VzZWRfID0gMDsKLSAgYnVmZmVyXy5yZXNldCgpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkODFjY2YuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNDExICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgY29tbW9uIGltcGxlbWVudGF0aW9ucyBvZiB0aGUgaW50ZXJmYWNlcyBkZWZpbmVkIGluCi0vLyB6ZXJvX2NvcHlfc3RyZWFtLmggd2hpY2ggYXJlIGluY2x1ZGVkIGluIHRoZSAibGl0ZSIgcHJvdG9idWYgbGlicmFyeS4KLS8vIFRoZXNlIGltcGxlbWVudGF0aW9ucyBjb3ZlciBJL08gb24gcmF3IGFycmF5cyBhbmQgc3RyaW5ncywgYXMgd2VsbCBhcwotLy8gYWRhcHRvcnMgd2hpY2ggbWFrZSBpdCBlYXN5IHRvIGltcGxlbWVudCBzdHJlYW1zIGJhc2VkIG9uIHRyYWRpdGlvbmFsCi0vLyBzdHJlYW1zLiAgT2YgY291cnNlLCBtYW55IHVzZXJzIHdpbGwgcHJvYmFibHkgd2FudCB0byB3cml0ZSB0aGVpciBvd24KLS8vIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBpbnRlcmZhY2VzIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIEkvTwotLy8gYWJzdHJhY3Rpb25zIHRoZXkgcHJlZmVyIHRvIHVzZSwgYnV0IHRoZXNlIHNob3VsZCBjb3ZlciB0aGUgbW9zdCBjb21tb24KLS8vIGNhc2VzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0lNUExfTElURV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9MSVRFX0hfXwotCi0jaW5jbHVkZSA8bWVtb3J5PgotI2lmbmRlZiBfU0hBUkVEX1BUUl9ICi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxpb3Nmd2Q+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSBiYWNrZWQgYnkgYW4gaW4tbWVtb3J5IGFycmF5IG9mIGJ5dGVzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIEFycmF5SW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGUgYW4gSW5wdXRTdHJlYW0gdGhhdCByZXR1cm5zIHRoZSBieXRlcyBwb2ludGVkIHRvIGJ5ICJkYXRhIi4KLSAgLy8gImRhdGEiIHJlbWFpbnMgdGhlIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIgYnV0IG11c3QgcmVtYWluIHZhbGlkIHVudGlsCi0gIC8vIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLiAgSWYgYSBibG9ja19zaXplIGlzIGdpdmVuLCBjYWxscyB0byBOZXh0KCkKLSAgLy8gd2lsbCByZXR1cm4gZGF0YSBibG9ja3Mgbm8gbGFyZ2VyIHRoYW4gdGhlIGdpdmVuIHNpemUuICBPdGhlcndpc2UsIHRoZQotICAvLyBmaXJzdCBjYWxsIHRvIE5leHQoKSByZXR1cm5zIHRoZSBlbnRpcmUgYXJyYXkuICBibG9ja19zaXplIGlzIG1haW5seQotICAvLyB1c2VmdWwgZm9yIHRlc3Rpbmc7IGluIHByb2R1Y3Rpb24geW91IHdvdWxkIHByb2JhYmx5IG5ldmVyIHdhbnQgdG8gc2V0Ci0gIC8vIGl0LgotICBBcnJheUlucHV0U3RyZWFtKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBpbnQgYmxvY2tfc2l6ZSA9IC0xKTsKLSAgfkFycmF5SW5wdXRTdHJlYW0oKTsKLQotICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5SW5wdXRTdHJlYW0gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBib29sIE5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSk7Ci0gIHZvaWQgQmFja1VwKGludCBjb3VudCk7Ci0gIGJvb2wgU2tpcChpbnQgY291bnQpOwotICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKLQotCi0gcHJpdmF0ZToKLSAgY29uc3QgdWludDgqIGNvbnN0IGRhdGFfOyAgLy8gVGhlIGJ5dGUgYXJyYXkuCi0gIGNvbnN0IGludCBzaXplXzsgICAgICAgICAgIC8vIFRvdGFsIHNpemUgb2YgdGhlIGFycmF5LgotICBjb25zdCBpbnQgYmxvY2tfc2l6ZV87ICAgICAvLyBIb3cgbWFueSBieXRlcyB0byByZXR1cm4gYXQgYSB0aW1lLgotCi0gIGludCBwb3NpdGlvbl87Ci0gIGludCBsYXN0X3JldHVybmVkX3NpemVfOyAgIC8vIEhvdyBtYW55IGJ5dGVzIHdlIHJldHVybmVkIGxhc3QgdGltZSBOZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNhbGxlZCAodXNlZCBmb3IgZXJyb3IgY2hlY2tpbmcgb25seSkuCi0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFycmF5SW5wdXRTdHJlYW0pOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIGJhY2tlZCBieSBhbiBpbi1tZW1vcnkgYXJyYXkgb2YgYnl0ZXMuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQXJyYXlPdXRwdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGFuIE91dHB1dFN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgYnl0ZXMgcG9pbnRlZCB0byBieSAiZGF0YSIuCi0gIC8vICJkYXRhIiByZW1haW5zIHRoZSBwcm9wZXJ0eSBvZiB0aGUgY2FsbGVyIGJ1dCBtdXN0IHJlbWFpbiB2YWxpZCB1bnRpbAotICAvLyB0aGUgc3RyZWFtIGlzIGRlc3Ryb3llZC4gIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgY2FsbHMgdG8gTmV4dCgpCi0gIC8vIHdpbGwgcmV0dXJuIGRhdGEgYmxvY2tzIG5vIGxhcmdlciB0aGFuIHRoZSBnaXZlbiBzaXplLiAgT3RoZXJ3aXNlLCB0aGUKLSAgLy8gZmlyc3QgY2FsbCB0byBOZXh0KCkgcmV0dXJucyB0aGUgZW50aXJlIGFycmF5LiAgYmxvY2tfc2l6ZSBpcyBtYWlubHkKLSAgLy8gdXNlZnVsIGZvciB0ZXN0aW5nOyBpbiBwcm9kdWN0aW9uIHlvdSB3b3VsZCBwcm9iYWJseSBuZXZlciB3YW50IHRvIHNldAotICAvLyBpdC4KLSAgQXJyYXlPdXRwdXRTdHJlYW0odm9pZCogZGF0YSwgaW50IHNpemUsIGludCBibG9ja19zaXplID0gLTEpOwotICB+QXJyYXlPdXRwdXRTdHJlYW0oKTsKLQotICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSk7Ci0gIHZvaWQgQmFja1VwKGludCBjb3VudCk7Ci0gIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgdWludDgqIGNvbnN0IGRhdGFfOyAgICAgICAgLy8gVGhlIGJ5dGUgYXJyYXkuCi0gIGNvbnN0IGludCBzaXplXzsgICAgICAgICAgIC8vIFRvdGFsIHNpemUgb2YgdGhlIGFycmF5LgotICBjb25zdCBpbnQgYmxvY2tfc2l6ZV87ICAgICAvLyBIb3cgbWFueSBieXRlcyB0byByZXR1cm4gYXQgYSB0aW1lLgotCi0gIGludCBwb3NpdGlvbl87Ci0gIGludCBsYXN0X3JldHVybmVkX3NpemVfOyAgIC8vIEhvdyBtYW55IGJ5dGVzIHdlIHJldHVybmVkIGxhc3QgdGltZSBOZXh0KCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2FzIGNhbGxlZCAodXNlZCBmb3IgZXJyb3IgY2hlY2tpbmcgb25seSkuCi0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEFycmF5T3V0cHV0U3RyZWFtKTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gQSBaZXJvQ29weU91dHB1dFN0cmVhbSB3aGljaCBhcHBlbmRzIGJ5dGVzIHRvIGEgc3RyaW5nLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFN0cmluZ091dHB1dFN0cmVhbSA6IHB1YmxpYyBaZXJvQ29weU91dHB1dFN0cmVhbSB7Ci0gcHVibGljOgotICAvLyBDcmVhdGUgYSBTdHJpbmdPdXRwdXRTdHJlYW0gd2hpY2ggYXBwZW5kcyBieXRlcyB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotICAvLyBUaGUgc3RyaW5nIHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGNhbGxlciwgYnV0IGl0IGlzIG11dGF0ZWQgaW4gYXJiaXRyYXJ5Ci0gIC8vIHdheXMgYW5kIE1VU1QgTk9UIGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgdW50aWwgeW91J3JlIGRvbmUgd2l0aCB0aGUKLSAgLy8gc3RyZWFtLiBFaXRoZXIgYmUgc3VyZSB0aGVyZSdzIG5vIGZ1cnRoZXIgdXNhZ2UsIG9yIChzYWZlc3QpIGRlc3Ryb3kgdGhlCi0gIC8vIHN0cmVhbSBiZWZvcmUgdXNpbmcgdGhlIGNvbnRlbnRzLgotICAvLwotICAvLyBIaW50OiAgSWYgeW91IGNhbGwgdGFyZ2V0LT5yZXNlcnZlKG4pIGJlZm9yZSBjcmVhdGluZyB0aGUgc3RyZWFtLAotICAvLyAgIHRoZSBmaXJzdCBjYWxsIHRvIE5leHQoKSB3aWxsIHJldHVybiBhdCBsZWFzdCBuIGJ5dGVzIG9mIGJ1ZmZlcgotICAvLyAgIHNwYWNlLgotICBleHBsaWNpdCBTdHJpbmdPdXRwdXRTdHJlYW0oc3RyaW5nKiB0YXJnZXQpOwotICB+U3RyaW5nT3V0cHV0U3RyZWFtKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwotICB2b2lkIEJhY2tVcChpbnQgY291bnQpOwotICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKLQotIHByb3RlY3RlZDoKLSAgdm9pZCBTZXRTdHJpbmcoc3RyaW5nKiB0YXJnZXQpOwotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0IGludCBrTWluaW11bVNpemUgPSAxNjsKLQotICBzdHJpbmcqIHRhcmdldF87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFN0cmluZ091dHB1dFN0cmVhbSk7Ci19OwotCi0vLyBMYXp5U3RyaW5nT3V0cHV0U3RyZWFtIGlzIGEgU3RyaW5nT3V0cHV0U3RyZWFtIHdpdGggbGF6eSBhY3F1aXNpdGlvbiBvZgotLy8gdGhlIG91dHB1dCBzdHJpbmcgZnJvbSBhIGNhbGxiYWNrLiBUaGUgc3RyaW5nIGlzIG93bmVkIGV4dGVybmFsbHksIGFuZCBub3QKLS8vIGRlbGV0ZWQgaW4gdGhlIHN0cmVhbSBkZXN0cnVjdG9yLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExhenlTdHJpbmdPdXRwdXRTdHJlYW0gOiBwdWJsaWMgU3RyaW5nT3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIENhbGxiYWNrIHNob3VsZCBiZSBwZXJtYW5lbnQgKG5vbi1zZWxmLWRlbGV0aW5nKS4gT3duZXJzaGlwIGlzIHRyYW5zZmVycmVkCi0gIC8vIHRvIHRoZSBMYXp5U3RyaW5nT3V0cHV0U3RyZWFtLgotICBleHBsaWNpdCBMYXp5U3RyaW5nT3V0cHV0U3RyZWFtKFJlc3VsdENhbGxiYWNrPHN0cmluZyo+KiBjYWxsYmFjayk7Ci0gIH5MYXp5U3RyaW5nT3V0cHV0U3RyZWFtKCk7Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weU91dHB1dFN0cmVhbSwgb3ZlcnJpZGluZyBTdHJpbmdPdXRwdXRTdHJlYW0gLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwotICBpbnQ2NCBCeXRlQ291bnQoKSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8UmVzdWx0Q2FsbGJhY2s8c3RyaW5nKj4gPiBjYWxsYmFja187Ci0gIGJvb2wgc3RyaW5nX2lzX3NldF87Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExhenlTdHJpbmdPdXRwdXRTdHJlYW0pOwotfTsKLQotLy8gTm90ZTogIFRoZXJlIGlzIG5vIFN0cmluZ0lucHV0U3RyZWFtLiAgSW5zdGVhZCwganVzdCBjcmVhdGUgYW4KLS8vIEFycmF5SW5wdXRTdHJlYW0gYXMgZm9sbG93czoKLS8vICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBBIGdlbmVyaWMgdHJhZGl0aW9uYWwgaW5wdXQgc3RyZWFtIGludGVyZmFjZS4KLS8vCi0vLyBMb3RzIG9mIHRyYWRpdGlvbmFsIGlucHV0IHN0cmVhbXMgKGUuZy4gZmlsZSBkZXNjcmlwdG9ycywgQyBzdGRpbwotLy8gc3RyZWFtcywgYW5kIEMrKyBpb3N0cmVhbXMpIGV4cG9zZSBhbiBpbnRlcmZhY2Ugd2hlcmUgZXZlcnkgcmVhZAotLy8gaW52b2x2ZXMgY29weWluZyBieXRlcyBpbnRvIGEgYnVmZmVyLiAgSWYgeW91IHdhbnQgdG8gdGFrZSBzdWNoIGFuCi0vLyBpbnRlcmZhY2UgYW5kIG1ha2UgYSBaZXJvQ29weUlucHV0U3RyZWFtIGJhc2VkIG9uIGl0LCBzaW1wbHkgaW1wbGVtZW50Ci0vLyBDb3B5aW5nSW5wdXRTdHJlYW0gYW5kIHRoZW4gdXNlIENvcHlpbmdJbnB1dFN0cmVhbUFkYXB0b3IuCi0vLwotLy8gQ29weWluZ0lucHV0U3RyZWFtIGltcGxlbWVudGF0aW9ucyBzaG91bGQgYXZvaWQgYnVmZmVyaW5nIGlmIHBvc3NpYmxlLgotLy8gQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvciBkb2VzIGl0cyBvd24gYnVmZmVyaW5nIGFuZCB3aWxsIHJlYWQgZGF0YQotLy8gaW4gbGFyZ2UgYmxvY2tzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvcHlpbmdJbnB1dFN0cmVhbSB7Ci0gcHVibGljOgotICB2aXJ0dWFsIH5Db3B5aW5nSW5wdXRTdHJlYW0oKTsKLQotICAvLyBSZWFkcyB1cCB0byAic2l6ZSIgYnl0ZXMgaW50byB0aGUgZ2l2ZW4gYnVmZmVyLiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mCi0gIC8vIGJ5dGVzIHJlYWQuICBSZWFkKCkgd2FpdHMgdW50aWwgYXQgbGVhc3Qgb25lIGJ5dGUgaXMgYXZhaWxhYmxlLCBvcgotICAvLyByZXR1cm5zIHplcm8gaWYgbm8gYnl0ZXMgd2lsbCBldmVyIGJlY29tZSBhdmFpbGFibGUgKEVPRiksIG9yIC0xIGlmIGEKLSAgLy8gcGVybWFuZW50IHJlYWQgZXJyb3Igb2NjdXJyZWQuCi0gIHZpcnR1YWwgaW50IFJlYWQodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgPSAwOwotCi0gIC8vIFNraXBzIHRoZSBuZXh0ICJjb3VudCIgYnl0ZXMgb2YgaW5wdXQuICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMKLSAgLy8gYWN0dWFsbHkgc2tpcHBlZC4gIFRoaXMgd2lsbCBhbHdheXMgYmUgZXhhY3RseSBlcXVhbCB0byAiY291bnQiIHVubGVzcwotICAvLyBFT0Ygd2FzIHJlYWNoZWQgb3IgYSBwZXJtYW5lbnQgcmVhZCBlcnJvciBvY2N1cnJlZC4KLSAgLy8KLSAgLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdCByZXBlYXRlZGx5IGNhbGxzIFJlYWQoKSBpbnRvIGEgc2NyYXRjaAotICAvLyBidWZmZXIuCi0gIHZpcnR1YWwgaW50IFNraXAoaW50IGNvdW50KTsKLX07Ci0KLS8vIEEgWmVyb0NvcHlJbnB1dFN0cmVhbSB3aGljaCByZWFkcyBmcm9tIGEgQ29weWluZ0lucHV0U3RyZWFtLiAgVGhpcyBpcwotLy8gdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgWmVyb0NvcHlJbnB1dFN0cmVhbXMgdGhhdCByZWFkIGZyb20gdHJhZGl0aW9uYWwKLS8vIHN0cmVhbXMuICBOb3RlIHRoYXQgdGhpcyBjbGFzcyBpcyBub3QgcmVhbGx5IHplcm8tY29weS4KLS8vCi0vLyBJZiB5b3Ugd2FudCB0byByZWFkIGZyb20gZmlsZSBkZXNjcmlwdG9ycyBvciBDKysgaXN0cmVhbXMsIHRoaXMgaXMKLS8vIGFscmVhZHkgaW1wbGVtZW50ZWQgZm9yIHlvdTogIHVzZSBGaWxlSW5wdXRTdHJlYW0gb3IgSXN0cmVhbUlucHV0U3RyZWFtCi0vLyByZXNwZWN0aXZlbHkuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ0lucHV0U3RyZWFtQWRhcHRvciA6IHB1YmxpYyBaZXJvQ29weUlucHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIC8vIENyZWF0ZXMgYSBzdHJlYW0gdGhhdCByZWFkcyBmcm9tIHRoZSBnaXZlbiBDb3B5aW5nSW5wdXRTdHJlYW0uCi0gIC8vIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdAotICAvLyBzaG91bGQgYmUgcmVhZCBhbmQgcmV0dXJuZWQgd2l0aCBlYWNoIGNhbGwgdG8gTmV4dCgpLiAgT3RoZXJ3aXNlLAotICAvLyBhIHJlYXNvbmFibGUgZGVmYXVsdCBpcyB1c2VkLiAgVGhlIGNhbGxlciByZXRhaW5zIG93bmVyc2hpcCBvZgotICAvLyBjb3B5aW5nX3N0cmVhbSB1bmxlc3MgU2V0T3duc0NvcHlpbmdTdHJlYW0odHJ1ZSkgaXMgY2FsbGVkLgotICBleHBsaWNpdCBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yKENvcHlpbmdJbnB1dFN0cmVhbSogY29weWluZ19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJsb2NrX3NpemUgPSAtMSk7Ci0gIH5Db3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yKCk7Ci0KLSAgLy8gQ2FsbCBTZXRPd25zQ29weWluZ1N0cmVhbSh0cnVlKSB0byB0ZWxsIHRoZSBDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yIHRvCi0gIC8vIGRlbGV0ZSB0aGUgdW5kZXJseWluZyBDb3B5aW5nSW5wdXRTdHJlYW0gd2hlbiBpdCBpcyBkZXN0cm95ZWQuCi0gIHZvaWQgU2V0T3duc0NvcHlpbmdTdHJlYW0oYm9vbCB2YWx1ZSkgeyBvd25zX2NvcHlpbmdfc3RyZWFtXyA9IHZhbHVlOyB9Ci0KLSAgLy8gaW1wbGVtZW50cyBaZXJvQ29weUlucHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgYm9vbCBOZXh0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwotICB2b2lkIEJhY2tVcChpbnQgY291bnQpOwotICBib29sIFNraXAoaW50IGNvdW50KTsKLSAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAvLyBJbnN1cmVzIHRoYXQgYnVmZmVyXyBpcyBub3QgTlVMTC4KLSAgdm9pZCBBbGxvY2F0ZUJ1ZmZlcklmTmVlZGVkKCk7Ci0gIC8vIEZyZWVzIHRoZSBidWZmZXIgYW5kIHJlc2V0cyBidWZmZXJfdXNlZF8uCi0gIHZvaWQgRnJlZUJ1ZmZlcigpOwotCi0gIC8vIFRoZSB1bmRlcmx5aW5nIGNvcHlpbmcgc3RyZWFtLgotICBDb3B5aW5nSW5wdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtXzsKLSAgYm9vbCBvd25zX2NvcHlpbmdfc3RyZWFtXzsKLQotICAvLyBUcnVlIGlmIHdlIGhhdmUgc2VlbiBhIHBlcm1lbmFudCBlcnJvciBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgYm9vbCBmYWlsZWRfOwotCi0gIC8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvcHlpbmdfc3RyZWFtXywgcmVsYXRpdmUgdG8gdGhlIHBvaW50IHdoZXJlCi0gIC8vIHdlIHN0YXJ0ZWQgcmVhZGluZy4KLSAgaW50NjQgcG9zaXRpb25fOwotCi0gIC8vIERhdGEgaXMgcmVhZCBpbnRvIHRoaXMgYnVmZmVyLiAgSXQgbWF5IGJlIE5VTEwgaWYgbm8gYnVmZmVyIGlzIGN1cnJlbnRseQotICAvLyBpbiB1c2UuICBPdGhlcndpc2UsIGl0IHBvaW50cyB0byBhbiBhcnJheSBvZiBzaXplIGJ1ZmZlcl9zaXplXy4KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXJfOwotICBjb25zdCBpbnQgYnVmZmVyX3NpemVfOwotCi0gIC8vIE51bWJlciBvZiB2YWxpZCBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciAoaS5lLiB0aGUgc2l6ZSBsYXN0Ci0gIC8vIHJldHVybmVkIGJ5IE5leHQoKSkuICAwIDw9IGJ1ZmZlcl91c2VkXyA8PSBidWZmZXJfc2l6ZV8uCi0gIGludCBidWZmZXJfdXNlZF87Ci0KLSAgLy8gTnVtYmVyIG9mIGJ5dGVzIGluIHRoZSBidWZmZXIgd2hpY2ggd2VyZSBiYWNrZWQgdXAgb3ZlciBieSBhIGNhbGwgdG8KLSAgLy8gQmFja1VwKCkuICBUaGVzZSBuZWVkIHRvIGJlIHJldHVybmVkIGFnYWluLgotICAvLyAwIDw9IGJhY2t1cF9ieXRlc18gPD0gYnVmZmVyX3VzZWRfCi0gIGludCBiYWNrdXBfYnl0ZXNfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb3B5aW5nSW5wdXRTdHJlYW1BZGFwdG9yKTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gQSBnZW5lcmljIHRyYWRpdGlvbmFsIG91dHB1dCBzdHJlYW0gaW50ZXJmYWNlLgotLy8KLS8vIExvdHMgb2YgdHJhZGl0aW9uYWwgb3V0cHV0IHN0cmVhbXMgKGUuZy4gZmlsZSBkZXNjcmlwdG9ycywgQyBzdGRpbwotLy8gc3RyZWFtcywgYW5kIEMrKyBpb3N0cmVhbXMpIGV4cG9zZSBhbiBpbnRlcmZhY2Ugd2hlcmUgZXZlcnkgd3JpdGUKLS8vIGludm9sdmVzIGNvcHlpbmcgYnl0ZXMgZnJvbSBhIGJ1ZmZlci4gIElmIHlvdSB3YW50IHRvIHRha2Ugc3VjaCBhbgotLy8gaW50ZXJmYWNlIGFuZCBtYWtlIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gYmFzZWQgb24gaXQsIHNpbXBseSBpbXBsZW1lbnQKLS8vIENvcHlpbmdPdXRwdXRTdHJlYW0gYW5kIHRoZW4gdXNlIENvcHlpbmdPdXRwdXRTdHJlYW1BZGFwdG9yLgotLy8KLS8vIENvcHlpbmdPdXRwdXRTdHJlYW0gaW1wbGVtZW50YXRpb25zIHNob3VsZCBhdm9pZCBidWZmZXJpbmcgaWYgcG9zc2libGUuCi0vLyBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvciBkb2VzIGl0cyBvd24gYnVmZmVyaW5nIGFuZCB3aWxsIHdyaXRlIGRhdGEKLS8vIGluIGxhcmdlIGJsb2Nrcy4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb3B5aW5nT3V0cHV0U3RyZWFtIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgfkNvcHlpbmdPdXRwdXRTdHJlYW0oKTsKLQotICAvLyBXcml0ZXMgInNpemUiIGJ5dGVzIGZyb20gdGhlIGdpdmVuIGJ1ZmZlciB0byB0aGUgb3V0cHV0LiAgUmV0dXJucyB0cnVlCi0gIC8vIGlmIHN1Y2Nlc3NmdWwsIGZhbHNlIG9uIGEgd3JpdGUgZXJyb3IuCi0gIHZpcnR1YWwgYm9vbCBXcml0ZShjb25zdCB2b2lkKiBidWZmZXIsIGludCBzaXplKSA9IDA7Ci19OwotCi0vLyBBIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIHdyaXRlcyB0byBhIENvcHlpbmdPdXRwdXRTdHJlYW0uICBUaGlzIGlzCi0vLyB1c2VmdWwgZm9yIGltcGxlbWVudGluZyBaZXJvQ29weU91dHB1dFN0cmVhbXMgdGhhdCB3cml0ZSB0byB0cmFkaXRpb25hbAotLy8gc3RyZWFtcy4gIE5vdGUgdGhhdCB0aGlzIGNsYXNzIGlzIG5vdCByZWFsbHkgemVyby1jb3B5LgotLy8KLS8vIElmIHlvdSB3YW50IHRvIHdyaXRlIHRvIGZpbGUgZGVzY3JpcHRvcnMgb3IgQysrIG9zdHJlYW1zLCB0aGlzIGlzCi0vLyBhbHJlYWR5IGltcGxlbWVudGVkIGZvciB5b3U6ICB1c2UgRmlsZU91dHB1dFN0cmVhbSBvciBPc3RyZWFtT3V0cHV0U3RyZWFtCi0vLyByZXNwZWN0aXZlbHkuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IgOiBwdWJsaWMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlcyBhIHN0cmVhbSB0aGF0IHdyaXRlcyB0byB0aGUgZ2l2ZW4gVW5peCBmaWxlIGRlc2NyaXB0b3IuCi0gIC8vIElmIGEgYmxvY2tfc2l6ZSBpcyBnaXZlbiwgaXQgc3BlY2lmaWVzIHRoZSBzaXplIG9mIHRoZSBidWZmZXJzCi0gIC8vIHRoYXQgc2hvdWxkIGJlIHJldHVybmVkIGJ5IE5leHQoKS4gIE90aGVyd2lzZSwgYSByZWFzb25hYmxlIGRlZmF1bHQKLSAgLy8gaXMgdXNlZC4KLSAgZXhwbGljaXQgQ29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IoQ29weWluZ091dHB1dFN0cmVhbSogY29weWluZ19zdHJlYW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBibG9ja19zaXplID0gLTEpOwotICB+Q29weWluZ091dHB1dFN0cmVhbUFkYXB0b3IoKTsKLQotICAvLyBXcml0ZXMgYWxsIHBlbmRpbmcgZGF0YSB0byB0aGUgdW5kZXJseWluZyBzdHJlYW0uICBSZXR1cm5zIGZhbHNlIGlmIGEKLSAgLy8gd3JpdGUgZXJyb3Igb2NjdXJyZWQgb24gdGhlIHVuZGVybHlpbmcgc3RyZWFtLiAgKFRoZSB1bmRlcmx5aW5nCi0gIC8vIHN0cmVhbSBpdHNlbGYgaXMgbm90IG5lY2Vzc2FyaWx5IGZsdXNoZWQuKQotICBib29sIEZsdXNoKCk7Ci0KLSAgLy8gQ2FsbCBTZXRPd25zQ29weWluZ1N0cmVhbSh0cnVlKSB0byB0ZWxsIHRoZSBDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvciB0bwotICAvLyBkZWxldGUgdGhlIHVuZGVybHlpbmcgQ29weWluZ091dHB1dFN0cmVhbSB3aGVuIGl0IGlzIGRlc3Ryb3llZC4KLSAgdm9pZCBTZXRPd25zQ29weWluZ1N0cmVhbShib29sIHZhbHVlKSB7IG93bnNfY29weWluZ19zdHJlYW1fID0gdmFsdWU7IH0KLQotICAvLyBpbXBsZW1lbnRzIFplcm9Db3B5T3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBib29sIE5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSk7Ci0gIHZvaWQgQmFja1VwKGludCBjb3VudCk7Ci0gIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OwotCi0gcHJpdmF0ZToKLSAgLy8gV3JpdGUgdGhlIGN1cnJlbnQgYnVmZmVyLCBpZiBpdCBpcyBwcmVzZW50LgotICBib29sIFdyaXRlQnVmZmVyKCk7Ci0gIC8vIEluc3VyZXMgdGhhdCBidWZmZXJfIGlzIG5vdCBOVUxMLgotICB2b2lkIEFsbG9jYXRlQnVmZmVySWZOZWVkZWQoKTsKLSAgLy8gRnJlZXMgdGhlIGJ1ZmZlci4KLSAgdm9pZCBGcmVlQnVmZmVyKCk7Ci0KLSAgLy8gVGhlIHVuZGVybHlpbmcgY29weWluZyBzdHJlYW0uCi0gIENvcHlpbmdPdXRwdXRTdHJlYW0qIGNvcHlpbmdfc3RyZWFtXzsKLSAgYm9vbCBvd25zX2NvcHlpbmdfc3RyZWFtXzsKLQotICAvLyBUcnVlIGlmIHdlIGhhdmUgc2VlbiBhIHBlcm1lbmFudCBlcnJvciBmcm9tIHRoZSB1bmRlcmx5aW5nIHN0cmVhbS4KLSAgYm9vbCBmYWlsZWRfOwotCi0gIC8vIFRoZSBjdXJyZW50IHBvc2l0aW9uIG9mIGNvcHlpbmdfc3RyZWFtXywgcmVsYXRpdmUgdG8gdGhlIHBvaW50IHdoZXJlCi0gIC8vIHdlIHN0YXJ0ZWQgd3JpdGluZy4KLSAgaW50NjQgcG9zaXRpb25fOwotCi0gIC8vIERhdGEgaXMgd3JpdHRlbiBmcm9tIHRoaXMgYnVmZmVyLiAgSXQgbWF5IGJlIE5VTEwgaWYgbm8gYnVmZmVyIGlzCi0gIC8vIGN1cnJlbnRseSBpbiB1c2UuICBPdGhlcndpc2UsIGl0IHBvaW50cyB0byBhbiBhcnJheSBvZiBzaXplIGJ1ZmZlcl9zaXplXy4KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXJfOwotICBjb25zdCBpbnQgYnVmZmVyX3NpemVfOwotCi0gIC8vIE51bWJlciBvZiB2YWxpZCBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciAoaS5lLiB0aGUgc2l6ZSBsYXN0Ci0gIC8vIHJldHVybmVkIGJ5IE5leHQoKSkuICBXaGVuIEJhY2tVcCgpIGlzIGNhbGxlZCwgd2UganVzdCByZWR1Y2UgdGhpcy4KLSAgLy8gMCA8PSBidWZmZXJfdXNlZF8gPD0gYnVmZmVyX3NpemVfLgotICBpbnQgYnVmZmVyX3VzZWRfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb3B5aW5nT3V0cHV0U3RyZWFtQWRhcHRvcik7Ci19OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLS8vIG11dGFibGVfc3RyaW5nX2RhdGEoKSBhbmQgYXNfc3RyaW5nX2RhdGEoKSBhcmUgd29ya2Fyb3VuZHMgdG8gaW1wcm92ZQotLy8gdGhlIHBlcmZvcm1hbmNlIG9mIHdyaXRpbmcgbmV3IGRhdGEgdG8gYW4gZXhpc3Rpbmcgc3RyaW5nLiAgVW5mb3J0dW5hdGVseQotLy8gdGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIHN0cmluZyBjbGFzcyBhcmUgc3Vib3B0aW1hbCwgYW5kIHVzaW5nIG1lbWNweSgpCi0vLyBpcyBtaWxkbHkgYW5ub3lpbmcgYmVjYXVzZSBpdCByZXF1aXJlcyBpdHMgcG9pbnRlciBhcmdzIHRvIGJlIG5vbi1OVUxMIGV2ZW4KLS8vIGlmIHdlIGFzayBpdCB0byBjb3B5IDAgYnl0ZXMuICBGdXJ0aGVybW9yZSwgc3RyaW5nX2FzX2FycmF5KCkgaGFzIHRoZQotLy8gcHJvcGVydHkgdGhhdCBpdCBhbHdheXMgcmV0dXJucyBOVUxMIGlmIGl0cyBhcmcgaXMgdGhlIGVtcHR5IHN0cmluZywgZXhhY3RseQotLy8gd2hhdCB3ZSB3YW50IHRvIGF2b2lkIGlmIHdlJ3JlIHVzaW5nIGl0IGluIGNvbmp1bmN0aW9uIHdpdGggbWVtY3B5KCkhCi0vLyBXaXRoIEMrKzExLCB0aGUgZGVzaXJlZCBtZW1jcHkoKSBib2lscyBkb3duIHRvIG1lbWNweSguLi4sICYoKnMpWzBdLCBzaXplKSwKLS8vIHdoZXJlIHMgaXMgYSBzdHJpbmcqLiAgV2l0aG91dCBDKysxMSwgJigqcylbMF0gaXMgbm90IGd1YXJhbnRlZWQgdG8gYmUgc2FmZSwKLS8vIHNvIHdlIHVzZSBzdHJpbmdfYXNfYXJyYXkoKSwgYW5kIGxpdmUgd2l0aCB0aGUgZXh0cmEgbG9naWMgdGhhdCB0ZXN0cyB3aGV0aGVyCi0vLyAqcyBpcyBlbXB0eS4KLQotLy8gUmV0dXJuIGEgcG9pbnRlciB0byBtdXRhYmxlIGNoYXJhY3RlcnMgdW5kZXJseWluZyB0aGUgZ2l2ZW4gc3RyaW5nLiAgVGhlCi0vLyByZXR1cm4gdmFsdWUgaXMgdmFsaWQgdW50aWwgdGhlIG5leHQgdGltZSB0aGUgc3RyaW5nIGlzIHJlc2l6ZWQuICBXZQotLy8gdHJ1c3QgdGhlIGNhbGxlciB0byB0cmVhdCB0aGUgcmV0dXJuIHZhbHVlIGFzIGFuIGFycmF5IG9mIGxlbmd0aCBzLT5zaXplKCkuCi1pbmxpbmUgY2hhciogbXV0YWJsZV9zdHJpbmdfZGF0YShzdHJpbmcqIHMpIHsKLSNpZmRlZiBMQU5HX0NYWDExCi0gIC8vIFRoaXMgc2hvdWxkIGJlIHNpbXBsZXIgJiBmYXN0ZXIgdGhhbiBzdHJpbmdfYXNfYXJyYXkoKSBiZWNhdXNlIHRoZSBsYXR0ZXIKLSAgLy8gaXMgZ3VhcmFudGVlZCB0byByZXR1cm4gTlVMTCB3aGVuICpzIGlzIGVtcHR5LCBzbyBpdCBoYXMgdG8gY2hlY2sgZm9yIHRoYXQuCi0gIHJldHVybiAmKCpzKVswXTsKLSNlbHNlCi0gIHJldHVybiBzdHJpbmdfYXNfYXJyYXkocyk7Ci0jZW5kaWYKLX0KLQotLy8gYXNfc3RyaW5nX2RhdGEocykgaXMgZXF1aXZhbGVudCB0bwotLy8gICh7IGNoYXIqIHAgPSBtdXRhYmxlX3N0cmluZ19kYXRhKHMpOyBtYWtlX3BhaXIocCwgcCAhPSBOVUxMKTsgfSkKLS8vIFNvbWV0aW1lcyBpdCdzIGZhc3RlcjogaW4gc29tZSBzY2VuYXJpb3MgcCBjYW5ub3QgYmUgTlVMTCwgYW5kIHRoZW4gdGhlCi0vLyBjb2RlIGNhbiBhdm9pZCB0aGF0IGNoZWNrLgotaW5saW5lIHN0ZDo6cGFpcjxjaGFyKiwgYm9vbD4gYXNfc3RyaW5nX2RhdGEoc3RyaW5nKiBzKSB7Ci0gIGNoYXIgKnAgPSBtdXRhYmxlX3N0cmluZ19kYXRhKHMpOwotI2lmZGVmIExBTkdfQ1hYMTEKLSAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHAsIHRydWUpOwotI2Vsc2UKLSAgcmV0dXJuIG1ha2VfcGFpcihwLCBwICE9IE5VTEwpOwotI2VuZGlmCi19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbwotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhOWRiODg3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwMDcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRlc3Rpbmcgc3RyYXRlZ3k6ICBGb3IgZWFjaCB0eXBlIG9mIEkvTyAoYXJyYXksIHN0cmluZywgZmlsZSwgZXRjLikgd2UKLS8vIGNyZWF0ZSBhbiBvdXRwdXQgc3RyZWFtIGFuZCB3cml0ZSBzb21lIGRhdGEgdG8gaXQsIHRoZW4gY3JlYXRlIGEKLS8vIGNvcnJlc3BvbmRpbmcgaW5wdXQgc3RyZWFtIHRvIHJlYWQgdGhlIHNhbWUgZGF0YSBiYWNrIGFuZCBleHBlY3QgaXQgdG8KLS8vIG1hdGNoLiAgV2hlbiB0aGUgZGF0YSBpcyB3cml0dGVuLCBpdCBpcyB3cml0dGVuIGluIHNldmVyYWwgc21hbGwgY2h1bmtzCi0vLyBvZiB2YXJ5aW5nIHNpemVzLCB3aXRoIGEgQmFja1VwKCkgYWZ0ZXIgZWFjaCBjaHVuay4gIEl0IGlzIHJlYWQgYmFjawotLy8gc2ltaWxhcmx5LCBidXQgd2l0aCBjaHVua3Mgc2VwYXJhdGVkIGF0IGRpZmZlcmVudCBwb2ludHMuICBUaGUgd2hvbGUKLS8vIHByb2Nlc3MgaXMgcnVuIHdpdGggYSB2YXJpZXR5IG9mIGJsb2NrIHNpemVzIGZvciBib3RoIHRoZSBpbnB1dCBhbmQKLS8vIHRoZSBvdXRwdXQuCi0vLwotLy8gVE9ETyhrZW50b24pOiAgUmV3cml0ZSB0aGlzIHRlc3QgdG8gYnJpbmcgaXQgdXAgdG8gdGhlIHN0YW5kYXJkcyBvZiBhbGwKLS8vICAgdGhlIG90aGVyIHByb3RvMiB0ZXN0cy4gIE1heSB3YW50IHRvIHdhaXQgZm9yIGdUZXN0IHRvIGltcGxlbWVudAotLy8gICAicGFyYW1ldGl6ZWQgdGVzdHMiIHNvIHRoYXQgb25lIHNldCBvZiB0ZXN0cyBjYW4gYmUgdXNlZCBvbiBhbGwgdGhlCi0vLyAgIGltcGxlbWVudGF0aW9ucy4KLQotCi0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlIDxpby5oPgotI2Vsc2UKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLSNpbmNsdWRlIDxzc3RyZWFtPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0KLSNpZiBIQVZFX1pMSUIKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KLSNlbmRpZgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW8gewotbmFtZXNwYWNlIHsKLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBwaXBlKGZkcykgX3BpcGUoZmRzLCA0MDk2LCBPX0JJTkFSWSkKLSNlbmRpZgotCi0jaWZuZGVmIE9fQklOQVJZCi0jaWZkZWYgX09fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQotI2Vsc2UKLSNkZWZpbmUgT19CSU5BUlkgMCAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgcGxhdGZvcm0gZG9lc24ndCBuZWVkIGl0LgotI2VuZGlmCi0jZW5kaWYKLQotY2xhc3MgSW9UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgLy8gVGVzdCBoZWxwZXJzLgotCi0gIC8vIEhlbHBlciB0byB3cml0ZSBhbiBhcnJheSBvZiBkYXRhIHRvIGFuIG91dHB1dCBzdHJlYW0uCi0gIGJvb2wgV3JpdGVUb091dHB1dChaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7Ci0gIC8vIEhlbHBlciB0byByZWFkIGEgZml4ZWQtbGVuZ3RoIGFycmF5IG9mIGRhdGEgZnJvbSBhbiBpbnB1dCBzdHJlYW0uCi0gIGludCBSZWFkRnJvbUlucHV0KFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7Ci0gIC8vIFdyaXRlIGEgc3RyaW5nIHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICB2b2lkIFdyaXRlU3RyaW5nKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsIGNvbnN0IHN0cmluZyYgc3RyKTsKLSAgLy8gUmVhZCBhIG51bWJlciBvZiBieXRlcyBlcXVhbCB0byB0aGUgc2l6ZSBvZiB0aGUgZ2l2ZW4gc3RyaW5nIGFuZCBjaGVja3MKLSAgLy8gdGhhdCBpdCBtYXRjaGVzIHRoZSBzdHJpbmcuCi0gIHZvaWQgUmVhZFN0cmluZyhaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgY29uc3Qgc3RyaW5nJiBzdHIpOwotICAvLyBXcml0ZXMgc29tZSB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtIGluIGEgcGFydGljdWxhciBvcmRlci4gIFJldHVybnMKLSAgLy8gdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuLCBpbmNhc2UgdGhlIGNhbGxlciBuZWVkcyB0aGF0IHRvIHNldCB1cCBhbgotICAvLyBpbnB1dCBzdHJlYW0uCi0gIGludCBXcml0ZVN0dWZmKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotICAvLyBSZWFkcyB0ZXh0IGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCBleHBlY3RzIGl0IHRvIG1hdGNoIHdoYXQKLSAgLy8gV3JpdGVTdHVmZigpIHdyaXRlcy4KLSAgdm9pZCBSZWFkU3R1ZmYoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOwotCi0gIC8vIFNpbWlsYXIgdG8gV3JpdGVTdHVmZiwgYnV0IHBlcmZvcm1zIG1vcmUgc29waGlzdGljYXRlZCB0ZXN0aW5nLgotICBpbnQgV3JpdGVTdHVmZkxhcmdlKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotICAvLyBSZWFkcyBhbmQgdGVzdHMgYSBzdHJlYW0gdGhhdCBzaG91bGQgaGF2ZSBiZWVuIHdyaXR0ZW4gdG8KLSAgLy8gdmlhIFdyaXRlU3R1ZmZMYXJnZSgpLgotICB2b2lkIFJlYWRTdHVmZkxhcmdlKFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKLQotI2lmIEhBVkVfWkxJQgotICBzdHJpbmcgQ29tcHJlc3MoY29uc3Qgc3RyaW5nJiBkYXRhLCBjb25zdCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zJiBvcHRpb25zKTsKLSAgc3RyaW5nIFVuY29tcHJlc3MoY29uc3Qgc3RyaW5nJiBkYXRhKTsKLSNlbmRpZgotCi0gIHN0YXRpYyBjb25zdCBpbnQga0Jsb2NrU2l6ZXNbXTsKLSAgc3RhdGljIGNvbnN0IGludCBrQmxvY2tTaXplQ291bnQ7Ci19OwotCi1jb25zdCBpbnQgSW9UZXN0OjprQmxvY2tTaXplc1tdID0gey0xLCAxLCAyLCA1LCA3LCAxMCwgMjMsIDY0fTsKLWNvbnN0IGludCBJb1Rlc3Q6OmtCbG9ja1NpemVDb3VudCA9IEdPT0dMRV9BUlJBWVNJWkUoSW9UZXN0OjprQmxvY2tTaXplcyk7Ci0KLWJvb2wgSW9UZXN0OjpXcml0ZVRvT3V0cHV0KFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgewotICBjb25zdCB1aW50OCogaW4gPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZGF0YSk7Ci0gIGludCBpbl9zaXplID0gc2l6ZTsKLQotICB2b2lkKiBvdXQ7Ci0gIGludCBvdXRfc2l6ZTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmICghb3V0cHV0LT5OZXh0KCZvdXQsICZvdXRfc2l6ZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgRVhQRUNUX0dUKG91dF9zaXplLCAwKTsKLQotICAgIGlmIChpbl9zaXplIDw9IG91dF9zaXplKSB7Ci0gICAgICBtZW1jcHkob3V0LCBpbiwgaW5fc2l6ZSk7Ci0gICAgICBvdXRwdXQtPkJhY2tVcChvdXRfc2l6ZSAtIGluX3NpemUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgbWVtY3B5KG91dCwgaW4sIG91dF9zaXplKTsKLSAgICBpbiArPSBvdXRfc2l6ZTsKLSAgICBpbl9zaXplIC09IG91dF9zaXplOwotICB9Ci19Ci0KLSNkZWZpbmUgTUFYX1JFUEVBVEVEX1pFUk9TIDEwMAotCi1pbnQgSW9UZXN0OjpSZWFkRnJvbUlucHV0KFplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgewotICB1aW50OCogb3V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGRhdGEpOwotICBpbnQgb3V0X3NpemUgPSBzaXplOwotCi0gIGNvbnN0IHZvaWQqIGluOwotICBpbnQgaW5fc2l6ZSA9IDA7Ci0KLSAgaW50IHJlcGVhdGVkX3plcm9zID0gMDsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGlmICghaW5wdXQtPk5leHQoJmluLCAmaW5fc2l6ZSkpIHsKLSAgICAgIHJldHVybiBzaXplIC0gb3V0X3NpemU7Ci0gICAgfQotICAgIEVYUEVDVF9HVChpbl9zaXplLCAtMSk7Ci0gICAgaWYgKGluX3NpemUgPT0gMCkgewotICAgICAgcmVwZWF0ZWRfemVyb3MrKzsKLSAgICB9IGVsc2UgewotICAgICAgcmVwZWF0ZWRfemVyb3MgPSAwOwotICAgIH0KLSAgICBFWFBFQ1RfTFQocmVwZWF0ZWRfemVyb3MsIE1BWF9SRVBFQVRFRF9aRVJPUyk7Ci0KLSAgICBpZiAob3V0X3NpemUgPD0gaW5fc2l6ZSkgewotICAgICAgbWVtY3B5KG91dCwgaW4sIG91dF9zaXplKTsKLSAgICAgIGlmIChpbl9zaXplID4gb3V0X3NpemUpIHsKLSAgICAgICAgaW5wdXQtPkJhY2tVcChpbl9zaXplIC0gb3V0X3NpemUpOwotICAgICAgfQotICAgICAgcmV0dXJuIHNpemU7ICAvLyBDb3BpZWQgYWxsIG9mIGl0LgotICAgIH0KLQotICAgIG1lbWNweShvdXQsIGluLCBpbl9zaXplKTsKLSAgICBvdXQgKz0gaW5fc2l6ZTsKLSAgICBvdXRfc2l6ZSAtPSBpbl9zaXplOwotICB9Ci19Ci0KLXZvaWQgSW9UZXN0OjpXcml0ZVN0cmluZyhaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjb25zdCBzdHJpbmcmIHN0cikgewotICBFWFBFQ1RfVFJVRShXcml0ZVRvT3V0cHV0KG91dHB1dCwgc3RyLmNfc3RyKCksIHN0ci5zaXplKCkpKTsKLX0KLQotdm9pZCBJb1Rlc3Q6OlJlYWRTdHJpbmcoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjaGFyPiBidWZmZXIobmV3IGNoYXJbc3RyLnNpemUoKSArIDFdKTsKLSAgYnVmZmVyW3N0ci5zaXplKCldID0gJ1wwJzsKLSAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsIGJ1ZmZlci5nZXQoKSwgc3RyLnNpemUoKSksIHN0ci5zaXplKCkpOwotICBFWFBFQ1RfU1RSRVEoc3RyLmNfc3RyKCksIGJ1ZmZlci5nZXQoKSk7Ci19Ci0KLWludCBJb1Rlc3Q6OldyaXRlU3R1ZmYoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVN0cmluZyhvdXRwdXQsICJIZWxsbyB3b3JsZCFcbiIpOwotICBXcml0ZVN0cmluZyhvdXRwdXQsICJTb21lIHRlIik7Ci0gIFdyaXRlU3RyaW5nKG91dHB1dCwgInh0LiAgQmxhaCBibGFoLiIpOwotICBXcml0ZVN0cmluZyhvdXRwdXQsICJhYmNkZWZnIik7Ci0gIFdyaXRlU3RyaW5nKG91dHB1dCwgIjAxMjM0NTY3ODkwMTIzNDU2Nzg5Iik7Ci0gIFdyaXRlU3RyaW5nKG91dHB1dCwgImZvb2JhciIpOwotCi0gIEVYUEVDVF9FUShvdXRwdXQtPkJ5dGVDb3VudCgpLCA2OCk7Ci0KLSAgaW50IHJlc3VsdCA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIFJlYWRzIHRleHQgZnJvbSBhbiBpbnB1dCBzdHJlYW0gYW5kIGV4cGVjdHMgaXQgdG8gbWF0Y2ggd2hhdCBXcml0ZVN0dWZmKCkKLS8vIHdyaXRlcy4KLXZvaWQgSW9UZXN0OjpSZWFkU3R1ZmYoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgUmVhZFN0cmluZyhpbnB1dCwgIkhlbGxvIHdvcmxkIVxuIik7Ci0gIFJlYWRTdHJpbmcoaW5wdXQsICJTb21lIHRleHQuICAiKTsKLSAgUmVhZFN0cmluZyhpbnB1dCwgIkJsYWggIik7Ci0gIFJlYWRTdHJpbmcoaW5wdXQsICJibGFoLiIpOwotICBSZWFkU3RyaW5nKGlucHV0LCAiYWJjZGVmZyIpOwotICBFWFBFQ1RfVFJVRShpbnB1dC0+U2tpcCgyMCkpOwotICBSZWFkU3RyaW5nKGlucHV0LCAiZm9vIik7Ci0gIFJlYWRTdHJpbmcoaW5wdXQsICJiYXIiKTsKLQotICBFWFBFQ1RfRVEoaW5wdXQtPkJ5dGVDb3VudCgpLCA2OCk7Ci0KLSAgdWludDggYnl0ZTsKLSAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsICZieXRlLCAxKSwgMCk7Ci19Ci0KLWludCBJb1Rlc3Q6OldyaXRlU3R1ZmZMYXJnZShaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlU3RyaW5nKG91dHB1dCwgIkhlbGxvIHdvcmxkIVxuIik7Ci0gIFdyaXRlU3RyaW5nKG91dHB1dCwgIlNvbWUgdGUiKTsKLSAgV3JpdGVTdHJpbmcob3V0cHV0LCAieHQuICBCbGFoIGJsYWguIik7Ci0gIFdyaXRlU3RyaW5nKG91dHB1dCwgc3RyaW5nKDEwMDAwMCwgJ3gnKSk7ICAvLyBBIHZlcnkgbG9uZyBzdHJpbmcKLSAgV3JpdGVTdHJpbmcob3V0cHV0LCBzdHJpbmcoMTAwMDAwLCAneScpKTsgIC8vIEEgdmVyeSBsb25nIHN0cmluZwotICBXcml0ZVN0cmluZyhvdXRwdXQsICIwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCi0gIEVYUEVDVF9FUShvdXRwdXQtPkJ5dGVDb3VudCgpLCAyMDAwNTUpOwotCi0gIGludCByZXN1bHQgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBSZWFkcyB0ZXh0IGZyb20gYW4gaW5wdXQgc3RyZWFtIGFuZCBleHBlY3RzIGl0IHRvIG1hdGNoIHdoYXQgV3JpdGVTdHVmZigpCi0vLyB3cml0ZXMuCi12b2lkIElvVGVzdDo6UmVhZFN0dWZmTGFyZ2UoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgUmVhZFN0cmluZyhpbnB1dCwgIkhlbGxvIHdvcmxkIVxuU29tZSB0ZXh0LiAgIik7Ci0gIEVYUEVDVF9UUlVFKGlucHV0LT5Ta2lwKDUpKTsKLSAgUmVhZFN0cmluZyhpbnB1dCwgImJsYWguIik7Ci0gIEVYUEVDVF9UUlVFKGlucHV0LT5Ta2lwKDEwMDAwMCAtIDEwKSk7Ci0gIFJlYWRTdHJpbmcoaW5wdXQsIHN0cmluZygxMCwgJ3gnKSArIHN0cmluZygxMDAwMDAgLSAyMDAwMCwgJ3knKSk7Ci0gIEVYUEVDVF9UUlVFKGlucHV0LT5Ta2lwKDIwMDAwIC0gMTApKTsKLSAgUmVhZFN0cmluZyhpbnB1dCwgInl5eXl5eXl5eXkwMTIzNDU2Nzg5MDEyMzQ1Njc4OSIpOwotCi0gIEVYUEVDVF9FUShpbnB1dC0+Qnl0ZUNvdW50KCksIDIwMDA1NSk7Ci0KLSAgdWludDggYnl0ZTsKLSAgRVhQRUNUX0VRKFJlYWRGcm9tSW5wdXQoaW5wdXQsICZieXRlLCAxKSwgMCk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVEVTVF9GKElvVGVzdCwgQXJyYXlJbykgewotICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyNTY7Ci0gIHVpbnQ4IGJ1ZmZlcltrQnVmZmVyU2l6ZV07Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKLSAgICAgIGludCBzaXplOwotICAgICAgewotICAgICAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOwotICAgICAgICBzaXplID0gV3JpdGVTdHVmZigmb3V0cHV0KTsKLSAgICAgIH0KLSAgICAgIHsKLSAgICAgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKLSAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLVRFU1RfRihJb1Rlc3QsIFR3b1Nlc3Npb25Xcml0ZSkgewotICAvLyBUZXN0IHRoYXQgdHdvIGNvbmNhdGVuYXRlZCB3cml0ZSBzZXNzaW9ucyByZWFkIGNvcnJlY3RseQotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBzdHJBID0gIjAxMjM0NTY3ODkiOwotICBzdGF0aWMgY29uc3QgY2hhciogc3RyQiA9ICJXaGlybGVkUGVhcyI7Ci0gIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKLSAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07Ci0gIGNoYXIqIHRlbXBfYnVmZmVyID0gbmV3IGNoYXJbNDBdOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7Ci0gICAgICBBcnJheU91dHB1dFN0cmVhbSogb3V0cHV0ID0KLSAgICAgICAgICBuZXcgQXJyYXlPdXRwdXRTdHJlYW0oYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOwotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShvdXRwdXQpOwotICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKHN0cmxlbihzdHJBKSk7Ci0gICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckEsIHN0cmxlbihzdHJBKSk7Ci0gICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKLSAgICAgIGludDY0IHBvcyA9IG91dHB1dC0+Qnl0ZUNvdW50KCk7Ci0gICAgICBkZWxldGUgb3V0cHV0OwotICAgICAgb3V0cHV0ID0gbmV3IEFycmF5T3V0cHV0U3RyZWFtKAotICAgICAgICAgIGJ1ZmZlciArIHBvcywga0J1ZmZlclNpemUgLSBwb3MsIGtCbG9ja1NpemVzW2ldKTsKLSAgICAgIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShvdXRwdXQpOwotICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKHN0cmxlbihzdHJCKSk7Ci0gICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckIsIHN0cmxlbihzdHJCKSk7Ci0gICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKLSAgICAgIGludDY0IHNpemUgPSBwb3MgKyBvdXRwdXQtPkJ5dGVDb3VudCgpOwotICAgICAgZGVsZXRlIG91dHB1dDsKLQotICAgICAgQXJyYXlJbnB1dFN0cmVhbSogaW5wdXQgPQotICAgICAgICAgIG5ldyBBcnJheUlucHV0U3RyZWFtKGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOwotICAgICAgQ29kZWRJbnB1dFN0cmVhbSogY29kZWRfaW5wdXQgPSBuZXcgQ29kZWRJbnB1dFN0cmVhbShpbnB1dCk7Ci0gICAgICB1aW50MzIgaW5zaXplOwotICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7Ci0gICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckEpLCBpbnNpemUpOwotICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRSYXcodGVtcF9idWZmZXIsIGluc2l6ZSkpOwotICAgICAgRVhQRUNUX0VRKDAsIG1lbWNtcCh0ZW1wX2J1ZmZlciwgc3RyQSwgaW5zaXplKSk7Ci0KLSAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkVmFyaW50MzIoJmluc2l6ZSkpOwotICAgICAgRVhQRUNUX0VRKHN0cmxlbihzdHJCKSwgaW5zaXplKTsKLSAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKLSAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckIsIGluc2l6ZSkpOwotCi0gICAgICBkZWxldGUgY29kZWRfaW5wdXQ7Ci0gICAgICBkZWxldGUgaW5wdXQ7Ci0gICAgfQotICB9Ci0KLSAgZGVsZXRlIFtdIHRlbXBfYnVmZmVyOwotICBkZWxldGUgW10gYnVmZmVyOwotfQotCi0jaWYgSEFWRV9aTElCCi1URVNUX0YoSW9UZXN0LCBHemlwSW8pIHsKLSAgY29uc3QgaW50IGtCdWZmZXJTaXplID0gMioxMDI0OwotICB1aW50OCogYnVmZmVyID0gbmV3IHVpbnQ4W2tCdWZmZXJTaXplXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKLSAgICAgIGZvciAoaW50IHogPSAwOyB6IDwga0Jsb2NrU2l6ZUNvdW50OyB6KyspIHsKLSAgICAgICAgaW50IGd6aXBfYnVmZmVyX3NpemUgPSBrQmxvY2tTaXplc1t6XTsKLSAgICAgICAgaW50IHNpemU7Ci0gICAgICAgIHsKLSAgICAgICAgICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOwotICAgICAgICAgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKLSAgICAgICAgICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OkdaSVA7Ci0gICAgICAgICAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKLSAgICAgICAgICAgIG9wdGlvbnMuYnVmZmVyX3NpemUgPSBnemlwX2J1ZmZlcl9zaXplOwotICAgICAgICAgIH0KLSAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOwotICAgICAgICAgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKLSAgICAgICAgICBnem91dC5DbG9zZSgpOwotICAgICAgICAgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgewotICAgICAgICAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyLCBzaXplLCBrQmxvY2tTaXplc1tqXSk7Ci0gICAgICAgICAgR3ppcElucHV0U3RyZWFtIGd6aW4oCi0gICAgICAgICAgICAgICZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpHWklQLCBnemlwX2J1ZmZlcl9zaXplKTsKLSAgICAgICAgICBSZWFkU3R1ZmYoJmd6aW4pOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIGRlbGV0ZSBbXSBidWZmZXI7Ci19Ci0KLVRFU1RfRihJb1Rlc3QsIEd6aXBJb1dpdGhGbHVzaCkgewotICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7Ci0gIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOwotICAvLyBXZSBzdGFydCB3aXRoIGkgPSA0IGFzIHdlIHdhbnQgYSBibG9jayBzaXplID4gNi4gV2l0aCBibG9jayBzaXplIDw9IDYKLSAgLy8gRmx1c2goKSBmaWxscyB1cCB0aGUgZW50aXJlIDJLIGJ1ZmZlciB3aXRoIGZsdXNoIG1hcmtlcnMgYW5kIHRoZSB0ZXN0Ci0gIC8vIGZhaWxzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgRmx1c2goKSBmb3IgbW9yZSBkZXRhaWwuCi0gIGZvciAoaW50IGkgPSA0OyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7Ci0gICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGtCbG9ja1NpemVDb3VudDsgeisrKSB7Ci0gICAgICAgIGludCBnemlwX2J1ZmZlcl9zaXplID0ga0Jsb2NrU2l6ZXNbel07Ci0gICAgICAgIGludCBzaXplOwotICAgICAgICB7Ci0gICAgICAgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKLSAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7Ci0gICAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpHWklQOwotICAgICAgICAgIGlmIChnemlwX2J1ZmZlcl9zaXplICE9IC0xKSB7Ci0gICAgICAgICAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKLSAgICAgICAgICBXcml0ZVN0dWZmKCZnem91dCk7Ci0gICAgICAgICAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7Ci0gICAgICAgICAgZ3pvdXQuQ2xvc2UoKTsKLSAgICAgICAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOwotICAgICAgICB9Ci0gICAgICAgIHsKLSAgICAgICAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOwotICAgICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKAotICAgICAgICAgICAgICAmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6R1pJUCwgZ3ppcF9idWZmZXJfc2l6ZSk7Ci0gICAgICAgICAgUmVhZFN0dWZmKCZnemluKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotICBkZWxldGUgW10gYnVmZmVyOwotfQotCi1URVNUX0YoSW9UZXN0LCBHemlwSW9Db250aWd1b3VzRmx1c2hlcykgewotICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7Ci0gIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOwotCi0gIGludCBibG9ja19zaXplID0ga0Jsb2NrU2l6ZXNbNF07Ci0gIGludCBnemlwX2J1ZmZlcl9zaXplID0gYmxvY2tfc2l6ZTsKLSAgaW50IHNpemU7Ci0KLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGJsb2NrX3NpemUpOwotICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7Ci0gIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKLSAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKLSAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKLSAgfQotICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOwotICBXcml0ZVN0dWZmKCZnem91dCk7Ci0gIEVYUEVDVF9UUlVFKGd6b3V0LkZsdXNoKCkpOwotICBFWFBFQ1RfVFJVRShnem91dC5GbHVzaCgpKTsKLSAgZ3pvdXQuQ2xvc2UoKTsKLSAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKLQotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwgYmxvY2tfc2l6ZSk7Ci0gIEd6aXBJbnB1dFN0cmVhbSBnemluKAotICAgICAgJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OkdaSVAsIGd6aXBfYnVmZmVyX3NpemUpOwotICBSZWFkU3R1ZmYoJmd6aW4pOwotCi0gIGRlbGV0ZSBbXSBidWZmZXI7Ci19Ci0KLVRFU1RfRihJb1Rlc3QsIEd6aXBJb1JlYWRBZnRlckZsdXNoKSB7Ci0gIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKLSAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07Ci0KLSAgaW50IGJsb2NrX3NpemUgPSBrQmxvY2tTaXplc1s0XTsKLSAgaW50IGd6aXBfYnVmZmVyX3NpemUgPSBibG9ja19zaXplOwotICBpbnQgc2l6ZTsKLSAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGJsb2NrX3NpemUpOwotICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7Ci0gIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKLSAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKLSAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKLSAgfQotCi0gIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7Ci0gIFdyaXRlU3R1ZmYoJmd6b3V0KTsKLSAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7Ci0gIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7Ci0KLSAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGJsb2NrX3NpemUpOwotICBHemlwSW5wdXRTdHJlYW0gZ3ppbigKLSAgICAgICZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpHWklQLCBnemlwX2J1ZmZlcl9zaXplKTsKLSAgUmVhZFN0dWZmKCZnemluKTsKLQotICBnem91dC5DbG9zZSgpOwotCi0gIGRlbGV0ZSBbXSBidWZmZXI7Ci19Ci0KLVRFU1RfRihJb1Rlc3QsIFpsaWJJbykgewotICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7Ci0gIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOwotICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgewotICAgICAgZm9yIChpbnQgeiA9IDA7IHogPCBrQmxvY2tTaXplQ291bnQ7IHorKykgewotICAgICAgICBpbnQgZ3ppcF9idWZmZXJfc2l6ZSA9IGtCbG9ja1NpemVzW3pdOwotICAgICAgICBpbnQgc2l6ZTsKLSAgICAgICAgewotICAgICAgICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplLCBrQmxvY2tTaXplc1tpXSk7Ci0gICAgICAgICAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOwotICAgICAgICAgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6WkxJQjsKLSAgICAgICAgICBpZiAoZ3ppcF9idWZmZXJfc2l6ZSAhPSAtMSkgewotICAgICAgICAgICAgb3B0aW9ucy5idWZmZXJfc2l6ZSA9IGd6aXBfYnVmZmVyX3NpemU7Ci0gICAgICAgICAgfQotICAgICAgICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7Ci0gICAgICAgICAgV3JpdGVTdHVmZigmZ3pvdXQpOwotICAgICAgICAgIGd6b3V0LkNsb3NlKCk7Ci0gICAgICAgICAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKLSAgICAgICAgfQotICAgICAgICB7Ci0gICAgICAgICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGtCbG9ja1NpemVzW2pdKTsKLSAgICAgICAgICBHemlwSW5wdXRTdHJlYW0gZ3ppbigKLSAgICAgICAgICAgICAgJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OlpMSUIsIGd6aXBfYnVmZmVyX3NpemUpOwotICAgICAgICAgIFJlYWRTdHVmZigmZ3ppbik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLSAgZGVsZXRlIFtdIGJ1ZmZlcjsKLX0KLQotVEVTVF9GKElvVGVzdCwgWmxpYklvSW5wdXRBdXRvZGV0ZWN0KSB7Ci0gIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKLSAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07Ci0gIGludCBzaXplOwotICB7Ci0gICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUpOwotICAgIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKLSAgICBvcHRpb25zLmZvcm1hdCA9IEd6aXBPdXRwdXRTdHJlYW06OlpMSUI7Ci0gICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKLSAgICBXcml0ZVN0dWZmKCZnem91dCk7Ci0gICAgZ3pvdXQuQ2xvc2UoKTsKLSAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOwotICB9Ci0gIHsKLSAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSk7Ci0gICAgR3ppcElucHV0U3RyZWFtIGd6aW4oJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OkFVVE8pOwotICAgIFJlYWRTdHVmZigmZ3ppbik7Ci0gIH0KLSAgewotICAgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplKTsKLSAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7Ci0gICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpHWklQOwotICAgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7Ci0gICAgV3JpdGVTdHVmZigmZ3pvdXQpOwotICAgIGd6b3V0LkNsb3NlKCk7Ci0gICAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKLSAgfQotICB7Ci0gICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUpOwotICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpBVVRPKTsKLSAgICBSZWFkU3R1ZmYoJmd6aW4pOwotICB9Ci0gIGRlbGV0ZSBbXSBidWZmZXI7Ci19Ci0KLXN0cmluZyBJb1Rlc3Q6OkNvbXByZXNzKGNvbnN0IHN0cmluZyYgZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMmIG9wdGlvbnMpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgewotICAgIFN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnJlc3VsdCk7Ci0gICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKLSAgICBXcml0ZVRvT3V0cHV0KCZnem91dCwgZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgSW9UZXN0OjpVbmNvbXByZXNzKGNvbnN0IHN0cmluZyYgZGF0YSkgewotICBzdHJpbmcgcmVzdWx0OwotICB7Ci0gICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCk7Ci0gICAgY29uc3Qgdm9pZCogYnVmZmVyOwotICAgIGludCBzaXplOwotICAgIHdoaWxlIChnemluLk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7Ci0gICAgICByZXN1bHQuYXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGJ1ZmZlciksIHNpemUpOwotICAgIH0KLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1URVNUX0YoSW9UZXN0LCBDb21wcmVzc2lvbk9wdGlvbnMpIHsKLSAgLy8gU29tZSBhZC1ob2MgdGVzdGluZyBvZiBjb21wcmVzc2lvbiBvcHRpb25zLgotCi0gIHN0cmluZyBnb2xkZW47Ci0gIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cygKLSAgICAgIFRlc3RTb3VyY2VEaXIoKSArCi0gICAgICAgICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UiLAotICAgICAgJmdvbGRlbiwgdHJ1ZSkpOwotCi0gIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMgb3B0aW9uczsKLSAgc3RyaW5nIGd6aXBfY29tcHJlc3NlZCA9IENvbXByZXNzKGdvbGRlbiwgb3B0aW9ucyk7Ci0KLSAgb3B0aW9ucy5jb21wcmVzc2lvbl9sZXZlbCA9IDA7Ci0gIHN0cmluZyBub3RfY29tcHJlc3NlZCA9IENvbXByZXNzKGdvbGRlbiwgb3B0aW9ucyk7Ci0KLSAgLy8gVHJ5IHpsaWIgY29tcHJlc3Npb24gZm9yIGZ1bi4KLSAgb3B0aW9ucyA9IEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMoKTsKLSAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpaTElCOwotICBzdHJpbmcgemxpYl9jb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBvcHRpb25zKTsKLQotICAvLyBVbmNvbXByZXNzZWQgc2hvdWxkIGJlIGJpZ2dlciB0aGFuIHRoZSBvcmlnaW5hbCBzaW5jZSBpdCBzaG91bGQgaGF2ZSBzb21lCi0gIC8vIHNvcnQgb2YgaGVhZGVyLgotICBFWFBFQ1RfR1Qobm90X2NvbXByZXNzZWQuc2l6ZSgpLCBnb2xkZW4uc2l6ZSgpKTsKLQotICAvLyBIaWdoZXIgY29tcHJlc3Npb24gbGV2ZWxzIHNob3VsZCByZXN1bHQgaW4gc21hbGxlciBzaXplcy4KLSAgRVhQRUNUX0xUKHpsaWJfY29tcHJlc3NlZC5zaXplKCksIG5vdF9jb21wcmVzc2VkLnNpemUoKSk7Ci0KLSAgLy8gWkxJQiBmb3JtYXQgc2hvdWxkIGRpZmZlciBmcm9tIEdaSVAgZm9ybWF0LgotICBFWFBFQ1RfVFJVRSh6bGliX2NvbXByZXNzZWQgIT0gZ3ppcF9jb21wcmVzc2VkKTsKLQotICAvLyBFdmVyeXRoaW5nIHNob3VsZCBkZWNvbXByZXNzIGNvcnJlY3RseS4KLSAgRVhQRUNUX1RSVUUoVW5jb21wcmVzcyhub3RfY29tcHJlc3NlZCkgPT0gZ29sZGVuKTsKLSAgRVhQRUNUX1RSVUUoVW5jb21wcmVzcyhnemlwX2NvbXByZXNzZWQpID09IGdvbGRlbik7Ci0gIEVYUEVDVF9UUlVFKFVuY29tcHJlc3MoemxpYl9jb21wcmVzc2VkKSA9PSBnb2xkZW4pOwotfQotCi1URVNUX0YoSW9UZXN0LCBUd29TZXNzaW9uV3JpdGVHemlwKSB7Ci0gIC8vIFRlc3QgdGhhdCB0d28gY29uY2F0ZW5hdGVkIGd6aXAgc3RyZWFtcyBjYW4gYmUgcmVhZCBjb3JyZWN0bHkKLQotICBzdGF0aWMgY29uc3QgY2hhciogc3RyQSA9ICIwMTIzNDU2Nzg5IjsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIHN0ckIgPSAiUXVpY2tCcm93bkZveCI7Ci0gIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKLSAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07Ci0gIGNoYXIqIHRlbXBfYnVmZmVyID0gbmV3IGNoYXJbNDBdOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7Ci0gICAgICBBcnJheU91dHB1dFN0cmVhbSogb3V0cHV0ID0KLSAgICAgICAgICBuZXcgQXJyYXlPdXRwdXRTdHJlYW0oYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0Jsb2NrU2l6ZXNbaV0pOwotICAgICAgR3ppcE91dHB1dFN0cmVhbSogZ3pvdXQgPSBuZXcgR3ppcE91dHB1dFN0cmVhbShvdXRwdXQpOwotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0qIGNvZGVkX291dHB1dCA9IG5ldyBDb2RlZE91dHB1dFN0cmVhbShnem91dCk7Ci0gICAgICBpbnQzMiBvdXRsZW4gPSBzdHJsZW4oc3RyQSkgKyAxOwotICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVZhcmludDMyKG91dGxlbik7Ci0gICAgICBjb2RlZF9vdXRwdXQtPldyaXRlUmF3KHN0ckEsIG91dGxlbik7Ci0gICAgICBkZWxldGUgY29kZWRfb3V0cHV0OyAgLy8gZmx1c2gKLSAgICAgIGRlbGV0ZSBnem91dDsgIC8vIGZsdXNoCi0gICAgICBpbnQ2NCBwb3MgPSBvdXRwdXQtPkJ5dGVDb3VudCgpOwotICAgICAgZGVsZXRlIG91dHB1dDsKLSAgICAgIG91dHB1dCA9IG5ldyBBcnJheU91dHB1dFN0cmVhbSgKLSAgICAgICAgICBidWZmZXIgKyBwb3MsIGtCdWZmZXJTaXplIC0gcG9zLCBrQmxvY2tTaXplc1tpXSk7Ci0gICAgICBnem91dCA9IG5ldyBHemlwT3V0cHV0U3RyZWFtKG91dHB1dCk7Ci0gICAgICBjb2RlZF9vdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0oZ3pvdXQpOwotICAgICAgb3V0bGVuID0gc3RybGVuKHN0ckIpICsgMTsKLSAgICAgIGNvZGVkX291dHB1dC0+V3JpdGVWYXJpbnQzMihvdXRsZW4pOwotICAgICAgY29kZWRfb3V0cHV0LT5Xcml0ZVJhdyhzdHJCLCBvdXRsZW4pOwotICAgICAgZGVsZXRlIGNvZGVkX291dHB1dDsgIC8vIGZsdXNoCi0gICAgICBkZWxldGUgZ3pvdXQ7ICAvLyBmbHVzaAotICAgICAgaW50NjQgc2l6ZSA9IHBvcyArIG91dHB1dC0+Qnl0ZUNvdW50KCk7Ci0gICAgICBkZWxldGUgb3V0cHV0OwotCi0gICAgICBBcnJheUlucHV0U3RyZWFtKiBpbnB1dCA9Ci0gICAgICAgICAgbmV3IEFycmF5SW5wdXRTdHJlYW0oYnVmZmVyLCBzaXplLCBrQmxvY2tTaXplc1tqXSk7Ci0gICAgICBHemlwSW5wdXRTdHJlYW0qIGd6aW4gPSBuZXcgR3ppcElucHV0U3RyZWFtKGlucHV0KTsKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0qIGNvZGVkX2lucHV0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oZ3ppbik7Ci0gICAgICB1aW50MzIgaW5zaXplOwotICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7Ci0gICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckEpICsgMSwgaW5zaXplKTsKLSAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKLSAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckEsIGluc2l6ZSkpCi0gICAgICAgICAgPDwgInN0ckE9IiA8PCBzdHJBIDw8ICIgaW49IiA8PCB0ZW1wX2J1ZmZlcjsKLQotICAgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQtPlJlYWRWYXJpbnQzMigmaW5zaXplKSk7Ci0gICAgICBFWFBFQ1RfRVEoc3RybGVuKHN0ckIpICsgMSwgaW5zaXplKTsKLSAgICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LT5SZWFkUmF3KHRlbXBfYnVmZmVyLCBpbnNpemUpKTsKLSAgICAgIEVYUEVDVF9FUSgwLCBtZW1jbXAodGVtcF9idWZmZXIsIHN0ckIsIGluc2l6ZSkpCi0gICAgICAgICAgPDwgIiBvdXRfYmxvY2tfc2l6ZT0iIDw8IGtCbG9ja1NpemVzW2ldCi0gICAgICAgICAgPDwgIiBpbl9ibG9ja19zaXplPSIgPDwga0Jsb2NrU2l6ZXNbal0KLSAgICAgICAgICA8PCAiIHBvcz0iIDw8IHBvcwotICAgICAgICAgIDw8ICIgc2l6ZT0iIDw8IHNpemUKLSAgICAgICAgICA8PCAiIHN0ckI9IiA8PCBzdHJCIDw8ICIgaW49IiA8PCB0ZW1wX2J1ZmZlcjsKLQotICAgICAgZGVsZXRlIGNvZGVkX2lucHV0OwotICAgICAgZGVsZXRlIGd6aW47Ci0gICAgICBkZWxldGUgaW5wdXQ7Ci0gICAgfQotICB9Ci0KLSAgZGVsZXRlIFtdIHRlbXBfYnVmZmVyOwotICBkZWxldGUgW10gYnVmZmVyOwotfQotCi1URVNUX0YoSW9UZXN0LCBHemlwSW5wdXRCeXRlQ291bnRBZnRlckNsb3NlZCkgewotICBzdHJpbmcgZ29sZGVuID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLSAgc3RyaW5nIGNvbXByZXNzZWQgPSBDb21wcmVzcyhnb2xkZW4sIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMoKSk7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgewotICAgIEFycmF5SW5wdXRTdHJlYW0gYXJyX2lucHV0KGNvbXByZXNzZWQuZGF0YSgpLCBjb21wcmVzc2VkLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc1tpXSk7Ci0gICAgR3ppcElucHV0U3RyZWFtIGd6X2lucHV0KCZhcnJfaW5wdXQpOwotICAgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKLSAgICBpbnQgc2l6ZTsKLSAgICB3aGlsZSAoZ3pfaW5wdXQuTmV4dCgmYnVmZmVyLCAmc2l6ZSkpIHsKLSAgICAgIEVYUEVDVF9MRShnel9pbnB1dC5CeXRlQ291bnQoKSwgZ29sZGVuLnNpemUoKSk7Ci0gICAgfQotICAgIEVYUEVDVF9FUShnb2xkZW4uc2l6ZSgpLCBnel9pbnB1dC5CeXRlQ291bnQoKSk7Ci0gIH0KLX0KLQotVEVTVF9GKElvVGVzdCwgR3ppcElucHV0Qnl0ZUNvdW50QWZ0ZXJDbG9zZWRDb25jYXRlbmF0ZWRTdHJlYW1zKSB7Ci0gIHN0cmluZyBnb2xkZW4xID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKLSAgc3RyaW5nIGdvbGRlbjIgPSAidGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyI7Ci0gIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0gZ29sZGVuMS5zaXplKCkgKyBnb2xkZW4yLnNpemUoKTsKLSAgc3RyaW5nIGNvbXByZXNzZWQgPSBDb21wcmVzcyhnb2xkZW4xLCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zKCkpICsKLSAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzcyhnb2xkZW4yLCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zKCkpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKLSAgICBBcnJheUlucHV0U3RyZWFtIGFycl9pbnB1dChjb21wcmVzc2VkLmRhdGEoKSwgY29tcHJlc3NlZC5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNbaV0pOwotICAgIEd6aXBJbnB1dFN0cmVhbSBnel9pbnB1dCgmYXJyX2lucHV0KTsKLSAgICBjb25zdCB2b2lkKiBidWZmZXI7Ci0gICAgaW50IHNpemU7Ci0gICAgd2hpbGUgKGd6X2lucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7Ci0gICAgICBFWFBFQ1RfTEUoZ3pfaW5wdXQuQnl0ZUNvdW50KCksIHRvdGFsX3NpemUpOwotICAgIH0KLSAgICBFWFBFQ1RfRVEodG90YWxfc2l6ZSwgZ3pfaW5wdXQuQnl0ZUNvdW50KCkpOwotICB9Ci19Ci0jZW5kaWYKLQotLy8gVGhlcmUgaXMgbm8gc3RyaW5nIGlucHV0LCBvbmx5IHN0cmluZyBvdXRwdXQuICBBbHNvLCBpdCBkb2Vzbid0IHN1cHBvcnQKLS8vIGV4cGxpY2l0IGJsb2NrIHNpemVzLiAgU28sIHdlJ2xsIG9ubHkgcnVuIG9uZSB0ZXN0IGFuZCB3ZSdsbCB1c2UKLS8vIEFycmF5SW5wdXQgdG8gcmVhZCBiYWNrIHRoZSByZXN1bHRzLgotVEVTVF9GKElvVGVzdCwgU3RyaW5nSW8pIHsKLSAgc3RyaW5nIHN0cjsKLSAgewotICAgIFN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXQoJnN0cik7Ci0gICAgV3JpdGVTdHVmZigmb3V0cHV0KTsKLSAgfQotICB7Ci0gICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpKTsKLSAgICBSZWFkU3R1ZmYoJmlucHV0KTsKLSAgfQotfQotCi0KLS8vIFRvIHRlc3QgZmlsZXMsIHdlIGNyZWF0ZSBhIHRlbXBvcmFyeSBmaWxlLCB3cml0ZSwgcmVhZCwgdHJ1bmNhdGUsIHJlcGVhdC4KLVRFU1RfRihJb1Rlc3QsIEZpbGVJbykgewotICBzdHJpbmcgZmlsZW5hbWUgPSBUZXN0VGVtcERpcigpICsgIi96ZXJvX2NvcHlfc3RyZWFtX3Rlc3RfZmlsZSI7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgewotICAgIGZvciAoaW50IGogPSAwOyBqIDwga0Jsb2NrU2l6ZUNvdW50OyBqKyspIHsKLSAgICAgIC8vIE1ha2UgYSB0ZW1wb3JhcnkgZmlsZS4KLSAgICAgIGludCBmaWxlID0KLSAgICAgICAgb3BlbihmaWxlbmFtZS5jX3N0cigpLCBPX1JEV1IgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNzc3KTsKLSAgICAgIEFTU0VSVF9HRShmaWxlLCAwKTsKLQotICAgICAgewotICAgICAgICBGaWxlT3V0cHV0U3RyZWFtIG91dHB1dChmaWxlLCBrQmxvY2tTaXplc1tpXSk7Ci0gICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIFJld2luZC4KLSAgICAgIEFTU0VSVF9ORShsc2VlayhmaWxlLCAwLCBTRUVLX1NFVCksIChvZmZfdCktMSk7Ci0KLSAgICAgIHsKLSAgICAgICAgRmlsZUlucHV0U3RyZWFtIGlucHV0KGZpbGUsIGtCbG9ja1NpemVzW2pdKTsKLSAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKLSAgICAgIH0KLQotICAgICAgY2xvc2UoZmlsZSk7Ci0gICAgfQotICB9Ci19Ci0KLSNpZiBIQVZFX1pMSUIKLVRFU1RfRihJb1Rlc3QsIEd6aXBGaWxlSW8pIHsKLSAgc3RyaW5nIGZpbGVuYW1lID0gVGVzdFRlbXBEaXIoKSArICIvemVyb19jb3B5X3N0cmVhbV90ZXN0X2ZpbGUiOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKLSAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7Ci0gICAgICAvLyBNYWtlIGEgdGVtcG9yYXJ5IGZpbGUuCi0gICAgICBpbnQgZmlsZSA9Ci0gICAgICAgIG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19SRFdSIHwgT19DUkVBVCB8IE9fVFJVTkMgfCBPX0JJTkFSWSwgMDc3Nyk7Ci0gICAgICBBU1NFUlRfR0UoZmlsZSwgMCk7Ci0gICAgICB7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGUsIGtCbG9ja1NpemVzW2ldKTsKLSAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0KTsKLSAgICAgICAgV3JpdGVTdHVmZkxhcmdlKCZnem91dCk7Ci0gICAgICAgIGd6b3V0LkNsb3NlKCk7Ci0gICAgICAgIG91dHB1dC5GbHVzaCgpOwotICAgICAgICBFWFBFQ1RfRVEoMCwgb3V0cHV0LkdldEVycm5vKCkpOwotICAgICAgfQotCi0gICAgICAvLyBSZXdpbmQuCi0gICAgICBBU1NFUlRfTkUobHNlZWsoZmlsZSwgMCwgU0VFS19TRVQpLCAob2ZmX3QpLTEpOwotCi0gICAgICB7Ci0gICAgICAgIEZpbGVJbnB1dFN0cmVhbSBpbnB1dChmaWxlLCBrQmxvY2tTaXplc1tqXSk7Ci0gICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKCZpbnB1dCk7Ci0gICAgICAgIFJlYWRTdHVmZkxhcmdlKCZnemluKTsKLSAgICAgICAgRVhQRUNUX0VRKDAsIGlucHV0LkdldEVycm5vKCkpOwotICAgICAgfQotCi0gICAgICBjbG9zZShmaWxlKTsKLSAgICB9Ci0gIH0KLX0KLSNlbmRpZgotCi0vLyBNU1ZDIHJhaXNlcyB2YXJpb3VzIGRlYnVnZ2luZyBleGNlcHRpb25zIGlmIHdlIHRyeSB0byB1c2UgYSBmaWxlCi0vLyBkZXNjcmlwdG9yIG9mIC0xLCBkZWZlYXRpbmcgb3VyIHRlc3RzIGJlbG93LiAgVGhpcyBjbGFzcyB3aWxsIGRpc2FibGUKLS8vIHRoZXNlIGRlYnVnIGFzc2VydGlvbnMgd2hpbGUgaW4gc2NvcGUuCi1jbGFzcyBNc3ZjRGVidWdEaXNhYmxlciB7Ci0gcHVibGljOgotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE0MDAKLSAgTXN2Y0RlYnVnRGlzYWJsZXIoKSB7Ci0gICAgb2xkX2hhbmRsZXJfID0gX3NldF9pbnZhbGlkX3BhcmFtZXRlcl9oYW5kbGVyKE15SGFuZGxlcik7Ci0gICAgb2xkX21vZGVfID0gX0NydFNldFJlcG9ydE1vZGUoX0NSVF9BU1NFUlQsIDApOwotICB9Ci0gIH5Nc3ZjRGVidWdEaXNhYmxlcigpIHsKLSAgICBvbGRfaGFuZGxlcl8gPSBfc2V0X2ludmFsaWRfcGFyYW1ldGVyX2hhbmRsZXIob2xkX2hhbmRsZXJfKTsKLSAgICBvbGRfbW9kZV8gPSBfQ3J0U2V0UmVwb3J0TW9kZShfQ1JUX0FTU0VSVCwgb2xkX21vZGVfKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIE15SGFuZGxlcihjb25zdCB3Y2hhcl90ICpleHByLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgd2NoYXJfdCAqZnVuYywKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHdjaGFyX3QgKmZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCBwUmVzZXJ2ZWQpIHsKLSAgICAvLyBkbyBub3RoaW5nCi0gIH0KLQotICBfaW52YWxpZF9wYXJhbWV0ZXJfaGFuZGxlciBvbGRfaGFuZGxlcl87Ci0gIGludCBvbGRfbW9kZV87Ci0jZWxzZQotICAvLyBEdW1teSBjb25zdHJ1Y3RvciBhbmQgZGVzdHJ1Y3RvciB0byBlbnN1cmUgdGhhdCBHQ0MgZG9lc24ndCBjb21wbGFpbgotICAvLyB0aGF0IGRlYnVnX2Rpc2FibGVyIGlzIGFuIHVudXNlZCB2YXJpYWJsZS4KLSAgTXN2Y0RlYnVnRGlzYWJsZXIoKSB7fQotICB+TXN2Y0RlYnVnRGlzYWJsZXIoKSB7fQotI2VuZGlmCi19OwotCi0vLyBUZXN0IHRoYXQgRmlsZUlucHV0U3RyZWFtcyByZXBvcnQgZXJyb3JzIGNvcnJlY3RseS4KLVRFU1RfRihJb1Rlc3QsIEZpbGVSZWFkRXJyb3IpIHsKLSAgTXN2Y0RlYnVnRGlzYWJsZXIgZGVidWdfZGlzYWJsZXI7Ci0KLSAgLy8gLTEgPSBpbnZhbGlkIGZpbGUgZGVzY3JpcHRvci4KLSAgRmlsZUlucHV0U3RyZWFtIGlucHV0KC0xKTsKLQotICBjb25zdCB2b2lkKiBidWZmZXI7Ci0gIGludCBzaXplOwotICBFWFBFQ1RfRkFMU0UoaW5wdXQuTmV4dCgmYnVmZmVyLCAmc2l6ZSkpOwotICBFWFBFQ1RfRVEoRUJBREYsIGlucHV0LkdldEVycm5vKCkpOwotfQotCi0vLyBUZXN0IHRoYXQgRmlsZU91dHB1dFN0cmVhbXMgcmVwb3J0IGVycm9ycyBjb3JyZWN0bHkuCi1URVNUX0YoSW9UZXN0LCBGaWxlV3JpdGVFcnJvcikgewotICBNc3ZjRGVidWdEaXNhYmxlciBkZWJ1Z19kaXNhYmxlcjsKLQotICAvLyAtMSA9IGludmFsaWQgZmlsZSBkZXNjcmlwdG9yLgotICBGaWxlT3V0cHV0U3RyZWFtIGlucHV0KC0xKTsKLQotICB2b2lkKiBidWZmZXI7Ci0gIGludCBzaXplOwotCi0gIC8vIFRoZSBmaXJzdCBjYWxsIHRvIE5leHQoKSBzdWNjZWVkcyBiZWNhdXNlIGl0IGRvZXNuJ3QgaGF2ZSBhbnl0aGluZyB0bwotICAvLyB3cml0ZSB5ZXQuCi0gIEVYUEVDVF9UUlVFKGlucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKTsKLQotICAvLyBTZWNvbmQgY2FsbCBmYWlscy4KLSAgRVhQRUNUX0ZBTFNFKGlucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKTsKLQotICBFWFBFQ1RfRVEoRUJBREYsIGlucHV0LkdldEVycm5vKCkpOwotfQotCi0vLyBQaXBlcyBhcmUgbm90IHNlZWthYmxlLCBzbyBGaWxle0lucHV0LE91dHB1dH1TdHJlYW0gZW5kcyB1cCBkb2luZyBzb21lCi0vLyBkaWZmZXJlbnQgdGhpbmdzIHRvIGhhbmRsZSB0aGVtLiAgV2UnbGwgdGVzdCBieSB3cml0aW5nIHRvIGEgcGlwZSBhbmQKLS8vIHJlYWRpbmcgYmFjayBmcm9tIGl0LgotVEVTVF9GKElvVGVzdCwgUGlwZUlvKSB7Ci0gIGludCBmaWxlc1syXTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgewotICAgICAgLy8gTmVlZCB0byBjcmVhdGUgYSBuZXcgcGlwZSBlYWNoIHRpbWUgYmVjYXVzZSBSZWFkU3R1ZmYoKSBleHBlY3RzCi0gICAgICAvLyB0byBzZWUgRU9GIGF0IHRoZSBlbmQuCi0gICAgICBBU1NFUlRfRVEocGlwZShmaWxlcyksIDApOwotCi0gICAgICB7Ci0gICAgICAgIEZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVzWzFdLCBrQmxvY2tTaXplc1tpXSk7Ci0gICAgICAgIFdyaXRlU3R1ZmYoJm91dHB1dCk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBvdXRwdXQuR2V0RXJybm8oKSk7Ci0gICAgICB9Ci0gICAgICBjbG9zZShmaWxlc1sxXSk7ICAvLyBTZW5kIEVPRi4KLQotICAgICAgewotICAgICAgICBGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZXNbMF0sIGtCbG9ja1NpemVzW2pdKTsKLSAgICAgICAgUmVhZFN0dWZmKCZpbnB1dCk7Ci0gICAgICAgIEVYUEVDVF9FUSgwLCBpbnB1dC5HZXRFcnJubygpKTsKLSAgICAgIH0KLSAgICAgIGNsb3NlKGZpbGVzWzBdKTsKLSAgICB9Ci0gIH0KLX0KLQotLy8gVGVzdCB1c2luZyBDKysgaW9zdHJlYW1zLgotVEVTVF9GKElvVGVzdCwgSW9zdHJlYW1JbykgewotICBmb3IgKGludCBpID0gMDsgaSA8IGtCbG9ja1NpemVDb3VudDsgaSsrKSB7Ci0gICAgZm9yIChpbnQgaiA9IDA7IGogPCBrQmxvY2tTaXplQ291bnQ7IGorKykgewotICAgICAgewotICAgICAgICBzdHJpbmdzdHJlYW0gc3RyZWFtOwotCi0gICAgICAgIHsKLSAgICAgICAgICBPc3RyZWFtT3V0cHV0U3RyZWFtIG91dHB1dCgmc3RyZWFtLCBrQmxvY2tTaXplc1tpXSk7Ci0gICAgICAgICAgV3JpdGVTdHVmZigmb3V0cHV0KTsKLSAgICAgICAgICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLmZhaWwoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB7Ci0gICAgICAgICAgSXN0cmVhbUlucHV0U3RyZWFtIGlucHV0KCZzdHJlYW0sIGtCbG9ja1NpemVzW2pdKTsKLSAgICAgICAgICBSZWFkU3R1ZmYoJmlucHV0KTsKLSAgICAgICAgICBFWFBFQ1RfVFJVRShzdHJlYW0uZW9mKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgc3RyaW5nc3RyZWFtIHN0cmVhbTsKLQotICAgICAgICB7Ci0gICAgICAgICAgT3N0cmVhbU91dHB1dFN0cmVhbSBvdXRwdXQoJnN0cmVhbSwga0Jsb2NrU2l6ZXNbaV0pOwotICAgICAgICAgIFdyaXRlU3R1ZmZMYXJnZSgmb3V0cHV0KTsKLSAgICAgICAgICBFWFBFQ1RfRkFMU0Uoc3RyZWFtLmZhaWwoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICB7Ci0gICAgICAgICAgSXN0cmVhbUlucHV0U3RyZWFtIGlucHV0KCZzdHJlYW0sIGtCbG9ja1NpemVzW2pdKTsKLSAgICAgICAgICBSZWFkU3R1ZmZMYXJnZSgmaW5wdXQpOwotICAgICAgICAgIEVYUEVDVF9UUlVFKHN0cmVhbS5lb2YoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotLy8gVG8gdGVzdCBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0sIHdlIGNyZWF0ZSBzZXZlcmFsIEFycmF5SW5wdXRTdHJlYW1zCi0vLyBjb3ZlcmluZyBhIGJ1ZmZlciBhbmQgdGhlbiBjb25jYXRlbmF0ZSB0aGVtLgotVEVTVF9GKElvVGVzdCwgQ29uY2F0ZW5hdGluZ0lucHV0U3RyZWFtKSB7Ci0gIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDI1NjsKLSAgdWludDggYnVmZmVyW2tCdWZmZXJTaXplXTsKLQotICAvLyBGaWxsIHRoZSBidWZmZXIuCi0gIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplKTsKLSAgV3JpdGVTdHVmZigmb3V0cHV0KTsKLQotICAvLyBOb3cgc3BsaXQgaXQgdXAgaW50byBtdWx0aXBsZSBzdHJlYW1zIG9mIHZhcnlpbmcgc2l6ZXMuCi0gIEFTU0VSVF9FUSg2OCwgb3V0cHV0LkJ5dGVDb3VudCgpKTsgIC8vIFRlc3QgZGVwZW5kcyBvbiB0aGlzLgotICBBcnJheUlucHV0U3RyZWFtIGlucHV0MShidWZmZXIgICAgICwgMTIpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0MihidWZmZXIgKyAxMiwgIDcpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0MyhidWZmZXIgKyAxOSwgIDYpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0NChidWZmZXIgKyAyNSwgMTUpOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0NShidWZmZXIgKyA0MCwgIDApOwotICAvLyBOb3RlOiAgV2Ugd2FudCB0byBtYWtlIHN1cmUgd2UgaGF2ZSBhIHN0cmVhbSBib3VuZGFyeSBzb21ld2hlcmUgYmV0d2VlbgotICAvLyBieXRlcyA0MiBhbmQgNjIsIHdoaWNoIGlzIHRoZSByYW5nZSB0aGF0IGl0IFNraXAoKWVkIGJ5IFJlYWRTdHVmZigpLiAgVGhpcwotICAvLyB0ZXN0cyB0aGF0IGEgYnVnIHRoYXQgZXhpc3RlZCBpbiB0aGUgb3JpZ2luYWwgY29kZSBmb3IgU2tpcCgpIGlzIGZpeGVkLgotICBBcnJheUlucHV0U3RyZWFtIGlucHV0NihidWZmZXIgKyA0MCwgMTApOwotICBBcnJheUlucHV0U3RyZWFtIGlucHV0NyhidWZmZXIgKyA1MCwgMTgpOyAgLy8gVG90YWwgPSA2OCBieXRlcy4KLQotICBaZXJvQ29weUlucHV0U3RyZWFtKiBzdHJlYW1zW10gPQotICAgIHsmaW5wdXQxLCAmaW5wdXQyLCAmaW5wdXQzLCAmaW5wdXQ0LCAmaW5wdXQ1LCAmaW5wdXQ2LCAmaW5wdXQ3fTsKLQotICAvLyBDcmVhdGUgdGhlIGNvbmNhdGVuYXRpbmcgc3RyZWFtIGFuZCByZWFkLgotICBDb25jYXRlbmF0aW5nSW5wdXRTdHJlYW0gaW5wdXQoc3RyZWFtcywgR09PR0xFX0FSUkFZU0laRShzdHJlYW1zKSk7Ci0gIFJlYWRTdHVmZigmaW5wdXQpOwotfQotCi0vLyBUbyB0ZXN0IExpbWl0aW5nSW5wdXRTdHJlYW0sIHdlIHdyaXRlIG91ciBnb2xkZW4gdGV4dCB0byBhIGJ1ZmZlciwgdGhlbgotLy8gY3JlYXRlIGFuIEFycmF5SW5wdXRTdHJlYW0gdGhhdCBjb250YWlucyB0aGUgd2hvbGUgYnVmZmVyIChub3QganVzdCB0aGUKLS8vIGJ5dGVzIHdyaXR0ZW4pLCB0aGVuIHVzZSBhIExpbWl0aW5nSW5wdXRTdHJlYW0gdG8gbGltaXQgaXQganVzdCB0byB0aGUKLS8vIGJ5dGVzIHdyaXR0ZW4uCi1URVNUX0YoSW9UZXN0LCBMaW1pdGluZ0lucHV0U3RyZWFtKSB7Ci0gIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDI1NjsKLSAgdWludDggYnVmZmVyW2tCdWZmZXJTaXplXTsKLQotICAvLyBGaWxsIHRoZSBidWZmZXIuCi0gIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIGtCdWZmZXJTaXplKTsKLSAgV3JpdGVTdHVmZigmb3V0cHV0KTsKLQotICAvLyBTZXQgdXAgaW5wdXQuCi0gIEFycmF5SW5wdXRTdHJlYW0gYXJyYXlfaW5wdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSk7Ci0gIExpbWl0aW5nSW5wdXRTdHJlYW0gaW5wdXQoJmFycmF5X2lucHV0LCBvdXRwdXQuQnl0ZUNvdW50KCkpOwotCi0gIFJlYWRTdHVmZigmaW5wdXQpOwotfQotCi0vLyBDaGVja3MgdGhhdCBCeXRlQ291bnQgd29ya3MgY29ycmVjdGx5IGZvciBMaW1pdGluZ0lucHV0U3RyZWFtcyB3aGVyZSB0aGUKLS8vIHVuZGVybHlpbmcgc3RyZWFtIGhhcyBhbHJlYWR5IGJlZW4gcmVhZC4KLVRFU1RfRihJb1Rlc3QsIExpbWl0aW5nSW5wdXRTdHJlYW1CeXRlQ291bnQpIHsKLSAgY29uc3QgaW50IGtIYWxmQnVmZmVyU2l6ZSA9IDEyODsKLSAgY29uc3QgaW50IGtCdWZmZXJTaXplID0ga0hhbGZCdWZmZXJTaXplICogMjsKLSAgdWludDggYnVmZmVyW2tCdWZmZXJTaXplXTsKLQotICAvLyBTZXQgdXAgaW5wdXQuIE9ubHkgYWxsb3cgaGFsZiB0byBiZSByZWFkIGF0IG9uY2UuCi0gIEFycmF5SW5wdXRTdHJlYW0gYXJyYXlfaW5wdXQoYnVmZmVyLCBrQnVmZmVyU2l6ZSwga0hhbGZCdWZmZXJTaXplKTsKLSAgY29uc3Qgdm9pZCogZGF0YTsKLSAgaW50IHNpemU7Ci0gIEVYUEVDVF9UUlVFKGFycmF5X2lucHV0Lk5leHQoJmRhdGEsICZzaXplKSk7Ci0gIEVYUEVDVF9FUShrSGFsZkJ1ZmZlclNpemUsIGFycmF5X2lucHV0LkJ5dGVDb3VudCgpKTsKLSAgLy8ga0hhbGZCdWZmZXJTaXplIC0gMSB0byB0ZXN0IGxpbWl0aW5nIGxvZ2ljIGFzIHdlbGwuCi0gIExpbWl0aW5nSW5wdXRTdHJlYW0gaW5wdXQoJmFycmF5X2lucHV0LCBrSGFsZkJ1ZmZlclNpemUgLSAxKTsKLSAgRVhQRUNUX0VRKDAsIGlucHV0LkJ5dGVDb3VudCgpKTsKLSAgRVhQRUNUX1RSVUUoaW5wdXQuTmV4dCgmZGF0YSwgJnNpemUpKTsKLSAgRVhQRUNUX0VRKGtIYWxmQnVmZmVyU2l6ZSAtIDEgLCBpbnB1dC5CeXRlQ291bnQoKSk7Ci19Ci0KLS8vIENoZWNrIHRoYXQgYSB6ZXJvLXNpemUgYXJyYXkgZG9lc24ndCBjb25mdXNlIHRoZSBjb2RlLgotVEVTVChaZXJvU2l6ZUFycmF5LCBJbnB1dCkgewotICBBcnJheUlucHV0U3RyZWFtIGlucHV0KE5VTEwsIDApOwotICBjb25zdCB2b2lkKiBkYXRhOwotICBpbnQgc2l6ZTsKLSAgRVhQRUNUX0ZBTFNFKGlucHV0Lk5leHQoJmRhdGEsICZzaXplKSk7Ci19Ci0KLVRFU1QoWmVyb1NpemVBcnJheSwgT3V0cHV0KSB7Ci0gIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChOVUxMLCAwKTsKLSAgdm9pZCogZGF0YTsKLSAgaW50IHNpemU7Ci0gIEVYUEVDVF9GQUxTRShvdXRwdXQuTmV4dCgmZGF0YSwgJnNpemUpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgaW8KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzY2EzZmJhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDcxOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGlvc3RyZWFtPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0KLXVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci0KLW5hbWVzcGFjZSB7Ci0vLyBIZWxwZXIgbWV0aG9kcyB0byB0ZXN0IHBhcnNpbmcgbWVyZ2UgYmVoYXZpb3IuCi12b2lkIEV4cGVjdE1lc3NhZ2VNZXJnZWQoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKLSAgR09PR0xFX0NIRUNLKG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIoKSA9PSAzKTsKLSAgR09PR0xFX0NIRUNLKG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQoKSA9PSAyKTsKLSAgR09PR0xFX0NIRUNLKG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkgPT0gImhlbGxvIik7Ci19Ci0KLXZvaWQgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMoCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzEsCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzIsCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzMpIHsKLSAgbXNnMS0+c2V0X29wdGlvbmFsX2ludDMyKDEpOwotICBtc2cyLT5zZXRfb3B0aW9uYWxfaW50NjQoMik7Ci0gIG1zZzMtPnNldF9vcHRpb25hbF9pbnQzMigzKTsKLSAgbXNnMy0+c2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKLX0KLQotdm9pZCBTZXRBbGxUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygKLSAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUqIGVtcHR5X21lc3NhZ2UpIHsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotICBzdHJpbmcgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgZW1wdHlfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpOwotfQotCi12b2lkIFNldFNvbWVUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygKLSAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUqIGVtcHR5X21lc3NhZ2UpIHsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMTAxKTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50NjQoMTAyKTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfdWludDMyKDEwMyk7Ci0gIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3VpbnQ2NCgxMDQpOwotICBzdHJpbmcgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgZW1wdHlfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotI2RlZmluZSBFWFBFQ1RfVFJVRSBHT09HTEVfQ0hFQ0sKLSNkZWZpbmUgQVNTRVJUX1RSVUUgR09PR0xFX0NIRUNLCi0jZGVmaW5lIEVYUEVDVF9GQUxTRShDT05EKSBHT09HTEVfQ0hFQ0soIShDT05EKSkKLSNkZWZpbmUgRVhQRUNUX0VRIEdPT0dMRV9DSEVDS19FUQotI2RlZmluZSBBU1NFUlRfRVEgR09PR0xFX0NIRUNLX0VRCi0KLWludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgc3RyaW5nIGRhdGEsIGRhdGEyLCBwYWNrZWRfZGF0YTsKLQotICB7Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotICAgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UpOwotICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgbWVzc2FnZTMuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMyk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEZpZWxkcygmbWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOwotICAgIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOwotICB9Ci0KLSAgewotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7Ci0gICAgc3RyaW5nIGV4dGVuc2lvbnNfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBtZXNzYWdlMy5QYXJzZUZyb21TdHJpbmcoZXh0ZW5zaW9uc19kYXRhKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTMpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOwotICAgIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKLSAgfQotCi0gIHsKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMiwgbWVzc2FnZTM7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRDbGVhcihtZXNzYWdlKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OlNldFBhY2tlZEZpZWxkcygmbWVzc2FnZSk7Ci0gICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7Ci0gICAgcGFja2VkX2RhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgbWVzc2FnZTMuUGFyc2VGcm9tU3RyaW5nKHBhY2tlZF9kYXRhKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQobWVzc2FnZTMpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc01vZGlmaWVkKG1lc3NhZ2UpOwotICAgIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKG1lc3NhZ2UpOwotICB9Ci0KLSAgewotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTIsIG1lc3NhZ2UzOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7Ci0gICAgc3RyaW5nIHBhY2tlZF9leHRlbnNpb25zX2RhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgR09PR0xFX0NIRUNLKHBhY2tlZF9leHRlbnNpb25zX2RhdGEgPT0gcGFja2VkX2RhdGEpOwotICAgIG1lc3NhZ2UzLlBhcnNlRnJvbVN0cmluZyhwYWNrZWRfZXh0ZW5zaW9uc19kYXRhKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZTMpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQobWVzc2FnZSk7Ci0gICAgbWVzc2FnZS5DbGVhcigpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOwotICB9Ci0KLSAgewotICAgIC8vIFRlc3QgdGhhdCBpZiBhbiBvcHRpb25hbCBvciByZXF1aXJlZCBtZXNzYWdlL2dyb3VwIGZpZWxkIGFwcGVhcnMgbXVsdGlwbGUKLSAgICAvLyB0aW1lcyBpbiB0aGUgaW5wdXQsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQuCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2VMaXRlOjpSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciBnZW5lcmF0b3I7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzE7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzI7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzM7Ci0KLSNkZWZpbmUgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKEZJRUxEKSAgICAgICAgICAgICAgICBcCi0gIG1zZzEgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgICAgICAgICAgICAgICAgXAotICBtc2cyID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgICAgICAgICAgICAgICAgIFwKLSAgbXNnMyA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICAgICAgICAgICAgICAgICBcCi0gIEFzc2lnblBhcnNpbmdNZXJnZU1lc3NhZ2VzKG1zZzEsIG1zZzIsIG1zZzMpCi0KLSAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQxKTsKLSAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQyKTsKLSAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQzKTsKLSAgICBBU1NJR05fUkVQRUFURURfRklFTEQoZXh0MSk7Ci0gICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGV4dDIpOwotCi0jdW5kZWYgQVNTSUdOX1JFUEVBVEVEX0ZJRUxECi0jZGVmaW5lIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChGSUVMRCkgICAgICAgICAgICAgICAgXAotICBtc2cxID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKLSAgbXNnMiA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCi0gIG1zZzMgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAotICBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcyhtc2cxLCBtc2cyLCBtc2czKQotCi0gICAgQVNTSUdOX1JFUEVBVEVEX0dST1VQKGdyb3VwMSk7Ci0gICAgQVNTSUdOX1JFUEVBVEVEX0dST1VQKGdyb3VwMik7Ci0KLSN1bmRlZiBBU1NJR05fUkVQRUFURURfR1JPVVAKLQotICAgIHN0cmluZyBidWZmZXI7Ci0gICAgZ2VuZXJhdG9yLlNlcmlhbGl6ZVRvU3RyaW5nKCZidWZmZXIpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlTGl0ZSBwYXJzaW5nX21lcmdlOwotICAgIHBhcnNpbmdfbWVyZ2UuUGFyc2VGcm9tU3RyaW5nKGJ1ZmZlcik7Ci0KLSAgICAvLyBSZXF1aXJlZCBhbmQgb3B0aW9uYWwgZmllbGRzIHNob3VsZCBiZSBtZXJnZWQuCi0gICAgRXhwZWN0TWVzc2FnZU1lcmdlZChwYXJzaW5nX21lcmdlLnJlcXVpcmVkX2FsbF90eXBlcygpKTsKLSAgICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxfYWxsX3R5cGVzKCkpOwotICAgIEV4cGVjdE1lc3NhZ2VNZXJnZWQoCi0gICAgICAgIHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxncm91cCgpLm9wdGlvbmFsX2dyb3VwX2FsbF90eXBlcygpKTsKLSAgICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2UuR2V0RXh0ZW5zaW9uKAotICAgICAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZUxpdGU6Om9wdGlvbmFsX2V4dCkpOwotCi0gICAgLy8gUmVwZWF0ZWQgZmllbGRzIHNob3VsZCBub3QgYmUgbWVyZ2VkLgotICAgIEdPT0dMRV9DSEVDSyhwYXJzaW5nX21lcmdlLnJlcGVhdGVkX2FsbF90eXBlc19zaXplKCkgPT0gMyk7Ci0gICAgR09PR0xFX0NIRUNLKHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRncm91cF9zaXplKCkgPT0gMyk7Ci0gICAgR09PR0xFX0NIRUNLKHBhcnNpbmdfbWVyZ2UuRXh0ZW5zaW9uU2l6ZSgKLSAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2VMaXRlOjpyZXBlYXRlZF9leHQpID09IDMpOwotICB9Ci0KLSAgLy8gVGVzdCB1bmtub3duIGZpZWxkcyBzdXBwb3J0IGZvciBsaXRlIG1lc3NhZ2VzLgotICB7Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTI7Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7Ci0gICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKLSAgICBkYXRhLmNsZWFyKCk7Ci0gICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSk7Ci0gICAgZGF0YSA9IG1lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwotICAgIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOwotICB9Ci0KLSAgewotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTI7Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLSAgICBkYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOwotICAgIGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOwotICAgIGRhdGEuY2xlYXIoKTsKLSAgICBkYXRhID0gZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOwotICAgIG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKLSAgICBkYXRhID0gbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwotICAgIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKLSAgfQotCi0gIHsKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMjsKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlfbWVzc2FnZTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKG1lc3NhZ2UpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0UGFja2VkRmllbGRzKCZtZXNzYWdlKTsKLSAgICBkYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOwotICAgIGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOwotICAgIGRhdGEuY2xlYXIoKTsKLSAgICBkYXRhID0gZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOwotICAgIG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKLSAgICBkYXRhID0gbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Ci0gICAgbWVzc2FnZS5DbGVhcigpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkQ2xlYXIobWVzc2FnZSk7Ci0gIH0KLQotICB7Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMjsKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlfbWVzc2FnZTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OlNldFBhY2tlZEV4dGVuc2lvbnMoJm1lc3NhZ2UpOwotICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSk7Ci0gICAgZGF0YS5jbGVhcigpOwotICAgIGRhdGEgPSBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgbWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOwotICAgIGRhdGEgPSBtZXNzYWdlMi5TZXJpYWxpemVBc1N0cmluZygpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Ci0gICAgbWVzc2FnZS5DbGVhcigpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOwotICB9Ci0KLSAgewotICAgIC8vIFRlc3QgVW5rbm93biBmaWVsZHMgc3dhcAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eV9tZXNzYWdlLCBlbXB0eV9tZXNzYWdlMjsKLSAgICBTZXRBbGxUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygmZW1wdHlfbWVzc2FnZSk7Ci0gICAgU2V0U29tZVR5cGVzSW5FbXB0eU1lc3NhZ2VVbmtub3duRmllbGRzKCZlbXB0eV9tZXNzYWdlMik7Ci0gICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBkYXRhMiA9IGVtcHR5X21lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgZW1wdHlfbWVzc2FnZS5Td2FwKCZlbXB0eV9tZXNzYWdlMik7Ci0gICAgR09PR0xFX0NIRUNLX0VRKGRhdGEsIGVtcHR5X21lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOwotICAgIEdPT0dMRV9DSEVDS19FUShkYXRhMiwgZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBUZXN0IHVua25vd24gZmllbGRzIHN3YXAgd2l0aCBzZWxmCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7Ci0gICAgU2V0QWxsVHlwZXNJbkVtcHR5TWVzc2FnZVVua25vd25GaWVsZHMoJmVtcHR5X21lc3NhZ2UpOwotICAgIGRhdGEgPSBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgZW1wdHlfbWVzc2FnZS5Td2FwKCZlbXB0eV9tZXNzYWdlKTsKLSAgICBHT09HTEVfQ0hFQ0tfRVEoZGF0YSwgZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBUZXN0IE1lcmdlRnJvbSB3aXRoIHVua25vd24gZmllbGRzCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTI7Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2UsIGVtcHR5X21lc3NhZ2UyOwotICAgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDMyKDEwMSk7Ci0gICAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW50MzIoMjAxKTsKLSAgICBtZXNzYWdlLnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bShnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaKTsKLSAgICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfaW50NjQoMTAyKTsKLSAgICBtZXNzYWdlMi5hZGRfcmVwZWF0ZWRfaW50NjQoMjAyKTsKLSAgICBtZXNzYWdlMi5zZXRfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaKTsKLQotICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSk7Ci0gICAgZGF0YSA9IG1lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0gICAgZW1wdHlfbWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOwotICAgIG1lc3NhZ2UuTWVyZ2VGcm9tKG1lc3NhZ2UyKTsKLSAgICBlbXB0eV9tZXNzYWdlLk1lcmdlRnJvbShlbXB0eV9tZXNzYWdlMik7Ci0KLSAgICBkYXRhID0gZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOwotICAgIG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKLSAgICAvLyBXZSBkbyBub3QgY29tcGFyZSB0aGUgc2VyaWFsaXplZCBvdXRwdXQgb2YgYSBub3JtYWwgbWVzc2FnZSBhbmQgYSBsaXRlCi0gICAgLy8gbWVzc2FnZSBiZWNhdXNlIHRoZSBvcmRlciBvZiBmaWVsZHMgZG8gbm90IG1hdGNoLiBXZSBjb252ZXJ0IGxpdGUgbWVzc2FnZQotICAgIC8vIGJhY2sgaW50byBub3JtYWwgbWVzc2FnZSwgdGhlbiBjb21wYXJlLgotICAgIEdPT0dMRV9DSEVDS19FUShtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCksIG1lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOwotICB9Ci0KLSAgewotICAgIC8vIFRlc3QgdW5rbm93biBlbnVtIHZhbHVlCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZTsKLSAgICBzdHJpbmcgYnVmZmVyOwotICAgIHsKLSAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYnVmZmVyKTsKLSAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dF9zdHJlYW0pOwotICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZygKLSAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6a09wdGlvbmFsTmVzdGVkRW51bUZpZWxkTnVtYmVyLAotICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAmY29kZWRfb3V0cHV0KTsKLSAgICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyKDEwKTsKLSAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoCi0gICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OmtSZXBlYXRlZE5lc3RlZEVudW1GaWVsZE51bWJlciwKLSAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgJmNvZGVkX291dHB1dCk7Ci0gICAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMigyMCk7Ci0gICAgfQotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJ1ZmZlcik7Ci0gICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBHT09HTEVfQ0hFQ0tfRVEoZGF0YSwgYnVmZmVyKTsKLSAgfQotCi0gIHsKLSAgICAvLyBUZXN0IENsZWFyIHdpdGggdW5rbm93biBmaWVsZHMKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlfbWVzc2FnZTsKLSAgICBTZXRBbGxUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygmZW1wdHlfbWVzc2FnZSk7Ci0gICAgZW1wdHlfbWVzc2FnZS5DbGVhcigpOwotICAgIEdPT0dMRV9DSEVDS19FUSgwLCBlbXB0eV9tZXNzYWdlLnVua25vd25fZmllbGRzKCkuc2l6ZSgpKTsKLSAgfQotCi0gIC8vIFRlc3RzIGZvciBtYXAgbGl0ZSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICB7Ci0gICAgLy8gQWNjZXNzb3JzCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7Ci0KLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZSk7Ci0KLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6Ok1vZGlmeU1hcEZpZWxkcygmbWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKLSAgfQotCi0gIHsKLSAgICAvLyBTZXRNYXBGaWVsZHNJbml0aWFsaXplZAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOwotCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHNJbml0aWFsaXplZCgmbWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXRJbml0aWFsaXplZChtZXNzYWdlKTsKLSAgfQotCi0gIHsKLSAgICAvLyBDbGVhcgotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOwotCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOwotICAgIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UpOwotICB9Ci0KLSAgewotICAgIC8vIENsZWFyTWVzc2FnZU1hcAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZU1hcExpdGUgbWVzc2FnZTsKLQotICAgIC8vIENyZWF0ZXMgYSBUZXN0QWxsVHlwZXMgd2l0aCBkZWZhdWx0IHZhbHVlCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcigKLSAgICAgICAgKCptZXNzYWdlLm11dGFibGVfbWFwX2ludDMyX21lc3NhZ2UoKSlbMF0pOwotICB9Ci0KLSAgewotICAgIC8vIENvcHlGcm9tCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLQotICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7Ci0gICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTEpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKLQotICAgIC8vIENvcHlpbmcgZnJvbSBzZWxmIHNob3VsZCBiZSBhIG5vLW9wLgotICAgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UyKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICB7Ci0gICAgLy8gQ29weUZyb21NZXNzYWdlTWFwCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlTWFwTGl0ZSBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0KLSAgICAoKm1lc3NhZ2UxLm11dGFibGVfbWFwX2ludDMyX21lc3NhZ2UoKSlbMF0uYWRkX3JlcGVhdGVkX2ludDMyKDEwMCk7Ci0gICAgKCptZXNzYWdlMi5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdLmFkZF9yZXBlYXRlZF9pbnQzMigxMDEpOwotCi0gICAgbWVzc2FnZTEuQ29weUZyb20obWVzc2FnZTIpOwotCi0gICAgLy8gQ2hlY2tzIHJlcGVhdGVkIGZpZWxkIGlzIG92ZXJ3cml0dGVuLgotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMS5tYXBfaW50MzJfbWVzc2FnZSgpLmF0KDApLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDEwMSwgbWVzc2FnZTEubWFwX2ludDMyX21lc3NhZ2UoKS5hdCgwKS5yZXBlYXRlZF9pbnQzMigwKSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gU3dhcFdpdGhFbXB0eQotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMSwgbWVzc2FnZTI7Ci0KLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UxKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdENsZWFyKG1lc3NhZ2UyKTsKLQotICAgIG1lc3NhZ2UxLlN3YXAoJm1lc3NhZ2UyKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gU3dhcFdpdGhTZWxmCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7Ci0KLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZSk7Ci0KLSAgICBtZXNzYWdlLlN3YXAoJm1lc3NhZ2UpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOwotICB9Ci0KLSAgewotICAgIC8vIFN3YXBXaXRoT3RoZXIKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTEsIG1lc3NhZ2UyOwotCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTIpOwotICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6TW9kaWZ5TWFwRmllbGRzKCZtZXNzYWdlMik7Ci0KLSAgICBtZXNzYWdlMS5Td2FwKCZtZXNzYWdlMik7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNNb2RpZmllZChtZXNzYWdlMSk7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOwotICB9Ci0KLSAgewotICAgIC8vIENvcHlDb25zdHJ1Y3RvcgotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOwotCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UyKG1lc3NhZ2UxKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICB7Ci0gICAgLy8gQ29weUFzc2lnbm1lbnRPcGVyYXRvcgotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOwotCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UyOwotICAgIG1lc3NhZ2UyID0gbWVzc2FnZTE7Ci0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOwotCi0gICAgLy8gTWFrZSBzdXJlIHRoYXQgc2VsZi1hc3NpZ25tZW50IGRvZXMgc29tZXRoaW5nIHNhbmUuCi0gICAgbWVzc2FnZTIub3BlcmF0b3I9KG1lc3NhZ2UyKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICB7Ci0gICAgLy8gTm9uRW1wdHlNZXJnZUZyb20KLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTEsIG1lc3NhZ2UyOwotCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKLQotICAgIC8vIFRoaXMgZmllbGQgd2lsbCB0ZXN0IG1lcmdpbmcgaW50byBhbiBlbXB0eSBzcG90LgotICAgICgqbWVzc2FnZTIubXV0YWJsZV9tYXBfaW50MzJfaW50MzIoKSlbMV0gPSAxOwotICAgIG1lc3NhZ2UxLm11dGFibGVfbWFwX2ludDMyX2ludDMyKCktPmVyYXNlKDEpOwotCi0gICAgLy8gVGhpcyB0ZXN0cyBvdmVyd3JpdGluZy4KLSAgICAoKm1lc3NhZ2UyLm11dGFibGVfbWFwX2ludDMyX2RvdWJsZSgpKVsxXSA9IDE7Ci0gICAgKCptZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbMV0gPSAyOwotCi0gICAgbWVzc2FnZTEuTWVyZ2VGcm9tKG1lc3NhZ2UyKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gTWVyZ2VGcm9tTWVzc2FnZU1hcAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZU1hcExpdGUgbWVzc2FnZTEsIG1lc3NhZ2UyOwotCi0gICAgKCptZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdLmFkZF9yZXBlYXRlZF9pbnQzMigxMDApOwotICAgICgqbWVzc2FnZTIubXV0YWJsZV9tYXBfaW50MzJfbWVzc2FnZSgpKVswXS5hZGRfcmVwZWF0ZWRfaW50MzIoMTAxKTsKLQotICAgIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7Ci0KLSAgICAvLyBDaGVja3MgcmVwZWF0ZWQgZmllbGQgaXMgb3ZlcndyaXR0ZW4uCi0gICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UxLm1hcF9pbnQzMl9tZXNzYWdlKCkuYXQoMCkucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMTAxLCBtZXNzYWdlMS5tYXBfaW50MzJfbWVzc2FnZSgpLmF0KDApLnJlcGVhdGVkX2ludDMyKDApKTsKLSAgfQotCi0gIHsKLSAgICAvLyBUZXN0IHRoZSBnZW5lcmF0ZWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgpCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgICBzdHJpbmcgZGF0YTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOwotICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKLSAgICBkYXRhLnJlc2l6ZShzaXplKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqPig6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSkpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOwotICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7Ci0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICB7Ci0gICAgLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOwotICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKLSAgICBzdHJpbmcgZGF0YTsKLSAgICBkYXRhLnJlc2l6ZShzaXplKTsKLSAgICB7Ci0gICAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCi0gICAgICBnb29nbGU6OnByb3RvYnVmOjppbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKAotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6c3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7Ci0gICAgICBnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKLSAgICAgIG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7Ci0gICAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKLSAgICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKLSAgICB9Ci0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotCi0gIHsKLSAgICAvLyBQcm90bzJVbmtub3duRW51bQotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW51bU1hcFBsdXNFeHRyYUxpdGUgZnJvbTsKLSAgICAoKmZyb20ubXV0YWJsZV9rbm93bl9tYXBfZmllbGQoKSlbMF0gPQotICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6RV9QUk9UTzJfTUFQX0VOVU1fRk9PX0xJVEU7Ci0gICAgKCpmcm9tLm11dGFibGVfdW5rbm93bl9tYXBfZmllbGQoKSlbMF0gPQotICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6RV9QUk9UTzJfTUFQX0VOVU1fRVhUUkFfTElURTsKLSAgICBzdHJpbmcgZGF0YTsKLSAgICBmcm9tLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLQotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW51bU1hcExpdGUgdG87Ci0gICAgRVhQRUNUX1RSVUUodG8uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEoMCwgdG8udW5rbm93bl9tYXBfZmllbGQoKS5zaXplKCkpOwotICAgIEVYUEVDVF9GQUxTRSh0by5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPmVtcHR5KCkpOwotICAgIEVYUEVDVF9FUSgxLCB0by5rbm93bl9tYXBfZmllbGQoKS5zaXplKCkpOwotICAgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6UFJPVE8yX01BUF9FTlVNX0ZPT19MSVRFLAotICAgICAgICAgICAgICB0by5rbm93bl9tYXBfZmllbGQoKS5hdCgwKSk7Ci0KLSAgICBkYXRhLmNsZWFyKCk7Ci0gICAgZnJvbS5DbGVhcigpOwotICAgIHRvLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLSAgICBFWFBFQ1RfVFJVRShmcm9tLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gICAgRVhQRUNUX0VRKDEsIGZyb20ua25vd25fbWFwX2ZpZWxkKCkuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6OkVfUFJPVE8yX01BUF9FTlVNX0ZPT19MSVRFLAotICAgICAgICAgICAgICBmcm9tLmtub3duX21hcF9maWVsZCgpLmF0KDApKTsKLSAgICBFWFBFQ1RfRVEoMSwgZnJvbS51bmtub3duX21hcF9maWVsZCgpLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpFX1BST1RPMl9NQVBfRU5VTV9FWFRSQV9MSVRFLAotICAgICAgICAgICAgICBmcm9tLnVua25vd25fbWFwX2ZpZWxkKCkuYXQoMCkpOwotICB9Ci0KLSAgewotICAgIC8vIFN0YW5kYXJkV2lyZUZvcm1hdAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOwotICAgIHN0cmluZyBkYXRhID0gIlx4MEFceDA0XHgwOFx4MDFceDEwXHgwMSI7Ci0KLSAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgxKSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gVW5vcmRlcmVkV2lyZUZvcm1hdAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOwotCi0gICAgLy8gcHV0IHZhbHVlIGJlZm9yZSBrZXkgaW4gd2lyZSBmb3JtYXQKLSAgICBzdHJpbmcgZGF0YSA9ICJceDBBXHgwNFx4MTBceDAxXHgwOFx4MDIiOwotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMikpOwotICB9Ci0KLSAgewotICAgIC8vIER1cGxpY2F0ZWRLZXlXaXJlRm9ybWF0Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7Ci0KLSAgICAvLyBUd28ga2V5IGZpZWxkcyBpbiB3aXJlIGZvcm1hdAotICAgIHN0cmluZyBkYXRhID0gIlx4MEFceDA2XHgwOFx4MDFceDA4XHgwMlx4MTBceDAxIjsKLQotICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDIpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBEdXBsaWNhdGVkVmFsdWVXaXJlRm9ybWF0Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7Ci0KLSAgICAvLyBUd28gdmFsdWUgZmllbGRzIGluIHdpcmUgZm9ybWF0Ci0gICAgc3RyaW5nIGRhdGEgPSAiXHgwQVx4MDZceDA4XHgwMVx4MTBceDAxXHgxMFx4MDIiOwotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMSkpOwotICB9Ci0KLSAgewotICAgIC8vIE1pc3NlZEtleVdpcmVGb3JtYXQKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKLQotICAgIC8vIE5vIGtleSBmaWVsZCBpbiB3aXJlIGZvcm1hdAotICAgIHN0cmluZyBkYXRhID0gIlx4MEFceDAyXHgxMFx4MDEiOwotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMCkpOwotICB9Ci0KLSAgewotICAgIC8vIE1pc3NlZFZhbHVlV2lyZUZvcm1hdAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOwotCi0gICAgLy8gTm8gdmFsdWUgZmllbGQgaW4gd2lyZSBmb3JtYXQKLSAgICBzdHJpbmcgZGF0YSA9ICJceDBBXHgwMlx4MDhceDAxIjsKLQotICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOwotICAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDEpKTsKLSAgfQotCi0gIHsKLSAgICAvLyBVbmtub3duRmllbGRXaXJlRm9ybWF0Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7Ci0KLSAgICAvLyBVbmtub3duIGZpZWxkIGluIHdpcmUgZm9ybWF0Ci0gICAgc3RyaW5nIGRhdGEgPSAiXHgwQVx4MDZceDA4XHgwMlx4MTBceDAzXHgxOFx4MDEiOwotCi0gICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7Ci0gICAgRVhQRUNUX0VRKDMsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMikpOwotICB9Ci0KLSAgewotICAgIC8vIENvcnJ1cHRlZFdpcmVGb3JtYXQKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKLQotICAgIC8vIGNvcnJ1cHRlZCBkYXRhIGluIHdpcmUgZm9ybWF0Ci0gICAgc3RyaW5nIGRhdGEgPSAiXHgwQVx4MDZceDA4XHgwMlx4MTFceDAzIjsKLQotICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gSXNJbml0aWFsaXplZAotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UmVxdWlyZWRNZXNzYWdlTWFwTGl0ZSBtYXBfbWVzc2FnZTsKLQotICAgIC8vIEFkZCBhbiB1bmluaXRpYWxpemVkIG1lc3NhZ2UuCi0gICAgKCptYXBfbWVzc2FnZS5tdXRhYmxlX21hcF9maWVsZCgpKVswXTsKLSAgICBFWFBFQ1RfRkFMU0UobWFwX21lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKLQotICAgIC8vIEluaXRpYWxpemUgdW5pbml0aWFsaXplZCBtZXNzYWdlCi0gICAgKCptYXBfbWVzc2FnZS5tdXRhYmxlX21hcF9maWVsZCgpKVswXS5zZXRfYSgwKTsKLSAgICAoKm1hcF9tZXNzYWdlLm11dGFibGVfbWFwX2ZpZWxkKCkpWzBdLnNldF9iKDApOwotICAgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2MoMCk7Ci0gICAgRVhQRUNUX1RSVUUobWFwX21lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHsKLSAgICAgIC8vIENoZWNrIHRoYXQgYWRkaW5nIG1vcmUgdmFsdWVzIHRvIGVudW0gZG9lcyBub3QgY29ycnVwdCBtZXNzYWdlCi0gICAgICAvLyB3aGVuIHBhc3NlZCB0aHJvdWdoIGFuIG9sZCBjbGllbnQuCi0gICAgICBwcm90b2J1Zl91bml0dGVzdDo6VjJNZXNzYWdlTGl0ZSB2Ml9tZXNzYWdlOwotICAgICAgdjJfbWVzc2FnZS5zZXRfaW50X2ZpZWxkKDgwMCk7Ci0gICAgICAvLyBTZXQgZW51bSBmaWVsZCB0byB0aGUgdmFsdWUgbm90IHVuZGVyc3Rvb2QgYnkgdGhlIG9sZCBjbGllbnQuCi0gICAgICB2Ml9tZXNzYWdlLnNldF9lbnVtX2ZpZWxkKHByb3RvYnVmX3VuaXR0ZXN0OjpWMl9TRUNPTkQpOwotICAgICAgc3RyaW5nIHYyX2J5dGVzID0gdjJfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOwotCi0gICAgICBwcm90b2J1Zl91bml0dGVzdDo6VjFNZXNzYWdlTGl0ZSB2MV9tZXNzYWdlOwotICAgICAgdjFfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcodjJfYnl0ZXMpOwotICAgICAgRVhQRUNUX1RSVUUodjFfbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpOwotICAgICAgRVhQRUNUX0VRKHYxX21lc3NhZ2UuaW50X2ZpZWxkKCksIHYyX21lc3NhZ2UuaW50X2ZpZWxkKCkpOwotICAgICAgLy8gVjEgY2xpZW50IGRvZXMgbm90IHVuZGVyc3RhbmQgVjJfU0VDT05EIHZhbHVlLCBzbyBpdCBkaXNjYXJkcyBpdCBhbmQKLSAgICAgIC8vIHVzZXMgZGVmYXVsdCB2YWx1ZSBpbnN0ZWFkLgotICAgICAgRVhQRUNUX0VRKHYxX21lc3NhZ2UuZW51bV9maWVsZCgpLCBwcm90b2J1Zl91bml0dGVzdDo6VjFfRklSU1QpOwotCi0gICAgICAvLyBIb3dldmVyLCB3aGVuIHJlLXNlcmlhbGl6ZWQsIGl0IHNob3VsZCBwcmVzZXJ2ZSBlbnVtIHZhbHVlLgotICAgICAgc3RyaW5nIHYxX2J5dGVzID0gdjFfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOwotCi0gICAgICBwcm90b2J1Zl91bml0dGVzdDo6VjJNZXNzYWdlTGl0ZSBzYW1lX3YyX21lc3NhZ2U7Ci0gICAgICBzYW1lX3YyX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHYxX2J5dGVzKTsKLQotICAgICAgRVhQRUNUX0VRKHYyX21lc3NhZ2UuaW50X2ZpZWxkKCksIHNhbWVfdjJfbWVzc2FnZS5pbnRfZmllbGQoKSk7Ci0gICAgICBFWFBFQ1RfRVEodjJfbWVzc2FnZS5lbnVtX2ZpZWxkKCksIHNhbWVfdjJfbWVzc2FnZS5lbnVtX2ZpZWxkKCkpOwotICB9Ci0KLSAgc3RkOjpjb3V0IDw8ICJQQVNTIiA8PCBzdGQ6OmVuZGw7Ci0gIHJldHVybiAwOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNjJjYTc5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxzdGFjaz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25faW50ZXJuYWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaW5nbGV0b24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKLXVzaW5nIGludGVybmFsOjpSZWZsZWN0aW9uT3BzOwotCi1NZXNzYWdlOjp+TWVzc2FnZSgpIHt9Ci0KLXZvaWQgTWVzc2FnZTo6TWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IEdldERlc2NyaXB0b3IoKTsKLSAgR09PR0xFX0NIRUNLX0VRKGZyb20uR2V0RGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yKQotICAgIDw8ICI6IFRyaWVkIHRvIG1lcmdlIGZyb20gYSBtZXNzYWdlIHdpdGggYSBkaWZmZXJlbnQgdHlwZS4gICIKLSAgICAgICAidG86ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIiwgIgotICAgICAgICJmcm9tOiAiIDw8IGZyb20uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKLSAgUmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7Ci19Ci0KLXZvaWQgTWVzc2FnZTo6Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2VMaXRlJiBvdGhlcikgewotICBNZXJnZUZyb20oKmRvd25fY2FzdDxjb25zdCBNZXNzYWdlKj4oJm90aGVyKSk7Ci19Ci0KLXZvaWQgTWVzc2FnZTo6Q29weUZyb20oY29uc3QgTWVzc2FnZSYgZnJvbSkgewotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0RGVzY3JpcHRvcigpOwotICBHT09HTEVfQ0hFQ0tfRVEoZnJvbS5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpCi0gICAgPDwgIjogVHJpZWQgdG8gY29weSBmcm9tIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IHR5cGUuICIKLSAgICAgICAidG86ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIiwgIgotICAgICAgICJmcm9tOiAiIDw8IGZyb20uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKLSAgUmVmbGVjdGlvbk9wczo6Q29weShmcm9tLCB0aGlzKTsKLX0KLQotc3RyaW5nIE1lc3NhZ2U6OkdldFR5cGVOYW1lKCkgY29uc3QgewotICByZXR1cm4gR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKLX0KLQotdm9pZCBNZXNzYWdlOjpDbGVhcigpIHsKLSAgUmVmbGVjdGlvbk9wczo6Q2xlYXIodGhpcyk7Ci19Ci0KLWJvb2wgTWVzc2FnZTo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgcmV0dXJuIFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQoKnRoaXMpOwotfQotCi12b2lkIE1lc3NhZ2U6OkZpbmRJbml0aWFsaXphdGlvbkVycm9ycyh2ZWN0b3I8c3RyaW5nPiogZXJyb3JzKSBjb25zdCB7Ci0gIHJldHVybiBSZWZsZWN0aW9uT3BzOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKnRoaXMsICIiLCBlcnJvcnMpOwotfQotCi1zdHJpbmcgTWVzc2FnZTo6SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIGNvbnN0IHsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7Ci0gIHJldHVybiBKb2luKGVycm9ycywgIiwgIik7Ci19Ci0KLXZvaWQgTWVzc2FnZTo6Q2hlY2tJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgR09PR0xFX0NIRUNLKElzSW5pdGlhbGl6ZWQoKSkKLSAgICA8PCAiTWVzc2FnZSBvZiB0eXBlIFwiIiA8PCBHZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCi0gICAgPDwgIlwiIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiIDw8IEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKTsKLX0KLQotdm9pZCBNZXNzYWdlOjpEaXNjYXJkVW5rbm93bkZpZWxkcygpIHsKLSAgcmV0dXJuIFJlZmxlY3Rpb25PcHM6OkRpc2NhcmRVbmtub3duRmllbGRzKHRoaXMpOwotfQotCi1ib29sIE1lc3NhZ2U6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgcmV0dXJuIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKGlucHV0LCB0aGlzKTsKLX0KLQotYm9vbCBNZXNzYWdlOjpQYXJzZUZyb21GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSB7Ci0gIGlvOjpGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZV9kZXNjcmlwdG9yKTsKLSAgcmV0dXJuIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCZpbnB1dCkgJiYgaW5wdXQuR2V0RXJybm8oKSA9PSAwOwotfQotCi1ib29sIE1lc3NhZ2U6OlBhcnNlUGFydGlhbEZyb21GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSB7Ci0gIGlvOjpGaWxlSW5wdXRTdHJlYW0gaW5wdXQoZmlsZV9kZXNjcmlwdG9yKTsKLSAgcmV0dXJuIFBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgmaW5wdXQpICYmIGlucHV0LkdldEVycm5vKCkgPT0gMDsKLX0KLQotYm9vbCBNZXNzYWdlOjpQYXJzZUZyb21Jc3RyZWFtKGlzdHJlYW0qIGlucHV0KSB7Ci0gIGlvOjpJc3RyZWFtSW5wdXRTdHJlYW0gemVyb19jb3B5X2lucHV0KGlucHV0KTsKLSAgcmV0dXJuIFBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKCZ6ZXJvX2NvcHlfaW5wdXQpICYmIGlucHV0LT5lb2YoKTsKLX0KLQotYm9vbCBNZXNzYWdlOjpQYXJzZVBhcnRpYWxGcm9tSXN0cmVhbShpc3RyZWFtKiBpbnB1dCkgewotICBpbzo6SXN0cmVhbUlucHV0U3RyZWFtIHplcm9fY29weV9pbnB1dChpbnB1dCk7Ci0gIHJldHVybiBQYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oJnplcm9fY29weV9pbnB1dCkgJiYgaW5wdXQtPmVvZigpOwotfQotCi0KLXZvaWQgTWVzc2FnZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygqdGhpcywgR2V0Q2FjaGVkU2l6ZSgpLCBvdXRwdXQpOwotfQotCi1pbnQgTWVzc2FnZTo6Qnl0ZVNpemUoKSBjb25zdCB7Ci0gIGludCBzaXplID0gV2lyZUZvcm1hdDo6Qnl0ZVNpemUoKnRoaXMpOwotICBTZXRDYWNoZWRTaXplKHNpemUpOwotICByZXR1cm4gc2l6ZTsKLX0KLQotdm9pZCBNZXNzYWdlOjpTZXRDYWNoZWRTaXplKGludCAvKiBzaXplICovKSBjb25zdCB7Ci0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJNZXNzYWdlIGNsYXNzIFwiIiA8PCBHZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCi0gICAgICAgICAgICAgPDwgIlwiIGltcGxlbWVudHMgbmVpdGhlciBTZXRDYWNoZWRTaXplKCkgbm9yIEJ5dGVTaXplKCkuICAiCi0gICAgICAgICAgICAgICAgIk11c3QgaW1wbGVtZW50IG9uZSBvciB0aGUgb3RoZXIuIjsKLX0KLQotaW50IE1lc3NhZ2U6OlNwYWNlVXNlZCgpIGNvbnN0IHsKLSAgcmV0dXJuIEdldFJlZmxlY3Rpb24oKS0+U3BhY2VVc2VkKCp0aGlzKTsKLX0KLQotYm9vbCBNZXNzYWdlOjpTZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKLSAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVfZGVzY3JpcHRvcik7Ci0gIHJldHVybiBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCZvdXRwdXQpOwotfQotCi1ib29sIE1lc3NhZ2U6OlNlcmlhbGl6ZVBhcnRpYWxUb0ZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpIGNvbnN0IHsKLSAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0cHV0KGZpbGVfZGVzY3JpcHRvcik7Ci0gIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgmb3V0cHV0KTsKLX0KLQotYm9vbCBNZXNzYWdlOjpTZXJpYWxpemVUb09zdHJlYW0ob3N0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIHsKLSAgICBpbzo6T3N0cmVhbU91dHB1dFN0cmVhbSB6ZXJvX2NvcHlfb3V0cHV0KG91dHB1dCk7Ci0gICAgaWYgKCFTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCZ6ZXJvX2NvcHlfb3V0cHV0KSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIHJldHVybiBvdXRwdXQtPmdvb2QoKTsKLX0KLQotYm9vbCBNZXNzYWdlOjpTZXJpYWxpemVQYXJ0aWFsVG9Pc3RyZWFtKG9zdHJlYW0qIG91dHB1dCkgY29uc3QgewotICBpbzo6T3N0cmVhbU91dHB1dFN0cmVhbSB6ZXJvX2NvcHlfb3V0cHV0KG91dHB1dCk7Ci0gIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgmemVyb19jb3B5X291dHB1dCk7Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFJlZmxlY3Rpb24gYW5kIGFzc29jaWF0ZWQgVGVtcGxhdGUgU3BlY2lhbGl6YXRpb25zCi0KLVJlZmxlY3Rpb246On5SZWZsZWN0aW9uKCkge30KLQotI2RlZmluZSBIQU5ETEVfVFlQRShUWVBFLCBDUFBUWVBFLCBDVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLXRlbXBsYXRlPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1jb25zdCBSZXBlYXRlZEZpZWxkPFRZUEU+JiBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEZpZWxkPFRZUEU+KCAgICAgICAgXAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsgICAgIFwKLSAgcmV0dXJuICpzdGF0aWNfY2FzdDxSZXBlYXRlZEZpZWxkPFRZUEU+KiA+KCAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZCwgQ1BQVFlQRSwgQ1RZUEUsIE5VTEwpKTsgICAgICAgICAgICAgIFwKLX0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLVJlcGVhdGVkRmllbGQ8VFlQRT4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZEZpZWxkPFRZUEU+KCAgICAgICAgICBcCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeyAgICAgICAgICAgXAotICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUWVBFPiogPiggICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLCBDUFBUWVBFLCBDVFlQRSwgTlVMTCkpOyBcCi19Ci0KLUhBTkRMRV9UWVBFKGludDMyLCAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyLCAgLTEpOwotSEFORExFX1RZUEUoaW50NjQsICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQsICAtMSk7Ci1IQU5ETEVfVFlQRSh1aW50MzIsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzIsIC0xKTsKLUhBTkRMRV9UWVBFKHVpbnQ2NCwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NCwgLTEpOwotSEFORExFX1RZUEUoZmxvYXQsICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQsICAtMSk7Ci1IQU5ETEVfVFlQRShkb3VibGUsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEUsIC0xKTsKLUhBTkRMRV9UWVBFKGJvb2wsICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0wsICAgLTEpOwotCi0KLSN1bmRlZiBIQU5ETEVfVFlQRQotCi12b2lkKiBSZWZsZWN0aW9uOjpNdXRhYmxlUmF3UmVwZWF0ZWRTdHJpbmcoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCBpc19zdHJpbmcpIGNvbnN0IHsKLSAgcmV0dXJuIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLAotICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORywgRmllbGRPcHRpb25zOjpTVFJJTkcsIE5VTEwpOwotfQotCi0KLS8vIERlZmF1bHQgRW51bVZhbHVlIEFQSSBpbXBsZW1lbnRhdGlvbnMuIFJlYWwgcmVmbGVjdGlvbiBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCi0vLyBvdmVycmlkZSB0aGVzZS4gSG93ZXZlciwgdGhlcmUgYXJlIHNldmVyYWwgbGVnYWN5IGltcGxlbWVudGF0aW9ucyB0aGF0IGRvCi0vLyBub3QsIGFuZCBjYW5ub3QgZWFzaWx5IGJlIGNoYW5nZWQgYXQgdGhlIHNhbWUgdGltZSBhcyB0aGUgUmVmbGVjdGlvbiBBUEksIHNvCi0vLyB3ZSBwcm92aWRlIHRoZXNlIGZvciBub3cuCi0vLyBUT0RPOiBSZW1vdmUgdGhlc2Ugb25jZSBhbGwgUmVmbGVjdGlvbiBpbXBsZW1lbnRhdGlvbnMgYXJlIHVwZGF0ZWQuCi1pbnQgUmVmbGVjdGlvbjo6R2V0RW51bVZhbHVlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgRW51bVZhbHVlIEFQSS4iOwotICByZXR1cm4gMDsKLX0KLXZvaWQgUmVmbGVjdGlvbjo6U2V0RW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdCB7Ci0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmltcGxlbWVudGVkIEVudW1WYWx1ZSBBUEkuIjsKLX0KLWludCBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEVudW1WYWx1ZSgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgewotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCBFbnVtVmFsdWUgQVBJLiI7Ci0gIHJldHVybiAwOwotfQotdm9pZCBSZWZsZWN0aW9uOjpTZXRSZXBlYXRlZEVudW1WYWx1ZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0IHsKLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgRW51bVZhbHVlIEFQSS4iOwotfQotdm9pZCBSZWZsZWN0aW9uOjpBZGRFbnVtVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0IHsKLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgRW51bVZhbHVlIEFQSS4iOwotfQotCi1NYXBJdGVyYXRvciBSZWZsZWN0aW9uOjpNYXBCZWdpbigKLSAgICBNZXNzYWdlKiBtZXNzYWdlLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgTWFwIFJlZmxlY3Rpb24gQVBJLiI7Ci0gIE1hcEl0ZXJhdG9yIGl0ZXIobWVzc2FnZSwgZmllbGQpOwotICByZXR1cm4gaXRlcjsKLX0KLQotTWFwSXRlcmF0b3IgUmVmbGVjdGlvbjo6TWFwRW5kKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCBNYXAgUmVmbGVjdGlvbiBBUEkuIjsKLSAgTWFwSXRlcmF0b3IgaXRlcihtZXNzYWdlLCBmaWVsZCk7Ci0gIHJldHVybiBpdGVyOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gTWVzc2FnZUZhY3RvcnkKLQotTWVzc2FnZUZhY3Rvcnk6On5NZXNzYWdlRmFjdG9yeSgpIHt9Ci0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5IDogcHVibGljIE1lc3NhZ2VGYWN0b3J5IHsKLSBwdWJsaWM6Ci0gIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KCk7Ci0gIH5HZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSgpOwotCi0gIHN0YXRpYyBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSogc2luZ2xldG9uKCk7Ci0KLSAgdHlwZWRlZiB2b2lkIFJlZ2lzdHJhdGlvbkZ1bmMoY29uc3Qgc3RyaW5nJik7Ci0gIHZvaWQgUmVnaXN0ZXJGaWxlKGNvbnN0IGNoYXIqIGZpbGUsIFJlZ2lzdHJhdGlvbkZ1bmMqIHJlZ2lzdHJhdGlvbl9mdW5jKTsKLSAgdm9pZCBSZWdpc3RlclR5cGUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlKTsKLQotICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2VGYWN0b3J5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBjb25zdCBNZXNzYWdlKiBHZXRQcm90b3R5cGUoY29uc3QgRGVzY3JpcHRvciogdHlwZSk7Ci0KLSBwcml2YXRlOgotICAvLyBPbmx5IHdyaXR0ZW4gYXQgc3RhdGljIGluaXQgdGltZSwgc28gZG9lcyBub3QgcmVxdWlyZSBsb2NraW5nLgotICBoYXNoX21hcDxjb25zdCBjaGFyKiwgUmVnaXN0cmF0aW9uRnVuYyosCi0gICAgICAgICAgIGhhc2g8Y29uc3QgY2hhcio+LCBzdHJlcT4gZmlsZV9tYXBfOwotCi0gIC8vIEluaXRpYWxpemVkIGxhemlseSwgc28gcmVxdWlyZXMgbG9ja2luZy4KLSAgTXV0ZXggbXV0ZXhfOwotICBoYXNoX21hcDxjb25zdCBEZXNjcmlwdG9yKiwgY29uc3QgTWVzc2FnZSo+IHR5cGVfbWFwXzsKLX07Ci0KLUdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KiBnZW5lcmF0ZWRfbWVzc2FnZV9mYWN0b3J5XyA9IE5VTEw7Ci1HT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKGdlbmVyYXRlZF9tZXNzYWdlX2ZhY3Rvcnlfb25jZV9pbml0Xyk7Ci0KLXZvaWQgU2h1dGRvd25HZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSgpIHsKLSAgZGVsZXRlIGdlbmVyYXRlZF9tZXNzYWdlX2ZhY3RvcnlfOwotfQotCi12b2lkIEluaXRHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSgpIHsKLSAgZ2VuZXJhdGVkX21lc3NhZ2VfZmFjdG9yeV8gPSBuZXcgR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk7Ci0gIGludGVybmFsOjpPblNodXRkb3duKCZTaHV0ZG93bkdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KTsKLX0KLQotR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OkdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KCkge30KLUdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5Ojp+R2VuZXJhdGVkTWVzc2FnZUZhY3RvcnkoKSB7fQotCi1HZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeSogR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OnNpbmdsZXRvbigpIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmZ2VuZXJhdGVkX21lc3NhZ2VfZmFjdG9yeV9vbmNlX2luaXRfLAotICAgICAgICAgICAgICAgICAmSW5pdEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5KTsKLSAgcmV0dXJuIGdlbmVyYXRlZF9tZXNzYWdlX2ZhY3RvcnlfOwotfQotCi12b2lkIEdlbmVyYXRlZE1lc3NhZ2VGYWN0b3J5OjpSZWdpc3RlckZpbGUoCi0gICAgY29uc3QgY2hhciogZmlsZSwgUmVnaXN0cmF0aW9uRnVuYyogcmVnaXN0cmF0aW9uX2Z1bmMpIHsKLSAgaWYgKCFJbnNlcnRJZk5vdFByZXNlbnQoJmZpbGVfbWFwXywgZmlsZSwgcmVnaXN0cmF0aW9uX2Z1bmMpKSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkZpbGUgaXMgYWxyZWFkeSByZWdpc3RlcmVkOiAiIDw8IGZpbGU7Ci0gIH0KLX0KLQotdm9pZCBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6UmVnaXN0ZXJUeXBlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEoZGVzY3JpcHRvci0+ZmlsZSgpLT5wb29sKCksIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKQotICAgIDw8ICJUcmllZCB0byByZWdpc3RlciBhIG5vbi1nZW5lcmF0ZWQgdHlwZSB3aXRoIHRoZSBnZW5lcmF0ZWQgIgotICAgICAgICJ0eXBlIHJlZ2lzdHJ5LiI7Ci0KLSAgLy8gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYXMgYSByZXN1bHQgb2YgY2FsbGluZyBhIGZpbGUgcmVnaXN0cmF0aW9uCi0gIC8vIGZ1bmN0aW9uIGR1cmluZyBHZXRQcm90b3R5cGUoKSwgaW4gd2hpY2ggY2FzZSB3ZSBhbHJlYWR5IGhhdmUgbG9ja2VkCi0gIC8vIHRoZSBtdXRleC4KLSAgbXV0ZXhfLkFzc2VydEhlbGQoKTsKLSAgaWYgKCFJbnNlcnRJZk5vdFByZXNlbnQoJnR5cGVfbWFwXywgZGVzY3JpcHRvciwgcHJvdG90eXBlKSkgewotICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiVHlwZSBpcyBhbHJlYWR5IHJlZ2lzdGVyZWQ6ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7Ci0gIH0KLX0KLQotCi1jb25zdCBNZXNzYWdlKiBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6R2V0UHJvdG90eXBlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKLSAgewotICAgIFJlYWRlck11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICAgIGNvbnN0IE1lc3NhZ2UqIHJlc3VsdCA9IEZpbmRQdHJPck51bGwodHlwZV9tYXBfLCB0eXBlKTsKLSAgICBpZiAocmVzdWx0ICE9IE5VTEwpIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBJZiB0aGUgdHlwZSBpcyBub3QgaW4gdGhlIGdlbmVyYXRlZCBwb29sLCB0aGVuIHdlIGNhbid0IHBvc3NpYmx5IGhhbmRsZQotICAvLyBpdC4KLSAgaWYgKHR5cGUtPmZpbGUoKS0+cG9vbCgpICE9IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpKSByZXR1cm4gTlVMTDsKLQotICAvLyBBcHBhcmVudGx5IHRoZSBmaWxlIGhhc24ndCBiZWVuIHJlZ2lzdGVyZWQgeWV0LiAgTGV0J3MgZG8gdGhhdCBub3cuCi0gIFJlZ2lzdHJhdGlvbkZ1bmMqIHJlZ2lzdHJhdGlvbl9mdW5jID0KLSAgICAgIEZpbmRQdHJPck51bGwoZmlsZV9tYXBfLCB0eXBlLT5maWxlKCktPm5hbWUoKS5jX3N0cigpKTsKLSAgaWYgKHJlZ2lzdHJhdGlvbl9mdW5jID09IE5VTEwpIHsKLSAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkZpbGUgYXBwZWFycyB0byBiZSBpbiBnZW5lcmF0ZWQgcG9vbCBidXQgd2Fzbid0ICIKLSAgICAgICAgICAgICAgICAgICAicmVnaXN0ZXJlZDogIiA8PCB0eXBlLT5maWxlKCktPm5hbWUoKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFdyaXRlck11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotCi0gIC8vIENoZWNrIGlmIGFub3RoZXIgdGhyZWFkIHByZWVtcHRlZCB1cy4KLSAgY29uc3QgTWVzc2FnZSogcmVzdWx0ID0gRmluZFB0ck9yTnVsbCh0eXBlX21hcF8sIHR5cGUpOwotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICAvLyBOb3BlLiAgT0ssIHJlZ2lzdGVyIGV2ZXJ5dGhpbmcuCi0gICAgcmVnaXN0cmF0aW9uX2Z1bmModHlwZS0+ZmlsZSgpLT5uYW1lKCkpOwotICAgIC8vIFNob3VsZCBiZSBoZXJlIG5vdy4KLSAgICByZXN1bHQgPSBGaW5kUHRyT3JOdWxsKHR5cGVfbWFwXywgdHlwZSk7Ci0gIH0KLQotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIlR5cGUgYXBwZWFycyB0byBiZSBpbiBnZW5lcmF0ZWQgcG9vbCBidXQgd2Fzbid0ICIKLSAgICAgICAgICAgICAgICA8PCAicmVnaXN0ZXJlZDogIiA8PCB0eXBlLT5mdWxsX25hbWUoKTsKLSAgfQotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1NZXNzYWdlRmFjdG9yeSogTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCkgewotICByZXR1cm4gR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OnNpbmdsZXRvbigpOwotfQotCi12b2lkIE1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZSgKLSAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwgdm9pZCAoKnJlZ2lzdGVyX21lc3NhZ2VzKShjb25zdCBzdHJpbmcmKSkgewotICBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6c2luZ2xldG9uKCktPlJlZ2lzdGVyRmlsZShmaWxlbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXJfbWVzc2FnZXMpOwotfQotCi12b2lkIE1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUpIHsKLSAgR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OnNpbmdsZXRvbigpLT5SZWdpc3RlclR5cGUoZGVzY3JpcHRvciwgcHJvdG90eXBlKTsKLX0KLQotCi1NZXNzYWdlRmFjdG9yeSogUmVmbGVjdGlvbjo6R2V0TWVzc2FnZUZhY3RvcnkoKSBjb25zdCB7Ci0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJOb3QgaW1wbGVtZW50ZWQuIjsKLSAgcmV0dXJuIE5VTEw7Ci19Ci0KLXZvaWQqIFJlZmxlY3Rpb246OlJlcGVhdGVkRmllbGREYXRhKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcF90eXBlLAotICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgY29uc3QgewotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm90IGltcGxlbWVudGVkLiI7Ci0gIHJldHVybiBOVUxMOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotUmVwZWF0ZWRGaWVsZEFjY2Vzc29yOjp+UmVwZWF0ZWRGaWVsZEFjY2Vzc29yKCkgewotfQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLWNvbnN0IGludGVybmFsOjpSZXBlYXRlZEZpZWxkQWNjZXNzb3IqIFJlZmxlY3Rpb246OlJlcGVhdGVkRmllbGRBY2Nlc3NvcigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIEdPT0dMRV9DSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSk7Ci0gIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgSEFORExFX1BSSU1JVElWRV9UWVBFKFRZUEUsIHR5cGUpIFwKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8gIyMgVFlQRTogXAotICAgICAgcmV0dXJuIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkRmllbGRQcmltaXRpdmVBY2Nlc3Nvcjx0eXBlPiA+OjpnZXQoKTsKLSAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoSU5UMzIsIGludDMyKQotICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UMzIsIHVpbnQzMikKLSAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoSU5UNjQsIGludDY0KQotICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UNjQsIHVpbnQ2NCkKLSAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRkxPQVQsIGZsb2F0KQotICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShET1VCTEUsIGRvdWJsZSkKLSAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoQk9PTCwgYm9vbCkKLSAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRU5VTSwgaW50MzIpCi0jdW5kZWYgSEFORExFX1BSSU1JVElWRV9UWVBFCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKLSAgICAgICAgICByZXR1cm4gaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZFN0cmluZ0FjY2Vzc29yPjo6Z2V0KCk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgaWYgKGZpZWxkLT5pc19tYXAoKSkgewotICAgICAgICByZXR1cm4gaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6TWFwRmllbGRBY2Nlc3Nvcj46OmdldCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRNZXNzYWdlQWNjZXNzb3I+OjpnZXQoKTsKLSAgICAgIH0KLSAgfQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiU2hvdWxkIG5vdCByZWFjaCBoZXJlLiI7Ci0gIHJldHVybiBOVUxMOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLXZvaWQgU2h1dGRvd25SZXBlYXRlZEZpZWxkQWNjZXNzb3IoKSB7Ci0gIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkRmllbGRQcmltaXRpdmVBY2Nlc3NvcjxpbnQzMj4gPjo6U2h1dERvd24oKTsKLSAgaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZFByaW1pdGl2ZUFjY2Vzc29yPHVpbnQzMj4gPjo6U2h1dERvd24oKTsKLSAgaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZFByaW1pdGl2ZUFjY2Vzc29yPGludDY0PiA+OjpTaHV0RG93bigpOwotICBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZEZpZWxkUHJpbWl0aXZlQWNjZXNzb3I8dWludDY0PiA+OjpTaHV0RG93bigpOwotICBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZEZpZWxkUHJpbWl0aXZlQWNjZXNzb3I8ZmxvYXQ+ID46OlNodXREb3duKCk7Ci0gIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkRmllbGRQcmltaXRpdmVBY2Nlc3Nvcjxkb3VibGU+ID46OlNodXREb3duKCk7Ci0gIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkRmllbGRQcmltaXRpdmVBY2Nlc3Nvcjxib29sPiA+OjpTaHV0RG93bigpOwotICBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkU3RyaW5nQWNjZXNzb3I+OjpTaHV0RG93bigpOwotICBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkTWVzc2FnZUFjY2Vzc29yPjo6U2h1dERvd24oKTsKLSAgaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6TWFwRmllbGRBY2Nlc3Nvcj46OlNodXREb3duKCk7Ci19Ci0KLXN0cnVjdCBTaHV0ZG93blJlcGVhdGVkRmllbGRSZWdpc3RlciB7Ci0gIFNodXRkb3duUmVwZWF0ZWRGaWVsZFJlZ2lzdGVyKCkgewotICAgIE9uU2h1dGRvd24oJlNodXRkb3duUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKTsKLSAgfQotfSBzaHV0ZG93bl87Ci0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci10ZW1wbGF0ZTw+Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDE5MDApCi0vLyBOb3RlOiBmb3JjZSBub2lubGluZSB0byB3b3JrYXJvdW5kIE1TVkMgMjAxNSBjb21waWxlciBidWcsIGlzc3VlICMyNDAKLUdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKLSNlbmRpZgotTWVzc2FnZSogR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+OjpOZXdGcm9tUHJvdG90eXBlKAotICAgIGNvbnN0IE1lc3NhZ2UqIHByb3RvdHlwZSwgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSB7Ci0gIHJldHVybiBwcm90b3R5cGUtPk5ldyhhcmVuYSk7Ci19Ci10ZW1wbGF0ZTw+Ci0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDE5MDApCi0vLyBOb3RlOiBmb3JjZSBub2lubGluZSB0byB3b3JrYXJvdW5kIE1TVkMgMjAxNSBjb21waWxlciBidWcsIGlzc3VlICMyNDAKLUdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKLSNlbmRpZgotZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPjo6R2V0QXJlbmEoCi0gICAgTWVzc2FnZSogdmFsdWUpIHsKLSAgcmV0dXJuIHZhbHVlLT5HZXRBcmVuYSgpOwotfQotdGVtcGxhdGU8PgotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxOTAwKQotLy8gTm90ZTogZm9yY2Ugbm9pbmxpbmUgdG8gd29ya2Fyb3VuZCBNU1ZDIDIwMTUgY29tcGlsZXIgYnVnLCBpc3N1ZSAjMjQwCi1HT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCi0jZW5kaWYKLXZvaWQqIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPjo6R2V0TWF5YmVBcmVuYVBvaW50ZXIoCi0gICAgTWVzc2FnZSogdmFsdWUpIHsKLSAgcmV0dXJuIHZhbHVlLT5HZXRNYXliZUFyZW5hUG9pbnRlcigpOwotfQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTRkOTI3Ny4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaAorKysgL2Rldi9udWxsCkBAIC0xLDExNTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIERlZmluZXMgTWVzc2FnZSwgdGhlIGFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBub24tbGl0ZQotLy8gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzLiAgQWx0aG91Z2ggaXQncyBwb3NzaWJsZSB0byBpbXBsZW1lbnQgdGhpcwotLy8gaW50ZXJmYWNlIG1hbnVhbGx5LCBtb3N0IHVzZXJzIHdpbGwgdXNlIHRoZSBwcm90b2NvbCBjb21waWxlciB0bwotLy8gZ2VuZXJhdGUgaW1wbGVtZW50YXRpb25zLgotLy8KLS8vIEV4YW1wbGUgdXNhZ2U6Ci0vLwotLy8gU2F5IHlvdSBoYXZlIGEgbWVzc2FnZSBkZWZpbmVkIGFzOgotLy8KLS8vICAgbWVzc2FnZSBGb28gewotLy8gICAgIG9wdGlvbmFsIHN0cmluZyB0ZXh0ID0gMTsKLS8vICAgICByZXBlYXRlZCBpbnQzMiBudW1iZXJzID0gMjsKLS8vICAgfQotLy8KLS8vIFRoZW4sIGlmIHlvdSB1c2VkIHRoZSBwcm90b2NvbCBjb21waWxlciB0byBnZW5lcmF0ZSBhIGNsYXNzIGZyb20gdGhlIGFib3ZlCi0vLyBkZWZpbml0aW9uLCB5b3UgY291bGQgdXNlIGl0IGxpa2Ugc286Ci0vLwotLy8gICBzdHJpbmcgZGF0YTsgIC8vIFdpbGwgc3RvcmUgYSBzZXJpYWxpemVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuCi0vLwotLy8gICB7Ci0vLyAgICAgLy8gQ3JlYXRlIGEgbWVzc2FnZSBhbmQgc2VyaWFsaXplIGl0LgotLy8gICAgIEZvbyBmb287Ci0vLyAgICAgZm9vLnNldF90ZXh0KCJIZWxsbyBXb3JsZCEiKTsKLS8vICAgICBmb28uYWRkX251bWJlcnMoMSk7Ci0vLyAgICAgZm9vLmFkZF9udW1iZXJzKDUpOwotLy8gICAgIGZvby5hZGRfbnVtYmVycyg0Mik7Ci0vLwotLy8gICAgIGZvby5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7Ci0vLyAgIH0KLS8vCi0vLyAgIHsKLS8vICAgICAvLyBQYXJzZSB0aGUgc2VyaWFsaXplZCBtZXNzYWdlIGFuZCBjaGVjayB0aGF0IGl0IGNvbnRhaW5zIHRoZQotLy8gICAgIC8vIGNvcnJlY3QgZGF0YS4KLS8vICAgICBGb28gZm9vOwotLy8gICAgIGZvby5QYXJzZUZyb21TdHJpbmcoZGF0YSk7Ci0vLwotLy8gICAgIGFzc2VydChmb28udGV4dCgpID09ICJIZWxsbyBXb3JsZCEiKTsKLS8vICAgICBhc3NlcnQoZm9vLm51bWJlcnNfc2l6ZSgpID09IDMpOwotLy8gICAgIGFzc2VydChmb28ubnVtYmVycygwKSA9PSAxKTsKLS8vICAgICBhc3NlcnQoZm9vLm51bWJlcnMoMSkgPT0gNSk7Ci0vLyAgICAgYXNzZXJ0KGZvby5udW1iZXJzKDIpID09IDQyKTsKLS8vICAgfQotLy8KLS8vICAgewotLy8gICAgIC8vIFNhbWUgYXMgdGhlIGxhc3QgYmxvY2ssIGJ1dCBkbyBpdCBkeW5hbWljYWxseSB2aWEgdGhlIE1lc3NhZ2UKLS8vICAgICAvLyByZWZsZWN0aW9uIGludGVyZmFjZS4KLS8vICAgICBNZXNzYWdlKiBmb28gPSBuZXcgRm9vOwotLy8gICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBmb28tPkdldERlc2NyaXB0b3IoKTsKLS8vCi0vLyAgICAgLy8gR2V0IHRoZSBkZXNjcmlwdG9ycyBmb3IgdGhlIGZpZWxkcyB3ZSdyZSBpbnRlcmVzdGVkIGluIGFuZCB2ZXJpZnkKLS8vICAgICAvLyB0aGVpciB0eXBlcy4KLS8vICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHRleHRfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInRleHQiKTsKLS8vICAgICBhc3NlcnQodGV4dF9maWVsZCAhPSBOVUxMKTsKLS8vICAgICBhc3NlcnQodGV4dF9maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpOwotLy8gICAgIGFzc2VydCh0ZXh0X2ZpZWxkLT5sYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwpOwotLy8gICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogbnVtYmVyc19maWVsZCA9IGRlc2NyaXB0b3ItPgotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbmRGaWVsZEJ5TmFtZSgibnVtYmVycyIpOwotLy8gICAgIGFzc2VydChudW1iZXJzX2ZpZWxkICE9IE5VTEwpOwotLy8gICAgIGFzc2VydChudW1iZXJzX2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyKTsKLS8vICAgICBhc3NlcnQobnVtYmVyc19maWVsZC0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKTsKLS8vCi0vLyAgICAgLy8gUGFyc2UgdGhlIG1lc3NhZ2UuCi0vLyAgICAgZm9vLT5QYXJzZUZyb21TdHJpbmcoZGF0YSk7Ci0vLwotLy8gICAgIC8vIFVzZSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UgdG8gZXhhbWluZSB0aGUgY29udGVudHMuCi0vLyAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGZvby0+R2V0UmVmbGVjdGlvbigpOwotLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRTdHJpbmcoKmZvbywgdGV4dF9maWVsZCkgPT0gIkhlbGxvIFdvcmxkISIpOwotLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5GaWVsZFNpemUoKmZvbywgbnVtYmVyc19maWVsZCkgPT0gMyk7Ci0vLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoKmZvbywgbnVtYmVyc19maWVsZCwgMCkgPT0gMSk7Ci0vLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoKmZvbywgbnVtYmVyc19maWVsZCwgMSkgPT0gNSk7Ci0vLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoKmZvbywgbnVtYmVyc19maWVsZCwgMikgPT0gNDIpOwotLy8KLS8vICAgICBkZWxldGUgZm9vOwotLy8gICB9Ci0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX01FU1NBR0VfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0hfXwotCi0jaW5jbHVkZSA8aW9zZndkPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHMuaD4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLQotCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfT05FT0YKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU19BUkVOQVMKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0vLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KLWNsYXNzIE1lc3NhZ2U7Ci1jbGFzcyBSZWZsZWN0aW9uOwotY2xhc3MgTWVzc2FnZUZhY3Rvcnk7Ci0KLS8vIERlZmluZWQgaW4gb3RoZXIgZmlsZXMuCi1jbGFzcyBNYXBLZXk7Ci1jbGFzcyBNYXBWYWx1ZVJlZjsKLWNsYXNzIE1hcEl0ZXJhdG9yOwotY2xhc3MgTWFwUmVmbGVjdGlvblRlc3RlcjsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLWNsYXNzIE1hcEZpZWxkQmFzZTsKLX0KLWNsYXNzIFVua25vd25GaWVsZFNldDsgICAgICAgICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCi1uYW1lc3BhY2UgaW8gewotY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsgICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAotY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07ICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAotY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCi1jbGFzcyBDb2RlZE91dHB1dFN0cmVhbTsgICAgICAgLy8gY29kZWRfc3RyZWFtLmgKLX0KLW5hbWVzcGFjZSBweXRob24gewotY2xhc3MgTWFwUmVmbGVjdGlvbkZyaWVuZDsgICAgIC8vIHNjYWxhcl9tYXBfY29udGFpbmVyLmgKLX0KLQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotY2xhc3MgUmVwZWF0ZWRGaWVsZDsgICAgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKLQotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLWNsYXNzIFJlcGVhdGVkUHRyRmllbGQ7ICAvLyByZXBlYXRlZF9maWVsZC5oCi0KLS8vIEEgY29udGFpbmVyIHRvIGhvbGQgbWVzc2FnZSBtZXRhZGF0YS4KLXN0cnVjdCBNZXRhZGF0YSB7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb247Ci19OwotCi0vLyBBYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHByb3RvY29sIG1lc3NhZ2VzLgotLy8KLS8vIFNlZSBhbHNvIE1lc3NhZ2VMaXRlLCB3aGljaCBjb250YWlucyBtb3N0IGV2ZXJ5LWRheSBvcGVyYXRpb25zLiAgTWVzc2FnZQotLy8gYWRkcyBkZXNjcmlwdG9ycyBhbmQgcmVmbGVjdGlvbiBvbiB0b3Agb2YgdGhhdC4KLS8vCi0vLyBUaGUgbWV0aG9kcyBvZiB0aGlzIGNsYXNzIHRoYXQgYXJlIHZpcnR1YWwgYnV0IG5vdCBwdXJlLXZpcnR1YWwgaGF2ZQotLy8gZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMgYmFzZWQgb24gcmVmbGVjdGlvbi4gIE1lc3NhZ2UgY2xhc3NlcyB3aGljaCBhcmUKLS8vIG9wdGltaXplZCBmb3Igc3BlZWQgd2lsbCB3YW50IHRvIG92ZXJyaWRlIHRoZXNlIHdpdGggZmFzdGVyIGltcGxlbWVudGF0aW9ucywKLS8vIGJ1dCBjbGFzc2VzIG9wdGltaXplZCBmb3IgY29kZSBzaXplIG1heSBiZSBoYXBweSB3aXRoIGtlZXBpbmcgdGhlbS4gIFNlZQotLy8gdGhlIG9wdGltaXplX2ZvciBvcHRpb24gaW4gZGVzY3JpcHRvci5wcm90by4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXNzYWdlIDogcHVibGljIE1lc3NhZ2VMaXRlIHsKLSBwdWJsaWM6Ci0gIGlubGluZSBNZXNzYWdlKCkge30KLSAgdmlydHVhbCB+TWVzc2FnZSgpOwotCi0gIC8vIEJhc2ljIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBPd25lcnNoaXAgaXMgcGFzc2VkIHRvIHRoZQotICAvLyBjYWxsZXIuICAoVGhpcyBpcyBhbHNvIGRlZmluZWQgaW4gTWVzc2FnZUxpdGUsIGJ1dCBpcyBkZWZpbmVkIGFnYWluIGhlcmUKLSAgLy8gZm9yIHJldHVybi10eXBlIGNvdmFyaWFuY2UuKQotICB2aXJ0dWFsIE1lc3NhZ2UqIE5ldygpIGNvbnN0ID0gMDsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb24gdGhlIGFyZW5hLiBPd25lcnNoaXAgaXMgcGFzc2VkIHRvIHRoZSBjYWxsZXIKLSAgLy8gaWYgYXJlbmEgaXMgYSBOVUxMLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGFsbG93cyBmb3IgQVBJIGNvbXBhdGliaWxpdHkKLSAgLy8gZHVyaW5nIHRoZSBBcmVuYSB0cmFuc2l0aW9uLgotICB2aXJ0dWFsIE1lc3NhZ2UqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICAgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBOZXcoKTsKLSAgICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgICAgYXJlbmEtPk93bihtZXNzYWdlKTsKLSAgICB9Ci0gICAgcmV0dXJuIG1lc3NhZ2U7Ci0gIH0KLQotICAvLyBNYWtlIHRoaXMgbWVzc2FnZSBpbnRvIGEgY29weSBvZiB0aGUgZ2l2ZW4gbWVzc2FnZS4gIFRoZSBnaXZlbiBtZXNzYWdlCi0gIC8vIG11c3QgaGF2ZSB0aGUgc2FtZSBkZXNjcmlwdG9yLCBidXQgbmVlZCBub3QgbmVjZXNzYXJpbHkgYmUgdGhlIHNhbWUgY2xhc3MuCi0gIC8vIEJ5IGRlZmF1bHQgdGhpcyBpcyBqdXN0IGltcGxlbWVudGVkIGFzICJDbGVhcigpOyBNZXJnZUZyb20oZnJvbSk7Ii4KLSAgdmlydHVhbCB2b2lkIENvcHlGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pOwotCi0gIC8vIE1lcmdlIHRoZSBmaWVsZHMgZnJvbSB0aGUgZ2l2ZW4gbWVzc2FnZSBpbnRvIHRoaXMgbWVzc2FnZS4gIFNpbmd1bGFyCi0gIC8vIGZpZWxkcyB3aWxsIGJlIG92ZXJ3cml0dGVuLCBpZiBzcGVjaWZpZWQgaW4gZnJvbSwgZXhjZXB0IGZvciBlbWJlZGRlZAotICAvLyBtZXNzYWdlcyB3aGljaCB3aWxsIGJlIG1lcmdlZC4gIFJlcGVhdGVkIGZpZWxkcyB3aWxsIGJlIGNvbmNhdGVuYXRlZC4KLSAgLy8gVGhlIGdpdmVuIG1lc3NhZ2UgbXVzdCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzIHRoaXMgbWVzc2FnZSAoaS5lLiB0aGUKLSAgLy8gZXhhY3Qgc2FtZSBjbGFzcykuCi0gIHZpcnR1YWwgdm9pZCBNZXJnZUZyb20oY29uc3QgTWVzc2FnZSYgZnJvbSk7Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCBJc0luaXRpYWxpemVkKCkgcmV0dXJucyB0cnVlLiAgR09PR0xFX0NIRUNLLWZhaWxzIG90aGVyd2lzZSwgd2l0aAotICAvLyBhIG5pY2UgZXJyb3IgbWVzc2FnZS4KLSAgdm9pZCBDaGVja0luaXRpYWxpemVkKCkgY29uc3Q7Ci0KLSAgLy8gU2xvd2x5IGJ1aWxkIGEgbGlzdCBvZiBhbGwgcmVxdWlyZWQgZmllbGRzIHRoYXQgYXJlIG5vdCBzZXQuCi0gIC8vIFRoaXMgaXMgbXVjaCwgbXVjaCBzbG93ZXIgdGhhbiBJc0luaXRpYWxpemVkKCkgYXMgaXQgaXMgaW1wbGVtZW50ZWQKLSAgLy8gcHVyZWx5IHZpYSByZWZsZWN0aW9uLiAgR2VuZXJhbGx5LCB5b3Ugc2hvdWxkIG5vdCBjYWxsIHRoaXMgdW5sZXNzIHlvdQotICAvLyBoYXZlIGFscmVhZHkgZGV0ZXJtaW5lZCB0aGF0IGFuIGVycm9yIGV4aXN0cyBieSBjYWxsaW5nIElzSW5pdGlhbGl6ZWQoKS4KLSAgdm9pZCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc3RkOjp2ZWN0b3I8c3RyaW5nPiogZXJyb3JzKSBjb25zdDsKLQotICAvLyBMaWtlIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycywgYnV0IGpvaW5zIGFsbCB0aGUgc3RyaW5ncywgZGVsaW1pdGVkIGJ5Ci0gIC8vIGNvbW1hcywgYW5kIHJldHVybnMgdGhlbS4KLSAgc3RyaW5nIEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdDsKLQotICAvLyBDbGVhcnMgYWxsIHVua25vd24gZmllbGRzIGZyb20gdGhpcyBtZXNzYWdlIGFuZCBhbGwgZW1iZWRkZWQgbWVzc2FnZXMuCi0gIC8vIE5vcm1hbGx5LCBpZiB1bmtub3duIHRhZyBudW1iZXJzIGFyZSBlbmNvdW50ZXJlZCB3aGVuIHBhcnNpbmcgYSBtZXNzYWdlLAotICAvLyB0aGUgdGFnIGFuZCB2YWx1ZSBhcmUgc3RvcmVkIGluIHRoZSBtZXNzYWdlJ3MgVW5rbm93bkZpZWxkU2V0IGFuZAotICAvLyB0aGVuIHdyaXR0ZW4gYmFjayBvdXQgd2hlbiB0aGUgbWVzc2FnZSBpcyBzZXJpYWxpemVkLiAgVGhpcyBhbGxvd3Mgc2VydmVycwotICAvLyB3aGljaCBzaW1wbHkgcm91dGUgbWVzc2FnZXMgdG8gb3RoZXIgc2VydmVycyB0byBwYXNzIHRocm91Z2ggbWVzc2FnZXMKLSAgLy8gdGhhdCBoYXZlIG5ldyBmaWVsZCBkZWZpbml0aW9ucyB3aGljaCB0aGV5IGRvbid0IHlldCBrbm93IGFib3V0LiAgSG93ZXZlciwKLSAgLy8gdGhpcyBiZWhhdmlvciBjYW4gaGF2ZSBzZWN1cml0eSBpbXBsaWNhdGlvbnMuICBUbyBhdm9pZCBpdCwgY2FsbCB0aGlzCi0gIC8vIG1ldGhvZCBhZnRlciBwYXJzaW5nLgotICAvLwotICAvLyBTZWUgUmVmbGVjdGlvbjo6R2V0VW5rbm93bkZpZWxkcygpIGZvciBtb3JlIG9uIHVua25vd24gZmllbGRzLgotICB2aXJ0dWFsIHZvaWQgRGlzY2FyZFVua25vd25GaWVsZHMoKTsKLQotICAvLyBDb21wdXRlcyAoYW4gZXN0aW1hdGUgb2YpIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IHVzZWQgZm9yCi0gIC8vIHN0b3JpbmcgdGhlIG1lc3NhZ2UgaW4gbWVtb3J5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdGhlCi0gIC8vIFJlZmxlY3Rpb24gb2JqZWN0J3MgU3BhY2VVc2VkKCkgbWV0aG9kLgotICAvLwotICAvLyBTcGFjZVVzZWQoKSBpcyBub3RpY2VhYmx5IHNsb3dlciB0aGFuIEJ5dGVTaXplKCksIGFzIGl0IGlzIGltcGxlbWVudGVkCi0gIC8vIHVzaW5nIHJlZmxlY3Rpb24gKHJhdGhlciB0aGFuIHRoZSBnZW5lcmF0ZWQgY29kZSBpbXBsZW1lbnRhdGlvbiBmb3IKLSAgLy8gQnl0ZVNpemUoKSkuIExpa2UgQnl0ZVNpemUoKSwgaXRzIENQVSB0aW1lIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mCi0gIC8vIGZpZWxkcyBkZWZpbmVkIGZvciB0aGUgcHJvdG8uCi0gIHZpcnR1YWwgaW50IFNwYWNlVXNlZCgpIGNvbnN0OwotCi0gIC8vIERlYnVnZ2luZyAmIFRlc3RpbmctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gR2VuZXJhdGVzIGEgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGlzIG1lc3NhZ2UsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gIC8vIGFuZCBvdGhlciBwdXJwb3Nlcy4KLSAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7Ci0gIC8vIExpa2UgRGVidWdTdHJpbmcoKSwgYnV0IHdpdGggbGVzcyB3aGl0ZXNwYWNlLgotICBzdHJpbmcgU2hvcnREZWJ1Z1N0cmluZygpIGNvbnN0OwotICAvLyBMaWtlIERlYnVnU3RyaW5nKCksIGJ1dCBkbyBub3QgZXNjYXBlIFVURi04IGJ5dGUgc2VxdWVuY2VzLgotICBzdHJpbmcgVXRmOERlYnVnU3RyaW5nKCkgY29uc3Q7Ci0gIC8vIENvbnZlbmllbmNlIGZ1bmN0aW9uIHVzZWZ1bCBpbiBHREIuICBQcmludHMgRGVidWdTdHJpbmcoKSB0byBzdGRvdXQuCi0gIHZvaWQgUHJpbnREZWJ1Z1N0cmluZygpIGNvbnN0OwotCi0gIC8vIEhlYXZ5IEkvTyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEFkZGl0aW9uYWwgcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbiBtZXRob2RzIG5vdCBpbXBsZW1lbnRlZCBieQotICAvLyBNZXNzYWdlTGl0ZSBiZWNhdXNlIHRoZXkgYXJlIG5vdCBzdXBwb3J0ZWQgYnkgdGhlIGxpdGUgbGlicmFyeS4KLQotICAvLyBQYXJzZSBhIHByb3RvY29sIGJ1ZmZlciBmcm9tIGEgZmlsZSBkZXNjcmlwdG9yLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGVudGlyZQotICAvLyBpbnB1dCB3aWxsIGJlIGNvbnN1bWVkLgotICBib29sIFBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKGludCBmaWxlX2Rlc2NyaXB0b3IpOwotICAvLyBMaWtlIFBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG1pc3NpbmcKLSAgLy8gcmVxdWlyZWQgZmllbGRzLgotICBib29sIFBhcnNlUGFydGlhbEZyb21GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKTsKLSAgLy8gUGFyc2UgYSBwcm90b2NvbCBidWZmZXIgZnJvbSBhIEMrKyBpc3RyZWFtLiAgSWYgc3VjY2Vzc2Z1bCwgdGhlIGVudGlyZQotICAvLyBpbnB1dCB3aWxsIGJlIGNvbnN1bWVkLgotICBib29sIFBhcnNlRnJvbUlzdHJlYW0oaXN0cmVhbSogaW5wdXQpOwotICAvLyBMaWtlIFBhcnNlRnJvbUlzdHJlYW0oKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZwotICAvLyByZXF1aXJlZCBmaWVsZHMuCi0gIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUlzdHJlYW0oaXN0cmVhbSogaW5wdXQpOwotCi0gIC8vIFNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGdpdmVuIGZpbGUgZGVzY3JpcHRvci4gIEFsbAotICAvLyByZXF1aXJlZCBmaWVsZHMgbXVzdCBiZSBzZXQuCi0gIGJvb2wgU2VyaWFsaXplVG9GaWxlRGVzY3JpcHRvcihpbnQgZmlsZV9kZXNjcmlwdG9yKSBjb25zdDsKLSAgLy8gTGlrZSBTZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCi0gIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvRmlsZURlc2NyaXB0b3IoaW50IGZpbGVfZGVzY3JpcHRvcikgY29uc3Q7Ci0gIC8vIFNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgd3JpdGUgaXQgdG8gdGhlIGdpdmVuIEMrKyBvc3RyZWFtLiAgQWxsCi0gIC8vIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIHNldC4KLSAgYm9vbCBTZXJpYWxpemVUb09zdHJlYW0ob3N0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgLy8gTGlrZSBTZXJpYWxpemVUb09zdHJlYW0oKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9Pc3RyZWFtKG9zdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0KLQotICAvLyBSZWZsZWN0aW9uLWJhc2VkIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUaGVzZSBtZXRob2RzIGFyZSBwdXJlLXZpcnR1YWwgaW4gTWVzc2FnZUxpdGUsIGJ1dCBNZXNzYWdlIHByb3ZpZGVzCi0gIC8vIHJlZmxlY3Rpb24tYmFzZWQgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbnMuCi0KLSAgdmlydHVhbCBzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdDsKLSAgdmlydHVhbCB2b2lkIENsZWFyKCk7Ci0gIHZpcnR1YWwgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIHZpcnR1YWwgdm9pZCBDaGVja1R5cGVBbmRNZXJnZUZyb20oY29uc3QgTWVzc2FnZUxpdGUmIG90aGVyKTsKLSAgdmlydHVhbCBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICB2aXJ0dWFsIGludCBCeXRlU2l6ZSgpIGNvbnN0OwotICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLQotIHByaXZhdGU6Ci0gIC8vIFRoaXMgaXMgY2FsbGVkIG9ubHkgYnkgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gb2YgQnl0ZVNpemUoKSwgdG8KLSAgLy8gdXBkYXRlIHRoZSBjYWNoZWQgc2l6ZS4gIElmIHlvdSBvdmVycmlkZSBCeXRlU2l6ZSgpLCB5b3UgZG8gbm90IG5lZWQKLSAgLy8gdG8gb3ZlcnJpZGUgdGhpcy4gIElmIHlvdSBkbyBub3Qgb3ZlcnJpZGUgQnl0ZVNpemUoKSwgeW91IE1VU1Qgb3ZlcnJpZGUKLSAgLy8gdGhpczsgdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gd2lsbCBjcmFzaC4KLSAgLy8KLSAgLy8gVGhlIG1ldGhvZCBpcyBwcml2YXRlIGJlY2F1c2Ugc3ViY2xhc3NlcyBzaG91bGQgbmV2ZXIgY2FsbCBpdDsgb25seQotICAvLyBvdmVycmlkZSBpdC4gIFllcywgQysrIGxldHMgeW91IGRvIHRoYXQuICBDcmF6eSwgaHVoPwotICB2aXJ0dWFsIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7Ci0KLSBwdWJsaWM6Ci0KLSAgLy8gSW50cm9zcGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBUeXBlZGVmIGZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eS4KLSAgdHlwZWRlZiBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uIFJlZmxlY3Rpb247Ci0KLSAgLy8gR2V0IGEgRGVzY3JpcHRvciBmb3IgdGhpcyBtZXNzYWdlJ3MgdHlwZS4gIFRoaXMgZGVzY3JpYmVzIHdoYXQKLSAgLy8gZmllbGRzIHRoZSBtZXNzYWdlIGNvbnRhaW5zLCB0aGUgdHlwZXMgb2YgdGhvc2UgZmllbGRzLCBldGMuCi0gIGNvbnN0IERlc2NyaXB0b3IqIEdldERlc2NyaXB0b3IoKSBjb25zdCB7IHJldHVybiBHZXRNZXRhZGF0YSgpLmRlc2NyaXB0b3I7IH0KLQotICAvLyBHZXQgdGhlIFJlZmxlY3Rpb24gaW50ZXJmYWNlIGZvciB0aGlzIE1lc3NhZ2UsIHdoaWNoIGNhbiBiZSB1c2VkIHRvCi0gIC8vIHJlYWQgYW5kIG1vZGlmeSB0aGUgZmllbGRzIG9mIHRoZSBNZXNzYWdlIGR5bmFtaWNhbGx5IChpbiBvdGhlciB3b3JkcywKLSAgLy8gd2l0aG91dCBrbm93aW5nIHRoZSBtZXNzYWdlIHR5cGUgYXQgY29tcGlsZSB0aW1lKS4gIFRoaXMgb2JqZWN0IHJlbWFpbnMKLSAgLy8gcHJvcGVydHkgb2YgdGhlIE1lc3NhZ2UuCi0gIC8vCi0gIC8vIFRoaXMgbWV0aG9kIHJlbWFpbnMgdmlydHVhbCBpbiBjYXNlIGEgc3ViY2xhc3MgZG9lcyBub3QgaW1wbGVtZW50Ci0gIC8vIHJlZmxlY3Rpb24gYW5kIHdhbnRzIHRvIG92ZXJyaWRlIHRoZSBkZWZhdWx0IGJlaGF2aW9yLgotICB2aXJ0dWFsIGNvbnN0IFJlZmxlY3Rpb24qIEdldFJlZmxlY3Rpb24oKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldE1ldGFkYXRhKCkucmVmbGVjdGlvbjsKLSAgfQotCi0gcHJvdGVjdGVkOgotICAvLyBHZXQgYSBzdHJ1Y3QgY29udGFpbmluZyB0aGUgbWV0YWRhdGEgZm9yIHRoZSBNZXNzYWdlLiBNb3N0IHN1YmNsYXNzZXMgb25seQotICAvLyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIG1ldGhvZCwgcmF0aGVyIHRoYW4gdGhlIEdldERlc2NyaXB0b3IoKSBhbmQKLSAgLy8gR2V0UmVmbGVjdGlvbigpIHdyYXBwZXJzLgotICB2aXJ0dWFsIE1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3QgID0gMDsKLQotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2UpOwotfTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLS8vIEZvcndhcmQtZGVjbGFyZSBpbnRlcmZhY2VzIHVzZWQgdG8gaW1wbGVtZW50IFJlcGVhdGVkRmllbGRSZWYuCi0vLyBUaGVzZSBhcmUgcHJvdG9idWYgaW50ZXJuYWxzIHRoYXQgdXNlcnMgc2hvdWxkbid0IGNhcmUgYWJvdXQuCi1jbGFzcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3I7Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gRm9yd2FyZC1kZWNsYXJlIFJlcGVhdGVkRmllbGRSZWYgdGVtcGxhdGVzLiBUaGUgc2Vjb25kIHR5cGUgcGFyYW1ldGVyIGlzCi0vLyB1c2VkIGZvciBTRklOQUUgdHJpY2tzLiBVc2VycyBzaG91bGQgaWdub3JlIGl0LgotdGVtcGxhdGU8dHlwZW5hbWUgVCwgdHlwZW5hbWUgRW5hYmxlID0gdm9pZD4KLWNsYXNzIFJlcGVhdGVkRmllbGRSZWY7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+Ci1jbGFzcyBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjsKLQotLy8gVGhpcyBpbnRlcmZhY2UgY29udGFpbnMgbWV0aG9kcyB0aGF0IGNhbiBiZSB1c2VkIHRvIGR5bmFtaWNhbGx5IGFjY2VzcwotLy8gYW5kIG1vZGlmeSB0aGUgZmllbGRzIG9mIGEgcHJvdG9jb2wgbWVzc2FnZS4gIFRoZWlyIHNlbWFudGljcyBhcmUKLS8vIHNpbWlsYXIgdG8gdGhlIGFjY2Vzc29ycyB0aGUgcHJvdG9jb2wgY29tcGlsZXIgZ2VuZXJhdGVzLgotLy8KLS8vIFRvIGdldCB0aGUgUmVmbGVjdGlvbiBmb3IgYSBnaXZlbiBNZXNzYWdlLCBjYWxsIE1lc3NhZ2U6OkdldFJlZmxlY3Rpb24oKS4KLS8vCi0vLyBUaGlzIGludGVyZmFjZSBpcyBzZXBhcmF0ZSBmcm9tIE1lc3NhZ2Ugb25seSBmb3IgZWZmaWNpZW5jeSByZWFzb25zOwotLy8gdGhlIHZhc3QgbWFqb3JpdHkgb2YgaW1wbGVtZW50YXRpb25zIG9mIE1lc3NhZ2Ugd2lsbCBzaGFyZSB0aGUgc2FtZQotLy8gaW1wbGVtZW50YXRpb24gb2YgUmVmbGVjdGlvbiAoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24sCi0vLyBkZWZpbmVkIGluIGdlbmVyYXRlZF9tZXNzYWdlLmgpLCBhbmQgYWxsIE1lc3NhZ2VzIG9mIGEgcGFydGljdWxhciBjbGFzcwotLy8gc2hvdWxkIHNoYXJlIHRoZSBzYW1lIFJlZmxlY3Rpb24gb2JqZWN0ICh0aG91Z2ggeW91IHNob3VsZCBub3QgcmVseSBvbgotLy8gdGhlIGxhdHRlciBmYWN0KS4KLS8vCi0vLyBUaGVyZSBhcmUgc2V2ZXJhbCB3YXlzIHRoYXQgdGhlc2UgbWV0aG9kcyBjYW4gYmUgdXNlZCBpbmNvcnJlY3RseS4gIEZvcgotLy8gZXhhbXBsZSwgYW55IG9mIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyB3aWxsIGxlYWQgdG8gdW5kZWZpbmVkCi0vLyByZXN1bHRzIChwcm9iYWJseSBhc3NlcnRpb24gZmFpbHVyZXMpOgotLy8gLSBUaGUgRmllbGREZXNjcmlwdG9yIGlzIG5vdCBhIGZpZWxkIG9mIHRoaXMgbWVzc2FnZSB0eXBlLgotLy8gLSBUaGUgbWV0aG9kIGNhbGxlZCBpcyBub3QgYXBwcm9wcmlhdGUgZm9yIHRoZSBmaWVsZCdzIHR5cGUuICBGb3IKLS8vICAgZWFjaCBmaWVsZCB0eXBlIGluIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV8qLCB0aGVyZSBpcyBvbmx5IG9uZQotLy8gICBHZXQqKCkgbWV0aG9kLCBvbmUgU2V0KigpIG1ldGhvZCwgYW5kIG9uZSBBZGQqKCkgbWV0aG9kIHRoYXQgaXMKLS8vICAgdmFsaWQgZm9yIHRoYXQgdHlwZS4gIEl0IHNob3VsZCBiZSBvYnZpb3VzIHdoaWNoIChleGNlcHQgbWF5YmUKLS8vICAgZm9yIFRZUEVfQllURVMsIHdoaWNoIGFyZSByZXByZXNlbnRlZCB1c2luZyBzdHJpbmdzIGluIEMrKykuCi0vLyAtIEEgR2V0KigpIG9yIFNldCooKSBtZXRob2QgZm9yIHNpbmd1bGFyIGZpZWxkcyBpcyBjYWxsZWQgb24gYSByZXBlYXRlZAotLy8gICBmaWVsZC4KLS8vIC0gR2V0UmVwZWF0ZWQqKCksIFNldFJlcGVhdGVkKigpLCBvciBBZGQqKCkgaXMgY2FsbGVkIG9uIGEgbm9uLXJlcGVhdGVkCi0vLyAgIGZpZWxkLgotLy8gLSBUaGUgTWVzc2FnZSBvYmplY3QgcGFzc2VkIHRvIGFueSBtZXRob2QgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlIGZvcgotLy8gICB0aGlzIFJlZmxlY3Rpb24gb2JqZWN0IChpLmUuIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpICE9IHJlZmxlY3Rpb24pLgotLy8KLS8vIFlvdSBtaWdodCB3b25kZXIgd2h5IHRoZXJlIGlzIG5vdCBhbnkgYWJzdHJhY3QgcmVwcmVzZW50YXRpb24gZm9yIGEgZmllbGQKLS8vIG9mIGFyYml0cmFyeSB0eXBlLiAgRS5nLiwgd2h5IGlzbid0IHRoZXJlIGp1c3QgYSAiR2V0RmllbGQoKSIgbWV0aG9kIHRoYXQKLS8vIHJldHVybnMgImNvbnN0IEZpZWxkJiIsIHdoZXJlICJGaWVsZCIgaXMgc29tZSBjbGFzcyB3aXRoIGFjY2Vzc29ycyBsaWtlCi0vLyAiR2V0SW50MzJWYWx1ZSgpIi4gIFRoZSBwcm9ibGVtIGlzIHRoYXQgc29tZW9uZSB3b3VsZCBoYXZlIHRvIGRlYWwgd2l0aAotLy8gYWxsb2NhdGluZyB0aGVzZSBGaWVsZCBvYmplY3RzLiAgRm9yIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMsIGhhdmluZyB0bwotLy8gYWxsb2NhdGUgc3BhY2UgZm9yIGFuIGFkZGl0aW9uYWwgb2JqZWN0IHRvIHdyYXAgZXZlcnkgZmllbGQgd291bGQgYXQgbGVhc3QKLS8vIGRvdWJsZSB0aGUgbWVzc2FnZSdzIG1lbW9yeSBmb290cHJpbnQsIHByb2JhYmx5IHdvcnNlLiAgQWxsb2NhdGluZyB0aGUKLS8vIG9iamVjdHMgb24tZGVtYW5kLCBvbiB0aGUgb3RoZXIgaGFuZCwgd291bGQgYmUgZXhwZW5zaXZlIGFuZCBwcm9uZSB0bwotLy8gbWVtb3J5IGxlYWtzLiAgU28sIGluc3RlYWQgd2UgZW5kZWQgdXAgd2l0aCB0aGlzIGZsYXQgaW50ZXJmYWNlLgotLy8KLS8vIFRPRE8oa2VudG9uKTogIENyZWF0ZSBhIHV0aWxpdHkgY2xhc3Mgd2hpY2ggY2FsbGVycyBjYW4gdXNlIHRvIHJlYWQgYW5kCi0vLyAgIHdyaXRlIGZpZWxkcyBmcm9tIGEgUmVmbGVjdGlvbiB3aXRob3V0IHBheWluZyBhdHRlbnRpb24gdG8gdGhlIHR5cGUuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVmbGVjdGlvbiB7Ci0gcHVibGljOgotICBpbmxpbmUgUmVmbGVjdGlvbigpIHt9Ci0gIHZpcnR1YWwgflJlZmxlY3Rpb24oKTsKLQotICAvLyBHZXQgdGhlIFVua25vd25GaWVsZFNldCBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzIGNvbnRhaW5zIGZpZWxkcyB3aGljaAotICAvLyB3ZXJlIHNlZW4gd2hlbiB0aGUgTWVzc2FnZSB3YXMgcGFyc2VkIGJ1dCB3ZXJlIG5vdCByZWNvZ25pemVkIGFjY29yZGluZwotICAvLyB0byB0aGUgTWVzc2FnZSdzIGRlZmluaXRpb24uIEZvciBwcm90bzMgcHJvdG9zLCB0aGlzIG1ldGhvZCB3aWxsIGFsd2F5cwotICAvLyByZXR1cm4gYW4gZW1wdHkgVW5rbm93bkZpZWxkU2V0LgotICB2aXJ0dWFsIGNvbnN0IFVua25vd25GaWVsZFNldCYgR2V0VW5rbm93bkZpZWxkcygKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0ID0gMDsKLSAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIHRoZSBVbmtub3duRmllbGRTZXQgZm9yIHRoZSBtZXNzYWdlLiAgVGhpcwotICAvLyBjb250YWlucyBmaWVsZHMgd2hpY2ggd2VyZSBzZWVuIHdoZW4gdGhlIE1lc3NhZ2Ugd2FzIHBhcnNlZCBidXQgd2VyZSBub3QKLSAgLy8gcmVjb2duaXplZCBhY2NvcmRpbmcgdG8gdGhlIE1lc3NhZ2UncyBkZWZpbml0aW9uLiBGb3IgcHJvdG8zIHByb3RvcywgdGhpcwotICAvLyBtZXRob2Qgd2lsbCByZXR1cm4gYSB2YWxpZCBtdXRhYmxlIFVua25vd25GaWVsZFNldCBwb2ludGVyIGJ1dCBtb2RpZnlpbmcKLSAgLy8gaXQgd29uJ3QgYWZmZWN0IHRoZSBzZXJpYWxpemVkIGJ5dGVzIG9mIHRoZSBtZXNzYWdlLgotICB2aXJ0dWFsIFVua25vd25GaWVsZFNldCogTXV0YWJsZVVua25vd25GaWVsZHMoTWVzc2FnZSogbWVzc2FnZSkgY29uc3QgPSAwOwotCi0gIC8vIEVzdGltYXRlIHRoZSBhbW91bnQgb2YgbWVtb3J5IHVzZWQgYnkgdGhlIG1lc3NhZ2Ugb2JqZWN0LgotICB2aXJ0dWFsIGludCBTcGFjZVVzZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgPSAwOwotCi0gIC8vIENoZWNrIGlmIHRoZSBnaXZlbiBub24tcmVwZWF0ZWQgZmllbGQgaXMgc2V0LgotICB2aXJ0dWFsIGJvb2wgSGFzRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKLQotICAvLyBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiBhIHJlcGVhdGVkIGZpZWxkLgotICB2aXJ0dWFsIGludCBGaWVsZFNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKLQotICAvLyBDbGVhciB0aGUgdmFsdWUgb2YgYSBmaWVsZCwgc28gdGhhdCBIYXNGaWVsZCgpIHJldHVybnMgZmFsc2Ugb3IKLSAgLy8gRmllbGRTaXplKCkgcmV0dXJucyB6ZXJvLgotICB2aXJ0dWFsIHZvaWQgQ2xlYXJGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7Ci0KLSAgLy8gQ2hlY2sgaWYgdGhlIG9uZW9mIGlzIHNldC4gUmV0dXJucyB0cnVlIGlmIGFueSBmaWVsZCBpbiBvbmVvZgotICAvLyBpcyBzZXQsIGZhbHNlIG90aGVyd2lzZS4KLSAgLy8gVE9ETyhqaWVsdW8pIC0gbWFrZSBpdCBwdXJlIHZpcnR1YWwgYWZ0ZXIgdXBkYXRpbmcgYWxsCi0gIC8vIHRoZSBzdWJjbGFzc2VzLgotICB2aXJ0dWFsIGJvb2wgSGFzT25lb2YoY29uc3QgTWVzc2FnZSYgLyptZXNzYWdlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIC8qb25lb2ZfZGVzY3JpcHRvciovKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgdmlydHVhbCB2b2lkIENsZWFyT25lb2YoTWVzc2FnZSogLyptZXNzYWdlKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogLypvbmVvZl9kZXNjcmlwdG9yKi8pIGNvbnN0IHt9Ci0KLSAgLy8gUmV0dXJucyB0aGUgZmllbGQgZGVzY3JpcHRvciBpZiB0aGUgb25lb2YgaXMgc2V0LiBOVUxMIG90aGVyd2lzZS4KLSAgLy8gVE9ETyhqaWVsdW8pIC0gbWFrZSBpdCBwdXJlIHZpcnR1YWwuCi0gIHZpcnR1YWwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIC8qbWVzc2FnZSovLAotICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiAvKm9uZW9mX2Rlc2NyaXB0b3IqLykgY29uc3QgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgLy8gUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZmllbGQuCi0gIC8vIFdlIGRvbid0IHByb3ZpZGUgYSB3YXkgdG8gcmVtb3ZlIGFueSBlbGVtZW50IG90aGVyIHRoYW4gdGhlIGxhc3QKLSAgLy8gYmVjYXVzZSBpdCBpbnZpdGVzIGluZWZmaWNpZW50IHVzZSwgc3VjaCBhcyBPKG5eMikgZmlsdGVyaW5nIGxvb3BzCi0gIC8vIHRoYXQgc2hvdWxkIGhhdmUgYmVlbiBPKG4pLiAgSWYgeW91IHdhbnQgdG8gcmVtb3ZlIGFuIGVsZW1lbnQgb3RoZXIKLSAgLy8gdGhhbiB0aGUgbGFzdCwgdGhlIGJlc3Qgd2F5IHRvIGRvIGl0IGlzIHRvIHJlLWFycmFuZ2UgdGhlIGVsZW1lbnRzCi0gIC8vICh1c2luZyBTd2FwKCkpIHNvIHRoYXQgdGhlIG9uZSB5b3Ugd2FudCByZW1vdmVkIGlzIGF0IHRoZSBlbmQsIHRoZW4KLSAgLy8gY2FsbCBSZW1vdmVMYXN0KCkuCi0gIHZpcnR1YWwgdm9pZCBSZW1vdmVMYXN0KE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKLSAgLy8gUmVtb3ZlcyB0aGUgbGFzdCBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZCwgYW5kIHJldHVybnMgdGhlCi0gIC8vIHBvaW50ZXIgdG8gdGhlIGNhbGxlci4gIENhbGxlciB0YWtlcyBvd25lcnNoaXAgb2YgdGhlIHJldHVybmVkIHBvaW50ZXIuCi0gIHZpcnR1YWwgTWVzc2FnZSogUmVsZWFzZUxhc3QoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7Ci0KLSAgLy8gU3dhcCB0aGUgY29tcGxldGUgY29udGVudHMgb2YgdHdvIG1lc3NhZ2VzLgotICB2aXJ0dWFsIHZvaWQgU3dhcChNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIpIGNvbnN0ID0gMDsKLQotICAvLyBTd2FwIGZpZWxkcyBsaXN0ZWQgaW4gZmllbGRzIHZlY3RvciBvZiB0d28gbWVzc2FnZXMuCi0gIHZpcnR1YWwgdm9pZCBTd2FwRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UxLAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlMiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4mIGZpZWxkcykKLSAgICAgIGNvbnN0ID0gMDsKLQotICAvLyBTd2FwIHR3byBlbGVtZW50cyBvZiBhIHJlcGVhdGVkIGZpZWxkLgotICB2aXJ0dWFsIHZvaWQgU3dhcEVsZW1lbnRzKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleDIpIGNvbnN0ID0gMDsKLQotICAvLyBMaXN0IGFsbCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2Ugd2hpY2ggYXJlIGN1cnJlbnRseSBzZXQuICBUaGlzIGluY2x1ZGVzCi0gIC8vIGV4dGVuc2lvbnMuICBTaW5ndWxhciBmaWVsZHMgd2lsbCBvbmx5IGJlIGxpc3RlZCBpZiBIYXNGaWVsZChmaWVsZCkgd291bGQKLSAgLy8gcmV0dXJuIHRydWUgYW5kIHJlcGVhdGVkIGZpZWxkcyB3aWxsIG9ubHkgYmUgbGlzdGVkIGlmIEZpZWxkU2l6ZShmaWVsZCkKLSAgLy8gd291bGQgcmV0dXJuIG5vbi16ZXJvLiAgRmllbGRzIChib3RoIG5vcm1hbCBmaWVsZHMgYW5kIGV4dGVuc2lvbiBmaWVsZHMpCi0gIC8vIHdpbGwgYmUgbGlzdGVkIG9yZGVyZWQgYnkgZmllbGQgbnVtYmVyLgotICB2aXJ0dWFsIHZvaWQgTGlzdEZpZWxkcygKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdCA9IDA7Ci0KLSAgLy8gU2luZ3VsYXIgZmllbGQgZ2V0dGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlc2UgZ2V0IHRoZSB2YWx1ZSBvZiBhIG5vbi1yZXBlYXRlZCBmaWVsZC4gIFRoZXkgcmV0dXJuIHRoZSBkZWZhdWx0Ci0gIC8vIHZhbHVlIGZvciBmaWVsZHMgdGhhdCBhcmVuJ3Qgc2V0LgotCi0gIHZpcnR1YWwgaW50MzIgIEdldEludDMyIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGludDY0ICBHZXRJbnQ2NCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB1aW50MzIgR2V0VUludDMyKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdWludDY0IEdldFVJbnQ2NChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGZsb2F0ICBHZXRGbG9hdCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBkb3VibGUgR2V0RG91YmxlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgYm9vbCAgIEdldEJvb2wgIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHN0cmluZyBHZXRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBHZXRFbnVtKAotICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOwotCi0gIC8vIEdldEVudW1WYWx1ZSgpIHJldHVybnMgYW4gZW51bSBmaWVsZCdzIHZhbHVlIGFzIGFuIGludGVnZXIgcmF0aGVyIHRoYW4KLSAgLy8gYW4gRW51bVZhbHVlRGVzY3JpcHRvciouIElmIHRoZSBpbnRlZ2VyIHZhbHVlIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYQotICAvLyBrbm93biB2YWx1ZSBkZXNjcmlwdG9yLCBhIG5ldyB2YWx1ZSBkZXNjcmlwdG9yIGlzIGNyZWF0ZWQuIChTdWNoIGEgdmFsdWUKLSAgLy8gd2lsbCBvbmx5IGJlIHByZXNlbnQgd2hlbiB0aGUgbmV3IHVua25vd24tZW51bS12YWx1ZSBzZW1hbnRpY3MgYXJlIGVuYWJsZWQKLSAgLy8gZm9yIGEgbWVzc2FnZS4pCi0gIHZpcnR1YWwgaW50IEdldEVudW1WYWx1ZSgKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi0gIC8vIFNlZSBNdXRhYmxlTWVzc2FnZSgpIGZvciB0aGUgbWVhbmluZyBvZiB0aGUgImZhY3RvcnkiIHBhcmFtZXRlci4KLSAgdmlydHVhbCBjb25zdCBNZXNzYWdlJiBHZXRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdCA9IDA7Ci0KLSAgLy8gR2V0IGEgc3RyaW5nIHZhbHVlIHdpdGhvdXQgY29weWluZywgaWYgcG9zc2libGUuCi0gIC8vCi0gIC8vIEdldFN0cmluZygpIG5lY2Vzc2FyaWx5IHJldHVybnMgYSBjb3B5IG9mIHRoZSBzdHJpbmcuICBUaGlzIGNhbiBiZQotICAvLyBpbmVmZmljaWVudCB3aGVuIHRoZSBzdHJpbmcgaXMgYWxyZWFkeSBzdG9yZWQgaW4gYSBzdHJpbmcgb2JqZWN0IGluIHRoZQotICAvLyB1bmRlcmx5aW5nIG1lc3NhZ2UuICBHZXRTdHJpbmdSZWZlcmVuY2UoKSB3aWxsIHJldHVybiBhIHJlZmVyZW5jZSB0byB0aGUKLSAgLy8gdW5kZXJseWluZyBzdHJpbmcgaW4gdGhpcyBjYXNlLiAgT3RoZXJ3aXNlLCBpdCB3aWxsIGNvcHkgdGhlIHN0cmluZyBpbnRvCi0gIC8vICpzY3JhdGNoIGFuZCByZXR1cm4gdGhhdC4KLSAgLy8KLSAgLy8gTm90ZTogIEl0IGlzIHBlcmZlY3RseSByZWFzb25hYmxlIGFuZCB1c2VmdWwgdG8gd3JpdGUgY29kZSBsaWtlOgotICAvLyAgICAgc3RyID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKGZpZWxkLCAmc3RyKTsKLSAgLy8gICBUaGlzIGxpbmUgd291bGQgZW5zdXJlIHRoYXQgb25seSBvbmUgY29weSBvZiB0aGUgc3RyaW5nIGlzIG1hZGUKLSAgLy8gICByZWdhcmRsZXNzIG9mIHRoZSBmaWVsZCdzIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uICBXaGVuIGluaXRpYWxpemluZwotICAvLyAgIGEgbmV3bHktY29uc3RydWN0ZWQgc3RyaW5nLCB0aG91Z2gsIGl0J3MganVzdCBhcyBmYXN0IGFuZCBtb3JlIHJlYWRhYmxlCi0gIC8vICAgdG8gdXNlIGNvZGUgbGlrZToKLSAgLy8gICAgIHN0cmluZyBzdHIgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgZmllbGQpOwotICB2aXJ0dWFsIGNvbnN0IHN0cmluZyYgR2V0U3RyaW5nUmVmZXJlbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHNjcmF0Y2gpIGNvbnN0ID0gMDsKLQotCi0gIC8vIFNpbmd1bGFyIGZpZWxkIG11dGF0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRoZXNlIG11dGF0ZSB0aGUgdmFsdWUgb2YgYSBub24tcmVwZWF0ZWQgZmllbGQuCi0KLSAgdmlydHVhbCB2b2lkIFNldEludDMyIChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludDMyICB2YWx1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0SW50NjQgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50NjQgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRVSW50MzIoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCB1aW50MzIgdmFsdWUpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQ2NCB2YWx1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0RmxvYXQgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgZmxvYXQgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXREb3VibGUoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBkb3VibGUgdmFsdWUpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIFNldEJvb2wgIChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgICB2YWx1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0U3RyaW5nKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRFbnVtICAoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCA9IDA7Ci0gIC8vIFNldCBhbiBlbnVtIGZpZWxkJ3MgdmFsdWUgd2l0aCBhbiBpbnRlZ2VyIHJhdGhlciB0aGFuIEVudW1WYWx1ZURlc2NyaXB0b3IuCi0gIC8vIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEga25vd24gZW51bSB2YWx1ZSwgZWl0aGVyIGJlaGF2aW9yIGlzCi0gIC8vIHVuZGVmaW5lZCAoZm9yIHByb3RvMiBtZXNzYWdlcyksIG9yIHRoZSB2YWx1ZSBpcyBhY2NlcHRlZCBzaWxlbnRseSBmb3IKLSAgLy8gbWVzc2FnZXMgd2l0aCBuZXcgdW5rbm93bi1lbnVtLXZhbHVlIHNlbWFudGljcy4KLSAgdmlydHVhbCB2b2lkIFNldEVudW1WYWx1ZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKLQotICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gYSBmaWVsZCB3aXRoIGEgbWVzc2FnZSB0eXBlLiAgSWYgYSBNZXNzYWdlRmFjdG9yeQotICAvLyBpcyBwcm92aWRlZCwgaXQgd2lsbCBiZSB1c2VkIHRvIGNvbnN0cnVjdCBpbnN0YW5jZXMgb2YgdGhlIHN1Yi1tZXNzYWdlOwotICAvLyBvdGhlcndpc2UsIHRoZSBkZWZhdWx0IGZhY3RvcnkgaXMgdXNlZC4gIElmIHRoZSBmaWVsZCBpcyBhbiBleHRlbnNpb24gdGhhdAotICAvLyBkb2VzIG5vdCBsaXZlIGluIHRoZSBzYW1lIHBvb2wgYXMgdGhlIGNvbnRhaW5pbmcgbWVzc2FnZSdzIGRlc2NyaXB0b3IgKGUuZy4KLSAgLy8gaXQgbGl2ZXMgaW4gYW4gb3ZlcmxheSBwb29sKSwgdGhlbiBhIE1lc3NhZ2VGYWN0b3J5IG11c3QgYmUgcHJvdmlkZWQuCi0gIC8vIElmIHlvdSBoYXZlIG5vIGlkZWEgd2hhdCB0aGF0IG1lYW50LCB0aGVuIHlvdSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIHdvcnJ5Ci0gIC8vIGFib3V0IGl0IChkb24ndCBwcm92aWRlIGEgTWVzc2FnZUZhY3RvcnkpLiAgV0FSTklORzogIElmIHRoZQotICAvLyBGaWVsZERlc2NyaXB0b3IgaXMgZm9yIGEgY29tcGlsZWQtaW4gZXh0ZW5zaW9uLCB0aGVuCi0gIC8vIGZhY3RvcnktPkdldFByb3RvdHlwZShmaWVsZC0+bWVzc2FnZV90eXBlKCkgTVVTVCByZXR1cm4gYW4gaW5zdGFuY2Ugb2YgdGhlCi0gIC8vIGNvbXBpbGVkLWluIGNsYXNzIGZvciB0aGlzIHR5cGUsIE5PVCBEeW5hbWljTWVzc2FnZS4KLSAgdmlydHVhbCBNZXNzYWdlKiBNdXRhYmxlTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdCA9IDA7Ci0gIC8vIFJlcGxhY2VzIHRoZSBtZXNzYWdlIHNwZWNpZmllZCBieSAnZmllbGQnIHdpdGggdGhlIGFscmVhZHktYWxsb2NhdGVkIG9iamVjdAotICAvLyBzdWJfbWVzc2FnZSwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlIG1lc3NhZ2UuICBJZiB0aGUgZmllbGQgY29udGFpbmVkIGEKLSAgLy8gbWVzc2FnZSwgdGhhdCBtZXNzYWdlIGlzIGRlbGV0ZWQuICBJZiBzdWJfbWVzc2FnZSBpcyBOVUxMLCB0aGUgZmllbGQgaXMKLSAgLy8gY2xlYXJlZC4KLSAgdmlydHVhbCB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKLSAgLy8gUmVsZWFzZXMgdGhlIG1lc3NhZ2Ugc3BlY2lmaWVkIGJ5ICdmaWVsZCcgYW5kIHJldHVybnMgdGhlIHBvaW50ZXIsCi0gIC8vIFJlbGVhc2VNZXNzYWdlKCkgd2lsbCByZXR1cm4gdGhlIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IGlmIGl0IGV4aXN0cy4KLSAgLy8gT3RoZXJ3aXNlLCBpdCBtYXkgb3IgbWF5IG5vdCByZXR1cm4gTlVMTC4gIEluIGFueSBjYXNlLCBpZiB0aGUgcmV0dXJuIHZhbHVlCi0gIC8vIGlzIG5vbi1OVUxMLCB0aGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlci4KLSAgLy8gSWYgdGhlIGZpZWxkIGV4aXN0ZWQgKEhhc0ZpZWxkKCkgaXMgdHJ1ZSksIHRoZW4gdGhlIHJldHVybmVkIHBvaW50ZXIgd2lsbAotICAvLyBiZSB0aGUgc2FtZSBhcyB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBNdXRhYmxlTWVzc2FnZSgpLgotICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQ2xlYXJGaWVsZCgpLgotICB2aXJ0dWFsIE1lc3NhZ2UqIFJlbGVhc2VNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0ID0gMDsKLQotCi0gIC8vIFJlcGVhdGVkIGZpZWxkIGdldHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRoZXNlIGdldCB0aGUgdmFsdWUgb2Ygb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZC4KLQotICB2aXJ0dWFsIGludDMyICBHZXRSZXBlYXRlZEludDMyIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBpbnQ2NCAgR2V0UmVwZWF0ZWRJbnQ2NCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdWludDMyIEdldFJlcGVhdGVkVUludDMyKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHVpbnQ2NCBHZXRSZXBlYXRlZFVJbnQ2NChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBmbG9hdCAgR2V0UmVwZWF0ZWRGbG9hdCAoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgZG91YmxlIEdldFJlcGVhdGVkRG91YmxlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3QgPSAwOwotICB2aXJ0dWFsIGJvb2wgICBHZXRSZXBlYXRlZEJvb2wgIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBzdHJpbmcgR2V0UmVwZWF0ZWRTdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4KSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0UmVwZWF0ZWRFbnVtKAotICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOwotICAvLyBHZXRSZXBlYXRlZEVudW1WYWx1ZSgpIHJldHVybnMgYW4gZW51bSBmaWVsZCdzIHZhbHVlIGFzIGFuIGludGVnZXIgcmF0aGVyCi0gIC8vIHRoYW4gYW4gRW51bVZhbHVlRGVzY3JpcHRvciouIElmIHRoZSBpbnRlZ2VyIHZhbHVlIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYQotICAvLyBrbm93biB2YWx1ZSBkZXNjcmlwdG9yLCBhIG5ldyB2YWx1ZSBkZXNjcmlwdG9yIGlzIGNyZWF0ZWQuIChTdWNoIGEgdmFsdWUKLSAgLy8gd2lsbCBvbmx5IGJlIHByZXNlbnQgd2hlbiB0aGUgbmV3IHVua25vd24tZW51bS12YWx1ZSBzZW1hbnRpY3MgYXJlIGVuYWJsZWQKLSAgLy8gZm9yIGEgbWVzc2FnZS4pCi0gIHZpcnR1YWwgaW50IEdldFJlcGVhdGVkRW51bVZhbHVlKAotICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7Ci0gIHZpcnR1YWwgY29uc3QgTWVzc2FnZSYgR2V0UmVwZWF0ZWRNZXNzYWdlKAotICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOwotCi0gIC8vIFNlZSBHZXRTdHJpbmdSZWZlcmVuY2UoKSwgYWJvdmUuCi0gIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICBpbnQgaW5kZXgsIHN0cmluZyogc2NyYXRjaCkgY29uc3QgPSAwOwotCi0KLSAgLy8gUmVwZWF0ZWQgZmllbGQgbXV0YXRvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlc2UgbXV0YXRlIHRoZSB2YWx1ZSBvZiBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLgotCi0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEludDMyIChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50MzIgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEludDY0IChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50NjQgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgdWludDMyIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZFVJbnQ2NChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgdWludDY0IHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEZsb2F0IChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgZmxvYXQgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgZG91YmxlIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZEJvb2wgIChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgYm9vbCAgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBTZXRSZXBlYXRlZFN0cmluZyhNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCA9IDA7Ci0gIC8vIFNldCBhbiBlbnVtIGZpZWxkJ3MgdmFsdWUgd2l0aCBhbiBpbnRlZ2VyIHJhdGhlciB0aGFuIEVudW1WYWx1ZURlc2NyaXB0b3IuCi0gIC8vIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEga25vd24gZW51bSB2YWx1ZSwgZWl0aGVyIGJlaGF2aW9yIGlzCi0gIC8vIHVuZGVmaW5lZCAoZm9yIHByb3RvMiBtZXNzYWdlcyksIG9yIHRoZSB2YWx1ZSBpcyBhY2NlcHRlZCBzaWxlbnRseSBmb3IKLSAgLy8gbWVzc2FnZXMgd2l0aCBuZXcgdW5rbm93bi1lbnVtLXZhbHVlIHNlbWFudGljcy4KLSAgdmlydHVhbCB2b2lkIFNldFJlcGVhdGVkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0OwotICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkIHdpdGggYSBtZXNzYWdlCi0gIC8vIHR5cGUuCi0gIHZpcnR1YWwgTWVzc2FnZSogTXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKLSAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOwotCi0KLSAgLy8gUmVwZWF0ZWQgZmllbGQgYWRkZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlc2UgYWRkIGFuIGVsZW1lbnQgdG8gYSByZXBlYXRlZCBmaWVsZC4KLQotICB2aXJ0dWFsIHZvaWQgQWRkSW50MzIgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50MzIgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBZGRJbnQ2NCAoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQ2NCAgdmFsdWUpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEFkZFVJbnQzMihNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIHVpbnQzMiB2YWx1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgQWRkVUludDY0KE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgdWludDY0IHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBZGRGbG9hdCAoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBmbG9hdCAgdmFsdWUpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEFkZERvdWJsZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGRvdWJsZSB2YWx1ZSkgY29uc3QgPSAwOwotICB2aXJ0dWFsIHZvaWQgQWRkQm9vbCAgKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCAgIHZhbHVlKSBjb25zdCA9IDA7Ci0gIHZpcnR1YWwgdm9pZCBBZGRTdHJpbmcoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCB2b2lkIEFkZEVudW0gIChNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0ID0gMDsKLSAgLy8gU2V0IGFuIGVudW0gZmllbGQncyB2YWx1ZSB3aXRoIGFuIGludGVnZXIgcmF0aGVyIHRoYW4gRW51bVZhbHVlRGVzY3JpcHRvci4KLSAgLy8gSWYgdGhlIHZhbHVlIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYSBrbm93biBlbnVtIHZhbHVlLCBlaXRoZXIgYmVoYXZpb3IgaXMKLSAgLy8gdW5kZWZpbmVkIChmb3IgcHJvdG8yIG1lc3NhZ2VzKSwgb3IgdGhlIHZhbHVlIGlzIGFjY2VwdGVkIHNpbGVudGx5IGZvcgotICAvLyBtZXNzYWdlcyB3aXRoIG5ldyB1bmtub3duLWVudW0tdmFsdWUgc2VtYW50aWNzLgotICB2aXJ0dWFsIHZvaWQgQWRkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0OwotICAvLyBTZWUgTXV0YWJsZU1lc3NhZ2UoKSBmb3IgY29tbWVudHMgb24gdGhlICJmYWN0b3J5IiBwYXJhbWV0ZXIuCi0gIHZpcnR1YWwgTWVzc2FnZSogQWRkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3QgPSAwOwotCi0gIC8vIEFwcGVuZHMgYW4gYWxyZWFkeS1hbGxvY2F0ZWQgb2JqZWN0ICduZXdfZW50cnknIHRvIHRoZSByZXBlYXRlZCBmaWVsZAotICAvLyBzcGVjaWZ5ZWQgYnkgJ2ZpZWxkJyBwYXNzaW5nIG93bmVyc2hpcCB0byB0aGUgbWVzc2FnZS4KLSAgLy8gVE9ETyh0bWFyZWspOiBNYWtlIHZpcnR1YWwgYWZ0ZXIgYWxsIHN1YmNsYXNzZXMgaGF2ZSBiZWVuCi0gIC8vIHVwZGF0ZWQuCi0gIHZpcnR1YWwgdm9pZCBBZGRBbGxvY2F0ZWRNZXNzYWdlKE1lc3NhZ2UqIC8qIG1lc3NhZ2UgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogLypmaWVsZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogLyogbmV3X2VudHJ5ICovKSBjb25zdCB7fQotCi0KLSAgLy8gR2V0IGEgUmVwZWF0ZWRGaWVsZFJlZiBvYmplY3QgdGhhdCBjYW4gYmUgdXNlZCB0byByZWFkIHRoZSB1bmRlcmx5aW5nCi0gIC8vIHJlcGVhdGVkIGZpZWxkLiBUaGUgdHlwZSBwYXJhbWV0ZXIgVCBtdXN0IGJlIHNldCBhY2NvcmRpbmcgdG8gdGhlCi0gIC8vIGZpZWxkJ3MgY3BwIHR5cGUuIFRoZSBmb2xsb3dpbmcgdGFibGUgc2hvd3MgdGhlIG1hcHBpbmcgZnJvbSBjcHAgdHlwZQotICAvLyB0byBhY2NlcHRhYmxlIFQuCi0gIC8vCi0gIC8vICAgZmllbGQtPmNwcF90eXBlKCkgICAgICBUCi0gIC8vICAgQ1BQVFlQRV9JTlQzMiAgICAgICAgaW50MzIKLSAgLy8gICBDUFBUWVBFX1VJTlQzMiAgICAgICB1aW50MzIKLSAgLy8gICBDUFBUWVBFX0lOVDY0ICAgICAgICBpbnQ2NAotICAvLyAgIENQUFRZUEVfVUlOVDY0ICAgICAgIHVpbnQ2NAotICAvLyAgIENQUFRZUEVfRE9VQkxFICAgICAgIGRvdWJsZQotICAvLyAgIENQUFRZUEVfRkxPQVQgICAgICAgIGZsb2F0Ci0gIC8vICAgQ1BQVFlQRV9CT09MICAgICAgICAgYm9vbAotICAvLyAgIENQUFRZUEVfRU5VTSAgICAgICAgIGdlbmVyYXRlZCBlbnVtIHR5cGUgb3IgaW50MzIKLSAgLy8gICBDUFBUWVBFX1NUUklORyAgICAgICBzdHJpbmcKLSAgLy8gICBDUFBUWVBFX01FU1NBR0UgICAgICBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlIG9yIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UKLSAgLy8KLSAgLy8gQSBSZXBlYXRlZEZpZWxkUmVmIG9iamVjdCBjYW4gYmUgY29waWVkIGFuZCB0aGUgcmVzdWx0ZWQgb2JqZWN0IHdpbGwgcG9pbnQKLSAgLy8gdG8gdGhlIHNhbWUgcmVwZWF0ZWQgZmllbGQgaW4gdGhlIHNhbWUgbWVzc2FnZS4gVGhlIG9iamVjdCBjYW4gYmUgdXNlZCBhcwotICAvLyBsb25nIGFzIHRoZSBtZXNzYWdlIGlzIG5vdCBkZXN0cm95ZWQuCi0gIC8vCi0gIC8vIE5vdGUgdGhhdCB0byB1c2UgdGhpcyBtZXRob2QgdXNlcnMgbmVlZCB0byBpbmNsdWRlIHRoZSBoZWFkZXIgZmlsZQotICAvLyAiZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaCIgKHdoaWNoIGRlZmluZXMgdGhlIFJlcGVhdGVkRmllbGRSZWYKLSAgLy8gY2xhc3MgdGVtcGxhdGVzKS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgUmVwZWF0ZWRGaWVsZFJlZjxUPiBHZXRSZXBlYXRlZEZpZWxkUmVmKAotICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0KLSAgLy8gTGlrZSBHZXRSZXBlYXRlZEZpZWxkUmVmKCkgYnV0IHJldHVybiBhbiBvYmplY3QgdGhhdCBjYW4gYWxzbyBiZSB1c2VkCi0gIC8vIG1hbmlwdWxhdGUgdGhlIHVuZGVybHlpbmcgcmVwZWF0ZWQgZmllbGQuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIE11dGFibGVSZXBlYXRlZEZpZWxkUmVmPFQ+IEdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmKAotICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0KLSAgLy8gREVQUkVDQVRFRC4gUGxlYXNlIHVzZSBHZXQoTXV0YWJsZSlSZXBlYXRlZEZpZWxkUmVmKCkgZm9yIHJlcGVhdGVkIGZpZWxkCi0gIC8vIGFjY2Vzcy4gVGhlIGZvbGxvd2luZyByZXBlYXRlZCBmaWVsZCBhY2Nlc29ycyB3aWxsIGJlIHJlbW92ZWQgaW4gdGhlCi0gIC8vIGZ1dHVyZS4KLSAgLy8KLSAgLy8gUmVwZWF0ZWQgZmllbGQgYWNjZXNzb3JzICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRoZSBtZXRob2RzIGFib3ZlLCBlLmcuIEdldFJlcGVhdGVkSW50MzIobXNnLCBmZCwgaW5kZXgpLCBwcm92aWRlIHNpbmd1bGFyCi0gIC8vIGFjY2VzcyB0byB0aGUgZGF0YSBpbiBhIFJlcGVhdGVkRmllbGQuICBUaGUgbWV0aG9kcyBiZWxvdyBwcm92aWRlIGFnZ3JlZ2F0ZQotICAvLyBhY2Nlc3MgYnkgZXhwb3NpbmcgdGhlIFJlcGVhdGVkRmllbGQgb2JqZWN0IGl0c2VsZiB3aXRoIHRoZSBNZXNzYWdlLgotICAvLyBBcHBseWluZyB0aGVzZSB0ZW1wbGF0ZXMgdG8gaW5hcHByb3ByaWF0ZSB0eXBlcyB3aWxsIGxlYWQgdG8gYW4gdW5kZWZpbmVkCi0gIC8vIHJlZmVyZW5jZSBhdCBsaW5rIHRpbWUgKGUuZy4gR2V0UmVwZWF0ZWRGaWVsZDwqKipkb3VibGU+KSwgb3IgcG9zc2libHkgYQotICAvLyB0ZW1wbGF0ZSBtYXRjaGluZyBlcnJvciBhdCBjb21waWxlIHRpbWUgKGUuZy4gR2V0UmVwZWF0ZWRQdHJGaWVsZDxGaWxlPikuCi0gIC8vCi0gIC8vIFVzYWdlIGV4YW1wbGU6IG15X2RvdWJzID0gcmVmbC0+R2V0UmVwZWF0ZWRGaWVsZDxkb3VibGU+KG1zZywgZmQpOwotCi0gIC8vIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgR2V0UmVwZWF0ZWRGaWVsZFJlZigpLgotICAvLwotICAvLyBmb3IgVCA9IENvcmQgYW5kIGFsbCBwcm90b2J1ZiBzY2FsYXIgdHlwZXMgZXhjZXB0IGVudW1zLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgotICBjb25zdCBSZXBlYXRlZEZpZWxkPFQ+JiBHZXRSZXBlYXRlZEZpZWxkKAotICAgICAgY29uc3QgTWVzc2FnZSYsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopIGNvbnN0OwotCi0gIC8vIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgR2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWYoKS4KLSAgLy8KLSAgLy8gZm9yIFQgPSBDb3JkIGFuZCBhbGwgcHJvdG9idWYgc2NhbGFyIHR5cGVzIGV4Y2VwdCBlbnVtcy4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgUmVwZWF0ZWRGaWVsZDxUPiogTXV0YWJsZVJlcGVhdGVkRmllbGQoCi0gICAgICBNZXNzYWdlKiwgY29uc3QgRmllbGREZXNjcmlwdG9yKikgY29uc3Q7Ci0KLSAgLy8gREVQUkVDQVRFRC4gUGxlYXNlIHVzZSBHZXRSZXBlYXRlZEZpZWxkUmVmKCkuCi0gIC8vCi0gIC8vIGZvciBUID0gc3RyaW5nLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U3RyaW5nUGllY2VGaWVsZAotICAvLyAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgJiBkZXNjZW5kYW50cy4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxUPiYgR2V0UmVwZWF0ZWRQdHJGaWVsZCgKLSAgICAgIGNvbnN0IE1lc3NhZ2UmLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqKSBjb25zdDsKLQotICAvLyBERVBSRUNBVEVELiBQbGVhc2UgdXNlIEdldE11dGFibGVSZXBlYXRlZEZpZWxkUmVmKCkuCi0gIC8vCi0gIC8vIGZvciBUID0gc3RyaW5nLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U3RyaW5nUGllY2VGaWVsZAotICAvLyAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgJiBkZXNjZW5kYW50cy4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KLSAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogTXV0YWJsZVJlcGVhdGVkUHRyRmllbGQoCi0gICAgICBNZXNzYWdlKiwgY29uc3QgRmllbGREZXNjcmlwdG9yKikgY29uc3Q7Ci0KLSAgLy8gRXh0ZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gVHJ5IHRvIGZpbmQgYW4gZXh0ZW5zaW9uIG9mIHRoaXMgbWVzc2FnZSB0eXBlIGJ5IGZ1bGx5LXF1YWxpZmllZCBmaWVsZAotICAvLyBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vIGV4dGVuc2lvbiBpcyBrbm93biBmb3IgdGhpcyBuYW1lIG9yIG51bWJlci4KLSAgdmlydHVhbCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRLbm93bkV4dGVuc2lvbkJ5TmFtZSgKLSAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgPSAwOwotCi0gIC8vIFRyeSB0byBmaW5kIGFuIGV4dGVuc2lvbiBvZiB0aGlzIG1lc3NhZ2UgdHlwZSBieSBmaWVsZCBudW1iZXIuCi0gIC8vIFJldHVybnMgTlVMTCBpZiBubyBleHRlbnNpb24gaXMga25vd24gZm9yIHRoaXMgbmFtZSBvciBudW1iZXIuCi0gIHZpcnR1YWwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kS25vd25FeHRlbnNpb25CeU51bWJlcigKLSAgICAgIGludCBudW1iZXIpIGNvbnN0ID0gMDsKLQotICAvLyBGZWF0dXJlIEZsYWdzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBEb2VzIHRoaXMgbWVzc2FnZSBzdXBwb3J0IHN0b3JpbmcgYXJiaXRyYXJ5IGludGVnZXIgdmFsdWVzIGluIGVudW0gZmllbGRzPwotICAvLyBJZiB8dHJ1ZXwsIEdldEVudW1WYWx1ZS9TZXRFbnVtVmFsdWUgYW5kIGFzc29jaWF0ZWQgcmVwZWF0ZWQtZmllbGQgdmVyc2lvbnMKLSAgLy8gdGFrZSBhcmJpdHJhcnkgaW50ZWdlciB2YWx1ZXMsIGFuZCB0aGUgbGVnYWN5IEdldEVudW0oKSBnZXR0ZXIgd2lsbAotICAvLyBkeW5hbWljYWxseSBjcmVhdGUgYW4gRW51bVZhbHVlRGVzY3JpcHRvciBmb3IgYW55IGludGVnZXIgdmFsdWUgd2l0aG91dAotICAvLyBvbmUuIElmIHxmYWxzZXwsIHNldHRpbmcgYW4gdW5rbm93biBlbnVtIHZhbHVlIHZpYSB0aGUgaW50ZWdlci1iYXNlZAotICAvLyBzZXR0ZXJzIHJlc3VsdHMgaW4gdW5kZWZpbmVkIGJlaGF2aW9yIChpbiBwcmFjdGljZSwgR09PR0xFX0RDSEVDSy1mYWlscykuCi0gIC8vCi0gIC8vIEdlbmVyaWMgY29kZSB0aGF0IHVzZXMgcmVmbGVjdGlvbiB0byBoYW5kbGUgbWVzc2FnZXMgd2l0aCBlbnVtIGZpZWxkcwotICAvLyBzaG91bGQgY2hlY2sgdGhpcyBmbGFnIGJlZm9yZSB1c2luZyB0aGUgaW50ZWdlci1iYXNlZCBzZXR0ZXIsIGFuZCBlaXRoZXIKLSAgLy8gZG93bmdyYWRlIHRvIGEgY29tcGF0aWJsZSB2YWx1ZSBvciB1c2UgdGhlIFVua25vd25GaWVsZFNldCBpZiBub3QuIEZvcgotICAvLyBleGFtcGxlOgotICAvLwotICAvLyBpbnQgbmV3X3ZhbHVlID0gR2V0VmFsdWVGcm9tQXBwbGljYXRpb25Mb2dpYygpOwotICAvLyBpZiAocmVmbGVjdGlvbi0+U3VwcG9ydHNVbmtub3duRW51bVZhbHVlcygpKSB7Ci0gIC8vICAgICByZWZsZWN0aW9uLT5TZXRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIG5ld192YWx1ZSk7Ci0gIC8vIH0gZWxzZSB7Ci0gIC8vICAgICBpZiAoZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCktPgotICAvLyAgICAgICAgICAgICBGaW5kVmFsdWVCeU51bXZlcihuZXdfdmFsdWUpICE9IE5VTEwpIHsKLSAgLy8gICAgICAgICByZWZsZWN0aW9uLT5TZXRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIG5ld192YWx1ZSk7Ci0gIC8vICAgICB9IGVsc2UgaWYgKGVtaXRfdW5rbm93bl9lbnVtX3ZhbHVlcykgewotICAvLyAgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpLT5BZGRWYXJpbnQoCi0gIC8vICAgICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwKLSAgLy8gICAgICAgICAgICAgbmV3X3ZhbHVlKTsKLSAgLy8gICAgIH0gZWxzZSB7Ci0gIC8vICAgICAgICAgLy8gY29udmVydCB2YWx1ZSB0byBhIGNvbXBhdGlibGUvZGVmYXVsdCB2YWx1ZS4KLSAgLy8gICAgICAgICBuZXdfdmFsdWUgPSBDb21wYXRpYmxlRG93bmdyYWRlKG5ld192YWx1ZSk7Ci0gIC8vICAgICAgICAgcmVmbGVjdGlvbi0+U2V0RW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkLCBuZXdfdmFsdWUpOwotICAvLyAgICAgfQotICAvLyB9Ci0gIHZpcnR1YWwgYm9vbCBTdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KLQotICAvLyBSZXR1cm5zIHRoZSBNZXNzYWdlRmFjdG9yeSBhc3NvY2lhdGVkIHdpdGggdGhpcyBtZXNzYWdlLiAgVGhpcyBjYW4gYmUKLSAgLy8gdXNlZnVsIGZvciBkZXRlcm1pbmluZyBpZiBhIG1lc3NhZ2UgaXMgYSBnZW5lcmF0ZWQgbWVzc2FnZSBvciBub3QsIGZvcgotICAvLyBleGFtcGxlOgotICAvLwotICAvLyBpZiAobWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRNZXNzYWdlRmFjdG9yeSgpID09Ci0gIC8vICAgICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSkgewotICAvLyAgIC8vIFRoaXMgaXMgYSBnZW5lcmF0ZWQgbWVzc2FnZS4KLSAgLy8gfQotICAvLwotICAvLyBJdCBjYW4gYWxzbyBiZSB1c2VkIHRvIGNyZWF0ZSBtb3JlIG1lc3NhZ2VzIG9mIHRoaXMgdHlwZSwgdGhvdWdoCi0gIC8vIE1lc3NhZ2U6Ok5ldygpIGlzIGFuIGVhc2llciB3YXkgdG8gYWNjb21wbGlzaCB0aGlzLgotICB2aXJ0dWFsIE1lc3NhZ2VGYWN0b3J5KiBHZXRNZXNzYWdlRmFjdG9yeSgpIGNvbnN0OwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gcHJvdGVjdGVkOgotICAvLyBPYnRhaW4gYSBwb2ludGVyIHRvIGEgUmVwZWF0ZWQgRmllbGQgU3RydWN0dXJlIGFuZCBkbyBzb21lIHR5cGUgY2hlY2tpbmc6Ci0gIC8vICAgb24gZmllbGQtPmNwcF90eXBlKCksCi0gIC8vICAgb24gZmllbGQtPmZpZWxkX29wdGlvbigpLmN0eXBlKCkgKGlmIGN0eXBlID49IDApCi0gIC8vICAgb2YgZmllbGQtPm1lc3NhZ2VfdHlwZSgpIChpZiBtZXNzYWdlX3R5cGUgIT0gTlVMTCkuCi0gIC8vIFdlIHVzZSAyIHJvdXRpbmUgcmF0aGVyIHRoYW4gNCAoY29uc3QgdnMgbXV0YWJsZSkgeCAoc2NhbGFyIHZzIHBvaW50ZXIpLgotICB2aXJ0dWFsIHZvaWQqIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAotICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlLAotICAgICAgaW50IGN0eXBlLCBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIGNvbnN0ID0gMDsKLQotICAvLyBUT0RPKGppZWx1bykgLSBtYWtlIGl0IHB1cmUgdmlydHVhbCBhZnRlciB1cGRhdGluZyBhbGwgdGhlIHN1YmNsYXNzZXMuCi0gIHZpcnR1YWwgY29uc3Qgdm9pZCogR2V0UmF3UmVwZWF0ZWRGaWVsZCgKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgY3BwdHlwZSwgaW50IGN0eXBlLAotICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlKSBjb25zdCB7Ci0gICAgcmV0dXJuIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAotICAgICAgICBjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkLCBjcHB0eXBlLCBjdHlwZSwgbWVzc2FnZV90eXBlKTsKLSAgfQotCi0gIC8vIFRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUgdXNlZCB0byBpbXBsZW1lbnQgKE11dGFibGUpUmVwZWF0ZWRGaWVsZFJlZi4KLSAgLy8gQSBSZWYgb2JqZWN0IHdpbGwgc3RvcmUgYSByYXcgcG9pbnRlciB0byB0aGUgcmVwZWF0ZWQgZmllbGQgZGF0YSAob2J0YWluZWQKLSAgLy8gZnJvbSBSZXBlYXRlZEZpZWxkRGF0YSgpKSBhbmQgYSBwb2ludGVyIHRvIGEgQWNjZXNzb3IgKG9idGFpbmVkIGZyb20KLSAgLy8gUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKSB3aGljaCB3aWxsIGJlIHVzZWQgdG8gYWNjZXNzIHRoZSByYXcgZGF0YS4KLSAgLy8KLSAgLy8gVE9ETyh4aWFvZmVuZyk6IE1ha2UgdGhlc2UgbWV0aG9kcyBwdXJlLXZpcnR1YWwuCi0KLSAgLy8gUmV0dXJucyBhIHJhdyBwb2ludGVyIHRvIHRoZSByZXBlYXRlZCBmaWVsZAotICAvLwotICAvLyAiY3BwX3R5cGUiIGFuZCAibWVzc2FnZV90eXBlIiBhcmUgZGVjdWRlZCBmcm9tIHRoZSB0eXBlIHBhcmFtZXRlciBUIHBhc3NlZAotICAvLyB0byBHZXQoTXV0YWJsZSlSZXBlYXRlZEZpZWxkUmVmLiBJZiBUIGlzIGEgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZSwKLSAgLy8gIm1lc3NhZ2VfdHlwZSIgc2hvdWxkIGJlIHNldCB0byBpdHMgZGVzY3JpcHRvci4gT3RoZXJ3aXNlICJtZXNzYWdlX3R5cGUiCi0gIC8vIHNob3VsZCBiZSBzZXQgdG8gTlVMTC4gSW1wbGVtZW50YXRpb25zIG9mIHRoaXMgbWV0aG9kIHNob3VsZCBjaGVjayB3aGV0aGVyCi0gIC8vICJjcHBfdHlwZSIvIm1lc3NhZ2VfdHlwZSIgaXMgY29uc2lzdGVudCB3aXRoIHRoZSBhY3R1YWwgdHlwZSBvZiB0aGUgZmllbGQuCi0gIC8vIFdlIHVzZSAxIHJvdXRpbmUgcmF0aGVyIHRoYW4gMiAoY29uc3QgdnMgbXV0YWJsZSkgYmVjYXVzZSBpdCBpcyBwcm90ZWN0ZWQKLSAgLy8gYW5kIGl0IGRvZXNuJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLgotICB2aXJ0dWFsIHZvaWQqIFJlcGVhdGVkRmllbGREYXRhKAotICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSwKLSAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgY29uc3Q7Ci0KLSAgLy8gVGhlIHJldHVybmVkIHBvaW50ZXIgc2hvdWxkIHBvaW50IHRvIGEgc2luZ2xldG9uIGluc3RhbmNlIHdoaWNoIGltcGxlbWVudHMKLSAgLy8gdGhlIFJlcGVhdGVkRmllbGRBY2Nlc3NvciBpbnRlcmZhY2UuCi0gIHZpcnR1YWwgY29uc3QgaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRBY2Nlc3NvciogUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGU+Ci0gIGZyaWVuZCBjbGFzcyBSZXBlYXRlZEZpZWxkUmVmOwotICB0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGU+Ci0gIGZyaWVuZCBjbGFzcyBNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZjsKLSAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6cHl0aG9uOjpNYXBSZWZsZWN0aW9uRnJpZW5kOwotCi0gIC8vIFNwZWNpYWwgdmVyc2lvbiBmb3Igc3BlY2lhbGl6ZWQgaW1wbGVtZW50YXRpb25zIG9mIHN0cmluZy4gIFdlIGNhbid0IGNhbGwKLSAgLy8gTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQgZGlyZWN0bHkgaGVyZSBiZWNhdXNlIHdlIGRvbid0IGhhdmUgYWNjZXNzIHRvCi0gIC8vIEZpZWxkT3B0aW9uczo6KiB3aGljaCBhcmUgZGVmaW5lZCBpbiBkZXNjcmlwdG9yLnBiLmguICBJbmNsdWRpbmcgdGhhdAotICAvLyBmaWxlIGhlcmUgaXMgbm90IHBvc3NpYmxlIGJlY2F1c2UgaXQgd291bGQgY2F1c2UgYSBjaXJjdWxhciBpbmNsdWRlIGN5Y2xlLgotICAvLyBXZSB1c2UgMSByb3V0aW5lIHJhdGhlciB0aGFuIDIgKGNvbnN0IHZzIG11dGFibGUpIGJlY2F1c2UgaXQgaXMgcHJpdmF0ZQotICAvLyBhbmQgbXV0YWJsZSBhIHJlcGVhdGVkIHN0cmluZyBmaWVsZCBkb2Vzbid0IGNoYW5nZSB0aGUgbWVzc2FnZS4KLSAgdm9pZCogTXV0YWJsZVJhd1JlcGVhdGVkU3RyaW5nKAotICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCBpc19zdHJpbmcpIGNvbnN0OwotCi0gIGZyaWVuZCBjbGFzcyBNYXBSZWZsZWN0aW9uVGVzdGVyOwotICAvLyBUT0RPKGppZWx1bykgLSBtYWtlIHRoZSBtYXAgQVBJcyBwdXJlIHZpcnR1YWwgYWZ0ZXIgdXBkYXRpbmcKLSAgLy8gYWxsIHRoZSBzdWJjbGFzc2VzLgotICAvLyBSZXR1cm5zIHRydWUgaWYga2V5IGlzIGluIG1hcC4gUmV0dXJucyBmYWxzZSBpZiBrZXkgaXMgbm90IGluIG1hcCBmaWVsZC4KLSAgdmlydHVhbCBib29sIENvbnRhaW5zTWFwS2V5KGNvbnN0IE1lc3NhZ2UmIC8qIG1lc3NhZ2UqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogLyogZmllbGQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNYXBLZXkmIC8qIGtleSAqLykgY29uc3QgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIC8vIElmIGtleSBpcyBpbiBtYXAgZmllbGQ6IFNhdmVzIHRoZSB2YWx1ZSBwb2ludGVyIHRvIHZhbCBhbmQgcmV0dXJucwotICAvLyBmYWxzZS4gSWYga2V5IGluIG5vdCBpbiBtYXAgZmllbGQ6IEluc2VydCB0aGUga2V5IGludG8gbWFwLCBzYXZlcwotICAvLyB2YWx1ZSBwb2ludGVyIHRvIHZhbCBhbmQgcmV0dW5zIHRydWUuCi0gIHZpcnR1YWwgYm9vbCBJbnNlcnRPckxvb2t1cE1hcFZhbHVlKE1lc3NhZ2UqIC8qIG1lc3NhZ2UgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogLyogZmllbGQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYgLyoga2V5ICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZVJlZiogLyogdmFsICovKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gRGVsZXRlIGFuZCByZXR1cm5zIHRydWUgaWYga2V5IGlzIGluIHRoZSBtYXAgZmllbGQuIFJldHVybnMgZmFsc2UKLSAgLy8gb3RoZXJ3aXNlLgotICB2aXJ0dWFsIGJvb2wgRGVsZXRlTWFwVmFsdWUoTWVzc2FnZSogLyogbWVzYWdlICovLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAvKiBmaWVsZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYgLyoga2V5ICovKSBjb25zdCB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gUmV0dXJucyBhIE1hcEl0ZXJhdG9yIHJlZmVycmluZyB0byB0aGUgZmlyc3QgZWxlbWVudCBpbiB0aGUgbWFwIGZpZWxkLgotICAvLyBJZiB0aGUgbWFwIGZpZWxkIGlzIGVtcHR5LCB0aGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIHNhbWUgYXMKLSAgLy8gcmVmbGVjdGlvbjo6TWFwRW5kLiBNdXRhdGlvbiB0byB0aGUgZmllbGQgbWF5IGludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgotICB2aXJ0dWFsIE1hcEl0ZXJhdG9yIE1hcEJlZ2luKAotICAgICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgYSBNYXBJdGVyYXRvciByZWZlcnJpbmcgdG8gdGhlIHRoZW9yZXRpY2FsIGVsZW1lbnQgdGhhdCB3b3VsZAotICAvLyBmb2xsb3cgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgbWFwIGZpZWxkLiBJdCBkb2VzIG5vdCBwb2ludCB0byBhbnkKLSAgLy8gcmVhbCBlbGVtZW50LiBNdXRhdGlvbiB0byB0aGUgZmllbGQgbWF5IGludmFsaWRhdGUgdGhlIGl0ZXJhdG9yLgotICB2aXJ0dWFsIE1hcEl0ZXJhdG9yIE1hcEVuZCgKLSAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLQotICAvLyBHZXQgdGhlIG51bWJlciBvZiA8a2V5LCB2YWx1ZT4gcGFpciBvZiBhIG1hcCBmaWVsZC4gVGhlIHJlc3VsdCBtYXkgYmUKLSAgLy8gZGlmZmVyZW50IGZyb20gRmllbGRTaXplIHdoaWNoIGNhbiBoYXZlIGR1cGxpY2F0ZSBrZXlzLgotICB2aXJ0dWFsIGludCBNYXBTaXplKGNvbnN0IE1lc3NhZ2UmIC8qIG1lc3NhZ2UgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAvKiBmaWVsZCAqLykgY29uc3QgewotICAgIHJldHVybiAwOwotICB9Ci0KLSAgLy8gSGVscCBtZXRob2QgZm9yIE1hcEl0ZXJhdG9yLgotICBmcmllbmQgY2xhc3MgTWFwSXRlcmF0b3I7Ci0gIHZpcnR1YWwgaW50ZXJuYWw6Ok1hcEZpZWxkQmFzZSogTWFwRGF0YSgKLSAgICAgIE1lc3NhZ2UqIC8qIG1lc3NhZ2UgKi8sIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogLyogZmllbGQgKi8pIGNvbnN0IHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZWZsZWN0aW9uKTsKLX07Ci0KLS8vIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYSBmYWN0b3J5IGZvciBtZXNzYWdlIG9iamVjdHMuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTWVzc2FnZUZhY3RvcnkgewotIHB1YmxpYzoKLSAgaW5saW5lIE1lc3NhZ2VGYWN0b3J5KCkge30KLSAgdmlydHVhbCB+TWVzc2FnZUZhY3RvcnkoKTsKLQotICAvLyBHaXZlbiBhIERlc2NyaXB0b3IsIGdldHMgb3IgY29uc3RydWN0cyB0aGUgZGVmYXVsdCAocHJvdG90eXBlKSBNZXNzYWdlCi0gIC8vIG9mIHRoYXQgdHlwZS4gIFlvdSBjYW4gdGhlbiBjYWxsIHRoYXQgbWVzc2FnZSdzIE5ldygpIG1ldGhvZCB0byBjb25zdHJ1Y3QKLSAgLy8gYSBtdXRhYmxlIG1lc3NhZ2Ugb2YgdGhhdCB0eXBlLgotICAvLwotICAvLyBDYWxsaW5nIHRoaXMgbWV0aG9kIHR3aWNlIHdpdGggdGhlIHNhbWUgRGVzY3JpcHRvciByZXR1cm5zIHRoZSBzYW1lCi0gIC8vIG9iamVjdC4gIFRoZSByZXR1cm5lZCBvYmplY3QgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgZmFjdG9yeS4gIEFsc28sIGFueQotICAvLyBvYmplY3RzIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgcHJvdG90eXBlJ3MgTmV3KCkgbWV0aG9kIHNoYXJlIHNvbWUgZGF0YQotICAvLyB3aXRoIHRoZSBwcm90b3R5cGUsIHNvIHRoZXNlIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSB0aGUgTWVzc2FnZUZhY3RvcnkKLSAgLy8gaXMgZGVzdHJveWVkLgotICAvLwotICAvLyBUaGUgZ2l2ZW4gZGVzY3JpcHRvciBtdXN0IG91dGxpdmUgdGhlIHJldHVybmVkIG1lc3NhZ2UsIGFuZCBoZW5jZSBtdXN0Ci0gIC8vIG91dGxpdmUgdGhlIE1lc3NhZ2VGYWN0b3J5LgotICAvLwotICAvLyBTb21lIGltcGxlbWVudGF0aW9ucyBkbyBub3Qgc3VwcG9ydCBhbGwgdHlwZXMuICBHZXRQcm90b3R5cGUoKSB3aWxsCi0gIC8vIHJldHVybiBOVUxMIGlmIHRoZSBkZXNjcmlwdG9yIHBhc3NlZCBpbiBpcyBub3Qgc3VwcG9ydGVkLgotICAvLwotICAvLyBUaGlzIG1ldGhvZCBtYXkgb3IgbWF5IG5vdCBiZSB0aHJlYWQtc2FmZSBkZXBlbmRpbmcgb24gdGhlIGltcGxlbWVudGF0aW9uLgotICAvLyBFYWNoIGltcGxlbWVudGF0aW9uIHNob3VsZCBkb2N1bWVudCBpdHMgb3duIGRlZ3JlZSB0aHJlYWQtc2FmZXR5LgotICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UqIEdldFByb3RvdHlwZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSA9IDA7Ci0KLSAgLy8gR2V0cyBhIE1lc3NhZ2VGYWN0b3J5IHdoaWNoIHN1cHBvcnRzIGFsbCBnZW5lcmF0ZWQsIGNvbXBpbGVkLWluIG1lc3NhZ2VzLgotICAvLyBJbiBvdGhlciB3b3JkcywgZm9yIGFueSBjb21waWxlZC1pbiB0eXBlIEZvb01lc3NhZ2UsIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKLSAgLy8gICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKAotICAvLyAgICAgRm9vTWVzc2FnZTo6ZGVzY3JpcHRvcigpKSA9PSBGb29NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCkKLSAgLy8gVGhpcyBmYWN0b3J5IHN1cHBvcnRzIGFsbCB0eXBlcyB3aGljaCBhcmUgZm91bmQgaW4KLSAgLy8gRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkuICBJZiBnaXZlbiBhIGRlc2NyaXB0b3IgZnJvbSBhbnkgb3RoZXIKLSAgLy8gcG9vbCwgR2V0UHJvdG90eXBlKCkgd2lsbCByZXR1cm4gTlVMTC4gIChZb3UgY2FuIGFsc28gY2hlY2sgaWYgYQotICAvLyBkZXNjcmlwdG9yIGlzIGZvciBhIGdlbmVyYXRlZCBtZXNzYWdlIGJ5IGNoZWNraW5nIGlmCi0gIC8vIGRlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpID09IERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLikKLSAgLy8KLSAgLy8gVGhpcyBmYWN0b3J5IGlzIDEwMCUgdGhyZWFkLXNhZmU7IGNhbGxpbmcgR2V0UHJvdG90eXBlKCkgZG9lcyBub3QgbW9kaWZ5Ci0gIC8vIGFueSBzaGFyZWQgZGF0YS4KLSAgLy8KLSAgLy8gVGhpcyBmYWN0b3J5IGlzIGEgc2luZ2xldG9uLiAgVGhlIGNhbGxlciBtdXN0IG5vdCBkZWxldGUgdGhlIG9iamVjdC4KLSAgc3RhdGljIE1lc3NhZ2VGYWN0b3J5KiBnZW5lcmF0ZWRfZmFjdG9yeSgpOwotCi0gIC8vIEZvciBpbnRlcm5hbCB1c2Ugb25seTogIFJlZ2lzdGVycyBhIC5wcm90byBmaWxlIGF0IHN0YXRpYyBpbml0aWFsaXphdGlvbgotICAvLyB0aW1lLCB0byBiZSBwbGFjZWQgaW4gZ2VuZXJhdGVkX2ZhY3RvcnkuICBUaGUgZmlyc3QgdGltZSBHZXRQcm90b3R5cGUoKQotICAvLyBpcyBjYWxsZWQgd2l0aCBhIGRlc2NyaXB0b3IgZnJvbSB0aGlzIGZpbGUsIHxyZWdpc3Rlcl9tZXNzYWdlc3wgd2lsbCBiZQotICAvLyBjYWxsZWQsIHdpdGggdGhlIGZpbGUgbmFtZSBhcyB0aGUgcGFyYW1ldGVyLiAgSXQgbXVzdCBjYWxsCi0gIC8vIEludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKCkgKGJlbG93KSB0byByZWdpc3RlciBlYWNoIG1lc3NhZ2UgdHlwZQotICAvLyBpbiB0aGUgZmlsZS4gIFRoaXMgc3RyYW5nZSBtZWNoYW5pc20gaXMgbmVjZXNzYXJ5IGJlY2F1c2UgZGVzY3JpcHRvcnMgYXJlCi0gIC8vIGJ1aWx0IGxhemlseSwgc28gd2UgY2FuJ3QgcmVnaXN0ZXIgdHlwZXMgYnkgdGhlaXIgZGVzY3JpcHRvciB1bnRpbCB3ZQotICAvLyBrbm93IHRoYXQgdGhlIGRlc2NyaXB0b3IgZXhpc3RzLiAgfGZpbGVuYW1lfCBtdXN0IGJlIGEgcGVybWFuZW50IHN0cmluZy4KLSAgc3RhdGljIHZvaWQgSW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoCi0gICAgICBjb25zdCBjaGFyKiBmaWxlbmFtZSwgdm9pZCAoKnJlZ2lzdGVyX21lc3NhZ2VzKShjb25zdCBzdHJpbmcmKSk7Ci0KLSAgLy8gRm9yIGludGVybmFsIHVzZSBvbmx5OiAgUmVnaXN0ZXJzIGEgbWVzc2FnZSB0eXBlLiAgQ2FsbGVkIG9ubHkgYnkgdGhlCi0gIC8vIGZ1bmN0aW9ucyB3aGljaCBhcmUgcmVnaXN0ZXJlZCB3aXRoIEludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKCksCi0gIC8vIGFib3ZlLgotICBzdGF0aWMgdm9pZCBJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUpOwotCi0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUZhY3RvcnkpOwotfTsKLQotI2RlZmluZSBERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi10ZW1wbGF0ZTw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLUxJQlBST1RPQlVGX0VYUE9SVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotY29uc3QgUmVwZWF0ZWRGaWVsZDxUWVBFPiYgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRGaWVsZDxUWVBFPiggICBcCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7IFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotdGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1MSUJQUk9UT0JVRl9FWFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLVJlcGVhdGVkRmllbGQ8VFlQRT4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZEZpZWxkPFRZUEU+KCAgICAgXAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwotCi1ERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChpbnQzMikKLURFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKGludDY0KQotREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQodWludDMyKQotREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQodWludDY0KQotREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoZmxvYXQpCi1ERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChkb3VibGUpCi1ERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChib29sKQotCi0jdW5kZWYgREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgZm9yIHtHZXQsTXV0YWJsZX1SYXdSZXBlYXRlZFB0ckZpZWxkLiAgV2UgcHJvdmlkZQotLy8gc3BlY2lhbGl6YXRpb25zIGZvciA8c3RyaW5nPiwgPFN0cmluZ1BpZWNlRmllbGQ+IGFuZCA8TWVzc2FnZT4gYW5kIGhhbmRsZQotLy8gZXZlcnl0aGluZyBlbHNlIHdpdGggdGhlIGRlZmF1bHQgdGVtcGxhdGUgd2hpY2ggd2lsbCBtYXRjaCBhbnkgdHlwZSBoYXZpbmcKLS8vIGEgbWV0aG9kIHdpdGggc2lnbmF0dXJlICJzdGF0aWMgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpIi4KLS8vIFN1Y2ggYSB0eXBlIHByZXN1bWFibHkgaXMgYSBkZXNjZW5kYW50IG9mIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UuCi0KLXRlbXBsYXRlPD4KLWlubGluZSBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4mIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIHJldHVybiAqc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiA+KAotICAgICAgTXV0YWJsZVJhd1JlcGVhdGVkU3RyaW5nKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQsIHRydWUpKTsKLX0KLQotdGVtcGxhdGU8PgotaW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigKLSAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qID4oCi0gICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHRydWUpKTsKLX0KLQotCi0vLyAtLS0tLQotCi10ZW1wbGF0ZTw+Ci1pbmxpbmUgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiYgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRQdHJGaWVsZCgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogPigKLSAgICAgIEdldFJhd1JlcGVhdGVkRmllbGQobWVzc2FnZSwgZmllbGQsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgTlVMTCkpOwotfQotCi10ZW1wbGF0ZTw+Ci1pbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkUHRyRmllbGQoCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiogPigKLSAgICAgIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLAotICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFLCAtMSwKLSAgICAgICAgICBOVUxMKSk7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFBCPgotaW5saW5lIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8UEI+JiBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZFB0ckZpZWxkKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgcmV0dXJuICpzdGF0aWNfY2FzdDxjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFBCPiogPigKLSAgICAgIEdldFJhd1JlcGVhdGVkRmllbGQobWVzc2FnZSwgZmllbGQsIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAtMSwgUEI6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXREZXNjcmlwdG9yKCkpKTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgUEI+Ci1pbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxQQj4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZFB0ckZpZWxkKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFJlcGVhdGVkUHRyRmllbGQ8UEI+KiA+KAotICAgICAgTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQobWVzc2FnZSwgZmllbGQsCi0gICAgICAgICAgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UsIC0xLAotICAgICAgICAgIFBCOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0RGVzY3JpcHRvcigpKSk7Ci19Ci19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDlkN2I2NGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzNzIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcnM6IHdpbmtAZ29vZ2xlLmNvbSAoV2luayBTYXZpbGxlKSwKLS8vICAgICAgICAgIGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLU1lc3NhZ2VMaXRlOjp+TWVzc2FnZUxpdGUoKSB7fQotCi1zdHJpbmcgTWVzc2FnZUxpdGU6OkluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdCB7Ci0gIHJldHVybiAiKGNhbm5vdCBkZXRlcm1pbmUgbWlzc2luZyBmaWVsZHMgZm9yIGxpdGUgbWVzc2FnZSkiOwotfQotCi1uYW1lc3BhY2UgewotCi0vLyBXaGVuIHNlcmlhbGl6aW5nLCB3ZSBmaXJzdCBjb21wdXRlIHRoZSBieXRlIHNpemUsIHRoZW4gc2VyaWFsaXplIHRoZSBtZXNzYWdlLgotLy8gSWYgc2VyaWFsaXphdGlvbiBwcm9kdWNlcyBhIGRpZmZlcmVudCBudW1iZXIgb2YgYnl0ZXMgdGhhbiBleHBlY3RlZCwgd2UKLS8vIGNhbGwgdGhpcyBmdW5jdGlvbiwgd2hpY2ggY3Jhc2hlcy4gIFRoZSBwcm9ibGVtIGNvdWxkIGJlIGR1ZSB0byBhIGJ1ZyBpbiB0aGUKLS8vIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIGJ1dCBpcyBtb3JlIGxpa2VseSBjYXVzZWQgYnkgY29uY3VycmVudCBtb2RpZmljYXRpb24KLS8vIG9mIHRoZSBtZXNzYWdlLiAgVGhpcyBmdW5jdGlvbiBhdHRlbXB0cyB0byBkaXN0aW5ndWlzaCBiZXR3ZWVuIHRoZSB0d28gYW5kCi0vLyBwcm92aWRlIGEgdXNlZnVsIGVycm9yIG1lc3NhZ2UuCi12b2lkIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihpbnQgYnl0ZV9zaXplX2JlZm9yZV9zZXJpYWxpemF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVfc2l6ZV9hZnRlcl9zZXJpYWxpemF0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ5dGVzX3Byb2R1Y2VkX2J5X3NlcmlhbGl6YXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgbWVzc2FnZSkgewotICBHT09HTEVfQ0hFQ0tfRVEoYnl0ZV9zaXplX2JlZm9yZV9zZXJpYWxpemF0aW9uLCBieXRlX3NpemVfYWZ0ZXJfc2VyaWFsaXphdGlvbikKLSAgICAgIDw8IG1lc3NhZ2UuR2V0VHlwZU5hbWUoKQotICAgICAgPDwgIiB3YXMgbW9kaWZpZWQgY29uY3VycmVudGx5IGR1cmluZyBzZXJpYWxpemF0aW9uLiI7Ci0gIEdPT0dMRV9DSEVDS19FUShieXRlc19wcm9kdWNlZF9ieV9zZXJpYWxpemF0aW9uLCBieXRlX3NpemVfYmVmb3JlX3NlcmlhbGl6YXRpb24pCi0gICAgICA8PCAiQnl0ZSBzaXplIGNhbGN1bGF0aW9uIGFuZCBzZXJpYWxpemF0aW9uIHdlcmUgaW5jb25zaXN0ZW50LiAgVGhpcyAiCi0gICAgICAgICAibWF5IGluZGljYXRlIGEgYnVnIGluIHByb3RvY29sIGJ1ZmZlcnMgb3IgaXQgbWF5IGJlIGNhdXNlZCBieSAiCi0gICAgICAgICAiY29uY3VycmVudCBtb2RpZmljYXRpb24gb2YgIiA8PCBtZXNzYWdlLkdldFR5cGVOYW1lKCkgPDwgIi4iOwotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBzaG91bGRuJ3QgYmUgY2FsbGVkIGlmIGFsbCB0aGUgc2l6ZXMgYXJlIGVxdWFsLiI7Ci19Ci0KLXN0cmluZyBJbml0aWFsaXphdGlvbkVycm9yTWVzc2FnZShjb25zdCBjaGFyKiBhY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIG1lc3NhZ2UpIHsKLSAgLy8gTm90ZTogIFdlIHdhbnQgdG8gYXZvaWQgZGVwZW5kaW5nIG9uIHN0cnV0aWwgaW4gdGhlIGxpdGUgbGlicmFyeSwgb3RoZXJ3aXNlCi0gIC8vICAgd2UnZCB1c2U6Ci0gIC8vCi0gIC8vIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAvLyAgICJDYW4ndCAkMCBtZXNzYWdlIG9mIHR5cGUgXCIkMVwiIGJlY2F1c2UgaXQgaXMgbWlzc2luZyByZXF1aXJlZCAiCi0gIC8vICAgImZpZWxkczogJDIiLAotICAvLyAgIGFjdGlvbiwgbWVzc2FnZS5HZXRUeXBlTmFtZSgpLAotICAvLyAgIG1lc3NhZ2UuSW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKLQotICBzdHJpbmcgcmVzdWx0OwotICByZXN1bHQgKz0gIkNhbid0ICI7Ci0gIHJlc3VsdCArPSBhY3Rpb247Ci0gIHJlc3VsdCArPSAiIG1lc3NhZ2Ugb2YgdHlwZSBcIiI7Ci0gIHJlc3VsdCArPSBtZXNzYWdlLkdldFR5cGVOYW1lKCk7Ci0gIHJlc3VsdCArPSAiXCIgYmVjYXVzZSBpdCBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIjsKLSAgcmVzdWx0ICs9IG1lc3NhZ2UuSW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBTZXZlcmFsIG9mIHRoZSBQYXJzZSBtZXRob2RzIGJlbG93IGp1c3QgZG8gb25lIHRoaW5nIGFuZCB0aGVuIGNhbGwgYW5vdGhlcgotLy8gbWV0aG9kLiAgSW4gYSBuYWl2ZSBpbXBsZW1lbnRhdGlvbiwgd2UgbWlnaHQgaGF2ZSBQYXJzZUZyb21TdHJpbmcoKSBjYWxsCi0vLyBQYXJzZUZyb21BcnJheSgpIHdoaWNoIHdvdWxkIGNhbGwgUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oKSB3aGljaCB3b3VsZCBjYWxsCi0vLyBQYXJzZUZyb21Db2RlZFN0cmVhbSgpIHdoaWNoIHdvdWxkIGNhbGwgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSB3aGljaCB3b3VsZAotLy8gY2FsbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oKS4gIEhvd2V2ZXIsIHdoZW4gcGFyc2luZyB2ZXJ5IHNtYWxsCi0vLyBtZXNzYWdlcywgZXZlcnkgZnVuY3Rpb24gY2FsbCBpbnRyb2R1Y2VzIHNpZ25pZmljYW50IG92ZXJoZWFkLiAgVG8gYXZvaWQKLS8vIHRoaXMgd2l0aG91dCByZXByb2R1Y2luZyBjb2RlLCB3ZSB1c2UgdGhlc2UgZm9yY2VkLWlubGluZSBoZWxwZXJzLgotR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGJvb2wgSW5saW5lTWVyZ2VGcm9tQ29kZWRTdHJlYW0oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7Ci1HT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBJbmxpbmVQYXJzZUZyb21Db2RlZFN0cmVhbSgKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKTsKLUdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBib29sIElubGluZVBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKTsKLUdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBib29sIElubGluZVBhcnNlRnJvbUFycmF5KAotICAgIGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7Ci1HT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQXJyYXkoCi0gICAgY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKTsKLQotaW5saW5lIGJvb2wgSW5saW5lTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKLSAgaWYgKCFtZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKSByZXR1cm4gZmFsc2U7Ci0gIGlmICghbWVzc2FnZS0+SXNJbml0aWFsaXplZCgpKSB7Ci0gICAgR09PR0xFX0xPRyhFUlJPUikgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInBhcnNlIiwgKm1lc3NhZ2UpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLQotaW5saW5lIGJvb2wgSW5saW5lUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZS0+Q2xlYXIoKTsKLSAgcmV0dXJuIElubGluZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlucHV0LCBtZXNzYWdlKTsKLX0KLQotaW5saW5lIGJvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgewotICBtZXNzYWdlLT5DbGVhcigpOwotICByZXR1cm4gbWVzc2FnZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KTsKLX0KLQotaW5saW5lIGJvb2wgSW5saW5lUGFyc2VGcm9tQXJyYXkoCi0gICAgY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSwgc2l6ZSk7Ci0gIHJldHVybiBJbmxpbmVQYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQsIG1lc3NhZ2UpICYmCi0gICAgICAgICBpbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKLX0KLQotaW5saW5lIGJvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUFycmF5KAotICAgIGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgewotICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dChyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oZGF0YSksIHNpemUpOwotICByZXR1cm4gSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCwgbWVzc2FnZSkgJiYKLSAgICAgICAgIGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotCi1NZXNzYWdlTGl0ZSogTWVzc2FnZUxpdGU6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgewotICBNZXNzYWdlTGl0ZSogbWVzc2FnZSA9IE5ldygpOwotICBpZiAoYXJlbmEgIT0gTlVMTCkgewotICAgIGFyZW5hLT5Pd24obWVzc2FnZSk7Ci0gIH0KLSAgcmV0dXJuIG1lc3NhZ2U7Ci19Ci0KLWJvb2wgTWVzc2FnZUxpdGU6Ok1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotICByZXR1cm4gSW5saW5lTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW5wdXQsIHRoaXMpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgcmV0dXJuIElubGluZVBhcnNlRnJvbUNvZGVkU3RyZWFtKGlucHV0LCB0aGlzKTsKLX0KLQotYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotICByZXR1cm4gSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0LCB0aGlzKTsKLX0KLQotYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGRlY29kZXIoaW5wdXQpOwotICByZXR1cm4gUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmRlY29kZXIpICYmIGRlY29kZXIuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7Ci19Ci0KLWJvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21aZXJvQ29weVN0cmVhbSgKLSAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgaW86OkNvZGVkSW5wdXRTdHJlYW0gZGVjb2RlcihpbnB1dCk7Ci0gIHJldHVybiBQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmRlY29kZXIpICYmCi0gICAgICAgICBkZWNvZGVyLkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oCi0gICAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgc2l6ZSkgewotICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBkZWNvZGVyKGlucHV0KTsKLSAgZGVjb2Rlci5QdXNoTGltaXQoc2l6ZSk7Ci0gIHJldHVybiBQYXJzZUZyb21Db2RlZFN0cmVhbSgmZGVjb2RlcikgJiYKLSAgICAgICAgIGRlY29kZXIuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgJiYKLSAgICAgICAgIGRlY29kZXIuQnl0ZXNVbnRpbExpbWl0KCkgPT0gMDsKLX0KLQotYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgKLSAgICBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGludCBzaXplKSB7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGRlY29kZXIoaW5wdXQpOwotICBkZWNvZGVyLlB1c2hMaW1pdChzaXplKTsKLSAgcmV0dXJuIFBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgmZGVjb2RlcikgJiYKLSAgICAgICAgIGRlY29kZXIuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgJiYKLSAgICAgICAgIGRlY29kZXIuQnl0ZXNVbnRpbExpbWl0KCkgPT0gMDsKLX0KLQotYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSkgewotICByZXR1cm4gSW5saW5lUGFyc2VGcm9tQXJyYXkoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLCB0aGlzKTsKLX0KLQotYm9vbCBNZXNzYWdlTGl0ZTo6UGFyc2VQYXJ0aWFsRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGRhdGEpIHsKLSAgcmV0dXJuIElubGluZVBhcnNlUGFydGlhbEZyb21BcnJheShkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCksIHRoaXMpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgewotICByZXR1cm4gSW5saW5lUGFyc2VGcm9tQXJyYXkoZGF0YSwgc2l6ZSwgdGhpcyk7Ci19Ci0KLWJvb2wgTWVzc2FnZUxpdGU6OlBhcnNlUGFydGlhbEZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgewotICByZXR1cm4gSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGRhdGEsIHNpemUsIHRoaXMpOwotfQotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdWludDgqIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKLSAgLy8gV2Ugb25seSBvcHRpbWl6ZSB0aGlzIHdoZW4gdXNpbmcgb3B0aW1pemVfZm9yID0gU1BFRUQuICBJbiBvdGhlciBjYXNlcwotICAvLyB3ZSBqdXN0IHVzZSB0aGUgQ29kZWRPdXRwdXRTdHJlYW0gcGF0aC4KLSAgaW50IHNpemUgPSBHZXRDYWNoZWRTaXplKCk7Ci0gIGlvOjpBcnJheU91dHB1dFN0cmVhbSBvdXQodGFyZ2V0LCBzaXplKTsKLSAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dCgmb3V0KTsKLSAgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZjb2RlZF9vdXQpOwotICBHT09HTEVfQ0hFQ0soIWNvZGVkX291dC5IYWRFcnJvcigpKTsKLSAgcmV0dXJuIHRhcmdldCArIHNpemU7Ci19Ci0KLWJvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgR09PR0xFX0RDSEVDSyhJc0luaXRpYWxpemVkKCkpIDw8IEluaXRpYWxpemF0aW9uRXJyb3JNZXNzYWdlKCJzZXJpYWxpemUiLCAqdGhpcyk7Ci0gIHJldHVybiBTZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbShvdXRwdXQpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbSgKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICBjb25zdCBpbnQgc2l6ZSA9IEJ5dGVTaXplKCk7ICAvLyBGb3JjZSBzaXplIHRvIGJlIGNhY2hlZC4KLSAgaWYgKHNpemUgPCAwKSB7Ci0gICAgLy8gTWVzc2FnZXMgPjJHIGNhbm5vdCBiZSBzZXJpYWxpemVkIGR1ZSB0byBvdmVyZmxvdyBjb21wdXRpbmcgQnl0ZVNpemUuCi0gICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkVycm9yIGNvbXB1dGluZyBCeXRlU2l6ZSAocG9zc2libGUgb3ZlcmZsb3c/KS4iOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHVpbnQ4KiBidWZmZXIgPSBvdXRwdXQtPkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2Uoc2l6ZSk7Ci0gIGlmIChidWZmZXIgIT0gTlVMTCkgewotICAgIHVpbnQ4KiBlbmQgPSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGJ1ZmZlcik7Ci0gICAgaWYgKGVuZCAtIGJ1ZmZlciAhPSBzaXplKSB7Ci0gICAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3Ioc2l6ZSwgQnl0ZVNpemUoKSwgZW5kIC0gYnVmZmVyLCAqdGhpcyk7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIGludCBvcmlnaW5hbF9ieXRlX2NvdW50ID0gb3V0cHV0LT5CeXRlQ291bnQoKTsKLSAgICBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMob3V0cHV0KTsKLSAgICBpZiAob3V0cHV0LT5IYWRFcnJvcigpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGludCBmaW5hbF9ieXRlX2NvdW50ID0gb3V0cHV0LT5CeXRlQ291bnQoKTsKLQotICAgIGlmIChmaW5hbF9ieXRlX2NvdW50IC0gb3JpZ2luYWxfYnl0ZV9jb3VudCAhPSBzaXplKSB7Ci0gICAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3Ioc2l6ZSwgQnl0ZVNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbF9ieXRlX2NvdW50IC0gb3JpZ2luYWxfYnl0ZV9jb3VudCwgKnRoaXMpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci19Ci0KLWJvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oCi0gICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGVuY29kZXIob3V0cHV0KTsKLSAgcmV0dXJuIFNlcmlhbGl6ZVRvQ29kZWRTdHJlYW0oJmVuY29kZXIpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsVG9aZXJvQ29weVN0cmVhbSgKLSAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gZW5jb2RlcihvdXRwdXQpOwotICByZXR1cm4gU2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0oJmVuY29kZXIpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpBcHBlbmRUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3QgewotICBHT09HTEVfRENIRUNLKElzSW5pdGlhbGl6ZWQoKSkgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInNlcmlhbGl6ZSIsICp0aGlzKTsKLSAgcmV0dXJuIEFwcGVuZFBhcnRpYWxUb1N0cmluZyhvdXRwdXQpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpBcHBlbmRQYXJ0aWFsVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKLSAgaW50IG9sZF9zaXplID0gb3V0cHV0LT5zaXplKCk7Ci0gIGludCBieXRlX3NpemUgPSBCeXRlU2l6ZSgpOwotICBpZiAoYnl0ZV9zaXplIDwgMCkgewotICAgIC8vIE1lc3NhZ2VzID4yRyBjYW5ub3QgYmUgc2VyaWFsaXplZCBkdWUgdG8gb3ZlcmZsb3cgY29tcHV0aW5nIEJ5dGVTaXplLgotICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFcnJvciBjb21wdXRpbmcgQnl0ZVNpemUgKHBvc3NpYmxlIG92ZXJmbG93PykuIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKG91dHB1dCwgb2xkX3NpemUgKyBieXRlX3NpemUpOwotICB1aW50OCogc3RhcnQgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGlvOjptdXRhYmxlX3N0cmluZ19kYXRhKG91dHB1dCkgKyBvbGRfc2l6ZSk7Ci0gIHVpbnQ4KiBlbmQgPSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKLSAgaWYgKGVuZCAtIHN0YXJ0ICE9IGJ5dGVfc2l6ZSkgewotICAgIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihieXRlX3NpemUsIEJ5dGVTaXplKCksIGVuZCAtIHN0YXJ0LCAqdGhpcyk7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdCB7Ci0gIG91dHB1dC0+Y2xlYXIoKTsKLSAgcmV0dXJuIEFwcGVuZFRvU3RyaW5nKG91dHB1dCk7Ci19Ci0KLWJvb2wgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3QgewotICBvdXRwdXQtPmNsZWFyKCk7Ci0gIHJldHVybiBBcHBlbmRQYXJ0aWFsVG9TdHJpbmcob3V0cHV0KTsKLX0KLQotYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplVG9BcnJheSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgY29uc3QgewotICBHT09HTEVfRENIRUNLKElzSW5pdGlhbGl6ZWQoKSkgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInNlcmlhbGl6ZSIsICp0aGlzKTsKLSAgcmV0dXJuIFNlcmlhbGl6ZVBhcnRpYWxUb0FycmF5KGRhdGEsIHNpemUpOwotfQotCi1ib29sIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVQYXJ0aWFsVG9BcnJheSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgY29uc3QgewotICBpbnQgYnl0ZV9zaXplID0gQnl0ZVNpemUoKTsKLSAgaWYgKHNpemUgPCBieXRlX3NpemUpIHJldHVybiBmYWxzZTsKLSAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGRhdGEpOwotICB1aW50OCogZW5kID0gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7Ci0gIGlmIChlbmQgLSBzdGFydCAhPSBieXRlX3NpemUpIHsKLSAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3IoYnl0ZV9zaXplLCBCeXRlU2l6ZSgpLCBlbmQgLSBzdGFydCwgKnRoaXMpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdHJpbmcgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3QgewotICAvLyBJZiB0aGUgY29tcGlsZXIgaW1wbGVtZW50cyB0aGUgKE5hbWVkKSBSZXR1cm4gVmFsdWUgT3B0aW1pemF0aW9uLAotICAvLyB0aGUgbG9jYWwgdmFyaWFibGUgJ291dHB1dCcgd2lsbCBub3QgYWN0dWFsbHkgcmVzaWRlIG9uIHRoZSBzdGFjawotICAvLyBvZiB0aGlzIGZ1bmN0aW9uLCBidXQgd2lsbCBiZSBvdmVybGFpZCB3aXRoIHRoZSBvYmplY3QgdGhhdCB0aGUKLSAgLy8gY2FsbGVyIHN1cHBsaWVkIGZvciB0aGUgcmV0dXJuIHZhbHVlIHRvIGJlIGNvbnN0cnVjdGVkIGluLgotICBzdHJpbmcgb3V0cHV0OwotICBpZiAoIUFwcGVuZFRvU3RyaW5nKCZvdXRwdXQpKQotICAgIG91dHB1dC5jbGVhcigpOwotICByZXR1cm4gb3V0cHV0OwotfQotCi1zdHJpbmcgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVBhcnRpYWxBc1N0cmluZygpIGNvbnN0IHsKLSAgc3RyaW5nIG91dHB1dDsKLSAgaWYgKCFBcHBlbmRQYXJ0aWFsVG9TdHJpbmcoJm91dHB1dCkpCi0gICAgb3V0cHV0LmNsZWFyKCk7Ci0gIHJldHVybiBvdXRwdXQ7Ci19Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci10ZW1wbGF0ZTw+Ci1NZXNzYWdlTGl0ZSogR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6TmV3RnJvbVByb3RvdHlwZSgKLSAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlLCBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIHsKLSAgcmV0dXJuIHByb3RvdHlwZS0+TmV3KGFyZW5hKTsKLX0KLXRlbXBsYXRlIDw+Ci12b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46Ok1lcmdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogdG8pIHsKLSAgdG8tPkNoZWNrVHlwZUFuZE1lcmdlRnJvbShmcm9tKTsKLX0KLXRlbXBsYXRlPD4KLXZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPHN0cmluZz46Ok1lcmdlKGNvbnN0IHN0cmluZyYgZnJvbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHRvKSB7Ci0gICp0byA9IGZyb207Ci19Ci19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGMxNmY0Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3JzOiB3aW5rQGdvb2dsZS5jb20gKFdpbmsgU2F2aWxsZSksCi0vLyAgICAgICAgICBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gRGVmaW5lcyBNZXNzYWdlTGl0ZSwgdGhlIGFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBhbGwgKGxpdGUKLS8vIGFuZCBub24tbGl0ZSkgcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0xJVEVfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0xJVEVfSF9fCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotICBjbGFzcyBBcmVuYTsKLW5hbWVzcGFjZSBpbyB7Ci0gIGNsYXNzIENvZGVkSW5wdXRTdHJlYW07Ci0gIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOwotICBjbGFzcyBaZXJvQ29weUlucHV0U3RyZWFtOwotICBjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsKLX0KLQotLy8gSW50ZXJmYWNlIHRvIGxpZ2h0IHdlaWdodCBwcm90b2NvbCBtZXNzYWdlcy4KLS8vCi0vLyBUaGlzIGludGVyZmFjZSBpcyBpbXBsZW1lbnRlZCBieSBhbGwgcHJvdG9jb2wgbWVzc2FnZSBvYmplY3RzLiAgTm9uLWxpdGUKLS8vIG1lc3NhZ2VzIGFkZGl0aW9uYWxseSBpbXBsZW1lbnQgdGhlIE1lc3NhZ2UgaW50ZXJmYWNlLCB3aGljaCBpcyBhCi0vLyBzdWJjbGFzcyBvZiBNZXNzYWdlTGl0ZS4gIFVzZSBNZXNzYWdlTGl0ZSBpbnN0ZWFkIHdoZW4geW91IG9ubHkgbmVlZAotLy8gdGhlIHN1YnNldCBvZiBmZWF0dXJlcyB3aGljaCBpdCBzdXBwb3J0cyAtLSBuYW1lbHksIG5vdGhpbmcgdGhhdCB1c2VzCi0vLyBkZXNjcmlwdG9ycyBvciByZWZsZWN0aW9uLiAgWW91IGNhbiBpbnN0cnVjdCB0aGUgcHJvdG9jb2wgY29tcGlsZXIKLS8vIHRvIGdlbmVyYXRlIGNsYXNzZXMgd2hpY2ggaW1wbGVtZW50IG9ubHkgTWVzc2FnZUxpdGUsIG5vdCB0aGUgZnVsbAotLy8gTWVzc2FnZSBpbnRlcmZhY2UsIGJ5IGFkZGluZyB0aGUgZm9sbG93aW5nIGxpbmUgdG8gdGhlIC5wcm90byBmaWxlOgotLy8KLS8vICAgb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLS8vCi0vLyBUaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgb24gcmVzb3VyY2UtY29uc3RyYWluZWQgc3lzdGVtcyB3aGVyZQotLy8gdGhlIGZ1bGwgcHJvdG9jb2wgYnVmZmVycyBydW50aW1lIGxpYnJhcnkgaXMgdG9vIGJpZy4KLS8vCi0vLyBOb3RlIHRoYXQgb24gbm9uLWNvbnN0cmFpbmVkIHN5c3RlbXMgKGUuZy4gc2VydmVycykgd2hlbiB5b3UgbmVlZAotLy8gdG8gbGluayBpbiBsb3RzIG9mIHByb3RvY29sIGRlZmluaXRpb25zLCBhIGJldHRlciB3YXkgdG8gcmVkdWNlCi0vLyB0b3RhbCBjb2RlIGZvb3RwcmludCBpcyB0byB1c2Ugb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLiAgVGhpcwotLy8gd2lsbCBtYWtlIHRoZSBnZW5lcmF0ZWQgY29kZSBzbWFsbGVyIHdoaWxlIHN0aWxsIHN1cHBvcnRpbmcgYWxsIHRoZQotLy8gc2FtZSBmZWF0dXJlcyAoYXQgdGhlIGV4cGVuc2Ugb2Ygc3BlZWQpLiAgb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FCi0vLyBpcyBiZXN0IHdoZW4geW91IG9ubHkgaGF2ZSBhIHNtYWxsIG51bWJlciBvZiBtZXNzYWdlIHR5cGVzIGxpbmtlZAotLy8gaW50byB5b3VyIGJpbmFyeSwgaW4gd2hpY2ggY2FzZSB0aGUgc2l6ZSBvZiB0aGUgcHJvdG9jb2wgYnVmZmVycwotLy8gcnVudGltZSBpdHNlbGYgaXMgdGhlIGJpZ2dlc3QgcHJvYmxlbS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBNZXNzYWdlTGl0ZSB7Ci0gcHVibGljOgotICBpbmxpbmUgTWVzc2FnZUxpdGUoKSB7fQotICB2aXJ0dWFsIH5NZXNzYWdlTGl0ZSgpOwotCi0gIC8vIEJhc2ljIE9wZXJhdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLy8gR2V0IHRoZSBuYW1lIG9mIHRoaXMgbWVzc2FnZSB0eXBlLCBlLmcuICJmb28uYmFyLkJhelByb3RvIi4KLSAgdmlydHVhbCBzdHJpbmcgR2V0VHlwZU5hbWUoKSBjb25zdCA9IDA7Ci0KLSAgLy8gQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9mIHRoZSBzYW1lIHR5cGUuICBPd25lcnNoaXAgaXMgcGFzc2VkIHRvIHRoZQotICAvLyBjYWxsZXIuCi0gIHZpcnR1YWwgTWVzc2FnZUxpdGUqIE5ldygpIGNvbnN0ID0gMDsKLQotICAvLyBDb25zdHJ1Y3QgYSBuZXcgaW5zdGFuY2Ugb24gdGhlIGFyZW5hLiBPd25lcnNoaXAgaXMgcGFzc2VkIHRvIHRoZSBjYWxsZXIKLSAgLy8gaWYgYXJlbmEgaXMgYSBOVUxMLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uIGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eS4KLSAgdmlydHVhbCBNZXNzYWdlTGl0ZSogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKLQotICAvLyBHZXQgdGhlIGFyZW5hLCBpZiBhbnksIGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lc3NhZ2UuIFZpcnR1YWwgbWV0aG9kCi0gIC8vIHJlcXVpcmVkIGZvciBnZW5lcmljIG9wZXJhdGlvbnMgYnV0IG1vc3QgYXJlbmEtcmVsYXRlZCBvcGVyYXRpb25zIHNob3VsZAotICAvLyB1c2UgdGhlIEdldEFyZW5hTm9WaXJ0dWFsKCkgZ2VuZXJhdGVkLWNvZGUgbWV0aG9kLiBEZWZhdWx0IGltcGxlbWVudGF0aW9uCi0gIC8vIHRvIHJlZHVjZSBjb2RlIHNpemUgYnkgYXZvaWRpbmcgdGhlIG5lZWQgZm9yIHBlci10eXBlIGltcGxlbWVudGF0aW9ucyB3aGVuCi0gIC8vIHR5cGVzIGRvIG5vdCBpbXBsZW1lbnQgYXJlbmEgc3VwcG9ydC4KLSAgdmlydHVhbCA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYSgpIGNvbnN0IHsgcmV0dXJuIE5VTEw7IH0KLQotICAvLyBHZXQgYSBwb2ludGVyIHRoYXQgbWF5IGJlIGVxdWFsIHRvIHRoaXMgbWVzc2FnZSdzIGFyZW5hLCBvciBtYXkgbm90IGJlLiBJZgotICAvLyB0aGUgdmFsdWUgcmV0dXJuZWQgYnkgdGhpcyBtZXRob2QgaXMgZXF1YWwgdG8gc29tZSBhcmVuYSBwb2ludGVyLCB0aGVuIHRoaXMKLSAgLy8gbWVzc2FnZSBpcyBvbiB0aGF0IGFyZW5hOyBob3dldmVyLCBpZiB0aGlzIG1lc3NhZ2UgaXMgb24gc29tZSBhcmVuYSwgdGhpcwotICAvLyBtZXRob2QgbWF5IG9yIG1heSBub3QgcmV0dXJuIHRoYXQgYXJlbmEncyBwb2ludGVyLiBBcyBhIHRyYWRlb2ZmLCB0aGlzCi0gIC8vIG1ldGhvZCBtYXkgYmUgbW9yZSBlZmZpY2llbnQgdGhhbiBHZXRBcmVuYSgpLiBUaGUgaW50ZW50IGlzIHRvIGFsbG93Ci0gIC8vIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb25zIHRoYXQgdXNlIGUuZy4gdGFnZ2VkIHBvaW50ZXJzIHRvIHNvbWV0aW1lcyBzdG9yZQotICAvLyB0aGUgYXJlbmEgcG9pbnRlciBkaXJlY3RseSwgYW5kIHNvbWV0aW1lcyBpbiBhIG1vcmUgaW5kaXJlY3Qgd2F5LCBhbmQgYWxsb3cKLSAgLy8gYSBmYXN0cGF0aCBjb21wYXJpc29uIGFnYWluc3QgdGhlIGFyZW5hIHBvaW50ZXIgd2hlbiBpdCdzIGVhc3kgdG8gb2J0YWluLgotICB2aXJ0dWFsIHZvaWQqIEdldE1heWJlQXJlbmFQb2ludGVyKCkgY29uc3QgeyByZXR1cm4gR2V0QXJlbmEoKTsgfQotCi0gIC8vIENsZWFyIGFsbCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgYW5kIHNldCB0aGVtIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotICAvLyBDbGVhcigpIGF2b2lkcyBmcmVlaW5nIG1lbW9yeSwgYXNzdW1pbmcgdGhhdCBhbnkgbWVtb3J5IGFsbG9jYXRlZAotICAvLyB0byBob2xkIHBhcnRzIG9mIHRoZSBtZXNzYWdlIHdpbGwgYmUgbmVlZGVkIGFnYWluIHRvIGhvbGQgdGhlIG5leHQKLSAgLy8gbWVzc2FnZS4gIElmIHlvdSBhY3R1YWxseSB3YW50IHRvIGZyZWUgdGhlIG1lbW9yeSB1c2VkIGJ5IGEgTWVzc2FnZSwKLSAgLy8geW91IG11c3QgZGVsZXRlIGl0LgotICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKSA9IDA7Ci0KLSAgLy8gUXVpY2tseSBjaGVjayBpZiBhbGwgcmVxdWlyZWQgZmllbGRzIGhhdmUgdmFsdWVzIHNldC4KLSAgdmlydHVhbCBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCA9IDA7Ci0KLSAgLy8gVGhpcyBpcyBub3QgaW1wbGVtZW50ZWQgZm9yIExpdGUgbWVzc2FnZXMgLS0gaXQganVzdCByZXR1cm5zICIoY2Fubm90Ci0gIC8vIGRldGVybWluZSBtaXNzaW5nIGZpZWxkcyBmb3IgbGl0ZSBtZXNzYWdlKSIuICBIb3dldmVyLCBpdCBpcyBpbXBsZW1lbnRlZAotICAvLyBmb3IgZnVsbCBtZXNzYWdlcy4gIFNlZSBtZXNzYWdlLmguCi0gIHZpcnR1YWwgc3RyaW5nIEluaXRpYWxpemF0aW9uRXJyb3JTdHJpbmcoKSBjb25zdDsKLQotICAvLyBJZiB8b3RoZXJ8IGlzIHRoZSBleGFjdCBzYW1lIGNsYXNzIGFzIHRoaXMsIGNhbGxzIE1lcmdlRnJvbSgpLiAgT3RoZXJ3aXNlLAotICAvLyByZXN1bHRzIGFyZSB1bmRlZmluZWQgKHByb2JhYmx5IGNyYXNoKS4KLSAgdmlydHVhbCB2b2lkIENoZWNrVHlwZUFuZE1lcmdlRnJvbShjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXIpID0gMDsKLQotICAvLyBQYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBNZXRob2RzIGZvciBwYXJzaW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlIGFyZQotICAvLyBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4gIENsZWFyKCkgd2lsbCBiZSBjYWxsZWQKLSAgLy8gYmVmb3JlIG1lcmdpbmcgdGhlIGlucHV0LgotCi0gIC8vIEZpbGwgdGhlIG1lc3NhZ2Ugd2l0aCBhIHByb3RvY29sIGJ1ZmZlciBwYXJzZWQgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLgotICAvLyBSZXR1cm5zIGZhbHNlIG9uIGEgcmVhZCBlcnJvciBvciBpZiB0aGUgaW5wdXQgaXMgaW4gdGhlIHdyb25nIGZvcm1hdC4gIEEKLSAgLy8gc3VjY2Vzc2Z1bCByZXR1cm4gZG9lcyBub3QgaW5kaWNhdGUgdGhlIGVudGlyZSBpbnB1dCBpcyBjb25zdW1lZCwgZW5zdXJlCi0gIC8vIHlvdSBjYWxsIENvbnN1bWVkRW50aXJlTWVzc2FnZSgpIHRvIGNoZWNrIHRoYXQgaWYgYXBwbGljYWJsZS4KLSAgYm9vbCBQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICAvLyBMaWtlIFBhcnNlRnJvbUNvZGVkU3RyZWFtKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG1pc3NpbmcKLSAgLy8gcmVxdWlyZWQgZmllbGRzLgotICBib29sIFBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotICAvLyBSZWFkIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gdGhlIGdpdmVuIHplcm8tY29weSBpbnB1dCBzdHJlYW0uICBJZgotICAvLyBzdWNjZXNzZnVsLCB0aGUgZW50aXJlIGlucHV0IHdpbGwgYmUgY29uc3VtZWQuCi0gIGJvb2wgUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgLy8gTGlrZSBQYXJzZUZyb21aZXJvQ29weVN0cmVhbSgpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZSBtaXNzaW5nCi0gIC8vIHJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBQYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgLy8gUmVhZCBhIHByb3RvY29sIGJ1ZmZlciBmcm9tIHRoZSBnaXZlbiB6ZXJvLWNvcHkgaW5wdXQgc3RyZWFtLCBleHBlY3RpbmcKLSAgLy8gdGhlIG1lc3NhZ2UgdG8gYmUgZXhhY3RseSAic2l6ZSIgYnl0ZXMgbG9uZy4gIElmIHN1Y2Nlc3NmdWwsIGV4YWN0bHkKLSAgLy8gdGhpcyBtYW55IGJ5dGVzIHdpbGwgaGF2ZSBiZWVuIGNvbnN1bWVkIGZyb20gdGhlIGlucHV0LgotICBib29sIFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGludCBzaXplKTsKLSAgLy8gTGlrZSBQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0oKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUKLSAgLy8gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCi0gIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7Ci0gIC8vIFBhcnNlcyBhIHByb3RvY29sIGJ1ZmZlciBjb250YWluZWQgaW4gYSBzdHJpbmcuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgotICAvLyBUaGlzIGZ1bmN0aW9uIHRha2VzIGEgc3RyaW5nIGluIHRoZSAobm9uLWh1bWFuLXJlYWRhYmxlKSBiaW5hcnkgd2lyZQotICAvLyBmb3JtYXQsIG1hdGNoaW5nIHRoZSBlbmNvZGluZyBvdXRwdXQgYnkgTWVzc2FnZUxpdGU6OlNlcmlhbGl6ZVRvU3RyaW5nKCkuCi0gIC8vIElmIHlvdSdkIGxpa2UgdG8gY29udmVydCBhIGh1bWFuLXJlYWRhYmxlIHN0cmluZyBpbnRvIGEgcHJvdG9jb2wgYnVmZmVyCi0gIC8vIG9iamVjdCwgc2VlIGdvb2dsZTo6cHJvdG9idWY6OlRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygpLgotICBib29sIFBhcnNlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGRhdGEpOwotICAvLyBMaWtlIFBhcnNlRnJvbVN0cmluZygpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZSBtaXNzaW5nCi0gIC8vIHJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBQYXJzZVBhcnRpYWxGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSk7Ci0gIC8vIFBhcnNlIGEgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5lZCBpbiBhbiBhcnJheSBvZiBieXRlcy4KLSAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7Ci0gIC8vIExpa2UgUGFyc2VGcm9tQXJyYXkoKSwgYnV0IGFjY2VwdHMgbWVzc2FnZXMgdGhhdCBhcmUgbWlzc2luZwotICAvLyByZXF1aXJlZCBmaWVsZHMuCi0gIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKLQotCi0gIC8vIFJlYWRzIGEgcHJvdG9jb2wgYnVmZmVyIGZyb20gdGhlIHN0cmVhbSBhbmQgbWVyZ2VzIGl0IGludG8gdGhpcwotICAvLyBNZXNzYWdlLiAgU2luZ3VsYXIgZmllbGRzIHJlYWQgZnJvbSB0aGUgaW5wdXQgb3ZlcndyaXRlIHdoYXQgaXMKLSAgLy8gYWxyZWFkeSBpbiB0aGUgTWVzc2FnZSBhbmQgcmVwZWF0ZWQgZmllbGRzIGFyZSBhcHBlbmRlZCB0byB0aG9zZQotICAvLyBhbHJlYWR5IHByZXNlbnQuCi0gIC8vCi0gIC8vIEl0IGlzIHRoZSByZXNwb25zaWJpbGl0eSBvZiB0aGUgY2FsbGVyIHRvIGNhbGwgaW5wdXQtPkxhc3RUYWdXYXMoKQotICAvLyAoZm9yIGdyb3Vwcykgb3IgaW5wdXQtPkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpIChmb3Igbm9uLWdyb3VwcykgYWZ0ZXIKLSAgLy8gdGhpcyByZXR1cm5zIHRvIHZlcmlmeSB0aGF0IHRoZSBtZXNzYWdlJ3MgZW5kIHdhcyBkZWxpbWl0ZWQgY29ycmVjdGx5LgotICAvLwotICAvLyBQYXJzZWZyb21Db2RlZFN0cmVhbSgpIGlzIGltcGxlbWVudGVkIGFzIENsZWFyKCkgZm9sbG93ZWQgYnkKLSAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4KLSAgYm9vbCBNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotCi0gIC8vIExpa2UgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSwgYnV0IHN1Y2NlZWRzIGV2ZW4gaWYgcmVxdWlyZWQgZmllbGRzIGFyZQotICAvLyBtaXNzaW5nIGluIHRoZSBpbnB1dC4KLSAgLy8KLSAgLy8gTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSBpcyBqdXN0IGltcGxlbWVudGVkIGFzIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpCi0gIC8vIGZvbGxvd2VkIGJ5IElzSW5pdGlhbGl6ZWQoKS4KLSAgdmlydHVhbCBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpID0gMDsKLQotCi0gIC8vIFNlcmlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIE1ldGhvZHMgZm9yIHNlcmlhbGl6aW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlCi0gIC8vIGFyZSBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgQnl0ZVNpemUoKSBhbmQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuCi0KLSAgLy8gV3JpdGUgYSBwcm90b2NvbCBidWZmZXIgb2YgdGhpcyBtZXNzYWdlIHRvIHRoZSBnaXZlbiBvdXRwdXQuICBSZXR1cm5zCi0gIC8vIGZhbHNlIG9uIGEgd3JpdGUgZXJyb3IuICBJZiB0aGUgbWVzc2FnZSBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcywKLSAgLy8gdGhpcyBtYXkgR09PR0xFX0NIRUNLLWZhaWwuCi0gIGJvb2wgU2VyaWFsaXplVG9Db2RlZFN0cmVhbShpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIC8vIExpa2UgU2VyaWFsaXplVG9Db2RlZFN0cmVhbSgpLCBidXQgYWxsb3dzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgotICBib29sIFNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgLy8gV3JpdGUgdGhlIG1lc3NhZ2UgdG8gdGhlIGdpdmVuIHplcm8tY29weSBvdXRwdXQgc3RyZWFtLiAgQWxsIHJlcXVpcmVkCi0gIC8vIGZpZWxkcyBtdXN0IGJlIHNldC4KLSAgYm9vbCBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKLSAgLy8gTGlrZSBTZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCksIGJ1dCBhbGxvd3MgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCi0gIGJvb2wgU2VyaWFsaXplUGFydGlhbFRvWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICAvLyBTZXJpYWxpemUgdGhlIG1lc3NhZ2UgYW5kIHN0b3JlIGl0IGluIHRoZSBnaXZlbiBzdHJpbmcuICBBbGwgcmVxdWlyZWQKLSAgLy8gZmllbGRzIG11c3QgYmUgc2V0LgotICBib29sIFNlcmlhbGl6ZVRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdDsKLSAgLy8gTGlrZSBTZXJpYWxpemVUb1N0cmluZygpLCBidXQgYWxsb3dzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgotICBib29sIFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3Q7Ci0gIC8vIFNlcmlhbGl6ZSB0aGUgbWVzc2FnZSBhbmQgc3RvcmUgaXQgaW4gdGhlIGdpdmVuIGJ5dGUgYXJyYXkuICBBbGwgcmVxdWlyZWQKLSAgLy8gZmllbGRzIG11c3QgYmUgc2V0LgotICBib29sIFNlcmlhbGl6ZVRvQXJyYXkodm9pZCogZGF0YSwgaW50IHNpemUpIGNvbnN0OwotICAvLyBMaWtlIFNlcmlhbGl6ZVRvQXJyYXkoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBTZXJpYWxpemVQYXJ0aWFsVG9BcnJheSh2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgY29uc3Q7Ci0KLSAgLy8gTWFrZSBhIHN0cmluZyBlbmNvZGluZyB0aGUgbWVzc2FnZS4gSXMgZXF1aXZhbGVudCB0byBjYWxsaW5nCi0gIC8vIFNlcmlhbGl6ZVRvU3RyaW5nKCkgb24gYSBzdHJpbmcgYW5kIHVzaW5nIHRoYXQuICBSZXR1cm5zIHRoZSBlbXB0eQotICAvLyBzdHJpbmcgaWYgU2VyaWFsaXplVG9TdHJpbmcoKSB3b3VsZCBoYXZlIHJldHVybmVkIGFuIGVycm9yLgotICAvLyBOb3RlOiBJZiB5b3UgaW50ZW5kIHRvIGdlbmVyYXRlIG1hbnkgc3VjaCBzdHJpbmdzLCB5b3UgbWF5Ci0gIC8vIHJlZHVjZSBoZWFwIGZyYWdtZW50YXRpb24gYnkgaW5zdGVhZCByZS11c2luZyB0aGUgc2FtZSBzdHJpbmcKLSAgLy8gb2JqZWN0IHdpdGggY2FsbHMgdG8gU2VyaWFsaXplVG9TdHJpbmcoKS4KLSAgc3RyaW5nIFNlcmlhbGl6ZUFzU3RyaW5nKCkgY29uc3Q7Ci0gIC8vIExpa2UgU2VyaWFsaXplQXNTdHJpbmcoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KLSAgc3RyaW5nIFNlcmlhbGl6ZVBhcnRpYWxBc1N0cmluZygpIGNvbnN0OwotCi0gIC8vIExpa2UgU2VyaWFsaXplVG9TdHJpbmcoKSwgYnV0IGFwcGVuZHMgdG8gdGhlIGRhdGEgdG8gdGhlIHN0cmluZydzIGV4aXN0aW5nCi0gIC8vIGNvbnRlbnRzLiAgQWxsIHJlcXVpcmVkIGZpZWxkcyBtdXN0IGJlIHNldC4KLSAgYm9vbCBBcHBlbmRUb1N0cmluZyhzdHJpbmcqIG91dHB1dCkgY29uc3Q7Ci0gIC8vIExpa2UgQXBwZW5kVG9TdHJpbmcoKSwgYnV0IGFsbG93cyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KLSAgYm9vbCBBcHBlbmRQYXJ0aWFsVG9TdHJpbmcoc3RyaW5nKiBvdXRwdXQpIGNvbnN0OwotCi0gIC8vIENvbXB1dGVzIHRoZSBzZXJpYWxpemVkIHNpemUgb2YgdGhlIG1lc3NhZ2UuICBUaGlzIHJlY3Vyc2l2ZWx5IGNhbGxzCi0gIC8vIEJ5dGVTaXplKCkgb24gYWxsIGVtYmVkZGVkIG1lc3NhZ2VzLiAgSWYgYSBzdWJjbGFzcyBkb2VzIG5vdCBvdmVycmlkZQotICAvLyB0aGlzLCBpdCBNVVNUIG92ZXJyaWRlIFNldENhY2hlZFNpemUoKS4KLSAgLy8KLSAgLy8gQnl0ZVNpemUoKSBpcyBnZW5lcmFsbHkgbGluZWFyIGluIHRoZSBudW1iZXIgb2YgZmllbGRzIGRlZmluZWQgZm9yIHRoZQotICAvLyBwcm90by4KLSAgdmlydHVhbCBpbnQgQnl0ZVNpemUoKSBjb25zdCA9IDA7Ci0KLSAgLy8gU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB3aXRob3V0IHJlY29tcHV0aW5nIHRoZSBzaXplLiAgVGhlIG1lc3NhZ2UgbXVzdAotICAvLyBub3QgaGF2ZSBjaGFuZ2VkIHNpbmNlIHRoZSBsYXN0IGNhbGwgdG8gQnl0ZVNpemUoKTsgaWYgaXQgaGFzLCB0aGUgcmVzdWx0cwotICAvLyBhcmUgdW5kZWZpbmVkLgotICB2aXJ0dWFsIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0ID0gMDsKLQotICAvLyBMaWtlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcywgYnV0IHdyaXRlcyBkaXJlY3RseSB0byAqdGFyZ2V0LCByZXR1cm5pbmcKLSAgLy8gYSBwb2ludGVyIHRvIHRoZSBieXRlIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbi4gICJ0YXJnZXQiCi0gIC8vIG11c3QgcG9pbnQgYXQgYSBieXRlIGFycmF5IG9mIGF0IGxlYXN0IEJ5dGVTaXplKCkgYnl0ZXMuCi0gIHZpcnR1YWwgdWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3Q7Ci0KLSAgLy8gUmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBsYXN0IGNhbGwgdG8gQnl0ZVNpemUoKS4gIEFuIGVtYmVkZGVkIG1lc3NhZ2UncwotICAvLyBzaXplIGlzIG5lZWRlZCBib3RoIHRvIHNlcmlhbGl6ZSBpdCAoYmVjYXVzZSBlbWJlZGRlZCBtZXNzYWdlcyBhcmUKLSAgLy8gbGVuZ3RoLWRlbGltaXRlZCkgYW5kIHRvIGNvbXB1dGUgdGhlIG91dGVyIG1lc3NhZ2UncyBzaXplLiAgQ2FjaGluZwotICAvLyB0aGUgc2l6ZSBhdm9pZHMgY29tcHV0aW5nIGl0IG11bHRpcGxlIHRpbWVzLgotICAvLwotICAvLyBCeXRlU2l6ZSgpIGRvZXMgbm90IGF1dG9tYXRpY2FsbHkgdXNlIHRoZSBjYWNoZWQgc2l6ZSB3aGVuIGF2YWlsYWJsZQotICAvLyBiZWNhdXNlIHRoaXMgd291bGQgcmVxdWlyZSBpbnZhbGlkYXRpbmcgaXQgZXZlcnkgdGltZSB0aGUgbWVzc2FnZSB3YXMKLSAgLy8gbW9kaWZpZWQsIHdoaWNoIHdvdWxkIGJlIHRvbyBoYXJkIGFuZCBleHBlbnNpdmUuICAoRS5nLiBpZiBhIGRlZXBseS1uZXN0ZWQKLSAgLy8gc3ViLW1lc3NhZ2UgaXMgY2hhbmdlZCwgYWxsIG9mIGl0cyBwYXJlbnRzJyBjYWNoZWQgc2l6ZXMgd291bGQgbmVlZCB0byBiZQotICAvLyBpbnZhbGlkYXRlZCwgd2hpY2ggaXMgdG9vIG11Y2ggd29yayBmb3IgYW4gb3RoZXJ3aXNlIGlubGluZWQgc2V0dGVyCi0gIC8vIG1ldGhvZC4pCi0gIHZpcnR1YWwgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCA9IDA7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUxpdGUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX01FU1NBR0VfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDY2OGExYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSw0NzEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLQotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPHN5cy9zdGF0Lmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPGlvLmg+Ci0jZWxzZQotI2luY2x1ZGUgPHVuaXN0ZC5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLSNpZm5kZWYgT19CSU5BUlkKLSNpZmRlZiBfT19CSU5BUlkKLSNkZWZpbmUgT19CSU5BUlkgX09fQklOQVJZCi0jZWxzZQotI2RlZmluZSBPX0JJTkFSWSAwICAgICAvLyBJZiB0aGlzIGlzbid0IGRlZmluZWQsIHRoZSBwbGF0Zm9ybSBkb2Vzbid0IG5lZWQgaXQuCi0jZW5kaWYKLSNlbmRpZgotCi1URVNUKE1lc3NhZ2VUZXN0LCBTZXJpYWxpemVIZWxwZXJzKSB7Ci0gIC8vIFRPRE8oa2VudG9uKTogIFRlc3QgbW9yZSBoZWxwZXJzPyAgVGhleSdyZSBhbGwgdHdvLWxpbmVycyBzbyBpdCBzZWVtcwotICAvLyAgIGxpa2UgYSB3YXN0ZSBvZiB0aW1lLgotCi0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7Ci0gIHN0cmluZ3N0cmVhbSBzdHJlYW07Ci0KLSAgc3RyaW5nIHN0cjEoImZvbyIpOwotICBzdHJpbmcgc3RyMigiYmFyIik7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc3RyMSkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZzdHIyKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9Pc3RyZWFtKCZzdHJlYW0pKTsKLQotICBFWFBFQ1RfRVEoc3RyMS5zaXplKCkgKyAzLCBzdHIyLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgc3RyMi5zdWJzdHIoMCwgMykpOwotICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBkdW1wIHJhdyBiaW5hcnkgZGF0YSB0bwotICAvLyBzdGRvdXQuCi0gIEVYUEVDVF9UUlVFKHN0cjIuc3Vic3RyKDMpID09IHN0cjEpOwotCi0gIC8vIEdDQyBnaXZlcyBzb21lIHNvcnQgb2YgZXJyb3IgaWYgd2UgdHJ5IHRvIGp1c3QgZG8gc3RyZWFtLnN0cigpID09IHN0cjEuCi0gIHN0cmluZyB0ZW1wID0gc3RyZWFtLnN0cigpOwotICBFWFBFQ1RfVFJVRSh0ZW1wID09IHN0cjEpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKSA9PSBzdHIxKTsKLQotfQotCi1URVNUKE1lc3NhZ2VUZXN0LCBTZXJpYWxpemVUb0Jyb2tlbk9zdHJlYW0pIHsKLSAgb2ZzdHJlYW0gb3V0OwotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0gIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX2ludDMyKDEyMyk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuU2VyaWFsaXplVG9Pc3RyZWFtKCZvdXQpKTsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgUGFyc2VGcm9tRmlsZURlc2NyaXB0b3IpIHsKLSAgc3RyaW5nIGZpbGVuYW1lID0gVGVzdFNvdXJjZURpcigpICsKLSAgICAgICAgICAgICAgICAgICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UiOwotICBpbnQgZmlsZSA9IG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKGZpbGUpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKLQotICBFWFBFQ1RfR0UoY2xvc2UoZmlsZSksIDApOwotfQotCi1URVNUKE1lc3NhZ2VUZXN0LCBQYXJzZVBhY2tlZEZyb21GaWxlRGVzY3JpcHRvcikgewotICBzdHJpbmcgZmlsZW5hbWUgPQotICAgICAgVGVzdFNvdXJjZURpcigpICsKLSAgICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UiOwotICBpbnQgZmlsZSA9IG9wZW4oZmlsZW5hbWUuY19zdHIoKSwgT19SRE9OTFkgfCBPX0JJTkFSWSk7Ci0KLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUZpbGVEZXNjcmlwdG9yKGZpbGUpKTsKLSAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKLQotICBFWFBFQ1RfR0UoY2xvc2UoZmlsZSksIDApOwotfQotCi1URVNUKE1lc3NhZ2VUZXN0LCBQYXJzZUhlbHBlcnMpIHsKLSAgLy8gVE9ETyhrZW50b24pOiAgVGVzdCBtb3JlIGhlbHBlcnM/ICBUaGV5J3JlIGFsbCB0d28tbGluZXJzIHNvIGl0IHNlZW1zCi0gIC8vICAgbGlrZSBhIHdhc3RlIG9mIHRpbWUuCi0gIHN0cmluZyBkYXRhOwotCi0gIHsKLSAgICAvLyBTZXQgdXAuCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICAgIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotICAgIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotICB9Ci0KLSAgewotICAgIC8vIFRlc3QgUGFyc2VGcm9tU3RyaW5nLgotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIHsKLSAgICAvLyBUZXN0IFBhcnNlRnJvbUlzdHJlYW0uCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICAgIHN0cmluZ3N0cmVhbSBzdHJlYW0oZGF0YSk7Ci0gICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21Jc3RyZWFtKCZzdHJlYW0pKTsKLSAgICBFWFBFQ1RfVFJVRShzdHJlYW0uZW9mKCkpOwotICAgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gVGVzdCBQYXJzZUZyb21Cb3VuZGVkWmVyb0NvcHlTdHJlYW0uCi0gICAgc3RyaW5nIGRhdGFfd2l0aF9qdW5rKGRhdGEpOwotICAgIGRhdGFfd2l0aF9qdW5rLmFwcGVuZCgic29tZSBqdW5rIG9uIHRoZSBlbmQiKTsKLSAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBzdHJlYW0oZGF0YV93aXRoX2p1bmsuZGF0YSgpLCBkYXRhX3dpdGhfanVuay5zaXplKCkpOwotICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSgmc3RyZWFtLCBkYXRhLnNpemUoKSkpOwotICAgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICB7Ci0gICAgLy8gVGVzdCB0aGF0IFBhcnNlRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbSBmYWlscyAoYnV0IGRvZXNuJ3QgY3Jhc2gpIGlmCi0gICAgLy8gRU9GIGlzIHJlYWNoZWQgYmVmb3JlIHRoZSBleHBlY3RlZCBudW1iZXIgb2YgYnl0ZXMuCi0gICAgaW86OkFycmF5SW5wdXRTdHJlYW0gc3RyZWFtKGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICAgIEVYUEVDVF9GQUxTRSgKLSAgICAgIG1lc3NhZ2UuUGFyc2VGcm9tQm91bmRlZFplcm9Db3B5U3RyZWFtKCZzdHJlYW0sIGRhdGEuc2l6ZSgpICsgMSkpOwotICB9Ci19Ci0KLVRFU1QoTWVzc2FnZVRlc3QsIFBhcnNlRmFpbHNJZk5vdEluaXRpYWxpemVkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotCi0gIHsKLSAgICBTY29wZWRNZW1vcnlMb2cgbG9nOwotICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZygiIikpOwotICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7Ci0gIH0KLQotICBBU1NFUlRfRVEoMSwgZXJyb3JzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiQ2FuJ3QgcGFyc2UgbWVzc2FnZSBvZiB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkXCIgIgotICAgICAgICAgICAgImJlY2F1c2UgaXQgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLAotICAgICAgICAgICAgZXJyb3JzWzBdKTsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgQnlwYXNzSW5pdGlhbGl6YXRpb25DaGVja09uUGFyc2UpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOwotICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoTlVMTCwgMCk7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgSW5pdGlhbGl6YXRpb25FcnJvclN0cmluZykgewotICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7Ci0gIEVYUEVDVF9FUSgiYSwgYiwgYyIsIG1lc3NhZ2UuSW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgRHluYW1pY0Nhc3RUb0dlbmVyYXRlZCkgewotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHRlc3RfYWxsX3R5cGVzOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXIgPSAmdGVzdF9hbGxfdHlwZXM7Ci0gIEVYUEVDVF9FUSgmdGVzdF9hbGxfdHlwZXMsCi0gICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPigKLSAgICAgICAgICAgICAgICB0ZXN0X2FsbF90eXBlc19wb2ludGVyKSk7Ci0gIEVYUEVDVF9FUShOVUxMLAotICAgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8dW5pdHRlc3Q6OlRlc3RSZXF1aXJlZD4oCi0gICAgICAgICAgICAgICAgdGVzdF9hbGxfdHlwZXNfcG9pbnRlcikpOwotCi0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXJfY29uc3QgPSAmdGVzdF9hbGxfdHlwZXM7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICZ0ZXN0X2FsbF90eXBlcywKLSAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KAotICAgICAgICAgIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXJfY29uc3QpKTsKLSAgRVhQRUNUX0VRKAotICAgICAgTlVMTCwKLSAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ+KAotICAgICAgICAgIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXJfY29uc3QpKTsKLX0KLQotI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUICAvLyBkZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIHlldC4KLQotVEVTVChNZXNzYWdlVGVzdCwgU2VyaWFsaXplRmFpbHNJZk5vdEluaXRpYWxpemVkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKLSAgc3RyaW5nIGRhdGE7Ci0gIEVYUEVDVF9ERUJVR19ERUFUSChFWFBFQ1RfVFJVRShtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKSksCi0gICAgIkNhbid0IHNlcmlhbGl6ZSBtZXNzYWdlIG9mIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWRcIiBiZWNhdXNlICIKLSAgICAiaXQgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiKTsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgQ2hlY2tJbml0aWFsaXplZCkgewotICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7Ci0gIEVYUEVDVF9ERUFUSChtZXNzYWdlLkNoZWNrSW5pdGlhbGl6ZWQoKSwKLSAgICAiTWVzc2FnZSBvZiB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkXCIgaXMgbWlzc2luZyByZXF1aXJlZCAiCi0gICAgImZpZWxkczogYSwgYiwgYyIpOwotfQotCi1URVNUKE1lc3NhZ2VUZXN0LCBDaGVja092ZXJmbG93KSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgLy8gQ3JlYXRlIGEgbWVzc2FnZSB3aXRoIHNpemUganVzdCBvdmVyIDJHQi4gVGhpcyB0cmlnZ2VycyBpbnRlZ2VyIG92ZXJmbG93Ci0gIC8vIHdoZW4gY29tcHV0aW5nIG1lc3NhZ2Ugc2l6ZS4KLSAgY29uc3Qgc3RyaW5nIGRhdGEoMTAyNCwgJ3gnKTsKLSAgQ29yZCBvbmVfbWVnYWJ5dGU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTAyNDsgaSsrKSB7Ci0gICAgb25lX21lZ2FieXRlLkFwcGVuZChkYXRhKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMiAqIDEwMjQgKyAxOyArK2kpIHsKLSAgICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9jb3JkKCktPkNvcHlGcm9tKG9uZV9tZWdhYnl0ZSk7Ci0gIH0KLQotICBDb3JkIHNlcmlhbGl6ZWQ7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkFwcGVuZFRvQ29yZCgmc2VyaWFsaXplZCkpOwotfQotCi0jZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCi0KLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE5lZ2F0aXZlQnl0ZVNpemUgOiBwdWJsaWMgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCB7Ci0gcHVibGljOgotICB2aXJ0dWFsIGludCBCeXRlU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIC0xOyB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotVEVTVChNZXNzYWdlVGVzdCwgU2VyaWFsaXphdGlvbkZhaWxzT25OZWdhdGl2ZUJ5dGVTaXplKSB7Ci0gIE5lZ2F0aXZlQnl0ZVNpemUgbWVzc2FnZTsKLSAgc3RyaW5nIHN0cmluZ19vdXRwdXQ7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkFwcGVuZFBhcnRpYWxUb1N0cmluZygmc3RyaW5nX291dHB1dCkpOwotCi0gIGlvOjpBcnJheU91dHB1dFN0cmVhbSBjb2RlZF9yYXdfb3V0cHV0KE5VTEwsIDEwMCk7Ci0gIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJmNvZGVkX3Jhd19vdXRwdXQpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5TZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbSgmY29kZWRfb3V0cHV0KSk7Ci19Ci0KLVRFU1QoTWVzc2FnZVRlc3QsIEJ5cGFzc0luaXRpYWxpemF0aW9uQ2hlY2tPblNlcmlhbGl6ZSkgewotICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7Ci0gIGlvOjpBcnJheU91dHB1dFN0cmVhbSByYXdfb3V0cHV0KE5VTEwsIDApOwotICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVQYXJ0aWFsVG9Db2RlZFN0cmVhbSgmb3V0cHV0KSk7Ci19Ci0KLVRFU1QoTWVzc2FnZVRlc3QsIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycykgewotICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIG1lc3NhZ2U7Ci0gIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKLSAgbWVzc2FnZS5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7Ci0gIEFTU0VSVF9FUSgzLCBlcnJvcnMuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCJhIiwgZXJyb3JzWzBdKTsKLSAgRVhQRUNUX0VRKCJiIiwgZXJyb3JzWzFdKTsKLSAgRVhQRUNUX0VRKCJjIiwgZXJyb3JzWzJdKTsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgUGFyc2VGYWlsc09uSW52YWxpZE1lc3NhZ2VFbmQpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotCi0gIC8vIENvbnRyb2wgY2FzZS4KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21BcnJheSgiIiwgMCkpOwotCi0gIC8vIFRoZSBieXRlIGlzIGEgdmFsaWQgdmFyaW50LCBidXQgbm90IGEgdmFsaWQgdGFnICh6ZXJvKS4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tQXJyYXkoIlwwIiwgMSkpOwotCi0gIC8vIFRoZSBieXRlIGlzIGEgbWFsZm9ybWVkIHZhcmludC4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tQXJyYXkoIlwyMDAiLCAxKSk7Ci0KLSAgLy8gVGhlIGJ5dGUgaXMgYW4gZW5kZ3JvdXAgdGFnLCBidXQgd2UgYXJlbid0IHBhcnNpbmcgYSBncm91cC4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tQXJyYXkoIlwwMTQiLCAxKSk7Ci19Ci0KLW5hbWVzcGFjZSB7Ci0KLXZvaWQgRXhwZWN0TWVzc2FnZU1lcmdlZChjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7Ci0gIEVYUEVDVF9FUSgzLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKCkpOwotICBFWFBFQ1RfRVEoMiwgbWVzc2FnZS5vcHRpb25hbF9pbnQ2NCgpKTsKLSAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkpOwotfQotCi12b2lkIEFzc2lnblBhcnNpbmdNZXJnZU1lc3NhZ2VzKAotICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1zZzEsCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbXNnMiwKLSAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtc2czKSB7Ci0gIG1zZzEtPnNldF9vcHRpb25hbF9pbnQzMigxKTsKLSAgbXNnMi0+c2V0X29wdGlvbmFsX2ludDY0KDIpOwotICBtc2czLT5zZXRfb3B0aW9uYWxfaW50MzIoMyk7Ci0gIG1zZzMtPnNldF9vcHRpb25hbF9zdHJpbmcoImhlbGxvIik7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi0vLyBUZXN0IHRoYXQgaWYgYW4gb3B0aW9uYWwgb3IgcmVxdWlyZWQgbWVzc2FnZS9ncm91cCBmaWVsZCBhcHBlYXJzIG11bHRpcGxlCi0vLyB0aW1lcyBpbiB0aGUgaW5wdXQsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQuCi1URVNUKE1lc3NhZ2VUZXN0LCBQYXJzaW5nTWVyZ2UpIHsKLSAgdW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2U6OlJlcGVhdGVkRmllbGRzR2VuZXJhdG9yIGdlbmVyYXRvcjsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbXNnMTsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbXNnMjsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbXNnMzsKLQotI2RlZmluZSBBU1NJR05fUkVQRUFURURfRklFTEQoRklFTEQpICAgICAgICAgICAgICAgIFwKLSAgbXNnMSA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICAgICAgICAgICAgICAgICBcCi0gIG1zZzIgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgICAgICAgICAgICAgICAgXAotICBtc2czID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgICAgICAgICAgICAgICAgIFwKLSAgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMobXNnMSwgbXNnMiwgbXNnMykKLQotICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQxKTsKLSAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMik7Ci0gIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChmaWVsZDMpOwotICBBU1NJR05fUkVQRUFURURfRklFTEQoZXh0MSk7Ci0gIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChleHQyKTsKLQotI3VuZGVmIEFTU0lHTl9SRVBFQVRFRF9GSUVMRAotI2RlZmluZSBBU1NJR05fUkVQRUFURURfR1JPVVAoRklFTEQpICAgICAgICAgICAgICAgIFwKLSAgbXNnMSA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCi0gIG1zZzIgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAotICBtc2czID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKLSAgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMobXNnMSwgbXNnMiwgbXNnMykKLQotICBBU1NJR05fUkVQRUFURURfR1JPVVAoZ3JvdXAxKTsKLSAgQVNTSUdOX1JFUEVBVEVEX0dST1VQKGdyb3VwMik7Ci0KLSN1bmRlZiBBU1NJR05fUkVQRUFURURfR1JPVVAKLQotICBzdHJpbmcgYnVmZmVyOwotICBnZW5lcmF0b3IuU2VyaWFsaXplVG9TdHJpbmcoJmJ1ZmZlcik7Ci0gIHVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlIHBhcnNpbmdfbWVyZ2U7Ci0gIHBhcnNpbmdfbWVyZ2UuUGFyc2VGcm9tU3RyaW5nKGJ1ZmZlcik7Ci0KLSAgLy8gUmVxdWlyZWQgYW5kIG9wdGlvbmFsIGZpZWxkcyBzaG91bGQgYmUgbWVyZ2VkLgotICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2UucmVxdWlyZWRfYWxsX3R5cGVzKCkpOwotICBFeHBlY3RNZXNzYWdlTWVyZ2VkKHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxfYWxsX3R5cGVzKCkpOwotICBFeHBlY3RNZXNzYWdlTWVyZ2VkKAotICAgICAgcGFyc2luZ19tZXJnZS5vcHRpb25hbGdyb3VwKCkub3B0aW9uYWxfZ3JvdXBfYWxsX3R5cGVzKCkpOwotICBFeHBlY3RNZXNzYWdlTWVyZ2VkKAotICAgICAgcGFyc2luZ19tZXJnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2U6Om9wdGlvbmFsX2V4dCkpOwotCi0gIC8vIFJlcGVhdGVkIGZpZWxkcyBzaG91bGQgbm90IGJlIG1lcmdlZC4KLSAgRVhQRUNUX0VRKDMsIHBhcnNpbmdfbWVyZ2UucmVwZWF0ZWRfYWxsX3R5cGVzX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgzLCBwYXJzaW5nX21lcmdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDMsIHBhcnNpbmdfbWVyZ2UuRXh0ZW5zaW9uU2l6ZSgKLSAgICAgIHVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlOjpyZXBlYXRlZF9leHQpKTsKLX0KLQotVEVTVChNZXNzYWdlVGVzdCwgTWVyZ2VGcm9tKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgc291cmNlOwotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGRlc3Q7Ci0KLSAgLy8gT3B0aW9uYWwgZmllbGRzCi0gIHNvdXJjZS5zZXRfb3B0aW9uYWxfaW50MzIoMSk7ICAvLyBvbmx5IHNvdXJjZQotICBzb3VyY2Uuc2V0X29wdGlvbmFsX2ludDY0KDIpOyAgLy8gYm90aCBzb3VyY2UgYW5kIGRlc3QKLSAgZGVzdC5zZXRfb3B0aW9uYWxfaW50NjQoMyk7Ci0gIGRlc3Quc2V0X29wdGlvbmFsX3VpbnQzMig0KTsgICAvLyBvbmx5IGRlc3QKLQotICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aCBkZWZhdWx0cwotICBzb3VyY2Uuc2V0X2RlZmF1bHRfaW50MzIoMTMpOyAgLy8gb25seSBzb3VyY2UKLSAgc291cmNlLnNldF9kZWZhdWx0X2ludDY0KDE0KTsgIC8vIGJvdGggc291cmNlIGFuZCBkZXN0Ci0gIGRlc3Quc2V0X2RlZmF1bHRfaW50NjQoMTUpOwotICBkZXN0LnNldF9kZWZhdWx0X3VpbnQzMigxNik7ICAgLy8gb25seSBkZXN0Ci0KLSAgLy8gUmVwZWF0ZWQgZmllbGRzCi0gIHNvdXJjZS5hZGRfcmVwZWF0ZWRfaW50MzIoNSk7ICAvLyBvbmx5IHNvdXJjZQotICBzb3VyY2UuYWRkX3JlcGVhdGVkX2ludDMyKDYpOwotICBzb3VyY2UuYWRkX3JlcGVhdGVkX2ludDY0KDcpOyAgLy8gYm90aCBzb3VyY2UgYW5kIGRlc3QKLSAgc291cmNlLmFkZF9yZXBlYXRlZF9pbnQ2NCg4KTsKLSAgZGVzdC5hZGRfcmVwZWF0ZWRfaW50NjQoOSk7Ci0gIGRlc3QuYWRkX3JlcGVhdGVkX2ludDY0KDEwKTsKLSAgZGVzdC5hZGRfcmVwZWF0ZWRfdWludDMyKDExKTsgIC8vIG9ubHkgZGVzdAotICBkZXN0LmFkZF9yZXBlYXRlZF91aW50MzIoMTIpOwotCi0gIGRlc3QuTWVyZ2VGcm9tKHNvdXJjZSk7Ci0KLSAgLy8gT3B0aW9uYWwgZmllbGRzOiBzb3VyY2Ugb3ZlcndyaXRlcyBkZXN0IGlmIHNvdXJjZSBpcyBzcGVjaWZpZWQKLSAgRVhQRUNUX0VRKDEsIGRlc3Qub3B0aW9uYWxfaW50MzIoKSk7ICAvLyBvbmx5IHNvdXJjZTogdXNlIHNvdXJjZQotICBFWFBFQ1RfRVEoMiwgZGVzdC5vcHRpb25hbF9pbnQ2NCgpKTsgIC8vIHNvdXJjZSBhbmQgZGVzdDogdXNlIHNvdXJjZQotICBFWFBFQ1RfRVEoNCwgZGVzdC5vcHRpb25hbF91aW50MzIoKSk7ICAvLyBvbmx5IGRlc3Q6IHVzZSBkZXN0Ci0gIEVYUEVDVF9FUSgwLCBkZXN0Lm9wdGlvbmFsX3VpbnQ2NCgpKTsgIC8vIG5laXRoZXI6IHVzZSBkZWZhdWx0Ci0KLSAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMKLSAgRVhQRUNUX0VRKDEzLCBkZXN0LmRlZmF1bHRfaW50MzIoKSk7ICAvLyBvbmx5IHNvdXJjZTogdXNlIHNvdXJjZQotICBFWFBFQ1RfRVEoMTQsIGRlc3QuZGVmYXVsdF9pbnQ2NCgpKTsgIC8vIHNvdXJjZSBhbmQgZGVzdDogdXNlIHNvdXJjZQotICBFWFBFQ1RfRVEoMTYsIGRlc3QuZGVmYXVsdF91aW50MzIoKSk7ICAvLyBvbmx5IGRlc3Q6IHVzZSBkZXN0Ci0gIEVYUEVDVF9FUSg0NCwgZGVzdC5kZWZhdWx0X3VpbnQ2NCgpKTsgIC8vIG5laXRoZXI6IHVzZSBkZWZhdWx0Ci0KLSAgLy8gUmVwZWF0ZWQgZmllbGRzOiBjb25jYXRlbmF0ZSBzb3VyY2Ugb250byB0aGUgZW5kIG9mIGRlc3QKLSAgQVNTRVJUX0VRKDIsIGRlc3QucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDUsIGRlc3QucmVwZWF0ZWRfaW50MzIoMCkpOwotICBFWFBFQ1RfRVEoNiwgZGVzdC5yZXBlYXRlZF9pbnQzMigxKSk7Ci0gIEFTU0VSVF9FUSg0LCBkZXN0LnJlcGVhdGVkX2ludDY0X3NpemUoKSk7Ci0gIEVYUEVDVF9FUSg5LCAgZGVzdC5yZXBlYXRlZF9pbnQ2NCgwKSk7Ci0gIEVYUEVDVF9FUSgxMCwgZGVzdC5yZXBlYXRlZF9pbnQ2NCgxKSk7Ci0gIEVYUEVDVF9FUSg3LCAgZGVzdC5yZXBlYXRlZF9pbnQ2NCgyKSk7Ci0gIEVYUEVDVF9FUSg4LCAgZGVzdC5yZXBlYXRlZF9pbnQ2NCgzKSk7Ci0gIEFTU0VSVF9FUSgyLCBkZXN0LnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOwotICBFWFBFQ1RfRVEoMTEsIGRlc3QucmVwZWF0ZWRfdWludDMyKDApKTsKLSAgRVhQRUNUX0VRKDEyLCBkZXN0LnJlcGVhdGVkX3VpbnQzMigxKSk7Ci0gIEFTU0VSVF9FUSgwLCBkZXN0LnJlcGVhdGVkX3VpbnQ2NF9zaXplKCkpOwotfQotCi1URVNUKE1lc3NhZ2VGYWN0b3J5VGVzdCwgR2VuZXJhdGVkRmFjdG9yeUxvb2t1cCkgewotICBFWFBFQ1RfRVEoCi0gICAgTWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCktPkdldFByb3RvdHlwZSgKLSAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKSksCi0gICAgJnByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7Ci19Ci0KLVRFU1QoTWVzc2FnZUZhY3RvcnlUZXN0LCBHZW5lcmF0ZWRGYWN0b3J5VW5rbm93blR5cGUpIHsKLSAgLy8gQ29uc3RydWN0IGEgbmV3IGRlc2NyaXB0b3IuCi0gIERlc2NyaXB0b3JQb29sIHBvb2w7Ci0gIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKLSAgZmlsZS5zZXRfbmFtZSgiZm9vLnByb3RvIik7Ci0gIGZpbGUuYWRkX21lc3NhZ2VfdHlwZSgpLT5zZXRfbmFtZSgiRm9vIik7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBwb29sLkJ1aWxkRmlsZShmaWxlKS0+bWVzc2FnZV90eXBlKDApOwotCi0gIC8vIFRyeWluZyB0byBjb25zdHJ1Y3QgaXQgc2hvdWxkIHJldHVybiBOVUxMLgotICBFWFBFQ1RfVFJVRSgKLSAgICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3IpID09IE5VTEwpOwotfQotCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYWNrYWdlX2luZm8uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkzNWU5NjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9wYWNrYWdlX2luZm8uaAorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIGZpbGUgZXhpc3RzIHNvbGVseSB0byBkb2N1bWVudCB0aGUgZ29vZ2xlOjpwcm90b2J1ZiBuYW1lc3BhY2UuCi0vLyBJdCBpcyBub3QgY29tcGlsZWQgaW50byBhbnl0aGluZywgYnV0IGl0IG1heSBiZSByZWFkIGJ5IGFuIGF1dG9tYXRlZAotLy8gZG9jdW1lbnRhdGlvbiBnZW5lcmF0b3IuCi0KLW5hbWVzcGFjZSBnb29nbGUgewotCi0vLyBDb3JlIGNvbXBvbmVudHMgb2YgdGhlIFByb3RvY29sIEJ1ZmZlcnMgcnVudGltZSBsaWJyYXJ5LgotLy8KLS8vIFRoZSBmaWxlcyBpbiB0aGlzIHBhY2thZ2UgcmVwcmVzZW50IHRoZSBjb3JlIG9mIHRoZSBQcm90b2NvbCBCdWZmZXIKLS8vIHN5c3RlbS4gIEFsbCBvZiB0aGVtIGFyZSBwYXJ0IG9mIHRoZSBsaWJwcm90b2J1ZiBsaWJyYXJ5LgotLy8KLS8vIEEgbm90ZSBvbiB0aHJlYWQtc2FmZXR5OgotLy8KLS8vIFRocmVhZC1zYWZldHkgaW4gdGhlIFByb3RvY29sIEJ1ZmZlciBsaWJyYXJ5IGZvbGxvd3MgYSBzaW1wbGUgcnVsZToKLS8vIHVubGVzcyBleHBsaWNpdGx5IG5vdGVkIG90aGVyd2lzZSwgaXQgaXMgYWx3YXlzIHNhZmUgdG8gdXNlIGFuIG9iamVjdAotLy8gZnJvbSBtdWx0aXBsZSB0aHJlYWRzIHNpbXVsdGFuZW91c2x5IGFzIGxvbmcgYXMgdGhlIG9iamVjdCBpcyBkZWNsYXJlZAotLy8gY29uc3QgaW4gYWxsIHRocmVhZHMgKG9yLCBpdCBpcyBvbmx5IHVzZWQgaW4gd2F5cyB0aGF0IHdvdWxkIGJlIGFsbG93ZWQKLS8vIGlmIGl0IHdlcmUgZGVjbGFyZWQgY29uc3QpLiAgSG93ZXZlciwgaWYgYW4gb2JqZWN0IGlzIGFjY2Vzc2VkIGluIG9uZQotLy8gdGhyZWFkIGluIGEgd2F5IHRoYXQgd291bGQgbm90IGJlIGFsbG93ZWQgaWYgaXQgd2VyZSBjb25zdCwgdGhlbiBpdCBpcwotLy8gbm90IHNhZmUgdG8gYWNjZXNzIHRoYXQgb2JqZWN0IGluIGFueSBvdGhlciB0aHJlYWQgc2ltdWx0YW5lb3VzbHkuCi0vLwotLy8gUHV0IHNpbXBseSwgcmVhZC1vbmx5IGFjY2VzcyB0byBhbiBvYmplY3QgY2FuIGhhcHBlbiBpbiBtdWx0aXBsZSB0aHJlYWRzCi0vLyBzaW11bHRhbmVvdXNseSwgYnV0IHdyaXRlIGFjY2VzcyBjYW4gb25seSBoYXBwZW4gaW4gYSBzaW5nbGUgdGhyZWFkIGF0Ci0vLyBhIHRpbWUuCi0vLwotLy8gVGhlIGltcGxlbWVudGF0aW9uIGRvZXMgY29udGFpbiBzb21lICJjb25zdCIgbWV0aG9kcyB3aGljaCBhY3R1YWxseSBtb2RpZnkKLS8vIHRoZSBvYmplY3QgYmVoaW5kIHRoZSBzY2VuZXMgLS0gZS5nLiwgdG8gY2FjaGUgcmVzdWx0cyAtLSBidXQgaW4gdGhlc2UgY2FzZXMKLS8vIG11dGV4IGxvY2tpbmcgaXMgdXNlZCB0byBtYWtlIHRoZSBhY2Nlc3MgdGhyZWFkLXNhZmUuCi1uYW1lc3BhY2UgcHJvdG9idWYge30KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0NjI5ZGVjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwyNjkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIFJlZmxlY3Rpb25PcHM6OkNvcHkoY29uc3QgTWVzc2FnZSYgZnJvbSwgTWVzc2FnZSogdG8pIHsKLSAgaWYgKCZmcm9tID09IHRvKSByZXR1cm47Ci0gIENsZWFyKHRvKTsKLSAgTWVyZ2UoZnJvbSwgdG8pOwotfQotCi12b2lkIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKGNvbnN0IE1lc3NhZ2UmIGZyb20sIE1lc3NhZ2UqIHRvKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdG8pOwotCi0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBmcm9tLkdldERlc2NyaXB0b3IoKTsKLSAgR09PR0xFX0NIRUNLX0VRKHRvLT5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpCi0gICAgPDwgIlRyaWVkIHRvIG1lcmdlIG1lc3NhZ2VzIG9mIGRpZmZlcmVudCB0eXBlcyAiCi0gICAgPDwgIihtZXJnZSAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpCi0gICAgPDwgIiB0byAiIDw8IHRvLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpIDw8ICIpIjsKLQotICBjb25zdCBSZWZsZWN0aW9uKiBmcm9tX3JlZmxlY3Rpb24gPSBmcm9tLkdldFJlZmxlY3Rpb24oKTsKLSAgY29uc3QgUmVmbGVjdGlvbiogdG9fcmVmbGVjdGlvbiA9IHRvLT5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgZnJvbV9yZWZsZWN0aW9uLT5MaXN0RmllbGRzKGZyb20sICZmaWVsZHMpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07Ci0KLSAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIGludCBjb3VudCA9IGZyb21fcmVmbGVjdGlvbi0+RmllbGRTaXplKGZyb20sIGZpZWxkKTsKLSAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgewotICAgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKENQUFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIHRvX3JlZmxlY3Rpb24tPkFkZCMjTUVUSE9EKHRvLCBmaWVsZCwgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIGZyb21fcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWQjI01FVEhPRChmcm9tLCBmaWVsZCwgaikpOyAgICAgXAotICAgICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBIQU5ETEVfVFlQRShJTlQzMiAsIEludDMyICk7Ci0gICAgICAgICAgSEFORExFX1RZUEUoSU5UNjQgLCBJbnQ2NCApOwotICAgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyKTsKLSAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIFVJbnQ2NCk7Ci0gICAgICAgICAgSEFORExFX1RZUEUoRkxPQVQgLCBGbG9hdCApOwotICAgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgRG91YmxlKTsKLSAgICAgICAgICBIQU5ETEVfVFlQRShCT09MICAsIEJvb2wgICk7Ci0gICAgICAgICAgSEFORExFX1RZUEUoU1RSSU5HLCBTdHJpbmcpOwotICAgICAgICAgIEhBTkRMRV9UWVBFKEVOVU0gICwgRW51bSAgKTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICAgIHRvX3JlZmxlY3Rpb24tPkFkZE1lc3NhZ2UodG8sIGZpZWxkKS0+TWVyZ2VGcm9tKAotICAgICAgICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShmcm9tLCBmaWVsZCwgaikpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShDUFBUWVBFLCBNRVRIT0QpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgdG9fcmVmbGVjdGlvbi0+U2V0IyNNRVRIT0QodG8sIGZpZWxkLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgZnJvbV9yZWZsZWN0aW9uLT5HZXQjI01FVEhPRChmcm9tLCBmaWVsZCkpOyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBIQU5ETEVfVFlQRShJTlQzMiAsIEludDMyICk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKElOVDY0ICwgSW50NjQgKTsKLSAgICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCBVSW50MzIpOwotICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIFVJbnQ2NCk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKEZMT0FUICwgRmxvYXQgKTsKLSAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBEb3VibGUpOwotICAgICAgICBIQU5ETEVfVFlQRShCT09MICAsIEJvb2wgICk7Ci0gICAgICAgIEhBTkRMRV9UWVBFKFNUUklORywgU3RyaW5nKTsKLSAgICAgICAgSEFORExFX1RZUEUoRU5VTSAgLCBFbnVtICApOwotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICB0b19yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSh0bywgZmllbGQpLT5NZXJnZUZyb20oCi0gICAgICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPkdldE1lc3NhZ2UoZnJvbSwgZmllbGQpKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICB0b19yZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyh0byktPk1lcmdlRnJvbSgKLSAgICBmcm9tX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMoZnJvbSkpOwotfQotCi12b2lkIFJlZmxlY3Rpb25PcHM6OkNsZWFyKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmZmllbGRzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkc1tpXSk7Ci0gIH0KLQotICByZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKS0+Q2xlYXIoKTsKLX0KLQotYm9vbCBSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgLy8gQ2hlY2sgcmVxdWlyZWQgZmllbGRzIG9mIHRoaXMgbWVzc2FnZS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX3JlcXVpcmVkKCkpIHsKLSAgICAgIGlmICghcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZGVzY3JpcHRvci0+ZmllbGQoaSkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBDaGVjayB0aGF0IHN1Yi1tZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCi0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0gIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKLSAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLQotICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKLQotICAgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHNpemU7IGorKykgewotICAgICAgICAgIGlmICghcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuSXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIXJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLklzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFJlZmxlY3Rpb25PcHM6OkRpc2NhcmRVbmtub3duRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICByZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKS0+Q2xlYXIoKTsKLQotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwotICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmZmllbGRzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOwotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAgIGludCBzaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBmaWVsZCk7Ci0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0gICAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaikKLSAgICAgICAgICAgICAgICAgICAgLT5EaXNjYXJkVW5rbm93bkZpZWxkcygpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBmaWVsZCktPkRpc2NhcmRVbmtub3duRmllbGRzKCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXN0YXRpYyBzdHJpbmcgU3ViTWVzc2FnZVByZWZpeChjb25zdCBzdHJpbmcmIHByZWZpeCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgewotICBzdHJpbmcgcmVzdWx0KHByZWZpeCk7Ci0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKLSAgICByZXN1bHQuYXBwZW5kKCIoIik7Ci0gICAgcmVzdWx0LmFwcGVuZChmaWVsZC0+ZnVsbF9uYW1lKCkpOwotICAgIHJlc3VsdC5hcHBlbmQoIikiKTsKLSAgfSBlbHNlIHsKLSAgICByZXN1bHQuYXBwZW5kKGZpZWxkLT5uYW1lKCkpOwotICB9Ci0gIGlmIChpbmRleCAhPSAtMSkgewotICAgIHJlc3VsdC5hcHBlbmQoIlsiKTsKLSAgICByZXN1bHQuYXBwZW5kKFNpbXBsZUl0b2EoaW5kZXgpKTsKLSAgICByZXN1bHQuYXBwZW5kKCJdIik7Ci0gIH0KLSAgcmVzdWx0LmFwcGVuZCgiLiIpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIFJlZmxlY3Rpb25PcHM6OkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgIGNvbnN0IHN0cmluZyYgcHJlZml4LAotICAgIHZlY3RvcjxzdHJpbmc+KiBlcnJvcnMpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgLy8gQ2hlY2sgcmVxdWlyZWQgZmllbGRzIG9mIHRoaXMgbWVzc2FnZS4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX3JlcXVpcmVkKCkpIHsKLSAgICAgIGlmICghcmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgZGVzY3JpcHRvci0+ZmllbGQoaSkpKSB7Ci0gICAgICAgIGVycm9ycy0+cHVzaF9iYWNrKHByZWZpeCArIGRlc2NyaXB0b3ItPmZpZWxkKGkpLT5uYW1lKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vIENoZWNrIHN1Yi1tZXNzYWdlcy4KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOwotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotCi0gICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgICAgaW50IHNpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGQpOwotCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7Ci0gICAgICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPQotICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKTsKLSAgICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc3ViX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgaiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7Ci0gICAgICAgIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzdWJfbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgLTEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JzKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNDc3NTkxMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmgKKysrIC9kZXYvbnVsbApAQCAtMSw4MSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gVGhpcyBoZWFkZXIgaXMgbG9naWNhbGx5IGludGVybmFsLCBidXQgaXMgbWFkZSBwdWJsaWMgYmVjYXVzZSBpdCBpcyB1c2VkCi0vLyBmcm9tIHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlLCB3aGljaCBtYXkgcmVzaWRlIGluIG90aGVyIGNvbXBvbmVudHMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fT1BTX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUkVGTEVDVElPTl9PUFNfSF9fCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQmFzaWMgb3BlcmF0aW9ucyB0aGF0IGNhbiBiZSBwZXJmb3JtZWQgdXNpbmcgcmVmbGVjdGlvbi4KLS8vIFRoZXNlIGNhbiBiZSB1c2VkIGFzIGEgY2hlYXAgd2F5IHRvIGltcGxlbWVudCB0aGUgY29ycmVzcG9uZGluZwotLy8gbWV0aG9kcyBvZiB0aGUgTWVzc2FnZSBpbnRlcmZhY2UsIHRob3VnaCB0aGV5IGFyZSBsaWtlbHkgdG8gYmUKLS8vIHNsb3dlciB0aGFuIGltcGxlbWVudGF0aW9ucyB0YWlsb3JlZCBmb3IgdGhlIHNwZWNpZmljIG1lc3NhZ2UgdHlwZS4KLS8vCi0vLyBUaGlzIGNsYXNzIHNob3VsZCBzdGF5IGxpbWl0ZWQgdG8gb3BlcmF0aW9ucyBuZWVkZWQgdG8gaW1wbGVtZW50Ci0vLyB0aGUgTWVzc2FnZSBpbnRlcmZhY2UuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyByZWFsbHkgYSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyBvbmx5IHN0YXRpYyBtZXRob2RzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFJlZmxlY3Rpb25PcHMgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgQ29weShjb25zdCBNZXNzYWdlJiBmcm9tLCBNZXNzYWdlKiB0byk7Ci0gIHN0YXRpYyB2b2lkIE1lcmdlKGNvbnN0IE1lc3NhZ2UmIGZyb20sIE1lc3NhZ2UqIHRvKTsKLSAgc3RhdGljIHZvaWQgQ2xlYXIoTWVzc2FnZSogbWVzc2FnZSk7Ci0gIHN0YXRpYyBib29sIElzSW5pdGlhbGl6ZWQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIERpc2NhcmRVbmtub3duRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UpOwotCi0gIC8vIEZpbmRzIGFsbCB1bnNldCByZXF1aXJlZCBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UgYW5kIGFkZHMgdGhlaXIgZnVsbAotICAvLyBwYXRocyAoZS5nLiAiZm9vLmJhcls1XS5iYXoiKSB0byAqbmFtZXMuICAicHJlZml4IiB3aWxsIGJlIGF0dGFjaGVkIHRvCi0gIC8vIHRoZSBmcm9udCBvZiBlYWNoIG5hbWUuCi0gIHN0YXRpYyB2b2lkIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZXJyb3JzKTsKLQotIHByaXZhdGU6Ci0gIC8vIEFsbCBtZXRob2RzIGFyZSBzdGF0aWMuICBObyBuZWVkIHRvIGNvbnN0cnVjdC4KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlZmxlY3Rpb25PcHMpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUkVGTEVDVElPTl9PUFNfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODhkNmJmYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDc2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB7Ci0KLVRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIFNhbml0eUNoZWNrKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ29weSkgewotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UsIG1lc3NhZ2UyOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotCi0gIFJlZmxlY3Rpb25PcHM6OkNvcHkobWVzc2FnZSwgJm1lc3NhZ2UyKTsKLQotICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLQotICAvLyBDb3B5aW5nIGZyb20gc2VsZiBzaG91bGQgYmUgYSBuby1vcC4KLSAgUmVmbGVjdGlvbk9wczo6Q29weShtZXNzYWdlMiwgJm1lc3NhZ2UyKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci19Ci0KLVRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENvcHlFeHRlbnNpb25zKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlLCBtZXNzYWdlMjsKLQotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0KLSAgUmVmbGVjdGlvbk9wczo6Q29weShtZXNzYWdlLCAmbWVzc2FnZTIpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ29weU9uZW9mKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UsIG1lc3NhZ2UyOwotICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlKTsKLSAgUmVmbGVjdGlvbk9wczo6Q29weShtZXNzYWdlLCAmbWVzc2FnZTIpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UyKTsKLQotICBUZXN0VXRpbDo6U2V0T25lb2YyKCZtZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MihtZXNzYWdlKTsKLSAgUmVmbGVjdGlvbk9wczo6Q29weShtZXNzYWdlLCAmbWVzc2FnZTIpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQyKG1lc3NhZ2UyKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgTWVyZ2UpIHsKLSAgLy8gTm90ZTogIENvcHkgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgTWVyZ2UoKSBzbyB0ZWNobmljYWxseSB0aGUgQ29weQotICAvLyAgIHRlc3QgYWxyZWFkeSB0ZXN0ZWQgbW9zdCBvZiB0aGlzLgotCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZSwgbWVzc2FnZTI7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7Ci0KLSAgLy8gVGhpcyBmaWVsZCB3aWxsIHRlc3QgbWVyZ2luZyBpbnRvIGFuIGVtcHR5IHNwb3QuCi0gIG1lc3NhZ2UyLnNldF9vcHRpb25hbF9pbnQzMihtZXNzYWdlLm9wdGlvbmFsX2ludDMyKCkpOwotICBtZXNzYWdlLmNsZWFyX29wdGlvbmFsX2ludDMyKCk7Ci0KLSAgLy8gVGhpcyB0ZXN0cyBvdmVyd3JpdGluZy4KLSAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX3N0cmluZyhtZXNzYWdlLm9wdGlvbmFsX3N0cmluZygpKTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJzb21ldGhpbmcgZWxzZSIpOwotCi0gIC8vIFRoaXMgdGVzdHMgY29uY2F0ZW5hdGluZy4KLSAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX2ludDMyKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMSkpOwotICBpbnQzMiBpID0gbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigwKTsKLSAgbWVzc2FnZS5jbGVhcl9yZXBlYXRlZF9pbnQzMigpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbnQzMihpKTsKLQotICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlMiwgJm1lc3NhZ2UpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci19Ci0KLVRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlRXh0ZW5zaW9ucykgewotICAvLyBOb3RlOiAgQ29weSBpcyBpbXBsZW1lbnRlZCBpbiB0ZXJtcyBvZiBNZXJnZSgpIHNvIHRlY2huaWNhbGx5IHRoZSBDb3B5Ci0gIC8vICAgdGVzdCBhbHJlYWR5IHRlc3RlZCBtb3N0IG9mIHRoaXMuCi0KLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UsIG1lc3NhZ2UyOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLQotICAvLyBUaGlzIGZpZWxkIHdpbGwgdGVzdCBtZXJnaW5nIGludG8gYW4gZW1wdHkgc3BvdC4KLSAgbWVzc2FnZTIuU2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sCi0gICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOwotICBtZXNzYWdlLkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pOwotCi0gIC8vIFRoaXMgdGVzdHMgb3ZlcndyaXRpbmcuCi0gIG1lc3NhZ2UyLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwKLSAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbikpOwotICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiwgInNvbWV0aGluZyBlbHNlIik7Ci0KLSAgLy8gVGhpcyB0ZXN0cyBjb25jYXRlbmF0aW5nLgotICBtZXNzYWdlMi5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwKLSAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAxKSk7Ci0gIGludDMyIGkgPSBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAwKTsKLSAgbWVzc2FnZS5DbGVhckV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKTsKLSAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgaSk7Ci0KLSAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTIsICZtZXNzYWdlKTsKLQotICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgTWVyZ2VVbmtub3duKSB7Ci0gIC8vIFRlc3QgdGhhdCB0aGUgbWVzc2FnZXMnIFVua25vd25GaWVsZFNldHMgYXJlIGNvcnJlY3RseSBtZXJnZWQuCi0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgbWVzc2FnZTEubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMTIzNCwgMSk7Ci0gIG1lc3NhZ2UyLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQsIDIpOwotCi0gIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UyLCAmbWVzc2FnZTEpOwotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlMS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwKLSAgICAgICAgICAgIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudHlwZSgpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudmFyaW50KCkpOwotICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwKLSAgICAgICAgICAgIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkudHlwZSgpKTsKLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkudmFyaW50KCkpOwotfQotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBNZXJnZU9uZW9mKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKLSAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZTEpOwotCi0gIC8vIE1lcmdlIHRvIGVtcHR5IG1lc3NhZ2UKLSAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTEsICZtZXNzYWdlMik7Ci0gIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEobWVzc2FnZTIpOwotCi0gIC8vIE1lcmdlIHdpdGggdGhlIHNhbWUgb25lb2YgZmllbGRzCi0gIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UxLCAmbWVzc2FnZTIpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UyKTsKLQotICAvLyBNZXJnZSB3aXRoIGRpZmZlcmVudCBvbmVvZiBmaWVsZHMKLSAgVGVzdFV0aWw6OlNldE9uZW9mMigmbWVzc2FnZTEpOwotICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKLSAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MihtZXNzYWdlMik7Ci19Ci0KLSNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBNZXJnZUZyb21TZWxmKSB7Ci0gIC8vIE5vdGU6ICBDb3B5IGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIE1lcmdlKCkgc28gdGVjaG5pY2FsbHkgdGhlIENvcHkKLSAgLy8gICB0ZXN0IGFscmVhZHkgdGVzdGVkIG1vc3Qgb2YgdGhpcy4KLQotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0KLSAgRVhQRUNUX0RFQVRIKAotICAgIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UsICZtZXNzYWdlKSwKLSAgICAiJmZyb20iKTsKLX0KLQotI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDbGVhcikgewotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0KLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7Ci0KLSAgUmVmbGVjdGlvbk9wczo6Q2xlYXIoJm1lc3NhZ2UpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKLQotICAvLyBDaGVjayB0aGF0IGdldHRpbmcgZW1iZWRkZWQgbWVzc2FnZXMgcmV0dXJucyB0aGUgb2JqZWN0cyBjcmVhdGVkIGR1cmluZwotICAvLyBTZXRBbGxGaWVsZHMoKSByYXRoZXIgdGhhbiBkZWZhdWx0IGluc3RhbmNlcy4KLSAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpPcHRpb25hbEdyb3VwOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5vcHRpb25hbGdyb3VwKCkpOwotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOwotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOwotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0X2ltcG9ydDo6SW1wb3J0TWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKSk7Ci19Ci0KLVRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENsZWFyRXh0ZW5zaW9ucykgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0KLSAgUmVmbGVjdGlvbk9wczo6Q2xlYXIoJm1lc3NhZ2UpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCBnZXR0aW5nIGVtYmVkZGVkIG1lc3NhZ2VzIHJldHVybnMgdGhlIG9iamVjdHMgY3JlYXRlZCBkdXJpbmcKLSAgLy8gU2V0QWxsRXh0ZW5zaW9ucygpIHJhdGhlciB0aGFuIGRlZmF1bHQgaW5zdGFuY2VzLgotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpPcHRpb25hbEdyb3VwX2V4dGVuc2lvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpLAotICAgICAgICAgICAgJm1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfTkUoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKLSAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9ORSgmdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24oCi0gICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9ORSgmdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZWZhdWx0X2luc3RhbmNlKCksCi0gICAgICAgICAgICAmbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOwotfQotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDbGVhclVua25vd24pIHsKLSAgLy8gVGVzdCB0aGF0IHRoZSBtZXNzYWdlJ3MgVW5rbm93bkZpZWxkU2V0IGlzIGNvcnJlY3RseSBjbGVhcmVkLgotICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOwotICBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQsIDEpOwotCi0gIFJlZmxlY3Rpb25PcHM6OkNsZWFyKCZtZXNzYWdlKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotfQotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDbGVhck9uZW9mKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0KLSAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIobWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UpOwotICBSZWZsZWN0aW9uT3BzOjpDbGVhcigmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RPbmVvZkNsZWFyKG1lc3NhZ2UpOwotCi0gIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UpOwotICBUZXN0VXRpbDo6U2V0T25lb2YyKCZtZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MihtZXNzYWdlKTsKLSAgUmVmbGVjdGlvbk9wczo6Q2xlYXIoJm1lc3NhZ2UpOwotICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZDbGVhcihtZXNzYWdlKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRGlzY2FyZFVua25vd25GaWVsZHMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKLQotICAvLyBTZXQgc29tZSB1bmtub3duIGZpZWxkcyBpbiBtZXNzYWdlLgotICBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKQotICAgICAgICAtPkFkZFZhcmludCgxMjM0NTYsIDY1NDMyMSk7Ci0gIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpCi0gICAgICAgIC0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpCi0gICAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKLSAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApCi0gICAgICAgIC0+bXV0YWJsZV91bmtub3duX2ZpZWxkcygpCi0gICAgICAgIC0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKLQotICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpCi0gICAgICAgICAgICAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApCi0gICAgICAgICAgICAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Ci0KLSAgLy8gRGlzY2FyZCB0aGVtLgotICBSZWZsZWN0aW9uT3BzOjpEaXNjYXJkVW5rbm93bkZpZWxkcygmbWVzc2FnZSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKQotICAgICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKQotICAgICAgICAgICAgICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotfQotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBEaXNjYXJkVW5rbm93bkV4dGVuc2lvbnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLQotICAvLyBTZXQgc29tZSB1bmtub3duIGZpZWxkcy4KLSAgbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKLSAgICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOwotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKLSAgICAgICAgLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKLSAgICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOwotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiwgMCkKLSAgICAgICAgLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCkKLSAgICAgICAgLT5BZGRWYXJpbnQoMTIzNDU2LCA2NTQzMjEpOwotCi0gIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgxLAotICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pCi0gICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotICBFWFBFQ1RfRVEoMSwKLSAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKQotICAgICAgICAgICAudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKLQotICAvLyBEaXNjYXJkIHRoZW0uCi0gIFJlZmxlY3Rpb25PcHM6OkRpc2NhcmRVbmtub3duRmllbGRzKCZtZXNzYWdlKTsKLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Ci0KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKLSAgRVhQRUNUX0VRKDAsCi0gICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKLSAgICAgICAgICAgLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSk7Ci0gIEVYUEVDVF9FUSgwLAotICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApCi0gICAgICAgICAgIC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotfQotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBJc0luaXRpYWxpemVkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKLQotICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7Ci0gIG1lc3NhZ2Uuc2V0X2EoMSk7Ci0gIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKLSAgbWVzc2FnZS5zZXRfYigyKTsKLSAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotICBtZXNzYWdlLnNldF9jKDMpOwotICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRm9yZWlnbklzSW5pdGlhbGl6ZWQpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZEZvcmVpZ24gbWVzc2FnZTsKLQotICAvLyBTdGFydHMgb3V0IGluaXRpYWxpemVkIGJlY2F1c2UgdGhlIGZvcmVpZ24gbWVzc2FnZSBpcyBpdHNlbGYgYW4gb3B0aW9uYWwKLSAgLy8gZmllbGQuCi0gIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIC8vIE9uY2Ugd2UgY3JlYXRlIHRoYXQgZmllbGQsIHRoZSBtZXNzYWdlIGlzIG5vIGxvbmdlciBpbml0aWFsaXplZC4KLSAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKTsKLSAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIC8vIEluaXRpYWxpemUgaXQuICBOb3cgd2UncmUgaW5pdGlhbGl6ZWQuCi0gIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9tZXNzYWdlKCktPnNldF9hKDEpOwotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpLT5zZXRfYigyKTsKLSAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX21lc3NhZ2UoKS0+c2V0X2MoMyk7Ci0gIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIC8vIEFkZCBhIHJlcGVhdGVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuICBObyBsb25nZXIgaW5pdGlhbGl6ZWQuCi0gIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQqIHN1Yl9tZXNzYWdlID0gbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbWVzc2FnZSgpOwotICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7Ci0KLSAgLy8gSW5pdGlhbGl6ZSB0aGF0IHJlcGVhdGVkIHZlcnNpb24uCi0gIHN1Yl9tZXNzYWdlLT5zZXRfYSgxKTsKLSAgc3ViX21lc3NhZ2UtPnNldF9iKDIpOwotICBzdWJfbWVzc2FnZS0+c2V0X2MoMyk7Ci0gIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotfQotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBFeHRlbnNpb25Jc0luaXRpYWxpemVkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotCi0gIC8vIFN0YXJ0cyBvdXQgaW5pdGlhbGl6ZWQgYmVjYXVzZSB0aGUgZm9yZWlnbiBtZXNzYWdlIGlzIGl0c2VsZiBhbiBvcHRpb25hbAotICAvLyBmaWVsZC4KLSAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7Ci0KLSAgLy8gT25jZSB3ZSBjcmVhdGUgdGhhdCBmaWVsZCwgdGhlIG1lc3NhZ2UgaXMgbm8gbG9uZ2VyIGluaXRpYWxpemVkLgotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKTsKLSAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIC8vIEluaXRpYWxpemUgaXQuICBOb3cgd2UncmUgaW5pdGlhbGl6ZWQuCi0gIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjpzaW5nbGUpLT5zZXRfYSgxKTsKLSAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSktPnNldF9iKDIpOwotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6c2luZ2xlKS0+c2V0X2MoMyk7Ci0gIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIC8vIEFkZCBhIHJlcGVhdGVkIHZlcnNpb24gb2YgdGhlIG1lc3NhZ2UuICBObyBsb25nZXIgaW5pdGlhbGl6ZWQuCi0gIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpKTsKLSAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIC8vIEluaXRpYWxpemUgdGhhdCByZXBlYXRlZCB2ZXJzaW9uLgotICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGksIDApLT5zZXRfYSgxKTsKLSAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpLCAwKS0+c2V0X2IoMik7Ci0gIG1lc3NhZ2UuTXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6VGVzdFJlcXVpcmVkOjptdWx0aSwgMCktPnNldF9jKDMpOwotICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgT25lb2ZJc0luaXRpYWxpemVkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWRPbmVvZiBtZXNzYWdlOwotICBFWFBFQ1RfVFJVRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKLQotICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKTsKLSAgRVhQRUNUX0ZBTFNFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIG1lc3NhZ2Uuc2V0X2Zvb19pbnQoMSk7Ci0gIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotCi0gIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpOwotICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7Ci0gIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcmVxdWlyZWRfZG91YmxlKDAuMSk7Ci0gIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwotfQotCi1zdGF0aWMgc3RyaW5nIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKLSAgUmVmbGVjdGlvbk9wczo6RmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UsICIiLCAmZXJyb3JzKTsKLSAgcmV0dXJuIEpvaW4oZXJyb3JzLCAiLCIpOwotfQotCi1URVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOwotICBFWFBFQ1RfRVEoImEsYixjIiwgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UpKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRmluZEZvcmVpZ25Jbml0aWFsaXphdGlvbkVycm9ycykgewotICB1bml0dGVzdDo6VGVzdFJlcXVpcmVkRm9yZWlnbiBtZXNzYWdlOwotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbWVzc2FnZSgpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9tZXNzYWdlKCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX21lc3NhZ2UoKTsKLSAgRVhQRUNUX0VRKCJvcHRpb25hbF9tZXNzYWdlLmEsIgotICAgICAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYiwiCi0gICAgICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5jLCIKLSAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmEsIgotICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYiwiCi0gICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5jLCIKLSAgICAgICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmEsIgotICAgICAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYiwiCi0gICAgICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5jIiwKLSAgICAgICAgICAgIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhtZXNzYWdlKSk7Ci19Ci0KLVRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEZpbmRFeHRlbnNpb25Jbml0aWFsaXphdGlvbkVycm9ycykgewotICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6OnNpbmdsZSk7Ci0gIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ6Om11bHRpKTsKLSAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OlRlc3RSZXF1aXJlZDo6bXVsdGkpOwotICBFWFBFQ1RfRVEoIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQuc2luZ2xlKS5hLCIKLSAgICAgICAgICAgICIocHJvdG9idWZfdW5pdHRlc3QuVGVzdFJlcXVpcmVkLnNpbmdsZSkuYiwiCi0gICAgICAgICAgICAiKHByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5zaW5nbGUpLmMsIgotICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmEsIgotICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmIsIgotICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzBdLmMsIgotICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmEsIgotICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmIsIgotICAgICAgICAgICAgIihwcm90b2J1Zl91bml0dGVzdC5UZXN0UmVxdWlyZWQubXVsdGkpWzFdLmMiLAotICAgICAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UpKTsKLX0KLQotVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRmluZE9uZW9mSW5pdGlhbGl6YXRpb25FcnJvcnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZE9uZW9mIG1lc3NhZ2U7Ci0gIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpOwotICBFWFBFQ1RfRVEoImZvb19tZXNzYWdlLnJlcXVpcmVkX2RvdWJsZSIsCi0gICAgICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzcwMDRmNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGFsZ29yaXRobT4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLXZvaWQqKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6SW50ZXJuYWxFeHRlbmQoaW50IGV4dGVuZF9hbW91bnQpIHsKLSAgaW50IG5ld19zaXplID0gY3VycmVudF9zaXplXyArIGV4dGVuZF9hbW91bnQ7Ci0gIGlmICh0b3RhbF9zaXplXyA+PSBuZXdfc2l6ZSkgewotICAgIC8vIE4uQi46IHJlcF8gaXMgbm9uLU5VTEwgYmVjYXVzZSBleHRlbmRfYW1vdW50IGlzIGFsd2F5cyA+IDAsIGhlbmNlCi0gICAgLy8gdG90YWxfc2l6ZSBtdXN0IGJlIG5vbi16ZXJvIHNpbmNlIGl0IGlzIGxvd2VyLWJvdW5kZWQgYnkgbmV3X3NpemUuCi0gICAgcmV0dXJuICZyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfXTsKLSAgfQotICBSZXAqIG9sZF9yZXAgPSByZXBfOwotICBBcmVuYSogYXJlbmEgPSBHZXRBcmVuYU5vVmlydHVhbCgpOwotICBuZXdfc2l6ZSA9IHN0ZDo6bWF4KGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgodG90YWxfc2l6ZV8gKiAyLCBuZXdfc2l6ZSkpOwotICBHT09HTEVfQ0hFQ0tfTEUobmV3X3NpemUsCi0gICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC0ga1JlcEhlYWRlclNpemUpIC8KLSAgICAgICAgICAgc2l6ZW9mKG9sZF9yZXAtPmVsZW1lbnRzWzBdKSkKLSAgICAgIDw8ICJSZXF1ZXN0ZWQgc2l6ZSBpcyB0b28gbGFyZ2UgdG8gZml0IGludG8gc2l6ZV90LiI7Ci0gIGlmIChhcmVuYSA9PSBOVUxMKSB7Ci0gICAgcmVwXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwKj4oCi0gICAgICAgIG5ldyBjaGFyW2tSZXBIZWFkZXJTaXplICsgc2l6ZW9mKG9sZF9yZXAtPmVsZW1lbnRzWzBdKSAqIG5ld19zaXplXSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmVwXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwKj4oCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZUFycmF5PGNoYXI+KGFyZW5hLAotICAgICAgICAgICAga1JlcEhlYWRlclNpemUgKyBzaXplb2Yob2xkX3JlcC0+ZWxlbWVudHNbMF0pICogbmV3X3NpemUpKTsKLSAgfQotICB0b3RhbF9zaXplXyA9IG5ld19zaXplOwotICBpZiAob2xkX3JlcCAmJiBvbGRfcmVwLT5hbGxvY2F0ZWRfc2l6ZSA+IDApIHsKLSAgICBtZW1jcHkocmVwXy0+ZWxlbWVudHMsIG9sZF9yZXAtPmVsZW1lbnRzLAotICAgICAgICAgICBvbGRfcmVwLT5hbGxvY2F0ZWRfc2l6ZSAqIHNpemVvZihyZXBfLT5lbGVtZW50c1swXSkpOwotICAgIHJlcF8tPmFsbG9jYXRlZF9zaXplID0gb2xkX3JlcC0+YWxsb2NhdGVkX3NpemU7Ci0gIH0gZWxzZSB7Ci0gICAgcmVwXy0+YWxsb2NhdGVkX3NpemUgPSAwOwotICB9Ci0gIGlmIChhcmVuYSA9PSBOVUxMKSB7Ci0gICAgZGVsZXRlIFtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG9sZF9yZXApOwotICB9Ci0gIHJldHVybiAmcmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplX107Ci19Ci0KLXZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlc2VydmUoaW50IG5ld19zaXplKSB7Ci0gIGlmIChuZXdfc2l6ZSA+IGN1cnJlbnRfc2l6ZV8pIHsKLSAgICBJbnRlcm5hbEV4dGVuZChuZXdfc2l6ZSAtIGN1cnJlbnRfc2l6ZV8pOwotICB9Ci19Ci0KLXZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsb3NlR2FwKGludCBzdGFydCwgaW50IG51bSkgewotICBpZiAocmVwXyA9PSBOVUxMKSByZXR1cm47Ci0gIC8vIENsb3NlIHVwIGEgZ2FwIG9mICJudW0iIGVsZW1lbnRzIHN0YXJ0aW5nIGF0IG9mZnNldCAic3RhcnQiLgotICBmb3IgKGludCBpID0gc3RhcnQgKyBudW07IGkgPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZTsgKytpKQotICAgIHJlcF8tPmVsZW1lbnRzW2kgLSBudW1dID0gcmVwXy0+ZWxlbWVudHNbaV07Ci0gIGN1cnJlbnRfc2l6ZV8gLT0gbnVtOwotICByZXBfLT5hbGxvY2F0ZWRfc2l6ZSAtPSBudW07Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxOTYxYmM0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaAorKysgL2Rldi9udWxsCkBAIC0xLDI0ODMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFJlcGVhdGVkRmllbGQgYW5kIFJlcGVhdGVkUHRyRmllbGQgYXJlIHVzZWQgYnkgZ2VuZXJhdGVkIHByb3RvY29sIG1lc3NhZ2UKLS8vIGNsYXNzZXMgdG8gbWFuaXB1bGF0ZSByZXBlYXRlZCBmaWVsZHMuICBUaGVzZSBjbGFzc2VzIGFyZSB2ZXJ5IHNpbWlsYXIgdG8KLS8vIFNUTCdzIHZlY3RvciwgYnV0IGluY2x1ZGUgYSBudW1iZXIgb2Ygb3B0aW1pemF0aW9ucyBmb3VuZCB0byBiZSB1c2VmdWwKLS8vIHNwZWNpZmljYWxseSBpbiB0aGUgY2FzZSBvZiBQcm90b2NvbCBCdWZmZXJzLiAgUmVwZWF0ZWRQdHJGaWVsZCBpcwotLy8gcGFydGljdWxhcmx5IGRpZmZlcmVudCBmcm9tIFNUTCB2ZWN0b3IgYXMgaXQgbWFuYWdlcyBvd25lcnNoaXAgb2YgdGhlCi0vLyBwb2ludGVycyB0aGF0IGl0IGNvbnRhaW5zLgotLy8KLS8vIFR5cGljYWxseSwgY2xpZW50cyBzaG91bGQgbm90IG5lZWQgdG8gYWNjZXNzIFJlcGVhdGVkRmllbGQgb2JqZWN0cyBkaXJlY3RseSwKLS8vIGJ1dCBzaG91bGQgaW5zdGVhZCB1c2UgdGhlIGFjY2Vzc29yIGZ1bmN0aW9ucyBnZW5lcmF0ZWQgYXV0b21hdGljYWxseSBieSB0aGUKLS8vIHByb3RvY29sIGNvbXBpbGVyLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9GSUVMRF9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1JFUEVBVEVEX0ZJRUxEX0hfXwotCi0jaWZkZWYgX01TQ19WRVIKLS8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIG1pbi9tYXggb24gVlMyMDEzIG9ubHkuCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8aXRlcmF0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotCi1uYW1lc3BhY2UgdXBiIHsKLW5hbWVzcGFjZSBnb29nbGVfb3BlbnNvdXJjZSB7Ci1jbGFzcyBHTVJfSGFuZGxlcnM7Ci19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlX29wZW5zb3VyY2UKLX0gIC8vIG5hbWVzcGFjZSB1cGIKLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotY2xhc3MgTWVzc2FnZTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotc3RhdGljIGNvbnN0IGludCBrTWluUmVwZWF0ZWRGaWVsZEFsbG9jYXRpb25TaXplID0gNDsKLQotLy8gQSB1dGlsaXR5IGZ1bmN0aW9uIGZvciBsb2dnaW5nIHRoYXQgZG9lc24ndCBuZWVkIGFueSB0ZW1wbGF0ZSB0eXBlcy4KLXZvaWQgTG9nSW5kZXhPdXRPZkJvdW5kcyhpbnQgaW5kZXgsIGludCBzaXplKTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+Ci1pbmxpbmUgaW50IENhbGN1bGF0ZVJlc2VydmUoSXRlciBiZWdpbiwgSXRlciBlbmQsIHN0ZDo6Zm9yd2FyZF9pdGVyYXRvcl90YWcpIHsKLSAgcmV0dXJuIHN0ZDo6ZGlzdGFuY2UoYmVnaW4sIGVuZCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotaW5saW5lIGludCBDYWxjdWxhdGVSZXNlcnZlKEl0ZXIgLypiZWdpbiovLCBJdGVyIC8qZW5kKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RkOjppbnB1dF9pdGVyYXRvcl90YWcgLyp1bnVzZWQqLykgewotICByZXR1cm4gLTE7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotaW5saW5lIGludCBDYWxjdWxhdGVSZXNlcnZlKEl0ZXIgYmVnaW4sIEl0ZXIgZW5kKSB7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8SXRlcj46Oml0ZXJhdG9yX2NhdGVnb3J5IENhdGVnb3J5OwotICByZXR1cm4gQ2FsY3VsYXRlUmVzZXJ2ZShiZWdpbiwgZW5kLCBDYXRlZ29yeSgpKTsKLX0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0KLS8vIFJlcGVhdGVkRmllbGQgaXMgdXNlZCB0byByZXByZXNlbnQgcmVwZWF0ZWQgZmllbGRzIG9mIGEgcHJpbWl0aXZlIHR5cGUgKGluCi0vLyBvdGhlciB3b3JkcywgZXZlcnl0aGluZyBleGNlcHQgc3RyaW5ncyBhbmQgbmVzdGVkIE1lc3NhZ2VzKS4gIE1vc3QgdXNlcnMgd2lsbAotLy8gbm90IGV2ZXIgdXNlIGEgUmVwZWF0ZWRGaWVsZCBkaXJlY3RseTsgdGhleSB3aWxsIHVzZSB0aGUgZ2V0LWJ5LWluZGV4LAotLy8gc2V0LWJ5LWluZGV4LCBhbmQgYWRkIGFjY2Vzc29ycyB0aGF0IGFyZSBnZW5lcmF0ZWQgZm9yIGFsbCByZXBlYXRlZCBmaWVsZHMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWNsYXNzIFJlcGVhdGVkRmllbGQgewotIHB1YmxpYzoKLSAgUmVwZWF0ZWRGaWVsZCgpOwotICBleHBsaWNpdCBSZXBlYXRlZEZpZWxkKEFyZW5hKiBhcmVuYSk7Ci0gIFJlcGVhdGVkRmllbGQoY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpOwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KLSAgUmVwZWF0ZWRGaWVsZChJdGVyIGJlZ2luLCBjb25zdCBJdGVyJiBlbmQpOwotICB+UmVwZWF0ZWRGaWVsZCgpOwotCi0gIFJlcGVhdGVkRmllbGQmIG9wZXJhdG9yPShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7Ci0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0OwotICBpbnQgc2l6ZSgpIGNvbnN0OwotCi0gIGNvbnN0IEVsZW1lbnQmIEdldChpbnQgaW5kZXgpIGNvbnN0OwotICBFbGVtZW50KiBNdXRhYmxlKGludCBpbmRleCk7Ci0gIHZvaWQgU2V0KGludCBpbmRleCwgY29uc3QgRWxlbWVudCYgdmFsdWUpOwotICB2b2lkIEFkZChjb25zdCBFbGVtZW50JiB2YWx1ZSk7Ci0gIEVsZW1lbnQqIEFkZCgpOwotICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCi0gIHZvaWQgUmVtb3ZlTGFzdCgpOwotCi0gIC8vIEV4dHJhY3QgZWxlbWVudHMgd2l0aCBpbmRpY2VzIGluICJbc3RhcnQgLi4gc3RhcnQrbnVtLTFdIi4KLSAgLy8gQ29weSB0aGVtIGludG8gImVsZW1lbnRzWzAgLi4gbnVtLTFdIiBpZiAiZWxlbWVudHMiIGlzIG5vdCBOVUxMLgotICAvLyBDYXV0aW9uOiBpbXBsZW1lbnRhdGlvbiBhbHNvIG1vdmVzIGVsZW1lbnRzIHdpdGggaW5kaWNlcyBbc3RhcnQrbnVtIC4uXS4KLSAgLy8gQ2FsbGluZyB0aGlzIHJvdXRpbmUgaW5zaWRlIGEgbG9vcCBjYW4gY2F1c2UgcXVhZHJhdGljIGJlaGF2aW9yLgotICB2b2lkIEV4dHJhY3RTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqIGVsZW1lbnRzKTsKLQotICB2b2lkIENsZWFyKCk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKLSAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7Ci0KLSAgLy8gUmVzZXJ2ZSBzcGFjZSB0byBleHBhbmQgdGhlIGZpZWxkIHRvIGF0IGxlYXN0IHRoZSBnaXZlbiBzaXplLiAgSWYgdGhlCi0gIC8vIGFycmF5IGlzIGdyb3duLCBpdCB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBkb3VibGVkIGluIHNpemUuCi0gIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOwotCi0gIC8vIFJlc2l6ZSB0aGUgUmVwZWF0ZWRGaWVsZCB0byBhIG5ldywgc21hbGxlciBzaXplLiAgVGhpcyBpcyBPKDEpLgotICB2b2lkIFRydW5jYXRlKGludCBuZXdfc2l6ZSk7Ci0KLSAgdm9pZCBBZGRBbHJlYWR5UmVzZXJ2ZWQoY29uc3QgRWxlbWVudCYgdmFsdWUpOwotICBFbGVtZW50KiBBZGRBbHJlYWR5UmVzZXJ2ZWQoKTsKLSAgaW50IENhcGFjaXR5KCkgY29uc3Q7Ci0KLSAgLy8gTGlrZSBTVEwgcmVzaXplLiAgVXNlcyB2YWx1ZSB0byBmaWxsIGFwcGVuZGVkIGVsZW1lbnRzLgotICAvLyBMaWtlIFRydW5jYXRlKCkgaWYgbmV3X3NpemUgPD0gc2l6ZSgpLCBvdGhlcndpc2UgdGhpcyBpcwotICAvLyBPKG5ld19zaXplIC0gc2l6ZSgpKS4KLSAgdm9pZCBSZXNpemUoaW50IG5ld19zaXplLCBjb25zdCBFbGVtZW50JiB2YWx1ZSk7Ci0KLSAgLy8gR2V0cyB0aGUgdW5kZXJseWluZyBhcnJheS4gIFRoaXMgcG9pbnRlciBpcyBwb3NzaWJseSBpbnZhbGlkYXRlZCBieQotICAvLyBhbnkgYWRkIG9yIHJlbW92ZSBvcGVyYXRpb24uCi0gIEVsZW1lbnQqIG11dGFibGVfZGF0YSgpOwotICBjb25zdCBFbGVtZW50KiBkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLiBJZiB0aGV5IGFyZSBzZXBhcmF0ZSBhcmVuYXMgdGhlbiwgY29waWVzCi0gIC8vIGRhdGEgYmV0d2VlbiBlYWNoIG90aGVyLgotICB2b2lkIFN3YXAoUmVwZWF0ZWRGaWVsZCogb3RoZXIpOwotCi0gIC8vIFN3YXAgZW50aXJlIGNvbnRlbnRzIHdpdGggIm90aGVyIi4gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHRoZSBjYWxsZXIgY2FuCi0gIC8vIGd1YXJhbnRlZSB0aGF0IGJvdGggcmVwZWF0ZWQgZmllbGRzIGFyZSBvbiB0aGUgc2FtZSBhcmVuYSBvciBhcmUgb24gdGhlCi0gIC8vIGhlYXAuIFN3YXBwaW5nIGJldHdlZW4gZGlmZmVyZW50IGFyZW5hcyBpcyBkaXNhbGxvd2VkIGFuZCBjYXVnaHQgYnkgYQotICAvLyBHT09HTEVfRENIRUNLIChzZWUgQVBJIGRvY3MgZm9yIGRldGFpbHMpLgotICB2b2lkIFVuc2FmZUFyZW5hU3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcik7Ci0KLSAgLy8gU3dhcCB0d28gZWxlbWVudHMuCi0gIHZvaWQgU3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpOwotCi0gIC8vIFNUTC1saWtlIGl0ZXJhdG9yIHN1cHBvcnQKLSAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiBFbGVtZW50IHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgaW50IHNpemVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotCi0gIGl0ZXJhdG9yIGJlZ2luKCk7Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0gIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0OwotICBpdGVyYXRvciBlbmQoKTsKLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7Ci0gIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdDsKLQotICAvLyBSZXZlcnNlIGl0ZXJhdG9yIHN1cHBvcnQKLSAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOwotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsKLSAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7Ci0gIH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOwotICB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsKLSAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKLSAgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgcmVwZWF0ZWQgZmllbGQsIGV4Y2x1ZGluZwotICAvLyBzaXplb2YoKnRoaXMpCi0gIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7Ci0KLSAgLy8gUmVtb3ZlcyB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5IHBvc2l0aW9uLgotICAvLwotICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcmVtb3ZlZAotICAvLyBlbGVtZW50LgotICAvLwotICAvLyBJbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzIGF0IG9yIGFmdGVyIHRoZSByZW1vdmVkIGVsZW1lbnQsIGluY2x1ZGluZyBlbmQoKS4KLSAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOwotCi0gIC8vIFJlbW92ZXMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBbZmlyc3QsIGxhc3QpLgotICAvLwotICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcmVtb3ZlZCByYW5nZS4KLSAgLy8KLSAgLy8gSW52YWxpZGF0ZXMgYWxsIGl0ZXJhdG9ycyBhdCBvciBhZnRlciB0aGUgcmVtb3ZlZCByYW5nZSwgaW5jbHVkaW5nIGVuZCgpLgotICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7Ci0KLSAgLy8gR2V0IHRoZSBBcmVuYSBvbiB3aGljaCB0aGlzIFJlcGVhdGVkRmllbGQgc3RvcmVzIGl0cyBlbGVtZW50cy4KLSAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmEoKSBjb25zdCB7Ci0gICAgcmV0dXJuIEdldEFyZW5hTm9WaXJ0dWFsKCk7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdCBpbnQga0luaXRpYWxTaXplID0gMDsKLSAgLy8gQSBub3RlIG9uIHRoZSByZXByZXNlbnRhdGlvbiBoZXJlIChzZWUgYWxzbyBjb21tZW50IGJlbG93IGZvcgotICAvLyBSZXBlYXRlZFB0ckZpZWxkQmFzZSdzIHN0cnVjdCBSZXApOgotICAvLwotICAvLyBXZSBtYWludGFpbiB0aGUgc2FtZSBzaXplb2YoUmVwZWF0ZWRGaWVsZCkgYXMgYmVmb3JlIHdlIGFkZGVkIGFyZW5hIHN1cHBvcnQKLSAgLy8gc28gdGhhdCB3ZSBkbyBub3QgZGVncmFkZSBwZXJmb3JtYW5jZSBieSBibG9hdGluZyBtZW1vcnkgdXNhZ2UuIERpcmVjdGx5Ci0gIC8vIGFkZGluZyBhbiBhcmVuYV8gZWxlbWVudCB0byBSZXBlYXRlZEZpZWxkIGlzIHF1aXRlIGNvc3RseS4gQnkgdXNpbmcKLSAgLy8gaW5kaXJlY3Rpb24gaW4gdGhpcyB3YXksIHdlIGtlZXAgdGhlIHNhbWUgc2l6ZSB3aGVuIHRoZSBSZXBlYXRlZEZpZWxkIGlzCi0gIC8vIGVtcHR5IChjb21tb24gY2FzZSksIGFuZCBhZGQgb25seSBhbiA4LWJ5dGUgaGVhZGVyIHRvIHRoZSBlbGVtZW50cyBhcnJheQotICAvLyB3aGVuIG5vbi1lbXB0eS4gV2UgbWFrZSBzdXJlIHRvIHBsYWNlIHRoZSBzaXplIGZpZWxkcyBkaXJlY3RseSBpbiB0aGUKLSAgLy8gUmVwZWF0ZWRGaWVsZCBjbGFzcyB0byBhdm9pZCBjb3N0bHkgY2FjaGUgbWlzc2VzIGR1ZSB0byB0aGUgaW5kaXJlY3Rpb24uCi0gIGludCBjdXJyZW50X3NpemVfOwotICBpbnQgdG90YWxfc2l6ZV87Ci0gIHN0cnVjdCBSZXAgewotICAgIEFyZW5hKiBhcmVuYTsKLSAgICBFbGVtZW50IGVsZW1lbnRzWzFdOwotICB9OwotICAvLyBXZSBjYW4gbm90IHVzZSBzaXplb2YoUmVwKSAtIHNpemVvZihFbGVtZW50KSBkdWUgdG8gdGhlIHRyYWlsaW5nIHBhZGRpbmcgb24KLSAgLy8gdGhlIHN0cnVjdC4gV2UgY2FuIG5vdCB1c2Ugc2l6ZW9mKEFyZW5hKikgYXMgd2VsbCBiZWNhdXNlIHRoZXJlIG1pZ2h0IGJlCi0gIC8vIGEgImdhcCIgYWZ0ZXIgdGhlIGZpZWxkIGFyZW5hIGFuZCBiZWZvcmUgdGhlIGZpZWxkIGVsZW1lbnRzIChlLmcuLCB3aGVuCi0gIC8vIEVsZW1lbnQgaXMgZG91YmxlIGFuZCBwb2ludGVyIGlzIDMyYml0KS4KLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrUmVwSGVhZGVyU2l6ZTsKLSAgLy8gQ29udGFpbnMgYXJlbmEgcHRyIGFuZCB0aGUgZWxlbWVudHMgYXJyYXkuIFdlIGFsc28ga2VlcCB0aGUgaW52YXJpYW50IHRoYXQKLSAgLy8gaWYgcmVwXyBpcyBOVUxMLCB0aGVuIGFyZW5hIGlzIE5VTEwuCi0gIFJlcCogcmVwXzsKLQotICBmcmllbmQgY2xhc3MgQXJlbmE7Ci0gIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87Ci0KLSAgLy8gTW92ZSB0aGUgY29udGVudHMgb2YgfGZyb218IGludG8gfHRvfCwgcG9zc2libHkgY2xvYmJlcmluZyB8ZnJvbXwgaW4gdGhlCi0gIC8vIHByb2Nlc3MuICBGb3IgcHJpbWl0aXZlIHR5cGVzIHRoaXMgaXMganVzdCBhIG1lbWNweSgpLCBidXQgaXQgY291bGQgYmUKLSAgLy8gc3BlY2lhbGl6ZWQgZm9yIG5vbi1wcmltaXRpdmUgdHlwZXMgdG8sIHNheSwgc3dhcCBlYWNoIGVsZW1lbnQgaW5zdGVhZC4KLSAgdm9pZCBNb3ZlQXJyYXkoRWxlbWVudCogdG8sIEVsZW1lbnQqIGZyb20sIGludCBzaXplKTsKLQotICAvLyBDb3B5IHRoZSBlbGVtZW50cyBvZiB8ZnJvbXwgaW50byB8dG98LgotICB2b2lkIENvcHlBcnJheShFbGVtZW50KiB0bywgY29uc3QgRWxlbWVudCogZnJvbSwgaW50IHNpemUpOwotCi0gIGlubGluZSB2b2lkIEludGVybmFsU3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcik7Ci0KLSAgLy8gSW50ZXJuYWwgaGVscGVyIGV4cGVjdGVkIGJ5IEFyZW5hIG1ldGhvZHMuCi0gIGlubGluZSBBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIChyZXBfID09IE5VTEwpID8gTlVMTCA6IHJlcF8tPmFyZW5hOwotICB9Ci0KLSAgLy8gSW50ZXJuYWwgaGVscGVyIHRvIGRlbGV0ZSBhbGwgZWxlbWVudHMgYW5kIGRlYWxsb2NhdGUgdGhlIHN0b3JhZ2UuCi0gIC8vIElmIEVsZW1lbnQgaGFzIGEgdHJpdmlhbCBkZXN0cnVjdG9yIChmb3IgZXhhbXBsZSwgaWYgaXQncyBhIGZ1bmRhbWVudGFsCi0gIC8vIHR5cGUsIGxpa2UgaW50MzIpLCB0aGUgbG9vcCB3aWxsIGJlIHJlbW92ZWQgYnkgdGhlIG9wdGltaXplci4KLSAgdm9pZCBJbnRlcm5hbERlYWxsb2NhdGUoUmVwKiByZXAsIGludCBzaXplKSB7Ci0gICAgaWYgKHJlcCAhPSBOVUxMKSB7Ci0gICAgICBFbGVtZW50KiBlID0gJnJlcC0+ZWxlbWVudHNbMF07Ci0gICAgICBFbGVtZW50KiBsaW1pdCA9ICZyZXAtPmVsZW1lbnRzW3NpemVdOwotICAgICAgZm9yICg7IGUgPCBsaW1pdDsgZSsrKSB7Ci0gICAgICAgIGUtPkVsZW1lbnQ6On5FbGVtZW50KCk7Ci0gICAgICB9Ci0gICAgICBpZiAocmVwLT5hcmVuYSA9PSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZVtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHJlcCk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19OwotCi10ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgotY29uc3Qgc2l6ZV90IFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmtSZXBIZWFkZXJTaXplID0KLSAgICByZWludGVycHJldF9jYXN0PHNpemVfdD4oJnJlaW50ZXJwcmV0X2Nhc3Q8UmVwKj4oMTYpLT5lbGVtZW50c1swXSkgLSAxNjsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLXRlbXBsYXRlIDx0eXBlbmFtZSBJdD4gY2xhc3MgUmVwZWF0ZWRQdHJJdGVyYXRvcjsKLXRlbXBsYXRlIDx0eXBlbmFtZSBJdCwgdHlwZW5hbWUgVm9pZFB0cj4gY2xhc3MgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yOwotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoaXMgaXMgYSBoZWxwZXIgdGVtcGxhdGUgdG8gY29weSBhbiBhcnJheSBvZiBlbGVtZW50cyBlZmZlY2llbnRseSB3aGVuIHRoZXkKLS8vIGhhdmUgYSB0cml2aWFsIGNvcHkgY29uc3RydWN0b3IsIGFuZCBjb3JyZWN0bHkgb3RoZXJ3aXNlLiBUaGlzIHJlYWxseQotLy8gc2hvdWxkbid0IGJlIG5lY2Vzc2FyeSwgYnV0IG91ciBjb21waWxlciBkb2Vzbid0IG9wdGltaXplIHN0ZDo6Y29weSB2ZXJ5Ci0vLyBlZmZlY3RpdmVseS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50LAotICAgICAgICAgIGJvb2wgSGFzVHJpdmlhbENvcHkgPSBoYXNfdHJpdmlhbF9jb3B5PEVsZW1lbnQ+Ojp2YWx1ZT4KLXN0cnVjdCBFbGVtZW50Q29waWVyIHsKLSAgdm9pZCBvcGVyYXRvcigpKEVsZW1lbnQqIHRvLCBjb25zdCBFbGVtZW50KiBmcm9tLCBpbnQgYXJyYXlfc2l6ZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gdHlwZS10cmFpdHMgaGVscGVyIGZvciBSZXBlYXRlZFB0ckZpZWxkQmFzZTogd2Ugb25seSB3YW50IHRvIGludm9rZQotLy8gYXJlbmEtcmVsYXRlZCAiY29weSBpZiBvbiBkaWZmZXJlbnQgYXJlbmEiIGJlaGF2aW9yIGlmIHRoZSBuZWNlc3NhcnkgbWV0aG9kcwotLy8gZXhpc3Qgb24gdGhlIGNvbnRhaW5lZCB0eXBlLiBJbiBwYXJ0aWN1bGFyLCB3ZSByZWx5IG9uIE1lcmdlRnJvbSgpIGV4aXN0aW5nCi0vLyBhcyBhIGdlbmVyYWwgcHJveHkgZm9yIHRoZSBmYWN0IHRoYXQgYSBjb3B5IHdpbGwgd29yaywgYW5kIHdlIGFsc28gcHJvdmlkZSBhCi0vLyBzcGVjaWZpYyBvdmVycmlkZSBmb3Igc3RyaW5nKi4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1zdHJ1Y3QgVHlwZUltcGxlbWVudHNNZXJnZUJlaGF2aW9yIHsKLSAgdHlwZWRlZiBjaGFyIEhhc01lcmdlOwotICB0eXBlZGVmIGxvbmcgSGFzTm9NZXJnZTsKLQotICAvLyBXZSBhY2NlcHQgZWl0aGVyIG9mOgotICAvLyAtIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFQmIG90aGVyKQotICAvLyAtIGJvb2wgTWVyZ2VGcm9tKGNvbnN0IFQmIG90aGVyKQotICAvLwotICAvLyBXZSBtYW5nbGUgdGhlc2UgbmFtZXMgYSBiaXQgdG8gYXZvaWQgY29tcGF0aWJpbGl0eSBpc3N1ZXMgaW4gJ3VuY2xlYW4nCi0gIC8vIGluY2x1ZGUgZW52aXJvbm1lbnRzIHRoYXQgbWF5IGhhdmUsIGUuZy4sICIjZGVmaW5lIHRlc3QgLi4uIiAoeWVzLCB0aGlzCi0gIC8vIGV4aXN0cykuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFJldFR5cGUsIFJldFR5cGUgKFU6OiopKGNvbnN0IFUmIGFyZyk+Ci0gICAgICBzdHJ1Y3QgQ2hlY2tUeXBlOwotICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdGF0aWMgSGFzTWVyZ2UgQ2hlY2soCi0gICAgICBDaGVja1R5cGU8VSwgdm9pZCwgJlU6Ok1lcmdlRnJvbT4qKTsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RhdGljIEhhc01lcmdlIENoZWNrKAotICAgICAgQ2hlY2tUeXBlPFUsIGJvb2wsICZVOjpNZXJnZUZyb20+Kik7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHN0YXRpYyBIYXNOb01lcmdlIENoZWNrKC4uLik7Ci0KLSAgLy8gUmVzb3ZsZXMgdG8gZWl0aGVyIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUgb3IgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmZhbHNlX3R5cGUuCi0gIHR5cGVkZWYgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmludGVncmFsX2NvbnN0YW50PGJvb2wsCi0gICAgICAgICAgICAgICAoc2l6ZW9mKENoZWNrPFQ+KDApKSA9PSBzaXplb2YoSGFzTWVyZ2UpKT4gdHlwZTsKLX07Ci0KLXRlbXBsYXRlPD4KLXN0cnVjdCBUeXBlSW1wbGVtZW50c01lcmdlQmVoYXZpb3I8IDo6c3RkOjpzdHJpbmcgPiB7Ci0gIHR5cGVkZWYgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSB0eXBlOwotfTsKLQotLy8gVGhpcyBpcyB0aGUgY29tbW9uIGJhc2UgY2xhc3MgZm9yIFJlcGVhdGVkUHRyRmllbGRzLiAgSXQgZGVhbHMgb25seSBpbiB2b2lkKgotLy8gcG9pbnRlcnMuICBVc2VycyBzaG91bGQgbm90IHVzZSB0aGlzIGludGVyZmFjZSBkaXJlY3RseS4KLS8vCi0vLyBUaGUgbWV0aG9kcyBvZiB0aGlzIGludGVyZmFjZSBjb3JyZXNwb25kIHRvIHRoZSBtZXRob2RzIG9mIFJlcGVhdGVkUHRyRmllbGQsCi0vLyBidXQgbWF5IGhhdmUgYSB0ZW1wbGF0ZSBhcmd1bWVudCBjYWxsZWQgVHlwZUhhbmRsZXIuICBJdHMgc2lnbmF0dXJlIGlzOgotLy8gICBjbGFzcyBUeXBlSGFuZGxlciB7Ci0vLyAgICBwdWJsaWM6Ci0vLyAgICAgdHlwZWRlZiBNeVR5cGUgVHlwZTsKLS8vICAgICBzdGF0aWMgVHlwZSogTmV3KCk7Ci0vLyAgICAgc3RhdGljIHZvaWQgRGVsZXRlKFR5cGUqKTsKLS8vICAgICBzdGF0aWMgdm9pZCBDbGVhcihUeXBlKik7Ci0vLyAgICAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgVHlwZSYgZnJvbSwgVHlwZSogdG8pOwotLy8KLS8vICAgICAvLyBPbmx5IG5lZWRzIHRvIGJlIGltcGxlbWVudGVkIGlmIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBpcyBjYWxsZWQuCi0vLyAgICAgc3RhdGljIGludCBTcGFjZVVzZWQoY29uc3QgVHlwZSYpOwotLy8gICB9OwotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFJlcGVhdGVkUHRyRmllbGRCYXNlIHsKLSBwcm90ZWN0ZWQ6Ci0gIC8vIFRoZSByZWZsZWN0aW9uIGltcGxlbWVudGF0aW9uIG5lZWRzIHRvIGNhbGwgcHJvdGVjdGVkIG1ldGhvZHMgZGlyZWN0bHksCi0gIC8vIHJlaW50ZXJwcmV0aW5nIHBvaW50ZXJzIGFzIGJlaW5nIHRvIE1lc3NhZ2UgaW5zdGVhZCBvZiBhIHNwZWNpZmljIE1lc3NhZ2UKLSAgLy8gc3ViY2xhc3MuCi0gIGZyaWVuZCBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKLQotICAvLyBFeHRlbnNpb25TZXQgc3RvcmVzIHJlcGVhdGVkIG1lc3NhZ2UgZXh0ZW5zaW9ucyBhcwotICAvLyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPiwgYnV0IG5vbi1saXRlIEV4dGVuc2lvblNldHMgbmVlZCB0bwotICAvLyBpbXBsZW1lbnQgU3BhY2VVc2VkKCksIGFuZCB0aHVzIG5lZWQgdG8gY2FsbCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkKLSAgLy8gcmVpbnRlcnByZXRpbmcgTWVzc2FnZUxpdGUgYXMgTWVzc2FnZS4gIEV4dGVuc2lvblNldCBhbHNvIG5lZWRzIHRvIG1ha2UKLSAgLy8gdXNlIG9mIEFkZEZyb21DbGVhcmVkKCksIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgotICBmcmllbmQgY2xhc3MgRXh0ZW5zaW9uU2V0OwotCi0gIC8vIFRoZSBNYXBGaWVsZEJhc2UgaW1wbGVtZW50YXRpb24gbmVlZHMgdG8gY2FsbCBwcm90ZWN0ZWQgbWV0aG9kcyBkaXJlY3RseSwKLSAgLy8gcmVpbnRlcnByZXRpbmcgcG9pbnRlcnMgYXMgYmVpbmcgdG8gTWVzc2FnZSBpbnN0ZWFkIG9mIGEgc3BlY2lmaWMgTWVzc2FnZQotICAvLyBzdWJjbGFzcy4KLSAgZnJpZW5kIGNsYXNzIE1hcEZpZWxkQmFzZTsKLQotICAvLyBUbyBwYXJzZSBkaXJlY3RseSBpbnRvIGEgcHJvdG8yIGdlbmVyYXRlZCBjbGFzcywgdGhlIHVwYiBjbGFzcyBHTVJfSGFuZGxlcnMKLSAgLy8gbmVlZHMgdG8gYmUgYWJsZSB0byBtb2RpZnkgYSBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkaXJlY3RseS4KLSAgZnJpZW5kIGNsYXNzIHVwYjo6Z29vZ2xlX29wZW5zb3VyY2U6OkdNUl9IYW5kbGVyczsKLQotICBSZXBlYXRlZFB0ckZpZWxkQmFzZSgpOwotICBleHBsaWNpdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7Ci0gIH5SZXBlYXRlZFB0ckZpZWxkQmFzZSgpIHt9Ci0KLSAgLy8gTXVzdCBiZSBjYWxsZWQgZnJvbSBkZXN0cnVjdG9yLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHZvaWQgRGVzdHJveSgpOwotCi0gIGJvb2wgZW1wdHkoKSBjb25zdDsKLSAgaW50IHNpemUoKSBjb25zdDsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlJiBHZXQoaW50IGluZGV4KSBjb25zdDsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogTXV0YWJsZShpbnQgaW5kZXgpOwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHZvaWQgRGVsZXRlKGludCBpbmRleCk7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLSAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIEFkZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcHJvdG90eXBlID0gTlVMTCk7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB2b2lkIFJlbW92ZUxhc3QoKTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB2b2lkIENsZWFyKCk7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIG90aGVyKTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB2b2lkIENvcHlGcm9tKGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlcik7Ci0KLSAgdm9pZCBDbG9zZUdhcChpbnQgc3RhcnQsIGludCBudW0pOwotCi0gIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOwotCi0gIGludCBDYXBhY2l0eSgpIGNvbnN0OwotCi0gIC8vIFVzZWQgZm9yIGNvbnN0cnVjdGluZyBpdGVyYXRvcnMuCi0gIHZvaWQqIGNvbnN0KiByYXdfZGF0YSgpIGNvbnN0OwotICB2b2lkKiogcmF3X211dGFibGVfZGF0YSgpIGNvbnN0OwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLSAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKiBtdXRhYmxlX2RhdGEoKTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICBjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogY29uc3QqIGRhdGEoKSBjb25zdDsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSB2b2lkIFN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKTsKLQotICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7Ci0KLQotICAvLyBBZHZhbmNlZCBtZW1vcnkgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8vIExpa2UgQWRkKCksIGJ1dCBpZiB0aGVyZSBhcmUgbm8gY2xlYXJlZCBvYmplY3RzIHRvIHVzZSwgcmV0dXJucyBOVUxMLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBBZGRGcm9tQ2xlYXJlZCgpOwotCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB2b2lkIEFkZEFsbG9jYXRlZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpIHsKLSAgICB0eXBlbmFtZSBUeXBlSW1wbGVtZW50c01lcmdlQmVoYXZpb3I8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGU+Ojp0eXBlIHQ7Ci0gICAgQWRkQWxsb2NhdGVkSW50ZXJuYWw8VHlwZUhhbmRsZXI+KHZhbHVlLCB0KTsKLSAgfQotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLSAgdm9pZCBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLSAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlbGVhc2VMYXN0KCkgewotICAgIHR5cGVuYW1lIFR5cGVJbXBsZW1lbnRzTWVyZ2VCZWhhdmlvcjx0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZT46OnR5cGUgdDsKLSAgICByZXR1cm4gUmVsZWFzZUxhc3RJbnRlcm5hbDxUeXBlSGFuZGxlcj4odCk7Ci0gIH0KLQotICAvLyBSZWxlYXNlcyBsYXN0IGVsZW1lbnQgYW5kIHJldHVybnMgaXQsIGJ1dCBkb2VzIG5vdCBkbyBvdXQtb2YtYXJlbmEgY29weS4KLSAgLy8gQW5kIGp1c3QgcmV0dXJucyB0aGUgcmF3IHBvaW50ZXIgdG8gdGhlIGNvbnRhaW5lZCBlbGVtZW50IGluIHRoZSBhcmVuYS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogVW5zYWZlQXJlbmFSZWxlYXNlTGFzdCgpOwotCi0gIGludCBDbGVhcmVkQ291bnQoKSBjb25zdDsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB2b2lkIEFkZENsZWFyZWQodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogUmVsZWFzZUNsZWFyZWQoKTsKLQotIHByb3RlY3RlZDoKLSAgaW5saW5lIHZvaWQgSW50ZXJuYWxTd2FwKFJlcGVhdGVkUHRyRmllbGRCYXNlKiBvdGhlcik7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB2b2lkIEFkZEFsbG9jYXRlZEludGVybmFsKHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlKTsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB2b2lkIEFkZEFsbG9jYXRlZEludGVybmFsKHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZmFsc2VfdHlwZSk7Ci0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPiBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCi0gIHZvaWQgQWRkQWxsb2NhdGVkU2xvd1dpdGhDb3B5KHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJlbmEqIHZhbHVlX2FyZW5hLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogbXlfYXJlbmEpOwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+IEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKLSAgdm9pZCBBZGRBbGxvY2F0ZWRTbG93V2l0aG91dENvcHkodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKTsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZWxlYXNlTGFzdEludGVybmFsKGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUpOwotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZWxlYXNlTGFzdEludGVybmFsKGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlKTsKLQotICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlSGFuZGxlcj4gR09PR0xFX0FUVFJJQlVURV9OT0lOTElORQotICB2b2lkIFN3YXBGYWxsYmFjayhSZXBlYXRlZFB0ckZpZWxkQmFzZSogb3RoZXIpOwotCi0gIGlubGluZSBBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGFyZW5hXzsKLSAgfQotCi0gcHJpdmF0ZToKLSAgc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbFNpemUgPSAwOwotICAvLyBBIGZldyBub3RlcyBvbiBpbnRlcm5hbCByZXByZXNlbnRhdGlvbjoKLSAgLy8KLSAgLy8gV2UgdXNlIGFuIGluZGlyZWN0ZWQgYXBwcm9hY2gsIHdpdGggc3RydWN0IFJlcCwgdG8ga2VlcAotICAvLyBzaXplb2YoUmVwZWF0ZWRQdHJGaWVsZEJhc2UpIGVxdWl2YWxlbnQgdG8gd2hhdCBpdCB3YXMgYmVmb3JlIGFyZW5hIHN1cHBvcnQKLSAgLy8gd2FzIGFkZGVkLCBuYW1lbHksIDMgOC1ieXRlIG1hY2hpbmUgd29yZHMgb24geDg2LTY0LiBBbiBpbnN0YW5jZSBvZiBSZXAgaXMKLSAgLy8gYWxsb2NhdGVkIG9ubHkgd2hlbiB0aGUgcmVwZWF0ZWQgZmllbGQgaXMgbm9uLWVtcHR5LCBhbmQgaXQgaXMgYQotICAvLyBkeW5hbWljYWxseS1zaXplZCBzdHJ1Y3QgKHRoZSBoZWFkZXIgaXMgZGlyZWN0bHkgZm9sbG93ZWQgYnkgZWxlbWVudHNbXSkuCi0gIC8vIFdlIHBsYWNlIGFyZW5hXyBhbmQgY3VycmVudF9zaXplXyBkaXJlY3RseSBpbiB0aGUgb2JqZWN0IHRvIGF2b2lkIGNhY2hlCi0gIC8vIG1pc3NlcyBkdWUgdG8gdGhlIGluZGlyZWN0aW9uLCBiZWNhdXNlIHRoZXNlIGZpZWxkcyBhcmUgY2hlY2tlZCBmcmVxdWVudGx5LgotICAvLyBQbGFjaW5nIGFsbCBmaWVsZHMgZGlyZWN0bHkgaW4gdGhlIFJlcGVhdGVkUHRyRmllbGRCYXNlIGluc3RhbmNlIGNvc3RzCi0gIC8vIHNpZ25pZmljYW50IHBlcmZvcm1hbmNlIGZvciBtZW1vcnktc2Vuc2l0aXZlIHdvcmtsb2Fkcy4KLSAgQXJlbmEqIGFyZW5hXzsKLSAgaW50ICAgIGN1cnJlbnRfc2l6ZV87Ci0gIGludCAgICB0b3RhbF9zaXplXzsKLSAgc3RydWN0IFJlcCB7Ci0gICAgaW50ICAgIGFsbG9jYXRlZF9zaXplOwotICAgIHZvaWQqICBlbGVtZW50c1sxXTsKLSAgfTsKLSAgc3RhdGljIGNvbnN0IHNpemVfdCBrUmVwSGVhZGVyU2l6ZSA9IHNpemVvZihSZXApIC0gc2l6ZW9mKHZvaWQqKTsKLSAgLy8gQ29udGFpbnMgYXJlbmEgcHRyIGFuZCB0aGUgZWxlbWVudHMgYXJyYXkuIFdlIGFsc28ga2VlcCB0aGUgaW52YXJpYW50IHRoYXQKLSAgLy8gaWYgcmVwXyBpcyBOVUxMLCB0aGVuIGFyZW5hIGlzIE5VTEwuCi0gIFJlcCogcmVwXzsKLQotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHN0YXRpYyBpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNhc3Qodm9pZCogZWxlbWVudCkgewotICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4oZWxlbWVudCk7Ci0gIH0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICBzdGF0aWMgaW5saW5lIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjYXN0KGNvbnN0IHZvaWQqIGVsZW1lbnQpIHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSo+KGVsZW1lbnQpOwotICB9Ci0KLSAgLy8gTm9uLXRlbXBsYXRlZCBpbm5lciBmdW5jdGlvbiB0byBhdm9pZCBjb2RlIGR1cGxpY2F0aW9uLiBUYWtlcyBhIGZ1bmN0aW9uCi0gIC8vIHBvaW50ZXIgdG8gdGhlIHR5cGUtc3BlY2lmaWMgKHRlbXBsYXRlZCkgaW5uZXIgYWxsb2NhdGUvbWVyZ2UgbG9vcC4KLSAgdm9pZCBNZXJnZUZyb21JbnRlcm5hbCgKLSAgICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlciwKLSAgICAgIHZvaWQgKFJlcGVhdGVkUHRyRmllbGRCYXNlOjoqaW5uZXJfbG9vcCkodm9pZCoqLCB2b2lkKiosIGludCwgaW50KSk7Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHZvaWQgTWVyZ2VGcm9tSW5uZXJMb29wKAotICAgICAgdm9pZCoqIG91cl9lbGVtcywgdm9pZCoqIG90aGVyX2VsZW1zLCBpbnQgbGVuZ3RoLCBpbnQgYWxyZWFkeV9hbGxvY2F0ZWQpOwotCi0gIC8vIEludGVybmFsIGhlbHBlcjogZXh0ZW5kIGFycmF5IHNwYWNlIGlmIG5lY2Vzc2FyeSB0byBjb250YWluIHxleHRlbmRfYW1vdW50fAotICAvLyBtb3JlIGVsZW1lbnRzLCBhbmQgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcKLSAgLy8gdGhlIG9sZCBsaXN0IG9mIGVsZW1lbnRzLiAgVGhpcyBpbnRlcmZhY2UgZmFjdG9ycyBvdXQgY29tbW9uIGJlaGF2aW9yIGZyb20KLSAgLy8gUmVzZXJ2ZSgpIGFuZCBNZXJnZUZyb20oKSB0byByZWR1Y2UgY29kZSBzaXplLiB8ZXh0ZW5kX2Ftb3VudHwgbXVzdCBiZSA+IDAuCi0gIHZvaWQqKiBJbnRlcm5hbEV4dGVuZChpbnQgZXh0ZW5kX2Ftb3VudCk7Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkUHRyRmllbGRCYXNlKTsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmljVHlwZT4KLWNsYXNzIEdlbmVyaWNUeXBlSGFuZGxlciB7Ci0gcHVibGljOgotICB0eXBlZGVmIEdlbmVyaWNUeXBlIFR5cGU7Ci0gIHN0YXRpYyBpbmxpbmUgR2VuZXJpY1R5cGUqIE5ldyhBcmVuYSogYXJlbmEpIHsKLSAgICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPFR5cGU+KAotICAgICAgICBhcmVuYSwgc3RhdGljX2Nhc3Q8R2VuZXJpY1R5cGUqPigwKSk7Ci0gIH0KLSAgLy8gV2UgZm9yY2UgTmV3RnJvbVByb3RvdHlwZSgpIGFuZCBEZWxldGUoKSB0byBiZSBub24taW5saW5lIHRvIHJlZHVjZSBjb2RlCi0gIC8vIHNpemU6IGVsc2UsIHNldmVyYWwgb3RoZXIgbWV0aG9kcyBnZXQgaW5saW5lZCBjb3BpZXMgb2YgbWVzc2FnZSB0eXBlcycKLSAgLy8gY29uc3RydWN0b3JzIGFuZCBkZXN0cnVjdG9ycy4KLSAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSBzdGF0aWMgR2VuZXJpY1R5cGUqIE5ld0Zyb21Qcm90b3R5cGUoCi0gICAgICBjb25zdCBHZW5lcmljVHlwZSogcHJvdG90eXBlLCA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSA9IE5VTEwpOwotICBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHN0YXRpYyB2b2lkIERlbGV0ZShHZW5lcmljVHlwZSogdmFsdWUsIEFyZW5hKiBhcmVuYSk7Ci0gIHN0YXRpYyBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmEoR2VuZXJpY1R5cGUqIHZhbHVlKSB7Ci0gICAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkdldEFyZW5hPFR5cGU+KHZhbHVlKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIHZvaWQqIEdldE1heWJlQXJlbmFQb2ludGVyKEdlbmVyaWNUeXBlKiB2YWx1ZSkgewotICAgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpHZXRBcmVuYTxUeXBlPih2YWx1ZSk7Ci0gIH0KLQotICBzdGF0aWMgaW5saW5lIHZvaWQgQ2xlYXIoR2VuZXJpY1R5cGUqIHZhbHVlKSB7IHZhbHVlLT5DbGVhcigpOyB9Ci0gIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgR2VuZXJpY1R5cGUmIGZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVHlwZSogdG8pOwotICBzdGF0aWMgaW5saW5lIGludCBTcGFjZVVzZWQoY29uc3QgR2VuZXJpY1R5cGUmIHZhbHVlKSB7Ci0gICAgcmV0dXJuIHZhbHVlLlNwYWNlVXNlZCgpOwotICB9Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgVHlwZSYgZGVmYXVsdF9pbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJpY1R5cGU+Ci1HZW5lcmljVHlwZSogR2VuZXJpY1R5cGVIYW5kbGVyPEdlbmVyaWNUeXBlPjo6TmV3RnJvbVByb3RvdHlwZSgKLSAgICBjb25zdCBHZW5lcmljVHlwZSogLyogcHJvdG90eXBlICovLCA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgewotICByZXR1cm4gTmV3KGFyZW5hKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmljVHlwZT4KLXZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPEdlbmVyaWNUeXBlPjo6RGVsZXRlKEdlbmVyaWNUeXBlKiB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7Ci0gIGlmIChhcmVuYSA9PSBOVUxMKSB7Ci0gICAgZGVsZXRlIHZhbHVlOwotICB9Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJpY1R5cGU+Ci12b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxHZW5lcmljVHlwZT46Ok1lcmdlKGNvbnN0IEdlbmVyaWNUeXBlJiBmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVHlwZSogdG8pIHsKLSAgdG8tPk1lcmdlRnJvbShmcm9tKTsKLX0KLQotLy8gTmV3RnJvbVByb3RvdHlwZSgpIGFuZCBNZXJnZSgpIGNhbm5vdCBiZSBkZWZpbmVkIGhlcmU7IGlmIHRoZXkncmUgZGVjbGFyZWQKLS8vIGlubGluZSB0aGUgY29tcGlsZXIgd2lsbCBjb21wbGFpbiBhYm91dCBub3QgbWF0Y2hpbmcgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORQotLy8gYWJvdmUsIGFuZCBpZiBub3QsIGNvbXBpbGF0aW9uIHdpbGwgcmVzdWx0IGluIG11bHRpcGxlIGRlZmluaXRpb25zLiAgVGhlc2UKLS8vIGFyZSB0aGVyZWZvcmUgZGVjbGFyZWQgYXMgc3BlY2lhbGl6YXRpb25zIGhlcmUgYW5kIGRlZmluZWQgaW4KLS8vIG1lc3NhZ2VfbGl0ZS5jYy4KLXRlbXBsYXRlPD4KLU1lc3NhZ2VMaXRlKiBHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+OjpOZXdGcm9tUHJvdG90eXBlKAotICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsIGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7Ci10ZW1wbGF0ZTw+Ci1pbmxpbmUgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46OkdldEFyZW5hKAotICAgIE1lc3NhZ2VMaXRlKiB2YWx1ZSkgewotICByZXR1cm4gdmFsdWUtPkdldEFyZW5hKCk7Ci19Ci10ZW1wbGF0ZTw+Ci1pbmxpbmUgdm9pZCogR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6R2V0TWF5YmVBcmVuYVBvaW50ZXIoCi0gICAgTWVzc2FnZUxpdGUqIHZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZS0+R2V0TWF5YmVBcmVuYVBvaW50ZXIoKTsKLX0KLXRlbXBsYXRlIDw+Ci12b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46Ok1lcmdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBmcm9tLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogdG8pOwotdGVtcGxhdGU8PgotaW5saW5lIHZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPHN0cmluZz46OkNsZWFyKHN0cmluZyogdmFsdWUpIHsKLSAgdmFsdWUtPmNsZWFyKCk7Ci19Ci10ZW1wbGF0ZTw+Ci12b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxzdHJpbmc+OjpNZXJnZShjb25zdCBzdHJpbmcmIGZyb20sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHRvKTsKLQotLy8gRGVjbGFyYXRpb25zIG9mIHRoZSBzcGVjaWFsaXphdGlvbiBhcyB3ZSBjYW5ub3QgZGVmaW5lIHRoZW0gaGVyZSwgYXMgdGhlCi0vLyBoZWFkZXIgdGhhdCBkZWZpbmVzIFByb3RvY29sTWVzc2FnZSBkZXBlbmRzIG9uIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBoZWFkZXIuCi0jZGVmaW5lIERFQ0xBUkVfU1BFQ0lBTElaQVRJT05TX0ZPUl9CQVNFX1BST1RPX1RZUEVTKFR5cGVOYW1lKSAgICAgICAgICAgICAgICAgXAotICAgIHRlbXBsYXRlPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBUeXBlTmFtZSogR2VuZXJpY1R5cGVIYW5kbGVyPFR5cGVOYW1lPjo6TmV3RnJvbVByb3RvdHlwZSggICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNvbnN0IFR5cGVOYW1lKiBwcm90b3R5cGUsIGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB0ZW1wbGF0ZTw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdlbmVyaWNUeXBlSGFuZGxlcjxUeXBlTmFtZT46OkdldEFyZW5hKCAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVHlwZU5hbWUqIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHZvaWQqIEdlbmVyaWNUeXBlSGFuZGxlcjxUeXBlTmFtZT46OkdldE1heWJlQXJlbmFQb2ludGVyKCAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgVHlwZU5hbWUqIHZhbHVlKTsKLQotLy8gTWVzc2FnZSBzcGVjaWFsaXphdGlvbiBib2RpZXMgZGVmaW5lZCBpbiBtZXNzYWdlLmNjLiBUaGlzIHNwbGl0IGlzIG5lY2Vzc2FyeQotLy8gdG8gYWxsb3cgcHJvdG8yLWxpdGUgKHdoaWNoIGluY2x1ZGVzIHRoaXMgaGVhZGVyKSB0byBiZSBpbmRlcGVuZGVudCBvZgotLy8gTWVzc2FnZS4KLURFQ0xBUkVfU1BFQ0lBTElaQVRJT05TX0ZPUl9CQVNFX1BST1RPX1RZUEVTKE1lc3NhZ2UpCi0KLQotI3VuZGVmIERFQ0xBUkVfU1BFQ0lBTElaQVRJT05TX0ZPUl9CQVNFX1BST1RPX1RZUEVTCi0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgY29uc3QgTWVzc2FnZUxpdGUmIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIC8vIFllcywgdGhlIGJlaGF2aW9yIG9mIHRoZSBjb2RlIGlzIHVuZGVmaW5lZCwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgb25seQotICAvLyBjYWxsZWQgd2hlbiB3ZSdyZSBhbHJlYWR5IGRlZXAgaW50byB0aGUgd29ybGQgb2YgdW5kZWZpbmVkLCBiZWNhdXNlIHRoZQotICAvLyBjYWxsZXIgY2FsbGVkIEdldChpbmRleCkgb3V0IG9mIGJvdW5kcy4KLSAgTWVzc2FnZUxpdGUqIG51bGwgPSBOVUxMOwotICByZXR1cm4gKm51bGw7Ci19Ci0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgY29uc3QgTWVzc2FnZSYgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+OjpkZWZhdWx0X2luc3RhbmNlKCkgewotICAvLyBZZXMsIHRoZSBiZWhhdmlvciBvZiB0aGUgY29kZSBpcyB1bmRlZmluZWQsIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkKLSAgLy8gY2FsbGVkIHdoZW4gd2UncmUgYWxyZWFkeSBkZWVwIGludG8gdGhlIHdvcmxkIG9mIHVuZGVmaW5lZCwgYmVjYXVzZSB0aGUKLSAgLy8gY2FsbGVyIGNhbGxlZCBHZXQoaW5kZXgpIG91dCBvZiBib3VuZHMuCi0gIE1lc3NhZ2UqIG51bGwgPSBOVUxMOwotICByZXR1cm4gKm51bGw7Ci19Ci0KLQotLy8gSEFDSzogIElmIGEgY2xhc3MgaXMgZGVjbGFyZWQgYXMgRExMLWV4cG9ydGVkIGluIE1TVkMsIGl0IGluc2lzdHMgb24KLS8vICAgZ2VuZXJhdGluZyBjb3BpZXMgb2YgYWxsIGl0cyBtZXRob2RzIC0tIGV2ZW4gaW5saW5lIG9uZXMgLS0gdG8gaW5jbHVkZQotLy8gICBpbiB0aGUgRExMLiAgQnV0IFNwYWNlVXNlZCgpIGNhbGxzIFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSB3aGljaAotLy8gICBpc24ndCBpbiB0aGUgbGl0ZSBsaWJyYXJ5LCB0aGVyZWZvcmUgdGhlIGxpdGUgbGlicmFyeSBjYW5ub3QgbGluayBpZgotLy8gICBTdHJpbmdUeXBlSGFuZGxlciBpcyBleHBvcnRlZC4gIFNvLCB3ZSBmYWN0b3Igb3V0IFN0cmluZ1R5cGVIYW5kbGVyQmFzZSwKLS8vICAgZXhwb3J0IHRoYXQsIHRoZW4gbWFrZSBTdHJpbmdUeXBlSGFuZGxlciBiZSBhIHN1YmNsYXNzIHdoaWNoIGlzIE5PVAotLy8gICBleHBvcnRlZC4KLS8vIFRPRE8oa2VudG9uKTogIE5vdyB0aGF0IFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBpcyBpbiB0aGUgbGl0ZQotLy8gICBsaWJyYXJ5LCB0aGlzIGNhbiBiZSBjbGVhbmVkIHVwLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFN0cmluZ1R5cGVIYW5kbGVyQmFzZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHN0cmluZyBUeXBlOwotCi0gIHN0YXRpYyBpbmxpbmUgc3RyaW5nKiBOZXcoQXJlbmEqIGFyZW5hKSB7Ci0gICAgcmV0dXJuIEFyZW5hOjpDcmVhdGU8c3RyaW5nPihhcmVuYSk7Ci0gIH0KLSAgc3RhdGljIGlubGluZSBzdHJpbmcqIE5ld0Zyb21Qcm90b3R5cGUoY29uc3Qgc3RyaW5nKiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIHsKLSAgICByZXR1cm4gTmV3KGFyZW5hKTsKLSAgfQotICBzdGF0aWMgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hKHN0cmluZyopIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBzdGF0aWMgaW5saW5lIHZvaWQqIEdldE1heWJlQXJlbmFQb2ludGVyKHN0cmluZyogLyogdmFsdWUgKi8pIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBzdGF0aWMgaW5saW5lIHZvaWQgRGVsZXRlKHN0cmluZyogdmFsdWUsIEFyZW5hKiBhcmVuYSkgewotICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7Ci0gICAgICBkZWxldGUgdmFsdWU7Ci0gICAgfQotICB9Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBDbGVhcihzdHJpbmcqIHZhbHVlKSB7IHZhbHVlLT5jbGVhcigpOyB9Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBNZXJnZShjb25zdCBzdHJpbmcmIGZyb20sIHN0cmluZyogdG8pIHsgKnRvID0gZnJvbTsgfQotICBzdGF0aWMgaW5saW5lIGNvbnN0IFR5cGUmIGRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gICAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7Ci0gIH0KLX07Ci0KLWNsYXNzIFN0cmluZ1R5cGVIYW5kbGVyIDogcHVibGljIFN0cmluZ1R5cGVIYW5kbGVyQmFzZSB7Ci0gcHVibGljOgotICBzdGF0aWMgaW50IFNwYWNlVXNlZChjb25zdCBzdHJpbmcmIHZhbHVlKSAgewotICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZih2YWx1ZSkpICsgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZih2YWx1ZSk7Ci0gIH0KLX07Ci0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFJlcGVhdGVkUHRyRmllbGQgaXMgbGlrZSBSZXBlYXRlZEZpZWxkLCBidXQgdXNlZCBmb3IgcmVwZWF0ZWQgc3RyaW5ncyBvcgotLy8gTWVzc2FnZXMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWNsYXNzIFJlcGVhdGVkUHRyRmllbGQgOiBwdWJsaWMgaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYXNlIHsKLSBwdWJsaWM6Ci0gIFJlcGVhdGVkUHRyRmllbGQoKTsKLSAgZXhwbGljaXQgUmVwZWF0ZWRQdHJGaWVsZCg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7Ci0KLSAgUmVwZWF0ZWRQdHJGaWVsZChjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotICBSZXBlYXRlZFB0ckZpZWxkKEl0ZXIgYmVnaW4sIGNvbnN0IEl0ZXImIGVuZCk7Ci0gIH5SZXBlYXRlZFB0ckZpZWxkKCk7Ci0KLSAgUmVwZWF0ZWRQdHJGaWVsZCYgb3BlcmF0b3I9KGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKTsKLQotICBib29sIGVtcHR5KCkgY29uc3Q7Ci0gIGludCBzaXplKCkgY29uc3Q7Ci0KLSAgY29uc3QgRWxlbWVudCYgR2V0KGludCBpbmRleCkgY29uc3Q7Ci0gIEVsZW1lbnQqIE11dGFibGUoaW50IGluZGV4KTsKLSAgRWxlbWVudCogQWRkKCk7Ci0KLSAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgotICAvLyBPd25lcnNoaXAgb2YgdGhlIGVsZW1lbnQgaXMgcmV0YWluZWQgYnkgdGhlIGFycmF5LgotICB2b2lkIFJlbW92ZUxhc3QoKTsKLQotICAvLyBEZWxldGUgZWxlbWVudHMgd2l0aCBpbmRpY2VzIGluIHRoZSByYW5nZSBbc3RhcnQgLi4gc3RhcnQrbnVtLTFdLgotICAvLyBDYXV0aW9uOiBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBhbGwgZWxlbWVudHMgd2l0aCBpbmRpY2VzIFtzdGFydCtudW0gLi4gXS4KLSAgLy8gQ2FsbGluZyB0aGlzIHJvdXRpbmUgaW5zaWRlIGEgbG9vcCBjYW4gY2F1c2UgcXVhZHJhdGljIGJlaGF2aW9yLgotICB2b2lkIERlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSk7Ci0KLSAgdm9pZCBDbGVhcigpOwotICB2b2lkIE1lcmdlRnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpOwotCi0gIC8vIFJlc2VydmUgc3BhY2UgdG8gZXhwYW5kIHRoZSBmaWVsZCB0byBhdCBsZWFzdCB0aGUgZ2l2ZW4gc2l6ZS4gIFRoaXMgb25seQotICAvLyByZXNpemVzIHRoZSBwb2ludGVyIGFycmF5OyBpdCBkb2Vzbid0IGFsbG9jYXRlIGFueSBvYmplY3RzLiAgSWYgdGhlCi0gIC8vIGFycmF5IGlzIGdyb3duLCBpdCB3aWxsIGFsd2F5cyBiZSBhdCBsZWFzdCBkb3VibGVkIGluIHNpemUuCi0gIHZvaWQgUmVzZXJ2ZShpbnQgbmV3X3NpemUpOwotCi0gIGludCBDYXBhY2l0eSgpIGNvbnN0OwotCi0gIC8vIEdldHMgdGhlIHVuZGVybHlpbmcgYXJyYXkuICBUaGlzIHBvaW50ZXIgaXMgcG9zc2libHkgaW52YWxpZGF0ZWQgYnkKLSAgLy8gYW55IGFkZCBvciByZW1vdmUgb3BlcmF0aW9uLgotICBFbGVtZW50KiogbXV0YWJsZV9kYXRhKCk7Ci0gIGNvbnN0IEVsZW1lbnQqIGNvbnN0KiBkYXRhKCkgY29uc3Q7Ci0KLSAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLiBJZiB0aGV5IGFyZSBvbiBzZXBhcmF0ZSBhcmVuYXMsIHRoZW4KLSAgLy8gY29waWVzIGRhdGEuCi0gIHZvaWQgU3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcik7Ci0KLSAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLiBDYWxsZXIgc2hvdWxkIGd1YXJhbnRlZSB0aGF0IGVpdGhlciBib3RoCi0gIC8vIGZpZWxkcyBhcmUgb24gdGhlIHNhbWUgYXJlbmEgb3IgYm90aCBhcmUgb24gdGhlIGhlYXAuIFN3YXBwaW5nIGJldHdlZW4KLSAgLy8gZGlmZmVyZW50IGFyZW5hcyB3aXRoIHRoaXMgZnVuY3Rpb24gaXMgZGlzYWxsb3dlZCBhbmQgaXMgY2F1Z2h0IHZpYQotICAvLyBHT09HTEVfRENIRUNLLgotICB2b2lkIFVuc2FmZUFyZW5hU3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcik7Ci0KLSAgLy8gU3dhcCB0d28gZWxlbWVudHMuCi0gIHZvaWQgU3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpOwotCi0gIC8vIFNUTC1saWtlIGl0ZXJhdG9yIHN1cHBvcnQKLSAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJJdGVyYXRvcjxFbGVtZW50PiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJJdGVyYXRvcjxjb25zdCBFbGVtZW50PiBjb25zdF9pdGVyYXRvcjsKLSAgdHlwZWRlZiBFbGVtZW50IHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKLSAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOwotICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7Ci0gIHR5cGVkZWYgaW50IHNpemVfdHlwZTsKLSAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwotCi0gIGl0ZXJhdG9yIGJlZ2luKCk7Ci0gIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7Ci0gIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0OwotICBpdGVyYXRvciBlbmQoKTsKLSAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7Ci0gIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdDsKLQotICAvLyBSZXZlcnNlIGl0ZXJhdG9yIHN1cHBvcnQKLSAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7Ci0gIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOwotICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsKLSAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7Ci0gIH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOwotICB9Ci0gIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsKLSAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKLSAgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7Ci0gIH0KLQotICAvLyBDdXN0b20gU1RMLWxpa2UgaXRlcmF0b3IgdGhhdCBpdGVyYXRlcyBvdmVyIGFuZCByZXR1cm5zIHRoZSB1bmRlcmx5aW5nCi0gIC8vIHBvaW50ZXJzIHRvIEVsZW1lbnQgcmF0aGVyIHRoYW4gRWxlbWVudCBpdHNlbGYuCi0gIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxFbGVtZW50LCB2b2lkKj4KLSAgcG9pbnRlcl9pdGVyYXRvcjsKLSAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yPGNvbnN0IEVsZW1lbnQsIGNvbnN0IHZvaWQqPgotICBjb25zdF9wb2ludGVyX2l0ZXJhdG9yOwotICBwb2ludGVyX2l0ZXJhdG9yIHBvaW50ZXJfYmVnaW4oKTsKLSAgY29uc3RfcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2JlZ2luKCkgY29uc3Q7Ci0gIHBvaW50ZXJfaXRlcmF0b3IgcG9pbnRlcl9lbmQoKTsKLSAgY29uc3RfcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2VuZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgKGFuIGVzdGltYXRlIG9mKSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgdGhlIHJlcGVhdGVkIGZpZWxkLAotICAvLyBleGNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4KLSAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdDsKLQotICAvLyBBZHZhbmNlZCBtZW1vcnkgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBXaGVuIGhhcmRjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGJlY29tZXMgbmVjZXNzYXJ5IC0tIGFzIGl0IHNvbWV0aW1lcwotICAvLyBkb2VzIGhlcmUgYXQgR29vZ2xlIC0tIHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBtYXkgYmUgdXNlZnVsLgotCi0gIC8vIEFkZCBhbiBhbHJlYWR5LWFsbG9jYXRlZCBvYmplY3QsIHBhc3Npbmcgb3duZXJzaGlwIHRvIHRoZQotICAvLyBSZXBlYXRlZFB0ckZpZWxkLgotICAvLwotICAvLyBOb3RlIHRoYXQgc29tZSBzcGVjaWFsIGJlaGF2aW9yIG9jY3VycyB3aXRoIHJlc3BlY3QgdG8gYXJlbmFzOgotICAvLwotICAvLyAgIChpKSBpZiB0aGlzIGZpZWxkIGhvbGRzIHN1Ym1lc3NhZ2VzLCB0aGUgbmV3IHN1Ym1lc3NhZ2Ugd2lsbCBiZSBjb3BpZWQgaWYKLSAgLy8gICB0aGUgb3JpZ2luYWwgaXMgaW4gYW4gYXJlbmEgYW5kIHRoaXMgUmVwZWF0ZWRQdHJGaWVsZCBpcyBlaXRoZXIgaW4gYQotICAvLyAgIGRpZmZlcmVudCBhcmVuYSwgb3Igb24gdGhlIGhlYXAuCi0gIC8vICAgKGlpKSBpZiB0aGlzIGZpZWxkIGhvbGRzIHN0cmluZ3MsIHRoZSBwYXNzZWQtaW4gc3RyaW5nICptdXN0KiBiZQotICAvLyAgIGhlYXAtYWxsb2NhdGVkLCBub3QgYXJlbmEtYWxsb2NhdGVkLiBUaGVyZSBpcyBubyB3YXkgdG8gZHluYW1pY2FsbHkgY2hlY2sKLSAgLy8gICB0aGlzIGF0IHJ1bnRpbWUsIHNvIFVzZXIgQmV3YXJlLgotICB2b2lkIEFkZEFsbG9jYXRlZChFbGVtZW50KiB2YWx1ZSk7Ci0KLSAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgYW5kIHJldHVybiBpdCwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlci4KLSAgLy8gUmVxdWlyZXM6ICBzaXplKCkgPiAwCi0gIC8vCi0gIC8vIElmIHRoaXMgUmVwZWF0ZWRQdHJGaWVsZCBpcyBvbiBhbiBhcmVuYSwgYW4gb2JqZWN0IGNvcHkgaXMgcmVxdWlyZWQgdG8gcGFzcwotICAvLyBvd25lcnNoaXAgYmFjayB0byB0aGUgdXNlciAoZm9yIGNvbXBhdGlibGUgc2VtYW50aWNzKS4gVXNlCi0gIC8vIFVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKSBpZiB0aGlzIGJlaGF2aW9yIGlzIHVuZGVzaXJlZC4KLSAgRWxlbWVudCogUmVsZWFzZUxhc3QoKTsKLQotICAvLyBBZGQgYW4gYWxyZWFkeS1hbGxvY2F0ZWQgb2JqZWN0LCBza2lwcGluZyBhcmVuYS1vd25lcnNoaXAgY2hlY2tzLiBUaGUgdXNlcgotICAvLyBtdXN0IGd1YXJhbnRlZSB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgaW4gdGhlIHNhbWUgYXJlbmEgYXMgdGhpcwotICAvLyBSZXBlYXRlZFB0ckZpZWxkLgotICAvLyBJdCBpcyBhbHNvIHVzZWZ1bCBpbiBsZWdhY3kgY29kZSB0aGF0IHVzZXMgdGVtcG9yYXJ5IG93bmVyc2hpcCB0byBhdm9pZAotICAvLyBjb3BpZXMuIEV4YW1wbGU6Ci0gIC8vIFJlcGVhdGVkUHRyRmllbGQ8VD4gdGVtcF9maWVsZDsKLSAgLy8gdGVtcF9maWVsZC5BZGRBbGxvY2F0ZWQobmV3IFQpOwotICAvLyAuLi4gLy8gRG8gc29tZXRoaW5nIHdpdGggdGVtcF9maWVsZAotICAvLyB0ZW1wX2ZpZWxkLkV4dHJhY3RTdWJyYW5nZSgwLCB0ZW1wX2ZpZWxkLnNpemUoKSwgTlVMTCk7Ci0gIC8vIElmIHlvdSBwdXQgdGVtcF9maWVsZCBvbiB0aGUgYXJlbmEgdGhpcyBmYWlscywgYmVjYXVzZSB0aGUgb3duZXJzaGlwCi0gIC8vIHRyYW5zZmVycyB0byB0aGUgYXJlbmEgYXQgdGhlICJBZGRBbGxvY2F0ZWQiIGNhbGwgYW5kIGlzIG5vdCByZWxlYXNlZAotICAvLyBhbnltb3JlIGNhdXNpbmcgYSBkb3VibGUgZGVsZXRlLiBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCBwcmV2ZW50cyB0aGlzLgotICB2b2lkIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkKEVsZW1lbnQqIHZhbHVlKTsKLQotICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBhbmQgcmV0dXJuIGl0LiAgV29ya3Mgb25seSB3aGVuIG9wZXJhdGluZyBvbiBhbgotICAvLyBhcmVuYS4gVGhlIHJldHVybmVkIHBvaW50ZXIgaXMgdG8gdGhlIG9yaWdpbmFsIG9iamVjdCBpbiB0aGUgYXJlbmEsIGhlbmNlCi0gIC8vIGhhcyB0aGUgYXJlbmEncyBsaWZldGltZS4KLSAgLy8gUmVxdWlyZXM6ICBjdXJyZW50X3NpemVfID4gMAotICBFbGVtZW50KiBVbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCk7Ci0KLSAgLy8gRXh0cmFjdCBlbGVtZW50cyB3aXRoIGluZGljZXMgaW4gdGhlIHJhbmdlICJbc3RhcnQgLi4gc3RhcnQrbnVtLTFdIi4KLSAgLy8gVGhlIGNhbGxlciBhc3N1bWVzIG93bmVyc2hpcCBvZiB0aGUgZXh0cmFjdGVkIGVsZW1lbnRzIGFuZCBpcyByZXNwb25zaWJsZQotICAvLyBmb3IgZGVsZXRpbmcgdGhlbSB3aGVuIHRoZXkgYXJlIG5vIGxvbmdlciBuZWVkZWQuCi0gIC8vIElmICJlbGVtZW50cyIgaXMgbm9uLU5VTEwsIHRoZW4gcG9pbnRlcnMgdG8gdGhlIGV4dHJhY3RlZCBlbGVtZW50cwotICAvLyBhcmUgc3RvcmVkIGluICJlbGVtZW50c1swIC4uIG51bS0xXSIgZm9yIHRoZSBjb252ZW5pZW5jZSBvZiB0aGUgY2FsbGVyLgotICAvLyBJZiAiZWxlbWVudHMiIGlzIE5VTEwsIHRoZW4gdGhlIGNhbGxlciBtdXN0IHVzZSBzb21lIG90aGVyIG1lY2hhbmlzbQotICAvLyB0byBwZXJmb3JtIGFueSBmdXJ0aGVyIG9wZXJhdGlvbnMgKGxpa2UgZGVsZXRpb24pIG9uIHRoZXNlIGVsZW1lbnRzLgotICAvLyBDYXV0aW9uOiBpbXBsZW1lbnRhdGlvbiBhbHNvIG1vdmVzIGVsZW1lbnRzIHdpdGggaW5kaWNlcyBbc3RhcnQrbnVtIC4uXS4KLSAgLy8gQ2FsbGluZyB0aGlzIHJvdXRpbmUgaW5zaWRlIGEgbG9vcCBjYW4gY2F1c2UgcXVhZHJhdGljIGJlaGF2aW9yLgotICAvLwotICAvLyBNZW1vcnkgY29weWluZyBiZWhhdmlvciBpcyBpZGVudGljYWwgdG8gUmVsZWFzZUxhc3QoKSwgZGVzY3JpYmVkIGFib3ZlOiBpZgotICAvLyB0aGlzIFJlcGVhdGVkUHRyRmllbGQgaXMgb24gYW4gYXJlbmEsIGFuIG9iamVjdCBjb3B5IGlzIHBlcmZvcm1lZCBmb3IgZWFjaAotICAvLyByZXR1cm5lZCBlbGVtZW50LCBzbyB0aGF0IGFsbCByZXR1cm5lZCBlbGVtZW50IHBvaW50ZXJzIGFyZSB0bwotICAvLyBoZWFwLWFsbG9jYXRlZCBjb3BpZXMuIElmIHRoaXMgY29weSBpcyBub3QgZGVzaXJlZCwgdGhlIHVzZXIgc2hvdWxkIGNhbGwKLSAgLy8gVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UoKS4KLSAgdm9pZCBFeHRyYWN0U3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMpOwotCi0gIC8vIElkZW50aWNhbCB0byBFeHRyYWN0U3VicmFuZ2UoKSBkZXNjcmliZWQgYWJvdmUsIGV4Y2VwdCB0aGF0IHdoZW4gdGhpcwotICAvLyByZXBlYXRlZCBmaWVsZCBpcyBvbiBhbiBhcmVuYSwgbm8gb2JqZWN0IGNvcGllcyBhcmUgcGVyZm9ybWVkLiBJbnN0ZWFkLCB0aGUKLSAgLy8gcmF3IG9iamVjdCBwb2ludGVycyBhcmUgcmV0dXJuZWQuIFRodXMsIGlmIG9uIGFuIGFyZW5hLCB0aGUgcmV0dXJuZWQKLSAgLy8gb2JqZWN0cyBtdXN0IG5vdCBiZSBmcmVlZCwgYmVjYXVzZSB0aGV5IHdpbGwgbm90IGJlIGhlYXAtYWxsb2NhdGVkIG9iamVjdHMuCi0gIHZvaWQgVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMpOwotCi0gIC8vIFdoZW4gZWxlbWVudHMgYXJlIHJlbW92ZWQgYnkgY2FsbHMgdG8gUmVtb3ZlTGFzdCgpIG9yIENsZWFyKCksIHRoZXkKLSAgLy8gYXJlIG5vdCBhY3R1YWxseSBmcmVlZC4gIEluc3RlYWQsIHRoZXkgYXJlIGNsZWFyZWQgYW5kIGtlcHQgc28gdGhhdAotICAvLyB0aGV5IGNhbiBiZSByZXVzZWQgbGF0ZXIuICBUaGlzIGNhbiBzYXZlIGxvdHMgb2YgQ1BVIHRpbWUgd2hlbgotICAvLyByZXBlYXRlZGx5IHJldXNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIGZvciBzaW1pbGFyIHB1cnBvc2VzLgotICAvLwotICAvLyBIYXJkY29yZSBwcm9ncmFtcyBtYXkgY2hvb3NlIHRvIG1hbmlwdWxhdGUgdGhlc2UgY2xlYXJlZCBvYmplY3RzCi0gIC8vIHRvIGJldHRlciBvcHRpbWl6ZSBtZW1vcnkgbWFuYWdlbWVudCB1c2luZyB0aGUgZm9sbG93aW5nIHJvdXRpbmVzLgotCi0gIC8vIEdldCB0aGUgbnVtYmVyIG9mIGNsZWFyZWQgb2JqZWN0cyB0aGF0IGFyZSBjdXJyZW50bHkgYmVpbmcga2VwdAotICAvLyBhcm91bmQgZm9yIHJldXNlLgotICBpbnQgQ2xlYXJlZENvdW50KCkgY29uc3Q7Ci0gIC8vIEFkZCBhbiBlbGVtZW50IHRvIHRoZSBwb29sIG9mIGNsZWFyZWQgb2JqZWN0cywgcGFzc2luZyBvd25lcnNoaXAgdG8KLSAgLy8gdGhlIFJlcGVhdGVkUHRyRmllbGQuICBUaGUgZWxlbWVudCBtdXN0IGJlIGNsZWFyZWQgcHJpb3IgdG8gY2FsbGluZwotICAvLyB0aGlzIG1ldGhvZC4KLSAgLy8KLSAgLy8gVGhpcyBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCB3aGVuIHRoZSByZXBlYXRlZCBmaWVsZCBpcyBvbiBhbiBhcmVuYSBvciB3aGVuCi0gIC8vIHx2YWx1ZXwgaXM7IGJvdGggY2FzZXMgd2lsbCB0cmlnZ2VyIGEgR09PR0xFX0RDSEVDSy1mYWlsdXJlLgotICB2b2lkIEFkZENsZWFyZWQoRWxlbWVudCogdmFsdWUpOwotICAvLyBSZW1vdmUgYSBzaW5nbGUgZWxlbWVudCBmcm9tIHRoZSBjbGVhcmVkIHBvb2wgYW5kIHJldHVybiBpdCwgcGFzc2luZwotICAvLyBvd25lcnNoaXAgdG8gdGhlIGNhbGxlci4gIFRoZSBlbGVtZW50IGlzIGd1YXJhbnRlZWQgdG8gYmUgY2xlYXJlZC4KLSAgLy8gUmVxdWlyZXM6ICBDbGVhcmVkQ291bnQoKSA+IDAKLSAgLy8KLSAgLy8KLSAgLy8gVGhpcyBtZXRob2QgY2Fubm90IGJlIGNhbGxlZCB3aGVuIHRoZSByZXBlYXRlZCBmaWVsZCBpcyBvbiBhbiBhcmVuYTsgZG9pbmcKLSAgLy8gc28gd2lsbCB0cmlnZ2VyIGEgR09PR0xFX0RDSEVDSy1mYWlsdXJlLgotICBFbGVtZW50KiBSZWxlYXNlQ2xlYXJlZCgpOwotCi0gIC8vIFJlbW92ZXMgdGhlIGVsZW1lbnQgcmVmZXJlbmNlZCBieSBwb3NpdGlvbi4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHJlbW92ZWQKLSAgLy8gZWxlbWVudC4KLSAgLy8KLSAgLy8gSW52YWxpZGF0ZXMgYWxsIGl0ZXJhdG9ycyBhdCBvciBhZnRlciB0aGUgcmVtb3ZlZCBlbGVtZW50LCBpbmNsdWRpbmcgZW5kKCkuCi0gIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIHBvc2l0aW9uKTsKLQotICAvLyBSZW1vdmVzIHRoZSBlbGVtZW50cyBpbiB0aGUgcmFuZ2UgW2ZpcnN0LCBsYXN0KS4KLSAgLy8KLSAgLy8gUmV0dXJucyBhbiBpdGVyYXRvciB0byB0aGUgZWxlbWVudCBpbW1lZGlhdGVseSBmb2xsb3dpbmcgdGhlIHJlbW92ZWQgcmFuZ2UuCi0gIC8vCi0gIC8vIEludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMgYXQgb3IgYWZ0ZXIgdGhlIHJlbW92ZWQgcmFuZ2UsIGluY2x1ZGluZyBlbmQoKS4KLSAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgZmlyc3QsIGNvbnN0X2l0ZXJhdG9yIGxhc3QpOwotCi0gIC8vIEdldHMgdGhlIGFyZW5hIG9uIHdoaWNoIHRoaXMgUmVwZWF0ZWRQdHJGaWVsZCBzdG9yZXMgaXRzIGVsZW1lbnRzLgotICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYSgpIGNvbnN0IHsKLSAgICByZXR1cm4gR2V0QXJlbmFOb1ZpcnR1YWwoKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICAvLyBOb3RlOiAgUmVwZWF0ZWRQdHJGaWVsZCBTSE9VTEQgTk9UIGJlIHN1YmNsYXNzZWQgYnkgdXNlcnMuICBXZSBvbmx5Ci0gIC8vICAgc3ViY2xhc3MgaXQgaW4gb25lIHBsYWNlIGFzIGEgaGFjayBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIHByb3RvMS4gIFRoZQotICAvLyAgIHN1YmNsYXNzIG5lZWRzIHRvIGtub3cgYWJvdXQgVHlwZUhhbmRsZXIgaW4gb3JkZXIgdG8gY2FsbCBwcm90ZWN0ZWQKLSAgLy8gICBtZXRob2RzIG9uIFJlcGVhdGVkUHRyRmllbGRCYXNlLgotICBjbGFzcyBUeXBlSGFuZGxlcjsKLQotICAvLyBJbnRlcm5hbCBhcmVuYSBhY2Nlc3NvciBleHBlY3RlZCBieSBoZWxwZXJzIGluIEFyZW5hLgotICBpbmxpbmUgQXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICAvLyBJbXBsZW1lbnRhdGlvbnMgZm9yIEV4dHJhY3RTdWJyYW5nZSgpLiBUaGUgY29weWluZyBiZWhhdmlvciBtdXN0IGJlCi0gIC8vIGluY2x1ZGVkIG9ubHkgaWYgdGhlIHR5cGUgc3VwcG9ydHMgdGhlIG5lY2Vzc2FyeSBvcGVyYXRpb25zIChlLmcuLAotICAvLyBNZXJnZUZyb20oKSksIHNvIHdlIG11c3QgcmVzb2x2ZSB0aGlzIGF0IGNvbXBpbGUgdGltZS4gRXh0cmFjdFN1YnJhbmdlKCkKLSAgLy8gdXNlcyBTRklOQUUgdG8gY2hvb3NlIG9uZSBvZiB0aGUgYmVsb3cgaW1wbGVtZW50YXRpb25zLgotICB2b2lkIEV4dHJhY3RTdWJyYW5nZUludGVybmFsKGludCBzdGFydCwgaW50IG51bSwgRWxlbWVudCoqIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUpOwotICB2b2lkIEV4dHJhY3RTdWJyYW5nZUludGVybmFsKGludCBzdGFydCwgaW50IG51bSwgRWxlbWVudCoqIGVsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlKTsKLQotICBmcmllbmQgY2xhc3MgQXJlbmE7Ci0gIHR5cGVkZWYgdm9pZCBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV87Ci0KLX07Ci0KLS8vIGltcGxlbWVudGF0aW9uID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZCgpCi0gIDogY3VycmVudF9zaXplXygwKSwKLSAgICB0b3RhbF9zaXplXygwKSwKLSAgICByZXBfKE5VTEwpIHsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZChBcmVuYSogYXJlbmEpCi0gIDogY3VycmVudF9zaXplXygwKSwKLSAgICB0b3RhbF9zaXplXygwKSwKLSAgICByZXBfKE5VTEwpIHsKLSAvLyBJbiBjYXNlIGFyZW5hIGlzIE5VTEwsIHRoZW4gd2UgZG8gbm90IGNyZWF0ZSByZXBfLCBhcyBjb2RlIGhhcyBhbiBpbnZhcmlhbnQKLSAvLyBgcmVwXyA9PSBOVUxMIHRoZW4gYXJlbmEgPT0gTlVMTGAuCi0gaWYgKGFyZW5hICE9IE5VTEwpIHsKLSAgcmVwXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwKj4oCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVBcnJheTxjaGFyPihhcmVuYSwga1JlcEhlYWRlclNpemUpKTsKLSAgcmVwXy0+YXJlbmEgPSBhcmVuYTsKLSB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkRmllbGQoY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpCi0gIDogY3VycmVudF9zaXplXygwKSwKLSAgICB0b3RhbF9zaXplXygwKSwKLSAgICByZXBfKE5VTEwpIHsKLSAgQ29weUZyb20ob3RoZXIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLXRlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgotUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZChJdGVyIGJlZ2luLCBjb25zdCBJdGVyJiBlbmQpCi0gIDogY3VycmVudF9zaXplXygwKSwKLSAgICB0b3RhbF9zaXplXygwKSwKLSAgICByZXBfKE5VTEwpIHsKLSAgaW50IHJlc2VydmUgPSBpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZShiZWdpbiwgZW5kKTsKLSAgaWYgKHJlc2VydmUgIT0gLTEpIHsKLSAgICBSZXNlcnZlKHJlc2VydmUpOwotICAgIGZvciAoOyBiZWdpbiAhPSBlbmQ7ICsrYmVnaW4pIHsKLSAgICAgIEFkZEFscmVhZHlSZXNlcnZlZCgqYmVnaW4pOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBmb3IgKDsgYmVnaW4gIT0gZW5kOyArK2JlZ2luKSB7Ci0gICAgICBBZGQoKmJlZ2luKTsKLSAgICB9Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1SZXBlYXRlZEZpZWxkPEVsZW1lbnQ+Ojp+UmVwZWF0ZWRGaWVsZCgpIHsKLSAgLy8gU2VlIGV4cGxhbmF0aW9uIGluIFJlc2VydmUoKTogd2UgbmVlZCB0byBpbnZva2UgZGVzdHJ1Y3RvcnMgaGVyZSBmb3IgdGhlCi0gIC8vIGNhc2UgdGhhdCBFbGVtZW50IGhhcyBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IuCi0gIEludGVybmFsRGVhbGxvY2F0ZShyZXBfLCB0b3RhbF9zaXplXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD4mCi1SZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpvcGVyYXRvcj0oY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpIHsKLSAgaWYgKHRoaXMgIT0gJm90aGVyKQotICAgIENvcHlGcm9tKG90aGVyKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBib29sIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmVtcHR5KCkgY29uc3QgewotICByZXR1cm4gY3VycmVudF9zaXplXyA9PSAwOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBpbnQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGN1cnJlbnRfc2l6ZV87Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIGludCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpDYXBhY2l0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIHRvdGFsX3NpemVfOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkQWxyZWFkeVJlc2VydmVkKGNvbnN0IEVsZW1lbnQmIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTFQoY3VycmVudF9zaXplXywgdG90YWxfc2l6ZV8pOwotICByZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdID0gdmFsdWU7Ci19Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkQWxyZWFkeVJlc2VydmVkKCkgewotICBHT09HTEVfRENIRUNLX0xUKGN1cnJlbnRfc2l6ZV8sIHRvdGFsX3NpemVfKTsKLSAgcmV0dXJuICZyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVzaXplKGludCBuZXdfc2l6ZSwgY29uc3QgRWxlbWVudCYgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDS19HRShuZXdfc2l6ZSwgMCk7Ci0gIGlmIChuZXdfc2l6ZSA+IGN1cnJlbnRfc2l6ZV8pIHsKLSAgICBSZXNlcnZlKG5ld19zaXplKTsKLSAgICBzdGQ6OmZpbGwoJnJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV9dLAotICAgICAgICAgICAgICAmcmVwXy0+ZWxlbWVudHNbbmV3X3NpemVdLCB2YWx1ZSk7Ci0gIH0KLSAgY3VycmVudF9zaXplXyA9IG5ld19zaXplOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBjb25zdCBFbGVtZW50JiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpHZXQoaW50IGluZGV4KSBjb25zdCB7Ci0gIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOwotICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKLSAgcmV0dXJuIHJlcF8tPmVsZW1lbnRzW2luZGV4XTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6TXV0YWJsZShpbnQgaW5kZXgpIHsKLSAgR09PR0xFX0RDSEVDS19HRShpbmRleCwgMCk7Ci0gIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOwotICByZXR1cm4gJnJlcF8tPmVsZW1lbnRzW2luZGV4XTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTZXQoaW50IGluZGV4LCBjb25zdCBFbGVtZW50JiB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLX0dFKGluZGV4LCAwKTsKLSAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgY3VycmVudF9zaXplXyk7Ci0gIHJlcF8tPmVsZW1lbnRzW2luZGV4XSA9IHZhbHVlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZChjb25zdCBFbGVtZW50JiB2YWx1ZSkgewotICBpZiAoY3VycmVudF9zaXplXyA9PSB0b3RhbF9zaXplXykgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOwotICByZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdID0gdmFsdWU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZCgpIHsKLSAgaWYgKGN1cnJlbnRfc2l6ZV8gPT0gdG90YWxfc2l6ZV8pIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKLSAgcmV0dXJuICZyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlJlbW92ZUxhc3QoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfR1QoY3VycmVudF9zaXplXywgMCk7Ci0gIGN1cnJlbnRfc2l6ZV8tLTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci12b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkV4dHJhY3RTdWJyYW5nZSgKLSAgICBpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqIGVsZW1lbnRzKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfR0Uoc3RhcnQsIDApOwotICBHT09HTEVfRENIRUNLX0dFKG51bSwgMCk7Ci0gIEdPT0dMRV9EQ0hFQ0tfTEUoc3RhcnQgKyBudW0sIHRoaXMtPmN1cnJlbnRfc2l6ZV8pOwotCi0gIC8vIFNhdmUgdGhlIHZhbHVlcyBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cyBpZiByZXF1ZXN0ZWQuCi0gIGlmIChlbGVtZW50cyAhPSBOVUxMKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkKLSAgICAgIGVsZW1lbnRzW2ldID0gdGhpcy0+R2V0KGkgKyBzdGFydCk7Ci0gIH0KLQotICAvLyBTbGlkZSByZW1haW5pbmcgZWxlbWVudHMgZG93biB0byBmaWxsIHRoZSBnYXAuCi0gIGlmIChudW0gPiAwKSB7Ci0gICAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgbnVtOyBpIDwgdGhpcy0+Y3VycmVudF9zaXplXzsgKytpKQotICAgICAgdGhpcy0+U2V0KGkgLSBudW0sIHRoaXMtPkdldChpKSk7Ci0gICAgdGhpcy0+VHJ1bmNhdGUodGhpcy0+Y3VycmVudF9zaXplXyAtIG51bSk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpDbGVhcigpIHsKLSAgY3VycmVudF9zaXplXyA9IDA7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6TWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmb3RoZXIsIHRoaXMpOwotICBpZiAob3RoZXIuY3VycmVudF9zaXplXyAhPSAwKSB7Ci0gICAgUmVzZXJ2ZShjdXJyZW50X3NpemVfICsgb3RoZXIuY3VycmVudF9zaXplXyk7Ci0gICAgQ29weUFycmF5KHJlcF8tPmVsZW1lbnRzICsgY3VycmVudF9zaXplXywKLSAgICAgICAgICAgICAgb3RoZXIucmVwXy0+ZWxlbWVudHMsIG90aGVyLmN1cnJlbnRfc2l6ZV8pOwotICAgIGN1cnJlbnRfc2l6ZV8gKz0gb3RoZXIuY3VycmVudF9zaXplXzsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNvcHlGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKSB7Ci0gIGlmICgmb3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBDbGVhcigpOwotICBNZXJnZUZyb20ob3RoZXIpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjppdGVyYXRvciBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplcmFzZSgKLSAgICBjb25zdF9pdGVyYXRvciBwb3NpdGlvbikgewotICByZXR1cm4gZXJhc2UocG9zaXRpb24sIHBvc2l0aW9uICsgMSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmVyYXNlKAotICAgIGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KSB7Ci0gIHNpemVfdHlwZSBmaXJzdF9vZmZzZXQgPSBmaXJzdCAtIGNiZWdpbigpOwotICBpZiAoZmlyc3QgIT0gbGFzdCkgewotICAgIFRydW5jYXRlKHN0ZDo6Y29weShsYXN0LCBjZW5kKCksIGJlZ2luKCkgKyBmaXJzdF9vZmZzZXQpIC0gY2JlZ2luKCkpOwotICB9Ci0gIHJldHVybiBiZWdpbigpICsgZmlyc3Rfb2Zmc2V0OwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjptdXRhYmxlX2RhdGEoKSB7Ci0gIHJldHVybiByZXBfID8gcmVwXy0+ZWxlbWVudHMgOiBOVUxMOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBjb25zdCBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpkYXRhKCkgY29uc3QgewotICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzIDogTlVMTDsKLX0KLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkludGVybmFsU3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcikgewotICBzdGQ6OnN3YXAocmVwXywgb3RoZXItPnJlcF8pOwotICBzdGQ6OnN3YXAoY3VycmVudF9zaXplXywgb3RoZXItPmN1cnJlbnRfc2l6ZV8pOwotICBzdGQ6OnN3YXAodG90YWxfc2l6ZV8sIG90aGVyLT50b3RhbF9zaXplXyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgotdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTd2FwKFJlcGVhdGVkRmllbGQqIG90aGVyKSB7Ci0gIGlmICh0aGlzID09IG90aGVyKSByZXR1cm47Ci0gIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09ICBvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSkgewotICAgIEludGVybmFsU3dhcChvdGhlcik7Ci0gIH0gZWxzZSB7Ci0gICAgUmVwZWF0ZWRGaWVsZDxFbGVtZW50PiB0ZW1wKG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKTsKLSAgICB0ZW1wLk1lcmdlRnJvbSgqdGhpcyk7Ci0gICAgQ29weUZyb20oKm90aGVyKTsKLSAgICBvdGhlci0+VW5zYWZlQXJlbmFTd2FwKCZ0ZW1wKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLXZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6VW5zYWZlQXJlbmFTd2FwKFJlcGVhdGVkRmllbGQqIG90aGVyKSB7Ci0gIGlmICh0aGlzID09IG90aGVyKSByZXR1cm47Ci0gIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSk7Ci0gIEludGVybmFsU3dhcChvdGhlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgotdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4MikgewotICB1c2luZyBzdGQ6OnN3YXA7ICAvLyBlbmFibGUgQURMIHdpdGggZmFsbGJhY2sKLSAgc3dhcChyZXBfLT5lbGVtZW50c1tpbmRleDFdLCByZXBfLT5lbGVtZW50c1tpbmRleDJdKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6aXRlcmF0b3IKLVJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmJlZ2luKCkgewotICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzIDogTlVMTDsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCi1SZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIGNvbnN0IHsKLSAgcmV0dXJuIHJlcF8gPyByZXBfLT5lbGVtZW50cyA6IE5VTEw7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgotUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Y2JlZ2luKCkgY29uc3QgewotICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzIDogTlVMTDsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCi1SZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplbmQoKSB7Ci0gIHJldHVybiByZXBfID8gcmVwXy0+ZWxlbWVudHMgKyBjdXJyZW50X3NpemVfIDogTlVMTDsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCi1SZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplbmQoKSBjb25zdCB7Ci0gIHJldHVybiByZXBfID8gcmVwXy0+ZWxlbWVudHMgKyBjdXJyZW50X3NpemVfIDogTlVMTDsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCi1SZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpjZW5kKCkgY29uc3QgewotICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzICsgY3VycmVudF9zaXplXyA6IE5VTEw7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIGludCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgewotICByZXR1cm4gcmVwXyA/Ci0gICAgICAodG90YWxfc2l6ZV8gKiBzaXplb2YoRWxlbWVudCkgKyBrUmVwSGVhZGVyU2l6ZSkgOiAwOwotfQotCi0vLyBBdm9pZCBpbmxpbmluZyBvZiBSZXNlcnZlKCk6IG5ldywgY29weSwgYW5kIGRlbGV0ZVtdIGxlYWQgdG8gYSBzaWduaWZpY2FudAotLy8gYW1vdW50IG9mIGNvZGUgYmxvYXQuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLXZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVzZXJ2ZShpbnQgbmV3X3NpemUpIHsKLSAgaWYgKHRvdGFsX3NpemVfID49IG5ld19zaXplKSByZXR1cm47Ci0gIFJlcCogb2xkX3JlcCA9IHJlcF87Ci0gIEFyZW5hKiBhcmVuYSA9IEdldEFyZW5hTm9WaXJ0dWFsKCk7Ci0gIG5ld19zaXplID0gc3RkOjptYXgoZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgodG90YWxfc2l6ZV8gKiAyLCBuZXdfc2l6ZSkpOwotICBHT09HTEVfQ0hFQ0tfTEUoc3RhdGljX2Nhc3Q8c2l6ZV90PihuZXdfc2l6ZSksCi0gICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC0ga1JlcEhlYWRlclNpemUpIC8KLSAgICAgICAgICAgc2l6ZW9mKEVsZW1lbnQpKQotICAgICAgPDwgIlJlcXVlc3RlZCBzaXplIGlzIHRvbyBsYXJnZSB0byBmaXQgaW50byBzaXplX3QuIjsKLSAgaWYgKGFyZW5hID09IE5VTEwpIHsKLSAgICByZXBfID0gcmVpbnRlcnByZXRfY2FzdDxSZXAqPigKLSAgICAgICAgbmV3IGNoYXJba1JlcEhlYWRlclNpemUgKyBzaXplb2YoRWxlbWVudCkgKiBuZXdfc2l6ZV0pOwotICB9IGVsc2UgewotICAgIHJlcF8gPSByZWludGVycHJldF9jYXN0PFJlcCo+KAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlQXJyYXk8Y2hhcj4oYXJlbmEsCi0gICAgICAgICAgICAgICAga1JlcEhlYWRlclNpemUgKyBzaXplb2YoRWxlbWVudCkgKiBuZXdfc2l6ZSkpOwotICB9Ci0gIHJlcF8tPmFyZW5hID0gYXJlbmE7Ci0gIGludCBvbGRfdG90YWxfc2l6ZSA9IHRvdGFsX3NpemVfOwotICB0b3RhbF9zaXplXyA9IG5ld19zaXplOwotICAvLyBJbnZva2UgcGxhY2VtZW50LW5ldyBvbiBuZXdseSBhbGxvY2F0ZWQgZWxlbWVudHMuIFdlIHNob3VsZG4ndCBoYXZlIHRvIGRvCi0gIC8vIHRoaXMsIHNpbmNlIEVsZW1lbnQgaXMgc3VwcG9zZWQgdG8gYmUgUE9ELCBidXQgYSBwcmV2aW91cyB2ZXJzaW9uIG9mIHRoaXMKLSAgLy8gY29kZSBhbGxvY2F0ZWQgc3RvcmFnZSB3aXRoICJuZXcgRWxlbWVudFtzaXplXSIgYW5kIHNvbWUgY29kZSB1c2VzCi0gIC8vIFJlcGVhdGVkRmllbGQgd2l0aCBub24tUE9EIHR5cGVzLCByZWx5aW5nIG9uIGNvbnN0cnVjdG9yIGludm9jYXRpb24uIElmCi0gIC8vIEVsZW1lbnQgaGFzIGEgdHJpdmlhbCBjb25zdHJ1Y3RvciAoZS5nLiwgaW50MzIpLCBnY2MgKHRlc3RlZCB3aXRoIC1PMikKLSAgLy8gY29tcGxldGVseSByZW1vdmVzIHRoaXMgbG9vcCBiZWNhdXNlIHRoZSBsb29wIGJvZHkgaXMgZW1wdHksIHNvIHRoaXMgaGFzIG5vCi0gIC8vIGVmZmVjdCB1bmxlc3MgaXRzIHNpZGUtZWZmZWN0cyBhcmUgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzLgotICAvLyBOb3RlIHRoYXQgd2UgZG8gdGhpcyBiZWZvcmUgTW92ZUFycmF5KCkgYmVsb3cgYmVjYXVzZSBFbGVtZW50J3MgY29weQotICAvLyBhc3NpZ25tZW50IGltcGxlbWVudGF0aW9uIHdpbGwgd2FudCBhbiBpbml0aWFsaXplZCBpbnN0YW5jZSBmaXJzdC4KLSAgRWxlbWVudCogZSA9ICZyZXBfLT5lbGVtZW50c1swXTsKLSAgRWxlbWVudCogbGltaXQgPSAmcmVwXy0+ZWxlbWVudHNbdG90YWxfc2l6ZV9dOwotICBmb3IgKDsgZSA8IGxpbWl0OyBlKyspIHsKLSAgICBuZXcgKGUpIEVsZW1lbnQoKTsKLSAgfQotICBpZiAoY3VycmVudF9zaXplXyA+IDApIHsKLSAgICBNb3ZlQXJyYXkocmVwXy0+ZWxlbWVudHMsIG9sZF9yZXAtPmVsZW1lbnRzLCBjdXJyZW50X3NpemVfKTsKLSAgfQotCi0gIC8vIExpa2V3aXNlLCB3ZSBuZWVkIHRvIGludm9rZSBkZXN0cnVjdG9ycyBvbiB0aGUgb2xkIGFycmF5LgotICBJbnRlcm5hbERlYWxsb2NhdGUob2xkX3JlcCwgb2xkX3RvdGFsX3NpemUpOwotCi19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6VHJ1bmNhdGUoaW50IG5ld19zaXplKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTEUobmV3X3NpemUsIGN1cnJlbnRfc2l6ZV8pOwotICBpZiAoY3VycmVudF9zaXplXyA+IDApIHsKLSAgICBjdXJyZW50X3NpemVfID0gbmV3X3NpemU7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpNb3ZlQXJyYXkoCi0gIEVsZW1lbnQqIHRvLCBFbGVtZW50KiBmcm9tLCBpbnQgYXJyYXlfc2l6ZSkgewotICBDb3B5QXJyYXkodG8sIGZyb20sIGFycmF5X3NpemUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNvcHlBcnJheSgKLSAgRWxlbWVudCogdG8sIGNvbnN0IEVsZW1lbnQqIGZyb20sIGludCBhcnJheV9zaXplKSB7Ci0gIGludGVybmFsOjpFbGVtZW50Q29waWVyPEVsZW1lbnQ+KCkodG8sIGZyb20sIGFycmF5X3NpemUpOwotfQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudCwgYm9vbCBIYXNUcml2aWFsQ29weT4KLXZvaWQgRWxlbWVudENvcGllcjxFbGVtZW50LCBIYXNUcml2aWFsQ29weT46Om9wZXJhdG9yKCkoCi0gIEVsZW1lbnQqIHRvLCBjb25zdCBFbGVtZW50KiBmcm9tLCBpbnQgYXJyYXlfc2l6ZSkgewotICBzdGQ6OmNvcHkoZnJvbSwgZnJvbSArIGFycmF5X3NpemUsIHRvKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1zdHJ1Y3QgRWxlbWVudENvcGllcjxFbGVtZW50LCB0cnVlPiB7Ci0gIHZvaWQgb3BlcmF0b3IoKShFbGVtZW50KiB0bywgY29uc3QgRWxlbWVudCogZnJvbSwgaW50IGFycmF5X3NpemUpIHsKLSAgICBtZW1jcHkodG8sIGZyb20sIGFycmF5X3NpemUgKiBzaXplb2YoRWxlbWVudCkpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWlubGluZSBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVwZWF0ZWRQdHJGaWVsZEJhc2UoKQotICA6IGFyZW5hXyhOVUxMKSwKLSAgICBjdXJyZW50X3NpemVfKDApLAotICAgIHRvdGFsX3NpemVfKDApLAotICAgIHJlcF8oTlVMTCkgewotfQotCi1pbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlcGVhdGVkUHRyRmllbGRCYXNlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKQotICA6IGFyZW5hXyhhcmVuYSksCi0gICAgY3VycmVudF9zaXplXygwKSwKLSAgICB0b3RhbF9zaXplXygwKSwKLSAgICByZXBfKE5VTEwpIHsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6RGVzdHJveSgpIHsKLSAgaWYgKHJlcF8gIT0gTlVMTCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVwXy0+YWxsb2NhdGVkX3NpemU7IGkrKykgewotICAgICAgVHlwZUhhbmRsZXI6OkRlbGV0ZShjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpXSksIGFyZW5hXyk7Ci0gICAgfQotICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgewotICAgICAgZGVsZXRlIFtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHJlcF8pOwotICAgIH0KLSAgfQotICByZXBfID0gTlVMTDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7Ci0gIGlmIChvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBHZXRBcmVuYU5vVmlydHVhbCgpKSB7Ci0gICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKLSAgfSBlbHNlIHsKLSAgICBTd2FwRmFsbGJhY2s8VHlwZUhhbmRsZXI+KG90aGVyKTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci12b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTd2FwRmFsbGJhY2soUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7Ci0gIEdPT0dMRV9EQ0hFQ0sob3RoZXItPkdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gR2V0QXJlbmFOb1ZpcnR1YWwoKSk7Ci0KLSAgLy8gQ29weSBzZW1hbnRpY3MgaW4gdGhpcyBjYXNlLiBXZSB0cnkgdG8gaW1wcm92ZSBlZmZpY2llbmN5IGJ5IHBsYWNpbmcgdGhlCi0gIC8vIHRlbXBvcmFyeSBvbiB8b3RoZXJ8J3MgYXJlbmEgc28gdGhhdCBtZXNzYWdlcyBhcmUgY29waWVkIGNyb3NzLWFyZW5hIG9ubHkKLSAgLy8gb25jZSwgbm90IHR3aWNlLgotICBSZXBlYXRlZFB0ckZpZWxkQmFzZSB0ZW1wKG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKTsKLSAgdGVtcC5NZXJnZUZyb208VHlwZUhhbmRsZXI+KCp0aGlzKTsKLSAgdGhpcy0+Q2xlYXI8VHlwZUhhbmRsZXI+KCk7Ci0gIHRoaXMtPk1lcmdlRnJvbTxUeXBlSGFuZGxlcj4oKm90aGVyKTsKLSAgb3RoZXItPkNsZWFyPFR5cGVIYW5kbGVyPigpOwotICBvdGhlci0+SW50ZXJuYWxTd2FwKCZ0ZW1wKTsKLSAgdGVtcC5EZXN0cm95PFR5cGVIYW5kbGVyPigpOyAgLy8gRnJlZXMgcmVwXyBpZiBgb3RoZXJgIGhhZCBubyBhcmVuYS4KLX0KLQotaW5saW5lIGJvb2wgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmVtcHR5KCkgY29uc3QgewotICByZXR1cm4gY3VycmVudF9zaXplXyA9PSAwOwotfQotCi1pbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpzaXplKCkgY29uc3QgewotICByZXR1cm4gY3VycmVudF9zaXplXzsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotaW5saW5lIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlJgotUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkdldChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgR09PR0xFX0RDSEVDS19HRShpbmRleCwgMCk7Ci0gIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOwotICByZXR1cm4gKmNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzW2luZGV4XSk7Ci19Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKgotUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok11dGFibGUoaW50IGluZGV4KSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOwotICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKLSAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzW2luZGV4XSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLWlubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpEZWxldGUoaW50IGluZGV4KSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOwotICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKLSAgVHlwZUhhbmRsZXI6OkRlbGV0ZShjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpbmRleF0pLCBhcmVuYV8pOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci1pbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGQoCi0gICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHByb3RvdHlwZSkgewotICBpZiAocmVwXyAhPSBOVUxMICYmIGN1cnJlbnRfc2l6ZV8gPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZSkgewotICAgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdKTsKLSAgfQotICBpZiAoIXJlcF8gfHwgcmVwXy0+YWxsb2NhdGVkX3NpemUgPT0gdG90YWxfc2l6ZV8pIHsKLSAgICBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7Ci0gIH0KLSAgKytyZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKLSAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHJlc3VsdCA9Ci0gICAgICBUeXBlSGFuZGxlcjo6TmV3RnJvbVByb3RvdHlwZShwcm90b3R5cGUsIGFyZW5hXyk7Ci0gIHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10gPSByZXN1bHQ7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLWlubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZW1vdmVMYXN0KCkgewotICBHT09HTEVfRENIRUNLX0dUKGN1cnJlbnRfc2l6ZV8sIDApOwotICBUeXBlSGFuZGxlcjo6Q2xlYXIoY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbLS1jdXJyZW50X3NpemVfXSkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci12b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcigpIHsKLSAgY29uc3QgaW50IG4gPSBjdXJyZW50X3NpemVfOwotICBHT09HTEVfRENIRUNLX0dFKG4sIDApOwotICBpZiAobiA+IDApIHsKLSAgICB2b2lkKiBjb25zdCogZWxlbWVudHMgPSByZXBfLT5lbGVtZW50czsKLSAgICBpbnQgaSA9IDA7Ci0gICAgZG8gewotICAgICAgVHlwZUhhbmRsZXI6OkNsZWFyKGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzW2krK10pKTsKLSAgICB9IHdoaWxlIChpIDwgbik7Ci0gICAgY3VycmVudF9zaXplXyA9IDA7Ci0gIH0KLX0KLQotLy8gVG8gYXZvaWQgdW5uZWNlc3NhcnkgY29kZSBkdXBsaWNhdGlvbiBhbmQgcmVkdWNlIGJpbmFyeSBzaXplLCB3ZSB1c2UgYQotLy8gbGF5ZXJlZCBhcHByb2FjaCB0byBpbXBsZW1lbnRpbmcgTWVyZ2VGcm9tKCkuIFRoZSB0b3BsZXZlbCBtZXRob2QgaXMKLS8vIHRlbXBsYXRlZCwgc28gd2UgZ2V0IGEgc21hbGwgdGh1bmsgcGVyIGNvbmNyZXRlIG1lc3NhZ2UgdHlwZSBpbiB0aGUgYmluYXJ5LgotLy8gVGhpcyBjYWxscyBhIHNoYXJlZCBpbXBsZW1lbnRhdGlvbiB3aXRoIG1vc3Qgb2YgdGhlIGxvZ2ljLCBwYXNzaW5nIGEgZnVuY3Rpb24KLS8vIHBvaW50ZXIgdG8gYW5vdGhlciB0eXBlLXNwZWNpZmljIHBpZWNlIG9mIGNvZGUgdGhhdCBjYWxscyB0aGUgb2JqZWN0LWFsbG9jYXRlCi0vLyBhbmQgbWVyZ2UgaGFuZGxlcnMuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlcikgewotICBHT09HTEVfRENIRUNLX05FKCZvdGhlciwgdGhpcyk7Ci0gIGlmIChvdGhlci5jdXJyZW50X3NpemVfID09IDApIHJldHVybjsKLSAgTWVyZ2VGcm9tSW50ZXJuYWwoCi0gICAgICBvdGhlciwgJlJlcGVhdGVkUHRyRmllbGRCYXNlOjpNZXJnZUZyb21Jbm5lckxvb3A8VHlwZUhhbmRsZXI+KTsKLX0KLQotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbUludGVybmFsKAotICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGRCYXNlJiBvdGhlciwKLSAgICB2b2lkIChSZXBlYXRlZFB0ckZpZWxkQmFzZTo6KmlubmVyX2xvb3ApKHZvaWQqKiwgdm9pZCoqLCBpbnQsIGludCkpIHsKLSAgLy8gTm90ZTogd3JhcHBlciBoYXMgYWxyZWFkeSBndWFyYW50ZWVkIHRoYXQgb3RoZXIucmVwXyAhPSBOVUxMIGhlcmUuCi0gIGludCBvdGhlcl9zaXplID0gb3RoZXIuY3VycmVudF9zaXplXzsKLSAgdm9pZCoqIG90aGVyX2VsZW1lbnRzID0gb3RoZXIucmVwXy0+ZWxlbWVudHM7Ci0gIHZvaWQqKiBuZXdfZWxlbWVudHMgPSBJbnRlcm5hbEV4dGVuZChvdGhlcl9zaXplKTsKLSAgaW50IGFsbG9jYXRlZF9lbGVtcyA9IHJlcF8tPmFsbG9jYXRlZF9zaXplIC0gY3VycmVudF9zaXplXzsKLSAgKHRoaXMtPippbm5lcl9sb29wKShuZXdfZWxlbWVudHMsIG90aGVyX2VsZW1lbnRzLAotICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3NpemUsIGFsbG9jYXRlZF9lbGVtcyk7Ci0gIGN1cnJlbnRfc2l6ZV8gKz0gb3RoZXJfc2l6ZTsKLSAgaWYgKHJlcF8tPmFsbG9jYXRlZF9zaXplIDwgY3VycmVudF9zaXplXykgewotICAgIHJlcF8tPmFsbG9jYXRlZF9zaXplID0gY3VycmVudF9zaXplXzsKLSAgfQotfQotCi0vLyBNZXJnZXMgb3RoZXJfZWxlbXMgdG8gb3VyX2VsZW1zLgotdGVtcGxhdGU8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci12b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNZXJnZUZyb21Jbm5lckxvb3AoCi0gICAgdm9pZCoqIG91cl9lbGVtcywgdm9pZCoqIG90aGVyX2VsZW1zLCBpbnQgbGVuZ3RoLCBpbnQgYWxyZWFkeV9hbGxvY2F0ZWQpIHsKLSAgLy8gU3BsaXQgaW50byB0d28gbG9vcHMsIG92ZXIgcmFuZ2VzIFswLCBhbGxvY2F0ZWQpIGFuZCBbYWxsb2NhdGVkLCBsZW5ndGgpLAotICAvLyB0byBhdm9pZCBhIGJyYW5jaCB3aXRoaW4gdGhlIGxvb3AuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgYWxyZWFkeV9hbGxvY2F0ZWQgJiYgaSA8IGxlbmd0aDsgaSsrKSB7Ci0gICAgLy8gQWxyZWFkeSBhbGxvY2F0ZWQ6IHVzZSBleGlzdGluZyBlbGVtZW50LgotICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBvdGhlcl9lbGVtID0KLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSo+KG90aGVyX2VsZW1zW2ldKTsKLSAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogbmV3X2VsZW0gPQotICAgICAgICByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4ob3VyX2VsZW1zW2ldKTsKLSAgICBUeXBlSGFuZGxlcjo6TWVyZ2UoKm90aGVyX2VsZW0sIG5ld19lbGVtKTsKLSAgfQotICBBcmVuYSogYXJlbmEgPSBHZXRBcmVuYU5vVmlydHVhbCgpOwotICBmb3IgKGludCBpID0gYWxyZWFkeV9hbGxvY2F0ZWQ7IGkgPCBsZW5ndGg7IGkrKykgewotICAgIC8vIE5vdCBhbGxvY2F0ZWQ6IGFsbG9jIGEgbmV3IGVsZW1lbnQgZmlyc3QsIHRoZW4gbWVyZ2UgaXQuCi0gICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIG90aGVyX2VsZW0gPQotICAgICAgICByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4ob3RoZXJfZWxlbXNbaV0pOwotICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfZWxlbSA9Ci0gICAgICAgIFR5cGVIYW5kbGVyOjpOZXdGcm9tUHJvdG90eXBlKG90aGVyX2VsZW0sIGFyZW5hKTsKLSAgICBUeXBlSGFuZGxlcjo6TWVyZ2UoKm90aGVyX2VsZW0sIG5ld19lbGVtKTsKLSAgICBvdXJfZWxlbXNbaV0gPSBuZXdfZWxlbTsKLSAgfQotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q29weUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIG90aGVyKSB7Ci0gIGlmICgmb3RoZXIgPT0gdGhpcykgcmV0dXJuOwotICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2xlYXI8VHlwZUhhbmRsZXI+KCk7Ci0gIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNZXJnZUZyb208VHlwZUhhbmRsZXI+KG90aGVyKTsKLX0KLQotaW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2FwYWNpdHkoKSBjb25zdCB7Ci0gIHJldHVybiB0b3RhbF9zaXplXzsKLX0KLQotaW5saW5lIHZvaWQqIGNvbnN0KiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6cmF3X2RhdGEoKSBjb25zdCB7Ci0gIHJldHVybiByZXBfID8gcmVwXy0+ZWxlbWVudHMgOiBOVUxMOwotfQotCi1pbmxpbmUgdm9pZCoqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpyYXdfbXV0YWJsZV9kYXRhKCkgY29uc3QgewotICByZXR1cm4gcmVwXyA/IGNvbnN0X2Nhc3Q8dm9pZCoqPihyZXBfLT5lbGVtZW50cykgOiBOVUxMOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci1pbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6bXV0YWJsZV9kYXRhKCkgewotICAvLyBUT0RPKGtlbnRvbik6ICBCcmVha3MgQysrIGFsaWFzaW5nIHJ1bGVzLiAgV2Ugc2hvdWxkIHByb2JhYmx5IHJlbW92ZSB0aGlzCi0gIC8vICAgbWV0aG9kIGVudGlyZWx5LgotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSoqPihyYXdfbXV0YWJsZV9kYXRhKCkpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci1pbmxpbmUgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIGNvbnN0KgotUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmRhdGEoKSBjb25zdCB7Ci0gIC8vIFRPRE8oa2VudG9uKTogIEJyZWFrcyBDKysgYWxpYXNpbmcgcnVsZXMuICBXZSBzaG91bGQgcHJvYmFibHkgcmVtb3ZlIHRoaXMKLSAgLy8gICBtZXRob2QgZW50aXJlbHkuCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb25zdCo+KHJhd19kYXRhKCkpOwotfQotCi1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKLSAgdXNpbmcgc3RkOjpzd2FwOyAgLy8gZW5hYmxlIEFETCB3aXRoIGZhbGxiYWNrCi0gIHN3YXAocmVwXy0+ZWxlbWVudHNbaW5kZXgxXSwgcmVwXy0+ZWxlbWVudHNbaW5kZXgyXSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLWlubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7Ci0gIGludCBhbGxvY2F0ZWRfYnl0ZXMgPSB0b3RhbF9zaXplXyAqIHNpemVvZih2b2lkKik7Ci0gIGlmIChyZXBfICE9IE5VTEwpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcF8tPmFsbG9jYXRlZF9zaXplOyArK2kpIHsKLSAgICAgIGFsbG9jYXRlZF9ieXRlcyArPSBUeXBlSGFuZGxlcjo6U3BhY2VVc2VkKAotICAgICAgICAgICpjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpXSkpOwotICAgIH0KLSAgICBhbGxvY2F0ZWRfYnl0ZXMgKz0ga1JlcEhlYWRlclNpemU7Ci0gIH0KLSAgcmV0dXJuIGFsbG9jYXRlZF9ieXRlczsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkRnJvbUNsZWFyZWQoKSB7Ci0gIGlmIChyZXBfICE9IE5VTEwgJiYgY3VycmVudF9zaXplXyA8IHJlcF8tPmFsbG9jYXRlZF9zaXplKSB7Ci0gICAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10pOwotICB9IGVsc2UgewotICAgIHJldHVybiBOVUxMOwotICB9Ci19Ci0KLS8vIEFkZEFsbG9jYXRlZCB2ZXJzaW9uIHRoYXQgaW1wbGVtZW50cyBhcmVuYS1zYWZlIGNvcHlpbmcgYmVoYXZpb3IuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci12b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRBbGxvY2F0ZWRJbnRlcm5hbCgKLSAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUsCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSkgewotICBBcmVuYSogZWxlbWVudF9hcmVuYSA9IHJlaW50ZXJwcmV0X2Nhc3Q8QXJlbmEqPigKLSAgICAgIFR5cGVIYW5kbGVyOjpHZXRNYXliZUFyZW5hUG9pbnRlcih2YWx1ZSkpOwotICBBcmVuYSogYXJlbmEgPSBHZXRBcmVuYU5vVmlydHVhbCgpOwotICBpZiAoYXJlbmEgPT0gZWxlbWVudF9hcmVuYSAmJiByZXBfICYmCi0gICAgICByZXBfLT5hbGxvY2F0ZWRfc2l6ZSA8IHRvdGFsX3NpemVfKSB7Ci0gICAgLy8gRmFzdCBwYXRoOiB1bmRlcmx5aW5nIGFyZW5hIHJlcHJlc2VudGF0aW9uICh0YWdnZWQgcG9pbnRlcikgaXMgZXF1YWwgdG8KLSAgICAvLyBvdXIgYXJlbmEgcG9pbnRlciwgYW5kIHdlIGNhbiBhZGQgdG8gYXJyYXkgd2l0aG91dCByZXNpemluZyBpdCAoYXQgbGVhc3QKLSAgICAvLyBvbmUgc2xvdCB0aGF0IGlzIG5vdCBhbGxvY2F0ZWQpLgotICAgIHZvaWQqKiBlbGVtcyA9IHJlcF8tPmVsZW1lbnRzOwotICAgIGlmIChjdXJyZW50X3NpemVfIDwgcmVwXy0+YWxsb2NhdGVkX3NpemUpIHsKLSAgICAgIC8vIE1ha2Ugc3BhY2UgYXQgW2N1cnJlbnRdIGJ5IG1vdmluZyBmaXJzdCBhbGxvY2F0ZWQgZWxlbWVudCB0byBlbmQgb2YKLSAgICAgIC8vIGFsbG9jYXRlZCBsaXN0LgotICAgICAgZWxlbXNbcmVwXy0+YWxsb2NhdGVkX3NpemVdID0gZWxlbXNbY3VycmVudF9zaXplX107Ci0gICAgfQotICAgIGVsZW1zW2N1cnJlbnRfc2l6ZV9dID0gdmFsdWU7Ci0gICAgY3VycmVudF9zaXplXyA9IGN1cnJlbnRfc2l6ZV8gKyAxOwotICAgIHJlcF8tPmFsbG9jYXRlZF9zaXplID0gcmVwXy0+YWxsb2NhdGVkX3NpemUgKyAxOwotICAgIHJldHVybjsKLSAgfSBlbHNlIHsKLSAgICBBZGRBbGxvY2F0ZWRTbG93V2l0aENvcHk8VHlwZUhhbmRsZXI+KAotICAgICAgICB2YWx1ZSwgVHlwZUhhbmRsZXI6OkdldEFyZW5hKHZhbHVlKSwgYXJlbmEpOwotICB9Ci19Ci0KLS8vIFNsb3dwYXRoIGhhbmRsZXMgYWxsIGNhc2VzLCBjb3B5aW5nIGlmIG5lY2Vzc2FyeS4KLXRlbXBsYXRlPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkQWxsb2NhdGVkU2xvd1dpdGhDb3B5KAotICAgIC8vIFBhc3MgdmFsdWVfYXJlbmEgYW5kIG15X2FyZW5hIHRvIGF2b2lkIGR1cGxpY2F0ZSB2aXJ0dWFsIGNhbGwgKHZhbHVlKSBvcgotICAgIC8vIGxvYWQgKG1pbmUpLgotICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSwgQXJlbmEqIHZhbHVlX2FyZW5hLCBBcmVuYSogbXlfYXJlbmEpIHsKLSAgLy8gRW5zdXJlIHRoYXQgZWl0aGVyIHRoZSB2YWx1ZSBpcyBpbiB0aGUgc2FtZSBhcmVuYSwgb3IgaWYgbm90LCB3ZSBkbyB0aGUKLSAgLy8gYXBwcm9wcmlhdGUgdGhpbmc6IE93bigpIGl0IChpZiBpdCdzIG9uIGhlYXAgYW5kIHdlJ3JlIGluIGFuIGFyZW5hKSBvciBjb3B5Ci0gIC8vIGl0IHRvIG91ciBhcmVuYS9oZWFwIChvdGhlcndpc2UpLgotICBpZiAobXlfYXJlbmEgIT0gTlVMTCAmJiB2YWx1ZV9hcmVuYSA9PSBOVUxMKSB7Ci0gICAgbXlfYXJlbmEtPk93bih2YWx1ZSk7Ci0gIH0gZWxzZSBpZiAobXlfYXJlbmEgIT0gdmFsdWVfYXJlbmEpIHsKLSAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogbmV3X3ZhbHVlID0KLSAgICAgICAgVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUodmFsdWUsIG15X2FyZW5hKTsKLSAgICBUeXBlSGFuZGxlcjo6TWVyZ2UoKnZhbHVlLCBuZXdfdmFsdWUpOwotICAgIFR5cGVIYW5kbGVyOjpEZWxldGUodmFsdWUsIHZhbHVlX2FyZW5hKTsKLSAgICB2YWx1ZSA9IG5ld192YWx1ZTsKLSAgfQotCi0gIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkPFR5cGVIYW5kbGVyPih2YWx1ZSk7Ci19Ci0KLS8vIEFkZEFsbG9jYXRlZCB2ZXJzaW9uIHRoYXQgZG9lcyBub3QgaW1wbGVtZW50IGFyZW5hLXNhZmUgY29weWluZyBiZWhhdmlvci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLXZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZEFsbG9jYXRlZEludGVybmFsKAotICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSwKLSAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZmFsc2VfdHlwZSkgewotICBpZiAocmVwXyAmJiAgcmVwXy0+YWxsb2NhdGVkX3NpemUgPCB0b3RhbF9zaXplXykgewotICAgIC8vIEZhc3QgcGF0aDogdW5kZXJseWluZyBhcmVuYSByZXByZXNlbnRhdGlvbiAodGFnZ2VkIHBvaW50ZXIpIGlzIGVxdWFsIHRvCi0gICAgLy8gb3VyIGFyZW5hIHBvaW50ZXIsIGFuZCB3ZSBjYW4gYWRkIHRvIGFycmF5IHdpdGhvdXQgcmVzaXppbmcgaXQgKGF0IGxlYXN0Ci0gICAgLy8gb25lIHNsb3QgdGhhdCBpcyBub3QgYWxsb2NhdGVkKS4KLSAgICB2b2lkKiogZWxlbXMgPSByZXBfLT5lbGVtZW50czsKLSAgICBpZiAoY3VycmVudF9zaXplXyA8IHJlcF8tPmFsbG9jYXRlZF9zaXplKSB7Ci0gICAgICAvLyBNYWtlIHNwYWNlIGF0IFtjdXJyZW50XSBieSBtb3ZpbmcgZmlyc3QgYWxsb2NhdGVkIGVsZW1lbnQgdG8gZW5kIG9mCi0gICAgICAvLyBhbGxvY2F0ZWQgbGlzdC4KLSAgICAgIGVsZW1zW3JlcF8tPmFsbG9jYXRlZF9zaXplXSA9IGVsZW1zW2N1cnJlbnRfc2l6ZV9dOwotICAgIH0KLSAgICBlbGVtc1tjdXJyZW50X3NpemVfXSA9IHZhbHVlOwotICAgIGN1cnJlbnRfc2l6ZV8gPSBjdXJyZW50X3NpemVfICsgMTsKLSAgICArK3JlcF8tPmFsbG9jYXRlZF9zaXplOwotICAgIHJldHVybjsKLSAgfSBlbHNlIHsKLSAgICBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZDxUeXBlSGFuZGxlcj4odmFsdWUpOwotICB9Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLXZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkKAotICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSkgewotICAvLyBNYWtlIHJvb20gZm9yIHRoZSBuZXcgcG9pbnRlci4KLSAgaWYgKCFyZXBfIHx8IGN1cnJlbnRfc2l6ZV8gPT0gdG90YWxfc2l6ZV8pIHsKLSAgICAvLyBUaGUgYXJyYXkgaXMgY29tcGxldGVseSBmdWxsIHdpdGggbm8gY2xlYXJlZCBvYmplY3RzLCBzbyBncm93IGl0LgotICAgIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKLSAgICArK3JlcF8tPmFsbG9jYXRlZF9zaXplOwotICB9IGVsc2UgaWYgKHJlcF8tPmFsbG9jYXRlZF9zaXplID09IHRvdGFsX3NpemVfKSB7Ci0gICAgLy8gVGhlcmUgaXMgbm8gbW9yZSBzcGFjZSBpbiB0aGUgcG9pbnRlciBhcnJheSBiZWNhdXNlIGl0IGNvbnRhaW5zIHNvbWUKLSAgICAvLyBjbGVhcmVkIG9iamVjdHMgYXdhaXRpbmcgcmV1c2UuICBXZSBkb24ndCB3YW50IHRvIGdyb3cgdGhlIGFycmF5IGluIHRoaXMKLSAgICAvLyBjYXNlIGJlY2F1c2Ugb3RoZXJ3aXNlIGEgbG9vcCBjYWxsaW5nIEFkZEFsbG9jYXRlZCgpIGZvbGxvd2VkIGJ5IENsZWFyKCkKLSAgICAvLyB3b3VsZCBsZWFrIG1lbW9yeS4KLSAgICBUeXBlSGFuZGxlcjo6RGVsZXRlKAotICAgICAgICBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfXSksIGFyZW5hXyk7Ci0gIH0gZWxzZSBpZiAoY3VycmVudF9zaXplXyA8IHJlcF8tPmFsbG9jYXRlZF9zaXplKSB7Ci0gICAgLy8gV2UgaGF2ZSBzb21lIGNsZWFyZWQgb2JqZWN0cy4gIFdlIGRvbid0IGNhcmUgYWJvdXQgdGhlaXIgb3JkZXIsIHNvIHdlCi0gICAgLy8gY2FuIGp1c3QgbW92ZSB0aGUgZmlyc3Qgb25lIHRvIHRoZSBlbmQgdG8gbWFrZSBzcGFjZS4KLSAgICByZXBfLT5lbGVtZW50c1tyZXBfLT5hbGxvY2F0ZWRfc2l6ZV0gPSByZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfXTsKLSAgICArK3JlcF8tPmFsbG9jYXRlZF9zaXplOwotICB9IGVsc2UgewotICAgIC8vIFRoZXJlIGFyZSBubyBjbGVhcmVkIG9iamVjdHMuCi0gICAgKytyZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKLSAgfQotCi0gIHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKLX0KLQotLy8gUmVsZWFzZUxhc3QoKSBmb3IgdHlwZXMgdGhhdCBpbXBsZW1lbnQgbWVyZ2UvY29weSBiZWhhdmlvci4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLWlubGluZSB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSoKLVJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZWxlYXNlTGFzdEludGVybmFsKGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUpIHsKLSAgLy8gRmlyc3QsIHJlbGVhc2UgYW4gZWxlbWVudC4KLSAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHJlc3VsdCA9IFVuc2FmZUFyZW5hUmVsZWFzZUxhc3Q8VHlwZUhhbmRsZXI+KCk7Ci0gIC8vIE5vdyBwZXJmb3JtIGEgY29weSBpZiB3ZSdyZSBvbiBhbiBhcmVuYS4KLSAgQXJlbmEqIGFyZW5hID0gR2V0QXJlbmFOb1ZpcnR1YWwoKTsKLSAgaWYgKGFyZW5hID09IE5VTEwpIHsKLSAgICByZXR1cm4gcmVzdWx0OwotICB9IGVsc2UgewotICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfcmVzdWx0ID0KLSAgICAgICAgVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUocmVzdWx0LCBOVUxMKTsKLSAgICBUeXBlSGFuZGxlcjo6TWVyZ2UoKnJlc3VsdCwgbmV3X3Jlc3VsdCk7Ci0gICAgcmV0dXJuIG5ld19yZXN1bHQ7Ci0gIH0KLX0KLQotLy8gUmVsZWFzZUxhc3QoKSBmb3IgdHlwZXMgdGhhdCAqZG8gbm90KiBpbXBsZW1lbnQgbWVyZ2UvY29weSBiZWhhdmlvciAtLSB0aGlzCi0vLyBpcyB0aGUgc2FtZSBhcyBVbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCkuIE5vdGUgdGhhdCB3ZSBHT09HTEVfRENIRUNLLWZhaWwgaWYgd2UncmUgb24KLS8vIGFuIGFyZW5hLCBzaW5jZSB0aGUgdXNlciByZWFsbHkgc2hvdWxkIGltcGxlbWVudCB0aGUgY29weSBvcGVyYXRpb24gaW4gdGhpcwotLy8gY2FzZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLWlubGluZSB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSoKLVJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZWxlYXNlTGFzdEludGVybmFsKGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBOVUxMKQotICAgICAgPDwgIlJlbGVhc2VMYXN0KCkgY2FsbGVkIG9uIGEgUmVwZWF0ZWRQdHJGaWVsZCB0aGF0IGlzIG9uIGFuIGFyZW5hLCAiCi0gICAgICA8PCAid2l0aCBhIHR5cGUgdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgTWVyZ2VGcm9tLiBUaGlzIGlzIHVuc2FmZTsgIgotICAgICAgPDwgInBsZWFzZSBpbXBsZW1lbnQgTWVyZ2VGcm9tIGZvciB5b3VyIHR5cGUuIjsKLSAgcmV0dXJuIFVuc2FmZUFyZW5hUmVsZWFzZUxhc3Q8VHlwZUhhbmRsZXI+KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLWlubGluZSB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSoKLSAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfR1QoY3VycmVudF9zaXplXywgMCk7Ci0gIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiByZXN1bHQgPQotICAgICAgY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbLS1jdXJyZW50X3NpemVfXSk7Ci0gIC0tcmVwXy0+YWxsb2NhdGVkX3NpemU7Ci0gIGlmIChjdXJyZW50X3NpemVfIDwgcmVwXy0+YWxsb2NhdGVkX3NpemUpIHsKLSAgICAvLyBUaGVyZSBhcmUgY2xlYXJlZCBlbGVtZW50cyBvbiB0aGUgZW5kOyByZXBsYWNlIHRoZSByZW1vdmVkIGVsZW1lbnQKLSAgICAvLyB3aXRoIHRoZSBsYXN0IGFsbG9jYXRlZCBlbGVtZW50LgotICAgIHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV9dID0gcmVwXy0+ZWxlbWVudHNbcmVwXy0+YWxsb2NhdGVkX3NpemVdOwotICB9Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLWlubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsZWFyZWRDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHJlcF8gPyAocmVwXy0+YWxsb2NhdGVkX3NpemUgLSBjdXJyZW50X3NpemVfKSA6IDA7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLWlubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRDbGVhcmVkKAotICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gTlVMTCkKLSAgICAgIDw8ICJBZGRDbGVhcmVkKCkgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlcGVhdGVkUHRyRmllbGQgbm90IG9uIGFuIGFyZW5hLiI7Ci0gIEdPT0dMRV9EQ0hFQ0soVHlwZUhhbmRsZXI6OkdldEFyZW5hKHZhbHVlKSA9PSBOVUxMKQotICAgICAgPDwgIkFkZENsZWFyZWQoKSBjYW4gb25seSBhY2NlcHQgdmFsdWVzIG5vdCBvbiBhbiBhcmVuYS4iOwotICBpZiAoIXJlcF8gfHwgcmVwXy0+YWxsb2NhdGVkX3NpemUgPT0gdG90YWxfc2l6ZV8pIHsKLSAgICBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7Ci0gIH0KLSAgcmVwXy0+ZWxlbWVudHNbcmVwXy0+YWxsb2NhdGVkX3NpemUrK10gPSB2YWx1ZTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUNsZWFyZWQoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBOVUxMKQotICAgICAgPDwgIlJlbGVhc2VDbGVhcmVkKCkgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlcGVhdGVkUHRyRmllbGQgbm90IG9uICIKLSAgICAgIDw8ICJhbiBhcmVuYS4iOwotICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gTlVMTCk7Ci0gIEdPT0dMRV9EQ0hFQ0socmVwXyAhPSBOVUxMKTsKLSAgR09PR0xFX0RDSEVDS19HVChyZXBfLT5hbGxvY2F0ZWRfc2l6ZSwgY3VycmVudF9zaXplXyk7Ci0gIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1stLXJlcF8tPmFsbG9jYXRlZF9zaXplXSk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6VHlwZUhhbmRsZXIKLSAgICA6IHB1YmxpYyBpbnRlcm5hbDo6R2VuZXJpY1R5cGVIYW5kbGVyPEVsZW1lbnQ+IHsKLX07Ci0KLXRlbXBsYXRlIDw+Ci1jbGFzcyBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OlR5cGVIYW5kbGVyCi0gICAgOiBwdWJsaWMgaW50ZXJuYWw6OlN0cmluZ1R5cGVIYW5kbGVyIHsKLX07Ci0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZCgpCi0gIDogUmVwZWF0ZWRQdHJGaWVsZEJhc2UoKSB7fQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZFB0ckZpZWxkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSA6Ci0gIFJlcGVhdGVkUHRyRmllbGRCYXNlKGFyZW5hKSB7fQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZFB0ckZpZWxkKAotICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKQotICA6IFJlcGVhdGVkUHRyRmllbGRCYXNlKCkgewotICBDb3B5RnJvbShvdGhlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+Ci1pbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZCgKLSAgICBJdGVyIGJlZ2luLCBjb25zdCBJdGVyJiBlbmQpIHsKLSAgaW50IHJlc2VydmUgPSBpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZShiZWdpbiwgZW5kKTsKLSAgaWYgKHJlc2VydmUgIT0gLTEpIHsKLSAgICBSZXNlcnZlKHJlc2VydmUpOwotICB9Ci0gIGZvciAoOyBiZWdpbiAhPSBlbmQ7ICsrYmVnaW4pIHsKLSAgICAqQWRkKCkgPSAqYmVnaW47Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojp+UmVwZWF0ZWRQdHJGaWVsZCgpIHsKLSAgRGVzdHJveTxUeXBlSGFuZGxlcj4oKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50PiYgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6b3BlcmF0b3I9KAotICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKSB7Ci0gIGlmICh0aGlzICE9ICZvdGhlcikKLSAgICBDb3B5RnJvbShvdGhlcik7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgYm9vbCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplbXB0eSgpIGNvbnN0IHsKLSAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjplbXB0eSgpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6c2l6ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpzaXplKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIGNvbnN0IEVsZW1lbnQmIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkdldChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpHZXQ8VHlwZUhhbmRsZXI+KGluZGV4KTsKLX0KLQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpNdXRhYmxlKGludCBpbmRleCkgewotICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok11dGFibGU8VHlwZUhhbmRsZXI+KGluZGV4KTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6QWRkKCkgewotICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZDxUeXBlSGFuZGxlcj4oKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZW1vdmVMYXN0KCkgewotICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVtb3ZlTGFzdDxUeXBlSGFuZGxlcj4oKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpEZWxldGVTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0pIHsKLSAgR09PR0xFX0RDSEVDS19HRShzdGFydCwgMCk7Ci0gIEdPT0dMRV9EQ0hFQ0tfR0UobnVtLCAwKTsKLSAgR09PR0xFX0RDSEVDS19MRShzdGFydCArIG51bSwgc2l6ZSgpKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgewotICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpEZWxldGU8VHlwZUhhbmRsZXI+KHN0YXJ0ICsgaSk7Ci0gIH0KLSAgRXh0cmFjdFN1YnJhbmdlKHN0YXJ0LCBudW0sIE5VTEwpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkV4dHJhY3RTdWJyYW5nZSgKLSAgICBpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cykgewotICB0eXBlbmFtZSBpbnRlcm5hbDo6VHlwZUltcGxlbWVudHNNZXJnZUJlaGF2aW9yPAotICAgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGU+Ojp0eXBlIHQ7Ci0gIEV4dHJhY3RTdWJyYW5nZUludGVybmFsKHN0YXJ0LCBudW0sIGVsZW1lbnRzLCB0KTsKLX0KLQotLy8gRXh0cmFjdFN1YnJhbmdlKCkgaW1wbGVtZW50YXRpb24gZm9yIHR5cGVzIHRoYXQgaW1wbGVtZW50IG1lcmdlL2NvcHkKLS8vIGJlaGF2aW9yLgotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpFeHRyYWN0U3VicmFuZ2VJbnRlcm5hbCgKLSAgICBpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cywgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSkgewotICBHT09HTEVfRENIRUNLX0dFKHN0YXJ0LCAwKTsKLSAgR09PR0xFX0RDSEVDS19HRShudW0sIDApOwotICBHT09HTEVfRENIRUNLX0xFKHN0YXJ0ICsgbnVtLCBzaXplKCkpOwotCi0gIGlmIChudW0gPiAwKSB7Ci0gICAgLy8gU2F2ZSB0aGUgdmFsdWVzIG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzIGlmIHJlcXVlc3RlZC4KLSAgICBpZiAoZWxlbWVudHMgIT0gTlVMTCkgewotICAgICAgaWYgKEdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gTlVMTCkgewotICAgICAgICAvLyBJZiB3ZSdyZSBvbiBhbiBhcmVuYSwgd2UgcGVyZm9ybSBhIGNvcHkgZm9yIGVhY2ggZWxlbWVudCBzbyB0aGF0IHRoZQotICAgICAgICAvLyByZXR1cm5lZCBlbGVtZW50cyBhcmUgaGVhcC1hbGxvY2F0ZWQuCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLSAgICAgICAgICBFbGVtZW50KiBlbGVtZW50ID0gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OgotICAgICAgICAgICAgICBNdXRhYmxlPFR5cGVIYW5kbGVyPihpICsgc3RhcnQpOwotICAgICAgICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfdmFsdWUgPQotICAgICAgICAgICAgICBUeXBlSGFuZGxlcjo6TmV3RnJvbVByb3RvdHlwZShlbGVtZW50LCBOVUxMKTsKLSAgICAgICAgICBUeXBlSGFuZGxlcjo6TWVyZ2UoKmVsZW1lbnQsIG5ld192YWx1ZSk7Ci0gICAgICAgICAgZWxlbWVudHNbaV0gPSBuZXdfdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLSAgICAgICAgICBlbGVtZW50c1tpXSA9IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpNdXRhYmxlPFR5cGVIYW5kbGVyPihpICsgc3RhcnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICAgIENsb3NlR2FwKHN0YXJ0LCBudW0pOwotICB9Ci19Ci0KLS8vIEV4dHJhY3RTdWJyYW5nZSgpIGltcGxlbWVudGF0aW9uIGZvciB0eXBlcyB0aGF0IGRvIG5vdCBpbXBsZW1lbnQgbWVyZ2UvY29weQotLy8gYmVoYXZpb3IuCi10ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6RXh0cmFjdFN1YnJhbmdlSW50ZXJuYWwoCi0gICAgaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMsIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlKSB7Ci0gIC8vIFRoaXMgY2FzZSBpcyBpZGVudGljYWwgdG8gVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UoKS4gSG93ZXZlciwgc2luY2UKLSAgLy8gRXh0cmFjdFN1YnJhbmdlKCkgbXVzdCByZXR1cm4gaGVhcC1hbGxvY2F0ZWQgb2JqZWN0cyBieSBjb250cmFjdCwgYW5kIHdlCi0gIC8vIGNhbm5vdCBmdWxmaWxsIHRoaXMgY29udHJhY3QgaWYgd2UgYXJlIGFuIG9uIGFyZW5hLCB3ZSBtdXN0IEdPT0dMRV9EQ0hFQ0soKSB0aGF0Ci0gIC8vIHdlIGFyZSBub3Qgb24gYW4gYXJlbmEuCi0gIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBOVUxMKQotICAgICAgPDwgIkV4dHJhY3RTdWJyYW5nZSgpIHdoZW4gYXJlbmEgaXMgbm9uLU5VTEwgaXMgb25seSBzdXBwb3J0ZWQgd2hlbiAiCi0gICAgICA8PCAidGhlIEVsZW1lbnQgdHlwZSBzdXBwbGllcyBhIE1lcmdlRnJvbSgpIG9wZXJhdGlvbiB0byBtYWtlIGNvcGllcy4iOwotICBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBlbGVtZW50cyk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6VW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2UoCi0gICAgaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMpIHsKLSAgR09PR0xFX0RDSEVDS19HRShzdGFydCwgMCk7Ci0gIEdPT0dMRV9EQ0hFQ0tfR0UobnVtLCAwKTsKLSAgR09PR0xFX0RDSEVDS19MRShzdGFydCArIG51bSwgc2l6ZSgpKTsKLQotICBpZiAobnVtID4gMCkgewotICAgIC8vIFNhdmUgdGhlIHZhbHVlcyBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cyBpZiByZXF1ZXN0ZWQuCi0gICAgaWYgKGVsZW1lbnRzICE9IE5VTEwpIHsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLSAgICAgICAgZWxlbWVudHNbaV0gPSBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oaSArIHN0YXJ0KTsKLSAgICAgIH0KLSAgICB9Ci0gICAgQ2xvc2VHYXAoc3RhcnQsIG51bSk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpDbGVhcigpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsZWFyPFR5cGVIYW5kbGVyPigpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Ok1lcmdlRnJvbSgKLSAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcikgewotICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TWVyZ2VGcm9tPFR5cGVIYW5kbGVyPihvdGhlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Q29weUZyb20oCi0gICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNvcHlGcm9tPFR5cGVIYW5kbGVyPihvdGhlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbikgewotICByZXR1cm4gZXJhc2UocG9zaXRpb24sIHBvc2l0aW9uICsgMSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCkgewotICBzaXplX3R5cGUgcG9zX29mZnNldCA9IHN0ZDo6ZGlzdGFuY2UoY2JlZ2luKCksIGZpcnN0KTsKLSAgc2l6ZV90eXBlIGxhc3Rfb2Zmc2V0ID0gc3RkOjpkaXN0YW5jZShjYmVnaW4oKSwgbGFzdCk7Ci0gIERlbGV0ZVN1YnJhbmdlKHBvc19vZmZzZXQsIGxhc3Rfb2Zmc2V0IC0gcG9zX29mZnNldCk7Ci0gIHJldHVybiBiZWdpbigpICsgcG9zX29mZnNldDsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgRWxlbWVudCoqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Om11dGFibGVfZGF0YSgpIHsKLSAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjptdXRhYmxlX2RhdGE8VHlwZUhhbmRsZXI+KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIGNvbnN0IEVsZW1lbnQqIGNvbnN0KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpkYXRhKCkgY29uc3QgewotICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmRhdGE8VHlwZUhhbmRsZXI+KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6U3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcikgewotICBpZiAodGhpcyA9PSBvdGhlcikKLSAgICByZXR1cm47Ci0gIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTd2FwPFR5cGVIYW5kbGVyPihvdGhlcik7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6VW5zYWZlQXJlbmFTd2FwKAotICAgIFJlcGVhdGVkUHRyRmllbGQqIG90aGVyKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSk7Ci0gIGlmICh0aGlzID09IG90aGVyKQotICAgICAgcmV0dXJuOwotICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6SW50ZXJuYWxTd2FwKG90aGVyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4MikgewotICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgQXJlbmEqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgewotICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkdldEFyZW5hTm9WaXJ0dWFsKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgewotICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGY8VHlwZUhhbmRsZXI+KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6QWRkQWxsb2NhdGVkKEVsZW1lbnQqIHZhbHVlKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRBbGxvY2F0ZWQ8VHlwZUhhbmRsZXI+KHZhbHVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZChFbGVtZW50KiB2YWx1ZSkgewotICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQ8VHlwZUhhbmRsZXI+KHZhbHVlKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVsZWFzZUxhc3QoKSB7Ci0gIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUxhc3Q8VHlwZUhhbmRsZXI+KCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKSB7Ci0gIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6VW5zYWZlQXJlbmFSZWxlYXNlTGFzdDxUeXBlSGFuZGxlcj4oKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkNsZWFyZWRDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcmVkQ291bnQoKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpBZGRDbGVhcmVkKEVsZW1lbnQqIHZhbHVlKSB7Ci0gIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkQ2xlYXJlZDxUeXBlSGFuZGxlcj4odmFsdWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZWxlYXNlQ2xlYXJlZCgpIHsKLSAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZWxlYXNlQ2xlYXJlZDxUeXBlSGFuZGxlcj4oKTsKLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpSZXNlcnZlKGludCBuZXdfc2l6ZSkgewotICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlc2VydmUobmV3X3NpemUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSBpbnQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Q2FwYWNpdHkoKSBjb25zdCB7Ci0gIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6Q2FwYWNpdHkoKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBTVEwtbGlrZSBpdGVyYXRvciBpbXBsZW1lbnRhdGlvbiBmb3IgUmVwZWF0ZWRQdHJGaWVsZC4gIFlvdSBzaG91bGQgbm90Ci0vLyByZWZlciB0byB0aGlzIGNsYXNzIGRpcmVjdGx5OyB1c2UgUmVwZWF0ZWRQdHJGaWVsZDxUPjo6aXRlcmF0b3IgaW5zdGVhZC4KLS8vCi0vLyBUaGUgaXRlcmF0b3IgZm9yIFJlcGVhdGVkUHRyRmllbGQ8VD4sIFJlcGVhdGVkUHRySXRlcmF0b3I8VD4sIGlzCi0vLyB2ZXJ5IHNpbWlsYXIgdG8gaXRlcmF0b3JfcHRyPFQqKj4gaW4gdXRpbC9ndGwvaXRlcmF0b3JfYWRhcHRvcnMuaCwKLS8vIGJ1dCBhZGRzIHJhbmRvbS1hY2Nlc3Mgb3BlcmF0b3JzIGFuZCBpcyBtb2RpZmllZCB0byB3cmFwIGEgdm9pZCoqIGJhc2UKLS8vIGl0ZXJhdG9yIChzaW5jZSBSZXBlYXRlZFB0ckZpZWxkIHN0b3JlcyBpdHMgYXJyYXkgYXMgYSB2b2lkKiBhcnJheSBhbmQKLS8vIGNhc3Rpbmcgdm9pZCoqIHRvIFQqKiB3b3VsZCB2aW9sYXRlIEMrKyBhbGlhc2luZyBydWxlcykuCi0vLwotLy8gVGhpcyBjb2RlIGJhc2VkIG9uIG5ldC9wcm90by9wcm90by1hcnJheS1pbnRlcm5hbC5oIGJ5IEplZmZyZXkgWWFzc2tpbgotLy8gKGp5YXNza2luQGdvb2dsZS5jb20pLgotdGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudD4KLWNsYXNzIFJlcGVhdGVkUHRySXRlcmF0b3IKLSAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPAotICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIEVsZW1lbnQ+IHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVwZWF0ZWRQdHJJdGVyYXRvcjxFbGVtZW50PiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yPAotICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIEVsZW1lbnQ+IHN1cGVyY2xhc3M7Ci0KLSAgLy8gU2hhZG93IHRoZSB2YWx1ZV90eXBlIGluIHN0ZDo6aXRlcmF0b3I8PiBiZWNhdXNlIGNvbnN0X2l0ZXJhdG9yOjp2YWx1ZV90eXBlCi0gIC8vIG5lZWRzIHRvIGJlIFQsIG5vdCBjb25zdCBULgotICB0eXBlZGVmIHR5cGVuYW1lIHJlbW92ZV9jb25zdDxFbGVtZW50Pjo6dHlwZSB2YWx1ZV90eXBlOwotCi0gIC8vIExldCB0aGUgY29tcGlsZXIga25vdyB0aGF0IHRoZXNlIGFyZSB0eXBlIG5hbWVzLCBzbyB3ZSBkb24ndCBoYXZlIHRvCi0gIC8vIHdyaXRlICJ0eXBlbmFtZSIgaW4gZnJvbnQgb2YgdGhlbSBldmVyeXdoZXJlLgotICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyY2xhc3M6OnJlZmVyZW5jZSByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXJjbGFzczo6cG9pbnRlciBwb2ludGVyOwotICB0eXBlZGVmIHR5cGVuYW1lIHN1cGVyY2xhc3M6OmRpZmZlcmVuY2VfdHlwZSBkaWZmZXJlbmNlX3R5cGU7Ci0KLSAgUmVwZWF0ZWRQdHJJdGVyYXRvcigpIDogaXRfKE5VTEwpIHt9Ci0gIGV4cGxpY2l0IFJlcGVhdGVkUHRySXRlcmF0b3Iodm9pZCogY29uc3QqIGl0KSA6IGl0XyhpdCkge30KLQotICAvLyBBbGxvdyAidXBjYXN0aW5nIiBmcm9tIFJlcGVhdGVkUHRySXRlcmF0b3I8VCoqPiB0bwotICAvLyBSZXBlYXRlZFB0ckl0ZXJhdG9yPGNvbnN0IFQqY29uc3QqPi4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJFbGVtZW50PgotICBSZXBlYXRlZFB0ckl0ZXJhdG9yKGNvbnN0IFJlcGVhdGVkUHRySXRlcmF0b3I8T3RoZXJFbGVtZW50PiYgb3RoZXIpCi0gICAgICA6IGl0XyhvdGhlci5pdF8pIHsKLSAgICAvLyBGb3JjZSBhIGNvbXBpbGVyIGVycm9yIGlmIHRoZSBvdGhlciB0eXBlIGlzIG5vdCBjb252ZXJ0aWJsZSB0byBvdXJzLgotICAgIGlmIChmYWxzZSkgewotICAgICAgaW1wbGljaXRfY2FzdDxFbGVtZW50KiwgT3RoZXJFbGVtZW50Kj4oMCk7Ci0gICAgfQotICB9Ci0KLSAgLy8gZGVyZWZlcmVuY2VhYmxlCi0gIHJlZmVyZW5jZSBvcGVyYXRvciooKSBjb25zdCB7IHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxFbGVtZW50Kj4oKml0Xyk7IH0KLSAgcG9pbnRlciAgIG9wZXJhdG9yLT4oKSBjb25zdCB7IHJldHVybiAmKG9wZXJhdG9yKigpKTsgfQotCi0gIC8vIHtpbmMsZGVjfXJlbWVudGFibGUKLSAgaXRlcmF0b3ImIG9wZXJhdG9yKysoKSB7ICsraXRfOyByZXR1cm4gKnRoaXM7IH0KLSAgaXRlcmF0b3IgIG9wZXJhdG9yKysoaW50KSB7IHJldHVybiBpdGVyYXRvcihpdF8rKyk7IH0KLSAgaXRlcmF0b3ImIG9wZXJhdG9yLS0oKSB7IC0taXRfOyByZXR1cm4gKnRoaXM7IH0KLSAgaXRlcmF0b3IgIG9wZXJhdG9yLS0oaW50KSB7IHJldHVybiBpdGVyYXRvcihpdF8tLSk7IH0KLQotICAvLyBlcXVhbGl0eV9jb21wYXJhYmxlCi0gIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfID09IHguaXRfOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfICE9IHguaXRfOyB9Ci0KLSAgLy8gbGVzc190aGFuX2NvbXBhcmFibGUKLSAgYm9vbCBvcGVyYXRvcjwoY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA8IHguaXRfOyB9Ci0gIGJvb2wgb3BlcmF0b3I8PShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfIDw9IHguaXRfOyB9Ci0gIGJvb2wgb3BlcmF0b3I+KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPiB4Lml0XzsgfQotICBib29sIG9wZXJhdG9yPj0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA+PSB4Lml0XzsgfQotCi0gIC8vIGFkZGFibGUsIHN1YnRyYWN0YWJsZQotICBpdGVyYXRvciYgb3BlcmF0b3IrPShkaWZmZXJlbmNlX3R5cGUgZCkgewotICAgIGl0XyArPSBkOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGl0ZXJhdG9yIGl0LCBjb25zdCBkaWZmZXJlbmNlX3R5cGUgZCkgewotICAgIGl0ICs9IGQ7Ci0gICAgcmV0dXJuIGl0OwotICB9Ci0gIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvcisoY29uc3QgZGlmZmVyZW5jZV90eXBlIGQsIGl0ZXJhdG9yIGl0KSB7Ci0gICAgaXQgKz0gZDsKLSAgICByZXR1cm4gaXQ7Ci0gIH0KLSAgaXRlcmF0b3ImIG9wZXJhdG9yLT0oZGlmZmVyZW5jZV90eXBlIGQpIHsKLSAgICBpdF8gLT0gZDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yLShpdGVyYXRvciBpdCwgZGlmZmVyZW5jZV90eXBlIGQpIHsKLSAgICBpdCAtPSBkOwotICAgIHJldHVybiBpdDsKLSAgfQotCi0gIC8vIGluZGV4YWJsZQotICByZWZlcmVuY2Ugb3BlcmF0b3JbXShkaWZmZXJlbmNlX3R5cGUgZCkgY29uc3QgeyByZXR1cm4gKigqdGhpcyArIGQpOyB9Ci0KLSAgLy8gcmFuZG9tIGFjY2VzcyBpdGVyYXRvcgotICBkaWZmZXJlbmNlX3R5cGUgb3BlcmF0b3ItKGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gLSB4Lml0XzsgfQotCi0gcHJpdmF0ZToKLSAgdGVtcGxhdGU8dHlwZW5hbWUgT3RoZXJFbGVtZW50PgotICBmcmllbmQgY2xhc3MgUmVwZWF0ZWRQdHJJdGVyYXRvcjsKLQotICAvLyBUaGUgaW50ZXJuYWwgaXRlcmF0b3IuCi0gIHZvaWQqIGNvbnN0KiBpdF87Ci19OwotCi0vLyBQcm92aWRlIGFuIGl0ZXJhdG9yIHRoYXQgb3BlcmF0ZXMgb24gcG9pbnRlcnMgdG8gdGhlIHVuZGVybHlpbmcgb2JqZWN0cwotLy8gcmF0aGVyIHRoYW4gdGhlIG9iamVjdHMgdGhlbXNlbHZlcyBhcyBSZXBlYXRlZFB0ckl0ZXJhdG9yIGRvZXMuCi0vLyBDb25zaWRlciB1c2luZyB0aGlzIHdoZW4gd29ya2luZyB3aXRoIHN0bCBhbGdvcml0aG1zIHRoYXQgY2hhbmdlCi0vLyB0aGUgYXJyYXkuCi0vLyBUaGUgVm9pZFB0ciB0ZW1wbGF0ZSBwYXJhbWV0ZXIgaG9sZHMgdGhlIHR5cGUtYWdub3N0aWMgcG9pbnRlciB2YWx1ZQotLy8gcmVmZXJlbmNlZCBieSB0aGUgaXRlcmF0b3IuICBJdCBzaG91bGQgZWl0aGVyIGJlICJ2b2lkICoiIGZvciBhIG11dGFibGUKLS8vIGl0ZXJhdG9yLCBvciAiY29uc3Qgdm9pZCAqIiBmb3IgYSBjb25zdGFudCBpdGVyYXRvci4KLXRlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnQsIHR5cGVuYW1lIFZvaWRQdHI+Ci1jbGFzcyBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3IKLSAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIEVsZW1lbnQqPiB7Ci0gcHVibGljOgotICB0eXBlZGVmIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxFbGVtZW50LCBWb2lkUHRyPiBpdGVyYXRvcjsKLSAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yPAotICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIEVsZW1lbnQqPiBzdXBlcmNsYXNzOwotCi0gIC8vIFNoYWRvdyB0aGUgdmFsdWVfdHlwZSBpbiBzdGQ6Oml0ZXJhdG9yPD4gYmVjYXVzZSBjb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZQotICAvLyBuZWVkcyB0byBiZSBULCBub3QgY29uc3QgVC4KLSAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8RWxlbWVudCo+Ojp0eXBlIHZhbHVlX3R5cGU7Ci0KLSAgLy8gTGV0IHRoZSBjb21waWxlciBrbm93IHRoYXQgdGhlc2UgYXJlIHR5cGUgbmFtZXMsIHNvIHdlIGRvbid0IGhhdmUgdG8KLSAgLy8gd3JpdGUgInR5cGVuYW1lIiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCi0gIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXJjbGFzczo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKLSAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpwb2ludGVyIHBvaW50ZXI7Ci0gIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXJjbGFzczo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKLQotICBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3IoKSA6IGl0XyhOVUxMKSB7fQotICBleHBsaWNpdCBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3IoVm9pZFB0ciogaXQpIDogaXRfKGl0KSB7fQotCi0gIC8vIGRlcmVmZXJlbmNlYWJsZQotICByZWZlcmVuY2Ugb3BlcmF0b3IqKCkgY29uc3QgeyByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8RWxlbWVudCoqPihpdF8pOyB9Ci0gIHBvaW50ZXIgICBvcGVyYXRvci0+KCkgY29uc3QgeyByZXR1cm4gJihvcGVyYXRvciooKSk7IH0KLQotICAvLyB7aW5jLGRlY31yZW1lbnRhYmxlCi0gIGl0ZXJhdG9yJiBvcGVyYXRvcisrKCkgeyArK2l0XzsgcmV0dXJuICp0aGlzOyB9Ci0gIGl0ZXJhdG9yICBvcGVyYXRvcisrKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfKyspOyB9Ci0gIGl0ZXJhdG9yJiBvcGVyYXRvci0tKCkgeyAtLWl0XzsgcmV0dXJuICp0aGlzOyB9Ci0gIGl0ZXJhdG9yICBvcGVyYXRvci0tKGludCkgeyByZXR1cm4gaXRlcmF0b3IoaXRfLS0pOyB9Ci0KLSAgLy8gZXF1YWxpdHlfY29tcGFyYWJsZQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA9PSB4Lml0XzsgfQotICBib29sIG9wZXJhdG9yIT0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyAhPSB4Lml0XzsgfQotCi0gIC8vIGxlc3NfdGhhbl9jb21wYXJhYmxlCi0gIGJvb2wgb3BlcmF0b3I8KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPCB4Lml0XzsgfQotICBib29sIG9wZXJhdG9yPD0oY29uc3QgaXRlcmF0b3ImIHgpIGNvbnN0IHsgcmV0dXJuIGl0XyA8PSB4Lml0XzsgfQotICBib29sIG9wZXJhdG9yPihjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfID4geC5pdF87IH0KLSAgYm9vbCBvcGVyYXRvcj49KGNvbnN0IGl0ZXJhdG9yJiB4KSBjb25zdCB7IHJldHVybiBpdF8gPj0geC5pdF87IH0KLQotICAvLyBhZGRhYmxlLCBzdWJ0cmFjdGFibGUKLSAgaXRlcmF0b3ImIG9wZXJhdG9yKz0oZGlmZmVyZW5jZV90eXBlIGQpIHsKLSAgICBpdF8gKz0gZDsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgZnJpZW5kIGl0ZXJhdG9yIG9wZXJhdG9yKyhpdGVyYXRvciBpdCwgZGlmZmVyZW5jZV90eXBlIGQpIHsKLSAgICBpdCArPSBkOwotICAgIHJldHVybiBpdDsKLSAgfQotICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGRpZmZlcmVuY2VfdHlwZSBkLCBpdGVyYXRvciBpdCkgewotICAgIGl0ICs9IGQ7Ci0gICAgcmV0dXJuIGl0OwotICB9Ci0gIGl0ZXJhdG9yJiBvcGVyYXRvci09KGRpZmZlcmVuY2VfdHlwZSBkKSB7Ci0gICAgaXRfIC09IGQ7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvci0oaXRlcmF0b3IgaXQsIGRpZmZlcmVuY2VfdHlwZSBkKSB7Ci0gICAgaXQgLT0gZDsKLSAgICByZXR1cm4gaXQ7Ci0gIH0KLQotICAvLyBpbmRleGFibGUKLSAgcmVmZXJlbmNlIG9wZXJhdG9yW10oZGlmZmVyZW5jZV90eXBlIGQpIGNvbnN0IHsgcmV0dXJuICooKnRoaXMgKyBkKTsgfQotCi0gIC8vIHJhbmRvbSBhY2Nlc3MgaXRlcmF0b3IKLSAgZGlmZmVyZW5jZV90eXBlIG9wZXJhdG9yLShjb25zdCBpdGVyYXRvciYgeCkgY29uc3QgeyByZXR1cm4gaXRfIC0geC5pdF87IH0KLQotIHByaXZhdGU6Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIE90aGVyRWxlbWVudD4KLSAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkUHRySXRlcmF0b3I7Ci0KLSAgLy8gVGhlIGludGVybmFsIGl0ZXJhdG9yLgotICBWb2lkUHRyKiBpdF87Ci19OwotCi12b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpJbnRlcm5hbFN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7Ci0gIHN0ZDo6c3dhcChyZXBfLCBvdGhlci0+cmVwXyk7Ci0gIHN0ZDo6c3dhcChjdXJyZW50X3NpemVfLCBvdGhlci0+Y3VycmVudF9zaXplXyk7Ci0gIHN0ZDo6c3dhcCh0b3RhbF9zaXplXywgb3RoZXItPnRvdGFsX3NpemVfKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIHsKLSAgcmV0dXJuIGl0ZXJhdG9yKHJhd19kYXRhKCkpOwotfQotdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci1pbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKLVJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmJlZ2luKCkgY29uc3QgewotICByZXR1cm4gaXRlcmF0b3IocmF3X2RhdGEoKSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgotUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y2JlZ2luKCkgY29uc3QgewotICByZXR1cm4gYmVnaW4oKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplbmQoKSB7Ci0gIHJldHVybiBpdGVyYXRvcihyYXdfZGF0YSgpICsgc2l6ZSgpKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplbmQoKSBjb25zdCB7Ci0gIHJldHVybiBpdGVyYXRvcihyYXdfZGF0YSgpICsgc2l6ZSgpKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpjZW5kKCkgY29uc3QgewotICByZXR1cm4gZW5kKCk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OnBvaW50ZXJfaXRlcmF0b3IKLVJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OnBvaW50ZXJfYmVnaW4oKSB7Ci0gIHJldHVybiBwb2ludGVyX2l0ZXJhdG9yKHJhd19tdXRhYmxlX2RhdGEoKSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2JlZ2luKCkgY29uc3QgewotICByZXR1cm4gY29uc3RfcG9pbnRlcl9pdGVyYXRvcihjb25zdF9jYXN0PGNvbnN0IHZvaWQqKj4ocmF3X211dGFibGVfZGF0YSgpKSk7Ci19Ci10ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLWlubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2l0ZXJhdG9yCi1SZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2VuZCgpIHsKLSAgcmV0dXJuIHBvaW50ZXJfaXRlcmF0b3IocmF3X211dGFibGVfZGF0YSgpICsgc2l6ZSgpKTsKLX0KLXRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IKLVJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OnBvaW50ZXJfZW5kKCkgY29uc3QgewotICByZXR1cm4gY29uc3RfcG9pbnRlcl9pdGVyYXRvcigKLSAgICAgIGNvbnN0X2Nhc3Q8Y29uc3Qgdm9pZCoqPihyYXdfbXV0YWJsZV9kYXRhKCkgKyBzaXplKCkpKTsKLX0KLQotCi0vLyBJdGVyYXRvcnMgYW5kIGhlbHBlciBmdW5jdGlvbnMgdGhhdCBmb2xsb3cgdGhlIHNwaXJpdCBvZiB0aGUgU1RMCi0vLyBzdGQ6OmJhY2tfaW5zZXJ0X2l0ZXJhdG9yIGFuZCBzdGQ6OmJhY2tfaW5zZXJ0ZXIgYnV0IGFyZSB0YWlsb3ItbWFkZQotLy8gZm9yIFJlcGVhdGVkRmllbGQgYW5kIFJlcGVhdGVkUHRyRmllbGQuIFR5cGljYWwgdXNhZ2Ugd291bGQgYmU6Ci0vLwotLy8gICBzdGQ6OmNvcHkoc29tZV9zZXF1ZW5jZS5iZWdpbigpLCBzb21lX3NlcXVlbmNlLmVuZCgpLAotLy8gICAgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihwcm90by5tdXRhYmxlX3NlcXVlbmNlKCkpKTsKLS8vCi0vLyBQb3J0ZWQgYnkgam9oYW5uZXMgZnJvbSB1dGlsL2d0bC9wcm90by1hcnJheS1pdGVyYXRvcnMuaAotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotLy8gQSBiYWNrIGluc2VydGVyIGZvciBSZXBlYXRlZEZpZWxkIG9iamVjdHMuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBjbGFzcyBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yCi0gICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIFQ+IHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IoCi0gICAgICBSZXBlYXRlZEZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKQotICAgICAgOiBmaWVsZF8obXV0YWJsZV9maWVsZCkgewotICB9Ci0gIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yPShjb25zdCBUJiB2YWx1ZSkgewotICAgIGZpZWxkXy0+QWRkKHZhbHVlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKGludCAvKiB1bnVzZWQgKi8pIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIFJlcGVhdGVkRmllbGQ8VD4qIGZpZWxkXzsKLX07Ci0KLS8vIEEgYmFjayBpbnNlcnRlciBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBvYmplY3RzLgotdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcgotICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpvdXRwdXRfaXRlcmF0b3JfdGFnLCBUPiB7Ci0gcHVibGljOgotICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yKAotICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkKLSAgICAgIDogZmllbGRfKG11dGFibGVfZmllbGQpIHsKLSAgfQotICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oY29uc3QgVCYgdmFsdWUpIHsKLSAgICAqZmllbGRfLT5BZGQoKSA9IHZhbHVlOwotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcj0oCi0gICAgICBjb25zdCBUKiBjb25zdCBwdHJfdG9fdmFsdWUpIHsKLSAgICAqZmllbGRfLT5BZGQoKSA9ICpwdHJfdG9fdmFsdWU7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKigpIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKyhpbnQgLyogdW51c2VkICovKSB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0KLSBwcml2YXRlOgotICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBmaWVsZF87Ci19OwotCi0vLyBBIGJhY2sgaW5zZXJ0ZXIgZm9yIFJlcGVhdGVkUHRyRmllbGRzIHRoYXQgaW5zZXJ0cyBieSB0cmFuc2ZlcmluZyBvd25lcnNoaXAKLS8vIG9mIGEgcG9pbnRlci4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IKLSAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgVD4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcigKLSAgICAgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpCi0gICAgICA6IGZpZWxkXyhtdXRhYmxlX2ZpZWxkKSB7Ci0gIH0KLSAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3I9KAotICAgICAgVCogY29uc3QgcHRyX3RvX3ZhbHVlKSB7Ci0gICAgZmllbGRfLT5BZGRBbGxvY2F0ZWQocHRyX3RvX3ZhbHVlKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLSAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKAotICAgICAgaW50IC8qIHVudXNlZCAqLykgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotCi0gcHJpdmF0ZToKLSAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogZmllbGRfOwotfTsKLQotLy8gQWxtb3N0IGlkZW50aWNhbCB0byBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yLiBUaGlzIG9uZQotLy8gdXNlcyB0aGUgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQgaW5zdGVhZC4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1jbGFzcyBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3IKLSAgICA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6b3V0cHV0X2l0ZXJhdG9yX3RhZywgVD4gewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yKAotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkKLSAgOiBmaWVsZF8obXV0YWJsZV9maWVsZCkgewotICB9Ci0gIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3I9KAotICAgIFQgY29uc3QqIGNvbnN0IHB0cl90b192YWx1ZSkgewotICAgIGZpZWxkXy0+VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQoY29uc3RfY2FzdDxUKj4ocHRyX3RvX3ZhbHVlKSk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IqKCkgewotICAgIHJldHVybiAqdGhpczsKLSAgfQotICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoKSB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygKLSAgICAgIGludCAvKiB1bnVzZWQgKi8pIHsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDxUPiogZmllbGRfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFByb3ZpZGVzIGEgYmFjayBpbnNlcnQgaXRlcmF0b3IgZm9yIFJlcGVhdGVkRmllbGQgaW5zdGFuY2VzLAotLy8gc2ltaWxhciB0byBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKS4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IGludGVybmFsOjpSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+Ci1SZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKFJlcGVhdGVkRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpIHsKLSAgcmV0dXJuIGludGVybmFsOjpSZXBlYXRlZEZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+KG11dGFibGVfZmllbGQpOwotfQotCi0vLyBQcm92aWRlcyBhIGJhY2sgaW5zZXJ0IGl0ZXJhdG9yIGZvciBSZXBlYXRlZFB0ckZpZWxkIGluc3RhbmNlcywKLS8vIHNpbWlsYXIgdG8gc3RkOjpiYWNrX2luc2VydGVyKCkuCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPgotUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcihSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPihtdXRhYmxlX2ZpZWxkKTsKLX0KLQotLy8gU3BlY2lhbCBiYWNrIGluc2VydCBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBpbnN0YW5jZXMsIGp1c3QgaW4KLS8vIGNhc2Ugc29tZW9uZSB3YW50cyB0byB3cml0ZSBnZW5lcmljIHRlbXBsYXRlIGNvZGUgdGhhdCBjYW4gYWNjZXNzIGJvdGgKLS8vIFJlcGVhdGVkRmllbGRzIGFuZCBSZXBlYXRlZFB0ckZpZWxkcyB1c2luZyBhIGNvbW1vbiBuYW1lLgotdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4KLVJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIoUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkgewotICByZXR1cm4gaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4obXV0YWJsZV9maWVsZCk7Ci19Ci0KLS8vIFByb3ZpZGVzIGEgYmFjayBpbnNlcnQgaXRlcmF0b3IgZm9yIFJlcGVhdGVkUHRyRmllbGQgaW5zdGFuY2VzCi0vLyBzaW1pbGFyIHRvIHN0ZDo6YmFja19pbnNlcnRlcigpIHdoaWNoIHRyYW5zZmVycyB0aGUgb3duZXJzaGlwIHdoaWxlCi0vLyBjb3B5aW5nIGVsZW1lbnRzLgotdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50ZXJuYWw6OkFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4KLUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCi0gICAgUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkgewotICByZXR1cm4gaW50ZXJuYWw6OkFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4oCi0gICAgICBtdXRhYmxlX2ZpZWxkKTsKLX0KLQotLy8gU2ltaWxhciB0byBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyLCB1c2luZwotLy8gVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQgaW5zdGVhZCBvZiBBZGRBbGxvY2F0ZWQuCi0vLyBUaGlzIGlzIHNsaWdodGx5IGZhc3RlciBpZiB0aGF0IG1hdHRlcnMuIEl0IGlzIGFsc28gdXNlZnVsIGluIGxlZ2FjeSBjb2RlCi0vLyB0aGF0IHVzZXMgdGVtcG9yYXJ5IG93bmVyc2hpcCB0byBhdm9pZCBjb3BpZXMuIEV4YW1wbGU6Ci0vLyBSZXBlYXRlZFB0ckZpZWxkPFQ+IHRlbXBfZmllbGQ7Ci0vLyB0ZW1wX2ZpZWxkLkFkZEFsbG9jYXRlZChuZXcgVCk7Ci0vLyAuLi4gLy8gRG8gc29tZXRoaW5nIHdpdGggdGVtcF9maWVsZAotLy8gdGVtcF9maWVsZC5FeHRyYWN0U3VicmFuZ2UoMCwgdGVtcF9maWVsZC5zaXplKCksIE5VTEwpOwotLy8gSWYgeW91IHB1dCB0ZW1wX2ZpZWxkIG9uIHRoZSBhcmVuYSB0aGlzIGZhaWxzLCBiZWNhdXNlIHRoZSBvd25lcnNoaXAKLS8vIHRyYW5zZmVycyB0byB0aGUgYXJlbmEgYXQgdGhlICJBZGRBbGxvY2F0ZWQiIGNhbGwgYW5kIGlzIG5vdCByZWxlYXNlZCBhbnltb3JlCi0vLyBjYXVzaW5nIGEgZG91YmxlIGRlbGV0ZS4gVXNpbmcgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQgcHJldmVudHMgdGhpcy4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1pbnRlcm5hbDo6VW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+Ci1VbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKSB7Ci0gIHJldHVybiBpbnRlcm5hbDo6VW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+KAotICAgICAgbXV0YWJsZV9maWVsZCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9GSUVMRF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzOWIyNGIzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTY2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUT0RPKGtlbnRvbik6ICBJbXByb3ZlIHRoaXMgdW5pdHRlc3QgdG8gYnJpbmcgaXQgdXAgdG8gdGhlIHN0YW5kYXJkcyBvZgotLy8gICBvdGhlciBwcm90bzIgdW5pdHRlc3RzLgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxsaXN0PgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci11c2luZyBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzOwotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHsKLQotLy8gVGVzdCBvcGVyYXRpb25zIG9uIGEgc21hbGwgUmVwZWF0ZWRGaWVsZC4KLVRFU1QoUmVwZWF0ZWRGaWVsZCwgU21hbGwpIHsKLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOwotCi0gIEVYUEVDVF9UUlVFKGZpZWxkLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAwKTsKLQotICBmaWVsZC5BZGQoNSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxKTsKLSAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7Ci0KLSAgZmllbGQuQWRkKDQyKTsKLQotICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDIpOwotICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCA1KTsKLSAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgNDIpOwotCi0gIGZpZWxkLlNldCgxLCAyMyk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKLSAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7Ci0gIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksIDIzKTsKLQotICBmaWVsZC5SZW1vdmVMYXN0KCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxKTsKLSAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7Ci0KLSAgZmllbGQuQ2xlYXIoKTsKLQotICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7Ci0gIC8vIEFkZGl0aW9uYWwgYnl0ZXMgYXJlIGZvciAnc3RydWN0IFJlcCcgaGVhZGVyLgotICBpbnQgZXhwZWN0ZWRfdXNhZ2UgPSA0ICogc2l6ZW9mKGludCkgKyBzaXplb2YoQXJlbmEqKTsKLSAgRVhQRUNUX0VRKGZpZWxkLlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSwgZXhwZWN0ZWRfdXNhZ2UpOwotfQotCi0KLS8vIFRlc3Qgb3BlcmF0aW9ucyBvbiBhIFJlcGVhdGVkRmllbGQgd2hpY2ggaXMgbGFyZ2UgZW5vdWdoIHRvIGFsbG9jYXRlIGEKLS8vIHNlcGFyYXRlIGFycmF5LgotVEVTVChSZXBlYXRlZEZpZWxkLCBMYXJnZSkgewotICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgZmllbGQuQWRkKGkgKiBpKTsKLSAgfQotCi0gIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMTYpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSksIGkgKiBpKTsKLSAgfQotCi0gIGludCBleHBlY3RlZF91c2FnZSA9IDE2ICogc2l6ZW9mKGludCk7Ci0gIEVYUEVDVF9HRShmaWVsZC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCksIGV4cGVjdGVkX3VzYWdlKTsKLX0KLQotLy8gVGVzdCBzd2FwcGluZyBiZXR3ZWVuIHZhcmlvdXMgdHlwZXMgb2YgUmVwZWF0ZWRGaWVsZHMuCi1URVNUKFJlcGVhdGVkRmllbGQsIFN3YXBTbWFsbFNtYWxsKSB7Ci0gIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDE7Ci0gIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDI7Ci0KLSAgZmllbGQxLkFkZCg1KTsKLSAgZmllbGQxLkFkZCg0Mik7Ci0KLSAgRVhQRUNUX0ZBTFNFKGZpZWxkMS5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDIpOwotICBFWFBFQ1RfRVEoZmllbGQxLkdldCgwKSwgNSk7Ci0gIEVYUEVDVF9FUShmaWVsZDEuR2V0KDEpLCA0Mik7Ci0KLSAgRVhQRUNUX1RSVUUoZmllbGQyLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMCk7Ci0KLSAgZmllbGQxLlN3YXAoJmZpZWxkMik7Ci0KLSAgRVhQRUNUX1RSVUUoZmllbGQxLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMCk7Ci0KLSAgRVhQRUNUX0ZBTFNFKGZpZWxkMi5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDIpOwotICBFWFBFQ1RfRVEoZmllbGQyLkdldCgwKSwgNSk7Ci0gIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCA0Mik7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRGaWVsZCwgU3dhcExhcmdlU21hbGwpIHsKLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMTsKLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkMjsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICBmaWVsZDEuQWRkKGkgKiBpKTsKLSAgfQotICBmaWVsZDIuQWRkKDUpOwotICBmaWVsZDIuQWRkKDQyKTsKLSAgZmllbGQxLlN3YXAoJmZpZWxkMik7Ci0KLSAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDIpOwotICBFWFBFQ1RfRVEoZmllbGQxLkdldCgwKSwgNSk7Ci0gIEVYUEVDVF9FUShmaWVsZDEuR2V0KDEpLCA0Mik7Ci0gIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxNik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpLCBpICogaSk7Ci0gIH0KLX0KLQotVEVTVChSZXBlYXRlZEZpZWxkLCBTd2FwTGFyZ2VMYXJnZSkgewotICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQxOwotICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQyOwotCi0gIGZpZWxkMS5BZGQoNSk7Ci0gIGZpZWxkMS5BZGQoNDIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICBmaWVsZDEuQWRkKGkpOwotICAgIGZpZWxkMi5BZGQoaSAqIGkpOwotICB9Ci0gIGZpZWxkMi5Td2FwKCZmaWVsZDEpOwotCi0gIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAxNik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIEVYUEVDVF9FUShmaWVsZDEuR2V0KGkpLCBpICogaSk7Ci0gIH0KLSAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDE4KTsKLSAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMCksIDUpOwotICBFWFBFQ1RfRVEoZmllbGQyLkdldCgxKSwgNDIpOwotICBmb3IgKGludCBpID0gMjsgaSA8IDE4OyBpKyspIHsKLSAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKSwgaSAtIDIpOwotICB9Ci19Ci0KLS8vIERldGVybWluZXMgaG93IG11Y2ggc3BhY2Ugd2FzIHJlc2VydmVkIGJ5IHRoZSBnaXZlbiBmaWVsZCBieSBhZGRpbmcgZWxlbWVudHMKLS8vIHRvIGl0IHVudGlsIGl0IHJlLWFsbG9jYXRlcyBpdHMgc3BhY2UuCi1zdGF0aWMgaW50IFJlc2VydmVkU3BhY2UoUmVwZWF0ZWRGaWVsZDxpbnQ+KiBmaWVsZCkgewotICBjb25zdCBpbnQqIHB0ciA9IGZpZWxkLT5kYXRhKCk7Ci0gIGRvIHsKLSAgICBmaWVsZC0+QWRkKDApOwotICB9IHdoaWxlIChmaWVsZC0+ZGF0YSgpID09IHB0cik7Ci0KLSAgcmV0dXJuIGZpZWxkLT5zaXplKCkgLSAxOwotfQotCi1URVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVNb3JlVGhhbkRvdWJsZSkgewotICAvLyBSZXNlcnZlIG1vcmUgdGhhbiBkb3VibGUgdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQotICAvLyBmaWVsZCB0byByZXNlcnZlIGV4YWN0bHkgdGhlIGFtb3VudCBzcGVjaWZpZWQuCi0gIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKLSAgZmllbGQuUmVzZXJ2ZSgyMCk7Ci0KLSAgRVhQRUNUX0VRKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOwotfQotCi1URVNUKFJlcGVhdGVkRmllbGQsIFJlc2VydmVMZXNzVGhhbkRvdWJsZSkgewotICAvLyBSZXNlcnZlIGxlc3MgdGhhbiBkb3VibGUgdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQotICAvLyBmaWVsZCB0byBncm93IGJ5IGRvdWJsZSBpbnN0ZWFkLgotICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7Ci0gIGZpZWxkLlJlc2VydmUoMjApOwotICBmaWVsZC5SZXNlcnZlKDMwKTsKLQotICBFWFBFQ1RfRVEoNDAsIFJlc2VydmVkU3BhY2UoJmZpZWxkKSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRGaWVsZCwgUmVzZXJ2ZUxlc3NUaGFuRXhpc3RpbmcpIHsKLSAgLy8gUmVzZXJ2ZSBsZXNzIHRoYW4gdGhlIHByZXZpb3VzIHNwYWNlIGluIHRoZSBmaWVsZCBhbmQgZXhwZWN0IHRoZQotICAvLyBmaWVsZCB0byBub3QgcmUtYWxsb2NhdGUgYXQgYWxsLgotICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7Ci0gIGZpZWxkLlJlc2VydmUoMjApOwotICBjb25zdCBpbnQqIHByZXZpb3VzX3B0ciA9IGZpZWxkLmRhdGEoKTsKLSAgZmllbGQuUmVzZXJ2ZSgxMCk7Ci0KLSAgRVhQRUNUX0VRKHByZXZpb3VzX3B0ciwgZmllbGQuZGF0YSgpKTsKLSAgRVhQRUNUX0VRKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOwotfQotCi1URVNUKFJlcGVhdGVkRmllbGQsIFJlc2l6ZSkgewotICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7Ci0gIGZpZWxkLlJlc2l6ZSgyLCAxKTsKLSAgRVhQRUNUX0VRKDIsIGZpZWxkLnNpemUoKSk7Ci0gIGZpZWxkLlJlc2l6ZSg1LCAyKTsKLSAgRVhQRUNUX0VRKDUsIGZpZWxkLnNpemUoKSk7Ci0gIGZpZWxkLlJlc2l6ZSg0LCAzKTsKLSAgQVNTRVJUX0VRKDQsIGZpZWxkLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgxLCBmaWVsZC5HZXQoMCkpOwotICBFWFBFQ1RfRVEoMSwgZmllbGQuR2V0KDEpKTsKLSAgRVhQRUNUX0VRKDIsIGZpZWxkLkdldCgyKSk7Ci0gIEVYUEVDVF9FUSgyLCBmaWVsZC5HZXQoMykpOwotICBmaWVsZC5SZXNpemUoMCwgNCk7Ci0gIEVYUEVDVF9UUlVFKGZpZWxkLmVtcHR5KCkpOwotfQotCi1URVNUKFJlcGVhdGVkRmllbGQsIE1lcmdlRnJvbSkgewotICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCBkZXN0aW5hdGlvbjsKLSAgc291cmNlLkFkZCg0KTsKLSAgc291cmNlLkFkZCg1KTsKLSAgZGVzdGluYXRpb24uQWRkKDEpOwotICBkZXN0aW5hdGlvbi5BZGQoMik7Ci0gIGRlc3RpbmF0aW9uLkFkZCgzKTsKLQotICBkZXN0aW5hdGlvbi5NZXJnZUZyb20oc291cmNlKTsKLQotICBBU1NFUlRfRVEoNSwgZGVzdGluYXRpb24uc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDEsIGRlc3RpbmF0aW9uLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSgyLCBkZXN0aW5hdGlvbi5HZXQoMSkpOwotICBFWFBFQ1RfRVEoMywgZGVzdGluYXRpb24uR2V0KDIpKTsKLSAgRVhQRUNUX0VRKDQsIGRlc3RpbmF0aW9uLkdldCgzKSk7Ci0gIEVYUEVDVF9FUSg1LCBkZXN0aW5hdGlvbi5HZXQoNCkpOwotfQotCi0jaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLVRFU1QoUmVwZWF0ZWRGaWVsZCwgTWVyZ2VGcm9tU2VsZikgewotICBSZXBlYXRlZEZpZWxkPGludD4gbWU7Ci0gIG1lLkFkZCgzKTsKLSAgRVhQRUNUX0RFQVRIKG1lLk1lcmdlRnJvbShtZSksICIiKTsKLX0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLQotVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5RnJvbSkgewotICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCBkZXN0aW5hdGlvbjsKLSAgc291cmNlLkFkZCg0KTsKLSAgc291cmNlLkFkZCg1KTsKLSAgZGVzdGluYXRpb24uQWRkKDEpOwotICBkZXN0aW5hdGlvbi5BZGQoMik7Ci0gIGRlc3RpbmF0aW9uLkFkZCgzKTsKLQotICBkZXN0aW5hdGlvbi5Db3B5RnJvbShzb3VyY2UpOwotCi0gIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOwotICBFWFBFQ1RfRVEoNCwgZGVzdGluYXRpb24uR2V0KDApKTsKLSAgRVhQRUNUX0VRKDUsIGRlc3RpbmF0aW9uLkdldCgxKSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRGaWVsZCwgQ29weUZyb21TZWxmKSB7Ci0gIFJlcGVhdGVkRmllbGQ8aW50PiBtZTsKLSAgbWUuQWRkKDMpOwotICBtZS5Db3B5RnJvbShtZSk7Ci0gIEFTU0VSVF9FUSgxLCBtZS5zaXplKCkpOwotICBFWFBFQ1RfRVEoMywgbWUuR2V0KDApKTsKLX0KLQotVEVTVChSZXBlYXRlZEZpZWxkLCBFcmFzZSkgewotICBSZXBlYXRlZEZpZWxkPGludD4gbWU7Ci0gIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXQgPSBtZS5lcmFzZShtZS5iZWdpbigpLCBtZS5lbmQoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lLmJlZ2luKCkgPT0gaXQpOwotICBFWFBFQ1RfRVEoMCwgbWUuc2l6ZSgpKTsKLQotICBtZS5BZGQoMSk7Ci0gIG1lLkFkZCgyKTsKLSAgbWUuQWRkKDMpOwotICBpdCA9IG1lLmVyYXNlKG1lLmJlZ2luKCksIG1lLmVuZCgpKTsKLSAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSA9PSBpdCk7Ci0gIEVYUEVDVF9FUSgwLCBtZS5zaXplKCkpOwotCi0gIG1lLkFkZCg0KTsKLSAgbWUuQWRkKDUpOwotICBtZS5BZGQoNik7Ci0gIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDIsIG1lLmVuZCgpKTsKLSAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDIgPT0gaXQpOwotICBFWFBFQ1RfRVEoMiwgbWUuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDQsIG1lLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSg1LCBtZS5HZXQoMSkpOwotCi0gIG1lLkFkZCg2KTsKLSAgbWUuQWRkKDcpOwotICBtZS5BZGQoOCk7Ci0gIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDEsIG1lLmJlZ2luKCkgKyAzKTsKLSAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDEgPT0gaXQpOwotICBFWFBFQ1RfRVEoMywgbWUuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDQsIG1lLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSg3LCBtZS5HZXQoMSkpOwotICBFWFBFQ1RfRVEoOCwgbWUuR2V0KDIpKTsKLX0KLQotVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5Q29uc3RydWN0KSB7Ci0gIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2U7Ci0gIHNvdXJjZS5BZGQoMSk7Ci0gIHNvdXJjZS5BZGQoMik7Ci0KLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGRlc3RpbmF0aW9uKHNvdXJjZSk7Ci0KLSAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgxLCBkZXN0aW5hdGlvbi5HZXQoMCkpOwotICBFWFBFQ1RfRVEoMiwgZGVzdGluYXRpb24uR2V0KDEpKTsKLX0KLQotVEVTVChSZXBlYXRlZEZpZWxkLCBJdGVyYXRvckNvbnN0cnVjdCkgewotICB2ZWN0b3I8aW50PiB2YWx1ZXM7Ci0gIHZhbHVlcy5wdXNoX2JhY2soMSk7Ci0gIHZhbHVlcy5wdXNoX2JhY2soMik7Ci0KLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOwotICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgZmllbGQuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHZhbHVlc1swXSwgZmllbGQuR2V0KDApKTsKLSAgRVhQRUNUX0VRKHZhbHVlc1sxXSwgZmllbGQuR2V0KDEpKTsKLQotICBSZXBlYXRlZEZpZWxkPGludD4gb3RoZXIoZmllbGQuYmVnaW4oKSwgZmllbGQuZW5kKCkpOwotICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgb3RoZXIuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHZhbHVlc1swXSwgb3RoZXIuR2V0KDApKTsKLSAgRVhQRUNUX0VRKHZhbHVlc1sxXSwgb3RoZXIuR2V0KDEpKTsKLX0KLQotVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5QXNzaWduKSB7Ci0gIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2UsIGRlc3RpbmF0aW9uOwotICBzb3VyY2UuQWRkKDQpOwotICBzb3VyY2UuQWRkKDUpOwotICBkZXN0aW5hdGlvbi5BZGQoMSk7Ci0gIGRlc3RpbmF0aW9uLkFkZCgyKTsKLSAgZGVzdGluYXRpb24uQWRkKDMpOwotCi0gIGRlc3RpbmF0aW9uID0gc291cmNlOwotCi0gIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOwotICBFWFBFQ1RfRVEoNCwgZGVzdGluYXRpb24uR2V0KDApKTsKLSAgRVhQRUNUX0VRKDUsIGRlc3RpbmF0aW9uLkdldCgxKSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRGaWVsZCwgU2VsZkFzc2lnbikgewotICAvLyBWZXJpZnkgdGhhdCBhc3NpZ25tZW50IHRvIHNlbGYgZG9lcyBub3QgZGVzdHJveSBkYXRhLgotICBSZXBlYXRlZEZpZWxkPGludD4gc291cmNlLCAqcDsKLSAgcCA9ICZzb3VyY2U7Ci0gIHNvdXJjZS5BZGQoNyk7Ci0gIHNvdXJjZS5BZGQoOCk7Ci0KLSAgKnAgPSBzb3VyY2U7Ci0KLSAgQVNTRVJUX0VRKDIsIHNvdXJjZS5zaXplKCkpOwotICBFWFBFQ1RfRVEoNywgc291cmNlLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSg4LCBzb3VyY2UuR2V0KDEpKTsKLX0KLQotVEVTVChSZXBlYXRlZEZpZWxkLCBNdXRhYmxlRGF0YUlzTXV0YWJsZSkgewotICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7Ci0gIGZpZWxkLkFkZCgxKTsKLSAgRVhQRUNUX0VRKDEsIGZpZWxkLkdldCgwKSk7Ci0gIC8vIFRoZSBmYWN0IHRoYXQgdGhpcyBsaW5lIGNvbXBpbGVzIHdvdWxkIGJlIGVub3VnaCwgYnV0IHdlJ2xsIGNoZWNrIHRoZQotICAvLyB2YWx1ZSBhbnl3YXkuCi0gICpmaWVsZC5tdXRhYmxlX2RhdGEoKSA9IDI7Ci0gIEVYUEVDVF9FUSgyLCBmaWVsZC5HZXQoMCkpOwotfQotCi1URVNUKFJlcGVhdGVkRmllbGQsIFRydW5jYXRlKSB7Ci0gIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKLQotICBmaWVsZC5BZGQoMTIpOwotICBmaWVsZC5BZGQoMzQpOwotICBmaWVsZC5BZGQoNTYpOwotICBmaWVsZC5BZGQoNzgpOwotICBFWFBFQ1RfRVEoNCwgZmllbGQuc2l6ZSgpKTsKLQotICBmaWVsZC5UcnVuY2F0ZSgzKTsKLSAgRVhQRUNUX0VRKDMsIGZpZWxkLnNpemUoKSk7Ci0KLSAgZmllbGQuQWRkKDkwKTsKLSAgRVhQRUNUX0VRKDQsIGZpZWxkLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSg5MCwgZmllbGQuR2V0KDMpKTsKLQotICAvLyBUcnVuY2F0aW9ucyB0aGF0IGRvbid0IGNoYW5nZSB0aGUgc2l6ZSBhcmUgYWxsb3dlZCwgYnV0IGdyb3dpbmcgaXMgbm90Ci0gIC8vIGFsbG93ZWQuCi0gIGZpZWxkLlRydW5jYXRlKGZpZWxkLnNpemUoKSk7Ci0jaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLSAgRVhQRUNUX0RFQlVHX0RFQVRIKGZpZWxkLlRydW5jYXRlKGZpZWxkLnNpemUoKSArIDEpLCAibmV3X3NpemUiKTsKLSNlbmRpZgotfQotCi0KLVRFU1QoUmVwZWF0ZWRGaWVsZCwgRXh0cmFjdFN1YnJhbmdlKSB7Ci0gIC8vIEV4aGF1c3RpdmVseSB0ZXN0IGV2ZXJ5IHN1YnJhbmdlIGluIGFycmF5cyBvZiBhbGwgc2l6ZXMgZnJvbSAwIHRocm91Z2ggOS4KLSAgZm9yIChpbnQgc3ogPSAwOyBzeiA8IDEwOyArK3N6KSB7Ci0gICAgZm9yIChpbnQgbnVtID0gMDsgbnVtIDw9IHN6OyArK251bSkgewotICAgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHN6IC0gbnVtOyArK3N0YXJ0KSB7Ci0gICAgICAgIC8vIENyZWF0ZSBSZXBlYXRlZEZpZWxkIHdpdGggc3ogZWxlbWVudHMgaGF2aW5nIHZhbHVlcyAwIHRocm91Z2ggc3otMS4KLSAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMj4gZmllbGQ7Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3o7ICsraSkKLSAgICAgICAgICBmaWVsZC5BZGQoaSk7Ci0gICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6KTsKLQotICAgICAgICAvLyBDcmVhdGUgYSBjYXRjaGVyIGFycmF5IGFuZCBjYWxsIEV4dHJhY3RTdWJyYW5nZS4KLSAgICAgICAgaW50MzIgY2F0Y2hlclsxMF07Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKLSAgICAgICAgICBjYXRjaGVyW2ldID0gLTE7Ci0gICAgICAgIGZpZWxkLkV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBjYXRjaGVyKTsKLQotICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgaGF2ZSB0aGUgcmlnaHQgc2l6ZT8KLSAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogLSBudW0pOwotCi0gICAgICAgIC8vIFdlcmUgdGhlIHJlbW92ZWQgZWxlbWVudHMgZXh0cmFjdGVkIGludG8gdGhlIGNhdGNoZXIgYXJyYXk/Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpCi0gICAgICAgICAgRVhQRUNUX0VRKGNhdGNoZXJbaV0sIHN0YXJ0ICsgaSk7Ci0gICAgICAgIEVYUEVDVF9FUShjYXRjaGVyW251bV0sIC0xKTsKLQotICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzPwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0OyArK2kpCi0gICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLkdldChpKSwgaSk7Ci0gICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGZpZWxkLnNpemUoKTsgKytpKQotICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSksIGkgKyBudW0pOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi1URVNUKFJlcGVhdGVkRmllbGQsIENsZWFyVGhlblJlc2VydmVNb3JlKSB7Ci0gIC8vIFRlc3QgdGhhdCBSZXNlcnZlIHByb3Blcmx5IGRlc3Ryb3lzIHRoZSBvbGQgaW50ZXJuYWwgYXJyYXkgd2hlbiBpdCdzIGZvcmNlZAotICAvLyB0byBhbGxvY2F0ZSBhIG5ldyBvbmUsIGV2ZW4gd2hlbiBjbGVhcmVkLWJ1dC1ub3QtZGVsZXRlZCBvYmplY3RzIGFyZQotICAvLyBwcmVzZW50LiBVc2UgYSAnc3RyaW5nJyBhbmQgPiAxNiBieXRlcyBsZW5ndGggc28gdGhhdCB0aGUgZWxlbWVudHMgYXJlCi0gIC8vIG5vbi1QT0QgYW5kIGFsbG9jYXRlIC0tIHRoZSBsZWFrIGNoZWNrZXIgd2lsbCBjYXRjaCBhbnkgc2tpcHBlZCBkZXN0cnVjdG9yCi0gIC8vIGNhbGxzIGhlcmUuCi0gIFJlcGVhdGVkRmllbGQ8c3RyaW5nPiBmaWVsZDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7Ci0gICAgZmllbGQuQWRkKHN0cmluZygiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IikpOwotICB9Ci0gIEVYUEVDVF9FUSgzMiwgZmllbGQuc2l6ZSgpKTsKLSAgZmllbGQuQ2xlYXIoKTsKLSAgRVhQRUNUX0VRKDAsIGZpZWxkLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgzMiwgZmllbGQuQ2FwYWNpdHkoKSk7Ci0KLSAgZmllbGQuUmVzZXJ2ZSgxMDI0KTsKLSAgRVhQRUNUX0VRKDAsIGZpZWxkLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgxMDI0LCBmaWVsZC5DYXBhY2l0eSgpKTsKLSAgLy8gRmluaXNoIHRlc3QgLS0gfGZpZWxkfCBzaG91bGQgZGVzdHJveSB0aGUgY2xlYXJlZC1idXQtbm90LXlldC1kZXN0cm95ZWQKLSAgLy8gc3RyaW5ncy4KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gUmVwZWF0ZWRQdHJGaWVsZCB0ZXN0cy4gIFRoZXNlIHByZXR0eSBtdWNoIGp1c3QgbWlycm9yIHRoZSBSZXBlYXRlZEZpZWxkCi0vLyB0ZXN0cyBhYm92ZS4KLQotVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBTbWFsbCkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7Ci0KLSAgRVhQRUNUX1RSVUUoZmllbGQuZW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDApOwotCi0gIGZpZWxkLkFkZCgpLT5hc3NpZ24oImZvbyIpOwotCi0gIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7Ci0gIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKLQotICBmaWVsZC5BZGQoKS0+YXNzaWduKCJiYXIiKTsKLQotICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDIpOwotICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCAiZm9vIik7Ci0gIEVYUEVDVF9FUShmaWVsZC5HZXQoMSksICJiYXIiKTsKLQotICBmaWVsZC5NdXRhYmxlKDEpLT5hc3NpZ24oImJheiIpOwotCi0gIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMik7Ci0gIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKLSAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgImJheiIpOwotCi0gIGZpZWxkLlJlbW92ZUxhc3QoKTsKLQotICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDEpOwotICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCAiZm9vIik7Ci0KLSAgZmllbGQuQ2xlYXIoKTsKLQotICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTGFyZ2UpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgICpmaWVsZC5BZGQoKSArPSAnYScgKyBpOwotICB9Ci0KLSAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMTYpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSkuc2l6ZSgpLCAxKTsKLSAgICBFWFBFQ1RfRVEoZmllbGQuR2V0KGkpWzBdLCAnYScgKyBpKTsKLSAgfQotCi0gIGludCBtaW5fZXhwZWN0ZWRfdXNhZ2UgPSAxNiAqIHNpemVvZihzdHJpbmcpOwotICBFWFBFQ1RfR0UoZmllbGQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpLCBtaW5fZXhwZWN0ZWRfdXNhZ2UpOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIFN3YXBTbWFsbFNtYWxsKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDE7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDI7Ci0KLSAgRVhQRUNUX1RSVUUoZmllbGQxLmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMCk7Ci0gIEVYUEVDVF9UUlVFKGZpZWxkMi5lbXB0eSgpKTsKLSAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDApOwotCi0gIGZpZWxkMS5BZGQoKS0+YXNzaWduKCJmb28iKTsKLSAgZmllbGQxLkFkZCgpLT5hc3NpZ24oImJhciIpOwotCi0gIEVYUEVDVF9GQUxTRShmaWVsZDEuZW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAyKTsKLSAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMCksICJmb28iKTsKLSAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMSksICJiYXIiKTsKLQotICBFWFBFQ1RfVFJVRShmaWVsZDIuZW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAwKTsKLQotICBmaWVsZDEuU3dhcCgmZmllbGQyKTsKLQotICBFWFBFQ1RfVFJVRShmaWVsZDEuZW1wdHkoKSk7Ci0gIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAwKTsKLQotICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMik7Ci0gIEVYUEVDVF9FUShmaWVsZDIuR2V0KDApLCAiZm9vIik7Ci0gIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCAiYmFyIik7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU3dhcExhcmdlU21hbGwpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMTsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMjsKLQotICBmaWVsZDIuQWRkKCktPmFzc2lnbigiZm9vIik7Ci0gIGZpZWxkMi5BZGQoKS0+YXNzaWduKCJiYXIiKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgKmZpZWxkMS5BZGQoKSArPSAnYScgKyBpOwotICB9Ci0gIGZpZWxkMS5Td2FwKCZmaWVsZDIpOwotCi0gIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAyKTsKLSAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMCksICJmb28iKTsKLSAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMSksICJiYXIiKTsKLSAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDE2KTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgaSsrKSB7Ci0gICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSkuc2l6ZSgpLCAxKTsKLSAgICBFWFBFQ1RfRVEoZmllbGQyLkdldChpKVswXSwgJ2EnICsgaSk7Ci0gIH0KLX0KLQotVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBTd2FwTGFyZ2VMYXJnZSkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQxOwotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQyOwotCi0gIGZpZWxkMS5BZGQoKS0+YXNzaWduKCJmb28iKTsKLSAgZmllbGQxLkFkZCgpLT5hc3NpZ24oImJhciIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDE2OyBpKyspIHsKLSAgICAqZmllbGQxLkFkZCgpICs9ICdBJyArIGk7Ci0gICAgKmZpZWxkMi5BZGQoKSArPSAnYScgKyBpOwotICB9Ci0gIGZpZWxkMi5Td2FwKCZmaWVsZDEpOwotCi0gIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAxNik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewotICAgIEVYUEVDVF9FUShmaWVsZDEuR2V0KGkpLnNpemUoKSwgMSk7Ci0gICAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoaSlbMF0sICdhJyArIGkpOwotICB9Ci0gIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAxOCk7Ci0gIEVYUEVDVF9FUShmaWVsZDIuR2V0KDApLCAiZm9vIik7Ci0gIEVYUEVDVF9FUShmaWVsZDIuR2V0KDEpLCAiYmFyIik7Ci0gIGZvciAoaW50IGkgPSAyOyBpIDwgMTg7IGkrKykgewotICAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KGkpLnNpemUoKSwgMSk7Ci0gICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoaSlbMF0sICdBJyArIGkgLSAyKTsKLSAgfQotfQotCi1zdGF0aWMgaW50IFJlc2VydmVkU3BhY2UoUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiBmaWVsZCkgewotICBjb25zdCBzdHJpbmcqIGNvbnN0KiBwdHIgPSBmaWVsZC0+ZGF0YSgpOwotICBkbyB7Ci0gICAgZmllbGQtPkFkZCgpOwotICB9IHdoaWxlIChmaWVsZC0+ZGF0YSgpID09IHB0cik7Ci0KLSAgcmV0dXJuIGZpZWxkLT5zaXplKCkgLSAxOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVNb3JlVGhhbkRvdWJsZSkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7Ci0gIGZpZWxkLlJlc2VydmUoMjApOwotCi0gIEVYUEVDVF9FUSgyMCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKLX0KLQotVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBSZXNlcnZlTGVzc1RoYW5Eb3VibGUpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOwotICBmaWVsZC5SZXNlcnZlKDIwKTsKLSAgZmllbGQuUmVzZXJ2ZSgzMCk7Ci0KLSAgRVhQRUNUX0VRKDQwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVMZXNzVGhhbkV4aXN0aW5nKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKLSAgZmllbGQuUmVzZXJ2ZSgyMCk7Ci0gIGNvbnN0IHN0cmluZyogY29uc3QqIHByZXZpb3VzX3B0ciA9IGZpZWxkLmRhdGEoKTsKLSAgZmllbGQuUmVzZXJ2ZSgxMCk7Ci0KLSAgRVhQRUNUX0VRKHByZXZpb3VzX3B0ciwgZmllbGQuZGF0YSgpKTsKLSAgRVhQRUNUX0VRKDIwLCBSZXNlcnZlZFNwYWNlKCZmaWVsZCkpOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIFJlc2VydmVEb2VzbnRMb3NlQWxsb2NhdGVkKSB7Ci0gIC8vIENoZWNrIHRoYXQgYSBidWcgaXMgZml4ZWQ6ICBBbiBlYXJsaWVyIGltcGxlbWVudGF0aW9uIG9mIFJlc2VydmUoKQotICAvLyBmYWlsZWQgdG8gY29weSBwb2ludGVycyB0byBhbGxvY2F0ZWQtYnV0LWNsZWFyZWQgb2JqZWN0cywgcG9zc2libHkKLSAgLy8gbGVhZGluZyB0byBzZWdmYXVsdHMuCi0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKLSAgc3RyaW5nKiBmaXJzdCA9IGZpZWxkLkFkZCgpOwotICBmaWVsZC5SZW1vdmVMYXN0KCk7Ci0KLSAgZmllbGQuUmVzZXJ2ZSgyMCk7Ci0gIEVYUEVDVF9FUShmaXJzdCwgZmllbGQuQWRkKCkpOwotfQotCi0vLyBDbGVhcmluZyBlbGVtZW50cyBpcyB0cmlja3kgd2l0aCBSZXBlYXRlZFB0ckZpZWxkcyBzaW5jZSB0aGUgbWVtb3J5IGZvcgotLy8gdGhlIGVsZW1lbnRzIGlzIHJldGFpbmVkIGFuZCByZXVzZWQuCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIENsZWFyZWRFbGVtZW50cykgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7Ci0KLSAgc3RyaW5nKiBvcmlnaW5hbCA9IGZpZWxkLkFkZCgpOwotICAqb3JpZ2luYWwgPSAiZm9vIjsKLQotICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOwotCi0gIGZpZWxkLlJlbW92ZUxhc3QoKTsKLSAgRVhQRUNUX1RSVUUob3JpZ2luYWwtPmVtcHR5KCkpOwotICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDEpOwotCi0gIEVYUEVDVF9FUShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOyAgLy8gU2hvdWxkIHJldHVybiBzYW1lIHN0cmluZyBmb3IgcmV1c2UuCi0KLSAgRVhQRUNUX0VRKGZpZWxkLlJlbGVhc2VMYXN0KCksIG9yaWdpbmFsKTsgIC8vIFdlIHRha2Ugb3duZXJzaGlwLgotICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOwotCi0gIEVYUEVDVF9ORShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOyAgLy8gU2hvdWxkIE5PVCByZXR1cm4gdGhlIHNhbWUgc3RyaW5nLgotICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOwotCi0gIGZpZWxkLkFkZEFsbG9jYXRlZChvcmlnaW5hbCk7ICAvLyBHaXZlIG93bmVyc2hpcCBiYWNrLgotICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOwotICBFWFBFQ1RfRVEoZmllbGQuTXV0YWJsZSgxKSwgb3JpZ2luYWwpOwotCi0gIGZpZWxkLkNsZWFyKCk7Ci0gIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMik7Ci0gIEVYUEVDVF9FUShmaWVsZC5SZWxlYXNlQ2xlYXJlZCgpLCBvcmlnaW5hbCk7ICAvLyBUYWtlIG93bmVyc2hpcCBhZ2Fpbi4KLSAgRVhQRUNUX0VRKGZpZWxkLkNsZWFyZWRDb3VudCgpLCAxKTsKLSAgRVhQRUNUX05FKGZpZWxkLkFkZCgpLCBvcmlnaW5hbCk7Ci0gIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7Ci0gIEVYUEVDVF9ORShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOwotICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOwotCi0gIGZpZWxkLkFkZENsZWFyZWQob3JpZ2luYWwpOyAgLy8gR2l2ZSBvd25lcnNoaXAgYmFjaywgYnV0IGFzIGEgY2xlYXJlZCBvYmplY3QuCi0gIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMSk7Ci0gIEVYUEVDVF9FUShmaWVsZC5BZGQoKSwgb3JpZ2luYWwpOwotICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOwotfQotCi0vLyBUZXN0IGFsbCBjb2RlIHBhdGhzIGluIEFkZEFsbG9jYXRlZCgpLgotVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBBZGRBbG9jYXRlZCkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQ7Ci0gIHdoaWxlIChmaWVsZC5zaXplKCkgPCBmaWVsZC5DYXBhY2l0eSgpKSB7Ci0gICAgZmllbGQuQWRkKCktPmFzc2lnbigiZmlsbGVyIik7Ci0gIH0KLQotICBpbnQgaW5kZXggPSBmaWVsZC5zaXplKCk7Ci0KLSAgLy8gRmlyc3QgYnJhbmNoOiAgRmllbGQgaXMgYXQgY2FwYWNpdHkgd2l0aCBubyBjbGVhcmVkIG9iamVjdHMuCi0gIHN0cmluZyogZm9vID0gbmV3IHN0cmluZygiZm9vIik7Ci0gIGZpZWxkLkFkZEFsbG9jYXRlZChmb28pOwotICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgZmllbGQuQ2xlYXJlZENvdW50KCkpOwotICBFWFBFQ1RfRVEoZm9vLCAmZmllbGQuR2V0KGluZGV4KSk7Ci0KLSAgLy8gTGFzdCBicmFuY2g6ICBGaWVsZCBpcyBub3QgYXQgY2FwYWNpdHkgYW5kIHRoZXJlIGFyZSBubyBjbGVhcmVkIG9iamVjdHMuCi0gIHN0cmluZyogYmFyID0gbmV3IHN0cmluZygiYmFyIik7Ci0gIGZpZWxkLkFkZEFsbG9jYXRlZChiYXIpOwotICArK2luZGV4OwotICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgZmllbGQuQ2xlYXJlZENvdW50KCkpOwotICBFWFBFQ1RfRVEoYmFyLCAmZmllbGQuR2V0KGluZGV4KSk7Ci0KLSAgLy8gVGhpcmQgYnJhbmNoOiAgRmllbGQgaXMgbm90IGF0IGNhcGFjaXR5IGFuZCB0aGVyZSBhcmUgbm8gY2xlYXJlZCBvYmplY3RzLgotICBmaWVsZC5SZW1vdmVMYXN0KCk7Ci0gIHN0cmluZyogYmF6ID0gbmV3IHN0cmluZygiYmF6Iik7Ci0gIGZpZWxkLkFkZEFsbG9jYXRlZChiYXopOwotICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOwotICBFWFBFQ1RfRVEoMSwgZmllbGQuQ2xlYXJlZENvdW50KCkpOwotICBFWFBFQ1RfRVEoYmF6LCAmZmllbGQuR2V0KGluZGV4KSk7Ci0KLSAgLy8gU2Vjb25kIGJyYW5jaDogIEZpZWxkIGlzIGF0IGNhcGFjaXR5IGJ1dCBoYXMgc29tZSBjbGVhcmVkIG9iamVjdHMuCi0gIHdoaWxlIChmaWVsZC5zaXplKCkgPCBmaWVsZC5DYXBhY2l0eSgpKSB7Ci0gICAgZmllbGQuQWRkKCktPmFzc2lnbigiZmlsbGVyMiIpOwotICB9Ci0gIGZpZWxkLlJlbW92ZUxhc3QoKTsKLSAgaW5kZXggPSBmaWVsZC5zaXplKCk7Ci0gIHN0cmluZyogcXV4ID0gbmV3IHN0cmluZygicXV4Iik7Ci0gIGZpZWxkLkFkZEFsbG9jYXRlZChxdXgpOwotICBFWFBFQ1RfRVEoaW5kZXggKyAxLCBmaWVsZC5zaXplKCkpOwotICAvLyBXZSBzaG91bGQgaGF2ZSBkaXNjYXJkZWQgdGhlIGNsZWFyZWQgb2JqZWN0LgotICBFWFBFQ1RfRVEoMCwgZmllbGQuQ2xlYXJlZENvdW50KCkpOwotICBFWFBFQ1RfRVEocXV4LCAmZmllbGQuR2V0KGluZGV4KSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTWVyZ2VGcm9tKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBzb3VyY2UsIGRlc3RpbmF0aW9uOwotICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNCIpOwotICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNSIpOwotICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIxIik7Ci0gIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjIiKTsKLSAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMyIpOwotCi0gIGRlc3RpbmF0aW9uLk1lcmdlRnJvbShzb3VyY2UpOwotCi0gIEFTU0VSVF9FUSg1LCBkZXN0aW5hdGlvbi5zaXplKCkpOwotICBFWFBFQ1RfRVEoIjEiLCBkZXN0aW5hdGlvbi5HZXQoMCkpOwotICBFWFBFQ1RfRVEoIjIiLCBkZXN0aW5hdGlvbi5HZXQoMSkpOwotICBFWFBFQ1RfRVEoIjMiLCBkZXN0aW5hdGlvbi5HZXQoMikpOwotICBFWFBFQ1RfRVEoIjQiLCBkZXN0aW5hdGlvbi5HZXQoMykpOwotICBFWFBFQ1RfRVEoIjUiLCBkZXN0aW5hdGlvbi5HZXQoNCkpOwotfQotCi0jaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTWVyZ2VGcm9tU2VsZikgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gbWU7Ci0gIG1lLkFkZCgpLT5hc3NpZ24oIjEiKTsKLSAgRVhQRUNUX0RFQVRIKG1lLk1lcmdlRnJvbShtZSksICIiKTsKLX0KLSNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLQotVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5RnJvbSkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlLCBkZXN0aW5hdGlvbjsKLSAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjQiKTsKLSAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjUiKTsKLSAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMSIpOwotICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIyIik7Ci0gIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjMiKTsKLQotICBkZXN0aW5hdGlvbi5Db3B5RnJvbShzb3VyY2UpOwotCi0gIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOwotICBFWFBFQ1RfRVEoIjQiLCBkZXN0aW5hdGlvbi5HZXQoMCkpOwotICBFWFBFQ1RfRVEoIjUiLCBkZXN0aW5hdGlvbi5HZXQoMSkpOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIENvcHlGcm9tU2VsZikgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gbWU7Ci0gIG1lLkFkZCgpLT5hc3NpZ24oIjEiKTsKLSAgbWUuQ29weUZyb20obWUpOwotICBBU1NFUlRfRVEoMSwgbWUuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCIxIiwgbWUuR2V0KDApKTsKLX0KLQotVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBFcmFzZSkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gbWU7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6aXRlcmF0b3IgaXQgPSBtZS5lcmFzZShtZS5iZWdpbigpLCBtZS5lbmQoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lLmJlZ2luKCkgPT0gaXQpOwotICBFWFBFQ1RfRVEoMCwgbWUuc2l6ZSgpKTsKLQotICAqbWUuQWRkKCkgPSAiMSI7Ci0gICptZS5BZGQoKSA9ICIyIjsKLSAgKm1lLkFkZCgpID0gIjMiOwotICBpdCA9IG1lLmVyYXNlKG1lLmJlZ2luKCksIG1lLmVuZCgpKTsKLSAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSA9PSBpdCk7Ci0gIEVYUEVDVF9FUSgwLCBtZS5zaXplKCkpOwotCi0gICptZS5BZGQoKSA9ICI0IjsKLSAgKm1lLkFkZCgpID0gIjUiOwotICAqbWUuQWRkKCkgPSAiNiI7Ci0gIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDIsIG1lLmVuZCgpKTsKLSAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDIgPT0gaXQpOwotICBFWFBFQ1RfRVEoMiwgbWUuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCI0IiwgbWUuR2V0KDApKTsKLSAgRVhQRUNUX0VRKCI1IiwgbWUuR2V0KDEpKTsKLQotICAqbWUuQWRkKCkgPSAiNiI7Ci0gICptZS5BZGQoKSA9ICI3IjsKLSAgKm1lLkFkZCgpID0gIjgiOwotICBpdCA9IG1lLmVyYXNlKG1lLmJlZ2luKCkgKyAxLCBtZS5iZWdpbigpICsgMyk7Ci0gIEVYUEVDVF9UUlVFKG1lLmJlZ2luKCkgKyAxID09IGl0KTsKLSAgRVhQRUNUX0VRKDMsIG1lLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiNCIsIG1lLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSgiNyIsIG1lLkdldCgxKSk7Ci0gIEVYUEVDVF9FUSgiOCIsIG1lLkdldCgyKSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgQ29weUNvbnN0cnVjdCkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlOwotICBzb3VyY2UuQWRkKCktPmFzc2lnbigiMSIpOwotICBzb3VyY2UuQWRkKCktPmFzc2lnbigiMiIpOwotCi0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBkZXN0aW5hdGlvbihzb3VyY2UpOwotCi0gIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOwotICBFWFBFQ1RfRVEoIjEiLCBkZXN0aW5hdGlvbi5HZXQoMCkpOwotICBFWFBFQ1RfRVEoIjIiLCBkZXN0aW5hdGlvbi5HZXQoMSkpOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIEl0ZXJhdG9yQ29uc3RydWN0X1N0cmluZykgewotICB2ZWN0b3I8c3RyaW5nPiB2YWx1ZXM7Ci0gIHZhbHVlcy5wdXNoX2JhY2soIjEiKTsKLSAgdmFsdWVzLnB1c2hfYmFjaygiMiIpOwotCi0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKLSAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIGZpZWxkLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZXNbMF0sIGZpZWxkLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZXNbMV0sIGZpZWxkLkdldCgxKSk7Ci0KLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IG90aGVyKGZpZWxkLmJlZ2luKCksIGZpZWxkLmVuZCgpKTsKLSAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIG90aGVyLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZXNbMF0sIG90aGVyLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZXNbMV0sIG90aGVyLkdldCgxKSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgSXRlcmF0b3JDb25zdHJ1Y3RfUHJvdG8pIHsKLSAgdHlwZWRlZiBUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UgTmVzdGVkOwotICB2ZWN0b3I8TmVzdGVkPiB2YWx1ZXM7Ci0gIHZhbHVlcy5wdXNoX2JhY2soTmVzdGVkKCkpOwotICB2YWx1ZXMuYmFjaygpLnNldF9iYigxKTsKLSAgdmFsdWVzLnB1c2hfYmFjayhOZXN0ZWQoKSk7Ci0gIHZhbHVlcy5iYWNrKCkuc2V0X2JiKDIpOwotCi0gIFJlcGVhdGVkUHRyRmllbGQ8TmVzdGVkPiBmaWVsZCh2YWx1ZXMuYmVnaW4oKSwgdmFsdWVzLmVuZCgpKTsKLSAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIGZpZWxkLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZXNbMF0uYmIoKSwgZmllbGQuR2V0KDApLmJiKCkpOwotICBFWFBFQ1RfRVEodmFsdWVzWzFdLmJiKCksIGZpZWxkLkdldCgxKS5iYigpKTsKLQotICBSZXBlYXRlZFB0ckZpZWxkPE5lc3RlZD4gb3RoZXIoZmllbGQuYmVnaW4oKSwgZmllbGQuZW5kKCkpOwotICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgb3RoZXIuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHZhbHVlc1swXS5iYigpLCBvdGhlci5HZXQoMCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSh2YWx1ZXNbMV0uYmIoKSwgb3RoZXIuR2V0KDEpLmJiKCkpOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIENvcHlBc3NpZ24pIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IHNvdXJjZSwgZGVzdGluYXRpb247Ci0gIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI0Iik7Ci0gIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI1Iik7Ci0gIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjEiKTsKLSAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMiIpOwotICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIzIik7Ci0KLSAgZGVzdGluYXRpb24gPSBzb3VyY2U7Ci0KLSAgQVNTRVJUX0VRKDIsIGRlc3RpbmF0aW9uLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiNCIsIGRlc3RpbmF0aW9uLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSgiNSIsIGRlc3RpbmF0aW9uLkdldCgxKSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU2VsZkFzc2lnbikgewotICAvLyBWZXJpZnkgdGhhdCBhc3NpZ25tZW50IHRvIHNlbGYgZG9lcyBub3QgZGVzdHJveSBkYXRhLgotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlLCAqcDsKLSAgcCA9ICZzb3VyY2U7Ci0gIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI3Iik7Ci0gIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI4Iik7Ci0KLSAgKnAgPSBzb3VyY2U7Ci0KLSAgQVNTRVJUX0VRKDIsIHNvdXJjZS5zaXplKCkpOwotICBFWFBFQ1RfRVEoIjciLCBzb3VyY2UuR2V0KDApKTsKLSAgRVhQRUNUX0VRKCI4Iiwgc291cmNlLkdldCgxKSk7Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTXV0YWJsZURhdGFJc011dGFibGUpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOwotICAqZmllbGQuQWRkKCkgPSAiMSI7Ci0gIEVYUEVDVF9FUSgiMSIsIGZpZWxkLkdldCgwKSk7Ci0gIC8vIFRoZSBmYWN0IHRoYXQgdGhpcyBsaW5lIGNvbXBpbGVzIHdvdWxkIGJlIGVub3VnaCwgYnV0IHdlJ2xsIGNoZWNrIHRoZQotICAvLyB2YWx1ZSBhbnl3YXkuCi0gIHN0cmluZyoqIGRhdGEgPSBmaWVsZC5tdXRhYmxlX2RhdGEoKTsKLSAgKipkYXRhID0gIjIiOwotICBFWFBFQ1RfRVEoIjIiLCBmaWVsZC5HZXQoMCkpOwotfQotCi1URVNUKFJlcGVhdGVkUHRyRmllbGQsIEV4dHJhY3RTdWJyYW5nZSkgewotICAvLyBFeGhhdXN0aXZlbHkgdGVzdCBldmVyeSBzdWJyYW5nZSBpbiBhcnJheXMgb2YgYWxsIHNpemVzIGZyb20gMCB0aHJvdWdoIDkKLSAgLy8gd2l0aCAwIHRocm91Z2ggMyBjbGVhcmVkIGVsZW1lbnRzIGF0IHRoZSBlbmQuCi0gIGZvciAoaW50IHN6ID0gMDsgc3ogPCAxMDsgKytzeikgewotICAgIGZvciAoaW50IG51bSA9IDA7IG51bSA8PSBzejsgKytudW0pIHsKLSAgICAgIGZvciAoaW50IHN0YXJ0ID0gMDsgc3RhcnQgPCBzeiAtIG51bTsgKytzdGFydCkgewotICAgICAgICBmb3IgKGludCBleHRyYSA9IDA7IGV4dHJhIDwgNDsgKytleHRyYSkgewotICAgICAgICAgIHZlY3RvcjxzdHJpbmcqPiBzdWJqZWN0OwotCi0gICAgICAgICAgLy8gQ3JlYXRlIGFuIGFycmF5IHdpdGggInN6IiBlbGVtZW50cyBhbmQgImV4dHJhIiBjbGVhcmVkIGVsZW1lbnRzLgotICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN6ICsgZXh0cmE7ICsraSkgewotICAgICAgICAgICAgc3ViamVjdC5wdXNoX2JhY2sobmV3IHN0cmluZygpKTsKLSAgICAgICAgICAgIGZpZWxkLkFkZEFsbG9jYXRlZChzdWJqZWN0W2ldKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogKyBleHRyYSk7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRyYTsgKytpKQotICAgICAgICAgICAgZmllbGQuUmVtb3ZlTGFzdCgpOwotICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6KTsKLSAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIGV4dHJhKTsKLQotICAgICAgICAgIC8vIENyZWF0ZSBhIGNhdGNoZXIgYXJyYXkgYW5kIGNhbGwgRXh0cmFjdFN1YnJhbmdlLgotICAgICAgICAgIHN0cmluZyogY2F0Y2hlclsxMF07Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKQotICAgICAgICAgICAgY2F0Y2hlcltpXSA9IE5VTEw7Ci0gICAgICAgICAgZmllbGQuRXh0cmFjdFN1YnJhbmdlKHN0YXJ0LCBudW0sIGNhdGNoZXIpOwotCi0gICAgICAgICAgLy8gRG9lcyB0aGUgcmVzdWx0aW5nIGFycmF5IGhhdmUgdGhlIHJpZ2h0IHNpemU/Ci0gICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogLSBudW0pOwotCi0gICAgICAgICAgLy8gV2VyZSB0aGUgcmVtb3ZlZCBlbGVtZW50cyBleHRyYWN0ZWQgaW50byB0aGUgY2F0Y2hlciBhcnJheT8KLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKQotICAgICAgICAgICAgRVhQRUNUX0VRKGNhdGNoZXJbaV0sIHN1YmplY3Rbc3RhcnQgKyBpXSk7Ci0gICAgICAgICAgRVhQRUNUX0VRKE5VTEwsIGNhdGNoZXJbbnVtXSk7Ci0KLSAgICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzPwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3RhcnQ7ICsraSkKLSAgICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5NdXRhYmxlKGkpLCBzdWJqZWN0W2ldKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gc3RhcnQ7IGkgPCBmaWVsZC5zaXplKCk7ICsraSkKLSAgICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5NdXRhYmxlKGkpLCBzdWJqZWN0W2kgKyBudW1dKTsKLQotICAgICAgICAgIC8vIFJlaW5zdGF0ZSB0aGUgY2xlYXJlZCBlbGVtZW50cy4KLSAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIGV4dHJhKTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhOyArK2kpCi0gICAgICAgICAgICBmaWVsZC5BZGQoKTsKLSAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuQ2xlYXJlZENvdW50KCksIDApOwotICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6IC0gbnVtICsgZXh0cmEpOwotCi0gICAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSBleHRyYSBlbGVtZW50cyBhcmUgYWxsIHRoZXJlIChpbiBzb21lIG9yZGVyKS4KLSAgICAgICAgICBmb3IgKGludCBpID0gc3o7IGkgPCBzeiArIGV4dHJhOyArK2kpIHsKLSAgICAgICAgICAgIGludCBjb3VudCA9IDA7Ci0gICAgICAgICAgICBmb3IgKGludCBqID0gc3o7IGogPCBzeiArIGV4dHJhOyArK2opIHsKLSAgICAgICAgICAgICAgaWYgKGZpZWxkLk11dGFibGUoaiAtIG51bSkgPT0gc3ViamVjdFtpXSkKLSAgICAgICAgICAgICAgICBjb3VudCArPSAxOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgRVhQRUNUX0VRKGNvdW50LCAxKTsKLSAgICAgICAgICB9Ci0KLSAgICAgICAgICAvLyBSZWxlYXNlIHRoZSBjYXVnaHQgZWxlbWVudHMuCi0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkKLSAgICAgICAgICAgIGRlbGV0ZSBjYXRjaGVyW2ldOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLVRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgRGVsZXRlU3VicmFuZ2UpIHsKLSAgLy8gRGVsZXRlU3VicmFuZ2UgaXMgYSB0cml2aWFsIGV4dGVuc2lvbiBvZiBFeHRlbmRTdWJyYW5nZS4KLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0vLyBJdGVyYXRvciB0ZXN0cyBzdG9sZW4gZnJvbSBuZXQvcHJvdG8vcHJvdG8tYXJyYXlfdW5pdHRlc3QuCi1jbGFzcyBSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMzsgKytpKSB7Ci0gICAgICBwcm90b19hcnJheV8uQWRkKGkpOwotICAgIH0KLSAgfQotCi0gIFJlcGVhdGVkRmllbGQ8aW50PiBwcm90b19hcnJheV87Ci19OwotCi1URVNUX0YoUmVwZWF0ZWRGaWVsZEl0ZXJhdG9yVGVzdCwgQ29udmVydGlibGUpIHsKLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7Ci0gIFJlcGVhdGVkRmllbGQ8aW50Pjo6Y29uc3RfaXRlcmF0b3IgY19pdGVyID0gaXRlcjsKLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+Ojp2YWx1ZV90eXBlIHZhbHVlID0gKmNfaXRlcjsKLSAgRVhQRUNUX0VRKDAsIHZhbHVlKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkRmllbGRJdGVyYXRvclRlc3QsIE11dGFibGVJdGVyYXRpb24pIHsKLSAgUmVwZWF0ZWRGaWVsZDxpbnQ+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7Ci0gIEVYUEVDVF9FUSgwLCAqaXRlcik7Ci0gICsraXRlcjsKLSAgRVhQRUNUX0VRKDEsICppdGVyKyspOwotICBFWFBFQ1RfRVEoMiwgKml0ZXIpOwotICArK2l0ZXI7Ci0gIEVYUEVDVF9UUlVFKHByb3RvX2FycmF5Xy5lbmQoKSA9PSBpdGVyKTsKLQotICBFWFBFQ1RfRVEoMiwgKihwcm90b19hcnJheV8uZW5kKCkgLSAxKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRlZEZpZWxkSXRlcmF0b3JUZXN0LCBDb25zdEl0ZXJhdGlvbikgewotICBjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIGNvbnN0X3Byb3RvX2FycmF5ID0gcHJvdG9fYXJyYXlfOwotICBSZXBlYXRlZEZpZWxkPGludD46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBjb25zdF9wcm90b19hcnJheS5iZWdpbigpOwotICBFWFBFQ1RfRVEoMCwgKml0ZXIpOwotICArK2l0ZXI7Ci0gIEVYUEVDVF9FUSgxLCAqaXRlcisrKTsKLSAgRVhQRUNUX0VRKDIsICppdGVyKTsKLSAgKytpdGVyOwotICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8uZW5kKCkgPT0gaXRlcik7Ci0gIEVYUEVDVF9FUSgyLCAqKHByb3RvX2FycmF5Xy5lbmQoKSAtIDEpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkRmllbGRJdGVyYXRvclRlc3QsIE11dGF0aW9uKSB7Ci0gIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5iZWdpbigpOwotICAqaXRlciA9IDc7Ci0gIEVYUEVDVF9FUSg3LCBwcm90b19hcnJheV8uR2V0KDApKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1jbGFzcyBSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJmb28iKTsKLSAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYmFyIik7Ci0gICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImJheiIpOwotICB9Ci0KLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IHByb3RvX2FycmF5XzsKLX07Ci0KLVRFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb252ZXJ0aWJsZSkgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBjX2l0ZXIgPSBpdGVyOwotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnZhbHVlX3R5cGUgdmFsdWUgPSAqY19pdGVyOwotICBFWFBFQ1RfRVEoImZvbyIsIHZhbHVlKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIE11dGFibGVJdGVyYXRpb24pIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgKml0ZXIpOwotICArK2l0ZXI7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgKihpdGVyKyspKTsKLSAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlcik7Ci0gICsraXRlcjsKLSAgRVhQRUNUX1RSVUUocHJvdG9fYXJyYXlfLmVuZCgpID09IGl0ZXIpOwotICBFWFBFQ1RfRVEoImJheiIsICooLS1wcm90b19hcnJheV8uZW5kKCkpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIENvbnN0SXRlcmF0aW9uKSB7Ci0gIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiYgY29uc3RfcHJvdG9fYXJyYXkgPSBwcm90b19hcnJheV87Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGNvbnN0X3Byb3RvX2FycmF5LmJlZ2luKCk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgKml0ZXIpOwotICArK2l0ZXI7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgKihpdGVyKyspKTsKLSAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlcik7Ci0gICsraXRlcjsKLSAgRVhQRUNUX1RSVUUoY29uc3RfcHJvdG9fYXJyYXkuZW5kKCkgPT0gaXRlcik7Ci0gIEVYUEVDVF9FUSgiYmF6IiwgKigtLWNvbnN0X3Byb3RvX2FycmF5LmVuZCgpKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhYmxlUmV2ZXJzZUl0ZXJhdGlvbikgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnJldmVyc2VfaXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5yYmVnaW4oKTsKLSAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlcik7Ci0gICsraXRlcjsKLSAgRVhQRUNUX0VRKCJiYXIiLCAqKGl0ZXIrKykpOwotICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKLSAgKytpdGVyOwotICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8ucmVuZCgpID09IGl0ZXIpOwotICBFWFBFQ1RfRVEoImZvbyIsICooLS1wcm90b19hcnJheV8ucmVuZCgpKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb25zdFJldmVyc2VJdGVyYXRpb24pIHsKLSAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+JiBjb25zdF9wcm90b19hcnJheSA9IHByb3RvX2FycmF5XzsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ZXIKLSAgICAgID0gY29uc3RfcHJvdG9fYXJyYXkucmJlZ2luKCk7Ci0gIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOwotICArK2l0ZXI7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgKihpdGVyKyspKTsKLSAgRVhQRUNUX0VRKCJmb28iLCAqaXRlcik7Ci0gICsraXRlcjsKLSAgRVhQRUNUX1RSVUUoY29uc3RfcHJvdG9fYXJyYXkucmVuZCgpID09IGl0ZXIpOwotICBFWFBFQ1RfRVEoImZvbyIsICooLS1jb25zdF9wcm90b19hcnJheS5yZW5kKCkpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIFJhbmRvbUFjY2VzcykgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyMiA9IGl0ZXI7Ci0gICsraXRlcjI7Ci0gICsraXRlcjI7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgKyAyID09IGl0ZXIyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyMiAtIDIpOwotICBFWFBFQ1RfRVEoImJheiIsIGl0ZXJbMl0pOwotICBFWFBFQ1RfRVEoImJheiIsICooaXRlciArIDIpKTsKLSAgRVhQRUNUX0VRKDMsIHByb3RvX2FycmF5Xy5lbmQoKSAtIHByb3RvX2FycmF5Xy5iZWdpbigpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIENvbXBhcmFibGUpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjIgPSBpdGVyICsgMTsKLSAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciAhPSBpdGVyMik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgPCBpdGVyMik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcjIpOwotICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIpOwotICBFWFBFQ1RfVFJVRShpdGVyMiA+IGl0ZXIpOwotICBFWFBFQ1RfVFJVRShpdGVyMiA+PSBpdGVyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciA+PSBpdGVyKTsKLX0KLQotLy8gVW5pbml0aWFsaXplZCBpdGVyYXRvciBkb2VzIG5vdCBwb2ludCB0byBhbnkgb2YgdGhlIFJlcGVhdGVkUHRyRmllbGQuCi1URVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgVW5pbml0aWFsaXplZEl0ZXJhdG9yKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6aXRlcmF0b3IgaXRlcjsKLSAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8uYmVnaW4oKSk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLmJlZ2luKCkgKyAxKTsKLSAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8uYmVnaW4oKSArIDIpOwotICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5iZWdpbigpICsgMyk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLmVuZCgpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIFNUTEFsZ29yaXRobXNfbG93ZXJfYm91bmQpIHsKLSAgcHJvdG9fYXJyYXlfLkNsZWFyKCk7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJhIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJjIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJkIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJuIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJwIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJ4Iik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJ5Iik7Ci0KLSAgc3RyaW5nIHYgPSAiZiI7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgc3RkOjpsb3dlcl9ib3VuZChwcm90b19hcnJheV8uYmVnaW4oKSwgcHJvdG9fYXJyYXlfLmVuZCgpLCB2KTsKLQotICBFWFBFQ1RfRVEoKml0LCAibiIpOwotICBFWFBFQ1RfVFJVRShpdCA9PSBwcm90b19hcnJheV8uYmVnaW4oKSArIDMpOwotfQotCi1URVNUX0YoUmVwZWF0ZWRQdHJGaWVsZEl0ZXJhdG9yVGVzdCwgTXV0YXRpb24pIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyID0gcHJvdG9fYXJyYXlfLmJlZ2luKCk7Ci0gICppdGVyID0gInF1eCI7Ci0gIEVYUEVDVF9FUSgicXV4IiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImZvbyIpOwotICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXIiKTsKLSAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYmF6Iik7Ci0gICAgY29uc3RfcHJvdG9fYXJyYXlfID0gJnByb3RvX2FycmF5XzsKLSAgfQotCi0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBwcm90b19hcnJheV87Ci0gIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogY29uc3RfcHJvdG9fYXJyYXlfOwotfTsKLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb252ZXJ0aWJsZVB0cikgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlciA9Ci0gICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpOwotICBzdGF0aWNfY2FzdDx2b2lkPihpdGVyKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb252ZXJ0aWJsZUNvbnN0UHRyKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyID0KLSAgICAgIGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpOwotICBzdGF0aWNfY2FzdDx2b2lkPihpdGVyKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBNdXRhYmxlUHRySXRlcmF0aW9uKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KLSAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgKippdGVyKTsKLSAgKytpdGVyOwotICBFWFBFQ1RfRVEoImJhciIsICoqKGl0ZXIrKykpOwotICBFWFBFQ1RfRVEoImJheiIsICoqaXRlcik7Ci0gICsraXRlcjsKLSAgRVhQRUNUX1RSVUUocHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCkgPT0gaXRlcik7Ci0gIEVYUEVDVF9FUSgiYmF6IiwgKiooLS1wcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSkpOwotfQotCi1URVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIE11dGFibGVDb25zdFB0ckl0ZXJhdGlvbikgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlciA9Ci0gICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKTsKLSAgRVhQRUNUX0VRKCJmb28iLCAqKml0ZXIpOwotICArK2l0ZXI7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgKiooaXRlcisrKSk7Ci0gIEVYUEVDVF9FUSgiYmF6IiwgKippdGVyKTsKLSAgKytpdGVyOwotICBFWFBFQ1RfVFJVRShjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCkgPT0gaXRlcik7Ci0gIEVYUEVDVF9FUSgiYmF6IiwgKiooLS1jb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCkpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBSYW5kb21QdHJBY2Nlc3MpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQotICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIyID0gaXRlcjsKLSAgKytpdGVyMjsKLSAgKytpdGVyMjsKLSAgRVhQRUNUX1RSVUUoaXRlciArIDIgPT0gaXRlcjIpOwotICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIyIC0gMik7Ci0gIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXJbMl0pOwotICBFWFBFQ1RfRVEoImJheiIsICoqKGl0ZXIgKyAyKSk7Ci0gIEVYUEVDVF9FUSgzLCBwcm90b19hcnJheV8uZW5kKCkgLSBwcm90b19hcnJheV8uYmVnaW4oKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgUmFuZG9tQ29uc3RQdHJBY2Nlc3MpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQotICAgICAgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCk7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyMiA9IGl0ZXI7Ci0gICsraXRlcjI7Ci0gICsraXRlcjI7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgKyAyID09IGl0ZXIyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyMiAtIDIpOwotICBFWFBFQ1RfRVEoImJheiIsICppdGVyWzJdKTsKLSAgRVhQRUNUX0VRKCJiYXoiLCAqKihpdGVyICsgMikpOwotICBFWFBFQ1RfRVEoMywgY29uc3RfcHJvdG9fYXJyYXlfLT5lbmQoKSAtIGNvbnN0X3Byb3RvX2FycmF5Xy0+YmVnaW4oKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgQ29tcGFyYWJsZVB0cikgewotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlciA9Ci0gICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpOwotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlcjIgPSBpdGVyICsgMTsKLSAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciAhPSBpdGVyMik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgPCBpdGVyMik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcjIpOwotICBFWFBFQ1RfVFJVRShpdGVyIDw9IGl0ZXIpOwotICBFWFBFQ1RfVFJVRShpdGVyMiA+IGl0ZXIpOwotICBFWFBFQ1RfVFJVRShpdGVyMiA+PSBpdGVyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciA+PSBpdGVyKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlQ29uc3RQdHIpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQotICAgICAgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCk7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyMiA9IGl0ZXIgKyAxOwotICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIpOwotICBFWFBFQ1RfVFJVRShpdGVyICE9IGl0ZXIyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciA8IGl0ZXIyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyMik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIyID4gaXRlcik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIyID49IGl0ZXIpOwotICBFWFBFQ1RfVFJVRShpdGVyID49IGl0ZXIpOwotfQotCi0vLyBVbmluaXRpYWxpemVkIGl0ZXJhdG9yIGRvZXMgbm90IHBvaW50IHRvIGFueSBvZiB0aGUgUmVwZWF0ZWRQdHJPdmVyUHRycy4KLS8vIERlcmVmZXJlbmNpbmcgYW4gdW5pbml0aWFsaXplZCBpdGVyYXRvciBjcmFzaGVzIHRoZSBwcm9jZXNzLgotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBVbmluaXRpYWxpemVkUHRySXRlcmF0b3IpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXI7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSArIDEpOwotICBFWFBFQ1RfVFJVRShpdGVyICE9IHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCkgKyAyKTsKLSAgRVhQRUNUX1RSVUUoaXRlciAhPSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpICsgMyk7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCkpOwotfQotCi1URVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFVuaW5pdGlhbGl6ZWRDb25zdFB0ckl0ZXJhdG9yKSB7Ci0gIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyOwotICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpKTsKLSAgRVhQRUNUX1RSVUUoaXRlciAhPSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSArIDEpOwotICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpICsgMik7Ci0gIEVYUEVDVF9UUlVFKGl0ZXIgIT0gY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCkgKyAzKTsKLSAgRVhQRUNUX1RSVUUoaXRlciAhPSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCkpOwotfQotCi0vLyBUaGlzIGNvbXBhcmlzb24gZnVuY3RvciBpcyByZXF1aXJlZCBieSB0aGUgdGVzdHMgZm9yIFJlcGVhdGVkUHRyT3ZlclB0cnMuCi0vLyBUaGV5IG9wZXJhdGUgb24gc3RyaW5ncyBhbmQgbmVlZCB0byBjb21wYXJlIHN0cmluZ3MgYXMgc3RyaW5ncyBpbgotLy8gYW55IHN0bCBhbGdvcml0aG0sIGV2ZW4gdGhvdWdoIHRoZSBpdGVyYXRvciByZXR1cm5zIGEgcG9pbnRlciB0byBhIHN0cmluZwotLy8gLSBpLmUuICppdGVyIGhhcyB0eXBlIHN0cmluZyouCi1zdHJ1Y3QgU3RyaW5nTGVzc1RoYW4gewotICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nKiB6LCBjb25zdCBzdHJpbmcmIHkpIHsKLSAgICByZXR1cm4gKnogPCB5OwotICB9Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcqIHosIGNvbnN0IHN0cmluZyogeSkgY29uc3QgeyByZXR1cm4gKnogPCAqeTsgfQotfTsKLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBQdHJTVExBbGdvcml0aG1zX2xvd2VyX2JvdW5kKSB7Ci0gIHByb3RvX2FycmF5Xy5DbGVhcigpOwotICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYSIpOwotICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiYyIpOwotICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZCIpOwotICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigibiIpOwotICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigicCIpOwotICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieCIpOwotICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigieSIpOwotCi0gIHsKLSAgICBzdHJpbmcgdiA9ICJmIjsKLSAgICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXQgPQotICAgICAgICBzdGQ6Omxvd2VyX2JvdW5kKHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCksICZ2LCBTdHJpbmdMZXNzVGhhbigpKTsKLQotICAgIEdPT0dMRV9DSEVDSygqaXQgIT0gTlVMTCk7Ci0KLSAgICBFWFBFQ1RfRVEoKippdCwgIm4iKTsKLSAgICBFWFBFQ1RfVFJVRShpdCA9PSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpICsgMyk7Ci0gIH0KLSAgewotICAgIHN0cmluZyB2ID0gImYiOwotICAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdCA9IHN0ZDo6bG93ZXJfYm91bmQoCi0gICAgICAgIGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpLCBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCksCi0gICAgICAgICZ2LCBTdHJpbmdMZXNzVGhhbigpKTsKLQotICAgIEdPT0dMRV9DSEVDSygqaXQgIT0gTlVMTCk7Ci0KLSAgICBFWFBFQ1RfRVEoKippdCwgIm4iKTsKLSAgICBFWFBFQ1RfVFJVRShpdCA9PSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSArIDMpOwotICB9Ci19Ci0KLVRFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgUHRyTXV0YXRpb24pIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQotICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKLSAgKippdGVyID0gInF1eCI7Ci0gIEVYUEVDVF9FUSgicXV4IiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7Ci0KLSAgRVhQRUNUX0VRKCJiYXIiLCBwcm90b19hcnJheV8uR2V0KDEpKTsKLSAgRVhQRUNUX0VRKCJiYXoiLCBwcm90b19hcnJheV8uR2V0KDIpKTsKLSAgKytpdGVyOwotICBkZWxldGUgKml0ZXI7Ci0gICppdGVyID0gbmV3IHN0cmluZygiYSIpOwotICArK2l0ZXI7Ci0gIGRlbGV0ZSAqaXRlcjsKLSAgKml0ZXIgPSBuZXcgc3RyaW5nKCJiIik7Ci0gIEVYUEVDVF9FUSgiYSIsIHByb3RvX2FycmF5Xy5HZXQoMSkpOwotICBFWFBFQ1RfRVEoImIiLCBwcm90b19hcnJheV8uR2V0KDIpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBTb3J0KSB7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJjIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJkIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJuIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJwIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJhIik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJ5Iik7Ci0gIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJ4Iik7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7Ci0gIEVYUEVDVF9FUSgibiIsIHByb3RvX2FycmF5Xy5HZXQoNSkpOwotICBFWFBFQ1RfRVEoIngiLCBwcm90b19hcnJheV8uR2V0KDkpKTsKLSAgc3RkOjpzb3J0KHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCksIHByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpLAotICAgICAgICAgICAgU3RyaW5nTGVzc1RoYW4oKSk7Ci0gIEVYUEVDVF9FUSgiYSIsIHByb3RvX2FycmF5Xy5HZXQoMCkpOwotICBFWFBFQ1RfRVEoImJheiIsIHByb3RvX2FycmF5Xy5HZXQoMikpOwotICBFWFBFQ1RfRVEoInkiLCBwcm90b19hcnJheV8uR2V0KDkpKTsKLX0KLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVW5pdC10ZXN0cyBmb3IgdGhlIGluc2VydCBpdGVyYXRvcnMKLS8vIGdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIsCi0vLyBnb29nbGU6OnByb3RvYnVmOjpBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyCi0vLyBQb3J0ZWQgZnJvbSB1dGlsL2d0bC9wcm90by1hcnJheS1pdGVyYXRvcnNfdW5pdHRlc3QuCi0KLWNsYXNzIFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHByb3RlY3RlZDoKLSAgc3RkOjpsaXN0PGRvdWJsZT4gaGFsdmVzOwotICBzdGQ6Omxpc3Q8aW50PiBmaWJvbmFjY2k7Ci0gIHN0ZDo6dmVjdG9yPHN0cmluZz4gd29yZHM7Ci0gIHR5cGVkZWYgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlIE5lc3RlZDsKLSAgTmVzdGVkIG5lc3RlZHNbMl07Ci0gIHN0ZDo6dmVjdG9yPE5lc3RlZCo+IG5lc3RlZF9wdHJzOwotICBUZXN0QWxsVHlwZXMgcHJvdG9idWZmZXI7Ci0KLSAgdmlydHVhbCB2b2lkIFNldFVwKCkgewotICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soMSk7Ci0gICAgZmlib25hY2NpLnB1c2hfYmFjaygxKTsKLSAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDIpOwotICAgIGZpYm9uYWNjaS5wdXNoX2JhY2soMyk7Ci0gICAgZmlib25hY2NpLnB1c2hfYmFjayg1KTsKLSAgICBmaWJvbmFjY2kucHVzaF9iYWNrKDgpOwotICAgIHN0ZDo6Y29weShmaWJvbmFjY2kuYmVnaW4oKSwgZmlib25hY2NpLmVuZCgpLAotICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfaW50MzIoKSkpOwotCi0gICAgaGFsdmVzLnB1c2hfYmFjaygxLjApOwotICAgIGhhbHZlcy5wdXNoX2JhY2soMC41KTsKLSAgICBoYWx2ZXMucHVzaF9iYWNrKDAuMjUpOwotICAgIGhhbHZlcy5wdXNoX2JhY2soMC4xMjUpOwotICAgIGhhbHZlcy5wdXNoX2JhY2soMC4wNjI1KTsKLSAgICBzdGQ6OmNvcHkoaGFsdmVzLmJlZ2luKCksIGhhbHZlcy5lbmQoKSwKLSAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcihwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX2RvdWJsZSgpKSk7Ci0KLSAgICB3b3Jkcy5wdXNoX2JhY2soIkFibGUiKTsKLSAgICB3b3Jkcy5wdXNoX2JhY2soIndhcyIpOwotICAgIHdvcmRzLnB1c2hfYmFjaygiSSIpOwotICAgIHdvcmRzLnB1c2hfYmFjaygiZXJlIik7Ci0gICAgd29yZHMucHVzaF9iYWNrKCJJIik7Ci0gICAgd29yZHMucHVzaF9iYWNrKCJzYXciKTsKLSAgICB3b3Jkcy5wdXNoX2JhY2soIkVsYmEiKTsKLSAgICBzdGQ6OmNvcHkod29yZHMuYmVnaW4oKSwgd29yZHMuZW5kKCksCi0gICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIocHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKSkpOwotCi0gICAgbmVzdGVkc1swXS5zZXRfYmIoMTcpOwotICAgIG5lc3RlZHNbMV0uc2V0X2JiKDQ3MTEpOwotICAgIHN0ZDo6Y29weSgmbmVzdGVkc1swXSwgJm5lc3RlZHNbMl0sCi0gICAgICAgICAgICAgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIoCi0gICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkpKTsKLQotICAgIG5lc3RlZF9wdHJzLnB1c2hfYmFjayhuZXcgTmVzdGVkKTsKLSAgICBuZXN0ZWRfcHRycy5iYWNrKCktPnNldF9iYigxNzApOwotICAgIG5lc3RlZF9wdHJzLnB1c2hfYmFjayhuZXcgTmVzdGVkKTsKLSAgICBuZXN0ZWRfcHRycy5iYWNrKCktPnNldF9iYig0NzExMCk7Ci0gICAgc3RkOjpjb3B5KG5lc3RlZF9wdHJzLmJlZ2luKCksIG5lc3RlZF9wdHJzLmVuZCgpLAotICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKAotICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIubXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpKSk7Ci0gIH0KLQotICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7Ci0gICAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMobmVzdGVkX3B0cnMuYmVnaW4oKSwgbmVzdGVkX3B0cnMuZW5kKCkpOwotICB9Ci19OwotCi1URVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIEZpYm9uYWNjaSkgewotICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGZpYm9uYWNjaS5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGZpYm9uYWNjaS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5yZXBlYXRlZF9pbnQzMigpLmJlZ2luKCkpKTsKLSAgRVhQRUNUX1RSVUUoc3RkOjplcXVhbChwcm90b2J1ZmZlci5yZXBlYXRlZF9pbnQzMigpLmJlZ2luKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9idWZmZXIucmVwZWF0ZWRfaW50MzIoKS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBmaWJvbmFjY2kuYmVnaW4oKSkpOwotfQotCi1URVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIEhhbHZlcykgewotICBFWFBFQ1RfVFJVRShzdGQ6OmVxdWFsKGhhbHZlcy5iZWdpbigpLAotICAgICAgICAgICAgICAgICAgICAgICAgIGhhbHZlcy5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5yZXBlYXRlZF9kb3VibGUoKS5iZWdpbigpKSk7Ci0gIEVYUEVDVF9UUlVFKHN0ZDo6ZXF1YWwocHJvdG9idWZmZXIucmVwZWF0ZWRfZG91YmxlKCkuYmVnaW4oKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1ZmZlci5yZXBlYXRlZF9kb3VibGUoKS5lbmQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBoYWx2ZXMuYmVnaW4oKSkpOwotfQotCi1URVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIFdvcmRzKSB7Ci0gIEFTU0VSVF9FUSh3b3Jkcy5zaXplKCksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmRzLnNpemUoKTsgKytpKQotICAgIEVYUEVDVF9FUSh3b3Jkcy5hdChpKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKGkpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0LCBXb3JkczIpIHsKLSAgd29yZHMuY2xlYXIoKTsKLSAgd29yZHMucHVzaF9iYWNrKCJzaW5nIik7Ci0gIHdvcmRzLnB1c2hfYmFjaygiYSIpOwotICB3b3Jkcy5wdXNoX2JhY2soInNvbmciKTsKLSAgd29yZHMucHVzaF9iYWNrKCJvZiIpOwotICB3b3Jkcy5wdXNoX2JhY2soInNpeCIpOwotICB3b3Jkcy5wdXNoX2JhY2soInBlbmNlIik7Ci0gIHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCktPkNsZWFyKCk7Ci0gIHN0ZDo6Y29weSh3b3Jkcy5iZWdpbigpLCB3b3Jkcy5lbmQoKSwgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKLSAgICAgIHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKLSAgQVNTRVJUX0VRKHdvcmRzLnNpemUoKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgd29yZHMuc2l6ZSgpOyArK2kpCi0gICAgRVhQRUNUX0VRKHdvcmRzLmF0KGkpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoaSkpOwotfQotCi1URVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsIE5lc3RlZHMpIHsKLSAgQVNTRVJUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSwgNCk7Ci0gIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpLCAxNyk7Ci0gIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgxKS5iYigpLCA0NzExKTsKLSAgRVhQRUNUX0VRKHByb3RvYnVmZmVyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDIpLmJiKCksIDE3MCk7Ci0gIEVYUEVDVF9FUShwcm90b2J1ZmZlci5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgzKS5iYigpLCA0NzExMCk7Ci19Ci0KLVRFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwKLSAgICAgICBBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZ0ludERhdGEpIHsKLSAgdmVjdG9yPE5lc3RlZCo+IGRhdGE7Ci0gIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgTmVzdGVkKiBuZXdfZGF0YSA9IG5ldyBOZXN0ZWQ7Ci0gICAgbmV3X2RhdGEtPnNldF9iYihpKTsKLSAgICBkYXRhLnB1c2hfYmFjayhuZXdfZGF0YSk7Ci0KLSAgICBuZXdfZGF0YSA9IGdvbGRlbnByb3RvLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpOwotICAgIG5ld19kYXRhLT5zZXRfYmIoaSk7Ci0gIH0KLSAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKLSAgc3RkOjpjb3B5KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwKLSAgICAgICAgICAgIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCi0gICAgICAgICAgICAgICAgdGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKSkpOwotICBFWFBFQ1RfRVEodGVzdHByb3RvLkRlYnVnU3RyaW5nKCksIGdvbGRlbnByb3RvLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsCi0gICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZFdpdGhTdHJpbmcpIHsKLSAgdmVjdG9yPHN0cmluZyo+IGRhdGE7Ci0gIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgc3RyaW5nKiBuZXdfZGF0YSA9IG5ldyBzdHJpbmc7Ci0gICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7Ci0gICAgZGF0YS5wdXNoX2JhY2sobmV3X2RhdGEpOwotCi0gICAgbmV3X2RhdGEgPSBnb2xkZW5wcm90by5hZGRfcmVwZWF0ZWRfc3RyaW5nKCk7Ci0gICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7Ci0gIH0KLSAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKLSAgc3RkOjpjb3B5KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rwcm90by5tdXRhYmxlX3JlcGVhdGVkX3N0cmluZygpKSk7Ci0gIEVYUEVDVF9FUSh0ZXN0cHJvdG8uRGVidWdTdHJpbmcoKSwgZ29sZGVucHJvdG8uRGVidWdTdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwKLSAgICAgICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRXaXRoU3RyaW5nSW50RGF0YSkgewotICB2ZWN0b3I8TmVzdGVkKj4gZGF0YTsKLSAgVGVzdEFsbFR5cGVzIGdvbGRlbnByb3RvOwotICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKLSAgICBOZXN0ZWQqIG5ld19kYXRhID0gbmV3IE5lc3RlZDsKLSAgICBuZXdfZGF0YS0+c2V0X2JiKGkpOwotICAgIGRhdGEucHVzaF9iYWNrKG5ld19kYXRhKTsKLQotICAgIG5ld19kYXRhID0gZ29sZGVucHJvdG8uYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7Ci0gICAgbmV3X2RhdGEtPnNldF9iYihpKTsKLSAgfQotICBUZXN0QWxsVHlwZXMgdGVzdHByb3RvOwotICBzdGQ6OmNvcHkoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLAotICAgICAgICAgICAgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydGVyKAotICAgICAgICAgICAgICAgIHRlc3Rwcm90by5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCkpKTsKLSAgRVhQRUNUX0VRKHRlc3Rwcm90by5EZWJ1Z1N0cmluZygpLCBnb2xkZW5wcm90by5EZWJ1Z1N0cmluZygpKTsKLX0KLQotVEVTVF9GKFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0LAotICAgICAgIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZFdpdGhTdHJpbmcpIHsKLSAgdmVjdG9yPHN0cmluZyo+IGRhdGE7Ci0gIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7Ci0gICAgc3RyaW5nKiBuZXdfZGF0YSA9IG5ldyBzdHJpbmc7Ci0gICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7Ci0gICAgZGF0YS5wdXNoX2JhY2sobmV3X2RhdGEpOwotCi0gICAgbmV3X2RhdGEgPSBnb2xkZW5wcm90by5hZGRfcmVwZWF0ZWRfc3RyaW5nKCk7Ci0gICAgKm5ld19kYXRhID0gIm5hbWUtIiArIFNpbXBsZUl0b2EoaSk7Ci0gIH0KLSAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKLSAgc3RkOjpjb3B5KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwKLSAgICAgICAgICAgIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKLSAgICAgICAgICAgICAgICB0ZXN0cHJvdG8ubXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKSkpOwotICBFWFBFQ1RfRVEodGVzdHByb3RvLkRlYnVnU3RyaW5nKCksIGdvbGRlbnByb3RvLkRlYnVnU3RyaW5nKCkpOwotfQotCi19ICAvLyBuYW1lc3BhY2UKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGZmYTkxOWQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNDYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1TZXJ2aWNlOjp+U2VydmljZSgpIHt9Ci1ScGNDaGFubmVsOjp+UnBjQ2hhbm5lbCgpIHt9Ci1ScGNDb250cm9sbGVyOjp+UnBjQ29udHJvbGxlcigpIHt9Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhZDZmOTY4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBERVBSRUNBVEVEOiAgVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFic3RyYWN0IGludGVyZmFjZXMgdW5kZXJseWluZyBwcm90bzIKLS8vIFJQQyBzZXJ2aWNlcy4gIFRoZXNlIGFyZSBpbnRlbnRlZCB0byBiZSBpbmRlcGVuZGVudCBvZiBhbnkgcGFydGljdWxhciBSUEMKLS8vIGltcGxlbWVudGF0aW9uLCBzbyB0aGF0IHByb3RvMiBzZXJ2aWNlcyBjYW4gYmUgdXNlZCBvbiB0b3Agb2YgYSB2YXJpZXR5Ci0vLyBvZiBpbXBsZW1lbnRhdGlvbnMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCi0vLyBub3QgdHJ5IHRvIGJ1aWxkIG9uIHRoZXNlLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zCi0vLyB3aGljaCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5Ci0vLyB0aGUgZ2VuZXJhdGVkIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UKLS8vIGFuZCBjYW4gYXZvaWQgdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgotLy8KLS8vCi0vLyBXaGVuIHlvdSB1c2UgdGhlIHByb3RvY29sIGNvbXBpbGVyIHRvIGNvbXBpbGUgYSBzZXJ2aWNlIGRlZmluaXRpb24sIGl0Ci0vLyBnZW5lcmF0ZXMgdHdvIGNsYXNzZXM6ICBBbiBhYnN0cmFjdCBpbnRlcmZhY2UgZm9yIHRoZSBzZXJ2aWNlICh3aXRoCi0vLyBtZXRob2RzIG1hdGNoaW5nIHRoZSBzZXJ2aWNlIGRlZmluaXRpb24pIGFuZCBhICJzdHViIiBpbXBsZW1lbnRhdGlvbi4KLS8vIEEgc3R1YiBpcyBqdXN0IGEgdHlwZS1zYWZlIHdyYXBwZXIgYXJvdW5kIGFuIFJwY0NoYW5uZWwgd2hpY2ggZW11bGF0ZXMgYQotLy8gbG9jYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCi0vLwotLy8gRm9yIGV4YW1wbGUsIHRoZSBzZXJ2aWNlIGRlZmluaXRpb246Ci0vLyAgIHNlcnZpY2UgTXlTZXJ2aWNlIHsKLS8vICAgICBycGMgRm9vKE15UmVxdWVzdCkgcmV0dXJucyhNeVJlc3BvbnNlKTsKLS8vICAgfQotLy8gd2lsbCBnZW5lcmF0ZSBhYnN0cmFjdCBpbnRlcmZhY2UgIk15U2VydmljZSIgYW5kIGNsYXNzICJNeVNlcnZpY2U6OlN0dWIiLgotLy8gWW91IGNvdWxkIGltcGxlbWVudCBhIE15U2VydmljZSBhcyBmb2xsb3dzOgotLy8gICBjbGFzcyBNeVNlcnZpY2VJbXBsIDogcHVibGljIE15U2VydmljZSB7Ci0vLyAgICBwdWJsaWM6Ci0vLyAgICAgTXlTZXJ2aWNlSW1wbCgpIHt9Ci0vLyAgICAgfk15U2VydmljZUltcGwoKSB7fQotLy8KLS8vICAgICAvLyBpbXBsZW1lbnRzIE15U2VydmljZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vCi0vLyAgICAgdm9pZCBGb28oZ29vZ2xlOjpwcm90b2J1Zjo6UnBjQ29udHJvbGxlciogY29udHJvbGxlciwKLS8vICAgICAgICAgICAgICBjb25zdCBNeVJlcXVlc3QqIHJlcXVlc3QsCi0vLyAgICAgICAgICAgICAgTXlSZXNwb25zZSogcmVzcG9uc2UsCi0vLyAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgewotLy8gICAgICAgLy8gLi4uIHJlYWQgcmVxdWVzdCBhbmQgZmlsbCBpbiByZXNwb25zZSAuLi4KLS8vICAgICAgIGRvbmUtPlJ1bigpOwotLy8gICAgIH0KLS8vICAgfTsKLS8vIFlvdSB3b3VsZCB0aGVuIHJlZ2lzdGVyIGFuIGluc3RhbmNlIG9mIE15U2VydmljZUltcGwgd2l0aCB5b3VyIFJQQyBzZXJ2ZXIKLS8vIGltcGxlbWVudGF0aW9uLiAgKEhvdyB0byBkbyB0aGF0IGRlcGVuZHMgb24gdGhlIGltcGxlbWVudGF0aW9uLikKLS8vCi0vLyBUbyBjYWxsIGEgcmVtb3RlIE15U2VydmljZUltcGwsIGZpcnN0IHlvdSBuZWVkIGFuIFJwY0NoYW5uZWwgY29ubmVjdGVkIHRvIGl0LgotLy8gSG93IHRvIGNvbnN0cnVjdCBhIGNoYW5uZWwgZGVwZW5kcywgYWdhaW4sIG9uIHlvdXIgUlBDIGltcGxlbWVudGF0aW9uLgotLy8gSGVyZSB3ZSB1c2UgYSBoeXBvdGhldGljYWwgIk15UnBjQ2hhbm5lbCIgYXMgYW4gZXhhbXBsZToKLS8vICAgTXlScGNDaGFubmVsIGNoYW5uZWwoInJwYzpob3N0bmFtZToxMjM0L215c2VydmljZSIpOwotLy8gICBNeVJwY0NvbnRyb2xsZXIgY29udHJvbGxlcjsKLS8vICAgTXlTZXJ2aWNlSW1wbDo6U3R1YiBzdHViKCZjaGFubmVsKTsKLS8vICAgRm9vUmVxdWVzdCByZXF1ZXN0OwotLy8gICBGb29SZXNwb25zZSByZXNwb25zZTsKLS8vCi0vLyAgIC8vIC4uLiBmaWxsIGluIHJlcXVlc3QgLi4uCi0vLwotLy8gICBzdHViLkZvbygmY29udHJvbGxlciwgcmVxdWVzdCwgJnJlc3BvbnNlLCBOZXdDYWxsYmFjayhIYW5kbGVSZXNwb25zZSkpOwotLy8KLS8vIE9uIFRocmVhZC1TYWZldHk6Ci0vLwotLy8gRGlmZmVyZW50IFJQQyBpbXBsZW1lbnRhdGlvbnMgbWF5IG1ha2UgZGlmZmVyZW50IGd1YXJhbnRlZXMgYWJvdXQgd2hhdAotLy8gdGhyZWFkcyB0aGV5IG1heSBydW4gY2FsbGJhY2tzIG9uLCBhbmQgd2hhdCB0aHJlYWRzIHRoZSBhcHBsaWNhdGlvbiBpcwotLy8gYWxsb3dlZCB0byB1c2UgdG8gY2FsbCB0aGUgUlBDIHN5c3RlbS4gIFBvcnRhYmxlIHNvZnR3YXJlIHNob3VsZCBiZSByZWFkeQotLy8gZm9yIGNhbGxiYWNrcyB0byBiZSBjYWxsZWQgb24gYW55IHRocmVhZCwgYnV0IHNob3VsZCBub3QgdHJ5IHRvIGNhbGwgdGhlCi0vLyBSUEMgc3lzdGVtIGZyb20gYW55IHRocmVhZCBleGNlcHQgZm9yIHRoZSBvbmVzIG9uIHdoaWNoIGl0IHJlY2VpdmVkIHRoZQotLy8gY2FsbGJhY2tzLiAgUmVhbGlzdGljYWxseSwgdGhvdWdoLCBzaW1wbGUgc29mdHdhcmUgd2lsbCBwcm9iYWJseSB3YW50IHRvCi0vLyB1c2UgYSBzaW5nbGUtdGhyZWFkZWQgUlBDIHN5c3RlbSB3aGlsZSBoaWdoLWVuZCBzb2Z0d2FyZSB3aWxsIHdhbnQgdG8KLS8vIHVzZSBtdWx0aXBsZSB0aHJlYWRzLiAgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQgcHJvdmlkZSBtdWx0aXBsZQotLy8gY2hvaWNlcy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU0VSVklDRV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VfSF9fCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLS8vIERlZmluZWQgaW4gdGhpcyBmaWxlLgotY2xhc3MgU2VydmljZTsKLWNsYXNzIFJwY0NvbnRyb2xsZXI7Ci1jbGFzcyBScGNDaGFubmVsOwotCi0vLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgotY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKLWNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yOyAgICAgLy8gZGVzY3JpcHRvci5oCi1jbGFzcyBNZXRob2REZXNjcmlwdG9yOyAgICAgIC8vIGRlc2NyaXB0b3IuaAotY2xhc3MgTWVzc2FnZTsgICAgICAgICAgICAgICAvLyBtZXNzYWdlLmgKLQotLy8gQWJzdHJhY3QgYmFzZSBpbnRlcmZhY2UgZm9yIHByb3RvY29sLWJ1ZmZlci1iYXNlZCBSUEMgc2VydmljZXMuICBTZXJ2aWNlcwotLy8gdGhlbXNlbHZlcyBhcmUgYWJzdHJhY3QgaW50ZXJmYWNlcyAoaW1wbGVtZW50ZWQgZWl0aGVyIGJ5IHNlcnZlcnMgb3IgYXMKLS8vIHN0dWJzKSwgYnV0IHRoZXkgc3ViY2xhc3MgdGhpcyBiYXNlIGludGVyZmFjZS4gIFRoZSBtZXRob2RzIG9mIHRoaXMKLS8vIGludGVyZmFjZSBjYW4gYmUgdXNlZCB0byBjYWxsIHRoZSBtZXRob2RzIG9mIHRoZSBTZXJ2aWNlIHdpdGhvdXQga25vd2luZwotLy8gaXRzIGV4YWN0IHR5cGUgYXQgY29tcGlsZSB0aW1lIChhbmFsb2dvdXMgdG8gUmVmbGVjdGlvbikuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU2VydmljZSB7Ci0gcHVibGljOgotICBpbmxpbmUgU2VydmljZSgpIHt9Ci0gIHZpcnR1YWwgflNlcnZpY2UoKTsKLQotICAvLyBXaGVuIGNvbnN0cnVjdGluZyBhIHN0dWIsIHlvdSBtYXkgcGFzcyBTVFVCX09XTlNfQ0hBTk5FTCBhcyB0aGUgc2Vjb25kCi0gIC8vIHBhcmFtZXRlciB0byB0aGUgY29uc3RydWN0b3IgdG8gdGVsbCBpdCB0byBkZWxldGUgaXRzIFJwY0NoYW5uZWwgd2hlbgotICAvLyBkZXN0cm95ZWQuCi0gIGVudW0gQ2hhbm5lbE93bmVyc2hpcCB7Ci0gICAgU1RVQl9PV05TX0NIQU5ORUwsCi0gICAgU1RVQl9ET0VTTlRfT1dOX0NIQU5ORUwKLSAgfTsKLQotICAvLyBHZXQgdGhlIFNlcnZpY2VEZXNjcmlwdG9yIGRlc2NyaWJpbmcgdGhpcyBzZXJ2aWNlIGFuZCBpdHMgbWV0aG9kcy4KLSAgdmlydHVhbCBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogR2V0RGVzY3JpcHRvcigpID0gMDsKLQotICAvLyBDYWxsIGEgbWV0aG9kIG9mIHRoZSBzZXJ2aWNlIHNwZWNpZmllZCBieSBNZXRob2REZXNjcmlwdG9yLiAgVGhpcyBpcwotICAvLyBub3JtYWxseSBpbXBsZW1lbnRlZCBhcyBhIHNpbXBsZSBzd2l0Y2goKSB0aGF0IGNhbGxzIHRoZSBzdGFuZGFyZAotICAvLyBkZWZpbml0aW9ucyBvZiB0aGUgc2VydmljZSdzIG1ldGhvZHMuCi0gIC8vCi0gIC8vIFByZWNvbmRpdGlvbnM6Ci0gIC8vICogbWV0aG9kLT5zZXJ2aWNlKCkgPT0gR2V0RGVzY3JpcHRvcigpCi0gIC8vICogcmVxdWVzdCBhbmQgcmVzcG9uc2UgYXJlIG9mIHRoZSBleGFjdCBzYW1lIGNsYXNzZXMgYXMgdGhlIG9iamVjdHMKLSAgLy8gICByZXR1cm5lZCBieSBHZXRSZXF1ZXN0UHJvdG90eXBlKG1ldGhvZCkgYW5kCi0gIC8vICAgR2V0UmVzcG9uc2VQcm90b3R5cGUobWV0aG9kKS4KLSAgLy8gKiBBZnRlciB0aGUgY2FsbCBoYXMgc3RhcnRlZCwgdGhlIHJlcXVlc3QgbXVzdCBub3QgYmUgbW9kaWZpZWQgYW5kIHRoZQotICAvLyAgIHJlc3BvbnNlIG11c3Qgbm90IGJlIGFjY2Vzc2VkIGF0IGFsbCB1bnRpbCAiZG9uZSIgaXMgY2FsbGVkLgotICAvLyAqICJjb250cm9sbGVyIiBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGJlaW5nCi0gIC8vICAgdXNlZCBieSB0aGlzIFNlcnZpY2UuICBGb3Igc3R1YnMsIHRoZSAiY29ycmVjdCB0eXBlIiBkZXBlbmRzIG9uIHRoZQotICAvLyAgIFJwY0NoYW5uZWwgd2hpY2ggdGhlIHN0dWIgaXMgdXNpbmcuICBTZXJ2ZXItc2lkZSBTZXJ2aWNlCi0gIC8vICAgaW1wbGVtZW50YXRpb25zIGFyZSBleHBlY3RlZCB0byBhY2NlcHQgd2hhdGV2ZXIgdHlwZSBvZiBScGNDb250cm9sbGVyCi0gIC8vICAgdGhlIHNlcnZlci1zaWRlIFJQQyBpbXBsZW1lbnRhdGlvbiB1c2VzLgotICAvLwotICAvLyBQb3N0Y29uZGl0aW9uczoKLSAgLy8gKiAiZG9uZSIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGNvbXBsZXRlLiAgVGhpcyBtYXkgYmUKLSAgLy8gICBiZWZvcmUgQ2FsbE1ldGhvZCgpIHJldHVybnMgb3IgaXQgbWF5IGJlIGF0IHNvbWUgcG9pbnQgaW4gdGhlIGZ1dHVyZS4KLSAgLy8gKiBJZiB0aGUgUlBDIHN1Y2NlZWRlZCwgInJlc3BvbnNlIiBjb250YWlucyB0aGUgcmVzcG9uc2UgcmV0dXJuZWQgYnkKLSAgLy8gICB0aGUgc2VydmVyLgotICAvLyAqIElmIHRoZSBSUEMgZmFpbGVkLCAicmVzcG9uc2UiJ3MgY29udGVudHMgYXJlIHVuZGVmaW5lZC4gIFRoZQotICAvLyAgIFJwY0NvbnRyb2xsZXIgY2FuIGJlIHF1ZXJpZWQgdG8gZGV0ZXJtaW5lIGlmIGFuIGVycm9yIG9jY3VycmVkIGFuZAotICAvLyAgIHBvc3NpYmx5IHRvIGdldCBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSBlcnJvci4KLSAgdmlydHVhbCB2b2lkIENhbGxNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgPSAwOwotCi0gIC8vIENhbGxNZXRob2QoKSByZXF1aXJlcyB0aGF0IHRoZSByZXF1ZXN0IGFuZCByZXNwb25zZSBwYXNzZWQgaW4gYXJlIG9mIGEKLSAgLy8gcGFydGljdWxhciBzdWJjbGFzcyBvZiBNZXNzYWdlLiAgR2V0UmVxdWVzdFByb3RvdHlwZSgpIGFuZAotICAvLyBHZXRSZXNwb25zZVByb3RvdHlwZSgpIGdldCB0aGUgZGVmYXVsdCBpbnN0YW5jZXMgb2YgdGhlc2UgcmVxdWlyZWQgdHlwZXMuCi0gIC8vIFlvdSBjYW4gdGhlbiBjYWxsIE1lc3NhZ2U6Ok5ldygpIG9uIHRoZXNlIGluc3RhbmNlcyB0byBjb25zdHJ1Y3QgbXV0YWJsZQotICAvLyBvYmplY3RzIHdoaWNoIHlvdSBjYW4gdGhlbiBwYXNzIHRvIENhbGxNZXRob2QoKS4KLSAgLy8KLSAgLy8gRXhhbXBsZToKLSAgLy8gICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPQotICAvLyAgICAgc2VydmljZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kTWV0aG9kQnlOYW1lKCJGb28iKTsKLSAgLy8gICBNZXNzYWdlKiByZXF1ZXN0ICA9IHN0dWItPkdldFJlcXVlc3RQcm90b3R5cGUgKG1ldGhvZCktPk5ldygpOwotICAvLyAgIE1lc3NhZ2UqIHJlc3BvbnNlID0gc3R1Yi0+R2V0UmVzcG9uc2VQcm90b3R5cGUobWV0aG9kKS0+TmV3KCk7Ci0gIC8vICAgcmVxdWVzdC0+UGFyc2VGcm9tU3RyaW5nKGlucHV0KTsKLSAgLy8gICBzZXJ2aWNlLT5DYWxsTWV0aG9kKG1ldGhvZCwgKnJlcXVlc3QsIHJlc3BvbnNlLCBjYWxsYmFjayk7Ci0gIHZpcnR1YWwgY29uc3QgTWVzc2FnZSYgR2V0UmVxdWVzdFByb3RvdHlwZSgKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0ID0gMDsKLSAgdmlydHVhbCBjb25zdCBNZXNzYWdlJiBHZXRSZXNwb25zZVByb3RvdHlwZSgKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpIGNvbnN0ID0gMDsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXJ2aWNlKTsKLX07Ci0KLS8vIEFuIFJwY0NvbnRyb2xsZXIgbWVkaWF0ZXMgYSBzaW5nbGUgbWV0aG9kIGNhbGwuICBUaGUgcHJpbWFyeSBwdXJwb3NlIG9mCi0vLyB0aGUgY29udHJvbGxlciBpcyB0byBwcm92aWRlIGEgd2F5IHRvIG1hbmlwdWxhdGUgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gdGhlCi0vLyBSUEMgaW1wbGVtZW50YXRpb24gYW5kIHRvIGZpbmQgb3V0IGFib3V0IFJQQy1sZXZlbCBlcnJvcnMuCi0vLwotLy8gVGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIFJwY0NvbnRyb2xsZXIgaW50ZXJmYWNlIGFyZSBpbnRlbmRlZCB0byBiZSBhCi0vLyAibGVhc3QgY29tbW9uIGRlbm9taW5hdG9yIiBzZXQgb2YgZmVhdHVyZXMgd2hpY2ggd2UgZXhwZWN0IGFsbAotLy8gaW1wbGVtZW50YXRpb25zIHRvIHN1cHBvcnQuICBTcGVjaWZpYyBpbXBsZW1lbnRhdGlvbnMgbWF5IHByb3ZpZGUgbW9yZQotLy8gYWR2YW5jZWQgZmVhdHVyZXMgKGUuZy4gZGVhZGxpbmUgcHJvcGFnYXRpb24pLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFJwY0NvbnRyb2xsZXIgewotIHB1YmxpYzoKLSAgaW5saW5lIFJwY0NvbnRyb2xsZXIoKSB7fQotICB2aXJ0dWFsIH5ScGNDb250cm9sbGVyKCk7Ci0KLSAgLy8gQ2xpZW50LXNpZGUgbWV0aG9kcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgY2xpZW50IHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMKLSAgLy8gYXJlIHVuZGVmaW5lZCBvbiB0aGUgc2VydmVyIHNpZGUgKG1heSBjcmFzaCkuCi0KLSAgLy8gUmVzZXRzIHRoZSBScGNDb250cm9sbGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlIHNvIHRoYXQgaXQgbWF5IGJlIHJldXNlZCBpbgotICAvLyBhIG5ldyBjYWxsLiAgTXVzdCBub3QgYmUgY2FsbGVkIHdoaWxlIGFuIFJQQyBpcyBpbiBwcm9ncmVzcy4KLSAgdmlydHVhbCB2b2lkIFJlc2V0KCkgPSAwOwotCi0gIC8vIEFmdGVyIGEgY2FsbCBoYXMgZmluaXNoZWQsIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbCBmYWlsZWQuICBUaGUgcG9zc2libGUKLSAgLy8gcmVhc29ucyBmb3IgZmFpbHVyZSBkZXBlbmQgb24gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbi4gIEZhaWxlZCgpIG11c3Qgbm90Ci0gIC8vIGJlIGNhbGxlZCBiZWZvcmUgYSBjYWxsIGhhcyBmaW5pc2hlZC4gIElmIEZhaWxlZCgpIHJldHVybnMgdHJ1ZSwgdGhlCi0gIC8vIGNvbnRlbnRzIG9mIHRoZSByZXNwb25zZSBtZXNzYWdlIGFyZSB1bmRlZmluZWQuCi0gIHZpcnR1YWwgYm9vbCBGYWlsZWQoKSBjb25zdCA9IDA7Ci0KLSAgLy8gSWYgRmFpbGVkKCkgaXMgdHJ1ZSwgcmV0dXJucyBhIGh1bWFuLXJlYWRhYmxlIGRlc2NyaXB0aW9uIG9mIHRoZSBlcnJvci4KLSAgdmlydHVhbCBzdHJpbmcgRXJyb3JUZXh0KCkgY29uc3QgPSAwOwotCi0gIC8vIEFkdmlzZXMgdGhlIFJQQyBzeXN0ZW0gdGhhdCB0aGUgY2FsbGVyIGRlc2lyZXMgdGhhdCB0aGUgUlBDIGNhbGwgYmUKLSAgLy8gY2FuY2VsZWQuICBUaGUgUlBDIHN5c3RlbSBtYXkgY2FuY2VsIGl0IGltbWVkaWF0ZWx5LCBtYXkgd2FpdCBhd2hpbGUgYW5kCi0gIC8vIHRoZW4gY2FuY2VsIGl0LCBvciBtYXkgbm90IGV2ZW4gY2FuY2VsIHRoZSBjYWxsIGF0IGFsbC4gIElmIHRoZSBjYWxsIGlzCi0gIC8vIGNhbmNlbGVkLCB0aGUgImRvbmUiIGNhbGxiYWNrIHdpbGwgc3RpbGwgYmUgY2FsbGVkIGFuZCB0aGUgUnBjQ29udHJvbGxlcgotICAvLyB3aWxsIGluZGljYXRlIHRoYXQgdGhlIGNhbGwgZmFpbGVkIGF0IHRoYXQgdGltZS4KLSAgdmlydHVhbCB2b2lkIFN0YXJ0Q2FuY2VsKCkgPSAwOwotCi0gIC8vIFNlcnZlci1zaWRlIG1ldGhvZHMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIFRoZXNlIGNhbGxzIG1heSBiZSBtYWRlIGZyb20gdGhlIHNlcnZlciBzaWRlIG9ubHkuICBUaGVpciByZXN1bHRzCi0gIC8vIGFyZSB1bmRlZmluZWQgb24gdGhlIGNsaWVudCBzaWRlIChtYXkgY3Jhc2gpLgotCi0gIC8vIENhdXNlcyBGYWlsZWQoKSB0byByZXR1cm4gdHJ1ZSBvbiB0aGUgY2xpZW50IHNpZGUuICAicmVhc29uIiB3aWxsIGJlCi0gIC8vIGluY29ycG9yYXRlZCBpbnRvIHRoZSBtZXNzYWdlIHJldHVybmVkIGJ5IEVycm9yVGV4dCgpLiAgSWYgeW91IGZpbmQKLSAgLy8geW91IG5lZWQgdG8gcmV0dXJuIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gYWJvdXQgZmFpbHVyZXMsIHlvdQotICAvLyBzaG91bGQgaW5jb3Jwb3JhdGUgaXQgaW50byB5b3VyIHJlc3BvbnNlIHByb3RvY29sIGJ1ZmZlciBhbmQgc2hvdWxkCi0gIC8vIE5PVCBjYWxsIFNldEZhaWxlZCgpLgotICB2aXJ0dWFsIHZvaWQgU2V0RmFpbGVkKGNvbnN0IHN0cmluZyYgcmVhc29uKSA9IDA7Ci0KLSAgLy8gSWYgdHJ1ZSwgaW5kaWNhdGVzIHRoYXQgdGhlIGNsaWVudCBjYW5jZWxlZCB0aGUgUlBDLCBzbyB0aGUgc2VydmVyIG1heQotICAvLyBhcyB3ZWxsIGdpdmUgdXAgb24gcmVwbHlpbmcgdG8gaXQuICBUaGUgc2VydmVyIHNob3VsZCBzdGlsbCBjYWxsIHRoZQotICAvLyBmaW5hbCAiZG9uZSIgY2FsbGJhY2suCi0gIHZpcnR1YWwgYm9vbCBJc0NhbmNlbGVkKCkgY29uc3QgPSAwOwotCi0gIC8vIEFza3MgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYW5jZWxlZC4gIFRoZQotICAvLyBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSBjYWxsZWQgZXhhY3RseSBvbmNlLiAgSWYgdGhlIFJQQyBjb21wbGV0ZXMgd2l0aG91dAotICAvLyBiZWluZyBjYW5jZWxlZCwgdGhlIGNhbGxiYWNrIHdpbGwgYmUgY2FsbGVkIGFmdGVyIGNvbXBsZXRpb24uICBJZiB0aGUgUlBDCi0gIC8vIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgd2hlbiBOb3RpZnlPbkNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlIGNhbGxiYWNrCi0gIC8vIHdpbGwgYmUgY2FsbGVkIGltbWVkaWF0ZWx5LgotICAvLwotICAvLyBOb3RpZnlPbkNhbmNlbCgpIG11c3QgYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgotICB2aXJ0dWFsIHZvaWQgTm90aWZ5T25DYW5jZWwoQ2xvc3VyZSogY2FsbGJhY2spID0gMDsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhScGNDb250cm9sbGVyKTsKLX07Ci0KLS8vIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYW4gUlBDIGNoYW5uZWwuICBBbiBScGNDaGFubmVsIHJlcHJlc2VudHMgYQotLy8gY29tbXVuaWNhdGlvbiBsaW5lIHRvIGEgU2VydmljZSB3aGljaCBjYW4gYmUgdXNlZCB0byBjYWxsIHRoYXQgU2VydmljZSdzCi0vLyBtZXRob2RzLiAgVGhlIFNlcnZpY2UgbWF5IGJlIHJ1bm5pbmcgb24gYW5vdGhlciBtYWNoaW5lLiAgTm9ybWFsbHksIHlvdQotLy8gc2hvdWxkIG5vdCBjYWxsIGFuIFJwY0NoYW5uZWwgZGlyZWN0bHksIGJ1dCBpbnN0ZWFkIGNvbnN0cnVjdCBhIHN0dWIgU2VydmljZQotLy8gd3JhcHBpbmcgaXQuICBFeGFtcGxlOgotLy8gICBScGNDaGFubmVsKiBjaGFubmVsID0gbmV3IE15UnBjQ2hhbm5lbCgicmVtb3RlaG9zdC5leGFtcGxlLmNvbToxMjM0Iik7Ci0vLyAgIE15U2VydmljZSogc2VydmljZSA9IG5ldyBNeVNlcnZpY2U6OlN0dWIoY2hhbm5lbCk7Ci0vLyAgIHNlcnZpY2UtPk15TWV0aG9kKHJlcXVlc3QsICZyZXNwb25zZSwgY2FsbGJhY2spOwotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFJwY0NoYW5uZWwgewotIHB1YmxpYzoKLSAgaW5saW5lIFJwY0NoYW5uZWwoKSB7fQotICB2aXJ0dWFsIH5ScGNDaGFubmVsKCk7Ci0KLSAgLy8gQ2FsbCB0aGUgZ2l2ZW4gbWV0aG9kIG9mIHRoZSByZW1vdGUgc2VydmljZS4gIFRoZSBzaWduYXR1cmUgb2YgdGhpcwotICAvLyBwcm9jZWR1cmUgbG9va3MgdGhlIHNhbWUgYXMgU2VydmljZTo6Q2FsbE1ldGhvZCgpLCBidXQgdGhlIHJlcXVpcmVtZW50cwotICAvLyBhcmUgbGVzcyBzdHJpY3QgaW4gb25lIGltcG9ydGFudCB3YXk6ICB0aGUgcmVxdWVzdCBhbmQgcmVzcG9uc2Ugb2JqZWN0cwotICAvLyBuZWVkIG5vdCBiZSBvZiBhbnkgc3BlY2lmaWMgY2xhc3MgYXMgbG9uZyBhcyB0aGVpciBkZXNjcmlwdG9ycyBhcmUKLSAgLy8gbWV0aG9kLT5pbnB1dF90eXBlKCkgYW5kIG1ldGhvZC0+b3V0cHV0X3R5cGUoKS4KLSAgdmlydHVhbCB2b2lkIENhbGxNZXRob2QoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyKiBjb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiByZXF1ZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiByZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xvc3VyZSogZG9uZSkgPSAwOwotCi0gcHJpdmF0ZToKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJwY0NoYW5uZWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NFUlZJQ0VfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOWIzZDFlNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjQ2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGUgcm91dGluZXMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUgYXJlIHN1YnRsZS4gIElmIHlvdSB1c2UgdGhlbSwgZXZlbiBpZgotLy8geW91IGdldCB0aGUgY29kZSByaWdodCwgaXQgd2lsbCBkZXBlbmQgb24gY2FyZWZ1bCByZWFzb25pbmcgYWJvdXQgYXRvbWljaXR5Ci0vLyBhbmQgbWVtb3J5IG9yZGVyaW5nOyBpdCB3aWxsIGJlIGxlc3MgcmVhZGFibGUsIGFuZCBoYXJkZXIgdG8gbWFpbnRhaW4uICBJZgotLy8geW91IHBsYW4gdG8gdXNlIHRoZXNlIHJvdXRpbmVzLCB5b3Ugc2hvdWxkIGhhdmUgYSBnb29kIHJlYXNvbiwgc3VjaCBhcyBzb2xpZAotLy8gZXZpZGVuY2UgdGhhdCBwZXJmb3JtYW5jZSB3b3VsZCBvdGhlcndpc2Ugc3VmZmVyLCBvciB0aGVyZSBiZWluZyBubwotLy8gYWx0ZXJuYXRpdmUuICBZb3Ugc2hvdWxkIGFzc3VtZSBvbmx5IHByb3BlcnRpZXMgZXhwbGljaXRseSBndWFyYW50ZWVkIGJ5IHRoZQotLy8gc3BlY2lmaWNhdGlvbnMgaW4gdGhpcyBmaWxlLiAgWW91IGFyZSBhbG1vc3QgY2VydGFpbmx5IF9ub3RfIHdyaXRpbmcgY29kZQotLy8ganVzdCBmb3IgdGhlIHg4NjsgaWYgeW91IGFzc3VtZSB4ODYgc2VtYW50aWNzLCB4ODYgaGFyZHdhcmUgYnVncyBhbmQKLS8vIGltcGxlbWVudGF0aW9ucyBvbiBvdGhlciBhcmNodGVjdHVyZXMgd2lsbCBjYXVzZSB5b3VyIGNvZGUgdG8gYnJlYWsuICBJZiB5b3UKLS8vIGRvIG5vdCBrbm93IHdoYXQgeW91IGFyZSBkb2luZywgYXZvaWQgdGhlc2Ugcm91dGluZXMsIGFuZCB1c2UgYSBNdXRleC4KLS8vCi0vLyBJdCBpcyBpbmNvcnJlY3QgdG8gbWFrZSBkaXJlY3QgYXNzaWdubWVudHMgdG8vZnJvbSBhbiBhdG9taWMgdmFyaWFibGUuCi0vLyBZb3Ugc2hvdWxkIHVzZSBvbmUgb2YgdGhlIExvYWQgb3IgU3RvcmUgcm91dGluZXMuICBUaGUgTm9CYXJyaWVyCi0vLyB2ZXJzaW9ucyBhcmUgcHJvdmlkZWQgd2hlbiBubyBiYXJyaWVycyBhcmUgbmVlZGVkOgotLy8gICBOb0JhcnJpZXJfU3RvcmUoKQotLy8gICBOb0JhcnJpZXJfTG9hZCgpCi0vLyBBbHRob3VnaCB0aGVyZSBhcmUgY3VycmVudGx5IG5vIGNvbXBpbGVyIGVuZm9yY2VtZW50LCB5b3UgYXJlIGVuY291cmFnZWQKLS8vIHRvIHVzZSB0aGVzZS4KLQotLy8gVGhpcyBoZWFkZXIgYW5kIHRoZSBpbXBsZW1lbnRhdGlvbnMgZm9yIGVhY2ggcGxhdGZvcm0gKGxvY2F0ZWQgaW4KLS8vIGF0b21pY29wc19pbnRlcm5hbHNfKikgbXVzdCBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdXBzdHJlYW0gY29kZSAoVjgpLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSF8KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19IXwotCi0vLyBEb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBmb3IgcGVvcGxlIG5vdCBjb25jZXJuZWQgYWJvdXQgdGhyZWFkIHNhZmV0eS4KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLSNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX1BPV0VSKQotI2lmIGRlZmluZWQoX0xQNjQpIHx8IGRlZmluZWQoX19MUDY0X18pCi10eXBlZGVmIGludDMyIEF0b21pYzMyOwotdHlwZWRlZiBpbnRwdHJfdCBBdG9taWM2NDsKLSNlbHNlCi10eXBlZGVmIGludHB0cl90IEF0b21pYzMyOwotdHlwZWRlZiBpbnQ2NCBBdG9taWM2NDsKLSNlbmRpZgotI2Vsc2UKLXR5cGVkZWYgaW50MzIgQXRvbWljMzI7Ci0jaWZkZWYgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUCi0vLyBXZSBuZWVkIHRvIGJlIGFibGUgdG8gZ28gYmV0d2VlbiBBdG9taWM2NCBhbmQgQXRvbWljV29yZCBpbXBsaWNpdGx5LiAgVGhpcwotLy8gbWVhbnMgQXRvbWljNjQgYW5kIEF0b21pY1dvcmQgc2hvdWxkIGJlIHRoZSBzYW1lIHR5cGUgb24gNjQtYml0LgotI2lmIGRlZmluZWQoX19JTFAzMl9fKSB8fCBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19OQUNMKQotLy8gTmFDbCdzIGludHB0cl90IGlzIG5vdCBhY3R1YWxseSA2NC1iaXRzIG9uIDY0LWJpdCEKLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9uYXRpdmVjbGllbnQvaXNzdWVzL2RldGFpbD9pZD0xMTYyCi0vLyBzcGFyY3Y5J3MgcG9pbnRlciB0eXBlIGlzIDMyYml0cwotdHlwZWRlZiBpbnQ2NCBBdG9taWM2NDsKLSNlbHNlCi10eXBlZGVmIGludHB0cl90IEF0b21pYzY0OwotI2VuZGlmCi0jZW5kaWYKLSNlbmRpZgotCi0vLyBVc2UgQXRvbWljV29yZCBmb3IgYSBtYWNoaW5lLXNpemVkIHBvaW50ZXIuICBJdCB3aWxsIHVzZSB0aGUgQXRvbWljMzIgb3IKLS8vIEF0b21pYzY0IHJvdXRpbmVzIGJlbG93LCBkZXBlbmRpbmcgb24geW91ciBhcmNoaXRlY3R1cmUuCi10eXBlZGVmIGludHB0cl90IEF0b21pY1dvcmQ7Ci0KLS8vIEF0b21pY2FsbHkgZXhlY3V0ZToKLS8vICAgICAgcmVzdWx0ID0gKnB0cjsKLS8vICAgICAgaWYgKCpwdHIgPT0gb2xkX3ZhbHVlKQotLy8gICAgICAgICpwdHIgPSBuZXdfdmFsdWU7Ci0vLyAgICAgIHJldHVybiByZXN1bHQ7Ci0vLwotLy8gSS5lLiwgcmVwbGFjZSAiKnB0ciIgd2l0aCAibmV3X3ZhbHVlIiBpZiAiKnB0ciIgdXNlZCB0byBiZSAib2xkX3ZhbHVlIi4KLS8vIEFsd2F5cyByZXR1cm4gdGhlIG9sZCB2YWx1ZSBvZiAiKnB0ciIKLS8vCi0vLyBUaGlzIHJvdXRpbmUgaW1wbGllcyBubyBtZW1vcnkgYmFycmllcnMuCi1BdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKTsKLQotLy8gQXRvbWljYWxseSBzdG9yZSBuZXdfdmFsdWUgaW50byAqcHRyLCByZXR1cm5pbmcgdGhlIHByZXZpb3VzIHZhbHVlIGhlbGQgaW4KLS8vICpwdHIuICBUaGlzIHJvdXRpbmUgaW1wbGllcyBubyBtZW1vcnkgYmFycmllcnMuCi1BdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgbmV3X3ZhbHVlKTsKLQotLy8gQXRvbWljYWxseSBpbmNyZW1lbnQgKnB0ciBieSAiaW5jcmVtZW50Ii4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZgotLy8gKnB0ciB3aXRoIHRoZSBpbmNyZW1lbnQgYXBwbGllZC4gIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KLUF0b21pYzMyIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgaW5jcmVtZW50KTsKLQotQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCk7Ci0KLS8vIFRoZXNlIGZvbGxvd2luZyBsb3dlci1sZXZlbCBvcGVyYXRpb25zIGFyZSB0eXBpY2FsbHkgdXNlZnVsIG9ubHkgdG8gcGVvcGxlCi0vLyBpbXBsZW1lbnRpbmcgaGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zIGxpa2Ugc3BpbmxvY2tzLAotLy8gbXV0ZXhlcywgYW5kIGNvbmRpdGlvbi12YXJpYWJsZXMuICBUaGV5IGNvbWJpbmUgQ29tcGFyZUFuZFN3YXAoKSwgYSBsb2FkLCBvcgotLy8gYSBzdG9yZSB3aXRoIGFwcHJvcHJpYXRlIG1lbW9yeS1vcmRlcmluZyBpbnN0cnVjdGlvbnMuICAiQWNxdWlyZSIgb3BlcmF0aW9ucwotLy8gZW5zdXJlIHRoYXQgbm8gbGF0ZXIgbWVtb3J5IGFjY2VzcyBjYW4gYmUgcmVvcmRlcmVkIGFoZWFkIG9mIHRoZSBvcGVyYXRpb24uCi0vLyAiUmVsZWFzZSIgb3BlcmF0aW9ucyBlbnN1cmUgdGhhdCBubyBwcmV2aW91cyBtZW1vcnkgYWNjZXNzIGNhbiBiZSByZW9yZGVyZWQKLS8vIGFmdGVyIHRoZSBvcGVyYXRpb24uICAiQmFycmllciIgb3BlcmF0aW9ucyBoYXZlIGJvdGggIkFjcXVpcmUiIGFuZCAiUmVsZWFzZSIKLS8vIHNlbWFudGljcy4gICBBIE1lbW9yeUJhcnJpZXIoKSBoYXMgIkJhcnJpZXIiIHNlbWFudGljcywgYnV0IGRvZXMgbm8gbWVtb3J5Ci0vLyBhY2Nlc3MuCi1BdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKTsKLUF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpOwotCi0jaWYgZGVmaW5lZChfX01JTkdXMzJfXykgJiYgZGVmaW5lZChNZW1vcnlCYXJyaWVyKQotI3VuZGVmIE1lbW9yeUJhcnJpZXIKLSNlbmRpZgotdm9pZCBNZW1vcnlCYXJyaWVyKCk7Ci12b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSk7Ci12b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpOwotdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKTsKLQotQXRvbWljMzIgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cik7Ci1BdG9taWMzMiBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cik7Ci1BdG9taWMzMiBSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cik7Ci0KLS8vIDY0LWJpdCBhdG9taWMgb3BlcmF0aW9ucyAob25seSBhdmFpbGFibGUgb24gNjQtYml0IHByb2Nlc3NvcnMpLgotI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVAotQXRvbWljNjQgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSk7Ci1BdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgbmV3X3ZhbHVlKTsKLUF0b21pYzY0IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgaW5jcmVtZW50KTsKLUF0b21pYzY0IEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IGluY3JlbWVudCk7Ci0KLUF0b21pYzY0IEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpOwotQXRvbWljNjQgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSk7Ci12b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSk7Ci12b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpOwotdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKTsKLUF0b21pYzY0IE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpOwotQXRvbWljNjQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpOwotQXRvbWljNjQgUmVsZWFzZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpOwotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotLy8gSW5jbHVkZSBvdXIgcGxhdGZvcm0gc3BlY2lmaWMgaW1wbGVtZW50YXRpb24uCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IgXAotIkF0b21pYyBvcGVyYXRpb25zIGFyZSBub3Qgc3VwcG9ydGVkIG9uIHlvdXIgcGxhdGZvcm0iCi0KLS8vIFRocmVhZFNhbml0aXplciwgaHR0cDovL2NsYW5nLmxsdm0ub3JnL2RvY3MvVGhyZWFkU2FuaXRpemVyLmh0bWwuCi0jaWYgZGVmaW5lZChUSFJFQURfU0FOSVRJWkVSKQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3RzYW4uaD4KLS8vIE1TVkMuCi0jZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQotI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfSUEzMikgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQpCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaD4KLSNlbHNlCi0jZXJyb3IgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgotI2VuZGlmCi0KLS8vIFNvbGFyaXMKLSNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX1NPTEFSSVMpCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfc29sYXJpcy5oPgotCi0vLyBBSVgKLSNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX0FJWCkKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wb3dlci5oPgotCi0vLyBBcHBsZS4KLSNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX0FQUExFKQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oPgotCi0vLyBHQ0MuCi0jZWxpZiBkZWZpbmVkKF9fR05VQ19fKQotI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfSUEzMikgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQpCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oPgotI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk0pICYmIGRlZmluZWQoX19saW51eF9fKQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaD4KLSNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfQUFSQ0g2NCkKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm02NF9nY2MuaD4KLSNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfQVJNX1FOWCkKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fcW54Lmg+Ci0jZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX01JUFMpIHx8IGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfTUlQUzY0KQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmg+Ci0jZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX1BPV0VSKQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3Bvd2VyLmg+Ci0jZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3BuYWNsLmg+Ci0jZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX1BQQykKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wcGNfZ2NjLmg+Ci0jZWxpZiAoKChfX0dOVUNfXyA9PSA0KSAmJiAoX19HTlVDX01JTk9SX18gPj0gNykpIHx8IChfX0dOVUNfXyA+IDQpKQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2dlbmVyaWNfZ2NjLmg+Ci0jZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSNpZiBfX2hhc19leHRlbnNpb24oY19hdG9taWMpCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfZ2VuZXJpY19nY2MuaD4KLSNlbHNlCi0jZXJyb3IgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgotI2VuZGlmCi0jZWxzZQotI2Vycm9yIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IKLSNlbmRpZgotCi0vLyBVbmtub3duLgotI2Vsc2UKLSNlcnJvciBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0VSUk9SCi0jZW5kaWYKLQotLy8gT24gc29tZSBwbGF0Zm9ybXMgd2UgbmVlZCBhZGRpdGlvbmFsIGRlY2xhcmF0aW9ucyB0byBtYWtlIEF0b21pY1dvcmQKLS8vIGNvbXBhdGlibGUgd2l0aCBvdXIgb3RoZXIgQXRvbWljKiB0eXBlcy4KLSNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19BUFBMRSkKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oPgotI2VuZGlmCi0KLSN1bmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0VSUk9SCi0KLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBlNzI3Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KLS8vCi0vLyBMaW51eEtlcm5lbENtcHhjaGcgYW5kIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50IGFyZSBmcm9tIEdvb2dsZSBHZWFycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19BUk1fR0NDX0hfCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX0FSTV9HQ0NfSF8KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gMHhmZmZmMGZjMCBpcyB0aGUgaGFyZCBjb2RlZCBhZGRyZXNzIG9mIGEgZnVuY3Rpb24gcHJvdmlkZWQgYnkKLS8vIHRoZSBrZXJuZWwgd2hpY2ggaW1wbGVtZW50cyBhbiBhdG9taWMgY29tcGFyZS1leGNoYW5nZS4gT24gb2xkZXIKLS8vIEFSTSBhcmNoaXRlY3R1cmUgcmV2aXNpb25zIChwcmUtdjYpIHRoaXMgbWF5IGJlIGltcGxlbWVudGVkIHVzaW5nCi0vLyBhIHN5c2NhbGwuIFRoaXMgYWRkcmVzcyBpcyBzdGFibGUsIGFuZCBpbiBhY3RpdmUgdXNlIChoYXJkIGNvZGVkKQotLy8gYnkgYXQgbGVhc3QgZ2xpYmMtMi43IGFuZCB0aGUgQW5kcm9pZCBDIGxpYnJhcnkuCi10eXBlZGVmIEF0b21pYzMyICgqTGludXhLZXJuZWxDbXB4Y2hnRnVuYykoQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xhdGlsZSBBdG9taWMzMiogcHRyKTsKLUxpbnV4S2VybmVsQ21weGNoZ0Z1bmMgcExpbnV4S2VybmVsQ21weGNoZyBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgPQotICAgIChMaW51eEtlcm5lbENtcHhjaGdGdW5jKSAweGZmZmYwZmMwOwotCi10eXBlZGVmIHZvaWQgKCpMaW51eEtlcm5lbE1lbW9yeUJhcnJpZXJGdW5jKSh2b2lkKTsKLUxpbnV4S2VybmVsTWVtb3J5QmFycmllckZ1bmMgcExpbnV4S2VybmVsTWVtb3J5QmFycmllciBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgPQotICAgIChMaW51eEtlcm5lbE1lbW9yeUJhcnJpZXJGdW5jKSAweGZmZmYwZmEwOwotCi0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgQXRvbWljMzIgcHJldl92YWx1ZSA9ICpwdHI7Ci0gIGRvIHsKLSAgICBpZiAoIXBMaW51eEtlcm5lbENtcHhjaGcob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSkgewotICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKLSAgICB9Ci0gICAgcHJldl92YWx1ZSA9ICpwdHI7Ci0gIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKLSAgcmV0dXJuIHByZXZfdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIEF0b21pYzMyIG9sZF92YWx1ZTsKLSAgZG8gewotICAgIG9sZF92YWx1ZSA9ICpwdHI7Ci0gIH0gd2hpbGUgKHBMaW51eEtlcm5lbENtcHhjaGcob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3RfY2FzdDxBdG9taWMzMio+KHB0cikpKTsKLSAgcmV0dXJuIG9sZF92YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgewotICByZXR1cm4gQmFycmllcl9BdG9taWNJbmNyZW1lbnQocHRyLCBpbmNyZW1lbnQpOwotfQotCi1pbmxpbmUgQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKLSAgZm9yICg7OykgewotICAgIC8vIEF0b21pYyBleGNoYW5nZSB0aGUgb2xkIHZhbHVlIHdpdGggYW4gaW5jcmVtZW50ZWQgb25lLgotICAgIEF0b21pYzMyIG9sZF92YWx1ZSA9ICpwdHI7Ci0gICAgQXRvbWljMzIgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgaW5jcmVtZW50OwotICAgIGlmIChwTGludXhLZXJuZWxDbXB4Y2hnKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSA9PSAwKSB7Ci0gICAgICAvLyBUaGUgZXhjaGFuZ2UgdG9vayBwbGFjZSBhcyBleHBlY3RlZC4KLSAgICAgIHJldHVybiBuZXdfdmFsdWU7Ci0gICAgfQotICAgIC8vIE90aGVyd2lzZSwgKnB0ciBjaGFuZ2VkIG1pZC1sb29wIGFuZCB3ZSBuZWVkIHRvIHJldHJ5LgotICB9Ci19Ci0KLWlubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgewotICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOwotfQotCi1pbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotfQotCi1pbmxpbmUgdm9pZCBNZW1vcnlCYXJyaWVyKCkgewotICBwTGludXhLZXJuZWxNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLWlubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotICBNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLWlubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgTWVtb3J5QmFycmllcigpOwotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKLSAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOwotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVJNX0dDQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXRvbWljd29yZF9jb21wYXQuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWIxOThmZi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXRvbWljd29yZF9jb21wYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVGhpcyBmaWxlIGlzIGFuIGludGVybmFsIGF0b21pYyBpbXBsZW1lbnRhdGlvbiwgdXNlIGF0b21pY29wcy5oIGluc3RlYWQuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVRPTUlDV09SRF9DT01QQVRfSF8KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfQVRPTUlDV09SRF9DT01QQVRfSF8KLQotLy8gQXRvbWljV29yZCBpcyBhIHN5bm9ueW0gZm9yIGludHB0cl90LCBhbmQgQXRvbWljMzIgaXMgYSBzeW5vbnltIGZvciBpbnQzMiwKLS8vIHdoaWNoIGluIHR1cm4gbWVhbnMgaW50LiBPbiBzb21lIExQMzIgcGxhdGZvcm1zLCBpbnRwdHJfdCBpcyBhbiBpbnQsIGJ1dAotLy8gb24gb3RoZXJzLCBpdCdzIGEgbG9uZy4gV2hlbiBBdG9taWNXb3JkIGFuZCBBdG9taWMzMiBhcmUgYmFzZWQgb24gZGlmZmVyZW50Ci0vLyBmdW5kYW1lbnRhbCB0eXBlcywgdGhlaXIgcG9pbnRlcnMgYXJlIGluY29tcGF0aWJsZS4KLS8vCi0vLyBUaGlzIGZpbGUgZGVmaW5lcyBmdW5jdGlvbiBvdmVybG9hZHMgdG8gYWxsb3cgYm90aCBBdG9taWNXb3JkIGFuZCBBdG9taWMzMgotLy8gZGF0YSB0byBiZSB1c2VkIHdpdGggdGhpcyBpbnRlcmZhY2UuCi0vLwotLy8gT24gTFA2NCBwbGF0Zm9ybXMsIEF0b21pY1dvcmQgYW5kIEF0b21pYzY0IGFyZSBib3RoIGFsd2F5cyBsb25nLAotLy8gc28gdGhpcyBwcm9ibGVtIGRvZXNuJ3Qgb2NjdXIuCi0KLSNpZiAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQpCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWlubGluZSBBdG9taWNXb3JkIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgQXRvbWljMzIqPihwdHIpLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Ci19Ci0KLWlubGluZSBBdG9taWNXb3JkIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgQXRvbWljMzIqPihwdHIpLCBuZXdfdmFsdWUpOwotfQotCi1pbmxpbmUgQXRvbWljV29yZCBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBpbmNyZW1lbnQpIHsKLSAgcmV0dXJuIE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQoCi0gICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgaW5jcmVtZW50KTsKLX0KLQotaW5saW5lIEF0b21pY1dvcmQgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljV29yZCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBpbmNyZW1lbnQpIHsKLSAgcmV0dXJuIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIGluY3JlbWVudCk7Ci19Ci0KLWlubGluZSBBdG9taWNXb3JkIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljV29yZCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWNXb3JkIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAoCi0gICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIEF0b21pYzMyKj4ocHRyKSwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOwotfQotCi1pbmxpbmUgQXRvbWljV29yZCBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pY1dvcmQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljV29yZCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pY1dvcmQgbmV3X3ZhbHVlKSB7Ci0gIHJldHVybiBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKAotICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKLX0KLQotaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pY1dvcmQgKnB0ciwgQXRvbWljV29yZCB2YWx1ZSkgewotICBOb0JhcnJpZXJfU3RvcmUocmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIHZhbHVlKTsKLX0KLQotaW5saW5lIHZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsIEF0b21pY1dvcmQgdmFsdWUpIHsKLSAgcmV0dXJuIEFjcXVpcmVfU3RvcmUocmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIHZhbHVlKTsKLX0KLQotaW5saW5lIHZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWNXb3JkKiBwdHIsIEF0b21pY1dvcmQgdmFsdWUpIHsKLSAgcmV0dXJuIFJlbGVhc2VfU3RvcmUocmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBBdG9taWMzMio+KHB0ciksIHZhbHVlKTsKLX0KLQotaW5saW5lIEF0b21pY1dvcmQgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljV29yZCAqcHRyKSB7Ci0gIHJldHVybiBOb0JhcnJpZXJfTG9hZChyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKj4ocHRyKSk7Ci19Ci0KLWlubGluZSBBdG9taWNXb3JkIEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWNXb3JkKiBwdHIpIHsKLSAgcmV0dXJuIEFjcXVpcmVfTG9hZChyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKj4ocHRyKSk7Ci19Ci0KLWlubGluZSBBdG9taWNXb3JkIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWNXb3JkKiBwdHIpIHsKLSAgcmV0dXJuIFJlbGVhc2VfTG9hZChyZWludGVycHJldF9jYXN0PHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKj4ocHRyKSk7Ci19Ci0KLX0gICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLSNlbmRpZiAgLy8gIWRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUKQotCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX0FUT01JQ1dPUkRfQ09NUEFUX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDc5NjMzMjQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjI1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NQUNPU1hfSF8KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfTUFDT1NYX0hfCi0KLSNpbmNsdWRlIDxsaWJrZXJuL09TQXRvbWljLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgQXRvbWljMzIgcHJldl92YWx1ZTsKLSAgZG8gewotICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwMzIob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSkpIHsKLSAgICAgIHJldHVybiBvbGRfdmFsdWU7Ci0gICAgfQotICAgIHByZXZfdmFsdWUgPSAqcHRyOwotICB9IHdoaWxlIChwcmV2X3ZhbHVlID09IG9sZF92YWx1ZSk7Ci0gIHJldHVybiBwcmV2X3ZhbHVlOwotfQotCi1pbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgewotICBBdG9taWMzMiBvbGRfdmFsdWU7Ci0gIGRvIHsKLSAgICBvbGRfdmFsdWUgPSAqcHRyOwotICB9IHdoaWxlICghT1NBdG9taWNDb21wYXJlQW5kU3dhcDMyKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSk7Ci0gIHJldHVybiBvbGRfdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKLSAgcmV0dXJuIE9TQXRvbWljQWRkMzIoaW5jcmVtZW50LCBjb25zdF9jYXN0PEF0b21pYzMyKj4ocHRyKSk7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7Ci0gIHJldHVybiBPU0F0b21pY0FkZDMyQmFycmllcihpbmNyZW1lbnQsIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKTsKLX0KLQotaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKLSAgT1NNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgQXRvbWljMzIgcHJldl92YWx1ZTsKLSAgZG8gewotICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwMzJCYXJyaWVyKG9sZF92YWx1ZSwgbmV3X3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0X2Nhc3Q8QXRvbWljMzIqPihwdHIpKSkgewotICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKLSAgICB9Ci0gICAgcHJldl92YWx1ZSA9ICpwdHI7Ci0gIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKLSAgcmV0dXJuIHByZXZfdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Ci19Ci0KLWlubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgewotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotICBNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLWlubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgTWVtb3J5QmFycmllcigpOwotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKLSAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOwotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLSNpZmRlZiBfX0xQNjRfXwotCi0vLyA2NC1iaXQgaW1wbGVtZW50YXRpb24gb24gNjQtYml0IHBsYXRmb3JtCi0KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgQXRvbWljNjQgcHJldl92YWx1ZTsKLSAgZG8gewotICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjQob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIGludDY0X3QqPihwdHIpKSkgewotICAgICAgcmV0dXJuIG9sZF92YWx1ZTsKLSAgICB9Ci0gICAgcHJldl92YWx1ZSA9ICpwdHI7Ci0gIH0gd2hpbGUgKHByZXZfdmFsdWUgPT0gb2xkX3ZhbHVlKTsKLSAgcmV0dXJuIHByZXZfdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIEF0b21pYzY0IG9sZF92YWx1ZTsKLSAgZG8gewotICAgIG9sZF92YWx1ZSA9ICpwdHI7Ci0gIH0gd2hpbGUgKCFPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjQob2xkX3ZhbHVlLCBuZXdfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSkpOwotICByZXR1cm4gb2xkX3ZhbHVlOwotfQotCi1pbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgaW5jcmVtZW50KSB7Ci0gIHJldHVybiBPU0F0b21pY0FkZDY0KGluY3JlbWVudCwgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSk7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgewotICByZXR1cm4gT1NBdG9taWNBZGQ2NEJhcnJpZXIoaW5jcmVtZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSk7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgQXRvbWljNjQgcHJldl92YWx1ZTsKLSAgZG8gewotICAgIGlmIChPU0F0b21pY0NvbXBhcmVBbmRTd2FwNjRCYXJyaWVyKAotICAgICAgICBvbGRfdmFsdWUsIG5ld192YWx1ZSwgcmVpbnRlcnByZXRfY2FzdDx2b2xhdGlsZSBpbnQ2NF90Kj4ocHRyKSkpIHsKLSAgICAgIHJldHVybiBvbGRfdmFsdWU7Ci0gICAgfQotICAgIHByZXZfdmFsdWUgPSAqcHRyOwotICB9IHdoaWxlIChwcmV2X3ZhbHVlID09IG9sZF92YWx1ZSk7Ci0gIHJldHVybiBwcmV2X3ZhbHVlOwotfQotCi1pbmxpbmUgQXRvbWljNjQgUmVsZWFzZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIC8vIFRoZSBsaWIga2VybiBpbnRlcmZhY2UgZG9lcyBub3QgZGlzdGluZ3Vpc2ggYmV0d2VlbgotICAvLyBBY3F1aXJlIGFuZCBSZWxlYXNlIG1lbW9yeSBiYXJyaWVyczsgdGhleSBhcmUgZXF1aXZhbGVudC4KLSAgcmV0dXJuIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Ci19Ci0KLWlubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgewotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotICBNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLWlubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKLSAgTWVtb3J5QmFycmllcigpOwotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljNjQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKLSAgQXRvbWljNjQgdmFsdWUgPSAqcHRyOwotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLSNlbmRpZiAgLy8gZGVmaW5lZChfX0xQNjRfXykKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19NQUNPU1hfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ODM3YzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmgKKysrIC9kZXYvbnVsbApAQCAtMSwzMTMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgZmlsZSBpcyBhbiBpbnRlcm5hbCBhdG9taWMgaW1wbGVtZW50YXRpb24sIHVzZSBhdG9taWNvcHMuaCBpbnN0ZWFkLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX01JUFNfR0NDX0hfCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX01JUFNfR0NDX0hfCi0KLSNkZWZpbmUgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKSBfX2FzbV9fIF9fdm9sYXRpbGVfXygiIiA6IDogOiAibWVtb3J5IikKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQXRvbWljYWxseSBleGVjdXRlOgotLy8gICAgICByZXN1bHQgPSAqcHRyOwotLy8gICAgICBpZiAoKnB0ciA9PSBvbGRfdmFsdWUpCi0vLyAgICAgICAgKnB0ciA9IG5ld192YWx1ZTsKLS8vICAgICAgcmV0dXJuIHJlc3VsdDsKLS8vCi0vLyBJLmUuLCByZXBsYWNlICIqcHRyIiB3aXRoICJuZXdfdmFsdWUiIGlmICIqcHRyIiB1c2VkIHRvIGJlICJvbGRfdmFsdWUiLgotLy8gQWx3YXlzIHJldHVybiB0aGUgb2xkIHZhbHVlIG9mICIqcHRyIgotLy8KLS8vIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgQXRvbWljMzIgcHJldiwgdG1wOwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBwdXNoXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlclxuIgotICAgICAgICAgICAgICAgICAgICAgICAiMTpcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgImxsICUwLCAlNVxuIiAgLy8gcHJldiA9ICpwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgImJuZSAlMCwgJTMsIDJmXG4iICAvLyBpZiAocHJldiAhPSBvbGRfdmFsdWUpIGdvdG8gMgotICAgICAgICAgICAgICAgICAgICAgICAibW92ZSAlMiwgJTRcbiIgIC8vIHRtcCA9IG5ld192YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAic2MgJTIsICUxXG4iICAvLyAqcHRyID0gdG1wICh3aXRoIGF0b21pYyBjaGVjaykKLSAgICAgICAgICAgICAgICAgICAgICAgImJlcXogJTIsIDFiXG4iICAvLyBzdGFydCBhZ2FpbiBvbiBhdG9taWMgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vcFxuIiAgLy8gZGVsYXkgc2xvdCBub3AKLSAgICAgICAgICAgICAgICAgICAgICAgIjI6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIuc2V0IHBvcFxuIgotICAgICAgICAgICAgICAgICAgICAgICA6ICI9JnIiIChwcmV2KSwgIj1tIiAoKnB0ciksICI9JnIiICh0bXApCi0gICAgICAgICAgICAgICAgICAgICAgIDogInIiIChvbGRfdmFsdWUpLCAiciIgKG5ld192YWx1ZSksICJtIiAoKnB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0gIHJldHVybiBwcmV2OwotfQotCi0vLyBBdG9taWNhbGx5IHN0b3JlIG5ld192YWx1ZSBpbnRvICpwdHIsIHJldHVybmluZyB0aGUgcHJldmlvdXMgdmFsdWUgaGVsZCBpbgotLy8gKnB0ci4gIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIEF0b21pYzMyIHRlbXAsIG9sZDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgotICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJsbCAlMSwgJTRcbiIgIC8vIG9sZCA9ICpwdHIKLSAgICAgICAgICAgICAgICAgICAgICAgIm1vdmUgJTAsICUzXG4iICAvLyB0ZW1wID0gbmV3X3ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICJzYyAlMCwgJTJcbiIgIC8vICpwdHIgPSB0ZW1wICh3aXRoIGF0b21pYyBjaGVjaykKLSAgICAgICAgICAgICAgICAgICAgICAgImJlcXogJTAsIDFiXG4iICAvLyBzdGFydCBhZ2FpbiBvbiBhdG9taWMgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vcFxuIiAgLy8gZGVsYXkgc2xvdCBub3AKLSAgICAgICAgICAgICAgICAgICAgICAgIi5zZXQgcG9wXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIDogIj0mciIgKHRlbXApLCAiPSZyIiAob2xkKSwgIj1tIiAoKnB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgOiAiciIgKG5ld192YWx1ZSksICJtIiAoKnB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0KLSAgcmV0dXJuIG9sZDsKLX0KLQotLy8gQXRvbWljYWxseSBpbmNyZW1lbnQgKnB0ciBieSAiaW5jcmVtZW50Ii4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZgotLy8gKnB0ciB3aXRoIHRoZSBpbmNyZW1lbnQgYXBwbGllZC4gIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKLSAgQXRvbWljMzIgdGVtcCwgdGVtcDI7Ci0KLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgotICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJsbCAlMCwgJTRcbiIgIC8vIHRlbXAgPSAqcHRyCi0gICAgICAgICAgICAgICAgICAgICAgICJhZGR1ICUxLCAlMCwgJTNcbiIgIC8vIHRlbXAyID0gdGVtcCArIGluY3JlbWVudAotICAgICAgICAgICAgICAgICAgICAgICAic2MgJTEsICUyXG4iICAvLyAqcHRyID0gdGVtcDIgKHdpdGggYXRvbWljIGNoZWNrKQotICAgICAgICAgICAgICAgICAgICAgICAiYmVxeiAlMSwgMWJcbiIgIC8vIHN0YXJ0IGFnYWluIG9uIGF0b21pYyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAiYWRkdSAlMSwgJTAsICUzXG4iICAvLyB0ZW1wMiA9IHRlbXAgKyBpbmNyZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIi5zZXQgcG9wXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIDogIj0mciIgKHRlbXApLCAiPSZyIiAodGVtcDIpLCAiPW0iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICA6ICJJciIgKGluY3JlbWVudCksICJtIiAoKnB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0gIC8vIHRlbXAyIG5vdyBob2xkcyB0aGUgZmluYWwgdmFsdWUuCi0gIHJldHVybiB0ZW1wMjsKLX0KLQotaW5saW5lIEF0b21pYzMyIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7Ci0gIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7Ci0gIEF0b21pYzMyIHJlcyA9IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQocHRyLCBpbmNyZW1lbnQpOwotICBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpOwotICByZXR1cm4gcmVzOwotfQotCi0vLyAiQWNxdWlyZSIgb3BlcmF0aW9ucwotLy8gZW5zdXJlIHRoYXQgbm8gbGF0ZXIgbWVtb3J5IGFjY2VzcyBjYW4gYmUgcmVvcmRlcmVkIGFoZWFkIG9mIHRoZSBvcGVyYXRpb24uCi0vLyAiUmVsZWFzZSIgb3BlcmF0aW9ucyBlbnN1cmUgdGhhdCBubyBwcmV2aW91cyBtZW1vcnkgYWNjZXNzIGNhbiBiZSByZW9yZGVyZWQKLS8vIGFmdGVyIHRoZSBvcGVyYXRpb24uICAiQmFycmllciIgb3BlcmF0aW9ucyBoYXZlIGJvdGggIkFjcXVpcmUiIGFuZCAiUmVsZWFzZSIKLS8vIHNlbWFudGljcy4gICBBIE1lbW9yeUJhcnJpZXIoKSBoYXMgIkJhcnJpZXIiIHNlbWFudGljcywgYnV0IGRvZXMgbm8gbWVtb3J5Ci0vLyBhY2Nlc3MuCi1pbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7Ci0gIEF0b21pYzMyIHJlcyA9IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKLSAgQVRPTUlDT1BTX0NPTVBJTEVSX0JBUlJJRVIoKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgewotICBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpOwotICBBdG9taWMzMiByZXMgPSBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Ci0gIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7Ci0gIHJldHVybiByZXM7Ci19Ci0KLWlubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLCBBdG9taWMzMiB2YWx1ZSkgewotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSB2b2lkIE1lbW9yeUJhcnJpZXIoKSB7Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJzeW5jIiA6IDogOiAibWVtb3J5Iik7Ci19Ci0KLWlubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotICBNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLWlubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgTWVtb3J5QmFycmllcigpOwotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKLSAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOwotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLSNpZiBkZWZpbmVkKF9fTFA2NF9fKQotLy8gNjQtYml0IHZlcnNpb25zIG9mIHRoZSBhdG9taWMgb3BzLgotCi1pbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIEF0b21pYzY0IHByZXYsIHRtcDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgotICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJsbGQgJTAsICU1XG4iICAvLyBwcmV2ID0gKnB0cgotICAgICAgICAgICAgICAgICAgICAgICAiYm5lICUwLCAlMywgMmZcbiIgIC8vIGlmIChwcmV2ICE9IG9sZF92YWx1ZSkgZ290byAyCi0gICAgICAgICAgICAgICAgICAgICAgICJtb3ZlICUyLCAlNFxuIiAgLy8gdG1wID0gbmV3X3ZhbHVlCi0gICAgICAgICAgICAgICAgICAgICAgICJzY2QgJTIsICUxXG4iICAvLyAqcHRyID0gdG1wICh3aXRoIGF0b21pYyBjaGVjaykKLSAgICAgICAgICAgICAgICAgICAgICAgImJlcXogJTIsIDFiXG4iICAvLyBzdGFydCBhZ2FpbiBvbiBhdG9taWMgZXJyb3IKLSAgICAgICAgICAgICAgICAgICAgICAgIm5vcFxuIiAgLy8gZGVsYXkgc2xvdCBub3AKLSAgICAgICAgICAgICAgICAgICAgICAgIjI6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIuc2V0IHBvcFxuIgotICAgICAgICAgICAgICAgICAgICAgICA6ICI9JnIiIChwcmV2KSwgIj1tIiAoKnB0ciksICI9JnIiICh0bXApCi0gICAgICAgICAgICAgICAgICAgICAgIDogInIiIChvbGRfdmFsdWUpLCAiciIgKG5ld192YWx1ZSksICJtIiAoKnB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0gIHJldHVybiBwcmV2OwotfQotCi0vLyBBdG9taWNhbGx5IHN0b3JlIG5ld192YWx1ZSBpbnRvICpwdHIsIHJldHVybmluZyB0aGUgcHJldmlvdXMgdmFsdWUgaGVsZCBpbgotLy8gKnB0ci4gIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2Uodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIEF0b21pYzY0IHRlbXAsIG9sZDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgotICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJsbGQgJTEsICU0XG4iICAvLyBvbGQgPSAqcHRyCi0gICAgICAgICAgICAgICAgICAgICAgICJtb3ZlICUwLCAlM1xuIiAgLy8gdGVtcCA9IG5ld192YWx1ZQotICAgICAgICAgICAgICAgICAgICAgICAic2NkICUwLCAlMlxuIiAgLy8gKnB0ciA9IHRlbXAgKHdpdGggYXRvbWljIGNoZWNrKQotICAgICAgICAgICAgICAgICAgICAgICAiYmVxeiAlMCwgMWJcbiIgIC8vIHN0YXJ0IGFnYWluIG9uIGF0b21pYyBlcnJvcgotICAgICAgICAgICAgICAgICAgICAgICAibm9wXG4iICAvLyBkZWxheSBzbG90IG5vcAotICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAodGVtcCksICI9JnIiIChvbGQpLCAiPW0iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKLQotICByZXR1cm4gb2xkOwotfQotCi0vLyBBdG9taWNhbGx5IGluY3JlbWVudCAqcHRyIGJ5ICJpbmNyZW1lbnQiLiAgUmV0dXJucyB0aGUgbmV3IHZhbHVlIG9mCi0vLyAqcHRyIHdpdGggdGhlIGluY3JlbWVudCBhcHBsaWVkLiAgVGhpcyByb3V0aW5lIGltcGxpZXMgbm8gbWVtb3J5IGJhcnJpZXJzLgotaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgewotICBBdG9taWM2NCB0ZW1wLCB0ZW1wMjsKLQotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygiLnNldCBwdXNoXG4iCi0gICAgICAgICAgICAgICAgICAgICAgICIuc2V0IG5vcmVvcmRlclxuIgotICAgICAgICAgICAgICAgICAgICAgICAiMTpcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgImxsZCAlMCwgJTRcbiIgIC8vIHRlbXAgPSAqcHRyCi0gICAgICAgICAgICAgICAgICAgICAgICJkYWRkdSAlMSwgJTAsICUzXG4iICAvLyB0ZW1wMiA9IHRlbXAgKyBpbmNyZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgInNjZCAlMSwgJTJcbiIgIC8vICpwdHIgPSB0ZW1wMiAod2l0aCBhdG9taWMgY2hlY2spCi0gICAgICAgICAgICAgICAgICAgICAgICJiZXF6ICUxLCAxYlxuIiAgLy8gc3RhcnQgYWdhaW4gb24gYXRvbWljIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAgICJkYWRkdSAlMSwgJTAsICUzXG4iICAvLyB0ZW1wMiA9IHRlbXAgKyBpbmNyZW1lbnQKLSAgICAgICAgICAgICAgICAgICAgICAgIi5zZXQgcG9wXG4iCi0gICAgICAgICAgICAgICAgICAgICAgIDogIj0mciIgKHRlbXApLCAiPSZyIiAodGVtcDIpLCAiPW0iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICA6ICJJciIgKGluY3JlbWVudCksICJtIiAoKnB0cikKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0gIC8vIHRlbXAyIG5vdyBob2xkcyB0aGUgZmluYWwgdmFsdWUuCi0gIHJldHVybiB0ZW1wMjsKLX0KLQotaW5saW5lIEF0b21pYzY0IEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgaW5jcmVtZW50KSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgQXRvbWljNjQgcmVzID0gTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotLy8gIkFjcXVpcmUiIG9wZXJhdGlvbnMKLS8vIGVuc3VyZSB0aGF0IG5vIGxhdGVyIG1lbW9yeSBhY2Nlc3MgY2FuIGJlIHJlb3JkZXJlZCBhaGVhZCBvZiB0aGUgb3BlcmF0aW9uLgotLy8gIlJlbGVhc2UiIG9wZXJhdGlvbnMgZW5zdXJlIHRoYXQgbm8gcHJldmlvdXMgbWVtb3J5IGFjY2VzcyBjYW4gYmUgcmVvcmRlcmVkCi0vLyBhZnRlciB0aGUgb3BlcmF0aW9uLiAgIkJhcnJpZXIiIG9wZXJhdGlvbnMgaGF2ZSBib3RoICJBY3F1aXJlIiBhbmQgIlJlbGVhc2UiCi0vLyBzZW1hbnRpY3MuICAgQSBNZW1vcnlCYXJyaWVyKCkgaGFzICJCYXJyaWVyIiBzZW1hbnRpY3MsIGJ1dCBkb2VzIG5vIG1lbW9yeQotLy8gYWNjZXNzLgotaW5saW5lIEF0b21pYzY0IEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgewotICBBdG9taWM2NCByZXMgPSBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuIHJlczsKLX0KLQotaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgewotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Ci19Ci0KLWlubGluZSB2b2lkIE5vQmFycmllcl9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgewotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSB2b2lkIEFjcXVpcmVfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotICBNZW1vcnlCYXJyaWVyKCk7Ci19Ci0KLWlubGluZSB2b2lkIFJlbGVhc2VfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKLSAgTWVtb3J5QmFycmllcigpOwotICAqcHRyID0gdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljNjQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKLSAgQXRvbWljNjQgdmFsdWUgPSAqcHRyOwotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuICpwdHI7Ci19Ci0jZW5kaWYKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI3VuZGVmIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSCi0KLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfTUlQU19HQ0NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDUzYzllYWUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoaXMgbW9kdWxlIGdldHMgZW5vdWdoIENQVSBpbmZvcm1hdGlvbiB0byBvcHRpbWl6ZSB0aGUKLS8vIGF0b21pY29wcyBtb2R1bGUgb24geDg2LgotCi0jaW5jbHVkZSA8Y3N0cmluZz4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaD4KLQotLy8gVGhpcyBmaWxlIG9ubHkgbWFrZXMgc2Vuc2Ugd2l0aCBhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuaCAtLSBpdAotLy8gZGVwZW5kcyBvbiBzdHJ1Y3RzIHRoYXQgYXJlIGRlZmluZWQgaW4gdGhhdCBmaWxlLiAgSWYgYXRvbWljb3BzLmgKLS8vIGRvZXNuJ3Qgc3ViLWluY2x1ZGUgdGhhdCBmaWxlLCB0aGVuIHdlIGFyZW4ndCBuZWVkZWQsIGFuZCBzaG91bGRuJ3QKLS8vIHRyeSB0byBkbyBhbnl0aGluZy4KLSNpZmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfR0NDX0hfCi0KLS8vIElubGluZSBjcHVpZCBpbnN0cnVjdGlvbi4gIEluIFBJQyBjb21waWxhdGlvbnMsICVlYnggY29udGFpbnMgdGhlIGFkZHJlc3MKLS8vIG9mIHRoZSBnbG9iYWwgb2Zmc2V0IHRhYmxlLiAgVG8gYXZvaWQgYnJlYWtpbmcgc3VjaCBleGVjdXRhYmxlcywgdGhpcyBjb2RlCi0vLyBtdXN0IHByZXNlcnZlIHRoYXQgcmVnaXN0ZXIncyB2YWx1ZSBhY3Jvc3MgY3B1aWQgaW5zdHJ1Y3Rpb25zLgotI2lmIGRlZmluZWQoX19pMzg2X18pCi0jZGVmaW5lIGNwdWlkKGEsIGIsIGMsIGQsIGlucCkgXAotICBhc20oIm1vdiAlJWVieCwgJSVlZGlcbiIgICAgIFwKLSAgICAgICJjcHVpZFxuIiAgICAgICAgICAgICAgICBcCi0gICAgICAieGNoZyAlJWVkaSwgJSVlYnhcbiIgICAgXAotICAgICAgOiAiPWEiIChhKSwgIj1EIiAoYiksICI9YyIgKGMpLCAiPWQiIChkKSA6ICJhIiAoaW5wKSkKLSNlbGlmIGRlZmluZWQoX194ODZfNjRfXykKLSNkZWZpbmUgY3B1aWQoYSwgYiwgYywgZCwgaW5wKSBcCi0gIGFzbSgibW92ICUlcmJ4LCAlJXJkaVxuIiAgICAgXAotICAgICAgImNwdWlkXG4iICAgICAgICAgICAgICAgIFwKLSAgICAgICJ4Y2hnICUlcmRpLCAlJXJieFxuIiAgICBcCi0gICAgICA6ICI9YSIgKGEpLCAiPUQiIChiKSwgIj1jIiAoYyksICI9ZCIgKGQpIDogImEiIChpbnApKQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKGNwdWlkKSAgICAgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RydWN0IG9ubHkgb24geDg2Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFNldCB0aGUgZmxhZ3Mgc28gdGhhdCBjb2RlIHdpbGwgcnVuIGNvcnJlY3RseSBhbmQgY29uc2VydmF0aXZlbHksIHNvIGV2ZW4KLS8vIGlmIHdlIGhhdmVuJ3QgYmVlbiBpbml0aWFsaXplZCB5ZXQsIHdlJ3JlIHByb2JhYmx5IHNpbmdsZSB0aHJlYWRlZCwgYW5kIG91cgotLy8gZGVmYXVsdCB2YWx1ZXMgc2hvdWxkIGhvcGVmdWxseSBiZSBwcmV0dHkgc2FmZS4KLXN0cnVjdCBBdG9taWNPcHNfeDg2Q1BVRmVhdHVyZVN0cnVjdCBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcyA9IHsKLSAgZmFsc2UsICAgICAgICAgIC8vIGJ1ZyBjYW4ndCBleGlzdCBiZWZvcmUgcHJvY2VzcyBzcGF3bnMgbXVsdGlwbGUgdGhyZWFkcwotICBmYWxzZSwgICAgICAgICAgLy8gbm8gU1NFMgotfTsKLQotbmFtZXNwYWNlIHsKLQotLy8gSW5pdGlhbGl6ZSB0aGUgQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMgc3RydWN0Lgotdm9pZCBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlc0luaXQoKSB7Ci0gIHVpbnQzMl90IGVheDsKLSAgdWludDMyX3QgZWJ4OwotICB1aW50MzJfdCBlY3g7Ci0gIHVpbnQzMl90IGVkeDsKLQotICAvLyBHZXQgdmVuZG9yIHN0cmluZyAoaXNzdWUgQ1BVSUQgd2l0aCBlYXggPSAwKQotICBjcHVpZChlYXgsIGVieCwgZWN4LCBlZHgsIDApOwotICBjaGFyIHZlbmRvclsxM107Ci0gIG1lbWNweSh2ZW5kb3IsICZlYngsIDQpOwotICBtZW1jcHkodmVuZG9yICsgNCwgJmVkeCwgNCk7Ci0gIG1lbWNweSh2ZW5kb3IgKyA4LCAmZWN4LCA0KTsKLSAgdmVuZG9yWzEyXSA9IDA7Ci0KLSAgLy8gZ2V0IGZlYXR1cmUgZmxhZ3MgaW4gZWN4L2VkeCwgYW5kIGZhbWlseS9tb2RlbCBpbiBlYXgKLSAgY3B1aWQoZWF4LCBlYngsIGVjeCwgZWR4LCAxKTsKLQotICBpbnQgZmFtaWx5ID0gKGVheCA+PiA4KSAmIDB4ZjsgICAgICAgIC8vIGZhbWlseSBhbmQgbW9kZWwgZmllbGRzCi0gIGludCBtb2RlbCA9IChlYXggPj4gNCkgJiAweGY7Ci0gIGlmIChmYW1pbHkgPT0gMHhmKSB7ICAgICAgICAgICAgICAgICAgLy8gdXNlIGV4dGVuZGVkIGZhbWlseSBhbmQgbW9kZWwgZmllbGRzCi0gICAgZmFtaWx5ICs9IChlYXggPj4gMjApICYgMHhmZjsKLSAgICBtb2RlbCArPSAoKGVheCA+PiAxNikgJiAweGYpIDw8IDQ7Ci0gIH0KLQotICAvLyBPcHRlcm9uIFJldiBFIGhhcyBhIGJ1ZyBpbiB3aGljaCBvbiB2ZXJ5IHJhcmUgb2NjYXNpb25zIGEgbG9ja2VkCi0gIC8vIGluc3RydWN0aW9uIGRvZXNuJ3QgYWN0IGFzIGEgcmVhZC1hY3F1aXJlIGJhcnJpZXIgaWYgZm9sbG93ZWQgYnkgYQotICAvLyBub24tbG9ja2VkIHJlYWQtbW9kaWZ5LXdyaXRlIGluc3RydWN0aW9uLiAgUmV2IEYgaGFzIHRoaXMgYnVnIGluCi0gIC8vIHByZS1yZWxlYXNlIHZlcnNpb25zLCBidXQgbm90IGluIHZlcnNpb25zIHJlbGVhc2VkIHRvIGN1c3RvbWVycywKLSAgLy8gc28gd2UgdGVzdCBvbmx5IGZvciBSZXYgRSwgd2hpY2ggaXMgZmFtaWx5IDE1LCBtb2RlbCAzMi4uNjMgaW5jbHVzaXZlLgotICBpZiAoc3RyY21wKHZlbmRvciwgIkF1dGhlbnRpY0FNRCIpID09IDAgJiYgICAgICAgLy8gQU1ECi0gICAgICBmYW1pbHkgPT0gMTUgJiYKLSAgICAgIDMyIDw9IG1vZGVsICYmIG1vZGVsIDw9IDYzKSB7Ci0gICAgQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZyA9IHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZyA9IGZhbHNlOwotICB9Ci0KLSAgLy8gZWR4IGJpdCAyNiBpcyBTU0UyIHdoaWNoIHdlIHVzZSB0byB0ZWxsIHVzZSB3aGV0aGVyIHdlIGNhbiB1c2UgbWZlbmNlCi0gIEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzLmhhc19zc2UyID0gKChlZHggPj4gMjYpICYgMSk7Ci19Ci0KLWNsYXNzIEF0b21pY09wc3g4NkluaXRpYWxpemVyIHsKLSBwdWJsaWM6Ci0gIEF0b21pY09wc3g4NkluaXRpYWxpemVyKCkgewotICAgIEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzSW5pdCgpOwotICB9Ci19OwotCi0vLyBBIGdsb2JhbCB0byBnZXQgdXNlIGluaXRpYWxpemVkIG9uIHN0YXJ0dXAgdmlhIHN0YXRpYyBpbml0aWFsaXphdGlvbiA6LwotQXRvbWljT3BzeDg2SW5pdGlhbGl6ZXIgZ19pbml0ZXI7Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgIC8vIF9faTM4Nl9fCi0KLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfWDg2X0dDQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVkY2NjNTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuaAorKysgL2Rldi9udWxsCkBAIC0xLDI5MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVGhpcyBmaWxlIGlzIGFuIGludGVybmFsIGF0b21pYyBpbXBsZW1lbnRhdGlvbiwgdXNlIGF0b21pY29wcy5oIGluc3RlYWQuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfWDg2X0dDQ19IXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfR0NDX0hfCi0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFRoaXMgc3RydWN0IGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgQVBJIG9mIHRoaXMgbW9kdWxlOyBjbGllbnRzIG1heSBub3QKLS8vIHVzZSBpdC4KLS8vIEZlYXR1cmVzIG9mIHRoaXMgeDg2LiAgVmFsdWVzIG1heSBub3QgYmUgY29ycmVjdCBiZWZvcmUgbWFpbigpIGlzIHJ1biwKLS8vIGJ1dCBhcmUgc2V0IGNvbnNlcnZhdGl2ZWx5Lgotc3RydWN0IEF0b21pY09wc194ODZDUFVGZWF0dXJlU3RydWN0IHsKLSAgYm9vbCBoYXNfYW1kX2xvY2tfbWJfYnVnOyAgLy8gUHJvY2Vzc29yIGhhcyBBTUQgbWVtb3J5LWJhcnJpZXIgYnVnOyBkbyBsZmVuY2UKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgYWNxdWlyZSBjb21wYXJlLWFuZC1zd2FwLgotICBib29sIGhhc19zc2UyOyAgICAgICAgICAgICAvLyBQcm9jZXNzb3IgaGFzIFNTRTIuCi19OwotZXh0ZXJuIHN0cnVjdCBBdG9taWNPcHNfeDg2Q1BVRmVhdHVyZVN0cnVjdCBBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlczsKLQotI2RlZmluZSBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpIF9fYXNtX18gX192b2xhdGlsZV9fKCIiIDogOiA6ICJtZW1vcnkiKQotCi0vLyAzMi1iaXQgbG93LWxldmVsIG9wZXJhdGlvbnMgb24gYW55IHBsYXRmb3JtLgotCi1pbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIEF0b21pYzMyIHByZXY7Ci0gIF9fYXNtX18gX192b2xhdGlsZV9fKCJsb2NrOyBjbXB4Y2hnbCAlMSwlMiIKLSAgICAgICAgICAgICAgICAgICAgICAgOiAiPWEiIChwcmV2KQotICAgICAgICAgICAgICAgICAgICAgICA6ICJxIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKSwgIjAiIChvbGRfdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOwotICByZXR1cm4gcHJldjsKLX0KLQotaW5saW5lIEF0b21pYzMyIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oInhjaGdsICUxLCUwIiAgLy8gVGhlIGxvY2sgcHJlZml4IGlzIGltcGxpY2l0IGZvciB4Y2hnLgotICAgICAgICAgICAgICAgICAgICAgICA6ICI9ciIgKG5ld192YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibSIgKCpwdHIpLCAiMCIgKG5ld192YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0gIHJldHVybiBuZXdfdmFsdWU7ICAvLyBOb3cgaXQncyB0aGUgcHJldmlvdXMgdmFsdWUuCi19Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBpbmNyZW1lbnQpIHsKLSAgQXRvbWljMzIgdGVtcCA9IGluY3JlbWVudDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IHhhZGRsICUwLCUxIgotICAgICAgICAgICAgICAgICAgICAgICA6ICIrciIgKHRlbXApLCAiK20iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICA6IDogIm1lbW9yeSIpOwotICAvLyB0ZW1wIG5vdyBob2xkcyB0aGUgb2xkIHZhbHVlIG9mICpwdHIKLSAgcmV0dXJuIHRlbXAgKyBpbmNyZW1lbnQ7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgewotICBBdG9taWMzMiB0ZW1wID0gaW5jcmVtZW50OwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgeGFkZGwgJTAsJTEiCi0gICAgICAgICAgICAgICAgICAgICAgIDogIityIiAodGVtcCksICIrbSIgKCpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgIDogOiAibWVtb3J5Iik7Ci0gIC8vIHRlbXAgbm93IGhvbGRzIHRoZSBvbGQgdmFsdWUgb2YgKnB0cgotICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZykgewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKLSAgfQotICByZXR1cm4gdGVtcCArIGluY3JlbWVudDsKLX0KLQotaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgewotICBBdG9taWMzMiB4ID0gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOwotICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZykgewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKLSAgfQotICByZXR1cm4geDsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgewotICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOwotfQotCi1pbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotfQotCi0jaWYgZGVmaW5lZChfX3g4Nl82NF9fKQotCi0vLyA2NC1iaXQgaW1wbGVtZW50YXRpb25zIG9mIG1lbW9yeSBiYXJyaWVyIGNhbiBiZSBzaW1wbGVyLCBiZWNhdXNlIGl0Ci0vLyAibWZlbmNlIiBpcyBndWFyYW50ZWVkIHRvIGV4aXN0LgotaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oIm1mZW5jZSIgOiA6IDogIm1lbW9yeSIpOwotfQotCi1pbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKLSAgTWVtb3J5QmFycmllcigpOwotfQotCi0jZWxzZQotCi1pbmxpbmUgdm9pZCBNZW1vcnlCYXJyaWVyKCkgewotICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX3NzZTIpIHsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibWZlbmNlIiA6IDogOiAibWVtb3J5Iik7Ci0gIH0gZWxzZSB7ICAvLyBtZmVuY2UgaXMgZmFzdGVyIGJ1dCBub3QgcHJlc2VudCBvbiBQSUlJCi0gICAgQXRvbWljMzIgeCA9IDA7Ci0gICAgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKCZ4LCAwKTsgIC8vIGFjdHMgYXMgYSBiYXJyaWVyIG9uIFBJSUkKLSAgfQotfQotCi1pbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7Ci0gIGlmIChBdG9taWNPcHNfSW50ZXJuYWx4ODZDUFVGZWF0dXJlcy5oYXNfc3NlMikgewotICAgICpwdHIgPSB2YWx1ZTsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibWZlbmNlIiA6IDogOiAibWVtb3J5Iik7Ci0gIH0gZWxzZSB7Ci0gICAgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHB0ciwgdmFsdWUpOwotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhY3RzIGFzIGEgYmFycmllciBvbiBQSUlJCi0gIH0KLX0KLSNlbmRpZgotCi1pbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7Ci0gIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7Ci0gICpwdHIgPSB2YWx1ZTsgIC8vIEFuIHg4NiBzdG9yZSBhY3RzIGFzIGEgcmVsZWFzZSBiYXJyaWVyLgotICAvLyBTZWUgY29tbWVudHMgaW4gQXRvbWljNjQgdmVyc2lvbiBvZiBSZWxlYXNlX1N0b3JlKCksIGJlbG93LgotfQotCi1pbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgewotICByZXR1cm4gKnB0cjsKLX0KLQotaW5saW5lIEF0b21pYzMyIEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIEF0b21pYzMyIHZhbHVlID0gKnB0cjsgIC8vIEFuIHg4NiBsb2FkIGFjdHMgYXMgYSBhY3F1aXJlIGJhcnJpZXIuCi0gIC8vIFNlZSBjb21tZW50cyBpbiBBdG9taWM2NCB2ZXJzaW9uIG9mIFJlbGVhc2VfU3RvcmUoKSwgYmVsb3cuCi0gIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLSNpZiBkZWZpbmVkKF9feDg2XzY0X18pCi0KLS8vIDY0LWJpdCBsb3ctbGV2ZWwgb3BlcmF0aW9ucyBvbiA2NC1iaXQgcGxhdGZvcm0uCi0KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgQXRvbWljNjQgcHJldjsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IGNtcHhjaGdxICUxLCUyIgotICAgICAgICAgICAgICAgICAgICAgICA6ICI9YSIgKHByZXYpCi0gICAgICAgICAgICAgICAgICAgICAgIDogInEiIChuZXdfdmFsdWUpLCAibSIgKCpwdHIpLCAiMCIgKG9sZF92YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7Ci0gIHJldHVybiBwcmV2OwotfQotCi1pbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgewotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygieGNoZ3EgJTEsJTAiICAvLyBUaGUgbG9jayBwcmVmaXggaXMgaW1wbGljaXQgZm9yIHhjaGcuCi0gICAgICAgICAgICAgICAgICAgICAgIDogIj1yIiAobmV3X3ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICA6ICJtIiAoKnB0ciksICIwIiAobmV3X3ZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKLSAgcmV0dXJuIG5ld192YWx1ZTsgIC8vIE5vdyBpdCdzIHRoZSBwcmV2aW91cyB2YWx1ZS4KLX0KLQotaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgewotICBBdG9taWM2NCB0ZW1wID0gaW5jcmVtZW50OwotICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9jazsgeGFkZHEgJTAsJTEiCi0gICAgICAgICAgICAgICAgICAgICAgIDogIityIiAodGVtcCksICIrbSIgKCpwdHIpCi0gICAgICAgICAgICAgICAgICAgICAgIDogOiAibWVtb3J5Iik7Ci0gIC8vIHRlbXAgbm93IGNvbnRhaW5zIHRoZSBwcmV2aW91cyB2YWx1ZSBvZiAqcHRyCi0gIHJldHVybiB0ZW1wICsgaW5jcmVtZW50OwotfQotCi1pbmxpbmUgQXRvbWljNjQgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBpbmNyZW1lbnQpIHsKLSAgQXRvbWljNjQgdGVtcCA9IGluY3JlbWVudDsKLSAgX19hc21fXyBfX3ZvbGF0aWxlX18oImxvY2s7IHhhZGRxICUwLCUxIgotICAgICAgICAgICAgICAgICAgICAgICA6ICIrciIgKHRlbXApLCAiK20iICgqcHRyKQotICAgICAgICAgICAgICAgICAgICAgICA6IDogIm1lbW9yeSIpOwotICAvLyB0ZW1wIG5vdyBjb250YWlucyB0aGUgcHJldmlvdXMgdmFsdWUgb2YgKnB0cgotICBpZiAoQXRvbWljT3BzX0ludGVybmFseDg2Q1BVRmVhdHVyZXMuaGFzX2FtZF9sb2NrX21iX2J1ZykgewotICAgIF9fYXNtX18gX192b2xhdGlsZV9fKCJsZmVuY2UiIDogOiA6ICJtZW1vcnkiKTsKLSAgfQotICByZXR1cm4gdGVtcCArIGluY3JlbWVudDsKLX0KLQotaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKLX0KLQotaW5saW5lIHZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgewotICAqcHRyID0gdmFsdWU7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLX0KLQotaW5saW5lIHZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgewotICBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUigpOwotCi0gICpwdHIgPSB2YWx1ZTsgIC8vIEFuIHg4NiBzdG9yZSBhY3RzIGFzIGEgcmVsZWFzZSBiYXJyaWVyCi0gICAgICAgICAgICAgICAgIC8vIGZvciBjdXJyZW50IEFNRC9JbnRlbCBjaGlwcyBhcyBvZiBKYW4gMjAwOC4KLSAgICAgICAgICAgICAgICAgLy8gU2VlIGFsc28gQWNxdWlyZV9Mb2FkKCksIGJlbG93LgotCi0gIC8vIFdoZW4gbmV3IGNoaXBzIGNvbWUgb3V0LCBjaGVjazoKLSAgLy8gIElBLTMyIEludGVsIEFyY2hpdGVjdHVyZSBTb2Z0d2FyZSBEZXZlbG9wZXIncyBNYW51YWwsIFZvbHVtZSAzOgotICAvLyAgU3lzdGVtIFByb2dyYW1taW5nIEd1aWRlLCBDaGF0cGVyIDc6IE11bHRpcGxlLXByb2Nlc3NvciBtYW5hZ2VtZW50LAotICAvLyAgU2VjdGlvbiA3LjIsIE1lbW9yeSBPcmRlcmluZy4KLSAgLy8gTGFzdCBzZWVuIGF0OgotICAvLyAgIGh0dHA6Ly9kZXZlbG9wZXIuaW50ZWwuY29tL2Rlc2lnbi9wZW50aXVtNC9tYW51YWxzL2luZGV4X25ldy5odG0KLSAgLy8KLSAgLy8geDg2IHN0b3Jlcy9sb2FkcyBmYWlsIHRvIGFjdCBhcyBiYXJyaWVycyBmb3IgYSBmZXcgaW5zdHJ1Y3Rpb25zIChjbGZsdXNoCi0gIC8vIG1hc2ttb3ZkcXUgbWFza21vdnEgbW92bnRkcSBtb3ZudGkgbW92bnRwZCBtb3ZudHBzIG1vdm50cSkgYnV0IHRoZXNlIGFyZQotICAvLyBub3QgZ2VuZXJhdGVkIGJ5IHRoZSBjb21waWxlciwgYW5kIGFyZSByYXJlLiAgVXNlcnMgb2YgdGhlc2UgaW5zdHJ1Y3Rpb25zCi0gIC8vIG5lZWQgdG8ga25vdyBhYm91dCBjYWNoZSBiZWhhdmlvdXIgaW4gYW55IGNhc2Ugc2luY2UgYWxsIG9mIHRoZXNlIGludm9sdmUKLSAgLy8gZWl0aGVyIGZsdXNoaW5nIGNhY2hlIGxpbmVzIG9yIG5vbi10ZW1wb3JhbCBjYWNoZSBoaW50cy4KLX0KLQotaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBBY3F1aXJlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgewotICBBdG9taWM2NCB2YWx1ZSA9ICpwdHI7ICAvLyBBbiB4ODYgbG9hZCBhY3RzIGFzIGEgYWNxdWlyZSBiYXJyaWVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3IgY3VycmVudCBBTUQvSW50ZWwgY2hpcHMgYXMgb2YgSmFuIDIwMDguCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNlZSBhbHNvIFJlbGVhc2VfU3RvcmUoKSwgYWJvdmUuCi0gIEFUT01JQ09QU19DT01QSUxFUl9CQVJSSUVSKCk7Ci0gIHJldHVybiB2YWx1ZTsKLX0KLQotaW5saW5lIEF0b21pYzY0IFJlbGVhc2VfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7Ci0gIE1lbW9yeUJhcnJpZXIoKTsKLSAgcmV0dXJuICpwdHI7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgQXRvbWljNjQgeCA9IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKLSAgaWYgKEF0b21pY09wc19JbnRlcm5hbHg4NkNQVUZlYXR1cmVzLmhhc19hbWRfbG9ja19tYl9idWcpIHsKLSAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibGZlbmNlIiA6IDogOiAibWVtb3J5Iik7Ci0gIH0KLSAgcmV0dXJuIHg7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKLX0KLQotI2VuZGlmICAvLyBkZWZpbmVkKF9feDg2XzY0X18pCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLSN1bmRlZiBBVE9NSUNPUFNfQ09NUElMRVJfQkFSUklFUgotCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9HQ0NfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzQxYjE2NC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRoZSBjb21waWxhdGlvbiBvZiBleHRlbnNpb25fc2V0LmNjIGZhaWxzIHdoZW4gd2luZG93cy5oIGlzIGluY2x1ZGVkLgotLy8gVGhlcmVmb3JlIHdlIG1vdmUgdGhlIGNvZGUgZGVwZW5kaW5nIG9uIHdpbmRvd3MuaCB0byB0aGlzIHNlcGFyYXRlIGNjIGZpbGUuCi0KLS8vIERvbid0IGNvbXBpbGUgdGhpcyBmaWxlIGZvciBwZW9wbGUgbm90IGNvbmNlcm5lZCBhYm91dCB0aHJlYWQgc2FmZXR5LgotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgotCi0jaWZkZWYgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19JTlRFUk5BTFNfWDg2X01TVkNfSF8KLQotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotaW5saW5lIHZvaWQgTWVtb3J5QmFycmllcigpIHsKLSAgLy8gV2UgdXNlIE1lbW9yeUJhcnJpZXIgZnJvbSBXaW5OVC5oCi0gIDo6TWVtb3J5QmFycmllcigpOwotfQotCi1BdG9taWMzMiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKSB7Ci0gIExPTkcgcmVzdWx0ID0gSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UoCi0gICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIExPTkcqPihwdHIpLAotICAgICAgc3RhdGljX2Nhc3Q8TE9ORz4obmV3X3ZhbHVlKSwKLSAgICAgIHN0YXRpY19jYXN0PExPTkc+KG9sZF92YWx1ZSkpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8QXRvbWljMzI+KHJlc3VsdCk7Ci19Ci0KLUF0b21pYzMyIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgewotICBMT05HIHJlc3VsdCA9IEludGVybG9ja2VkRXhjaGFuZ2UoCi0gICAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIExPTkcqPihwdHIpLAotICAgICAgc3RhdGljX2Nhc3Q8TE9ORz4obmV3X3ZhbHVlKSk7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxBdG9taWMzMj4ocmVzdWx0KTsKLX0KLQotQXRvbWljMzIgQmFycmllcl9BdG9taWNJbmNyZW1lbnQodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIGluY3JlbWVudCkgewotICByZXR1cm4gSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgTE9ORyo+KHB0ciksCi0gICAgICBzdGF0aWNfY2FzdDxMT05HPihpbmNyZW1lbnQpKSArIGluY3JlbWVudDsKLX0KLQotI2lmIGRlZmluZWQoX1dJTjY0KQotCi0vLyA2NC1iaXQgbG93LWxldmVsIG9wZXJhdGlvbnMgb24gNjQtYml0IHBsYXRmb3JtLgotCi1BdG9taWM2NCBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIFBWT0lEIHJlc3VsdCA9IEludGVybG9ja2VkQ29tcGFyZUV4Y2hhbmdlUG9pbnRlcigKLSAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIFBWT0lEKj4ocHRyKSwKLSAgICByZWludGVycHJldF9jYXN0PFBWT0lEPihuZXdfdmFsdWUpLCByZWludGVycHJldF9jYXN0PFBWT0lEPihvbGRfdmFsdWUpKTsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QXRvbWljNjQ+KHJlc3VsdCk7Ci19Ci0KLUF0b21pYzY0IE5vQmFycmllcl9BdG9taWNFeGNoYW5nZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgewotICBQVk9JRCByZXN1bHQgPSBJbnRlcmxvY2tlZEV4Y2hhbmdlUG9pbnRlcigKLSAgICByZWludGVycHJldF9jYXN0PHZvbGF0aWxlIFBWT0lEKj4ocHRyKSwKLSAgICByZWludGVycHJldF9jYXN0PFBWT0lEPihuZXdfdmFsdWUpKTsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8QXRvbWljNjQ+KHJlc3VsdCk7Ci19Ci0KLUF0b21pYzY0IEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBpbmNyZW1lbnQpIHsKLSAgcmV0dXJuIEludGVybG9ja2VkRXhjaGFuZ2VBZGQ2NCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9sYXRpbGUgTE9OR0xPTkcqPihwdHIpLAotICAgICAgc3RhdGljX2Nhc3Q8TE9OR0xPTkc+KGluY3JlbWVudCkpICsgaW5jcmVtZW50OwotfQotCi0jZW5kaWYgIC8vIGRlZmluZWQoX1dJTjY0KQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSU5URVJOQUxTX1g4Nl9NU1ZDX0hfCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURfU0FGRVRZCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlNTNhNjQxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBUaGlzIGZpbGUgaXMgYW4gaW50ZXJuYWwgYXRvbWljIGltcGxlbWVudGF0aW9uLCB1c2UgYXRvbWljb3BzLmggaW5zdGVhZC4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfTVNWQ19IXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfTVNWQ19IXwotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1pbmxpbmUgQXRvbWljMzIgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWMzMiogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgaW5jcmVtZW50KSB7Ci0gIHJldHVybiBCYXJyaWVyX0F0b21pY0luY3JlbWVudChwdHIsIGluY3JlbWVudCk7Ci19Ci0KLSNpZiAhKGRlZmluZWQoX01TQ19WRVIpICYmIF9NU0NfVkVSID49IDE0MDApCi0jZXJyb3IgIldlIHJlcXVpcmUgYXQgbGVhc3QgdnMyMDA1IGZvciBNZW1vcnlCYXJyaWVyIgotI2VuZGlmCi0KLWlubGluZSBBdG9taWMzMiBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWMzMiBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKLX0KLQotaW5saW5lIEF0b21pYzMyIFJlbGVhc2VfQ29tcGFyZUFuZFN3YXAodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG5ld192YWx1ZSkgewotICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOwotfQotCi1pbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpIHsKLSAgKnB0ciA9IHZhbHVlOwotfQotCi1pbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7Ci0gIE5vQmFycmllcl9BdG9taWNFeGNoYW5nZShwdHIsIHZhbHVlKTsKLSAgICAgICAgICAgICAgLy8gYWN0cyBhcyBhIGJhcnJpZXIgaW4gdGhpcyBpbXBsZW1lbnRhdGlvbgotfQotCi1pbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsgIC8vIHdvcmtzIHcvbyBiYXJyaWVyIGZvciBjdXJyZW50IEludGVsIGNoaXBzIGFzIG9mIEp1bmUgMjAwNQotICAvLyBTZWUgY29tbWVudHMgaW4gQXRvbWljNjQgdmVyc2lvbiBvZiBSZWxlYXNlX1N0b3JlKCkgYmVsb3cuCi19Ci0KLWlubGluZSBBdG9taWMzMiBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWMzMiogcHRyKSB7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljMzIgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzMyKiBwdHIpIHsKLSAgQXRvbWljMzIgdmFsdWUgPSAqcHRyOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWMzMiBSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljMzIqIHB0cikgewotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiAqcHRyOwotfQotCi0jaWYgZGVmaW5lZChfV0lONjQpCi0KLS8vIDY0LWJpdCBsb3ctbGV2ZWwgb3BlcmF0aW9ucyBvbiA2NC1iaXQgcGxhdGZvcm0uCi0KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBpbmNyZW1lbnQpIHsKLSAgcmV0dXJuIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHB0ciwgaW5jcmVtZW50KTsKLX0KLQotaW5saW5lIHZvaWQgTm9CYXJyaWVyX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7Ci0gICpwdHIgPSB2YWx1ZTsKLX0KLQotaW5saW5lIHZvaWQgQWNxdWlyZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgewotICBOb0JhcnJpZXJfQXRvbWljRXhjaGFuZ2UocHRyLCB2YWx1ZSk7Ci0gICAgICAgICAgICAgIC8vIGFjdHMgYXMgYSBiYXJyaWVyIGluIHRoaXMgaW1wbGVtZW50YXRpb24KLX0KLQotaW5saW5lIHZvaWQgUmVsZWFzZV9TdG9yZSh2b2xhdGlsZSBBdG9taWM2NCogcHRyLCBBdG9taWM2NCB2YWx1ZSkgewotICAqcHRyID0gdmFsdWU7ICAvLyB3b3JrcyB3L28gYmFycmllciBmb3IgY3VycmVudCBJbnRlbCBjaGlwcyBhcyBvZiBKdW5lIDIwMDUKLQotICAvLyBXaGVuIG5ldyBjaGlwcyBjb21lIG91dCwgY2hlY2s6Ci0gIC8vICBJQS0zMiBJbnRlbCBBcmNoaXRlY3R1cmUgU29mdHdhcmUgRGV2ZWxvcGVyJ3MgTWFudWFsLCBWb2x1bWUgMzoKLSAgLy8gIFN5c3RlbSBQcm9ncmFtbWluZyBHdWlkZSwgQ2hhdHBlciA3OiBNdWx0aXBsZS1wcm9jZXNzb3IgbWFuYWdlbWVudCwKLSAgLy8gIFNlY3Rpb24gNy4yLCBNZW1vcnkgT3JkZXJpbmcuCi0gIC8vIExhc3Qgc2VlbiBhdDoKLSAgLy8gICBodHRwOi8vZGV2ZWxvcGVyLmludGVsLmNvbS9kZXNpZ24vcGVudGl1bTQvbWFudWFscy9pbmRleF9uZXcuaHRtCi19Ci0KLWlubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljNjQgQWNxdWlyZV9Mb2FkKHZvbGF0aWxlIGNvbnN0IEF0b21pYzY0KiBwdHIpIHsKLSAgQXRvbWljNjQgdmFsdWUgPSAqcHRyOwotICByZXR1cm4gdmFsdWU7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgewotICBNZW1vcnlCYXJyaWVyKCk7Ci0gIHJldHVybiAqcHRyOwotfQotCi1pbmxpbmUgQXRvbWljNjQgQWNxdWlyZV9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgb2xkX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljNjQgbmV3X3ZhbHVlKSB7Ci0gIHJldHVybiBOb0JhcnJpZXJfQ29tcGFyZUFuZFN3YXAocHRyLCBvbGRfdmFsdWUsIG5ld192YWx1ZSk7Ci19Ci0KLWlubGluZSBBdG9taWM2NCBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKLSAgcmV0dXJuIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcChwdHIsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlKTsKLX0KLQotI2VuZGlmICAvLyBkZWZpbmVkKF9XSU42NCkKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfTVNWQ19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmNGFmNmE1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5jYworKysgL2Rldi9udWxsCkBAIC0xLDE5NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmg+Ci0KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBzdHJpbmdzIHsKLQotdm9pZCBCeXRlU291cmNlOjpDb3B5VG8oQnl0ZVNpbmsqIHNpbmssIHNpemVfdCBuKSB7Ci0gIHdoaWxlIChuID4gMCkgewotICAgIFN0cmluZ1BpZWNlIGZyYWdtZW50ID0gUGVlaygpOwotICAgIGlmIChmcmFnbWVudC5lbXB0eSgpKSB7Ci0gICAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkJ5dGVTb3VyY2U6OkNvcHlUbygpIG92ZXJyYW4gaW5wdXQuIjsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBzdGQ6OnNpemVfdCBmcmFnbWVudF9zaXplID0gc3RkOjptaW48c3RkOjpzaXplX3Q+KG4sIGZyYWdtZW50LnNpemUoKSk7Ci0gICAgc2luay0+QXBwZW5kKGZyYWdtZW50LmRhdGEoKSwgZnJhZ21lbnRfc2l6ZSk7Ci0gICAgU2tpcChmcmFnbWVudF9zaXplKTsKLSAgICBuIC09IGZyYWdtZW50X3NpemU7Ci0gIH0KLX0KLQotdm9pZCBCeXRlU2luazo6Rmx1c2goKSB7fQotCi12b2lkIFVuY2hlY2tlZEFycmF5Qnl0ZVNpbms6OkFwcGVuZChjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbikgewotICBpZiAoZGF0YSAhPSBkZXN0XykgewotICAgIC8vIENhdGNoIGNhc2VzIHdoZXJlIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IEdldEFwcGVuZEJ1ZmZlcigpIHdhcyBtb2RpZmllZC4KLSAgICBHT09HTEVfRENIRUNLKCEoZGVzdF8gPD0gZGF0YSAmJiBkYXRhIDwgKGRlc3RfICsgbikpKQotICAgICAgICA8PCAiQXBwZW5kKCkgZGF0YVtdIG92ZXJsYXBzIHdpdGggZGVzdF9bXSI7Ci0gICAgbWVtY3B5KGRlc3RfLCBkYXRhLCBuKTsKLSAgfQotICBkZXN0XyArPSBuOwotfQotCi1DaGVja2VkQXJyYXlCeXRlU2luazo6Q2hlY2tlZEFycmF5Qnl0ZVNpbmsoY2hhciogb3V0YnVmLCBzaXplX3QgY2FwYWNpdHkpCi0gICAgOiBvdXRidWZfKG91dGJ1ZiksIGNhcGFjaXR5XyhjYXBhY2l0eSksIHNpemVfKDApLCBvdmVyZmxvd2VkXyhmYWxzZSkgewotfQotCi12b2lkIENoZWNrZWRBcnJheUJ5dGVTaW5rOjpBcHBlbmQoY29uc3QgY2hhciogYnl0ZXMsIHNpemVfdCBuKSB7Ci0gIHNpemVfdCBhdmFpbGFibGUgPSBjYXBhY2l0eV8gLSBzaXplXzsKLSAgaWYgKG4gPiBhdmFpbGFibGUpIHsKLSAgICBuID0gYXZhaWxhYmxlOwotICAgIG92ZXJmbG93ZWRfID0gdHJ1ZTsKLSAgfQotICBpZiAobiA+IDAgJiYgYnl0ZXMgIT0gKG91dGJ1Zl8gKyBzaXplXykpIHsKLSAgICAvLyBDYXRjaCBjYXNlcyB3aGVyZSB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBHZXRBcHBlbmRCdWZmZXIoKSB3YXMgbW9kaWZpZWQuCi0gICAgR09PR0xFX0RDSEVDSyghKG91dGJ1Zl8gPD0gYnl0ZXMgJiYgYnl0ZXMgPCAob3V0YnVmXyArIGNhcGFjaXR5XykpKQotICAgICAgICA8PCAiQXBwZW5kKCkgYnl0ZXNbXSBvdmVybGFwcyB3aXRoIG91dGJ1Zl9bXSI7Ci0gICAgbWVtY3B5KG91dGJ1Zl8gKyBzaXplXywgYnl0ZXMsIG4pOwotICB9Ci0gIHNpemVfICs9IG47Ci19Ci0KLUdyb3dpbmdBcnJheUJ5dGVTaW5rOjpHcm93aW5nQXJyYXlCeXRlU2luayhzaXplX3QgZXN0aW1hdGVkX3NpemUpCi0gICAgOiBjYXBhY2l0eV8oZXN0aW1hdGVkX3NpemUpLAotICAgICAgYnVmXyhuZXcgY2hhcltlc3RpbWF0ZWRfc2l6ZV0pLAotICAgICAgc2l6ZV8oMCkgewotfQotCi1Hcm93aW5nQXJyYXlCeXRlU2luazo6fkdyb3dpbmdBcnJheUJ5dGVTaW5rKCkgewotICBkZWxldGVbXSBidWZfOyAgLy8gSnVzdCBpbiBjYXNlIHRoZSB1c2VyIGRpZG4ndCBjYWxsIEdldEJ1ZmZlci4KLX0KLQotdm9pZCBHcm93aW5nQXJyYXlCeXRlU2luazo6QXBwZW5kKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3QgbikgewotICBzaXplX3QgYXZhaWxhYmxlID0gY2FwYWNpdHlfIC0gc2l6ZV87Ci0gIGlmIChieXRlcyAhPSAoYnVmXyArIHNpemVfKSkgewotICAgIC8vIENhdGNoIGNhc2VzIHdoZXJlIHRoZSBwb2ludGVyIHJldHVybmVkIGJ5IEdldEFwcGVuZEJ1ZmZlcigpIHdhcyBtb2RpZmllZC4KLSAgICAvLyBXZSBuZWVkIHRvIHRlc3QgZm9yIHRoaXMgYmVmb3JlIGNhbGxpbmcgRXhwYW5kKCkgd2hpY2ggbWF5IHJlYWxsb2NhdGUuCi0gICAgR09PR0xFX0RDSEVDSyghKGJ1Zl8gPD0gYnl0ZXMgJiYgYnl0ZXMgPCAoYnVmXyArIGNhcGFjaXR5XykpKQotICAgICAgICA8PCAiQXBwZW5kKCkgYnl0ZXNbXSBvdmVybGFwcyB3aXRoIGJ1Zl9bXSI7Ci0gIH0KLSAgaWYgKG4gPiBhdmFpbGFibGUpIHsKLSAgICBFeHBhbmQobiAtIGF2YWlsYWJsZSk7Ci0gIH0KLSAgaWYgKG4gPiAwICYmIGJ5dGVzICE9IChidWZfICsgc2l6ZV8pKSB7Ci0gICAgbWVtY3B5KGJ1Zl8gKyBzaXplXywgYnl0ZXMsIG4pOwotICB9Ci0gIHNpemVfICs9IG47Ci19Ci0KLWNoYXIqIEdyb3dpbmdBcnJheUJ5dGVTaW5rOjpHZXRCdWZmZXIoc2l6ZV90KiBuYnl0ZXMpIHsKLSAgU2hyaW5rVG9GaXQoKTsKLSAgY2hhciogYiA9IGJ1Zl87Ci0gICpuYnl0ZXMgPSBzaXplXzsKLSAgYnVmXyA9IE5VTEw7Ci0gIHNpemVfID0gY2FwYWNpdHlfID0gMDsKLSAgcmV0dXJuIGI7Ci19Ci0KLXZvaWQgR3Jvd2luZ0FycmF5Qnl0ZVNpbms6OkV4cGFuZChzaXplX3QgYW1vdW50KSB7ICAvLyBFeHBhbmQgYnkgYXQgbGVhc3QgNTAlLgotICBzaXplX3QgbmV3X2NhcGFjaXR5ID0gc3RkOjptYXgoY2FwYWNpdHlfICsgYW1vdW50LCAoMyAqIGNhcGFjaXR5XykgLyAyKTsKLSAgY2hhciogYmlnZ2VyID0gbmV3IGNoYXJbbmV3X2NhcGFjaXR5XTsKLSAgbWVtY3B5KGJpZ2dlciwgYnVmXywgc2l6ZV8pOwotICBkZWxldGVbXSBidWZfOwotICBidWZfID0gYmlnZ2VyOwotICBjYXBhY2l0eV8gPSBuZXdfY2FwYWNpdHk7Ci19Ci0KLXZvaWQgR3Jvd2luZ0FycmF5Qnl0ZVNpbms6OlNocmlua1RvRml0KCkgewotICAvLyBTaHJpbmsgb25seSBpZiB0aGUgYnVmZmVyIGlzIGxhcmdlIGFuZCBzaXplXyBpcyBsZXNzIHRoYW4gMy80Ci0gIC8vIG9mIGNhcGFjaXR5Xy4KLSAgaWYgKGNhcGFjaXR5XyA+IDI1NiAmJiBzaXplXyA8ICgzICogY2FwYWNpdHlfKSAvIDQpIHsKLSAgICBjaGFyKiBqdXN0X2Vub3VnaCA9IG5ldyBjaGFyW3NpemVfXTsKLSAgICBtZW1jcHkoanVzdF9lbm91Z2gsIGJ1Zl8sIHNpemVfKTsKLSAgICBkZWxldGVbXSBidWZfOwotICAgIGJ1Zl8gPSBqdXN0X2Vub3VnaDsKLSAgICBjYXBhY2l0eV8gPSBzaXplXzsKLSAgfQotfQotCi12b2lkIFN0cmluZ0J5dGVTaW5rOjpBcHBlbmQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IG4pIHsKLSAgZGVzdF8tPmFwcGVuZChkYXRhLCBuKTsKLX0KLQotc2l6ZV90IEFycmF5Qnl0ZVNvdXJjZTo6QXZhaWxhYmxlKCkgY29uc3QgewotICByZXR1cm4gaW5wdXRfLnNpemUoKTsKLX0KLQotU3RyaW5nUGllY2UgQXJyYXlCeXRlU291cmNlOjpQZWVrKCkgewotICByZXR1cm4gaW5wdXRfOwotfQotCi12b2lkIEFycmF5Qnl0ZVNvdXJjZTo6U2tpcChzaXplX3QgbikgewotICBHT09HTEVfRENIRUNLX0xFKG4sIGlucHV0Xy5zaXplKCkpOwotICBpbnB1dF8ucmVtb3ZlX3ByZWZpeChuKTsKLX0KLQotTGltaXRCeXRlU291cmNlOjpMaW1pdEJ5dGVTb3VyY2UoQnl0ZVNvdXJjZSAqc291cmNlLCBzaXplX3QgbGltaXQpCi0gIDogc291cmNlXyhzb3VyY2UpLAotICAgIGxpbWl0XyhsaW1pdCkgewotfQotCi1zaXplX3QgTGltaXRCeXRlU291cmNlOjpBdmFpbGFibGUoKSBjb25zdCB7Ci0gIHNpemVfdCBhdmFpbGFibGUgPSBzb3VyY2VfLT5BdmFpbGFibGUoKTsKLSAgaWYgKGF2YWlsYWJsZSA+IGxpbWl0XykgewotICAgIGF2YWlsYWJsZSA9IGxpbWl0XzsKLSAgfQotCi0gIHJldHVybiBhdmFpbGFibGU7Ci19Ci0KLVN0cmluZ1BpZWNlIExpbWl0Qnl0ZVNvdXJjZTo6UGVlaygpIHsKLSAgU3RyaW5nUGllY2UgcGllY2Uoc291cmNlXy0+UGVlaygpKTsKLSAgaWYgKHBpZWNlLnNpemUoKSA+IGxpbWl0XykgewotICAgIHBpZWNlLnNldChwaWVjZS5kYXRhKCksIGxpbWl0Xyk7Ci0gIH0KLQotICByZXR1cm4gcGllY2U7Ci19Ci0KLXZvaWQgTGltaXRCeXRlU291cmNlOjpTa2lwKHNpemVfdCBuKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTEUobiwgbGltaXRfKTsKLSAgc291cmNlXy0+U2tpcChuKTsKLSAgbGltaXRfIC09IG47Ci19Ci0KLXZvaWQgTGltaXRCeXRlU291cmNlOjpDb3B5VG8oQnl0ZVNpbmsgKnNpbmssIHNpemVfdCBuKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTEUobiwgbGltaXRfKTsKLSAgc291cmNlXy0+Q29weVRvKHNpbmssIG4pOwotICBsaW1pdF8gLT0gbjsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTRkYmFmYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYworKysgL2Rldi9udWxsCkBAIC0xLDQ1OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBXSU4zMl9MRUFOX0FORF9NRUFOICAvLyBXZSBvbmx5IG5lZWQgbWluaW1hbCBpbmNsdWRlcwotI2luY2x1ZGUgPHdpbmRvd3MuaD4KLSNkZWZpbmUgc25wcmludGYgX3NucHJpbnRmICAgIC8vIHNlZSBjb21tZW50IGluIHN0cnV0aWwuY2MKLSNlbGlmIGRlZmluZWQoSEFWRV9QVEhSRUFEKQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbHNlCi0jZXJyb3IgIk5vIHN1aXRhYmxlIHRocmVhZGluZyBsaWJyYXJ5IGF2YWlsYWJsZS4iCi0jZW5kaWYKLSNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQotI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi12b2lkIFZlcmlmeVZlcnNpb24oaW50IGhlYWRlclZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgaW50IG1pbkxpYnJhcnlWZXJzaW9uLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lKSB7Ci0gIGlmIChHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8IG1pbkxpYnJhcnlWZXJzaW9uKSB7Ci0gICAgLy8gTGlicmFyeSBpcyB0b28gb2xkIGZvciBoZWFkZXJzLgotICAgIEdPT0dMRV9MT0coRkFUQUwpCi0gICAgICA8PCAiVGhpcyBwcm9ncmFtIHJlcXVpcmVzIHZlcnNpb24gIiA8PCBWZXJzaW9uU3RyaW5nKG1pbkxpYnJhcnlWZXJzaW9uKQotICAgICAgPDwgIiBvZiB0aGUgUHJvdG9jb2wgQnVmZmVyIHJ1bnRpbWUgbGlicmFyeSwgYnV0IHRoZSBpbnN0YWxsZWQgdmVyc2lvbiAiCi0gICAgICAgICAiaXMgIiA8PCBWZXJzaW9uU3RyaW5nKEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OKSA8PCAiLiAgUGxlYXNlIHVwZGF0ZSAiCi0gICAgICAgICAieW91ciBsaWJyYXJ5LiAgSWYgeW91IGNvbXBpbGVkIHRoZSBwcm9ncmFtIHlvdXJzZWxmLCBtYWtlIHN1cmUgdGhhdCAiCi0gICAgICAgICAieW91ciBoZWFkZXJzIGFyZSBmcm9tIHRoZSBzYW1lIHZlcnNpb24gb2YgUHJvdG9jb2wgQnVmZmVycyBhcyB5b3VyICIKLSAgICAgICAgICJsaW5rLXRpbWUgbGlicmFyeS4gIChWZXJzaW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQgaW4gXCIiCi0gICAgICA8PCBmaWxlbmFtZSA8PCAiXCIuKSI7Ci0gIH0KLSAgaWYgKGhlYWRlclZlcnNpb24gPCBrTWluSGVhZGVyVmVyc2lvbkZvckxpYnJhcnkpIHsKLSAgICAvLyBIZWFkZXJzIGFyZSB0b28gb2xkIGZvciBsaWJyYXJ5LgotICAgIEdPT0dMRV9MT0coRkFUQUwpCi0gICAgICA8PCAiVGhpcyBwcm9ncmFtIHdhcyBjb21waWxlZCBhZ2FpbnN0IHZlcnNpb24gIgotICAgICAgPDwgVmVyc2lvblN0cmluZyhoZWFkZXJWZXJzaW9uKSA8PCAiIG9mIHRoZSBQcm90b2NvbCBCdWZmZXIgcnVudGltZSAiCi0gICAgICAgICAibGlicmFyeSwgd2hpY2ggaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGUgaW5zdGFsbGVkIHZlcnNpb24gKCIKLSAgICAgIDw8IFZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pIDw8ICAiKS4gIENvbnRhY3QgdGhlIHByb2dyYW0gIgotICAgICAgICAgImF1dGhvciBmb3IgYW4gdXBkYXRlLiAgSWYgeW91IGNvbXBpbGVkIHRoZSBwcm9ncmFtIHlvdXJzZWxmLCBtYWtlICIKLSAgICAgICAgICJzdXJlIHRoYXQgeW91ciBoZWFkZXJzIGFyZSBmcm9tIHRoZSBzYW1lIHZlcnNpb24gb2YgUHJvdG9jb2wgQnVmZmVycyAiCi0gICAgICAgICAiYXMgeW91ciBsaW5rLXRpbWUgbGlicmFyeS4gIChWZXJzaW9uIHZlcmlmaWNhdGlvbiBmYWlsZWQgaW4gXCIiCi0gICAgICA8PCBmaWxlbmFtZSA8PCAiXCIuKSI7Ci0gIH0KLX0KLQotc3RyaW5nIFZlcnNpb25TdHJpbmcoaW50IHZlcnNpb24pIHsKLSAgaW50IG1ham9yID0gdmVyc2lvbiAvIDEwMDAwMDA7Ci0gIGludCBtaW5vciA9ICh2ZXJzaW9uIC8gMTAwMCkgJSAxMDAwOwotICBpbnQgbWljcm8gPSB2ZXJzaW9uICUgMTAwMDsKLQotICAvLyAxMjggYnl0ZXMgc2hvdWxkIGFsd2F5cyBiZSBlbm91Z2gsIGJ1dCB3ZSB1c2Ugc25wcmludGYoKSBhbnl3YXkgdG8gYmUKLSAgLy8gc2FmZS4KLSAgY2hhciBidWZmZXJbMTI4XTsKLSAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgIiVkLiVkLiVkIiwgbWFqb3IsIG1pbm9yLCBtaWNybyk7Ci0KLSAgLy8gR3VhcmQgYWdhaW5zdCBicm9rZW4gTVNWQyBzbnByaW50ZigpLgotICBidWZmZXJbc2l6ZW9mKGJ1ZmZlciktMV0gPSAnXDAnOwotCi0gIHJldHVybiBidWZmZXI7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBlbXVsYXRlcyBnb29nbGUzL2Jhc2UvbG9nZ2luZy5jYwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi1pbmxpbmUgdm9pZCBEZWZhdWx0TG9nSGFuZGxlcihMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0jaWZkZWYgR09PR0xFX1BST1RPQlVGX01JTl9MT0dfTEVWRUwKLSAgaWYgKGxldmVsIDwgR09PR0xFX1BST1RPQlVGX01JTl9MT0dfTEVWRUwpIHsKLSAgICByZXR1cm47Ci0gIH0KLSAgc3RhdGljIGNvbnN0IGNoYXIqIGxldmVsX25hbWVzW10gPSB7IklORk8iLCAiV0FSTklORyIsICJFUlJPUiIsICJGQVRBTCJ9OwotCi0gIHN0YXRpYyBjb25zdCBpbnQgYW5kcm9pZF9sb2dfbGV2ZWxzW10gPSB7Ci0gICAgICBBTkRST0lEX0xPR19JTkZPLCAgIC8vIExPRyhJTkZPKSwKLSAgICAgIEFORFJPSURfTE9HX1dBUk4sICAgLy8gTE9HKFdBUk5JTkcpCi0gICAgICBBTkRST0lEX0xPR19FUlJPUiwgIC8vIExPRyhFUlJPUikKLSAgICAgIEFORFJPSURfTE9HX0ZBVEFMLCAgLy8gTE9HKEZBVEFMKQotICB9OwotCi0gIC8vIEJvdW5kIHRoZSBsb2dnaW5nIGxldmVsLgotICBjb25zdCBpbnQgYW5kcm9pZF9sb2dfbGV2ZWwgPSBhbmRyb2lkX2xvZ19sZXZlbHNbbGV2ZWxdOwotICA6OnN0ZDo6b3N0cmluZ3N0cmVhbSBvc3RyOwotICBvc3RyIDw8ICJbbGlicHJvdG9idWYgIiA8PCBsZXZlbF9uYW1lc1tsZXZlbF0gPDwgIiAiIDw8IGZpbGVuYW1lIDw8ICI6IgotICAgICAgIDw8IGxpbmUgPDwgIl0gIiA8PCBtZXNzYWdlLmNfc3RyKCk7Ci0KLSAgLy8gT3V0cHV0IHRoZSBsb2cgc3RyaW5nIHRoZSBBbmRyb2lkIGxvZyBhdCB0aGUgYXBwcm9wcmlhdGUgbGV2ZWwuCi0gIF9fYW5kcm9pZF9sb2dfd3JpdGUoYW5kcm9pZF9sb2dfbGV2ZWwsICJsaWJwcm90b2J1Zi1uYXRpdmUiLAotICAgICAgICAgICAgICAgICAgICAgIG9zdHIuc3RyKCkuY19zdHIoKSk7Ci0gIC8vIEFsc28gb3V0cHV0IHRvIHN0ZDo6Y2Vyci4KLSAgZnByaW50ZihzdGRlcnIsICIlcyIsIG9zdHIuc3RyKCkuY19zdHIoKSk7Ci0gIGZmbHVzaChzdGRlcnIpOwotCi0gIC8vIEluZGljYXRlIHRlcm1pbmF0aW9uIGlmIG5lZWRlZC4KLSAgaWYgKGFuZHJvaWRfbG9nX2xldmVsID09IEFORFJPSURfTE9HX0ZBVEFMKSB7Ci0gICAgX19hbmRyb2lkX2xvZ193cml0ZShBTkRST0lEX0xPR19GQVRBTCwgImxpYnByb3RvYnVmLW5hdGl2ZSIsCi0gICAgICAgICAgICAgICAgICAgICAgICAidGVybWluYXRpbmcuXG4iKTsKLSAgfQotI2VuZGlmCi19Ci0jZWxzZQotdm9pZCBEZWZhdWx0TG9nSGFuZGxlcihMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgc3RhdGljIGNvbnN0IGNoYXIqIGxldmVsX25hbWVzW10gPSB7ICJJTkZPIiwgIldBUk5JTkciLCAiRVJST1IiLCAiRkFUQUwiIH07Ci0KLSAgLy8gV2UgdXNlIGZwcmludGYoKSBpbnN0ZWFkIG9mIGNlcnIgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gd29yayBhdCBzdGF0aWMKLSAgLy8gaW5pdGlhbGl6YXRpb24gdGltZS4KLSAgZnByaW50ZihzdGRlcnIsICJbbGlicHJvdG9idWYgJXMgJXM6JWRdICVzXG4iLAotICAgICAgICAgIGxldmVsX25hbWVzW2xldmVsXSwgZmlsZW5hbWUsIGxpbmUsIG1lc3NhZ2UuY19zdHIoKSk7Ci0gIGZmbHVzaChzdGRlcnIpOyAgLy8gTmVlZGVkIG9uIE1TVkMuCi19Ci0jZW5kaWYKLQotdm9pZCBOdWxsTG9nSGFuZGxlcihMb2dMZXZlbCAvKiBsZXZlbCAqLywgY29uc3QgY2hhciogLyogZmlsZW5hbWUgKi8sCi0gICAgICAgICAgICAgICAgICAgIGludCAvKiBsaW5lICovLCBjb25zdCBzdHJpbmcmIC8qIG1lc3NhZ2UgKi8pIHsKLSAgLy8gTm90aGluZy4KLX0KLQotc3RhdGljIExvZ0hhbmRsZXIqIGxvZ19oYW5kbGVyXyA9ICZEZWZhdWx0TG9nSGFuZGxlcjsKLXN0YXRpYyBpbnQgbG9nX3NpbGVuY2VyX2NvdW50XyA9IDA7Ci0KLXN0YXRpYyBNdXRleCogbG9nX3NpbGVuY2VyX2NvdW50X211dGV4XyA9IE5VTEw7Ci1HT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKGxvZ19zaWxlbmNlcl9jb3VudF9pbml0Xyk7Ci0KLXZvaWQgRGVsZXRlTG9nU2lsZW5jZXJDb3VudCgpIHsKLSAgZGVsZXRlIGxvZ19zaWxlbmNlcl9jb3VudF9tdXRleF87Ci0gIGxvZ19zaWxlbmNlcl9jb3VudF9tdXRleF8gPSBOVUxMOwotfQotdm9pZCBJbml0TG9nU2lsZW5jZXJDb3VudCgpIHsKLSAgbG9nX3NpbGVuY2VyX2NvdW50X211dGV4XyA9IG5ldyBNdXRleDsKLSAgT25TaHV0ZG93bigmRGVsZXRlTG9nU2lsZW5jZXJDb3VudCk7Ci19Ci12b2lkIEluaXRMb2dTaWxlbmNlckNvdW50T25jZSgpIHsKLSAgR29vZ2xlT25jZUluaXQoJmxvZ19zaWxlbmNlcl9jb3VudF9pbml0XywgJkluaXRMb2dTaWxlbmNlckNvdW50KTsKLX0KLQotTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjb25zdCBzdHJpbmcmIHZhbHVlKSB7Ci0gIG1lc3NhZ2VfICs9IHZhbHVlOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLUxvZ01lc3NhZ2UmIExvZ01lc3NhZ2U6Om9wZXJhdG9yPDwoY29uc3QgY2hhciogdmFsdWUpIHsKLSAgbWVzc2FnZV8gKz0gdmFsdWU7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjb25zdCBTdHJpbmdQaWVjZSYgdmFsdWUpIHsKLSAgbWVzc2FnZV8gKz0gdmFsdWUuVG9TdHJpbmcoKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi1Mb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcjw8KAotICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6U3RhdHVzJiBzdGF0dXMpIHsKLSAgbWVzc2FnZV8gKz0gc3RhdHVzLlRvU3RyaW5nKCk7Ci0gIHJldHVybiAqdGhpczsKLX0KLQotTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjb25zdCB1aW50MTI4JiB2YWx1ZSkgewotICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOwotICBzdHIgPDwgdmFsdWU7Ci0gIG1lc3NhZ2VfICs9IHN0ci5zdHIoKTsKLSAgcmV0dXJuICp0aGlzOwotfQotCi0vLyBTaW5jZSB0aGlzIGlzIGp1c3QgZm9yIGxvZ2dpbmcsIHdlIGRvbid0IGNhcmUgaWYgdGhlIGN1cnJlbnQgbG9jYWxlIGNoYW5nZXMKLS8vIHRoZSByZXN1bHRzIC0tIGluIGZhY3QsIHdlIHByb2JhYmx5IHByZWZlciB0aGF0LiAgU28gd2UgdXNlIHNucHJpbnRmKCkKLS8vIGluc3RlYWQgb2YgU2ltcGxlKnRvYSgpLgotI3VuZGVmIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SCi0jZGVmaW5lIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKFRZUEUsIEZPUk1BVCkgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChUWVBFIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgXAotICAgIC8qIDEyOCBieXRlcyBzaG91bGQgYmUgYmlnIGVub3VnaCBmb3IgYW55IG9mIHRoZSBwcmltaXRpdmUgKi8gICBcCi0gICAgLyogdmFsdWVzIHdoaWNoIHdlIHByaW50IHdpdGggdGhpcywgYnV0IHdlbGwgdXNlIHNucHJpbnRmKCkgKi8gIFwKLSAgICAvKiBhbnl3YXkgdG8gYmUgZXh0cmEgc2FmZS4gKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoYXIgYnVmZmVyWzEyOF07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgc25wcmludGYoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgRk9STUFULCB2YWx1ZSk7ICAgICAgICAgICAgICAgIFwKLSAgICAvKiBHdWFyZCBhZ2FpbnN0IGJyb2tlbiBNU1ZDIHNucHJpbnRmKCkuICovICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJ1ZmZlcltzaXplb2YoYnVmZmVyKS0xXSA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgbWVzc2FnZV8gKz0gYnVmZmVyOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZXR1cm4gKnRoaXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICB9Ci0KLURFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKGNoYXIgICAgICAgICAsICIlYyIgKQotREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IoaW50ICAgICAgICAgICwgIiVkIiApCi1ERUNMQVJFX1NUUkVBTV9PUEVSQVRPUih1bnNpZ25lZCBpbnQgLCAiJXUiICkKLURFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKGxvbmcgICAgICAgICAsICIlbGQiKQotREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IodW5zaWduZWQgbG9uZywgIiVsdSIpCi1ERUNMQVJFX1NUUkVBTV9PUEVSQVRPUihkb3VibGUgICAgICAgLCAiJWciICkKLURFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKHZvaWQqICAgICAgICAsICIlcCIgKQotREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IobG9uZyBsb25nICAgICAgICAgLCAiJSIgR09PR0xFX0xMX0ZPUk1BVCAiZCIpCi1ERUNMQVJFX1NUUkVBTV9PUEVSQVRPUih1bnNpZ25lZCBsb25nIGxvbmcsICIlIiBHT09HTEVfTExfRk9STUFUICJ1IikKLSN1bmRlZiBERUNMQVJFX1NUUkVBTV9PUEVSQVRPUgotCi1Mb2dNZXNzYWdlOjpMb2dNZXNzYWdlKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUpCi0gIDogbGV2ZWxfKGxldmVsKSwgZmlsZW5hbWVfKGZpbGVuYW1lKSwgbGluZV8obGluZSkge30KLUxvZ01lc3NhZ2U6On5Mb2dNZXNzYWdlKCkge30KLQotdm9pZCBMb2dNZXNzYWdlOjpGaW5pc2goKSB7Ci0gIGJvb2wgc3VwcHJlc3MgPSBmYWxzZTsKLQotICBpZiAobGV2ZWxfICE9IExPR0xFVkVMX0ZBVEFMKSB7Ci0gICAgSW5pdExvZ1NpbGVuY2VyQ291bnRPbmNlKCk7Ci0gICAgTXV0ZXhMb2NrIGxvY2sobG9nX3NpbGVuY2VyX2NvdW50X211dGV4Xyk7Ci0gICAgc3VwcHJlc3MgPSBsb2dfc2lsZW5jZXJfY291bnRfID4gMDsKLSAgfQotCi0gIGlmICghc3VwcHJlc3MpIHsKLSAgICBsb2dfaGFuZGxlcl8obGV2ZWxfLCBmaWxlbmFtZV8sIGxpbmVfLCBtZXNzYWdlXyk7Ci0gIH0KLQotICBpZiAobGV2ZWxfID09IExPR0xFVkVMX0ZBVEFMKSB7Ci0jaWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKLSAgICB0aHJvdyBGYXRhbEV4Y2VwdGlvbihmaWxlbmFtZV8sIGxpbmVfLCBtZXNzYWdlXyk7Ci0jZWxzZQotICAgIGFib3J0KCk7Ci0jZW5kaWYKLSAgfQotfQotCi12b2lkIExvZ0ZpbmlzaGVyOjpvcGVyYXRvcj0oTG9nTWVzc2FnZSYgb3RoZXIpIHsKLSAgb3RoZXIuRmluaXNoKCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1Mb2dIYW5kbGVyKiBTZXRMb2dIYW5kbGVyKExvZ0hhbmRsZXIqIG5ld19mdW5jKSB7Ci0gIExvZ0hhbmRsZXIqIG9sZCA9IGludGVybmFsOjpsb2dfaGFuZGxlcl87Ci0gIGlmIChvbGQgPT0gJmludGVybmFsOjpOdWxsTG9nSGFuZGxlcikgewotICAgIG9sZCA9IE5VTEw7Ci0gIH0KLSAgaWYgKG5ld19mdW5jID09IE5VTEwpIHsKLSAgICBpbnRlcm5hbDo6bG9nX2hhbmRsZXJfID0gJmludGVybmFsOjpOdWxsTG9nSGFuZGxlcjsKLSAgfSBlbHNlIHsKLSAgICBpbnRlcm5hbDo6bG9nX2hhbmRsZXJfID0gbmV3X2Z1bmM7Ci0gIH0KLSAgcmV0dXJuIG9sZDsKLX0KLQotTG9nU2lsZW5jZXI6OkxvZ1NpbGVuY2VyKCkgewotICBpbnRlcm5hbDo6SW5pdExvZ1NpbGVuY2VyQ291bnRPbmNlKCk7Ci0gIE11dGV4TG9jayBsb2NrKGludGVybmFsOjpsb2dfc2lsZW5jZXJfY291bnRfbXV0ZXhfKTsKLSAgKytpbnRlcm5hbDo6bG9nX3NpbGVuY2VyX2NvdW50XzsKLX07Ci0KLUxvZ1NpbGVuY2VyOjp+TG9nU2lsZW5jZXIoKSB7Ci0gIGludGVybmFsOjpJbml0TG9nU2lsZW5jZXJDb3VudE9uY2UoKTsKLSAgTXV0ZXhMb2NrIGxvY2soaW50ZXJuYWw6OmxvZ19zaWxlbmNlcl9jb3VudF9tdXRleF8pOwotICAtLWludGVybmFsOjpsb2dfc2lsZW5jZXJfY291bnRfOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL2NhbGxiYWNrLmNjCi0KLUNsb3N1cmU6On5DbG9zdXJlKCkge30KLQotbmFtZXNwYWNlIGludGVybmFsIHsgRnVuY3Rpb25DbG9zdXJlMDo6fkZ1bmN0aW9uQ2xvc3VyZTAoKSB7fSB9Ci0KLXZvaWQgRG9Ob3RoaW5nKCkge30KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL211dGV4LmNjCi0KLSNpZmRlZiBfV0lOMzIKLQotc3RydWN0IE11dGV4OjpJbnRlcm5hbCB7Ci0gIENSSVRJQ0FMX1NFQ1RJT04gbXV0ZXg7Ci0jaWZuZGVmIE5ERUJVRwotICAvLyBVc2VkIG9ubHkgdG8gaW1wbGVtZW50IEFzc2VydEhlbGQoKS4KLSAgRFdPUkQgdGhyZWFkX2lkOwotI2VuZGlmCi19OwotCi1NdXRleDo6TXV0ZXgoKQotICA6IG1JbnRlcm5hbChuZXcgSW50ZXJuYWwpIHsKLSAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbUludGVybmFsLT5tdXRleCk7Ci19Ci0KLU11dGV4Ojp+TXV0ZXgoKSB7Ci0gIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmbUludGVybmFsLT5tdXRleCk7Ci0gIGRlbGV0ZSBtSW50ZXJuYWw7Ci19Ci0KLXZvaWQgTXV0ZXg6OkxvY2soKSB7Ci0gIEVudGVyQ3JpdGljYWxTZWN0aW9uKCZtSW50ZXJuYWwtPm11dGV4KTsKLSNpZm5kZWYgTkRFQlVHCi0gIG1JbnRlcm5hbC0+dGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7Ci0jZW5kaWYKLX0KLQotdm9pZCBNdXRleDo6VW5sb2NrKCkgewotI2lmbmRlZiBOREVCVUcKLSAgbUludGVybmFsLT50aHJlYWRfaWQgPSAwOwotI2VuZGlmCi0gIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZtSW50ZXJuYWwtPm11dGV4KTsKLX0KLQotdm9pZCBNdXRleDo6QXNzZXJ0SGVsZCgpIHsKLSNpZm5kZWYgTkRFQlVHCi0gIEdPT0dMRV9EQ0hFQ0tfRVEobUludGVybmFsLT50aHJlYWRfaWQsIEdldEN1cnJlbnRUaHJlYWRJZCgpKTsKLSNlbmRpZgotfQotCi0jZWxpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRCkKLQotc3RydWN0IE11dGV4OjpJbnRlcm5hbCB7Ci0gIHB0aHJlYWRfbXV0ZXhfdCBtdXRleDsKLX07Ci0KLU11dGV4OjpNdXRleCgpCi0gIDogbUludGVybmFsKG5ldyBJbnRlcm5hbCkgewotICBwdGhyZWFkX211dGV4X2luaXQoJm1JbnRlcm5hbC0+bXV0ZXgsIE5VTEwpOwotfQotCi1NdXRleDo6fk11dGV4KCkgewotICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1JbnRlcm5hbC0+bXV0ZXgpOwotICBkZWxldGUgbUludGVybmFsOwotfQotCi12b2lkIE11dGV4OjpMb2NrKCkgewotICBpbnQgcmVzdWx0ID0gcHRocmVhZF9tdXRleF9sb2NrKCZtSW50ZXJuYWwtPm11dGV4KTsKLSAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInB0aHJlYWRfbXV0ZXhfbG9jazogIiA8PCBzdHJlcnJvcihyZXN1bHQpOwotICB9Ci19Ci0KLXZvaWQgTXV0ZXg6OlVubG9jaygpIHsKLSAgaW50IHJlc3VsdCA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtSW50ZXJuYWwtPm11dGV4KTsKLSAgaWYgKHJlc3VsdCAhPSAwKSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInB0aHJlYWRfbXV0ZXhfdW5sb2NrOiAiIDw8IHN0cmVycm9yKHJlc3VsdCk7Ci0gIH0KLX0KLQotdm9pZCBNdXRleDo6QXNzZXJ0SGVsZCgpIHsKLSAgLy8gcHRocmVhZHMgZG9zbid0IHByb3ZpZGUgYSB3YXkgdG8gY2hlY2sgd2hpY2ggdGhyZWFkIGhvbGRzIHRoZSBtdXRleC4KLSAgLy8gVE9ETyhrZW50b24pOiAgTWF5YmUga2VlcCB0cmFjayBvZiBsb2NraW5nIHRocmVhZCBJRCBsaWtlIHdpdGggV0lOMzI/Ci19Ci0KLSNlbmRpZgotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBlbXVsYXRlcyBnb29nbGUzL3V0aWwvZW5kaWFuL2VuZGlhbi5oCi0vLwotLy8gVE9ETyh4aWFvZmVuZyk6IFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gaXMgdW5mb3J0dW5hdGVseSBkZWZpbmVkIGluCi0vLyBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggYW5kIHRoZXJlZm9yZSBjYW4gbm90IGJlIHVzZWQgaGVyZS4KLS8vIE1heWJlIG1vdmUgdGhhdCBtYWNybyBkZWZpbml0aW9uIGhlcmUgaW4gdGhlIGZ1cnR1cmUuCi11aW50MzIgZ2h0b25sKHVpbnQzMiB4KSB7Ci0gIHVuaW9uIHsKLSAgICB1aW50MzIgcmVzdWx0OwotICAgIHVpbnQ4IHJlc3VsdF9hcnJheVs0XTsKLSAgfTsKLSAgcmVzdWx0X2FycmF5WzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHggPj4gMjQpOwotICByZXN1bHRfYXJyYXlbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHggPj4gMTYpICYgMHhGRik7Ci0gIHJlc3VsdF9hcnJheVsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigoeCA+PiA4KSAmIDB4RkYpOwotICByZXN1bHRfYXJyYXlbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4oeCAmIDB4RkYpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBTaHV0ZG93biBzdXBwb3J0LgotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10eXBlZGVmIHZvaWQgT25TaHV0ZG93bkZ1bmMoKTsKLXZlY3Rvcjx2b2lkICgqKSgpPiogc2h1dGRvd25fZnVuY3Rpb25zID0gTlVMTDsKLU11dGV4KiBzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXggPSBOVUxMOwotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShzaHV0ZG93bl9mdW5jdGlvbnNfaW5pdCk7Ci0KLXZvaWQgSW5pdFNodXRkb3duRnVuY3Rpb25zKCkgewotICBzaHV0ZG93bl9mdW5jdGlvbnMgPSBuZXcgdmVjdG9yPHZvaWQgKCopKCk+OwotICBzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXggPSBuZXcgTXV0ZXg7Ci19Ci0KLWlubGluZSB2b2lkIEluaXRTaHV0ZG93bkZ1bmN0aW9uc09uY2UoKSB7Ci0gIEdvb2dsZU9uY2VJbml0KCZzaHV0ZG93bl9mdW5jdGlvbnNfaW5pdCwgJkluaXRTaHV0ZG93bkZ1bmN0aW9ucyk7Ci19Ci0KLXZvaWQgT25TaHV0ZG93bih2b2lkICgqZnVuYykoKSkgewotICBJbml0U2h1dGRvd25GdW5jdGlvbnNPbmNlKCk7Ci0gIE11dGV4TG9jayBsb2NrKHNodXRkb3duX2Z1bmN0aW9uc19tdXRleCk7Ci0gIHNodXRkb3duX2Z1bmN0aW9ucy0+cHVzaF9iYWNrKGZ1bmMpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotdm9pZCBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpIHsKLSAgaW50ZXJuYWw6OkluaXRTaHV0ZG93bkZ1bmN0aW9uc09uY2UoKTsKLQotICAvLyBXZSBkb24ndCBuZWVkIHRvIGxvY2sgc2h1dGRvd25fZnVuY3Rpb25zX211dGV4IGJlY2F1c2UgaXQncyB1cCB0byB0aGUKLSAgLy8gY2FsbGVyIHRvIG1ha2Ugc3VyZSB0aGF0IG5vIG9uZSBpcyB1c2luZyB0aGUgbGlicmFyeSBiZWZvcmUgdGhpcyBpcwotICAvLyBjYWxsZWQuCi0KLSAgLy8gTWFrZSBpdCBzYWZlIHRvIGNhbGwgdGhpcyBtdWx0aXBsZSB0aW1lcy4KLSAgaWYgKGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnMgPT0gTlVMTCkgcmV0dXJuOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgaW50ZXJuYWw6OnNodXRkb3duX2Z1bmN0aW9ucy0+c2l6ZSgpOyBpKyspIHsKLSAgICBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zLT5hdChpKSgpOwotICB9Ci0gIGRlbGV0ZSBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zOwotICBpbnRlcm5hbDo6c2h1dGRvd25fZnVuY3Rpb25zID0gTlVMTDsKLSAgZGVsZXRlIGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXg7Ci0gIGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXggPSBOVUxMOwotfQotCi0jaWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKLUZhdGFsRXhjZXB0aW9uOjp+RmF0YWxFeGNlcHRpb24oKSB0aHJvdygpIHt9Ci0KLWNvbnN0IGNoYXIqIEZhdGFsRXhjZXB0aW9uOjp3aGF0KCkgY29uc3QgdGhyb3coKSB7Ci0gIHJldHVybiBtZXNzYWdlXy5jX3N0cigpOwotfQotI2VuZGlmCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDljMDVjYWMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaAorKysgL2Rldi9udWxsCkBAIC0xLDIyNSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKSBhbmQgb3RoZXJzCi0vLwotLy8gQ29udGFpbnMgYmFzaWMgdHlwZXMgYW5kIHV0aWxpdGllcyB1c2VkIGJ5IHRoZSByZXN0IG9mIHRoZSBsaWJyYXJ5LgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01NT05fSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01NT05fSF9fCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmg+Ci0KLS8vIFRPRE8obGl1amlzaSk6IFJlbW92ZSB0aGUgZm9sbG93aW5nIGluY2x1ZGVzIGFmdGVyIHRoZSBpbmNsdWRlIGNsZWFuLXVwLgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KLQotI2lmbmRlZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUwotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoX0NQUFVOV0lORCkKLSAgI2RlZmluZSBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUyAxCi0jZWxpZiBkZWZpbmVkKF9fRVhDRVBUSU9OUykKLSAgI2RlZmluZSBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUyAxCi0jZWxzZQotICAjZGVmaW5lIFBST1RPQlVGX1VTRV9FWENFUFRJT05TIDAKLSNlbmRpZgotI2VuZGlmCi0KLSNpZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUwotI2luY2x1ZGUgPGV4Y2VwdGlvbj4KLSNlbmRpZgotI2lmIGRlZmluZWQoX19BUFBMRV9fKQotI2luY2x1ZGUgPFRhcmdldENvbmRpdGlvbmFscy5oPiAgLy8gZm9yIFRBUkdFVF9PU19JUEhPTkUKLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfX0FORFJPSURfXykgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfQU5EUk9JRCkgfHwgKGRlZmluZWQoVEFSR0VUX09TX0lQSE9ORSkgJiYgVEFSR0VUX09TX0lQSE9ORSkgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfSVBIT05FKQotI2luY2x1ZGUgPHB0aHJlYWQuaD4KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfV0lOMzIpICYmIGRlZmluZWQoR2V0TWVzc2FnZSkKLS8vIEFsbG93IEdldE1lc3NhZ2UgdG8gYmUgdXNlZCBhcyBhIHZhbGlkIG1ldGhvZCBuYW1lIGluIHByb3RvYnVmIGNsYXNzZXMuCi0vLyB3aW5kb3dzLmggZGVmaW5lcyBHZXRNZXNzYWdlKCkgYXMgYSBtYWNyby4gIExldCdzIHJlLWRlZmluZSBpdCBhcyBhbiBpbmxpbmUKLS8vIGZ1bmN0aW9uLiAgVGhlIGlubGluZSBmdW5jdGlvbiBzaG91bGQgYmUgZXF1aXZhbGVudCBmb3IgQysrIHVzZXJzLgotaW5saW5lIEJPT0wgR2V0TWVzc2FnZV9XaW4zMigKLSAgICBMUE1TRyBscE1zZywgSFdORCBoV25kLAotICAgIFVJTlQgd01zZ0ZpbHRlck1pbiwgVUlOVCB3TXNnRmlsdGVyTWF4KSB7Ci0gIHJldHVybiBHZXRNZXNzYWdlKGxwTXNnLCBoV25kLCB3TXNnRmlsdGVyTWluLCB3TXNnRmlsdGVyTWF4KTsKLX0KLSN1bmRlZiBHZXRNZXNzYWdlCi1pbmxpbmUgQk9PTCBHZXRNZXNzYWdlKAotICAgIExQTVNHIGxwTXNnLCBIV05EIGhXbmQsCi0gICAgVUlOVCB3TXNnRmlsdGVyTWluLCBVSU5UIHdNc2dGaWx0ZXJNYXgpIHsKLSAgcmV0dXJuIEdldE1lc3NhZ2VfV2luMzIobHBNc2csIGhXbmQsIHdNc2dGaWx0ZXJNaW4sIHdNc2dGaWx0ZXJNYXgpOwotfQotI2VuZGlmCi0KLW5hbWVzcGFjZSBzdGQge30KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gU29tZSBvZiB0aGVzZSBjb25zdGFudHMgYXJlIG1hY3JvcyByYXRoZXIgdGhhbiBjb25zdCBpbnRzIHNvIHRoYXQgdGhleSBjYW4KLS8vIGJlIHVzZWQgaW4gI2lmIGRpcmVjdGl2ZXMuCi0KLS8vIFRoZSBjdXJyZW50IHZlcnNpb24sIHJlcHJlc2VudGVkIGFzIGEgc2luZ2xlIGludGVnZXIgdG8gbWFrZSBjb21wYXJpc29uCi0vLyBlYXNpZXI6ICBtYWpvciAqIDEwXjYgKyBtaW5vciAqIDEwXjMgKyBtaWNybwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiAzMDAwMDAwCi0KLS8vIFRoZSBtaW5pbXVtIGxpYnJhcnkgdmVyc2lvbiB3aGljaCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlCi0vLyBoZWFkZXJzLgotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUlOX0xJQlJBUllfVkVSU0lPTiAzMDAwMDAwCi0KLS8vIFRoZSBtaW5pbXVtIGhlYWRlciB2ZXJzaW9uIHdoaWNoIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZgotLy8gdGhlIGxpYnJhcnkuICBUaGlzIGNvbnN0YW50IHNob3VsZCBvbmx5IGJlIHVzZWQgYnkgcHJvdG9jJ3MgQysrIGNvZGUKLS8vIGdlbmVyYXRvci4KLXN0YXRpYyBjb25zdCBpbnQga01pbkhlYWRlclZlcnNpb25Gb3JMaWJyYXJ5ID0gMzAwMDAwMDsKLQotLy8gVGhlIG1pbmltdW0gcHJvdG9jIHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mIHRoZQotLy8gaGVhZGVycy4KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTiAzMDAwMDAwCi0KLS8vIFRoZSBtaW5pbXVtIGhlYWRlciB2ZXJzaW9uIHdoaWNoIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZgotLy8gcHJvdG9jLiAgVGhpcyBjb25zdGFudCBzaG91bGQgb25seSBiZSB1c2VkIGluIFZlcmlmeVZlcnNpb24oKS4KLXN0YXRpYyBjb25zdCBpbnQga01pbkhlYWRlclZlcnNpb25Gb3JQcm90b2MgPSAzMDAwMDAwOwotCi0vLyBWZXJpZmllcyB0aGF0IHRoZSBoZWFkZXJzIGFuZCBsaWJyYXJpZXMgYXJlIGNvbXBhdGlibGUuICBVc2UgdGhlIG1hY3JvCi0vLyBiZWxvdyB0byBjYWxsIHRoaXMuCi12b2lkIExJQlBST1RPQlVGX0VYUE9SVCBWZXJpZnlWZXJzaW9uKGludCBoZWFkZXJWZXJzaW9uLCBpbnQgbWluTGlicmFyeVZlcnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpbGVuYW1lKTsKLQotLy8gQ29udmVydHMgYSBudW1lcmljIHZlcnNpb24gbnVtYmVyIHRvIGEgc3RyaW5nLgotc3RkOjpzdHJpbmcgTElCUFJPVE9CVUZfRVhQT1JUIFZlcnNpb25TdHJpbmcoaW50IHZlcnNpb24pOwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gUGxhY2UgdGhpcyBtYWNybyBpbiB5b3VyIG1haW4oKSBmdW5jdGlvbiAob3Igc29tZXdoZXJlIGJlZm9yZSB5b3UgYXR0ZW1wdAotLy8gdG8gdXNlIHRoZSBwcm90b2J1ZiBsaWJyYXJ5KSB0byB2ZXJpZnkgdGhhdCB0aGUgdmVyc2lvbiB5b3UgbGluayBhZ2FpbnN0Ci0vLyBtYXRjaGVzIHRoZSBoZWFkZXJzIHlvdSBjb21waWxlZCBhZ2FpbnN0LiAgSWYgYSB2ZXJzaW9uIG1pc21hdGNoIGlzCi0vLyBkZXRlY3RlZCwgdGhlIHByb2Nlc3Mgd2lsbCBhYm9ydC4KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpWZXJpZnlWZXJzaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04sIEdPT0dMRV9QUk9UT0JVRl9NSU5fTElCUkFSWV9WRVJTSU9OLCAgICAgICAgIFwKLSAgICBfX0ZJTEVfXykKLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBmcm9tIGdvb2dsZTMvdXRpbC91dGY4L3B1YmxpYy91bmlsaWIuaAotCi1jbGFzcyBTdHJpbmdQaWVjZTsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIENoZWNrcyBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIHN0cnVjdHVyYWxseS12YWxpZCBVVEYtOC4gIEltcGxlbWVudGVkIGluCi0vLyBzdHJ1Y3R1cmFsbHlfdmFsaWQuY2MuCi1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBjaGFyKiBidWYsIGludCBsZW4pOwotCi1pbmxpbmUgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHN0ci5sZW5ndGgoKSkpOwotfQotCi0vLyBSZXR1cm5zIGluaXRpYWwgbnVtYmVyIG9mIGJ5dGVzIG9mIHN0cnVjdHVhbGx5IHZhbGlkIFVURi04LgotTElCUFJPVE9CVUZfRVhQT1JUIGludCBVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoY29uc3QgU3RyaW5nUGllY2UmIHN0cik7Ci0KLS8vIENvZXJjZSBVVEYtOCBieXRlIHN0cmluZyBpbiBzcmNfc3RyIHRvIGJlCi0vLyBhIHN0cnVjdHVyYWxseS12YWxpZCBlcXVhbC1sZW5ndGggc3RyaW5nIGJ5IHNlbGVjdGl2ZWx5Ci0vLyBvdmVyd3JpdGluZyBpbGxlZ2FsIGJ5dGVzIHdpdGggcmVwbGFjZV9jaGFyICh0eXBpY2FsbHkgJyAnIG9yICc/JykuCi0vLyByZXBsYWNlX2NoYXIgbXVzdCBiZSBsZWdhbCBwcmludGFibGUgNy1iaXQgQXNjaWkgMHgyMC4uMHg3ZS4KLS8vIHNyY19zdHIgaXMgcmVhZC1vbmx5LgotLy8KLS8vIFJldHVybnMgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyLCBzcmNfc3RyLmRhdGEoKSBpZiBubyBjaGFuZ2VzIHdlcmUgbWFkZSwKLS8vICBvciBpZHN0IGlmIHNvbWUgYnl0ZXMgd2VyZSBjaGFuZ2VkLiBpZHN0IGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyCi0vLyAgYW5kIG11c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzIHNyY19zdHIKLS8vCi0vLyBPcHRpbWl6ZWQgZm9yOiBhbGwgc3RydWN0dXJhbGx5IHZhbGlkIGFuZCBubyBieXRlIGNvcHlpbmcgaXMgZG9uZS4KLS8vCi1MSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogVVRGOENvZXJjZVRvU3RydWN0dXJhbGx5VmFsaWQoCi0gICAgY29uc3QgU3RyaW5nUGllY2UmIHN0ciwgY2hhciogZHN0LCBjaGFyIHJlcGxhY2VfY2hhcik7Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIFNodXRkb3duIHN1cHBvcnQuCi0KLS8vIFNodXQgZG93biB0aGUgZW50aXJlIHByb3RvY29sIGJ1ZmZlcnMgbGlicmFyeSwgZGVsZXRpbmcgYWxsIHN0YXRpYy1kdXJhdGlvbgotLy8gb2JqZWN0cyBhbGxvY2F0ZWQgYnkgdGhlIGxpYnJhcnkgb3IgYnkgZ2VuZXJhdGVkIC5wYi5jYyBmaWxlcy4KLS8vCi0vLyBUaGVyZSBhcmUgdHdvIHJlYXNvbnMgeW91IG1pZ2h0IHdhbnQgdG8gY2FsbCB0aGlzOgotLy8gKiBZb3UgdXNlIGEgZHJhY29uaWFuIGRlZmluaXRpb24gb2YgIm1lbW9yeSBsZWFrIiBpbiB3aGljaCB5b3UgZXhwZWN0Ci0vLyAgIGV2ZXJ5IHNpbmdsZSBtYWxsb2MoKSB0byBoYXZlIGEgY29ycmVzcG9uZGluZyBmcmVlKCksIGV2ZW4gZm9yIG9iamVjdHMKLS8vICAgd2hpY2ggbGl2ZSB1bnRpbCBwcm9ncmFtIGV4aXQuCi0vLyAqIFlvdSBhcmUgd3JpdGluZyBhIGR5bmFtaWNhbGx5LWxvYWRlZCBsaWJyYXJ5IHdoaWNoIG5lZWRzIHRvIGNsZWFuIHVwCi0vLyAgIGFmdGVyIGl0c2VsZiB3aGVuIHRoZSBsaWJyYXJ5IGlzIHVubG9hZGVkLgotLy8KLS8vIEl0IGlzIHNhZmUgdG8gY2FsbCB0aGlzIG11bHRpcGxlIHRpbWVzLiAgSG93ZXZlciwgaXQgaXMgbm90IHNhZmUgdG8gdXNlCi0vLyBhbnkgb3RoZXIgcGFydCBvZiB0aGUgcHJvdG9jb2wgYnVmZmVycyBsaWJyYXJ5IGFmdGVyCi0vLyBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpIGhhcyBiZWVuIGNhbGxlZC4KLUxJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFNodXRkb3duUHJvdG9idWZMaWJyYXJ5KCk7Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vIFJlZ2lzdGVyIGEgZnVuY3Rpb24gdG8gYmUgY2FsbGVkIHdoZW4gU2h1dGRvd25Qcm90b2NvbEJ1ZmZlcnMoKSBpcyBjYWxsZWQuCi1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBPblNodXRkb3duKHZvaWQgKCpmdW5jKSgpKTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLSNpZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUwotY2xhc3MgRmF0YWxFeGNlcHRpb24gOiBwdWJsaWMgc3RkOjpleGNlcHRpb24gewotIHB1YmxpYzoKLSAgRmF0YWxFeGNlcHRpb24oY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLCBjb25zdCBzdGQ6OnN0cmluZyYgbWVzc2FnZSkKLSAgICAgIDogZmlsZW5hbWVfKGZpbGVuYW1lKSwgbGluZV8obGluZSksIG1lc3NhZ2VfKG1lc3NhZ2UpIHt9Ci0gIHZpcnR1YWwgfkZhdGFsRXhjZXB0aW9uKCkgdGhyb3coKTsKLQotICB2aXJ0dWFsIGNvbnN0IGNoYXIqIHdoYXQoKSBjb25zdCB0aHJvdygpOwotCi0gIGNvbnN0IGNoYXIqIGZpbGVuYW1lKCkgY29uc3QgeyByZXR1cm4gZmlsZW5hbWVfOyB9Ci0gIGludCBsaW5lKCkgY29uc3QgeyByZXR1cm4gbGluZV87IH0KLSAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UoKSBjb25zdCB7IHJldHVybiBtZXNzYWdlXzsgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgY2hhciogZmlsZW5hbWVfOwotICBjb25zdCBpbnQgbGluZV87Ci0gIGNvbnN0IHN0ZDo6c3RyaW5nIG1lc3NhZ2VfOwotfTsKLSNlbmRpZgotCi0vLyBUaGlzIGlzIGF0IHRoZSBlbmQgb2YgdGhlIGZpbGUgaW5zdGVhZCBvZiB0aGUgYmVnaW5uaW5nIHRvIHdvcmsgYXJvdW5kIGEgYnVnCi0vLyBpbiBzb21lIHZlcnNpb25zIG9mIE1TVkMuCi11c2luZyBuYW1lc3BhY2Ugc3RkOyAgLy8gRG9uJ3QgZG8gdGhpcyBhdCBob21lLCBraWRzLgotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQ09NTU9OX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMjViYWU5Yi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDM1OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotdXNpbmcgaW50ZXJuYWw6Ok5ld0NhbGxiYWNrOwotdXNpbmcgaW50ZXJuYWw6Ok5ld1Blcm1hbmVudENhbGxiYWNrOwotbmFtZXNwYWNlIHsKLQotLy8gVE9ETyhrZW50b24pOiAgTW9yZSB0ZXN0cy4KLQotI2lmZGVmIFBBQ0tBR0VfVkVSU0lPTiAgLy8gb25seSBkZWZpbmVkIHdoZW4gdXNpbmcgYXV0b21ha2UsIG5vdCBNU1ZDCi0KLVRFU1QoVmVyc2lvblRlc3QsIFZlcnNpb25NYXRjaGVzQ29uZmlnKSB7Ci0gIC8vIFZlcmlmeSB0aGF0IHRoZSB2ZXJzaW9uIHN0cmluZyBzcGVjaWZpZWQgaW4gY29uZmlnLmggbWF0Y2hlcyB0aGUgb25lCi0gIC8vIGluIGNvbW1vbi5oLiAgVGhlIGNvbmZpZy5oIHZlcnNpb24gaXMgYSBzdHJpbmcgd2hpY2ggbWF5IGhhdmUgYSBzdWZmaXgKLSAgLy8gbGlrZSAiYmV0YSIgb3IgInJjMSIsIHNvIHdlIHJlbW92ZSB0aGF0LgotICBzdHJpbmcgdmVyc2lvbiA9IFBBQ0tBR0VfVkVSU0lPTjsKLSAgaW50IHBvcyA9IDA7Ci0gIHdoaWxlIChwb3MgPCB2ZXJzaW9uLnNpemUoKSAmJgotICAgICAgICAgKGFzY2lpX2lzZGlnaXQodmVyc2lvbltwb3NdKSB8fCB2ZXJzaW9uW3Bvc10gPT0gJy4nKSkgewotICAgICsrcG9zOwotICB9Ci0gIHZlcnNpb24uZXJhc2UocG9zKTsKLQotICBFWFBFQ1RfRVEodmVyc2lvbiwgaW50ZXJuYWw6OlZlcnNpb25TdHJpbmcoR09PR0xFX1BST1RPQlVGX1ZFUlNJT04pKTsKLX0KLQotI2VuZGlmICAvLyBQQUNLQUdFX1ZFUlNJT04KLQotVEVTVChDb21tb25UZXN0LCBJbnRNaW5NYXhDb25zdGFudHMpIHsKLSAgLy8ga2ludDMybWluIHdhcyBkZWNsYXJlZCBpbmNvcnJlY3RseSBpbiB0aGUgZmlyc3QgcmVsZWFzZSBvZiBwcm90b2J1ZnMuCi0gIC8vIFVnaC4KLSAgRVhQRUNUX0xUKGtpbnQzMm1pbiwga2ludDMybWF4KTsKLSAgRVhQRUNUX0VRKHN0YXRpY19jYXN0PHVpbnQzMj4oa2ludDMybWluKSwgc3RhdGljX2Nhc3Q8dWludDMyPihraW50MzJtYXgpICsgMSk7Ci0gIEVYUEVDVF9MVChraW50NjRtaW4sIGtpbnQ2NG1heCk7Ci0gIEVYUEVDVF9FUShzdGF0aWNfY2FzdDx1aW50NjQ+KGtpbnQ2NG1pbiksIHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWF4KSArIDEpOwotICBFWFBFQ1RfRVEoMCwga3VpbnQzMm1heCArIDEpOwotICBFWFBFQ1RfRVEoMCwga3VpbnQ2NG1heCArIDEpOwotfQotCi12ZWN0b3I8c3RyaW5nPiBjYXB0dXJlZF9tZXNzYWdlc187Ci0KLXZvaWQgQ2FwdHVyZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICBjYXB0dXJlZF9tZXNzYWdlc18ucHVzaF9iYWNrKAotICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwICQxOiQyOiAkMyIsCi0gICAgICBpbXBsaWNpdF9jYXN0PGludD4obGV2ZWwpLCBmaWxlbmFtZSwgbGluZSwgbWVzc2FnZSkpOwotfQotCi1URVNUKExvZ2dpbmdUZXN0LCBEZWZhdWx0TG9nZ2luZykgewotICBDYXB0dXJlVGVzdFN0ZGVycigpOwotICBpbnQgbGluZSA9IF9fTElORV9fOwotICBHT09HTEVfTE9HKElORk8gICApIDw8ICJBIG1lc3NhZ2UuIjsKLSAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiQSB3YXJuaW5nLiI7Ci0gIEdPT0dMRV9MT0coRVJST1IgICkgPDwgIkFuIGVycm9yLiI7Ci0KLSAgc3RyaW5nIHRleHQgPSBHZXRDYXB0dXJlZFRlc3RTdGRlcnIoKTsKLSAgRVhQRUNUX0VRKAotICAgICJbbGlicHJvdG9idWYgSU5GTyAiIF9fRklMRV9fICI6IiArIFNpbXBsZUl0b2EobGluZSArIDEpICsgIl0gQSBtZXNzYWdlLlxuIgotICAgICJbbGlicHJvdG9idWYgV0FSTklORyAiIF9fRklMRV9fICI6IiArIFNpbXBsZUl0b2EobGluZSArIDIpICsgIl0gQSB3YXJuaW5nLlxuIgotICAgICJbbGlicHJvdG9idWYgRVJST1IgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKGxpbmUgKyAzKSArICJdIEFuIGVycm9yLlxuIiwKLSAgICB0ZXh0KTsKLX0KLQotVEVTVChMb2dnaW5nVGVzdCwgTnVsbExvZ2dpbmcpIHsKLSAgTG9nSGFuZGxlciogb2xkX2hhbmRsZXIgPSBTZXRMb2dIYW5kbGVyKE5VTEwpOwotCi0gIENhcHR1cmVUZXN0U3RkZXJyKCk7Ci0gIEdPT0dMRV9MT0coSU5GTyAgICkgPDwgIkEgbWVzc2FnZS4iOwotICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJBIHdhcm5pbmcuIjsKLSAgR09PR0xFX0xPRyhFUlJPUiAgKSA8PCAiQW4gZXJyb3IuIjsKLQotICBFWFBFQ1RfVFJVRShTZXRMb2dIYW5kbGVyKG9sZF9oYW5kbGVyKSA9PSBOVUxMKTsKLQotICBzdHJpbmcgdGV4dCA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOwotICBFWFBFQ1RfRVEoIiIsIHRleHQpOwotfQotCi1URVNUKExvZ2dpbmdUZXN0LCBDYXB0dXJlTG9nZ2luZykgewotICBjYXB0dXJlZF9tZXNzYWdlc18uY2xlYXIoKTsKLQotICBMb2dIYW5kbGVyKiBvbGRfaGFuZGxlciA9IFNldExvZ0hhbmRsZXIoJkNhcHR1cmVMb2cpOwotCi0gIGludCBzdGFydF9saW5lID0gX19MSU5FX187Ci0gIEdPT0dMRV9MT0coRVJST1IpIDw8ICJBbiBlcnJvci4iOwotICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJBIHdhcm5pbmcuIjsKLQotICBFWFBFQ1RfVFJVRShTZXRMb2dIYW5kbGVyKG9sZF9oYW5kbGVyKSA9PSAmQ2FwdHVyZUxvZyk7Ci0KLSAgQVNTRVJUX0VRKDIsIGNhcHR1cmVkX21lc3NhZ2VzXy5zaXplKCkpOwotICBFWFBFQ1RfRVEoCi0gICAgIjIgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKHN0YXJ0X2xpbmUgKyAxKSArICI6IEFuIGVycm9yLiIsCi0gICAgY2FwdHVyZWRfbWVzc2FnZXNfWzBdKTsKLSAgRVhQRUNUX0VRKAotICAgICIxICIgX19GSUxFX18gIjoiICsgU2ltcGxlSXRvYShzdGFydF9saW5lICsgMikgKyAiOiBBIHdhcm5pbmcuIiwKLSAgICBjYXB0dXJlZF9tZXNzYWdlc19bMV0pOwotfQotCi1URVNUKExvZ2dpbmdUZXN0LCBTaWxlbmNlTG9nZ2luZykgewotICBjYXB0dXJlZF9tZXNzYWdlc18uY2xlYXIoKTsKLQotICBMb2dIYW5kbGVyKiBvbGRfaGFuZGxlciA9IFNldExvZ0hhbmRsZXIoJkNhcHR1cmVMb2cpOwotCi0gIGludCBsaW5lMSA9IF9fTElORV9fOyBHT09HTEVfTE9HKElORk8pIDw8ICJWaXNpYmxlMSI7Ci0gIExvZ1NpbGVuY2VyKiBzaWxlbmNlcjEgPSBuZXcgTG9nU2lsZW5jZXI7Ci0gIEdPT0dMRV9MT0coSU5GTykgPDwgIk5vdCB2aXNpYmxlLiI7Ci0gIExvZ1NpbGVuY2VyKiBzaWxlbmNlcjIgPSBuZXcgTG9nU2lsZW5jZXI7Ci0gIEdPT0dMRV9MT0coSU5GTykgPDwgIk5vdCB2aXNpYmxlLiI7Ci0gIGRlbGV0ZSBzaWxlbmNlcjE7Ci0gIEdPT0dMRV9MT0coSU5GTykgPDwgIk5vdCB2aXNpYmxlLiI7Ci0gIGRlbGV0ZSBzaWxlbmNlcjI7Ci0gIGludCBsaW5lMiA9IF9fTElORV9fOyBHT09HTEVfTE9HKElORk8pIDw8ICJWaXNpYmxlMiI7Ci0KLSAgRVhQRUNUX1RSVUUoU2V0TG9nSGFuZGxlcihvbGRfaGFuZGxlcikgPT0gJkNhcHR1cmVMb2cpOwotCi0gIEFTU0VSVF9FUSgyLCBjYXB0dXJlZF9tZXNzYWdlc18uc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKAotICAgICIwICIgX19GSUxFX18gIjoiICsgU2ltcGxlSXRvYShsaW5lMSkgKyAiOiBWaXNpYmxlMSIsCi0gICAgY2FwdHVyZWRfbWVzc2FnZXNfWzBdKTsKLSAgRVhQRUNUX0VRKAotICAgICIwICIgX19GSUxFX18gIjoiICsgU2ltcGxlSXRvYShsaW5lMikgKyAiOiBWaXNpYmxlMiIsCi0gICAgY2FwdHVyZWRfbWVzc2FnZXNfWzFdKTsKLX0KLQotY2xhc3MgQ2xvc3VyZVRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICB2b2lkIFNldEExMjNNZXRob2QoKSAgIHsgYV8gPSAxMjM7IH0KLSAgc3RhdGljIHZvaWQgU2V0QTEyM0Z1bmN0aW9uKCkgeyBjdXJyZW50X2luc3RhbmNlXy0+YV8gPSAxMjM7IH0KLQotICB2b2lkIFNldEFNZXRob2QoaW50IGEpICAgICAgICAgeyBhXyA9IGE7IH0KLSAgdm9pZCBTZXRDTWV0aG9kKHN0cmluZyBjKSAgICAgIHsgY18gPSBjOyB9Ci0KLSAgc3RhdGljIHZvaWQgU2V0QUZ1bmN0aW9uKGludCBhKSAgICAgICAgIHsgY3VycmVudF9pbnN0YW5jZV8tPmFfID0gYTsgfQotICBzdGF0aWMgdm9pZCBTZXRDRnVuY3Rpb24oc3RyaW5nIGMpICAgICAgeyBjdXJyZW50X2luc3RhbmNlXy0+Y18gPSBjOyB9Ci0KLSAgdm9pZCBTZXRBQk1ldGhvZChpbnQgYSwgY29uc3QgY2hhciogYikgIHsgYV8gPSBhOyBiXyA9IGI7IH0KLSAgc3RhdGljIHZvaWQgU2V0QUJGdW5jdGlvbihpbnQgYSwgY29uc3QgY2hhciogYikgewotICAgIGN1cnJlbnRfaW5zdGFuY2VfLT5hXyA9IGE7Ci0gICAgY3VycmVudF9pbnN0YW5jZV8tPmJfID0gYjsKLSAgfQotCi0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBjdXJyZW50X2luc3RhbmNlXyA9IHRoaXM7Ci0gICAgYV8gPSAwOwotICAgIGJfID0gTlVMTDsKLSAgICBjXy5jbGVhcigpOwotICAgIHBlcm1hbmVudF9jbG9zdXJlXyA9IE5VTEw7Ci0gIH0KLQotICB2b2lkIERlbGV0ZUNsb3N1cmVJbkNhbGxiYWNrKCkgewotICAgIGRlbGV0ZSBwZXJtYW5lbnRfY2xvc3VyZV87Ci0gIH0KLQotICBpbnQgYV87Ci0gIGNvbnN0IGNoYXIqIGJfOwotICBzdHJpbmcgY187Ci0gIENsb3N1cmUqIHBlcm1hbmVudF9jbG9zdXJlXzsKLQotICBzdGF0aWMgQ2xvc3VyZVRlc3QqIGN1cnJlbnRfaW5zdGFuY2VfOwotfTsKLQotQ2xvc3VyZVRlc3QqIENsb3N1cmVUZXN0OjpjdXJyZW50X2luc3RhbmNlXyA9IE5VTEw7Ci0KLVRFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVGdW5jdGlvbjApIHsKLSAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKCZTZXRBMTIzRnVuY3Rpb24pOwotICBFWFBFQ1RfTkUoMTIzLCBhXyk7Ci0gIGNsb3N1cmUtPlJ1bigpOwotICBFWFBFQ1RfRVEoMTIzLCBhXyk7Ci19Ci0KLVRFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVNZXRob2QwKSB7Ci0gIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QTEyM01ldGhvZCk7Ci0gIEVYUEVDVF9ORSgxMjMsIGFfKTsKLSAgY2xvc3VyZS0+UnVuKCk7Ci0gIEVYUEVDVF9FUSgxMjMsIGFfKTsKLX0KLQotVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZUZ1bmN0aW9uMSkgewotICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soJlNldEFGdW5jdGlvbiwgNDU2KTsKLSAgRVhQRUNUX05FKDQ1NiwgYV8pOwotICBjbG9zdXJlLT5SdW4oKTsKLSAgRVhQRUNUX0VRKDQ1NiwgYV8pOwotfQotCi1URVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMSkgewotICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soY3VycmVudF9pbnN0YW5jZV8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmQ2xvc3VyZVRlc3Q6OlNldEFNZXRob2QsIDQ1Nik7Ci0gIEVYUEVDVF9ORSg0NTYsIGFfKTsKLSAgY2xvc3VyZS0+UnVuKCk7Ci0gIEVYUEVDVF9FUSg0NTYsIGFfKTsKLX0KLQotVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0Q2xvc3VyZUZ1bmN0aW9uMVN0cmluZykgewotICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3Q2FsbGJhY2soJlNldENGdW5jdGlvbiwgc3RyaW5nKCJ0ZXN0IikpOwotICBFWFBFQ1RfTkUoInRlc3QiLCBjXyk7Ci0gIGNsb3N1cmUtPlJ1bigpOwotICBFWFBFQ1RfRVEoInRlc3QiLCBjXyk7Ci19Ci0KLVRFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVNZXRob2QxU3RyaW5nKSB7Ci0gIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0Q01ldGhvZCwgc3RyaW5nKCJ0ZXN0IikpOwotICBFWFBFQ1RfTkUoInRlc3QiLCBjXyk7Ci0gIGNsb3N1cmUtPlJ1bigpOwotICBFWFBFQ1RfRVEoInRlc3QiLCBjXyk7Ci19Ci0KLVRFU1RfRihDbG9zdXJlVGVzdCwgVGVzdENsb3N1cmVGdW5jdGlvbjIpIHsKLSAgY29uc3QgY2hhciogY3N0ciA9ICJoZWxsbyI7Ci0gIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdDYWxsYmFjaygmU2V0QUJGdW5jdGlvbiwgNzg5LCBjc3RyKTsKLSAgRVhQRUNUX05FKDc4OSwgYV8pOwotICBFWFBFQ1RfTkUoY3N0ciwgYl8pOwotICBjbG9zdXJlLT5SdW4oKTsKLSAgRVhQRUNUX0VRKDc4OSwgYV8pOwotICBFWFBFQ1RfRVEoY3N0ciwgYl8pOwotfQotCi1URVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RDbG9zdXJlTWV0aG9kMikgewotICBjb25zdCBjaGFyKiBjc3RyID0gImhlbGxvIjsKLSAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld0NhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBQk1ldGhvZCwgNzg5LCBjc3RyKTsKLSAgRVhQRUNUX05FKDc4OSwgYV8pOwotICBFWFBFQ1RfTkUoY3N0ciwgYl8pOwotICBjbG9zdXJlLT5SdW4oKTsKLSAgRVhQRUNUX0VRKDc4OSwgYV8pOwotICBFWFBFQ1RfRVEoY3N0ciwgYl8pOwotfQotCi0vLyBSZXBlYXQgYWxsIG9mIHRoZSBhYm92ZSB3aXRoIE5ld1Blcm1hbmVudENhbGxiYWNrKCkKLQotVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZUZ1bmN0aW9uMCkgewotICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soJlNldEExMjNGdW5jdGlvbik7Ci0gIEVYUEVDVF9ORSgxMjMsIGFfKTsKLSAgY2xvc3VyZS0+UnVuKCk7Ci0gIEVYUEVDVF9FUSgxMjMsIGFfKTsKLSAgYV8gPSAwOwotICBjbG9zdXJlLT5SdW4oKTsKLSAgRVhQRUNUX0VRKDEyMywgYV8pOwotICBkZWxldGUgY2xvc3VyZTsKLX0KLQotVEVTVF9GKENsb3N1cmVUZXN0LCBUZXN0UGVybWFuZW50Q2xvc3VyZU1ldGhvZDApIHsKLSAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBMTIzTWV0aG9kKTsKLSAgRVhQRUNUX05FKDEyMywgYV8pOwotICBjbG9zdXJlLT5SdW4oKTsKLSAgRVhQRUNUX0VRKDEyMywgYV8pOwotICBhXyA9IDA7Ci0gIGNsb3N1cmUtPlJ1bigpOwotICBFWFBFQ1RfRVEoMTIzLCBhXyk7Ci0gIGRlbGV0ZSBjbG9zdXJlOwotfQotCi1URVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlRnVuY3Rpb24xKSB7Ci0gIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjaygmU2V0QUZ1bmN0aW9uLCA0NTYpOwotICBFWFBFQ1RfTkUoNDU2LCBhXyk7Ci0gIGNsb3N1cmUtPlJ1bigpOwotICBFWFBFQ1RfRVEoNDU2LCBhXyk7Ci0gIGFfID0gMDsKLSAgY2xvc3VyZS0+UnVuKCk7Ci0gIEVYUEVDVF9FUSg0NTYsIGFfKTsKLSAgZGVsZXRlIGNsb3N1cmU7Ci19Ci0KLVRFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVNZXRob2QxKSB7Ci0gIENsb3N1cmUqIGNsb3N1cmUgPSBOZXdQZXJtYW5lbnRDYWxsYmFjayhjdXJyZW50X2luc3RhbmNlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZDbG9zdXJlVGVzdDo6U2V0QU1ldGhvZCwgNDU2KTsKLSAgRVhQRUNUX05FKDQ1NiwgYV8pOwotICBjbG9zdXJlLT5SdW4oKTsKLSAgRVhQRUNUX0VRKDQ1NiwgYV8pOwotICBhXyA9IDA7Ci0gIGNsb3N1cmUtPlJ1bigpOwotICBFWFBFQ1RfRVEoNDU2LCBhXyk7Ci0gIGRlbGV0ZSBjbG9zdXJlOwotfQotCi1URVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlRnVuY3Rpb24yKSB7Ci0gIGNvbnN0IGNoYXIqIGNzdHIgPSAiaGVsbG8iOwotICBDbG9zdXJlKiBjbG9zdXJlID0gTmV3UGVybWFuZW50Q2FsbGJhY2soJlNldEFCRnVuY3Rpb24sIDc4OSwgY3N0cik7Ci0gIEVYUEVDVF9ORSg3ODksIGFfKTsKLSAgRVhQRUNUX05FKGNzdHIsIGJfKTsKLSAgY2xvc3VyZS0+UnVuKCk7Ci0gIEVYUEVDVF9FUSg3ODksIGFfKTsKLSAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKLSAgYV8gPSAwOwotICBiXyA9IE5VTEw7Ci0gIGNsb3N1cmUtPlJ1bigpOwotICBFWFBFQ1RfRVEoNzg5LCBhXyk7Ci0gIEVYUEVDVF9FUShjc3RyLCBiXyk7Ci0gIGRlbGV0ZSBjbG9zdXJlOwotfQotCi1URVNUX0YoQ2xvc3VyZVRlc3QsIFRlc3RQZXJtYW5lbnRDbG9zdXJlTWV0aG9kMikgewotICBjb25zdCBjaGFyKiBjc3RyID0gImhlbGxvIjsKLSAgQ2xvc3VyZSogY2xvc3VyZSA9IE5ld1Blcm1hbmVudENhbGxiYWNrKGN1cnJlbnRfaW5zdGFuY2VfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkNsb3N1cmVUZXN0OjpTZXRBQk1ldGhvZCwgNzg5LCBjc3RyKTsKLSAgRVhQRUNUX05FKDc4OSwgYV8pOwotICBFWFBFQ1RfTkUoY3N0ciwgYl8pOwotICBjbG9zdXJlLT5SdW4oKTsKLSAgRVhQRUNUX0VRKDc4OSwgYV8pOwotICBFWFBFQ1RfRVEoY3N0ciwgYl8pOwotICBhXyA9IDA7Ci0gIGJfID0gTlVMTDsKLSAgY2xvc3VyZS0+UnVuKCk7Ci0gIEVYUEVDVF9FUSg3ODksIGFfKTsKLSAgRVhQRUNUX0VRKGNzdHIsIGJfKTsKLSAgZGVsZXRlIGNsb3N1cmU7Ci19Ci0KLVRFU1RfRihDbG9zdXJlVGVzdCwgVGVzdFBlcm1hbmVudENsb3N1cmVEZWxldGVJbkNhbGxiYWNrKSB7Ci0gIHBlcm1hbmVudF9jbG9zdXJlXyA9IE5ld1Blcm1hbmVudENhbGxiYWNrKChDbG9zdXJlVGVzdCopIHRoaXMsCi0gICAgICAmQ2xvc3VyZVRlc3Q6OkRlbGV0ZUNsb3N1cmVJbkNhbGxiYWNrKTsKLSAgcGVybWFuZW50X2Nsb3N1cmVfLT5SdW4oKTsKLX0KLQotfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Zhc3RtZW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvZmFzdG1lbS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NjNhNmU2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvZmFzdG1lbS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTQgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBGYXN0IG1lbW9yeSBjb3B5aW5nIGFuZCBjb21wYXJpc29uIHJvdXRpbmVzLgotLy8gICBzdHJpbmdzOjpmYXN0bWVtY21wX2lubGluZWQoKSByZXBsYWNlcyBtZW1jbXAoKQotLy8gICBzdHJpbmdzOjptZW1jcHlfaW5saW5lZCgpIHJlcGxhY2VzIG1lbWNweSgpCi0vLyAgIHN0cmluZ3M6Om1lbWVxKGEsIGIsIG4pIHJlcGxhY2VzIG1lbWNtcChhLCBiLCBuKSA9PSAwCi0vLwotLy8gc3RyaW5nczo6Kl9pbmxpbmVkKCkgcm91dGluZXMgYXJlIGlubGluZSB2ZXJzaW9ucyBvZiB0aGUKLS8vIHJvdXRpbmVzIGV4cG9ydGVkIGJ5IHRoaXMgbW9kdWxlLiAgU29tZXRpbWVzIHVzaW5nIHRoZSBpbmxpbmVkCi0vLyB2ZXJzaW9ucyBpcyBmYXN0ZXIuICBNZWFzdXJlIGJlZm9yZSB1c2luZyB0aGUgaW5saW5lZCB2ZXJzaW9ucy4KLS8vCi0vLyBQZXJmb3JtYW5jZSBtZWFzdXJlbWVudDoKLS8vICAgc3RyaW5nczo6ZmFzdG1lbWNtcF9pbmxpbmVkCi0vLyAgICAgQW5hbHlzaXM6IG1lbWNtcCwgZmFzdG1lbWNtcF9pbmxpbmVkLCBmYXN0bWVtY21wCi0vLyAgICAgMjAxMi0wMS0zMAotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19GQVNUTUVNX0hfCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19GQVNUTUVNX0hfCi0KLSNpbmNsdWRlIDxzdGRkZWYuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZy5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0vLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbiBieXRlcyBhdCBhIGVxdWFsIHRoZSBuIGJ5dGVzIGF0IGIuCi0vLyBUaGUgcmVnaW9ucyBhcmUgYWxsb3dlZCB0byBvdmVybGFwLgotLy8KLS8vIFRoZSBwZXJmb3JtYW5jZSBpcyBzaW1pbGFyIHRvIHRoZSBwZXJmb3JtYW5jZSBtZW1jbXAoKSwgYnV0IGZhc3RlciBmb3IKLS8vIG1vZGVyYXRlbHktc2l6ZWQgaW5wdXRzLCBvciBpbnB1dHMgdGhhdCBzaGFyZSBhIGNvbW1vbiBwcmVmaXggYW5kIGRpZmZlcgotLy8gc29tZXdoZXJlIGluIHRoZWlyIGxhc3QgOCBieXRlcy4gRnVydGhlciBvcHRpbWl6YXRpb25zIGNhbiBiZSBhZGRlZCBsYXRlcgotLy8gaWYgaXQgbWFrZXMgc2Vuc2UgdG8gZG8gc28uOncKLWlubGluZSBib29sIG1lbWVxKGNvbnN0IGNoYXIqIGEsIGNvbnN0IGNoYXIqIGIsIHNpemVfdCBuKSB7Ci0gIHNpemVfdCBuX3JvdW5kZWRfZG93biA9IG4gJiB+c3RhdGljX2Nhc3Q8c2l6ZV90Pig3KTsKLSAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKG5fcm91bmRlZF9kb3duID09IDApKSB7ICAvLyBuIDw9IDcKLSAgICByZXR1cm4gbWVtY21wKGEsIGIsIG4pID09IDA7Ci0gIH0KLSAgLy8gbiA+PSA4Ci0gIHVpbnQ2NCB1ID0gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYSkgXiBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChiKTsKLSAgdWludDY0IHYgPSBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChhICsgbiAtIDgpIF4gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYiArIG4gLSA4KTsKLSAgaWYgKCh1IHwgdikgIT0gMCkgeyAgLy8gVGhlIGZpcnN0IG9yIGxhc3QgOCBieXRlcyBkaWZmZXIuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGEgKz0gODsKLSAgYiArPSA4OwotICBuID0gbl9yb3VuZGVkX2Rvd24gLSA4OwotICBpZiAobiA+IDEyOCkgewotICAgIC8vIEFzIG9mIDIwMTIsIG1lbWNtcCBvbiB4ODYtNjQgdXNlcyBhIGJpZyB1bnJvbGxlZCBsb29wIHdpdGggU1NFMgotICAgIC8vIGluc3RydWN0aW9ucywgYW5kIHdoaWxlIHdlIGNvdWxkIHRyeSB0byBkbyBzb21ldGhpbmcgZmFzdGVyLCBpdAotICAgIC8vIGRvZXNuJ3Qgc2VlbSB3b3J0aCBwdXJzdWluZy4KLSAgICByZXR1cm4gbWVtY21wKGEsIGIsIG4pID09IDA7Ci0gIH0KLSAgZm9yICg7IG4gPj0gMTY7IG4gLT0gMTYpIHsKLSAgICB1aW50NjQgeCA9IEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGEpIF4gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYik7Ci0gICAgdWludDY0IHkgPSBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChhICsgOCkgXiBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChiICsgOCk7Ci0gICAgaWYgKCh4IHwgeSkgIT0gMCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBhICs9IDE2OwotICAgIGIgKz0gMTY7Ci0gIH0KLSAgLy8gbiBtdXN0IGJlIDAgb3IgOCBub3cgYmVjYXVzZSBpdCB3YXMgYSBtdWx0aXBsZSBvZiA4IGF0IHRoZSB0b3Agb2YgdGhlIGxvb3AuCi0gIHJldHVybiBuID09IDAgfHwgR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYSkgPT0gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYik7Ci19Ci0KLWlubGluZSBpbnQgZmFzdG1lbWNtcF9pbmxpbmVkKGNvbnN0IGNoYXIgKmEsIGNvbnN0IGNoYXIgKmIsIHNpemVfdCBuKSB7Ci0gIGlmIChuID49IDY0KSB7Ci0gICAgcmV0dXJuIG1lbWNtcChhLCBiLCBuKTsKLSAgfQotICBjb25zdCBjaGFyKiBhX2xpbWl0ID0gYSArIG47Ci0gIHdoaWxlIChhICsgc2l6ZW9mKHVpbnQ2NCkgPD0gYV9saW1pdCAmJgotICAgICAgICAgR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYSkgPT0gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYikpIHsKLSAgICBhICs9IHNpemVvZih1aW50NjQpOwotICAgIGIgKz0gc2l6ZW9mKHVpbnQ2NCk7Ci0gIH0KLSAgaWYgKGEgKyBzaXplb2YodWludDMyKSA8PSBhX2xpbWl0ICYmCi0gICAgICBHT09HTEVfVU5BTElHTkVEX0xPQUQzMihhKSA9PSBHT09HTEVfVU5BTElHTkVEX0xPQUQzMihiKSkgewotICAgIGEgKz0gc2l6ZW9mKHVpbnQzMik7Ci0gICAgYiArPSBzaXplb2YodWludDMyKTsKLSAgfQotICB3aGlsZSAoYSA8IGFfbGltaXQpIHsKLSAgICBpbnQgZCA9IHN0YXRpY19jYXN0PHVpbnQzMj4oKmErKykgLSBzdGF0aWNfY2FzdDx1aW50MzI+KCpiKyspOwotICAgIGlmIChkKSByZXR1cm4gZDsKLSAgfQotICByZXR1cm4gMDsKLX0KLQotLy8gVGhlIHN0YW5kYXJkIG1lbWNweSBvcGVyYXRpb24gaXMgc2xvdyBmb3IgdmFyaWFibGUgc21hbGwgc2l6ZXMuCi0vLyBUaGlzIGltcGxlbWVudGF0aW9uIGlubGluZXMgdGhlIG9wdGltYWwgcmVhbGl6YXRpb24gZm9yIHNpemVzIDEgdG8gMTYuCi0vLyBUbyBhdm9pZCBjb2RlIGJsb2F0IGRvbid0IHVzZSBpdCBpbiBjYXNlIG9mIG5vdCBwZXJmb3JtYW5jZS1jcml0aWNhbCBzcG90cywKLS8vIG5vciB3aGVuIHlvdSBkb24ndCBleHBlY3QgdmVyeSBmcmVxdWVudCB2YWx1ZXMgb2Ygc2l6ZSA8PSAxNi4KLWlubGluZSB2b2lkIG1lbWNweV9pbmxpbmVkKGNoYXIgKmRzdCwgY29uc3QgY2hhciAqc3JjLCBzaXplX3Qgc2l6ZSkgewotICAvLyBDb21waWxlciBpbmxpbmVzIGNvZGUgd2l0aCBtaW5pbWFsIGFtb3VudCBvZiBkYXRhIG1vdmVtZW50IHdoZW4gdGhpcmQKLSAgLy8gcGFyYW1ldGVyIG9mIG1lbWNweSBpcyBhIGNvbnN0YW50LgotICBzd2l0Y2ggKHNpemUpIHsKLSAgICBjYXNlICAxOiBtZW1jcHkoZHN0LCBzcmMsIDEpOyBicmVhazsKLSAgICBjYXNlICAyOiBtZW1jcHkoZHN0LCBzcmMsIDIpOyBicmVhazsKLSAgICBjYXNlICAzOiBtZW1jcHkoZHN0LCBzcmMsIDMpOyBicmVhazsKLSAgICBjYXNlICA0OiBtZW1jcHkoZHN0LCBzcmMsIDQpOyBicmVhazsKLSAgICBjYXNlICA1OiBtZW1jcHkoZHN0LCBzcmMsIDUpOyBicmVhazsKLSAgICBjYXNlICA2OiBtZW1jcHkoZHN0LCBzcmMsIDYpOyBicmVhazsKLSAgICBjYXNlICA3OiBtZW1jcHkoZHN0LCBzcmMsIDcpOyBicmVhazsKLSAgICBjYXNlICA4OiBtZW1jcHkoZHN0LCBzcmMsIDgpOyBicmVhazsKLSAgICBjYXNlICA5OiBtZW1jcHkoZHN0LCBzcmMsIDkpOyBicmVhazsKLSAgICBjYXNlIDEwOiBtZW1jcHkoZHN0LCBzcmMsIDEwKTsgYnJlYWs7Ci0gICAgY2FzZSAxMTogbWVtY3B5KGRzdCwgc3JjLCAxMSk7IGJyZWFrOwotICAgIGNhc2UgMTI6IG1lbWNweShkc3QsIHNyYywgMTIpOyBicmVhazsKLSAgICBjYXNlIDEzOiBtZW1jcHkoZHN0LCBzcmMsIDEzKTsgYnJlYWs7Ci0gICAgY2FzZSAxNDogbWVtY3B5KGRzdCwgc3JjLCAxNCk7IGJyZWFrOwotICAgIGNhc2UgMTU6IG1lbWNweShkc3QsIHNyYywgMTUpOyBicmVhazsKLSAgICBjYXNlIDE2OiBtZW1jcHkoZHN0LCBzcmMsIDE2KTsgYnJlYWs7Ci0gICAgZGVmYXVsdDogbWVtY3B5KGRzdCwgc3JjLCBzaXplKTsgYnJlYWs7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfRkFTVE1FTV9IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGVhYzdkNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaAorKysgL2Rldi9udWxsCkBAIC0xLDQzOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8KLS8vIERlYWxzIHdpdGggdGhlIGZhY3QgdGhhdCBoYXNoX21hcCBpcyBub3QgZGVmaW5lZCBldmVyeXdoZXJlLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19IQVNIX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfSEFTSF9IX18KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFWRV9IQVNIX01BUCAxCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVZFX0hBU0hfU0VUIDEKLQotLy8gQW5kcm9pZAotI2lmIGRlZmluZWQoX19BTkRST0lEX18pCi0jIHVuZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVZFX0hBU0hfTUFQCi0jIHVuZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVZFX0hBU0hfTUFQCi0KLS8vIFVzZSBDKysxMSB1bm9yZGVyZWRfe21hcHxzZXR9IGlmIGF2YWlsYWJsZS4KLSNlbGlmICgoX0xJQkNQUF9TVERfVkVSID49IDExKSB8fCBcCi0gICAgICAoKChfX2NwbHVzcGx1cyA+PSAyMDExMDNMKSB8fCBkZWZpbmVkKF9fR1hYX0VYUEVSSU1FTlRBTF9DWFgwWCkpICYmIFwKLSAgICAgIChfX0dMSUJDWFhfXyA+IDIwMDkwNDIxKSkpCi0jIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTX0NYWDExX0hBU0gKLQotLy8gRm9yIFhDb2RlID49IDQuNjogIHRoZSBjb21waWxlciBpcyBjbGFuZyB3aXRoIGxpYmMrKy4KLS8vIEZvciBlYXJsaWVyIFhDb2RlIHZlcnNpb246IHRoZSBjb21waWxlciBpcyBnY2MtNC4yLjEgd2l0aCBsaWJzdGRjKysuCi0vLyBsaWJjKysgcHJvdmlkZXMgPHVub3JkZXJlZF9tYXA+IGFuZCBmcmllbmRzIGV2ZW4gaW4gbm9uIEMrKzExIG1vZGUsCi0vLyBhbmQgaXQgZG9lcyBub3QgcHJvdmlkZSB0aGUgdHIxIGxpYnJhcnkuIFRoZXJlZm9yZSB0aGUgZm9sbG93aW5nIG1hY3JvCi0vLyBjaGVja3MgYWdhaW5zdCB0aGlzIHNwZWNpYWwgY2FzZS4KLS8vIE5vdGUgdGhhdCB3ZSBzaG91bGQgbm90IHRlc3QgdGhlIF9fQVBQTEVfQ0NfXyB2ZXJzaW9uIG51bWJlciBvciB0aGUKLS8vIF9fY2xhbmdfXyBtYWNybywgc2luY2UgdGhlIG5ldyBjb21waWxlciBjYW4gc3RpbGwgdXNlIC1zdGRsaWI9bGlic3RkYysrLCBpbgotLy8gd2hpY2ggY2FzZSA8dW5vcmRlcmVkX21hcD4gaXMgbm90IGNvbXBpbGFibGUgd2l0aG91dCAtc3RkPWMrKzExCi0jZWxpZiBkZWZpbmVkKF9fQVBQTEVfQ0NfXykKLSMgaWYgX19HTlVDX18gPj0gNAotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfVFIxCi0jIGVsc2UKLS8vIE5vdCB0ZXN0ZWQgZm9yIGdjYyA8IDQuLi4gVGhlc2Ugc2V0dGluZyBjYW4gY29tcGlsZSB1bmRlciA0LjIuMSB0aG91Z2guCi0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFIF9fZ251X2N4eAotIyAgaW5jbHVkZSA8ZXh0L2hhc2hfbWFwPgotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUyBoYXNoX21hcAotIyAgaW5jbHVkZSA8ZXh0L2hhc2hfc2V0PgotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUyBoYXNoX3NldAotIyBlbmRpZgotCi0vLyBWZXJzaW9uIGNoZWNrcyBmb3IgZ2NjLgotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLS8vIEZvciBHQ0MgNC54KywgdXNlIHRyMTo6dW5vcmRlcmVkX21hcC9zZXQ7IG90aGVyd2lzZSwgZm9sbG93IHRoZQotLy8gaW5zdHJ1Y3Rpb25zIGZyb206Ci0vLyBodHRwczovL2djYy5nbnUub3JnL29ubGluZWRvY3MvbGlic3RkYysrL21hbnVhbC9iYWNrd2FyZHMuaHRtbAotIyBpZiBfX0dOVUNfXyA+PSA0Ci0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU19UUjEKLSMgZWxpZiBfX0dOVUNfXyA+PSAzCi0jICBpbmNsdWRlIDxiYWNrd2FyZC9oYXNoX21hcD4KLSMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1MgaGFzaF9tYXAKLSMgIGluY2x1ZGUgPGJhY2t3YXJkL2hhc2hfc2V0PgotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUyBoYXNoX3NldAotIyAgaWYgX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA9PSAwCi0jICAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRSBzdGQgICAgICAgLy8gR0NDIDMuMAotIyAgZWxzZQotIyAgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0UgX19nbnVfY3h4IC8vIEdDQyAzLjEgYW5kIGxhdGVyCi0jICBlbmRpZgotIyBlbHNlCi0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFCi0jICBpbmNsdWRlIDxoYXNoX21hcD4KLSMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1MgaGFzaF9tYXAKLSMgIGluY2x1ZGUgPGhhc2hfc2V0PgotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUyBoYXNoX3NldAotIyBlbmRpZgotCi0vLyBWZXJzaW9uIGNoZWNrcyBmb3IgTVNDLgotLy8gQXBwYXJlbnRseSBNaWNyb3NvZnQgZGVjaWRlZCB0byBtb3ZlIGhhc2hfbWFwICpiYWNrKiB0byB0aGUgc3RkIG5hbWVzcGFjZSBpbgotLy8gTVNWQyAyMDEwOgotLy8gaHR0cDovL2Jsb2dzLm1zZG4uY29tL3ZjYmxvZy9hcmNoaXZlLzIwMDkvMDUvMjUvc3RsLWJyZWFraW5nLWNoYW5nZXMtaW4tdmlzdWFsLXN0dWRpby0yMDEwLWJldGEtMS5hc3B4Ci0vLyBBbmQuLiB0aGV5IGFyZSBtb3ZlZCBiYWNrIHRvIHN0ZGV4dCBpbiBNU1ZDIDIwMTMgKGhhdmVuJ3QgY2hlY2tlZCAyMDEyKS4gVGhhdAotLy8gc2FpZCwgdXNlIHVub3JkZXJlZF9tYXAgZm9yIE1TVkMgMjAxMCBhbmQgYmV5b25kIGlzIG91ciBzYWZlc3QgYmV0LgotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKLSMgaWYgX01TQ19WRVIgPj0gMTYwMCAgLy8gU2luY2UgVmlzdWFsIFN0dWRpbyAyMDEwCi0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU19DWFgxMV9IQVNICi0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfQ09NUEFSRSBzdGQ6Omhhc2hfY29tcGFyZQotIyBlbGlmIF9NU0NfVkVSID49IDE1MDAgIC8vIFNpbmNlIFZpc3VhbCBTdHVkaW8gMjAwOAotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRSBzdGRleHQKLSMgIGluY2x1ZGUgPGhhc2hfbWFwPgotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUyBoYXNoX21hcAotIyAgaW5jbHVkZSA8aGFzaF9zZXQ+Ci0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfU0VUX0NMQVNTIGhhc2hfc2V0Ci0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfQ09NUEFSRSBzdGRleHQ6Omhhc2hfY29tcGFyZQotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT05UQUlORVJTX05FRURfSEFTSF9DT01QQVJFCi0jIGVsaWYgX01TQ19WRVIgPj0gMTMxMAotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRSBzdGRleHQKLSMgIGluY2x1ZGUgPGhhc2hfbWFwPgotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUyBoYXNoX21hcAotIyAgaW5jbHVkZSA8aGFzaF9zZXQ+Ci0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfU0VUX0NMQVNTIGhhc2hfc2V0Ci0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfQ09NUEFSRSBzdGRleHQ6Omhhc2hfY29tcGFyZQotIyBlbHNlCi0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFIHN0ZAotIyAgaW5jbHVkZSA8aGFzaF9tYXA+Ci0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTIGhhc2hfbWFwCi0jICBpbmNsdWRlIDxoYXNoX3NldD4KLSMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9TRVRfQ0xBU1MgaGFzaF9zZXQKLSMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9DT01QQVJFIHN0ZGV4dDo6aGFzaF9jb21wYXJlCi0jIGVuZGlmCi0KLS8vICoqQUREIE5FVyBDT01QSUxFUlMgU1VQUE9SVCBIRVJFLioqCi0vLyBGb3Igb3RoZXIgY29tcGlsZXJzLCB1bmRlZmluZSB0aGUgbWFjcm8gYW5kIGZhbGxiYWNrIHRvIHVzZSBzdGQ6Om1hcCwgaW4KLS8vIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmgKLSNlbHNlCi0jIHVuZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVZFX0hBU0hfTUFQCi0jIHVuZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVZFX0hBU0hfU0VUCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0hBU19DWFgxMV9IQVNIKQotIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFIHN0ZAotIyBpbmNsdWRlIDx1bm9yZGVyZWRfbWFwPgotIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTIHVub3JkZXJlZF9tYXAKLSMgaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KLSMgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUyB1bm9yZGVyZWRfc2V0Ci0jZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9IQVNfVFIxKQotIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFIHN0ZDo6dHIxCi0jIGluY2x1ZGUgPHRyMS91bm9yZGVyZWRfbWFwPgotIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTIHVub3JkZXJlZF9tYXAKLSMgaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9zZXQ+Ci0jIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9TRVRfQ0xBU1MgdW5vcmRlcmVkX3NldAotI2VuZGlmCi0KLSMgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRV9ERUNMQVJBVElPTl9TVEFSVCBcCi0gIG5hbWVzcGFjZSBnb29nbGUgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBuYW1lc3BhY2UgcHJvdG9idWYgewotIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX0VORCB9fQotCi0jdW5kZWYgR09PR0xFX1BST1RPQlVGX0hBU19DWFgxMV9IQVNICi0jdW5kZWYgR09PR0xFX1BST1RPQlVGX0hBU19UUjEKLQotI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0hBVkVfSEFTSF9NQVApICYmIFwKLSAgICBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9IQVZFX0hBU0hfU0VUKQotI2Vsc2UKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01JU1NJTkdfSEFTSAotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzZXQ+Ci0jZW5kaWYKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0jaWZkZWYgR09PR0xFX1BST1RPQlVGX01JU1NJTkdfSEFTSAotI3VuZGVmIEdPT0dMRV9QUk9UT0JVRl9NSVNTSU5HX0hBU0gKLQotLy8gVGhpcyBzeXN0ZW0gZG9lc24ndCBoYXZlIGhhc2hfbWFwIG9yIGhhc2hfc2V0LiAgRW11bGF0ZSB0aGVtIHVzaW5nIG1hcCBhbmQKLS8vIHNldC4KLQotLy8gTWFrZSBoYXNoPFQ+IGJlIHRoZSBzYW1lIGFzIGxlc3M8VD4uICBOb3RlIHRoYXQgZXZlcnl3aGVyZSB3aGVyZSBjdXN0b20KLS8vIGhhc2ggZnVuY3Rpb25zIGFyZSBkZWZpbmVkIGluIHRoZSBwcm90b2J1ZiBjb2RlLCB0aGV5IGFyZSBhbHNvIGRlZmluZWQgc3VjaAotLy8gdGhhdCB0aGV5IGNhbiBiZSB1c2VkIGFzICJsZXNzIiBmdW5jdGlvbnMsIHdoaWNoIGlzIHJlcXVpcmVkIGJ5IE1TVkMgYW55d2F5LgotdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KLXN0cnVjdCBoYXNoIHsKLSAgLy8gRHVtbXksIGp1c3QgdG8gbWFrZSBkZXJpdmF0aXZlIGhhc2ggZnVuY3Rpb25zIGNvbXBpbGUuCi0gIGludCBvcGVyYXRvcigpKGNvbnN0IEtleSYga2V5KSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgS2V5JiBhLCBjb25zdCBLZXkmIGIpIGNvbnN0IHsKLSAgICByZXR1cm4gYSA8IGI7Ci0gIH0KLX07Ci0KLS8vIE1ha2Ugc3VyZSBjaGFyKiBpcyBjb21wYXJlZCBieSB2YWx1ZS4KLXRlbXBsYXRlIDw+Ci1zdHJ1Y3QgaGFzaDxjb25zdCBjaGFyKj4gewotICAvLyBEdW1teSwganVzdCB0byBtYWtlIGRlcml2YXRpdmUgaGFzaCBmdW5jdGlvbnMgY29tcGlsZS4KLSAgaW50IG9wZXJhdG9yKCkoY29uc3QgY2hhcioga2V5KSB7Ci0gICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNob3VsZCBuZXZlciBiZSBjYWxsZWQuIjsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogYSwgY29uc3QgY2hhciogYikgY29uc3QgewotICAgIHJldHVybiBzdHJjbXAoYSwgYikgPCAwOwotICB9Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBEYXRhLAotICAgICAgICAgIHR5cGVuYW1lIEhhc2hGY24gPSBoYXNoPEtleT4sCi0gICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBzdGQ6OmVxdWFsX3RvPEtleT4sCi0gICAgICAgICAgdHlwZW5hbWUgQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgc3RkOjpwYWlyPGNvbnN0IEtleSwgRGF0YT4gPiA+Ci1jbGFzcyBoYXNoX21hcCA6IHB1YmxpYyBzdGQ6Om1hcDxLZXksIERhdGEsIEhhc2hGY24sIEFsbG9jPiB7Ci0gIHR5cGVkZWYgc3RkOjptYXA8S2V5LCBEYXRhLCBIYXNoRmNuLCBBbGxvYz4gQmFzZUNsYXNzOwotCi0gcHVibGljOgotICBoYXNoX21hcChpbnQgYSA9IDAsIGNvbnN0IEhhc2hGY24mIGIgPSBIYXNoRmNuKCksCi0gICAgICAgICAgIGNvbnN0IEVxdWFsS2V5JiBjID0gRXF1YWxLZXkoKSwKLSAgICAgICAgICAgY29uc3QgQWxsb2MmIGQgPSBBbGxvYygpKSA6IEJhc2VDbGFzcyhiLCBkKSB7fQotCi0gIEhhc2hGY24gaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hGY24oKTsgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwKLSAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+ID4KLWNsYXNzIGhhc2hfc2V0IDogcHVibGljIHN0ZDo6c2V0PEtleSwgSGFzaEZjbj4gewotIHB1YmxpYzoKLSAgaGFzaF9zZXQoaW50ID0gMCkge30KLQotICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KLX07Ci0KLSNlbGlmIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9TVExQT1JUX1ZFUlNJT04pCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+Ci1zdHJ1Y3QgaGFzaCA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9DT01QQVJFPEtleT4gewotfTsKLQotLy8gTVNWQydzIGhhc2hfY29tcGFyZTxjb25zdCBjaGFyKj4gaGFzaGVzIGJhc2VkIG9uIHRoZSBzdHJpbmcgY29udGVudHMgYnV0Ci0vLyBjb21wYXJlcyBiYXNlZCBvbiB0aGUgc3RyaW5nIHBvaW50ZXIuICBXVEY/Ci1jbGFzcyBDc3RyaW5nTGVzcyB7Ci0gcHVibGljOgotICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGEsIGNvbnN0IGNoYXIqIGIpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RyY21wKGEsIGIpIDwgMDsKLSAgfQotfTsKLQotdGVtcGxhdGUgPD4KLXN0cnVjdCBoYXNoPGNvbnN0IGNoYXIqPgotICAgIDogcHVibGljIEdPT0dMRV9QUk9UT0JVRl9IQVNIX0NPTVBBUkU8Y29uc3QgY2hhciosIENzdHJpbmdMZXNzPiB7fTsKLQotI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9DT05UQUlORVJTX05FRURfSEFTSF9DT01QQVJFCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hGY24sIHR5cGVuYW1lIEVxdWFsS2V5Pgotc3RydWN0IEludGVybmFsSGFzaENvbXBhcmUgOiBwdWJsaWMgR09PR0xFX1BST1RPQlVGX0hBU0hfQ09NUEFSRTxLZXk+IHsKLSAgSW50ZXJuYWxIYXNoQ29tcGFyZSgpIHt9Ci0gIEludGVybmFsSGFzaENvbXBhcmUoSGFzaEZjbiBoYXNoZmNuLCBFcXVhbEtleSBlcXVhbGtleSkKLSAgICAgIDogaGFzaGZjbl8oaGFzaGZjbiksIGVxdWFsa2V5XyhlcXVhbGtleSkge30KLSAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgS2V5JiBrZXkpIGNvbnN0IHsgcmV0dXJuIGhhc2hmY25fKGtleSk7IH0KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEtleSYga2V5MSwgY29uc3QgS2V5JiBrZXkyKSBjb25zdCB7Ci0gICAgcmV0dXJuICFlcXVhbGtleV8oa2V5MSwga2V5Mik7Ci0gIH0KLSAgSGFzaEZjbiBoYXNoZmNuXzsKLSAgRXF1YWxLZXkgZXF1YWxrZXlfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKLSAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEFsbG9jID0gc3RkOjphbGxvY2F0b3I8IHN0ZDo6cGFpcjxjb25zdCBLZXksIERhdGE+ID4gPgotY2xhc3MgaGFzaF9tYXAKLSAgICA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6OkdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUzwKLSAgICAgICAgICBLZXksIERhdGEsIEludGVybmFsSGFzaENvbXBhcmU8S2V5LCBIYXNoRmNuLCBFcXVhbEtleT4sIEFsbG9jPiB7Ci0gIHR5cGVkZWYgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFOjpHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1M8Ci0gICAgICBLZXksIERhdGEsIEludGVybmFsSGFzaENvbXBhcmU8S2V5LCBIYXNoRmNuLCBFcXVhbEtleT4sIEFsbG9jPiBCYXNlQ2xhc3M7Ci0KLSBwdWJsaWM6Ci0gIGhhc2hfbWFwKGludCBhID0gMCwgY29uc3QgSGFzaEZjbiYgYiA9IEhhc2hGY24oKSwKLSAgICAgICAgICAgY29uc3QgRXF1YWxLZXkmIGMgPSBFcXVhbEtleSgpLCBjb25zdCBBbGxvYyYgZCA9IEFsbG9jKCkpCi0gICAgICA6IEJhc2VDbGFzcyhJbnRlcm5hbEhhc2hDb21wYXJlPEtleSwgSGFzaEZjbiwgRXF1YWxLZXk+KGIsIGMpLCBkKSB7fQotCi0gIEhhc2hGY24gaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hGY24oKTsgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaEZjbiA9IGhhc2g8S2V5PiwKLSAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IHN0ZDo6ZXF1YWxfdG88S2V5PiA+Ci1jbGFzcyBoYXNoX3NldAotICAgIDogcHVibGljIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRTo6R09PR0xFX1BST1RPQlVGX0hBU0hfU0VUX0NMQVNTPAotICAgICAgICAgIEtleSwgSW50ZXJuYWxIYXNoQ29tcGFyZTxLZXksIEhhc2hGY24sIEVxdWFsS2V5PiA+IHsKLSBwdWJsaWM6Ci0gIGhhc2hfc2V0KGludCA9IDApIHt9Ci0KLSAgSGFzaEZjbiBoYXNoX2Z1bmN0aW9uKCkgY29uc3QgeyByZXR1cm4gSGFzaEZjbigpOyB9Ci19OwotCi0jZWxzZSAgLy8gR09PR0xFX1BST1RPQlVGX0NPTlRBSU5FUlNfTkVFRF9IQVNIX0NPTVBBUkUKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKLSAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEFsbG9jID0gc3RkOjphbGxvY2F0b3I8IHN0ZDo6cGFpcjxjb25zdCBLZXksIERhdGE+ID4gPgotY2xhc3MgaGFzaF9tYXAKLSAgICA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6OkdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUzwKLSAgICAgICAgICBLZXksIERhdGEsIEhhc2hGY24sIEVxdWFsS2V5LCBBbGxvYz4gewotICB0eXBlZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRTo6R09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTPAotICAgICAgS2V5LCBEYXRhLCBIYXNoRmNuLCBFcXVhbEtleSwgQWxsb2M+IEJhc2VDbGFzczsKLQotIHB1YmxpYzoKLSAgaGFzaF9tYXAoaW50IGEgPSAwLCBjb25zdCBIYXNoRmNuJiBiID0gSGFzaEZjbigpLAotICAgICAgICAgICBjb25zdCBFcXVhbEtleSYgYyA9IEVxdWFsS2V5KCksCi0gICAgICAgICAgIGNvbnN0IEFsbG9jJiBkID0gQWxsb2MoKSkgOiBCYXNlQ2xhc3MoYSwgYiwgYywgZCkge30KLQotICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hGY24gPSBoYXNoPEtleT4sCi0gICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBzdGQ6OmVxdWFsX3RvPEtleT4gPgotY2xhc3MgaGFzaF9zZXQKLSAgICA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6OkdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUzwKLSAgICAgICAgICBLZXksIEhhc2hGY24sIEVxdWFsS2V5PiB7Ci0gcHVibGljOgotICBoYXNoX3NldChpbnQgPSAwKSB7fQotCi0gIEhhc2hGY24gaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hGY24oKTsgfQotfTsKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0NPTlRBSU5FUlNfTkVFRF9IQVNIX0NPTVBBUkUKLQotI2Vsc2UgIC8vIGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9TVExQT1JUX1ZFUlNJT04pCi0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXk+Ci1zdHJ1Y3QgaGFzaCA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6Omhhc2g8S2V5PiB7Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgotc3RydWN0IGhhc2g8Y29uc3QgS2V5Kj4gewotICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgS2V5KiBrZXkpIGNvbnN0IHsKLSAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxzaXplX3Q+KGtleSk7Ci0gIH0KLX07Ci0KLS8vIFVubGlrZSB0aGUgb2xkIFNHSSB2ZXJzaW9uLCB0aGUgVFIxICJoYXNoIiBkb2VzIG5vdCBzcGVjaWFsLWNhc2UgY2hhciouICBTbywKLS8vIHdlIGdvIGFoZWFkIGFuZCBwcm92aWRlIG91ciBvd24gaW1wbGVtZW50YXRpb24uCi10ZW1wbGF0ZSA8Pgotc3RydWN0IGhhc2g8Y29uc3QgY2hhcio+IHsKLSAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIHN0cikgY29uc3QgewotICAgIHNpemVfdCByZXN1bHQgPSAwOwotICAgIGZvciAoOyAqc3RyICE9ICdcMCc7IHN0cisrKSB7Ci0gICAgICByZXN1bHQgPSA1ICogcmVzdWx0ICsgKnN0cjsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfTsKLQotdGVtcGxhdGU8Pgotc3RydWN0IGhhc2g8Ym9vbD4gewotICBzaXplX3Qgb3BlcmF0b3IoKShib29sIHgpIGNvbnN0IHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pih4KTsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKLSAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEFsbG9jID0gc3RkOjphbGxvY2F0b3I8IHN0ZDo6cGFpcjxjb25zdCBLZXksIERhdGE+ID4gPgotY2xhc3MgaGFzaF9tYXAKLSAgICA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6OkdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUzwKLSAgICAgICAgICBLZXksIERhdGEsIEhhc2hGY24sIEVxdWFsS2V5LCBBbGxvYz4gewotICB0eXBlZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRTo6R09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTPAotICAgICAgS2V5LCBEYXRhLCBIYXNoRmNuLCBFcXVhbEtleSwgQWxsb2M+IEJhc2VDbGFzczsKLQotIHB1YmxpYzoKLSAgaGFzaF9tYXAoaW50IGEgPSAwLCBjb25zdCBIYXNoRmNuJiBiID0gSGFzaEZjbigpLAotICAgICAgICAgICBjb25zdCBFcXVhbEtleSYgYyA9IEVxdWFsS2V5KCksCi0gICAgICAgICAgIGNvbnN0IEFsbG9jJiBkID0gQWxsb2MoKSkgOiBCYXNlQ2xhc3MoYSwgYiwgYywgZCkge30KLQotICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hGY24gPSBoYXNoPEtleT4sCi0gICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBzdGQ6OmVxdWFsX3RvPEtleT4gPgotY2xhc3MgaGFzaF9zZXQKLSAgICA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6OkdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUzwKLSAgICAgICAgICBLZXksIEhhc2hGY24sIEVxdWFsS2V5PiB7Ci0gcHVibGljOgotICBoYXNoX3NldChpbnQgPSAwKSB7fQotCi0gIEhhc2hGY24gaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hGY24oKTsgfQotfTsKLQotI2VuZGlmICAvLyAhR09PR0xFX1BST1RPQlVGX01JU1NJTkdfSEFTSAotCi10ZW1wbGF0ZSA8Pgotc3RydWN0IGhhc2g8c3RyaW5nPiB7Ci0gIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewotICAgIHJldHVybiBoYXNoPGNvbnN0IGNoYXIqPigpKGtleS5jX3N0cigpKTsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcmIGEsIGNvbnN0IHN0cmluZyYgYikgY29uc3QgewotICAgIHJldHVybiBhIDwgYjsKLSAgfQotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEZpcnN0LCB0eXBlbmFtZSBTZWNvbmQ+Ci1zdHJ1Y3QgaGFzaDxwYWlyPEZpcnN0LCBTZWNvbmQ+ID4gewotICBpbmxpbmUgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgcGFpcjxGaXJzdCwgU2Vjb25kPiYga2V5KSBjb25zdCB7Ci0gICAgc2l6ZV90IGZpcnN0X2hhc2ggPSBoYXNoPEZpcnN0PigpKGtleS5maXJzdCk7Ci0gICAgc2l6ZV90IHNlY29uZF9oYXNoID0gaGFzaDxTZWNvbmQ+KCkoa2V5LnNlY29uZCk7Ci0KLSAgICAvLyBGSVhNRShrZW50b24pOiAgV2hhdCBpcyB0aGUgYmVzdCB3YXkgdG8gY29tcHV0ZSB0aGlzIGhhc2g/ICBJIGhhdmUKLSAgICAvLyBubyBpZGVhISAgVGhpcyBzZWVtcyBhIGJpdCBiZXR0ZXIgdGhhbiBhbiBYT1IuCi0gICAgcmV0dXJuIGZpcnN0X2hhc2ggKiAoKDEgPDwgMTYpIC0gMSkgKyBzZWNvbmRfaGFzaDsKLSAgfQotCi0gIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OwotICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKLSAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBwYWlyPEZpcnN0LCBTZWNvbmQ+JiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgcGFpcjxGaXJzdCwgU2Vjb25kPiYgYikgY29uc3QgewotICAgIHJldHVybiBhIDwgYjsKLSAgfQotfTsKLQotLy8gVXNlZCBieSBHQ0MvU0dJIFNUTCBvbmx5LiAgKFdoeSBpc24ndCB0aGlzIHByb3ZpZGVkIGJ5IHRoZSBzdGFuZGFyZAotLy8gbGlicmFyeT8gIDooICkKLXN0cnVjdCBzdHJlcSB7Ci0gIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgY2hhciogYSwgY29uc3QgY2hhciogYikgY29uc3QgewotICAgIHJldHVybiBzdHJjbXAoYSwgYikgPT0gMDsKLSAgfQotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX0hBU0hfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aGxpbWl0cy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOTg0Njk0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aGxpbWl0cy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjc5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBbGwgUmlnaHRzIFJlc2VydmVkLgotLy8KLS8vIEF1dGhvcjogTWF4aW0gTGlmYW50c2V2Ci0vLwotLy8gVXNlZnVsIGludGVnZXIgYW5kIGZsb2F0aW5nIHBvaW50IGxpbWl0cyBhbmQgdHlwZSB0cmFpdHMuCi0vLwotLy8gVGhpcyBwYXJ0aWFsbHkgcmVwbGFjZXMvZHVwbGljdGVzIG51bWVyaWNfbGltaXRzPD4gZnJvbSA8bGltaXRzPi4KLS8vIFdlIGdldCBhIEdvb2dsZS1zdHlsZSBjbGFzcyB0aGF0IHdlIGhhdmUgYSBncmVhdGVyIGNvbnRyb2wgb3ZlcgotLy8gYW5kIHRodXMgY2FuIGFkZCBuZXcgZmVhdHVyZXMgdG8gaXQgb3IgZml4IHdoYXRldmVyIGhhcHBlbnMgdG8gYmUgYnJva2VuIGluCi0vLyBudW1lcmljX2xpbWl0cyBmb3IgdGhlIGNvbXBpbGVycyB3ZSB1c2UuCi0vLwotCi0jaWZuZGVmIFVUSUxfTUFUSF9NQVRITElNSVRTX0hfXwotI2RlZmluZSBVVElMX01BVEhfTUFUSExJTUlUU19IX18KLQotLy8gPG1hdGguaD4gbGFja3MgYSBsb3Qgb2YgcHJvdG90eXBlcy4gSG93ZXZlciwgdGhpcyBmaWxlIG5lZWRzIDxtYXRoLmg+IHRvCi0vLyBhY2Nlc3Mgb2xkLWZhc2hpb25lZCBpc2luZiBldCBhbC4gRXZlbiB3b3JzZSBtb3JlOiB0aGlzIGZpbGUgbXVzdCBub3QKLS8vIGluY2x1ZGUgPGNtYXRoPiBiZWNhdXNlIHRoYXQgYnJlYWtzIHRoZSBkZWZpbml0aW9uIG9mIGlzaW5mIHdpdGggZ2NjIDQuOS4KLS8vCi0vLyBUT0RPKG1lYyk6IGFmdGVyIEMrKzExIGV2ZXJ5d2hlcmUsIHVzZSA8Y21hdGg+IGFuZCBzdGQ6OmlzaW5mIGluIHRoaXMgZmlsZS4KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0KLSNpbmNsdWRlIDxjZmxvYXQ+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KLQotLy8gVXNlZnVsIGludGVnZXIgYW5kIGZsb2F0aW5nIHBvaW50IGxpbWl0cyBhbmQgdHlwZSB0cmFpdHMuCi0vLyBUaGlzIGlzIGp1c3QgZm9yIHRoZSBkb2N1bWVudGF0aW9uOwotLy8gcmVhbCBtZW1iZXJzIGFyZSBkZWZpbmVkIGluIG91ciBzcGVjaWFsaXphdGlvbnMgYmVsb3cuCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci10ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgTWF0aExpbWl0cyB7Ci0gIC8vIFR5cGUgbmFtZS4KLSAgdHlwZWRlZiBUIFR5cGU7Ci0gIC8vIFVuc2lnbmVkIHZlcnNpb24gb2YgdGhlIFR5cGUgd2l0aCB0aGUgc2FtZSBieXRlIHNpemUuCi0gIC8vIFNhbWUgYXMgVHlwZSBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kIHVuc2lnbmVkIHR5cGVzLgotICB0eXBlZGVmIFQgVW5zaWduZWRUeXBlOwotICAvLyBJZiB0aGUgdHlwZSBzdXBwb3J0cyBuZWdhdGl2ZSB2YWx1ZXMuCi0gIHN0YXRpYyBjb25zdCBib29sIGtJc1NpZ25lZDsKLSAgLy8gSWYgdGhlIHR5cGUgc3VwcG9ydHMgb25seSBpbnRlZ2VyIHZhbHVlcy4KLSAgc3RhdGljIGNvbnN0IGJvb2wga0lzSW50ZWdlcjsKLSAgLy8gTWFnbml0dWRlLXdpc2Ugc21hbGxlc3QgcmVwcmVzZW50YWJsZSBwb3NpdGl2ZSB2YWx1ZS4KLSAgc3RhdGljIGNvbnN0IFR5cGUga1Bvc01pbjsKLSAgLy8gTWFnbml0dWRlLXdpc2UgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHBvc2l0aXZlIHZhbHVlLgotICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWF4OwotICAvLyBTbWFsbGVzdCByZXByZXNlbnRhYmxlIHZhbHVlLgotICBzdGF0aWMgY29uc3QgVHlwZSBrTWluOwotICAvLyBMYXJnZXN0IHJlcHJlc2VudGFibGUgdmFsdWUuCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtNYXg7Ci0gIC8vIE1hZ25pdHVkZS13aXNlIHNtYWxsZXN0IHJlcHJlc2VudGFibGUgbmVnYXRpdmUgdmFsdWUuCi0gIC8vIFByZXNlbnQgb25seSBpZiBrSXNTaWduZWQuCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtOZWdNaW47Ci0gIC8vIE1hZ25pdHVkZS13aXNlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBuZWdhdGl2ZSB2YWx1ZS4KLSAgLy8gUHJlc2VudCBvbmx5IGlmIGtJc1NpZ25lZC4KLSAgc3RhdGljIGNvbnN0IFR5cGUga05lZ01heDsKLSAgLy8gU21hbGxlc3QgaW50ZWdlciB4IHN1Y2ggdGhhdCAxMF54IGlzIHJlcHJlc2VudGFibGUuCi0gIHN0YXRpYyBjb25zdCBpbnQga01pbjEwRXhwOwotICAvLyBMYXJnZXN0IGludGVnZXIgeCBzdWNoIHRoYXQgMTBeeCBpcyByZXByZXNlbnRhYmxlLgotICBzdGF0aWMgY29uc3QgaW50IGtNYXgxMEV4cDsKLSAgLy8gU21hbGxlc3QgcG9zaXRpdmUgdmFsdWUgc3VjaCB0aGF0IFR5cGUoMSkgKyBrRXBzaWxvbiAhPSBUeXBlKDEpCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtFcHNpbG9uOwotICAvLyBUeXBpY2FsIHJvdW5kaW5nIGVycm9yIHRoYXQgaXMgZW5vdWdoIHRvIGNvdmVyCi0gIC8vIGEgZmV3IHNpbXBsZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zLgotICAvLyBTbGlnaHRseSBsYXJnZXIgdGhhbiBrRXBzaWxvbiB0byBhY2NvdW50IGZvciBhIGZldyByb3VuZGluZyBlcnJvcnMuCi0gIC8vIElzIHplcm8gaWYga0lzSW50ZWdlci4KLSAgc3RhdGljIGNvbnN0IFR5cGUga1N0ZEVycm9yOwotICAvLyBOdW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgb2YgbWFudGlzc2EgcHJlY2lzaW9uLgotICAvLyBQcmVzZW50IG9ubHkgaWYgIWtJc0ludGVnZXIuCi0gIHN0YXRpYyBjb25zdCBpbnQga1ByZWNpc2lvbkRpZ2l0czsKLSAgLy8gTm90IGEgbnVtYmVyLCBpLmUuIHJlc3VsdCBvZiAwLzAuCi0gIC8vIFByZXNlbnQgb25seSBpZiAha0lzSW50ZWdlci4KLSAgc3RhdGljIGNvbnN0IFR5cGUga05hTjsKLSAgLy8gUG9zaXRpdmUgaW5maW5pdHksIGkuZS4gcmVzdWx0IG9mIDEvMC4KLSAgLy8gUHJlc2VudCBvbmx5IGlmICFrSXNJbnRlZ2VyLgotICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zSW5mOwotICAvLyBOZWdhdGl2ZSBpbmZpbml0eSwgaS5lLiByZXN1bHQgb2YgLTEvMC4KLSAgLy8gUHJlc2VudCBvbmx5IGlmICFrSXNJbnRlZ2VyLgotICBzdGF0aWMgY29uc3QgVHlwZSBrTmVnSW5mOwotCi0gIC8vIE5PVEU6IFNwZWNpYWwgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGJlaGF2ZQotICAvLyBpbiBhIHNwZWNpYWwgKGJ1dCBtYXRoZW1hdGljYWxseS1sb2dpY2FsKSB3YXkKLSAgLy8gaW4gdGVybXMgb2YgKGluKWVxdWFsdHkgY29tcGFyaXNvbiBhbmQgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMKLSAgLy8gLS0gc2VlIG91dCB1bml0dGVzdCBmb3IgZXhhbXBsZXMuCi0KLSAgLy8gU3BlY2lhbCBmbG9hdGluZyBwb2ludCB2YWx1ZSB0ZXN0ZXJzLgotICAvLyBQcmVzZW50IGluIGludGVnZXIgdHlwZXMgZm9yIGNvbnZlbmllbmNlLgotICBzdGF0aWMgYm9vbCBJc0Zpbml0ZShjb25zdCBUeXBlIHgpOwotICBzdGF0aWMgYm9vbCBJc05hTihjb25zdCBUeXBlIHgpOwotICBzdGF0aWMgYm9vbCBJc0luZihjb25zdCBUeXBlIHgpOwotICBzdGF0aWMgYm9vbCBJc1Bvc0luZihjb25zdCBUeXBlIHgpOwotICBzdGF0aWMgYm9vbCBJc05lZ0luZihjb25zdCBUeXBlIHgpOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLwotCi0vLyBBbGwgI2RlZmluZS1zIGJlbG93IGFyZSBzaW1wbHkgdG8gcmVmYWN0b3IgdGhlIGRlY2xhcmF0aW9ucyBvZgotLy8gTWF0aExpbWl0cyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMuCi0vLyBUaGV5IGFyZSBhbGwgI3VuZGVmLWluZWQgYmVsb3cuCi0KLS8vIFRoZSBob29wLWp1bXBpbmcgaW4gKl9JTlRfKE1BWHxNSU4pIGJlbG93IGlzIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90Ci0vLyBnZXQgYW4gb3ZlcmZsb3cgd2hpbGUgY29tcHV0aW5nIHRoZSBjb25zdGFudHMuCi0KLSNkZWZpbmUgU0lHTkVEX0lOVF9NQVgoVHlwZSkgXAotICAoKChUeXBlKDEpIDw8IChzaXplb2YoVHlwZSkqOCAtIDIpKSAtIDEpICsgKFR5cGUoMSkgPDwgKHNpemVvZihUeXBlKSo4IC0gMikpKQotCi0jZGVmaW5lIFNJR05FRF9JTlRfTUlOKFR5cGUpIFwKLSAgKC0oVHlwZSgxKSA8PCAoc2l6ZW9mKFR5cGUpKjggLSAyKSkgLSAoVHlwZSgxKSA8PCAoc2l6ZW9mKFR5cGUpKjggLSAyKSkpCi0KLSNkZWZpbmUgVU5TSUdORURfSU5UX01BWChUeXBlKSBcCi0gICgoKFR5cGUoMSkgPDwgKHNpemVvZihUeXBlKSo4IC0gMSkpIC0gMSkgKyAoVHlwZSgxKSA8PCAoc2l6ZW9mKFR5cGUpKjggLSAxKSkpCi0KLS8vIENvbXBpbGUtdGltZSBzZWxlY3RlZCBsb2cxMC1yZWxhdGVkIGNvbnN0YW50cyBmb3IgaW50ZWdlciB0eXBlcy4KLSNkZWZpbmUgU0lHTkVEX01BWF8xMF9FWFAoVHlwZSkgXAotICAoc2l6ZW9mKFR5cGUpID09IDEgPyAyIDogKCBcCi0gICAgc2l6ZW9mKFR5cGUpID09IDIgPyA0IDogKCBcCi0gICAgICBzaXplb2YoVHlwZSkgPT0gNCA/IDkgOiAoIFwKLSAgICAgICAgc2l6ZW9mKFR5cGUpID09IDggPyAxOCA6IC0xKSkpKQotCi0jZGVmaW5lIFVOU0lHTkVEX01BWF8xMF9FWFAoVHlwZSkgXAotICAoc2l6ZW9mKFR5cGUpID09IDEgPyAyIDogKCBcCi0gICAgc2l6ZW9mKFR5cGUpID09IDIgPyA0IDogKCBcCi0gICAgICBzaXplb2YoVHlwZSkgPT0gNCA/IDkgOiAoIFwKLSAgICAgICAgc2l6ZW9mKFR5cGUpID09IDggPyAxOSA6IC0xKSkpKQotCi0jZGVmaW5lIERFQ0xfSU5UX0xJTUlUX0ZVTkNTIFwKLSAgc3RhdGljIGJvb2wgSXNGaW5pdGUoY29uc3QgVHlwZSAvKngqLykgeyByZXR1cm4gdHJ1ZTsgfSBcCi0gIHN0YXRpYyBib29sIElzTmFOKGNvbnN0IFR5cGUgLyp4Ki8pIHsgcmV0dXJuIGZhbHNlOyB9IFwKLSAgc3RhdGljIGJvb2wgSXNJbmYoY29uc3QgVHlwZSAvKngqLykgeyByZXR1cm4gZmFsc2U7IH0gXAotICBzdGF0aWMgYm9vbCBJc1Bvc0luZihjb25zdCBUeXBlIC8qeCovKSB7IHJldHVybiBmYWxzZTsgfSBcCi0gIHN0YXRpYyBib29sIElzTmVnSW5mKGNvbnN0IFR5cGUgLyp4Ki8pIHsgcmV0dXJuIGZhbHNlOyB9Ci0KLSNkZWZpbmUgREVDTF9TSUdORURfSU5UX0xJTUlUUyhJbnRUeXBlLCBVbnNpZ25lZEludFR5cGUpIFwKLXRlbXBsYXRlPD4gXAotc3RydWN0IExJQlBST1RPQlVGX0VYUE9SVCBNYXRoTGltaXRzPEludFR5cGU+IHsgXAotICB0eXBlZGVmIEludFR5cGUgVHlwZTsgXAotICB0eXBlZGVmIFVuc2lnbmVkSW50VHlwZSBVbnNpZ25lZFR5cGU7IFwKLSAgc3RhdGljIGNvbnN0IGJvb2wga0lzU2lnbmVkID0gdHJ1ZTsgXAotICBzdGF0aWMgY29uc3QgYm9vbCBrSXNJbnRlZ2VyID0gdHJ1ZTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWluID0gMTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWF4ID0gU0lHTkVEX0lOVF9NQVgoVHlwZSk7IFwKLSAgc3RhdGljIGNvbnN0IFR5cGUga01pbiA9IFNJR05FRF9JTlRfTUlOKFR5cGUpOyBcCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtNYXggPSBrUG9zTWF4OyBcCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtOZWdNaW4gPSAtMTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrTmVnTWF4ID0ga01pbjsgXAotICBzdGF0aWMgY29uc3QgaW50IGtNaW4xMEV4cCA9IDA7IFwKLSAgc3RhdGljIGNvbnN0IGludCBrTWF4MTBFeHAgPSBTSUdORURfTUFYXzEwX0VYUChUeXBlKTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrRXBzaWxvbiA9IDE7IFwKLSAgc3RhdGljIGNvbnN0IFR5cGUga1N0ZEVycm9yID0gMDsgXAotICBERUNMX0lOVF9MSU1JVF9GVU5DUyBcCi19OwotCi0jZGVmaW5lIERFQ0xfVU5TSUdORURfSU5UX0xJTUlUUyhJbnRUeXBlKSBcCi10ZW1wbGF0ZTw+IFwKLXN0cnVjdCBMSUJQUk9UT0JVRl9FWFBPUlQgTWF0aExpbWl0czxJbnRUeXBlPiB7IFwKLSAgdHlwZWRlZiBJbnRUeXBlIFR5cGU7IFwKLSAgdHlwZWRlZiBJbnRUeXBlIFVuc2lnbmVkVHlwZTsgXAotICBzdGF0aWMgY29uc3QgYm9vbCBrSXNTaWduZWQgPSBmYWxzZTsgXAotICBzdGF0aWMgY29uc3QgYm9vbCBrSXNJbnRlZ2VyID0gdHJ1ZTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWluID0gMTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWF4ID0gVU5TSUdORURfSU5UX01BWChUeXBlKTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrTWluID0gMDsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrTWF4ID0ga1Bvc01heDsgXAotICBzdGF0aWMgY29uc3QgaW50IGtNaW4xMEV4cCA9IDA7IFwKLSAgc3RhdGljIGNvbnN0IGludCBrTWF4MTBFeHAgPSBVTlNJR05FRF9NQVhfMTBfRVhQKFR5cGUpOyBcCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtFcHNpbG9uID0gMTsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrU3RkRXJyb3IgPSAwOyBcCi0gIERFQ0xfSU5UX0xJTUlUX0ZVTkNTIFwKLX07Ci0KLURFQ0xfU0lHTkVEX0lOVF9MSU1JVFMoc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpCi1ERUNMX1NJR05FRF9JTlRfTElNSVRTKHNpZ25lZCBzaG9ydCBpbnQsIHVuc2lnbmVkIHNob3J0IGludCkKLURFQ0xfU0lHTkVEX0lOVF9MSU1JVFMoc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQotREVDTF9TSUdORURfSU5UX0xJTUlUUyhzaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KQotREVDTF9TSUdORURfSU5UX0xJTUlUUyhzaWduZWQgbG9uZyBsb25nIGludCwgdW5zaWduZWQgbG9uZyBsb25nIGludCkKLURFQ0xfVU5TSUdORURfSU5UX0xJTUlUUyh1bnNpZ25lZCBjaGFyKQotREVDTF9VTlNJR05FRF9JTlRfTElNSVRTKHVuc2lnbmVkIHNob3J0IGludCkKLURFQ0xfVU5TSUdORURfSU5UX0xJTUlUUyh1bnNpZ25lZCBpbnQpCi1ERUNMX1VOU0lHTkVEX0lOVF9MSU1JVFModW5zaWduZWQgbG9uZyBpbnQpCi1ERUNMX1VOU0lHTkVEX0lOVF9MSU1JVFModW5zaWduZWQgbG9uZyBsb25nIGludCkKLQotI3VuZGVmIERFQ0xfU0lHTkVEX0lOVF9MSU1JVFMKLSN1bmRlZiBERUNMX1VOU0lHTkVEX0lOVF9MSU1JVFMKLSN1bmRlZiBTSUdORURfSU5UX01BWAotI3VuZGVmIFNJR05FRF9JTlRfTUlOCi0jdW5kZWYgVU5TSUdORURfSU5UX01BWAotI3VuZGVmIFNJR05FRF9NQVhfMTBfRVhQCi0jdW5kZWYgVU5TSUdORURfTUFYXzEwX0VYUAotI3VuZGVmIERFQ0xfSU5UX0xJTUlUX0ZVTkNTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KLSNpZmRlZiBXSU4zMiAgLy8gTGFja3MgYnVpbHQtaW4gaXNuYW4oKSBhbmQgaXNpbmYoKQotI2RlZmluZSBERUNMX0ZQX0xJTUlUX0ZVTkNTIFwKLSAgc3RhdGljIGJvb2wgSXNGaW5pdGUoY29uc3QgVHlwZSB4KSB7IHJldHVybiBfZmluaXRlKHgpOyB9IFwKLSAgc3RhdGljIGJvb2wgSXNOYU4oY29uc3QgVHlwZSB4KSB7IHJldHVybiBfaXNuYW4oeCk7IH0gXAotICBzdGF0aWMgYm9vbCBJc0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIChfZnBjbGFzcyh4KSAmIChfRlBDTEFTU19OSU5GIHwgX0ZQQ0xBU1NfUElORikpICE9IDA7IH0gXAotICBzdGF0aWMgYm9vbCBJc1Bvc0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIF9mcGNsYXNzKHgpID09IF9GUENMQVNTX1BJTkY7IH0gXAotICBzdGF0aWMgYm9vbCBJc05lZ0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIF9mcGNsYXNzKHgpID09IF9GUENMQVNTX05JTkY7IH0KLSNlbHNlCi0jZGVmaW5lIERFQ0xfRlBfTElNSVRfRlVOQ1MgXAotICBzdGF0aWMgYm9vbCBJc0Zpbml0ZShjb25zdCBUeXBlIHgpIHsgcmV0dXJuICFpc2luZih4KSAgJiYgICFpc25hbih4KTsgfSBcCi0gIHN0YXRpYyBib29sIElzTmFOKGNvbnN0IFR5cGUgeCkgeyByZXR1cm4gaXNuYW4oeCk7IH0gXAotICBzdGF0aWMgYm9vbCBJc0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIGlzaW5mKHgpOyB9IFwKLSAgc3RhdGljIGJvb2wgSXNQb3NJbmYoY29uc3QgVHlwZSB4KSB7IHJldHVybiBpc2luZih4KSAgJiYgIHggPiAwOyB9IFwKLSAgc3RhdGljIGJvb2wgSXNOZWdJbmYoY29uc3QgVHlwZSB4KSB7IHJldHVybiBpc2luZih4KSAgJiYgIHggPCAwOyB9Ci0jZW5kaWYKLQotLy8gV2UgY2FuJ3QgcHV0IGZsb2F0aW5nLXBvaW50IGNvbnN0YW50IHZhbHVlcyBpbiB0aGUgaGVhZGVyIGhlcmUgYmVjYXVzZQotLy8gc3VjaCBjb25zdGFudHMgYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIHByaW1pdGl2ZS10eXBlIGNvbnN0YW50cyBieSBnY2MuCi0vLyBDQVZFQVQ6IEhlbmNlLCB0aGV5IGFyZSBnb2luZyB0byBiZSBpbml0aWFsaXplZCBvbmx5IGR1cmluZwotLy8gdGhlIGdsb2JhbCBvYmplY3RzIGNvbnN0cnVjdGlvbiB0aW1lLgotI2RlZmluZSBERUNMX0ZQX0xJTUlUUyhGUF9UeXBlLCBQUkVGSVgpIFwKLXRlbXBsYXRlPD4gXAotc3RydWN0IExJQlBST1RPQlVGX0VYUE9SVCBNYXRoTGltaXRzPEZQX1R5cGU+IHsgXAotICB0eXBlZGVmIEZQX1R5cGUgVHlwZTsgXAotICB0eXBlZGVmIEZQX1R5cGUgVW5zaWduZWRUeXBlOyBcCi0gIHN0YXRpYyBjb25zdCBib29sIGtJc1NpZ25lZCA9IHRydWU7IFwKLSAgc3RhdGljIGNvbnN0IGJvb2wga0lzSW50ZWdlciA9IGZhbHNlOyBcCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtQb3NNaW47IFwKLSAgc3RhdGljIGNvbnN0IFR5cGUga1Bvc01heDsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrTWluOyBcCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtNYXg7IFwKLSAgc3RhdGljIGNvbnN0IFR5cGUga05lZ01pbjsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrTmVnTWF4OyBcCi0gIHN0YXRpYyBjb25zdCBpbnQga01pbjEwRXhwID0gUFJFRklYIyNfTUlOXzEwX0VYUDsgXAotICBzdGF0aWMgY29uc3QgaW50IGtNYXgxMEV4cCA9IFBSRUZJWCMjX01BWF8xMF9FWFA7IFwKLSAgc3RhdGljIGNvbnN0IFR5cGUga0Vwc2lsb247IFwKLSAgc3RhdGljIGNvbnN0IFR5cGUga1N0ZEVycm9yOyBcCi0gIHN0YXRpYyBjb25zdCBpbnQga1ByZWNpc2lvbkRpZ2l0cyA9IFBSRUZJWCMjX0RJRzsgXAotICBzdGF0aWMgY29uc3QgVHlwZSBrTmFOOyBcCi0gIHN0YXRpYyBjb25zdCBUeXBlIGtQb3NJbmY7IFwKLSAgc3RhdGljIGNvbnN0IFR5cGUga05lZ0luZjsgXAotICBERUNMX0ZQX0xJTUlUX0ZVTkNTIFwKLX07Ci0KLURFQ0xfRlBfTElNSVRTKGZsb2F0LCBGTFQpCi1ERUNMX0ZQX0xJTUlUUyhkb3VibGUsIERCTCkKLURFQ0xfRlBfTElNSVRTKGxvbmcgZG91YmxlLCBMREJMKQotCi0jdW5kZWYgREVDTF9GUF9MSU1JVFMKLSN1bmRlZiBERUNMX0ZQX0xJTUlUX0ZVTkNTCi0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgIC8vIFVUSUxfTUFUSF9NQVRITElNSVRTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NjY3YjQ0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDEwNiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8KLS8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9vbmNlLmgKLS8vCi0vLyBUaGlzIGhlYWRlciBpcyBpbnRlbmRlZCB0byBiZSBpbmNsdWRlZCBvbmx5IGJ5IGludGVybmFsIC5jYyBmaWxlcyBhbmQKLS8vIGdlbmVyYXRlZCAucGIuY2MgZmlsZXMuICBVc2VycyBzaG91bGQgbm90IHVzZSB0aGlzIGRpcmVjdGx5LgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2Vsc2UKLSNpbmNsdWRlIDxzY2hlZC5oPgotI2VuZGlmCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotbmFtZXNwYWNlIHsKLQotdm9pZCBTY2hlZFlpZWxkKCkgewotI2lmZGVmIF9XSU4zMgotICBTbGVlcCgwKTsKLSNlbHNlICAvLyBQT1NJWAotICBzY2hlZF95aWVsZCgpOwotI2VuZGlmCi19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi12b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKCkpIHsKLSAgaWYgKGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSkgIT0gT05DRV9TVEFURV9ET05FKSB7Ci0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTAgZnVuYyhpbml0X2Z1bmMsIGZhbHNlKTsKLSAgICBHb29nbGVPbmNlSW5pdEltcGwob25jZSwgJmZ1bmMpOwotICB9Ci19Ci0KLXZvaWQgR29vZ2xlT25jZUluaXRJbXBsKFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIENsb3N1cmUqIGNsb3N1cmUpIHsKLSAgaW50ZXJuYWw6OkF0b21pY1dvcmQgc3RhdGUgPSBpbnRlcm5hbDo6QWNxdWlyZV9Mb2FkKG9uY2UpOwotICAvLyBGYXN0IHBhdGguIFRoZSBwcm92aWRlZCBjbG9zdXJlIHdhcyBhbHJlYWR5IGV4ZWN1dGVkLgotICBpZiAoc3RhdGUgPT0gT05DRV9TVEFURV9ET05FKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIC8vIFRoZSBjbG9zdXJlIGV4ZWN1dGlvbiBkaWQgbm90IGNvbXBsZXRlIHlldC4gVGhlIG9uY2Ugb2JqZWN0IGNhbiBiZSBpbiBvbmUKLSAgLy8gb2YgdGhlIHR3byBmb2xsb3dpbmcgc3RhdGVzOgotICAvLyAgIC0gVU5JTklUSUFMSVpFRDogV2UgYXJlIHRoZSBmaXJzdCB0aHJlYWQgY2FsbGluZyB0aGlzIGZ1bmN0aW9uLgotICAvLyAgIC0gRVhFQ1VUSU5HX0NMT1NVUkU6IEFub3RoZXIgdGhyZWFkIGlzIGFscmVhZHkgZXhlY3V0aW5nIHRoZSBjbG9zdXJlLgotICAvLwotICAvLyBGaXJzdCwgdHJ5IHRvIGNoYW5nZSB0aGUgc3RhdGUgZnJvbSBVTklOSVRJQUxJWkVEIHRvIEVYRUNVVElOR19DTE9TVVJFCi0gIC8vIGF0b21pY2FsbHkuCi0gIHN0YXRlID0gaW50ZXJuYWw6OkFjcXVpcmVfQ29tcGFyZUFuZFN3YXAoCi0gICAgICBvbmNlLCBPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQsIE9OQ0VfU1RBVEVfRVhFQ1VUSU5HX0NMT1NVUkUpOwotICBpZiAoc3RhdGUgPT0gT05DRV9TVEFURV9VTklOSVRJQUxJWkVEKSB7Ci0gICAgLy8gV2UgYXJlIHRoZSBmaXJzdCB0aHJlYWQgdG8gY2FsbCB0aGlzIGZ1bmN0aW9uLCBzbyB3ZSBoYXZlIHRvIGNhbGwgdGhlCi0gICAgLy8gY2xvc3VyZS4KLSAgICBjbG9zdXJlLT5SdW4oKTsKLSAgICBpbnRlcm5hbDo6UmVsZWFzZV9TdG9yZShvbmNlLCBPTkNFX1NUQVRFX0RPTkUpOwotICB9IGVsc2UgewotICAgIC8vIEFub3RoZXIgdGhyZWFkIGhhcyBhbHJlYWR5IHN0YXJ0ZWQgZXhlY3V0aW5nIHRoZSBjbG9zdXJlLiBXZSBuZWVkIHRvCi0gICAgLy8gd2FpdCB1bnRpbCBpdCBjb21wbGV0ZXMgdGhlIGluaXRpYWxpemF0aW9uLgotICAgIHdoaWxlIChzdGF0ZSA9PSBPTkNFX1NUQVRFX0VYRUNVVElOR19DTE9TVVJFKSB7Ci0gICAgICAvLyBOb3RlIHRoYXQgZnV0ZXgoKSBjb3VsZCBiZSB1c2VkIGhlcmUgb24gTGludXggYXMgYW4gaW1wcm92ZW1lbnQuCi0gICAgICBTY2hlZFlpZWxkKCk7Ci0gICAgICBzdGF0ZSA9IGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSk7Ci0gICAgfQotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURfU0FGRVRZCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NTIyYjIyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLwotLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL29uY2UuaAotLy8KLS8vIFRoaXMgaGVhZGVyIGlzIGludGVuZGVkIHRvIGJlIGluY2x1ZGVkIG9ubHkgYnkgaW50ZXJuYWwgLmNjIGZpbGVzIGFuZAotLy8gZ2VuZXJhdGVkIC5wYi5jYyBmaWxlcy4gIFVzZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgZGlyZWN0bHkuCi0vLwotLy8gVGhpcyBpcyBiYXNpY2FsbHkgYSBwb3J0YWJsZSB2ZXJzaW9uIG9mIHB0aHJlYWRfb25jZSgpLgotLy8KLS8vIFRoaXMgaGVhZGVyIGRlY2xhcmVzOgotLy8gKiBBIHR5cGUgY2FsbGVkIFByb3RvYnVmT25jZVR5cGUuCi0vLyAqIEEgbWFjcm8gR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRSgpIHdoaWNoIGRlY2xhcmVzIGEgdmFyaWFibGUgb2YgdHlwZQotLy8gICBQcm90b2J1Zk9uY2VUeXBlLiAgVGhpcyBpcyB0aGUgb25seSBsZWdhbCB3YXkgdG8gZGVjbGFyZSBzdWNoIGEgdmFyaWFibGUuCi0vLyAgIFRoZSBtYWNybyBtYXkgb25seSBiZSB1c2VkIGF0IHRoZSBnbG9iYWwgc2NvcGUgKHlvdSBjYW5ub3QgY3JlYXRlIGxvY2FsIG9yCi0vLyAgIGNsYXNzIG1lbWJlciB2YXJpYWJsZXMgb2YgdGhpcyB0eXBlKS4KLS8vICogQSBmdW5jdGlvbiBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKSgpKS4KLS8vICAgVGhpcyBmdW5jdGlvbiwgd2hlbiBpbnZva2VkIG11bHRpcGxlIHRpbWVzIGdpdmVuIHRoZSBzYW1lIFByb3RvYnVmT25jZVR5cGUKLS8vICAgb2JqZWN0LCB3aWxsIGludm9rZSBpbml0X2Z1bmMgb24gdGhlIGZpcnN0IGNhbGwgb25seSwgYW5kIHdpbGwgbWFrZSBzdXJlCi0vLyAgIG5vbmUgb2YgdGhlIGNhbGxzIHJldHVybiBiZWZvcmUgdGhhdCBmaXJzdCBjYWxsIHRvIGluaXRfZnVuYyBoYXMgZmluaXNoZWQuCi0vLyAqIFRoZSB1c2VyIGNhbiBwcm92aWRlIGEgcGFyYW1ldGVyIHdoaWNoIEdvb2dsZU9uY2VJbml0KCkgZm9yd2FyZHMgdG8gdGhlCi0vLyAgIHVzZXItcHJvdmlkZWQgZnVuY3Rpb24gd2hlbiBpdCBpcyBjYWxsZWQuIFVzYWdlIGV4YW1wbGU6Ci0vLyAgICAgaW50IGEgPSAxMDsKLS8vICAgICBHb29nbGVPbmNlSW5pdCgmbXlfb25jZSwgJk15RnVuY3Rpb25FeHBlY3RpbmdJbnRBcmd1bWVudCwgJmEpOwotLy8gKiBUaGlzIGltcGxlbWVudGF0aW9uIGd1YXJhbnRlZXMgdGhhdCBQcm90b2J1Zk9uY2VUeXBlIGlzIGEgUE9EIChpLmUuIG5vCi0vLyAgIHN0YXRpYyBpbml0aWFsaXplciBnZW5lcmF0ZWQpLgotLy8KLS8vIFRoaXMgaW1wbGVtZW50cyBhIHdheSB0byBwZXJmb3JtIGxhenkgaW5pdGlhbGl6YXRpb24uICBJdCdzIG1vcmUgZWZmaWNpZW50Ci0vLyB0aGFuIHVzaW5nIG11dGV4ZXMgYXMgbm8gbG9jayBpcyBuZWVkZWQgaWYgaW5pdGlhbGl6YXRpb24gaGFzIGFscmVhZHkKLS8vIGhhcHBlbmVkLgotLy8KLS8vIEV4YW1wbGUgdXNhZ2U6Ci0vLyAgIHZvaWQgSW5pdCgpOwotLy8gICBHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKG9uY2VfaW5pdCk7Ci0vLwotLy8gICAvLyBDYWxscyBJbml0KCkgZXhhY3RseSBvbmNlLgotLy8gICB2b2lkIEluaXRPbmNlKCkgewotLy8gICAgIEdvb2dsZU9uY2VJbml0KCZvbmNlX2luaXQsICZJbml0KTsKLS8vICAgfQotLy8KLS8vIE5vdGUgdGhhdCBpZiBHb29nbGVPbmNlSW5pdCgpIGlzIGNhbGxlZCBiZWZvcmUgbWFpbigpIGhhcyBiZWd1biwgaXQgbXVzdAotLy8gb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IHdpbGwgZXZlbnR1YWxseSBjYWxsIG1haW4oKSAtLSB0aGF0IGlzLAotLy8gdGhlIHRocmVhZCB0aGF0IHBlcmZvcm1zIGR5bmFtaWMgaW5pdGlhbGl6YXRpb24uICBJbiBnZW5lcmFsIHRoaXMgaXMgYSBzYWZlCi0vLyBhc3N1bXB0aW9uIHNpbmNlIHBlb3BsZSBkb24ndCB1c3VhbGx5IGNvbnN0cnVjdCB0aHJlYWRzIGJlZm9yZSBtYWluKCkgc3RhcnRzLAotLy8gYnV0IGl0IGlzIHRlY2huaWNhbGx5IG5vdCBndWFyYW50ZWVkLiAgVW5mb3J0dW5hdGVseSwgV2luMzIgcHJvdmlkZXMgbm8gd2F5Ci0vLyB3aGF0c29ldmVyIHRvIHN0YXRpY2FsbHktaW5pdGlhbGl6ZSBpdHMgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMsIHNvIG91cgotLy8gb25seSBjaG9pY2UgaXMgdG8gYXNzdW1lIHRoYXQgZHluYW1pYyBpbml0aWFsaXphdGlvbiBpcyBzaW5nbGUtdGhyZWFkZWQuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX09OQ0VfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19PTkNFX0hfXwotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0jaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRF9TQUZFVFkKLQotdHlwZWRlZiBib29sIFByb3RvYnVmT25jZVR5cGU7Ci0KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09OQ0VfSU5JVCBmYWxzZQotCi1pbmxpbmUgdm9pZCBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKSgpKSB7Ci0gIGlmICghKm9uY2UpIHsKLSAgICAqb25jZSA9IHRydWU7Ci0gICAgaW5pdF9mdW5jKCk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFyZz4KLWlubGluZSB2b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKEFyZyksCi0gICAgQXJnIGFyZykgewotICBpZiAoISpvbmNlKSB7Ci0gICAgKm9uY2UgPSB0cnVlOwotICAgIGluaXRfZnVuYyhhcmcpOwotICB9Ci19Ci0KLSNlbHNlCi0KLWVudW0gewotICBPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQgPSAwLAotICBPTkNFX1NUQVRFX0VYRUNVVElOR19DTE9TVVJFID0gMSwKLSAgT05DRV9TVEFURV9ET05FID0gMgotfTsKLQotdHlwZWRlZiBpbnRlcm5hbDo6QXRvbWljV29yZCBQcm90b2J1Zk9uY2VUeXBlOwotCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PTkNFX0lOSVQgOjpnb29nbGU6OnByb3RvYnVmOjpPTkNFX1NUQVRFX1VOSU5JVElBTElaRUQKLQotTElCUFJPVE9CVUZfRVhQT1JUCi12b2lkIEdvb2dsZU9uY2VJbml0SW1wbChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCBDbG9zdXJlKiBjbG9zdXJlKTsKLQotTElCUFJPVE9CVUZfRVhQT1JUCi12b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKCkpOwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnPgotaW5saW5lIHZvaWQgR29vZ2xlT25jZUluaXQoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgdm9pZCAoKmluaXRfZnVuYykoQXJnKiksCi0gICAgQXJnKiBhcmcpIHsKLSAgaWYgKGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSkgIT0gT05DRV9TVEFURV9ET05FKSB7Ci0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTE8QXJnKj4gZnVuYyhpbml0X2Z1bmMsIGZhbHNlLCBhcmcpOwotICAgIEdvb2dsZU9uY2VJbml0SW1wbChvbmNlLCAmZnVuYyk7Ci0gIH0KLX0KLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQotCi1jbGFzcyBHb29nbGVPbmNlRHluYW1pYyB7Ci0gcHVibGljOgotICBHb29nbGVPbmNlRHluYW1pYygpIDogc3RhdGVfKEdPT0dMRV9QUk9UT0JVRl9PTkNFX0lOSVQpIHsgfQotCi0gIC8vIElmIHRoaXMtPkluaXQoKSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSBieSBhbnkgdGhyZWFkLAotICAvLyBleGVjdXRlICgqZnVuY193aXRoX2FyZykoYXJnKSB0aGVuIHJldHVybi4KLSAgLy8gT3RoZXJ3aXNlLCB3YWl0IHVudGlsIHRoYXQgcHJpb3IgaW52b2NhdGlvbiBoYXMgZmluaXNoZWQKLSAgLy8gZXhlY3V0aW5nIGl0cyBmdW5jdGlvbiwgdGhlbiByZXR1cm4uCi0gIHRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci0gIHZvaWQgSW5pdCh2b2lkICgqZnVuY193aXRoX2FyZykoVCopLCBUKiBhcmcpIHsKLSAgICBHb29nbGVPbmNlSW5pdDxUPigmdGhpcy0+c3RhdGVfLAotICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfd2l0aF9hcmcsCi0gICAgICAgICAgICAgICAgICAgICAgYXJnKTsKLSAgfQotIHByaXZhdGU6Ci0gIFByb3RvYnVmT25jZVR5cGUgc3RhdGVfOwotfTsKLQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKE5BTUUpIFwKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpQcm90b2J1Zk9uY2VUeXBlIE5BTUUgPSBHT09HTEVfUFJPVE9CVUZfT05DRV9JTklUCi0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19PTkNFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzN2RlZjU4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI1NSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotCi0jaWZkZWYgX1dJTjMyCi0jaW5jbHVkZSA8d2luZG93cy5oPgotI2Vsc2UKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNpbmNsdWRlIDxwdGhyZWFkLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgotI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLXVzaW5nIGludGVybmFsOjpOZXdDYWxsYmFjazsKLW5hbWVzcGFjZSB7Ci0KLWNsYXNzIE9uY2VJbml0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZvaWQgU2V0VXAoKSB7Ci0gICAgc3RhdGVfID0gSU5JVF9OT1RfU1RBUlRFRDsKLSAgICBjdXJyZW50X3Rlc3RfID0gdGhpczsKLSAgfQotCi0gIC8vIFNpbmNlIFByb3RvYnVmT25jZVR5cGUgaXMgb25seSBhbGxvd2VkIHRvIGJlIGFsbG9jYXRlZCBpbiBzdGF0aWMgc3RvcmFnZSwKLSAgLy8gZWFjaCB0ZXN0IG11c3QgdXNlIGEgZGlmZmVyZW50IHBhaXIgb2YgUHJvdG9idWZPbmNlVHlwZSBvYmplY3RzIHdoaWNoIGl0Ci0gIC8vIG11c3QgZGVjbGFyZSBpdHNlbGYuCi0gIHZvaWQgU2V0T25jZXMoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgUHJvdG9idWZPbmNlVHlwZSogcmVjdXJzaXZlX29uY2UpIHsKLSAgICBvbmNlXyA9IG9uY2U7Ci0gICAgcmVjdXJzaXZlX29uY2VfID0gcmVjdXJzaXZlX29uY2U7Ci0gIH0KLQotICB2b2lkIEluaXRPbmNlKCkgewotICAgIEdvb2dsZU9uY2VJbml0KG9uY2VfLCAmSW5pdFN0YXRpYyk7Ci0gIH0KLSAgdm9pZCBJbml0UmVjdXJzaXZlT25jZSgpIHsKLSAgICBHb29nbGVPbmNlSW5pdChyZWN1cnNpdmVfb25jZV8sICZJbml0UmVjdXJzaXZlU3RhdGljKTsKLSAgfQotCi0gIHZvaWQgQmxvY2tJbml0KCkgeyBpbml0X2Jsb2NrZXJfLkxvY2soKTsgfQotICB2b2lkIFVuYmxvY2tJbml0KCkgeyBpbml0X2Jsb2NrZXJfLlVubG9jaygpOyB9Ci0KLSAgY2xhc3MgVGVzdFRocmVhZCB7Ci0gICBwdWJsaWM6Ci0gICAgVGVzdFRocmVhZChDbG9zdXJlKiBjYWxsYmFjaykKLSAgICAgICAgOiBkb25lXyhmYWxzZSksIGpvaW5lZF8oZmFsc2UpLCBjYWxsYmFja18oY2FsbGJhY2spIHsKLSNpZmRlZiBfV0lOMzIKLSAgICAgIHRocmVhZF8gPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgJlN0YXJ0LCB0aGlzLCAwLCBOVUxMKTsKLSNlbHNlCi0gICAgICBwdGhyZWFkX2NyZWF0ZSgmdGhyZWFkXywgTlVMTCwgJlN0YXJ0LCB0aGlzKTsKLSNlbmRpZgotICAgIH0KLSAgICB+VGVzdFRocmVhZCgpIHsKLSAgICAgIGlmICgham9pbmVkXykgSm9pbigpOwotICAgIH0KLQotICAgIGJvb2wgSXNEb25lKCkgewotICAgICAgTXV0ZXhMb2NrIGxvY2soJmRvbmVfbXV0ZXhfKTsKLSAgICAgIHJldHVybiBkb25lXzsKLSAgICB9Ci0gICAgdm9pZCBKb2luKCkgewotICAgICAgam9pbmVkXyA9IHRydWU7Ci0jaWZkZWYgX1dJTjMyCi0gICAgICBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZF8sIElORklOSVRFKTsKLSAgICAgIENsb3NlSGFuZGxlKHRocmVhZF8pOwotI2Vsc2UKLSAgICAgIHB0aHJlYWRfam9pbih0aHJlYWRfLCBOVUxMKTsKLSNlbmRpZgotICAgIH0KLQotICAgcHJpdmF0ZToKLSNpZmRlZiBfV0lOMzIKLSAgICBIQU5ETEUgdGhyZWFkXzsKLSNlbHNlCi0gICAgcHRocmVhZF90IHRocmVhZF87Ci0jZW5kaWYKLQotICAgIE11dGV4IGRvbmVfbXV0ZXhfOwotICAgIGJvb2wgZG9uZV87Ci0gICAgYm9vbCBqb2luZWRfOwotICAgIENsb3N1cmUqIGNhbGxiYWNrXzsKLQotI2lmZGVmIF9XSU4zMgotICAgIHN0YXRpYyBEV09SRCBXSU5BUEkgU3RhcnQoTFBWT0lEIGFyZykgewotI2Vsc2UKLSAgICBzdGF0aWMgdm9pZCogU3RhcnQodm9pZCogYXJnKSB7Ci0jZW5kaWYKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8VGVzdFRocmVhZCo+KGFyZyktPlJ1bigpOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgdm9pZCBSdW4oKSB7Ci0gICAgICBjYWxsYmFja18tPlJ1bigpOwotICAgICAgTXV0ZXhMb2NrIGxvY2soJmRvbmVfbXV0ZXhfKTsKLSAgICAgIGRvbmVfID0gdHJ1ZTsKLSAgICB9Ci0gIH07Ci0KLSAgVGVzdFRocmVhZCogUnVuSW5pdE9uY2VJbk5ld1RocmVhZCgpIHsKLSAgICByZXR1cm4gbmV3IFRlc3RUaHJlYWQoaW50ZXJuYWw6Ok5ld0NhbGxiYWNrKHRoaXMsICZPbmNlSW5pdFRlc3Q6OkluaXRPbmNlKSk7Ci0gIH0KLSAgVGVzdFRocmVhZCogUnVuSW5pdFJlY3Vyc2l2ZU9uY2VJbk5ld1RocmVhZCgpIHsKLSAgICByZXR1cm4gbmV3IFRlc3RUaHJlYWQoCi0gICAgICAgIGludGVybmFsOjpOZXdDYWxsYmFjayh0aGlzLCAmT25jZUluaXRUZXN0OjpJbml0UmVjdXJzaXZlT25jZSkpOwotICB9Ci0KLSAgZW51bSBTdGF0ZSB7Ci0gICAgSU5JVF9OT1RfU1RBUlRFRCwKLSAgICBJTklUX1NUQVJURUQsCi0gICAgSU5JVF9ET05FCi0gIH07Ci0gIFN0YXRlIEN1cnJlbnRTdGF0ZSgpIHsKLSAgICBNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKLSAgICByZXR1cm4gc3RhdGVfOwotICB9Ci0KLSAgdm9pZCBXYWl0QUJpdCgpIHsKLSNpZmRlZiBfV0lOMzIKLSAgICBTbGVlcCgxMDAwKTsKLSNlbHNlCi0gICAgc2xlZXAoMSk7Ci0jZW5kaWYKLSAgfQotCi0gcHJpdmF0ZToKLSAgTXV0ZXggbXV0ZXhfOwotICBNdXRleCBpbml0X2Jsb2NrZXJfOwotICBTdGF0ZSBzdGF0ZV87Ci0gIFByb3RvYnVmT25jZVR5cGUqIG9uY2VfOwotICBQcm90b2J1Zk9uY2VUeXBlKiByZWN1cnNpdmVfb25jZV87Ci0KLSAgdm9pZCBJbml0KCkgewotICAgIE11dGV4TG9jayBsb2NrKCZtdXRleF8pOwotICAgIEVYUEVDVF9FUShJTklUX05PVF9TVEFSVEVELCBzdGF0ZV8pOwotICAgIHN0YXRlXyA9IElOSVRfU1RBUlRFRDsKLSAgICBtdXRleF8uVW5sb2NrKCk7Ci0gICAgaW5pdF9ibG9ja2VyXy5Mb2NrKCk7Ci0gICAgaW5pdF9ibG9ja2VyXy5VbmxvY2soKTsKLSAgICBtdXRleF8uTG9jaygpOwotICAgIHN0YXRlXyA9IElOSVRfRE9ORTsKLSAgfQotCi0gIHN0YXRpYyBPbmNlSW5pdFRlc3QqIGN1cnJlbnRfdGVzdF87Ci0gIHN0YXRpYyB2b2lkIEluaXRTdGF0aWMoKSB7IGN1cnJlbnRfdGVzdF8tPkluaXQoKTsgfQotICBzdGF0aWMgdm9pZCBJbml0UmVjdXJzaXZlU3RhdGljKCkgeyBjdXJyZW50X3Rlc3RfLT5Jbml0T25jZSgpOyB9Ci19OwotCi1PbmNlSW5pdFRlc3QqIE9uY2VJbml0VGVzdDo6Y3VycmVudF90ZXN0XyA9IE5VTEw7Ci0KLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0Uoc2ltcGxlX29uY2UpOwotCi1URVNUX0YoT25jZUluaXRUZXN0LCBTaW1wbGUpIHsKLSAgU2V0T25jZXMoJnNpbXBsZV9vbmNlLCBOVUxMKTsKLQotICBFWFBFQ1RfRVEoSU5JVF9OT1RfU1RBUlRFRCwgQ3VycmVudFN0YXRlKCkpOwotICBJbml0T25jZSgpOwotICBFWFBFQ1RfRVEoSU5JVF9ET05FLCBDdXJyZW50U3RhdGUoKSk7Ci0KLSAgLy8gQ2FsbGluZyBhZ2FpbiBoYXMgbm8gZWZmZWN0LgotICBJbml0T25jZSgpOwotICBFWFBFQ1RfRVEoSU5JVF9ET05FLCBDdXJyZW50U3RhdGUoKSk7Ci19Ci0KLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocmVjdXJzaXZlX29uY2UxKTsKLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocmVjdXJzaXZlX29uY2UyKTsKLQotVEVTVF9GKE9uY2VJbml0VGVzdCwgUmVjdXJzaXZlKSB7Ci0gIFNldE9uY2VzKCZyZWN1cnNpdmVfb25jZTEsICZyZWN1cnNpdmVfb25jZTIpOwotCi0gIEVYUEVDVF9FUShJTklUX05PVF9TVEFSVEVELCBDdXJyZW50U3RhdGUoKSk7Ci0gIEluaXRSZWN1cnNpdmVPbmNlKCk7Ci0gIEVYUEVDVF9FUShJTklUX0RPTkUsIEN1cnJlbnRTdGF0ZSgpKTsKLX0KLQotR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShtdWx0aXBsZV90aHJlYWRzX29uY2UpOwotCi1URVNUX0YoT25jZUluaXRUZXN0LCBNdWx0aXBsZVRocmVhZHMpIHsKLSAgU2V0T25jZXMoJm11bHRpcGxlX3RocmVhZHNfb25jZSwgTlVMTCk7Ci0KLSAgc2NvcGVkX3B0cjxUZXN0VGhyZWFkPiB0aHJlYWRzWzRdOwotICBFWFBFQ1RfRVEoSU5JVF9OT1RfU1RBUlRFRCwgQ3VycmVudFN0YXRlKCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgIHRocmVhZHNbaV0ucmVzZXQoUnVuSW5pdE9uY2VJbk5ld1RocmVhZCgpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IDQ7IGkrKykgewotICAgIHRocmVhZHNbaV0tPkpvaW4oKTsKLSAgfQotICBFWFBFQ1RfRVEoSU5JVF9ET05FLCBDdXJyZW50U3RhdGUoKSk7Ci19Ci0KLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UobXVsdGlwbGVfdGhyZWFkc19ibG9ja2VkX29uY2UxKTsKLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UobXVsdGlwbGVfdGhyZWFkc19ibG9ja2VkX29uY2UyKTsKLQotVEVTVF9GKE9uY2VJbml0VGVzdCwgTXVsdGlwbGVUaHJlYWRzQmxvY2tlZCkgewotICBTZXRPbmNlcygmbXVsdGlwbGVfdGhyZWFkc19ibG9ja2VkX29uY2UxLCAmbXVsdGlwbGVfdGhyZWFkc19ibG9ja2VkX29uY2UyKTsKLQotICBzY29wZWRfcHRyPFRlc3RUaHJlYWQ+IHRocmVhZHNbOF07Ci0gIEVYUEVDVF9FUShJTklUX05PVF9TVEFSVEVELCBDdXJyZW50U3RhdGUoKSk7Ci0KLSAgQmxvY2tJbml0KCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgdGhyZWFkc1tpXS5yZXNldChSdW5Jbml0T25jZUluTmV3VGhyZWFkKCkpOwotICB9Ci0gIGZvciAoaW50IGkgPSA0OyBpIDwgODsgaSsrKSB7Ci0gICAgdGhyZWFkc1tpXS5yZXNldChSdW5Jbml0UmVjdXJzaXZlT25jZUluTmV3VGhyZWFkKCkpOwotICB9Ci0KLSAgV2FpdEFCaXQoKTsKLQotICAvLyBXZSBzaG91bGQgbm93IGhhdmUgb25lIHRocmVhZCBibG9ja2VkIGluc2lkZSBJbml0KCksIGZvdXIgYmxvY2tlZCB3YWl0aW5nCi0gIC8vIGZvciBJbml0KCkgdG8gY29tcGxldGUsIGFuZCB0aHJlZSBibG9ja2VkIHdhaXRpbmcgZm9yIEluaXRSZWN1cnNpdmUoKSB0bwotICAvLyBjb21wbGV0ZS4KLSAgRVhQRUNUX0VRKElOSVRfU1RBUlRFRCwgQ3VycmVudFN0YXRlKCkpOwotICBVbmJsb2NrSW5pdCgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgODsgaSsrKSB7Ci0gICAgdGhyZWFkc1tpXS0+Sm9pbigpOwotICB9Ci0gIEVYUEVDVF9FUShJTklUX0RPTkUsIEN1cnJlbnRTdGF0ZSgpKTsKLX0KLQotfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJhNGIzNC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oCisrKyAvZGV2L251bGwKQEAgLTEsMTI1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9NQUNST1NfSF8KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX01BQ1JPU19IXwotCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9FUlJPUiBcCi0jZXJyb3IgIkhvc3QgcGxhdGZvcm0gd2FzIG5vdCBkZXRlY3RlZCBhcyBzdXBwb3J0ZWQgYnkgcHJvdG9idWYiCi0KLS8vIFByb2Nlc3NvciBhcmNoaXRlY3R1cmUgZGV0ZWN0aW9uLiAgRm9yIG1vcmUgaW5mbyBvbiB3aGF0J3MgZGVmaW5lZCwgc2VlOgotLy8gICBodHRwOi8vbXNkbi5taWNyb3NvZnQuY29tL2VuLXVzL2xpYnJhcnkvYjAwODRrYXkuYXNweAotLy8gICBodHRwOi8vd3d3LmFnbmVyLm9yZy9vcHRpbWl6ZS9jYWxsaW5nX2NvbnZlbnRpb25zLnBkZgotLy8gICBvciB3aXRoIGdjYywgcnVuOiAiZWNobyB8IGdjYyAtRSAtZE0gLSIKLSNpZiBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQgMQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQotI2VsaWYgZGVmaW5lZChfTV9JWDg2KSB8fCBkZWZpbmVkKF9faTM4Nl9fKQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9JQTMyIDEKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKLSNlbGlmIGRlZmluZWQoX19RTlhfXykKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfQVJNX1FOWCAxCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCi0jZWxpZiBkZWZpbmVkKF9fQVJNRUxfXykKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfQVJNIDEKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKLSNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX0FBUkNINjQgMQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQotI2VsaWYgZGVmaW5lZChfX01JUFNFTF9fKQotI2lmIGRlZmluZWQoX19MUDY0X18pCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX01JUFM2NCAxCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCAxCi0jZWxzZQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTIDEKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX3BuYWNsX18pCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCi0jZWxpZiBkZWZpbmVkKHNwYXJjKQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9TUEFSQyAxCi0jaWYgZGVmaW5lZChfX3NwYXJjX3Y5X18pIHx8IGRlZmluZWQoX19zcGFyY3Y5KSB8fCBkZWZpbmVkKF9fYXJjaDY0X18pCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCAxCi0jZWxzZQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQotI2VuZGlmCi0jZWxpZiBkZWZpbmVkKF9QT1dFUikgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSB8fCBkZWZpbmVkKF9fUFBDNjRfXykKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfUE9XRVIgMQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQotI2VsaWYgZGVmaW5lZChfX1BQQ19fKQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9QUEMgMQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQotI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKLSMgaWYgKCgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDcpKSB8fCAoX19HTlVDX18gPiA0KSkKLS8vIFdlIGZhbGxiYWNrIHRvIHRoZSBnZW5lcmljIENsYW5nL0dDQyA+PSA0LjcgaW1wbGVtZW50YXRpb24gaW4gYXRvbWljb3BzLmgKLSMgZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKLSMgIGlmICFfX2hhc19leHRlbnNpb24oY19hdG9taWMpCi1HT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fRVJST1IKLSMgIGVuZGlmCi0vLyBXZSBmYWxsYmFjayB0byB0aGUgZ2VuZXJpYyBDbGFuZy9HQ0MgPj0gNC43IGltcGxlbWVudGF0aW9uIGluIGF0b21pY29wcy5oCi0jIGVuZGlmCi0jIGlmIF9fTFA2NF9fCi0jICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUIDEKLSMgZWxzZQotIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCi0jIGVuZGlmCi0jZWxzZQotR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX0VSUk9SCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19BUFBMRV9fKQotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfQVBQTEUKLSNpbmNsdWRlIDxUYXJnZXRDb25kaXRpb25hbHMuaD4KLSNpZiBUQVJHRVRfT1NfSVBIT05FCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19JUEhPTkUKLSNlbmRpZgotI2VsaWYgZGVmaW5lZChfX0VNU0NSSVBURU5fXykKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX0VNU0NSSVBURU4KLSNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19OQUNMCi0jZWxpZiBkZWZpbmVkKHN1bikKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX1NPTEFSSVMKLSNlbGlmIGRlZmluZWQoX0FJWCkKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX0FJWAotI2VsaWYgZGVmaW5lZChfX0FORFJPSURfXykKLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX0FORFJPSUQKLSNlbmRpZgotCi0jdW5kZWYgR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX0VSUk9SCi0KLSNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19BTkRST0lEKSB8fCBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19JUEhPTkUpCi0vLyBBbmRyb2lkIG5kayBkb2VzIG5vdCBzdXBwb3J0IHRoZSBfX3RocmVhZCBrZXl3b3JkIHZlcnkgd2VsbCB5ZXQuIEhlcmUKLS8vIHdlIHVzZSBwdGhyZWFkX2tleV9jcmVhdGUoKS9wdGhyZWFkX2dldHNwZWNpZmljKCkvLi4uIG1ldGhvZHMgZm9yCi0vLyBUTFMgc3VwcG9ydCBvbiBhbmRyb2lkLgotLy8gaU9TIGFsc28gZG9lcyBub3Qgc3VwcG9ydCB0aGUgX190aHJlYWQga2V5d29yZC4KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRExPQ0FMCi0jZW5kaWYKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fTUFDUk9TX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4MGU2MDc0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oCisrKyAvZGV2L251bGwKQEAgLTEsNDAwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19QT1JUX0hfCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19QT1JUX0hfCi0KLSNpbmNsdWRlIDxhc3NlcnQuaD4KLSNpbmNsdWRlIDxzdGRsaWIuaD4KLSNpbmNsdWRlIDxjc3RkZGVmPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxzdHJpbmcuaD4KLSNpZiBkZWZpbmVkKF9fb3NmX18pCi0vLyBUcnU2NCBsYWNrcyBzdGRpbnQuaCwgYnV0IGhhcyBpbnR0eXBlcy5oIHdoaWNoIGRlZmluZXMgYSBzdXBlcnNldCBvZgotLy8gd2hhdCBzdGRpbnQuaCB3b3VsZCBkZWZpbmUuCi0jaW5jbHVkZSA8aW50dHlwZXMuaD4KLSNlbGlmICFkZWZpbmVkKF9NU0NfVkVSKQotI2luY2x1ZGUgPHN0ZGludC5oPgotI2VuZGlmCi0KLSN1bmRlZiBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOCi0jaWZkZWYgX1dJTjMyCi0gIC8vIEFzc3VtaW5nIHdpbmRvd3MgaXMgYWx3YXlzIGxpdHRsZS1lbmRpYW4uCi0gIC8vIFRPRE8oeGlhb2ZlbmcpOiBUaGUgUFJPVE9CVUZfTElUVExFX0VORElBTiBpcyBub3Qgb25seSB1c2VkIGZvcgotICAvLyBvcHRpbWl6YXRpb24gYnV0IGFsc28gZm9yIGNvcnJlY3RuZXNzLiBXZSBzaG91bGQgZGVmaW5lIGFuCi0gIC8vIGRpZmZlcmVudCBtYWNybyB0byB0ZXN0IHRoZSBiaWctZW5kaWFuIGNvZGUgcGF0aCBpbiBjb2RlZF9zdHJlYW0uCi0gICNpZiAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQotICAgICNkZWZpbmUgUFJPVE9CVUZfTElUVExFX0VORElBTiAxCi0gICNlbmRpZgotICAjaWYgX01TQ19WRVIgPj0gMTMwMCAmJiAhZGVmaW5lZChfX0lOVEVMX0NPTVBJTEVSKQotICAgIC8vIElmIE1TVkMgaGFzICIvUlRDYyIgc2V0LCBpdCB3aWxsIGNvbXBsYWluIGFib3V0IHRydW5jYXRpbmcgY2FzdHMgYXQKLSAgICAvLyBydW50aW1lLiAgVGhpcyBmaWxlIGNvbnRhaW5zIHNvbWUgaW50ZW50aW9uYWwgdHJ1bmNhdGluZyBjYXN0cy4KLSAgICAjcHJhZ21hIHJ1bnRpbWVfY2hlY2tzKCJjIiwgb2ZmKQotICAjZW5kaWYKLSNlbHNlCi0gICNpbmNsdWRlIDxzeXMvcGFyYW0uaD4gICAvLyBfX0JZVEVfT1JERVIKLSAgI2lmICgoZGVmaW5lZChfX0xJVFRMRV9FTkRJQU5fXykgJiYgIWRlZmluZWQoX19CSUdfRU5ESUFOX18pKSB8fCBcCi0gICAgICAgICAoZGVmaW5lZChfX0JZVEVfT1JERVIpICYmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4pKSAmJiBcCi0gICAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQotICAgICNkZWZpbmUgUFJPVE9CVUZfTElUVExFX0VORElBTiAxCi0gICNlbmRpZgotI2VuZGlmCi0KLS8vIFRoZSBtYWNyb3MgZGVmaW5lZCBiZWxvdyBhcmUgcmVxdWlyZWQgaW4gb3JkZXIgdG8gbWFrZSBwcm90b2J1Zl9saXRlIGEKLS8vIGNvbXBvbmVudCBvbiBhbGwgcGxhdGZvcm1zLiBTZWUgaHR0cDovL2NyYnVnLmNvbS8xNzI4MDAuCi0jaWYgZGVmaW5lZChDT01QT05FTlRfQlVJTEQpICYmIGRlZmluZWQoUFJPVE9CVUZfVVNFX0RMTFMpCi0gICNpZiBkZWZpbmVkKF9NU0NfVkVSKQotICAgICNpZmRlZiBMSUJQUk9UT0JVRl9FWFBPUlRTCi0gICAgICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSAgICAjZWxzZQotICAgICAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0gICAgI2VuZGlmCi0gICAgI2lmZGVmIExJQlBST1RPQ19FWFBPUlRTCi0gICAgICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSAgICAjZWxzZQotICAgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0gICAgI2VuZGlmCi0gICNlbHNlICAvLyBkZWZpbmVkKF9NU0NfVkVSKQotICAgICNpZmRlZiBMSUJQUk9UT0JVRl9FWFBPUlRTCi0gICAgICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQotICAgICNlbHNlCi0gICAgICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVAotICAgICNlbmRpZgotICAgICNpZmRlZiBMSUJQUk9UT0NfRVhQT1JUUwotICAgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKLSAgICAjZWxzZQotICAgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUCi0gICAgI2VuZGlmCi0gICNlbmRpZgotI2Vsc2UgIC8vIGRlZmluZWQoQ09NUE9ORU5UX0JVSUxEKSAmJiBkZWZpbmVkKFBST1RPQlVGX1VTRV9ETExTKQotICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVAotICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQKLSNlbmRpZgotCi0vLyBUaGVzZSAjaW5jbHVkZXMgYXJlIGZvciB0aGUgYnl0ZSBzd2FwIGZ1bmN0aW9ucyBkZWNsYXJlZCBsYXRlciBvbi4KLSNpZmRlZiBfTVNDX1ZFUgotI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGUpCi0jZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKLSNpbmNsdWRlIDxsaWJrZXJuL09TQnl0ZU9yZGVyLmg+Ci0jZWxpZiBkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQotI2luY2x1ZGUgPGJ5dGVzd2FwLmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0Ci0jZW5kaWYKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gZnJvbSBnb29nbGUzL2Jhc2UvcG9ydC5oCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLXR5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7Ci0KLSNpZmRlZiBfTVNDX1ZFUgotdHlwZWRlZiBzaWduZWQgX19pbnQ4ICBpbnQ4OwotdHlwZWRlZiBfX2ludDE2IGludDE2OwotdHlwZWRlZiBfX2ludDMyIGludDMyOwotdHlwZWRlZiBfX2ludDY0IGludDY0OwotCi10eXBlZGVmIHVuc2lnbmVkIF9faW50OCAgdWludDg7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgdWludDE2OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIHVpbnQzMjsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjQ7Ci0jZWxzZQotdHlwZWRlZiBpbnQ4X3QgIGludDg7Ci10eXBlZGVmIGludDE2X3QgaW50MTY7Ci10eXBlZGVmIGludDMyX3QgaW50MzI7Ci10eXBlZGVmIGludDY0X3QgaW50NjQ7Ci0KLXR5cGVkZWYgdWludDhfdCAgdWludDg7Ci10eXBlZGVmIHVpbnQxNl90IHVpbnQxNjsKLXR5cGVkZWYgdWludDMyX3QgdWludDMyOwotdHlwZWRlZiB1aW50NjRfdCB1aW50NjQ7Ci0jZW5kaWYKLQotLy8gbG9uZyBsb25nIG1hY3JvcyB0byBiZSB1c2VkIGJlY2F1c2UgZ2NjIGFuZCB2YysrIHVzZSBkaWZmZXJlbnQgc3VmZml4ZXMsCi0vLyBhbmQgZGlmZmVyZW50IHNpemUgc3BlY2lmaWVycyBpbiBmb3JtYXQgc3RyaW5ncwotI3VuZGVmIEdPT0dMRV9MT05HTE9ORwotI3VuZGVmIEdPT0dMRV9VTE9OR0xPTkcKLSN1bmRlZiBHT09HTEVfTExfRk9STUFUCi0KLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBHT09HTEVfTE9OR0xPTkcoeCkgeCMjSTY0Ci0jZGVmaW5lIEdPT0dMRV9VTE9OR0xPTkcoeCkgeCMjVUk2NAotI2RlZmluZSBHT09HTEVfTExfRk9STUFUICJJNjQiICAvLyBBcyBpbiBwcmludGYoIiVJNjRkIiwgLi4uKQotI2Vsc2UKLSNkZWZpbmUgR09PR0xFX0xPTkdMT05HKHgpIElOVDY0X0MoeCkKLSNkZWZpbmUgR09PR0xFX1VMT05HTE9ORyh4KSBVSU5UNjRfQyh4KQotI2RlZmluZSBHT09HTEVfTExfRk9STUFUICJsbCIgIC8vIEFzIGluICIlbGxkIi4gTm90ZSB0aGF0ICJxIiBpcyBwb29yIGZvcm0gYWxzby4KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgaW50MzIga2ludDMybWF4ID0gMHg3RkZGRkZGRjsKLXN0YXRpYyBjb25zdCBpbnQzMiBraW50MzJtaW4gPSAta2ludDMybWF4IC0gMTsKLXN0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtYXggPSBHT09HTEVfTE9OR0xPTkcoMHg3RkZGRkZGRkZGRkZGRkZGKTsKLXN0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtaW4gPSAta2ludDY0bWF4IC0gMTsKLXN0YXRpYyBjb25zdCB1aW50MzIga3VpbnQzMm1heCA9IDB4RkZGRkZGRkZ1Owotc3RhdGljIGNvbnN0IHVpbnQ2NCBrdWludDY0bWF4ID0gR09PR0xFX1VMT05HTE9ORygweEZGRkZGRkZGRkZGRkZGRkYpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbm5vdGF0aW9uczogIFNvbWUgcGFydHMgb2YgdGhlIGNvZGUgaGF2ZSBiZWVuIGFubm90YXRlZCBpbiB3YXlzIHRoYXQgbWlnaHQKLS8vICAgYmUgdXNlZnVsIHRvIHNvbWUgY29tcGlsZXJzIG9yIHRvb2xzLCBidXQgYXJlIG5vdCBzdXBwb3J0ZWQgdW5pdmVyc2FsbHkuCi0vLyAgIFlvdSBjYW4gI2RlZmluZSB0aGVzZSBhbm5vdGF0aW9ucyB5b3Vyc2VsZiBpZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotLy8gICBpcyBub3QgcmlnaHQgZm9yIHlvdS4KLQotI2lmbmRlZiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAzIHx8KF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkpCi0vLyBGb3IgZnVuY3Rpb25zIHdlIHdhbnQgdG8gZm9yY2UgaW5saW5lLgotLy8gSW50cm9kdWNlZCBpbiBnY2MgMy4xLgotI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKQotI2Vsc2UKLS8vIE90aGVyIGNvbXBpbGVycyB3aWxsIGhhdmUgdG8gZmlndXJlIGl0IG91dCBmb3IgdGhlbXNlbHZlcy4KLSNkZWZpbmUgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAzIHx8KF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkpCi0vLyBGb3IgZnVuY3Rpb25zIHdlIHdhbnQgdG8gZm9yY2Ugbm90IGlubGluZS4KLS8vIEludHJvZHVjZWQgaW4gZ2NjIDMuMS4KLSNkZWZpbmUgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSBfX2F0dHJpYnV0ZV9fICgobm9pbmxpbmUpKQotI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgKF9NU0NfVkVSID49IDE0MDApCi0vLyBTZWVtcyB0byBoYXZlIGJlZW4gYXJvdW5kIHNpbmNlIGF0IGxlYXN0IFZpc3VhbCBTdHVkaW8gMjAwNQotI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIF9fZGVjbHNwZWMobm9pbmxpbmUpCi0jZWxzZQotLy8gT3RoZXIgY29tcGlsZXJzIHdpbGwgaGF2ZSB0byBmaWd1cmUgaXQgb3V0IGZvciB0aGVtc2VsdmVzLgotI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAotI2lmZGVmIF9fR05VQ19fCi0vLyBJZiB0aGUgbWV0aG9kL3ZhcmlhYmxlL3R5cGUgaXMgdXNlZCBhbnl3aGVyZSwgcHJvZHVjZSBhIHdhcm5pbmcuCi0jZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKLSNlbHNlCi0jZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBHT09HTEVfUFJFRElDVF9UUlVFCi0jaWZkZWYgX19HTlVDX18KLS8vIFByb3ZpZGVkIGF0IGxlYXN0IHNpbmNlIEdDQyAzLjAuCi0jZGVmaW5lIEdPT0dMRV9QUkVESUNUX1RSVUUoeCkgKF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpKQotI2Vsc2UKLSNkZWZpbmUgR09PR0xFX1BSRURJQ1RfVFJVRSh4KSAoeCkKLSNlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgR09PR0xFX1BSRURJQ1RfRkFMU0UKLSNpZmRlZiBfX0dOVUNfXwotLy8gUHJvdmlkZWQgYXQgbGVhc3Qgc2luY2UgR0NDIDMuMC4KLSNkZWZpbmUgR09PR0xFX1BSRURJQ1RfRkFMU0UoeCkgKF9fYnVpbHRpbl9leHBlY3QoeCwgMCkpCi0jZWxzZQotI2RlZmluZSBHT09HTEVfUFJFRElDVF9GQUxTRSh4KSAoeCkKLSNlbmRpZgotI2VuZGlmCi0KLS8vIERlbGltaXRzIGEgYmxvY2sgb2YgY29kZSB3aGljaCBtYXkgd3JpdGUgdG8gbWVtb3J5IHdoaWNoIGlzIHNpbXVsdGFuZW91c2x5Ci0vLyB3cml0dGVuIGJ5IG90aGVyIHRocmVhZHMsIGJ1dCB3aGljaCBoYXMgYmVlbiBkZXRlcm1pbmVkIHRvIGJlIHRocmVhZC1zYWZlCi0vLyAoZS5nLiBiZWNhdXNlIGl0IGlzIGFuIGlkZW1wb3RlbnQgd3JpdGUpLgotI2lmbmRlZiBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTgotI2RlZmluZSBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpCi0jZW5kaWYKLSNpZm5kZWYgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5ECi0jZGVmaW5lIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpCi0jZW5kaWYKLQotI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9faGFzX2NwcF9hdHRyaWJ1dGUpIFwKLSAgICAmJiAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfQVBQTEUpCi0jIGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX05BQ0wpIHx8IGRlZmluZWQoRU1TQ1JJUFRFTikgfHwgXAotICAgICBfX2hhc19jcHBfYXR0cmlidXRlKGNsYW5nOjpmYWxsdGhyb3VnaCkKLSMgIGRlZmluZSBHT09HTEVfRkFMTFRIUk9VR0hfSU5URU5ERUQgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXQotIyBlbmRpZgotI2VuZGlmCi0KLSNpZm5kZWYgR09PR0xFX0ZBTExUSFJPVUdIX0lOVEVOREVECi0jIGRlZmluZSBHT09HTEVfRkFMTFRIUk9VR0hfSU5URU5ERUQKLSNlbmRpZgotCi0jZGVmaW5lIEdPT0dMRV9HVUFSREVEX0JZKHgpCi0jZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfQ09MRAotCi0vLyB4ODYgYW5kIHg4Ni02NCBjYW4gcGVyZm9ybSB1bmFsaWduZWQgbG9hZHMvc3RvcmVzIGRpcmVjdGx5LgotI2lmIGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IFwKLSAgICBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19pMzg2X18pCi0KLSNkZWZpbmUgR09PR0xFX1VOQUxJR05FRF9MT0FEMTYoX3ApICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTYgKj4oX3ApKQotI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX0xPQUQzMihfcCkgKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMiAqPihfcCkpCi0jZGVmaW5lIEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KF9wKSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0ICo+KF9wKSkKLQotI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX1NUT1JFMTYoX3AsIF92YWwpICgqcmVpbnRlcnByZXRfY2FzdDx1aW50MTYgKj4oX3ApID0gKF92YWwpKQotI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX1NUT1JFMzIoX3AsIF92YWwpICgqcmVpbnRlcnByZXRfY2FzdDx1aW50MzIgKj4oX3ApID0gKF92YWwpKQotI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX1NUT1JFNjQoX3AsIF92YWwpICgqcmVpbnRlcnByZXRfY2FzdDx1aW50NjQgKj4oX3ApID0gKF92YWwpKQotCi0jZWxzZQotaW5saW5lIHVpbnQxNiBHT09HTEVfVU5BTElHTkVEX0xPQUQxNihjb25zdCB2b2lkICpwKSB7Ci0gIHVpbnQxNiB0OwotICBtZW1jcHkoJnQsIHAsIHNpemVvZiB0KTsKLSAgcmV0dXJuIHQ7Ci19Ci0KLWlubGluZSB1aW50MzIgR09PR0xFX1VOQUxJR05FRF9MT0FEMzIoY29uc3Qgdm9pZCAqcCkgewotICB1aW50MzIgdDsKLSAgbWVtY3B5KCZ0LCBwLCBzaXplb2YgdCk7Ci0gIHJldHVybiB0OwotfQotCi1pbmxpbmUgdWludDY0IEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGNvbnN0IHZvaWQgKnApIHsKLSAgdWludDY0IHQ7Ci0gIG1lbWNweSgmdCwgcCwgc2l6ZW9mIHQpOwotICByZXR1cm4gdDsKLX0KLQotaW5saW5lIHZvaWQgR09PR0xFX1VOQUxJR05FRF9TVE9SRTE2KHZvaWQgKnAsIHVpbnQxNiB2KSB7Ci0gIG1lbWNweShwLCAmdiwgc2l6ZW9mIHYpOwotfQotCi1pbmxpbmUgdm9pZCBHT09HTEVfVU5BTElHTkVEX1NUT1JFMzIodm9pZCAqcCwgdWludDMyIHYpIHsKLSAgbWVtY3B5KHAsICZ2LCBzaXplb2Ygdik7Ci19Ci0KLWlubGluZSB2b2lkIEdPT0dMRV9VTkFMSUdORURfU1RPUkU2NCh2b2lkICpwLCB1aW50NjQgdikgewotICBtZW1jcHkocCwgJnYsIHNpemVvZiB2KTsKLX0KLSNlbmRpZgotCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikKLSNkZWZpbmUgR09PR0xFX1RIUkVBRF9MT0NBTCBfX2RlY2xzcGVjKHRocmVhZCkKLSNlbHNlCi0jZGVmaW5lIEdPT0dMRV9USFJFQURfTE9DQUwgX190aHJlYWQKLSNlbmRpZgotCi0vLyBUaGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgZGVjbGFyYXRpb24gb2YgdGhlIGJ5dGUgc3dhcCBmdW5jdGlvbnMsIGFuZAotLy8gZGVmaW5lcyBfX0JZVEVfT1JERVIgZm9yIE1TVkMKLSNpZmRlZiBfTVNDX1ZFUgotI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCi0jZGVmaW5lIGJzd2FwXzE2KHgpIF9ieXRlc3dhcF91c2hvcnQoeCkKLSNkZWZpbmUgYnN3YXBfMzIoeCkgX2J5dGVzd2FwX3Vsb25nKHgpCi0jZGVmaW5lIGJzd2FwXzY0KHgpIF9ieXRlc3dhcF91aW50NjQoeCkKLQotI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCi0vLyBNYWMgT1MgWCAvIERhcndpbiBmZWF0dXJlcwotI2RlZmluZSBic3dhcF8xNih4KSBPU1N3YXBJbnQxNih4KQotI2RlZmluZSBic3dhcF8zMih4KSBPU1N3YXBJbnQzMih4KQotI2RlZmluZSBic3dhcF82NCh4KSBPU1N3YXBJbnQ2NCh4KQotCi0jZWxpZiAhZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCi0KLXN0YXRpYyBpbmxpbmUgdWludDE2IGJzd2FwXzE2KHVpbnQxNiB4KSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KCgoeCAmIDB4RkYpIDw8IDgpIHwgKCh4ICYgMHhGRjAwKSA+PiA4KSk7Ci19Ci0jZGVmaW5lIGJzd2FwXzE2KHgpIGJzd2FwXzE2KHgpCi1zdGF0aWMgaW5saW5lIHVpbnQzMiBic3dhcF8zMih1aW50MzIgeCkgewotICByZXR1cm4gKCgoeCAmIDB4RkYpIDw8IDI0KSB8Ci0gICAgICAgICAgKCh4ICYgMHhGRjAwKSA8PCA4KSB8Ci0gICAgICAgICAgKCh4ICYgMHhGRjAwMDApID4+IDgpIHwKLSAgICAgICAgICAoKHggJiAweEZGMDAwMDAwKSA+PiAyNCkpOwotfQotI2RlZmluZSBic3dhcF8zMih4KSBic3dhcF8zMih4KQotc3RhdGljIGlubGluZSB1aW50NjQgYnN3YXBfNjQodWludDY0IHgpIHsKLSAgcmV0dXJuICgoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYpKSA8PCA1NikgfAotICAgICAgICAgICgoeCAmIEdPT0dMRV9VTE9OR0xPTkcoMHhGRjAwKSkgPDwgNDApIHwKLSAgICAgICAgICAoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYwMDAwKSkgPDwgMjQpIHwKLSAgICAgICAgICAoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYwMDAwMDApKSA8PCA4KSB8Ci0gICAgICAgICAgKCh4ICYgR09PR0xFX1VMT05HTE9ORygweEZGMDAwMDAwMDApKSA+PiA4KSB8Ci0gICAgICAgICAgKCh4ICYgR09PR0xFX1VMT05HTE9ORygweEZGMDAwMDAwMDAwMCkpID4+IDI0KSB8Ci0gICAgICAgICAgKCh4ICYgR09PR0xFX1VMT05HTE9ORygweEZGMDAwMDAwMDAwMDAwKSkgPj4gNDApIHwKLSAgICAgICAgICAoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYwMDAwMDAwMDAwMDAwMCkpID4+IDU2KSk7Ci19Ci0jZGVmaW5lIGJzd2FwXzY0KHgpIGJzd2FwXzY0KHgpCi0KLSNlbmRpZgotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBmcm9tIGdvb2dsZTMvdXRpbC9lbmRpYW4vZW5kaWFuLmgKLUxJQlBST1RPQlVGX0VYUE9SVCB1aW50MzIgZ2h0b25sKHVpbnQzMiB4KTsKLQotY2xhc3MgQmlnRW5kaWFuIHsKLSBwdWJsaWM6Ci0jaWZkZWYgUFJPVE9CVUZfTElUVExFX0VORElBTgotCi0gIHN0YXRpYyB1aW50MTYgRnJvbUhvc3QxNih1aW50MTYgeCkgeyByZXR1cm4gYnN3YXBfMTYoeCk7IH0KLSAgc3RhdGljIHVpbnQxNiBUb0hvc3QxNih1aW50MTYgeCkgeyByZXR1cm4gYnN3YXBfMTYoeCk7IH0KLQotICBzdGF0aWMgdWludDMyIEZyb21Ib3N0MzIodWludDMyIHgpIHsgcmV0dXJuIGJzd2FwXzMyKHgpOyB9Ci0gIHN0YXRpYyB1aW50MzIgVG9Ib3N0MzIodWludDMyIHgpIHsgcmV0dXJuIGJzd2FwXzMyKHgpOyB9Ci0KLSAgc3RhdGljIHVpbnQ2NCBGcm9tSG9zdDY0KHVpbnQ2NCB4KSB7IHJldHVybiBic3dhcF82NCh4KTsgfQotICBzdGF0aWMgdWludDY0IFRvSG9zdDY0KHVpbnQ2NCB4KSB7IHJldHVybiBic3dhcF82NCh4KTsgfQotCi0gIHN0YXRpYyBib29sIElzTGl0dGxlRW5kaWFuKCkgeyByZXR1cm4gdHJ1ZTsgfQotCi0jZWxzZQotCi0gIHN0YXRpYyB1aW50MTYgRnJvbUhvc3QxNih1aW50MTYgeCkgeyByZXR1cm4geDsgfQotICBzdGF0aWMgdWludDE2IFRvSG9zdDE2KHVpbnQxNiB4KSB7IHJldHVybiB4OyB9Ci0KLSAgc3RhdGljIHVpbnQzMiBGcm9tSG9zdDMyKHVpbnQzMiB4KSB7IHJldHVybiB4OyB9Ci0gIHN0YXRpYyB1aW50MzIgVG9Ib3N0MzIodWludDMyIHgpIHsgcmV0dXJuIHg7IH0KLQotICBzdGF0aWMgdWludDY0IEZyb21Ib3N0NjQodWludDY0IHgpIHsgcmV0dXJuIHg7IH0KLSAgc3RhdGljIHVpbnQ2NCBUb0hvc3Q2NCh1aW50NjQgeCkgeyByZXR1cm4geDsgfQotCi0gIHN0YXRpYyBib29sIElzTGl0dGxlRW5kaWFuKCkgeyByZXR1cm4gZmFsc2U7IH0KLQotI2VuZGlmIC8qIEVORElBTiAqLwotCi0gIC8vIEZ1bmN0aW9ucyB0byBkbyB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyBpbiBiaWctZW5kaWFuIG9yZGVyLgotICBzdGF0aWMgdWludDE2IExvYWQxNihjb25zdCB2b2lkICpwKSB7Ci0gICAgcmV0dXJuIFRvSG9zdDE2KEdPT0dMRV9VTkFMSUdORURfTE9BRDE2KHApKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIFN0b3JlMTYodm9pZCAqcCwgdWludDE2IHYpIHsKLSAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFMTYocCwgRnJvbUhvc3QxNih2KSk7Ci0gIH0KLQotICBzdGF0aWMgdWludDMyIExvYWQzMihjb25zdCB2b2lkICpwKSB7Ci0gICAgcmV0dXJuIFRvSG9zdDMyKEdPT0dMRV9VTkFMSUdORURfTE9BRDMyKHApKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIFN0b3JlMzIodm9pZCAqcCwgdWludDMyIHYpIHsKLSAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFMzIocCwgRnJvbUhvc3QzMih2KSk7Ci0gIH0KLQotICBzdGF0aWMgdWludDY0IExvYWQ2NChjb25zdCB2b2lkICpwKSB7Ci0gICAgcmV0dXJuIFRvSG9zdDY0KEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KHApKTsKLSAgfQotCi0gIHN0YXRpYyB2b2lkIFN0b3JlNjQodm9pZCAqcCwgdWludDY0IHYpIHsKLSAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFNjQocCwgRnJvbUhvc3Q2NCh2KSk7Ci0gIH0KLX07Ci0KLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg1YTExNzIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0NzAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIGZyb20gZ29vZ2xlMy91dGlsL2d0bC9zaGFyZWRfcHRyLmgKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU0hBUkVEX1BUUl9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NIQVJFRF9QVFJfSF9fCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmg+Ci0KLSNpbmNsdWRlIDxhbGdvcml0aG0+ICAvLyBmb3Igc3dhcAotI2luY2x1ZGUgPHN0ZGRlZi5oPgotI2luY2x1ZGUgPG1lbW9yeT4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQWxpYXMgdG8gc3RkOjpzaGFyZWRfcHRyIGZvciBhbnkgQysrMTEgcGxhdGZvcm0sCi0vLyBhbmQgZm9yIGFueSBzdXBwb3J0ZWQgTVNWQyBjb21waWxlci4KLSNpZiAhZGVmaW5lZChVVElMX0dUTF9VU0VfU1REX1NIQVJFRF9QVFIpICYmIFwKLSAgICAoZGVmaW5lZChDT01QSUxFUl9NU1ZDKSB8fCBkZWZpbmVkKExBTkdfQ1hYMTEpKQotI2RlZmluZSBVVElMX0dUTF9VU0VfU1REX1NIQVJFRF9QVFIgMQotI2VuZGlmCi0KLSNpZiBkZWZpbmVkKFVUSUxfR1RMX1VTRV9TVERfU0hBUkVEX1BUUikgJiYgVVRJTF9HVExfVVNFX1NURF9TSEFSRURfUFRSCi0KLS8vIFRoZXNlIGFyZSB0cmFuc2l0aW9uYWwuICBUaGV5IHdpbGwgYmUgZ29pbmcgYXdheSBzb29uLgotLy8gUGxlYXNlIGp1c3QgI2luY2x1ZGUgPG1lbW9yeT4gYW5kIGp1c3QgdHlwZSBzdGQ6OnNoYXJlZF9wdHIgeW91cnNlbGYsIGluc3RlYWQKLS8vIG9mIHJlbHlpbmcgb24gdGhpcyBmaWxlLgotLy8KLS8vIE1pZ3JhdGlvbiBkb2M6IGh0dHA6Ly9nby9zdGQtc2hhcmVkLXB0ci1sc2MKLXVzaW5nIHN0ZDo6ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM7Ci11c2luZyBzdGQ6OnNoYXJlZF9wdHI7Ci11c2luZyBzdGQ6OnN0YXRpY19wb2ludGVyX2Nhc3Q7Ci11c2luZyBzdGQ6OndlYWtfcHRyOwotCi0jZWxzZSAgLy8gYmVsb3csIFVUSUxfR1RMX1VTRV9TVERfU0hBUkVEX1BUUiBub3Qgc2V0IG9yIHNldCB0byAwLgotCi0vLyBGb3IgZXZlcnl0aGluZyBlbHNlIHRoZXJlIGlzIHRoZSBnb29nbGUzIGltcGxlbWVudGF0aW9uLgotaW5saW5lIGJvb2wgUmVmQ291bnREZWModm9sYXRpbGUgQXRvbWljMzIgKnB0cikgewotICByZXR1cm4gQmFycmllcl9BdG9taWNJbmNyZW1lbnQocHRyLCAtMSkgIT0gMDsKLX0KLQotaW5saW5lIHZvaWQgUmVmQ291bnRJbmModm9sYXRpbGUgQXRvbWljMzIgKnB0cikgewotICBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHB0ciwgMSk7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBzaGFyZWRfcHRyOwotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGNsYXNzIHdlYWtfcHRyOwotCi0vLyBUaGlzIGNsYXNzIGlzIGFuIGludGVybmFsIGltcGxlbWVudGF0aW9uIGRldGFpbCBmb3Igc2hhcmVkX3B0ci4gSWYgdHdvCi0vLyBzaGFyZWRfcHRycyBwb2ludCB0byB0aGUgc2FtZSBvYmplY3QsIHRoZXkgYWxzbyBzaGFyZSBhIGNvbnRyb2wgYmxvY2suCi0vLyBBbiAiZW1wdHkiIHNoYXJlZF9wb2ludGVyIHJlZmVycyB0byBOVUxMIGFuZCBhbHNvIGhhcyBhIE5VTEwgY29udHJvbCBibG9jay4KLS8vIEl0IGNvbnRhaW5zIGFsbCBvZiB0aGUgc3RhdGUgdGhhdCdzIG5lZWRlZCBmb3IgcmVmZXJlbmNlIGNvdW50aW5nIG9yIGFueQotLy8gb3RoZXIga2luZCBvZiByZXNvdXJjZSBtYW5hZ2VtZW50LiBJbiB0aGlzIGltcGxlbWVudGF0aW9uIHRoZSBjb250cm9sIGJsb2NrCi0vLyBoYXBwZW5zIHRvIGNvbnNpc3Qgb2YgdHdvIGF0b21pYyB3b3JkcywgdGhlIHJlZmVyZW5jZSBjb3VudCAodGhlIG51bWJlcgotLy8gb2Ygc2hhcmVkX3B0cnMgdGhhdCBzaGFyZSBvd25lcnNoaXAgb2YgdGhlIG9iamVjdCkgYW5kIHRoZSB3ZWFrIGNvdW50Ci0vLyAodGhlIG51bWJlciBvZiB3ZWFrX3B0cnMgdGhhdCBvYnNlcnZlIHRoZSBvYmplY3QsIHBsdXMgMSBpZiB0aGUKLS8vIHJlZmNvdW50IGlzIG5vbnplcm8pLgotLy8KLS8vIFRoZSAicGx1cyAxIiBpcyB0byBwcmV2ZW50IGEgcmFjZSBjb25kaXRpb24gaW4gdGhlIHNoYXJlZF9wdHIgYW5kCi0vLyB3ZWFrX3B0ciBkZXN0cnVjdG9ycy4gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhlIGNvbnRyb2wgYmxvY2sgaXMKLS8vIG9ubHkgZGVsZXRlZCBvbmNlLCBzbyB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSB0aGF0IGF0IG1vc3Qgb25lCi0vLyBvYmplY3Qgc2VlcyB0aGUgd2VhayBjb3VudCBkZWNyZW1lbnRlZCBmcm9tIDEgdG8gMC4KLWNsYXNzIFNoYXJlZFB0ckNvbnRyb2xCbG9jayB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3Mgc2hhcmVkX3B0cjsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IGZyaWVuZCBjbGFzcyB3ZWFrX3B0cjsKLSBwcml2YXRlOgotICBTaGFyZWRQdHJDb250cm9sQmxvY2soKSA6IHJlZmNvdW50XygxKSwgd2Vha19jb3VudF8oMSkgeyB9Ci0gIEF0b21pYzMyIHJlZmNvdW50XzsKLSAgQXRvbWljMzIgd2Vha19jb3VudF87Ci19OwotCi0vLyBGb3J3YXJkIGRlY2xhcmF0aW9uLiBUaGUgY2xhc3MgaXMgZGVmaW5lZCBiZWxvdy4KLXRlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyBzaGFyZWRfcHRyIHsKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+IGZyaWVuZCBjbGFzcyB3ZWFrX3B0cjsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgVCBlbGVtZW50X3R5cGU7Ci0KLSAgc2hhcmVkX3B0cigpIDogcHRyXyhOVUxMKSwgY29udHJvbF9ibG9ja18oTlVMTCkge30KLQotICBleHBsaWNpdCBzaGFyZWRfcHRyKFQqIHB0cikKLSAgICAgIDogcHRyXyhwdHIpLAotICAgICAgICBjb250cm9sX2Jsb2NrXyhwdHIgIT0gTlVMTCA/IG5ldyBTaGFyZWRQdHJDb250cm9sQmxvY2sgOiBOVUxMKSB7Ci0gICAgLy8gSWYgcCBpcyBub24tbnVsbCBhbmQgVCBpbmhlcml0cyBmcm9tIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLCB3ZQotICAgIC8vIHNldCB1cCB0aGUgZGF0YSB0aGF0IHNoYXJlZF9mcm9tX3RoaXMgbmVlZHMuCi0gICAgTWF5YmVTZXR1cFdlYWtUaGlzKHB0cik7Ci0gIH0KLQotICAvLyBDb3B5IGNvbnN0cnVjdG9yOiBtYWtlcyB0aGlzIG9iamVjdCBhIGNvcHkgb2YgcHRyLCBhbmQgaW5jcmVtZW50cwotICAvLyB0aGUgcmVmZXJlbmNlIGNvdW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KLSAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPFU+JiBwdHIpCi0gICAgICA6IHB0cl8oTlVMTCksCi0gICAgICAgIGNvbnRyb2xfYmxvY2tfKE5VTEwpIHsKLSAgICBJbml0aWFsaXplKHB0cik7Ci0gIH0KLSAgLy8gTmVlZCBub24tdGVtcGxhdGVkIHZlcnNpb24gdG8gcHJldmVudCB0aGUgY29tcGlsZXItZ2VuZXJhdGVkIGRlZmF1bHQKLSAgc2hhcmVkX3B0cihjb25zdCBzaGFyZWRfcHRyPFQ+JiBwdHIpCi0gICAgICA6IHB0cl8oTlVMTCksCi0gICAgICAgIGNvbnRyb2xfYmxvY2tfKE5VTEwpIHsKLSAgICBJbml0aWFsaXplKHB0cik7Ci0gIH0KLQotICAvLyBBc3NpZ25tZW50IG9wZXJhdG9yLiBSZXBsYWNlcyB0aGUgZXhpc3Rpbmcgc2hhcmVkX3B0ciB3aXRoIHB0ci4KLSAgLy8gSW5jcmVtZW50IHB0cidzIHJlZmVyZW5jZSBjb3VudCBhbmQgZGVjcmVtZW50IHRoZSBvbmUgYmVpbmcgcmVwbGFjZWQuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgotICBzaGFyZWRfcHRyPFQ+JiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0cjxVPiYgcHRyKSB7Ci0gICAgaWYgKHB0cl8gIT0gcHRyLnB0cl8pIHsKLSAgICAgIHNoYXJlZF9wdHI8VD4gbWUocHRyKTsgICAvLyB3aWxsIGhvbGQgb3VyIHByZXZpb3VzIHN0YXRlIHRvIGJlIGRlc3Ryb3llZC4KLSAgICAgIHN3YXAobWUpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBOZWVkIG5vbi10ZW1wbGF0ZWQgdmVyc2lvbiB0byBwcmV2ZW50IHRoZSBjb21waWxlci1nZW5lcmF0ZWQgZGVmYXVsdAotICBzaGFyZWRfcHRyPFQ+JiBvcGVyYXRvcj0oY29uc3Qgc2hhcmVkX3B0cjxUPiYgcHRyKSB7Ci0gICAgaWYgKHB0cl8gIT0gcHRyLnB0cl8pIHsKLSAgICAgIHNoYXJlZF9wdHI8VD4gbWUocHRyKTsgICAvLyB3aWxsIGhvbGQgb3VyIHByZXZpb3VzIHN0YXRlIHRvIGJlIGRlc3Ryb3llZC4KLSAgICAgIHN3YXAobWUpOwotICAgIH0KLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICAvLyBUT0RPKGF1c3Rlcm4pOiBDb25zaWRlciBwcm92aWRpbmcgdGhpcyBjb25zdHJ1Y3Rvci4gVGhlIGRyYWZ0IEMrKyBzdGFuZGFyZAotICAvLyAoMjAuOC4xMC4yLjEpIGluY2x1ZGVzIGl0LiBIb3dldmVyLCBpdCBzYXlzIHRoYXQgdGhpcyBjb25zdHJ1Y3RvciB0aHJvd3MKLSAgLy8gYSBiYWRfd2Vha19wdHIgZXhjZXB0aW9uIHdoZW4gcHRyIGlzIGV4cGlyZWQuIElzIGl0IGJldHRlciB0byBwcm92aWRlIHRoaXMKLSAgLy8gY29uc3RydWN0b3IgYW5kIG1ha2UgaXQgZG8gc29tZXRoaW5nIGVsc2UsIGxpa2UgZmFpbCB3aXRoIGEgQ0hFQ0ssIG9yIHRvCi0gIC8vIGxlYXZlIHRoaXMgY29uc3RydWN0b3Igb3V0IGVudGlyZWx5PwotICAvLwotICAvLyB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KLSAgLy8gc2hhcmVkX3B0cihjb25zdCB3ZWFrX3B0cjxVPiYgcHRyKTsKLQotICB+c2hhcmVkX3B0cigpIHsKLSAgICBpZiAocHRyXyAhPSBOVUxMKSB7Ci0gICAgICBpZiAoIVJlZkNvdW50RGVjKCZjb250cm9sX2Jsb2NrXy0+cmVmY291bnRfKSkgewotICAgICAgICBkZWxldGUgcHRyXzsKLQotICAgICAgICAvLyB3ZWFrX2NvdW50XyBpcyBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2Ygd2Vha19wdHJzIHRoYXQgb2JzZXJ2ZQotICAgICAgICAvLyBwdHJfLCBwbHVzIDEgaWYgcmVmY291bnRfIGlzIG5vbnplcm8uCi0gICAgICAgIGlmICghUmVmQ291bnREZWMoJmNvbnRyb2xfYmxvY2tfLT53ZWFrX2NvdW50XykpIHsKLSAgICAgICAgICBkZWxldGUgY29udHJvbF9ibG9ja187Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyBSZXBsYWNlcyB1bmRlcmx5aW5nIHJhdyBwb2ludGVyIHdpdGggdGhlIG9uZSBwYXNzZWQgaW4uICBUaGUgcmVmZXJlbmNlCi0gIC8vIGNvdW50IGlzIHNldCB0byBvbmUgKG9yIHplcm8gaWYgdGhlIHBvaW50ZXIgaXMgTlVMTCkgZm9yIHRoZSBwb2ludGVyCi0gIC8vIGJlaW5nIHBhc3NlZCBpbiBhbmQgZGVjcmVtZW50ZWQgZm9yIHRoZSBvbmUgYmVpbmcgcmVwbGFjZWQuCi0gIC8vCi0gIC8vIElmIHlvdSBoYXZlIGEgY29tcGlsYXRpb24gZXJyb3Igd2l0aCB0aGlzIGNvZGUsIG1ha2Ugc3VyZSB5b3UgYXJlbid0Ci0gIC8vIHBhc3NpbmcgTlVMTCwgbnVsbHB0ciwgb3IgMCB0byB0aGlzIGZ1bmN0aW9uLiAgQ2FsbCByZXNldCB3aXRob3V0IGFuCi0gIC8vIGFyZ3VtZW50IHRvIHJlc2V0IHRvIGEgbnVsbCBwdHIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBZPgotICB2b2lkIHJlc2V0KFkqIHApIHsKLSAgICBpZiAocCAhPSBwdHJfKSB7Ci0gICAgICBzaGFyZWRfcHRyPFQ+IHRtcChwKTsKLSAgICAgIHRtcC5zd2FwKCp0aGlzKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIHJlc2V0KCkgewotICAgIHJlc2V0KHN0YXRpY19jYXN0PFQqPihOVUxMKSk7Ci0gIH0KLQotICAvLyBFeGNoYW5nZXMgdGhlIGNvbnRlbnRzIG9mIHRoaXMgd2l0aCB0aGUgY29udGVudHMgb2Ygci4gIFRoaXMgZnVuY3Rpb24KLSAgLy8gc3VwcG9ydHMgbW9yZSBlZmZpY2llbnQgc3dhcHBpbmcgc2luY2UgaXQgZWxpbWluYXRlcyB0aGUgbmVlZCBmb3IgYQotICAvLyB0ZW1wb3Jhcnkgc2hhcmVkX3B0ciBvYmplY3QuCi0gIHZvaWQgc3dhcChzaGFyZWRfcHRyPFQ+JiByKSB7Ci0gICAgdXNpbmcgc3RkOjpzd2FwOyAgLy8gaHR0cDovL2dvL3VzaW5nLXN0ZC1zd2FwCi0gICAgc3dhcChwdHJfLCByLnB0cl8pOwotICAgIHN3YXAoY29udHJvbF9ibG9ja18sIHIuY29udHJvbF9ibG9ja18pOwotICB9Ci0KLSAgLy8gVGhlIGZvbGxvd2luZyBmdW5jdGlvbiBpcyB1c2VmdWwgZm9yIGdhaW5pbmcgYWNjZXNzIHRvIHRoZSB1bmRlcmx5aW5nCi0gIC8vIHBvaW50ZXIgd2hlbiBhIHNoYXJlZF9wdHIgcmVtYWlucyBpbiBzY29wZSBzbyB0aGUgcmVmZXJlbmNlLWNvdW50IGlzCi0gIC8vIGtub3duIHRvIGJlID4gMCAoZS5nLiBmb3IgcGFyYW1ldGVyIHBhc3NpbmcpLgotICBUKiBnZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHB0cl87Ci0gIH0KLQotICBUJiBvcGVyYXRvciooKSBjb25zdCB7Ci0gICAgcmV0dXJuICpwdHJfOwotICB9Ci0KLSAgVCogb3BlcmF0b3ItPigpIGNvbnN0IHsKLSAgICByZXR1cm4gcHRyXzsKLSAgfQotCi0gIGxvbmcgdXNlX2NvdW50KCkgY29uc3QgewotICAgIHJldHVybiBjb250cm9sX2Jsb2NrXyA/IGNvbnRyb2xfYmxvY2tfLT5yZWZjb3VudF8gOiAxOwotICB9Ci0KLSAgYm9vbCB1bmlxdWUoKSBjb25zdCB7Ci0gICAgcmV0dXJuIHVzZV9jb3VudCgpID09IDE7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIC8vIElmIHIgaXMgbm9uLWVtcHR5LCBpbml0aWFsaXplICp0aGlzIHRvIHNoYXJlIG93bmVyc2hpcCB3aXRoIHIsCi0gIC8vIGluY3JlYXNpbmcgdGhlIHVuZGVybHlpbmcgcmVmZXJlbmNlIGNvdW50LgotICAvLyBJZiByIGlzIGVtcHR5LCAqdGhpcyByZW1haW5zIGVtcHR5LgotICAvLyBSZXF1aXJlczogdGhpcyBpcyBlbXB0eSwgbmFtZWx5IHRoaXMtPnB0cl8gPT0gTlVMTC4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gIHZvaWQgSW5pdGlhbGl6ZShjb25zdCBzaGFyZWRfcHRyPFU+JiByKSB7Ci0gICAgLy8gVGhpcyBwZXJmb3JtcyBhIHN0YXRpY19jYXN0IG9uIHIucHRyXyB0byBVKiwgd2hpY2ggaXMgYSBuby1vcCBzaW5jZSBpdAotICAgIC8vIGlzIGFscmVhZHkgYSBVKi4gU28gaW5pdGlhbGl6YXRpb24gaGVyZSByZXF1aXJlcyB0aGF0IHIucHRyXyBpcwotICAgIC8vIGltcGxpY2l0bHkgY29udmVydGlibGUgdG8gVCouCi0gICAgSW5pdGlhbGl6ZVdpdGhTdGF0aWNDYXN0PFU+KHIpOwotICB9Ci0KLSAgLy8gSW5pdGlhbGl6ZXMgKnRoaXMgYXMgZGVzY3JpYmVkIGluIEluaXRpYWxpemUsIGJ1dCBhZGRpdGlvbmFsbHkgcGVyZm9ybXMgYQotICAvLyBzdGF0aWNfY2FzdCBmcm9tIHIucHRyXyAoViopIHRvIFUqLgotICAvLyBOT1RFKGdmYyk6IFdlJ2QgbmVlZCBhIG1vcmUgZ2VuZXJhbCBmb3JtIHRvIHN1cHBvcnQgY29uc3RfcG9pbnRlcl9jYXN0IGFuZAotICAvLyBkeW5hbWljX3BvaW50ZXJfY2FzdCwgYnV0IHRob3NlIG9wZXJhdGlvbnMgYXJlIHN1ZmZpY2llbnRseSBkaXNjb3VyYWdlZAotICAvLyB0aGF0IHN1cHBvcnRpbmcgc3RhdGljX3BvaW50ZXJfY2FzdCBpcyBzdWZmaWNpZW50LgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4KLSAgdm9pZCBJbml0aWFsaXplV2l0aFN0YXRpY0Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxWPiYgcikgewotICAgIGlmIChyLmNvbnRyb2xfYmxvY2tfICE9IE5VTEwpIHsKLSAgICAgIFJlZkNvdW50SW5jKCZyLmNvbnRyb2xfYmxvY2tfLT5yZWZjb3VudF8pOwotCi0gICAgICBwdHJfID0gc3RhdGljX2Nhc3Q8VSo+KHIucHRyXyk7Ci0gICAgICBjb250cm9sX2Jsb2NrXyA9IHIuY29udHJvbF9ibG9ja187Ci0gICAgfQotICB9Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9uIGZvciB0aGUgY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIHJhdyBwb2ludGVyLiBJZiBUCi0gIC8vIGRvZXNuJ3QgaW5oZXJpdCBmcm9tIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFQ+IHRoZW4gd2UgaGF2ZSBub3RoaW5nIHRvCi0gIC8vIGRvLCBzbyB0aGlzIGZ1bmN0aW9uIGlzIHRyaXZpYWwgYW5kIGlubGluZS4gVGhlIG90aGVyIHZlcnNpb24gaXMgZGVjbGFyZWQKLSAgLy8gb3V0IG9mIGxpbmUsIGFmdGVyIHRoZSBjbGFzcyBkZWZpbml0aW9uIG9mIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzLgotICB2b2lkIE1heWJlU2V0dXBXZWFrVGhpcyhlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxUPiogcHRyKTsKLSAgdm9pZCBNYXliZVNldHVwV2Vha1RoaXMoLi4uKSB7IH0KLQotICBUKiBwdHJfOwotICBTaGFyZWRQdHJDb250cm9sQmxvY2sqIGNvbnRyb2xfYmxvY2tfOwotCi0jaWZuZGVmIFNXSUcKLSAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+Ci0gIGZyaWVuZCBjbGFzcyBzaGFyZWRfcHRyOwotCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVLCB0eXBlbmFtZSBWPgotICBmcmllbmQgc2hhcmVkX3B0cjxVPiBzdGF0aWNfcG9pbnRlcl9jYXN0KGNvbnN0IHNoYXJlZF9wdHI8Vj4mIHJocyk7Ci0jZW5kaWYKLX07Ci0KLS8vIE1hdGNoZXMgdGhlIGludGVyZmFjZSBvZiBzdGQ6OnN3YXAgYXMgYW4gYWlkIHRvIGdlbmVyaWMgcHJvZ3JhbW1pbmcuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gdm9pZCBzd2FwKHNoYXJlZF9wdHI8VD4mIHIsIHNoYXJlZF9wdHI8VD4mIHMpIHsKLSAgci5zd2FwKHMpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgVT4KLXNoYXJlZF9wdHI8VD4gc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPFU+JiByaHMpIHsKLSAgc2hhcmVkX3B0cjxUPiBsaHM7Ci0gIGxocy50ZW1wbGF0ZSBJbml0aWFsaXplV2l0aFN0YXRpY0Nhc3Q8VD4ocmhzKTsKLSAgcmV0dXJuIGxoczsKLX0KLQotLy8gU2VlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgZm9yIGEgZGVzY3JpcHRpb24gb2Ygd2h5IHRoaXMKLS8vIGNsYXNzIGV4aXN0cywgYW5kIHRoZSBkcmFmdCBDKysgc3RhbmRhcmQgKGFzIG9mIEp1bHkgMjAwOSB0aGUKLS8vIGxhdGVzdCBkcmFmdCBpcyBOMjkxNCkgZm9yIHRoZSBkZXRhaWxlZCBzcGVjaWZpY2F0aW9uLgotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+Ci1jbGFzcyB3ZWFrX3B0ciB7Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBmcmllbmQgY2xhc3Mgd2Vha19wdHI7Ci0gcHVibGljOgotICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOwotCi0gIC8vIENyZWF0ZSBhbiBlbXB0eSAoaS5lLiBhbHJlYWR5IGV4cGlyZWQpIHdlYWtfcHRyLgotICB3ZWFrX3B0cigpIDogcHRyXyhOVUxMKSwgY29udHJvbF9ibG9ja18oTlVMTCkgeyB9Ci0KLSAgLy8gQ3JlYXRlIGEgd2Vha19wdHIgdGhhdCBvYnNlcnZlcyB0aGUgc2FtZSBvYmplY3QgdGhhdCBwdHIgcG9pbnRzCi0gIC8vIHRvLiAgTm90ZSB0aGF0IHRoZXJlIGlzIG5vIHJhY2UgY29uZGl0aW9uIGhlcmU6IHdlIGtub3cgdGhhdCB0aGUKLSAgLy8gY29udHJvbCBibG9jayBjYW4ndCBkaXNhcHBlYXIgd2hpbGUgd2UncmUgbG9va2luZyBhdCBpdCBiZWNhdXNlCi0gIC8vIGl0IGlzIG93bmVkIGJ5IGF0IGxlYXN0IG9uZSBzaGFyZWRfcHRyLCBwdHIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiB3ZWFrX3B0cihjb25zdCBzaGFyZWRfcHRyPFU+JiBwdHIpIHsKLSAgICBDb3B5RnJvbShwdHIucHRyXywgcHRyLmNvbnRyb2xfYmxvY2tfKTsKLSAgfQotCi0gIC8vIENvcHkgYSB3ZWFrX3B0ci4gVGhlIG9iamVjdCBpdCBwb2ludHMgdG8gbWlnaHQgZGlzYXBwZWFyLCBidXQgd2UKLSAgLy8gZG9uJ3QgY2FyZTogd2UncmUgb25seSB3b3JraW5nIHdpdGggdGhlIGNvbnRyb2wgYmxvY2ssIGFuZCBpdCBjYW4ndAotICAvLyBkaXNhcHBlYXIgd2hpbGUgd2UncmUgbG9va2luZyBhdCBiZWNhdXNlIGl0J3Mgb3duZWQgYnkgYXQgbGVhc3Qgb25lCi0gIC8vIHdlYWtfcHRyLCBwdHIuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiB3ZWFrX3B0cihjb25zdCB3ZWFrX3B0cjxVPiYgcHRyKSB7Ci0gICAgQ29weUZyb20ocHRyLnB0cl8sIHB0ci5jb250cm9sX2Jsb2NrXyk7Ci0gIH0KLQotICAvLyBOZWVkIG5vbi10ZW1wbGF0ZWQgdmVyc2lvbiB0byBwcmV2ZW50IGRlZmF1bHQgY29weSBjb25zdHJ1Y3RvcgotICB3ZWFrX3B0cihjb25zdCB3ZWFrX3B0ciYgcHRyKSB7Ci0gICAgQ29weUZyb20ocHRyLnB0cl8sIHB0ci5jb250cm9sX2Jsb2NrXyk7Ci0gIH0KLQotICAvLyBEZXN0cm95IHRoZSB3ZWFrX3B0ci4gSWYgbm8gc2hhcmVkX3B0ciBvd25zIHRoZSBjb250cm9sIGJsb2NrLCBhbmQgaWYKLSAgLy8gd2UgYXJlIHRoZSBsYXN0IHdlYWtfcHRyIHRvIG93biBpdCwgdGhlbiBpdCBjYW4gYmUgZGVsZXRlZC4gTm90ZSB0aGF0Ci0gIC8vIHdlYWtfY291bnRfIGlzIGRlZmluZWQgYXMgdGhlIG51bWJlciBvZiB3ZWFrX3B0cnMgc2hhcmluZyB0aGlzIGNvbnRyb2wKLSAgLy8gYmxvY2ssIHBsdXMgMSBpZiB0aGVyZSBhcmUgYW55IHNoYXJlZF9wdHJzLiBXZSB0aGVyZWZvcmUga25vdyB0aGF0IGl0J3MKLSAgLy8gc2FmZSB0byBkZWxldGUgdGhlIGNvbnRyb2wgYmxvY2sgd2hlbiB3ZWFrX2NvdW50XyByZWFjaGVzIDAsIHdpdGhvdXQKLSAgLy8gaGF2aW5nIHRvIHBlcmZvcm0gYW55IGFkZGl0aW9uYWwgdGVzdHMuCi0gIH53ZWFrX3B0cigpIHsKLSAgICBpZiAoY29udHJvbF9ibG9ja18gIT0gTlVMTCAmJgotICAgICAgICAhUmVmQ291bnREZWMoJmNvbnRyb2xfYmxvY2tfLT53ZWFrX2NvdW50XykpIHsKLSAgICAgIGRlbGV0ZSBjb250cm9sX2Jsb2NrXzsKLSAgICB9Ci0gIH0KLQotICB3ZWFrX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHdlYWtfcHRyJiBwdHIpIHsKLSAgICBpZiAoJnB0ciAhPSB0aGlzKSB7Ci0gICAgICB3ZWFrX3B0ciB0bXAocHRyKTsKLSAgICAgIHRtcC5zd2FwKCp0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiB3ZWFrX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHdlYWtfcHRyPFU+JiBwdHIpIHsKLSAgICB3ZWFrX3B0ciB0bXAocHRyKTsKLSAgICB0bXAuc3dhcCgqdGhpcyk7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiB3ZWFrX3B0ciYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHI8VT4mIHB0cikgewotICAgIHdlYWtfcHRyIHRtcChwdHIpOwotICAgIHRtcC5zd2FwKCp0aGlzKTsKLSAgICByZXR1cm4gKnRoaXM7Ci0gIH0KLQotICB2b2lkIHN3YXAod2Vha19wdHImIHB0cikgewotICAgIHVzaW5nIHN0ZDo6c3dhcDsgIC8vIGh0dHA6Ly9nby91c2luZy1zdGQtc3dhcAotICAgIHN3YXAocHRyXywgcHRyLnB0cl8pOwotICAgIHN3YXAoY29udHJvbF9ibG9ja18sIHB0ci5jb250cm9sX2Jsb2NrXyk7Ci0gIH0KLQotICB2b2lkIHJlc2V0KCkgewotICAgIHdlYWtfcHRyIHRtcDsKLSAgICB0bXAuc3dhcCgqdGhpcyk7Ci0gIH0KLQotICAvLyBSZXR1cm4gdGhlIG51bWJlciBvZiBzaGFyZWRfcHRycyB0aGF0IG93biB0aGUgb2JqZWN0IHdlIGFyZSBvYnNlcnZpbmcuCi0gIC8vIE5vdGUgdGhhdCB0aGlzIG51bWJlciBjYW4gYmUgMCAoaWYgdGhpcyBwb2ludGVyIGhhcyBleHBpcmVkKS4KLSAgbG9uZyB1c2VfY291bnQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGNvbnRyb2xfYmxvY2tfICE9IE5VTEwgPyBjb250cm9sX2Jsb2NrXy0+cmVmY291bnRfIDogMDsKLSAgfQotCi0gIGJvb2wgZXhwaXJlZCgpIGNvbnN0IHsgcmV0dXJuIHVzZV9jb3VudCgpID09IDA7IH0KLQotICAvLyBSZXR1cm4gYSBzaGFyZWRfcHRyIHRoYXQgb3ducyB0aGUgb2JqZWN0IHdlIGFyZSBvYnNlcnZpbmcuIElmIHdlCi0gIC8vIGhhdmUgZXhwaXJlZCwgdGhlIHNoYXJlZF9wdHIgd2lsbCBiZSBlbXB0eS4gV2UgaGF2ZSB0byBiZSBjYXJlZnVsCi0gIC8vIGFib3V0IGNvbmN1cnJlbmN5LCB0aG91Z2gsIHNpbmNlIHNvbWUgb3RoZXIgdGhyZWFkIG1pZ2h0IGJlCi0gIC8vIGRlc3Ryb3lpbmcgdGhlIGxhc3Qgb3duaW5nIHNoYXJlZF9wdHIgd2hpbGUgd2UncmUgaW4gdGhpcwotICAvLyBmdW5jdGlvbi4gIFdlIHdhbnQgdG8gaW5jcmVtZW50IHRoZSByZWZjb3VudCBvbmx5IGlmIGl0J3Mgbm9uemVybwotICAvLyBhbmQgZ2V0IHRoZSBuZXcgdmFsdWUsIGFuZCB3ZSB3YW50IHRoYXQgd2hvbGUgb3BlcmF0aW9uIHRvIGJlCi0gIC8vIGF0b21pYy4KLSAgc2hhcmVkX3B0cjxUPiBsb2NrKCkgY29uc3QgewotICAgIHNoYXJlZF9wdHI8VD4gcmVzdWx0OwotICAgIGlmIChjb250cm9sX2Jsb2NrXyAhPSBOVUxMKSB7Ci0gICAgICBBdG9taWMzMiBvbGRfcmVmY291bnQ7Ci0gICAgICBkbyB7Ci0gICAgICAgIG9sZF9yZWZjb3VudCA9IGNvbnRyb2xfYmxvY2tfLT5yZWZjb3VudF87Ci0gICAgICAgIGlmIChvbGRfcmVmY291bnQgPT0gMCkKLSAgICAgICAgICBicmVhazsKLSAgICAgIH0gd2hpbGUgKG9sZF9yZWZjb3VudCAhPQotICAgICAgICAgICAgICAgTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKAotICAgICAgICAgICAgICAgICAgICZjb250cm9sX2Jsb2NrXy0+cmVmY291bnRfLCBvbGRfcmVmY291bnQsCi0gICAgICAgICAgICAgICAgICAgb2xkX3JlZmNvdW50ICsgMSkpOwotICAgICAgaWYgKG9sZF9yZWZjb3VudCA+IDApIHsKLSAgICAgICAgcmVzdWx0LnB0cl8gPSBwdHJfOwotICAgICAgICByZXN1bHQuY29udHJvbF9ibG9ja18gPSBjb250cm9sX2Jsb2NrXzsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSBwcml2YXRlOgotICB2b2lkIENvcHlGcm9tKFQqIHB0ciwgU2hhcmVkUHRyQ29udHJvbEJsb2NrKiBjb250cm9sX2Jsb2NrKSB7Ci0gICAgcHRyXyA9IHB0cjsKLSAgICBjb250cm9sX2Jsb2NrXyA9IGNvbnRyb2xfYmxvY2s7Ci0gICAgaWYgKGNvbnRyb2xfYmxvY2tfICE9IE5VTEwpCi0gICAgICBSZWZDb3VudEluYygmY29udHJvbF9ibG9ja18tPndlYWtfY291bnRfKTsKLSAgfQotCi0gcHJpdmF0ZToKLSAgZWxlbWVudF90eXBlKiBwdHJfOwotICBTaGFyZWRQdHJDb250cm9sQmxvY2sqIGNvbnRyb2xfYmxvY2tfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgc3dhcCh3ZWFrX3B0cjxUPiYgciwgd2Vha19wdHI8VD4mIHMpIHsKLSAgci5zd2FwKHMpOwotfQotCi0vLyBTZWUgY29tbWVudHMgYXQgdGhlIHRvcCBvZiB0aGUgZmlsZSBmb3IgYSBkZXNjcmlwdGlvbiBvZiB3aHkgdGhpcyBjbGFzcwotLy8gZXhpc3RzLCBhbmQgc2VjdGlvbiAyMC44LjEwLjUgb2YgdGhlIGRyYWZ0IEMrKyBzdGFuZGFyZCAoYXMgb2YgSnVseSAyMDA5Ci0vLyB0aGUgbGF0ZXN0IGRyYWZ0IGlzIE4yOTE0KSBmb3IgdGhlIGRldGFpbGVkIHNwZWNpZmljYXRpb24uCi10ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KLWNsYXNzIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzIHsKLSAgZnJpZW5kIGNsYXNzIHNoYXJlZF9wdHI8VD47Ci0gcHVibGljOgotICAvLyBQcmVjb25kaXRpb246IHRoZXJlIG11c3QgYmUgYSBzaGFyZWRfcHRyIHRoYXQgb3ducyAqdGhpcyBhbmQgdGhhdCB3YXMKLSAgLy8gY3JlYXRlZCwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseSwgZnJvbSBhIHJhdyBwb2ludGVyIG9mIHR5cGUgVCouIChUaGUKLSAgLy8gbGF0dGVyIHBhcnQgb2YgdGhlIGNvbmRpdGlvbiBpcyB0ZWNobmljYWwgYnV0IG5vdCBxdWl0ZSByZWR1bmRhbnQ7IGl0Ci0gIC8vIHJ1bGVzIG91dCBzb21lIGNvbXBsaWNhdGVkIHVzZXMgaW52b2x2aW5nIGluaGVyaXRhbmNlIGhpZXJhcmNoaWVzLikKLSAgc2hhcmVkX3B0cjxUPiBzaGFyZWRfZnJvbV90aGlzKCkgewotICAgIC8vIEJlaGF2aW9yIGlzIHVuZGVmaW5lZCBpZiB0aGUgcHJlY29uZGl0aW9uIGlzbid0IHNhdGlzZmllZDsgd2UgY2hvb3NlCi0gICAgLy8gdG8gZGllIHdpdGggYSBDSEVDSyBmYWlsdXJlLgotICAgIENIRUNLKCF3ZWFrX3RoaXNfLmV4cGlyZWQoKSkgPDwgIk5vIHNoYXJlZF9wdHIgb3ducyB0aGlzIG9iamVjdCI7Ci0gICAgcmV0dXJuIHdlYWtfdGhpc18ubG9jaygpOwotICB9Ci0gIHNoYXJlZF9wdHI8Y29uc3QgVD4gc2hhcmVkX2Zyb21fdGhpcygpIGNvbnN0IHsKLSAgICBDSEVDSyghd2Vha190aGlzXy5leHBpcmVkKCkpIDw8ICJObyBzaGFyZWRfcHRyIG93bnMgdGhpcyBvYmplY3QiOwotICAgIHJldHVybiB3ZWFrX3RoaXNfLmxvY2soKTsKLSAgfQotCi0gcHJvdGVjdGVkOgotICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQotICBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyhjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYgLypvdGhlciovKSB7IH0KLSAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmIG9wZXJhdG9yPShjb25zdCBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyYgLypvdGhlciovKSB7Ci0gICAgcmV0dXJuICp0aGlzOwotICB9Ci0gIH5lbmFibGVfc2hhcmVkX2Zyb21fdGhpcygpIHsgfQotCi0gcHJpdmF0ZToKLSAgd2Vha19wdHI8VD4gd2Vha190aGlzXzsKLX07Ci0KLS8vIFRoaXMgaXMgYSBoZWxwZXIgZnVuY3Rpb24gY2FsbGVkIGJ5IHNoYXJlZF9wdHIncyBjb25zdHJ1Y3RvciBmcm9tIGEgcmF3Ci0vLyBwb2ludGVyLiBJZiBUIGluaGVyaXRzIGZyb20gZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8VD4sIGl0IHNldHMgdXAKLS8vIHdlYWtfdGhpc18gc28gdGhhdCBzaGFyZWRfZnJvbV90aGlzIHdvcmtzIGNvcnJlY3RseS4gSWYgVCBkb2VzIG5vdCBpbmhlcml0Ci0vLyBmcm9tIHdlYWtfdGhpcyB3ZSBnZXQgYSBkaWZmZXJlbnQgb3ZlcmxvYWQsIGRlZmluZWQgaW5saW5lLCB3aGljaCBkb2VzCi0vLyBub3RoaW5nLgotdGVtcGxhdGU8dHlwZW5hbWUgVD4KLXZvaWQgc2hhcmVkX3B0cjxUPjo6TWF5YmVTZXR1cFdlYWtUaGlzKGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFQ+KiBwdHIpIHsKLSAgaWYgKHB0cikgewotICAgIENIRUNLKHB0ci0+d2Vha190aGlzXy5leHBpcmVkKCkpIDw8ICJPYmplY3QgYWxyZWFkeSBvd25lZCBieSBhIHNoYXJlZF9wdHIiOwotICAgIHB0ci0+d2Vha190aGlzXyA9ICp0aGlzOwotICB9Ci19Ci0KLSNlbmRpZiAgLy8gVVRJTF9HVExfVVNFX1NURF9TSEFSRURfUFRSCi0KLX0gIC8vIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU0hBUkVEX1BUUl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1ZTNiZGMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMzcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgotCi0jaW5jbHVkZSA8b3N0cmVhbT4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx1dGlsaXR5PgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgdXRpbCB7Ci1uYW1lc3BhY2UgZXJyb3IgewotaW5saW5lIHN0cmluZyBDb2RlRW51bVRvU3RyaW5nKGVycm9yOjpDb2RlIGNvZGUpIHsKLSAgc3dpdGNoIChjb2RlKSB7Ci0gICAgY2FzZSBPSzoKLSAgICAgIHJldHVybiAiT0siOwotICAgIGNhc2UgQ0FOQ0VMTEVEOgotICAgICAgcmV0dXJuICJDQU5DRUxMRUQiOwotICAgIGNhc2UgVU5LTk9XTjoKLSAgICAgIHJldHVybiAiVU5LTk9XTiI7Ci0gICAgY2FzZSBJTlZBTElEX0FSR1VNRU5UOgotICAgICAgcmV0dXJuICJJTlZBTElEX0FSR1VNRU5UIjsKLSAgICBjYXNlIERFQURMSU5FX0VYQ0VFREVEOgotICAgICAgcmV0dXJuICJERUFETElORV9FWENFRURFRCI7Ci0gICAgY2FzZSBOT1RfRk9VTkQ6Ci0gICAgICByZXR1cm4gIk5PVF9GT1VORCI7Ci0gICAgY2FzZSBBTFJFQURZX0VYSVNUUzoKLSAgICAgIHJldHVybiAiQUxSRUFEWV9FWElTVFMiOwotICAgIGNhc2UgUEVSTUlTU0lPTl9ERU5JRUQ6Ci0gICAgICByZXR1cm4gIlBFUk1JU1NJT05fREVOSUVEIjsKLSAgICBjYXNlIFVOQVVUSEVOVElDQVRFRDoKLSAgICAgIHJldHVybiAiVU5BVVRIRU5USUNBVEVEIjsKLSAgICBjYXNlIFJFU09VUkNFX0VYSEFVU1RFRDoKLSAgICAgIHJldHVybiAiUkVTT1VSQ0VfRVhIQVVTVEVEIjsKLSAgICBjYXNlIEZBSUxFRF9QUkVDT05ESVRJT046Ci0gICAgICByZXR1cm4gIkZBSUxFRF9QUkVDT05ESVRJT04iOwotICAgIGNhc2UgQUJPUlRFRDoKLSAgICAgIHJldHVybiAiQUJPUlRFRCI7Ci0gICAgY2FzZSBPVVRfT0ZfUkFOR0U6Ci0gICAgICByZXR1cm4gIk9VVF9PRl9SQU5HRSI7Ci0gICAgY2FzZSBVTklNUExFTUVOVEVEOgotICAgICAgcmV0dXJuICJVTklNUExFTUVOVEVEIjsKLSAgICBjYXNlIElOVEVSTkFMOgotICAgICAgcmV0dXJuICJJTlRFUk5BTCI7Ci0gICAgY2FzZSBVTkFWQUlMQUJMRToKLSAgICAgIHJldHVybiAiVU5BVkFJTEFCTEUiOwotICAgIGNhc2UgREFUQV9MT1NTOgotICAgICAgcmV0dXJuICJEQVRBX0xPU1MiOwotICB9Ci0KLSAgLy8gTm8gZGVmYXVsdCBjbGF1c2UsIGNsYW5nIHdpbGwgYWJvcnQgaWYgYSBjb2RlIGlzIG1pc3NpbmcgZnJvbQotICAvLyBhYm92ZSBzd2l0Y2guCi0gIHJldHVybiAiVU5LTk9XTiI7Ci19Ci19ICAvLyBuYW1lc3BhY2UgZXJyb3IuCi0KLWNvbnN0IFN0YXR1c1BvZCBTdGF0dXM6Ok9LID0geyBlcnJvcjo6T0sgfTsKLWNvbnN0IFN0YXR1c1BvZCBTdGF0dXM6OkNBTkNFTExFRCA9IHsgZXJyb3I6OkNBTkNFTExFRCB9OwotY29uc3QgU3RhdHVzUG9kIFN0YXR1czo6VU5LTk9XTiA9IHsgZXJyb3I6OlVOS05PV04gfTsKLQotU3RhdHVzOjpTdGF0dXMoKSA6IGVycm9yX2NvZGVfKGVycm9yOjpPSykgewotfQotCi1TdGF0dXM6OlN0YXR1cyhlcnJvcjo6Q29kZSBlcnJvcl9jb2RlLCBTdHJpbmdQaWVjZSBlcnJvcl9tZXNzYWdlKQotICAgIDogZXJyb3JfY29kZV8oZXJyb3JfY29kZSkgewotICBpZiAoZXJyb3JfY29kZSAhPSBlcnJvcjo6T0spIHsKLSAgICBlcnJvcl9tZXNzYWdlXyA9IGVycm9yX21lc3NhZ2UuVG9TdHJpbmcoKTsKLSAgfQotfQotCi1TdGF0dXM6OlN0YXR1cyhjb25zdCBTdGF0dXMmIG90aGVyKQotICAgIDogZXJyb3JfY29kZV8ob3RoZXIuZXJyb3JfY29kZV8pLCBlcnJvcl9tZXNzYWdlXyhvdGhlci5lcnJvcl9tZXNzYWdlXykgewotfQotCi1TdGF0dXM6OlN0YXR1cyhjb25zdCBTdGF0dXNQb2QmIHN0YXR1c19wb2QpIDogZXJyb3JfY29kZV8oc3RhdHVzX3BvZC5jb2RlKSB7Ci19Ci0KLVN0YXR1cyYgU3RhdHVzOjpvcGVyYXRvcj0oY29uc3QgU3RhdHVzJiBvdGhlcikgewotICBlcnJvcl9jb2RlXyA9IG90aGVyLmVycm9yX2NvZGVfOwotICBlcnJvcl9tZXNzYWdlXyA9IG90aGVyLmVycm9yX21lc3NhZ2VfOwotICByZXR1cm4gKnRoaXM7Ci19Ci0KLWJvb2wgU3RhdHVzOjpvcGVyYXRvcj09KGNvbnN0IFN0YXR1cyYgeCkgY29uc3QgewotICByZXR1cm4gZXJyb3JfY29kZV8gPT0geC5lcnJvcl9jb2RlXyAmJgotICAgICAgZXJyb3JfbWVzc2FnZV8gPT0geC5lcnJvcl9tZXNzYWdlXzsKLX0KLQotc3RyaW5nIFN0YXR1czo6VG9TdHJpbmcoKSBjb25zdCB7Ci0gIGlmIChlcnJvcl9jb2RlXyA9PSBlcnJvcjo6T0spIHsKLSAgICByZXR1cm4gIk9LIjsKLSAgfSBlbHNlIHsKLSAgICBpZiAoZXJyb3JfbWVzc2FnZV8uZW1wdHkoKSkgewotICAgICAgcmV0dXJuIGVycm9yOjpDb2RlRW51bVRvU3RyaW5nKGVycm9yX2NvZGVfKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGVycm9yOjpDb2RlRW51bVRvU3RyaW5nKGVycm9yX2NvZGVfKSArICI6IiArCi0gICAgICAgICAgZXJyb3JfbWVzc2FnZV87Ci0gICAgfQotICB9Ci19Ci0KLW9zdHJlYW0mIG9wZXJhdG9yPDwob3N0cmVhbSYgb3MsIGNvbnN0IFN0YXR1cyYgeCkgewotICBvcyA8PCB4LlRvU3RyaW5nKCk7Ci0gIHJldHVybiBvczsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHV0aWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk4OTQ3NGIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KLQotI2luY2x1ZGUgPHN0cmluZy5oPgotI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxjbGltaXRzPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxvc3RyZWFtPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1zdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLCBTdHJpbmdQaWVjZSBwaWVjZSkgewotICBvLndyaXRlKHBpZWNlLmRhdGEoKSwgcGllY2Uuc2l6ZSgpKTsKLSAgcmV0dXJuIG87Ci19Ci0KLS8vIE91dC1vZi1saW5lIGVycm9yIHBhdGguCi12b2lkIFN0cmluZ1BpZWNlOjpMb2dGYXRhbFNpemVUb29CaWcoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGRldGFpbHMpIHsKLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInNpemUgdG9vIGJpZzogIiA8PCBzaXplIDw8ICIgZGV0YWlsczogIiA8PCBkZXRhaWxzOwotfQotCi1TdHJpbmdQaWVjZTo6U3RyaW5nUGllY2UoU3RyaW5nUGllY2UgeCwgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBwb3MpCi0gICAgOiBwdHJfKHgucHRyXyArIHBvcyksIGxlbmd0aF8oeC5sZW5ndGhfIC0gcG9zKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTEUoMCwgcG9zKTsKLSAgR09PR0xFX0RDSEVDS19MRShwb3MsIHgubGVuZ3RoXyk7Ci19Ci0KLVN0cmluZ1BpZWNlOjpTdHJpbmdQaWVjZShTdHJpbmdQaWVjZSB4LAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgcG9zLAotICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuKQotICAgIDogcHRyXyh4LnB0cl8gKyBwb3MpLCBsZW5ndGhfKHN0ZDo6bWluKGxlbiwgeC5sZW5ndGhfIC0gcG9zKSkgewotICBHT09HTEVfRENIRUNLX0xFKDAsIHBvcyk7Ci0gIEdPT0dMRV9EQ0hFQ0tfTEUocG9zLCB4Lmxlbmd0aF8pOwotICBHT09HTEVfRENIRUNLX0dFKGxlbiwgMCk7Ci19Ci0KLXZvaWQgU3RyaW5nUGllY2U6OkNvcHlUb1N0cmluZyhzdHJpbmcqIHRhcmdldCkgY29uc3QgewotICB0YXJnZXQtPmFzc2lnbihwdHJfLCBsZW5ndGhfKTsKLX0KLQotdm9pZCBTdHJpbmdQaWVjZTo6QXBwZW5kVG9TdHJpbmcoc3RyaW5nKiB0YXJnZXQpIGNvbnN0IHsKLSAgdGFyZ2V0LT5hcHBlbmQocHRyXywgbGVuZ3RoXyk7Ci19Ci0KLWJvb2wgU3RyaW5nUGllY2U6OkNvbnN1bWUoU3RyaW5nUGllY2UgeCkgewotICBpZiAoc3RhcnRzX3dpdGgoeCkpIHsKLSAgICBwdHJfICs9IHgubGVuZ3RoXzsKLSAgICBsZW5ndGhfIC09IHgubGVuZ3RoXzsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotICByZXR1cm4gZmFsc2U7Ci19Ci0KLWJvb2wgU3RyaW5nUGllY2U6OkNvbnN1bWVGcm9tRW5kKFN0cmluZ1BpZWNlIHgpIHsKLSAgaWYgKGVuZHNfd2l0aCh4KSkgewotICAgIGxlbmd0aF8gLT0geC5sZW5ndGhfOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6Y29weShjaGFyKiBidWYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgcmV0ID0gc3RkOjptaW4obGVuZ3RoXyAtIHBvcywgbik7Ci0gIG1lbWNweShidWYsIHB0cl8gKyBwb3MsIHJldCk7Ci0gIHJldHVybiByZXQ7Ci19Ci0KLWJvb2wgU3RyaW5nUGllY2U6OmNvbnRhaW5zKFN0cmluZ1BpZWNlIHMpIGNvbnN0IHsKLSAgcmV0dXJuIGZpbmQocywgMCkgIT0gbnBvczsKLX0KLQotc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZChTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIGlmIChsZW5ndGhfIDw9IDAgfHwgcG9zID4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKSkgewotICAgIGlmIChsZW5ndGhfID09IDAgJiYgcG9zID09IDAgJiYgcy5sZW5ndGhfID09IDApIHJldHVybiAwOwotICAgIHJldHVybiBucG9zOwotICB9Ci0gIGNvbnN0IGNoYXIgKnJlc3VsdCA9IHN0ZDo6c2VhcmNoKHB0cl8gKyBwb3MsIHB0cl8gKyBsZW5ndGhfLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnB0cl8sIHMucHRyXyArIHMubGVuZ3RoXyk7Ci0gIHJldHVybiByZXN1bHQgPT0gcHRyXyArIGxlbmd0aF8gPyBucG9zIDogcmVzdWx0IC0gcHRyXzsKLX0KLQotc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZChjaGFyIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKLSAgaWYgKGxlbmd0aF8gPD0gMCB8fCBwb3MgPj0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKSkgewotICAgIHJldHVybiBucG9zOwotICB9Ci0gIGNvbnN0IGNoYXIqIHJlc3VsdCA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPigKLSAgICAgIG1lbWNocihwdHJfICsgcG9zLCBjLCBsZW5ndGhfIC0gcG9zKSk7Ci0gIHJldHVybiByZXN1bHQgIT0gTlVMTCA/IHJlc3VsdCAtIHB0cl8gOiBucG9zOwotfQotCi1zdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpyZmluZChTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIGlmIChsZW5ndGhfIDwgcy5sZW5ndGhfKSByZXR1cm4gbnBvczsKLSAgY29uc3Qgc2l6ZV90IHVsZW4gPSBsZW5ndGhfOwotICBpZiAocy5sZW5ndGhfID09IDApIHJldHVybiBzdGQ6Om1pbih1bGVuLCBwb3MpOwotCi0gIGNvbnN0IGNoYXIqIGxhc3QgPSBwdHJfICsgc3RkOjptaW4odWxlbiAtIHMubGVuZ3RoXywgcG9zKSArIHMubGVuZ3RoXzsKLSAgY29uc3QgY2hhciogcmVzdWx0ID0gc3RkOjpmaW5kX2VuZChwdHJfLCBsYXN0LCBzLnB0cl8sIHMucHRyXyArIHMubGVuZ3RoXyk7Ci0gIHJldHVybiByZXN1bHQgIT0gbGFzdCA/IHJlc3VsdCAtIHB0cl8gOiBucG9zOwotfQotCi0vLyBTZWFyY2ggcmFuZ2UgaXMgWzAuLnBvc10gaW5jbHVzaXZlLiAgSWYgcG9zID09IG5wb3MsIHNlYXJjaCBldmVyeXRoaW5nLgotc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6cmZpbmQoY2hhciBjLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIC8vIE5vdGU6IG1lbXJjaHIoKSBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCi0gIGlmIChsZW5ndGhfIDw9IDApIHJldHVybiBucG9zOwotICBmb3IgKHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgaSA9Ci0gICAgICBzdGQ6Om1pbihwb3MsIHN0YXRpY19jYXN0PHNpemVfdHlwZT4obGVuZ3RoXyAtIDEpKTsKLSAgICAgICBpID49IDA7IC0taSkgewotICAgIGlmIChwdHJfW2ldID09IGMpIHsKLSAgICAgIHJldHVybiBpOwotICAgIH0KLSAgfQotICByZXR1cm4gbnBvczsKLX0KLQotLy8gRm9yIGVhY2ggY2hhcmFjdGVyIGluIGNoYXJhY3RlcnNfd2FudGVkLCBzZXRzIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nCi0vLyB0byB0aGUgQVNDSUkgY29kZSBvZiB0aGF0IGNoYXJhY3RlciB0byAxIGluIHRhYmxlLiAgVGhpcyBpcyB1c2VkIGJ5Ci0vLyB0aGUgZmluZF8uKl9vZiBtZXRob2RzIGJlbG93IHRvIHRlbGwgd2hldGhlciBvciBub3QgYSBjaGFyYWN0ZXIgaXMgaW4KLS8vIHRoZSBsb29rdXAgdGFibGUgaW4gY29uc3RhbnQgdGltZS4KLS8vIFRoZSBhcmd1bWVudCBgdGFibGUnIG11c3QgYmUgYW4gYXJyYXkgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwKLS8vIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgYW4gdW5zaWduZWQgY2hhci4gIFRodXMgaXQgc2hvdWxkIGJlIGJlIGRlY2xhcmVkCi0vLyBhcyBmb2xsb3dzOgotLy8gICBib29sIHRhYmxlW1VDSEFSX01BWCArIDFdCi1zdGF0aWMgaW5saW5lIHZvaWQgQnVpbGRMb29rdXBUYWJsZShTdHJpbmdQaWVjZSBjaGFyYWN0ZXJzX3dhbnRlZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRhYmxlKSB7Ci0gIGNvbnN0IHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuZ3RoID0gY2hhcmFjdGVyc193YW50ZWQubGVuZ3RoKCk7Ci0gIGNvbnN0IGNoYXIqIGNvbnN0IGRhdGEgPSBjaGFyYWN0ZXJzX3dhbnRlZC5kYXRhKCk7Ci0gIGZvciAoc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7Ci0gICAgdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZGF0YVtpXSldID0gdHJ1ZTsKLSAgfQotfQotCi1zdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2ZpcnN0X29mKFN0cmluZ1BpZWNlIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKLSAgaWYgKGxlbmd0aF8gPD0gMCB8fCBzLmxlbmd0aF8gPD0gMCkgewotICAgIHJldHVybiBucG9zOwotICB9Ci0gIC8vIEF2b2lkIHRoZSBjb3N0IG9mIEJ1aWxkTG9va3VwVGFibGUoKSBmb3IgYSBzaW5nbGUtY2hhcmFjdGVyIHNlYXJjaC4KLSAgaWYgKHMubGVuZ3RoXyA9PSAxKSByZXR1cm4gZmluZF9maXJzdF9vZihzLnB0cl9bMF0sIHBvcyk7Ci0KLSAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07Ci0gIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKLSAgZm9yIChzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPSBwb3M7IGkgPCBsZW5ndGhfOyArK2kpIHsKLSAgICBpZiAobG9va3VwW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHB0cl9baV0pXSkgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBucG9zOwotfQotCi1zdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdQaWVjZSBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgewotICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKLSAgaWYgKHMubGVuZ3RoXyA8PSAwKSByZXR1cm4gMDsKLSAgLy8gQXZvaWQgdGhlIGNvc3Qgb2YgQnVpbGRMb29rdXBUYWJsZSgpIGZvciBhIHNpbmdsZS1jaGFyYWN0ZXIgc2VhcmNoLgotICBpZiAocy5sZW5ndGhfID09IDEpIHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihzLnB0cl9bMF0sIHBvcyk7Ci0KLSAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07Ci0gIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKLSAgZm9yIChzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPSBwb3M7IGkgPCBsZW5ndGhfOyArK2kpIHsKLSAgICBpZiAoIWxvb2t1cFtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwdHJfW2ldKV0pIHsKLSAgICAgIHJldHVybiBpOwotICAgIH0KLSAgfQotICByZXR1cm4gbnBvczsKLX0KLQotc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9maXJzdF9ub3Rfb2YoY2hhciBjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgewotICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKLQotICBmb3IgKDsgcG9zIDwgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKTsgKytwb3MpIHsKLSAgICBpZiAocHRyX1twb3NdICE9IGMpIHsKLSAgICAgIHJldHVybiBwb3M7Ci0gICAgfQotICB9Ci0gIHJldHVybiBucG9zOwotfQotCi1zdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2xhc3Rfb2YoU3RyaW5nUGllY2UgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7Ci0gIGlmIChsZW5ndGhfIDw9IDAgfHwgcy5sZW5ndGhfIDw9IDApIHJldHVybiBucG9zOwotICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCi0gIGlmIChzLmxlbmd0aF8gPT0gMSkgcmV0dXJuIGZpbmRfbGFzdF9vZihzLnB0cl9bMF0sIHBvcyk7Ci0KLSAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07Ci0gIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKLSAgZm9yIChzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPQotICAgICAgIHN0ZDo6bWluKHBvcywgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfIC0gMSkpOyBpID49IDA7IC0taSkgewotICAgIGlmIChsb29rdXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHRyX1tpXSldKSB7Ci0gICAgICByZXR1cm4gaTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIG5wb3M7Ci19Ci0KLXN0cmluZ3BpZWNlX3NzaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmRfbGFzdF9ub3Rfb2YoU3RyaW5nUGllY2UgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgewotICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKLQotICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPSBzdGQ6Om1pbihwb3MsIHN0YXRpY19jYXN0PHNpemVfdHlwZT4obGVuZ3RoXyAtIDEpKTsKLSAgaWYgKHMubGVuZ3RoXyA8PSAwKSByZXR1cm4gaTsKLQotICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCi0gIGlmIChzLmxlbmd0aF8gPT0gMSkgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2Yocy5wdHJfWzBdLCBwb3MpOwotCi0gIGJvb2wgbG9va3VwW1VDSEFSX01BWCArIDFdID0geyBmYWxzZSB9OwotICBCdWlsZExvb2t1cFRhYmxlKHMsIGxvb2t1cCk7Ci0gIGZvciAoOyBpID49IDA7IC0taSkgewotICAgIGlmICghbG9va3VwW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHB0cl9baV0pXSkgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBucG9zOwotfQotCi1zdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2xhc3Rfbm90X29mKGNoYXIgYywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgewotICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKLQotICBmb3IgKHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgaSA9Ci0gICAgICAgc3RkOjptaW4ocG9zLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGxlbmd0aF8gLSAxKSk7IGkgPj0gMDsgLS1pKSB7Ci0gICAgaWYgKHB0cl9baV0gIT0gYykgewotICAgICAgcmV0dXJuIGk7Ci0gICAgfQotICB9Ci0gIHJldHVybiBucG9zOwotfQotCi1TdHJpbmdQaWVjZSBTdHJpbmdQaWVjZTo6c3Vic3RyKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdCB7Ci0gIGlmIChwb3MgPiBsZW5ndGhfKSBwb3MgPSBsZW5ndGhfOwotICBpZiAobiA+IGxlbmd0aF8gLSBwb3MpIG4gPSBsZW5ndGhfIC0gcG9zOwotICByZXR1cm4gU3RyaW5nUGllY2UocHRyXyArIHBvcywgbik7Ci19Ci0KLWNvbnN0IFN0cmluZ1BpZWNlOjpzaXplX3R5cGUgU3RyaW5nUGllY2U6Om5wb3MgPSBzaXplX3R5cGUoLTEpOwotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTE2NzE2NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmgKKysrIC9kZXYvbnVsbApAQCAtMSw0OTEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEEgU3RyaW5nUGllY2UgcG9pbnRzIHRvIHBhcnQgb3IgYWxsIG9mIGEgc3RyaW5nLCBDb3JkLCBkb3VibGUtcXVvdGVkIHN0cmluZwotLy8gbGl0ZXJhbCwgb3Igb3RoZXIgc3RyaW5nLWxpa2Ugb2JqZWN0LiAgQSBTdHJpbmdQaWVjZSBkb2VzICpub3QqIG93biB0aGUKLS8vIHN0cmluZyB0byB3aGljaCBpdCBwb2ludHMuICBBIFN0cmluZ1BpZWNlIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQuCi0vLwotLy8gWW91IGNhbiB1c2UgU3RyaW5nUGllY2UgYXMgYSBmdW5jdGlvbiBvciBtZXRob2QgcGFyYW1ldGVyLiAgQSBTdHJpbmdQaWVjZQotLy8gcGFyYW1ldGVyIGNhbiByZWNlaXZlIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcgbGl0ZXJhbCBhcmd1bWVudCwgYSAiY29uc3QKLS8vIGNoYXIqIiBhcmd1bWVudCwgYSBzdHJpbmcgYXJndW1lbnQsIG9yIGEgU3RyaW5nUGllY2UgYXJndW1lbnQgd2l0aCBubyBkYXRhCi0vLyBjb3B5aW5nLiAgU3lzdGVtYXRpYyB1c2Ugb2YgU3RyaW5nUGllY2UgZm9yIGFyZ3VtZW50cyByZWR1Y2VzIGRhdGEKLS8vIGNvcGllcyBhbmQgc3RybGVuKCkgY2FsbHMuCi0vLwotLy8gUHJlZmVyIHBhc3NpbmcgU3RyaW5nUGllY2VzIGJ5IHZhbHVlOgotLy8gICB2b2lkIE15RnVuY3Rpb24oU3RyaW5nUGllY2UgYXJnKTsKLS8vIElmIGNpcmN1bXN0YW5jZXMgcmVxdWlyZSwgeW91IG1heSBhbHNvIHBhc3MgYnkgY29uc3QgcmVmZXJlbmNlOgotLy8gICB2b2lkIE15RnVuY3Rpb24oY29uc3QgU3RyaW5nUGllY2UmIGFyZyk7ICAvLyBub3QgcHJlZmVycmVkCi0vLyBCb3RoIG9mIHRoZXNlIGhhdmUgdGhlIHNhbWUgbGlmZXRpbWUgc2VtYW50aWNzLiAgUGFzc2luZyBieSB2YWx1ZQotLy8gZ2VuZXJhdGVzIHNsaWdodGx5IHNtYWxsZXIgY29kZS4gIEZvciBtb3JlIGRpc2N1c3Npb24sIHNlZSB0aGUgdGhyZWFkCi0vLyBnby9zdHJpbmdwaWVjZWJ5dmFsdWUgb24gYy11c2Vycy4KLS8vCi0vLyBTdHJpbmdQaWVjZSBpcyBhbHNvIHN1aXRhYmxlIGZvciBsb2NhbCB2YXJpYWJsZXMgaWYgeW91IGtub3cgdGhhdAotLy8gdGhlIGxpZmV0aW1lIG9mIHRoZSB1bmRlcmx5aW5nIG9iamVjdCBpcyBsb25nZXIgdGhhbiB0aGUgbGlmZXRpbWUKLS8vIG9mIHlvdXIgU3RyaW5nUGllY2UgdmFyaWFibGUuCi0vLwotLy8gQmV3YXJlIG9mIGJpbmRpbmcgYSBTdHJpbmdQaWVjZSB0byBhIHRlbXBvcmFyeToKLS8vICAgU3RyaW5nUGllY2Ugc3AgPSBvYmouTWV0aG9kUmV0dXJuaW5nU3RyaW5nKCk7ICAvLyBCQUQ6IGxpZmV0aW1lIHByb2JsZW0KLS8vCi0vLyBUaGlzIGNvZGUgaXMgb2theToKLS8vICAgc3RyaW5nIHN0ciA9IG9iai5NZXRob2RSZXR1cm5pbmdTdHJpbmcoKTsgIC8vIHN0ciBvd25zIGl0cyBjb250ZW50cwotLy8gICBTdHJpbmdQaWVjZSBzcChzdHIpOyAgLy8gR09PRCwgYmVjYXVzZSBzdHIgb3V0bGl2ZXMgc3AKLS8vCi0vLyBTdHJpbmdQaWVjZSBpcyBzb21ldGltZXMgYSBwb29yIGNob2ljZSBmb3IgYSByZXR1cm4gdmFsdWUgYW5kIHVzdWFsbHkgYSBwb29yCi0vLyBjaG9pY2UgZm9yIGEgZGF0YSBtZW1iZXIuICBJZiB5b3UgZG8gdXNlIGEgU3RyaW5nUGllY2UgdGhpcyB3YXksIGl0IGlzIHlvdXIKLS8vIHJlc3BvbnNpYmlsaXR5IHRvIGVuc3VyZSB0aGF0IHRoZSBvYmplY3QgcG9pbnRlZCB0byBieSB0aGUgU3RyaW5nUGllY2UKLS8vIG91dGxpdmVzIHRoZSBTdHJpbmdQaWVjZS4KLS8vCi0vLyBBIFN0cmluZ1BpZWNlIG1heSByZXByZXNlbnQganVzdCBwYXJ0IG9mIGEgc3RyaW5nOyB0aHVzIHRoZSBuYW1lICJQaWVjZSIuCi0vLyBGb3IgZXhhbXBsZSwgd2hlbiBzcGxpdHRpbmcgYSBzdHJpbmcsIHZlY3RvcjxTdHJpbmdQaWVjZT4gaXMgYSBuYXR1cmFsIGRhdGEKLS8vIHR5cGUgZm9yIHRoZSBvdXRwdXQuICBGb3IgYW5vdGhlciBleGFtcGxlLCBhIENvcmQgaXMgYSBub24tY29udGlndW91cywKLS8vIHBvdGVudGlhbGx5IHZlcnkgbG9uZyBzdHJpbmctbGlrZSBvYmplY3QuICBUaGUgQ29yZCBjbGFzcyBoYXMgYW4gaW50ZXJmYWNlCi0vLyB0aGF0IGl0ZXJhdGl2ZWx5IHByb3ZpZGVzIFN0cmluZ1BpZWNlIG9iamVjdHMgdGhhdCBwb2ludCB0byB0aGUKLS8vIHN1Y2Nlc3NpdmUgcGllY2VzIG9mIGEgQ29yZCBvYmplY3QuCi0vLwotLy8gQSBTdHJpbmdQaWVjZSBpcyBub3QgbnVsbC10ZXJtaW5hdGVkLiAgSWYgeW91IHdyaXRlIGNvZGUgdGhhdCBzY2FucyBhCi0vLyBTdHJpbmdQaWVjZSwgeW91IG11c3QgY2hlY2sgaXRzIGxlbmd0aCBiZWZvcmUgcmVhZGluZyBhbnkgY2hhcmFjdGVycy4KLS8vIENvbW1vbiBpZGlvbXMgdGhhdCB3b3JrIG9uIG51bGwtdGVybWluYXRlZCBzdHJpbmdzIGRvIG5vdCB3b3JrIG9uCi0vLyBTdHJpbmdQaWVjZSBvYmplY3RzLgotLy8KLS8vIFRoZXJlIGFyZSBzZXZlcmFsIHdheXMgdG8gY3JlYXRlIGEgbnVsbCBTdHJpbmdQaWVjZToKLS8vICAgU3RyaW5nUGllY2UoKQotLy8gICBTdHJpbmdQaWVjZShOVUxMKQotLy8gICBTdHJpbmdQaWVjZShOVUxMLCAwKQotLy8gRm9yIGFsbCBvZiB0aGUgYWJvdmUsIHNwLmRhdGEoKSA9PSBOVUxMLCBzcC5sZW5ndGgoKSA9PSAwLAotLy8gYW5kIHNwLmVtcHR5KCkgPT0gdHJ1ZS4gIEFsc28sIGlmIHlvdSBjcmVhdGUgYSBTdHJpbmdQaWVjZSB3aXRoCi0vLyBhIG5vbi1OVUxMIHBvaW50ZXIgdGhlbiBzcC5kYXRhKCkgIT0gTlVMTC4gIE9uY2UgY3JlYXRlZCwKLS8vIHNwLmRhdGEoKSB3aWxsIHN0YXkgZWl0aGVyIE5VTEwgb3Igbm90LU5VTEwsIGV4Y2VwdCBpZiB5b3UgY2FsbAotLy8gc3AuY2xlYXIoKSBvciBzcC5zZXQoKS4KLS8vCi0vLyBUaHVzLCB5b3UgY2FuIHVzZSBTdHJpbmdQaWVjZShOVUxMKSB0byBzaWduYWwgYW4gb3V0LW9mLWJhbmQgdmFsdWUKLS8vIHRoYXQgaXMgZGlmZmVyZW50IGZyb20gb3RoZXIgU3RyaW5nUGllY2UgdmFsdWVzLiAgVGhpcyBpcyBzaW1pbGFyCi0vLyB0byB0aGUgd2F5IHRoYXQgY29uc3QgY2hhciogcDEgPSBOVUxMOyBpcyBkaWZmZXJlbnQgZnJvbQotLy8gY29uc3QgY2hhciogcDIgPSAiIjsuCi0vLwotLy8gVGhlcmUgYXJlIG1hbnkgd2F5cyB0byBjcmVhdGUgYW4gZW1wdHkgU3RyaW5nUGllY2U6Ci0vLyAgIFN0cmluZ1BpZWNlKCkKLS8vICAgU3RyaW5nUGllY2UoTlVMTCkKLS8vICAgU3RyaW5nUGllY2UoTlVMTCwgMCkKLS8vICAgU3RyaW5nUGllY2UoIiIpCi0vLyAgIFN0cmluZ1BpZWNlKCIiLCAwKQotLy8gICBTdHJpbmdQaWVjZSgiYWJjZGVmIiwgMCkKLS8vICAgU3RyaW5nUGllY2UoImFiY2RlZiIrNiwgMCkKLS8vIEZvciBhbGwgb2YgdGhlIGFib3ZlLCBzcC5sZW5ndGgoKSB3aWxsIGJlIDAgYW5kIHNwLmVtcHR5KCkgd2lsbCBiZSB0cnVlLgotLy8gRm9yIHNvbWUgZW1wdHkgU3RyaW5nUGllY2UgdmFsdWVzLCBzcC5kYXRhKCkgd2lsbCBiZSBOVUxMLgotLy8gRm9yIHNvbWUgZW1wdHkgU3RyaW5nUGllY2UgdmFsdWVzLCBzcC5kYXRhKCkgd2lsbCBub3QgYmUgTlVMTC4KLS8vCi0vLyBCZSBjYXJlZnVsIG5vdCB0byBjb25mdXNlOiBudWxsIFN0cmluZ1BpZWNlIGFuZCBlbXB0eSBTdHJpbmdQaWVjZS4KLS8vIFRoZSBzZXQgb2YgZW1wdHkgU3RyaW5nUGllY2VzIHByb3Blcmx5IGluY2x1ZGVzIHRoZSBzZXQgb2YgbnVsbCBTdHJpbmdQaWVjZXMuCi0vLyBUaGF0IGlzLCBldmVyeSBudWxsIFN0cmluZ1BpZWNlIGlzIGFuIGVtcHR5IFN0cmluZ1BpZWNlLAotLy8gYnV0IHNvbWUgbm9uLW51bGwgU3RyaW5nUGllY2VzIGFyZSBlbXB0eSBTdHJpbmdwaWVjZXMgdG9vLgotLy8KLS8vIEFsbCBlbXB0eSBTdHJpbmdQaWVjZSB2YWx1ZXMgY29tcGFyZSBlcXVhbCB0byBlYWNoIG90aGVyLgotLy8gRXZlbiBhIG51bGwgU3RyaW5nUGllY2VzIGNvbXBhcmVzIGVxdWFsIHRvIGEgbm9uLW51bGwgZW1wdHkgU3RyaW5nUGllY2U6Ci0vLyAgU3RyaW5nUGllY2UoKSA9PSBTdHJpbmdQaWVjZSgiIiwgMCkKLS8vICBTdHJpbmdQaWVjZShOVUxMKSA9PSBTdHJpbmdQaWVjZSgiYWJjIiwgMCkKLS8vICBTdHJpbmdQaWVjZShOVUxMLCAwKSA9PSBTdHJpbmdQaWVjZSgiYWJjZGVmIis2LCAwKQotLy8KLS8vIExvb2sgY2FyZWZ1bGx5IGF0IHRoaXMgZXhhbXBsZToKLS8vICAgU3RyaW5nUGllY2UoIiIpID09IE5VTEwKLS8vIFRydWUgb3IgZmFsc2U/ICBUUlVFLCBiZWNhdXNlIFN0cmluZ1BpZWNlOjpvcGVyYXRvcj09IGNvbnZlcnRzCi0vLyB0aGUgcmlnaHQtaGFuZCBzaWRlIGZyb20gTlVMTCB0byBTdHJpbmdQaWVjZShOVUxMKSwKLS8vIGFuZCB0aGVuIGNvbXBhcmVzIHR3byB6ZXJvLWxlbmd0aCBzcGFucyBvZiBjaGFyYWN0ZXJzLgotLy8gSG93ZXZlciwgd2UgYXJlIHdvcmtpbmcgdG8gbWFrZSB0aGlzIGV4YW1wbGUgcHJvZHVjZSBhIGNvbXBpbGUgZXJyb3IuCi0vLwotLy8gU3VwcG9zZSB5b3Ugd2FudCB0byB3cml0ZToKLS8vICAgYm9vbCBUZXN0V2hhdD8oU3RyaW5nUGllY2Ugc3ApIHsgcmV0dXJuIHNwID09IE5VTEw7IH0gIC8vIEJBRAotLy8gRG8gbm90IGRvIHRoYXQuICBXcml0ZSBvbmUgb2YgdGhlc2UgaW5zdGVhZDoKLS8vICAgYm9vbCBUZXN0TnVsbChTdHJpbmdQaWVjZSBzcCkgeyByZXR1cm4gc3AuZGF0YSgpID09IE5VTEw7IH0KLS8vICAgYm9vbCBUZXN0RW1wdHkoU3RyaW5nUGllY2Ugc3ApIHsgcmV0dXJuIHNwLmVtcHR5KCk7IH0KLS8vIFRoZSBpbnRlbnQgb2YgVGVzdFdoYXQ/IGlzIHVuY2xlYXIuICBEaWQgeW91IG1lYW4gVGVzdE51bGwgb3IgVGVzdEVtcHR5PwotLy8gUmlnaHQgbm93LCBUZXN0V2hhdD8gYmVoYXZlcyBsaWtlcyBUZXN0RW1wdHkuCi0vLyBXZSBhcmUgd29ya2luZyB0byBtYWtlIFRlc3RXaGF0PyBwcm9kdWNlIGEgY29tcGlsZSBlcnJvci4KLS8vIFRlc3ROdWxsIGlzIGdvb2QgdG8gdGVzdCBmb3IgYW4gb3V0LW9mLWJhbmQgc2lnbmFsLgotLy8gVGVzdEVtcHR5IGlzIGdvb2QgdG8gdGVzdCBmb3IgYW4gZW1wdHkgU3RyaW5nUGllY2UuCi0vLwotLy8gQ2F2ZWF0cyAoYWdhaW4pOgotLy8gKDEpIFRoZSBsaWZldGltZSBvZiB0aGUgcG9pbnRlZC10byBzdHJpbmcgKG9yIHBpZWNlIG9mIGEgc3RyaW5nKQotLy8gICAgIG11c3QgYmUgbG9uZ2VyIHRoYW4gdGhlIGxpZmV0aW1lIG9mIHRoZSBTdHJpbmdQaWVjZS4KLS8vICgyKSBUaGVyZSBtYXkgb3IgbWF5IG5vdCBiZSBhICdcMCcgY2hhcmFjdGVyIGFmdGVyIHRoZSBlbmQgb2YKLS8vICAgICBTdHJpbmdQaWVjZSBkYXRhLgotLy8gKDMpIEEgbnVsbCBTdHJpbmdQaWVjZSBpcyBlbXB0eS4KLS8vICAgICBBbiBlbXB0eSBTdHJpbmdQaWVjZSBtYXkgb3IgbWF5IG5vdCBiZSBhIG51bGwgU3RyaW5nUGllY2UuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUklOR1BJRUNFX0hfCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJJTkdQSUVDRV9IXwotCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+Ci0jaW5jbHVkZSA8c3RkZGVmLmg+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8aW9zZndkPgotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotLy8gU3RyaW5nUGllY2UgaGFzICp0d28qIHNpemUgdHlwZXMuCi0vLyBTdHJpbmdQaWVjZTo6c2l6ZV90eXBlCi0vLyAgIGlzIHVuc2lnbmVkCi0vLyAgIGlzIDMyIGJpdHMgaW4gTFAzMiwgNjQgYml0cyBpbiBMUDY0LCA2NCBiaXRzIGluIExMUDY0Ci0vLyAgIG5vIGZ1dHVyZSBjaGFuZ2VzIGludGVuZGVkCi0vLyBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlCi0vLyAgIGlzIHNpZ25lZAotLy8gICBpcyAzMiBiaXRzIGluIExQMzIsIDY0IGJpdHMgaW4gTFA2NCwgNjQgYml0cyBpbiBMTFA2NAotLy8gICBmdXR1cmUgY2hhbmdlcyBpbnRlbmRlZDogaHR0cDovL2dvLzY0Qml0U3RyaW5nUGllY2UKLS8vCi10eXBlZGVmIHN0cmluZzo6ZGlmZmVyZW5jZV90eXBlIHN0cmluZ3BpZWNlX3NzaXplX3R5cGU7Ci0KLS8vIFNUUklOR1BJRUNFX0NIRUNLX1NJWkUgcHJvdGVjdHMgdXMgZnJvbSAzMi1iaXQgb3ZlcmZsb3dzLgotLy8gVE9ETyhtZWMpOiBkZWxldGUgdGhpcyBhZnRlciBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGdvZXMgNjQgYml0LgotI2lmICFkZWZpbmVkKE5ERUJVRykKLSNkZWZpbmUgU1RSSU5HUElFQ0VfQ0hFQ0tfU0laRSAxCi0jZWxpZiBkZWZpbmVkKF9GT1JUSUZZX1NPVVJDRSkgJiYgX0ZPUlRJRllfU09VUkNFID4gMAotI2RlZmluZSBTVFJJTkdQSUVDRV9DSEVDS19TSVpFIDEKLSNlbHNlCi0jZGVmaW5lIFNUUklOR1BJRUNFX0NIRUNLX1NJWkUgMAotI2VuZGlmCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdQaWVjZSB7Ci0gcHJpdmF0ZToKLSAgY29uc3QgY2hhciogcHRyXzsKLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBsZW5ndGhfOwotCi0gIC8vIFByZXZlbnQgb3ZlcmZsb3cgaW4gZGVidWcgbW9kZSBvciBmb3J0aWZpZWQgbW9kZS4KLSAgLy8gc2l6ZW9mKHN0cmluZ3BpZWNlX3NzaXplX3R5cGUpIG1heSBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKHNpemVfdCkuCi0gIHN0YXRpYyBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIENoZWNrZWRTc2l6ZVRGcm9tU2l6ZVQoc2l6ZV90IHNpemUpIHsKLSNpZiBTVFJJTkdQSUVDRV9DSEVDS19TSVpFID4gMAotI2lmZGVmIG1heAotI3VuZGVmIG1heAotI2VuZGlmCi0gICAgaWYgKHNpemUgPiBzdGF0aWNfY2FzdDxzaXplX3Q+KAotICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHN0cmluZ3BpZWNlX3NzaXplX3R5cGU+OjptYXgoKSkpIHsKLSAgICAgIC8vIFNvbWUgcGVvcGxlIGdyZXAgZm9yIHRoaXMgbWVzc2FnZSBpbiBsb2dzCi0gICAgICAvLyBzbyB0YWtlIGNhcmUgaWYgeW91IGV2ZXIgY2hhbmdlIGl0LgotICAgICAgTG9nRmF0YWxTaXplVG9vQmlnKHNpemUsICJzaXplX3QgdG8gaW50IGNvbnZlcnNpb24iKTsKLSAgICB9Ci0jZW5kaWYKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RyaW5ncGllY2Vfc3NpemVfdHlwZT4oc2l6ZSk7Ci0gIH0KLQotICAvLyBPdXQtb2YtbGluZSBlcnJvciBwYXRoLgotICBzdGF0aWMgdm9pZCBMb2dGYXRhbFNpemVUb29CaWcoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGRldGFpbHMpOwotCi0gcHVibGljOgotICAvLyBXZSBwcm92aWRlIG5vbi1leHBsaWNpdCBzaW5nbGV0b24gY29uc3RydWN0b3JzIHNvIHVzZXJzIGNhbiBwYXNzCi0gIC8vIGluIGEgImNvbnN0IGNoYXIqIiBvciBhICJzdHJpbmciIHdoZXJldmVyIGEgIlN0cmluZ1BpZWNlIiBpcwotICAvLyBleHBlY3RlZC4KLSAgLy8KLSAgLy8gU3R5bGUgZ3VpZGUgZXhjZXB0aW9uIGdyYW50ZWQ6Ci0gIC8vIGh0dHA6Ly9nb3RvL3N0eWxlLWd1aWRlLWV4Y2VwdGlvbi0yMDk3ODI4OAotICBTdHJpbmdQaWVjZSgpIDogcHRyXyhOVUxMKSwgbGVuZ3RoXygwKSB7fQotCi0gIFN0cmluZ1BpZWNlKGNvbnN0IGNoYXIqIHN0cikgIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQotICAgICAgOiBwdHJfKHN0ciksIGxlbmd0aF8oMCkgewotICAgIGlmIChzdHIgIT0gTlVMTCkgewotICAgICAgbGVuZ3RoXyA9IENoZWNrZWRTc2l6ZVRGcm9tU2l6ZVQoc3RybGVuKHN0cikpOwotICAgIH0KLSAgfQotCi0gIHRlbXBsYXRlIDxjbGFzcyBBbGxvY2F0b3I+Ci0gIFN0cmluZ1BpZWNlKCAgLy8gTk9MSU5UKHJ1bnRpbWUvZXhwbGljaXQpCi0gICAgICBjb25zdCBzdGQ6OmJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBBbGxvY2F0b3I+JiBzdHIpCi0gICAgICA6IHB0cl8oc3RyLmRhdGEoKSksIGxlbmd0aF8oMCkgewotICAgIGxlbmd0aF8gPSBDaGVja2VkU3NpemVURnJvbVNpemVUKHN0ci5zaXplKCkpOwotICB9Ci0jaWYgZGVmaW5lZChIQVNfR0xPQkFMX1NUUklORykKLSAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jYXRvcj4KLSAgU3RyaW5nUGllY2UoICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKLSAgICAgIGNvbnN0IGJhc2ljX3N0cmluZzxjaGFyLCBzdGQ6OmNoYXJfdHJhaXRzPGNoYXI+LCBBbGxvY2F0b3I+JiBzdHIpCi0gICAgICA6IHB0cl8oc3RyLmRhdGEoKSksIGxlbmd0aF8oMCkgewotICAgIGxlbmd0aF8gPSBDaGVja2VkU3NpemVURnJvbVNpemVUKHN0ci5zaXplKCkpOwotICB9Ci0jZW5kaWYKLQotICBTdHJpbmdQaWVjZShjb25zdCBjaGFyKiBvZmZzZXQsIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuKQotICAgICAgOiBwdHJfKG9mZnNldCksIGxlbmd0aF8obGVuKSB7Ci0gICAgYXNzZXJ0KGxlbiA+PSAwKTsKLSAgfQotCi0gIC8vIFN1YnN0cmluZyBvZiBhbm90aGVyIFN0cmluZ1BpZWNlLgotICAvLyBwb3MgbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIDw9IHgubGVuZ3RoKCkuCi0gIFN0cmluZ1BpZWNlKFN0cmluZ1BpZWNlIHgsIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgcG9zKTsKLSAgLy8gU3Vic3RyaW5nIG9mIGFub3RoZXIgU3RyaW5nUGllY2UuCi0gIC8vIHBvcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgPD0geC5sZW5ndGgoKS4KLSAgLy8gbGVuIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCB3aWxsIGJlIHBpbm5lZCB0byBhdCBtb3N0IHgubGVuZ3RoKCkgLSBwb3MuCi0gIFN0cmluZ1BpZWNlKFN0cmluZ1BpZWNlIHgsCi0gICAgICAgICAgICAgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgcG9zLAotICAgICAgICAgICAgICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGxlbik7Ci0KLSAgLy8gZGF0YSgpIG1heSByZXR1cm4gYSBwb2ludGVyIHRvIGEgYnVmZmVyIHdpdGggZW1iZWRkZWQgTlVMcywgYW5kIHRoZQotICAvLyByZXR1cm5lZCBidWZmZXIgbWF5IG9yIG1heSBub3QgYmUgbnVsbCB0ZXJtaW5hdGVkLiAgVGhlcmVmb3JlIGl0IGlzCi0gIC8vIHR5cGljYWxseSBhIG1pc3Rha2UgdG8gcGFzcyBkYXRhKCkgdG8gYSByb3V0aW5lIHRoYXQgZXhwZWN0cyBhIE5VTAotICAvLyB0ZXJtaW5hdGVkIHN0cmluZy4KLSAgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHB0cl87IH0KLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBzaXplKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQotICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGxlbmd0aCgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF87IH0KLSAgYm9vbCBlbXB0eSgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF8gPT0gMDsgfQotCi0gIHZvaWQgY2xlYXIoKSB7Ci0gICAgcHRyXyA9IE5VTEw7Ci0gICAgbGVuZ3RoXyA9IDA7Ci0gIH0KLQotICB2b2lkIHNldChjb25zdCBjaGFyKiBkYXRhLCBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGxlbikgewotICAgIGFzc2VydChsZW4gPj0gMCk7Ci0gICAgcHRyXyA9IGRhdGE7Ci0gICAgbGVuZ3RoXyA9IGxlbjsKLSAgfQotCi0gIHZvaWQgc2V0KGNvbnN0IGNoYXIqIHN0cikgewotICAgIHB0cl8gPSBzdHI7Ci0gICAgaWYgKHN0ciAhPSBOVUxMKQotICAgICAgbGVuZ3RoXyA9IENoZWNrZWRTc2l6ZVRGcm9tU2l6ZVQoc3RybGVuKHN0cikpOwotICAgIGVsc2UKLSAgICAgIGxlbmd0aF8gPSAwOwotICB9Ci0KLSAgdm9pZCBzZXQoY29uc3Qgdm9pZCogZGF0YSwgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBsZW4pIHsKLSAgICBwdHJfID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oZGF0YSk7Ci0gICAgbGVuZ3RoXyA9IGxlbjsKLSAgfQotCi0gIGNoYXIgb3BlcmF0b3JbXShzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkpIGNvbnN0IHsKLSAgICBhc3NlcnQoMCA8PSBpKTsKLSAgICBhc3NlcnQoaSA8IGxlbmd0aF8pOwotICAgIHJldHVybiBwdHJfW2ldOwotICB9Ci0KLSAgdm9pZCByZW1vdmVfcHJlZml4KHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbikgewotICAgIGFzc2VydChsZW5ndGhfID49IG4pOwotICAgIHB0cl8gKz0gbjsKLSAgICBsZW5ndGhfIC09IG47Ci0gIH0KLQotICB2b2lkIHJlbW92ZV9zdWZmaXgoc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBuKSB7Ci0gICAgYXNzZXJ0KGxlbmd0aF8gPj0gbik7Ci0gICAgbGVuZ3RoXyAtPSBuOwotICB9Ci0KLSAgLy8gcmV0dXJucyB7LTEsIDAsIDF9Ci0gIGludCBjb21wYXJlKFN0cmluZ1BpZWNlIHgpIGNvbnN0IHsKLSAgICBjb25zdCBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIG1pbl9zaXplID0KLSAgICAgICAgbGVuZ3RoXyA8IHgubGVuZ3RoXyA/IGxlbmd0aF8gOiB4Lmxlbmd0aF87Ci0gICAgaW50IHIgPSBtZW1jbXAocHRyXywgeC5wdHJfLCBtaW5fc2l6ZSk7Ci0gICAgaWYgKHIgPCAwKSByZXR1cm4gLTE7Ci0gICAgaWYgKHIgPiAwKSByZXR1cm4gMTsKLSAgICBpZiAobGVuZ3RoXyA8IHgubGVuZ3RoXykgcmV0dXJuIC0xOwotICAgIGlmIChsZW5ndGhfID4geC5sZW5ndGhfKSByZXR1cm4gMTsKLSAgICByZXR1cm4gMDsKLSAgfQotCi0gIHN0cmluZyBhc19zdHJpbmcoKSBjb25zdCB7Ci0gICAgcmV0dXJuIFRvU3RyaW5nKCk7Ci0gIH0KLSAgLy8gV2UgYWxzbyBkZWZpbmUgVG9TdHJpbmcoKSBoZXJlLCBzaW5jZSBtYW55IG90aGVyIHN0cmluZy1saWtlCi0gIC8vIGludGVyZmFjZXMgbmFtZSB0aGUgcm91dGluZSB0aGF0IGNvbnZlcnRzIHRvIGEgQysrIHN0cmluZwotICAvLyAiVG9TdHJpbmciLCBhbmQgaXQncyBjb25mdXNpbmcgdG8gaGF2ZSB0aGUgbWV0aG9kIHRoYXQgZG9lcyB0aGF0Ci0gIC8vIGZvciBhIFN0cmluZ1BpZWNlIGJlIGNhbGxlZCAiYXNfc3RyaW5nKCkiLiAgV2UgYWxzbyBsZWF2ZSB0aGUKLSAgLy8gImFzX3N0cmluZygpIiBtZXRob2QgZGVmaW5lZCBoZXJlIGZvciBleGlzdGluZyBjb2RlLgotICBzdHJpbmcgVG9TdHJpbmcoKSBjb25zdCB7Ci0gICAgaWYgKHB0cl8gPT0gTlVMTCkgcmV0dXJuIHN0cmluZygpOwotICAgIHJldHVybiBzdHJpbmcoZGF0YSgpLCBzaXplKCkpOwotICB9Ci0KLSAgb3BlcmF0b3Igc3RyaW5nKCkgY29uc3QgewotICAgIHJldHVybiBUb1N0cmluZygpOwotICB9Ci0KLSAgdm9pZCBDb3B5VG9TdHJpbmcoc3RyaW5nKiB0YXJnZXQpIGNvbnN0OwotICB2b2lkIEFwcGVuZFRvU3RyaW5nKHN0cmluZyogdGFyZ2V0KSBjb25zdDsKLQotICBib29sIHN0YXJ0c193aXRoKFN0cmluZ1BpZWNlIHgpIGNvbnN0IHsKLSAgICByZXR1cm4gKGxlbmd0aF8gPj0geC5sZW5ndGhfKSAmJiAobWVtY21wKHB0cl8sIHgucHRyXywgeC5sZW5ndGhfKSA9PSAwKTsKLSAgfQotCi0gIGJvb2wgZW5kc193aXRoKFN0cmluZ1BpZWNlIHgpIGNvbnN0IHsKLSAgICByZXR1cm4gKChsZW5ndGhfID49IHgubGVuZ3RoXykgJiYKLSAgICAgICAgICAgIChtZW1jbXAocHRyXyArIChsZW5ndGhfLXgubGVuZ3RoXyksIHgucHRyXywgeC5sZW5ndGhfKSA9PSAwKSk7Ci0gIH0KLQotICAvLyBDaGVja3Mgd2hldGhlciBTdHJpbmdQaWVjZSBzdGFydHMgd2l0aCB4IGFuZCBpZiBzbyBhZHZhbmNlcyB0aGUgYmVnaW5uaW5nCi0gIC8vIG9mIGl0IHRvIHBhc3QgdGhlIG1hdGNoLiAgSXQncyBiYXNpY2FsbHkgYSBzaG9ydGN1dCBmb3Igc3RhcnRzX3dpdGgKLSAgLy8gZm9sbG93ZWQgYnkgcmVtb3ZlX3ByZWZpeC4KLSAgYm9vbCBDb25zdW1lKFN0cmluZ1BpZWNlIHgpOwotICAvLyBMaWtlIGFib3ZlIGJ1dCBmb3IgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLgotICBib29sIENvbnN1bWVGcm9tRW5kKFN0cmluZ1BpZWNlIHgpOwotCi0gIC8vIHN0YW5kYXJkIFNUTCBjb250YWluZXIgYm9pbGVycGxhdGUKLSAgdHlwZWRlZiBjaGFyIHZhbHVlX3R5cGU7Ci0gIHR5cGVkZWYgY29uc3QgY2hhciogcG9pbnRlcjsKLSAgdHlwZWRlZiBjb25zdCBjaGFyJiByZWZlcmVuY2U7Ci0gIHR5cGVkZWYgY29uc3QgY2hhciYgY29uc3RfcmVmZXJlbmNlOwotICB0eXBlZGVmIHNpemVfdCBzaXplX3R5cGU7Ci0gIHR5cGVkZWYgcHRyZGlmZl90IGRpZmZlcmVuY2VfdHlwZTsKLSAgc3RhdGljIGNvbnN0IHNpemVfdHlwZSBucG9zOwotICB0eXBlZGVmIGNvbnN0IGNoYXIqIGNvbnN0X2l0ZXJhdG9yOwotICB0eXBlZGVmIGNvbnN0IGNoYXIqIGl0ZXJhdG9yOwotICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKLSAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7Ci0gIGl0ZXJhdG9yIGJlZ2luKCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQotICBpdGVyYXRvciBlbmQoKSBjb25zdCB7IHJldHVybiBwdHJfICsgbGVuZ3RoXzsgfQotICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKLSAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihwdHJfICsgbGVuZ3RoXyk7Ci0gIH0KLSAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgY29uc3QgewotICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHB0cl8pOwotICB9Ci0gIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbWF4X3NpemUoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9Ci0gIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgY2FwYWNpdHkoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9Ci0KLSAgLy8gY3BwbGludC5weSBlbWl0cyBhIGZhbHNlIHBvc2l0aXZlIFtidWlsZC9pbmNsdWRlX3doYXRfeW91X3VzZV0KLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBjb3B5KGNoYXIqIGJ1Ziwgc2l6ZV90eXBlIG4sIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsgIC8vIE5PTElOVAotCi0gIGJvb2wgY29udGFpbnMoU3RyaW5nUGllY2UgcykgY29uc3Q7Ci0KLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBmaW5kKFN0cmluZ1BpZWNlIHMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBmaW5kKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OwotICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIHJmaW5kKFN0cmluZ1BpZWNlIHMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSByZmluZChjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKLQotICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoU3RyaW5nUGllY2Ugcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OwotICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmRfZmlyc3Rfb2YoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3QgewotICAgIHJldHVybiBmaW5kKGMsIHBvcyk7Ci0gIH0KLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdQaWVjZSBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBmaW5kX2ZpcnN0X25vdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdDsKLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBmaW5kX2xhc3Rfb2YoU3RyaW5nUGllY2UgcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OwotICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdCB7Ci0gICAgcmV0dXJuIHJmaW5kKGMsIHBvcyk7Ci0gIH0KLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKFN0cmluZ1BpZWNlIHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7Ci0gIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgZmluZF9sYXN0X25vdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKLQotICBTdHJpbmdQaWVjZSBzdWJzdHIoc2l6ZV90eXBlIHBvcywgc2l6ZV90eXBlIG4gPSBucG9zKSBjb25zdDsKLX07Ci0KLS8vIFRoaXMgbGFyZ2UgZnVuY3Rpb24gaXMgZGVmaW5lZCBpbmxpbmUgc28gdGhhdCBpbiBhIGZhaXJseSBjb21tb24gY2FzZSB3aGVyZQotLy8gb25lIG9mIHRoZSBhcmd1bWVudHMgaXMgYSBsaXRlcmFsLCB0aGUgY29tcGlsZXIgY2FuIGVsaWRlIGEgbG90IG9mIHRoZQotLy8gZm9sbG93aW5nIGNvbXBhcmlzb25zLgotaW5saW5lIGJvb2wgb3BlcmF0b3I9PShTdHJpbmdQaWVjZSB4LCBTdHJpbmdQaWVjZSB5KSB7Ci0gIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuID0geC5zaXplKCk7Ci0gIGlmIChsZW4gIT0geS5zaXplKCkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4geC5kYXRhKCkgPT0geS5kYXRhKCkgfHwgbGVuIDw9IDAgfHwKLSAgICAgIG1lbWNtcCh4LmRhdGEoKSwgeS5kYXRhKCksIGxlbikgPT0gMDsKLX0KLQotaW5saW5lIGJvb2wgb3BlcmF0b3IhPShTdHJpbmdQaWVjZSB4LCBTdHJpbmdQaWVjZSB5KSB7Ci0gIHJldHVybiAhKHggPT0geSk7Ci19Ci0KLWlubGluZSBib29sIG9wZXJhdG9yPChTdHJpbmdQaWVjZSB4LCBTdHJpbmdQaWVjZSB5KSB7Ci0gIGNvbnN0IHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbWluX3NpemUgPQotICAgICAgeC5zaXplKCkgPCB5LnNpemUoKSA/IHguc2l6ZSgpIDogeS5zaXplKCk7Ci0gIGNvbnN0IGludCByID0gbWVtY21wKHguZGF0YSgpLCB5LmRhdGEoKSwgbWluX3NpemUpOwotICByZXR1cm4gKHIgPCAwKSB8fCAociA9PSAwICYmIHguc2l6ZSgpIDwgeS5zaXplKCkpOwotfQotCi1pbmxpbmUgYm9vbCBvcGVyYXRvcj4oU3RyaW5nUGllY2UgeCwgU3RyaW5nUGllY2UgeSkgewotICByZXR1cm4geSA8IHg7Ci19Ci0KLWlubGluZSBib29sIG9wZXJhdG9yPD0oU3RyaW5nUGllY2UgeCwgU3RyaW5nUGllY2UgeSkgewotICByZXR1cm4gISh4ID4geSk7Ci19Ci0KLWlubGluZSBib29sIG9wZXJhdG9yPj0oU3RyaW5nUGllY2UgeCwgU3RyaW5nUGllY2UgeSkgewotICByZXR1cm4gISh4IDwgeSk7Ci19Ci0KLS8vIGFsbG93IFN0cmluZ1BpZWNlIHRvIGJlIGxvZ2dlZAotZXh0ZXJuIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG8sIFN0cmluZ1BpZWNlIHBpZWNlKTsKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLS8vIFN0cmluZ1BpZWNlIGlzIG5vdCBhIFBPRCBhbmQgY2FuIG5vdCBiZSB1c2VkIGluIGFuIHVuaW9uIChwcmUgQysrMTEpLiBXZQotLy8gbmVlZCBhIFBPRCB2ZXJzaW9uIG9mIGl0Lgotc3RydWN0IFN0cmluZ1BpZWNlUG9kIHsKLSAgLy8gQ3JlYXRlIGZyb20gYSBTdHJpbmdQaWVjZS4KLSAgc3RhdGljIFN0cmluZ1BpZWNlUG9kIENyZWF0ZUZyb21TdHJpbmdQaWVjZShTdHJpbmdQaWVjZSBzdHIpIHsKLSAgICBTdHJpbmdQaWVjZVBvZCBwb2Q7Ci0gICAgcG9kLmRhdGFfID0gc3RyLmRhdGEoKTsKLSAgICBwb2Quc2l6ZV8gPSBzdHIuc2l6ZSgpOwotICAgIHJldHVybiBwb2Q7Ci0gIH0KLQotICAvLyBDYXN0IHRvIFN0cmluZ1BpZWNlLgotICBvcGVyYXRvciBTdHJpbmdQaWVjZSgpIGNvbnN0IHsgcmV0dXJuIFN0cmluZ1BpZWNlKGRhdGFfLCBzaXplXyk7IH0KLQotICBib29sIG9wZXJhdG9yPT0oY29uc3QgY2hhciogdmFsdWUpIGNvbnN0IHsKLSAgICByZXR1cm4gU3RyaW5nUGllY2UoZGF0YV8sIHNpemVfKSA9PSBTdHJpbmdQaWVjZSh2YWx1ZSk7Ci0gIH0KLQotICBjaGFyIG9wZXJhdG9yW10oc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBpKSBjb25zdCB7Ci0gICAgYXNzZXJ0KDAgPD0gaSk7Ci0gICAgYXNzZXJ0KGkgPCBzaXplXyk7Ci0gICAgcmV0dXJuIGRhdGFfW2ldOwotICB9Ci0KLSAgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIGRhdGFfOyB9Ci0KLSAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBzaXplKCkgY29uc3QgewotICAgIHJldHVybiBzaXplXzsKLSAgfQotCi0gIHN0ZDo6c3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgeyByZXR1cm4gc3RkOjpzdHJpbmcoZGF0YV8sIHNpemVfKTsgfQotIHByaXZhdGU6Ci0gIGNvbnN0IGNoYXIqIGRhdGFfOwotICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIHNpemVfOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1NUQVJUCi10ZW1wbGF0ZTw+IHN0cnVjdCBoYXNoPFN0cmluZ1BpZWNlPiB7Ci0gIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IFN0cmluZ1BpZWNlJiBzKSBjb25zdCB7Ci0gICAgc2l6ZV90IHJlc3VsdCA9IDA7Ci0gICAgZm9yIChjb25zdCBjaGFyICpzdHIgPSBzLmRhdGEoKSwgKmVuZCA9IHN0ciArIHMuc2l6ZSgpOyBzdHIgPCBlbmQ7IHN0cisrKSB7ICAKLSAgICAgIHJlc3VsdCA9IDUgKiByZXN1bHQgKyAqc3RyOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19OwotR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX0VORAotCi0jZW5kaWYgIC8vIFNUUklOR1NfU1RSSU5HUElFQ0VfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZmRmZTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNzQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIGZyb20gZ29vZ2xlMy9iYXNlL3N0cmluZ3ByaW50Zi5jYwotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgotCi0jaW5jbHVkZSA8ZXJybm8uaD4KLSNpbmNsdWRlIDxzdGRhcmcuaD4gLy8gRm9yIHZhX2xpc3QgYW5kIHJlbGF0ZWQgb3BlcmF0aW9ucwotI2luY2x1ZGUgPHN0ZGlvLmg+IC8vIE1TVkMgcmVxdWlyZXMgdGhpcyBmb3IgX3ZzbnByaW50ZgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotI2lmZGVmIF9NU0NfVkVSCi1lbnVtIHsgSVNfQ09NUElMRVJfTVNWQyA9IDEgfTsKLSNpZm5kZWYgdmFfY29weQotLy8gRGVmaW5lIHZhX2NvcHkgZm9yIE1TVkMuIFRoaXMgaXMgYSBoYWNrLCBhc3N1bWluZyB2YV9saXN0IGlzIHNpbXBseSBhCi0vLyBwb2ludGVyIGludG8gdGhlIHN0YWNrIGFuZCBpcyBzYWZlIHRvIGNvcHkuCi0jZGVmaW5lIHZhX2NvcHkoZGVzdCwgc3JjKSAoKGRlc3QpID0gKHNyYykpCi0jZW5kaWYKLSNlbHNlCi1lbnVtIHsgSVNfQ09NUElMRVJfTVNWQyA9IDAgfTsKLSNlbmRpZgotCi12b2lkIFN0cmluZ0FwcGVuZFYoc3RyaW5nKiBkc3QsIGNvbnN0IGNoYXIqIGZvcm1hdCwgdmFfbGlzdCBhcCkgewotICAvLyBGaXJzdCB0cnkgd2l0aCBhIHNtYWxsIGZpeGVkIHNpemUgYnVmZmVyCi0gIHN0YXRpYyBjb25zdCBpbnQga1NwYWNlTGVuZ3RoID0gMTAyNDsKLSAgY2hhciBzcGFjZVtrU3BhY2VMZW5ndGhdOwotCi0gIC8vIEl0J3MgcG9zc2libGUgZm9yIG1ldGhvZHMgdGhhdCB1c2UgYSB2YV9saXN0IHRvIGludmFsaWRhdGUKLSAgLy8gdGhlIGRhdGEgaW4gaXQgdXBvbiB1c2UuICBUaGUgZml4IGlzIHRvIG1ha2UgYSBjb3B5Ci0gIC8vIG9mIHRoZSBzdHJ1Y3R1cmUgYmVmb3JlIHVzaW5nIGl0IGFuZCB1c2UgdGhhdCBjb3B5IGluc3RlYWQuCi0gIHZhX2xpc3QgYmFja3VwX2FwOwotICB2YV9jb3B5KGJhY2t1cF9hcCwgYXApOwotICBpbnQgcmVzdWx0ID0gdnNucHJpbnRmKHNwYWNlLCBrU3BhY2VMZW5ndGgsIGZvcm1hdCwgYmFja3VwX2FwKTsKLSAgdmFfZW5kKGJhY2t1cF9hcCk7Ci0KLSAgaWYgKHJlc3VsdCA8IGtTcGFjZUxlbmd0aCkgewotICAgIGlmIChyZXN1bHQgPj0gMCkgewotICAgICAgLy8gTm9ybWFsIGNhc2UgLS0gZXZlcnl0aGluZyBmaXQuCi0gICAgICBkc3QtPmFwcGVuZChzcGFjZSwgcmVzdWx0KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpZiAoSVNfQ09NUElMRVJfTVNWQykgewotICAgICAgLy8gRXJyb3Igb3IgTVNWQyBydW5uaW5nIG91dCBvZiBzcGFjZS4gIE1TVkMgOC4wIGFuZCBoaWdoZXIKLSAgICAgIC8vIGNhbiBiZSBhc2tlZCBhYm91dCBzcGFjZSBuZWVkZWQgd2l0aCB0aGUgc3BlY2lhbCBpZGlvbSBiZWxvdzoKLSAgICAgIHZhX2NvcHkoYmFja3VwX2FwLCBhcCk7Ci0gICAgICByZXN1bHQgPSB2c25wcmludGYoTlVMTCwgMCwgZm9ybWF0LCBiYWNrdXBfYXApOwotICAgICAgdmFfZW5kKGJhY2t1cF9hcCk7Ci0gICAgfQotCi0gICAgaWYgKHJlc3VsdCA8IDApIHsKLSAgICAgIC8vIEp1c3QgYW4gZXJyb3IuCi0gICAgICByZXR1cm47Ci0gICAgfQotICB9Ci0KLSAgLy8gSW5jcmVhc2UgdGhlIGJ1ZmZlciBzaXplIHRvIHRoZSBzaXplIHJlcXVlc3RlZCBieSB2c25wcmludGYsCi0gIC8vIHBsdXMgb25lIGZvciB0aGUgY2xvc2luZyBcMC4KLSAgaW50IGxlbmd0aCA9IHJlc3VsdCsxOwotICBjaGFyKiBidWYgPSBuZXcgY2hhcltsZW5ndGhdOwotCi0gIC8vIFJlc3RvcmUgdGhlIHZhX2xpc3QgYmVmb3JlIHdlIHVzZSBpdCBhZ2FpbgotICB2YV9jb3B5KGJhY2t1cF9hcCwgYXApOwotICByZXN1bHQgPSB2c25wcmludGYoYnVmLCBsZW5ndGgsIGZvcm1hdCwgYmFja3VwX2FwKTsKLSAgdmFfZW5kKGJhY2t1cF9hcCk7Ci0KLSAgaWYgKHJlc3VsdCA+PSAwICYmIHJlc3VsdCA8IGxlbmd0aCkgewotICAgIC8vIEl0IGZpdAotICAgIGRzdC0+YXBwZW5kKGJ1ZiwgcmVzdWx0KTsKLSAgfQotICBkZWxldGVbXSBidWY7Ci19Ci0KLQotc3RyaW5nIFN0cmluZ1ByaW50Zihjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm9ybWF0KTsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgU3RyaW5nQXBwZW5kVigmcmVzdWx0LCBmb3JtYXQsIGFwKTsKLSAgdmFfZW5kKGFwKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotY29uc3Qgc3RyaW5nJiBTU3RyaW5nUHJpbnRmKHN0cmluZyogZHN0LCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgewotICB2YV9saXN0IGFwOwotICB2YV9zdGFydChhcCwgZm9ybWF0KTsKLSAgZHN0LT5jbGVhcigpOwotICBTdHJpbmdBcHBlbmRWKGRzdCwgZm9ybWF0LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci0gIHJldHVybiAqZHN0OwotfQotCi12b2lkIFN0cmluZ0FwcGVuZEYoc3RyaW5nKiBkc3QsIGNvbnN0IGNoYXIqIGZvcm1hdCwgLi4uKSB7Ci0gIHZhX2xpc3QgYXA7Ci0gIHZhX3N0YXJ0KGFwLCBmb3JtYXQpOwotICBTdHJpbmdBcHBlbmRWKGRzdCwgZm9ybWF0LCBhcCk7Ci0gIHZhX2VuZChhcCk7Ci19Ci0KLS8vIE1heCBhcmd1bWVudHMgc3VwcG9ydGVkIGJ5IFN0cmluZ1ByaW50VmVjdG9yCi1jb25zdCBpbnQga1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3MgPSAzMjsKLQotLy8gQW4gZW1wdHkgYmxvY2sgb2YgemVybyBmb3IgZmlsbGVyIGFyZ3VtZW50cy4gIFRoaXMgaXMgY29uc3Qgc28gdGhhdCBpZgotLy8gcHJpbnRmIHRyaWVzIHRvIHdyaXRlIHRvIGl0ICh2aWEgJW4pIHRoZW4gdGhlIHByb2dyYW0gZ2V0cyBhIFNJR1NFR1YKLS8vIGFuZCB3ZSBjYW4gZml4IHRoZSBwcm9ibGVtIG9yIHByb3RlY3QgYWdhaW5zdCBhbiBhdHRhY2suCi1zdGF0aWMgY29uc3QgY2hhciBzdHJpbmdfcHJpbnRmX2VtcHR5X2Jsb2NrWzI1Nl0gPSB7ICdcMCcgfTsKLQotc3RyaW5nIFN0cmluZ1ByaW50ZlZlY3Rvcihjb25zdCBjaGFyKiBmb3JtYXQsIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiB2KSB7Ci0gIEdPT0dMRV9DSEVDS19MRSh2LnNpemUoKSwga1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3MpCi0gICAgICA8PCAiU3RyaW5nUHJpbnRmVmVjdG9yIGN1cnJlbnRseSBvbmx5IHN1cHBvcnRzIHVwIHRvICIKLSAgICAgIDw8IGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzIDw8ICIgYXJndW1lbnRzLiAiCi0gICAgICA8PCAiRmVlbCBmcmVlIHRvIGFkZCBzdXBwb3J0IGZvciBtb3JlIGlmIHlvdSBuZWVkIGl0LiI7Ci0KLSAgLy8gQWRkIGZpbGxlciBhcmd1bWVudHMgc28gdGhhdCBib2d1cyBmb3JtYXQrYXJncyBoYXZlIGEgaGFyZGVyIHRpbWUKLSAgLy8gY3Jhc2hpbmcgdGhlIHByb2dyYW0sIGNvcnJ1cHRpbmcgdGhlIHByb2dyYW0gKCVuKSwKLSAgLy8gb3IgZGlzcGxheWluZyByYW5kb20gY2h1bmtzIG9mIG1lbW9yeSB0byB1c2Vycy4KLQotICBjb25zdCBjaGFyKiBjc3RyW2tTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB2LnNpemUoKTsgKytpKSB7Ci0gICAgY3N0cltpXSA9IHZbaV0uY19zdHIoKTsKLSAgfQotICBmb3IgKGludCBpID0gdi5zaXplKCk7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGNzdHIpOyArK2kpIHsKLSAgICBjc3RyW2ldID0gJnN0cmluZ19wcmludGZfZW1wdHlfYmxvY2tbMF07Ci0gIH0KLQotICAvLyBJIGRvIG5vdCBrbm93IGFueSB3YXkgdG8gcGFzcyBrU3RyaW5nUHJpbnRmVmVjdG9yTWF4QXJncyBhcmd1bWVudHMsCi0gIC8vIG9yIGFueSB3YXkgdG8gYnVpbGQgYSB2YV9saXN0IGJ5IGhhbmQsIG9yIGFueSBBUEkgZm9yIHByaW50ZgotICAvLyB0aGF0IGFjY2VwdHMgYW4gYXJyYXkgb2YgYXJndW1lbnRzLiAgVGhlIGJlc3QgSSBjYW4gZG8gaXMgc3RpY2sKLSAgLy8gdGhpcyBDT01QSUxFX0FTU0VSVCByaWdodCBuZXh0IHRvIHRoZSBhY3R1YWwgc3RhdGVtZW50LgotCi0gIEdPT0dMRV9DT01QSUxFX0FTU0VSVChrU3RyaW5nUHJpbnRmVmVjdG9yTWF4QXJncyA9PSAzMiwgYXJnX2NvdW50X21pc21hdGNoKTsKLSAgcmV0dXJuIFN0cmluZ1ByaW50Zihmb3JtYXQsCi0gICAgICAgICAgICAgICAgICAgICAgY3N0clswXSwgY3N0clsxXSwgY3N0clsyXSwgY3N0clszXSwgY3N0cls0XSwKLSAgICAgICAgICAgICAgICAgICAgICBjc3RyWzVdLCBjc3RyWzZdLCBjc3RyWzddLCBjc3RyWzhdLCBjc3RyWzldLAotICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMTBdLCBjc3RyWzExXSwgY3N0clsxMl0sIGNzdHJbMTNdLCBjc3RyWzE0XSwKLSAgICAgICAgICAgICAgICAgICAgICBjc3RyWzE1XSwgY3N0clsxNl0sIGNzdHJbMTddLCBjc3RyWzE4XSwgY3N0clsxOV0sCi0gICAgICAgICAgICAgICAgICAgICAgY3N0clsyMF0sIGNzdHJbMjFdLCBjc3RyWzIyXSwgY3N0clsyM10sIGNzdHJbMjRdLAotICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMjVdLCBjc3RyWzI2XSwgY3N0clsyN10sIGNzdHJbMjhdLCBjc3RyWzI5XSwKLSAgICAgICAgICAgICAgICAgICAgICBjc3RyWzMwXSwgY3N0clszMV0pOwotfQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNzlhNmVlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjCisrKyAvZGV2L251bGwKQEAgLTEsNTg4ICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA1LTIwMDggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KLS8vIEF1dGhvcjoganJtQGdvb2dsZS5jb20gKEppbSBNZWVoYW4pCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhlc2UgZm91ci1ieXRlIGVudHJpZXMgY29tcGFjdGx5IGVuY29kZSBob3cgbWFueSBieXRlcyAwLi4yNTUgdG8gZGVsZXRlCi0vLyBpbiBtYWtpbmcgYSBzdHJpbmcgcmVwbGFjZW1lbnQsIGhvdyBtYW55IGJ5dGVzIHRvIGFkZCAwLi4yNTUsIGFuZCB0aGUgb2Zmc2V0Ci0vLyAwLi42NGstMSBvZiB0aGUgcmVwbGFjZW1lbnQgc3RyaW5nIGluIHJlbWFwX3N0cmluZy4KLXN0cnVjdCBSZW1hcEVudHJ5IHsKLSAgdWludDggZGVsZXRlX2J5dGVzOwotICB1aW50OCBhZGRfYnl0ZXM7Ci0gIHVpbnQxNiBieXRlc19vZmZzZXQ7Ci19OwotCi0vLyBFeGl0IHR5cGUgY29kZXMgZm9yIHN0YXRlIHRhYmxlcy4gQWxsIGJ1dCB0aGUgZmlyc3QgZ2V0IHN0dWZmZWQgaW50bwotLy8gc2lnbmVkIG9uZS1ieXRlIGVudHJpZXMuIFRoZSBmaXJzdCBpcyBvbmx5IGdlbmVyYXRlZCBieSBleGVjdXRhYmxlIGNvZGUuCi0vLyBUbyBkaXN0aW5ndWlzaCBmcm9tIG5leHQtc3RhdGUgZW50cmllcywgdGhlc2UgbXVzdCBiZSBjb250aWd1b3VzIGFuZAotLy8gYWxsIDw9IGtFeGl0Tm9uZQotdHlwZWRlZiBlbnVtIHsKLSAga0V4aXREc3RTcGFjZUZ1bGwgPSAyMzksCi0gIGtFeGl0SWxsZWdhbFN0cnVjdHVyZSwgIC8vIDI0MAotICBrRXhpdE9LLCAgICAgICAgICAgICAgICAvLyAyNDEKLSAga0V4aXRSZWplY3QsICAgICAgICAgICAgLy8gLi4uCi0gIGtFeGl0UmVwbGFjZTEsCi0gIGtFeGl0UmVwbGFjZTIsCi0gIGtFeGl0UmVwbGFjZTMsCi0gIGtFeGl0UmVwbGFjZTIxLAotICBrRXhpdFJlcGxhY2UzMSwKLSAga0V4aXRSZXBsYWNlMzIsCi0gIGtFeGl0UmVwbGFjZU9mZnNldDEsCi0gIGtFeGl0UmVwbGFjZU9mZnNldDIsCi0gIGtFeGl0UmVwbGFjZTFTMCwKLSAga0V4aXRTcGVjaWFsLAotICBrRXhpdERvQWdhaW4sCi0gIGtFeGl0UmVqZWN0QWx0LAotICBrRXhpdE5vbmUgICAgICAgICAgICAgICAvLyAyNTUKLX0gRXhpdFJlYXNvbjsKLQotCi0vLyBUaGlzIHN0cnVjdCByZXByZXNlbnRzIG9uZSBlbnRpcmUgc3RhdGUgdGFibGUuIFRoZSB0aHJlZSBpbml0aWFsaXplZCBieXRlCi0vLyBhcmVhcyBhcmUgc3RhdGVfdGFibGUsIHJlbWFwX2Jhc2UsIGFuZCByZW1hcF9zdHJpbmcuIHN0YXRlMCBhbmQgc3RhdGUwX3NpemUKLS8vIGdpdmUgdGhlIGJ5dGUgb2Zmc2V0IGFuZCBsZW5ndGggd2l0aGluIHN0YXRlX3RhYmxlIG9mIHRoZSBpbml0aWFsIHN0YXRlIC0tCi0vLyB0YWJsZSBsb29rdXBzIGFyZSBleHBlY3RlZCB0byBzdGFydCBhbmQgZW5kIGluIHRoaXMgc3RhdGUsIGJ1dCBmb3IKLS8vIHRydW5jYXRlZCBVVEYtOCBzdHJpbmdzLCBtYXkgZW5kIGluIGEgZGlmZmVyZW50IHN0YXRlLiBUaGVzZSBhbGxvdyBhIHF1aWNrCi0vLyB0ZXN0IGZvciB0aGF0IGNvbmRpdGlvbi4gZW50cnlfc2hpZnQgaXMgOCBmb3IgdGFibGVzIHN1YnNjcmlwdGVkIGJ5IGEgZnVsbAotLy8gYnl0ZSB2YWx1ZSBhbmQgNiBmb3Igc3BhY2Utb3B0aW1pemVkIHRhYmxlcyBzdWJzY3JpcHRlZCBieSBvbmx5IHNpeAotLy8gc2lnbmlmaWNhbnQgYml0cyBpbiBVVEYtOCBjb250aW51YXRpb24gYnl0ZXMuCi10eXBlZGVmIHN0cnVjdCB7Ci0gIGNvbnN0IHVpbnQzMiBzdGF0ZTA7Ci0gIGNvbnN0IHVpbnQzMiBzdGF0ZTBfc2l6ZTsKLSAgY29uc3QgdWludDMyIHRvdGFsX3NpemU7Ci0gIGNvbnN0IGludCBtYXhfZXhwYW5kOwotICBjb25zdCBpbnQgZW50cnlfc2hpZnQ7Ci0gIGNvbnN0IGludCBieXRlc19wZXJfZW50cnk7Ci0gIGNvbnN0IHVpbnQzMiBsb3N1YjsKLSAgY29uc3QgdWludDMyIGhpYWRkOwotICBjb25zdCB1aW50OCogc3RhdGVfdGFibGU7Ci0gIGNvbnN0IFJlbWFwRW50cnkqIHJlbWFwX2Jhc2U7Ci0gIGNvbnN0IHVpbnQ4KiByZW1hcF9zdHJpbmc7Ci0gIGNvbnN0IHVpbnQ4KiBmYXN0X3N0YXRlOwotfSBVVEY4U3RhdGVNYWNoaW5lT2JqOwotCi10eXBlZGVmIFVURjhTdGF0ZU1hY2hpbmVPYmogVVRGOFNjYW5PYmo7Ci0KLSNkZWZpbmUgWF9fIChrRXhpdElsbGVnYWxTdHJ1Y3R1cmUpCi0jZGVmaW5lIFJKXyAoa0V4aXRSZWplY3QpCi0jZGVmaW5lIFMxXyAoa0V4aXRSZXBsYWNlMSkKLSNkZWZpbmUgUzJfIChrRXhpdFJlcGxhY2UyKQotI2RlZmluZSBTM18gKGtFeGl0UmVwbGFjZTMpCi0jZGVmaW5lIFMyMSAoa0V4aXRSZXBsYWNlMjEpCi0jZGVmaW5lIFMzMSAoa0V4aXRSZXBsYWNlMzEpCi0jZGVmaW5lIFMzMiAoa0V4aXRSZXBsYWNlMzIpCi0jZGVmaW5lIFQxXyAoa0V4aXRSZXBsYWNlT2Zmc2V0MSkKLSNkZWZpbmUgVDJfIChrRXhpdFJlcGxhY2VPZmZzZXQyKQotI2RlZmluZSBTMTEgKGtFeGl0UmVwbGFjZTFTMCkKLSNkZWZpbmUgU1BfIChrRXhpdFNwZWNpYWwpCi0jZGVmaW5lIERfXyAoa0V4aXREb0FnYWluKQotI2RlZmluZSBSSkEgKGtFeGl0UmVqZWN0QWx0KQotCi0vLyAgRW50aXJlIHRhYmxlIGhhcyA5IHN0YXRlIGJsb2NrcyBvZiAyNTYgZW50cmllcyBlYWNoCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX1NUQVRFMCA9IDA7ICAgICAvLyBzdGF0ZVswXQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TVEFURTBfU0laRSA9IDI1NjsgIC8vID1bMV0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfVE9UQUxfU0laRSA9IDIzMDQ7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX01BWF9FWFBBTkRfWDQgPSAwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TSElGVCA9IDg7Ci1zdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0JZVEVTID0gMTsKLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBpbnQgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfTE9TVUIgPSAweDIwMjAyMDIwOwotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19ISUFERCA9IDB4MDAwMDAwMDA7Ci0KLXN0YXRpYyBjb25zdCB1aW50OCB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc1tdID0gewotLy8gc3RhdGVbMF0gMHgwMDAwMDAgQnl0ZSAxCi0gIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotCi0gIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi1YX18sIFhfXywgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAotICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKLSAgMiwgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgNywgICAzLCAgIDMsCi0gIDQsICAgNSwgICA1LCAgIDUsICAgNiwgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi0vLyBzdGF0ZVsxXSAweDAwMDA4MCBCeXRlIDIgb2YgMgotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLSAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsCi0gIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLAotICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwgICAwLCAgIDAsICAgMCwKLQotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotLy8gc3RhdGVbMl0gMHgwMDAwMDAgQnl0ZSAyIG9mIDMKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKLSAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCi0KLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLS8vIHN0YXRlWzNdIDB4MDAxMDAwIEJ5dGUgMiBvZiAzCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi0gIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAotICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKLSAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCi0gIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLAotCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi0vLyBzdGF0ZVs0XSAweDAwMDAwMCBCeXRlIDIgb2YgNAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLSAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCi0gIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAotICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKLQotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotLy8gc3RhdGVbNV0gMHgwNDAwMDAgQnl0ZSAyIG9mIDQKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLSAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCi0gIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAotICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywKLSAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsCi0KLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLS8vIHN0YXRlWzZdIDB4MTAwMDAwIEJ5dGUgMiBvZiA0Ci1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi0gIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAgMywgICAzLCAgIDMsICAgMywgICAzLCAgIDMsICAgMywgICAzLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotCi0vLyBzdGF0ZVs3XSAweDAwZDAwMCBCeXRlIDIgb2YgMwotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwKLSAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsICAgMSwgICAxLCAgIDEsCi0gIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LAotICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwgICA4LCAgIDgsICAgOCwKLQotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLQotLy8gc3RhdGVbOF0gMHgwMGQ4MDAgQnl0ZSAzIG9mIDMKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi0KLVJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCAgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sCi1SSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLAotUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sICBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywKLVJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCAgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sIFJKXywgUkpfLCBSSl8sCi0KLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi1YX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLAotWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sICBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywKLVhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCAgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sIFhfXywgWF9fLCBYX18sCi19OwotCi0vLyBSZW1hcCBiYXNlWzBdID0gKGRlbCwgYWRkLCBzdHJpbmdfb2Zmc2V0KQotc3RhdGljIGNvbnN0IFJlbWFwRW50cnkgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfcmVtYXBfYmFzZVtdID0gewotezAsIDAsIDB9IH07Ci0KLS8vIFJlbWFwIHN0cmluZ1swXQotc3RhdGljIGNvbnN0IHVuc2lnbmVkIGNoYXIgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfcmVtYXBfc3RyaW5nW10gPSB7Ci0wIH07Ci0KLXN0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX2Zhc3RbMjU2XSA9IHsKLTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotCi0wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLTAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAotMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCi0wLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAgMCwgMCwgMCwgMCwgMCwgMCwgMCwgMCwKLQotMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0xLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0KLTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsCi0xLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwKLTEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLAotfTsKLQotc3RhdGljIGNvbnN0IFVURjhTY2FuT2JqIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX29iaiA9IHsKLSAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfU1RBVEUwLAotICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19TVEFURTBfU0laRSwKLSAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfVE9UQUxfU0laRSwKLSAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfTUFYX0VYUEFORF9YNCwKLSAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfU0hJRlQsCi0gIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX0JZVEVTLAotICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19MT1NVQiwKLSAgdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfSElBREQsCi0gIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzLAotICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19yZW1hcF9iYXNlLAotICB1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19yZW1hcF9zdHJpbmcsCi0gIHV0ZjhhY2NlcHRub25zdXJyb2dhdGVzX2Zhc3QKLX07Ci0KLQotI3VuZGVmIFhfXwotI3VuZGVmIFJKXwotI3VuZGVmIFMxXwotI3VuZGVmIFMyXwotI3VuZGVmIFMzXwotI3VuZGVmIFMyMQotI3VuZGVmIFMzMQotI3VuZGVmIFMzMgotI3VuZGVmIFQxXwotI3VuZGVmIFQyXwotI3VuZGVmIFMxMQotI3VuZGVmIFNQXwotI3VuZGVmIERfXwotI3VuZGVmIFJKQQotCi0vLyBSZXR1cm4gdHJ1ZSBpZiBjdXJyZW50IFRibCBwb2ludGVyIGlzIHdpdGhpbiBzdGF0ZTAgcmFuZ2UKLS8vIE5vdGUgdGhhdCB1bnNpZ25lZCBjb21wYXJlIGNoZWNrcyBib3RoIGVuZHMgb2YgcmFuZ2Ugc2ltdWx0YW5lb3VzbHkKLXN0YXRpYyBpbmxpbmUgYm9vbCBJblN0YXRlWmVybyhjb25zdCBVVEY4U2Nhbk9iaiogc3QsIGNvbnN0IHVpbnQ4KiBUYmwpIHsKLSAgY29uc3QgdWludDgqIFRibDAgPSAmc3QtPnN0YXRlX3RhYmxlW3N0LT5zdGF0ZTBdOwotICByZXR1cm4gKHN0YXRpY19jYXN0PHVpbnQzMj4oVGJsIC0gVGJsMCkgPCBzdC0+c3RhdGUwX3NpemUpOwotfQotCi0vLyBTY2FuIGEgVVRGLTggc3RyaW5nIGJhc2VkIG9uIHN0YXRlIHRhYmxlLgotLy8gQWx3YXlzIHNjYW4gY29tcGxldGUgVVRGLTggY2hhcmFjdGVycwotLy8gU2V0IG51bWJlciBvZiBieXRlcyBzY2FubmVkLiBSZXR1cm4gcmVhc29uIGZvciBleGl0aW5nCi1pbnQgVVRGOEdlbmVyaWNTY2FuKGNvbnN0IFVURjhTY2FuT2JqKiBzdCwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgaW50IHN0cl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgIGludCogYnl0ZXNfY29uc3VtZWQpIHsKLSAgKmJ5dGVzX2NvbnN1bWVkID0gMDsKLSAgaWYgKHN0cl9sZW5ndGggPT0gMCkgcmV0dXJuIGtFeGl0T0s7Ci0KLSAgaW50IGVzaGlmdCA9IHN0LT5lbnRyeV9zaGlmdDsKLSAgY29uc3QgdWludDgqIGlzcmMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oc3RyKTsKLSAgY29uc3QgdWludDgqIHNyYyA9IGlzcmM7Ci0gIGNvbnN0IHVpbnQ4KiBzcmNsaW1pdCA9IGlzcmMgKyBzdHJfbGVuZ3RoOwotICBjb25zdCB1aW50OCogc3JjbGltaXQ4ID0gc3JjbGltaXQgLSA3OwotICBjb25zdCB1aW50OCogVGJsXzAgPSAmc3QtPnN0YXRlX3RhYmxlW3N0LT5zdGF0ZTBdOwotCi0gRG9BZ2FpbjoKLSAgLy8gRG8gc3RhdGUtdGFibGUgc2NhbgotICBpbnQgZSA9IDA7Ci0gIHVpbnQ4IGM7Ci0gIGNvbnN0IHVpbnQ4KiBUYmwyID0gJnN0LT5mYXN0X3N0YXRlWzBdOwotICBjb25zdCB1aW50MzIgbG9zdWIgPSBzdC0+bG9zdWI7Ci0gIGNvbnN0IHVpbnQzMiBoaWFkZCA9IHN0LT5oaWFkZDsKLSAgLy8gQ2hlY2sgaW5pdGlhbCBmZXcgYnl0ZXMgb25lIGF0IGEgdGltZSB1bnRpbCA4LWJ5dGUgYWxpZ25lZAotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgd2hpbGUgKCgoKHVpbnRwdHJfdClzcmMgJiAweDA3KSAhPSAwKSAmJgotICAgICAgICAgKHNyYyA8IHNyY2xpbWl0KSAmJgotICAgICAgICAgVGJsMltzcmNbMF1dID09IDApIHsKLSAgICBzcmMrKzsKLSAgfQotICBpZiAoKCh1aW50cHRyX3Qpc3JjICYgMHgwNykgPT0gMCkgewotICAgIC8vIERvIGZhc3QgZm9yIGdyb3VwcyBvZiA4IGlkZW50aXR5IGJ5dGVzLgotICAgIC8vIFRoaXMgY292ZXJzIGEgbG90IG9mIDctYml0IEFTQ0lJIH44eCBmYXN0ZXIgdGhlbiB0aGUgMS1ieXRlIGxvb3AsCi0gICAgLy8gaW5jbHVkaW5nIHNsb3dpbmcgc2xpZ2h0bHkgb24gY3IvbGYvaHQKLSAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgICB3aGlsZSAoc3JjIDwgc3JjbGltaXQ4KSB7Ci0gICAgICB1aW50MzIgczAxMjMgPSAocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIgKj4oc3JjKSlbMF07Ci0gICAgICB1aW50MzIgczQ1NjcgPSAocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIgKj4oc3JjKSlbMV07Ci0gICAgICBzcmMgKz0gODsKLSAgICAgIC8vIFRoaXMgaXMgYSBmYXN0IHJhbmdlIGNoZWNrIGZvciBhbGwgYnl0ZXMgaW4gW2xvd3N1Yi4uMHg4MC1oaWFkZCkKLSAgICAgIHVpbnQzMiB0ZW1wID0gKHMwMTIzIC0gbG9zdWIpIHwgKHMwMTIzICsgaGlhZGQpIHwKLSAgICAgICAgICAgICAgICAgICAgKHM0NTY3IC0gbG9zdWIpIHwgKHM0NTY3ICsgaGlhZGQpOwotICAgICAgaWYgKCh0ZW1wICYgMHg4MDgwODA4MCkgIT0gMCkgewotICAgICAgICAvLyBXZSB0eXBpY2FsbHkgZW5kIHVwIGhlcmUgb24gY3IvbGYvaHQ7IHNyYyB3YXMgaW5jcmVtZW50ZWQKLSAgICAgICAgaW50IGUwMTIzID0gKFRibDJbc3JjWy04XV0gfCBUYmwyW3NyY1stN11dKSB8Ci0gICAgICAgICAgICAgICAgICAgIChUYmwyW3NyY1stNl1dIHwgVGJsMltzcmNbLTVdXSk7Ci0gICAgICAgIGlmIChlMDEyMyAhPSAwKSB7Ci0gICAgICAgICAgc3JjIC09IDg7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0gICAgLy8gRXhpdCBvbiBOb24taW50ZXJjaGFuZ2UKLSAgICAgICAgZTAxMjMgPSAoVGJsMltzcmNbLTRdXSB8IFRibDJbc3JjWy0zXV0pIHwKLSAgICAgICAgICAgICAgICAoVGJsMltzcmNbLTJdXSB8IFRibDJbc3JjWy0xXV0pOwotICAgICAgICBpZiAoZTAxMjMgIT0gMCkgewotICAgICAgICAgIHNyYyAtPSA0OwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9ICAgIC8vIEV4aXQgb24gTm9uLWludGVyY2hhbmdlCi0gICAgICAgIC8vIEVsc2UgT0ssIGdvIGFyb3VuZCBhZ2FpbgotICAgICAgfQotICAgIH0KLSAgfQotICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvLyBCeXRlLWF0LWEtdGltZSBzY2FuCi0gIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICBjb25zdCB1aW50OCogVGJsID0gVGJsXzA7Ci0gIHdoaWxlIChzcmMgPCBzcmNsaW1pdCkgewotICAgIGMgPSAqc3JjOwotICAgIGUgPSBUYmxbY107Ci0gICAgc3JjKys7Ci0gICAgaWYgKGUgPj0ga0V4aXRJbGxlZ2FsU3RydWN0dXJlKSB7YnJlYWs7fQotICAgIFRibCA9ICZUYmxfMFtlIDw8IGVzaGlmdF07Ci0gIH0KLSAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLQotICAvLyBFeGl0IHBvc2liaWxpdGllczoKLSAgLy8gIFNvbWUgZXhpdCBjb2RlLCAhc3RhdGUwLCBiYWNrIHVwIG92ZXIgbGFzdCBjaGFyCi0gIC8vICBTb21lIGV4aXQgY29kZSwgc3RhdGUwLCBiYWNrIHVwIG9uZSBieXRlIGV4YWN0bHkKLSAgLy8gIHNvdXJjZSBjb25zdW1lZCwgIXN0YXRlMCwgYmFjayB1cCBvdmVyIHBhcnRpYWwgY2hhcgotICAvLyAgc291cmNlIGNvbnN1bWVkLCBzdGF0ZTAsIGV4aXQgT0sKLSAgLy8gRm9yIGlsbGVnYWwgYnl0ZSBpbiBzdGF0ZTAsIGF2b2lkIGJhY2t1cCB1cCBvdmVyIFBSRVZJT1VTIGNoYXIKLSAgLy8gRm9yIHRydW5jYXRlZCBsYXN0IGNoYXIsIGJhY2sgdXAgdG8gYmVnaW5uaW5nIG9mIGl0Ci0KLSAgaWYgKGUgPj0ga0V4aXRJbGxlZ2FsU3RydWN0dXJlKSB7Ci0gICAgLy8gQmFjayB1cCBvdmVyIGV4YWN0bHkgb25lIGJ5dGUgb2YgcmVqZWN0ZWQvaWxsZWdhbCBVVEYtOCBjaGFyYWN0ZXIKLSAgICBzcmMtLTsKLSAgICAvLyBCYWNrIHVwIG1vcmUgaWYgbmVlZGVkCi0gICAgaWYgKCFJblN0YXRlWmVybyhzdCwgVGJsKSkgewotICAgICAgZG8gewotICAgICAgICBzcmMtLTsKLSAgICAgIH0gd2hpbGUgKChzcmMgPiBpc3JjKSAmJiAoKHNyY1swXSAmIDB4YzApID09IDB4ODApKTsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoIUluU3RhdGVaZXJvKHN0LCBUYmwpKSB7Ci0gICAgLy8gQmFjayB1cCBvdmVyIHRydW5jYXRlZCBVVEYtOCBjaGFyYWN0ZXIKLSAgICBlID0ga0V4aXRJbGxlZ2FsU3RydWN0dXJlOwotICAgIGRvIHsKLSAgICAgIHNyYy0tOwotICAgIH0gd2hpbGUgKChzcmMgPiBpc3JjKSAmJiAoKHNyY1swXSAmIDB4YzApID09IDB4ODApKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBOb3JtYWwgdGVybWluYXRpb24sIHNvdXJjZSBmdWxseSBjb25zdW1lZAotICAgIGUgPSBrRXhpdE9LOwotICB9Ci0KLSAgaWYgKGUgPT0ga0V4aXREb0FnYWluKSB7Ci0gICAgLy8gTG9vcCBiYWNrIHVwIHRvIHRoZSBmYXN0IHNjYW4KLSAgICBnb3RvIERvQWdhaW47Ci0gIH0KLQotICAqYnl0ZXNfY29uc3VtZWQgPSBzcmMgLSBpc3JjOwotICByZXR1cm4gZTsKLX0KLQotaW50IFVURjhHZW5lcmljU2NhbkZhc3RBc2NpaShjb25zdCBVVEY4U2Nhbk9iaiogc3QsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBzdHIsCi0gICAgICAgICAgICAgICAgICAgIGludCBzdHJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICBpbnQqIGJ5dGVzX2NvbnN1bWVkKSB7Ci0gICpieXRlc19jb25zdW1lZCA9IDA7Ci0gIGlmIChzdHJfbGVuZ3RoID09IDApIHJldHVybiBrRXhpdE9LOwotCi0gIGNvbnN0IHVpbnQ4KiBpc3JjID0gIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihzdHIpOwotICBjb25zdCB1aW50OCogc3JjID0gaXNyYzsKLSAgY29uc3QgdWludDgqIHNyY2xpbWl0ID0gaXNyYyArIHN0cl9sZW5ndGg7Ci0gIGNvbnN0IHVpbnQ4KiBzcmNsaW1pdDggPSBzcmNsaW1pdCAtIDc7Ci0gIGludCBuOwotICBpbnQgcmVzdF9jb25zdW1lZDsKLSAgaW50IGV4aXRfcmVhc29uOwotICBkbyB7Ci0gICAgLy8gQ2hlY2sgaW5pdGlhbCBmZXcgYnl0ZXMgb25lIGF0IGEgdGltZSB1bnRpbCA4LWJ5dGUgYWxpZ25lZAotICAgIHdoaWxlICgoKCh1aW50cHRyX3Qpc3JjICYgMHgwNykgIT0gMCkgJiYKLSAgICAgICAgICAgKHNyYyA8IHNyY2xpbWl0KSAmJiAoc3JjWzBdIDwgMHg4MCkpIHsKLSAgICAgIHNyYysrOwotICAgIH0KLSAgICBpZiAoKCh1aW50cHRyX3Qpc3JjICYgMHgwNykgPT0gMCkgewotICAgICAgd2hpbGUgKChzcmMgPCBzcmNsaW1pdDgpICYmCi0gICAgICAgICAgICAgKCgocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MzIqPihzcmMpWzBdIHwKLSAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMio+KHNyYylbMV0pICYgMHg4MDgwODA4MCkgPT0gMCkpIHsKLSAgICAgICAgc3JjICs9IDg7Ci0gICAgICB9Ci0gICAgfQotICAgIHdoaWxlICgoc3JjIDwgc3JjbGltaXQpICYmIChzcmNbMF0gPCAweDgwKSkgewotICAgICAgc3JjKys7Ci0gICAgfQotICAgIC8vIFJ1biBzdGF0ZSB0YWJsZSBvbiB0aGUgcmVzdAotICAgIG4gPSBzcmMgLSBpc3JjOwotICAgIGV4aXRfcmVhc29uID0gVVRGOEdlbmVyaWNTY2FuKHN0LCBzdHIgKyBuLCBzdHJfbGVuZ3RoIC0gbiwgJnJlc3RfY29uc3VtZWQpOwotICAgIHNyYyArPSByZXN0X2NvbnN1bWVkOwotICB9IHdoaWxlICggZXhpdF9yZWFzb24gPT0ga0V4aXREb0FnYWluICk7Ci0KLSAgKmJ5dGVzX2NvbnN1bWVkID0gc3JjIC0gaXNyYzsKLSAgcmV0dXJuIGV4aXRfcmVhc29uOwotfQotCi0vLyBIYWNrOiAgT24gc29tZSBjb21waWxlcnMgdGhlIHN0YXRpYyB0YWJsZXMgYXJlIGluaXRpYWxpemVkIGF0IHN0YXJ0dXAuCi0vLyAgIFdlIGNhbid0IHVzZSB0aGVtIHVudGlsIHRoZXkgYXJlIGluaXRpYWxpemVkLiAgSG93ZXZlciwgc29tZSBQcm90b2NvbAotLy8gICBCdWZmZXIgcGFyc2luZyBoYXBwZW5zIGF0IHN0YXRpYyBpbml0IHRpbWUgYW5kIG1heSB0cnkgdG8gdmFsaWRhdGUKLS8vICAgVVRGLTggc3RyaW5ncy4gIFNpbmNlIFVURi04IHZhbGlkYXRpb24gaXMgb25seSB1c2VkIGZvciBkZWJ1Z2dpbmcKLS8vICAgYW55d2F5LCB3ZSBzaW1wbHkgYWx3YXlzIHJldHVybiBzdWNjZXNzIGlmIGluaXRpYWxpemF0aW9uIGhhc24ndAotLy8gICBvY2N1cnJlZCB5ZXQuCi1uYW1lc3BhY2UgewotCi1ib29sIG1vZHVsZV9pbml0aWFsaXplZF8gPSBmYWxzZTsKLQotc3RydWN0IEluaXREZXRlY3RvciB7Ci0gIEluaXREZXRlY3RvcigpIHsKLSAgICBtb2R1bGVfaW5pdGlhbGl6ZWRfID0gdHJ1ZTsKLSAgfQotfTsKLUluaXREZXRlY3RvciBpbml0X2RldGVjdG9yOwotCi19ICAvLyBuYW1lc3BhY2UKLQotYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBjaGFyKiBidWYsIGludCBsZW4pIHsKLSAgaWYgKCFtb2R1bGVfaW5pdGlhbGl6ZWRfKSByZXR1cm4gdHJ1ZTsKLSAgCi0gIGludCBieXRlc19jb25zdW1lZCA9IDA7Ci0gIFVURjhHZW5lcmljU2NhbkZhc3RBc2NpaSgmdXRmOGFjY2VwdG5vbnN1cnJvZ2F0ZXNfb2JqLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmLCBsZW4sICZieXRlc19jb25zdW1lZCk7Ci0gIHJldHVybiAoYnl0ZXNfY29uc3VtZWQgPT0gbGVuKTsKLX0KLQotaW50IFVURjhTcG5TdHJ1Y3R1cmFsbHlWYWxpZChjb25zdCBTdHJpbmdQaWVjZSYgc3RyKSB7Ci0gIGlmICghbW9kdWxlX2luaXRpYWxpemVkXykgcmV0dXJuIHN0ci5zaXplKCk7Ci0KLSAgaW50IGJ5dGVzX2NvbnN1bWVkID0gMDsKLSAgVVRGOEdlbmVyaWNTY2FuRmFzdEFzY2lpKCZ1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19vYmosCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpLCAmYnl0ZXNfY29uc3VtZWQpOwotICByZXR1cm4gYnl0ZXNfY29uc3VtZWQ7Ci19Ci0KLS8vIENvZXJjZSBVVEYtOCBieXRlIHN0cmluZyBpbiBzcmNfc3RyIHRvIGJlCi0vLyBhIHN0cnVjdHVyYWxseS12YWxpZCBlcXVhbC1sZW5ndGggc3RyaW5nIGJ5IHNlbGVjdGl2ZWx5Ci0vLyBvdmVyd3JpdGluZyBpbGxlZ2FsIGJ5dGVzIHdpdGggcmVwbGFjZV9jaGFyICh0eXBpY2FsbHkgYmxhbmspLgotLy8gcmVwbGFjZV9jaGFyIG11c3QgYmUgbGVnYWwgcHJpbnRhYmxlIDctYml0IEFzY2lpIDB4MjAuLjB4N2UuCi0vLyBzcmNfc3RyIGlzIHJlYWQtb25seS4gSWYgYW55IG92ZXJ3cml0aW5nIGlzIG5lZWRlZCwgYSBtb2RpZmllZCBieXRlIHN0cmluZwotLy8gaXMgY3JlYXRlZCBpbiBpZHN0LCBsZW5ndGggaXNyY2xlbi4KLS8vCi0vLyBSZXR1cm5zIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciwgaXNyYyBpZiBubyBjaGFuZ2VzIHdlcmUgbWFkZSwKLS8vICBvciBpZHN0IGlmIHNvbWUgYnl0ZXMgd2VyZSBjaGFuZ2VkLgotLy8KLS8vIEZhc3QgY2FzZTogYWxsIGlzIHN0cnVjdHVyYWxseSB2YWxpZCBhbmQgbm8gYnl0ZSBjb3B5aW5nIGlzIGRvbmUuCi0vLwotY2hhciogVVRGOENvZXJjZVRvU3RydWN0dXJhbGx5VmFsaWQoY29uc3QgU3RyaW5nUGllY2UmIHNyY19zdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBpZHN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciByZXBsYWNlX2NoYXIpIHsKLSAgY29uc3QgY2hhciogaXNyYyA9IHNyY19zdHIuZGF0YSgpOwotICBjb25zdCBpbnQgbGVuID0gc3JjX3N0ci5sZW5ndGgoKTsKLSAgaW50IG4gPSBVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoc3JjX3N0cik7Ci0gIGlmIChuID09IGxlbikgeyAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlIC0tIGFsbCBpcyBjb29sLCByZXR1cm4KLSAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4oaXNyYyk7Ci0gIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIFVudXN1YWwgY2FzZSAtLSBjb3B5IHcvbyBiYWQgYnl0ZXMKLSAgICBjb25zdCBjaGFyKiBzcmMgPSBpc3JjOwotICAgIGNvbnN0IGNoYXIqIHNyY2xpbWl0ID0gaXNyYyArIGxlbjsKLSAgICBjaGFyKiBkc3QgPSBpZHN0OwotICAgIG1lbW1vdmUoZHN0LCBzcmMsIG4pOyAgICAgICAvLyBDb3B5IGluaXRpYWwgZ29vZCBjaHVuawotICAgIHNyYyArPSBuOwotICAgIGRzdCArPSBuOwotICAgIHdoaWxlIChzcmMgPCBzcmNsaW1pdCkgeyAgICAvLyBzcmMgcG9pbnRzIHRvIGJvZ3VzIGJ5dGUgb3IgaXMgb2ZmIHRoZSBlbmQKLSAgICAgIGRzdFswXSA9IHJlcGxhY2VfY2hhcjsgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2Ugb25lIGJhZCBieXRlCi0gICAgICBzcmMrKzsKLSAgICAgIGRzdCsrOwotICAgICAgU3RyaW5nUGllY2Ugc3RyMihzcmMsIHNyY2xpbWl0IC0gc3JjKTsKLSAgICAgIG4gPSBVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoc3RyMik7ICAgICAgIC8vIHNjYW4gdGhlIHJlbWFpbmRlcgotICAgICAgbWVtbW92ZShkc3QsIHNyYywgbik7ICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBuZXh0IGdvb2QgY2h1bmsKLSAgICAgIHNyYyArPSBuOwotICAgICAgZHN0ICs9IG47Ci0gICAgfQotICB9Ci0gIHJldHVybiBpZHN0OwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTA4ODg4OC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDQwICswLDAgQEAKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCi0vLyBBdXRob3I6IHhwZW5nQGdvb2dsZS5jb20gKFBldGVyIFBlbmcpCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLW5hbWVzcGFjZSB7Ci0KLVRFU1QoU3RydWN0dXJhbGx5VmFsaWRUZXN0LCBWYWxpZFVURjhTdHJpbmcpIHsKLSAgLy8gT24gR0NDLCB0aGlzIHN0cmluZyBjYW4gYmUgd3JpdHRlbiBhczoKLSAgLy8gICAiYWJjZCAxMjM0IC0gXHUyMDE0XHUyMDEzXHUyMjEyIgotICAvLyBNU1ZDIHNlZW1zIHRvIGludGVycHJldCBcdSBkaWZmZXJlbnRseS4KLSAgc3RyaW5nIHZhbGlkX3N0cigiYWJjZCAxMjM0IC0gXDM0MlwyMDBcMjI0XDM0MlwyMDBcMjIzXDM0MlwyMTBcMjIyIC0geHl6Nzg5Iik7Ci0gIEVYUEVDVF9UUlVFKElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KHZhbGlkX3N0ci5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbGlkX3N0ci5zaXplKCkpKTsKLSAgLy8gQWRkaXRpb25hbCBjaGVjayBmb3IgcG9pbnRlciBhbGlnbm1lbnQKLSAgZm9yIChpbnQgaSA9IDE7IGkgPCA4OyArK2kpIHsKLSAgICBFWFBFQ1RfVFJVRShJc1N0cnVjdHVyYWxseVZhbGlkVVRGOCh2YWxpZF9zdHIuZGF0YSgpICsgaSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZF9zdHIuc2l6ZSgpIC0gaSkpOwotICB9Ci19Ci0KLVRFU1QoU3RydWN0dXJhbGx5VmFsaWRUZXN0LCBJbnZhbGlkVVRGOFN0cmluZykgewotICBjb25zdCBzdHJpbmcgaW52YWxpZF9zdHIoImFiY2RceEEwXHhCMFx4QTBceEIwXHhBMFx4QjAgLSB4eXo3ODkiKTsKLSAgRVhQRUNUX0ZBTFNFKElzU3RydWN0dXJhbGx5VmFsaWRVVEY4KGludmFsaWRfc3RyLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludmFsaWRfc3RyLnNpemUoKSkpOwotICAvLyBBZGRpdGlvbmFsIGNoZWNrIGZvciBwb2ludGVyIGFsaWdubWVudAotICBmb3IgKGludCBpID0gMTsgaSA8IDg7ICsraSkgewotICAgIEVYUEVDVF9GQUxTRShJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChpbnZhbGlkX3N0ci5kYXRhKCkgKyBpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnZhbGlkX3N0ci5zaXplKCkgLSBpKSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmE5MmU4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYworKysgL2Rldi9udWxsCkBAIC0xLDIyODkgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIGZyb20gZ29vZ2xlMy9zdHJpbmdzL3N0cnV0aWwuY2MKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuaD4KLQotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8ZmxvYXQuaD4gICAgLy8gRkxUX0RJRyBhbmQgREJMX0RJRwotI2luY2x1ZGUgPGxpbWl0cz4KLSNpbmNsdWRlIDxsaW1pdHMuaD4KLSNpbmNsdWRlIDxzdGRpby5oPgotI2luY2x1ZGUgPGl0ZXJhdG9yPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+Ci0KLSNpZmRlZiBfV0lOMzIKLS8vIE1TVkMgaGFzIG9ubHkgX3NucHJpbnRmLCBub3Qgc25wcmludGYuCi0vLwotLy8gTWluR1cgaGFzIGJvdGggc25wcmludGYgYW5kIF9zbnByaW50ZiwgYnV0IHRoZXkgYXBwZWFyIHRvIGJlIGRpZmZlcmVudAotLy8gZnVuY3Rpb25zLiAgVGhlIGZvcm1lciBpcyBidWdneS4gIFdoZW4gaW52b2tlZCBsaWtlIHNvOgotLy8gICBjaGFyIGJ1ZmZlclszMl07Ci0vLyAgIHNucHJpbnRmKGJ1ZmZlciwgMzIsICIlLipnXG4iLCBGTFRfRElHLCAxLjIzZTEwZik7Ci0vLyBpdCBwcmludHMgIjEuMjMwMDBlKzEwIi4gIFRoaXMgaXMgcGxhaW5seSB3cm9uZzogICVnIHNob3VsZCBuZXZlciBwcmludAotLy8gdHJhaWxpbmcgemVyb3MgYWZ0ZXIgdGhlIGRlY2ltYWwgcG9pbnQuICBGb3Igc29tZSByZWFzb24gdGhpcyBidWcgb25seQotLy8gb2NjdXJzIHdpdGggc29tZSBpbnB1dCB2YWx1ZXMsIG5vdCBhbGwuICBJbiBhbnkgY2FzZSwgX3NucHJpbnRmIGRvZXMgdGhlCi0vLyByaWdodCB0aGluZywgc28gd2UgdXNlIGl0LgotI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKLSNlbmRpZgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLS8vIFRoZXNlIGFyZSBkZWZpbmVkIGFzIG1hY3JvcyBvbiBzb21lIHBsYXRmb3Jtcy4gICN1bmRlZiB0aGVtIHNvIHRoYXQgd2UgY2FuCi0vLyByZWRlZmluZSB0aGVtLgotI3VuZGVmIGlzeGRpZ2l0Ci0jdW5kZWYgaXNwcmludAotCi0vLyBUaGUgZGVmaW5pdGlvbnMgb2YgdGhlc2UgaW4gY3R5cGUuaCBjaGFuZ2UgYmFzZWQgb24gbG9jYWxlLiAgU2luY2Ugb3VyCi0vLyBzdHJpbmcgbWFuaXB1bGF0aW9uIGlzIGFsbCBpbiByZWxhdGlvbiB0byB0aGUgcHJvdG9jb2wgYnVmZmVyIGFuZCBDKysKLS8vIGxhbmd1YWdlcywgd2UgYWx3YXlzIHdhbnQgdG8gdXNlIHRoZSBDIGxvY2FsZS4gIFNvLCB3ZSByZS1kZWZpbmUgdGhlc2UKLS8vIGV4YWN0bHkgYXMgd2Ugd2FudCB0aGVtLgotaW5saW5lIGJvb2wgaXN4ZGlnaXQoY2hhciBjKSB7Ci0gIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8Ci0gICAgICAgICAoJ2EnIDw9IGMgJiYgYyA8PSAnZicpIHx8Ci0gICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnRicpOwotfQotCi1pbmxpbmUgYm9vbCBpc3ByaW50KGNoYXIgYykgewotICByZXR1cm4gYyA+PSAweDIwICYmIGMgPD0gMHg3RTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU3RyaXBTdHJpbmcKLS8vICAgIFJlcGxhY2VzIGFueSBvY2N1cnJlbmNlIG9mIHRoZSBjaGFyYWN0ZXIgJ3JlbW92ZScgKG9yIHRoZSBjaGFyYWN0ZXJzCi0vLyAgICBpbiAncmVtb3ZlJykgd2l0aCB0aGUgY2hhcmFjdGVyICdyZXBsYWNld2l0aCcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi12b2lkIFN0cmlwU3RyaW5nKHN0cmluZyogcywgY29uc3QgY2hhciogcmVtb3ZlLCBjaGFyIHJlcGxhY2V3aXRoKSB7Ci0gIGNvbnN0IGNoYXIgKiBzdHJfc3RhcnQgPSBzLT5jX3N0cigpOwotICBjb25zdCBjaGFyICogc3RyID0gc3RyX3N0YXJ0OwotICBmb3IgKHN0ciA9IHN0cnBicmsoc3RyLCByZW1vdmUpOwotICAgICAgIHN0ciAhPSBOVUxMOwotICAgICAgIHN0ciA9IHN0cnBicmsoc3RyICsgMSwgcmVtb3ZlKSkgewotICAgICgqcylbc3RyIC0gc3RyX3N0YXJ0XSA9IHJlcGxhY2V3aXRoOwotICB9Ci19Ci0KLXZvaWQgU3RyaXBXaGl0ZXNwYWNlKHN0cmluZyogc3RyKSB7Ci0gIGludCBzdHJfbGVuZ3RoID0gc3RyLT5sZW5ndGgoKTsKLQotICAvLyBTdHJpcCBvZmYgbGVhZGluZyB3aGl0ZXNwYWNlLgotICBpbnQgZmlyc3QgPSAwOwotICB3aGlsZSAoZmlyc3QgPCBzdHJfbGVuZ3RoICYmIGFzY2lpX2lzc3BhY2Uoc3RyLT5hdChmaXJzdCkpKSB7Ci0gICAgKytmaXJzdDsKLSAgfQotICAvLyBJZiBlbnRpcmUgc3RyaW5nIGlzIHdoaXRlIHNwYWNlLgotICBpZiAoZmlyc3QgPT0gc3RyX2xlbmd0aCkgewotICAgIHN0ci0+Y2xlYXIoKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgaWYgKGZpcnN0ID4gMCkgewotICAgIHN0ci0+ZXJhc2UoMCwgZmlyc3QpOwotICAgIHN0cl9sZW5ndGggLT0gZmlyc3Q7Ci0gIH0KLQotICAvLyBTdHJpcCBvZmYgdHJhaWxpbmcgd2hpdGVzcGFjZS4KLSAgaW50IGxhc3QgPSBzdHJfbGVuZ3RoIC0gMTsKLSAgd2hpbGUgKGxhc3QgPj0gMCAmJiBhc2NpaV9pc3NwYWNlKHN0ci0+YXQobGFzdCkpKSB7Ci0gICAgLS1sYXN0OwotICB9Ci0gIGlmIChsYXN0ICE9IChzdHJfbGVuZ3RoIC0gMSkgJiYgbGFzdCA+PSAwKSB7Ci0gICAgc3RyLT5lcmFzZShsYXN0ICsgMSwgc3RyaW5nOjpucG9zKTsKLSAgfQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTdHJpbmdSZXBsYWNlKCkKLS8vICAgIFJlcGxhY2UgdGhlICJvbGQiIHBhdHRlcm4gd2l0aCB0aGUgIm5ldyIgcGF0dGVybiBpbiBhIHN0cmluZywKLS8vICAgIGFuZCBhcHBlbmQgdGhlIHJlc3VsdCB0byAicmVzIi4gIElmIHJlcGxhY2VfYWxsIGlzIGZhbHNlLAotLy8gICAgaXQgb25seSByZXBsYWNlcyB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgIm9sZC4iCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgU3RyaW5nUmVwbGFjZShjb25zdCBzdHJpbmcmIHMsIGNvbnN0IHN0cmluZyYgb2xkc3ViLAotICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmV3c3ViLCBib29sIHJlcGxhY2VfYWxsLAotICAgICAgICAgICAgICAgICAgIHN0cmluZyogcmVzKSB7Ci0gIGlmIChvbGRzdWIuZW1wdHkoKSkgewotICAgIHJlcy0+YXBwZW5kKHMpOyAgLy8gaWYgZW1wdHksIGFwcGVuZCB0aGUgZ2l2ZW4gc3RyaW5nLgotICAgIHJldHVybjsKLSAgfQotCi0gIHN0cmluZzo6c2l6ZV90eXBlIHN0YXJ0X3BvcyA9IDA7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHBvczsKLSAgZG8gewotICAgIHBvcyA9IHMuZmluZChvbGRzdWIsIHN0YXJ0X3Bvcyk7Ci0gICAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICByZXMtPmFwcGVuZChzLCBzdGFydF9wb3MsIHBvcyAtIHN0YXJ0X3Bvcyk7Ci0gICAgcmVzLT5hcHBlbmQobmV3c3ViKTsKLSAgICBzdGFydF9wb3MgPSBwb3MgKyBvbGRzdWIuc2l6ZSgpOyAgLy8gc3RhcnQgc2VhcmNoaW5nIGFnYWluIGFmdGVyIHRoZSAib2xkIgotICB9IHdoaWxlIChyZXBsYWNlX2FsbCk7Ci0gIHJlcy0+YXBwZW5kKHMsIHN0YXJ0X3Bvcywgcy5sZW5ndGgoKSAtIHN0YXJ0X3Bvcyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFN0cmluZ1JlcGxhY2UoKQotLy8gICAgR2l2ZSBtZSBhIHN0cmluZyBhbmQgdHdvIHBhdHRlcm5zICJvbGQiIGFuZCAibmV3IiwgYW5kIEkgcmVwbGFjZQotLy8gICAgdGhlIGZpcnN0IGluc3RhbmNlIG9mICJvbGQiIGluIHRoZSBzdHJpbmcgd2l0aCAibmV3IiwgaWYgaXQKLS8vICAgIGV4aXN0cy4gIElmICJnbG9iYWwiIGlzIHRydWU7IGNhbGwgdGhpcyByZXBlYXRlZGx5IHVudGlsIGl0Ci0vLyAgICBmYWlscy4gIFJFVFVSTiBhIG5ldyBzdHJpbmcsIHJlZ2FyZGxlc3Mgb2Ygd2hldGhlciB0aGUgcmVwbGFjZW1lbnQKLS8vICAgIGhhcHBlbmVkIG9yIG5vdC4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RyaW5nIFN0cmluZ1JlcGxhY2UoY29uc3Qgc3RyaW5nJiBzLCBjb25zdCBzdHJpbmcmIG9sZHN1YiwKLSAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmV3c3ViLCBib29sIHJlcGxhY2VfYWxsKSB7Ci0gIHN0cmluZyByZXQ7Ci0gIFN0cmluZ1JlcGxhY2Uocywgb2xkc3ViLCBuZXdzdWIsIHJlcGxhY2VfYWxsLCAmcmV0KTsKLSAgcmV0dXJuIHJldDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU3BsaXRTdHJpbmdVc2luZygpCi0vLyAgICBTcGxpdCBhIHN0cmluZyB1c2luZyBhIGNoYXJhY3RlciBkZWxpbWl0ZXIuIEFwcGVuZCB0aGUgY29tcG9uZW50cwotLy8gICAgdG8gJ3Jlc3VsdCcuCi0vLwotLy8gTm90ZTogRm9yIG11bHRpLWNoYXJhY3RlciBkZWxpbWl0ZXJzLCB0aGlzIHJvdXRpbmUgd2lsbCBzcGxpdCBvbiAqQU5ZKiBvZgotLy8gdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgbm90IHRoZSBlbnRpcmUgc3RyaW5nIGFzIGEgc2luZ2xlIGRlbGltaXRlci4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXRlbXBsYXRlIDx0eXBlbmFtZSBJVFI+Ci1zdGF0aWMgaW5saW5lCi12b2lkIFNwbGl0U3RyaW5nVG9JdGVyYXRvclVzaW5nKGNvbnN0IHN0cmluZyYgZnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUUiYgcmVzdWx0KSB7Ci0gIC8vIE9wdGltaXplIHRoZSBjb21tb24gY2FzZSB3aGVyZSBkZWxpbSBpcyBhIHNpbmdsZSBjaGFyYWN0ZXIuCi0gIGlmIChkZWxpbVswXSAhPSAnXDAnICYmIGRlbGltWzFdID09ICdcMCcpIHsKLSAgICBjaGFyIGMgPSBkZWxpbVswXTsKLSAgICBjb25zdCBjaGFyKiBwID0gZnVsbC5kYXRhKCk7Ci0gICAgY29uc3QgY2hhciogZW5kID0gcCArIGZ1bGwuc2l6ZSgpOwotICAgIHdoaWxlIChwICE9IGVuZCkgewotICAgICAgaWYgKCpwID09IGMpIHsKLSAgICAgICAgKytwOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgY29uc3QgY2hhciogc3RhcnQgPSBwOwotICAgICAgICB3aGlsZSAoKytwICE9IGVuZCAmJiAqcCAhPSBjKTsKLSAgICAgICAgKnJlc3VsdCsrID0gc3RyaW5nKHN0YXJ0LCBwIC0gc3RhcnQpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm47Ci0gIH0KLQotICBzdHJpbmc6OnNpemVfdHlwZSBiZWdpbl9pbmRleCwgZW5kX2luZGV4OwotICBiZWdpbl9pbmRleCA9IGZ1bGwuZmluZF9maXJzdF9ub3Rfb2YoZGVsaW0pOwotICB3aGlsZSAoYmVnaW5faW5kZXggIT0gc3RyaW5nOjpucG9zKSB7Ci0gICAgZW5kX2luZGV4ID0gZnVsbC5maW5kX2ZpcnN0X29mKGRlbGltLCBiZWdpbl9pbmRleCk7Ci0gICAgaWYgKGVuZF9pbmRleCA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICpyZXN1bHQrKyA9IGZ1bGwuc3Vic3RyKGJlZ2luX2luZGV4KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgKnJlc3VsdCsrID0gZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgsIChlbmRfaW5kZXggLSBiZWdpbl9pbmRleCkpOwotICAgIGJlZ2luX2luZGV4ID0gZnVsbC5maW5kX2ZpcnN0X25vdF9vZihkZWxpbSwgZW5kX2luZGV4KTsKLSAgfQotfQotCi12b2lkIFNwbGl0U3RyaW5nVXNpbmcoY29uc3Qgc3RyaW5nJiBmdWxsLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltLAotICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiByZXN1bHQpIHsKLSAgYmFja19pbnNlcnRfaXRlcmF0b3I8IHZlY3RvcjxzdHJpbmc+ID4gaXQoKnJlc3VsdCk7Ci0gIFNwbGl0U3RyaW5nVG9JdGVyYXRvclVzaW5nKGZ1bGwsIGRlbGltLCBpdCk7Ci19Ci0KLS8vIFNwbGl0IGEgc3RyaW5nIHVzaW5nIGEgY2hhcmFjdGVyIGRlbGltaXRlci4gQXBwZW5kIHRoZSBjb21wb25lbnRzCi0vLyB0byAncmVzdWx0Jy4gIElmIHRoZXJlIGFyZSBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzLCB0aGlzIGZ1bmN0aW9uCi0vLyB3aWxsIHJldHVybiBjb3JyZXNwb25kaW5nIGVtcHR5IHN0cmluZ3MuIFRoZSBzdHJpbmcgaXMgc3BsaXQgaW50bwotLy8gYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBwaWVjZXMgZ3JlZWRpbHkuIFRoaXMgbWVhbnMgdGhhdCB0aGUKLS8vIGxhc3QgcGllY2UgbWF5IHBvc3NpYmx5IGJlIHNwbGl0IGZ1cnRoZXIuIFRvIHNwbGl0IGludG8gYXMgbWFueSBwaWVjZXMKLS8vIGFzIHBvc3NpYmxlLCBzcGVjaWZ5IDAgYXMgdGhlIG51bWJlciBvZiBwaWVjZXMuCi0vLwotLy8gSWYgImZ1bGwiIGlzIHRoZSBlbXB0eSBzdHJpbmcsIHlpZWxkcyBhbiBlbXB0eSBzdHJpbmcgYXMgdGhlIG9ubHkgdmFsdWUuCi0vLwotLy8gSWYgInBpZWNlcyIgaXMgbmVnYXRpdmUgZm9yIHNvbWUgcmVhc29uLCBpdCByZXR1cm5zIHRoZSB3aG9sZSBzdHJpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLXRlbXBsYXRlIDx0eXBlbmFtZSBTdHJpbmdUeXBlLCB0eXBlbmFtZSBJVFI+Ci1zdGF0aWMgaW5saW5lCi12b2lkIFNwbGl0U3RyaW5nVG9JdGVyYXRvckFsbG93RW1wdHkoY29uc3QgU3RyaW5nVHlwZSYgZnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgcGllY2VzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUUiYgcmVzdWx0KSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIGJlZ2luX2luZGV4LCBlbmRfaW5kZXg7Ci0gIGJlZ2luX2luZGV4ID0gMDsKLQotICBmb3IgKGludCBpID0gMDsgKGkgPCBwaWVjZXMtMSkgfHwgKHBpZWNlcyA9PSAwKTsgaSsrKSB7Ci0gICAgZW5kX2luZGV4ID0gZnVsbC5maW5kX2ZpcnN0X29mKGRlbGltLCBiZWdpbl9pbmRleCk7Ci0gICAgaWYgKGVuZF9pbmRleCA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICpyZXN1bHQrKyA9IGZ1bGwuc3Vic3RyKGJlZ2luX2luZGV4KTsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0gICAgKnJlc3VsdCsrID0gZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgsIChlbmRfaW5kZXggLSBiZWdpbl9pbmRleCkpOwotICAgIGJlZ2luX2luZGV4ID0gZW5kX2luZGV4ICsgMTsKLSAgfQotICAqcmVzdWx0KysgPSBmdWxsLnN1YnN0cihiZWdpbl9pbmRleCk7Ci19Ci0KLXZvaWQgU3BsaXRTdHJpbmdBbGxvd0VtcHR5KGNvbnN0IHN0cmluZyYgZnVsbCwgY29uc3QgY2hhciogZGVsaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogcmVzdWx0KSB7Ci0gIGJhY2tfaW5zZXJ0X2l0ZXJhdG9yPHZlY3RvcjxzdHJpbmc+ID4gaXQoKnJlc3VsdCk7Ci0gIFNwbGl0U3RyaW5nVG9JdGVyYXRvckFsbG93RW1wdHkoZnVsbCwgZGVsaW0sIDAsIGl0KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSm9pblN0cmluZ3MoKQotLy8gICAgVGhpcyBtZXJnZXMgYSB2ZWN0b3Igb2Ygc3RyaW5nIGNvbXBvbmVudHMgd2l0aCBkZWxpbSBpbnNlcnRlZAotLy8gICAgYXMgc2VwYXJhdGVycyBiZXR3ZWVuIGNvbXBvbmVudHMuCi0vLwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdGVtcGxhdGUgPGNsYXNzIElURVJBVE9SPgotc3RhdGljIHZvaWQgSm9pblN0cmluZ3NJdGVyYXRvcihjb25zdCBJVEVSQVRPUiYgc3RhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IElURVJBVE9SJiBlbmQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHJlc3VsdCkgewotICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOwotICByZXN1bHQtPmNsZWFyKCk7Ci0gIGludCBkZWxpbV9sZW5ndGggPSBzdHJsZW4oZGVsaW0pOwotCi0gIC8vIFByZWNvbXB1dGUgcmVzdWx0aW5nIGxlbmd0aCBzbyB3ZSBjYW4gcmVzZXJ2ZSgpIG1lbW9yeSBpbiBvbmUgc2hvdC4KLSAgaW50IGxlbmd0aCA9IDA7Ci0gIGZvciAoSVRFUkFUT1IgaXRlciA9IHN0YXJ0OyBpdGVyICE9IGVuZDsgKytpdGVyKSB7Ci0gICAgaWYgKGl0ZXIgIT0gc3RhcnQpIHsKLSAgICAgIGxlbmd0aCArPSBkZWxpbV9sZW5ndGg7Ci0gICAgfQotICAgIGxlbmd0aCArPSBpdGVyLT5zaXplKCk7Ci0gIH0KLSAgcmVzdWx0LT5yZXNlcnZlKGxlbmd0aCk7Ci0KLSAgLy8gTm93IGNvbWJpbmUgZXZlcnl0aGluZy4KLSAgZm9yIChJVEVSQVRPUiBpdGVyID0gc3RhcnQ7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKLSAgICBpZiAoaXRlciAhPSBzdGFydCkgewotICAgICAgcmVzdWx0LT5hcHBlbmQoZGVsaW0sIGRlbGltX2xlbmd0aCk7Ci0gICAgfQotICAgIHJlc3VsdC0+YXBwZW5kKGl0ZXItPmRhdGEoKSwgaXRlci0+c2l6ZSgpKTsKLSAgfQotfQotCi12b2lkIEpvaW5TdHJpbmdzKGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBjb21wb25lbnRzLAotICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwKLSAgICAgICAgICAgICAgICAgc3RyaW5nICogcmVzdWx0KSB7Ci0gIEpvaW5TdHJpbmdzSXRlcmF0b3IoY29tcG9uZW50cy5iZWdpbigpLCBjb21wb25lbnRzLmVuZCgpLCBkZWxpbSwgcmVzdWx0KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKCkKLS8vICAgIFRoaXMgZG9lcyBhbGwgdGhlIHVuZXNjYXBpbmcgdGhhdCBDIGRvZXM6IFxvb28sIFxyLCBcbiwgZXRjCi0vLyAgICBSZXR1cm5zIGxlbmd0aCBvZiByZXN1bHRpbmcgc3RyaW5nLgotLy8gICAgVGhlIGltcGxlbWVudGF0aW9uIG9mIFx4IHBhcnNlcyBhbnkgcG9zaXRpdmUgbnVtYmVyIG9mIGhleCBkaWdpdHMsCi0vLyAgICBidXQgaXQgaXMgYW4gZXJyb3IgaWYgdGhlIHZhbHVlIHJlcXVpcmVzIG1vcmUgdGhhbiA4IGJpdHMsIGFuZCB0aGUKLS8vICAgIHJlc3VsdCBpcyB0cnVuY2F0ZWQgdG8gOCBiaXRzLgotLy8KLS8vICAgIFRoZSBzZWNvbmQgY2FsbCBzdG9yZXMgaXRzIGVycm9ycyBpbiBhIHN1cHBsaWVkIHN0cmluZyB2ZWN0b3IuCi0vLyAgICBJZiB0aGUgc3RyaW5nIHZlY3RvciBwb2ludGVyIGlzIE5VTEwsIGl0IHJlcG9ydHMgdGhlIGVycm9ycyB3aXRoIExPRygpLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0jZGVmaW5lIElTX09DVEFMX0RJR0lUKGMpICgoKGMpID49ICcwJykgJiYgKChjKSA8PSAnNycpKQotCi0vLyBQcm90b2NvbCBidWZmZXJzIGRvZXNuJ3QgZXZlciBjYXJlIGFib3V0IGVycm9ycywgYnV0IEkgZG9uJ3Qgd2FudCB0byByZW1vdmUKLS8vIHRoZSBjb2RlLgotI2RlZmluZSBMT0dfU1RSSU5HKExFVkVMLCBWRUNUT1IpIEdPT0dMRV9MT0dfSUYoTEVWRUwsIGZhbHNlKQotCi1pbnQgVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKGNvbnN0IGNoYXIqIHNvdXJjZSwgY2hhciogZGVzdCkgewotICByZXR1cm4gVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKHNvdXJjZSwgZGVzdCwgTlVMTCk7Ci19Ci0KLWludCBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoY29uc3QgY2hhciogc291cmNlLCBjaGFyKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiAqZXJyb3JzKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soZXJyb3JzID09IE5VTEwpIDw8ICJFcnJvciByZXBvcnRpbmcgbm90IGltcGxlbWVudGVkLiI7Ci0KLSAgY2hhciogZCA9IGRlc3Q7Ci0gIGNvbnN0IGNoYXIqIHAgPSBzb3VyY2U7Ci0KLSAgLy8gU21hbGwgb3B0aW1pemF0aW9uIGZvciBjYXNlIHdoZXJlIHNvdXJjZSA9IGRlc3QgYW5kIHRoZXJlJ3Mgbm8gZXNjYXBpbmcKLSAgd2hpbGUgKCBwID09IGQgJiYgKnAgIT0gJ1wwJyAmJiAqcCAhPSAnXFwnICkKLSAgICBwKyssIGQrKzsKLQotICB3aGlsZSAoKnAgIT0gJ1wwJykgewotICAgIGlmICgqcCAhPSAnXFwnKSB7Ci0gICAgICAqZCsrID0gKnArKzsKLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoICggKisrcCApIHsgICAgICAgICAgICAgICAgICAgIC8vIHNraXAgcGFzdCB0aGUgJ1xcJwotICAgICAgICBjYXNlICdcMCc6Ci0gICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiU3RyaW5nIGNhbm5vdCBlbmQgd2l0aCBcXCI7Ci0gICAgICAgICAgKmQgPSAnXDAnOwotICAgICAgICAgIHJldHVybiBkIC0gZGVzdDsgICAvLyB3ZSdyZSBkb25lIHdpdGggcAotICAgICAgICBjYXNlICdhJzogICpkKysgPSAnXGEnOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ2InOiAgKmQrKyA9ICdcYic7ICBicmVhazsKLSAgICAgICAgY2FzZSAnZic6ICAqZCsrID0gJ1xmJzsgIGJyZWFrOwotICAgICAgICBjYXNlICduJzogICpkKysgPSAnXG4nOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ3InOiAgKmQrKyA9ICdccic7ICBicmVhazsKLSAgICAgICAgY2FzZSAndCc6ICAqZCsrID0gJ1x0JzsgIGJyZWFrOwotICAgICAgICBjYXNlICd2JzogICpkKysgPSAnXHYnOyAgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xcJzogKmQrKyA9ICdcXCc7ICBicmVhazsKLSAgICAgICAgY2FzZSAnPyc6ICAqZCsrID0gJ1w/JzsgIGJyZWFrOyAgICAvLyBcPyAgV2hvIGtuZXc/Ci0gICAgICAgIGNhc2UgJ1wnJzogKmQrKyA9ICdcJyc7ICBicmVhazsKLSAgICAgICAgY2FzZSAnIic6ICAqZCsrID0gJ1wiJzsgIGJyZWFrOwotICAgICAgICBjYXNlICcwJzogY2FzZSAnMSc6IGNhc2UgJzInOiBjYXNlICczJzogIC8vIG9jdGFsIGRpZ2l0OiAxIHRvIDMgZGlnaXRzCi0gICAgICAgIGNhc2UgJzQnOiBjYXNlICc1JzogY2FzZSAnNic6IGNhc2UgJzcnOiB7Ci0gICAgICAgICAgY2hhciBjaCA9ICpwIC0gJzAnOwotICAgICAgICAgIGlmICggSVNfT0NUQUxfRElHSVQocFsxXSkgKQotICAgICAgICAgICAgY2ggPSBjaCAqIDggKyAqKytwIC0gJzAnOwotICAgICAgICAgIGlmICggSVNfT0NUQUxfRElHSVQocFsxXSkgKSAgICAgIC8vIHNhZmUgKGFuZCBlYXN5KSB0byBkbyB0aGlzIHR3aWNlCi0gICAgICAgICAgICBjaCA9IGNoICogOCArICorK3AgLSAnMCc7ICAgICAgLy8gbm93IHBvaW50cyBhdCBsYXN0IGRpZ2l0Ci0gICAgICAgICAgKmQrKyA9IGNoOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICAgIGNhc2UgJ3gnOiBjYXNlICdYJzogewotICAgICAgICAgIGlmICghaXN4ZGlnaXQocFsxXSkpIHsKLSAgICAgICAgICAgIGlmIChwWzFdID09ICdcMCcpIHsKLSAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiU3RyaW5nIGNhbm5vdCBlbmQgd2l0aCBcXHgiOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PAotICAgICAgICAgICAgICAgICJcXHggY2Fubm90IGJlIGZvbGxvd2VkIGJ5IG5vbi1oZXggZGlnaXQ6IFxcIiA8PCAqcCA8PCBwWzFdOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIHVuc2lnbmVkIGludCBjaCA9IDA7Ci0gICAgICAgICAgY29uc3QgY2hhciAqaGV4X3N0YXJ0ID0gcDsKLSAgICAgICAgICB3aGlsZSAoaXN4ZGlnaXQocFsxXSkpICAvLyBhcmJpdHJhcmlseSBtYW55IGhleCBkaWdpdHMKLSAgICAgICAgICAgIGNoID0gKGNoIDw8IDQpICsgaGV4X2RpZ2l0X3RvX2ludCgqKytwKTsKLSAgICAgICAgICBpZiAoY2ggPiAweEZGKQotICAgICAgICAgICAgTE9HX1NUUklORyhFUlJPUiwgZXJyb3JzKSA8PCAiVmFsdWUgb2YgIiA8PAotICAgICAgICAgICAgICAiXFwiIDw8IHN0cmluZyhoZXhfc3RhcnQsIHArMS1oZXhfc3RhcnQpIDw8ICIgZXhjZWVkcyA4IGJpdHMiOwotICAgICAgICAgICpkKysgPSBjaDsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotI2lmIDAgIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgXHUgYW5kIFxVPyAgUmVxdWlyZXMgcnVuZXRvY2hhcigpLgotICAgICAgICBjYXNlICd1JzogewotICAgICAgICAgIC8vIFx1aGhoaCA9PiBjb252ZXJ0IDQgaGV4IGRpZ2l0cyB0byBVVEYtOAotICAgICAgICAgIGNoYXIzMiBydW5lID0gMDsKLSAgICAgICAgICBjb25zdCBjaGFyICpoZXhfc3RhcnQgPSBwOwotICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgKytpKSB7Ci0gICAgICAgICAgICBpZiAoaXN4ZGlnaXQocFsxXSkpIHsgIC8vIExvb2sgb25lIGNoYXIgYWhlYWQuCi0gICAgICAgICAgICAgIHJ1bmUgPSAocnVuZSA8PCA0KSArIGhleF9kaWdpdF90b19pbnQoKisrcCk7ICAvLyBBZHZhbmNlIHAuCi0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpCi0gICAgICAgICAgICAgICAgPDwgIlxcdSBtdXN0IGJlIGZvbGxvd2VkIGJ5IDQgaGV4IGRpZ2l0czogXFwiCi0gICAgICAgICAgICAgICAgPDwgIHN0cmluZyhoZXhfc3RhcnQsIHArMS1oZXhfc3RhcnQpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZCArPSBydW5ldG9jaGFyKGQsICZydW5lKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgICBjYXNlICdVJzogewotICAgICAgICAgIC8vIFxVaGhoaGhoaGggPT4gY29udmVydCA4IGhleCBkaWdpdHMgdG8gVVRGLTgKLSAgICAgICAgICBjaGFyMzIgcnVuZSA9IDA7Ci0gICAgICAgICAgY29uc3QgY2hhciAqaGV4X3N0YXJ0ID0gcDsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7ICsraSkgewotICAgICAgICAgICAgaWYgKGlzeGRpZ2l0KHBbMV0pKSB7ICAvLyBMb29rIG9uZSBjaGFyIGFoZWFkLgotICAgICAgICAgICAgICAvLyBEb24ndCBjaGFuZ2UgcnVuZSB1bnRpbCB3ZSdyZSBzdXJlIHRoaXMKLSAgICAgICAgICAgICAgLy8gaXMgd2l0aGluIHRoZSBVbmljb2RlIGxpbWl0LCBidXQgZG8gYWR2YW5jZSBwLgotICAgICAgICAgICAgICBjaGFyMzIgbmV3cnVuZSA9IChydW5lIDw8IDQpICsgaGV4X2RpZ2l0X3RvX2ludCgqKytwKTsKLSAgICAgICAgICAgICAgaWYgKG5ld3J1bmUgPiAweDEwRkZGRikgewotICAgICAgICAgICAgICAgIExPR19TVFJJTkcoRVJST1IsIGVycm9ycykKLSAgICAgICAgICAgICAgICAgIDw8ICJWYWx1ZSBvZiBcXCIKLSAgICAgICAgICAgICAgICAgIDw8IHN0cmluZyhoZXhfc3RhcnQsIHAgKyAxIC0gaGV4X3N0YXJ0KQotICAgICAgICAgICAgICAgICAgPDwgIiBleGNlZWRzIFVuaWNvZGUgbGltaXQgKDB4MTBGRkZGKSI7Ci0gICAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgcnVuZSA9IG5ld3J1bmU7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIExPR19TVFJJTkcoRVJST1IsIGVycm9ycykKLSAgICAgICAgICAgICAgICA8PCAiXFxVIG11c3QgYmUgZm9sbG93ZWQgYnkgOCBoZXggZGlnaXRzOiBcXCIKLSAgICAgICAgICAgICAgICA8PCAgc3RyaW5nKGhleF9zdGFydCwgcCsxLWhleF9zdGFydCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgICBkICs9IHJ1bmV0b2NoYXIoZCwgJnJ1bmUpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0jZW5kaWYKLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBMT0dfU1RSSU5HKEVSUk9SLCBlcnJvcnMpIDw8ICJVbmtub3duIGVzY2FwZSBzZXF1ZW5jZTogXFwiIDw8ICpwOwotICAgICAgfQotICAgICAgcCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlYWQgcGFzdCBsZXR0ZXIgd2UgZXNjYXBlZAotICAgIH0KLSAgfQotICAqZCA9ICdcMCc7Ci0gIHJldHVybiBkIC0gZGVzdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVW5lc2NhcGVDRXNjYXBlU3RyaW5nKCkKLS8vICAgIFRoaXMgZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMsIGJ1dCBjcmVhdGVzCi0vLyAgICBhIG5ldyBzdHJpbmcuIFRoZSBjYWxsZXIgZG9lcyBub3QgbmVlZCB0byB3b3JyeSBhYm91dCBhbGxvY2F0aW5nCi0vLyAgICBhIGRlc3QgYnVmZmVyLiBUaGlzIHNob3VsZCBiZSB1c2VkIGZvciBub24gcGVyZm9ybWFuY2UgY3JpdGljYWwKLS8vICAgIHRhc2tzIHN1Y2ggYXMgcHJpbnRpbmcgZGVidWcgbWVzc2FnZXMuIEl0IGlzIHNhZmUgZm9yIHNyYyBhbmQgZGVzdAotLy8gICAgdG8gYmUgdGhlIHNhbWUuCi0vLwotLy8gICAgVGhlIHNlY29uZCBjYWxsIHN0b3JlcyBpdHMgZXJyb3JzIGluIGEgc3VwcGxpZWQgc3RyaW5nIHZlY3Rvci4KLS8vICAgIElmIHRoZSBzdHJpbmcgdmVjdG9yIHBvaW50ZXIgaXMgTlVMTCwgaXQgcmVwb3J0cyB0aGUgZXJyb3JzIHdpdGggTE9HKCkuCi0vLwotLy8gICAgSW4gdGhlIGZpcnN0IGFuZCBzZWNvbmQgY2FsbHMsIHRoZSBsZW5ndGggb2YgZGVzdCBpcyByZXR1cm5lZC4gSW4gdGhlCi0vLyAgICB0aGUgdGhpcmQgY2FsbCwgdGhlIG5ldyBzdHJpbmcgaXMgcmV0dXJuZWQuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjLCBzdHJpbmcqIGRlc3QpIHsKLSAgcmV0dXJuIFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhzcmMsIGRlc3QsIE5VTEwpOwotfQotCi1pbnQgVW5lc2NhcGVDRXNjYXBlU3RyaW5nKGNvbnN0IHN0cmluZyYgc3JjLCBzdHJpbmcqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+ICplcnJvcnMpIHsKLSAgc2NvcGVkX2FycmF5PGNoYXI+IHVuZXNjYXBlZChuZXcgY2hhcltzcmMuc2l6ZSgpICsgMV0pOwotICBpbnQgbGVuID0gVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKHNyYy5jX3N0cigpLCB1bmVzY2FwZWQuZ2V0KCksIGVycm9ycyk7Ci0gIEdPT0dMRV9DSEVDSyhkZXN0KTsKLSAgZGVzdC0+YXNzaWduKHVuZXNjYXBlZC5nZXQoKSwgbGVuKTsKLSAgcmV0dXJuIGxlbjsKLX0KLQotc3RyaW5nIFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdHJpbmcmIHNyYykgewotICBzY29wZWRfYXJyYXk8Y2hhcj4gdW5lc2NhcGVkKG5ldyBjaGFyW3NyYy5zaXplKCkgKyAxXSk7Ci0gIGludCBsZW4gPSBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoc3JjLmNfc3RyKCksIHVuZXNjYXBlZC5nZXQoKSwgTlVMTCk7Ci0gIHJldHVybiBzdHJpbmcodW5lc2NhcGVkLmdldCgpLCBsZW4pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBDRXNjYXBlU3RyaW5nKCkKLS8vIENIZXhFc2NhcGVTdHJpbmcoKQotLy8gICAgQ29waWVzICdzcmMnIHRvICdkZXN0JywgZXNjYXBpbmcgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMgdXNpbmcKLS8vICAgIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcy4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgcHJlcGFyaW5nIHF1ZXJ5Ci0vLyAgICBmbGFncy4gJ3NyYycgYW5kICdkZXN0JyBzaG91bGQgbm90IG92ZXJsYXAuIFRoZSAnSGV4JyB2ZXJzaW9uIHVzZXMKLS8vICAgIGhleGFkZWNpbWFsIHJhdGhlciB0aGFuIG9jdGFsIHNlcXVlbmNlcy4KLS8vICAgIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyB3cml0dGVuIHRvICdkZXN0JyAobm90IGluY2x1ZGluZyB0aGUgXDApCi0vLyAgICBvciAtMSBpZiB0aGVyZSB3YXMgaW5zdWZmaWNpZW50IHNwYWNlLgotLy8KLS8vICAgIEN1cnJlbnRseSBvbmx5IFxuLCBcciwgXHQsICIsICcsIFwgYW5kICFpc3ByaW50KCkgY2hhcnMgYXJlIGVzY2FwZWQuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbnQgQ0VzY2FwZUludGVybmFsKGNvbnN0IGNoYXIqIHNyYywgaW50IHNyY19sZW4sIGNoYXIqIGRlc3QsCi0gICAgICAgICAgICAgICAgICAgIGludCBkZXN0X2xlbiwgYm9vbCB1c2VfaGV4LCBib29sIHV0Zjhfc2FmZSkgewotICBjb25zdCBjaGFyKiBzcmNfZW5kID0gc3JjICsgc3JjX2xlbjsKLSAgaW50IHVzZWQgPSAwOwotICBib29sIGxhc3RfaGV4X2VzY2FwZSA9IGZhbHNlOyAvLyB0cnVlIGlmIGxhc3Qgb3V0cHV0IGNoYXIgd2FzIFx4Tk4KLQotICBmb3IgKDsgc3JjIDwgc3JjX2VuZDsgc3JjKyspIHsKLSAgICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgMikgICAvLyBOZWVkIHNwYWNlIGZvciB0d28gbGV0dGVyIGVzY2FwZQotICAgICAgcmV0dXJuIC0xOwotCi0gICAgYm9vbCBpc19oZXhfZXNjYXBlID0gZmFsc2U7Ci0gICAgc3dpdGNoICgqc3JjKSB7Ci0gICAgICBjYXNlICdcbic6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICduJzsgIGJyZWFrOwotICAgICAgY2FzZSAnXHInOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAncic7ICBicmVhazsKLSAgICAgIGNhc2UgJ1x0JzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ3QnOyAgYnJlYWs7Ci0gICAgICBjYXNlICdcIic6IGRlc3RbdXNlZCsrXSA9ICdcXCc7IGRlc3RbdXNlZCsrXSA9ICdcIic7IGJyZWFrOwotICAgICAgY2FzZSAnXCcnOiBkZXN0W3VzZWQrK10gPSAnXFwnOyBkZXN0W3VzZWQrK10gPSAnXCcnOyBicmVhazsKLSAgICAgIGNhc2UgJ1xcJzogZGVzdFt1c2VkKytdID0gJ1xcJzsgZGVzdFt1c2VkKytdID0gJ1xcJzsgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICAvLyBOb3RlIHRoYXQgaWYgd2UgZW1pdCBceE5OIGFuZCB0aGUgc3JjIGNoYXJhY3RlciBhZnRlciB0aGF0IGlzIGEgaGV4Ci0gICAgICAgIC8vIGRpZ2l0IHRoZW4gdGhhdCBkaWdpdCBtdXN0IGJlIGVzY2FwZWQgdG9vIHRvIHByZXZlbnQgaXQgYmVpbmcKLSAgICAgICAgLy8gaW50ZXJwcmV0ZWQgYXMgcGFydCBvZiB0aGUgY2hhcmFjdGVyIGNvZGUgYnkgQy4KLSAgICAgICAgaWYgKCghdXRmOF9zYWZlIHx8IHN0YXRpY19jYXN0PHVpbnQ4Pigqc3JjKSA8IDB4ODApICYmCi0gICAgICAgICAgICAoIWlzcHJpbnQoKnNyYykgfHwKLSAgICAgICAgICAgICAobGFzdF9oZXhfZXNjYXBlICYmIGlzeGRpZ2l0KCpzcmMpKSkpIHsKLSAgICAgICAgICBpZiAoZGVzdF9sZW4gLSB1c2VkIDwgNCkgLy8gbmVlZCBzcGFjZSBmb3IgNCBsZXR0ZXIgZXNjYXBlCi0gICAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgICAgc3ByaW50ZihkZXN0ICsgdXNlZCwgKHVzZV9oZXggPyAiXFx4JTAyeCIgOiAiXFwlMDNvIiksCi0gICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx1aW50OD4oKnNyYykpOwotICAgICAgICAgIGlzX2hleF9lc2NhcGUgPSB1c2VfaGV4OwotICAgICAgICAgIHVzZWQgKz0gNDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBkZXN0W3VzZWQrK10gPSAqc3JjOyBicmVhazsKLSAgICAgICAgfQotICAgIH0KLSAgICBsYXN0X2hleF9lc2NhcGUgPSBpc19oZXhfZXNjYXBlOwotICB9Ci0KLSAgaWYgKGRlc3RfbGVuIC0gdXNlZCA8IDEpICAgLy8gbWFrZSBzdXJlIHRoYXQgdGhlcmUgaXMgcm9vbSBmb3IgXDAKLSAgICByZXR1cm4gLTE7Ci0KLSAgZGVzdFt1c2VkXSA9ICdcMCc7ICAgLy8gZG9lc24ndCBjb3VudCB0b3dhcmRzIHJldHVybiB2YWx1ZSB0aG91Z2gKLSAgcmV0dXJuIHVzZWQ7Ci19Ci0KLS8vIENhbGN1bGF0ZXMgdGhlIGxlbmd0aCBvZiB0aGUgQy1zdHlsZSBlc2NhcGVkIHZlcnNpb24gb2YgJ3NyYycuCi0vLyBBc3N1bWVzIHRoYXQgbm9uLXByaW50YWJsZSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkIHVzaW5nIG9jdGFsIHNlcXVlbmNlcywgYW5kCi0vLyB0aGF0IFVURi04IGJ5dGVzIGFyZSBub3QgaGFuZGxlZCBzcGVjaWFsbHkuCi1zdGF0aWMgaW5saW5lIHNpemVfdCBDRXNjYXBlZExlbmd0aChTdHJpbmdQaWVjZSBzcmMpIHsKLSAgc3RhdGljIGNoYXIgY19lc2NhcGVkX2xlblsyNTZdID0gewotICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDIsIDIsIDQsIDQsIDIsIDQsIDQsICAvLyBcdCwgXG4sIFxyCi0gICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKLSAgICAxLCAxLCAyLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgLy8gIiwgJwotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAvLyAnMCcuLic5JwotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAvLyAnQScuLidPJwotICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDIsIDEsIDEsIDEsICAvLyAnUCcuLidaJywgJ1wnCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIC8vICdhJy4uJ28nCi0gICAgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgNCwgIC8vICdwJy4uJ3onLCBERUwKLSAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAotICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKLSAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAotICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKLSAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAotICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCi0gIH07Ci0KLSAgc2l6ZV90IGVzY2FwZWRfbGVuID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzcmMuc2l6ZSgpOyArK2kpIHsKLSAgICB1bnNpZ25lZCBjaGFyIGMgPSBzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihzcmNbaV0pOwotICAgIGVzY2FwZWRfbGVuICs9IGNfZXNjYXBlZF9sZW5bY107Ci0gIH0KLSAgcmV0dXJuIGVzY2FwZWRfbGVuOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFc2NhcGVzICdzcmMnIHVzaW5nIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcywgYW5kIGFwcGVuZHMgdGhlIGVzY2FwZWQgc3RyaW5nCi0vLyB0byAnZGVzdCcuIFRoaXMgdmVyc2lvbiBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIENFc2NhcGVJbnRlcm5hbCBhcyBpdCBjb21wdXRlcwotLy8gdGhlIHJlcXVpcmVkIHNwYWNlIHVzaW5nIGEgbG9va3VwIHRhYmxlLCBhbmQgYWxzbyBkb2VzIG5vdCBkbyBhbnkgc3BlY2lhbAotLy8gaGFuZGxpbmcgZm9yIEhleCBvciBVVEYtOCBjaGFyYWN0ZXJzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBDRXNjYXBlQW5kQXBwZW5kKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KSB7Ci0gIHNpemVfdCBlc2NhcGVkX2xlbiA9IENFc2NhcGVkTGVuZ3RoKHNyYyk7Ci0gIGlmIChlc2NhcGVkX2xlbiA9PSBzcmMuc2l6ZSgpKSB7Ci0gICAgZGVzdC0+YXBwZW5kKHNyYy5kYXRhKCksIHNyYy5zaXplKCkpOwotICAgIHJldHVybjsKLSAgfQotCi0gIHNpemVfdCBjdXJfZGVzdF9sZW4gPSBkZXN0LT5zaXplKCk7Ci0gIGRlc3QtPnJlc2l6ZShjdXJfZGVzdF9sZW4gKyBlc2NhcGVkX2xlbik7Ci0gIGNoYXIqIGFwcGVuZF9wdHIgPSAmKCpkZXN0KVtjdXJfZGVzdF9sZW5dOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLnNpemUoKTsgKytpKSB7Ci0gICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3JjW2ldKTsKLSAgICBzd2l0Y2ggKGMpIHsKLSAgICAgIGNhc2UgJ1xuJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnbic7IGJyZWFrOwotICAgICAgY2FzZSAnXHInOiAqYXBwZW5kX3B0cisrID0gJ1xcJzsgKmFwcGVuZF9wdHIrKyA9ICdyJzsgYnJlYWs7Ci0gICAgICBjYXNlICdcdCc6ICphcHBlbmRfcHRyKysgPSAnXFwnOyAqYXBwZW5kX3B0cisrID0gJ3QnOyBicmVhazsKLSAgICAgIGNhc2UgJ1wiJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXCInOyBicmVhazsKLSAgICAgIGNhc2UgJ1wnJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXCcnOyBicmVhazsKLSAgICAgIGNhc2UgJ1xcJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXFwnOyBicmVhazsKLSAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIGlmICghaXNwcmludChjKSkgewotICAgICAgICAgICphcHBlbmRfcHRyKysgPSAnXFwnOwotICAgICAgICAgICphcHBlbmRfcHRyKysgPSAnMCcgKyBjIC8gNjQ7Ci0gICAgICAgICAgKmFwcGVuZF9wdHIrKyA9ICcwJyArIChjICUgNjQpIC8gODsKLSAgICAgICAgICAqYXBwZW5kX3B0cisrID0gJzAnICsgYyAlIDg7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgKmFwcGVuZF9wdHIrKyA9IGM7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLXN0cmluZyBDRXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKSB7Ci0gIHN0cmluZyBkZXN0OwotICBDRXNjYXBlQW5kQXBwZW5kKHNyYywgJmRlc3QpOwotICByZXR1cm4gZGVzdDsKLX0KLQotbmFtZXNwYWNlIHN0cmluZ3MgewotCi1zdHJpbmcgVXRmOFNhZmVDRXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKSB7Ci0gIGNvbnN0IGludCBkZXN0X2xlbmd0aCA9IHNyYy5zaXplKCkgKiA0ICsgMTsgLy8gTWF4aW11bSBwb3NzaWJsZSBleHBhbnNpb24KLSAgc2NvcGVkX2FycmF5PGNoYXI+IGRlc3QobmV3IGNoYXJbZGVzdF9sZW5ndGhdKTsKLSAgY29uc3QgaW50IGxlbiA9IENFc2NhcGVJbnRlcm5hbChzcmMuZGF0YSgpLCBzcmMuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QuZ2V0KCksIGRlc3RfbGVuZ3RoLCBmYWxzZSwgdHJ1ZSk7Ci0gIEdPT0dMRV9EQ0hFQ0tfR0UobGVuLCAwKTsKLSAgcmV0dXJuIHN0cmluZyhkZXN0LmdldCgpLCBsZW4pOwotfQotCi1zdHJpbmcgQ0hleEVzY2FwZShjb25zdCBzdHJpbmcmIHNyYykgewotICBjb25zdCBpbnQgZGVzdF9sZW5ndGggPSBzcmMuc2l6ZSgpICogNCArIDE7IC8vIE1heGltdW0gcG9zc2libGUgZXhwYW5zaW9uCi0gIHNjb3BlZF9hcnJheTxjaGFyPiBkZXN0KG5ldyBjaGFyW2Rlc3RfbGVuZ3RoXSk7Ci0gIGNvbnN0IGludCBsZW4gPSBDRXNjYXBlSW50ZXJuYWwoc3JjLmRhdGEoKSwgc3JjLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LmdldCgpLCBkZXN0X2xlbmd0aCwgdHJ1ZSwgZmFsc2UpOwotICBHT09HTEVfRENIRUNLX0dFKGxlbiwgMCk7Ci0gIHJldHVybiBzdHJpbmcoZGVzdC5nZXQoKSwgbGVuKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gc3RydG8zMl9hZGFwdG9yKCkKLS8vIHN0cnRvdTMyX2FkYXB0b3IoKQotLy8gICAgSW1wbGVtZW50YXRpb24gb2Ygc3RydG9bdV1sIHJlcGxhY2VtZW50cyB0aGF0IGhhdmUgaWRlbnRpY2FsCi0vLyAgICBvdmVyZmxvdyBhbmQgdW5kZXJmbG93IGNoYXJhY3RlcmlzdGljcyBmb3IgYm90aCBJTFAtMzIgYW5kIExQLTY0Ci0vLyAgICBwbGF0Zm9ybXMsIGluY2x1ZGluZyBlcnJubyBwcmVzZXJ2YXRpb24gaW4gZXJyb3ItZnJlZSBjYWxscy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW50MzIgc3RydG8zMl9hZGFwdG9yKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7Ci0gIGNvbnN0IGludCBzYXZlZF9lcnJubyA9IGVycm5vOwotICBlcnJubyA9IDA7Ci0gIGNvbnN0IGxvbmcgcmVzdWx0ID0gc3RydG9sKG5wdHIsIGVuZHB0ciwgYmFzZSk7Ci0gIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgcmVzdWx0ID09IExPTkdfTUlOKSB7Ci0gICAgcmV0dXJuIGtpbnQzMm1pbjsKLSAgfSBlbHNlIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgcmVzdWx0ID09IExPTkdfTUFYKSB7Ci0gICAgcmV0dXJuIGtpbnQzMm1heDsKLSAgfSBlbHNlIGlmIChlcnJubyA9PSAwICYmIHJlc3VsdCA8IGtpbnQzMm1pbikgewotICAgIGVycm5vID0gRVJBTkdFOwotICAgIHJldHVybiBraW50MzJtaW47Ci0gIH0gZWxzZSBpZiAoZXJybm8gPT0gMCAmJiByZXN1bHQgPiBraW50MzJtYXgpIHsKLSAgICBlcnJubyA9IEVSQU5HRTsKLSAgICByZXR1cm4ga2ludDMybWF4OwotICB9Ci0gIGlmIChlcnJubyA9PSAwKQotICAgIGVycm5vID0gc2F2ZWRfZXJybm87Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQzMj4ocmVzdWx0KTsKLX0KLQotdWludDMyIHN0cnRvdTMyX2FkYXB0b3IoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKLSAgY29uc3QgaW50IHNhdmVkX2Vycm5vID0gZXJybm87Ci0gIGVycm5vID0gMDsKLSAgY29uc3QgdW5zaWduZWQgbG9uZyByZXN1bHQgPSBzdHJ0b3VsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Ci0gIGlmIChlcnJubyA9PSBFUkFOR0UgJiYgcmVzdWx0ID09IFVMT05HX01BWCkgewotICAgIHJldHVybiBrdWludDMybWF4OwotICB9IGVsc2UgaWYgKGVycm5vID09IDAgJiYgcmVzdWx0ID4ga3VpbnQzMm1heCkgewotICAgIGVycm5vID0gRVJBTkdFOwotICAgIHJldHVybiBrdWludDMybWF4OwotICB9Ci0gIGlmIChlcnJubyA9PSAwKQotICAgIGVycm5vID0gc2F2ZWRfZXJybm87Ci0gIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzI+KHJlc3VsdCk7Ci19Ci0KLWlubGluZSBib29sIHNhZmVfcGFyc2Vfc2lnbihzdHJpbmcqIHRleHQgIC8qaW5vdXQqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sKiBuZWdhdGl2ZV9wdHIgIC8qb3V0cHV0Ki8pIHsKLSAgY29uc3QgY2hhciogc3RhcnQgPSB0ZXh0LT5kYXRhKCk7Ci0gIGNvbnN0IGNoYXIqIGVuZCA9IHN0YXJ0ICsgdGV4dC0+c2l6ZSgpOwotCi0gIC8vIENvbnN1bWUgd2hpdGVzcGFjZS4KLSAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmIChzdGFydFswXSA9PSAnICcpKSB7Ci0gICAgKytzdGFydDsKLSAgfQotICB3aGlsZSAoc3RhcnQgPCBlbmQgJiYgKGVuZFstMV0gPT0gJyAnKSkgewotICAgIC0tZW5kOwotICB9Ci0gIGlmIChzdGFydCA+PSBlbmQpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBDb25zdW1lIHNpZ24uCi0gICpuZWdhdGl2ZV9wdHIgPSAoc3RhcnRbMF0gPT0gJy0nKTsKLSAgaWYgKCpuZWdhdGl2ZV9wdHIgfHwgc3RhcnRbMF0gPT0gJysnKSB7Ci0gICAgKytzdGFydDsKLSAgICBpZiAoc3RhcnQgPj0gZW5kKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0gICp0ZXh0ID0gdGV4dC0+c3Vic3RyKHN0YXJ0IC0gdGV4dC0+ZGF0YSgpLCBlbmQgLSBzdGFydCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbnRUeXBlPgotYm9vbCBzYWZlX3BhcnNlX3Bvc2l0aXZlX2ludCgKLSAgICBzdHJpbmcgdGV4dCwgSW50VHlwZSogdmFsdWVfcCkgewotICBpbnQgYmFzZSA9IDEwOwotICBJbnRUeXBlIHZhbHVlID0gMDsKLSAgY29uc3QgSW50VHlwZSB2bWF4ID0gc3RkOjpudW1lcmljX2xpbWl0czxJbnRUeXBlPjo6bWF4KCk7Ci0gIGFzc2VydCh2bWF4ID4gMCk7Ci0gIGFzc2VydCh2bWF4ID49IGJhc2UpOwotICBjb25zdCBJbnRUeXBlIHZtYXhfb3Zlcl9iYXNlID0gdm1heCAvIGJhc2U7Ci0gIGNvbnN0IGNoYXIqIHN0YXJ0ID0gdGV4dC5kYXRhKCk7Ci0gIGNvbnN0IGNoYXIqIGVuZCA9IHN0YXJ0ICsgdGV4dC5zaXplKCk7Ci0gIC8vIGxvb3Agb3ZlciBkaWdpdHMKLSAgZm9yICg7IHN0YXJ0IDwgZW5kOyArK3N0YXJ0KSB7Ci0gICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3RhcnRbMF0pOwotICAgIGludCBkaWdpdCA9IGMgLSAnMCc7Ci0gICAgaWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPCAwKSB7Ci0gICAgICAqdmFsdWVfcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAodmFsdWUgPiB2bWF4X292ZXJfYmFzZSkgewotICAgICAgKnZhbHVlX3AgPSB2bWF4OwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB2YWx1ZSAqPSBiYXNlOwotICAgIGlmICh2YWx1ZSA+IHZtYXggLSBkaWdpdCkgewotICAgICAgKnZhbHVlX3AgPSB2bWF4OwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB2YWx1ZSArPSBkaWdpdDsKLSAgfQotICAqdmFsdWVfcCA9IHZhbHVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSW50VHlwZT4KLWJvb2wgc2FmZV9wYXJzZV9uZWdhdGl2ZV9pbnQoCi0gICAgY29uc3Qgc3RyaW5nJiB0ZXh0LCBJbnRUeXBlKiB2YWx1ZV9wKSB7Ci0gIGludCBiYXNlID0gMTA7Ci0gIEludFR5cGUgdmFsdWUgPSAwOwotICBjb25zdCBJbnRUeXBlIHZtaW4gPSBzdGQ6Om51bWVyaWNfbGltaXRzPEludFR5cGU+OjptaW4oKTsKLSAgYXNzZXJ0KHZtaW4gPCAwKTsKLSAgYXNzZXJ0KHZtaW4gPD0gMCAtIGJhc2UpOwotICBJbnRUeXBlIHZtaW5fb3Zlcl9iYXNlID0gdm1pbiAvIGJhc2U7Ci0gIC8vIDIwMDMgYysrIHN0YW5kYXJkIFtleHByLm11bF0KLSAgLy8gIi4uLiB0aGUgc2lnbiBvZiB0aGUgcmVtYWluZGVyIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQuIgotICAvLyBBbHRob3VnaCAodm1pbi9iYXNlKSpiYXNlICsgdm1pbiViYXNlIGlzIGFsd2F5cyB2bWluLgotICAvLyAyMDExIGMrKyBzdGFuZGFyZCB0aWdodGVucyB0aGUgc3BlYyBidXQgd2UgY2Fubm90IHJlbHkgb24gaXQuCi0gIGlmICh2bWluICUgYmFzZSA+IDApIHsKLSAgICB2bWluX292ZXJfYmFzZSArPSAxOwotICB9Ci0gIGNvbnN0IGNoYXIqIHN0YXJ0ID0gdGV4dC5kYXRhKCk7Ci0gIGNvbnN0IGNoYXIqIGVuZCA9IHN0YXJ0ICsgdGV4dC5zaXplKCk7Ci0gIC8vIGxvb3Agb3ZlciBkaWdpdHMKLSAgZm9yICg7IHN0YXJ0IDwgZW5kOyArK3N0YXJ0KSB7Ci0gICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3RhcnRbMF0pOwotICAgIGludCBkaWdpdCA9IGMgLSAnMCc7Ci0gICAgaWYgKGRpZ2l0ID49IGJhc2UgfHwgZGlnaXQgPCAwKSB7Ci0gICAgICAqdmFsdWVfcCA9IHZhbHVlOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBpZiAodmFsdWUgPCB2bWluX292ZXJfYmFzZSkgewotICAgICAgKnZhbHVlX3AgPSB2bWluOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB2YWx1ZSAqPSBiYXNlOwotICAgIGlmICh2YWx1ZSA8IHZtaW4gKyBkaWdpdCkgewotICAgICAgKnZhbHVlX3AgPSB2bWluOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICB2YWx1ZSAtPSBkaWdpdDsKLSAgfQotICAqdmFsdWVfcCA9IHZhbHVlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGU8dHlwZW5hbWUgSW50VHlwZT4KLWJvb2wgc2FmZV9pbnRfaW50ZXJuYWwoc3RyaW5nIHRleHQsIEludFR5cGUqIHZhbHVlX3ApIHsKLSAgKnZhbHVlX3AgPSAwOwotICBib29sIG5lZ2F0aXZlOwotICBpZiAoIXNhZmVfcGFyc2Vfc2lnbigmdGV4dCwgJm5lZ2F0aXZlKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBpZiAoIW5lZ2F0aXZlKSB7Ci0gICAgcmV0dXJuIHNhZmVfcGFyc2VfcG9zaXRpdmVfaW50KHRleHQsIHZhbHVlX3ApOwotICB9IGVsc2UgewotICAgIHJldHVybiBzYWZlX3BhcnNlX25lZ2F0aXZlX2ludCh0ZXh0LCB2YWx1ZV9wKTsKLSAgfQotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBJbnRUeXBlPgotYm9vbCBzYWZlX3VpbnRfaW50ZXJuYWwoc3RyaW5nIHRleHQsIEludFR5cGUqIHZhbHVlX3ApIHsKLSAgKnZhbHVlX3AgPSAwOwotICBib29sIG5lZ2F0aXZlOwotICBpZiAoIXNhZmVfcGFyc2Vfc2lnbigmdGV4dCwgJm5lZ2F0aXZlKSB8fCBuZWdhdGl2ZSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gc2FmZV9wYXJzZV9wb3NpdGl2ZV9pbnQodGV4dCwgdmFsdWVfcCk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZhc3RJbnRUb0J1ZmZlcigpCi0vLyBGYXN0SW50NjRUb0J1ZmZlcigpCi0vLyBGYXN0SGV4VG9CdWZmZXIoKQotLy8gRmFzdEhleDY0VG9CdWZmZXIoKQotLy8gRmFzdEhleDMyVG9CdWZmZXIoKQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0vLyBPZmZzZXQgaW50byBidWZmZXIgd2hlcmUgRmFzdEludDY0VG9CdWZmZXIgcGxhY2VzIHRoZSBlbmQgb2Ygc3RyaW5nCi0vLyBudWxsIGNoYXJhY3Rlci4gIEFsc28gdXNlZCBieSBGYXN0SW50NjRUb0J1ZmZlckxlZnQuCi1zdGF0aWMgY29uc3QgaW50IGtGYXN0SW50NjRUb0J1ZmZlck9mZnNldCA9IDIxOwotCi1jaGFyICpGYXN0SW50NjRUb0J1ZmZlcihpbnQ2NCBpLCBjaGFyKiBidWZmZXIpIHsKLSAgLy8gV2UgY291bGQgY29sbGFwc2UgdGhlIHBvc2l0aXZlIGFuZCBuZWdhdGl2ZSBzZWN0aW9ucywgYnV0IHRoYXQKLSAgLy8gd291bGQgYmUgc2xpZ2h0bHkgc2xvd2VyIGZvciBwb3NpdGl2ZSBudW1iZXJzLi4uCi0gIC8vIDIyIGJ5dGVzIGlzIGVub3VnaCB0byBzdG9yZSAtMioqNjQsIC0xODQ0Njc0NDA3MzcwOTU1MTYxNi4KLSAgY2hhciogcCA9IGJ1ZmZlciArIGtGYXN0SW50NjRUb0J1ZmZlck9mZnNldDsKLSAgKnAtLSA9ICdcMCc7Ci0gIGlmIChpID49IDApIHsKLSAgICBkbyB7Ci0gICAgICAqcC0tID0gJzAnICsgaSAlIDEwOwotICAgICAgaSAvPSAxMDsKLSAgICB9IHdoaWxlIChpID4gMCk7Ci0gICAgcmV0dXJuIHAgKyAxOwotICB9IGVsc2UgewotICAgIC8vIE9uIGRpZmZlcmVudCBwbGF0Zm9ybXMsICUgYW5kIC8gaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3JzIGZvcgotICAgIC8vIG5lZ2F0aXZlIG51bWJlcnMsIHNvIHdlIG5lZWQgdG8ganVtcCB0aHJvdWdoIGhvb3BzIHRvIG1ha2Ugc3VyZQotICAgIC8vIHdlIGRvbid0IGRpdmlkZSBuZWdhdGl2ZSBudW1iZXJzLgotICAgIGlmIChpID4gLTEwKSB7Ci0gICAgICBpID0gLWk7Ci0gICAgICAqcC0tID0gJzAnICsgaTsKLSAgICAgICpwID0gJy0nOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgYXQgTUlOX0lOVCwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndCBzYXkgaSA9IC1pCi0gICAgICBpID0gaSArIDEwOwotICAgICAgaSA9IC1pOwotICAgICAgKnAtLSA9ICcwJyArIGkgJSAxMDsKLSAgICAgIC8vIFVuZG8gd2hhdCB3ZSBkaWQgYSBtb21lbnQgYWdvCi0gICAgICBpID0gaSAvIDEwICsgMTsKLSAgICAgIGRvIHsKLSAgICAgICAgKnAtLSA9ICcwJyArIGkgJSAxMDsKLSAgICAgICAgaSAvPSAxMDsKLSAgICAgIH0gd2hpbGUgKGkgPiAwKTsKLSAgICAgICpwID0gJy0nOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICB9Ci19Ci0KLS8vIE9mZnNldCBpbnRvIGJ1ZmZlciB3aGVyZSBGYXN0SW50MzJUb0J1ZmZlciBwbGFjZXMgdGhlIGVuZCBvZiBzdHJpbmcKLS8vIG51bGwgY2hhcmFjdGVyLiAgQWxzbyB1c2VkIGJ5IEZhc3RJbnQzMlRvQnVmZmVyTGVmdAotc3RhdGljIGNvbnN0IGludCBrRmFzdEludDMyVG9CdWZmZXJPZmZzZXQgPSAxMTsKLQotLy8gWWVzLCB0aGlzIGlzIGEgZHVwbGljYXRlIG9mIEZhc3RJbnQ2NFRvQnVmZmVyLiAgQnV0LCB3ZSBuZWVkIHRoaXMgZm9yIHRoZQotLy8gY29tcGlsZXIgdG8gZ2VuZXJhdGUgMzIgYml0IGFyaXRobWV0aWMgaW5zdHJ1Y3Rpb25zLiAgSXQncyBtdWNoIGZhc3RlciwgYXQKLS8vIGxlYXN0IHdpdGggMzIgYml0IGJpbmFyaWVzLgotY2hhciAqRmFzdEludDMyVG9CdWZmZXIoaW50MzIgaSwgY2hhciogYnVmZmVyKSB7Ci0gIC8vIFdlIGNvdWxkIGNvbGxhcHNlIHRoZSBwb3NpdGl2ZSBhbmQgbmVnYXRpdmUgc2VjdGlvbnMsIGJ1dCB0aGF0Ci0gIC8vIHdvdWxkIGJlIHNsaWdodGx5IHNsb3dlciBmb3IgcG9zaXRpdmUgbnVtYmVycy4uLgotICAvLyAxMiBieXRlcyBpcyBlbm91Z2ggdG8gc3RvcmUgLTIqKjMyLCAtNDI5NDk2NzI5Ni4KLSAgY2hhciogcCA9IGJ1ZmZlciArIGtGYXN0SW50MzJUb0J1ZmZlck9mZnNldDsKLSAgKnAtLSA9ICdcMCc7Ci0gIGlmIChpID49IDApIHsKLSAgICBkbyB7Ci0gICAgICAqcC0tID0gJzAnICsgaSAlIDEwOwotICAgICAgaSAvPSAxMDsKLSAgICB9IHdoaWxlIChpID4gMCk7Ci0gICAgcmV0dXJuIHAgKyAxOwotICB9IGVsc2UgewotICAgIC8vIE9uIGRpZmZlcmVudCBwbGF0Zm9ybXMsICUgYW5kIC8gaGF2ZSBkaWZmZXJlbnQgYmVoYXZpb3JzIGZvcgotICAgIC8vIG5lZ2F0aXZlIG51bWJlcnMsIHNvIHdlIG5lZWQgdG8ganVtcCB0aHJvdWdoIGhvb3BzIHRvIG1ha2Ugc3VyZQotICAgIC8vIHdlIGRvbid0IGRpdmlkZSBuZWdhdGl2ZSBudW1iZXJzLgotICAgIGlmIChpID4gLTEwKSB7Ci0gICAgICBpID0gLWk7Ci0gICAgICAqcC0tID0gJzAnICsgaTsKLSAgICAgICpwID0gJy0nOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIE1ha2Ugc3VyZSB3ZSBhcmVuJ3QgYXQgTUlOX0lOVCwgaW4gd2hpY2ggY2FzZSB3ZSBjYW4ndCBzYXkgaSA9IC1pCi0gICAgICBpID0gaSArIDEwOwotICAgICAgaSA9IC1pOwotICAgICAgKnAtLSA9ICcwJyArIGkgJSAxMDsKLSAgICAgIC8vIFVuZG8gd2hhdCB3ZSBkaWQgYSBtb21lbnQgYWdvCi0gICAgICBpID0gaSAvIDEwICsgMTsKLSAgICAgIGRvIHsKLSAgICAgICAgKnAtLSA9ICcwJyArIGkgJSAxMDsKLSAgICAgICAgaSAvPSAxMDsKLSAgICAgIH0gd2hpbGUgKGkgPiAwKTsKLSAgICAgICpwID0gJy0nOwotICAgICAgcmV0dXJuIHA7Ci0gICAgfQotICB9Ci19Ci0KLWNoYXIgKkZhc3RIZXhUb0J1ZmZlcihpbnQgaSwgY2hhciogYnVmZmVyKSB7Ci0gIEdPT0dMRV9DSEVDSyhpID49IDApIDw8ICJGYXN0SGV4VG9CdWZmZXIoKSB3YW50cyBub24tbmVnYXRpdmUgaW50ZWdlcnMsIG5vdCAiIDw8IGk7Ci0KLSAgc3RhdGljIGNvbnN0IGNoYXIgKmhleGRpZ2l0cyA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgY2hhciAqcCA9IGJ1ZmZlciArIDIxOwotICAqcC0tID0gJ1wwJzsKLSAgZG8gewotICAgICpwLS0gPSBoZXhkaWdpdHNbaSAmIDE1XTsgICAvLyBtb2QgYnkgMTYKLSAgICBpID4+PSA0OyAgICAgICAgICAgICAgICAgICAgLy8gZGl2aWRlIGJ5IDE2Ci0gIH0gd2hpbGUgKGkgPiAwKTsKLSAgcmV0dXJuIHAgKyAxOwotfQotCi1jaGFyICpJbnRlcm5hbEZhc3RIZXhUb0J1ZmZlcih1aW50NjQgdmFsdWUsIGNoYXIqIGJ1ZmZlciwgaW50IG51bV9ieXRlKSB7Ci0gIHN0YXRpYyBjb25zdCBjaGFyICpoZXhkaWdpdHMgPSAiMDEyMzQ1Njc4OWFiY2RlZiI7Ci0gIGJ1ZmZlcltudW1fYnl0ZV0gPSAnXDAnOwotICBmb3IgKGludCBpID0gbnVtX2J5dGUgLSAxOyBpID49IDA7IGktLSkgewotI2lmZGVmIF9NX1g2NAotICAgIC8vIE1TVkMgeDY0IHBsYXRmb3JtIGhhcyBhIGJ1ZyBvcHRpbWl6aW5nIHRoZSB1aW50MzIodmFsdWUpIGluIHRoZSAjZWxzZQotICAgIC8vIGJsb2NrLiBHaXZlbiB0aGF0IHRoZSB1aW50MzIgY2FzdCB3YXMgdG8gaW1wcm92ZSBwZXJmb3JtYW5jZSBvbiAzMi1iaXQKLSAgICAvLyBwbGF0Zm9ybXMsIHdlIHVzZSA2NC1iaXQgJyYnIGRpcmVjdGx5LgotICAgIGJ1ZmZlcltpXSA9IGhleGRpZ2l0c1t2YWx1ZSAmIDB4Zl07Ci0jZWxzZQotICAgIGJ1ZmZlcltpXSA9IGhleGRpZ2l0c1t1aW50MzIodmFsdWUpICYgMHhmXTsKLSNlbmRpZgotICAgIHZhbHVlID4+PSA0OwotICB9Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLWNoYXIgKkZhc3RIZXg2NFRvQnVmZmVyKHVpbnQ2NCB2YWx1ZSwgY2hhciogYnVmZmVyKSB7Ci0gIHJldHVybiBJbnRlcm5hbEZhc3RIZXhUb0J1ZmZlcih2YWx1ZSwgYnVmZmVyLCAxNik7Ci19Ci0KLWNoYXIgKkZhc3RIZXgzMlRvQnVmZmVyKHVpbnQzMiB2YWx1ZSwgY2hhciogYnVmZmVyKSB7Ci0gIHJldHVybiBJbnRlcm5hbEZhc3RIZXhUb0J1ZmZlcih2YWx1ZSwgYnVmZmVyLCA4KTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gRmFzdEludDMyVG9CdWZmZXJMZWZ0KCkKLS8vIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoKQotLy8gRmFzdEludDY0VG9CdWZmZXJMZWZ0KCkKLS8vIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoKQotLy8KLS8vIExpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMgYWJvdmUsIHRoZXNlIGFyZSBpbnRlbmRlZCBmb3Igc3BlZWQuCi0vLyBVbmxpa2UgdGhlIEZhc3QqVG9CdWZmZXIoKSBmdW5jdGlvbnMsIGhvd2V2ZXIsIHRoZXNlIGZ1bmN0aW9ucyB3cml0ZQotLy8gdGhlaXIgb3V0cHV0IHRvIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlciAoaGVuY2UgdGhlIG5hbWUsIGFzIHRoZQotLy8gb3V0cHV0IGlzIGxlZnQtYWxpZ25lZCkuICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0Ci0vLyB0aGUgYnVmZmVyIGhhcyBlbm91Z2ggc3BhY2UgdG8gaG9sZCB0aGUgb3V0cHV0LgotLy8KLS8vIFJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmluZyAoaS5lLiB0aGUgbnVsbCBjaGFyYWN0ZXIKLS8vIHRlcm1pbmF0aW5nIHRoZSBzdHJpbmcpLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdGF0aWMgY29uc3QgY2hhciB0d29fQVNDSUlfZGlnaXRzWzEwMF1bMl0gPSB7Ci0gIHsnMCcsJzAnfSwgeycwJywnMSd9LCB7JzAnLCcyJ30sIHsnMCcsJzMnfSwgeycwJywnNCd9LAotICB7JzAnLCc1J30sIHsnMCcsJzYnfSwgeycwJywnNyd9LCB7JzAnLCc4J30sIHsnMCcsJzknfSwKLSAgeycxJywnMCd9LCB7JzEnLCcxJ30sIHsnMScsJzInfSwgeycxJywnMyd9LCB7JzEnLCc0J30sCi0gIHsnMScsJzUnfSwgeycxJywnNid9LCB7JzEnLCc3J30sIHsnMScsJzgnfSwgeycxJywnOSd9LAotICB7JzInLCcwJ30sIHsnMicsJzEnfSwgeycyJywnMid9LCB7JzInLCczJ30sIHsnMicsJzQnfSwKLSAgeycyJywnNSd9LCB7JzInLCc2J30sIHsnMicsJzcnfSwgeycyJywnOCd9LCB7JzInLCc5J30sCi0gIHsnMycsJzAnfSwgeyczJywnMSd9LCB7JzMnLCcyJ30sIHsnMycsJzMnfSwgeyczJywnNCd9LAotICB7JzMnLCc1J30sIHsnMycsJzYnfSwgeyczJywnNyd9LCB7JzMnLCc4J30sIHsnMycsJzknfSwKLSAgeyc0JywnMCd9LCB7JzQnLCcxJ30sIHsnNCcsJzInfSwgeyc0JywnMyd9LCB7JzQnLCc0J30sCi0gIHsnNCcsJzUnfSwgeyc0JywnNid9LCB7JzQnLCc3J30sIHsnNCcsJzgnfSwgeyc0JywnOSd9LAotICB7JzUnLCcwJ30sIHsnNScsJzEnfSwgeyc1JywnMid9LCB7JzUnLCczJ30sIHsnNScsJzQnfSwKLSAgeyc1JywnNSd9LCB7JzUnLCc2J30sIHsnNScsJzcnfSwgeyc1JywnOCd9LCB7JzUnLCc5J30sCi0gIHsnNicsJzAnfSwgeyc2JywnMSd9LCB7JzYnLCcyJ30sIHsnNicsJzMnfSwgeyc2JywnNCd9LAotICB7JzYnLCc1J30sIHsnNicsJzYnfSwgeyc2JywnNyd9LCB7JzYnLCc4J30sIHsnNicsJzknfSwKLSAgeyc3JywnMCd9LCB7JzcnLCcxJ30sIHsnNycsJzInfSwgeyc3JywnMyd9LCB7JzcnLCc0J30sCi0gIHsnNycsJzUnfSwgeyc3JywnNid9LCB7JzcnLCc3J30sIHsnNycsJzgnfSwgeyc3JywnOSd9LAotICB7JzgnLCcwJ30sIHsnOCcsJzEnfSwgeyc4JywnMid9LCB7JzgnLCczJ30sIHsnOCcsJzQnfSwKLSAgeyc4JywnNSd9LCB7JzgnLCc2J30sIHsnOCcsJzcnfSwgeyc4JywnOCd9LCB7JzgnLCc5J30sCi0gIHsnOScsJzAnfSwgeyc5JywnMSd9LCB7JzknLCcyJ30sIHsnOScsJzMnfSwgeyc5JywnNCd9LAotICB7JzknLCc1J30sIHsnOScsJzYnfSwgeyc5JywnNyd9LCB7JzknLCc4J30sIHsnOScsJzknfQotfTsKLQotY2hhciogRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1aW50MzIgdSwgY2hhciogYnVmZmVyKSB7Ci0gIGludCBkaWdpdHM7Ci0gIGNvbnN0IGNoYXIgKkFTQ0lJX2RpZ2l0cyA9IE5VTEw7Ci0gIC8vIFRoZSBpZGVhIG9mIHRoaXMgaW1wbGVtZW50YXRpb24gaXMgdG8gdHJpbSB0aGUgbnVtYmVyIG9mIGRpdmlkZXMgdG8gYXMgZmV3Ci0gIC8vIGFzIHBvc3NpYmxlIGJ5IHVzaW5nIG11bHRpcGxpY2F0aW9uIGFuZCBzdWJ0cmFjdGlvbiByYXRoZXIgdGhhbiBtb2QgKCUpLAotICAvLyBhbmQgYnkgb3V0cHV0dGluZyB0d28gZGlnaXRzIGF0IGEgdGltZSByYXRoZXIgdGhhbiBvbmUuCi0gIC8vIFRoZSBodWdlLW51bWJlciBjYXNlIGlzIGZpcnN0LCBpbiB0aGUgaG9wZXMgdGhhdCB0aGUgY29tcGlsZXIgd2lsbCBvdXRwdXQKLSAgLy8gdGhhdCBjYXNlIGluIG9uZSBicmFuY2gtZnJlZSBibG9jayBvZiBjb2RlLCBhbmQgb25seSBvdXRwdXQgY29uZGl0aW9uYWwKLSAgLy8gYnJhbmNoZXMgaW50byBpdCBmcm9tIGJlbG93LgotICBpZiAodSA+PSAxMDAwMDAwMDAwKSB7ICAvLyA+PSAxLDAwMCwwMDAsMDAwCi0gICAgZGlnaXRzID0gdSAvIDEwMDAwMDAwMDsgIC8vIDEwMCwwMDAsMDAwCi0gICAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOwotICAgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKLSAgICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07Ci0gICAgYnVmZmVyICs9IDI7Ci1zdWJsdDEwMF8wMDBfMDAwOgotICAgIHUgLT0gZGlnaXRzICogMTAwMDAwMDAwOyAgLy8gMTAwLDAwMCwwMDAKLWx0MTAwXzAwMF8wMDA6Ci0gICAgZGlnaXRzID0gdSAvIDEwMDAwMDA7ICAvLyAxLDAwMCwwMDAKLSAgICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107Ci0gICAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOwotICAgIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKLSAgICBidWZmZXIgKz0gMjsKLXN1Ymx0MV8wMDBfMDAwOgotICAgIHUgLT0gZGlnaXRzICogMTAwMDAwMDsgIC8vIDEsMDAwLDAwMAotbHQxXzAwMF8wMDA6Ci0gICAgZGlnaXRzID0gdSAvIDEwMDAwOyAgLy8gMTAsMDAwCi0gICAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOwotICAgIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKLSAgICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07Ci0gICAgYnVmZmVyICs9IDI7Ci1zdWJsdDEwXzAwMDoKLSAgICB1IC09IGRpZ2l0cyAqIDEwMDAwOyAgLy8gMTAsMDAwCi1sdDEwXzAwMDoKLSAgICBkaWdpdHMgPSB1IC8gMTAwOwotICAgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKLSAgICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07Ci0gICAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOwotICAgIGJ1ZmZlciArPSAyOwotc3VibHQxMDA6Ci0gICAgdSAtPSBkaWdpdHMgKiAxMDA7Ci1sdDEwMDoKLSAgICBkaWdpdHMgPSB1OwotICAgIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKLSAgICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07Ci0gICAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOwotICAgIGJ1ZmZlciArPSAyOwotZG9uZToKLSAgICAqYnVmZmVyID0gMDsKLSAgICByZXR1cm4gYnVmZmVyOwotICB9Ci0KLSAgaWYgKHUgPCAxMDApIHsKLSAgICBkaWdpdHMgPSB1OwotICAgIGlmICh1ID49IDEwKSBnb3RvIGx0MTAwOwotICAgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKLSAgICBnb3RvIGRvbmU7Ci0gIH0KLSAgaWYgKHUgIDwgIDEwMDAwKSB7ICAgLy8gMTAsMDAwCi0gICAgaWYgKHUgPj0gMTAwMCkgZ290byBsdDEwXzAwMDsKLSAgICBkaWdpdHMgPSB1IC8gMTAwOwotICAgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKLSAgICBnb3RvIHN1Ymx0MTAwOwotICB9Ci0gIGlmICh1ICA8ICAxMDAwMDAwKSB7ICAgLy8gMSwwMDAsMDAwCi0gICAgaWYgKHUgPj0gMTAwMDAwKSBnb3RvIGx0MV8wMDBfMDAwOwotICAgIGRpZ2l0cyA9IHUgLyAxMDAwMDsgIC8vICAgIDEwLDAwMAotICAgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKLSAgICBnb3RvIHN1Ymx0MTBfMDAwOwotICB9Ci0gIGlmICh1ICA8ICAxMDAwMDAwMDApIHsgICAvLyAxMDAsMDAwLDAwMAotICAgIGlmICh1ID49IDEwMDAwMDAwKSBnb3RvIGx0MTAwXzAwMF8wMDA7Ci0gICAgZGlnaXRzID0gdSAvIDEwMDAwMDA7ICAvLyAgIDEsMDAwLDAwMAotICAgICpidWZmZXIrKyA9ICcwJyArIGRpZ2l0czsKLSAgICBnb3RvIHN1Ymx0MV8wMDBfMDAwOwotICB9Ci0gIC8vIHdlIGFscmVhZHkga25vdyB0aGF0IHUgPCAxLDAwMCwwMDAsMDAwCi0gIGRpZ2l0cyA9IHUgLyAxMDAwMDAwMDA7ICAgLy8gMTAwLDAwMCwwMDAKLSAgKmJ1ZmZlcisrID0gJzAnICsgZGlnaXRzOwotICBnb3RvIHN1Ymx0MTAwXzAwMF8wMDA7Ci19Ci0KLWNoYXIqIEZhc3RJbnQzMlRvQnVmZmVyTGVmdChpbnQzMiBpLCBjaGFyKiBidWZmZXIpIHsKLSAgdWludDMyIHUgPSBpOwotICBpZiAoaSA8IDApIHsKLSAgICAqYnVmZmVyKysgPSAnLSc7Ci0gICAgdSA9IC1pOwotICB9Ci0gIHJldHVybiBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KHUsIGJ1ZmZlcik7Ci19Ci0KLWNoYXIqIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQodWludDY0IHU2NCwgY2hhciogYnVmZmVyKSB7Ci0gIGludCBkaWdpdHM7Ci0gIGNvbnN0IGNoYXIgKkFTQ0lJX2RpZ2l0cyA9IE5VTEw7Ci0KLSAgdWludDMyIHUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHU2NCk7Ci0gIGlmICh1ID09IHU2NCkgcmV0dXJuIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQodSwgYnVmZmVyKTsKLQotICB1aW50NjQgdG9wXzExX2RpZ2l0cyA9IHU2NCAvIDEwMDAwMDAwMDA7Ci0gIGJ1ZmZlciA9IEZhc3RVSW50NjRUb0J1ZmZlckxlZnQodG9wXzExX2RpZ2l0cywgYnVmZmVyKTsKLSAgdSA9IHU2NCAtICh0b3BfMTFfZGlnaXRzICogMTAwMDAwMDAwMCk7Ci0KLSAgZGlnaXRzID0gdSAvIDEwMDAwMDAwOyAgLy8gMTAsMDAwLDAwMAotICBHT09HTEVfRENIRUNLX0xUKGRpZ2l0cywgMTAwKTsKLSAgQVNDSUlfZGlnaXRzID0gdHdvX0FTQ0lJX2RpZ2l0c1tkaWdpdHNdOwotICBidWZmZXJbMF0gPSBBU0NJSV9kaWdpdHNbMF07Ci0gIGJ1ZmZlclsxXSA9IEFTQ0lJX2RpZ2l0c1sxXTsKLSAgYnVmZmVyICs9IDI7Ci0gIHUgLT0gZGlnaXRzICogMTAwMDAwMDA7ICAvLyAxMCwwMDAsMDAwCi0gIGRpZ2l0cyA9IHUgLyAxMDAwMDA7ICAvLyAxMDAsMDAwCi0gIEFTQ0lJX2RpZ2l0cyA9IHR3b19BU0NJSV9kaWdpdHNbZGlnaXRzXTsKLSAgYnVmZmVyWzBdID0gQVNDSUlfZGlnaXRzWzBdOwotICBidWZmZXJbMV0gPSBBU0NJSV9kaWdpdHNbMV07Ci0gIGJ1ZmZlciArPSAyOwotICB1IC09IGRpZ2l0cyAqIDEwMDAwMDsgIC8vIDEwMCwwMDAKLSAgZGlnaXRzID0gdSAvIDEwMDA7ICAvLyAxLDAwMAotICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107Ci0gIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKLSAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOwotICBidWZmZXIgKz0gMjsKLSAgdSAtPSBkaWdpdHMgKiAxMDAwOyAgLy8gMSwwMDAKLSAgZGlnaXRzID0gdSAvIDEwOwotICBBU0NJSV9kaWdpdHMgPSB0d29fQVNDSUlfZGlnaXRzW2RpZ2l0c107Ci0gIGJ1ZmZlclswXSA9IEFTQ0lJX2RpZ2l0c1swXTsKLSAgYnVmZmVyWzFdID0gQVNDSUlfZGlnaXRzWzFdOwotICBidWZmZXIgKz0gMjsKLSAgdSAtPSBkaWdpdHMgKiAxMDsKLSAgZGlnaXRzID0gdTsKLSAgKmJ1ZmZlcisrID0gJzAnICsgZGlnaXRzOwotICAqYnVmZmVyID0gMDsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotY2hhciogRmFzdEludDY0VG9CdWZmZXJMZWZ0KGludDY0IGksIGNoYXIqIGJ1ZmZlcikgewotICB1aW50NjQgdSA9IGk7Ci0gIGlmIChpIDwgMCkgewotICAgICpidWZmZXIrKyA9ICctJzsKLSAgICB1ID0gLWk7Ci0gIH0KLSAgcmV0dXJuIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQodSwgYnVmZmVyKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU2ltcGxlSXRvYSgpCi0vLyAgICBEZXNjcmlwdGlvbjogY29udmVydHMgYW4gaW50ZWdlciB0byBhIHN0cmluZy4KLS8vCi0vLyAgICBSZXR1cm4gdmFsdWU6IHN0cmluZwotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1zdHJpbmcgU2ltcGxlSXRvYShpbnQgaSkgewotICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07Ci0gIHJldHVybiAoc2l6ZW9mKGkpID09IDQpID8KLSAgICBGYXN0SW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDoKLSAgICBGYXN0SW50NjRUb0J1ZmZlcihpLCBidWZmZXIpOwotfQotCi1zdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBpbnQgaSkgewotICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07Ci0gIHJldHVybiBzdHJpbmcoYnVmZmVyLCAoc2l6ZW9mKGkpID09IDQpID8KLSAgICBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikgOgotICAgIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKSk7Ci19Ci0KLXN0cmluZyBTaW1wbGVJdG9hKGxvbmcgaSkgewotICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07Ci0gIHJldHVybiAoc2l6ZW9mKGkpID09IDQpID8KLSAgICBGYXN0SW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDoKLSAgICBGYXN0SW50NjRUb0J1ZmZlcihpLCBidWZmZXIpOwotfQotCi1zdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBsb25nIGkpIHsKLSAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOwotICByZXR1cm4gc3RyaW5nKGJ1ZmZlciwgKHNpemVvZihpKSA9PSA0KSA/Ci0gICAgRmFzdFVJbnQzMlRvQnVmZmVyTGVmdChpLCBidWZmZXIpIDoKLSAgICBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikpOwotfQotCi1zdHJpbmcgU2ltcGxlSXRvYShsb25nIGxvbmcgaSkgewotICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07Ci0gIHJldHVybiAoc2l6ZW9mKGkpID09IDQpID8KLSAgICBGYXN0SW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDoKLSAgICBGYXN0SW50NjRUb0J1ZmZlcihpLCBidWZmZXIpOwotfQotCi1zdHJpbmcgU2ltcGxlSXRvYSh1bnNpZ25lZCBsb25nIGxvbmcgaSkgewotICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07Ci0gIHJldHVybiBzdHJpbmcoYnVmZmVyLCAoc2l6ZW9mKGkpID09IDQpID8KLSAgICBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcikgOgotICAgIEZhc3RVSW50NjRUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNpbXBsZUR0b2EoKQotLy8gU2ltcGxlRnRvYSgpCi0vLyBEb3VibGVUb0J1ZmZlcigpCi0vLyBGbG9hdFRvQnVmZmVyKCkKLS8vICAgIFdlIHdhbnQgdG8gcHJpbnQgdGhlIHZhbHVlIHdpdGhvdXQgbG9zaW5nIHByZWNpc2lvbiwgYnV0IHdlIGFsc28gZG8KLS8vICAgIG5vdCB3YW50IHRvIHByaW50IG1vcmUgZGlnaXRzIHRoYW4gbmVjZXNzYXJ5LiAgVGhpcyB0dXJucyBvdXQgdG8gYmUKLS8vICAgIHRyaWNraWVyIHRoYW4gaXQgc291bmRzLiAgTnVtYmVycyBsaWtlIDAuMiBjYW5ub3QgYmUgcmVwcmVzZW50ZWQKLS8vICAgIGV4YWN0bHkgaW4gYmluYXJ5LiAgSWYgd2UgcHJpbnQgMC4yIHdpdGggYSB2ZXJ5IGxhcmdlIHByZWNpc2lvbiwKLS8vICAgIGUuZy4gIiUuNTBnIiwgd2UgZ2V0ICIwLjIwMDAwMDAwMDAwMDAwMDAxMTEwMjIzMDI0NjI1MTU2NTQwNDIzNjMxNjciLgotLy8gICAgT24gdGhlIG90aGVyIGhhbmQsIGlmIHdlIHNldCB0aGUgcHJlY2lzaW9uIHRvbyBsb3csIHdlIGxvc2UKLS8vICAgIHNpZ25pZmljYW50IGRpZ2l0cyB3aGVuIHByaW50aW5nIG51bWJlcnMgdGhhdCBhY3R1YWxseSBuZWVkIHRoZW0uCi0vLyAgICBJdCB0dXJucyBvdXQgdGhlcmUgaXMgbm8gcHJlY2lzaW9uIHZhbHVlIHRoYXQgZG9lcyB0aGUgcmlnaHQgdGhpbmcKLS8vICAgIGZvciBhbGwgbnVtYmVycy4KLS8vCi0vLyAgICBPdXIgc3RyYXRlZ3kgaXMgdG8gZmlyc3QgdHJ5IHByaW50aW5nIHdpdGggYSBwcmVjaXNpb24gdGhhdCBpcyBuZXZlcgotLy8gICAgb3Zlci1wcmVjaXNlLCB0aGVuIHBhcnNlIHRoZSByZXN1bHQgd2l0aCBzdHJ0b2QoKSB0byBzZWUgaWYgaXQKLS8vICAgIG1hdGNoZXMuICBJZiBub3QsIHdlIHByaW50IGFnYWluIHdpdGggYSBwcmVjaXNpb24gdGhhdCB3aWxsIGFsd2F5cwotLy8gICAgZ2l2ZSBhIHByZWNpc2UgcmVzdWx0LCBidXQgbWF5IHVzZSBtb3JlIGRpZ2l0cyB0aGFuIG5lY2Vzc2FyeS4KLS8vCi0vLyAgICBBbiBhcmd1YWJseSBiZXR0ZXIgc3RyYXRlZ3kgd291bGQgYmUgdG8gdXNlIHRoZSBhbGdvcml0aG0gZGVzY3JpYmVkCi0vLyAgICBpbiAiSG93IHRvIFByaW50IEZsb2F0aW5nLVBvaW50IE51bWJlcnMgQWNjdXJhdGVseSIgYnkgU3RlZWxlICYKLS8vICAgIFdoaXRlLCBlLmcuIGFzIGltcGxlbWVudGVkIGJ5IERhdmlkIE0uIEdheSdzIGR0b2EoKS4gIEl0IHR1cm5zIG91dCwKLS8vICAgIGhvd2V2ZXIsIHRoYXQgdGhlIGZvbGxvd2luZyBpbXBsZW1lbnRhdGlvbiBpcyBhYm91dCBhcyBmYXN0IGFzCi0vLyAgICBETUcncyBjb2RlLiAgRnVydGhlcm1vcmUsIERNRydzIGNvZGUgbG9ja3MgbXV0ZXhlcywgd2hpY2ggbWVhbnMgaXQKLS8vICAgIHdpbGwgbm90IHNjYWxlIHdlbGwgb24gbXVsdGktY29yZSBtYWNoaW5lcy4gIERNRydzIGNvZGUgaXMgc2xpZ2h0bHkKLS8vICAgIG1vcmUgYWNjdXJhdGUgKGluIHRoYXQgaXQgd2lsbCBuZXZlciB1c2UgbW9yZSBkaWdpdHMgdGhhbgotLy8gICAgbmVjZXNzYXJ5KSwgYnV0IHRoaXMgaXMgcHJvYmFibHkgaXJyZWxldmFudCBmb3IgbW9zdCB1c2Vycy4KLS8vCi0vLyAgICBSb2IgUGlrZSBhbmQgS2VuIFRob21wc29uIGFsc28gaGF2ZSBhbiBpbXBsZW1lbnRhdGlvbiBvZiBkdG9hKCkgaW4KLS8vICAgIHRoaXJkX3BhcnR5L2ZtdC9mbHRmbXQuY2MuICBUaGVpciBpbXBsZW1lbnRhdGlvbiBpcyBzaW1pbGFyIHRvIHRoaXMKLS8vICAgIG9uZSBpbiB0aGF0IGl0IG1ha2VzIGd1ZXNzZXMgYW5kIHRoZW4gdXNlcyBzdHJ0b2QoKSB0byBjaGVjayB0aGVtLgotLy8gICAgVGhlaXIgaW1wbGVtZW50YXRpb24gaXMgZmFzdGVyIGJlY2F1c2UgdGhleSB1c2UgdGhlaXIgb3duIGNvZGUgdG8KLS8vICAgIGdlbmVyYXRlIHRoZSBkaWdpdHMgaW4gdGhlIGZpcnN0IHBsYWNlIHJhdGhlciB0aGFuIHVzZSBzbnByaW50ZigpLAotLy8gICAgdGh1cyBhdm9pZGluZyBmb3JtYXQgc3RyaW5nIHBhcnNpbmcgb3ZlcmhlYWQuICBIb3dldmVyLCB0aGlzIG1ha2VzCi0vLyAgICBpdCBjb25zaWRlcmFibHkgbW9yZSBjb21wbGljYXRlZCB0aGFuIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24sCi0vLyAgICBhbmQgaXQgaXMgZW1iZWRkZWQgaW4gYSBsYXJnZXIgbGlicmFyeS4gIElmIHNwZWVkIHR1cm5zIG91dCB0byBiZQotLy8gICAgYW4gaXNzdWUsIHdlIGNvdWxkIHJlLWltcGxlbWVudCB0aGlzIGluIHRlcm1zIG9mIHRoZWlyCi0vLyAgICBpbXBsZW1lbnRhdGlvbi4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotc3RyaW5nIFNpbXBsZUR0b2EoZG91YmxlIHZhbHVlKSB7Ci0gIGNoYXIgYnVmZmVyW2tEb3VibGVUb0J1ZmZlclNpemVdOwotICByZXR1cm4gRG91YmxlVG9CdWZmZXIodmFsdWUsIGJ1ZmZlcik7Ci19Ci0KLXN0cmluZyBTaW1wbGVGdG9hKGZsb2F0IHZhbHVlKSB7Ci0gIGNoYXIgYnVmZmVyW2tGbG9hdFRvQnVmZmVyU2l6ZV07Ci0gIHJldHVybiBGbG9hdFRvQnVmZmVyKHZhbHVlLCBidWZmZXIpOwotfQotCi1zdGF0aWMgaW5saW5lIGJvb2wgSXNWYWxpZEZsb2F0Q2hhcihjaGFyIGMpIHsKLSAgcmV0dXJuICgnMCcgPD0gYyAmJiBjIDw9ICc5JykgfHwKLSAgICAgICAgIGMgPT0gJ2UnIHx8IGMgPT0gJ0UnIHx8Ci0gICAgICAgICBjID09ICcrJyB8fCBjID09ICctJzsKLX0KLQotdm9pZCBEZWxvY2FsaXplUmFkaXgoY2hhciogYnVmZmVyKSB7Ci0gIC8vIEZhc3QgY2hlY2s6ICBpZiB0aGUgYnVmZmVyIGhhcyBhIG5vcm1hbCBkZWNpbWFsIHBvaW50LCBhc3N1bWUgbm8KLSAgLy8gdHJhbnNsYXRpb24gaXMgbmVlZGVkLgotICBpZiAoc3RyY2hyKGJ1ZmZlciwgJy4nKSAhPSBOVUxMKSByZXR1cm47Ci0KLSAgLy8gRmluZCB0aGUgZmlyc3QgdW5rbm93biBjaGFyYWN0ZXIuCi0gIHdoaWxlIChJc1ZhbGlkRmxvYXRDaGFyKCpidWZmZXIpKSArK2J1ZmZlcjsKLQotICBpZiAoKmJ1ZmZlciA9PSAnXDAnKSB7Ci0gICAgLy8gTm8gcmFkaXggY2hhcmFjdGVyIGZvdW5kLgotICAgIHJldHVybjsKLSAgfQotCi0gIC8vIFdlIGFyZSBub3cgcG9pbnRpbmcgYXQgdGhlIGxvY2FsZS1zcGVjaWZpYyByYWRpeCBjaGFyYWN0ZXIuICBSZXBsYWNlIGl0Ci0gIC8vIHdpdGggJy4nLgotICAqYnVmZmVyID0gJy4nOwotICArK2J1ZmZlcjsKLQotICBpZiAoIUlzVmFsaWRGbG9hdENoYXIoKmJ1ZmZlcikgJiYgKmJ1ZmZlciAhPSAnXDAnKSB7Ci0gICAgLy8gSXQgYXBwZWFycyB0aGUgcmFkaXggd2FzIGEgbXVsdGktYnl0ZSBjaGFyYWN0ZXIuICBXZSBuZWVkIHRvIHJlbW92ZSB0aGUKLSAgICAvLyBleHRyYSBieXRlcy4KLSAgICBjaGFyKiB0YXJnZXQgPSBidWZmZXI7Ci0gICAgZG8geyArK2J1ZmZlcjsgfSB3aGlsZSAoIUlzVmFsaWRGbG9hdENoYXIoKmJ1ZmZlcikgJiYgKmJ1ZmZlciAhPSAnXDAnKTsKLSAgICBtZW1tb3ZlKHRhcmdldCwgYnVmZmVyLCBzdHJsZW4oYnVmZmVyKSArIDEpOwotICB9Ci19Ci0KLWNoYXIqIERvdWJsZVRvQnVmZmVyKGRvdWJsZSB2YWx1ZSwgY2hhciogYnVmZmVyKSB7Ci0gIC8vIERCTF9ESUcgaXMgMTUgZm9yIElFRUUtNzU0IGRvdWJsZXMsIHdoaWNoIGFyZSB1c2VkIG9uIGFsbW9zdCBhbGwKLSAgLy8gcGxhdGZvcm1zIHRoZXNlIGRheXMuICBKdXN0IGluIGNhc2Ugc29tZSBzeXN0ZW0gZXhpc3RzIHdoZXJlIERCTF9ESUcKLSAgLy8gaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIgLS0gYW5kIHJpc2tzIG92ZXJmbG93aW5nIG91ciBidWZmZXIgLS0gd2UgaGF2ZQotICAvLyB0aGlzIGFzc2VydC4KLSAgR09PR0xFX0NPTVBJTEVfQVNTRVJUKERCTF9ESUcgPCAyMCwgREJMX0RJR19pc190b29fYmlnKTsKLQotICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgewotICAgIHN0cmNweShidWZmZXIsICJpbmYiKTsKLSAgICByZXR1cm4gYnVmZmVyOwotICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgIi1pbmYiKTsKLSAgICByZXR1cm4gYnVmZmVyOwotICB9IGVsc2UgaWYgKE1hdGhMaW1pdHM8ZG91YmxlPjo6SXNOYU4odmFsdWUpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgIm5hbiIpOwotICAgIHJldHVybiBidWZmZXI7Ci0gIH0KLQotICBpbnQgc25wcmludGZfcmVzdWx0ID0KLSAgICBzbnByaW50ZihidWZmZXIsIGtEb3VibGVUb0J1ZmZlclNpemUsICIlLipnIiwgREJMX0RJRywgdmFsdWUpOwotCi0gIC8vIFRoZSBzbnByaW50ZiBzaG91bGQgbmV2ZXIgb3ZlcmZsb3cgYmVjYXVzZSB0aGUgYnVmZmVyIGlzIHNpZ25pZmljYW50bHkKLSAgLy8gbGFyZ2VyIHRoYW4gdGhlIHByZWNpc2lvbiB3ZSBhc2tlZCBmb3IuCi0gIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRG91YmxlVG9CdWZmZXJTaXplKTsKLQotICAvLyBXZSBuZWVkIHRvIG1ha2UgcGFyc2VkX3ZhbHVlIHZvbGF0aWxlIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0bwotICAvLyB3cml0ZSBpdCBvdXQgdG8gdGhlIHN0YWNrLiAgT3RoZXJ3aXNlLCBpdCBtYXkga2VlcCB0aGUgdmFsdWUgaW4gYQotICAvLyByZWdpc3RlciwgYW5kIGlmIGl0IGRvZXMgdGhhdCwgaXQgbWF5IGtlZXAgaXQgYXMgYSBsb25nIGRvdWJsZSBpbnN0ZWFkCi0gIC8vIG9mIGEgZG91YmxlLiAgVGhpcyBsb25nIGRvdWJsZSBtYXkgaGF2ZSBleHRyYSBiaXRzIHRoYXQgbWFrZSBpdCBjb21wYXJlCi0gIC8vIHVuZXF1YWwgdG8gInZhbHVlIiBldmVuIHRob3VnaCBpdCB3b3VsZCBiZSBleGFjdGx5IGVxdWFsIGlmIGl0IHdlcmUKLSAgLy8gdHJ1bmNhdGVkIHRvIGEgZG91YmxlLgotICB2b2xhdGlsZSBkb3VibGUgcGFyc2VkX3ZhbHVlID0gc3RydG9kKGJ1ZmZlciwgTlVMTCk7Ci0gIGlmIChwYXJzZWRfdmFsdWUgIT0gdmFsdWUpIHsKLSAgICBpbnQgc25wcmludGZfcmVzdWx0ID0KLSAgICAgIHNucHJpbnRmKGJ1ZmZlciwga0RvdWJsZVRvQnVmZmVyU2l6ZSwgIiUuKmciLCBEQkxfRElHKzIsIHZhbHVlKTsKLQotICAgIC8vIFNob3VsZCBuZXZlciBvdmVyZmxvdzsgc2VlIGFib3ZlLgotICAgIEdPT0dMRV9EQ0hFQ0soc25wcmludGZfcmVzdWx0ID4gMCAmJiBzbnByaW50Zl9yZXN1bHQgPCBrRG91YmxlVG9CdWZmZXJTaXplKTsKLSAgfQotCi0gIERlbG9jYWxpemVSYWRpeChidWZmZXIpOwotICByZXR1cm4gYnVmZmVyOwotfQotCi1zdGF0aWMgaW50IG1lbWNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbGVuKSB7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihzMSk7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihzMik7Ci0KLSAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7Ci0gICAgY29uc3QgaW50IGRpZmYgPQotICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihhc2NpaV90b2xvd2VyKHVzMVtpXSkpKSAtCi0gICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGFzY2lpX3RvbG93ZXIodXMyW2ldKSkpOwotICAgIGlmIChkaWZmICE9IDApIHJldHVybiBkaWZmOwotICB9Ci0gIHJldHVybiAwOwotfQotCi1pbmxpbmUgYm9vbCBDYXNlRXF1YWwoU3RyaW5nUGllY2UgczEsIFN0cmluZ1BpZWNlIHMyKSB7Ci0gIGlmIChzMS5zaXplKCkgIT0gczIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBtZW1jYXNlY21wKHMxLmRhdGEoKSwgczIuZGF0YSgpLCBzMS5zaXplKCkpID09IDA7Ci19Ci0KLWJvb2wgc2FmZV9zdHJ0b2IoU3RyaW5nUGllY2Ugc3RyLCBib29sKiB2YWx1ZSkgewotICBHT09HTEVfQ0hFQ0sodmFsdWUgIT0gTlVMTCkgPDwgIk5VTEwgb3V0cHV0IGJvb2xlYW4gZ2l2ZW4uIjsKLSAgaWYgKENhc2VFcXVhbChzdHIsICJ0cnVlIikgfHwgQ2FzZUVxdWFsKHN0ciwgInQiKSB8fAotICAgICAgQ2FzZUVxdWFsKHN0ciwgInllcyIpIHx8IENhc2VFcXVhbChzdHIsICJ5IikgfHwKLSAgICAgIENhc2VFcXVhbChzdHIsICIxIikpIHsKLSAgICAqdmFsdWUgPSB0cnVlOwotICAgIHJldHVybiB0cnVlOwotICB9Ci0gIGlmIChDYXNlRXF1YWwoc3RyLCAiZmFsc2UiKSB8fCBDYXNlRXF1YWwoc3RyLCAiZiIpIHx8Ci0gICAgICBDYXNlRXF1YWwoc3RyLCAibm8iKSB8fCBDYXNlRXF1YWwoc3RyLCAibiIpIHx8Ci0gICAgICBDYXNlRXF1YWwoc3RyLCAiMCIpKSB7Ci0gICAgKnZhbHVlID0gZmFsc2U7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1ib29sIHNhZmVfc3RydG9mKGNvbnN0IGNoYXIqIHN0ciwgZmxvYXQqIHZhbHVlKSB7Ci0gIGNoYXIqIGVuZHB0cjsKLSAgZXJybm8gPSAwOyAgLy8gZXJybm8gb25seSBnZXRzIHNldCBvbiBlcnJvcnMKLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZCAoX19ocHV4KSAgLy8gaGFzIG5vIHN0cnRvZigpCi0gICp2YWx1ZSA9IHN0cnRvZChzdHIsICZlbmRwdHIpOwotI2Vsc2UKLSAgKnZhbHVlID0gc3RydG9mKHN0ciwgJmVuZHB0cik7Ci0jZW5kaWYKLSAgcmV0dXJuICpzdHIgIT0gMCAmJiAqZW5kcHRyID09IDAgJiYgZXJybm8gPT0gMDsKLX0KLQotYm9vbCBzYWZlX3N0cnRvZChjb25zdCBjaGFyKiBzdHIsIGRvdWJsZSogdmFsdWUpIHsKLSAgY2hhciogZW5kcHRyOwotICAqdmFsdWUgPSBzdHJ0b2Qoc3RyLCAmZW5kcHRyKTsKLSAgaWYgKGVuZHB0ciAhPSBzdHIpIHsKLSAgICB3aGlsZSAoYXNjaWlfaXNzcGFjZSgqZW5kcHRyKSkgKytlbmRwdHI7Ci0gIH0KLSAgLy8gSWdub3JlIHJhbmdlIGVycm9ycyBmcm9tIHN0cnRvZC4gIFRoZSB2YWx1ZXMgaXQKLSAgLy8gcmV0dXJucyBvbiB1bmRlcmZsb3cgYW5kIG92ZXJmbG93IGFyZSB0aGUgcmlnaHQKLSAgLy8gZmFsbGJhY2sgaW4gYSByb2J1c3Qgc2V0dGluZy4KLSAgcmV0dXJuICpzdHIgIT0gJ1wwJyAmJiAqZW5kcHRyID09ICdcMCc7Ci19Ci0KLWJvb2wgc2FmZV9zdHJ0bzMyKGNvbnN0IHN0cmluZyYgc3RyLCBpbnQzMiogdmFsdWUpIHsKLSAgcmV0dXJuIHNhZmVfaW50X2ludGVybmFsKHN0ciwgdmFsdWUpOwotfQotCi1ib29sIHNhZmVfc3RydG91MzIoY29uc3Qgc3RyaW5nJiBzdHIsIHVpbnQzMiogdmFsdWUpIHsKLSAgcmV0dXJuIHNhZmVfdWludF9pbnRlcm5hbChzdHIsIHZhbHVlKTsKLX0KLQotYm9vbCBzYWZlX3N0cnRvNjQoY29uc3Qgc3RyaW5nJiBzdHIsIGludDY0KiB2YWx1ZSkgewotICByZXR1cm4gc2FmZV9pbnRfaW50ZXJuYWwoc3RyLCB2YWx1ZSk7Ci19Ci0KLWJvb2wgc2FmZV9zdHJ0b3U2NChjb25zdCBzdHJpbmcmIHN0ciwgdWludDY0KiB2YWx1ZSkgewotICByZXR1cm4gc2FmZV91aW50X2ludGVybmFsKHN0ciwgdmFsdWUpOwotfQotCi1jaGFyKiBGbG9hdFRvQnVmZmVyKGZsb2F0IHZhbHVlLCBjaGFyKiBidWZmZXIpIHsKLSAgLy8gRkxUX0RJRyBpcyA2IGZvciBJRUVFLTc1NCBmbG9hdHMsIHdoaWNoIGFyZSB1c2VkIG9uIGFsbW9zdCBhbGwKLSAgLy8gcGxhdGZvcm1zIHRoZXNlIGRheXMuICBKdXN0IGluIGNhc2Ugc29tZSBzeXN0ZW0gZXhpc3RzIHdoZXJlIEZMVF9ESUcKLSAgLy8gaXMgc2lnbmlmaWNhbnRseSBsYXJnZXIgLS0gYW5kIHJpc2tzIG92ZXJmbG93aW5nIG91ciBidWZmZXIgLS0gd2UgaGF2ZQotICAvLyB0aGlzIGFzc2VydC4KLSAgR09PR0xFX0NPTVBJTEVfQVNTRVJUKEZMVF9ESUcgPCAxMCwgRkxUX0RJR19pc190b29fYmlnKTsKLQotICBpZiAodmFsdWUgPT0gbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgewotICAgIHN0cmNweShidWZmZXIsICJpbmYiKTsKLSAgICByZXR1cm4gYnVmZmVyOwotICB9IGVsc2UgaWYgKHZhbHVlID09IC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKSB7Ci0gICAgc3RyY3B5KGJ1ZmZlciwgIi1pbmYiKTsKLSAgICByZXR1cm4gYnVmZmVyOwotICB9IGVsc2UgaWYgKE1hdGhMaW1pdHM8ZmxvYXQ+OjpJc05hTih2YWx1ZSkpIHsKLSAgICBzdHJjcHkoYnVmZmVyLCAibmFuIik7Ci0gICAgcmV0dXJuIGJ1ZmZlcjsKLSAgfQotCi0gIGludCBzbnByaW50Zl9yZXN1bHQgPQotICAgIHNucHJpbnRmKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcsIHZhbHVlKTsKLQotICAvLyBUaGUgc25wcmludGYgc2hvdWxkIG5ldmVyIG92ZXJmbG93IGJlY2F1c2UgdGhlIGJ1ZmZlciBpcyBzaWduaWZpY2FudGx5Ci0gIC8vIGxhcmdlciB0aGFuIHRoZSBwcmVjaXNpb24gd2UgYXNrZWQgZm9yLgotICBHT09HTEVfRENIRUNLKHNucHJpbnRmX3Jlc3VsdCA+IDAgJiYgc25wcmludGZfcmVzdWx0IDwga0Zsb2F0VG9CdWZmZXJTaXplKTsKLQotICBmbG9hdCBwYXJzZWRfdmFsdWU7Ci0gIGlmICghc2FmZV9zdHJ0b2YoYnVmZmVyLCAmcGFyc2VkX3ZhbHVlKSB8fCBwYXJzZWRfdmFsdWUgIT0gdmFsdWUpIHsKLSAgICBpbnQgc25wcmludGZfcmVzdWx0ID0KLSAgICAgIHNucHJpbnRmKGJ1ZmZlciwga0Zsb2F0VG9CdWZmZXJTaXplLCAiJS4qZyIsIEZMVF9ESUcrMiwgdmFsdWUpOwotCi0gICAgLy8gU2hvdWxkIG5ldmVyIG92ZXJmbG93OyBzZWUgYWJvdmUuCi0gICAgR09PR0xFX0RDSEVDSyhzbnByaW50Zl9yZXN1bHQgPiAwICYmIHNucHJpbnRmX3Jlc3VsdCA8IGtGbG9hdFRvQnVmZmVyU2l6ZSk7Ci0gIH0KLQotICBEZWxvY2FsaXplUmFkaXgoYnVmZmVyKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLQotbmFtZXNwYWNlIHN0cmluZ3MgewotCi1BbHBoYU51bTo6QWxwaGFOdW0oc3RyaW5nczo6SGV4IGhleCkgewotICBjaGFyICpjb25zdCBlbmQgPSAmZGlnaXRzW2tGYXN0VG9CdWZmZXJTaXplXTsKLSAgY2hhciAqd3JpdGVyID0gZW5kOwotICB1aW50NjQgdmFsdWUgPSBoZXgudmFsdWU7Ci0gIHVpbnQ2NCB3aWR0aCA9IGhleC5zcGVjOwotICAvLyBXZSBhY2NvbXBsaXNoIG1pbmltdW0gd2lkdGggYnkgT1InaW5nIGluIDB4MTAwMDAgdG8gdGhlIHVzZXIncyB2YWx1ZSwKLSAgLy8gd2hlcmUgMHgxMDAwMCBpcyB0aGUgc21hbGxlc3QgaGV4IG51bWJlciB0aGF0IGlzIGFzIHdpZGUgYXMgdGhlIHVzZXIKLSAgLy8gYXNrZWQgZm9yLgotICB1aW50NjQgbWFzayA9ICgoc3RhdGljX2Nhc3Q8dWludDY0PigxKSA8PCAod2lkdGggLSAxKSAqIDQpKSB8IHZhbHVlOwotICBzdGF0aWMgY29uc3QgY2hhciBoZXhkaWdpdHNbXSA9ICIwMTIzNDU2Nzg5YWJjZGVmIjsKLSAgZG8gewotICAgICotLXdyaXRlciA9IGhleGRpZ2l0c1t2YWx1ZSAmIDB4Rl07Ci0gICAgdmFsdWUgPj49IDQ7Ci0gICAgbWFzayA+Pj0gNDsKLSAgfSB3aGlsZSAobWFzayAhPSAwKTsKLSAgcGllY2VfZGF0YV8gPSB3cml0ZXI7Ci0gIHBpZWNlX3NpemVfID0gZW5kIC0gd3JpdGVyOwotfQotCi19ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTdHJDYXQoKQotLy8gICAgVGhpcyBtZXJnZXMgdGhlIGdpdmVuIHN0cmluZ3Mgb3IgaW50ZWdlcnMsIHdpdGggbm8gZGVsaW1pdGVyLiAgVGhpcwotLy8gICAgaXMgZGVzaWduZWQgdG8gYmUgdGhlIGZhc3Rlc3QgcG9zc2libGUgd2F5IHRvIGNvbnN0cnVjdCBhIHN0cmluZyBvdXQKLS8vICAgIG9mIGEgbWl4IG9mIHJhdyBDIHN0cmluZ3MsIEMrKyBzdHJpbmdzLCBhbmQgaW50ZWdlciB2YWx1ZXMuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLS8vIEFwcGVuZCBpcyBtZXJlbHkgYSB2ZXJzaW9uIG9mIG1lbWNweSB0aGF0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUKLS8vIGFmdGVyIHRoZSBhcmVhIGp1c3Qgb3ZlcndyaXR0ZW4uICBJdCBjb21lcyBpbiBtdWx0aXBsZSBmbGF2b3JzIHRvIG1pbmltaXplCi0vLyBjYWxsIG92ZXJoZWFkLgotc3RhdGljIGNoYXIgKkFwcGVuZDEoY2hhciAqb3V0LCBjb25zdCBBbHBoYU51bSAmeCkgewotICBtZW1jcHkob3V0LCB4LmRhdGEoKSwgeC5zaXplKCkpOwotICByZXR1cm4gb3V0ICsgeC5zaXplKCk7Ci19Ci0KLXN0YXRpYyBjaGFyICpBcHBlbmQyKGNoYXIgKm91dCwgY29uc3QgQWxwaGFOdW0gJngxLCBjb25zdCBBbHBoYU51bSAmeDIpIHsKLSAgbWVtY3B5KG91dCwgeDEuZGF0YSgpLCB4MS5zaXplKCkpOwotICBvdXQgKz0geDEuc2l6ZSgpOwotCi0gIG1lbWNweShvdXQsIHgyLmRhdGEoKSwgeDIuc2l6ZSgpKTsKLSAgcmV0dXJuIG91dCArIHgyLnNpemUoKTsKLX0KLQotc3RhdGljIGNoYXIgKkFwcGVuZDQoY2hhciAqb3V0LAotICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJngxLCBjb25zdCBBbHBoYU51bSAmeDIsCi0gICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmeDMsIGNvbnN0IEFscGhhTnVtICZ4NCkgewotICBtZW1jcHkob3V0LCB4MS5kYXRhKCksIHgxLnNpemUoKSk7Ci0gIG91dCArPSB4MS5zaXplKCk7Ci0KLSAgbWVtY3B5KG91dCwgeDIuZGF0YSgpLCB4Mi5zaXplKCkpOwotICBvdXQgKz0geDIuc2l6ZSgpOwotCi0gIG1lbWNweShvdXQsIHgzLmRhdGEoKSwgeDMuc2l6ZSgpKTsKLSAgb3V0ICs9IHgzLnNpemUoKTsKLQotICBtZW1jcHkob3V0LCB4NC5kYXRhKCksIHg0LnNpemUoKSk7Ci0gIHJldHVybiBvdXQgKyB4NC5zaXplKCk7Ci19Ci0KLXN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdC5yZXNpemUoYS5zaXplKCkgKyBiLnNpemUoKSk7Ci0gIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKLSAgY2hhciAqb3V0ID0gQXBwZW5kMihiZWdpbiwgYSwgYik7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkpOwotICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7Ci0gIGNoYXIgKm91dCA9IEFwcGVuZDIoYmVnaW4sIGEsIGIpOwotICBvdXQgPSBBcHBlbmQxKG91dCwgYyk7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMsCi0gICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdC5yZXNpemUoYS5zaXplKCkgKyBiLnNpemUoKSArIGMuc2l6ZSgpICsgZC5zaXplKCkpOwotICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7Ci0gIGNoYXIgKm91dCA9IEFwcGVuZDQoYmVnaW4sIGEsIGIsIGMsIGQpOwotICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQuc2l6ZSgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIsIGNvbnN0IEFscGhhTnVtICZjLAotICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmZCwgY29uc3QgQWxwaGFOdW0gJmUpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSArIGUuc2l6ZSgpKTsKLSAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC5iZWdpbigpOwotICBjaGFyICpvdXQgPSBBcHBlbmQ0KGJlZ2luLCBhLCBiLCBjLCBkKTsKLSAgb3V0ID0gQXBwZW5kMShvdXQsIGUpOwotICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQuc2l6ZSgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIsIGNvbnN0IEFscGhhTnVtICZjLAotICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmZCwgY29uc3QgQWxwaGFOdW0gJmUsIGNvbnN0IEFscGhhTnVtICZmKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdC5yZXNpemUoYS5zaXplKCkgKyBiLnNpemUoKSArIGMuc2l6ZSgpICsgZC5zaXplKCkgKyBlLnNpemUoKSArCi0gICAgICAgICAgICAgICAgZi5zaXplKCkpOwotICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7Ci0gIGNoYXIgKm91dCA9IEFwcGVuZDQoYmVnaW4sIGEsIGIsIGMsIGQpOwotICBvdXQgPSBBcHBlbmQyKG91dCwgZSwgZik7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMsCi0gICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkLCBjb25zdCBBbHBoYU51bSAmZSwgY29uc3QgQWxwaGFOdW0gJmYsCi0gICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZnKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdC5yZXNpemUoYS5zaXplKCkgKyBiLnNpemUoKSArIGMuc2l6ZSgpICsgZC5zaXplKCkgKyBlLnNpemUoKSArCi0gICAgICAgICAgICAgICAgZi5zaXplKCkgKyBnLnNpemUoKSk7Ci0gIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKLSAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiwgYSwgYiwgYywgZCk7Ci0gIG91dCA9IEFwcGVuZDIob3V0LCBlLCBmKTsKLSAgb3V0ID0gQXBwZW5kMShvdXQsIGcpOwotICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQuc2l6ZSgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIsIGNvbnN0IEFscGhhTnVtICZjLAotICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmZCwgY29uc3QgQWxwaGFOdW0gJmUsIGNvbnN0IEFscGhhTnVtICZmLAotICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmZywgY29uc3QgQWxwaGFOdW0gJmgpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSArIGUuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICBmLnNpemUoKSArIGcuc2l6ZSgpICsgaC5zaXplKCkpOwotICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7Ci0gIGNoYXIgKm91dCA9IEFwcGVuZDQoYmVnaW4sIGEsIGIsIGMsIGQpOwotICBvdXQgPSBBcHBlbmQ0KG91dCwgZSwgZiwgZywgaCk7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMsCi0gICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkLCBjb25zdCBBbHBoYU51bSAmZSwgY29uc3QgQWxwaGFOdW0gJmYsCi0gICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZnLCBjb25zdCBBbHBoYU51bSAmaCwgY29uc3QgQWxwaGFOdW0gJmkpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSArIGUuc2l6ZSgpICsKLSAgICAgICAgICAgICAgICBmLnNpemUoKSArIGcuc2l6ZSgpICsgaC5zaXplKCkgKyBpLnNpemUoKSk7Ci0gIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKLSAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiwgYSwgYiwgYywgZCk7Ci0gIG91dCA9IEFwcGVuZDQob3V0LCBlLCBmLCBnLCBoKTsKLSAgb3V0ID0gQXBwZW5kMShvdXQsIGkpOwotICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQuc2l6ZSgpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gSXQncyBwb3NzaWJsZSB0byBjYWxsIFN0ckFwcGVuZCB3aXRoIGEgY2hhciAqIHBvaW50ZXIgdGhhdCBpcyBwYXJ0d2F5IGludG8KLS8vIHRoZSBzdHJpbmcgd2UncmUgYXBwZW5kaW5nIHRvLiAgSG93ZXZlciB0aGUgcmVzdWx0cyBvZiB0aGlzIGFyZSByYW5kb20uCi0vLyBUaGVyZWZvcmUsIGNoZWNrIGZvciB0aGlzIGluIGRlYnVnIG1vZGUuICBVc2UgdW5zaWduZWQgbWF0aCBzbyB3ZSBvbmx5IGhhdmUKLS8vIHRvIGRvIG9uZSBjb21wYXJpc29uLgotI2RlZmluZSBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoZGVzdCwgc3JjKSBcCi0gICAgR09PR0xFX0RDSEVDS19HVCh1aW50cHRyX3QoKHNyYykuZGF0YSgpIC0gKGRlc3QpLmRhdGEoKSksIFwKLSAgICAgICAgICAgICAgICAgICAgIHVpbnRwdHJfdCgoZGVzdCkuc2l6ZSgpKSkKLQotdm9pZCBTdHJBcHBlbmQoc3RyaW5nICpyZXN1bHQsIGNvbnN0IEFscGhhTnVtICZhKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBhKTsKLSAgcmVzdWx0LT5hcHBlbmQoYS5kYXRhKCksIGEuc2l6ZSgpKTsKLX0KLQotdm9pZCBTdHJBcHBlbmQoc3RyaW5nICpyZXN1bHQsIGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYikgewotICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYSk7Ci0gIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBiKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgb2xkX3NpemUgPSByZXN1bHQtPnNpemUoKTsKLSAgcmVzdWx0LT5yZXNpemUob2xkX3NpemUgKyBhLnNpemUoKSArIGIuc2l6ZSgpKTsKLSAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC0+YmVnaW4oKTsKLSAgY2hhciAqb3V0ID0gQXBwZW5kMihiZWdpbiArIG9sZF9zaXplLCBhLCBiKTsKLSAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LT5zaXplKCkpOwotfQotCi12b2lkIFN0ckFwcGVuZChzdHJpbmcgKnJlc3VsdCwKLSAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMpIHsKLSAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGEpOwotICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYik7Ci0gIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBjKTsKLSAgc3RyaW5nOjpzaXplX3R5cGUgb2xkX3NpemUgPSByZXN1bHQtPnNpemUoKTsKLSAgcmVzdWx0LT5yZXNpemUob2xkX3NpemUgKyBhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkpOwotICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LT5iZWdpbigpOwotICBjaGFyICpvdXQgPSBBcHBlbmQyKGJlZ2luICsgb2xkX3NpemUsIGEsIGIpOwotICBvdXQgPSBBcHBlbmQxKG91dCwgYyk7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC0+c2l6ZSgpKTsKLX0KLQotdm9pZCBTdHJBcHBlbmQoc3RyaW5nICpyZXN1bHQsCi0gICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmYSwgY29uc3QgQWxwaGFOdW0gJmIsCi0gICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmYywgY29uc3QgQWxwaGFOdW0gJmQpIHsKLSAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGEpOwotICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYik7Ci0gIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBjKTsKLSAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGQpOwotICBzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHJlc3VsdC0+c2l6ZSgpOwotICByZXN1bHQtPnJlc2l6ZShvbGRfc2l6ZSArIGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpKTsKLSAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC0+YmVnaW4oKTsKLSAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiArIG9sZF9zaXplLCBhLCBiLCBjLCBkKTsKLSAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LT5zaXplKCkpOwotfQotCi1pbnQgR2xvYmFsUmVwbGFjZVN1YnN0cmluZyhjb25zdCBzdHJpbmcmIHN1YnN0cmluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcmVwbGFjZW1lbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHMpIHsKLSAgR09PR0xFX0NIRUNLKHMgIT0gTlVMTCk7Ci0gIGlmIChzLT5lbXB0eSgpIHx8IHN1YnN0cmluZy5lbXB0eSgpKQotICAgIHJldHVybiAwOwotICBzdHJpbmcgdG1wOwotICBpbnQgbnVtX3JlcGxhY2VtZW50cyA9IDA7Ci0gIGludCBwb3MgPSAwOwotICBmb3IgKGludCBtYXRjaF9wb3MgPSBzLT5maW5kKHN1YnN0cmluZy5kYXRhKCksIHBvcywgc3Vic3RyaW5nLmxlbmd0aCgpKTsKLSAgICAgICBtYXRjaF9wb3MgIT0gc3RyaW5nOjpucG9zOwotICAgICAgIHBvcyA9IG1hdGNoX3BvcyArIHN1YnN0cmluZy5sZW5ndGgoKSwKLSAgICAgICAgICAgbWF0Y2hfcG9zID0gcy0+ZmluZChzdWJzdHJpbmcuZGF0YSgpLCBwb3MsIHN1YnN0cmluZy5sZW5ndGgoKSkpIHsKLSAgICArK251bV9yZXBsYWNlbWVudHM7Ci0gICAgLy8gQXBwZW5kIHRoZSBvcmlnaW5hbCBjb250ZW50IGJlZm9yZSB0aGUgbWF0Y2guCi0gICAgdG1wLmFwcGVuZCgqcywgcG9zLCBtYXRjaF9wb3MgLSBwb3MpOwotICAgIC8vIEFwcGVuZCB0aGUgcmVwbGFjZW1lbnQgZm9yIHRoZSBtYXRjaC4KLSAgICB0bXAuYXBwZW5kKHJlcGxhY2VtZW50LmJlZ2luKCksIHJlcGxhY2VtZW50LmVuZCgpKTsKLSAgfQotICAvLyBBcHBlbmQgdGhlIGNvbnRlbnQgYWZ0ZXIgdGhlIGxhc3QgbWF0Y2guIElmIG5vIHJlcGxhY2VtZW50cyB3ZXJlIG1hZGUsIHRoZQotICAvLyBvcmlnaW5hbCBzdHJpbmcgaXMgbGVmdCB1bnRvdWNoZWQuCi0gIGlmIChudW1fcmVwbGFjZW1lbnRzID4gMCkgewotICAgIHRtcC5hcHBlbmQoKnMsIHBvcywgcy0+bGVuZ3RoKCkgLSBwb3MpOwotICAgIHMtPnN3YXAodG1wKTsKLSAgfQotICByZXR1cm4gbnVtX3JlcGxhY2VtZW50czsKLX0KLQotaW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbiwgYm9vbCBkb19wYWRkaW5nKSB7Ci0gIC8vIEJhc2U2NCBlbmNvZGVzIHRocmVlIGJ5dGVzIG9mIGlucHV0IGF0IGEgdGltZS4gSWYgdGhlIGlucHV0IGlzIG5vdAotICAvLyBkaXZpc2libGUgYnkgdGhyZWUsIHdlIHBhZCBhcyBhcHByb3ByaWF0ZS4KLSAgLy8KLSAgLy8gKGZyb20gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzU0OCkKLSAgLy8gU3BlY2lhbCBwcm9jZXNzaW5nIGlzIHBlcmZvcm1lZCBpZiBmZXdlciB0aGFuIDI0IGJpdHMgYXJlIGF2YWlsYWJsZQotICAvLyBhdCB0aGUgZW5kIG9mIHRoZSBkYXRhIGJlaW5nIGVuY29kZWQuICBBIGZ1bGwgZW5jb2RpbmcgcXVhbnR1bSBpcwotICAvLyBhbHdheXMgY29tcGxldGVkIGF0IHRoZSBlbmQgb2YgYSBxdWFudGl0eS4gIFdoZW4gZmV3ZXIgdGhhbiAyNCBpbnB1dAotICAvLyBiaXRzIGFyZSBhdmFpbGFibGUgaW4gYW4gaW5wdXQgZ3JvdXAsIHplcm8gYml0cyBhcmUgYWRkZWQgKG9uIHRoZQotICAvLyByaWdodCkgdG8gZm9ybSBhbiBpbnRlZ3JhbCBudW1iZXIgb2YgNi1iaXQgZ3JvdXBzLiAgUGFkZGluZyBhdCB0aGUKLSAgLy8gZW5kIG9mIHRoZSBkYXRhIGlzIHBlcmZvcm1lZCB1c2luZyB0aGUgJz0nIGNoYXJhY3Rlci4gIFNpbmNlIGFsbCBiYXNlCi0gIC8vIDY0IGlucHV0IGlzIGFuIGludGVncmFsIG51bWJlciBvZiBvY3RldHMsIG9ubHkgdGhlIGZvbGxvd2luZyBjYXNlcwotICAvLyBjYW4gYXJpc2U6Ci0KLQotICAvLyBCYXNlNjQgZW5jb2RlcyBlYWNoIHRocmVlIGJ5dGVzIG9mIGlucHV0IGludG8gZm91ciBieXRlcyBvZiBvdXRwdXQuCi0gIGludCBsZW4gPSAoaW5wdXRfbGVuIC8gMykgKiA0OwotCi0gIGlmIChpbnB1dF9sZW4gJSAzID09IDApIHsKLSAgICAvLyAoZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4KQotICAgIC8vICgxKSB0aGUgZmluYWwgcXVhbnR1bSBvZiBlbmNvZGluZyBpbnB1dCBpcyBhbiBpbnRlZ3JhbCBtdWx0aXBsZSBvZiAyNAotICAgIC8vIGJpdHM7IGhlcmUsIHRoZSBmaW5hbCB1bml0IG9mIGVuY29kZWQgb3V0cHV0IHdpbGwgYmUgYW4gaW50ZWdyYWwKLSAgICAvLyBtdWx0aXBsZSBvZiA0IGNoYXJhY3RlcnMgd2l0aCBubyAiPSIgcGFkZGluZywKLSAgfSBlbHNlIGlmIChpbnB1dF9sZW4gJSAzID09IDEpIHsKLSAgICAvLyAoZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4KQotICAgIC8vICgyKSB0aGUgZmluYWwgcXVhbnR1bSBvZiBlbmNvZGluZyBpbnB1dCBpcyBleGFjdGx5IDggYml0czsgaGVyZSwgdGhlCi0gICAgLy8gZmluYWwgdW5pdCBvZiBlbmNvZGVkIG91dHB1dCB3aWxsIGJlIHR3byBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IHR3bwotICAgIC8vICI9IiBwYWRkaW5nIGNoYXJhY3RlcnMsIG9yCi0gICAgbGVuICs9IDI7Ci0gICAgaWYgKGRvX3BhZGRpbmcpIHsKLSAgICAgIGxlbiArPSAyOwotICAgIH0KLSAgfSBlbHNlIHsgIC8vIChpbnB1dF9sZW4gJSAzID09IDIpCi0gICAgLy8gKGZyb20gaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzU0OCkKLSAgICAvLyAoMykgdGhlIGZpbmFsIHF1YW50dW0gb2YgZW5jb2RpbmcgaW5wdXQgaXMgZXhhY3RseSAxNiBiaXRzOyBoZXJlLCB0aGUKLSAgICAvLyBmaW5hbCB1bml0IG9mIGVuY29kZWQgb3V0cHV0IHdpbGwgYmUgdGhyZWUgY2hhcmFjdGVycyBmb2xsb3dlZCBieSBvbmUKLSAgICAvLyAiPSIgcGFkZGluZyBjaGFyYWN0ZXIuCi0gICAgbGVuICs9IDM7Ci0gICAgaWYgKGRvX3BhZGRpbmcpIHsKLSAgICAgIGxlbiArPSAxOwotICAgIH0KLSAgfQotCi0gIGFzc2VydChsZW4gPj0gaW5wdXRfbGVuKTsgIC8vIG1ha2Ugc3VyZSB3ZSBkaWRuJ3Qgb3ZlcmZsb3cKLSAgcmV0dXJuIGxlbjsKLX0KLQotLy8gQmFzZTY0RXNjYXBlIGRvZXMgcGFkZGluZywgc28gdGhpcyBjYWxjdWxhdGlvbiBpbmNsdWRlcyBwYWRkaW5nLgotaW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbikgewotICByZXR1cm4gQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihpbnB1dF9sZW4sIHRydWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBpbnQgQmFzZTY0VW5lc2NhcGUoKSAtIGJhc2U2NCBkZWNvZGVyCi0vLyBpbnQgQmFzZTY0RXNjYXBlKCkgLSBiYXNlNjQgZW5jb2RlcgotLy8gaW50IFdlYlNhZmVCYXNlNjRVbmVzY2FwZSgpIC0gR29vZ2xlJ3MgdmFyaWF0aW9uIG9mIGJhc2U2NCBkZWNvZGVyCi0vLyBpbnQgV2ViU2FmZUJhc2U2NEVzY2FwZSgpIC0gR29vZ2xlJ3MgdmFyaWF0aW9uIG9mIGJhc2U2NCBlbmNvZGVyCi0vLwotLy8gQ2hlY2sgb3V0Ci0vLyBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMyMDQ1IGZvciBmb3JtYWwgZGVzY3JpcHRpb24sIGJ1dCB3aGF0IHdlCi0vLyBjYXJlIGFib3V0IGlzIHRoYXQuLi4KLS8vICAgVGFrZSB0aGUgZW5jb2RlZCBzdHVmZiBpbiBncm91cHMgb2YgNCBjaGFyYWN0ZXJzIGFuZCB0dXJuIGVhY2gKLS8vICAgY2hhcmFjdGVyIGludG8gYSBjb2RlIDAgdG8gNjMgdGh1czoKLS8vICAgICAgICAgICBBLVogbWFwIHRvIDAgdG8gMjUKLS8vICAgICAgICAgICBhLXogbWFwIHRvIDI2IHRvIDUxCi0vLyAgICAgICAgICAgMC05IG1hcCB0byA1MiB0byA2MQotLy8gICAgICAgICAgICsoLSBmb3IgV2ViU2FmZSkgbWFwcyB0byA2MgotLy8gICAgICAgICAgIC8oXyBmb3IgV2ViU2FmZSkgbWFwcyB0byA2MwotLy8gICBUaGVyZSB3aWxsIGJlIGZvdXIgbnVtYmVycywgYWxsIGxlc3MgdGhhbiA2NCB3aGljaCBjYW4gYmUgcmVwcmVzZW50ZWQKLS8vICAgYnkgYSA2IGRpZ2l0IGJpbmFyeSBudW1iZXIgKGFhYWFhYSwgYmJiYmJiLCBjY2NjY2MsIGRkZGRkZCByZXNwZWN0aXZlbHkpLgotLy8gICBBcnJhbmdlIHRoZSA2IGRpZ2l0IGJpbmFyeSBudW1iZXJzIGludG8gdGhyZWUgYnl0ZXMgYXMgc3VjaDoKLS8vICAgYWFhYWFhYmIgYmJiYmNjY2MgY2NkZGRkZGQKLS8vICAgRXF1YWxzIHNpZ25zIChvbmUgb3IgdHdvKSBhcmUgdXNlZCBhdCB0aGUgZW5kIG9mIHRoZSBlbmNvZGVkIGJsb2NrIHRvCi0vLyAgIGluZGljYXRlIHRoYXQgdGhlIHRleHQgd2FzIG5vdCBhbiBpbnRlZ2VyIG11bHRpcGxlIG9mIHRocmVlIGJ5dGVzIGxvbmcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWludCBCYXNlNjRVbmVzY2FwZUludGVybmFsKGNvbnN0IGNoYXIgKnNyY19wYXJhbSwgaW50IHN6c3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVzdCwgaW50IHN6ZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpZ25lZCBjaGFyKiB1bmJhc2U2NCkgewotICBzdGF0aWMgY29uc3QgY2hhciBrUGFkNjRFcXVhbHMgPSAnPSc7Ci0gIHN0YXRpYyBjb25zdCBjaGFyIGtQYWQ2NERvdCA9ICcuJzsKLQotICBpbnQgZGVjb2RlID0gMDsKLSAgaW50IGRlc3RpZHggPSAwOwotICBpbnQgc3RhdGUgPSAwOwotICB1bnNpZ25lZCBpbnQgY2ggPSAwOwotICB1bnNpZ25lZCBpbnQgdGVtcCA9IDA7Ci0KLSAgLy8gSWYgImNoYXIiIGlzIHNpZ25lZCBieSBkZWZhdWx0LCB1c2luZyAqc3JjIGFzIGFuIGFycmF5IGluZGV4IHJlc3VsdHMgaW4KLSAgLy8gYWNjZXNzaW5nIG5lZ2F0aXZlIGFycmF5IGVsZW1lbnRzLiBUcmVhdCB0aGUgaW5wdXQgYXMgYSBwb2ludGVyIHRvCi0gIC8vIHVuc2lnbmVkIGNoYXIgdG8gYXZvaWQgdGhpcy4KLSAgY29uc3QgdW5zaWduZWQgY2hhciAqc3JjID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oc3JjX3BhcmFtKTsKLQotICAvLyBUaGUgR0VUX0lOUFVUIG1hY3JvIGdldHMgdGhlIG5leHQgaW5wdXQgY2hhcmFjdGVyLCBza2lwcGluZwotICAvLyBvdmVyIGFueSB3aGl0ZXNwYWNlLCBhbmQgc3RvcHBpbmcgd2hlbiB3ZSByZWFjaCB0aGUgZW5kIG9mIHRoZQotICAvLyBzdHJpbmcgb3Igd2hlbiB3ZSByZWFkIGFueSBub24tZGF0YSBjaGFyYWN0ZXIuICBUaGUgYXJndW1lbnRzIGFyZQotICAvLyBhbiBhcmJpdHJhcnkgaWRlbnRpZmllciAodXNlZCBhcyBhIGxhYmVsIGZvciBnb3RvKSBhbmQgdGhlIG51bWJlcgotICAvLyBvZiBkYXRhIGJ5dGVzIHRoYXQgbXVzdCByZW1haW4gaW4gdGhlIGlucHV0IHRvIGF2b2lkIGFib3J0aW5nIHRoZQotICAvLyBsb29wLgotI2RlZmluZSBHRVRfSU5QVVQobGFiZWwsIHJlbWFpbikgICAgICAgICAgICAgICAgIFwKLSAgbGFiZWw6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgLS1zenNyYzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNoID0gKnNyYysrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBkZWNvZGUgPSB1bmJhc2U2NFtjaF07ICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKGRlY29kZSA8IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgaWYgKGFzY2lpX2lzc3BhY2UoY2gpICYmIHN6c3JjID49IHJlbWFpbikgIFwKLSAgICAgICAgZ290byBsYWJlbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBzdGF0ZSA9IDQgLSByZW1haW47ICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgYnJlYWs7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSAgLy8gaWYgZGVzdCBpcyBudWxsLCB3ZSdyZSBqdXN0IGNoZWNraW5nIHRvIHNlZSBpZiBpdCdzIGxlZ2FsIGlucHV0Ci0gIC8vIHJhdGhlciB0aGFuIHByb2R1Y2luZyBvdXRwdXQuICAoSSBzdXNwZWN0IHRoaXMgY291bGQganVzdCBiZSBkb25lCi0gIC8vIHdpdGggYSByZWdleHAuLi4pLiAgV2UgZHVwbGljYXRlIHRoZSBsb29wIHNvIHRoaXMgdGVzdCBjYW4gYmUKLSAgLy8gb3V0c2lkZSBpdCBpbnN0ZWFkIG9mIGluIGV2ZXJ5IGl0ZXJhdGlvbi4KLQotICBpZiAoZGVzdCkgewotICAgIC8vIFRoaXMgbG9vcCBjb25zdW1lcyA0IGlucHV0IGJ5dGVzIGFuZCBwcm9kdWNlcyAzIG91dHB1dCBieXRlcwotICAgIC8vIHBlciBpdGVyYXRpb24uICBXZSBjYW4ndCBrbm93IGF0IHRoZSBzdGFydCB0aGF0IHRoZXJlIGlzIGVub3VnaAotICAgIC8vIGRhdGEgbGVmdCBpbiB0aGUgc3RyaW5nIGZvciBhIGZ1bGwgaXRlcmF0aW9uLCBzbyB0aGUgbG9vcCBtYXkKLSAgICAvLyBicmVhayBvdXQgaW4gdGhlIG1pZGRsZTsgaWYgc28gJ3N0YXRlJyB3aWxsIGJlIHNldCB0byB0aGUKLSAgICAvLyBudW1iZXIgb2YgaW5wdXQgYnl0ZXMgcmVhZC4KLQotICAgIHdoaWxlIChzenNyYyA+PSA0KSAgewotICAgICAgLy8gV2UnbGwgc3RhcnQgYnkgb3B0aW1pc3RpY2FsbHkgYXNzdW1pbmcgdGhhdCB0aGUgbmV4dCBmb3VyCi0gICAgICAvLyBieXRlcyBvZiB0aGUgc3RyaW5nIChzcmNbMC4uM10pIGFyZSBmb3VyIGdvb2QgZGF0YSBieXRlcwotICAgICAgLy8gKHRoYXQgaXMsIG5vIG51bGxzLCB3aGl0ZXNwYWNlLCBwYWRkaW5nIGNoYXJzLCBvciBpbGxlZ2FsCi0gICAgICAvLyBjaGFycykuICBXZSBuZWVkIHRvIHRlc3Qgc3JjWzAuLjJdIGZvciBudWxscyBpbmRpdmlkdWFsbHkKLSAgICAgIC8vIGJlZm9yZSBjb25zdHJ1Y3RpbmcgdGVtcCB0byBwcmVzZXJ2ZSB0aGUgcHJvcGVydHkgdGhhdCB3ZQotICAgICAgLy8gbmV2ZXIgcmVhZCBwYXN0IGEgbnVsbCBpbiB0aGUgc3RyaW5nIChubyBtYXR0ZXIgaG93IGxvbmcKLSAgICAgIC8vIHN6c3JjIGNsYWltcyB0aGUgc3RyaW5nIGlzKS4KLQotICAgICAgaWYgKCFzcmNbMF0gfHwgIXNyY1sxXSB8fCAhc3JjWzJdIHx8Ci0gICAgICAgICAgKHRlbXAgPSAoKHVuc2lnbmVkKHVuYmFzZTY0W3NyY1swXV0pIDw8IDE4KSB8Ci0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKHVuYmFzZTY0W3NyY1sxXV0pIDw8IDEyKSB8Ci0gICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKHVuYmFzZTY0W3NyY1syXV0pIDw8IDYpIHwKLSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzNdXSkpKSkgJiAweDgwMDAwMDAwKSB7Ci0gICAgICAgIC8vIElmZiBhbnkgb2YgdGhvc2UgZm91ciBjaGFyYWN0ZXJzIHdhcyBiYWQgKG51bGwsIGlsbGVnYWwsCi0gICAgICAgIC8vIHdoaXRlc3BhY2UsIHBhZGRpbmcpLCB0aGVuIHRlbXAncyBoaWdoIGJpdCB3aWxsIGJlIHNldAotICAgICAgICAvLyAoYmVjYXVzZSB1bmJhc2U2NFtdIGlzIC0xIGZvciBhbGwgYmFkIGNoYXJhY3RlcnMpLgotICAgICAgICAvLwotICAgICAgICAvLyBXZSdsbCBiYWNrIHVwIGFuZCByZXNvcnQgdG8gdGhlIHNsb3dlciBkZWNvZGVyLCB3aGljaCBrbm93cwotICAgICAgICAvLyBob3cgdG8gaGFuZGxlIHRob3NlIGNhc2VzLgotCi0gICAgICAgIEdFVF9JTlBVVChmaXJzdCwgNCk7Ci0gICAgICAgIHRlbXAgPSBkZWNvZGU7Ci0gICAgICAgIEdFVF9JTlBVVChzZWNvbmQsIDMpOwotICAgICAgICB0ZW1wID0gKHRlbXAgPDwgNikgfCBkZWNvZGU7Ci0gICAgICAgIEdFVF9JTlBVVCh0aGlyZCwgMik7Ci0gICAgICAgIHRlbXAgPSAodGVtcCA8PCA2KSB8IGRlY29kZTsKLSAgICAgICAgR0VUX0lOUFVUKGZvdXJ0aCwgMSk7Ci0gICAgICAgIHRlbXAgPSAodGVtcCA8PCA2KSB8IGRlY29kZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdlIHJlYWxseSBkaWQgaGF2ZSBmb3VyIGdvb2QgZGF0YSBieXRlcywgc28gYWR2YW5jZSBmb3VyCi0gICAgICAgIC8vIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZy4KLQotICAgICAgICBzenNyYyAtPSA0OwotICAgICAgICBzcmMgKz0gNDsKLSAgICAgICAgZGVjb2RlID0gLTE7Ci0gICAgICAgIGNoID0gJ1wwJzsKLSAgICAgIH0KLQotICAgICAgLy8gdGVtcCBoYXMgMjQgYml0cyBvZiBpbnB1dCwgc28gd3JpdGUgdGhhdCBvdXQgYXMgdGhyZWUgYnl0ZXMuCi0KLSAgICAgIGlmIChkZXN0aWR4KzMgPiBzemRlc3QpIHJldHVybiAtMTsKLSAgICAgIGRlc3RbZGVzdGlkeCsyXSA9IHRlbXA7Ci0gICAgICB0ZW1wID4+PSA4OwotICAgICAgZGVzdFtkZXN0aWR4KzFdID0gdGVtcDsKLSAgICAgIHRlbXAgPj49IDg7Ci0gICAgICBkZXN0W2Rlc3RpZHhdID0gdGVtcDsKLSAgICAgIGRlc3RpZHggKz0gMzsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgd2hpbGUgKHN6c3JjID49IDQpICB7Ci0gICAgICBpZiAoIXNyY1swXSB8fCAhc3JjWzFdIHx8ICFzcmNbMl0gfHwKLSAgICAgICAgICAodGVtcCA9ICgodW5zaWduZWQodW5iYXNlNjRbc3JjWzBdXSkgPDwgMTgpIHwKLSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzFdXSkgPDwgMTIpIHwKLSAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzJdXSkgPDwgNikgfAotICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCh1bmJhc2U2NFtzcmNbM11dKSkpKSAmIDB4ODAwMDAwMDApIHsKLSAgICAgICAgR0VUX0lOUFVUKGZpcnN0X25vX2Rlc3QsIDQpOwotICAgICAgICBHRVRfSU5QVVQoc2Vjb25kX25vX2Rlc3QsIDMpOwotICAgICAgICBHRVRfSU5QVVQodGhpcmRfbm9fZGVzdCwgMik7Ci0gICAgICAgIEdFVF9JTlBVVChmb3VydGhfbm9fZGVzdCwgMSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzenNyYyAtPSA0OwotICAgICAgICBzcmMgKz0gNDsKLSAgICAgICAgZGVjb2RlID0gLTE7Ci0gICAgICAgIGNoID0gJ1wwJzsKLSAgICAgIH0KLSAgICAgIGRlc3RpZHggKz0gMzsKLSAgICB9Ci0gIH0KLQotI3VuZGVmIEdFVF9JTlBVVAotCi0gIC8vIGlmIHRoZSBsb29wIHRlcm1pbmF0ZWQgYmVjYXVzZSB3ZSByZWFkIGEgYmFkIGNoYXJhY3RlciwgcmV0dXJuCi0gIC8vIG5vdy4KLSAgaWYgKGRlY29kZSA8IDAgJiYgY2ggIT0gJ1wwJyAmJgotICAgICAgY2ggIT0ga1BhZDY0RXF1YWxzICYmIGNoICE9IGtQYWQ2NERvdCAmJiAhYXNjaWlfaXNzcGFjZShjaCkpCi0gICAgcmV0dXJuIC0xOwotCi0gIGlmIChjaCA9PSBrUGFkNjRFcXVhbHMgfHwgY2ggPT0ga1BhZDY0RG90KSB7Ci0gICAgLy8gaWYgd2Ugc3RvcHBlZCBieSBoaXR0aW5nIGFuICc9JyBvciAnLicsIHVuLXJlYWQgdGhhdCBjaGFyYWN0ZXIgLS0gd2UnbGwKLSAgICAvLyBsb29rIGF0IGl0IGFnYWluIHdoZW4gd2UgY291bnQgdG8gY2hlY2sgZm9yIHRoZSBwcm9wZXIgbnVtYmVyIG9mCi0gICAgLy8gZXF1YWxzIHNpZ25zIGF0IHRoZSBlbmQuCi0gICAgKytzenNyYzsKLSAgICAtLXNyYzsKLSAgfSBlbHNlIHsKLSAgICAvLyBUaGlzIGxvb3AgY29uc3VtZXMgMSBpbnB1dCBieXRlIHBlciBpdGVyYXRpb24uICBJdCdzIHVzZWQgdG8KLSAgICAvLyBjbGVhbiB1cCB0aGUgMC0zIGlucHV0IGJ5dGVzIHJlbWFpbmluZyB3aGVuIHRoZSBmaXJzdCwgZmFzdGVyCi0gICAgLy8gbG9vcCBmaW5pc2hlcy4gICd0ZW1wJyBjb250YWlucyB0aGUgZGF0YSBmcm9tICdzdGF0ZScgaW5wdXQKLSAgICAvLyBjaGFyYWN0ZXJzIHJlYWQgYnkgdGhlIGZpcnN0IGxvb3AuCi0gICAgd2hpbGUgKHN6c3JjID4gMCkgIHsKLSAgICAgIC0tc3pzcmM7Ci0gICAgICBjaCA9ICpzcmMrKzsKLSAgICAgIGRlY29kZSA9IHVuYmFzZTY0W2NoXTsKLSAgICAgIGlmIChkZWNvZGUgPCAwKSB7Ci0gICAgICAgIGlmIChhc2NpaV9pc3NwYWNlKGNoKSkgewotICAgICAgICAgIGNvbnRpbnVlOwotICAgICAgICB9IGVsc2UgaWYgKGNoID09ICdcMCcpIHsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIGlmIChjaCA9PSBrUGFkNjRFcXVhbHMgfHwgY2ggPT0ga1BhZDY0RG90KSB7Ci0gICAgICAgICAgLy8gYmFjayB1cCBvbmUgY2hhcmFjdGVyOyB3ZSdsbCByZWFkIGl0IGFnYWluIHdoZW4gd2UgY2hlY2sKLSAgICAgICAgICAvLyBmb3IgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHBhZCBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQuCi0gICAgICAgICAgKytzenNyYzsKLSAgICAgICAgICAtLXNyYzsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgLy8gRWFjaCBpbnB1dCBjaGFyYWN0ZXIgZ2l2ZXMgdXMgc2l4IGJpdHMgb2Ygb3V0cHV0LgotICAgICAgdGVtcCA9ICh0ZW1wIDw8IDYpIHwgZGVjb2RlOwotICAgICAgKytzdGF0ZTsKLSAgICAgIGlmIChzdGF0ZSA9PSA0KSB7Ci0gICAgICAgIC8vIElmIHdlJ3ZlIGFjY3VtdWxhdGVkIDI0IGJpdHMgb2Ygb3V0cHV0LCB3cml0ZSB0aGF0IG91dCBhcwotICAgICAgICAvLyB0aHJlZSBieXRlcy4KLSAgICAgICAgaWYgKGRlc3QpIHsKLSAgICAgICAgICBpZiAoZGVzdGlkeCszID4gc3pkZXN0KSByZXR1cm4gLTE7Ci0gICAgICAgICAgZGVzdFtkZXN0aWR4KzJdID0gdGVtcDsKLSAgICAgICAgICB0ZW1wID4+PSA4OwotICAgICAgICAgIGRlc3RbZGVzdGlkeCsxXSA9IHRlbXA7Ci0gICAgICAgICAgdGVtcCA+Pj0gODsKLSAgICAgICAgICBkZXN0W2Rlc3RpZHhdID0gdGVtcDsKLSAgICAgICAgfQotICAgICAgICBkZXN0aWR4ICs9IDM7Ci0gICAgICAgIHN0YXRlID0gMDsKLSAgICAgICAgdGVtcCA9IDA7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gUHJvY2VzcyB0aGUgbGVmdG92ZXIgZGF0YSBjb250YWluZWQgaW4gJ3RlbXAnIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0LgotICBpbnQgZXhwZWN0ZWRfZXF1YWxzID0gMDsKLSAgc3dpdGNoIChzdGF0ZSkgewotICAgIGNhc2UgMDoKLSAgICAgIC8vIE5vdGhpbmcgbGVmdCBvdmVyOyBvdXRwdXQgaXMgYSBtdWx0aXBsZSBvZiAzIGJ5dGVzLgotICAgICAgYnJlYWs7Ci0KLSAgICBjYXNlIDE6Ci0gICAgICAvLyBCYWQgaW5wdXQ7IHdlIGhhdmUgNiBiaXRzIGxlZnQgb3Zlci4KLSAgICAgIHJldHVybiAtMTsKLQotICAgIGNhc2UgMjoKLSAgICAgIC8vIFByb2R1Y2Ugb25lIG1vcmUgb3V0cHV0IGJ5dGUgZnJvbSB0aGUgMTIgaW5wdXQgYml0cyB3ZSBoYXZlIGxlZnQuCi0gICAgICBpZiAoZGVzdCkgewotICAgICAgICBpZiAoZGVzdGlkeCsxID4gc3pkZXN0KSByZXR1cm4gLTE7Ci0gICAgICAgIHRlbXAgPj49IDQ7Ci0gICAgICAgIGRlc3RbZGVzdGlkeF0gPSB0ZW1wOwotICAgICAgfQotICAgICAgKytkZXN0aWR4OwotICAgICAgZXhwZWN0ZWRfZXF1YWxzID0gMjsKLSAgICAgIGJyZWFrOwotCi0gICAgY2FzZSAzOgotICAgICAgLy8gUHJvZHVjZSB0d28gbW9yZSBvdXRwdXQgYnl0ZXMgZnJvbSB0aGUgMTggaW5wdXQgYml0cyB3ZSBoYXZlIGxlZnQuCi0gICAgICBpZiAoZGVzdCkgewotICAgICAgICBpZiAoZGVzdGlkeCsyID4gc3pkZXN0KSByZXR1cm4gLTE7Ci0gICAgICAgIHRlbXAgPj49IDI7Ci0gICAgICAgIGRlc3RbZGVzdGlkeCsxXSA9IHRlbXA7Ci0gICAgICAgIHRlbXAgPj49IDg7Ci0gICAgICAgIGRlc3RbZGVzdGlkeF0gPSB0ZW1wOwotICAgICAgfQotICAgICAgZGVzdGlkeCArPSAyOwotICAgICAgZXhwZWN0ZWRfZXF1YWxzID0gMTsKLSAgICAgIGJyZWFrOwotCi0gICAgZGVmYXVsdDoKLSAgICAgIC8vIHN0YXRlIHNob3VsZCBoYXZlIG5vIG90aGVyIHZhbHVlcyBhdCB0aGlzIHBvaW50LgotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgY2FuJ3QgaGFwcGVuOyBiYXNlNjQgZGVjb2RlciBzdGF0ZSA9ICIgPDwgc3RhdGU7Ci0gIH0KLQotICAvLyBUaGUgcmVtYWluZGVyIG9mIHRoZSBzdHJpbmcgc2hvdWxkIGJlIGFsbCB3aGl0ZXNwYWNlLCBtaXhlZCB3aXRoCi0gIC8vIGV4YWN0bHkgMCBlcXVhbHMgc2lnbnMsIG9yIGV4YWN0bHkgJ2V4cGVjdGVkX2VxdWFscycgZXF1YWxzCi0gIC8vIHNpZ25zLiAgKEFsd2F5cyBhY2NlcHRpbmcgMCBlcXVhbHMgc2lnbnMgaXMgYSBnb29nbGUgZXh0ZW5zaW9uCi0gIC8vIG5vdCBjb3ZlcmVkIGluIHRoZSBSRkMsIGFzIGlzIGFjY2VwdGluZyBkb3QgYXMgdGhlIHBhZCBjaGFyYWN0ZXIuKQotCi0gIGludCBlcXVhbHMgPSAwOwotICB3aGlsZSAoc3pzcmMgPiAwICYmICpzcmMpIHsKLSAgICBpZiAoKnNyYyA9PSBrUGFkNjRFcXVhbHMgfHwgKnNyYyA9PSBrUGFkNjREb3QpCi0gICAgICArK2VxdWFsczsKLSAgICBlbHNlIGlmICghYXNjaWlfaXNzcGFjZSgqc3JjKSkKLSAgICAgIHJldHVybiAtMTsKLSAgICAtLXN6c3JjOwotICAgICsrc3JjOwotICB9Ci0KLSAgcmV0dXJuIChlcXVhbHMgPT0gMCB8fCBlcXVhbHMgPT0gZXhwZWN0ZWRfZXF1YWxzKSA/IGRlc3RpZHggOiAtMTsKLX0KLQotLy8gVGhlIGFycmF5cyBiZWxvdyB3ZXJlIGdlbmVyYXRlZCBieSB0aGUgZm9sbG93aW5nIGNvZGUKLS8vICNpbmNsdWRlIDxzeXMvdGltZS5oPgotLy8gI2luY2x1ZGUgPHN0ZGxpYi5oPgotLy8gI2luY2x1ZGUgPHN0cmluZy5oPgotLy8gbWFpbigpCi0vLyB7Ci0vLyAgIHN0YXRpYyBjb25zdCBjaGFyIEJhc2U2NFtdID0KLS8vICAgICAiQUJDREVGR0hJSktMTU5PUFFSU1RVVldYWVphYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3h5ejAxMjM0NTY3ODkrLyI7Ci0vLyAgIGNoYXIgKnBvczsKLS8vICAgaW50IGlkeCwgaSwgajsKLS8vICAgcHJpbnRmKCIgICAgIik7Ci0vLyAgIGZvciAoaSA9IDA7IGkgPCAyNTU7IGkgKz0gOCkgewotLy8gICAgIGZvciAoaiA9IGk7IGogPCBpICsgODsgaisrKSB7Ci0vLyAgICAgICBwb3MgPSBzdHJjaHIoQmFzZTY0LCBqKTsKLS8vICAgICAgIGlmICgocG9zID09IE5VTEwpIHx8IChqID09IDApKQotLy8gICAgICAgICBpZHggPSAtMTsKLS8vICAgICAgIGVsc2UKLS8vICAgICAgICAgaWR4ID0gcG9zIC0gQmFzZTY0OwotLy8gICAgICAgaWYgKGlkeCA9PSAtMSkKLS8vICAgICAgICAgcHJpbnRmKCIgJTJkLCAgICAgIiwgaWR4KTsKLS8vICAgICAgIGVsc2UKLS8vICAgICAgICAgcHJpbnRmKCIgJTJkLyolYyovLCIsIGlkeCwgaik7Ci0vLyAgICAgfQotLy8gICAgIHByaW50ZigiXG4gICAgIik7Ci0vLyAgIH0KLS8vIH0KLS8vCi0vLyB3aGVyZSB0aGUgdmFsdWUgb2YgIkJhc2U2NFtdIiB3YXMgcmVwbGFjZWQgYnkgb25lIG9mIHRoZSBiYXNlLTY0IGNvbnZlcnNpb24KLS8vIHRhYmxlcyBmcm9tIHRoZSBmdW5jdGlvbnMgYmVsb3cuCi1zdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIga1VuQmFzZTY0W10gPSB7Ci0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgNjIvKisqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgNjMvKi8gKi8sCi0gIDUyLyowKi8sIDUzLyoxKi8sIDU0LyoyKi8sIDU1LyozKi8sIDU2Lyo0Ki8sIDU3Lyo1Ki8sIDU4Lyo2Ki8sIDU5Lyo3Ki8sCi0gIDYwLyo4Ki8sIDYxLyo5Ki8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAgMC8qQSovLCAgMS8qQiovLCAgMi8qQyovLCAgMy8qRCovLCAgNC8qRSovLCAgNS8qRiovLCAgNi8qRyovLAotICAwNy8qSCovLCAgOC8qSSovLCAgOS8qSiovLCAxMC8qSyovLCAxMS8qTCovLCAxMi8qTSovLCAxMy8qTiovLCAxNC8qTyovLAotICAxNS8qUCovLCAxNi8qUSovLCAxNy8qUiovLCAxOC8qUyovLCAxOS8qVCovLCAyMC8qVSovLCAyMS8qViovLCAyMi8qVyovLAotICAyMy8qWCovLCAyNC8qWSovLCAyNS8qWiovLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgMjYvKmEqLywgMjcvKmIqLywgMjgvKmMqLywgMjkvKmQqLywgMzAvKmUqLywgMzEvKmYqLywgMzIvKmcqLywKLSAgMzMvKmgqLywgMzQvKmkqLywgMzUvKmoqLywgMzYvKmsqLywgMzcvKmwqLywgMzgvKm0qLywgMzkvKm4qLywgNDAvKm8qLywKLSAgNDEvKnAqLywgNDIvKnEqLywgNDMvKnIqLywgNDQvKnMqLywgNDUvKnQqLywgNDYvKnUqLywgNDcvKnYqLywgNDgvKncqLywKLSAgNDkvKngqLywgNTAvKnkqLywgNTEvKnoqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xCi19Owotc3RhdGljIGNvbnN0IHNpZ25lZCBjaGFyIGtVbldlYlNhZmVCYXNlNjRbXSA9IHsKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICA2Mi8qLSovLCAtMSwgICAgICAtMSwKLSAgNTIvKjAqLywgNTMvKjEqLywgNTQvKjIqLywgNTUvKjMqLywgNTYvKjQqLywgNTcvKjUqLywgNTgvKjYqLywgNTkvKjcqLywKLSAgNjAvKjgqLywgNjEvKjkqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgICAwLypBKi8sICAxLypCKi8sICAyLypDKi8sICAzLypEKi8sICA0LypFKi8sICA1LypGKi8sICA2LypHKi8sCi0gIDA3LypIKi8sICA4LypJKi8sICA5LypKKi8sIDEwLypLKi8sIDExLypMKi8sIDEyLypNKi8sIDEzLypOKi8sIDE0LypPKi8sCi0gIDE1LypQKi8sIDE2LypRKi8sIDE3LypSKi8sIDE4LypTKi8sIDE5LypUKi8sIDIwLypVKi8sIDIxLypWKi8sIDIyLypXKi8sCi0gIDIzLypYKi8sIDI0LypZKi8sIDI1LypaKi8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDYzLypfKi8sCi0gIC0xLCAgICAgIDI2LyphKi8sIDI3LypiKi8sIDI4LypjKi8sIDI5LypkKi8sIDMwLyplKi8sIDMxLypmKi8sIDMyLypnKi8sCi0gIDMzLypoKi8sIDM0LyppKi8sIDM1LypqKi8sIDM2LyprKi8sIDM3LypsKi8sIDM4LyptKi8sIDM5LypuKi8sIDQwLypvKi8sCi0gIDQxLypwKi8sIDQyLypxKi8sIDQzLypyKi8sIDQ0LypzKi8sIDQ1Lyp0Ki8sIDQ2Lyp1Ki8sIDQ3Lyp2Ki8sIDQ4Lyp3Ki8sCi0gIDQ5Lyp4Ki8sIDUwLyp5Ki8sIDUxLyp6Ki8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKLSAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCi0gIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAotICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMQotfTsKLQotaW50IFdlYlNhZmVCYXNlNjRVbmVzY2FwZShjb25zdCBjaGFyICpzcmMsIGludCBzenNyYywgY2hhciAqZGVzdCwgaW50IHN6ZGVzdCkgewotICByZXR1cm4gQmFzZTY0VW5lc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBzemRlc3QsIGtVbldlYlNhZmVCYXNlNjQpOwotfQotCi1zdGF0aWMgYm9vbCBCYXNlNjRVbmVzY2FwZUludGVybmFsKGNvbnN0IGNoYXIqIHNyYywgaW50IHNsZW4sIHN0cmluZyogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIqIHVuYmFzZTY0KSB7Ci0gIC8vIERldGVybWluZSB0aGUgc2l6ZSBvZiB0aGUgb3V0cHV0IHN0cmluZy4gIEJhc2U2NCBlbmNvZGVzIGV2ZXJ5IDMgYnl0ZXMgaW50bwotICAvLyA0IGNoYXJhY3RlcnMuICBhbnkgbGVmdG92ZXIgY2hhcnMgYXJlIGFkZGVkIGRpcmVjdGx5IGZvciBnb29kIG1lYXN1cmUuCi0gIC8vIFRoaXMgaXMgZG9jdW1lbnRlZCBpbiB0aGUgYmFzZTY0IFJGQzogaHR0cDovL3Rvb2xzLmlldGYub3JnL2h0bWwvcmZjMzU0OAotICBjb25zdCBpbnQgZGVzdF9sZW4gPSAzICogKHNsZW4gLyA0KSArIChzbGVuICUgNCk7Ci0KLSAgZGVzdC0+cmVzaXplKGRlc3RfbGVuKTsKLQotICAvLyBXZSBhcmUgZ2V0dGluZyB0aGUgZGVzdGluYXRpb24gYnVmZmVyIGJ5IGdldHRpbmcgdGhlIGJlZ2lubmluZyBvZiB0aGUKLSAgLy8gc3RyaW5nIGFuZCBjb252ZXJ0aW5nIGl0IGludG8gYSBjaGFyICouCi0gIGNvbnN0IGludCBsZW4gPSBCYXNlNjRVbmVzY2FwZUludGVybmFsKHNyYywgc2xlbiwgc3RyaW5nX2FzX2FycmF5KGRlc3QpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0X2xlbiwgdW5iYXNlNjQpOwotICBpZiAobGVuIDwgMCkgewotICAgIGRlc3QtPmNsZWFyKCk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gY291bGQgYmUgc2hvcnRlciBpZiB0aGVyZSB3YXMgcGFkZGluZwotICBHT09HTEVfRENIRUNLX0xFKGxlbiwgZGVzdF9sZW4pOwotICBkZXN0LT5lcmFzZShsZW4pOwotCi0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIEJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KSB7Ci0gIHJldHVybiBCYXNlNjRVbmVzY2FwZUludGVybmFsKHNyYy5kYXRhKCksIHNyYy5zaXplKCksIGRlc3QsIGtVbkJhc2U2NCk7Ci19Ci0KLWJvb2wgV2ViU2FmZUJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KSB7Ci0gIHJldHVybiBCYXNlNjRVbmVzY2FwZUludGVybmFsKHNyYy5kYXRhKCksIHNyYy5zaXplKCksIGRlc3QsIGtVbldlYlNhZmVCYXNlNjQpOwotfQotCi1pbnQgQmFzZTY0RXNjYXBlSW50ZXJuYWwoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3pzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqZGVzdCwgaW50IHN6ZGVzdCwgY29uc3QgY2hhciAqYmFzZTY0LAotICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9fcGFkZGluZykgewotICBzdGF0aWMgY29uc3QgY2hhciBrUGFkNjQgPSAnPSc7Ci0KLSAgaWYgKHN6c3JjIDw9IDApIHJldHVybiAwOwotCi0gIGlmIChzenNyYyAqIDQgPiBzemRlc3QgKiAzKSByZXR1cm4gMDsKLQotICBjaGFyICpjdXJfZGVzdCA9IGRlc3Q7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmN1cl9zcmMgPSBzcmM7Ci0KLSAgY2hhciAqbGltaXRfZGVzdCA9IGRlc3QgKyBzemRlc3Q7Ci0gIGNvbnN0IHVuc2lnbmVkIGNoYXIgKmxpbWl0X3NyYyA9IHNyYyArIHN6c3JjOwotCi0gIC8vIFRocmVlIGJ5dGVzIG9mIGRhdGEgZW5jb2RlcyB0byBmb3VyIGNoYXJhY3RlcnMgb2YgY3lwaGVydGV4dC4KLSAgLy8gU28gd2UgY2FuIHB1bXAgdGhyb3VnaCB0aHJlZS1ieXRlIGNodW5rcyBhdG9taWNhbGx5LgotICB3aGlsZSAoY3VyX3NyYyA8IGxpbWl0X3NyYyAtIDMpIHsgIC8vIGtlZXAgZ29pbmcgYXMgbG9uZyBhcyB3ZSBoYXZlID49IDMyIGJpdHMKLSAgICB1aW50MzIgaW4gPSBCaWdFbmRpYW46OkxvYWQzMihjdXJfc3JjKSA+PiA4OwotCi0gICAgY3VyX2Rlc3RbMF0gPSBiYXNlNjRbaW4gPj4gMThdOwotICAgIGluICY9IDB4M0ZGRkY7Ci0gICAgY3VyX2Rlc3RbMV0gPSBiYXNlNjRbaW4gPj4gMTJdOwotICAgIGluICY9IDB4RkZGOwotICAgIGN1cl9kZXN0WzJdID0gYmFzZTY0W2luID4+IDZdOwotICAgIGluICY9IDB4M0Y7Ci0gICAgY3VyX2Rlc3RbM10gPSBiYXNlNjRbaW5dOwotCi0gICAgY3VyX2Rlc3QgKz0gNDsKLSAgICBjdXJfc3JjICs9IDM7Ci0gIH0KLSAgLy8gVG8gc2F2ZSB0aW1lLCB3ZSBkaWRuJ3QgdXBkYXRlIHN6ZGVzdCBvciBzenNyYyBpbiB0aGUgbG9vcC4gIFNvIGRvIGl0IG5vdy4KLSAgc3pkZXN0ID0gbGltaXRfZGVzdCAtIGN1cl9kZXN0OwotICBzenNyYyA9IGxpbWl0X3NyYyAtIGN1cl9zcmM7Ci0KLSAgLyogbm93IGRlYWwgd2l0aCB0aGUgdGFpbCAoPD0zIGJ5dGVzKSAqLwotICBzd2l0Y2ggKHN6c3JjKSB7Ci0gICAgY2FzZSAwOgotICAgICAgLy8gTm90aGluZyBsZWZ0OyBub3RoaW5nIG1vcmUgdG8gZG8uCi0gICAgICBicmVhazsKLSAgICBjYXNlIDE6IHsKLSAgICAgIC8vIE9uZSBieXRlIGxlZnQ6IHRoaXMgZW5jb2RlcyB0byB0d28gY2hhcmFjdGVycywgYW5kIChvcHRpb25hbGx5KQotICAgICAgLy8gdHdvIHBhZCBjaGFyYWN0ZXJzIHRvIHJvdW5kIG91dCB0aGUgZm91ci1jaGFyYWN0ZXIgY3lwaGVyYmxvY2suCi0gICAgICBpZiAoKHN6ZGVzdCAtPSAyKSA8IDApIHJldHVybiAwOwotICAgICAgdWludDMyIGluID0gY3VyX3NyY1swXTsKLSAgICAgIGN1cl9kZXN0WzBdID0gYmFzZTY0W2luID4+IDJdOwotICAgICAgaW4gJj0gMHgzOwotICAgICAgY3VyX2Rlc3RbMV0gPSBiYXNlNjRbaW4gPDwgNF07Ci0gICAgICBjdXJfZGVzdCArPSAyOwotICAgICAgaWYgKGRvX3BhZGRpbmcpIHsKLSAgICAgICAgaWYgKChzemRlc3QgLT0gMikgPCAwKSByZXR1cm4gMDsKLSAgICAgICAgY3VyX2Rlc3RbMF0gPSBrUGFkNjQ7Ci0gICAgICAgIGN1cl9kZXN0WzFdID0ga1BhZDY0OwotICAgICAgICBjdXJfZGVzdCArPSAyOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgMjogewotICAgICAgLy8gVHdvIGJ5dGVzIGxlZnQ6IHRoaXMgZW5jb2RlcyB0byB0aHJlZSBjaGFyYWN0ZXJzLCBhbmQgKG9wdGlvbmFsbHkpCi0gICAgICAvLyBvbmUgcGFkIGNoYXJhY3RlciB0byByb3VuZCBvdXQgdGhlIGZvdXItY2hhcmFjdGVyIGN5cGhlcmJsb2NrLgotICAgICAgaWYgKChzemRlc3QgLT0gMykgPCAwKSByZXR1cm4gMDsKLSAgICAgIHVpbnQzMiBpbiA9IEJpZ0VuZGlhbjo6TG9hZDE2KGN1cl9zcmMpOwotICAgICAgY3VyX2Rlc3RbMF0gPSBiYXNlNjRbaW4gPj4gMTBdOwotICAgICAgaW4gJj0gMHgzRkY7Ci0gICAgICBjdXJfZGVzdFsxXSA9IGJhc2U2NFtpbiA+PiA0XTsKLSAgICAgIGluICY9IDB4MDBGOwotICAgICAgY3VyX2Rlc3RbMl0gPSBiYXNlNjRbaW4gPDwgMl07Ci0gICAgICBjdXJfZGVzdCArPSAzOwotICAgICAgaWYgKGRvX3BhZGRpbmcpIHsKLSAgICAgICAgaWYgKChzemRlc3QgLT0gMSkgPCAwKSByZXR1cm4gMDsKLSAgICAgICAgY3VyX2Rlc3RbMF0gPSBrUGFkNjQ7Ci0gICAgICAgIGN1cl9kZXN0ICs9IDE7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSAzOiB7Ci0gICAgICAvLyBUaHJlZSBieXRlcyBsZWZ0OiBzYW1lIGFzIGluIHRoZSBiaWcgbG9vcCBhYm92ZS4gIFdlIGNhbid0IGRvIHRoaXMgaW4KLSAgICAgIC8vIHRoZSBsb29wIGJlY2F1c2UgdGhlIGxvb3AgYWJvdmUgYWx3YXlzIHJlYWRzIDQgYnl0ZXMsIGFuZCB0aGUgZm91cnRoCi0gICAgICAvLyBieXRlIGlzIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5wdXQuCi0gICAgICBpZiAoKHN6ZGVzdCAtPSA0KSA8IDApIHJldHVybiAwOwotICAgICAgdWludDMyIGluID0gKGN1cl9zcmNbMF0gPDwgMTYpICsgQmlnRW5kaWFuOjpMb2FkMTYoY3VyX3NyYyArIDEpOwotICAgICAgY3VyX2Rlc3RbMF0gPSBiYXNlNjRbaW4gPj4gMThdOwotICAgICAgaW4gJj0gMHgzRkZGRjsKLSAgICAgIGN1cl9kZXN0WzFdID0gYmFzZTY0W2luID4+IDEyXTsKLSAgICAgIGluICY9IDB4RkZGOwotICAgICAgY3VyX2Rlc3RbMl0gPSBiYXNlNjRbaW4gPj4gNl07Ci0gICAgICBpbiAmPSAweDNGOwotICAgICAgY3VyX2Rlc3RbM10gPSBiYXNlNjRbaW5dOwotICAgICAgY3VyX2Rlc3QgKz0gNDsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgLy8gU2hvdWxkIG5vdCBiZSByZWFjaGVkOiBibG9ja3Mgb2YgNCBieXRlcyBhcmUgaGFuZGxlZAotICAgICAgLy8gaW4gdGhlIHdoaWxlIGxvb3AgYmVmb3JlIHRoaXMgc3dpdGNoIHN0YXRlbWVudC4KLSAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJMb2dpYyBwcm9ibGVtPyBzenNyYyA9ICIgPDwgc3pzcmM7Ci0gICAgICBicmVhazsKLSAgfQotICByZXR1cm4gKGN1cl9kZXN0IC0gZGVzdCk7Ci19Ci0KLXN0YXRpYyBjb25zdCBjaGFyIGtCYXNlNjRDaGFyc1tdID0KLSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKLQotc3RhdGljIGNvbnN0IGNoYXIga1dlYlNhZmVCYXNlNjRDaGFyc1tdID0KLSJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OS1fIjsKLQotaW50IEJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzenNyYywgY2hhciAqZGVzdCwgaW50IHN6ZGVzdCkgewotICByZXR1cm4gQmFzZTY0RXNjYXBlSW50ZXJuYWwoc3JjLCBzenNyYywgZGVzdCwgc3pkZXN0LCBrQmFzZTY0Q2hhcnMsIHRydWUpOwotfQotaW50IFdlYlNhZmVCYXNlNjRFc2NhcGUoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3pzcmMsIGNoYXIgKmRlc3QsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3pkZXN0LCBib29sIGRvX3BhZGRpbmcpIHsKLSAgcmV0dXJuIEJhc2U2NEVzY2FwZUludGVybmFsKHNyYywgc3pzcmMsIGRlc3QsIHN6ZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtXZWJTYWZlQmFzZTY0Q2hhcnMsIGRvX3BhZGRpbmcpOwotfQotCi12b2lkIEJhc2U2NEVzY2FwZUludGVybmFsKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHN6c3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGRlc3QsIGJvb2wgZG9fcGFkZGluZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogYmFzZTY0X2NoYXJzKSB7Ci0gIGNvbnN0IGludCBjYWxjX2VzY2FwZWRfc2l6ZSA9Ci0gICAgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihzenNyYywgZG9fcGFkZGluZyk7Ci0gIGRlc3QtPnJlc2l6ZShjYWxjX2VzY2FwZWRfc2l6ZSk7Ci0gIGNvbnN0IGludCBlc2NhcGVkX2xlbiA9IEJhc2U2NEVzY2FwZUludGVybmFsKHNyYywgc3pzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ19hc19hcnJheShkZXN0KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVzdC0+c2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRfY2hhcnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRvX3BhZGRpbmcpOwotICBHT09HTEVfRENIRUNLX0VRKGNhbGNfZXNjYXBlZF9zaXplLCBlc2NhcGVkX2xlbik7Ci0gIGRlc3QtPmVyYXNlKGVzY2FwZWRfbGVuKTsKLX0KLQotdm9pZCBCYXNlNjRFc2NhcGUoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3pzcmMsCi0gICAgICAgICAgICAgICAgICBzdHJpbmcqIGRlc3QsIGJvb2wgZG9fcGFkZGluZykgewotICBCYXNlNjRFc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBkb19wYWRkaW5nLCBrQmFzZTY0Q2hhcnMpOwotfQotCi12b2lkIFdlYlNhZmVCYXNlNjRFc2NhcGUoY29uc3QgdW5zaWduZWQgY2hhciAqc3JjLCBpbnQgc3pzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICpkZXN0LCBib29sIGRvX3BhZGRpbmcpIHsKLSAgQmFzZTY0RXNjYXBlSW50ZXJuYWwoc3JjLCBzenNyYywgZGVzdCwgZG9fcGFkZGluZywga1dlYlNhZmVCYXNlNjRDaGFycyk7Ci19Ci0KLXZvaWQgQmFzZTY0RXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KSB7Ci0gIEJhc2U2NEVzY2FwZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzcmMuZGF0YSgpKSwKLSAgICAgICAgICAgICAgIHNyYy5zaXplKCksIGRlc3QsIHRydWUpOwotfQotCi12b2lkIFdlYlNhZmVCYXNlNjRFc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdHJpbmcqIGRlc3QpIHsKLSAgV2ViU2FmZUJhc2U2NEVzY2FwZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzcmMuZGF0YSgpKSwKLSAgICAgICAgICAgICAgICAgICAgICBzcmMuc2l6ZSgpLCBkZXN0LCBmYWxzZSk7Ci19Ci0KLXZvaWQgV2ViU2FmZUJhc2U2NEVzY2FwZVdpdGhQYWRkaW5nKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KSB7Ci0gIFdlYlNhZmVCYXNlNjRFc2NhcGUocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oc3JjLmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgc3JjLnNpemUoKSwgZGVzdCwgdHJ1ZSk7Ci19Ci0KLS8vIEhlbHBlciB0byBhcHBlbmQgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBzdHJpbmcgYXMgVVRGOCwgd2l0aG91dCBicmluZ2luZwotLy8gaW4gYW55IGV4dGVybmFsIGRlcGVuZGVuY2llcy4KLWludCBFbmNvZGVBc1VURjhDaGFyKHVpbnQzMiBjb2RlX3BvaW50LCBjaGFyKiBvdXRwdXQpIHsKLSAgdWludDMyIHRtcCA9IDA7Ci0gIGludCBsZW4gPSAwOwotICBpZiAoY29kZV9wb2ludCA8PSAweDdmKSB7Ci0gICAgdG1wID0gY29kZV9wb2ludDsKLSAgICBsZW4gPSAxOwotICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0gMHgwN2ZmKSB7Ci0gICAgdG1wID0gMHgwMDAwYzA4MCB8Ci0gICAgICAgICgoY29kZV9wb2ludCAmIDB4MDdjMCkgPDwgMikgfAotICAgICAgICAoY29kZV9wb2ludCAmIDB4MDAzZik7Ci0gICAgbGVuID0gMjsKLSAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4ZmZmZikgewotICAgIHRtcCA9IDB4MDBlMDgwODAgfAotICAgICAgICAoKGNvZGVfcG9pbnQgJiAweGYwMDApIDw8IDQpIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwZmMwKSA8PCAyKSB8Ci0gICAgICAgIChjb2RlX3BvaW50ICYgMHgwMDNmKTsKLSAgICBsZW4gPSAzOwotICB9IGVsc2UgewotICAgIC8vIFVURi0xNiBpcyBvbmx5IGRlZmluZWQgZm9yIGNvZGUgcG9pbnRzIHVwIHRvIDB4MTBGRkZGLCBhbmQgVVRGLTggaXMKLSAgICAvLyBub3JtYWxseSBvbmx5IGRlZmluZWQgdXAgdG8gdGhlcmUgYXMgd2VsbC4KLSAgICB0bXAgPSAweGYwODA4MDgwIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgxYzAwMDApIDw8IDYpIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwM2YwMDApIDw8IDQpIHwKLSAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwMDBmYzApIDw8IDIpIHwKLSAgICAgICAgKGNvZGVfcG9pbnQgJiAweDAwM2YpOwotICAgIGxlbiA9IDQ7Ci0gIH0KLSAgdG1wID0gZ2h0b25sKHRtcCk7Ci0gIG1lbWNweShvdXRwdXQsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApICsgc2l6ZW9mKHRtcCkgLSBsZW4sIGxlbik7Ci0gIHJldHVybiBsZW47Ci19Ci0KLS8vIFRhYmxlIG9mIFVURi04IGNoYXJhY3RlciBsZW5ndGhzLCBiYXNlZCBvbiBmaXJzdCBieXRlCi1zdGF0aWMgY29uc3QgdW5zaWduZWQgY2hhciBrVVRGOExlblRibFsyNTZdID0gewotICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsCi0gIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwKLSAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLAotICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsCi0KLSAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLAotICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsCi0gIDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwyLCAyLDIsMiwyLDIsMiwyLDIsIDIsMiwyLDIsMiwyLDIsMiwKLSAgMywzLDMsMywzLDMsMywzLCAzLDMsMywzLDMsMywzLDMsIDQsNCw0LDQsNCw0LDQsNCwgNCw0LDQsNCw0LDQsNCw0Ci19OwotCi0vLyBSZXR1cm4gbGVuZ3RoIG9mIGEgc2luZ2xlIFVURi04IHNvdXJjZSBjaGFyYWN0ZXIKLWludCBVVEY4Rmlyc3RMZXR0ZXJOdW1CeXRlcyhjb25zdCBjaGFyKiBzcmMsIGludCBsZW4pIHsKLSAgaWYgKGxlbiA9PSAwKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuIGtVVEY4TGVuVGJsWypyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oc3JjKV07Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGJkZDYxMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3NiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gZnJvbSBnb29nbGUzL3N0cmluZ3Mvc3RydXRpbC5oCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUlVUSUxfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJVVElMX0hfXwotCi0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgc3RydG9sbCAgX3N0cnRvaTY0Ci0jZGVmaW5lIHN0cnRvdWxsIF9zdHJ0b3VpNjQKLSNlbGlmIGRlZmluZWQoX19ERUNDWFgpICYmIGRlZmluZWQoX19vc2ZfXykKLS8vIEhQIEMrKyBvbiBUcnU2NCBkb2VzIG5vdCBoYXZlIHN0cnRvbGwsIGJ1dCBzdHJ0b2wgaXMgYWxyZWFkeSA2NC1iaXQuCi0jZGVmaW5lIHN0cnRvbGwgc3RydG9sCi0jZGVmaW5lIHN0cnRvdWxsIHN0cnRvdWwKLSNlbmRpZgotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBhc2NpaV9pc2FsbnVtKCkKLS8vICAgIENoZWNrIGlmIGFuIEFTQ0lJIGNoYXJhY3RlciBpcyBhbHBoYW51bWVyaWMuICBXZSBjYW4ndCB1c2UgY3R5cGUncwotLy8gICAgaXNhbG51bSgpIGJlY2F1c2UgaXQgaXMgYWZmZWN0ZWQgYnkgbG9jYWxlLiAgVGhpcyBmdW5jdGlvbiBpcyBhcHBsaWVkCi0vLyAgICB0byBpZGVudGlmaWVycyBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyIGxhbmd1YWdlLCBub3QgdG8gbmF0dXJhbC1sYW5ndWFnZQotLy8gICAgc3RyaW5ncywgc28gbG9jYWxlIHNob3VsZCBub3QgYmUgdGFrZW4gaW50byBhY2NvdW50LgotLy8gYXNjaWlfaXNkaWdpdCgpCi0vLyAgICBMaWtlIGFib3ZlLCBidXQgb25seSBhY2NlcHRzIGRpZ2l0cy4KLS8vIGFzY2lpX2lzc3BhY2UoKQotLy8gICAgQ2hlY2sgaWYgdGhlIGNoYXJhY3RlciBpcyBhIHNwYWNlIGNoYXJhY3Rlci4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotaW5saW5lIGJvb2wgYXNjaWlfaXNhbG51bShjaGFyIGMpIHsKLSAgcmV0dXJuICgnYScgPD0gYyAmJiBjIDw9ICd6JykgfHwKLSAgICAgICAgICgnQScgPD0gYyAmJiBjIDw9ICdaJykgfHwKLSAgICAgICAgICgnMCcgPD0gYyAmJiBjIDw9ICc5Jyk7Ci19Ci0KLWlubGluZSBib29sIGFzY2lpX2lzZGlnaXQoY2hhciBjKSB7Ci0gIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpOwotfQotCi1pbmxpbmUgYm9vbCBhc2NpaV9pc3NwYWNlKGNoYXIgYykgewotICByZXR1cm4gYyA9PSAnICcgfHwgYyA9PSAnXHQnIHx8IGMgPT0gJ1xuJyB8fCBjID09ICdcdicgfHwgYyA9PSAnXGYnIHx8Ci0gICAgICBjID09ICdccic7Ci19Ci0KLWlubGluZSBib29sIGFzY2lpX2lzdXBwZXIoY2hhciBjKSB7Ci0gIHJldHVybiBjID49ICdBJyAmJiBjIDw9ICdaJzsKLX0KLQotaW5saW5lIGJvb2wgYXNjaWlfaXNsb3dlcihjaGFyIGMpIHsKLSAgcmV0dXJuIGMgPj0gJ2EnICYmIGMgPD0gJ3onOwotfQotCi1pbmxpbmUgY2hhciBhc2NpaV90b3VwcGVyKGNoYXIgYykgewotICByZXR1cm4gYXNjaWlfaXNsb3dlcihjKSA/IGMgLSAoJ2EnIC0gJ0EnKSA6IGM7Ci19Ci0KLWlubGluZSBjaGFyIGFzY2lpX3RvbG93ZXIoY2hhciBjKSB7Ci0gIHJldHVybiBhc2NpaV9pc3VwcGVyKGMpID8gYyArICgnYScgLSAnQScpIDogYzsKLX0KLQotaW5saW5lIGludCBoZXhfZGlnaXRfdG9faW50KGNoYXIgYykgewotICAvKiBBc3N1bWUgQVNDSUkuICovCi0gIGludCB4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyk7Ci0gIGlmICh4ID4gJzknKSB7Ci0gICAgeCArPSA5OwotICB9Ci0gIHJldHVybiB4ICYgMHhmOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBIYXNQcmVmaXhTdHJpbmcoKQotLy8gICAgQ2hlY2sgaWYgYSBzdHJpbmcgYmVnaW5zIHdpdGggYSBnaXZlbiBwcmVmaXguCi0vLyBTdHJpcFByZWZpeFN0cmluZygpCi0vLyAgICBHaXZlbiBhIHN0cmluZyBhbmQgYSBwdXRhdGl2ZSBwcmVmaXgsIHJldHVybnMgdGhlIHN0cmluZyBtaW51cyB0aGUKLS8vICAgIHByZWZpeCBzdHJpbmcgaWYgdGhlIHByZWZpeCBtYXRjaGVzLCBvdGhlcndpc2UgdGhlIG9yaWdpbmFsCi0vLyAgICBzdHJpbmcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1pbmxpbmUgYm9vbCBIYXNQcmVmaXhTdHJpbmcoY29uc3Qgc3RyaW5nJiBzdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgpIHsKLSAgcmV0dXJuIHN0ci5zaXplKCkgPj0gcHJlZml4LnNpemUoKSAmJgotICAgICAgICAgc3RyLmNvbXBhcmUoMCwgcHJlZml4LnNpemUoKSwgcHJlZml4KSA9PSAwOwotfQotCi1pbmxpbmUgc3RyaW5nIFN0cmlwUHJlZml4U3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyLCBjb25zdCBzdHJpbmcmIHByZWZpeCkgewotICBpZiAoSGFzUHJlZml4U3RyaW5nKHN0ciwgcHJlZml4KSkgewotICAgIHJldHVybiBzdHIuc3Vic3RyKHByZWZpeC5zaXplKCkpOwotICB9IGVsc2UgewotICAgIHJldHVybiBzdHI7Ci0gIH0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSGFzU3VmZml4U3RyaW5nKCkKLS8vICAgIFJldHVybiB0cnVlIGlmIHN0ciBlbmRzIGluIHN1ZmZpeC4KLS8vIFN0cmlwU3VmZml4U3RyaW5nKCkKLS8vICAgIEdpdmVuIGEgc3RyaW5nIGFuZCBhIHB1dGF0aXZlIHN1ZmZpeCwgcmV0dXJucyB0aGUgc3RyaW5nIG1pbnVzIHRoZQotLy8gICAgc3VmZml4IHN0cmluZyBpZiB0aGUgc3VmZml4IG1hdGNoZXMsIG90aGVyd2lzZSB0aGUgb3JpZ2luYWwKLS8vICAgIHN0cmluZy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLWlubGluZSBib29sIEhhc1N1ZmZpeFN0cmluZyhjb25zdCBzdHJpbmcmIHN0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHN1ZmZpeCkgewotICByZXR1cm4gc3RyLnNpemUoKSA+PSBzdWZmaXguc2l6ZSgpICYmCi0gICAgICAgICBzdHIuY29tcGFyZShzdHIuc2l6ZSgpIC0gc3VmZml4LnNpemUoKSwgc3VmZml4LnNpemUoKSwgc3VmZml4KSA9PSAwOwotfQotCi1pbmxpbmUgc3RyaW5nIFN0cmlwU3VmZml4U3RyaW5nKGNvbnN0IHN0cmluZyYgc3RyLCBjb25zdCBzdHJpbmcmIHN1ZmZpeCkgewotICBpZiAoSGFzU3VmZml4U3RyaW5nKHN0ciwgc3VmZml4KSkgewotICAgIHJldHVybiBzdHIuc3Vic3RyKDAsIHN0ci5zaXplKCkgLSBzdWZmaXguc2l6ZSgpKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gc3RyOwotICB9Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFN0cmlwU3RyaW5nCi0vLyAgICBSZXBsYWNlcyBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyICdyZW1vdmUnIChvciB0aGUgY2hhcmFjdGVycwotLy8gICAgaW4gJ3JlbW92ZScpIHdpdGggdGhlIGNoYXJhY3RlciAncmVwbGFjZXdpdGgnLgotLy8gICAgR29vZCBmb3Iga2VlcGluZyBodG1sIGNoYXJhY3RlcnMgb3IgcHJvdG9jb2wgY2hhcmFjdGVycyAoXHQpIG91dAotLy8gICAgb2YgcGxhY2VzIHdoZXJlIHRoZXkgbWlnaHQgY2F1c2UgYSBwcm9ibGVtLgotLy8gU3RyaXBXaGl0ZXNwYWNlCi0vLyAgICBSZW1vdmVzIHdoaXRlc3BhY2VzIGZyb20gYm90aCBlbmRzIG9mIHRoZSBnaXZlbiBzdHJpbmcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJpcFN0cmluZyhzdHJpbmcqIHMsIGNvbnN0IGNoYXIqIHJlbW92ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgcmVwbGFjZXdpdGgpOwotCi1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJpcFdoaXRlc3BhY2Uoc3RyaW5nKiBzKTsKLQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBMb3dlclN0cmluZygpCi0vLyBVcHBlclN0cmluZygpCi0vLyBUb1VwcGVyKCkKLS8vICAgIENvbnZlcnQgdGhlIGNoYXJhY3RlcnMgaW4gInMiIHRvIGxvd2VyY2FzZSBvciB1cHBlcmNhc2UuICBBU0NJSS1vbmx5OgotLy8gICAgdGhlc2UgZnVuY3Rpb25zIGludGVudGlvbmFsbHkgaWdub3JlIGxvY2FsZSBiZWNhdXNlIHRoZXkgYXJlIGFwcGxpZWQgdG8KLS8vICAgIGlkZW50aWZpZXJzIHVzZWQgaW4gdGhlIFByb3RvY29sIEJ1ZmZlciBsYW5ndWFnZSwgbm90IHRvIG5hdHVyYWwtbGFuZ3VhZ2UKLS8vICAgIHN0cmluZ3MuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLWlubGluZSB2b2lkIExvd2VyU3RyaW5nKHN0cmluZyAqIHMpIHsKLSAgc3RyaW5nOjppdGVyYXRvciBlbmQgPSBzLT5lbmQoKTsKLSAgZm9yIChzdHJpbmc6Oml0ZXJhdG9yIGkgPSBzLT5iZWdpbigpOyBpICE9IGVuZDsgKytpKSB7Ci0gICAgLy8gdG9sb3dlcigpIGNoYW5nZXMgYmFzZWQgb24gbG9jYWxlLiAgV2UgZG9uJ3Qgd2FudCB0aGlzIQotICAgIGlmICgnQScgPD0gKmkgJiYgKmkgPD0gJ1onKSAqaSArPSAnYScgLSAnQSc7Ci0gIH0KLX0KLQotaW5saW5lIHZvaWQgVXBwZXJTdHJpbmcoc3RyaW5nICogcykgewotICBzdHJpbmc6Oml0ZXJhdG9yIGVuZCA9IHMtPmVuZCgpOwotICBmb3IgKHN0cmluZzo6aXRlcmF0b3IgaSA9IHMtPmJlZ2luKCk7IGkgIT0gZW5kOyArK2kpIHsKLSAgICAvLyB0b3VwcGVyKCkgY2hhbmdlcyBiYXNlZCBvbiBsb2NhbGUuICBXZSBkb24ndCB3YW50IHRoaXMhCi0gICAgaWYgKCdhJyA8PSAqaSAmJiAqaSA8PSAneicpICppICs9ICdBJyAtICdhJzsKLSAgfQotfQotCi1pbmxpbmUgc3RyaW5nIFRvVXBwZXIoY29uc3Qgc3RyaW5nJiBzKSB7Ci0gIHN0cmluZyBvdXQgPSBzOwotICBVcHBlclN0cmluZygmb3V0KTsKLSAgcmV0dXJuIG91dDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU3RyaW5nUmVwbGFjZSgpCi0vLyAgICBHaXZlIG1lIGEgc3RyaW5nIGFuZCB0d28gcGF0dGVybnMgIm9sZCIgYW5kICJuZXciLCBhbmQgSSByZXBsYWNlCi0vLyAgICB0aGUgZmlyc3QgaW5zdGFuY2Ugb2YgIm9sZCIgaW4gdGhlIHN0cmluZyB3aXRoICJuZXciLCBpZiBpdAotLy8gICAgZXhpc3RzLiAgUkVUVVJOIGEgbmV3IHN0cmluZywgcmVnYXJkbGVzcyBvZiB3aGV0aGVyIHRoZSByZXBsYWNlbWVudAotLy8gICAgaGFwcGVuZWQgb3Igbm90LgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0cmluZ1JlcGxhY2UoY29uc3Qgc3RyaW5nJiBzLCBjb25zdCBzdHJpbmcmIG9sZHN1YiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5ld3N1YiwgYm9vbCByZXBsYWNlX2FsbCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNwbGl0U3RyaW5nVXNpbmcoKQotLy8gICAgU3BsaXQgYSBzdHJpbmcgdXNpbmcgYSBjaGFyYWN0ZXIgZGVsaW1pdGVyLiBBcHBlbmQgdGhlIGNvbXBvbmVudHMKLS8vICAgIHRvICdyZXN1bHQnLiAgSWYgdGhlcmUgYXJlIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMsIHRoaXMgZnVuY3Rpb24gc2tpcHMKLS8vICAgIG92ZXIgYWxsIG9mIHRoZW0uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTcGxpdFN0cmluZ1VzaW5nKGNvbnN0IHN0cmluZyYgZnVsbCwgY29uc3QgY2hhciogZGVsaW0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiByZXMpOwotCi0vLyBTcGxpdCBhIHN0cmluZyB1c2luZyBvbmUgb3IgbW9yZSBieXRlIGRlbGltaXRlcnMsIHByZXNlbnRlZAotLy8gYXMgYSBudWwtdGVybWluYXRlZCBjIHN0cmluZy4gQXBwZW5kIHRoZSBjb21wb25lbnRzIHRvICdyZXN1bHQnLgotLy8gSWYgdGhlcmUgYXJlIGNvbnNlY3V0aXZlIGRlbGltaXRlcnMsIHRoaXMgZnVuY3Rpb24gd2lsbCByZXR1cm4KLS8vIGNvcnJlc3BvbmRpbmcgZW1wdHkgc3RyaW5ncy4gIElmIHlvdSB3YW50IHRvIGRyb3AgdGhlIGVtcHR5Ci0vLyBzdHJpbmdzLCB0cnkgU3BsaXRTdHJpbmdVc2luZygpLgotLy8KLS8vIElmICJmdWxsIiBpcyB0aGUgZW1wdHkgc3RyaW5nLCB5aWVsZHMgYW4gZW1wdHkgc3RyaW5nIGFzIHRoZSBvbmx5IHZhbHVlLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3BsaXRTdHJpbmdBbGxvd0VtcHR5KGNvbnN0IHN0cmluZyYgZnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogcmVzdWx0KTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU3BsaXQoKQotLy8gICAgU3BsaXQgYSBzdHJpbmcgdXNpbmcgYSBjaGFyYWN0ZXIgZGVsaW1pdGVyLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotaW5saW5lIHZlY3RvcjxzdHJpbmc+IFNwbGl0KAotICAgIGNvbnN0IHN0cmluZyYgZnVsbCwgY29uc3QgY2hhciogZGVsaW0sIGJvb2wgc2tpcF9lbXB0eSA9IHRydWUpIHsKLSAgdmVjdG9yPHN0cmluZz4gcmVzdWx0OwotICBpZiAoc2tpcF9lbXB0eSkgewotICAgIFNwbGl0U3RyaW5nVXNpbmcoZnVsbCwgZGVsaW0sICZyZXN1bHQpOwotICB9IGVsc2UgewotICAgIFNwbGl0U3RyaW5nQWxsb3dFbXB0eShmdWxsLCBkZWxpbSwgJnJlc3VsdCk7Ci0gIH0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gSm9pblN0cmluZ3MoKQotLy8gICAgVGhlc2UgbWV0aG9kcyBjb25jYXRlbmF0ZSBhIHZlY3RvciBvZiBzdHJpbmdzIGludG8gYSBDKysgc3RyaW5nLCB1c2luZwotLy8gICAgdGhlIEMtc3RyaW5nICJkZWxpbSIgYXMgYSBzZXBhcmF0b3IgYmV0d2VlbiBjb21wb25lbnRzLiBUaGVyZSBhcmUgdHdvCi0vLyAgICBmbGF2b3JzIG9mIHRoZSBmdW5jdGlvbiwgb25lIGZsYXZvciByZXR1cm5zIHRoZSBjb25jYXRlbmF0ZWQgc3RyaW5nLAotLy8gICAgYW5vdGhlciB0YWtlcyBhIHBvaW50ZXIgdG8gdGhlIHRhcmdldCBzdHJpbmcuIEluIHRoZSBsYXR0ZXIgY2FzZSB0aGUKLS8vICAgIHRhcmdldCBzdHJpbmcgaXMgY2xlYXJlZCBhbmQgb3ZlcndyaXR0ZW4uCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBKb2luU3RyaW5ncyhjb25zdCB2ZWN0b3I8c3RyaW5nPiYgY29tcG9uZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltLCBzdHJpbmcqIHJlc3VsdCk7Ci0KLWlubGluZSBzdHJpbmcgSm9pblN0cmluZ3MoY29uc3QgdmVjdG9yPHN0cmluZz4mIGNvbXBvbmVudHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltKSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIEpvaW5TdHJpbmdzKGNvbXBvbmVudHMsIGRlbGltLCAmcmVzdWx0KTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKCkKLS8vICAgIENvcGllcyAic291cmNlIiB0byAiZGVzdCIsIHJld3JpdGluZyBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMKLS8vICAgIC0tICdcbicsICdccicsICdcXCcsICdcb29vJywgZXRjIC0tIHRvIHRoZWlyIEFTQ0lJCi0vLyAgICBlcXVpdmFsZW50cy4gICJkZXN0IiBtdXN0IGJlIHN1ZmZpY2llbnRseSBsYXJnZSB0byBob2xkIGFsbAotLy8gICAgdGhlIGNoYXJhY3RlcnMgaW4gdGhlIHJld3JpdHRlbiBzdHJpbmcgKGkuZS4gYXQgbGVhc3QgYXMgbGFyZ2UKLS8vICAgIGFzIHN0cmxlbihzb3VyY2UpICsgMSBzaG91bGQgYmUgc2FmZSwgc2luY2UgdGhlIHJlcGxhY2VtZW50cwotLy8gICAgYXJlIGFsd2F5cyBzaG9ydGVyIHRoYW4gdGhlIG9yaWdpbmFsIGVzY2FwZWQgc2VxdWVuY2VzKS4gIEl0J3MKLS8vICAgIHNhZmUgZm9yIHNvdXJjZSBhbmQgZGVzdCB0byBiZSB0aGUgc2FtZS4gIFJFVFVSTlMgdGhlIGxlbmd0aAotLy8gICAgb2YgZGVzdC4KLS8vCi0vLyAgICBJdCBhbGxvd3MgaGV4IHNlcXVlbmNlcyBceGhoLCBvciBnZW5lcmFsbHkgXHhoaGhoaCB3aXRoIGFuCi0vLyAgICBhcmJpdHJhcnkgbnVtYmVyIG9mIGhleCBkaWdpdHMsIGJ1dCBhbGwgb2YgdGhlbSB0b2dldGhlciBtdXN0Ci0vLyAgICBzcGVjaWZ5IGEgdmFsdWUgb2YgYSBzaW5nbGUgYnl0ZSAoZS5nLiBceDAwNDUgaXMgZXF1aXZhbGVudAotLy8gICAgdG8gXHg0NSwgYW5kIFx4MTIzNCBpcyBlcnJvbmVvdXMpLgotLy8KLS8vICAgIEl0IGFsc28gYWxsb3dzIGVzY2FwZSBzZXF1ZW5jZXMgb2YgdGhlIGZvcm0gXHVoaGhoIChleGFjdGx5IGZvdXIKLS8vICAgIGhleCBkaWdpdHMsIHVwcGVyIG9yIGxvd2VyIGNhc2UpIG9yIFxVaGhoaGhoaGggKGV4YWN0bHkgZWlnaHQKLS8vICAgIGhleCBkaWdpdHMsIHVwcGVyIG9yIGxvd2VyIGNhc2UpIHRvIHNwZWNpZnkgYSBVbmljb2RlIGNvZGUKLS8vICAgIHBvaW50LiBUaGUgZGVzdCBhcnJheSB3aWxsIGNvbnRhaW4gdGhlIFVURjgtZW5jb2RlZCB2ZXJzaW9uIG9mCi0vLyAgICB0aGF0IGNvZGUtcG9pbnQgKGUuZy4sIGlmIHNvdXJjZSBjb250YWlucyBcdTIwMTksIHRoZW4gZGVzdCB3aWxsCi0vLyAgICBjb250YWluIHRoZSB0aHJlZSBieXRlcyAweEUyLCAweDgwLCBhbmQgMHg5OSkuCi0vLwotLy8gICAgRXJyb3JzOiBJbiB0aGUgZmlyc3QgZm9ybSBvZiB0aGUgY2FsbCwgZXJyb3JzIGFyZSByZXBvcnRlZCB3aXRoCi0vLyAgICBMT0coRVJST1IpLiBUaGUgc2FtZSBpcyB0cnVlIGZvciB0aGUgc2Vjb25kIGZvcm0gb2YgdGhlIGNhbGwgaWYKLS8vICAgIHRoZSBwb2ludGVyIHRvIHRoZSBzdHJpbmcgdmVjdG9yIGlzIE5VTEw7IG90aGVyd2lzZSwgZXJyb3IKLS8vICAgIG1lc3NhZ2VzIGFyZSBzdG9yZWQgaW4gdGhlIHZlY3Rvci4gSW4gZWl0aGVyIGNhc2UsIHRoZSBlZmZlY3Qgb24KLS8vICAgIHRoZSBkZXN0IGFycmF5IGlzIG5vdCBkZWZpbmVkLCBidXQgcmVzdCBvZiB0aGUgc291cmNlIHdpbGwgYmUKLS8vICAgIHByb2Nlc3NlZC4KLS8vICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTElCUFJPVE9CVUZfRVhQT1JUIGludCBVbmVzY2FwZUNFc2NhcGVTZXF1ZW5jZXMoY29uc3QgY2hhciogc291cmNlLCBjaGFyKiBkZXN0KTsKLUxJQlBST1RPQlVGX0VYUE9SVCBpbnQgVW5lc2NhcGVDRXNjYXBlU2VxdWVuY2VzKGNvbnN0IGNoYXIqIHNvdXJjZSwgY2hhciogZGVzdCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+ICplcnJvcnMpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoKQotLy8gICAgVGhpcyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIFVuZXNjYXBlQ0VzY2FwZVNlcXVlbmNlcywgYnV0IGNyZWF0ZXMKLS8vICAgIGEgbmV3IHN0cmluZy4gVGhlIGNhbGxlciBkb2VzIG5vdCBuZWVkIHRvIHdvcnJ5IGFib3V0IGFsbG9jYXRpbmcKLS8vICAgIGEgZGVzdCBidWZmZXIuIFRoaXMgc2hvdWxkIGJlIHVzZWQgZm9yIG5vbiBwZXJmb3JtYW5jZSBjcml0aWNhbAotLy8gICAgdGFza3Mgc3VjaCBhcyBwcmludGluZyBkZWJ1ZyBtZXNzYWdlcy4gSXQgaXMgc2FmZSBmb3Igc3JjIGFuZCBkZXN0Ci0vLyAgICB0byBiZSB0aGUgc2FtZS4KLS8vCi0vLyAgICBUaGUgc2Vjb25kIGNhbGwgc3RvcmVzIGl0cyBlcnJvcnMgaW4gYSBzdXBwbGllZCBzdHJpbmcgdmVjdG9yLgotLy8gICAgSWYgdGhlIHN0cmluZyB2ZWN0b3IgcG9pbnRlciBpcyBOVUxMLCBpdCByZXBvcnRzIHRoZSBlcnJvcnMgd2l0aCBMT0coKS4KLS8vCi0vLyAgICBJbiB0aGUgZmlyc3QgYW5kIHNlY29uZCBjYWxscywgdGhlIGxlbmd0aCBvZiBkZXN0IGlzIHJldHVybmVkLiBJbiB0aGUKLS8vICAgIHRoZSB0aGlyZCBjYWxsLCB0aGUgbmV3IHN0cmluZyBpcyByZXR1cm5lZC4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTElCUFJPVE9CVUZfRVhQT1JUIGludCBVbmVzY2FwZUNFc2NhcGVTdHJpbmcoY29uc3Qgc3RyaW5nJiBzcmMsIHN0cmluZyogZGVzdCk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgaW50IFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdHJpbmcmIHNyYywgc3RyaW5nKiBkZXN0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4gKmVycm9ycyk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdHJpbmcmIHNyYyk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENFc2NhcGUoKQotLy8gICAgRXNjYXBlcyAnc3JjJyB1c2luZyBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMgYW5kIHJldHVybnMgdGhlIHJlc3VsdGluZwotLy8gICAgc3RyaW5nLgotLy8KLS8vICAgIEVzY2FwZWQgY2hhcnM6IFxuLCBcciwgXHQsICIsICcsIFwsIGFuZCAhaXNwcmludCgpLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBDRXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ0VzY2FwZUFuZEFwcGVuZCgpCi0vLyAgICBFc2NhcGVzICdzcmMnIHVzaW5nIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcywgYW5kIGFwcGVuZHMgdGhlIGVzY2FwZWQKLS8vICAgIHN0cmluZyB0byAnZGVzdCcuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBDRXNjYXBlQW5kQXBwZW5kKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KTsKLQotbmFtZXNwYWNlIHN0cmluZ3MgewotLy8gTGlrZSBDRXNjYXBlKCkgYnV0IGRvZXMgbm90IGVzY2FwZSBieXRlcyB3aXRoIHRoZSB1cHBlciBiaXQgc2V0LgotTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBVdGY4U2FmZUNFc2NhcGUoY29uc3Qgc3RyaW5nJiBzcmMpOwotCi0vLyBMaWtlIENFc2NhcGUoKSBidXQgdXNlcyBoZXggKFx4KSBlc2NhcGVzIGluc3RlYWQgb2Ygb2N0YWxzLgotTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBDSGV4RXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKTsKLX0gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCi0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHN0cnRvMzIoKQotLy8gc3RydG91MzIoKQotLy8gc3RydG82NCgpCi0vLyBzdHJ0b3U2NCgpCi0vLyAgICBBcmNoaXRlY3R1cmUtbmV1dHJhbCBwbHVnIGNvbXBhdGlibGUgcmVwbGFjZW1lbnRzIGZvciBzdHJ0b2woKSBhbmQKLS8vICAgIHN0cnRvdWwoKS4gIExvbmcncyBoYXZlIGRpZmZlcmVudCBsZW5ndGhzIG9uIElMUC0zMiBhbmQgTFAtNjQKLS8vICAgIHBsYXRmb3Jtcywgc28gdXNpbmcgdGhlc2UgaXMgc2FmZXIsIGZyb20gdGhlIHBvaW50IG9mIHZpZXcgb2YKLS8vICAgIG92ZXJmbG93IGJlaGF2aW9yLCB0aGFuIHVzaW5nIHRoZSBzdGFuZGFyZCBsaWJjIGZ1bmN0aW9ucy4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxJQlBST1RPQlVGX0VYUE9SVCBpbnQzMiBzdHJ0bzMyX2FkYXB0b3IoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UpOwotTElCUFJPVE9CVUZfRVhQT1JUIHVpbnQzMiBzdHJ0b3UzMl9hZGFwdG9yKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJhc2UpOwotCi1pbmxpbmUgaW50MzIgc3RydG8zMihjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgewotICBpZiAoc2l6ZW9mKGludDMyKSA9PSBzaXplb2YobG9uZykpCi0gICAgcmV0dXJuIHN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpOwotICBlbHNlCi0gICAgcmV0dXJuIHN0cnRvMzJfYWRhcHRvcihucHRyLCBlbmRwdHIsIGJhc2UpOwotfQotCi1pbmxpbmUgdWludDMyIHN0cnRvdTMyKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7Ci0gIGlmIChzaXplb2YodWludDMyKSA9PSBzaXplb2YodW5zaWduZWQgbG9uZykpCi0gICAgcmV0dXJuIHN0cnRvdWwobnB0ciwgZW5kcHRyLCBiYXNlKTsKLSAgZWxzZQotICAgIHJldHVybiBzdHJ0b3UzMl9hZGFwdG9yKG5wdHIsIGVuZHB0ciwgYmFzZSk7Ci19Ci0KLS8vIEZvciBub3csIGxvbmcgbG9uZyBpcyA2NC1iaXQgb24gYWxsIHRoZSBwbGF0Zm9ybXMgd2UgY2FyZSBhYm91dCwgc28gdGhlc2UKLS8vIGZ1bmN0aW9ucyBjYW4gc2ltcGx5IHBhc3MgdGhlIGNhbGwgdG8gc3RydG9bdV1sbC4KLWlubGluZSBpbnQ2NCBzdHJ0bzY0KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7Ci0gIEdPT0dMRV9DT01QSUxFX0FTU0VSVChzaXplb2YoaW50NjQpID09IHNpemVvZihsb25nIGxvbmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mX2ludDY0X2lzX25vdF9zaXplb2ZfbG9uZ19sb25nKTsKLSAgcmV0dXJuIHN0cnRvbGwobnB0ciwgZW5kcHRyLCBiYXNlKTsKLX0KLQotaW5saW5lIHVpbnQ2NCBzdHJ0b3U2NChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgewotICBHT09HTEVfQ09NUElMRV9BU1NFUlQoc2l6ZW9mKHVpbnQ2NCkgPT0gc2l6ZW9mKHVuc2lnbmVkIGxvbmcgbG9uZyksCi0gICAgICAgICAgICAgICAgICAgICAgICBzaXplb2ZfdWludDY0X2lzX25vdF9zaXplb2ZfbG9uZ19sb25nKTsKLSAgcmV0dXJuIHN0cnRvdWxsKG5wdHIsIGVuZHB0ciwgYmFzZSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIHNhZmVfc3RydG9iKCkKLS8vIHNhZmVfc3RydG8zMigpCi0vLyBzYWZlX3N0cnRvdTMyKCkKLS8vIHNhZmVfc3RydG82NCgpCi0vLyBzYWZlX3N0cnRvdTY0KCkKLS8vIHNhZmVfc3RydG9mKCkKLS8vIHNhZmVfc3RydG9kKCkKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxJQlBST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG9iKFN0cmluZ1BpZWNlIHN0ciwgYm9vbCogdmFsdWUpOwotCi1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBzYWZlX3N0cnRvMzIoY29uc3Qgc3RyaW5nJiBzdHIsIGludDMyKiB2YWx1ZSk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBzYWZlX3N0cnRvdTMyKGNvbnN0IHN0cmluZyYgc3RyLCB1aW50MzIqIHZhbHVlKTsKLWlubGluZSBib29sIHNhZmVfc3RydG8zMihjb25zdCBjaGFyKiBzdHIsIGludDMyKiB2YWx1ZSkgewotICByZXR1cm4gc2FmZV9zdHJ0bzMyKHN0cmluZyhzdHIpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBzYWZlX3N0cnRvMzIoU3RyaW5nUGllY2Ugc3RyLCBpbnQzMiogdmFsdWUpIHsKLSAgcmV0dXJuIHNhZmVfc3RydG8zMihzdHIuVG9TdHJpbmcoKSwgdmFsdWUpOwotfQotaW5saW5lIGJvb2wgc2FmZV9zdHJ0b3UzMihjb25zdCBjaGFyKiBzdHIsIHVpbnQzMiogdmFsdWUpIHsKLSAgcmV0dXJuIHNhZmVfc3RydG91MzIoc3RyaW5nKHN0ciksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIHNhZmVfc3RydG91MzIoU3RyaW5nUGllY2Ugc3RyLCB1aW50MzIqIHZhbHVlKSB7Ci0gIHJldHVybiBzYWZlX3N0cnRvdTMyKHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Ci19Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG82NChjb25zdCBzdHJpbmcmIHN0ciwgaW50NjQqIHZhbHVlKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG91NjQoY29uc3Qgc3RyaW5nJiBzdHIsIHVpbnQ2NCogdmFsdWUpOwotaW5saW5lIGJvb2wgc2FmZV9zdHJ0bzY0KGNvbnN0IGNoYXIqIHN0ciwgaW50NjQqIHZhbHVlKSB7Ci0gIHJldHVybiBzYWZlX3N0cnRvNjQoc3RyaW5nKHN0ciksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIHNhZmVfc3RydG82NChTdHJpbmdQaWVjZSBzdHIsIGludDY0KiB2YWx1ZSkgewotICByZXR1cm4gc2FmZV9zdHJ0bzY0KHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBzYWZlX3N0cnRvdTY0KGNvbnN0IGNoYXIqIHN0ciwgdWludDY0KiB2YWx1ZSkgewotICByZXR1cm4gc2FmZV9zdHJ0b3U2NChzdHJpbmcoc3RyKSwgdmFsdWUpOwotfQotaW5saW5lIGJvb2wgc2FmZV9zdHJ0b3U2NChTdHJpbmdQaWVjZSBzdHIsIHVpbnQ2NCogdmFsdWUpIHsKLSAgcmV0dXJuIHNhZmVfc3RydG91NjQoc3RyLlRvU3RyaW5nKCksIHZhbHVlKTsKLX0KLQotTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgc2FmZV9zdHJ0b2YoY29uc3QgY2hhciogc3RyLCBmbG9hdCogdmFsdWUpOwotTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgc2FmZV9zdHJ0b2QoY29uc3QgY2hhciogc3RyLCBkb3VibGUqIHZhbHVlKTsKLWlubGluZSBib29sIHNhZmVfc3RydG9mKGNvbnN0IHN0cmluZyYgc3RyLCBmbG9hdCogdmFsdWUpIHsKLSAgcmV0dXJuIHNhZmVfc3RydG9mKHN0ci5jX3N0cigpLCB2YWx1ZSk7Ci19Ci1pbmxpbmUgYm9vbCBzYWZlX3N0cnRvZChjb25zdCBzdHJpbmcmIHN0ciwgZG91YmxlKiB2YWx1ZSkgewotICByZXR1cm4gc2FmZV9zdHJ0b2Qoc3RyLmNfc3RyKCksIHZhbHVlKTsKLX0KLWlubGluZSBib29sIHNhZmVfc3RydG9mKFN0cmluZ1BpZWNlIHN0ciwgZmxvYXQqIHZhbHVlKSB7Ci0gIHJldHVybiBzYWZlX3N0cnRvZihzdHIuVG9TdHJpbmcoKSwgdmFsdWUpOwotfQotaW5saW5lIGJvb2wgc2FmZV9zdHJ0b2QoU3RyaW5nUGllY2Ugc3RyLCBkb3VibGUqIHZhbHVlKSB7Ci0gIHJldHVybiBzYWZlX3N0cnRvZChzdHIuVG9TdHJpbmcoKSwgdmFsdWUpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBGYXN0SW50VG9CdWZmZXIoKQotLy8gRmFzdEhleFRvQnVmZmVyKCkKLS8vIEZhc3RIZXg2NFRvQnVmZmVyKCkKLS8vIEZhc3RIZXgzMlRvQnVmZmVyKCkKLS8vIEZhc3RUaW1lVG9CdWZmZXIoKQotLy8gICAgVGhlc2UgYXJlIGludGVuZGVkIGZvciBzcGVlZC4gIEZhc3RJbnRUb0J1ZmZlcigpIGFzc3VtZXMgdGhlCi0vLyAgICBpbnRlZ2VyIGlzIG5vbi1uZWdhdGl2ZS4gIEZhc3RIZXhUb0J1ZmZlcigpIHB1dHMgb3V0cHV0IGluCi0vLyAgICBoZXggcmF0aGVyIHRoYW4gZGVjaW1hbC4gIEZhc3RUaW1lVG9CdWZmZXIoKSBwdXRzIHRoZSBvdXRwdXQKLS8vICAgIGludG8gUkZDODIyIGZvcm1hdC4KLS8vCi0vLyAgICBGYXN0SGV4NjRUb0J1ZmZlcigpIHB1dHMgYSA2NC1iaXQgdW5zaWduZWQgdmFsdWUgaW4gaGV4LWZvcm1hdCwKLS8vICAgIHBhZGRlZCB0byBleGFjdGx5IDE2IGJ5dGVzIChwbHVzIG9uZSBieXRlIGZvciAnXDAnKQotLy8KLS8vICAgIEZhc3RIZXgzMlRvQnVmZmVyKCkgcHV0cyBhIDMyLWJpdCB1bnNpZ25lZCB2YWx1ZSBpbiBoZXgtZm9ybWF0LAotLy8gICAgcGFkZGVkIHRvIGV4YWN0bHkgOCBieXRlcyAocGx1cyBvbmUgYnl0ZSBmb3IgJ1wwJykKLS8vCi0vLyAgICAgICBBbGwgZnVuY3Rpb25zIHRha2UgdGhlIG91dHB1dCBidWZmZXIgYXMgYW4gYXJnLgotLy8gICAgVGhleSBhbGwgcmV0dXJuIGEgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBvdXRwdXQsCi0vLyAgICB3aGljaCBtYXkgbm90IGJlIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGlucHV0IGJ1ZmZlci4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotLy8gU3VnZ2VzdGVkIGJ1ZmZlciBzaXplIGZvciBGYXN0VG9CdWZmZXIgZnVuY3Rpb25zLiAgQWxzbyB3b3JrcyB3aXRoCi0vLyBEb3VibGVUb0J1ZmZlcigpIGFuZCBGbG9hdFRvQnVmZmVyKCkuCi1zdGF0aWMgY29uc3QgaW50IGtGYXN0VG9CdWZmZXJTaXplID0gMzI7Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SW50MzJUb0J1ZmZlcihpbnQzMiBpLCBjaGFyKiBidWZmZXIpOwotTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RJbnQ2NFRvQnVmZmVyKGludDY0IGksIGNoYXIqIGJ1ZmZlcik7Ci1jaGFyKiBGYXN0VUludDMyVG9CdWZmZXIodWludDMyIGksIGNoYXIqIGJ1ZmZlcik7ICAvLyBpbmxpbmUgYmVsb3cKLWNoYXIqIEZhc3RVSW50NjRUb0J1ZmZlcih1aW50NjQgaSwgY2hhciogYnVmZmVyKTsgIC8vIGlubGluZSBiZWxvdwotTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RIZXhUb0J1ZmZlcihpbnQgaSwgY2hhciogYnVmZmVyKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SGV4NjRUb0J1ZmZlcih1aW50NjQgaSwgY2hhciogYnVmZmVyKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGYXN0SGV4MzJUb0J1ZmZlcih1aW50MzIgaSwgY2hhciogYnVmZmVyKTsKLQotLy8gYXQgbGVhc3QgMjIgYnl0ZXMgbG9uZwotaW5saW5lIGNoYXIqIEZhc3RJbnRUb0J1ZmZlcihpbnQgaSwgY2hhciogYnVmZmVyKSB7Ci0gIHJldHVybiAoc2l6ZW9mKGkpID09IDQgPwotICAgICAgICAgIEZhc3RJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOiBGYXN0SW50NjRUb0J1ZmZlcihpLCBidWZmZXIpKTsKLX0KLWlubGluZSBjaGFyKiBGYXN0VUludFRvQnVmZmVyKHVuc2lnbmVkIGludCBpLCBjaGFyKiBidWZmZXIpIHsKLSAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCA/Ci0gICAgICAgICAgRmFzdFVJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOiBGYXN0VUludDY0VG9CdWZmZXIoaSwgYnVmZmVyKSk7Ci19Ci1pbmxpbmUgY2hhciogRmFzdExvbmdUb0J1ZmZlcihsb25nIGksIGNoYXIqIGJ1ZmZlcikgewotICByZXR1cm4gKHNpemVvZihpKSA9PSA0ID8KLSAgICAgICAgICBGYXN0SW50MzJUb0J1ZmZlcihpLCBidWZmZXIpIDogRmFzdEludDY0VG9CdWZmZXIoaSwgYnVmZmVyKSk7Ci19Ci1pbmxpbmUgY2hhciogRmFzdFVMb25nVG9CdWZmZXIodW5zaWduZWQgbG9uZyBpLCBjaGFyKiBidWZmZXIpIHsKLSAgcmV0dXJuIChzaXplb2YoaSkgPT0gNCA/Ci0gICAgICAgICAgRmFzdFVJbnQzMlRvQnVmZmVyKGksIGJ1ZmZlcikgOiBGYXN0VUludDY0VG9CdWZmZXIoaSwgYnVmZmVyKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIEZhc3RJbnQzMlRvQnVmZmVyTGVmdCgpCi0vLyBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KCkKLS8vIEZhc3RJbnQ2NFRvQnVmZmVyTGVmdCgpCi0vLyBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KCkKLS8vCi0vLyBMaWtlIHRoZSBGYXN0KlRvQnVmZmVyKCkgZnVuY3Rpb25zIGFib3ZlLCB0aGVzZSBhcmUgaW50ZW5kZWQgZm9yIHNwZWVkLgotLy8gVW5saWtlIHRoZSBGYXN0KlRvQnVmZmVyKCkgZnVuY3Rpb25zLCBob3dldmVyLCB0aGVzZSBmdW5jdGlvbnMgd3JpdGUKLS8vIHRoZWlyIG91dHB1dCB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIgKGhlbmNlIHRoZSBuYW1lLCBhcyB0aGUKLS8vIG91dHB1dCBpcyBsZWZ0LWFsaWduZWQpLiAgVGhlIGNhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgZW5zdXJpbmcgdGhhdAotLy8gdGhlIGJ1ZmZlciBoYXMgZW5vdWdoIHNwYWNlIHRvIGhvbGQgdGhlIG91dHB1dC4KLS8vCi0vLyBSZXR1cm5zIGEgcG9pbnRlciB0byB0aGUgZW5kIG9mIHRoZSBzdHJpbmcgKGkuZS4gdGhlIG51bGwgY2hhcmFjdGVyCi0vLyB0ZXJtaW5hdGluZyB0aGUgc3RyaW5nKS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RJbnQzMlRvQnVmZmVyTGVmdChpbnQzMiBpLCBjaGFyKiBidWZmZXIpOwotTElCUFJPVE9CVUZfRVhQT1JUIGNoYXIqIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQodWludDMyIGksIGNoYXIqIGJ1ZmZlcik7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdEludDY0VG9CdWZmZXJMZWZ0KGludDY0IGksIGNoYXIqIGJ1ZmZlcik7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogRmFzdFVJbnQ2NFRvQnVmZmVyTGVmdCh1aW50NjQgaSwgY2hhciogYnVmZmVyKTsKLQotLy8gSnVzdCBkZWZpbmUgdGhlc2UgaW4gdGVybXMgb2YgdGhlIGFib3ZlLgotaW5saW5lIGNoYXIqIEZhc3RVSW50MzJUb0J1ZmZlcih1aW50MzIgaSwgY2hhciogYnVmZmVyKSB7Ci0gIEZhc3RVSW50MzJUb0J1ZmZlckxlZnQoaSwgYnVmZmVyKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLWlubGluZSBjaGFyKiBGYXN0VUludDY0VG9CdWZmZXIodWludDY0IGksIGNoYXIqIGJ1ZmZlcikgewotICBGYXN0VUludDY0VG9CdWZmZXJMZWZ0KGksIGJ1ZmZlcik7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci0KLWlubGluZSBzdHJpbmcgU2ltcGxlQnRvYShib29sIHZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSI7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFNpbXBsZUl0b2EoKQotLy8gICAgRGVzY3JpcHRpb246IGNvbnZlcnRzIGFuIGludGVnZXIgdG8gYSBzdHJpbmcuCi0vLwotLy8gICAgUmV0dXJuIHZhbHVlOiBzdHJpbmcKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlSXRvYShpbnQgaSk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgaW50IGkpOwotTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTaW1wbGVJdG9hKGxvbmcgaSk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgbG9uZyBpKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlSXRvYShsb25nIGxvbmcgaSk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUl0b2EodW5zaWduZWQgbG9uZyBsb25nIGkpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTaW1wbGVEdG9hKCkKLS8vIFNpbXBsZUZ0b2EoKQotLy8gRG91YmxlVG9CdWZmZXIoKQotLy8gRmxvYXRUb0J1ZmZlcigpCi0vLyAgICBEZXNjcmlwdGlvbjogY29udmVydHMgYSBkb3VibGUgb3IgZmxvYXQgdG8gYSBzdHJpbmcgd2hpY2gsIGlmCi0vLyAgICBwYXNzZWQgdG8gTm9Mb2NhbGVTdHJ0b2QoKSwgd2lsbCBwcm9kdWNlIHRoZSBleGFjdCBzYW1lIG9yaWdpbmFsIGRvdWJsZQotLy8gICAgKGV4Y2VwdCBpbiBjYXNlIG9mIE5hTjsgYWxsIE5hTnMgYXJlIGNvbnNpZGVyZWQgdGhlIHNhbWUgdmFsdWUpLgotLy8gICAgV2UgdHJ5IHRvIGtlZXAgdGhlIHN0cmluZyBzaG9ydCBidXQgaXQncyBub3QgZ3VhcmFudGVlZCB0byBiZSBhcwotLy8gICAgc2hvcnQgYXMgcG9zc2libGUuCi0vLwotLy8gICAgRG91YmxlVG9CdWZmZXIoKSBhbmQgRmxvYXRUb0J1ZmZlcigpIHdyaXRlIHRoZSB0ZXh0IHRvIHRoZSBnaXZlbgotLy8gICAgYnVmZmVyIGFuZCByZXR1cm4gaXQuICBUaGUgYnVmZmVyIG11c3QgYmUgYXQgbGVhc3QKLS8vICAgIGtEb3VibGVUb0J1ZmZlclNpemUgYnl0ZXMgZm9yIGRvdWJsZXMgYW5kIGtGbG9hdFRvQnVmZmVyU2l6ZQotLy8gICAgYnl0ZXMgZm9yIGZsb2F0cy4gIGtGYXN0VG9CdWZmZXJTaXplIGlzIGFsc28gZ3VhcmFudGVlZCB0byBiZSBsYXJnZQotLy8gICAgZW5vdWdoIHRvIGhvbGQgZWl0aGVyLgotLy8KLS8vICAgIFJldHVybiB2YWx1ZTogc3RyaW5nCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFNpbXBsZUR0b2EoZG91YmxlIHZhbHVlKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU2ltcGxlRnRvYShmbG9hdCB2YWx1ZSk7Ci0KLUxJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBEb3VibGVUb0J1ZmZlcihkb3VibGUgaSwgY2hhciogYnVmZmVyKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBjaGFyKiBGbG9hdFRvQnVmZmVyKGZsb2F0IGksIGNoYXIqIGJ1ZmZlcik7Ci0KLS8vIEluIHByYWN0aWNlLCBkb3VibGVzIHNob3VsZCBuZXZlciBuZWVkIG1vcmUgdGhhbiAyNCBieXRlcyBhbmQgZmxvYXRzCi0vLyBzaG91bGQgbmV2ZXIgbmVlZCBtb3JlIHRoYW4gMTQgKGluY2x1ZGluZyBudWxsIHRlcm1pbmF0b3JzKSwgYnV0IHdlCi0vLyBvdmVyZXN0aW1hdGUgdG8gYmUgc2FmZS4KLXN0YXRpYyBjb25zdCBpbnQga0RvdWJsZVRvQnVmZmVyU2l6ZSA9IDMyOwotc3RhdGljIGNvbnN0IGludCBrRmxvYXRUb0J1ZmZlclNpemUgPSAyNDsKLQotbmFtZXNwYWNlIHN0cmluZ3MgewotCi1lbnVtIFBhZFNwZWMgewotICBOT19QQUQgPSAxLAotICBaRVJPX1BBRF8yLAotICBaRVJPX1BBRF8zLAotICBaRVJPX1BBRF80LAotICBaRVJPX1BBRF81LAotICBaRVJPX1BBRF82LAotICBaRVJPX1BBRF83LAotICBaRVJPX1BBRF84LAotICBaRVJPX1BBRF85LAotICBaRVJPX1BBRF8xMCwKLSAgWkVST19QQURfMTEsCi0gIFpFUk9fUEFEXzEyLAotICBaRVJPX1BBRF8xMywKLSAgWkVST19QQURfMTQsCi0gIFpFUk9fUEFEXzE1LAotICBaRVJPX1BBRF8xNiwKLX07Ci0KLXN0cnVjdCBIZXggewotICB1aW50NjQgdmFsdWU7Ci0gIGVudW0gUGFkU3BlYyBzcGVjOwotICB0ZW1wbGF0ZSA8Y2xhc3MgSW50PgotICBleHBsaWNpdCBIZXgoSW50IHYsIFBhZFNwZWMgcyA9IE5PX1BBRCkKLSAgICAgIDogc3BlYyhzKSB7Ci0gICAgLy8gUHJldmVudCBzaWduLWV4dGVuc2lvbiBieSBjYXN0aW5nIGludGVnZXJzIHRvCi0gICAgLy8gdGhlaXIgdW5zaWduZWQgY291bnRlcnBhcnRzLgotI2lmZGVmIExBTkdfQ1hYMTEKLSAgICBzdGF0aWNfYXNzZXJ0KAotICAgICAgICBzaXplb2YodikgPT0gMSB8fCBzaXplb2YodikgPT0gMiB8fCBzaXplb2YodikgPT0gNCB8fCBzaXplb2YodikgPT0gOCwKLSAgICAgICAgIlVua25vd24gaW50ZWdlciB0eXBlIik7Ci0jZW5kaWYKLSAgICB2YWx1ZSA9IHNpemVvZih2KSA9PSAxID8gc3RhdGljX2Nhc3Q8dWludDg+KHYpCi0gICAgICAgICAgOiBzaXplb2YodikgPT0gMiA/IHN0YXRpY19jYXN0PHVpbnQxNj4odikKLSAgICAgICAgICA6IHNpemVvZih2KSA9PSA0ID8gc3RhdGljX2Nhc3Q8dWludDMyPih2KQotICAgICAgICAgIDogc3RhdGljX2Nhc3Q8dWludDY0Pih2KTsKLSAgfQotfTsKLQotc3RydWN0IExJQlBST1RPQlVGX0VYUE9SVCBBbHBoYU51bSB7Ci0gIGNvbnN0IGNoYXIgKnBpZWNlX2RhdGFfOyAgLy8gbW92ZSB0aGVzZSB0byBzdHJpbmdfcmVmIGV2ZW50dWFsbHkKLSAgc2l6ZV90IHBpZWNlX3NpemVfOyAgICAgICAvLyBtb3ZlIHRoZXNlIHRvIHN0cmluZ19yZWYgZXZlbnR1YWxseQotCi0gIGNoYXIgZGlnaXRzW2tGYXN0VG9CdWZmZXJTaXplXTsKLQotICAvLyBObyBib29sIGN0b3IgLS0gYm9vbHMgY29udmVydCB0byBhbiBpbnRlZ3JhbCB0eXBlLgotICAvLyBBIGJvb2wgY3RvciB3b3VsZCBhbHNvIGNvbnZlcnQgaW5jb21pbmcgcG9pbnRlcnMgKGJsZXRjaCkuCi0KLSAgQWxwaGFOdW0oaW50MzIgaTMyKQotICAgICAgOiBwaWVjZV9kYXRhXyhkaWdpdHMpLAotICAgICAgICBwaWVjZV9zaXplXyhGYXN0SW50MzJUb0J1ZmZlckxlZnQoaTMyLCBkaWdpdHMpIC0gJmRpZ2l0c1swXSkge30KLSAgQWxwaGFOdW0odWludDMyIHUzMikKLSAgICAgIDogcGllY2VfZGF0YV8oZGlnaXRzKSwKLSAgICAgICAgcGllY2Vfc2l6ZV8oRmFzdFVJbnQzMlRvQnVmZmVyTGVmdCh1MzIsIGRpZ2l0cykgLSAmZGlnaXRzWzBdKSB7fQotICBBbHBoYU51bShpbnQ2NCBpNjQpCi0gICAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksCi0gICAgICAgIHBpZWNlX3NpemVfKEZhc3RJbnQ2NFRvQnVmZmVyTGVmdChpNjQsIGRpZ2l0cykgLSAmZGlnaXRzWzBdKSB7fQotICBBbHBoYU51bSh1aW50NjQgdTY0KQotICAgICAgOiBwaWVjZV9kYXRhXyhkaWdpdHMpLAotICAgICAgICBwaWVjZV9zaXplXyhGYXN0VUludDY0VG9CdWZmZXJMZWZ0KHU2NCwgZGlnaXRzKSAtICZkaWdpdHNbMF0pIHt9Ci0KLSAgQWxwaGFOdW0oZmxvYXQgZikKLSAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksIHBpZWNlX3NpemVfKHN0cmxlbihGbG9hdFRvQnVmZmVyKGYsIGRpZ2l0cykpKSB7fQotICBBbHBoYU51bShkb3VibGUgZikKLSAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksIHBpZWNlX3NpemVfKHN0cmxlbihEb3VibGVUb0J1ZmZlcihmLCBkaWdpdHMpKSkge30KLQotICBBbHBoYU51bShIZXggaGV4KTsKLQotICBBbHBoYU51bShjb25zdCBjaGFyKiBjX3N0cikKLSAgICAgIDogcGllY2VfZGF0YV8oY19zdHIpLCBwaWVjZV9zaXplXyhzdHJsZW4oY19zdHIpKSB7fQotICAvLyBUT0RPOiBBZGQgYSBzdHJpbmdfcmVmIGNvbnN0cnVjdG9yLCBldmVudHVhbGx5Ci0gIC8vIEFscGhhTnVtKGNvbnN0IFN0cmluZ1BpZWNlICZwYykgOiBwaWVjZShwYykge30KLQotICBBbHBoYU51bShjb25zdCBzdHJpbmcmIHN0cikKLSAgICAgIDogcGllY2VfZGF0YV8oc3RyLmRhdGEoKSksIHBpZWNlX3NpemVfKHN0ci5zaXplKCkpIHt9Ci0KLSAgQWxwaGFOdW0oU3RyaW5nUGllY2Ugc3RyKQotICAgICAgOiBwaWVjZV9kYXRhXyhzdHIuZGF0YSgpKSwgcGllY2Vfc2l6ZV8oc3RyLnNpemUoKSkge30KLQotICBBbHBoYU51bShpbnRlcm5hbDo6U3RyaW5nUGllY2VQb2Qgc3RyKQotICAgICAgOiBwaWVjZV9kYXRhXyhzdHIuZGF0YSgpKSwgcGllY2Vfc2l6ZV8oc3RyLnNpemUoKSkge30KLQotICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHBpZWNlX3NpemVfOyB9Ci0gIGNvbnN0IGNoYXIgKmRhdGEoKSBjb25zdCB7IHJldHVybiBwaWVjZV9kYXRhXzsgfQotCi0gcHJpdmF0ZToKLSAgLy8gVXNlICI6IiBub3QgJzonCi0gIEFscGhhTnVtKGNoYXIgYyk7ICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKLQotICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ24uCi0gIEFscGhhTnVtKGNvbnN0IEFscGhhTnVtJik7Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEFscGhhTnVtJik7Ci19OwotCi19ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncwotCi11c2luZyBzdHJpbmdzOjpBbHBoYU51bTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gU3RyQ2F0KCkKLS8vICAgIFRoaXMgbWVyZ2VzIHRoZSBnaXZlbiBzdHJpbmdzIG9yIG51bWJlcnMsIHdpdGggbm8gZGVsaW1pdGVyLiAgVGhpcwotLy8gICAgaXMgZGVzaWduZWQgdG8gYmUgdGhlIGZhc3Rlc3QgcG9zc2libGUgd2F5IHRvIGNvbnN0cnVjdCBhIHN0cmluZyBvdXQKLS8vICAgIG9mIGEgbWl4IG9mIHJhdyBDIHN0cmluZ3MsIHN0cmluZ3MsIGJvb2wgdmFsdWVzLAotLy8gICAgYW5kIG51bWVyaWMgdmFsdWVzLgotLy8KLS8vICAgIERvbid0IHVzZSB0aGlzIGZvciB1c2VyLXZpc2libGUgc3RyaW5ncy4gIFRoZSBsb2NhbGl6YXRpb24gcHJvY2VzcwotLy8gICAgd29ya3MgcG9vcmx5IG9uIHN0cmluZ3MgYnVpbHQgdXAgb3V0IG9mIGZyYWdtZW50cy4KLS8vCi0vLyAgICBGb3IgY2xhcml0eSBhbmQgcGVyZm9ybWFuY2UsIGRvbid0IHVzZSBTdHJDYXQgd2hlbiBhcHBlbmRpbmcgdG8gYQotLy8gICAgc3RyaW5nLiAgSW4gcGFydGljdWxhciwgYXZvaWQgdXNpbmcgYW55IG9mIHRoZXNlIChhbnRpLSlwYXR0ZXJuczoKLS8vICAgICAgc3RyLmFwcGVuZChTdHJDYXQoLi4uKQotLy8gICAgICBzdHIgKz0gU3RyQ2F0KC4uLikKLS8vICAgICAgc3RyID0gU3RyQ2F0KHN0ciwgLi4uKQotLy8gICAgd2hlcmUgdGhlIGxhc3QgaXMgdGhlIHdvcnNlLCB3aXRoIHRoZSBwb3RlbnRpYWwgdG8gY2hhbmdlIGEgbG9vcAotLy8gICAgZnJvbSBhIGxpbmVhciB0aW1lIG9wZXJhdGlvbiB3aXRoIE8oMSkgZHluYW1pYyBhbGxvY2F0aW9ucyBpbnRvIGEKLS8vICAgIHF1YWRyYXRpYyB0aW1lIG9wZXJhdGlvbiB3aXRoIE8obikgZHluYW1pYyBhbGxvY2F0aW9ucy4gIFN0ckFwcGVuZAotLy8gICAgaXMgYSBiZXR0ZXIgY2hvaWNlIHRoYW4gYW55IG9mIHRoZSBhYm92ZSwgc3ViamVjdCB0byB0aGUgcmVzdHJpY3Rpb24KLS8vICAgIG9mIFN0ckFwcGVuZCgmc3RyLCBhLCBiLCBjLCAuLi4pIHRoYXQgbm9uZSBvZiB0aGUgYSwgYiwgYywgLi4uIG1heQotLy8gICAgYmUgYSByZWZlcmVuY2UgaW50byBzdHIuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYik7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYyk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYywgY29uc3QgQWxwaGFOdW0mIGQpOwotTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0mIGEsIGNvbnN0IEFscGhhTnVtJiBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGUpOwotTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0mIGEsIGNvbnN0IEFscGhhTnVtJiBiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGUsIGNvbnN0IEFscGhhTnVtJiBmKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBjLCBjb25zdCBBbHBoYU51bSYgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBlLCBjb25zdCBBbHBoYU51bSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBnKTsKLUxJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBjLCBjb25zdCBBbHBoYU51bSYgZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBlLCBjb25zdCBBbHBoYU51bSYgZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBnLCBjb25zdCBBbHBoYU51bSYgaCk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYywgY29uc3QgQWxwaGFOdW0mIGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZSwgY29uc3QgQWxwaGFOdW0mIGYsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZywgY29uc3QgQWxwaGFOdW0mIGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgaSk7Ci0KLWlubGluZSBzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhKSB7IHJldHVybiBzdHJpbmcoYS5kYXRhKCksIGEuc2l6ZSgpKTsgfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBTdHJBcHBlbmQoKQotLy8gICAgU2FtZSBhcyBhYm92ZSwgYnV0IGFkZHMgdGhlIG91dHB1dCB0byB0aGUgZ2l2ZW4gc3RyaW5nLgotLy8gICAgV0FSTklORzogRm9yIHNwZWVkLCBTdHJBcHBlbmQgZG9lcyBub3QgdHJ5IHRvIGNoZWNrIGVhY2ggb2YgaXRzIGlucHV0Ci0vLyAgICBhcmd1bWVudHMgdG8gYmUgc3VyZSB0aGF0IHRoZXkgYXJlIG5vdCBhIHN1YnNldCBvZiB0aGUgc3RyaW5nIGJlaW5nCi0vLyAgICBhcHBlbmRlZCB0by4gIFRoYXQgaXMsIHdoaWxlIHRoaXMgd2lsbCB3b3JrOgotLy8KLS8vICAgIHN0cmluZyBzID0gImZvbyI7Ci0vLyAgICBzICs9IHM7Ci0vLwotLy8gICAgVGhpcyB3aWxsIG5vdCAobmVjZXNzYXJpbHkpIHdvcms6Ci0vLwotLy8gICAgc3RyaW5nIHMgPSAiZm9vIjsKLS8vICAgIFN0ckFwcGVuZCgmcywgcyk7Ci0vLwotLy8gICAgTm90ZTogd2hpbGUgU3RyQ2F0IHN1cHBvcnRzIGFwcGVuZGluZyB1cCB0byA5IGFyZ3VtZW50cywgU3RyQXBwZW5kCi0vLyAgICBpcyBjdXJyZW50bHkgbGltaXRlZCB0byA0LiAgVGhhdCdzIHJhcmVseSBhbiBpc3N1ZSBleGNlcHQgd2hlbgotLy8gICAgYXV0b21hdGljYWxseSB0cmFuc2Zvcm1pbmcgU3RyQ2F0IHRvIFN0ckFwcGVuZCwgYW5kIGNhbiBlYXNpbHkgYmUKLS8vICAgIHdvcmtlZCBhcm91bmQgYXMgY29uc2VjdXRpdmUgY2FsbHMgdG8gU3RyQXBwZW5kIGFyZSBxdWl0ZSBlZmZpY2llbnQuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLUxJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFN0ckFwcGVuZChzdHJpbmcqIGRlc3QsIGNvbnN0IEFscGhhTnVtJiBhKTsKLUxJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFN0ckFwcGVuZChzdHJpbmcqIGRlc3QsIGNvbnN0IEFscGhhTnVtJiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBiKTsKLUxJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFN0ckFwcGVuZChzdHJpbmcqIGRlc3QsIGNvbnN0IEFscGhhTnVtJiBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBiLCBjb25zdCBBbHBoYU51bSYgYyk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJBcHBlbmQoc3RyaW5nKiBkZXN0LCBjb25zdCBBbHBoYU51bSYgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYiwgY29uc3QgQWxwaGFOdW0mIGMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGQpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBKb2luKCkKLS8vICAgIFRoZXNlIG1ldGhvZHMgY29uY2F0ZW5hdGUgYSByYW5nZSBvZiBjb21wb25lbnRzIGludG8gYSBDKysgc3RyaW5nLCB1c2luZwotLy8gICAgdGhlIEMtc3RyaW5nICJkZWxpbSIgYXMgYSBzZXBhcmF0b3IgYmV0d2VlbiBjb21wb25lbnRzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXJhdG9yPgotdm9pZCBKb2luKEl0ZXJhdG9yIHN0YXJ0LCBJdGVyYXRvciBlbmQsCi0gICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sIHN0cmluZyogcmVzdWx0KSB7Ci0gIGZvciAoSXRlcmF0b3IgaXQgPSBzdGFydDsgaXQgIT0gZW5kOyArK2l0KSB7Ci0gICAgaWYgKGl0ICE9IHN0YXJ0KSB7Ci0gICAgICByZXN1bHQtPmFwcGVuZChkZWxpbSk7Ci0gICAgfQotICAgIFN0ckFwcGVuZChyZXN1bHQsICppdCk7Ci0gIH0KLX0KLQotdGVtcGxhdGUgPHR5cGVuYW1lIFJhbmdlPgotc3RyaW5nIEpvaW4oY29uc3QgUmFuZ2UmIGNvbXBvbmVudHMsCi0gICAgICAgICAgICBjb25zdCBjaGFyKiBkZWxpbSkgewotICBzdHJpbmcgcmVzdWx0OwotICBKb2luKGNvbXBvbmVudHMuYmVnaW4oKSwgY29tcG9uZW50cy5lbmQoKSwgZGVsaW0sICZyZXN1bHQpOwotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBUb0hleCgpCi0vLyAgICBSZXR1cm4gYSBsb3dlci1jYXNlIGhleCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIGludGVnZXIuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFRvSGV4KHVpbnQ2NCBudW0pOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBHbG9iYWxSZXBsYWNlU3Vic3RyaW5nKCkKLS8vICAgIFJlcGxhY2VzIGFsbCBpbnN0YW5jZXMgb2YgYSBzdWJzdHJpbmcgaW4gYSBzdHJpbmcuICBEb2VzIG5vdGhpbmcKLS8vICAgIGlmICdzdWJzdHJpbmcnIGlzIGVtcHR5LiAgUmV0dXJucyB0aGUgbnVtYmVyIG9mIHJlcGxhY2VtZW50cy4KLS8vCi0vLyAgICBOT1RFOiBUaGUgc3RyaW5nIHBpZWNlcyBtdXN0IG5vdCBvdmVybGFwIHMuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgaW50IEdsb2JhbFJlcGxhY2VTdWJzdHJpbmcoY29uc3Qgc3RyaW5nJiBzdWJzdHJpbmcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiByZXBsYWNlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHMpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBCYXNlNjRVbmVzY2FwZSgpCi0vLyAgICBDb252ZXJ0cyAic3JjIiB3aGljaCBpcyBlbmNvZGVkIGluIEJhc2U2NCB0byBpdHMgYmluYXJ5IGVxdWl2YWxlbnQgYW5kCi0vLyAgICB3cml0ZXMgaXQgdG8gImRlc3QiLiBJZiBzcmMgY29udGFpbnMgaW52YWxpZCBjaGFyYWN0ZXJzLCBkZXN0IGlzIGNsZWFyZWQKLS8vICAgIGFuZCB0aGUgZnVuY3Rpb24gcmV0dXJucyBmYWxzZS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBCYXNlNjRVbmVzY2FwZShTdHJpbmdQaWVjZSBzcmMsIHN0cmluZyogZGVzdCk7Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIFdlYlNhZmVCYXNlNjRVbmVzY2FwZSgpCi0vLyAgICBUaGlzIGlzIGEgdmFyaWF0aW9uIG9mIEJhc2U2NFVuZXNjYXBlIHdoaWNoIHVzZXMgJy0nIGluc3RlYWQgb2YgJysnLCBhbmQKLS8vICAgICdfJyBpbnN0ZWFkIG9mICcvJy4gc3JjIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQsIGluc3RlYWQgc3BlY2lmeSBsZW4uIEkKLS8vICAgIHJlY29tbWVuZCB0aGF0IHNsZW48c3pkZXN0LCBidXQgd2UgaG9ub3Igc3pkZXN0IGFueXdheS4KLS8vICAgIFJFVFVSTlMgdGhlIGxlbmd0aCBvZiBkZXN0LCBvciAtMSBpZiBzcmMgY29udGFpbnMgaW52YWxpZCBjaGFycy4KLQotLy8gICAgVGhlIHZhcmlhdGlvbiB0aGF0IHN0b3JlcyBpbnRvIGEgc3RyaW5nIGNsZWFycyB0aGUgc3RyaW5nIGZpcnN0LCBhbmQKLS8vICAgIHJldHVybnMgZmFsc2UgKHdpdGggZGVzdCBlbXB0eSkgaWYgc3JjIGNvbnRhaW5zIGludmFsaWQgY2hhcnM7IGZvcgotLy8gICAgdGhpcyB2ZXJzaW9uIHNyYyBhbmQgZGVzdCBtdXN0IGJlIGRpZmZlcmVudCBzdHJpbmdzLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTElCUFJPVE9CVUZfRVhQT1JUIGludCBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoY29uc3QgY2hhciogc3JjLCBpbnQgc2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGRlc3QsIGludCBzemRlc3QpOwotTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgV2ViU2FmZUJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KTsKLQotLy8gUmV0dXJuIHRoZSBsZW5ndGggdG8gdXNlIGZvciB0aGUgb3V0cHV0IGJ1ZmZlciBnaXZlbiB0byB0aGUgYmFzZTY0IGVzY2FwZQotLy8gcm91dGluZXMuIE1ha2Ugc3VyZSB0byB1c2UgdGhlIHNhbWUgdmFsdWUgZm9yIGRvX3BhZGRpbmcgaW4gYm90aC4KLS8vIFRoaXMgZnVuY3Rpb24gbWF5IHJldHVybiBpbmNvcnJlY3QgcmVzdWx0cyBpZiBnaXZlbiBpbnB1dF9sZW4gdmFsdWVzIHRoYXQKLS8vIGFyZSBleHRyZW1lbHkgaGlnaCwgd2hpY2ggc2hvdWxkIGhhcHBlbiByYXJlbHkuCi1MSUJQUk9UT0JVRl9FWFBPUlQgaW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGRvX3BhZGRpbmcpOwotLy8gVXNlIHRoaXMgdmVyc2lvbiB3aGVuIGNhbGxpbmcgQmFzZTY0RXNjYXBlIHdpdGhvdXQgYSBkb19wYWRkaW5nIGFyZy4KLUxJQlBST1RPQlVGX0VYUE9SVCBpbnQgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihpbnQgaW5wdXRfbGVuKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQmFzZTY0RXNjYXBlKCkKLS8vIFdlYlNhZmVCYXNlNjRFc2NhcGUoKQotLy8gICAgRW5jb2RlICJzcmMiIHRvICJkZXN0IiB1c2luZyBiYXNlNjQgZW5jb2RpbmcuCi0vLyAgICBzcmMgaXMgbm90IG51bGwgdGVybWluYXRlZCwgaW5zdGVhZCBzcGVjaWZ5IGxlbi4KLS8vICAgICdkZXN0JyBzaG91bGQgaGF2ZSBhdCBsZWFzdCBDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKCkgbGVuZ3RoLgotLy8gICAgUkVUVVJOUyB0aGUgbGVuZ3RoIG9mIGRlc3QuCi0vLyAgICBUaGUgV2ViU2FmZSB2YXJpYXRpb24gdXNlICctJyBpbnN0ZWFkIG9mICcrJyBhbmQgJ18nIGluc3RlYWQgb2YgJy8nCi0vLyAgICBzbyB0aGF0IHdlIGNhbiBwbGFjZSB0aGUgb3V0IGluIHRoZSBVUkwgb3IgY29va2llcyB3aXRob3V0IGhhdmluZwotLy8gICAgdG8gZXNjYXBlIHRoZW0uICBJdCBhbHNvIGhhcyBhbiBleHRyYSBwYXJhbWV0ZXIgImRvX3BhZGRpbmciLAotLy8gICAgd2hpY2ggd2hlbiBzZXQgdG8gZmFsc2Ugd2lsbCBwcmV2ZW50IHBhZGRpbmcgd2l0aCAiPSIuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi1MSUJQUk9UT0JVRl9FWFBPUlQgaW50IEJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMsIGludCBzbGVuLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZGVzdCwgaW50IHN6ZGVzdCk7Ci1MSUJQUk9UT0JVRl9FWFBPUlQgaW50IFdlYlNhZmVCYXNlNjRFc2NhcGUoCi0gICAgY29uc3QgdW5zaWduZWQgY2hhciogc3JjLCBpbnQgc2xlbiwgY2hhciogZGVzdCwKLSAgICBpbnQgc3pkZXN0LCBib29sIGRvX3BhZGRpbmcpOwotLy8gRW5jb2RlIHNyYyBpbnRvIGRlc3Qgd2l0aCBwYWRkaW5nLgotTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgQmFzZTY0RXNjYXBlKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KTsKLS8vIEVuY29kZSBzcmMgaW50byBkZXN0IHdlYi1zYWZlbHkgd2l0aG91dCBwYWRkaW5nLgotTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgV2ViU2FmZUJhc2U2NEVzY2FwZShTdHJpbmdQaWVjZSBzcmMsIHN0cmluZyogZGVzdCk7Ci0vLyBFbmNvZGUgc3JjIGludG8gZGVzdCB3ZWItc2FmZWx5IHdpdGggcGFkZGluZy4KLUxJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFdlYlNhZmVCYXNlNjRFc2NhcGVXaXRoUGFkZGluZyhTdHJpbmdQaWVjZSBzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBkZXN0KTsKLQotTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgQmFzZTY0RXNjYXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHN6c3JjLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZGVzdCwgYm9vbCBkb19wYWRkaW5nKTsKLUxJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFdlYlNhZmVCYXNlNjRFc2NhcGUoY29uc3QgdW5zaWduZWQgY2hhciogc3JjLCBpbnQgc3pzcmMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZGVzdCwgYm9vbCBkb19wYWRkaW5nKTsKLQotaW5saW5lIGJvb2wgSXNWYWxpZENvZGVQb2ludCh1aW50MzIgY29kZV9wb2ludCkgewotICByZXR1cm4gY29kZV9wb2ludCA8IDB4RDgwMCB8fAotICAgICAgICAgKGNvZGVfcG9pbnQgPj0gMHhFMDAwICYmIGNvZGVfcG9pbnQgPD0gMHgxMEZGRkYpOwotfQotCi1zdGF0aWMgY29uc3QgaW50IFVURm1heCA9IDQ7Ci0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBFbmNvZGVBc1VURjhDaGFyKCkKLS8vICBIZWxwZXIgdG8gYXBwZW5kIGEgVW5pY29kZSBjb2RlIHBvaW50IHRvIGEgc3RyaW5nIGFzIFVURjgsIHdpdGhvdXQgYnJpbmdpbmcKLS8vICBpbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLiBUaGUgb3V0cHV0IGJ1ZmZlciBtdXN0IGJlIGFzIGxlYXN0IDQgYnl0ZXMKLS8vICBsYXJnZS4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxJQlBST1RPQlVGX0VYUE9SVCBpbnQgRW5jb2RlQXNVVEY4Q2hhcih1aW50MzIgY29kZV9wb2ludCwgY2hhciogb3V0cHV0KTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gVVRGOEZpcnN0TGV0dGVyTnVtQnl0ZXMoKQotLy8gICBMZW5ndGggb2YgdGhlIGZpcnN0IFVURi04IGNoYXJhY3Rlci4KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLUxJQlBST1RPQlVGX0VYUE9SVCBpbnQgVVRGOEZpcnN0TGV0dGVyTnVtQnl0ZXMoY29uc3QgY2hhciogc3JjLCBpbnQgbGVuKTsKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0KLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUlVUSUxfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDVkNjJmYzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsODEwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotCi0jaW5jbHVkZSA8bG9jYWxlLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBzbnByaW50ZiBfc25wcmludGYKLSNlbmRpZgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgewotCi0vLyBUT0RPKGtlbnRvbik6ICBDb3B5IHN0cnV0aWwgdGVzdHMgZnJvbSBnb29nbGUzPwotCi1URVNUKFN0cmluZ1V0aWxpdHlUZXN0LCBJbW11bmVUb0xvY2FsZXMpIHsKLSAgLy8gUmVtZW1iZXIgdGhlIG9sZCBsb2NhbGUuCi0gIGNoYXIqIG9sZF9sb2NhbGVfY3N0ciA9IHNldGxvY2FsZShMQ19OVU1FUklDLCBOVUxMKTsKLSAgQVNTRVJUX1RSVUUob2xkX2xvY2FsZV9jc3RyICE9IE5VTEwpOwotICBzdHJpbmcgb2xkX2xvY2FsZSA9IG9sZF9sb2NhbGVfY3N0cjsKLQotICAvLyBTZXQgdGhlIGxvY2FsZSB0byAiQyIuCi0gIEFTU0VSVF9UUlVFKHNldGxvY2FsZShMQ19OVU1FUklDLCAiQyIpICE9IE5VTEwpOwotCi0gIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRHRvYSgxLjUpKTsKLSAgRVhQRUNUX0VRKCIxLjUiLCBTaW1wbGVGdG9hKDEuNSkpOwotCi0gIGlmIChzZXRsb2NhbGUoTENfTlVNRVJJQywgImVzX0VTIikgPT0gTlVMTCAmJgotICAgICAgc2V0bG9jYWxlKExDX05VTUVSSUMsICJlc19FUy51dGY4IikgPT0gTlVMTCkgewotICAgIC8vIFNvbWUgc3lzdGVtcyBtYXkgbm90IGhhdmUgdGhlIGRlc2lyZWQgbG9jYWxlIGF2YWlsYWJsZS4KLSAgICBHT09HTEVfTE9HKFdBUk5JTkcpCi0gICAgICA8PCAiQ291bGRuJ3Qgc2V0IGxvY2FsZSB0byBlc19FUy4gIFNraXBwaW5nIHRoaXMgdGVzdC4iOwotICB9IGVsc2UgewotICAgIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRHRvYSgxLjUpKTsKLSAgICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUZ0b2EoMS41KSk7Ci0gIH0KLQotICAvLyBSZXR1cm4gdG8gb3JpZ2luYWwgbG9jYWxlLgotICBzZXRsb2NhbGUoTENfTlVNRVJJQywgb2xkX2xvY2FsZS5jX3N0cigpKTsKLX0KLQotI2RlZmluZSBFWFBFQ1RfRVFfQVJSQVkobGVuLCB4LCB5LCBtc2cpICAgICAgICAgICAgICAgICAgICAgXAotICBmb3IgKGludCBqID0gMDsgaiA8IGxlbjsgKytqKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIEVYUEVDVF9FUSh4W2pdLCB5W2pdKSA8PCAiIiAjIHggPDwgIiAhPSAiICMgeSAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICA8PCAiIGJ5dGUgIiA8PCBqIDw8ICI6ICIgPDwgbXNnOyAgXAotICB9Ci0KLXN0YXRpYyBzdHJ1Y3QgewotICBpbnQgcGxhaW5fbGVuZ3RoOwotICBjb25zdCBjaGFyKiBwbGFpbnRleHQ7Ci0gIGNvbnN0IGNoYXIqIGN5cGhlcnRleHQ7Ci19IGJhc2U2NF90ZXN0c1tdID0gewotICAvLyBFbXB0eSBzdHJpbmcuCi0gIHsgMCwgIiIsICIifSwKLQotICAvLyBCYXNpYyBiaXQgcGF0dGVybnM7Ci0gIC8vIHZhbHVlcyBvYnRhaW5lZCB3aXRoICJlY2hvIC1uICcuLi4nIHwgdXVlbmNvZGUgLW0gdGVzdCIKLQotICB7IDEsICJcMDAwIiwgIkFBPT0iIH0sCi0gIHsgMSwgIlwwMDEiLCAiQVE9PSIgfSwKLSAgeyAxLCAiXDAwMiIsICJBZz09IiB9LAotICB7IDEsICJcMDA0IiwgIkJBPT0iIH0sCi0gIHsgMSwgIlwwMTAiLCAiQ0E9PSIgfSwKLSAgeyAxLCAiXDAyMCIsICJFQT09IiB9LAotICB7IDEsICJcMDQwIiwgIklBPT0iIH0sCi0gIHsgMSwgIlwxMDAiLCAiUUE9PSIgfSwKLSAgeyAxLCAiXDIwMCIsICJnQT09IiB9LAotCi0gIHsgMSwgIlwzNzciLCAiL3c9PSIgfSwKLSAgeyAxLCAiXDM3NiIsICIvZz09IiB9LAotICB7IDEsICJcMzc1IiwgIi9RPT0iIH0sCi0gIHsgMSwgIlwzNzMiLCAiK3c9PSIgfSwKLSAgeyAxLCAiXDM2NyIsICI5dz09IiB9LAotICB7IDEsICJcMzU3IiwgIjd3PT0iIH0sCi0gIHsgMSwgIlwzMzciLCAiM3c9PSIgfSwKLSAgeyAxLCAiXDI3NyIsICJ2dz09IiB9LAotICB7IDEsICJcMTc3IiwgImZ3PT0iIH0sCi0gIHsgMiwgIlwwMDBcMDAwIiwgIkFBQT0iIH0sCi0gIHsgMiwgIlwwMDBcMDAxIiwgIkFBRT0iIH0sCi0gIHsgMiwgIlwwMDBcMDAyIiwgIkFBST0iIH0sCi0gIHsgMiwgIlwwMDBcMDA0IiwgIkFBUT0iIH0sCi0gIHsgMiwgIlwwMDBcMDEwIiwgIkFBZz0iIH0sCi0gIHsgMiwgIlwwMDBcMDIwIiwgIkFCQT0iIH0sCi0gIHsgMiwgIlwwMDBcMDQwIiwgIkFDQT0iIH0sCi0gIHsgMiwgIlwwMDBcMTAwIiwgIkFFQT0iIH0sCi0gIHsgMiwgIlwwMDBcMjAwIiwgIkFJQT0iIH0sCi0gIHsgMiwgIlwwMDFcMDAwIiwgIkFRQT0iIH0sCi0gIHsgMiwgIlwwMDJcMDAwIiwgIkFnQT0iIH0sCi0gIHsgMiwgIlwwMDRcMDAwIiwgIkJBQT0iIH0sCi0gIHsgMiwgIlwwMTBcMDAwIiwgIkNBQT0iIH0sCi0gIHsgMiwgIlwwMjBcMDAwIiwgIkVBQT0iIH0sCi0gIHsgMiwgIlwwNDBcMDAwIiwgIklBQT0iIH0sCi0gIHsgMiwgIlwxMDBcMDAwIiwgIlFBQT0iIH0sCi0gIHsgMiwgIlwyMDBcMDAwIiwgImdBQT0iIH0sCi0KLSAgeyAyLCAiXDM3N1wzNzciLCAiLy84PSIgfSwKLSAgeyAyLCAiXDM3N1wzNzYiLCAiLy80PSIgfSwKLSAgeyAyLCAiXDM3N1wzNzUiLCAiLy8wPSIgfSwKLSAgeyAyLCAiXDM3N1wzNzMiLCAiLy9zPSIgfSwKLSAgeyAyLCAiXDM3N1wzNjciLCAiLy9jPSIgfSwKLSAgeyAyLCAiXDM3N1wzNTciLCAiLys4PSIgfSwKLSAgeyAyLCAiXDM3N1wzMzciLCAiLzk4PSIgfSwKLSAgeyAyLCAiXDM3N1wyNzciLCAiLzc4PSIgfSwKLSAgeyAyLCAiXDM3N1wxNzciLCAiLzM4PSIgfSwKLSAgeyAyLCAiXDM3NlwzNzciLCAiL3Y4PSIgfSwKLSAgeyAyLCAiXDM3NVwzNzciLCAiL2Y4PSIgfSwKLSAgeyAyLCAiXDM3M1wzNzciLCAiKy84PSIgfSwKLSAgeyAyLCAiXDM2N1wzNzciLCAiOS84PSIgfSwKLSAgeyAyLCAiXDM1N1wzNzciLCAiNy84PSIgfSwKLSAgeyAyLCAiXDMzN1wzNzciLCAiMy84PSIgfSwKLSAgeyAyLCAiXDI3N1wzNzciLCAidi84PSIgfSwKLSAgeyAyLCAiXDE3N1wzNzciLCAiZi84PSIgfSwKLQotICB7IDMsICJcMDAwXDAwMFwwMDAiLCAiQUFBQSIgfSwKLSAgeyAzLCAiXDAwMFwwMDBcMDAxIiwgIkFBQUIiIH0sCi0gIHsgMywgIlwwMDBcMDAwXDAwMiIsICJBQUFDIiB9LAotICB7IDMsICJcMDAwXDAwMFwwMDQiLCAiQUFBRSIgfSwKLSAgeyAzLCAiXDAwMFwwMDBcMDEwIiwgIkFBQUkiIH0sCi0gIHsgMywgIlwwMDBcMDAwXDAyMCIsICJBQUFRIiB9LAotICB7IDMsICJcMDAwXDAwMFwwNDAiLCAiQUFBZyIgfSwKLSAgeyAzLCAiXDAwMFwwMDBcMTAwIiwgIkFBQkEiIH0sCi0gIHsgMywgIlwwMDBcMDAwXDIwMCIsICJBQUNBIiB9LAotICB7IDMsICJcMDAwXDAwMVwwMDAiLCAiQUFFQSIgfSwKLSAgeyAzLCAiXDAwMFwwMDJcMDAwIiwgIkFBSUEiIH0sCi0gIHsgMywgIlwwMDBcMDA0XDAwMCIsICJBQVFBIiB9LAotICB7IDMsICJcMDAwXDAxMFwwMDAiLCAiQUFnQSIgfSwKLSAgeyAzLCAiXDAwMFwwMjBcMDAwIiwgIkFCQUEiIH0sCi0gIHsgMywgIlwwMDBcMDQwXDAwMCIsICJBQ0FBIiB9LAotICB7IDMsICJcMDAwXDEwMFwwMDAiLCAiQUVBQSIgfSwKLSAgeyAzLCAiXDAwMFwyMDBcMDAwIiwgIkFJQUEiIH0sCi0gIHsgMywgIlwwMDFcMDAwXDAwMCIsICJBUUFBIiB9LAotICB7IDMsICJcMDAyXDAwMFwwMDAiLCAiQWdBQSIgfSwKLSAgeyAzLCAiXDAwNFwwMDBcMDAwIiwgIkJBQUEiIH0sCi0gIHsgMywgIlwwMTBcMDAwXDAwMCIsICJDQUFBIiB9LAotICB7IDMsICJcMDIwXDAwMFwwMDAiLCAiRUFBQSIgfSwKLSAgeyAzLCAiXDA0MFwwMDBcMDAwIiwgIklBQUEiIH0sCi0gIHsgMywgIlwxMDBcMDAwXDAwMCIsICJRQUFBIiB9LAotICB7IDMsICJcMjAwXDAwMFwwMDAiLCAiZ0FBQSIgfSwKLQotICB7IDMsICJcMzc3XDM3N1wzNzciLCAiLy8vLyIgfSwKLSAgeyAzLCAiXDM3N1wzNzdcMzc2IiwgIi8vLysiIH0sCi0gIHsgMywgIlwzNzdcMzc3XDM3NSIsICIvLy85IiB9LAotICB7IDMsICJcMzc3XDM3N1wzNzMiLCAiLy8vNyIgfSwKLSAgeyAzLCAiXDM3N1wzNzdcMzY3IiwgIi8vLzMiIH0sCi0gIHsgMywgIlwzNzdcMzc3XDM1NyIsICIvLy92IiB9LAotICB7IDMsICJcMzc3XDM3N1wzMzciLCAiLy8vZiIgfSwKLSAgeyAzLCAiXDM3N1wzNzdcMjc3IiwgIi8vKy8iIH0sCi0gIHsgMywgIlwzNzdcMzc3XDE3NyIsICIvLzkvIiB9LAotICB7IDMsICJcMzc3XDM3NlwzNzciLCAiLy83LyIgfSwKLSAgeyAzLCAiXDM3N1wzNzVcMzc3IiwgIi8vMy8iIH0sCi0gIHsgMywgIlwzNzdcMzczXDM3NyIsICIvL3YvIiB9LAotICB7IDMsICJcMzc3XDM2N1wzNzciLCAiLy9mLyIgfSwKLSAgeyAzLCAiXDM3N1wzNTdcMzc3IiwgIi8rLy8iIH0sCi0gIHsgMywgIlwzNzdcMzM3XDM3NyIsICIvOS8vIiB9LAotICB7IDMsICJcMzc3XDI3N1wzNzciLCAiLzcvLyIgfSwKLSAgeyAzLCAiXDM3N1wxNzdcMzc3IiwgIi8zLy8iIH0sCi0gIHsgMywgIlwzNzZcMzc3XDM3NyIsICIvdi8vIiB9LAotICB7IDMsICJcMzc1XDM3N1wzNzciLCAiL2YvLyIgfSwKLSAgeyAzLCAiXDM3M1wzNzdcMzc3IiwgIisvLy8iIH0sCi0gIHsgMywgIlwzNjdcMzc3XDM3NyIsICI5Ly8vIiB9LAotICB7IDMsICJcMzU3XDM3N1wzNzciLCAiNy8vLyIgfSwKLSAgeyAzLCAiXDMzN1wzNzdcMzc3IiwgIjMvLy8iIH0sCi0gIHsgMywgIlwyNzdcMzc3XDM3NyIsICJ2Ly8vIiB9LAotICB7IDMsICJcMTc3XDM3N1wzNzciLCAiZi8vLyIgfSwKLQotICAvLyBSYW5kb20gbnVtYmVyczogdmFsdWVzIG9idGFpbmVkIHdpdGgKLSAgLy8KLSAgLy8gICMhIC9iaW4vYmFzaAotICAvLyAgZGQgYnM9JDEgY291bnQ9MSBpZj0vZGV2L3JhbmRvbSBvZj0vdG1wL2Jhci5yYW5kb20KLSAgLy8gIG9kIC1OICQxIC10IG8xIC90bXAvYmFyLnJhbmRvbQotICAvLyAgdXVlbmNvZGUgLW0gdGVzdCA8IC90bXAvYmFyLnJhbmRvbQotICAvLwotICAvLyB3aGVyZSAkMSBpcyB0aGUgbnVtYmVyIG9mIGJ5dGVzICgyLCAzKQotCi0gIHsgMiwgIlwyNDNcMzYxIiwgIm8vRT0iIH0sCi0gIHsgMiwgIlwwMjRcMTY3IiwgIkZIYz0iIH0sCi0gIHsgMiwgIlwzMTNcMjUyIiwgInk2bz0iIH0sCi0gIHsgMiwgIlwwNDZcMDQxIiwgIkppRT0iIH0sCi0gIHsgMiwgIlwxNDVcMjM2IiwgIlpaND0iIH0sCi0gIHsgMiwgIlwyNTRcMzI1IiwgInJOVT0iIH0sCi0gIHsgMiwgIlwwNjFcMzMwIiwgIk1kZz0iIH0sCi0gIHsgMiwgIlwyNDVcMDMyIiwgInBSbz0iIH0sCi0gIHsgMiwgIlwwMDZcMDAwIiwgIkJnQT0iIH0sCi0gIHsgMiwgIlwzNzVcMTMxIiwgIi9Waz0iIH0sCi0gIHsgMiwgIlwzMDNcMjEwIiwgInc0Zz0iIH0sCi0gIHsgMiwgIlwwNDBcMDM3IiwgIklCOD0iIH0sCi0gIHsgMiwgIlwyNjFcMzcyIiwgInNmbz0iIH0sCi0gIHsgMiwgIlwzMzVcMDE0IiwgIjNRdz0iIH0sCi0gIHsgMiwgIlwyMzNcMjE3IiwgIm00OD0iIH0sCi0gIHsgMiwgIlwzNzNcMDU2IiwgIit5ND0iIH0sCi0gIHsgMiwgIlwyNDdcMjMyIiwgInA1bz0iIH0sCi0gIHsgMiwgIlwxMDdcMDUzIiwgIlJ5cz0iIH0sCi0gIHsgMiwgIlwyMDRcMDc3IiwgImhEOD0iIH0sCi0gIHsgMiwgIlwyNzZcMjExIiwgInZvaz0iIH0sCi0gIHsgMiwgIlwzMTNcMTEwIiwgInkwZz0iIH0sCi0gIHsgMiwgIlwzNjNcMzc2IiwgIjgvND0iIH0sCi0gIHsgMiwgIlwyNTFcMjM0IiwgInFadz0iIH0sCi0gIHsgMiwgIlwxMDNcMjYyIiwgIlE3ST0iIH0sCi0gIHsgMiwgIlwxNDJcMzEyIiwgIllzbz0iIH0sCi0gIHsgMiwgIlwwNjdcMjExIiwgIk40az0iIH0sCi0gIHsgMiwgIlwyMjBcMDAxIiwgImtBRT0iIH0sCi0gIHsgMiwgIlwxNTJcMjQwIiwgImFxQT0iIH0sCi0gIHsgMiwgIlwzNjdcMDYxIiwgIjl6RT0iIH0sCi0gIHsgMiwgIlwxMzNcMjU1IiwgIlc2MD0iIH0sCi0gIHsgMiwgIlwxNzZcMDM1IiwgImZoMD0iIH0sCi0gIHsgMiwgIlwwMzJcMjMxIiwgIkdwaz0iIH0sCi0KLSAgeyAzLCAiXDAxM1wwMDdcMTQ0IiwgIkN3ZGsiIH0sCi0gIHsgMywgIlwwMzBcMTEyXDEwNiIsICJHRXBHIiB9LAotICB7IDMsICJcMDQ3XDMyNVwwNDYiLCAiSjlVbSIgfSwKLSAgeyAzLCAiXDMxMFwxNjBcMDIyIiwgInlIQVMiIH0sCi0gIHsgMywgIlwxMzFcMTAwXDIzNyIsICJXVUNmIiB9LAotICB7IDMsICJcMDY0XDM0MlwxMzQiLCAiTk9KYyIgfSwKLSAgeyAzLCAiXDAxMFwxNzdcMDA0IiwgIkNIOEUiIH0sCi0gIHsgMywgIlwzNDVcMTQ3XDIwNSIsICI1V2VGIiB9LAotICB7IDMsICJcMzAwXDM0M1wzNjAiLCAid09QdyIgfSwKLSAgeyAzLCAiXDA2MVwyNDBcMjAxIiwgIk1hQ0IiIH0sCi0gIHsgMywgIlwyMjVcMzMzXDA0NCIsICJsZHNrIiB9LAotICB7IDMsICJcMjE1XDEzN1wzNTIiLCAialYvcSIgfSwKLSAgeyAzLCAiXDM3MVwxNDdcMTYwIiwgIitXZHciIH0sCi0gIHsgMywgIlwwMzBcMzIwXDA1MSIsICJHTkFwIiB9LAotICB7IDMsICJcMDQ0XDE3NFwyNDEiLCAiSkh5aCIgfSwKLSAgeyAzLCAiXDI2MFwxMjdcMDM3IiwgInNGY2YiIH0sCi0gIHsgMywgIlwxMTFcMDQ1XDAzMyIsICJTU1ViIiB9LAotICB7IDMsICJcMjAyXDExNFwxMDciLCAiZ2t4SCIgfSwKLSAgeyAzLCAiXDA1N1wzNzFcMDQyIiwgIkwva2kiIH0sCi0gIHsgMywgIlwyMjNcMjQ3XDI0NCIsICJrNmVrIiB9LAotICB7IDMsICJcMDQ3XDIxNlwxNDQiLCAiSjQ1ayIgfSwKLSAgeyAzLCAiXDIwM1wwNzBcMzI3IiwgImd6algiIH0sCi0gIHsgMywgIlwyNDdcMTQwXDA3MiIsICJwMkE2IiB9LAotICB7IDMsICJcMTI0XDExNVwxMTYiLCAiVkUxTyIgfSwKLSAgeyAzLCAiXDE1N1wxNjJcMDUwIiwgImIzSW8iIH0sCi0gIHsgMywgIlwzNTdcMjIzXDAwNCIsICI3NU1FIiB9LAotICB7IDMsICJcMDUyXDExN1wxNTYiLCAiS2s5dSIgfSwKLSAgeyAzLCAiXDM0N1wxNTRcMDAwIiwgIjUyd0EiIH0sCi0gIHsgMywgIlwzMDNcMDEyXDE0MiIsICJ3d3BpIiB9LAotICB7IDMsICJcMDYwXDAzNVwzNjIiLCAiTUIzeSIgfSwKLSAgeyAzLCAiXDEzMFwyMjZcMzYxIiwgIldKYngiIH0sCi0gIHsgMywgIlwxNzNcMDEzXDA3MSIsICJld3M1IiB9LAotICB7IDMsICJcMzM2XDAwNFwwMjciLCAiM2dRWCIgfSwKLSAgeyAzLCAiXDM1N1wzNjZcMjM0IiwgIjcvYWMiIH0sCi0gIHsgMywgIlwzNTNcMzA0XDExMSIsICI2OFJKIiB9LAotICB7IDMsICJcMDI0XDI2NFwxMzEiLCAiRkxSWiIgfSwKLSAgeyAzLCAiXDA3NVwxMTRcMjUxIiwgIlBVeXAiIH0sCi0gIHsgMywgIlwzMTVcMDMxXDIyNSIsICJ6Um1WIiB9LAotICB7IDMsICJcMTU0XDIwMVwyNzYiLCAiYklHKyIgfSwKLSAgeyAzLCAiXDIwMFwwNjZcMDcyIiwgImdEWTYiIH0sCi0gIHsgMywgIlwxNDJcMzUwXDI2NyIsICJZdWkzIiB9LAotICB7IDMsICJcMDMzXDAwMFwxNjYiLCAiR3dCMiIgfSwKLSAgeyAzLCAiXDIxMFwwNTVcMDc3IiwgImlDMC8iIH0sCi0gIHsgMywgIlwzNDFcMDM3XDEyNCIsICI0UjlVIiB9LAotICB7IDMsICJcMTYxXDEwM1wxNTIiLCAiY1VOcSIgfSwKLSAgeyAzLCAiXDI3MFwxNDJcMTMxIiwgInVHSloiIH0sCi0gIHsgMywgIlwzMzdcMDc2XDA3NCIsICIzejQ4IiB9LAotICB7IDMsICJcMzc1XDEwNlwzNjIiLCAiL1VieSIgfSwKLSAgeyAzLCAiXDIyN1wzMDFcMTI3IiwgImw4RlgiIH0sCi0gIHsgMywgIlwzNDBcMDAyXDIzNCIsICI0QUtjIiB9LAotICB7IDMsICJcMTIxXDA2NFwwMzMiLCAiVVRRYiIgfSwKLSAgeyAzLCAiXDE1N1wxMzRcMTQzIiwgImIxeGoiIH0sCi0gIHsgMywgIlwyNDdcMDU1XDMyNyIsICJweTNYIiB9LAotICB7IDMsICJcMzQwXDE0MlwwMDUiLCAiNEdJRiIgfSwKLSAgeyAzLCAiXDA2MFwyNjBcMTQzIiwgIk1MQmoiIH0sCi0gIHsgMywgIlwwNzVcMjAzXDE3MCIsICJQWU40IiB9LAotICB7IDMsICJcMTQzXDE2MFwwMTYiLCAiWTNBTyIgfSwKLSAgeyAzLCAiXDMxM1wwMTNcMDYzIiwgInl3c3oiIH0sCi0gIHsgMywgIlwxNzRcMjM2XDEzNSIsICJmSjVkIiB9LAotICB7IDMsICJcMTAzXDA0N1wwMjYiLCAiUXljVyIgfSwKLSAgeyAzLCAiXDM2NVwwMDVcMzQzIiwgIjlRWGoiIH0sCi0gIHsgMywgIlwyNzFcMTYwXDIyMyIsICJ1WENUIiB9LAotICB7IDMsICJcMzYyXDI1NVwxNzIiLCAiOHExNiIgfSwKLSAgeyAzLCAiXDExM1wwMTJcMDE1IiwgIlN3b04iIH0sCi0KLSAgLy8gdmFyaW91cyBsZW5ndGhzLCBnZW5lcmF0ZWQgYnkgdGhpcyBweXRob24gc2NyaXB0OgotICAvLwotICAvLyBmcm9tIHN0cmluZyBpbXBvcnQgbG93ZXJjYXNlIGFzIGxjCi0gIC8vIGZvciBpIGluIHJhbmdlKDI3KToKLSAgLy8gICBwcmludCAneyAlMmQsICIlcyIsJXMgIiVzIiB9LCcgJSAoaSwgbGNbOmldLCAnICcgKiAoMjYtaSksCi0gIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjWzppXS5lbmNvZGUoJ2Jhc2U2NCcpLnN0cmlwKCkpCi0KLSAgeyAgMCwgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIgfSwKLSAgeyAgMSwgImEiLCAgICAgICAgICAgICAgICAgICAgICAgICAgIllRPT0iIH0sCi0gIHsgIDIsICJhYiIsICAgICAgICAgICAgICAgICAgICAgICAgICJZV0k9IiB9LAotICB7ICAzLCAiYWJjIiwgICAgICAgICAgICAgICAgICAgICAgICAiWVdKaiIgfSwKLSAgeyAgNCwgImFiY2QiLCAgICAgICAgICAgICAgICAgICAgICAgIllXSmpaQT09IiB9LAotICB7ICA1LCAiYWJjZGUiLCAgICAgICAgICAgICAgICAgICAgICAiWVdKalpHVT0iIH0sCi0gIHsgIDYsICJhYmNkZWYiLCAgICAgICAgICAgICAgICAgICAgICJZV0pqWkdWbSIgfSwKLSAgeyAgNywgImFiY2RlZmciLCAgICAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWnc9PSIgfSwKLSAgeyAgOCwgImFiY2RlZmdoIiwgICAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWjJnPSIgfSwKLSAgeyAgOSwgImFiY2RlZmdoaSIsICAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWjJocCIgfSwKLSAgeyAxMCwgImFiY2RlZmdoaWoiLCAgICAgICAgICAgICAgICAgIllXSmpaR1ZtWjJocGFnPT0iIH0sCi0gIHsgMTEsICJhYmNkZWZnaGlqayIsICAgICAgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXM9IiB9LAotICB7IDEyLCAiYWJjZGVmZ2hpamtsIiwgICAgICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10cyIgfSwKLSAgeyAxMywgImFiY2RlZmdoaWprbG0iLCAgICAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiUT09IiB9LAotICB7IDE0LCAiYWJjZGVmZ2hpamtsbW4iLCAgICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXND0iIH0sCi0gIHsgMTUsICJhYmNkZWZnaGlqa2xtbm8iLCAgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1diIgfSwKLSAgeyAxNiwgImFiY2RlZmdoaWprbG1ub3AiLCAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0E9PSIgfSwKLSAgeyAxNywgImFiY2RlZmdoaWprbG1ub3BxIiwgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hFPSIgfSwKLSAgeyAxOCwgImFiY2RlZmdoaWprbG1ub3BxciIsICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeSIgfSwKLSAgeyAxOSwgImFiY2RlZmdoaWprbG1ub3BxcnMiLCAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWN3PT0iIH0sCi0gIHsgMjAsICJhYmNkZWZnaGlqa2xtbm9wcXJzdCIsICAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1E9IiB9LAotICB7IDIxLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1IiwgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMSIgfSwKLSAgeyAyMiwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXYiLCAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkZz09IiB9LAotICB7IDIzLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnciLCAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRuYz0iIH0sCi0gIHsgMjQsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2d3giLCAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5kNCIgfSwKLSAgeyAyNSwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHkiLCAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVE9PSIgfSwKLSAgeyAyNiwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IiwgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0ZVhvPSIgfSwKLX07Ci0KLXN0YXRpYyBzdHJ1Y3QgewotICBjb25zdCBjaGFyKiBwbGFpbnRleHQ7Ci0gIGNvbnN0IGNoYXIqIGN5cGhlcnRleHQ7Ci19IGJhc2U2NF9zdHJpbmdzW10gPSB7Ci0gIC8vIFNvbWUgZ29vZ2xlIHF1b3RlcwotICAvLyBDeXBoZXJ0ZXh0IGNyZWF0ZWQgd2l0aCAidXVlbmNvZGUgKEdOVSBzaGFydXRpbHMpIDQuNi4zIgotICAvLyAoTm90ZSB0aGF0IHdlJ3JlIHRlc3RpbmcgdGhlIHdlYnNhZmUgZW5jb2RpbmcsIHRob3VnaCwgc28gaWYKLSAgLy8geW91IGFkZCBtZXNzYWdlcywgYmUgc3VyZSB0byBydW4gInRyIC0tICcrLycgJy1fJyIgb24gdGhlIG91dHB1dCkKLSAgeyAiSSB3YXMgYWx3YXlzIGdvb2QgYXQgbWF0aCBhbmQgc2NpZW5jZSwgYW5kIEkgbmV2ZXIgcmVhbGl6ZWQgIgotICAgICJ0aGF0IHdhcyB1bnVzdWFsIG9yIHNvbWVob3cgdW5kZXNpcmFibGUuIFNvIG9uZSBvZiB0aGUgdGhpbmdzICIKLSAgICAiSSBjYXJlIGEgbG90IGFib3V0IGlzIGhlbHBpbmcgdG8gcmVtb3ZlIHRoYXQgc3RpZ21hLCAiCi0gICAgInRvIHNob3cgZ2lybHMgdGhhdCB5b3UgY2FuIGJlIGZlbWluaW5lLCB5b3UgY2FuIGxpa2UgdGhlIHRoaW5ncyAiCi0gICAgInRoYXQgZ2lybHMgbGlrZSwgYnV0IHlvdSBjYW4gYWxzbyBiZSByZWFsbHkgZ29vZCBhdCB0ZWNobm9sb2d5LiAiCi0gICAgIllvdSBjYW4gYmUgcmVhbGx5IGdvb2QgYXQgYnVpbGRpbmcgdGhpbmdzLiIKLSAgICAiIC0gTWFyaXNzYSBNZXllciwgTmV3c3dlZWssIDIwMTAtMTItMjIiICJcbiIsCi0KLSAgICAiU1NCM1lYTWdZV3gzWVhseklHZHZiMlFnWVhRZ2JXRjBhQ0JoYm1RZ2MyTnBaVzVqWlN3Z1lXNWtJRWtnIgotICAgICJibVYyWlhJZ2NtVmhiR2w2WldRZ2RHaGhkQ0IzWVhNZ2RXNTFjM1ZoYkNCdmNpQnpiMjFsYUc5M0lIVnUiCi0gICAgIlpHVnphWEpoWW14bExpQlRieUJ2Ym1VZ2IyWWdkR2hsSUhSb2FXNW5jeUJKSUdOaGNtVWdZU0JzYjNRZyIKLSAgICAiWVdKdmRYUWdhWE1nYUdWc2NHbHVaeUIwYnlCeVpXMXZkbVVnZEdoaGRDQnpkR2xuYldFc0lIUnZJSE5vIgotICAgICJiM2NnWjJseWJITWdkR2hoZENCNWIzVWdZMkZ1SUdKbElHWmxiV2x1YVc1bExDQjViM1VnWTJGdUlHeHAiCi0gICAgImEyVWdkR2hsSUhSb2FXNW5jeUIwYUdGMElHZHBjbXh6SUd4cGEyVXNJR0oxZENCNWIzVWdZMkZ1SUdGcyIKLSAgICAiYzI4Z1ltVWdjbVZoYkd4NUlHZHZiMlFnWVhRZ2RHVmphRzV2Ykc5bmVTNGdXVzkxSUdOaGJpQmlaU0J5IgotICAgICJaV0ZzYkhrZ1oyOXZaQ0JoZENCaWRXbHNaR2x1WnlCMGFHbHVaM011SUMwZ1RXRnlhWE56WVNCTlpYbGwiCi0gICAgImNpd2dUbVYzYzNkbFpXc3NJREl3TVRBdE1USXRNaklLIiB9LAotCi0gIHsgIlR5cGljYWwgZmlyc3QgeWVhciBmb3IgYSBuZXcgY2x1c3RlcjogIgotICAgICJ+MC41IG92ZXJoZWF0aW5nICIKLSAgICAifjEgUERVIGZhaWx1cmUgIgotICAgICJ+MSByYWNrLW1vdmUgIgotICAgICJ+MSBuZXR3b3JrIHJld2lyaW5nICIKLSAgICAifjIwIHJhY2sgZmFpbHVyZXMgIgotICAgICJ+NSByYWNrcyBnbyB3b25reSAiCi0gICAgIn44IG5ldHdvcmsgbWFpbnRlbmFuY2VzICIKLSAgICAifjEyIHJvdXRlciByZWxvYWRzICIKLSAgICAifjMgcm91dGVyIGZhaWx1cmVzICIKLSAgICAifmRvemVucyBvZiBtaW5vciAzMC1zZWNvbmQgYmxpcHMgZm9yIGRucyAiCi0gICAgIn4xMDAwIGluZGl2aWR1YWwgbWFjaGluZSBmYWlsdXJlcyAiCi0gICAgIn50aG91c2FuZHMgb2YgaGFyZCBkcml2ZSBmYWlsdXJlcyAiCi0gICAgInNsb3cgZGlza3MsIGJhZCBtZW1vcnksIG1pc2NvbmZpZ3VyZWQgbWFjaGluZXMsIGZsYWt5IG1hY2hpbmVzLCBldGMuIgotICAgICIgLSBKZWZmIERlYW4sIFRoZSBKb3lzIG9mIFJlYWwgSGFyZHdhcmUiICJcbiIsCi0KLSAgICAiVkhsd2FXTmhiQ0JtYVhKemRDQjVaV0Z5SUdadmNpQmhJRzVsZHlCamJIVnpkR1Z5T2lCLU1DNDFJRzkyIgotICAgICJaWEpvWldGMGFXNW5JSDR4SUZCRVZTQm1ZV2xzZFhKbElINHhJSEpoWTJzdGJXOTJaU0ItTVNCdVpYUjMiCi0gICAgImIzSnJJSEpsZDJseWFXNW5JSDR5TUNCeVlXTnJJR1poYVd4MWNtVnpJSDQxSUhKaFkydHpJR2R2SUhkdiIKLSAgICAiYm10NUlINDRJRzVsZEhkdmNtc2diV0ZwYm5SbGJtRnVZMlZ6SUg0eE1pQnliM1YwWlhJZ2NtVnNiMkZrIgotICAgICJjeUItTXlCeWIzVjBaWElnWm1GcGJIVnlaWE1nZm1SdmVtVnVjeUJ2WmlCdGFXNXZjaUF6TUMxelpXTnYiCi0gICAgImJtUWdZbXhwY0hNZ1ptOXlJR1J1Y3lCLU1UQXdNQ0JwYm1ScGRtbGtkV0ZzSUcxaFkyaHBibVVnWm1GcCIKLSAgICAiYkhWeVpYTWdmblJvYjNWellXNWtjeUJ2WmlCb1lYSmtJR1J5YVhabElHWmhhV3gxY21WeklITnNiM2NnIgotICAgICJaR2x6YTNNc0lHSmhaQ0J0WlcxdmNua3NJRzFwYzJOdmJtWnBaM1Z5WldRZ2JXRmphR2x1WlhNc0lHWnMiCi0gICAgIllXdDVJRzFoWTJocGJtVnpMQ0JsZEdNdUlDMGdTbVZtWmlCRVpXRnVMQ0JVYUdVZ1NtOTVjeUJ2WmlCUyIKLSAgICAiWldGc0lFaGhjbVIzWVhKbENnIiB9LAotCi0gIHsgIkknbSB0aGUgaGVhZCBvZiB0aGUgd2Vic3BhbSB0ZWFtIGF0IEdvb2dsZS4gICIKLSAgICAiVGhhdCBtZWFucyB0aGF0IGlmIHlvdSB0eXBlIHlvdXIgbmFtZSBpbnRvIEdvb2dsZSBhbmQgZ2V0IHBvcm4gYmFjaywgIgotICAgICJpdCdzIG15IGZhdWx0LiBVbmxlc3MgeW91J3JlIGEgcG9ybiBzdGFyLCBpbiB3aGljaCBjYXNlIHBvcm4gaXMgYSAiCi0gICAgImNvbXBsZXRlbHkgcmVhc29uYWJsZSByZXNwb25zZS4iCi0gICAgIiAtIE1hdHQgQ3V0dHMsIEdvb2dsZSBQbHVzIiAiXG4iLAotCi0gICAgIlNTZHRJSFJvWlNCb1pXRmtJRzltSUhSb1pTQjNaV0p6Y0dGdElIUmxZVzBnWVhRZ1IyOXZaMnhsTGlBZyIKLSAgICAiVkdoaGRDQnRaV0Z1Y3lCMGFHRjBJR2xtSUhsdmRTQjBlWEJsSUhsdmRYSWdibUZ0WlNCcGJuUnZJRWR2IgotICAgICJiMmRzWlNCaGJtUWdaMlYwSUhCdmNtNGdZbUZqYXl3Z2FYUW5jeUJ0ZVNCbVlYVnNkQzRnVlc1c1pYTnoiCi0gICAgIklIbHZkU2R5WlNCaElIQnZjbTRnYzNSaGNpd2dhVzRnZDJocFkyZ2dZMkZ6WlNCd2IzSnVJR2x6SUdFZyIKLSAgICAiWTI5dGNHeGxkR1ZzZVNCeVpXRnpiMjVoWW14bElISmxjM0J2Ym5ObExpQXRJRTFoZEhRZ1EzVjBkSE1zIgotICAgICJJRWR2YjJkc1pTQlFiSFZ6Q2ciIH0sCi0KLSAgeyAiSXQgd2lsbCBzdGlsbCBiZSBhIGxvbmcgdGltZSBiZWZvcmUgbWFjaGluZXMgYXBwcm9hY2ggaHVtYW4gaW50ZWxsaWdlbmNlLiAiCi0gICAgIkJ1dCBsdWNraWx5LCBtYWNoaW5lcyBkb24ndCBhY3R1YWxseSBoYXZlIHRvIGJlIGludGVsbGlnZW50OyAiCi0gICAgInRoZXkganVzdCBoYXZlIHRvIGZha2UgaXQuIEFjY2VzcyB0byBhIHdlYWx0aCBvZiBpbmZvcm1hdGlvbiwgIgotICAgICJjb21iaW5lZCB3aXRoIGEgcnVkaW1lbnRhcnkgZGVjaXNpb24tbWFraW5nIGNhcGFjaXR5LCAiCi0gICAgImNhbiBvZnRlbiBiZSBhbG1vc3QgYXMgdXNlZnVsLiBPZiBjb3Vyc2UsIHRoZSByZXN1bHRzIGFyZSBiZXR0ZXIgeWV0ICIKLSAgICAid2hlbiBjb3VwbGVkIHdpdGggaW50ZWxsaWdlbmNlLiBBIHJlZmVyZW5jZSBsaWJyYXJpYW4gd2l0aCBhY2Nlc3MgdG8gIgotICAgICJhIGdvb2Qgc2VhcmNoIGVuZ2luZSBpcyBhIGZvcm1pZGFibGUgdG9vbC4iCi0gICAgIiAtIENyYWlnIFNpbHZlcnN0ZWluLCBTaWVtZW5zIFBpY3R1cmVzIG9mIHRoZSBGdXR1cmUsIFNwcmluZyAyMDA0IiAiXG4iLAotCi0gICAgIlNYUWdkMmxzYkNCemRHbHNiQ0JpWlNCaElHeHZibWNnZEdsdFpTQmlaV1p2Y21VZ2JXRmphR2x1WlhNZyIKLSAgICAiWVhCd2NtOWhZMmdnYUhWdFlXNGdhVzUwWld4c2FXZGxibU5sTGlCQ2RYUWdiSFZqYTJsc2VTd2diV0ZqIgotICAgICJhR2x1WlhNZ1pHOXVKM1FnWVdOMGRXRnNiSGtnYUdGMlpTQjBieUJpWlNCcGJuUmxiR3hwWjJWdWREc2ciCi0gICAgImRHaGxlU0JxZFhOMElHaGhkbVVnZEc4Z1ptRnJaU0JwZEM0Z1FXTmpaWE56SUhSdklHRWdkMlZoYkhSbyIKLSAgICAiSUc5bUlHbHVabTl5YldGMGFXOXVMQ0JqYjIxaWFXNWxaQ0IzYVhSb0lHRWdjblZrYVcxbGJuUmhjbmtnIgotICAgICJaR1ZqYVhOcGIyNHRiV0ZyYVc1bklHTmhjR0ZqYVhSNUxDQmpZVzRnYjJaMFpXNGdZbVVnWVd4dGIzTjAiCi0gICAgIklHRnpJSFZ6WldaMWJDNGdUMllnWTI5MWNuTmxMQ0IwYUdVZ2NtVnpkV3gwY3lCaGNtVWdZbVYwZEdWeSIKLSAgICAiSUhsbGRDQjNhR1Z1SUdOdmRYQnNaV1FnZDJsMGFDQnBiblJsYkd4cFoyVnVZMlV1SUVFZ2NtVm1aWEpsIgotICAgICJibU5sSUd4cFluSmhjbWxoYmlCM2FYUm9JR0ZqWTJWemN5QjBieUJoSUdkdmIyUWdjMlZoY21Ob0lHVnUiCi0gICAgIloybHVaU0JwY3lCaElHWnZjbTFwWkdGaWJHVWdkRzl2YkM0Z0xTQkRjbUZwWnlCVGFXeDJaWEp6ZEdWcCIKLSAgICAiYml3Z1UybGxiV1Z1Y3lCUWFXTjBkWEpsY3lCdlppQjBhR1VnUm5WMGRYSmxMQ0JUY0hKcGJtY2dNakF3IgotICAgICJOQW8iIH0sCi0KLSAgLy8gRGVnZW5lcmF0ZSBlZGdlIGNhc2UKLSAgeyAiIiwKLSAgICAiIiB9LAotfTsKLQotVEVTVChCYXNlNjQsIEVzY2FwZUFuZFVuZXNjYXBlKSB7Ci0gIC8vIENoZWNrIHRoZSBzaG9ydCBzdHJpbmdzOyB0aGlzIHRlc3RzIHRoZSBtYXRoIChhbmQgYm91bmRhcmllcykKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YoYmFzZTY0X3Rlc3RzKSAvIHNpemVvZihiYXNlNjRfdGVzdHNbMF0pOyArK2kpIHsKLSAgICBjaGFyIGVuY29kZV9idWZmZXJbMTAwXTsKLSAgICBpbnQgZW5jb2RlX2xlbmd0aDsKLSAgICBjaGFyIGRlY29kZV9idWZmZXJbMTAwXTsKLSAgICBpbnQgZGVjb2RlX2xlbmd0aDsKLSAgICBpbnQgY3lwaGVyX2xlbmd0aDsKLSAgICBzdHJpbmcgZGVjb2RlX3N0cjsKLQotICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHVuc2lnbmVkX3BsYWludGV4dCA9Ci0gICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0KTsKLQotICAgIFN0cmluZ1BpZWNlIHBsYWludGV4dChiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKLQotICAgIGN5cGhlcl9sZW5ndGggPSBzdHJsZW4oYmFzZTY0X3Rlc3RzW2ldLmN5cGhlcnRleHQpOwotCi0gICAgLy8gVGhlIGJhc2ljIGVzY2FwZSBmdW5jdGlvbjoKLSAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKLSAgICBlbmNvZGVfbGVuZ3RoID0gQmFzZTY0RXNjYXBlKHVuc2lnbmVkX3BsYWludGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKLSAgICAvLyAgICBJcyBpdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPwotICAgIEVYUEVDVF9FUShlbmNvZGVfbGVuZ3RoLCBjeXBoZXJfbGVuZ3RoKTsKLSAgICAvLyBXb3VsZCBpdCBoYXZlIGJlZW4gb2theSB0byBhbGxvY2F0ZSBvbmx5IENhbGN1bGF0ZUJhc2U2NEVzY2FwZUxlbigpPwotICAgIEVYUEVDVF9FUShDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpLAotICAgICAgICAgICAgICBlbmNvZGVfbGVuZ3RoKTsKLQotICAgIC8vICAgIElzIGl0IHRoZSBleHBlY3RlZCBlbmNvZGVkIHZhbHVlPwotICAgIEFTU0VSVF9TVFJFUShlbmNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0uY3lwaGVydGV4dCk7Ci0KLSAgICAvLyBJZiB3ZSBlbmNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KLSAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKLSAgICBlbmNvZGVfbGVuZ3RoID0gQmFzZTY0RXNjYXBlKHVuc2lnbmVkX3BsYWludGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lwaGVyX2xlbmd0aCk7Ci0gICAgLy8gICAgSXMgaXQgc3RpbGwgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KLSAgICBFWFBFQ1RfRVEoZW5jb2RlX2xlbmd0aCwgY3lwaGVyX2xlbmd0aCk7Ci0KLSAgICAvLyAgICBBbmQgaXMgdGhlIHZhbHVlIHN0aWxsIGNvcnJlY3Q/ICAoaS5lLiwgbm90IGxvc2luZyB0aGUgbGFzdCBieXRlKQotICAgIEVYUEVDVF9TVFJFUShlbmNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0uY3lwaGVydGV4dCk7Ci0KLSAgICAvLyBJZiB3ZSBkZWNvZGUgaXQgYmFjazoKLSAgICBkZWNvZGVfc3RyLmNsZWFyKCk7Ci0gICAgRVhQRUNUX1RSVUUoQmFzZTY0VW5lc2NhcGUoCi0gICAgICAgIFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGN5cGhlcl9sZW5ndGgpLCAmZGVjb2RlX3N0cikpOwotCi0gICAgLy8gICAgSXMgaXQgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KLSAgICBFWFBFQ1RfRVEoYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwgZGVjb2RlX3N0ci5sZW5ndGgoKSk7Ci0KLSAgICAvLyAgICBJcyBpdCB0aGUgZXhwZWN0ZWQgZGVjb2RlZCB2YWx1ZT8KLSAgICBFWFBFQ1RfRVEocGxhaW50ZXh0LCBkZWNvZGVfc3RyKTsKLQotICAgIC8vIExldCdzIHRyeSB3aXRoIGEgcHJlLXBvcHVsYXRlZCBzdHJpbmcuCi0gICAgc3RyaW5nIGVuY29kZWQoInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCIpOwotICAgIEJhc2U2NEVzY2FwZShzdHJpbmcoYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpLAotICAgICAgICAgICAgICAgICAmZW5jb2RlZCk7Ci0gICAgRVhQRUNUX0VRKGVuY29kZWQsIHN0cmluZyhlbmNvZGVfYnVmZmVyLCBjeXBoZXJfbGVuZ3RoKSk7Ci0KLSAgICBzdHJpbmcgZGVjb2RlZCgidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIik7Ci0gICAgRVhQRUNUX1RSVUUoQmFzZTY0VW5lc2NhcGUoCi0gICAgICAgIFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGN5cGhlcl9sZW5ndGgpLCAmZGVjb2RlZCkpOwotICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7Ci0gICAgRVhQRUNUX0VRX0FSUkFZKGRlY29kZWQuc2l6ZSgpLCBkZWNvZGVkLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBpKTsKLQotICAgIC8vIE91ciBkZWNvZGVyIHRyZWF0cyB0aGUgcGFkZGluZyAnPScgY2hhcmFjdGVycyBhdCB0aGUgZW5kIGFzCi0gICAgLy8gb3B0aW9uYWwgKGJ1dCBpZiB0aGVyZSBhcmUgYW55LCB0aGVyZSBtdXN0IGJlIHRoZSBjb3JyZWN0Ci0gICAgLy8gbnVtYmVyIG9mIHRoZW0uKSAgSWYgZW5jb2RlX2J1ZmZlciBoYXMgYW55LCBydW4gc29tZSBhZGRpdGlvbmFsCi0gICAgLy8gdGVzdHMgdGhhdCBmaWRkbGUgd2l0aCB0aGVtLgotICAgIGNoYXIqIGZpcnN0X2VxdWFscyA9IHN0cmNocihlbmNvZGVfYnVmZmVyLCAnPScpOwotICAgIGlmIChmaXJzdF9lcXVhbHMpIHsKLSAgICAgIC8vIEhvdyBtYW55IGVxdWFscyBzaWducyBkb2VzIHRoZSBzdHJpbmcgc3RhcnQgd2l0aD8KLSAgICAgIGludCBlcXVhbHMgPSAoKihmaXJzdF9lcXVhbHMrMSkgPT0gJz0nKSA/IDIgOiAxOwotCi0gICAgICAvLyBUcnkgY2hvcHBpbmcgb2ZmIHRoZSBlcXVhbHMgc2lnbihzKSBlbnRpcmVseS4gIFRoZSBkZWNvZGVyCi0gICAgICAvLyBzaG91bGQgc3RpbGwgYmUgb2theSB3aXRoIHRoaXMuCi0gICAgICBzdHJpbmcgZGVjb2RlZDIoInRoaXMganVuayBzaG91bGQgYWxzbyBiZSBpZ25vcmVkIik7Ci0gICAgICAqZmlyc3RfZXF1YWxzID0gJ1wwJzsKLSAgICAgIEVYUEVDVF9UUlVFKEJhc2U2NFVuZXNjYXBlKAotICAgICAgICAgIFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGZpcnN0X2VxdWFscyAtIGVuY29kZV9idWZmZXIpLCAmZGVjb2RlZDIpKTsKLSAgICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7Ci0gICAgICBFWFBFQ1RfRVFfQVJSQVkoZGVjb2RlZC5zaXplKCksIGRlY29kZWQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGkpOwotCi0gICAgICAvLyBOb3cgdGVzdCBjaG9wcGluZyBvZmYgdGhlIGVxdWFscyBzaWduKHMpIGFuZCBhZGRpbmcKLSAgICAgIC8vIHdoaXRlc3BhY2UuICBPdXIgZGVjb2RlciBzaG91bGQgc3RpbGwgYWNjZXB0IHRoaXMuCi0gICAgICBkZWNvZGVkMi5hc3NpZ24oInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCIpOwotICAgICAgKmZpcnN0X2VxdWFscyA9ICcgJzsKLSAgICAgICooZmlyc3RfZXF1YWxzKzEpID0gJ1wwJzsKLSAgICAgIEVYUEVDVF9UUlVFKEJhc2U2NFVuZXNjYXBlKAotICAgICAgICAgIFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGZpcnN0X2VxdWFscyAtIGVuY29kZV9idWZmZXIgKyAxKSwKLSAgICAgICAgICAmZGVjb2RlZDIpKTsKLSAgICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7Ci0gICAgICBFWFBFQ1RfRVFfQVJSQVkoZGVjb2RlZC5zaXplKCksIGRlY29kZWQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGkpOwotCi0gICAgICAvLyBOb3cgc3RpY2sgYSBiYWQgY2hhcmFjdGVyIGF0IHRoZSBlbmQgb2YgdGhlIHN0cmluZy4gIFRoZSBkZWNvZGVyCi0gICAgICAvLyBzaG91bGQgcmVmdXNlIHRoaXMgc3RyaW5nLgotICAgICAgZGVjb2RlZDIuYXNzaWduKCJ0aGlzIGp1bmsgc2hvdWxkIGJlIGlnbm9yZWQiKTsKLSAgICAgICpmaXJzdF9lcXVhbHMgPSAnPyc7Ci0gICAgICAqKGZpcnN0X2VxdWFscysxKSA9ICdcMCc7Ci0gICAgICBFWFBFQ1RfVFJVRSgKLSAgICAgICAgICAhQmFzZTY0VW5lc2NhcGUoCi0gICAgICAgICAgICAgIFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGZpcnN0X2VxdWFscyAtIGVuY29kZV9idWZmZXIgKyAxKSwKLSAgICAgICAgICAgICAgJmRlY29kZWQyKSk7Ci0KLSAgICAgIGludCBsZW47Ci0KLSAgICAgIC8vIFRlc3Qgd2hpdGVzcGFjZSBtaXhlZCB3aXRoIHRoZSBwYWRkaW5nLiAgKGVnICJBQSA9ID0gIikgIFRoZQotICAgICAgLy8gZGVjb2RlciBzaG91bGQgYWNjZXB0IHRoaXMuCi0gICAgICBpZiAoZXF1YWxzID09IDIpIHsKLSAgICAgICAgc25wcmludGYoZmlyc3RfZXF1YWxzLCA2LCAiID0gPSAiKTsKLSAgICAgICAgbGVuID0gZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzbnByaW50ZihmaXJzdF9lcXVhbHMsIDYsICIgPSAiKTsKLSAgICAgICAgbGVuID0gZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDM7Ci0gICAgICB9Ci0gICAgICBkZWNvZGVkMi5hc3NpZ24oInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCIpOwotICAgICAgRVhQRUNUX1RSVUUoCi0gICAgICAgICAgQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgbGVuKSwgJmRlY29kZWQyKSk7Ci0gICAgICBFWFBFQ1RfRVEoZGVjb2RlZC5zaXplKCksIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOwotICAgICAgRVhQRUNUX0VRX0FSUkFZKGRlY29kZWQuc2l6ZSgpLCBkZWNvZGVkLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBpKTsKLQotICAgICAgLy8gVGVzdCB3aGl0ZXNwYWNlIG1peGVkIHdpdGggdGhlIHBhZGRpbmcsIGJ1dCB3aXRoIHRoZSB3cm9uZwotICAgICAgLy8gbnVtYmVyIG9mIGVxdWFscyBzaWducyAoZWcgIkFBID0gIikuICBUaGUgZGVjb2RlciBzaG91bGQKLSAgICAgIC8vIHJlZnVzZSB0aGVzZSBzdHJpbmdzLgotICAgICAgaWYgKGVxdWFscyA9PSAxKSB7Ci0gICAgICAgIHNucHJpbnRmKGZpcnN0X2VxdWFscywgNiwgIiA9ID0gIik7Ci0gICAgICAgIGxlbiA9IGZpcnN0X2VxdWFscyAtIGVuY29kZV9idWZmZXIgKyA1OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgc25wcmludGYoZmlyc3RfZXF1YWxzLCA2LCAiID0gIik7Ci0gICAgICAgIGxlbiA9IGZpcnN0X2VxdWFscyAtIGVuY29kZV9idWZmZXIgKyAzOwotICAgICAgfQotICAgICAgRVhQRUNUX1RSVUUoCi0gICAgICAgICAgIUJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGxlbiksICZkZWNvZGVkMikpOwotICAgIH0KLQotICAgIC8vIENvb2whIHRoZSBiYXNpYyBCYXNlNjQgZW5jb2Rlci9kZWNvZGVyIHdvcmtzLgotICAgIC8vIExldCdzIHRyeSB0aGUgYWx0ZXJuYXRlIGFscGhhYmV0OiB0ciAtLSAnKy8nICctXycKLQotICAgIGNoYXIgd2Vic2FmZVsxMDBdOwotICAgIG1lbXNldCh3ZWJzYWZlLCAwLCBzaXplb2Yod2Vic2FmZSkpOwotICAgIHN0cm5jcHkod2Vic2FmZSwgYmFzZTY0X3Rlc3RzW2ldLmN5cGhlcnRleHQsIGN5cGhlcl9sZW5ndGgpOwotICAgIGZvciAoaW50IGMgPSAwOyBjIDwgc2l6ZW9mKHdlYnNhZmUpOyArK2MpIHsKLSAgICAgIGlmICgnKycgPT0gd2Vic2FmZVtjXSkgeyB3ZWJzYWZlW2NdID0gJy0nOyB9Ci0gICAgICBpZiAoJy8nID09IHdlYnNhZmVbY10pIHsgd2Vic2FmZVtjXSA9ICdfJzsgfQotICAgIH0KLQotICAgIC8vIFRoZSB3ZWJzYWZlIGVzY2FwZSBmdW5jdGlvbjoKLSAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKLSAgICBlbmNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlbmNvZGVfYnVmZmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKLSAgICAvLyAgICBJcyBpdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPwotICAgIEVYUEVDVF9FUShlbmNvZGVfbGVuZ3RoLCBjeXBoZXJfbGVuZ3RoKTsKLSAgICBFWFBFQ1RfRVEoCi0gICAgICAgIENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwgdHJ1ZSksCi0gICAgICAgIGVuY29kZV9sZW5ndGgpOwotCi0gICAgLy8gICAgSXMgaXQgdGhlIGV4cGVjdGVkIGVuY29kZWQgdmFsdWU/Ci0gICAgRVhQRUNUX1NUUkVRKGVuY29kZV9idWZmZXIsIHdlYnNhZmUpOwotCi0gICAgLy8gICAgSWYgd2UgZW5jb2RlIGl0IGludG8gYSBidWZmZXIgb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLi4uCi0gICAgbWVtc2V0KGVuY29kZV9idWZmZXIsIDAsIHNpemVvZihlbmNvZGVfYnVmZmVyKSk7Ci0gICAgZW5jb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRFc2NhcGUodW5zaWduZWRfcGxhaW50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOwotICAgIC8vICAgIElzIGl0IHN0aWxsIG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/Ci0gICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGN5cGhlcl9sZW5ndGgpOwotCi0gICAgLy8gICAgQW5kIGlzIHRoZSB2YWx1ZSBzdGlsbCBjb3JyZWN0PyAgKGkuZS4sIG5vdCBsb3NpbmcgdGhlIGxhc3QgYnl0ZSkKLSAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgd2Vic2FmZSk7Ci0KLSAgICAvLyAgICBMZXQncyB0cnkgdGhlIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBlbmNvZGVyCi0gICAgZW5jb2RlZCA9ICJ0aGlzIGp1bmsgc2hvdWxkIGJlIGlnbm9yZWQiOwotICAgIFdlYlNhZmVCYXNlNjRFc2NhcGUoCi0gICAgICAgIHVuc2lnbmVkX3BsYWludGV4dCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKLSAgICAgICAgJmVuY29kZWQsIHRydWUpOwotICAgIEVYUEVDVF9FUShlbmNvZGVkLnNpemUoKSwgY3lwaGVyX2xlbmd0aCk7Ci0gICAgRVhQRUNUX1NUUkVRKGVuY29kZWQuY19zdHIoKSwgd2Vic2FmZSk7Ci0KLSAgICAvLyAgICBJZiB3ZSBkZWNvZGUgaXQgYmFjazoKLSAgICBtZW1zZXQoZGVjb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKLSAgICBkZWNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGVuY29kZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7Ci0KLSAgICAvLyAgICBJcyBpdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPwotICAgIEVYUEVDVF9FUShkZWNvZGVfbGVuZ3RoLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKLQotICAgIC8vICAgIElzIGl0IHRoZSBleHBlY3RlZCBkZWNvZGVkIHZhbHVlPwotICAgIEVYUEVDVF9FUSgwLAotICAgICAgICAgICAgICBtZW1jbXAoZGVjb2RlX2J1ZmZlciwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgZGVjb2RlX2xlbmd0aCkpOwotCi0gICAgLy8gICAgSWYgd2UgZGVjb2RlIGl0IGludG8gYSBidWZmZXIgb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLi4uCi0gICAgbWVtc2V0KGRlY29kZV9idWZmZXIsIDAsIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7Ci0gICAgZGVjb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRVbmVzY2FwZShlbmNvZGVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lwaGVyX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfbGVuZ3RoKTsKLQotICAgIC8vICAgIElzIGl0IHN0aWxsIG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/Ci0gICAgRVhQRUNUX0VRKGRlY29kZV9sZW5ndGgsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOwotCi0gICAgLy8gICAgQW5kIGlzIGl0IHRoZSBleHBlY3RlZCBkZWNvZGVkIHZhbHVlPwotICAgIEVYUEVDVF9FUSgwLAotICAgICAgICAgICAgICBtZW1jbXAoZGVjb2RlX2J1ZmZlciwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgZGVjb2RlX2xlbmd0aCkpOwotCi0gICAgLy8gVHJ5IHVzaW5nICcuJyBmb3IgdGhlIHBhZCBjaGFyYWN0ZXIuCi0gICAgZm9yIChpbnQgYyA9IGN5cGhlcl9sZW5ndGggLSAxOyBjID49IDAgJiYgJz0nID09IGVuY29kZV9idWZmZXJbY107IC0tYykgewotICAgICAgZW5jb2RlX2J1ZmZlcltjXSA9ICcuJzsKLSAgICB9Ci0KLSAgICAvLyBJZiB3ZSBkZWNvZGUgaXQgYmFjazoKLSAgICBtZW1zZXQoZGVjb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKLSAgICBkZWNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGVuY29kZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7Ci0KLSAgICAvLyBJcyBpdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPwotICAgIEVYUEVDVF9FUShkZWNvZGVfbGVuZ3RoLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKLQotICAgIC8vIElzIGl0IHRoZSBleHBlY3RlZCBkZWNvZGVkIHZhbHVlPwotICAgIEVYUEVDVF9FUSgwLAotICAgICAgICAgICAgICBtZW1jbXAoZGVjb2RlX2J1ZmZlciwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgZGVjb2RlX2xlbmd0aCkpOwotCi0gICAgLy8gSWYgd2UgZGVjb2RlIGl0IGludG8gYSBidWZmZXIgb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLi4uCi0gICAgbWVtc2V0KGRlY29kZV9idWZmZXIsIDAsIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7Ci0gICAgZGVjb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRVbmVzY2FwZShlbmNvZGVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lwaGVyX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfbGVuZ3RoKTsKLQotICAgIC8vIElzIGl0IHN0aWxsIG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/Ci0gICAgRVhQRUNUX0VRKGRlY29kZV9sZW5ndGgsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOwotCi0gICAgLy8gQW5kIGlzIGl0IHRoZSBleHBlY3RlZCBkZWNvZGVkIHZhbHVlPwotICAgIEVYUEVDVF9FUSgwLAotICAgICAgICAgICAgICBtZW1jbXAoZGVjb2RlX2J1ZmZlciwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgZGVjb2RlX2xlbmd0aCkpOwotCi0gICAgLy8gTGV0J3MgdHJ5IHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgZGVjb2RlcgotICAgIGRlY29kZWQgPSAidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIjsKLSAgICBFWFBFQ1RfVFJVRShXZWJTYWZlQmFzZTY0VW5lc2NhcGUoCi0gICAgICAgIFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGN5cGhlcl9sZW5ndGgpLCAmZGVjb2RlZCkpOwotICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7Ci0gICAgRVhQRUNUX0VRX0FSUkFZKGRlY29kZWQuc2l6ZSgpLCBkZWNvZGVkLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBpKTsKLQotICAgIC8vIE9rYXkhIHRoZSB3ZWJzYWZlIEJhc2U2NCBlbmNvZGVyL2RlY29kZXIgd29ya3MuCi0gICAgLy8gTGV0J3MgdHJ5IHRoZSB1bnBhZGRlZCB2ZXJzaW9uCi0KLSAgICBmb3IgKGludCBjID0gMDsgYyA8IHNpemVvZih3ZWJzYWZlKTsgKytjKSB7Ci0gICAgICBpZiAoJz0nID09IHdlYnNhZmVbY10pIHsKLSAgICAgICAgd2Vic2FmZVtjXSA9ICdcMCc7Ci0gICAgICAgIGN5cGhlcl9sZW5ndGggPSBjOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyBUaGUgd2Vic2FmZSBlc2NhcGUgZnVuY3Rpb246Ci0gICAgbWVtc2V0KGVuY29kZV9idWZmZXIsIDAsIHNpemVvZihlbmNvZGVfYnVmZmVyKSk7Ci0gICAgZW5jb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRFc2NhcGUodW5zaWduZWRfcGxhaW50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZW5jb2RlX2J1ZmZlciksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgIC8vICAgIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/Ci0gICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGN5cGhlcl9sZW5ndGgpOwotICAgIEVYUEVDVF9FUSgKLSAgICAgICAgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLCBmYWxzZSksCi0gICAgICAgIGVuY29kZV9sZW5ndGgpOwotCi0gICAgLy8gICAgSXMgaXQgdGhlIGV4cGVjdGVkIGVuY29kZWQgdmFsdWU/Ci0gICAgRVhQRUNUX1NUUkVRKGVuY29kZV9idWZmZXIsIHdlYnNhZmUpOwotCi0gICAgLy8gICAgSWYgd2UgZW5jb2RlIGl0IGludG8gYSBidWZmZXIgb2YgZXhhY3RseSB0aGUgcmlnaHQgbGVuZ3RoLi4uCi0gICAgbWVtc2V0KGVuY29kZV9idWZmZXIsIDAsIHNpemVvZihlbmNvZGVfYnVmZmVyKSk7Ci0gICAgZW5jb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRFc2NhcGUodW5zaWduZWRfcGxhaW50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5jb2RlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKTsKLSAgICAvLyAgICBJcyBpdCBzdGlsbCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPwotICAgIEVYUEVDVF9FUShlbmNvZGVfbGVuZ3RoLCBjeXBoZXJfbGVuZ3RoKTsKLQotICAgIC8vICAgIEFuZCBpcyB0aGUgdmFsdWUgc3RpbGwgY29ycmVjdD8gIChpLmUuLCBub3QgbG9zaW5nIHRoZSBsYXN0IGJ5dGUpCi0gICAgRVhQRUNUX1NUUkVRKGVuY29kZV9idWZmZXIsIHdlYnNhZmUpOwotCi0gICAgLy8gTGV0J3MgdHJ5IHRoZSAob3RoZXIpIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBlbmNvZGVyCi0gICAgc3RyaW5nIHBsYWluKGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOwotICAgIGVuY29kZWQgPSAidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIjsKLSAgICBXZWJTYWZlQmFzZTY0RXNjYXBlKHBsYWluLCAmZW5jb2RlZCk7Ci0gICAgRVhQRUNUX0VRKGVuY29kZWQuc2l6ZSgpLCBjeXBoZXJfbGVuZ3RoKTsKLSAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlZC5jX3N0cigpLCB3ZWJzYWZlKTsKLQotICAgIC8vICAgIElmIHdlIGRlY29kZSBpdCBiYWNrOgotICAgIG1lbXNldChkZWNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOwotICAgIGRlY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoZW5jb2RlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5cGhlcl9sZW5ndGgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmZmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKLQotICAgIC8vICAgIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/Ci0gICAgRVhQRUNUX0VRKGRlY29kZV9sZW5ndGgsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOwotCi0gICAgLy8gICAgSXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/Ci0gICAgRVhQRUNUX0VRKDAsCi0gICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7Ci0KLSAgICAvLyAgICBJZiB3ZSBkZWNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KLSAgICBtZW1zZXQoZGVjb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKLSAgICBkZWNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGVuY29kZV9idWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9sZW5ndGgpOwotCi0gICAgLy8gICAgSXMgaXQgc3RpbGwgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KLSAgICBFWFBFQ1RfRVEoZGVjb2RlX2xlbmd0aCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7Ci0KLSAgICAvLyAgICBBbmQgaXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/Ci0gICAgRVhQRUNUX0VRKDAsCi0gICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7Ci0KLQotICAgIC8vIExldCdzIHRyeSB0aGUgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGRlY29kZXIKLSAgICBkZWNvZGVkID0gInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCI7Ci0gICAgRVhQRUNUX1RSVUUoV2ViU2FmZUJhc2U2NFVuZXNjYXBlKAotICAgICAgICBTdHJpbmdQaWVjZShlbmNvZGVfYnVmZmVyLCBjeXBoZXJfbGVuZ3RoKSwgJmRlY29kZWQpKTsKLSAgICBFWFBFQ1RfRVEoZGVjb2RlZC5zaXplKCksIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOwotICAgIEVYUEVDVF9FUV9BUlJBWShkZWNvZGVkLnNpemUoKSwgZGVjb2RlZCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgaSk7Ci0KLSAgICAvLyBUaGlzIHZhbHVlIHdvcmtzLiAgVHJ5IHRoZSBuZXh0LgotICB9Ci0KLSAgLy8gTm93IHRyeSB0aGUgbG9uZyBzdHJpbmdzLCB0aGlzIHRlc3RzIHRoZSBzdHJlYW1pbmcKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplb2YoYmFzZTY0X3N0cmluZ3MpIC8gc2l6ZW9mKGJhc2U2NF9zdHJpbmdzWzBdKTsKLSAgICAgICArK2kpIHsKLSAgICBjb25zdCB1bnNpZ25lZCBjaGFyKiB1bnNpZ25lZF9wbGFpbnRleHQgPQotICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1bnNpZ25lZCBjaGFyKj4oYmFzZTY0X3N0cmluZ3NbaV0ucGxhaW50ZXh0KTsKLSAgICBpbnQgcGxhaW5fbGVuZ3RoID0gc3RybGVuKGJhc2U2NF9zdHJpbmdzW2ldLnBsYWludGV4dCk7Ci0gICAgaW50IGN5cGhlcl9sZW5ndGggPSBzdHJsZW4oYmFzZTY0X3N0cmluZ3NbaV0uY3lwaGVydGV4dCk7Ci0gICAgdmVjdG9yPGNoYXI+IGJ1ZmZlcihjeXBoZXJfbGVuZ3RoKzEpOwotICAgIGludCBlbmNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWluX2xlbmd0aCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJ1ZmZlclswXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOwotICAgIEVYUEVDVF9FUShjeXBoZXJfbGVuZ3RoLCBlbmNvZGVfbGVuZ3RoKTsKLSAgICBFWFBFQ1RfRVEoCi0gICAgICAgIENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4ocGxhaW5fbGVuZ3RoLCBmYWxzZSksIGVuY29kZV9sZW5ndGgpOwotICAgIGJ1ZmZlclsgZW5jb2RlX2xlbmd0aCBdID0gJ1wwJzsKLSAgICBFWFBFQ1RfU1RSRVEoYmFzZTY0X3N0cmluZ3NbaV0uY3lwaGVydGV4dCwgJmJ1ZmZlclswXSk7Ci0gIH0KLQotICAvLyBWZXJpZnkgdGhlIGJlaGF2aW9yIHdoZW4gZGVjb2RpbmcgYmFkIGRhdGEKLSAgewotICAgIGNvbnN0IGNoYXIqIGJhZF9kYXRhID0gImFiLS8iOwotICAgIHN0cmluZyBidWY7Ci0gICAgRVhQRUNUX0ZBTFNFKEJhc2U2NFVuZXNjYXBlKFN0cmluZ1BpZWNlKGJhZF9kYXRhKSwgJmJ1ZikpOwotICAgIEVYUEVDVF9UUlVFKCFXZWJTYWZlQmFzZTY0VW5lc2NhcGUoYmFkX2RhdGEsICZidWYpKTsKLSAgICBFWFBFQ1RfVFJVRShidWYuZW1wdHkoKSk7Ci0gIH0KLX0KLQotfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM5ZDk1ODkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTM0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBzdHJpbmdzIHsKLQotdXNpbmcgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmc7Ci0KLS8vIFJldHVybnMgdGhlIG51bWJlciBvZiBhcmdzIGluIGFyZ19hcnJheSB3aGljaCB3ZXJlIHBhc3NlZCBleHBsaWNpdGx5Ci0vLyB0byBTdWJzdGl0dXRlKCkuCi1zdGF0aWMgaW50IENvdW50U3Vic3RpdHV0ZUFyZ3MoY29uc3QgU3Vic3RpdHV0ZUFyZyogY29uc3QqIGFyZ3NfYXJyYXkpIHsKLSAgaW50IGNvdW50ID0gMDsKLSAgd2hpbGUgKGFyZ3NfYXJyYXlbY291bnRdICE9IE5VTEwgJiYgYXJnc19hcnJheVtjb3VudF0tPnNpemUoKSAhPSAtMSkgewotICAgICsrY291bnQ7Ci0gIH0KLSAgcmV0dXJuIGNvdW50OwotfQotCi1zdHJpbmcgU3Vic3RpdHV0ZSgKLSAgICBjb25zdCBjaGFyKiBmb3JtYXQsCi0gICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMCwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMSwKLSAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmcyLCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmczLAotICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzQsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzUsCi0gICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNiwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnNywKLSAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc4LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc5KSB7Ci0gIHN0cmluZyByZXN1bHQ7Ci0gIFN1YnN0aXR1dGVBbmRBcHBlbmQoJnJlc3VsdCwgZm9ybWF0LCBhcmcwLCBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCwgYXJnOSk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLXZvaWQgU3Vic3RpdHV0ZUFuZEFwcGVuZCgKLSAgICBzdHJpbmcqIG91dHB1dCwgY29uc3QgY2hhciogZm9ybWF0LAotICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzAsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzEsCi0gICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMiwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnMywKLSAgICBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc0LCBjb25zdCBTdWJzdGl0dXRlQXJnJiBhcmc1LAotICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzYsIGNvbnN0IFN1YnN0aXR1dGVBcmcmIGFyZzcsCi0gICAgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnOCwgY29uc3QgU3Vic3RpdHV0ZUFyZyYgYXJnOSkgewotICBjb25zdCBTdWJzdGl0dXRlQXJnKiBjb25zdCBhcmdzX2FycmF5W10gPSB7Ci0gICAgJmFyZzAsICZhcmcxLCAmYXJnMiwgJmFyZzMsICZhcmc0LCAmYXJnNSwgJmFyZzYsICZhcmc3LCAmYXJnOCwgJmFyZzksIE5VTEwKLSAgfTsKLQotICAvLyBEZXRlcm1pbmUgdG90YWwgc2l6ZSBuZWVkZWQuCi0gIGludCBzaXplID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGZvcm1hdFtpXSAhPSAnXDAnOyBpKyspIHsKLSAgICBpZiAoZm9ybWF0W2ldID09ICckJykgewotICAgICAgaWYgKGFzY2lpX2lzZGlnaXQoZm9ybWF0W2krMV0pKSB7Ci0gICAgICAgIGludCBpbmRleCA9IGZvcm1hdFtpKzFdIC0gJzAnOwotICAgICAgICBpZiAoYXJnc19hcnJheVtpbmRleF0tPnNpemUoKSA9PSAtMSkgewotICAgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKQotICAgICAgICAgICAgPDwgInN0cmluZ3M6OlN1YnN0aXR1dGUgZm9ybWF0IHN0cmluZyBpbnZhbGlkOiBhc2tlZCBmb3IgXCIkIgotICAgICAgICAgICAgPDwgaW5kZXggPDwgIlwiLCBidXQgb25seSAiIDw8IENvdW50U3Vic3RpdHV0ZUFyZ3MoYXJnc19hcnJheSkKLSAgICAgICAgICAgIDw8ICIgYXJncyB3ZXJlIGdpdmVuLiAgRnVsbCBmb3JtYXQgc3RyaW5nIHdhczogXCIiCi0gICAgICAgICAgICA8PCBDRXNjYXBlKGZvcm1hdCkgPDwgIlwiLiI7Ci0gICAgICAgICAgcmV0dXJuOwotICAgICAgICB9Ci0gICAgICAgIHNpemUgKz0gYXJnc19hcnJheVtpbmRleF0tPnNpemUoKTsKLSAgICAgICAgKytpOyAgLy8gU2tpcCBuZXh0IGNoYXIuCi0gICAgICB9IGVsc2UgaWYgKGZvcm1hdFtpKzFdID09ICckJykgewotICAgICAgICArK3NpemU7Ci0gICAgICAgICsraTsgIC8vIFNraXAgbmV4dCBjaGFyLgotICAgICAgfSBlbHNlIHsKLSAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpCi0gICAgICAgICAgPDwgIkludmFsaWQgc3RyaW5nczo6U3Vic3RpdHV0ZSgpIGZvcm1hdCBzdHJpbmc6IFwiIgotICAgICAgICAgIDw8IENFc2NhcGUoZm9ybWF0KSA8PCAiXCIuIjsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICArK3NpemU7Ci0gICAgfQotICB9Ci0KLSAgaWYgKHNpemUgPT0gMCkgcmV0dXJuOwotCi0gIC8vIEJ1aWxkIHRoZSBzdHJpbmcuCi0gIGludCBvcmlnaW5hbF9zaXplID0gb3V0cHV0LT5zaXplKCk7Ci0gIFNUTFN0cmluZ1Jlc2l6ZVVuaW5pdGlhbGl6ZWQob3V0cHV0LCBvcmlnaW5hbF9zaXplICsgc2l6ZSk7Ci0gIGNoYXIqIHRhcmdldCA9IHN0cmluZ19hc19hcnJheShvdXRwdXQpICsgb3JpZ2luYWxfc2l6ZTsKLSAgZm9yIChpbnQgaSA9IDA7IGZvcm1hdFtpXSAhPSAnXDAnOyBpKyspIHsKLSAgICBpZiAoZm9ybWF0W2ldID09ICckJykgewotICAgICAgaWYgKGFzY2lpX2lzZGlnaXQoZm9ybWF0W2krMV0pKSB7Ci0gICAgICAgIGNvbnN0IFN1YnN0aXR1dGVBcmcqIHNyYyA9IGFyZ3NfYXJyYXlbZm9ybWF0W2krMV0gLSAnMCddOwotICAgICAgICBtZW1jcHkodGFyZ2V0LCBzcmMtPmRhdGEoKSwgc3JjLT5zaXplKCkpOwotICAgICAgICB0YXJnZXQgKz0gc3JjLT5zaXplKCk7Ci0gICAgICAgICsraTsgIC8vIFNraXAgbmV4dCBjaGFyLgotICAgICAgfSBlbHNlIGlmIChmb3JtYXRbaSsxXSA9PSAnJCcpIHsKLSAgICAgICAgKnRhcmdldCsrID0gJyQnOwotICAgICAgICArK2k7ICAvLyBTa2lwIG5leHQgY2hhci4KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgKnRhcmdldCsrID0gZm9ybWF0W2ldOwotICAgIH0KLSAgfQotCi0gIEdPT0dMRV9EQ0hFQ0tfRVEodGFyZ2V0IC0gb3V0cHV0LT5kYXRhKCksIG91dHB1dC0+c2l6ZSgpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2VlNDQyYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDE3MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gZnJvbSBnb29nbGUzL3N0cmluZ3Mvc3Vic3RpdHV0ZS5oCi0KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NVQlNUSVRVVEVfSF8KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NVQlNUSVRVVEVfSF8KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHN0cmluZ3MgewotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBzdHJpbmdzOjpTdWJzdGl0dXRlKCkKLS8vIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoKQotLy8gICBLaW5kIG9mIGxpa2UgU3RyaW5nUHJpbnRmLCBidXQgZGlmZmVyZW50LgotLy8KLS8vICAgRXhhbXBsZToKLS8vICAgICBzdHJpbmcgR2V0TWVzc2FnZShzdHJpbmcgZmlyc3RfbmFtZSwgc3RyaW5nIGxhc3RfbmFtZSwgaW50IGFnZSkgewotLy8gICAgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoIk15IG5hbWUgaXMgJDAgJDEgYW5kIEkgYW0gJDIgeWVhcnMgb2xkLiIsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaXJzdF9uYW1lLCBsYXN0X25hbWUsIGFnZSk7Ci0vLyAgICAgfQotLy8KLS8vICAgRGlmZmVyZW5jZXMgZnJvbSBTdHJpbmdQcmludGY6Ci0vLyAgICogVGhlIGZvcm1hdCBzdHJpbmcgZG9lcyBub3QgaWRlbnRpZnkgdGhlIHR5cGVzIG9mIGFyZ3VtZW50cy4KLS8vICAgICBJbnN0ZWFkLCB0aGUgbWFnaWMgb2YgQysrIGRlYWxzIHdpdGggdGhpcyBmb3IgdXMuICBTZWUgYmVsb3cKLS8vICAgICBmb3IgYSBsaXN0IG9mIGFjY2VwdGVkIHR5cGVzLgotLy8gICAqIFN1YnN0aXR1dGlvbnMgaW4gdGhlIGZvcm1hdCBzdHJpbmcgYXJlIGlkZW50aWZpZWQgYnkgYSAnJCcKLS8vICAgICBmb2xsb3dlZCBieSBhIGRpZ2l0LiAgU28sIHlvdSBjYW4gdXNlIGFyZ3VtZW50cyBvdXQtb2Ytb3JkZXIgYW5kCi0vLyAgICAgdXNlIHRoZSBzYW1lIGFyZ3VtZW50IG11bHRpcGxlIHRpbWVzLgotLy8gICAqIEl0J3MgbXVjaCBmYXN0ZXIgdGhhbiBTdHJpbmdQcmludGYuCi0vLwotLy8gICBTdXBwb3J0ZWQgdHlwZXM6Ci0vLyAgICogU3RyaW5ncyAoY29uc3QgY2hhciosIGNvbnN0IHN0cmluZyYpCi0vLyAgICAgKiBOb3RlIHRoYXQgdGhpcyBtZWFucyB5b3UgZG8gbm90IGhhdmUgdG8gYWRkIC5jX3N0cigpIHRvIGFsbCBvZgotLy8gICAgICAgeW91ciBzdHJpbmdzLiAgSW4gZmFjdCwgeW91IHNob3VsZG4ndDsgaXQgd2lsbCBiZSBzbG93ZXIuCi0vLyAgICogaW50MzIsIGludDY0LCB1aW50MzIsIHVpbnQ2NDogIEZvcm1hdHRlZCB1c2luZyBTaW1wbGVJdG9hKCkuCi0vLyAgICogZmxvYXQsIGRvdWJsZTogIEZvcm1hdHRlZCB1c2luZyBTaW1wbGVGdG9hKCkgYW5kIFNpbXBsZUR0b2EoKS4KLS8vICAgKiBib29sOiAgUHJpbnRlZCBhcyAidHJ1ZSIgb3IgImZhbHNlIi4KLS8vCi0vLyAgIFN1YnN0aXR1dGVBbmRBcHBlbmQoKSBpcyBsaWtlIFN1YnN0aXR1dGUoKSBidXQgYXBwZW5kcyB0aGUgcmVzdWx0IHRvCi0vLyAgICpvdXRwdXQuICBFeGFtcGxlOgotLy8KLS8vICAgICBzdHJpbmcgc3RyOwotLy8gICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJnN0ciwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJNeSBuYW1lIGlzICQwICQxIGFuZCBJIGFtICQyIHllYXJzIG9sZC4iLAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlyc3RfbmFtZSwgbGFzdF9uYW1lLCBhZ2UpOwotLy8KLS8vICAgU3Vic3RpdHV0ZSgpIGlzIHNpZ25pZmljYW50bHkgZmFzdGVyIHRoYW4gU3RyaW5nUHJpbnRmKCkuICBGb3IgdmVyeQotLy8gICBsYXJnZSBzdHJpbmdzLCBpdCBtYXkgYmUgb3JkZXJzIG9mIG1hZ25pdHVkZSBmYXN0ZXIuCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7ICAvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzLgotCi1jbGFzcyBTdWJzdGl0dXRlQXJnIHsKLSBwdWJsaWM6Ci0gIGlubGluZSBTdWJzdGl0dXRlQXJnKGNvbnN0IGNoYXIqIHZhbHVlKQotICAgIDogdGV4dF8odmFsdWUpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQotICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhjb25zdCBzdHJpbmcmIHZhbHVlKQotICAgIDogdGV4dF8odmFsdWUuZGF0YSgpKSwgc2l6ZV8odmFsdWUuc2l6ZSgpKSB7fQotCi0gIC8vIEluZGljYXRlcyB0aGF0IG5vIGFyZ3VtZW50IHdhcyBnaXZlbi4KLSAgaW5saW5lIGV4cGxpY2l0IFN1YnN0aXR1dGVBcmcoKQotICAgIDogdGV4dF8oTlVMTCksIHNpemVfKC0xKSB7fQotCi0gIC8vIFByaW1pdGl2ZXMKLSAgLy8gV2UgZG9uJ3Qgb3ZlcmxvYWQgZm9yIHNpZ25lZCBhbmQgdW5zaWduZWQgY2hhciBiZWNhdXNlIGlmIHBlb3BsZSBhcmUKLSAgLy8gZXhwbGljaXRseSBkZWNsYXJpbmcgdGhlaXIgY2hhcnMgYXMgc2lnbmVkIG9yIHVuc2lnbmVkIHRoZW4gdGhleSBhcmUKLSAgLy8gcHJvYmFibHkgYWN0dWFsbHkgdXNpbmcgdGhlbSBhcyA4LWJpdCBpbnRlZ2VycyBhbmQgd291bGQgcHJvYmFibHkKLSAgLy8gcHJlZmVyIGFuIGludGVnZXIgcmVwcmVzZW50YXRpb24uICBCdXQsIHdlIGRvbid0IHJlYWxseSBrbm93LiAgU28sIHdlCi0gIC8vIG1ha2UgdGhlIGNhbGxlciBkZWNpZGUgd2hhdCB0byBkby4KLSAgaW5saW5lIFN1YnN0aXR1dGVBcmcoY2hhciB2YWx1ZSkKLSAgICA6IHRleHRfKHNjcmF0Y2hfKSwgc2l6ZV8oMSkgeyBzY3JhdGNoX1swXSA9IHZhbHVlOyB9Ci0gIGlubGluZSBTdWJzdGl0dXRlQXJnKHNob3J0IHZhbHVlKQotICAgIDogdGV4dF8oRmFzdEludDMyVG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9Ci0gIGlubGluZSBTdWJzdGl0dXRlQXJnKHVuc2lnbmVkIHNob3J0IHZhbHVlKQotICAgIDogdGV4dF8oRmFzdFVJbnQzMlRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQotICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhpbnQgdmFsdWUpCi0gICAgOiB0ZXh0XyhGYXN0SW50MzJUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KLSAgaW5saW5lIFN1YnN0aXR1dGVBcmcodW5zaWduZWQgaW50IHZhbHVlKQotICAgIDogdGV4dF8oRmFzdFVJbnQzMlRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQotICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhsb25nIHZhbHVlKQotICAgIDogdGV4dF8oRmFzdExvbmdUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KLSAgaW5saW5lIFN1YnN0aXR1dGVBcmcodW5zaWduZWQgbG9uZyB2YWx1ZSkKLSAgICA6IHRleHRfKEZhc3RVTG9uZ1RvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQotICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhsb25nIGxvbmcgdmFsdWUpCi0gICAgOiB0ZXh0XyhGYXN0SW50NjRUb0J1ZmZlcih2YWx1ZSwgc2NyYXRjaF8pKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KLSAgaW5saW5lIFN1YnN0aXR1dGVBcmcodW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKQotICAgIDogdGV4dF8oRmFzdFVJbnQ2NFRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQotICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhmbG9hdCB2YWx1ZSkKLSAgICA6IHRleHRfKEZsb2F0VG9CdWZmZXIodmFsdWUsIHNjcmF0Y2hfKSksIHNpemVfKHN0cmxlbih0ZXh0XykpIHt9Ci0gIGlubGluZSBTdWJzdGl0dXRlQXJnKGRvdWJsZSB2YWx1ZSkKLSAgICA6IHRleHRfKERvdWJsZVRvQnVmZmVyKHZhbHVlLCBzY3JhdGNoXykpLCBzaXplXyhzdHJsZW4odGV4dF8pKSB7fQotICBpbmxpbmUgU3Vic3RpdHV0ZUFyZyhib29sIHZhbHVlKQotICAgIDogdGV4dF8odmFsdWUgPyAidHJ1ZSIgOiAiZmFsc2UiKSwgc2l6ZV8oc3RybGVuKHRleHRfKSkge30KLQotICBpbmxpbmUgY29uc3QgY2hhciogZGF0YSgpIGNvbnN0IHsgcmV0dXJuIHRleHRfOyB9Ci0gIGlubGluZSBpbnQgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHNpemVfOyB9Ci0KLSBwcml2YXRlOgotICBjb25zdCBjaGFyKiB0ZXh0XzsKLSAgaW50IHNpemVfOwotICBjaGFyIHNjcmF0Y2hfW2tGYXN0VG9CdWZmZXJTaXplXTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi1MSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN1YnN0aXR1dGUoCi0gIGNvbnN0IGNoYXIqIGZvcm1hdCwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzAgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAotICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCi0gIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcyID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzMgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAotICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCi0gIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc1ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzYgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAotICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCi0gIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc4ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzkgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpKTsKLQotTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3Vic3RpdHV0ZUFuZEFwcGVuZCgKLSAgc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGZvcm1hdCwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzAgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAotICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnMSA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCi0gIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmcyID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzMgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAotICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNCA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCi0gIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc1ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzYgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpLAotICBjb25zdCBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZyYgYXJnNyA9IGludGVybmFsOjpTdWJzdGl0dXRlQXJnKCksCi0gIGNvbnN0IGludGVybmFsOjpTdWJzdGl0dXRlQXJnJiBhcmc4ID0gaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcoKSwKLSAgY29uc3QgaW50ZXJuYWw6OlN1YnN0aXR1dGVBcmcmIGFyZzkgPSBpbnRlcm5hbDo6U3Vic3RpdHV0ZUFyZygpKTsKLQotfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1NVQlNUSVRVVEVfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDA3YWExZDcuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwzMzQ2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmZGVmIF9XSU4zMgotLy8gVmVyaWZ5IHRoYXQgI2luY2x1ZGluZyB3aW5kb3dzLmggZG9lcyBub3QgYnJlYWsgYW55dGhpbmcgKGUuZy4gYmVjYXVzZQotLy8gd2luZG93cy5oICNkZWZpbmVzIEdldE1lc3NhZ2UoKSBhcyBhIG1hY3JvKS4KLSNpbmNsdWRlIDx3aW5kb3dzLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi12b2lkIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgewotICBTZXRPcHRpb25hbEZpZWxkcyhtZXNzYWdlKTsKLSAgQWRkUmVwZWF0ZWRGaWVsZHMxKG1lc3NhZ2UpOwotICBBZGRSZXBlYXRlZEZpZWxkczIobWVzc2FnZSk7Ci0gIFNldERlZmF1bHRGaWVsZHMobWVzc2FnZSk7Ci0gIFNldE9uZW9mRmllbGRzKG1lc3NhZ2UpOwotfQotCi12b2lkIFRlc3RVdGlsOjpTZXRPcHRpb25hbEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbnQzMiAgICgxMDEpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfaW50NjQgICAoMTAyKTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3VpbnQzMiAgKDEwMyk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF91aW50NjQgICgxMDQpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ludDMyICAoMTA1KTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NpbnQ2NCAgKDEwNik7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9maXhlZDMyICgxMDcpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZml4ZWQ2NCAoMTA4KTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NmaXhlZDMyKDEwOSk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zZml4ZWQ2NCgxMTApOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZmxvYXQgICAoMTExKTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2RvdWJsZSAgKDExMik7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9ib29sICAgICh0cnVlKTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3N0cmluZyAgKCIxMTUiKTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2J5dGVzICAgKCIxMTYiKTsKLQotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLT5zZXRfYSgxMTcpOwotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLT5zZXRfYmIoMTE4KTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKS0+c2V0X2MoMTE5KTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS0+c2V0X2QoMTIwKTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2UoMTI2KTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKS0+c2V0X2JiKDEyNyk7Ci0KLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX25lc3RlZF9lbnVtICh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVopOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaKTsKLQotICAvLyBTdHJpbmdQaWVjZSBhbmQgQ29yZCBmaWVsZHMgYXJlIG9ubHkgYWNjZXNzaWJsZSB2aWEgcmVmbGVjdGlvbiBpbiB0aGUKLSAgLy8gb3BlbiBzb3VyY2UgcmVsZWFzZTsgc2VlIGNvbW1lbnRzIGluIGNvbXBpbGVyL2NwcC9zdHJpbmdfZmllbGQuY2MuCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLSAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRTdHJpbmcoCi0gICAgbWVzc2FnZSwKLSAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiksCi0gICAgIjEyNCIpOwotICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFN0cmluZygKLSAgICBtZXNzYWdlLAotICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9jb3JkIiksCi0gICAgIjEyNSIpOwotI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkFkZFJlcGVhdGVkRmllbGRzMSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgyMDEpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMjAyKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQzMiAgKDIwMyk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQgICgyMDQpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyICAoMjA1KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQ2NCAgKDIwNik7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyICgyMDcpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQ2NCAoMjA4KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDIwOSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgyMTApOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQgICAoMjExKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSAgKDIxMik7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sICAgICh0cnVlKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZyAgKCIyMTUiKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2J5dGVzICAgKCIyMTYiKTsKLQotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKCktPnNldF9hKDIxNyk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDIxOCk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMjE5KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgyMjApOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKCktPnNldF9iYigyMjcpOwotCi0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICApOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUik7Ci0KLSNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZFN0cmluZygKLSAgICBtZXNzYWdlLAotICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwKLSAgICAiMjI0Iik7Ci0gIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+QWRkU3RyaW5nKAotICAgIG1lc3NhZ2UsCi0gICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2NvcmQiKSwKLSAgICAiMjI1Iik7Ci0jZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi19Ci0KLXZvaWQgVGVzdFV0aWw6OkFkZFJlcGVhdGVkRmllbGRzMih1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7Ci0gIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDMyICAgKDMwMSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQ2NCAgICgzMDIpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDMyICAoMzAzKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQ2NCAgKDMwNCk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50MzIgICgzMDUpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDY0ICAoMzA2KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkMzIgKDMwNyk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDY0ICgzMDgpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkMzIoMzA5KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDY0KDMxMCk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mbG9hdCAgICgzMTEpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZG91YmxlICAoMzEyKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Jvb2wgICAgKGZhbHNlKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3N0cmluZyAgKCIzMTUiKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2J5dGVzICAgKCIzMTYiKTsKLQotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKCktPnNldF9hKDMxNyk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDMxOCk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMzE5KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgzMjApOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKCktPnNldF9iYigzMjcpOwotCi0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICApOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWik7Ci0KLSNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwotICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkFkZFN0cmluZygKLSAgICBtZXNzYWdlLAotICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwKLSAgICAiMzI0Iik7Ci0gIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+QWRkU3RyaW5nKAotICAgIG1lc3NhZ2UsCi0gICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2NvcmQiKSwKLSAgICAiMzI1Iik7Ci0jZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6U2V0RGVmYXVsdEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKSB7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ludDMyICAgKDQwMSk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ludDY0ICAgKDQwMik7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3VpbnQzMiAgKDQwMyk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3VpbnQ2NCAgKDQwNCk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQzMiAgKDQwNSk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NpbnQ2NCAgKDQwNik7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZpeGVkMzIgKDQwNyk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZpeGVkNjQgKDQwOCk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDMyKDQwOSk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X3NmaXhlZDY0KDQxMCk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Zsb2F0ICAgKDQxMSk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2RvdWJsZSAgKDQxMik7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2Jvb2wgICAgKGZhbHNlKTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc3RyaW5nICAoIjQxNSIpOwotICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9ieXRlcyAgICgiNDE2Iik7Ci0KLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICApOwotICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKLQotI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi0gIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0U3RyaW5nKAotICAgIG1lc3NhZ2UsCi0gICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImRlZmF1bHRfc3RyaW5nX3BpZWNlIiksCi0gICAgIjQyNCIpOwotICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFN0cmluZygKLSAgICBtZXNzYWdlLAotICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJkZWZhdWx0X2NvcmQiKSwKLSAgICAiNDI1Iik7Ci0jZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgewotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfaW50MzIgICAoMSwgNTAxKTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDY0ICAgKDEsIDUwMik7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF91aW50MzIgICgxLCA1MDMpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfdWludDY0ICAoMSwgNTA0KTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NpbnQzMiAgKDEsIDUwNSk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zaW50NjQgICgxLCA1MDYpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZml4ZWQzMiAoMSwgNTA3KTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkNjQgKDEsIDUwOCk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zZml4ZWQzMigxLCA1MDkpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ZpeGVkNjQoMSwgNTEwKTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Zsb2F0ICAgKDEsIDUxMSk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9kb3VibGUgICgxLCA1MTIpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYm9vbCAgICAoMSwgdHJ1ZSk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zdHJpbmcgICgxLCAiNTE1Iik7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9ieXRlcyAgICgxLCAiNTE2Iik7Ci0KLSAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSktPnNldF9hKDUxNyk7Ci0gIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLT5zZXRfYmIoNTE4KTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSktPnNldF9jKDUxOSk7Ci0gIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLT5zZXRfZCg1MjApOwotICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgxKS0+c2V0X2JiKDUyNyk7Ci0KLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX25lc3RlZF9lbnVtICgxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9pbXBvcnRfZW51bSAoMSwgdW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PKTsKLQotI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi0gIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0UmVwZWF0ZWRTdHJpbmcoCi0gICAgbWVzc2FnZSwKLSAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksCi0gICAgMSwgIjUyNCIpOwotICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldFJlcGVhdGVkU3RyaW5nKAotICAgIG1lc3NhZ2UsCi0gICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2NvcmQiKSwKLSAgICAxLCAiNTI1Iik7Ci0jZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotdm9pZCBUZXN0VXRpbDo6U2V0T25lb2ZGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgewotICBtZXNzYWdlLT5zZXRfb25lb2ZfdWludDMyKDYwMSk7Ci0gIG1lc3NhZ2UtPm11dGFibGVfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDYwMik7Ci0gIG1lc3NhZ2UtPnNldF9vbmVvZl9zdHJpbmcoIjYwMyIpOwotICBtZXNzYWdlLT5zZXRfb25lb2ZfYnl0ZXMoIjYwNCIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCAgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQ2NCAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkMzIgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDY0ICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDY0KCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCAgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Jvb2wgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLmhhc19hKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLmhhc19iYigpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKS5oYXNfYygpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS5oYXNfZCgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5oYXNfZSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKS5oYXNfYmIoKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKLQotI2lmbmRlZiBQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZ19waWVjZSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfY29yZCgpKTsKLSNlbmRpZgotCi0gIEVYUEVDVF9FUSgxMDEgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICgpKTsKLSAgRVhQRUNUX0VRKDEwMiAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgKCkpOwotICBFWFBFQ1RfRVEoMTAzICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSgxMDQgICwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICgpKTsKLSAgRVhQRUNUX0VRKDEwNSAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgKCkpOwotICBFWFBFQ1RfRVEoMTA2ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9FUSgxMDcgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICgpKTsKLSAgRVhQRUNUX0VRKDEwOCAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgKCkpOwotICBFWFBFQ1RfRVEoMTA5ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9FUSgxMTAgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKLSAgRVhQRUNUX0VRKDExMSAgLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgKCkpOwotICBFWFBFQ1RfRVEoMTEyICAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKLSAgRVhQRUNUX0VRKCIxMTUiLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOwotICBFWFBFQ1RfRVEoIjExNiIsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAgKCkuYSgpKTsKLSAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAgKCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgxMTksIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgICgpLmMoKSk7Ci0gIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgICgpLmQoKSk7Ci0gIEVYUEVDVF9FUSgxMjYsIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlICgpLmUoKSk7Ci0gIEVYUEVDVF9FUSgxMjcsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgICgpLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSAoKSk7Ci0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwotCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2NvcmRfc2l6ZSgpKTsKLSNlbmRpZgotCi0gIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7Ci0gIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7Ci0gIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgwKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgwKSk7Ci0gIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgwKSk7Ci0gIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgwKSk7Ci0KLSAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMCkuYSgpKTsKLSAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7Ci0gIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDApLmQoKSk7Ci0gIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDApLmJiKCkpOwotCi0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDApKTsKLQotICBFWFBFQ1RfRVEoMzAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMSkpOwotICBFWFBFQ1RfRVEoMzAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMSkpOwotICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMSkpOwotICBFWFBFQ1RfRVEoMzA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMSkpOwotICBFWFBFQ1RfRVEoMzA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMSkpOwotICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMSkpOwotICBFWFBFQ1RfRVEoMzA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMSkpOwotICBFWFBFQ1RfRVEoMzA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMSkpOwotICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMSkpOwotICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOwotICBFWFBFQ1RfRVEoMzExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMSkpOwotICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMSkpOwotICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOwotICBFWFBFQ1RfRVEoIjMxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMSkpOwotICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMSkpOwotCi0gIEVYUEVDVF9FUSgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLmEoKSk7Ci0gIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLmJiKCkpOwotICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOwotICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOwotICBFWFBFQ1RfRVEoMzI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgxKS5iYigpKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMSkpOwotCi0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ludDMyICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ludDY0ICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQzMiAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQ2NCAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQzMiAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQ2NCAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZpeGVkMzIgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZpeGVkNjQgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDMyKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDY0KCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2Zsb2F0ICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2RvdWJsZSAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2Jvb2wgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X3N0cmluZyAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2J5dGVzICAgKCkpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZvcmVpZ25fZW51bSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7Ci0KLQotICBFWFBFQ1RfRVEoNDAxICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQzMiAgICgpKTsKLSAgRVhQRUNUX0VRKDQwMiAgLCBtZXNzYWdlLmRlZmF1bHRfaW50NjQgICAoKSk7Ci0gIEVYUEVDVF9FUSg0MDMgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiAgKCkpOwotICBFWFBFQ1RfRVEoNDA0ICAsIG1lc3NhZ2UuZGVmYXVsdF91aW50NjQgICgpKTsKLSAgRVhQRUNUX0VRKDQwNSAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSg0MDYgICwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRVEoNDA3ICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDMyICgpKTsKLSAgRVhQRUNUX0VRKDQwOCAgLCBtZXNzYWdlLmRlZmF1bHRfZml4ZWQ2NCAoKSk7Ci0gIEVYUEVDVF9FUSg0MDkgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyKCkpOwotICBFWFBFQ1RfRVEoNDEwICAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCgpKTsKLSAgRVhQRUNUX0VRKDQxMSAgLCBtZXNzYWdlLmRlZmF1bHRfZmxvYXQgICAoKSk7Ci0gIEVYUEVDVF9FUSg0MTIgICwgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSAgKCkpOwotICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UuZGVmYXVsdF9ib29sICAgICgpKTsKLSAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nICAoKSk7Ci0gIEVYUEVDVF9FUSgiNDE2IiwgbWVzc2FnZS5kZWZhdWx0X2J5dGVzICAgKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7Ci0KLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfdWludDMyICAgICAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3N0cmluZyAgICAgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vbmVvZl9ieXRlcyAgICAgICAgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKCI2MDQiLCBtZXNzYWdlLm9uZW9mX2J5dGVzKCkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKLSAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50MzIgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQzMiAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDY0ICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQzMiAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDY0ICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDMyKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkNjQoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2RvdWJsZSAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfYm9vbCAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2J5dGVzICAgKCkpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nX3BpZWNlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfY29yZCgpKTsKLQotICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCi0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKLSAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOwotICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7Ci0KLSAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLmhhc19hKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5oYXNfYmIoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmhhc19jKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS5oYXNfZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2UoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmhhc19iYigpKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS5hKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5iYigpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkuYygpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkuZCgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuZSgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkuYmIoKSk7Ci0KLSAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKLQotCi0gIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCi0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwotCi0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19waWVjZV9zaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9jb3JkX3NpemUoKSk7Ci0KLSAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbnQzMiAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQzMiAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF91aW50NjQgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9maXhlZDMyICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDMyKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zZml4ZWQ2NCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2RvdWJsZSAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9ib29sICAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2J5dGVzICAgKCkpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X25lc3RlZF9lbnVtICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7Ci0KLQotICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgotICBFWFBFQ1RfRVEoIDQxICAgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOwotICBFWFBFQ1RfRVEoIDQyICAgICwgbWVzc2FnZS5kZWZhdWx0X2ludDY0ICAgKCkpOwotICBFWFBFQ1RfRVEoIDQzICAgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiAgKCkpOwotICBFWFBFQ1RfRVEoIDQ0ICAgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRVEoLTQ1ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMiAgKCkpOwotICBFWFBFQ1RfRVEoIDQ2ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRVEoIDQ3ICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOwotICBFWFBFQ1RfRVEoIDQ4ICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkNjQgKCkpOwotICBFWFBFQ1RfRVEoIDQ5ICAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDMyKCkpOwotICBFWFBFQ1RfRVEoLTUwICAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOwotICBFWFBFQ1RfRVEoIDUxLjUgICwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0ICAgKCkpOwotICBFWFBFQ1RfRVEoIDUyZTMgICwgbWVzc2FnZS5kZWZhdWx0X2RvdWJsZSAgKCkpOwotICBFWFBFQ1RfVFJVRSggICAgICAgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOwotICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5kZWZhdWx0X3N0cmluZyAgKCkpOwotICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5kZWZhdWx0X2J5dGVzICAgKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7Ci0KLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfdWludDMyICAgICAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3N0cmluZyAgICAgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfYnl0ZXMgICAgICAgICAoKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7Ci0gIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAotICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAotICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwotCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2NvcmRfc2l6ZSgpKTsKLSNlbmRpZgotCi0gIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7Ci0gIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7Ci0gIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgwKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgwKSk7Ci0gIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgwKSk7Ci0gIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgwKSk7Ci0KLSAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMCkuYSgpKTsKLSAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7Ci0gIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDApLmQoKSk7Ci0gIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDApLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgwKSk7Ci0KLQotICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KLSAgRVhQRUNUX0VRKDUwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDEpKTsKLSAgRVhQRUNUX0VRKDUwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDEpKTsKLSAgRVhQRUNUX0VRKDUwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDEpKTsKLSAgRVhQRUNUX0VRKDUxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDEpKTsKLSAgRVhQRUNUX0VRKDUxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDEpKTsKLSAgRVhQRUNUX0VRKDUxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDEpKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDEpKTsKLSAgRVhQRUNUX0VRKCI1MTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDEpKTsKLSAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDEpKTsKLQotICBFWFBFQ1RfRVEoNTE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgxKS5hKCkpOwotICBFWFBFQ1RfRVEoNTE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS5iYigpKTsKLSAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSkuYygpKTsKLSAgRVhQRUNUX0VRKDUyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMSkuZCgpKTsKLSAgRVhQRUNUX0VRKDUyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMSkuYmIoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fRk9PICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDEpKTsKLQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzKiBtZXNzYWdlKSB7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50MzIgICAoNjAxKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQ2NCAgICg2MDIpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQzMiAgKDYwMyk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0ICAoNjA0KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50MzIgICg2MDUpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQ2NCAgKDYwNik7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMiAoNjA3KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDY0ICg2MDgpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDMyKDYwOSk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkNjQoNjEwKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9mbG9hdCAgICg2MTEpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2RvdWJsZSAgKDYxMik7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfYm9vbCAgICAodHJ1ZSk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZW51bSAgICAodW5pdHRlc3Q6OkZPUkVJR05fQkFSKTsKLSAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCi0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50MzIgICAoNzAxKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQ2NCAgICg3MDIpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQzMiAgKDcwMyk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDY0ICAoNzA0KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50MzIgICg3MDUpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQ2NCAgKDcwNik7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQzMiAoNzA3KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDY0ICg3MDgpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDMyKDcwOSk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkNjQoNzEwKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9mbG9hdCAgICg3MTEpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2RvdWJsZSAgKDcxMik7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfYm9vbCAgICAoZmFsc2UpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2VudW0gICAgKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWik7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OlNldFVucGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRUeXBlcyogbWVzc2FnZSkgewotICAvLyBUaGUgdmFsdWVzIGFwcGxpZWQgaGVyZSBtdXN0IG1hdGNoIHRob3NlIG9mIFNldFBhY2tlZEZpZWxkcy4KLQotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfaW50MzIgICAoNjAxKTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ludDY0ICAgKDYwMik7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF91aW50MzIgICg2MDMpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfdWludDY0ICAoNjA0KTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NpbnQzMiAgKDYwNSk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zaW50NjQgICg2MDYpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZml4ZWQzMiAoNjA3KTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ZpeGVkNjQgKDYwOCk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zZml4ZWQzMig2MDkpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ZpeGVkNjQoNjEwKTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2Zsb2F0ICAgKDYxMSk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9kb3VibGUgICg2MTIpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfYm9vbCAgICAodHJ1ZSk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9lbnVtICAgICh1bml0dGVzdDo6Rk9SRUlHTl9CQVIpOwotICAvLyBhZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ludDMyICAgKDcwMSk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9pbnQ2NCAgICg3MDIpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfdWludDMyICAoNzAzKTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3VpbnQ2NCAgKDcwNCk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9zaW50MzIgICg3MDUpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ludDY0ICAoNzA2KTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2ZpeGVkMzIgKDcwNyk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9maXhlZDY0ICg3MDgpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfc2ZpeGVkMzIoNzA5KTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX3NmaXhlZDY0KDcxMCk7Ci0gIG1lc3NhZ2UtPmFkZF91bnBhY2tlZF9mbG9hdCAgICg3MTEpOwotICBtZXNzYWdlLT5hZGRfdW5wYWNrZWRfZG91YmxlICAoNzEyKTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2Jvb2wgICAgKGZhbHNlKTsKLSAgbWVzc2FnZS0+YWRkX3VucGFja2VkX2VudW0gICAgKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6TW9kaWZ5UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMqIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9pbnQzMiAgICgxLCA4MDEpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX2ludDY0ICAgKDEsIDgwMik7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfdWludDMyICAoMSwgODAzKTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF91aW50NjQgICgxLCA4MDQpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX3NpbnQzMiAgKDEsIDgwNSk7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ludDY0ICAoMSwgODA2KTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9maXhlZDMyICgxLCA4MDcpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX2ZpeGVkNjQgKDEsIDgwOCk7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ZpeGVkMzIoMSwgODA5KTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zZml4ZWQ2NCgxLCA4MTApOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX2Zsb2F0ICAgKDEsIDgxMSk7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfZG91YmxlICAoMSwgODEyKTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9ib29sICAgICgxLCB0cnVlKTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9lbnVtICAgICgxLCB1bml0dGVzdDo6Rk9SRUlHTl9GT08pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEZpZWxkc1NldChjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzJiBtZXNzYWdlKSB7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKLQotICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDApKTsKLSAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMCkpOwotICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDApKTsKLSAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOwotICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKLSAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMCkpOwotICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5wYWNrZWRfZW51bSgwKSk7Ci0KLSAgRVhQRUNUX0VRKDcwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgxKSk7Ci0gIEVYUEVDVF9FUSg3MDIgICwgbWVzc2FnZS5wYWNrZWRfaW50NjQgICAoMSkpOwotICBFWFBFQ1RfRVEoNzAzICAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMiAgKDEpKTsKLSAgRVhQRUNUX0VRKDcwNCAgLCBtZXNzYWdlLnBhY2tlZF91aW50NjQgICgxKSk7Ci0gIEVYUEVDVF9FUSg3MDUgICwgbWVzc2FnZS5wYWNrZWRfc2ludDMyICAoMSkpOwotICBFWFBFQ1RfRVEoNzA2ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCAgKDEpKTsKLSAgRVhQRUNUX0VRKDcwNyAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyICgxKSk7Ci0gIEVYUEVDVF9FUSg3MDggICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCAoMSkpOwotICBFWFBFQ1RfRVEoNzA5ICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDEpKTsKLSAgRVhQRUNUX0VRKDcxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgxKSk7Ci0gIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMSkpOwotICBFWFBFQ1RfRVEoNzEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDEpKTsKLSAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosIG1lc3NhZ2UucGFja2VkX2VudW0oMSkpOwotfQotCi12b2lkIFRlc3RVdGlsOjpFeHBlY3RVbnBhY2tlZEZpZWxkc1NldCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMmIG1lc3NhZ2UpIHsKLSAgLy8gVGhlIHZhbHVlcyBleHBlY3RlZCBoZXJlIG11c3QgbWF0Y2ggdGhvc2Ugb2YgRXhwZWN0UGFja2VkRmllbGRzU2V0LgotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ludDMyX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ludDY0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzJfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDY0X3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2Jvb2xfc2l6ZSAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnVucGFja2VkX2VudW1fc2l6ZSAgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLnVucGFja2VkX2ludDMyICAgKDApKTsKLSAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnVucGFja2VkX2ludDY0ICAgKDApKTsKLSAgRVhQRUNUX0VRKDYwMyAgLCBtZXNzYWdlLnVucGFja2VkX3VpbnQzMiAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnVucGFja2VkX3NpbnQzMiAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNiAgLCBtZXNzYWdlLnVucGFja2VkX3NpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIgKDApKTsKLSAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnVucGFja2VkX2ZpeGVkNjQgKDApKTsKLSAgRVhQRUNUX0VRKDYwOSAgLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDMyKDApKTsKLSAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLnVucGFja2VkX3NmaXhlZDY0KDApKTsKLSAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnVucGFja2VkX2Zsb2F0ICAgKDApKTsKLSAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLnVucGFja2VkX2RvdWJsZSAgKDApKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnVucGFja2VkX2Jvb2wgICAgKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS51bnBhY2tlZF9lbnVtKDApKTsKLQotICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIgICAoMSkpOwotICBFWFBFQ1RfRVEoNzAyICAsIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQgICAoMSkpOwotICBFWFBFQ1RfRVEoNzAzICAsIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyICAoMSkpOwotICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UudW5wYWNrZWRfdWludDY0ICAoMSkpOwotICBFWFBFQ1RfRVEoNzA1ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDMyICAoMSkpOwotICBFWFBFQ1RfRVEoNzA2ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0ICAoMSkpOwotICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQzMiAoMSkpOwotICBFWFBFQ1RfRVEoNzA4ICAsIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NCAoMSkpOwotICBFWFBFQ1RfRVEoNzA5ICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkMzIoMSkpOwotICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkNjQoMSkpOwotICBFWFBFQ1RfRVEoNzExICAsIG1lc3NhZ2UudW5wYWNrZWRfZmxvYXQgICAoMSkpOwotICBFWFBFQ1RfRVEoNzEyICAsIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlICAoMSkpOwotICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UudW5wYWNrZWRfYm9vbCAgICAoMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaLCBtZXNzYWdlLnVucGFja2VkX2VudW0oMSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZENsZWFyKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpIHsKLSAgLy8gUGFja2VkIHJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCi0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzJiBtZXNzYWdlKSB7Ci0gIC8vIERvIHRoZSBzYW1lIGZvciBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLgotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50MzJfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ludDY0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50MzJfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfdWludDY0X3NpemUgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zaW50NjRfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMl9zaXplICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMl9zaXplKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9kb3VibGVfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfYm9vbF9zaXplICAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2VudW1fc2l6ZSAgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDIgICwgbWVzc2FnZS5wYWNrZWRfaW50NjQgICAoMCkpOwotICBFWFBFQ1RfRVEoNjAzICAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMiAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLnBhY2tlZF91aW50NjQgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDUgICwgbWVzc2FnZS5wYWNrZWRfc2ludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoNjA2ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDggICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCAoMCkpOwotICBFWFBFQ1RfRVEoNjA5ICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDApKTsKLSAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgwKSk7Ci0gIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMCkpOwotICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDApKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIsIG1lc3NhZ2UucGFja2VkX2VudW0oMCkpOwotICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KLSAgRVhQRUNUX0VRKDgwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgxKSk7Ci0gIEVYUEVDVF9FUSg4MDIgICwgbWVzc2FnZS5wYWNrZWRfaW50NjQgICAoMSkpOwotICBFWFBFQ1RfRVEoODAzICAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMiAgKDEpKTsKLSAgRVhQRUNUX0VRKDgwNCAgLCBtZXNzYWdlLnBhY2tlZF91aW50NjQgICgxKSk7Ci0gIEVYUEVDVF9FUSg4MDUgICwgbWVzc2FnZS5wYWNrZWRfc2ludDMyICAoMSkpOwotICBFWFBFQ1RfRVEoODA2ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NCAgKDEpKTsKLSAgRVhQRUNUX0VRKDgwNyAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyICgxKSk7Ci0gIEVYUEVDVF9FUSg4MDggICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NCAoMSkpOwotICBFWFBFQ1RfRVEoODA5ICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyKDEpKTsKLSAgRVhQRUNUX0VRKDgxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgxKSk7Ci0gIEVYUEVDVF9FUSg4MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMSkpOwotICBFWFBFQ1RfRVEoODEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDEpKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08sIG1lc3NhZ2UucGFja2VkX2VudW0oMSkpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBFeHRlbnNpb25zCi0vLwotLy8gQWxsIHRoaXMgY29kZSBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlIGNvZGUgZXhjZXB0IHRoYXQgaXQncwotLy8gbWFuaXB1bGF0aW5nIGV4dGVuc2lvbiBmaWVsZHMgaW5zdGVhZCBvZiBub3JtYWwgb25lcy4KLS8vCi0vLyBJIGdhdmUgdXAgb24gdGhlIDgwLWNoYXIgbGltaXQgaGVyZS4gIFNvcnJ5LgotCi12b2lkIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSkgewotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICwgMTAxKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24gICAsIDEwMik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgLCAxMDMpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICwgMTA0KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uICAsIDEwNSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgLCAxMDYpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMTA3KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbiAsIDEwOCk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxMDkpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbiwgMTEwKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb24gICAsIDExMSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgLCAxMTIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICwgdHJ1ZSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgLCAiMTE1Iik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgLCAiMTE2Iik7Ci0KLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICktPnNldF9hKDExNyk7Ci0gIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfYmIoMTE4KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiktPnNldF9jKDExOSk7Ci0gIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfZCgxMjApOwotCi0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCB1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICApOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBWik7Ci0KLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAiMTI0Iik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24sICIxMjUiKTsKLQotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS0+c2V0X2UoMTI2KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiktPnNldF9iYigxMjcpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAsIDIwMSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAyMDIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICwgMjAzKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAsIDIwNCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAyMDUpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICwgMjA2KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDIwNyk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAyMDgpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMjA5KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDIxMCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAyMTEpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMjEyKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIHRydWUpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgIjIxNSIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgIjIxNiIpOwotCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICktPnNldF9hKDIxNyk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9iYigyMTgpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYygyMTkpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfZCgyMjApOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApLT5zZXRfYmIoMjI3KTsKLQotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIpOwotCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgIjIyNCIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAiMjI1Iik7Ci0KLSAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMzAxKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDMwMik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAzMDMpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMzA0KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDMwNSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAzMDYpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMzA3KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDMwOCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAzMDkpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMzEwKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDMxMSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAzMTIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgZmFsc2UpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgIjMxNSIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgIjMxNiIpOwotCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICktPnNldF9hKDMxNyk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9iYigzMTgpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYygzMTkpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfZCgzMjApOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApLT5zZXRfYmIoMzI3KTsKLQotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVopOwotCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgIjMyNCIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAiMzI1Iik7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uICAgLCA0MDEpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgLCA0MDIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgLCA0MDMpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbiAgLCA0MDQpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgLCA0MDUpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgLCA0MDYpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb24gLCA0MDcpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gLCA0MDgpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCA0MDkpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCA0MTApOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgLCA0MTEpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgLCA0MTIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb24gICAgLCBmYWxzZSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICAsICI0MTUiKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbiAgICwgIjQxNiIpOwotCi0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fRk9PICAgICAgKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTyk7Ci0KLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24sICI0MjQiKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uLCAiNDI1Iik7Ci0KLSAgU2V0T25lb2ZGaWVsZHMobWVzc2FnZSk7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OlNldE9uZW9mRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSkgewotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb24sIDYwMSk7Ci0gIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiktPnNldF9iYig2MDIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3N0cmluZ19leHRlbnNpb24sICI2MDMiKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb24sICI2MDQiKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKAotICAgIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3MqIG1lc3NhZ2UpIHsKLSAgR09PR0xFX0NIRUNLKG1lc3NhZ2UpOwotICBtZXNzYWdlLT5zZXRfbXlfaW50KDEpOwotICBtZXNzYWdlLT5zZXRfbXlfc3RyaW5nKCJmb28iKTsKLSAgbWVzc2FnZS0+c2V0X215X2Zsb2F0KDEuMCk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6bXlfZXh0ZW5zaW9uX2ludCwgMjMpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om15X2V4dGVuc2lvbl9zdHJpbmcsICJiYXIiKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlKSB7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxLCA1MDEpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSwgNTAyKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEsIDUwMyk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxLCA1MDQpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSwgNTA1KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEsIDUwNik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxLCA1MDcpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSwgNTA4KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEsIDUwOSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxLCA1MTApOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSwgNTExKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEsIDUxMik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxLCB0cnVlKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDEsICI1MTUiKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEsICI1MTYiKTsKLQotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAxKS0+c2V0X2EoNTE3KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMSktPnNldF9iYig1MTgpOwotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKS0+c2V0X2MoNTE5KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMSktPnNldF9kKDUyMCk7Ci0gIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDEpLT5zZXRfYmIoNTI3KTsKLQotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDEsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTyk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSwgdW5pdHRlc3Q6OkZPUkVJR05fRk9PICAgICAgKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCAxLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08pOwotCi0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMSwgIjUyNCIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAxLCAiNTI1Iik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICApKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICAgICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICAgICkpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKS5oYXNfYSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmhhc19iYigpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gICAgICApLmhhc19jKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkuaGFzX2QoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfZSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAgICAgICApLmhhc19iYigpKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOwotCi0gIEVYUEVDVF9FUSgxMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfRVEoMTAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQ2NF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDEwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgxMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEoMTA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDEwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgxMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRVEoMTA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDY0X2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0VRKDEwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUSgxMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMTExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mbG9hdF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDExMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBFWFBFQ1RfRVEoIjExNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKCIxMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7Ci0KLSAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApLmEoKSk7Ci0gIEVYUEVDVF9FUSgxMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKS5iYigpKTsKLSAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLmMoKSk7Ci0gIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKS5kKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb24gKSk7Ci0KLSAgRVhQRUNUX0VRKCIxMjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoIjEyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMTI2LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLmUoKSk7Ci0gIEVYUEVDVF9FUSgxMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uKS5iYigpKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOwotCi0gIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMCkpOwotICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMCkpOwotICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDApKTsKLSAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDApKTsKLSAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOwotICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAwKSk7Ci0KLSAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAsIDApLmEoKSk7Ci0gIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5iYigpKTsKLSAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDApLmMoKSk7Ci0gIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5kKCkpOwotICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICwgMCkuYmIoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKLQotICBFWFBFQ1RfRVEoIjIyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAwKSk7Ci0gIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7Ci0KLSAgRVhQRUNUX0VRKDMwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOwotICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDMwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDMwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOwotICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKDMxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOwotICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEpKTsKLQotICBFWFBFQ1RfRVEoMzE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMSkuYSgpKTsKLSAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmJiKCkpOwotICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYygpKTsKLSAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmQoKSk7Ci0gIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAxKS5iYigpKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMSkpOwotCi0gIEVYUEVDVF9FUSgiMzI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKCIzMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDEpKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uKSk7Ci0KLSAgRVhQRUNUX0VRKDQwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDQwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDQwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDQwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDQwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0VRKDQwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKDQxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKDQxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKLSAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICApKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0ZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOwotCi0gIEVYUEVDVF9FUSgiNDI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoIjQyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikuaGFzX2JiKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfYnl0ZXNfZXh0ZW5zaW9uKSk7Ci0KLSAgRVhQRUNUX0VRKDYwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKDYwMiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikuYmIoKSk7Ci0gIEVYUEVDVF9FUSgiNjAzIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3N0cmluZ19leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKCI2MDQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfYnl0ZXNfZXh0ZW5zaW9uKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgewotICBzdHJpbmcgc2VyaWFsaXplZDsKLSAgQVNTRVJUX1RSVUUobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCkpOwotICBFWFBFQ1RfRVEoIiIsIHNlcmlhbGl6ZWQpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKLQotICAvLyBoYXNfYmxhaCgpIHNob3VsZCBpbml0aWFsbHkgYmUgZmFsc2UgZm9yIGFsbCBvcHRpb25hbCBmaWVsZHMuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gICAgICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAgICAgICApKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7Ci0KLSAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbiAgICApKTsKLSAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbiAgICkpOwotCi0gIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAgICAgICApLmhhc19hKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmhhc19iYigpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgKS5oYXNfYygpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKS5oYXNfZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICAgKS5oYXNfYmIoKSk7Ci0KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKS5hKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmJiKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gICAgICApLmMoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkuZCgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5lKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAgICAgICApLmJiKCkpOwotCi0gIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb24gKSk7Ci0KLSAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOwotCi0gIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCi0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7Ci0KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7Ci0KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbikpOwotCi0gIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50NjRfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICApKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICkpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOwotCi0gIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gIEVYUEVDVF9FUSggNDEgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb24gICApKTsKLSAgRVhQRUNUX0VRKCA0MiAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfRVEoIDQzICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSggNDQgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKC00NSAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEoIDQ2ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSggNDcgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0VRKCA0OCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRVEoIDQ5ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUSgtNTAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKCA1MS41ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfRVEoIDUyZTMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKLSAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiApKTsKLQotICBFWFBFQ1RfRVEoImFiYyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKCIxMjMiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbikpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikuaGFzX2JiKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3N0cmluZ19leHRlbnNpb24pKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb24pKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKLSAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCi0gIC8vIGZpZWxkLiAgSW4gYWRkaXRpb24gdG8gdmVyaWZ5aW5nIHRoaXMsIHdlIGFsc28gdmVyaWZ5IHRoYXQgdGhlIGZpcnN0Ci0gIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICApKTsKLQotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKLQotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7Ci0KLSAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMCkpOwotICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMCkpOwotICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOwotICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDApKTsKLQotICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMCkuYSgpKTsKLSAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOwotICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7Ci0gIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAwKS5iYigpKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMCkpOwotCi0gIEVYUEVDVF9FUSgiMjI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKCIyMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDApKTsKLQotICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KLSAgRVhQRUNUX0VRKDUwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg1MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOwotICBFWFBFQ1RfRVEoNTAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDUwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg1MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoNTA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDUwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7Ci0gIEVYUEVDVF9FUSg1MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOwotICBFWFBFQ1RfRVEoNTA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKDUxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7Ci0gIEVYUEVDVF9FUSg1MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOwotICBFWFBFQ1RfRVEoNTEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgiNTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoIjUxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEpKTsKLQotICBFWFBFQ1RfRVEoNTE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMSkuYSgpKTsKLSAgRVhQRUNUX0VRKDUxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmJiKCkpOwotICBFWFBFQ1RfRVEoNTE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYygpKTsKLSAgRVhQRUNUX0VRKDUyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmQoKSk7Ci0gIEVYUEVDVF9FUSg1MjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAxKS5iYigpKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMSkpOwotCi0gIEVYUEVDVF9FUSgiNTI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKCI1MjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDEpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsOjpTZXRQYWNrZWRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyogbWVzc2FnZSkgewotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAsIDYwMSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICwgNjAyKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgLCA2MDMpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAsIDYwNCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICwgNjA1KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgLCA2MDYpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDYwNyk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgNjA4KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCA2MDkpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDYxMCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgNjExKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCA2MTIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIHRydWUpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fQkFSKTsKLSAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgNzAxKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCA3MDIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDcwMyk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgNzA0KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCA3MDUpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDcwNik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgNzA3KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCA3MDgpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDcwOSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgNzEwKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCA3MTEpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDcxMik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgZmFsc2UpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fQkFaKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsOjpNb2RpZnlQYWNrZWRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyogbWVzc2FnZSkgewotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAsIDEsIDgwMSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICwgMSwgODAyKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgLCAxLCA4MDMpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAsIDEsIDgwNCk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICwgMSwgODA1KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAxLCA4MDYpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDEsIDgwNyk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSwgODA4KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAxLCA4MDkpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDEsIDgxMCk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSwgODExKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAxLCA4MTIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEsIHRydWUpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgICAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6Rk9SRUlHTl9GT08pOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoCi0gICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zJiBtZXNzYWdlKSB7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uICAgICkpOwotCi0gIEVYUEVDVF9FUSg2MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICwgMCkpOwotICBFWFBFQ1RfRVEoNjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoNjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDApKTsKLSAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMCkpOwotICBFWFBFQ1RfRVEoNjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOwotICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwKLSAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKDcwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgMSkpOwotICBFWFBFQ1RfRVEoNzAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoNzA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMSkpOwotICBFWFBFQ1RfRVEoNzA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKDcxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMSkpOwotICBFWFBFQ1RfRVEoNzExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaLAotICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNDbGVhcigKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpIHsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24gICAgKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc01vZGlmaWVkKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyYgbWVzc2FnZSkgewotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKLSAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICwgMCkpOwotICBFWFBFQ1RfRVEoNjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoNjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMCkpOwotICBFWFBFQ1RfRVEoNjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLAotICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOwotCi0gIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgotICBFWFBFQ1RfRVEoODAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg4MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAsIDEpKTsKLSAgRVhQRUNUX0VRKDgwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoODA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg4MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDgwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoODA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7Ci0gIEVYUEVDVF9FUSg4MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDEpKTsKLSAgRVhQRUNUX0VRKDgwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMSkpOwotICBFWFBFQ1RfRVEoODEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7Ci0gIEVYUEVDVF9FUSg4MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDEpKTsKLSAgRVhQRUNUX0VRKDgxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08sCi0gICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uLCAxKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0VW5wYWNrZWRFeHRlbnNpb25zU2V0KAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRFeHRlbnNpb25zJiBtZXNzYWdlKSB7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKLQotICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDApKTsKLSAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwKLSAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3VpbnQzMl9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMSkpOwotICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKDcxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiwKLSAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKGNvbnN0IHN0cmluZyYgc2VyaWFsaXplZCkgewotICAvLyBXZSBzZXQgZWFjaCBmaWVsZCBpbmRpdmlkdWFsbHksIHNlcmlhbGl6ZSBzZXBhcmF0ZWx5LCBhbmQgY29uY2F0ZW5hdGUgYWxsCi0gIC8vIHRoZSBzdHJpbmdzIGluIGNhbm9uaWNhbCBvcmRlciB0byBkZXRlcm1pbmUgdGhlIGV4cGVjdGVkIHNlcmlhbGl6YXRpb24uCi0gIHN0cmluZyBleHBlY3RlZDsKLSAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBtZXNzYWdlOwotICBtZXNzYWdlLnNldF9teV9pbnQoMSk7ICAvLyBGaWVsZCAxLgotICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7Ci0gIG1lc3NhZ2UuQ2xlYXIoKTsKLSAgbWVzc2FnZS5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om15X2V4dGVuc2lvbl9pbnQsIDIzKTsgIC8vIEZpZWxkIDUuCi0gIG1lc3NhZ2UuQXBwZW5kVG9TdHJpbmcoJmV4cGVjdGVkKTsKLSAgbWVzc2FnZS5DbGVhcigpOwotICBtZXNzYWdlLnNldF9teV9zdHJpbmcoImZvbyIpOyAgLy8gRmllbGQgMTEuCi0gIG1lc3NhZ2UuQXBwZW5kVG9TdHJpbmcoJmV4cGVjdGVkKTsKLSAgbWVzc2FnZS5DbGVhcigpOwotICBtZXNzYWdlLlNldEV4dGVuc2lvbih1bml0dGVzdDo6bXlfZXh0ZW5zaW9uX3N0cmluZywgImJhciIpOyAgLy8gRmllbGQgNTAuCi0gIG1lc3NhZ2UuQXBwZW5kVG9TdHJpbmcoJmV4cGVjdGVkKTsKLSAgbWVzc2FnZS5DbGVhcigpOwotICBtZXNzYWdlLnNldF9teV9mbG9hdCgxLjApOyAgLy8gRmllbGQgMTAxLgotICBtZXNzYWdlLkFwcGVuZFRvU3RyaW5nKCZleHBlY3RlZCk7Ci0gIG1lc3NhZ2UuQ2xlYXIoKTsKLQotICAvLyBXZSBkb24ndCBFWFBFQ1RfRVEoKSBzaW5jZSB3ZSBkb24ndCB3YW50IHRvIHByaW50IHJhdyBieXRlcyB0byBzdGRvdXQuCi0gIEVYUEVDVF9UUlVFKHNlcmlhbGl6ZWQgPT0gZXhwZWN0ZWQpOwotfQotCi12b2lkIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRzUmVtb3ZlZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7Ci0KLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwotCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2NvcmRfc2l6ZSgpKTsKLSNlbmRpZgotCi0gIC8vIFRlc3QgdGhhdCB0aGUgcmVtYWluaW5nIGVsZW1lbnQgaXMgdGhlIGNvcnJlY3Qgb25lLgotICBFWFBFQ1RfRVEoMjAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMCkpOwotICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMCkpOwotICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoMjA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMCkpOwotICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMCkpOwotICBFWFBFQ1RfRVEoMjA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMCkpOwotICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMCkpOwotICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOwotICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOwotICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOwotICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOwotICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOwotICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOwotICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOwotCi0gIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDApLmEoKSk7Ci0gIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOwotICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOwotICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOwotICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgwKSk7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZW1vdmVkKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgewotCi0gIC8vIFRlc3QgdGhhdCBvbmUgZWxlbWVudCB3YXMgcmVtb3ZlZC4KLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICApKTsKLQotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKLQotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7Ci0KLSAgLy8gVGVzdCB0aGF0IHRoZSByZW1haW5pbmcgZWxlbWVudCBpcyB0aGUgY29ycmVjdCBvbmUuCi0gIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICwgMCkpOwotICBFWFBFQ1RfRVEoMjAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoMjA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICwgMCkpOwotICBFWFBFQ1RfRVEoMjA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAsIDApKTsKLSAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDApKTsKLSAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOwotICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAwKSk7Ci0KLSAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAsIDApLmEoKSk7Ci0gIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5iYigpKTsKLSAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDApLmMoKSk7Ci0gIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gLCAwKS5kKCkpOwotICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICwgMCkuYmIoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAsIDApKTsKLQotICBFWFBFQ1RfRVEoIjIyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAwKSk7Ci0gIEVYUEVDVF9FUSgiMjI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdExhc3RSZXBlYXRlZHNSZWxlYXNlZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSAgICAgICAgICAgKCkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKLQotICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOwotICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKLSAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkRXh0ZW5zaW9uc1JlbGVhc2VkKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSkgewotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApKTsKLQotICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMCkuYSgpKTsKLSAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOwotICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7Ci0gIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAwKS5iYigpKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0UmVwZWF0ZWRzU3dhcHBlZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKSB7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwotCi0jaWZuZGVmIFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2NvcmRfc2l6ZSgpKTsKLSNlbmRpZgotCi0gIC8vIFRlc3QgdGhhdCB0aGUgZmlyc3QgZWxlbWVudCBhbmQgc2Vjb25kIGVsZW1lbnQgYXJlIGZsaXBwZWQuCi0gIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgxKSk7Ci0gIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7Ci0gIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgxKSk7Ci0gIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgxKSk7Ci0gIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgxKSk7Ci0gIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgxKSk7Ci0gIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgxKSk7Ci0gIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgxKSk7Ci0KLSAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSkuYSgpKTsKLSAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7Ci0gIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7Ci0gIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDEpKTsKLQotICBFWFBFQ1RfRVEoMzAxICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIgICAoMCkpOwotICBFWFBFQ1RfRVEoMzAyICAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQgICAoMCkpOwotICBFWFBFQ1RfRVEoMzAzICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoMzA0ICAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0ICAoMCkpOwotICBFWFBFQ1RfRVEoMzA1ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoMzA2ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0ICAoMCkpOwotICBFWFBFQ1RfRVEoMzA3ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMiAoMCkpOwotICBFWFBFQ1RfRVEoMzA4ICAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCAoMCkpOwotICBFWFBFQ1RfRVEoMzA5ICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOwotICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOwotICBFWFBFQ1RfRVEoMzExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOwotICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOwotICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOwotICBFWFBFQ1RfRVEoIjMxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOwotICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOwotCi0gIEVYUEVDVF9FUSgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDApLmEoKSk7Ci0gIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOwotICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOwotICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOwotICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFaLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgwKSk7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdFJlcGVhdGVkRXh0ZW5zaW9uc1N3YXBwZWQoCi0gICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKSB7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24pKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICApKTsKLQotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKLQotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uKSk7Ci0KLSAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOwotICBFWFBFQ1RfRVEoMjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoMjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7Ci0gIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOwotICBFWFBFQ1RfRVEoMjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7Ci0gIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOwotICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEpKTsKLQotICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb24gICAgICAgICAgICwgMSkuYSgpKTsKLSAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmJiKCkpOwotICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYygpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmQoKSk7Ci0gIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAxKS5iYigpKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uICwgMSkpOwotCi0gIEVYUEVDVF9FUSgiMjI0IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb24sIDEpKTsKLSAgRVhQRUNUX0VRKCIyMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDEpKTsKLQotICBFWFBFQ1RfRVEoMzAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAsIDApKTsKLSAgRVhQRUNUX0VRKDMwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgzMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoMzA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uICAsIDApKTsKLSAgRVhQRUNUX0VRKDMwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgzMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoMzA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiAsIDApKTsKLSAgRVhQRUNUX0VRKDMwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24gLCAwKSk7Ci0gIEVYUEVDVF9FUSgzMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKLSAgRVhQRUNUX0VRKDMxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKLSAgRVhQRUNUX0VRKCIzMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMCkpOwotCi0gIEVYUEVDVF9FUSgzMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAwKS5hKCkpOwotICBFWFBFQ1RfRVEoMzE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5jKCkpOwotICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuZCgpKTsKLSAgRVhQRUNUX0VRKDMyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDApLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9CQVosIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gLCAwKSk7Ci0KLSAgRVhQRUNUX0VRKCIzMjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiwgMCkpOwotICBFWFBFQ1RfRVEoIjMyNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiwgMCkpOwotfQotCi12b2lkIFRlc3RVdGlsOjpTZXRPbmVvZjEodW5pdHRlc3Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZS0+bXV0YWJsZV9mb29fbGF6eV9tZXNzYWdlKCktPnNldF9xdXhfaW50KDEwMCk7Ci0gIG1lc3NhZ2UtPnNldF9iYXJfc3RyaW5nKCIxMDEiKTsKLSAgbWVzc2FnZS0+c2V0X2Jhel9pbnQoMTAyKTsKLSAgbWVzc2FnZS0+c2V0X2Jhel9zdHJpbmcoIjEwMyIpOwotfQotCi12b2lkIFRlc3RVdGlsOjpTZXRPbmVvZjIodW5pdHRlc3Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZS0+c2V0X2Zvb19pbnQoMjAwKTsKLSAgbWVzc2FnZS0+c2V0X2Jhcl9lbnVtKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVopOwotICBtZXNzYWdlLT5zZXRfYmF6X2ludCgyMDIpOwotICBtZXNzYWdlLT5zZXRfYmF6X3N0cmluZygiMjAzIik7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShjb25zdCB1bml0dGVzdDo6VGVzdE9uZW9mMiYgbWVzc2FnZSkgewotICBFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2xhenlfbWVzc2FnZSAgICAgICAgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuZm9vX2xhenlfbWVzc2FnZSgpLmhhc19xdXhfaW50KCkpOwotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Jhcl9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Jhel9pbnQgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Jhel9zdHJpbmcoKSk7Ci0KLSAgQVNTRVJUX0VRKDAsIG1lc3NhZ2UuZm9vX2xhenlfbWVzc2FnZSgpLmNvcmdlX2ludF9zaXplKCkpOwotCi0gIEVYUEVDVF9FUSgxMDAgICwgbWVzc2FnZS5mb29fbGF6eV9tZXNzYWdlKCkucXV4X2ludCgpKTsKLSAgRVhQRUNUX0VRKCIxMDEiLCBtZXNzYWdlLmJhcl9zdHJpbmcgICAgICAgICAgICAgICAgKCkpOwotICBFWFBFQ1RfRVEoMTAyICAsIG1lc3NhZ2UuYmF6X2ludCAgICAgICAgICAgICAgICAgICAoKSk7Ci0gIEVYUEVDVF9FUSgiMTAzIiwgbWVzc2FnZS5iYXpfc3RyaW5nICAgICAgICAgICAgICAgICgpKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyJiBtZXNzYWdlKSB7Ci0gIEV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29faW50ICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19iYXJfZW51bSAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19iYXpfaW50ICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19iYXpfc3RyaW5nKCkpOwotCi0gIEVYUEVDVF9FUSgyMDAgICAgICAgICAgICAgICAgICAgICAgLCBtZXNzYWdlLmZvb19pbnQgICAoKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6QkFaLCBtZXNzYWdlLmJhcl9lbnVtICAoKSk7Ci0gIEVYUEVDVF9FUSgyMDIgICAgICAgICAgICAgICAgICAgICAgLCBtZXNzYWdlLmJhel9pbnQgICAoKSk7Ci0gIEVYUEVDVF9FUSgiMjAzIiAgICAgICAgICAgICAgICAgICAgLCBtZXNzYWdlLmJhel9zdHJpbmcoKSk7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIoY29uc3QgdW5pdHRlc3Q6OlRlc3RPbmVvZjImIG1lc3NhZ2UpIHsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2J5dGVzKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2VudW0oKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb2dyb3VwKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2xhenlfbWVzc2FnZSgpKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX2ludCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Jhcl9zdHJpbmcoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfYnl0ZXMoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfZW51bSgpKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmF6X2ludCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Jhel9zdHJpbmcoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT09fTk9UX1NFVCwgbWVzc2FnZS5mb29fY2FzZSgpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVJfTk9UX1NFVCwgbWVzc2FnZS5iYXJfY2FzZSgpKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyJiBtZXNzYWdlKSB7Ci0gIGludCBjb3VudCA9IDA7Ci0gIGlmIChtZXNzYWdlLmhhc19mb29faW50KCkpIGNvdW50Kys7Ci0gIGlmIChtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpIGNvdW50Kys7Ci0gIGlmIChtZXNzYWdlLmhhc19mb29fYnl0ZXMoKSkgY291bnQrKzsKLSAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpIGNvdW50Kys7Ci0gIGlmIChtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKSBjb3VudCsrOwotICBpZiAobWVzc2FnZS5oYXNfZm9vZ3JvdXAoKSkgY291bnQrKzsKLSAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19sYXp5X21lc3NhZ2UoKSkgY291bnQrKzsKLSAgRVhQRUNUX0xFKGNvdW50LCAxKTsKLSAgY291bnQgPSAwOwotICBpZiAobWVzc2FnZS5oYXNfYmFyX2ludCgpKSBjb3VudCsrOwotICBpZiAobWVzc2FnZS5oYXNfYmFyX3N0cmluZygpKSBjb3VudCsrOwotICBpZiAobWVzc2FnZS5oYXNfYmFyX2J5dGVzKCkpIGNvdW50Kys7Ci0gIGlmIChtZXNzYWdlLmhhc19iYXJfZW51bSgpKSBjb3VudCsrOwotICBFWFBFQ1RfVFJVRShjb3VudCA9PSAwIHx8IGNvdW50ID09IDEpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpSZWZsZWN0aW9uVGVzdGVyKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIGJhc2VfZGVzY3JpcHRvcikKLSAgOiBiYXNlX2Rlc2NyaXB0b3JfKGJhc2VfZGVzY3JpcHRvcikgewotCi0gIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sID0gYmFzZV9kZXNjcmlwdG9yLT5maWxlKCktPnBvb2woKTsKLQotICBuZXN0ZWRfYl8gPQotICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuYmIiKTsKLSAgZm9yZWlnbl9jXyA9Ci0gICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduTWVzc2FnZS5jIik7Ci0gIGltcG9ydF9kXyA9Ci0gICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZS5kIik7Ci0gIGltcG9ydF9lXyA9Ci0gICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZS5lIik7Ci0gIG5lc3RlZF9mb29fID0KLSAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuRk9PIik7Ci0gIG5lc3RlZF9iYXJfID0KLSAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuQkFSIik7Ci0gIG5lc3RlZF9iYXpfID0KLSAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuQkFaIik7Ci0gIGZvcmVpZ25fZm9vXyA9Ci0gICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuRk9SRUlHTl9GT08iKTsKLSAgZm9yZWlnbl9iYXJfID0KLSAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5GT1JFSUdOX0JBUiIpOwotICBmb3JlaWduX2Jhel8gPQotICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LkZPUkVJR05fQkFaIik7Ci0gIGltcG9ydF9mb29fID0KLSAgICBwb29sLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSU1QT1JUX0ZPTyIpOwotICBpbXBvcnRfYmFyXyA9Ci0gICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LklNUE9SVF9CQVIiKTsKLSAgaW1wb3J0X2Jhel8gPQotICAgIHBvb2wtPkZpbmRFbnVtVmFsdWVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JTVBPUlRfQkFaIik7Ci0KLSAgaWYgKGJhc2VfZGVzY3JpcHRvcl8tPm5hbWUoKSA9PSAiVGVzdEFsbEV4dGVuc2lvbnMiKSB7Ci0gICAgZ3JvdXBfYV8gPQotICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbi5hIik7Ci0gICAgcmVwZWF0ZWRfZ3JvdXBfYV8gPQotICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5hIik7Ci0gIH0gZWxzZSB7Ci0gICAgZ3JvdXBfYV8gPQotICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5hIik7Ci0gICAgcmVwZWF0ZWRfZ3JvdXBfYV8gPQotICAgICAgcG9vbC0+RmluZEZpZWxkQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cC5hIik7Ci0gIH0KLQotICBFWFBFQ1RfVFJVRShncm91cF9hXyAgICAgICAgICAhPSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocmVwZWF0ZWRfZ3JvdXBfYV8gIT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG5lc3RlZF9iXyAgICAgICAgICE9IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmb3JlaWduX2NfICAgICAgICAhPSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoaW1wb3J0X2RfICAgICAgICAgIT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGltcG9ydF9lXyAgICAgICAgICE9IE5VTEwpOwotICBFWFBFQ1RfVFJVRShuZXN0ZWRfZm9vXyAgICAgICAhPSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUobmVzdGVkX2Jhcl8gICAgICAgIT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKG5lc3RlZF9iYXpfICAgICAgICE9IE5VTEwpOwotICBFWFBFQ1RfVFJVRShmb3JlaWduX2Zvb18gICAgICAhPSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoZm9yZWlnbl9iYXJfICAgICAgIT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGZvcmVpZ25fYmF6XyAgICAgICE9IE5VTEwpOwotICBFWFBFQ1RfVFJVRShpbXBvcnRfZm9vXyAgICAgICAhPSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUoaW1wb3J0X2Jhcl8gICAgICAgIT0gTlVMTCk7Ci0gIEVYUEVDVF9UUlVFKGltcG9ydF9iYXpfICAgICAgICE9IE5VTEwpOwotfQotCi0vLyBTaG9ydGhhbmQgdG8gZ2V0IGEgRmllbGREZXNjcmlwdG9yIGZvciBhIGZpZWxkIG9mIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMuCi1jb25zdCBGaWVsZERlc2NyaXB0b3IqIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpGKGNvbnN0IHN0cmluZyYgbmFtZSkgewotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IE5VTEw7Ci0gIGlmIChiYXNlX2Rlc2NyaXB0b3JfLT5uYW1lKCkgPT0gIlRlc3RBbGxFeHRlbnNpb25zIiB8fAotICAgICAgYmFzZV9kZXNjcmlwdG9yXy0+bmFtZSgpID09ICJUZXN0UGFja2VkRXh0ZW5zaW9ucyIpIHsKLSAgICByZXN1bHQgPSBiYXNlX2Rlc2NyaXB0b3JfLT5maWxlKCktPkZpbmRFeHRlbnNpb25CeU5hbWUobmFtZSArICJfZXh0ZW5zaW9uIik7Ci0gIH0gZWxzZSB7Ci0gICAgcmVzdWx0ID0gYmFzZV9kZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKG5hbWUpOwotICB9Ci0gIEdPT0dMRV9DSEVDSyhyZXN1bHQgIT0gTlVMTCk7Ci0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOwotCi0gIHJlZmxlY3Rpb24tPlNldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQzMiIgICApLCAxMDEpOwotICByZWZsZWN0aW9uLT5TZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiICAgKSwgMTAyKTsKLSAgcmVmbGVjdGlvbi0+U2V0VUludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQzMiIgICksIDEwMyk7Ci0gIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50NjQiICApLCAxMDQpOwotICByZWZsZWN0aW9uLT5TZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDMyIiAgKSwgMTA1KTsKLSAgcmVmbGVjdGlvbi0+U2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIgICksIDEwNik7Ci0gIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDMyIiApLCAxMDcpOwotICByZWZsZWN0aW9uLT5TZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIgKSwgMTA4KTsKLSAgcmVmbGVjdGlvbi0+U2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIiksIDEwOSk7Ci0gIHJlZmxlY3Rpb24tPlNldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQ2NCIpLCAxMTApOwotICByZWZsZWN0aW9uLT5TZXRGbG9hdCAobWVzc2FnZSwgRigib3B0aW9uYWxfZmxvYXQiICAgKSwgMTExKTsKLSAgcmVmbGVjdGlvbi0+U2V0RG91YmxlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2RvdWJsZSIgICksIDExMik7Ci0gIHJlZmxlY3Rpb24tPlNldEJvb2wgIChtZXNzYWdlLCBGKCJvcHRpb25hbF9ib29sIiAgICApLCB0cnVlKTsKLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIgICksICIxMTUiKTsKLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICksICIxMTYiKTsKLQotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBncm91cF9hXywgMTE3KTsKLSAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG5lc3RlZF9iXywgMTE4KTsKLSAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfLCAxMTkpOwotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOwotICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAxMjApOwotCi0gIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfYmF6Xyk7Ci0gIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmF6Xyk7Ci0gIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X2VudW0iICksICBpbXBvcnRfYmF6Xyk7Ci0KLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpLCAiMTI0Iik7Ci0gIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIiksICIxMjUiKTsKLQotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKTsKLSAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGltcG9ydF9lXywgMTI2KTsKLQotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKTsKLSAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG5lc3RlZF9iXywgMTI3KTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIgICApLCAyMDEpOwotICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiICAgKSwgMjAyKTsKLSAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICksIDIwMyk7Ci0gIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiICApLCAyMDQpOwotICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMjA1KTsKLSAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDIwNik7Ci0gIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDMyIiApLCAyMDcpOwotICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMjA4KTsKLSAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDIwOSk7Ci0gIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAyMTApOwotICByZWZsZWN0aW9uLT5BZGRGbG9hdCAobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMjExKTsKLSAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDIxMik7Ci0gIHJlZmxlY3Rpb24tPkFkZEJvb2wgIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApLCB0cnVlKTsKLSAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIgICksICIyMTUiKTsKLSAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICksICIyMTYiKTsKLQotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpKTsKLSAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIHJlcGVhdGVkX2dyb3VwX2FfLCAyMTcpOwotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDIxOCk7Ci0gIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfLCAyMTkpOwotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8sIDIyMCk7Ci0gIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDIyNyk7Ci0KLSAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwgIG5lc3RlZF9iYXJfKTsKLSAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbl9iYXJfKTsKLSAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydF9iYXJfKTsKLQotICByZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksICIyMjQiKTsKLSAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgIjIyNSIpOwotCi0gIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDMwMSk7Ci0gIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAzMDIpOwotICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSwgMzAzKTsKLSAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDMwNCk7Ci0gIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApLCAzMDUpOwotICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMzA2KTsKLSAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDMwNyk7Ci0gIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApLCAzMDgpOwotICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMzA5KTsKLSAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDMxMCk7Ci0gIHJlZmxlY3Rpb24tPkFkZEZsb2F0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApLCAzMTEpOwotICByZWZsZWN0aW9uLT5BZGREb3VibGUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMzEyKTsKLSAgcmVmbGVjdGlvbi0+QWRkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIGZhbHNlKTsKLSAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIgICksICIzMTUiKTsKLSAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICksICIzMTYiKTsKLQotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpKTsKLSAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIHJlcGVhdGVkX2dyb3VwX2FfLCAzMTcpOwotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDMxOCk7Ci0gIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfLCAzMTkpOwotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8sIDMyMCk7Ci0gIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+QWRkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDMyNyk7Ci0KLSAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwgIG5lc3RlZF9iYXpfKTsKLSAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbl9iYXpfKTsKLSAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydF9iYXpfKTsKLQotICByZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksICIzMjQiKTsKLSAgcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgIjMyNSIpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgcmVmbGVjdGlvbi0+U2V0SW50MzIgKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50MzIiICAgKSwgNDAxKTsKLSAgcmVmbGVjdGlvbi0+U2V0SW50NjQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50NjQiICAgKSwgNDAyKTsKLSAgcmVmbGVjdGlvbi0+U2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiAgKSwgNDAzKTsKLSAgcmVmbGVjdGlvbi0+U2V0VUludDY0KG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDY0IiAgKSwgNDA0KTsKLSAgcmVmbGVjdGlvbi0+U2V0SW50MzIgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDMyIiAgKSwgNDA1KTsKLSAgcmVmbGVjdGlvbi0+U2V0SW50NjQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IiAgKSwgNDA2KTsKLSAgcmVmbGVjdGlvbi0+U2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfZml4ZWQzMiIgKSwgNDA3KTsKLSAgcmVmbGVjdGlvbi0+U2V0VUludDY0KG1lc3NhZ2UsIEYoImRlZmF1bHRfZml4ZWQ2NCIgKSwgNDA4KTsKLSAgcmVmbGVjdGlvbi0+U2V0SW50MzIgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSwgNDA5KTsKLSAgcmVmbGVjdGlvbi0+U2V0SW50NjQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkNjQiKSwgNDEwKTsKLSAgcmVmbGVjdGlvbi0+U2V0RmxvYXQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfZmxvYXQiICAgKSwgNDExKTsKLSAgcmVmbGVjdGlvbi0+U2V0RG91YmxlKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiAgKSwgNDEyKTsKLSAgcmVmbGVjdGlvbi0+U2V0Qm9vbCAgKG1lc3NhZ2UsIEYoImRlZmF1bHRfYm9vbCIgICAgKSwgZmFsc2UpOwotICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciICApLCAiNDE1Iik7Ci0gIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIiAgICksICI0MTYiKTsKLQotICByZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfZm9vXyk7Ci0gIHJlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbl9mb29fKTsKLSAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApLCAgaW1wb3J0X2Zvb18pOwotCi0gIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpLCAiNDI0Iik7Ci0gIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSwgIjQyNSIpOwotCi0gIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBGKCJvbmVvZl91aW50MzIiICAgKSwgNjAxKTsKLSAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZShtZXNzYWdlLCBGKCJvbmVvZl9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG5lc3RlZF9iXywgNjAyKTsKLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9uZW9mX3N0cmluZyIpLCAiNjAzIik7Ci0gIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvbmVvZl9ieXRlcyIgKSwgIjYwNCIpOwotfQotCi12b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpTZXRPbmVvZlZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSkgewotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOwotICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQ2NCgKLSAgICAgIHN1Yl9tZXNzYWdlLAotICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5wb29sKCktPkZpbmRGaWVsZEJ5TmFtZSgKLSAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mMi5OZXN0ZWRNZXNzYWdlLnF1eF9pbnQiKSwKLSAgICAgIDEwMCk7Ci0KLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9jb3JkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAiMTAxIik7Ci0gIHJlZmxlY3Rpb24tPlNldEludDMyKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhel9pbnQiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgMTAyKTsKLSAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhel9zdHJpbmciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICIxMDMiKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0T25lb2ZTZXRWaWFSZWZsZWN0aW9uKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOwotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHN0cmluZyBzY3JhdGNoOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZCgKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfaW50IikpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhel9zdHJpbmciKSkpOwotCi0gIGNvbnN0IE1lc3NhZ2UqIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCi0gICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9FUSgxMDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDY0KAotICAgICAgKnN1Yl9tZXNzYWdlLAotICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5wb29sKCktPkZpbmRGaWVsZEJ5TmFtZSgKLSAgICAgICAgICAicHJvdG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mMi5OZXN0ZWRNZXNzYWdlLnF1eF9pbnQiKSkpOwotCi0gIEVYUEVDVF9FUSgiMTAxIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpKSk7Ci0gIEVYUEVDVF9FUSgiMTAxIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpLCAmc2NyYXRjaCkpOwotCi0gIEVYUEVDVF9FUSgxMDIsIHJlZmxlY3Rpb24tPkdldEludDMyKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfaW50IikpKTsKLQotICBFWFBFQ1RfRVEoIjEwMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKLSAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X3N0cmluZyIpKSk7Ci0gIEVYUEVDVF9FUSgiMTAzIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKAotICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfc3RyaW5nIiksICZzY3JhdGNoKSk7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlNldFBhY2tlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oCi0gICAgTWVzc2FnZSogbWVzc2FnZSkgewotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICksIDYwMSk7Ci0gIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgNjAyKTsKLSAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApLCA2MDMpOwotICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICksIDYwNCk7Ci0gIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgNjA1KTsKLSAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApLCA2MDYpOwotICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICksIDYwNyk7Ci0gIHJlZmxlY3Rpb24tPkFkZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgNjA4KTsKLSAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpLCA2MDkpOwotICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IiksIDYxMCk7Ci0gIHJlZmxlY3Rpb24tPkFkZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgNjExKTsKLSAgcmVmbGVjdGlvbi0+QWRkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApLCA2MTIpOwotICByZWZsZWN0aW9uLT5BZGRCb29sICAobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICksIHRydWUpOwotICByZWZsZWN0aW9uLT5BZGRFbnVtICAobWVzc2FnZSwgRigicGFja2VkX2VudW0iICAgICksIGZvcmVpZ25fYmFyXyk7Ci0KLSAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApLCA3MDEpOwotICByZWZsZWN0aW9uLT5BZGRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiAgICksIDcwMik7Ci0gIHJlZmxlY3Rpb24tPkFkZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiAgKSwgNzAzKTsKLSAgcmVmbGVjdGlvbi0+QWRkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApLCA3MDQpOwotICByZWZsZWN0aW9uLT5BZGRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NpbnQzMiIgICksIDcwNSk7Ci0gIHJlZmxlY3Rpb24tPkFkZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDY0IiAgKSwgNzA2KTsKLSAgcmVmbGVjdGlvbi0+QWRkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApLCA3MDcpOwotICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiICksIDcwOCk7Ci0gIHJlZmxlY3Rpb24tPkFkZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSwgNzA5KTsKLSAgcmVmbGVjdGlvbi0+QWRkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCA3MTApOwotICByZWZsZWN0aW9uLT5BZGRGbG9hdCAobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiAgICksIDcxMSk7Ci0gIHJlZmxlY3Rpb24tPkFkZERvdWJsZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiAgKSwgNzEyKTsKLSAgcmVmbGVjdGlvbi0+QWRkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCBmYWxzZSk7Ci0gIHJlZmxlY3Rpb24tPkFkZEVudW0gIChtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIgICAgKSwgZm9yZWlnbl9iYXpfKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgLy8gV2UgaGF2ZSB0byBzcGxpdCB0aGlzIGludG8gdGhyZWUgZnVuY3Rpb24gb3RoZXJ3aXNlIGl0IGNyZWF0ZXMgYSBzdGFjawotICAvLyBmcmFtZSBzbyBsYXJnZSB0aGF0IGl0IHRyaWdnZXJzIGEgd2FybmluZy4KLSAgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjEobWVzc2FnZSk7Ci0gIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24yKG1lc3NhZ2UpOwotICBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMyhtZXNzYWdlKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjEoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgewotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0gIHN0cmluZyBzY3JhdGNoOwotICBjb25zdCBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKLQotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQzMiIgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIiAgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF91aW50NjQiICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDY0IiAgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDMyIiApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIiAgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9ib29sIiAgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICAgKSkpOwotCi0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsZ3JvdXAiICAgICAgICAgICAgICAgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiAgICAgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIgICAgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiAgICAgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIgICAgICAgICApKSk7Ci0KLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpOwotICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGdyb3VwX2FfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOwotICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKTsKLSAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8pKTsKLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2VfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpOwotICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOwotCi0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7Ci0KLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpKSk7Ci0KLSAgRVhQRUNUX0VRKDEwMSAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSkpOwotICBFWFBFQ1RfRVEoMTAyICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7Ci0gIEVYUEVDVF9FUSgxMDMgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKLSAgRVhQRUNUX0VRKDEwNCAgLCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSkpOwotICBFWFBFQ1RfRVEoMTA1ICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50MzIiICApKSk7Ci0gIEVYUEVDVF9FUSgxMDYgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKLSAgRVhQRUNUX0VRKDEwNyAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOwotICBFWFBFQ1RfRVEoMTA4ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDY0IiApKSk7Ci0gIEVYUEVDVF9FUSgxMDkgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKLSAgRVhQRUNUX0VRKDExMCAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOwotICBFWFBFQ1RfRVEoMTExICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9mbG9hdCIgICApKSk7Ci0gIEVYUEVDVF9FUSgxMTIgICwgcmVmbGVjdGlvbi0+R2V0RG91YmxlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKLSAgRVhQRUNUX1RSVUUoICAgICByZWZsZWN0aW9uLT5HZXRCb29sICAobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSkpOwotICBFWFBFQ1RfRVEoIjExNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApKSk7Ci0gIEVYUEVDVF9FUSgiMTE2IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKLQotICBFWFBFQ1RfRVEoIjExNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSwgJnNjcmF0Y2gpKTsKLSAgRVhQRUNUX0VRKCIxMTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICksICZzY3JhdGNoKSk7Ci0KLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIikpOwotICBFWFBFQ1RfRVEoMTE3LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGdyb3VwX2FfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9FUSgxMTgsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpOwotICBFWFBFQ1RfRVEoMTE5LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18pKTsKLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKTsKLSAgRVhQRUNUX0VRKDEyMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8pKTsKLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9FUSgxMjYsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2VfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpOwotICBFWFBFQ1RfRVEoMTI3LCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOwotCi0gIEVYUEVDVF9FUSggbmVzdGVkX2Jhel8sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKLSAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOwotICBFWFBFQ1RfRVEoIGltcG9ydF9iYXpfLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9lbnVtIiApKSk7Ci0KLSAgRVhQRUNUX0VRKCIxMjQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKLSAgRVhQRUNUX0VRKCIxMjQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiksICZzY3JhdGNoKSk7Ci0KLSAgRVhQRUNUX0VRKCIxMjUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpKSk7Ci0gIEVYUEVDVF9FUSgiMTI1IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSwgJnNjcmF0Y2gpKTsKLQotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvbmVvZl9ieXRlcyIgKSkpOwotICBFWFBFQ1RfRVEoIjYwNCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvbmVvZl9ieXRlcyIgICApKSk7Ci0KLSAgaWYgKGJhc2VfZGVzY3JpcHRvcl8tPm5hbWUoKSA9PSAiVGVzdEFsbFR5cGVzIikgewotICAgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvbmVvZl91aW50MzIiKSkpOwotICAgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvbmVvZl9zdHJpbmciKSkpOwotICB9IGVsc2UgewotICAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9uZW9mX3VpbnQzMiIpKSk7Ci0gICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib25lb2Zfc3RyaW5nIikpKTsKLSAgICBFWFBFQ1RfRVEoNjAxICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJvbmVvZl91aW50MzIiKSkpOwotICAgIEVYUEVDVF9FUSgiNjAzIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9uZW9mX3N0cmluZyIpKSk7Ci0gICAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvbmVvZl9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgICBFWFBFQ1RfRVEoNjAyLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOwotICB9Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24yKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotICBzdHJpbmcgc2NyYXRjaDsKLSAgY29uc3QgTWVzc2FnZSogc3ViX21lc3NhZ2U7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOwotCi0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiICAgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgICAgKSkpOwotCi0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIikpKTsKLQotICBFWFBFQ1RfRVEoMjAxICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDApKTsKLSAgRVhQRUNUX0VRKDIwMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDMgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDMyIiAgKSwgMCkpOwotICBFWFBFQ1RfRVEoMjA0ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDApKTsKLSAgRVhQRUNUX0VRKDIwNSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50MzIiICApLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDYgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMCkpOwotICBFWFBFQ1RfRVEoMjA3ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDApKTsKLSAgRVhQRUNUX0VRKDIwOCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDY0IiApLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMDkgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMCkpOwotICBFWFBFQ1RfRVEoMjEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKLSAgRVhQRUNUX0VRKDIxMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApLCAwKSk7Ci0gIEVYUEVDVF9FUSgyMTIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMCkpOwotICBFWFBFQ1RfVFJVRSggICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIDApKTsKLSAgRVhQRUNUX0VRKCIyMTUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAwKSk7Ci0gIEVYUEVDVF9FUSgiMjE2IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiICAgKSwgMCkpOwotCi0gIEVYUEVDVF9FUSgiMjE1IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiksIDAsICZzY3JhdGNoKSk7Ci0gIEVYUEVDVF9FUSgiMjE2IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigicmVwZWF0ZWRfYnl0ZXMiKSwgMCwgJnNjcmF0Y2gpKTsKLQotICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAwKTsKLSAgRVhQRUNUX0VRKDIxNywgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXykpOwotICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMCk7Ci0gIEVYUEVDVF9FUSgyMTgsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMCk7Ci0gIEVYUEVDVF9FUSgyMTksIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOwotICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMCk7Ci0gIEVYUEVDVF9FUSgyMjAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMCk7Ci0gIEVYUEVDVF9FUSgyMjcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7Ci0KLSAgRVhQRUNUX0VRKCBuZXN0ZWRfYmFyXywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDApKTsKLSAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDApKTsKLSAgRVhQRUNUX0VRKCBpbXBvcnRfYmFyXywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDApKTsKLQotICBFWFBFQ1RfRVEoIjIyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAwKSk7Ci0gIEVYUEVDVF9FUSgiMjI0IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMCwgJnNjcmF0Y2gpKTsKLQotICBFWFBFQ1RfRVEoIjIyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMCkpOwotICBFWFBFQ1RfRVEoIjIyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpLCAwLCAmc2NyYXRjaCkpOwotCi0gIEVYUEVDVF9FUSgzMDEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50MzIiICAgKSwgMSkpOwotICBFWFBFQ1RfRVEoMzAyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiAgICksIDEpKTsKLSAgRVhQRUNUX0VRKDMwMyAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50MzIiICApLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDQgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicmVwZWF0ZWRfdWludDY0IiAgKSwgMSkpOwotICBFWFBFQ1RfRVEoMzA1ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEpKTsKLSAgRVhQRUNUX0VRKDMwNiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zaW50NjQiICApLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDcgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMSkpOwotICBFWFBFQ1RfRVEoMzA4ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEpKTsKLSAgRVhQRUNUX0VRKDMwOSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMTAgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMSkpOwotICBFWFBFQ1RfRVEoMzExICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRmxvYXQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEpKTsKLSAgRVhQRUNUX0VRKDMxMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9kb3VibGUiICApLCAxKSk7Ci0gIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sICAobWVzc2FnZSwgRigicmVwZWF0ZWRfYm9vbCIgICAgKSwgMSkpOwotICBFWFBFQ1RfRVEoIjMxNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIgICksIDEpKTsKLSAgRVhQRUNUX0VRKCIzMTYiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIgICApLCAxKSk7Ci0KLSAgRVhQRUNUX0VRKCIzMTUiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmc2NyYXRjaCkpOwotICBFWFBFQ1RfRVEoIjMxNiIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJnNjcmF0Y2gpKTsKLQotICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAxKTsKLSAgRVhQRUNUX0VRKDMxNywgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCByZXBlYXRlZF9ncm91cF9hXykpOwotICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSk7Ci0gIEVYUEVDVF9FUSgzMTgsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSk7Ci0gIEVYUEVDVF9FUSgzMTksIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOwotICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSk7Ci0gIEVYUEVDVF9FUSgzMjAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSk7Ci0gIEVYUEVDVF9FUSgzMjcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7Ci0KLSAgRVhQRUNUX0VRKCBuZXN0ZWRfYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDEpKTsKLSAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDEpKTsKLSAgRVhQRUNUX0VRKCBpbXBvcnRfYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDEpKTsKLQotICBFWFBFQ1RfRVEoIjMyNCIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxKSk7Ci0gIEVYUEVDVF9FUSgiMzI0IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSwgJnNjcmF0Y2gpKTsKLQotICBFWFBFQ1RfRVEoIjMyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2NvcmQiKSwgMSkpOwotICBFWFBFQ1RfRVEoIjMyNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpLCAxLCAmc2NyYXRjaCkpOwotfQotCi12b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMygKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLSAgc3RyaW5nIHNjcmF0Y2g7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQ2NCIgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiAgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50MzIiICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IiAgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDY0IiApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9mbG9hdCIgICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiAgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciICApKSk7Ci0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOwotCi0gIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7Ci0KLSAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOwotCi0gIEVYUEVDVF9FUSg0MDEgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoImRlZmF1bHRfaW50MzIiICAgKSkpOwotICBFWFBFQ1RfRVEoNDAyICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKLSAgRVhQRUNUX0VRKDQwMyAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigiZGVmYXVsdF91aW50MzIiICApKSk7Ci0gIEVYUEVDVF9FUSg0MDQgICwgcmVmbGVjdGlvbi0+R2V0VUludDY0KG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDY0IiAgKSkpOwotICBFWFBFQ1RfRVEoNDA1ICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKLSAgRVhQRUNUX0VRKDQwNiAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigiZGVmYXVsdF9zaW50NjQiICApKSk7Ci0gIEVYUEVDVF9FUSg0MDcgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOwotICBFWFBFQ1RfRVEoNDA4ICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKLSAgRVhQRUNUX0VRKDQwOSAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7Ci0gIEVYUEVDVF9FUSg0MTAgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOwotICBFWFBFQ1RfRVEoNDExICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKLSAgRVhQRUNUX0VRKDQxMiAgLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigiZGVmYXVsdF9kb3VibGUiICApKSk7Ci0gIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0Qm9vbCAgKG1lc3NhZ2UsIEYoImRlZmF1bHRfYm9vbCIgICAgKSkpOwotICBFWFBFQ1RfRVEoIjQxNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKLSAgRVhQRUNUX0VRKCI0MTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgICApKSk7Ci0KLSAgRVhQRUNUX0VRKCI0MTUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciKSwgJnNjcmF0Y2gpKTsKLSAgRVhQRUNUX0VRKCI0MTYiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgKSwgJnNjcmF0Y2gpKTsKLQotICBFWFBFQ1RfRVEoIG5lc3RlZF9mb29fLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKLSAgRVhQRUNUX0VRKGZvcmVpZ25fZm9vXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7Ci0gIEVYUEVDVF9FUSggaW1wb3J0X2Zvb18sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOwotCi0gIEVYUEVDVF9FUSgiNDI0IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKLSAgRVhQRUNUX0VRKCI0MjQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnNjcmF0Y2gpKTsKLQotICBFWFBFQ1RfRVEoIjQyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOwotICBFWFBFQ1RfRVEoIjQyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSwgJnNjcmF0Y2gpKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0UGFja2VkRmllbGRzU2V0VmlhUmVmbGVjdGlvbigKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLQotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiAgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiAgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NpbnQzMiIgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDY0IiAgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiAgICkpKTsKLSAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiAgKSkpOwotICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApKSk7Ci0gIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2VudW0iICAgICkpKTsKLQotICBFWFBFQ1RfRVEoNjAxICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX2ludDY0IiAgICksIDApKTsKLSAgRVhQRUNUX0VRKDYwMyAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQzMihtZXNzYWdlLCBGKCJwYWNrZWRfdWludDMyIiAgKSwgMCkpOwotICBFWFBFQ1RfRVEoNjA0ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDUgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NpbnQzMiIgICksIDApKTsKLSAgRVhQRUNUX0VRKDYwNiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDY0IiAgKSwgMCkpOwotICBFWFBFQ1RfRVEoNjA3ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDggICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkNjQiICksIDApKTsKLSAgRVhQRUNUX0VRKDYwOSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ZpeGVkMzIiKSwgMCkpOwotICBFWFBFQ1RfRVEoNjEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MTEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdCAobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiAgICksIDApKTsKLSAgRVhQRUNUX0VRKDYxMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiAgKSwgMCkpOwotICBFWFBFQ1RfVFJVRSggICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCAwKSk7Ci0gIEVYUEVDVF9FUShmb3JlaWduX2Jhcl8sCi0gICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicGFja2VkX2VudW0iKSwgMCkpOwotCi0gIEVYUEVDVF9FUSg3MDEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICksIDEpKTsKLSAgRVhQRUNUX0VRKDcwMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgMSkpOwotICBFWFBFQ1RfRVEoNzAzICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDQgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50NjQobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICksIDEpKTsKLSAgRVhQRUNUX0VRKDcwNSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgMSkpOwotICBFWFBFQ1RfRVEoNzA2ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDcgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICksIDEpKTsKLSAgRVhQRUNUX0VRKDcwOCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMSkpOwotICBFWFBFQ1RfRVEoNzA5ICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MTAgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IiksIDEpKTsKLSAgRVhQRUNUX0VRKDcxMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgMSkpOwotICBFWFBFQ1RfRVEoNzEyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApLCAxKSk7Ci0gIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sICAobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICksIDEpKTsKLSAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywKLSAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIpLCAxKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotICBzdHJpbmcgc2NyYXRjaDsKLSAgY29uc3QgTWVzc2FnZSogc3ViX21lc3NhZ2U7Ci0KLSAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW50NjQiICAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDMyIiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDMyIiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ludDY0IiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZmxvYXQiICAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICAgKSkpOwotCi0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIiAgICAgICAgICAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIikpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2xhenlfbWVzc2FnZSIpKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX2VudW0iKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKLQotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIikpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOwotCi0gIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KLSAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRJbnQzMiAobWVzc2FnZSwgRigib3B0aW9uYWxfaW50MzIiICAgKSkpOwotICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRVSW50NjQobWVzc2FnZSwgRigib3B0aW9uYWxfdWludDY0IiAgKSkpOwotICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJvcHRpb25hbF9zaW50MzIiICApKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRVSW50MzIobWVzc2FnZSwgRigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOwotICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJvcHRpb25hbF9maXhlZDY0IiApKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0SW50MzIgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXRJbnQ2NCAobWVzc2FnZSwgRigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOwotICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9mbG9hdCIgICApKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0RG91YmxlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKLSAgRVhQRUNUX0ZBTFNFKCAgICByZWZsZWN0aW9uLT5HZXRCb29sICAobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSkpOwotICBFWFBFQ1RfRVEoIiIgICAsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApKSk7Ci0gIEVYUEVDVF9FUSgiIiAgICwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKLQotICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciKSwgJnNjcmF0Y2gpKTsKLSAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfYnl0ZXMiICksICZzY3JhdGNoKSk7Ci0KLSAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCi0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKTsKLSAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKLSAgRVhQRUNUX0VRKDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZ3JvdXBfYV8pKTsKLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpKTsKLSAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7Ci0gIEVYUEVDVF9FUSgwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOwotICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKTsKLSAgRVhQRUNUX0ZBTFNFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOwotICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfKSk7Ci0gIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOwotICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8pKTsKLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9lXykpOwotICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKLSAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7Ci0gIEVYUEVDVF9GQUxTRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIG5lc3RlZF9iXykpOwotICBFWFBFQ1RfRVEoMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKLQotICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgotICBFWFBFQ1RfRVEoIG5lc3RlZF9mb29fLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7Ci0gIEVYUEVDVF9FUShmb3JlaWduX2Zvb18sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgRVhQRUNUX0VRKCBpbXBvcnRfZm9vXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOwotCi0gIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7Ci0gIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpLCAmc2NyYXRjaCkpOwotCi0gIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSkpOwotICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIiksICZzY3JhdGNoKSk7Ci0KLSAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbnQzMiIgICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW50NjQiICAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF91aW50NjQiICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc2ludDMyIiAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9maXhlZDMyIiApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZml4ZWQ2NCIgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIikpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiICAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICkpKTsKLQotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkZ3JvdXAiICAgICAgICAgICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIiAgICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgICAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKLQotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfY29yZCIpKSk7Ci0KLSAgLy8gaGFzX2JsYWgoKSBzaG91bGQgYWxzbyBiZSBmYWxzZSBmb3IgYWxsIGRlZmF1bHQgZmllbGRzLgotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9pbnQzMiIgICApKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfdWludDMyIiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF91aW50NjQiICApKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ludDY0IiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9maXhlZDMyIiApKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkMzIiKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfZG91YmxlIiAgKSkpOwotICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigiZGVmYXVsdF9ib29sIiAgICApKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOwotCi0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7Ci0gIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKLSAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoImRlZmF1bHRfY29yZCIpKSk7Ci0KLSAgLy8gRmllbGRzIHdpdGggZGVmYXVsdHMgaGF2ZSB0aGVpciBkZWZhdWx0IHZhbHVlcyAoZHVoKS4KLSAgRVhQRUNUX0VRKCA0MSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDMyIiAgICkpKTsKLSAgRVhQRUNUX0VRKCA0MiAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKLSAgRVhQRUNUX0VRKCA0MyAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKLSAgRVhQRUNUX0VRKCA0NCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X3VpbnQ2NCIgICkpKTsKLSAgRVhQRUNUX0VRKC00NSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKLSAgRVhQRUNUX0VRKCA0NiAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKLSAgRVhQRUNUX0VRKCA0NyAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQzMihtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkMzIiICkpKTsKLSAgRVhQRUNUX0VRKCA0OCAgICAsIHJlZmxlY3Rpb24tPkdldFVJbnQ2NChtZXNzYWdlLCBGKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKLSAgRVhQRUNUX0VRKCA0OSAgICAsIHJlZmxlY3Rpb24tPkdldEludDMyIChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKLSAgRVhQRUNUX0VRKC01MCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKLSAgRVhQRUNUX0VRKCA1MS41ICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKLSAgRVhQRUNUX0VRKCA1MmUzICAsIHJlZmxlY3Rpb24tPkdldERvdWJsZShtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKLSAgRVhQRUNUX1RSVUUoICAgICAgIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKLSAgRVhQRUNUX0VRKCJoZWxsbyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKLSAgRVhQRUNUX0VRKCJ3b3JsZCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKLQotICBFWFBFQ1RfRVEoImhlbGxvIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nIiksICZzY3JhdGNoKSk7Ci0gIEVYUEVDVF9FUSgid29ybGQiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9ieXRlcyIgKSwgJnNjcmF0Y2gpKTsKLQotICBFWFBFQ1RfRVEoIG5lc3RlZF9iYXJfLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKLSAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7Ci0gIEVYUEVDVF9FUSggaW1wb3J0X2Jhcl8sIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgRigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOwotCi0gIEVYUEVDVF9FUSgiYWJjIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKLSAgRVhQRUNUX0VRKCJhYmMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwgJnNjcmF0Y2gpKTsKLQotICBFWFBFQ1RfRVEoIjEyMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSkpOwotICBFWFBFQ1RfRVEoIjEyMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBGKCJkZWZhdWx0X2NvcmQiKSwgJnNjcmF0Y2gpKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0UGFja2VkQ2xlYXJWaWFSZWZsZWN0aW9uKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotCi0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ludDMyIiAgICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF91aW50MzIiICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3VpbnQ2NCIgICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zaW50NjQiICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2ZpeGVkMzIiICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQzMiIpKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IikpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSkpOwotICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApKSk7Ci0gIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICkpKTsKLSAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIgICAgKSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbigKLSAgICBNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlOwotCi0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDEsIDUwMSk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDY0IiAgICksIDEsIDUwMik7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEsIDUwMyk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEsIDUwNCk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQzMiIgICksIDEsIDUwNSk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEsIDUwNik7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEsIDUwNyk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDEsIDUwOCk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEsIDUwOSk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEsIDUxMCk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRmxvYXQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDEsIDUxMSk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEsIDUxMik7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEsIHRydWUpOwotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmciICApLCAxLCAiNTE1Iik7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICksIDEsICI1MTYiKTsKLQotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRncm91cCIpLCAxKTsKLSAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIHJlcGVhdGVkX2dyb3VwX2FfLCA1MTcpOwotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDUxOCk7Ci0gIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfLCA1MTkpOwotICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8sIDUyMCk7Ci0gIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSk7Ci0gIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDUyNyk7Ci0KLSAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAxLCAgbmVzdGVkX2Zvb18pOwotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIDEsIGZvcmVpZ25fZm9vXyk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgMSwgIGltcG9ydF9mb29fKTsKLQotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSwgIjUyNCIpOwotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9jb3JkIiksIDEsICI1MjUiKTsKLX0KLQotdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6TW9kaWZ5UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbigKLSAgICBNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50MzIgKG1lc3NhZ2UsIEYoInBhY2tlZF9pbnQzMiIgICApLCAxLCA4MDEpOwotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJwYWNrZWRfaW50NjQiICAgKSwgMSwgODAyKTsKLSAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRVSW50MzIobWVzc2FnZSwgRigicGFja2VkX3VpbnQzMiIgICksIDEsIDgwMyk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDY0KG1lc3NhZ2UsIEYoInBhY2tlZF91aW50NjQiICApLCAxLCA4MDQpOwotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEludDMyIChtZXNzYWdlLCBGKCJwYWNrZWRfc2ludDMyIiAgKSwgMSwgODA1KTsKLSAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NpbnQ2NCIgICksIDEsIDgwNik7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkVUludDMyKG1lc3NhZ2UsIEYoInBhY2tlZF9maXhlZDMyIiApLCAxLCA4MDcpOwotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZFVJbnQ2NChtZXNzYWdlLCBGKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMSwgODA4KTsKLSAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRJbnQzMiAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDMyIiksIDEsIDgwOSk7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCAxLCA4MTApOwotICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgMSwgODExKTsKLSAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicGFja2VkX2RvdWJsZSIgICksIDEsIDgxMik7Ci0gIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCAxLCB0cnVlKTsKLSAgcmVmbGVjdGlvbi0+U2V0UmVwZWF0ZWRFbnVtICAobWVzc2FnZSwgRigicGFja2VkX2VudW0iICAgICksIDEsIGZvcmVpZ25fZm9vXyk7Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlJlbW92ZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3V0cHV0OwotICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmb3V0cHV0KTsKLSAgZm9yIChpbnQgaT0wOyBpPG91dHB1dC5zaXplKCk7ICsraSkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvdXRwdXRbaV07Ci0gICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgY29udGludWU7Ci0KLSAgICByZWZsZWN0aW9uLT5SZW1vdmVMYXN0KG1lc3NhZ2UsIGZpZWxkKTsKLSAgfQotfQotCi12b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpSZWxlYXNlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oCi0gICAgTWVzc2FnZSogbWVzc2FnZSwgYm9vbCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJm91dHB1dCk7Ci0gIGZvciAoaW50IGk9MDsgaTxvdXRwdXQuc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3V0cHV0W2ldOwotICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIGNvbnRpbnVlOwotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgY29udGludWU7Ci0KLSAgICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VMYXN0KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICBpZiAoIWZpZWxkLT5pc19leHRlbnNpb24oKSB8fCBleHBlY3RfZXh0ZW5zaW9uc19ub3RudWxsKSB7Ci0gICAgICBBU1NFUlRfVFJVRShyZWxlYXNlZCAhPSBOVUxMKSA8PCAiUmVsZWFzZUxhc3QgcmV0dXJuZWQgTlVMTCBmb3I6ICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLT5uYW1lKCk7Ci0gICAgfQotICAgIGRlbGV0ZSByZWxlYXNlZDsKLSAgfQotfQotCi12b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpTd2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJm91dHB1dCk7Ci0gIGZvciAoaW50IGk9MDsgaTxvdXRwdXQuc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3V0cHV0W2ldOwotICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIGNvbnRpbnVlOwotCi0gICAgcmVmbGVjdGlvbi0+U3dhcEVsZW1lbnRzKG1lc3NhZ2UsIGZpZWxkLCAwLCAxKTsKLSAgfQotfQotCi12b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjoKLVNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTnVsbFZpYVJlZmxlY3Rpb24oCi0gICAgTWVzc2FnZSogbWVzc2FnZSkgewotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0gIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKm1lc3NhZ2UsICZmaWVsZHMpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLnNpemUoKTsgKytpKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKLSAgICBpZiAoIWZpZWxkLT5pc19vcHRpb25hbCgpIHx8Ci0gICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSBjb250aW51ZTsKLQotICAgIHJlZmxlY3Rpb24tPlNldEFsbG9jYXRlZE1lc3NhZ2UobWVzc2FnZSwgTlVMTCwgZmllbGQpOwotICB9Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OgotU2V0QWxsb2NhdGVkT3B0aW9uYWxNZXNzYWdlRmllbGRzVG9NZXNzYWdlVmlhUmVmbGVjdGlvbigKLSAgICBNZXNzYWdlKiBmcm9tX21lc3NhZ2UsCi0gICAgTWVzc2FnZSogdG9fbWVzc2FnZSkgewotICBFWFBFQ1RfRVEoZnJvbV9tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCksIHRvX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIGZyb21fcmVmbGVjdGlvbiA9IGZyb21fbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBjb25zdCBSZWZsZWN0aW9uKiB0b19yZWZsZWN0aW9uID0gdG9fbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0gIGZyb21fcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqZnJvbV9tZXNzYWdlLCAmZmllbGRzKTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07Ci0gICAgaWYgKCFmaWVsZC0+aXNfb3B0aW9uYWwoKSB8fAotICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgY29udGludWU7Ci0KLSAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9Ci0gICAgICAgIGZyb21fcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoZnJvbV9tZXNzYWdlLCBmaWVsZCk7Ci0gICAgdG9fcmVmbGVjdGlvbi0+U2V0QWxsb2NhdGVkTWVzc2FnZSh0b19tZXNzYWdlLCBzdWJfbWVzc2FnZSwgZmllbGQpOwotICB9Ci19Ci0KLXZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAotICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok1lc3NhZ2VSZWxlYXNlU3RhdGUgZXhwZWN0ZWRfcmVsZWFzZV9zdGF0ZSkgewotICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIHN0YXRpYyBjb25zdCBjaGFyKiBmaWVsZHNbXSA9IHsKLSAgICAib3B0aW9uYWxncm91cCIsCi0gICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiwKLSAgICAib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIiwKLSAgICAib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiLAotICB9OwotICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoZmllbGRzKTsgaSsrKSB7Ci0gICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKCptZXNzYWdlLCBGKGZpZWxkc1tpXSkpOwotICAgIE1lc3NhZ2UqIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UobWVzc2FnZSwgRihmaWVsZHNbaV0pKTsKLSAgICBzd2l0Y2ggKGV4cGVjdGVkX3JlbGVhc2Vfc3RhdGUpIHsKLSAgICAgIGNhc2UgSVNfTlVMTDoKLSAgICAgICAgRVhQRUNUX1RSVUUocmVsZWFzZWQgPT0gTlVMTCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBOT1RfTlVMTDoKLSAgICAgICAgRVhQRUNUX1RSVUUocmVsZWFzZWQgIT0gTlVMTCk7Ci0gICAgICAgIEVYUEVDVF9FUSgmc3ViX21lc3NhZ2UsIHJlbGVhc2VkKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIENBTl9CRV9OVUxMOgotICAgICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVsZXRlIHJlbGVhc2VkOwotICAgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZCgqbWVzc2FnZSwgRihmaWVsZHNbaV0pKSk7Ci0gIH0KLX0KLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWMxM2ExYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oCisrKyAvZGV2L251bGwKQEAgLTEsMjE1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0hfXwotCi0jaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotbmFtZXNwYWNlIHVuaXR0ZXN0ID0gOjpwcm90b2J1Zl91bml0dGVzdDsKLW5hbWVzcGFjZSB1bml0dGVzdF9pbXBvcnQgPSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7Ci0KLWNsYXNzIFRlc3RVdGlsIHsKLSBwdWJsaWM6Ci0gIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KLSAgc3RhdGljIHZvaWQgU2V0QWxsRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRPcHRpb25hbEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgQWRkUmVwZWF0ZWRGaWVsZHMxKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBBZGRSZXBlYXRlZEZpZWxkczIodW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIFNldERlZmF1bHRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIFNldE9uZW9mRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIFNldE9uZW9mRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyogbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIFNldFBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzKiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgU2V0UGFja2VkRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRVbnBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRPbmVvZjEodW5pdHRlc3Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRPbmVvZjIodW5pdHRlc3Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UpOwotCi0gIC8vIFVzZSB0aGUgcmVwZWF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNldF8qKCkgYWNjZXNzb3JzIHRvIG1vZGlmeSBhbGwgdGhlCi0gIC8vIHJlcGVhdGVkIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSAod2hpY2ggc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuCi0gIC8vIGluaXRpYWxpemVkIHdpdGggU2V0KkZpZWxkcygpKS4gIFNldCpGaWVsZHMoKSBpdHNlbGYgb25seSB0ZXN0cwotICAvLyB0aGUgYWRkXyooKSBhY2Nlc3NvcnMuCi0gIHN0YXRpYyB2b2lkIE1vZGlmeVJlcGVhdGVkRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgTW9kaWZ5UGFja2VkRmllbGRzKHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBNb2RpZnlQYWNrZWRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyogbWVzc2FnZSk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlIHZhbHVlcyB0aGF0IHRoZXkgc2hvdWxkIGhhdmUgYWZ0ZXIKLSAgLy8gU2V0KkZpZWxkcygpIGlzIGNhbGxlZC4KLSAgc3RhdGljIHZvaWQgRXhwZWN0QWxsRmllbGRzU2V0KGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RBbGxFeHRlbnNpb25zU2V0KAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRmllbGRzU2V0KGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0VW5wYWNrZWRGaWVsZHNTZXQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RVbnBhY2tlZEV4dGVuc2lvbnNTZXQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFVucGFja2VkRXh0ZW5zaW9ucyYgbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIEV4cGVjdE9uZW9mU2V0MShjb25zdCB1bml0dGVzdDo6VGVzdE9uZW9mMiYgbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIEV4cGVjdE9uZW9mU2V0Mihjb25zdCB1bml0dGVzdDo6VGVzdE9uZW9mMiYgbWVzc2FnZSk7Ci0KLSAgLy8gRXhwZWN0IHRoYXQgdGhlIG1lc3NhZ2UgaXMgbW9kaWZpZWQgYXMgd291bGQgYmUgZXhwZWN0ZWQgZnJvbQotICAvLyBNb2RpZnkqRmllbGRzKCkuCi0gIHN0YXRpYyB2b2lkIEV4cGVjdFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKLSAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zTW9kaWZpZWQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOwotCi0gIC8vIENoZWNrIHRoYXQgYWxsIGZpZWxkcyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzLgotICBzdGF0aWMgdm9pZCBFeHBlY3RDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0RXh0ZW5zaW9uc0NsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RPbmVvZkNsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyJiBtZXNzYWdlKTsKLQotICAvLyBDaGVjayB0aGF0IHRoZSBwYXNzZWQtaW4gc2VyaWFsaXphdGlvbiBpcyB0aGUgY2Fub25pY2FsIHNlcmlhbGl6YXRpb24gd2UKLSAgLy8gZXhwZWN0IGZvciBhIFRlc3RGaWVsZE9yZGVyaW5ncyBtZXNzYWdlIGZpbGxlZCBpbiBieQotICAvLyBTZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKCkuCi0gIHN0YXRpYyB2b2lkIEV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKGNvbnN0IHN0cmluZyYgc2VyaWFsaXplZCk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVwZWF0ZWQgZmllbGRzIGhhdmUgaGFkIHRoZWlyIGxhc3QgZWxlbWVudHMgcmVtb3ZlZC4KLSAgc3RhdGljIHZvaWQgRXhwZWN0TGFzdFJlcGVhdGVkc1JlbW92ZWQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0TGFzdFJlcGVhdGVkRXh0ZW5zaW9uc1JlbW92ZWQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RMYXN0UmVwZWF0ZWRzUmVsZWFzZWQoCi0gICAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0TGFzdFJlcGVhdGVkRXh0ZW5zaW9uc1JlbGVhc2VkKAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKTsKLQotICAvLyBDaGVjayB0aGF0IGFsbCByZXBlYXRlZCBmaWVsZHMgaGF2ZSBoYWQgdGhlaXIgZmlyc3QgYW5kIGxhc3QgZWxlbWVudHMKLSAgLy8gc3dhcHBlZC4KLSAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRzU3dhcHBlZChjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zU3dhcHBlZCgKLSAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7Ci0KLSAgc3RhdGljIHZvaWQgRXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgJm1lc3NhZ2UpOwotCi0gIC8vIExpa2UgYWJvdmUsIGJ1dCB1c2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLgotICBjbGFzcyBSZWZsZWN0aW9uVGVzdGVyIHsKLSAgIHB1YmxpYzoKLSAgICAvLyBiYXNlX2Rlc2NyaXB0b3IgbXVzdCBiZSBhIGRlc2NyaXB0b3IgZm9yIFRlc3RBbGxUeXBlcyBvcgotICAgIC8vIFRlc3RBbGxFeHRlbnNpb25zLiAgSW4gdGhlIGZvcm1lciBjYXNlLCBSZWZsZWN0aW9uVGVzdGVyIGZldGNoZXMgZnJvbQotICAgIC8vIGl0IHRoZSBGaWVsZERlc2NyaXB0b3JzIG5lZWRlZCB0byB1c2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLiAgSW4KLSAgICAvLyB0aGUgbGF0dGVyIGNhc2UsIFJlZmxlY3Rpb25UZXN0ZXIgc2VhcmNoZXMgZm9yIGV4dGVuc2lvbiBmaWVsZHMgaW4KLSAgICAvLyBpdHMgZmlsZS4KLSAgICBleHBsaWNpdCBSZWZsZWN0aW9uVGVzdGVyKGNvbnN0IERlc2NyaXB0b3IqIGJhc2VfZGVzY3JpcHRvcik7Ci0KLSAgICB2b2lkIFNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7Ci0gICAgdm9pZCBNb2RpZnlSZXBlYXRlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7Ci0gICAgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotICAgIHZvaWQgRXhwZWN0Q2xlYXJWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotCi0gICAgdm9pZCBTZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOwotICAgIHZvaWQgTW9kaWZ5UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKLSAgICB2b2lkIEV4cGVjdFBhY2tlZEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0gICAgdm9pZCBFeHBlY3RQYWNrZWRDbGVhclZpYVJlZmxlY3Rpb24oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0KLSAgICB2b2lkIFJlbW92ZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOwotICAgIHZvaWQgUmVsZWFzZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKAotICAgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBib29sIGV4cGVjdF9leHRlbnNpb25zX25vdG51bGwpOwotICAgIHZvaWQgU3dhcFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7Ci0gICAgdm9pZCBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKAotICAgICAgICBNZXNzYWdlKiBtZXNzYWdlKTsKLSAgICBzdGF0aWMgdm9pZCBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAotICAgICAgICBNZXNzYWdlKiBmcm9tX21lc3NhZ2UsCi0gICAgICAgIE1lc3NhZ2UqIHRvX21lc3NhZ2UpOwotCi0gICAgZW51bSBNZXNzYWdlUmVsZWFzZVN0YXRlIHsKLSAgICAgIElTX05VTEwsCi0gICAgICBDQU5fQkVfTlVMTCwKLSAgICAgIE5PVF9OVUxMLAotICAgIH07Ci0gICAgdm9pZCBFeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKLSAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwgTWVzc2FnZVJlbGVhc2VTdGF0ZSBleHBlY3RlZF9yZWxlYXNlX3N0YXRlKTsKLQotICAgIC8vIFNldCBhbmQgY2hlY2sgZnVuY3Rpb25zIGZvciBUZXN0T25lb2YyIG1lc3NhZ2VzLiBObyBuZWVkIHRvIGNvbnN0cnVjdAotICAgIC8vIHRoZSBSZWZsZWN0aW9uVGVzdGVyIGJ5IFRlc3RBbGxUeXBlcyBub3IgVGVzdEFsbEV4dGVuc2lvbnMuCi0gICAgc3RhdGljIHZvaWQgU2V0T25lb2ZWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpOwotICAgIHN0YXRpYyB2b2lkIEV4cGVjdE9uZW9mU2V0VmlhUmVmbGVjdGlvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICAgcHJpdmF0ZToKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEYoY29uc3Qgc3RyaW5nJiBuYW1lKTsKLQotICAgIGNvbnN0IERlc2NyaXB0b3IqIGJhc2VfZGVzY3JpcHRvcl87Ci0KLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGdyb3VwX2FfOwotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogcmVwZWF0ZWRfZ3JvdXBfYV87Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfYl87Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmb3JlaWduX2NfOwotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW1wb3J0X2RfOwotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW1wb3J0X2VfOwotCi0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Zvb187Ci0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Jhcl87Ci0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Jhel87Ci0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZm9yZWlnbl9mb29fOwotICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGZvcmVpZ25fYmFyXzsKLSAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBmb3JlaWduX2Jhel87Ci0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogaW1wb3J0X2Zvb187Ci0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogaW1wb3J0X2Jhcl87Ci0gICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogaW1wb3J0X2Jhel87Ci0KLSAgICAvLyBXZSBoYXZlIHRvIHNwbGl0IHRoaXMgaW50byB0aHJlZSBmdW5jdGlvbiBvdGhlcndpc2UgaXQgY3JlYXRlcyBhIHN0YWNrCi0gICAgLy8gZnJhbWUgc28gbGFyZ2UgdGhhdCBpdCB0cmlnZ2VycyBhIHdhcm5pbmcuCi0gICAgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uMShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLSAgICB2b2lkIEV4cGVjdEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24yKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotICAgIHZvaWQgRXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7Ci0KLSAgICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVmbGVjdGlvblRlc3Rlcik7Ci0gIH07Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFV0aWwpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1RFU1RfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzODhjMGNiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNTg2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi0KLSNkZWZpbmUgRVhQRUNUX1RSVUUgR09PR0xFX0NIRUNLCi0jZGVmaW5lIEFTU0VSVF9UUlVFIEdPT0dMRV9DSEVDSwotI2RlZmluZSBFWFBFQ1RfRkFMU0UoQ09ORCkgR09PR0xFX0NIRUNLKCEoQ09ORCkpCi0jZGVmaW5lIEVYUEVDVF9FUSBHT09HTEVfQ0hFQ0tfRVEKLSNkZWZpbmUgQVNTRVJUX0VRIEdPT0dMRV9DSEVDS19FUQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLXZvaWQgVGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDMyICAgKDEwMSk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbnQ2NCAgICgxMDIpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfdWludDMyICAoMTAzKTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3VpbnQ2NCAgKDEwNCk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zaW50MzIgICgxMDUpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ludDY0ICAoMTA2KTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZpeGVkMzIgKDEwNyk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9maXhlZDY0ICgxMDgpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc2ZpeGVkMzIoMTA5KTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3NmaXhlZDY0KDExMCk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9mbG9hdCAgICgxMTEpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZG91YmxlICAoMTEyKTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2Jvb2wgICAgKHRydWUpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfc3RyaW5nICAoIjExNSIpOwotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfYnl0ZXMgICAoIjExNiIpOwotCi0gIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCktPnNldF9hKDExNyk7Ci0gIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCktPnNldF9iYigxMTgpOwotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLT5zZXRfYygxMTkpOwotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpLT5zZXRfZCgxMjApOwotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZSgxMjYpOwotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLT5zZXRfYmIoMTI3KTsKLQotICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVogKTsKLSAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICk7Ci0gIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVopOwotCi0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50MzIgICAoMjAxKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDY0ICAgKDIwMik7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50MzIgICgyMDMpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDY0ICAoMjA0KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQzMiAgKDIwNSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50NjQgICgyMDYpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQzMiAoMjA3KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkNjQgKDIwOCk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQzMigyMDkpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkNjQoMjEwKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Zsb2F0ICAgKDIxMSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9kb3VibGUgICgyMTIpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYm9vbCAgICAodHJ1ZSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zdHJpbmcgICgiMjE1Iik7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ieXRlcyAgICgiMjE2Iik7Ci0KLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkZ3JvdXAgICAgICAgICAgICgpLT5zZXRfYSgyMTcpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKCktPnNldF9iYigyMTgpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDIxOSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoKS0+c2V0X2QoMjIwKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgpLT5zZXRfYmIoMjI3KTsKLQotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fZW51bSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIpOwotCi0KLSAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50MzIgICAoMzAxKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDY0ICAgKDMwMik7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50MzIgICgzMDMpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDY0ICAoMzA0KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQzMiAgKDMwNSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50NjQgICgzMDYpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZml4ZWQzMiAoMzA3KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkNjQgKDMwOCk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQzMigzMDkpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkNjQoMzEwKTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Zsb2F0ICAgKDMxMSk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9kb3VibGUgICgzMTIpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYm9vbCAgICAoZmFsc2UpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc3RyaW5nICAoIjMxNSIpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfYnl0ZXMgICAoIjMxNiIpOwotCi0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZGdyb3VwICAgICAgICAgICAoKS0+c2V0X2EoMzE3KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgpLT5zZXRfYmIoMzE4KTsKLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYygzMTkpOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKCktPnNldF9kKDMyMCk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoKS0+c2V0X2JiKDMyNyk7Ci0KLSAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtICh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICk7Ci0gIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICApOwotICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaKTsKLQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfaW50MzIgICAoNDAxKTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfaW50NjQgICAoNDAyKTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfdWludDMyICAoNDAzKTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfdWludDY0ICAoNDA0KTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc2ludDMyICAoNDA1KTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc2ludDY0ICAoNDA2KTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfZml4ZWQzMiAoNDA3KTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfZml4ZWQ2NCAoNDA4KTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc2ZpeGVkMzIoNDA5KTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfc2ZpeGVkNjQoNDEwKTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfZmxvYXQgICAoNDExKTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfZG91YmxlICAoNDEyKTsKLSAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfYm9vbCAgICAoZmFsc2UpOwotICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9zdHJpbmcgICgiNDE1Iik7Ci0gIG1lc3NhZ2UtPnNldF9kZWZhdWx0X2J5dGVzICAgKCI0MTYiKTsKLQotICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyApOwotICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICApOwotICBtZXNzYWdlLT5zZXRfZGVmYXVsdF9pbXBvcnRfZW51bSAodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08pOwotCi0KLSAgbWVzc2FnZS0+c2V0X29uZW9mX3VpbnQzMig2MDEpOwotICBtZXNzYWdlLT5tdXRhYmxlX29uZW9mX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig2MDIpOwotICBtZXNzYWdlLT5zZXRfb25lb2Zfc3RyaW5nKCI2MDMiKTsKLSAgbWVzc2FnZS0+c2V0X29uZW9mX2J5dGVzKCI2MDQiKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UmVwZWF0ZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ludDMyICAgKDEsIDUwMSk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9pbnQ2NCAgICgxLCA1MDIpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfdWludDMyICAoMSwgNTAzKTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3VpbnQ2NCAgKDEsIDUwNCk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9zaW50MzIgICgxLCA1MDUpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ludDY0ICAoMSwgNTA2KTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZpeGVkMzIgKDEsIDUwNyk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9maXhlZDY0ICgxLCA1MDgpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc2ZpeGVkMzIoMSwgNTA5KTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX3NmaXhlZDY0KDEsIDUxMCk7Ci0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9mbG9hdCAgICgxLCA1MTEpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZG91YmxlICAoMSwgNTEyKTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2Jvb2wgICAgKDEsIHRydWUpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfc3RyaW5nICAoMSwgIjUxNSIpOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfYnl0ZXMgICAoMSwgIjUxNiIpOwotCi0gIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRncm91cCAgICAgICAgICAgKDEpLT5zZXRfYSg1MTcpOwotICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS0+c2V0X2JiKDUxOCk7Ci0gIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLT5zZXRfYyg1MTkpOwotICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS0+c2V0X2QoNTIwKTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMSktPnNldF9iYig1MjcpOwotCi0gIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyApOwotICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgKTsKLSAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ltcG9ydF9lbnVtICgxLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7Ci0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKSB7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbnQ2NCAgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQ2NCAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50MzIgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkMzIgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9maXhlZDY0ICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDY0KCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mbG9hdCAgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Jvb2wgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLmhhc19hKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLmhhc19iYigpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKS5oYXNfYygpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS5oYXNfZCgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5oYXNfZSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKS5oYXNfYmIoKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9lbnVtICgpKTsKLQotCi0gIEVYUEVDVF9FUSgxMDEgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICgpKTsKLSAgRVhQRUNUX0VRKDEwMiAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgKCkpOwotICBFWFBFQ1RfRVEoMTAzICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSgxMDQgICwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICgpKTsKLSAgRVhQRUNUX0VRKDEwNSAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgKCkpOwotICBFWFBFQ1RfRVEoMTA2ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9FUSgxMDcgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICgpKTsKLSAgRVhQRUNUX0VRKDEwOCAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgKCkpOwotICBFWFBFQ1RfRVEoMTA5ICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9FUSgxMTAgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKLSAgRVhQRUNUX0VRKDExMSAgLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgKCkpOwotICBFWFBFQ1RfRVEoMTEyICAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKLSAgRVhQRUNUX0VRKCIxMTUiLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOwotICBFWFBFQ1RfRVEoIjExNiIsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS5hKCkpOwotICBFWFBFQ1RfRVEoMTE4LCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLmJiKCkpOwotICBFWFBFQ1RfRVEoMTE5LCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmMoKSk7Ci0gIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkuZCgpKTsKLSAgRVhQRUNUX0VRKDEyNiwgbWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5lKCkpOwotICBFWFBFQ1RfRVEoMTI3LCBtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWiwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfZW51bSAoKSk7Ci0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzJfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0X3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0X3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2xfc2l6ZSAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ19zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzX3NpemUgICAoKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwotCi0KLSAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDApKTsKLSAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDApKTsKLSAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDApKTsKLSAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDApKTsKLSAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDApKTsKLSAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDApKTsKLSAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKLSAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKLSAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKLSAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKLSAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKLSAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKLQotICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgwKS5hKCkpOwotICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKLSAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKLSAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMCkuYmIoKSk7Ci0KLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBUiAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bSAoMCkpOwotCi0gIEVYUEVDVF9FUSgzMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgxKSk7Ci0gIEVYUEVDVF9FUSgzMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigxKSk7Ci0gIEVYUEVDVF9FUSgzMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgxKSk7Ci0gIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgxKSk7Ci0gIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgxKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgxKSk7Ci0gIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgxKSk7Ci0gIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgxKSk7Ci0KLSAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMSkuYSgpKTsKLSAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7Ci0gIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7Ci0gIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDEpLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgxKSk7Ci0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50MzIgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfaW50NjQgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDY0ICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDMyICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQzMiAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZml4ZWQ2NCAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkNjQoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZmxvYXQgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYm9vbCAgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9uZXN0ZWRfZW51bSAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKLQotCi0gIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5kZWZhdWx0X2ludDMyICAgKCkpOwotICBFWFBFQ1RfRVEoNDAyICAsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCAgICgpKTsKLSAgRVhQRUNUX0VRKDQwMyAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRVEoNDA1ICAsIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgICgpKTsKLSAgRVhQRUNUX0VRKDQwNiAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIgKCkpOwotICBFWFBFQ1RfRVEoNDA4ICAsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0ICgpKTsKLSAgRVhQRUNUX0VRKDQwOSAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOwotICBFWFBFQ1RfRVEoNDExICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKLSAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOwotICBFWFBFQ1RfRVEoIjQxNSIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgICgpKTsKLSAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLmRlZmF1bHRfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKLQotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl91aW50MzIgICAgICAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX25lc3RlZF9tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2Zfc3RyaW5nICAgICAgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29uZW9mX2J5dGVzICAgICAgICAgICgpKTsKLQotICBFWFBFQ1RfRVEoIjYwNCIsIG1lc3NhZ2Uub25lb2ZfYnl0ZXMoKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKSB7Ci0gIC8vIGhhc19ibGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ludDMyICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW50NjQgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF91aW50MzIgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3VpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc2ludDMyICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zaW50NjQgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZpeGVkMzIgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZml4ZWQ2NCAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zZml4ZWQzMigpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3NmaXhlZDY0KCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZmxvYXQgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9kb3VibGUgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2Jvb2wgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9ieXRlcyAgICgpKTsKLQotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfZW51bSAoKSk7Ci0KLQotICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCi0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCgpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgKCkpOwotICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKLSAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOwotICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7Ci0KLSAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLmhhc19hKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5oYXNfYmIoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmhhc19jKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS5oYXNfZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2UoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmhhc19iYigpKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAoKS5hKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5iYigpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuYygpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCkuZCgpKTsKLQotICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08sIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X2VudW0gKCkpOwotCi0KLSAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjRfc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyX3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyX3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0X3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMl9zaXplICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NF9zaXplICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRfc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlX3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbF9zaXplICAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXNfc2l6ZSAgICgpKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZGdyb3VwX3NpemUgICAgICAgICAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUgICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7Ci0KLQotICAvLyBoYXNfYmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ludDMyICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9pbnQ2NCAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3VpbnQ2NCAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zaW50MzIgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ZpeGVkMzIgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9maXhlZDY0ICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X3NmaXhlZDY0KCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mbG9hdCAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2Jvb2wgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKLQotCi0gIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gIEVYUEVDVF9FUSggNDEgICAgLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIgICAoKSk7Ci0gIEVYUEVDVF9FUSggNDIgICAgLCBtZXNzYWdlLmRlZmF1bHRfaW50NjQgICAoKSk7Ci0gIEVYUEVDVF9FUSggNDMgICAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSggNDQgICAgLCBtZXNzYWdlLmRlZmF1bHRfdWludDY0ICAoKSk7Ci0gIEVYUEVDVF9FUSgtNDUgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDMyICAoKSk7Ci0gIEVYUEVDVF9FUSggNDYgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ludDY0ICAoKSk7Ci0gIEVYUEVDVF9FUSggNDcgICAgLCBtZXNzYWdlLmRlZmF1bHRfZml4ZWQzMiAoKSk7Ci0gIEVYUEVDVF9FUSggNDggICAgLCBtZXNzYWdlLmRlZmF1bHRfZml4ZWQ2NCAoKSk7Ci0gIEVYUEVDVF9FUSggNDkgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIoKSk7Ci0gIEVYUEVDVF9FUSgtNTAgICAgLCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkNjQoKSk7Ci0gIEVYUEVDVF9FUSggNTEuNSAgLCBtZXNzYWdlLmRlZmF1bHRfZmxvYXQgICAoKSk7Ci0gIEVYUEVDVF9FUSggNTJlMyAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICAgLCBtZXNzYWdlLmRlZmF1bHRfYm9vbCAgICAoKSk7Ci0gIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nICAoKSk7Ci0gIEVYUEVDVF9FUSgid29ybGQiLCBtZXNzYWdlLmRlZmF1bHRfYnl0ZXMgICAoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLmRlZmF1bHRfbmVzdGVkX2VudW0gKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5kZWZhdWx0X2ltcG9ydF9lbnVtICgpKTsKLQotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl91aW50MzIgICAgICAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX25lc3RlZF9tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2Zfc3RyaW5nICAgICAgICAoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9ieXRlcyAgICAgICAgICgpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSYgbWVzc2FnZSkgewotICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKLSAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKLSAgLy8gZWxlbWVudCBhbmQgc2l6ZSB3ZXJlICpub3QqIG1vZGlmaWVkLgotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMl9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NF9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzJfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0X3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMl9zaXplKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NF9zaXplKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdF9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ib29sX3NpemUgICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlc19zaXplICAgKCkpOwotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSAgICAgICAgICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKLQotCi0gIEVYUEVDVF9FUSgyMDEgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMiAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDIgICwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDMgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDQgICwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDUgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDYgICwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDcgICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDggICwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0ICgwKSk7Ci0gIEVYUEVDVF9FUSgyMDkgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMigwKSk7Ci0gIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7Ci0gIEVYUEVDVF9FUSgyMTEgICwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCAgICgwKSk7Ci0gIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUgICgwKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5yZXBlYXRlZF9ib29sICAgICgwKSk7Ci0gIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcgICgwKSk7Ci0gIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcyAgICgwKSk7Ci0KLSAgRVhQRUNUX0VRKDIxNywgbWVzc2FnZS5yZXBlYXRlZGdyb3VwICAgICAgICAgICAoMCkuYSgpKTsKLSAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMCkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDApLmMoKSk7Ci0gIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDApLmQoKSk7Ci0gIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDApLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtICgwKSk7Ci0KLQotICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KLSAgRVhQRUNUX0VRKDUwMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyICAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0ICAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwMyAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMiAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNCAgLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMiAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNiAgLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCAgKDEpKTsKLSAgRVhQRUNUX0VRKDUwNyAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIgKDEpKTsKLSAgRVhQRUNUX0VRKDUwOCAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQgKDEpKTsKLSAgRVhQRUNUX0VRKDUwOSAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDEpKTsKLSAgRVhQRUNUX0VRKDUxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDEpKTsKLSAgRVhQRUNUX0VRKDUxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDEpKTsKLSAgRVhQRUNUX0VRKDUxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDEpKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDEpKTsKLSAgRVhQRUNUX0VRKCI1MTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDEpKTsKLSAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDEpKTsKLQotICBFWFBFQ1RfRVEoNTE3LCBtZXNzYWdlLnJlcGVhdGVkZ3JvdXAgICAgICAgICAgICgxKS5hKCkpOwotICBFWFBFQ1RfRVEoNTE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS5iYigpKTsKLSAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMSkuYygpKTsKLSAgRVhQRUNUX0VRKDUyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMSkuZCgpKTsKLSAgRVhQRUNUX0VRKDUyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMSkuYmIoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9GT08sIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0gKDEpKTsKLQotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWxMaXRlOjpTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUqIG1lc3NhZ2UpIHsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9pbnQzMiAgICg2MDEpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDY0ICAgKDYwMik7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfdWludDMyICAoNjAzKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50NjQgICg2MDQpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3NpbnQzMiAgKDYwNSk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDY0ICAoNjA2KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9maXhlZDMyICg2MDcpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkNjQgKDYwOCk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ZpeGVkMzIoNjA5KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQ2NCg2MTApOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2Zsb2F0ICAgKDYxMSk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZG91YmxlICAoNjEyKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9ib29sICAgICh0cnVlKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9lbnVtICAgICh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUik7Ci0gIC8vIGFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZAotICBtZXNzYWdlLT5hZGRfcGFja2VkX2ludDMyICAgKDcwMSk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfaW50NjQgICAoNzAyKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF91aW50MzIgICg3MDMpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3VpbnQ2NCAgKDcwNCk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfc2ludDMyICAoNzA1KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zaW50NjQgICg3MDYpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2ZpeGVkMzIgKDcwNyk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZml4ZWQ2NCAoNzA4KTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9zZml4ZWQzMig3MDkpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX3NmaXhlZDY0KDcxMCk7Ci0gIG1lc3NhZ2UtPmFkZF9wYWNrZWRfZmxvYXQgICAoNzExKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9kb3VibGUgICg3MTIpOwotICBtZXNzYWdlLT5hZGRfcGFja2VkX2Jvb2wgICAgKGZhbHNlKTsKLSAgbWVzc2FnZS0+YWRkX3BhY2tlZF9lbnVtICAgICh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWik7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbExpdGU6Ok1vZGlmeVBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSogbWVzc2FnZSkgewotICBtZXNzYWdlLT5zZXRfcGFja2VkX2ludDMyICAgKDEsIDgwMSk7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfaW50NjQgICAoMSwgODAyKTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF91aW50MzIgICgxLCA4MDMpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX3VpbnQ2NCAgKDEsIDgwNCk7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfc2ludDMyICAoMSwgODA1KTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zaW50NjQgICgxLCA4MDYpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX2ZpeGVkMzIgKDEsIDgwNyk7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfZml4ZWQ2NCAoMSwgODA4KTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9zZml4ZWQzMigxLCA4MDkpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX3NmaXhlZDY0KDEsIDgxMCk7Ci0gIG1lc3NhZ2UtPnNldF9wYWNrZWRfZmxvYXQgICAoMSwgODExKTsKLSAgbWVzc2FnZS0+c2V0X3BhY2tlZF9kb3VibGUgICgxLCA4MTIpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX2Jvb2wgICAgKDEsIHRydWUpOwotICBtZXNzYWdlLT5zZXRfcGFja2VkX2VudW0gICAgKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzU2V0KAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKSB7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKLQotICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDApKTsKLSAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMCkpOwotICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDApKTsKLSAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOwotICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKLSAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDApKTsKLQotICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDEpKTsKLSAgRVhQRUNUX0VRKDcwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgxKSk7Ci0gIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMSkpOwotICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDEpKTsKLSAgRVhQRUNUX0VRKDcwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgxKSk7Ci0gIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMSkpOwotICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDEpKTsKLSAgRVhQRUNUX0VRKDcwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgxKSk7Ci0gIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMSkpOwotICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDEpKTsKLSAgRVhQRUNUX0VRKDcxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgxKSk7Ci0gIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDEpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDEpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkQ2xlYXIoCi0gICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKLSAgLy8gUGFja2VkIHJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCi0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRmllbGRzTW9kaWZpZWQoCi0gICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKLSAgLy8gRG8gdGhlIHNhbWUgZm9yIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMuCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9pbnQzMl9zaXplICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfaW50NjRfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3VpbnQzMl9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF91aW50NjRfc2l6ZSAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfc2ludDMyX3NpemUgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NpbnQ2NF9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9maXhlZDMyX3NpemUgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZml4ZWQ2NF9zaXplICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyX3NpemUoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NF9zaXplKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZmxvYXRfc2l6ZSAgICgpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucGFja2VkX2RvdWJsZV9zaXplICAoKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnBhY2tlZF9ib29sX3NpemUgICAgKCkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5wYWNrZWRfZW51bV9zaXplICAgICgpKTsKLQotICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UucGFja2VkX2ludDMyICAgKDApKTsKLSAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLnBhY2tlZF9pbnQ2NCAgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5wYWNrZWRfdWludDMyICAoMCkpOwotICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UucGFja2VkX3VpbnQ2NCAgKDApKTsKLSAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLnBhY2tlZF9zaW50MzIgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5wYWNrZWRfc2ludDY0ICAoMCkpOwotICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIgKDApKTsKLSAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLnBhY2tlZF9maXhlZDY0ICgwKSk7Ci0gIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkMzIoMCkpOwotICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UucGFja2VkX3NmaXhlZDY0KDApKTsKLSAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLnBhY2tlZF9mbG9hdCAgICgwKSk7Ci0gIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5wYWNrZWRfZG91YmxlICAoMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDApKTsKLSAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCi0gIEVYUEVDVF9FUSg4MDEgICwgbWVzc2FnZS5wYWNrZWRfaW50MzIgICAoMSkpOwotICBFWFBFQ1RfRVEoODAyICAsIG1lc3NhZ2UucGFja2VkX2ludDY0ICAgKDEpKTsKLSAgRVhQRUNUX0VRKDgwMyAgLCBtZXNzYWdlLnBhY2tlZF91aW50MzIgICgxKSk7Ci0gIEVYUEVDVF9FUSg4MDQgICwgbWVzc2FnZS5wYWNrZWRfdWludDY0ICAoMSkpOwotICBFWFBFQ1RfRVEoODA1ICAsIG1lc3NhZ2UucGFja2VkX3NpbnQzMiAgKDEpKTsKLSAgRVhQRUNUX0VRKDgwNiAgLCBtZXNzYWdlLnBhY2tlZF9zaW50NjQgICgxKSk7Ci0gIEVYUEVDVF9FUSg4MDcgICwgbWVzc2FnZS5wYWNrZWRfZml4ZWQzMiAoMSkpOwotICBFWFBFQ1RfRVEoODA4ICAsIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQgKDEpKTsKLSAgRVhQRUNUX0VRKDgwOSAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQzMigxKSk7Ci0gIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMSkpOwotICBFWFBFQ1RfRVEoODExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDEpKTsKLSAgRVhQRUNUX0VRKDgxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgxKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08sIG1lc3NhZ2UucGFja2VkX2VudW0oMSkpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBFeHRlbnNpb25zCi0vLwotLy8gQWxsIHRoaXMgY29kZSBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gdGhlIGFib3ZlIGNvZGUgZXhjZXB0IHRoYXQgaXQncwotLy8gbWFuaXB1bGF0aW5nIGV4dGVuc2lvbiBmaWVsZHMgaW5zdGVhZCBvZiBub3JtYWwgb25lcy4KLS8vCi0vLyBJIGdhdmUgdXAgb24gdGhlIDgwLWNoYXIgbGltaXQgaGVyZS4gIFNvcnJ5LgotCi12b2lkIFRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKSB7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDEwMSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDEwMik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDEwMyk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDEwNCk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDEwNSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDEwNik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDEwNyk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDEwOCk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEwOSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDExMCk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDExMSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDExMik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIHRydWUpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAiMTE1Iik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsICIxMTYiKTsKLQotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAgICAgICApLT5zZXRfYSgxMTcpOwotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLT5zZXRfYmIoMTE4KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS0+c2V0X2MoMTE5KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS0+c2V0X2QoMTIwKTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS0+c2V0X2UoMTI2KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS0+c2V0X2JiKDEyNyk7Ci0KLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVogKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaKTsKLQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMjAxKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMjAyKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMjAzKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMjA0KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMjA1KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMjA2KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMjA3KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMjA4KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMjA5KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMjEwKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMjExKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMjEyKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgdHJ1ZSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsICIyMTUiKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgIjIxNiIpOwotCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKS0+c2V0X2EoMjE3KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfYmIoMjE4KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLT5zZXRfYygyMTkpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICktPnNldF9kKDIyMCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgKS0+c2V0X2JiKDIyNyk7Ci0KLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSKTsKLQotCi0gIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMzAxKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMzAyKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMzAzKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMzA0KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMzA1KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMzA2KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMzA3KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMzA4KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMzA5KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMzEwKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMzExKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMzEyKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgZmFsc2UpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAiMzE1Iik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsICIzMTYiKTsKLQotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICktPnNldF9hKDMxNyk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS0+c2V0X2JiKDMxOCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS0+c2V0X2MoMzE5KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfZCgzMjApOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICktPnNldF9iYigzMjcpOwotCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBWik7Ci0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgNDAxKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCA0MDIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDQwMyk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgNDA0KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCA0MDUpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDQwNik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgNDA3KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCA0MDgpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDQwOSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgNDEwKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCA0MTEpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDQxMik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgZmFsc2UpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsICI0MTUiKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAiNDE2Iik7Ci0KLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyApOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PKTsKLQotCi0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbl9saXRlLCA2MDEpOwotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSktPnNldF9iYig2MDIpOzsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUsICI2MDMiKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb25fbGl0ZSwgIjYwNCIpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWxMaXRlOjpNb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCi0gICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSkgewotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxLCA1MDEpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxLCA1MDIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDMpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDQpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDUpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MDYpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxLCA1MDcpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxLCA1MDgpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxLCA1MDkpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxLCA1MTApOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxLCA1MTEpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxLCA1MTIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxLCB0cnVlKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICwgMSwgIjUxNSIpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAxLCAiNTE2Iik7Ci0KLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAxKS0+c2V0X2EoNTE3KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAxKS0+c2V0X2JiKDUxOCk7Ci0gIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSktPnNldF9jKDUxOSk7Ci0gIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSktPnNldF9kKDUyMCk7Ci0gIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICwgMSktPnNldF9iYig1MjcpOwotCi0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxLCB1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTyk7Ci0KLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICAgICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICApKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgICApKTsKLQotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKS5oYXNfYSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuaGFzX2JiKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS5oYXNfYygpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuaGFzX2QoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmhhc19lKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS5oYXNfYmIoKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLQotCi0gIEVYUEVDVF9FUSgxMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9FUSgxMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9FUSgxMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgxMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgxMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgxMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgxMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9FUSgxMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9FUSgxMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9FUSgxMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9FUSgxMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9FUSgxMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0gIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgiMTE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICAgICAgICkuYSgpKTsKLSAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgxMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICApLmMoKSk7Ci0gIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLmQoKSk7Ci0gIEVYUEVDVF9FUSgxMjYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmUoKSk7Ci0gIEVYUEVDVF9FUSgxMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgICApLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7Ci0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOwotCi0KLSAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDApKTsKLSAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDApKTsKLSAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKLSAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKLSAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLSAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDApKTsKLSAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLQotICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAwKS5hKCkpOwotICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAwKS5iYigpKTsKLSAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMCkuYygpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMCkuZCgpKTsKLSAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICwgMCkuYmIoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDApKTsKLQotCi0gIEVYUEVDVF9FUSgzMDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSgiMzE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgLCAxKSk7Ci0KLSAgRVhQRUNUX0VRKDMxNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICwgMSkuYSgpKTsKLSAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpLmMoKSk7Ci0gIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDEpLmQoKSk7Ci0gIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAsIDEpLmJiKCkpOwotCi0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxKSk7Ci0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLQotCi0gIEVYUEVDVF9FUSg0MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDQwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOwotICBFWFBFQ1RfRVEoNDAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSg0MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDQwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRVEoNDA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSg0MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKDQwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfRVEoNDA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKDQxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOwotICBFWFBFQ1RfRVEoNDEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKLSAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRVEoIjQxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpGT08gLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLQotCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl91aW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS5oYXNfYmIoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7Ci0KLSAgRVhQRUNUX0VRKDYwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfRVEoNjAyLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmJiKCkpOwotICBFWFBFQ1RfRVEoIjYwMyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKCI2MDQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUpKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKLSAgc3RyaW5nIHNlcmlhbGl6ZWQ7Ci0gIEFTU0VSVF9UUlVFKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpKTsKLSAgRVhQRUNUX0VRKCIiLCBzZXJpYWxpemVkKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemUoKSk7Ci0KLSAgLy8gaGFzX2JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICkpOwotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLQotCi0gIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKLSAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKLQotICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAgICAgICApLmhhc19hKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuaGFzX2JiKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICkuaGFzX2MoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS5oYXNfZCgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmhhc19lKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICAgICkuaGFzX2JiKCkpOwotCi0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKS5hKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS5jKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuZCgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmUoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS5iYigpKTsKLQotICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOwotCi0KLSAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eS4KLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0KLQotICAvLyBoYXNfYmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLQotCi0gIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gIEVYUEVDVF9FUSggNDEgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOwotICBFWFBFQ1RfRVEoIDQyICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKCA0MyAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSggNDQgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRVEoLTQ1ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKCA0NiAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSggNDcgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfRVEoIDQ4ICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKCA0OSAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9FUSgtNTAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfRVEoIDUxLjUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKCA1MmUzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOwotICBFWFBFQ1RfRVEoImhlbGxvIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKCJ3b3JsZCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfQkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKLQotCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmhhc19iYigpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb25fbGl0ZSkpOwotfQotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLXZvaWQgVGVzdFV0aWxMaXRlOjpFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7Ci0gIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAotICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAotICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOwotCi0KLSAgRVhQRUNUX0VRKDIwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDIwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDApKTsKLSAgRVhQRUNUX0VRKDIwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDApKTsKLSAgRVhQRUNUX0VRKDIwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKLSAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKLSAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLSAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDApKTsKLSAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLQotICBFWFBFQ1RfRVEoMjE3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgLCAwKS5hKCkpOwotICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAwKS5iYigpKTsKLSAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMCkuYygpKTsKLSAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMCkuZCgpKTsKLSAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICwgMCkuYmIoKSk7Ci0KLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDApKTsKLQotCi0gIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgotICBFWFBFQ1RfRVEoNTAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMSkpOwotICBFWFBFQ1RfRVEoNTAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMSkpOwotICBFWFBFQ1RfRVEoNTAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoNTA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoNTA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoNTA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoNTA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMSkpOwotICBFWFBFQ1RfRVEoNTA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMSkpOwotICBFWFBFQ1RfRVEoNTA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOwotICBFWFBFQ1RfRVEoNTEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOwotICBFWFBFQ1RfRVEoNTExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMSkpOwotICBFWFBFQ1RfRVEoNTEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMSkpOwotICBFWFBFQ1RfRVEoIjUxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoIjUxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb25fbGl0ZSAgICwgMSkpOwotCi0gIEVYUEVDVF9FUSg1MTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAsIDEpLmEoKSk7Ci0gIEVYUEVDVF9FUSg1MTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDEpLmJiKCkpOwotICBFWFBFQ1RfRVEoNTE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAxKS5jKCkpOwotICBFWFBFQ1RfRVEoNTIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAxKS5kKCkpOwotICBFWFBFQ1RfRVEoNTI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgLCAxKS5iYigpKTsKLQotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDEpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0ZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMSkpOwotCi19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbExpdGU6OlNldFBhY2tlZEV4dGVuc2lvbnMoCi0gICAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSkgewotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgNjAxKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDYwMik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCA2MDMpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgNjA0KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDYwNSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCA2MDYpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgNjA3KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDYwOCk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCA2MDkpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgNjEwKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDYxMSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCA2MTIpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgdHJ1ZSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSKTsKLSAgLy8gYWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkCi0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCA3MDEpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgNzAyKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDcwMyk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCA3MDQpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgNzA1KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDcwNik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCA3MDcpOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgNzA4KTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDcwOSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCA3MTApOwotICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgNzExKTsKLSAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDcxMik7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCBmYWxzZSk7Ci0gIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6TW9kaWZ5UGFja2VkRXh0ZW5zaW9ucygKLSAgICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKSB7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAxLCA4MDEpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMSwgODAyKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDEsIDgwMyk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxLCA4MDQpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSwgODA1KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDEsIDgwNik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAxLCA4MDcpOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMSwgODA4KTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDEsIDgwOSk7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAxLCA4MTApOwotICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMSwgODExKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDEsIDgxMik7Ci0gIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAxLCB0cnVlKTsKLSAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICAsIDEsCi0gICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoCi0gICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSkgewotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0KLSAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOwotICBFWFBFQ1RfRVEoNjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOwotICBFWFBFQ1RfRVEoNjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICwgMCkpOwotICBFWFBFQ1RfRVEoNjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUsIDApKTsKLSAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICwgMCkpOwotICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiwKLSAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOwotICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoNzA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoNzA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDEpKTsKLSAgRVhQRUNUX0VRKDcwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMSkpOwotICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDEpKTsKLSAgRVhQRUNUX0VRKDcxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg3MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDEpKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaLAotICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7Ci19Ci0KLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotdm9pZCBUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNDbGVhcigKLSAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlJiBtZXNzYWdlKSB7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICApKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi12b2lkIFRlc3RVdGlsTGl0ZTo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc01vZGlmaWVkKAotICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpIHsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICkpOwotICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICApKTsKLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgKSk7Ci0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOwotICBFWFBFQ1RfRVEoNjAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDMgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOwotICBFWFBFQ1RfRVEoNjA0ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAsIDApKTsKLSAgRVhQRUNUX0VRKDYwNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDYgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOwotICBFWFBFQ1RfRVEoNjA3ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAsIDApKTsKLSAgRVhQRUNUX0VRKDYwOCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MDkgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25fbGl0ZSwgMCkpOwotICBFWFBFQ1RfRVEoNjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUsIDApKTsKLSAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgLCAwKSk7Ci0gIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uX2xpdGUgICwgMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAsIDApKTsKLSAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSLAotICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlLCAwKSk7Ci0KLSAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCi0gIEVYUEVDVF9FUSg4MDEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICwgMSkpOwotICBFWFBFQ1RfRVEoODAyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKLSAgRVhQRUNUX0VRKDgwMyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg4MDQgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uX2xpdGUgICwgMSkpOwotICBFWFBFQ1RfRVEoODA1ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAsIDEpKTsKLSAgRVhQRUNUX0VRKDgwNiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSg4MDcgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl9saXRlICwgMSkpOwotICBFWFBFQ1RfRVEoODA4ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAsIDEpKTsKLSAgRVhQRUNUX0VRKDgwOSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlLCAxKSk7Ci0gIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSwgMSkpOwotICBFWFBFQ1RfRVEoODExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAsIDEpKTsKLSAgRVhQRUNUX0VRKDgxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgLCAxKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbl9saXRlICAgICwgMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08sCi0gICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3YTIyNjkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVEVTVF9VVElMX0xJVEVfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfTElURV9IX18KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnBiLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotbmFtZXNwYWNlIHVuaXR0ZXN0ID0gcHJvdG9idWZfdW5pdHRlc3Q7Ci1uYW1lc3BhY2UgdW5pdHRlc3RfaW1wb3J0ID0gcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OwotCi1jbGFzcyBUZXN0VXRpbExpdGUgewotIHB1YmxpYzoKLSAgLy8gU2V0IGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgotICBzdGF0aWMgdm9pZCBTZXRBbGxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRGaWVsZHModW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUqIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOwotCi0gIC8vIFVzZSB0aGUgcmVwZWF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNldF8qKCkgYWNjZXNzb3JzIHRvIG1vZGlmeSBhbGwgdGhlCi0gIC8vIHJlcGVhdGVkIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSAod2hpY2ggc2hvdWxkIGFscmVhZHkgaGF2ZSBiZWVuCi0gIC8vIGluaXRpYWxpemVkIHdpdGggU2V0KkZpZWxkcygpKS4gIFNldCpGaWVsZHMoKSBpdHNlbGYgb25seSB0ZXN0cwotICAvLyB0aGUgYWRkXyooKSBhY2Nlc3NvcnMuCi0gIHN0YXRpYyB2b2lkIE1vZGlmeVJlcGVhdGVkRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgTW9kaWZ5UmVwZWF0ZWRFeHRlbnNpb25zKAotICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSogbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIE1vZGlmeVBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzTGl0ZSogbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIE1vZGlmeVBhY2tlZEV4dGVuc2lvbnMoCi0gICAgICB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlKiBtZXNzYWdlKTsKLQotICAvLyBDaGVjayB0aGF0IGFsbCBmaWVsZHMgaGF2ZSB0aGUgdmFsdWVzIHRoYXQgdGhleSBzaG91bGQgaGF2ZSBhZnRlcgotICAvLyBTZXQqRmllbGRzKCkgaXMgY2FsbGVkLgotICBzdGF0aWMgdm9pZCBFeHBlY3RBbGxGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RBbGxFeHRlbnNpb25zU2V0KAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZEZpZWxkc1NldCgKLSAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldCgKLSAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOwotCi0gIC8vIEV4cGVjdCB0aGF0IHRoZSBtZXNzYWdlIGlzIG1vZGlmaWVkIGFzIHdvdWxkIGJlIGV4cGVjdGVkIGZyb20KLSAgLy8gTW9kaWZ5KkZpZWxkcygpLgotICBzdGF0aWMgdm9pZCBFeHBlY3RSZXBlYXRlZEZpZWxkc01vZGlmaWVkKAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgKLSAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uc0xpdGUmIG1lc3NhZ2UpOwotICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRGaWVsZHNNb2RpZmllZCgKLSAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRXh0ZW5zaW9uc01vZGlmaWVkKAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7Ci0KLSAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCi0gIHN0YXRpYyB2b2lkIEV4cGVjdENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0RXh0ZW5zaW9uc0NsZWFyKAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7Ci0gIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXNMaXRlJiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgRXhwZWN0UGFja2VkRXh0ZW5zaW9uc0NsZWFyKAotICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSYgbWVzc2FnZSk7Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGVzdFV0aWxMaXRlKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9URVNUX1VUSUxfTElURV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwYjdlNjU1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2UKKysrIC9kZXYvbnVsbApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlMjhkMzguLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlCisrKyAvZGV2L251bGwKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDdhODc0YjUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEzNCArMCwwIEBACi1vcHRpb25hbF9pbnQzMjogMTAxCi1vcHRpb25hbF9pbnQ2NDogMTAyCi1vcHRpb25hbF91aW50MzI6IDEwMwotb3B0aW9uYWxfdWludDY0OiAxMDQKLW9wdGlvbmFsX3NpbnQzMjogMTA1Ci1vcHRpb25hbF9zaW50NjQ6IDEwNgotb3B0aW9uYWxfZml4ZWQzMjogMTA3Ci1vcHRpb25hbF9maXhlZDY0OiAxMDgKLW9wdGlvbmFsX3NmaXhlZDMyOiAxMDkKLW9wdGlvbmFsX3NmaXhlZDY0OiAxMTAKLW9wdGlvbmFsX2Zsb2F0OiAxMTEKLW9wdGlvbmFsX2RvdWJsZTogMTEyCi1vcHRpb25hbF9ib29sOiB0cnVlCi1vcHRpb25hbF9zdHJpbmc6ICIxMTUiCi1vcHRpb25hbF9ieXRlczogIjExNiIKLU9wdGlvbmFsR3JvdXAgewotICBhOiAxMTcKLX0KLW9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsKLSAgYmI6IDExOAotfQotb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIHsKLSAgYzogMTE5Ci19Ci1vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSB7Ci0gIGQ6IDEyMAotfQotb3B0aW9uYWxfbmVzdGVkX2VudW06IEJBWgotb3B0aW9uYWxfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0JBWgotb3B0aW9uYWxfaW1wb3J0X2VudW06IElNUE9SVF9CQVoKLW9wdGlvbmFsX3N0cmluZ19waWVjZTogIjEyNCIKLW9wdGlvbmFsX2NvcmQ6ICIxMjUiCi1vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UgewotICBlOiAxMjYKLX0KLW9wdGlvbmFsX2xhenlfbWVzc2FnZSB7Ci0gIGJiOiAxMjcKLX0KLXJlcGVhdGVkX2ludDMyOiAyMDEKLXJlcGVhdGVkX2ludDMyOiAzMDEKLXJlcGVhdGVkX2ludDY0OiAyMDIKLXJlcGVhdGVkX2ludDY0OiAzMDIKLXJlcGVhdGVkX3VpbnQzMjogMjAzCi1yZXBlYXRlZF91aW50MzI6IDMwMwotcmVwZWF0ZWRfdWludDY0OiAyMDQKLXJlcGVhdGVkX3VpbnQ2NDogMzA0Ci1yZXBlYXRlZF9zaW50MzI6IDIwNQotcmVwZWF0ZWRfc2ludDMyOiAzMDUKLXJlcGVhdGVkX3NpbnQ2NDogMjA2Ci1yZXBlYXRlZF9zaW50NjQ6IDMwNgotcmVwZWF0ZWRfZml4ZWQzMjogMjA3Ci1yZXBlYXRlZF9maXhlZDMyOiAzMDcKLXJlcGVhdGVkX2ZpeGVkNjQ6IDIwOAotcmVwZWF0ZWRfZml4ZWQ2NDogMzA4Ci1yZXBlYXRlZF9zZml4ZWQzMjogMjA5Ci1yZXBlYXRlZF9zZml4ZWQzMjogMzA5Ci1yZXBlYXRlZF9zZml4ZWQ2NDogMjEwCi1yZXBlYXRlZF9zZml4ZWQ2NDogMzEwCi1yZXBlYXRlZF9mbG9hdDogMjExCi1yZXBlYXRlZF9mbG9hdDogMzExCi1yZXBlYXRlZF9kb3VibGU6IDIxMgotcmVwZWF0ZWRfZG91YmxlOiAzMTIKLXJlcGVhdGVkX2Jvb2w6IHRydWUKLXJlcGVhdGVkX2Jvb2w6IGZhbHNlCi1yZXBlYXRlZF9zdHJpbmc6ICIyMTUiCi1yZXBlYXRlZF9zdHJpbmc6ICIzMTUiCi1yZXBlYXRlZF9ieXRlczogIjIxNiIKLXJlcGVhdGVkX2J5dGVzOiAiMzE2IgotUmVwZWF0ZWRHcm91cCB7Ci0gIGE6IDIxNwotfQotUmVwZWF0ZWRHcm91cCB7Ci0gIGE6IDMxNwotfQotcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgewotICBiYjogMjE4Ci19Ci1yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7Ci0gIGJiOiAzMTgKLX0KLXJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSB7Ci0gIGM6IDIxOQotfQotcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIHsKLSAgYzogMzE5Ci19Ci1yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSB7Ci0gIGQ6IDIyMAotfQotcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgewotICBkOiAzMjAKLX0KLXJlcGVhdGVkX25lc3RlZF9lbnVtOiBCQVIKLXJlcGVhdGVkX25lc3RlZF9lbnVtOiBCQVoKLXJlcGVhdGVkX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVIKLXJlcGVhdGVkX2ZvcmVpZ25fZW51bTogRk9SRUlHTl9CQVoKLXJlcGVhdGVkX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFSCi1yZXBlYXRlZF9pbXBvcnRfZW51bTogSU1QT1JUX0JBWgotcmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiAiMjI0IgotcmVwZWF0ZWRfc3RyaW5nX3BpZWNlOiAiMzI0IgotcmVwZWF0ZWRfY29yZDogIjIyNSIKLXJlcGVhdGVkX2NvcmQ6ICIzMjUiCi1yZXBlYXRlZF9sYXp5X21lc3NhZ2UgewotICBiYjogMjI3Ci19Ci1yZXBlYXRlZF9sYXp5X21lc3NhZ2UgewotICBiYjogMzI3Ci19Ci1kZWZhdWx0X2ludDMyOiA0MDEKLWRlZmF1bHRfaW50NjQ6IDQwMgotZGVmYXVsdF91aW50MzI6IDQwMwotZGVmYXVsdF91aW50NjQ6IDQwNAotZGVmYXVsdF9zaW50MzI6IDQwNQotZGVmYXVsdF9zaW50NjQ6IDQwNgotZGVmYXVsdF9maXhlZDMyOiA0MDcKLWRlZmF1bHRfZml4ZWQ2NDogNDA4Ci1kZWZhdWx0X3NmaXhlZDMyOiA0MDkKLWRlZmF1bHRfc2ZpeGVkNjQ6IDQxMAotZGVmYXVsdF9mbG9hdDogNDExCi1kZWZhdWx0X2RvdWJsZTogNDEyCi1kZWZhdWx0X2Jvb2w6IGZhbHNlCi1kZWZhdWx0X3N0cmluZzogIjQxNSIKLWRlZmF1bHRfYnl0ZXM6ICI0MTYiCi1kZWZhdWx0X25lc3RlZF9lbnVtOiBGT08KLWRlZmF1bHRfZm9yZWlnbl9lbnVtOiBGT1JFSUdOX0ZPTwotZGVmYXVsdF9pbXBvcnRfZW51bTogSU1QT1JUX0ZPTwotZGVmYXVsdF9zdHJpbmdfcGllY2U6ICI0MjQiCi1kZWZhdWx0X2NvcmQ6ICI0MjUiCi1vbmVvZl91aW50MzI6IDYwMQotb25lb2ZfbmVzdGVkX21lc3NhZ2UgewotICBiYjogNjAyCi19Ci1vbmVvZl9zdHJpbmc6ICI2MDMiCi1vbmVvZl9ieXRlczogIjYwNCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGM4YjFlYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMzQgKzAsMCBAQAotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl06IDEwMQotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl06IDEwMgotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3VpbnQzMl9leHRlbnNpb25dOiAxMDMKLVtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF91aW50NjRfZXh0ZW5zaW9uXTogMTA0Ci1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl06IDEwNQotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3NpbnQ2NF9leHRlbnNpb25dOiAxMDYKLVtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9maXhlZDMyX2V4dGVuc2lvbl06IDEwNwotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTA4Ci1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogMTA5Ci1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uXTogMTEwCi1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXTogMTExCi1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl06IDExMgotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uXTogdHJ1ZQotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dOiAiMTE1IgotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl06ICIxMTYiCi1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxncm91cF9leHRlbnNpb25dIHsKLSAgYTogMTE3Ci19Ci1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSB7Ci0gIGJiOiAxMTgKLX0KLVtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSB7Ci0gIGM6IDExOQotfQotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0gewotICBkOiAxMjAKLX0KLVtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dOiBCQVoKLVtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9CQVoKLVtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfQkFaCi1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl06ICIxMjQiCi1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfY29yZF9leHRlbnNpb25dOiAiMTI1IgotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsKLSAgZTogMTI2Ci19Ci1bcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0gewotICBiYjogMTI3Ci19Ci1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXTogMjAxCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXTogMzAxCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uXTogMjAyCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uXTogMzAyCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl06IDIwMwotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dOiAzMDMKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uXTogMjA0Ci1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl06IDMwNAotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dOiAyMDUKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uXTogMzA1Ci1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl06IDIwNgotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dOiAzMDYKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl06IDIwNwotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXTogMzA3Ci1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25dOiAyMDgKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl06IDMwOAotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl06IDIwOQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDMyX2V4dGVuc2lvbl06IDMwOQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl06IDIxMAotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbl06IDMxMAotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl06IDIxMQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl06IDMxMQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb25dOiAyMTIKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uXTogMzEyCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dOiB0cnVlCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dOiBmYWxzZQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dOiAiMjE1IgotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb25dOiAiMzE1IgotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl06ICIyMTYiCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uXTogIjMxNiIKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0gewotICBhOiAyMTcKLX0KLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0gewotICBhOiAzMTcKLX0KLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsKLSAgYmI6IDIxOAotfQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0gewotICBiYjogMzE4Ci19Ci1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0gewotICBjOiAyMTkKLX0KLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXSB7Ci0gIGM6IDMxOQotfQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0gewotICBkOiAyMjAKLX0KLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dIHsKLSAgZDogMzIwCi19Ci1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFSCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogQkFaCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFSCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl06IEZPUkVJR05fQkFaCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXTogSU1QT1JUX0JBUgotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9CQVoKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjIyNCIKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjMyNCIKLVtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl06ICIyMjUiCi1bcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dOiAiMzI1IgotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25dIHsKLSAgYmI6IDIyNwotfQotW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25dIHsKLSAgYmI6IDMyNwotfQotW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uXTogNDAxCi1bcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25dOiA0MDIKLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3VpbnQzMl9leHRlbnNpb25dOiA0MDMKLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25dOiA0MDQKLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NpbnQzMl9leHRlbnNpb25dOiA0MDUKLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25dOiA0MDYKLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uXTogNDA3Ci1bcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl06IDQwOAotW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uXTogNDA5Ci1bcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb25dOiA0MTAKLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2Zsb2F0X2V4dGVuc2lvbl06IDQxMQotW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl06IDQxMgotW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfYm9vbF9leHRlbnNpb25dOiBmYWxzZQotW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfc3RyaW5nX2V4dGVuc2lvbl06ICI0MTUiCi1bcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9ieXRlc19leHRlbnNpb25dOiAiNDE2IgotW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXTogRk9PCi1bcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uXTogRk9SRUlHTl9GT08KLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9GT08KLVtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiNDI0IgotW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfY29yZF9leHRlbnNpb25dOiAiNDI1IgotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX3VpbnQzMl9leHRlbnNpb25dOiA2MDEKLVtwcm90b2J1Zl91bml0dGVzdC5vbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dIHsKLSAgYmI6IDYwMgotfQotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX3N0cmluZ19leHRlbnNpb25dOiAiNjAzIgotW3Byb3RvYnVmX3VuaXR0ZXN0Lm9uZW9mX2J5dGVzX2V4dGVuc2lvbl06ICI2MDQiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzZDA3YjEyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMjAwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyBlbXVsYXRlcyBnb29nbGUzL2ZpbGUvYmFzZS9maWxlLmNjCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2lmZGVmIF9NU0NfVkVSCi0jZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gIC8vIHllYWgsIHJpZ2h0Ci0jaW5jbHVkZSA8d2luZG93cy5oPiAgICAgICAgIC8vIEZpbmQqRmlsZSgpLiAgOigKLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2Vsc2UKLSNpbmNsdWRlIDxkaXJlbnQuaD4KLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPGVycm5vLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotI2lmZGVmIF9XSU4zMgotI2RlZmluZSBta2RpcihuYW1lLCBtb2RlKSBta2RpcihuYW1lKQotLy8gV2luZG93cyBkb2Vzbid0IGhhdmUgc3ltYm9saWMgbGlua3MuCi0jZGVmaW5lIGxzdGF0IHN0YXQKLSNpZm5kZWYgRl9PSwotI2RlZmluZSBGX09LIDAwICAvLyBub3QgZGVmaW5lZCBieSBNU1ZDIGZvciB3aGF0ZXZlciByZWFzb24KLSNlbmRpZgotI2VuZGlmCi0KLWJvb2wgRmlsZTo6RXhpc3RzKGNvbnN0IHN0cmluZyYgbmFtZSkgewotICByZXR1cm4gYWNjZXNzKG5hbWUuY19zdHIoKSwgRl9PSykgPT0gMDsKLX0KLQotYm9vbCBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKGNvbnN0IHN0cmluZyYgbmFtZSwgc3RyaW5nKiBvdXRwdXQpIHsKLSAgY2hhciBidWZmZXJbMTAyNF07Ci0gIEZJTEUqIGZpbGUgPSBmb3BlbihuYW1lLmNfc3RyKCksICJyYiIpOwotICBpZiAoZmlsZSA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICBzaXplX3QgbiA9IGZyZWFkKGJ1ZmZlciwgMSwgc2l6ZW9mKGJ1ZmZlciksIGZpbGUpOwotICAgIGlmIChuIDw9IDApIGJyZWFrOwotICAgIG91dHB1dC0+YXBwZW5kKGJ1ZmZlciwgbik7Ci0gIH0KLQotICBpbnQgZXJyb3IgPSBmZXJyb3IoZmlsZSk7Ci0gIGlmIChmY2xvc2UoZmlsZSkgIT0gMCkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gZXJyb3IgPT0gMDsKLX0KLQotdm9pZCBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoY29uc3Qgc3RyaW5nJiBuYW1lLCBzdHJpbmcqIG91dHB1dCkgewotICBHT09HTEVfQ0hFQ0soUmVhZEZpbGVUb1N0cmluZyhuYW1lLCBvdXRwdXQpKSA8PCAiQ291bGQgbm90IHJlYWQ6ICIgPDwgbmFtZTsKLX0KLQotYm9vbCBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZShjb25zdCBzdHJpbmcmIGNvbnRlbnRzLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgRklMRSogZmlsZSA9IGZvcGVuKG5hbWUuY19zdHIoKSwgIndiIik7Ci0gIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiZm9wZW4oIiA8PCBuYW1lIDw8ICIsIFwid2JcIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChmd3JpdGUoY29udGVudHMuZGF0YSgpLCAxLCBjb250ZW50cy5zaXplKCksIGZpbGUpICE9IGNvbnRlbnRzLnNpemUoKSkgewotICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJmd3JpdGUoIiA8PCBuYW1lIDw8ICIpOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBpZiAoZmNsb3NlKGZpbGUpICE9IDApIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXZvaWQgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZShjb25zdCBzdHJpbmcmIGNvbnRlbnRzLCBjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgRklMRSogZmlsZSA9IGZvcGVuKG5hbWUuY19zdHIoKSwgIndiIik7Ci0gIEdPT0dMRV9DSEVDSyhmaWxlICE9IE5VTEwpCi0gICAgICA8PCAiZm9wZW4oIiA8PCBuYW1lIDw8ICIsIFwid2JcIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotICBHT09HTEVfQ0hFQ0tfRVEoZndyaXRlKGNvbnRlbnRzLmRhdGEoKSwgMSwgY29udGVudHMuc2l6ZSgpLCBmaWxlKSwKLSAgICAgICAgICAgICAgICAgIGNvbnRlbnRzLnNpemUoKSkKLSAgICAgIDw8ICJmd3JpdGUoIiA8PCBuYW1lIDw8ICIpOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLSAgR09PR0xFX0NIRUNLKGZjbG9zZShmaWxlKSA9PSAwKQotICAgICAgPDwgImZjbG9zZSgiIDw8IG5hbWUgPDwgIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOwotfQotCi1ib29sIEZpbGU6OkNyZWF0ZURpcihjb25zdCBzdHJpbmcmIG5hbWUsIGludCBtb2RlKSB7Ci0gIHJldHVybiBta2RpcihuYW1lLmNfc3RyKCksIG1vZGUpID09IDA7Ci19Ci0KLWJvb2wgRmlsZTo6UmVjdXJzaXZlbHlDcmVhdGVEaXIoY29uc3Qgc3RyaW5nJiBwYXRoLCBpbnQgbW9kZSkgewotICBpZiAoQ3JlYXRlRGlyKHBhdGgsIG1vZGUpKSByZXR1cm4gdHJ1ZTsKLQotICBpZiAoRXhpc3RzKHBhdGgpKSByZXR1cm4gZmFsc2U7Ci0KLSAgLy8gVHJ5IGNyZWF0aW5nIHRoZSBwYXJlbnQuCi0gIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNocG9zID0gcGF0aC5maW5kX2xhc3Rfb2YoJy8nKTsKLSAgaWYgKHNsYXNocG9zID09IHN0cmluZzo6bnBvcykgewotICAgIC8vIE5vIHBhcmVudCBnaXZlbi4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICByZXR1cm4gUmVjdXJzaXZlbHlDcmVhdGVEaXIocGF0aC5zdWJzdHIoMCwgc2xhc2hwb3MpLCBtb2RlKSAmJgotICAgICAgICAgQ3JlYXRlRGlyKHBhdGgsIG1vZGUpOwotfQotCi12b2lkIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGNvbnN0IHN0cmluZyYgbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHVtbXkxLCB2b2lkKiBkdW1teTIpIHsKLSAgaWYgKG5hbWUuZW1wdHkoKSkgcmV0dXJuOwotCi0gIC8vIFdlIGRvbid0IGNhcmUgdG9vIG11Y2ggYWJvdXQgZXJyb3IgY2hlY2tpbmcgaGVyZSBzaW5jZSB0aGlzIGlzIG9ubHkgdXNlZAotICAvLyBpbiB0ZXN0cyB0byBkZWxldGUgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIHRoYXQgYXJlIHVuZGVyIC90bXAgYW55d2F5LgotCi0jaWZkZWYgX01TQ19WRVIKLSAgLy8gVGhpcyBpbnRlcmZhY2UgaXMgc28gd2VpcmQuCi0gIFdJTjMyX0ZJTkRfREFUQSBmaW5kX2RhdGE7Ci0gIEhBTkRMRSBmaW5kX2hhbmRsZSA9IEZpbmRGaXJzdEZpbGUoKG5hbWUgKyAiLyoiKS5jX3N0cigpLCAmZmluZF9kYXRhKTsKLSAgaWYgKGZpbmRfaGFuZGxlID09IElOVkFMSURfSEFORExFX1ZBTFVFKSB7Ci0gICAgLy8gSnVzdCBkZWxldGUgaXQsIHdoYXRldmVyIGl0IGlzLgotICAgIERlbGV0ZUZpbGUobmFtZS5jX3N0cigpKTsKLSAgICBSZW1vdmVEaXJlY3RvcnkobmFtZS5jX3N0cigpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBkbyB7Ci0gICAgc3RyaW5nIGVudHJ5X25hbWUgPSBmaW5kX2RhdGEuY0ZpbGVOYW1lOwotICAgIGlmIChlbnRyeV9uYW1lICE9ICIuIiAmJiBlbnRyeV9uYW1lICE9ICIuLiIpIHsKLSAgICAgIHN0cmluZyBwYXRoID0gbmFtZSArICIvIiArIGVudHJ5X25hbWU7Ci0gICAgICBpZiAoZmluZF9kYXRhLmR3RmlsZUF0dHJpYnV0ZXMgJiBGSUxFX0FUVFJJQlVURV9ESVJFQ1RPUlkpIHsKLSAgICAgICAgRGVsZXRlUmVjdXJzaXZlbHkocGF0aCwgTlVMTCwgTlVMTCk7Ci0gICAgICAgIFJlbW92ZURpcmVjdG9yeShwYXRoLmNfc3RyKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRGVsZXRlRmlsZShwYXRoLmNfc3RyKCkpOwotICAgICAgfQotICAgIH0KLSAgfSB3aGlsZShGaW5kTmV4dEZpbGUoZmluZF9oYW5kbGUsICZmaW5kX2RhdGEpKTsKLSAgRmluZENsb3NlKGZpbmRfaGFuZGxlKTsKLQotICBSZW1vdmVEaXJlY3RvcnkobmFtZS5jX3N0cigpKTsKLSNlbHNlCi0gIC8vIFVzZSBvcGVuZGlyKCkhICBZYXkhCi0gIC8vIGxzdGF0ID0gRG9uJ3QgZm9sbG93IHN5bWJvbGljIGxpbmtzLgotICBzdHJ1Y3Qgc3RhdCBzdGF0czsKLSAgaWYgKGxzdGF0KG5hbWUuY19zdHIoKSwgJnN0YXRzKSAhPSAwKSByZXR1cm47Ci0KLSAgaWYgKFNfSVNESVIoc3RhdHMuc3RfbW9kZSkpIHsKLSAgICBESVIqIGRpciA9IG9wZW5kaXIobmFtZS5jX3N0cigpKTsKLSAgICBpZiAoZGlyICE9IE5VTEwpIHsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIHN0cnVjdCBkaXJlbnQqIGVudHJ5ID0gcmVhZGRpcihkaXIpOwotICAgICAgICBpZiAoZW50cnkgPT0gTlVMTCkgYnJlYWs7Ci0gICAgICAgIHN0cmluZyBlbnRyeV9uYW1lID0gZW50cnktPmRfbmFtZTsKLSAgICAgICAgaWYgKGVudHJ5X25hbWUgIT0gIi4iICYmIGVudHJ5X25hbWUgIT0gIi4uIikgewotICAgICAgICAgIERlbGV0ZVJlY3Vyc2l2ZWx5KG5hbWUgKyAiLyIgKyBlbnRyeV9uYW1lLCBOVUxMLCBOVUxMKTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIGNsb3NlZGlyKGRpcik7Ci0gICAgcm1kaXIobmFtZS5jX3N0cigpKTsKLQotICB9IGVsc2UgaWYgKFNfSVNSRUcoc3RhdHMuc3RfbW9kZSkpIHsKLSAgICByZW1vdmUobmFtZS5jX3N0cigpKTsKLSAgfQotI2VuZGlmCi19Ci0KLWJvb2wgRmlsZTo6Q2hhbmdlV29ya2luZ0RpcmVjdG9yeShjb25zdCBzdHJpbmcmIG5ld193b3JraW5nX2RpcmVjdG9yeSkgewotICByZXR1cm4gY2hkaXIobmV3X3dvcmtpbmdfZGlyZWN0b3J5LmNfc3RyKCkpID09IDA7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDJmNjNmODAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gZW11bGF0ZXMgZ29vZ2xlMy9maWxlL2Jhc2UvZmlsZS5oCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1RFU1RJTkdfRklMRV9IX18KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1RFU1RJTkdfRklMRV9IX18KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1jb25zdCBpbnQgREVGQVVMVF9GSUxFX01PREUgPSAwNzc3OwotCi0vLyBQcm90b2NvbCBidWZmZXIgY29kZSBvbmx5IHVzZXMgYSBjb3VwbGUgc3RhdGljIG1ldGhvZHMgb2YgRmlsZSwgYW5kIG9ubHkKLS8vIGluIHRlc3RzLgotY2xhc3MgRmlsZSB7Ci0gcHVibGljOgotICAvLyBDaGVjayBpZiB0aGUgZmlsZSBleGlzdHMuCi0gIHN0YXRpYyBib29sIEV4aXN0cyhjb25zdCBzdHJpbmcmIG5hbWUpOwotCi0gIC8vIFJlYWQgYW4gZW50aXJlIGZpbGUgdG8gYSBzdHJpbmcuICBSZXR1cm4gdHJ1ZSBpZiBzdWNjZXNzZnVsLCBmYWxzZQotICAvLyBvdGhlcndpc2UuCi0gIHN0YXRpYyBib29sIFJlYWRGaWxlVG9TdHJpbmcoY29uc3Qgc3RyaW5nJiBuYW1lLCBzdHJpbmcqIG91dHB1dCk7Ci0KLSAgLy8gU2FtZSBhcyBhYm92ZSwgYnV0IGNyYXNoIG9uIGZhaWx1cmUuCi0gIHN0YXRpYyB2b2lkIFJlYWRGaWxlVG9TdHJpbmdPckRpZShjb25zdCBzdHJpbmcmIG5hbWUsIHN0cmluZyogb3V0cHV0KTsKLQotICAvLyBDcmVhdGUgYSBmaWxlIGFuZCB3cml0ZSBhIHN0cmluZyB0byBpdC4KLSAgc3RhdGljIGJvb2wgV3JpdGVTdHJpbmdUb0ZpbGUoY29uc3Qgc3RyaW5nJiBjb250ZW50cywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKTsKLQotICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgY3Jhc2ggb24gZmFpbHVyZS4KLSAgc3RhdGljIHZvaWQgV3JpdGVTdHJpbmdUb0ZpbGVPckRpZShjb25zdCBzdHJpbmcmIGNvbnRlbnRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSk7Ci0KLSAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5LgotICBzdGF0aWMgYm9vbCBDcmVhdGVEaXIoY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgbW9kZSk7Ci0KLSAgLy8gQ3JlYXRlIGEgZGlyZWN0b3J5IGFuZCBhbGwgcGFyZW50IGRpcmVjdG9yaWVzIGlmIG5lY2Vzc2FyeS4KLSAgc3RhdGljIGJvb2wgUmVjdXJzaXZlbHlDcmVhdGVEaXIoY29uc3Qgc3RyaW5nJiBwYXRoLCBpbnQgbW9kZSk7Ci0KLSAgLy8gSWYgIm5hbWUiIGlzIGEgZmlsZSwgd2UgZGVsZXRlIGl0LiAgSWYgaXQgaXMgYSBkaXJlY3RvcnksIHdlCi0gIC8vIGNhbGwgRGVsZXRlUmVjdXJzaXZlbHkoKSBmb3IgZWFjaCBmaWxlIG9yIGRpcmVjdG9yeSAob3RoZXIgdGhhbgotICAvLyBkb3QgYW5kIGRvdWJsZS1kb3QpIHdpdGhpbiBpdCwgYW5kIHRoZW4gZGVsZXRlIHRoZSBkaXJlY3RvcnkgaXRzZWxmLgotICAvLyBUaGUgImR1bW15IiBwYXJhbWV0ZXJzIGhhdmUgYSBtZWFuaW5nIGluIHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHRoaXMKLSAgLy8gbWV0aG9kIGJ1dCB0aGV5IGFyZSBub3QgdXNlZCBhbnl3aGVyZSBpbiBwcm90b2NvbCBidWZmZXJzLgotICBzdGF0aWMgdm9pZCBEZWxldGVSZWN1cnNpdmVseShjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGR1bW15MSwgdm9pZCogZHVtbXkyKTsKLQotICAvLyBDaGFuZ2Ugd29ya2luZyBkaXJlY3RvcnkgdG8gZ2l2ZW4gZGlyZWN0b3J5LgotICBzdGF0aWMgYm9vbCBDaGFuZ2VXb3JraW5nRGlyZWN0b3J5KGNvbnN0IHN0cmluZyYgbmV3X3dvcmtpbmdfZGlyZWN0b3J5KTsKLQotICBzdGF0aWMgYm9vbCBHZXRDb250ZW50cygKLSAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgc3RyaW5nKiBvdXRwdXQsIGJvb2wgLyppc19kZWZhdWx0Ki8pIHsKLSAgICByZXR1cm4gUmVhZEZpbGVUb1N0cmluZyhuYW1lLCBvdXRwdXQpOwotICB9Ci0KLSAgc3RhdGljIGJvb2wgU2V0Q29udGVudHMoCi0gICAgICBjb25zdCBzdHJpbmcmIG5hbWUsIGNvbnN0IHN0cmluZyYgY29udGVudHMsIGJvb2wgLyppc19kZWZhdWx0Ki8pIHsKLSAgICByZXR1cm4gV3JpdGVTdHJpbmdUb0ZpbGUoY29udGVudHMsIG5hbWUpOwotICB9Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZSk7Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVEVTVElOR19GSUxFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmI5Y2RkZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYworKysgL2Rldi9udWxsCkBAIC0xLDI2NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gZW11bGF0ZXMgZ29vZ2xlMy90ZXN0aW5nL2Jhc2UvcHVibGljL2dvb2dsZXRlc3QuY2MKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxzeXMvc3RhdC5oPgotI2luY2x1ZGUgPHN5cy90eXBlcy5oPgotI2luY2x1ZGUgPGVycm5vLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaWZkZWYgX01TQ19WRVIKLSNpbmNsdWRlIDxpby5oPgotI2luY2x1ZGUgPGRpcmVjdC5oPgotI2Vsc2UKLSNpbmNsdWRlIDx1bmlzdGQuaD4KLSNlbmRpZgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLSNpbmNsdWRlIDxpb3N0cmVhbT4KLSNpbmNsdWRlIDxmc3RyZWFtPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLSNpZmRlZiBfV0lOMzIKLSNkZWZpbmUgbWtkaXIobmFtZSwgbW9kZSkgbWtkaXIobmFtZSkKLSNlbmRpZgotCi0jaWZuZGVmIE9fQklOQVJZCi0jaWZkZWYgX09fQklOQVJZCi0jZGVmaW5lIE9fQklOQVJZIF9PX0JJTkFSWQotI2Vsc2UKLSNkZWZpbmUgT19CSU5BUlkgMCAgICAgLy8gSWYgdGhpcyBpc24ndCBkZWZpbmVkLCB0aGUgcGxhdGZvcm0gZG9lc24ndCBuZWVkIGl0LgotI2VuZGlmCi0jZW5kaWYKLQotc3RyaW5nIFRlc3RTb3VyY2VEaXIoKSB7Ci0jaWZuZGVmIEdPT0dMRV9USElSRF9QQVJUWV9QUk9UT0JVRgotI2lmbmRlZiBfTVNDX1ZFUgotICAvLyBhdXRvbWFrZSBzZXRzIHRoZSAic3JjZGlyIiBlbnZpcm9ubWVudCB2YXJpYWJsZS4KLSAgY2hhciogcmVzdWx0ID0gZ2V0ZW52KCJzcmNkaXIiKTsKLSAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotI2VuZGlmICAvLyBfTVNDX1ZFUgotCi0gIC8vIExvb2sgZm9yIHRoZSAic3JjIiBkaXJlY3RvcnkuCi0gIHN0cmluZyBwcmVmaXggPSAiLiI7Ci0KLSAgd2hpbGUgKCFGaWxlOjpFeGlzdHMocHJlZml4ICsgIi9zcmMvZ29vZ2xlL3Byb3RvYnVmIikpIHsKLSAgICBpZiAoIUZpbGU6OkV4aXN0cyhwcmVmaXgpKSB7Ci0gICAgICBHT09HTEVfTE9HKEZBVEFMKQotICAgICAgICA8PCAiQ291bGQgbm90IGZpbmQgcHJvdG9idWYgc291cmNlIGNvZGUuICBQbGVhc2UgcnVuIHRlc3RzIGZyb20gIgotICAgICAgICAgICAic29tZXdoZXJlIHdpdGhpbiB0aGUgcHJvdG9idWYgc291cmNlIHBhY2thZ2UuIjsKLSAgICB9Ci0gICAgcHJlZml4ICs9ICIvLi4iOwotICB9Ci0gIHJldHVybiBwcmVmaXggKyAiL3NyYyI7Ci0jZWxzZQotICByZXR1cm4gInRoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYyI7Ci0jZW5kaWYgIC8vIEdPT0dMRV9USElSRF9QQVJUWV9QUk9UT0JVRgotfQotCi1uYW1lc3BhY2UgewotCi1zdHJpbmcgR2V0VGVtcG9yYXJ5RGlyZWN0b3J5TmFtZSgpIHsKLSAgLy8gVGVzdHMgcnVuIHVuZGVyIEJhemVsICJzaG91bGQgbm90IiB1c2UgL3RtcC4gQmF6ZWwgc2V0cyB0aGlzIGVudmlyb25tZW50Ci0gIC8vIHZhcmlhYmxlIGZvciB0ZXN0cyB0byB1c2UgaW5zdGVhZC4KLSAgY2hhciAqZnJvbV9lbnZpcm9ubWVudCA9IGdldGVudigiVEVTVF9UTVBESVIiKTsKLSAgaWYgKGZyb21fZW52aXJvbm1lbnQgIT0gTlVMTCAmJiBmcm9tX2Vudmlyb25tZW50WzBdICE9ICdcMCcpIHsKLSAgICByZXR1cm4gc3RyaW5nKGZyb21fZW52aXJvbm1lbnQpICsgIi9wcm90b2J1Zl90bXBkaXIiOwotICB9Ci0KLSAgLy8gdG1wbmFtKCkgaXMgZ2VuZXJhbGx5IG5vdCBjb25zaWRlcmVkIHNhZmUgYnV0IHdlJ3JlIG9ubHkgdXNpbmcgaXQgZm9yCi0gIC8vIHRlc3RpbmcuICBXZSBjYW5ub3QgdXNlIHRtcGZpbGUoKSBvciBta3N0ZW1wKCkgc2luY2Ugd2UncmUgY3JlYXRpbmcgYQotICAvLyBkaXJlY3RvcnkuCi0gIGNoYXIgYltMX3RtcG5hbSArIDFdOyAgICAgLy8gSFBVWCBtdWx0aXRocmVhZCByZXR1cm4gMCBpZiBzIGlzIDAKLSAgc3RyaW5nIHJlc3VsdCA9IHRtcG5hbShiKTsKLSNpZmRlZiBfV0lOMzIKLSAgLy8gT24gV2luMzIsIHRtcG5hbSgpIHJldHVybnMgYSBmaWxlIHByZWZpeGVkIHdpdGggJ1wnLCBidXQgd2hpY2ggaXMgc3VwcG9zZWQKLSAgLy8gdG8gYmUgdXNlZCBpbiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4gIFdURj8KLSAgaWYgKEhhc1ByZWZpeFN0cmluZyhyZXN1bHQsICJcXCIpKSB7Ci0gICAgcmVzdWx0LmVyYXNlKDAsIDEpOwotICB9Ci0gIC8vIFRoZSBXaW4zMiBBUEkgYWNjZXB0cyBmb3J3YXJkIHNsYXNoZXMgYXMgYSBwYXRoIGRlbGltaXRlciBldmVuIHRob3VnaAotICAvLyBiYWNrc2xhc2hlcyBhcmUgc3RhbmRhcmQuICBMZXQncyBhdm9pZCBjb25mdXNpb24gYW5kIHVzZSBvbmx5IGZvcndhcmQKLSAgLy8gc2xhc2hlcy4KLSAgcmVzdWx0ID0gU3RyaW5nUmVwbGFjZShyZXN1bHQsICJcXCIsICIvIiwgdHJ1ZSk7Ci0jZW5kaWYgIC8vIF9XSU4zMgotICByZXR1cm4gcmVzdWx0OwotfQotCi0vLyBDcmVhdGVzIGEgdGVtcG9yYXJ5IGRpcmVjdG9yeSBvbiBkZW1hbmQgYW5kIGRlbGV0ZXMgaXQgd2hlbiB0aGUgcHJvY2VzcwotLy8gcXVpdHMuCi1jbGFzcyBUZW1wRGlyRGVsZXRlciB7Ci0gcHVibGljOgotICBUZW1wRGlyRGVsZXRlcigpIHt9Ci0gIH5UZW1wRGlyRGVsZXRlcigpIHsKLSAgICBpZiAoIW5hbWVfLmVtcHR5KCkpIHsKLSAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KG5hbWVfLCBOVUxMLCBOVUxMKTsKLSAgICB9Ci0gIH0KLQotICBzdHJpbmcgR2V0VGVtcERpcigpIHsKLSAgICBpZiAobmFtZV8uZW1wdHkoKSkgewotICAgICAgbmFtZV8gPSBHZXRUZW1wb3JhcnlEaXJlY3RvcnlOYW1lKCk7Ci0gICAgICBHT09HTEVfQ0hFQ0sobWtkaXIobmFtZV8uY19zdHIoKSwgMDc3NykgPT0gMCkgPDwgc3RyZXJyb3IoZXJybm8pOwotCi0gICAgICAvLyBTdGljayBhIGZpbGUgaW4gdGhlIGRpcmVjdG9yeSB0aGF0IHRlbGxzIHBlb3BsZSB3aGF0IHRoaXMgaXMsIGluIGNhc2UKLSAgICAgIC8vIHdlIGFib3J0IGFuZCBkb24ndCBnZXQgYSBjaGFuY2UgdG8gZGVsZXRlIGl0LgotICAgICAgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZSgiIiwgbmFtZV8gKyAiL1RFTVBfRElSX0ZPUl9QUk9UT0JVRl9URVNUUyIpOwotICAgIH0KLSAgICByZXR1cm4gbmFtZV87Ci0gIH0KLQotIHByaXZhdGU6Ci0gIHN0cmluZyBuYW1lXzsKLX07Ci0KLVRlbXBEaXJEZWxldGVyIHRlbXBfZGlyX2RlbGV0ZXJfOwotCi19ICAvLyBuYW1lc3BhY2UKLQotc3RyaW5nIFRlc3RUZW1wRGlyKCkgewotICByZXR1cm4gdGVtcF9kaXJfZGVsZXRlcl8uR2V0VGVtcERpcigpOwotfQotCi0vLyBUT0RPKGtlbnRvbik6ICBTaGFyZSBkdXBsaWNhdGVkIGNvZGUgYmVsb3cuICBUb28gYnVzeS9sYXp5IGZvciBub3cuCi0KLXN0YXRpYyBzdHJpbmcgc3Rkb3V0X2NhcHR1cmVfZmlsZW5hbWVfOwotc3RhdGljIHN0cmluZyBzdGRlcnJfY2FwdHVyZV9maWxlbmFtZV87Ci1zdGF0aWMgaW50IG9yaWdpbmFsX3N0ZG91dF8gPSAtMTsKLXN0YXRpYyBpbnQgb3JpZ2luYWxfc3RkZXJyXyA9IC0xOwotCi12b2lkIENhcHR1cmVUZXN0U3Rkb3V0KCkgewotICBHT09HTEVfQ0hFQ0tfRVEob3JpZ2luYWxfc3Rkb3V0XywgLTEpIDw8ICJBbHJlYWR5IGNhcHR1cmluZy4iOwotCi0gIHN0ZG91dF9jYXB0dXJlX2ZpbGVuYW1lXyA9IFRlc3RUZW1wRGlyKCkgKyAiL2NhcHR1cmVkX3N0ZG91dCI7Ci0KLSAgaW50IGZkID0gb3BlbihzdGRvdXRfY2FwdHVyZV9maWxlbmFtZV8uY19zdHIoKSwKLSAgICAgICAgICAgICAgICBPX1dST05MWSB8IE9fQ1JFQVQgfCBPX0VYQ0wgfCBPX0JJTkFSWSwgMDc3Nyk7Ci0gIEdPT0dMRV9DSEVDSyhmZCA+PSAwKSA8PCAib3BlbjogIiA8PCBzdHJlcnJvcihlcnJubyk7Ci0KLSAgb3JpZ2luYWxfc3Rkb3V0XyA9IGR1cCgxKTsKLSAgY2xvc2UoMSk7Ci0gIGR1cDIoZmQsIDEpOwotICBjbG9zZShmZCk7Ci19Ci0KLXZvaWQgQ2FwdHVyZVRlc3RTdGRlcnIoKSB7Ci0gIEdPT0dMRV9DSEVDS19FUShvcmlnaW5hbF9zdGRlcnJfLCAtMSkgPDwgIkFscmVhZHkgY2FwdHVyaW5nLiI7Ci0KLSAgc3RkZXJyX2NhcHR1cmVfZmlsZW5hbWVfID0gVGVzdFRlbXBEaXIoKSArICIvY2FwdHVyZWRfc3RkZXJyIjsKLQotICBpbnQgZmQgPSBvcGVuKHN0ZGVycl9jYXB0dXJlX2ZpbGVuYW1lXy5jX3N0cigpLAotICAgICAgICAgICAgICAgIE9fV1JPTkxZIHwgT19DUkVBVCB8IE9fRVhDTCB8IE9fQklOQVJZLCAwNzc3KTsKLSAgR09PR0xFX0NIRUNLKGZkID49IDApIDw8ICJvcGVuOiAiIDw8IHN0cmVycm9yKGVycm5vKTsKLQotICBvcmlnaW5hbF9zdGRlcnJfID0gZHVwKDIpOwotICBjbG9zZSgyKTsKLSAgZHVwMihmZCwgMik7Ci0gIGNsb3NlKGZkKTsKLX0KLQotc3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZG91dCgpIHsKLSAgR09PR0xFX0NIRUNLX05FKG9yaWdpbmFsX3N0ZG91dF8sIC0xKSA8PCAiTm90IGNhcHR1cmluZy4iOwotCi0gIGNsb3NlKDEpOwotICBkdXAyKG9yaWdpbmFsX3N0ZG91dF8sIDEpOwotICBvcmlnaW5hbF9zdGRvdXRfID0gLTE7Ci0KLSAgc3RyaW5nIHJlc3VsdDsKLSAgRmlsZTo6UmVhZEZpbGVUb1N0cmluZ09yRGllKHN0ZG91dF9jYXB0dXJlX2ZpbGVuYW1lXywgJnJlc3VsdCk7Ci0KLSAgcmVtb3ZlKHN0ZG91dF9jYXB0dXJlX2ZpbGVuYW1lXy5jX3N0cigpKTsKLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdHJpbmcgR2V0Q2FwdHVyZWRUZXN0U3RkZXJyKCkgewotICBHT09HTEVfQ0hFQ0tfTkUob3JpZ2luYWxfc3RkZXJyXywgLTEpIDw8ICJOb3QgY2FwdHVyaW5nLiI7Ci0KLSAgY2xvc2UoMik7Ci0gIGR1cDIob3JpZ2luYWxfc3RkZXJyXywgMik7Ci0gIG9yaWdpbmFsX3N0ZGVycl8gPSAtMTsKLQotICBzdHJpbmcgcmVzdWx0OwotICBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoc3RkZXJyX2NhcHR1cmVfZmlsZW5hbWVfLCAmcmVzdWx0KTsKLQotICByZW1vdmUoc3RkZXJyX2NhcHR1cmVfZmlsZW5hbWVfLmNfc3RyKCkpOwotCi0gIHJldHVybiByZXN1bHQ7Ci19Ci0KLVNjb3BlZE1lbW9yeUxvZyogU2NvcGVkTWVtb3J5TG9nOjphY3RpdmVfbG9nXyA9IE5VTEw7Ci0KLVNjb3BlZE1lbW9yeUxvZzo6U2NvcGVkTWVtb3J5TG9nKCkgewotICBHT09HTEVfQ0hFQ0soYWN0aXZlX2xvZ18gPT0gTlVMTCk7Ci0gIGFjdGl2ZV9sb2dfID0gdGhpczsKLSAgb2xkX2hhbmRsZXJfID0gU2V0TG9nSGFuZGxlcigmSGFuZGxlTG9nKTsKLX0KLQotU2NvcGVkTWVtb3J5TG9nOjp+U2NvcGVkTWVtb3J5TG9nKCkgewotICBTZXRMb2dIYW5kbGVyKG9sZF9oYW5kbGVyXyk7Ci0gIGFjdGl2ZV9sb2dfID0gTlVMTDsKLX0KLQotY29uc3QgdmVjdG9yPHN0cmluZz4mIFNjb3BlZE1lbW9yeUxvZzo6R2V0TWVzc2FnZXMoTG9nTGV2ZWwgbGV2ZWwpIHsKLSAgR09PR0xFX0NIRUNLKGxldmVsID09IEVSUk9SIHx8Ci0gICAgICAgICAgICAgICBsZXZlbCA9PSBXQVJOSU5HKTsKLSAgcmV0dXJuIG1lc3NhZ2VzX1tsZXZlbF07Ci19Ci0KLXZvaWQgU2NvcGVkTWVtb3J5TG9nOjpIYW5kbGVMb2coTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbGluZSwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gIEdPT0dMRV9DSEVDSyhhY3RpdmVfbG9nXyAhPSBOVUxMKTsKLSAgaWYgKGxldmVsID09IEVSUk9SIHx8IGxldmVsID09IFdBUk5JTkcpIHsKLSAgICBhY3RpdmVfbG9nXy0+bWVzc2FnZXNfW2xldmVsXS5wdXNoX2JhY2sobWVzc2FnZSk7Ci0gIH0KLX0KLQotbmFtZXNwYWNlIHsKLQotLy8gRm9yY2Ugc2h1dGRvd24gYXQgcHJvY2VzcyBleGl0IHNvIHRoYXQgd2UgY2FuIHRlc3QgZm9yIG1lbW9yeSBsZWFrcy4gIFRvCi0vLyBhY3R1YWxseSBjaGVjayBmb3IgbGVha3MsIEkgc3VnZ2VzdCB1c2luZyB0aGUgaGVhcCBjaGVja2VyIGluY2x1ZGVkIHdpdGgKLS8vIGdvb2dsZS1wZXJmdG9vbHMuICBTZXQgaXQgdG8gImRyYWNvbmlhbiIgbW9kZSB0byBlbnN1cmUgdGhhdCBldmVyeSBsYXN0Ci0vLyBjYWxsIHRvIG1hbGxvYygpIGhhcyBhIGNvcnJlc3BvbmRpbmcgZnJlZSgpLgotc3RydWN0IEZvcmNlU2h1dGRvd24gewotICB+Rm9yY2VTaHV0ZG93bigpIHsKLSAgICBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpOwotICB9Ci19IGZvcmNlX3NodXRkb3duOwotCi19ICAvLyBuYW1lc3BhY2UKLQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzBkOTllNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oCisrKyAvZGV2L251bGwKQEAgLTEsMTAyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyBlbXVsYXRlcyBnb29nbGUzL3Rlc3RpbmcvYmFzZS9wdWJsaWMvZ29vZ2xldGVzdC5oCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0dPT0dMRVRFU1RfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9HT09HTEVURVNUX0hfXwotCi0jaW5jbHVkZSA8bWFwPgotI2luY2x1ZGUgPHZlY3Rvcj4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0KLS8vIERpc2FibGUgZGVhdGggdGVzdHMgaWYgd2UgdXNlIGV4Y2VwdGlvbnMgaW4gQ0hFQ0soKS4KLSNpZiAhUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMgJiYgZGVmaW5lZChHVEVTVF9IQVNfREVBVEhfVEVTVCkKLSNkZWZpbmUgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKLSNlbmRpZgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLS8vIFdoZW4gcnVubmluZyB1bml0dGVzdHMsIGdldCB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHNvdXJjZSBjb2RlLgotc3RyaW5nIFRlc3RTb3VyY2VEaXIoKTsKLQotLy8gV2hlbiBydW5uaW5nIHVuaXR0ZXN0cywgZ2V0IGEgZGlyZWN0b3J5IHdoZXJlIHRlbXBvcmFyeSBmaWxlcyBtYXkgYmUKLS8vIHBsYWNlZC4KLXN0cmluZyBUZXN0VGVtcERpcigpOwotCi0vLyBDYXB0dXJlIGFsbCB0ZXh0IHdyaXR0ZW4gdG8gc3Rkb3V0IG9yIHN0ZGVyci4KLXZvaWQgQ2FwdHVyZVRlc3RTdGRvdXQoKTsKLXZvaWQgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKLQotLy8gU3RvcCBjYXB0dXJpbmcgc3Rkb3V0IG9yIHN0ZGVyciBhbmQgcmV0dXJuIHRoZSB0ZXh0IGNhcHR1cmVkLgotc3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZG91dCgpOwotc3RyaW5nIEdldENhcHR1cmVkVGVzdFN0ZGVycigpOwotCi0vLyBGb3IgdXNlIHdpdGggU2NvcGVkTWVtb3J5TG9nOjpHZXRNZXNzYWdlcygpLiAgSW5zaWRlIEdvb2dsZSB0aGUgTG9nTGV2ZWwKLS8vIGNvbnN0YW50cyBkb24ndCBoYXZlIHRoZSBMT0dMRVZFTF8gcHJlZml4LCBzbyB0aGUgY29kZSB0aGF0IHVzZWQKLS8vIFNjb3BlZE1lbW9yeUxvZyByZWZlcnMgdG8gTE9HTEVWRUxfRVJST1IgYXMganVzdCBFUlJPUi4KLSN1bmRlZiBFUlJPUiAgLy8gZGVmZW5kIGFnYWluc3QgcHJvbWlzY3VvdXMgd2luZG93cy5oCi1zdGF0aWMgY29uc3QgTG9nTGV2ZWwgRVJST1IgPSBMT0dMRVZFTF9FUlJPUjsKLXN0YXRpYyBjb25zdCBMb2dMZXZlbCBXQVJOSU5HID0gTE9HTEVWRUxfV0FSTklORzsKLQotLy8gUmVjZWl2ZXMgY29waWVzIG9mIGFsbCBMT0coRVJST1IpIG1lc3NhZ2VzIHdoaWxlIGluIHNjb3BlLiAgU2FtcGxlIHVzYWdlOgotLy8gICB7Ci0vLyAgICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsgIC8vIGNvbnN0cnVjdG9yIHJlZ2lzdGVycyBvYmplY3QgYXMgYSBsb2cgc2luawotLy8gICAgIFNvbWVSb3V0aW5lVGhhdE1heUxvZ01lc3NhZ2VzKCk7Ci0vLyAgICAgY29uc3QgdmVjdG9yPHN0cmluZz4mIHdhcm5pbmdzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKLS8vICAgfSAgLy8gZGVzdHJ1Y3RvciB1bnJlZ2lzdGVycyBvYmplY3QgYXMgYSBsb2cgc2luawotLy8gVGhpcyBpcyBhIGR1bW15IGltcGxlbWVudGF0aW9uIHdoaWNoIGNvdmVycyBvbmx5IHdoYXQgaXMgdXNlZCBieSBwcm90b2NvbAotLy8gYnVmZmVyIHVuaXQgdGVzdHMuCi1jbGFzcyBTY29wZWRNZW1vcnlMb2cgewotIHB1YmxpYzoKLSAgU2NvcGVkTWVtb3J5TG9nKCk7Ci0gIHZpcnR1YWwgflNjb3BlZE1lbW9yeUxvZygpOwotCi0gIC8vIEZldGNoZXMgYWxsIG1lc3NhZ2VzIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGxldmVsLgotICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgR2V0TWVzc2FnZXMoTG9nTGV2ZWwgZXJyb3IpOwotCi0gcHJpdmF0ZToKLSAgbWFwPExvZ0xldmVsLCB2ZWN0b3I8c3RyaW5nPiA+IG1lc3NhZ2VzXzsKLSAgTG9nSGFuZGxlciogb2xkX2hhbmRsZXJfOwotCi0gIHN0YXRpYyB2b2lkIEhhbmRsZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKTsKLQotICBzdGF0aWMgU2NvcGVkTWVtb3J5TG9nKiBhY3RpdmVfbG9nXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2NvcGVkTWVtb3J5TG9nKTsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9HT09HTEVURVNUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NmY4Y2ZlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYworKysgL2Rldi9udWxsCkBAIC0xLDgwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGJyaWFub2xzb25AZ29vZ2xlLmNvbSAoQnJpYW4gT2xzb24pCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUZXN0IHByb2dyYW0gdG8gdmVyaWZ5IHRoYXQgR3ppcElucHV0U3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBjb21tYW5kIGxpbmUKLS8vIGd1bnppcCBvciBqYXZhLnV0aWwuemlwLkd6aXBJbnB1dFN0cmVhbQotLy8KLS8vIFJlYWRzIGd6aXAgc3RyZWFtIG9uIHN0YW5kYXJkIGlucHV0IGFuZCB3cml0ZXMgZGVjb21wcmVzc2VkIGRhdGEgdG8gc3RhbmRhcmQKLS8vIG91dHB1dC4KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2lmZGVmIF9XSU4zMgotI2lmbmRlZiBTVERJTl9GSUxFTk8KLSNkZWZpbmUgU1RESU5fRklMRU5PIDAKLSNlbmRpZgotI2lmbmRlZiBTVERPVVRfRklMRU5PCi0jZGVmaW5lIFNURE9VVF9GSUxFTk8gMQotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLQotdXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkZpbGVJbnB1dFN0cmVhbTsKLXVzaW5nIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpHemlwSW5wdXRTdHJlYW07Ci0KLWludCBtYWluKGludCBhcmdjLCBjb25zdCBjaGFyKiogYXJndikgewotICBGaWxlSW5wdXRTdHJlYW0gZmluKFNURElOX0ZJTEVOTyk7Ci0gIEd6aXBJbnB1dFN0cmVhbSBpbigmZmluKTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIGNvbnN0IHZvaWQqIGlucHRyOwotICAgIGludCBpbmxlbjsKLSAgICBib29sIG9rOwotICAgIG9rID0gaW4uTmV4dCgmaW5wdHIsICZpbmxlbik7Ci0gICAgaWYgKCFvaykgewotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGlmIChpbmxlbiA+IDApIHsKLSAgICAgIGludCBlcnIgPSB3cml0ZShTVERPVVRfRklMRU5PLCBpbnB0ciwgaW5sZW4pOwotICAgICAgYXNzZXJ0KGVyciA9PSBpbmxlbik7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIDA7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3ppcC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTkyZGRjNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjCisrKyAvZGV2L251bGwKQEAgLTEsODYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOSBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogYnJpYW5vbHNvbkBnb29nbGUuY29tIChCcmlhbiBPbHNvbikKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRlc3QgcHJvZ3JhbSB0byB2ZXJpZnkgdGhhdCBHemlwT3V0cHV0U3RyZWFtIGlzIGNvbXBhdGlibGUgd2l0aCBjb21tYW5kIGxpbmUKLS8vIGd6aXAgb3IgamF2YS51dGlsLnppcC5HemlwT3V0cHV0U3RyZWFtCi0vLwotLy8gUmVhZHMgZGF0YSBvbiBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIGNvbXByZXNzZWQgZ3ppcCBzdHJlYW0gdG8gc3RhbmRhcmQKLS8vIG91dHB1dC4KLQotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8ZmNudGwuaD4KLQotI2lmZGVmIF9XSU4zMgotI2lmbmRlZiBTVERJTl9GSUxFTk8KLSNkZWZpbmUgU1RESU5fRklMRU5PIDAKLSNlbmRpZgotI2lmbmRlZiBTVERPVVRfRklMRU5PCi0jZGVmaW5lIFNURE9VVF9GSUxFTk8gMQotI2VuZGlmCi0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLQotdXNpbmcgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkZpbGVPdXRwdXRTdHJlYW07Ci11c2luZyBnb29nbGU6OnByb3RvYnVmOjppbzo6R3ppcE91dHB1dFN0cmVhbTsKLQotaW50IG1haW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqKiBhcmd2KSB7Ci0gIEZpbGVPdXRwdXRTdHJlYW0gZm91dChTVERPVVRfRklMRU5PKTsKLSAgR3ppcE91dHB1dFN0cmVhbSBvdXQoJmZvdXQpOwotICBpbnQgcmVhZGxlbjsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHZvaWQqIG91dHB0cjsKLSAgICBpbnQgb3V0bGVuOwotICAgIGJvb2wgb2s7Ci0gICAgZG8gewotICAgICAgb2sgPSBvdXQuTmV4dCgmb3V0cHRyLCAmb3V0bGVuKTsKLSAgICAgIGlmICghb2spIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfSB3aGlsZSAob3V0bGVuIDw9IDApOwotICAgIHJlYWRsZW4gPSByZWFkKFNURElOX0ZJTEVOTywgb3V0cHRyLCBvdXRsZW4pOwotICAgIGlmIChyZWFkbGVuIDw9IDApIHsKLSAgICAgIG91dC5CYWNrVXAob3V0bGVuKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBpZiAocmVhZGxlbiA8IG91dGxlbikgewotICAgICAgb3V0LkJhY2tVcChvdXRsZW4gLSByZWFkbGVuKTsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gMDsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBjMGRmZDUzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxOTc1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGZsb2F0Lmg+Ci0jaW5jbHVkZSA8bWF0aC5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+Ci0jaW5jbHVkZSA8c3RhY2s+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hbnkuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi1uYW1lc3BhY2UgewotCi1pbmxpbmUgYm9vbCBJc0hleE51bWJlcihjb25zdCBzdHJpbmcmIHN0cikgewotICByZXR1cm4gKHN0ci5sZW5ndGgoKSA+PSAyICYmIHN0clswXSA9PSAnMCcgJiYKLSAgICAgICAgICAoc3RyWzFdID09ICd4JyB8fCBzdHJbMV0gPT0gJ1gnKSk7Ci19Ci0KLWlubGluZSBib29sIElzT2N0TnVtYmVyKGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIHJldHVybiAoc3RyLmxlbmd0aCgpID49IDIgJiYgc3RyWzBdID09ICcwJyAmJgotICAgICAgICAgIChzdHJbMV0gPj0gJzAnICYmIHN0clsxXSA8ICc4JykpOwotfQotCi1pbmxpbmUgYm9vbCBHZXRBbnlGaWVsZERlc2NyaXB0b3JzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioqIHR5cGVfdXJsX2ZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqKiB2YWx1ZV9maWVsZCkgewotICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKLSAgICAqdHlwZV91cmxfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU51bWJlcigxKTsKLSAgICAqdmFsdWVfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU51bWJlcigyKTsKLSAgICByZXR1cm4gKCp0eXBlX3VybF9maWVsZCAhPSBOVUxMICYmCi0gICAgICAgICAgICAoKnR5cGVfdXJsX2ZpZWxkKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgJiYKLSAgICAgICAgICAgICp2YWx1ZV9maWVsZCAhPSBOVUxMICYmCi0gICAgICAgICAgICAoKnZhbHVlX2ZpZWxkKS0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1zdHJpbmcgTWVzc2FnZTo6RGVidWdTdHJpbmcoKSBjb25zdCB7Ci0gIHN0cmluZyBkZWJ1Z19zdHJpbmc7Ci0KLSAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOwotICBwcmludGVyLlNldEV4cGFuZEFueSh0cnVlKTsKLQotICBwcmludGVyLlByaW50VG9TdHJpbmcoKnRoaXMsICZkZWJ1Z19zdHJpbmcpOwotCi0gIHJldHVybiBkZWJ1Z19zdHJpbmc7Ci19Ci0KLXN0cmluZyBNZXNzYWdlOjpTaG9ydERlYnVnU3RyaW5nKCkgY29uc3QgewotICBzdHJpbmcgZGVidWdfc3RyaW5nOwotCi0gIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKLSAgcHJpbnRlci5TZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKLSAgcHJpbnRlci5TZXRFeHBhbmRBbnkodHJ1ZSk7Ci0KLSAgcHJpbnRlci5QcmludFRvU3RyaW5nKCp0aGlzLCAmZGVidWdfc3RyaW5nKTsKLSAgLy8gU2luZ2xlIGxpbmUgbW9kZSBjdXJyZW50bHkgbWlnaHQgaGF2ZSBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kLgotICBpZiAoZGVidWdfc3RyaW5nLnNpemUoKSA+IDAgJiYKLSAgICAgIGRlYnVnX3N0cmluZ1tkZWJ1Z19zdHJpbmcuc2l6ZSgpIC0gMV0gPT0gJyAnKSB7Ci0gICAgZGVidWdfc3RyaW5nLnJlc2l6ZShkZWJ1Z19zdHJpbmcuc2l6ZSgpIC0gMSk7Ci0gIH0KLQotICByZXR1cm4gZGVidWdfc3RyaW5nOwotfQotCi1zdHJpbmcgTWVzc2FnZTo6VXRmOERlYnVnU3RyaW5nKCkgY29uc3QgewotICBzdHJpbmcgZGVidWdfc3RyaW5nOwotCi0gIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKLSAgcHJpbnRlci5TZXRVc2VVdGY4U3RyaW5nRXNjYXBpbmcodHJ1ZSk7Ci0gIHByaW50ZXIuU2V0RXhwYW5kQW55KHRydWUpOwotCi0gIHByaW50ZXIuUHJpbnRUb1N0cmluZygqdGhpcywgJmRlYnVnX3N0cmluZyk7Ci0KLSAgcmV0dXJuIGRlYnVnX3N0cmluZzsKLX0KLQotdm9pZCBNZXNzYWdlOjpQcmludERlYnVnU3RyaW5nKCkgY29uc3QgewotICBwcmludGYoIiVzIiwgRGVidWdTdHJpbmcoKS5jX3N0cigpKTsKLX0KLQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwYXJzZSBpbmZvcm1hdGlvbiB0cmVlIGNsYXNzLgotVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZTo6UGFyc2VJbmZvVHJlZSgpIHsgfQotCi1UZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjp+UGFyc2VJbmZvVHJlZSgpIHsKLSAgLy8gUmVtb3ZlIGFueSBuZXN0ZWQgaW5mb3JtYXRpb24gdHJlZXMsIGFzIHRoZXkgYXJlIG93bmVkIGJ5IHRoaXMgdHJlZS4KLSAgZm9yIChOZXN0ZWRNYXA6Oml0ZXJhdG9yIGl0ID0gbmVzdGVkXy5iZWdpbigpOyBpdCAhPSBuZXN0ZWRfLmVuZCgpOyArK2l0KSB7Ci0gICAgU1RMRGVsZXRlRWxlbWVudHMoJihpdC0+c2Vjb25kKSk7Ci0gIH0KLX0KLQotdm9pZCBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpSZWNvcmRMb2NhdGlvbigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgbG9jYXRpb25zX1tmaWVsZF0ucHVzaF9iYWNrKGxvY2F0aW9uKTsKLX0KLQotVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZTo6Q3JlYXRlTmVzdGVkKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgLy8gT3duZWQgYnkgdXMgaW4gdGhlIG1hcC4KLSAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogaW5zdGFuY2UgPSBuZXcgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSgpOwotICB2ZWN0b3I8VGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSo+KiB0cmVlcyA9ICZuZXN0ZWRfW2ZpZWxkXTsKLSAgR09PR0xFX0NIRUNLKHRyZWVzKTsKLSAgdHJlZXMtPnB1c2hfYmFjayhpbnN0YW5jZSk7Ci0gIHJldHVybiBpbnN0YW5jZTsKLX0KLQotdm9pZCBDaGVja0ZpZWxkSW5kZXgoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSB7Ci0gIGlmIChmaWVsZCA9PSBOVUxMKSB7IHJldHVybjsgfQotCi0gIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBpbmRleCA9PSAtMSkgewotICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiSW5kZXggbXVzdCBiZSBpbiByYW5nZSBvZiByZXBlYXRlZCBmaWVsZCB2YWx1ZXMuICIKLSAgICAgICAgICAgICAgICA8PCAiRmllbGQ6ICIgPDwgZmllbGQtPm5hbWUoKTsKLSAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgaW5kZXggIT0gLTEpIHsKLSAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIHNpbmd1bGFyIGZpZWxkcy4iCi0gICAgICAgICAgICAgICAgPDwgIkZpZWxkOiAiIDw8IGZpZWxkLT5uYW1lKCk7Ci0gIH0KLX0KLQotVGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvbiBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpHZXRMb2NhdGlvbigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKLSAgQ2hlY2tGaWVsZEluZGV4KGZpZWxkLCBpbmRleCk7Ci0gIGlmIChpbmRleCA9PSAtMSkgeyBpbmRleCA9IDA7IH0KLQotICBjb25zdCB2ZWN0b3I8VGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvbj4qIGxvY2F0aW9ucyA9Ci0gICAgICBGaW5kT3JOdWxsKGxvY2F0aW9uc18sIGZpZWxkKTsKLSAgaWYgKGxvY2F0aW9ucyA9PSBOVUxMIHx8IGluZGV4ID49IGxvY2F0aW9ucy0+c2l6ZSgpKSB7Ci0gICAgcmV0dXJuIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb24oKTsKLSAgfQotCi0gIHJldHVybiAoKmxvY2F0aW9ucylbaW5kZXhdOwotfQotCi1UZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKiBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpHZXRUcmVlRm9yTmVzdGVkKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgewotICBDaGVja0ZpZWxkSW5kZXgoZmllbGQsIGluZGV4KTsKLSAgaWYgKGluZGV4ID09IC0xKSB7IGluZGV4ID0gMDsgfQotCi0gIGNvbnN0IHZlY3RvcjxUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKj4qIHRyZWVzID0gRmluZE9yTnVsbChuZXN0ZWRfLCBmaWVsZCk7Ci0gIGlmICh0cmVlcyA9PSBOVUxMIHx8IGluZGV4ID49IHRyZWVzLT5zaXplKCkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiAoKnRyZWVzKVtpbmRleF07Ci19Ci0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBJbnRlcm5hbCBjbGFzcyBmb3IgcGFyc2luZyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBhIFByb3RvY29sIE1lc3NhZ2UuCi0vLyBUaGlzIGNsYXNzIG1ha2VzIHVzZSBvZiB0aGUgUHJvdG9jb2wgTWVzc2FnZSBjb21waWxlcidzIHRva2VuaXplciBmb3VuZAotLy8gaW4gLy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmguIE5vdGUgdGhhdCBjbGFzcydzIFBhcnNlCi0vLyBtZXRob2QgaXMgKm5vdCogdGhyZWFkLXNhZmUgYW5kIHNob3VsZCBvbmx5IGJlIHVzZWQgaW4gYSBzaW5nbGUgdGhyZWFkIGF0Ci0vLyBhIHRpbWUuCi0KLS8vIE1ha2VzIGNvZGUgc2xpZ2h0bHkgbW9yZSByZWFkYWJsZS4gIFRoZSBtZWFuaW5nIG9mICJETyhmb28pIiBpcwotLy8gIkV4ZWN1dGUgZm9vIGFuZCBmYWlsIGlmIGl0IGZhaWxzLiIsIHdoZXJlIGZhaWx1cmUgaXMgaW5kaWNhdGVkIGJ5Ci0vLyByZXR1cm5pbmcgZmFsc2UuIEJvcnJvd2VkIGZyb20gcGFyc2VyLmNjIChUaGFua3MgS2VudG9uISkuCi0jZGVmaW5lIERPKFNUQVRFTUVOVCkgaWYgKFNUQVRFTUVOVCkge30gZWxzZSByZXR1cm4gZmFsc2UKLQotY2xhc3MgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsIHsKLSBwdWJsaWM6Ci0KLSAgLy8gRGV0ZXJtaW5lcyBpZiByZXBlYXRlZCB2YWx1ZXMgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMgYW5kCi0gIC8vIG9uZW9mcyBhcmUgcGVybWl0dGVkLCBlLmcuLCB0aGUgc3RyaW5nICJmb286IDEgZm9vOiAyIiBmb3IgYQotICAvLyByZXF1aXJlZC9vcHRpb25hbCBmaWVsZCBuYW1lZCAiZm9vIiwgb3IgImJhejogMSBxdXg6IDIiCi0gIC8vIHdoZXJlICJiYXoiIGFuZCAicXV4IiBhcmUgbWVtYmVycyBvZiB0aGUgc2FtZSBvbmVvZi4KLSAgZW51bSBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSB7Ci0gICAgQUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUyA9IDAsICAgLy8gdGhlIGxhc3QgdmFsdWUgaXMgcmV0YWluZWQKLSAgICBGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUyA9IDEsICAvLyBhbiBlcnJvciBpcyBpc3N1ZWQKLSAgfTsKLQotICBQYXJzZXJJbXBsKGNvbnN0IERlc2NyaXB0b3IqIHJvb3RfbWVzc2FnZV90eXBlLAotICAgICAgICAgICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF9zdHJlYW0sCi0gICAgICAgICAgICAgaW86OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IsCi0gICAgICAgICAgICAgVGV4dEZvcm1hdDo6RmluZGVyKiBmaW5kZXIsCi0gICAgICAgICAgICAgUGFyc2VJbmZvVHJlZSogcGFyc2VfaW5mb190cmVlLAotICAgICAgICAgICAgIFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IHNpbmd1bGFyX292ZXJ3cml0ZV9wb2xpY3ksCi0gICAgICAgICAgICAgYm9vbCBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkLAotICAgICAgICAgICAgIGJvb2wgYWxsb3dfdW5rbm93bl9maWVsZCwKLSAgICAgICAgICAgICBib29sIGFsbG93X3Vua25vd25fZW51bSwKLSAgICAgICAgICAgICBib29sIGFsbG93X2ZpZWxkX251bWJlciwKLSAgICAgICAgICAgICBib29sIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZSkKLSAgICA6IGVycm9yX2NvbGxlY3Rvcl8oZXJyb3JfY29sbGVjdG9yKSwKLSAgICAgIGZpbmRlcl8oZmluZGVyKSwKLSAgICAgIHBhcnNlX2luZm9fdHJlZV8ocGFyc2VfaW5mb190cmVlKSwKLSAgICAgIHRva2VuaXplcl9lcnJvcl9jb2xsZWN0b3JfKHRoaXMpLAotICAgICAgdG9rZW5pemVyXyhpbnB1dF9zdHJlYW0sICZ0b2tlbml6ZXJfZXJyb3JfY29sbGVjdG9yXyksCi0gICAgICByb290X21lc3NhZ2VfdHlwZV8ocm9vdF9tZXNzYWdlX3R5cGUpLAotICAgICAgc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeV8oc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeSksCi0gICAgICBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXyhhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkKSwKLSAgICAgIGFsbG93X3Vua25vd25fZmllbGRfKGFsbG93X3Vua25vd25fZmllbGQpLAotICAgICAgYWxsb3dfdW5rbm93bl9lbnVtXyhhbGxvd191bmtub3duX2VudW0pLAotICAgICAgYWxsb3dfZmllbGRfbnVtYmVyXyhhbGxvd19maWVsZF9udW1iZXIpLAotICAgICAgaGFkX2Vycm9yc18oZmFsc2UpIHsKLSAgICAvLyBGb3IgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEsIHdlIG5lZWQgdG8gYWxsb3cgdGhlICdmJyBzdWZmaXgKLSAgICAvLyBmb3IgZmxvYXRzLgotICAgIHRva2VuaXplcl8uc2V0X2FsbG93X2ZfYWZ0ZXJfZmxvYXQodHJ1ZSk7Ci0KLSAgICAvLyAnIycgc3RhcnRzIGEgY29tbWVudC4KLSAgICB0b2tlbml6ZXJfLnNldF9jb21tZW50X3N0eWxlKGlvOjpUb2tlbml6ZXI6OlNIX0NPTU1FTlRfU1RZTEUpOwotCi0gICAgaWYgKGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZSkgewotICAgICAgdG9rZW5pemVyXy5zZXRfcmVxdWlyZV9zcGFjZV9hZnRlcl9udW1iZXIoZmFsc2UpOwotICAgICAgdG9rZW5pemVyXy5zZXRfYWxsb3dfbXVsdGlsaW5lX3N0cmluZ3ModHJ1ZSk7Ci0gICAgfQotCi0gICAgLy8gQ29uc3VtZSB0aGUgc3RhcnRpbmcgdG9rZW4uCi0gICAgdG9rZW5pemVyXy5OZXh0KCk7Ci0gIH0KLSAgflBhcnNlckltcGwoKSB7IH0KLQotICAvLyBQYXJzZXMgdGhlIEFTQ0lJIHJlcHJlc2VudGF0aW9uIHNwZWNpZmllZCBpbiBpbnB1dCBhbmQgc2F2ZXMgdGhlCi0gIC8vIGluZm9ybWF0aW9uIGludG8gdGhlIG91dHB1dCBwb2ludGVyIChhIE1lc3NhZ2UpLiBSZXR1cm5zCi0gIC8vIGZhbHNlIGlmIGFuIGVycm9yIG9jY3VycyAoYW4gZXJyb3Igd2lsbCBhbHNvIGJlIGxvZ2dlZCB0bwotICAvLyBHT09HTEVfTE9HKEVSUk9SKSkuCi0gIGJvb2wgUGFyc2UoTWVzc2FnZSogb3V0cHV0KSB7Ci0gICAgLy8gQ29uc3VtZSBmaWVsZHMgdW50aWwgd2UgY2Fubm90IGRvIHNvIGFueW1vcmUuCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EKSkgewotICAgICAgICByZXR1cm4gIWhhZF9lcnJvcnNfOwotICAgICAgfQotCi0gICAgICBETyhDb25zdW1lRmllbGQob3V0cHV0KSk7Ci0gICAgfQotICB9Ci0KLSAgYm9vbCBQYXJzZUZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIE1lc3NhZ2UqIG91dHB1dCkgewotICAgIGJvb2wgc3VjOwotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgc3VjID0gQ29uc3VtZUZpZWxkTWVzc2FnZShvdXRwdXQsIG91dHB1dC0+R2V0UmVmbGVjdGlvbigpLCBmaWVsZCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHN1YyA9IENvbnN1bWVGaWVsZFZhbHVlKG91dHB1dCwgb3V0cHV0LT5HZXRSZWZsZWN0aW9uKCksIGZpZWxkKTsKLSAgICB9Ci0gICAgcmV0dXJuIHN1YyAmJiBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EKTsKLSAgfQotCi0gIHZvaWQgUmVwb3J0RXJyb3IoaW50IGxpbmUsIGludCBjb2wsIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIGhhZF9lcnJvcnNfID0gdHJ1ZTsKLSAgICBpZiAoZXJyb3JfY29sbGVjdG9yXyA9PSBOVUxMKSB7Ci0gICAgICBpZiAobGluZSA+PSAwKSB7Ci0gICAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFcnJvciBwYXJzaW5nIHRleHQtZm9ybWF0ICIKLSAgICAgICAgICAgICAgICAgICA8PCByb290X21lc3NhZ2VfdHlwZV8tPmZ1bGxfbmFtZSgpCi0gICAgICAgICAgICAgICAgICAgPDwgIjogIiA8PCAobGluZSArIDEpIDw8ICI6IgotICAgICAgICAgICAgICAgICAgIDw8IChjb2wgKyAxKSA8PCAiOiAiIDw8IG1lc3NhZ2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXJyb3IgcGFyc2luZyB0ZXh0LWZvcm1hdCAiCi0gICAgICAgICAgICAgICAgICAgPDwgcm9vdF9tZXNzYWdlX3R5cGVfLT5mdWxsX25hbWUoKQotICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgbWVzc2FnZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IobGluZSwgY29sLCBtZXNzYWdlKTsKLSAgICB9Ci0gIH0KLQotICB2b2lkIFJlcG9ydFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2wsIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgIGlmIChlcnJvcl9jb2xsZWN0b3JfID09IE5VTEwpIHsKLSAgICAgIGlmIChsaW5lID49IDApIHsKLSAgICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiV2FybmluZyBwYXJzaW5nIHRleHQtZm9ybWF0ICIKLSAgICAgICAgICAgICAgICAgICAgIDw8IHJvb3RfbWVzc2FnZV90eXBlXy0+ZnVsbF9uYW1lKCkKLSAgICAgICAgICAgICAgICAgICAgIDw8ICI6ICIgPDwgKGxpbmUgKyAxKSA8PCAiOiIKLSAgICAgICAgICAgICAgICAgICAgIDw8IChjb2wgKyAxKSA8PCAiOiAiIDw8IG1lc3NhZ2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8ICJXYXJuaW5nIHBhcnNpbmcgdGV4dC1mb3JtYXQgIgotICAgICAgICAgICAgICAgICAgICAgPDwgcm9vdF9tZXNzYWdlX3R5cGVfLT5mdWxsX25hbWUoKQotICAgICAgICAgICAgICAgICAgICAgPDwgIjogIiA8PCBtZXNzYWdlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRXYXJuaW5nKGxpbmUsIGNvbCwgbWVzc2FnZSk7Ci0gICAgfQotICB9Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUGFyc2VySW1wbCk7Ci0KLSAgLy8gUmVwb3J0cyBhbiBlcnJvciB3aXRoIHRoZSBnaXZlbiBtZXNzYWdlIHdpdGggaW5mb3JtYXRpb24gaW5kaWNhdGluZwotICAvLyB0aGUgcG9zaXRpb24gKGFzIGRlcml2ZWQgZnJvbSB0aGUgY3VycmVudCB0b2tlbikuCi0gIHZvaWQgUmVwb3J0RXJyb3IoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgUmVwb3J0RXJyb3IodG9rZW5pemVyXy5jdXJyZW50KCkubGluZSwgdG9rZW5pemVyXy5jdXJyZW50KCkuY29sdW1uLAotICAgICAgICAgICAgICAgIG1lc3NhZ2UpOwotICB9Ci0KLSAgLy8gUmVwb3J0cyBhIHdhcm5pbmcgd2l0aCB0aGUgZ2l2ZW4gbWVzc2FnZSB3aXRoIGluZm9ybWF0aW9uIGluZGljYXRpbmcKLSAgLy8gdGhlIHBvc2l0aW9uIChhcyBkZXJpdmVkIGZyb20gdGhlIGN1cnJlbnQgdG9rZW4pLgotICB2b2lkIFJlcG9ydFdhcm5pbmcoY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgUmVwb3J0V2FybmluZyh0b2tlbml6ZXJfLmN1cnJlbnQoKS5saW5lLCB0b2tlbml6ZXJfLmN1cnJlbnQoKS5jb2x1bW4sCi0gICAgICAgICAgICAgICAgICBtZXNzYWdlKTsKLSAgfQotCi0gIC8vIENvbnN1bWVzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGFydGluZyBkZWxpbWl0ZXIuCi0gIC8vIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgdGhhdCB0aGUgZW5kIGRlbGltaXRlciBhdCB0aGUgY29uY2x1c2lvbiBvZgotICAvLyB0aGUgY29uc3VtcHRpb24gbWF0Y2hlcyB0aGUgc3RhcnRpbmcgZGVsaW1pdGVyIHBhc3NlZCBpbiBoZXJlLgotICBib29sIENvbnN1bWVNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyBkZWxpbWl0ZXIpIHsKLSAgICB3aGlsZSAoIUxvb2tpbmdBdCgiPiIpICYmICAhTG9va2luZ0F0KCJ9IikpIHsKLSAgICAgIERPKENvbnN1bWVGaWVsZChtZXNzYWdlKSk7Ci0gICAgfQotCi0gICAgLy8gQ29uZmlybSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBlbmRpbmcgZGVsaW1pdGVyLgotICAgIERPKENvbnN1bWUoZGVsaW1pdGVyKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBDb25zdW1lIGVpdGhlciAiPCIgb3IgInsiLgotICBib29sIENvbnN1bWVNZXNzYWdlRGVsaW1pdGVyKHN0cmluZyogZGVsaW1pdGVyKSB7Ci0gICAgaWYgKFRyeUNvbnN1bWUoIjwiKSkgewotICAgICAgKmRlbGltaXRlciA9ICI+IjsKLSAgICB9IGVsc2UgewotICAgICAgRE8oQ29uc3VtZSgieyIpKTsKLSAgICAgICpkZWxpbWl0ZXIgPSAifSI7Ci0gICAgfQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLQotICAvLyBDb25zdW1lcyB0aGUgY3VycmVudCBmaWVsZCAoYXMgcmV0dXJuZWQgYnkgdGhlIHRva2VuaXplcikgb24gdGhlCi0gIC8vIHBhc3NlZCBpbiBtZXNzYWdlLgotICBib29sIENvbnN1bWVGaWVsZChNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOwotCi0gICAgc3RyaW5nIGZpZWxkX25hbWU7Ci0KLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gTlVMTDsKLSAgICBpbnQgc3RhcnRfbGluZSA9IHRva2VuaXplcl8uY3VycmVudCgpLmxpbmU7Ci0gICAgaW50IHN0YXJ0X2NvbHVtbiA9IHRva2VuaXplcl8uY3VycmVudCgpLmNvbHVtbjsKLQotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYW55X3R5cGVfdXJsX2ZpZWxkOwotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYW55X3ZhbHVlX2ZpZWxkOwotICAgIGlmIChpbnRlcm5hbDo6R2V0QW55RmllbGREZXNjcmlwdG9ycygqbWVzc2FnZSwgJmFueV90eXBlX3VybF9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFueV92YWx1ZV9maWVsZCkgJiYKLSAgICAgICAgVHJ5Q29uc3VtZSgiWyIpKSB7Ci0gICAgICBzdHJpbmcgZnVsbF90eXBlX25hbWUsIHByZWZpeDsKLSAgICAgIERPKENvbnN1bWVBbnlUeXBlVXJsKCZmdWxsX3R5cGVfbmFtZSwgJnByZWZpeCkpOwotICAgICAgRE8oQ29uc3VtZSgiXSIpKTsKLSAgICAgIFRyeUNvbnN1bWUoIjoiKTsgIC8vICc6JyBpcyBvcHRpb25hbCBiZXR3ZWVuIG1lc3NhZ2UgbGFiZWxzIGFuZCB2YWx1ZXMuCi0gICAgICBzdHJpbmcgc2VyaWFsaXplZF92YWx1ZTsKLSAgICAgIERPKENvbnN1bWVBbnlWYWx1ZShmdWxsX3R5cGVfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZpbGUoKS0+cG9vbCgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJpYWxpemVkX3ZhbHVlKSk7Ci0gICAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcoCi0gICAgICAgICAgbWVzc2FnZSwgYW55X3R5cGVfdXJsX2ZpZWxkLAotICAgICAgICAgIHN0cmluZyhwcmVmaXggKyBmdWxsX3R5cGVfbmFtZSkpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIGFueV92YWx1ZV9maWVsZCwgc2VyaWFsaXplZF92YWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgaWYgKFRyeUNvbnN1bWUoIlsiKSkgewotICAgICAgLy8gRXh0ZW5zaW9uLgotICAgICAgRE8oQ29uc3VtZUZ1bGxUeXBlTmFtZSgmZmllbGRfbmFtZSkpOwotICAgICAgRE8oQ29uc3VtZSgiXSIpKTsKLQotICAgICAgZmllbGQgPSAoZmluZGVyXyAhPSBOVUxMCi0gICAgICAgICAgICAgICA/IGZpbmRlcl8tPkZpbmRFeHRlbnNpb24obWVzc2FnZSwgZmllbGRfbmFtZSkKLSAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGZpZWxkX25hbWUpKTsKLQotICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCFhbGxvd191bmtub3duX2ZpZWxkXykgewotICAgICAgICAgIFJlcG9ydEVycm9yKCJFeHRlbnNpb24gXCIiICsgZmllbGRfbmFtZSArICJcIiBpcyBub3QgZGVmaW5lZCBvciAiCi0gICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbiBleHRlbnNpb24gb2YgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICJcIi4iKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgUmVwb3J0V2FybmluZygiRXh0ZW5zaW9uIFwiIiArIGZpZWxkX25hbWUgKyAiXCIgaXMgbm90IGRlZmluZWQgb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgImlzIG5vdCBhbiBleHRlbnNpb24gb2YgXCIiICsKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIlwiLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKLSAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZmaWVsZF9uYW1lKSk7Ci0KLSAgICAgIGludDMyIGZpZWxkX251bWJlcjsKLSAgICAgIGlmIChhbGxvd19maWVsZF9udW1iZXJfICYmIHNhZmVfc3RydG8zMihmaWVsZF9uYW1lLCAmZmllbGRfbnVtYmVyKSkgewotICAgICAgICBpZiAoZGVzY3JpcHRvci0+SXNFeHRlbnNpb25OdW1iZXIoZmllbGRfbnVtYmVyKSkgewotICAgICAgICAgIGZpZWxkID0gcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoZmllbGRfbnVtYmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKGZpZWxkX251bWJlcik7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX25hbWUpOwotICAgICAgICAvLyBHcm91cCBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FwaXRhbGl6ZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlCi0gICAgICAgIC8vIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpcgotICAgICAgICAvLyBmaWVsZCBuYW1lcy4KLSAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgICBzdHJpbmcgbG93ZXJfZmllbGRfbmFtZSA9IGZpZWxkX25hbWU7Ci0gICAgICAgICAgTG93ZXJTdHJpbmcoJmxvd2VyX2ZpZWxkX25hbWUpOwotICAgICAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGxvd2VyX2ZpZWxkX25hbWUpOwotICAgICAgICAgIC8vIElmIHRoZSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIHdvcmtlZCBidXQgdGhlIGZpZWxkIGlzIE5PVCBhIGdyb3VwLAotICAgICAgICAgIGlmIChmaWVsZCAhPSBOVUxMICYmIGZpZWxkLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7Ci0gICAgICAgICAgICBmaWVsZCA9IE5VTEw7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIEFnYWluLCBzcGVjaWFsLWNhc2UgZ3JvdXAgbmFtZXMgYXMgZGVzY3JpYmVkIGFib3ZlLgotICAgICAgICBpZiAoZmllbGQgIT0gTlVMTCAmJiBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUAotICAgICAgICAgICAgJiYgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCkgIT0gZmllbGRfbmFtZSkgewotICAgICAgICAgIGZpZWxkID0gTlVMTDsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChmaWVsZCA9PSBOVUxMICYmIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfKSB7Ci0gICAgICAgICAgc3RyaW5nIGxvd2VyX2ZpZWxkX25hbWUgPSBmaWVsZF9uYW1lOwotICAgICAgICAgIExvd2VyU3RyaW5nKCZsb3dlcl9maWVsZF9uYW1lKTsKLSAgICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZShsb3dlcl9maWVsZF9uYW1lKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgICBpZiAoIWFsbG93X3Vua25vd25fZmllbGRfKSB7Ci0gICAgICAgICAgUmVwb3J0RXJyb3IoIk1lc3NhZ2UgdHlwZSBcIiIgKyBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArCi0gICAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyBmaWVsZCBuYW1lZCBcIiIgKyBmaWVsZF9uYW1lICsgIlwiLiIpOwotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBSZXBvcnRXYXJuaW5nKCJNZXNzYWdlIHR5cGUgXCIiICsgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyBmaWVsZCBuYW1lZCBcIiIgKyBmaWVsZF9uYW1lICsgIlwiLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gU2tpcHMgdW5rbm93biBmaWVsZC4KLSAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgR09PR0xFX0NIRUNLKGFsbG93X3Vua25vd25fZmllbGRfKTsKLSAgICAgIC8vIFRyeSB0byBndWVzcyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkLgotICAgICAgLy8gSWYgdGhpcyBmaWVsZCBpcyBub3QgYSBtZXNzYWdlLCB0aGVyZSBzaG91bGQgYmUgYSAiOiIgYmV0d2VlbiB0aGUKLSAgICAgIC8vIGZpZWxkIG5hbWUgYW5kIHRoZSBmaWVsZCB2YWx1ZSBhbmQgYWxzbyB0aGUgZmllbGQgdmFsdWUgc2hvdWxkIG5vdAotICAgICAgLy8gc3RhcnQgd2l0aCAieyIgb3IgIjwiIHdoaWNoIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZSBib2R5LgotICAgICAgLy8gSWYgdGhlcmUgaXMgbm8gIjoiIG9yIHRoZXJlIGlzIGEgInsiIG9yICI8IiBhZnRlciAiOiIsIHRoaXMgZmllbGQgaGFzCi0gICAgICAvLyB0byBiZSBhIG1lc3NhZ2Ugb3IgdGhlIGlucHV0IGlzIGlsbC1mb3JtZWQuCi0gICAgICBpZiAoVHJ5Q29uc3VtZSgiOiIpICYmICFMb29raW5nQXQoInsiKSAmJiAhTG9va2luZ0F0KCI8IikpIHsKLSAgICAgICAgcmV0dXJuIFNraXBGaWVsZFZhbHVlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gU2tpcEZpZWxkTWVzc2FnZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIGlmIChzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5XyA9PSBGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUykgewotICAgICAgLy8gRmFpbCBpZiB0aGUgZmllbGQgaXMgbm90IHJlcGVhdGVkIGFuZCBpdCBoYXMgYWxyZWFkeSBiZWVuIHNwZWNpZmllZC4KLSAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgcmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgewotICAgICAgICBSZXBvcnRFcnJvcigiTm9uLXJlcGVhdGVkIGZpZWxkIFwiIiArIGZpZWxkX25hbWUgKwotICAgICAgICAgICAgICAgICAgICAiXCIgaXMgc3BlY2lmaWVkIG11bHRpcGxlIHRpbWVzLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICAvLyBGYWlsIGlmIHRoZSBmaWVsZCBpcyBhIG1lbWJlciBvZiBhIG9uZW9mIGFuZCBhbm90aGVyIG1lbWJlciBoYXMgYWxyZWFkeQotICAgICAgLy8gYmVlbiBzcGVjaWZpZWQuCi0gICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKTsKLSAgICAgIGlmIChvbmVvZiAhPSBOVUxMICYmIHJlZmxlY3Rpb24tPkhhc09uZW9mKCptZXNzYWdlLCBvbmVvZikpIHsKLSAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvdGhlcl9maWVsZCA9Ci0gICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRPbmVvZkZpZWxkRGVzY3JpcHRvcigqbWVzc2FnZSwgb25lb2YpOwotICAgICAgICBSZXBvcnRFcnJvcigiRmllbGQgXCIiICsgZmllbGRfbmFtZSArICJcIiBpcyBzcGVjaWZpZWQgYWxvbmcgd2l0aCAiCi0gICAgICAgICAgICAgICAgICAgICJmaWVsZCBcIiIgKyBvdGhlcl9maWVsZC0+bmFtZSgpICsgIlwiLCBhbm90aGVyIG1lbWJlciAiCi0gICAgICAgICAgICAgICAgICAgICJvZiBvbmVvZiBcIiIgKyBvbmVvZi0+bmFtZSgpICsgIlwiLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gUGVyZm9ybSBzcGVjaWFsIGhhbmRsaW5nIGZvciBlbWJlZGRlZCBtZXNzYWdlIHR5cGVzLgotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgLy8gJzonIGlzIG9wdGlvbmFsIGhlcmUuCi0gICAgICBUcnlDb25zdW1lKCI6Iik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vICc6JyBpcyByZXF1aXJlZCBoZXJlLgotICAgICAgRE8oQ29uc3VtZSgiOiIpKTsKLSAgICB9Ci0KLSAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgVHJ5Q29uc3VtZSgiWyIpKSB7Ci0gICAgICAvLyBTaG9ydCByZXBlYXRlZCBmb3JtYXQsIGUuZy4gICJmb286IFsxLCAyLCAzXSIKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgICAgIC8vIFBlcmZvcm0gc3BlY2lhbCBoYW5kbGluZyBmb3IgZW1iZWRkZWQgbWVzc2FnZSB0eXBlcy4KLSAgICAgICAgICBETyhDb25zdW1lRmllbGRNZXNzYWdlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgRE8oQ29uc3VtZUZpZWxkVmFsdWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKLSAgICAgICAgfQotICAgICAgICBpZiAoVHJ5Q29uc3VtZSgiXSIpKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLSAgICAgICAgRE8oQ29uc3VtZSgiLCIpKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBETyhDb25zdW1lRmllbGRNZXNzYWdlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIERPKENvbnN1bWVGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7Ci0gICAgfQotCi0gICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZmllbGRzIG1heSBvcHRpb25hbGx5IGJlIHNlcGFyYXRlZCBieSBjb21tYXMgb3IKLSAgICAvLyBzZW1pY29sb25zLgotICAgIFRyeUNvbnN1bWUoIjsiKSB8fCBUcnlDb25zdW1lKCIsIik7Ci0KLSAgICBpZiAoZmllbGQtPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkpIHsKLSAgICAgIFJlcG9ydFdhcm5pbmcoInRleHQgZm9ybWF0IGNvbnRhaW5zIGRlcHJlY2F0ZWQgZmllbGQgXCIiCi0gICAgICAgICAgICAgICAgICAgICsgZmllbGRfbmFtZSArICJcIiIpOwotICAgIH0KLQotICAgIC8vIElmIGEgcGFyc2UgaW5mbyB0cmVlIGV4aXN0cywgYWRkIHRoZSBsb2NhdGlvbiBmb3IgdGhlIHBhcnNlZAotICAgIC8vIGZpZWxkLgotICAgIGlmIChwYXJzZV9pbmZvX3RyZWVfICE9IE5VTEwpIHsKLSAgICAgIFJlY29yZExvY2F0aW9uKHBhcnNlX2luZm9fdHJlZV8sIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgUGFyc2VMb2NhdGlvbihzdGFydF9saW5lLCBzdGFydF9jb2x1bW4pKTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFNraXBzIHRoZSBuZXh0IGZpZWxkIGluY2x1ZGluZyB0aGUgZmllbGQncyBuYW1lIGFuZCB2YWx1ZS4KLSAgYm9vbCBTa2lwRmllbGQoKSB7Ci0gICAgc3RyaW5nIGZpZWxkX25hbWU7Ci0gICAgaWYgKFRyeUNvbnN1bWUoIlsiKSkgewotICAgICAgLy8gRXh0ZW5zaW9uIG5hbWUuCi0gICAgICBETyhDb25zdW1lRnVsbFR5cGVOYW1lKCZmaWVsZF9uYW1lKSk7Ci0gICAgICBETyhDb25zdW1lKCJdIikpOwotICAgIH0gZWxzZSB7Ci0gICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmZmllbGRfbmFtZSkpOwotICAgIH0KLQotICAgIC8vIFRyeSB0byBndWVzcyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkLgotICAgIC8vIElmIHRoaXMgZmllbGQgaXMgbm90IGEgbWVzc2FnZSwgdGhlcmUgc2hvdWxkIGJlIGEgIjoiIGJldHdlZW4gdGhlCi0gICAgLy8gZmllbGQgbmFtZSBhbmQgdGhlIGZpZWxkIHZhbHVlIGFuZCBhbHNvIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgbm90Ci0gICAgLy8gc3RhcnQgd2l0aCAieyIgb3IgIjwiIHdoaWNoIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZSBib2R5LgotICAgIC8vIElmIHRoZXJlIGlzIG5vICI6IiBvciB0aGVyZSBpcyBhICJ7IiBvciAiPCIgYWZ0ZXIgIjoiLCB0aGlzIGZpZWxkIGhhcwotICAgIC8vIHRvIGJlIGEgbWVzc2FnZSBvciB0aGUgaW5wdXQgaXMgaWxsLWZvcm1lZC4KLSAgICBpZiAoVHJ5Q29uc3VtZSgiOiIpICYmICFMb29raW5nQXQoInsiKSAmJiAhTG9va2luZ0F0KCI8IikpIHsKLSAgICAgIERPKFNraXBGaWVsZFZhbHVlKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBETyhTa2lwRmllbGRNZXNzYWdlKCkpOwotICAgIH0KLSAgICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmaWVsZHMgbWF5IG9wdGlvbmFsbHkgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvcgotICAgIC8vIHNlbWljb2xvbnMuCi0gICAgVHJ5Q29uc3VtZSgiOyIpIHx8IFRyeUNvbnN1bWUoIiwiKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIGJvb2wgQ29uc3VtZUZpZWxkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLQotICAgIC8vIElmIHRoZSBwYXJzZSBpbmZvcm1hdGlvbiB0cmVlIGlzIG5vdCBOVUxMLCBjcmVhdGUgYSBuZXN0ZWQgb25lCi0gICAgLy8gZm9yIHRoZSBuZXN0ZWQgbWVzc2FnZS4KLSAgICBQYXJzZUluZm9UcmVlKiBwYXJlbnQgPSBwYXJzZV9pbmZvX3RyZWVfOwotICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgewotICAgICAgcGFyc2VfaW5mb190cmVlXyA9IENyZWF0ZU5lc3RlZChwYXJlbnQsIGZpZWxkKTsKLSAgICB9Ci0KLSAgICBzdHJpbmcgZGVsaW1pdGVyOwotICAgIERPKENvbnN1bWVNZXNzYWdlRGVsaW1pdGVyKCZkZWxpbWl0ZXIpKTsKLSAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIERPKENvbnN1bWVNZXNzYWdlKHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLCBkZWxpbWl0ZXIpKTsKLSAgICB9IGVsc2UgewotICAgICAgRE8oQ29uc3VtZU1lc3NhZ2UocmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1pdGVyKSk7Ci0gICAgfQotCi0gICAgLy8gUmVzZXQgdGhlIHBhcnNlIGluZm9ybWF0aW9uIHRyZWUuCi0gICAgcGFyc2VfaW5mb190cmVlXyA9IHBhcmVudDsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIFNraXBzIHRoZSB3aG9sZSBib2R5IG9mIGEgbWVzc2FnZSBpbmNsdWRpbmcgdGhlIGJlZ2lubmluZyBkZWxpbWl0ZXIgYW5kCi0gIC8vIHRoZSBlbmRpbmcgZGVsaW1pdGVyLgotICBib29sIFNraXBGaWVsZE1lc3NhZ2UoKSB7Ci0gICAgc3RyaW5nIGRlbGltaXRlcjsKLSAgICBETyhDb25zdW1lTWVzc2FnZURlbGltaXRlcigmZGVsaW1pdGVyKSk7Ci0gICAgd2hpbGUgKCFMb29raW5nQXQoIj4iKSAmJiAgIUxvb2tpbmdBdCgifSIpKSB7Ci0gICAgICBETyhTa2lwRmllbGQoKSk7Ci0gICAgfQotICAgIERPKENvbnN1bWUoZGVsaW1pdGVyKSk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBib29sIENvbnN1bWVGaWVsZFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0KLS8vIERlZmluZSBhbiBlYXN5IHRvIHVzZSBtYWNybyBmb3Igc2V0dGluZyBmaWVsZHMuIFRoaXMgbWFjcm8gY2hlY2tzCi0vLyB0byBzZWUgaWYgdGhlIGZpZWxkIGlzIHJlcGVhdGVkIChpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gdXNlIHRoZSBBZGQKLS8vIG1ldGhvZHMgb3Igbm90IChpbiB3aGljaCBjYXNlIHdlIG5lZWQgdG8gdXNlIHRoZSBTZXQgbWV0aG9kcykuCi0jZGVmaW5lIFNFVF9GSUVMRChDUFBUWVBFLCBWQUxVRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZWZsZWN0aW9uLT5BZGQjI0NQUFRZUEUobWVzc2FnZSwgZmllbGQsIFZBTFVFKTsgICAgICAgICBcCi0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIHJlZmxlY3Rpb24tPlNldCMjQ1BQVFlQRShtZXNzYWdlLCBmaWVsZCwgVkFMVUUpOyAgICAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLSAgICBzd2l0Y2goZmllbGQtPmNwcF90eXBlKCkpIHsKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7Ci0gICAgICAgIGludDY0IHZhbHVlOwotICAgICAgICBETyhDb25zdW1lU2lnbmVkSW50ZWdlcigmdmFsdWUsIGtpbnQzMm1heCkpOwotICAgICAgICBTRVRfRklFTEQoSW50MzIsIHN0YXRpY19jYXN0PGludDMyPih2YWx1ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7Ci0gICAgICAgIHVpbnQ2NCB2YWx1ZTsKLSAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50MzJtYXgpKTsKLSAgICAgICAgU0VUX0ZJRUxEKFVJbnQzMiwgc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKLSAgICAgICAgaW50NjQgdmFsdWU7Ci0gICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZ2YWx1ZSwga2ludDY0bWF4KSk7Ci0gICAgICAgIFNFVF9GSUVMRChJbnQ2NCwgdmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7Ci0gICAgICAgIHVpbnQ2NCB2YWx1ZTsKLSAgICAgICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdmFsdWUsIGt1aW50NjRtYXgpKTsKLSAgICAgICAgU0VUX0ZJRUxEKFVJbnQ2NCwgdmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKLSAgICAgICAgZG91YmxlIHZhbHVlOwotICAgICAgICBETyhDb25zdW1lRG91YmxlKCZ2YWx1ZSkpOwotICAgICAgICBTRVRfRklFTEQoRmxvYXQsIGlvOjpTYWZlRG91YmxlVG9GbG9hdCh2YWx1ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7Ci0gICAgICAgIGRvdWJsZSB2YWx1ZTsKLSAgICAgICAgRE8oQ29uc3VtZURvdWJsZSgmdmFsdWUpKTsKLSAgICAgICAgU0VUX0ZJRUxEKERvdWJsZSwgdmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICAgIHN0cmluZyB2YWx1ZTsKLSAgICAgICAgRE8oQ29uc3VtZVN0cmluZygmdmFsdWUpKTsKLSAgICAgICAgU0VUX0ZJRUxEKFN0cmluZywgdmFsdWUpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogewotICAgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7Ci0gICAgICAgICAgdWludDY0IHZhbHVlOwotICAgICAgICAgIERPKENvbnN1bWVVbnNpZ25lZEludGVnZXIoJnZhbHVlLCAxKSk7Ci0gICAgICAgICAgU0VUX0ZJRUxEKEJvb2wsIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdHJpbmcgdmFsdWU7Ci0gICAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnZhbHVlKSk7Ci0gICAgICAgICAgaWYgKHZhbHVlID09ICJ0cnVlIiB8fCB2YWx1ZSA9PSAiVHJ1ZSIgfHwgdmFsdWUgPT0gInQiKSB7Ci0gICAgICAgICAgICBTRVRfRklFTEQoQm9vbCwgdHJ1ZSk7Ci0gICAgICAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAiZmFsc2UiIHx8IHZhbHVlID09ICJGYWxzZSIgfHwgdmFsdWUgPT0gImYiKSB7Ci0gICAgICAgICAgICBTRVRfRklFTEQoQm9vbCwgZmFsc2UpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSZXBvcnRFcnJvcigiSW52YWxpZCB2YWx1ZSBmb3IgYm9vbGVhbiBmaWVsZCBcIiIgKyBmaWVsZC0+bmFtZSgpCi0gICAgICAgICAgICAgICAgICAgICAgICArICJcIi4gVmFsdWU6IFwiIiArIHZhbHVlICArICJcIi4iKTsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKLSAgICAgICAgc3RyaW5nIHZhbHVlOwotICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV90eXBlID0gZmllbGQtPmVudW1fdHlwZSgpOwotICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0gTlVMTDsKLQotICAgICAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7Ci0gICAgICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnZhbHVlKSk7Ci0gICAgICAgICAgLy8gRmluZCB0aGUgZW51bWVyYXRpb24gdmFsdWUuCi0gICAgICAgICAgZW51bV92YWx1ZSA9IGVudW1fdHlwZS0+RmluZFZhbHVlQnlOYW1lKHZhbHVlKTsKLQotICAgICAgICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiLSIpIHx8Ci0gICAgICAgICAgICAgICAgICAgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7Ci0gICAgICAgICAgaW50NjQgaW50X3ZhbHVlOwotICAgICAgICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZpbnRfdmFsdWUsIGtpbnQzMm1heCkpOwotICAgICAgICAgIHZhbHVlID0gU2ltcGxlSXRvYShpbnRfdmFsdWUpOyAgICAgICAgLy8gZm9yIGVycm9yIHJlcG9ydGluZwotICAgICAgICAgIGVudW1fdmFsdWUgPSBlbnVtX3R5cGUtPkZpbmRWYWx1ZUJ5TnVtYmVyKGludF92YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGludGVnZXIgb3IgaWRlbnRpZmllci4iKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZW51bV92YWx1ZSA9PSBOVUxMKSB7Ci0gICAgICAgICAgaWYgKCFhbGxvd191bmtub3duX2VudW1fKSB7Ci0gICAgICAgICAgICBSZXBvcnRFcnJvcigiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcIiIgKyB2YWx1ZSAgKyAiXCIgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZCBcIiIgKyBmaWVsZC0+bmFtZSgpICsgIlwiLiIpOwotICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBSZXBvcnRXYXJuaW5nKCJVbmtub3duIGVudW1lcmF0aW9uIHZhbHVlIG9mIFwiIiArIHZhbHVlICArICJcIiBmb3IgIgotICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgXCIiICsgZmllbGQtPm5hbWUoKSArICJcIi4iKTsKLSAgICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIFNFVF9GSUVMRChFbnVtLCBlbnVtX3ZhbHVlKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKLSAgICAgICAgLy8gV2Ugc2hvdWxkIG5ldmVyIGdldCBoZXJlLiBQdXQgaGVyZSBpbnN0ZWFkIG9mIGEgZGVmYXVsdAotICAgICAgICAvLyBzbyB0aGF0IGlmIG5ldyB0eXBlcyBhcmUgYWRkZWQsIHdlIGdldCBhIG5pY2UgY29tcGlsZXIgd2FybmluZy4KLSAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlJlYWNoZWQgYW4gdW5pbnRlbmRlZCBzdGF0ZTogQ1BQVFlQRV9NRVNTQUdFIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotI3VuZGVmIFNFVF9GSUVMRAotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgYm9vbCBTa2lwRmllbGRWYWx1ZSgpIHsKLSAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKLSAgICAgIHdoaWxlIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgewotICAgICAgICB0b2tlbml6ZXJfLk5leHQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICAvLyBQb3NzaWJsZSBmaWVsZCB2YWx1ZXMgb3RoZXIgdGhhbiBzdHJpbmc6Ci0gICAgLy8gICAxMjM0NSAgICAgICAgPT4gVFlQRV9JTlRFR0VSCi0gICAgLy8gICAtMTIzNDUgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lOVEVHRVIKLSAgICAvLyAgIDEuMjM0NSAgICAgICA9PiBUWVBFX0ZMT0FUCi0gICAgLy8gICAtMS4yMzQ1ICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0ZMT0FUCi0gICAgLy8gICBpbmYgICAgICAgICAgPT4gVFlQRV9JREVOVElGSUVSCi0gICAgLy8gICAtaW5mICAgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lERU5USUZJRVIKLSAgICAvLyAgIFRZUEVfSU5URUdFUiA9PiBUWVBFX0lERU5USUZJRVIKLSAgICAvLyBEaXZpZGVzIHRoZW0gaW50byB0d28gZ3JvdXAsIG9uZSB3aXRoIFRZUEVfU1lNQk9MCi0gICAgLy8gYW5kIHRoZSBvdGhlciB3aXRob3V0OgotICAgIC8vICAgR3JvdXAgb25lOgotICAgIC8vICAgICAxMjM0NSAgICAgICAgPT4gVFlQRV9JTlRFR0VSCi0gICAgLy8gICAgIDEuMjM0NSAgICAgICA9PiBUWVBFX0ZMT0FUCi0gICAgLy8gICAgIGluZiAgICAgICAgICA9PiBUWVBFX0lERU5USUZJRVIKLSAgICAvLyAgICAgVFlQRV9JTlRFR0VSID0+IFRZUEVfSURFTlRJRklFUgotICAgIC8vICAgR3JvdXAgdHdvOgotICAgIC8vICAgICAtMTIzNDUgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lOVEVHRVIKLSAgICAvLyAgICAgLTEuMjM0NSAgICAgID0+IFRZUEVfU1lNQk9MICsgVFlQRV9GTE9BVAotICAgIC8vICAgICAtaW5mICAgICAgICAgPT4gVFlQRV9TWU1CT0wgKyBUWVBFX0lERU5USUZJRVIKLSAgICAvLyBBcyB3ZSBjYW4gc2VlLCB0aGUgZmllbGQgdmFsdWUgY29uc2lzdHMgb2YgYW4gb3B0aW9uYWwgJy0nIGFuZCBvbmUgb2YKLSAgICAvLyBUWVBFX0lOVEVHRVIsIFRZUEVfRkxPQVQgYW5kIFRZUEVfSURFTlRJRklFUi4KLSAgICBib29sIGhhc19taW51cyA9IFRyeUNvbnN1bWUoIi0iKTsKLSAgICBpZiAoIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSAmJgotICAgICAgICAhTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0ZMT0FUKSAmJgotICAgICAgICAhTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIC8vIENvbWJpbmF0aW9uIG9mICctJyBhbmQgVFlQRV9JREVOVElGSUVSIG1heSByZXN1bHQgaW4gYW4gaW52YWxpZCBmaWVsZAotICAgIC8vIHZhbHVlIHdoaWxlIG90aGVyIGNvbWJpbmF0aW9ucyBhbGwgZ2VuZXJhdGUgdmFsaWQgdmFsdWVzLgotICAgIC8vIFdlIGNoZWNrIGlmIHRoZSB2YWx1ZSBvZiB0aGlzIGNvbWJpbmF0aW9uIGlzIHZhbGlkIGhlcmUuCi0gICAgLy8gVFlQRV9JREVOVElGSUVSIGFmdGVyIGEgJy0nIHNob3VsZCBiZSBvbmUgb2YgdGhlIGZsb2F0IHZhbHVlcyBsaXN0ZWQKLSAgICAvLyBiZWxvdzoKLSAgICAvLyAgIGluZiwgaW5mZiwgaW5maW5pdHksIG5hbgotICAgIGlmIChoYXNfbWludXMgJiYgTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7Ci0gICAgICBzdHJpbmcgdGV4dCA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7Ci0gICAgICBMb3dlclN0cmluZygmdGV4dCk7Ci0gICAgICBpZiAodGV4dCAhPSAiaW5mIiAmJgotICAgICAgICAgIHRleHQgIT0gImluZmluaXR5IiAmJgotICAgICAgICAgIHRleHQgIT0gIm5hbiIpIHsKLSAgICAgICAgUmVwb3J0RXJyb3IoIkludmFsaWQgZmxvYXQgbnVtYmVyOiAiICsgdGV4dCk7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gICAgdG9rZW5pemVyXy5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGN1cnJlbnQgdG9rZW4ncyB0ZXh0IGlzIGVxdWFsIHRvIHRoYXQgc3BlY2lmaWVkLgotICBib29sIExvb2tpbmdBdChjb25zdCBzdHJpbmcmIHRleHQpIHsKLSAgICByZXR1cm4gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCA9PSB0ZXh0OwotICB9Ci0KLSAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHRva2VuJ3MgdHlwZSBpcyBlcXVhbCB0byB0aGF0IHNwZWNpZmllZC4KLSAgYm9vbCBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRva2VuVHlwZSB0b2tlbl90eXBlKSB7Ci0gICAgcmV0dXJuIHRva2VuaXplcl8uY3VycmVudCgpLnR5cGUgPT0gdG9rZW5fdHlwZTsKLSAgfQotCi0gIC8vIENvbnN1bWVzIGFuIGlkZW50aWZpZXIgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgaWRlbnRpZmllciBwYXJhbWV0ZXIuCi0gIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGlzIG5vdCBvZiB0eXBlIElERU5URklFUi4KLSAgYm9vbCBDb25zdW1lSWRlbnRpZmllcihzdHJpbmcqIGlkZW50aWZpZXIpIHsKLSAgICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7Ci0gICAgICAqaWRlbnRpZmllciA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7Ci0gICAgICB0b2tlbml6ZXJfLk5leHQoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vIElmIGFsbG93X2ZpZWxkX251bWVyXyBvciBhbGxvd191bmtub3duX2ZpZWxkXyBpcyB0cnVlLCB3ZSBzaG91bGQgYWJsZQotICAgIC8vIHRvIHBhcnNlIGludGVnZXIgaWRlbnRpZmllcnMuCi0gICAgaWYgKChhbGxvd19maWVsZF9udW1iZXJfIHx8IGFsbG93X3Vua25vd25fZmllbGRfKQotICAgICAgICAmJiBMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikpIHsKLSAgICAgICppZGVudGlmaWVyID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKLSAgICAgIHRva2VuaXplcl8uTmV4dCgpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIuIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgLy8gQ29uc3VtZSBhIHN0cmluZyBvZiBmb3JtICI8aWQxPi48aWQyPi4uLi48aWROPiIuCi0gIGJvb2wgQ29uc3VtZUZ1bGxUeXBlTmFtZShzdHJpbmcqIG5hbWUpIHsKLSAgICBETyhDb25zdW1lSWRlbnRpZmllcihuYW1lKSk7Ci0gICAgd2hpbGUgKFRyeUNvbnN1bWUoIi4iKSkgewotICAgICAgc3RyaW5nIHBhcnQ7Ci0gICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmcGFydCkpOwotICAgICAgKm5hbWUgKz0gIi4iOwotICAgICAgKm5hbWUgKz0gcGFydDsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBDb25zdW1lcyBhIHN0cmluZyBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSB0ZXh0IHBhcmFtZXRlci4KLSAgLy8gUmV0dXJucyBmYWxzZSBpZiB0aGUgdG9rZW4gaXMgbm90IG9mIHR5cGUgU1RSSU5HLgotICBib29sIENvbnN1bWVTdHJpbmcoc3RyaW5nKiB0ZXh0KSB7Ci0gICAgaWYgKCFMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgewotICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIHN0cmluZy4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICB0ZXh0LT5jbGVhcigpOwotICAgIHdoaWxlIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1RSSU5HKSkgewotICAgICAgaW86OlRva2VuaXplcjo6UGFyc2VTdHJpbmdBcHBlbmQodG9rZW5pemVyXy5jdXJyZW50KCkudGV4dCwgdGV4dCk7Ci0KLSAgICAgIHRva2VuaXplcl8uTmV4dCgpOwotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgLy8gQ29uc3VtZXMgYSB1aW50NjQgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgdmFsdWUgcGFyYW1ldGVyLgotICAvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBpcyBub3Qgb2YgdHlwZSBJTlRFR0VSLgotICBib29sIENvbnN1bWVVbnNpZ25lZEludGVnZXIodWludDY0KiB2YWx1ZSwgdWludDY0IG1heF92YWx1ZSkgewotICAgIGlmICghTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7Ci0gICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaW50ZWdlci4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heF92YWx1ZSwgdmFsdWUpKSB7Ci0gICAgICBSZXBvcnRFcnJvcigiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdG9rZW5pemVyXy5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBDb25zdW1lcyBhbiBpbnQ2NCBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSB2YWx1ZSBwYXJhbWV0ZXIuCi0gIC8vIE5vdGUgdGhhdCBzaW5jZSB0aGUgdG9rZW5pemVyIGRvZXMgbm90IHN1cHBvcnQgbmVnYXRpdmUgbnVtYmVycywKLSAgLy8gd2UgYWN0dWFsbHkgbWF5IGNvbnN1bWUgYW4gYWRkaXRpb25hbCB0b2tlbiAoZm9yIHRoZSBtaW51cyBzaWduKSBpbiB0aGlzCi0gIC8vIG1ldGhvZC4gUmV0dXJucyBmYWxzZSBpZiB0aGUgdG9rZW4gaXMgbm90IGFuIGludGVnZXIKLSAgLy8gKHNpZ25lZCBvciBvdGhlcndpc2UpLgotICBib29sIENvbnN1bWVTaWduZWRJbnRlZ2VyKGludDY0KiB2YWx1ZSwgdWludDY0IG1heF92YWx1ZSkgewotICAgIGJvb2wgbmVnYXRpdmUgPSBmYWxzZTsKLQotICAgIGlmIChUcnlDb25zdW1lKCItIikpIHsKLSAgICAgIG5lZ2F0aXZlID0gdHJ1ZTsKLSAgICAgIC8vIFR3bydzIGNvbXBsZW1lbnQgYWx3YXlzIGFsbG93cyBvbmUgbW9yZSBuZWdhdGl2ZSBpbnRlZ2VyIHRoYW4KLSAgICAgIC8vIHBvc2l0aXZlLgotICAgICAgKyttYXhfdmFsdWU7Ci0gICAgfQotCi0gICAgdWludDY0IHVuc2lnbmVkX3ZhbHVlOwotCi0gICAgRE8oQ29uc3VtZVVuc2lnbmVkSW50ZWdlcigmdW5zaWduZWRfdmFsdWUsIG1heF92YWx1ZSkpOwotCi0gICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjQ+KHVuc2lnbmVkX3ZhbHVlKTsKLQotICAgIGlmIChuZWdhdGl2ZSkgewotICAgICAgKnZhbHVlID0gLSp2YWx1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIENvbnN1bWVzIGEgdWludDY0IGFuZCBzYXZlcyBpdHMgdmFsdWUgaW4gdGhlIHZhbHVlIHBhcmFtZXRlci4KLSAgLy8gQWNjZXB0cyBkZWNpbWFsIG51bWJlcnMgb25seSwgcmVqZWN0cyBoZXggb3Igb2N0IG51bWJlcnMuCi0gIGJvb2wgQ29uc3VtZVVuc2lnbmVkRGVjaW1hbEludGVnZXIodWludDY0KiB2YWx1ZSwgdWludDY0IG1heF92YWx1ZSkgewotICAgIGlmICghTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7Ci0gICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaW50ZWdlci4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBjb25zdCBzdHJpbmcmIHRleHQgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OwotICAgIGlmIChJc0hleE51bWJlcih0ZXh0KSB8fCBJc09jdE51bWJlcih0ZXh0KSkgewotICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdCBhIGRlY2ltYWwgbnVtYmVyLiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmICghaW86OlRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKHRleHQsIG1heF92YWx1ZSwgdmFsdWUpKSB7Ci0gICAgICBSZXBvcnRFcnJvcigiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgdG9rZW5pemVyXy5OZXh0KCk7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBDb25zdW1lcyBhIGRvdWJsZSBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSB2YWx1ZSBwYXJhbWV0ZXIuCi0gIC8vIE5vdGUgdGhhdCBzaW5jZSB0aGUgdG9rZW5pemVyIGRvZXMgbm90IHN1cHBvcnQgbmVnYXRpdmUgbnVtYmVycywKLSAgLy8gd2UgYWN0dWFsbHkgbWF5IGNvbnN1bWUgYW4gYWRkaXRpb25hbCB0b2tlbiAoZm9yIHRoZSBtaW51cyBzaWduKSBpbiB0aGlzCi0gIC8vIG1ldGhvZC4gUmV0dXJucyBmYWxzZSBpZiB0aGUgdG9rZW4gaXMgbm90IGEgZG91YmxlCi0gIC8vIChzaWduZWQgb3Igb3RoZXJ3aXNlKS4KLSAgYm9vbCBDb25zdW1lRG91YmxlKGRvdWJsZSogdmFsdWUpIHsKLSAgICBib29sIG5lZ2F0aXZlID0gZmFsc2U7Ci0KLSAgICBpZiAoVHJ5Q29uc3VtZSgiLSIpKSB7Ci0gICAgICBuZWdhdGl2ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgLy8gQSBkb3VibGUgY2FuIGFjdHVhbGx5IGJlIGFuIGludGVnZXIsIGFjY29yZGluZyB0byB0aGUgdG9rZW5pemVyLgotICAgIC8vIFRoZXJlZm9yZSwgd2UgbXVzdCBjaGVjayBib3RoIGNhc2VzIGhlcmUuCi0gICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgewotICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhbiBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgZG91YmxlLgotICAgICAgdWludDY0IGludGVnZXJfdmFsdWU7Ci0gICAgICBETyhDb25zdW1lVW5zaWduZWREZWNpbWFsSW50ZWdlcigmaW50ZWdlcl92YWx1ZSwga3VpbnQ2NG1heCkpOwotCi0gICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGludGVnZXJfdmFsdWUpOwotICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0ZMT0FUKSkgewotICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhIGZsb2F0IHZhbHVlIGZvciB0aGUgZG91YmxlLgotICAgICAgKnZhbHVlID0gaW86OlRva2VuaXplcjo6UGFyc2VGbG9hdCh0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0KTsKLQotICAgICAgLy8gTWFyayB0aGUgY3VycmVudCB0b2tlbiBhcyBjb25zdW1lZC4KLSAgICAgIHRva2VuaXplcl8uTmV4dCgpOwotICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIpKSB7Ci0gICAgICBzdHJpbmcgdGV4dCA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7Ci0gICAgICBMb3dlclN0cmluZygmdGV4dCk7Ci0gICAgICBpZiAodGV4dCA9PSAiaW5mIiB8fAotICAgICAgICAgIHRleHQgPT0gImluZmluaXR5IikgewotICAgICAgICAqdmFsdWUgPSBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCk7Ci0gICAgICAgIHRva2VuaXplcl8uTmV4dCgpOwotICAgICAgfSBlbHNlIGlmICh0ZXh0ID09ICJuYW4iKSB7Ci0gICAgICAgICp2YWx1ZSA9IHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCk7Ci0gICAgICAgIHRva2VuaXplcl8uTmV4dCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGRvdWJsZS4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgZG91YmxlLiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGlmIChuZWdhdGl2ZSkgewotICAgICAgKnZhbHVlID0gLSp2YWx1ZTsKLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIENvbnN1bWVzIEFueTo6dHlwZV91cmwgdmFsdWUsIG9mIGZvcm0gInR5cGUuZ29vZ2xlYXBpcy5jb20vZnVsbC50eXBlLk5hbWUiCi0gIC8vIG9yICJ0eXBlLmdvb2dsZXByb2QuY29tL2Z1bGwudHlwZS5OYW1lIgotICBib29sIENvbnN1bWVBbnlUeXBlVXJsKHN0cmluZyogZnVsbF90eXBlX25hbWUsIHN0cmluZyogcHJlZml4KSB7Ci0gICAgLy8gVE9ETyhzYWl0bykgRXh0ZW5kIENvbnN1bWUoKSB0byBjb25zdW1lIG11bHRpcGxlIHRva2VucyBhdCBvbmNlLCBzbyB0aGF0Ci0gICAgLy8gdGhpcyBjb2RlIGNhbiBiZSB3cml0dGVuIGFzIGp1c3QgRE8oQ29uc3VtZShrR29vZ2xlQXBpc1R5cGVQcmVmaXgpKS4KLSAgICBzdHJpbmcgdXJsMSwgdXJsMiwgdXJsMzsKLSAgICBETyhDb25zdW1lSWRlbnRpZmllcigmdXJsMSkpOyAgLy8gdHlwZQotICAgIERPKENvbnN1bWUoIi4iKSk7Ci0gICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnVybDIpKTsgIC8vIGdvb2dsZWFwaXMKLSAgICBETyhDb25zdW1lKCIuIikpOwotICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZ1cmwzKSk7ICAvLyBjb20KLSAgICBETyhDb25zdW1lKCIvIikpOwotICAgIERPKENvbnN1bWVGdWxsVHlwZU5hbWUoZnVsbF90eXBlX25hbWUpKTsKLQotICAgICpwcmVmaXggPSB1cmwxICsgIi4iICsgdXJsMiArICIuIiArIHVybDMgKyAiLyI7Ci0gICAgaWYgKCpwcmVmaXggIT0gaW50ZXJuYWw6OmtUeXBlR29vZ2xlQXBpc0NvbVByZWZpeCAmJgotICAgICAgICAqcHJlZml4ICE9IGludGVybmFsOjprVHlwZUdvb2dsZVByb2RDb21QcmVmaXgpIHsKLSAgICAgIFJlcG9ydEVycm9yKCJUZXh0Rm9ybWF0OjpQYXJzZXIgZm9yIEFueSBzdXBwb3J0cyBvbmx5ICIKLSAgICAgICAgICAgICAgICAgICJ0eXBlLmdvb2dsZWFwaXMuY29tIGFuZCB0eXBlLmdvb2dsZXByb2QuY29tLCAiCi0gICAgICAgICAgICAgICAgICAiYnV0IGZvdW5kIFwiIiArICpwcmVmaXggKyAiXCIiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBBIGhlbHBlciBmdW5jdGlvbiBmb3IgcmVjb25zdHJ1Y3RpbmcgQW55Ojp2YWx1ZS4gQ29uc3VtZXMgYSB0ZXh0IG9mCi0gIC8vIGZ1bGxfdHlwZV9uYW1lLCB0aGVuIHNlcmlhbGl6ZXMgaXQgaW50byBzZXJpYWxpemVkX3ZhbHVlLiAicG9vbCIgaXMgdXNlZCB0bwotICAvLyBsb29rIHVwIGFuZCBjcmVhdGUgYSB0ZW1wb3Jhcnkgb2JqZWN0IHdpdGggZnVsbF90eXBlX25hbWUuCi0gIGJvb2wgQ29uc3VtZUFueVZhbHVlKGNvbnN0IHN0cmluZyYgZnVsbF90eXBlX25hbWUsIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLAotICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHNlcmlhbGl6ZWRfdmFsdWUpIHsKLSAgICBjb25zdCBEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0KLSAgICAgICAgcG9vbC0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKGZ1bGxfdHlwZV9uYW1lKTsKLSAgICBpZiAodmFsdWVfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgICBSZXBvcnRFcnJvcigiQ291bGQgbm90IGZpbmQgdHlwZSBcIiIgKyBmdWxsX3R5cGVfbmFtZSArCi0gICAgICAgICAgICAgICAgICAiXCIgc3RvcmVkIGluIGdvb2dsZS5wcm90b2J1Zi5BbnkuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OwotICAgIGNvbnN0IE1lc3NhZ2UqIHZhbHVlX3Byb3RvdHlwZSA9IGZhY3RvcnkuR2V0UHJvdG90eXBlKHZhbHVlX2Rlc2NyaXB0b3IpOwotICAgIGlmICh2YWx1ZV9wcm90b3R5cGUgPT0gTlVMTCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IHZhbHVlKHZhbHVlX3Byb3RvdHlwZS0+TmV3KCkpOwotICAgIHN0cmluZyBzdWJfZGVsaW1pdGVyOwotICAgIERPKENvbnN1bWVNZXNzYWdlRGVsaW1pdGVyKCZzdWJfZGVsaW1pdGVyKSk7Ci0gICAgRE8oQ29uc3VtZU1lc3NhZ2UodmFsdWUuZ2V0KCksIHN1Yl9kZWxpbWl0ZXIpKTsKLQotICAgIHZhbHVlLT5BcHBlbmRUb1N0cmluZyhzZXJpYWxpemVkX3ZhbHVlKTsKLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vIENvbnN1bWVzIGEgdG9rZW4gYW5kIGNvbmZpcm1zIHRoYXQgaXQgbWF0Y2hlcyB0aGF0IHNwZWNpZmllZCBpbiB0aGUKLSAgLy8gdmFsdWUgcGFyYW1ldGVyLiBSZXR1cm5zIGZhbHNlIGlmIHRoZSB0b2tlbiBmb3VuZCBkb2VzIG5vdCBtYXRjaCB0aGF0Ci0gIC8vIHdoaWNoIHdhcyBzcGVjaWZpZWQuCi0gIGJvb2wgQ29uc3VtZShjb25zdCBzdHJpbmcmIHZhbHVlKSB7Ci0gICAgY29uc3Qgc3RyaW5nJiBjdXJyZW50X3ZhbHVlID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKLQotICAgIGlmIChjdXJyZW50X3ZhbHVlICE9IHZhbHVlKSB7Ci0gICAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgXCIiICsgdmFsdWUgKyAiXCIsIGZvdW5kIFwiIiArIGN1cnJlbnRfdmFsdWUKLSAgICAgICAgICAgICAgICAgICsgIlwiLiIpOwotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIHRva2VuaXplcl8uTmV4dCgpOwotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvLyBBdHRlbXB0cyB0byBjb25zdW1lIHRoZSBzdXBwbGllZCB2YWx1ZS4gUmV0dXJucyBmYWxzZSBpZiBhIHRoZQotICAvLyB0b2tlbiBmb3VuZCBkb2VzIG5vdCBtYXRjaCB0aGUgdmFsdWUgc3BlY2lmaWVkLgotICBib29sIFRyeUNvbnN1bWUoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgewotICAgIGlmICh0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0ID09IHZhbHVlKSB7Ci0gICAgICB0b2tlbml6ZXJfLk5leHQoKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci0KLSAgLy8gQW4gaW50ZXJuYWwgaW5zdGFuY2Ugb2YgdGhlIFRva2VuaXplcidzIGVycm9yIGNvbGxlY3RvciwgdXNlZCB0bwotICAvLyBjb2xsZWN0IGFueSBiYXNlLWxldmVsIHBhcnNlIGVycm9ycyBhbmQgZmVlZCB0aGVtIHRvIHRoZSBQYXJzZXJJbXBsLgotICBjbGFzcyBQYXJzZXJFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgewotICAgcHVibGljOgotICAgIGV4cGxpY2l0IFBhcnNlckVycm9yQ29sbGVjdG9yKFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VySW1wbCogcGFyc2VyKSA6Ci0gICAgICAgIHBhcnNlcl8ocGFyc2VyKSB7IH0KLQotICAgIHZpcnR1YWwgflBhcnNlckVycm9yQ29sbGVjdG9yKCkgeyB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgewotICAgICAgcGFyc2VyXy0+UmVwb3J0RXJyb3IobGluZSwgY29sdW1uLCBtZXNzYWdlKTsKLSAgICB9Ci0KLSAgICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgICBwYXJzZXJfLT5SZXBvcnRXYXJuaW5nKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Ci0gICAgfQotCi0gICBwcml2YXRlOgotICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJzZXJFcnJvckNvbGxlY3Rvcik7Ci0gICAgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsKiBwYXJzZXJfOwotICB9OwotCi0gIGlvOjpFcnJvckNvbGxlY3RvciogZXJyb3JfY29sbGVjdG9yXzsKLSAgVGV4dEZvcm1hdDo6RmluZGVyKiBmaW5kZXJfOwotICBQYXJzZUluZm9UcmVlKiBwYXJzZV9pbmZvX3RyZWVfOwotICBQYXJzZXJFcnJvckNvbGxlY3RvciB0b2tlbml6ZXJfZXJyb3JfY29sbGVjdG9yXzsKLSAgaW86OlRva2VuaXplciB0b2tlbml6ZXJfOwotICBjb25zdCBEZXNjcmlwdG9yKiByb290X21lc3NhZ2VfdHlwZV87Ci0gIFNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IHNpbmd1bGFyX292ZXJ3cml0ZV9wb2xpY3lfOwotICBjb25zdCBib29sIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfOwotICBjb25zdCBib29sIGFsbG93X3Vua25vd25fZmllbGRfOwotICBjb25zdCBib29sIGFsbG93X3Vua25vd25fZW51bV87Ci0gIGNvbnN0IGJvb2wgYWxsb3dfZmllbGRfbnVtYmVyXzsKLSAgYm9vbCBoYWRfZXJyb3JzXzsKLX07Ci0KLSN1bmRlZiBETwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIEludGVybmFsIGNsYXNzIGZvciB3cml0aW5nIHRleHQgdG8gdGhlIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbS4gQWRhcHRlZAotLy8gZnJvbSB0aGUgUHJpbnRlciBmb3VuZCBpbiAvL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmgKLWNsYXNzIFRleHRGb3JtYXQ6OlByaW50ZXI6OlRleHRHZW5lcmF0b3IgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgVGV4dEdlbmVyYXRvcihpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5pdGlhbF9pbmRlbnRfbGV2ZWwpCi0gICAgOiBvdXRwdXRfKG91dHB1dCksCi0gICAgICBidWZmZXJfKE5VTEwpLAotICAgICAgYnVmZmVyX3NpemVfKDApLAotICAgICAgYXRfc3RhcnRfb2ZfbGluZV8odHJ1ZSksCi0gICAgICBmYWlsZWRfKGZhbHNlKSwKLSAgICAgIGluZGVudF8oIiIpLAotICAgICAgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfKGluaXRpYWxfaW5kZW50X2xldmVsKSB7Ci0gICAgaW5kZW50Xy5yZXNpemUoaW5pdGlhbF9pbmRlbnRfbGV2ZWxfICogMiwgJyAnKTsKLSAgfQotCi0gIH5UZXh0R2VuZXJhdG9yKCkgewotICAgIC8vIE9ubHkgQmFja1VwKCkgaWYgd2UncmUgc3VyZSB3ZSd2ZSBzdWNjZXNzZnVsbHkgY2FsbGVkIE5leHQoKSBhdCBsZWFzdAotICAgIC8vIG9uY2UuCi0gICAgaWYgKCFmYWlsZWRfICYmIGJ1ZmZlcl9zaXplXyA+IDApIHsKLSAgICAgIG91dHB1dF8tPkJhY2tVcChidWZmZXJfc2l6ZV8pOwotICAgIH0KLSAgfQotCi0gIC8vIEluZGVudCB0ZXh0IGJ5IHR3byBzcGFjZXMuICBBZnRlciBjYWxsaW5nIEluZGVudCgpLCB0d28gc3BhY2VzIHdpbGwgYmUKLSAgLy8gaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb2YgdGV4dC4gIEluZGVudCgpIG1heSBiZSBjYWxsZWQKLSAgLy8gbXVsdGlwbGUgdGltZXMgdG8gcHJvZHVjZSBkZWVwZXIgaW5kZW50cy4KLSAgdm9pZCBJbmRlbnQoKSB7Ci0gICAgaW5kZW50XyArPSAiICAiOwotICB9Ci0KLSAgLy8gUmVkdWNlcyB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwgYnkgdHdvIHNwYWNlcywgb3IgY3Jhc2hlcyBpZiB0aGUgaW5kZW50Ci0gIC8vIGxldmVsIGlzIHplcm8uCi0gIHZvaWQgT3V0ZGVudCgpIHsKLSAgICBpZiAoaW5kZW50Xy5lbXB0eSgpIHx8Ci0gICAgICAgIGluZGVudF8uc2l6ZSgpIDwgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfICogMikgewotICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgT3V0ZGVudCgpIHdpdGhvdXQgbWF0Y2hpbmcgSW5kZW50KCkuIjsKLSAgICAgIHJldHVybjsKLSAgICB9Ci0KLSAgICBpbmRlbnRfLnJlc2l6ZShpbmRlbnRfLnNpemUoKSAtIDIpOwotICB9Ci0KLSAgLy8gUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgdm9pZCBQcmludChjb25zdCBzdHJpbmcmIHN0cikgewotICAgIFByaW50KHN0ci5kYXRhKCksIHN0ci5zaXplKCkpOwotICB9Ci0KLSAgLy8gUHJpbnQgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0KSB7Ci0gICAgUHJpbnQodGV4dCwgc3RybGVuKHRleHQpKTsKLSAgfQotCi0gIC8vIFByaW50IHRleHQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0gIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgc2l6ZV90IHNpemUpIHsKLSAgICBzaXplX3QgcG9zID0gMDsgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UndmUgd3JpdHRlbiBzbyBmYXIuCi0KLSAgICBmb3IgKHNpemVfdCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgaWYgKHRleHRbaV0gPT0gJ1xuJykgewotICAgICAgICAvLyBTYXcgbmV3bGluZS4gIElmIHRoZXJlIGlzIG1vcmUgdGV4dCwgd2UgbWF5IG5lZWQgdG8gaW5zZXJ0IGFuIGluZGVudAotICAgICAgICAvLyBoZXJlLiAgU28sIHdyaXRlIHdoYXQgd2UgaGF2ZSBzbyBmYXIsIGluY2x1ZGluZyB0aGUgJ1xuJy4KLSAgICAgICAgV3JpdGUodGV4dCArIHBvcywgaSAtIHBvcyArIDEpOwotICAgICAgICBwb3MgPSBpICsgMTsKLQotICAgICAgICAvLyBTZXR0aW5nIHRoaXMgdHJ1ZSB3aWxsIGNhdXNlIHRoZSBuZXh0IFdyaXRlKCkgdG8gaW5zZXJ0IGFuIGluZGVudAotICAgICAgICAvLyBmaXJzdC4KLSAgICAgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIFdyaXRlIHRoZSByZXN0LgotICAgIFdyaXRlKHRleHQgKyBwb3MsIHNpemUgLSBwb3MpOwotICB9Ci0KLSAgLy8gVHJ1ZSBpZiBhbnkgd3JpdGUgdG8gdGhlIHVuZGVybHlpbmcgc3RyZWFtIGZhaWxlZC4gIChXZSBkb24ndCBqdXN0Ci0gIC8vIGNyYXNoIGluIHRoaXMgY2FzZSBiZWNhdXNlIHRoaXMgaXMgYW4gSS9PIGZhaWx1cmUsIG5vdCBhIHByb2dyYW1taW5nCi0gIC8vIGVycm9yLikKLSAgYm9vbCBmYWlsZWQoKSBjb25zdCB7IHJldHVybiBmYWlsZWRfOyB9Ci0KLSBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGV4dEdlbmVyYXRvcik7Ci0KLSAgdm9pZCBXcml0ZShjb25zdCBjaGFyKiBkYXRhLCBzaXplX3Qgc2l6ZSkgewotICAgIGlmIChmYWlsZWRfKSByZXR1cm47Ci0gICAgaWYgKHNpemUgPT0gMCkgcmV0dXJuOwotCi0gICAgaWYgKGF0X3N0YXJ0X29mX2xpbmVfKSB7Ci0gICAgICAvLyBJbnNlcnQgYW4gaW5kZW50LgotICAgICAgYXRfc3RhcnRfb2ZfbGluZV8gPSBmYWxzZTsKLSAgICAgIFdyaXRlKGluZGVudF8uZGF0YSgpLCBpbmRlbnRfLnNpemUoKSk7Ci0gICAgICBpZiAoZmFpbGVkXykgcmV0dXJuOwotICAgIH0KLQotICAgIHdoaWxlIChzaXplID4gYnVmZmVyX3NpemVfKSB7Ci0gICAgICAvLyBEYXRhIGV4Y2VlZHMgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBjYW4gYW5kIHJlcXVlc3QgYQotICAgICAgLy8gbmV3IGJ1ZmZlci4KLSAgICAgIG1lbWNweShidWZmZXJfLCBkYXRhLCBidWZmZXJfc2l6ZV8pOwotICAgICAgZGF0YSArPSBidWZmZXJfc2l6ZV87Ci0gICAgICBzaXplIC09IGJ1ZmZlcl9zaXplXzsKLSAgICAgIHZvaWQqIHZvaWRfYnVmZmVyOwotICAgICAgZmFpbGVkXyA9ICFvdXRwdXRfLT5OZXh0KCZ2b2lkX2J1ZmZlciwgJmJ1ZmZlcl9zaXplXyk7Ci0gICAgICBpZiAoZmFpbGVkXykgcmV0dXJuOwotICAgICAgYnVmZmVyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KHZvaWRfYnVmZmVyKTsKLSAgICB9Ci0KLSAgICAvLyBCdWZmZXIgaXMgYmlnIGVub3VnaCB0byByZWNlaXZlIHRoZSBkYXRhOyBjb3B5IGl0LgotICAgIG1lbWNweShidWZmZXJfLCBkYXRhLCBzaXplKTsKLSAgICBidWZmZXJfICs9IHNpemU7Ci0gICAgYnVmZmVyX3NpemVfIC09IHNpemU7Ci0gIH0KLQotICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIGNvbnN0IG91dHB1dF87Ci0gIGNoYXIqIGJ1ZmZlcl87Ci0gIGludCBidWZmZXJfc2l6ZV87Ci0gIGJvb2wgYXRfc3RhcnRfb2ZfbGluZV87Ci0gIGJvb2wgZmFpbGVkXzsKLQotICBzdHJpbmcgaW5kZW50XzsKLSAgaW50IGluaXRpYWxfaW5kZW50X2xldmVsXzsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UZXh0Rm9ybWF0OjpGaW5kZXI6On5GaW5kZXIoKSB7Ci19Ci0KLVRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VyKCkKLSAgOiBlcnJvcl9jb2xsZWN0b3JfKE5VTEwpLAotICAgIGZpbmRlcl8oTlVMTCksCi0gICAgcGFyc2VfaW5mb190cmVlXyhOVUxMKSwKLSAgICBhbGxvd19wYXJ0aWFsXyhmYWxzZSksCi0gICAgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF8oZmFsc2UpLAotICAgIGFsbG93X3Vua25vd25fZmllbGRfKGZhbHNlKSwKLSAgICBhbGxvd191bmtub3duX2VudW1fKGZhbHNlKSwKLSAgICBhbGxvd19maWVsZF9udW1iZXJfKGZhbHNlKSwKLSAgICBhbGxvd19yZWxheGVkX3doaXRlc3BhY2VfKGZhbHNlKSwKLSAgICBhbGxvd19zaW5ndWxhcl9vdmVyd3JpdGVzXyhmYWxzZSkgewotfQotCi1UZXh0Rm9ybWF0OjpQYXJzZXI6On5QYXJzZXIoKSB7fQotCi1ib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgewotICBvdXRwdXQtPkNsZWFyKCk7Ci0KLSAgUGFyc2VySW1wbDo6U2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgb3ZlcndyaXRlc19wb2xpY3kgPQotICAgICAgYWxsb3dfc2luZ3VsYXJfb3ZlcndyaXRlc18KLSAgICAgID8gUGFyc2VySW1wbDo6QUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUwotICAgICAgOiBQYXJzZXJJbXBsOjpGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUzsKLQotICBQYXJzZXJJbXBsIHBhcnNlcihvdXRwdXQtPkdldERlc2NyaXB0b3IoKSwgaW5wdXQsIGVycm9yX2NvbGxlY3Rvcl8sCi0gICAgICAgICAgICAgICAgICAgIGZpbmRlcl8sIHBhcnNlX2luZm9fdHJlZV8sCi0gICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZXNfcG9saWN5LAotICAgICAgICAgICAgICAgICAgICBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXywgYWxsb3dfdW5rbm93bl9maWVsZF8sCi0gICAgICAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZW51bV8sIGFsbG93X2ZpZWxkX251bWJlcl8sCi0gICAgICAgICAgICAgICAgICAgIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZV8pOwotICByZXR1cm4gTWVyZ2VVc2luZ0ltcGwoaW5wdXQsIG91dHB1dCwgJnBhcnNlcik7Ci19Ci0KLWJvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7Ci0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7Ci0gIHJldHVybiBQYXJzZSgmaW5wdXRfc3RyZWFtLCBvdXRwdXQpOwotfQotCi1ib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgewotICBQYXJzZXJJbXBsIHBhcnNlcihvdXRwdXQtPkdldERlc2NyaXB0b3IoKSwgaW5wdXQsIGVycm9yX2NvbGxlY3Rvcl8sCi0gICAgICAgICAgICAgICAgICAgIGZpbmRlcl8sIHBhcnNlX2luZm9fdHJlZV8sCi0gICAgICAgICAgICAgICAgICAgIFBhcnNlckltcGw6OkFMTE9XX1NJTkdVTEFSX09WRVJXUklURVMsCi0gICAgICAgICAgICAgICAgICAgIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfLCBhbGxvd191bmtub3duX2ZpZWxkXywKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5rbm93bl9lbnVtXywgYWxsb3dfZmllbGRfbnVtYmVyXywKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVsYXhlZF93aGl0ZXNwYWNlXyk7Ci0gIHJldHVybiBNZXJnZVVzaW5nSW1wbChpbnB1dCwgb3V0cHV0LCAmcGFyc2VyKTsKLX0KLQotYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZXI6Ok1lcmdlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKGlucHV0LmRhdGEoKSwgaW5wdXQuc2l6ZSgpKTsKLSAgcmV0dXJuIE1lcmdlKCZpbnB1dF9zdHJlYW0sIG91dHB1dCk7Ci19Ci0KLWJvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpNZXJnZVVzaW5nSW1wbChpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogLyogaW5wdXQgKi8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlckltcGwqIHBhcnNlcl9pbXBsKSB7Ci0gIGlmICghcGFyc2VyX2ltcGwtPlBhcnNlKG91dHB1dCkpIHJldHVybiBmYWxzZTsKLSAgaWYgKCFhbGxvd19wYXJ0aWFsXyAmJiAhb3V0cHV0LT5Jc0luaXRpYWxpemVkKCkpIHsKLSAgICB2ZWN0b3I8c3RyaW5nPiBtaXNzaW5nX2ZpZWxkczsKLSAgICBvdXRwdXQtPkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygmbWlzc2luZ19maWVsZHMpOwotICAgIHBhcnNlcl9pbXBsLT5SZXBvcnRFcnJvcigtMSwgMCwgIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW4obWlzc2luZ19maWVsZHMsICIsICIpKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKAotICAgIGNvbnN0IHN0cmluZyYgaW5wdXQsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBNZXNzYWdlKiBvdXRwdXQpIHsKLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKGlucHV0LmRhdGEoKSwgaW5wdXQuc2l6ZSgpKTsKLSAgUGFyc2VySW1wbCBwYXJzZXIob3V0cHV0LT5HZXREZXNjcmlwdG9yKCksICZpbnB1dF9zdHJlYW0sIGVycm9yX2NvbGxlY3Rvcl8sCi0gICAgICAgICAgICAgICAgICAgIGZpbmRlcl8sIHBhcnNlX2luZm9fdHJlZV8sCi0gICAgICAgICAgICAgICAgICAgIFBhcnNlckltcGw6OkFMTE9XX1NJTkdVTEFSX09WRVJXUklURVMsCi0gICAgICAgICAgICAgICAgICAgIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfLCBhbGxvd191bmtub3duX2ZpZWxkXywKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dfdW5rbm93bl9lbnVtXywgYWxsb3dfZmllbGRfbnVtYmVyXywKLSAgICAgICAgICAgICAgICAgICAgYWxsb3dfcmVsYXhlZF93aGl0ZXNwYWNlXyk7Ci0gIHJldHVybiBwYXJzZXIuUGFyc2VGaWVsZChmaWVsZCwgb3V0cHV0KTsKLX0KLQotLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7Ci0gIHJldHVybiBQYXJzZXIoKS5QYXJzZShpbnB1dCwgb3V0cHV0KTsKLX0KLQotLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6TWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7Ci0gIHJldHVybiBQYXJzZXIoKS5NZXJnZShpbnB1dCwgb3V0cHV0KTsKLX0KLQotLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KSB7Ci0gIHJldHVybiBQYXJzZXIoKS5QYXJzZUZyb21TdHJpbmcoaW5wdXQsIG91dHB1dCk7Ci19Ci0KLS8qIHN0YXRpYyAqLyBib29sIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgewotICByZXR1cm4gUGFyc2VyKCkuTWVyZ2VGcm9tU3RyaW5nKGlucHV0LCBvdXRwdXQpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotLy8gVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIEZpZWxkVmFsdWVQcmludGVyLiBUaGUgYmFzZSBjbGFzcyBqdXN0Ci0vLyBkb2VzIHNpbXBsZSBmb3JtYXR0aW5nLiBUaGF0IHdheSwgZGVyaXZpbmcgY2xhc3NlcyBjb3VsZCBkZWNpZGUgdG8gZmFsbGJhY2sKLS8vIHRvIHRoYXQgYmVoYXZpb3IuCi1UZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6RmllbGRWYWx1ZVByaW50ZXIoKSB7fQotVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6On5GaWVsZFZhbHVlUHJpbnRlcigpIHt9Ci1zdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50Qm9vbChib29sIHZhbCkgY29uc3QgewotICByZXR1cm4gdmFsID8gInRydWUiIDogImZhbHNlIjsKLX0KLXN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRJbnQzMihpbnQzMiB2YWwpIGNvbnN0IHsKLSAgcmV0dXJuIFNpbXBsZUl0b2EodmFsKTsKLX0KLXN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRVSW50MzIodWludDMyIHZhbCkgY29uc3QgewotICByZXR1cm4gU2ltcGxlSXRvYSh2YWwpOwotfQotc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEludDY0KGludDY0IHZhbCkgY29uc3QgewotICByZXR1cm4gU2ltcGxlSXRvYSh2YWwpOwotfQotc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludFVJbnQ2NCh1aW50NjQgdmFsKSBjb25zdCB7Ci0gIHJldHVybiBTaW1wbGVJdG9hKHZhbCk7Ci19Ci1zdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50RmxvYXQoZmxvYXQgdmFsKSBjb25zdCB7Ci0gIHJldHVybiBTaW1wbGVGdG9hKHZhbCk7Ci19Ci1zdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50RG91YmxlKGRvdWJsZSB2YWwpIGNvbnN0IHsKLSAgcmV0dXJuIFNpbXBsZUR0b2EodmFsKTsKLX0KLXN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRTdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWwpIGNvbnN0IHsKLSAgc3RyaW5nIHByaW50ZWQoIlwiIik7Ci0gIENFc2NhcGVBbmRBcHBlbmQodmFsLCAmcHJpbnRlZCk7Ci0gIHByaW50ZWQucHVzaF9iYWNrKCdcIicpOwotICByZXR1cm4gcHJpbnRlZDsKLX0KLXN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRCeXRlcyhjb25zdCBzdHJpbmcmIHZhbCkgY29uc3QgewotICByZXR1cm4gUHJpbnRTdHJpbmcodmFsKTsKLX0KLXN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRFbnVtKGludDMyIHZhbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgewotICByZXR1cm4gbmFtZTsKLX0KLXN0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRGaWVsZE5hbWUoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIC8vIFdlIHNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0IGVsZW1lbnRzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLgotICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpCi0gICAgICAgICYmIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UKLSAgICAgICAgJiYgZmllbGQtPmlzX29wdGlvbmFsKCkKLSAgICAgICAgJiYgZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpID09IGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkgewotICAgICAgcmV0dXJuIFN0ckNhdCgiWyIsIGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCksICJdIik7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBTdHJDYXQoIlsiLCBmaWVsZC0+ZnVsbF9uYW1lKCksICJdIik7Ci0gICAgfQotICB9IGVsc2UgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7Ci0gICAgLy8gR3JvdXBzIG11c3QgYmUgc2VyaWFsaXplZCB3aXRoIHRoZWlyIG9yaWdpbmFsIGNhcGl0YWxpemF0aW9uLgotICAgIHJldHVybiBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm5hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gZmllbGQtPm5hbWUoKTsKLSAgfQotfQotc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludE1lc3NhZ2VTdGFydCgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgIGludCBmaWVsZF9pbmRleCwKLSAgICBpbnQgZmllbGRfY291bnQsCi0gICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlKSBjb25zdCB7Ci0gIHJldHVybiBzaW5nbGVfbGluZV9tb2RlID8gIiB7ICIgOiAiIHtcbiI7Ci19Ci1zdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50TWVzc2FnZUVuZCgKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgIGludCBmaWVsZF9pbmRleCwKLSAgICBpbnQgZmllbGRfY291bnQsCi0gICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlKSBjb25zdCB7Ci0gIHJldHVybiBzaW5nbGVfbGluZV9tb2RlID8gIn0gIiA6ICJ9XG4iOwotfQotCi1uYW1lc3BhY2UgewotLy8gT3VyIG93biBzcGVjaWFsaXphdGlvbjogZm9yIFVURjggZXNjYXBlZCBzdHJpbmdzLgotY2xhc3MgRmllbGRWYWx1ZVByaW50ZXJVdGY4RXNjYXBpbmcgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCBzdHJpbmcgUHJpbnRTdHJpbmcoY29uc3Qgc3RyaW5nJiB2YWwpIGNvbnN0IHsKLSAgICByZXR1cm4gU3RyQ2F0KCJcIiIsIHN0cmluZ3M6OlV0ZjhTYWZlQ0VzY2FwZSh2YWwpLCAiXCIiKTsKLSAgfQotICB2aXJ0dWFsIHN0cmluZyBQcmludEJ5dGVzKGNvbnN0IHN0cmluZyYgdmFsKSBjb25zdCB7Ci0gICAgcmV0dXJuIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludFN0cmluZyh2YWwpOwotICB9Ci19OwotCi19ICAvLyBuYW1lc3BhY2UKLQotVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRlcigpCi0gIDogaW5pdGlhbF9pbmRlbnRfbGV2ZWxfKDApLAotICAgIHNpbmdsZV9saW5lX21vZGVfKGZhbHNlKSwKLSAgICB1c2VfZmllbGRfbnVtYmVyXyhmYWxzZSksCi0gICAgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXNfKGZhbHNlKSwKLSAgICBoaWRlX3Vua25vd25fZmllbGRzXyhmYWxzZSksCi0gICAgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXJfKGZhbHNlKSwKLSAgICBleHBhbmRfYW55XyhmYWxzZSksCi0gICAgdHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuXygwTEwpIHsKLSAgU2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKGZhbHNlKTsKLX0KLQotVGV4dEZvcm1hdDo6UHJpbnRlcjo6flByaW50ZXIoKSB7Ci0gIFNUTERlbGV0ZVZhbHVlcygmY3VzdG9tX3ByaW50ZXJzXyk7Ci19Ci0KLXZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6U2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKGJvb2wgYXNfdXRmOCkgewotICBTZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIoYXNfdXRmOAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRmllbGRWYWx1ZVByaW50ZXJVdGY4RXNjYXBpbmcoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRmllbGRWYWx1ZVByaW50ZXIoKSk7Ci19Ci0KLXZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6U2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKAotICAgIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyKSB7Ci0gIGRlZmF1bHRfZmllbGRfdmFsdWVfcHJpbnRlcl8ucmVzZXQocHJpbnRlcik7Ci19Ci0KLWJvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyKSB7Ci0gIHJldHVybiBmaWVsZCAhPSBOVUxMICYmIHByaW50ZXIgIT0gTlVMTCAmJgotICAgICAgICAgY3VzdG9tX3ByaW50ZXJzXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoZmllbGQsIHByaW50ZXIpKS5zZWNvbmQ7Ci19Ci0KLWJvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KSBjb25zdCB7Ci0gIEdPT0dMRV9EQ0hFQ0sob3V0cHV0KSA8PCAib3V0cHV0IHNwZWNpZmllZCBpcyBOVUxMIjsKLQotICBvdXRwdXQtPmNsZWFyKCk7Ci0gIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbShvdXRwdXQpOwotCi0gIHJldHVybiBQcmludChtZXNzYWdlLCAmb3V0cHV0X3N0cmVhbSk7Ci19Ci0KLWJvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcoCi0gICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKLSAgICBzdHJpbmcqIG91dHB1dCkgY29uc3QgewotICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIm91dHB1dCBzcGVjaWZpZWQgaXMgTlVMTCI7Ci0KLSAgb3V0cHV0LT5jbGVhcigpOwotICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0ob3V0cHV0KTsKLSAgcmV0dXJuIFByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgJm91dHB1dF9zdHJlYW0pOwotfQotCi1ib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKG91dHB1dCwgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfKTsKLQotICBQcmludChtZXNzYWdlLCBnZW5lcmF0b3IpOwotCi0gIC8vIE91dHB1dCBmYWxzZSBpZiB0aGUgZ2VuZXJhdG9yIGZhaWxlZCBpbnRlcm5hbGx5LgotICByZXR1cm4gIWdlbmVyYXRvci5mYWlsZWQoKTsKLX0KLQotYm9vbCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludFVua25vd25GaWVsZHMoCi0gICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKLSAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgewotICBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcihvdXRwdXQsIGluaXRpYWxfaW5kZW50X2xldmVsXyk7Ci0KLSAgUHJpbnRVbmtub3duRmllbGRzKHVua25vd25fZmllbGRzLCBnZW5lcmF0b3IpOwotCi0gIC8vIE91dHB1dCBmYWxzZSBpZiB0aGUgZ2VuZXJhdG9yIGZhaWxlZCBpbnRlcm5hbGx5LgotICByZXR1cm4gIWdlbmVyYXRvci5mYWlsZWQoKTsKLX0KLQotbmFtZXNwYWNlIHsKLS8vIENvbXBhcmlzb24gZnVuY3RvciBmb3Igc29ydGluZyBGaWVsZERlc2NyaXB0b3JzIGJ5IGZpZWxkIGluZGV4Lgotc3RydWN0IEZpZWxkSW5kZXhTb3J0ZXIgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBsZWZ0LAotICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByaWdodCkgY29uc3QgewotICAgIHJldHVybiBsZWZ0LT5pbmRleCgpIDwgcmlnaHQtPmluZGV4KCk7Ci0gIH0KLX07Ci0KLX0gIC8vIG5hbWVzcGFjZQotCi1ib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50QW55KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3QgewotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHR5cGVfdXJsX2ZpZWxkOwotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2ZpZWxkOwotICBpZiAoIWludGVybmFsOjpHZXRBbnlGaWVsZERlc2NyaXB0b3JzKG1lc3NhZ2UsICZ0eXBlX3VybF9maWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZmllbGQpKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotCi0gIC8vIEV4dHJhY3QgdGhlIGZ1bGwgdHlwZSBuYW1lIGZyb20gdGhlIHR5cGVfdXJsIGZpZWxkLgotICBjb25zdCBzdHJpbmcmIHR5cGVfdXJsID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIHR5cGVfdXJsX2ZpZWxkKTsKLSAgc3RyaW5nIGZ1bGxfdHlwZV9uYW1lOwotICBpZiAoIWludGVybmFsOjpQYXJzZUFueVR5cGVVcmwodHlwZV91cmwsICZmdWxsX3R5cGVfbmFtZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICAvLyBQcmludCB0aGUgInZhbHVlIiBpbiB0ZXh0LgotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0KLSAgICAgIG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5maWxlKCktPnBvb2woKS0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKAotICAgICAgICAgIGZ1bGxfdHlwZV9uYW1lKTsKLSAgaWYgKHZhbHVlX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIlByb3RvIHR5cGUgIiA8PCB0eXBlX3VybCA8PCAiIG5vdCBmb3VuZCI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OwotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2U+IHZhbHVlX21lc3NhZ2UoCi0gICAgICBmYWN0b3J5LkdldFByb3RvdHlwZSh2YWx1ZV9kZXNjcmlwdG9yKS0+TmV3KCkpOwotICBzdHJpbmcgc2VyaWFsaXplZF92YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCB2YWx1ZV9maWVsZCk7Ci0gIGlmICghdmFsdWVfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWRfdmFsdWUpKSB7Ci0gICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCB0eXBlX3VybCA8PCAiOiBmYWlsZWQgdG8gcGFyc2UgY29udGVudHMiOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICBnZW5lcmF0b3IuUHJpbnQoU3RyQ2F0KCJbIiwgdHlwZV91cmwsICJdIikpOwotICBjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlciA9IEZpbmRXaXRoRGVmYXVsdCgKLSAgICAgIGN1c3RvbV9wcmludGVyc18sIHZhbHVlX2ZpZWxkLCBkZWZhdWx0X2ZpZWxkX3ZhbHVlX3ByaW50ZXJfLmdldCgpKTsKLSAgZ2VuZXJhdG9yLlByaW50KAotICAgICAgcHJpbnRlci0+UHJpbnRNZXNzYWdlU3RhcnQobWVzc2FnZSwgLTEsIDAsIHNpbmdsZV9saW5lX21vZGVfKSk7Ci0gIGdlbmVyYXRvci5JbmRlbnQoKTsKLSAgUHJpbnQoKnZhbHVlX21lc3NhZ2UsIGdlbmVyYXRvcik7Ci0gIGdlbmVyYXRvci5PdXRkZW50KCk7Ci0gIGdlbmVyYXRvci5QcmludChwcmludGVyLT5QcmludE1lc3NhZ2VFbmQobWVzc2FnZSwgLTEsIDAsIHNpbmdsZV9saW5lX21vZGVfKSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi12b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3QgewotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLSAgaWYgKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpID09IGludGVybmFsOjprQW55RnVsbFR5cGVOYW1lICYmIGV4cGFuZF9hbnlfICYmCi0gICAgICBQcmludEFueShtZXNzYWdlLCBnZW5lcmF0b3IpKSB7Ci0gICAgcmV0dXJuOwotICB9Ci0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0gIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7Ci0gIGlmIChwcmludF9tZXNzYWdlX2ZpZWxkc19pbl9pbmRleF9vcmRlcl8pIHsKLSAgICBzdGQ6OnNvcnQoZmllbGRzLmJlZ2luKCksIGZpZWxkcy5lbmQoKSwgRmllbGRJbmRleFNvcnRlcigpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotICAgIFByaW50RmllbGQobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGRzW2ldLCBnZW5lcmF0b3IpOwotICB9Ci0gIGlmICghaGlkZV91bmtub3duX2ZpZWxkc18pIHsKLSAgICBQcmludFVua25vd25GaWVsZHMocmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSwgZ2VuZXJhdG9yKTsKLSAgfQotfQotCi12b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBpbnQgaW5kZXgsCi0gICAgc3RyaW5nKiBvdXRwdXQpIGNvbnN0IHsKLQotICBHT09HTEVfRENIRUNLKG91dHB1dCkgPDwgIm91dHB1dCBzcGVjaWZpZWQgaXMgTlVMTCI7Ci0KLSAgb3V0cHV0LT5jbGVhcigpOwotICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0ob3V0cHV0KTsKLSAgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IoJm91dHB1dF9zdHJlYW0sIGluaXRpYWxfaW5kZW50X2xldmVsXyk7Ci0KLSAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLCBmaWVsZCwgaW5kZXgsIGdlbmVyYXRvcik7Ci19Ci0KLWNsYXNzIE1hcEVudHJ5TWVzc2FnZUNvbXBhcmF0b3IgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgTWFwRW50cnlNZXNzYWdlQ29tcGFyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICAgICAgOiBmaWVsZF8oZGVzY3JpcHRvci0+ZmllbGQoMCkpIHt9Ci0KLSAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IE1lc3NhZ2UqIGEsIGNvbnN0IE1lc3NhZ2UqIGIpIHsKLSAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gYS0+R2V0UmVmbGVjdGlvbigpOwotICAgIHN3aXRjaCAoZmllbGRfLT5jcHBfdHlwZSgpKSB7Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7Ci0gICAgICAgICAgYm9vbCBmaXJzdCA9IHJlZmxlY3Rpb24tPkdldEJvb2woKmEsIGZpZWxkXyk7Ci0gICAgICAgICAgYm9vbCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRCb29sKCpiLCBmaWVsZF8pOwotICAgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKLSAgICAgIH0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7Ci0gICAgICAgICAgaW50MzIgZmlyc3QgPSByZWZsZWN0aW9uLT5HZXRJbnQzMigqYSwgZmllbGRfKTsKLSAgICAgICAgICBpbnQzMiBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRJbnQzMigqYiwgZmllbGRfKTsKLSAgICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7Ci0gICAgICB9Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDogewotICAgICAgICAgIGludDY0IGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0SW50NjQoKmEsIGZpZWxkXyk7Ci0gICAgICAgICAgaW50NjQgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0SW50NjQoKmIsIGZpZWxkXyk7Ci0gICAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOwotICAgICAgfQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7Ci0gICAgICAgICAgdWludDMyIGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0VUludDMyKCphLCBmaWVsZF8pOwotICAgICAgICAgIHVpbnQzMiBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRVSW50MzIoKmIsIGZpZWxkXyk7Ci0gICAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOwotICAgICAgfQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7Ci0gICAgICAgICAgdWludDY0IGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0VUludDY0KCphLCBmaWVsZF8pOwotICAgICAgICAgIHVpbnQ2NCBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRVSW50NjQoKmIsIGZpZWxkXyk7Ci0gICAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOwotICAgICAgfQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICAgICAgc3RyaW5nIGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKCphLCBmaWVsZF8pOwotICAgICAgICAgIHN0cmluZyBzZWNvbmQgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoKmIsIGZpZWxkXyk7Ci0gICAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOwotICAgICAgfQotICAgICAgZGVmYXVsdDoKLSAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJJbnZhbGlkIGtleSBmb3IgbWFwIGZpZWxkLiI7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gcHJpdmF0ZToKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF87Ci19OwotCi12b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7Ci0gIGlmICh1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc18gJiYKLSAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpICYmCi0gICAgICBmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HICYmCi0gICAgICBmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgIFByaW50U2hvcnRSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBnZW5lcmF0b3IpOwotICAgIHJldHVybjsKLSAgfQotCi0gIGludCBjb3VudCA9IDA7Ci0KLSAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgY291bnQgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGQpOwotICB9IGVsc2UgaWYgKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgewotICAgIGNvdW50ID0gMTsKLSAgfQotCi0gIHN0ZDo6dmVjdG9yPGNvbnN0IE1lc3NhZ2UqPiBzb3J0ZWRfbWFwX2ZpZWxkOwotICBpZiAoZmllbGQtPmlzX21hcCgpKSB7Ci0gICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiYgbWFwX2ZpZWxkID0KLSAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPihtZXNzYWdlLCBmaWVsZCk7Ci0gICAgZm9yIChSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ID0KLSAgICAgICAgICAgICBtYXBfZmllbGQucG9pbnRlcl9iZWdpbigpOwotICAgICAgICAgaXQgIT0gbWFwX2ZpZWxkLnBvaW50ZXJfZW5kKCk7ICsraXQpIHsKLSAgICAgIHNvcnRlZF9tYXBfZmllbGQucHVzaF9iYWNrKCppdCk7Ci0gICAgfQotCi0gICAgTWFwRW50cnlNZXNzYWdlQ29tcGFyYXRvciBjb21wYXJhdG9yKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSk7Ci0gICAgc3RkOjpzdGFibGVfc29ydChzb3J0ZWRfbWFwX2ZpZWxkLmJlZ2luKCksIHNvcnRlZF9tYXBfZmllbGQuZW5kKCksCi0gICAgICAgICAgICAgICAgICAgICBjb21wYXJhdG9yKTsKLSAgfQotCi0gIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7ICsraikgewotICAgIGNvbnN0IGludCBmaWVsZF9pbmRleCA9IGZpZWxkLT5pc19yZXBlYXRlZCgpID8gaiA6IC0xOwotCi0gICAgUHJpbnRGaWVsZE5hbWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQsIGdlbmVyYXRvcik7Ci0KLSAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyID0gRmluZFdpdGhEZWZhdWx0KAotICAgICAgICAgIGN1c3RvbV9wcmludGVyc18sIGZpZWxkLCBkZWZhdWx0X2ZpZWxkX3ZhbHVlX3ByaW50ZXJfLmdldCgpKTsKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KLSAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKQotICAgICAgICAgICAgICA/IChmaWVsZC0+aXNfbWFwKCkKLSAgICAgICAgICAgICAgICAgICAgID8gKnNvcnRlZF9tYXBfZmllbGRbal0KLSAgICAgICAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKSkKLSAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKTsKLSAgICAgIGdlbmVyYXRvci5QcmludCgKLSAgICAgICAgICBwcmludGVyLT5QcmludE1lc3NhZ2VTdGFydCgKLSAgICAgICAgICAgICAgc3ViX21lc3NhZ2UsIGZpZWxkX2luZGV4LCBjb3VudCwgc2luZ2xlX2xpbmVfbW9kZV8pKTsKLSAgICAgIGdlbmVyYXRvci5JbmRlbnQoKTsKLSAgICAgIFByaW50KHN1Yl9tZXNzYWdlLCBnZW5lcmF0b3IpOwotICAgICAgZ2VuZXJhdG9yLk91dGRlbnQoKTsKLSAgICAgIGdlbmVyYXRvci5QcmludCgKLSAgICAgICAgICBwcmludGVyLT5QcmludE1lc3NhZ2VFbmQoCi0gICAgICAgICAgICAgIHN1Yl9tZXNzYWdlLCBmaWVsZF9pbmRleCwgY291bnQsIHNpbmdsZV9saW5lX21vZGVfKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdlbmVyYXRvci5QcmludCgiOiAiKTsKLSAgICAgIC8vIFdyaXRlIHRoZSBmaWVsZCB2YWx1ZS4KLSAgICAgIFByaW50RmllbGRWYWx1ZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZmllbGRfaW5kZXgsIGdlbmVyYXRvcik7Ci0gICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKLSAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlxuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19Ci0KLXZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRTaG9ydFJlcGVhdGVkRmllbGQoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7Ci0gIC8vIFByaW50IHByaW1pdGl2ZSByZXBlYXRlZCBmaWVsZCBpbiBzaG9ydCBmb3JtLgotICBQcmludEZpZWxkTmFtZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZ2VuZXJhdG9yKTsKLQotICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7Ci0gIGdlbmVyYXRvci5QcmludCgiOiBbIik7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgaWYgKGkgPiAwKSBnZW5lcmF0b3IuUHJpbnQoIiwgIik7Ci0gICAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBpLCBnZW5lcmF0b3IpOwotICB9Ci0gIGlmIChzaW5nbGVfbGluZV9tb2RlXykgewotICAgIGdlbmVyYXRvci5QcmludCgiXSAiKTsKLSAgfSBlbHNlIHsKLSAgICBnZW5lcmF0b3IuUHJpbnQoIl1cbiIpOwotICB9Ci19Ci0KLXZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRGaWVsZE5hbWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdCB7Ci0gIC8vIGlmIHVzZV9maWVsZF9udW1iZXJfIGlzIHRydWUsIHByaW50cyBmaWVsZCBudW1iZXIgaW5zdGVhZAotICAvLyBvZiBmaWVsZCBuYW1lLgotICBpZiAodXNlX2ZpZWxkX251bWJlcl8pIHsKLSAgICBnZW5lcmF0b3IuUHJpbnQoU2ltcGxlSXRvYShmaWVsZC0+bnVtYmVyKCkpKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlciA9IEZpbmRXaXRoRGVmYXVsdCgKLSAgICAgIGN1c3RvbV9wcmludGVyc18sIGZpZWxkLCBkZWZhdWx0X2ZpZWxkX3ZhbHVlX3ByaW50ZXJfLmdldCgpKTsKLSAgZ2VuZXJhdG9yLlByaW50KHByaW50ZXItPlByaW50RmllbGROYW1lKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7Ci19Ci0KLXZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRGaWVsZFZhbHVlKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGludCBpbmRleCwKLSAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKLSAgR09PR0xFX0RDSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fCAoaW5kZXggPT0gLTEpKQotICAgICAgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMiOwotCi0gIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyCi0gICAgICA9IEZpbmRXaXRoRGVmYXVsdChjdXN0b21fcHJpbnRlcnNfLCBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZmllbGRfdmFsdWVfcHJpbnRlcl8uZ2V0KCkpOwotCi0gIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgT1VUUFVUX0ZJRUxEKENQUFRZUEUsIE1FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIGdlbmVyYXRvci5QcmludChwcmludGVyLT5QcmludCMjTUVUSE9EKGZpZWxkLT5pc19yZXBlYXRlZCgpICAgICAgIFwKLSAgICAgICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWQjI01FVEhPRChtZXNzYWdlLCBmaWVsZCwgaW5kZXgpIFwKLSAgICAgICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0IyNNRVRIT0QobWVzc2FnZSwgZmllbGQpKSk7ICAgICAgICAgICAgIFwKLSAgICAgICAgYnJlYWsKLQotICAgIE9VVFBVVF9GSUVMRCggSU5UMzIsICBJbnQzMik7Ci0gICAgT1VUUFVUX0ZJRUxEKCBJTlQ2NCwgIEludDY0KTsKLSAgICBPVVRQVVRfRklFTEQoVUlOVDMyLCBVSW50MzIpOwotICAgIE9VVFBVVF9GSUVMRChVSU5UNjQsIFVJbnQ2NCk7Ci0gICAgT1VUUFVUX0ZJRUxEKCBGTE9BVCwgIEZsb2F0KTsKLSAgICBPVVRQVVRfRklFTEQoRE9VQkxFLCBEb3VibGUpOwotICAgIE9VVFBVVF9GSUVMRCggIEJPT0wsICAgQm9vbCk7Ci0jdW5kZWYgT1VUUFVUX0ZJRUxECi0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKLSAgICAgIHN0cmluZyBzY3JhdGNoOwotICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSA9IGZpZWxkLT5pc19yZXBlYXRlZCgpCi0gICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKLSAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGluZGV4LCAmc2NyYXRjaCkKLSAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOwotICAgICAgY29uc3Qgc3RyaW5nKiB2YWx1ZV90b19wcmludCA9ICZ2YWx1ZTsKLSAgICAgIHN0cmluZyB0cnVuY2F0ZWRfdmFsdWU7Ci0gICAgICBpZiAodHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuXyA+IDAgJiYKLSAgICAgICAgICB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fIDwgdmFsdWUuc2l6ZSgpKSB7Ci0gICAgICAgIHRydW5jYXRlZF92YWx1ZSA9IHZhbHVlLnN1YnN0cigwLCB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fKSArCi0gICAgICAgICAgICAgICAgICAgICAgICAgICIuLi48dHJ1bmNhdGVkPi4uLiI7Ci0gICAgICAgIHZhbHVlX3RvX3ByaW50ID0gJnRydW5jYXRlZF92YWx1ZTsKLSAgICAgIH0KLSAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKLSAgICAgICAgZ2VuZXJhdG9yLlByaW50KHByaW50ZXItPlByaW50U3RyaW5nKCp2YWx1ZV90b19wcmludCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgR09PR0xFX0RDSEVDS19FUShmaWVsZC0+dHlwZSgpLCBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpOwotICAgICAgICBnZW5lcmF0b3IuUHJpbnQocHJpbnRlci0+UHJpbnRCeXRlcygqdmFsdWVfdG9fcHJpbnQpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKLSAgICAgIGludCBlbnVtX3ZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkKLSAgICAgICAgICA/IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkKLSAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCk7Ci0gICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX2Rlc2MgPQotICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIoZW51bV92YWx1ZSk7Ci0gICAgICBpZiAoZW51bV9kZXNjICE9IE5VTEwpIHsKLSAgICAgICAgZ2VuZXJhdG9yLlByaW50KHByaW50ZXItPlByaW50RW51bShlbnVtX3ZhbHVlLCBlbnVtX2Rlc2MtPm5hbWUoKSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gT3JkaW5hcmlseSwgZW51bV9kZXNjIHNob3VsZCBub3QgYmUgbnVsbCwgYmVjYXVzZSBwcm90bzIgaGFzIHRoZQotICAgICAgICAvLyBpbnZhcmlhbnQgdGhhdCBzZXQgZW51bSBmaWVsZCB2YWx1ZXMgbXVzdCBiZSBpbi1yYW5nZSwgYnV0IHdpdGggdGhlCi0gICAgICAgIC8vIG5ldyBpbnRlZ2VyLWJhc2VkIEFQSSBmb3IgZW51bXMgKG9yIHRoZSBSZXBlYXRlZEZpZWxkPGludD4gbG9vcGhvbGUpLAotICAgICAgICAvLyBpdCBpcyBwb3NzaWJsZSBmb3IgdGhlIHVzZXIgdG8gZm9yY2UgYW4gdW5rbm93biBpbnRlZ2VyIHZhbHVlLiAgU28gd2UKLSAgICAgICAgLy8gc2ltcGx5IHVzZSB0aGUgaW50ZWdlciB2YWx1ZSBpdHNlbGYgYXMgdGhlIGVudW0gdmFsdWUgbmFtZSBpbiB0aGlzCi0gICAgICAgIC8vIGNhc2UuCi0gICAgICAgIGdlbmVyYXRvci5QcmludChwcmludGVyLT5QcmludEVudW0oZW51bV92YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdQcmludGYoIiVkIiwgZW51bV92YWx1ZSkpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICBQcmludChmaWVsZC0+aXNfcmVwZWF0ZWQoKQotICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGluZGV4KQotICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKSwKLSAgICAgICAgICAgIGdlbmVyYXRvcik7Ci0gICAgICBicmVhazsKLSAgfQotfQotCi0vKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQcmludChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgcmV0dXJuIFByaW50ZXIoKS5QcmludChtZXNzYWdlLCBvdXRwdXQpOwotfQotCi0vKiBzdGF0aWMgKi8gYm9vbCBUZXh0Rm9ybWF0OjpQcmludFVua25vd25GaWVsZHMoCi0gICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKLSAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICByZXR1cm4gUHJpbnRlcigpLlByaW50VW5rbm93bkZpZWxkcyh1bmtub3duX2ZpZWxkcywgb3V0cHV0KTsKLX0KLQotLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UHJpbnRUb1N0cmluZygKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBzdHJpbmcqIG91dHB1dCkgewotICByZXR1cm4gUHJpbnRlcigpLlByaW50VG9TdHJpbmcobWVzc2FnZSwgb3V0cHV0KTsKLX0KLQotLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UHJpbnRVbmtub3duRmllbGRzVG9TdHJpbmcoCi0gICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywgc3RyaW5nKiBvdXRwdXQpIHsKLSAgcmV0dXJuIFByaW50ZXIoKS5QcmludFVua25vd25GaWVsZHNUb1N0cmluZyh1bmtub3duX2ZpZWxkcywgb3V0cHV0KTsKLX0KLQotLyogc3RhdGljICovIHZvaWQgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcoCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGludCBpbmRleCwKLSAgICBzdHJpbmcqIG91dHB1dCkgewotICByZXR1cm4gUHJpbnRlcigpLlByaW50RmllbGRWYWx1ZVRvU3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCwgb3V0cHV0KTsKLX0KLQotLyogc3RhdGljICovIGJvb2wgVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZygKLSAgICBjb25zdCBzdHJpbmcmIGlucHV0LAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgTWVzc2FnZSogbWVzc2FnZSkgewotICByZXR1cm4gUGFyc2VyKCkuUGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyhpbnB1dCwgZmllbGQsIG1lc3NhZ2UpOwotfQotCi0vLyBQcmludHMgYW4gaW50ZWdlciBhcyBoZXggd2l0aCBhIGZpeGVkIG51bWJlciBvZiBkaWdpdHMgZGVwZW5kZW50IG9uIHRoZQotLy8gaW50ZWdlciB0eXBlLgotdGVtcGxhdGU8dHlwZW5hbWUgSW50VHlwZT4KLXN0YXRpYyBzdHJpbmcgUGFkZGVkSGV4KEludFR5cGUgdmFsdWUpIHsKLSAgc3RyaW5nIHJlc3VsdDsKLSAgcmVzdWx0LnJlc2VydmUoc2l6ZW9mKHZhbHVlKSAqIDIpOwotICBmb3IgKGludCBpID0gc2l6ZW9mKHZhbHVlKSAqIDIgLSAxOyBpID49IDA7IGktLSkgewotICAgIHJlc3VsdC5wdXNoX2JhY2soaW50X3RvX2hleF9kaWdpdCh2YWx1ZSA+PiAoaSo0KSAmIDB4MEYpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi12b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50VW5rbm93bkZpZWxkcygKLSAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLCBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0gICAgc3RyaW5nIGZpZWxkX251bWJlciA9IFNpbXBsZUl0b2EoZmllbGQubnVtYmVyKCkpOwotCi0gICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKLSAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkX251bWJlcik7Ci0gICAgICAgIGdlbmVyYXRvci5QcmludCgiOiAiKTsKLSAgICAgICAgZ2VuZXJhdG9yLlByaW50KFNpbXBsZUl0b2EoZmllbGQudmFyaW50KCkpKTsKLSAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJcbiIpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQzMjogewotICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGRfbnVtYmVyKTsKLSAgICAgICAgZ2VuZXJhdG9yLlByaW50KCI6IDB4Iik7Ci0gICAgICAgIGdlbmVyYXRvci5QcmludCgKLSAgICAgICAgICAgIFN0ckNhdChzdHJpbmdzOjpIZXgoZmllbGQuZml4ZWQzMigpLCBzdHJpbmdzOjpaRVJPX1BBRF84KSkpOwotICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OiB7Ci0gICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZF9udW1iZXIpOwotICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIjogMHgiKTsKLSAgICAgICAgZ2VuZXJhdG9yLlByaW50KAotICAgICAgICAgICAgU3RyQ2F0KHN0cmluZ3M6OkhleChmaWVsZC5maXhlZDY0KCksIHN0cmluZ3M6OlpFUk9fUEFEXzE2KSkpOwotICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOiB7Ci0gICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZF9udW1iZXIpOwotICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpOwotICAgICAgICBVbmtub3duRmllbGRTZXQgZW1iZWRkZWRfdW5rbm93bl9maWVsZHM7Ci0gICAgICAgIGlmICghdmFsdWUuZW1wdHkoKSAmJiBlbWJlZGRlZF91bmtub3duX2ZpZWxkcy5QYXJzZUZyb21TdHJpbmcodmFsdWUpKSB7Ci0gICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBwYXJzZWFibGUgYXMgYSBNZXNzYWdlLgotICAgICAgICAgIC8vIFNvIGl0IGlzIHByb2JhYmx5IGFuIGVtYmVkZGVkIG1lc3NhZ2UuCi0gICAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7ICIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7XG4iKTsKLSAgICAgICAgICAgIGdlbmVyYXRvci5JbmRlbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKGVtYmVkZGVkX3Vua25vd25fZmllbGRzLCBnZW5lcmF0b3IpOwotICAgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgewotICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJ9ICIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuT3V0ZGVudCgpOwotICAgICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCJ9XG4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhpcyBmaWVsZCBpcyBub3QgcGFyc2VhYmxlIGFzIGEgTWVzc2FnZS4KLSAgICAgICAgICAvLyBTbyBpdCBpcyBwcm9iYWJseSBqdXN0IGEgcGxhaW4gc3RyaW5nLgotICAgICAgICAgIHN0cmluZyBwcmludGVkKCI6IFwiIik7Ci0gICAgICAgICAgQ0VzY2FwZUFuZEFwcGVuZCh2YWx1ZSwgJnByaW50ZWQpOwotICAgICAgICAgIHByaW50ZWQuYXBwZW5kKHNpbmdsZV9saW5lX21vZGVfID8gIlwiICIgOiAiXCJcbiIpOwotICAgICAgICAgIGdlbmVyYXRvci5QcmludChwcmludGVkKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgotICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGRfbnVtYmVyKTsKLSAgICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgeyAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7XG4iKTsKLSAgICAgICAgICBnZW5lcmF0b3IuSW5kZW50KCk7Ci0gICAgICAgIH0KLSAgICAgICAgUHJpbnRVbmtub3duRmllbGRzKGZpZWxkLmdyb3VwKCksIGdlbmVyYXRvcik7Ci0gICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgewotICAgICAgICAgIGdlbmVyYXRvci5QcmludCgifSAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IuT3V0ZGVudCgpOwotICAgICAgICAgIGdlbmVyYXRvci5QcmludCgifVxuIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlZjNkNGE4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDUxNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBqc2Nob3JyQGdvb2dsZS5jb20gKEpvc2VwaCBTY2hvcnIpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBVdGlsaXRpZXMgZm9yIHByaW50aW5nIGFuZCBwYXJzaW5nIHByb3RvY29sIG1lc3NhZ2VzIGluIGEgaHVtYW4tcmVhZGFibGUsCi0vLyB0ZXh0LWJhc2VkIGZvcm1hdC4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVEVYVF9GT1JNQVRfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9URVhUX0ZPUk1BVF9IX18KLQotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxtZW1vcnk+Ci0jaWZuZGVmIF9TSEFSRURfUFRSX0gKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgotI2VuZGlmCi0jaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPHZlY3Rvcj4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotbmFtZXNwYWNlIGlvIHsKLSAgY2xhc3MgRXJyb3JDb2xsZWN0b3I7ICAgICAgLy8gdG9rZW5pemVyLmgKLX0KLQotLy8gVGhpcyBjbGFzcyBpbXBsZW1lbnRzIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdC4gIFByaW50aW5nIGFuZCBwYXJzaW5nCi0vLyBwcm90b2NvbCBtZXNzYWdlcyBpbiB0ZXh0IGZvcm1hdCBpcyB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQgaHVtYW4gZWRpdGluZwotLy8gb2YgbWVzc2FnZXMuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyByZWFsbHkgYSBuYW1lc3BhY2UgdGhhdCBjb250YWlucyBvbmx5IHN0YXRpYyBtZXRob2RzLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFRleHRGb3JtYXQgewotIHB1YmxpYzoKLSAgLy8gT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIGdpdmVuIG1lc3NhZ2UgdG8gdGhlIGdpdmVuCi0gIC8vIG91dHB1dCBzdHJlYW0uCi0gIHN0YXRpYyBib29sIFByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0KTsKLQotICAvLyBQcmludCB0aGUgZmllbGRzIGluIGFuIFVua25vd25GaWVsZFNldC4gIFRoZXkgYXJlIHByaW50ZWQgYnkgdGFnIG51bWJlcgotICAvLyBvbmx5LiAgRW1iZWRkZWQgbWVzc2FnZXMgYXJlIGhldXJpc3RpY2FsbHkgaWRlbnRpZmllZCBieSBhdHRlbXB0aW5nIHRvCi0gIC8vIHBhcnNlIHRoZW0uCi0gIHN0YXRpYyBib29sIFByaW50VW5rbm93bkZpZWxkcyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotCi0gIC8vIExpa2UgUHJpbnQoKSwgYnV0IG91dHB1dHMgZGlyZWN0bHkgdG8gYSBzdHJpbmcuCi0gIHN0YXRpYyBib29sIFByaW50VG9TdHJpbmcoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgc3RyaW5nKiBvdXRwdXQpOwotCi0gIC8vIExpa2UgUHJpbnRVbmtub3duRmllbGRzKCksIGJ1dCBvdXRwdXRzIGRpcmVjdGx5IHRvIGEgc3RyaW5nLgotICBzdGF0aWMgYm9vbCBQcmludFVua25vd25GaWVsZHNUb1N0cmluZyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIG91dHB1dCk7Ci0KLSAgLy8gT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZCBzdXBwbGllZCBvbgotICAvLyB0aGUgbWVzc2FnZSBzdXBwbGllZC4gRm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMsIGFuIGluZGV4IG9mIC0xIG11c3QKLSAgLy8gYmUgc3VwcGxpZWQuIE5vdGUgdGhhdCB0aGlzIG1ldGhvZCB3aWxsIHByaW50IHRoZSBkZWZhdWx0IHZhbHVlIGZvciBhCi0gIC8vIGZpZWxkIGlmIGl0IGlzIG5vdCBzZXQuCi0gIHN0YXRpYyB2b2lkIFByaW50RmllbGRWYWx1ZVRvU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRwdXQpOwotCi0gIC8vIFRoZSBkZWZhdWx0IHByaW50ZXIgdGhhdCBjb252ZXJ0cyBzY2FsYXIgdmFsdWVzIGZyb20gZmllbGRzIGludG8KLSAgLy8gdGhlaXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgotICAvLyBZb3UgY2FuIGRlcml2ZSBmcm9tIHRoaXMgRmllbGRWYWx1ZVByaW50ZXIgaWYgeW91IHdhbnQgdG8gaGF2ZQotICAvLyBmaWVsZHMgdG8gYmUgcHJpbnRlZCBpbiBhIGRpZmZlcmVudCB3YXkgYW5kIHJlZ2lzdGVyIGl0IGF0IHRoZQotICAvLyBQcmludGVyLgotICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmllbGRWYWx1ZVByaW50ZXIgewotICAgcHVibGljOgotICAgIEZpZWxkVmFsdWVQcmludGVyKCk7Ci0gICAgdmlydHVhbCB+RmllbGRWYWx1ZVByaW50ZXIoKTsKLSAgICB2aXJ0dWFsIHN0cmluZyBQcmludEJvb2woYm9vbCB2YWwpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RyaW5nIFByaW50SW50MzIoaW50MzIgdmFsKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0cmluZyBQcmludFVJbnQzMih1aW50MzIgdmFsKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0cmluZyBQcmludEludDY0KGludDY0IHZhbCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdHJpbmcgUHJpbnRVSW50NjQodWludDY0IHZhbCkgY29uc3Q7Ci0gICAgdmlydHVhbCBzdHJpbmcgUHJpbnRGbG9hdChmbG9hdCB2YWwpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RyaW5nIFByaW50RG91YmxlKGRvdWJsZSB2YWwpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RyaW5nIFByaW50U3RyaW5nKGNvbnN0IHN0cmluZyYgdmFsKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0cmluZyBQcmludEJ5dGVzKGNvbnN0IHN0cmluZyYgdmFsKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0cmluZyBQcmludEVudW0oaW50MzIgdmFsLCBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotICAgIHZpcnR1YWwgc3RyaW5nIFByaW50RmllbGROYW1lKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0cmluZyBQcmludE1lc3NhZ2VTdGFydChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlKSBjb25zdDsKLSAgICB2aXJ0dWFsIHN0cmluZyBQcmludE1lc3NhZ2VFbmQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2luZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfY291bnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkVmFsdWVQcmludGVyKTsKLSAgfTsKLQotICAvLyBDbGFzcyBmb3IgdGhvc2UgdXNlcnMgd2hpY2ggcmVxdWlyZSBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgaG93Ci0gIC8vIGEgcHJvdG9idWZmZXIgbWVzc2FnZSBpcyBwcmludGVkIG91dC4KLSAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFByaW50ZXIgewotICAgcHVibGljOgotICAgIFByaW50ZXIoKTsKLSAgICB+UHJpbnRlcigpOwotCi0gICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQcmludAotICAgIGJvb2wgUHJpbnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OwotICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnRVbmtub3duRmllbGRzCi0gICAgYm9vbCBQcmludFVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nCi0gICAgYm9vbCBQcmludFRvU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIHN0cmluZyogb3V0cHV0KSBjb25zdDsKLSAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nCi0gICAgYm9vbCBQcmludFVua25vd25GaWVsZHNUb1N0cmluZyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRwdXQpIGNvbnN0OwotICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UHJpbnRGaWVsZFZhbHVlVG9TdHJpbmcKLSAgICB2b2lkIFByaW50RmllbGRWYWx1ZVRvU3RyaW5nKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRwdXQpIGNvbnN0OwotCi0gICAgLy8gQWRqdXN0IHRoZSBpbml0aWFsIGluZGVudCBsZXZlbCBvZiBhbGwgb3V0cHV0LiAgRWFjaCBpbmRlbnQgbGV2ZWwgaXMKLSAgICAvLyBlcXVhbCB0byB0d28gc3BhY2VzLgotICAgIHZvaWQgU2V0SW5pdGlhbEluZGVudExldmVsKGludCBpbmRlbnRfbGV2ZWwpIHsKLSAgICAgIGluaXRpYWxfaW5kZW50X2xldmVsXyA9IGluZGVudF9sZXZlbDsKLSAgICB9Ci0KLSAgICAvLyBJZiBwcmludGluZyBpbiBzaW5nbGUgbGluZSBtb2RlLCB0aGVuIHRoZSBlbnRpcmUgbWVzc2FnZSB3aWxsIGJlIG91dHB1dAotICAgIC8vIG9uIGEgc2luZ2xlIGxpbmUgd2l0aCBubyBsaW5lIGJyZWFrcy4KLSAgICB2b2lkIFNldFNpbmdsZUxpbmVNb2RlKGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgewotICAgICAgc2luZ2xlX2xpbmVfbW9kZV8gPSBzaW5nbGVfbGluZV9tb2RlOwotICAgIH0KLQotICAgIGJvb2wgSXNJblNpbmdsZUxpbmVNb2RlKCkgewotICAgICAgcmV0dXJuIHNpbmdsZV9saW5lX21vZGVfOwotICAgIH0KLQotICAgIC8vIElmIHVzZV9maWVsZF9udW1iZXIgaXMgdHJ1ZSwgdXNlcyBmaWVsZCBudW1iZXIgaW5zdGVhZCBvZiBmaWVsZCBuYW1lLgotICAgIHZvaWQgU2V0VXNlRmllbGROdW1iZXIoYm9vbCB1c2VfZmllbGRfbnVtYmVyKSB7Ci0gICAgICB1c2VfZmllbGRfbnVtYmVyXyA9IHVzZV9maWVsZF9udW1iZXI7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRydWUgdG8gcHJpbnQgcmVwZWF0ZWQgcHJpbWl0aXZlcyBpbiBhIGZvcm1hdCBsaWtlOgotICAgIC8vICAgZmllbGRfbmFtZTogWzEsIDIsIDMsIDRdCi0gICAgLy8gaW5zdGVhZCBvZiBwcmludGluZyBlYWNoIHZhbHVlIG9uIGl0cyBvd24gbGluZS4gIFNob3J0IGZvcm1hdCBhcHBsaWVzCi0gICAgLy8gb25seSB0byBwcmltaXRpdmUgdmFsdWVzIC0tIGkuZS4gZXZlcnl0aGluZyBleGNlcHQgc3RyaW5ncyBhbmQKLSAgICAvLyBzdWItbWVzc2FnZXMvZ3JvdXBzLgotICAgIHZvaWQgU2V0VXNlU2hvcnRSZXBlYXRlZFByaW1pdGl2ZXMoYm9vbCB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlcykgewotICAgICAgdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXNfID0gdXNlX3Nob3J0X3JlcGVhdGVkX3ByaW1pdGl2ZXM7Ci0gICAgfQotCi0gICAgLy8gU2V0IHRydWUgdG8gb3V0cHV0IFVURi04IGluc3RlYWQgb2YgQVNDSUkuICBUaGUgb25seSBkaWZmZXJlbmNlCi0gICAgLy8gaXMgdGhhdCBieXRlcyA+PSAweDgwIGluIHN0cmluZyBmaWVsZHMgd2lsbCBub3QgYmUgZXNjYXBlZCwKLSAgICAvLyBiZWNhdXNlIHRoZXkgYXJlIGFzc3VtZWQgdG8gYmUgcGFydCBvZiBVVEYtOCBtdWx0aS1ieXRlCi0gICAgLy8gc2VxdWVuY2VzLiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBkZWZhdWx0IEZpZWxkVmFsdWVQcmludGVyLgotICAgIHZvaWQgU2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKGJvb2wgYXNfdXRmOCk7Ci0KLSAgICAvLyBTZXQgdGhlIGRlZmF1bHQgRmllbGRWYWx1ZVByaW50ZXIgdGhhdCBpcyB1c2VkIGZvciBhbGwgZmllbGRzIHRoYXQKLSAgICAvLyBkb24ndCBoYXZlIGEgZmllbGQtc3BlY2lmaWMgcHJpbnRlciByZWdpc3RlcmVkLgotICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgcHJpbnRlci4KLSAgICB2b2lkIFNldERlZmF1bHRGaWVsZFZhbHVlUHJpbnRlcihjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcik7Ci0KLSAgICAvLyBTZXRzIHdoZXRoZXIgd2Ugd2FudCB0byBoaWRlIHVua25vd24gZmllbGRzIG9yIG5vdC4KLSAgICAvLyBVc3VhbGx5IHVua25vd24gZmllbGRzIGFyZSBwcmludGVkIGluIGEgZ2VuZXJpYyB3YXkgdGhhdCBpbmNsdWRlcyB0aGUKLSAgICAvLyB0YWcgbnVtYmVyIG9mIHRoZSBmaWVsZCBpbnN0ZWFkIG9mIGZpZWxkIG5hbWUuIEhvd2V2ZXIsIHNvbWV0aW1lcyBpdAotICAgIC8vIGlzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIHByaW50IHRoZSBtZXNzYWdlIHdpdGhvdXQgdW5rbm93biBmaWVsZHMgKGUuZy4KLSAgICAvLyBmb3IgdGhlIHB5dGhvbiBwcm90b2J1ZiB2ZXJzaW9uIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IGJldHdlZW4gaXRzIHB1cmUKLSAgICAvLyBweXRob24gYW5kIGMrKyBpbXBsZW1lbnRhdGlvbnMpLgotICAgIHZvaWQgU2V0SGlkZVVua25vd25GaWVsZHMoYm9vbCBoaWRlKSB7Ci0gICAgICBoaWRlX3Vua25vd25fZmllbGRzXyA9IGhpZGU7Ci0gICAgfQotCi0gICAgLy8gSWYgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXIgaXMgdHJ1ZSwgcHJpbnQgZmllbGRzIG9mIGEgcHJvdG8KLSAgICAvLyBtZXNzYWdlIHVzaW5nIHRoZSBvcmRlciBkZWZpbmVkIGluIHNvdXJjZSBjb2RlIGluc3RlYWQgb2YgdGhlIGZpZWxkCi0gICAgLy8gbnVtYmVyLiBCeSBkZWZhdWx0LCB1c2UgdGhlIGZpZWxkIG51bWJlciBvcmRlci4KLSAgICB2b2lkIFNldFByaW50TWVzc2FnZUZpZWxkc0luSW5kZXhPcmRlcigKLSAgICAgICAgYm9vbCBwcmludF9tZXNzYWdlX2ZpZWxkc19pbl9pbmRleF9vcmRlcikgewotICAgICAgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXJfID0KLSAgICAgICAgICBwcmludF9tZXNzYWdlX2ZpZWxkc19pbl9pbmRleF9vcmRlcjsKLSAgICB9Ci0KLSAgICAvLyBJZiBleHBhbmQ9PXRydWUsIGV4cGFuZCBnb29nbGUucHJvdG9idWYuQW55IHBheWxvYWRzLiBUaGUgb3V0cHV0Ci0gICAgLy8gd2lsbCBiZSBvZiBmb3JtCi0gICAgLy8gICAgW3R5cGVfdXJsXSB7IDx2YWx1ZV9wcmludGVkX2luX3RleHQ+IH0KLSAgICAvLwotICAgIC8vIElmIGV4cGFuZD09ZmFsc2UsIHByaW50IEFueSB1c2luZyB0aGUgZGVmYXVsdCBwcmludGVyLiBUaGUgb3V0cHV0IHdpbGwKLSAgICAvLyBsb29rIGxpa2UKLSAgICAvLyAgICB0eXBlX3VybDogIjx0eXBlX3VybD4iICB2YWx1ZTogInNlcmlhbGl6ZWRfY29udGVudCIKLSAgICB2b2lkIFNldEV4cGFuZEFueShib29sIGV4cGFuZCkgewotICAgICAgZXhwYW5kX2FueV8gPSBleHBhbmQ7Ci0gICAgfQotCi0gICAgLy8gSWYgbm9uLXplcm8sIHdlIHRydW5jYXRlIGFsbCBzdHJpbmcgZmllbGRzIHRoYXQgYXJlICBsb25nZXIgdGhhbiB0aGlzCi0gICAgLy8gdGhyZXNob2xkLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgcHJvdG8gbWVzc2FnZSBoYXMgdmVyeSBsb25nIHN0cmluZ3MsCi0gICAgLy8gZS5nLiwgZHVtcCBvZiBlbmNvZGVkIGltYWdlIGZpbGUuCi0gICAgLy8KLSAgICAvLyBOT1RFKGhmZ29uZyk6ICBTZXR0aW5nIGEgbm9uLXplcm8gdmFsdWUgYnJlYWtzIHJvdW5kLXRyaXAgc2FmZQotICAgIC8vIHByb3BlcnR5IG9mIFRleHRGb3JtYXQ6OlByaW50ZXIuICBUaGF0IGlzLCBmcm9tIHRoZSBwcmludGVkIG1lc3NhZ2UsIHdlCi0gICAgLy8gY2Fubm90IGZ1bGx5IHJlY292ZXIgdGhlIG9yaWdpbmFsIHN0cmluZyBmaWVsZCBhbnkgbW9yZS4KLSAgICB2b2lkIFNldFRydW5jYXRlU3RyaW5nRmllbGRMb25nZXJUaGFuKAotICAgICAgICBjb25zdCBpbnQ2NCB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW4pIHsKLSAgICAgIHRydW5jYXRlX3N0cmluZ19maWVsZF9sb25nZXJfdGhhbl8gPSB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW47Ci0gICAgfQotCi0gICAgLy8gUmVnaXN0ZXIgYSBjdXN0b20gZmllbGQtc3BlY2lmaWMgRmllbGRWYWx1ZVByaW50ZXIgZm9yIGZpZWxkcwotICAgIC8vIHdpdGggYSBwYXJ0aWN1bGFyIEZpZWxkRGVzY3JpcHRvci4KLSAgICAvLyBSZXR1cm5zICJ0cnVlIiBpZiB0aGUgcmVnaXN0cmF0aW9uIHN1Y2NlZWRlZCwgb3IgImZhbHNlIiwgaWYgdGhlcmUgaXMKLSAgICAvLyBhbHJlYWR5IGEgcHJpbnRlciBmb3IgdGhhdCBGaWVsZERlc2NyaXB0b3IuCi0gICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBwcmludGVyIG9uIHN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uLgotICAgIGJvb2wgUmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcik7Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHByaW50IHRoZSB0ZXh0Ci0gICAgLy8gb3V0cHV0IHRvIHRoZSBPdXRwdXRTdHJlYW0gKHNlZSB0ZXh0X2Zvcm1hdC5jYyBmb3IgaW1wbGVtZW50YXRpb24pLgotICAgIGNsYXNzIFRleHRHZW5lcmF0b3I7Ci0KLSAgICAvLyBJbnRlcm5hbCBQcmludCBtZXRob2QsIHVzZWQgZm9yIHdyaXRpbmcgdG8gdGhlIE91dHB1dFN0cmVhbSB2aWEKLSAgICAvLyB0aGUgVGV4dEdlbmVyYXRvciBjbGFzcy4KLSAgICB2b2lkIFByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0OwotCi0gICAgLy8gUHJpbnQgYSBzaW5nbGUgZmllbGQuCi0gICAgdm9pZCBQcmludEZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7Ci0KLSAgICAvLyBQcmludCBhIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZCBpbiBzaG9ydCBmb3JtLgotICAgIHZvaWQgUHJpbnRTaG9ydFJlcGVhdGVkRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdDsKLQotICAgIC8vIFByaW50IHRoZSBuYW1lIG9mIGEgZmllbGQgLS0gaS5lLiBldmVyeXRoaW5nIHRoYXQgY29tZXMgYmVmb3JlIHRoZQotICAgIC8vICc6JyBmb3IgYSBzaW5nbGUgbmFtZS92YWx1ZSBwYWlyLgotICAgIHZvaWQgUHJpbnRGaWVsZE5hbWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEdlbmVyYXRvciYgZ2VuZXJhdG9yKSBjb25zdDsKLQotICAgIC8vIE91dHB1dHMgYSB0ZXh0dWFsIHJlcHJlc2VudGF0aW9uIG9mIHRoZSB2YWx1ZSBvZiB0aGUgZmllbGQgc3VwcGxpZWQgb24KLSAgICAvLyB0aGUgbWVzc2FnZSBzdXBwbGllZCBvciB0aGUgZGVmYXVsdCB2YWx1ZSBpZiBub3Qgc2V0LgotICAgIHZvaWQgUHJpbnRGaWVsZFZhbHVlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0OwotCi0gICAgLy8gUHJpbnQgdGhlIGZpZWxkcyBpbiBhbiBVbmtub3duRmllbGRTZXQuICBUaGV5IGFyZSBwcmludGVkIGJ5IHRhZyBudW1iZXIKLSAgICAvLyBvbmx5LiAgRW1iZWRkZWQgbWVzc2FnZXMgYXJlIGhldXJpc3RpY2FsbHkgaWRlbnRpZmllZCBieSBhdHRlbXB0aW5nIHRvCi0gICAgLy8gcGFyc2UgdGhlbS4KLSAgICB2b2lkIFByaW50VW5rbm93bkZpZWxkcyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7Ci0KLSAgICBib29sIFByaW50QW55KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7Ci0KLSAgICBpbnQgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfOwotCi0gICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlXzsKLQotICAgIGJvb2wgdXNlX2ZpZWxkX251bWJlcl87Ci0KLSAgICBib29sIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzXzsKLQotICAgIGJvb2wgaGlkZV91bmtub3duX2ZpZWxkc187Ci0KLSAgICBib29sIHByaW50X21lc3NhZ2VfZmllbGRzX2luX2luZGV4X29yZGVyXzsKLQotICAgIGJvb2wgZXhwYW5kX2FueV87Ci0KLSAgICBpbnQ2NCB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fOwotCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxjb25zdCBGaWVsZFZhbHVlUHJpbnRlcj4gZGVmYXVsdF9maWVsZF92YWx1ZV9wcmludGVyXzsKLSAgICB0eXBlZGVmIG1hcDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLAotICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKj4gQ3VzdG9tUHJpbnRlck1hcDsKLSAgICBDdXN0b21QcmludGVyTWFwIGN1c3RvbV9wcmludGVyc187Ci0gIH07Ci0KLSAgLy8gUGFyc2VzIGEgdGV4dC1mb3JtYXQgcHJvdG9jb2wgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8KLSAgLy8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LiBUaGlzIGZ1bmN0aW9uIHBhcnNlcyB0aGUgaHVtYW4tcmVhZGFibGUgZm9ybWF0Ci0gIC8vIHdyaXR0ZW4gYnkgUHJpbnQoKS4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuIFRoZSBtZXNzYWdlIGlzIGNsZWFyZWQgZmlyc3QsCi0gIC8vIGV2ZW4gaWYgdGhlIGZ1bmN0aW9uIGZhaWxzIC0tIFNlZSBNZXJnZSgpIHRvIGF2b2lkIHRoaXMgYmVoYXZpb3IuCi0gIC8vCi0gIC8vIEV4YW1wbGUgaW5wdXQ6ICJ1c2VyIHtcbiBpZDogMTIzIGV4dHJhIHsgZ2VuZGVyOiBNQUxFIGxhbmd1YWdlOiAnZW4nIH1cbn0iCi0gIC8vCi0gIC8vIE9uZSB1c2UgZm9yIHRoaXMgZnVuY3Rpb24gaXMgcGFyc2luZyBoYW5kd3JpdHRlbiBzdHJpbmdzIGluIHRlc3QgY29kZS4KLSAgLy8gQW5vdGhlciB1c2UgaXMgdG8gcGFyc2UgdGhlIG91dHB1dCBmcm9tIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2U6OkRlYnVnU3RyaW5nKCkKLSAgLy8gKG9yIFNob3J0RGVidWdTdHJpbmcoKSksIGJlY2F1c2UgdGhlc2UgZnVuY3Rpb25zIG91dHB1dCB1c2luZwotICAvLyBnb29nbGU6OnByb3RvYnVmOjpUZXh0Rm9ybWF0OjpQcmludCgpLgotICAvLwotICAvLyBJZiB5b3Ugd291bGQgbGlrZSB0byByZWFkIGEgcHJvdG9jb2wgYnVmZmVyIHNlcmlhbGl6ZWQgaW4gdGhlCi0gIC8vIChub24taHVtYW4tcmVhZGFibGUpIGJpbmFyeSB3aXJlIGZvcm1hdCwgc2VlCi0gIC8vIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlOjpQYXJzZUZyb21TdHJpbmcoKS4KLSAgc3RhdGljIGJvb2wgUGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOwotICAvLyBMaWtlIFBhcnNlKCksIGJ1dCByZWFkcyBkaXJlY3RseSBmcm9tIGEgc3RyaW5nLgotICBzdGF0aWMgYm9vbCBQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKLQotICAvLyBMaWtlIFBhcnNlKCksIGJ1dCB0aGUgZGF0YSBpcyBtZXJnZWQgaW50byB0aGUgZ2l2ZW4gbWVzc2FnZSwgYXMgaWYKLSAgLy8gdXNpbmcgTWVzc2FnZTo6TWVyZ2VGcm9tKCkuCi0gIHN0YXRpYyBib29sIE1lcmdlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKLSAgLy8gTGlrZSBNZXJnZSgpLCBidXQgcmVhZHMgZGlyZWN0bHkgZnJvbSBhIHN0cmluZy4KLSAgc3RhdGljIGJvb2wgTWVyZ2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7Ci0KLSAgLy8gUGFyc2UgdGhlIGdpdmVuIHRleHQgYXMgYSBzaW5nbGUgZmllbGQgdmFsdWUgYW5kIHN0b3JlIGl0IGludG8gdGhlCi0gIC8vIGdpdmVuIGZpZWxkIG9mIHRoZSBnaXZlbiBtZXNzYWdlLiBJZiB0aGUgZmllbGQgaXMgYSByZXBlYXRlZCBmaWVsZCwKLSAgLy8gdGhlIG5ldyB2YWx1ZSB3aWxsIGJlIGFkZGVkIHRvIHRoZSBlbmQKLSAgc3RhdGljIGJvb2wgUGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSk7Ci0KLSAgLy8gSW50ZXJmYWNlIHRoYXQgVGV4dEZvcm1hdDo6UGFyc2VyIGNhbiB1c2UgdG8gZmluZCBleHRlbnNpb25zLgotICAvLyBUaGlzIGNsYXNzIG1heSBiZSBleHRlbmRlZCBpbiB0aGUgZnV0dXJlIHRvIGZpbmQgbW9yZSBpbmZvcm1hdGlvbgotICAvLyBsaWtlIGZpZWxkcywgZXRjLgotICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmluZGVyIHsKLSAgIHB1YmxpYzoKLSAgICB2aXJ0dWFsIH5GaW5kZXIoKTsKLQotICAgIC8vIFRyeSB0byBmaW5kIGFuIGV4dGVuc2lvbiBvZiAqbWVzc2FnZSBieSBmdWxseS1xdWFsaWZpZWQgZmllbGQKLSAgICAvLyBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vIGV4dGVuc2lvbiBpcyBrbm93biBmb3IgdGhpcyBuYW1lIG9yIG51bWJlci4KLSAgICB2aXJ0dWFsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbigKLSAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCA9IDA7Ci0gIH07Ci0KLSAgLy8gQSBsb2NhdGlvbiBpbiB0aGUgcGFyc2VkIHRleHQuCi0gIHN0cnVjdCBQYXJzZUxvY2F0aW9uIHsKLSAgICBpbnQgbGluZTsKLSAgICBpbnQgY29sdW1uOwotCi0gICAgUGFyc2VMb2NhdGlvbigpIDogbGluZSgtMSksIGNvbHVtbigtMSkge30KLSAgICBQYXJzZUxvY2F0aW9uKGludCBsaW5lX3BhcmFtLCBpbnQgY29sdW1uX3BhcmFtKQotICAgICAgICA6IGxpbmUobGluZV9wYXJhbSksIGNvbHVtbihjb2x1bW5fcGFyYW0pIHt9Ci0gIH07Ci0KLSAgLy8gRGF0YSBzdHJ1Y3R1cmUgd2hpY2ggaXMgcG9wdWxhdGVkIHdpdGggdGhlIGxvY2F0aW9ucyBvZiBlYWNoIGZpZWxkCi0gIC8vIHZhbHVlIHBhcnNlZCBmcm9tIHRoZSB0ZXh0LgotICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUGFyc2VJbmZvVHJlZSB7Ci0gICBwdWJsaWM6Ci0gICAgUGFyc2VJbmZvVHJlZSgpOwotICAgIH5QYXJzZUluZm9UcmVlKCk7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBwYXJzZSBsb2NhdGlvbiBmb3IgaW5kZXgtdGggdmFsdWUgb2YgdGhlIGZpZWxkIGluIHRoZSBwYXJzZWQKLSAgICAvLyB0ZXh0LiBJZiBub25lIGV4aXN0cywgcmV0dXJucyBhIGxvY2F0aW9uIHdpdGggbGluZSA9IC0xLiBJbmRleCBzaG91bGQgYmUKLSAgICAvLyAtMSBmb3Igbm90LXJlcGVhdGVkIGZpZWxkcy4KLSAgICBQYXJzZUxvY2F0aW9uIEdldExvY2F0aW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgICAvLyBSZXR1cm5zIHRoZSBwYXJzZSBpbmZvIHRyZWUgZm9yIHRoZSBnaXZlbiBmaWVsZCwgd2hpY2ggbXVzdCBiZSBhIG1lc3NhZ2UKLSAgICAvLyB0eXBlLiBUaGUgbmVzdGVkIGluZm9ybWF0aW9uIHRyZWUgaXMgb3duZWQgYnkgdGhlIHJvb3QgdHJlZSBhbmQgd2lsbCBiZQotICAgIC8vIGRlbGV0ZWQgd2hlbiBpdCBpcyBkZWxldGVkLgotICAgIFBhcnNlSW5mb1RyZWUqIEdldFRyZWVGb3JOZXN0ZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgY29uc3Q7Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gQWxsb3cgdGhlIHRleHQgZm9ybWF0IHBhcnNlciB0byByZWNvcmQgaW5mb3JtYXRpb24gaW50byB0aGUgdHJlZS4KLSAgICBmcmllbmQgY2xhc3MgVGV4dEZvcm1hdDsKLQotICAgIC8vIFJlY29yZHMgdGhlIHN0YXJ0aW5nIGxvY2F0aW9uIG9mIGEgc2luZ2xlIHZhbHVlIGZvciBhIGZpZWxkLgotICAgIHZvaWQgUmVjb3JkTG9jYXRpb24oY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgUGFyc2VMb2NhdGlvbiBsb2NhdGlvbik7Ci0KLSAgICAvLyBDcmVhdGUgYW5kIHJlY29yZHMgYSBuZXN0ZWQgdHJlZSBmb3IgYSBuZXN0ZWQgbWVzc2FnZSBmaWVsZC4KLSAgICBQYXJzZUluZm9UcmVlKiBDcmVhdGVOZXN0ZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Ci0KLSAgICAvLyBEZWZpbmVzIHRoZSBtYXAgZnJvbSB0aGUgaW5kZXgtdGggZmllbGQgZGVzY3JpcHRvciB0byBpdHMgcGFyc2UgbG9jYXRpb24uCi0gICAgdHlwZWRlZiBtYXA8Y29uc3QgRmllbGREZXNjcmlwdG9yKiwgdmVjdG9yPFBhcnNlTG9jYXRpb24+ID4gTG9jYXRpb25NYXA7Ci0KLSAgICAvLyBEZWZpbmVzIHRoZSBtYXAgZnJvbSB0aGUgaW5kZXgtdGggZmllbGQgZGVzY3JpcHRvciB0byB0aGUgbmVzdGVkIHBhcnNlCi0gICAgLy8gaW5mbyB0cmVlLgotICAgIHR5cGVkZWYgbWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosIHZlY3RvcjxQYXJzZUluZm9UcmVlKj4gPiBOZXN0ZWRNYXA7Ci0KLSAgICBMb2NhdGlvbk1hcCBsb2NhdGlvbnNfOwotICAgIE5lc3RlZE1hcCBuZXN0ZWRfOwotCi0gICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlSW5mb1RyZWUpOwotICB9OwotCi0gIC8vIEZvciBtb3JlIGNvbnRyb2wgb3ZlciBwYXJzaW5nLCB1c2UgdGhpcyBjbGFzcy4KLSAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFBhcnNlciB7Ci0gICBwdWJsaWM6Ci0gICAgUGFyc2VyKCk7Ci0gICAgflBhcnNlcigpOwotCi0gICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQYXJzZSgpLgotICAgIGJvb2wgUGFyc2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOwotICAgIC8vIExpa2UgVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCkuCi0gICAgYm9vbCBQYXJzZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKLSAgICAvLyBMaWtlIFRleHRGb3JtYXQ6Ok1lcmdlKCkuCi0gICAgYm9vbCBNZXJnZShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7Ci0gICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoKS4KLSAgICBib29sIE1lcmdlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGlucHV0LCBNZXNzYWdlKiBvdXRwdXQpOwotCi0gICAgLy8gU2V0IHdoZXJlIHRvIHJlcG9ydCBwYXJzZSBlcnJvcnMuICBJZiBOVUxMICh0aGUgZGVmYXVsdCksIGVycm9ycyB3aWxsCi0gICAgLy8gYmUgcHJpbnRlZCB0byBzdGRlcnIuCi0gICAgdm9pZCBSZWNvcmRFcnJvcnNUbyhpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvcikgewotICAgICAgZXJyb3JfY29sbGVjdG9yXyA9IGVycm9yX2NvbGxlY3RvcjsKLSAgICB9Ci0KLSAgICAvLyBTZXQgaG93IHBhcnNlciBmaW5kcyBleHRlbnNpb25zLiAgSWYgTlVMTCAodGhlIGRlZmF1bHQpLCB0aGUKLSAgICAvLyBwYXJzZXIgd2lsbCB1c2UgdGhlIHN0YW5kYXJkIFJlZmxlY3Rpb24gb2JqZWN0IGFzc29jaWF0ZWQgd2l0aAotICAgIC8vIHRoZSBtZXNzYWdlIGJlaW5nIHBhcnNlZC4KLSAgICB2b2lkIFNldEZpbmRlcihGaW5kZXIqIGZpbmRlcikgewotICAgICAgZmluZGVyXyA9IGZpbmRlcjsKLSAgICB9Ci0KLSAgICAvLyBTZXRzIHdoZXJlIGxvY2F0aW9uIGluZm9ybWF0aW9uIGFib3V0IHRoZSBwYXJzZSB3aWxsIGJlIHdyaXR0ZW4uIElmIE5VTEwKLSAgICAvLyAodGhlIGRlZmF1bHQpLCB0aGVuIG5vIGxvY2F0aW9uIHdpbGwgYmUgd3JpdHRlbi4KLSAgICB2b2lkIFdyaXRlTG9jYXRpb25zVG8oUGFyc2VJbmZvVHJlZSogdHJlZSkgewotICAgICAgcGFyc2VfaW5mb190cmVlXyA9IHRyZWU7Ci0gICAgfQotCi0gICAgLy8gTm9ybWFsbHkgcGFyc2luZyBmYWlscyBpZiwgYWZ0ZXIgcGFyc2luZywgb3V0cHV0LT5Jc0luaXRpYWxpemVkKCkKLSAgICAvLyByZXR1cm5zIGZhbHNlLiAgQ2FsbCBBbGxvd1BhcnRpYWxNZXNzYWdlKHRydWUpIHRvIHNraXAgdGhpcyBjaGVjay4KLSAgICB2b2lkIEFsbG93UGFydGlhbE1lc3NhZ2UoYm9vbCBhbGxvdykgewotICAgICAgYWxsb3dfcGFydGlhbF8gPSBhbGxvdzsKLSAgICB9Ci0KLSAgICAvLyBBbGxvdyBmaWVsZCBuYW1lcyB0byBiZSBtYXRjaGVkIGNhc2UtaW5zZW5zaXRpdmVseS4KLSAgICAvLyBUaGlzIGlzIG5vdCBhZHZpc2FibGUgaWYgdGhlcmUgYXJlIGZpZWxkcyB0aGF0IG9ubHkgZGlmZmVyIGluIGNhc2UsIG9yCi0gICAgLy8gaWYgeW91IHdhbnQgdG8gZW5mb3JjZSB3cml0aW5nIGluIHRoZSBjYW5vbmljYWwgZm9ybS4KLSAgICAvLyBUaGlzIGlzICdmYWxzZScgYnkgZGVmYXVsdC4KLSAgICB2b2lkIEFsbG93Q2FzZUluc2Vuc2l0aXZlRmllbGQoYm9vbCBhbGxvdykgewotICAgICAgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF8gPSBhbGxvdzsKLSAgICB9Ci0KLSAgICAvLyBMaWtlIFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcKLSAgICBib29sIFBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoY29uc3Qgc3RyaW5nJiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0KTsKLQotCi0gICAgdm9pZCBBbGxvd0ZpZWxkTnVtYmVyKGJvb2wgYWxsb3cpIHsKLSAgICAgIGFsbG93X2ZpZWxkX251bWJlcl8gPSBhbGxvdzsKLSAgICB9Ci0KLSAgIHByaXZhdGU6Ci0gICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHBhcnNlIHRleHQKLSAgICAvLyByZXByZXNlbnRhdGlvbnMgKHNlZSB0ZXh0X2Zvcm1hdC5jYyBmb3IgaW1wbGVtZW50YXRpb24pLgotICAgIGNsYXNzIFBhcnNlckltcGw7Ci0KLSAgICAvLyBMaWtlIFRleHRGb3JtYXQ6Ok1lcmdlKCkuICBUaGUgcHJvdmlkZWQgaW1wbGVtZW50YXRpb24gaXMgdXNlZAotICAgIC8vIHRvIGRvIHRoZSBwYXJzaW5nLgotICAgIGJvb2wgTWVyZ2VVc2luZ0ltcGwoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogb3V0cHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VySW1wbCogcGFyc2VyX2ltcGwpOwotCi0gICAgaW86OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3JfOwotICAgIEZpbmRlciogZmluZGVyXzsKLSAgICBQYXJzZUluZm9UcmVlKiBwYXJzZV9pbmZvX3RyZWVfOwotICAgIGJvb2wgYWxsb3dfcGFydGlhbF87Ci0gICAgYm9vbCBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXzsKLSAgICBib29sIGFsbG93X3Vua25vd25fZmllbGRfOwotICAgIGJvb2wgYWxsb3dfdW5rbm93bl9lbnVtXzsKLSAgICBib29sIGFsbG93X2ZpZWxkX251bWJlcl87Ci0gICAgYm9vbCBhbGxvd19yZWxheGVkX3doaXRlc3BhY2VfOwotICAgIGJvb2wgYWxsb3dfc2luZ3VsYXJfb3ZlcndyaXRlc187Ci0gIH07Ci0KLQotIHByaXZhdGU6Ci0gIC8vIEhhY2s6IFBhcnNlSW5mb1RyZWUgZGVjbGFyZXMgVGV4dEZvcm1hdCBhcyBhIGZyaWVuZCB3aGljaCBzaG91bGQgZXh0ZW5kCi0gIC8vIHRoZSBmcmllbmRzaGlwIHRvIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VySW1wbCwgYnV0IHVuZm9ydHVuYXRlbHkgc29tZQotICAvLyBvbGQgY29tcGlsZXJzIChlLmcuIEdDQyAzLjQuNikgZG9uJ3QgaW1wbGVtZW50IHRoaXMgY29ycmVjdGx5LiBXZSBwcm92aWRlCi0gIC8vIGhlbHBlcnMgZm9yIFBhcnNlckltcGwgdG8gY2FsbCBtZXRob2RzIG9mIFBhcnNlSW5mb1RyZWUuCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBSZWNvcmRMb2NhdGlvbihQYXJzZUluZm9UcmVlKiBpbmZvX3RyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VMb2NhdGlvbiBsb2NhdGlvbik7Ci0gIHN0YXRpYyBpbmxpbmUgUGFyc2VJbmZvVHJlZSogQ3JlYXRlTmVzdGVkKFBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRleHRGb3JtYXQpOwotfTsKLQotaW5saW5lIHZvaWQgVGV4dEZvcm1hdDo6UmVjb3JkTG9jYXRpb24oUGFyc2VJbmZvVHJlZSogaW5mb190cmVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNlTG9jYXRpb24gbG9jYXRpb24pIHsKLSAgaW5mb190cmVlLT5SZWNvcmRMb2NhdGlvbihmaWVsZCwgbG9jYXRpb24pOwotfQotCi0KLWlubGluZSBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKiBUZXh0Rm9ybWF0OjpDcmVhdGVOZXN0ZWQoCi0gICAgUGFyc2VJbmZvVHJlZSogaW5mb190cmVlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHJldHVybiBpbmZvX3RyZWUtPkNyZWF0ZU5lc3RlZChmaWVsZCk7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9URVhUX0ZPUk1BVF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1OGFhM2Y4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxNDg0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGpzY2hvcnJAZ29vZ2xlLmNvbSAoSm9zZXBoIFNjaG9ycikKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+Ci0KLSNpbmNsdWRlIDxtYXRoLmg+Ci0jaW5jbHVkZSA8c3RkbGliLmg+Ci0jaW5jbHVkZSA8bGltaXRzPgotI2luY2x1ZGUgPG1lbW9yeT4KLSNpZm5kZWYgX1NIQVJFRF9QVFJfSAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmg+Ci0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0vLyBDYW4ndCB1c2UgYW4gYW5vbnltb3VzIG5hbWVzcGFjZSBoZXJlIGR1ZSB0byBicm9rZW5uZXNzIG9mIFRydTY0IGNvbXBpbGVyLgotbmFtZXNwYWNlIHRleHRfZm9ybWF0X3VuaXR0ZXN0IHsKLQotLy8gQSBiYXNpYyBzdHJpbmcgd2l0aCBkaWZmZXJlbnQgZXNjYXBhYmxlIGNoYXJhY3RlcnMgZm9yIHRlc3RpbmcuCi1jb25zdCBzdHJpbmcga0VzY2FwZVRlc3RTdHJpbmcgPQotICAiXCJBIHN0cmluZyB3aXRoICcgY2hhcmFjdGVycyBcbiBhbmQgXHIgbmV3bGluZXMgYW5kIFx0IHRhYnMgYW5kIFwwMDEgIgotICAic2xhc2hlcyBcXCBhbmQgIG11bHRpcGxlICAgc3BhY2VzIjsKLQotLy8gQSByZXByZXNlbnRhdGlvbiBvZiB0aGUgYWJvdmUgc3RyaW5nIHdpdGggYWxsIHRoZSBjaGFyYWN0ZXJzIGVzY2FwZWQuCi1jb25zdCBzdHJpbmcga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkID0KLSAgIlwiXFxcIkEgc3RyaW5nIHdpdGggXFwnIGNoYXJhY3RlcnMgXFxuIGFuZCBcXHIgbmV3bGluZXMgIgotICAiYW5kIFxcdCB0YWJzIGFuZCBcXDAwMSBzbGFzaGVzIFxcXFwgYW5kICBtdWx0aXBsZSAgIHNwYWNlc1wiIjsKLQotY2xhc3MgVGV4dEZvcm1hdFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHVibGljOgotICBzdGF0aWMgdm9pZCBTZXRVcFRlc3RDYXNlKCkgewotICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cygKLSAgICAgICAgVGVzdFNvdXJjZURpcigpICsKLSAgICAgICAgICAgICIvZ29vZ2xlL3Byb3RvYnVmLyIKLSAgICAgICAgICAgICJ0ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCIsCi0gICAgICAgICZzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXywgdHJ1ZSkpOwotICB9Ci0KLSAgVGV4dEZvcm1hdFRlc3QoKSA6IHByb3RvX2RlYnVnX3N0cmluZ18oc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ18pIHt9Ci0KLSBwcm90ZWN0ZWQ6Ci0gIC8vIERlYnVnIHN0cmluZyByZWFkIGZyb20gdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQuCi0gIGNvbnN0IHN0cmluZyBwcm90b19kZWJ1Z19zdHJpbmdfOwotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvXzsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBzdHJpbmcgc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ187Ci19Owotc3RyaW5nIFRleHRGb3JtYXRUZXN0OjpzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXzsKLQotY2xhc3MgVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewotIHB1YmxpYzoKLSAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoVGVzdFNvdXJjZURpcigpICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvIgotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN0YXRpY19wcm90b19kZWJ1Z19zdHJpbmdfLCB0cnVlKSk7Ci0gIH0KLQotICBUZXh0Rm9ybWF0RXh0ZW5zaW9uc1Rlc3QoKQotICAgICAgOiBwcm90b19kZWJ1Z19zdHJpbmdfKHN0YXRpY19wcm90b19kZWJ1Z19zdHJpbmdfKSB7fQotCi0gcHJvdGVjdGVkOgotICAvLyBEZWJ1ZyBzdHJpbmcgcmVhZCBmcm9tIHRleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0LgotICBjb25zdCBzdHJpbmcgcHJvdG9fZGVidWdfc3RyaW5nXzsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHByb3RvXzsKLQotIHByaXZhdGU6Ci0gIHN0YXRpYyBzdHJpbmcgc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ187Ci19Owotc3RyaW5nIFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdDo6c3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ187Ci0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBCYXNpYykgewotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZwcm90b18pOwotICBFWFBFQ1RfRVEocHJvdG9fZGVidWdfc3RyaW5nXywgcHJvdG9fLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0LCBFeHRlbnNpb25zKSB7Ci0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZwcm90b18pOwotICBFWFBFQ1RfRVEocHJvdG9fZGVidWdfc3RyaW5nXywgcHJvdG9fLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFNob3J0RGVidWdTdHJpbmcpIHsKLSAgcHJvdG9fLnNldF9vcHRpb25hbF9pbnQzMigxKTsKLSAgcHJvdG9fLnNldF9vcHRpb25hbF9zdHJpbmcoImhlbGxvIik7Ci0gIHByb3RvXy5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigyKTsKLSAgcHJvdG9fLm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCk7Ci0KLSAgRVhQRUNUX0VRKCJvcHRpb25hbF9pbnQzMjogMSBvcHRpb25hbF9zdHJpbmc6IFwiaGVsbG9cIiAiCi0gICAgICAgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyBiYjogMiB9ICIKLSAgICAgICAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgeyB9IiwKLSAgICAgICAgICAgIHByb3RvXy5TaG9ydERlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFNob3J0UHJpbWl0aXZlUmVwZWF0ZWRzKSB7Ci0gIHByb3RvXy5zZXRfb3B0aW9uYWxfaW50MzIoMTIzKTsKLSAgcHJvdG9fLmFkZF9yZXBlYXRlZF9pbnQzMig0NTYpOwotICBwcm90b18uYWRkX3JlcGVhdGVkX2ludDMyKDc4OSk7Ci0gIHByb3RvXy5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJmb28iKTsKLSAgcHJvdG9fLmFkZF9yZXBlYXRlZF9zdHJpbmcoImJhciIpOwotICBwcm90b18uYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigyKTsKLSAgcHJvdG9fLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMyk7Ci0gIHByb3RvXy5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0odW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKLSAgcHJvdG9fLmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIpOwotCi0gIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKLSAgcHJpbnRlci5TZXRVc2VTaG9ydFJlcGVhdGVkUHJpbWl0aXZlcyh0cnVlKTsKLSAgc3RyaW5nIHRleHQ7Ci0gIHByaW50ZXIuUHJpbnRUb1N0cmluZyhwcm90b18sICZ0ZXh0KTsKLQotICBFWFBFQ1RfRVEoIm9wdGlvbmFsX2ludDMyOiAxMjNcbiIKLSAgICAgICAgICAgICJyZXBlYXRlZF9pbnQzMjogWzQ1NiwgNzg5XVxuIgotICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJmb29cIlxuIgotICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJiYXJcIlxuIgotICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHtcbiAgYmI6IDJcbn1cbiIKLSAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4gIGJiOiAzXG59XG4iCi0gICAgICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFtGT08sIEJBUl1cbiIsCi0gICAgICAgICAgICB0ZXh0KTsKLQotICAvLyBUcnkgaW4gc2luZ2xlLWxpbmUgbW9kZS4KLSAgcHJpbnRlci5TZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKLSAgcHJpbnRlci5QcmludFRvU3RyaW5nKHByb3RvXywgJnRleHQpOwotCi0gIEVYUEVDVF9FUSgib3B0aW9uYWxfaW50MzI6IDEyMyAiCi0gICAgICAgICAgICAicmVwZWF0ZWRfaW50MzI6IFs0NTYsIDc4OV0gIgotICAgICAgICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJmb29cIiAiCi0gICAgICAgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImJhclwiICIKLSAgICAgICAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAyIH0gIgotICAgICAgICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgYmI6IDMgfSAiCi0gICAgICAgICAgICAicmVwZWF0ZWRfbmVzdGVkX2VudW06IFtGT08sIEJBUl0gIiwKLSAgICAgICAgICAgIHRleHQpOwotfQotCi0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgU3RyaW5nRXNjYXBlKSB7Ci0gIC8vIFNldCB0aGUgc3RyaW5nIHZhbHVlIHRvIHRlc3QuCi0gIHByb3RvXy5zZXRfb3B0aW9uYWxfc3RyaW5nKGtFc2NhcGVUZXN0U3RyaW5nKTsKLQotICAvLyBHZXQgdGhlIERlYnVnU3RyaW5nIGZyb20gdGhlIHByb3RvLgotICBzdHJpbmcgZGVidWdfc3RyaW5nID0gcHJvdG9fLkRlYnVnU3RyaW5nKCk7Ci0gIHN0cmluZyB1dGY4X2RlYnVnX3N0cmluZyA9IHByb3RvXy5VdGY4RGVidWdTdHJpbmcoKTsKLQotICAvLyBIYXJkY29kZSBhIGNvcnJlY3QgdmFsdWUgdG8gdGVzdCBhZ2FpbnN0LgotICBzdHJpbmcgY29ycmVjdF9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiAiCi0gICAgICArIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZAotICAgICAgICsgIlxuIjsKLQotICAvLyBDb21wYXJlLgotICBFWFBFQ1RfRVEoY29ycmVjdF9zdHJpbmcsIGRlYnVnX3N0cmluZyk7Ci0gIC8vIFVURi04IHN0cmluZyBpcyB0aGUgc2FtZSBhcyBub24tVVRGLTggYmVjYXVzZQotICAvLyB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5zIG5vIFVURi04IHRleHQuCi0gIEVYUEVDVF9FUShjb3JyZWN0X3N0cmluZywgdXRmOF9kZWJ1Z19zdHJpbmcpOwotCi0gIHN0cmluZyBleHBlY3RlZF9zaG9ydF9kZWJ1Z19zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiAiCi0gICAgICArIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZDsKLSAgRVhQRUNUX0VRKGV4cGVjdGVkX3Nob3J0X2RlYnVnX3N0cmluZywgcHJvdG9fLlNob3J0RGVidWdTdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgVXRmOERlYnVnU3RyaW5nKSB7Ci0gIC8vIFNldCB0aGUgc3RyaW5nIHZhbHVlIHRvIHRlc3QuCi0gIHByb3RvXy5zZXRfb3B0aW9uYWxfc3RyaW5nKCJcMzUwXDI2MFwyNjdcMzQ2XDI1NVwyMTQiKTsKLSAgcHJvdG9fLnNldF9vcHRpb25hbF9ieXRlcygiXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0Iik7Ci0KLSAgLy8gR2V0IHRoZSBEZWJ1Z1N0cmluZyBmcm9tIHRoZSBwcm90by4KLSAgc3RyaW5nIGRlYnVnX3N0cmluZyA9IHByb3RvXy5EZWJ1Z1N0cmluZygpOwotICBzdHJpbmcgdXRmOF9kZWJ1Z19zdHJpbmcgPSBwcm90b18uVXRmOERlYnVnU3RyaW5nKCk7Ci0KLSAgLy8gSGFyZGNvZGUgYSBjb3JyZWN0IHZhbHVlIHRvIHRlc3QgYWdhaW5zdC4KLSAgc3RyaW5nIGNvcnJlY3RfdXRmOF9zdHJpbmcgPQotICAgICAgIm9wdGlvbmFsX3N0cmluZzogIgotICAgICAgIlwiXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0XCIiCi0gICAgICAiXG4iCi0gICAgICAib3B0aW9uYWxfYnl0ZXM6ICIKLSAgICAgICJcIlxcMzUwXFwyNjBcXDI2N1xcMzQ2XFwyNTVcXDIxNFwiIgotICAgICAgIlxuIjsKLSAgc3RyaW5nIGNvcnJlY3Rfc3RyaW5nID0KLSAgICAgICJvcHRpb25hbF9zdHJpbmc6ICIKLSAgICAgICJcIlxcMzUwXFwyNjBcXDI2N1xcMzQ2XFwyNTVcXDIxNFwiIgotICAgICAgIlxuIgotICAgICAgIm9wdGlvbmFsX2J5dGVzOiAiCi0gICAgICAiXCJcXDM1MFxcMjYwXFwyNjdcXDM0NlxcMjU1XFwyMTRcIiIKLSAgICAgICJcbiI7Ci0KLSAgLy8gQ29tcGFyZS4KLSAgRVhQRUNUX0VRKGNvcnJlY3RfdXRmOF9zdHJpbmcsIHV0ZjhfZGVidWdfc3RyaW5nKTsKLSAgRVhQRUNUX0VRKGNvcnJlY3Rfc3RyaW5nLCBkZWJ1Z19zdHJpbmcpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50VW5rbm93bkZpZWxkcykgewotICAvLyBUZXN0IHByaW50aW5nIG9mIHVua25vd24gZmllbGRzIGluIGEgbWVzc2FnZS4KLQotICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOwotICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzID0gbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7Ci0KLSAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg1LCAxKTsKLSAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIoNSwgMik7Ci0gIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KDUsIDMpOwotICB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDUsICI0Iik7Ci0gIHVua25vd25fZmllbGRzLT5BZGRHcm91cCg1KS0+QWRkVmFyaW50KDEwLCA1KTsKLQotICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDEpOwotICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDIpOwotICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDMpOwotCi0gIEVYUEVDVF9FUSgKLSAgICAiNTogMVxuIgotICAgICI1OiAweDAwMDAwMDAyXG4iCi0gICAgIjU6IDB4MDAwMDAwMDAwMDAwMDAwM1xuIgotICAgICI1OiBcIjRcIlxuIgotICAgICI1IHtcbiIKLSAgICAiICAxMDogNVxuIgotICAgICJ9XG4iCi0gICAgIjg6IDFcbiIKLSAgICAiODogMlxuIgotICAgICI4OiAzXG4iLAotICAgIG1lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUHJpbnRVbmtub3duRmllbGRzSGlkZGVuKSB7Ci0gIC8vIFRlc3QgcHJpbnRpbmcgb2YgdW5rbm93biBmaWVsZHMgaW4gYSBtZXNzYWdlIHdoZW4gc3VwcHJlc3NlZC4KLQotICB1bml0dGVzdDo6T25lU3RyaW5nIG1lc3NhZ2U7Ci0gIG1lc3NhZ2Uuc2V0X2RhdGEoImRhdGEiKTsKLSAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyA9IG1lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotCi0gIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoNSwgMSk7Ci0gIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDMyKDUsIDIpOwotICB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQ2NCg1LCAzKTsKLSAgdW5rbm93bl9maWVsZHMtPkFkZExlbmd0aERlbGltaXRlZCg1LCAiNCIpOwotICB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAoNSktPkFkZFZhcmludCgxMCwgNSk7Ci0KLSAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg4LCAxKTsKLSAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg4LCAyKTsKLSAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg4LCAzKTsKLQotICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7Ci0gIHByaW50ZXIuU2V0SGlkZVVua25vd25GaWVsZHModHJ1ZSk7Ci0gIHN0cmluZyBvdXRwdXQ7Ci0gIHByaW50ZXIuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCAmb3V0cHV0KTsKLQotICBFWFBFQ1RfRVEoImRhdGE6IFwiZGF0YVwiXG4iLCBvdXRwdXQpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50VW5rbm93bk1lc3NhZ2UpIHsKLSAgLy8gVGVzdCBoZXVyaXN0aWMgcHJpbnRpbmcgb2YgbWVzc2FnZXMgaW4gYW4gVW5rbm93bkZpZWxkU2V0LgotCi0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICAvLyBDYXNlcyB3aGljaCBzaG91bGQgbm90IGJlIGludGVycHJldGVkIGFzIHN1Yi1tZXNzYWdlcy4KLQotICAvLyAnYScgaXMgYSB2YWxpZCBGSVhFRDY0IHRhZywgc28gZm9yIHRoZSBzdHJpbmcgdG8gYmUgcGFyc2VhYmxlIGFzIGEgbWVzc2FnZQotICAvLyBpdCBzaG91bGQgYmUgZm9sbG93ZWQgYnkgOCBieXRlcy4gIFNpbmNlIHRoaXMgc3RyaW5nIG9ubHkgaGFzIHR3bwotICAvLyBzdWJzZXF1ZW50IGJ5dGVzLCBpdCBzaG91bGQgYmUgdHJlYXRlZCBhcyBhIHN0cmluZy4KLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhYmMiKTsKLQotICAvLyAnZCcgaGFwcGVucyB0byBiZSBhIHZhbGlkIEVOREdST1VQIHRhZy4gIFNvLAotICAvLyBVbmtub3duRmllbGRTZXQ6Ok1lcmdlRnJvbUNvZGVkU3RyZWFtKCkgd2lsbCBzdWNjZXNzZnVsbHkgcGFyc2UgImRlZiIsIGJ1dAotICAvLyB0aGUgQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkgY2hlY2sgc2hvdWxkIGZhaWwuCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7Ci0KLSAgLy8gQSB6ZXJvLWxlbmd0aCBzdHJpbmcgc2hvdWxkIG5ldmVyIGJlIGludGVycHJldGVkIGFzIGEgbWVzc2FnZSBldmVuIHRob3VnaAotICAvLyBpdCBpcyB0ZWNobmljYWxseSB2YWxpZCBhcyBvbmUuCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiIik7Ci0KLSAgLy8gQ2FzZSB3aGljaCBzaG91bGQgYmUgaW50ZXJwcmV0ZWQgYXMgYSBzdWItbWVzc2FnZS4KLQotICAvLyBBbiBhY3R1YWwgbmVzdGVkIG1lc3NhZ2Ugd2l0aCBjb250ZW50IHNob3VsZCBhbHdheXMgYmUgaW50ZXJwcmV0ZWQgYXMgYQotICAvLyBuZXN0ZWQgbWVzc2FnZS4KLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEyMyk7Ci0KLSAgc3RyaW5nIGRhdGE7Ci0gIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotCi0gIHN0cmluZyB0ZXh0OwotICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7Ci0gIEVYUEVDVF9UUlVFKHVua25vd25fZmllbGRzLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0gIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlByaW50VW5rbm93bkZpZWxkc1RvU3RyaW5nKHVua25vd25fZmllbGRzLCAmdGV4dCkpOwotICBFWFBFQ1RfRVEoCi0gICAgIjQ0OiBcImFiY1wiXG4iCi0gICAgIjQ0OiBcImRlZlwiXG4iCi0gICAgIjQ0OiBcIlwiXG4iCi0gICAgIjQ4IHtcbiIKLSAgICAiICAxOiAxMjNcbiIKLSAgICAifVxuIiwKLSAgICB0ZXh0KTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludE1lc3NhZ2VXaXRoSW5kZW50KSB7Ci0gIC8vIFRlc3QgYWRkaW5nIGFuIGluaXRpYWwgaW5kZW50IHRvIHByaW50aW5nLgotCi0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImFiYyIpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoImRlZiIpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMTIzKTsKLQotICBzdHJpbmcgdGV4dDsKLSAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOwotICBwcmludGVyLlNldEluaXRpYWxJbmRlbnRMZXZlbCgxKTsKLSAgRVhQRUNUX1RSVUUocHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KSk7Ci0gIEVYUEVDVF9FUSgKLSAgICAiICByZXBlYXRlZF9zdHJpbmc6IFwiYWJjXCJcbiIKLSAgICAiICByZXBlYXRlZF9zdHJpbmc6IFwiZGVmXCJcbiIKLSAgICAiICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7XG4iCi0gICAgIiAgICBiYjogMTIzXG4iCi0gICAgIiAgfVxuIiwKLSAgICB0ZXh0KTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludE1lc3NhZ2VTaW5nbGVMaW5lKSB7Ci0gIC8vIFRlc3QgcHJpbnRpbmcgYSBtZXNzYWdlIG9uIGEgc2luZ2xlIGxpbmUuCi0KLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjIik7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYigxMjMpOwotCi0gIHN0cmluZyB0ZXh0OwotICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7Ci0gIHByaW50ZXIuU2V0SW5pdGlhbEluZGVudExldmVsKDEpOwotICBwcmludGVyLlNldFNpbmdsZUxpbmVNb2RlKHRydWUpOwotICBFWFBFQ1RfVFJVRShwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpKTsKLSAgRVhQRUNUX0VRKAotICAgICIgIHJlcGVhdGVkX3N0cmluZzogXCJhYmNcIiByZXBlYXRlZF9zdHJpbmc6IFwiZGVmXCIgIgotICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7IGJiOiAxMjMgfSAiLAotICAgIHRleHQpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50QnVmZmVyVG9vU21hbGwpIHsKLSAgLy8gVGVzdCBwcmludGluZyBhIG1lc3NhZ2UgdG8gYSBidWZmZXIgdGhhdCBpcyB0b28gc21hbGwuCi0KLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiYWJjIik7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3N0cmluZygiZGVmIik7Ci0KLSAgY2hhciBidWZmZXJbMV0gPSAiIjsKLSAgaW86OkFycmF5T3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oYnVmZmVyLCAxKTsKLSAgRVhQRUNUX0ZBTFNFKFRleHRGb3JtYXQ6OlByaW50KG1lc3NhZ2UsICZvdXRwdXRfc3RyZWFtKSk7Ci0gIEVYUEVDVF9FUShidWZmZXJbMF0sICdyJyk7Ci0gIEVYUEVDVF9FUShvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpLCAxKTsKLX0KLQotLy8gQSBwcmludGVyIHRoYXQgYXBwZW5kcyAndScgdG8gYWxsIHVuc2lnbmVkIGludDMyLgotY2xhc3MgQ3VzdG9tVUludDMyRmllbGRWYWx1ZVByaW50ZXIgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCBzdHJpbmcgUHJpbnRVSW50MzIodWludDMyIHZhbCkgY29uc3QgewotICAgIHJldHVybiBTdHJDYXQoRmllbGRWYWx1ZVByaW50ZXI6OlByaW50VUludDMyKHZhbCksICJ1Iik7Ci0gIH0KLX07Ci0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgRGVmYXVsdEN1c3RvbUZpZWxkUHJpbnRlcikgewotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0KLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfdWludDMyKDQyKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfdWludDMyKDEpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF91aW50MzIoMik7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3VpbnQzMigzKTsKLQotICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7Ci0gIHByaW50ZXIuU2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKG5ldyBDdXN0b21VSW50MzJGaWVsZFZhbHVlUHJpbnRlcigpKTsKLSAgLy8gTGV0J3Mgc2VlIGlmIHRoYXQgd29ya3Mgd2VsbCB0b2dldGhlciB3aXRoIHRoZSByZXBlYXRlZCBwcmltaXRpdmVzOgotICBwcmludGVyLlNldFVzZVNob3J0UmVwZWF0ZWRQcmltaXRpdmVzKHRydWUpOwotICBzdHJpbmcgdGV4dDsKLSAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KTsKLSAgRVhQRUNUX0VRKCJvcHRpb25hbF91aW50MzI6IDQydVxucmVwZWF0ZWRfdWludDMyOiBbMXUsIDJ1LCAzdV1cbiIsIHRleHQpOwotfQotCi1jbGFzcyBDdXN0b21JbnQzMkZpZWxkVmFsdWVQcmludGVyIDogcHVibGljIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyIHsKLSBwdWJsaWM6Ci0gIHZpcnR1YWwgc3RyaW5nIFByaW50SW50MzIoaW50MzIgdmFsKSBjb25zdCB7Ci0gICAgcmV0dXJuIFN0ckNhdCgidmFsdWUtaXMoIiwgRmllbGRWYWx1ZVByaW50ZXI6OlByaW50SW50MzIodmFsKSwgIikiKTsKLSAgfQotfTsKLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBGaWVsZFNwZWNpZmljQ3VzdG9tUHJpbnRlcikgewotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0KLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoNDIpOyAgLy8gVGhpcyB3aWxsIGJlIGhhbmRsZWQgYnkgb3VyIFByaW50ZXIuCi0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ludDMyKDQyKTsgIC8vIFRoaXMgd2lsbCBiZSBwcmludGVkIGFzIG51bWJlci4KLQotICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7Ci0gIEVYUEVDVF9UUlVFKHByaW50ZXIuUmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcigKLSAgICAgIG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIiksCi0gICAgICBuZXcgQ3VzdG9tSW50MzJGaWVsZFZhbHVlUHJpbnRlcigpKSk7Ci0gIHN0cmluZyB0ZXh0OwotICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOwotICBFWFBFQ1RfRVEoIm9wdGlvbmFsX2ludDMyOiB2YWx1ZS1pcyg0MilcbnJlcGVhdGVkX2ludDMyOiA0MlxuIiwgdGV4dCk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgRXJyb3JDYXNlc1JlZ2lzdGVyaW5nRmllbGRWYWx1ZVByaW50ZXJTaG91bGRGYWlsKSB7Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOwotICAvLyBOVUxMIHByaW50ZXIuCi0gIEVYUEVDVF9GQUxTRShwcmludGVyLlJlZ2lzdGVyRmllbGRWYWx1ZVByaW50ZXIoCi0gICAgICBtZXNzYWdlLkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpLAotICAgICAgTlVMTCkpOwotICAvLyBCZWNhdXNlIHJlZ2lzdHJhdGlvbiBmYWlscywgdGhlIG93bmVyc2hpcCBvZiB0aGlzIHByaW50ZXIgaXMgbmV2ZXIgdGFrZW4uCi0gIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyIG15X2ZpZWxkX3ByaW50ZXI7Ci0gIC8vIE5VTEwgZmllbGQKLSAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuUmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcihOVUxMLCAmbXlfZmllbGRfcHJpbnRlcikpOwotfQotCi1jbGFzcyBDdXN0b21NZXNzYWdlRmllbGRWYWx1ZVByaW50ZXIgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIgewotIHB1YmxpYzoKLSAgdmlydHVhbCBzdHJpbmcgUHJpbnRJbnQzMihpbnQzMiB2KSBjb25zdCB7Ci0gICAgcmV0dXJuIFN0ckNhdChGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRJbnQzMih2KSwgIiAgIyB4Iiwgc3RyaW5nczo6SGV4KHYpKTsKLSAgfQotCi0gIHZpcnR1YWwgc3RyaW5nIFByaW50TWVzc2FnZVN0YXJ0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9pbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2NvdW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbmdsZV9saW5lX21vZGUpIGNvbnN0IHsKLSAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZSkgewotICAgICAgcmV0dXJuICIgeyAiOwotICAgIH0KLSAgICByZXR1cm4gU3RyQ2F0KAotICAgICAgICAiIHsgICMgIiwgbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPm5hbWUoKSwgIjogIiwgZmllbGRfaW5kZXgsICJcbiIpOwotICB9Ci19OwotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIEN1c3RvbVByaW50ZXJGb3JDb21tZW50cykgewotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7Ci0gIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOwotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoNDIpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZCg0Myk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKCktPnNldF9kKDQ0KTsKLSAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOwotICBDdXN0b21NZXNzYWdlRmllbGRWYWx1ZVByaW50ZXIgbXlfZmllbGRfcHJpbnRlcjsKLSAgcHJpbnRlci5TZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIobmV3IEN1c3RvbU1lc3NhZ2VGaWVsZFZhbHVlUHJpbnRlcigpKTsKLSAgc3RyaW5nIHRleHQ7Ci0gIHByaW50ZXIuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCAmdGV4dCk7Ci0gIEVYUEVDVF9FUSgKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7ICAjIE5lc3RlZE1lc3NhZ2U6IC0xXG4iCi0gICAgICAifVxuIgotICAgICAgIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIHsgICMgSW1wb3J0TWVzc2FnZTogLTFcbiIKLSAgICAgICIgIGQ6IDQyICAjIHgyYVxuIgotICAgICAgIn1cbiIKLSAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7ICAjIE5lc3RlZE1lc3NhZ2U6IDBcbiIKLSAgICAgICJ9XG4iCi0gICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgeyAgIyBOZXN0ZWRNZXNzYWdlOiAxXG4iCi0gICAgICAifVxuIgotICAgICAgInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsgICMgSW1wb3J0TWVzc2FnZTogMFxuIgotICAgICAgIiAgZDogNDMgICMgeDJiXG4iCi0gICAgICAifVxuIgotICAgICAgInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIHsgICMgSW1wb3J0TWVzc2FnZTogMVxuIgotICAgICAgIiAgZDogNDQgICMgeDJjXG4iCi0gICAgICAifVxuIiwKLSAgICAgIHRleHQpOwotfQotCi1jbGFzcyBDdXN0b21NdWx0aWxpbmVDb21tZW50UHJpbnRlciA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlciB7Ci0gcHVibGljOgotICB2aXJ0dWFsIHN0cmluZyBQcmludE1lc3NhZ2VTdGFydChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9jb3VudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaW5nbGVfbGluZV9jb21tZW50KSBjb25zdCB7Ci0gICAgcmV0dXJuIFN0ckNhdCgiIHsgICMgMVxuIiwgIiAgIyAyXG4iKTsKLSAgfQotfTsKLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBDdXN0b21QcmludGVyRm9yTXVsdGlsaW5lQ29tbWVudHMpIHsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKTsKLSAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCktPnNldF9kKDQyKTsKLSAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOwotICBDdXN0b21NZXNzYWdlRmllbGRWYWx1ZVByaW50ZXIgbXlfZmllbGRfcHJpbnRlcjsKLSAgcHJpbnRlci5TZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIobmV3IEN1c3RvbU11bHRpbGluZUNvbW1lbnRQcmludGVyKCkpOwotICBzdHJpbmcgdGV4dDsKLSAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KTsKLSAgRVhQRUNUX0VRKAotICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgICMgMVxuIgotICAgICAgIiAgIyAyXG4iCi0gICAgICAifVxuIgotICAgICAgIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIHsgICMgMVxuIgotICAgICAgIiAgIyAyXG4iCi0gICAgICAiICBkOiA0MlxuIgotICAgICAgIn1cbiIsCi0gICAgICB0ZXh0KTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQYXJzZUJhc2ljKSB7Ci0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwcm90b19kZWJ1Z19zdHJpbmdfLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX2RlYnVnX3N0cmluZ18uc2l6ZSgpKTsKLSAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQocHJvdG9fKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRFeHRlbnNpb25zVGVzdCwgUGFyc2VFeHRlbnNpb25zKSB7Ci0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwcm90b19kZWJ1Z19zdHJpbmdfLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX2RlYnVnX3N0cmluZ18uc2l6ZSgpKTsKLSAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KHByb3RvXyk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFbnVtRmllbGRGcm9tTnVtYmVyKSB7Ci0gIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIGEgbnVtZXJpY2FsIHZhbHVlIGZvciBhbiBlbnVtIGZpZWxkLgotICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgib3B0aW9uYWxfbmVzdGVkX2VudW06ICQwIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKTsKLSAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHBhcnNlX3N0cmluZywgJnByb3RvXykpOwotICBFWFBFQ1RfVFJVRShwcm90b18uaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBwcm90b18ub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFbnVtRmllbGRGcm9tTmVnYXRpdmVOdW1iZXIpIHsKLSAgQVNTRVJUX0xUKHVuaXR0ZXN0OjpTUEFSU0VfRSwgMCk7Ci0gIHN0cmluZyBwYXJzZV9zdHJpbmcgPSBzdHJpbmdzOjpTdWJzdGl0dXRlKCJzcGFyc2VfZW51bTogJDAiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdDo6U1BBUlNFX0UpOwotICB1bml0dGVzdDo6U3BhcnNlRW51bU1lc3NhZ2UgcHJvdG87Ci0gIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwYXJzZV9zdHJpbmcsICZwcm90bykpOwotICBFWFBFQ1RfVFJVRShwcm90by5oYXNfc3BhcnNlX2VudW0oKSk7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6U1BBUlNFX0UsIHByb3RvLnNwYXJzZV9lbnVtKCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU3RyaW5nRXNjYXBlKSB7Ci0gIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIGVzY3BhZWQgY2hhcmFjdGVycyBpbiBpdC4KLSAgc3RyaW5nIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9zdHJpbmc6ICIKLSAgICAgICsga0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkCi0gICAgICArICJcbiI7Ci0KLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKHBhcnNlX3N0cmluZy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwYXJzZV9zdHJpbmcuc2l6ZSgpKTsKLSAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7Ci0KLSAgLy8gQ29tcGFyZS4KLSAgRVhQRUNUX0VRKGtFc2NhcGVUZXN0U3RyaW5nLCBwcm90b18ub3B0aW9uYWxfc3RyaW5nKCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlQ29uY2F0ZW5hdGVkU3RyaW5nKSB7Ci0gIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIG11bHRpcGxlIHBhcnRzIG9uIG9uZSBsaW5lLgotICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX3N0cmluZzogXCJmb29cIiBcImJhclwiXG4iOwotCi0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbTEocGFyc2Vfc3RyaW5nLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZy5zaXplKCkpOwotICBUZXh0Rm9ybWF0OjpQYXJzZSgmaW5wdXRfc3RyZWFtMSwgJnByb3RvXyk7Ci0KLSAgLy8gQ29tcGFyZS4KLSAgRVhQRUNUX0VRKCJmb29iYXIiLCBwcm90b18ub3B0aW9uYWxfc3RyaW5nKCkpOwotCi0gIC8vIENyZWF0ZSBhIHBhcnNlIHN0cmluZyB3aXRoIG11bHRpcGxlIHBhcnRzIG9uIHNlcGFyYXRlIGxpbmVzLgotICBwYXJzZV9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiXG4iCi0gICAgICAgICAgICAgICAgICJcImJhclwiXG4iOwotCi0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbTIocGFyc2Vfc3RyaW5nLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZy5zaXplKCkpOwotICBUZXh0Rm9ybWF0OjpQYXJzZSgmaW5wdXRfc3RyZWFtMiwgJnByb3RvXyk7Ci0KLSAgLy8gQ29tcGFyZS4KLSAgRVhQRUNUX0VRKCJmb29iYXIiLCBwcm90b18ub3B0aW9uYWxfc3RyaW5nKCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlRmxvYXRXaXRoU3VmZml4KSB7Ci0gIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcGFyc2UgYSBmbG9hdGluZy1wb2ludCB2YWx1ZSB3aXRoICdmJyBhcHBlbmRlZCB0byB0aGUKLSAgLy8gZW5kLiAgVGhpcyBpcyBuZWVkZWQgZm9yIGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLgotCi0gIC8vIEhhdmUgaXQgcGFyc2UgYSBmbG9hdCB3aXRoIHRoZSAnZicgc3VmZml4LgotICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX2Zsb2F0OiAxLjBmXG4iOwotCi0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwYXJzZV9zdHJpbmcuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RyaW5nLnNpemUoKSk7Ci0KLSAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7Ci0KLSAgLy8gQ29tcGFyZS4KLSAgRVhQRUNUX0VRKDEuMCwgcHJvdG9fLm9wdGlvbmFsX2Zsb2F0KCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlU2hvcnRSZXBlYXRlZEZvcm0pIHsKLSAgc3RyaW5nIHBhcnNlX3N0cmluZyA9Ci0gICAgICAvLyBNaXhlZCBzaG9ydC1mb3JtIGFuZCBsb25nLWZvcm0gYXJlIHNpbXBseSBjb25jYXRlbmF0ZWQuCi0gICAgICAicmVwZWF0ZWRfaW50MzI6IDFcbiIKLSAgICAgICJyZXBlYXRlZF9pbnQzMjogWzQ1NiwgNzg5XVxuIgotICAgICAgInJlcGVhdGVkX25lc3RlZF9lbnVtOiBbICBGT08gLEJBUiwgIyBjb21tZW50XG4iCi0gICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgIDNdXG4iCi0gICAgICAvLyBOb3RlIHRoYXQgd2hpbGUgdGhlIHByaW50ZXIgd29uJ3QgcHJpbnQgcmVwZWF0ZWQgc3RyaW5ncyBpbiBzaG9ydC1mb3JtLAotICAgICAgLy8gdGhlIHBhcnNlciB3aWxsIGFjY2VwdCB0aGVtLgotICAgICAgInJlcGVhdGVkX3N0cmluZzogWyBcImZvb1wiLCAnYmFyJyBdXG4iCi0gICAgICAvLyBSZXBlYXRlZCBtZXNzYWdlCi0gICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U6IFsgeyBiYjogMSB9LCB7IGJiIDogMiB9XVxuIgotICAgICAgLy8gUmVwZWF0ZWQgZ3JvdXAKLSAgICAgICJSZXBlYXRlZEdyb3VwIFt7IGE6IDMgfSx7IGE6IDQgfV1cbiI7Ci0KLSAgQVNTRVJUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKHBhcnNlX3N0cmluZywgJnByb3RvXykpOwotCi0gIEFTU0VSVF9FUSgzLCBwcm90b18ucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDEsIHByb3RvXy5yZXBlYXRlZF9pbnQzMigwKSk7Ci0gIEVYUEVDVF9FUSg0NTYsIHByb3RvXy5yZXBlYXRlZF9pbnQzMigxKSk7Ci0gIEVYUEVDVF9FUSg3ODksIHByb3RvXy5yZXBlYXRlZF9pbnQzMigyKSk7Ci0KLSAgQVNTRVJUX0VRKDMsIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplKCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX2VudW0oMSkpOwotICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX2VudW0oMikpOwotCi0gIEFTU0VSVF9FUSgyLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgcHJvdG9fLnJlcGVhdGVkX3N0cmluZygwKSk7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgcHJvdG9fLnJlcGVhdGVkX3N0cmluZygxKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOwotICBFWFBFQ1RfRVEoMSwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDApLmJiKCkpOwotICBFWFBFQ1RfRVEoMiwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKDEpLmJiKCkpOwotCi0gIEFTU0VSVF9FUSgyLCBwcm90b18ucmVwZWF0ZWRncm91cF9zaXplKCkpOwotICBFWFBFQ1RfRVEoMywgcHJvdG9fLnJlcGVhdGVkZ3JvdXAoMCkuYSgpKTsKLSAgRVhQRUNUX0VRKDQsIHByb3RvXy5yZXBlYXRlZGdyb3VwKDEpLmEoKSk7Ci19Ci0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBDb21tZW50cykgewotICAvLyBUZXN0IHRoYXQgY29tbWVudHMgYXJlIGlnbm9yZWQuCi0KLSAgc3RyaW5nIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9pbnQzMjogMSAgIyBhIGNvbW1lbnRcbiIKLSAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb25hbF9pbnQ2NDogMiAgIyBhbm90aGVyIGNvbW1lbnQiOwotCi0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShwYXJzZV9zdHJpbmcuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyc2Vfc3RyaW5nLnNpemUoKSk7Ci0KLSAgVGV4dEZvcm1hdDo6UGFyc2UoJmlucHV0X3N0cmVhbSwgJnByb3RvXyk7Ci0KLSAgLy8gQ29tcGFyZS4KLSAgRVhQRUNUX0VRKDEsIHByb3RvXy5vcHRpb25hbF9pbnQzMigpKTsKLSAgRVhQRUNUX0VRKDIsIHByb3RvXy5vcHRpb25hbF9pbnQ2NCgpKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBPcHRpb25hbENvbG9uKSB7Ci0gIC8vIFRlc3QgdGhhdCB3ZSBjYW4gcGxhY2UgYSAnOicgYWZ0ZXIgdGhlIGZpZWxkIG5hbWUgb2YgYSBuZXN0ZWQgbWVzc2FnZSwKLSAgLy8gZXZlbiB0aG91Z2ggd2UgZG9uJ3QgaGF2ZSB0by4KLQotICBzdHJpbmcgcGFyc2Vfc3RyaW5nID0gIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlOiB7IGJiOiAxfVxuIjsKLQotICBpbzo6QXJyYXlJbnB1dFN0cmVhbSBpbnB1dF9zdHJlYW0ocGFyc2Vfc3RyaW5nLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNlX3N0cmluZy5zaXplKCkpOwotCi0gIFRleHRGb3JtYXQ6OlBhcnNlKCZpbnB1dF9zdHJlYW0sICZwcm90b18pOwotCi0gIC8vIENvbXBhcmUuCi0gIEVYUEVDVF9UUlVFKHByb3RvXy5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9FUSgxLCBwcm90b18ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsKLX0KLQotLy8gU29tZSBwbGF0Zm9ybXMgKGUuZy4gV2luZG93cykgaW5zaXN0IG9uIHBhZGRpbmcgdGhlIGV4cG9uZW50IHRvIHRocmVlCi0vLyBkaWdpdHMgd2hlbiBvbmUgb3IgdHdvIHdvdWxkIGJlIGp1c3QgZmluZS4KLXN0YXRpYyBzdHJpbmcgUmVtb3ZlUmVkdW5kYW50WmVyb3Moc3RyaW5nIHRleHQpIHsKLSAgdGV4dCA9IFN0cmluZ1JlcGxhY2UodGV4dCwgImUrMCIsICJlKyIsIHRydWUpOwotICB0ZXh0ID0gU3RyaW5nUmVwbGFjZSh0ZXh0LCAiZS0wIiwgImUtIiwgdHJ1ZSk7Ci0gIHJldHVybiB0ZXh0OwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFRlc3QsIFByaW50RXhvdGljKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICAvLyBOb3RlOiAgSW4gQywgYSBuZWdhdGl2ZSBpbnRlZ2VyIGxpdGVyYWwgaXMgYWN0dWFsbHkgdGhlIHVuYXJ5IG5lZ2F0aW9uCi0gIC8vICAgb3BlcmF0b3IgYmVpbmcgYXBwbGllZCB0byBhIHBvc2l0aXZlIGludGVnZXIgbGl0ZXJhbCwgYW5kCi0gIC8vICAgOTIyMzM3MjAzNjg1NDc3NTgwOCBpcyBvdXRzaWRlIHRoZSByYW5nZSBvZiBpbnQ2NC4gIEhvd2V2ZXIsIGl0IGlzIG5vdAotICAvLyAgIG91dHNpZGUgdGhlIHJhbmdlIG9mIHVpbnQ2NC4gIENvbmZ1c2luZ2x5LCB0aGlzIG1lYW5zIHRoYXQgZXZlcnl0aGluZwotICAvLyAgIHdvcmtzIGlmIHdlIG1ha2UgdGhlIGxpdGVyYWwgdW5zaWduZWQsIGV2ZW4gdGhvdWdoIHdlIGFyZSBuZWdhdGluZyBpdC4KLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW50NjQoLUdPT0dMRV9VTE9OR0xPTkcoOTIyMzM3MjAzNjg1NDc3NTgwOCkpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF91aW50NjQoR09PR0xFX1VMT05HTE9ORygxODQ0Njc0NDA3MzcwOTU1MTYxNSkpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMTIzLjQ1Nik7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzZTIxKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjNlLTE4KTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKHN0ZDo6bnVtZXJpY19saW1pdHM8ZG91YmxlPjo6cXVpZXRfTmFOKCkpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9zdHJpbmcoc3RyaW5nKCJcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJ1wiIiwgMTIpKTsKLQotICAvLyBGdW4gc3Rvcnk6ICBXZSB1c2VkIHRvIHVzZSAxLjIzZTIyIGluc3RlYWQgb2YgMS4yM2UyMSBhYm92ZSwgYnV0IHRoaXMKLSAgLy8gICBzZWVtZWQgdG8gdHJpZ2dlciBhbiBvZGQgY2FzZSBvbiBNaW5HVy9HQ0MgMy40LjUgd2hlcmUgR0NDJ3MgcGFyc2luZyBvZgotICAvLyAgIHRoZSB2YWx1ZSBkaWZmZXJlZCBmcm9tIHN0cnRvZCgpJ3MgcGFyc2luZy4gIFRoYXQgaXMgdG8gc2F5LCB0aGUKLSAgLy8gICBmb2xsb3dpbmcgYXNzZXJ0aW9uIGZhaWxzIG9uIE1pbkdXOgotICAvLyAgICAgYXNzZXJ0KDEuMjNlMjIgPT0gc3RydG9kKCIxLjIzZTIyIiwgTlVMTCkpOwotICAvLyAgIEFzIGEgcmVzdWx0LCBTaW1wbGVEdG9hKCkgd291bGQgcHJpbnQgdGhlIHZhbHVlIGFzCi0gIC8vICAgIjEuMjMwMDAwMDAwMDAwMDAwMWUrMjIiIHRvIG1ha2Ugc3VyZSBzdHJ0b2QoKSBwcm9kdWNlIHRoZSBleGFjdCBzYW1lCi0gIC8vICAgcmVzdWx0LiAgT3VyIGdvYWwgaXMgdG8gdGVzdCBydW50aW1lIHBhcnNpbmcsIG5vdCBjb21waWxlLXRpbWUgcGFyc2luZywKLSAgLy8gICBzbyB0aGlzIHdhc24ndCBvdXIgcHJvYmxlbS4gIEl0IHdhcyBmb3VuZCB0aGF0IHVzaW5nIDEuMjNlMjEgZGlkIG5vdAotICAvLyAgIGhhdmUgdGhpcyBwcm9ibGVtLCBzbyB3ZSBzd2l0Y2hlZCB0byB0aGF0IGluc3RlYWQuCi0KLSAgRVhQRUNUX0VRKAotICAgICJyZXBlYXRlZF9pbnQ2NDogLTkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIKLSAgICAicmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNVxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy40NTZcbiIKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzZSsyMVxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjNlLTE4XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogaW5mXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogLWluZlxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IG5hblxuIgotICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcJ1xcXCJcIlxuIiwKLSAgICBSZW1vdmVSZWR1bmRhbnRaZXJvcyhtZXNzYWdlLkRlYnVnU3RyaW5nKCkpKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludEZsb2F0UHJlY2lzaW9uKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDUpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9mbG9hdCgxLjIzNDU2KTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yZTEwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yM2UxMCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2Zsb2F0KDEuMjM0ZTEwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQ1ZTEwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4yMzQ1NmUxMCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMyk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDUpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Nik7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nyk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2NzgpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OSk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5OCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODcpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3Nik7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NSk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NTQpOwotICBtZXNzYWdlLmFkZF9yZXBlYXRlZF9kb3VibGUoMS4yMzQ1Njc4OTg3NjU0Myk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjJlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjNlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0ZTEwMCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDVlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTZlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ZTEwMCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2NzhlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODllMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4ZTEwMCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODdlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzZlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1ZTEwMCk7Ci0gIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2RvdWJsZSgxLjIzNDU2Nzg5ODc2NTRlMTAwKTsKLSAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMjM0NTY3ODk4NzY1NDNlMTAwKTsKLQotICBFWFBFQ1RfRVEoCi0gICAgInJlcGVhdGVkX2Zsb2F0OiAxLjJcbiIKLSAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjNcbiIKLSAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0XG4iCi0gICAgInJlcGVhdGVkX2Zsb2F0OiAxLjIzNDVcbiIKLSAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NTZcbiIKLSAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMmUrMTBcbiIKLSAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjNlKzEwXG4iCi0gICAgInJlcGVhdGVkX2Zsb2F0OiAxLjIzNGUrMTBcbiIKLSAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NWUrMTBcbiIKLSAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMjM0NTZlKzEwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM1xuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NlxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OVxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NlxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0M1xuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMmUrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM2UrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzRlKzEwMFxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NWUrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NmUrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1NjdlKzEwMFxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3OGUrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OWUrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OThlKzEwMFxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4N2UrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NmUrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjVlKzEwMFxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM0NTY3ODk4NzY1NGUrMTAwXG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzQ1Njc4OTg3NjU0M2UrMTAwXG4iLAotICAgIFJlbW92ZVJlZHVuZGFudFplcm9zKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSkpOwotfQotCi0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgQWxsb3dQYXJ0aWFsKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKLSAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKLSAgcGFyc2VyLkFsbG93UGFydGlhbE1lc3NhZ2UodHJ1ZSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoImE6IDEiLCAmbWVzc2FnZSkpOwotICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5hKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYigpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2MoKSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUGFyc2VFeG90aWMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCi0gICAgInJlcGVhdGVkX2ludDMyOiAtMVxuIgotICAgICJyZXBlYXRlZF9pbnQzMjogLTIxNDc0ODM2NDhcbiIKLSAgICAicmVwZWF0ZWRfaW50NjQ6IC0xXG4iCi0gICAgInJlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuIgotICAgICJyZXBlYXRlZF91aW50MzI6IDQyOTQ5NjcyOTVcbiIKLSAgICAicmVwZWF0ZWRfdWludDMyOiAyMTQ3NDgzNjQ4XG4iCi0gICAgInJlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbiIKLSAgICAicmVwZWF0ZWRfdWludDY0OiA5MjIzMzcyMDM2ODU0Nzc1ODA4XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMTIzLjBcbiIKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNVxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDAuMTI1XG4iCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yM0UxN1xuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM1RSsyMlxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEuMjM1ZS0xOFxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy40NTY3ODlcbiIKLSAgICAicmVwZWF0ZWRfZG91YmxlOiBpbmZcbiIKLSAgICAicmVwZWF0ZWRfZG91YmxlOiBJbmZpbml0eVxuIgotICAgICJyZXBlYXRlZF9kb3VibGU6IC1pbmZcbiIKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAtSW5maW5pdHlcbiIKLSAgICAicmVwZWF0ZWRfZG91YmxlOiBuYW5cbiIKLSAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiIKLSAgICAicmVwZWF0ZWRfc3RyaW5nOiBcIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIlwiXG4iLAotICAgICZtZXNzYWdlKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKC0xLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyKDApKTsKLSAgLy8gTm90ZTogIEluIEMsIGEgbmVnYXRpdmUgaW50ZWdlciBsaXRlcmFsIGlzIGFjdHVhbGx5IHRoZSB1bmFyeSBuZWdhdGlvbgotICAvLyAgIG9wZXJhdG9yIGJlaW5nIGFwcGxpZWQgdG8gYSBwb3NpdGl2ZSBpbnRlZ2VyIGxpdGVyYWwsIGFuZCAyMTQ3NDgzNjQ4IGlzCi0gIC8vICAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgaW50MzIuICBIb3dldmVyLCBpdCBpcyBub3Qgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YKLSAgLy8gICB1aW50MzIuICBDb25mdXNpbmdseSwgdGhpcyBtZWFucyB0aGF0IGV2ZXJ5dGhpbmcgd29ya3MgaWYgd2UgbWFrZSB0aGUKLSAgLy8gICBsaXRlcmFsIHVuc2lnbmVkLCBldmVuIHRob3VnaCB3ZSBhcmUgbmVnYXRpbmcgaXQuCi0gIEVYUEVDVF9FUSgtMjE0NzQ4MzY0OHUsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMSkpOwotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0X3NpemUoKSk7Ci0gIEVYUEVDVF9FUSgtMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NCgwKSk7Ci0gIC8vIE5vdGU6ICBJbiBDLCBhIG5lZ2F0aXZlIGludGVnZXIgbGl0ZXJhbCBpcyBhY3R1YWxseSB0aGUgdW5hcnkgbmVnYXRpb24KLSAgLy8gICBvcGVyYXRvciBiZWluZyBhcHBsaWVkIHRvIGEgcG9zaXRpdmUgaW50ZWdlciBsaXRlcmFsLCBhbmQKLSAgLy8gICA5MjIzMzcyMDM2ODU0Nzc1ODA4IGlzIG91dHNpZGUgdGhlIHJhbmdlIG9mIGludDY0LiAgSG93ZXZlciwgaXQgaXMgbm90Ci0gIC8vICAgb3V0c2lkZSB0aGUgcmFuZ2Ugb2YgdWludDY0LiAgQ29uZnVzaW5nbHksIHRoaXMgbWVhbnMgdGhhdCBldmVyeXRoaW5nCi0gIC8vICAgd29ya3MgaWYgd2UgbWFrZSB0aGUgbGl0ZXJhbCB1bnNpZ25lZCwgZXZlbiB0aG91Z2ggd2UgYXJlIG5lZ2F0aW5nIGl0LgotICBFWFBFQ1RfRVEoLUdPT0dMRV9VTE9OR0xPTkcoOTIyMzM3MjAzNjg1NDc3NTgwOCksIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQoMSkpOwotCi0gIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMl9zaXplKCkpOwotICBFWFBFQ1RfRVEoNDI5NDk2NzI5NXUsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKDApKTsKLSAgRVhQRUNUX0VRKDIxNDc0ODM2NDh1LCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMigxKSk7Ci0KLSAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0X3NpemUoKSk7Ci0gIEVYUEVDVF9FUShHT09HTEVfVUxPTkdMT05HKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMCkpOwotICBFWFBFQ1RfRVEoR09PR0xFX1VMT05HTE9ORyg5MjIzMzcyMDM2ODU0Nzc1ODA4KSwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQoMSkpOwotCi0gIEFTU0VSVF9FUSgxMywgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDEyMy4wICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDApKTsKLSAgRVhQRUNUX0VRKDEyMy41ICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDEpKTsKLSAgRVhQRUNUX0VRKDAuMTI1ICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDIpKTsKLSAgRVhQRUNUX0VRKDEuMjNFMTcgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDMpKTsKLSAgRVhQRUNUX0VRKDEuMjM1RTIyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDQpKTsKLSAgRVhQRUNUX0VRKDEuMjM1RS0xOCAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDUpKTsKLSAgRVhQRUNUX0VRKDEyMy40NTY3ODksIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDYpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDcpLCBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDgpLCBudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKLSAgRVhQRUNUX0VRKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDkpLCAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7Ci0gIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMCksIC1udW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpKTsKLSAgRVhQRUNUX1RSVUUoTWF0aExpbWl0czxkb3VibGU+OjpJc05hTihtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMSkpKTsKLSAgRVhQRUNUX1RSVUUoTWF0aExpbWl0czxkb3VibGU+OjpJc05hTihtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMikpKTsKLQotICAvLyBOb3RlOiAgU2luY2UgdGhlc2Ugc3RyaW5nIGxpdGVyYWxzIGhhdmUgXDAncyBpbiB0aGVtLCB3ZSBtdXN0IGV4cGxpY2l0bHkKLSAgLy8gICBwYXNzIHRoZWlyIHNpemVzIHRvIHN0cmluZydzIGNvbnN0cnVjdG9yLgotICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKHN0cmluZygiXDAwMFwwMDFcYVxiXGZcblxyXHRcdlxcXCdcIiIsIDEyKSwKLSAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludEZpZWxkc0luSW5kZXhPcmRlcikgewotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIG1lc3NhZ2U7Ci0gIC8vIEZpZWxkcyBhcmUgbGlzdGVkIGluIGluZGV4IG9yZGVyIGluc3RlYWQgb2YgZmllbGQgbnVtYmVyLgotICBtZXNzYWdlLnNldF9teV9zdHJpbmcoIlRlc3QgU3RyaW5nIik7ICAgLy8gRmllbGQgbnVtYmVyIDExCi0gIG1lc3NhZ2Uuc2V0X215X2ludCgxMjM0NSk7ICAgICAgICAgICAgICAvLyBGaWVsZCBudW1iZXIgMQotICBtZXNzYWdlLnNldF9teV9mbG9hdCgwLjk5OSk7ICAgICAgICAgICAgLy8gRmllbGQgbnVtYmVyIDEwMQotICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7Ci0gIHN0cmluZyB0ZXh0OwotCi0gIC8vIEJ5IGRlZmF1bHQsIHByaW50IGluIGZpZWxkIG51bWJlciBvcmRlci4KLSAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KTsKLSAgRVhQRUNUX0VRKCJteV9pbnQ6IDEyMzQ1XG5teV9zdHJpbmc6IFwiVGVzdCBTdHJpbmdcIlxubXlfZmxvYXQ6IDAuOTk5XG4iLAotICAgICAgICAgICAgdGV4dCk7Ci0KLSAgLy8gUHJpbnQgaW4gaW5kZXggb3JkZXIuCi0gIHByaW50ZXIuU2V0UHJpbnRNZXNzYWdlRmllbGRzSW5JbmRleE9yZGVyKHRydWUpOwotICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOwotICBFWFBFQ1RfRVEoIm15X3N0cmluZzogXCJUZXN0IFN0cmluZ1wiXG5teV9pbnQ6IDEyMzQ1XG5teV9mbG9hdDogMC45OTlcbiIsCi0gICAgICAgICAgICB0ZXh0KTsKLX0KLQotY2xhc3MgVGV4dEZvcm1hdFBhcnNlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICB2b2lkIEV4cGVjdEZhaWx1cmUoY29uc3Qgc3RyaW5nJiBpbnB1dCwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjb2wpIHsKLSAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IHByb3RvKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKLSAgICBFeHBlY3RGYWlsdXJlKGlucHV0LCBtZXNzYWdlLCBsaW5lLCBjb2wsIHByb3RvLmdldCgpKTsKLSAgfQotCi0gIHZvaWQgRXhwZWN0RmFpbHVyZShjb25zdCBzdHJpbmcmIGlucHV0LCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgaW50IGNvbCwgTWVzc2FnZSogcHJvdG8pIHsKLSAgICBFeHBlY3RNZXNzYWdlKGlucHV0LCBtZXNzYWdlLCBsaW5lLCBjb2wsIHByb3RvLCBmYWxzZSk7Ci0gIH0KLQotICB2b2lkIEV4cGVjdE1lc3NhZ2UoY29uc3Qgc3RyaW5nJiBpbnB1dCwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgIGludCBjb2wsIE1lc3NhZ2UqIHByb3RvLCBib29sIGV4cGVjdGVkX3Jlc3VsdCkgewotICAgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7Ci0gICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKLSAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcik7Ci0gICAgRVhQRUNUX0VRKGV4cGVjdGVkX3Jlc3VsdCwgcGFyc2VyLlBhcnNlRnJvbVN0cmluZyhpbnB1dCwgcHJvdG8pKQotICAgICAgICA8PCBpbnB1dCA8PCAiIC0+ICIgPDwgcHJvdG8tPkRlYnVnU3RyaW5nKCk7Ci0gICAgRVhQRUNUX0VRKFNpbXBsZUl0b2EobGluZSkgKyAiOiIgKyBTaW1wbGVJdG9hKGNvbCkgKyAiOiAiICsgbWVzc2FnZSArICJcbiIsCi0gICAgICAgICAgICAgIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Ci0gIH0KLQotICB2b2lkIEV4cGVjdFN1Y2Nlc3NBbmRUcmVlKGNvbnN0IHN0cmluZyYgaW5wdXQsIE1lc3NhZ2UqIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSkgewotICAgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7Ci0gICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKLSAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcik7Ci0gICAgcGFyc2VyLldyaXRlTG9jYXRpb25zVG8oaW5mb190cmVlKTsKLQotICAgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoaW5wdXQsIHByb3RvKSk7Ci0gIH0KLQotICB2b2lkIEV4cGVjdExvY2F0aW9uKFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIHRyZWUsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogZCwgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lLAotICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgaW50IGxpbmUsIGludCBjb2x1bW4pIHsKLSAgICBUZXh0Rm9ybWF0OjpQYXJzZUxvY2F0aW9uIGxvY2F0aW9uID0gdHJlZS0+R2V0TG9jYXRpb24oCi0gICAgICAgIGQtPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKSwgaW5kZXgpOwotICAgIEVYUEVDVF9FUShsaW5lLCBsb2NhdGlvbi5saW5lKTsKLSAgICBFWFBFQ1RfRVEoY29sdW1uLCBsb2NhdGlvbi5jb2x1bW4pOwotICB9Ci0KLSAgLy8gQW4gZXJyb3IgY29sbGVjdG9yIHdoaWNoIHNpbXBseSBjb25jYXRlbmF0ZXMgYWxsIGl0cyBlcnJvcnMgaW50byBhIGJpZwotICAvLyBibG9jayBvZiB0ZXh0IHdoaWNoIGNhbiBiZSBjaGVja2VkLgotICBjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgaW86OkVycm9yQ29sbGVjdG9yIHsKLSAgIHB1YmxpYzoKLSAgICBNb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotICAgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotCi0gICAgc3RyaW5nIHRleHRfOwotCi0gICAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgdm9pZCBBZGRFcnJvcihpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZ0ZXh0XywgIiQwOiQxOiAkMlxuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGluZSArIDEsIGNvbHVtbiArIDEsIG1lc3NhZ2UpOwotICAgIH0KLQotICAgIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgICBBZGRFcnJvcihsaW5lLCBjb2x1bW4sICJXQVJOSU5HOiIgKyBtZXNzYWdlKTsKLSAgICB9Ci0gIH07Ci19OwotCi1URVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlSW5mb1RyZWVCdWlsZGluZykgewotICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IG1lc3NhZ2UobmV3IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMpOwotICBjb25zdCBEZXNjcmlwdG9yKiBkID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOwotCi0gIHN0cmluZyBzdHJpbmdEYXRhID0KLSAgICAgICJvcHRpb25hbF9pbnQzMjogMVxuIgotICAgICAgIm9wdGlvbmFsX2ludDY0OiAyXG4iCi0gICAgICAiICBvcHRpb25hbF9kb3VibGU6IDIuNFxuIgotICAgICAgInJlcGVhdGVkX2ludDMyOiA1XG4iCi0gICAgICAicmVwZWF0ZWRfaW50MzI6IDEwXG4iCi0gICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgPFxuIgotICAgICAgIiAgYmI6IDc4XG4iCi0gICAgICAiPlxuIgotICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIDxcbiIKLSAgICAgICIgIGJiOiA3OVxuIgotICAgICAgIj5cbiIKLSAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8XG4iCi0gICAgICAiICBiYjogODBcbiIKLSAgICAgICI+IjsKLQotCi0gIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUgdHJlZTsKLSAgRXhwZWN0U3VjY2Vzc0FuZFRyZWUoc3RyaW5nRGF0YSwgbWVzc2FnZS5nZXQoKSwgJnRyZWUpOwotCi0gIC8vIFZlcmlmeSB0aGF0IHRoZSB0cmVlIGhhcyB0aGUgY29ycmVjdCBwb3NpdGlvbnMuCi0gIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfaW50MzIiLCAtMSwgMCwgMCk7Ci0gIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfaW50NjQiLCAtMSwgMSwgMCk7Ci0gIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfZG91YmxlIiwgLTEsIDIsIDIpOwotCi0gIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfaW50MzIiLCAwLCAzLCAwKTsKLSAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQzMiIsIDEsIDQsIDApOwotCi0gIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiLCAtMSwgNSwgMCk7Ci0gIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiLCAwLCA4LCAwKTsKLSAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIsIDEsIDExLCAwKTsKLQotICAvLyBDaGVjayBmb3IgZmllbGRzIG5vdCBzZXQuIEZvciBhbiBpbnZhbGlkIGZpZWxkLCB0aGUgbG9jYXRpb24gcmV0dXJuZWQKLSAgLy8gc2hvdWxkIGJlIC0xLCAtMS4KLSAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJyZXBlYXRlZF9pbnQ2NCIsIDAsIC0xLCAtMSk7Ci0gIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfaW50MzIiLCA2LCAtMSwgLTEpOwotICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgInNvbWVfdW5rbm93bl9maWVsZCIsIC0xLCAtMSwgLTEpOwotCi0gIC8vIFZlcmlmeSBpbnNpZGUgdGhlIG5lc3RlZCBtZXNzYWdlLgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5lc3RlZF9maWVsZCA9Ci0gICAgICBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7Ci0KLSAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogbmVzdGVkX3RyZWUgPQotICAgICAgdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgLTEpOwotICBFeHBlY3RMb2NhdGlvbihuZXN0ZWRfdHJlZSwgbmVzdGVkX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgImJiIiwgLTEsIDYsIDIpOwotCi0gIC8vIFZlcmlmeSBpbnNpZGUgYW5vdGhlciBuZXN0ZWQgbWVzc2FnZS4KLSAgbmVzdGVkX2ZpZWxkID0gZC0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpOwotICBuZXN0ZWRfdHJlZSA9IHRyZWUuR2V0VHJlZUZvck5lc3RlZChuZXN0ZWRfZmllbGQsIDApOwotICBFeHBlY3RMb2NhdGlvbihuZXN0ZWRfdHJlZSwgbmVzdGVkX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgImJiIiwgLTEsIDksIDIpOwotCi0gIG5lc3RlZF90cmVlID0gdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgMSk7Ci0gIEV4cGVjdExvY2F0aW9uKG5lc3RlZF90cmVlLCBuZXN0ZWRfZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCAiYmIiLCAtMSwgMTIsIDIpOwotCi0gIC8vIFZlcmlmeSBhIE5VTEwgdHJlZSBmb3IgYW4gdW5rbm93biBuZXN0ZWQgZmllbGQuCi0gIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIHVua25vd25fbmVzdGVkX3RyZWUgPQotICAgICAgdHJlZS5HZXRUcmVlRm9yTmVzdGVkKG5lc3RlZF9maWVsZCwgMik7Ci0KLSAgRVhQRUNUX0VRKE5VTEwsIHVua25vd25fbmVzdGVkX3RyZWUpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcpIHsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBtZXNzYWdlKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKLSAgY29uc3QgRGVzY3JpcHRvciogZCA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKLQotI2RlZmluZSBFWFBFQ1RfRklFTEQobmFtZSwgdmFsdWUsIHZhbHVlc3RyaW5nKSBcCi0gIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoIFwKLSAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOyBcCi0gIEVYUEVDVF9FUSh2YWx1ZSwgbWVzc2FnZS0+b3B0aW9uYWxfIyNuYW1lKCkpOyBcCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmhhc19vcHRpb25hbF8jI25hbWUoKSk7Ci0KLSNkZWZpbmUgRVhQRUNUX0JPT0xfRklFTEQobmFtZSwgdmFsdWUsIHZhbHVlc3RyaW5nKSBcCi0gIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRmllbGRWYWx1ZUZyb21TdHJpbmcoIFwKLSAgICB2YWx1ZXN0cmluZywgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF8iICNuYW1lKSwgbWVzc2FnZS5nZXQoKSkpOyBcCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPm9wdGlvbmFsXyMjbmFtZSgpID09IHZhbHVlKTsgXAotICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfIyNuYW1lKCkpOwotCi0jZGVmaW5lIEVYUEVDVF9GTE9BVF9GSUVMRChuYW1lLCB2YWx1ZSwgdmFsdWVzdHJpbmcpIFwKLSAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyggXAotICAgIHZhbHVlc3RyaW5nLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsXyIgI25hbWUpLCBtZXNzYWdlLmdldCgpKSk7IFwKLSAgRVhQRUNUX0ZMT0FUX0VRKHZhbHVlLCBtZXNzYWdlLT5vcHRpb25hbF8jI25hbWUoKSk7IFwKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX29wdGlvbmFsXyMjbmFtZSgpKTsKLQotI2RlZmluZSBFWFBFQ1RfRE9VQkxFX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgXAotICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCBcCi0gICAgdmFsdWVzdHJpbmcsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfIiAjbmFtZSksIG1lc3NhZ2UuZ2V0KCkpKTsgXAotICBFWFBFQ1RfRE9VQkxFX0VRKHZhbHVlLCBtZXNzYWdlLT5vcHRpb25hbF8jI25hbWUoKSk7IFwKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX29wdGlvbmFsXyMjbmFtZSgpKTsKLQotI2RlZmluZSBFWFBFQ1RfSU5WQUxJRChuYW1lLCB2YWx1ZXN0cmluZykgXAotICBFWFBFQ1RfRkFMU0UoVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyggXAotICAgIHZhbHVlc3RyaW5nLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsXyIgI25hbWUpLCBtZXNzYWdlLmdldCgpKSk7Ci0KLSAgLy8gaW50MzIKLSAgRVhQRUNUX0ZJRUxEKGludDMyLCAxLCAiMSIpOwotICBFWFBFQ1RfRklFTEQoaW50MzIsIC0xLCAiLTEiKTsKLSAgRVhQRUNUX0ZJRUxEKGludDMyLCAweDEyMzQsICIweDEyMzQiKTsKLSAgRVhQRUNUX0lOVkFMSUQoaW50MzIsICJhIik7Ci0gIEVYUEVDVF9JTlZBTElEKGludDMyLCAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Iik7Ci0gIEVYUEVDVF9JTlZBTElEKGludDMyLCAiMSwyIik7Ci0KLSAgLy8gaW50NjQKLSAgRVhQRUNUX0ZJRUxEKGludDY0LCAxLCAiMSIpOwotICBFWFBFQ1RfRklFTEQoaW50NjQsIC0xLCAiLTEiKTsKLSAgRVhQRUNUX0ZJRUxEKGludDY0LCAweDEyMzQ1Njc4MTIzNDU2NzhMTCwgIjB4MTIzNDU2NzgxMjM0NTY3OCIpOwotICBFWFBFQ1RfSU5WQUxJRChpbnQ2NCwgImEiKTsKLSAgRVhQRUNUX0lOVkFMSUQoaW50NjQsICI5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKTsKLSAgRVhQRUNUX0lOVkFMSUQoaW50NjQsICIxLDIiKTsKLQotICAvLyB1aW50NjQKLSAgRVhQRUNUX0ZJRUxEKHVpbnQ2NCwgMSwgIjEiKTsKLSAgRVhQRUNUX0ZJRUxEKHVpbnQ2NCwgMHhmMjM0NTY3ODEyMzQ1Njc4VUxMLCAiMHhmMjM0NTY3ODEyMzQ1Njc4Iik7Ci0gIEVYUEVDVF9JTlZBTElEKHVpbnQ2NCwgIi0xIik7Ci0gIEVYUEVDVF9JTlZBTElEKHVpbnQ2NCwgImEiKTsKLSAgRVhQRUNUX0lOVkFMSUQodWludDY0LCAiOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5Iik7Ci0gIEVYUEVDVF9JTlZBTElEKHVpbnQ2NCwgIjEsMiIpOwotCi0gIC8vIGZpeGVkMzIKLSAgRVhQRUNUX0ZJRUxEKGZpeGVkMzIsIDEsICIxIik7Ci0gIEVYUEVDVF9GSUVMRChmaXhlZDMyLCAweDEyMzQ1Njc4LCAiMHgxMjM0NTY3OCIpOwotICBFWFBFQ1RfSU5WQUxJRChmaXhlZDMyLCAiLTEiKTsKLSAgRVhQRUNUX0lOVkFMSUQoZml4ZWQzMiwgImEiKTsKLSAgRVhQRUNUX0lOVkFMSUQoZml4ZWQzMiwgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpOwotICBFWFBFQ1RfSU5WQUxJRChmaXhlZDMyLCAiMSwyIik7Ci0KLSAgLy8gZml4ZWQ2NAotICBFWFBFQ1RfRklFTEQoZml4ZWQ2NCwgMSwgIjEiKTsKLSAgRVhQRUNUX0ZJRUxEKGZpeGVkNjQsIDB4MTIzNDU2NzgxMjM0NTY3OFVMTCwgIjB4MTIzNDU2NzgxMjM0NTY3OCIpOwotICBFWFBFQ1RfSU5WQUxJRChmaXhlZDY0LCAiLTEiKTsKLSAgRVhQRUNUX0lOVkFMSUQoZml4ZWQ2NCwgImEiKTsKLSAgRVhQRUNUX0lOVkFMSUQoZml4ZWQ2NCwgIjk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpOwotICBFWFBFQ1RfSU5WQUxJRChmaXhlZDY0LCAiMSwyIik7Ci0KLSAgLy8gYm9vbAotICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCB0cnVlLCAidHJ1ZSIpOwotICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCBmYWxzZSwgImZhbHNlIik7Ci0gIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIHRydWUsICIxIik7Ci0gIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIHRydWUsICJ0Iik7Ci0gIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIGZhbHNlLCAiMCIpOwotICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCBmYWxzZSwgImYiKTsKLSAgRVhQRUNUX0ZJRUxEKGJvb2wsIHRydWUsICJUcnVlIik7Ci0gIEVYUEVDVF9GSUVMRChib29sLCBmYWxzZSwgIkZhbHNlIik7Ci0gIEVYUEVDVF9JTlZBTElEKGJvb2wsICJ0UnVlIik7Ci0gIEVYUEVDVF9JTlZBTElEKGJvb2wsICJmYUxzZSIpOwotICBFWFBFQ1RfSU5WQUxJRChib29sLCAiMiIpOwotICBFWFBFQ1RfSU5WQUxJRChib29sLCAiLTAiKTsKLSAgRVhQRUNUX0lOVkFMSUQoYm9vbCwgIm9uIik7Ci0gIEVYUEVDVF9JTlZBTElEKGJvb2wsICJhIik7Ci0KLSAgLy8gZmxvYXQKLSAgRVhQRUNUX0ZJRUxEKGZsb2F0LCAxLCAiMSIpOwotICBFWFBFQ1RfRkxPQVRfRklFTEQoZmxvYXQsIDEuNSwgIjEuNSIpOwotICBFWFBFQ1RfRkxPQVRfRklFTEQoZmxvYXQsIDEuNWUzLCAiMS41ZTMiKTsKLSAgRVhQRUNUX0ZMT0FUX0ZJRUxEKGZsb2F0LCAtNC41NSwgIi00LjU1Iik7Ci0gIEVYUEVDVF9JTlZBTElEKGZsb2F0LCAiYSIpOwotICBFWFBFQ1RfSU5WQUxJRChmbG9hdCwgIjEsMiIpOwotCi0gIC8vIGRvdWJsZQotICBFWFBFQ1RfRklFTEQoZG91YmxlLCAxLCAiMSIpOwotICBFWFBFQ1RfRklFTEQoZG91YmxlLCAtMSwgIi0xIik7Ci0gIEVYUEVDVF9ET1VCTEVfRklFTEQoZG91YmxlLCAyLjMsICIyLjMiKTsKLSAgRVhQRUNUX0RPVUJMRV9GSUVMRChkb3VibGUsIDNlNSwgIjNlNSIpOwotICBFWFBFQ1RfSU5WQUxJRChkb3VibGUsICJhIik7Ci0gIEVYUEVDVF9JTlZBTElEKGRvdWJsZSwgIjEsMiIpOwotICAvLyBSZWplY3RzIGhleCBhbmQgb2N0IG51bWJlcnMgZm9yIGEgZG91YmxlIGZpZWxkLgotICBFWFBFQ1RfSU5WQUxJRChkb3VibGUsICIweGYiKTsKLSAgRVhQRUNUX0lOVkFMSUQoZG91YmxlLCAiMDEyIik7Ci0KLSAgLy8gc3RyaW5nCi0gIEVYUEVDVF9GSUVMRChzdHJpbmcsICJoZWxsbyIsICJcImhlbGxvXCIiKTsKLSAgRVhQRUNUX0ZJRUxEKHN0cmluZywgIi0xLjg3IiwgIictMS44NyciKTsKLSAgRVhQRUNUX0lOVkFMSUQoc3RyaW5nLCAiaGVsbG8iKTsgIC8vIHdpdGhvdXQgcXVvdGUgZm9yIHZhbHVlCi0KLSAgLy8gZW51bQotICBFWFBFQ1RfRklFTEQobmVzdGVkX2VudW0sIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgIkJBUiIpOwotICBFWFBFQ1RfRklFTEQobmVzdGVkX2VudW0sIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWiwKLSAgICAgICAgICAgICAgIFNpbXBsZUl0b2EodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaKSk7Ci0gIEVYUEVDVF9JTlZBTElEKG5lc3RlZF9lbnVtLCAiRk9PQkFSIik7Ci0KLSAgLy8gbWVzc2FnZQotICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKAotICAgICI8YmI6MTI+IiwgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpLCBtZXNzYWdlLmdldCgpKSk7Ci0gIEVYUEVDVF9FUSgxMiwgbWVzc2FnZS0+b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKS5iYigpKTsgXAotICBFWFBFQ1RfVFJVRShtZXNzYWdlLT5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9JTlZBTElEKG5lc3RlZF9tZXNzYWdlLCAiYW55Iik7Ci0KLSN1bmRlZiBFWFBFQ1RfRklFTEQKLSN1bmRlZiBFWFBFQ1RfQk9PTF9GSUVMRAotI3VuZGVmIEVYUEVDVF9GTE9BVF9GSUVMRAotI3VuZGVmIEVYUEVDVF9ET1VCTEVfRklFTEQKLSN1bmRlZiBFWFBFQ1RfSU5WQUxJRAotfQotCi0KLVRFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZFRva2VuKSB7Ci0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IHRydWVcbi01XG4iLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iLAotICAgICAgICAgICAgICAgIDIsIDEpOwotCi0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IHRydWUhXG4iLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iLCAxLCAyMCk7Ci0gIEV4cGVjdEZhaWx1cmUoIlwic29tZSBzdHJpbmdcIiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsIDEsIDEpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEludmFsaWRGaWVsZE5hbWUpIHsKLSAgRXhwZWN0RmFpbHVyZSgKLSAgICAgICJpbnZhbGlkX2ZpZWxkOiBzb21ldmFsdWVcbiIsCi0gICAgICAiTWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIgaGFzIG5vIGZpZWxkIG5hbWVkICIKLSAgICAgICJcImludmFsaWRfZmllbGRcIi4iLAotICAgICAgMSwgMTQpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEludmFsaWRDYXBpdGFsaXphdGlvbikgewotICAvLyBXZSByZXF1aXJlIHRoYXQgZ3JvdXAgbmFtZXMgYmUgZXhhY3RseSBhcyB0aGV5IGFwcGVhciBpbiB0aGUgLnByb3RvLgotICBFeHBlY3RGYWlsdXJlKAotICAgICAgIm9wdGlvbmFsZ3JvdXAge1xuYTogMTVcbn1cbiIsCi0gICAgICAiTWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIgaGFzIG5vIGZpZWxkIG5hbWVkICIKLSAgICAgICJcIm9wdGlvbmFsZ3JvdXBcIi4iLAotICAgICAgMSwgMTUpOwotICBFeHBlY3RGYWlsdXJlKAotICAgICAgIk9QVElPTkFMZ3JvdXAge1xuYTogMTVcbn1cbiIsCi0gICAgICAiTWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIgaGFzIG5vIGZpZWxkIG5hbWVkICIKLSAgICAgICJcIk9QVElPTkFMZ3JvdXBcIi4iLAotICAgICAgMSwgMTUpOwotICBFeHBlY3RGYWlsdXJlKAotICAgICAgIk9wdGlvbmFsX0RvdWJsZTogMTAuMFxuIiwKLSAgICAgICJNZXNzYWdlIHR5cGUgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIiBoYXMgbm8gZmllbGQgbmFtZWQgIgotICAgICAgIlwiT3B0aW9uYWxfRG91YmxlXCIuIiwKLSAgICAgIDEsIDE2KTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBBbGxvd0lnbm9yZUNhcGl0YWxpemF0aW9uRXJyb3IpIHsKLSAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwcm90bzsKLQotICAvLyBUaGVzZSBmaWVsZHMgaGF2ZSBhIG1pc21hdGNoaW5nIGNhc2UuCi0gIEVYUEVDVF9GQUxTRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJPcHRpb25hbF9Eb3VibGU6IDEwLjAiLCAmcHJvdG8pKTsKLSAgRVhQRUNUX0ZBTFNFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIm9QdElvTmFMZ1JvVXAgeyBhOiAxNSB9IiwgJnByb3RvKSk7Ci0KLSAgLy8gLi4uIGJ1dCBhcmUgcGFyc2VkIGNvcnJlY3RseSBpZiB3ZSBtYXRjaCBjYXNlIGluc2Vuc2l0aXZlLgotICBwYXJzZXIuQWxsb3dDYXNlSW5zZW5zaXRpdmVGaWVsZCh0cnVlKTsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZygiT3B0aW9uYWxfRG91YmxlOiAxMC4wIiwgJnByb3RvKSk7Ci0gIEVYUEVDVF9FUSgxMC4wLCBwcm90by5vcHRpb25hbF9kb3VibGUoKSk7Ci0gIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIm9QdElvTmFMZ1JvVXAgeyBhOiAxNSB9IiwgJnByb3RvKSk7Ci0gIEVYUEVDVF9FUSgxNSwgcHJvdG8ub3B0aW9uYWxncm91cCgpLmEoKSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgSW52YWxpZEZpZWxkVmFsdWVzKSB7Ci0gIC8vIEludmFsaWQgdmFsdWVzIGZvciBhIGRvdWJsZS9mbG9hdCBmaWVsZC4KLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfZG91YmxlOiBcImhlbGxvXCJcbiIsICJFeHBlY3RlZCBkb3VibGUuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9kb3VibGU6IHRydWVcbiIsICJFeHBlY3RlZCBkb3VibGUuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9kb3VibGU6ICFcbiIsICJFeHBlY3RlZCBkb3VibGUuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9kb3VibGUge1xuICBcbn1cbiIsICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwKLSAgICAgICAgICAgICAgICAxLCAxNyk7Ci0KLSAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGEgc2lnbmVkIGludGVnZXIgZmllbGQuCi0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiBcImhlbGxvXCJcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE3KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IHRydWVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE3KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IDQuNVxuIiwgIkV4cGVjdGVkIGludGVnZXIuIiwgMSwgMTcpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMjogIVxuIiwgIkV4cGVjdGVkIGludGVnZXIuIiwgMSwgMTcpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMiB7XG4gXG59XG4iLCAiRXhwZWN0ZWQgXCI6XCIsIGZvdW5kIFwie1wiLiIsCi0gICAgICAgICAgICAgICAgMSwgMTYpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQzMjogMHg4MDAwMDAwMFxuIiwKLSAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTcpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQ2NDogMHg4MDAwMDAwMDAwMDAwMDAwXG4iLAotICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxNyk7Ci0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDMyOiAtMHg4MDAwMDAwMVxuIiwKLSAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9pbnQ2NDogLTB4ODAwMDAwMDAwMDAwMDAwMVxuIiwKLSAgICAgICAgICAgICAgICAiSW50ZWdlciBvdXQgb2YgcmFuZ2UuIiwgMSwgMTgpOwotCi0gIC8vIEludmFsaWQgdmFsdWVzIGZvciBhbiB1bnNpZ25lZCBpbnRlZ2VyIGZpZWxkLgotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF91aW50NjQ6IFwiaGVsbG9cIlxuIiwgIkV4cGVjdGVkIGludGVnZXIuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF91aW50NjQ6IHRydWVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE4KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiA0LjVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE4KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiAtNVxuIiwgIkV4cGVjdGVkIGludGVnZXIuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF91aW50NjQ6ICFcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDE4KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0IHtcbiBcbn1cbiIsICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwKLSAgICAgICAgICAgICAgICAxLCAxNyk7Ci0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX3VpbnQzMjogMHgxMDAwMDAwMDBcbiIsCi0gICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE4KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfdWludDY0OiAweDEwMDAwMDAwMDAwMDAwMDAwXG4iLAotICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxOCk7Ci0KLSAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGEgYm9vbGVhbiBmaWVsZC4KLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbDogXCJoZWxsb1wiXG4iLCAiRXhwZWN0ZWQgaWRlbnRpZmllci4iLCAxLCAxNik7Ci0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IDVcbiIsICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxNik7Ci0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2Jvb2w6IC03LjVcbiIsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsIDEsIDE2KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfYm9vbDogIVxuIiwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIiwgMSwgMTYpOwotCi0gIEV4cGVjdEZhaWx1cmUoCi0gICAgICAib3B0aW9uYWxfYm9vbDogbWVoXG4iLAotICAgICAgIkludmFsaWQgdmFsdWUgZm9yIGJvb2xlYW4gZmllbGQgXCJvcHRpb25hbF9ib29sXCIuIFZhbHVlOiBcIm1laFwiLiIsCi0gICAgICAyLCAxKTsKLQotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9ib29sIHtcbiBcbn1cbiIsICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwKLSAgICAgICAgICAgICAgICAxLCAxNSk7Ci0KLSAgLy8gSW52YWxpZCB2YWx1ZXMgZm9yIGEgc3RyaW5nIGZpZWxkLgotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9zdHJpbmc6IHRydWVcbiIsICJFeHBlY3RlZCBzdHJpbmcuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9zdHJpbmc6IDVcbiIsICJFeHBlY3RlZCBzdHJpbmcuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9zdHJpbmc6IC03LjVcbiIsICJFeHBlY3RlZCBzdHJpbmcuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9zdHJpbmc6ICFcbiIsICJFeHBlY3RlZCBzdHJpbmcuIiwgMSwgMTgpOwotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9zdHJpbmcge1xuIFxufVxuIiwgIkV4cGVjdGVkIFwiOlwiLCBmb3VuZCBcIntcIi4iLAotICAgICAgICAgICAgICAgIDEsIDE3KTsKLQotICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYW4gZW51bWVyYXRpb24gZmllbGQuCi0gIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX25lc3RlZF9lbnVtOiBcImhlbGxvXCJcbiIsCi0gICAgICAgICAgICAgICAgIkV4cGVjdGVkIGludGVnZXIgb3IgaWRlbnRpZmllci4iLCAxLCAyMyk7Ci0KLSAgLy8gVmFsaWQgdG9rZW4sIGJ1dCBlbnVtIHZhbHVlIGlzIG5vdCBkZWZpbmVkLgotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfZW51bTogNVxuIiwKLSAgICAgICAgICAgICAgICAiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcIjVcIiBmb3IgZmllbGQgIgotICAgICAgICAgICAgICAgICJcIm9wdGlvbmFsX25lc3RlZF9lbnVtXCIuIiwgMiwgMSk7Ci0gIC8vIFdlIGNvbnN1bWUgdGhlIG5lZ2F0aXZlIHNpZ24sIHNvIHRoZSBlcnJvciBwb3NpdGlvbiBzdGFydHMgb25lIGNoYXJhY3RlcgotICAvLyBsYXRlci4KLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfbmVzdGVkX2VudW06IC03LjVcbiIsICJFeHBlY3RlZCBpbnRlZ2VyLiIsIDEsIDI0KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfbmVzdGVkX2VudW06ICFcbiIsCi0gICAgICAgICAgICAgICAgIkV4cGVjdGVkIGludGVnZXIgb3IgaWRlbnRpZmllci4iLCAxLCAyMyk7Ci0KLSAgRXhwZWN0RmFpbHVyZSgKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogZ3JhaFxuIiwKLSAgICAgICJVbmtub3duIGVudW1lcmF0aW9uIHZhbHVlIG9mIFwiZ3JhaFwiIGZvciBmaWVsZCAiCi0gICAgICAiXCJvcHRpb25hbF9uZXN0ZWRfZW51bVwiLiIsIDIsIDEpOwotCi0gIEV4cGVjdEZhaWx1cmUoCi0gICAgICAib3B0aW9uYWxfbmVzdGVkX2VudW0ge1xuIFxufVxuIiwKLSAgICAgICJFeHBlY3RlZCBcIjpcIiwgZm91bmQgXCJ7XCIuIiwgMSwgMjIpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIE1lc3NhZ2VEZWxpbWl0ZXJzKSB7Ci0gIC8vIE5vbi1tYXRjaGluZyBkZWxpbWl0ZXJzLgotICBFeHBlY3RGYWlsdXJlKCJPcHRpb25hbEdyb3VwIDxcbiBcbn1cbiIsICJFeHBlY3RlZCBcIj5cIiwgZm91bmQgXCJ9XCIuIiwKLSAgICAgICAgICAgICAgICAzLCAxKTsKLQotICAvLyBJbnZhbGlkIGRlbGltaXRlcnMuCi0gIEV4cGVjdEZhaWx1cmUoIk9wdGlvbmFsR3JvdXAgW1xuIFxuXVxuIiwgIkV4cGVjdGVkIFwie1wiLCBmb3VuZCBcIltcIi4iLAotICAgICAgICAgICAgICAgIDEsIDE1KTsKLQotICAvLyBVbmVuZGluZyBtZXNzYWdlLgotICBFeHBlY3RGYWlsdXJlKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB7XG4gXG5iYjogMTE4XG4iLAotICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpZGVudGlmaWVyLiIsCi0gICAgICAgICAgICAgICAgNCwgMSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgVW5rbm93bkV4dGVuc2lvbikgewotICAvLyBOb24tbWF0Y2hpbmcgZGVsaW1pdGVycy4KLSAgRXhwZWN0RmFpbHVyZSgiW2JsYWhibGFoXTogMTIzIiwKLSAgICAgICAgICAgICAgICAiRXh0ZW5zaW9uIFwiYmxhaGJsYWhcIiBpcyBub3QgZGVmaW5lZCBvciBpcyBub3QgYW4gIgotICAgICAgICAgICAgICAgICJleHRlbnNpb24gb2YgXCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXNcIi4iLAotICAgICAgICAgICAgICAgIDEsIDExKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBNaXNzaW5nUmVxdWlyZWQpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOwotICBFeHBlY3RGYWlsdXJlKCJhOiAxIiwKLSAgICAgICAgICAgICAgICAiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYiwgYyIsCi0gICAgICAgICAgICAgICAgMCwgMSwgJm1lc3NhZ2UpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFBhcnNlRHVwbGljYXRlUmVxdWlyZWQpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOwotICBFeHBlY3RGYWlsdXJlKCJhOiAxIGI6IDIgYzogMyBhOiAxIiwKLSAgICAgICAgICAgICAgICAiTm9uLXJlcGVhdGVkIGZpZWxkIFwiYVwiIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4iLAotICAgICAgICAgICAgICAgIDEsIDE3LCAmbWVzc2FnZSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgUGFyc2VEdXBsaWNhdGVPcHRpb25hbCkgewotICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UgbWVzc2FnZTsKLSAgRXhwZWN0RmFpbHVyZSgiYzogMSBjOiAyIiwKLSAgICAgICAgICAgICAgICAiTm9uLXJlcGVhdGVkIGZpZWxkIFwiY1wiIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4iLAotICAgICAgICAgICAgICAgIDEsIDcsICZtZXNzYWdlKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBNZXJnZUR1cGxpY2F0ZVJlcXVpcmVkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKLSAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLk1lcmdlRnJvbVN0cmluZygiYTogMSBiOiAyIGM6IDMgYTogNCIsICZtZXNzYWdlKSk7Ci0gIEVYUEVDVF9FUSg0LCBtZXNzYWdlLmEoKSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgTWVyZ2VEdXBsaWNhdGVPcHRpb25hbCkgewotICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UgbWVzc2FnZTsKLSAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKLSAgRVhQRUNUX1RSVUUocGFyc2VyLk1lcmdlRnJvbVN0cmluZygiYzogMSBjOiAyIiwgJm1lc3NhZ2UpKTsKLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UuYygpKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBFeHBsaWNpdERlbGltaXRlcnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZCBtZXNzYWdlOwotICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoImE6MSxiOjI7YzozIiwgJm1lc3NhZ2UpKTsKLSAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UuYSgpKTsKLSAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UuYigpKTsKLSAgRVhQRUNUX0VRKDMsIG1lc3NhZ2UuYygpKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQcmludEVycm9yc1RvU3RkZXJyKSB7Ci0gIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKLQotICB7Ci0gICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKLSAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHByb3RvOwotICAgIEVYUEVDVF9GQUxTRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoIm5vX3N1Y2hfZmllbGQ6IDEiLCAmcHJvdG8pKTsKLSAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOwotICB9Ci0KLSAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOwotICBFWFBFQ1RfRVEoIkVycm9yIHBhcnNpbmcgdGV4dC1mb3JtYXQgcHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzOiAiCi0gICAgICAgICAgICAiMToxNDogTWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIgaGFzIG5vIGZpZWxkICIKLSAgICAgICAgICAgICJuYW1lZCBcIm5vX3N1Y2hfZmllbGRcIi4iLAotICAgICAgICAgICAgZXJyb3JzWzBdKTsKLX0KLQotVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBGYWlsc09uVG9rZW5pemF0aW9uRXJyb3IpIHsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotCi0gIHsKLSAgICBTY29wZWRNZW1vcnlMb2cgbG9nOwotICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG87Ci0gICAgRVhQRUNUX0ZBTFNFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygiXDAyMCIsICZwcm90bykpOwotICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7Ci0gIH0KLQotICBBU1NFUlRfRVEoMSwgZXJyb3JzLnNpemUoKSk7Ci0gIEVYUEVDVF9FUSgiRXJyb3IgcGFyc2luZyB0ZXh0LWZvcm1hdCBwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXM6ICIKLSAgICAgICAgICAgICIxOjE6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuIiwKLSAgICAgICAgICAgIGVycm9yc1swXSk7Ci19Ci0KLVRFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgUGFyc2VEZXByZWNhdGVkRmllbGQpIHsKLSAgdW5pdHRlc3Q6OlRlc3REZXByZWNhdGVkRmllbGRzIG1lc3NhZ2U7Ci0gIEV4cGVjdE1lc3NhZ2UoImRlcHJlY2F0ZWRfaW50MzI6IDQyIiwKLSAgICAgICAgICAgICAgICAiV0FSTklORzp0ZXh0IGZvcm1hdCBjb250YWlucyBkZXByZWNhdGVkIGZpZWxkICIKLSAgICAgICAgICAgICAgICAiXCJkZXByZWNhdGVkX2ludDMyXCIiLCAxLCAyMSwgJm1lc3NhZ2UsIHRydWUpOwotfQotCi1jbGFzcyBUZXh0Rm9ybWF0TWVzc2FnZVNldFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBzdGF0aWMgY29uc3QgY2hhciBwcm90b19kZWJ1Z19zdHJpbmdfW107Ci19OwotY29uc3QgY2hhciBUZXh0Rm9ybWF0TWVzc2FnZVNldFRlc3Q6OnByb3RvX2RlYnVnX3N0cmluZ19bXSA9Ci0ibWVzc2FnZV9zZXQge1xuIgotIiAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMV0ge1xuIgotIiAgICBpOiAyM1xuIgotIiAgfVxuIgotIiAgW3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMl0ge1xuIgotIiAgICBzdHI6IFwiZm9vXCJcbiIKLSIgIH1cbiIKLSJ9XG4iOwotCi0KLVRFU1RfRihUZXh0Rm9ybWF0TWVzc2FnZVNldFRlc3QsIFNlcmlhbGl6ZSkgewotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRDb250YWluZXIgcHJvdG87Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIGl0ZW1fYSA9Ci0gICAgcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3NldCgpLT5NdXRhYmxlRXh0ZW5zaW9uKAotICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKLSAgaXRlbV9hLT5zZXRfaSgyMyk7Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIqIGl0ZW1fYiA9Ci0gICAgcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3NldCgpLT5NdXRhYmxlRXh0ZW5zaW9uKAotICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKLSAgaXRlbV9iLT5zZXRfc3RyKCJmb28iKTsKLSAgRVhQRUNUX0VRKHByb3RvX2RlYnVnX3N0cmluZ18sIHByb3RvLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVGV4dEZvcm1hdE1lc3NhZ2VTZXRUZXN0LCBEZXNlcmlhbGl6ZSkgewotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRDb250YWluZXIgcHJvdG87Ci0gIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhwcm90b19kZWJ1Z19zdHJpbmdfLCAmcHJvdG8pKTsKLSAgRVhQRUNUX0VRKDIzLCBwcm90by5tZXNzYWdlX3NldCgpLkdldEV4dGVuc2lvbigKLSAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLmkoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgcHJvdG8ubWVzc2FnZV9zZXQoKS5HZXRFeHRlbnNpb24oCi0gICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5zdHIoKSk7Ci0KLSAgLy8gRW5zdXJlIHRoYXQgdGhlc2UgYXJlIHRoZSBvbmx5IGVudHJpZXMgcHJlc2VudC4KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOwotICBwcm90by5tZXNzYWdlX3NldCgpLkdldFJlZmxlY3Rpb24oKS0+TGlzdEZpZWxkcygKLSAgICBwcm90by5tZXNzYWdlX3NldCgpLCAmZGVzY3JpcHRvcnMpOwotICBFWFBFQ1RfRVEoMiwgZGVzY3JpcHRvcnMuc2l6ZSgpKTsKLX0KLQotCi19ICAvLyBuYW1lc3BhY2UgdGV4dF9mb3JtYXRfdW5pdHRlc3QKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGRhNTZhZTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDg3OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gQSBwcm90byBmaWxlIHdlIHdpbGwgdXNlIGZvciB1bml0IHRlc3RpbmcuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi0vLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCi0vLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdAotb3B0aW9uIGNjX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAotb3B0aW9uIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IHRydWU7ICAgLy8gYXV0by1hZGRlZAotb3B0aW9uIHB5X2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgICAgLy8gYXV0by1hZGRlZAotb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iOwotCi0vLyBXZSBkb24ndCBwdXQgdGhpcyBpbiBhIHBhY2thZ2Ugd2l0aGluIHByb3RvMiBiZWNhdXNlIHdlIG5lZWQgdG8gbWFrZSBzdXJlCi0vLyB0aGF0IHRoZSBnZW5lcmF0ZWQgY29kZSBkb2Vzbid0IGRlcGVuZCBvbiBiZWluZyBpbiB0aGUgcHJvdG8yIG5hbWVzcGFjZS4KLS8vIEluIHRlc3RfdXRpbC5oIHdlIGRvICJ1c2luZyBuYW1lc3BhY2UgdW5pdHRlc3QgPSBwcm90b2J1Zl91bml0dGVzdCIuCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi0vLyBQcm90b3Mgb3B0aW1pemVkIGZvciBTUEVFRCB1c2UgYSBzdHJpY3Qgc3VwZXJzZXQgb2YgdGhlIGdlbmVyYXRlZCBjb2RlCi0vLyBvZiBlcXVpdmFsZW50IG9uZXMgb3B0aW1pemVkIGZvciBDT0RFX1NJWkUsIHNvIHdlIHNob3VsZCBvcHRpbWl6ZSBhbGwgb3VyCi0vLyB0ZXN0cyBmb3Igc3BlZWQgdW5sZXNzIGV4cGxpY2l0bHkgdGVzdGluZyBjb2RlIHNpemUgb3B0aW1pemF0aW9uLgotb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOwotCi1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVW5pdHRlc3RQcm90byI7Ci0KLS8vIFRoaXMgcHJvdG8gaW5jbHVkZXMgZXZlcnkgdHlwZSBvZiBmaWVsZCBpbiBib3RoIHNpbmd1bGFyIGFuZCByZXBlYXRlZAotLy8gZm9ybXMuCi1tZXNzYWdlIFRlc3RBbGxUeXBlcyB7Ci0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgLy8gVGhlIGZpZWxkIG5hbWUgImIiIGZhaWxzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIGJlY2F1c2UgaXQgY29uZmxpY3RzIHdpdGgKLSAgICAvLyBhIGxvY2FsIHZhcmlhYmxlIG5hbWVkICJiIiBpbiBvbmUgb2YgdGhlIGdlbmVyYXRlZCBtZXRob2RzLiAgRG9oLgotICAgIC8vIFRoaXMgZmlsZSBuZWVkcyB0byBjb21waWxlIGluIHByb3RvMSB0byB0ZXN0IGJhY2t3YXJkcy1jb21wYXRpYmlsaXR5LgotICAgIG9wdGlvbmFsIGludDMyIGJiID0gMTsKLSAgfQotCi0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgRk9PID0gMTsKLSAgICBCQVIgPSAyOwotICAgIEJBWiA9IDM7Ci0gICAgTkVHID0gLTE7ICAvLyBJbnRlbnRpb25hbGx5IG5lZ2F0aXZlLgotICB9Ci0KLSAgLy8gU2luZ3VsYXIKLSAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzIgICAgPSAgMTsKLSAgb3B0aW9uYWwgICAgaW50NjQgb3B0aW9uYWxfaW50NjQgICAgPSAgMjsKLSAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyICAgPSAgMzsKLSAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0ICAgPSAgNDsKLSAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKLSAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0ICAgPSAgNjsKLSAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMiAgPSAgNzsKLSAgb3B0aW9uYWwgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NCAgPSAgODsKLSAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzIgPSAgOTsKLSAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjQgPSAxMDsKLSAgb3B0aW9uYWwgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXQgICAgPSAxMTsKLSAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlICAgPSAxMjsKLSAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbCAgICAgPSAxMzsKLSAgb3B0aW9uYWwgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nICAgPSAxNDsKLSAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXMgICAgPSAxNTsKLQotICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTYgewotICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKLSAgfQotCi0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAxODsKLSAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSA9IDE5OwotICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgPSAyMDsKLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW0gICAgID0gMjE7Ci0gIG9wdGlvbmFsIEZvcmVpZ25FbnVtICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25hbF9mb3JlaWduX2VudW0gICAgPSAyMjsKLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0gICAgb3B0aW9uYWxfaW1wb3J0X2VudW0gICAgID0gMjM7Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZSA9IDI0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOwotICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfY29yZCA9IDI1IFtjdHlwZT1DT1JEXTsKLQotICAvLyBEZWZpbmVkIGluIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2UKLSAgICAgIG9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSA9IDI2OwotCi0gIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbGF6eV9tZXNzYWdlID0gMjcgW2xhenk9dHJ1ZV07Ci0KLSAgLy8gUmVwZWF0ZWQKLSAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzIgICAgPSAzMTsKLSAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjQgICAgPSAzMjsKLSAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyICAgPSAzMzsKLSAgcmVwZWF0ZWQgICB1aW50NjQgcmVwZWF0ZWRfdWludDY0ICAgPSAzNDsKLSAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyICAgPSAzNTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0ICAgPSAzNjsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMiAgPSAzNzsKLSAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NCAgPSAzODsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzIgPSAzOTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjQgPSA0MDsKLSAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXQgICAgPSA0MTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlICAgPSA0MjsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgcmVwZWF0ZWRfYm9vbCAgICAgPSA0MzsKLSAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nICAgPSA0NDsKLSAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXMgICAgPSA0NTsKLQotICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gNDYgewotICAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKLSAgfQotCi0gIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAgPSA0ODsKLSAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2UgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSA9IDQ5OwotICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZSByZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAgPSA1MDsKLQotICByZXBlYXRlZCBOZXN0ZWRFbnVtICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX2VudW0gICAgID0gNTE7Ci0gIHJlcGVhdGVkIEZvcmVpZ25FbnVtICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZF9mb3JlaWduX2VudW0gICAgPSA1MjsKLSAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0gICAgcmVwZWF0ZWRfaW1wb3J0X2VudW0gICAgID0gNTM7Ci0KLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZSA9IDU0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOwotICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZCA9IDU1IFtjdHlwZT1DT1JEXTsKLQotICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX2xhenlfbWVzc2FnZSA9IDU3IFtsYXp5PXRydWVdOwotCi0gIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKLSAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07Ci0gIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjQgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOwotICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMiAgID0gNjMgW2RlZmF1bHQgPSAgNDMgICAgXTsKLSAgb3B0aW9uYWwgICB1aW50NjQgZGVmYXVsdF91aW50NjQgICA9IDY0IFtkZWZhdWx0ID0gIDQ0ICAgIF07Ci0gIG9wdGlvbmFsICAgc2ludDMyIGRlZmF1bHRfc2ludDMyICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOwotICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NCAgID0gNjYgW2RlZmF1bHQgPSAgNDYgICAgXTsKLSAgb3B0aW9uYWwgIGZpeGVkMzIgZGVmYXVsdF9maXhlZDMyICA9IDY3IFtkZWZhdWx0ID0gIDQ3ICAgIF07Ci0gIG9wdGlvbmFsICBmaXhlZDY0IGRlZmF1bHRfZml4ZWQ2NCAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOwotICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyID0gNjkgW2RlZmF1bHQgPSAgNDkgICAgXTsKLSAgb3B0aW9uYWwgc2ZpeGVkNjQgZGVmYXVsdF9zZml4ZWQ2NCA9IDcwIFtkZWZhdWx0ID0gLTUwICAgIF07Ci0gIG9wdGlvbmFsICAgIGZsb2F0IGRlZmF1bHRfZmxvYXQgICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOwotICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZSAgID0gNzIgW2RlZmF1bHQgPSAgNTJlMyAgXTsKLSAgb3B0aW9uYWwgICAgIGJvb2wgZGVmYXVsdF9ib29sICAgICA9IDczIFtkZWZhdWx0ID0gdHJ1ZSAgIF07Ci0gIG9wdGlvbmFsICAgc3RyaW5nIGRlZmF1bHRfc3RyaW5nICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOwotICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzICAgID0gNzUgW2RlZmF1bHQgPSAid29ybGQiXTsKLQotICBvcHRpb25hbCBOZXN0ZWRFbnVtICBkZWZhdWx0X25lc3RlZF9lbnVtICA9IDgxIFtkZWZhdWx0ID0gQkFSICAgICAgICBdOwotICBvcHRpb25hbCBGb3JlaWduRW51bSBkZWZhdWx0X2ZvcmVpZ25fZW51bSA9IDgyIFtkZWZhdWx0ID0gRk9SRUlHTl9CQVJdOwotICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQotICAgICAgZGVmYXVsdF9pbXBvcnRfZW51bSA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0JBUl07Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSxkZWZhdWx0PSJhYmMiXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZCA9IDg1IFtjdHlwZT1DT1JELGRlZmF1bHQ9IjEyMyJdOwotCi0gIC8vIEZvciBvbmVvZiB0ZXN0Ci0gIG9uZW9mIG9uZW9mX2ZpZWxkIHsKLSAgICB1aW50MzIgb25lb2ZfdWludDMyID0gMTExOwotICAgIE5lc3RlZE1lc3NhZ2Ugb25lb2ZfbmVzdGVkX21lc3NhZ2UgPSAxMTI7Ci0gICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDExMzsKLSAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDExNDsKLSAgfQotfQotCi0vLyBUaGlzIHByb3RvIGluY2x1ZGVzIGEgcmVjdXNpdmVseSBuZXN0ZWQgbWVzc2FnZS4KLW1lc3NhZ2UgTmVzdGVkVGVzdEFsbFR5cGVzIHsKLSAgb3B0aW9uYWwgTmVzdGVkVGVzdEFsbFR5cGVzIGNoaWxkID0gMTsKLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIHBheWxvYWQgPSAyOwotICByZXBlYXRlZCBOZXN0ZWRUZXN0QWxsVHlwZXMgcmVwZWF0ZWRfY2hpbGQgPSAzOwotfQotCi1tZXNzYWdlIFRlc3REZXByZWNhdGVkRmllbGRzIHsKLSAgb3B0aW9uYWwgaW50MzIgZGVwcmVjYXRlZF9pbnQzMiA9IDEgW2RlcHJlY2F0ZWQ9dHJ1ZV07Ci19Ci0KLS8vIERlZmluZSB0aGVzZSBhZnRlciBUZXN0QWxsVHlwZXMgdG8gbWFrZSBzdXJlIHRoZSBjb21waWxlciBjYW4gaGFuZGxlCi0vLyB0aGF0LgotbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIGludDMyIGMgPSAxOwotfQotCi1lbnVtIEZvcmVpZ25FbnVtIHsKLSAgRk9SRUlHTl9GT08gPSA0OwotICBGT1JFSUdOX0JBUiA9IDU7Ci0gIEZPUkVJR05fQkFaID0gNjsKLX0KLQotbWVzc2FnZSBUZXN0UmVzZXJ2ZWRGaWVsZHMgewotICByZXNlcnZlZCAyLCAxNSwgOSB0byAxMTsKLSAgcmVzZXJ2ZWQgImJhciIsICJiYXoiOwotfQotCi1tZXNzYWdlIFRlc3RBbGxFeHRlbnNpb25zIHsKLSAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKLX0KLQotZXh0ZW5kIFRlc3RBbGxFeHRlbnNpb25zIHsKLSAgLy8gU2luZ3VsYXIKLSAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAgID0gIDE7Ci0gIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbiAgICA9ICAyOwotICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzJfZXh0ZW5zaW9uICAgPSAgMzsKLSAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbiAgID0gIDQ7Ci0gIG9wdGlvbmFsICAgc2ludDMyIG9wdGlvbmFsX3NpbnQzMl9leHRlbnNpb24gICA9ICA1OwotICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjRfZXh0ZW5zaW9uICAgPSAgNjsKLSAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb24gID0gIDc7Ci0gIG9wdGlvbmFsICBmaXhlZDY0IG9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uICA9ICA4OwotICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb24gPSAgOTsKLSAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gMTA7Ci0gIG9wdGlvbmFsICAgIGZsb2F0IG9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICA9IDExOwotICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICAgPSAxMjsKLSAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgID0gMTM7Ci0gIG9wdGlvbmFsICAgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICA9IDE0OwotICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICAgPSAxNTsKLQotICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbiA9IDE2IHsKLSAgICBvcHRpb25hbCBpbnQzMiBhID0gMTc7Ci0gIH0KLQotICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gPSAxODsKLSAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2Ugb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiA9IDE5OwotICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZQotICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDIwOwotCi0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtIG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbiA9IDIxOwotICBvcHRpb25hbCBGb3JlaWduRW51bSBvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uID0gMjI7Ci0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtCi0gICAgb3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uID0gMjM7Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24gPSAyNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uID0gMjUgW2N0eXBlPUNPUkRdOwotCi0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJbXBvcnRNZXNzYWdlCi0gICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI2OwotCi0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlCi0gICAgb3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiA9IDI3IFtsYXp5PXRydWVdOwotCi0gIC8vIFJlcGVhdGVkCi0gIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICA9IDMxOwotICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAzMjsKLSAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiAgID0gMzM7Ci0gIHJlcGVhdGVkICAgdWludDY0IHJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24gICA9IDM0OwotICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAzNTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiAgID0gMzY7Ci0gIHJlcGVhdGVkICBmaXhlZDMyIHJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uICA9IDM3OwotICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAzODsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gMzk7Ci0gIHJlcGVhdGVkIHNmaXhlZDY0IHJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiA9IDQwOwotICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAgPSA0MTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgID0gNDI7Ci0gIHJlcGVhdGVkICAgICBib29sIHJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDQzOwotICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAgPSA0NDsKLSAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgID0gNDU7Ci0KLSAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24gPSA0NiB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OwotICB9Ci0KLSAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uID0gNDg7Ci0gIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gPSA0OTsKLSAgcmVwZWF0ZWQgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UKLSAgICByZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gPSA1MDsKLQotICByZXBlYXRlZCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gPSA1MTsKLSAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiA9IDUyOwotICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0RW51bQotICAgIHJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiA9IDUzOwotCi0gIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07Ci0gIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkX2V4dGVuc2lvbiA9IDU1IFtjdHlwZT1DT1JEXTsKLQotICByZXBlYXRlZCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZQotICAgIHJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gPSA1NyBbbGF6eT10cnVlXTsKLQotICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCi0gIG9wdGlvbmFsICAgIGludDMyIGRlZmF1bHRfaW50MzJfZXh0ZW5zaW9uICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKLSAgb3B0aW9uYWwgICAgaW50NjQgZGVmYXVsdF9pbnQ2NF9leHRlbnNpb24gICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOwotICBvcHRpb25hbCAgIHVpbnQzMiBkZWZhdWx0X3VpbnQzMl9leHRlbnNpb24gICA9IDYzIFtkZWZhdWx0ID0gIDQzICAgIF07Ci0gIG9wdGlvbmFsICAgdWludDY0IGRlZmF1bHRfdWludDY0X2V4dGVuc2lvbiAgID0gNjQgW2RlZmF1bHQgPSAgNDQgICAgXTsKLSAgb3B0aW9uYWwgICBzaW50MzIgZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uICAgPSA2NSBbZGVmYXVsdCA9IC00NSAgICBdOwotICBvcHRpb25hbCAgIHNpbnQ2NCBkZWZhdWx0X3NpbnQ2NF9leHRlbnNpb24gICA9IDY2IFtkZWZhdWx0ID0gIDQ2ICAgIF07Ci0gIG9wdGlvbmFsICBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb24gID0gNjcgW2RlZmF1bHQgPSAgNDcgICAgXTsKLSAgb3B0aW9uYWwgIGZpeGVkNjQgZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbiAgPSA2OCBbZGVmYXVsdCA9ICA0OCAgICBdOwotICBvcHRpb25hbCBzZml4ZWQzMiBkZWZhdWx0X3NmaXhlZDMyX2V4dGVuc2lvbiA9IDY5IFtkZWZhdWx0ID0gIDQ5ICAgIF07Ci0gIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uID0gNzAgW2RlZmF1bHQgPSAtNTAgICAgXTsKLSAgb3B0aW9uYWwgICAgZmxvYXQgZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICAgPSA3MSBbZGVmYXVsdCA9ICA1MS41ICBdOwotICBvcHRpb25hbCAgIGRvdWJsZSBkZWZhdWx0X2RvdWJsZV9leHRlbnNpb24gICA9IDcyIFtkZWZhdWx0ID0gIDUyZTMgIF07Ci0gIG9wdGlvbmFsICAgICBib29sIGRlZmF1bHRfYm9vbF9leHRlbnNpb24gICAgID0gNzMgW2RlZmF1bHQgPSB0cnVlICAgXTsKLSAgb3B0aW9uYWwgICBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICAgPSA3NCBbZGVmYXVsdCA9ICJoZWxsbyJdOwotICBvcHRpb25hbCAgICBieXRlcyBkZWZhdWx0X2J5dGVzX2V4dGVuc2lvbiAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07Ci0KLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0KLSAgICBkZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbiA9IDgxIFtkZWZhdWx0ID0gQkFSXTsKLSAgb3B0aW9uYWwgRm9yZWlnbkVudW0KLSAgICBkZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb24gPSA4MiBbZGVmYXVsdCA9IEZPUkVJR05fQkFSXTsKLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW0KLSAgICBkZWZhdWx0X2ltcG9ydF9lbnVtX2V4dGVuc2lvbiA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0JBUl07Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJjIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uID0gODUgW2N0eXBlPUNPUkQsIGRlZmF1bHQ9IjEyMyJdOwotCi0gIC8vIEZvciBvbmVvZiB0ZXN0Ci0gIG9wdGlvbmFsIHVpbnQzMiBvbmVvZl91aW50MzJfZXh0ZW5zaW9uID0gMTExOwotICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gPSAxMTI7Ci0gIG9wdGlvbmFsIHN0cmluZyBvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uID0gMTEzOwotICBvcHRpb25hbCBieXRlcyBvbmVvZl9ieXRlc19leHRlbnNpb24gPSAxMTQ7Ci19Ci0KLW1lc3NhZ2UgVGVzdE5lc3RlZEV4dGVuc2lvbiB7Ci0gIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7Ci0gICAgLy8gQ2hlY2sgZm9yIGJ1ZyB3aGVyZSBzdHJpbmcgZXh0ZW5zaW9ucyBkZWNsYXJlZCBpbiB0ZXN0ZWQgc2NvcGUgZGlkIG5vdAotICAgIC8vIGNvbXBpbGUuCi0gICAgb3B0aW9uYWwgc3RyaW5nIHRlc3QgPSAxMDAyIFtkZWZhdWx0PSJ0ZXN0Il07Ci0gICAgLy8gVXNlZCB0byB0ZXN0IGlmIGdlbmVyYXRlZCBleHRlbnNpb24gbmFtZSBpcyBjb3JyZWN0IHdoZW4gdGhlcmUgYXJlCi0gICAgLy8gdW5kZXJzY29yZXMuCi0gICAgb3B0aW9uYWwgc3RyaW5nIG5lc3RlZF9zdHJpbmdfZXh0ZW5zaW9uID0gMTAwMzsKLSAgfQotfQotCi0vLyBXZSBoYXZlIHNlcGFyYXRlIG1lc3NhZ2VzIGZvciB0ZXN0aW5nIHJlcXVpcmVkIGZpZWxkcyBiZWNhdXNlIGl0J3MKLS8vIGFubm95aW5nIHRvIGhhdmUgdG8gZmlsbCBpbiByZXF1aXJlZCBmaWVsZHMgaW4gVGVzdFByb3RvIGluIG9yZGVyIHRvCi0vLyBkbyBhbnl0aGluZyB3aXRoIGl0LiAgTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gdGVzdCBldmVyeSB0eXBlIG9mCi0vLyByZXF1aXJlZCBmaWxlZCBiZWNhdXNlIHRoZSBjb2RlIG91dHB1dCBpcyBiYXNpY2FsbHkgaWRlbnRpY2FsIHRvCi0vLyBvcHRpb25hbCBmaWVsZHMgZm9yIGFsbCB0eXBlcy4KLW1lc3NhZ2UgVGVzdFJlcXVpcmVkIHsKLSAgcmVxdWlyZWQgaW50MzIgYSA9IDE7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MiA9IDI7Ci0gIHJlcXVpcmVkIGludDMyIGIgPSAzOwotCi0gIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7Ci0gICAgb3B0aW9uYWwgVGVzdFJlcXVpcmVkIHNpbmdsZSA9IDEwMDA7Ci0gICAgcmVwZWF0ZWQgVGVzdFJlcXVpcmVkIG11bHRpICA9IDEwMDE7Ci0gIH0KLQotICAvLyBQYWQgdGhlIGZpZWxkIGNvdW50IHRvIDMyIHNvIHRoYXQgd2UgY2FuIHRlc3QgdGhhdCBJc0luaXRpYWxpemVkKCkKLSAgLy8gcHJvcGVybHkgY2hlY2tzIG11bHRpcGxlIGVsZW1lbnRzIG9mIGhhc19iaXRzXy4KLSAgb3B0aW9uYWwgaW50MzIgZHVtbXk0ICA9ICA0OwotICBvcHRpb25hbCBpbnQzMiBkdW1teTUgID0gIDU7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15NiAgPSAgNjsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXk3ICA9ICA3OwotICBvcHRpb25hbCBpbnQzMiBkdW1teTggID0gIDg7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15OSAgPSAgOTsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMCA9IDEwOwotICBvcHRpb25hbCBpbnQzMiBkdW1teTExID0gMTE7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MTIgPSAxMjsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkxMyA9IDEzOwotICBvcHRpb25hbCBpbnQzMiBkdW1teTE0ID0gMTQ7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MTUgPSAxNTsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkxNiA9IDE2OwotICBvcHRpb25hbCBpbnQzMiBkdW1teTE3ID0gMTc7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MTggPSAxODsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkxOSA9IDE5OwotICBvcHRpb25hbCBpbnQzMiBkdW1teTIwID0gMjA7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MjEgPSAyMTsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkyMiA9IDIyOwotICBvcHRpb25hbCBpbnQzMiBkdW1teTIzID0gMjM7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MjQgPSAyNDsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkyNSA9IDI1OwotICBvcHRpb25hbCBpbnQzMiBkdW1teTI2ID0gMjY7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MjcgPSAyNzsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkyOCA9IDI4OwotICBvcHRpb25hbCBpbnQzMiBkdW1teTI5ID0gMjk7Ci0gIG9wdGlvbmFsIGludDMyIGR1bW15MzAgPSAzMDsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkzMSA9IDMxOwotICBvcHRpb25hbCBpbnQzMiBkdW1teTMyID0gMzI7Ci0KLSAgcmVxdWlyZWQgaW50MzIgYyA9IDMzOwotfQotCi1tZXNzYWdlIFRlc3RSZXF1aXJlZEZvcmVpZ24gewotICBvcHRpb25hbCBUZXN0UmVxdWlyZWQgb3B0aW9uYWxfbWVzc2FnZSA9IDE7Ci0gIHJlcGVhdGVkIFRlc3RSZXF1aXJlZCByZXBlYXRlZF9tZXNzYWdlID0gMjsKLSAgb3B0aW9uYWwgaW50MzIgZHVtbXkgPSAzOwotfQotCi0vLyBUZXN0IHRoYXQgd2UgY2FuIHVzZSBOZXN0ZWRNZXNzYWdlIGZyb20gb3V0c2lkZSBUZXN0QWxsVHlwZXMuCi1tZXNzYWdlIFRlc3RGb3JlaWduTmVzdGVkIHsKLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgZm9yZWlnbl9uZXN0ZWQgPSAxOwotfQotCi0vLyBUZXN0RW1wdHlNZXNzYWdlIGlzIHVzZWQgdG8gdGVzdCB1bmtub3duIGZpZWxkIHN1cHBvcnQuCi1tZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2UgewotfQotCi0vLyBMaWtlIGFib3ZlLCBidXQgZGVjbGFyZSBhbGwgZmllbGQgbnVtYmVycyBhcyBwb3RlbnRpYWwgZXh0ZW5zaW9ucy4gIE5vCi0vLyBhY3R1YWwgZXh0ZW5zaW9ucyBzaG91bGQgZXZlciBiZSBkZWZpbmVkIGZvciB0aGlzIHR5cGUuCi1tZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyB7Ci0gIGV4dGVuc2lvbnMgMSB0byBtYXg7Ci19Ci0KLW1lc3NhZ2UgVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzIHsKLSAgZXh0ZW5zaW9ucyA0MjsKLSAgZXh0ZW5zaW9ucyA0MTQzIHRvIDQyNDM7Ci0gIGV4dGVuc2lvbnMgNjU1MzYgdG8gbWF4OwotfQotCi0vLyBUZXN0IHRoYXQgcmVhbGx5IGxhcmdlIHRhZyBudW1iZXJzIGRvbid0IGJyZWFrIGFueXRoaW5nLgotbWVzc2FnZSBUZXN0UmVhbGx5TGFyZ2VUYWdOdW1iZXIgewotICAvLyBUaGUgbGFyZ2VzdCBwb3NzaWJsZSB0YWcgbnVtYmVyIGlzIDJeMjggLSAxLCBzaW5jZSB0aGUgd2lyZSBmb3JtYXQgdXNlcwotICAvLyB0aHJlZSBiaXRzIHRvIGNvbW11bmljYXRlIHdpcmUgdHlwZS4KLSAgb3B0aW9uYWwgaW50MzIgYSA9IDE7Ci0gIG9wdGlvbmFsIGludDMyIGJiID0gMjY4NDM1NDU1OwotfQotCi1tZXNzYWdlIFRlc3RSZWN1cnNpdmVNZXNzYWdlIHsKLSAgb3B0aW9uYWwgVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgYSA9IDE7Ci0gIG9wdGlvbmFsIGludDMyIGkgPSAyOwotfQotCi0vLyBUZXN0IHRoYXQgbXV0dWFsIHJlY3Vyc2lvbiB3b3Jrcy4KLW1lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkEgewotICBvcHRpb25hbCBUZXN0TXV0dWFsUmVjdXJzaW9uQiBiYiA9IDE7Ci19Ci0KLW1lc3NhZ2UgVGVzdE11dHVhbFJlY3Vyc2lvbkIgewotICBvcHRpb25hbCBUZXN0TXV0dWFsUmVjdXJzaW9uQSBhID0gMTsKLSAgb3B0aW9uYWwgaW50MzIgb3B0aW9uYWxfaW50MzIgPSAyOwotfQotCi0vLyBUZXN0IHRoYXQgZ3JvdXBzIGhhdmUgZGlzam9pbnQgZmllbGQgbnVtYmVycyBmcm9tIHRoZWlyIHNpYmxpbmdzIGFuZAotLy8gcGFyZW50cy4gIFRoaXMgaXMgTk9UIHBvc3NpYmxlIGluIHByb3RvMTsgb25seSBnb29nbGUucHJvdG9idWYuICBXaGVuIGF0dGVtcHRpbmcKLS8vIHRvIGNvbXBpbGUgd2l0aCBwcm90bzEsIHRoaXMgd2lsbCBlbWl0IGFuIGVycm9yOyBzbyB3ZSBvbmx5IGluY2x1ZGUgaXQKLS8vIGluIHByb3RvYnVmX3VuaXR0ZXN0X3Byb3RvLgotbWVzc2FnZSBUZXN0RHVwRmllbGROdW1iZXIgeyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQotICBvcHRpb25hbCBpbnQzMiBhID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQotICBvcHRpb25hbCBncm91cCBGb28gPSAyIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQotICBvcHRpb25hbCBncm91cCBCYXIgPSAzIHsgb3B0aW9uYWwgaW50MzIgYSA9IDE7IH0gIC8vIE5PX1BST1RPMQotfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMQotCi0vLyBBZGRpdGlvbmFsIG1lc3NhZ2VzIGZvciB0ZXN0aW5nIGxhenkgZmllbGRzLgotbWVzc2FnZSBUZXN0RWFnZXJNZXNzYWdlIHsKLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIHN1Yl9tZXNzYWdlID0gMSBbbGF6eT1mYWxzZV07Ci19Ci1tZXNzYWdlIFRlc3RMYXp5TWVzc2FnZSB7Ci0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBzdWJfbWVzc2FnZSA9IDEgW2xhenk9dHJ1ZV07Ci19Ci0KLS8vIE5lZWRlZCBmb3IgYSBQeXRob24gdGVzdC4KLW1lc3NhZ2UgVGVzdE5lc3RlZE1lc3NhZ2VIYXNCaXRzIHsKLSAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKLSAgICByZXBlYXRlZCBpbnQzMiBuZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ludDMyID0gMTsKLSAgICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSBuZXN0ZWRtZXNzYWdlX3JlcGVhdGVkX2ZvcmVpZ25tZXNzYWdlID0gMjsKLSAgfQotICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gMTsKLX0KLQotCi0vLyBUZXN0IGFuIGVudW0gdGhhdCBoYXMgbXVsdGlwbGUgdmFsdWVzIHdpdGggdGhlIHNhbWUgbnVtYmVyLgotZW51bSBUZXN0RW51bVdpdGhEdXBWYWx1ZSB7Ci0gIG9wdGlvbiBhbGxvd19hbGlhcyA9IHRydWU7Ci0KLSAgRk9PMSA9IDE7Ci0gIEJBUjEgPSAyOwotICBCQVogPSAzOwotICBGT08yID0gMTsKLSAgQkFSMiA9IDI7Ci19Ci0KLS8vIFRlc3QgYW4gZW51bSB3aXRoIGxhcmdlLCB1bm9yZGVyZWQgdmFsdWVzLgotZW51bSBUZXN0U3BhcnNlRW51bSB7Ci0gIFNQQVJTRV9BID0gMTIzOwotICBTUEFSU0VfQiA9IDYyMzc0OwotICBTUEFSU0VfQyA9IDEyNTg5MjM0OwotICBTUEFSU0VfRCA9IC0xNTsKLSAgU1BBUlNFX0UgPSAtNTM0NTI7Ci0gIFNQQVJTRV9GID0gMDsKLSAgU1BBUlNFX0cgPSAyOwotfQotCi0vLyBUZXN0IG1lc3NhZ2Ugd2l0aCBDYW1lbENhc2UgZmllbGQgbmFtZXMuICBUaGlzIHZpb2xhdGVzIFByb3RvY29sIEJ1ZmZlcgotLy8gc3RhbmRhcmQgc3R5bGUuCi1tZXNzYWdlIFRlc3RDYW1lbENhc2VGaWVsZE5hbWVzIHsKLSAgb3B0aW9uYWwgaW50MzIgUHJpbWl0aXZlRmllbGQgPSAxOwotICBvcHRpb25hbCBzdHJpbmcgU3RyaW5nRmllbGQgPSAyOwotICBvcHRpb25hbCBGb3JlaWduRW51bSBFbnVtRmllbGQgPSAzOwotICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBNZXNzYWdlRmllbGQgPSA0OwotICBvcHRpb25hbCBzdHJpbmcgU3RyaW5nUGllY2VGaWVsZCA9IDUgW2N0eXBlPVNUUklOR19QSUVDRV07Ci0gIG9wdGlvbmFsIHN0cmluZyBDb3JkRmllbGQgPSA2IFtjdHlwZT1DT1JEXTsKLQotICByZXBlYXRlZCBpbnQzMiBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkID0gNzsKLSAgcmVwZWF0ZWQgc3RyaW5nIFJlcGVhdGVkU3RyaW5nRmllbGQgPSA4OwotICByZXBlYXRlZCBGb3JlaWduRW51bSBSZXBlYXRlZEVudW1GaWVsZCA9IDk7Ci0gIHJlcGVhdGVkIEZvcmVpZ25NZXNzYWdlIFJlcGVhdGVkTWVzc2FnZUZpZWxkID0gMTA7Ci0gIHJlcGVhdGVkIHN0cmluZyBSZXBlYXRlZFN0cmluZ1BpZWNlRmllbGQgPSAxMSBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgcmVwZWF0ZWQgc3RyaW5nIFJlcGVhdGVkQ29yZEZpZWxkID0gMTIgW2N0eXBlPUNPUkRdOwotfQotCi0KLS8vIFdlIGxpc3QgZmllbGRzIG91dCBvZiBvcmRlciwgdG8gZW5zdXJlIHRoYXQgd2UncmUgdXNpbmcgZmllbGQgbnVtYmVyIGFuZCBub3QKLS8vIGZpZWxkIGluZGV4IHRvIGRldGVybWluZSBzZXJpYWxpemF0aW9uIG9yZGVyLgotbWVzc2FnZSBUZXN0RmllbGRPcmRlcmluZ3MgewotICBvcHRpb25hbCBzdHJpbmcgbXlfc3RyaW5nID0gMTE7Ci0gIGV4dGVuc2lvbnMgMiB0byAxMDsKLSAgb3B0aW9uYWwgaW50NjQgbXlfaW50ID0gMTsKLSAgZXh0ZW5zaW9ucyAxMiB0byAxMDA7Ci0gIG9wdGlvbmFsIGZsb2F0IG15X2Zsb2F0ID0gMTAxOwotICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgewotICAgIG9wdGlvbmFsIGludDY0IG9vID0gMjsKLSAgICAvLyBUaGUgZmllbGQgbmFtZSAiYiIgZmFpbHMgdG8gY29tcGlsZSBpbiBwcm90bzEgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aAotICAgIC8vIGEgbG9jYWwgdmFyaWFibGUgbmFtZWQgImIiIGluIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuICBEb2guCi0gICAgLy8gVGhpcyBmaWxlIG5lZWRzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIHRvIHRlc3QgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCi0gICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOwotICB9Ci0KLSAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAyMDA7Ci19Ci0KLQotZXh0ZW5kIFRlc3RGaWVsZE9yZGVyaW5ncyB7Ci0gIG9wdGlvbmFsIHN0cmluZyBteV9leHRlbnNpb25fc3RyaW5nID0gNTA7Ci0gIG9wdGlvbmFsIGludDMyIG15X2V4dGVuc2lvbl9pbnQgPSA1OwotfQotCi0KLW1lc3NhZ2UgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIHsKLSAgb3B0aW9uYWwgYnl0ZXMgZXNjYXBlZF9ieXRlcyA9IDEgW2RlZmF1bHQgPSAiXDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnXCJceGZlIl07Ci0gIG9wdGlvbmFsIHVpbnQzMiBsYXJnZV91aW50MzIgPSAyIFtkZWZhdWx0ID0gMHhGRkZGRkZGRl07Ci0gIG9wdGlvbmFsIHVpbnQ2NCBsYXJnZV91aW50NjQgPSAzIFtkZWZhdWx0ID0gMHhGRkZGRkZGRkZGRkZGRkZGXTsKLSAgb3B0aW9uYWwgIGludDMyIHNtYWxsX2ludDMyICA9IDQgW2RlZmF1bHQgPSAtMHg3RkZGRkZGRl07Ci0gIG9wdGlvbmFsICBpbnQ2NCBzbWFsbF9pbnQ2NCAgPSA1IFtkZWZhdWx0ID0gLTB4N0ZGRkZGRkZGRkZGRkZGRl07Ci0gIG9wdGlvbmFsICBpbnQzMiByZWFsbHlfc21hbGxfaW50MzIgPSAyMSBbZGVmYXVsdCA9IC0weDgwMDAwMDAwXTsKLSAgb3B0aW9uYWwgIGludDY0IHJlYWxseV9zbWFsbF9pbnQ2NCA9IDIyIFtkZWZhdWx0ID0gLTB4ODAwMDAwMDAwMDAwMDAwMF07Ci0KLSAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgaGVyZSBpcyBVVEYtOCBmb3IgIlx1MTIzNCIuICAoV2UgY291bGQgYWxzbyBqdXN0IHR5cGUKLSAgLy8gdGhlIFVURi04IHRleHQgZGlyZWN0bHkgaW50byB0aGlzIHRleHQgZmlsZSByYXRoZXIgdGhhbiBlc2NhcGUgaXQsIGJ1dAotICAvLyBsb3RzIG9mIHBlb3BsZSB1c2UgZWRpdG9ycyB0aGF0IHdvdWxkIGJlIGNvbmZ1c2VkIGJ5IHRoaXMuKQotICBvcHRpb25hbCBzdHJpbmcgdXRmOF9zdHJpbmcgPSA2IFtkZWZhdWx0ID0gIlwzNDFcMjEwXDI2NCJdOwotCi0gIC8vIFRlc3RzIGZvciBzaW5nbGUtcHJlY2lzaW9uIGZsb2F0aW5nLXBvaW50IHZhbHVlcy4KLSAgb3B0aW9uYWwgZmxvYXQgemVyb19mbG9hdCA9IDcgW2RlZmF1bHQgPSAwXTsKLSAgb3B0aW9uYWwgZmxvYXQgb25lX2Zsb2F0ID0gOCBbZGVmYXVsdCA9IDFdOwotICBvcHRpb25hbCBmbG9hdCBzbWFsbF9mbG9hdCA9IDkgW2RlZmF1bHQgPSAxLjVdOwotICBvcHRpb25hbCBmbG9hdCBuZWdhdGl2ZV9vbmVfZmxvYXQgPSAxMCBbZGVmYXVsdCA9IC0xXTsKLSAgb3B0aW9uYWwgZmxvYXQgbmVnYXRpdmVfZmxvYXQgPSAxMSBbZGVmYXVsdCA9IC0xLjVdOwotICAvLyBVc2luZyBleHBvbmVudHMKLSAgb3B0aW9uYWwgZmxvYXQgbGFyZ2VfZmxvYXQgPSAxMiBbZGVmYXVsdCA9IDJFOF07Ci0gIG9wdGlvbmFsIGZsb2F0IHNtYWxsX25lZ2F0aXZlX2Zsb2F0ID0gMTMgW2RlZmF1bHQgPSAtOGUtMjhdOwotCi0gIC8vIFRleHQgZm9yIG5vbmZpbml0ZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMuCi0gIG9wdGlvbmFsIGRvdWJsZSBpbmZfZG91YmxlID0gMTQgW2RlZmF1bHQgPSBpbmZdOwotICBvcHRpb25hbCBkb3VibGUgbmVnX2luZl9kb3VibGUgPSAxNSBbZGVmYXVsdCA9IC1pbmZdOwotICBvcHRpb25hbCBkb3VibGUgbmFuX2RvdWJsZSA9IDE2IFtkZWZhdWx0ID0gbmFuXTsKLSAgb3B0aW9uYWwgZmxvYXQgaW5mX2Zsb2F0ID0gMTcgW2RlZmF1bHQgPSBpbmZdOwotICBvcHRpb25hbCBmbG9hdCBuZWdfaW5mX2Zsb2F0ID0gMTggW2RlZmF1bHQgPSAtaW5mXTsKLSAgb3B0aW9uYWwgZmxvYXQgbmFuX2Zsb2F0ID0gMTkgW2RlZmF1bHQgPSBuYW5dOwotCi0gIC8vIFRlc3RzIGZvciBDKysgdHJpZ3JhcGhzLgotICAvLyBUcmlncmFwaHMgc2hvdWxkIGJlIGVzY2FwZWQgaW4gQysrIGdlbmVyYXRlZCBmaWxlcywgYnV0IHRoZXkgc2hvdWxkIG5vdCBiZQotICAvLyBlc2NhcGVkIGZvciBvdGhlciBsYW5ndWFnZXMuCi0gIC8vIE5vdGUgdGhhdCBpbiAucHJvdG8gZmlsZSwgIlw/IiBpcyBhIHZhbGlkIHdheSB0byBlc2NhcGUgPyBpbiBzdHJpbmcKLSAgLy8gbGl0ZXJhbHMuCi0gIG9wdGlvbmFsIHN0cmluZyBjcHBfdHJpZ3JhcGggPSAyMCBbZGVmYXVsdCA9ICI/IFw/ID8/IFw/PyBcPz8/ID8/LyA/XD8tIl07Ci0KLSAgLy8gU3RyaW5nIGRlZmF1bHRzIGNvbnRhaW5pbmcgdGhlIGNoYXJhY3RlciAnXDAwMCcKLSAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZ193aXRoX3plcm8gICAgICAgPSAyMyBbZGVmYXVsdCA9ICJoZWxcMDAwbG8iXTsKLSAgb3B0aW9uYWwgIGJ5dGVzIGJ5dGVzX3dpdGhfemVybyAgICAgICAgPSAyNCBbZGVmYXVsdCA9ICJ3b3JcMDAwbGQiXTsKLSAgb3B0aW9uYWwgc3RyaW5nIHN0cmluZ19waWVjZV93aXRoX3plcm8gPSAyNSBbY3R5cGU9U1RSSU5HX1BJRUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSJhYlwwMDBjIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBjb3JkX3dpdGhfemVybyAgICAgICAgID0gMjYgW2N0eXBlPUNPUkQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ9IjEyXDAwMDMiXTsKLSAgb3B0aW9uYWwgc3RyaW5nIHJlcGxhY2VtZW50X3N0cmluZyAgICAgPSAyNyBbZGVmYXVsdD0iJHt1bmtub3dufSJdOwotfQotCi1tZXNzYWdlIFNwYXJzZUVudW1NZXNzYWdlIHsKLSAgb3B0aW9uYWwgVGVzdFNwYXJzZUVudW0gc3BhcnNlX2VudW0gPSAxOwotfQotCi0vLyBUZXN0IFN0cmluZyBhbmQgQnl0ZXM6IHN0cmluZyBpcyBmb3IgdmFsaWQgVVRGLTggc3RyaW5ncwotbWVzc2FnZSBPbmVTdHJpbmcgewotICBvcHRpb25hbCBzdHJpbmcgZGF0YSA9IDE7Ci19Ci0KLW1lc3NhZ2UgTW9yZVN0cmluZyB7Ci0gIHJlcGVhdGVkIHN0cmluZyBkYXRhID0gMTsKLX0KLQotbWVzc2FnZSBPbmVCeXRlcyB7Ci0gIG9wdGlvbmFsIGJ5dGVzIGRhdGEgPSAxOwotfQotCi1tZXNzYWdlIE1vcmVCeXRlcyB7Ci0gIHJlcGVhdGVkIGJ5dGVzIGRhdGEgPSAxOwotfQotCi0vLyBUZXN0IGludDMyLCB1aW50MzIsIGludDY0LCB1aW50NjQsIGFuZCBib29sIGFyZSBhbGwgY29tcGF0aWJsZQotbWVzc2FnZSBJbnQzMk1lc3NhZ2UgewotICBvcHRpb25hbCBpbnQzMiBkYXRhID0gMTsKLX0KLQotbWVzc2FnZSBVaW50MzJNZXNzYWdlIHsKLSAgb3B0aW9uYWwgdWludDMyIGRhdGEgPSAxOwotfQotCi1tZXNzYWdlIEludDY0TWVzc2FnZSB7Ci0gIG9wdGlvbmFsIGludDY0IGRhdGEgPSAxOwotfQotCi1tZXNzYWdlIFVpbnQ2NE1lc3NhZ2UgewotICBvcHRpb25hbCB1aW50NjQgZGF0YSA9IDE7Ci19Ci0KLW1lc3NhZ2UgQm9vbE1lc3NhZ2UgewotICBvcHRpb25hbCBib29sIGRhdGEgPSAxOwotfQotCi0vLyBUZXN0IG9uZW9mcy4KLW1lc3NhZ2UgVGVzdE9uZW9mIHsKLSAgb25lb2YgZm9vIHsKLSAgICBpbnQzMiBmb29faW50ID0gMTsKLSAgICBzdHJpbmcgZm9vX3N0cmluZyA9IDI7Ci0gICAgVGVzdEFsbFR5cGVzIGZvb19tZXNzYWdlID0gMzsKLSAgICBncm91cCBGb29Hcm91cCA9IDQgewotICAgICAgb3B0aW9uYWwgaW50MzIgYSA9IDU7Ci0gICAgICBvcHRpb25hbCBzdHJpbmcgYiA9IDY7Ci0gICAgfQotICB9Ci19Ci0KLW1lc3NhZ2UgVGVzdE9uZW9mQmFja3dhcmRzQ29tcGF0aWJsZSB7Ci0gIG9wdGlvbmFsIGludDMyIGZvb19pbnQgPSAxOwotICBvcHRpb25hbCBzdHJpbmcgZm9vX3N0cmluZyA9IDI7Ci0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBmb29fbWVzc2FnZSA9IDM7Ci0gIG9wdGlvbmFsIGdyb3VwIEZvb0dyb3VwID0gNCB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDU7Ci0gICAgb3B0aW9uYWwgc3RyaW5nIGIgPSA2OwotICB9Ci19Ci0KLW1lc3NhZ2UgVGVzdE9uZW9mMiB7Ci0gIG9uZW9mIGZvbyB7Ci0gICAgaW50MzIgZm9vX2ludCA9IDE7Ci0gICAgc3RyaW5nIGZvb19zdHJpbmcgPSAyOwotICAgIHN0cmluZyBmb29fY29yZCA9IDMgW2N0eXBlPUNPUkRdOwotICAgIHN0cmluZyBmb29fc3RyaW5nX3BpZWNlID0gNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgICBieXRlcyBmb29fYnl0ZXMgPSA1OwotICAgIE5lc3RlZEVudW0gZm9vX2VudW0gPSA2OwotICAgIE5lc3RlZE1lc3NhZ2UgZm9vX21lc3NhZ2UgPSA3OwotICAgIGdyb3VwIEZvb0dyb3VwID0gOCB7Ci0gICAgICBvcHRpb25hbCBpbnQzMiBhID0gOTsKLSAgICAgIG9wdGlvbmFsIHN0cmluZyBiID0gMTA7Ci0gICAgfQotICAgIE5lc3RlZE1lc3NhZ2UgZm9vX2xhenlfbWVzc2FnZSA9IDExIFtsYXp5PXRydWVdOwotICB9Ci0KLSAgb25lb2YgYmFyIHsKLSAgICBpbnQzMiBiYXJfaW50ID0gMTIgW2RlZmF1bHQgPSA1XTsKLSAgICBzdHJpbmcgYmFyX3N0cmluZyA9IDEzIFtkZWZhdWx0ID0gIlNUUklORyJdOwotICAgIHN0cmluZyBiYXJfY29yZCA9IDE0IFtjdHlwZT1DT1JELCBkZWZhdWx0ID0gIkNPUkQiXTsKLSAgICBzdHJpbmcgYmFyX3N0cmluZ19waWVjZSA9IDE1IFtjdHlwZT1TVFJJTkdfUElFQ0UsIGRlZmF1bHQgPSAiU1BJRUNFIl07Ci0gICAgYnl0ZXMgYmFyX2J5dGVzID0gMTYgW2RlZmF1bHQgPSAiQllURVMiXTsKLSAgICBOZXN0ZWRFbnVtIGJhcl9lbnVtID0gMTcgW2RlZmF1bHQgPSBCQVJdOwotICB9Ci0KLSAgb3B0aW9uYWwgaW50MzIgYmF6X2ludCA9IDE4OwotICBvcHRpb25hbCBzdHJpbmcgYmF6X3N0cmluZyA9IDE5IFtkZWZhdWx0ID0gIkJBWiJdOwotCi0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgaW50NjQgcXV4X2ludCA9IDE7Ci0gICAgcmVwZWF0ZWQgaW50MzIgY29yZ2VfaW50ID0gMjsKLSAgfQotCi0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgRk9PID0gMTsKLSAgICBCQVIgPSAyOwotICAgIEJBWiA9IDM7Ci0gIH0KLX0KLQotbWVzc2FnZSBUZXN0UmVxdWlyZWRPbmVvZiB7Ci0gIG9uZW9mIGZvbyB7Ci0gICAgaW50MzIgZm9vX2ludCA9IDE7Ci0gICAgc3RyaW5nIGZvb19zdHJpbmcgPSAyOwotICAgIE5lc3RlZE1lc3NhZ2UgZm9vX21lc3NhZ2UgPSAzOwotICB9Ci0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgcmVxdWlyZWQgZG91YmxlIHJlcXVpcmVkX2RvdWJsZSA9IDE7Ci0gIH0KLX0KLQotCi0vLyBUZXN0IG1lc3NhZ2VzIGZvciBwYWNrZWQgZmllbGRzCi0KLW1lc3NhZ2UgVGVzdFBhY2tlZFR5cGVzIHsKLSAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0ICAgID0gIDkxIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICB1aW50MzIgcGFja2VkX3VpbnQzMiAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NCAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMiAgID0gIDk0IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgcGFja2VkX3NpbnQ2NCAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzIgID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjQgID0gIDk3IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0ID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0ICAgID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgcGFja2VkX2RvdWJsZSAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2wgICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgRm9yZWlnbkVudW0gcGFja2VkX2VudW0gID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKLX0KLQotLy8gQSBtZXNzYWdlIHdpdGggdGhlIHNhbWUgZmllbGRzIGFzIFRlc3RQYWNrZWRUeXBlcywgYnV0IHdpdGhvdXQgcGFja2luZy4gVXNlZAotLy8gdG8gdGVzdCBwYWNrZWQgPC0+IHVucGFja2VkIHdpcmUgY29tcGF0aWJpbGl0eS4KLW1lc3NhZ2UgVGVzdFVucGFja2VkVHlwZXMgewotICByZXBlYXRlZCAgICBpbnQzMiB1bnBhY2tlZF9pbnQzMiAgICA9ICA5MCBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgICBpbnQ2NCB1bnBhY2tlZF9pbnQ2NCAgICA9ICA5MSBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgIHVpbnQzMiB1bnBhY2tlZF91aW50MzIgICA9ICA5MiBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgIHVpbnQ2NCB1bnBhY2tlZF91aW50NjQgICA9ICA5MyBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgIHNpbnQzMiB1bnBhY2tlZF9zaW50MzIgICA9ICA5NCBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgIHNpbnQ2NCB1bnBhY2tlZF9zaW50NjQgICA9ICA5NSBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgZml4ZWQzMiB1bnBhY2tlZF9maXhlZDMyICA9ICA5NiBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgZml4ZWQ2NCB1bnBhY2tlZF9maXhlZDY0ICA9ICA5NyBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCBzZml4ZWQzMiB1bnBhY2tlZF9zZml4ZWQzMiA9ICA5OCBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCBzZml4ZWQ2NCB1bnBhY2tlZF9zZml4ZWQ2NCA9ICA5OSBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgICBmbG9hdCB1bnBhY2tlZF9mbG9hdCAgICA9IDEwMCBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgIGRvdWJsZSB1bnBhY2tlZF9kb3VibGUgICA9IDEwMSBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgICAgYm9vbCB1bnBhY2tlZF9ib29sICAgICA9IDEwMiBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCBGb3JlaWduRW51bSB1bnBhY2tlZF9lbnVtICA9IDEwMyBbcGFja2VkID0gZmFsc2VdOwotfQotCi1tZXNzYWdlIFRlc3RQYWNrZWRFeHRlbnNpb25zIHsKLSAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKLX0KLQotZXh0ZW5kIFRlc3RQYWNrZWRFeHRlbnNpb25zIHsKLSAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICA9ICA5MCBbcGFja2VkID0gdHJ1ZV07Ci0gIHJlcGVhdGVkICAgIGludDY0IHBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAgOTEgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIHVpbnQzMiBwYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICA9ICA5MyBbcGFja2VkID0gdHJ1ZV07Ci0gIHJlcGVhdGVkICAgc2ludDMyIHBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgOTQgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIHNpbnQ2NCBwYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICA9ICA5NiBbcGFja2VkID0gdHJ1ZV07Ci0gIHJlcGVhdGVkICBmaXhlZDY0IHBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgOTcgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiA9ICA5OSBbcGFja2VkID0gdHJ1ZV07Ci0gIHJlcGVhdGVkICAgIGZsb2F0IHBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAgPSAxMDAgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIGRvdWJsZSBwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDEwMiBbcGFja2VkID0gdHJ1ZV07Ci0gIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgPSAxMDMgW3BhY2tlZCA9IHRydWVdOwotfQotCi1tZXNzYWdlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgewotICBleHRlbnNpb25zIDEgdG8gbWF4OwotfQotCi1leHRlbmQgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyB7Ci0gIHJlcGVhdGVkICAgIGludDMyIHVucGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICA9ICA5MCBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgICBpbnQ2NCB1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAgOTEgW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgICB1aW50MzIgdW5wYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgID0gIDkyIFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkICAgdWludDY0IHVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICA9ICA5MyBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgIHNpbnQzMiB1bnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgOTQgW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgdW5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgID0gIDk1IFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkICBmaXhlZDMyIHVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICA9ICA5NiBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgZml4ZWQ2NCB1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgOTcgW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgdW5wYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gIDk4IFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkIHNmaXhlZDY0IHVucGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiA9ICA5OSBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCAgICBmbG9hdCB1bnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAgPSAxMDAgW3BhY2tlZCA9IGZhbHNlXTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgdW5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgID0gMTAxIFtwYWNrZWQgPSBmYWxzZV07Ci0gIHJlcGVhdGVkICAgICBib29sIHVucGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDEwMiBbcGFja2VkID0gZmFsc2VdOwotICByZXBlYXRlZCBGb3JlaWduRW51bSB1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgPSAxMDMgW3BhY2tlZCA9IGZhbHNlXTsKLX0KLQotLy8gVXNlZCBieSBFeHRlbnNpb25TZXRUZXN0L0R5bmFtaWNFeHRlbnNpb25zLiAgVGhlIHRlc3QgYWN0dWFsbHkgYnVpbGRzCi0vLyBhIHNldCBvZiBleHRlbnNpb25zIHRvIFRlc3RBbGxFeHRlbnNpb25zIGR5bmFtaWNhbGx5LCBiYXNlZCBvbiB0aGUgZmllbGRzCi0vLyBvZiB0aGlzIG1lc3NhZ2UgdHlwZS4KLW1lc3NhZ2UgVGVzdER5bmFtaWNFeHRlbnNpb25zIHsKLSAgZW51bSBEeW5hbWljRW51bVR5cGUgewotICAgIERZTkFNSUNfRk9PID0gMjIwMDsKLSAgICBEWU5BTUlDX0JBUiA9IDIyMDE7Ci0gICAgRFlOQU1JQ19CQVogPSAyMjAyOwotICB9Ci0gIG1lc3NhZ2UgRHluYW1pY01lc3NhZ2VUeXBlIHsKLSAgICBvcHRpb25hbCBpbnQzMiBkeW5hbWljX2ZpZWxkID0gMjEwMDsKLSAgfQotCi0gIG9wdGlvbmFsIGZpeGVkMzIgc2NhbGFyX2V4dGVuc2lvbiA9IDIwMDA7Ci0gIG9wdGlvbmFsIEZvcmVpZ25FbnVtIGVudW1fZXh0ZW5zaW9uID0gMjAwMTsKLSAgb3B0aW9uYWwgRHluYW1pY0VudW1UeXBlIGR5bmFtaWNfZW51bV9leHRlbnNpb24gPSAyMDAyOwotCi0gIG9wdGlvbmFsIEZvcmVpZ25NZXNzYWdlIG1lc3NhZ2VfZXh0ZW5zaW9uID0gMjAwMzsKLSAgb3B0aW9uYWwgRHluYW1pY01lc3NhZ2VUeXBlIGR5bmFtaWNfbWVzc2FnZV9leHRlbnNpb24gPSAyMDA0OwotCi0gIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9leHRlbnNpb24gPSAyMDA1OwotICByZXBlYXRlZCBzaW50MzIgcGFja2VkX2V4dGVuc2lvbiA9IDIwMDYgW3BhY2tlZCA9IHRydWVdOwotfQotCi1tZXNzYWdlIFRlc3RSZXBlYXRlZFNjYWxhckRpZmZlcmVudFRhZ1NpemVzIHsKLSAgLy8gUGFyc2luZyByZXBlYXRlZCBmaXhlZCBzaXplIHZhbHVlcyB1c2VkIHRvIGZhaWwuIFRoaXMgbWVzc2FnZSBuZWVkcyB0byBiZQotICAvLyB1c2VkIGluIG9yZGVyIHRvIGdldCBhIHRhZyBvZiB0aGUgcmlnaHQgc2l6ZTsgYWxsIG9mIHRoZSByZXBlYXRlZCBmaWVsZHMKLSAgLy8gaW4gVGVzdEFsbFR5cGVzIGRpZG4ndCB0cmlnZ2VyIHRoZSBjaGVjay4KLSAgcmVwZWF0ZWQgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyID0gMTI7Ci0gIC8vIENoZWNrIGZvciBhIHZhcmludCB0eXBlLCBqdXN0IGZvciBnb29kIG1lYXN1cmUuCi0gIHJlcGVhdGVkIGludDMyICAgcmVwZWF0ZWRfaW50MzIgICA9IDEzOwotCi0gIC8vIFRoZXNlIGhhdmUgdHdvLWJ5dGUgdGFncy4KLSAgcmVwZWF0ZWQgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ID0gMjA0NjsKLSAgcmVwZWF0ZWQgaW50NjQgICByZXBlYXRlZF9pbnQ2NCAgID0gMjA0NzsKLQotICAvLyBUaHJlZSBieXRlIHRhZ3MuCi0gIHJlcGVhdGVkIGZsb2F0ICAgcmVwZWF0ZWRfZmxvYXQgICA9IDI2MjE0MjsKLSAgcmVwZWF0ZWQgdWludDY0ICByZXBlYXRlZF91aW50NjQgID0gMjYyMTQzOwotfQotCi0vLyBUZXN0IHRoYXQgaWYgYW4gb3B0aW9uYWwgb3IgcmVxdWlyZWQgbWVzc2FnZS9ncm91cCBmaWVsZCBhcHBlYXJzIG11bHRpcGxlCi0vLyB0aW1lcyBpbiB0aGUgaW5wdXQsIHRoZXkgbmVlZCB0byBiZSBtZXJnZWQuCi1tZXNzYWdlIFRlc3RQYXJzaW5nTWVyZ2UgewotICAvLyBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciBkZWZpbmVzIG1hdGNoaW5nIGZpZWxkIHR5cGVzIGFzIFRlc3RQYXJzaW5nTWVyZ2UsCi0gIC8vIGV4Y2VwdCB0aGF0IGFsbCBmaWVsZHMgYXJlIHJlcGVhdGVkLiBJbiB0aGUgdGVzdHMsIHdlIHdpbGwgc2VyaWFsaXplIHRoZQotICAvLyBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciB0byBieXRlcywgYW5kIHBhcnNlIHRoZSBieXRlcyB0byBUZXN0UGFyc2luZ01lcmdlLgotICAvLyBSZXBlYXRlZCBmaWVsZHMgaW4gUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgYXJlIGV4cGVjdGVkIHRvIGJlIG1lcmdlZCBpbnRvCi0gIC8vIHRoZSBjb3JyZXNwb25kaW5nIHJlcXVpcmVkL29wdGlvbmFsIGZpZWxkcyBpbiBUZXN0UGFyc2luZ01lcmdlLgotICBtZXNzYWdlIFJlcGVhdGVkRmllbGRzR2VuZXJhdG9yIHsKLSAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQxID0gMTsKLSAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQyID0gMjsKLSAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZmllbGQzID0gMzsKLSAgICByZXBlYXRlZCBncm91cCBHcm91cDEgPSAxMCB7Ci0gICAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgZmllbGQxID0gMTE7Ci0gICAgfQotICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMiA9IDIwIHsKLSAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBmaWVsZDEgPSAyMTsKLSAgICB9Ci0gICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIGV4dDEgPSAxMDAwOwotICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyBleHQyID0gMTAwMTsKLSAgfQotICByZXF1aXJlZCBUZXN0QWxsVHlwZXMgcmVxdWlyZWRfYWxsX3R5cGVzID0gMTsKLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG9wdGlvbmFsX2FsbF90eXBlcyA9IDI7Ci0gIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9hbGxfdHlwZXMgPSAzOwotICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTAgewotICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9ncm91cF9hbGxfdHlwZXMgPSAxMTsKLSAgfQotICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gMjAgewotICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9ncm91cF9hbGxfdHlwZXMgPSAyMTsKLSAgfQotICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotICBleHRlbmQgVGVzdFBhcnNpbmdNZXJnZSB7Ci0gICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG9wdGlvbmFsX2V4dCA9IDEwMDA7Ci0gICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIHJlcGVhdGVkX2V4dCA9IDEwMDE7Ci0gIH0KLX0KLQotbWVzc2FnZSBUZXN0Q29tbWVudEluamVjdGlvbk1lc3NhZ2UgewotICAvLyAqLyA8LSBUaGlzIHNob3VsZCBub3QgY2xvc2UgdGhlIGdlbmVyYXRlZCBkb2MgY29tbWVudAotICBvcHRpb25hbCBzdHJpbmcgYSA9IDEgW2RlZmF1bHQ9IiovIDwtIE5laXRoZXIgc2hvdWxkIHRoaXMuIl07Ci19Ci0KLQotLy8gVGVzdCB0aGF0IFJQQyBzZXJ2aWNlcyB3b3JrLgotbWVzc2FnZSBGb29SZXF1ZXN0ICB7fQotbWVzc2FnZSBGb29SZXNwb25zZSB7fQotCi1tZXNzYWdlIEZvb0NsaWVudE1lc3NhZ2Uge30KLW1lc3NhZ2UgRm9vU2VydmVyTWVzc2FnZXt9Ci0KLXNlcnZpY2UgVGVzdFNlcnZpY2UgewotICBycGMgRm9vKEZvb1JlcXVlc3QpIHJldHVybnMgKEZvb1Jlc3BvbnNlKTsKLSAgcnBjIEJhcihCYXJSZXF1ZXN0KSByZXR1cm5zIChCYXJSZXNwb25zZSk7Ci19Ci0KLQotbWVzc2FnZSBCYXJSZXF1ZXN0ICB7fQotbWVzc2FnZSBCYXJSZXNwb25zZSB7fQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGNjMGUzNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDIxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGJlbmp5QGdvb2dsZS5jb20gKEJlbmp5IFdlaW5iZXJnZXIpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBBIHByb3RvIGZpbGUgdXNlZCB0byB0ZXN0IHRoZSAiY3VzdG9tIG9wdGlvbnMiIGZlYXR1cmUgb2YgZ29vZ2xlLnByb3RvYnVmLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgotLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKLW9wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKLW9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKLW9wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsKLQotLy8gQSBjdXN0b20gZmlsZSBvcHRpb24gKGRlZmluZWQgYmVsb3cpLgotb3B0aW9uIChmaWxlX29wdDEpID0gOTg3NjU0MzIxMDsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7Ci0KLS8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKLS8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotCi0vLyBTb21lIHNpbXBsZSB0ZXN0IGN1c3RvbSBvcHRpb25zIG9mIHZhcmlvdXMgdHlwZXMuCi0KLWV4dGVuZCBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgewotICBvcHRpb25hbCB1aW50NjQgZmlsZV9vcHQxID0gNzczNjk3NDsKLX0KLQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyB7Ci0gIG9wdGlvbmFsIGludDMyIG1lc3NhZ2Vfb3B0MSA9IDc3MzkwMzY7Ci19Ci0KLWV4dGVuZCBnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIHsKLSAgb3B0aW9uYWwgZml4ZWQ2NCBmaWVsZF9vcHQxID0gNzc0MDkzNjsKLSAgLy8gVGhpcyBpcyB1c2VmdWwgZm9yIHRlc3RpbmcgdGhhdCB3ZSBjb3JyZWN0bHkgcmVnaXN0ZXIgZGVmYXVsdCB2YWx1ZXMgZm9yCi0gIC8vIGV4dGVuc2lvbiBvcHRpb25zLgotICBvcHRpb25hbCBpbnQzMiBmaWVsZF9vcHQyID0gNzc1MzkxMyBbZGVmYXVsdD00Ml07Ci19Ci0KLWV4dGVuZCBnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgewotICBvcHRpb25hbCBzZml4ZWQzMiBlbnVtX29wdDEgPSA3NzUzNTc2OwotfQotCi1leHRlbmQgZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgewotICBvcHRpb25hbCBpbnQzMiBlbnVtX3ZhbHVlX29wdDEgPSAxNTYwNjc4OwotfQotCi1leHRlbmQgZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIHsKLSAgb3B0aW9uYWwgc2ludDY0IHNlcnZpY2Vfb3B0MSA9IDc4ODc2NTA7Ci19Ci0KLWVudW0gTWV0aG9kT3B0MSB7Ci0gIE1FVEhPRE9QVDFfVkFMMSA9IDE7Ci0gIE1FVEhPRE9QVDFfVkFMMiA9IDI7Ci19Ci0KLWV4dGVuZCBnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyB7Ci0gIG9wdGlvbmFsIE1ldGhvZE9wdDEgbWV0aG9kX29wdDEgPSA3ODkwODYwOwotfQotCi0vLyBBIHRlc3QgbWVzc2FnZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvIHNvbWUKLS8vIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KLW1lc3NhZ2UgVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucyB7Ci0gIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IGZhbHNlOwotCi0gIG9wdGlvbiAobWVzc2FnZV9vcHQxKSA9IC01NjsKLQotICBvcHRpb25hbCBzdHJpbmcgZmllbGQxID0gMSBbY3R5cGU9Q09SRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChmaWVsZF9vcHQxKT04NzY1NDMyMTA5XTsKLQotICBlbnVtIEFuRW51bSB7Ci0gICAgb3B0aW9uIChlbnVtX29wdDEpID0gLTc4OTsKLQotICAgIEFORU5VTV9WQUwxID0gMTsKLSAgICBBTkVOVU1fVkFMMiA9IDIgWyhlbnVtX3ZhbHVlX29wdDEpID0gMTIzXTsKLSAgfQotfQotCi0KLS8vIEEgdGVzdCBSUEMgc2VydmljZSB3aXRoIGN1c3RvbSBvcHRpb25zIGF0IGFsbCBwb3NzaWJsZSBsb2NhdGlvbnMgKGFuZCBhbHNvCi0vLyBzb21lIHJlZ3VsYXIgb3B0aW9ucywgdG8gbWFrZSBzdXJlIHRoZXkgaW50ZXJhY3QgbmljZWx5KS4KLW1lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vUmVxdWVzdCB7Ci19Ci0KLW1lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vUmVzcG9uc2UgewotfQotCi1tZXNzYWdlIEN1c3RvbU9wdGlvbkZvb0NsaWVudE1lc3NhZ2UgewotfQotCi1tZXNzYWdlIEN1c3RvbU9wdGlvbkZvb1NlcnZlck1lc3NhZ2UgewotfQotCi1zZXJ2aWNlIFRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMgewotICBvcHRpb24gKHNlcnZpY2Vfb3B0MSkgPSAtOTg3NjU0MzIxMDsKLQotICBycGMgRm9vKEN1c3RvbU9wdGlvbkZvb1JlcXVlc3QpIHJldHVybnMgKEN1c3RvbU9wdGlvbkZvb1Jlc3BvbnNlKSB7Ci0gICAgb3B0aW9uIChtZXRob2Rfb3B0MSkgPSBNRVRIT0RPUFQxX1ZBTDI7Ci0gIH0KLX0KLQotCi0KLS8vIE9wdGlvbnMgb2YgZXZlcnkgcG9zc2libGUgZmllbGQgdHlwZSwgc28gd2UgY2FuIHRlc3QgdGhlbSBhbGwgZXhoYXVzdGl2ZWx5LgotCi1tZXNzYWdlIER1bW15TWVzc2FnZUNvbnRhaW5pbmdFbnVtIHsKLSAgZW51bSBUZXN0RW51bVR5cGUgewotICAgIFRFU1RfT1BUSU9OX0VOVU1fVFlQRTEgPSAyMjsKLSAgICBURVNUX09QVElPTl9FTlVNX1RZUEUyID0gLTIzOwotICB9Ci19Ci0KLW1lc3NhZ2UgRHVtbXlNZXNzYWdlSW52YWxpZEFzT3B0aW9uVHlwZSB7Ci19Ci0KLWV4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgewotICBvcHRpb25hbCAgICAgICAgIGJvb2wgICAgIGJvb2xfb3B0ID0gNzcwNjA5MDsKLSAgb3B0aW9uYWwgICAgICAgIGludDMyICAgIGludDMyX29wdCA9IDc3MDU3MDk7Ci0gIG9wdGlvbmFsICAgICAgICBpbnQ2NCAgICBpbnQ2NF9vcHQgPSA3NzA1NTQyOwotICBvcHRpb25hbCAgICAgICB1aW50MzIgICB1aW50MzJfb3B0ID0gNzcwNDg4MDsKLSAgb3B0aW9uYWwgICAgICAgdWludDY0ICAgdWludDY0X29wdCA9IDc3MDIzNjc7Ci0gIG9wdGlvbmFsICAgICAgIHNpbnQzMiAgIHNpbnQzMl9vcHQgPSA3NzAxNTY4OwotICBvcHRpb25hbCAgICAgICBzaW50NjQgICBzaW50NjRfb3B0ID0gNzcwMDg2MzsKLSAgb3B0aW9uYWwgICAgICBmaXhlZDMyICBmaXhlZDMyX29wdCA9IDc3MDAzMDc7Ci0gIG9wdGlvbmFsICAgICAgZml4ZWQ2NCAgZml4ZWQ2NF9vcHQgPSA3NzAwMTk0OwotICBvcHRpb25hbCAgICAgc2ZpeGVkMzIgc2ZpeGVkMzJfb3B0ID0gNzY5ODY0NTsKLSAgb3B0aW9uYWwgICAgIHNmaXhlZDY0IHNmaXhlZDY0X29wdCA9IDc2ODU0NzU7Ci0gIG9wdGlvbmFsICAgICAgICBmbG9hdCAgICBmbG9hdF9vcHQgPSA3Njc1MzkwOwotICBvcHRpb25hbCAgICAgICBkb3VibGUgICBkb3VibGVfb3B0ID0gNzY3MzI5MzsKLSAgb3B0aW9uYWwgICAgICAgc3RyaW5nICAgc3RyaW5nX29wdCA9IDc2NzMyODU7Ci0gIG9wdGlvbmFsICAgICAgICBieXRlcyAgICBieXRlc19vcHQgPSA3NjczMjM4OwotICBvcHRpb25hbCBEdW1teU1lc3NhZ2VDb250YWluaW5nRW51bS5UZXN0RW51bVR5cGUgZW51bV9vcHQgPSA3NjczMjMzOwotICBvcHRpb25hbCBEdW1teU1lc3NhZ2VJbnZhbGlkQXNPcHRpb25UeXBlIG1lc3NhZ2VfdHlwZV9vcHQgPSA3NjY1OTY3OwotfQotCi1tZXNzYWdlIEN1c3RvbU9wdGlvbk1pbkludGVnZXJWYWx1ZXMgewotICBvcHRpb24gICAgIChib29sX29wdCkgPSBmYWxzZTsKLSAgb3B0aW9uICAgIChpbnQzMl9vcHQpID0gLTB4ODAwMDAwMDA7Ci0gIG9wdGlvbiAgICAoaW50NjRfb3B0KSA9IC0weDgwMDAwMDAwMDAwMDAwMDA7Ci0gIG9wdGlvbiAgICh1aW50MzJfb3B0KSA9IDA7Ci0gIG9wdGlvbiAgICh1aW50NjRfb3B0KSA9IDA7Ci0gIG9wdGlvbiAgIChzaW50MzJfb3B0KSA9IC0weDgwMDAwMDAwOwotICBvcHRpb24gICAoc2ludDY0X29wdCkgPSAtMHg4MDAwMDAwMDAwMDAwMDAwOwotICBvcHRpb24gIChmaXhlZDMyX29wdCkgPSAwOwotICBvcHRpb24gIChmaXhlZDY0X29wdCkgPSAwOwotICBvcHRpb24gKHNmaXhlZDMyX29wdCkgPSAtMHg4MDAwMDAwMDsKLSAgb3B0aW9uIChzZml4ZWQ2NF9vcHQpID0gLTB4ODAwMDAwMDAwMDAwMDAwMDsKLX0KLQotbWVzc2FnZSBDdXN0b21PcHRpb25NYXhJbnRlZ2VyVmFsdWVzIHsKLSAgb3B0aW9uICAgICAoYm9vbF9vcHQpID0gdHJ1ZTsKLSAgb3B0aW9uICAgIChpbnQzMl9vcHQpID0gMHg3RkZGRkZGRjsKLSAgb3B0aW9uICAgIChpbnQ2NF9vcHQpID0gMHg3RkZGRkZGRkZGRkZGRkZGOwotICBvcHRpb24gICAodWludDMyX29wdCkgPSAweEZGRkZGRkZGOwotICBvcHRpb24gICAodWludDY0X29wdCkgPSAweEZGRkZGRkZGRkZGRkZGRkY7Ci0gIG9wdGlvbiAgIChzaW50MzJfb3B0KSA9IDB4N0ZGRkZGRkY7Ci0gIG9wdGlvbiAgIChzaW50NjRfb3B0KSA9IDB4N0ZGRkZGRkZGRkZGRkZGRjsKLSAgb3B0aW9uICAoZml4ZWQzMl9vcHQpID0gMHhGRkZGRkZGRjsKLSAgb3B0aW9uICAoZml4ZWQ2NF9vcHQpID0gMHhGRkZGRkZGRkZGRkZGRkZGOwotICBvcHRpb24gKHNmaXhlZDMyX29wdCkgPSAweDdGRkZGRkZGOwotICBvcHRpb24gKHNmaXhlZDY0X29wdCkgPSAweDdGRkZGRkZGRkZGRkZGRkY7Ci19Ci0KLW1lc3NhZ2UgQ3VzdG9tT3B0aW9uT3RoZXJWYWx1ZXMgewotICBvcHRpb24gIChpbnQzMl9vcHQpID0gLTEwMDsgIC8vIFRvIHRlc3Qgc2lnbi1leHRlbnNpb24uCi0gIG9wdGlvbiAgKGZsb2F0X29wdCkgPSAxMi4zNDU2Nzg5OwotICBvcHRpb24gKGRvdWJsZV9vcHQpID0gMS4yMzQ1Njc4OTAxMjM0NTY3ODk7Ci0gIG9wdGlvbiAoc3RyaW5nX29wdCkgPSAiSGVsbG8sIFwiV29ybGRcIiI7Ci0gIG9wdGlvbiAgKGJ5dGVzX29wdCkgPSAiSGVsbG9cMFdvcmxkIjsKLSAgb3B0aW9uICAgKGVudW1fb3B0KSA9IFRFU1RfT1BUSU9OX0VOVU1fVFlQRTI7Ci19Ci0KLW1lc3NhZ2UgU2V0dGluZ1JlYWxzRnJvbVBvc2l0aXZlSW50cyB7Ci0gIG9wdGlvbiAgKGZsb2F0X29wdCkgPSAxMjsKLSAgb3B0aW9uIChkb3VibGVfb3B0KSA9IDE1NDsKLX0KLQotbWVzc2FnZSBTZXR0aW5nUmVhbHNGcm9tTmVnYXRpdmVJbnRzIHsKLSAgb3B0aW9uICAoZmxvYXRfb3B0KSA9IC0xMjsKLSAgb3B0aW9uICAoZG91YmxlX29wdCkgPSAtMTU0OwotfQotCi0vLyBPcHRpb25zIG9mIGNvbXBsZXggbWVzc2FnZSB0eXBlcywgdGhlbXNlbHZlcyBjb21iaW5lZCBhbmQgZXh0ZW5kZWQgaW4KLS8vIHZhcmlvdXMgd2F5cy4KLQotbWVzc2FnZSBDb21wbGV4T3B0aW9uVHlwZTEgewotICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOwotICBvcHRpb25hbCBpbnQzMiBmb28yID0gMjsKLSAgb3B0aW9uYWwgaW50MzIgZm9vMyA9IDM7Ci0gIHJlcGVhdGVkIGludDMyIGZvbzQgPSA0OwotCi0gIGV4dGVuc2lvbnMgMTAwIHRvIG1heDsKLX0KLQotbWVzc2FnZSBDb21wbGV4T3B0aW9uVHlwZTIgewotICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTEgYmFyID0gMTsKLSAgb3B0aW9uYWwgaW50MzIgYmF6ID0gMjsKLQotICBtZXNzYWdlIENvbXBsZXhPcHRpb25UeXBlNCB7Ci0gICAgb3B0aW9uYWwgaW50MzIgd2FsZG8gPSAxOwotCi0gICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyB7Ci0gICAgICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTQgY29tcGxleF9vcHQ0ID0gNzYzMzU0NjsKLSAgICB9Ci0gIH0KLQotICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTQgZnJlZCA9IDM7Ci0gIHJlcGVhdGVkIENvbXBsZXhPcHRpb25UeXBlNCBiYXJuZXkgPSA0OwotCi0gIGV4dGVuc2lvbnMgMTAwIHRvIG1heDsKLX0KLQotbWVzc2FnZSBDb21wbGV4T3B0aW9uVHlwZTMgewotICBvcHRpb25hbCBpbnQzMiBxdXggPSAxOwotCi0gIG9wdGlvbmFsIGdyb3VwIENvbXBsZXhPcHRpb25UeXBlNSA9IDIgewotICAgIG9wdGlvbmFsIGludDMyIHBsdWdoID0gMzsKLSAgfQotfQotCi1leHRlbmQgQ29tcGxleE9wdGlvblR5cGUxIHsKLSAgb3B0aW9uYWwgaW50MzIgcXV1eCA9IDc2NjM3MDc7Ci0gIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlMyBjb3JnZSA9IDc2NjM0NDI7Ci19Ci0KLWV4dGVuZCBDb21wbGV4T3B0aW9uVHlwZTIgewotICBvcHRpb25hbCBpbnQzMiBncmF1bHQgPSA3NjUwOTI3OwotICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTEgZ2FycGx5ID0gNzY0OTk5MjsKLX0KLQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyB7Ci0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0LkNvbXBsZXhPcHRpb25UeXBlMSBjb21wbGV4X29wdDEgPSA3NjQ2NzU2OwotICBvcHRpb25hbCBDb21wbGV4T3B0aW9uVHlwZTIgY29tcGxleF9vcHQyID0gNzYzNjk0OTsKLSAgb3B0aW9uYWwgQ29tcGxleE9wdGlvblR5cGUzIGNvbXBsZXhfb3B0MyA9IDc2MzY0NjM7Ci0gIG9wdGlvbmFsIGdyb3VwIENvbXBsZXhPcHQ2ID0gNzU5NTQ2OCB7Ci0gICAgb3B0aW9uYWwgaW50MzIgeHl6enkgPSA3NTkzOTUxOwotICB9Ci19Ci0KLS8vIE5vdGUgdGhhdCB3ZSB0cnkgdmFyaW91cyBkaWZmZXJlbnQgd2F5cyBvZiBuYW1pbmcgdGhlIHNhbWUgZXh0ZW5zaW9uLgotbWVzc2FnZSBWYXJpb3VzQ29tcGxleE9wdGlvbnMgewotICBvcHRpb24gKC5wcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLmZvbyA9IDQyOwotICBvcHRpb24gKHByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuKC5wcm90b2J1Zl91bml0dGVzdC5xdXV4KSA9IDMyNDsKLSAgb3B0aW9uICgucHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS4ocHJvdG9idWZfdW5pdHRlc3QuY29yZ2UpLnF1eCA9IDg3NjsKLSAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLmZvbzQgPSA5OTsKLSAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLmZvbzQgPSA4ODsKLSAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJheiA9IDk4NzsKLSAgb3B0aW9uIChjb21wbGV4X29wdDIpLihncmF1bHQpID0gNjU0OwotICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmFyLmZvbyA9IDc0MzsKLSAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhci4ocXV1eCkgPSAxOTk5OwotICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmFyLihwcm90b2J1Zl91bml0dGVzdC5jb3JnZSkucXV4ID0gMjAwODsKLSAgb3B0aW9uIChjb21wbGV4X29wdDIpLihnYXJwbHkpLmZvbyA9IDc0MTsKLSAgb3B0aW9uIChjb21wbGV4X29wdDIpLihnYXJwbHkpLigucHJvdG9idWZfdW5pdHRlc3QucXV1eCkgPSAxOTk4OwotICBvcHRpb24gKGNvbXBsZXhfb3B0MikuKHByb3RvYnVmX3VuaXR0ZXN0LmdhcnBseSkuKGNvcmdlKS5xdXggPSAyMTIxOwotICBvcHRpb24gKENvbXBsZXhPcHRpb25UeXBlMi5Db21wbGV4T3B0aW9uVHlwZTQuY29tcGxleF9vcHQ0KS53YWxkbyA9IDE5NzE7Ci0gIG9wdGlvbiAoY29tcGxleF9vcHQyKS5mcmVkLndhbGRvID0gMzIxOwotICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmFybmV5ID0geyB3YWxkbzogMTAxIH07Ci0gIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXJuZXkgPSB7IHdhbGRvOiAyMTIgfTsKLSAgb3B0aW9uIChwcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDMpLnF1eCA9IDk7Ci0gIG9wdGlvbiAoY29tcGxleF9vcHQzKS5jb21wbGV4b3B0aW9udHlwZTUucGx1Z2ggPSAyMjsKLSAgb3B0aW9uIChjb21wbGV4b3B0NikueHl6enkgPSAyNDsKLX0KLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBEZWZpbml0aW9ucyBmb3IgdGVzdGluZyBhZ2dyZWdhdGUgb3B0aW9uIHBhcnNpbmcuCi0vLyBTZWUgZGVzY3JpcHRvcl91bml0dGVzdC5jYy4KLQotbWVzc2FnZSBBZ2dyZWdhdGVNZXNzYWdlU2V0IHsKLSAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKLSAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKLX0KLQotbWVzc2FnZSBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCB7Ci0gIGV4dGVuZCBBZ2dyZWdhdGVNZXNzYWdlU2V0IHsKLSAgICBvcHRpb25hbCBBZ2dyZWdhdGVNZXNzYWdlU2V0RWxlbWVudCBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ0NzU0MjsKLSAgfQotICBvcHRpb25hbCBzdHJpbmcgcyA9IDE7Ci19Ci0KLS8vIEEgaGVscGVyIHR5cGUgdXNlZCB0byB0ZXN0IGFnZ3JlZ2F0ZSBvcHRpb24gcGFyc2luZwotbWVzc2FnZSBBZ2dyZWdhdGUgewotICBvcHRpb25hbCBpbnQzMiBpID0gMTsKLSAgb3B0aW9uYWwgc3RyaW5nIHMgPSAyOwotCi0gIC8vIEEgbmVzdGVkIG9iamVjdAotICBvcHRpb25hbCBBZ2dyZWdhdGUgc3ViID0gMzsKLQotICAvLyBUbyB0ZXN0IHRoZSBwYXJzaW5nIG9mIGV4dGVuc2lvbnMgaW5zaWRlIGFnZ3JlZ2F0ZSB2YWx1ZXMKLSAgb3B0aW9uYWwgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIGZpbGUgPSA0OwotICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIHsKLSAgICBvcHRpb25hbCBBZ2dyZWdhdGUgbmVzdGVkID0gMTU0NzY5MDM7Ci0gIH0KLQotICAvLyBBbiBlbWJlZGRlZCBtZXNzYWdlIHNldAotICBvcHRpb25hbCBBZ2dyZWdhdGVNZXNzYWdlU2V0IG1zZXQgPSA1OwotfQotCi0vLyBBbGxvdyBBZ2dyZWdhdGUgdG8gYmUgdXNlZCBhcyBhbiBvcHRpb24gYXQgYWxsIHBvc3NpYmxlIGxvY2F0aW9ucwotLy8gaW4gdGhlIC5wcm90byBncmFtbWVyLgotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyAgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGZpbGVvcHQgICAgPSAxNTQ3ODQ3OTsgfQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIG1zZ29wdCAgICAgPSAxNTQ4MDA4ODsgfQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGZpZWxkb3B0ICAgPSAxNTQ4MTM3NDsgfQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyAgICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIGVudW1vcHQgICAgPSAxNTQ4MzIxODsgfQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIHsgb3B0aW9uYWwgQWdncmVnYXRlIGVudW12YWxvcHQgPSAxNTQ4NjkyMTsgfQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIHNlcnZpY2VvcHQgPSAxNTQ5NzE0NTsgfQotZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zICAgIHsgb3B0aW9uYWwgQWdncmVnYXRlIG1ldGhvZG9wdCAgPSAxNTUxMjcxMzsgfQotCi0vLyBUcnkgdXNpbmcgQWdncmVnYXRlT3B0aW9uIGF0IGRpZmZlcmVudCBwb2ludHMgaW4gdGhlIHByb3RvIGdyYW1tYXIKLW9wdGlvbiAoZmlsZW9wdCkgPSB7Ci0gIHM6ICdGaWxlQW5ub3RhdGlvbicKLSAgLy8gQWxzbyB0ZXN0IHRoZSBoYW5kbGluZyBvZiBjb21tZW50cwotICAvKiBvZiBib3RoIHR5cGVzICovIGk6IDEwMAotCi0gIHN1YiB7IHM6ICdOZXN0ZWRGaWxlQW5ub3RhdGlvbicgfQotCi0gIC8vIEluY2x1ZGUgYSBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgYW5kIHJlY3Vyc2l2ZWx5IGV4dGVuZCBpdCB3aXRoCi0gIC8vIGFub3RoZXIgZmlsZW9wdC4KLSAgZmlsZSB7Ci0gICAgW3Byb3RvYnVmX3VuaXR0ZXN0LmZpbGVvcHRdIHsKLSAgICAgIHM6J0ZpbGVFeHRlbnNpb25Bbm5vdGF0aW9uJwotICAgIH0KLSAgfQotCi0gIC8vIEEgbWVzc2FnZSBzZXQgaW5zaWRlIGFuIG9wdGlvbiB2YWx1ZQotICBtc2V0IHsKLSAgICBbcHJvdG9idWZfdW5pdHRlc3QuQWdncmVnYXRlTWVzc2FnZVNldEVsZW1lbnQubWVzc2FnZV9zZXRfZXh0ZW5zaW9uXSB7Ci0gICAgICBzOiAnRW1iZWRkZWRNZXNzYWdlU2V0RWxlbWVudCcKLSAgICB9Ci0gIH0KLX07Ci0KLW1lc3NhZ2UgQWdncmVnYXRlTWVzc2FnZSB7Ci0gIG9wdGlvbiAobXNnb3B0KSA9IHsgaToxMDEgczonTWVzc2FnZUFubm90YXRpb24nIH07Ci0gIG9wdGlvbmFsIGludDMyIGZpZWxkbmFtZSA9IDEgWyhmaWVsZG9wdCkgPSB7IHM6J0ZpZWxkQW5ub3RhdGlvbicgfV07Ci19Ci0KLXNlcnZpY2UgQWdncmVnYXRlU2VydmljZSB7Ci0gIG9wdGlvbiAoc2VydmljZW9wdCkgPSB7IHM6J1NlcnZpY2VBbm5vdGF0aW9uJyB9OwotICBycGMgTWV0aG9kIChBZ2dyZWdhdGVNZXNzYWdlKSByZXR1cm5zIChBZ2dyZWdhdGVNZXNzYWdlKSB7Ci0gICAgb3B0aW9uIChtZXRob2RvcHQpID0geyBzOidNZXRob2RBbm5vdGF0aW9uJyB9OwotICB9Ci19Ci0KLWVudW0gQWdncmVnYXRlRW51bSB7Ci0gIG9wdGlvbiAoZW51bW9wdCkgPSB7IHM6J0VudW1Bbm5vdGF0aW9uJyB9OwotICBWQUxVRSA9IDEgWyhlbnVtdmFsb3B0KSA9IHsgczonRW51bVZhbHVlQW5ub3RhdGlvbicgfV07Ci19Ci0KLS8vIFRlc3QgY3VzdG9tIG9wdGlvbnMgZm9yIG5lc3RlZCB0eXBlLgotbWVzc2FnZSBOZXN0ZWRPcHRpb25UeXBlIHsKLSAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKLSAgICBvcHRpb24gKG1lc3NhZ2Vfb3B0MSkgPSAxMDAxOwotICAgIG9wdGlvbmFsIGludDMyIG5lc3RlZF9maWVsZCA9IDEgWyhmaWVsZF9vcHQxKSA9IDEwMDJdOwotICB9Ci0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgb3B0aW9uIChlbnVtX29wdDEpID0gMTAwMzsKLSAgICBORVNURURfRU5VTV9WQUxVRSA9IDEgWyhlbnVtX3ZhbHVlX29wdDEpID0gMTAwNF07Ci0gIH0KLSAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyB7Ci0gICAgb3B0aW9uYWwgaW50MzIgbmVzdGVkX2V4dGVuc2lvbiA9IDc5MTI1NzMgWyhmaWVsZF9vcHQyKSA9IDEwMDVdOwotICB9Ci19Ci0KLS8vIEN1c3RvbSBtZXNzYWdlIG9wdGlvbiB0aGF0IGhhcyBhIHJlcXVpcmVkIGVudW0gZmllbGQuCi0vLyBXQVJOSU5HOiB0aGlzIGlzIHN0cm9uZ2x5IGRpc2NvdXJhZ2VkIQotbWVzc2FnZSBPbGRPcHRpb25UeXBlIHsKLSAgZW51bSBUZXN0RW51bSB7Ci0gICAgT0xEX1ZBTFVFID0gMDsKLSAgfQotICByZXF1aXJlZCBUZXN0RW51bSB2YWx1ZSA9IDE7Ci19Ci0KLS8vIFVwZGF0ZWQgdmVyc2lvbiBvZiB0aGUgY3VzdG9tIG9wdGlvbiBhYm92ZS4KLW1lc3NhZ2UgTmV3T3B0aW9uVHlwZSB7Ci0gIGVudW0gVGVzdEVudW0gewotICAgIE9MRF9WQUxVRSA9IDA7Ci0gICAgTkVXX1ZBTFVFID0gMTsKLSAgfQotICByZXF1aXJlZCBUZXN0RW51bSB2YWx1ZSA9IDE7Ci19Ci0KLWV4dGVuZCBnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgewotICBvcHRpb25hbCBPbGRPcHRpb25UeXBlIHJlcXVpcmVkX2VudW1fb3B0ID0gMTA2MTYxODA3OwotfQotCi0vLyBUZXN0IG1lc3NhZ2UgdXNpbmcgdGhlICJyZXF1aXJlZF9lbnVtX29wdCIgb3B0aW9uIGRlZmluZWQgYWJvdmUuCi1tZXNzYWdlIFRlc3RNZXNzYWdlV2l0aFJlcXVpcmVkRW51bU9wdGlvbiB7Ci0gIG9wdGlvbiAocmVxdWlyZWRfZW51bV9vcHQpID0geyB2YWx1ZTogT0xEX1ZBTFVFIH07Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkOGIwZjliLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIEEgcHJvdG8gZmlsZSB3aGljaCBpbXBvcnRzIGEgcHJvdG8gZmlsZSB0aGF0IHVzZXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLS8vIFdlIG9wdGltaXplIGZvciBzcGVlZCBoZXJlLCBidXQgd2UgYXJlIGltcG9ydGluZyBhIHByb3RvIHRoYXQgaXMgb3B0aW1pemVkCi0vLyBmb3IgY29kZSBzaXplLgotb3B0aW9uIG9wdGltaXplX2ZvciA9IFNQRUVEOwotCi1tZXNzYWdlIFRlc3RFbWJlZE9wdGltaXplZEZvclNpemUgewotICAvLyBUZXN0IHRoYXQgZW1iZWRkaW5nIGEgbWVzc2FnZSB3aGljaCBoYXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFIGludG8KLSAgLy8gb25lIG9wdGltaXplZCBmb3Igc3BlZWQgd29ya3MuCi0gIG9wdGlvbmFsIFRlc3RPcHRpbWl6ZWRGb3JTaXplIG9wdGlvbmFsX21lc3NhZ2UgPSAxOwotICByZXBlYXRlZCBUZXN0T3B0aW1pemVkRm9yU2l6ZSByZXBlYXRlZF9tZXNzYWdlID0gMjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzNjQ0M2U3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwzOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gVGhpcyBmaWxlIGludGVudGlvbmFsbHkgbGVmdCBibGFuay4gIChBdCBvbmUgcG9pbnQgdGhpcyB3b3VsZG4ndCBjb21waWxlCi0vLyBjb3JyZWN0bHkuKQotCi1zeW50YXggPSAicHJvdG8yIjsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmU2NWRjMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSwxMDQ4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBBIHByb3RvIGZpbGUgdGhhdCBoYXMgYW4gZXh0cmVtZWx5IGxhcmdlIGRlc2NyaXB0b3IuICBVc2VkIHRvIHRlc3QgdGhhdAotLy8gZGVzY3JpcHRvcnMgb3ZlciA2NGsgZG9uJ3QgYnJlYWsgbGFuZ3VhZ2Utc3BlY2lmaWMgbGltaXRzIGluIGdlbmVyYXRlZCBjb2RlLAotLy8gc3VjaCBhcyB0aGUgc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIGxpbWl0IGluIEphdmEuCi0KLXN5bnRheCA9ICJwcm90bzIiOwotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci0KLS8vIEF2b2lkIGdlbmVyYXRpbmcgaW5zYW5lbHkgbG9uZyBtZXRob2RzLgotb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKLQotbWVzc2FnZSBUZXN0RW5vcm1vdXNEZXNjcmlwdG9yIHsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEgPSAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yID0gMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMyA9IDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQgPSA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ID0gNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNiA9IDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcgPSA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ID0gOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOSA9IDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwID0gMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExID0gMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyID0gMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzID0gMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0ID0gMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1ID0gMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2ID0gMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3ID0gMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4ID0gMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5ID0gMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwID0gMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxID0gMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyID0gMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzID0gMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0ID0gMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1ID0gMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2ID0gMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3ID0gMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4ID0gMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5ID0gMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwID0gMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxID0gMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyID0gMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzID0gMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0ID0gMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1ID0gMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2ID0gMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3ID0gMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4ID0gMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5ID0gMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwID0gNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxID0gNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyID0gNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzID0gNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0ID0gNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1ID0gNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2ID0gNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3ID0gNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4ID0gNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5ID0gNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwID0gNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxID0gNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyID0gNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzID0gNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0ID0gNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1ID0gNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2ID0gNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3ID0gNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4ID0gNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5ID0gNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwID0gNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxID0gNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyID0gNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzID0gNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0ID0gNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1ID0gNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2ID0gNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3ID0gNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4ID0gNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5ID0gNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwID0gNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxID0gNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyID0gNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczID0gNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0ID0gNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1ID0gNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2ID0gNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3ID0gNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4ID0gNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5ID0gNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwID0gODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxID0gODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyID0gODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzID0gODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0ID0gODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1ID0gODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2ID0gODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3ID0gODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4ID0gODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5ID0gODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwID0gOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxID0gOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyID0gOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzID0gOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0ID0gOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1ID0gOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2ID0gOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3ID0gOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4ID0gOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5ID0gOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMCA9IDEwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTAxID0gMTAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDIgPSAxMDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMyA9IDEwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA0ID0gMTA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDUgPSAxMDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwNiA9IDEwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTA3ID0gMTA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMDggPSAxMDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwOSA9IDEwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTEwID0gMTEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTEgPSAxMTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExMiA9IDExMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTEzID0gMTEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTQgPSAxMTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExNSA9IDExNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE2ID0gMTE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMTcgPSAxMTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzExOCA9IDExOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTE5ID0gMTE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjAgPSAxMjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyMSA9IDEyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTIyID0gMTIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjMgPSAxMjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNCA9IDEyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI1ID0gMTI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjYgPSAxMjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEyNyA9IDEyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTI4ID0gMTI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMjkgPSAxMjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMCA9IDEzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTMxID0gMTMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzIgPSAxMzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzMyA9IDEzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM0ID0gMTM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzUgPSAxMzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzNiA9IDEzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTM3ID0gMTM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xMzggPSAxMzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEzOSA9IDEzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQwID0gMTQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDEgPSAxNDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0MiA9IDE0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQzID0gMTQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDQgPSAxNDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0NSA9IDE0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ2ID0gMTQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNDcgPSAxNDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE0OCA9IDE0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTQ5ID0gMTQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTAgPSAxNTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1MSA9IDE1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTUyID0gMTUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTMgPSAxNTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NCA9IDE1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU1ID0gMTU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTYgPSAxNTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE1NyA9IDE1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTU4ID0gMTU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNTkgPSAxNTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MCA9IDE2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTYxID0gMTYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjIgPSAxNjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2MyA9IDE2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY0ID0gMTY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjUgPSAxNjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2NiA9IDE2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTY3ID0gMTY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNjggPSAxNjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE2OSA9IDE2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTcwID0gMTcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzEgPSAxNzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3MiA9IDE3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTczID0gMTczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzQgPSAxNzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3NSA9IDE3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc2ID0gMTc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xNzcgPSAxNzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE3OCA9IDE3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTc5ID0gMTc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODAgPSAxODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4MSA9IDE4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTgyID0gMTgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODMgPSAxODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NCA9IDE4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg1ID0gMTg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODYgPSAxODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE4NyA9IDE4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTg4ID0gMTg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xODkgPSAxODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MCA9IDE5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTkxID0gMTkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTIgPSAxOTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5MyA9IDE5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk0ID0gMTk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTUgPSAxOTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5NiA9IDE5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMTk3ID0gMTk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18xOTggPSAxOTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzE5OSA9IDE5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAwID0gMjAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDEgPSAyMDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwMiA9IDIwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjAzID0gMjAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDQgPSAyMDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwNSA9IDIwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA2ID0gMjA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMDcgPSAyMDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIwOCA9IDIwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjA5ID0gMjA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTAgPSAyMTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxMSA9IDIxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjEyID0gMjEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTMgPSAyMTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNCA9IDIxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE1ID0gMjE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTYgPSAyMTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIxNyA9IDIxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjE4ID0gMjE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMTkgPSAyMTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMCA9IDIyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjIxID0gMjIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjIgPSAyMjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyMyA9IDIyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI0ID0gMjI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjUgPSAyMjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyNiA9IDIyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjI3ID0gMjI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMjggPSAyMjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIyOSA9IDIyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMwID0gMjMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzEgPSAyMzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzMiA9IDIzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjMzID0gMjMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzQgPSAyMzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzNSA9IDIzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM2ID0gMjM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yMzcgPSAyMzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzIzOCA9IDIzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjM5ID0gMjM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDAgPSAyNDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0MSA9IDI0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQyID0gMjQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDMgPSAyNDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NCA9IDI0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ1ID0gMjQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDYgPSAyNDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI0NyA9IDI0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjQ4ID0gMjQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNDkgPSAyNDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MCA9IDI1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjUxID0gMjUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTIgPSAyNTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1MyA9IDI1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU0ID0gMjU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTUgPSAyNTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1NiA9IDI1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjU3ID0gMjU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNTggPSAyNTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI1OSA9IDI1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYwID0gMjYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjEgPSAyNjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2MiA9IDI2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjYzID0gMjYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjQgPSAyNjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2NSA9IDI2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY2ID0gMjY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNjcgPSAyNjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI2OCA9IDI2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjY5ID0gMjY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzAgPSAyNzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3MSA9IDI3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjcyID0gMjcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzMgPSAyNzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NCA9IDI3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc1ID0gMjc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzYgPSAyNzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI3NyA9IDI3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjc4ID0gMjc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yNzkgPSAyNzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MCA9IDI4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjgxID0gMjgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODIgPSAyODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4MyA9IDI4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg0ID0gMjg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODUgPSAyODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4NiA9IDI4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjg3ID0gMjg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yODggPSAyODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI4OSA9IDI4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkwID0gMjkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTEgPSAyOTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5MiA9IDI5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjkzID0gMjkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTQgPSAyOTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5NSA9IDI5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk2ID0gMjk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18yOTcgPSAyOTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzI5OCA9IDI5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMjk5ID0gMjk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDAgPSAzMDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwMSA9IDMwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzAyID0gMzAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDMgPSAzMDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNCA9IDMwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA1ID0gMzA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDYgPSAzMDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMwNyA9IDMwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzA4ID0gMzA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMDkgPSAzMDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMCA9IDMxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzExID0gMzExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTIgPSAzMTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxMyA9IDMxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE0ID0gMzE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTUgPSAzMTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxNiA9IDMxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzE3ID0gMzE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMTggPSAzMTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMxOSA9IDMxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIwID0gMzIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjEgPSAzMjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyMiA9IDMyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzIzID0gMzIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjQgPSAzMjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyNSA9IDMyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI2ID0gMzI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMjcgPSAzMjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMyOCA9IDMyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzI5ID0gMzI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzAgPSAzMzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzMSA9IDMzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzMyID0gMzMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzMgPSAzMzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNCA9IDMzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM1ID0gMzM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzYgPSAzMzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzMzNyA9IDMzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzM4ID0gMzM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zMzkgPSAzMzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MCA9IDM0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQxID0gMzQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDIgPSAzNDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0MyA9IDM0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ0ID0gMzQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDUgPSAzNDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0NiA9IDM0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzQ3ID0gMzQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNDggPSAzNDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM0OSA9IDM0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUwID0gMzUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTEgPSAzNTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1MiA9IDM1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzUzID0gMzUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTQgPSAzNTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1NSA9IDM1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU2ID0gMzU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNTcgPSAzNTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM1OCA9IDM1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzU5ID0gMzU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjAgPSAzNjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2MSA9IDM2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzYyID0gMzYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjMgPSAzNjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NCA9IDM2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY1ID0gMzY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjYgPSAzNjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM2NyA9IDM2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzY4ID0gMzY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNjkgPSAzNjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MCA9IDM3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzcxID0gMzcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzIgPSAzNzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3MyA9IDM3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc0ID0gMzc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzUgPSAzNzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3NiA9IDM3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzc3ID0gMzc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zNzggPSAzNzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM3OSA9IDM3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgwID0gMzgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODEgPSAzODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4MiA9IDM4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzgzID0gMzgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODQgPSAzODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4NSA9IDM4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg2ID0gMzg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zODcgPSAzODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM4OCA9IDM4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzg5ID0gMzg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTAgPSAzOTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5MSA9IDM5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzkyID0gMzkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTMgPSAzOTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NCA9IDM5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk1ID0gMzk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTYgPSAzOTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzM5NyA9IDM5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfMzk4ID0gMzk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ18zOTkgPSAzOTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMCA9IDQwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDAxID0gNDAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDIgPSA0MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwMyA9IDQwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA0ID0gNDA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDUgPSA0MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwNiA9IDQwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDA3ID0gNDA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MDggPSA0MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQwOSA9IDQwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDEwID0gNDEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTEgPSA0MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxMiA9IDQxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDEzID0gNDEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTQgPSA0MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxNSA9IDQxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE2ID0gNDE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MTcgPSA0MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQxOCA9IDQxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDE5ID0gNDE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjAgPSA0MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyMSA9IDQyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDIyID0gNDIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjMgPSA0MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNCA9IDQyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI1ID0gNDI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjYgPSA0MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQyNyA9IDQyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDI4ID0gNDI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MjkgPSA0MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMCA9IDQzMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDMxID0gNDMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzIgPSA0MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzMyA9IDQzMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM0ID0gNDM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzUgPSA0MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzNiA9IDQzNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDM3ID0gNDM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180MzggPSA0MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQzOSA9IDQzOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQwID0gNDQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDEgPSA0NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0MiA9IDQ0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQzID0gNDQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDQgPSA0NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0NSA9IDQ0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ2ID0gNDQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NDcgPSA0NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ0OCA9IDQ0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDQ5ID0gNDQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTAgPSA0NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1MSA9IDQ1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDUyID0gNDUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTMgPSA0NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NCA9IDQ1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU1ID0gNDU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTYgPSA0NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ1NyA9IDQ1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDU4ID0gNDU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NTkgPSA0NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MCA9IDQ2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDYxID0gNDYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjIgPSA0NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2MyA9IDQ2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY0ID0gNDY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjUgPSA0NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2NiA9IDQ2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDY3ID0gNDY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NjggPSA0NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ2OSA9IDQ2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDcwID0gNDcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzEgPSA0NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3MiA9IDQ3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDczID0gNDczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzQgPSA0NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3NSA9IDQ3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc2ID0gNDc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180NzcgPSA0NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ3OCA9IDQ3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDc5ID0gNDc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODAgPSA0ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4MSA9IDQ4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDgyID0gNDgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODMgPSA0ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NCA9IDQ4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg1ID0gNDg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODYgPSA0ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ4NyA9IDQ4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDg4ID0gNDg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180ODkgPSA0ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MCA9IDQ5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDkxID0gNDkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTIgPSA0OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5MyA9IDQ5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk0ID0gNDk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTUgPSA0OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5NiA9IDQ5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNDk3ID0gNDk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ180OTggPSA0OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzQ5OSA9IDQ5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAwID0gNTAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDEgPSA1MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwMiA9IDUwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTAzID0gNTAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDQgPSA1MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwNSA9IDUwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA2ID0gNTA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MDcgPSA1MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUwOCA9IDUwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTA5ID0gNTA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTAgPSA1MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxMSA9IDUxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTEyID0gNTEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTMgPSA1MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNCA9IDUxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE1ID0gNTE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTYgPSA1MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUxNyA9IDUxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTE4ID0gNTE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MTkgPSA1MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMCA9IDUyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTIxID0gNTIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjIgPSA1MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyMyA9IDUyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI0ID0gNTI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjUgPSA1MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyNiA9IDUyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTI3ID0gNTI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MjggPSA1MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUyOSA9IDUyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMwID0gNTMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzEgPSA1MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzMiA9IDUzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTMzID0gNTMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzQgPSA1MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzNSA9IDUzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM2ID0gNTM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181MzcgPSA1MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzUzOCA9IDUzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTM5ID0gNTM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDAgPSA1NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0MSA9IDU0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQyID0gNTQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDMgPSA1NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NCA9IDU0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ1ID0gNTQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDYgPSA1NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU0NyA9IDU0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTQ4ID0gNTQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NDkgPSA1NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MCA9IDU1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTUxID0gNTUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTIgPSA1NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1MyA9IDU1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU0ID0gNTU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTUgPSA1NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1NiA9IDU1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTU3ID0gNTU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NTggPSA1NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU1OSA9IDU1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYwID0gNTYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjEgPSA1NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2MiA9IDU2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTYzID0gNTYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjQgPSA1NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2NSA9IDU2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY2ID0gNTY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NjcgPSA1NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU2OCA9IDU2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTY5ID0gNTY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzAgPSA1NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3MSA9IDU3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTcyID0gNTcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzMgPSA1NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NCA9IDU3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc1ID0gNTc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzYgPSA1NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU3NyA9IDU3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTc4ID0gNTc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181NzkgPSA1NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MCA9IDU4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTgxID0gNTgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODIgPSA1ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4MyA9IDU4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg0ID0gNTg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODUgPSA1ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4NiA9IDU4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTg3ID0gNTg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181ODggPSA1ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU4OSA9IDU4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkwID0gNTkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTEgPSA1OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5MiA9IDU5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTkzID0gNTkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTQgPSA1OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5NSA9IDU5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk2ID0gNTk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ181OTcgPSA1OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzU5OCA9IDU5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNTk5ID0gNTk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDAgPSA2MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwMSA9IDYwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjAyID0gNjAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDMgPSA2MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNCA9IDYwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA1ID0gNjA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDYgPSA2MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYwNyA9IDYwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjA4ID0gNjA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MDkgPSA2MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMCA9IDYxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjExID0gNjExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTIgPSA2MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxMyA9IDYxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE0ID0gNjE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTUgPSA2MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxNiA9IDYxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjE3ID0gNjE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MTggPSA2MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYxOSA9IDYxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIwID0gNjIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjEgPSA2MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyMiA9IDYyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjIzID0gNjIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjQgPSA2MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyNSA9IDYyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI2ID0gNjI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MjcgPSA2MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYyOCA9IDYyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjI5ID0gNjI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzAgPSA2MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzMSA9IDYzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjMyID0gNjMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzMgPSA2MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNCA9IDYzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM1ID0gNjM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzYgPSA2MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzYzNyA9IDYzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjM4ID0gNjM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182MzkgPSA2MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MCA9IDY0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQxID0gNjQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDIgPSA2NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0MyA9IDY0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ0ID0gNjQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDUgPSA2NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0NiA9IDY0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjQ3ID0gNjQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NDggPSA2NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY0OSA9IDY0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUwID0gNjUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTEgPSA2NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1MiA9IDY1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjUzID0gNjUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTQgPSA2NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1NSA9IDY1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU2ID0gNjU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NTcgPSA2NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY1OCA9IDY1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjU5ID0gNjU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjAgPSA2NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2MSA9IDY2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjYyID0gNjYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjMgPSA2NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NCA9IDY2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY1ID0gNjY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjYgPSA2NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY2NyA9IDY2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjY4ID0gNjY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NjkgPSA2NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MCA9IDY3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjcxID0gNjcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzIgPSA2NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3MyA9IDY3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc0ID0gNjc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzUgPSA2NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3NiA9IDY3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjc3ID0gNjc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182NzggPSA2NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY3OSA9IDY3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgwID0gNjgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODEgPSA2ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4MiA9IDY4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjgzID0gNjgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODQgPSA2ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4NSA9IDY4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg2ID0gNjg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182ODcgPSA2ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY4OCA9IDY4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjg5ID0gNjg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTAgPSA2OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5MSA9IDY5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjkyID0gNjkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTMgPSA2OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NCA9IDY5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk1ID0gNjk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTYgPSA2OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzY5NyA9IDY5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNjk4ID0gNjk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ182OTkgPSA2OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMCA9IDcwMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzAxID0gNzAxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDIgPSA3MDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwMyA9IDcwMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA0ID0gNzA0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDUgPSA3MDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwNiA9IDcwNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzA3ID0gNzA3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MDggPSA3MDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcwOSA9IDcwOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzEwID0gNzEwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTEgPSA3MTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxMiA9IDcxMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzEzID0gNzEzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTQgPSA3MTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxNSA9IDcxNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE2ID0gNzE2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MTcgPSA3MTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcxOCA9IDcxOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzE5ID0gNzE5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjAgPSA3MjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyMSA9IDcyMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzIyID0gNzIyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjMgPSA3MjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNCA9IDcyNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI1ID0gNzI1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjYgPSA3MjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzcyNyA9IDcyNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzI4ID0gNzI4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MjkgPSA3MjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMCA9IDczMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzMxID0gNzMxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzIgPSA3MzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczMyA9IDczMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM0ID0gNzM0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzUgPSA3MzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczNiA9IDczNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzM3ID0gNzM3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183MzggPSA3MzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzczOSA9IDczOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQwID0gNzQwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDEgPSA3NDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0MiA9IDc0MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQzID0gNzQzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDQgPSA3NDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0NSA9IDc0NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ2ID0gNzQ2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NDcgPSA3NDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc0OCA9IDc0OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzQ5ID0gNzQ5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTAgPSA3NTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1MSA9IDc1MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzUyID0gNzUyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTMgPSA3NTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NCA9IDc1NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU1ID0gNzU1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTYgPSA3NTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc1NyA9IDc1NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzU4ID0gNzU4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NTkgPSA3NTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MCA9IDc2MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzYxID0gNzYxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjIgPSA3NjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2MyA9IDc2MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY0ID0gNzY0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjUgPSA3NjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2NiA9IDc2NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzY3ID0gNzY3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NjggPSA3NjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc2OSA9IDc2OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzcwID0gNzcwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzEgPSA3NzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3MiA9IDc3MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzczID0gNzczIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzQgPSA3NzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3NSA9IDc3NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc2ID0gNzc2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183NzcgPSA3NzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc3OCA9IDc3OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzc5ID0gNzc5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODAgPSA3ODAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4MSA9IDc4MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzgyID0gNzgyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODMgPSA3ODMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NCA9IDc4NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg1ID0gNzg1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODYgPSA3ODYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc4NyA9IDc4NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzg4ID0gNzg4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183ODkgPSA3ODkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MCA9IDc5MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzkxID0gNzkxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTIgPSA3OTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5MyA9IDc5MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk0ID0gNzk0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTUgPSA3OTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5NiA9IDc5NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfNzk3ID0gNzk3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ183OTggPSA3OTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzc5OSA9IDc5OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAwID0gODAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDEgPSA4MDEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwMiA9IDgwMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODAzID0gODAzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDQgPSA4MDQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwNSA9IDgwNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA2ID0gODA2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MDcgPSA4MDcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgwOCA9IDgwOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODA5ID0gODA5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTAgPSA4MTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxMSA9IDgxMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODEyID0gODEyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTMgPSA4MTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNCA9IDgxNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE1ID0gODE1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTYgPSA4MTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgxNyA9IDgxNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODE4ID0gODE4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MTkgPSA4MTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMCA9IDgyMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODIxID0gODIxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjIgPSA4MjIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyMyA9IDgyMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI0ID0gODI0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjUgPSA4MjUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyNiA9IDgyNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODI3ID0gODI3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MjggPSA4MjggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgyOSA9IDgyOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMwID0gODMwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzEgPSA4MzEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzMiA9IDgzMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODMzID0gODMzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzQgPSA4MzQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzNSA9IDgzNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM2ID0gODM2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184MzcgPSA4MzcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzgzOCA9IDgzOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODM5ID0gODM5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDAgPSA4NDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0MSA9IDg0MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQyID0gODQyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDMgPSA4NDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NCA9IDg0NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ1ID0gODQ1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDYgPSA4NDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg0NyA9IDg0NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODQ4ID0gODQ4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NDkgPSA4NDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MCA9IDg1MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODUxID0gODUxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTIgPSA4NTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1MyA9IDg1MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU0ID0gODU0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTUgPSA4NTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1NiA9IDg1NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODU3ID0gODU3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NTggPSA4NTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg1OSA9IDg1OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYwID0gODYwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjEgPSA4NjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2MiA9IDg2MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODYzID0gODYzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjQgPSA4NjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2NSA9IDg2NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY2ID0gODY2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NjcgPSA4NjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg2OCA9IDg2OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODY5ID0gODY5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzAgPSA4NzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3MSA9IDg3MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODcyID0gODcyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzMgPSA4NzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NCA9IDg3NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc1ID0gODc1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzYgPSA4NzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg3NyA9IDg3NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODc4ID0gODc4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184NzkgPSA4NzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MCA9IDg4MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODgxID0gODgxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODIgPSA4ODIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4MyA9IDg4MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg0ID0gODg0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODUgPSA4ODUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4NiA9IDg4NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODg3ID0gODg3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184ODggPSA4ODggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg4OSA9IDg4OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkwID0gODkwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTEgPSA4OTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5MiA9IDg5MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODkzID0gODkzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTQgPSA4OTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5NSA9IDg5NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk2ID0gODk2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ184OTcgPSA4OTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzg5OCA9IDg5OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfODk5ID0gODk5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDAgPSA5MDAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwMSA9IDkwMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTAyID0gOTAyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDMgPSA5MDMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNCA9IDkwNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA1ID0gOTA1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDYgPSA5MDYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkwNyA9IDkwNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTA4ID0gOTA4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MDkgPSA5MDkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMCA9IDkxMCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTExID0gOTExIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTIgPSA5MTIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxMyA9IDkxMyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE0ID0gOTE0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTUgPSA5MTUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxNiA9IDkxNiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTE3ID0gOTE3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MTggPSA5MTggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkxOSA9IDkxOSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIwID0gOTIwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjEgPSA5MjEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyMiA9IDkyMiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTIzID0gOTIzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjQgPSA5MjQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyNSA9IDkyNSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI2ID0gOTI2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MjcgPSA5MjcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkyOCA9IDkyOCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTI5ID0gOTI5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzAgPSA5MzAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzMSA9IDkzMSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTMyID0gOTMyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzMgPSA5MzMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNCA9IDkzNCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM1ID0gOTM1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzYgPSA5MzYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzkzNyA9IDkzNyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTM4ID0gOTM4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185MzkgPSA5MzkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MCA9IDk0MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQxID0gOTQxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDIgPSA5NDIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0MyA9IDk0MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ0ID0gOTQ0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDUgPSA5NDUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0NiA9IDk0NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTQ3ID0gOTQ3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NDggPSA5NDggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk0OSA9IDk0OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUwID0gOTUwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTEgPSA5NTEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1MiA9IDk1MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTUzID0gOTUzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTQgPSA5NTQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1NSA9IDk1NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU2ID0gOTU2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NTcgPSA5NTcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk1OCA9IDk1OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTU5ID0gOTU5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjAgPSA5NjAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2MSA9IDk2MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTYyID0gOTYyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjMgPSA5NjMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NCA9IDk2NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY1ID0gOTY1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjYgPSA5NjYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk2NyA9IDk2NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTY4ID0gOTY4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NjkgPSA5NjkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MCA9IDk3MCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTcxID0gOTcxIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzIgPSA5NzIgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3MyA9IDk3MyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc0ID0gOTc0IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzUgPSA5NzUgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3NiA9IDk3NiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTc3ID0gOTc3IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185NzggPSA5NzggW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk3OSA9IDk3OSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgwID0gOTgwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODEgPSA5ODEgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4MiA9IDk4MiBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTgzID0gOTgzIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODQgPSA5ODQgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4NSA9IDk4NSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg2ID0gOTg2IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185ODcgPSA5ODcgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk4OCA9IDk4OCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTg5ID0gOTg5IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTAgPSA5OTAgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5MSA9IDk5MSBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTkyID0gOTkyIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTMgPSA5OTMgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NCA9IDk5NCBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk1ID0gOTk1IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTYgPSA5OTYgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzk5NyA9IDk5NyBbZGVmYXVsdD0ibG9uZyBkZWZhdWx0IHZhbHVlIGlzIGFsc28gbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZyJdOwotICBvcHRpb25hbCBzdHJpbmcgbG9uZ19maWVsZF9uYW1lX2lzX2xvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmdfOTk4ID0gOTk4IFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBsb25nX2ZpZWxkX25hbWVfaXNfbG9vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29uZ185OTkgPSA5OTkgW2RlZmF1bHQ9ImxvbmcgZGVmYXVsdCB2YWx1ZSBpcyBhbHNvIGxvb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vbmciXTsKLSAgb3B0aW9uYWwgc3RyaW5nIGxvbmdfZmllbGRfbmFtZV9pc19sb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nXzEwMDAgPSAxMDAwIFtkZWZhdWx0PSJsb25nIGRlZmF1bHQgdmFsdWUgaXMgYWxzbyBsb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb29vb25nIl07Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4ZDAzZTM4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNzMgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIEEgcHJvdG8gZmlsZSB3aGljaCBpcyBpbXBvcnRlZCBieSB1bml0dGVzdC5wcm90byB0byB0ZXN0IGltcG9ydGluZy4KLQotc3ludGF4ID0gInByb3RvMiI7Ci0KLS8vIFdlIGRvbid0IHB1dCB0aGlzIGluIGEgcGFja2FnZSB3aXRoaW4gcHJvdG8yIGJlY2F1c2Ugd2UgbmVlZCB0byBtYWtlIHN1cmUKLS8vIHRoYXQgdGhlIGdlbmVyYXRlZCBjb2RlIGRvZXNuJ3QgZGVwZW5kIG9uIGJlaW5nIGluIHRoZSBwcm90bzIgbmFtZXNwYWNlLgotLy8gSW4gdGVzdF91dGlsLmggd2UgZG8KLS8vICJ1c2luZyBuYW1lc3BhY2UgdW5pdHRlc3RfaW1wb3J0ID0gcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0Ii4KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OwotCi1vcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7Ci1vcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7Ci0KLS8vIEV4ZXJjaXNlIHRoZSBqYXZhX3BhY2thZ2Ugb3B0aW9uLgotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QiOwotCi0vLyBEbyBub3Qgc2V0IGEgamF2YV9vdXRlcl9jbGFzc25hbWUgaGVyZSB0byB2ZXJpZnkgdGhhdCBQcm90bzIgd29ya3Mgd2l0aG91dAotLy8gb25lLgotCi0vLyBUZXN0IHB1YmxpYyBpbXBvcnQKLWltcG9ydCBwdWJsaWMgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIjsKLQotbWVzc2FnZSBJbXBvcnRNZXNzYWdlIHsKLSAgb3B0aW9uYWwgaW50MzIgZCA9IDE7Ci19Ci0KLWVudW0gSW1wb3J0RW51bSB7Ci0gIElNUE9SVF9GT08gPSA3OwotICBJTVBPUlRfQkFSID0gODsKLSAgSU1QT1JUX0JBWiA9IDk7Ci19Ci0KLQotLy8gVG8gdXNlIGFuIGVudW0gaW4gYSBtYXAsIGl0IG11c3QgaGFzIHRoZSBmaXJzdCB2YWx1ZSBhcyAwLgotZW51bSBJbXBvcnRFbnVtRm9yTWFwIHsKLSAgVU5LTk9XTiA9IDA7Ci0gIEZPTyA9IDE7Ci0gIEJBUiA9IDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTdhZmE0NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLS8vCi0vLyBUaGlzIGlzIGxpa2UgdW5pdHRlc3RfaW1wb3J0LnByb3RvIGJ1dCB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydDsKLQotb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLQotb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKLQotaW1wb3J0IHB1YmxpYyAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90byI7Ci0KLW1lc3NhZ2UgSW1wb3J0TWVzc2FnZUxpdGUgewotICBvcHRpb25hbCBpbnQzMiBkID0gMTsKLX0KLQotZW51bSBJbXBvcnRFbnVtTGl0ZSB7Ci0gIElNUE9SVF9MSVRFX0ZPTyA9IDc7Ci0gIElNUE9SVF9MSVRFX0JBUiA9IDg7Ci0gIElNUE9SVF9MSVRFX0JBWiA9IDk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDg3OGVjN2MuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDA3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLwotLy8gVGhpcyBpcyBsaWtlIHVuaXR0ZXN0LnByb3RvIGJ1dCB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRS4KLQotc3ludGF4ID0gInByb3RvMiI7Ci1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1pbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byI7Ci0KLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci0KLS8vIFNhbWUgYXMgVGVzdEFsbFR5cGVzIGJ1dCB3aXRoIHRoZSBsaXRlIHJ1bnRpbWUuCi1tZXNzYWdlIFRlc3RBbGxUeXBlc0xpdGUgewotCi0gIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOwotICAgIG9wdGlvbmFsIGludDY0IGNjID0gMjsKLSAgfQotCi0gIGVudW0gTmVzdGVkRW51bSB7Ci0gICAgRk9PID0gMTsKLSAgICBCQVIgPSAyOwotICAgIEJBWiA9IDM7Ci0gIH0KLQotICAvLyBTaW5ndWxhcgotICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOwotICBvcHRpb25hbCAgICBpbnQ2NCBvcHRpb25hbF9pbnQ2NCAgICA9ICAyOwotICBvcHRpb25hbCAgIHVpbnQzMiBvcHRpb25hbF91aW50MzIgICA9ICAzOwotICBvcHRpb25hbCAgIHVpbnQ2NCBvcHRpb25hbF91aW50NjQgICA9ICA0OwotICBvcHRpb25hbCAgIHNpbnQzMiBvcHRpb25hbF9zaW50MzIgICA9ICA1OwotICBvcHRpb25hbCAgIHNpbnQ2NCBvcHRpb25hbF9zaW50NjQgICA9ICA2OwotICBvcHRpb25hbCAgZml4ZWQzMiBvcHRpb25hbF9maXhlZDMyICA9ICA3OwotICBvcHRpb25hbCAgZml4ZWQ2NCBvcHRpb25hbF9maXhlZDY0ICA9ICA4OwotICBvcHRpb25hbCBzZml4ZWQzMiBvcHRpb25hbF9zZml4ZWQzMiA9ICA5OwotICBvcHRpb25hbCBzZml4ZWQ2NCBvcHRpb25hbF9zZml4ZWQ2NCA9IDEwOwotICBvcHRpb25hbCAgICBmbG9hdCBvcHRpb25hbF9mbG9hdCAgICA9IDExOwotICBvcHRpb25hbCAgIGRvdWJsZSBvcHRpb25hbF9kb3VibGUgICA9IDEyOwotICBvcHRpb25hbCAgICAgYm9vbCBvcHRpb25hbF9ib29sICAgICA9IDEzOwotICBvcHRpb25hbCAgIHN0cmluZyBvcHRpb25hbF9zdHJpbmcgICA9IDE0OwotICBvcHRpb25hbCAgICBieXRlcyBvcHRpb25hbF9ieXRlcyAgICA9IDE1OwotCi0gIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSAxNiB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDE3OwotICB9Ci0KLSAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSAgICAgIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICA9IDE4OwotICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZUxpdGUgb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlID0gMTk7Ci0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQotICAgIG9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlID0gMjA7Ci0KLSAgb3B0aW9uYWwgTmVzdGVkRW51bSAgICAgIG9wdGlvbmFsX25lc3RlZF9lbnVtICAgICA9IDIxOwotICBvcHRpb25hbCBGb3JlaWduRW51bUxpdGUgb3B0aW9uYWxfZm9yZWlnbl9lbnVtICAgID0gMjI7Ci0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZSBvcHRpb25hbF9pbXBvcnRfZW51bSA9IDIzOwotCi0gIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2UgPSAyNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmQgPSAyNSBbY3R5cGU9Q09SRF07Ci0KLSAgLy8gRGVmaW5lZCBpbiB1bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvCi0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJbXBvcnRNZXNzYWdlTGl0ZQotICAgICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlID0gMjY7Ci0KLSAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9sYXp5X21lc3NhZ2UgPSAyNyBbbGF6eT10cnVlXTsKLQotICAvLyBSZXBlYXRlZAotICByZXBlYXRlZCAgICBpbnQzMiByZXBlYXRlZF9pbnQzMiAgICA9IDMxOwotICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NCAgICA9IDMyOwotICByZXBlYXRlZCAgIHVpbnQzMiByZXBlYXRlZF91aW50MzIgICA9IDMzOwotICByZXBlYXRlZCAgIHVpbnQ2NCByZXBlYXRlZF91aW50NjQgICA9IDM0OwotICByZXBlYXRlZCAgIHNpbnQzMiByZXBlYXRlZF9zaW50MzIgICA9IDM1OwotICByZXBlYXRlZCAgIHNpbnQ2NCByZXBlYXRlZF9zaW50NjQgICA9IDM2OwotICByZXBlYXRlZCAgZml4ZWQzMiByZXBlYXRlZF9maXhlZDMyICA9IDM3OwotICByZXBlYXRlZCAgZml4ZWQ2NCByZXBlYXRlZF9maXhlZDY0ICA9IDM4OwotICByZXBlYXRlZCBzZml4ZWQzMiByZXBlYXRlZF9zZml4ZWQzMiA9IDM5OwotICByZXBlYXRlZCBzZml4ZWQ2NCByZXBlYXRlZF9zZml4ZWQ2NCA9IDQwOwotICByZXBlYXRlZCAgICBmbG9hdCByZXBlYXRlZF9mbG9hdCAgICA9IDQxOwotICByZXBlYXRlZCAgIGRvdWJsZSByZXBlYXRlZF9kb3VibGUgICA9IDQyOwotICByZXBlYXRlZCAgICAgYm9vbCByZXBlYXRlZF9ib29sICAgICA9IDQzOwotICByZXBlYXRlZCAgIHN0cmluZyByZXBlYXRlZF9zdHJpbmcgICA9IDQ0OwotICByZXBlYXRlZCAgICBieXRlcyByZXBlYXRlZF9ieXRlcyAgICA9IDQ1OwotCi0gIHJlcGVhdGVkIGdyb3VwIFJlcGVhdGVkR3JvdXAgPSA0NiB7Ci0gICAgb3B0aW9uYWwgaW50MzIgYSA9IDQ3OwotICB9Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICA9IDQ4OwotICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZUxpdGUgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlID0gNDk7Ci0gIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRNZXNzYWdlTGl0ZQotICAgIHJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlID0gNTA7Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkRW51bSAgICAgIHJlcGVhdGVkX25lc3RlZF9lbnVtICA9IDUxOwotICByZXBlYXRlZCBGb3JlaWduRW51bUxpdGUgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtID0gNTI7Ci0gIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZSByZXBlYXRlZF9pbXBvcnRfZW51bSA9IDUzOwotCi0gIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9zdHJpbmdfcGllY2UgPSA1NCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmQgPSA1NSBbY3R5cGU9Q09SRF07Ci0KLSAgcmVwZWF0ZWQgTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9sYXp5X21lc3NhZ2UgPSA1NyBbbGF6eT10cnVlXTsKLQotICAvLyBTaW5ndWxhciB3aXRoIGRlZmF1bHRzCi0gIG9wdGlvbmFsICAgIGludDMyIGRlZmF1bHRfaW50MzIgICAgPSA2MSBbZGVmYXVsdCA9ICA0MSAgICBdOwotICBvcHRpb25hbCAgICBpbnQ2NCBkZWZhdWx0X2ludDY0ICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKLSAgb3B0aW9uYWwgICB1aW50MzIgZGVmYXVsdF91aW50MzIgICA9IDYzIFtkZWZhdWx0ID0gIDQzICAgIF07Ci0gIG9wdGlvbmFsICAgdWludDY0IGRlZmF1bHRfdWludDY0ICAgPSA2NCBbZGVmYXVsdCA9ICA0NCAgICBdOwotICBvcHRpb25hbCAgIHNpbnQzMiBkZWZhdWx0X3NpbnQzMiAgID0gNjUgW2RlZmF1bHQgPSAtNDUgICAgXTsKLSAgb3B0aW9uYWwgICBzaW50NjQgZGVmYXVsdF9zaW50NjQgICA9IDY2IFtkZWZhdWx0ID0gIDQ2ICAgIF07Ci0gIG9wdGlvbmFsICBmaXhlZDMyIGRlZmF1bHRfZml4ZWQzMiAgPSA2NyBbZGVmYXVsdCA9ICA0NyAgICBdOwotICBvcHRpb25hbCAgZml4ZWQ2NCBkZWZhdWx0X2ZpeGVkNjQgID0gNjggW2RlZmF1bHQgPSAgNDggICAgXTsKLSAgb3B0aW9uYWwgc2ZpeGVkMzIgZGVmYXVsdF9zZml4ZWQzMiA9IDY5IFtkZWZhdWx0ID0gIDQ5ICAgIF07Ci0gIG9wdGlvbmFsIHNmaXhlZDY0IGRlZmF1bHRfc2ZpeGVkNjQgPSA3MCBbZGVmYXVsdCA9IC01MCAgICBdOwotICBvcHRpb25hbCAgICBmbG9hdCBkZWZhdWx0X2Zsb2F0ICAgID0gNzEgW2RlZmF1bHQgPSAgNTEuNSAgXTsKLSAgb3B0aW9uYWwgICBkb3VibGUgZGVmYXVsdF9kb3VibGUgICA9IDcyIFtkZWZhdWx0ID0gIDUyZTMgIF07Ci0gIG9wdGlvbmFsICAgICBib29sIGRlZmF1bHRfYm9vbCAgICAgPSA3MyBbZGVmYXVsdCA9IHRydWUgICBdOwotICBvcHRpb25hbCAgIHN0cmluZyBkZWZhdWx0X3N0cmluZyAgID0gNzQgW2RlZmF1bHQgPSAiaGVsbG8iXTsKLSAgb3B0aW9uYWwgICAgYnl0ZXMgZGVmYXVsdF9ieXRlcyAgICA9IDc1IFtkZWZhdWx0ID0gIndvcmxkIl07Ci0KLSAgb3B0aW9uYWwgTmVzdGVkRW51bSBkZWZhdWx0X25lc3RlZF9lbnVtID0gODEgW2RlZmF1bHQgPSBCQVJdOwotICBvcHRpb25hbCBGb3JlaWduRW51bUxpdGUgZGVmYXVsdF9mb3JlaWduX2VudW0gPSA4MgotICAgICAgW2RlZmF1bHQgPSBGT1JFSUdOX0xJVEVfQkFSXTsKLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCi0gICAgICBkZWZhdWx0X2ltcG9ydF9lbnVtID0gODMgW2RlZmF1bHQgPSBJTVBPUlRfTElURV9CQVJdOwotCi0gIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19waWVjZSA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsZGVmYXVsdD0iYWJjIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmQgPSA4NSBbY3R5cGU9Q09SRCxkZWZhdWx0PSIxMjMiXTsKLQotICAvLyBGb3Igb25lb2YgdGVzdAotICBvbmVvZiBvbmVvZl9maWVsZCB7Ci0gICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKLSAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlID0gMTEyOwotICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMTM7Ci0gICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMTQ7Ci0gICAgTmVzdGVkTWVzc2FnZSBvbmVvZl9sYXp5X25lc3RlZF9tZXNzYWdlID0gMTE1IFtsYXp5ID0gdHJ1ZV07Ci0gIH0KLX0KLQotbWVzc2FnZSBGb3JlaWduTWVzc2FnZUxpdGUgewotICBvcHRpb25hbCBpbnQzMiBjID0gMTsKLX0KLQotZW51bSBGb3JlaWduRW51bUxpdGUgewotICBGT1JFSUdOX0xJVEVfRk9PID0gNDsKLSAgRk9SRUlHTl9MSVRFX0JBUiA9IDU7Ci0gIEZPUkVJR05fTElURV9CQVogPSA2OwotfQotCi1tZXNzYWdlIFRlc3RQYWNrZWRUeXBlc0xpdGUgewotICByZXBlYXRlZCAgICBpbnQzMiBwYWNrZWRfaW50MzIgICAgPSAgOTAgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgICBpbnQ2NCBwYWNrZWRfaW50NjQgICAgPSAgOTEgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIHVpbnQzMiBwYWNrZWRfdWludDMyICAgPSAgOTIgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIHVpbnQ2NCBwYWNrZWRfdWludDY0ICAgPSAgOTMgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIHNpbnQzMiBwYWNrZWRfc2ludDMyICAgPSAgOTQgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIHNpbnQ2NCBwYWNrZWRfc2ludDY0ICAgPSAgOTUgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgZml4ZWQzMiBwYWNrZWRfZml4ZWQzMiAgPSAgOTYgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgZml4ZWQ2NCBwYWNrZWRfZml4ZWQ2NCAgPSAgOTcgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCBzZml4ZWQzMiBwYWNrZWRfc2ZpeGVkMzIgPSAgOTggW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCBzZml4ZWQ2NCBwYWNrZWRfc2ZpeGVkNjQgPSAgOTkgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgICBmbG9hdCBwYWNrZWRfZmxvYXQgICAgPSAxMDAgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgIGRvdWJsZSBwYWNrZWRfZG91YmxlICAgPSAxMDEgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCAgICAgYm9vbCBwYWNrZWRfYm9vbCAgICAgPSAxMDIgW3BhY2tlZCA9IHRydWVdOwotICByZXBlYXRlZCBGb3JlaWduRW51bUxpdGUgcGFja2VkX2VudW0gID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKLX0KLQotbWVzc2FnZSBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgewotICBleHRlbnNpb25zIDEgdG8gbWF4OwotfQotCi1leHRlbmQgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIHsKLSAgLy8gU2luZ3VsYXIKLSAgb3B0aW9uYWwgICAgaW50MzIgb3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAgPSAgMTsKLSAgb3B0aW9uYWwgICAgaW50NjQgb3B0aW9uYWxfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAgPSAgMjsKLSAgb3B0aW9uYWwgICB1aW50MzIgb3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl9saXRlICAgPSAgMzsKLSAgb3B0aW9uYWwgICB1aW50NjQgb3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl9saXRlICAgPSAgNDsKLSAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl9saXRlICAgPSAgNTsKLSAgb3B0aW9uYWwgICBzaW50NjQgb3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl9saXRlICAgPSAgNjsKLSAgb3B0aW9uYWwgIGZpeGVkMzIgb3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAgPSAgNzsKLSAgb3B0aW9uYWwgIGZpeGVkNjQgb3B0aW9uYWxfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAgPSAgODsKLSAgb3B0aW9uYWwgc2ZpeGVkMzIgb3B0aW9uYWxfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgPSAgOTsKLSAgb3B0aW9uYWwgc2ZpeGVkNjQgb3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSAxMDsKLSAgb3B0aW9uYWwgICAgZmxvYXQgb3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAgPSAxMTsKLSAgb3B0aW9uYWwgICBkb3VibGUgb3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbl9saXRlICAgPSAxMjsKLSAgb3B0aW9uYWwgICAgIGJvb2wgb3B0aW9uYWxfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAgPSAxMzsKLSAgb3B0aW9uYWwgICBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAgPSAxNDsKLSAgb3B0aW9uYWwgICAgYnl0ZXMgb3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAgPSAxNTsKLQotICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlID0gMTYgewotICAgIG9wdGlvbmFsIGludDMyIGEgPSAxNzsKLSAgfQotCi0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZQotICAgICAgPSAxODsKLSAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2VMaXRlIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDE5OwotICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZUxpdGUKLSAgICBvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDIwOwotCi0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bSBvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDIxOwotICBvcHRpb25hbCBGb3JlaWduRW51bUxpdGUgb3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlID0gMjI7Ci0gIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZQotICAgIG9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlID0gMjM7Ci0KLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb25fbGl0ZSA9IDI0Ci0gICAgICBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uX2xpdGUgPSAyNSBbY3R5cGU9Q09SRF07Ci0KLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlCi0gICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMjY7Ci0KLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlCi0gICAgb3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMjcgW2xhenk9dHJ1ZV07Ci0KLSAgLy8gUmVwZWF0ZWQKLSAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAgPSAzMTsKLSAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAgPSAzMjsKLSAgcmVwZWF0ZWQgICB1aW50MzIgcmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbl9saXRlICAgPSAzMzsKLSAgcmVwZWF0ZWQgICB1aW50NjQgcmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbl9saXRlICAgPSAzNDsKLSAgcmVwZWF0ZWQgICBzaW50MzIgcmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbl9saXRlICAgPSAzNTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgcmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAgPSAzNjsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgcmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb25fbGl0ZSAgPSAzNzsKLSAgcmVwZWF0ZWQgIGZpeGVkNjQgcmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb25fbGl0ZSAgPSAzODsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgcmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgPSAzOTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgcmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgPSA0MDsKLSAgcmVwZWF0ZWQgICAgZmxvYXQgcmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uX2xpdGUgICAgPSA0MTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgcmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAgPSA0MjsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgcmVwZWF0ZWRfYm9vbF9leHRlbnNpb25fbGl0ZSAgICAgPSA0MzsKLSAgcmVwZWF0ZWQgICBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl9saXRlICAgPSA0NDsKLSAgcmVwZWF0ZWQgICAgYnl0ZXMgcmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAgPSA0NTsKLQotICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlID0gNDYgewotICAgIG9wdGlvbmFsIGludDMyIGEgPSA0NzsKLSAgfQotCi0gIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZSByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZQotICAgICAgPSA0ODsKLSAgcmVwZWF0ZWQgRm9yZWlnbk1lc3NhZ2VMaXRlIHJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDQ5OwotICByZXBlYXRlZCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuSW1wb3J0TWVzc2FnZUxpdGUKLSAgICByZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDUwOwotCi0gIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bSByZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDUxOwotICByZXBlYXRlZCBGb3JlaWduRW51bUxpdGUgcmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlID0gNTI7Ci0gIHJlcGVhdGVkIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5JbXBvcnRFbnVtTGl0ZQotICAgIHJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlID0gNTM7Ci0KLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25fbGl0ZSA9IDU0Ci0gICAgICBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKLSAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uX2xpdGUgPSA1NSBbY3R5cGU9Q09SRF07Ci0KLSAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlCi0gICAgcmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gNTcgW2xhenk9dHJ1ZV07Ci0KLSAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cwotICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyX2V4dGVuc2lvbl9saXRlICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKLSAgb3B0aW9uYWwgICAgaW50NjQgZGVmYXVsdF9pbnQ2NF9leHRlbnNpb25fbGl0ZSAgICA9IDYyIFtkZWZhdWx0ID0gIDQyICAgIF07Ci0gIG9wdGlvbmFsICAgdWludDMyIGRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl9saXRlICAgPSA2MyBbZGVmYXVsdCA9ICA0MyAgICBdOwotICBvcHRpb25hbCAgIHVpbnQ2NCBkZWZhdWx0X3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gNjQgW2RlZmF1bHQgPSAgNDQgICAgXTsKLSAgb3B0aW9uYWwgICBzaW50MzIgZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uX2xpdGUgICA9IDY1IFtkZWZhdWx0ID0gLTQ1ICAgIF07Ci0gIG9wdGlvbmFsICAgc2ludDY0IGRlZmF1bHRfc2ludDY0X2V4dGVuc2lvbl9saXRlICAgPSA2NiBbZGVmYXVsdCA9ICA0NiAgICBdOwotICBvcHRpb25hbCAgZml4ZWQzMiBkZWZhdWx0X2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgID0gNjcgW2RlZmF1bHQgPSAgNDcgICAgXTsKLSAgb3B0aW9uYWwgIGZpeGVkNjQgZGVmYXVsdF9maXhlZDY0X2V4dGVuc2lvbl9saXRlICA9IDY4IFtkZWZhdWx0ID0gIDQ4ICAgIF07Ci0gIG9wdGlvbmFsIHNmaXhlZDMyIGRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgPSA2OSBbZGVmYXVsdCA9ICA0OSAgICBdOwotICBvcHRpb25hbCBzZml4ZWQ2NCBkZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gNzAgW2RlZmF1bHQgPSAtNTAgICAgXTsKLSAgb3B0aW9uYWwgICAgZmxvYXQgZGVmYXVsdF9mbG9hdF9leHRlbnNpb25fbGl0ZSAgICA9IDcxIFtkZWZhdWx0ID0gIDUxLjUgIF07Ci0gIG9wdGlvbmFsICAgZG91YmxlIGRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl9saXRlICAgPSA3MiBbZGVmYXVsdCA9ICA1MmUzICBdOwotICBvcHRpb25hbCAgICAgYm9vbCBkZWZhdWx0X2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgID0gNzMgW2RlZmF1bHQgPSB0cnVlICAgXTsKLSAgb3B0aW9uYWwgICBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUgICA9IDc0IFtkZWZhdWx0ID0gImhlbGxvIl07Ci0gIG9wdGlvbmFsICAgIGJ5dGVzIGRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAgPSA3NSBbZGVmYXVsdCA9ICJ3b3JsZCJdOwotCi0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bQotICAgIGRlZmF1bHRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgPSA4MSBbZGVmYXVsdCA9IEJBUl07Ci0gIG9wdGlvbmFsIEZvcmVpZ25FbnVtTGl0ZQotICAgIGRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlID0gODIgW2RlZmF1bHQgPSBGT1JFSUdOX0xJVEVfQkFSXTsKLSAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydEVudW1MaXRlCi0gICAgZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSA9IDgzIFtkZWZhdWx0ID0gSU1QT1JUX0xJVEVfQkFSXTsKLQotICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUgPSA4NCBbY3R5cGU9U1RSSU5HX1BJRUNFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJjIl07Ci0gIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uX2xpdGUgPSA4NSBbY3R5cGU9Q09SRCwgZGVmYXVsdD0iMTIzIl07Ci0KLSAgLy8gRm9yIG9uZW9mIHRlc3QKLSAgb3B0aW9uYWwgdWludDMyIG9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSA9IDExMTsKLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMTEyOwotICBvcHRpb25hbCBzdHJpbmcgb25lb2Zfc3RyaW5nX2V4dGVuc2lvbl9saXRlID0gMTEzOwotICBvcHRpb25hbCBieXRlcyBvbmVvZl9ieXRlc19leHRlbnNpb25fbGl0ZSA9IDExNDsKLX0KLQotbWVzc2FnZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgewotICBleHRlbnNpb25zIDEgdG8gbWF4OwotfQotCi1leHRlbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIHsKLSAgcmVwZWF0ZWQgICAgaW50MzIgcGFja2VkX2ludDMyX2V4dGVuc2lvbl9saXRlICAgID0gIDkwIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICAgaW50NjQgcGFja2VkX2ludDY0X2V4dGVuc2lvbl9saXRlICAgID0gIDkxIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICB1aW50MzIgcGFja2VkX3VpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDkyIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICB1aW50NjQgcGFja2VkX3VpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDkzIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICBzaW50MzIgcGFja2VkX3NpbnQzMl9leHRlbnNpb25fbGl0ZSAgID0gIDk0IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICBzaW50NjQgcGFja2VkX3NpbnQ2NF9leHRlbnNpb25fbGl0ZSAgID0gIDk1IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgIGZpeGVkMzIgcGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uX2xpdGUgID0gIDk2IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgIGZpeGVkNjQgcGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uX2xpdGUgID0gIDk3IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkMzIgcGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbl9saXRlID0gIDk4IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgc2ZpeGVkNjQgcGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbl9saXRlID0gIDk5IFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICAgZmxvYXQgcGFja2VkX2Zsb2F0X2V4dGVuc2lvbl9saXRlICAgID0gMTAwIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICBkb3VibGUgcGFja2VkX2RvdWJsZV9leHRlbnNpb25fbGl0ZSAgID0gMTAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgICAgIGJvb2wgcGFja2VkX2Jvb2xfZXh0ZW5zaW9uX2xpdGUgICAgID0gMTAyIFtwYWNrZWQgPSB0cnVlXTsKLSAgcmVwZWF0ZWQgRm9yZWlnbkVudW1MaXRlIHBhY2tlZF9lbnVtX2V4dGVuc2lvbl9saXRlID0gMTAzIFtwYWNrZWQgPSB0cnVlXTsKLX0KLQotbWVzc2FnZSBUZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZSB7Ci0gIGV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgewotICAgIG9wdGlvbmFsIGludDMyIG5lc3RlZF9leHRlbnNpb24gPSAxMjM0NTsKLSAgfQotfQotCi0vLyBUZXN0IHRoYXQgZGVwcmVjYXRlZCBmaWVsZHMgd29yay4gIFdlIG9ubHkgdmVyaWZ5IHRoYXQgdGhleSBjb21waWxlIChhdCBvbmUKLS8vIHBvaW50IHRoaXMgZmFpbGVkKS4KLW1lc3NhZ2UgVGVzdERlcHJlY2F0ZWRMaXRlIHsKLSAgb3B0aW9uYWwgaW50MzIgZGVwcmVjYXRlZF9maWVsZCA9IDEgW2RlcHJlY2F0ZWQgPSB0cnVlXTsKLX0KLQotLy8gU2VlIHRoZSBjb21tZW50cyBvZiB0aGUgc2FtZSB0eXBlIGluIHVuaXR0ZXN0LnByb3RvLgotbWVzc2FnZSBUZXN0UGFyc2luZ01lcmdlTGl0ZSB7Ci0gIG1lc3NhZ2UgUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgewotICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMTsKLSAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlIGZpZWxkMiA9IDI7Ci0gICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBmaWVsZDMgPSAzOwotICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMSA9IDEwIHsKLSAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMTE7Ci0gICAgfQotICAgIHJlcGVhdGVkIGdyb3VwIEdyb3VwMiA9IDIwIHsKLSAgICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQxID0gMjE7Ci0gICAgfQotICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgZXh0MSA9IDEwMDA7Ci0gICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBleHQyID0gMTAwMTsKLSAgfQotICByZXF1aXJlZCBUZXN0QWxsVHlwZXNMaXRlIHJlcXVpcmVkX2FsbF90eXBlcyA9IDE7Ci0gIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgb3B0aW9uYWxfYWxsX3R5cGVzID0gMjsKLSAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSByZXBlYXRlZF9hbGxfdHlwZXMgPSAzOwotICBvcHRpb25hbCBncm91cCBPcHRpb25hbEdyb3VwID0gMTAgewotICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgb3B0aW9uYWxfZ3JvdXBfYWxsX3R5cGVzID0gMTE7Ci0gIH0KLSAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDIwIHsKLSAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlIHJlcGVhdGVkX2dyb3VwX2FsbF90eXBlcyA9IDIxOwotICB9Ci0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci0gIGV4dGVuZCBUZXN0UGFyc2luZ01lcmdlTGl0ZSB7Ci0gICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZSBvcHRpb25hbF9leHQgPSAxMDAwOwotICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgcmVwZWF0ZWRfZXh0ID0gMTAwMTsKLSAgfQotfQotCi0vLyBUZXN0RW1wdHlNZXNzYWdlTGl0ZSBpcyB1c2VkIHRvIHRlc3QgdW5rbm93biBmaWVsZHMgc3VwcG9ydCBpbiBsaXRlIG1vZGUuCi1tZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2VMaXRlewotfQotCi0vLyBMaWtlIGFib3ZlLCBidXQgZGVjbGFyZSBhbGwgZmllbGQgbnVtYmVycyBhcyBwb3RlbnRpYWwgZXh0ZW5zaW9ucy4gIE5vCi0vLyBhY3R1YWwgZXh0ZW5zaW9ucyBzaG91bGQgZXZlciBiZSBkZWZpbmVkIGZvciB0aGlzIHR5cGUuCi1tZXNzYWdlIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9uc0xpdGUgewotICBleHRlbnNpb25zIDEgdG8gbWF4OwotfQotCi1lbnVtIFYxRW51bUxpdGUgewotICAgIFYxX0ZJUlNUID0gMTsKLX0KLQotZW51bSBWMkVudW1MaXRlIHsKLSAgICBWMl9GSVJTVCA9IDE7Ci0gICAgVjJfU0VDT05EID0gMjsKLX0KLQotbWVzc2FnZSBWMU1lc3NhZ2VMaXRlIHsKLSAgICByZXF1aXJlZCBpbnQzMiBpbnRfZmllbGQgPSAxOwotICAgIG9wdGlvbmFsIFYxRW51bUxpdGUgZW51bV9maWVsZCA9IDIgWyBkZWZhdWx0ID0gVjFfRklSU1QgXTsKLX0KLQotbWVzc2FnZSBWMk1lc3NhZ2VMaXRlIHsKLSAgICByZXF1aXJlZCBpbnQzMiBpbnRfZmllbGQgPSAxOwotICAgIG9wdGlvbmFsIFYyRW51bUxpdGUgZW51bV9maWVsZCA9IDIgWyBkZWZhdWx0ID0gVjJfRklSU1QgXTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGVfaW1wb3J0c19ub25saXRlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxMzJkNmE4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw0NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8KLS8vIFRlc3RzIHRoYXQgYSAibGl0ZSIgbWVzc2FnZSBjYW4gaW1wb3J0IGEgcmVndWxhciBtZXNzYWdlLgotCi1zeW50YXggPSAicHJvdG8yIjsKLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKLQotb3B0aW9uIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRTsKLQotbWVzc2FnZSBUZXN0TGl0ZUltcG9ydHNOb25saXRlIHsKLSAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSAxOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA0OWQ5YWRhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDgyICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIGZpbGUgaXMgc2ltaWxhciB0byB1bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvLCBidXQgZG9lcyBub3QKLS8vIGhhdmUgYSBUZXN0TWVzc2FnZVNldCwgc28gaXQgY2FuIGJlIGRvd25ncmFkZWQgdG8gcHJvdG8xLgotCi1zeW50YXggPSAicHJvdG8yIjsKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wcm90byI7Ci0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKLQotbWVzc2FnZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciB7Ci0gIG9wdGlvbmFsIHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0LlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0ID0gMTsKLX0KLQotbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgewotICBleHRlbmQgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQgewotICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ1MDA4OwotICB9Ci0gIG9wdGlvbmFsIGludDMyIGkgPSAxNTsKLX0KLQotbWVzc2FnZSBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIgewotICBleHRlbmQgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQgewotICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlX3NldF9leHRlbnNpb24gPSAxNTQ3NzY5OwotICB9Ci0gIG9wdGlvbmFsIHN0cmluZyBzdHIgPSAyNTsKLX0KLQotLy8gVGhpcyBtZXNzYWdlIHdhcyB1c2VkIHRvIGdlbmVyYXRlCi0vLyAvL25ldC9wcm90bzIvcHl0aG9uL2ludGVybmFsL3Rlc3RkYXRhL21lc3NhZ2Vfc2V0X21lc3NhZ2UsIGJ1dCBpcyBjb21tZW50ZWQKLS8vIG91dCBzaW5jZSBpdCBtdXN0IG5vdCBhY3R1YWxseSBleGlzdCBpbiBjb2RlLCB0byBzaW11bGF0ZSBhbiAidW5rbm93biIKLS8vIGV4dGVuc2lvbi4KLS8vIG1lc3NhZ2UgVGVzdE1lc3NhZ2VTZXRVbmtub3duRXh0ZW5zaW9uIHsKLS8vICAgZXh0ZW5kIFRlc3RNZXNzYWdlU2V0IHsKLS8vICAgICBvcHRpb25hbCBUZXN0TWVzc2FnZVNldFVua25vd25FeHRlbnNpb24gbWVzc2FnZV9zZXRfZXh0ZW5zaW9uID0gNTYxNDE0MjE7Ci0vLyAgIH0KLS8vICAgb3B0aW9uYWwgaW50NjQgYSA9IDE7Ci0vLyB9Ci0KLS8vIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgaXMgZXF1aXZhbGVudCB0byB0aGlzLgotbWVzc2FnZSBSYXdNZXNzYWdlU2V0IHsKLSAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgewotICAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOwotICAgIHJlcXVpcmVkIGJ5dGVzIG1lc3NhZ2UgPSAzOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhmYzc3MTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTQgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKLQotc3ludGF4ID0gInByb3RvMiI7Ci1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q7Ci0KLQotLy8gKl9nZW5lcmljX3NlcnZpY2VzIGFyZSBmYWxzZSBieSBkZWZhdWx0LgotCi1tZXNzYWdlIFRlc3RNZXNzYWdlIHsKLSAgb3B0aW9uYWwgaW50MzIgYSA9IDE7Ci0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci19Ci0KLWVudW0gVGVzdEVudW0gewotICBGT08gPSAxOwotfQotCi1leHRlbmQgVGVzdE1lc3NhZ2UgewotICBvcHRpb25hbCBpbnQzMiB0ZXN0X2V4dGVuc2lvbiA9IDEwMDA7Ci19Ci0KLXNlcnZpY2UgVGVzdFNlcnZpY2UgewotICBycGMgRm9vKFRlc3RNZXNzYWdlKSByZXR1cm5zKFRlc3RNZXNzYWdlKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVlOWNjN2IuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw2NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gQSBwcm90byBmaWxlIHdoaWNoIHVzZXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLgotCi1zeW50YXggPSAicHJvdG8yIjsKLWltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKLQotcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKLQotb3B0aW9uIG9wdGltaXplX2ZvciA9IENPREVfU0laRTsKLQotbWVzc2FnZSBUZXN0T3B0aW1pemVkRm9yU2l6ZSB7Ci0gIG9wdGlvbmFsIGludDMyIGkgPSAxOwotICBvcHRpb25hbCBGb3JlaWduTWVzc2FnZSBtc2cgPSAxOTsKLQotICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotCi0gIGV4dGVuZCBUZXN0T3B0aW1pemVkRm9yU2l6ZSB7Ci0gICAgb3B0aW9uYWwgaW50MzIgdGVzdF9leHRlbnNpb24gPSAxMjM0OwotICAgIG9wdGlvbmFsIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgdGVzdF9leHRlbnNpb24yID0gMTIzNTsKLSAgfQotCi0gIG9uZW9mIGZvbyB7Ci0gICAgaW50MzIgaW50ZWdlcl9maWVsZCA9IDI7Ci0gICAgc3RyaW5nIHN0cmluZ19maWVsZCA9IDM7Ci0gIH0KLX0KLQotbWVzc2FnZSBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIHsKLSAgcmVxdWlyZWQgaW50MzIgeCA9IDE7Ci19Ci0KLW1lc3NhZ2UgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSB7Ci0gIG9wdGlvbmFsIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUgbyA9IDE7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDRlMzgzZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMzQ3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLW5hbWVzcGFjZSB7Ci0vLyBUaGlzIGdsb2JhbCBpbnN0YW5jZSBpcyByZXR1cm5lZCBieSB1bmtub3duX2ZpZWxkcygpIG9uIGFueSBtZXNzYWdlIGNsYXNzCi0vLyB3aGVuIHRoZSBvYmplY3QgaGFzIG5vIHVua25vd24gZmllbGRzLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG5vdwotLy8gaW5zdGFudGlhdGUgdGhlIFVua25vd25GaWVsZFNldCBkeW5hbWljYWxseSBvbmx5IHdoZW4gcmVxdWlyZWQuCi1Vbmtub3duRmllbGRTZXQqIGRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfaW5zdGFuY2VfID0gTlVMTDsKLQotdm9pZCBEZWxldGVEZWZhdWx0VW5rbm93bkZpZWxkU2V0KCkgewotICBkZWxldGUgZGVmYXVsdF91bmtub3duX2ZpZWxkX3NldF9pbnN0YW5jZV87Ci19Ci0KLXZvaWQgSW5pdERlZmF1bHRVbmtub3duRmllbGRTZXQoKSB7Ci0gIGRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfaW5zdGFuY2VfID0gbmV3IFVua25vd25GaWVsZFNldCgpOwotICBpbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlRGVmYXVsdFVua25vd25GaWVsZFNldCk7Ci19Ci0KLUdPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UoZGVmYXVsdF91bmtub3duX2ZpZWxkX3NldF9vbmNlX2luaXRfKTsKLX0KLQotY29uc3QgVW5rbm93bkZpZWxkU2V0KiBVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJmRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfb25jZV9pbml0XywKLSAgICAgICAgICAgICAgICAgJkluaXREZWZhdWx0VW5rbm93bkZpZWxkU2V0KTsKLSAgcmV0dXJuIGRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfaW5zdGFuY2VfOwotfQotCi1Vbmtub3duRmllbGRTZXQ6OlVua25vd25GaWVsZFNldCgpCi0gICAgOiBmaWVsZHNfKE5VTEwpIHt9Ci0KLVVua25vd25GaWVsZFNldDo6flVua25vd25GaWVsZFNldCgpIHsKLSAgQ2xlYXIoKTsKLSAgZGVsZXRlIGZpZWxkc187Ci19Ci0KLXZvaWQgVW5rbm93bkZpZWxkU2V0OjpDbGVhckZhbGxiYWNrKCkgewotICBpZiAoZmllbGRzXyAhPSBOVUxMKSB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHNfLT5zaXplKCk7IGkrKykgewotICAgICAgKCpmaWVsZHNfKVtpXS5EZWxldGUoKTsKLSAgICB9Ci0gICAgZGVsZXRlIGZpZWxkc187Ci0gICAgZmllbGRzXyA9IE5VTEw7Ci0gIH0KLX0KLQotdm9pZCBVbmtub3duRmllbGRTZXQ6OkNsZWFyQW5kRnJlZU1lbW9yeSgpIHsKLSAgaWYgKGZpZWxkc18gIT0gTlVMTCkgewotICAgIENsZWFyKCk7Ci0gIH0KLX0KLQotdm9pZCBVbmtub3duRmllbGRTZXQ6OkludGVybmFsTWVyZ2VGcm9tKGNvbnN0IFVua25vd25GaWVsZFNldCYgb3RoZXIpIHsKLSAgaW50IG90aGVyX2ZpZWxkX2NvdW50ID0gb3RoZXIuZmllbGRfY291bnQoKTsKLSAgaWYgKG90aGVyX2ZpZWxkX2NvdW50ID4gMCkgewotICAgIGZpZWxkc18gPSBuZXcgdmVjdG9yPFVua25vd25GaWVsZD4oKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyX2ZpZWxkX2NvdW50OyBpKyspIHsKLSAgICAgIGZpZWxkc18tPnB1c2hfYmFjaygoKm90aGVyLmZpZWxkc18pW2ldKTsKLSAgICAgIGZpZWxkc18tPmJhY2soKS5EZWVwQ29weSgoKm90aGVyLmZpZWxkc18pW2ldKTsKLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBVbmtub3duRmllbGRTZXQ6Ok1lcmdlRnJvbShjb25zdCBVbmtub3duRmllbGRTZXQmIG90aGVyKSB7Ci0gIGludCBvdGhlcl9maWVsZF9jb3VudCA9IG90aGVyLmZpZWxkX2NvdW50KCk7Ci0gIGlmIChvdGhlcl9maWVsZF9jb3VudCA+IDApIHsKLSAgICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlcl9maWVsZF9jb3VudDsgaSsrKSB7Ci0gICAgICBmaWVsZHNfLT5wdXNoX2JhY2soKCpvdGhlci5maWVsZHNfKVtpXSk7Ci0gICAgICBmaWVsZHNfLT5iYWNrKCkuRGVlcENvcHkoKCpvdGhlci5maWVsZHNfKVtpXSk7Ci0gICAgfQotICB9Ci19Ci0KLS8vIEEgc3BlY2lhbGl6ZWQgTWVyZ2VGcm9tIGZvciBwZXJmb3JtYW5jZSB3aGVuIHdlIGFyZSBtZXJnaW5nIGZyb20gYW4gVUZTIHRoYXQKLS8vIGlzIHRlbXBvcmFyeSBhbmQgY2FuIGJlIGRlc3Ryb3llZCBpbiB0aGUgcHJvY2Vzcy4KLXZvaWQgVW5rbm93bkZpZWxkU2V0OjpNZXJnZUZyb21BbmREZXN0cm95KFVua25vd25GaWVsZFNldCogb3RoZXIpIHsKLSAgaW50IG90aGVyX2ZpZWxkX2NvdW50ID0gb3RoZXItPmZpZWxkX2NvdW50KCk7Ci0gIGlmIChvdGhlcl9maWVsZF9jb3VudCA+IDApIHsKLSAgICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlcl9maWVsZF9jb3VudDsgaSsrKSB7Ci0gICAgICBmaWVsZHNfLT5wdXNoX2JhY2soKCpvdGhlci0+ZmllbGRzXylbaV0pOwotICAgICAgKCpvdGhlci0+ZmllbGRzXylbaV0uUmVzZXQoKTsKLSAgICB9Ci0gIH0KLSAgZGVsZXRlIG90aGVyLT5maWVsZHNfOwotICBvdGhlci0+ZmllbGRzXyA9IE5VTEw7Ci19Ci0KLWludCBVbmtub3duRmllbGRTZXQ6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7Ci0gIGlmIChmaWVsZHNfID09IE5VTEwpIHJldHVybiAwOwotCi0gIGludCB0b3RhbF9zaXplID0gc2l6ZW9mKCpmaWVsZHNfKSArIHNpemVvZihVbmtub3duRmllbGQpICogZmllbGRzXy0+c2l6ZSgpOwotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzXy0+c2l6ZSgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gKCpmaWVsZHNfKVtpXTsKLSAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgewotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8pICsKLSAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6U3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigKLSAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8pOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgotICAgICAgICB0b3RhbF9zaXplICs9IGZpZWxkLmdyb3VwXy0+U3BhY2VVc2VkKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCi1pbnQgVW5rbm93bkZpZWxkU2V0OjpTcGFjZVVzZWQoKSBjb25zdCB7Ci0gIHJldHVybiBzaXplb2YoKnRoaXMpICsgU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOwotfQotCi12b2lkIFVua25vd25GaWVsZFNldDo6QWRkVmFyaW50KGludCBudW1iZXIsIHVpbnQ2NCB2YWx1ZSkgewotICBVbmtub3duRmllbGQgZmllbGQ7Ci0gIGZpZWxkLm51bWJlcl8gPSBudW1iZXI7Ci0gIGZpZWxkLlNldFR5cGUoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCk7Ci0gIGZpZWxkLnZhcmludF8gPSB2YWx1ZTsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwotICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwotfQotCi12b2lkIFVua25vd25GaWVsZFNldDo6QWRkRml4ZWQzMihpbnQgbnVtYmVyLCB1aW50MzIgdmFsdWUpIHsKLSAgVW5rbm93bkZpZWxkIGZpZWxkOwotICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC5TZXRUeXBlKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyKTsKLSAgZmllbGQuZml4ZWQzMl8gPSB2YWx1ZTsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwotICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwotfQotCi12b2lkIFVua25vd25GaWVsZFNldDo6QWRkRml4ZWQ2NChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUpIHsKLSAgVW5rbm93bkZpZWxkIGZpZWxkOwotICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC5TZXRUeXBlKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0KTsKLSAgZmllbGQuZml4ZWQ2NF8gPSB2YWx1ZTsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwotICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwotfQotCi1zdHJpbmcqIFVua25vd25GaWVsZFNldDo6QWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIpIHsKLSAgVW5rbm93bkZpZWxkIGZpZWxkOwotICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC5TZXRUeXBlKFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgZmllbGQubGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXyA9IG5ldyBzdHJpbmc7Ci0gIGlmIChmaWVsZHNfID09IE5VTEwpIGZpZWxkc18gPSBuZXcgdmVjdG9yPFVua25vd25GaWVsZD4oKTsKLSAgZmllbGRzXy0+cHVzaF9iYWNrKGZpZWxkKTsKLSAgcmV0dXJuIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87Ci19Ci0KLQotVW5rbm93bkZpZWxkU2V0KiBVbmtub3duRmllbGRTZXQ6OkFkZEdyb3VwKGludCBudW1iZXIpIHsKLSAgVW5rbm93bkZpZWxkIGZpZWxkOwotICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC5TZXRUeXBlKFVua25vd25GaWVsZDo6VFlQRV9HUk9VUCk7Ci0gIGZpZWxkLmdyb3VwXyA9IG5ldyBVbmtub3duRmllbGRTZXQ7Ci0gIGlmIChmaWVsZHNfID09IE5VTEwpIGZpZWxkc18gPSBuZXcgdmVjdG9yPFVua25vd25GaWVsZD4oKTsKLSAgZmllbGRzXy0+cHVzaF9iYWNrKGZpZWxkKTsKLSAgcmV0dXJuIGZpZWxkLmdyb3VwXzsKLX0KLQotdm9pZCBVbmtub3duRmllbGRTZXQ6OkFkZEZpZWxkKGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQpIHsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwotICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwotICBmaWVsZHNfLT5iYWNrKCkuRGVlcENvcHkoZmllbGQpOwotfQotCi12b2lkIFVua25vd25GaWVsZFNldDo6RGVsZXRlU3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtKSB7Ci0gIC8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGZpZWxkcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgewotICAgICgqZmllbGRzXylbaSArIHN0YXJ0XS5EZWxldGUoKTsKLSAgfQotICAvLyBTbGlkZSBkb3duIHRoZSByZW1haW5pbmcgZmllbGRzLgotICBmb3IgKGludCBpID0gc3RhcnQgKyBudW07IGkgPCBmaWVsZHNfLT5zaXplKCk7ICsraSkgewotICAgICgqZmllbGRzXylbaSAtIG51bV0gPSAoKmZpZWxkc18pW2ldOwotICB9Ci0gIC8vIFBvcCBvZmYgdGhlICMgb2YgZGVsZXRlZCBmaWVsZHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKLSAgICBmaWVsZHNfLT5wb3BfYmFjaygpOwotICB9Ci0gIGlmIChmaWVsZHNfICYmIGZpZWxkc18tPnNpemUoKSA9PSAwKSB7Ci0gICAgLy8gbWFpbnRhaW4gaW52YXJpYW50OiBuZXZlciBob2xkIGZpZWxkc18gaWYgZW1wdHkuCi0gICAgZGVsZXRlIGZpZWxkc187Ci0gICAgZmllbGRzXyA9IE5VTEw7Ci0gIH0KLX0KLQotdm9pZCBVbmtub3duRmllbGRTZXQ6OkRlbGV0ZUJ5TnVtYmVyKGludCBudW1iZXIpIHsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgcmV0dXJuOwotICBpbnQgbGVmdCA9IDA7ICAvLyBUaGUgbnVtYmVyIG9mIGZpZWxkcyBsZWZ0IGFmdGVyIGRlbGV0aW9uLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc18tPnNpemUoKTsgKytpKSB7Ci0gICAgVW5rbm93bkZpZWxkKiBmaWVsZCA9ICYoKmZpZWxkc18pW2ldOwotICAgIGlmIChmaWVsZC0+bnVtYmVyKCkgPT0gbnVtYmVyKSB7Ci0gICAgICBmaWVsZC0+RGVsZXRlKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGlmIChpICE9IGxlZnQpIHsKLSAgICAgICAgKCpmaWVsZHNfKVtsZWZ0XSA9ICgqZmllbGRzXylbaV07Ci0gICAgICB9Ci0gICAgICArK2xlZnQ7Ci0gICAgfQotICB9Ci0gIGZpZWxkc18tPnJlc2l6ZShsZWZ0KTsKLSAgaWYgKGxlZnQgPT0gMCkgewotICAgIC8vIG1haW50YWluIGludmFyaWFudDogbmV2ZXIgaG9sZCBmaWVsZHNfIGlmIGVtcHR5LgotICAgIGRlbGV0ZSBmaWVsZHNfOwotICAgIGZpZWxkc18gPSBOVUxMOwotICB9Ci19Ci0KLWJvb2wgVW5rbm93bkZpZWxkU2V0OjpNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgVW5rbm93bkZpZWxkU2V0IG90aGVyOwotICBpZiAoaW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKGlucHV0LCAmb3RoZXIpICYmCi0gICAgICBpbnB1dC0+Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpIHsKLSAgICBNZXJnZUZyb21BbmREZXN0cm95KCZvdGhlcik7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgVW5rbm93bkZpZWxkU2V0OjpQYXJzZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgQ2xlYXIoKTsKLSAgcmV0dXJuIE1lcmdlRnJvbUNvZGVkU3RyZWFtKGlucHV0KTsKLX0KLQotYm9vbCBVbmtub3duRmllbGRTZXQ6OlBhcnNlRnJvbVplcm9Db3B5U3RyZWFtKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCkgewotICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dChpbnB1dCk7Ci0gIHJldHVybiAoUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmNvZGVkX2lucHV0KSAmJgotICAgICAgICAgIGNvZGVkX2lucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKLX0KLQotYm9vbCBVbmtub3duRmllbGRTZXQ6OlBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKSB7Ci0gIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0KGRhdGEsIHNpemUpOwotICByZXR1cm4gUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oJmlucHV0KTsKLX0KLQotdm9pZCBVbmtub3duRmllbGQ6OkRlbGV0ZSgpIHsKLSAgc3dpdGNoICh0eXBlKCkpIHsKLSAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgotICAgICAgZGVsZXRlIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87Ci0gICAgICBicmVhazsKLSAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKLSAgICAgIGRlbGV0ZSBncm91cF87Ci0gICAgICBicmVhazsKLSAgICBkZWZhdWx0OgotICAgICAgYnJlYWs7Ci0gIH0KLX0KLQotLy8gUmVzZXQgYWxsIG93bmVkIHB0cnMsIGEgc3BlY2lhbCBmdW5jdGlvbiBmb3IgcGVyZm9ybWFuY2UsIHRvIGF2b2lkIGRvdWJsZQotLy8gb3duaW5nIHRoZSBwdHJzLCB3aGVuIHdlIG1lcmdlIGZyb20gYSB0ZW1wb3JhcnkgVW5rbm93bkZpZWxkU2V0IG9iamVjdHMuCi12b2lkIFVua25vd25GaWVsZDo6UmVzZXQoKSB7Ci0gIHN3aXRjaCAodHlwZSgpKSB7Ci0gICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8gPSBOVUxMOwotICAgICAgYnJlYWs7Ci0gICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6IHsKLSAgICAgIGdyb3VwXyA9IE5VTEw7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLXZvaWQgVW5rbm93bkZpZWxkOjpEZWVwQ29weShjb25zdCBVbmtub3duRmllbGQmIG90aGVyKSB7Ci0gIHN3aXRjaCAodHlwZSgpKSB7Ci0gICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8gPSBuZXcgc3RyaW5nKAotICAgICAgICAgICpsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOiB7Ci0gICAgICBVbmtub3duRmllbGRTZXQqIGdyb3VwID0gbmV3IFVua25vd25GaWVsZFNldCgpOwotICAgICAgZ3JvdXAtPkludGVybmFsTWVyZ2VGcm9tKCpncm91cF8pOwotICAgICAgZ3JvdXBfID0gZ3JvdXA7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgZGVmYXVsdDoKLSAgICAgIGJyZWFrOwotICB9Ci19Ci0KLQotdm9pZCBVbmtub3duRmllbGQ6OlNlcmlhbGl6ZUxlbmd0aERlbGltaXRlZE5vVGFnKAotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEoVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0eXBlKCkpOwotICBjb25zdCBzdHJpbmcmIGRhdGEgPSAqbGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXzsKLSAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGRhdGEuc2l6ZSgpKTsKLSAgb3V0cHV0LT5Xcml0ZVJhd01heWJlQWxpYXNlZChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotfQotCi11aW50OCogVW5rbm93bkZpZWxkOjpTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZ1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3QgewotICBHT09HTEVfRENIRUNLX0VRKFRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdHlwZSgpKTsKLSAgY29uc3Qgc3RyaW5nJiBkYXRhID0gKmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87Ci0gIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoZGF0YS5zaXplKCksIHRhcmdldCk7Ci0gIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KGRhdGEsIHRhcmdldCk7Ci0gIHJldHVybiB0YXJnZXQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2MTJhOTQyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDM0MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0vLwotLy8gQ29udGFpbnMgY2xhc3NlcyB1c2VkIHRvIGtlZXAgdHJhY2sgb2YgdW5yZWNvZ25pemVkIGZpZWxkcyBzZWVuIHdoaWxlCi0vLyBwYXJzaW5nIGEgcHJvdG9jb2wgbWVzc2FnZS4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVU5LTk9XTl9GSUVMRF9TRVRfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KLQotI2luY2x1ZGUgPGFzc2VydC5oPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyAgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCi0gICAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAgICAvLyBjb2RlZF9zdHJlYW0uaAotICAgIGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07ICAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCi0gIH0KLSAgbmFtZXNwYWNlIGludGVybmFsIHsKLSAgICBjbGFzcyBXaXJlRm9ybWF0OyAgICAgICAgICAgICAgIC8vIHdpcmVfZm9ybWF0LmgKLSAgICBjbGFzcyBNZXNzYWdlU2V0RmllbGRTa2lwcGVyVXNpbmdDb3JkOwotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYwotICB9Ci0KLWNsYXNzIE1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuaAotY2xhc3MgVW5rbm93bkZpZWxkOyAgICAgICAgICAgICAgICAgLy8gYmVsb3cKLQotLy8gQW4gVW5rbm93bkZpZWxkU2V0IGNvbnRhaW5zIGZpZWxkcyB0aGF0IHdlcmUgZW5jb3VudGVyZWQgd2hpbGUgcGFyc2luZyBhCi0vLyBtZXNzYWdlIGJ1dCB3ZXJlIG5vdCBkZWZpbmVkIGJ5IGl0cyB0eXBlLiAgS2VlcGluZyB0cmFjayBvZiB0aGVzZSBjYW4gYmUKLS8vIHVzZWZ1bCwgZXNwZWNpYWxseSBpbiB0aGF0IHRoZXkgbWF5IGJlIHdyaXR0ZW4gaWYgdGhlIG1lc3NhZ2UgaXMgc2VyaWFsaXplZAotLy8gYWdhaW4gd2l0aG91dCBiZWluZyBjbGVhcmVkIGluIGJldHdlZW4uICBUaGlzIG1lYW5zIHRoYXQgc29mdHdhcmUgd2hpY2gKLS8vIHNpbXBseSByZWNlaXZlcyBtZXNzYWdlcyBhbmQgZm9yd2FyZHMgdGhlbSB0byBvdGhlciBzZXJ2ZXJzIGRvZXMgbm90IG5lZWQKLS8vIHRvIGJlIHVwZGF0ZWQgZXZlcnkgdGltZSBhIG5ldyBmaWVsZCBpcyBhZGRlZCB0byB0aGUgbWVzc2FnZSBkZWZpbml0aW9uLgotLy8KLS8vIFRvIGdldCB0aGUgVW5rbm93bkZpZWxkU2V0IGF0dGFjaGVkIHRvIGFueSBtZXNzYWdlLCBjYWxsCi0vLyBSZWZsZWN0aW9uOjpHZXRVbmtub3duRmllbGRzKCkuCi0vLwotLy8gVGhpcyBjbGFzcyBpcyBuZWNlc3NhcmlseSB0aWVkIHRvIHRoZSBwcm90b2NvbCBidWZmZXIgd2lyZSBmb3JtYXQsIHVubGlrZQotLy8gdGhlIFJlZmxlY3Rpb24gaW50ZXJmYWNlIHdoaWNoIGlzIGluZGVwZW5kZW50IG9mIGFueSBzZXJpYWxpemF0aW9uIHNjaGVtZS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBVbmtub3duRmllbGRTZXQgewotIHB1YmxpYzoKLSAgVW5rbm93bkZpZWxkU2V0KCk7Ci0gIH5Vbmtub3duRmllbGRTZXQoKTsKLQotICAvLyBSZW1vdmUgYWxsIGZpZWxkcy4KLSAgaW5saW5lIHZvaWQgQ2xlYXIoKTsKLQotICAvLyBSZW1vdmUgYWxsIGZpZWxkcyBhbmQgZGVhbGxvY2F0ZSBpbnRlcm5hbCBkYXRhIG9iamVjdHMKLSAgdm9pZCBDbGVhckFuZEZyZWVNZW1vcnkoKTsKLQotICAvLyBJcyB0aGlzIHNldCBlbXB0eT8KLSAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdDsKLQotICAvLyBNZXJnZSB0aGUgY29udGVudHMgb2Ygc29tZSBvdGhlciBVbmtub3duRmllbGRTZXQgd2l0aCB0aGlzIG9uZS4KLSAgdm9pZCBNZXJnZUZyb20oY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlcik7Ci0KLSAgLy8gU2ltaWxhciB0byBhYm92ZSwgYnV0IHRoaXMgZnVuY3Rpb24gd2lsbCBkZXN0cm95IHRoZSBjb250ZW50cyBvZiBvdGhlci4KLSAgdm9pZCBNZXJnZUZyb21BbmREZXN0cm95KFVua25vd25GaWVsZFNldCogb3RoZXIpOwotCi0gIC8vIFN3YXBzIHRoZSBjb250ZW50cyBvZiBzb21lIG90aGVyIFVua25vd25GaWVsZFNldCB3aXRoIHRoaXMgb25lLgotICBpbmxpbmUgdm9pZCBTd2FwKFVua25vd25GaWVsZFNldCogeCk7Ci0KLSAgLy8gQ29tcHV0ZXMgKGFuIGVzdGltYXRlIG9mKSB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIGN1cnJlbnRseSB1c2VkIGZvcgotICAvLyBzdG9yaW5nIHRoZSB1bmtub3duIGZpZWxkcyBpbiBtZW1vcnkuIERvZXMgTk9UIGluY2x1ZGUKLSAgLy8gc2l6ZW9mKCp0aGlzKSBpbiB0aGUgY2FsY3VsYXRpb24uCi0gIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7Ci0KLSAgLy8gVmVyc2lvbiBvZiBTcGFjZVVzZWQoKSBpbmNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4KLSAgaW50IFNwYWNlVXNlZCgpIGNvbnN0OwotCi0gIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBmaWVsZHMgcHJlc2VudCBpbiB0aGUgVW5rbm93bkZpZWxkU2V0LgotICBpbmxpbmUgaW50IGZpZWxkX2NvdW50KCkgY29uc3Q7Ci0gIC8vIEdldCBhIGZpZWxkIGluIHRoZSBzZXQsIHdoZXJlIDAgPD0gaW5kZXggPCBmaWVsZF9jb3VudCgpLiAgVGhlIGZpZWxkcwotICAvLyBhcHBlYXIgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBhZGRlZC4KLSAgaW5saW5lIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQoaW50IGluZGV4KSBjb25zdDsKLSAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGEgZmllbGQgaW4gdGhlIHNldCwgd2hlcmUKLSAgLy8gMCA8PSBpbmRleCA8IGZpZWxkX2NvdW50KCkuICBUaGUgZmllbGRzIGFwcGVhciBpbiB0aGUgb3JkZXIgaW4gd2hpY2gKLSAgLy8gdGhleSB3ZXJlIGFkZGVkLgotICBpbmxpbmUgVW5rbm93bkZpZWxkKiBtdXRhYmxlX2ZpZWxkKGludCBpbmRleCk7Ci0KLSAgLy8gQWRkaW5nIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB2b2lkIEFkZFZhcmludChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUpOwotICB2b2lkIEFkZEZpeGVkMzIoaW50IG51bWJlciwgdWludDMyIHZhbHVlKTsKLSAgdm9pZCBBZGRGaXhlZDY0KGludCBudW1iZXIsIHVpbnQ2NCB2YWx1ZSk7Ci0gIHZvaWQgQWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUpOwotICBzdHJpbmcqIEFkZExlbmd0aERlbGltaXRlZChpbnQgbnVtYmVyKTsKLSAgVW5rbm93bkZpZWxkU2V0KiBBZGRHcm91cChpbnQgbnVtYmVyKTsKLQotICAvLyBBZGRzIGFuIHVua25vd24gZmllbGQgZnJvbSBhbm90aGVyIHNldC4KLSAgdm9pZCBBZGRGaWVsZChjb25zdCBVbmtub3duRmllbGQmIGZpZWxkKTsKLQotICAvLyBEZWxldGUgZmllbGRzIHdpdGggaW5kaWNlcyBpbiB0aGUgcmFuZ2UgW3N0YXJ0IC4uIHN0YXJ0K251bS0xXS4KLSAgLy8gQ2F1dGlvbjogaW1wbGVtZW50YXRpb24gbW92ZXMgYWxsIGZpZWxkcyB3aXRoIGluZGljZXMgW3N0YXJ0K251bSAuLiBdLgotICB2b2lkIERlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSk7Ci0KLSAgLy8gRGVsZXRlIGFsbCBmaWVsZHMgd2l0aCBhIHNwZWNpZmljIGZpZWxkIG51bWJlci4gVGhlIG9yZGVyIG9mIGxlZnQgZmllbGRzCi0gIC8vIGlzIHByZXNlcnZlZC4KLSAgLy8gQ2F1dGlvbjogaW1wbGVtZW50YXRpb24gbW92ZXMgYWxsIGZpZWxkcyBhZnRlciB0aGUgZmlyc3QgZGVsZXRlZCBmaWVsZC4KLSAgdm9pZCBEZWxldGVCeU51bWJlcihpbnQgbnVtYmVyKTsKLQotICAvLyBQYXJzaW5nIGhlbHBlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUaGVzZSB3b3JrIGV4YWN0bHkgbGlrZSB0aGUgc2ltaWxhcmx5LW5hbWVkIG1ldGhvZHMgb2YgTWVzc2FnZS4KLQotICBib29sIE1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0gIGJvb2wgUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgYm9vbCBQYXJzZUZyb21aZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpOwotICBib29sIFBhcnNlRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKLSAgaW5saW5lIGJvb2wgUGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSkgewotICAgIHJldHVybiBQYXJzZUZyb21BcnJheShkYXRhLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihkYXRhLnNpemUoKSkpOwotICB9Ci0KLSAgc3RhdGljIGNvbnN0IFVua25vd25GaWVsZFNldCogZGVmYXVsdF9pbnN0YW5jZSgpOwotIHByaXZhdGU6Ci0gIC8vIEZvciBJbnRlcm5hbE1lcmdlRnJvbQotICBmcmllbmQgY2xhc3MgVW5rbm93bkZpZWxkOwotICAvLyBNZXJnZXMgZnJvbSBvdGhlciBVbmtub3duRmllbGRTZXQuIFRoaXMgbWV0aG9kIGFzc3VtZXMsIHRoYXQgdGhpcyBvYmplY3QKLSAgLy8gaXMgbmV3bHkgY3JlYXRlZCBhbmQgaGFzIGZpZWxkc18gPT0gTlVMTDsKLSAgdm9pZCBJbnRlcm5hbE1lcmdlRnJvbShjb25zdCBVbmtub3duRmllbGRTZXQmIG90aGVyKTsKLSAgdm9pZCBDbGVhckZhbGxiYWNrKCk7Ci0KLSAgLy8gZmllbGRzXyBpcyBlaXRoZXIgTlVMTCwgb3IgYSBwb2ludGVyIHRvIGEgdmVjdG9yIHRoYXQgaXMgKm5vbi1lbXB0eSouIFdlCi0gIC8vIG5ldmVyIGhvbGQgdGhlIGVtcHR5IHZlY3RvciBiZWNhdXNlIHdlIHdhbnQgdGhlICdkbyB3ZSBoYXZlIGFueSB1bmtub3duCi0gIC8vIGZpZWxkcycgY2hlY2sgdG8gYmUgZmFzdCwgYW5kIGF2b2lkIGEgY2FjaGUgbWlzczogdGhlIFVGUyBpbnN0YW5jZSBnZXRzCi0gIC8vIGVtYmVkZGVkIGluIHRoZSBtZXNzYWdlIG9iamVjdCwgc28gJ2ZpZWxkc18gIT0gTlVMTCcgdGVzdHMgYSBtZW1iZXIKLSAgLy8gdmFyaWFibGUgaG90IGluIHRoZSBjYWNoZSwgd2l0aG91dCB0aGUgbmVlZCB0byBnbyB0b3VjaCBhIHZlY3RvciBzb21ld2hlcmUKLSAgLy8gZWxzZSBpbiBtZW1vcnkuCi0gIHN0ZDo6dmVjdG9yPFVua25vd25GaWVsZD4qIGZpZWxkc187Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhVbmtub3duRmllbGRTZXQpOwotfTsKLQotLy8gUmVwcmVzZW50cyBvbmUgZmllbGQgaW4gYW4gVW5rbm93bkZpZWxkU2V0LgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFVua25vd25GaWVsZCB7Ci0gcHVibGljOgotICBlbnVtIFR5cGUgewotICAgIFRZUEVfVkFSSU5ULAotICAgIFRZUEVfRklYRUQzMiwKLSAgICBUWVBFX0ZJWEVENjQsCi0gICAgVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgIFRZUEVfR1JPVVAKLSAgfTsKLQotICAvLyBUaGUgZmllbGQncyB0YWcgbnVtYmVyLCBhcyBzZWVuIG9uIHRoZSB3aXJlLgotICBpbmxpbmUgaW50IG51bWJlcigpIGNvbnN0OwotCi0gIC8vIFRoZSBmaWVsZCB0eXBlLgotICBpbmxpbmUgVHlwZSB0eXBlKCkgY29uc3Q7Ci0KLSAgLy8gQWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gRWFjaCBtZXRob2Qgd29ya3Mgb25seSBmb3IgVW5rbm93bkZpZWxkcyBvZiB0aGUgY29ycmVzcG9uZGluZyB0eXBlLgotCi0gIGlubGluZSB1aW50NjQgdmFyaW50KCkgY29uc3Q7Ci0gIGlubGluZSB1aW50MzIgZml4ZWQzMigpIGNvbnN0OwotICBpbmxpbmUgdWludDY0IGZpeGVkNjQoKSBjb25zdDsKLSAgaW5saW5lIGNvbnN0IHN0cmluZyYgbGVuZ3RoX2RlbGltaXRlZCgpIGNvbnN0OwotICBpbmxpbmUgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBncm91cCgpIGNvbnN0OwotCi0gIGlubGluZSB2b2lkIHNldF92YXJpbnQodWludDY0IHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2ZpeGVkMzIodWludDMyIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2ZpeGVkNjQodWludDY0IHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2xlbmd0aF9kZWxpbWl0ZWQoY29uc3Qgc3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSBzdHJpbmcqIG11dGFibGVfbGVuZ3RoX2RlbGltaXRlZCgpOwotICBpbmxpbmUgVW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX2dyb3VwKCk7Ci0KLSAgLy8gU2VyaWFsaXphdGlvbiBBUEkuCi0gIC8vIFRoZXNlIG1ldGhvZHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGFuZCBtYXkKLSAgLy8gYXJjaGlldmUgYSBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB1c2luZyBnZXR0ZXJzIHRvIHJldHJpZXZlIHRoZSBkYXRhIGFuZAotICAvLyBkbyB0aGUgc2VyaWFsaXphdGlvbiB5b3Vyc2VsZi4KLSAgdm9pZCBTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZyhpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7Ci0gIHVpbnQ4KiBTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZ1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3Q7Ci0KLSAgaW5saW5lIGludCBHZXRMZW5ndGhEZWxpbWl0ZWRTaXplKCkgY29uc3Q7Ci0KLSBwcml2YXRlOgotICBmcmllbmQgY2xhc3MgVW5rbm93bkZpZWxkU2V0OwotCi0gIC8vIElmIHRoaXMgVW5rbm93bkZpZWxkIGNvbnRhaW5zIGEgcG9pbnRlciwgZGVsZXRlIGl0LgotICB2b2lkIERlbGV0ZSgpOwotCi0gIC8vIFJlc2V0IGFsbCB0aGUgdW5kZXJseWluZyBwb2ludGVycyB0byBOVUxMLiBBIHNwZWNpYWwgZnVuY3Rpb24gdG8gYmUgb25seQotICAvLyB1c2VkIHdoaWxlIG1lcmdpbmcgZnJvbSBhIHRlbXBvcmFyeSBVRlMuCi0gIHZvaWQgUmVzZXQoKTsKLQotICAvLyBNYWtlIGEgZGVlcCBjb3B5IG9mIGFueSBwb2ludGVycyBpbiB0aGlzIFVua25vd25GaWVsZC4KLSAgdm9pZCBEZWVwQ29weShjb25zdCBVbmtub3duRmllbGQmIG90aGVyKTsKLQotICAvLyBTZXQgdGhlIHdpcmUgdHlwZSBvZiB0aGlzIFVua25vd25GaWVsZC4gU2hvdWxkIG9ubHkgYmUgdXNlZCB3aGVuIHRoaXMKLSAgLy8gVW5rbm93bkZpZWxkIGlzIGJlaW5nIGNyZWF0ZWQuCi0gIGlubGluZSB2b2lkIFNldFR5cGUoVHlwZSB0eXBlKTsKLQotICB1bmlvbiBMZW5ndGhEZWxpbWl0ZWQgewotICAgIHN0cmluZyogc3RyaW5nX3ZhbHVlXzsKLSAgfTsKLQotICB1aW50MzIgbnVtYmVyXzsKLSAgdWludDMyIHR5cGVfOwotICB1bmlvbiB7Ci0gICAgdWludDY0IHZhcmludF87Ci0gICAgdWludDMyIGZpeGVkMzJfOwotICAgIHVpbnQ2NCBmaXhlZDY0XzsKLSAgICBtdXRhYmxlIHVuaW9uIExlbmd0aERlbGltaXRlZCBsZW5ndGhfZGVsaW1pdGVkXzsKLSAgICBVbmtub3duRmllbGRTZXQqIGdyb3VwXzsKLSAgfTsKLX07Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGlubGluZSBpbXBsZW1lbnRhdGlvbnMKLQotaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkU2V0OjpDbGVhcigpIHsKLSAgaWYgKGZpZWxkc18pIHsKLSAgICBDbGVhckZhbGxiYWNrKCk7Ci0gIH0KLX0KLQotaW5saW5lIGJvb2wgVW5rbm93bkZpZWxkU2V0OjplbXB0eSgpIGNvbnN0IHsKLSAgLy8gSW52YXJpYW50OiBmaWVsZHNfIGlzIG5ldmVyIGVtcHR5IGlmIHByZXNlbnQuCi0gIHJldHVybiAhZmllbGRzXzsKLX0KLQotaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkU2V0OjpTd2FwKFVua25vd25GaWVsZFNldCogeCkgewotICBzdGQ6OnN3YXAoZmllbGRzXywgeC0+ZmllbGRzXyk7Ci19Ci0KLWlubGluZSBpbnQgVW5rbm93bkZpZWxkU2V0OjpmaWVsZF9jb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIGZpZWxkc18gPyBzdGF0aWNfY2FzdDxpbnQ+KGZpZWxkc18tPnNpemUoKSkgOiAwOwotfQotaW5saW5lIGNvbnN0IFVua25vd25GaWVsZCYgVW5rbm93bkZpZWxkU2V0OjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKLSAgR09PR0xFX0RDSEVDSyhmaWVsZHNfICE9IE5VTEwpOwotICByZXR1cm4gKCpmaWVsZHNfKVtpbmRleF07Ci19Ci1pbmxpbmUgVW5rbm93bkZpZWxkKiBVbmtub3duRmllbGRTZXQ6Om11dGFibGVfZmllbGQoaW50IGluZGV4KSB7Ci0gIHJldHVybiAmKCpmaWVsZHNfKVtpbmRleF07Ci19Ci0KLWlubGluZSB2b2lkIFVua25vd25GaWVsZFNldDo6QWRkTGVuZ3RoRGVsaW1pdGVkKAotICAgIGludCBudW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKLSAgQWRkTGVuZ3RoRGVsaW1pdGVkKG51bWJlciktPmFzc2lnbih2YWx1ZSk7Ci19Ci0KLQotaW5saW5lIGludCBVbmtub3duRmllbGQ6Om51bWJlcigpIGNvbnN0IHsgcmV0dXJuIG51bWJlcl87IH0KLWlubGluZSBVbmtub3duRmllbGQ6OlR5cGUgVW5rbm93bkZpZWxkOjp0eXBlKCkgY29uc3QgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZT4odHlwZV8pOwotfQotCi1pbmxpbmUgdWludDY0IFVua25vd25GaWVsZDo6dmFyaW50KCkgY29uc3QgewotICBhc3NlcnQodHlwZSgpID09IFRZUEVfVkFSSU5UKTsKLSAgcmV0dXJuIHZhcmludF87Ci19Ci1pbmxpbmUgdWludDMyIFVua25vd25GaWVsZDo6Zml4ZWQzMigpIGNvbnN0IHsKLSAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0ZJWEVEMzIpOwotICByZXR1cm4gZml4ZWQzMl87Ci19Ci1pbmxpbmUgdWludDY0IFVua25vd25GaWVsZDo6Zml4ZWQ2NCgpIGNvbnN0IHsKLSAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0ZJWEVENjQpOwotICByZXR1cm4gZml4ZWQ2NF87Ci19Ci1pbmxpbmUgY29uc3Qgc3RyaW5nJiBVbmtub3duRmllbGQ6Omxlbmd0aF9kZWxpbWl0ZWQoKSBjb25zdCB7Ci0gIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgcmV0dXJuICpsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfOwotfQotaW5saW5lIGNvbnN0IFVua25vd25GaWVsZFNldCYgVW5rbm93bkZpZWxkOjpncm91cCgpIGNvbnN0IHsKLSAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0dST1VQKTsKLSAgcmV0dXJuICpncm91cF87Ci19Ci0KLWlubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X3ZhcmludCh1aW50NjQgdmFsdWUpIHsKLSAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX1ZBUklOVCk7Ci0gIHZhcmludF8gPSB2YWx1ZTsKLX0KLWlubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X2ZpeGVkMzIodWludDMyIHZhbHVlKSB7Ci0gIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9GSVhFRDMyKTsKLSAgZml4ZWQzMl8gPSB2YWx1ZTsKLX0KLWlubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X2ZpeGVkNjQodWludDY0IHZhbHVlKSB7Ci0gIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9GSVhFRDY0KTsKLSAgZml4ZWQ2NF8gPSB2YWx1ZTsKLX0KLWlubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X2xlbmd0aF9kZWxpbWl0ZWQoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgewotICBhc3NlcnQodHlwZSgpID09IFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgc3RyaW5nKiBVbmtub3duRmllbGQ6Om11dGFibGVfbGVuZ3RoX2RlbGltaXRlZCgpIHsKLSAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICByZXR1cm4gbGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXzsKLX0KLWlubGluZSBVbmtub3duRmllbGRTZXQqIFVua25vd25GaWVsZDo6bXV0YWJsZV9ncm91cCgpIHsKLSAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0dST1VQKTsKLSAgcmV0dXJuIGdyb3VwXzsKLX0KLQotaW5saW5lIGludCBVbmtub3duRmllbGQ6OkdldExlbmd0aERlbGltaXRlZFNpemUoKSBjb25zdCB7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEoVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0eXBlKCkpOwotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfLT5zaXplKCkpOwotfQotCi1pbmxpbmUgdm9pZCBVbmtub3duRmllbGQ6OlNldFR5cGUoVHlwZSB0eXBlKSB7Ci0gIHR5cGVfID0gdHlwZTsKLX0KLQotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVU5LTk9XTl9GSUVMRF9TRVRfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWRlNzI2My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsNjA5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIHRlc3QgaXMgdGVzdGluZyBhIGxvdCBtb3JlIHRoYW4ganVzdCB0aGUgVW5rbm93bkZpZWxkU2V0IGNsYXNzLiAgSXQKLS8vIHRlc3RzIGhhbmRsaW5nIG9mIHVua25vd24gZmllbGRzIHRocm91Z2hvdXQgdGhlIHN5c3RlbS4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi11c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKLQotY2xhc3MgVW5rbm93bkZpZWxkU2V0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKLSAgICBkZXNjcmlwdG9yXyA9IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKTsKLSAgICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZhbGxfZmllbGRzXyk7Ci0gICAgYWxsX2ZpZWxkc18uU2VyaWFsaXplVG9TdHJpbmcoJmFsbF9maWVsZHNfZGF0YV8pOwotICAgIEFTU0VSVF9UUlVFKGVtcHR5X21lc3NhZ2VfLlBhcnNlRnJvbVN0cmluZyhhbGxfZmllbGRzX2RhdGFfKSk7Ci0gICAgdW5rbm93bl9maWVsZHNfID0gZW1wdHlfbWVzc2FnZV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICB9Ci0KLSAgY29uc3QgVW5rbm93bkZpZWxkKiBHZXRGaWVsZChjb25zdCBzdHJpbmcmIG5hbWUpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICBpZiAoZmllbGQgPT0gTlVMTCkgcmV0dXJuIE5VTEw7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgICAgaWYgKHVua25vd25fZmllbGRzXy0+ZmllbGQoaSkubnVtYmVyKCkgPT0gZmllbGQtPm51bWJlcigpKSB7Ci0gICAgICAgIHJldHVybiAmdW5rbm93bl9maWVsZHNfLT5maWVsZChpKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RzIGEgcHJvdG9jb2wgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIGZpZWxkcyB3aXRoIGFsbCB0aGUgc2FtZQotICAvLyBudW1iZXJzIGFzIGFsbF9maWVsZHNfZGF0YV8gZXhjZXB0IHRoYXQgZWFjaCBmaWVsZCBpcyBzb21lIG90aGVyIHdpcmUKLSAgLy8gdHlwZS4KLSAgc3RyaW5nIEdldEJpemFycm9EYXRhKCkgewotICAgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGJpemFycm9fbWVzc2FnZTsKLSAgICBVbmtub3duRmllbGRTZXQqIGJpemFycm9fdW5rbm93bl9maWVsZHMgPQotICAgICAgYml6YXJyb19tZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgICBjb25zdCBVbmtub3duRmllbGQmIHVua25vd25fZmllbGQgPSB1bmtub3duX2ZpZWxkc18tPmZpZWxkKGkpOwotICAgICAgaWYgKHVua25vd25fZmllbGQudHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQpIHsKLSAgICAgICAgYml6YXJyb191bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQzMih1bmtub3duX2ZpZWxkLm51bWJlcigpLCAxKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJpemFycm9fdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCh1bmtub3duX2ZpZWxkLm51bWJlcigpLCAxKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBzdHJpbmcgZGF0YTsKLSAgICBFWFBFQ1RfVFJVRShiaXphcnJvX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpKTsKLSAgICByZXR1cm4gZGF0YTsKLSAgfQotCi0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGFsbF9maWVsZHNfOwotICBzdHJpbmcgYWxsX2ZpZWxkc19kYXRhXzsKLQotICAvLyBBbiBlbXB0eSBtZXNzYWdlIHRoYXQgaGFzIGJlZW4gcGFyc2VkIGZyb20gYWxsX2ZpZWxkc19kYXRhXy4gIFNvLCBpdCBoYXMKLSAgLy8gdW5rbm93biBmaWVsZHMgb2YgZXZlcnkgdHlwZS4KLSAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZV87Ci0gIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHNfOwotfTsKLQotbmFtZXNwYWNlIHsKLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIEFsbEZpZWxkc1ByZXNlbnQpIHsKLSAgLy8gQWxsIGZpZWxkcyBvZiBUZXN0QWxsVHlwZXMgc2hvdWxkIGJlIHByZXNlbnQsIGluIG51bWVyaWMgb3JkZXIgKGJlY2F1c2UKLSAgLy8gdGhhdCdzIHRoZSBvcmRlciB3ZSBwYXJzZWQgdGhlbSBpbikuICBGaWVsZHMgdGhhdCBhcmUgbm90IHZhbGlkIGZpZWxkCi0gIC8vIG51bWJlcnMgb2YgVGVzdEFsbFR5cGVzIHNob3VsZCBOT1QgYmUgcHJlc2VudC4KLQotICBpbnQgcG9zID0gMDsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IDEwMDA7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOdW1iZXIoaSk7Ci0gICAgaWYgKGZpZWxkICE9IE5VTEwpIHsKLSAgICAgIEFTU0VSVF9MVChwb3MsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7Ci0gICAgICAvLyBEbyBub3QgY2hlY2sgb25lb2YgZmllbGQgaWYgaXQgaXMgbm90IHNldC4KLSAgICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwpIHsKLSAgICAgICAgRVhQRUNUX0VRKGksIHVua25vd25fZmllbGRzXy0+ZmllbGQocG9zKyspLm51bWJlcigpKTsKLSAgICAgIH0gZWxzZSBpZiAoaSA9PSB1bmtub3duX2ZpZWxkc18tPmZpZWxkKHBvcykubnVtYmVyKCkpIHsKLSAgICAgICAgcG9zKys7Ci0gICAgICB9Ci0gICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgICAgLy8gU2hvdWxkIGhhdmUgYSBzZWNvbmQgaW5zdGFuY2UuCi0gICAgICAgIEFTU0VSVF9MVChwb3MsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7Ci0gICAgICAgIEVYUEVDVF9FUShpLCB1bmtub3duX2ZpZWxkc18tPmZpZWxkKHBvcysrKS5udW1iZXIoKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0gIEVYUEVDVF9FUSh1bmtub3duX2ZpZWxkc18tPmZpZWxkX2NvdW50KCksIHBvcyk7Ci19Ci0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBWYXJpbnQpIHsKLSAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbF9pbnQzMiIpOwotICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKLQotICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgZmllbGQtPnR5cGUoKSk7Ci0gIEVYUEVDVF9FUShhbGxfZmllbGRzXy5vcHRpb25hbF9pbnQzMigpLCBmaWVsZC0+dmFyaW50KCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgRml4ZWQzMikgewotICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsX2ZpeGVkMzIiKTsKLSAgQVNTRVJUX1RSVUUoZmllbGQgIT0gTlVMTCk7Ci0KLSAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyLCBmaWVsZC0+dHlwZSgpKTsKLSAgRVhQRUNUX0VRKGFsbF9maWVsZHNfLm9wdGlvbmFsX2ZpeGVkMzIoKSwgZmllbGQtPmZpeGVkMzIoKSk7Ci19Ci0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBGaXhlZDY0KSB7Ci0gIGNvbnN0IFVua25vd25GaWVsZCogZmllbGQgPSBHZXRGaWVsZCgib3B0aW9uYWxfZml4ZWQ2NCIpOwotICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKLQotICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQsIGZpZWxkLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxfZml4ZWQ2NCgpLCBmaWVsZC0+Zml4ZWQ2NCgpKTsKLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIExlbmd0aERlbGltaXRlZCkgewotICBjb25zdCBVbmtub3duRmllbGQqIGZpZWxkID0gR2V0RmllbGQoIm9wdGlvbmFsX3N0cmluZyIpOwotICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKLQotICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQsIGZpZWxkLT50eXBlKCkpOwotICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxfc3RyaW5nKCksIGZpZWxkLT5sZW5ndGhfZGVsaW1pdGVkKCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgR3JvdXApIHsKLSAgY29uc3QgVW5rbm93bkZpZWxkKiBmaWVsZCA9IEdldEZpZWxkKCJvcHRpb25hbGdyb3VwIik7Ci0gIEFTU0VSVF9UUlVFKGZpZWxkICE9IE5VTEwpOwotCi0gIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfR1JPVVAsIGZpZWxkLT50eXBlKCkpOwotICBBU1NFUlRfRVEoMSwgZmllbGQtPmdyb3VwKCkuZmllbGRfY291bnQoKSk7Ci0KLSAgY29uc3QgVW5rbm93bkZpZWxkJiBuZXN0ZWRfZmllbGQgPSBmaWVsZC0+Z3JvdXAoKS5maWVsZCgwKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6T3B0aW9uYWxHcm91cDo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoImEiKTsKLSAgQVNTRVJUX1RSVUUobmVzdGVkX2ZpZWxkX2Rlc2NyaXB0b3IgIT0gTlVMTCk7Ci0KLSAgRVhQRUNUX0VRKG5lc3RlZF9maWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKSwgbmVzdGVkX2ZpZWxkLm51bWJlcigpKTsKLSAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIG5lc3RlZF9maWVsZC50eXBlKCkpOwotICBFWFBFQ1RfRVEoYWxsX2ZpZWxkc18ub3B0aW9uYWxncm91cCgpLmEoKSwgbmVzdGVkX2ZpZWxkLnZhcmludCgpKTsKLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFNlcmlhbGl6ZUZhc3RBbmRTbG93QXJlRXF1aXZhbGVudCkgewotICBpbnQgc2l6ZSA9IFdpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICAgIGVtcHR5X21lc3NhZ2VfLnVua25vd25fZmllbGRzKCkpOwotICBzdHJpbmcgc2xvd19idWZmZXI7Ci0gIHN0cmluZyBmYXN0X2J1ZmZlcjsKLSAgc2xvd19idWZmZXIucmVzaXplKHNpemUpOwotICBmYXN0X2J1ZmZlci5yZXNpemUoc2l6ZSk7Ci0KLSAgdWludDgqIHRhcmdldCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmZhc3RfYnVmZmVyKSk7Ci0gIHVpbnQ4KiByZXN1bHQgPSBXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgICAgICBlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwotICBFWFBFQ1RfRVEoc2l6ZSwgcmVzdWx0IC0gdGFyZ2V0KTsKLQotICB7Ci0gICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIHJhd19zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZzbG93X2J1ZmZlciksIHNpemUsIDEpOwotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZyYXdfc3RyZWFtKTsKLSAgICBXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKGVtcHR5X21lc3NhZ2VfLnVua25vd25fZmllbGRzKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3V0cHV0X3N0cmVhbSk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gIH0KLSAgRVhQRUNUX1RSVUUoZmFzdF9idWZmZXIgPT0gc2xvd19idWZmZXIpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU2VyaWFsaXplKSB7Ci0gIC8vIENoZWNrIHRoYXQgc2VyaWFsaXppbmcgdGhlIFVua25vd25GaWVsZFNldCBwcm9kdWNlcyB0aGUgb3JpZ2luYWwgZGF0YQotICAvLyBhZ2Fpbi4KLQotICBzdHJpbmcgZGF0YTsKLSAgZW1wdHlfbWVzc2FnZV8uU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotCi0gIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1bXAgcmF3IGJpbmFyeSBkYXRhIHRvCi0gIC8vIHN0ZG91dC4KLSAgRVhQRUNUX1RSVUUoZGF0YSA9PSBhbGxfZmllbGRzX2RhdGFfKTsKLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFBhcnNlVmlhUmVmbGVjdGlvbikgewotICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSBwYXJzZWQgdG8gdGhlIFVua25vd25GaWVsZFNldCB3aGVuIHBhcnNpbmcKLSAgLy8gdmlhIHJlZmxlY3Rpb24uCi0KLSAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTsKLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGFsbF9maWVsZHNfZGF0YV8uZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsX2ZpZWxkc19kYXRhXy5zaXplKCkpOwotICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKLSAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmbWVzc2FnZSkpOwotCi0gIEVYUEVDVF9FUShtZXNzYWdlLkRlYnVnU3RyaW5nKCksIGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU2VyaWFsaXplVmlhUmVmbGVjdGlvbikgewotICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSB3cml0dGVuIGZyb20gdGhlIFVua25vd25GaWVsZFNldCB3aGVuCi0gIC8vIHNlcmlhbGl6aW5nIHZpYSByZWZsZWN0aW9uLgotCi0gIHN0cmluZyBkYXRhOwotCi0gIHsKLSAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmRhdGEpOwotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOwotICAgIGludCBzaXplID0gV2lyZUZvcm1hdDo6Qnl0ZVNpemUoZW1wdHlfbWVzc2FnZV8pOwotICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhlbXB0eV9tZXNzYWdlXywgc2l6ZSwgJm91dHB1dCk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKLSAgfQotCi0gIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgYmVjYXVzZSB3ZSBkb24ndCB3YW50IHRvIGR1bXAgcmF3IGJpbmFyeSBkYXRhIHRvCi0gIC8vIHN0ZG91dC4KLSAgRVhQRUNUX1RSVUUoZGF0YSA9PSBhbGxfZmllbGRzX2RhdGFfKTsKLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIENvcHlGcm9tKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7Ci0KLSAgbWVzc2FnZS5Db3B5RnJvbShlbXB0eV9tZXNzYWdlXyk7Ci0KLSAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCksIG1lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBTd2FwKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG90aGVyX21lc3NhZ2U7Ci0gIEFTU0VSVF9UUlVFKG90aGVyX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKEdldEJpemFycm9EYXRhKCkpKTsKLQotICBFWFBFQ1RfR1QoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKLSAgRVhQRUNUX0dUKG90aGVyX21lc3NhZ2UudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKLSAgY29uc3Qgc3RyaW5nIGRlYnVnX3N0cmluZyA9IGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCk7Ci0gIGNvbnN0IHN0cmluZyBvdGhlcl9kZWJ1Z19zdHJpbmcgPSBvdGhlcl9tZXNzYWdlLkRlYnVnU3RyaW5nKCk7Ci0gIEVYUEVDVF9ORShkZWJ1Z19zdHJpbmcsIG90aGVyX2RlYnVnX3N0cmluZyk7Ci0KLSAgZW1wdHlfbWVzc2FnZV8uU3dhcCgmb3RoZXJfbWVzc2FnZSk7Ci0gIEVYUEVDVF9FUShkZWJ1Z19zdHJpbmcsIG90aGVyX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Ci0gIEVYUEVDVF9FUShvdGhlcl9kZWJ1Z19zdHJpbmcsIGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU3dhcFdpdGhTZWxmKSB7Ci0gIGNvbnN0IHN0cmluZyBkZWJ1Z19zdHJpbmcgPSBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpOwotICBFWFBFQ1RfR1QoZW1wdHlfbWVzc2FnZV8udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpLCAwKTsKLQotICBlbXB0eV9tZXNzYWdlXy5Td2FwKCZlbXB0eV9tZXNzYWdlXyk7Ci0gIEVYUEVDVF9HVChlbXB0eV9tZXNzYWdlXy51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCksIDApOwotICBFWFBFQ1RfRVEoZGVidWdfc3RyaW5nLCBlbXB0eV9tZXNzYWdlXy5EZWJ1Z1N0cmluZygpKTsKLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIE1lcmdlRnJvbSkgewotICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBzb3VyY2UsIGRlc3RpbmF0aW9uOwotCi0gIGRlc3RpbmF0aW9uLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEsIDEpOwotICBkZXN0aW5hdGlvbi5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgzLCAyKTsKLSAgc291cmNlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDIsIDMpOwotICBzb3VyY2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMywgNCk7Ci0KLSAgZGVzdGluYXRpb24uTWVyZ2VGcm9tKHNvdXJjZSk7Ci0KLSAgRVhQRUNUX0VRKAotICAgIC8vIE5vdGU6ICBUaGUgb3JkZXJpbmcgb2YgZmllbGRzIGhlcmUgZGVwZW5kcyBvbiB0aGUgb3JkZXJpbmcgb2YgYWRkcwotICAgIC8vICAgYW5kIG1lcmdpbmcsIGFib3ZlLgotICAgICIxOiAxXG4iCi0gICAgIjM6IDJcbiIKLSAgICAiMjogM1xuIgotICAgICIzOiA0XG4iLAotICAgIGRlc3RpbmF0aW9uLkRlYnVnU3RyaW5nKCkpOwotfQotCi0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBDbGVhcikgewotICAvLyBDbGVhciB0aGUgc2V0LgotICBlbXB0eV9tZXNzYWdlXy5DbGVhcigpOwotICBFWFBFQ1RfRVEoMCwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIENsZWFyQW5kRnJlZU1lbW9yeSkgewotICBFWFBFQ1RfR1QodW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpLCAwKTsKLSAgdW5rbm93bl9maWVsZHNfLT5DbGVhckFuZEZyZWVNZW1vcnkoKTsKLSAgRVhQRUNUX0VRKDAsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7Ci0gIHVua25vd25fZmllbGRzXy0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKLSAgRVhQRUNUX0VRKDEsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7Ci19Ci0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBQYXJzZUtub3duQW5kVW5rbm93bikgewotICAvLyBUZXN0IG1peGluZyBrbm93biBhbmQgdW5rbm93biBmaWVsZHMgd2hlbiBwYXJzaW5nLgotCi0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIHNvdXJjZTsKLSAgc291cmNlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKLSAgc3RyaW5nIGRhdGE7Ci0gIEFTU0VSVF9UUlVFKHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOwotCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgZGVzdGluYXRpb247Ci0gIEFTU0VSVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhhbGxfZmllbGRzX2RhdGFfICsgZGF0YSkpOwotCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoZGVzdGluYXRpb24pOwotICBBU1NFUlRfRVEoMSwgZGVzdGluYXRpb24udW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKLSAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsCi0gICAgICAgICAgICBkZXN0aW5hdGlvbi51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLnR5cGUoKSk7Ci0gIEVYUEVDVF9FUSg2NTQzMjEsIGRlc3RpbmF0aW9uLnVua25vd25fZmllbGRzKCkuZmllbGQoMCkudmFyaW50KCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgV3JvbmdUeXBlVHJlYXRlZEFzVW5rbm93bikgewotICAvLyBUZXN0IHRoYXQgZmllbGRzIG9mIHRoZSB3cm9uZyB3aXJlIHR5cGUgYXJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcwotICAvLyB3aGVuIHBhcnNpbmcuCi0KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBhbGxfdHlwZXNfbWVzc2FnZTsKLSAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZTsKLSAgc3RyaW5nIGJpemFycm9fZGF0YSA9IEdldEJpemFycm9EYXRhKCk7Ci0gIEFTU0VSVF9UUlVFKGFsbF90eXBlc19tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhiaXphcnJvX2RhdGEpKTsKLSAgQVNTRVJUX1RSVUUoZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7Ci0KLSAgLy8gQWxsIGZpZWxkcyBzaG91bGQgaGF2ZSBiZWVuIGludGVycHJldGVkIGFzIHVua25vd24sIHNvIHRoZSBkZWJ1ZyBzdHJpbmdzCi0gIC8vIHNob3VsZCBiZSB0aGUgc2FtZS4KLSAgRVhQRUNUX0VRKGVtcHR5X21lc3NhZ2UuRGVidWdTdHJpbmcoKSwgYWxsX3R5cGVzX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBXcm9uZ1R5cGVUcmVhdGVkQXNVbmtub3duVmlhUmVmbGVjdGlvbikgewotICAvLyBTYW1lIGFzIFdyb25nVHlwZVRyZWF0ZWRBc1Vua25vd24gYnV0IHZpYSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UuCi0KLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBhbGxfdHlwZXNfbWVzc2FnZTsKLSAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlfbWVzc2FnZTsKLSAgc3RyaW5nIGJpemFycm9fZGF0YSA9IEdldEJpemFycm9EYXRhKCk7Ci0gIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChiaXphcnJvX2RhdGEuZGF0YSgpLCBiaXphcnJvX2RhdGEuc2l6ZSgpKTsKLSAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7Ci0gIEFTU0VSVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmFsbF90eXBlc19tZXNzYWdlKSk7Ci0gIEFTU0VSVF9UUlVFKGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJpemFycm9fZGF0YSkpOwotCi0gIEVYUEVDVF9FUShlbXB0eV9tZXNzYWdlLkRlYnVnU3RyaW5nKCksIGFsbF90eXBlc19tZXNzYWdlLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgVW5rbm93bkV4dGVuc2lvbnMpIHsKLSAgLy8gTWFrZSBzdXJlIGZpZWxkcyBhcmUgcHJvcGVybHkgcGFyc2VkIHRvIHRoZSBVbmtub3duRmllbGRTZXQgZXZlbiB3aGVuCi0gIC8vIHRoZXkgYXJlIGRlY2xhcmVkIGFzIGV4dGVuc2lvbiBudW1iZXJzLgotCi0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMgbWVzc2FnZTsKLSAgQVNTRVJUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYWxsX2ZpZWxkc19kYXRhXykpOwotCi0gIEVYUEVDVF9FUShtZXNzYWdlLkRlYnVnU3RyaW5nKCksIGVtcHR5X21lc3NhZ2VfLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgVW5rbm93bkV4dGVuc2lvbnNSZWZsZWN0aW9uKSB7Ci0gIC8vIFNhbWUgYXMgVW5rbm93bkV4dGVuc2lvbnMgZXhjZXB0IHBhcnNpbmcgdmlhIHJlZmxlY3Rpb24uCi0KLSAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBtZXNzYWdlOwotICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoYWxsX2ZpZWxkc19kYXRhXy5kYXRhKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxfZmllbGRzX2RhdGFfLnNpemUoKSk7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOwotICBBU1NFUlRfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZtZXNzYWdlKSk7Ci0KLSAgRVhQRUNUX0VRKG1lc3NhZ2UuRGVidWdTdHJpbmcoKSwgZW1wdHlfbWVzc2FnZV8uRGVidWdTdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBXcm9uZ0V4dGVuc2lvblR5cGVUcmVhdGVkQXNVbmtub3duKSB7Ci0gIC8vIFRlc3QgdGhhdCBmaWVsZHMgb2YgdGhlIHdyb25nIHdpcmUgdHlwZSBhcmUgdHJlYXRlZCBsaWtlIHVua25vd24gZmllbGRzCi0gIC8vIHdoZW4gcGFyc2luZyBleHRlbnNpb25zLgotCi0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBhbGxfZXh0ZW5zaW9uc19tZXNzYWdlOwotICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBlbXB0eV9tZXNzYWdlOwotICBzdHJpbmcgYml6YXJyb19kYXRhID0gR2V0Qml6YXJyb0RhdGEoKTsKLSAgQVNTRVJUX1RSVUUoYWxsX2V4dGVuc2lvbnNfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoYml6YXJyb19kYXRhKSk7Ci0gIEFTU0VSVF9UUlVFKGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGJpemFycm9fZGF0YSkpOwotCi0gIC8vIEFsbCBmaWVsZHMgc2hvdWxkIGhhdmUgYmVlbiBpbnRlcnByZXRlZCBhcyB1bmtub3duLCBzbyB0aGUgZGVidWcgc3RyaW5ncwotICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuCi0gIEVYUEVDVF9FUShlbXB0eV9tZXNzYWdlLkRlYnVnU3RyaW5nKCksIGFsbF9leHRlbnNpb25zX21lc3NhZ2UuRGVidWdTdHJpbmcoKSk7Ci19Ci0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBVbmtub3duRW51bVZhbHVlKSB7Ci0gIHVzaW5nIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM7Ci0gIHVzaW5nIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczsKLSAgdXNpbmcgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2U7Ci0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBzaW5ndWxhcl9maWVsZCA9Ci0gICAgVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXBlYXRlZF9maWVsZCA9Ci0gICAgVGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX2VudW0iKTsKLSAgQVNTRVJUX1RSVUUoc2luZ3VsYXJfZmllbGQgIT0gTlVMTCk7Ci0gIEFTU0VSVF9UUlVFKHJlcGVhdGVkX2ZpZWxkICE9IE5VTEwpOwotCi0gIHN0cmluZyBkYXRhOwotCi0gIHsKLSAgICBUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7Ci0gICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyA9IGVtcHR5X21lc3NhZ2UubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwotICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoc2luZ3VsYXJfZmllbGQtPm51bWJlcigpLCBUZXN0QWxsVHlwZXM6OkJBUik7Ci0gICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChzaW5ndWxhcl9maWVsZC0+bnVtYmVyKCksIDUpOyAgLy8gbm90IHZhbGlkCi0gICAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludChyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIFRlc3RBbGxUeXBlczo6Rk9PKTsKLSAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgNCk7ICAvLyBub3QgdmFsaWQKLSAgICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgVGVzdEFsbFR5cGVzOjpCQVopOwotICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCA2KTsgIC8vIG5vdCB2YWxpZAotICAgIGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotICB9Ci0KLSAgewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0oKSk7Ci0gICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSgpKTsKLSAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0oMCkpOwotICAgIEVYUEVDVF9FUShUZXN0QWxsVHlwZXM6OkJBWiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgxKSk7Ci0KLSAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzID0gbWVzc2FnZS51bmtub3duX2ZpZWxkcygpOwotICAgIEFTU0VSVF9FUSgzLCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpKTsKLQotICAgIEVYUEVDVF9FUShzaW5ndWxhcl9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDApLm51bWJlcigpKTsKLSAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkudHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEoNSwgdW5rbm93bl9maWVsZHMuZmllbGQoMCkudmFyaW50KCkpOwotCi0gICAgRVhQRUNUX0VRKHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkubnVtYmVyKCkpOwotICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS50eXBlKCkpOwotICAgIEVYUEVDVF9FUSg0LCB1bmtub3duX2ZpZWxkcy5maWVsZCgxKS52YXJpbnQoKSk7Ci0KLSAgICBFWFBFQ1RfRVEocmVwZWF0ZWRfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS5udW1iZXIoKSk7Ci0gICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDIpLnR5cGUoKSk7Ci0gICAgRVhQRUNUX0VRKDYsIHVua25vd25fZmllbGRzLmZpZWxkKDIpLnZhcmludCgpKTsKLSAgfQotCi0gIHsKLSAgICB1c2luZyB1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uOwotICAgIHVzaW5nIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb247Ci0KLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwotICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVIsCi0gICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKG9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbikpOwotICAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUocmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKSk7Ci0gICAgRVhQRUNUX0VRKFRlc3RBbGxUeXBlczo6Rk9PLAotICAgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbihyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24sIDApKTsKLSAgICBFWFBFQ1RfRVEoVGVzdEFsbFR5cGVzOjpCQVosCi0gICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwgMSkpOwotCi0gICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcyA9IG1lc3NhZ2UudW5rbm93bl9maWVsZHMoKTsKLSAgICBBU1NFUlRfRVEoMywgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKSk7Ci0KLSAgICBFWFBFQ1RfRVEoc2luZ3VsYXJfZmllbGQtPm51bWJlcigpLCB1bmtub3duX2ZpZWxkcy5maWVsZCgwKS5udW1iZXIoKSk7Ci0gICAgQVNTRVJUX0VRKFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQsIHVua25vd25fZmllbGRzLmZpZWxkKDApLnR5cGUoKSk7Ci0gICAgRVhQRUNUX0VRKDUsIHVua25vd25fZmllbGRzLmZpZWxkKDApLnZhcmludCgpKTsKLQotICAgIEVYUEVDVF9FUShyZXBlYXRlZF9maWVsZC0+bnVtYmVyKCksIHVua25vd25fZmllbGRzLmZpZWxkKDEpLm51bWJlcigpKTsKLSAgICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkudHlwZSgpKTsKLSAgICBFWFBFQ1RfRVEoNCwgdW5rbm93bl9maWVsZHMuZmllbGQoMSkudmFyaW50KCkpOwotCi0gICAgRVhQRUNUX0VRKHJlcGVhdGVkX2ZpZWxkLT5udW1iZXIoKSwgdW5rbm93bl9maWVsZHMuZmllbGQoMikubnVtYmVyKCkpOwotICAgIEFTU0VSVF9FUShVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5ULCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS50eXBlKCkpOwotICAgIEVYUEVDVF9FUSg2LCB1bmtub3duX2ZpZWxkcy5maWVsZCgyKS52YXJpbnQoKSk7Ci0gIH0KLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYpIHsKLSAgVW5rbm93bkZpZWxkU2V0IGVtcHR5OwotICBlbXB0eS5BZGRWYXJpbnQoMSwgMCk7Ci0gIEVYUEVDVF9FUShzaXplb2YodmVjdG9yPFVua25vd25GaWVsZD4pICsgc2l6ZW9mKFVua25vd25GaWVsZCksCi0gICAgICAgICAgICBlbXB0eS5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkpOwotfQotCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU3BhY2VVc2VkKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7Ci0KLSAgLy8gTWFrZSBzdXJlIGFuIHVua25vd24gZmllbGQgc2V0IGhhcyB6ZXJvIHNwYWNlIHVzZWQgdW50aWwgYSBmaWVsZCBpcwotICAvLyBhY3R1YWxseSBhZGRlZC4KLSAgaW50IGJhc2Vfc2l6ZSA9IGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCk7Ci0gIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMgPSBlbXB0eV9tZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKLSAgRVhQRUNUX0VRKGJhc2Vfc2l6ZSwgZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKSk7Ci0KLSAgLy8gTWFrZSBzdXJlIGVhY2ggdGhpbmcgd2UgYWRkIHRvIHRoZSBzZXQgaW5jcmVhc2VzIHRoZSBTcGFjZVVzZWQoKS4KLSAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCgxLCAwKTsKLSAgRVhQRUNUX0xUKGJhc2Vfc2l6ZSwgZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKSk7Ci0gIGJhc2Vfc2l6ZSA9IGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCk7Ci0KLSAgc3RyaW5nKiBzdHIgPSB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDEpOwotICBFWFBFQ1RfTFQoYmFzZV9zaXplLCBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpKTsKLSAgYmFzZV9zaXplID0gZW1wdHlfbWVzc2FnZS5TcGFjZVVzZWQoKTsKLQotICBzdHItPmFzc2lnbihzaXplb2Yoc3RyaW5nKSArIDEsICd4Jyk7Ci0gIEVYUEVDVF9MVChiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOwotICBiYXNlX3NpemUgPSBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpOwotCi0gIFVua25vd25GaWVsZFNldCogZ3JvdXAgPSB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAoMSk7Ci0gIEVYUEVDVF9MVChiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOwotICBiYXNlX3NpemUgPSBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpOwotCi0gIGdyb3VwLT5BZGRWYXJpbnQoMSwgMCk7Ci0gIEVYUEVDVF9MVChiYXNlX3NpemUsIGVtcHR5X21lc3NhZ2UuU3BhY2VVc2VkKCkpOwotfQotCi0KLVRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBFbXB0eSkgewotICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7Ci0gIEVYUEVDVF9UUlVFKHVua25vd25fZmllbGRzLmVtcHR5KCkpOwotICB1bmtub3duX2ZpZWxkcy5BZGRWYXJpbnQoNiwgMTIzKTsKLSAgRVhQRUNUX0ZBTFNFKHVua25vd25fZmllbGRzLmVtcHR5KCkpOwotICB1bmtub3duX2ZpZWxkcy5DbGVhcigpOwotICBFWFBFQ1RfVFJVRSh1bmtub3duX2ZpZWxkcy5lbXB0eSgpKTsKLX0KLQotVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIERlbGV0ZVN1YnJhbmdlKSB7Ci0gIC8vIEV4aGF1c3RpdmVseSB0ZXN0IHRoZSBkZWxldGlvbiBvZiBldmVyeSBwb3NzaWJsZSBzdWJyYW5nZSBpbiBhcnJheXMgb2YgYWxsCi0gIC8vIHNpemVzIGZyb20gMCB0aHJvdWdoIDkuCi0gIGZvciAoaW50IHNpemUgPSAwOyBzaXplIDwgMTA7ICsrc2l6ZSkgewotICAgIGZvciAoaW50IG51bSA9IDA7IG51bSA8PSBzaXplOyArK251bSkgewotICAgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHNpemUgLSBudW07ICsrc3RhcnQpIHsKLSAgICAgICAgLy8gQ3JlYXRlIGEgc2V0IHdpdGggInNpemUiIGZpZWxkcy4KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0IHVua25vd247Ci0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgKytpKSB7Ci0gICAgICAgICAgdW5rbm93bi5BZGRGaXhlZDMyKGksIGkpOwotICAgICAgICB9Ci0gICAgICAgIC8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIHN1YnJhbmdlLgotICAgICAgICB1bmtub3duLkRlbGV0ZVN1YnJhbmdlKHN0YXJ0LCBudW0pOwotICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIHJlc3VsdGluZyBmaWVsZCB2YWx1ZXMgYXJlIHN0aWxsIGNvcnJlY3QuCi0gICAgICAgIEVYUEVDVF9FUShzaXplIC0gbnVtLCB1bmtub3duLmZpZWxkX2NvdW50KCkpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd24uZmllbGRfY291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgaWYgKGkgPCBzdGFydCkgewotICAgICAgICAgICAgRVhQRUNUX0VRKGksIHVua25vd24uZmllbGQoaSkuZml4ZWQzMigpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRVhQRUNUX0VRKGkgKyBudW0sIHVua25vd24uZmllbGQoaSkuZml4ZWQzMigpKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KLQotdm9pZCBDaGVja0RlbGV0ZUJ5TnVtYmVyKGNvbnN0IHZlY3RvcjxpbnQ+JiBmaWVsZF9udW1iZXJzLCBpbnQgZGVsZXRlZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2ZWN0b3I8aW50PiYgZXhwZWN0ZWRfZmllbGRfbnVibWVycykgewotICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfbnVtYmVycy5zaXplKCk7ICsraSkgewotICAgIHVua25vd25fZmllbGRzLkFkZEZpeGVkMzIoZmllbGRfbnVtYmVyc1tpXSwgaSk7Ci0gIH0KLSAgdW5rbm93bl9maWVsZHMuRGVsZXRlQnlOdW1iZXIoZGVsZXRlZF9udW1iZXIpOwotICBBU1NFUlRfRVEoZXhwZWN0ZWRfZmllbGRfbnVibWVycy5zaXplKCksIHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCkpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGV4cGVjdGVkX2ZpZWxkX251Ym1lcnMuc2l6ZSgpOyArK2kpIHsKLSAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfZmllbGRfbnVibWVyc1tpXSwKLSAgICAgICAgICAgICAgdW5rbm93bl9maWVsZHMuZmllbGQoaSkubnVtYmVyKCkpOwotICB9Ci19Ci0KLSNkZWZpbmUgTUFLRV9WRUNUT1IoeCkgdmVjdG9yPGludD4oeCwgeCArIEdPT0dMRV9BUlJBWVNJWkUoeCkpCi1URVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgRGVsZXRlQnlOdW1iZXIpIHsKLSAgQ2hlY2tEZWxldGVCeU51bWJlcih2ZWN0b3I8aW50PigpLCAxLCB2ZWN0b3I8aW50PigpKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczFbXSA9IHsxLCAyLCAzfTsKLSAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTEgPSAxOwotICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczFbXSA9IHsyLCAzfTsKLSAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczEpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTEsCi0gICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzMSkpOwotICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmllbGROdW1iZXJzMltdID0gezEsIDIsIDN9OwotICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZE51bWJlclRvRGVsZXRlMiA9IDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkRmllbGROdW1iZXJzMltdID0gezEsIDN9OwotICBDaGVja0RlbGV0ZUJ5TnVtYmVyKE1BS0VfVkVDVE9SKGtUZXN0RmllbGROdW1iZXJzMiksIGtGaWVsZE51bWJlclRvRGVsZXRlMiwKLSAgICAgICAgICAgICAgICAgICAgICBNQUtFX1ZFQ1RPUihrRXhwZWN0ZWRGaWVsZE51bWJlcnMyKSk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RGaWVsZE51bWJlcnMzW10gPSB7MSwgMiwgM307Ci0gIHN0YXRpYyBjb25zdCBpbnQga0ZpZWxkTnVtYmVyVG9EZWxldGUzID0gMzsKLSAgc3RhdGljIGNvbnN0IGludCBrRXhwZWN0ZWRGaWVsZE51bWJlcnMzW10gPSB7MSwgMn07Ci0gIENoZWNrRGVsZXRlQnlOdW1iZXIoTUFLRV9WRUNUT1Ioa1Rlc3RGaWVsZE51bWJlcnMzKSwga0ZpZWxkTnVtYmVyVG9EZWxldGUzLAotICAgICAgICAgICAgICAgICAgICAgIE1BS0VfVkVDVE9SKGtFeHBlY3RlZEZpZWxkTnVtYmVyczMpKTsKLSAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczRbXSA9IHsxLCAyLCAxLCA0LCAxfTsKLSAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTQgPSAxOwotICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczRbXSA9IHsyLCA0fTsKLSAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczQpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTQsCi0gICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzNCkpOwotICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmllbGROdW1iZXJzNVtdID0gezEsIDIsIDMsIDQsIDV9OwotICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZE51bWJlclRvRGVsZXRlNSA9IDY7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkRmllbGROdW1iZXJzNVtdID0gezEsIDIsIDMsIDQsIDV9OwotICBDaGVja0RlbGV0ZUJ5TnVtYmVyKE1BS0VfVkVDVE9SKGtUZXN0RmllbGROdW1iZXJzNSksIGtGaWVsZE51bWJlclRvRGVsZXRlNSwKLSAgICAgICAgICAgICAgICAgICAgICBNQUtFX1ZFQ1RPUihrRXhwZWN0ZWRGaWVsZE51bWJlcnM1KSk7Ci19Ci0jdW5kZWYgTUFLRV9WRUNUT1IKLX0gIC8vIG5hbWVzcGFjZQotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1ZWU0ZTI1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MKKysrIC9kZXYvbnVsbApAQCAtMSwxMTMzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLQotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgotCi0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1ib29sIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcjo6U2tpcEZpZWxkKAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZykgewotICByZXR1cm4gV2lyZUZvcm1hdDo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzXyk7Ci19Ci0KLWJvb2wgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgcmV0dXJuIFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKGlucHV0LCB1bmtub3duX2ZpZWxkc18pOwotfQotCi12b2lkIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcjo6U2tpcFVua25vd25FbnVtKAotICAgIGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSkgewotICB1bmtub3duX2ZpZWxkc18tPkFkZFZhcmludChmaWVsZF9udW1iZXIsIHZhbHVlKTsKLX0KLQotYm9vbCBXaXJlRm9ybWF0OjpTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICBpbnQgbnVtYmVyID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7Ci0KLSAgc3dpdGNoIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSkgewotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDogewotICAgICAgdWludDY0IHZhbHVlOwotICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICh1bmtub3duX2ZpZWxkcyAhPSBOVUxMKSB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgdmFsdWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ6IHsKLSAgICAgIHVpbnQ2NCB2YWx1ZTsKLSAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW42NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodW5rbm93bl9maWVsZHMgIT0gTlVMTCkgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQobnVtYmVyLCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDogewotICAgICAgdWludDMyIGxlbmd0aDsKLSAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHVua25vd25fZmllbGRzID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCFpbnB1dC0+U2tpcChsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQobnVtYmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKLSAgICAgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghU2tpcE1lc3NhZ2UoaW5wdXQsICh1bmtub3duX2ZpZWxkcyA9PSBOVUxMKSA/Ci0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIDogdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKG51bWJlcikpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwotICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZW5kaW5nIHRhZyBtYXRjaGVkIHRoZSBzdGFydGluZyB0YWcuCi0gICAgICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQOiB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzI6IHsKLSAgICAgIHVpbnQzMiB2YWx1ZTsKLSAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodW5rbm93bl9maWVsZHMgIT0gTlVMTCkgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIobnVtYmVyLCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgZGVmYXVsdDogewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgfQotfQotCi1ib29sIFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOwotICAgIGlmICh0YWcgPT0gMCkgewotICAgICAgLy8gRW5kIG9mIGlucHV0LiAgVGhpcyBpcyBhIHZhbGlkIHBsYWNlIHRvIGVuZCwgc28gcmV0dXJuIHRydWUuCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7Ci0KLSAgICBpZiAod2lyZV90eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgIC8vIE11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmICghU2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzKSkgcmV0dXJuIGZhbHNlOwotICB9Ci19Ci0KLWJvb2wgV2lyZUZvcm1hdDo6UmVhZFBhY2tlZEVudW1QcmVzZXJ2ZVVua25vd25zKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqaXNfdmFsaWQpKGludCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiB2YWx1ZXMpIHsKLSAgdWludDMyIGxlbmd0aDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKLSAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsKLSAgICBpbnQgdmFsdWU7Ci0gICAgaWYgKCFnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgIGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oaW5wdXQsICZ2YWx1ZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGlzX3ZhbGlkID09IE5VTEwgfHwgaXNfdmFsaWQodmFsdWUpKSB7Ci0gICAgICB2YWx1ZXMtPkFkZCh2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoZmllbGRfbnVtYmVyLCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0gIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi0KLXZvaWQgV2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9IHVua25vd25fZmllbGRzLmZpZWxkKGkpOwotICAgIHN3aXRjaCAoZmllbGQudHlwZSgpKSB7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6Ci0gICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpKTsKLSAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDY0KGZpZWxkLnZhcmludCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgotICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMikpOwotICAgICAgICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIoZmllbGQuZml4ZWQzMigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgotICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkpOwotICAgICAgICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQoZmllbGQuZml4ZWQ2NCgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgotICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkpOwotICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpLnNpemUoKSk7Ci0gICAgICAgIG91dHB1dC0+V3JpdGVSYXdNYXliZUFsaWFzZWQoZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpLmRhdGEoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKLSAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQKSk7Ci0gICAgICAgIFNlcmlhbGl6ZVVua25vd25GaWVsZHMoZmllbGQuZ3JvdXAoKSwgb3V0cHV0KTsKLSAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLX0KLQotdWludDgqIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgdWludDgqIHRhcmdldCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKLQotICAgIHN3aXRjaCAoZmllbGQudHlwZSgpKSB7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6Ci0gICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSgKLSAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC52YXJpbnQoKSwgdGFyZ2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgotICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyVG9BcnJheSgKLSAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC5maXhlZDMyKCksIHRhcmdldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKLSAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NFRvQXJyYXkoCi0gICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgZmllbGQuZml4ZWQ2NCgpLCB0YXJnZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzVG9BcnJheSgKLSAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCksIHRhcmdldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6Ci0gICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoCi0gICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQLCB0YXJnZXQpOwotICAgICAgICB0YXJnZXQgPSBTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheShmaWVsZC5ncm91cCgpLCB0YXJnZXQpOwotICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVAsIHRhcmdldCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi12b2lkIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCi0gICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKLSAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKLSAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCi0gICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgLy8gU3RhcnQgZ3JvdXAuCi0gICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKTsKLQotICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWcpOwotICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGZpZWxkLm51bWJlcigpKTsKLQotICAgICAgLy8gV3JpdGUgbWVzc2FnZS4KLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnKTsKLSAgICAgIGZpZWxkLlNlcmlhbGl6ZUxlbmd0aERlbGltaXRlZE5vVGFnKG91dHB1dCk7Ci0KLSAgICAgIC8vIEVuZCBncm91cC4KLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKLSAgICB9Ci0gIH0KLX0KLQotdWludDgqIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXNUb0FycmF5KAotICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgdWludDgqIHRhcmdldCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKLQotICAgIC8vIFRoZSBvbmx5IHVua25vd24gZmllbGRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gZXhpc3QgaW4gYSBNZXNzYWdlU2V0IGFyZQotICAgIC8vIG1lc3NhZ2VzLCB3aGljaCBhcmUgbGVuZ3RoLWRlbGltaXRlZC4KLSAgICBpZiAoZmllbGQudHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAvLyBTdGFydCBncm91cC4KLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKLQotICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZywgdGFyZ2V0KTsKLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCi0gICAgICAgICAgZmllbGQubnVtYmVyKCksIHRhcmdldCk7Ci0KLSAgICAgIC8vIFdyaXRlIG1lc3NhZ2UuCi0gICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnLCB0YXJnZXQpOwotICAgICAgdGFyZ2V0ID0gZmllbGQuU2VyaWFsaXplTGVuZ3RoRGVsaW1pdGVkTm9UYWdUb0FycmF5KHRhcmdldCk7Ci0KLSAgICAgIC8vIEVuZCBncm91cC4KLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcsIHRhcmdldCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRhcmdldDsKLX0KLQotaW50IFdpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKSB7Ci0gIGludCBzaXplID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0KLSAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgewotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgotICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSk7Ci0gICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQoZmllbGQudmFyaW50KCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6Ci0gICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyKSk7Ci0gICAgICAgIHNpemUgKz0gc2l6ZW9mKGludDMyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgotICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkpOwotICAgICAgICBzaXplICs9IHNpemVvZihpbnQ2NCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKTsKLSAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgICAgICAgIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCkpOwotICAgICAgICBzaXplICs9IGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6Ci0gICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCkpOwotICAgICAgICBzaXplICs9IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZShmaWVsZC5ncm91cCgpKTsKLSAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc2l6ZTsKLX0KLQotaW50IFdpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duTWVzc2FnZVNldEl0ZW1zU2l6ZSgKLSAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKSB7Ci0gIGludCBzaXplID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0KLSAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKLSAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCi0gICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7Ci0gICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGZpZWxkLm51bWJlcigpKTsKLQotICAgICAgaW50IGZpZWxkX3NpemUgPSBmaWVsZC5HZXRMZW5ndGhEZWxpbWl0ZWRTaXplKCk7Ci0gICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGZpZWxkX3NpemUpOwotICAgICAgc2l6ZSArPSBmaWVsZF9zaXplOwotICAgIH0KLSAgfQotCi0gIHJldHVybiBzaXplOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWJvb2wgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICB3aGlsZSh0cnVlKSB7Ci0gICAgdWludDMyIHRhZyA9IGlucHV0LT5SZWFkVGFnKCk7Ci0gICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICAvLyBFbmQgb2YgaW5wdXQuICBUaGlzIGlzIGEgdmFsaWQgcGxhY2UgdG8gZW5kLCBzbyByZXR1cm4gdHJ1ZS4KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAvLyBNdXN0IGJlIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gTlVMTDsKLQotICAgIGlmIChkZXNjcmlwdG9yICE9IE5VTEwpIHsKLSAgICAgIGludCBmaWVsZF9udW1iZXIgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKTsKLSAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOdW1iZXIoZmllbGRfbnVtYmVyKTsKLQotICAgICAgLy8gSWYgdGhhdCBmYWlsZWQsIGNoZWNrIGlmIHRoZSBmaWVsZCBpcyBhbiBleHRlbnNpb24uCi0gICAgICBpZiAoZmllbGQgPT0gTlVMTCAmJiBkZXNjcmlwdG9yLT5Jc0V4dGVuc2lvbk51bWJlcihmaWVsZF9udW1iZXIpKSB7Ci0gICAgICAgIGlmIChpbnB1dC0+R2V0RXh0ZW5zaW9uUG9vbCgpID09IE5VTEwpIHsKLSAgICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoZmllbGRfbnVtYmVyKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaWVsZCA9IGlucHV0LT5HZXRFeHRlbnNpb25Qb29sKCkKLSAgICAgICAgICAgICAgICAgICAgICAgLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZGVzY3JpcHRvciwgZmllbGRfbnVtYmVyKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBJZiB0aGF0IGZhaWxlZCwgYnV0IHdlJ3JlIGEgTWVzc2FnZVNldCwgYW5kIHRoaXMgaXMgdGhlIHRhZyBmb3IgYQotICAgICAgLy8gTWVzc2FnZVNldCBpdGVtLCB0aGVuIHBhcnNlIHRoYXQuCi0gICAgICBpZiAoZmllbGQgPT0gTlVMTCAmJgotICAgICAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCi0gICAgICAgICAgdGFnID09IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZykgewotICAgICAgICBpZiAoIVBhcnNlQW5kTWVyZ2VNZXNzYWdlU2V0SXRlbShpbnB1dCwgbWVzc2FnZSkpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgY29udGludWU7ICAvLyBTa2lwIFBhcnNlQW5kTWVyZ2VGaWVsZCgpOyBhbHJlYWR5IHRha2VuIGNhcmUgb2YuCi0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKCFQYXJzZUFuZE1lcmdlRmllbGQodGFnLCBmaWVsZCwgbWVzc2FnZSwgaW5wdXQpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgV2lyZUZvcm1hdDo6U2tpcE1lc3NhZ2VTZXRGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7Ci0gIHVpbnQzMiBsZW5ndGg7Ci0gIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gaW5wdXQtPlJlYWRTdHJpbmcoCi0gICAgICB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKGZpZWxkX251bWJlciksIGxlbmd0aCk7Ci19Ci0KLWJvb2wgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRGaWVsZCh1aW50MzIgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgIC8vIFdlIHN0b3JlIHVua25vd24gTWVzc2FnZVNldCBleHRlbnNpb25zIGFzIGdyb3Vwcy4KLSAgICByZXR1cm4gU2tpcE1lc3NhZ2VTZXRGaWVsZCgKLSAgICAgICAgaW5wdXQsIGZpZWxkX251bWJlciwgbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKSk7Ci0gIH0gZWxzZSBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgfHwKLSAgICAgICAgICAgICBmaWVsZC0+dHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7Ci0gICAgLy8gVGhpcyBzaG91bGRuJ3QgaGFwcGVuIGFzIHdlIG9ubHkgYWxsb3cgb3B0aW9uYWwgbWVzc2FnZSBleHRlbnNpb25zIHRvCi0gICAgLy8gTWVzc2FnZVNldC4KLSAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0cyBtdXN0IGJlIG9wdGlvbmFsIG1lc3NhZ2VzLiI7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9IGVsc2UgewotICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlID0gbWVzc2FnZV9yZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKLSAgICAgICAgbWVzc2FnZSwgZmllbGQsIGlucHV0LT5HZXRFeHRlbnNpb25GYWN0b3J5KCkpOwotICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2UoaW5wdXQsIHN1Yl9tZXNzYWdlKTsKLSAgfQotfQotCi1zdGF0aWMgYm9vbCBTdHJpY3RVdGY4Q2hlY2soY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICByZXR1cm4gZmllbGQtPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Ci19Ci0KLWJvb2wgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZUZpZWxkKAotICAgIHVpbnQzMiB0YWcsCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgICAgICAgIC8vIE1heSBiZSBOVUxMIGZvciB1bmtub3duCi0gICAgTWVzc2FnZSogbWVzc2FnZSwKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIGVudW0geyBVTktOT1dOLCBOT1JNQUxfRk9STUFULCBQQUNLRURfRk9STUFUIH0gdmFsdWVfZm9ybWF0OwotCi0gIGlmIChmaWVsZCA9PSBOVUxMKSB7Ci0gICAgdmFsdWVfZm9ybWF0ID0gVU5LTk9XTjsKLSAgfSBlbHNlIGlmIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgIFdpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpKSB7Ci0gICAgdmFsdWVfZm9ybWF0ID0gTk9STUFMX0ZPUk1BVDsKLSAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcGFja2FibGUoKSAmJgotICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICB2YWx1ZV9mb3JtYXQgPSBQQUNLRURfRk9STUFUOwotICB9IGVsc2UgewotICAgIC8vIFdlIGRvbid0IHJlY29nbml6ZSB0aGlzIGZpZWxkLiBFaXRoZXIgdGhlIGZpZWxkIG51bWJlciBpcyB1bmtub3duCi0gICAgLy8gb3IgdGhlIHdpcmUgdHlwZSBkb2Vzbid0IG1hdGNoLiBQdXQgaXQgaW4gb3VyIHVua25vd24gZmllbGQgc2V0LgotICAgIHZhbHVlX2Zvcm1hdCA9IFVOS05PV047Ci0gIH0KLQotICBpZiAodmFsdWVfZm9ybWF0ID09IFVOS05PV04pIHsKLSAgICByZXR1cm4gU2tpcEZpZWxkKGlucHV0LCB0YWcsCi0gICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpKTsKLSAgfSBlbHNlIGlmICh2YWx1ZV9mb3JtYXQgPT0gUEFDS0VEX0ZPUk1BVCkgewotICAgIHVpbnQzMiBsZW5ndGg7Ci0gICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gaW5wdXQtPlB1c2hMaW1pdChsZW5ndGgpOwotCi0gICAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7Ci0jZGVmaW5lIEhBTkRMRV9QQUNLRURfVFlQRShUWVBFLCBDUFBUWVBFLCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgQ1BQVFlQRSB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICBDUFBUWVBFLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV8jI1RZUEU+KGlucHV0LCAmdmFsdWUpKSAgICAgICAgICBcCi0gICAgICAgICAgICByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkIyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOyAgICAgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfQotCi0gICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoIElOVDMyLCAgaW50MzIsICBJbnQzMikKLSAgICAgIEhBTkRMRV9QQUNLRURfVFlQRSggSU5UNjQsICBpbnQ2NCwgIEludDY0KQotICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNJTlQzMiwgIGludDMyLCAgSW50MzIpCi0gICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoU0lOVDY0LCAgaW50NjQsICBJbnQ2NCkKLSAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShVSU5UMzIsIHVpbnQzMiwgVUludDMyKQotICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFVJTlQ2NCwgdWludDY0LCBVSW50NjQpCi0KLSAgICAgIEhBTkRMRV9QQUNLRURfVFlQRSggRklYRUQzMiwgdWludDMyLCBVSW50MzIpCi0gICAgICBIQU5ETEVfUEFDS0VEX1RZUEUoIEZJWEVENjQsIHVpbnQ2NCwgVUludDY0KQotICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKFNGSVhFRDMyLCAgaW50MzIsICBJbnQzMikKLSAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShTRklYRUQ2NCwgIGludDY0LCAgSW50NjQpCi0KLSAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShGTE9BVCAsIGZsb2F0ICwgRmxvYXQgKQotICAgICAgSEFORExFX1BBQ0tFRF9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCi0KLSAgICAgIEhBTkRMRV9QQUNLRURfVFlQRShCT09MLCBib29sLCBCb29sKQotI3VuZGVmIEhBTkRMRV9QQUNLRURfVFlQRQotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiB7Ci0gICAgICAgIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgaW50IHZhbHVlOwotICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgaWYgKG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZmlsZSgpLT5zeW50YXgoKSA9PQotICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgewotICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9Ci0gICAgICAgICAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7Ci0gICAgICAgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7Ci0gICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBmaWVsZCwgZW51bV92YWx1ZSk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAvLyBUaGUgZW51bSB2YWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBrbm93biB2YWx1ZXMuICBBZGQgaXQgdG8gdGhlCi0gICAgICAgICAgICAgIC8vIFVua25vd25GaWVsZFNldC4KLSAgICAgICAgICAgICAgaW50NjQgc2lnbl9leHRlbmRlZF92YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0Pih2YWx1ZSk7Ci0gICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSkKLSAgICAgICAgICAgICAgICAgIC0+QWRkVmFyaW50KAotICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAotICAgICAgICAgICAgICAgICAgICAgIHNpZ25fZXh0ZW5kZWRfdmFsdWUpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkc6Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDoKLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6Ci0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzoKLSAgICAgICAgLy8gQ2FuJ3QgaGF2ZSBwYWNrZWQgZmllbGRzIG9mIHRoZXNlIHR5cGVzOiB0aGVzZSBzaG91bGQgYmUgY2F1Z2h0IGJ5Ci0gICAgICAgIC8vIHRoZSBwcm90b2NvbCBjb21waWxlci4KLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICB9Ci0KLSAgICBpbnB1dC0+UG9wTGltaXQobGltaXQpOwotICB9IGVsc2UgewotICAgIC8vIE5vbi1wYWNrZWQgdmFsdWUgKHZhbHVlX2Zvcm1hdCA9PSBOT1JNQUxfRk9STUFUKQotICAgIHN3aXRjaCAoZmllbGQtPnR5cGUoKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShUWVBFLCBDUFBUWVBFLCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDUFBUWVBFIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIENQUFRZUEUsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVFlQRT4oaW5wdXQsICZ2YWx1ZSkpICAgICAgICAgXAotICAgICAgICAgIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkIyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOyAgICAgXAotICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+U2V0IyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOyAgICAgXAotICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfQotCi0gICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMiwgIEludDMyKQotICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQsICBJbnQ2NCkKLSAgICAgIEhBTkRMRV9UWVBFKFNJTlQzMiwgIGludDMyLCAgSW50MzIpCi0gICAgICBIQU5ETEVfVFlQRShTSU5UNjQsICBpbnQ2NCwgIEludDY0KQotICAgICAgSEFORExFX1RZUEUoVUlOVDMyLCB1aW50MzIsIFVJbnQzMikKLSAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0LCBVSW50NjQpCi0KLSAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDMyLCB1aW50MzIsIFVJbnQzMikKLSAgICAgIEhBTkRMRV9UWVBFKCBGSVhFRDY0LCB1aW50NjQsIFVJbnQ2NCkKLSAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDMyLCAgaW50MzIsICBJbnQzMikKLSAgICAgIEhBTkRMRV9UWVBFKFNGSVhFRDY0LCAgaW50NjQsICBJbnQ2NCkKLQotICAgICAgSEFORExFX1RZUEUoRkxPQVQgLCBmbG9hdCAsIEZsb2F0ICkKLSAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpCi0KLSAgICAgIEhBTkRMRV9UWVBFKEJPT0wsIGJvb2wsIEJvb2wpCi0jdW5kZWYgSEFORExFX1RZUEUKLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTTogewotICAgICAgICBpbnQgdmFsdWU7Ci0gICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBpZiAobWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5maWxlKCktPnN5bnRheCgpID09Ci0gICAgICAgICAgICBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgewotICAgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9Ci0gICAgICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICAgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgZmllbGQsIGVudW1fdmFsdWUpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBlbnVtX3ZhbHVlKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgLy8gVGhlIGVudW0gdmFsdWUgaXMgbm90IG9uZSBvZiB0aGUga25vd24gdmFsdWVzLiAgQWRkIGl0IHRvIHRoZQotICAgICAgICAgICAgLy8gVW5rbm93bkZpZWxkU2V0LgotICAgICAgICAgICAgaW50NjQgc2lnbl9leHRlbmRlZF92YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0Pih2YWx1ZSk7Ci0gICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkFkZFZhcmludCgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduX2V4dGVuZGVkX3ZhbHVlKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIC8vIEhhbmRsZSBzdHJpbmdzIHNlcGFyYXRlbHkgc28gdGhhdCB3ZSBjYW4gb3B0aW1pemUgdGhlIGN0eXBlPUNPUkQgY2FzZS4KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzogewotICAgICAgICBib29sIHN0cmljdF91dGY4X2NoZWNrID0gU3RyaWN0VXRmOENoZWNrKGZpZWxkKTsKLSAgICAgICAgc3RyaW5nIHZhbHVlOwotICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGlmIChzdHJpY3RfdXRmOF9jaGVjaykgewotICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCi0gICAgICAgICAgICAgICAgICB2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsCi0gICAgICAgICAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCkuY19zdHIoKSkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgVmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQodmFsdWUuZGF0YSgpLCB2YWx1ZS5sZW5ndGgoKSwgUEFSU0UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6IHsKLSAgICAgICAgc3RyaW5nIHZhbHVlOwotICAgICAgICBpZiAoIVdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRTdHJpbmcobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUDogewotICAgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKLSAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZE1lc3NhZ2UoCi0gICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UoCi0gICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRHcm91cChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LCBzdWJfbWVzc2FnZSkpCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogewotICAgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZTsKLSAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkFkZE1lc3NhZ2UoCi0gICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UoCi0gICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbnB1dC0+R2V0RXh0ZW5zaW9uRmFjdG9yeSgpKTsKLSAgICAgICAgfQotCi0gICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlKGlucHV0LCBzdWJfbWVzc2FnZSkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWJvb2wgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRJdGVtKAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICBNZXNzYWdlKiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICAvLyBUaGlzIG1ldGhvZCBwYXJzZXMgYSBncm91cCB3aGljaCBzaG91bGQgY29udGFpbiB0d28gZmllbGRzOgotICAvLyAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOwotICAvLyAgIHJlcXVpcmVkIGRhdGEgbWVzc2FnZSA9IDM7Ci0KLSAgdWludDMyIGxhc3RfdHlwZV9pZCA9IDA7Ci0KLSAgLy8gT25jZSB3ZSBzZWUgYSB0eXBlX2lkLCB3ZSdsbCBsb29rIHVwIHRoZSBGaWVsZERlc2NyaXB0b3IgZm9yIHRoZQotICAvLyBleHRlbnNpb24uCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBOVUxMOwotCi0gIC8vIElmIHdlIHNlZSBtZXNzYWdlIGRhdGEgYmVmb3JlIHRoZSB0eXBlX2lkLCB3ZSdsbCBhcHBlbmQgaXQgdG8gdGhpcyBzbwotICAvLyB3ZSBjYW4gcGFyc2UgaXQgbGF0ZXIuCi0gIHN0cmluZyBtZXNzYWdlX2RhdGE7Ci0KLSAgd2hpbGUgKHRydWUpIHsKLSAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKLSAgICBpZiAodGFnID09IDApIHJldHVybiBmYWxzZTsKLQotICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZzogewotICAgICAgICB1aW50MzIgdHlwZV9pZDsKLSAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0eXBlX2lkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBsYXN0X3R5cGVfaWQgPSB0eXBlX2lkOwotICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIodHlwZV9pZCk7Ci0KLSAgICAgICAgaWYgKCFtZXNzYWdlX2RhdGEuZW1wdHkoKSkgewotICAgICAgICAgIC8vIFdlIHNhdyBzb21lIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQuICBIYXZlIHRvIHBhcnNlIGl0Ci0gICAgICAgICAgLy8gbm93LgotICAgICAgICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChtZXNzYWdlX2RhdGEuZGF0YSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2RhdGEuc2l6ZSgpKTsKLSAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBzdWJfaW5wdXQoJnJhd19pbnB1dCk7Ci0gICAgICAgICAgaWYgKCFQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEZpZWxkKGxhc3RfdHlwZV9pZCwgZmllbGQsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdWJfaW5wdXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICAgIG1lc3NhZ2VfZGF0YS5jbGVhcigpOwotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZzogewotICAgICAgICBpZiAobGFzdF90eXBlX2lkID09IDApIHsKLSAgICAgICAgICAvLyBXZSBoYXZlbid0IHNlZW4gYSB0eXBlX2lkIHlldC4gIEFwcGVuZCB0aGlzIGRhdGEgdG8gbWVzc2FnZV9kYXRhLgotICAgICAgICAgIHN0cmluZyB0ZW1wOwotICAgICAgICAgIHVpbnQzMiBsZW5ndGg7Ci0gICAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFN0cmluZygmdGVtcCwgbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmbWVzc2FnZV9kYXRhKTsKLSAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKLSAgICAgICAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMihsZW5ndGgpOwotICAgICAgICAgIGNvZGVkX291dHB1dC5Xcml0ZVN0cmluZyh0ZW1wKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBBbHJlYWR5IHNhdyB0eXBlX2lkLCBzbyB3ZSBjYW4gcGFyc2UgdGhpcyBkaXJlY3RseS4KLSAgICAgICAgICBpZiAoIVBhcnNlQW5kTWVyZ2VNZXNzYWdlU2V0RmllbGQobGFzdF90eXBlX2lkLCBmaWVsZCwgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZzogewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgICBpZiAoIVNraXBGaWVsZChpbnB1dCwgdGFnLCBOVUxMKSkgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgaW50IHNpemUsIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKLSAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0gIGludCBleHBlY3RlZF9lbmRwb2ludCA9IG91dHB1dC0+Qnl0ZUNvdW50KCkgKyBzaXplOwotCi0gIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7Ci0gIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TGlzdEZpZWxkcyhtZXNzYWdlLCAmZmllbGRzKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcyhmaWVsZHNbaV0sIG1lc3NhZ2UsIG91dHB1dCk7Ci0gIH0KLQotICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKLSAgICBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKAotICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSksIG91dHB1dCk7Ci0gIH0gZWxzZSB7Ci0gICAgU2VyaWFsaXplVW5rbm93bkZpZWxkcygKLSAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLCBvdXRwdXQpOwotICB9Ci0KLSAgR09PR0xFX0NIRUNLX0VRKG91dHB1dC0+Qnl0ZUNvdW50KCksIGV4cGVjdGVkX2VuZHBvaW50KQotICAgIDw8ICI6IFByb3RvY29sIG1lc3NhZ2Ugc2VyaWFsaXplZCB0byBhIHNpemUgZGlmZmVyZW50IGZyb20gd2hhdCB3YXMgIgotICAgICAgICJvcmlnaW5hbGx5IGV4cGVjdGVkLiAgUGVyaGFwcyBpdCB3YXMgbW9kaWZpZWQgYnkgYW5vdGhlciB0aHJlYWQgIgotICAgICAgICJkdXJpbmcgc2VyaWFsaXphdGlvbj8iOwotfQotCi12b2lkIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLQotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpICYmCi0gICAgICBmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCi0gICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgotICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoZmllbGQsIG1lc3NhZ2UsIG91dHB1dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaW50IGNvdW50ID0gMDsKLQotICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICBjb3VudCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKLSAgfSBlbHNlIGlmIChtZXNzYWdlX3JlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgewotICAgIGNvdW50ID0gMTsKLSAgfQotCi0gIGNvbnN0IGJvb2wgaXNfcGFja2VkID0gZmllbGQtPmlzX3BhY2tlZCgpOwotICBpZiAoaXNfcGFja2VkICYmIGNvdW50ID4gMCkgewotICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZyhmaWVsZC0+bnVtYmVyKCksCi0gICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOwotICAgIGNvbnN0IGludCBkYXRhX3NpemUgPSBGaWVsZERhdGFPbmx5Qnl0ZVNpemUoZmllbGQsIG1lc3NhZ2UpOwotICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihkYXRhX3NpemUpOwotICB9Ci0KLSAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7Ci0jZGVmaW5lIEhBTkRMRV9QUklNSVRJVkVfVFlQRShUWVBFLCBDUFBUWVBFLCBUWVBFX01FVEhPRCwgQ1BQVFlQRV9NRVRIT0QpICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgY29uc3QgQ1BQVFlQRSB2YWx1ZSA9IGZpZWxkLT5pc19yZXBlYXRlZCgpID8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkIyNDUFBUWVBFX01FVEhPRCggXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaikgOiAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0IyNDUFBUWVBFX01FVEhPRCggICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBpZiAoaXNfcGFja2VkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGUjI1RZUEVfTUVUSE9EIyNOb1RhZyh2YWx1ZSwgb3V0cHV0KTsgICAgICAgICAgICBcCi0gICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjVFlQRV9NRVRIT0QoZmllbGQtPm51bWJlcigpLCB2YWx1ZSwgb3V0cHV0KTsgIFwKLSAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgfQotCi0gICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoIElOVDMyLCAgaW50MzIsICBJbnQzMiwgIEludDMyKQotICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKCBJTlQ2NCwgIGludDY0LCAgSW50NjQsICBJbnQ2NCkKLSAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShTSU5UMzIsICBpbnQzMiwgU0ludDMyLCAgSW50MzIpCi0gICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0lOVDY0LCAgaW50NjQsIFNJbnQ2NCwgIEludDY0KQotICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKFVJTlQzMiwgdWludDMyLCBVSW50MzIsIFVJbnQzMikKLSAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShVSU5UNjQsIHVpbnQ2NCwgVUludDY0LCBVSW50NjQpCi0KLSAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRSggRklYRUQzMiwgdWludDMyLCAgRml4ZWQzMiwgVUludDMyKQotICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKCBGSVhFRDY0LCB1aW50NjQsICBGaXhlZDY0LCBVSW50NjQpCi0gICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoU0ZJWEVEMzIsICBpbnQzMiwgU0ZpeGVkMzIsICBJbnQzMikKLSAgICAgIEhBTkRMRV9QUklNSVRJVkVfVFlQRShTRklYRUQ2NCwgIGludDY0LCBTRml4ZWQ2NCwgIEludDY0KQotCi0gICAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRkxPQVQgLCBmbG9hdCAsIEZsb2F0ICwgRmxvYXQgKQotICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUsIERvdWJsZSkKLQotICAgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEJPT0wsIGJvb2wsIEJvb2wsIEJvb2wpCi0jdW5kZWYgSEFORExFX1BSSU1JVElWRV9UWVBFCi0KLSNkZWZpbmUgSEFORExFX1RZUEUoVFlQRSwgVFlQRV9NRVRIT0QsIENQUFRZUEVfTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZSMjVFlQRV9NRVRIT0QoICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjQ1BQVFlQRV9NRVRIT0QoICAgICAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBqKSA6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0IyNDUFBUWVBFX01FVEhPRChtZXNzYWdlLCBmaWVsZCksICAgICBcCi0gICAgICAgICAgICAgIG91dHB1dCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgYnJlYWs7Ci0KLSAgICAgIEhBTkRMRV9UWVBFKEdST1VQICAsIEdyb3VwICAsIE1lc3NhZ2UpCi0gICAgICBIQU5ETEVfVFlQRShNRVNTQUdFLCBNZXNzYWdlLCBNZXNzYWdlKQotI3VuZGVmIEhBTkRMRV9UWVBFCi0KLSAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06IHsKLSAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/Ci0gICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgZmllbGQsIGopIDoKLSAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgZmllbGQpOwotICAgICAgICBpZiAoaXNfcGFja2VkKSB7Ci0gICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnKHZhbHVlLT5udW1iZXIoKSwgb3V0cHV0KTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKGZpZWxkLT5udW1iZXIoKSwgdmFsdWUtPm51bWJlcigpLCBvdXRwdXQpOwotICAgICAgICB9Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotCi0gICAgICAvLyBIYW5kbGUgc3RyaW5ncyBzZXBhcmF0ZWx5IHNvIHRoYXQgd2UgY2FuIGdldCBzdHJpbmcgcmVmZXJlbmNlcwotICAgICAgLy8gaW5zdGVhZCBvZiBjb3B5aW5nLgotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOiB7Ci0gICAgICAgIGJvb2wgc3RyaWN0X3V0ZjhfY2hlY2sgPSBTdHJpY3RVdGY4Q2hlY2soZmllbGQpOwotICAgICAgICBzdHJpbmcgc2NyYXRjaDsKLSAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSA9IGZpZWxkLT5pc19yZXBlYXRlZCgpID8KLSAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAotICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGosICZzY3JhdGNoKSA6Ci0gICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgZmllbGQsICZzY3JhdGNoKTsKLSAgICAgICAgaWYgKHN0cmljdF91dGY4X2NoZWNrKSB7Ci0gICAgICAgICAgV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcodmFsdWUuZGF0YSgpLCB2YWx1ZS5sZW5ndGgoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6U0VSSUFMSVpFLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCh2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBTRVJJQUxJWkUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICAgICAgICB9Ci0gICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZyhmaWVsZC0+bnVtYmVyKCksIHZhbHVlLCBvdXRwdXQpOwotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6IHsKLSAgICAgICAgc3RyaW5nIHNjcmF0Y2g7Ci0gICAgICAgIGNvbnN0IHN0cmluZyYgdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKSA/Ci0gICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKLSAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBqLCAmc2NyYXRjaCkgOgotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0U3RyaW5nUmVmZXJlbmNlKG1lc3NhZ2UsIGZpZWxkLCAmc2NyYXRjaCk7Ci0gICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzKGZpZWxkLT5udW1iZXIoKSwgdmFsdWUsIG91dHB1dCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLSAgfQotfQotCi12b2lkIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLQotICAvLyBTdGFydCBncm91cC4KLSAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZyk7Ci0KLSAgLy8gV3JpdGUgdHlwZSBJRC4KLSAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZyk7Ci0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMihmaWVsZC0+bnVtYmVyKCkpOwotCi0gIC8vIFdyaXRlIG1lc3NhZ2UuCi0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnKTsKLQotICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBmaWVsZCk7Ci0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMihzdWJfbWVzc2FnZS5HZXRDYWNoZWRTaXplKCkpOwotICBzdWJfbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMob3V0cHV0KTsKLQotICAvLyBFbmQgZ3JvdXAuCi0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1pbnQgV2lyZUZvcm1hdDo6Qnl0ZVNpemUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgewotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotCi0gIGludCBvdXJfc2l6ZSA9IDA7Ci0KLSAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgbWVzc2FnZV9yZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UsICZmaWVsZHMpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotICAgIG91cl9zaXplICs9IEZpZWxkQnl0ZVNpemUoZmllbGRzW2ldLCBtZXNzYWdlKTsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIG91cl9zaXplICs9IENvbXB1dGVVbmtub3duTWVzc2FnZVNldEl0ZW1zU2l6ZSgKLSAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSk7Ci0gIH0gZWxzZSB7Ci0gICAgb3VyX3NpemUgKz0gQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKAotICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpKTsKLSAgfQotCi0gIHJldHVybiBvdXJfc2l6ZTsKLX0KLQotaW50IFdpcmVGb3JtYXQ6OkZpZWxkQnl0ZVNpemUoCi0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7Ci0gIGNvbnN0IFJlZmxlY3Rpb24qIG1lc3NhZ2VfcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwotCi0gIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkgJiYKLSAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgJiYKLSAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFICYmCi0gICAgICAhZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICByZXR1cm4gTWVzc2FnZVNldEl0ZW1CeXRlU2l6ZShmaWVsZCwgbWVzc2FnZSk7Ci0gIH0KLQotICBpbnQgY291bnQgPSAwOwotICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICBjb3VudCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIGZpZWxkKTsKLSAgfSBlbHNlIGlmIChtZXNzYWdlX3JlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgewotICAgIGNvdW50ID0gMTsKLSAgfQotCi0gIGNvbnN0IGludCBkYXRhX3NpemUgPSBGaWVsZERhdGFPbmx5Qnl0ZVNpemUoZmllbGQsIG1lc3NhZ2UpOwotICBpbnQgb3VyX3NpemUgPSBkYXRhX3NpemU7Ci0gIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHsKLSAgICBpZiAoZGF0YV9zaXplID4gMCkgewotICAgICAgLy8gUGFja2VkIGZpZWxkcyBnZXQgc2VyaWFsaXplZCBsaWtlIGEgc3RyaW5nLCBub3QgdGhlaXIgbmF0aXZlIHR5cGUuCi0gICAgICAvLyBUZWNobmljYWxseSB0aGlzIGRvZXNuJ3QgcmVhbGx5IG1hdHRlcjsgdGhlIHNpemUgb25seSBjaGFuZ2VzIGlmIGl0J3MKLSAgICAgIC8vIGEgR1JPVVAKLSAgICAgIG91cl9zaXplICs9IFRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKTsKLSAgICAgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGRhdGFfc2l6ZSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIG91cl9zaXplICs9IGNvdW50ICogVGFnU2l6ZShmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpOwotICB9Ci0gIHJldHVybiBvdXJfc2l6ZTsKLX0KLQotaW50IFdpcmVGb3JtYXQ6OkZpZWxkRGF0YU9ubHlCeXRlU2l6ZSgKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKLSAgY29uc3QgUmVmbGVjdGlvbiogbWVzc2FnZV9yZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7Ci0KLSAgaW50IGNvdW50ID0gMDsKLSAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgY291bnQgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7Ci0gIH0gZWxzZSBpZiAobWVzc2FnZV9yZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsKLSAgICBjb3VudCA9IDE7Ci0gIH0KLQotICBpbnQgZGF0YV9zaXplID0gMDsKLSAgc3dpdGNoIChmaWVsZC0+dHlwZSgpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFRZUEUsIFRZUEVfTUVUSE9ELCBDUFBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICBcCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfIyNUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgY291bnQ7IGorKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZGF0YV9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FVEhPRCMjU2l6ZSggICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkIyNDUFBUWVBFX01FVEhPRCggICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBqKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGRhdGFfc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVRIT0QjI1NpemUoICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXQjI0NQUFRZUEVfTUVUSE9EKG1lc3NhZ2UsIGZpZWxkKSk7ICAgICAgICBcCi0gICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICBicmVhazsKLQotI2RlZmluZSBIQU5ETEVfRklYRURfVFlQRShUWVBFLCBUWVBFX01FVEhPRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFXyMjVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgZGF0YV9zaXplICs9IGNvdW50ICogV2lyZUZvcm1hdExpdGU6OmsjI1RZUEVfTUVUSE9EIyNTaXplOyAgICAgICAgICAgXAotICAgICAgYnJlYWs7Ci0KLSAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBJbnQzMiwgIEludDMyKQotICAgIEhBTkRMRV9UWVBFKCBJTlQ2NCwgIEludDY0LCAgSW50NjQpCi0gICAgSEFORExFX1RZUEUoU0lOVDMyLCBTSW50MzIsICBJbnQzMikKLSAgICBIQU5ETEVfVFlQRShTSU5UNjQsIFNJbnQ2NCwgIEludDY0KQotICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgVUludDMyLCBVSW50MzIpCi0gICAgSEFORExFX1RZUEUoVUlOVDY0LCBVSW50NjQsIFVJbnQ2NCkKLQotICAgIEhBTkRMRV9GSVhFRF9UWVBFKCBGSVhFRDMyLCAgRml4ZWQzMikKLSAgICBIQU5ETEVfRklYRURfVFlQRSggRklYRUQ2NCwgIEZpeGVkNjQpCi0gICAgSEFORExFX0ZJWEVEX1RZUEUoU0ZJWEVEMzIsIFNGaXhlZDMyKQotICAgIEhBTkRMRV9GSVhFRF9UWVBFKFNGSVhFRDY0LCBTRml4ZWQ2NCkKLQotICAgIEhBTkRMRV9GSVhFRF9UWVBFKEZMT0FUICwgRmxvYXQgKQotICAgIEhBTkRMRV9GSVhFRF9UWVBFKERPVUJMRSwgRG91YmxlKQotCi0gICAgSEFORExFX0ZJWEVEX1RZUEUoQk9PTCwgQm9vbCkKLQotICAgIEhBTkRMRV9UWVBFKEdST1VQICAsIEdyb3VwICAsIE1lc3NhZ2UpCi0gICAgSEFORExFX1RZUEUoTUVTU0FHRSwgTWVzc2FnZSwgTWVzc2FnZSkKLSN1bmRlZiBIQU5ETEVfVFlQRQotI3VuZGVmIEhBTkRMRV9GSVhFRF9UWVBFCi0KLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNOiB7Ci0gICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgICAgZGF0YV9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpFbnVtU2l6ZSgKLSAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBqKS0+bnVtYmVyKCkpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OkVudW1TaXplKAotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBmaWVsZCktPm51bWJlcigpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIC8vIEhhbmRsZSBzdHJpbmdzIHNlcGFyYXRlbHkgc28gdGhhdCB3ZSBjYW4gZ2V0IHN0cmluZyByZWZlcmVuY2VzCi0gICAgLy8gaW5zdGVhZCBvZiBjb3B5aW5nLgotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORzoKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUzogewotICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7Ci0gICAgICAgIHN0cmluZyBzY3JhdGNoOwotICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPwotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCi0gICAgICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaiwgJnNjcmF0Y2gpIDoKLSAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOwotICAgICAgICBkYXRhX3NpemUgKz0gV2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUodmFsdWUpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0gIHJldHVybiBkYXRhX3NpemU7Ci19Ci0KLWludCBXaXJlRm9ybWF0OjpNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgewotICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKLQotICBpbnQgb3VyX3NpemUgPSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7Ci0KLSAgLy8gdHlwZV9pZAotICBvdXJfc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihmaWVsZC0+bnVtYmVyKCkpOwotCi0gIC8vIG1lc3NhZ2UKLSAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOwotICBpbnQgbWVzc2FnZV9zaXplID0gc3ViX21lc3NhZ2UuQnl0ZVNpemUoKTsKLQotICBvdXJfc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihtZXNzYWdlX3NpemUpOwotICBvdXJfc2l6ZSArPSBtZXNzYWdlX3NpemU7Ci0KLSAgcmV0dXJuIG91cl9zaXplOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5NDFiZTc1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaAorKysgL2Rldi9udWxsCkBAIC0xLDMzNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gICAgICAgICBhdGVuYXNpb0Bnb29nbGUuY29tIChDaHJpcyBBdGVuYXNpbykgKFppZ1phZyB0cmFuc2Zvcm0pCi0vLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKLS8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KLS8vCi0vLyBUaGlzIGhlYWRlciBpcyBsb2dpY2FsbHkgaW50ZXJuYWwsIGJ1dCBpcyBtYWRlIHB1YmxpYyBiZWNhdXNlIGl0IGlzIHVzZWQKLS8vIGZyb20gcHJvdG9jb2wtY29tcGlsZXItZ2VuZXJhdGVkIGNvZGUsIHdoaWNoIG1heSByZXNpZGUgaW4gb3RoZXIgY29tcG9uZW50cy4KLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9IX18KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KLQotLy8gRG8gVVRGLTggdmFsaWRhdGlvbiBvbiBzdHJpbmcgdHlwZSBpbiBEZWJ1ZyBidWlsZCBvbmx5Ci0jaWZuZGVmIE5ERUJVRwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKLSNlbmRpZgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsgICAgICAvLyBjb2RlZF9zdHJlYW0uaAotICAgIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOyAgICAgLy8gY29kZWRfc3RyZWFtLmgKLSAgfQotICBjbGFzcyBVbmtub3duRmllbGRTZXQ7ICAgICAgICAgLy8gdW5rbm93bl9maWVsZF9zZXQuaAotfQotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gVGhpcyBjbGFzcyBpcyBmb3IgaW50ZXJuYWwgdXNlIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgbGlicmFyeSBhbmQgYnkKLS8vIHByb3RvY29sLWNvbXBsaWVyLWdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMuICBJdCBtdXN0IG5vdCBiZSBjYWxsZWQKLS8vIGRpcmVjdGx5IGJ5IGNsaWVudHMuCi0vLwotLy8gVGhpcyBjbGFzcyBjb250YWlucyBjb2RlIGZvciBpbXBsZW1lbnRpbmcgdGhlIGJpbmFyeSBwcm90b2NvbCBidWZmZXIKLS8vIHdpcmUgZm9ybWF0IHZpYSByZWZsZWN0aW9uLiAgVGhlIFdpcmVGb3JtYXRMaXRlIGNsYXNzIGltcGxlbWVudHMgdGhlCi0vLyBub24tcmVmbGVjdGlvbiBiYXNlZCByb3V0aW5lcy4KLS8vCi0vLyBUaGlzIGNsYXNzIGlzIHJlYWxseSBhIG5hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIG9ubHkgc3RhdGljIG1ldGhvZHMKLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBXaXJlRm9ybWF0IHsKLSBwdWJsaWM6Ci0KLSAgLy8gR2l2ZW4gYSBmaWVsZCByZXR1cm4gaXRzIFdpcmVUeXBlCi0gIHN0YXRpYyBpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVUeXBlRm9yRmllbGQoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKLQotICAvLyBHaXZlbiBhIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSByZXR1cm4gaXRzIFdpcmVUeXBlCi0gIHN0YXRpYyBpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVUeXBlRm9yRmllbGRUeXBlKAotICAgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpOwotCi0gIC8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiBhIHRhZy4gIEZvciBncm91cHMsIHRoaXMgaW5jbHVkZXMgYm90aCB0aGUgc3RhcnQKLSAgLy8gYW5kIGVuZCB0YWdzLgotICBzdGF0aWMgaW5saW5lIGludCBUYWdTaXplKGludCBmaWVsZF9udW1iZXIsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKTsKLQotICAvLyBUaGVzZSBwcm9jZWR1cmVzIGNhbiBiZSB1c2VkIHRvIGltcGxlbWVudCB0aGUgbWV0aG9kcyBvZiBNZXNzYWdlIHdoaWNoCi0gIC8vIGhhbmRsZSBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uIG9mIHRoZSBwcm90b2NvbCBidWZmZXIgd2lyZSBmb3JtYXQKLSAgLy8gdXNpbmcgb25seSB0aGUgUmVmbGVjdGlvbiBpbnRlcmZhY2UuICBXaGVuIHlvdSBhc2sgdGhlIHByb3RvY29sCi0gIC8vIGNvbXBpbGVyIHRvIG9wdGltaXplIGZvciBjb2RlIHNpemUgcmF0aGVyIHRoYW4gc3BlZWQsIGl0IHdpbGwgaW1wbGVtZW50Ci0gIC8vIHRob3NlIG1ldGhvZHMgaW4gdGVybXMgb2YgdGhlc2UgcHJvY2VkdXJlcy4gIE9mIGNvdXJzZSwgdGhlc2UgYXJlIG11Y2gKLSAgLy8gc2xvd2VyIHRoYW4gdGhlIHNwZWNpYWxpemVkIGltcGxlbWVudGF0aW9ucyB3aGljaCB0aGUgcHJvdG9jb2wgY29tcGlsZXIKLSAgLy8gZ2VuZXJhdGVzIHdoZW4gdG9sZCB0byBvcHRpbWl6ZSBmb3Igc3BlZWQuCi0KLSAgLy8gUmVhZCBhIG1lc3NhZ2UgaW4gcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LgotICAvLwotICAvLyBUaGlzIHByb2NlZHVyZSByZWFkcyBlaXRoZXIgdG8gdGhlIGVuZCBvZiB0aGUgaW5wdXQgc3RyZWFtIG9yIHRocm91Z2gKLSAgLy8gYSBXSVJFVFlQRV9FTkRfR1JPVVAgdGFnIGVuZGluZyB0aGUgbWVzc2FnZSwgd2hpY2hldmVyIGNvbWVzIGZpcnN0LgotICAvLyBJdCByZXR1cm5zIGZhbHNlIGlmIHRoZSBpbnB1dCBpcyBpbnZhbGlkLgotICAvLwotICAvLyBSZXF1aXJlZCBmaWVsZHMgYXJlIE5PVCBjaGVja2VkIGJ5IHRoaXMgbWV0aG9kLiAgWW91IG11c3QgY2FsbAotICAvLyBJc0luaXRpYWxpemVkKCkgb24gdGhlIHJlc3VsdGluZyBtZXNzYWdlIHlvdXJzZWxmLgotICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlUGFydGlhbChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UpOwotCi0gIC8vIFNlcmlhbGl6ZSBhIG1lc3NhZ2UgaW4gcHJvdG9jb2wgYnVmZmVyIHdpcmUgZm9ybWF0LgotICAvLwotICAvLyBBbnkgZW1iZWRkZWQgbWVzc2FnZXMgd2l0aGluIHRoZSBtZXNzYWdlIG11c3QgaGF2ZSB0aGVpciBjb3JyZWN0IHNpemVzCi0gIC8vIGNhY2hlZC4gIEhvd2V2ZXIsIHRoZSB0b3AtbGV2ZWwgbWVzc2FnZSBuZWVkIG5vdDsgaXRzIHNpemUgaXMgcGFzc2VkIGFzCi0gIC8vIGEgcGFyYW1ldGVyIHRvIHRoaXMgcHJvY2VkdXJlLgotICAvLwotICAvLyBUaGVzZSByZXR1cm4gZmFsc2UgaWZmIHRoZSB1bmRlcmx5aW5nIHN0cmVhbSByZXR1cm5zIGEgd3JpdGUgZXJyb3IuCi0gIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCi0gICAgICBpbnQgc2l6ZSwgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotCi0gIC8vIEltcGxlbWVudHMgTWVzc2FnZTo6Qnl0ZVNpemUoKSB2aWEgcmVmbGVjdGlvbi4gIFdBUk5JTkc6ICBUaGUgcmVzdWx0Ci0gIC8vIG9mIHRoaXMgbWV0aG9kIGlzICpub3QqIGNhY2hlZCBhbnl3aGVyZS4gIEhvd2V2ZXIsIGFsbCBlbWJlZGRlZCBtZXNzYWdlcwotICAvLyB3aWxsIGhhdmUgdGhlaXIgQnl0ZVNpemUoKSBtZXRob2RzIGNhbGxlZCwgc28gdGhlaXIgc2l6ZXMgd2lsbCBiZSBjYWNoZWQuCi0gIC8vIFRoZXJlZm9yZSwgY2FsbGluZyB0aGlzIG1ldGhvZCBpcyBzdWZmaWNpZW50IHRvIGFsbG93IHlvdSB0byBjYWxsCi0gIC8vIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpIG9uIHRoZSBzYW1lIG9iamVjdC4KLSAgc3RhdGljIGludCBCeXRlU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBIZWxwZXJzIGZvciBkZWFsaW5nIHdpdGggdW5rbm93biBmaWVsZHMKLQotICAvLyBTa2lwcyBhIGZpZWxkIHZhbHVlIG9mIHRoZSBnaXZlbiBXaXJlVHlwZS4gIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQKLSAgLy8gcG9zaXRpb25lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLiAgSWYgdW5rbm93bl9maWVsZHMgaXMgbm9uLU5VTEwsCi0gIC8vIHRoZSBjb250ZW50cyBvZiB0aGUgZmllbGQgd2lsbCBiZSBhZGRlZCB0byBpdC4KLSAgc3RhdGljIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOwotCi0gIC8vIFJlYWRzIGFuZCBpZ25vcmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbnB1dC4gIElmIHVua25vd25fZmllbGRzIGlzIG5vbi1OVUxMLAotICAvLyB0aGUgY29udGVudHMgd2lsbCBiZSBhZGRlZCB0byBpdC4KLSAgc3RhdGljIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLQotICAvLyBSZWFkIGEgcGFja2VkIGVudW0gZmllbGQuIElmIHRoZSBpc192YWxpZCBmdW5jdGlvbiBpcyBub3QgTlVMTCwgdmFsdWVzIGZvcgotICAvLyB3aGljaCBpc192YWxpZCh2YWx1ZSkgcmV0dXJucyBmYWxzZSBhcmUgYXBwZW5kZWQgdG8gdW5rbm93bl9maWVsZHNfc3RyZWFtLgotICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRW51bVByZXNlcnZlVW5rbm93bnMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlcyk7Ci0KLSAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGFuIFVua25vd25GaWVsZFNldCB0byB0aGUgb3V0cHV0LgotICBzdGF0aWMgdm9pZCBTZXJpYWxpemVVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgotICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgotICAvLyBDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodW5rbm93bl9maWVsZHMpLgotICAvLwotICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KLSAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgICB1aW50OCogdGFyZ2V0KTsKLQotICAvLyBTYW1lIHRoaW5nIGV4Y2VwdCBmb3IgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdAotICAvLyBvcHRpb24uCi0gIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCi0gICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgotICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgotICAvLyBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMpLgotICAvLwotICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KLSAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKLSAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgICB1aW50OCogdGFyZ2V0KTsKLQotICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBVbmtub3duRmllbGRTZXQgb24gdGhlIHdpcmUuCi0gIHN0YXRpYyBpbnQgQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpOwotCi0gIC8vIFNhbWUgdGhpbmcgZXhjZXB0IGZvciBtZXNzYWdlcyB0aGF0IGhhdmUgdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0Ci0gIC8vIG9wdGlvbi4KLSAgc3RhdGljIGludCBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCi0gICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKLQotCi0gIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyB0YWdzLiAgKElubGluZWQgYmVsb3cgYW5kIGluCi0gIC8vIF9pbmwuaCkKLSAgLy8KLSAgLy8gVGhpcyBpcyBkaWZmZXJlbnQgZnJvbSBNYWtlVGFnKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkgaW4gdGhlIGNhc2UKLSAgLy8gb2YgcGFja2VkIHJlcGVhdGVkIGZpZWxkcy4KLSAgc3RhdGljIHVpbnQzMiBNYWtlVGFnKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwotCi0gIC8vIFBhcnNlIGEgc2luZ2xlIGZpZWxkLiAgVGhlIGlucHV0IHNob3VsZCBzdGFydCBvdXQgcG9zaXRpb25lZCBpbW1lZGlhdGVseQotICAvLyBhZnRlciB0aGUgdGFnLgotICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlRmllbGQoCi0gICAgICB1aW50MzIgdGFnLAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgICAgICAgIC8vIE1heSBiZSBOVUxMIGZvciB1bmtub3duCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLQotICAvLyBTZXJpYWxpemUgYSBzaW5nbGUgZmllbGQuCi0gIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgICAgICAgIC8vIENhbm5vdCBiZSBOVUxMCi0gICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotCi0gIC8vIENvbXB1dGUgc2l6ZSBvZiBhIHNpbmdsZSBmaWVsZC4gIElmIHRoZSBmaWVsZCBpcyBhIG1lc3NhZ2UgdHlwZSwgdGhpcwotICAvLyB3aWxsIGNhbGwgQnl0ZVNpemUoKSBmb3IgdGhlIGVtYmVkZGVkIG1lc3NhZ2UsIGluc3VyaW5nIHRoYXQgaXQgY2FjaGVzCi0gIC8vIGl0cyBzaXplLgotICBzdGF0aWMgaW50IEZpZWxkQnl0ZVNpemUoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgLy8gQ2Fubm90IGJlIE5VTEwKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotCi0gIC8vIFBhcnNlL3NlcmlhbGl6ZSBhIE1lc3NhZ2VTZXQ6Okl0ZW0gZ3JvdXAuICBVc2VkIHdpdGggbWVzc2FnZXMgdGhhdCB1c2UKLSAgLy8gb3Bpb24gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlLgotICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEl0ZW0oCi0gICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICBNZXNzYWdlKiBtZXNzYWdlKTsKLSAgc3RhdGljIHZvaWQgU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoCi0gICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKLSAgc3RhdGljIGludCBNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwotCi0gIC8vIENvbXB1dGVzIHRoZSBieXRlIHNpemUgb2YgYSBmaWVsZCwgZXhjbHVkaW5nIHRhZ3MuIEZvciBwYWNrZWQgZmllbGRzLCBpdAotICAvLyBvbmx5IGluY2x1ZGVzIHRoZSBzaXplIG9mIHRoZSByYXcgZGF0YSwgYW5kIG5vdCB0aGUgc2l6ZSBvZiB0aGUgdG90YWwKLSAgLy8gbGVuZ3RoLCBidXQgZm9yIG90aGVyIGxlbmd0aC1kZWxpbWl0ZWQgdHlwZXMsIHRoZSBzaXplIG9mIHRoZSBsZW5ndGggaXMKLSAgLy8gaW5jbHVkZWQuCi0gIHN0YXRpYyBpbnQgRmllbGREYXRhT25seUJ5dGVTaXplKAotICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgICAgICAgIC8vIENhbm5vdCBiZSBOVUxMCi0gICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKLQotICBlbnVtIE9wZXJhdGlvbiB7Ci0gICAgUEFSU0UgPSAwLAotICAgIFNFUklBTElaRSA9IDEsCi0gIH07Ci0KLSAgLy8gVmVyaWZpZXMgdGhhdCBhIHN0cmluZyBmaWVsZCBpcyB2YWxpZCBVVEY4LCBsb2dnaW5nIGFuIGVycm9yIGlmIG5vdC4KLSAgLy8gVGhpcyBmdW5jdGlvbiB3aWxsIG5vdCBiZSBjYWxsZWQgYnkgbmV3bHkgZ2VuZXJhdGVkIHByb3RvYnVmIGNvZGUKLSAgLy8gYnV0IHJlbWFpbnMgcHJlc2VudCB0byBzdXBwb3J0IGV4aXN0aW5nIGNvZGUuCi0gIHN0YXRpYyB2b2lkIFZlcmlmeVVURjhTdHJpbmcoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsIE9wZXJhdGlvbiBvcCk7Ci0gIC8vIFRoZSBOYW1lZEZpZWxkIHZhcmlhbnQgdGFrZXMgYSBmaWVsZCBuYW1lIGluIG9yZGVyIHRvIHByb2R1Y2UgYW4KLSAgLy8gaW5mb3JtYXRpdmUgZXJyb3IgbWVzc2FnZSBpZiB2ZXJpZmljYXRpb24gZmFpbHMuCi0gIHN0YXRpYyB2b2lkIFZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKGNvbnN0IGNoYXIqIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPcGVyYXRpb24gb3AsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpOwotCi0gcHJpdmF0ZToKLSAgLy8gU2tpcCBhIE1lc3NhZ2VTZXQgZmllbGQuCi0gIHN0YXRpYyBib29sIFNraXBNZXNzYWdlU2V0RmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7Ci0KLSAgLy8gUGFyc2UgYSBNZXNzYWdlU2V0IGZpZWxkLgotICBzdGF0aWMgYm9vbCBQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEZpZWxkKHVpbnQzMiBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFdpcmVGb3JtYXQpOwotfTsKLQotLy8gU3ViY2xhc3Mgb2YgRmllbGRTa2lwcGVyIHdoaWNoIHNhdmVzIHNraXBwZWQgZmllbGRzIHRvIGFuIFVua25vd25GaWVsZFNldC4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBVbmtub3duRmllbGRTZXRGaWVsZFNraXBwZXIgOiBwdWJsaWMgRmllbGRTa2lwcGVyIHsKLSBwdWJsaWM6Ci0gIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcihVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKQotICAgICAgOiB1bmtub3duX2ZpZWxkc18odW5rbm93bl9maWVsZHMpIHt9Ci0gIHZpcnR1YWwgflVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcigpIHt9Ci0KLSAgLy8gaW1wbGVtZW50cyBGaWVsZFNraXBwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdmlydHVhbCBib29sIFNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcpOwotICB2aXJ0dWFsIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdmlydHVhbCB2b2lkIFNraXBVbmtub3duRW51bShpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUpOwotCi0gcHJvdGVjdGVkOgotICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzXzsKLX07Ci0KLS8vIGlubGluZSBtZXRob2RzID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkKAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgaWYgKGZpZWxkLT5pc19wYWNrZWQoKSkgewotICAgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKLSAgfSBlbHNlIHsKLSAgICByZXR1cm4gV2lyZVR5cGVGb3JGaWVsZFR5cGUoZmllbGQtPnR5cGUoKSk7Ci0gIH0KLX0KLQotaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkVHlwZSgKLSAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgewotICAvLyBTb21lIGNvbXBpbGVycyBkb24ndCBsaWtlIGVudW0gLT4gZW51bSBjYXN0cywgc28gd2UgaW1wbGljaXRfY2FzdCB0bwotICAvLyBpbnQgZmlyc3QuCi0gIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGVGb3JGaWVsZFR5cGUoCi0gICAgICBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPigKLSAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KHR5cGUpKSk7Ci19Ci0KLWlubGluZSB1aW50MzIgV2lyZUZvcm1hdDo6TWFrZVRhZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIFdpcmVUeXBlRm9yRmllbGQoZmllbGQpKTsKLX0KLQotaW5saW5lIGludCBXaXJlRm9ybWF0OjpUYWdTaXplKGludCBmaWVsZF9udW1iZXIsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7Ci0gIC8vIFNvbWUgY29tcGlsZXJzIGRvbid0IGxpa2UgZW51bSAtPiBlbnVtIGNhc3RzLCBzbyB3ZSBpbXBsaWNpdF9jYXN0IHRvCi0gIC8vIGludCBmaXJzdC4KLSAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKGZpZWxkX251bWJlciwKLSAgICAgIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KAotICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4odHlwZSkpKTsKLX0KLQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSwKLSAgICBXaXJlRm9ybWF0OjpPcGVyYXRpb24gb3ApIHsKLSNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKLSAgV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCi0gICAgICBkYXRhLCBzaXplLCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6T3BlcmF0aW9uPihvcCksIE5VTEwpOwotI2Vsc2UKLSAgLy8gQXZvaWQgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW5zdWVkIHZhcmlhYmxlcy4KLSAgKHZvaWQpZGF0YTsgKHZvaWQpc2l6ZTsgKHZvaWQpb3A7Ci0jZW5kaWYKLX0KLQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCi0gICAgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsIFdpcmVGb3JtYXQ6Ok9wZXJhdGlvbiBvcCwKLSAgICBjb25zdCBjaGFyKiBmaWVsZF9uYW1lKSB7Ci0jaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECi0gIFdpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAotICAgICAgZGF0YSwgc2l6ZSwgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6Ok9wZXJhdGlvbj4ob3ApLCBmaWVsZF9uYW1lKTsKLSNlbmRpZgotfQotCi0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBmMjUxNzA3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYworKysgL2Rldi9udWxsCkBAIC0xLDU0MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KLQotI2luY2x1ZGUgPHN0YWNrPgotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1faW5sLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KLQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi0KLSNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAotLy8gT2xkIHZlcnNpb24gb2YgTVNWQyBkb2Vzbid0IGxpa2UgZGVmaW5pdGlvbnMgb2YgaW5saW5lIGNvbnN0YW50cywgR0NDCi0vLyByZXF1aXJlcyB0aGVtLgotY29uc3QgaW50IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZzsKLWNvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnOwotY29uc3QgaW50IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZzsKLWNvbnN0IGludCBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnOwotCi0jZW5kaWYKLQotLy8gSUJNIHhsQyByZXF1aXJlcyBwcmVmaXhpbmcgY29uc3RhbnRzIHdpdGggV2lyZUZvcm1hdExpdGU6OgotY29uc3QgaW50IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZSA9Ci0gIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPAotICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnPjo6dmFsdWUgKwotICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlN0YXRpY1ZhcmludFNpemUzMjwKLSAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWc+Ojp2YWx1ZSArCi0gIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPAotICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnPjo6dmFsdWUgKwotICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlN0YXRpY1ZhcmludFNpemUzMjwKLSAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VUYWc+Ojp2YWx1ZTsKLQotY29uc3QgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUKLVdpcmVGb3JtYXRMaXRlOjprRmllbGRUeXBlVG9DcHBUeXBlTWFwW01BWF9GSUVMRF9UWVBFICsgMV0gPSB7Ci0gIHN0YXRpY19jYXN0PENwcFR5cGU+KDApLCAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCi0KLSAgQ1BQVFlQRV9ET1VCTEUsICAgLy8gVFlQRV9ET1VCTEUKLSAgQ1BQVFlQRV9GTE9BVCwgICAgLy8gVFlQRV9GTE9BVAotICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX0lOVDY0Ci0gIENQUFRZUEVfVUlOVDY0LCAgIC8vIFRZUEVfVUlOVDY0Ci0gIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfSU5UMzIKLSAgQ1BQVFlQRV9VSU5UNjQsICAgLy8gVFlQRV9GSVhFRDY0Ci0gIENQUFRZUEVfVUlOVDMyLCAgIC8vIFRZUEVfRklYRUQzMgotICBDUFBUWVBFX0JPT0wsICAgICAvLyBUWVBFX0JPT0wKLSAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9TVFJJTkcKLSAgQ1BQVFlQRV9NRVNTQUdFLCAgLy8gVFlQRV9HUk9VUAotICBDUFBUWVBFX01FU1NBR0UsICAvLyBUWVBFX01FU1NBR0UKLSAgQ1BQVFlQRV9TVFJJTkcsICAgLy8gVFlQRV9CWVRFUwotICBDUFBUWVBFX1VJTlQzMiwgICAvLyBUWVBFX1VJTlQzMgotICBDUFBUWVBFX0VOVU0sICAgICAvLyBUWVBFX0VOVU0KLSAgQ1BQVFlQRV9JTlQzMiwgICAgLy8gVFlQRV9TRklYRUQzMgotICBDUFBUWVBFX0lOVDY0LCAgICAvLyBUWVBFX1NGSVhFRDY0Ci0gIENQUFRZUEVfSU5UMzIsICAgIC8vIFRZUEVfU0lOVDMyCi0gIENQUFRZUEVfSU5UNjQsICAgIC8vIFRZUEVfU0lOVDY0Ci19OwotCi1jb25zdCBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUKLVdpcmVGb3JtYXRMaXRlOjprV2lyZVR5cGVGb3JGaWVsZFR5cGVbTUFYX0ZJRUxEX1RZUEUgKyAxXSA9IHsKLSAgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OldpcmVUeXBlPigtMSksICAvLyBpbnZhbGlkCi0gIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0LCAgICAgICAgICAgLy8gVFlQRV9ET1VCTEUKLSAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzIsICAgICAgICAgICAvLyBUWVBFX0ZMT0FUCi0gIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9JTlQ2NAotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfVUlOVDY0Ci0gIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9JTlQzMgotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCwgICAgICAgICAgIC8vIFRZUEVfRklYRUQ2NAotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMiwgICAgICAgICAgIC8vIFRZUEVfRklYRUQzMgotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfQk9PTAotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgIC8vIFRZUEVfU1RSSU5HCi0gIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCwgICAgICAgLy8gVFlQRV9HUk9VUAotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgIC8vIFRZUEVfTUVTU0FHRQotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgIC8vIFRZUEVfQllURVMKLSAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX1VJTlQzMgotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5ULCAgICAgICAgICAgIC8vIFRZUEVfRU5VTQotICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMiwgICAgICAgICAgIC8vIFRZUEVfU0ZJWEVEMzIKLSAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQsICAgICAgICAgICAvLyBUWVBFX1NGSVhFRDY0Ci0gIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9TSU5UMzIKLSAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgICAgICAgICAgICAvLyBUWVBFX1NJTlQ2NAotfTsKLQotYm9vbCBXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZykgewotICBzd2l0Y2ggKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpKSB7Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOiB7Ci0gICAgICB1aW50NjQgdmFsdWU7Ci0gICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ6IHsKLSAgICAgIHVpbnQ2NCB2YWx1ZTsKLSAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW42NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDogewotICAgICAgdWludDMyIGxlbmd0aDsKLSAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFpbnB1dC0+U2tpcChsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKLSAgICAgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICghU2tpcE1lc3NhZ2UoaW5wdXQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpbnB1dC0+RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGVuZGluZyB0YWcgbWF0Y2hlZCB0aGUgc3RhcnRpbmcgdGFnLgotICAgICAgaWYgKCFpbnB1dC0+TGFzdFRhZ1dhcyhXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUDogewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyOiB7Ci0gICAgICB1aW50MzIgdmFsdWU7Ci0gICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZywgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgc3dpdGNoIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSkgewotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDogewotICAgICAgdWludDY0IHZhbHVlOwotICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih0YWcpOwotICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDY0KHZhbHVlKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0OiB7Ci0gICAgICB1aW50NjQgdmFsdWU7Ci0gICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7Ci0gICAgICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQodmFsdWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6IHsKLSAgICAgIHVpbnQzMiBsZW5ndGg7Ci0gICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih0YWcpOwotICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGxlbmd0aCk7Ci0gICAgICAvLyBUT0RPKG1raWxhdnV6KTogUHJvdmlkZSBBUEkgdG8gcHJldmVudCBleHRyYSBzdHJpbmcgY29weWluZy4KLSAgICAgIHN0cmluZyB0ZW1wOwotICAgICAgaWYgKCFpbnB1dC0+UmVhZFN0cmluZygmdGVtcCwgbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgb3V0cHV0LT5Xcml0ZVN0cmluZyh0ZW1wKTsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUDogewotICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7Ci0gICAgICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAoIVNraXBNZXNzYWdlKGlucHV0LCBvdXRwdXQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpbnB1dC0+RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgICAgIC8vIENoZWNrIHRoYXQgdGhlIGVuZGluZyB0YWcgbWF0Y2hlZCB0aGUgc3RhcnRpbmcgdGFnLgotICAgICAgaWYgKCFpbnB1dC0+TGFzdFRhZ1dhcyhXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUDogewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLSAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyOiB7Ci0gICAgICB1aW50MzIgdmFsdWU7Ci0gICAgICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuMzIoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7Ci0gICAgICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIodmFsdWUpOwotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICAgIGRlZmF1bHQ6IHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gIH0KLX0KLQotYm9vbCBXaXJlRm9ybWF0TGl0ZTo6U2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0gIHdoaWxlICh0cnVlKSB7Ci0gICAgdWludDMyIHRhZyA9IGlucHV0LT5SZWFkVGFnKCk7Ci0gICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICAvLyBFbmQgb2YgaW5wdXQuICBUaGlzIGlzIGEgdmFsaWQgcGxhY2UgdG8gZW5kLCBzbyByZXR1cm4gdHJ1ZS4KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKTsKLQotICAgIGlmICh3aXJlX3R5cGUgPT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgLy8gTXVzdCBiZSB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCFTa2lwRmllbGQoaW5wdXQsIHRhZykpIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgd2hpbGUgKHRydWUpIHsKLSAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKLSAgICBpZiAodGFnID09IDApIHsKLSAgICAgIC8vIEVuZCBvZiBpbnB1dC4gIFRoaXMgaXMgYSB2YWxpZCBwbGFjZSB0byBlbmQsIHNvIHJldHVybiB0cnVlLgotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHdpcmVfdHlwZSA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpOwotCi0gICAgaWYgKHdpcmVfdHlwZSA9PSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIodGFnKTsKLSAgICAgIC8vIE11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIGlmICghU2tpcEZpZWxkKGlucHV0LCB0YWcsIG91dHB1dCkpIHJldHVybiBmYWxzZTsKLSAgfQotfQotCi1ib29sIEZpZWxkU2tpcHBlcjo6U2tpcEZpZWxkKAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZykgewotICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnKTsKLX0KLQotYm9vbCBGaWVsZFNraXBwZXI6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBNZXNzYWdlKGlucHV0KTsKLX0KLQotdm9pZCBGaWVsZFNraXBwZXI6OlNraXBVbmtub3duRW51bSgKLSAgICBpbnQgLyogZmllbGRfbnVtYmVyICovLCBpbnQgLyogdmFsdWUgKi8pIHsKLSAgLy8gTm90aGluZy4KLX0KLQotYm9vbCBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcjo6U2tpcEZpZWxkKAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZykgewotICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCB1bmtub3duX2ZpZWxkc18pOwotfQotCi1ib29sIENvZGVkT3V0cHV0U3RyZWFtRmllbGRTa2lwcGVyOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbnB1dCwgdW5rbm93bl9maWVsZHNfKTsKLX0KLQotdm9pZCBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcjo6U2tpcFVua25vd25FbnVtKAotICAgIGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSkgewotICB1bmtub3duX2ZpZWxkc18tPldyaXRlVmFyaW50MzIoZmllbGRfbnVtYmVyKTsKLSAgdW5rbm93bl9maWVsZHNfLT5Xcml0ZVZhcmludDY0KHZhbHVlKTsKLX0KLQotYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZEVudW1Ob0lubGluZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiB2YWx1ZXMpIHsKLSAgdWludDMyIGxlbmd0aDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKLSAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsKLSAgICBpbnQgdmFsdWU7Ci0gICAgaWYgKCFnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ci0gICAgICAgIGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oaW5wdXQsICZ2YWx1ZSkpIHsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0gICAgaWYgKGlzX3ZhbGlkID09IE5VTEwgfHwgaXNfdmFsaWQodmFsdWUpKSB7Ci0gICAgICB2YWx1ZXMtPkFkZCh2YWx1ZSk7Ci0gICAgfQotICB9Ci0gIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1ib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkRW51bVByZXNlcnZlVW5rbm93bnMoCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIGludCBmaWVsZF9udW1iZXIsCi0gICAgYm9vbCAoKmlzX3ZhbGlkKShpbnQpLAotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogdW5rbm93bl9maWVsZHNfc3RyZWFtLAotICAgIFJlcGVhdGVkRmllbGQ8aW50PiogdmFsdWVzKSB7Ci0gIHVpbnQzMiBsZW5ndGg7Ci0gIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7Ci0gIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgaW50IHZhbHVlOwotICAgIGlmICghZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAotICAgICAgICBpbnQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KGlucHV0LCAmdmFsdWUpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGlmIChpc192YWxpZCA9PSBOVUxMIHx8IGlzX3ZhbGlkKHZhbHVlKSkgewotICAgICAgdmFsdWVzLT5BZGQodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICB1aW50MzIgdGFnID0gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpOwotICAgICAgdW5rbm93bl9maWVsZHNfc3RyZWFtLT5Xcml0ZVZhcmludDMyKHRhZyk7Ci0gICAgICB1bmtub3duX2ZpZWxkc19zdHJlYW0tPldyaXRlVmFyaW50MzIodmFsdWUpOwotICAgIH0KLSAgfQotICBpbnB1dC0+UG9wTGltaXQobGltaXQpOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7Ci0gIFdyaXRlSW50MzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKLX0KLXZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjQoaW50IGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOwotICBXcml0ZUludDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMihpbnQgZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKLSAgV3JpdGVVSW50MzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKLX0KLXZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDY0KGludCBmaWVsZF9udW1iZXIsIHVpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOwotICBXcml0ZVVJbnQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOwotfQotdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50MzIoaW50IGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKLSAgV3JpdGVTSW50MzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKLX0KLXZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDY0KGludCBmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIG91dHB1dCk7Ci0gIFdyaXRlU0ludDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkMzIoaW50IGZpZWxkX251bWJlciwgdWludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQzMiwgb3V0cHV0KTsKLSAgV3JpdGVGaXhlZDMyTm9UYWcodmFsdWUsIG91dHB1dCk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjQoaW50IGZpZWxkX251bWJlciwgdWludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgb3V0cHV0KTsKLSAgV3JpdGVGaXhlZDY0Tm9UYWcodmFsdWUsIG91dHB1dCk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNGaXhlZDMyKGludCBmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIG91dHB1dCk7Ci0gIFdyaXRlU0ZpeGVkMzJOb1RhZyh2YWx1ZSwgb3V0cHV0KTsKLX0KLXZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjQoaW50IGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgb3V0cHV0KTsKLSAgV3JpdGVTRml4ZWQ2NE5vVGFnKHZhbHVlLCBvdXRwdXQpOwotfQotdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdChpbnQgZmllbGRfbnVtYmVyLCBmbG9hdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCBvdXRwdXQpOwotICBXcml0ZUZsb2F0Tm9UYWcodmFsdWUsIG91dHB1dCk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZShpbnQgZmllbGRfbnVtYmVyLCBkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVENjQsIG91dHB1dCk7Ci0gIFdyaXRlRG91YmxlTm9UYWcodmFsdWUsIG91dHB1dCk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woaW50IGZpZWxkX251bWJlciwgYm9vbCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgb3V0cHV0KTsKLSAgV3JpdGVCb29sTm9UYWcodmFsdWUsIG91dHB1dCk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oaW50IGZpZWxkX251bWJlciwgaW50IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOwotICBXcml0ZUVudW1Ob1RhZyh2YWx1ZSwgb3V0cHV0KTsKLX0KLQotdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKLSAgR09PR0xFX0NIRUNLX0xFKHZhbHVlLnNpemUoKSwga2ludDMybWF4KTsKLSAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHZhbHVlLnNpemUoKSk7Ci0gIG91dHB1dC0+V3JpdGVTdHJpbmcodmFsdWUpOwotfQotdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCi0gICAgaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICAvLyBTdHJpbmcgaXMgZm9yIFVURi04IHRleHQgb25seQotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7Ci0gIEdPT0dMRV9DSEVDS19MRSh2YWx1ZS5zaXplKCksIGtpbnQzMm1heCk7Ci0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZS5zaXplKCkpOwotICBvdXRwdXQtPldyaXRlUmF3TWF5YmVBbGlhc2VkKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKLX0KLXZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOwotICBHT09HTEVfQ0hFQ0tfTEUodmFsdWUuc2l6ZSgpLCBraW50MzJtYXgpOwotICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKLSAgb3V0cHV0LT5Xcml0ZVN0cmluZyh2YWx1ZSk7Ci19Ci12b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzTWF5YmVBbGlhc2VkKAotICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOwotICBHT09HTEVfQ0hFQ0tfTEUodmFsdWUuc2l6ZSgpLCBraW50MzJtYXgpOwotICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKLSAgb3V0cHV0LT5Xcml0ZVJhd01heWJlQWxpYXNlZCh2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Ci19Ci0KLQotdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVHcm91cChpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfU1RBUlRfR1JPVVAsIG91dHB1dCk7Ci0gIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOwotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCwgb3V0cHV0KTsKLX0KLQotdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlKGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKLSAgY29uc3QgaW50IHNpemUgPSB2YWx1ZS5HZXRDYWNoZWRTaXplKCk7Ci0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMihzaXplKTsKLSAgdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7Ci19Ci0KLXZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBNYXliZVRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCBvdXRwdXQpOwotICBjb25zdCBpbnQgc2l6ZSA9IHZhbHVlLkdldENhY2hlZFNpemUoKTsKLSAgdWludDgqIHRhcmdldCA9IG91dHB1dC0+R2V0RGlyZWN0QnVmZmVyRm9yTkJ5dGVzQW5kQWR2YW5jZShzaXplKTsKLSAgaWYgKHRhcmdldCAhPSBOVUxMKSB7Ci0gICAgdWludDgqIGVuZCA9IHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKLSAgICBHT09HTEVfRENIRUNLX0VRKGVuZCAtIHRhcmdldCwgc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7Ci0gIH0KLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVAsIG91dHB1dCk7Ci19Ci0KLXZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7Ci0gIGNvbnN0IGludCBzaXplID0gdmFsdWUuR2V0Q2FjaGVkU2l6ZSgpOwotICBvdXRwdXQtPldyaXRlVmFyaW50MzIoc2l6ZSk7Ci0gIHVpbnQ4KiB0YXJnZXQgPSBvdXRwdXQtPkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2Uoc2l6ZSk7Ci0gIGlmICh0YXJnZXQgIT0gTlVMTCkgewotICAgIHVpbnQ4KiBlbmQgPSB2YWx1ZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7Ci0gICAgR09PR0xFX0RDSEVDS19FUShlbmQgLSB0YXJnZXQsIHNpemUpOwotICB9IGVsc2UgewotICAgIHZhbHVlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhvdXRwdXQpOwotICB9Ci19Ci0KLUdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgYm9vbCBSZWFkQnl0ZXNUb1N0cmluZygKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHN0cmluZyogdmFsdWUpOwotaW5saW5lIHN0YXRpYyBib29sIFJlYWRCeXRlc1RvU3RyaW5nKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHZhbHVlKSB7Ci0gIHVpbnQzMiBsZW5ndGg7Ci0gIHJldHVybiBpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpICYmCi0gICAgICBpbnB1dC0+SW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKHZhbHVlLCBsZW5ndGgpOwotfQotCi1ib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBzdHJpbmcqIHZhbHVlKSB7Ci0gIHJldHVybiBSZWFkQnl0ZXNUb1N0cmluZyhpbnB1dCwgdmFsdWUpOwotfQotCi1ib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBzdHJpbmcqKiBwKSB7Ci0gIGlmICgqcCA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpIHsKLSAgICAqcCA9IG5ldyA6OnN0ZDo6c3RyaW5nKCk7Ci0gIH0KLSAgcmV0dXJuIFJlYWRCeXRlc1RvU3RyaW5nKGlucHV0LCAqcCk7Ci19Ci0KLWJvb2wgV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoY29uc3QgY2hhciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmllbGRfbmFtZSkgewotICBpZiAoIUlzU3RydWN0dXJhbGx5VmFsaWRVVEY4KGRhdGEsIHNpemUpKSB7Ci0gICAgY29uc3QgY2hhciogb3BlcmF0aW9uX3N0ciA9IE5VTEw7Ci0gICAgc3dpdGNoIChvcCkgewotICAgICAgY2FzZSBQQVJTRToKLSAgICAgICAgb3BlcmF0aW9uX3N0ciA9ICJwYXJzaW5nIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFNFUklBTElaRToKLSAgICAgICAgb3BlcmF0aW9uX3N0ciA9ICJzZXJpYWxpemluZyI7Ci0gICAgICAgIGJyZWFrOwotICAgICAgLy8gbm8gZGVmYXVsdCBjYXNlOiBoYXZlIHRoZSBjb21waWxlciB3YXJuIGlmIGEgY2FzZSBpcyBub3QgY292ZXJlZC4KLSAgICB9Ci0gICAgc3RyaW5nIHF1b3RlZF9maWVsZF9uYW1lID0gIiI7Ci0gICAgaWYgKGZpZWxkX25hbWUgIT0gTlVMTCkgewotICAgICAgcXVvdGVkX2ZpZWxkX25hbWUgPSBTdHJpbmdQcmludGYoIiAnJXMnIiwgZmllbGRfbmFtZSk7Ci0gICAgfQotICAgIC8vIG5vIHNwYWNlIGJlbG93IHRvIGF2b2lkIGRvdWJsZSBzcGFjZSB3aGVuIHRoZSBmaWVsZCBuYW1lIGlzIG1pc3NpbmcuCi0gICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIlN0cmluZyBmaWVsZCIgPDwgcXVvdGVkX2ZpZWxkX25hbWUgPDwgIiBjb250YWlucyBpbnZhbGlkICIKLSAgICAgICAgICAgICAgIDw8ICJVVEYtOCBkYXRhIHdoZW4gIiA8PCBvcGVyYXRpb25fc3RyIDw8ICIgYSBwcm90b2NvbCAiCi0gICAgICAgICAgICAgICA8PCAiYnVmZmVyLiBVc2UgdGhlICdieXRlcycgdHlwZSBpZiB5b3UgaW50ZW5kIHRvIHNlbmQgcmF3ICIKLSAgICAgICAgICAgICAgIDw8ICJieXRlcy4gIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NWZjN2VjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oCisrKyAvZGV2L251bGwKQEAgLTEsNjk2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0vLyAgICAgICAgIGF0ZW5hc2lvQGdvb2dsZS5jb20gKENocmlzIEF0ZW5hc2lvKSAoWmlnWmFnIHRyYW5zZm9ybSkKLS8vICAgICAgICAgd2lua0Bnb29nbGUuY29tIChXaW5rIFNhdmlsbGUpIChyZWZhY3RvcmVkIGZyb20gd2lyZV9mb3JtYXQuaCkKLS8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQotLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgotLy8KLS8vIFRoaXMgaGVhZGVyIGlzIGxvZ2ljYWxseSBpbnRlcm5hbCwgYnV0IGlzIG1hZGUgcHVibGljIGJlY2F1c2UgaXQgaXMgdXNlZAotLy8gZnJvbSBwcm90b2NvbC1jb21waWxlci1nZW5lcmF0ZWQgY29kZSwgd2hpY2ggbWF5IHJlc2lkZSBpbiBvdGhlciBjb21wb25lbnRzLgotCi0jaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9IX18KLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4gIC8vIGZvciBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50MzJTaXplCi0KLW5hbWVzcGFjZSBnb29nbGUgewotCi1uYW1lc3BhY2UgcHJvdG9idWYgewotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgUmVwZWF0ZWRGaWVsZDsgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKLX0KLQotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIFN0cmluZ1BpZWNlRmllbGQ7Ci0KLS8vIFRoaXMgY2xhc3MgaXMgZm9yIGludGVybmFsIHVzZSBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgYW5kIGJ5Ci0vLyBwcm90b2NvbC1jb21wbGllci1nZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzLiAgSXQgbXVzdCBub3QgYmUgY2FsbGVkCi0vLyBkaXJlY3RseSBieSBjbGllbnRzLgotLy8KLS8vIFRoaXMgY2xhc3MgY29udGFpbnMgaGVscGVycyBmb3IgaW1wbGVtZW50aW5nIHRoZSBiaW5hcnkgcHJvdG9jb2wgYnVmZmVyCi0vLyB3aXJlIGZvcm1hdCB3aXRob3V0IHRoZSBuZWVkIGZvciByZWZsZWN0aW9uLiBVc2UgV2lyZUZvcm1hdCB3aGVuIHVzaW5nCi0vLyByZWZsZWN0aW9uLgotLy8KLS8vIFRoaXMgY2xhc3MgaXMgcmVhbGx5IGEgbmFtZXNwYWNlIHRoYXQgY29udGFpbnMgb25seSBzdGF0aWMgbWV0aG9kcy4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBXaXJlRm9ybWF0TGl0ZSB7Ci0gcHVibGljOgotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEhlbHBlciBjb25zdGFudHMgYW5kIGZ1bmN0aW9ucyByZWxhdGVkIHRvIHRoZSBmb3JtYXQuICBUaGVzZSBhcmUKLSAgLy8gbW9zdGx5IG1lYW50IGZvciBpbnRlcm5hbCBhbmQgZ2VuZXJhdGVkIGNvZGUgdG8gdXNlLgotCi0gIC8vIFRoZSB3aXJlIGZvcm1hdCBpcyBjb21wb3NlZCBvZiBhIHNlcXVlbmNlIG9mIHRhZy92YWx1ZSBwYWlycywgZWFjaAotICAvLyBvZiB3aGljaCBjb250YWlucyB0aGUgdmFsdWUgb2Ygb25lIGZpZWxkIChvciBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkCi0gIC8vIGZpZWxkKS4gIEVhY2ggdGFnIGlzIGVuY29kZWQgYXMgYSB2YXJpbnQuICBUaGUgbG93ZXIgYml0cyBvZiB0aGUgdGFnCi0gIC8vIGlkZW50aWZ5IGl0cyB3aXJlIHR5cGUsIHdoaWNoIHNwZWNpZmllcyB0aGUgZm9ybWF0IG9mIHRoZSBkYXRhIHRvIGZvbGxvdy4KLSAgLy8gVGhlIHJlc3Qgb2YgdGhlIGJpdHMgY29udGFpbiB0aGUgZmllbGQgbnVtYmVyLiAgRWFjaCB0eXBlIG9mIGZpZWxkIChhcwotICAvLyBkZWNsYXJlZCBieSBGaWVsZERlc2NyaXB0b3I6OlR5cGUsIGluIGRlc2NyaXB0b3IuaCkgbWFwcyB0byBvbmUgb2YKLSAgLy8gdGhlc2Ugd2lyZSB0eXBlcy4gIEltbWVkaWF0ZWx5IGZvbGxvd2luZyBlYWNoIHRhZyBpcyB0aGUgZmllbGQncyB2YWx1ZSwKLSAgLy8gZW5jb2RlZCBpbiB0aGUgZm9ybWF0IHNwZWNpZmllZCBieSB0aGUgd2lyZSB0eXBlLiAgQmVjYXVzZSB0aGUgdGFnCi0gIC8vIGlkZW50aWZpZXMgdGhlIGVuY29kaW5nIG9mIHRoaXMgZGF0YSwgaXQgaXMgcG9zc2libGUgdG8gc2tpcAotICAvLyB1bnJlY29nbml6ZWQgZmllbGRzIGZvciBmb3J3YXJkcyBjb21wYXRpYmlsaXR5LgotCi0gIGVudW0gV2lyZVR5cGUgewotICAgIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICAgPSAwLAotICAgIFdJUkVUWVBFX0ZJWEVENjQgICAgICAgICAgPSAxLAotICAgIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQgPSAyLAotICAgIFdJUkVUWVBFX1NUQVJUX0dST1VQICAgICAgPSAzLAotICAgIFdJUkVUWVBFX0VORF9HUk9VUCAgICAgICAgPSA0LAotICAgIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICAgPSA1LAotICB9OwotCi0gIC8vIExpdGUgYWx0ZXJuYXRpdmUgdG8gRmllbGREZXNjcmlwdG9yOjpUeXBlLiAgTXVzdCBiZSBrZXB0IGluIHN5bmMuCi0gIGVudW0gRmllbGRUeXBlIHsKLSAgICBUWVBFX0RPVUJMRSAgICAgICAgID0gMSwKLSAgICBUWVBFX0ZMT0FUICAgICAgICAgID0gMiwKLSAgICBUWVBFX0lOVDY0ICAgICAgICAgID0gMywKLSAgICBUWVBFX1VJTlQ2NCAgICAgICAgID0gNCwKLSAgICBUWVBFX0lOVDMyICAgICAgICAgID0gNSwKLSAgICBUWVBFX0ZJWEVENjQgICAgICAgID0gNiwKLSAgICBUWVBFX0ZJWEVEMzIgICAgICAgID0gNywKLSAgICBUWVBFX0JPT0wgICAgICAgICAgID0gOCwKLSAgICBUWVBFX1NUUklORyAgICAgICAgID0gOSwKLSAgICBUWVBFX0dST1VQICAgICAgICAgID0gMTAsCi0gICAgVFlQRV9NRVNTQUdFICAgICAgICA9IDExLAotICAgIFRZUEVfQllURVMgICAgICAgICAgPSAxMiwKLSAgICBUWVBFX1VJTlQzMiAgICAgICAgID0gMTMsCi0gICAgVFlQRV9FTlVNICAgICAgICAgICA9IDE0LAotICAgIFRZUEVfU0ZJWEVEMzIgICAgICAgPSAxNSwKLSAgICBUWVBFX1NGSVhFRDY0ICAgICAgID0gMTYsCi0gICAgVFlQRV9TSU5UMzIgICAgICAgICA9IDE3LAotICAgIFRZUEVfU0lOVDY0ICAgICAgICAgPSAxOCwKLSAgICBNQVhfRklFTERfVFlQRSAgICAgID0gMTgsCi0gIH07Ci0KLSAgLy8gTGl0ZSBhbHRlcm5hdGl2ZSB0byBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUuICBNdXN0IGJlIGtlcHQgaW4gc3luYy4KLSAgZW51bSBDcHBUeXBlIHsKLSAgICBDUFBUWVBFX0lOVDMyICAgICAgID0gMSwKLSAgICBDUFBUWVBFX0lOVDY0ICAgICAgID0gMiwKLSAgICBDUFBUWVBFX1VJTlQzMiAgICAgID0gMywKLSAgICBDUFBUWVBFX1VJTlQ2NCAgICAgID0gNCwKLSAgICBDUFBUWVBFX0RPVUJMRSAgICAgID0gNSwKLSAgICBDUFBUWVBFX0ZMT0FUICAgICAgID0gNiwKLSAgICBDUFBUWVBFX0JPT0wgICAgICAgID0gNywKLSAgICBDUFBUWVBFX0VOVU0gICAgICAgID0gOCwKLSAgICBDUFBUWVBFX1NUUklORyAgICAgID0gOSwKLSAgICBDUFBUWVBFX01FU1NBR0UgICAgID0gMTAsCi0gICAgTUFYX0NQUFRZUEUgICAgICAgICA9IDEwLAotICB9OwotCi0gIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBDcHBUeXBlIGZvciBhIHBhcnRpY3VsYXIgVHlwZS4KLSAgc3RhdGljIENwcFR5cGUgRmllbGRUeXBlVG9DcHBUeXBlKEZpZWxkVHlwZSB0eXBlKTsKLQotICAvLyBHaXZlbiBhIEZpZWxkU2VzY3JpcHRvcjo6VHlwZSByZXR1cm4gaXRzIFdpcmVUeXBlCi0gIHN0YXRpYyBpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVUeXBlRm9yRmllbGRUeXBlKAotICAgICAgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSB0eXBlKSB7Ci0gICAgcmV0dXJuIGtXaXJlVHlwZUZvckZpZWxkVHlwZVt0eXBlXTsKLSAgfQotCi0gIC8vIE51bWJlciBvZiBiaXRzIGluIGEgdGFnIHdoaWNoIGlkZW50aWZ5IHRoZSB3aXJlIHR5cGUuCi0gIHN0YXRpYyBjb25zdCBpbnQga1RhZ1R5cGVCaXRzID0gMzsKLSAgLy8gTWFzayBmb3IgdGhvc2UgYml0cy4KLSAgc3RhdGljIGNvbnN0IHVpbnQzMiBrVGFnVHlwZU1hc2sgPSAoMSA8PCBrVGFnVHlwZUJpdHMpIC0gMTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBlbmNvZGluZyBhbmQgZGVjb2RpbmcgdGFncy4gIChJbmxpbmVkIGJlbG93IGFuZCBpbgotICAvLyBfaW5sLmgpCi0gIC8vCi0gIC8vIFRoaXMgaXMgZGlmZmVyZW50IGZyb20gTWFrZVRhZyhmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCkpIGluIHRoZSBjYXNlCi0gIC8vIG9mIHBhY2tlZCByZXBlYXRlZCBmaWVsZHMuCi0gIHN0YXRpYyB1aW50MzIgTWFrZVRhZyhpbnQgZmllbGRfbnVtYmVyLCBXaXJlVHlwZSB0eXBlKTsKLSAgc3RhdGljIFdpcmVUeXBlIEdldFRhZ1dpcmVUeXBlKHVpbnQzMiB0YWcpOwotICBzdGF0aWMgaW50IEdldFRhZ0ZpZWxkTnVtYmVyKHVpbnQzMiB0YWcpOwotCi0gIC8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiBhIHRhZy4gIEZvciBncm91cHMsIHRoaXMgaW5jbHVkZXMgYm90aCB0aGUgc3RhcnQKLSAgLy8gYW5kIGVuZCB0YWdzLgotICBzdGF0aWMgaW5saW5lIGludCBUYWdTaXplKGludCBmaWVsZF9udW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdHlwZSk7Ci0KLSAgLy8gU2tpcHMgYSBmaWVsZCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiB0YWcuICBUaGUgaW5wdXQgc2hvdWxkIHN0YXJ0Ci0gIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4gIFNraXBwZWQgdmFsdWVzIGFyZSBzaW1wbHkgZGlzY2FyZGVkLAotICAvLyBub3QgcmVjb3JkZWQgYW55d2hlcmUuICBTZWUgV2lyZUZvcm1hdDo6U2tpcEZpZWxkKCkgZm9yIGEgdmVyc2lvbiB0aGF0Ci0gIC8vIHJlY29yZHMgdG8gYW4gVW5rbm93bkZpZWxkU2V0LgotICBzdGF0aWMgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKTsKLQotICAvLyBTa2lwcyBhIGZpZWxkIHZhbHVlIHdpdGggdGhlIGdpdmVuIHRhZy4gIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQKLSAgLy8gcG9zaXRpb25lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLiBTa2lwcGVkIHZhbHVlcyBhcmUgcmVjb3JkZWQgdG8gYQotICAvLyBDb2RlZE91dHB1dFN0cmVhbS4KLSAgc3RhdGljIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKLQotICAvLyBSZWFkcyBhbmQgaWdub3JlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQuICBTa2lwcGVkIHZhbHVlcyBhcmUgc2ltcGx5Ci0gIC8vIGRpc2NhcmRlZCwgbm90IHJlY29yZGVkIGFueXdoZXJlLiAgU2VlIFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKCkgZm9yIGEKLSAgLy8gdmVyc2lvbiB0aGF0IHJlY29yZHMgdG8gYW4gVW5rbm93bkZpZWxkU2V0LgotICBzdGF0aWMgYm9vbCBTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwotCi0gIC8vIFJlYWRzIGFuZCBpZ25vcmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbnB1dC4gIFNraXBwZWQgdmFsdWVzIGFyZSByZWNvcmRlZAotICAvLyB0byBhIENvZGVkT3V0cHV0U3RyZWFtLgotICBzdGF0aWMgYm9vbCBTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KTsKLQotLy8gVGhpcyBtYWNybyBkb2VzIHRoZSBzYW1lIHRoaW5nIGFzIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKCksIGJ1dCB0aGUKLS8vIHJlc3VsdCBpcyB1c2FibGUgYXMgYSBjb21waWxlLXRpbWUgY29uc3RhbnQsIHdoaWNoIG1ha2VzIGl0IHVzYWJsZQotLy8gYXMgYSBzd2l0Y2ggY2FzZSBvciBhIHRlbXBsYXRlIGlucHV0LiAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoKSBpcyBtb3JlCi0vLyB0eXBlLXNhZmUsIHRob3VnaCwgc28gcHJlZmVyIGl0IGlmIHBvc3NpYmxlLgotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoRklFTERfTlVNQkVSLCBUWVBFKSAgICAgICAgICAgICAgICAgIFwKLSAgc3RhdGljX2Nhc3Q8dWludDMyPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgKChGSUVMRF9OVU1CRVIpIDw8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjprVGFnVHlwZUJpdHMpIFwKLSAgICAgIHwgKFRZUEUpKQotCi0gIC8vIFRoZXNlIGFyZSB0aGUgdGFncyBmb3IgdGhlIG9sZCBNZXNzYWdlU2V0IGZvcm1hdCwgd2hpY2ggd2FzIGRlZmluZWQgYXM6Ci0gIC8vICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKLSAgLy8gICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKLSAgLy8gICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7Ci0gIC8vICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKLSAgLy8gICAgIH0KLSAgLy8gICB9Ci0gIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRJdGVtTnVtYmVyID0gMTsKLSAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldFR5cGVJZE51bWJlciA9IDI7Ci0gIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyID0gMzsKLSAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldEl0ZW1TdGFydFRhZyA9Ci0gICAgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKGtNZXNzYWdlU2V0SXRlbU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQKTsKLSAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVNldEl0ZW1FbmRUYWcgPQotICAgIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9NQUtFX1RBRyhrTWVzc2FnZVNldEl0ZW1OdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApOwotICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0VHlwZUlkVGFnID0KLSAgICBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTUFLRV9UQUcoa01lc3NhZ2VTZXRUeXBlSWROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpOwotICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0TWVzc2FnZVRhZyA9Ci0gICAgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKGtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotCi0gIC8vIEJ5dGUgc2l6ZSBvZiBhbGwgdGFncyBvZiBhIE1lc3NhZ2VTZXQ6Okl0ZW0gY29tYmluZWQuCi0gIHN0YXRpYyBjb25zdCBpbnQga01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7Ci0KLSAgLy8gSGVscGVyIGZ1bmN0aW9ucyBmb3IgY29udmVydGluZyBiZXR3ZWVuIGZsb2F0cy9kb3VibGVzIGFuZCBJRUVFLTc1NAotICAvLyB1aW50MzJzL3VpbnQ2NHMgc28gdGhhdCB0aGV5IGNhbiBiZSB3cml0dGVuLiAgKEFzc3VtZXMgeW91ciBwbGF0Zm9ybQotICAvLyB1c2VzIElFRUUtNzU0IGZsb2F0cy4pCi0gIHN0YXRpYyB1aW50MzIgRW5jb2RlRmxvYXQoZmxvYXQgdmFsdWUpOwotICBzdGF0aWMgZmxvYXQgRGVjb2RlRmxvYXQodWludDMyIHZhbHVlKTsKLSAgc3RhdGljIHVpbnQ2NCBFbmNvZGVEb3VibGUoZG91YmxlIHZhbHVlKTsKLSAgc3RhdGljIGRvdWJsZSBEZWNvZGVEb3VibGUodWludDY0IHZhbHVlKTsKLQotICAvLyBIZWxwZXIgZnVuY3Rpb25zIGZvciBtYXBwaW5nIHNpZ25lZCBpbnRlZ2VycyB0byB1bnNpZ25lZCBpbnRlZ2VycyBpbgotICAvLyBzdWNoIGEgd2F5IHRoYXQgbnVtYmVycyB3aXRoIHNtYWxsIG1hZ25pdHVkZXMgd2lsbCBlbmNvZGUgdG8gc21hbGxlcgotICAvLyB2YXJpbnRzLiAgSWYgeW91IHNpbXBseSBzdGF0aWNfY2FzdCBhIG5lZ2F0aXZlIG51bWJlciB0byBhbiB1bnNpZ25lZAotICAvLyBudW1iZXIgYW5kIHZhcmludC1lbmNvZGUgaXQsIGl0IHdpbGwgYWx3YXlzIHRha2UgMTAgYnl0ZXMsIGRlZmVhdGluZwotICAvLyB0aGUgcHVycG9zZSBvZiB2YXJpbnQuICBTbywgZm9yIHRoZSAic2ludDMyIiBhbmQgInNpbnQ2NCIgZmllbGQgdHlwZXMsCi0gIC8vIHdlIFppZ1phZy1lbmNvZGUgdGhlIHZhbHVlcy4KLSAgc3RhdGljIHVpbnQzMiBaaWdaYWdFbmNvZGUzMihpbnQzMiBuKTsKLSAgc3RhdGljIGludDMyICBaaWdaYWdEZWNvZGUzMih1aW50MzIgbik7Ci0gIHN0YXRpYyB1aW50NjQgWmlnWmFnRW5jb2RlNjQoaW50NjQgbik7Ci0gIHN0YXRpYyBpbnQ2NCAgWmlnWmFnRGVjb2RlNjQodWludDY0IG4pOwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIE1ldGhvZHMgZm9yIHJlYWRpbmcvd3JpdGluZyBpbmRpdmlkdWFsIGZpZWxkLiAgVGhlIGltcGxlbWVudGF0aW9ucwotICAvLyBvZiB0aGVzZSBtZXRob2RzIGFyZSBkZWZpbmVkIGluIHdpcmVfZm9ybWF0X2xpdGVfaW5sLmg7IHlvdSBtdXN0ICNpbmNsdWRlCi0gIC8vIHRoYXQgZmlsZSB0byB1c2UgdGhlc2UuCi0KLS8vIEF2b2lkIHVnbHkgbGluZSB3cmFwcGluZwotI2RlZmluZSBpbnB1dCAgaW86OkNvZGVkSW5wdXRTdHJlYW0qICBpbnB1dF9hcmcKLSNkZWZpbmUgb3V0cHV0IGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0X2FyZwotI2RlZmluZSBmaWVsZF9udW1iZXIgaW50IGZpZWxkX251bWJlcl9hcmcKLSNkZWZpbmUgSU5MIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotCi0gIC8vIFJlYWQgZmllbGRzLCBub3QgaW5jbHVkaW5nIHRhZ3MuICBUaGUgYXNzdW1wdGlvbiBpcyB0aGF0IHlvdSBhbHJlYWR5Ci0gIC8vIHJlYWQgdGhlIHRhZyB0byBkZXRlcm1pbmUgd2hhdCBmaWVsZCB0byByZWFkLgotCi0gIC8vIEZvciBwcmltaXRpdmUgZmllbGRzLCB3ZSBqdXN0IHVzZSBhIHRlbXBsYXRpemVkIHJvdXRpbmUgcGFyYW1ldGVyaXplZCBieQotICAvLyB0aGUgcmVwcmVzZW50ZWQgdHlwZSBhbmQgdGhlIEZpZWxkVHlwZS4gVGhlc2UgYXJlIHNwZWNpYWxpemVkIHdpdGggdGhlCi0gIC8vIGFwcHJvcHJpYXRlIGRlZmluaXRpb24gZm9yIGVhY2ggZGVjbGFyZWQgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+IElOTAotICBzdGF0aWMgYm9vbCBSZWFkUHJpbWl0aXZlKGlucHV0LCBDVHlwZSogdmFsdWUpOwotCi0gIC8vIFJlYWRzIHJlcGVhdGVkIHByaW1pdGl2ZSB2YWx1ZXMsIHdpdGggb3B0aW1pemF0aW9ucyBmb3IgcmVwZWF0cy4KLSAgLy8gdGFnX3NpemUgYW5kIHRhZyBzaG91bGQgYm90aCBiZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIHByb3ZpZGVkIGJ5IHRoZQotICAvLyBwcm90b2NvbCBjb21waWxlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+IElOTAotICBzdGF0aWMgYm9vbCBSZWFkUmVwZWF0ZWRQcmltaXRpdmUoaW50IHRhZ19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKTsKLQotICAvLyBJZGVudGljYWwgdG8gUmVhZFJlcGVhdGVkUHJpbWl0aXZlLCBleGNlcHQgd2lsbCBub3QgaW5saW5lIHRoZQotICAvLyBpbXBsZW1lbnRhdGlvbi4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci0gIHN0YXRpYyBib29sIFJlYWRSZXBlYXRlZFByaW1pdGl2ZU5vSW5saW5lKGludCB0YWdfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7Ci0KLSAgLy8gUmVhZHMgYSBwcmltaXRpdmUgdmFsdWUgZGlyZWN0bHkgZnJvbSB0aGUgcHJvdmlkZWQgYnVmZmVyLiBJdCByZXR1cm5zIGEKLSAgLy8gcG9pbnRlciBwYXN0IHRoZSBzZWdtZW50IG9mIGRhdGEgdGhhdCB3YXMgcmVhZC4KLSAgLy8KLSAgLy8gVGhpcyBpcyBvbmx5IGltcGxlbWVudGVkIGZvciB0aGUgdHlwZXMgd2l0aCBmaXhlZCB3aXJlIHNpemUsIGUuZy4KLSAgLy8gZmxvYXQsIGRvdWJsZSwgYW5kIHRoZSAocylmaXhlZCogdHlwZXMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPiBJTkwKLSAgc3RhdGljIGNvbnN0IHVpbnQ4KiBSZWFkUHJpbWl0aXZlRnJvbUFycmF5KGNvbnN0IHVpbnQ4KiBidWZmZXIsIENUeXBlKiB2YWx1ZSk7Ci0KLSAgLy8gUmVhZHMgYSBwcmltaXRpdmUgcGFja2VkIGZpZWxkLgotICAvLwotICAvLyBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHBhY2thYmxlIHR5cGVzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4gSU5MCi0gIHN0YXRpYyBib29sIFJlYWRQYWNrZWRQcmltaXRpdmUoaW5wdXQsIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7Ci0KLSAgLy8gSWRlbnRpY2FsIHRvIFJlYWRQYWNrZWRQcmltaXRpdmUsIGV4Y2VwdCB3aWxsIG5vdCBpbmxpbmUgdGhlCi0gIC8vIGltcGxlbWVudGF0aW9uLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KLSAgc3RhdGljIGJvb2wgUmVhZFBhY2tlZFByaW1pdGl2ZU5vSW5saW5lKGlucHV0LCBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpOwotCi0gIC8vIFJlYWQgYSBwYWNrZWQgZW51bSBmaWVsZC4gSWYgdGhlIGlzX3ZhbGlkIGZ1bmN0aW9uIGlzIG5vdCBOVUxMLCB2YWx1ZXMgZm9yCi0gIC8vIHdoaWNoIGlzX3ZhbGlkKHZhbHVlKSByZXR1cm5zIGZhbHNlIGFyZSBzaWxlbnRseSBkcm9wcGVkLgotICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRW51bU5vSW5saW5lKGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlcyk7Ci0KLSAgLy8gUmVhZCBhIHBhY2tlZCBlbnVtIGZpZWxkLiBJZiB0aGUgaXNfdmFsaWQgZnVuY3Rpb24gaXMgbm90IE5VTEwsIHZhbHVlcyBmb3IKLSAgLy8gd2hpY2ggaXNfdmFsaWQodmFsdWUpIHJldHVybnMgZmFsc2UgYXJlIGFwcGVuZGVkIHRvIHVua25vd25fZmllbGRzX3N0cmVhbS4KLSAgc3RhdGljIGJvb2wgUmVhZFBhY2tlZEVudW1QcmVzZXJ2ZVVua25vd25zKAotICAgICAgaW5wdXQsCi0gICAgICBmaWVsZF9udW1iZXIsCi0gICAgICBib29sICgqaXNfdmFsaWQpKGludCksCi0gICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHVua25vd25fZmllbGRzX3N0cmVhbSwKLSAgICAgIFJlcGVhdGVkRmllbGQ8aW50PiogdmFsdWVzKTsKLQotICAvLyBSZWFkIGEgc3RyaW5nLiAgUmVhZFN0cmluZyguLi4sIHN0cmluZyogdmFsdWUpIHJlcXVpcmVzIGFuIGV4aXN0aW5nIHN0cmluZy4KLSAgc3RhdGljIGlubGluZSBib29sIFJlYWRTdHJpbmcoaW5wdXQsIHN0cmluZyogdmFsdWUpOwotICAvLyBSZWFkU3RyaW5nKC4uLiwgc3RyaW5nKiogcCkgaXMgaW50ZXJuYWwtb25seSwgYW5kIHNob3VsZCBvbmx5IGJlIGNhbGxlZAotICAvLyBmcm9tIGdlbmVyYXRlZCBjb2RlLiBJdCBzdGFydHMgYnkgc2V0dGluZyAqcCB0byAibmV3IHN0cmluZyIKLSAgLy8gaWYgKnAgPT0gJkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLiAgSXQgdGhlbiBpbnZva2VzCi0gIC8vIFJlYWRTdHJpbmcoaW5wdXQsICpwKS4gIFRoaXMgaXMgdXNlZnVsIGZvciByZWR1Y2luZyBjb2RlIHNpemUuCi0gIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkU3RyaW5nKGlucHV0LCBzdHJpbmcqKiBwKTsKLSAgLy8gQW5hbG9nb3VzIHRvIFJlYWRTdHJpbmcoKS4KLSAgc3RhdGljIGJvb2wgUmVhZEJ5dGVzKGlucHV0LCBzdHJpbmcqIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgUmVhZEJ5dGVzKGlucHV0LCBzdHJpbmcqKiBwKTsKLQotCi0gIGVudW0gT3BlcmF0aW9uIHsKLSAgICBQQVJTRSA9IDAsCi0gICAgU0VSSUFMSVpFID0gMSwKLSAgfTsKLQotICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGRhdGEgaXMgdmFsaWQgVVRGLTguCi0gIHN0YXRpYyBib29sIFZlcmlmeVV0ZjhTdHJpbmcoY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGZpZWxkX25hbWUpOwotCi0gIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkR3JvdXAgIChmaWVsZF9udW1iZXIsIGlucHV0LCBNZXNzYWdlTGl0ZSogdmFsdWUpOwotICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZE1lc3NhZ2UoaW5wdXQsIE1lc3NhZ2VMaXRlKiB2YWx1ZSk7Ci0KLSAgLy8gTGlrZSBhYm92ZSwgYnV0IGRlLXZpcnR1YWxpemUgdGhlIGNhbGwgdG8gTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKCkuCi0gIC8vIFRoZSBwb2ludGVyIG11c3QgcG9pbnQgYXQgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVR5cGUsICpub3QqIGEgc3ViY2xhc3MgKG9yCi0gIC8vIHRoZSBzdWJjbGFzcyBtdXN0IG5vdCBvdmVycmlkZSBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oKSkuCi0gIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgotICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZEdyb3VwTm9WaXJ0dWFsKGZpZWxkX251bWJlciwgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUqIHZhbHVlKTsKLSAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkTWVzc2FnZU5vVmlydHVhbChpbnB1dCwgTWVzc2FnZVR5cGUqIHZhbHVlKTsKLQotICAvLyBUaGUgc2FtZSwgYnV0IGRvIG5vdCBtb2RpZnkgaW5wdXQncyByZWN1cnNpb24gZGVwdGguICBUaGlzIGlzIHVzZWZ1bAotICAvLyB3aGVuIHJlYWRpbmcgYSBidW5jaCBvZiBncm91cHMgb3IgbWVzc2FnZXMgaW4gYSBsb29wLCBiZWNhdXNlIHRoZW4gdGhlCi0gIC8vIHJlY3Vyc2lvbiBkZXB0aCBjYW4gYmUgaW5jcmVtZW50ZWQgYmVmb3JlIHRoZSBsb29wIGFuZCBkZWNyZW1lbnRlZCBhZnRlci4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkR3JvdXBOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKGZpZWxkX251bWJlciwgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlKiB2YWx1ZSk7Ci0KLSAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUqIHZhbHVlKTsKLQotICAvLyBXcml0ZSBhIHRhZy4gIFRoZSBXcml0ZSooKSBmdW5jdGlvbnMgdHlwaWNhbGx5IGluY2x1ZGUgdGhlIHRhZywgc28KLSAgLy8gbm9ybWFsbHkgdGhlcmUncyBubyBuZWVkIHRvIGNhbGwgdGhpcyB1bmxlc3MgdXNpbmcgdGhlIFdyaXRlKk5vVGFnKCkKLSAgLy8gdmFyaWFudHMuCi0gIElOTCBzdGF0aWMgdm9pZCBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdpcmVUeXBlIHR5cGUsIG91dHB1dCk7Ci0KLSAgLy8gV3JpdGUgZmllbGRzLCB3aXRob3V0IHRhZ3MuCi0gIElOTCBzdGF0aWMgdm9pZCBXcml0ZUludDMyTm9UYWcgICAoaW50MzIgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdm9pZCBXcml0ZUludDY0Tm9UYWcgICAoaW50NjQgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdm9pZCBXcml0ZVVJbnQzMk5vVGFnICAodWludDMyIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHZvaWQgV3JpdGVVSW50NjROb1RhZyAgKHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlU0ludDMyTm9UYWcgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlU0ludDY0Tm9UYWcgIChpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQzMk5vVGFnICh1aW50MzIgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdm9pZCBXcml0ZUZpeGVkNjROb1RhZyAodWludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHZvaWQgV3JpdGVTRml4ZWQzMk5vVGFnKGludDMyIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHZvaWQgV3JpdGVTRml4ZWQ2NE5vVGFnKGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHZvaWQgV3JpdGVGbG9hdE5vVGFnICAgKGZsb2F0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHZvaWQgV3JpdGVEb3VibGVOb1RhZyAgKGRvdWJsZSB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlQm9vbE5vVGFnICAgIChib29sIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHZvaWQgV3JpdGVFbnVtTm9UYWcgICAgKGludCB2YWx1ZSwgb3V0cHV0KTsKLQotICAvLyBXcml0ZSBmaWVsZHMsIGluY2x1ZGluZyB0YWdzLgotICBzdGF0aWMgdm9pZCBXcml0ZUludDMyICAgKGZpZWxkX251bWJlciwgIGludDMyIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZUludDY0ICAgKGZpZWxkX251bWJlciwgIGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZVVJbnQzMiAgKGZpZWxkX251bWJlciwgdWludDMyIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZVVJbnQ2NCAgKGZpZWxkX251bWJlciwgdWludDY0IHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZVNJbnQzMiAgKGZpZWxkX251bWJlciwgIGludDMyIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZVNJbnQ2NCAgKGZpZWxkX251bWJlciwgIGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZUZpeGVkMzIgKGZpZWxkX251bWJlciwgdWludDMyIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZUZpeGVkNjQgKGZpZWxkX251bWJlciwgdWludDY0IHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDMyKGZpZWxkX251bWJlciwgIGludDMyIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDY0KGZpZWxkX251bWJlciwgIGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZUZsb2F0ICAgKGZpZWxkX251bWJlciwgIGZsb2F0IHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZURvdWJsZSAgKGZpZWxkX251bWJlciwgZG91YmxlIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZUJvb2wgICAgKGZpZWxkX251bWJlciwgICBib29sIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZUVudW0gICAgKGZpZWxkX251bWJlciwgICAgaW50IHZhbHVlLCBvdXRwdXQpOwotCi0gIHN0YXRpYyB2b2lkIFdyaXRlU3RyaW5nKGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgb3V0cHV0KTsKLSAgc3RhdGljIHZvaWQgV3JpdGVCeXRlcyAoZmllbGRfbnVtYmVyLCBjb25zdCBzdHJpbmcmIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKLSAgICAgIGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgb3V0cHV0KTsKLSAgc3RhdGljIHZvaWQgV3JpdGVCeXRlc01heWJlQWxpYXNlZCgKLSAgICAgIGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgb3V0cHV0KTsKLQotICBzdGF0aWMgdm9pZCBXcml0ZUdyb3VwKAotICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZU1lc3NhZ2UoCi0gICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCk7Ci0gIC8vIExpa2UgYWJvdmUsIGJ1dCB0aGVzZSB3aWxsIGNoZWNrIGlmIHRoZSBvdXRwdXQgc3RyZWFtIGhhcyBlbm91Z2gKLSAgLy8gc3BhY2UgdG8gd3JpdGUgZGlyZWN0bHkgdG8gYSBmbGF0IGFycmF5LgotICBzdGF0aWMgdm9pZCBXcml0ZUdyb3VwTWF5YmVUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOwotICBzdGF0aWMgdm9pZCBXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCk7Ci0KLSAgLy8gTGlrZSBhYm92ZSwgYnV0IGRlLXZpcnR1YWxpemUgdGhlIGNhbGwgdG8gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuICBUaGUKLSAgLy8gcG9pbnRlciBtdXN0IHBvaW50IGF0IGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VUeXBlLCAqbm90KiBhIHN1YmNsYXNzIChvcgotICAvLyB0aGUgc3ViY2xhc3MgbXVzdCBub3Qgb3ZlcnJpZGUgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkpLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KLSAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlR3JvdXBOb1ZpcnR1YWwoCi0gICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUsIG91dHB1dCk7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgotICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsKAotICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpOwotCi0jdW5kZWYgb3V0cHV0Ci0jZGVmaW5lIG91dHB1dCB1aW50OCogdGFyZ2V0Ci0KLSAgLy8gTGlrZSBhYm92ZSwgYnV0IHVzZSBvbmx5ICpUb0FycmF5IG1ldGhvZHMgb2YgQ29kZWRPdXRwdXRTdHJlYW0uCi0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdpcmVUeXBlIHR5cGUsIG91dHB1dCk7Ci0KLSAgLy8gV3JpdGUgZmllbGRzLCB3aXRob3V0IHRhZ3MuCi0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkgICAoaW50MzIgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlSW50NjROb1RhZ1RvQXJyYXkgICAoaW50NjQgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlVUludDMyTm9UYWdUb0FycmF5ICAodWludDMyIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVVJbnQ2NE5vVGFnVG9BcnJheSAgKHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVTSW50NjROb1RhZ1RvQXJyYXkgIChpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5ICh1aW50MzIgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSAodWludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVNGaXhlZDMyTm9UYWdUb0FycmF5KGludDMyIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVNGaXhlZDY0Tm9UYWdUb0FycmF5KGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5ICAgKGZsb2F0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZURvdWJsZU5vVGFnVG9BcnJheSAgKGRvdWJsZSB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVCb29sTm9UYWdUb0FycmF5ICAgIChib29sIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkgICAgKGludCB2YWx1ZSwgb3V0cHV0KTsKLQotICAvLyBXcml0ZSBmaWVsZHMsIGluY2x1ZGluZyB0YWdzLgotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUludDMyVG9BcnJheShmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUludDY0VG9BcnJheShmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVVJbnQzMlRvQXJyYXkoZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlVUludDY0VG9BcnJheShmaWVsZF9udW1iZXIsIHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKLSAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVTSW50MzJUb0FycmF5KGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlU0ludDY0VG9BcnJheShmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUZpeGVkMzJUb0FycmF5KGZpZWxkX251bWJlciwgdWludDMyIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUZpeGVkNjRUb0FycmF5KGZpZWxkX251bWJlciwgdWludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVNGaXhlZDMyVG9BcnJheShmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVNGaXhlZDY0VG9BcnJheShmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUZsb2F0VG9BcnJheShmaWVsZF9udW1iZXIsIGZsb2F0IHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZURvdWJsZVRvQXJyYXkoZmllbGRfbnVtYmVyLCBkb3VibGUgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlQm9vbFRvQXJyYXkoZmllbGRfbnVtYmVyLCBib29sIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUVudW1Ub0FycmF5KGZpZWxkX251bWJlciwgaW50IHZhbHVlLCBvdXRwdXQpOwotCi0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlU3RyaW5nVG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCk7Ci0gIElOTCBzdGF0aWMgdWludDgqIFdyaXRlQnl0ZXNUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgb3V0cHV0KTsKLQotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUdyb3VwVG9BcnJheSgKLSAgICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOwotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZU1lc3NhZ2VUb0FycmF5KAotICAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCk7Ci0KLSAgLy8gTGlrZSBhYm92ZSwgYnV0IGRlLXZpcnR1YWxpemUgdGhlIGNhbGwgdG8gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuICBUaGUKLSAgLy8gcG9pbnRlciBtdXN0IHBvaW50IGF0IGFuIGluc3RhbmNlIG9mIE1lc3NhZ2VUeXBlLCAqbm90KiBhIHN1YmNsYXNzIChvcgotICAvLyB0aGUgc3ViY2xhc3MgbXVzdCBub3Qgb3ZlcnJpZGUgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkpLgotICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KLSAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVHcm91cE5vVmlydHVhbFRvQXJyYXkoCi0gICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUsIG91dHB1dCk7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgotICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpOwotCi0jdW5kZWYgb3V0cHV0Ci0jdW5kZWYgaW5wdXQKLSN1bmRlZiBJTkwKLQotI3VuZGVmIGZpZWxkX251bWJlcgotCi0gIC8vIENvbXB1dGUgdGhlIGJ5dGUgc2l6ZSBvZiBhIGZpZWxkLiAgVGhlIFh4U2l6ZSgpIGZ1bmN0aW9ucyBkbyBOT1QgaW5jbHVkZQotICAvLyB0aGUgdGFnLCBzbyB5b3UgbXVzdCBhbHNvIGNhbGwgVGFnU2l6ZSgpLiAgKFRoaXMgaXMgYmVjYXVzZSwgZm9yIHJlcGVhdGVkCi0gIC8vIGZpZWxkcywgeW91IHNob3VsZCBvbmx5IGNhbGwgVGFnU2l6ZSgpIG9uY2UgYW5kIG11bHRpcGx5IGl0IGJ5IHRoZSBlbGVtZW50Ci0gIC8vIGNvdW50LCBidXQgeW91IG1heSBoYXZlIHRvIGNhbGwgWHhTaXplKCkgZm9yIGVhY2ggaW5kaXZpZHVhbCBlbGVtZW50LikKLSAgc3RhdGljIGlubGluZSBpbnQgSW50MzJTaXplICAgKCBpbnQzMiB2YWx1ZSk7Ci0gIHN0YXRpYyBpbmxpbmUgaW50IEludDY0U2l6ZSAgICggaW50NjQgdmFsdWUpOwotICBzdGF0aWMgaW5saW5lIGludCBVSW50MzJTaXplICAodWludDMyIHZhbHVlKTsKLSAgc3RhdGljIGlubGluZSBpbnQgVUludDY0U2l6ZSAgKHVpbnQ2NCB2YWx1ZSk7Ci0gIHN0YXRpYyBpbmxpbmUgaW50IFNJbnQzMlNpemUgICggaW50MzIgdmFsdWUpOwotICBzdGF0aWMgaW5saW5lIGludCBTSW50NjRTaXplICAoIGludDY0IHZhbHVlKTsKLSAgc3RhdGljIGlubGluZSBpbnQgRW51bVNpemUgICAgKCAgIGludCB2YWx1ZSk7Ci0KLSAgLy8gVGhlc2UgdHlwZXMgYWx3YXlzIGhhdmUgdGhlIHNhbWUgc2l6ZS4KLSAgc3RhdGljIGNvbnN0IGludCBrRml4ZWQzMlNpemUgID0gNDsKLSAgc3RhdGljIGNvbnN0IGludCBrRml4ZWQ2NFNpemUgID0gODsKLSAgc3RhdGljIGNvbnN0IGludCBrU0ZpeGVkMzJTaXplID0gNDsKLSAgc3RhdGljIGNvbnN0IGludCBrU0ZpeGVkNjRTaXplID0gODsKLSAgc3RhdGljIGNvbnN0IGludCBrRmxvYXRTaXplICAgID0gNDsKLSAgc3RhdGljIGNvbnN0IGludCBrRG91YmxlU2l6ZSAgID0gODsKLSAgc3RhdGljIGNvbnN0IGludCBrQm9vbFNpemUgICAgID0gMTsKLQotICBzdGF0aWMgaW5saW5lIGludCBTdHJpbmdTaXplKGNvbnN0IHN0cmluZyYgdmFsdWUpOwotICBzdGF0aWMgaW5saW5lIGludCBCeXRlc1NpemUgKGNvbnN0IHN0cmluZyYgdmFsdWUpOwotCi0gIHN0YXRpYyBpbmxpbmUgaW50IEdyb3VwU2l6ZSAgKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSk7Ci0gIHN0YXRpYyBpbmxpbmUgaW50IE1lc3NhZ2VTaXplKGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSk7Ci0KLSAgLy8gTGlrZSBhYm92ZSwgYnV0IGRlLXZpcnR1YWxpemUgdGhlIGNhbGwgdG8gQnl0ZVNpemUoKS4gIFRoZQotICAvLyBwb2ludGVyIG11c3QgcG9pbnQgYXQgYW4gaW5zdGFuY2Ugb2YgTWVzc2FnZVR5cGUsICpub3QqIGEgc3ViY2xhc3MgKG9yCi0gIC8vIHRoZSBzdWJjbGFzcyBtdXN0IG5vdCBvdmVycmlkZSBCeXRlU2l6ZSgpKS4KLSAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgaW50IEdyb3VwU2l6ZU5vVmlydHVhbCAgKGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSk7Ci0gIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgotICBzdGF0aWMgaW5saW5lIGludCBNZXNzYWdlU2l6ZU5vVmlydHVhbChjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUpOwotCi0gIC8vIEdpdmVuIHRoZSBsZW5ndGggb2YgZGF0YSwgY2FsY3VsYXRlIHRoZSBieXRlIHNpemUgb2YgdGhlIGRhdGEgb24gdGhlCi0gIC8vIHdpcmUgaWYgd2UgZW5jb2RlIHRoZSBkYXRhIGFzIGEgbGVuZ3RoIGRlbGltaXRlZCBmaWVsZC4KLSAgc3RhdGljIGlubGluZSBpbnQgTGVuZ3RoRGVsaW1pdGVkU2l6ZShpbnQgbGVuZ3RoKTsKLQotIHByaXZhdGU6Ci0gIC8vIEEgaGVscGVyIG1ldGhvZCBmb3IgdGhlIHJlcGVhdGVkIHByaW1pdGl2ZSByZWFkZXIuIFRoaXMgbWV0aG9kIGhhcwotICAvLyBvcHRpbWl6YXRpb25zIGZvciBwcmltaXRpdmUgdHlwZXMgdGhhdCBoYXZlIGZpeGVkIHNpemUgb24gdGhlIHdpcmUsIGFuZAotICAvLyBjYW4gYmUgcmVhZCB1c2luZyBwb3RlbnRpYWxseSBmYXN0ZXIgcGF0aHMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSAgc3RhdGljIGJvb2wgUmVhZFJlcGVhdGVkRml4ZWRTaXplUHJpbWl0aXZlKAotICAgICAgaW50IHRhZ19zaXplLAotICAgICAgdWludDMyIHRhZywKLSAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7Ci0KLSAgLy8gTGlrZSBSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmUgYnV0IGZvciBwYWNrZWQgcHJpbWl0aXZlIGZpZWxkcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQotICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRml4ZWRTaXplUHJpbWl0aXZlKGdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpOwotCi0gIHN0YXRpYyBjb25zdCBDcHBUeXBlIGtGaWVsZFR5cGVUb0NwcFR5cGVNYXBbXTsKLSAgc3RhdGljIGNvbnN0IFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBrV2lyZVR5cGVGb3JGaWVsZFR5cGVbXTsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2lyZUZvcm1hdExpdGUpOwotfTsKLQotLy8gQSBjbGFzcyB3aGljaCBkZWFscyB3aXRoIHVua25vd24gdmFsdWVzLiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24ganVzdAotLy8gZGlzY2FyZHMgdGhlbS4gIFdpcmVGb3JtYXQgZGVmaW5lcyBhIHN1YmNsYXNzIHdoaWNoIHdyaXRlcyB0byBhbgotLy8gVW5rbm93bkZpZWxkU2V0LiAgVGhpcyBjbGFzcyBpcyB1c2VkIGJ5IEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCgpLCBzaW5jZQotLy8gRXh0ZW5zaW9uU2V0IGlzIHBhcnQgb2YgdGhlIGxpdGUgbGlicmFyeSBidXQgVW5rbm93bkZpZWxkU2V0IGlzIG5vdC4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWVsZFNraXBwZXIgewotIHB1YmxpYzoKLSAgRmllbGRTa2lwcGVyKCkge30KLSAgdmlydHVhbCB+RmllbGRTa2lwcGVyKCkge30KLQotICAvLyBTa2lwIGEgZmllbGQgd2hvc2UgdGFnIGhhcyBhbHJlYWR5IGJlZW4gY29uc3VtZWQuCi0gIHZpcnR1YWwgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKTsKLQotICAvLyBTa2lwIGFuIGVudGlyZSBtZXNzYWdlIG9yIGdyb3VwLCB1cCB0byBhbiBlbmQtZ3JvdXAgdGFnICh3aGljaCBpcyBjb25zdW1lZCkKLSAgLy8gb3IgZW5kLW9mLXN0cmVhbS4KLSAgdmlydHVhbCBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7Ci0KLSAgLy8gRGVhbCB3aXRoIGFuIGFscmVhZHktcGFyc2VkIHVucmVjb2duaXplZCBlbnVtIHZhbHVlLiAgVGhlIGRlZmF1bHQKLSAgLy8gaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBidXQgdGhlIFVua25vd25GaWVsZFNldC1iYXNlZCBpbXBsZW1lbnRhdGlvbgotICAvLyBzYXZlcyBpdCBhcyBhbiB1bmtub3duIHZhcmludC4KLSAgdmlydHVhbCB2b2lkIFNraXBVbmtub3duRW51bShpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUpOwotfTsKLQotLy8gU3ViY2xhc3Mgb2YgRmllbGRTa2lwcGVyIHdoaWNoIHNhdmVzIHNraXBwZWQgZmllbGRzIHRvIGEgQ29kZWRPdXRwdXRTdHJlYW0uCi0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlciA6IHB1YmxpYyBGaWVsZFNraXBwZXIgewotIHB1YmxpYzoKLSAgZXhwbGljaXQgQ29kZWRPdXRwdXRTdHJlYW1GaWVsZFNraXBwZXIoaW86OkNvZGVkT3V0cHV0U3RyZWFtKiB1bmtub3duX2ZpZWxkcykKLSAgICAgIDogdW5rbm93bl9maWVsZHNfKHVua25vd25fZmllbGRzKSB7fQotICB2aXJ0dWFsIH5Db2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcigpIHt9Ci0KLSAgLy8gaW1wbGVtZW50cyBGaWVsZFNraXBwZXIgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgdmlydHVhbCBib29sIFNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcpOwotICB2aXJ0dWFsIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKLSAgdmlydHVhbCB2b2lkIFNraXBVbmtub3duRW51bShpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUpOwotCi0gcHJvdGVjdGVkOgotICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHVua25vd25fZmllbGRzXzsKLX07Ci0KLQotLy8gaW5saW5lIG1ldGhvZHMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1pbmxpbmUgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUKLVdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGVUb0NwcFR5cGUoRmllbGRUeXBlIHR5cGUpIHsKLSAgcmV0dXJuIGtGaWVsZFR5cGVUb0NwcFR5cGVNYXBbdHlwZV07Ci19Ci0KLWlubGluZSB1aW50MzIgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoaW50IGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSkgewotICByZXR1cm4gR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX01BS0VfVEFHKGZpZWxkX251bWJlciwgdHlwZSk7Ci19Ci0KLWlubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHVpbnQzMiB0YWcpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFdpcmVUeXBlPih0YWcgJiBrVGFnVHlwZU1hc2spOwotfQotCi1pbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih1aW50MzIgdGFnKSB7Ci0gIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRhZyA+PiBrVGFnVHlwZUJpdHMpOwotfQotCi1pbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdHlwZSkgewotICBpbnQgcmVzdWx0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgZmllbGRfbnVtYmVyIDw8IGtUYWdUeXBlQml0cyk7Ci0gIGlmICh0eXBlID09IFRZUEVfR1JPVVApIHsKLSAgICAvLyBHcm91cHMgaGF2ZSBib3RoIGEgc3RhcnQgYW5kIGFuIGVuZCB0YWcuCi0gICAgcmV0dXJuIHJlc3VsdCAqIDI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQotCi1pbmxpbmUgdWludDMyIFdpcmVGb3JtYXRMaXRlOjpFbmNvZGVGbG9hdChmbG9hdCB2YWx1ZSkgewotICB1bmlvbiB7ZmxvYXQgZjsgdWludDMyIGk7fTsKLSAgZiA9IHZhbHVlOwotICByZXR1cm4gaTsKLX0KLQotaW5saW5lIGZsb2F0IFdpcmVGb3JtYXRMaXRlOjpEZWNvZGVGbG9hdCh1aW50MzIgdmFsdWUpIHsKLSAgdW5pb24ge2Zsb2F0IGY7IHVpbnQzMiBpO307Ci0gIGkgPSB2YWx1ZTsKLSAgcmV0dXJuIGY7Ci19Ci0KLWlubGluZSB1aW50NjQgV2lyZUZvcm1hdExpdGU6OkVuY29kZURvdWJsZShkb3VibGUgdmFsdWUpIHsKLSAgdW5pb24ge2RvdWJsZSBmOyB1aW50NjQgaTt9OwotICBmID0gdmFsdWU7Ci0gIHJldHVybiBpOwotfQotCi1pbmxpbmUgZG91YmxlIFdpcmVGb3JtYXRMaXRlOjpEZWNvZGVEb3VibGUodWludDY0IHZhbHVlKSB7Ci0gIHVuaW9uIHtkb3VibGUgZjsgdWludDY0IGk7fTsKLSAgaSA9IHZhbHVlOwotICByZXR1cm4gZjsKLX0KLQotLy8gWmlnWmFnIFRyYW5zZm9ybTogIEVuY29kZXMgc2lnbmVkIGludGVnZXJzIHNvIHRoYXQgdGhleSBjYW4gYmUKLS8vIGVmZmVjdGl2ZWx5IHVzZWQgd2l0aCB2YXJpbnQgZW5jb2RpbmcuCi0vLwotLy8gdmFyaW50IG9wZXJhdGVzIG9uIHVuc2lnbmVkIGludGVnZXJzLCBlbmNvZGluZyBzbWFsbGVyIG51bWJlcnMgaW50bwotLy8gZmV3ZXIgYnl0ZXMuICBJZiB5b3UgdHJ5IHRvIHVzZSBpdCBvbiBhIHNpZ25lZCBpbnRlZ2VyLCBpdCB3aWxsIHRyZWF0Ci0vLyB0aGlzIG51bWJlciBhcyBhIHZlcnkgbGFyZ2UgdW5zaWduZWQgaW50ZWdlciwgd2hpY2ggbWVhbnMgdGhhdCBldmVuCi0vLyBzbWFsbCBzaWduZWQgbnVtYmVycyBsaWtlIC0xIHdpbGwgdGFrZSB0aGUgbWF4aW11bSBudW1iZXIgb2YgYnl0ZXMKLS8vICgxMCkgdG8gZW5jb2RlLiAgWmlnWmFnRW5jb2RlKCkgbWFwcyBzaWduZWQgaW50ZWdlcnMgdG8gdW5zaWduZWQKLS8vIGluIHN1Y2ggYSB3YXkgdGhhdCB0aG9zZSB3aXRoIGEgc21hbGwgYWJzb2x1dGUgdmFsdWUgd2lsbCBoYXZlIHNtYWxsZXIKLS8vIGVuY29kZWQgdmFsdWVzLCBtYWtpbmcgdGhlbSBhcHByb3ByaWF0ZSBmb3IgZW5jb2RpbmcgdXNpbmcgdmFyaW50LgotLy8KLS8vICAgICAgIGludDMyIC0+ICAgICB1aW50MzIKLS8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vICAgICAgICAgICAwIC0+ICAgICAgICAgIDAKLS8vICAgICAgICAgIC0xIC0+ICAgICAgICAgIDEKLS8vICAgICAgICAgICAxIC0+ICAgICAgICAgIDIKLS8vICAgICAgICAgIC0yIC0+ICAgICAgICAgIDMKLS8vICAgICAgICAgLi4uIC0+ICAgICAgICAuLi4KLS8vICAyMTQ3NDgzNjQ3IC0+IDQyOTQ5NjcyOTQKLS8vIC0yMTQ3NDgzNjQ4IC0+IDQyOTQ5NjcyOTUKLS8vCi0vLyAgICAgICAgPj4gZW5jb2RlID4+Ci0vLyAgICAgICAgPDwgZGVjb2RlIDw8Ci0KLWlubGluZSB1aW50MzIgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0VuY29kZTMyKGludDMyIG4pIHsKLSAgLy8gTm90ZTogIHRoZSByaWdodC1zaGlmdCBtdXN0IGJlIGFyaXRobWV0aWMKLSAgcmV0dXJuIChzdGF0aWNfY2FzdDx1aW50MzI+KG4pIDw8IDEpIF4gKG4gPj4gMzEpOwotfQotCi1pbmxpbmUgaW50MzIgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTMyKHVpbnQzMiBuKSB7Ci0gIHJldHVybiAobiA+PiAxKSBeIC1zdGF0aWNfY2FzdDxpbnQzMj4obiAmIDEpOwotfQotCi1pbmxpbmUgdWludDY0IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdFbmNvZGU2NChpbnQ2NCBuKSB7Ci0gIC8vIE5vdGU6ICB0aGUgcmlnaHQtc2hpZnQgbXVzdCBiZSBhcml0aG1ldGljCi0gIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDY0PihuKSA8PCAxKSBeIChuID4+IDYzKTsKLX0KLQotaW5saW5lIGludDY0IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGU2NCh1aW50NjQgbikgewotICByZXR1cm4gKG4gPj4gMSkgXiAtc3RhdGljX2Nhc3Q8aW50NjQ+KG4gJiAxKTsKLX0KLQotLy8gU3RyaW5nIGlzIGZvciBVVEYtOCB0ZXh0IG9ubHksIGJ1dCwgZXZlbiBzbywgUmVhZFN0cmluZygpIGNhbiBzaW1wbHkKLS8vIGNhbGwgUmVhZEJ5dGVzKCkuCi0KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmFsdWUpIHsKLSAgcmV0dXJuIFJlYWRCeXRlcyhpbnB1dCwgdmFsdWUpOwotfQotCi1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZyhpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqKiBwKSB7Ci0gIHJldHVybiBSZWFkQnl0ZXMoaW5wdXQsIHApOwotfQotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3YmNlMjFjLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaAorKysgL2Rldi9udWxsCkBAIC0xLDg3OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gICAgICAgICB3aW5rQGdvb2dsZS5jb20gKFdpbmsgU2F2aWxsZSkgKHJlZmFjdG9yZWQgZnJvbSB3aXJlX2Zvcm1hdC5oKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0xJVEVfSU5MX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9JTkxfSF9fCi0KLSNpZmRlZiBfTVNDX1ZFUgotLy8gVGhpcyBpcyByZXF1aXJlZCBmb3IgbWluL21heCBvbiBWUzIwMTMgb25seS4KLSNpbmNsdWRlIDxhbGdvcml0aG0+Ci0jZW5kaWYKLQotI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+Ci0KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gSW1wbGVtZW50YXRpb24gZGV0YWlscyBvZiBSZWFkUHJpbWl0aXZlLgotCi10ZW1wbGF0ZSA8PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50MzIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgaW50MzIqIHZhbHVlKSB7Ci0gIHVpbnQzMiB0ZW1wOwotICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnRlbXApKSByZXR1cm4gZmFsc2U7Ci0gICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyPih0ZW1wKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50NjQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDY0PigKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgaW50NjQqIHZhbHVlKSB7Ci0gIHVpbnQ2NCB0ZW1wOwotICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnRlbXApKSByZXR1cm4gZmFsc2U7Ci0gICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0Pih0ZW1wKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8dWludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9VSU5UMzI+KAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICB1aW50MzIqIHZhbHVlKSB7Ci0gIHJldHVybiBpbnB1dC0+UmVhZFZhcmludDMyKHZhbHVlKTsKLX0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTx1aW50NjQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1VJTlQ2ND4oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIHVpbnQ2NCogdmFsdWUpIHsKLSAgcmV0dXJuIGlucHV0LT5SZWFkVmFyaW50NjQodmFsdWUpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TSU5UMzI+KAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICBpbnQzMiogdmFsdWUpIHsKLSAgdWludDMyIHRlbXA7Ci0gIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmdGVtcCkpIHJldHVybiBmYWxzZTsKLSAgKnZhbHVlID0gWmlnWmFnRGVjb2RlMzIodGVtcCk7Ci0gIHJldHVybiB0cnVlOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDY0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TSU5UNjQ+KAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICBpbnQ2NCogdmFsdWUpIHsKLSAgdWludDY0IHRlbXA7Ci0gIGlmICghaW5wdXQtPlJlYWRWYXJpbnQ2NCgmdGVtcCkpIHJldHVybiBmYWxzZTsKLSAgKnZhbHVlID0gWmlnWmFnRGVjb2RlNjQodGVtcCk7Ci0gIHJldHVybiB0cnVlOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQzMj4oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIHVpbnQzMiogdmFsdWUpIHsKLSAgcmV0dXJuIGlucHV0LT5SZWFkTGl0dGxlRW5kaWFuMzIodmFsdWUpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPHVpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQ2ND4oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIHVpbnQ2NCogdmFsdWUpIHsKLSAgcmV0dXJuIGlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQodmFsdWUpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQzMj4oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIGludDMyKiB2YWx1ZSkgewotICB1aW50MzIgdGVtcDsKLSAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOwotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQzMj4odGVtcCk7Ci0gIHJldHVybiB0cnVlOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGludDY0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQ2ND4oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIGludDY0KiB2YWx1ZSkgewotICB1aW50NjQgdGVtcDsKLSAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOwotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odGVtcCk7Ci0gIHJldHVybiB0cnVlOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGZsb2F0LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9GTE9BVD4oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIGZsb2F0KiB2YWx1ZSkgewotICB1aW50MzIgdGVtcDsKLSAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOwotICAqdmFsdWUgPSBEZWNvZGVGbG9hdCh0ZW1wKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ZG91YmxlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICBkb3VibGUqIHZhbHVlKSB7Ci0gIHVpbnQ2NCB0ZW1wOwotICBpZiAoIWlucHV0LT5SZWFkTGl0dGxlRW5kaWFuNjQoJnRlbXApKSByZXR1cm4gZmFsc2U7Ci0gICp2YWx1ZSA9IERlY29kZURvdWJsZSh0ZW1wKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8Ym9vbCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIGJvb2wqIHZhbHVlKSB7Ci0gIHVpbnQ2NCB0ZW1wOwotICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnRlbXApKSByZXR1cm4gZmFsc2U7Ci0gICp2YWx1ZSA9IHRlbXAgIT0gMDsKLSAgcmV0dXJuIHRydWU7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgaW50KiB2YWx1ZSkgewotICB1aW50MzIgdGVtcDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOwotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ+KHRlbXApOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8Ci0gIHVpbnQzMiwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQzMj4oCi0gICAgY29uc3QgdWludDgqIGJ1ZmZlciwKLSAgICB1aW50MzIqIHZhbHVlKSB7Ci0gIHJldHVybiBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjMyRnJvbUFycmF5KGJ1ZmZlciwgdmFsdWUpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8Ci0gIHVpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRklYRUQ2ND4oCi0gICAgY29uc3QgdWludDgqIGJ1ZmZlciwKLSAgICB1aW50NjQqIHZhbHVlKSB7Ci0gIHJldHVybiBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KGJ1ZmZlciwgdmFsdWUpOwotfQotdGVtcGxhdGUgPD4KLWlubGluZSBjb25zdCB1aW50OCogV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmVGcm9tQXJyYXk8Ci0gIGludDMyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TRklYRUQzMj4oCi0gICAgY29uc3QgdWludDgqIGJ1ZmZlciwKLSAgICBpbnQzMiogdmFsdWUpIHsKLSAgdWludDMyIHRlbXA7Ci0gIGJ1ZmZlciA9IGlvOjpDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzJGcm9tQXJyYXkoYnVmZmVyLCAmdGVtcCk7Ci0gICp2YWx1ZSA9IHN0YXRpY19jYXN0PGludDMyPih0ZW1wKTsKLSAgcmV0dXJuIGJ1ZmZlcjsKLX0KLXRlbXBsYXRlIDw+Ci1pbmxpbmUgY29uc3QgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlRnJvbUFycmF5PAotICBpbnQ2NCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfU0ZJWEVENjQ+KAotICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCi0gICAgaW50NjQqIHZhbHVlKSB7Ci0gIHVpbnQ2NCB0ZW1wOwotICBidWZmZXIgPSBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0RnJvbUFycmF5KGJ1ZmZlciwgJnRlbXApOwotICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odGVtcCk7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZUZyb21BcnJheTwKLSAgZmxvYXQsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0ZMT0FUPigKLSAgICBjb25zdCB1aW50OCogYnVmZmVyLAotICAgIGZsb2F0KiB2YWx1ZSkgewotICB1aW50MzIgdGVtcDsKLSAgYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW4zMkZyb21BcnJheShidWZmZXIsICZ0ZW1wKTsKLSAgKnZhbHVlID0gRGVjb2RlRmxvYXQodGVtcCk7Ci0gIHJldHVybiBidWZmZXI7Ci19Ci10ZW1wbGF0ZSA8PgotaW5saW5lIGNvbnN0IHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZUZyb21BcnJheTwKLSAgZG91YmxlLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9ET1VCTEU+KAotICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCi0gICAgZG91YmxlKiB2YWx1ZSkgewotICB1aW50NjQgdGVtcDsKLSAgYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OlJlYWRMaXR0bGVFbmRpYW42NEZyb21BcnJheShidWZmZXIsICZ0ZW1wKTsKLSAgKnZhbHVlID0gRGVjb2RlRG91YmxlKHRlbXApOwotICByZXR1cm4gYnVmZmVyOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlKAotICAgIGludCwgIC8vIHRhZ19zaXplLCB1bnVzZWQuCi0gICAgdWludDMyIHRhZywKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgewotICBDVHlwZSB2YWx1ZTsKLSAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gIHZhbHVlcy0+QWRkKHZhbHVlKTsKLSAgaW50IGVsZW1lbnRzX2FscmVhZHlfcmVzZXJ2ZWQgPSB2YWx1ZXMtPkNhcGFjaXR5KCkgLSB2YWx1ZXMtPnNpemUoKTsKLSAgd2hpbGUgKGVsZW1lbnRzX2FscmVhZHlfcmVzZXJ2ZWQgPiAwICYmIGlucHV0LT5FeHBlY3RUYWcodGFnKSkgewotICAgIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgIHZhbHVlcy0+QWRkQWxyZWFkeVJlc2VydmVkKHZhbHVlKTsKLSAgICBlbGVtZW50c19hbHJlYWR5X3Jlc2VydmVkLS07Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmUoCi0gICAgaW50IHRhZ19zaXplLAotICAgIHVpbnQzMiB0YWcsCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZXMpIHsKLSAgR09PR0xFX0RDSEVDS19FUShVSW50MzJTaXplKHRhZyksIHRhZ19zaXplKTsKLSAgQ1R5cGUgdmFsdWU7Ci0gIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIHZhbHVlcy0+QWRkKHZhbHVlKTsKLQotICAvLyBGb3IgZml4ZWQgc2l6ZSB2YWx1ZXMsIHJlcGVhdGVkIHZhbHVlcyBjYW4gYmUgcmVhZCBtb3JlIHF1aWNrbHkgYnkKLSAgLy8gcmVhZGluZyBkaXJlY3RseSBmcm9tIGEgcmF3IGFycmF5LgotICAvLwotICAvLyBXZSBjYW4gZ2V0IGEgdGlnaHQgbG9vcCBieSBvbmx5IHJlYWRpbmcgYXMgbWFueSBlbGVtZW50cyBhcyBjYW4gYmUKLSAgLy8gYWRkZWQgdG8gdGhlIFJlcGVhdGVkRmllbGQgd2l0aG91dCBoYXZpbmcgdG8gZG8gYW55IHJlc2l6aW5nLiBBZGRpdGlvbmFsbHksCi0gIC8vIHdlIG9ubHkgdHJ5IHRvIHJlYWQgYXMgbWFueSBlbGVtZW50cyBhcyBhcmUgYXZhaWxhYmxlIGZyb20gdGhlIGN1cnJlbnQKLSAgLy8gYnVmZmVyIHNwYWNlLiBEb2luZyBzbyBhdm9pZHMgaGF2aW5nIHRvIHBlcmZvcm0gYm91bmRhcnkgY2hlY2tzIHdoZW4KLSAgLy8gcmVhZGluZyB0aGUgdmFsdWU6IHRoZSBtYXhpbXVtIG51bWJlciBvZiBlbGVtZW50cyB0aGF0IGNhbiBiZSByZWFkIGlzCi0gIC8vIGtub3duIG91dHNpZGUgb2YgdGhlIGxvb3AuCi0gIGNvbnN0IHZvaWQqIHZvaWRfcG9pbnRlcjsKLSAgaW50IHNpemU7Ci0gIGlucHV0LT5HZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKCZ2b2lkX3BvaW50ZXIsICZzaXplKTsKLSAgaWYgKHNpemUgPiAwKSB7Ci0gICAgY29uc3QgdWludDgqIGJ1ZmZlciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPih2b2lkX3BvaW50ZXIpOwotICAgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgZWFjaCB0eXBlIG9jY3VwaWVzIG9uIHRoZSB3aXJlLgotICAgIGNvbnN0IGludCBwZXJfdmFsdWVfc2l6ZSA9IHRhZ19zaXplICsgc2l6ZW9mKHZhbHVlKTsKLQotICAgIGludCBlbGVtZW50c19hdmFpbGFibGUgPQotICAgICAgICBzdGQ6Om1pbih2YWx1ZXMtPkNhcGFjaXR5KCkgLSB2YWx1ZXMtPnNpemUoKSwgc2l6ZSAvIHBlcl92YWx1ZV9zaXplKTsKLSAgICBpbnQgbnVtX3JlYWQgPSAwOwotICAgIHdoaWxlIChudW1fcmVhZCA8IGVsZW1lbnRzX2F2YWlsYWJsZSAmJgotICAgICAgICAgICAoYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZ0Zyb21BcnJheSgKLSAgICAgICAgICAgICAgIGJ1ZmZlciwgdGFnKSkgIT0gTlVMTCkgewotICAgICAgYnVmZmVyID0gUmVhZFByaW1pdGl2ZUZyb21BcnJheTxDVHlwZSwgRGVjbGFyZWRUeXBlPihidWZmZXIsICZ2YWx1ZSk7Ci0gICAgICB2YWx1ZXMtPkFkZEFscmVhZHlSZXNlcnZlZCh2YWx1ZSk7Ci0gICAgICArK251bV9yZWFkOwotICAgIH0KLSAgICBjb25zdCBpbnQgcmVhZF9ieXRlcyA9IG51bV9yZWFkICogcGVyX3ZhbHVlX3NpemU7Ci0gICAgaWYgKHJlYWRfYnl0ZXMgPiAwKSB7Ci0gICAgICBpbnB1dC0+U2tpcChyZWFkX2J5dGVzKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNwZWNpYWxpemF0aW9ucyBvZiBSZWFkUmVwZWF0ZWRQcmltaXRpdmUgZm9yIHRoZSBmaXhlZCBzaXplIHR5cGVzLCB3aGljaCB1c2UKLS8vIHRoZSBvcHRpbWl6ZWQgY29kZSBwYXRoLgotI2RlZmluZSBSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKENQUFRZUEUsIERFQ0xBUkVEX1RZUEUpICAgICAgICAgICAgIFwKLXRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlPCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBDUFBUWVBFLCBXaXJlRm9ybWF0TGl0ZTo6REVDTEFSRURfVFlQRT4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQgdGFnX3NpemUsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgdWludDMyIHRhZywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBSZXBlYXRlZEZpZWxkPENQUFRZUEU+KiB2YWx1ZXMpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHJldHVybiBSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIENQUFRZUEUsIFdpcmVGb3JtYXRMaXRlOjpERUNMQVJFRF9UWVBFPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIHRhZ19zaXplLCB0YWcsIGlucHV0LCB2YWx1ZXMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi19Ci0KLVJFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUodWludDMyLCBUWVBFX0ZJWEVEMzIpCi1SRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQ2NCwgVFlQRV9GSVhFRDY0KQotUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShpbnQzMiwgVFlQRV9TRklYRUQzMikKLVJFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoaW50NjQsIFRZUEVfU0ZJWEVENjQpCi1SRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGZsb2F0LCBUWVBFX0ZMT0FUKQotUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShkb3VibGUsIFRZUEVfRE9VQkxFKQotCi0jdW5kZWYgUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci1ib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZSgKLSAgICBpbnQgdGFnX3NpemUsCi0gICAgdWludDMyIHRhZywKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKSB7Ci0gIHJldHVybiBSZWFkUmVwZWF0ZWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oCi0gICAgICB0YWdfc2l6ZSwgdGFnLCBpbnB1dCwgdmFsdWUpOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWVzKSB7Ci0gIHVpbnQzMiBsZW5ndGg7Ci0gIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICBpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQgbGltaXQgPSBpbnB1dC0+UHVzaExpbWl0KGxlbmd0aCk7Ci0gIHdoaWxlIChpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgQ1R5cGUgdmFsdWU7Ci0gICAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgdmFsdWVzLT5BZGQodmFsdWUpOwotICB9Ci0gIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7Ci0gIHJldHVybiB0cnVlOwotfQotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZEZpeGVkU2l6ZVByaW1pdGl2ZSgKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZXMpIHsKLSAgdWludDMyIGxlbmd0aDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIGNvbnN0IHVpbnQzMiBvbGRfZW50cmllcyA9IHZhbHVlcy0+c2l6ZSgpOwotICBjb25zdCB1aW50MzIgbmV3X2VudHJpZXMgPSBsZW5ndGggLyBzaXplb2YoQ1R5cGUpOwotICBjb25zdCB1aW50MzIgbmV3X2J5dGVzID0gbmV3X2VudHJpZXMgKiBzaXplb2YoQ1R5cGUpOwotICBpZiAobmV3X2J5dGVzICE9IGxlbmd0aCkgcmV0dXJuIGZhbHNlOwotICAvLyBXZSB3b3VsZCAqbGlrZSogdG8gcHJlLWFsbG9jYXRlIHRoZSBidWZmZXIgdG8gd3JpdGUgaW50byAoZm9yCi0gIC8vIHNwZWVkKSwgYnV0ICptdXN0KiBhdm9pZCBwZXJmb3JtaW5nIGEgdmVyeSBsYXJnZSBhbGxvY2F0aW9uIGR1ZQotICAvLyB0byBhIG1hbGljaW91cyB1c2VyLXN1cHBsaWVkICJsZW5ndGgiIGFib3ZlLiAgU28gd2UgaGF2ZSBhIGZhc3QKLSAgLy8gcGF0aCB0aGF0IHByZS1hbGxvY2F0ZXMgd2hlbiB0aGUgImxlbmd0aCIgaXMgbGVzcyB0aGFuIGEgYm91bmQuCi0gIC8vIFdlIGRldGVybWluZSB0aGUgYm91bmQgYnkgY2FsbGluZyBCeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkgYW5kCi0gIC8vIEJ5dGVzVW50aWxMaW1pdCgpLiAgVGhlc2UgcmV0dXJuIC0xIHRvIG1lYW4gIm5vIGxpbWl0IHNldCIuCi0gIC8vIFRoZXJlIGFyZSBmb3VyIGNhc2VzOgotICAvLyBUb3RhbEJ5dGVzTGltaXQgIExpbWl0Ci0gIC8vIC0xICAgICAgICAgICAgICAgLTEgICAgIFVzZSBzbG93IHBhdGguCi0gIC8vIC0xICAgICAgICAgICAgICAgPj0gMCAgIFVzZSBmYXN0IHBhdGggaWYgbGVuZ3RoIDw9IExpbWl0LgotICAvLyA+PSAwICAgICAgICAgICAgIC0xICAgICBVc2Ugc2xvdyBwYXRoLgotICAvLyA+PSAwICAgICAgICAgICAgID49IDAgICBVc2UgZmFzdCBwYXRoIGlmIGxlbmd0aCA8PSBtaW4oYm90aCBsaW1pdHMpLgotICBpbnQ2NCBieXRlc19saW1pdCA9IGlucHV0LT5CeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCk7Ci0gIGlmIChieXRlc19saW1pdCA9PSAtMSkgewotICAgIGJ5dGVzX2xpbWl0ID0gaW5wdXQtPkJ5dGVzVW50aWxMaW1pdCgpOwotICB9IGVsc2UgewotICAgIGJ5dGVzX2xpbWl0ID0KLSAgICAgICAgc3RkOjptaW4oYnl0ZXNfbGltaXQsIHN0YXRpY19jYXN0PGludDY0PihpbnB1dC0+Qnl0ZXNVbnRpbExpbWl0KCkpKTsKLSAgfQotICBpZiAoYnl0ZXNfbGltaXQgPj0gbmV3X2J5dGVzKSB7Ci0gICAgLy8gRmFzdC1wYXRoIHRoYXQgcHJlLWFsbG9jYXRlcyAqdmFsdWVzIHRvIHRoZSBmaW5hbCBzaXplLgotI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKLSAgICB2YWx1ZXMtPlJlc2l6ZShvbGRfZW50cmllcyArIG5ld19lbnRyaWVzLCAwKTsKLSAgICAvLyB2YWx1ZXMtPm11dGFibGVfZGF0YSgpIG1heSBjaGFuZ2UgYWZ0ZXIgUmVzaXplKCksIHNvIGRvIHRoaXMgYWZ0ZXI6Ci0gICAgdm9pZCogZGVzdCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KHZhbHVlcy0+bXV0YWJsZV9kYXRhKCkgKyBvbGRfZW50cmllcyk7Ci0gICAgaWYgKCFpbnB1dC0+UmVhZFJhdyhkZXN0LCBuZXdfYnl0ZXMpKSB7Ci0gICAgICB2YWx1ZXMtPlRydW5jYXRlKG9sZF9lbnRyaWVzKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0jZWxzZQotICAgIHZhbHVlcy0+UmVzZXJ2ZShvbGRfZW50cmllcyArIG5ld19lbnRyaWVzKTsKLSAgICBDVHlwZSB2YWx1ZTsKLSAgICBmb3IgKHVpbnQzMiBpID0gMDsgaSA8IG5ld19lbnRyaWVzOyArK2kpIHsKLSAgICAgIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgdmFsdWVzLT5BZGRBbHJlYWR5UmVzZXJ2ZWQodmFsdWUpOwotICAgIH0KLSNlbmRpZgotICB9IGVsc2UgewotICAgIC8vIFRoaXMgaXMgdGhlIHNsb3ctcGF0aCBjYXNlIHdoZXJlICJsZW5ndGgiIG1heSBiZSB0b28gbGFyZ2UgdG8KLSAgICAvLyBzYWZlbHkgYWxsb2NhdGUuICBXZSByZWFkIGFzIG11Y2ggYXMgd2UgY2FuIGludG8gKnZhbHVlcwotICAgIC8vIHdpdGhvdXQgcHJlLWFsbG9jYXRpbmcgImxlbmd0aCIgYnl0ZXMuCi0gICAgQ1R5cGUgdmFsdWU7Ci0gICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuZXdfZW50cmllczsgKytpKSB7Ci0gICAgICBpZiAoIVJlYWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIHZhbHVlcy0+QWRkKHZhbHVlKTsKLSAgICB9Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIFNwZWNpYWxpemF0aW9ucyBvZiBSZWFkUGFja2VkUHJpbWl0aXZlIGZvciB0aGUgZml4ZWQgc2l6ZSB0eXBlcywgd2hpY2ggdXNlCi0vLyBhbiBvcHRpbWl6ZWQgY29kZSBwYXRoLgotI2RlZmluZSBSRUFEX1JFUEVBVEVEX1BBQ0tFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShDUFBUWVBFLCBERUNMQVJFRF9UWVBFKSAgICAgIFwKLXRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZTwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBDUFBUWVBFLCBXaXJlRm9ybWF0TGl0ZTo6REVDTEFSRURfVFlQRT4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgUmVwZWF0ZWRGaWVsZDxDUFBUWVBFPiogdmFsdWVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICByZXR1cm4gUmVhZFBhY2tlZEZpeGVkU2l6ZVByaW1pdGl2ZTwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIENQUFRZUEUsIFdpcmVGb3JtYXRMaXRlOjpERUNMQVJFRF9UWVBFPihpbnB1dCwgdmFsdWVzKTsgICAgICAgICAgICAgICAgICBcCi19Ci0KLVJFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQzMiwgVFlQRV9GSVhFRDMyKQotUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUodWludDY0LCBUWVBFX0ZJWEVENjQpCi1SRUFEX1JFUEVBVEVEX1BBQ0tFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShpbnQzMiwgVFlQRV9TRklYRUQzMikKLVJFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGludDY0LCBUWVBFX1NGSVhFRDY0KQotUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUoZmxvYXQsIFRZUEVfRkxPQVQpCi1SRUFEX1JFUEVBVEVEX1BBQ0tFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShkb3VibGUsIFRZUEVfRE9VQkxFKQotCi0jdW5kZWYgUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgotYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZFByaW1pdGl2ZU5vSW5saW5lKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWVzKSB7Ci0gIHJldHVybiBSZWFkUGFja2VkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCB2YWx1ZXMpOwotfQotCi0KLQotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRHcm91cChpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiB2YWx1ZSkgewotICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7Ci0gIGlmICghdmFsdWUtPk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCkpIHJldHVybiBmYWxzZTsKLSAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgbGFzdCB0aGluZyByZWFkIHdhcyBhbiBlbmQgdGFnIGZvciB0aGlzIGdyb3VwLgotICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKE1ha2VUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVApKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIHZhbHVlKSB7Ci0gIHVpbnQzMiBsZW5ndGg7Ci0gIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICBzdGQ6OnBhaXI8aW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0LCBpbnQ+IHAgPQotICAgICAgaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUHVzaExpbWl0KGxlbmd0aCk7Ci0gIGlmIChwLnNlY29uZCA8IDAgfHwgIXZhbHVlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKSByZXR1cm4gZmFsc2U7Ci0gIC8vIE1ha2Ugc3VyZSB0aGF0IHBhcnNpbmcgc3RvcHBlZCB3aGVuIHRoZSBsaW1pdCB3YXMgaGl0LCBub3QgYXQgYW4gZW5kZ3JvdXAKLSAgLy8gdGFnLgotICByZXR1cm4gaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUG9wTGltaXQocC5maXJzdCk7Ci19Ci0KLS8vIFdlIG5hbWUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBzb21ldGhpbmcgbG9uZyBhbmQgZXh0cmVtZWx5IHVubGlrZWx5IHRvIG9jY3VyCi0vLyBlbHNld2hlcmUgYmVjYXVzZSBhICpxdWFsaWZpZWQqIG1lbWJlciBhY2Nlc3MgZXhwcmVzc2lvbiBkZXNpZ25lZCB0byBhdm9pZAotLy8gdmlydHVhbCBkaXNwYXRjaCwgQysrMDMgW2Jhc2ljLmxvb2t1cC5jbGFzc3JlZl0gMy40LjUvNCByZXF1aXJlcyB0aGF0IHRoZQotLy8gbmFtZSBvZiB0aGUgcXVhbGlmeWluZyBjbGFzcyB0byBiZSBsb29rZWQgdXAgYm90aCBpbiB0aGUgY29udGV4dCBvZiB0aGUgZnVsbAotLy8gZXhwcmVzc2lvbiAoZmluZGluZyB0aGUgdGVtcGxhdGUgcGFyYW1ldGVyKSBhbmQgaW4gdGhlIGNvbnRleHQgb2YgdGhlIG9iamVjdAotLy8gd2hvc2UgbWVtYmVyIHdlIGFyZSBhY2Nlc3NpbmcuIFRoaXMgY291bGQgcG90ZW50aWFsbHkgZmluZCBhIG5lc3RlZCB0eXBlCi0vLyB3aXRoaW4gdGhhdCBvYmplY3QuIFRoZSBzdGFuZGFyZCBnb2VzIG9uIHRvIHJlcXVpcmUgdGhlc2UgbmFtZXMgdG8gcmVmZXIgdG8KLS8vIHRoZSBzYW1lIGVudGl0eSwgd2hpY2ggdGhpcyBjb2xsaXNpb24gd291bGQgdmlvbGF0ZS4gVGhlIGxhY2sgb2YgYSBzYWZlIHdheQotLy8gdG8gYXZvaWQgdGhpcyBjb2xsaXNpb24gYXBwZWFycyB0byBiZSBhIGRlZmVjdCBpbiB0aGUgc3RhbmRhcmQsIGJ1dCB1bnRpbCBpdAotLy8gaXMgY29ycmVjdGVkLCB3ZSBjaG9vc2UgdGhlIG5hbWUgdG8gYXZvaWQgYWNjaWRlbnRhbCBjb2xsaXNpb25zLgotdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KLWlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkR3JvdXBOb1ZpcnR1YWwoCi0gICAgaW50IGZpZWxkX251bWJlciwgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QqIHZhbHVlKSB7Ci0gIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKLSAgaWYgKCF2YWx1ZS0+Ci0gICAgICBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKQotICAgIHJldHVybiBmYWxzZTsKLSAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gIC8vIE1ha2Ugc3VyZSB0aGUgbGFzdCB0aGluZyByZWFkIHdhcyBhbiBlbmQgdGFnIGZvciB0aGlzIGdyb3VwLgotICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKE1ha2VUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9FTkRfR1JPVVApKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICByZXR1cm4gdHJ1ZTsKLX0KLXRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+Ci1pbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICBpbnQgZmllbGRfbnVtYmVyLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCogdmFsdWUpIHsKLSAgcmV0dXJuIHZhbHVlLT5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjoKLSAgICAgICAgICAgICBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpICYmCi0gICAgICAgICBpbnB1dC0+TGFzdFRhZ1dhcyhNYWtlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQKSk7Ci19Ci10ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCogdmFsdWUpIHsKLSAgdWludDMyIGxlbmd0aDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIHN0ZDo6cGFpcjxpbzo6Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQsIGludD4gcCA9Ci0gICAgICBpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQdXNoTGltaXQobGVuZ3RoKTsKLSAgaWYgKHAuc2Vjb25kIDwgMCB8fCAhdmFsdWUtPgotICAgICAgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkKLSAgICByZXR1cm4gZmFsc2U7Ci0gIC8vIE1ha2Ugc3VyZSB0aGF0IHBhcnNpbmcgc3RvcHBlZCB3aGVuIHRoZSBsaW1pdCB3YXMgaGl0LCBub3QgYXQgYW4gZW5kZ3JvdXAKLSAgLy8gdGFnLgotICByZXR1cm4gaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUG9wTGltaXQocC5maXJzdCk7Ci19Ci10ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QqIHZhbHVlKSB7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBvbGRfbGltaXQgPSBpbnB1dC0+UmVhZExlbmd0aEFuZFB1c2hMaW1pdCgpOwotICBpZiAoIXZhbHVlLT4KLSAgICAgIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCkpCi0gICAgcmV0dXJuIGZhbHNlOwotICAvLyBNYWtlIHN1cmUgdGhhdCBwYXJzaW5nIHN0b3BwZWQgd2hlbiB0aGUgbGltaXQgd2FzIGhpdCwgbm90IGF0IGFuIGVuZGdyb3VwCi0gIC8vIHRhZy4KLSAgcmV0dXJuIGlucHV0LT5DaGVja0VudGlyZU1lc3NhZ2VDb25zdW1lZEFuZFBvcExpbWl0KG9sZF9saW1pdCk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKGludCBmaWVsZF9udW1iZXIsIFdpcmVUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgb3V0cHV0LT5Xcml0ZVRhZyhNYWtlVGFnKGZpZWxkX251bWJlciwgdHlwZSkpOwotfQotCi1pbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnKGludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBvdXRwdXQtPldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQodmFsdWUpOwotfQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjROb1RhZyhpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgb3V0cHV0LT5Xcml0ZVZhcmludDY0KHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpKTsKLX0KLWlubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMk5vVGFnKHVpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjROb1RhZyh1aW50NjQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBvdXRwdXQtPldyaXRlVmFyaW50NjQodmFsdWUpOwotfQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDMyTm9UYWcoaW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBvdXRwdXQtPldyaXRlVmFyaW50MzIoWmlnWmFnRW5jb2RlMzIodmFsdWUpKTsKLX0KLWlubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NE5vVGFnKGludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgb3V0cHV0LT5Xcml0ZVZhcmludDY0KFppZ1phZ0VuY29kZTY0KHZhbHVlKSk7Ci19Ci1pbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyTm9UYWcodWludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0Tm9UYWcodWludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW42NCh2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMk5vVGFnKGludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIoc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZSkpOwotfQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjROb1RhZyhpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjY0KHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpKTsKLX0KLWlubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZsb2F0Tm9UYWcoZmxvYXQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihFbmNvZGVGbG9hdCh2YWx1ZSkpOwotfQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlTm9UYWcoZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgb3V0cHV0LT5Xcml0ZUxpdHRsZUVuZGlhbjY0KEVuY29kZURvdWJsZSh2YWx1ZSkpOwotfQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbE5vVGFnKGJvb2wgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHZhbHVlID8gMSA6IDApOwotfQotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnKGludCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgewotICBvdXRwdXQtPldyaXRlVmFyaW50MzJTaWduRXh0ZW5kZWQodmFsdWUpOwotfQotCi0vLyBTZWUgY29tbWVudCBvbiBSZWFkR3JvdXBOb1ZpcnR1YWwgdG8gdW5kZXJzdGFuZCB0aGUgbmVlZCBmb3IgdGhpcyB0ZW1wbGF0ZQotLy8gcGFyYW1ldGVyIG5hbWUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgotaW5saW5lIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlR3JvdXBOb1ZpcnR1YWwoCi0gICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCwgb3V0cHV0KTsKLSAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG91dHB1dCk7Ci0gIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQLCBvdXRwdXQpOwotfQotdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KLWlubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgaW50IGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCYgdmFsdWUsCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOwotICBvdXRwdXQtPldyaXRlVmFyaW50MzIoCi0gICAgICB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpHZXRDYWNoZWRTaXplKCkpOwotICB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMob3V0cHV0KTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KE1ha2VUYWcoZmllbGRfbnVtYmVyLCB0eXBlKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci19Ci0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZ1RvQXJyYXkoaW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZFRvQXJyYXkodmFsdWUsIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0Tm9UYWdUb0FycmF5KGludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50NjRUb0FycmF5KAotICAgICAgc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSksIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSh1aW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjROb1RhZ1RvQXJyYXkodWludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ludDMyTm9UYWdUb0FycmF5KGludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShaaWdaYWdFbmNvZGUzMih2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQ2NE5vVGFnVG9BcnJheShpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQ2NFRvQXJyYXkoWmlnWmFnRW5jb2RlNjQodmFsdWUpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5KHVpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuMzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDY0Tm9UYWdUb0FycmF5KHVpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheShpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheSgKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQ2NE5vVGFnVG9BcnJheShpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjY0VG9BcnJheSgKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQ2ND4odmFsdWUpLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGbG9hdE5vVGFnVG9BcnJheShmbG9hdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyVG9BcnJheShFbmNvZGVGbG9hdCh2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZURvdWJsZU5vVGFnVG9BcnJheShkb3VibGUgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlTGl0dGxlRW5kaWFuNjRUb0FycmF5KEVuY29kZURvdWJsZSh2YWx1ZSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xOb1RhZ1RvQXJyYXkoYm9vbCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlID8gMSA6IDAsIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZ1RvQXJyYXkoaW50IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlNpZ25FeHRlbmRlZFRvQXJyYXkodmFsdWUsIHRhcmdldCk7Ci19Ci0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOwotICByZXR1cm4gV3JpdGVJbnQzMk5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlSW50NjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOwotICByZXR1cm4gV3JpdGVJbnQ2NE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKLSAgcmV0dXJuIFdyaXRlVUludDMyTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCB0YXJnZXQpOwotICByZXR1cm4gV3JpdGVVSW50NjROb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVNJbnQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQzMiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKLSAgcmV0dXJuIFdyaXRlU0ludDMyTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTSW50NjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9WQVJJTlQsIHRhcmdldCk7Ci0gIHJldHVybiBXcml0ZVNJbnQ2NE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIHRhcmdldCk7Ci0gIHJldHVybiBXcml0ZUZpeGVkMzJOb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZpeGVkNjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDY0LCB0YXJnZXQpOwotICByZXR1cm4gV3JpdGVGaXhlZDY0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTRml4ZWQzMlRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDMyIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9GSVhFRDMyLCB0YXJnZXQpOwotICByZXR1cm4gV3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlU0ZpeGVkNjRUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgdGFyZ2V0KTsKLSAgcmV0dXJuIFdyaXRlU0ZpeGVkNjROb1RhZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Ci19Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUZsb2F0VG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmxvYXQgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0ZJWEVEMzIsIHRhcmdldCk7Ci0gIHJldHVybiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG91YmxlIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRklYRUQ2NCwgdGFyZ2V0KTsKLSAgcmV0dXJuIFdyaXRlRG91YmxlTm9UYWdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKLSAgcmV0dXJuIFdyaXRlQm9vbE5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoaW50IGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1ZBUklOVCwgdGFyZ2V0KTsKLSAgcmV0dXJuIFdyaXRlRW51bU5vVGFnVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5Ci0gIC8vIFdBUk5JTkc6ICBJbiB3aXJlX2Zvcm1hdC5jYywgYm90aCBzdHJpbmdzIGFuZCBieXRlcyBhcmUgaGFuZGxlZCBieQotICAvLyAgIFdyaXRlU3RyaW5nKCkgdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4gIElmIHRoZSBpbXBsZW1lbnRhdGlvbnMgYmVjb21lCi0gIC8vICAgZGlmZmVyZW50LCB5b3Ugd2lsbCBuZWVkIHRvIHVwZGF0ZSB0aGF0IHVzYWdlLgotICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOwotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZ1dpdGhTaXplVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLWlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXNUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOwotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZ1dpdGhTaXplVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKLX0KLQotCi1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUdyb3VwVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9TVEFSVF9HUk9VUCwgdGFyZ2V0KTsKLSAgdGFyZ2V0ID0gdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOwotICByZXR1cm4gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQLCB0YXJnZXQpOwotfQotaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlVG9BcnJheShpbnQgZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKLSAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKLSAgICB2YWx1ZS5HZXRDYWNoZWRTaXplKCksIHRhcmdldCk7Ci0gIHJldHVybiB2YWx1ZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7Ci19Ci0KLS8vIFNlZSBjb21tZW50IG9uIFJlYWRHcm91cE5vVmlydHVhbCB0byB1bmRlcnN0YW5kIHRoZSBuZWVkIGZvciB0aGlzIHRlbXBsYXRlCi0vLyBwYXJhbWV0ZXIgbmFtZS4KLXRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUdyb3VwTm9WaXJ0dWFsVG9BcnJheSgKLSAgICBpbnQgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0JiB2YWx1ZSwKLSAgICB1aW50OCogdGFyZ2V0KSB7Ci0gIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX1NUQVJUX0dST1VQLCB0YXJnZXQpOwotICB0YXJnZXQgPSB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0Ci0gICAgICA6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKLSAgcmV0dXJuIFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0VORF9HUk9VUCwgdGFyZ2V0KTsKLX0KLXRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+Ci1pbmxpbmUgdWludDgqIFdpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlLAotICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKLSAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKLSAgICB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpHZXRDYWNoZWRTaXplKCksIHRhcmdldCk7Ci0gIHJldHVybiB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0Ci0gICAgICA6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKLX0KLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1pbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoaW50MzIgdmFsdWUpIHsKLSAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyU2lnbkV4dGVuZGVkKHZhbHVlKTsKLX0KLWlubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OkludDY0U2l6ZShpbnQ2NCB2YWx1ZSkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQoc3RhdGljX2Nhc3Q8dWludDY0Pih2YWx1ZSkpOwotfQotaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6VUludDMyU2l6ZSh1aW50MzIgdmFsdWUpIHsKLSAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHZhbHVlKTsKLX0KLWlubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OlVJbnQ2NFNpemUodWludDY0IHZhbHVlKSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemU2NCh2YWx1ZSk7Ci19Ci1pbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpTSW50MzJTaXplKGludDMyIHZhbHVlKSB7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihaaWdaYWdFbmNvZGUzMih2YWx1ZSkpOwotfQotaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6U0ludDY0U2l6ZShpbnQ2NCB2YWx1ZSkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQoWmlnWmFnRW5jb2RlNjQodmFsdWUpKTsKLX0KLWlubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6OkVudW1TaXplKGludCB2YWx1ZSkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzJTaWduRXh0ZW5kZWQodmFsdWUpOwotfQotCi1pbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oCi0gICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlLnNpemUoKSkpICsKLSAgICAgIHZhbHVlLnNpemUoKSk7Ci19Ci1pbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigKLSAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUuc2l6ZSgpKSkgKwotICAgICAgdmFsdWUuc2l6ZSgpKTsKLX0KLQotCi1pbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpHcm91cFNpemUoY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZS5CeXRlU2l6ZSgpOwotfQotaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlKSB7Ci0gIHJldHVybiBMZW5ndGhEZWxpbWl0ZWRTaXplKHZhbHVlLkJ5dGVTaXplKCkpOwotfQotCi0vLyBTZWUgY29tbWVudCBvbiBSZWFkR3JvdXBOb1ZpcnR1YWwgdG8gdW5kZXJzdGFuZCB0aGUgbmVlZCBmb3IgdGhpcyB0ZW1wbGF0ZQotLy8gcGFyYW1ldGVyIG5hbWUuCi10ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgotaW5saW5lIGludCBXaXJlRm9ybWF0TGl0ZTo6R3JvdXBTaXplTm9WaXJ0dWFsKAotICAgIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlKSB7Ci0gIHJldHVybiB2YWx1ZS5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpCeXRlU2l6ZSgpOwotfQotdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdD4KLWlubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgIGNvbnN0IE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3QmIHZhbHVlKSB7Ci0gIHJldHVybiBMZW5ndGhEZWxpbWl0ZWRTaXplKAotICAgICAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6Qnl0ZVNpemUoKSk7Ci19Ci0KLWlubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6Okxlbmd0aERlbGltaXRlZFNpemUoaW50IGxlbmd0aCkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobGVuZ3RoKSArIGxlbmd0aDsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9JTkxfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGU0YWRkNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTI4OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5Ci0vLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wYi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXRfd2lyZV9mb3JtYXQucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+Ci0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KLSNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgaW50ZXJuYWwgewotbmFtZXNwYWNlIHsKLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgRW51bXNJblN5bmMpIHsKLSAgLy8gVmVyaWZ5IHRoYXQgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBhbmQgV2lyZUZvcm1hdExpdGU6OkNwcFR5cGUgbWF0Y2gKLSAgLy8gRmllbGREZXNjcmlwdG9yOjpUeXBlIGFuZCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUuCi0KLSAgRVhQRUNUX0VRKGltcGxpY2l0X2Nhc3Q8aW50PihGaWVsZERlc2NyaXB0b3I6Ok1BWF9UWVBFKSwKLSAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEUpKTsKLSAgRVhQRUNUX0VRKGltcGxpY2l0X2Nhc3Q8aW50PihGaWVsZERlc2NyaXB0b3I6Ok1BWF9DUFBUWVBFKSwKLSAgICAgICAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihXaXJlRm9ybWF0TGl0ZTo6TUFYX0NQUFRZUEUpKTsKLQotICBmb3IgKGludCBpID0gMTsgaSA8PSBXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEU7IGkrKykgewotICAgIEVYUEVDVF9FUSgKLSAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihGaWVsZERlc2NyaXB0b3I6OlR5cGVUb0NwcFR5cGUoCi0gICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4oaSkpKSwKLSAgICAgIGltcGxpY2l0X2Nhc3Q8aW50PihXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlVG9DcHBUeXBlKAotICAgICAgICBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlPihpKSkpKTsKLSAgfQotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBNYXhGaWVsZE51bWJlcikgewotICAvLyBNYWtlIHN1cmUgdGhlIG1heCBmaWVsZCBudW1iZXIgY29uc3RhbnQgaXMgYWNjdXJhdGUuCi0gIEVYUEVDVF9FUSgoMSA8PCAoMzIgLSBXaXJlRm9ybWF0TGl0ZTo6a1RhZ1R5cGVCaXRzKSkgLSAxLAotICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2UpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBzb3VyY2UsIGRlc3Q7Ci0gIHN0cmluZyBkYXRhOwotCi0gIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJnNvdXJjZSk7Ci0gIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7Ci0KLSAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOwotICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKLQotICAvLyBDaGVjay4KLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc1NldChkZXN0KTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VFeHRlbnNpb25zKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBzb3VyY2UsIGRlc3Q7Ci0gIHN0cmluZyBkYXRhOwotCi0gIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZzb3VyY2UpOwotICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotCi0gIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCi0gIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKLSAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7Ci0KLSAgLy8gQ2hlY2suCi0gIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KGRlc3QpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVBhY2tlZCkgewotICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZSwgZGVzdDsKLSAgc3RyaW5nIGRhdGE7Ci0KLSAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmc291cmNlKTsKLSAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLQotICAvLyBQYXJzZSB1c2luZyBXaXJlRm9ybWF0LgotICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLSAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7Ci0gIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmRlc3QpOwotCi0gIC8vIENoZWNrLgotICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3QpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVBhY2tlZEZyb21VbnBhY2tlZCkgewotICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgotICB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMgc291cmNlOwotICBUZXN0VXRpbDo6U2V0VW5wYWNrZWRGaWVsZHMoJnNvdXJjZSk7Ci0gIHN0cmluZyBkYXRhID0gc291cmNlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0KLSAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBkZXN0OwotICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLSAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7Ci0gIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgJmRlc3QpOwotCi0gIC8vIENoZWNrLgotICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRmllbGRzU2V0KGRlc3QpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVVucGFja2VkRnJvbVBhY2tlZCkgewotICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgotICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHNvdXJjZTsKLSAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmc291cmNlKTsKLSAgc3RyaW5nIGRhdGEgPSBzb3VyY2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLQotICAvLyBQYXJzZSB1c2luZyBXaXJlRm9ybWF0LgotICB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMgZGVzdDsKLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOwotICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKLQotICAvLyBDaGVjay4KLSAgVGVzdFV0aWw6OkV4cGVjdFVucGFja2VkRmllbGRzU2V0KGRlc3QpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZVBhY2tlZEV4dGVuc2lvbnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIHNvdXJjZSwgZGVzdDsKLSAgc3RyaW5nIGRhdGE7Ci0KLSAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJnNvdXJjZSk7Ci0gIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7Ci0KLSAgLy8gUGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOwotICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZkZXN0KTsKLQotICAvLyBDaGVjay4KLSAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoZGVzdCk7Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlT25lb2YpIHsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgc291cmNlLCBkZXN0OwotICBzdHJpbmcgZGF0YTsKLQotICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgotICBUZXN0VXRpbDo6U2V0T25lb2YxKCZzb3VyY2UpOwotICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotCi0gIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCi0gIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKLSAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7Ci0KLSAgLy8gQ2hlY2suCi0gIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEoZGVzdCk7Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIE9uZW9mT25seVNldExhc3QpIHsKLSAgdW5pdHRlc3Q6OlRlc3RPbmVvZkJhY2t3YXJkc0NvbXBhdGlibGUgc291cmNlOwotICB1bml0dGVzdDo6VGVzdE9uZW9mIG9uZW9mX2Rlc3Q7Ci0gIHN0cmluZyBkYXRhOwotCi0gIC8vIFNldCB0d28gZmllbGRzCi0gIHNvdXJjZS5zZXRfZm9vX2ludCgxMDApOwotICBzb3VyY2Uuc2V0X2Zvb19zdHJpbmcoIjEwMSIpOwotCi0gIC8vIFNlcmlhbGl6ZSBhbmQgcGFyc2UgdG8gb25lb2YgbWVzc2FnZS4KLSAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOwotICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZvbmVvZl9kZXN0KTsKLQotICAvLyBPbmx5IHRoZSBsYXN0IGZpZWxkIGlzIHNldC4KLSAgRVhQRUNUX0ZBTFNFKG9uZW9mX2Rlc3QuaGFzX2Zvb19pbnQoKSk7Ci0gIEVYUEVDVF9UUlVFKG9uZW9mX2Rlc3QuaGFzX2Zvb19zdHJpbmcoKSk7Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIEJ5dGVTaXplKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7Ci0KLSAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemUoKSwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOwotICBtZXNzYWdlLkNsZWFyKCk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBCeXRlU2l6ZUV4dGVuc2lvbnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0gIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlKTsKLQotICBFWFBFQ1RfRVEobWVzc2FnZS5CeXRlU2l6ZSgpLAotICAgICAgICAgICAgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOwotICBtZXNzYWdlLkNsZWFyKCk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkJ5dGVTaXplKCkpOwotICBFWFBFQ1RfRVEoMCwgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBCeXRlU2l6ZVBhY2tlZCkgewotICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2U7Ci0gIFRlc3RVdGlsOjpTZXRQYWNrZWRGaWVsZHMoJm1lc3NhZ2UpOwotCi0gIEVYUEVDVF9FUShtZXNzYWdlLkJ5dGVTaXplKCksIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKLSAgbWVzc2FnZS5DbGVhcigpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgQnl0ZVNpemVQYWNrZWRFeHRlbnNpb25zKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlOwotICBUZXN0VXRpbDo6U2V0UGFja2VkRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0KLSAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemUoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKLSAgbWVzc2FnZS5DbGVhcigpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgQnl0ZVNpemVPbmVvZikgewotICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOwotICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlKTsKLQotICBFWFBFQ1RfRVEobWVzc2FnZS5CeXRlU2l6ZSgpLAotICBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7Ci0gIG1lc3NhZ2UuQ2xlYXIoKTsKLQotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5CeXRlU2l6ZSgpKTsKLSAgRVhQRUNUX0VRKDAsIFdpcmVGb3JtYXQ6OkJ5dGVTaXplKG1lc3NhZ2UpKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgc3RyaW5nIGdlbmVyYXRlZF9kYXRhOwotICBzdHJpbmcgZHluYW1pY19kYXRhOwotCi0gIFRlc3RVdGlsOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOwotICBpbnQgc2l6ZSA9IG1lc3NhZ2UuQnl0ZVNpemUoKTsKLQotICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgotICB7Ci0gICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZnZW5lcmF0ZWRfZGF0YSk7Ci0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7Ci0gICAgbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKLSAgfQotCi0gIC8vIFNlcmlhbGl6ZSB1c2luZyBXaXJlRm9ybWF0LgotICB7Ci0gICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZkeW5hbWljX2RhdGEpOwotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOwotICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhtZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKLSAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOwotICB9Ci0KLSAgLy8gU2hvdWxkIGJlIHRoZSBzYW1lLgotICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGhlcmUgYmVjYXVzZSB3ZSdyZSBjb21wYXJpbmcgcmF3IGJpbmFyeSBkYXRhIGFuZAotICAvLyB3ZSByZWFsbHkgZG9uJ3Qgd2FudCBpdCBkdW1wZWQgdG8gc3Rkb3V0IG9uIGZhaWx1cmUuCi0gIEVYUEVDVF9UUlVFKGR5bmFtaWNfZGF0YSA9PSBnZW5lcmF0ZWRfZGF0YSk7Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZUV4dGVuc2lvbnMpIHsKLSAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7Ci0gIHN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKLSAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gIGludCBzaXplID0gbWVzc2FnZS5CeXRlU2l6ZSgpOwotCi0gIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gIHsKLSAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKLSAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKLSAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOwotICB9Ci0KLSAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCi0gIHsKLSAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7Ci0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7Ci0gICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOwotICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7Ci0gIH0KLQotICAvLyBTaG91bGQgYmUgdGhlIHNhbWUuCi0gIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgaGVyZSBiZWNhdXNlIHdlJ3JlIGNvbXBhcmluZyByYXcgYmluYXJ5IGRhdGEgYW5kCi0gIC8vIHdlIHJlYWxseSBkb24ndCB3YW50IGl0IGR1bXBlZCB0byBzdGRvdXQgb24gZmFpbHVyZS4KLSAgRVhQRUNUX1RSVUUoZHluYW1pY19kYXRhID09IGdlbmVyYXRlZF9kYXRhKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplRmllbGRzQW5kRXh0ZW5zaW9ucykgewotICB1bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIG1lc3NhZ2U7Ci0gIHN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKLSAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygmbWVzc2FnZSk7Ci0gIGludCBzaXplID0gbWVzc2FnZS5CeXRlU2l6ZSgpOwotCi0gIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gIHsKLSAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmdlbmVyYXRlZF9kYXRhKTsKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKLSAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKLSAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOwotICB9Ci0KLSAgLy8gU2VyaWFsaXplIHVzaW5nIFdpcmVGb3JtYXQuCi0gIHsKLSAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJmR5bmFtaWNfZGF0YSk7Ci0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7Ci0gICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOwotICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7Ci0gIH0KLQotICAvLyBTaG91bGQgYmUgdGhlIHNhbWUuCi0gIC8vIERvbid0IHVzZSBFWFBFQ1RfRVEgaGVyZSBiZWNhdXNlIHdlJ3JlIGNvbXBhcmluZyByYXcgYmluYXJ5IGRhdGEgYW5kCi0gIC8vIHdlIHJlYWxseSBkb24ndCB3YW50IGl0IGR1bXBlZCB0byBzdGRvdXQgb24gZmFpbHVyZS4KLSAgRVhQRUNUX1RSVUUoZHluYW1pY19kYXRhID09IGdlbmVyYXRlZF9kYXRhKTsKLQotICAvLyBTaG91bGQgb3V0cHV0IGluIGNhbm9uaWNhbCBvcmRlci4KLSAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKGR5bmFtaWNfZGF0YSk7Ci0gIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihnZW5lcmF0ZWRfZGF0YSk7Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZU9uZW9mKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7Ci0gIHN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKLSAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKLQotICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlKTsKLSAgaW50IHNpemUgPSBtZXNzYWdlLkJ5dGVTaXplKCk7Ci0KLSAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KLSAgewotICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZ2VuZXJhdGVkX2RhdGEpOwotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOwotICAgIG1lc3NhZ2UuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXQpOwotICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7Ci0gIH0KLQotICAvLyBTZXJpYWxpemUgdXNpbmcgV2lyZUZvcm1hdC4KLSAgewotICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZHluYW1pY19kYXRhKTsKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKLSAgICBXaXJlRm9ybWF0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMobWVzc2FnZSwgc2l6ZSwgJm91dHB1dCk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKLSAgfQotCi0gIC8vIFNob3VsZCBiZSB0aGUgc2FtZS4KLSAgLy8gRG9uJ3QgdXNlIEVYUEVDVF9FUSBoZXJlIGJlY2F1c2Ugd2UncmUgY29tcGFyaW5nIHJhdyBiaW5hcnkgZGF0YSBhbmQKLSAgLy8gd2UgcmVhbGx5IGRvbid0IHdhbnQgaXQgZHVtcGVkIHRvIHN0ZG91dCBvbiBmYWlsdXJlLgotICBFWFBFQ1RfVFJVRShkeW5hbWljX2RhdGEgPT0gZ2VuZXJhdGVkX2RhdGEpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBQYXJzZU11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKSB7Ci0gIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gcGFyc2UgYSBtZXNzYWdlIHRoYXQgY29udGFpbnMgbXVsdGlwbGUgZXh0ZW5zaW9ucyByYW5nZXMuCi0gIHVuaXR0ZXN0OjpUZXN0RmllbGRPcmRlcmluZ3Mgc291cmNlOwotICBzdHJpbmcgZGF0YTsKLQotICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucygmc291cmNlKTsKLSAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLQotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBkZXN0OwotICAgIEVYUEVDVF9UUlVFKGRlc3QuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKLSAgICBFWFBFQ1RfRVEoc291cmNlLkRlYnVnU3RyaW5nKCksIGRlc3QuRGVidWdTdHJpbmcoKSk7Ci0gIH0KLQotICAvLyBBbHNvIHRlc3QgdXNpbmcgcmVmbGVjdGlvbi1iYXNlZCBwYXJzaW5nLgotICB7Ci0gICAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBkZXN0OwotICAgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOwotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZyYXdfaW5wdXQpOwotICAgIEVYUEVDVF9UUlVFKFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZjb2RlZF9pbnB1dCwgJmRlc3QpKTsKLSAgICBFWFBFQ1RfRVEoc291cmNlLkRlYnVnU3RyaW5nKCksIGRlc3QuRGVidWdTdHJpbmcoKSk7Ci0gIH0KLX0KLQotY29uc3QgaW50IGtVbmtub3duVHlwZUlkID0gMTU1MDA1NTsKLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplTWVzc2FnZVNldCkgewotICAvLyBTZXQgdXAgYSBUZXN0TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCi0gIHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKLSAgbWVzc2FnZV9zZXQuTXV0YWJsZUV4dGVuc2lvbigKLSAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLT5zZXRfaSgxMjMpOwotICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKAotICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiktPnNldF9zdHIoImZvbyIpOwotICBtZXNzYWdlX3NldC5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZExlbmd0aERlbGltaXRlZCgKLSAgICBrVW5rbm93blR5cGVJZCwgImJhciIpOwotCi0gIHN0cmluZyBkYXRhOwotICBBU1NFUlRfVFJVRShtZXNzYWdlX3NldC5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOwotCi0gIC8vIFBhcnNlIGJhY2sgdXNpbmcgUmF3TWVzc2FnZVNldCBhbmQgY2hlY2sgdGhlIGNvbnRlbnRzLgotICB1bml0dGVzdDo6UmF3TWVzc2FnZVNldCByYXc7Ci0gIEFTU0VSVF9UUlVFKHJhdy5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotCi0gIEVYUEVDVF9FUSgwLCByYXcudW5rbm93bl9maWVsZHMoKS5maWVsZF9jb3VudCgpKTsKLQotICBBU1NFUlRfRVEoMywgcmF3Lml0ZW1fc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKAotICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6OmRlc2NyaXB0b3IoKS0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSwKLSAgICByYXcuaXRlbSgwKS50eXBlX2lkKCkpOwotICBFWFBFQ1RfRVEoCi0gICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjo6ZGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpLAotICAgIHJhdy5pdGVtKDEpLnR5cGVfaWQoKSk7Ci0gIEVYUEVDVF9FUShrVW5rbm93blR5cGVJZCwgcmF3Lml0ZW0oMikudHlwZV9pZCgpKTsKLQotICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2UxOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlMS5QYXJzZUZyb21TdHJpbmcocmF3Lml0ZW0oMCkubWVzc2FnZSgpKSk7Ci0gIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2UxLmkoKSk7Ci0KLSAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlMjsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKHJhdy5pdGVtKDEpLm1lc3NhZ2UoKSkpOwotICBFWFBFQ1RfRVEoImZvbyIsIG1lc3NhZ2UyLnN0cigpKTsKLQotICBFWFBFQ1RfRVEoImJhciIsIHJhdy5pdGVtKDIpLm1lc3NhZ2UoKSk7Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZU1lc3NhZ2VTZXRWYXJpb3VzV2F5c0FyZUVxdWFsKSB7Ci0gIC8vIFNlcmlhbGl6ZSBhIE1lc3NhZ2VTZXQgdG8gYSBzdHJlYW0gYW5kIHRvIGEgZmxhdCBhcnJheSB1c2luZyBnZW5lcmF0ZWQKLSAgLy8gY29kZSwgYW5kIGFsc28gdXNpbmcgV2lyZUZvcm1hdCwgYW5kIGNoZWNrIHRoYXQgdGhlIHJlc3VsdHMgYXJlIGVxdWFsLgotICAvLyBTZXQgdXAgYSBUZXN0TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUsIGFzCi0gIC8vIGFib3ZlLgotCi0gIHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKLSAgbWVzc2FnZV9zZXQuTXV0YWJsZUV4dGVuc2lvbigKLSAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLT5zZXRfaSgxMjMpOwotICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKAotICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiktPnNldF9zdHIoImZvbyIpOwotICBtZXNzYWdlX3NldC5tdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZExlbmd0aERlbGltaXRlZCgKLSAgICBrVW5rbm93blR5cGVJZCwgImJhciIpOwotCi0gIGludCBzaXplID0gbWVzc2FnZV9zZXQuQnl0ZVNpemUoKTsKLSAgRVhQRUNUX0VRKHNpemUsIG1lc3NhZ2Vfc2V0LkdldENhY2hlZFNpemUoKSk7Ci0gIEFTU0VSVF9FUShzaXplLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlX3NldCkpOwotCi0gIHN0cmluZyBmbGF0X2RhdGE7Ci0gIHN0cmluZyBzdHJlYW1fZGF0YTsKLSAgc3RyaW5nIGR5bmFtaWNfZGF0YTsKLSAgZmxhdF9kYXRhLnJlc2l6ZShzaXplKTsKLSAgc3RyZWFtX2RhdGEucmVzaXplKHNpemUpOwotCi0gIC8vIFNlcmlhbGl6ZSB0byBmbGF0IGFycmF5Ci0gIHsKLSAgICB1aW50OCogdGFyZ2V0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZmxhdF9kYXRhKSk7Ci0gICAgdWludDgqIGVuZCA9IG1lc3NhZ2Vfc2V0LlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkodGFyZ2V0KTsKLSAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gdGFyZ2V0KTsKLSAgfQotCi0gIC8vIFNlcmlhbGl6ZSB0byBidWZmZXIKLSAgewotICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZzdHJlYW1fZGF0YSksIHNpemUsIDEpOwotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOwotICAgIG1lc3NhZ2Vfc2V0LlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gIH0KLQotICAvLyBTZXJpYWxpemUgdG8gYnVmZmVyIHdpdGggV2lyZUZvcm1hdC4KLSAgewotICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gc3RyaW5nX3N0cmVhbSgmZHluYW1pY19kYXRhKTsKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmc3RyaW5nX3N0cmVhbSk7Ci0gICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKG1lc3NhZ2Vfc2V0LCBzaXplLCAmb3V0cHV0X3N0cmVhbSk7Ci0gICAgQVNTRVJUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7Ci0gIH0KLQotICBFWFBFQ1RfVFJVRShmbGF0X2RhdGEgPT0gc3RyZWFtX2RhdGEpOwotICBFWFBFQ1RfVFJVRShmbGF0X2RhdGEgPT0gZHluYW1pY19kYXRhKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VNZXNzYWdlU2V0KSB7Ci0gIC8vIFNldCB1cCBhIFJhd01lc3NhZ2VTZXQgd2l0aCB0d28ga25vd24gbWVzc2FnZXMgYW5kIGFuIHVua25vd24gb25lLgotICB1bml0dGVzdDo6UmF3TWVzc2FnZVNldCByYXc7Ci0KLSAgewotICAgIHVuaXR0ZXN0OjpSYXdNZXNzYWdlU2V0OjpJdGVtKiBpdGVtID0gcmF3LmFkZF9pdGVtKCk7Ci0gICAgaXRlbS0+c2V0X3R5cGVfaWQoCi0gICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjpkZXNjcmlwdG9yKCktPmV4dGVuc2lvbigwKS0+bnVtYmVyKCkpOwotICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgbWVzc2FnZTsKLSAgICBtZXNzYWdlLnNldF9pKDEyMyk7Ci0gICAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZyhpdGVtLT5tdXRhYmxlX21lc3NhZ2UoKSk7Ci0gIH0KLQotICB7Ci0gICAgdW5pdHRlc3Q6OlJhd01lc3NhZ2VTZXQ6Okl0ZW0qIGl0ZW0gPSByYXcuYWRkX2l0ZW0oKTsKLSAgICBpdGVtLT5zZXRfdHlwZV9pZCgKLSAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6OmRlc2NyaXB0b3IoKS0+ZXh0ZW5zaW9uKDApLT5udW1iZXIoKSk7Ci0gICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiBtZXNzYWdlOwotICAgIG1lc3NhZ2Uuc2V0X3N0cigiZm9vIik7Ci0gICAgbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZyhpdGVtLT5tdXRhYmxlX21lc3NhZ2UoKSk7Ci0gIH0KLQotICB7Ci0gICAgdW5pdHRlc3Q6OlJhd01lc3NhZ2VTZXQ6Okl0ZW0qIGl0ZW0gPSByYXcuYWRkX2l0ZW0oKTsKLSAgICBpdGVtLT5zZXRfdHlwZV9pZChrVW5rbm93blR5cGVJZCk7Ci0gICAgaXRlbS0+c2V0X21lc3NhZ2UoImJhciIpOwotICB9Ci0KLSAgc3RyaW5nIGRhdGE7Ci0gIEFTU0VSVF9UUlVFKHJhdy5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOwotCi0gIC8vIFBhcnNlIGFzIGEgVGVzdE1lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KLSAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OwotICBBU1NFUlRfVFJVRShtZXNzYWdlX3NldC5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOwotCi0gIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2Vfc2V0LkdldEV4dGVuc2lvbigKLSAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLmkoKSk7Ci0gIEVYUEVDVF9FUSgiZm9vIiwgbWVzc2FnZV9zZXQuR2V0RXh0ZW5zaW9uKAotICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjI6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikuc3RyKCkpOwotCi0gIEFTU0VSVF9FUSgxLCBtZXNzYWdlX3NldC51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwotICBBU1NFUlRfRVEoVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQsCi0gICAgICAgICAgICBtZXNzYWdlX3NldC51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLnR5cGUoKSk7Ci0gIEVYUEVDVF9FUSgiYmFyIiwgbWVzc2FnZV9zZXQudW5rbm93bl9maWVsZHMoKS5maWVsZCgwKS5sZW5ndGhfZGVsaW1pdGVkKCkpOwotCi0gIC8vIEFsc28gcGFyc2UgdXNpbmcgV2lyZUZvcm1hdC4KLSAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IGR5bmFtaWNfbWVzc2FnZV9zZXQ7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhLmRhdGEoKSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKLSAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZHluYW1pY19tZXNzYWdlX3NldCkpOwotICBFWFBFQ1RfRVEobWVzc2FnZV9zZXQuRGVidWdTdHJpbmcoKSwgZHluYW1pY19tZXNzYWdlX3NldC5EZWJ1Z1N0cmluZygpKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VNZXNzYWdlU2V0V2l0aFJldmVyc2VUYWdPcmRlcikgewotICBzdHJpbmcgZGF0YTsKLSAgewotICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgbWVzc2FnZTsKLSAgICBtZXNzYWdlLnNldF9pKDEyMyk7Ci0gICAgLy8gQnVpbGQgYSBNZXNzYWdlU2V0IG1hbnVhbGx5IHdpdGggaXRzIG1lc3NhZ2UgY29udGVudCBwdXQgYmVmb3JlIGl0cwotICAgIC8vIHR5cGVfaWQuCi0gICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZkYXRhKTsKLSAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKLSAgICBjb2RlZF9vdXRwdXQuV3JpdGVUYWcoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKTsKLSAgICAvLyBXcml0ZSB0aGUgbWVzc2FnZSBjb250ZW50IGZpcnN0LgotICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVkX291dHB1dCk7Ci0gICAgY29kZWRfb3V0cHV0LldyaXRlVmFyaW50MzIobWVzc2FnZS5CeXRlU2l6ZSgpKTsKLSAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmY29kZWRfb3V0cHV0KTsKLSAgICAvLyBXcml0ZSB0aGUgdHlwZSBpZC4KLSAgICB1aW50MzIgdHlwZV9pZCA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpOwotICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfaWQsICZjb2RlZF9vdXRwdXQpOwotICAgIGNvZGVkX291dHB1dC5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKLSAgfQotICB7Ci0gICAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OwotICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2Vfc2V0LlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7Ci0KLSAgICBFWFBFQ1RfRVEoMTIzLCBtZXNzYWdlX3NldC5HZXRFeHRlbnNpb24oCi0gICAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikuaSgpKTsKLSAgfQotICB7Ci0gICAgLy8gVGVzdCBwYXJzZSB0aGUgbWVzc2FnZSB2aWEgUmVmbGVjdGlvbi4KLSAgICBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7Ci0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoCi0gICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhLmRhdGEoKSksIGRhdGEuc2l6ZSgpKTsKLSAgICBFWFBFQ1RfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZtZXNzYWdlX3NldCkpOwotICAgIEVYUEVDVF9UUlVFKGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKLQotICAgIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2Vfc2V0LkdldEV4dGVuc2lvbigKLSAgICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5pKCkpOwotICB9Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlQnJva2VuTWVzc2FnZVNldCkgewotICBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7Ci0gIHN0cmluZyBpbnB1dCgiZ29vZGJ5ZSIpOyAgLy8gSW52YWxpZCB3aXJlIGZvcm1hdCBkYXRhLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZV9zZXQuUGFyc2VGcm9tU3RyaW5nKGlucHV0KSk7Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIFJlY3Vyc2lvbkxpbWl0KSB7Ci0gIHVuaXR0ZXN0OjpUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlOwotICBtZXNzYWdlLm11dGFibGVfYSgpLT5tdXRhYmxlX2EoKS0+bXV0YWJsZV9hKCktPm11dGFibGVfYSgpLT5zZXRfaSgxKTsKLSAgc3RyaW5nIGRhdGE7Ci0gIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotCi0gIHsKLSAgICBpbzo6QXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKLSAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKLSAgICBpbnB1dC5TZXRSZWN1cnNpb25MaW1pdCg0KTsKLSAgICB1bml0dGVzdDo6VGVzdFJlY3Vyc2l2ZU1lc3NhZ2UgbWVzc2FnZTI7Ci0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7Ci0gIH0KLQotICB7Ci0gICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7Ci0gICAgaW5wdXQuU2V0UmVjdXJzaW9uTGltaXQoMyk7Ci0gICAgdW5pdHRlc3Q6OlRlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2UyOwotICAgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5QYXJzZUZyb21Db2RlZFN0cmVhbSgmaW5wdXQpKTsKLSAgfQotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBVbmtub3duRmllbGRSZWN1cnNpb25MaW1pdCkgewotICB1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZSBtZXNzYWdlOwotICBtZXNzYWdlLm11dGFibGVfdW5rbm93bl9maWVsZHMoKQotICAgICAgICAtPkFkZEdyb3VwKDEyMzQpCi0gICAgICAgIC0+QWRkR3JvdXAoMTIzNCkKLSAgICAgICAgLT5BZGRHcm91cCgxMjM0KQotICAgICAgICAtPkFkZEdyb3VwKDEyMzQpCi0gICAgICAgIC0+QWRkVmFyaW50KDEyMzQsIDEyMyk7Ci0gIHN0cmluZyBkYXRhOwotICBtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKLQotICB7Ci0gICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7Ci0gICAgaW5wdXQuU2V0UmVjdXJzaW9uTGltaXQoNCk7Ci0gICAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTI7Ci0gICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tQ29kZWRTdHJlYW0oJmlucHV0KSk7Ci0gIH0KLQotICB7Ci0gICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoJnJhd19pbnB1dCk7Ci0gICAgaW5wdXQuU2V0UmVjdXJzaW9uTGltaXQoMyk7Ci0gICAgdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZTI7Ci0gICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLlBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCkpOwotICB9Ci19Ci0KLVRFU1QoV2lyZUZvcm1hdFRlc3QsIFppZ1phZykgewotLy8gYXZvaWQgbGluZS13cmFwcGluZwotI2RlZmluZSBMTCh4KSBHT09HTEVfTE9OR0xPTkcoeCkKLSNkZWZpbmUgVUxMKHgpIEdPT0dMRV9VTE9OR0xPTkcoeCkKLSNkZWZpbmUgWmlnWmFnRW5jb2RlMzIoeCkgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0VuY29kZTMyKHgpCi0jZGVmaW5lIFppZ1phZ0RlY29kZTMyKHgpIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGUzMih4KQotI2RlZmluZSBaaWdaYWdFbmNvZGU2NCh4KSBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlNjQoeCkKLSNkZWZpbmUgWmlnWmFnRGVjb2RlNjQoeCkgV2lyZUZvcm1hdExpdGU6OlppZ1phZ0RlY29kZTY0KHgpCi0KLSAgRVhQRUNUX0VRKDB1LCBaaWdaYWdFbmNvZGUzMiggMCkpOwotICBFWFBFQ1RfRVEoMXUsIFppZ1phZ0VuY29kZTMyKC0xKSk7Ci0gIEVYUEVDVF9FUSgydSwgWmlnWmFnRW5jb2RlMzIoIDEpKTsKLSAgRVhQRUNUX0VRKDN1LCBaaWdaYWdFbmNvZGUzMigtMikpOwotICBFWFBFQ1RfRVEoMHg3RkZGRkZGRXUsIFppZ1phZ0VuY29kZTMyKDB4M0ZGRkZGRkYpKTsKLSAgRVhQRUNUX0VRKDB4N0ZGRkZGRkZ1LCBaaWdaYWdFbmNvZGUzMigweEMwMDAwMDAwKSk7Ci0gIEVYUEVDVF9FUSgweEZGRkZGRkZFdSwgWmlnWmFnRW5jb2RlMzIoMHg3RkZGRkZGRikpOwotICBFWFBFQ1RfRVEoMHhGRkZGRkZGRnUsIFppZ1phZ0VuY29kZTMyKDB4ODAwMDAwMDApKTsKLQotICBFWFBFQ1RfRVEoIDAsIFppZ1phZ0RlY29kZTMyKDB1KSk7Ci0gIEVYUEVDVF9FUSgtMSwgWmlnWmFnRGVjb2RlMzIoMXUpKTsKLSAgRVhQRUNUX0VRKCAxLCBaaWdaYWdEZWNvZGUzMigydSkpOwotICBFWFBFQ1RfRVEoLTIsIFppZ1phZ0RlY29kZTMyKDN1KSk7Ci0gIEVYUEVDVF9FUSgweDNGRkZGRkZGLCBaaWdaYWdEZWNvZGUzMigweDdGRkZGRkZFdSkpOwotICBFWFBFQ1RfRVEoMHhDMDAwMDAwMCwgWmlnWmFnRGVjb2RlMzIoMHg3RkZGRkZGRnUpKTsKLSAgRVhQRUNUX0VRKDB4N0ZGRkZGRkYsIFppZ1phZ0RlY29kZTMyKDB4RkZGRkZGRkV1KSk7Ci0gIEVYUEVDVF9FUSgweDgwMDAwMDAwLCBaaWdaYWdEZWNvZGUzMigweEZGRkZGRkZGdSkpOwotCi0gIEVYUEVDVF9FUSgwdSwgWmlnWmFnRW5jb2RlNjQoIDApKTsKLSAgRVhQRUNUX0VRKDF1LCBaaWdaYWdFbmNvZGU2NCgtMSkpOwotICBFWFBFQ1RfRVEoMnUsIFppZ1phZ0VuY29kZTY0KCAxKSk7Ci0gIEVYUEVDVF9FUSgzdSwgWmlnWmFnRW5jb2RlNjQoLTIpKTsKLSAgRVhQRUNUX0VRKFVMTCgweDAwMDAwMDAwN0ZGRkZGRkUpLCBaaWdaYWdFbmNvZGU2NChMTCgweDAwMDAwMDAwM0ZGRkZGRkYpKSk7Ci0gIEVYUEVDVF9FUShVTEwoMHgwMDAwMDAwMDdGRkZGRkZGKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHhGRkZGRkZGRkMwMDAwMDAwKSkpOwotICBFWFBFQ1RfRVEoVUxMKDB4MDAwMDAwMDBGRkZGRkZGRSksIFppZ1phZ0VuY29kZTY0KExMKDB4MDAwMDAwMDA3RkZGRkZGRikpKTsKLSAgRVhQRUNUX0VRKFVMTCgweDAwMDAwMDAwRkZGRkZGRkYpLCBaaWdaYWdFbmNvZGU2NChMTCgweEZGRkZGRkZGODAwMDAwMDApKSk7Ci0gIEVYUEVDVF9FUShVTEwoMHhGRkZGRkZGRkZGRkZGRkZFKSwgWmlnWmFnRW5jb2RlNjQoTEwoMHg3RkZGRkZGRkZGRkZGRkZGKSkpOwotICBFWFBFQ1RfRVEoVUxMKDB4RkZGRkZGRkZGRkZGRkZGRiksIFppZ1phZ0VuY29kZTY0KExMKDB4ODAwMDAwMDAwMDAwMDAwMCkpKTsKLQotICBFWFBFQ1RfRVEoIDAsIFppZ1phZ0RlY29kZTY0KDB1KSk7Ci0gIEVYUEVDVF9FUSgtMSwgWmlnWmFnRGVjb2RlNjQoMXUpKTsKLSAgRVhQRUNUX0VRKCAxLCBaaWdaYWdEZWNvZGU2NCgydSkpOwotICBFWFBFQ1RfRVEoLTIsIFppZ1phZ0RlY29kZTY0KDN1KSk7Ci0gIEVYUEVDVF9FUShMTCgweDAwMDAwMDAwM0ZGRkZGRkYpLCBaaWdaYWdEZWNvZGU2NChVTEwoMHgwMDAwMDAwMDdGRkZGRkZFKSkpOwotICBFWFBFQ1RfRVEoTEwoMHhGRkZGRkZGRkMwMDAwMDAwKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4MDAwMDAwMDA3RkZGRkZGRikpKTsKLSAgRVhQRUNUX0VRKExMKDB4MDAwMDAwMDA3RkZGRkZGRiksIFppZ1phZ0RlY29kZTY0KFVMTCgweDAwMDAwMDAwRkZGRkZGRkUpKSk7Ci0gIEVYUEVDVF9FUShMTCgweEZGRkZGRkZGODAwMDAwMDApLCBaaWdaYWdEZWNvZGU2NChVTEwoMHgwMDAwMDAwMEZGRkZGRkZGKSkpOwotICBFWFBFQ1RfRVEoTEwoMHg3RkZGRkZGRkZGRkZGRkZGKSwgWmlnWmFnRGVjb2RlNjQoVUxMKDB4RkZGRkZGRkZGRkZGRkZGRSkpKTsKLSAgRVhQRUNUX0VRKExMKDB4ODAwMDAwMDAwMDAwMDAwMCksIFppZ1phZ0RlY29kZTY0KFVMTCgweEZGRkZGRkZGRkZGRkZGRkYpKSk7Ci0KLSAgLy8gU29tZSBlYXNpZXItdG8tdmVyaWZ5IHJvdW5kLXRyaXAgdGVzdHMuICBUaGUgaW5wdXRzIChvdGhlciB0aGFuIDAsIDEsIC0xKQotICAvLyB3ZXJlIGNob3NlbiBzZW1pLXJhbmRvbWx5IHZpYSBrZXlib2FyZCBiYXNoaW5nLgotICBFWFBFQ1RfRVEoICAgIDAsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKCAgICAwKSkpOwotICBFWFBFQ1RfRVEoICAgIDEsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKCAgICAxKSkpOwotICBFWFBFQ1RfRVEoICAgLTEsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKCAgIC0xKSkpOwotICBFWFBFQ1RfRVEoMTQ5MjcsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKDE0OTI3KSkpOwotICBFWFBFQ1RfRVEoLTM2MTIsIFppZ1phZ0RlY29kZTMyKFppZ1phZ0VuY29kZTMyKC0zNjEyKSkpOwotCi0gIEVYUEVDVF9FUSggICAgMCwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoICAgIDApKSk7Ci0gIEVYUEVDVF9FUSggICAgMSwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoICAgIDEpKSk7Ci0gIEVYUEVDVF9FUSggICAtMSwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoICAgLTEpKSk7Ci0gIEVYUEVDVF9FUSgxNDkyNywgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoMTQ5MjcpKSk7Ci0gIEVYUEVDVF9FUSgtMzYxMiwgWmlnWmFnRGVjb2RlNjQoWmlnWmFnRW5jb2RlNjQoLTM2MTIpKSk7Ci0KLSAgRVhQRUNUX0VRKExMKDg1NjkxMjMwNDgwMTQxNiksIFppZ1phZ0RlY29kZTY0KFppZ1phZ0VuY29kZTY0KAotICAgICAgICAgICAgTEwoODU2OTEyMzA0ODAxNDE2KSkpKTsKLSAgRVhQRUNUX0VRKExMKC03NTEyMzkwNTQzOTU3MTI1NiksIFppZ1phZ0RlY29kZTY0KFppZ1phZ0VuY29kZTY0KAotICAgICAgICAgICAgTEwoLTc1MTIzOTA1NDM5NTcxMjU2KSkpKTsKLX0KLQotVEVTVChXaXJlRm9ybWF0VGVzdCwgUmVwZWF0ZWRTY2FsYXJzRGlmZmVyZW50VGFnU2l6ZXMpIHsKLSAgLy8gQXQgb25lIHBvaW50IGNoZWNrcyB3b3VsZCB0cmlnZ2VyIHdoZW4gcGFyc2luZyByZXBlYXRlZCBmaXhlZCBzY2FsYXIKLSAgLy8gZmllbGRzLgotICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFJlcGVhdGVkU2NhbGFyRGlmZmVyZW50VGFnU2l6ZXMgbXNnMSwgbXNnMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDA7ICsraSkgewotICAgIG1zZzEuYWRkX3JlcGVhdGVkX2ZpeGVkMzIoaSk7Ci0gICAgbXNnMS5hZGRfcmVwZWF0ZWRfaW50MzIoaSk7Ci0gICAgbXNnMS5hZGRfcmVwZWF0ZWRfZml4ZWQ2NChpKTsKLSAgICBtc2cxLmFkZF9yZXBlYXRlZF9pbnQ2NChpKTsKLSAgICBtc2cxLmFkZF9yZXBlYXRlZF9mbG9hdChpKTsKLSAgICBtc2cxLmFkZF9yZXBlYXRlZF91aW50NjQoaSk7Ci0gIH0KLQotICAvLyBNYWtlIHN1cmUgdGhhdCB3ZSBoYXZlIGEgdmFyaWV0eSBvZiB0YWcgc2l6ZXMuCi0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2MgPSBtc2cxLkdldERlc2NyaXB0b3IoKTsKLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZDsKLSAgZmllbGQgPSBkZXNjLT5GaW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ZpeGVkMzIiKTsKLSAgQVNTRVJUX1RSVUUoZmllbGQgIT0gTlVMTCk7Ci0gIEFTU0VSVF9FUSgxLCBXaXJlRm9ybWF0OjpUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkpOwotICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfaW50MzIiKTsKLSAgQVNTRVJUX1RSVUUoZmllbGQgIT0gTlVMTCk7Ci0gIEFTU0VSVF9FUSgxLCBXaXJlRm9ybWF0OjpUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkpOwotICBmaWVsZCA9IGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfZml4ZWQ2NCIpOwotICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKLSAgQVNTRVJUX0VRKDIsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7Ci0gIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQ2NCIpOwotICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKLSAgQVNTRVJUX0VRKDIsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7Ci0gIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9mbG9hdCIpOwotICBBU1NFUlRfVFJVRShmaWVsZCAhPSBOVUxMKTsKLSAgQVNTRVJUX0VRKDMsIFdpcmVGb3JtYXQ6OlRhZ1NpemUoZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpKSk7Ci0gIGZpZWxkID0gZGVzYy0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF91aW50NjQiKTsKLSAgQVNTRVJUX1RSVUUoZmllbGQgIT0gTlVMTCk7Ci0gIEFTU0VSVF9FUSgzLCBXaXJlRm9ybWF0OjpUYWdTaXplKGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSkpOwotCi0gIEVYUEVDVF9UUlVFKG1zZzIuUGFyc2VGcm9tU3RyaW5nKG1zZzEuU2VyaWFsaXplQXNTdHJpbmcoKSkpOwotICBFWFBFQ1RfRVEobXNnMS5EZWJ1Z1N0cmluZygpLCBtc2cyLkRlYnVnU3RyaW5nKCkpOwotfQotCi1URVNUKFdpcmVGb3JtYXRUZXN0LCBDb21wYXRpYmxlVHlwZXMpIHsKLSAgY29uc3QgaW50NjQgZGF0YSA9IDB4MTAwMDAwMDAwTEw7Ci0gIHVuaXR0ZXN0OjpJbnQ2NE1lc3NhZ2UgbXNnMTsKLSAgbXNnMS5zZXRfZGF0YShkYXRhKTsKLSAgc3RyaW5nIHNlcmlhbGl6ZWQ7Ci0gIG1zZzEuU2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbGl6ZWQpOwotCi0gIC8vIFRlc3QgaW50NjQgaXMgY29tcGF0aWJsZSB3aXRoIGJvb2wKLSAgdW5pdHRlc3Q6OkJvb2xNZXNzYWdlIG1zZzI7Ci0gIEFTU0VSVF9UUlVFKG1zZzIuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKLSAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PGJvb2w+KGRhdGEpLCBtc2cyLmRhdGEoKSk7Ci0KLSAgLy8gVGVzdCBpbnQ2NCBpcyBjb21wYXRpYmxlIHdpdGggdWludDY0Ci0gIHVuaXR0ZXN0OjpVaW50NjRNZXNzYWdlIG1zZzM7Ci0gIEFTU0VSVF9UUlVFKG1zZzMuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKLSAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PHVpbnQ2ND4oZGF0YSksIG1zZzMuZGF0YSgpKTsKLQotICAvLyBUZXN0IGludDY0IGlzIGNvbXBhdGlibGUgd2l0aCBpbnQzMgotICB1bml0dGVzdDo6SW50MzJNZXNzYWdlIG1zZzQ7Ci0gIEFTU0VSVF9UUlVFKG1zZzQuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKLSAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PGludDMyPihkYXRhKSwgbXNnNC5kYXRhKCkpOwotCi0gIC8vIFRlc3QgaW50NjQgaXMgY29tcGF0aWJsZSB3aXRoIHVpbnQzMgotICB1bml0dGVzdDo6VWludDMyTWVzc2FnZSBtc2c1OwotICBBU1NFUlRfVFJVRShtc2c1LlBhcnNlRnJvbVN0cmluZyhzZXJpYWxpemVkKSk7Ci0gIEFTU0VSVF9FUShzdGF0aWNfY2FzdDx1aW50MzI+KGRhdGEpLCBtc2c1LmRhdGEoKSk7Ci19Ci0KLWNsYXNzIFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkV2lyZUZvcm1hdFRlc3QgOiBwdWJsaWMgOjp0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkV2lyZUZvcm1hdFRlc3QoKQotICAgICAgOiBwYWNrZWRUZXN0QWxsVHlwZXNfKAotICAgICAgICAgICAgIlx4RkFceDAxXHgwMVx4MDEiCi0gICAgICAgICAgICAiXHg4Mlx4MDJceDAxXHgwMSIKLSAgICAgICAgICAgICJceDhBXHgwMlx4MDFceDAxIgotICAgICAgICAgICAgIlx4OTJceDAyXHgwMVx4MDEiCi0gICAgICAgICAgICAiXHg5QVx4MDJceDAxXHgwMiIKLSAgICAgICAgICAgICJceEEyXHgwMlx4MDFceDAyIgotICAgICAgICAgICAgIlx4QUFceDAyXHgwNFx4MDFceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAiXHhCMlx4MDJceDA4XHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAiXHhCQVx4MDJceDA0XHgwMVx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICJceEMyXHgwMlx4MDhceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICJceENBXHgwMlx4MDRceDAwXHgwMFx4ODBceDNmIgotICAgICAgICAgICAgIlx4RDJceDAyXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZjBceDNmIgotICAgICAgICAgICAgIlx4REFceDAyXHgwMVx4MDEiCi0gICAgICAgICAgICAiXHg5QVx4MDNceDAxXHgwMSIsCi0gICAgICAgICAgICA4NiksCi0gICAgICAgIHBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXygKLSAgICAgICAgICAgICJceDBBXHgwMVx4MDEiCi0gICAgICAgICAgICAiXHgxMlx4MDFceDAxIgotICAgICAgICAgICAgIlx4MUFceDAxXHgwMSIKLSAgICAgICAgICAgICJceDIyXHgwMVx4MDEiCi0gICAgICAgICAgICAiXHgyQVx4MDFceDAyIgotICAgICAgICAgICAgIlx4MzJceDAxXHgwMiIKLSAgICAgICAgICAgICJceDNBXHgwNFx4MDFceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAiXHg0Mlx4MDhceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICJceDRBXHgwNFx4MDFceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAiXHg1Mlx4MDhceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICJceDVBXHgwNFx4MDBceDAwXHg4MFx4M2YiCi0gICAgICAgICAgICAiXHg2Mlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGYwXHgzZiIKLSAgICAgICAgICAgICJceDZBXHgwMVx4MDEiCi0gICAgICAgICAgICAiXHg3Mlx4MDFceDAxIiwKLSAgICAgICAgICAgIDcyKSwKLSAgICAgICAgdW5wYWNrZWRUZXN0QWxsVHlwZXNfKAotICAgICAgICAgICAgIlx4RjhceDAxXHgwMSIKLSAgICAgICAgICAgICJceDgwXHgwMlx4MDEiCi0gICAgICAgICAgICAiXHg4OFx4MDJceDAxIgotICAgICAgICAgICAgIlx4OTBceDAyXHgwMSIKLSAgICAgICAgICAgICJceDk4XHgwMlx4MDIiCi0gICAgICAgICAgICAiXHhBMFx4MDJceDAyIgotICAgICAgICAgICAgIlx4QURceDAyXHgwMVx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICJceEIxXHgwMlx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotICAgICAgICAgICAgIlx4QkRceDAyXHgwMVx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICJceEMxXHgwMlx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotICAgICAgICAgICAgIlx4Q0RceDAyXHgwMFx4MDBceDgwXHgzZiIKLSAgICAgICAgICAgICJceEQxXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZjBceDNmIgotICAgICAgICAgICAgIlx4RDhceDAyXHgwMSIKLSAgICAgICAgICAgICJceDk4XHgwM1x4MDEiLAotICAgICAgICAgICAgNzIpLAotICAgICAgICB1bnBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXygKLSAgICAgICAgICAgICJceDA4XHgwMSIKLSAgICAgICAgICAgICJceDEwXHgwMSIKLSAgICAgICAgICAgICJceDE4XHgwMSIKLSAgICAgICAgICAgICJceDIwXHgwMSIKLSAgICAgICAgICAgICJceDI4XHgwMiIKLSAgICAgICAgICAgICJceDMwXHgwMiIKLSAgICAgICAgICAgICJceDNEXHgwMVx4MDBceDAwXHgwMCIKLSAgICAgICAgICAgICJceDQxXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAiXHg0RFx4MDFceDAwXHgwMFx4MDAiCi0gICAgICAgICAgICAiXHg1MVx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgotICAgICAgICAgICAgIlx4NURceDAwXHgwMFx4ODBceDNmIgotICAgICAgICAgICAgIlx4NjFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceGYwXHgzZiIKLSAgICAgICAgICAgICJceDY4XHgwMSIKLSAgICAgICAgICAgICJceDcwXHgwMSIsCi0gICAgICAgICAgICA1OCkge30KLSAgdGVtcGxhdGUgPGNsYXNzIFByb3RvPgotICB2b2lkIFNldFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkRmllbGRzKFByb3RvKiBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDMyKDEpOwotICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQ2NCgxKTsKLSAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDMyKDEpOwotICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50NjQoMSk7Ci0gICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NpbnQzMigxKTsKLSAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDY0KDEpOwotICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDMyKDEpOwotICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9maXhlZDY0KDEpOwotICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQzMigxKTsKLSAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ZpeGVkNjQoMSk7Ci0gICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Zsb2F0KDEuMCk7Ci0gICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2RvdWJsZSgxLjApOwotICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9ib29sKHRydWUpOwotICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSgKLSAgICAgICAgcHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkRW51bV9GT08pOwotICB9Ci0KLSAgdGVtcGxhdGUgPGNsYXNzIFByb3RvPgotICB2b2lkIEV4cGVjdFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkRmllbGRzU2V0KGNvbnN0IFByb3RvJiBtZXNzYWdlKSB7Ci0gICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIoMCkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0KDApKTsKLSAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIoMCkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCgwKSk7Ci0gICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyKDApKTsKLSAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQoMCkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIoMCkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjQoMCkpOwotICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyKDApKTsKLSAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCgwKSk7Ci0gICAgRVhQRUNUX0VRKDEuMCwgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdCgwKSk7Ci0gICAgRVhQRUNUX0VRKDEuMCwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMCkpOwotICAgIEVYUEVDVF9FUSh0cnVlLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2woMCkpOwotICAgIEVYUEVDVF9FUShwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZPTywKLSAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSgwKSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG8+Ci0gIHZvaWQgVGVzdFNlcmlhbGl6YXRpb24oUHJvdG8qIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyYgZXhwZWN0ZWQpIHsKLSAgICBTZXRQcm90bzNQcmltaXRpdmVSZXBlYXRlZEZpZWxkcyhtZXNzYWdlKTsKLQotICAgIGludCBzaXplID0gbWVzc2FnZS0+Qnl0ZVNpemUoKTsKLQotICAgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZ2VuZXJhdGVkIGNvZGUuCi0gICAgc3RyaW5nIGdlbmVyYXRlZF9kYXRhOwotICAgIHsKLSAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZ2VuZXJhdGVkX2RhdGEpOwotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7Ci0gICAgICBtZXNzYWdlLT5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7Ci0gICAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOwotICAgIH0KLSAgICBFWFBFQ1RfVFJVRShleHBlY3RlZCA9PSBnZW5lcmF0ZWRfZGF0YSk7Ci0KLSAgICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGR5bmFtaWMgY29kZS4KLSAgICBzdHJpbmcgZHluYW1pY19kYXRhOwotICAgIHsKLSAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmZHluYW1pY19kYXRhKTsKLSAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOwotICAgICAgV2lyZUZvcm1hdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCptZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKLSAgICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7Ci0gICAgfQotICAgIEVYUEVDVF9UUlVFKGV4cGVjdGVkID09IGR5bmFtaWNfZGF0YSk7Ci0gIH0KLQotICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG8+Ci0gIHZvaWQgVGVzdFBhcnNpbmcoUHJvdG8qIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyYgY29tcGF0aWJsZV9kYXRhKSB7Ci0gICAgbWVzc2FnZS0+Q2xlYXIoKTsKLSAgICBtZXNzYWdlLT5QYXJzZUZyb21TdHJpbmcoY29tcGF0aWJsZV9kYXRhKTsKLSAgICBFeHBlY3RQcm90bzNQcmltaXRpdmVSZXBlYXRlZEZpZWxkc1NldCgqbWVzc2FnZSk7Ci0KLSAgICBtZXNzYWdlLT5DbGVhcigpOwotICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KAotICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oY29tcGF0aWJsZV9kYXRhLmRhdGEoKSksCi0gICAgICAgIGNvbXBhdGlibGVfZGF0YS5zaXplKCkpOwotICAgIFdpcmVGb3JtYXQ6OlBhcnNlQW5kTWVyZ2VQYXJ0aWFsKCZpbnB1dCwgbWVzc2FnZSk7Ci0gICAgRXhwZWN0UHJvdG8zUHJpbWl0aXZlUmVwZWF0ZWRGaWVsZHNTZXQoKm1lc3NhZ2UpOwotICB9Ci0KLSAgY29uc3Qgc3RyaW5nIHBhY2tlZFRlc3RBbGxUeXBlc187Ci0gIGNvbnN0IHN0cmluZyBwYWNrZWRUZXN0VW5wYWNrZWRUeXBlc187Ci0gIGNvbnN0IHN0cmluZyB1bnBhY2tlZFRlc3RBbGxUeXBlc187Ci0gIGNvbnN0IHN0cmluZyB1bnBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXzsKLX07Ci0KLVRFU1RfRihQcm90bzNQcmltaXRpdmVSZXBlYXRlZFdpcmVGb3JtYXRUZXN0LCBQcm90bzNQcmltaXRpdmVSZXBlYXRlZCkgewotICBwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBwYWNrZWRfbWVzc2FnZTsKLSAgcHJvdG8zX2FyZW5hX3VuaXR0ZXN0OjpUZXN0VW5wYWNrZWRUeXBlcyB1bnBhY2tlZF9tZXNzYWdlOwotICBUZXN0U2VyaWFsaXphdGlvbigmcGFja2VkX21lc3NhZ2UsIHBhY2tlZFRlc3RBbGxUeXBlc18pOwotICBUZXN0UGFyc2luZygmcGFja2VkX21lc3NhZ2UsIHBhY2tlZFRlc3RBbGxUeXBlc18pOwotICBUZXN0UGFyc2luZygmcGFja2VkX21lc3NhZ2UsIHVucGFja2VkVGVzdEFsbFR5cGVzXyk7Ci0gIFRlc3RTZXJpYWxpemF0aW9uKCZ1bnBhY2tlZF9tZXNzYWdlLCB1bnBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXyk7Ci0gIFRlc3RQYXJzaW5nKCZ1bnBhY2tlZF9tZXNzYWdlLCBwYWNrZWRUZXN0VW5wYWNrZWRUeXBlc18pOwotICBUZXN0UGFyc2luZygmdW5wYWNrZWRfbWVzc2FnZSwgdW5wYWNrZWRUZXN0VW5wYWNrZWRUeXBlc18pOwotfQotCi1jbGFzcyBXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKLSBwcm90ZWN0ZWQ6Ci0gIC8vIE1ha2UgYSBzZXJpYWxpemVkIFRlc3RBbGxUeXBlcyBpbiB3aGljaCB0aGUgZmllbGQgb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UKLSAgLy8gY29udGFpbnMgZXhhY3RseSB0aGUgZ2l2ZW4gYnl0ZXMsIHdoaWNoIG1heSBiZSBpbnZhbGlkLgotICBzdHJpbmcgTWFrZUludmFsaWRFbWJlZGRlZE1lc3NhZ2UoY29uc3QgY2hhciogYnl0ZXMsIGludCBzaXplKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9Ci0gICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgKLSAgICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIik7Ci0gICAgR09PR0xFX0NIRUNLKGZpZWxkICE9IE5VTEwpOwotCi0gICAgc3RyaW5nIHJlc3VsdDsKLQotICAgIHsKLSAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gcmF3X291dHB1dCgmcmVzdWx0KTsKLSAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOwotCi0gICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlcyhmaWVsZC0+bnVtYmVyKCksIHN0cmluZyhieXRlcywgc2l6ZSksICZvdXRwdXQpOwotICAgIH0KLQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICAvLyBNYWtlIGEgc2VyaWFsaXplZCBUZXN0QWxsVHlwZXMgaW4gd2hpY2ggdGhlIGZpZWxkIG9wdGlvbmFsZ3JvdXAKLSAgLy8gY29udGFpbnMgZXhhY3RseSB0aGUgZ2l2ZW4gYnl0ZXMgLS0gd2hpY2ggbWF5IGJlIGludmFsaWQgLS0gYW5kCi0gIC8vIHBvc3NpYmx5IG5vIGVuZCB0YWcuCi0gIHN0cmluZyBNYWtlSW52YWxpZEdyb3VwKGNvbnN0IGNoYXIqIGJ5dGVzLCBpbnQgc2l6ZSwgYm9vbCBpbmNsdWRlX2VuZF90YWcpIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KLSAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OmRlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKAotICAgICAgICAib3B0aW9uYWxncm91cCIpOwotICAgIEdPT0dMRV9DSEVDSyhmaWVsZCAhPSBOVUxMKTsKLQotICAgIHN0cmluZyByZXN1bHQ7Ci0KLSAgICB7Ci0gICAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIHJhd19vdXRwdXQoJnJlc3VsdCk7Ci0gICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKLQotICAgICAgb3V0cHV0LldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdDo6TWFrZVRhZyhmaWVsZCkpOwotICAgICAgb3V0cHV0LldyaXRlU3RyaW5nKHN0cmluZyhieXRlcywgc2l6ZSkpOwotICAgICAgaWYgKGluY2x1ZGVfZW5kX3RhZykgewotICAgICAgICBvdXRwdXQuV3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKLSAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci19OwotCi1URVNUX0YoV2lyZUZvcm1hdEludmFsaWRJbnB1dFRlc3QsIEludmFsaWRTdWJNZXNzYWdlKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICAvLyBDb250cm9sIGNhc2UuCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCIiLCAwKSkpOwotCi0gIC8vIFRoZSBieXRlIGlzIGEgdmFsaWQgdmFyaW50LCBidXQgbm90IGEgdmFsaWQgdGFnICh6ZXJvKS4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkRW1iZWRkZWRNZXNzYWdlKCJcMCIsIDEpKSk7Ci0KLSAgLy8gVGhlIGJ5dGUgaXMgYSBtYWxmb3JtZWQgdmFyaW50LgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRFbWJlZGRlZE1lc3NhZ2UoIlwyMDAiLCAxKSkpOwotCi0gIC8vIFRoZSBieXRlIGlzIGFuIGVuZGdyb3VwIHRhZywgYnV0IHdlIGFyZW4ndCBwYXJzaW5nIGEgZ3JvdXAuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZSgiXDAxNCIsIDEpKSk7Ci0KLSAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQgYnV0IG5vdCBhIHZhbGlkIHRhZyAoYmFkIHdpcmUgdHlwZSkuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEVtYmVkZGVkTWVzc2FnZSgiXDAxNyIsIDEpKSk7Ci19Ci0KLVRFU1RfRihXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCwgSW52YWxpZEdyb3VwKSB7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLQotICAvLyBDb250cm9sIGNhc2UuCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIiIsIDAsIHRydWUpKSk7Ci0KLSAgLy8gTWlzc2luZyBlbmQgdGFnLiAgR3JvdXBzIGNhbm5vdCBlbmQgYXQgRU9GLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiIiwgMCwgZmFsc2UpKSk7Ci0KLSAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQsIGJ1dCBub3QgYSB2YWxpZCB0YWcgKHplcm8pLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDAiLCAxLCBmYWxzZSkpKTsKLQotICAvLyBUaGUgYnl0ZSBpcyBhIG1hbGZvcm1lZCB2YXJpbnQuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMjAwIiwgMSwgZmFsc2UpKSk7Ci0KLSAgLy8gVGhlIGJ5dGUgaXMgYW4gZW5kZ3JvdXAgdGFnLCBidXQgbm90IHRoZSByaWdodCBvbmUgZm9yIHRoaXMgZ3JvdXAuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMDE0IiwgMSwgZmFsc2UpKSk7Ci0KLSAgLy8gVGhlIGJ5dGUgaXMgYSB2YWxpZCB2YXJpbnQgYnV0IG5vdCBhIHZhbGlkIHRhZyAoYmFkIHdpcmUgdHlwZSkuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCJcMDE3IiwgMSwgdHJ1ZSkpKTsKLX0KLQotVEVTVF9GKFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0LCBJbnZhbGlkVW5rbm93bkdyb3VwKSB7Ci0gIC8vIFVzZSBUZXN0RW1wdHlNZXNzYWdlIHNvIHRoYXQgdGhlIGdyb3VwIG1hZGUgYnkgTWFrZUludmFsaWRHcm91cCB3aWxsIG5vdAotICAvLyBiZSBhIGtub3duIHRhZyBudW1iZXIuCi0gIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2U7Ci0KLSAgLy8gQ29udHJvbCBjYXNlLgotICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhNYWtlSW52YWxpZEdyb3VwKCIiLCAwLCB0cnVlKSkpOwotCi0gIC8vIE1pc3NpbmcgZW5kIHRhZy4gIEdyb3VwcyBjYW5ub3QgZW5kIGF0IEVPRi4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIiIsIDAsIGZhbHNlKSkpOwotCi0gIC8vIFRoZSBieXRlIGlzIGEgdmFsaWQgdmFyaW50LCBidXQgbm90IGEgdmFsaWQgdGFnICh6ZXJvKS4KLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKE1ha2VJbnZhbGlkR3JvdXAoIlwwIiwgMSwgZmFsc2UpKSk7Ci0KLSAgLy8gVGhlIGJ5dGUgaXMgYSBtYWxmb3JtZWQgdmFyaW50LgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDIwMCIsIDEsIGZhbHNlKSkpOwotCi0gIC8vIFRoZSBieXRlIGlzIGFuIGVuZGdyb3VwIHRhZywgYnV0IG5vdCB0aGUgcmlnaHQgb25lIGZvciB0aGlzIGdyb3VwLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDAxNCIsIDEsIGZhbHNlKSkpOwotCi0gIC8vIFRoZSBieXRlIGlzIGEgdmFsaWQgdmFyaW50IGJ1dCBub3QgYSB2YWxpZCB0YWcgKGJhZCB3aXJlIHR5cGUpLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoTWFrZUludmFsaWRHcm91cCgiXDAxNyIsIDEsIHRydWUpKSk7Ci19Ci0KLVRFU1RfRihXaXJlRm9ybWF0SW52YWxpZElucHV0VGVzdCwgSW52YWxpZFN0cmluZ0luVW5rbm93bkdyb3VwKSB7Ci0gIC8vIFRlc3QgYSBidWcgZml4OiAgU2tpcE1lc3NhZ2Ugc2hvdWxkIGZhaWwgaWYgdGhlIG1lc3NhZ2UgY29udGFpbnMgYSBzdHJpbmcKLSAgLy8gd2hvc2UgbGVuZ3RoIHdvdWxkIGV4dGVuZCBiZXlvbmQgdGhlIG1lc3NhZ2UgZW5kLgotCi0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKLSAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfc3RyaW5nKCJmb28gZm9vIGZvbyBmb28iKTsKLSAgc3RyaW5nIGRhdGE7Ci0gIG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOwotCi0gIC8vIENob3Agc29tZSBieXRlcyBvZmYgdGhlIGVuZC4KLSAgZGF0YS5yZXNpemUoZGF0YS5zaXplKCkgLSA0KTsKLQotICAvLyBUcnkgdG8gc2tpcCBpdC4gIE5vdGUgdGhhdCB0aGUgYnVnIHdhcyBvbmx5IHByZXNlbnQgd2hlbiBwYXJzaW5nIHRvIGFuCi0gIC8vIFVua25vd25GaWVsZFNldC4KLSAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZyYXdfaW5wdXQpOwotICBVbmtub3duRmllbGRTZXQgdW5rbm93bl9maWVsZHM7Ci0gIEVYUEVDVF9GQUxTRShXaXJlRm9ybWF0OjpTa2lwTWVzc2FnZSgmY29kZWRfaW5wdXQsICZ1bmtub3duX2ZpZWxkcykpOwotfQotCi0vLyBUZXN0IGRpZmZlcmVuY2VzIGJldHdlZW4gc3RyaW5nIGFuZCBieXRlcy4KLS8vIFZhbHVlIG9mIGEgc3RyaW5nIHR5cGUgbXVzdCBiZSB2YWxpZCBVVEYtOCBzdHJpbmcuICBXaGVuIFVURi04Ci0vLyB2YWxpZGF0aW9uIGlzIGVuYWJsZWQgKEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRCk6Ci0vLyBXcml0ZUludmFsaWRVVEY4U3RyaW5nOiAgc2VlIGVycm9yIG1lc3NhZ2UuCi0vLyBSZWFkSW52YWxpZFVURjhTdHJpbmc6ICBzZWUgZXJyb3IgbWVzc2FnZS4KLS8vIFdyaXRlVmFsaWRVVEY4U3RyaW5nOiBmaW5lLgotLy8gUmVhZFZhbGlkVVRGOFN0cmluZzogIGZpbmUuCi0vLyBXcml0ZUFueUJ5dGVzOiBmaW5lLgotLy8gUmVhZEFueUJ5dGVzOiBmaW5lLgotY29uc3QgY2hhciAqIGtJbnZhbGlkVVRGOFN0cmluZyA9ICJJbnZhbGlkIFVURi04OiBceEEwXHhCMFx4QzBceEQwIjsKLS8vIFRoaXMgdXNlZCB0byBiZSAiVmFsaWQgVVRGLTg6IFx4MDFceDAyXHU4QzM3XHU2QjRDIiwgYnV0IE1TVkMgc2VlbXMgdG8KLS8vIGludGVycHJldCBcdSBkaWZmZXJlbnRseSBmcm9tIEdDQy4KLWNvbnN0IGNoYXIgKiBrVmFsaWRVVEY4U3RyaW5nID0gIlZhbGlkIFVURi04OiBceDAxXHgwMlwzNTBcMjYwXDI2N1wzNDZcMjU1XDIxNCI7Ci0KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+Ci1ib29sIFdyaXRlTWVzc2FnZShjb25zdCBjaGFyICp2YWx1ZSwgVCAqbWVzc2FnZSwgc3RyaW5nICp3aXJlX2J1ZmZlcikgewotICBtZXNzYWdlLT5zZXRfZGF0YSh2YWx1ZSk7Ci0gIHdpcmVfYnVmZmVyLT5jbGVhcigpOwotICBtZXNzYWdlLT5BcHBlbmRUb1N0cmluZyh3aXJlX2J1ZmZlcik7Ci0gIHJldHVybiAod2lyZV9idWZmZXItPnNpemUoKSA+IDApOwotfQotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUPgotYm9vbCBSZWFkTWVzc2FnZShjb25zdCBzdHJpbmcgJndpcmVfYnVmZmVyLCBUICptZXNzYWdlKSB7Ci0gIHJldHVybiBtZXNzYWdlLT5QYXJzZUZyb21BcnJheSh3aXJlX2J1ZmZlci5kYXRhKCksIHdpcmVfYnVmZmVyLnNpemUoKSk7Ci19Ci0KLWJvb2wgU3RhcnRzV2l0aChjb25zdCBzdHJpbmcmIHMsIGNvbnN0IHN0cmluZyYgcHJlZml4KSB7Ci0gIHJldHVybiBzLnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKCkpID09IHByZWZpeDsKLX0KLQotY2xhc3MgVXRmOFZhbGlkYXRpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7Ci0gcHJvdGVjdGVkOgotICBVdGY4VmFsaWRhdGlvblRlc3QoKSB7fQotICB2aXJ0dWFsIH5VdGY4VmFsaWRhdGlvblRlc3QoKSB7fQotICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7Ci0gIH0KLQotfTsKLQotVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgV3JpdGVJbnZhbGlkVVRGOFN0cmluZykgewotICBzdHJpbmcgd2lyZV9idWZmZXI7Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgaW5wdXQ7Ci0gIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKLSAgewotICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7Ci0gICAgV3JpdGVNZXNzYWdlKGtJbnZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOwotICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7Ci0gIH0KLSNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKLSAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOwotICBFWFBFQ1RfVFJVRShTdGFydHNXaXRoKGVycm9yc1swXSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGZpZWxkICdwcm90b2J1Zl91bml0dGVzdC5PbmVTdHJpbmcuZGF0YScgIgotICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWlucyBpbnZhbGlkIFVURi04IGRhdGEgd2hlbiAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6aW5nIGEgcHJvdG9jb2wgYnVmZmVyLiBVc2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJ2J5dGVzJyB0eXBlIGlmIHlvdSBpbnRlbmQgdG8gc2VuZCByYXcgYnl0ZXMuIikpOwotI2Vsc2UKLSAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOwotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKLX0KLQotCi1URVNUX0YoVXRmOFZhbGlkYXRpb25UZXN0LCBSZWFkSW52YWxpZFVURjhTdHJpbmcpIHsKLSAgc3RyaW5nIHdpcmVfYnVmZmVyOwotICBwcm90b2J1Zl91bml0dGVzdDo6T25lU3RyaW5nIGlucHV0OwotICBXcml0ZU1lc3NhZ2Uoa0ludmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgb3V0cHV0OwotICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7Ci0gIHsKLSAgICBTY29wZWRNZW1vcnlMb2cgbG9nOwotICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKLSAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOwotICB9Ci0jaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECi0gIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKLSAgRVhQRUNUX1RSVUUoU3RhcnRzV2l0aChlcnJvcnNbMF0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBmaWVsZCAncHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nLmRhdGEnICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbnMgaW52YWxpZCBVVEYtOCBkYXRhIHdoZW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nIGEgcHJvdG9jb2wgYnVmZmVyLiBVc2UgdGhlICIKLSAgICAgICAgICAgICAgICAgICAgICAgICAiJ2J5dGVzJyB0eXBlIGlmIHlvdSBpbnRlbmQgdG8gc2VuZCByYXcgYnl0ZXMuIikpOwotCi0jZWxzZQotICBBU1NFUlRfRVEoMCwgZXJyb3JzLnNpemUoKSk7Ci0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRAotfQotCi0KLVRFU1RfRihVdGY4VmFsaWRhdGlvblRlc3QsIFdyaXRlVmFsaWRVVEY4U3RyaW5nKSB7Ci0gIHN0cmluZyB3aXJlX2J1ZmZlcjsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBpbnB1dDsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotICB7Ci0gICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKLSAgICBXcml0ZU1lc3NhZ2Uoa1ZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOwotICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7Ci0gIH0KLSAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOwotfQotCi1URVNUX0YoVXRmOFZhbGlkYXRpb25UZXN0LCBSZWFkVmFsaWRVVEY4U3RyaW5nKSB7Ci0gIHN0cmluZyB3aXJlX2J1ZmZlcjsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBpbnB1dDsKLSAgV3JpdGVNZXNzYWdlKGtWYWxpZFVURjhTdHJpbmcsICZpbnB1dCwgJndpcmVfYnVmZmVyKTsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBvdXRwdXQ7Ci0gIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKLSAgewotICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7Ci0gICAgUmVhZE1lc3NhZ2Uod2lyZV9idWZmZXIsICZvdXRwdXQpOwotICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7Ci0gIH0KLSAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOwotICBFWFBFQ1RfRVEoaW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpKTsKLX0KLQotLy8gQnl0ZXM6IGFueXRoaW5nIGNhbiBwYXNzIGFzIGJ5dGVzLCB1c2UgaW52YWxpZCBVVEYtOCBzdHJpbmcgdG8gdGVzdAotVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgV3JpdGVBcmJpdHJhcnlCeXRlcykgewotICBzdHJpbmcgd2lyZV9idWZmZXI7Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVCeXRlcyBpbnB1dDsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotICB7Ci0gICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKLSAgICBXcml0ZU1lc3NhZ2Uoa0ludmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7Ci0gICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKLSAgfQotICBBU1NFUlRfRVEoMCwgZXJyb3JzLnNpemUoKSk7Ci19Ci0KLVRFU1RfRihVdGY4VmFsaWRhdGlvblRlc3QsIFJlYWRBcmJpdHJhcnlCeXRlcykgewotICBzdHJpbmcgd2lyZV9idWZmZXI7Ci0gIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVCeXRlcyBpbnB1dDsKLSAgV3JpdGVNZXNzYWdlKGtJbnZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOwotICBwcm90b2J1Zl91bml0dGVzdDo6T25lQnl0ZXMgb3V0cHV0OwotICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7Ci0gIHsKLSAgICBTY29wZWRNZW1vcnlMb2cgbG9nOwotICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKLSAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOwotICB9Ci0gIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKGlucHV0LmRhdGEoKSwgb3V0cHV0LmRhdGEoKSk7Ci19Ci0KLVRFU1RfRihVdGY4VmFsaWRhdGlvblRlc3QsIFBhcnNlUmVwZWF0ZWRTdHJpbmcpIHsKLSAgcHJvdG9idWZfdW5pdHRlc3Q6Ok1vcmVCeXRlcyBpbnB1dDsKLSAgaW5wdXQuYWRkX2RhdGEoa1ZhbGlkVVRGOFN0cmluZyk7Ci0gIGlucHV0LmFkZF9kYXRhKGtJbnZhbGlkVVRGOFN0cmluZyk7Ci0gIGlucHV0LmFkZF9kYXRhKGtJbnZhbGlkVVRGOFN0cmluZyk7Ci0gIHN0cmluZyB3aXJlX2J1ZmZlciA9IGlucHV0LlNlcmlhbGl6ZUFzU3RyaW5nKCk7Ci0KLSAgcHJvdG9idWZfdW5pdHRlc3Q6Ok1vcmVTdHJpbmcgb3V0cHV0OwotICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7Ci0gIHsKLSAgICBTY29wZWRNZW1vcnlMb2cgbG9nOwotICAgIFJlYWRNZXNzYWdlKHdpcmVfYnVmZmVyLCAmb3V0cHV0KTsKLSAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOwotICB9Ci0jaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECi0gIEFTU0VSVF9FUSgyLCBlcnJvcnMuc2l6ZSgpKTsKLSNlbHNlCi0gIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECi0gIEVYUEVDVF9FUSh3aXJlX2J1ZmZlciwgb3V0cHV0LlNlcmlhbGl6ZUFzU3RyaW5nKCkpOwotfQotCi0vLyBUZXN0IHRoZSBvbGQgVmVyaWZ5VVRGOFN0cmluZygpIGZ1bmN0aW9uLCB3aGljaCBtYXkgc3RpbGwgYmUgY2FsbGVkIGJ5IG9sZAotLy8gZ2VuZXJhdGVkIGNvZGUuCi1URVNUX0YoVXRmOFZhbGlkYXRpb25UZXN0LCBPbGRWZXJpZnlVVEY4U3RyaW5nKSB7Ci0gIHN0cmluZyBkYXRhKGtJbnZhbGlkVVRGOFN0cmluZyk7Ci0KLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotICB7Ci0gICAgU2NvcGVkTWVtb3J5TG9nIGxvZzsKLSAgICBXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgZXJyb3JzID0gbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKLSAgfQotI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9VVEY4X1ZBTElEQVRJT05fRU5BQkxFRAotICBBU1NFUlRfRVEoMSwgZXJyb3JzLnNpemUoKSk7Ci0gIEVYUEVDVF9UUlVFKFN0YXJ0c1dpdGgoZXJyb3JzWzBdLAotICAgICAgICAgICAgICAgICAgICAgICAgICJTdHJpbmcgZmllbGQgY29udGFpbnMgaW52YWxpZCBVVEYtOCBkYXRhIHdoZW4gIgotICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxpemluZyBhIHByb3RvY29sIGJ1ZmZlci4gVXNlIHRoZSAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgIidieXRlcycgdHlwZSBpZiB5b3UgaW50ZW5kIHRvIHNlbmQgcmF3IGJ5dGVzLiIpKTsKLSNlbHNlCi0gIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKLSNlbmRpZgotfQotCi0KLX0gIC8vIG5hbWVzcGFjZQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL0JVSUxEIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0JVSUxECnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9CVUlMRApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0JVSUxECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9CVUlMRC5nbiBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9CVUlMRC5nbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvQlVJTEQuZ24KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9CVUlMRC5nbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NIQU5HRVMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NIQU5HRVMudHh0CmluZGV4IDczN2Y4NjUuLjM0NTljY2MgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9DSEFOR0VTLnR4dAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvQ0hBTkdFUy50eHQKQEAgLTEsNyArMSw3MTkgQEAKKzIwMTYtMDUtMTYgdmVyc2lvbiAzLjAuMC1iZXRhLTMgKEMrKy9KYXZhL1B5dGhvbi9SdWJ5L05hbm8vT2JqZWN0aXZlLUMvQyMvSmF2YVNjcmlwdCkKKyAgR2VuZXJhbAorICAqIFN1cHBvcnRlZCBQcm90bzMgbGl0ZS1ydW50aW1lIGluIEMrKy9KYXZhIGZvciBtb2JpbGUgcGxhdGZvcm1zLgorICAqIEFueSB0eXBlIG5vdyBzdXBwb3J0cyBBUElzIHRvIHNwZWNpZnkgcHJlZml4ZXMgb3RoZXIgdGhhbgorICAgIHR5cGUuZ29vZ2xlYXBpcy5jb20KKyAgKiBSZW1vdmVkIGphdmFuYW5vX3VzZV9kZXByZWNhdGVkX3BhY2thZ2Ugb3B0aW9uOyBOYW5vIHdpbGwgYWx3YXlzIGhhcyBpdHMgb3duCisgICAgIi5uYW5vIiBwYWNrYWdlLgorCisgIEMrKyAoQmV0YSkKKyAgKiBJbXByb3ZlZCBoYXNoIG1hcHMuCisgICAgICAtIEltcHJvdmVkIGhhc2ggbWFwcyBjb21tZW50cy4gSW4gcGFydGljdWxhciwgcGxlYXNlIG5vdGUgdGhhdCBlcXVhbCBoYXNoCisgICAgICAgIG1hcHMgd2lsbCBub3QgbmVjZXNzYXJpbHkgaGF2ZSB0aGUgc2FtZSBpdGVyYXRpb24gb3JkZXIgYW5kCisgICAgICAgIHNlcmlhbGl6YXRpb24uCisgICAgICAtIEFkZGVkIGEgbmV3IGhhc2ggbWFwcyBpbXBsZW1lbnRhdGlvbiB0aGF0IHdpbGwgYmVjb21lIHRoZSBkZWZhdWx0IGluIGEKKyAgICAgICAgbGF0ZXIgcmVsZWFzZS4KKyAgKiBBcmVuYXMKKyAgICAgIC0gU2V2ZXJhbCBpbmxpbmVkIG1ldGhvZHMgaW4gQXJlbmEgd2VyZSBtb3ZlZCB0byBvdXQtb2YtbGluZSB0byBpbXByb3ZlCisgICAgICAgIGJ1aWxkIHBlcmZvcm1hbmNlIGFuZCBjb2RlIHNpemUuCisgICAgICAtIEFkZGVkIFNwYWNlQWxsb2NhdGVkQW5kVXNlZCgpIHRvIHJlcG9ydCBib3RoIHNwYWNlIHVzZWQgYW5kIGFsbG9jYXRlZAorICAgICAgLSBBZGRlZCBjb252ZW5pZW50IGNsYXNzIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcgorICAqIEFueQorICAgICAgLSBBbGxvdyBjdXN0b20gdHlwZSBVUkwgcHJlZml4ZXMgaW4gQW55IHBhY2tpbmcuCisgICAgICAtIFRleHRGb3JtYXQgbm93IGV4cGFuZCB0aGUgQW55IHR5cGUgcmF0aGVyIHRoYW4gcHJpbnRpbmcgYnl0ZXMuCisgICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBhbmQgdmFyaW91cyBidWcgZml4ZXMuCisKKyAgSmF2YSAoQmV0YSkKKyAgKiBJbnRyb2R1Y2VkIGFuIEV4cGVyaW1lbnRhbEFwaSBhbm5vdGF0aW9uLiBBbm5vdGF0ZWQgQVBJcyBhcmUgZXhwZXJpbWVudGFsCisgICAgYW5kIGFyZSBzdWJqZWN0IHRvIGNoYW5nZSBpbiBhIGJhY2t3YXJkIGluY29tcGF0aWJsZSB3YXkgaW4gZnV0dXJlIHJlbGVhc2VzLgorICAqIEludHJvZHVjZWQgemVyby1jb3B5IHNlcmlhbGl6YXRpb24gYXMgYW4gRXhwZXJpbWVudGFsQXBpCisgICAgICAtIEludHJvZHVjdGlvbiBvZiB0aGUgYEJ5dGVPdXRwdXRgIGludGVyZmFjZS4gVGhpcyBpcyBzaW1pbGFyIHRvCisgICAgICAgIGBPdXRwdXRTdHJlYW1gIGJ1dCBwcm92aWRlcyBzZW1hbnRpY3MgZm9yIGxhenkgd3JpdGluZyAoaS5lLiBubworICAgICAgICBpbW1lZGlhdGUgY29weSByZXF1aXJlZCkgb2YgZmllbGRzIHRoYXQgYXJlIGNvbnNpZGVyZWQgdG8gYmUgaW1tdXRhYmxlLgorICAgICAgLSBgQnl0ZVN0cmluZ2Agbm93IHN1cHBvcnRzIHdyaXRpbmcgdG8gYSBgQnl0ZU91dHB1dGAsIHdoaWNoIHdpbGwgZGlyZWN0bHkKKyAgICAgICAgZXhwb3NlIHRoZSBpbnRlcm5hbHMgb2YgdGhlIGBCeXRlU3RyaW5nYCAoaS5lLiBgYnl0ZVtdYCBvciBgQnl0ZUJ1ZmZlcmApCisgICAgICAgIHRvIHRoZSBgQnl0ZU91dHB1dGAgd2l0aG91dCBjb3B5aW5nLgorICAgICAgLSBgQ29kZWRPdXRwdXRTdHJlYW1gIG5vdyBzdXBwb3J0cyB3cml0aW5nIHRvIGEgYEJ5dGVPdXRwdXRgLiBgQnl0ZVN0cmluZ2AKKyAgICAgICAgaW5zdGFuY2VzIHRoYXQgYXJlIHRvbyBsYXJnZSB0byBmaXQgaW4gdGhlIGludGVybmFsIGJ1ZmZlciB3aWxsIGJlCisgICAgICAgIChsYXppbHkpIHdyaXR0ZW4gdG8gdGhlIGBCeXRlT3V0cHV0YCBkaXJlY3RseS4KKyAgICAgIC0gVGhpcyBhbGxvd3MgYXBwbGljYXRpb25zIHVzaW5nIGxhcmdlIGBCeXRlU3RyaW5nYCBmaWVsZHMgdG8gYXZvaWQKKyAgICAgICAgZHVwbGljYXRpb24gb2YgdGhlc2UgZmllbGRzIGVudGlyZWx5LiBTdWNoIGFuIGFwcGxpY2F0aW9uIGNhbiBzdXBwbHkgYQorICAgICAgICBgQnl0ZU91dHB1dGAgdGhhdCBjaGFpbnMgdG9nZXRoZXIgdGhlIGNodW5rcyByZWNlaXZlZCBmcm9tCisgICAgICAgIGBDb2RlZE91dHB1dFN0cmVhbWAgYmVmb3JlIGZvcndhcmRpbmcgdGhlbSBvbnRvIHRoZSBJTyBzeXN0ZW0uCisgICogT3RoZXIgcmVsYXRlZCBjaGFuZ2VzIHRvIGBDb2RlZE91dHB1dFN0cmVhbWAKKyAgICAgIC0gQWRkaXRpb25hbCB1c2Ugb2YgYHN1bi5taXNjLlVuc2FmZWAgd2hlcmUgcG9zc2libGUgdG8gcGVyZm9ybSBmYXN0CisgICAgICAgIGFjY2VzcyB0byBgYnl0ZVtdYCBhbmQgYEJ5dGVCdWZmZXJgIHZhbHVlcyBhbmQgYXZvaWRpbmcgdW5uZWNlc3NhcnkKKyAgICAgICAgcmFuZ2UgY2hlY2tpbmcuCisgICAgICAtIGBCeXRlQnVmZmVyYC1iYWNrZWQgYENvZGVkT3V0cHV0U3RyZWFtYCBub3cgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZQorICAgICAgICBgQnl0ZUJ1ZmZlcmAgcmF0aGVyIHRoYW4gdG8gYW4gaW50ZXJtZWRpYXRlIGFycmF5LgorICAqIEltcHJvdmVkIGxpdGUtcnVudGltZS4KKyAgICAgIC0gTGl0ZSBwcm90b3Mgbm93IGltcGxlbWVudCBkZWVwIGVxdWFscy9oYXNoQ29kZS90b1N0cmluZworICAgICAgLSBTaWduaWZpY2FudGx5IGltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBvZiBCdWlsZGVyI21lcmdlRnJvbSgpIGFuZAorICAgICAgICBCdWlsZGVyI21lcmdlRGVsaW1pdGVkRnJvbSgpCisgICogVmFyaW91cyBidWcgZml4ZXMgYW5kIHNtYWxsIGZlYXR1cmUgZW5oYW5jZW1lbnQuCisgICAgICAtIEZpeGVkIHN0YWNrIG92ZXJmbG93IHdoZW4gaW4gaGFzaENvZGUoKSBmb3IgaW5maW5pdGUgcmVjdXJzaXZlIG9uZW9mcy4KKyAgICAgIC0gRml4ZWQgdGhlIGxhenkgZmllbGQgcGFyc2luZyBpbiBsaXRlIHRvIG1lcmdlIHJhdGhlciB0aGFuIG92ZXJ3cml0ZS4KKyAgICAgIC0gVGV4dEZvcm1hdCBub3cgc3VwcG9ydHMgcmVwb3J0aW5nIGxpbmUvY29sdW1uIG51bWJlcnMgb24gZXJyb3JzLgorICAgICAgLSBVcGRhdGVkIHRvIGFkZCBhcHByb3ByaWF0ZSBAT3ZlcnJpZGUgZm9yIGJldHRlciBjb21waWxlciBlcnJvcnMuCisKKyAgUHl0aG9uIChCZXRhKQorICAqIEFkZGVkIEpTT04gZm9ybWF0IGZvciBBbnksIFN0cnVjdCwgVmFsdWUgYW5kIExpc3RWYWx1ZQorICAqIFsgXSBpcyBub3cgYWNjZXB0ZWQgZm9yIGJvdGggcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcyBhbmQgcmVwZWF0ZWQgbWVzc2FnZQorICAgIGZpZWxkcyBpbiB0ZXh0IGZvcm1hdCBwYXJzZXIuCisgICogTnVtZXJpY2FsIGZpZWxkIG5hbWUgaXMgbm93IHN1cHBvcnRlZCBpbiB0ZXh0IGZvcm1hdC4KKyAgKiBBZGRlZCBEaXNjYXJkVW5rbm93bkZpZWxkcyBBUEkgZm9yIHB5dGhvbiBwcm90b2J1ZiBtZXNzYWdlLgorCisgIE9iamVjdGl2ZS1DIChCZXRhKQorICAqIFByb3RvIGNvbW1lbnRzIG5vdyBjb21lIG92ZXIgYXMgSGVhZGVyRG9jIGNvbW1lbnRzIGluIHRoZSBnZW5lcmF0ZWQgc291cmNlcworICAgIHNvIFhjb2RlIGNhbiBwaWNrIHRoZW0gdXAgYW5kIGRpc3BsYXkgdGhlbS4KKyAgKiBUaGUgbGlicmFyeSBoZWFkZXJzIGhhdmUgYmVlbiB1cGRhdGVkIHRvIHVzZSBIZWFkZXJEb2MgY29tbWVudHMgc28gWGNvZGUgY2FuCisgICAgcGljayB0aGVtIHVwIGFuZCBkaXNwbGF5IHRoZW0uCisgICogVGhlIHBlciBtZXNzYWdlIGFuZCBwZXIgZmllbGQgb3ZlcmhlYWQgaW4gYm90aCBnZW5lcmF0ZWQgY29kZSBhbmQgcnVudGltZQorICAgIG9iamVjdCBzaXplcyB3YXMgcmVkdWNlZC4KKyAgKiBHZW5lcmF0ZWQgY29kZSBub3cgaW5jbHVkZSBkZXByZWNhdGVkIGFubm90YXRpb25zIHdoZW4gdGhlIHByb3RvIGZpbGUKKyAgICBpbmNsdWRlZCB0aGVtLgorCisgIEMjIChCZXRhKQorICBJbiBnZW5lcmFsOiBzb21lIGNoYW5nZXMgYXJlIGJyZWFraW5nLCB3aGljaCByZXF1aXJlIHJlZ2VuZXJhdGluZyBtZXNzYWdlcy4KKyAgTW9zdCB1c2VyLXdyaXR0ZW4gY29kZSB3aWxsIG5vdCBiZSBpbXBhY3RlZCAqZXhjZXB0KiBmb3IgdGhlIHJlbmFtaW5nIG9mIGVudW0KKyAgdmFsdWVzLgorCisgICogQWxsb3cgY3VzdG9tIHR5cGUgVVJMIHByZWZpeGVzIGluIGBBbnlgIHBhY2tpbmcsIGFuZCBpZ25vcmUgdGhlbSB3aGVuCisgICAgdW5wYWNraW5nCisgICogYHByb3RvY2AgaXMgbm93IGluIGEgc2VwYXJhdGUgTnVHZXQgcGFja2FnZSAoR29vZ2xlLlByb3RvYnVmLlRvb2xzKQorICAqIE5ldyBvcHRpb246IGBpbnRlcm5hbF9hY2Nlc3NgIHRvIGdlbmVyYXRlIGludGVybmFsIGNsYXNzZXMKKyAgKiBFbnVtIHZhbHVlcyBhcmUgbm93IFBhc2NhbENhc2VkLCBhbmQgaWYgdGhlcmUncyBhIHByZWZpeCB3aGljaCBtYXRjaGVzIHRoZQorICAgIG5hbWUgb2YgdGhlIGVudW0sIHRoYXQgaXMgcmVtb3ZlZCAoc28gYW4gZW51bSBgQ09MT1JgIHdpdGggYSB2YWx1ZQorICAgIGBDT0xPUl9CTFVFYCB3b3VsZCBnZW5lcmF0ZSBhIHZhbHVlIG9mIGp1c3QgYEJsdWVgKS4gQW4gb3B0aW9uCisgICAgKGBsZWdhY3lfZW51bV92YWx1ZXNgKSBpcyB0ZW1wb3JhcmlseSBhdmFpbGFibGUgdG8gZGlzYWJsZSB0aGlzLCBidXQgdGhlCisgICAgb3B0aW9uIHdpbGwgYmUgcmVtb3ZlZCBmb3IgR0EuCisgICogYGpzb25fbmFtZWAgb3B0aW9uIGlzIG5vdyBob25vcmVkCisgICogSWYgZ3JvdXAgdGFncyBhcmUgZW5jb3VudGVyZWQgd2hlbiBwYXJzaW5nLCB0aGV5IGFyZSB2YWxpZGF0ZWQgbW9yZQorICAgIHRob3JvdWdobHkgKGFsdGhvdWdoIHdlIGRvbid0IHN1cHBvcnQgYWN0dWFsIGdyb3VwcykKKyAgKiBOdUdldCBkZXBlbmRlbmNpZXMgYXJlIGJldHRlciBzcGVjaWZpZWQKKyAgKiBCcmVha2luZzogYFByZWNvbmRpdGlvbnNgIGlzIHJlbmFtZWQgdG8gYFByb3RvUHJlY29uZGl0aW9uc2AKKyAgKiBCcmVha2luZzogYEdlbmVyYXRlZENvZGVJbmZvYCBpcyByZW5hbWVkIHRvIGBHZW5lcmF0ZWRDbHJUeXBlSW5mb2AKKyAgKiBgSnNvbkZvcm1hdHRlcmAgbm93IGFsbG93cyB3cml0aW5nIHRvIGEgYFRleHRXcml0ZXJgCisgICogTmV3IGludGVyZmFjZSwgYElDdXN0b21EaWFnbm9zdGljTWVzc2FnZWAgdG8gYWxsb3cgbW9yZSBjb21wYWN0CisgICAgcmVwcmVzZW50YXRpb25zIGZyb20gYFRvU3RyaW5nYAorICAqIGBDb2RlZElucHV0U3RyZWFtYCBhbmQgYENvZGVkT3V0cHV0U3RyZWFtYCBub3cgaW1wbGVtZW50IGBJRGlzcG9zYWJsZWAsCisgICAgd2hpY2ggc2ltcGx5IGRpc3Bvc2VzIG9mIHRoZSBzdHJlYW1zIHRoZXkgd2VyZSBjb25zdHJ1Y3RlZCB3aXRoCisgICogTWFwIGZpZWxkcyBubyBsb25nZXIgc3VwcG9ydCBudWxsIHZhbHVlcyAoaW4gbGluZSB3aXRoIG90aGVyIGxhbmd1YWdlcykKKyAgKiBJbXByb3ZlbWVudHMgaW4gSlNPTiBmb3JtYXR0aW5nIGFuZCBwYXJzaW5nCisKKyAgSmF2YXNjcmlwdCAoQWxwaGEpCisgICogQmV0dGVyIHN1cHBvcnQgZm9yICJieXRlcyIgZmllbGRzOiBieXRlcyBmaWVsZHMgY2FuIGJlIHJlYWQgYXMgZWl0aGVyIGEKKyAgICBiYXNlNjQgc3RyaW5nIG9yIFVJbnQ4QXJyYXkgKGluIGVudmlyb25tZW50cyB3aGVyZSBUeXBlZEFycmF5IGlzIHN1cHBvcnRlZCkuCisgICogTmV3IHN1cHBvcnQgZm9yIENvbW1vbkpTIGltcG9ydHMuICBUaGlzIHNob3VsZCBtYWtlIGl0IGVhc2llciB0byB1c2UgdGhlCisgICAgSmF2YVNjcmlwdCBzdXBwb3J0IGluIE5vZGUuanMgYW5kIHRvb2xzIGxpa2UgV2ViUGFjay4gIFNlZSBqcy9SRUFETUUubWQgZm9yCisgICAgbW9yZSBpbmZvcm1hdGlvbi4KKyAgKiBTb21lIHNpZ25pZmljYW50IGludGVybmFsIHJlZmFjdG9yaW5nIHRvIHNpbXBsaWZ5IGFuZCBtb2R1bGFyaXplIHRoZSBjb2RlLgorCisgIFJ1YnkgKEFscGhhKQorICAqIEpTT04gc2VyaWFsaXphdGlvbiBub3cgcHJvcGVybHkgdXNlcyBjYW1lbENhc2VkIG5hbWVzLCB3aXRoIGEgcnVudGltZSBvcHRpb24KKyAgICB0aGF0IHdpbGwgcHJlc2VydmUgb3JpZ2luYWwgbmFtZXMgZnJvbSAucHJvdG8gZmlsZXMgaW5zdGVhZC4KKyAgKiBXZWxsLWtub3duIHR5cGVzIGFyZSBub3cgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KKyAgKiBSZWxlYXNlIG5vdyBpbmNsdWRlcyBiaW5hcnkgZ2VtcyBmb3IgV2luZG93cywgTWFjLCBhbmQgTGludXggaW5zdGVhZCBvZiBqdXN0CisgICAgc291cmNlIGdlbXMuCisgICogQnVnZml4IGZvciBzZXJpYWxpemluZyBvbmVvZnMuCisKKyAgQysrL0phdmEgTGl0ZSAoQWxwaGEpCisgICAgQSBuZXcgImxpdGUiIGdlbmVyYXRvciBwYXJhbWV0ZXIgd2FzIGludHJvZHVjZWQgaW4gdGhlIHByb3RvYyBmb3IgQysrIGFuZAorICAgIEphdmEgZm9yIFByb3RvMyBzeW50YXggbWVzc2FnZXMuIEV4YW1wbGUgdXNhZ2U6CisKKyAgICAgLi9wcm90b2MgLS1jcHBfb3V0PWxpdGU6JE9VVFBVVF9QQVRIIGZvby5wcm90bworCisgICAgVGhlIHByb3RvYyB3aWxsIHRyZWF0IHRoZSBjdXJyZW50IGlucHV0IGFuZCBhbGwgdGhlIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzCisgICAgYXMgTElURS4gVGhlIHNhbWUgZ2VuZXJhdG9yIHBhcmFtZXRlciBtdXN0IGJlIHVzZWQgdG8gZ2VuZXJhdGUgdGhlCisgICAgZGVwZW5kZW5jaWVzLgorCisgICAgSW4gUHJvdG8zIHN5bnRheCBmaWxlcywgIm9wdGltaXplZF9mb3I9TElURV9SVU5USU1FIiBpcyBubyBsb25nZXIgc3VwcG9ydGVkLgorCisKKzIwMTUtMTItMzAgdmVyc2lvbiAzLjAuMC1iZXRhLTIgKEMrKy9KYXZhL1B5dGhvbi9SdWJ5L05hbm8vT2JqZWN0aXZlLUMvQyMvSmF2YVNjcmlwdCkKKyAgR2VuZXJhbAorICAqIEludHJvZHVjZWQgYSBuZXcgbGFuZ3VhZ2UgaW1wbGVtZW50YXRpb246IEphdmFTY3JpcHQuCisgICogQWRkZWQgYSBuZXcgZmllbGQgb3B0aW9uICJqc29uX25hbWUiLiBCeSBkZWZhdWx0IHByb3RvIGZpZWxkIG5hbWVzIGFyZQorICAgIGNvbnZlcnRlZCB0byAibG93ZXJDYW1lbENhc2UiIGluIHByb3RvMyBKU09OIGZvcm1hdC4gVGhpcyBvcHRpb24gY2FuIGJlCisgICAgdXNlZCB0byBvdmVycmlkZSB0aGlzIGJlaGF2aW9yIGFuZCBzcGVjaWZ5IGEgZGlmZmVyZW50IEpTT04gbmFtZSBmb3IgdGhlCisgICAgZmllbGQuCisgICogQWRkZWQgY29uZm9ybWFuY2UgdGVzdHMgdG8gZW5zdXJlIGltcGxlbWVudGF0aW9ucyBhcmUgZm9sbG93aW5nIHByb3RvMyBKU09OCisgICAgc3BlY2lmaWNhdGlvbi4KKworICBDKysgKEJldGEpCisgICogVmFyaW91cyBidWcgZml4ZXMgYW5kIGltcHJvdmVtZW50cyB0byB0aGUgSlNPTiBzdXBwb3J0IHV0aWxpdHk6CisgICAgICAtIER1cGxpY2F0ZSBtYXAga2V5cyBpbiBKU09OIGFyZSBub3cgcmVqZWN0ZWQgKGkuZS4sIHRyYW5zbGF0aW9uIHdpbGwKKyAgICAgICAgZmFpbCkuCisgICAgICAtIEZpeGVkIHdpcmUtZm9ybWF0IGZvciBnb29nbGUucHJvdG9idWYuVmFsdWUvTGlzdFZhbHVlLgorICAgICAgLSBGaXhlZCBwcmVjaXNpb24gbG9zcyB3aGVuIGNvbnZlcnRpbmcgZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcC4KKyAgICAgIC0gRml4ZWQgYSBidWcgd2hlbiBwYXJzaW5nIGludmFsaWQgVVRGLTggY29kZSBwb2ludHMuCisgICAgICAtIEZpeGVkIGEgbWVtb3J5IGxlYWsuCisgICAgICAtIFJlZHVjZWQgY2FsbCBzdGFjayB1c2FnZS4KKworICBKYXZhIChCZXRhKQorICAqIENsZWFuZWQgdXAgc29tZSB1bnVzZWQgbWV0aG9kcyBvbiBDb2RlZE91dHB1dFN0cmVhbS4KKyAgKiBQcmVzaXplZCBsaXN0cyBmb3IgcGFja2VkIGZpZWxkcyBkdXJpbmcgcGFyc2luZyBpbiB0aGUgbGl0ZSBydW50aW1lIHRvCisgICAgcmVkdWNlIGFsbG9jYXRpb25zIGFuZCBpbXByb3ZlIHBlcmZvcm1hbmNlLgorICAqIEltcHJvdmVkIHRoZSBwZXJmb3JtYW5jZSBvZiB1bmtub3duIGZpZWxkcyBpbiB0aGUgbGl0ZSBydW50aW1lLgorICAqIEludHJvZHVjZWQgVW5zYWZlQnl0ZVN0cmluZ3MgdG8gc3VwcG9ydCB6ZXJvLWNvcHkgQnl0ZVN0cmluZyBjcmVhdGlvbi4KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBhbmQgaW1wcm92ZW1lbnRzIHRvIHRoZSBKU09OIHN1cHBvcnQgdXRpbGl0eToKKyAgICAgIC0gRml4ZWQgYSB0aHJlYWQtc2FmZXR5IGJ1Zy4KKyAgICAgIC0gQWRkZWQgYSBuZXcgb3B0aW9uIOKAnHByZXNlcnZpbmdQcm90b0ZpZWxkTmFtZXPigJ0gdG8gSnNvbkZvcm1hdC4KKyAgICAgIC0gQWRkZWQgYSBuZXcgb3B0aW9uIOKAnGluY2x1ZGluZ0RlZmF1bHRWYWx1ZUZpZWxkc+KAnSB0byBKc29uRm9ybWF0LgorICAgICAgLSBVcGRhdGVkIHRoZSBKU09OIHV0aWxpdHkgdG8gY29tcGx5IHdpdGggcHJvdG8zIEpTT04gc3BlY2lmaWNhdGlvbi4KKworICBQeXRob24gKEJldGEpCisgICogQWRkZWQgcHJvdG8zIEpTT04gZm9ybWF0IHV0aWxpdHkuIEl0IGluY2x1ZGVzIHN1cHBvcnQgZm9yIGFsbCBmaWVsZCB0eXBlcworICAgIGFuZCBhIGZldyB3ZWxsLWtub3duIHR5cGVzIGV4Y2VwdCBmb3IgQW55IGFuZCBTdHJ1Y3QuCisgICogQWRkZWQgcnVudGltZSBzdXBwb3J0IGZvciBBbnksIFRpbWVzdGFtcCwgRHVyYXRpb24gYW5kIEZpZWxkTWFzay4KKyAgKiBbIF0gaXMgbm93IGFjY2VwdGVkIGZvciByZXBlYXRlZCBzY2FsYXIgZmllbGRzIGluIHRleHQgZm9ybWF0IHBhcnNlci4KKyAgKiBNYXAgZmllbGRzIG5vdyBoYXZlIHByb3BlciBPKDEpIHBlcmZvcm1hbmNlIGZvciBsb29rdXAvaW5zZXJ0L2RlbGV0ZQorICAgIHdoZW4gdXNpbmcgdGhlIFB5dGhvbi9DKysgaW1wbGVtZW50YXRpb24uIFRoZXkgd2VyZSBwcmV2aW91c2x5IHVzaW5nIE8obikKKyAgICBzZWFyY2gtYmFzZWQgYWxnb3JpdGhtcyBiZWNhdXNlIHRoZSBDKysgcmVmbGVjdGlvbiBpbnRlcmZhY2UgZGlkbid0CisgICAgc3VwcG9ydCB0cnVlIG1hcCBvcGVyYXRpb25zLgorCisgIE9iamVjdGl2ZS1DIChCZXRhKQorICAqIFZhcmlvdXMgYnVnLWZpeGVzIGFuZCBjb2RlIHR3ZWFrcyB0byBwYXNzIG1vcmUgc3RyaWN0IGNvbXBpbGVyIHdhcm5pbmdzLgorICAqIE5vdyBoYXMgY29uZm9ybWFuY2UgdGVzdCBjb3ZlcmFnZSBhbmQgaXMgcGFzc2luZyBhbGwgdGVzdHMuCisKKyAgQyMgKEJldGEpCisgICogVmFyaW91cyBidWctZml4ZXMuCisgICogQ29kZSBnZW5lcmF0aW9uOiBGaWxlcyBnZW5lcmF0ZWQgaW4gZGlyZWN0b3JpZXMgYmFzZWQgb24gbmFtZXNwYWNlLgorICAqIENvZGUgZ2VuZXJhdGlvbjogSW5jbHVkZSBjb21tZW50cyBmcm9tIC5wcm90byBmaWxlcyBpbiBYTUwgZG9jCisgICAgY29tbWVudHMgKG5haXZlbHkpCisgICogQ29kZSBnZW5lcmF0aW9uOiBDaGFuZ2Ugb3JnYW5pemF0aW9uL25hbWluZyBvZiAicmVmbGVjdGlvbiBjbGFzcyIgKGFjY2VzcworICAgIHRvIGZpbGUgZGVzY3JpcHRvcikKKyAgKiBDb2RlIGdlbmVyYXRpb24gYW5kIGxpYnJhcnk6IEFkZCBQYXJzZXIgcHJvcGVydHkgdG8gTWVzc2FnZURlc2NyaXB0b3IsCisgICAgYW5kIGludHJvZHVjZSBhIG5vbi1nZW5lcmljIHBhcnNlciB0eXBlLgorICAqIExpYnJhcnk6IEFkZGVkIFR5cGVSZWdpc3RyeSB0byBzdXBwb3J0IEpTT04gcGFyc2luZy9mb3JtYXR0aW5nIG9mIEFueS4KKyAgKiBMaWJyYXJ5OiBBZGRlZCBBbnkuUGFjay9VbnBhY2sgc3VwcG9ydC4KKyAgKiBMaWJyYXJ5OiBJbXBsZW1lbnRlZCBKU09OIHBhcnNpbmcuCisKKyAgSmF2YXNjcmlwdCAoQWxwaGEpCisgICogQWRkZWQgcHJvdG8zIHN1cHBvcnQgZm9yIEphdmFTY3JpcHQuIFRoZSBydW50aW1lIGlzIHdyaXR0ZW4gaW4gcHVyZQorICAgIEphdmFTY3JpcHQgYW5kIHdvcmtzIGluIGJyb3dzZXJzIGFuZCBpbiBOb2RlLmpzLiBUbyBnZW5lcmF0ZSBKYXZhU2NyaXB0CisgICAgY29kZSBmb3IgeW91ciBwcm90bywgaW52b2tlIHByb3RvYyB3aXRoICItLWpzX291dCIuIFNlZSBqcy9SRUFETUUubWQKKyAgICBmb3IgbW9yZSBidWlsZCBpbnN0cnVjdGlvbnMuCisKKzIwMTUtMDgtMjYgdmVyc2lvbiAzLjAuMC1iZXRhLTEgKEMrKy9KYXZhL1B5dGhvbi9SdWJ5L05hbm8vT2JqZWN0aXZlLUMvQyMpCisgIEFib3V0IEJldGEKKyAgKiBUaGlzIGlzIHRoZSBmaXJzdCBiZXRhIHJlbGVhc2Ugb2YgcHJvdG9idWYgdjMuMC4wLiBOb3QgYWxsIGxhbmd1YWdlcworICAgIGhhdmUgcmVhY2hlZCBiZXRhIHN0YWdlLiBMYW5ndWFnZXMgbm90IG1hcmtlZCBhcyBiZXRhIGFyZSBzdGlsbCBpbgorICAgIGFscGhhIChpLmUuLCBiZSBwcmVwYXJlZCBmb3IgQVBJIGJyZWFraW5nIGNoYW5nZXMpLgorCisgIEdlbmVyYWwKKyAgKiBQcm90bzMgSlNPTiBpcyBzdXBwb3J0ZWQgaW4gc2V2ZXJhbCBsYW5ndWFnZXMgKGZ1bGx5IHN1cHBvcnRlZCBpbiBDKysKKyAgICBhbmQgSmF2YSwgcGFydGlhbGx5IHN1cHBvcnRlZCBpbiBSdWJ5L0MjKS4gVGhlIEpTT04gc3BlYyBpcyBkZWZpbmVkIGluCisgICAgdGhlIHByb3RvMyBsYW5ndWFnZSBndWlkZToKKworICAgICAgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy9kb2NzL3Byb3RvMyNqc29uCisKKyAgICBXZSB3aWxsIHB1Ymxpc2ggYSBtb3JlIGRldGFpbGVkIHNwZWMgdG8gZGVmaW5lIHRoZSBleGFjdCBiZWhhdmlvciBvZgorICAgIHByb3RvMy1jb25mb3JtYW50IEpTT04gc2VyaWFsaXplcnMgYW5kIHBhcnNlcnMuIFVudGlsIHRoZW4sIGRvIG5vdCByZWx5CisgICAgb24gc3BlY2lmaWMgYmVoYXZpb3JzIG9mIHRoZSBpbXBsZW1lbnRhdGlvbiBpZiBpdOKAmXMgbm90IGRvY3VtZW50ZWQgaW4KKyAgICB0aGUgYWJvdmUgc3BlYy4gTW9yZSBzcGVjaWZpY2FsbHksIHRoZSBiZWhhdmlvciBpcyBub3QgeWV0IGZpbmFsaXplZCBmb3IKKyAgICB0aGUgZm9sbG93aW5nOgorICAgICAgLSBQYXJzaW5nIGludmFsaWQgSlNPTiBpbnB1dCAoZS5nLiwgaW5wdXQgd2l0aCB0cmFpbGluZyBjb21tYXMpLgorICAgICAgLSBOb24tY2FtZWxDYXNlIG5hbWVzIGluIEpTT04gaW5wdXQuCisgICAgICAtIFRoZSBzYW1lIGZpZWxkIGFwcGVhcnMgbXVsdGlwbGUgdGltZXMgaW4gSlNPTiBpbnB1dC4KKyAgICAgIC0gSlNPTiBhcnJheXMgY29udGFpbiDigJxudWxs4oCdIHZhbHVlcy4KKyAgICAgIC0gVGhlIG1lc3NhZ2UgaGFzIHVua25vd24gZmllbGRzLgorCisgICogUHJvdG8zIG5vdyBlbmZvcmNlcyBzdHJpY3QgVVRGLTggY2hlY2tpbmcuIFBhcnNpbmcgd2lsbCBmYWlsIGlmIGEgc3RyaW5nCisgICAgZmllbGQgY29udGFpbnMgbm9uIFVURi04IGRhdGEuCisKKyAgQysrIChCZXRhKQorICAqIEludHJvZHVjZWQgbmV3IHV0aWxpdHkgZnVuY3Rpb25zL2NsYXNzZXMgaW4gdGhlIGdvb2dsZS9wcm90b2J1Zi91dGlsCisgICAgZGlyZWN0b3J5OgorICAgICAgLSBNZXNzYWdlRGlmZmVyZW5jZXI6IGNvbXBhcmUgdHdvIHByb3RvIG1lc3NhZ2VzIGFuZCByZXBvcnQgdGhlaXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaWZmZXJlbmNlcy4KKyAgICAgIC0gSnNvblV0aWw6IHN1cHBvcnQgY29udmVydGluZyBwcm90b2J1ZiBiaW5hcnkgZm9ybWF0IHRvL2Zyb20gSlNPTi4KKyAgICAgIC0gVGltZVV0aWw6IHV0aWxpdHkgZnVuY3Rpb25zIHRvIHdvcmsgd2l0aCB3ZWxsLWtub3duIHR5cGVzIFRpbWVzdGFtcAorICAgICAgICAgICAgICAgICAgYW5kIER1cmF0aW9uLgorICAgICAgLSBGaWVsZE1hc2tVdGlsOiB1dGlsaXR5IGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggRmllbGRNYXNrLgorCisgICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9uIG9mIGFyZW5hIGNvbnN0cnVjdGlvbiBhbmQgZGVzdHJ1Y3Rpb24uCisgICogQnVnIGZpeGVzIGZvciBhcmVuYSBhbmQgbWFwcyBzdXBwb3J0LgorICAqIENoYW5nZWQgdG8gdXNlIGNtYWtlIGZvciBXaW5kb3dzIFZpc3VhbCBTdHVkaW8gYnVpbGRzLgorICAqIEFkZGVkIEJhemVsIHN1cHBvcnQuCisKKyAgSmF2YSAoQmV0YSkKKyAgKiBJbnRyb2R1Y2VkIGEgbmV3IHV0aWwgcGFja2FnZSB0aGF0IHdpbGwgYmUgZGlzdHJpYnV0ZWQgYXMgYSBzZXBhcmF0ZQorICAgIGFydGlmYWN0IGluIG1hdmVuLiBJdCBjb250YWluczoKKyAgICAgIC0gSnNvbkZvcm1hdDogY29udmVydCBwcm90byBtZXNzYWdlcyB0by9mcm9tIEpTT04uCisgICAgICAtIFRpbWVVdGlsOiB1dGlsaXR5IGZ1bmN0aW9ucyB0byB3b3JrIHdpdGggVGltZXN0YW1wIGFuZCBEdXJhdGlvbi4KKyAgICAgIC0gRmllbGRNYXNrVXRpbDogdXRpbGl0eSBmdW5jdGlvbnMgdG8gd29yayB3aXRoIEZpZWxkTWFzay4KKworICAqIFRoZSBzdGF0aWMgUEFSU0VSIGluIGVhY2ggZ2VuZXJhdGVkIG1lc3NhZ2UgaXMgZGVwcmVjYXRlZCwgYW5kIGl0IHdpbGwKKyAgICBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuIEEgc3RhdGljIHBhcnNlcigpIGdldHRlciBpcyBnZW5lcmF0ZWQKKyAgICBmb3IgZWFjaCBtZXNzYWdlIHR5cGUgaW5zdGVhZC4KKyAgKiBQZXJmb3JtYW5jZSBvcHRpbWl6YXRpb25zIGZvciBTdHJpbmcgZmllbGRzIHNlcmlhbGl6YXRpb24uCisgICogUGVyZm9ybWFuY2Ugb3B0aW1pemF0aW9ucyBmb3IgTGl0ZSBydW50aW1lIG9uIEFuZHJvaWQ6CisgICAgICAtIFJlZHVjZWQgYWxsb2NhdGlvbnMKKyAgICAgIC0gUmVkdWNlZCBtZXRob2Qgb3ZlcmhlYWQgYWZ0ZXIgUHJvR3VhcmRpbmcKKyAgICAgIC0gUmVkdWNlZCBjb2RlIHNpemUgYWZ0ZXIgUHJvR3VhcmRpbmcKKworICBQeXRob24gKEFscGhhKQorICAqIFJlbW92ZWQgbGVnYWN5IFB5dGhvbiAyLjUgc3VwcG9ydC4KKyAgKiBNb3ZlZCB0byBhIHNpbmdsZSBQeXRob24gMi54LzMueC1jb21wYXRpYmxlIGNvZGViYXNlLCBpbnN0ZWFkIG9mIHVzaW5nIDJ0bzMuCisgICogRml4ZWQgYnVpbGQvdGVzdHMgb24gUHl0aG9uIDIuNiwgMi43LCAzLjMsIGFuZCAzLjQuCisgICAgICAtIFB1cmUtUHl0aG9uIHdvcmtzIG9uIGFsbCBmb3VyLgorICAgICAgLSBQeXRob24vQysrIGltcGxlbWVudGF0aW9uIHdvcmtzIG9uIGFsbCBidXQgMy40LCBkdWUgdG8gY2hhbmdlcyBpbiB0aGUKKyAgICAgICAgUHl0aG9uL0MrKyBBUEkgaW4gMy40LgorICAqIFNvbWUgcHJlbGltaW5hcnkgd29yayBoYXMgYmVlbiBkb25lIHRvIGFsbG93IGZvciBtdWx0aXBsZSBEZXNjcmlwdG9yUG9vbHMKKyAgICB3aXRoIFB5dGhvbi9DKysuCisKKyAgUnVieSAoQWxwaGEpCisgICogTWFueSBidWdmaXhlczoKKyAgICAgIC0gZml4ZWQgcGFyc2luZy9zZXJpYWxpemF0aW9uIG9mIGJ5dGVzLCBzaW50LCBzZml4ZWQgdHlwZXMKKyAgICAgIC0gb3RoZXIgcGFyc2VyIGJ1Z2ZpeGVzCisgICAgICAtIGZpeGVkIG1lbW9yeSBsZWFrIGFmZmVjdGluZyBSdWJ5IDIuMgorCisgIEphdmFOYW5vIChBbHBoYSkKKyAgKiBKYXZhTmFubyBnZW5lcmF0ZWQgY29kZSBub3cgd2lsbCBiZSBwdXQgaW4gYSBuYW5vIHBhY2thZ2UgYnkgZGVmYXVsdCB0bworICAgIGF2b2lkIGNvbmZsaWN0cyB3aXRoIEphdmEgZ2VuZXJhdGVkIGNvZGUuCisKKyAgT2JqZWN0aXZlLUMgKEFscGhhKQorICAqIEFkZGVkIG5vbi1udWxsIG1hcmt1cCB0byBPYmpDIGxpYnJhcnkuIFJlcXVpcmVzIFNESyA4LjQrIHRvIGJ1aWxkLgorICAqIE1hbnkgYnVnZml4ZXM6CisgICAgICAtIFJlbW92ZWQgdGhlIGNsYXNzL2VudW0gZmlsdGVyLgorICAgICAgLSBSZW5hbWVkIHNvbWUgaW50ZXJuYWwgdHlwZXMgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggdGhlIHdlbGwta25vd24gdHlwZXMKKyAgICAgICAgcHJvdG9zLgorICAgICAgLSBBZGRlZCBtaXNzaW5nIHN1cHBvcnQgZm9yIHBhcnNpbmcgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyBpbiBwYWNrZWQgb3IKKyAgICAgICAgdW5wYWNrZWQgZm9ybXMuCisgICAgICAtIEFkZGVkICpDb3VudCBmb3IgcmVwZWF0ZWQgYW5kIG1hcDw+IGZpZWxkcyB0byBhdm9pZCBhdXRvLWNyZWF0ZSB3aGVuCisgICAgICAgIGNoZWNraW5nIGZvciB0aGVtIGJlaW5nIHNldC4KKworICBDIyAoQWxwaGEpCisgICogTmFtZXNwYWNlIGNoYW5nZWQgdG8gR29vZ2xlLlByb3RvYnVmIChhbmQgTnVHZXQgcGFja2FnZSB3aWxsIGJlIG5hbWVkCisgICAgY29ycmVzcG9uZGluZ2x5KS4KKyAgKiBUYXJnZXQgcGxhdGZvcm1zIG5vdyAuTkVUIDQuNSBhbmQgc2VsZWN0ZWQgcG9ydGFibGUgc3Vic2V0cyBvbmx5LgorICAqIFJlbW92ZWQgbGl0ZSBydW50aW1lLgorICAqIFJlaW1wbGVtZW50YXRpb24gdG8gdXNlIG11dGFibGUgbWVzc2FnZSB0eXBlcy4KKyAgKiBOdWxsIHJlZmVyZW5jZXMgdXNlZCB0byByZXByZXNlbnQgIm5vIHZhbHVlIiBmb3IgbWVzc2FnZSB0eXBlIGZpZWxkcy4KKyAgKiBQcm90bzMgc2VtYW50aWNzIHN1cHBvcnRlZDsgcHJvdG8yIGZpbGVzIGFyZSBwcm9oaWJpdGVkIGZvciBDIyBjb2RlZ2VuLgorICAgIE1vc3QgcHJvdG8zIGZlYXR1cmVzIHN1cHBvcnRlZDoKKyAgICAgIC0gSlNPTiBmb3JtYXR0aW5nIChhLmsuYS4gc2VyaWFsaXphdGlvbiB0byBKU09OKSwgaW5jbHVkaW5nIHdlbGwta25vd24KKyAgICAgICAgdHlwZXMgKGV4Y2VwdCBmb3IgQW55KS4KKyAgICAgIC0gV3JhcHBlciB0eXBlcyBtYXBwZWQgdG8gbnVsbGFibGUgdmFsdWUgdHlwZXMgKG9yIHN0cmluZy9CeXRlU3RyaW5nCisgICAgICAgIGFsbG93aW5nIG51bGxhYmlsaXR5KS4gSlNPTiBwYXJzaW5nIGlzIG5vdCBzdXBwb3J0ZWQgeWV0LgorICAgICAgLSBtYXBzCisgICAgICAtIG9uZW9mCisgICAgICAtIGVudW0gdW5rbm93biB2YWx1ZSBwcmVzZXJ2YXRpb24KKworMjAxNS0wNS0yNSB2ZXJzaW9uIDMuMC4wLWFscGhhLTMgKE9iamVjdGl2ZS1DL0MjKToKKyAgR2VuZXJhbAorICAqIEludHJvZHVjZWQgdHdvIG5ldyBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgKE9iamVjdGl2ZS1DLCBDIykgdG8gcHJvdG8zLgorICAqIEV4cGxpY2l0ICJvcHRpb25hbCIga2V5d29yZCBhcmUgZGlzYWxsb3dlZCBpbiBwcm90bzMgc3ludGF4LCBhcyBmaWVsZHMgYXJlCisgICAgb3B0aW9uYWwgYnkgZGVmYXVsdC4KKyAgKiBHcm91cCBmaWVsZHMgYXJlIG5vIGxvbmdlciBzdXBwb3J0ZWQgaW4gcHJvdG8zIHN5bnRheC4KKyAgKiBDaGFuZ2VkIHJlcGVhdGVkIHByaW1pdGl2ZSBmaWVsZHMgdG8gdXNlIHBhY2tlZCBzZXJpYWxpemF0aW9uIGJ5IGRlZmF1bHQgaW4KKyAgICBwcm90bzMgKGltcGxlbWVudGVkIGZvciBDKyssIEphdmEsIFB5dGhvbiBpbiB0aGlzIHJlbGVhc2UpLiAgVGhlIHVzZXIgY2FuCisgICAgc3RpbGwgZGlzYWJsZSBwYWNrZWQgc2VyaWFsaXphdGlvbiBieSBzZXR0aW5nIHBhY2tlZCB0byBmYWxzZSBmb3Igbm93LgorICAqIEFkZGVkIHdlbGwta25vd24gdHlwZSBwcm90b3MgKGFueS5wcm90bywgZW1wdHkucHJvdG8sIHRpbWVzdGFtcC5wcm90bywKKyAgICBkdXJhdGlvbi5wcm90bywgZXRjLikuIFVzZXJzIGNhbiBpbXBvcnQgYW5kIHVzZSB0aGVzZSBwcm90b3MganVzdCBsaWtlCisgICAgcmVndWxhciBwcm90byBmaWxlcy4gQWRkaXRpb25hbCBydW50aW1lIHN1cHBvcnQgd2lsbCBiZSBhZGRlZCBmb3IgdGhlbSBpbgorICAgIGZ1dHVyZSByZWxlYXNlcyAoaW4gdGhlIGZvcm0gb2YgdXRpbGl0eSBoZWxwZXIgZnVuY3Rpb25zLCBvciBoYXZpbmcgdGhlbQorICAgIHJlcGxhY2VkIGJ5IGxhbmd1YWdlIHNwZWNpZmljIHR5cGVzIGluIGdlbmVyYXRlZCBjb2RlKS4KKyAgKiBBZGRlZCBhICJyZXNlcnZlZCIga2V5d29yZCBpbiBib3RoIHByb3RvMiBhbmQgcHJvdG8zIHN5bnRheC4gVXNlciBjYW4gdXNlCisgICAgdGhpcyBrZXl3b3JkIHRvIGRlY2xhcmUgcmVzZXJ2ZWQgZmllbGQgbnVtYmVycyBhbmQgbmFtZXMgdG8gcHJldmVudCB0aGVtCisgICAgZnJvbSBiZWluZyByZXVzZWQgYnkgb3RoZXIgZmllbGRzIGluIHRoZSBzYW1lIG1lc3NhZ2UuCisKKyAgICBUbyByZXNlcnZlIGZpZWxkIG51bWJlcnMsIGFkZCBhIHJlc2VydmVkIGRlY2xhcmF0aW9uIGluIHlvdXIgbWVzc2FnZToKKworICAgICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7CisgICAgICAgIHJlc2VydmVkIDIsIDE1LCA5IHRvIDExLCAzOworICAgICAgfQorCisgICAgVGhpcyByZXNlcnZlcyBmaWVsZCBudW1iZXJzIDIsIDMsIDksIDEwLCAxMSBhbmQgMTUuIElmIGEgdXNlciB1c2VzIGFueSBvZgorICAgIHRoZXNlIGFzIGZpZWxkIG51bWJlcnMsIHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIgd2lsbCByZXBvcnQgYW4gZXJyb3IuCisKKyAgICBGaWVsZCBuYW1lcyBjYW4gYWxzbyBiZSByZXNlcnZlZDoKKworICAgICAgbWVzc2FnZSBUZXN0TWVzc2FnZSB7CisgICAgICAgIHJlc2VydmVkICJmb28iLCAiYmFyIjsKKyAgICAgIH0KKworICAqIFZhcmlvdXMgYnVnIGZpeGVzIHNpbmNlIDMuMC4wLWFscGhhLTIKKworICBPYmplY3RpdmUtQworICAgIE9iamVjdGl2ZS1DIGluY2x1ZGVzIGEgY29kZSBnZW5lcmF0b3IgYW5kIGEgbmF0aXZlIG9iamVjdGl2ZS1jIHJ1bnRpbWUKKyAgICBsaWJyYXJ5LiAgQnkgYWRkaW5nIOKAnC0tb2JqY19vdXTigJ0gdG8gcHJvdG9jLCB0aGUgY29kZSBnZW5lcmF0b3Igd2lsbCBnZW5lcmF0ZQorICAgIGEgaGVhZGVyKCoucGJvYmpjLmgpIGFuZCBhbiBpbXBsZW1lbnRhdGlvbiBmaWxlKCoucGJvYmpjLm0pIGZvciBlYWNoIHByb3RvCisgICAgZmlsZS4KKworICAgIEluIHRoaXMgZmlyc3QgcmVsZWFzZSwgdGhlIGdlbmVyYXRlZCBpbnRlcmZhY2UgcHJvdmlkZXM6IGVudW1zLCBtZXNzYWdlcywKKyAgICBmaWVsZCBzdXBwb3J0KHNpbmdsZSwgcmVwZWF0ZWQsIG1hcCwgb25lb2YpLCBwcm90bzIgYW5kIHByb3RvMyBzeW50YXgKKyAgICBzdXBwb3J0LCBwYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uLiBJdOKAmXMgIGNvbXBhdGlibGUgd2l0aCBBUkMgYW5kIG5vbi1BUkMKKyAgICB1c2FnZS4gQmVzaWRlcywgdXNlciBjYW4gYWxzbyBhY2Nlc3MgaXQgdmlhIHRoZSBzd2lmdCBicmlkZ2luZyBoZWFkZXIuCisKKyAgICBTZWUgb2JqZWN0aXZlYy9SRUFETUUubWQgZm9yIGRldGFpbHMuCisKKyAgQyMKKyAgICAqIEMjIHByb3RvYnVmcyBhcmUgYmFzZWQgb24gcHJvamVjdAorICAgICAgaHR0cHM6Ly9naXRodWIuY29tL2pza2VldC9wcm90b2J1Zi1jc2hhcnAtcG9ydC4gVGhlIG9yaWdpbmFsIHByb2plY3Qgd2FzCisgICAgICBmcm96ZW4gYW5kIGFsbCB0aGUgbmV3IGRldmVsb3BtZW50IHdpbGwgaGFwcGVuIGhlcmUuCisgICAgKiBDb2RlZ2VuIHBsdWdpbiBmb3IgQyMgd2FzIGNvbXBsZXRlbHkgcmV3cml0dGVuIHRvIEMrKyBhbmQgaXMgbm93IGFuCisgICAgICBpbnRlZ3JhbCBwYXJ0IG9mIHByb3RvYy4KKyAgICAqIFNvbWUgcmVmYWN0b3JpbmdzIGFuZCBjbGVhbnVwIGhhcyBiZWVuIGFwcGxpZWQgdG8gdGhlIEMjIHJ1bnRpbWUgbGlicmFyeS4KKyAgICAqIE9ubHkgcHJvdG8yIGlzIHN1cHBvcnRlZCBpbiBDIyBhdCB0aGUgbW9tZW50LCBwcm90bzMgc3VwcG9ydCBpcyBpbgorICAgICAgcHJvZ3Jlc3MgYW5kIHdpbGwgbGlrZWx5IGJyaW5nIHNpZ25pZmljYW50IGJyZWFraW5nIGNoYW5nZXMgdG8gdGhlIEFQSS4KKworICAgIFNlZSBjc2hhcnAvUkVBRE1FLm1kIGZvciBkZXRhaWxzLgorCisgIEMrKworICAgICogQWRkZWQgcnVudGltZSBzdXBwb3J0IGZvciBBbnkgdHlwZS4gVG8gdXNlIEFueSBpbiB5b3VyIHByb3RvIGZpbGUsIGZpcnN0CisgICAgICBpbXBvcnQgdGhlIGRlZmluaXRpb24gb2YgQW55OgorCisgICAgICAgIC8vIGZvby5wcm90bworICAgICAgICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworICAgICAgICBtZXNzYWdlIEZvbyB7CisgICAgICAgICAgZ29vZ2xlLnByb3RvYnVmLkFueSBhbnlfZmllbGQgPSAxOworICAgICAgICB9CisgICAgICAgIG1lc3NhZ2UgQmFyIHsKKyAgICAgICAgICBpbnQzMiB2YWx1ZSA9IDE7CisgICAgICAgIH0KKworICAgICAgVGhlbiBpbiBDKysgeW91IGNhbiBhY2Nlc3MgdGhlIEFueSBmaWVsZCB1c2luZyBQYWNrRnJvbSgpL1VucGFja1RvKCkKKyAgICAgIG1ldGhvZHM6CisKKyAgICAgICAgRm9vIGZvbzsKKyAgICAgICAgQmFyIGJhciA9IC4uLjsKKyAgICAgICAgZm9vLm11dGFibGVfYW55X2ZpZWxkKCktPlBhY2tGcm9tKGJhcik7CisgICAgICAgIC4uLgorICAgICAgICBpZiAoZm9vLmFueV9maWVsZCgpLklzVHlwZTxCYXI+KCkpIHsKKyAgICAgICAgICBmb28uYW55X2ZpZWxkKCkuVW5wYWNrVG8oJmJhcik7CisgICAgICAgICAgLi4uCisgICAgICAgIH0KKyAgICAqIEluIHRleHQgZm9ybWF0LCBlbnRyaWVzIG9mIGEgbWFwIGZpZWxkIHdpbGwgYmUgc29ydGVkIGJ5IGtleS4KKworICBKYXZhCisgICAgKiBDb250aW51ZWQgb3B0aW1pemF0aW9ucyBvbiB0aGUgbGl0ZSBydW50aW1lIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UgZm9yCisgICAgICBBbmRyb2lkLgorCisgIFB5dGhvbgorICAgICogQWRkZWQgbWFwIHN1cHBvcnQuCisgICAgICAtIG1hcHMgbm93IGhhdmUgYSBkaWN0LWxpa2UgaW50ZXJmYWNlIChtc2cubWFwX2ZpZWxkW2tleV0gPSB2YWx1ZSkKKyAgICAgIC0gZXhpc3RpbmcgY29kZSB0aGF0IG1vZGlmaWVzIG1hcHMgdmlhIHRoZSByZXBlYXRlZCBmaWVsZCBpbnRlcmZhY2UKKyAgICAgICAgd2lsbCBuZWVkIHRvIGJlIHVwZGF0ZWQuCisKKyAgUnVieQorICAgICogSW1wcm92ZW1lbnRzIHRvIFJlcGVhdGVkRmllbGQncyBlbXVsYXRpb24gb2YgdGhlIFJ1YnkgQXJyYXkgQVBJLgorICAgICogVmFyaW91cyBzcGVlZHVwcyBhbmQgaW50ZXJuYWwgY2xlYW51cHMuCisKKzIwMTUtMDItMjYgdmVyc2lvbiAzLjAuMC1hbHBoYS0yIChQeXRob24vUnVieS9KYXZhTmFubyk6CisgIEdlbmVyYWwKKyAgKiBJbnRyb2R1Y2VkIHRocmVlIG5ldyBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbnMgKFJ1YnksIEphdmFOYW5vLCBhbmQKKyAgICBQeXRob24pIHRvIHByb3RvMy4KKyAgKiBWYXJpb3VzIGJ1ZyBmaXhlcyBzaW5jZSAzLjAuMC1hbHBoYS0xCisKKyAgUHl0aG9uOgorICAgIFB5dGhvbiBoYXMgcmVjZWl2ZWQgc2V2ZXJhbCB1cGRhdGVzLCBtb3N0IG5vdGFibHkgc3VwcG9ydCBmb3IgcHJvdG8zCisgICAgc2VtYW50aWNzIGluIGFueSAucHJvdG8gZmlsZSB0aGF0IGRlY2xhcmVzIHN5bnRheD0icHJvdG8zIi4KKyAgICBNZXNzYWdlcyBkZWNsYXJlZCBpbiBwcm90bzMgZmlsZXMgbm8gbG9uZ2VyIHJlcHJlc2VudCBmaWVsZCBwcmVzZW5jZQorICAgIGZvciBzY2FsYXIgZmllbGRzIChudW1iZXIsIGVudW1zLCBib29sZWFucywgb3Igc3RyaW5ncykuICBZb3UgY2FuCisgICAgbm8gbG9uZ2VyIGNhbGwgSGFzRmllbGQoKSBmb3Igc3VjaCBmaWVsZHMsIGFuZCB0aGV5IGFyZSBzZXJpYWxpemVkCisgICAgYmFzZWQgb24gd2hldGhlciB0aGV5IGhhdmUgYSBub24temVyby9lbXB0eS9mYWxzZSB2YWx1ZS4KKworICAgIE9uZSBvdGhlciBub3RhYmxlIGNoYW5nZSBpcyBpbiB0aGUgQysrLWFjY2VsZXJhdGVkIGltcGxlbWVudGF0aW9uLgorICAgIERlc2NyaXB0b3Igb2JqZWN0cyAod2hpY2ggZGVzY3JpYmUgdGhlIHByb3RvYnVmIHNjaGVtYSBhbmQgYWxsb3cKKyAgICByZWZsZWN0aW9uIG92ZXIgaXQpIGFyZSBubyBsb25nZXIgZHVwbGljYXRlZCBiZXR3ZWVuIHRoZSBQeXRob24KKyAgICBhbmQgQysrIGxheWVycy4gIFRoZSBQeXRob24gZGVzY3JpcHRvcnMgYXJlIG5vdyBzaW1wbGUgd3JhcHBlcnMKKyAgICBhcm91bmQgdGhlIEMrKyBkZXNjcmlwdG9ycy4gIFRoaXMgY2hhbmdlIHNob3VsZCBzaWduaWZpY2FudGx5CisgICAgcmVkdWNlIHRoZSBtZW1vcnkgdXNhZ2Ugb2YgcHJvZ3JhbXMgdGhhdCB1c2UgYSBsb3Qgb2YgbWVzc2FnZQorICAgIHR5cGVzLgorCisgIFJ1Ynk6CisgICAgV2UgaGF2ZSBhZGRlZCBwcm90bzMgc3VwcG9ydCBmb3IgUnVieSB2aWEgYSBuYXRpdmUgQyBleHRlbnNpb24uCisKKyAgICBUaGUgUnVieSBleHRlbnNpb24gaXRzZWxmIGlzIGluY2x1ZGVkIGluIHRoZSBydWJ5LyBkaXJlY3RvcnksIGFuZCBkZXRhaWxzIG9uCisgICAgYnVpbGRpbmcgYW5kIGluc3RhbGxpbmcgdGhlIGV4dGVuc2lvbiBhcmUgaW4gcnVieS9SRUFETUUubWQuIFRoZSBleHRlbnNpb24KKyAgICB3aWxsIGFsc28gYmUgcHVibGlzaGVkIGFzIGEgUnVieSBnZW0uIENvZGUgZ2VuZXJhdG9yIHN1cHBvcnQgaXMgaW5jbHVkZWQgYXMKKyAgICBwYXJ0IG9mIGBwcm90b2NgIHdpdGggdGhlIGAtLXJ1Ynlfb3V0YCBmbGFnLgorCisgICAgVGhlIFJ1YnkgZXh0ZW5zaW9uIGltcGxlbWVudHMgYSB1c2VyLWZyaWVuZGx5IERTTCB0byBkZWZpbmUgbWVzc2FnZSB0eXBlcworICAgIChhbHNvIGdlbmVyYXRlZCBieSB0aGUgY29kZSBnZW5lcmF0b3IgZnJvbSBgLnByb3RvYCBmaWxlcykuICBPbmNlIGEgbWVzc2FnZQorICAgIHR5cGUgaXMgZGVmaW5lZCwgdGhlIHVzZXIgbWF5IGNyZWF0ZSBpbnN0YW5jZXMgb2YgdGhlIG1lc3NhZ2UgdGhhdCBiZWhhdmUgaW4KKyAgICB3YXlzIGlkaW9tYXRpYyB0byBSdWJ5LiBGb3IgZXhhbXBsZToKKworICAgIC0gTWVzc2FnZSBmaWVsZHMgYXJlIHByZXNlbnQgYXMgb3JkaW5hcnkgUnVieSBwcm9wZXJ0aWVzIChnZXR0ZXIgbWV0aG9kCisgICAgICBgZm9vYCBhbmQgc2V0dGVyIG1ldGhvZCBgZm9vPWApLgorICAgIC0gUmVwZWF0ZWQgZmllbGQgZWxlbWVudHMgYXJlIHN0b3JlZCBpbiBhIGNvbnRhaW5lciB0aGF0IGFjdHMgbGlrZSBhIG5hdGl2ZQorICAgICAgUnVieSBhcnJheSwgYW5kIG1hcCBlbGVtZW50cyBhcmUgc3RvcmVkIGluIGEgY29udGFpbmVyIHRoYXQgYWN0cyBsaWtlIGEKKyAgICAgIG5hdGl2ZSBSdWJ5IGhhc2htYXAuCisgICAgLSBUaGUgdXN1YWwgd2VsbC1rbm93biBtZXRob2RzLCBzdWNoIGFzIGAjdG9fc2AsIGAjZHVwYCwgYW5kIHRoZSBsaWtlLCBhcmUKKyAgICAgIHByZXNlbnQuCisKKyAgICBVbmxpa2Ugc2V2ZXJhbCBleGlzdGluZyB0aGlyZC1wYXJ0eSBSdWJ5IGV4dGVuc2lvbnMgZm9yIHByb3RvYnVmLCB0aGlzCisgICAgZXh0ZW5zaW9uIGlzIGJ1aWx0IG9uIGEgInN0cm9uZ2x5LXR5cGVkIiBwaGlsb3NvcGh5OiBtZXNzYWdlIGZpZWxkcyBhbmQKKyAgICBhcnJheS9tYXAgY29udGFpbmVycyB3aWxsIHRocm93IGV4Y2VwdGlvbnMgZWFnZXJseSB3aGVuIHZhbHVlcyBvZiB0aGUKKyAgICBpbmNvcnJlY3QgdHlwZSBhcmUgaW5zZXJ0ZWQuCisKKyAgICBTZWUgcnVieS9SRUFETUUubWQgZm9yIGRldGFpbHMuCisKKyAgSmF2YU5hbm86CisgICAgSmF2YU5hbm8gaXMgYSBzcGVjaWFsIGNvZGUgZ2VuZXJhdG9yIGFuZCBydW50aW1lIGxpYnJhcnkgZGVzaWduZWQgZXNwZWNpYWxseQorICAgIGZvciByZXNvdXJjZS1yZXN0cmljdGVkIHN5c3RlbXMsIGxpa2UgQW5kcm9pZC4gSXQgaXMgdmVyeSByZXNvdXJjZS1mcmllbmRseQorICAgIGluIGJvdGggdGhlIGFtb3VudCBvZiBjb2RlIGFuZCB0aGUgcnVudGltZSBvdmVyaGVhZC4gSGVyZSBpcyBhbiBhbiBvdmVydmlldworICAgIG9mIEphdmFOYW5vIGZlYXR1cmVzIGNvbXBhcmVkIHdpdGggdGhlIG9mZmljaWFsIEphdmEgcHJvdG9idWY6CisKKyAgICAtIE5vIGRlc2NyaXB0b3JzIG9yIG1lc3NhZ2UgYnVpbGRlcnMuCisgICAgLSBBbGwgbWVzc2FnZXMgYXJlIG11dGFibGU7IGZpZWxkcyBhcmUgcHVibGljIEphdmEgZmllbGRzLgorICAgIC0gRm9yIG9wdGlvbmFsIGZpZWxkcyBvbmx5LCBlbmNhcHN1bGF0aW9uIGJlaGluZCBzZXR0ZXIvZ2V0dGVyL2hhenplci8KKyAgICAgIGNsZWFyZXIgZnVuY3Rpb25zIGlzIG9wdC1pbiwgd2hpY2ggcHJvdmlkZSBwcm9wZXIgJ2hhcycgc3RhdGUgc3VwcG9ydC4KKyAgICAtIEZvciBwcm90bzIsIGlmIG5vdCBvcHRlZCBpbiwgaGFzIHN0YXRlIChmaWVsZCBwcmVzZW5jZSkgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgIFNlcmlhbGl6YXRpb24gb3V0cHV0cyBhbGwgZmllbGRzIG5vdCBlcXVhbCB0byB0aGVpciBkZWZhdWx0cy4KKyAgICAgIFRoZSBiZWhhdmlvciBpcyBjb25zaXN0ZW50IHdpdGggcHJvdG8zIHNlbWFudGljcy4KKyAgICAtIFJlcXVpcmVkIGZpZWxkcyAocHJvdG8yIG9ubHkpIGFyZSBhbHdheXMgc2VyaWFsaXplZC4KKyAgICAtIEVudW0gY29uc3RhbnRzIGFyZSBpbnRlZ2VyczsgcHJvdGVjdGlvbiBhZ2FpbnN0IGludmFsaWQgdmFsdWVzIG9ubHkKKyAgICAgIHdoZW4gcGFyc2luZyBmcm9tIHRoZSB3aXJlLgorICAgIC0gRW51bSBjb25zdGFudHMgY2FuIGJlIGdlbmVyYXRlZCBpbnRvIGNvbnRhaW5lciBpbnRlcmZhY2VzIGJlYXJpbmcKKyAgICAgIHRoZSBlbnVtJ3MgbmFtZSAoc28gdGhlIHJlZmVyZW5jaW5nIGNvZGUgaXMgaW4gSmF2YSBzdHlsZSkuCisgICAgLSBDb2RlZElucHV0Qnl0ZUJ1ZmZlck5hbm8gY2FuIG9ubHkgdGFrZSBieXRlW10gKG5vdCBJbnB1dFN0cmVhbSkuCisgICAgLSBTaW1pbGFybHkgQ29kZWRPdXRwdXRCeXRlQnVmZmVyTmFubyBjYW4gb25seSB3cml0ZSB0byBieXRlW10uCisgICAgLSBSZXBlYXRlZCBmaWVsZHMgYXJlIGluIGFycmF5cywgbm90IEFycmF5TGlzdCBvciBWZWN0b3IuIE51bGwgYXJyYXkKKyAgICAgIGVsZW1lbnRzIGFyZSBhbGxvd2VkIGFuZCBzaWxlbnRseSBpZ25vcmVkLgorICAgIC0gRnVsbCBzdXBwb3J0IGZvciBzZXJpYWxpemluZy9kZXNlcmlhbGl6aW5nIHJlcGVhdGVkIHBhY2tlZCBmaWVsZHMuCisgICAgLSBTdXBwb3J0ICBleHRlbnNpb25zIChpbiBwcm90bzIpLgorICAgIC0gVW5zZXQgbWVzc2FnZXMvZ3JvdXBzIGFyZSBudWxsLCBub3QgYW4gaW1tdXRhYmxlIGVtcHR5IGRlZmF1bHQKKyAgICAgIGluc3RhbmNlLgorICAgIC0gdG9CeXRlQXJyYXkoLi4uKSBhbmQgbWVyZ2VGcm9tKC4uLikgYXJlIG5vdyBzdGF0aWMgZnVuY3Rpb25zIG9mCisgICAgICBNZXNzYWdlTmFuby4KKyAgICAtIFRoZSAnYnl0ZXMnIHR5cGUgdHJhbnNsYXRlcyB0byB0aGUgSmF2YSB0eXBlIGJ5dGVbXS4KKworICAgIFNlZSBqYXZhbmFuby9SRUFETUUudHh0IGZvciBkZXRhaWxzLgorCisyMDE0LTEyLTAxIHZlcnNpb24gMy4wLjAtYWxwaGEtMSAoQysrL0phdmEpOgorCisgIEdlbmVyYWwKKyAgKiBJbnRyb2R1Y2VkIFByb3RvY29sIEJ1ZmZlcnMgbGFuZ3VhZ2UgdmVyc2lvbiAzIChha2EgcHJvdG8zKS4KKworICAgIFdoZW4gcHJvdG9idWYgd2FzIGluaXRpYWxseSBvcGVuc291cmNlZCBpdCBpbXBsZW1lbnRlZCBQcm90b2NvbCBCdWZmZXJzCisgICAgbGFuZ3VhZ2UgdmVyc2lvbiAyIChha2EgcHJvdG8yKSwgd2hpY2ggaXMgd2h5IHRoZSB2ZXJzaW9uIG51bWJlcgorICAgIHN0YXJ0ZWQgZnJvbSB2Mi4wLjAuIEZyb20gdjMuMC4wLCBhIG5ldyBsYW5ndWFnZSB2ZXJzaW9uIChwcm90bzMpIGlzCisgICAgaW50cm9kdWNlZCB3aGlsZSB0aGUgb2xkIHZlcnNpb24gKHByb3RvMikgd2lsbCBjb250aW51ZSB0byBiZSBzdXBwb3J0ZWQuCisKKyAgICBUaGUgbWFpbiBpbnRlbnQgb2YgaW50cm9kdWNpbmcgcHJvdG8zIGlzIHRvIGNsZWFuIHVwIHByb3RvYnVmIGJlZm9yZQorICAgIHB1c2hpbmcgdGhlIGxhbmd1YWdlIGFzIHRoZSBmb3VuZGF0aW9uIG9mIEdvb2dsZSdzIG5ldyBBUEkgcGxhdGZvcm0uCisgICAgSW4gcHJvdG8zLCB0aGUgbGFuZ3VhZ2UgaXMgc2ltcGxpZmllZCwgYm90aCBmb3IgZWFzZSBvZiB1c2UgYW5kICB0bworICAgIG1ha2UgaXQgYXZhaWxhYmxlIGluIGEgd2lkZXIgcmFuZ2Ugb2YgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2VzLiBBdCB0aGUKKyAgICBzYW1lIHRpbWUgYSBmZXcgZmVhdHVyZXMgYXJlIGFkZGVkIHRvIGJldHRlciBzdXBwb3J0IGNvbW1vbiBpZGlvbXMKKyAgICBmb3VuZCBpbiBBUElzLgorCisgICAgVGhlIGZvbGxvd2luZyBhcmUgdGhlIG1haW4gbmV3IGZlYXR1cmVzIGluIGxhbmd1YWdlIHZlcnNpb24gMzoKKworICAgICAgMS4gUmVtb3ZhbCBvZiBmaWVsZCBwcmVzZW5jZSBsb2dpYyBmb3IgcHJpbWl0aXZlIHZhbHVlIGZpZWxkcywgcmVtb3ZhbAorICAgICAgICAgb2YgcmVxdWlyZWQgZmllbGRzLCBhbmQgcmVtb3ZhbCBvZiBkZWZhdWx0IHZhbHVlcy4gVGhpcyBtYWtlcyBwcm90bzMKKyAgICAgICAgIHNpZ25pZmljYW50bHkgZWFzaWVyIHRvIGltcGxlbWVudCB3aXRoIG9wZW4gc3RydWN0IHJlcHJlc2VudGF0aW9ucywKKyAgICAgICAgIGFzIGluIGxhbmd1YWdlcyBsaWtlIEFuZHJvaWQgSmF2YSwgT2JqZWN0aXZlIEMsIG9yIEdvLgorICAgICAgMi4gUmVtb3ZhbCBvZiB1bmtub3duIGZpZWxkcy4KKyAgICAgIDMuIFJlbW92YWwgb2YgZXh0ZW5zaW9ucywgd2hpY2ggYXJlIGluc3RlYWQgcmVwbGFjZWQgYnkgYSBuZXcgc3RhbmRhcmQKKyAgICAgICAgIHR5cGUgY2FsbGVkIEFueS4KKyAgICAgIDQuIEZpeCBzZW1hbnRpY3MgZm9yIHVua25vd24gZW51bSB2YWx1ZXMuCisgICAgICA1LiBBZGRpdGlvbiBvZiBtYXBzLgorICAgICAgNi4gQWRkaXRpb24gb2YgYSBzbWFsbCBzZXQgb2Ygc3RhbmRhcmQgdHlwZXMgZm9yIHJlcHJlc2VudGF0aW9uIG9mIHRpbWUsCisgICAgICAgICBkeW5hbWljIGRhdGEsIGV0Yy4KKyAgICAgIDcuIEEgd2VsbC1kZWZpbmVkIGVuY29kaW5nIGluIEpTT04gYXMgYW4gYWx0ZXJuYXRpdmUgdG8gYmluYXJ5IHByb3RvCisgICAgICAgICBlbmNvZGluZy4KKworICAgIFRoaXMgcmVsZWFzZSAodjMuMC4wLWFscGhhLTEpIGluY2x1ZGVzIHBhcnRpYWwgcHJvdG8zIHN1cHBvcnQgZm9yIEMrKyBhbmQKKyAgICBKYXZhLiBJdGVtcyA2ICh3ZWxsLWtub3duIHR5cGVzKSBhbmQgNyAoSlNPTiBmb3JtYXQpIGluIHRoZSBhYm92ZSBmZWF0dXJlCisgICAgbGlzdCBhcmUgbm90IGltcGxlbWVudGVkLgorCisgICAgQSBuZXcgbm90aW9uICJzeW50YXgiIGlzIGludHJvZHVjZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgLnByb3RvIGZpbGUKKyAgICB1c2VzIHByb3RvMiBvciBwcm90bzM6CisKKyAgICAgIC8vIGZvby5wcm90bworICAgICAgc3ludGF4ID0gInByb3RvMyI7CisgICAgICBtZXNzYWdlIEJhciB7Li4ufQorCisgICAgSWYgb21pdHRlZCwgdGhlIHByb3RvY29sIGNvbXBpbGVyIHdpbGwgZ2VuZXJhdGUgYSB3YXJuaW5nIGFuZCAicHJvdG8yIiB3aWxsCisgICAgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdC4gVGhpcyB3YXJuaW5nIHdpbGwgYmUgdHVybmVkIGludG8gYW4gZXJyb3IgaW4gYQorICAgIGZ1dHVyZSByZWxlYXNlLgorCisgICAgV2UgcmVjb21tZW5kIHRoYXQgbmV3IFByb3RvY29sIEJ1ZmZlcnMgdXNlcnMgdXNlIHByb3RvMy4gSG93ZXZlciwgd2UgZG8gbm90CisgICAgZ2VuZXJhbGx5IHJlY29tbWVuZCB0aGF0IGV4aXN0aW5nIHVzZXJzIG1pZ3JhdGUgZnJvbSBwcm90bzIgZnJvbSBwcm90bzMgZHVlCisgICAgdG8gQVBJIGluY29tcGF0aWJpbGl0eSwgYW5kIHdlIHdpbGwgY29udGludWUgdG8gc3VwcG9ydCBwcm90bzIgZm9yIGEgbG9uZworICAgIHRpbWUuCisKKyAgKiBBZGRlZCBzdXBwb3J0IGZvciBtYXAgZmllbGRzIChpbXBsZW1lbnRlZCBpbiBDKysvSmF2YSBmb3IgYm90aCBwcm90bzIgYW5kCisgICAgcHJvdG8zKS4KKworICAgIE1hcCBmaWVsZHMgY2FuIGJlIGRlY2xhcmVkIHVzaW5nIHRoZSBmb2xsb3dpbmcgc3ludGF4OgorCisgICAgICBtZXNzYWdlIEZvbyB7CisgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFsdWVzID0gMTsKKyAgICAgIH0KKworICAgIERhdGEgb2YgYSBtYXAgZmllbGQgd2lsbCBiZSBzdG9yZWQgaW4gbWVtb3J5IGFzIGFuIHVub3JkZXJlZCBtYXAgYW5kIGl0CisgICAgY2FuIGJlIGFjY2Vzc2VkIHRocm91Z2ggZ2VuZXJhdGVkIGFjY2Vzc29ycy4KKworICBDKysKKyAgKiBBZGRlZCBhcmVuYSBhbGxvY2F0aW9uIHN1cHBvcnQgKGZvciBib3RoIHByb3RvMiBhbmQgcHJvdG8zKS4KKworICAgIFByb2ZpbGluZyBzaG93cyBtZW1vcnkgYWxsb2NhdGlvbiBhbmQgZGVhbGxvY2F0aW9uIGNvbnN0aXR1dGVzIGEgc2lnbmlmaWNhbnQKKyAgICBmcmFjdGlvbiBvZiBDUFUtdGltZSBzcGVudCBpbiBwcm90b2J1ZiBjb2RlIGFuZCBhcmVuYSBhbGxvY2F0aW9uIGlzIGEKKyAgICB0ZWNobmlxdWUgaW50cm9kdWNlZCB0byByZWR1Y2UgdGhpcyBjb3N0LiBXaXRoIGFyZW5hIGFsbG9jYXRpb24sIG5ldworICAgIG9iamVjdHMgd2lsbCBiZSBhbGxvY2F0ZWQgZnJvbSBhIGxhcmdlIHBpZWNlIG9mIHByZWFsbG9jYXRlZCBtZW1vcnkgYW5kCisgICAgZGVhbGxvY2F0aW9uIG9mIHRoZXNlIG9iamVjdHMgaXMgYWxtb3N0IGZyZWUuIEVhcmx5IGFkb3B0aW9uIHNob3dzIDIwJSB0bworICAgIDUwJSBpbXByb3ZlbWVudCBpbiBzb21lIEdvb2dsZSBiaW5hcmllcy4KKworICAgIFRvIGVuYWJsZSBhcmVuYSBzdXBwb3J0LCBhZGQgdGhlIGZvbGxvd2luZyBvcHRpb24gdG8geW91ciAucHJvdG8gZmlsZToKKworICAgICAgb3B0aW9uIGNjX2VuYWJsZV9hcmVuYXMgPSB0cnVlOworCisgICAgUHJvdG9jb2wgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhZGRpdGlvbmFsIGNvZGUgdG8gbWFrZSB0aGUgZ2VuZXJhdGVkCisgICAgbWVzc2FnZSBjbGFzc2VzIHdvcmsgd2l0aCBhcmVuYXMuIFRoaXMgZG9lcyBub3QgY2hhbmdlIHRoZSBleGlzdGluZyBBUEkKKyAgICBvZiBwcm90b2J1ZiBtZXNzYWdlcyBhbmQgZG9lcyBub3QgYWZmZWN0IHdpcmUgZm9ybWF0LiBZb3VyIGV4aXN0aW5nIGNvZGUKKyAgICBzaG91bGQgY29udGludWUgdG8gd29yayBhZnRlciBhZGRpbmcgdGhpcyBvcHRpb24uIEluIHRoZSBmdXR1cmUgd2Ugd2lsbAorICAgIG1ha2UgdGhpcyBvcHRpb24gZW5hYmxlZCBieSBkZWZhdWx0LgorCisgICAgVG8gYWN0dWFsbHkgdGFrZSBhZHZhbnRhZ2Ugb2YgYXJlbmEgYWxsb2NhdGlvbiwgeW91IG5lZWQgdG8gdXNlIHRoZSBhcmVuYQorICAgIEFQSXMgd2hlbiBjcmVhdGluZyBtZXNzYWdlcy4gQSBxdWljayBleGFtcGxlIG9mIHVzaW5nIHRoZSBhcmVuYSBBUEk6CisKKyAgICAgIHsKKyAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmE7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgcHJvdG9idWYgbWVzc2FnZSBpbiB0aGUgYXJlbmEuCisgICAgICAgIE15TWVzc2FnZSogbWVzc2FnZSA9IEFyZW5hOjpDcmVhdGVNZXNzYWdlPE15TWVzc2FnZT4oJmFyZW5hKTsKKyAgICAgICAgLy8gQWxsIHN1Ym1lc3NhZ2VzIHdpbGwgYmUgYWxsb2NhdGVkIGluIHRoZSBzYW1lIGFyZW5hLgorICAgICAgICBpZiAoIW1lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhkYXRhKSkgeworICAgICAgICAgIC8vIERlYWwgd2l0aCBtYWxmb3JtZWQgaW5wdXQgZGF0YS4KKyAgICAgICAgfQorICAgICAgICAvLyBNdXN0IG5vdCBkZWxldGUgdGhlIG1lc3NhZ2UgaGVyZS4gSXQgd2lsbCBiZSBkZWxldGVkIGF1dG9tYXRpY2FsbHkKKyAgICAgICAgLy8gd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkLgorICAgICAgfQorCisgICAgQ3VycmVudGx5IGFyZW5hIGRvZXMgbm90IHdvcmsgd2l0aCBtYXAgZmllbGRzLiBFbmFibGluZyBhcmVuYSBpbiBhIC5wcm90bworICAgIGZpbGUgY29udGFpbmluZyBtYXAgZmllbGRzIHdpbGwgcmVzdWx0IGluIGNvbXBpbGUgZXJyb3JzIGluIHRoZSBnZW5lcmF0ZWQKKyAgICBjb2RlLiBUaGlzIHdpbGwgYmUgYWRkcmVzc2VkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisKKzIwMTQtMTAtMjAgdmVyc2lvbiAyLjYuMToKKworICBDKysKKyAgKiBBZGRlZCBhdG9taWNvcHMgc3VwcG9ydCBmb3IgU29sYXJpcy4KKyAgKiBSZWxlYXNlZCBtZW1vcnkgYWxsb2NhdGVkIGJ5IEluaXRpYWxpemVEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKSBhbmQKKyAgICBHZXRFbXB0eVN0cmluZygpLiBTb21lIG1lbW9yeSBzYW5pdGl6ZXJzIHJlcG9ydGVkIHRoZW0gYXMgbWVtb3J5IGxlYWtzLgorCisgIEphdmEKKyAgKiBVcGRhdGVkIER5bmFtaWNNZXNzYWdlLnNldEZpZWxkKCkgdG8gaGFuZGxlIHJlcGVhdGVkIGVudW0gdmFsdWVzCisgICAgY29ycmVjdGx5LgorICAqIEZpeGVkIGEgYnVnIHRoYXQgY2F1c2VkIE51bGxQb2ludGVyRXhjZXB0aW9uIHRvIGJlIHRocm93biB3aGVuCisgICAgY29udmVydGluZyBtYW51YWxseSBjb25zdHJ1Y3RlZCBGaWxlRGVzY3JpcHRvclByb3RvIHRvCisgICAgRmlsZURlc2NyaXB0b3IuCisKKyAgUHl0aG9uCisgICogRml4ZWQgV2hpY2hPbmVvZigpIHRvIHdvcmsgd2l0aCBkZS1zZXJpYWxpemVkIHByb3RvYnVmIG1lc3NhZ2VzLgorICAqIEZpeGVkIGEgbWlzc2luZyBmaWxlIHByb2JsZW0gb2YgUHl0aG9uIEMrKyBpbXBsZW1lbnRhdGlvbi4KKworMjAxNC0wOC0xNSB2ZXJzaW9uIDIuNi4wOgorCisgIEdlbmVyYWwKKyAgKiBBZGRlZCBvbmVvZnModW5pb25zKSBmZWF0dXJlLiBGaWVsZHMgaW4gdGhlIHNhbWUgb25lb2Ygd2lsbCBzaGFyZQorICAgIG1lbW9yeSBhbmQgYXQgbW9zdCBvbmUgZmllbGQgY2FuIGJlIHNldCBhdCB0aGUgc2FtZSB0aW1lLiBVc2UgdGhlCisgICAgb25lb2Yga2V5d29yZCB0byBkZWZpbmUgYSBvbmVvZiBsaWtlOgorICAgICAgbWVzc2FnZSBTYW1wbGVNZXNzYWdlIHsKKyAgICAgICAgb25lb2YgdGVzdF9vbmVvZiB7CisgICAgICAgICAgc3RyaW5nIG5hbWUgPSA0OworICAgICAgICAgIFlvdXJNZXNzYWdlIHN1Yl9tZXNzYWdlID0gOTsKKyAgICAgICAgfQorICAgICAgfQorICAqIEZpbGVzLCBzZXJ2aWNlcywgZW51bXMsIG1lc3NhZ2VzLCBtZXRob2RzIGFuZCBlbnVtIHZhbHVlcyBjYW4gYmUgbWFya2VkCisgICAgYXMgZGVwcmVjYXRlZCBub3cuCisgICogQWRkZWQgU3VwcG9ydCBmb3IgbGlzdCB2YWx1ZXMsIGluY2x1ZGluZyBsaXN0cyBvZiBtZXNzYWdlcywgd2hlbgorICAgIHBhcnNpbmcgdGV4dC1mb3JtYXR0ZWQgcHJvdG9zIGluIEMrKyBhbmQgSmF2YS4KKyAgICAgIEZvciBleGFtcGxlOiAgZm9vOiBbMSwgMiwgM10KKworICBDKysKKyAgKiBFbmhhbmNlZCBjdXN0b21pemF0aW9uIG9uIFRlc3RGb3JtYXQgcHJpbnRpbmcuCisgICogQWRkZWQgU3dhcEZpZWxkcygpIGluIHJlZmxlY3Rpb24gQVBJIHRvIHN3YXAgYSBzdWJzZXQgb2YgZmllbGRzLgorICAgIEFkZGVkIFNldEFsbG9jYXRlZE1lc3NhZ2UoKSBpbiByZWZsZWN0aW9uIEFQSS4KKyAgKiBSZXBlYXRlZCBwcmltaXRpdmUgZXh0ZW5zaW9ucyBhcmUgbm93IHBhY2thYmxlLiBUaGUKKyAgICBbcGFja2VkPXRydWVdIG9wdGlvbiBvbmx5IGFmZmVjdHMgc2VyaWFsaXplcnMuIFRoZXJlZm9yZSwgaXQgaXMKKyAgICBwb3NzaWJsZSB0byBzd2l0Y2ggYSByZXBlYXRlZCBleHRlbnNpb24gZmllbGQgdG8gcGFja2VkIGZvcm1hdAorICAgIHdpdGhvdXQgYnJlYWtpbmcgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCisgICogVmFyaW91cyBzcGVlZCBvcHRpbWl6YXRpb25zLgorCisgIEphdmEKKyAgKiB3cml0ZVRvKCkgbWV0aG9kIGluIEJ5dGVTdHJpbmcgY2FuIG5vdyB3cml0ZSBhIHN1YnN0cmluZyB0byBhbgorICAgIG91dHB1dCBzdHJlYW0uIEFkZGVkIGVuZFdpdGgoKSBtZXRob2QgZm9yIEJ5dGVTdHJpbmcuCisgICogQnl0ZVN0cmluZyBhbmQgQnl0ZUJ1ZmZlciBhcmUgbm93IHN1cHBvcnRlZCBpbiBDb2RlZElucHV0U3RyZWFtCisgICAgYW5kIENvZGVkT3V0cHV0U3RyZWFtLgorICAqIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoIGNhbiBub3cgYmUgdXNlZCB3aXRoIHRoZSBMSVRFX1JVTlRJTUUuCisKKyAgUHl0aG9uCisgICogQSBuZXcgQysrLWJhY2tlZCBleHRlbnNpb24gbW9kdWxlIChha2EgImNwcCBhcGkgdjIiKSB0aGF0IHJlcGxhY2VzIHRoZQorICAgIG9sZCAoImNwcCBhcGkgdjEiKSBvbmUuICBNdWNoIGZhc3RlciB0aGFuIHRoZSBwdXJlIFB5dGhvbiBjb2RlLiAgVGhpcyBvbmUKKyAgICByZXNvbHZlcyBtYW55IGJ1Z3MgYW5kIGlzIHJlY29tbWVuZGVkIGZvciBnZW5lcmFsIHVzZSBvdmVyIHRoZQorICAgIHB1cmUgUHl0aG9uIHdoZW4gcG9zc2libGUuCisgICogRGVzY3JpcHRvcnMgbm93IGhhdmUgZW51bV90eXBlc19ieV9uYW1lIGFuZCBleHRlbnNpb25fdHlwZXNfYnlfbmFtZSBkaWN0CisgICAgYXR0cmlidXRlcy4KKyAgKiBTdXBwb3J0IGZvciBQeXRob24gMy4KKworMjAxMy0wMi0yNyB2ZXJzaW9uIDIuNS4wOgorCisgIEdlbmVyYWwKKyAgKiBOZXcgbm90aW9uICJpbXBvcnQgcHVibGljIiB0aGF0IGFsbG93cyBhIHByb3RvIGZpbGUgdG8gZm9yd2FyZCB0aGUgY29udGVudAorICAgIGl0IGltcG9ydHMgdG8gaXRzIGltcG9ydGVycy4gRm9yIGV4YW1wbGUsCisgICAgICAvLyBmb28ucHJvdG8KKyAgICAgIGltcG9ydCBwdWJsaWMgImJhci5wcm90byI7CisgICAgICBpbXBvcnQgImJhei5wcm90byI7CisKKyAgICAgIC8vIHF1eC5wcm90bworICAgICAgaW1wb3J0ICJmb28ucHJvdG8iOworICAgICAgLy8gU3R1ZmYgZGVmaW5lZCBpbiBiYXIucHJvdG8gbWF5IGJlIHVzZWQgaW4gdGhpcyBmaWxlLCBidXQgc3R1ZmYgZnJvbQorICAgICAgLy8gYmF6LnByb3RvIG1heSBOT1QgYmUgdXNlZCB3aXRob3V0IGltcG9ydGluZyBpdCBleHBsaWNpdGx5LgorICAgIFRoaXMgaXMgdXNlZnVsIGZvciBtb3ZpbmcgcHJvdG8gZmlsZXMuIFRvIG1vdmUgYSBwcm90byBmaWxlLCBqdXN0IGxlYXZlCisgICAgYSBzaW5nbGUgImltcG9ydCBwdWJsaWMiIGluIHRoZSBvbGQgcHJvdG8gZmlsZS4KKyAgKiBOZXcgZW51bSBvcHRpb24gImFsbG93X2FsaWFzIiB0aGF0IHNwZWNpZmllcyB3aGV0aGVyIGRpZmZlcmVudCBzeW1ib2xzIGNhbgorICAgIGJlIGFzc2lnbmVkIHRoZSBzYW1lIG51bWVyaWMgdmFsdWUuIERlZmF1bHQgdmFsdWUgaXMgInRydWUiLiBTZXR0aW5nIGl0IHRvCisgICAgZmFsc2UgY2F1c2VzIHRoZSBjb21waWxlciB0byByZWplY3QgZW51bSBkZWZpbml0aW9ucyB3aGVyZSBtdWx0aXBsZSBzeW1ib2xzCisgICAgaGF2ZSB0aGUgc2FtZSBudW1lcmljIHZhbHVlLgorICAgIE5vdGU6IFdlIHBsYW4gdG8gZmxpcCB0aGUgZGVmYXVsdCB2YWx1ZSB0byAiZmFsc2UiIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgUHJvamVjdHMgdXNpbmcgZW51bSBhbGlhc2VzIHNob3VsZCBzZXQgdGhlIG9wdGlvbiB0byAidHJ1ZSIgaW4gdGhlaXIgLnByb3RvCisgICAgZmlsZXMuCisKKyAgQysrCisgICogTmV3IGdlbmVyYXRlZCBtZXRob2Qgc2V0X2FsbG9jYXRlZF9mb28oVHlwZSogZm9vKSBmb3IgbWVzc2FnZSBhbmQgc3RyaW5nCisgICAgZmllbGRzLiBUaGlzIG1ldGhvZCBhbGxvd3MgeW91IHRvIHNldCB0aGUgZmllbGQgdG8gYSBwcmUtYWxsb2NhdGVkIG9iamVjdAorICAgIGFuZCB0aGUgY29udGFpbmluZyBtZXNzYWdlIHRha2VzIHRoZSBvd25lcnNoaXAgb2YgdGhhdCBvYmplY3QuCisgICogQWRkZWQgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKCkgYW5kIFJlbGVhc2VFeHRlbnNpb24oKSB0byBleHRlbnNpb25zIEFQSS4KKyAgKiBDdXN0b20gb3B0aW9ucyBhcmUgbm93IGZvcm1hdHRlZCBjb3JyZWN0bHkgd2hlbiBkZXNjcmlwdG9ycyBhcmUgcHJpbnRlZCBpbgorICAgIHRleHQgZm9ybWF0LgorICAqIFZhcmlvdXMgc3BlZWQgb3B0aW1pemF0aW9ucy4KKworICBKYXZhCisgICogQ29tbWVudHMgaW4gcHJvdG8gZmlsZXMgYXJlIG5vdyBjb2xsZWN0ZWQgYW5kIHB1dCBpbnRvIGdlbmVyYXRlZCBjb2RlIGFzCisgICAgY29tbWVudHMgZm9yIGNvcnJlc3BvbmRpbmcgY2xhc3NlcyBhbmQgZGF0YSBtZW1iZXJzLgorICAqIEFkZGVkIFBhcnNlciB0byBwYXJzZSBkaXJlY3RseSBpbnRvIG1lc3NhZ2VzIHdpdGhvdXQgYSBCdWlsZGVyLiBGb3IKKyAgICBleGFtcGxlLAorICAgICAgRm9vIGZvbyA9IEZvby5QQVJTRVIuUGFyc2VGcm9tKGlucHV0KTsKKyAgICBVc2luZyBQYXJzZXIgaXMgfjI1JSBmYXN0ZXIgdGhhbiB1c2luZyBCdWlsZGVyIHRvIHBhcnNlIG1lc3NhZ2VzLgorICAqIEFkZGVkIGdldHRlcnMvc2V0dGVycyB0byBhY2Nlc3MgdGhlIHVuZGVybHlpbmcgQnl0ZVN0cmluZyBvZiBhIHN0cmluZyBmaWVsZAorICAgIGRpcmVjdGx5LgorICAqIEJ5dGVTdHJpbmcgbm93IHN1cHBvcnRzIG1vcmUgb3BlcmF0aW9uczogc3Vic3RyaW5nKCksIHByZXBlbmQoKSwgYW5kCisgICAgYXBwZW5kKCkuIFRoZSBpbXBsZW1lbnRhdGlvbiBvZiBCeXRlU3RyaW5nIHVzZXMgYSBiaW5hcnkgdHJlZSBzdHJ1Y3R1cmUKKyAgICB0byBzdXBwb3J0IHRoZXNlIG9wZXJhdGlvbnMgZWZmaWNpZW50bHkuCisgICogTmV3IG1ldGhvZCBmaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSB0aGF0IGxpc3RzIGFsbCBtaXNzaW5nIHJlcXVpcmVkCisgICAgZmllbGRzLgorICAqIFZhcmlvdXMgY29kZSBzaXplIGFuZCBzcGVlZCBvcHRpbWl6YXRpb25zLgorCisgIFB5dGhvbgorICAqIEFkZGVkIHN1cHBvcnQgZm9yIGR5bmFtaWMgbWVzc2FnZSBjcmVhdGlvbi4gRGVzY3JpcHRvckRhdGFiYXNlLAorICAgIERlc2NyaXB0b3JQb29sLCBhbmQgTWVzc2FnZUZhY3Rvcnkgd29yayBsaWtlIHRoZWlyIEMrKyBjb3VudGVycGFydHMgdG8KKyAgICBzaW1wbGlmeSBEZXNjcmlwdG9yIGNvbnN0cnVjdGlvbiBmcm9tICpEZXNjcmlwdG9yUHJvdG9zLCBhbmQgTWVzc2FnZUZhY3RvcnkKKyAgICBwcm92aWRlcyBhIG1lc3NhZ2UgaW5zdGFuY2UgZnJvbSBhIERlc2NyaXB0b3IuCisgICogQWRkZWQgcGlja2xlIHN1cHBvcnQgZm9yIHByb3RvYnVmIG1lc3NhZ2VzLgorICAqIFVua25vd24gZmllbGRzIGFyZSBub3cgcHJlc2VydmVkIGFmdGVyIHBhcnNpbmcuCisgICogRml4ZWQgYnVnIHdoZXJlIGN1c3RvbSBvcHRpb25zIHdlcmUgbm90IGNvcnJlY3RseSBwb3B1bGF0ZWQuIEN1c3RvbQorICAgIG9wdGlvbnMgY2FuIGJlIGFjY2Vzc2VkIG5vdy4KKyAgKiBBZGRlZCBFbnVtVHlwZVdyYXBwZXIgdGhhdCBwcm92aWRlcyBiZXR0ZXIgYWNjZXNzaWJpbGl0eSB0byBlbnVtIHR5cGVzLgorICAqIEFkZGVkIFBhcnNlTWVzc2FnZShkZXNjcmlwdG9yLCBieXRlcykgdG8gZ2VuZXJhdGUgYSBuZXcgTWVzc2FnZSBpbnN0YW5jZQorICAgIGZyb20gYSBkZXNjcmlwdG9yIGFuZCBhIGJ5dGUgc3RyaW5nLgorCiAyMDExLTA1LTAxIHZlcnNpb24gMi40LjE6CiAKICAgQysrCi0gICogRml4ZWQgdGhlIGZyZW5kc2hpcCBwcm9ibGVtIGZvciBvbGQgY29tcGlsZXJzIHRvIG1ha2UgdGhlIGxpYnJhcnkgbm93IGdjYyAzCisgICogRml4ZWQgdGhlIGZyaWVuZHNoaXAgcHJvYmxlbSBmb3Igb2xkIGNvbXBpbGVycyB0byBtYWtlIHRoZSBsaWJyYXJ5IG5vdyBnY2MgMwogICAgIGNvbXBhdGlibGUgYWdhaW4uCiAgICogRml4ZWQgdmNwcm9qZWN0cy9leHRyYWN0X2luY2x1ZGVzLmJhdCB0byBleHRyYWN0IGNvbXBpbGVyL3BsdWdpbi5oLgogCkBAIC0yNjgsNyArOTgwLDcgQEAKICAgKiBGaXhlZCB0ZW5kZW5jeSBmb3IgVGV4dEZvcm1hdCdzIHBhcnNpbmcgdG8gb3ZlcmZsb3cgdGhlIHN0YWNrIHdoZW4KICAgICBwYXJzaW5nIGxhcmdlIHN0cmluZyB2YWx1ZXMuICBUaGUgdW5kZXJseWluZyBwcm9ibGVtIGlzIHdpdGggSmF2YSdzCiAgICAgcmVnZXggaW1wbGVtZW50YXRpb24gKHdoaWNoIHVuZm9ydHVuYXRlbHkgdXNlcyByZWN1cnNpdmUgYmFja3RyYWNraW5nCi0gICAgcmF0aGVyIHRoYW4gYnVpbGRpbmcgYW4gTkZBKS4gIFdvcmtlZCBhcm91bmQgYnkgbWFraW5nIHVzZSBvZiBwb3NzZXNpdmUKKyAgICByYXRoZXIgdGhhbiBidWlsZGluZyBhbiBORkEpLiAgV29ya2VkIGFyb3VuZCBieSBtYWtpbmcgdXNlIG9mIHBvc3Nlc3NpdmUKICAgICBxdWFudGlmaWVycy4KICAgKiBHZW5lcmF0ZWQgc2VydmljZSBjbGFzc2VzIG5vdyBhbHNvIGdlbmVyYXRlIHB1cmUgaW50ZXJmYWNlcy4gIEZvciBhIHNlcnZpY2UKICAgICBGb28sIEZvby5JbnRlcmZhY2UgaXMgYSBwdXJlIGludGVyZmFjZSBjb250YWluaW5nIGFsbCBvZiB0aGUgc2VydmljZSdzCkBAIC0yODIsNyArOTk0LDcgQEAKICAgICBSUEMgaW1wbGVtZW50YXRpb25zIHdpbGwgaGF2ZSB0byBpbXBsZW1lbnQgdGhlIG5ldyBpbnRlcmZhY2VzIGluIG9yZGVyIHRvCiAgICAgc3VwcG9ydCBibG9ja2luZyBtb2RlLgogICAqIE5ldyBJL08gbWV0aG9kcyBwYXJzZURlbGltaXRlZEZyb20oKSwgbWVyZ2VEZWxpbWl0ZWRGcm9tKCksIGFuZAotICAgIHdyaXRlRGVsaW1pdGVkVG8oKSByZWFkIGFuZCB3cml0ZSAiZGVsZW1pdGVkIiBtZXNzYWdlcyBmcm9tL3RvIGEgc3RyZWFtLAorICAgIHdyaXRlRGVsaW1pdGVkVG8oKSByZWFkIGFuZCB3cml0ZSAiZGVsaW1pdGVkIiBtZXNzYWdlcyBmcm9tL3RvIGEgc3RyZWFtLAogICAgIG1lYW5pbmcgdGhhdCB0aGUgbWVzc2FnZSBzaXplIHByZWNlZGVzIHRoZSBkYXRhLiAgVGhpcyB3YXksIHlvdSBjYW4gd3JpdGUKICAgICBtdWx0aXBsZSBtZXNzYWdlcyB0byBhIHN0cmVhbSB3aXRob3V0IGhhdmluZyB0byB3b3JyeSBhYm91dCBkZWxpbWl0aW5nCiAgICAgdGhlbSB5b3Vyc2VsZi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9DT05UUklCVVRPUlMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NPTlRSSUJVVE9SUy50eHQKaW5kZXggN2MxYWM4MC4uYjhkOTdmYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NPTlRSSUJVVE9SUy50eHQKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NPTlRSSUJVVE9SUy50eHQKQEAgLTE3LDYgKzE3LDEyIEBACiAgIFdpbGwgUm9iaW5zb24gPHJvYmluc29uQGdvb2dsZS5jb20+CiAgIFBldGFyIFBldHJvdiA8cGV0YXJAZ29vZ2xlLmNvbT4KIAorSmF2YSBOYW5vIHByaW1hcnkgYXV0aG9yczoKKyAgQnJpYW4gRHVmZiA8YmR1ZmZAZ29vZ2xlLmNvbT4KKyAgVG9tIENoYW8gPGNoYW90QGdvb2dsZS5jb20+CisgIE1heCBDYWkgPG1heHRyb3lAZ29vZ2xlLmNvbT4KKyAgVWxhcyBLaXJhemNpIDx1bGFzQGdvb2dsZS5jb20+CisKIExhcmdlIGNvZGUgY29udHJpYnV0aW9uczoKICAgSmFzb24gSHN1ZWggPGphc29uaEBnb29nbGUuY29tPgogICBKb3NlcGggU2Nob3JyIDxqc2Nob3JyQGdvb2dsZS5jb20+CkBAIC01MCw3ICs1Niw3IEBACiAgICAgICB0ZXh0IGZvcm1hdC4KICAgQnJpYW4gQXRraW5zb24gPG5haXJiNzc0QGdtYWlsLmNvbT4KICAgICAqIEFkZGVkIEBPdmVycmlkZSBhbm5vdGF0aW9uIHRvIGdlbmVyYXRlZCBKYXZhIGNvZGUgd2hlcmUgYXBwcm9wcmlhdGUuCi0gIFZpbmNlbnQgQ2hvaW5p6HJlIDxDaG9pbmllcmUuVmluY2VudEBoeWRyby5xYy5jYT4KKyAgVmluY2VudCBDaG9pbmnDqHJlIDxDaG9pbmllcmUuVmluY2VudEBoeWRyby5xYy5jYT4KICAgICAqIFRydTY0IHN1cHBvcnQuCiAgIE1vbnR5IFRheWxvciA8bW9udHkudGF5bG9yQGdtYWlsLmNvbT4KICAgICAqIFNvbGFyaXMgMTAgKyBTdW4gU3R1ZGlvIGZpeGVzLgpAQCAtODYsMyArOTIsMTEgQEAKICAgICAqIEZpeCBidWcgd2l0aCBwZXJtYW5lbnQgY2FsbGJhY2tzIHRoYXQgZGVsZXRlIHRoZW1zZWx2ZXMgd2hlbiBydW4uCiAgIE1pY2hhZWwgS3VjaGFyc2tpIDxtLmt1Y2hhcnNraUBnbWFpbC5jb20+CiAgICAgKiBBZGRlZCBDb2RlZElucHV0U3RyZWFtLmdldFRvdGFsQnl0ZXNSZWFkKCkuCisgIEthY3BlciBLb3dhbGlrIDx4YXJ0aGlzaXVzLmtrQGdtYWlsLmNvbT4KKyAgICAqIEZpeGVkIG00L2FjeF9wdGhyZWFkLm00IHByb2JsZW0gZm9yIHNvbWUgTGludXggZGlzdHJpYnV0aW9ucy4KKyAgV2lsbGlhbSBPcnIgPHdpbGxAd29ycmJhc2UuY29tPgorICAgICogRml4ZWQgZGV0ZWN0aW9uIG9mIHNjaGVkX3lpZWxkIG9uIFNvbGFyaXMuCisgICAgKiBBZGRlZCBhdG9taWNvcHMgZm9yIFNvbGFyaXMKKyAgQW5kcmV3IFBhcHJvY2tpIDxhbmRyZXdAaXNoaWJvby5jb20+CisgICAgKiBGaXhlZCBtaW5vciBJQk0geGxDIGNvbXBpbGVyIGJ1aWxkIGlzc3VlcworICAgICogQWRkZWQgYXRvbWljb3BzIGZvciBBSVggKFBPV0VSKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NPUFlJTkcudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0NPUFlJTkcudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3MDVkYjU3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9DT1BZSU5HLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDMzICswLDAgQEAKLUNvcHlyaWdodCAyMDA4LCBHb29nbGUgSW5jLgotQWxsIHJpZ2h0cyByZXNlcnZlZC4KLQotUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci1tb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi1tZXQ6Ci0KLSAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci1ub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0gICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi1jb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi1pbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi1kaXN0cmlidXRpb24uCi0gICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi1jb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLQotVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLUxJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLU9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi1EQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLVRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLShJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIFByb3RvY29sIEJ1ZmZlciBjb21waWxlciBpcyBvd25lZCBieSB0aGUgb3duZXIKLW9mIHRoZSBpbnB1dCBmaWxlIHVzZWQgd2hlbiBnZW5lcmF0aW5nIGl0LiAgVGhpcyBjb2RlIGlzIG5vdAotc3RhbmRhbG9uZSBhbmQgcmVxdWlyZXMgYSBzdXBwb3J0IGxpYnJhcnkgdG8gYmUgbGlua2VkIHdpdGggaXQuICBUaGlzCi1zdXBwb3J0IGxpYnJhcnkgaXMgaXRzZWxmIGNvdmVyZWQgYnkgdGhlIGFib3ZlIGxpY2Vuc2UuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvSU5TVEFMTC50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvSU5TVEFMTC50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNlM2IwOTQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0lOU1RBTEwudHh0CisrKyAvZGV2L251bGwKQEAgLTEsMjM3ICswLDAgQEAKLVRoaXMgZmlsZSBjb250YWlucyBkZXRhaWxlZCBidXQgZ2VuZXJpYyBpbmZvcm1hdGlvbiBvbiBidWlsZGluZyBhbmQKLWluc3RhbGxpbmcgdGhlIEMrKyBwYXJ0IG9mIHRoaXMgcHJvamVjdC4gIEZvciBzaG9ydGVyIGluc3RydWN0aW9ucywKLWFzIHdlbGwgYXMgaW5zdHJ1Y3Rpb25zIGZvciBjb21waWxpbmcgYW5kIGluc3RhbGxpbmcgdGhlIEphdmEgb3IKLVB5dGhvbiBwYXJ0cywgc2VlIFJFQURNRS4KLQotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1Db3B5cmlnaHQgMTk5NCwgMTk5NSwgMTk5NiwgMTk5OSwgMjAwMCwgMjAwMSwgMjAwMiBGcmVlIFNvZnR3YXJlCi1Gb3VuZGF0aW9uLCBJbmMuCi0KLSAgIFRoaXMgZmlsZSBpcyBmcmVlIGRvY3VtZW50YXRpb247IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5kYXRpb24gZ2l2ZXMKLXVubGltaXRlZCBwZXJtaXNzaW9uIHRvIGNvcHksIGRpc3RyaWJ1dGUgYW5kIG1vZGlmeSBpdC4KLQotCi1CYXNpYyBJbnN0YWxsYXRpb24KLT09PT09PT09PT09PT09PT09PQotCi0gICBUaGVzZSBhcmUgZ2VuZXJpYyBpbnN0YWxsYXRpb24gaW5zdHJ1Y3Rpb25zLgotCi0gICBUaGUgYGNvbmZpZ3VyZScgc2hlbGwgc2NyaXB0IGF0dGVtcHRzIHRvIGd1ZXNzIGNvcnJlY3QgdmFsdWVzIGZvcgotdmFyaW91cyBzeXN0ZW0tZGVwZW5kZW50IHZhcmlhYmxlcyB1c2VkIGR1cmluZyBjb21waWxhdGlvbi4gIEl0IHVzZXMKLXRob3NlIHZhbHVlcyB0byBjcmVhdGUgYSBgTWFrZWZpbGUnIGluIGVhY2ggZGlyZWN0b3J5IG9mIHRoZSBwYWNrYWdlLgotSXQgbWF5IGFsc28gY3JlYXRlIG9uZSBvciBtb3JlIGAuaCcgZmlsZXMgY29udGFpbmluZyBzeXN0ZW0tZGVwZW5kZW50Ci1kZWZpbml0aW9ucy4gIEZpbmFsbHksIGl0IGNyZWF0ZXMgYSBzaGVsbCBzY3JpcHQgYGNvbmZpZy5zdGF0dXMnIHRoYXQKLXlvdSBjYW4gcnVuIGluIHRoZSBmdXR1cmUgdG8gcmVjcmVhdGUgdGhlIGN1cnJlbnQgY29uZmlndXJhdGlvbiwgYW5kIGEKLWZpbGUgYGNvbmZpZy5sb2cnIGNvbnRhaW5pbmcgY29tcGlsZXIgb3V0cHV0ICh1c2VmdWwgbWFpbmx5IGZvcgotZGVidWdnaW5nIGBjb25maWd1cmUnKS4KLQotICAgSXQgY2FuIGFsc28gdXNlIGFuIG9wdGlvbmFsIGZpbGUgKHR5cGljYWxseSBjYWxsZWQgYGNvbmZpZy5jYWNoZScKLWFuZCBlbmFibGVkIHdpdGggYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnIG9yIHNpbXBseSBgLUMnKSB0aGF0IHNhdmVzCi10aGUgcmVzdWx0cyBvZiBpdHMgdGVzdHMgdG8gc3BlZWQgdXAgcmVjb25maWd1cmluZy4gIChDYWNoaW5nIGlzCi1kaXNhYmxlZCBieSBkZWZhdWx0IHRvIHByZXZlbnQgcHJvYmxlbXMgd2l0aCBhY2NpZGVudGFsIHVzZSBvZiBzdGFsZQotY2FjaGUgZmlsZXMuKQotCi0gICBJZiB5b3UgbmVlZCB0byBkbyB1bnVzdWFsIHRoaW5ncyB0byBjb21waWxlIHRoZSBwYWNrYWdlLCBwbGVhc2UgdHJ5Ci10byBmaWd1cmUgb3V0IGhvdyBgY29uZmlndXJlJyBjb3VsZCBjaGVjayB3aGV0aGVyIHRvIGRvIHRoZW0sIGFuZCBtYWlsCi1kaWZmcyBvciBpbnN0cnVjdGlvbnMgdG8gdGhlIGFkZHJlc3MgZ2l2ZW4gaW4gdGhlIGBSRUFETUUnIHNvIHRoZXkgY2FuCi1iZSBjb25zaWRlcmVkIGZvciB0aGUgbmV4dCByZWxlYXNlLiAgSWYgeW91IGFyZSB1c2luZyB0aGUgY2FjaGUsIGFuZCBhdAotc29tZSBwb2ludCBgY29uZmlnLmNhY2hlJyBjb250YWlucyByZXN1bHRzIHlvdSBkb24ndCB3YW50IHRvIGtlZXAsIHlvdQotbWF5IHJlbW92ZSBvciBlZGl0IGl0LgotCi0gICBUaGUgZmlsZSBgY29uZmlndXJlLmFjJyAob3IgYGNvbmZpZ3VyZS5pbicpIGlzIHVzZWQgdG8gY3JlYXRlCi1gY29uZmlndXJlJyBieSBhIHByb2dyYW0gY2FsbGVkIGBhdXRvY29uZicuICBZb3Ugb25seSBuZWVkCi1gY29uZmlndXJlLmFjJyBpZiB5b3Ugd2FudCB0byBjaGFuZ2UgaXQgb3IgcmVnZW5lcmF0ZSBgY29uZmlndXJlJyB1c2luZwotYSBuZXdlciB2ZXJzaW9uIG9mIGBhdXRvY29uZicuCi0KLVRoZSBzaW1wbGVzdCB3YXkgdG8gY29tcGlsZSB0aGlzIHBhY2thZ2UgaXM6Ci0KLSAgMS4gYGNkJyB0byB0aGUgZGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBhbmQgdHlwZQotICAgICBgLi9jb25maWd1cmUnIHRvIGNvbmZpZ3VyZSB0aGUgcGFja2FnZSBmb3IgeW91ciBzeXN0ZW0uICBJZiB5b3UncmUKLSAgICAgdXNpbmcgYGNzaCcgb24gYW4gb2xkIHZlcnNpb24gb2YgU3lzdGVtIFYsIHlvdSBtaWdodCBuZWVkIHRvIHR5cGUKLSAgICAgYHNoIC4vY29uZmlndXJlJyBpbnN0ZWFkIHRvIHByZXZlbnQgYGNzaCcgZnJvbSB0cnlpbmcgdG8gZXhlY3V0ZQotICAgICBgY29uZmlndXJlJyBpdHNlbGYuCi0KLSAgICAgUnVubmluZyBgY29uZmlndXJlJyB0YWtlcyBhd2hpbGUuICBXaGlsZSBydW5uaW5nLCBpdCBwcmludHMgc29tZQotICAgICBtZXNzYWdlcyB0ZWxsaW5nIHdoaWNoIGZlYXR1cmVzIGl0IGlzIGNoZWNraW5nIGZvci4KLQotICAyLiBUeXBlIGBtYWtlJyB0byBjb21waWxlIHRoZSBwYWNrYWdlLgotCi0gIDMuIE9wdGlvbmFsbHksIHR5cGUgYG1ha2UgY2hlY2snIHRvIHJ1biBhbnkgc2VsZi10ZXN0cyB0aGF0IGNvbWUgd2l0aAotICAgICB0aGUgcGFja2FnZS4KLQotICA0LiBUeXBlIGBtYWtlIGluc3RhbGwnIHRvIGluc3RhbGwgdGhlIHByb2dyYW1zIGFuZCBhbnkgZGF0YSBmaWxlcyBhbmQKLSAgICAgZG9jdW1lbnRhdGlvbi4KLQotICA1LiBZb3UgY2FuIHJlbW92ZSB0aGUgcHJvZ3JhbSBiaW5hcmllcyBhbmQgb2JqZWN0IGZpbGVzIGZyb20gdGhlCi0gICAgIHNvdXJjZSBjb2RlIGRpcmVjdG9yeSBieSB0eXBpbmcgYG1ha2UgY2xlYW4nLiAgVG8gYWxzbyByZW1vdmUgdGhlCi0gICAgIGZpbGVzIHRoYXQgYGNvbmZpZ3VyZScgY3JlYXRlZCAoc28geW91IGNhbiBjb21waWxlIHRoZSBwYWNrYWdlIGZvcgotICAgICBhIGRpZmZlcmVudCBraW5kIG9mIGNvbXB1dGVyKSwgdHlwZSBgbWFrZSBkaXN0Y2xlYW4nLiAgVGhlcmUgaXMKLSAgICAgYWxzbyBhIGBtYWtlIG1haW50YWluZXItY2xlYW4nIHRhcmdldCwgYnV0IHRoYXQgaXMgaW50ZW5kZWQgbWFpbmx5Ci0gICAgIGZvciB0aGUgcGFja2FnZSdzIGRldmVsb3BlcnMuICBJZiB5b3UgdXNlIGl0LCB5b3UgbWF5IGhhdmUgdG8gZ2V0Ci0gICAgIGFsbCBzb3J0cyBvZiBvdGhlciBwcm9ncmFtcyBpbiBvcmRlciB0byByZWdlbmVyYXRlIGZpbGVzIHRoYXQgY2FtZQotICAgICB3aXRoIHRoZSBkaXN0cmlidXRpb24uCi0KLUNvbXBpbGVycyBhbmQgT3B0aW9ucwotPT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFNvbWUgc3lzdGVtcyByZXF1aXJlIHVudXN1YWwgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24gb3IgbGlua2luZyB0aGF0Ci10aGUgYGNvbmZpZ3VyZScgc2NyaXB0IGRvZXMgbm90IGtub3cgYWJvdXQuICBSdW4gYC4vY29uZmlndXJlIC0taGVscCcKLWZvciBkZXRhaWxzIG9uIHNvbWUgb2YgdGhlIHBlcnRpbmVudCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCi0KLSAgIFlvdSBjYW4gZ2l2ZSBgY29uZmlndXJlJyBpbml0aWFsIHZhbHVlcyBmb3IgY29uZmlndXJhdGlvbiBwYXJhbWV0ZXJzCi1ieSBzZXR0aW5nIHZhcmlhYmxlcyBpbiB0aGUgY29tbWFuZCBsaW5lIG9yIGluIHRoZSBlbnZpcm9ubWVudC4gIEhlcmUKLWlzIGFuIGV4YW1wbGU6Ci0KLSAgICAgLi9jb25maWd1cmUgQ0M9Yzg5IENGTEFHUz0tTzIgTElCUz0tbHBvc2l4Ci0KLSAgICpOb3RlIERlZmluaW5nIFZhcmlhYmxlczo6LCBmb3IgbW9yZSBkZXRhaWxzLgotCi1Db21waWxpbmcgRm9yIE11bHRpcGxlIEFyY2hpdGVjdHVyZXMKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gICBZb3UgY2FuIGNvbXBpbGUgdGhlIHBhY2thZ2UgZm9yIG1vcmUgdGhhbiBvbmUga2luZCBvZiBjb21wdXRlciBhdCB0aGUKLXNhbWUgdGltZSwgYnkgcGxhY2luZyB0aGUgb2JqZWN0IGZpbGVzIGZvciBlYWNoIGFyY2hpdGVjdHVyZSBpbiB0aGVpcgotb3duIGRpcmVjdG9yeS4gIFRvIGRvIHRoaXMsIHlvdSBtdXN0IHVzZSBhIHZlcnNpb24gb2YgYG1ha2UnIHRoYXQKLXN1cHBvcnRzIHRoZSBgVlBBVEgnIHZhcmlhYmxlLCBzdWNoIGFzIEdOVSBgbWFrZScuICBgY2QnIHRvIHRoZQotZGlyZWN0b3J5IHdoZXJlIHlvdSB3YW50IHRoZSBvYmplY3QgZmlsZXMgYW5kIGV4ZWN1dGFibGVzIHRvIGdvIGFuZCBydW4KLXRoZSBgY29uZmlndXJlJyBzY3JpcHQuICBgY29uZmlndXJlJyBhdXRvbWF0aWNhbGx5IGNoZWNrcyBmb3IgdGhlCi1zb3VyY2UgY29kZSBpbiB0aGUgZGlyZWN0b3J5IHRoYXQgYGNvbmZpZ3VyZScgaXMgaW4gYW5kIGluIGAuLicuCi0KLSAgIElmIHlvdSBoYXZlIHRvIHVzZSBhIGBtYWtlJyB0aGF0IGRvZXMgbm90IHN1cHBvcnQgdGhlIGBWUEFUSCcKLXZhcmlhYmxlLCB5b3UgaGF2ZSB0byBjb21waWxlIHRoZSBwYWNrYWdlIGZvciBvbmUgYXJjaGl0ZWN0dXJlIGF0IGEKLXRpbWUgaW4gdGhlIHNvdXJjZSBjb2RlIGRpcmVjdG9yeS4gIEFmdGVyIHlvdSBoYXZlIGluc3RhbGxlZCB0aGUKLXBhY2thZ2UgZm9yIG9uZSBhcmNoaXRlY3R1cmUsIHVzZSBgbWFrZSBkaXN0Y2xlYW4nIGJlZm9yZSByZWNvbmZpZ3VyaW5nCi1mb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUuCi0KLUluc3RhbGxhdGlvbiBOYW1lcwotPT09PT09PT09PT09PT09PT09Ci0KLSAgIEJ5IGRlZmF1bHQsIGBtYWtlIGluc3RhbGwnIHdpbGwgaW5zdGFsbCB0aGUgcGFja2FnZSdzIGZpbGVzIGluCi1gL3Vzci9sb2NhbC9iaW4nLCBgL3Vzci9sb2NhbC9tYW4nLCBldGMuICBZb3UgY2FuIHNwZWNpZnkgYW4KLWluc3RhbGxhdGlvbiBwcmVmaXggb3RoZXIgdGhhbiBgL3Vzci9sb2NhbCcgYnkgZ2l2aW5nIGBjb25maWd1cmUnIHRoZQotb3B0aW9uIGAtLXByZWZpeD1QQVRIJy4KLQotICAgWW91IGNhbiBzcGVjaWZ5IHNlcGFyYXRlIGluc3RhbGxhdGlvbiBwcmVmaXhlcyBmb3IKLWFyY2hpdGVjdHVyZS1zcGVjaWZpYyBmaWxlcyBhbmQgYXJjaGl0ZWN0dXJlLWluZGVwZW5kZW50IGZpbGVzLiAgSWYgeW91Ci1naXZlIGBjb25maWd1cmUnIHRoZSBvcHRpb24gYC0tZXhlYy1wcmVmaXg9UEFUSCcsIHRoZSBwYWNrYWdlIHdpbGwgdXNlCi1QQVRIIGFzIHRoZSBwcmVmaXggZm9yIGluc3RhbGxpbmcgcHJvZ3JhbXMgYW5kIGxpYnJhcmllcy4KLURvY3VtZW50YXRpb24gYW5kIG90aGVyIGRhdGEgZmlsZXMgd2lsbCBzdGlsbCB1c2UgdGhlIHJlZ3VsYXIgcHJlZml4LgotCi0gICBJbiBhZGRpdGlvbiwgaWYgeW91IHVzZSBhbiB1bnVzdWFsIGRpcmVjdG9yeSBsYXlvdXQgeW91IGNhbiBnaXZlCi1vcHRpb25zIGxpa2UgYC0tYmluZGlyPVBBVEgnIHRvIHNwZWNpZnkgZGlmZmVyZW50IHZhbHVlcyBmb3IgcGFydGljdWxhcgota2luZHMgb2YgZmlsZXMuICBSdW4gYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBhIGxpc3Qgb2YgdGhlIGRpcmVjdG9yaWVzCi15b3UgY2FuIHNldCBhbmQgd2hhdCBraW5kcyBvZiBmaWxlcyBnbyBpbiB0aGVtLgotCi0gICBJZiB0aGUgcGFja2FnZSBzdXBwb3J0cyBpdCwgeW91IGNhbiBjYXVzZSBwcm9ncmFtcyB0byBiZSBpbnN0YWxsZWQKLXdpdGggYW4gZXh0cmEgcHJlZml4IG9yIHN1ZmZpeCBvbiB0aGVpciBuYW1lcyBieSBnaXZpbmcgYGNvbmZpZ3VyZScgdGhlCi1vcHRpb24gYC0tcHJvZ3JhbS1wcmVmaXg9UFJFRklYJyBvciBgLS1wcm9ncmFtLXN1ZmZpeD1TVUZGSVgnLgotCi1PcHRpb25hbCBGZWF0dXJlcwotPT09PT09PT09PT09PT09PT0KLQotICAgU29tZSBwYWNrYWdlcyBwYXkgYXR0ZW50aW9uIHRvIGAtLWVuYWJsZS1GRUFUVVJFJyBvcHRpb25zIHRvCi1gY29uZmlndXJlJywgd2hlcmUgRkVBVFVSRSBpbmRpY2F0ZXMgYW4gb3B0aW9uYWwgcGFydCBvZiB0aGUgcGFja2FnZS4KLVRoZXkgbWF5IGFsc28gcGF5IGF0dGVudGlvbiB0byBgLS13aXRoLVBBQ0tBR0UnIG9wdGlvbnMsIHdoZXJlIFBBQ0tBR0UKLWlzIHNvbWV0aGluZyBsaWtlIGBnbnUtYXMnIG9yIGB4JyAoZm9yIHRoZSBYIFdpbmRvdyBTeXN0ZW0pLiAgVGhlCi1gUkVBRE1FJyBzaG91bGQgbWVudGlvbiBhbnkgYC0tZW5hYmxlLScgYW5kIGAtLXdpdGgtJyBvcHRpb25zIHRoYXQgdGhlCi1wYWNrYWdlIHJlY29nbml6ZXMuCi0KLSAgIEZvciBwYWNrYWdlcyB0aGF0IHVzZSB0aGUgWCBXaW5kb3cgU3lzdGVtLCBgY29uZmlndXJlJyBjYW4gdXN1YWxseQotZmluZCB0aGUgWCBpbmNsdWRlIGFuZCBsaWJyYXJ5IGZpbGVzIGF1dG9tYXRpY2FsbHksIGJ1dCBpZiBpdCBkb2Vzbid0LAoteW91IGNhbiB1c2UgdGhlIGBjb25maWd1cmUnIG9wdGlvbnMgYC0teC1pbmNsdWRlcz1ESVInIGFuZAotYC0teC1saWJyYXJpZXM9RElSJyB0byBzcGVjaWZ5IHRoZWlyIGxvY2F0aW9ucy4KLQotU3BlY2lmeWluZyB0aGUgU3lzdGVtIFR5cGUKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIFRoZXJlIG1heSBiZSBzb21lIGZlYXR1cmVzIGBjb25maWd1cmUnIGNhbm5vdCBmaWd1cmUgb3V0Ci1hdXRvbWF0aWNhbGx5LCBidXQgbmVlZHMgdG8gZGV0ZXJtaW5lIGJ5IHRoZSB0eXBlIG9mIG1hY2hpbmUgdGhlIHBhY2thZ2UKLXdpbGwgcnVuIG9uLiAgVXN1YWxseSwgYXNzdW1pbmcgdGhlIHBhY2thZ2UgaXMgYnVpbHQgdG8gYmUgcnVuIG9uIHRoZQotX3NhbWVfIGFyY2hpdGVjdHVyZXMsIGBjb25maWd1cmUnIGNhbiBmaWd1cmUgdGhhdCBvdXQsIGJ1dCBpZiBpdCBwcmludHMKLWEgbWVzc2FnZSBzYXlpbmcgaXQgY2Fubm90IGd1ZXNzIHRoZSBtYWNoaW5lIHR5cGUsIGdpdmUgaXQgdGhlCi1gLS1idWlsZD1UWVBFJyBvcHRpb24uICBUWVBFIGNhbiBlaXRoZXIgYmUgYSBzaG9ydCBuYW1lIGZvciB0aGUgc3lzdGVtCi10eXBlLCBzdWNoIGFzIGBzdW40Jywgb3IgYSBjYW5vbmljYWwgbmFtZSB3aGljaCBoYXMgdGhlIGZvcm06Ci0KLSAgICAgQ1BVLUNPTVBBTlktU1lTVEVNCi0KLXdoZXJlIFNZU1RFTSBjYW4gaGF2ZSBvbmUgb2YgdGhlc2UgZm9ybXM6Ci0KLSAgICAgT1MgS0VSTkVMLU9TCi0KLSAgIFNlZSB0aGUgZmlsZSBgY29uZmlnLnN1YicgZm9yIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgZWFjaCBmaWVsZC4gIElmCi1gY29uZmlnLnN1YicgaXNuJ3QgaW5jbHVkZWQgaW4gdGhpcyBwYWNrYWdlLCB0aGVuIHRoaXMgcGFja2FnZSBkb2Vzbid0Ci1uZWVkIHRvIGtub3cgdGhlIG1hY2hpbmUgdHlwZS4KLQotICAgSWYgeW91IGFyZSBfYnVpbGRpbmdfIGNvbXBpbGVyIHRvb2xzIGZvciBjcm9zcy1jb21waWxpbmcsIHlvdSBzaG91bGQKLXVzZSB0aGUgYC0tdGFyZ2V0PVRZUEUnIG9wdGlvbiB0byBzZWxlY3QgdGhlIHR5cGUgb2Ygc3lzdGVtIHRoZXkgd2lsbAotcHJvZHVjZSBjb2RlIGZvci4KLQotICAgSWYgeW91IHdhbnQgdG8gX3VzZV8gYSBjcm9zcyBjb21waWxlciwgdGhhdCBnZW5lcmF0ZXMgY29kZSBmb3IgYQotcGxhdGZvcm0gZGlmZmVyZW50IGZyb20gdGhlIGJ1aWxkIHBsYXRmb3JtLCB5b3Ugc2hvdWxkIHNwZWNpZnkgdGhlCi0iaG9zdCIgcGxhdGZvcm0gKGkuZS4sIHRoYXQgb24gd2hpY2ggdGhlIGdlbmVyYXRlZCBwcm9ncmFtcyB3aWxsCi1ldmVudHVhbGx5IGJlIHJ1bikgd2l0aCBgLS1ob3N0PVRZUEUnLgotCi1TaGFyaW5nIERlZmF1bHRzCi09PT09PT09PT09PT09PT09Ci0KLSAgIElmIHlvdSB3YW50IHRvIHNldCBkZWZhdWx0IHZhbHVlcyBmb3IgYGNvbmZpZ3VyZScgc2NyaXB0cyB0byBzaGFyZSwKLXlvdSBjYW4gY3JlYXRlIGEgc2l0ZSBzaGVsbCBzY3JpcHQgY2FsbGVkIGBjb25maWcuc2l0ZScgdGhhdCBnaXZlcwotZGVmYXVsdCB2YWx1ZXMgZm9yIHZhcmlhYmxlcyBsaWtlIGBDQycsIGBjYWNoZV9maWxlJywgYW5kIGBwcmVmaXgnLgotYGNvbmZpZ3VyZScgbG9va3MgZm9yIGBQUkVGSVgvc2hhcmUvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cywgdGhlbgotYFBSRUZJWC9ldGMvY29uZmlnLnNpdGUnIGlmIGl0IGV4aXN0cy4gIE9yLCB5b3UgY2FuIHNldCB0aGUKLWBDT05GSUdfU0lURScgZW52aXJvbm1lbnQgdmFyaWFibGUgdG8gdGhlIGxvY2F0aW9uIG9mIHRoZSBzaXRlIHNjcmlwdC4KLUEgd2FybmluZzogbm90IGFsbCBgY29uZmlndXJlJyBzY3JpcHRzIGxvb2sgZm9yIGEgc2l0ZSBzY3JpcHQuCi0KLURlZmluaW5nIFZhcmlhYmxlcwotPT09PT09PT09PT09PT09PT09Ci0KLSAgIFZhcmlhYmxlcyBub3QgZGVmaW5lZCBpbiBhIHNpdGUgc2hlbGwgc2NyaXB0IGNhbiBiZSBzZXQgaW4gdGhlCi1lbnZpcm9ubWVudCBwYXNzZWQgdG8gYGNvbmZpZ3VyZScuICBIb3dldmVyLCBzb21lIHBhY2thZ2VzIG1heSBydW4KLWNvbmZpZ3VyZSBhZ2FpbiBkdXJpbmcgdGhlIGJ1aWxkLCBhbmQgdGhlIGN1c3RvbWl6ZWQgdmFsdWVzIG9mIHRoZXNlCi12YXJpYWJsZXMgbWF5IGJlIGxvc3QuICBJbiBvcmRlciB0byBhdm9pZCB0aGlzIHByb2JsZW0sIHlvdSBzaG91bGQgc2V0Ci10aGVtIGluIHRoZSBgY29uZmlndXJlJyBjb21tYW5kIGxpbmUsIHVzaW5nIGBWQVI9dmFsdWUnLiAgRm9yIGV4YW1wbGU6Ci0KLSAgICAgLi9jb25maWd1cmUgQ0M9L3Vzci9sb2NhbDIvYmluL2djYwotCi13aWxsIGNhdXNlIHRoZSBzcGVjaWZpZWQgZ2NjIHRvIGJlIHVzZWQgYXMgdGhlIEMgY29tcGlsZXIgKHVubGVzcyBpdCBpcwotb3ZlcnJpZGRlbiBpbiB0aGUgc2l0ZSBzaGVsbCBzY3JpcHQpLgotCi1gY29uZmlndXJlJyBJbnZvY2F0aW9uCi09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgIGBjb25maWd1cmUnIHJlY29nbml6ZXMgdGhlIGZvbGxvd2luZyBvcHRpb25zIHRvIGNvbnRyb2wgaG93IGl0Ci1vcGVyYXRlcy4KLQotYC0taGVscCcKLWAtaCcKLSAgICAgUHJpbnQgYSBzdW1tYXJ5IG9mIHRoZSBvcHRpb25zIHRvIGBjb25maWd1cmUnLCBhbmQgZXhpdC4KLQotYC0tdmVyc2lvbicKLWAtVicKLSAgICAgUHJpbnQgdGhlIHZlcnNpb24gb2YgQXV0b2NvbmYgdXNlZCB0byBnZW5lcmF0ZSB0aGUgYGNvbmZpZ3VyZScKLSAgICAgc2NyaXB0LCBhbmQgZXhpdC4KLQotYC0tY2FjaGUtZmlsZT1GSUxFJwotICAgICBFbmFibGUgdGhlIGNhY2hlOiB1c2UgYW5kIHNhdmUgdGhlIHJlc3VsdHMgb2YgdGhlIHRlc3RzIGluIEZJTEUsCi0gICAgIHRyYWRpdGlvbmFsbHkgYGNvbmZpZy5jYWNoZScuICBGSUxFIGRlZmF1bHRzIHRvIGAvZGV2L251bGwnIHRvCi0gICAgIGRpc2FibGUgY2FjaGluZy4KLQotYC0tY29uZmlnLWNhY2hlJwotYC1DJwotICAgICBBbGlhcyBmb3IgYC0tY2FjaGUtZmlsZT1jb25maWcuY2FjaGUnLgotCi1gLS1xdWlldCcKLWAtLXNpbGVudCcKLWAtcScKLSAgICAgRG8gbm90IHByaW50IG1lc3NhZ2VzIHNheWluZyB3aGljaCBjaGVja3MgYXJlIGJlaW5nIG1hZGUuICBUbwotICAgICBzdXBwcmVzcyBhbGwgbm9ybWFsIG91dHB1dCwgcmVkaXJlY3QgaXQgdG8gYC9kZXYvbnVsbCcgKGFueSBlcnJvcgotICAgICBtZXNzYWdlcyB3aWxsIHN0aWxsIGJlIHNob3duKS4KLQotYC0tc3JjZGlyPURJUicKLSAgICAgTG9vayBmb3IgdGhlIHBhY2thZ2UncyBzb3VyY2UgY29kZSBpbiBkaXJlY3RvcnkgRElSLiAgVXN1YWxseQotICAgICBgY29uZmlndXJlJyBjYW4gZGV0ZXJtaW5lIHRoYXQgZGlyZWN0b3J5IGF1dG9tYXRpY2FsbHkuCi0KLWBjb25maWd1cmUnIGFsc28gYWNjZXB0cyBzb21lIG90aGVyLCBub3Qgd2lkZWx5IHVzZWZ1bCwgb3B0aW9ucy4gIFJ1bgotYGNvbmZpZ3VyZSAtLWhlbHAnIGZvciBtb3JlIGRldGFpbHMuCi0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL0xJQ0VOU0UgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvTElDRU5TRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvTElDRU5TRQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL0xJQ0VOU0UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL01ha2VmaWxlLmFtIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL01ha2VmaWxlLmFtCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL01ha2VmaWxlLmFtCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9Qcm90b2J1Zi5wb2RzcGVjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL1Byb3RvYnVmLnBvZHNwZWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL1Byb3RvYnVmLnBvZHNwZWMKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9Qcm90b2J1Zi5wb2RzcGVjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvUkVBRE1FLmNocm9taXVtIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL1JFQURNRS5jaHJvbWl1bQppbmRleCA3NjcyNDExLi44ODM4ZmJjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvUkVBRE1FLmNocm9taXVtCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9SRUFETUUuY2hyb21pdW0KQEAgLTEsMzYgKzEsNzggQEAKIE5hbWU6IFByb3RvY29sIEJ1ZmZlcnMKIFNob3J0IE5hbWU6IHByb3RvYnVmCi1VUkw6IGh0dHA6Ly9wcm90b2J1Zi5nb29nbGVjb2RlLmNvbS9zdm4vdHJ1bmsKK1VSTDogaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1ZgogTGljZW5zZTogQlNECi1MaWNlbnNlIEZpbGU6IENPUFlJTkcudHh0Ci1WZXJzaW9uOiB1bmtub3duCi1SZXZpc2lvbjogcjQyMworTGljZW5zZSBGaWxlOiBMSUNFTlNFCitWZXJzaW9uOiAzLjAuMC1iZXRhLTMKK1JldmlzaW9uOiAzNDcwYjY4OTVhYTY1OWI3NTU5ZWQ2NzhlMDI5YTUzMzhlNTM1ZjE0CiBTZWN1cml0eSBDcml0aWNhbDogeWVzCiAKLUxvY2FsIGZpbGVzIChub3QgdGFrZW4gZnJvbSB1cHN0cmVhbSk6Ci1SRUFETUUuY2hyb21pdW0KLWNvbmZpZy5oCi1kZXNjcmlwdG9yMl9wYi5weQotcHJvdG9idWZfbGl0ZV9qYXZhX2Rlc2NyaXB0b3JfcHJvdG8ucHkKLXByb3RvYnVmX2xpdGVfamF2YV9wYXJzZV9wb20ucHkKK1N0ZXBzIHVzZWQgdG8gY3JlYXRlIHRoZSBjdXJyZW50IHZlcnNpb246CisxLiBQdWxsIHRoZSByZWxlYXNlIGZyb20gaHR0cHM6Ly9naXRodWIuY29tL2dvb2dsZS9wcm90b2J1Zi9yZWxlYXNlcworMi4gQWRkIGJ1aWxkIGZpbGVzIChCVUlMRC5nbiwgcHJvdG9fbGlicmFyeS5nbmksIHByb3RvYnVmLmd5cCwKKyAgIHByb3RvYnVmX2xpdGUuZ3lwaSwgcHJvdG9idWZfbmFjbC5neXApLgogCi1BIHByb3RvYnVmLmd5cCBmaWxlIGhhcyBiZWVuIGFkZGVkIGZvciBidWlsZGluZyB3aXRoIENocm9taXVtLgorICAgQmUgc3VyZSB0byB1cGRhdGUgdGhlIGxpc3Qgb2Ygc291cmNlIGZpbGVzLCBhcyBhZGRpdGlvbmFsIC5jYyBmaWxlcyBhbmQKKyAgIGhlYWRlcnMgbWlnaHQgaGF2ZSBiZWVuIGFkZGVkIC0tIHlvdSBuZWVkIHRvIGZpbmQgdGhlIHRyYW5zaXRpdmUgY2xvc3VyZSBvZgorICAgaW5jbHVkZSBmaWxlcyByZXF1aXJlZCBieSB0YXJnZXRzLgogCi1UaGlzIGNvZGUgaGFzIGJlZW4gcGF0Y2hlZCB0byBzdXBwb3J0IHVua25vd24gZmllbGQgcmV0ZW50aW9uIGluIHByb3RvYnVmLWxpdGUuCi1TZWUgcjYyMzMxIGZvciB0aGUgcGF0Y2guCisgICBPdGhlciB0aGluZ3MgdG8gY2FyZSBhYm91dCBhcmUgZGVmaW5lcyByZXF1aXJlZCBieSBwcm90b2J1ZiBvbiB2YXJpb3VzCisgICBwbGF0Zm9ybXMsIHdhcm5pbmdzIGdlbmVyYXRlZCBieSBjb21waWxlcnMsIGFuZCBuZXcgZGVwZW5kZW5jaWVzIGludHJvZHVjZWQuCiszLiBHZXQgb3Blbi1zb3VyY2UgbGlicmFyeSBzaXgucHkgZnJvbSBodHRwczovL3B5cGkucHl0aG9uLm9yZy9weXBpL3NpeC8gYW5kIGFkZAorICAgaXQgdG8gcHJvdG9idWYvdGhpcmRfcGFydHkvc2l4L3NpeC5weS4KKzQuIEFwcGx5IHBhdGNoZXMgaW4gcGF0Y2hlcy8gKHNlZSB0aGUgZGVzY3JpcHRpb24gYmVsb3cpOgogCi1UaGlzIGNvZGUgaGFzIGJlZW4gcGF0Y2hlZCB0byBlbnN1cmUgdGhhdCBmaWxlcyBpbiB0aGUgdGFyZ2V0IHByb3RvYnVmX2xpdGUKLWRvIG5vdCBpbmNsdWRlIGhlYWRlcnMgZnJvbSBwcm90b2J1Zl9mdWxsLiBTZWUgcjE3MzIyOCBmb3IgdGhlIHBhdGNoLgorICAgJCBmb3IgcGF0Y2ggaW4gcGF0Y2hlcy8qOyBkbyBwYXRjaCAtcyAtcDEgPCAkcGF0Y2g7IGRvbmUKIAotUmV2aXNpb25zIHI0MjcgYW5kIHI0MzAgd2VyZSBjaGVycnktcGlja2VkIGZyb20gdXBzdHJlYW0uCisgICBGb3IgZnV0dXJlIHJlbGVhc2VzLCBpdCB3aWxsIGJlIHdvcnRoIGxvb2tpbmcgaW50byB3aGljaCBwYXRjaGVzIHN0aWxsIG5lZWQKKyAgIHRvIGJlIGFwcGxpZWQuCis1LiBHZW5lcmF0ZSBkZXNjcmlwdG9yX3BiMi5weSB1c2luZyBzb21ldGhpbmcgbGlrZSB0aGUgZm9sbG93aW5nIHN0ZXBzLiBNYWtlCisgICBzdXJlIHlvdSd2ZSByZWdlbmVyYXRlZCB5b3VyIGJ1aWxkZmlsZXMgYW5kIHdpbGwgYnVpbGQgcHJvdG9jIGZyb20gdGhlCisgICBuZXdseS1tb2RpZmllZCBzb3VyY2VzIGFib3ZlLgogCi1DaGVycnktcGljayBwYXRjaCBmcm9tIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi9pc3N1ZXMvZGV0YWlsP2lkPTQyNS4KKyAgICQgY2QgJFNSQ19ESVIKKyAgICQgbmluamEgLUMgb3V0L0RlYnVnIHByb3RvYworICAgJCBjZCB0aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMKKyAgICQgLi4vLi4vLi4vb3V0L0RlYnVnL3Byb3RvYyAtLXB5dGhvbl9vdXQ9Li4vcHl0aG9uIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCiAKLU5vdGVzIGFib3V0IEphdmE6Ci1XZSBoYXZlIG5vdCBmb3JrZWQgdGhlIEphdmEgdmVyc2lvbiBvZiBwcm90b2J1Zi1saXRlLCBzbyB0aGUgSmF2YSB2ZXJzaW9uIGRvZXMKLW5vdCBzdXBwb3J0IHVua25vd24gZmllbGQgcmV0ZW50aW9uLgorNi4gQWRkIGFuIF9faW5pdF9fLnB5IHRvIHByb3RvYnVmLyB0aGF0IGFkZHMgdGhpcmRfcGFydHkvc2l4LyB0byBQeXRob24gcGF0aC4KKzcuIFVwZGF0ZSBSRUFETUUuY2hyb21pdW0uCiAKLVRoZSBsaXN0IG9mIEphdmEgZmlsZXMgaW5jbHVkZWQgaW4gdGhlIGxpdGUgcHJvZmlsZSBmb3IgSmF2YSBpcyBwYXJzZWQgZnJvbSB0aGUKLW1hdmVuIGphdmEvcG9tLnhtbCBieSB0aGUgc2NyaXB0IHByb3RvYnVmX2xpdGVfamF2YV9wYXJzZV9wb20ucHkuIFNlZQotJ2phdmFjX2luY2x1ZGVzJyB2YXJpYWJsZSBpbiBwcm90b2J1Zl9saXRlX2phdmFsaWIgR1lQIHRhcmdldC4KK0Rlc2NyaXB0aW9uIG9mIHRoZSBwYXRjaGVzOgogCistIDAwMDMtcmVtb3ZlLXN0YXRpYy1pbml0aWFsaXplcnMucGF0Y2gKKworICBUaGlzIHBhdGNoIHJlbW92ZXMgYWxsIHN0YXRpYyBpbml0aWFsaXplcnMgZnJvbSBDaHJvbWl1bS4gVGhlIGNoYW5nZSBpbiBTdGF0dXMKKyAgY2xhc3MgaXMgbm90IGNvbXBsZXRlbHkgY29tcGF0aWJsZSB3aXRoIHVwc3RyZWFtLCBidXQgaXQncyBjb21wYXRpYmxlIGVub3VnaAorICB0byB3b3JrIGluIENocm9taXVtLCB3aGljaCBkb2Vzbid0IHVzZSB0aGlzIGZ1bmN0aW9uYWxpdHkgeWV0LiBUaGUgd29yayBvbgorICB1cHN0cmVhbWluZyB0aGUgcmVtb3ZhbCBvZiBzdGF0aWMgaW5pdGlhbGl6ZXJzIGlzIGluIHByb2dyZXNzOgorICBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmL2lzc3Vlcy8xNDA0CisKKy0gMDAwNC1maXgtaW50ZWdlci10eXBlcy1hbmQtc2hhcmVkLWxpYnJhcnktZXhwb3J0cy5wYXRjaAorCisgIFRoaXMgcGF0Y2ggbWFrZXMgcHJvdG9idWYgaW50NjQgdG8gYmUgaW50NjRfdCAoYXMgb3Bwb3NlZCB0byBsb25nIGxvbmcgaW4KKyAgdXBzdHJlYW0pLCBhbmQgc2ltaWxhcmx5IGZvciBvdGhlciBpbnRlZ2VyIHR5cGVzLiBJdCBhbHNvIGFsbG93cyBleHBvcnRpbmcKKyAgcHJvdG9idWYgc3ltYm9scyBpbiBMaW51eCAuc28gbGlicmFyaWVzLCBzbyB0aGF0IHByb3RvYnVmIGNhbiBiZSBidWlsdCBhcyBhCisgIGNvbXBvbmVudCAoc2VlIGh0dHA6Ly9jcnJldi5jb20vMTc5ODA2KS4KKworLSAwMDA1LWZpeC1pbmNsdWRlLWpzLWdlbmVyYXRvci5wcm90b2J1ZgorCisgIER1cmluZyBtZXJnZSB3aXRoIGludGVybmFsIGJyYW5jaCwgdGhlIDw+IGluIG9uZSBvZiB0aGUgI2luY2x1ZGVzIHdlcmUKKyAgYWNjaWRlbnRhbGx5IHJlcGxhY2VkIHdpdGggIiIsIHdoaWNoIHJlc3VsdHMgaW4gYSBmYWlsdXJlIGluIGNoZWNrZGVwcy4KKworICBGaXhlZCBpbiBodHRwczovL2dpdGh1Yi5jb20vZ29vZ2xlL3Byb3RvYnVmL3B1bGwvMTU0Ny4KKworLSAwMDA3LXVuaW5saW5lX2dvb2dsZW9uY2UucGF0Y2gKKy0gMDAwOC11bmlubGluZV9nZXRfZW1wdHlfc3RyaW5nLnBhdGNoCistIDAwMDktdW5pbmxpbmUtYXJlbmFzdHJpbmcucGF0Y2gKKy0gMDAxMC11bmlubGluZS1nZW5lcmF0ZWQtY29kZS5wYXRjaAorCisgIFRoZXNlIHBhdGNoZXMgdW5pbmxpbmUgc29tZSBmdW5jdGlvbnMsIHJlc3VsdGluZyBpbiBhIHNpZ25pZmljYW50IHJlZHVjdGlvbgorICAoc29tZXdoZXJlIGJldHdlZW4gNTAwIEtCIGFuZCAxIE1CKSBvZiBiaW5hcnkgc2l6ZS4KKworLSAwMDExLWxpYnByb3RvYnVmX2V4cG9ydC5wYXRjaAorCisgIER1cmluZyBtZXJnZSB3aXRoIGludGVybmFsIGJyYW5jaCwgdGhlIGRsbCBleHBvcnQgYXR0cmlidXRlIHdhcyBhY2NpZGVudGFsbHkKKyAgcmVtb3ZlZCBpbiBDKysxMSBtb2RlLgorCisgIEZpeGVkIGluIGh0dHBzOi8vZ2l0aHViLmNvbS9nb29nbGUvcHJvdG9idWYvcHVsbC8xNTQ5CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9SRUFETUUubWQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9SRUFETUUubWQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9SRUFETUUudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL1JFQURNRS50eHQKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGE4ZjY2MDQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL1JFQURNRS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci1Db3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy8KLQotQysrIEluc3RhbGxhdGlvbiAtIFVuaXgKLT09PT09PT09PT09PT09PT09PT09PT09Ci0KLVRvIGJ1aWxkIGFuZCBpbnN0YWxsIHRoZSBDKysgUHJvdG9jb2wgQnVmZmVyIHJ1bnRpbWUgYW5kIHRoZSBQcm90b2NvbAotQnVmZmVyIGNvbXBpbGVyIChwcm90b2MpIGV4ZWN1dGUgdGhlIGZvbGxvd2luZzoKLQotICAkIC4vY29uZmlndXJlCi0gICQgbWFrZQotICAkIG1ha2UgY2hlY2sKLSAgJCBtYWtlIGluc3RhbGwKLQotSWYgIm1ha2UgY2hlY2siIGZhaWxzLCB5b3UgY2FuIHN0aWxsIGluc3RhbGwsIGJ1dCBpdCBpcyBsaWtlbHkgdGhhdAotc29tZSBmZWF0dXJlcyBvZiB0aGlzIGxpYnJhcnkgd2lsbCBub3Qgd29yayBjb3JyZWN0bHkgb24geW91ciBzeXN0ZW0uCi1Qcm9jZWVkIGF0IHlvdXIgb3duIHJpc2suCi0KLSJtYWtlIGluc3RhbGwiIG1heSByZXF1aXJlIHN1cGVydXNlciBwcml2aWxlZ2VzLgotCi1Gb3IgYWR2YW5jZWQgdXNhZ2UgaW5mb3JtYXRpb24gb24gY29uZmlndXJlIGFuZCBtYWtlLCBzZWUgSU5TVEFMTC50eHQuCi0KLSoqIEhpbnQgb24gaW5zdGFsbCBsb2NhdGlvbiAqKgotCi0gIEJ5IGRlZmF1bHQsIHRoZSBwYWNrYWdlIHdpbGwgYmUgaW5zdGFsbGVkIHRvIC91c3IvbG9jYWwuICBIb3dldmVyLAotICBvbiBtYW55IHBsYXRmb3JtcywgL3Vzci9sb2NhbC9saWIgaXMgbm90IHBhcnQgb2YgTERfTElCUkFSWV9QQVRILgotICBZb3UgY2FuIGFkZCBpdCwgYnV0IGl0IG1heSBiZSBlYXNpZXIgdG8ganVzdCBpbnN0YWxsIHRvIC91c3IKLSAgaW5zdGVhZC4gIFRvIGRvIHRoaXMsIGludm9rZSBjb25maWd1cmUgYXMgZm9sbG93czoKLQotICAgIC4vY29uZmlndXJlIC0tcHJlZml4PS91c3IKLQotICBJZiB5b3UgYWxyZWFkeSBidWlsdCB0aGUgcGFja2FnZSB3aXRoIGEgZGlmZmVyZW50IHByZWZpeCwgbWFrZSBzdXJlCi0gIHRvIHJ1biAibWFrZSBjbGVhbiIgYmVmb3JlIGJ1aWxkaW5nIGFnYWluLgotCi0qKiBDb21waWxpbmcgZGVwZW5kZW50IHBhY2thZ2VzICoqCi0KLSAgVG8gY29tcGlsZSBhIHBhY2thZ2UgdGhhdCB1c2VzIFByb3RvY29sIEJ1ZmZlcnMsIHlvdSBuZWVkIHRvIHBhc3MKLSAgdmFyaW91cyBmbGFncyB0byB5b3VyIGNvbXBpbGVyIGFuZCBsaW5rZXIuICBBcyBvZiB2ZXJzaW9uIDIuMi4wLAotICBQcm90b2NvbCBCdWZmZXJzIGludGVncmF0ZXMgd2l0aCBwa2ctY29uZmlnIHRvIG1hbmFnZSB0aGlzLiAgSWYgeW91Ci0gIGhhdmUgcGtnLWNvbmZpZyBpbnN0YWxsZWQsIHRoZW4geW91IGNhbiBpbnZva2UgaXQgdG8gZ2V0IGEgbGlzdCBvZgotICBmbGFncyBsaWtlIHNvOgotCi0gICAgcGtnLWNvbmZpZyAtLWNmbGFncyBwcm90b2J1ZiAgICAgICAgICMgcHJpbnQgY29tcGlsZXIgZmxhZ3MKLSAgICBwa2ctY29uZmlnIC0tbGlicyBwcm90b2J1ZiAgICAgICAgICAgIyBwcmludCBsaW5rZXIgZmxhZ3MKLSAgICBwa2ctY29uZmlnIC0tY2ZsYWdzIC0tbGlicyBwcm90b2J1ZiAgIyBwcmludCBib3RoCi0KLSAgRm9yIGV4YW1wbGU6Ci0KLSAgICBjKysgbXlfcHJvZ3JhbS5jYyBteV9wcm90by5wYi5jYyBgcGtnLWNvbmZpZyAtLWNmbGFncyAtLWxpYnMgcHJvdG9idWZgCi0KLSAgTm90ZSB0aGF0IHBhY2thZ2VzIHdyaXR0ZW4gcHJpb3IgdG8gdGhlIDIuMi4wIHJlbGVhc2Ugb2YgUHJvdG9jb2wKLSAgQnVmZmVycyBtYXkgbm90IHlldCBpbnRlZ3JhdGUgd2l0aCBwa2ctY29uZmlnIHRvIGdldCBmbGFncywgYW5kIG1heQotICBub3QgcGFzcyB0aGUgY29ycmVjdCBzZXQgb2YgZmxhZ3MgdG8gY29ycmVjdGx5IGxpbmsgYWdhaW5zdAotICBsaWJwcm90b2J1Zi4gIElmIHRoZSBwYWNrYWdlIGluIHF1ZXN0aW9uIHVzZXMgYXV0b2NvbmYsIHlvdSBjYW4KLSAgb2Z0ZW4gZml4IHRoZSBwcm9ibGVtIGJ5IGludm9raW5nIGl0cyBjb25maWd1cmUgc2NyaXB0IGxpa2U6Ci0KLSAgICBjb25maWd1cmUgQ1hYRkxBR1M9IiQocGtnLWNvbmZpZyAtLWNmbGFncyBwcm90b2J1ZikiIFwKLSAgICAgICAgICAgICAgTElCUz0iJChwa2ctY29uZmlnIC0tbGlicyBwcm90b2J1ZikiCi0KLSAgVGhpcyB3aWxsIGZvcmNlIGl0IHRvIHVzZSB0aGUgY29ycmVjdCBmbGFncy4KLQotICBJZiB5b3UgYXJlIHdyaXRpbmcgYW4gYXV0b2NvbmYtYmFzZWQgcGFja2FnZSB0aGF0IHVzZXMgUHJvdG9jb2wKLSAgQnVmZmVycywgeW91IHNob3VsZCBwcm9iYWJseSB1c2UgdGhlIFBLR19DSEVDS19NT0RVTEVTIG1hY3JvIGluIHlvdXIKLSAgY29uZmlndXJlIHNjcmlwdCBsaWtlOgotCi0gICAgUEtHX0NIRUNLX01PRFVMRVMoW3Byb3RvYnVmXSwgW3Byb3RvYnVmXSkKLQotICBTZWUgdGhlIHBrZy1jb25maWcgbWFuIHBhZ2UgZm9yIG1vcmUgaW5mby4KLQotICBJZiB5b3Ugb25seSB3YW50IHByb3RvYnVmLWxpdGUsIHN1YnN0aXR1dGUgInByb3RvYnVmLWxpdGUiIGluIHBsYWNlCi0gIG9mICJwcm90b2J1ZiIgaW4gdGhlc2UgZXhhbXBsZXMuCi0KLSoqIE5vdGUgZm9yIGNyb3NzLWNvbXBpbGluZyAqKgotCi0gIFRoZSBtYWtlZmlsZXMgbm9ybWFsbHkgaW52b2tlIHRoZSBwcm90b2MgZXhlY3V0YWJsZSB0aGF0IHRoZXkganVzdAotICBidWlsdCBpbiBvcmRlciB0byBidWlsZCB0ZXN0cy4gIFdoZW4gY3Jvc3MtY29tcGlsaW5nLCB0aGUgcHJvdG9jCi0gIGV4ZWN1dGFibGUgbWF5IG5vdCBiZSBleGVjdXRhYmxlIG9uIHRoZSBob3N0IG1hY2hpbmUuICBJbiB0aGlzIGNhc2UsCi0gIHlvdSBtdXN0IGJ1aWxkIGEgY29weSBvZiBwcm90b2MgZm9yIHRoZSBob3N0IG1hY2hpbmUgZmlyc3QsIHRoZW4gdXNlCi0gIHRoZSAtLXdpdGgtcHJvdG9jIG9wdGlvbiB0byB0ZWxsIGNvbmZpZ3VyZSB0byB1c2UgaXQgaW5zdGVhZC4gIEZvcgotICBleGFtcGxlOgotCi0gICAgLi9jb25maWd1cmUgLS13aXRoLXByb3RvYz1wcm90b2MKLQotICBUaGlzIHdpbGwgdXNlIHRoZSBpbnN0YWxsZWQgcHJvdG9jIChmb3VuZCBpbiB5b3VyICRQQVRIKSBpbnN0ZWFkIG9mCi0gIHRyeWluZyB0byBleGVjdXRlIHRoZSBvbmUgYnVpbHQgZHVyaW5nIHRoZSBidWlsZCBwcm9jZXNzLiAgWW91IGNhbgotICBhbHNvIHVzZSBhbiBleGVjdXRhYmxlIHRoYXQgaGFzbid0IGJlZW4gaW5zdGFsbGVkLiAgRm9yIGV4YW1wbGUsIGlmCi0gIHlvdSBidWlsdCB0aGUgcHJvdG9idWYgcGFja2FnZSBmb3IgeW91ciBob3N0IG1hY2hpbmUgaW4gLi4vaG9zdCwKLSAgeW91IG1pZ2h0IGRvOgotCi0gICAgLi9jb25maWd1cmUgLS13aXRoLXByb3RvYz0uLi9ob3N0L3NyYy9wcm90b2MKLQotICBFaXRoZXIgd2F5LCB5b3UgbXVzdCBtYWtlIHN1cmUgdGhhdCB0aGUgcHJvdG9jIGV4ZWN1dGFibGUgeW91IHVzZQotICBoYXMgdGhlIHNhbWUgdmVyc2lvbiBhcyB0aGUgcHJvdG9idWYgc291cmNlIGNvZGUgeW91IGFyZSB0cnlpbmcgdG8KLSAgdXNlIGl0IHdpdGguCi0KLSoqIE5vdGUgZm9yIFNvbGFyaXMgdXNlcnMgKioKLQotICBTb2xhcmlzIDEwIHg4NiBoYXMgYSBidWcgdGhhdCB3aWxsIG1ha2UgbGlua2luZyBmYWlsLCBjb21wbGFpbmluZwotICBhYm91dCBsaWJzdGRjKysubGEgYmVpbmcgaW52YWxpZC4gIFdlIGhhdmUgaW5jbHVkZWQgYSB3b3JrLWFyb3VuZAotICBpbiB0aGlzIHBhY2thZ2UuICBUbyB1c2UgdGhlIHdvcmstYXJvdW5kLCBydW4gY29uZmlndXJlIGFzIGZvbGxvd3M6Ci0KLSAgICAuL2NvbmZpZ3VyZSBMREZMQUdTPS1MJFBXRC9zcmMvc29sYXJpcwotCi0gIFNlZSBzcmMvc29sYXJpcy9saWJzdGRjKysubGEgZm9yIG1vcmUgaW5mbyBvbiB0aGlzIGJ1Zy4KLQotKiogTm90ZSBmb3IgSFAgQysrIFRydTY0IHVzZXJzICoqCi0KLSAgVG8gY29tcGlsZSBpbnZva2UgY29uZmlndXJlIGFzIGZvbGxvd3M6Ci0KLSAgICAuL2NvbmZpZ3VyZSBDWFhGTEFHUz0iLU8gLXN0ZCBhbnNpIC1pZWVlIC1EX19VU0VfU1REX0lPU1RSRUFNIgotCi0gIEFsc28sIHlvdSB3aWxsIG5lZWQgdG8gdXNlIGdtYWtlIGluc3RlYWQgb2YgbWFrZS4KLQotQysrIEluc3RhbGxhdGlvbiAtIFdpbmRvd3MKLT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUlmIHlvdSBhcmUgdXNpbmcgTWljb3NvZnQgVmlzdWFsIEMrKywgc2VlIHZzcHJvamVjdHMvcmVhZG1lLnR4dC4KLQotSWYgeW91IGFyZSB1c2luZyBDeWd3aW4gb3IgTWluR1csIGZvbGxvdyB0aGUgVW5peCBpbnN0YWxsYXRpb24KLWluc3RydWN0aW9ucywgYWJvdmUuCi0KLUJpbmFyeSBDb21wYXRpYmlsaXR5IFdhcm5pbmcKLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotRHVlIHRvIHRoZSBuYXR1cmUgb2YgQysrLCBpdCBpcyB1bmxpa2VseSB0aGF0IGFueSB0d28gdmVyc2lvbnMgb2YgdGhlCi1Qcm90b2NvbCBCdWZmZXJzIEMrKyBydW50aW1lIGxpYnJhcmllcyB3aWxsIGhhdmUgY29tcGF0aWJsZSBBQklzLgotVGhhdCBpcywgaWYgeW91IGxpbmtlZCBhbiBleGVjdXRhYmxlIGFnYWluc3QgYW4gb2xkZXIgdmVyc2lvbiBvZgotbGlicHJvdG9idWYsIGl0IGlzIHVubGlrZWx5IHRvIHdvcmsgd2l0aCBhIG5ld2VyIHZlcnNpb24gd2l0aG91dAotcmUtY29tcGlsaW5nLiAgVGhpcyBwcm9ibGVtLCB3aGVuIGl0IG9jY3Vycywgd2lsbCBub3JtYWxseSBiZSBkZXRlY3RlZAotaW1tZWRpYXRlbHkgb24gc3RhcnR1cCBvZiB5b3VyIGFwcC4gIFN0aWxsLCB5b3UgbWF5IHdhbnQgdG8gY29uc2lkZXIKLXVzaW5nIHN0YXRpYyBsaW5rYWdlLiAgWW91IGNhbiBjb25maWd1cmUgdGhpcyBwYWNrYWdlIHRvIGluc3RhbGwKLXN0YXRpYyBsaWJyYXJpZXMgb25seSB1c2luZzoKLQotICAuL2NvbmZpZ3VyZSAtLWRpc2FibGUtc2hhcmVkCi0KLUphdmEgYW5kIFB5dGhvbiBJbnN0YWxsYXRpb24KLT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotVGhlIEphdmEgYW5kIFB5dGhvbiBydW50aW1lIGxpYnJhcmllcyBmb3IgUHJvdG9jb2wgQnVmZmVycyBhcmUgbG9jYXRlZAotaW4gdGhlIGphdmEgYW5kIHB5dGhvbiBkaXJlY3Rvcmllcy4gIFNlZSB0aGUgUkVBRE1FIGZpbGUgaW4gZWFjaAotZGlyZWN0b3J5IGZvciBtb3JlIGluZm9ybWF0aW9uIG9uIGhvdyB0byBjb21waWxlIGFuZCBpbnN0YWxsIHRoZW0uCi1Ob3RlIHRoYXQgYm90aCBvZiB0aGVtIHJlcXVpcmUgeW91IHRvIGZpcnN0IGluc3RhbGwgdGhlIFByb3RvY29sCi1CdWZmZXIgY29tcGlsZXIgKHByb3RvYyksIHdoaWNoIGlzIHBhcnQgb2YgdGhlIEMrKyBwYWNrYWdlLgotCi1Vc2FnZQotPT09PT0KLQotVGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gZm9yIFByb3RvY29sIEJ1ZmZlcnMgaXMgYXZhaWxhYmxlIHZpYSB0aGUKLXdlYiBhdDoKLQotICBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvcHJvdG9jb2xidWZmZXJzLwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvV09SS1NQQUNFIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL1dPUktTUEFDRQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvV09SS1NQQUNFCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvV09SS1NQQUNFCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvX19pbml0X18ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvX19pbml0X18ucHkKb2xkIG1vZGUgMTAwNzU1Cm5ldyBtb2RlIDEwMDY0NAppbmRleCAxMzk1OTdmLi4xMWUxY2YyCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9fX2luaXRfXy5weQorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvX19pbml0X18ucHkKQEAgLTEsMiArMSw2IEBACitpbXBvcnQgc3lzCitpbXBvcnQgb3MKIAorVEhJU19ESVIgPSBvcy5wYXRoLmRpcm5hbWUob3MucGF0aC5hYnNwYXRoKF9fZmlsZV9fKSkKIAorc3lzLnBhdGguaW5zZXJ0KDAsIG9zLnBhdGguam9pbihUSElTX0RJUiwgInRoaXJkX3BhcnR5IiwgInNpeCIpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYXBwdmV5b3IuYmF0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2FwcHZleW9yLmJhdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYXBwdmV5b3IuYmF0CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYXBwdmV5b3IuYmF0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9hcHB2ZXlvci55bWwgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYXBwdmV5b3IueW1sCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9hcHB2ZXlvci55bWwKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9hcHB2ZXlvci55bWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2F1dG9nZW4uc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYXV0b2dlbi5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYXV0b2dlbi5zaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2F1dG9nZW4uc2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2JlbmNobWFya3MvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYmVuY2htYXJrcy9NYWtlZmlsZS5hbQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYmVuY2htYXJrcy9NYWtlZmlsZS5hbQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2JlbmNobWFya3MvUHJvdG9CZW5jaC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvUHJvdG9CZW5jaC5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL1Byb3RvQmVuY2guamF2YQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvUHJvdG9CZW5jaC5qYXZhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYmVuY2htYXJrcy9SRUFETUUubWQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYmVuY2htYXJrcy9iZW5jaG1hcmtfbWVzc2FnZXNfcHJvdG8yLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvYmVuY2htYXJrX21lc3NhZ2VzX3Byb3RvMi5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYmVuY2htYXJrcy9iZW5jaG1hcmtfbWVzc2FnZXNfcHJvdG8yLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYmVuY2htYXJrcy9iZW5jaG1hcmtfbWVzc2FnZXNfcHJvdG8yLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL2JlbmNobWFya19tZXNzYWdlc19wcm90bzMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYmVuY2htYXJrcy9iZW5jaG1hcmtfbWVzc2FnZXNfcHJvdG8zLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL2JlbmNobWFya19tZXNzYWdlc19wcm90bzMucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL2JlbmNobWFya19tZXNzYWdlc19wcm90bzMucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2JlbmNobWFya3MvYmVuY2htYXJrcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL2JlbmNobWFya3MucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2JlbmNobWFya3MvYmVuY2htYXJrcy5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvYmVuY2htYXJrcy5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYmVuY2htYXJrcy9nZW5lcmF0ZV9kYXRhc2V0cy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL2dlbmVyYXRlX2RhdGFzZXRzLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL2dlbmVyYXRlX2RhdGFzZXRzLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYmVuY2htYXJrcy9nZW5lcmF0ZV9kYXRhc2V0cy5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYmVuY2htYXJrcy9nb29nbGVfbWVzc2FnZTEuZGF0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvZ29vZ2xlX21lc3NhZ2UxLmRhdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvYmVuY2htYXJrcy9nb29nbGVfbWVzc2FnZTEuZGF0CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYmVuY2htYXJrcy9nb29nbGVfbWVzc2FnZTEuZGF0CkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2JlbmNobWFya3MvZ29vZ2xlX21lc3NhZ2UyLmRhdCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL2dvb2dsZV9tZXNzYWdlMi5kYXQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2JlbmNobWFya3MvZ29vZ2xlX21lc3NhZ2UyLmRhdApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvZ29vZ2xlX21lc3NhZ2UyLmRhdApCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL2dvb2dsZV9zaXplLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2JlbmNobWFya3MvZ29vZ2xlX3NpemUucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2JlbmNobWFya3MvZ29vZ2xlX3NpemUucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL2dvb2dsZV9zaXplLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL3JlYWRtZS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvYmVuY2htYXJrcy9yZWFkbWUudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9iZW5jaG1hcmtzL3JlYWRtZS50eHQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9iZW5jaG1hcmtzL3JlYWRtZS50eHQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NtYWtlL0NNYWtlTGlzdHMudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL0NNYWtlTGlzdHMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9DTWFrZUxpc3RzLnR4dApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL0NNYWtlTGlzdHMudHh0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY21ha2UvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9SRUFETUUubWQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9SRUFETUUubWQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NtYWtlL2V4dHJhY3RfaW5jbHVkZXMuYmF0LmluIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL2V4dHJhY3RfaW5jbHVkZXMuYmF0LmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9leHRyYWN0X2luY2x1ZGVzLmJhdC5pbgpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL2V4dHJhY3RfaW5jbHVkZXMuYmF0LmluCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9pbnN0YWxsLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL2luc3RhbGwuY21ha2UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NtYWtlL2luc3RhbGwuY21ha2UKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9pbnN0YWxsLmNtYWtlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9saWJwcm90b2J1Zi1saXRlLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL2xpYnByb3RvYnVmLWxpdGUuY21ha2UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NtYWtlL2xpYnByb3RvYnVmLWxpdGUuY21ha2UKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9saWJwcm90b2J1Zi1saXRlLmNtYWtlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9saWJwcm90b2J1Zi5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9saWJwcm90b2J1Zi5jbWFrZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY21ha2UvbGlicHJvdG9idWYuY21ha2UKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9saWJwcm90b2J1Zi5jbWFrZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY21ha2UvbGlicHJvdG9jLmNtYWtlIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL2xpYnByb3RvYy5jbWFrZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY21ha2UvbGlicHJvdG9jLmNtYWtlCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY21ha2UvbGlicHJvdG9jLmNtYWtlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9wcm90b2J1Zi1jb25maWctdmVyc2lvbi5jbWFrZS5pbiBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9wcm90b2J1Zi1jb25maWctdmVyc2lvbi5jbWFrZS5pbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY21ha2UvcHJvdG9idWYtY29uZmlnLXZlcnNpb24uY21ha2UuaW4KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9wcm90b2J1Zi1jb25maWctdmVyc2lvbi5jbWFrZS5pbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY21ha2UvcHJvdG9idWYtY29uZmlnLmNtYWtlLmluIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL3Byb3RvYnVmLWNvbmZpZy5jbWFrZS5pbgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY21ha2UvcHJvdG9idWYtY29uZmlnLmNtYWtlLmluCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY21ha2UvcHJvdG9idWYtY29uZmlnLmNtYWtlLmluCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9wcm90b2J1Zi1tb2R1bGUuY21ha2UuaW4gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY21ha2UvcHJvdG9idWYtbW9kdWxlLmNtYWtlLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jbWFrZS9wcm90b2J1Zi1tb2R1bGUuY21ha2UuaW4KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9wcm90b2J1Zi1tb2R1bGUuY21ha2UuaW4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NtYWtlL3Byb3RvYy5jbWFrZSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jbWFrZS9wcm90b2MuY21ha2UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NtYWtlL3Byb3RvYy5jbWFrZQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NtYWtlL3Byb3RvYy5jbWFrZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY21ha2UvdGVzdHMuY21ha2UgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY21ha2UvdGVzdHMuY21ha2UKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NtYWtlL3Rlc3RzLmNtYWtlCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY21ha2UvdGVzdHMuY21ha2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25maWcuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25maWcuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNjJlNGMzYy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZmlnLmgKKysrIC9kZXYvbnVsbApAQCAtMSwxNjQgKzAsMCBAQAotLyogY29uZmlnLmguICBHZW5lcmF0ZWQgZnJvbSBjb25maWcuaC5pbiBieSBjb25maWd1cmUuICAqLwotLyogY29uZmlnLmguaW4uICBHZW5lcmF0ZWQgZnJvbSBjb25maWd1cmUuYWMgYnkgYXV0b2hlYWRlci4gICovCi0KLS8qIHRoZSBuYW1lIG9mIDxoYXNoX3NldD4gKi8KLSNkZWZpbmUgSEFTSF9NQVBfQ0xBU1MgaGFzaF9tYXAKLQotLyogdGhlIGxvY2F0aW9uIG9mIDxoYXNoX21hcD4gKi8KLSNpZiBkZWZpbmVkKFVTRV9TVExQT1JUKQotI2RlZmluZSBIQVNIX01BUF9IIDxoYXNoX21hcD4KLSNlbHNlCi0jZGVmaW5lIEhBU0hfTUFQX0ggPGV4dC9oYXNoX21hcD4KLSNlbmRpZgotCi0vKiB0aGUgbmFtZXNwYWNlIG9mIGhhc2hfbWFwL2hhc2hfc2V0ICovCi0jaWYgZGVmaW5lZChVU0VfU1RMUE9SVCkKLSNkZWZpbmUgSEFTSF9OQU1FU1BBQ0Ugc3RkCi0jZWxzZQotI2RlZmluZSBIQVNIX05BTUVTUEFDRSBfX2dudV9jeHgKLSNlbmRpZgotCi0vKiB0aGUgbmFtZSBvZiA8aGFzaF9zZXQ+ICovCi0jZGVmaW5lIEhBU0hfU0VUX0NMQVNTIGhhc2hfc2V0Ci0KLS8qIHRoZSBsb2NhdGlvbiBvZiA8aGFzaF9zZXQ+ICovCi0jaWYgZGVmaW5lZChVU0VfU1RMUE9SVCkKLSNkZWZpbmUgSEFTSF9TRVRfSCA8aGFzaF9zZXQ+Ci0jZWxzZQotI2RlZmluZSBIQVNIX1NFVF9IIDxleHQvaGFzaF9zZXQ+Ci0jZW5kaWYKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxkbGZjbi5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9ETEZDTl9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxmY250bC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9GQ05UTF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBmdHJ1bmNhdGUnIGZ1bmN0aW9uLiAqLwotI2RlZmluZSBIQVZFX0ZUUlVOQ0FURSAxCi0KLS8qIGRlZmluZSBpZiB0aGUgY29tcGlsZXIgaGFzIGhhc2hfbWFwICovCi0jZGVmaW5lIEhBVkVfSEFTSF9NQVAgMQotCi0vKiBkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGhhcyBoYXNoX3NldCAqLwotI2RlZmluZSBIQVZFX0hBU0hfU0VUIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxpbnR0eXBlcy5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9JTlRUWVBFU19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxsaW1pdHMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfTElNSVRTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPG1lbW9yeS5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9NRU1PUllfSCAxCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBgbWVtc2V0JyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9NRU1TRVQgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYG1rZGlyJyBmdW5jdGlvbi4gKi8KLSNkZWZpbmUgSEFWRV9NS0RJUiAxCi0KLS8vIFN0YXJib2FyZCBoYXMgaXRzIG93biB0aHJlYWQgbWFuYWdlbWVudC4KLSNpZm5kZWYgU1RBUkJPQVJECi0vKiBEZWZpbmUgaWYgeW91IGhhdmUgUE9TSVggdGhyZWFkcyBsaWJyYXJpZXMgYW5kIGhlYWRlciBmaWxlcy4gKi8KLSNkZWZpbmUgSEFWRV9QVEhSRUFEIDEKLSNlbmRpZiAgLy8gU1RBUkJPQVJECi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSA8c3RkaW50Lmg+IGhlYWRlciBmaWxlLiAqLwotI2RlZmluZSBIQVZFX1NURElOVF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdGRsaWIuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RETElCX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cmNocicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU1RSQ0hSIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIGBzdHJlcnJvcicgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU1RSRVJST1IgMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHN0cmluZ3MuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HU19IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzdHJpbmcuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1RSSU5HX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgYHN0cnRvbCcgZnVuY3Rpb24uICovCi0jZGVmaW5lIEhBVkVfU1RSVE9MIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvc3RhdC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9TWVNfU1RBVF9IIDEKLQotLyogRGVmaW5lIHRvIDEgaWYgeW91IGhhdmUgdGhlIDxzeXMvdHlwZXMuaD4gaGVhZGVyIGZpbGUuICovCi0jZGVmaW5lIEhBVkVfU1lTX1RZUEVTX0ggMQotCi0vKiBEZWZpbmUgdG8gMSBpZiB5b3UgaGF2ZSB0aGUgPHVuaXN0ZC5oPiBoZWFkZXIgZmlsZS4gKi8KLSNkZWZpbmUgSEFWRV9VTklTVERfSCAxCi0KLS8qIEVuYWJsZSBjbGFzc2VzIHVzaW5nIHpsaWIgY29tcHJlc3Npb24uICovCi0jZGVmaW5lIEhBVkVfWkxJQiAxCi0KLSNpZiBkZWZpbmVkKF9fTEJfU0hFTExfXykgfHwgZGVmaW5lZChDT0JBTFQpCi0jdW5kZWYgSEFWRV9IQVNIX01BUAotI3VuZGVmIEhBVkVfSEFTSF9TRVQKLSNlbmRpZgotCi0vKiBOYW1lIG9mIHBhY2thZ2UgKi8KLSNkZWZpbmUgUEFDS0FHRSAicHJvdG9idWYiCi0KLS8qIERlZmluZSB0byB0aGUgYWRkcmVzcyB3aGVyZSBidWcgcmVwb3J0cyBmb3IgdGhpcyBwYWNrYWdlIHNob3VsZCBiZSBzZW50LiAqLwotI2RlZmluZSBQQUNLQUdFX0JVR1JFUE9SVCAicHJvdG9idWZAZ29vZ2xlZ3JvdXBzLmNvbSIKLQotLyogRGVmaW5lIHRvIHRoZSBmdWxsIG5hbWUgb2YgdGhpcyBwYWNrYWdlLiAqLwotI2RlZmluZSBQQUNLQUdFX05BTUUgIlByb3RvY29sIEJ1ZmZlcnMiCi0KLS8qIERlZmluZSB0byB0aGUgZnVsbCBuYW1lIGFuZCB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9TVFJJTkcgIlByb3RvY29sIEJ1ZmZlcnMgMi4zLjAiCi0KLS8qIERlZmluZSB0byB0aGUgb25lIHN5bWJvbCBzaG9ydCBuYW1lIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9UQVJOQU1FICJwcm90b2J1ZiIKLQotLyogRGVmaW5lIHRvIHRoZSB2ZXJzaW9uIG9mIHRoaXMgcGFja2FnZS4gKi8KLSNkZWZpbmUgUEFDS0FHRV9WRVJTSU9OICIyLjMuMCIKLQotLyogRGVmaW5lIHRvIG5lY2Vzc2FyeSBzeW1ib2wgaWYgdGhpcyBjb25zdGFudCB1c2VzIGEgbm9uLXN0YW5kYXJkIG5hbWUgb24KLSAgIHlvdXIgc3lzdGVtLiAqLwotLyogI3VuZGVmIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBoYXZlIHRoZSBBTlNJIEMgaGVhZGVyIGZpbGVzLiAqLwotI2RlZmluZSBTVERDX0hFQURFUlMgMQotCi0vKiBWZXJzaW9uIG51bWJlciBvZiBwYWNrYWdlICovCi0jZGVmaW5lIFZFUlNJT04gIjIuMy4wIgotCi0vKiBEZWZpbmUgdG8gMSBpZiBvbiBBSVggMy4KLSAgIFN5c3RlbSBoZWFkZXJzIHNvbWV0aW1lcyBkZWZpbmUgdGhpcy4KLSAgIFdlIGp1c3Qgd2FudCB0byBhdm9pZCBhIHJlZGVmaW5pdGlvbiBlcnJvciBtZXNzYWdlLiAgKi8KLSNpZm5kZWYgX0FMTF9TT1VSQ0UKLS8qICMgdW5kZWYgX0FMTF9TT1VSQ0UgKi8KLSNlbmRpZgotCi0vKiBFbmFibGUgR05VIGV4dGVuc2lvbnMgb24gc3lzdGVtcyB0aGF0IGhhdmUgdGhlbS4gICovCi0jaWZuZGVmIF9HTlVfU09VUkNFCi0jIGRlZmluZSBfR05VX1NPVVJDRSAxCi0jZW5kaWYKLQotLyogRGVmaW5lIHRvIDEgaWYgb24gTUlOSVguICovCi0vKiAjdW5kZWYgX01JTklYICovCi0KLS8qIERlZmluZSB0byAyIGlmIHRoZSBzeXN0ZW0gZG9lcyBub3QgcHJvdmlkZSBQT1NJWC4xIGZlYXR1cmVzIGV4Y2VwdCB3aXRoCi0gICB0aGlzIGRlZmluZWQuICovCi0vKiAjdW5kZWYgX1BPU0lYXzFfU09VUkNFICovCi0KLS8qIERlZmluZSB0byAxIGlmIHlvdSBuZWVkIHRvIGluIG9yZGVyIGZvciBgc3RhdCcgYW5kIG90aGVyIHRoaW5ncyB0byB3b3JrLiAqLwotLyogI3VuZGVmIF9QT1NJWF9TT1VSQ0UgKi8KLQotLyogRW5hYmxlIGV4dGVuc2lvbnMgb24gU29sYXJpcy4gICovCi0jaWZuZGVmIF9fRVhURU5TSU9OU19fCi0jIGRlZmluZSBfX0VYVEVOU0lPTlNfXyAxCi0jZW5kaWYKLSNpZm5kZWYgX1BPU0lYX1BUSFJFQURfU0VNQU5USUNTCi0jIGRlZmluZSBfUE9TSVhfUFRIUkVBRF9TRU1BTlRJQ1MgMQotI2VuZGlmCi0jaWZuZGVmIF9UQU5ERU1fU09VUkNFCi0jIGRlZmluZSBfVEFOREVNX1NPVVJDRSAxCi0jZW5kaWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZpZ3VyZS5hYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25maWd1cmUuYWMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZpZ3VyZS5hYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZpZ3VyZS5hYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvQ29uZm9ybWFuY2VKYXZhLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvQ29uZm9ybWFuY2VKYXZhLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL0NvbmZvcm1hbmNlSmF2YS5qYXZhCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvQ29uZm9ybWFuY2VKYXZhLmphdmEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL0NvbmZvcm1hbmNlSmF2YUxpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9Db25mb3JtYW5jZUphdmFMaXRlLmphdmEKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL0NvbmZvcm1hbmNlSmF2YUxpdGUuamF2YQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL0NvbmZvcm1hbmNlSmF2YUxpdGUuamF2YQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvTWFrZWZpbGUuYW0gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvTWFrZWZpbGUuYW0Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL01ha2VmaWxlLmFtCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvTWFrZWZpbGUuYW0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9SRUFETUUubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL1JFQURNRS5tZApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvY29uZm9ybWFuY2UucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2UucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2UucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX2NwcC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9jb25mb3JtYW5jZV9jcHAuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX2NwcC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX2NwcC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvY29uZm9ybWFuY2Vfb2JqYy5tIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX29iamMubQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvY29uZm9ybWFuY2Vfb2JqYy5tCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2Vfb2JqYy5tCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS9jb25mb3JtYW5jZV9weXRob24ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfcHl0aG9uLnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS9jb25mb3JtYW5jZV9weXRob24ucHkKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9jb25mb3JtYW5jZV9weXRob24ucHkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3J1YnkucmIgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfcnVieS5yYgpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfcnVieS5yYgpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3J1YnkucmIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3Rlc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9jb25mb3JtYW5jZV90ZXN0LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3Rlc3QuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3Rlc3QuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfdGVzdF9ydW5uZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfdGVzdF9ydW5uZXIuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2NvbmZvcm1hbmNlX3Rlc3RfcnVubmVyLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvY29uZm9ybWFuY2VfdGVzdF9ydW5uZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9jcHAudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9jcHAudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3RfY3BwLnR4dApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9jcHAudHh0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3RfY3NoYXJwLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3RfY3NoYXJwLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X2NzaGFycC50eHQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3RfY3NoYXJwLnR4dApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X2phdmEudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9qYXZhLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X2phdmEudHh0CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X2phdmEudHh0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3Rfb2JqYy50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X29iamMudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3Rfb2JqYy50eHQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3Rfb2JqYy50eHQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9weXRob24tcG9zdDI2LnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3RfcHl0aG9uLXBvc3QyNi50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9weXRob24tcG9zdDI2LnR4dApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9weXRob24tcG9zdDI2LnR4dApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X3B5dGhvbi50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X3B5dGhvbi50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9weXRob24udHh0CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X3B5dGhvbi50eHQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9weXRob25fY3BwLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS9mYWlsdXJlX2xpc3RfcHl0aG9uX2NwcC50eHQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9weXRob25fY3BwLnR4dApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9weXRob25fY3BwLnR4dApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X3J1YnkudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2NvbmZvcm1hbmNlL2ZhaWx1cmVfbGlzdF9ydWJ5LnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X3J1YnkudHh0CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvZmFpbHVyZV9saXN0X3J1YnkudHh0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS90aGlyZF9wYXJ0eS9qc29uY3BwL2pzb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS90aGlyZF9wYXJ0eS9qc29uY3BwL2pzb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvdGhpcmRfcGFydHkvanNvbmNwcC9qc29uLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS90aGlyZF9wYXJ0eS9qc29uY3BwL2pzb24uaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvY29uZm9ybWFuY2UvdGhpcmRfcGFydHkvanNvbmNwcC9qc29uY3BwLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9jb25mb3JtYW5jZS90aGlyZF9wYXJ0eS9qc29uY3BwL2pzb25jcHAuY3BwCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9jb25mb3JtYW5jZS90aGlyZF9wYXJ0eS9qc29uY3BwL2pzb25jcHAuY3BwCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvY29uZm9ybWFuY2UvdGhpcmRfcGFydHkvanNvbmNwcC9qc29uY3BwLmNwcApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2Rlc2NyaXB0b3JfcGIyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2Rlc2NyaXB0b3JfcGIyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBjYmFjZDM0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9kZXNjcmlwdG9yX3BiMi5weQorKysgL2Rldi9udWxsCkBAIC0xLDExNzIgKzAsMCBAQAotIyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIQotCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uCi0jIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKQotCi0KLURFU0NSSVBUT1IgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAotICBuYW1lPSdnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bycsCi0gIHBhY2thZ2U9J2dvb2dsZS5wcm90b2J1ZicsCi0gIHNlcmlhbGl6ZWRfcGI9J1xuIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXHgxMlx4MGZnb29nbGUucHJvdG9idWZcIkdcblx4MTFceDQ2aWxlRGVzY3JpcHRvclNldFx4MTJceDMyXG5ceDA0XHg2NmlsZVx4MThceDAxIFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvXCJceGRjXHgwMlxuXHgxM1x4NDZpbGVEZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGZcblx4MDdwYWNrYWdlXHgxOFx4MDIgXHgwMShcdFx4MTJceDEyXG5cbmRlcGVuZGVuY3lceDE4XHgwMyBceDAzKFx0XHgxMlx4MzZcblx4MGNtZXNzYWdlX3R5cGVceDE4XHgwNCBceDAzKFx4MGJceDMyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvXHgxMlx4Mzdcblx0ZW51bV90eXBlXHgxOFx4MDUgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHgwN3NlcnZpY2VceDE4XHgwNiBceDAzKFx4MGJceDMyXCcuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHRleHRlbnNpb25ceDE4XHgwNyBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9ceDEyLVxuXHgwN29wdGlvbnNceDE4XHgwOCBceDAxKFx4MGJceDMyXHgxYy5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIlx4YTlceDAzXG5ceDBmXHg0NFx4NjVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDM0XG5ceDA1XHg2NmllbGRceDE4XHgwMiBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgzOFxuXHRleHRlbnNpb25ceDE4XHgwNiBceDAzKFx4MGJceDMyJS5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgzNVxuXHgwYm5lc3RlZF90eXBlXHgxOFx4MDMgXHgwMyhceDBiXHgzMiAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90b1x4MTJceDM3XG5cdGVudW1fdHlwZVx4MThceDA0IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvXHgxMkhcblx4MGZceDY1eHRlbnNpb25fcmFuZ2VceDE4XHgwNSBceDAzKFx4MGJceDMyLy5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlXHgxMlx4MzBcblx4MDdvcHRpb25zXHgxOFx4MDcgXHgwMShceDBiXHgzMlx4MWYuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zXHgxYSxcblx4MGVceDQ1eHRlbnNpb25SYW5nZVx4MTJcclxuXHgwNXN0YXJ0XHgxOFx4MDEgXHgwMShceDA1XHgxMlx4MGJcblx4MDNceDY1bmRceDE4XHgwMiBceDAxKFx4MDVcIlx4OTRceDA1XG5ceDE0XHg0NmllbGREZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGVcblx4MDZudW1iZXJceDE4XHgwMyBceDAxKFx4MDVceDEyOlxuXHgwNWxhYmVsXHgxOFx4MDQgXHgwMShceDBlXHgzMisuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsXHgxMlx4Mzhcblx4MDR0eXBlXHgxOFx4MDUgXHgwMShceDBlXHgzMiouZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGVceDEyXHgxMVxuXHR0eXBlX25hbWVceDE4XHgwNiBceDAxKFx0XHgxMlx4MTBcblx4MDhceDY1eHRlbmRlZVx4MThceDAyIFx4MDEoXHRceDEyXHgxNVxuXHJkZWZhdWx0X3ZhbHVlXHgxOFx4MDcgXHgwMShcdFx4MTIuXG5ceDA3b3B0aW9uc1x4MThceDA4IFx4MDEoXHgwYlx4MzJceDFkLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnNcIlx4YjZceDAyXG5ceDA0VHlwZVx4MTJceDBmXG5ceDBiVFlQRV9ET1VCTEVceDEwXHgwMVx4MTJceDBlXG5cblRZUEVfRkxPQVRceDEwXHgwMlx4MTJceDBlXG5cblRZUEVfSU5UNjRceDEwXHgwM1x4MTJceDBmXG5ceDBiVFlQRV9VSU5UNjRceDEwXHgwNFx4MTJceDBlXG5cblRZUEVfSU5UMzJceDEwXHgwNVx4MTJceDEwXG5ceDBjVFlQRV9GSVhFRDY0XHgxMFx4MDZceDEyXHgxMFxuXHgwY1RZUEVfRklYRUQzMlx4MTBceDA3XHgxMlxyXG5cdFRZUEVfQk9PTFx4MTBceDA4XHgxMlx4MGZcblx4MGJUWVBFX1NUUklOR1x4MTBcdFx4MTJceDBlXG5cblRZUEVfR1JPVVBceDEwXG5ceDEyXHgxMFxuXHgwY1RZUEVfTUVTU0FHRVx4MTBceDBiXHgxMlx4MGVcblxuVFlQRV9CWVRFU1x4MTBceDBjXHgxMlx4MGZcblx4MGJUWVBFX1VJTlQzMlx4MTBcclx4MTJcclxuXHRUWVBFX0VOVU1ceDEwXHgwZVx4MTJceDExXG5cclRZUEVfU0ZJWEVEMzJceDEwXHgwZlx4MTJceDExXG5cclRZUEVfU0ZJWEVENjRceDEwXHgxMFx4MTJceDBmXG5ceDBiVFlQRV9TSU5UMzJceDEwXHgxMVx4MTJceDBmXG5ceDBiVFlQRV9TSU5UNjRceDEwXHgxMlwiQ1xuXHgwNUxhYmVsXHgxMlx4MTJcblx4MGVMQUJFTF9PUFRJT05BTFx4MTBceDAxXHgxMlx4MTJcblx4MGVMQUJFTF9SRVFVSVJFRFx4MTBceDAyXHgxMlx4MTJcblx4MGVMQUJFTF9SRVBFQVRFRFx4MTBceDAzXCJceDhjXHgwMVxuXHgxM1x4NDVudW1EZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4Mzhcblx4MDV2YWx1ZVx4MThceDAyIFx4MDMoXHgwYlx4MzIpLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9ceDEyLVxuXHgwN29wdGlvbnNceDE4XHgwMyBceDAxKFx4MGJceDMyXHgxYy5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnNcImxcblx4MThceDQ1bnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9ceDEyXHgwY1xuXHgwNG5hbWVceDE4XHgwMSBceDAxKFx0XHgxMlx4MGVcblx4MDZudW1iZXJceDE4XHgwMiBceDAxKFx4MDVceDEyXHgzMlxuXHgwN29wdGlvbnNceDE4XHgwMyBceDAxKFx4MGJceDMyIS5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9uc1wiXHg5MFx4MDFcblx4MTZTZXJ2aWNlRGVzY3JpcHRvclByb3RvXHgxMlx4MGNcblx4MDRuYW1lXHgxOFx4MDEgXHgwMShcdFx4MTJceDM2XG5ceDA2bWV0aG9kXHgxOFx4MDIgXHgwMyhceDBiXHgzMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90b1x4MTJceDMwXG5ceDA3b3B0aW9uc1x4MThceDAzIFx4MDEoXHgwYlx4MzJceDFmLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1wiXHg3ZlxuXHgxNU1ldGhvZERlc2NyaXB0b3JQcm90b1x4MTJceDBjXG5ceDA0bmFtZVx4MThceDAxIFx4MDEoXHRceDEyXHgxMlxuXG5pbnB1dF90eXBlXHgxOFx4MDIgXHgwMShcdFx4MTJceDEzXG5ceDBib3V0cHV0X3R5cGVceDE4XHgwMyBceDAxKFx0XHgxMi9cblx4MDdvcHRpb25zXHgxOFx4MDQgXHgwMShceDBiXHgzMlx4MWUuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNcIlx4YTRceDAzXG5ceDBiXHg0NmlsZU9wdGlvbnNceDEyXHgxNFxuXHgwY2phdmFfcGFja2FnZVx4MThceDAxIFx4MDEoXHRceDEyXHgxY1xuXHgxNGphdmFfb3V0ZXJfY2xhc3NuYW1lXHgxOFx4MDggXHgwMShcdFx4MTJcIlxuXHgxM2phdmFfbXVsdGlwbGVfZmlsZXNceDE4XG4gXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTJceDQ2XG5ceDBjb3B0aW1pemVfZm9yXHgxOFx0IFx4MDEoXHgwZVx4MzIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGU6XHgwNVNQRUVEXHgxMiFcblx4MTNceDYzXHg2M19nZW5lcmljX3NlcnZpY2VzXHgxOFx4MTAgXHgwMShceDA4Olx4MDR0cnVlXHgxMiNcblx4MTVqYXZhX2dlbmVyaWNfc2VydmljZXNceDE4XHgxMSBceDAxKFx4MDg6XHgwNHRydWVceDEyIVxuXHgxM3B5X2dlbmVyaWNfc2VydmljZXNceDE4XHgxMiBceDAxKFx4MDg6XHgwNHRydWVceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCI6XG5ceDBjT3B0aW1pemVNb2RlXHgxMlx0XG5ceDA1U1BFRURceDEwXHgwMVx4MTJcclxuXHRDT0RFX1NJWkVceDEwXHgwMlx4MTJceDEwXG5ceDBjTElURV9SVU5USU1FXHgxMFx4MDMqXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIlx4YjhceDAxXG5ceDBlTWVzc2FnZU9wdGlvbnNceDEyJlxuXHgxN21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XHgxOFx4MDEgXHgwMShceDA4Olx4MDVceDY2XHg2MWxzZVx4MTIuXG5ceDFmbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvclx4MThceDAyIFx4MDEoXHgwODpceDA1XHg2Nlx4NjFsc2VceDEyXHg0M1xuXHgxNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXHgxOFx4ZTdceDA3IFx4MDMoXHgwYlx4MzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XHgwOFx4ZThceDA3XHgxMFx4ODBceDgwXHg4MFx4ODBceDAyXCJceDk0XHgwMlxuXHgwY1x4NDZpZWxkT3B0aW9uc1x4MTI6XG5ceDA1XHg2M3R5cGVceDE4XHgwMSBceDAxKFx4MGVceDMyIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlOlx4MDZTVFJJTkdceDEyXHgwZVxuXHgwNnBhY2tlZFx4MThceDAyIFx4MDEoXHgwOFx4MTJceDE5XG5cbmRlcHJlY2F0ZWRceDE4XHgwMyBceDAxKFx4MDg6XHgwNVx4NjZceDYxbHNlXHgxMlx4MWNcblx4MTRceDY1eHBlcmltZW50YWxfbWFwX2tleVx4MThcdCBceDAxKFx0XHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblwiL1xuXHgwNVx4NDNUeXBlXHgxMlxuXG5ceDA2U1RSSU5HXHgxMFx4MDBceDEyXHgwOFxuXHgwNFx4NDNPUkRceDEwXHgwMVx4MTJceDEwXG5ceDBjU1RSSU5HX1BJRUNFXHgxMFx4MDIqXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcIl1cblx4MGJceDQ1bnVtT3B0aW9uc1x4MTJceDQzXG5ceDE0dW5pbnRlcnByZXRlZF9vcHRpb25ceDE4XHhlN1x4MDcgXHgwMyhceDBiXHgzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24qXHRceDA4XHhlOFx4MDdceDEwXHg4MFx4ODBceDgwXHg4MFx4MDJcImJcblx4MTBceDQ1bnVtVmFsdWVPcHRpb25zXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwiYFxuXHgwZVNlcnZpY2VPcHRpb25zXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwiX1xuXHJNZXRob2RPcHRpb25zXHgxMlx4NDNcblx4MTR1bmludGVycHJldGVkX29wdGlvblx4MThceGU3XHgwNyBceDAzKFx4MGJceDMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFx4MDhceGU4XHgwN1x4MTBceDgwXHg4MFx4ODBceDgwXHgwMlwiXHg4NVx4MDJcblx4MTNVbmludGVycHJldGVkT3B0aW9uXHgxMjtcblx4MDRuYW1lXHgxOFx4MDIgXHgwMyhceDBiXHgzMi0uZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnRceDEyXHgxOFxuXHgxMGlkZW50aWZpZXJfdmFsdWVceDE4XHgwMyBceDAxKFx0XHgxMlx4MWFcblx4MTJwb3NpdGl2ZV9pbnRfdmFsdWVceDE4XHgwNCBceDAxKFx4MDRceDEyXHgxYVxuXHgxMm5lZ2F0aXZlX2ludF92YWx1ZVx4MThceDA1IFx4MDEoXHgwM1x4MTJceDE0XG5ceDBjXHg2NG91YmxlX3ZhbHVlXHgxOFx4MDYgXHgwMShceDAxXHgxMlx4MTRcblx4MGNzdHJpbmdfdmFsdWVceDE4XHgwNyBceDAxKFx4MGNceDFhXHgzM1xuXHgwOE5hbWVQYXJ0XHgxMlx4MTFcblx0bmFtZV9wYXJ0XHgxOFx4MDEgXHgwMihcdFx4MTJceDE0XG5ceDBjaXNfZXh0ZW5zaW9uXHgxOFx4MDIgXHgwMihceDA4XHg0Milcblx4MTNceDYzb20uZ29vZ2xlLnByb3RvYnVmQlx4MTBceDQ0XHg2NXNjcmlwdG9yUHJvdG9zSFx4MDEnKQotCi0KLQotX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEUgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdUeXBlJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZScsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgdmFsdWVzPVsKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0RPVUJMRScsIGluZGV4PTAsIG51bWJlcj0xLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0ZMT0FUJywgaW5kZXg9MSwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfSU5UNjQnLCBpbmRleD0yLCBudW1iZXI9MywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9VSU5UNjQnLCBpbmRleD0zLCBudW1iZXI9NCwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9JTlQzMicsIGluZGV4PTQsIG51bWJlcj01LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0ZJWEVENjQnLCBpbmRleD01LCBudW1iZXI9NiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9GSVhFRDMyJywgaW5kZXg9NiwgbnVtYmVyPTcsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfQk9PTCcsIGluZGV4PTcsIG51bWJlcj04LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX1NUUklORycsIGluZGV4PTgsIG51bWJlcj05LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0dST1VQJywgaW5kZXg9OSwgbnVtYmVyPTEwLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX01FU1NBR0UnLCBpbmRleD0xMCwgbnVtYmVyPTExLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0JZVEVTJywgaW5kZXg9MTEsIG51bWJlcj0xMiwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9VSU5UMzInLCBpbmRleD0xMiwgbnVtYmVyPTEzLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX0VOVU0nLCBpbmRleD0xMywgbnVtYmVyPTE0LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdUWVBFX1NGSVhFRDMyJywgaW5kZXg9MTQsIG51bWJlcj0xNSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9TRklYRUQ2NCcsIGluZGV4PTE1LCBudW1iZXI9MTYsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J1RZUEVfU0lOVDMyJywgaW5kZXg9MTYsIG51bWJlcj0xNywKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nVFlQRV9TSU5UNjQnLCBpbmRleD0xNywgbnVtYmVyPTE4LAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0xMTg3LAotICBzZXJpYWxpemVkX2VuZD0xNDk3LAotKQotCi1fRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUwgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdMYWJlbCcsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICB2YWx1ZXM9WwotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0xBQkVMX09QVElPTkFMJywgaW5kZXg9MCwgbnVtYmVyPTEsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0xBQkVMX1JFUVVJUkVEJywgaW5kZXg9MSwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0xBQkVMX1JFUEVBVEVEJywgaW5kZXg9MiwgbnVtYmVyPTMsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICBdLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgb3B0aW9ucz1Ob25lLAotICBzZXJpYWxpemVkX3N0YXJ0PTE0OTksCi0gIHNlcmlhbGl6ZWRfZW5kPTE1NjYsCi0pCi0KLV9GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUgPSBkZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKAotICBuYW1lPSdPcHRpbWl6ZU1vZGUnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nU1BFRUQnLCBpbmRleD0wLCBudW1iZXI9MSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nQ09ERV9TSVpFJywgaW5kZXg9MSwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0xJVEVfUlVOVElNRScsIGluZGV4PTIsIG51bWJlcj0zLAotICAgICAgb3B0aW9ucz1Ob25lLAotICAgICAgdHlwZT1Ob25lKSwKLSAgXSwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIG9wdGlvbnM9Tm9uZSwKLSAgc2VyaWFsaXplZF9zdGFydD0yNDQ5LAotICBzZXJpYWxpemVkX2VuZD0yNTA3LAotKQotCi1fRklFTERPUFRJT05TX0NUWVBFID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcigKLSAgbmFtZT0nQ1R5cGUnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIHZhbHVlcz1bCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nU1RSSU5HJywgaW5kZXg9MCwgbnVtYmVyPTAsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J0NPUkQnLCBpbmRleD0xLCBudW1iZXI9MSwKLSAgICAgIG9wdGlvbnM9Tm9uZSwKLSAgICAgIHR5cGU9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKAotICAgICAgbmFtZT0nU1RSSU5HX1BJRUNFJywgaW5kZXg9MiwgbnVtYmVyPTIsCi0gICAgICBvcHRpb25zPU5vbmUsCi0gICAgICB0eXBlPU5vbmUpLAotICBdLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgb3B0aW9ucz1Ob25lLAotICBzZXJpYWxpemVkX3N0YXJ0PTI5MjYsCi0gIHNlcmlhbGl6ZWRfZW5kPTI5NzMsCi0pCi0KLQotX0ZJTEVERVNDUklQVE9SU0VUID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdGaWxlRGVzY3JpcHRvclNldCcsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0JywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2ZpbGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTUzLAotICBzZXJpYWxpemVkX2VuZD0xMjQsCi0pCi0KLQotX0ZJTEVERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0ZpbGVEZXNjcmlwdG9yUHJvdG8nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ncGFja2FnZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZScsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdkZXBlbmRlbmN5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5JywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J21lc3NhZ2VfdHlwZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlJywgaW5kZXg9MywKLSAgICAgIG51bWJlcj00LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZW51bV90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUnLCBpbmRleD00LAotICAgICAgbnVtYmVyPTUsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdzZXJ2aWNlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlJywgaW5kZXg9NSwKLSAgICAgIG51bWJlcj02LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZXh0ZW5zaW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24nLCBpbmRleD02LAotICAgICAgbnVtYmVyPTcsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9NywKLSAgICAgIG51bWJlcj04LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTI3LAotICBzZXJpYWxpemVkX2VuZD00NzUsCi0pCi0KLQotX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05SQU5HRSA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRXh0ZW5zaW9uUmFuZ2UnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nc3RhcnQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2Uuc3RhcnQnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9NSwgY3BwX3R5cGU9MSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdlbmQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UuZW5kJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTg1OSwKLSAgc2VyaWFsaXplZF9lbmQ9OTAzLAotKQotCi1fREVTQ1JJUFRPUlBST1RPID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdEZXNjcmlwdG9yUHJvdG8nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8nLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2ZpZWxkJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZXh0ZW5zaW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbicsIGluZGV4PTIsCi0gICAgICBudW1iZXI9NiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25lc3RlZF90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5lc3RlZF90eXBlJywgaW5kZXg9MywKLSAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZW51bV90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZScsIGluZGV4PTQsCi0gICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2V4dGVuc2lvbl9yYW5nZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UnLCBpbmRleD01LAotICAgICAgbnVtYmVyPTUsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD02LAotICAgICAgbnVtYmVyPTcsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bX0RFU0NSSVBUT1JQUk9UT19FWFRFTlNJT05SQU5HRSwgXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD00NzgsCi0gIHNlcmlhbGl6ZWRfZW5kPTkwMywKLSkKLQotCi1fRklFTERERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0ZpZWxkRGVzY3JpcHRvclByb3RvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8nLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbnVtYmVyJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubnVtYmVyJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbGFiZWwnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5sYWJlbCcsIGluZGV4PTIsCi0gICAgICBudW1iZXI9NCwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTEsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd0eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZScsIGluZGV4PTMsCi0gICAgICBudW1iZXI9NSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTEsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd0eXBlX25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUnLCBpbmRleD00LAotICAgICAgbnVtYmVyPTYsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nZXh0ZW5kZWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZScsIGluZGV4PTUsCi0gICAgICBudW1iZXI9MiwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdkZWZhdWx0X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZScsIGluZGV4PTYsCi0gICAgICBudW1iZXI9NywgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdvcHRpb25zJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTcsCi0gICAgICBudW1iZXI9OCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgICBfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRSwKLSAgICBfRklFTERERVNDUklQVE9SUFJPVE9fTEFCRUwsCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD05MDYsCi0gIHNlcmlhbGl6ZWRfZW5kPTE1NjYsCi0pCi0KLQotX0VOVU1ERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J0VudW1EZXNjcmlwdG9yUHJvdG8nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTIsCi0gICAgICBudW1iZXI9MywgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTE1NjksCi0gIHNlcmlhbGl6ZWRfZW5kPTE3MDksCi0pCi0KLQotX0VOVU1WQUxVRURFU0NSSVBUT1JQUk9UTyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdudW1iZXInLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTUsIGNwcF90eXBlPTEsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nb3B0aW9ucycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPU5vbmUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MTcxMSwKLSAgc2VyaWFsaXplZF9lbmQ9MTgxOSwKLSkKLQotCi1fU0VSVklDRURFU0NSSVBUT1JQUk9UTyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nU2VydmljZURlc2NyaXB0b3JQcm90bycsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8nLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdtZXRob2QnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCcsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTMsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1bXSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMnLCBpbmRleD0yLAotICAgICAgbnVtYmVyPTMsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9Tm9uZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgXSwKLSAgZXh0ZW5zaW9ucz1bCi0gIF0sCi0gIG5lc3RlZF90eXBlcz1bXSwKLSAgZW51bV90eXBlcz1bCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1GYWxzZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bXSwKLSAgc2VyaWFsaXplZF9zdGFydD0xODIyLAotICBzZXJpYWxpemVkX2VuZD0xOTY2LAotKQotCi0KLV9NRVRIT0RERVNDUklQVE9SUFJPVE8gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J01ldGhvZERlc2NyaXB0b3JQcm90bycsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSduYW1lJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9OSwgY3BwX3R5cGU9OSwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPXVuaWNvZGUoIiIsICJ1dGYtOCIpLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0naW5wdXRfdHlwZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J291dHB1dF90eXBlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J29wdGlvbnMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucycsIGluZGV4PTMsCi0gICAgICBudW1iZXI9NCwgdHlwZT0xMSwgY3BwX3R5cGU9MTAsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1Ob25lLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTE5NjgsCi0gIHNlcmlhbGl6ZWRfZW5kPTIwOTUsCi0pCi0KLQotX0ZJTEVPUFRJT05TID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdGaWxlT3B0aW9ucycsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2phdmFfcGFja2FnZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZScsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdqYXZhX291dGVyX2NsYXNzbmFtZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj04LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2phdmFfbXVsdGlwbGVfZmlsZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX211bHRpcGxlX2ZpbGVzJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj0xMCwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J29wdGltaXplX2ZvcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9wdGltaXplX2ZvcicsIGluZGV4PTMsCi0gICAgICBudW1iZXI9OSwgdHlwZT0xNCwgY3BwX3R5cGU9OCwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9MSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2NjX2dlbmVyaWNfc2VydmljZXMnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj0xNiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1UcnVlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0namF2YV9nZW5lcmljX3NlcnZpY2VzJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzJywgaW5kZXg9NSwKLSAgICAgIG51bWJlcj0xNywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1UcnVlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ncHlfZ2VuZXJpY19zZXJ2aWNlcycsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnB5X2dlbmVyaWNfc2VydmljZXMnLCBpbmRleD02LAotICAgICAgbnVtYmVyPTE4LCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPVRydWUsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9NywKLSAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICAgIF9GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUsCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1UcnVlLAotICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKLSAgc2VyaWFsaXplZF9zdGFydD0yMDk4LAotICBzZXJpYWxpemVkX2VuZD0yNTE4LAotKQotCi0KLV9NRVNTQUdFT1BUSU9OUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nTWVzc2FnZU9wdGlvbnMnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCcsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0JywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj0xLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPUZhbHNlLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3InLCBpbmRleD0xLAotICAgICAgbnVtYmVyPTIsIHR5cGU9OCwgY3BwX3R5cGU9NywgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9VHJ1ZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MjUyMSwKLSAgc2VyaWFsaXplZF9lbmQ9MjcwNSwKLSkKLQotCi1fRklFTERPUFRJT05TID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICBuYW1lPSdGaWVsZE9wdGlvbnMnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nY3R5cGUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTEsIHR5cGU9MTQsIGNwcF90eXBlPTgsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1UcnVlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdwYWNrZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0yLCB0eXBlPTgsIGNwcF90eXBlPTcsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2RlcHJlY2F0ZWQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuZGVwcmVjYXRlZCcsIGluZGV4PTIsCi0gICAgICBudW1iZXI9MywgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9VHJ1ZSwgZGVmYXVsdF92YWx1ZT1GYWxzZSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J2V4cGVyaW1lbnRhbF9tYXBfa2V5JywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmV4cGVyaW1lbnRhbF9tYXBfa2V5JywgaW5kZXg9MywKLSAgICAgIG51bWJlcj05LCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9NCwKLSAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICAgIF9GSUVMRE9QVElPTlNfQ1RZUEUsCi0gIF0sCi0gIG9wdGlvbnM9Tm9uZSwKLSAgaXNfZXh0ZW5kYWJsZT1UcnVlLAotICBleHRlbnNpb25fcmFuZ2VzPVsoMTAwMCwgNTM2ODcwOTEyKSwgXSwKLSAgc2VyaWFsaXplZF9zdGFydD0yNzA4LAotICBzZXJpYWxpemVkX2VuZD0yOTg0LAotKQotCi0KLV9FTlVNT1BUSU9OUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRW51bU9wdGlvbnMnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucycsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSd1bmludGVycHJldGVkX29wdGlvbicsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9VHJ1ZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9Mjk4NiwKLSAgc2VyaWFsaXplZF9lbmQ9MzA3OSwKLSkKLQotCi1fRU5VTVZBTFVFT1BUSU9OUyA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgbmFtZT0nRW51bVZhbHVlT3B0aW9ucycsCi0gIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uJywgaW5kZXg9MCwKLSAgICAgIG51bWJlcj05OTksIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9VHJ1ZSwKLSAgZXh0ZW5zaW9uX3Jhbmdlcz1bKDEwMDAsIDUzNjg3MDkxMiksIF0sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MzA4MSwKLSAgc2VyaWFsaXplZF9lbmQ9MzE3OSwKLSkKLQotCi1fU0VSVklDRU9QVElPTlMgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1NlcnZpY2VPcHRpb25zJywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMnLAotICBmaWxlbmFtZT1Ob25lLAotICBmaWxlPURFU0NSSVBUT1IsCi0gIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICBmaWVsZHM9WwotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0ndW5pbnRlcnByZXRlZF9vcHRpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTAsCi0gICAgICBudW1iZXI9OTk5LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPVRydWUsCi0gIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTMxODEsCi0gIHNlcmlhbGl6ZWRfZW5kPTMyNzcsCi0pCi0KLQotX01FVEhPRE9QVElPTlMgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J01ldGhvZE9wdGlvbnMnLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3VuaW50ZXJwcmV0ZWRfb3B0aW9uJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbicsIGluZGV4PTAsCi0gICAgICBudW1iZXI9OTk5LCB0eXBlPTExLCBjcHBfdHlwZT0xMCwgbGFiZWw9MywKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPVtdLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICBdLAotICBleHRlbnNpb25zPVsKLSAgXSwKLSAgbmVzdGVkX3R5cGVzPVtdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPVRydWUsCi0gIGV4dGVuc2lvbl9yYW5nZXM9WygxMDAwLCA1MzY4NzA5MTIpLCBdLAotICBzZXJpYWxpemVkX3N0YXJ0PTMyNzksCi0gIHNlcmlhbGl6ZWRfZW5kPTMzNzQsCi0pCi0KLQotX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQgPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J05hbWVQYXJ0JywKLSAgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCcsCi0gIGZpbGVuYW1lPU5vbmUsCi0gIGZpbGU9REVTQ1JJUFRPUiwKLSAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gIGZpZWxkcz1bCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSduYW1lX3BhcnQnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCcsIGluZGV4PTAsCi0gICAgICBudW1iZXI9MSwgdHlwZT05LCBjcHBfdHlwZT05LCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9dW5pY29kZSgiIiwgInV0Zi04IiksCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdpc19leHRlbnNpb24nLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0LmlzX2V4dGVuc2lvbicsIGluZGV4PTEsCi0gICAgICBudW1iZXI9MiwgdHlwZT04LCBjcHBfdHlwZT03LCBsYWJlbD0yLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9RmFsc2UsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W10sCi0gIGVudW1fdHlwZXM9WwotICBdLAotICBvcHRpb25zPU5vbmUsCi0gIGlzX2V4dGVuZGFibGU9RmFsc2UsCi0gIGV4dGVuc2lvbl9yYW5nZXM9W10sCi0gIHNlcmlhbGl6ZWRfc3RhcnQ9MzU4NywKLSAgc2VyaWFsaXplZF9lbmQ9MzYzOCwKLSkKLQotX1VOSU5URVJQUkVURURPUFRJT04gPSBkZXNjcmlwdG9yLkRlc2NyaXB0b3IoCi0gIG5hbWU9J1VuaW50ZXJwcmV0ZWRPcHRpb24nLAotICBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uJywKLSAgZmlsZW5hbWU9Tm9uZSwKLSAgZmlsZT1ERVNDUklQVE9SLAotICBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgZmllbGRzPVsKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J25hbWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUnLCBpbmRleD0wLAotICAgICAgbnVtYmVyPTIsIHR5cGU9MTEsIGNwcF90eXBlPTEwLCBsYWJlbD0zLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9W10sCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdpZGVudGlmaWVyX3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlJywgaW5kZXg9MSwKLSAgICAgIG51bWJlcj0zLCB0eXBlPTksIGNwcF90eXBlPTksIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT11bmljb2RlKCIiLCAidXRmLTgiKSwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3Bvc2l0aXZlX2ludF92YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ucG9zaXRpdmVfaW50X3ZhbHVlJywgaW5kZXg9MiwKLSAgICAgIG51bWJlcj00LCB0eXBlPTQsIGNwcF90eXBlPTQsIGxhYmVsPTEsCi0gICAgICBoYXNfZGVmYXVsdF92YWx1ZT1GYWxzZSwgZGVmYXVsdF92YWx1ZT0wLAotICAgICAgbWVzc2FnZV90eXBlPU5vbmUsIGVudW1fdHlwZT1Ob25lLCBjb250YWluaW5nX3R5cGU9Tm9uZSwKLSAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICBvcHRpb25zPU5vbmUpLAotICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKAotICAgICAgbmFtZT0nbmVnYXRpdmVfaW50X3ZhbHVlJywgZnVsbF9uYW1lPSdnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uZWdhdGl2ZV9pbnRfdmFsdWUnLCBpbmRleD0zLAotICAgICAgbnVtYmVyPTUsIHR5cGU9MywgY3BwX3R5cGU9MiwgbGFiZWw9MSwKLSAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPUZhbHNlLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICBuYW1lPSdkb3VibGVfdmFsdWUnLCBmdWxsX25hbWU9J2dvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmRvdWJsZV92YWx1ZScsIGluZGV4PTQsCi0gICAgICBudW1iZXI9NiwgdHlwZT0xLCBjcHBfdHlwZT01LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lLAotICAgICAgb3B0aW9ucz1Ob25lKSwKLSAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcigKLSAgICAgIG5hbWU9J3N0cmluZ192YWx1ZScsIGZ1bGxfbmFtZT0nZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlJywgaW5kZXg9NSwKLSAgICAgIG51bWJlcj03LCB0eXBlPTEyLCBjcHBfdHlwZT05LCBsYWJlbD0xLAotICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9IiIsCi0gICAgICBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLAotICAgICAgaXNfZXh0ZW5zaW9uPUZhbHNlLCBleHRlbnNpb25fc2NvcGU9Tm9uZSwKLSAgICAgIG9wdGlvbnM9Tm9uZSksCi0gIF0sCi0gIGV4dGVuc2lvbnM9WwotICBdLAotICBuZXN0ZWRfdHlwZXM9W19VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJULCBdLAotICBlbnVtX3R5cGVzPVsKLSAgXSwKLSAgb3B0aW9ucz1Ob25lLAotICBpc19leHRlbmRhYmxlPUZhbHNlLAotICBleHRlbnNpb25fcmFuZ2VzPVtdLAotICBzZXJpYWxpemVkX3N0YXJ0PTMzNzcsCi0gIHNlcmlhbGl6ZWRfZW5kPTM2MzgsCi0pCi0KLQotX0ZJTEVERVNDUklQVE9SU0VULmZpZWxkc19ieV9uYW1lWydmaWxlJ10ubWVzc2FnZV90eXBlID0gX0ZJTEVERVNDUklQVE9SUFJPVE8KLV9GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydtZXNzYWdlX3R5cGUnXS5tZXNzYWdlX3R5cGUgPSBfREVTQ1JJUFRPUlBST1RPCi1fRklMRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZW51bV90eXBlJ10ubWVzc2FnZV90eXBlID0gX0VOVU1ERVNDUklQVE9SUFJPVE8KLV9GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydzZXJ2aWNlJ10ubWVzc2FnZV90eXBlID0gX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8KLV9GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydleHRlbnNpb24nXS5tZXNzYWdlX3R5cGUgPSBfRklFTERERVNDUklQVE9SUFJPVE8KLV9GSUxFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0ZJTEVPUFRJT05TCi1fREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFLmNvbnRhaW5pbmdfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE87Ci1fREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydmaWVsZCddLm1lc3NhZ2VfdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTwotX0RFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnZXh0ZW5zaW9uJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPCi1fREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWyduZXN0ZWRfdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9ERVNDUklQVE9SUFJPVE8KLV9ERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2VudW1fdHlwZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCi1fREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydleHRlbnNpb25fcmFuZ2UnXS5tZXNzYWdlX3R5cGUgPSBfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFCi1fREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX01FU1NBR0VPUFRJT05TCi1fRklFTERERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ2xhYmVsJ10uZW51bV90eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMCi1fRklFTERERVNDUklQVE9SUFJPVE8uZmllbGRzX2J5X25hbWVbJ3R5cGUnXS5lbnVtX3R5cGUgPSBfRklFTERERVNDUklQVE9SUFJPVE9fVFlQRQotX0ZJRUxEREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0ZJRUxET1BUSU9OUwotX0ZJRUxEREVTQ1JJUFRPUlBST1RPX1RZUEUuY29udGFpbmluZ190eXBlID0gX0ZJRUxEREVTQ1JJUFRPUlBST1RPOwotX0ZJRUxEREVTQ1JJUFRPUlBST1RPX0xBQkVMLmNvbnRhaW5pbmdfdHlwZSA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTzsKLV9FTlVNREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWyd2YWx1ZSddLm1lc3NhZ2VfdHlwZSA9IF9FTlVNVkFMVUVERVNDUklQVE9SUFJPVE8KLV9FTlVNREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0VOVU1PUFRJT05TCi1fRU5VTVZBTFVFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydvcHRpb25zJ10ubWVzc2FnZV90eXBlID0gX0VOVU1WQUxVRU9QVElPTlMKLV9TRVJWSUNFREVTQ1JJUFRPUlBST1RPLmZpZWxkc19ieV9uYW1lWydtZXRob2QnXS5tZXNzYWdlX3R5cGUgPSBfTUVUSE9EREVTQ1JJUFRPUlBST1RPCi1fU0VSVklDRURFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9TRVJWSUNFT1BUSU9OUwotX01FVEhPRERFU0NSSVBUT1JQUk9UTy5maWVsZHNfYnlfbmFtZVsnb3B0aW9ucyddLm1lc3NhZ2VfdHlwZSA9IF9NRVRIT0RPUFRJT05TCi1fRklMRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ29wdGltaXplX2ZvciddLmVudW1fdHlwZSA9IF9GSUxFT1BUSU9OU19PUFRJTUlaRU1PREUKLV9GSUxFT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgotX0ZJTEVPUFRJT05TX09QVElNSVpFTU9ERS5jb250YWluaW5nX3R5cGUgPSBfRklMRU9QVElPTlM7Ci1fTUVTU0FHRU9QVElPTlMuZmllbGRzX2J5X25hbWVbJ3VuaW50ZXJwcmV0ZWRfb3B0aW9uJ10ubWVzc2FnZV90eXBlID0gX1VOSU5URVJQUkVURURPUFRJT04KLV9GSUVMRE9QVElPTlMuZmllbGRzX2J5X25hbWVbJ2N0eXBlJ10uZW51bV90eXBlID0gX0ZJRUxET1BUSU9OU19DVFlQRQotX0ZJRUxET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgotX0ZJRUxET1BUSU9OU19DVFlQRS5jb250YWluaW5nX3R5cGUgPSBfRklFTERPUFRJT05TOwotX0VOVU1PUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCi1fRU5VTVZBTFVFT1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgotX1NFUlZJQ0VPUFRJT05TLmZpZWxkc19ieV9uYW1lWyd1bmludGVycHJldGVkX29wdGlvbiddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OCi1fTUVUSE9ET1BUSU9OUy5maWVsZHNfYnlfbmFtZVsndW5pbnRlcnByZXRlZF9vcHRpb24nXS5tZXNzYWdlX3R5cGUgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgotX1VOSU5URVJQUkVURURPUFRJT05fTkFNRVBBUlQuY29udGFpbmluZ190eXBlID0gX1VOSU5URVJQUkVURURPUFRJT047Ci1fVU5JTlRFUlBSRVRFRE9QVElPTi5maWVsZHNfYnlfbmFtZVsnbmFtZSddLm1lc3NhZ2VfdHlwZSA9IF9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJUCi0KLWNsYXNzIEZpbGVEZXNjcmlwdG9yU2V0KG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9GSUxFREVTQ1JJUFRPUlNFVAotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQotCi1jbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9GSUxFREVTQ1JJUFRPUlBST1RPCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKLQotY2xhc3MgRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgCi0gIGNsYXNzIEV4dGVuc2lvblJhbmdlKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gICAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICAgIERFU0NSSVBUT1IgPSBfREVTQ1JJUFRPUlBST1RPX0VYVEVOU0lPTlJBTkdFCi0gICAgCi0gICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKLSAgREVTQ1JJUFRPUiA9IF9ERVNDUklQVE9SUFJPVE8KLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCi0KLWNsYXNzIEZpZWxkRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9GSUVMRERFU0NSSVBUT1JQUk9UTwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQotCi1jbGFzcyBFbnVtRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9FTlVNREVTQ1JJUFRPUlBST1RPCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKLQotY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9FTlVNVkFMVUVERVNDUklQVE9SUFJPVE8KLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCi0KLWNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8obWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX1NFUlZJQ0VERVNDUklQVE9SUFJPVE8KLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQotCi1jbGFzcyBNZXRob2REZXNjcmlwdG9yUHJvdG8obWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX01FVEhPRERFU0NSSVBUT1JQUk9UTwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKLQotY2xhc3MgRmlsZU9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX0ZJTEVPUFRJT05TCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCi0KLWNsYXNzIE1lc3NhZ2VPcHRpb25zKG1lc3NhZ2UuTWVzc2FnZSk6Ci0gIF9fbWV0YWNsYXNzX18gPSByZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUKLSAgREVTQ1JJUFRPUiA9IF9NRVNTQUdFT1BUSU9OUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQotCi1jbGFzcyBGaWVsZE9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX0ZJRUxET1BUSU9OUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKLQotY2xhc3MgRW51bU9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX0VOVU1PUFRJT05TCi0gIAotICAjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCi0KLWNsYXNzIEVudW1WYWx1ZU9wdGlvbnMobWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICBERVNDUklQVE9SID0gX0VOVU1WQUxVRU9QVElPTlMKLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQotCi1jbGFzcyBTZXJ2aWNlT3B0aW9ucyhtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfU0VSVklDRU9QVElPTlMKLSAgCi0gICMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKLQotY2xhc3MgTWV0aG9kT3B0aW9ucyhtZXNzYWdlLk1lc3NhZ2UpOgotICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gIERFU0NSSVBUT1IgPSBfTUVUSE9ET1BUSU9OUwotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCi0KLWNsYXNzIFVuaW50ZXJwcmV0ZWRPcHRpb24obWVzc2FnZS5NZXNzYWdlKToKLSAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICAKLSAgY2xhc3MgTmFtZVBhcnQobWVzc2FnZS5NZXNzYWdlKToKLSAgICBfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gICAgREVTQ1JJUFRPUiA9IF9VTklOVEVSUFJFVEVET1BUSU9OX05BTUVQQVJUCi0gICAgCi0gICAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCi0gIERFU0NSSVBUT1IgPSBfVU5JTlRFUlBSRVRFRE9QVElPTgotICAKLSAgIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCi0KLSMgQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1vZHVsZV9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2RvY3Mvc3dpZnQvRGVzaWduRG9jLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2RvY3Mvc3dpZnQvRGVzaWduRG9jLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9kb2NzL3N3aWZ0L0Rlc2lnbkRvYy5tZApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2RvY3Mvc3dpZnQvRGVzaWduRG9jLm1kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9kb2NzL3RoaXJkX3BhcnR5Lm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2RvY3MvdGhpcmRfcGFydHkubWQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2RvY3MvdGhpcmRfcGFydHkubWQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9kb2NzL3RoaXJkX3BhcnR5Lm1kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9lZGl0b3JzL1JFQURNRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZWRpdG9ycy9SRUFETUUudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9lZGl0b3JzL1JFQURNRS50eHQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9lZGl0b3JzL1JFQURNRS50eHQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2VkaXRvcnMvcHJvdG8udmltIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2VkaXRvcnMvcHJvdG8udmltCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9lZGl0b3JzL3Byb3RvLnZpbQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2VkaXRvcnMvcHJvdG8udmltCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9lZGl0b3JzL3Byb3RvYnVmLW1vZGUuZWwgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZWRpdG9ycy9wcm90b2J1Zi1tb2RlLmVsCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9lZGl0b3JzL3Byb3RvYnVmLW1vZGUuZWwKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9lZGl0b3JzL3Byb3RvYnVmLW1vZGUuZWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL0FkZFBlcnNvbi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL0FkZFBlcnNvbi5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9leGFtcGxlcy9BZGRQZXJzb24uamF2YQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL0FkZFBlcnNvbi5qYXZhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9leGFtcGxlcy9MaXN0UGVvcGxlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvTGlzdFBlb3BsZS5qYXZhCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9leGFtcGxlcy9MaXN0UGVvcGxlLmphdmEKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9leGFtcGxlcy9MaXN0UGVvcGxlLmphdmEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL1JFQURNRS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvUkVBRE1FLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvUkVBRE1FLnR4dApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL1JFQURNRS50eHQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2FkZF9wZXJzb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvYWRkX3BlcnNvbi5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvYWRkX3BlcnNvbi5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL2FkZF9wZXJzb24uY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2FkZF9wZXJzb24uZ28gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvYWRkX3BlcnNvbi5nbwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvYWRkX3BlcnNvbi5nbwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL2FkZF9wZXJzb24uZ28KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2FkZF9wZXJzb24ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvYWRkX3BlcnNvbi5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvYWRkX3BlcnNvbi5weQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL2FkZF9wZXJzb24ucHkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2FkZF9wZXJzb25fdGVzdC5nbyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9leGFtcGxlcy9hZGRfcGVyc29uX3Rlc3QuZ28Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2FkZF9wZXJzb25fdGVzdC5nbwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL2FkZF9wZXJzb25fdGVzdC5nbwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvYWRkcmVzc2Jvb2sucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvYWRkcmVzc2Jvb2sucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2FkZHJlc3Nib29rLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvYWRkcmVzc2Jvb2sucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2xpc3RfcGVvcGxlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL2xpc3RfcGVvcGxlLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9leGFtcGxlcy9saXN0X3Blb3BsZS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL2xpc3RfcGVvcGxlLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9leGFtcGxlcy9saXN0X3Blb3BsZS5nbyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9leGFtcGxlcy9saXN0X3Blb3BsZS5nbwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvbGlzdF9wZW9wbGUuZ28KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9leGFtcGxlcy9saXN0X3Blb3BsZS5nbwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvbGlzdF9wZW9wbGUucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvbGlzdF9wZW9wbGUucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2xpc3RfcGVvcGxlLnB5CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvbGlzdF9wZW9wbGUucHkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2V4YW1wbGVzL2xpc3RfcGVvcGxlX3Rlc3QuZ28gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZXhhbXBsZXMvbGlzdF9wZW9wbGVfdGVzdC5nbwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZXhhbXBsZXMvbGlzdF9wZW9wbGVfdGVzdC5nbwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2V4YW1wbGVzL2xpc3RfcGVvcGxlX3Rlc3QuZ28KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2dlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvZ2VuZXJhdGVfZGVzY3JpcHRvcl9wcm90by5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvZ2VuZXJhdGVfZGVzY3JpcHRvcl9wcm90by5zaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2dlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2dtb2NrLkJVSUxEIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2dtb2NrLkJVSUxECnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9nbW9jay5CVUlMRApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2dtb2NrLkJVSUxECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9SRUFETUUudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvUkVBRE1FLnR4dApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggM2VkMDZhMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9SRUFETUUudHh0CisrKyAvZGV2L251bGwKQEAgLTEsOTYgKzAsMCBAQAotUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci1Db3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLgotCi1UaGlzIGRpcmVjdG9yeSBjb250YWlucyB0aGUgSmF2YSBQcm90b2NvbCBCdWZmZXJzIHJ1bnRpbWUgbGlicmFyeS4KLQotSW5zdGFsbGF0aW9uIC0gV2l0aCBNYXZlbgotPT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgUHJvdG9jb2wgQnVmZmVycyBidWlsZCBpcyBtYW5hZ2VkIHVzaW5nIE1hdmVuLiAgSWYgeW91IHdvdWxkCi1yYXRoZXIgYnVpbGQgd2l0aG91dCBNYXZlbiwgc2VlIGJlbG93LgotCi0xKSBJbnN0YWxsIEFwYWNoZSBNYXZlbiBpZiB5b3UgZG9uJ3QgaGF2ZSBpdDoKLQotICAgICBodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy8KLQotMikgQnVpbGQgdGhlIEMrKyBjb2RlLCBvciBvYnRhaW4gYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHByb3RvYy4gIElmCi0gICB5b3UgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24sIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRoZSBzYW1lCi0gICB2ZXJzaW9uIGFzIHRoaXMgcGFja2FnZS4gIElmIGluIGRvdWJ0LCBydW46Ci0KLSAgICAgJCBwcm90b2MgLS12ZXJzaW9uCi0KLSAgIFlvdSB3aWxsIG5lZWQgdG8gcGxhY2UgdGhlIHByb3RvYyBleGVjdXRhYmxlIGluIC4uL3NyYy4gIChJZiB5b3UKLSAgIGJ1aWx0IGl0IHlvdXJzZWxmLCBpdCBzaG91bGQgYWxyZWFkeSBiZSB0aGVyZS4pCi0KLTMpIFJ1biB0aGUgdGVzdHM6Ci0KLSAgICAgJCBtdm4gdGVzdAotCi0gICBJZiBzb21lIHRlc3RzIGZhaWwsIHRoaXMgbGlicmFyeSBtYXkgbm90IHdvcmsgY29ycmVjdGx5IG9uIHlvdXIKLSAgIHN5c3RlbS4gIENvbnRpbnVlIGF0IHlvdXIgb3duIHJpc2suCi0KLTQpIEluc3RhbGwgdGhlIGxpYnJhcnkgaW50byB5b3VyIE1hdmVuIHJlcG9zaXRvcnk6Ci0KLSAgICAgJCBtdm4gaW5zdGFsbAotCi01KSBJZiB5b3UgZG8gbm90IHVzZSBNYXZlbiB0byBtYW5hZ2UgeW91ciBvd24gYnVpbGQsIHlvdSBjYW4gYnVpbGQgYQotICAgLmphciBmaWxlIHRvIHVzZToKLQotICAgICAkIG12biBwYWNrYWdlCi0KLSAgIFRoZSAuamFyIHdpbGwgYmUgcGxhY2VkIGluIHRoZSAidGFyZ2V0IiBkaXJlY3RvcnkuCi0KLUluc3RhbGxhdGlvbiAtICdMaXRlJyBWZXJzaW9uIC0gV2l0aCBNYXZlbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLUJ1aWxkaW5nIHRoZSAnbGl0ZScgdmVyc2lvbiBvZiB0aGUgSmF2YSBQcm90b2NvbCBCdWZmZXJzIGxpYnJhcnkgaXMKLXRoZSBzYW1lIGFzIGJ1aWxkaW5nIHRoZSBmdWxsIHZlcnNpb24sIGV4Y2VwdCB0aGF0IGFsbCBjb21tYW5kcyBhcmUKLXJ1biB1c2luZyB0aGUgJ2xpdGUnIHByb2ZpbGUuICAoc2VlCi1odHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9ndWlkZXMvaW50cm9kdWN0aW9uL2ludHJvZHVjdGlvbi10by1wcm9maWxlcy5odG1sKQotCi1FLmcuIHRvIGluc3RhbGwgdGhlIGxpdGUgdmVyc2lvbiBvZiB0aGUgamFyLCB5b3Ugd291bGQgcnVuOgotCi0gICQgbXZuIGluc3RhbGwgLVAgbGl0ZQotCi1UaGUgcmVzdWx0aW5nIGFydGlmYWN0IGhhcyB0aGUgJ2xpdGUnIGNsYXNzaWZpZXIuICBUbyByZWZlcmVuY2UgaXQKLWZvciBkZXBlbmRlbmN5IHJlc29sdXRpb24sIHlvdSB3b3VsZCBzcGVjaWZ5IGl0IGFzOgotCi0gIDxkZXBlbmRlbmN5PgotICAgIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWY8L2dyb3VwSWQ+Ci0gICAgPGFydGlmYWN0SWQ+cHJvdG9idWYtamF2YTwvYXJ0aWZhY3RJZD4KLSAgICA8dmVyc2lvbj4ke3ZlcnNpb259PC92ZXJzaW9uPgotICAgIDxjbGFzc2lmaWVyPmxpdGU8L2NsYXNzaWZpZXI+Ci0gIDwvZGVwZW5kZW5jeT4KLQotSW5zdGFsbGF0aW9uIC0gV2l0aG91dCBNYXZlbgotPT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1JZiB5b3Ugd291bGQgcmF0aGVyIG5vdCBpbnN0YWxsIE1hdmVuIHRvIGJ1aWxkIHRoZSBsaWJyYXJ5LCB5b3UgbWF5Ci1mb2xsb3cgdGhlc2UgaW5zdHJ1Y3Rpb25zIGluc3RlYWQuICBOb3RlIHRoYXQgdGhlc2UgaW5zdHJ1Y3Rpb25zIHNraXAKLXJ1bm5pbmcgdW5pdCB0ZXN0cy4KLQotMSkgQnVpbGQgdGhlIEMrKyBjb2RlLCBvciBvYnRhaW4gYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHByb3RvYy4gIElmCi0gICB5b3UgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24sIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRoZSBzYW1lCi0gICB2ZXJzaW9uIGFzIHRoaXMgcGFja2FnZS4gIElmIGluIGRvdWJ0LCBydW46Ci0KLSAgICAgJCBwcm90b2MgLS12ZXJzaW9uCi0KLSAgIElmIHlvdSBidWlsdCB0aGUgQysrIGNvZGUgd2l0aG91dCBpbnN0YWxsaW5nLCB0aGUgY29tcGlsZXIgYmluYXJ5Ci0gICBzaG91bGQgYmUgbG9jYXRlZCBpbiAuLi9zcmMuCi0KLTIpIEludm9rZSBwcm90b2MgdG8gYnVpbGQgRGVzY3JpcHRvclByb3Rvcy5qYXZhOgotCi0gICAgICQgcHJvdG9jIC0tamF2YV9vdXQ9c3JjL21haW4vamF2YSAtSS4uL3NyYyBcCi0gICAgICAgICAuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KLQotMykgQ29tcGlsZSB0aGUgY29kZSBpbiBzcmMvbWFpbi9qYXZhIHVzaW5nIHdoYXRldmVyIG1lYW5zIHlvdSBwcmVmZXIuCi0KLTQpIEluc3RhbGwgdGhlIGNsYXNzZXMgd2hlcmV2ZXIgeW91IHByZWZlci4KLQotVXNhZ2UKLT09PT09Ci0KLVRoZSBjb21wbGV0ZSBkb2N1bWVudGF0aW9uIGZvciBQcm90b2NvbCBCdWZmZXJzIGlzIGF2YWlsYWJsZSB2aWEgdGhlCi13ZWIgYXQ6Ci0KLSAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3BvbS54bWwgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9wb20ueG1sCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMjhkNmRiLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3BvbS54bWwKKysrIC9kZXYvbnVsbApAQCAtMSwxODYgKzAsMCBAQAotPD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiPz4KLTxwcm9qZWN0IHhtbG5zPSJodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjAiCi0gIHhtbG5zOnhzaT0iaHR0cDovL3d3dy53My5vcmcvMjAwMS9YTUxTY2hlbWEtaW5zdGFuY2UiCi0gIHhzaTpzY2hlbWFMb2NhdGlvbj0iaHR0cDovL21hdmVuLmFwYWNoZS5vcmcvUE9NLzQuMC4wIGh0dHA6Ly9tYXZlbi5hcGFjaGUub3JnL21hdmVuLXY0XzBfMC54c2QiPgotICA8bW9kZWxWZXJzaW9uPjQuMC4wPC9tb2RlbFZlcnNpb24+Ci0gIDxwYXJlbnQ+Ci0gICAgPGdyb3VwSWQ+Y29tLmdvb2dsZTwvZ3JvdXBJZD4KLSAgICA8YXJ0aWZhY3RJZD5nb29nbGU8L2FydGlmYWN0SWQ+Ci0gICAgPHZlcnNpb24+MTwvdmVyc2lvbj4KLSAgPC9wYXJlbnQ+Ci0gIDxncm91cElkPmNvbS5nb29nbGUucHJvdG9idWY8L2dyb3VwSWQ+Ci0gIDxhcnRpZmFjdElkPnByb3RvYnVmLWphdmE8L2FydGlmYWN0SWQ+Ci0gIDx2ZXJzaW9uPjIuNC4yLXByZTwvdmVyc2lvbj4KLSAgPHBhY2thZ2luZz5qYXI8L3BhY2thZ2luZz4KLSAgPG5hbWU+UHJvdG9jb2wgQnVmZmVyIEphdmEgQVBJPC9uYW1lPgotICA8ZGVzY3JpcHRpb24+Ci0gICAgUHJvdG9jb2wgQnVmZmVycyBhcmUgYSB3YXkgb2YgZW5jb2Rpbmcgc3RydWN0dXJlZCBkYXRhIGluIGFuIGVmZmljaWVudCB5ZXQKLSAgICBleHRlbnNpYmxlIGZvcm1hdC4KLSAgPC9kZXNjcmlwdGlvbj4KLSAgPGluY2VwdGlvblllYXI+MjAwODwvaW5jZXB0aW9uWWVhcj4KLSAgPHVybD5odHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWY8L3VybD4KLSAgPGxpY2Vuc2VzPgotICAgIDxsaWNlbnNlPgotICAgICAgPG5hbWU+TmV3IEJTRCBsaWNlbnNlPC9uYW1lPgotICAgICAgPHVybD5odHRwOi8vd3d3Lm9wZW5zb3VyY2Uub3JnL2xpY2Vuc2VzL2JzZC1saWNlbnNlLnBocDwvdXJsPgotICAgICAgPGRpc3RyaWJ1dGlvbj5yZXBvPC9kaXN0cmlidXRpb24+Ci0gICAgPC9saWNlbnNlPgotICA8L2xpY2Vuc2VzPgotICA8c2NtPgotICAgIDx1cmw+aHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmL3NvdXJjZS9icm93c2U8L3VybD4KLSAgICA8Y29ubmVjdGlvbj4KLSAgICAgIHNjbTpzdm46aHR0cDovL3Byb3RvYnVmLmdvb2dsZWNvZGUuY29tL3N2bi90cnVuay8KLSAgICA8L2Nvbm5lY3Rpb24+Ci0gIDwvc2NtPgotICA8ZGVwZW5kZW5jaWVzPgotICAgIDxkZXBlbmRlbmN5PgotICAgICAgPGdyb3VwSWQ+anVuaXQ8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5qdW5pdDwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjQuNDwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9jazwvYXJ0aWZhY3RJZD4KLSAgICAgIDx2ZXJzaW9uPjIuMjwvdmVyc2lvbj4KLSAgICAgIDxzY29wZT50ZXN0PC9zY29wZT4KLSAgICA8L2RlcGVuZGVuY3k+Ci0gICAgPGRlcGVuZGVuY3k+Ci0gICAgICA8Z3JvdXBJZD5vcmcuZWFzeW1vY2s8L2dyb3VwSWQ+Ci0gICAgICA8YXJ0aWZhY3RJZD5lYXN5bW9ja2NsYXNzZXh0ZW5zaW9uPC9hcnRpZmFjdElkPgotICAgICAgPHZlcnNpb24+Mi4yLjE8L3ZlcnNpb24+Ci0gICAgICA8c2NvcGU+dGVzdDwvc2NvcGU+Ci0gICAgPC9kZXBlbmRlbmN5PgotICA8L2RlcGVuZGVuY2llcz4KLSAgPGJ1aWxkPgotICAgIDxwbHVnaW5zPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tY29tcGlsZXItcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8c291cmNlPjEuNTwvc291cmNlPgotICAgICAgICAgIDx0YXJnZXQ+MS41PC90YXJnZXQ+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tc3VyZWZpcmUtcGx1Z2luPC9hcnRpZmFjdElkPgotICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICA8aW5jbHVkZT4qKi8qVGVzdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgIDwvcGx1Z2luPgotICAgICAgPHBsdWdpbj4KLSAgICAgICAgPGFydGlmYWN0SWQ+bWF2ZW4tYW50cnVuLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgPGV4ZWN1dGlvbnM+Ci0gICAgICAgICAgPGV4ZWN1dGlvbj4KLSAgICAgICAgICAgIDxpZD5nZW5lcmF0ZS1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS1zb3VyY2VzPC9waGFzZT4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8dGFza3M+Ci0gICAgICAgICAgICAgICAgPG1rZGlyIGRpcj0idGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzIiAvPgotICAgICAgICAgICAgICAgIDxleGVjIGV4ZWN1dGFibGU9Ii4uL3NyYy9wcm90b2MiPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1qYXZhX291dD10YXJnZXQvZ2VuZXJhdGVkLXNvdXJjZXMiIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9Li4vc3JjIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIiAvPgotICAgICAgICAgICAgICAgIDwvZXhlYz4KLSAgICAgICAgICAgICAgPC90YXNrcz4KLSAgICAgICAgICAgICAgPHNvdXJjZVJvb3Q+dGFyZ2V0L2dlbmVyYXRlZC1zb3VyY2VzPC9zb3VyY2VSb290PgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICAgIDxleGVjdXRpb24+Ci0gICAgICAgICAgICA8aWQ+Z2VuZXJhdGUtdGVzdC1zb3VyY2VzPC9pZD4KLSAgICAgICAgICAgIDxwaGFzZT5nZW5lcmF0ZS10ZXN0LXNvdXJjZXM8L3BoYXNlPgotICAgICAgICAgICAgPGNvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgICAgIDx0YXNrcz4KLSAgICAgICAgICAgICAgICA8bWtkaXIgZGlyPSJ0YXJnZXQvZ2VuZXJhdGVkLXRlc3Qtc291cmNlcyIgLz4KLSAgICAgICAgICAgICAgICA8ZXhlYyBleGVjdXRhYmxlPSIuLi9zcmMvcHJvdG9jIj4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii0tamF2YV9vdXQ9dGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXMiIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSItLXByb3RvX3BhdGg9Li4vc3JjIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLS1wcm90b19wYXRoPXNyYy90ZXN0L2phdmEiIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSJzcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbXVsdGlwbGVfZmlsZXNfdGVzdC5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfYnVpbGRlcnNfdGVzdC5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbi5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9InNyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0ic3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZwotICAgICAgICAgICAgICAgICAgICB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnCi0gICAgICAgICAgICAgICAgICAgIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvIiAvPgotICAgICAgICAgICAgICAgICAgPGFyZyB2YWx1ZT0iLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byIgLz4KLSAgICAgICAgICAgICAgICAgIDxhcmcgdmFsdWU9Ii4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgICA8YXJnIHZhbHVlPSIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8iIC8+Ci0gICAgICAgICAgICAgICAgPC9leGVjPgotICAgICAgICAgICAgICA8L3Rhc2tzPgotICAgICAgICAgICAgICA8dGVzdFNvdXJjZVJvb3Q+dGFyZ2V0L2dlbmVyYXRlZC10ZXN0LXNvdXJjZXM8L3Rlc3RTb3VyY2VSb290PgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgICAgPGdvYWxzPgotICAgICAgICAgICAgICA8Z29hbD5ydW48L2dvYWw+Ci0gICAgICAgICAgICA8L2dvYWxzPgotICAgICAgICAgIDwvZXhlY3V0aW9uPgotICAgICAgICA8L2V4ZWN1dGlvbnM+Ci0gICAgICA8L3BsdWdpbj4KLSAgICA8L3BsdWdpbnM+Ci0gIDwvYnVpbGQ+Ci0gIDxwcm9maWxlcz4KLSAgICA8cHJvZmlsZT4KLSAgICAgIDxpZD5saXRlPC9pZD4KLSAgICAgIDxidWlsZD4KLSAgICAgICAgPHBsdWdpbnM+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWNvbXBpbGVyLXBsdWdpbjwvYXJ0aWZhY3RJZD4KLSAgICAgICAgICAgIDxjb25maWd1cmF0aW9uPgotICAgICAgICAgICAgICA8aW5jbHVkZXM+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0J5dGVTdHJpbmcuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9Db2RlZElucHV0U3RyZWFtLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovQ29kZWRPdXRwdXRTdHJlYW0uamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9GaWVsZFNldC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0dlbmVyYXRlZE1lc3NhZ2VMaXRlLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovSW50ZXJuYWwuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovTGF6eVN0cmluZ0xpc3QuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9NZXNzYWdlTGl0ZS5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL01lc3NhZ2VMaXRlT3JCdWlsZGVyLmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovU21hbGxTb3J0ZWRNYXAuamF2YTwvaW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8aW5jbHVkZT4qKi9VbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbi5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL1VubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgICAgPGluY2x1ZGU+KiovV2lyZUZvcm1hdC5qYXZhPC9pbmNsdWRlPgotICAgICAgICAgICAgICA8L2luY2x1ZGVzPgotICAgICAgICAgICAgICA8dGVzdEluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDx0ZXN0SW5jbHVkZT4qKi9MaXRlVGVzdC5qYXZhPC90ZXN0SW5jbHVkZT4KLSAgICAgICAgICAgICAgICA8dGVzdEluY2x1ZGU+KiovKkxpdGUuamF2YTwvdGVzdEluY2x1ZGU+Ci0gICAgICAgICAgICAgIDwvdGVzdEluY2x1ZGVzPgotICAgICAgICAgICAgPC9jb25maWd1cmF0aW9uPgotICAgICAgICAgIDwvcGx1Z2luPgotICAgICAgICAgIDxwbHVnaW4+Ci0gICAgICAgICAgICA8YXJ0aWZhY3RJZD5tYXZlbi1zdXJlZmlyZS1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGluY2x1ZGVzPgotICAgICAgICAgICAgICAgIDxpbmNsdWRlPioqL0xpdGVUZXN0LmphdmE8L2luY2x1ZGU+Ci0gICAgICAgICAgICAgIDwvaW5jbHVkZXM+Ci0gICAgICAgICAgICA8L2NvbmZpZ3VyYXRpb24+Ci0gICAgICAgICAgPC9wbHVnaW4+Ci0gICAgICAgICAgPHBsdWdpbj4KLSAgICAgICAgICAgIDxhcnRpZmFjdElkPm1hdmVuLWphci1wbHVnaW48L2FydGlmYWN0SWQ+Ci0gICAgICAgICAgICA8Y29uZmlndXJhdGlvbj4KLSAgICAgICAgICAgICAgPGNsYXNzaWZpZXI+bGl0ZTwvY2xhc3NpZmllcj4KLSAgICAgICAgICAgIDwvY29uZmlndXJhdGlvbj4KLSAgICAgICAgICA8L3BsdWdpbj4KLSAgICAgICAgPC9wbHVnaW5zPgotICAgICAgPC9idWlsZD4KLSAgICA8L3Byb2ZpbGU+Ci0gIDwvcHJvZmlsZXM+Ci08L3Byb2plY3Q+CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGI5ZDgzMDEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzY0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNZXNzYWdlfSBpbnRlcmZhY2Ugd2hpY2ggaW1wbGVtZW50cwotICogYXMgbWFueSBtZXRob2RzIG9mIHRoYXQgaW50ZXJmYWNlIGFzIHBvc3NpYmxlIGluIHRlcm1zIG9mIG90aGVyIG1ldGhvZHMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEFic3RyYWN0TWVzc2FnZSBleHRlbmRzIEFic3RyYWN0TWVzc2FnZUxpdGUKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGVtZW50cyBNZXNzYWdlIHsKLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgotICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDogZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWVsZHMoKSkgewotICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSkgewotICAgICAgICBpZiAoIWhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIC8vIENoZWNrIHRoYXQgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgotICAgIGZvciAoZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgIGdldEFsbEZpZWxkcygpLmVudHJ5U2V0KCkpIHsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LmdldEtleSgpOwotICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgIGZvciAoZmluYWwgTWVzc2FnZSBlbGVtZW50IDogKExpc3Q8TWVzc2FnZT4pIGVudHJ5LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICAgIGlmICghZWxlbWVudC5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBpZiAoISgoTWVzc2FnZSkgZW50cnkuZ2V0VmFsdWUoKSkuaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGZpbmFsIFN0cmluZyB0b1N0cmluZygpIHsKLSAgICByZXR1cm4gVGV4dEZvcm1hdC5wcmludFRvU3RyaW5nKHRoaXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVUbyhmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgYm9vbGVhbiBpc01lc3NhZ2VTZXQgPQotICAgICAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpOwotCi0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgewotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKGlzTWVzc2FnZVNldCAmJiBmaWVsZC5pc0V4dGVuc2lvbigpICYmCi0gICAgICAgICAgZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgICAhZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGQuZ2V0TnVtYmVyKCksIChNZXNzYWdlKSB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBGaWVsZFNldC53cml0ZUZpZWxkKGZpZWxkLCB2YWx1ZSwgb3V0cHV0KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9IGdldFVua25vd25GaWVsZHMoKTsKLSAgICBpZiAoaXNNZXNzYWdlU2V0KSB7Ci0gICAgICB1bmtub3duRmllbGRzLndyaXRlQXNNZXNzYWdlU2V0VG8ob3V0cHV0KTsKLSAgICB9IGVsc2UgewotICAgICAgdW5rbm93bkZpZWxkcy53cml0ZVRvKG91dHB1dCk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTaXplID0gLTE7Ci0KLSAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICBpbnQgc2l6ZSA9IG1lbW9pemVkU2l6ZTsKLSAgICBpZiAoc2l6ZSAhPSAtMSkgewotICAgICAgcmV0dXJuIHNpemU7Ci0gICAgfQotCi0gICAgc2l6ZSA9IDA7Ci0gICAgZmluYWwgYm9vbGVhbiBpc01lc3NhZ2VTZXQgPQotICAgICAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpOwotCi0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgewotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgaWYgKGlzTWVzc2FnZVNldCAmJiBmaWVsZC5pc0V4dGVuc2lvbigpICYmCi0gICAgICAgICAgZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgICAhZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIHNpemUgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZU1lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAotICAgICAgICAgICAgZmllbGQuZ2V0TnVtYmVyKCksIChNZXNzYWdlKSB2YWx1ZSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBzaXplICs9IEZpZWxkU2V0LmNvbXB1dGVGaWVsZFNpemUoZmllbGQsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9IGdldFVua25vd25GaWVsZHMoKTsKLSAgICBpZiAoaXNNZXNzYWdlU2V0KSB7Ci0gICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTsKLSAgICB9IGVsc2UgewotICAgICAgc2l6ZSArPSB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgfQotCi0gICAgbWVtb2l6ZWRTaXplID0gc2l6ZTsKLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG90aGVyKSB7Ci0gICAgaWYgKG90aGVyID09IHRoaXMpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoIShvdGhlciBpbnN0YW5jZW9mIE1lc3NhZ2UpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIGZpbmFsIE1lc3NhZ2Ugb3RoZXJNZXNzYWdlID0gKE1lc3NhZ2UpIG90aGVyOwotICAgIGlmIChnZXREZXNjcmlwdG9yRm9yVHlwZSgpICE9IG90aGVyTWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotICAgIHJldHVybiBnZXRBbGxGaWVsZHMoKS5lcXVhbHMob3RoZXJNZXNzYWdlLmdldEFsbEZpZWxkcygpKSAmJgotICAgICAgICBnZXRVbmtub3duRmllbGRzKCkuZXF1YWxzKG90aGVyTWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IGhhc2ggPSA0MTsKLSAgICBoYXNoID0gKDE5ICogaGFzaCkgKyBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmhhc2hDb2RlKCk7Ci0gICAgaGFzaCA9IGhhc2hGaWVsZHMoaGFzaCwgZ2V0QWxsRmllbGRzKCkpOwotICAgIGhhc2ggPSAoMjkgKiBoYXNoKSArIGdldFVua25vd25GaWVsZHMoKS5oYXNoQ29kZSgpOwotICAgIHJldHVybiBoYXNoOwotICB9Ci0KLSAgLyoqIEdldCBhIGhhc2ggY29kZSBmb3IgZ2l2ZW4gZmllbGRzIGFuZCB2YWx1ZXMsIHVzaW5nIHRoZSBnaXZlbiBzZWVkLiAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJvdGVjdGVkIGludCBoYXNoRmllbGRzKGludCBoYXNoLCBNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IG1hcCkgewotICAgIGZvciAoTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBlbnRyeSA6IG1hcC5lbnRyeVNldCgpKSB7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIE9iamVjdCB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICBoYXNoID0gKDM3ICogaGFzaCkgKyBmaWVsZC5nZXROdW1iZXIoKTsKLSAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLlR5cGUuRU5VTSl7Ci0gICAgICAgIGhhc2ggPSAoNTMgKiBoYXNoKSArIHZhbHVlLmhhc2hDb2RlKCk7Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICBMaXN0PD8gZXh0ZW5kcyBFbnVtTGl0ZT4gbGlzdCA9IChMaXN0PD8gZXh0ZW5kcyBFbnVtTGl0ZT4pIHZhbHVlOwotICAgICAgICBoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoRW51bUxpc3QobGlzdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoRW51bSgoRW51bUxpdGUpIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGhhc2g7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBNZXNzYWdlI2hhc2hDb2RlKCl9LgotICAgKiBAc2VlIEJvb2xlYW4jaGFzaENvZGUoKQotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgaGFzaExvbmcobG9uZyBuKSB7Ci0gICAgcmV0dXJuIChpbnQpIChuIF4gKG4gPj4+IDMyKSk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBNZXNzYWdlI2hhc2hDb2RlKCl9LgotICAgKiBAc2VlIEJvb2xlYW4jaGFzaENvZGUoKQotICAgKi8KLSAgcHJvdGVjdGVkIHN0YXRpYyBpbnQgaGFzaEJvb2xlYW4oYm9vbGVhbiBiKSB7Ci0gICAgcmV0dXJuIGIgPyAxMjMxIDogMTIzNzsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgbWV0aG9kIGZvciBpbXBsZW1lbnRpbmcge0BsaW5rIE1lc3NhZ2UjaGFzaENvZGUoKX0uCi0gICAqIDxwPgotICAgKiBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHtAbGluayBqYXZhLmxhbmcuRW51bSNoYXNoQ29kZSgpfSBpcyBmaW5hbCwgYnV0IHdlCi0gICAqIG5lZWQgdG8gdXNlIHRoZSBmaWVsZCBudW1iZXIgYXMgdGhlIGhhc2ggY29kZSB0byBlbnN1cmUgY29tcGF0aWJpbGl0eQotICAgKiBiZXR3ZWVuIHN0YXRpY2FsbHkgYW5kIGR5bmFtaWNhbGx5IGdlbmVyYXRlZCBlbnVtIG9iamVjdHMuCi0gICAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGludCBoYXNoRW51bShFbnVtTGl0ZSBlKSB7Ci0gICAgcmV0dXJuIGUuZ2V0TnVtYmVyKCk7Ci0gIH0KLQotICAvKiogSGVscGVyIG1ldGhvZCBmb3IgaW1wbGVtZW50aW5nIHtAbGluayBNZXNzYWdlI2hhc2hDb2RlKCl9LiAqLwotICBwcm90ZWN0ZWQgc3RhdGljIGludCBoYXNoRW51bUxpc3QoTGlzdDw/IGV4dGVuZHMgRW51bUxpdGU+IGxpc3QpIHsKLSAgICBpbnQgaGFzaCA9IDE7Ci0gICAgZm9yIChFbnVtTGl0ZSBlIDogbGlzdCkgewotICAgICAgaGFzaCA9IDMxICogaGFzaCArIGhhc2hFbnVtKGUpOwotICAgIH0KLSAgICByZXR1cm4gaGFzaDsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqCi0gICAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0gaW50ZXJmYWNlIHdoaWNoCi0gICAqIGltcGxlbWVudHMgYXMgbWFueSBtZXRob2RzIG9mIHRoYXQgaW50ZXJmYWNlIGFzIHBvc3NpYmxlIGluIHRlcm1zIG9mCi0gICAqIG90aGVyIG1ldGhvZHMuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIHN0YXRpYyBhYnN0cmFjdCBjbGFzcyBCdWlsZGVyPEJ1aWxkZXJUeXBlIGV4dGVuZHMgQnVpbGRlcj4KLSAgICAgIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZS5CdWlsZGVyPEJ1aWxkZXJUeXBlPgotICAgICAgaW1wbGVtZW50cyBNZXNzYWdlLkJ1aWxkZXIgewotICAgIC8vIFRoZSBjb21waWxlciBwcm9kdWNlcyBhbiBlcnJvciBpZiB0aGlzIGlzIG5vdCBkZWNsYXJlZCBleHBsaWNpdGx5LgotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBhYnN0cmFjdCBCdWlsZGVyVHlwZSBjbG9uZSgpOwotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyKCkgewotICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICAgZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgewotICAgICAgICBjbGVhckZpZWxkKGVudHJ5LmdldEtleSgpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIm1lcmdlRnJvbShNZXNzYWdlKSBjYW4gb25seSBtZXJnZSBtZXNzYWdlcyBvZiB0aGUgc2FtZSB0eXBlLiIpOwotICAgICAgfQotCi0gICAgICAvLyBOb3RlOiAgV2UgZG9uJ3QgYXR0ZW1wdCB0byB2ZXJpZnkgdGhhdCBvdGhlcidzIGZpZWxkcyBoYXZlIHZhbGlkCi0gICAgICAvLyAgIHR5cGVzLiAgRG9pbmcgc28gd291bGQgYmUgYSBsb3NpbmcgYmF0dGxlLiAgV2UnZCBoYXZlIHRvIHZlcmlmeQotICAgICAgLy8gICBhbGwgc3ViLW1lc3NhZ2VzIGFzIHdlbGwsIGFuZCB3ZSdkIGhhdmUgdG8gbWFrZSBjb3BpZXMgb2YgYWxsIG9mCi0gICAgICAvLyAgIHRoZW0gdG8gaW5zdXJlIHRoYXQgdGhleSBkb24ndCBjaGFuZ2UgYWZ0ZXIgdmVyaWZpY2F0aW9uIChzaW5jZQotICAgICAgLy8gICB0aGUgTWVzc2FnZSBpbnRlcmZhY2UgaXRzZWxmIGNhbm5vdCBlbmZvcmNlIGltbXV0YWJpbGl0eSBvZgotICAgICAgLy8gICBpbXBsZW1lbnRhdGlvbnMpLgotICAgICAgLy8gVE9ETyhrZW50b24pOiAgUHJvdmlkZSBhIGZ1bmN0aW9uIHNvbWV3aGVyZSBjYWxsZWQgbWFrZURlZXBDb3B5KCkKLSAgICAgIC8vICAgd2hpY2ggYWxsb3dzIHBlb3BsZSB0byBtYWtlIHNlY3VyZSBkZWVwIGNvcGllcyBvZiBtZXNzYWdlcy4KLQotICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICAgb3RoZXIuZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgewotICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgIGZvciAoZmluYWwgT2JqZWN0IGVsZW1lbnQgOiAoTGlzdCllbnRyeS5nZXRWYWx1ZSgpKSB7Ci0gICAgICAgICAgICBhZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCBlbGVtZW50KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgZXhpc3RpbmdWYWx1ZSA9IChNZXNzYWdlKWdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgICBpZiAoZXhpc3RpbmdWYWx1ZSA9PSBleGlzdGluZ1ZhbHVlLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSkgewotICAgICAgICAgICAgc2V0RmllbGQoZmllbGQsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzZXRGaWVsZChmaWVsZCwKLSAgICAgICAgICAgICAgZXhpc3RpbmdWYWx1ZS5uZXdCdWlsZGVyRm9yVHlwZSgpCi0gICAgICAgICAgICAgICAgLm1lcmdlRnJvbShleGlzdGluZ1ZhbHVlKQotICAgICAgICAgICAgICAgIC5tZXJnZUZyb20oKE1lc3NhZ2UpZW50cnkuZ2V0VmFsdWUoKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHNldEZpZWxkKGZpZWxkLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBtZXJnZVVua25vd25GaWVsZHMob3RoZXIuZ2V0VW5rbm93bkZpZWxkcygpKTsKLQotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIG1lcmdlRnJvbShpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RW1wdHlSZWdpc3RyeSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoZ2V0VW5rbm93bkZpZWxkcygpKTsKLSAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgIGZpbmFsIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICAgIGlmICh0YWcgPT0gMCkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFtZXJnZUZpZWxkRnJvbShpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgdGFnKSkgewotICAgICAgICAgIC8vIGVuZCBncm91cCB0YWcKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgc2V0VW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzLmJ1aWxkKCkpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0sIFVua25vd25GaWVsZFNldC5CdWlsZGVyLAotICAgICAqIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSwgTWVzc2FnZS5CdWlsZGVyKX0sIGJ1dCBwYXJzZXMgYSBzaW5nbGUgZmllbGQuCi0gICAgICogUGFja2FnZS1wcml2YXRlIGJlY2F1c2UgaXQgaXMgdXNlZCBieSBHZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVNZXNzYWdlLgotICAgICAqIEBwYXJhbSB0YWcgVGhlIHRhZywgd2hpY2ggc2hvdWxkIGhhdmUgYWxyZWFkeSBiZWVuIHJlYWQuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICAgKi8KLSAgICBzdGF0aWMgYm9vbGVhbiBtZXJnZUZpZWxkRnJvbSgKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgZmluYWwgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIERlc2NyaXB0b3IgdHlwZSA9IGJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLQotICAgICAgaWYgKHR5cGUuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkgJiYKLSAgICAgICAgICB0YWcgPT0gV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNX1RBRykgewotICAgICAgICBtZXJnZU1lc3NhZ2VTZXRFeHRlbnNpb25Gcm9tQ29kZWRTdHJlYW0oCi0gICAgICAgICAgaW5wdXQsIHVua25vd25GaWVsZHMsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIGludCB3aXJlVHlwZSA9IFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKTsKLSAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciA9IFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKTsKLQotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkOwotICAgICAgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UgPSBudWxsOwotCi0gICAgICBpZiAodHlwZS5pc0V4dGVuc2lvbk51bWJlcihmaWVsZE51bWJlcikpIHsKLSAgICAgICAgLy8gZXh0ZW5zaW9uUmVnaXN0cnkgbWF5IGJlIGVpdGhlciBFeHRlbnNpb25SZWdpc3RyeSBvcgotICAgICAgICAvLyBFeHRlbnNpb25SZWdpc3RyeUxpdGUuICBTaW5jZSB0aGUgdHlwZSB3ZSBhcmUgcGFyc2luZyBpcyBhIGZ1bGwKLSAgICAgICAgLy8gbWVzc2FnZSwgb25seSBhIGZ1bGwgRXh0ZW5zaW9uUmVnaXN0cnkgY291bGQgcG9zc2libHkgY29udGFpbgotICAgICAgICAvLyBleHRlbnNpb25zIG9mIGl0LiAgT3RoZXJ3aXNlIHdlIHdpbGwgdHJlYXQgdGhlIHJlZ2lzdHJ5IGFzIGlmIGl0Ci0gICAgICAgIC8vIHdlcmUgZW1wdHkuCi0gICAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSBpbnN0YW5jZW9mIEV4dGVuc2lvblJlZ2lzdHJ5KSB7Ci0gICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24gPQotICAgICAgICAgICAgKChFeHRlbnNpb25SZWdpc3RyeSkgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgICAgIC5maW5kRXh0ZW5zaW9uQnlOdW1iZXIodHlwZSwgZmllbGROdW1iZXIpOwotICAgICAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICAgICAgZmllbGQgPSBudWxsOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaWVsZCA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yOwotICAgICAgICAgICAgZGVmYXVsdEluc3RhbmNlID0gZXh0ZW5zaW9uLmRlZmF1bHRJbnN0YW5jZTsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCAmJgotICAgICAgICAgICAgICAgIGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICJNZXNzYWdlLXR5cGVkIGV4dGVuc2lvbiBsYWNrZWQgZGVmYXVsdCBpbnN0YW5jZTogIiArCi0gICAgICAgICAgICAgICAgICBmaWVsZC5nZXRGdWxsTmFtZSgpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZmllbGQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaWVsZCA9IHR5cGUuZmluZEZpZWxkQnlOdW1iZXIoZmllbGROdW1iZXIpOwotICAgICAgfQotCi0gICAgICBib29sZWFuIHVua25vd24gPSBmYWxzZTsKLSAgICAgIGJvb2xlYW4gcGFja2VkID0gZmFsc2U7Ci0gICAgICBpZiAoZmllbGQgPT0gbnVsbCkgewotICAgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFVua25vd24gZmllbGQuCi0gICAgICB9IGVsc2UgaWYgKHdpcmVUeXBlID09IEZpZWxkU2V0LmdldFdpcmVGb3JtYXRGb3JGaWVsZFR5cGUoCi0gICAgICAgICAgICAgICAgICAgZmllbGQuZ2V0TGl0ZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICBmYWxzZSAgLyogaXNQYWNrZWQgKi8pKSB7Ci0gICAgICAgIHBhY2tlZCA9IGZhbHNlOwotICAgICAgfSBlbHNlIGlmIChmaWVsZC5pc1BhY2thYmxlKCkgJiYKLSAgICAgICAgICAgICAgICAgd2lyZVR5cGUgPT0gRmllbGRTZXQuZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZSgKLSAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXRMaXRlVHlwZSgpLAotICAgICAgICAgICAgICAgICAgIHRydWUgIC8qIGlzUGFja2VkICovKSkgewotICAgICAgICBwYWNrZWQgPSB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdW5rbm93biA9IHRydWU7ICAvLyBVbmtub3duIHdpcmUgdHlwZS4KLSAgICAgIH0KLQotICAgICAgaWYgKHVua25vd24pIHsgIC8vIFVua25vd24gZmllbGQgb3Igd3Jvbmcgd2lyZSB0eXBlLiAgU2tpcC4KLSAgICAgICAgcmV0dXJuIHVua25vd25GaWVsZHMubWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwYWNrZWQpIHsKLSAgICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGlucHV0LnJlYWRSYXdWYXJpbnQzMigpOwotICAgICAgICBmaW5hbCBpbnQgbGltaXQgPSBpbnB1dC5wdXNoTGltaXQobGVuZ3RoKTsKLSAgICAgICAgaWYgKGZpZWxkLmdldExpdGVUeXBlKCkgPT0gV2lyZUZvcm1hdC5GaWVsZFR5cGUuRU5VTSkgewotICAgICAgICAgIHdoaWxlIChpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHsKLSAgICAgICAgICAgIGZpbmFsIGludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBmaWVsZC5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXNuJ3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzCi0gICAgICAgICAgICAgIC8vIGVudW0sIGRyb3AgaXQgKGRvbid0IGV2ZW4gYWRkIGl0IHRvIHVua25vd25GaWVsZHMpLgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPQotICAgICAgICAgICAgICBGaWVsZFNldC5yZWFkUHJpbWl0aXZlRmllbGQoaW5wdXQsIGZpZWxkLmdldExpdGVUeXBlKCkpOwotICAgICAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIGlucHV0LnBvcExpbWl0KGxpbWl0KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZTsKLSAgICAgICAgc3dpdGNoIChmaWVsZC5nZXRUeXBlKCkpIHsKLSAgICAgICAgICBjYXNlIEdST1VQOiB7Ci0gICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlcjsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0SW5zdGFuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gYnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5tZXJnZUZyb20oKE1lc3NhZ2UpIGJ1aWxkZXIuZ2V0RmllbGQoZmllbGQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LnJlYWRHcm91cChmaWVsZC5nZXROdW1iZXIoKSwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgICAgICAgdmFsdWUgPSBzdWJCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgY2FzZSBNRVNTQUdFOiB7Ci0gICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgc3ViQnVpbGRlcjsKLSAgICAgICAgICAgIGlmIChkZWZhdWx0SW5zdGFuY2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gYnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpOwotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKCFmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICAgICAgc3ViQnVpbGRlci5tZXJnZUZyb20oKE1lc3NhZ2UpIGJ1aWxkZXIuZ2V0RmllbGQoZmllbGQpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICAgIGZpbmFsIGludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7Ci0gICAgICAgICAgICB2YWx1ZSA9IGZpZWxkLmdldEVudW1UeXBlKCkuZmluZFZhbHVlQnlOdW1iZXIocmF3VmFsdWUpOwotICAgICAgICAgICAgLy8gSWYgdGhlIG51bWJlciBpc24ndCByZWNvZ25pemVkIGFzIGEgdmFsaWQgdmFsdWUgZm9yIHRoaXMgZW51bSwKLSAgICAgICAgICAgIC8vIGRyb3AgaXQuCi0gICAgICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICB1bmtub3duRmllbGRzLm1lcmdlVmFyaW50RmllbGQoZmllbGROdW1iZXIsIHJhd1ZhbHVlKTsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdmFsdWUgPSBGaWVsZFNldC5yZWFkUHJpbWl0aXZlRmllbGQoaW5wdXQsIGZpZWxkLmdldExpdGVUeXBlKCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8qKiBDYWxsZWQgYnkge0Bjb2RlICNtZXJnZUZpZWxkRnJvbSgpfSB0byBwYXJzZSBhIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLiAqLwotICAgIHByaXZhdGUgc3RhdGljIHZvaWQgbWVyZ2VNZXNzYWdlU2V0RXh0ZW5zaW9uRnJvbUNvZGVkU3RyZWFtKAotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgRGVzY3JpcHRvciB0eXBlID0gYnVpbGRlci5nZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotCi0gICAgICAvLyBUaGUgd2lyZSBmb3JtYXQgZm9yIE1lc3NhZ2VTZXQgaXM6Ci0gICAgICAvLyAgIG1lc3NhZ2UgTWVzc2FnZVNldCB7Ci0gICAgICAvLyAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgewotICAgICAgLy8gICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZUlkID0gMjsKLSAgICAgIC8vICAgICAgIHJlcXVpcmVkIGJ5dGVzIG1lc3NhZ2UgPSAzOwotICAgICAgLy8gICAgIH0KLSAgICAgIC8vICAgfQotICAgICAgLy8gInR5cGVJZCIgaXMgdGhlIGV4dGVuc2lvbidzIGZpZWxkIG51bWJlci4gIFRoZSBleHRlbnNpb24gY2FuIG9ubHkgYmUKLSAgICAgIC8vIGEgbWVzc2FnZSB0eXBlLCB3aGVyZSAibWVzc2FnZSIgY29udGFpbnMgdGhlIGVuY29kZWQgYnl0ZXMgb2YgdGhhdAotICAgICAgLy8gbWVzc2FnZS4KLSAgICAgIC8vCi0gICAgICAvLyBJbiBwcmFjdGljZSwgd2Ugd2lsbCBwcm9iYWJseSBuZXZlciBzZWUgYSBNZXNzYWdlU2V0IGl0ZW0gaW4gd2hpY2gKLSAgICAgIC8vIHRoZSBtZXNzYWdlIGFwcGVhcnMgYmVmb3JlIHRoZSB0eXBlIElELCBvciB3aGVyZSBlaXRoZXIgZmllbGQgZG9lcyBub3QKLSAgICAgIC8vIGFwcGVhciBleGFjdGx5IG9uY2UuICBIb3dldmVyLCBpbiB0aGVvcnkgc3VjaCBjYXNlcyBhcmUgdmFsaWQsIHNvIHdlCi0gICAgICAvLyBzaG91bGQgYmUgcHJlcGFyZWQgdG8gYWNjZXB0IHRoZW0uCi0KLSAgICAgIGludCB0eXBlSWQgPSAwOwotICAgICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG51bGw7ICAvLyBJZiB3ZSBlbmNvdW50ZXIgIm1lc3NhZ2UiIGJlZm9yZSAidHlwZUlkIgotICAgICAgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXIgPSBudWxsOwotICAgICAgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gbnVsbDsKLQotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgZmluYWwgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgaWYgKHRhZyA9PSAwKSB7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICAgIH0KLQotICAgICAgICBpZiAodGFnID09IFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRF9UQUcpIHsKLSAgICAgICAgICB0eXBlSWQgPSBpbnB1dC5yZWFkVUludDMyKCk7Ci0gICAgICAgICAgLy8gWmVybyBpcyBub3QgYSB2YWxpZCB0eXBlIElELgotICAgICAgICAgIGlmICh0eXBlSWQgIT0gMCkgewotICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247Ci0KLSAgICAgICAgICAgIC8vIGV4dGVuc2lvblJlZ2lzdHJ5IG1heSBiZSBlaXRoZXIgRXh0ZW5zaW9uUmVnaXN0cnkgb3IKLSAgICAgICAgICAgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS4gIFNpbmNlIHRoZSB0eXBlIHdlIGFyZSBwYXJzaW5nIGlzIGEgZnVsbAotICAgICAgICAgICAgLy8gbWVzc2FnZSwgb25seSBhIGZ1bGwgRXh0ZW5zaW9uUmVnaXN0cnkgY291bGQgcG9zc2libHkgY29udGFpbgotICAgICAgICAgICAgLy8gZXh0ZW5zaW9ucyBvZiBpdC4gIE90aGVyd2lzZSB3ZSB3aWxsIHRyZWF0IHRoZSByZWdpc3RyeSBhcyBpZiBpdAotICAgICAgICAgICAgLy8gd2VyZSBlbXB0eS4KLSAgICAgICAgICAgIGlmIChleHRlbnNpb25SZWdpc3RyeSBpbnN0YW5jZW9mIEV4dGVuc2lvblJlZ2lzdHJ5KSB7Ci0gICAgICAgICAgICAgIGV4dGVuc2lvbiA9ICgoRXh0ZW5zaW9uUmVnaXN0cnkpIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgLmZpbmRFeHRlbnNpb25CeU51bWJlcih0eXBlLCB0eXBlSWQpOwotICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgZXh0ZW5zaW9uID0gbnVsbDsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgaWYgKGV4dGVuc2lvbiAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGZpZWxkID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3I7Ci0gICAgICAgICAgICAgIHN1YkJ1aWxkZXIgPSBleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7Ci0gICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2Ugb3JpZ2luYWxNZXNzYWdlID0gKE1lc3NhZ2UpYnVpbGRlci5nZXRGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgICAgIGlmIChvcmlnaW5hbE1lc3NhZ2UgIT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIubWVyZ2VGcm9tKG9yaWdpbmFsTWVzc2FnZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgaWYgKHJhd0J5dGVzICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBhbHJlYWR5IGVuY291bnRlcmVkIHRoZSBtZXNzYWdlLiAgUGFyc2UgaXQgbm93LgotICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIubWVyZ2VGcm9tKAotICAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdCeXRlcy5uZXdJbnB1dCgpKSk7Ci0gICAgICAgICAgICAgICAgcmF3Qnl0ZXMgPSBudWxsOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAvLyBVbmtub3duIGV4dGVuc2lvbiBudW1iZXIuICBJZiB3ZSBhbHJlYWR5IHNhdyBkYXRhLCBwdXQgaXQKLSAgICAgICAgICAgICAgLy8gaW4gcmF3Qnl0ZXMuCi0gICAgICAgICAgICAgIGlmIChyYXdCeXRlcyAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgICAgdW5rbm93bkZpZWxkcy5tZXJnZUZpZWxkKHR5cGVJZCwKLSAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChyYXdCeXRlcykKLSAgICAgICAgICAgICAgICAgICAgLmJ1aWxkKCkpOwotICAgICAgICAgICAgICAgIHJhd0J5dGVzID0gbnVsbDsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9NRVNTQUdFX1RBRykgewotICAgICAgICAgIGlmICh0eXBlSWQgPT0gMCkgewotICAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzZWVuIGEgdHlwZSBJRCB5ZXQsIHNvIHdlIGhhdmUgdG8gc3RvcmUgdGhlIHJhdyBieXRlcwotICAgICAgICAgICAgLy8gZm9yIG5vdy4KLSAgICAgICAgICAgIHJhd0J5dGVzID0gaW5wdXQucmVhZEJ5dGVzKCk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChzdWJCdWlsZGVyID09IG51bGwpIHsKLSAgICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgaG93IHRvIHBhcnNlIHRoaXMuICBJZ25vcmUgaXQuCi0gICAgICAgICAgICB1bmtub3duRmllbGRzLm1lcmdlRmllbGQodHlwZUlkLAotICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChpbnB1dC5yZWFkQnl0ZXMoKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIFdlIGFscmVhZHkga25vdyB0aGUgdHlwZSwgc28gd2UgY2FuIHBhcnNlIGRpcmVjdGx5IGZyb20gdGhlIGlucHV0Ci0gICAgICAgICAgICAvLyB3aXRoIG5vIGNvcHlpbmcuICBIb29yYXkhCi0gICAgICAgICAgICBpbnB1dC5yZWFkTWVzc2FnZShzdWJCdWlsZGVyLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIFVua25vd24gdGFnLiAgU2tpcCBpdC4KLSAgICAgICAgICBpZiAoIWlucHV0LnNraXBGaWVsZCh0YWcpKSB7Ci0gICAgICAgICAgICBicmVhazsgIC8vIGVuZCBvZiBncm91cAotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9JVEVNX0VORF9UQUcpOwotCi0gICAgICBpZiAoc3ViQnVpbGRlciAhPSBudWxsKSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIHN1YkJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlVW5rbm93bkZpZWxkcyhmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcykgewotICAgICAgc2V0VW5rbm93bkZpZWxkcygKLSAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoZ2V0VW5rbm93bkZpZWxkcygpKQotICAgICAgICAgICAgICAgICAgICAgICAubWVyZ2VGcm9tKHVua25vd25GaWVsZHMpCi0gICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGFuIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIHJlcG9ydGluZyBtaXNzaW5nIGZpZWxkcyBpbgotICAgICAqIHRoZSBnaXZlbiBtZXNzYWdlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24KLSAgICAgICAgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICByZXR1cm4gbmV3IFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKGZpbmRNaXNzaW5nRmllbGRzKG1lc3NhZ2UpKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQb3B1bGF0ZXMge0Bjb2RlIHRoaXMubWlzc2luZ0ZpZWxkc30gd2l0aCB0aGUgZnVsbCAicGF0aCIgb2YgZWFjaAotICAgICAqIG1pc3NpbmcgcmVxdWlyZWQgZmllbGQgaW4gdGhlIGdpdmVuIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBzdGF0aWMgTGlzdDxTdHJpbmc+IGZpbmRNaXNzaW5nRmllbGRzKGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSkgewotICAgICAgZmluYWwgTGlzdDxTdHJpbmc+IHJlc3VsdHMgPSBuZXcgQXJyYXlMaXN0PFN0cmluZz4oKTsKLSAgICAgIGZpbmRNaXNzaW5nRmllbGRzKG1lc3NhZ2UsICIiLCByZXN1bHRzKTsKLSAgICAgIHJldHVybiByZXN1bHRzOwotICAgIH0KLQotICAgIC8qKiBSZWN1cnNpdmUgaGVscGVyIGltcGxlbWVudGluZyB7QGxpbmsgI2ZpbmRNaXNzaW5nRmllbGRzKE1lc3NhZ2UpfS4gKi8KLSAgICBwcml2YXRlIHN0YXRpYyB2b2lkIGZpbmRNaXNzaW5nRmllbGRzKGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBMaXN0PFN0cmluZz4gcmVzdWx0cykgewotICAgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOgotICAgICAgICAgIG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWVsZHMoKSkgewotICAgICAgICBpZiAoZmllbGQuaXNSZXF1aXJlZCgpICYmICFtZXNzYWdlLmhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgIHJlc3VsdHMuYWRkKHByZWZpeCArIGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICAgbWVzc2FnZS5nZXRBbGxGaWVsZHMoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGVudHJ5LmdldEtleSgpOwotICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgaW50IGkgPSAwOwotICAgICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0KSB2YWx1ZSkgewotICAgICAgICAgICAgICBmaW5kTWlzc2luZ0ZpZWxkcygoTWVzc2FnZSkgZWxlbWVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViTWVzc2FnZVByZWZpeChwcmVmaXgsIGZpZWxkLCBpKyspLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXN1bHRzKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKG1lc3NhZ2UuaGFzRmllbGQoZmllbGQpKSB7Ci0gICAgICAgICAgICAgIGZpbmRNaXNzaW5nRmllbGRzKChNZXNzYWdlKSB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3ViTWVzc2FnZVByZWZpeChwcmVmaXgsIGZpZWxkLCAtMSksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlc3VsdHMpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIFN0cmluZyBzdWJNZXNzYWdlUHJlZml4KGZpbmFsIFN0cmluZyBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgewotICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciByZXN1bHQgPSBuZXcgU3RyaW5nQnVpbGRlcihwcmVmaXgpOwotICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZCgnKCcpCi0gICAgICAgICAgICAgIC5hcHBlbmQoZmllbGQuZ2V0RnVsbE5hbWUoKSkKLSAgICAgICAgICAgICAgLmFwcGVuZCgnKScpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0LmFwcGVuZChmaWVsZC5nZXROYW1lKCkpOwotICAgICAgfQotICAgICAgaWYgKGluZGV4ICE9IC0xKSB7Ci0gICAgICAgIHJlc3VsdC5hcHBlbmQoJ1snKQotICAgICAgICAgICAgICAuYXBwZW5kKGluZGV4KQotICAgICAgICAgICAgICAuYXBwZW5kKCddJyk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQuYXBwZW5kKCcuJyk7Ci0gICAgICByZXR1cm4gcmVzdWx0LnRvU3RyaW5nKCk7Ci0gICAgfQotCi0gICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gICAgLy8gVGhlIGZvbGxvd2luZyBkZWZpbml0aW9ucyBzZWVtIHRvIGJlIHJlcXVpcmVkIGluIG9yZGVyIHRvIG1ha2UgamF2YWMKLSAgICAvLyBub3QgcHJvZHVjZSB3ZWlyZCBlcnJvcnMgbGlrZToKLSAgICAvLwotICAgIC8vIGphdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZS5qYXZhOjIwMzogdHlwZXMKLSAgICAvLyAgIGNvbS5nb29nbGUucHJvdG9idWYuQWJzdHJhY3RNZXNzYWdlLkJ1aWxkZXI8Ci0gICAgLy8gICAgIGNvbS5nb29nbGUucHJvdG9idWYuRHluYW1pY01lc3NhZ2UuQnVpbGRlcj4gYW5kCi0gICAgLy8gICBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPAotICAgIC8vICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkR5bmFtaWNNZXNzYWdlLkJ1aWxkZXI+IGFyZSBpbmNvbXBhdGlibGU7IGJvdGgKLSAgICAvLyAgIGRlZmluZSBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSwgYnV0IHdpdGggdW5yZWxhdGVkCi0gICAgLy8gICByZXR1cm4gdHlwZXMuCi0gICAgLy8KLSAgICAvLyBTdHJhbmdlbHksIHRoZXNlIGxpbmVzIGFyZSBvbmx5IG5lZWRlZCBpZiBqYXZhYyBpcyBpbnZva2VkIHNlcGFyYXRlbHkKLSAgICAvLyBvbiBBYnN0cmFjdE1lc3NhZ2UuamF2YSBhbmQgQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhLiAgSWYgamF2YWMgaXMKLSAgICAvLyBpbnZva2VkIG9uIGJvdGggc2ltdWx0YW5lb3VzbHksIGl0IHdvcmtzLiAgKE9yIG1heWJlIHRoZSBpbXBvcnRhbnQKLSAgICAvLyBwb2ludCBpcyB3aGV0aGVyIG9yIG5vdCBEeW5hbWljTWVzc2FnZS5qYXZhIGlzIGNvbXBpbGVkIHRvZ2V0aGVyIHdpdGgKLSAgICAvLyBBYnN0cmFjdE1lc3NhZ2VMaXRlLmphdmEgLS0gbm90IHN1cmUuKSAgSSBzdXNwZWN0IHRoaXMgaXMgYSBjb21waWxlcgotICAgIC8vIGJ1Zy4KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgQnl0ZVN0cmluZyBkYXRhKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oZGF0YSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgQnl0ZVN0cmluZyBkYXRhLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBieXRlW10gZGF0YSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gc3VwZXIubWVyZ2VGcm9tKGRhdGEpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLCBmaW5hbCBpbnQgb2ZmLCBmaW5hbCBpbnQgbGVuKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oZGF0YSwgb2ZmLCBsZW4pOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIGJ5dGVbXSBkYXRhLAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4sCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gc3VwZXIubWVyZ2VGcm9tKGRhdGEsIG9mZiwgbGVuLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBzdXBlci5tZXJnZUZyb20oaW5wdXQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oCi0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gc3VwZXIubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKAotICAgICAgICBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIH0KLQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZUxpdGUuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNzdiMjczNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlTGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uRmlsdGVySW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotCi0vKioKLSAqIEEgcGFydGlhbCBpbXBsZW1lbnRhdGlvbiBvZiB0aGUge0BsaW5rIE1lc3NhZ2VMaXRlfSBpbnRlcmZhY2Ugd2hpY2gKLSAqIGltcGxlbWVudHMgYXMgbWFueSBtZXRob2RzIG9mIHRoYXQgaW50ZXJmYWNlIGFzIHBvc3NpYmxlIGluIHRlcm1zIG9mIG90aGVyCi0gKiBtZXRob2RzLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VMaXRlIGltcGxlbWVudHMgTWVzc2FnZUxpdGUgewotICBwdWJsaWMgQnl0ZVN0cmluZyB0b0J5dGVTdHJpbmcoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIEJ5dGVTdHJpbmcuQ29kZWRCdWlsZGVyIG91dCA9Ci0gICAgICAgIEJ5dGVTdHJpbmcubmV3Q29kZWRCdWlsZGVyKGdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgICAgd3JpdGVUbyhvdXQuZ2V0Q29kZWRPdXRwdXQoKSk7Ci0gICAgICByZXR1cm4gb3V0LmJ1aWxkKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJTZXJpYWxpemluZyB0byBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKLSAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKLSAgICB0cnkgewotICAgICAgZmluYWwgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2dldFNlcmlhbGl6ZWRTaXplKCldOwotICAgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmVzdWx0KTsKLSAgICAgIHdyaXRlVG8ob3V0cHV0KTsKLSAgICAgIG91dHB1dC5jaGVja05vU3BhY2VMZWZ0KCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiU2VyaWFsaXppbmcgdG8gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uICIgKwotICAgICAgICAiKHNob3VsZCBuZXZlciBoYXBwZW4pLiIsIGUpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSA9Ci0gICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVQcmVmZXJyZWRCdWZmZXJTaXplKGdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIGNvZGVkT3V0cHV0ID0KLSAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2Uob3V0cHV0LCBidWZmZXJTaXplKTsKLSAgICB3cml0ZVRvKGNvZGVkT3V0cHV0KTsKLSAgICBjb2RlZE91dHB1dC5mbHVzaCgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgd3JpdGVEZWxpbWl0ZWRUbyhmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBzZXJpYWxpemVkID0gZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICBmaW5hbCBpbnQgYnVmZmVyU2l6ZSA9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVQcmVmZXJyZWRCdWZmZXJTaXplKAotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUmF3VmFyaW50MzJTaXplKHNlcmlhbGl6ZWQpICsgc2VyaWFsaXplZCk7Ci0gICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gY29kZWRPdXRwdXQgPQotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShvdXRwdXQsIGJ1ZmZlclNpemUpOwotICAgIGNvZGVkT3V0cHV0LndyaXRlUmF3VmFyaW50MzIoc2VyaWFsaXplZCk7Ci0gICAgd3JpdGVUbyhjb2RlZE91dHB1dCk7Ci0gICAgY29kZWRPdXRwdXQuZmx1c2goKTsKLSAgfQotCi0gIC8qKgotICAgKiBBIHBhcnRpYWwgaW1wbGVtZW50YXRpb24gb2YgdGhlIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9IGludGVyZmFjZSB3aGljaAotICAgKiBpbXBsZW1lbnRzIGFzIG1hbnkgbWV0aG9kcyBvZiB0aGF0IGludGVyZmFjZSBhcyBwb3NzaWJsZSBpbiB0ZXJtcyBvZgotICAgKiBvdGhlciBtZXRob2RzLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBzdGF0aWMgYWJzdHJhY3QgY2xhc3MgQnVpbGRlcjxCdWlsZGVyVHlwZSBleHRlbmRzIEJ1aWxkZXI+Ci0gICAgICBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgewotICAgIC8vIFRoZSBjb21waWxlciBwcm9kdWNlcyBhbiBlcnJvciBpZiB0aGlzIGlzIG5vdCBkZWNsYXJlZCBleHBsaWNpdGx5LgotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBhYnN0cmFjdCBCdWlsZGVyVHlwZSBjbG9uZSgpOwotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBtZXJnZUZyb20oaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOwotICAgIH0KLQotICAgIC8vIFJlLWRlZmluZWQgaGVyZSBmb3IgcmV0dXJuIHR5cGUgY292YXJpYW5jZS4KLSAgICBwdWJsaWMgYWJzdHJhY3QgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgQnl0ZVN0cmluZyBkYXRhKQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhLm5ld0NvZGVkSW5wdXQoKTsKLSAgICAgICAgbWVyZ2VGcm9tKGlucHV0KTsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIEJ5dGVTdHJpbmcgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKLSAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKAotICAgICAgICBmaW5hbCBCeXRlU3RyaW5nIGRhdGEsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7Ci0gICAgICAgIG1lcmdlRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgICAgICBpbnB1dC5jaGVja0xhc3RUYWdXYXMoMCk7Ci0gICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgQnl0ZVN0cmluZyB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKwotICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBtZXJnZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhLCAwLCBkYXRhLmxlbmd0aCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbShmaW5hbCBieXRlW10gZGF0YSwgZmluYWwgaW50IG9mZiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW4pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPQotICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhLCBvZmYsIGxlbik7Ci0gICAgICAgIG1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCi0gICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbWVyZ2VGcm9tKGRhdGEsIDAsIGRhdGEubGVuZ3RoLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgYnl0ZVtdIGRhdGEsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4sCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0KLSAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSwgb2ZmLCBsZW4pOwotICAgICAgICBtZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZTsKLSAgICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlJlYWRpbmcgZnJvbSBhIGJ5dGUgYXJyYXkgdGhyZXcgYW4gSU9FeGNlcHRpb24gKHNob3VsZCAiICsKLSAgICAgICAgICAibmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZElucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShpbnB1dCk7Ci0gICAgICBtZXJnZUZyb20oY29kZWRJbnB1dCk7Ci0gICAgICBjb2RlZElucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIG1lcmdlRnJvbSgKLSAgICAgICAgZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gY29kZWRJbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoaW5wdXQpOwotICAgICAgbWVyZ2VGcm9tKGNvZGVkSW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgIGNvZGVkSW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBbiBJbnB1dFN0cmVhbSBpbXBsZW1lbnRhdGlvbnMgd2hpY2ggcmVhZHMgZnJvbSBzb21lIG90aGVyIElucHV0U3RyZWFtCi0gICAgICogYnV0IGlzIGxpbWl0ZWQgdG8gYSBwYXJ0aWN1bGFyIG51bWJlciBvZiBieXRlcy4gIFVzZWQgYnkKLSAgICAgKiBtZXJnZURlbGltaXRlZEZyb20oKS4gIFRoaXMgaXMgaW50ZW50aW9uYWxseSBwYWNrYWdlLXByaXZhdGUgc28gdGhhdAotICAgICAqIFVua25vd25GaWVsZFNldCBjYW4gc2hhcmUgaXQuCi0gICAgICovCi0gICAgc3RhdGljIGZpbmFsIGNsYXNzIExpbWl0ZWRJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKLSAgICAgIHByaXZhdGUgaW50IGxpbWl0OwotCi0gICAgICBMaW1pdGVkSW5wdXRTdHJlYW0oSW5wdXRTdHJlYW0gaW4sIGludCBsaW1pdCkgewotICAgICAgICBzdXBlcihpbik7Ci0gICAgICAgIHRoaXMubGltaXQgPSBsaW1pdDsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IGF2YWlsYWJsZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHJldHVybiBNYXRoLm1pbihzdXBlci5hdmFpbGFibGUoKSwgbGltaXQpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBpbnQgcmVhZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGlmIChsaW1pdCA8PSAwKSB7Ci0gICAgICAgICAgcmV0dXJuIC0xOwotICAgICAgICB9Ci0gICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBzdXBlci5yZWFkKCk7Ci0gICAgICAgIGlmIChyZXN1bHQgPj0gMCkgewotICAgICAgICAgIC0tbGltaXQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IHJlYWQoZmluYWwgYnl0ZVtdIGIsIGZpbmFsIGludCBvZmYsIGludCBsZW4pCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgaWYgKGxpbWl0IDw9IDApIHsKLSAgICAgICAgICByZXR1cm4gLTE7Ci0gICAgICAgIH0KLSAgICAgICAgbGVuID0gTWF0aC5taW4obGVuLCBsaW1pdCk7Ci0gICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBzdXBlci5yZWFkKGIsIG9mZiwgbGVuKTsKLSAgICAgICAgaWYgKHJlc3VsdCA+PSAwKSB7Ci0gICAgICAgICAgbGltaXQgLT0gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIGxvbmcgc2tpcChmaW5hbCBsb25nIG4pIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIGZpbmFsIGxvbmcgcmVzdWx0ID0gc3VwZXIuc2tpcChNYXRoLm1pbihuLCBsaW1pdCkpOwotICAgICAgICBpZiAocmVzdWx0ID49IDApIHsKLSAgICAgICAgICBsaW1pdCAtPSByZXN1bHQ7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oCi0gICAgICAgIGZpbmFsIElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBpbnQgZmlyc3RCeXRlID0gaW5wdXQucmVhZCgpOwotICAgICAgaWYgKGZpcnN0Qnl0ZSA9PSAtMSkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBmaW5hbCBpbnQgc2l6ZSA9IENvZGVkSW5wdXRTdHJlYW0ucmVhZFJhd1ZhcmludDMyKGZpcnN0Qnl0ZSwgaW5wdXQpOwotICAgICAgZmluYWwgSW5wdXRTdHJlYW0gbGltaXRlZElucHV0ID0gbmV3IExpbWl0ZWRJbnB1dFN0cmVhbShpbnB1dCwgc2l6ZSk7Ci0gICAgICBtZXJnZUZyb20obGltaXRlZElucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gbWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0LAotICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhbiBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiByZXBvcnRpbmcgbWlzc2luZyBmaWVsZHMgaW4KLSAgICAgKiB0aGUgZ2l2ZW4gbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgc3RhdGljIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uCi0gICAgICAgIG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKE1lc3NhZ2VMaXRlIG1lc3NhZ2UpIHsKLSAgICAgIHJldHVybiBuZXcgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24obWVzc2FnZSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyB0aGUge0Bjb2RlIHZhbHVlc30gdG8gdGhlIHtAY29kZSBsaXN0fS4gIFRoaXMgaXMgYSBoZWxwZXIgbWV0aG9kCi0gICAgICogdXNlZCBieSBnZW5lcmF0ZWQgY29kZS4gIFVzZXJzIHNob3VsZCBpZ25vcmUgaXQuCi0gICAgICoKLSAgICAgKiBAdGhyb3dzIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIGFueSBvZiB0aGUgZWxlbWVudHMgb2Yge0Bjb2RlIHZhbHVlc30gaXMKLSAgICAgKiBudWxsLgotICAgICAqLwotICAgIHByb3RlY3RlZCBzdGF0aWMgPFQ+IHZvaWQgYWRkQWxsKGZpbmFsIEl0ZXJhYmxlPFQ+IHZhbHVlcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDb2xsZWN0aW9uPD8gc3VwZXIgVD4gbGlzdCkgewotICAgICAgZm9yIChmaW5hbCBUIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0gICAgICAgIGZpbmFsIENvbGxlY3Rpb248VD4gY29sbGVjdGlvbiA9IChDb2xsZWN0aW9uPFQ+KSB2YWx1ZXM7Ci0gICAgICAgIGxpc3QuYWRkQWxsKGNvbGxlY3Rpb24pOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChmaW5hbCBUIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgICAgbGlzdC5hZGQodmFsdWUpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdScGNDaGFubmVsLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdScGNDaGFubmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFlODExNDMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Jsb2NraW5nUnBjQ2hhbm5lbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIDxwPkFic3RyYWN0IGludGVyZmFjZSBmb3IgYSBibG9ja2luZyBSUEMgY2hhbm5lbC4gIHtAY29kZSBCbG9ja2luZ1JwY0NoYW5uZWx9Ci0gKiBpcyB0aGUgYmxvY2tpbmcgZXF1aXZhbGVudCB0byB7QGxpbmsgUnBjQ2hhbm5lbH0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqIEBhdXRob3IgY3Bvdmlya0Bnb29nbGUuY29tIENocmlzIFBvdmlyawotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NraW5nUnBjQ2hhbm5lbCB7Ci0gIC8qKgotICAgKiBDYWxsIHRoZSBnaXZlbiBtZXRob2Qgb2YgdGhlIHJlbW90ZSBzZXJ2aWNlIGFuZCBibG9ja3MgdW50aWwgaXQgcmV0dXJucy4KLSAgICoge0Bjb2RlIGNhbGxCbG9ja2luZ01ldGhvZCgpfSBpcyB0aGUgYmxvY2tpbmcgZXF1aXZhbGVudCB0bwotICAgKiB7QGxpbmsgUnBjQ2hhbm5lbCNjYWxsTWV0aG9kfS4KLSAgICovCi0gIE1lc3NhZ2UgY2FsbEJsb2NraW5nTWV0aG9kKAotICAgICAgRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCi0gICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCi0gICAgICBNZXNzYWdlIHJlcXVlc3QsCi0gICAgICBNZXNzYWdlIHJlc3BvbnNlUHJvdG90eXBlKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbjsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1NlcnZpY2UuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CbG9ja2luZ1NlcnZpY2UuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWNjODAwOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQmxvY2tpbmdTZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2NCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLS8qKgotICogQmxvY2tpbmcgZXF1aXZhbGVudCB0byB7QGxpbmsgU2VydmljZX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqIEBhdXRob3IgY3Bvdmlya0Bnb29nbGUuY29tIENocmlzIFBvdmlyawotICovCi1wdWJsaWMgaW50ZXJmYWNlIEJsb2NraW5nU2VydmljZSB7Ci0gIC8qKgotICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBTZXJ2aWNlI2dldERlc2NyaXB0b3JGb3JUeXBlfS4KLSAgICovCi0gIERlc2NyaXB0b3JzLlNlcnZpY2VEZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjY2FsbE1ldGhvZH0sIGV4Y2VwdCB0aGF0Ci0gICAqIHtAY29kZSBjYWxsQmxvY2tpbmdNZXRob2QoKX0gcmV0dXJucyB0aGUgcmVzdWx0IG9mIHRoZSBSUEMgb3IgdGhyb3dzIGEKLSAgICoge0BsaW5rIFNlcnZpY2VFeGNlcHRpb259IGlmIHRoZXJlIGlzIGEgZmFpbHVyZSwgcmF0aGVyIHRoYW4gcGFzc2luZyB0aGUKLSAgICogaW5mb3JtYXRpb24gdG8gYSBjYWxsYmFjay4KLSAgICovCi0gIE1lc3NhZ2UgY2FsbEJsb2NraW5nTWV0aG9kKERlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3IgbWV0aG9kLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVxdWVzdCkgdGhyb3dzIFNlcnZpY2VFeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIEVxdWl2YWxlbnQgdG8ge0BsaW5rIFNlcnZpY2UjZ2V0UmVxdWVzdFByb3RvdHlwZX0uCi0gICAqLwotICBNZXNzYWdlIGdldFJlcXVlc3RQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOwotCi0gIC8qKgotICAgKiBFcXVpdmFsZW50IHRvIHtAbGluayBTZXJ2aWNlI2dldFJlc3BvbnNlUHJvdG90eXBlfS4KLSAgICovCi0gIE1lc3NhZ2UgZ2V0UmVzcG9uc2VQcm90b3R5cGUoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmcuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9CeXRlU3RyaW5nLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDkxMzU2MzUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0J5dGVTdHJpbmcuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQwMyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWx0ZXJPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uOwotaW1wb3J0IGphdmEubmlvLkJ5dGVCdWZmZXI7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogSW1tdXRhYmxlIGFycmF5IG9mIGJ5dGVzLgotICoKLSAqIEBhdXRob3IgY3Jhenlib2JAZ29vZ2xlLmNvbSBCb2IgTGVlCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQnl0ZVN0cmluZyB7Ci0gIHByaXZhdGUgZmluYWwgYnl0ZVtdIGJ5dGVzOwotCi0gIHByaXZhdGUgQnl0ZVN0cmluZyhmaW5hbCBieXRlW10gYnl0ZXMpIHsKLSAgICB0aGlzLmJ5dGVzID0gYnl0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgYnl0ZSBhdCB0aGUgZ2l2ZW4gaW5kZXguCi0gICAqCi0gICAqIEB0aHJvd3MgQXJyYXlJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uIHtAY29kZSBpbmRleH0gaXMgPCAwIG9yID49IHNpemUKLSAgICovCi0gIHB1YmxpYyBieXRlIGJ5dGVBdChmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICByZXR1cm4gYnl0ZXNbaW5kZXhdOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIG51bWJlciBvZiBieXRlcy4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gYnl0ZXMubGVuZ3RoOwotICB9Ci0KLSAgLyoqCi0gICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBzaXplIGlzIHtAY29kZSAwfSwge0Bjb2RlIGZhbHNlfSBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiBieXRlcy5sZW5ndGggPT0gMDsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIGJ5dGVbXSAtPiBCeXRlU3RyaW5nCi0KLSAgLyoqCi0gICAqIEVtcHR5IEJ5dGVTdHJpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIEJ5dGVTdHJpbmcgRU1QVFkgPSBuZXcgQnl0ZVN0cmluZyhuZXcgYnl0ZVswXSk7Ci0KLSAgLyoqCi0gICAqIENvcGllcyB0aGUgZ2l2ZW4gYnl0ZXMgaW50byBhIHtAY29kZSBCeXRlU3RyaW5nfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShmaW5hbCBieXRlW10gYnl0ZXMsIGZpbmFsIGludCBvZmZzZXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgc2l6ZSkgewotICAgIGZpbmFsIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgb2Zmc2V0LCBjb3B5LCAwLCBzaXplKTsKLSAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcoY29weSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29waWVzIHRoZSBnaXZlbiBieXRlcyBpbnRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKGZpbmFsIGJ5dGVbXSBieXRlcykgewotICAgIHJldHVybiBjb3B5RnJvbShieXRlcywgMCwgYnl0ZXMubGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb3BpZXMge0Bjb2RlIHNpemV9IGJ5dGVzIGZyb20gYSB7QGNvZGUgamF2YS5uaW8uQnl0ZUJ1ZmZlcn0gaW50bwotICAgKiBhIHtAY29kZSBCeXRlU3RyaW5nfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbShmaW5hbCBCeXRlQnVmZmVyIGJ5dGVzLCBmaW5hbCBpbnQgc2l6ZSkgewotICAgIGZpbmFsIGJ5dGVbXSBjb3B5ID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgYnl0ZXMuZ2V0KGNvcHkpOwotICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZyhjb3B5KTsKLSAgfQotCi0gIC8qKgotICAgKiBDb3BpZXMgdGhlIHJlbWFpbmluZyBieXRlcyBmcm9tIGEge0Bjb2RlIGphdmEubmlvLkJ5dGVCdWZmZXJ9IGludG8KLSAgICogYSB7QGNvZGUgQnl0ZVN0cmluZ30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oZmluYWwgQnl0ZUJ1ZmZlciBieXRlcykgewotICAgIHJldHVybiBjb3B5RnJvbShieXRlcywgYnl0ZXMucmVtYWluaW5nKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZXMge0Bjb2RlIHRleHR9IGludG8gYSBzZXF1ZW5jZSBvZiBieXRlcyB1c2luZyB0aGUgbmFtZWQgY2hhcnNldAotICAgKiBhbmQgcmV0dXJucyB0aGUgcmVzdWx0IGFzIGEge0Bjb2RlIEJ5dGVTdHJpbmd9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGNvcHlGcm9tKGZpbmFsIFN0cmluZyB0ZXh0LCBmaW5hbCBTdHJpbmcgY2hhcnNldE5hbWUpCi0gICAgICB0aHJvd3MgVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKHRleHQuZ2V0Qnl0ZXMoY2hhcnNldE5hbWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGVzIHtAY29kZSB0ZXh0fSBpbnRvIGEgc2VxdWVuY2Ugb2YgVVRGLTggYnl0ZXMgYW5kIHJldHVybnMgdGhlCi0gICAqIHJlc3VsdCBhcyBhIHtAY29kZSBCeXRlU3RyaW5nfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyBjb3B5RnJvbVV0ZjgoZmluYWwgU3RyaW5nIHRleHQpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKHRleHQuZ2V0Qnl0ZXMoIlVURi04IikpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQ/IiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIENvbmNhdGVuYXRlcyBhbGwgYnl0ZSBzdHJpbmdzIGluIHRoZSBsaXN0IGFuZCByZXR1cm5zIHRoZSByZXN1bHQuCi0gICAqCi0gICAqIDxwPlRoZSByZXR1cm5lZCB7QGNvZGUgQnl0ZVN0cmluZ30gaXMgbm90IG5lY2Vzc2FyaWx5IGEgdW5pcXVlIG9iamVjdC4KLSAgICogSWYgdGhlIGxpc3QgaXMgZW1wdHksIHRoZSByZXR1cm5lZCBvYmplY3QgaXMgdGhlIHNpbmdsZXRvbiBlbXB0eQotICAgKiB7QGNvZGUgQnl0ZVN0cmluZ30uICBJZiB0aGUgbGlzdCBoYXMgb25seSBvbmUgZWxlbWVudCwgdGhhdAotICAgKiB7QGNvZGUgQnl0ZVN0cmluZ30gd2lsbCBiZSByZXR1cm5lZCB3aXRob3V0IGNvcHlpbmcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIEJ5dGVTdHJpbmcgY29weUZyb20oTGlzdDxCeXRlU3RyaW5nPiBsaXN0KSB7Ci0gICAgaWYgKGxpc3Quc2l6ZSgpID09IDApIHsKLSAgICAgIHJldHVybiBFTVBUWTsKLSAgICB9IGVsc2UgaWYgKGxpc3Quc2l6ZSgpID09IDEpIHsKLSAgICAgIHJldHVybiBsaXN0LmdldCgwKTsKLSAgICB9Ci0KLSAgICBpbnQgc2l6ZSA9IDA7Ci0gICAgZm9yIChCeXRlU3RyaW5nIHN0ciA6IGxpc3QpIHsKLSAgICAgIHNpemUgKz0gc3RyLnNpemUoKTsKLSAgICB9Ci0gICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgZm9yIChCeXRlU3RyaW5nIHN0ciA6IGxpc3QpIHsKLSAgICAgIFN5c3RlbS5hcnJheWNvcHkoc3RyLmJ5dGVzLCAwLCBieXRlcywgcG9zLCBzdHIuc2l6ZSgpKTsKLSAgICAgIHBvcyArPSBzdHIuc2l6ZSgpOwotICAgIH0KLSAgICByZXR1cm4gbmV3IEJ5dGVTdHJpbmcoYnl0ZXMpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gQnl0ZVN0cmluZyAtPiBieXRlW10KLQotICAvKioKLSAgICogQ29waWVzIGJ5dGVzIGludG8gYSBidWZmZXIgYXQgdGhlIGdpdmVuIG9mZnNldC4KLSAgICoKLSAgICogQHBhcmFtIHRhcmdldCBidWZmZXIgdG8gY29weSBpbnRvCi0gICAqIEBwYXJhbSBvZmZzZXQgaW4gdGhlIHRhcmdldCBidWZmZXIKLSAgICovCi0gIHB1YmxpYyB2b2lkIGNvcHlUbyhmaW5hbCBieXRlW10gdGFyZ2V0LCBmaW5hbCBpbnQgb2Zmc2V0KSB7Ci0gICAgU3lzdGVtLmFycmF5Y29weShieXRlcywgMCwgdGFyZ2V0LCBvZmZzZXQsIGJ5dGVzLmxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogQ29waWVzIGJ5dGVzIGludG8gYSBidWZmZXIuCi0gICAqCi0gICAqIEBwYXJhbSB0YXJnZXQgYnVmZmVyIHRvIGNvcHkgaW50bwotICAgKiBAcGFyYW0gc291cmNlT2Zmc2V0IG9mZnNldCB3aXRoaW4gdGhlc2UgYnl0ZXMKLSAgICogQHBhcmFtIHRhcmdldE9mZnNldCBvZmZzZXQgd2l0aGluIHRoZSB0YXJnZXQgYnVmZmVyCi0gICAqIEBwYXJhbSBzaXplIG51bWJlciBvZiBieXRlcyB0byBjb3B5Ci0gICAqLwotICBwdWJsaWMgdm9pZCBjb3B5VG8oZmluYWwgYnl0ZVtdIHRhcmdldCwgZmluYWwgaW50IHNvdXJjZU9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB0YXJnZXRPZmZzZXQsCi0gICAgICBmaW5hbCBpbnQgc2l6ZSkgewotICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIHNvdXJjZU9mZnNldCwgdGFyZ2V0LCB0YXJnZXRPZmZzZXQsIHNpemUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvcGllcyBieXRlcyBpbnRvIGEgQnl0ZUJ1ZmZlci4KLSAgICoKLSAgICogQHBhcmFtIHRhcmdldCBCeXRlQnVmZmVyIHRvIGNvcHkgaW50by4KLSAgICogQHRocm93cyBSZWFkT25seUJ1ZmZlckV4Y2VwdGlvbiBpZiB0aGUge0Bjb2RlIHRhcmdldH0gaXMgcmVhZC1vbmx5Ci0gICAqIEB0aHJvd3MgQnVmZmVyT3ZlcmZsb3dFeGNlcHRpb24gaWYgdGhlIHtAY29kZSB0YXJnZXR9J3MgcmVtYWluaW5nKCkKLSAgICogICAgICAgICBzcGFjZSBpcyBub3QgbGFyZ2UgZW5vdWdoIHRvIGhvbGQgdGhlIGRhdGEuCi0gICAqLwotICBwdWJsaWMgdm9pZCBjb3B5VG8oQnl0ZUJ1ZmZlciB0YXJnZXQpIHsKLSAgICB0YXJnZXQucHV0KGJ5dGVzLCAwLCBieXRlcy5sZW5ndGgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvcGllcyBieXRlcyB0byBhIHtAY29kZSBieXRlW119LgotICAgKi8KLSAgcHVibGljIGJ5dGVbXSB0b0J5dGVBcnJheSgpIHsKLSAgICBmaW5hbCBpbnQgc2l6ZSA9IGJ5dGVzLmxlbmd0aDsKLSAgICBmaW5hbCBieXRlW10gY29weSA9IG5ldyBieXRlW3NpemVdOwotICAgIFN5c3RlbS5hcnJheWNvcHkoYnl0ZXMsIDAsIGNvcHksIDAsIHNpemUpOwotICAgIHJldHVybiBjb3B5OwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcgcmVhZC1vbmx5IHtAY29kZSBqYXZhLm5pby5CeXRlQnVmZmVyfSB3aXRoIHRoZQotICAgKiBzYW1lIGJhY2tpbmcgYnl0ZSBhcnJheS4KLSAgICovCi0gIHB1YmxpYyBCeXRlQnVmZmVyIGFzUmVhZE9ubHlCeXRlQnVmZmVyKCkgewotICAgIGZpbmFsIEJ5dGVCdWZmZXIgYnl0ZUJ1ZmZlciA9IEJ5dGVCdWZmZXIud3JhcChieXRlcyk7Ci0gICAgcmV0dXJuIGJ5dGVCdWZmZXIuYXNSZWFkT25seUJ1ZmZlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBuZXcge0Bjb2RlIFN0cmluZ30gYnkgZGVjb2RpbmcgdGhlIGJ5dGVzIHVzaW5nIHRoZQotICAgKiBzcGVjaWZpZWQgY2hhcnNldC4KLSAgICovCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoZmluYWwgU3RyaW5nIGNoYXJzZXROYW1lKQotICAgICAgdGhyb3dzIFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gewotICAgIHJldHVybiBuZXcgU3RyaW5nKGJ5dGVzLCBjaGFyc2V0TmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyB7QGNvZGUgU3RyaW5nfSBieSBkZWNvZGluZyB0aGUgYnl0ZXMgYXMgVVRGLTguCi0gICAqLwotICBwdWJsaWMgU3RyaW5nIHRvU3RyaW5nVXRmOCgpIHsKLSAgICB0cnkgewotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcoYnl0ZXMsICJVVEYtOCIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oIlVURi04IG5vdCBzdXBwb3J0ZWQ/IiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gPT0gdGhpcykgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotCi0gICAgaWYgKCEobyBpbnN0YW5jZW9mIEJ5dGVTdHJpbmcpKSB7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgZmluYWwgQnl0ZVN0cmluZyBvdGhlciA9IChCeXRlU3RyaW5nKSBvOwotICAgIGZpbmFsIGludCBzaXplID0gYnl0ZXMubGVuZ3RoOwotICAgIGlmIChzaXplICE9IG90aGVyLmJ5dGVzLmxlbmd0aCkgewotICAgICAgcmV0dXJuIGZhbHNlOwotICAgIH0KLQotICAgIGZpbmFsIGJ5dGVbXSB0aGlzQnl0ZXMgPSBieXRlczsKLSAgICBmaW5hbCBieXRlW10gb3RoZXJCeXRlcyA9IG90aGVyLmJ5dGVzOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICBpZiAodGhpc0J5dGVzW2ldICE9IG90aGVyQnl0ZXNbaV0pIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHJldHVybiB0cnVlOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2xhdGlsZSBpbnQgaGFzaCA9IDA7Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgaW50IGggPSBoYXNoOwotCi0gICAgaWYgKGggPT0gMCkgewotICAgICAgZmluYWwgYnl0ZVtdIHRoaXNCeXRlcyA9IGJ5dGVzOwotICAgICAgZmluYWwgaW50IHNpemUgPSBieXRlcy5sZW5ndGg7Ci0KLSAgICAgIGggPSBzaXplOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKLSAgICAgICAgaCA9IGggKiAzMSArIHRoaXNCeXRlc1tpXTsKLSAgICAgIH0KLSAgICAgIGlmIChoID09IDApIHsKLSAgICAgICAgaCA9IDE7Ci0gICAgICB9Ci0KLSAgICAgIGhhc2ggPSBoOwotICAgIH0KLQotICAgIHJldHVybiBoOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gSW5wdXQgc3RyZWFtCi0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYW4ge0Bjb2RlIElucHV0U3RyZWFtfSB3aGljaCBjYW4gYmUgdXNlZCB0byByZWFkIHRoZSBieXRlcy4KLSAgICovCi0gIHB1YmxpYyBJbnB1dFN0cmVhbSBuZXdJbnB1dCgpIHsKLSAgICByZXR1cm4gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJ5dGVzKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEge0BsaW5rIENvZGVkSW5wdXRTdHJlYW19IHdoaWNoIGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIGJ5dGVzLgotICAgKiBVc2luZyB0aGlzIGlzIG1vcmUgZWZmaWNpZW50IHRoYW4gY3JlYXRpbmcgYSB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbX0KLSAgICogd3JhcHBpbmcgdGhlIHJlc3VsdCBvZiB7QGxpbmsgI25ld0lucHV0KCl9LgotICAgKi8KLSAgcHVibGljIENvZGVkSW5wdXRTdHJlYW0gbmV3Q29kZWRJbnB1dCgpIHsKLSAgICAvLyBXZSB0cnVzdCBDb2RlZElucHV0U3RyZWFtIG5vdCB0byBtb2RpZnkgdGhlIGJ5dGVzLCBvciB0byBnaXZlIGFueW9uZQotICAgIC8vIGVsc2UgYWNjZXNzIHRvIHRoZW0uCi0gICAgcmV0dXJuIENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoYnl0ZXMpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gT3V0cHV0IHN0cmVhbQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IHtAbGluayBPdXRwdXR9IHdpdGggdGhlIGdpdmVuIGluaXRpYWwgY2FwYWNpdHkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE91dHB1dCBuZXdPdXRwdXQoZmluYWwgaW50IGluaXRpYWxDYXBhY2l0eSkgewotICAgIHJldHVybiBuZXcgT3V0cHV0KG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oaW5pdGlhbENhcGFjaXR5KSk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlcyBhIG5ldyB7QGxpbmsgT3V0cHV0fS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgT3V0cHV0IG5ld091dHB1dCgpIHsKLSAgICByZXR1cm4gbmV3T3V0cHV0KDMyKTsKLSAgfQotCi0gIC8qKgotICAgKiBPdXRwdXRzIHRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLiBDYWxsIHtAbGluayAjdG9CeXRlU3RyaW5nKCl9IHRvCi0gICAqIGNyZWF0ZSB0aGUge0Bjb2RlIEJ5dGVTdHJpbmd9IGluc3RhbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBPdXRwdXQgZXh0ZW5kcyBGaWx0ZXJPdXRwdXRTdHJlYW0gewotICAgIHByaXZhdGUgZmluYWwgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJvdXQ7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3RzIGEgbmV3IG91dHB1dCB3aXRoIHRoZSBnaXZlbiBpbml0aWFsIGNhcGFjaXR5LgotICAgICAqLwotICAgIHByaXZhdGUgT3V0cHV0KGZpbmFsIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBib3V0KSB7Ci0gICAgICBzdXBlcihib3V0KTsKLSAgICAgIHRoaXMuYm91dCA9IGJvdXQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyBhIHtAY29kZSBCeXRlU3RyaW5nfSBpbnN0YW5jZSBmcm9tIHRoaXMge0Bjb2RlIE91dHB1dH0uCi0gICAgICovCi0gICAgcHVibGljIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgewotICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVBcnJheSA9IGJvdXQudG9CeXRlQXJyYXkoKTsKLSAgICAgIHJldHVybiBuZXcgQnl0ZVN0cmluZyhieXRlQXJyYXkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IEJ5dGVTdHJpbmcgYnVpbGRlciwgd2hpY2ggYWxsb3dzIHlvdSB0byBlZmZpY2llbnRseQotICAgKiBjb25zdHJ1Y3QgYSB7QGNvZGUgQnl0ZVN0cmluZ30gYnkgd3JpdGluZyB0byBhIHtAbGluayBDb2RlZE91dHB1dFN0cmVhbX0uCi0gICAqIFVzaW5nIHRoaXMgaXMgbXVjaCBtb3JlIGVmZmljaWVudCB0aGFuIGNhbGxpbmcge0Bjb2RlIG5ld091dHB1dCgpfSBhbmQKLSAgICogd3JhcHBpbmcgdGhhdCBpbiBhIHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0uCi0gICAqCi0gICAqIDxwPlRoaXMgaXMgcGFja2FnZS1wcml2YXRlIGJlY2F1c2UgaXQncyBhIHNvbWV3aGF0IGNvbmZ1c2luZyBpbnRlcmZhY2UuCi0gICAqIFVzZXJzIGNhbiBjYWxsIHtAbGluayBNZXNzYWdlI3RvQnl0ZVN0cmluZygpfSBpbnN0ZWFkIG9mIGNhbGxpbmcgdGhpcwotICAgKiBkaXJlY3RseS4KLSAgICoKLSAgICogQHBhcmFtIHNpemUgVGhlIHRhcmdldCBieXRlIHNpemUgb2YgdGhlIHtAY29kZSBCeXRlU3RyaW5nfS4gIFlvdSBtdXN0Ci0gICAqICAgICAgICAgICAgIHdyaXRlIGV4YWN0bHkgdGhpcyBtYW55IGJ5dGVzIGJlZm9yZSBidWlsZGluZyB0aGUgcmVzdWx0LgotICAgKi8KLSAgc3RhdGljIENvZGVkQnVpbGRlciBuZXdDb2RlZEJ1aWxkZXIoZmluYWwgaW50IHNpemUpIHsKLSAgICByZXR1cm4gbmV3IENvZGVkQnVpbGRlcihzaXplKTsKLSAgfQotCi0gIC8qKiBTZWUge0BsaW5rIEJ5dGVTdHJpbmcjbmV3Q29kZWRCdWlsZGVyKGludCl9LiAqLwotICBzdGF0aWMgZmluYWwgY2xhc3MgQ29kZWRCdWlsZGVyIHsKLSAgICBwcml2YXRlIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dDsKLSAgICBwcml2YXRlIGZpbmFsIGJ5dGVbXSBidWZmZXI7Ci0KLSAgICBwcml2YXRlIENvZGVkQnVpbGRlcihmaW5hbCBpbnQgc2l6ZSkgewotICAgICAgYnVmZmVyID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShidWZmZXIpOwotICAgIH0KLQotICAgIHB1YmxpYyBCeXRlU3RyaW5nIGJ1aWxkKCkgewotICAgICAgb3V0cHV0LmNoZWNrTm9TcGFjZUxlZnQoKTsKLQotICAgICAgLy8gV2UgY2FuIGJlIGNvbmZpZGVudCB0aGF0IHRoZSBDb2RlZE91dHB1dFN0cmVhbSB3aWxsIG5vdCBtb2RpZnkgdGhlCi0gICAgICAvLyB1bmRlcmx5aW5nIGJ5dGVzIGFueW1vcmUgYmVjYXVzZSBpdCBhbHJlYWR5IHdyb3RlIGFsbCBvZiB0aGVtLiAgU28sCi0gICAgICAvLyBubyBuZWVkIHRvIG1ha2UgYSBjb3B5LgotICAgICAgcmV0dXJuIG5ldyBCeXRlU3RyaW5nKGJ1ZmZlcik7Ci0gICAgfQotCi0gICAgcHVibGljIENvZGVkT3V0cHV0U3RyZWFtIGdldENvZGVkT3V0cHV0KCkgewotICAgICAgcmV0dXJuIG91dHB1dDsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRJbnB1dFN0cmVhbS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2UwODU1Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4ODUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogUmVhZHMgYW5kIGRlY29kZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuCi0gKgotICogVGhpcyBjbGFzcyBjb250YWlucyB0d28ga2luZHMgb2YgbWV0aG9kczogIG1ldGhvZHMgdGhhdCByZWFkIHNwZWNpZmljCi0gKiBwcm90b2NvbCBtZXNzYWdlIGNvbnN0cnVjdHMgYW5kIGZpZWxkIHR5cGVzIChlLmcuIHtAbGluayAjcmVhZFRhZygpfSBhbmQKLSAqIHtAbGluayAjcmVhZEludDMyKCl9KSBhbmQgbWV0aG9kcyB0aGF0IHJlYWQgbG93LWxldmVsIHZhbHVlcyAoZS5nLgotICoge0BsaW5rICNyZWFkUmF3VmFyaW50MzIoKX0gYW5kIHtAbGluayAjcmVhZFJhd0J5dGVzfSkuICBJZiB5b3UgYXJlIHJlYWRpbmcKLSAqIGVuY29kZWQgcHJvdG9jb2wgbWVzc2FnZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBmb3JtZXIgbWV0aG9kcywgYnV0IGlmIHlvdSBhcmUKLSAqIHJlYWRpbmcgc29tZSBvdGhlciBmb3JtYXQgb2YgeW91ciBvd24gZGVzaWduLCB1c2UgdGhlIGxhdHRlci4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbSB7Ci0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSB3cmFwcGluZyB0aGUgZ2l2ZW4gSW5wdXRTdHJlYW0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENvZGVkSW5wdXRTdHJlYW0gbmV3SW5zdGFuY2UoZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHsKLSAgICByZXR1cm4gbmV3IENvZGVkSW5wdXRTdHJlYW0oaW5wdXQpOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyBDb2RlZElucHV0U3RyZWFtIHdyYXBwaW5nIHRoZSBnaXZlbiBieXRlIGFycmF5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZElucHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBidWYpIHsKLSAgICByZXR1cm4gbmV3SW5zdGFuY2UoYnVmLCAwLCBidWYubGVuZ3RoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcgQ29kZWRJbnB1dFN0cmVhbSB3cmFwcGluZyB0aGUgZ2l2ZW4gYnl0ZSBhcnJheSBzbGljZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQ29kZWRJbnB1dFN0cmVhbSBuZXdJbnN0YW5jZShmaW5hbCBieXRlW10gYnVmLCBmaW5hbCBpbnQgb2ZmLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGxlbikgewotICAgIENvZGVkSW5wdXRTdHJlYW0gcmVzdWx0ID0gbmV3IENvZGVkSW5wdXRTdHJlYW0oYnVmLCBvZmYsIGxlbik7Ci0gICAgdHJ5IHsKLSAgICAgIC8vIFNvbWUgdXNlcyBvZiBDb2RlZElucHV0U3RyZWFtIGNhbiBiZSBtb3JlIGVmZmljaWVudCBpZiB0aGV5IGtub3cKLSAgICAgIC8vIGV4YWN0bHkgaG93IG1hbnkgYnl0ZXMgYXJlIGF2YWlsYWJsZS4gIEJ5IHB1c2hpbmcgdGhlIGVuZCBwb2ludCBvZiB0aGUKLSAgICAgIC8vIGJ1ZmZlciBhcyBhIGxpbWl0LCB3ZSBhbGxvdyB0aGVtIHRvIGdldCB0aGlzIGluZm9ybWF0aW9uIHZpYQotICAgICAgLy8gZ2V0Qnl0ZXNVbnRpbExpbWl0KCkuICBQdXNoaW5nIGEgbGltaXQgdGhhdCB3ZSBrbm93IGlzIGF0IHRoZSBlbmQgb2YKLSAgICAgIC8vIHRoZSBzdHJlYW0gY2FuIG5ldmVyIGh1cnQsIHNpbmNlIHdlIGNhbiBuZXZlciBwYXN0IHRoYXQgcG9pbnQgYW55d2F5LgotICAgICAgcmVzdWx0LnB1c2hMaW1pdChsZW4pOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleCkgewotICAgICAgLy8gVGhlIG9ubHkgcmVhc29uIHB1c2hMaW1pdCgpIG1pZ2h0IHRocm93IGFuIGV4Y2VwdGlvbiBoZXJlIGlzIGlmIGxlbgotICAgICAgLy8gaXMgbmVnYXRpdmUuIE5vcm1hbGx5IHB1c2hMaW1pdCgpJ3MgcGFyYW1ldGVyIGNvbWVzIGRpcmVjdGx5IG9mZiB0aGUKLSAgICAgIC8vIHdpcmUsIHNvIGl0J3MgaW1wb3J0YW50IHRvIGNhdGNoIGV4Y2VwdGlvbnMgaW4gY2FzZSBvZiBjb3JydXB0IG9yCi0gICAgICAvLyBtYWxpY2lvdXMgZGF0YS4gSG93ZXZlciwgaW4gdGhpcyBjYXNlLCB3ZSBleHBlY3QgdGhhdCBsZW4gaXMgbm90IGEKLSAgICAgIC8vIHVzZXItc3VwcGxpZWQgdmFsdWUsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCBpdCBiZWluZyBuZWdhdGl2ZSBpbmRpY2F0ZXMKLSAgICAgIC8vIGEgcHJvZ3JhbW1pbmcgZXJyb3IuIFRoZXJlZm9yZSwgdGhyb3dpbmcgYW4gdW5jaGVja2VkIGV4Y2VwdGlvbiBpcwotICAgICAgLy8gYXBwcm9wcmlhdGUuCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKGV4KTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIEF0dGVtcHQgdG8gcmVhZCBhIGZpZWxkIHRhZywgcmV0dXJuaW5nIHplcm8gaWYgd2UgaGF2ZSByZWFjaGVkIEVPRi4KLSAgICogUHJvdG9jb2wgbWVzc2FnZSBwYXJzZXJzIHVzZSB0aGlzIHRvIHJlYWQgdGFncywgc2luY2UgYSBwcm90b2NvbCBtZXNzYWdlCi0gICAqIG1heSBsZWdhbGx5IGVuZCB3aGVyZXZlciBhIHRhZyBvY2N1cnMsIGFuZCB6ZXJvIGlzIG5vdCBhIHZhbGlkIHRhZyBudW1iZXIuCi0gICAqLwotICBwdWJsaWMgaW50IHJlYWRUYWcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChpc0F0RW5kKCkpIHsKLSAgICAgIGxhc3RUYWcgPSAwOwotICAgICAgcmV0dXJuIDA7Ci0gICAgfQotCi0gICAgbGFzdFRhZyA9IHJlYWRSYXdWYXJpbnQzMigpOwotICAgIGlmIChXaXJlRm9ybWF0LmdldFRhZ0ZpZWxkTnVtYmVyKGxhc3RUYWcpID09IDApIHsKLSAgICAgIC8vIElmIHdlIGFjdHVhbGx5IHJlYWQgemVybyAob3IgYW55IHRhZyBudW1iZXIgY29ycmVzcG9uZGluZyB0byBmaWVsZAotICAgICAgLy8gbnVtYmVyIHplcm8pLCB0aGF0J3Mgbm90IGEgdmFsaWQgdGFnLgotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRUYWcoKTsKLSAgICB9Ci0gICAgcmV0dXJuIGxhc3RUYWc7Ci0gIH0KLQotICAvKioKLSAgICogVmVyaWZpZXMgdGhhdCB0aGUgbGFzdCBjYWxsIHRvIHJlYWRUYWcoKSByZXR1cm5lZCB0aGUgZ2l2ZW4gdGFnIHZhbHVlLgotICAgKiBUaGlzIGlzIHVzZWQgdG8gdmVyaWZ5IHRoYXQgYSBuZXN0ZWQgZ3JvdXAgZW5kZWQgd2l0aCB0aGUgY29ycmVjdAotICAgKiBlbmQgdGFnLgotICAgKgotICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7QGNvZGUgdmFsdWV9IGRvZXMgbm90IG1hdGNoIHRoZQotICAgKiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IHRhZy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoZWNrTGFzdFRhZ1dhcyhmaW5hbCBpbnQgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICBpZiAobGFzdFRhZyAhPSB2YWx1ZSkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmludmFsaWRFbmRUYWcoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYW5kIGRpc2NhcmRzIGEgc2luZ2xlIGZpZWxkLCBnaXZlbiBpdHMgdGFnIHZhbHVlLgotICAgKgotICAgKiBAcmV0dXJuIHtAY29kZSBmYWxzZX0gaWYgdGhlIHRhZyBpcyBhbiBlbmRncm91cCB0YWcsIGluIHdoaWNoIGNhc2UKLSAgICogICAgICAgICBub3RoaW5nIGlzIHNraXBwZWQuICBPdGhlcndpc2UsIHJldHVybnMge0Bjb2RlIHRydWV9LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gc2tpcEZpZWxkKGZpbmFsIGludCB0YWcpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6Ci0gICAgICAgIHJlYWRJbnQzMigpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0OgotICAgICAgICByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgc2tpcFJhd0J5dGVzKHJlYWRSYXdWYXJpbnQzMigpKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6Ci0gICAgICAgIHNraXBNZXNzYWdlKCk7Ci0gICAgICAgIGNoZWNrTGFzdFRhZ1dhcygKLSAgICAgICAgICBXaXJlRm9ybWF0Lm1ha2VUYWcoV2lyZUZvcm1hdC5nZXRUYWdGaWVsZE51bWJlcih0YWcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgotICAgICAgICByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uaW52YWxpZFdpcmVUeXBlKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGFuZCBkaXNjYXJkcyBhbiBlbnRpcmUgbWVzc2FnZS4gIFRoaXMgd2lsbCByZWFkIGVpdGhlciB1bnRpbCBFT0YKLSAgICogb3IgdW50aWwgYW4gZW5kZ3JvdXAgdGFnLCB3aGljaGV2ZXIgY29tZXMgZmlyc3QuCi0gICAqLwotICBwdWJsaWMgdm9pZCBza2lwTWVzc2FnZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGZpbmFsIGludCB0YWcgPSByZWFkVGFnKCk7Ci0gICAgICBpZiAodGFnID09IDAgfHwgIXNraXBGaWVsZCh0YWcpKSB7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGRvdWJsZX0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZG91YmxlIHJlYWREb3VibGUoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBEb3VibGUubG9uZ0JpdHNUb0RvdWJsZShyZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSk7Ci0gIH0KLQotICAvKiogUmVhZCBhIHtAY29kZSBmbG9hdH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgZmxvYXQgcmVhZEZsb2F0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gRmxvYXQuaW50Qml0c1RvRmxvYXQocmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgdWludDY0fSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBsb25nIHJlYWRVSW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3VmFyaW50NjQoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIHtAY29kZSBpbnQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkSW50NjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3VmFyaW50NjQoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIHtAY29kZSBpbnQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgaW50IHJlYWRJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMigpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgZml4ZWQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkRml4ZWQ2NCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgZml4ZWQzMn0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgaW50IHJlYWRGaXhlZDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd0xpdHRsZUVuZGlhbjMyKCk7Ci0gIH0KLQotICAvKiogUmVhZCBhIHtAY29kZSBib29sfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBib29sZWFuIHJlYWRCb29sKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCkgIT0gMDsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIHN0cmluZ30gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgU3RyaW5nIHJlYWRTdHJpbmcoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBzaXplID0gcmVhZFJhd1ZhcmludDMyKCk7Ci0gICAgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpICYmIHNpemUgPiAwKSB7Ci0gICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCi0gICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0LgotICAgICAgZmluYWwgU3RyaW5nIHJlc3VsdCA9IG5ldyBTdHJpbmcoYnVmZmVyLCBidWZmZXJQb3MsIHNpemUsICJVVEYtOCIpOwotICAgICAgYnVmZmVyUG9zICs9IHNpemU7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBTbG93IHBhdGg6ICBCdWlsZCBhIGJ5dGUgYXJyYXkgZmlyc3QgdGhlbiBjb3B5IGl0LgotICAgICAgcmV0dXJuIG5ldyBTdHJpbmcocmVhZFJhd0J5dGVzKHNpemUpLCAiVVRGLTgiKTsKLSAgICB9Ci0gIH0KLQotICAvKiogUmVhZCBhIHtAY29kZSBncm91cH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCByZWFkR3JvdXAoZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAocmVjdXJzaW9uRGVwdGggPj0gcmVjdXJzaW9uTGltaXQpIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5yZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7Ci0gICAgfQotICAgICsrcmVjdXJzaW9uRGVwdGg7Ci0gICAgYnVpbGRlci5tZXJnZUZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGNoZWNrTGFzdFRhZ1dhcygKLSAgICAgIFdpcmVGb3JtYXQubWFrZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApKTsKLSAgICAtLXJlY3Vyc2lvbkRlcHRoOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWRzIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0gYW5kIG1lcmdlcyBpdCBpbnRvIHRoZQotICAgKiBnaXZlbiB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fS4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUuQnVpbGRlciwgc28KLSAgICogICAgICAgICAgICAgeW91IGNhbiBqdXN0IGNhbGwge0BsaW5rICNyZWFkR3JvdXB9LgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgcmVhZFVua25vd25Hcm91cChmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyKQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBXZSBrbm93IHRoYXQgVW5rbm93bkZpZWxkU2V0IHdpbGwgaWdub3JlIGFueSBFeHRlbnNpb25SZWdpc3RyeSBzbyBpdAotICAgIC8vIGlzIHNhZmUgdG8gcGFzcyBudWxsIGhlcmUuICAoV2UgY2FuJ3QgY2FsbAotICAgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5LmdldEVtcHR5UmVnaXN0cnkoKSBiZWNhdXNlIHRoYXQgd291bGQgbWFrZSB0aGlzCi0gICAgLy8gY2xhc3MgZGVwZW5kIG9uIEV4dGVuc2lvblJlZ2lzdHJ5LCB3aGljaCBpcyBub3QgcGFydCBvZiB0aGUgbGl0ZQotICAgIC8vIGxpYnJhcnkuKQotICAgIHJlYWRHcm91cChmaWVsZE51bWJlciwgYnVpbGRlciwgbnVsbCk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgcmVhZE1lc3NhZ2UoZmluYWwgTWVzc2FnZUxpdGUuQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBsZW5ndGggPSByZWFkUmF3VmFyaW50MzIoKTsKLSAgICBpZiAocmVjdXJzaW9uRGVwdGggPj0gcmVjdXJzaW9uTGltaXQpIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5yZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCk7Ci0gICAgfQotICAgIGZpbmFsIGludCBvbGRMaW1pdCA9IHB1c2hMaW1pdChsZW5ndGgpOwotICAgICsrcmVjdXJzaW9uRGVwdGg7Ci0gICAgYnVpbGRlci5tZXJnZUZyb20odGhpcywgZXh0ZW5zaW9uUmVnaXN0cnkpOwotICAgIGNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAtLXJlY3Vyc2lvbkRlcHRoOwotICAgIHBvcExpbWl0KG9sZExpbWl0KTsKLSAgfQotCi0gIC8qKiBSZWFkIGEge0Bjb2RlIGJ5dGVzfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBCeXRlU3RyaW5nIHJlYWRCeXRlcygpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZmluYWwgaW50IHNpemUgPSByZWFkUmF3VmFyaW50MzIoKTsKLSAgICBpZiAoc2l6ZSA9PSAwKSB7Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5FTVBUWTsKLSAgICB9IGVsc2UgaWYgKHNpemUgPD0gKGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpICYmIHNpemUgPiAwKSB7Ci0gICAgICAvLyBGYXN0IHBhdGg6ICBXZSBhbHJlYWR5IGhhdmUgdGhlIGJ5dGVzIGluIGEgY29udGlndW91cyBidWZmZXIsIHNvCi0gICAgICAvLyAgIGp1c3QgY29weSBkaXJlY3RseSBmcm9tIGl0LgotICAgICAgZmluYWwgQnl0ZVN0cmluZyByZXN1bHQgPSBCeXRlU3RyaW5nLmNvcHlGcm9tKGJ1ZmZlciwgYnVmZmVyUG9zLCBzaXplKTsKLSAgICAgIGJ1ZmZlclBvcyArPSBzaXplOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gU2xvdyBwYXRoOiAgQnVpbGQgYSBieXRlIGFycmF5IGZpcnN0IHRoZW4gY29weSBpdC4KLSAgICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKHJlYWRSYXdCeXRlcyhzaXplKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFJlYWQgYSB7QGNvZGUgdWludDMyfSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyBpbnQgcmVhZFVJbnQzMigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYW4gZW51bSBmaWVsZCB2YWx1ZSBmcm9tIHRoZSBzdHJlYW0uICBDYWxsZXIgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIGNvbnZlcnRpbmcgdGhlIG51bWVyaWMgdmFsdWUgdG8gYW4gYWN0dWFsIGVudW0uCi0gICAqLwotICBwdWJsaWMgaW50IHJlYWRFbnVtKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcmVhZFJhd1ZhcmludDMyKCk7Ci0gIH0KLQotICAvKiogUmVhZCBhbiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkU0ZpeGVkMzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkU0ZpeGVkNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKTsKLSAgfQotCi0gIC8qKiBSZWFkIGFuIHtAY29kZSBzaW50MzJ9IGZpZWxkIHZhbHVlIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkU0ludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gZGVjb2RlWmlnWmFnMzIocmVhZFJhd1ZhcmludDMyKCkpOwotICB9Ci0KLSAgLyoqIFJlYWQgYW4ge0Bjb2RlIHNpbnQ2NH0gZmllbGQgdmFsdWUgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkU0ludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gZGVjb2RlWmlnWmFnNjQocmVhZFJhd1ZhcmludDY0KCkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogUmVhZCBhIHJhdyBWYXJpbnQgZnJvbSB0aGUgc3RyZWFtLiAgSWYgbGFyZ2VyIHRoYW4gMzIgYml0cywgZGlzY2FyZCB0aGUKLSAgICogdXBwZXIgYml0cy4KLSAgICovCi0gIHB1YmxpYyBpbnQgcmVhZFJhd1ZhcmludDMyKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBieXRlIHRtcCA9IHJlYWRSYXdCeXRlKCk7Ci0gICAgaWYgKHRtcCA+PSAwKSB7Ci0gICAgICByZXR1cm4gdG1wOwotICAgIH0KLSAgICBpbnQgcmVzdWx0ID0gdG1wICYgMHg3ZjsKLSAgICBpZiAoKHRtcCA9IHJlYWRSYXdCeXRlKCkpID49IDApIHsKLSAgICAgIHJlc3VsdCB8PSB0bXAgPDwgNzsKLSAgICB9IGVsc2UgewotICAgICAgcmVzdWx0IHw9ICh0bXAgJiAweDdmKSA8PCA3OwotICAgICAgaWYgKCh0bXAgPSByZWFkUmF3Qnl0ZSgpKSA+PSAwKSB7Ci0gICAgICAgIHJlc3VsdCB8PSB0bXAgPDwgMTQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgfD0gKHRtcCAmIDB4N2YpIDw8IDE0OwotICAgICAgICBpZiAoKHRtcCA9IHJlYWRSYXdCeXRlKCkpID49IDApIHsKLSAgICAgICAgICByZXN1bHQgfD0gdG1wIDw8IDIxOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdCB8PSAodG1wICYgMHg3ZikgPDwgMjE7Ci0gICAgICAgICAgcmVzdWx0IHw9ICh0bXAgPSByZWFkUmF3Qnl0ZSgpKSA8PCAyODsKLSAgICAgICAgICBpZiAodG1wIDwgMCkgewotICAgICAgICAgICAgLy8gRGlzY2FyZCB1cHBlciAzMiBiaXRzLgotICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCA1OyBpKyspIHsKLSAgICAgICAgICAgICAgaWYgKHJlYWRSYXdCeXRlKCkgPj0gMCkgewotICAgICAgICAgICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5tYWxmb3JtZWRWYXJpbnQoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZWFkcyBhIHZhcmludCBmcm9tIHRoZSBpbnB1dCBvbmUgYnl0ZSBhdCBhIHRpbWUsIHNvIHRoYXQgaXQgZG9lcyBub3QKLSAgICogcmVhZCBhbnkgYnl0ZXMgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdmFyaW50LiAgSWYgeW91IHNpbXBseSB3cmFwcGVkIHRoZQotICAgKiBzdHJlYW0gaW4gYSBDb2RlZElucHV0U3RyZWFtIGFuZCB1c2VkIHtAbGluayAjcmVhZFJhd1ZhcmludDMyKElucHV0U3RyZWFtKX0KLSAgICogdGhlbiB5b3Ugd291bGQgcHJvYmFibHkgZW5kIHVwIHJlYWRpbmcgcGFzdCB0aGUgZW5kIG9mIHRoZSB2YXJpbnQgc2luY2UKLSAgICogQ29kZWRJbnB1dFN0cmVhbSBidWZmZXJzIGl0cyBpbnB1dC4KLSAgICovCi0gIHN0YXRpYyBpbnQgcmVhZFJhd1ZhcmludDMyKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGludCBmaXJzdEJ5dGUgPSBpbnB1dC5yZWFkKCk7Ci0gICAgaWYgKGZpcnN0Qnl0ZSA9PSAtMSkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0gICAgcmV0dXJuIHJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKLSAgfQotCi0gIC8qKgotICAgKiBMaWtlIHtAbGluayAjcmVhZFJhd1ZhcmludDMyKElucHV0U3RyZWFtKX0sIGJ1dCBleHBlY3RzIHRoYXQgdGhlIGNhbGxlcgotICAgKiBoYXMgYWxyZWFkeSByZWFkIG9uZSBieXRlLiAgVGhpcyBhbGxvd3MgdGhlIGNhbGxlciB0byBkZXRlcm1pbmUgaWYgRU9GCi0gICAqIGhhcyBiZWVuIHJlYWNoZWQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVhZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IHJlYWRSYXdWYXJpbnQzMigKLSAgICAgIGZpbmFsIGludCBmaXJzdEJ5dGUsIGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmICgoZmlyc3RCeXRlICYgMHg4MCkgPT0gMCkgewotICAgICAgcmV0dXJuIGZpcnN0Qnl0ZTsKLSAgICB9Ci0KLSAgICBpbnQgcmVzdWx0ID0gZmlyc3RCeXRlICYgMHg3ZjsKLSAgICBpbnQgb2Zmc2V0ID0gNzsKLSAgICBmb3IgKDsgb2Zmc2V0IDwgMzI7IG9mZnNldCArPSA3KSB7Ci0gICAgICBmaW5hbCBpbnQgYiA9IGlucHV0LnJlYWQoKTsKLSAgICAgIGlmIChiID09IC0xKSB7Ci0gICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCk7Ci0gICAgICB9Ci0gICAgICByZXN1bHQgfD0gKGIgJiAweDdmKSA8PCBvZmZzZXQ7Ci0gICAgICBpZiAoKGIgJiAweDgwKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotICAgIC8vIEtlZXAgcmVhZGluZyB1cCB0byA2NCBiaXRzLgotICAgIGZvciAoOyBvZmZzZXQgPCA2NDsgb2Zmc2V0ICs9IDcpIHsKLSAgICAgIGZpbmFsIGludCBiID0gaW5wdXQucmVhZCgpOwotICAgICAgaWYgKGIgPT0gLTEpIHsKLSAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICAgIH0KLSAgICAgIGlmICgoYiAmIDB4ODApID09IDApIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KLSAgICB9Ci0gICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSByYXcgVmFyaW50IGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGxvbmcgcmVhZFJhd1ZhcmludDY0KCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpbnQgc2hpZnQgPSAwOwotICAgIGxvbmcgcmVzdWx0ID0gMDsKLSAgICB3aGlsZSAoc2hpZnQgPCA2NCkgewotICAgICAgZmluYWwgYnl0ZSBiID0gcmVhZFJhd0J5dGUoKTsKLSAgICAgIHJlc3VsdCB8PSAobG9uZykoYiAmIDB4N0YpIDw8IHNoaWZ0OwotICAgICAgaWYgKChiICYgMHg4MCkgPT0gMCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotICAgICAgc2hpZnQgKz0gNzsKLSAgICB9Ci0gICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpOwotICB9Ci0KLSAgLyoqIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyIGZyb20gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIGludCByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGJ5dGUgYjEgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjIgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjMgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjQgPSByZWFkUmF3Qnl0ZSgpOwotICAgIHJldHVybiAoKChpbnQpYjEgJiAweGZmKSAgICAgICkgfAotICAgICAgICAgICAoKChpbnQpYjIgJiAweGZmKSA8PCAgOCkgfAotICAgICAgICAgICAoKChpbnQpYjMgJiAweGZmKSA8PCAxNikgfAotICAgICAgICAgICAoKChpbnQpYjQgJiAweGZmKSA8PCAyNCk7Ci0gIH0KLQotICAvKiogUmVhZCBhIDY0LWJpdCBsaXR0bGUtZW5kaWFuIGludGVnZXIgZnJvbSB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgbG9uZyByZWFkUmF3TGl0dGxlRW5kaWFuNjQoKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIGJ5dGUgYjEgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjIgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjMgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjQgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjUgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjYgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjcgPSByZWFkUmF3Qnl0ZSgpOwotICAgIGZpbmFsIGJ5dGUgYjggPSByZWFkUmF3Qnl0ZSgpOwotICAgIHJldHVybiAoKChsb25nKWIxICYgMHhmZikgICAgICApIHwKLSAgICAgICAgICAgKCgobG9uZyliMiAmIDB4ZmYpIDw8ICA4KSB8Ci0gICAgICAgICAgICgoKGxvbmcpYjMgJiAweGZmKSA8PCAxNikgfAotICAgICAgICAgICAoKChsb25nKWI0ICYgMHhmZikgPDwgMjQpIHwKLSAgICAgICAgICAgKCgobG9uZyliNSAmIDB4ZmYpIDw8IDMyKSB8Ci0gICAgICAgICAgICgoKGxvbmcpYjYgJiAweGZmKSA8PCA0MCkgfAotICAgICAgICAgICAoKChsb25nKWI3ICYgMHhmZikgPDwgNDgpIHwKLSAgICAgICAgICAgKCgobG9uZyliOCAmIDB4ZmYpIDw8IDU2KTsKLSAgfQotCi0gIC8qKgotICAgKiBEZWNvZGUgYSBaaWdaYWctZW5jb2RlZCAzMi1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKLSAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCi0gICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLSAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLSAgICoKLSAgICogQHBhcmFtIG4gQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQotICAgKiAgICAgICAgICBKYXZhIGhhcyBubyBleHBsaWNpdCB1bnNpZ25lZCBzdXBwb3J0LgotICAgKiBAcmV0dXJuIEEgc2lnbmVkIDMyLWJpdCBpbnRlZ2VyLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgZGVjb2RlWmlnWmFnMzIoZmluYWwgaW50IG4pIHsKLSAgICByZXR1cm4gKG4gPj4+IDEpIF4gLShuICYgMSk7Ci0gIH0KLQotICAvKioKLSAgICogRGVjb2RlIGEgWmlnWmFnLWVuY29kZWQgNjQtYml0IHZhbHVlLiAgWmlnWmFnIGVuY29kZXMgc2lnbmVkIGludGVnZXJzCi0gICAqIGludG8gdmFsdWVzIHRoYXQgY2FuIGJlIGVmZmljaWVudGx5IGVuY29kZWQgd2l0aCB2YXJpbnQuICAoT3RoZXJ3aXNlLAotICAgKiBuZWdhdGl2ZSB2YWx1ZXMgbXVzdCBiZSBzaWduLWV4dGVuZGVkIHRvIDY0IGJpdHMgdG8gYmUgdmFyaW50IGVuY29kZWQsCi0gICAqIHRodXMgYWx3YXlzIHRha2luZyAxMCBieXRlcyBvbiB0aGUgd2lyZS4pCi0gICAqCi0gICAqIEBwYXJhbSBuIEFuIHVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyLCBzdG9yZWQgaW4gYSBzaWduZWQgaW50IGJlY2F1c2UKLSAgICogICAgICAgICAgSmF2YSBoYXMgbm8gZXhwbGljaXQgdW5zaWduZWQgc3VwcG9ydC4KLSAgICogQHJldHVybiBBIHNpZ25lZCA2NC1iaXQgaW50ZWdlci4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBkZWNvZGVaaWdaYWc2NChmaW5hbCBsb25nIG4pIHsKLSAgICByZXR1cm4gKG4gPj4+IDEpIF4gLShuICYgMSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIHByaXZhdGUgZmluYWwgYnl0ZVtdIGJ1ZmZlcjsKLSAgcHJpdmF0ZSBpbnQgYnVmZmVyU2l6ZTsKLSAgcHJpdmF0ZSBpbnQgYnVmZmVyU2l6ZUFmdGVyTGltaXQ7Ci0gIHByaXZhdGUgaW50IGJ1ZmZlclBvczsKLSAgcHJpdmF0ZSBmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dDsKLSAgcHJpdmF0ZSBpbnQgbGFzdFRhZzsKLQotICAvKioKLSAgICogVGhlIHRvdGFsIG51bWJlciBvZiBieXRlcyByZWFkIGJlZm9yZSB0aGUgY3VycmVudCBidWZmZXIuICBUaGUgdG90YWwKLSAgICogYnl0ZXMgcmVhZCB1cCB0byB0aGUgY3VycmVudCBwb3NpdGlvbiBjYW4gYmUgY29tcHV0ZWQgYXMKLSAgICoge0Bjb2RlIHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyUG9zfS4gIFRoaXMgdmFsdWUgbWF5IGJlIG5lZ2F0aXZlIGlmCi0gICAqIHJlYWRpbmcgc3RhcnRlZCBpbiB0aGUgbWlkZGxlIG9mIHRoZSBjdXJyZW50IGJ1ZmZlciAoZS5nLiBpZiB0aGUKLSAgICogY29uc3RydWN0b3IgdGhhdCB0YWtlcyBhIGJ5dGUgYXJyYXkgYW5kIGFuIG9mZnNldCB3YXMgdXNlZCkuCi0gICAqLwotICBwcml2YXRlIGludCB0b3RhbEJ5dGVzUmV0aXJlZDsKLQotICAvKiogVGhlIGFic29sdXRlIHBvc2l0aW9uIG9mIHRoZSBlbmQgb2YgdGhlIGN1cnJlbnQgbWVzc2FnZS4gKi8KLSAgcHJpdmF0ZSBpbnQgY3VycmVudExpbWl0ID0gSW50ZWdlci5NQVhfVkFMVUU7Ci0KLSAgLyoqIFNlZSBzZXRSZWN1cnNpb25MaW1pdCgpICovCi0gIHByaXZhdGUgaW50IHJlY3Vyc2lvbkRlcHRoOwotICBwcml2YXRlIGludCByZWN1cnNpb25MaW1pdCA9IERFRkFVTFRfUkVDVVJTSU9OX0xJTUlUOwotCi0gIC8qKiBTZWUgc2V0U2l6ZUxpbWl0KCkgKi8KLSAgcHJpdmF0ZSBpbnQgc2l6ZUxpbWl0ID0gREVGQVVMVF9TSVpFX0xJTUlUOwotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBERUZBVUxUX1JFQ1VSU0lPTl9MSU1JVCA9IDY0OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9TSVpFX0xJTUlUID0gNjQgPDwgMjA7ICAvLyA2NE1CCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBCVUZGRVJfU0laRSA9IDQwOTY7Ci0KLSAgcHJpdmF0ZSBDb2RlZElucHV0U3RyZWFtKGZpbmFsIGJ5dGVbXSBidWZmZXIsIGZpbmFsIGludCBvZmYsIGZpbmFsIGludCBsZW4pIHsKLSAgICB0aGlzLmJ1ZmZlciA9IGJ1ZmZlcjsKLSAgICBidWZmZXJTaXplID0gb2ZmICsgbGVuOwotICAgIGJ1ZmZlclBvcyA9IG9mZjsKLSAgICB0b3RhbEJ5dGVzUmV0aXJlZCA9IC1vZmY7Ci0gICAgaW5wdXQgPSBudWxsOwotICB9Ci0KLSAgcHJpdmF0ZSBDb2RlZElucHV0U3RyZWFtKGZpbmFsIElucHV0U3RyZWFtIGlucHV0KSB7Ci0gICAgYnVmZmVyID0gbmV3IGJ5dGVbQlVGRkVSX1NJWkVdOwotICAgIGJ1ZmZlclNpemUgPSAwOwotICAgIGJ1ZmZlclBvcyA9IDA7Ci0gICAgdG90YWxCeXRlc1JldGlyZWQgPSAwOwotICAgIHRoaXMuaW5wdXQgPSBpbnB1dDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gbWVzc2FnZSByZWN1cnNpb24gZGVwdGguICBJbiBvcmRlciB0byBwcmV2ZW50IG1hbGljaW91cwotICAgKiBtZXNzYWdlcyBmcm9tIGNhdXNpbmcgc3RhY2sgb3ZlcmZsb3dzLCB7QGNvZGUgQ29kZWRJbnB1dFN0cmVhbX0gbGltaXRzCi0gICAqIGhvdyBkZWVwbHkgbWVzc2FnZXMgbWF5IGJlIG5lc3RlZC4gIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBvbGQgbGltaXQuCi0gICAqLwotICBwdWJsaWMgaW50IHNldFJlY3Vyc2lvbkxpbWl0KGZpbmFsIGludCBsaW1pdCkgewotICAgIGlmIChsaW1pdCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJSZWN1cnNpb24gbGltaXQgY2Fubm90IGJlIG5lZ2F0aXZlOiAiICsgbGltaXQpOwotICAgIH0KLSAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSByZWN1cnNpb25MaW1pdDsKLSAgICByZWN1cnNpb25MaW1pdCA9IGxpbWl0OwotICAgIHJldHVybiBvbGRMaW1pdDsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgdGhlIG1heGltdW0gbWVzc2FnZSBzaXplLiAgSW4gb3JkZXIgdG8gcHJldmVudCBtYWxpY2lvdXMKLSAgICogbWVzc2FnZXMgZnJvbSBleGhhdXN0aW5nIG1lbW9yeSBvciBjYXVzaW5nIGludGVnZXIgb3ZlcmZsb3dzLAotICAgKiB7QGNvZGUgQ29kZWRJbnB1dFN0cmVhbX0gbGltaXRzIGhvdyBsYXJnZSBhIG1lc3NhZ2UgbWF5IGJlLgotICAgKiBUaGUgZGVmYXVsdCBsaW1pdCBpcyA2NE1CLiAgWW91IHNob3VsZCBzZXQgdGhpcyBsaW1pdCBhcyBzbWFsbAotICAgKiBhcyB5b3UgY2FuIHdpdGhvdXQgaGFybWluZyB5b3VyIGFwcCdzIGZ1bmN0aW9uYWxpdHkuICBOb3RlIHRoYXQKLSAgICogc2l6ZSBsaW1pdHMgb25seSBhcHBseSB3aGVuIHJlYWRpbmcgZnJvbSBhbiB7QGNvZGUgSW5wdXRTdHJlYW19LCBub3QKLSAgICogd2hlbiBjb25zdHJ1Y3RlZCBhcm91bmQgYSByYXcgYnl0ZSBhcnJheSAobm9yIHdpdGgKLSAgICoge0BsaW5rIEJ5dGVTdHJpbmcjbmV3Q29kZWRJbnB1dH0pLgotICAgKiA8cD4KLSAgICogSWYgeW91IHdhbnQgdG8gcmVhZCBzZXZlcmFsIG1lc3NhZ2VzIGZyb20gYSBzaW5nbGUgQ29kZWRJbnB1dFN0cmVhbSwgeW91Ci0gICAqIGNvdWxkIGNhbGwge0BsaW5rICNyZXNldFNpemVDb3VudGVyKCl9IGFmdGVyIGVhY2ggb25lIHRvIGF2b2lkIGhpdHRpbmcgdGhlCi0gICAqIHNpemUgbGltaXQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG9sZCBsaW1pdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgc2V0U2l6ZUxpbWl0KGZpbmFsIGludCBsaW1pdCkgewotICAgIGlmIChsaW1pdCA8IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJTaXplIGxpbWl0IGNhbm5vdCBiZSBuZWdhdGl2ZTogIiArIGxpbWl0KTsKLSAgICB9Ci0gICAgZmluYWwgaW50IG9sZExpbWl0ID0gc2l6ZUxpbWl0OwotICAgIHNpemVMaW1pdCA9IGxpbWl0OwotICAgIHJldHVybiBvbGRMaW1pdDsKLSAgfQotCi0gIC8qKgotICAgKiBSZXNldHMgdGhlIGN1cnJlbnQgc2l6ZSBjb3VudGVyIHRvIHplcm8gKHNlZSB7QGxpbmsgI3NldFNpemVMaW1pdChpbnQpfSkuCi0gICAqLwotICBwdWJsaWMgdm9pZCByZXNldFNpemVDb3VudGVyKCkgewotICAgIHRvdGFsQnl0ZXNSZXRpcmVkID0gLWJ1ZmZlclBvczsKLSAgfQotCi0gIC8qKgotICAgKiBTZXRzIHtAY29kZSBjdXJyZW50TGltaXR9IHRvIChjdXJyZW50IHBvc2l0aW9uKSArIHtAY29kZSBieXRlTGltaXR9LiAgVGhpcwotICAgKiBpcyBjYWxsZWQgd2hlbiBkZXNjZW5kaW5nIGludG8gYSBsZW5ndGgtZGVsaW1pdGVkIGVtYmVkZGVkIG1lc3NhZ2UuCi0gICAqCi0gICAqIDxwPk5vdGUgdGhhdCB7QGNvZGUgcHVzaExpbWl0KCl9IGRvZXMgTk9UIGFmZmVjdCBob3cgbWFueSBieXRlcyB0aGUKLSAgICoge0Bjb2RlIENvZGVkSW5wdXRTdHJlYW19IHJlYWRzIGZyb20gYW4gdW5kZXJseWluZyB7QGNvZGUgSW5wdXRTdHJlYW19IHdoZW4KLSAgICogcmVmcmVzaGluZyBpdHMgYnVmZmVyLiAgSWYgeW91IG5lZWQgdG8gcHJldmVudCByZWFkaW5nIHBhc3QgYSBjZXJ0YWluCi0gICAqIHBvaW50IGluIHRoZSB1bmRlcmx5aW5nIHtAY29kZSBJbnB1dFN0cmVhbX0gKGUuZy4gYmVjYXVzZSB5b3UgZXhwZWN0IGl0IHRvCi0gICAqIGNvbnRhaW4gbW9yZSBkYXRhIGFmdGVyIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2Ugd2hpY2ggeW91IG5lZWQgdG8gaGFuZGxlCi0gICAqIGRpZmZlcmVudGx5KSB0aGVuIHlvdSBtdXN0IHBsYWNlIGEgd3JhcHBlciBhcm91bmQgeW91IHtAY29kZSBJbnB1dFN0cmVhbX0KLSAgICogd2hpY2ggbGltaXRzIHRoZSBhbW91bnQgb2YgZGF0YSB0aGF0IGNhbiBiZSByZWFkIGZyb20gaXQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG9sZCBsaW1pdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgcHVzaExpbWl0KGludCBieXRlTGltaXQpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIGlmIChieXRlTGltaXQgPCAwKSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ubmVnYXRpdmVTaXplKCk7Ci0gICAgfQotICAgIGJ5dGVMaW1pdCArPSB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKLSAgICBmaW5hbCBpbnQgb2xkTGltaXQgPSBjdXJyZW50TGltaXQ7Ci0gICAgaWYgKGJ5dGVMaW1pdCA+IG9sZExpbWl0KSB7Ci0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgIH0KLSAgICBjdXJyZW50TGltaXQgPSBieXRlTGltaXQ7Ci0KLSAgICByZWNvbXB1dGVCdWZmZXJTaXplQWZ0ZXJMaW1pdCgpOwotCi0gICAgcmV0dXJuIG9sZExpbWl0OwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJlY29tcHV0ZUJ1ZmZlclNpemVBZnRlckxpbWl0KCkgewotICAgIGJ1ZmZlclNpemUgKz0gYnVmZmVyU2l6ZUFmdGVyTGltaXQ7Ci0gICAgZmluYWwgaW50IGJ1ZmZlckVuZCA9IHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZTsKLSAgICBpZiAoYnVmZmVyRW5kID4gY3VycmVudExpbWl0KSB7Ci0gICAgICAvLyBMaW1pdCBpcyBpbiBjdXJyZW50IGJ1ZmZlci4KLSAgICAgIGJ1ZmZlclNpemVBZnRlckxpbWl0ID0gYnVmZmVyRW5kIC0gY3VycmVudExpbWl0OwotICAgICAgYnVmZmVyU2l6ZSAtPSBidWZmZXJTaXplQWZ0ZXJMaW1pdDsKLSAgICB9IGVsc2UgewotICAgICAgYnVmZmVyU2l6ZUFmdGVyTGltaXQgPSAwOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBEaXNjYXJkcyB0aGUgY3VycmVudCBsaW1pdCwgcmV0dXJuaW5nIHRvIHRoZSBwcmV2aW91cyBsaW1pdC4KLSAgICoKLSAgICogQHBhcmFtIG9sZExpbWl0IFRoZSBvbGQgbGltaXQsIGFzIHJldHVybmVkIGJ5IHtAY29kZSBwdXNoTGltaXR9LgotICAgKi8KLSAgcHVibGljIHZvaWQgcG9wTGltaXQoZmluYWwgaW50IG9sZExpbWl0KSB7Ci0gICAgY3VycmVudExpbWl0ID0gb2xkTGltaXQ7Ci0gICAgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZCBiZWZvcmUgdGhlIGN1cnJlbnQgbGltaXQuCi0gICAqIElmIG5vIGxpbWl0IGlzIHNldCwgcmV0dXJucyAtMS4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgewotICAgIGlmIChjdXJyZW50TGltaXQgPT0gSW50ZWdlci5NQVhfVkFMVUUpIHsKLSAgICAgIHJldHVybiAtMTsKLSAgICB9Ci0KLSAgICBmaW5hbCBpbnQgY3VycmVudEFic29sdXRlUG9zaXRpb24gPSB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKLSAgICByZXR1cm4gY3VycmVudExpbWl0IC0gY3VycmVudEFic29sdXRlUG9zaXRpb247Ci0gIH0KLQotICAvKioKLSAgICogUmV0dXJucyB0cnVlIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuICBUaGlzIGlzIHRoZQotICAgKiBjYXNlIGlmIGVpdGhlciB0aGUgZW5kIG9mIHRoZSB1bmRlcmx5aW5nIGlucHV0IHNvdXJjZSBoYXMgYmVlbiByZWFjaGVkIG9yCi0gICAqIGlmIHRoZSBzdHJlYW0gaGFzIHJlYWNoZWQgYSBsaW1pdCBjcmVhdGVkIHVzaW5nIHtAbGluayAjcHVzaExpbWl0KGludCl9LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNBdEVuZCgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIGJ1ZmZlclBvcyA9PSBidWZmZXJTaXplICYmICFyZWZpbGxCdWZmZXIoZmFsc2UpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRoZSB0b3RhbCBieXRlcyByZWFkIHVwIHRvIHRoZSBjdXJyZW50IHBvc2l0aW9uLiBDYWxsaW5nCi0gICAqIHtAbGluayAjcmVzZXRTaXplQ291bnRlcigpfSByZXNldHMgdGhpcyB2YWx1ZSB0byB6ZXJvLgotICAgKi8KLSAgcHVibGljIGludCBnZXRUb3RhbEJ5dGVzUmVhZCgpIHsKLSAgICAgIHJldHVybiB0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvczsKLSAgfQotCi0gIC8qKgotICAgKiBDYWxsZWQgd2l0aCB7QGNvZGUgdGhpcy5idWZmZXJ9IGlzIGVtcHR5IHRvIHJlYWQgbW9yZSBieXRlcyBmcm9tIHRoZQotICAgKiBpbnB1dC4gIElmIHtAY29kZSBtdXN0U3VjY2VlZH0gaXMgdHJ1ZSwgcmVmaWxsQnVmZmVyKCkgZ3VyYW50ZWVzIHRoYXQKLSAgICogZWl0aGVyIHRoZXJlIHdpbGwgYmUgYXQgbGVhc3Qgb25lIGJ5dGUgaW4gdGhlIGJ1ZmZlciB3aGVuIGl0IHJldHVybnMKLSAgICogb3IgaXQgd2lsbCB0aHJvdyBhbiBleGNlcHRpb24uICBJZiB7QGNvZGUgbXVzdFN1Y2NlZWR9IGlzIGZhbHNlLAotICAgKiByZWZpbGxCdWZmZXIoKSByZXR1cm5zIGZhbHNlIGlmIG5vIG1vcmUgYnl0ZXMgd2VyZSBhdmFpbGFibGUuCi0gICAqLwotICBwcml2YXRlIGJvb2xlYW4gcmVmaWxsQnVmZmVyKGZpbmFsIGJvb2xlYW4gbXVzdFN1Y2NlZWQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGJ1ZmZlclBvcyA8IGJ1ZmZlclNpemUpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICJyZWZpbGxCdWZmZXIoKSBjYWxsZWQgd2hlbiBidWZmZXIgd2Fzbid0IGVtcHR5LiIpOwotICAgIH0KLQotICAgIGlmICh0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclNpemUgPT0gY3VycmVudExpbWl0KSB7Ci0gICAgICAvLyBPb3BzLCB3ZSBoaXQgYSBsaW1pdC4KLSAgICAgIGlmIChtdXN0U3VjY2VlZCkgewotICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIHRvdGFsQnl0ZXNSZXRpcmVkICs9IGJ1ZmZlclNpemU7Ci0KLSAgICBidWZmZXJQb3MgPSAwOwotICAgIGJ1ZmZlclNpemUgPSAoaW5wdXQgPT0gbnVsbCkgPyAtMSA6IGlucHV0LnJlYWQoYnVmZmVyKTsKLSAgICBpZiAoYnVmZmVyU2l6ZSA9PSAwIHx8IGJ1ZmZlclNpemUgPCAtMSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAiSW5wdXRTdHJlYW0jcmVhZChieXRlW10pIHJldHVybmVkIGludmFsaWQgcmVzdWx0OiAiICsgYnVmZmVyU2l6ZSArCi0gICAgICAgICAgIlxuVGhlIElucHV0U3RyZWFtIGltcGxlbWVudGF0aW9uIGlzIGJ1Z2d5LiIpOwotICAgIH0KLSAgICBpZiAoYnVmZmVyU2l6ZSA9PSAtMSkgewotICAgICAgYnVmZmVyU2l6ZSA9IDA7Ci0gICAgICBpZiAobXVzdFN1Y2NlZWQpIHsKLSAgICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmVjb21wdXRlQnVmZmVyU2l6ZUFmdGVyTGltaXQoKTsKLSAgICAgIGZpbmFsIGludCB0b3RhbEJ5dGVzUmVhZCA9Ci0gICAgICAgIHRvdGFsQnl0ZXNSZXRpcmVkICsgYnVmZmVyU2l6ZSArIGJ1ZmZlclNpemVBZnRlckxpbWl0OwotICAgICAgaWYgKHRvdGFsQnl0ZXNSZWFkID4gc2l6ZUxpbWl0IHx8IHRvdGFsQnl0ZXNSZWFkIDwgMCkgewotICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uc2l6ZUxpbWl0RXhjZWVkZWQoKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZWFkIG9uZSBieXRlIGZyb20gdGhlIGlucHV0LgotICAgKgotICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBUaGUgZW5kIG9mIHRoZSBzdHJlYW0gb3IgdGhlIGN1cnJlbnQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgd2FzIHJlYWNoZWQuCi0gICAqLwotICBwdWJsaWMgYnl0ZSByZWFkUmF3Qnl0ZSgpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKGJ1ZmZlclBvcyA9PSBidWZmZXJTaXplKSB7Ci0gICAgICByZWZpbGxCdWZmZXIodHJ1ZSk7Ci0gICAgfQotICAgIHJldHVybiBidWZmZXJbYnVmZmVyUG9zKytdOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlYWQgYSBmaXhlZCBzaXplIG9mIGJ5dGVzIGZyb20gdGhlIGlucHV0LgotICAgKgotICAgKiBAdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBUaGUgZW5kIG9mIHRoZSBzdHJlYW0gb3IgdGhlIGN1cnJlbnQKLSAgICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgd2FzIHJlYWNoZWQuCi0gICAqLwotICBwdWJsaWMgYnl0ZVtdIHJlYWRSYXdCeXRlcyhmaW5hbCBpbnQgc2l6ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAoc2l6ZSA8IDApIHsKLSAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5uZWdhdGl2ZVNpemUoKTsKLSAgICB9Ci0KLSAgICBpZiAodG90YWxCeXRlc1JldGlyZWQgKyBidWZmZXJQb3MgKyBzaXplID4gY3VycmVudExpbWl0KSB7Ci0gICAgICAvLyBSZWFkIHRvIHRoZSBlbmQgb2YgdGhlIHN0cmVhbSBhbnl3YXkuCi0gICAgICBza2lwUmF3Qnl0ZXMoY3VycmVudExpbWl0IC0gdG90YWxCeXRlc1JldGlyZWQgLSBidWZmZXJQb3MpOwotICAgICAgLy8gVGhlbiBmYWlsLgotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLnRydW5jYXRlZE1lc3NhZ2UoKTsKLSAgICB9Ci0KLSAgICBpZiAoc2l6ZSA8PSBidWZmZXJTaXplIC0gYnVmZmVyUG9zKSB7Ci0gICAgICAvLyBXZSBoYXZlIGFsbCB0aGUgYnl0ZXMgd2UgbmVlZCBhbHJlYWR5LgotICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgYnVmZmVyUG9zLCBieXRlcywgMCwgc2l6ZSk7Ci0gICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKLSAgICAgIHJldHVybiBieXRlczsKLSAgICB9IGVsc2UgaWYgKHNpemUgPCBCVUZGRVJfU0laRSkgewotICAgICAgLy8gUmVhZGluZyBtb3JlIGJ5dGVzIHRoYW4gYXJlIGluIHRoZSBidWZmZXIsIGJ1dCBub3QgYW4gZXhjZXNzaXZlIG51bWJlcgotICAgICAgLy8gb2YgYnl0ZXMuICBXZSBjYW4gc2FmZWx5IGFsbG9jYXRlIHRoZSByZXN1bHRpbmcgYXJyYXkgYWhlYWQgb2YgdGltZS4KLQotICAgICAgLy8gRmlyc3QgY29weSB3aGF0IHdlIGhhdmUuCi0gICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtzaXplXTsKLSAgICAgIGludCBwb3MgPSBidWZmZXJTaXplIC0gYnVmZmVyUG9zOwotICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIGJ1ZmZlclBvcywgYnl0ZXMsIDAsIHBvcyk7Ci0gICAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOwotCi0gICAgICAvLyBXZSB3YW50IHRvIHVzZSByZWZpbGxCdWZmZXIoKSBhbmQgdGhlbiBjb3B5IGZyb20gdGhlIGJ1ZmZlciBpbnRvIG91cgotICAgICAgLy8gYnl0ZSBhcnJheSByYXRoZXIgdGhhbiByZWFkaW5nIGRpcmVjdGx5IGludG8gb3VyIGJ5dGUgYXJyYXkgYmVjYXVzZQotICAgICAgLy8gdGhlIGlucHV0IG1heSBiZSB1bmJ1ZmZlcmVkLgotICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOwotCi0gICAgICB3aGlsZSAoc2l6ZSAtIHBvcyA+IGJ1ZmZlclNpemUpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShidWZmZXIsIDAsIGJ5dGVzLCBwb3MsIGJ1ZmZlclNpemUpOwotICAgICAgICBwb3MgKz0gYnVmZmVyU2l6ZTsKLSAgICAgICAgYnVmZmVyUG9zID0gYnVmZmVyU2l6ZTsKLSAgICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOwotICAgICAgfQotCi0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgMCwgYnl0ZXMsIHBvcywgc2l6ZSAtIHBvcyk7Ci0gICAgICBidWZmZXJQb3MgPSBzaXplIC0gcG9zOwotCi0gICAgICByZXR1cm4gYnl0ZXM7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFRoZSBzaXplIGlzIHZlcnkgbGFyZ2UuICBGb3Igc2VjdXJpdHkgcmVhc29ucywgd2UgY2FuJ3QgYWxsb2NhdGUgdGhlCi0gICAgICAvLyBlbnRpcmUgYnl0ZSBhcnJheSB5ZXQuICBUaGUgc2l6ZSBjb21lcyBkaXJlY3RseSBmcm9tIHRoZSBpbnB1dCwgc28gYQotICAgICAgLy8gbWFsaWNpb3VzbHktY3JhZnRlZCBtZXNzYWdlIGNvdWxkIHByb3ZpZGUgYSBib2d1cyB2ZXJ5IGxhcmdlIHNpemUgaW4KLSAgICAgIC8vIG9yZGVyIHRvIHRyaWNrIHRoZSBhcHAgaW50byBhbGxvY2F0aW5nIGEgbG90IG9mIG1lbW9yeS4gIFdlIGF2b2lkIHRoaXMKLSAgICAgIC8vIGJ5IGFsbG9jYXRpbmcgYW5kIHJlYWRpbmcgb25seSBhIHNtYWxsIGNodW5rIGF0IGEgdGltZSwgc28gdGhhdCB0aGUKLSAgICAgIC8vIG1hbGljaW91cyBtZXNzYWdlIG11c3QgYWN0dWFsbHkgKmJlKiBleHRyZW1lbHkgbGFyZ2UgdG8gY2F1c2UKLSAgICAgIC8vIHByb2JsZW1zLiAgTWVhbndoaWxlLCB3ZSBsaW1pdCB0aGUgYWxsb3dlZCBzaXplIG9mIGEgbWVzc2FnZSBlbHNld2hlcmUuCi0KLSAgICAgIC8vIFJlbWVtYmVyIHRoZSBidWZmZXIgbWFya2VycyBzaW5jZSB3ZSdsbCBoYXZlIHRvIGNvcHkgdGhlIGJ5dGVzIG91dCBvZgotICAgICAgLy8gaXQgbGF0ZXIuCi0gICAgICBmaW5hbCBpbnQgb3JpZ2luYWxCdWZmZXJQb3MgPSBidWZmZXJQb3M7Ci0gICAgICBmaW5hbCBpbnQgb3JpZ2luYWxCdWZmZXJTaXplID0gYnVmZmVyU2l6ZTsKLQotICAgICAgLy8gTWFyayB0aGUgY3VycmVudCBidWZmZXIgY29uc3VtZWQuCi0gICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBidWZmZXJTaXplOwotICAgICAgYnVmZmVyUG9zID0gMDsKLSAgICAgIGJ1ZmZlclNpemUgPSAwOwotCi0gICAgICAvLyBSZWFkIGFsbCB0aGUgcmVzdCBvZiB0aGUgYnl0ZXMgd2UgbmVlZC4KLSAgICAgIGludCBzaXplTGVmdCA9IHNpemUgLSAob3JpZ2luYWxCdWZmZXJTaXplIC0gb3JpZ2luYWxCdWZmZXJQb3MpOwotICAgICAgZmluYWwgTGlzdDxieXRlW10+IGNodW5rcyA9IG5ldyBBcnJheUxpc3Q8Ynl0ZVtdPigpOwotCi0gICAgICB3aGlsZSAoc2l6ZUxlZnQgPiAwKSB7Ci0gICAgICAgIGZpbmFsIGJ5dGVbXSBjaHVuayA9IG5ldyBieXRlW01hdGgubWluKHNpemVMZWZ0LCBCVUZGRVJfU0laRSldOwotICAgICAgICBpbnQgcG9zID0gMDsKLSAgICAgICAgd2hpbGUgKHBvcyA8IGNodW5rLmxlbmd0aCkgewotICAgICAgICAgIGZpbmFsIGludCBuID0gKGlucHV0ID09IG51bGwpID8gLTEgOgotICAgICAgICAgICAgaW5wdXQucmVhZChjaHVuaywgcG9zLCBjaHVuay5sZW5ndGggLSBwb3MpOwotICAgICAgICAgIGlmIChuID09IC0xKSB7Ci0gICAgICAgICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgICB0b3RhbEJ5dGVzUmV0aXJlZCArPSBuOwotICAgICAgICAgIHBvcyArPSBuOwotICAgICAgICB9Ci0gICAgICAgIHNpemVMZWZ0IC09IGNodW5rLmxlbmd0aDsKLSAgICAgICAgY2h1bmtzLmFkZChjaHVuayk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIE9LLCBnb3QgZXZlcnl0aGluZy4gIE5vdyBjb25jYXRlbmF0ZSBpdCBhbGwgaW50byBvbmUgYnVmZmVyLgotICAgICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbc2l6ZV07Ci0KLSAgICAgIC8vIFN0YXJ0IGJ5IGNvcHlpbmcgdGhlIGxlZnRvdmVyIGJ5dGVzIGZyb20gdGhpcy5idWZmZXIuCi0gICAgICBpbnQgcG9zID0gb3JpZ2luYWxCdWZmZXJTaXplIC0gb3JpZ2luYWxCdWZmZXJQb3M7Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KGJ1ZmZlciwgb3JpZ2luYWxCdWZmZXJQb3MsIGJ5dGVzLCAwLCBwb3MpOwotCi0gICAgICAvLyBBbmQgbm93IGFsbCB0aGUgY2h1bmtzLgotICAgICAgZm9yIChmaW5hbCBieXRlW10gY2h1bmsgOiBjaHVua3MpIHsKLSAgICAgICAgU3lzdGVtLmFycmF5Y29weShjaHVuaywgMCwgYnl0ZXMsIHBvcywgY2h1bmsubGVuZ3RoKTsKLSAgICAgICAgcG9zICs9IGNodW5rLmxlbmd0aDsKLSAgICAgIH0KLQotICAgICAgLy8gRG9uZS4KLSAgICAgIHJldHVybiBieXRlczsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVhZHMgYW5kIGRpc2NhcmRzIHtAY29kZSBzaXplfSBieXRlcy4KLSAgICoKLSAgICogQHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gVGhlIGVuZCBvZiB0aGUgc3RyZWFtIG9yIHRoZSBjdXJyZW50Ci0gICAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0IHdhcyByZWFjaGVkLgotICAgKi8KLSAgcHVibGljIHZvaWQgc2tpcFJhd0J5dGVzKGZpbmFsIGludCBzaXplKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChzaXplIDwgMCkgewotICAgICAgdGhyb3cgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm5lZ2F0aXZlU2l6ZSgpOwotICAgIH0KLQotICAgIGlmICh0b3RhbEJ5dGVzUmV0aXJlZCArIGJ1ZmZlclBvcyArIHNpemUgPiBjdXJyZW50TGltaXQpIHsKLSAgICAgIC8vIFJlYWQgdG8gdGhlIGVuZCBvZiB0aGUgc3RyZWFtIGFueXdheS4KLSAgICAgIHNraXBSYXdCeXRlcyhjdXJyZW50TGltaXQgLSB0b3RhbEJ5dGVzUmV0aXJlZCAtIGJ1ZmZlclBvcyk7Ci0gICAgICAvLyBUaGVuIGZhaWwuCi0gICAgICB0aHJvdyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24udHJ1bmNhdGVkTWVzc2FnZSgpOwotICAgIH0KLQotICAgIGlmIChzaXplIDw9IGJ1ZmZlclNpemUgLSBidWZmZXJQb3MpIHsKLSAgICAgIC8vIFdlIGhhdmUgYWxsIHRoZSBieXRlcyB3ZSBuZWVkIGFscmVhZHkuCi0gICAgICBidWZmZXJQb3MgKz0gc2l6ZTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gU2tpcHBpbmcgbW9yZSBieXRlcyB0aGFuIGFyZSBpbiB0aGUgYnVmZmVyLiAgRmlyc3Qgc2tpcCB3aGF0IHdlIGhhdmUuCi0gICAgICBpbnQgcG9zID0gYnVmZmVyU2l6ZSAtIGJ1ZmZlclBvczsKLSAgICAgIGJ1ZmZlclBvcyA9IGJ1ZmZlclNpemU7Ci0KLSAgICAgIC8vIEtlZXAgcmVmaWxsaW5nIHRoZSBidWZmZXIgdW50aWwgd2UgZ2V0IHRvIHRoZSBwb2ludCB3ZSB3YW50ZWQgdG8gc2tpcAotICAgICAgLy8gdG8uICBUaGlzIGhhcyB0aGUgc2lkZSBlZmZlY3Qgb2YgZW5zdXJpbmcgdGhlIGxpbWl0cyBhcmUgdXBkYXRlZAotICAgICAgLy8gY29ycmVjdGx5LgotICAgICAgcmVmaWxsQnVmZmVyKHRydWUpOwotICAgICAgd2hpbGUgKHNpemUgLSBwb3MgPiBidWZmZXJTaXplKSB7Ci0gICAgICAgIHBvcyArPSBidWZmZXJTaXplOwotICAgICAgICBidWZmZXJQb3MgPSBidWZmZXJTaXplOwotICAgICAgICByZWZpbGxCdWZmZXIodHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGJ1ZmZlclBvcyA9IHNpemUgLSBwb3M7IAotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW0uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWM1ZjJkMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQ29kZWRPdXRwdXRTdHJlYW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDEwODEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLlVuc3VwcG9ydGVkRW5jb2RpbmdFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLQotLyoqCi0gKiBFbmNvZGVzIGFuZCB3cml0ZXMgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZHMuCi0gKgotICogPHA+VGhpcyBjbGFzcyBjb250YWlucyB0d28ga2luZHMgb2YgbWV0aG9kczogIG1ldGhvZHMgdGhhdCB3cml0ZSBzcGVjaWZpYwotICogcHJvdG9jb2wgbWVzc2FnZSBjb25zdHJ1Y3RzIGFuZCBmaWVsZCB0eXBlcyAoZS5nLiB7QGxpbmsgI3dyaXRlVGFnfSBhbmQKLSAqIHtAbGluayAjd3JpdGVJbnQzMn0pIGFuZCBtZXRob2RzIHRoYXQgd3JpdGUgbG93LWxldmVsIHZhbHVlcyAoZS5nLgotICoge0BsaW5rICN3cml0ZVJhd1ZhcmludDMyfSBhbmQge0BsaW5rICN3cml0ZVJhd0J5dGVzfSkuICBJZiB5b3UgYXJlCi0gKiB3cml0aW5nIGVuY29kZWQgcHJvdG9jb2wgbWVzc2FnZXMsIHlvdSBzaG91bGQgdXNlIHRoZSBmb3JtZXIgbWV0aG9kcywgYnV0IGlmCi0gKiB5b3UgYXJlIHdyaXRpbmcgc29tZSBvdGhlciBmb3JtYXQgb2YgeW91ciBvd24gZGVzaWduLCB1c2UgdGhlIGxhdHRlci4KLSAqCi0gKiA8cD5UaGlzIGNsYXNzIGlzIHRvdGFsbHkgdW5zeW5jaHJvbml6ZWQuCi0gKgotICogQGF1dGhvciBrbmV0b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtIHsKLSAgcHJpdmF0ZSBmaW5hbCBieXRlW10gYnVmZmVyOwotICBwcml2YXRlIGZpbmFsIGludCBsaW1pdDsKLSAgcHJpdmF0ZSBpbnQgcG9zaXRpb247Ci0KLSAgcHJpdmF0ZSBmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0OwotCi0gIC8qKgotICAgKiBUaGUgYnVmZmVyIHNpemUgdXNlZCBpbiB7QGxpbmsgI25ld0luc3RhbmNlKE91dHB1dFN0cmVhbSl9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgREVGQVVMVF9CVUZGRVJfU0laRSA9IDQwOTY7Ci0KLSAgLyoqCi0gICAqIFJldHVybnMgdGhlIGJ1ZmZlciBzaXplIHRvIGVmZmljaWVudGx5IHdyaXRlIGRhdGFMZW5ndGggYnl0ZXMgdG8gdGhpcwotICAgKiBDb2RlZE91dHB1dFN0cmVhbS4gVXNlZCBieSBBYnN0cmFjdE1lc3NhZ2VMaXRlLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBidWZmZXIgc2l6ZSB0byBlZmZpY2llbnRseSB3cml0ZSBkYXRhTGVuZ3RoIGJ5dGVzIHRvIHRoaXMKLSAgICogICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS4KLSAgICovCi0gIHN0YXRpYyBpbnQgY29tcHV0ZVByZWZlcnJlZEJ1ZmZlclNpemUoaW50IGRhdGFMZW5ndGgpIHsKLSAgICBpZiAoZGF0YUxlbmd0aCA+IERFRkFVTFRfQlVGRkVSX1NJWkUpIHJldHVybiBERUZBVUxUX0JVRkZFUl9TSVpFOwotICAgIHJldHVybiBkYXRhTGVuZ3RoOwotICB9Ci0KLSAgcHJpdmF0ZSBDb2RlZE91dHB1dFN0cmVhbShmaW5hbCBieXRlW10gYnVmZmVyLCBmaW5hbCBpbnQgb2Zmc2V0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBsZW5ndGgpIHsKLSAgICBvdXRwdXQgPSBudWxsOwotICAgIHRoaXMuYnVmZmVyID0gYnVmZmVyOwotICAgIHBvc2l0aW9uID0gb2Zmc2V0OwotICAgIGxpbWl0ID0gb2Zmc2V0ICsgbGVuZ3RoOwotICB9Ci0KLSAgcHJpdmF0ZSBDb2RlZE91dHB1dFN0cmVhbShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0LCBmaW5hbCBieXRlW10gYnVmZmVyKSB7Ci0gICAgdGhpcy5vdXRwdXQgPSBvdXRwdXQ7Ci0gICAgdGhpcy5idWZmZXIgPSBidWZmZXI7Ci0gICAgcG9zaXRpb24gPSAwOwotICAgIGxpbWl0ID0gYnVmZmVyLmxlbmd0aDsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB3cmFwcGluZyB0aGUgZ2l2ZW4KLSAgICoge0Bjb2RlIE91dHB1dFN0cmVhbX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENvZGVkT3V0cHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIE91dHB1dFN0cmVhbSBvdXRwdXQpIHsKLSAgICByZXR1cm4gbmV3SW5zdGFuY2Uob3V0cHV0LCBERUZBVUxUX0JVRkZFUl9TSVpFKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGUgYSBuZXcge0Bjb2RlIENvZGVkT3V0cHV0U3RyZWFtfSB3cmFwcGluZyB0aGUgZ2l2ZW4KLSAgICoge0Bjb2RlIE91dHB1dFN0cmVhbX0gd2l0aCBhIGdpdmVuIGJ1ZmZlciBzaXplLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dFN0cmVhbSBuZXdJbnN0YW5jZShmaW5hbCBPdXRwdXRTdHJlYW0gb3V0cHV0LAotICAgICAgZmluYWwgaW50IGJ1ZmZlclNpemUpIHsKLSAgICByZXR1cm4gbmV3IENvZGVkT3V0cHV0U3RyZWFtKG91dHB1dCwgbmV3IGJ5dGVbYnVmZmVyU2l6ZV0pOwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZSBhIG5ldyB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19IHRoYXQgd3JpdGVzIGRpcmVjdGx5IHRvIHRoZSBnaXZlbgotICAgKiBieXRlIGFycmF5LiAgSWYgbW9yZSBieXRlcyBhcmUgd3JpdHRlbiB0aGFuIGZpdCBpbiB0aGUgYXJyYXksCi0gICAqIHtAbGluayBPdXRPZlNwYWNlRXhjZXB0aW9ufSB3aWxsIGJlIHRocm93bi4gIFdyaXRpbmcgZGlyZWN0bHkgdG8gYSBmbGF0Ci0gICAqIGFycmF5IGlzIGZhc3RlciB0aGFuIHdyaXRpbmcgdG8gYW4ge0Bjb2RlIE91dHB1dFN0cmVhbX0uICBTZWUgYWxzbwotICAgKiB7QGxpbmsgQnl0ZVN0cmluZyNuZXdDb2RlZEJ1aWxkZXJ9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBDb2RlZE91dHB1dFN0cmVhbSBuZXdJbnN0YW5jZShmaW5hbCBieXRlW10gZmxhdEFycmF5KSB7Ci0gICAgcmV0dXJuIG5ld0luc3RhbmNlKGZsYXRBcnJheSwgMCwgZmxhdEFycmF5Lmxlbmd0aCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IHtAY29kZSBDb2RlZE91dHB1dFN0cmVhbX0gdGhhdCB3cml0ZXMgZGlyZWN0bHkgdG8gdGhlIGdpdmVuCi0gICAqIGJ5dGUgYXJyYXkgc2xpY2UuICBJZiBtb3JlIGJ5dGVzIGFyZSB3cml0dGVuIHRoYW4gZml0IGluIHRoZSBzbGljZSwKLSAgICoge0BsaW5rIE91dE9mU3BhY2VFeGNlcHRpb259IHdpbGwgYmUgdGhyb3duLiAgV3JpdGluZyBkaXJlY3RseSB0byBhIGZsYXQKLSAgICogYXJyYXkgaXMgZmFzdGVyIHRoYW4gd3JpdGluZyB0byBhbiB7QGNvZGUgT3V0cHV0U3RyZWFtfS4gIFNlZSBhbHNvCi0gICAqIHtAbGluayBCeXRlU3RyaW5nI25ld0NvZGVkQnVpbGRlcn0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIENvZGVkT3V0cHV0U3RyZWFtIG5ld0luc3RhbmNlKGZpbmFsIGJ5dGVbXSBmbGF0QXJyYXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG9mZnNldCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgbGVuZ3RoKSB7Ci0gICAgcmV0dXJuIG5ldyBDb2RlZE91dHB1dFN0cmVhbShmbGF0QXJyYXksIG9mZnNldCwgbGVuZ3RoKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGRvdWJsZX0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlRG91YmxlKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgZG91YmxlIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQpOwotICAgIHdyaXRlRG91YmxlTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVGbG9hdChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGZsb2F0IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQzMik7Ci0gICAgd3JpdGVGbG9hdE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSB1aW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVVJbnQ2NChmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKLSAgICB3cml0ZVVJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUludDY0KGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgbG9uZyB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgd3JpdGVJbnQ2NE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgaW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUludDMyKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKLSAgICB3cml0ZUludDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVkNjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDY0KTsKLSAgICB3cml0ZUZpeGVkNjROb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQzMik7Ci0gICAgd3JpdGVGaXhlZDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGJvb2x9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUJvb2woZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBib29sZWFuIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgIHdyaXRlQm9vbE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBzdHJpbmd9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVN0cmluZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIFN0cmluZyB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICB3cml0ZVN0cmluZ05vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBncm91cH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlR3JvdXAoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKTsKLSAgICB3cml0ZUdyb3VwTm9UYWcodmFsdWUpOwotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBncm91cCByZXByZXNlbnRlZCBieSBhbiB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fS4KLSAgICoKLSAgICogQGRlcHJlY2F0ZWQgVW5rbm93bkZpZWxkU2V0IG5vdyBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlLCBzbyB5b3UgY2FuIGp1c3QKLSAgICogICAgICAgICAgICAgY2FsbCB7QGxpbmsgI3dyaXRlR3JvdXB9LgotICAgKi8KLSAgQERlcHJlY2F0ZWQKLSAgcHVibGljIHZvaWQgd3JpdGVVbmtub3duR3JvdXAoZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUdyb3VwKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgIHdyaXRlTWVzc2FnZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBieXRlc30gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXMoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgd3JpdGVCeXRlc05vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSB1aW50MzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVVJbnQzMihmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQpOwotICAgIHdyaXRlVUludDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGFuIGVudW0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICBDYWxsZXIgaXMgcmVzcG9uc2libGUKLSAgICogZm9yIGNvbnZlcnRpbmcgdGhlIGVudW0gdmFsdWUgdG8gaXRzIG51bWVyaWMgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUVudW0oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgd3JpdGVFbnVtTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBzZml4ZWQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlU0ZpeGVkMzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhmaWVsZE51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyKTsKLSAgICB3cml0ZVNGaXhlZDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBzZml4ZWQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcsIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlU0ZpeGVkNjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCk7Ci0gICAgd3JpdGVTRml4ZWQ2NE5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgc2ludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTSW50MzIoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBpbnQgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVUYWcoZmllbGROdW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfVkFSSU5UKTsKLSAgICB3cml0ZVNJbnQzMk5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgc2ludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZywgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTSW50NjQoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKGZpZWxkTnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCk7Ci0gICAgd3JpdGVTSW50NjROb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBNZXNzYWdlU2V0IGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgc3RyZWFtLiAgRm9yIGhpc3RvcmljYWwgcmVhc29ucywKLSAgICogdGhlIHdpcmUgZm9ybWF0IGRpZmZlcnMgZnJvbSBub3JtYWwgZmllbGRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICAgIHdyaXRlVUludDMyKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpOwotICAgIHdyaXRlTWVzc2FnZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKLSAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhbiB1bnBhcnNlZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiBmaWVsZCB0byB0aGUgc3RyZWFtLiAgRm9yCi0gICAqIGhpc3RvcmljYWwgcmVhc29ucywgdGhlIHdpcmUgZm9ybWF0IGRpZmZlcnMgZnJvbSBub3JtYWwgZmllbGRzLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlVGFnKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfSVRFTSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCk7Ci0gICAgd3JpdGVVSW50MzIoV2lyZUZvcm1hdC5NRVNTQUdFX1NFVF9UWVBFX0lELCBmaWVsZE51bWJlcik7Ci0gICAgd3JpdGVCeXRlcyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKLSAgICB3cml0ZVRhZyhXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0sIFdpcmVGb3JtYXQuV0lSRVRZUEVfRU5EX0dST1VQKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGRvdWJsZX0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVEb3VibGVOb1RhZyhmaW5hbCBkb3VibGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdMaXR0bGVFbmRpYW42NChEb3VibGUuZG91YmxlVG9SYXdMb25nQml0cyh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGZsb2F0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUZsb2F0Tm9UYWcoZmluYWwgZmxvYXQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdMaXR0bGVFbmRpYW4zMihGbG9hdC5mbG9hdFRvUmF3SW50Qml0cyh2YWx1ZSkpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIHVpbnQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVVSW50NjROb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3VmFyaW50NjQodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBpbnQ2NH0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVJbnQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdWYXJpbnQ2NCh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4ge0Bjb2RlIGludDMyfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUludDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmICh2YWx1ZSA+PSAwKSB7Ci0gICAgICB3cml0ZVJhd1ZhcmludDMyKHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTXVzdCBzaWduLWV4dGVuZC4KLSAgICAgIHdyaXRlUmF3VmFyaW50NjQodmFsdWUpOwotICAgIH0KLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBmaXhlZDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUZpeGVkNjROb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGZpeGVkMzJ9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlRml4ZWQzMk5vVGFnKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBib29sfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUJvb2xOb1RhZyhmaW5hbCBib29sZWFuIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3Qnl0ZSh2YWx1ZSA/IDEgOiAwKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSBzdHJpbmd9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlU3RyaW5nTm9UYWcoZmluYWwgU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFVuZm9ydHVuYXRlbHkgdGhlcmUgZG9lcyBub3QgYXBwZWFyIHRvIGJlIGFueSB3YXkgdG8gdGVsbCBKYXZhIHRvIGVuY29kZQotICAgIC8vIFVURi04IGRpcmVjdGx5IGludG8gb3VyIGJ1ZmZlciwgc28gd2UgaGF2ZSB0byBsZXQgaXQgY3JlYXRlIGl0cyBvd24gYnl0ZQotICAgIC8vIGFycmF5IGFuZCB0aGVuIGNvcHkuCi0gICAgZmluYWwgYnl0ZVtdIGJ5dGVzID0gdmFsdWUuZ2V0Qnl0ZXMoIlVURi04Iik7Ci0gICAgd3JpdGVSYXdWYXJpbnQzMihieXRlcy5sZW5ndGgpOwotICAgIHdyaXRlUmF3Qnl0ZXMoYnl0ZXMpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEge0Bjb2RlIGdyb3VwfSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZUdyb3VwTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgdmFsdWUud3JpdGVUbyh0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZSBhIGdyb3VwIHJlcHJlc2VudGVkIGJ5IGFuIHtAbGluayBVbmtub3duRmllbGRTZXR9LgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVbmtub3duRmllbGRTZXQgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUsIHNvIHlvdSBjYW4ganVzdAotICAgKiAgICAgICAgICAgICBjYWxsIHtAbGluayAjd3JpdGVHcm91cE5vVGFnfS4KLSAgICovCi0gIEBEZXByZWNhdGVkCi0gIHB1YmxpYyB2b2lkIHdyaXRlVW5rbm93bkdyb3VwTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlR3JvdXBOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKiogV3JpdGUgYW4gZW1iZWRkZWQgbWVzc2FnZSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDMyKHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICAgIHZhbHVlLndyaXRlVG8odGhpcyk7Ci0gIH0KLQotICAvKiogV3JpdGUgYSB7QGNvZGUgYnl0ZXN9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlQnl0ZXNOb1RhZyhmaW5hbCBCeXRlU3RyaW5nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3VmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKLSAgICB3cml0ZVJhd0J5dGVzKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIHtAY29kZSB1aW50MzJ9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlVUludDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3VmFyaW50MzIodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGFuIGVudW0gZmllbGQgdG8gdGhlIHN0cmVhbS4gIENhbGxlciBpcyByZXNwb25zaWJsZQotICAgKiBmb3IgY29udmVydGluZyB0aGUgZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlRW51bU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZUludDMyTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBzZml4ZWQzMn0gZmllbGQgdG8gdGhlIHN0cmVhbS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVTRml4ZWQzMk5vVGFnKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgc2ZpeGVkNjR9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlU0ZpeGVkNjROb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQodmFsdWUpOwotICB9Ci0KLSAgLyoqIFdyaXRlIGFuIHtAY29kZSBzaW50MzJ9IGZpZWxkIHRvIHRoZSBzdHJlYW0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlU0ludDMyTm9UYWcoZmluYWwgaW50IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3VmFyaW50MzIoZW5jb2RlWmlnWmFnMzIodmFsdWUpKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiB7QGNvZGUgc2ludDY0fSBmaWVsZCB0byB0aGUgc3RyZWFtLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVNJbnQ2NE5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdWYXJpbnQ2NChlbmNvZGVaaWdaYWc2NCh2YWx1ZSkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBkb3VibGV9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZURvdWJsZVNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBkb3VibGUgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZURvdWJsZVNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBmbG9hdH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRmxvYXRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgZmxvYXQgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUZsb2F0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIHVpbnQ2NH0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVUludDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUludDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZUludDY0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIHtAY29kZSBpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlSW50MzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVJbnQzMlNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBmaXhlZDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGaXhlZDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVGaXhlZDY0U2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZpeGVkMzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkMzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRml4ZWQzMlNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBib29sfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCb29sU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBib29sZWFuIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVCb29sU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIHN0cmluZ30gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RyaW5nU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGdyb3VwfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVHcm91cFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSAqIDIgKyBjb21wdXRlR3JvdXBTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkIHJlcHJlc2VudGVkIGJ5IGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9LCBpbmNsdWRpbmcKLSAgICogdGFnLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVbmtub3duRmllbGRTZXQgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUsIHNvIHlvdSBjYW4ganVzdAotICAgKiAgICAgICAgICAgICBjYWxsIHtAbGluayAjY29tcHV0ZUdyb3VwU2l6ZX0uCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVW5rbm93bkdyb3VwU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVHcm91cFNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIGVtYmVkZGVkIG1lc3NhZ2UgZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlTWVzc2FnZVNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVRhZ1NpemUoZmllbGROdW1iZXIpICsgY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgYnl0ZXN9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJ5dGVzU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlQnl0ZXNTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgdWludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVSW50MzJTaXplKGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVVSW50MzJTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICogZW51bSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4gIENhbGxlciBpcyByZXNwb25zaWJsZSBmb3IgY29udmVydGluZyB0aGUKLSAgICogZW51bSB2YWx1ZSB0byBpdHMgbnVtZXJpYyB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVFbnVtU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlRW51bVNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDMyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTRml4ZWQzMlNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkNjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDY0U2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ZpeGVkNjRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIHNpbnQzMn0gZmllbGQsIGluY2x1ZGluZyB0YWcuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDMyU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShmaWVsZE51bWJlcikgKyBjb21wdXRlU0ludDMyU2l6ZU5vVGFnKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGFuCi0gICAqIHtAY29kZSBzaW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNJbnQ2NFNpemUoZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVUYWdTaXplKGZpZWxkTnVtYmVyKSArIGNvbXB1dGVTSW50NjRTaXplTm9UYWcodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiBNZXNzYWdlU2V0IGV4dGVuc2lvbiB0byB0aGUgc3RyZWFtLiAgRm9yIGhpc3RvcmljYWwgcmVhc29ucywKLSAgICogdGhlIHdpcmUgZm9ybWF0IGRpZmZlcnMgZnJvbSBub3JtYWwgZmllbGRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU1lc3NhZ2VTZXRFeHRlbnNpb25TaXplKAotICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0pICogMiArCi0gICAgICAgICAgIGNvbXB1dGVVSW50MzJTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpICsKLSAgICAgICAgICAgY29tcHV0ZU1lc3NhZ2VTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfTUVTU0FHRSwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICogdW5wYXJzZWQgTWVzc2FnZVNldCBleHRlbnNpb24gZmllbGQgdG8gdGhlIHN0cmVhbS4gIEZvcgotICAgKiBoaXN0b3JpY2FsIHJlYXNvbnMsIHRoZSB3aXJlIGZvcm1hdCBkaWZmZXJzIGZyb20gbm9ybWFsIGZpZWxkcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVSYXdNZXNzYWdlU2V0RXh0ZW5zaW9uU2l6ZSgKLSAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciwgZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlVGFnU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX0lURU0pICogMiArCi0gICAgICAgICAgIGNvbXB1dGVVSW50MzJTaXplKFdpcmVGb3JtYXQuTUVTU0FHRV9TRVRfVFlQRV9JRCwgZmllbGROdW1iZXIpICsKLSAgICAgICAgICAgY29tcHV0ZUJ5dGVzU2l6ZShXaXJlRm9ybWF0Lk1FU1NBR0VfU0VUX01FU1NBR0UsIHZhbHVlKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZG91YmxlfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVEb3VibGVTaXplTm9UYWcoZmluYWwgZG91YmxlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIExJVFRMRV9FTkRJQU5fNjRfU0laRTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZsb2F0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGbG9hdFNpemVOb1RhZyhmaW5hbCBmbG9hdCB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSB1aW50NjR9IGZpZWxkLCBpbmNsdWRpbmcgdGFnLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIGludDY0fSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQ2NFNpemVOb1RhZyhmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIGludDMyfSBmaWVsZCwgaW5jbHVkaW5nIHRhZy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVJbnQzMlNpemVOb1RhZyhmaW5hbCBpbnQgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgPj0gMCkgewotICAgICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUpOwotICAgIH0gZWxzZSB7Ci0gICAgICAvLyBNdXN0IHNpZ24tZXh0ZW5kLgotICAgICAgcmV0dXJuIDEwOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGZpeGVkNjR9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzY0X1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBmaXhlZDMyfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVGaXhlZDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHtAY29kZSBib29sfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVCb29sU2l6ZU5vVGFnKGZpbmFsIGJvb2xlYW4gdmFsdWUpIHsKLSAgICByZXR1cm4gMTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIHN0cmluZ30gZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKGZpbmFsIFN0cmluZyB2YWx1ZSkgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBieXRlW10gYnl0ZXMgPSB2YWx1ZS5nZXRCeXRlcygiVVRGLTgiKTsKLSAgICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKGJ5dGVzLmxlbmd0aCkgKwotICAgICAgICAgICAgIGJ5dGVzLmxlbmd0aDsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkLiIsIGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICoge0Bjb2RlIGdyb3VwfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVHcm91cFNpemVOb1RhZyhmaW5hbCBNZXNzYWdlTGl0ZSB2YWx1ZSkgewotICAgIHJldHVybiB2YWx1ZS5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgZ3JvdXB9IGZpZWxkIHJlcHJlc2VudGVkIGJ5IGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9LCBpbmNsdWRpbmcKLSAgICogdGFnLgotICAgKgotICAgKiBAZGVwcmVjYXRlZCBVbmtub3duRmllbGRTZXQgbm93IGltcGxlbWVudHMgTWVzc2FnZUxpdGUsIHNvIHlvdSBjYW4ganVzdAotICAgKiAgICAgICAgICAgICBjYWxsIHtAbGluayAjY29tcHV0ZVVua25vd25Hcm91cFNpemVOb1RhZ30uCi0gICAqLwotICBARGVwcmVjYXRlZAotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVW5rbm93bkdyb3VwU2l6ZU5vVGFnKGZpbmFsIE1lc3NhZ2VMaXRlIHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVHcm91cFNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbiBlbWJlZGRlZAotICAgKiBtZXNzYWdlIGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcoZmluYWwgTWVzc2FnZUxpdGUgdmFsdWUpIHsKLSAgICBmaW5hbCBpbnQgc2l6ZSA9IHZhbHVlLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUoc2l6ZSkgKyBzaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgYnl0ZXN9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZSh2YWx1ZS5zaXplKCkpICsKLSAgICAgICAgICAgdmFsdWUuc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYQotICAgKiB7QGNvZGUgdWludDMyfSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVVSW50MzJTaXplTm9UYWcoZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVSYXdWYXJpbnQzMlNpemUodmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4gZW51bSBmaWVsZC4KLSAgICogQ2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBjb252ZXJ0aW5nIHRoZSBlbnVtIHZhbHVlIHRvIGl0cyBudW1lcmljIHZhbHVlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZUVudW1TaXplTm9UYWcoZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgcmV0dXJuIGNvbXB1dGVJbnQzMlNpemVOb1RhZyh2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkMzJ9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBMSVRUTEVfRU5ESUFOXzMyX1NJWkU7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ZpeGVkNjR9IGZpZWxkLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKGZpbmFsIGxvbmcgdmFsdWUpIHsKLSAgICByZXR1cm4gTElUVExFX0VORElBTl82NF9TSVpFOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbXB1dGUgdGhlIG51bWJlciBvZiBieXRlcyB0aGF0IHdvdWxkIGJlIG5lZWRlZCB0byBlbmNvZGUgYW4KLSAgICoge0Bjb2RlIHNpbnQzMn0gZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlU0ludDMyU2l6ZU5vVGFnKGZpbmFsIGludCB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50MzJTaXplKGVuY29kZVppZ1phZzMyKHZhbHVlKSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhbgotICAgKiB7QGNvZGUgc2ludDY0fSBmaWVsZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGNvbXB1dGVTSW50NjRTaXplTm9UYWcoZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIHJldHVybiBjb21wdXRlUmF3VmFyaW50NjRTaXplKGVuY29kZVppZ1phZzY0KHZhbHVlKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBJbnRlcm5hbCBoZWxwZXIgdGhhdCB3cml0ZXMgdGhlIGN1cnJlbnQgYnVmZmVyIHRvIHRoZSBvdXRwdXQuIFRoZQotICAgKiBidWZmZXIgcG9zaXRpb24gaXMgcmVzZXQgdG8gaXRzIGluaXRpYWwgdmFsdWUgd2hlbiB0aGlzIHJldHVybnMuCi0gICAqLwotICBwcml2YXRlIHZvaWQgcmVmcmVzaEJ1ZmZlcigpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKG91dHB1dCA9PSBudWxsKSB7Ci0gICAgICAvLyBXZSdyZSB3cml0aW5nIHRvIGEgc2luZ2xlIGJ1ZmZlci4KLSAgICAgIHRocm93IG5ldyBPdXRPZlNwYWNlRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgLy8gU2luY2Ugd2UgaGF2ZSBhbiBvdXRwdXQgc3RyZWFtLCB0aGlzIGlzIG91ciBidWZmZXIKLSAgICAvLyBhbmQgYnVmZmVyIG9mZnNldCA9PSAwCi0gICAgb3V0cHV0LndyaXRlKGJ1ZmZlciwgMCwgcG9zaXRpb24pOwotICAgIHBvc2l0aW9uID0gMDsKLSAgfQotCi0gIC8qKgotICAgKiBGbHVzaGVzIHRoZSBzdHJlYW0gYW5kIGZvcmNlcyBhbnkgYnVmZmVyZWQgYnl0ZXMgdG8gYmUgd3JpdHRlbi4gIFRoaXMKLSAgICogZG9lcyBub3QgZmx1c2ggdGhlIHVuZGVybHlpbmcgT3V0cHV0U3RyZWFtLgotICAgKi8KLSAgcHVibGljIHZvaWQgZmx1c2goKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChvdXRwdXQgIT0gbnVsbCkgewotICAgICAgcmVmcmVzaEJ1ZmZlcigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBJZiB3cml0aW5nIHRvIGEgZmxhdCBhcnJheSwgcmV0dXJuIHRoZSBzcGFjZSBsZWZ0IGluIHRoZSBhcnJheS4KLSAgICogT3RoZXJ3aXNlLCB0aHJvd3Mge0Bjb2RlIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9ufS4KLSAgICovCi0gIHB1YmxpYyBpbnQgc3BhY2VMZWZ0KCkgewotICAgIGlmIChvdXRwdXQgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIGxpbWl0IC0gcG9zaXRpb247Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgInNwYWNlTGVmdCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBDb2RlZE91dHB1dFN0cmVhbXMgdGhhdCBhcmUgIiArCi0gICAgICAgICJ3cml0aW5nIHRvIGEgZmxhdCBhcnJheS4iKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVmVyaWZpZXMgdGhhdCB7QGxpbmsgI3NwYWNlTGVmdCgpfSByZXR1cm5zIHplcm8uICBJdCdzIGNvbW1vbiB0byBjcmVhdGUKLSAgICogYSBieXRlIGFycmF5IHRoYXQgaXMgZXhhY3RseSBiaWcgZW5vdWdoIHRvIGhvbGQgYSBtZXNzYWdlLCB0aGVuIHdyaXRlIHRvCi0gICAqIGl0IHdpdGggYSB7QGNvZGUgQ29kZWRPdXRwdXRTdHJlYW19LiAgQ2FsbGluZyB7QGNvZGUgY2hlY2tOb1NwYWNlTGVmdCgpfQotICAgKiBhZnRlciB3cml0aW5nIHZlcmlmaWVzIHRoYXQgdGhlIG1lc3NhZ2Ugd2FzIGFjdHVhbGx5IGFzIGJpZyBhcyBleHBlY3RlZCwKLSAgICogd2hpY2ggY2FuIGhlbHAgY2F0Y2ggYnVncy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNoZWNrTm9TcGFjZUxlZnQoKSB7Ci0gICAgaWYgKHNwYWNlTGVmdCgpICE9IDApIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICJEaWQgbm90IHdyaXRlIGFzIG11Y2ggZGF0YSBhcyBleHBlY3RlZC4iKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSWYgeW91IGNyZWF0ZSBhIENvZGVkT3V0cHV0U3RyZWFtIGFyb3VuZCBhIHNpbXBsZSBmbGF0IGFycmF5LCB5b3UgbXVzdAotICAgKiBub3QgYXR0ZW1wdCB0byB3cml0ZSBtb3JlIGJ5dGVzIHRoYW4gdGhlIGFycmF5IGhhcyBzcGFjZS4gIE90aGVyd2lzZSwKLSAgICogdGhpcyBleGNlcHRpb24gd2lsbCBiZSB0aHJvd24uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE91dE9mU3BhY2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTY5NDc0ODY4ODY5OTc4ODk0OTlMOwotCi0gICAgT3V0T2ZTcGFjZUV4Y2VwdGlvbigpIHsKLSAgICAgIHN1cGVyKCJDb2RlZE91dHB1dFN0cmVhbSB3YXMgd3JpdGluZyB0byBhIGZsYXQgYnl0ZSBhcnJheSBhbmQgcmFuICIgKwotICAgICAgICAgICAgIm91dCBvZiBzcGFjZS4iKTsKLSAgICB9Ci0gIH0KLQotICAvKiogV3JpdGUgYSBzaW5nbGUgYnl0ZS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlKGZpbmFsIGJ5dGUgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgaWYgKHBvc2l0aW9uID09IGxpbWl0KSB7Ci0gICAgICByZWZyZXNoQnVmZmVyKCk7Ci0gICAgfQotCi0gICAgYnVmZmVyW3Bvc2l0aW9uKytdID0gdmFsdWU7Ci0gIH0KLQotICAvKiogV3JpdGUgYSBzaW5nbGUgYnl0ZSwgcmVwcmVzZW50ZWQgYnkgYW4gaW50ZWdlciB2YWx1ZS4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlKGZpbmFsIGludCB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd0J5dGUoKGJ5dGUpIHZhbHVlKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhIGJ5dGUgc3RyaW5nLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdCeXRlcyh2YWx1ZSwgMCwgdmFsdWUuc2l6ZSgpKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBhbiBhcnJheSBvZiBieXRlcy4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdCeXRlcyhmaW5hbCBieXRlW10gdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdCeXRlcyh2YWx1ZSwgMCwgdmFsdWUubGVuZ3RoKTsKLSAgfQotCi0gIC8qKiBXcml0ZSBwYXJ0IG9mIGFuIGFycmF5IG9mIGJ5dGVzLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVJhd0J5dGVzKGZpbmFsIGJ5dGVbXSB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChsaW1pdCAtIHBvc2l0aW9uID49IGxlbmd0aCkgewotICAgICAgLy8gV2UgaGF2ZSByb29tIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWUsIG9mZnNldCwgYnVmZmVyLCBwb3NpdGlvbiwgbGVuZ3RoKTsKLSAgICAgIHBvc2l0aW9uICs9IGxlbmd0aDsKLSAgICB9IGVsc2UgewotICAgICAgLy8gV3JpdGUgZXh0ZW5kcyBwYXN0IGN1cnJlbnQgYnVmZmVyLiAgRmlsbCB0aGUgcmVzdCBvZiB0aGlzIGJ1ZmZlciBhbmQKLSAgICAgIC8vIGZsdXNoLgotICAgICAgZmluYWwgaW50IGJ5dGVzV3JpdHRlbiA9IGxpbWl0IC0gcG9zaXRpb247Ci0gICAgICBTeXN0ZW0uYXJyYXljb3B5KHZhbHVlLCBvZmZzZXQsIGJ1ZmZlciwgcG9zaXRpb24sIGJ5dGVzV3JpdHRlbik7Ci0gICAgICBvZmZzZXQgKz0gYnl0ZXNXcml0dGVuOwotICAgICAgbGVuZ3RoIC09IGJ5dGVzV3JpdHRlbjsKLSAgICAgIHBvc2l0aW9uID0gbGltaXQ7Ci0gICAgICByZWZyZXNoQnVmZmVyKCk7Ci0KLSAgICAgIC8vIE5vdyBkZWFsIHdpdGggdGhlIHJlc3QuCi0gICAgICAvLyBTaW5jZSB3ZSBoYXZlIGFuIG91dHB1dCBzdHJlYW0sIHRoaXMgaXMgb3VyIGJ1ZmZlcgotICAgICAgLy8gYW5kIGJ1ZmZlciBvZmZzZXQgPT0gMAotICAgICAgaWYgKGxlbmd0aCA8PSBsaW1pdCkgewotICAgICAgICAvLyBGaXRzIGluIG5ldyBidWZmZXIuCi0gICAgICAgIFN5c3RlbS5hcnJheWNvcHkodmFsdWUsIG9mZnNldCwgYnVmZmVyLCAwLCBsZW5ndGgpOwotICAgICAgICBwb3NpdGlvbiA9IGxlbmd0aDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdyaXRlIGlzIHZlcnkgYmlnLiAgTGV0J3MgZG8gaXQgYWxsIGF0IG9uY2UuCi0gICAgICAgIG91dHB1dC53cml0ZSh2YWx1ZSwgb2Zmc2V0LCBsZW5ndGgpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKiBXcml0ZSBwYXJ0IG9mIGEgYnl0ZSBzdHJpbmcuICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlUmF3Qnl0ZXMoZmluYWwgQnl0ZVN0cmluZyB2YWx1ZSwgaW50IG9mZnNldCwgaW50IGxlbmd0aCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGlmIChsaW1pdCAtIHBvc2l0aW9uID49IGxlbmd0aCkgewotICAgICAgLy8gV2UgaGF2ZSByb29tIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4KLSAgICAgIHZhbHVlLmNvcHlUbyhidWZmZXIsIG9mZnNldCwgcG9zaXRpb24sIGxlbmd0aCk7Ci0gICAgICBwb3NpdGlvbiArPSBsZW5ndGg7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFdyaXRlIGV4dGVuZHMgcGFzdCBjdXJyZW50IGJ1ZmZlci4gIEZpbGwgdGhlIHJlc3Qgb2YgdGhpcyBidWZmZXIgYW5kCi0gICAgICAvLyBmbHVzaC4KLSAgICAgIGZpbmFsIGludCBieXRlc1dyaXR0ZW4gPSBsaW1pdCAtIHBvc2l0aW9uOwotICAgICAgdmFsdWUuY29weVRvKGJ1ZmZlciwgb2Zmc2V0LCBwb3NpdGlvbiwgYnl0ZXNXcml0dGVuKTsKLSAgICAgIG9mZnNldCArPSBieXRlc1dyaXR0ZW47Ci0gICAgICBsZW5ndGggLT0gYnl0ZXNXcml0dGVuOwotICAgICAgcG9zaXRpb24gPSBsaW1pdDsKLSAgICAgIHJlZnJlc2hCdWZmZXIoKTsKLQotICAgICAgLy8gTm93IGRlYWwgd2l0aCB0aGUgcmVzdC4KLSAgICAgIC8vIFNpbmNlIHdlIGhhdmUgYW4gb3V0cHV0IHN0cmVhbSwgdGhpcyBpcyBvdXIgYnVmZmVyCi0gICAgICAvLyBhbmQgYnVmZmVyIG9mZnNldCA9PSAwCi0gICAgICBpZiAobGVuZ3RoIDw9IGxpbWl0KSB7Ci0gICAgICAgIC8vIEZpdHMgaW4gbmV3IGJ1ZmZlci4KLSAgICAgICAgdmFsdWUuY29weVRvKGJ1ZmZlciwgb2Zmc2V0LCAwLCBsZW5ndGgpOwotICAgICAgICBwb3NpdGlvbiA9IGxlbmd0aDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIFdyaXRlIGlzIHZlcnkgYmlnLCBidXQgd2UgY2FuJ3QgZG8gaXQgYWxsIGF0IG9uY2Ugd2l0aG91dCBhbGxvY2F0aW5nCi0gICAgICAgIC8vIGFuIGEgY29weSBvZiB0aGUgYnl0ZSBhcnJheSBzaW5jZSBCeXRlU3RyaW5nIGRvZXMgbm90IGdpdmUgdXMgYWNjZXNzCi0gICAgICAgIC8vIHRvIHRoZSB1bmRlcmx5aW5nIGJ5dGVzLiBVc2UgdGhlIElucHV0U3RyZWFtIGludGVyZmFjZSBvbiB0aGUKLSAgICAgICAgLy8gQnl0ZVN0cmluZyBhbmQgb3VyIGJ1ZmZlciB0byBjb3B5IGJldHdlZW4gdGhlIHR3by4KLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXRTdHJlYW1Gcm9tID0gdmFsdWUubmV3SW5wdXQoKTsKLSAgICAgICAgaWYgKG9mZnNldCAhPSBpbnB1dFN0cmVhbUZyb20uc2tpcChvZmZzZXQpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigiU2tpcCBmYWlsZWQ/IFNob3VsZCBuZXZlciBoYXBwZW4uIik7Ci0gICAgICAgIH0KLSAgICAgICAgLy8gVXNlIHRoZSBidWZmZXIgYXMgdGhlIHRlbXBvcmFyeSBidWZmZXIgdG8gYXZvaWQgYWxsb2NhdGluZyBtZW1vcnkuCi0gICAgICAgIHdoaWxlIChsZW5ndGggPiAwKSB7Ci0gICAgICAgICAgaW50IGJ5dGVzVG9SZWFkID0gTWF0aC5taW4obGVuZ3RoLCBsaW1pdCk7Ci0gICAgICAgICAgaW50IGJ5dGVzUmVhZCA9IGlucHV0U3RyZWFtRnJvbS5yZWFkKGJ1ZmZlciwgMCwgYnl0ZXNUb1JlYWQpOwotICAgICAgICAgIGlmIChieXRlc1JlYWQgIT0gYnl0ZXNUb1JlYWQpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIlJlYWQgZmFpbGVkPyBTaG91bGQgbmV2ZXIgaGFwcGVuIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIG91dHB1dC53cml0ZShidWZmZXIsIDAsIGJ5dGVzUmVhZCk7Ci0gICAgICAgICAgbGVuZ3RoIC09IGJ5dGVzUmVhZDsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKiBFbmNvZGUgYW5kIHdyaXRlIGEgdGFnLiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVRhZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB3aXJlVHlwZSkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3cml0ZVJhd1ZhcmludDMyKFdpcmVGb3JtYXQubWFrZVRhZyhmaWVsZE51bWJlciwgd2lyZVR5cGUpKTsKLSAgfQotCi0gIC8qKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEgdGFnLiAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlVGFnU2l6ZShmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKLSAgICByZXR1cm4gY29tcHV0ZVJhd1ZhcmludDMyU2l6ZShXaXJlRm9ybWF0Lm1ha2VUYWcoZmllbGROdW1iZXIsIDApKTsKLSAgfQotCi0gIC8qKgotICAgKiBFbmNvZGUgYW5kIHdyaXRlIGEgdmFyaW50LiAge0Bjb2RlIHZhbHVlfSBpcyB0cmVhdGVkIGFzCi0gICAqIHVuc2lnbmVkLCBzbyBpdCB3b24ndCBiZSBzaWduLWV4dGVuZGVkIGlmIG5lZ2F0aXZlLgotICAgKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdWYXJpbnQzMihpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGlmICgodmFsdWUgJiB+MHg3RikgPT0gMCkgewotICAgICAgICB3cml0ZVJhd0J5dGUodmFsdWUpOwotICAgICAgICByZXR1cm47Ci0gICAgICB9IGVsc2UgewotICAgICAgICB3cml0ZVJhd0J5dGUoKHZhbHVlICYgMHg3RikgfCAweDgwKTsKLSAgICAgICAgdmFsdWUgPj4+PSA3OwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEgdmFyaW50LgotICAgKiB7QGNvZGUgdmFsdWV9IGlzIHRyZWF0ZWQgYXMgdW5zaWduZWQsIHNvIGl0IHdvbid0IGJlIHNpZ24tZXh0ZW5kZWQgaWYKLSAgICogbmVnYXRpdmUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlUmF3VmFyaW50MzJTaXplKGZpbmFsIGludCB2YWx1ZSkgewotICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCAgNykpID09IDApIHJldHVybiAxOwotICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCAxNCkpID09IDApIHJldHVybiAyOwotICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCAyMSkpID09IDApIHJldHVybiAzOwotICAgIGlmICgodmFsdWUgJiAoMHhmZmZmZmZmZiA8PCAyOCkpID09IDApIHJldHVybiA0OwotICAgIHJldHVybiA1OwotICB9Ci0KLSAgLyoqIEVuY29kZSBhbmQgd3JpdGUgYSB2YXJpbnQuICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlUmF3VmFyaW50NjQobG9uZyB2YWx1ZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgaWYgKCh2YWx1ZSAmIH4weDdGTCkgPT0gMCkgewotICAgICAgICB3cml0ZVJhd0J5dGUoKGludCl2YWx1ZSk7Ci0gICAgICAgIHJldHVybjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHdyaXRlUmF3Qnl0ZSgoKGludCl2YWx1ZSAmIDB4N0YpIHwgMHg4MCk7Ci0gICAgICAgIHZhbHVlID4+Pj0gNzsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhIHZhcmludC4gKi8KLSAgcHVibGljIHN0YXRpYyBpbnQgY29tcHV0ZVJhd1ZhcmludDY0U2l6ZShmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8ICA3KSkgPT0gMCkgcmV0dXJuIDE7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDE0KSkgPT0gMCkgcmV0dXJuIDI7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDIxKSkgPT0gMCkgcmV0dXJuIDM7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDI4KSkgPT0gMCkgcmV0dXJuIDQ7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDM1KSkgPT0gMCkgcmV0dXJuIDU7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDQyKSkgPT0gMCkgcmV0dXJuIDY7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDQ5KSkgPT0gMCkgcmV0dXJuIDc7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDU2KSkgPT0gMCkgcmV0dXJuIDg7Ci0gICAgaWYgKCh2YWx1ZSAmICgweGZmZmZmZmZmZmZmZmZmZmZMIDw8IDYzKSkgPT0gMCkgcmV0dXJuIDk7Ci0gICAgcmV0dXJuIDEwOwotICB9Ci0KLSAgLyoqIFdyaXRlIGEgbGl0dGxlLWVuZGlhbiAzMi1iaXQgaW50ZWdlci4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdMaXR0bGVFbmRpYW4zMihmaW5hbCBpbnQgdmFsdWUpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgd3JpdGVSYXdCeXRlKCh2YWx1ZSAgICAgICkgJiAweEZGKTsKLSAgICB3cml0ZVJhd0J5dGUoKHZhbHVlID4+ICA4KSAmIDB4RkYpOwotICAgIHdyaXRlUmF3Qnl0ZSgodmFsdWUgPj4gMTYpICYgMHhGRik7Ci0gICAgd3JpdGVSYXdCeXRlKCh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IExJVFRMRV9FTkRJQU5fMzJfU0laRSA9IDQ7Ci0KLSAgLyoqIFdyaXRlIGEgbGl0dGxlLWVuZGlhbiA2NC1iaXQgaW50ZWdlci4gKi8KLSAgcHVibGljIHZvaWQgd3JpdGVSYXdMaXR0bGVFbmRpYW42NChmaW5hbCBsb25nIHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSAgICAgICkgJiAweEZGKTsKLSAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgPj4gIDgpICYgMHhGRik7Ci0gICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlID4+IDE2KSAmIDB4RkYpOwotICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSA+PiAyNCkgJiAweEZGKTsKLSAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgPj4gMzIpICYgMHhGRik7Ci0gICAgd3JpdGVSYXdCeXRlKChpbnQpKHZhbHVlID4+IDQwKSAmIDB4RkYpOwotICAgIHdyaXRlUmF3Qnl0ZSgoaW50KSh2YWx1ZSA+PiA0OCkgJiAweEZGKTsKLSAgICB3cml0ZVJhd0J5dGUoKGludCkodmFsdWUgPj4gNTYpICYgMHhGRik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBMSVRUTEVfRU5ESUFOXzY0X1NJWkUgPSA4OwotCi0gIC8qKgotICAgKiBFbmNvZGUgYSBaaWdaYWctZW5jb2RlZCAzMi1iaXQgdmFsdWUuICBaaWdaYWcgZW5jb2RlcyBzaWduZWQgaW50ZWdlcnMKLSAgICogaW50byB2YWx1ZXMgdGhhdCBjYW4gYmUgZWZmaWNpZW50bHkgZW5jb2RlZCB3aXRoIHZhcmludC4gIChPdGhlcndpc2UsCi0gICAqIG5lZ2F0aXZlIHZhbHVlcyBtdXN0IGJlIHNpZ24tZXh0ZW5kZWQgdG8gNjQgYml0cyB0byBiZSB2YXJpbnQgZW5jb2RlZCwKLSAgICogdGh1cyBhbHdheXMgdGFraW5nIDEwIGJ5dGVzIG9uIHRoZSB3aXJlLikKLSAgICoKLSAgICogQHBhcmFtIG4gQSBzaWduZWQgMzItYml0IGludGVnZXIuCi0gICAqIEByZXR1cm4gQW4gdW5zaWduZWQgMzItYml0IGludGVnZXIsIHN0b3JlZCBpbiBhIHNpZ25lZCBpbnQgYmVjYXVzZQotICAgKiAgICAgICAgIEphdmEgaGFzIG5vIGV4cGxpY2l0IHVuc2lnbmVkIHN1cHBvcnQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBlbmNvZGVaaWdaYWczMihmaW5hbCBpbnQgbikgewotICAgIC8vIE5vdGU6ICB0aGUgcmlnaHQtc2hpZnQgbXVzdCBiZSBhcml0aG1ldGljCi0gICAgcmV0dXJuIChuIDw8IDEpIF4gKG4gPj4gMzEpOwotICB9Ci0KLSAgLyoqCi0gICAqIEVuY29kZSBhIFppZ1phZy1lbmNvZGVkIDY0LWJpdCB2YWx1ZS4gIFppZ1phZyBlbmNvZGVzIHNpZ25lZCBpbnRlZ2VycwotICAgKiBpbnRvIHZhbHVlcyB0aGF0IGNhbiBiZSBlZmZpY2llbnRseSBlbmNvZGVkIHdpdGggdmFyaW50LiAgKE90aGVyd2lzZSwKLSAgICogbmVnYXRpdmUgdmFsdWVzIG11c3QgYmUgc2lnbi1leHRlbmRlZCB0byA2NCBiaXRzIHRvIGJlIHZhcmludCBlbmNvZGVkLAotICAgKiB0aHVzIGFsd2F5cyB0YWtpbmcgMTAgYnl0ZXMgb24gdGhlIHdpcmUuKQotICAgKgotICAgKiBAcGFyYW0gbiBBIHNpZ25lZCA2NC1iaXQgaW50ZWdlci4KLSAgICogQHJldHVybiBBbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciwgc3RvcmVkIGluIGEgc2lnbmVkIGludCBiZWNhdXNlCi0gICAqICAgICAgICAgSmF2YSBoYXMgbm8gZXhwbGljaXQgdW5zaWduZWQgc3VwcG9ydC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgbG9uZyBlbmNvZGVaaWdaYWc2NChmaW5hbCBsb25nIG4pIHsKLSAgICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYwotICAgIHJldHVybiAobiA8PCAxKSBeIChuID4+IDYzKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3JzLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMmVlODQ1OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnMuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE4ODcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zLio7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBDb250YWlucyBhIGNvbGxlY3Rpb24gb2YgY2xhc3NlcyB3aGljaCBkZXNjcmliZSBwcm90b2NvbCBtZXNzYWdlIHR5cGVzLgotICoKLSAqIEV2ZXJ5IG1lc3NhZ2UgdHlwZSBoYXMgYSB7QGxpbmsgRGVzY3JpcHRvcn0sIHdoaWNoIGxpc3RzIGFsbAotICogaXRzIGZpZWxkcyBhbmQgb3RoZXIgaW5mb3JtYXRpb24gYWJvdXQgYSB0eXBlLiAgWW91IGNhbiBnZXQgYSBtZXNzYWdlCi0gKiB0eXBlJ3MgZGVzY3JpcHRvciBieSBjYWxsaW5nIHtAY29kZSBNZXNzYWdlVHlwZS5nZXREZXNjcmlwdG9yKCl9LCBvcgotICogKGdpdmVuIGEgbWVzc2FnZSBvYmplY3Qgb2YgdGhlIHR5cGUpIHtAY29kZSBtZXNzYWdlLmdldERlc2NyaXB0b3JGb3JUeXBlKCl9LgotICogRnVydGhlcm1vcmUsIGVhY2ggbWVzc2FnZSBpcyBhc3NvY2lhdGVkIHdpdGggYSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGZvcgotICogYSByZWxldmFudCB7QGNvZGUgLnByb3RvfSBmaWxlLiBZb3UgY2FuIG9idGFpbiBpdCBieSBjYWxsaW5nCi0gKiB7QGNvZGUgRGVzY3JpcHRvci5nZXRGaWxlKCl9LiBBIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gY29udGFpbnMgZGVzY3JpcHRvcnMKLSAqIGZvciBhbGwgdGhlIG1lc3NhZ2VzIGRlZmluZWQgaW4gdGhhdCBmaWxlLCBhbmQgZmlsZSBkZXNjcmlwdG9ycyBmb3IgYWxsIHRoZQotICogaW1wb3J0ZWQge0Bjb2RlIC5wcm90b30gZmlsZXMuCi0gKgotICogRGVzY3JpcHRvcnMgYXJlIGJ1aWx0IGZyb20gRGVzY3JpcHRvclByb3RvcywgYXMgZGVmaW5lZCBpbgotICoge0Bjb2RlIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvfS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRGVzY3JpcHRvcnMgewotICAvKioKLSAgICogRGVzY3JpYmVzIGEge0Bjb2RlIC5wcm90b30gZmlsZSwgaW5jbHVkaW5nIGV2ZXJ5dGhpbmcgZGVmaW5lZCB3aXRoaW4uCi0gICAqIFRoYXQgaW5jbHVkZXMsIGluIHBhcnRpY3VsYXIsIGRlc2NyaXB0b3JzIGZvciBhbGwgdGhlIG1lc3NhZ2VzIGFuZAotICAgKiBmaWxlIGRlc2NyaXB0b3JzIGZvciBhbGwgb3RoZXIgaW1wb3J0ZWQge0Bjb2RlIC5wcm90b30gZmlsZXMKLSAgICogKGRlcGVuZGVuY2llcykuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpbGVEZXNjcmlwdG9yIHsKLSAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3JQcm90byB0b1Byb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KLQotICAgIC8qKiBHZXQgdGhlIGZpbGUgbmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiBwcm90by5nZXROYW1lKCk7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgcHJvdG8gcGFja2FnZSBuYW1lLiAgVGhpcyBpcyB0aGUgcGFja2FnZSBuYW1lIGdpdmVuIGJ5IHRoZQotICAgICAqIHtAY29kZSBwYWNrYWdlfSBzdGF0ZW1lbnQgaW4gdGhlIHtAY29kZSAucHJvdG99IGZpbGUsIHdoaWNoIGRpZmZlcnMKLSAgICAgKiBmcm9tIHRoZSBKYXZhIHBhY2thZ2UuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQYWNrYWdlKCkgeyByZXR1cm4gcHJvdG8uZ2V0UGFja2FnZSgpOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGNvZGUgRmlsZU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KLSAgICBwdWJsaWMgRmlsZU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgdG9wLWxldmVsIG1lc3NhZ2UgdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLiAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0b3I+IGdldE1lc3NhZ2VUeXBlcygpIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QobWVzc2FnZVR5cGVzKSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgdG9wLWxldmVsIGVudW0gdHlwZXMgZGVjbGFyZWQgaW4gdGhpcyBmaWxlLiAqLwotICAgIHB1YmxpYyBMaXN0PEVudW1EZXNjcmlwdG9yPiBnZXRFbnVtVHlwZXMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGVudW1UeXBlcykpOwotICAgIH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRvcC1sZXZlbCBzZXJ2aWNlcyBkZWNsYXJlZCBpbiB0aGlzIGZpbGUuICovCi0gICAgcHVibGljIExpc3Q8U2VydmljZURlc2NyaXB0b3I+IGdldFNlcnZpY2VzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChzZXJ2aWNlcykpOwotICAgIH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRvcC1sZXZlbCBleHRlbnNpb25zIGRlY2xhcmVkIGluIHRoaXMgZmlsZS4gKi8KLSAgICBwdWJsaWMgTGlzdDxGaWVsZERlc2NyaXB0b3I+IGdldEV4dGVuc2lvbnMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGV4dGVuc2lvbnMpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IGEgbGlzdCBvZiB0aGlzIGZpbGUncyBkZXBlbmRlbmNpZXMgKGltcG9ydHMpLiAqLwotICAgIHB1YmxpYyBMaXN0PEZpbGVEZXNjcmlwdG9yPiBnZXREZXBlbmRlbmNpZXMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KGRlcGVuZGVuY2llcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYSBtZXNzYWdlIHR5cGUgaW4gdGhlIGZpbGUgYnkgbmFtZS4gIERvZXMgbm90IGZpbmQgbmVzdGVkIHR5cGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIHR5cGUgbmFtZSB0byBsb29rIGZvci4KLSAgICAgKiBAcmV0dXJuIFRoZSBtZXNzYWdlIHR5cGUncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBEZXNjcmlwdG9yIGZpbmRNZXNzYWdlVHlwZUJ5TmFtZShTdHJpbmcgbmFtZSkgewotICAgICAgLy8gRG9uJ3QgYWxsb3cgbG9va2luZyB1cCBuZXN0ZWQgdHlwZXMuICBUaGlzIHdpbGwgbWFrZSBvcHRpbWl6YXRpb24KLSAgICAgIC8vIGVhc2llciBsYXRlci4KLSAgICAgIGlmIChuYW1lLmluZGV4T2YoJy4nKSAhPSAtMSkgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICAgIGlmIChnZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICAgIG5hbWUgPSBnZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOwotICAgICAgfQotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gcG9vbC5maW5kU3ltYm9sKG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIERlc2NyaXB0b3IgJiYKLSAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuIChEZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYW4gZW51bSB0eXBlIGluIHRoZSBmaWxlIGJ5IG5hbWUuICBEb2VzIG5vdCBmaW5kIG5lc3RlZCB0eXBlcy4KLSAgICAgKgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCB0eXBlIG5hbWUgdG8gbG9vayBmb3IuCi0gICAgICogQHJldHVybiBUaGUgZW51bSB0eXBlJ3MgZGVzY3JpcHRvciwgb3Ige0Bjb2RlIG51bGx9IGlmIG5vdCBmb3VuZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bURlc2NyaXB0b3IgZmluZEVudW1UeXBlQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAvLyBEb24ndCBhbGxvdyBsb29raW5nIHVwIG5lc3RlZCB0eXBlcy4gIFRoaXMgd2lsbCBtYWtlIG9wdGltaXphdGlvbgotICAgICAgLy8gZWFzaWVyIGxhdGVyLgotICAgICAgaWYgKG5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgaWYgKGdldFBhY2thZ2UoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgbmFtZSA9IGdldFBhY2thZ2UoKSArICcuJyArIG5hbWU7Ci0gICAgICB9Ci0gICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPSBwb29sLmZpbmRTeW1ib2wobmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRW51bURlc2NyaXB0b3IgJiYKLSAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuIChFbnVtRGVzY3JpcHRvcilyZXN1bHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGEgc2VydmljZSB0eXBlIGluIHRoZSBmaWxlIGJ5IG5hbWUuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgdHlwZSBuYW1lIHRvIGxvb2sgZm9yLgotICAgICAqIEByZXR1cm4gVGhlIHNlcnZpY2UgdHlwZSdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yIGZpbmRTZXJ2aWNlQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICAvLyBEb24ndCBhbGxvdyBsb29raW5nIHVwIG5lc3RlZCB0eXBlcy4gIFRoaXMgd2lsbCBtYWtlIG9wdGltaXphdGlvbgotICAgICAgLy8gZWFzaWVyIGxhdGVyLgotICAgICAgaWYgKG5hbWUuaW5kZXhPZignLicpICE9IC0xKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgICAgaWYgKGdldFBhY2thZ2UoKS5sZW5ndGgoKSA+IDApIHsKLSAgICAgICAgbmFtZSA9IGdldFBhY2thZ2UoKSArICcuJyArIG5hbWU7Ci0gICAgICB9Ci0gICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPSBwb29sLmZpbmRTeW1ib2wobmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgU2VydmljZURlc2NyaXB0b3IgJiYKLSAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuIChTZXJ2aWNlRGVzY3JpcHRvcilyZXN1bHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kIGFuIGV4dGVuc2lvbiBpbiB0aGUgZmlsZSBieSBuYW1lLiAgRG9lcyBub3QgZmluZCBleHRlbnNpb25zIG5lc3RlZAotICAgICAqIGluc2lkZSBtZXNzYWdlIHR5cGVzLgotICAgICAqCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIGV4dGVuc2lvbiBuYW1lIHRvIGxvb2sgZm9yLgotICAgICAqIEByZXR1cm4gVGhlIGV4dGVuc2lvbidzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBmaW5kRXh0ZW5zaW9uQnlOYW1lKFN0cmluZyBuYW1lKSB7Ci0gICAgICBpZiAobmFtZS5pbmRleE9mKCcuJykgIT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgICBpZiAoZ2V0UGFja2FnZSgpLmxlbmd0aCgpID4gMCkgewotICAgICAgICBuYW1lID0gZ2V0UGFja2FnZSgpICsgJy4nICsgbmFtZTsKLSAgICAgIH0KLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9IHBvb2wuZmluZFN5bWJvbChuYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBGaWVsZERlc2NyaXB0b3IgJiYKLSAgICAgICAgICByZXN1bHQuZ2V0RmlsZSgpID09IHRoaXMpIHsKLSAgICAgICAgcmV0dXJuIChGaWVsZERlc2NyaXB0b3IpcmVzdWx0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEge0Bjb2RlIEZpbGVEZXNjcmlwdG9yfS4KLSAgICAgKgotICAgICAqIEBwYXJhbSBwcm90byBUaGUgcHJvdG9jb2wgbWVzc2FnZSBmb3JtIG9mIHRoZSBGaWxlRGVzY3JpcHRvci4KLSAgICAgKiBAcGFyYW0gZGVwZW5kZW5jaWVzIHtAY29kZSBGaWxlRGVzY3JpcHRvcn1zIGNvcnJlc3BvbmRpbmcgdG8gYWxsIG9mCi0gICAgICogICAgICAgICAgICAgICAgICAgICB0aGUgZmlsZSdzIGRlcGVuZGVuY2llcywgaW4gdGhlIGV4YWN0IG9yZGVyIGxpc3RlZAotICAgICAqICAgICAgICAgICAgICAgICAgICAgaW4ge0Bjb2RlIHByb3RvfS4KLSAgICAgKiBAdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHtAY29kZSBwcm90b30gaXMgbm90IGEgdmFsaWQKLSAgICAgKiAgICAgICAgICAgZGVzY3JpcHRvci4gIFRoaXMgY2FuIG9jY3VyIGZvciBhIG51bWJlciBvZiByZWFzb25zLCBlLmcuCi0gICAgICogICAgICAgICAgIGJlY2F1c2UgYSBmaWVsZCBoYXMgYW4gdW5kZWZpbmVkIHR5cGUgb3IgYmVjYXVzZSB0d28gbWVzc2FnZXMKLSAgICAgKiAgICAgICAgICAgd2VyZSBkZWZpbmVkIHdpdGggdGhlIHNhbWUgbmFtZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIEZpbGVEZXNjcmlwdG9yIGJ1aWxkRnJvbShmaW5hbCBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yW10gZGVwZW5kZW5jaWVzKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIC8vIEJ1aWxkaW5nIGRlY3NyaXB0b3JzIGludm9sdmVzIHR3byBzdGVwczogIHRyYW5zbGF0aW5nIGFuZCBsaW5raW5nLgotICAgICAgLy8gSW4gdGhlIHRyYW5zbGF0aW9uIHN0ZXAgKGltcGxlbWVudGVkIGJ5IEZpbGVEZXNjcmlwdG9yJ3MKLSAgICAgIC8vIGNvbnN0cnVjdG9yKSwgd2UgYnVpbGQgYW4gb2JqZWN0IHRyZWUgbWlycm9yaW5nIHRoZQotICAgICAgLy8gRmlsZURlc2NyaXB0b3JQcm90bydzIHRyZWUgYW5kIHB1dCBhbGwgb2YgdGhlIGRlc2NyaXB0b3JzIGludG8gdGhlCi0gICAgICAvLyBEZXNjcmlwdG9yUG9vbCdzIGxvb2t1cCB0YWJsZXMuICBJbiB0aGUgbGlua2luZyBzdGVwLCB3ZSBsb29rIHVwIGFsbAotICAgICAgLy8gdHlwZSByZWZlcmVuY2VzIGluIHRoZSBEZXNjcmlwdG9yUG9vbCwgc28gdGhhdCwgZm9yIGV4YW1wbGUsIGEKLSAgICAgIC8vIEZpZWxkRGVzY3JpcHRvciBmb3IgYW4gZW1iZWRkZWQgbWVzc2FnZSBjb250YWlucyBhIHBvaW50ZXIgZGlyZWN0bHkKLSAgICAgIC8vIHRvIHRoZSBEZXNjcmlwdG9yIGZvciB0aGF0IG1lc3NhZ2UncyB0eXBlLiAgV2UgYWxzbyBkZXRlY3QgdW5kZWZpbmVkCi0gICAgICAvLyB0eXBlcyBpbiB0aGUgbGlua2luZyBzdGVwLgotICAgICAgZmluYWwgRGVzY3JpcHRvclBvb2wgcG9vbCA9IG5ldyBEZXNjcmlwdG9yUG9vbChkZXBlbmRlbmNpZXMpOwotICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgcmVzdWx0ID0KLSAgICAgICAgICBuZXcgRmlsZURlc2NyaXB0b3IocHJvdG8sIGRlcGVuZGVuY2llcywgcG9vbCk7Ci0KLSAgICAgIGlmIChkZXBlbmRlbmNpZXMubGVuZ3RoICE9IHByb3RvLmdldERlcGVuZGVuY3lDb3VudCgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihyZXN1bHQsCi0gICAgICAgICAgIkRlcGVuZGVuY2llcyBwYXNzZWQgdG8gRmlsZURlc2NyaXB0b3IuYnVpbGRGcm9tKCkgZG9uJ3QgbWF0Y2ggIiArCi0gICAgICAgICAgInRob3NlIGxpc3RlZCBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4iKTsKLSAgICAgIH0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RGVwZW5kZW5jeUNvdW50KCk7IGkrKykgewotICAgICAgICBpZiAoIWRlcGVuZGVuY2llc1tpXS5nZXROYW1lKCkuZXF1YWxzKHByb3RvLmdldERlcGVuZGVuY3koaSkpKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHJlc3VsdCwKLSAgICAgICAgICAgICJEZXBlbmRlbmNpZXMgcGFzc2VkIHRvIEZpbGVEZXNjcmlwdG9yLmJ1aWxkRnJvbSgpIGRvbid0IG1hdGNoICIgKwotICAgICAgICAgICAgInRob3NlIGxpc3RlZCBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4iKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXN1bHQuY3Jvc3NMaW5rKCk7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFRoaXMgbWV0aG9kIGlzIHRvIGJlIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSBvbmx5LiAgSXQgaXMgZXF1aXZhbGVudAotICAgICAqIHRvIHtAY29kZSBidWlsZEZyb219IGV4Y2VwdCB0aGF0IHRoZSB7QGNvZGUgRmlsZURlc2NyaXB0b3JQcm90b30gaXMKLSAgICAgKiBlbmNvZGVkIGluIHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdC4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIHZvaWQgaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tKAotICAgICAgICBmaW5hbCBTdHJpbmdbXSBkZXNjcmlwdG9yRGF0YVBhcnRzLAotICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvcltdIGRlcGVuZGVuY2llcywKLSAgICAgICAgZmluYWwgSW50ZXJuYWxEZXNjcmlwdG9yQXNzaWduZXIgZGVzY3JpcHRvckFzc2lnbmVyKSB7Ci0gICAgICAvLyBIYWNrOiAgV2UgY2FuJ3QgZW1iZWQgYSByYXcgYnl0ZSBhcnJheSBpbnNpZGUgZ2VuZXJhdGVkIEphdmEgY29kZQotICAgICAgLy8gICAoYXQgbGVhc3QsIG5vdCBlZmZpY2llbnRseSksIGJ1dCB3ZSBjYW4gZW1iZWQgU3RyaW5ncy4gIFNvLCB0aGUKLSAgICAgIC8vICAgcHJvdG9jb2wgY29tcGlsZXIgZW1iZWRzIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvIGFzIGEgZ2lhbnQKLSAgICAgIC8vICAgc3RyaW5nIGxpdGVyYWwgd2hpY2ggaXMgcGFzc2VkIHRvIHRoaXMgZnVuY3Rpb24gdG8gY29uc3RydWN0IHRoZQotICAgICAgLy8gICBmaWxlJ3MgRmlsZURlc2NyaXB0b3IuICBUaGUgc3RyaW5nIGxpdGVyYWwgY29udGFpbnMgb25seSA4LWJpdAotICAgICAgLy8gICBjaGFyYWN0ZXJzLCBlYWNoIG9uZSByZXByZXNlbnRpbmcgYSBieXRlIG9mIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvJ3MKLSAgICAgIC8vICAgc2VyaWFsaXplZCBmb3JtLiAgU28sIGlmIHdlIGNvbnZlcnQgaXQgdG8gYnl0ZXMgaW4gSVNPLTg4NTktMSwgd2UKLSAgICAgIC8vICAgc2hvdWxkIGdldCB0aGUgb3JpZ2luYWwgYnl0ZXMgdGhhdCB3ZSB3YW50LgotCi0gICAgICAvLyBkZXNjcmlwdG9yRGF0YSBtYXkgY29udGFpbiBtdWx0aXBsZSBzdHJpbmdzIGluIG9yZGVyIHRvIGdldCBhcm91bmQgdGhlCi0gICAgICAvLyBKYXZhIDY0ayBzdHJpbmcgbGl0ZXJhbCBsaW1pdC4KLSAgICAgIFN0cmluZ0J1aWxkZXIgZGVzY3JpcHRvckRhdGEgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgZm9yIChTdHJpbmcgcGFydCA6IGRlc2NyaXB0b3JEYXRhUGFydHMpIHsKLSAgICAgICAgZGVzY3JpcHRvckRhdGEuYXBwZW5kKHBhcnQpOwotICAgICAgfQotCi0gICAgICBmaW5hbCBieXRlW10gZGVzY3JpcHRvckJ5dGVzOwotICAgICAgdHJ5IHsKLSAgICAgICAgZGVzY3JpcHRvckJ5dGVzID0gZGVzY3JpcHRvckRhdGEudG9TdHJpbmcoKS5nZXRCeXRlcygiSVNPLTg4NTktMSIpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJTdGFuZGFyZCBlbmNvZGluZyBJU08tODg1OS0xIG5vdCBzdXBwb3J0ZWQgYnkgSlZNLiIsIGUpOwotICAgICAgfQotCi0gICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOwotICAgICAgdHJ5IHsKLSAgICAgICAgcHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLnBhcnNlRnJvbShkZXNjcmlwdG9yQnl0ZXMpOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRmFpbGVkIHRvIHBhcnNlIHByb3RvY29sIGJ1ZmZlciBkZXNjcmlwdG9yIGZvciBnZW5lcmF0ZWQgY29kZS4iLCBlKTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgcmVzdWx0OwotICAgICAgdHJ5IHsKLSAgICAgICAgcmVzdWx0ID0gYnVpbGRGcm9tKHByb3RvLCBkZXBlbmRlbmNpZXMpOwotICAgICAgfSBjYXRjaCAoRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJJbnZhbGlkIGVtYmVkZGVkIGRlc2NyaXB0b3IgZm9yIFwiIiArIHByb3RvLmdldE5hbWUoKSArICJcIi4iLCBlKTsKLSAgICAgIH0KLQotICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPQotICAgICAgICAgIGRlc2NyaXB0b3JBc3NpZ25lci5hc3NpZ25EZXNjcmlwdG9ycyhyZXN1bHQpOwotCi0gICAgICBpZiAocmVnaXN0cnkgIT0gbnVsbCkgewotICAgICAgICAvLyBXZSBtdXN0IHJlLXBhcnNlIHRoZSBwcm90byB1c2luZyB0aGUgcmVnaXN0cnkuCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgcHJvdG8gPSBGaWxlRGVzY3JpcHRvclByb3RvLnBhcnNlRnJvbShkZXNjcmlwdG9yQnl0ZXMsIHJlZ2lzdHJ5KTsKLSAgICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIkZhaWxlZCB0byBwYXJzZSBwcm90b2NvbCBidWZmZXIgZGVzY3JpcHRvciBmb3IgZ2VuZXJhdGVkIGNvZGUuIiwKLSAgICAgICAgICAgIGUpOwotICAgICAgICB9Ci0KLSAgICAgICAgcmVzdWx0LnNldFByb3RvKHByb3RvKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGlzIGNsYXNzIHNob3VsZCBiZSB1c2VkIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICBXaGVuIGNhbGxpbmcKLSAgICAgKiB7QGxpbmsgRmlsZURlc2NyaXB0b3IjaW50ZXJuYWxCdWlsZEdlbmVyYXRlZEZpbGVGcm9tfSwgdGhlIGNhbGxlcgotICAgICAqIHByb3ZpZGVzIGEgY2FsbGJhY2sgaW1wbGVtZW50aW5nIHRoaXMgaW50ZXJmYWNlLiAgVGhlIGNhbGxiYWNrIGlzIGNhbGxlZAotICAgICAqIGFmdGVyIHRoZSBGaWxlRGVzY3JpcHRvciBoYXMgYmVlbiBjb25zdHJ1Y3RlZCwgaW4gb3JkZXIgdG8gYXNzaWduIGFsbAotICAgICAqIHRoZSBnbG9iYWwgdmFyaWFsZXMgZGVmaW5lZCBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgd2hpY2ggcG9pbnQgYXQgcGFydHMKLSAgICAgKiBvZiB0aGUgRmlsZURlc2NyaXB0b3IuICBUaGUgY2FsbGJhY2sgcmV0dXJucyBhbiBFeHRlbnNpb25SZWdpc3RyeSB3aGljaAotICAgICAqIGNvbnRhaW5zIGFueSBleHRlbnNpb25zIHdoaWNoIG1pZ2h0IGJlIHVzZWQgaW4gdGhlIGRlc2NyaXB0b3IgLS0gdGhhdAotICAgICAqIGlzLCBleHRlbnNpb25zIG9mIHRoZSB2YXJpb3VzICJPcHRpb25zIiBtZXNzYWdlcyBkZWZpbmVkIGluCi0gICAgICogZGVzY3JpcHRvci5wcm90by4gIFRoZSBjYWxsYmFjayBtYXkgYWxzbyByZXR1cm4gbnVsbCB0byBpbmRpY2F0ZSB0aGF0Ci0gICAgICogbm8gZXh0ZW5zaW9ucyBhcmUgdXNlZCBpbiB0aGUgZGVjc3JpcHRvci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50ZXJmYWNlIEludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyIHsKLSAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGFzc2lnbkRlc2NyaXB0b3JzKEZpbGVEZXNjcmlwdG9yIHJvb3QpOwotICAgIH0KLQotICAgIHByaXZhdGUgRmlsZURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JbXSBtZXNzYWdlVHlwZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFbnVtRGVzY3JpcHRvcltdIGVudW1UeXBlczsKLSAgICBwcml2YXRlIGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yW10gc2VydmljZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWVsZERlc2NyaXB0b3JbXSBleHRlbnNpb25zOwotICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yUG9vbCBwb29sOwotCi0gICAgcHJpdmF0ZSBGaWxlRGVzY3JpcHRvcihmaW5hbCBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBEZXNjcmlwdG9yUG9vbCBwb29sKQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgdGhpcy5wb29sID0gcG9vbDsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gZGVwZW5kZW5jaWVzLmNsb25lKCk7Ci0KLSAgICAgIHBvb2wuYWRkUGFja2FnZShnZXRQYWNrYWdlKCksIHRoaXMpOwotCi0gICAgICBtZXNzYWdlVHlwZXMgPSBuZXcgRGVzY3JpcHRvcltwcm90by5nZXRNZXNzYWdlVHlwZUNvdW50KCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRNZXNzYWdlVHlwZUNvdW50KCk7IGkrKykgewotICAgICAgICBtZXNzYWdlVHlwZXNbaV0gPQotICAgICAgICAgIG5ldyBEZXNjcmlwdG9yKHByb3RvLmdldE1lc3NhZ2VUeXBlKGkpLCB0aGlzLCBudWxsLCBpKTsKLSAgICAgIH0KLQotICAgICAgZW51bVR5cGVzID0gbmV3IEVudW1EZXNjcmlwdG9yW3Byb3RvLmdldEVudW1UeXBlQ291bnQoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldEVudW1UeXBlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGVudW1UeXBlc1tpXSA9IG5ldyBFbnVtRGVzY3JpcHRvcihwcm90by5nZXRFbnVtVHlwZShpKSwgdGhpcywgbnVsbCwgaSk7Ci0gICAgICB9Ci0KLSAgICAgIHNlcnZpY2VzID0gbmV3IFNlcnZpY2VEZXNjcmlwdG9yW3Byb3RvLmdldFNlcnZpY2VDb3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0U2VydmljZUNvdW50KCk7IGkrKykgewotICAgICAgICBzZXJ2aWNlc1tpXSA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRvcihwcm90by5nZXRTZXJ2aWNlKGkpLCB0aGlzLCBpKTsKLSAgICAgIH0KLQotICAgICAgZXh0ZW5zaW9ucyA9IG5ldyBGaWVsZERlc2NyaXB0b3JbcHJvdG8uZ2V0RXh0ZW5zaW9uQ291bnQoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldEV4dGVuc2lvbkNvdW50KCk7IGkrKykgewotICAgICAgICBleHRlbnNpb25zW2ldID0gbmV3IEZpZWxkRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRFeHRlbnNpb24oaSksIHRoaXMsIG51bGwsIGksIHRydWUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBMb29rIHVwIGFuZCBjcm9zcy1saW5rIGFsbCBmaWVsZCB0eXBlcywgZXRjLiAqLwotICAgIHByaXZhdGUgdm9pZCBjcm9zc0xpbmsoKSB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlIDogbWVzc2FnZVR5cGVzKSB7Ci0gICAgICAgIG1lc3NhZ2VUeXBlLmNyb3NzTGluaygpOwotICAgICAgfQotCi0gICAgICBmb3IgKGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2UgOiBzZXJ2aWNlcykgewotICAgICAgICBzZXJ2aWNlLmNyb3NzTGluaygpOwotICAgICAgfQotCi0gICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gOiBleHRlbnNpb25zKSB7Ci0gICAgICAgIGV4dGVuc2lvbi5jcm9zc0xpbmsoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXBsYWNlIG91ciB7QGxpbmsgRmlsZURlc2NyaXB0b3JQcm90b30gd2l0aCB0aGUgZ2l2ZW4gb25lLCB3aGljaCBpcwotICAgICAqIGlkZW50aWNhbCBleGNlcHQgdGhhdCBpdCBtaWdodCBjb250YWluIGV4dGVuc2lvbnMgdGhhdCB3ZXJlbid0IHByZXNlbnQKLSAgICAgKiBpbiB0aGUgb3JpZ2luYWwuICBUaGlzIG1ldGhvZCBpcyBuZWVkZWQgZm9yIGJvb3RzdHJhcHBpbmcgd2hlbiBhIGZpbGUKLSAgICAgKiBkZWZpbmVzIGN1c3RvbSBvcHRpb25zLiAgVGhlIG9wdGlvbnMgbWF5IGJlIGRlZmluZWQgaW4gdGhlIGZpbGUgaXRzZWxmLAotICAgICAqIHNvIHdlIGNhbid0IGFjdHVhbGx5IHBhcnNlIHRoZW0gdW50aWwgd2UndmUgY29uc3RydWN0ZWQgdGhlIGRlc2NyaXB0b3JzLAotICAgICAqIGJ1dCB0byBjb25zdHJ1Y3QgdGhlIGRlY3NyaXB0b3JzIHdlIGhhdmUgdG8gaGF2ZSBwYXJzZWQgdGhlIGRlc2NyaXB0b3IKLSAgICAgKiBwcm90b3MuICBTbywgd2UgaGF2ZSB0byBwYXJzZSB0aGUgZGVzY3JpcHRvciBwcm90b3MgYSBzZWNvbmQgdGltZSBhZnRlcgotICAgICAqIGNvbnN0cnVjdGluZyB0aGUgZGVzY3JpcHRvcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG8pIHsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgbWVzc2FnZVR5cGVzW2ldLnNldFByb3RvKHByb3RvLmdldE1lc3NhZ2VUeXBlKGkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBlbnVtVHlwZXMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgZW51bVR5cGVzW2ldLnNldFByb3RvKHByb3RvLmdldEVudW1UeXBlKGkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBzZXJ2aWNlc1tpXS5zZXRQcm90byhwcm90by5nZXRTZXJ2aWNlKGkpKTsKLSAgICAgIH0KLQotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25zLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGV4dGVuc2lvbnNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0RXh0ZW5zaW9uKGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKiBEZXNjcmliZXMgYSBtZXNzYWdlIHR5cGUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRGVzY3JpcHRvciBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yIHsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudC4gIEluIG90aGVyIHdvcmRzLAotICAgICAqIGdpdmVuIGEge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSB7QGNvZGUgZmlsZX0sIHRoZSBmb2xsb3dpbmcgaXMgdHJ1ZToKLSAgICAgKiA8cHJlPgotICAgICAqICAgZm9yIGFsbCBpIGluIFswLCBmaWxlLmdldE1lc3NhZ2VUeXBlQ291bnQoKSk6Ci0gICAgICogICAgIGZpbGUuZ2V0TWVzc2FnZVR5cGUoaSkuZ2V0SW5kZXgoKSA9PSBpCi0gICAgICogPC9wcmU+Ci0gICAgICogU2ltaWxhcmx5LCBmb3IgYSB7QGxpbmsgRGVzY3JpcHRvcn0ge0Bjb2RlIG1lc3NhZ2VUeXBlfToKLSAgICAgKiA8cHJlPgotICAgICAqICAgZm9yIGFsbCBpIGluIFswLCBtZXNzYWdlVHlwZS5nZXROZXN0ZWRUeXBlQ291bnQoKSk6Ci0gICAgICogICAgIG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGUoaSkuZ2V0SW5kZXgoKSA9PSBpCi0gICAgICogPC9wcmU+Ci0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9Ci0KLSAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQotCi0gICAgLyoqIEdldCB0aGUgdHlwZSdzIHVucXVhbGlmaWVkIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHR5cGUncyBmdWxseS1xdWFsaWZpZWQgbmFtZSwgd2l0aGluIHRoZSBwcm90byBsYW5ndWFnZSdzCi0gICAgICogbmFtZXNwYWNlLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlIEphdmEgbmFtZS4gIEZvciBleGFtcGxlLCBnaXZlbiB0aGlzCi0gICAgICoge0Bjb2RlIC5wcm90b306Ci0gICAgICogPHByZT4KLSAgICAgKiAgIHBhY2thZ2UgZm9vLmJhcjsKLSAgICAgKiAgIG9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmV4YW1wbGUucHJvdG9zIgotICAgICAqICAgbWVzc2FnZSBCYXoge30KLSAgICAgKiA8L3ByZT4KLSAgICAgKiB7QGNvZGUgQmF6fSdzIGZ1bGwgbmFtZSBpcyAiZm9vLmJhci5CYXoiLgotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7IHJldHVybiBmdWxsTmFtZTsgfQotCi0gICAgLyoqIEdldCB0aGUge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBjb250YWluaW5nIHRoaXMgZGVzY3JpcHRvci4gKi8KLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7IH0KLQotICAgIC8qKiBJZiB0aGlzIGlzIGEgbmVzdGVkIHR5cGUsIGdldCB0aGUgb3V0ZXIgZGVzY3JpcHRvciwgb3RoZXJ3aXNlIG51bGwuICovCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0Q29udGFpbmluZ1R5cGUoKSB7IHJldHVybiBjb250YWluaW5nVHlwZTsgfQotCi0gICAgLyoqIEdldCB0aGUge0Bjb2RlIE1lc3NhZ2VPcHRpb25zfSwgZGVmaW5lZCBpbiB7QGNvZGUgZGVzY3JpcHRvci5wcm90b30uICovCi0gICAgcHVibGljIE1lc3NhZ2VPcHRpb25zIGdldE9wdGlvbnMoKSB7IHJldHVybiBwcm90by5nZXRPcHRpb25zKCk7IH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIHRoaXMgbWVzc2FnZSB0eXBlJ3MgZmllbGRzLiAqLwotICAgIHB1YmxpYyBMaXN0PEZpZWxkRGVzY3JpcHRvcj4gZ2V0RmllbGRzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChmaWVsZHMpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IGEgbGlzdCBvZiB0aGlzIG1lc3NhZ2UgdHlwZSdzIGV4dGVuc2lvbnMuICovCi0gICAgcHVibGljIExpc3Q8RmllbGREZXNjcmlwdG9yPiBnZXRFeHRlbnNpb25zKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChleHRlbnNpb25zKSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgbWVzc2FnZSB0eXBlcyBuZXN0ZWQgd2l0aGluIHRoaXMgb25lLiAqLwotICAgIHB1YmxpYyBMaXN0PERlc2NyaXB0b3I+IGdldE5lc3RlZFR5cGVzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChuZXN0ZWRUeXBlcykpOwotICAgIH0KLQotICAgIC8qKiBHZXQgYSBsaXN0IG9mIGVudW0gdHlwZXMgbmVzdGVkIHdpdGhpbiB0aGlzIG9uZS4gKi8KLSAgICBwdWJsaWMgTGlzdDxFbnVtRGVzY3JpcHRvcj4gZ2V0RW51bVR5cGVzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoQXJyYXlzLmFzTGlzdChlbnVtVHlwZXMpKTsKLSAgICB9Ci0KLSAgICAvKiogRGV0ZXJtaW5lcyBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIGFuIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0V4dGVuc2lvbk51bWJlcihmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICBmb3IgKGZpbmFsIERlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSByYW5nZSA6Ci0gICAgICAgICAgcHJvdG8uZ2V0RXh0ZW5zaW9uUmFuZ2VMaXN0KCkpIHsKLSAgICAgICAgaWYgKHJhbmdlLmdldFN0YXJ0KCkgPD0gbnVtYmVyICYmIG51bWJlciA8IHJhbmdlLmdldEVuZCgpKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBGaW5kcyBhIGZpZWxkIGJ5IG5hbWUuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpZWxkIChlLmcuICJmb28iKS4KLSAgICAgKiBAcmV0dXJuIFRoZSBmaWVsZCdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBmaW5kRmllbGRCeU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9Ci0gICAgICAgICAgZmlsZS5wb29sLmZpbmRTeW1ib2woZnVsbE5hbWUgKyAnLicgKyBuYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBGaWVsZERlc2NyaXB0b3IpIHsKLSAgICAgICAgcmV0dXJuIChGaWVsZERlc2NyaXB0b3IpcmVzdWx0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYSBmaWVsZCBieSBmaWVsZCBudW1iZXIuCi0gICAgICogQHBhcmFtIG51bWJlciBUaGUgZmllbGQgbnVtYmVyIHdpdGhpbiB0aGlzIG1lc3NhZ2UgdHlwZS4KLSAgICAgKiBAcmV0dXJuIFRoZSBmaWVsZCdzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBmaW5kRmllbGRCeU51bWJlcihmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICByZXR1cm4gZmlsZS5wb29sLmZpZWxkc0J5TnVtYmVyLmdldCgKLSAgICAgICAgbmV3IERlc2NyaXB0b3JQb29sLkRlc2NyaXB0b3JJbnRQYWlyKHRoaXMsIG51bWJlcikpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmRzIGEgbmVzdGVkIG1lc3NhZ2UgdHlwZSBieSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSBuZXN0ZWQgdHlwZSAoZS5nLiAiRm9vIikuCi0gICAgICogQHJldHVybiBUaGUgdHlwZXMncyBkZXNjcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBEZXNjcmlwdG9yIGZpbmROZXN0ZWRUeXBlQnlOYW1lKGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciByZXN1bHQgPQotICAgICAgICAgIGZpbGUucG9vbC5maW5kU3ltYm9sKGZ1bGxOYW1lICsgJy4nICsgbmFtZSk7Ci0gICAgICBpZiAocmVzdWx0ICE9IG51bGwgJiYgcmVzdWx0IGluc3RhbmNlb2YgRGVzY3JpcHRvcikgewotICAgICAgICByZXR1cm4gKERlc2NyaXB0b3IpcmVzdWx0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogRmluZHMgYSBuZXN0ZWQgZW51bSB0eXBlIGJ5IG5hbWUuCi0gICAgICogQHBhcmFtIG5hbWUgVGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIG5lc3RlZCB0eXBlIChlLmcuICJGb28iKS4KLSAgICAgKiBAcmV0dXJuIFRoZSB0eXBlcydzIGRlc2NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEVudW1EZXNjcmlwdG9yIGZpbmRFbnVtVHlwZUJ5TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0KLSAgICAgICAgICBmaWxlLnBvb2wuZmluZFN5bWJvbChmdWxsTmFtZSArICcuJyArIG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIEVudW1EZXNjcmlwdG9yKSB7Ci0gICAgICAgIHJldHVybiAoRW51bURlc2NyaXB0b3IpcmVzdWx0OwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG51bGw7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yUHJvdG8gcHJvdG87Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvciBjb250YWluaW5nVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JbXSBuZXN0ZWRUeXBlczsKLSAgICBwcml2YXRlIGZpbmFsIEVudW1EZXNjcmlwdG9yW10gZW51bVR5cGVzOwotICAgIHByaXZhdGUgZmluYWwgRmllbGREZXNjcmlwdG9yW10gZmllbGRzOwotICAgIHByaXZhdGUgZmluYWwgRmllbGREZXNjcmlwdG9yW10gZXh0ZW5zaW9uczsKLQotICAgIHByaXZhdGUgRGVzY3JpcHRvcihmaW5hbCBEZXNjcmlwdG9yUHJvdG8gcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCi0gICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgIGZ1bGxOYW1lID0gY29tcHV0ZUZ1bGxOYW1lKGZpbGUsIHBhcmVudCwgcHJvdG8uZ2V0TmFtZSgpKTsKLSAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICBjb250YWluaW5nVHlwZSA9IHBhcmVudDsKLQotICAgICAgbmVzdGVkVHlwZXMgPSBuZXcgRGVzY3JpcHRvcltwcm90by5nZXROZXN0ZWRUeXBlQ291bnQoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldE5lc3RlZFR5cGVDb3VudCgpOyBpKyspIHsKLSAgICAgICAgbmVzdGVkVHlwZXNbaV0gPSBuZXcgRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXROZXN0ZWRUeXBlKGkpLCBmaWxlLCB0aGlzLCBpKTsKLSAgICAgIH0KLQotICAgICAgZW51bVR5cGVzID0gbmV3IEVudW1EZXNjcmlwdG9yW3Byb3RvLmdldEVudW1UeXBlQ291bnQoKV07Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLmdldEVudW1UeXBlQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGVudW1UeXBlc1tpXSA9IG5ldyBFbnVtRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRFbnVtVHlwZShpKSwgZmlsZSwgdGhpcywgaSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpZWxkcyA9IG5ldyBGaWVsZERlc2NyaXB0b3JbcHJvdG8uZ2V0RmllbGRDb3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RmllbGRDb3VudCgpOyBpKyspIHsKLSAgICAgICAgZmllbGRzW2ldID0gbmV3IEZpZWxkRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRGaWVsZChpKSwgZmlsZSwgdGhpcywgaSwgZmFsc2UpOwotICAgICAgfQotCi0gICAgICBleHRlbnNpb25zID0gbmV3IEZpZWxkRGVzY3JpcHRvcltwcm90by5nZXRFeHRlbnNpb25Db3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0RXh0ZW5zaW9uQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIGV4dGVuc2lvbnNbaV0gPSBuZXcgRmllbGREZXNjcmlwdG9yKAotICAgICAgICAgIHByb3RvLmdldEV4dGVuc2lvbihpKSwgZmlsZSwgdGhpcywgaSwgdHJ1ZSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqIExvb2sgdXAgYW5kIGNyb3NzLWxpbmsgYWxsIGZpZWxkIHR5cGVzLCBldGMuICovCi0gICAgcHJpdmF0ZSB2b2lkIGNyb3NzTGluaygpIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICBmb3IgKGZpbmFsIERlc2NyaXB0b3IgbmVzdGVkVHlwZSA6IG5lc3RlZFR5cGVzKSB7Ci0gICAgICAgIG5lc3RlZFR5cGUuY3Jvc3NMaW5rKCk7Ci0gICAgICB9Ci0KLSAgICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDogZmllbGRzKSB7Ci0gICAgICAgIGZpZWxkLmNyb3NzTGluaygpOwotICAgICAgfQotCi0gICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gOiBleHRlbnNpb25zKSB7Ci0gICAgICAgIGV4dGVuc2lvbi5jcm9zc0xpbmsoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKiogU2VlIHtAbGluayBGaWxlRGVzY3JpcHRvciNzZXRQcm90b30uICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIERlc2NyaXB0b3JQcm90byBwcm90bykgewotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG5lc3RlZFR5cGVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIG5lc3RlZFR5cGVzW2ldLnNldFByb3RvKHByb3RvLmdldE5lc3RlZFR5cGUoaSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1UeXBlcy5sZW5ndGg7IGkrKykgewotICAgICAgICBlbnVtVHlwZXNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0RW51bVR5cGUoaSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5sZW5ndGg7IGkrKykgewotICAgICAgICBmaWVsZHNbaV0uc2V0UHJvdG8ocHJvdG8uZ2V0RmllbGQoaSkpOwotICAgICAgfQotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbnMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgZXh0ZW5zaW9uc1tpXS5zZXRQcm90byhwcm90by5nZXRFeHRlbnNpb24oaSkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIERlc2NyaWJlcyBhIGZpZWxkIG9mIGEgbWVzc2FnZSB0eXBlLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpZWxkRGVzY3JpcHRvcgotICAgICAgaW1wbGVtZW50cyBHZW5lcmljRGVzY3JpcHRvciwgQ29tcGFyYWJsZTxGaWVsZERlc2NyaXB0b3I+LAotICAgICAgICAgICAgICAgICBGaWVsZFNldC5GaWVsZERlc2NyaXB0b3JMaXRlPEZpZWxkRGVzY3JpcHRvcj4gewotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LgotICAgICAqIEBzZWUgRGVzY3JpcHRvciNnZXRJbmRleCgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9Ci0KLSAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsgcmV0dXJuIHByb3RvOyB9Ci0KLSAgICAvKiogR2V0IHRoZSBmaWVsZCdzIHVucXVhbGlmaWVkIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9Ci0KLSAgICAvKiogR2V0IHRoZSBmaWVsZCdzIG51bWJlci4gKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsgcmV0dXJuIHByb3RvLmdldE51bWJlcigpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGZpZWxkJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUuCi0gICAgICogQHNlZSBEZXNjcmlwdG9yI2dldEZ1bGxOYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeyByZXR1cm4gZnVsbE5hbWU7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgZmllbGQncyBqYXZhIHR5cGUuICBUaGlzIGlzIGp1c3QgZm9yIGNvbnZlbmllbmNlLiAgRXZlcnkKLSAgICAgKiB7QGNvZGUgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZX0gbWFwcyB0byBleGFjdGx5IG9uZSBKYXZhIHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIEphdmFUeXBlIGdldEphdmFUeXBlKCkgeyByZXR1cm4gdHlwZS5nZXRKYXZhVHlwZSgpOyB9Ci0KLSAgICAvKiogRm9yIGludGVybmFsIHVzZSBvbmx5LiAqLwotICAgIHB1YmxpYyBXaXJlRm9ybWF0LkphdmFUeXBlIGdldExpdGVKYXZhVHlwZSgpIHsKLSAgICAgIHJldHVybiBnZXRMaXRlVHlwZSgpLmdldEphdmFUeXBlKCk7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUge0Bjb2RlIEZpbGVEZXNjcmlwdG9yfSBjb250YWluaW5nIHRoaXMgZGVzY3JpcHRvci4gKi8KLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7IH0KLQotICAgIC8qKiBHZXQgdGhlIGZpZWxkJ3MgZGVjbGFyZWQgdHlwZS4gKi8KLSAgICBwdWJsaWMgVHlwZSBnZXRUeXBlKCkgeyByZXR1cm4gdHlwZTsgfQotCi0gICAgLyoqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4gKi8KLSAgICBwdWJsaWMgV2lyZUZvcm1hdC5GaWVsZFR5cGUgZ2V0TGl0ZVR5cGUoKSB7Ci0gICAgICByZXR1cm4gdGFibGVbdHlwZS5vcmRpbmFsKCldOwotICAgIH0KLSAgICAvLyBJJ20gcHJldHR5IHN1cmUgdmFsdWVzKCkgY29uc3RydWN0cyBhIG5ldyBhcnJheSBldmVyeSB0aW1lLCBzaW5jZSB0aGVyZQotICAgIC8vIGlzIG5vdGhpbmcgc3RvcHBpbmcgdGhlIGNhbGxlciBmcm9tIG11dGF0aW5nIHRoZSBhcnJheS4gIFRoZXJlZm9yZSB3ZQotICAgIC8vIG1ha2UgYSBzdGF0aWMgY29weSBoZXJlLgotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlW10gdGFibGUgPQotICAgICAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZS52YWx1ZXMoKTsKLQotICAgIC8qKiBJcyB0aGlzIGZpZWxkIGRlY2xhcmVkIHJlcXVpcmVkPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUmVxdWlyZWQoKSB7Ci0gICAgICByZXR1cm4gcHJvdG8uZ2V0TGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9SRVFVSVJFRDsKLSAgICB9Ci0KLSAgICAvKiogSXMgdGhpcyBmaWVsZCBkZWNsYXJlZCBvcHRpb25hbD8gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBpc09wdGlvbmFsKCkgewotICAgICAgcmV0dXJuIHByb3RvLmdldExhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwuTEFCRUxfT1BUSU9OQUw7Ci0gICAgfQotCi0gICAgLyoqIElzIHRoaXMgZmllbGQgZGVjbGFyZWQgcmVwZWF0ZWQ/ICovCi0gICAgcHVibGljIGJvb2xlYW4gaXNSZXBlYXRlZCgpIHsKLSAgICAgIHJldHVybiBwcm90by5nZXRMYWJlbCgpID09IEZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsLkxBQkVMX1JFUEVBVEVEOwotICAgIH0KLQotICAgIC8qKiBEb2VzIHRoaXMgZmllbGQgaGF2ZSB0aGUge0Bjb2RlIFtwYWNrZWQgPSB0cnVlXX0gb3B0aW9uPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2VkKCkgewotICAgICAgcmV0dXJuIGdldE9wdGlvbnMoKS5nZXRQYWNrZWQoKTsKLSAgICB9Ci0KLSAgICAvKiogQ2FuIHRoaXMgZmllbGQgYmUgcGFja2VkPyBpLmUuIGlzIGl0IGEgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzUGFja2FibGUoKSB7Ci0gICAgICByZXR1cm4gaXNSZXBlYXRlZCgpICYmIGdldExpdGVUeXBlKCkuaXNQYWNrYWJsZSgpOwotICAgIH0KLQotICAgIC8qKiBSZXR1cm5zIHRydWUgaWYgdGhlIGZpZWxkIGhhZCBhbiBleHBsaWNpdGx5LWRlZmluZWQgZGVmYXVsdCB2YWx1ZS4gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNEZWZhdWx0VmFsdWUoKSB7IHJldHVybiBwcm90by5oYXNEZWZhdWx0VmFsdWUoKTsgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgZmllbGQncyBkZWZhdWx0IHZhbHVlLiAgVmFsaWQgZm9yIGFsbCB0eXBlcyBleGNlcHQgZm9yCi0gICAgICogbWVzc2FnZXMgYW5kIGdyb3Vwcy4gIEZvciBhbGwgb3RoZXIgdHlwZXMsIHRoZSBvYmplY3QgcmV0dXJuZWQgaXMgb2YKLSAgICAgKiB0aGUgc2FtZSBjbGFzcyB0aGF0IHdvdWxkIHJldHVybmVkIGJ5IE1lc3NhZ2UuZ2V0RmllbGQodGhpcykuCi0gICAgICovCi0gICAgcHVibGljIE9iamVjdCBnZXREZWZhdWx0VmFsdWUoKSB7Ci0gICAgICBpZiAoZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiRmllbGREZXNjcmlwdG9yLmdldERlZmF1bHRWYWx1ZSgpIGNhbGxlZCBvbiBhbiBlbWJlZGRlZCBtZXNzYWdlICIgKwotICAgICAgICAgICJmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBkZWZhdWx0VmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUge0Bjb2RlIEZpZWxkT3B0aW9uc30sIGRlZmluZWQgaW4ge0Bjb2RlIGRlc2NyaXB0b3IucHJvdG99LiAqLwotICAgIHB1YmxpYyBGaWVsZE9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQotCi0gICAgLyoqIElzIHRoaXMgZmllbGQgYW4gZXh0ZW5zaW9uPyAqLwotICAgIHB1YmxpYyBib29sZWFuIGlzRXh0ZW5zaW9uKCkgeyByZXR1cm4gcHJvdG8uaGFzRXh0ZW5kZWUoKTsgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBmaWVsZCdzIGNvbnRhaW5pbmcgdHlwZS4gRm9yIGV4dGVuc2lvbnMsIHRoaXMgaXMgdGhlIHR5cGUgYmVpbmcKLSAgICAgKiBleHRlbmRlZCwgbm90IHRoZSBsb2NhdGlvbiB3aGVyZSB0aGUgZXh0ZW5zaW9uIHdhcyBkZWZpbmVkLiAgU2VlCi0gICAgICoge0BsaW5rICNnZXRFeHRlbnNpb25TY29wZSgpfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRDb250YWluaW5nVHlwZSgpIHsgcmV0dXJuIGNvbnRhaW5pbmdUeXBlOyB9Ci0KLSAgICAvKioKLSAgICAgKiBGb3IgZXh0ZW5zaW9ucyBkZWZpbmVkIG5lc3RlZCB3aXRoaW4gbWVzc2FnZSB0eXBlcywgZ2V0cyB0aGUgb3V0ZXIKLSAgICAgKiB0eXBlLiAgTm90IHZhbGlkIGZvciBub24tZXh0ZW5zaW9uIGZpZWxkcy4gIEZvciBleGFtcGxlLCBjb25zaWRlcgotICAgICAqIHRoaXMge0Bjb2RlIC5wcm90b30gZmlsZToKLSAgICAgKiA8cHJlPgotICAgICAqICAgbWVzc2FnZSBGb28gewotICAgICAqICAgICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotICAgICAqICAgfQotICAgICAqICAgZXh0ZW5kIEZvbyB7Ci0gICAgICogICAgIG9wdGlvbmFsIGludDMyIGJheiA9IDEyMzQ7Ci0gICAgICogICB9Ci0gICAgICogICBtZXNzYWdlIEJhciB7Ci0gICAgICogICAgIGV4dGVuZCBGb28gewotICAgICAqICAgICAgIG9wdGlvbmFsIGludDMyIHF1eCA9IDQzMjE7Ci0gICAgICogICAgIH0KLSAgICAgKiAgIH0KLSAgICAgKiA8L3ByZT4KLSAgICAgKiBCb3RoIHtAY29kZSBiYXp9J3MgYW5kIHtAY29kZSBxdXh9J3MgY29udGFpbmluZyB0eXBlIGlzIHtAY29kZSBGb299LgotICAgICAqIEhvd2V2ZXIsIHtAY29kZSBiYXp9J3MgZXh0ZW5zaW9uIHNjb3BlIGlzIHtAY29kZSBudWxsfSB3aGlsZQotICAgICAqIHtAY29kZSBxdXh9J3MgZXh0ZW5zaW9uIHNjb3BlIGlzIHtAY29kZSBCYXJ9LgotICAgICAqLwotICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldEV4dGVuc2lvblNjb3BlKCkgewotICAgICAgaWYgKCFpc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhpcyBmaWVsZCBpcyBub3QgYW4gZXh0ZW5zaW9uLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGV4dGVuc2lvblNjb3BlOwotICAgIH0KLQotICAgIC8qKiBGb3IgZW1iZWRkZWQgbWVzc2FnZSBhbmQgZ3JvdXAgZmllbGRzLCBnZXRzIHRoZSBmaWVsZCdzIHR5cGUuICovCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0TWVzc2FnZVR5cGUoKSB7Ci0gICAgICBpZiAoZ2V0SmF2YVR5cGUoKSAhPSBKYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhpcyBmaWVsZCBpcyBub3Qgb2YgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lc3NhZ2VUeXBlOwotICAgIH0KLQotICAgIC8qKiBGb3IgZW51bSBmaWVsZHMsIGdldHMgdGhlIGZpZWxkJ3MgdHlwZS4gKi8KLSAgICBwdWJsaWMgRW51bURlc2NyaXB0b3IgZ2V0RW51bVR5cGUoKSB7Ci0gICAgICBpZiAoZ2V0SmF2YVR5cGUoKSAhPSBKYXZhVHlwZS5FTlVNKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhpcyBmaWVsZCBpcyBub3Qgb2YgZW51bSB0eXBlLiIpOwotICAgICAgfQotICAgICAgcmV0dXJuIGVudW1UeXBlOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbXBhcmUgd2l0aCBhbm90aGVyIHtAY29kZSBGaWVsZERlc2NyaXB0b3J9LiAgVGhpcyBvcmRlcnMgZmllbGRzIGluCi0gICAgICogImNhbm9uaWNhbCIgb3JkZXIsIHdoaWNoIHNpbXBseSBtZWFucyBhc2NlbmRpbmcgb3JkZXIgYnkgZmllbGQgbnVtYmVyLgotICAgICAqIHtAY29kZSBvdGhlcn0gbXVzdCBiZSBhIGZpZWxkIG9mIHRoZSBzYW1lIHR5cGUgLS0gaS5lLgotICAgICAqIHtAY29kZSBnZXRDb250YWluaW5nVHlwZSgpfSBtdXN0IHJldHVybiB0aGUgc2FtZSB7QGNvZGUgRGVzY3JpcHRvcn0gZm9yCi0gICAgICogYm90aCBmaWVsZHMuCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIG5lZ2F0aXZlLCB6ZXJvLCBvciBwb3NpdGl2ZSBpZiB7QGNvZGUgdGhpc30gaXMgbGVzcyB0aGFuLAotICAgICAqICAgICAgICAgZXF1YWwgdG8sIG9yIGdyZWF0ZXIgdGhhbiB7QGNvZGUgb3RoZXJ9LCByZXNwZWN0aXZlbHkuCi0gICAgICovCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oZmluYWwgRmllbGREZXNjcmlwdG9yIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIuY29udGFpbmluZ1R5cGUgIT0gY29udGFpbmluZ1R5cGUpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRmllbGREZXNjcmlwdG9ycyBjYW4gb25seSBiZSBjb21wYXJlZCB0byBvdGhlciBGaWVsZERlc2NyaXB0b3JzICIgKwotICAgICAgICAgICJmb3IgZmllbGRzIG9mIHRoZSBzYW1lIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBnZXROdW1iZXIoKSAtIG90aGVyLmdldE51bWJlcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgaW50IGluZGV4OwotCi0gICAgcHJpdmF0ZSBGaWVsZERlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGV4dGVuc2lvblNjb3BlOwotCi0gICAgLy8gUG9zc2libHkgaW5pdGlhbGl6ZWQgZHVyaW5nIGNyb3NzLWxpbmtpbmcuCi0gICAgcHJpdmF0ZSBUeXBlIHR5cGU7Ci0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yIGNvbnRhaW5pbmdUeXBlOwotICAgIHByaXZhdGUgRGVzY3JpcHRvciBtZXNzYWdlVHlwZTsKLSAgICBwcml2YXRlIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlOwotICAgIHByaXZhdGUgT2JqZWN0IGRlZmF1bHRWYWx1ZTsKLQotICAgIHB1YmxpYyBlbnVtIFR5cGUgewotICAgICAgRE9VQkxFICAoSmF2YVR5cGUuRE9VQkxFICAgICApLAotICAgICAgRkxPQVQgICAoSmF2YVR5cGUuRkxPQVQgICAgICApLAotICAgICAgSU5UNjQgICAoSmF2YVR5cGUuTE9ORyAgICAgICApLAotICAgICAgVUlOVDY0ICAoSmF2YVR5cGUuTE9ORyAgICAgICApLAotICAgICAgSU5UMzIgICAoSmF2YVR5cGUuSU5UICAgICAgICApLAotICAgICAgRklYRUQ2NCAoSmF2YVR5cGUuTE9ORyAgICAgICApLAotICAgICAgRklYRUQzMiAoSmF2YVR5cGUuSU5UICAgICAgICApLAotICAgICAgQk9PTCAgICAoSmF2YVR5cGUuQk9PTEVBTiAgICApLAotICAgICAgU1RSSU5HICAoSmF2YVR5cGUuU1RSSU5HICAgICApLAotICAgICAgR1JPVVAgICAoSmF2YVR5cGUuTUVTU0FHRSAgICApLAotICAgICAgTUVTU0FHRSAoSmF2YVR5cGUuTUVTU0FHRSAgICApLAotICAgICAgQllURVMgICAoSmF2YVR5cGUuQllURV9TVFJJTkcpLAotICAgICAgVUlOVDMyICAoSmF2YVR5cGUuSU5UICAgICAgICApLAotICAgICAgRU5VTSAgICAoSmF2YVR5cGUuRU5VTSAgICAgICApLAotICAgICAgU0ZJWEVEMzIoSmF2YVR5cGUuSU5UICAgICAgICApLAotICAgICAgU0ZJWEVENjQoSmF2YVR5cGUuTE9ORyAgICAgICApLAotICAgICAgU0lOVDMyICAoSmF2YVR5cGUuSU5UICAgICAgICApLAotICAgICAgU0lOVDY0ICAoSmF2YVR5cGUuTE9ORyAgICAgICApOwotCi0gICAgICBUeXBlKGZpbmFsIEphdmFUeXBlIGphdmFUeXBlKSB7Ci0gICAgICAgIHRoaXMuamF2YVR5cGUgPSBqYXZhVHlwZTsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBKYXZhVHlwZSBqYXZhVHlwZTsKLQotICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdG9Qcm90bygpIHsKLSAgICAgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUudmFsdWVPZihvcmRpbmFsKCkgKyAxKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsgcmV0dXJuIGphdmFUeXBlOyB9Ci0KLSAgICAgIHB1YmxpYyBzdGF0aWMgVHlwZSB2YWx1ZU9mKGZpbmFsIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSkgewotICAgICAgICByZXR1cm4gdmFsdWVzKClbdHlwZS5nZXROdW1iZXIoKSAtIDFdOwotICAgICAgfQotICAgIH0KLQotICAgIHN0YXRpYyB7Ci0gICAgICAvLyBSZWZ1c2UgdG8gaW5pdCBpZiBzb21lb25lIGFkZGVkIGEgbmV3IGRlY2xhcmVkIHR5cGUuCi0gICAgICBpZiAoVHlwZS52YWx1ZXMoKS5sZW5ndGggIT0gRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZS52YWx1ZXMoKS5sZW5ndGgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgImRlc2NyaXB0b3IucHJvdG8gaGFzIGEgbmV3IGRlY2xhcmVkIHR5cGUgYnV0IERlc3JjaXB0b3JzLmphdmEgIiArCi0gICAgICAgICAgIndhc24ndCB1cGRhdGVkLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBlbnVtIEphdmFUeXBlIHsKLSAgICAgIElOVCgwKSwKLSAgICAgIExPTkcoMEwpLAotICAgICAgRkxPQVQoMEYpLAotICAgICAgRE9VQkxFKDBEKSwKLSAgICAgIEJPT0xFQU4oZmFsc2UpLAotICAgICAgU1RSSU5HKCIiKSwKLSAgICAgIEJZVEVfU1RSSU5HKEJ5dGVTdHJpbmcuRU1QVFkpLAotICAgICAgRU5VTShudWxsKSwKLSAgICAgIE1FU1NBR0UobnVsbCk7Ci0KLSAgICAgIEphdmFUeXBlKGZpbmFsIE9iamVjdCBkZWZhdWx0RGVmYXVsdCkgewotICAgICAgICB0aGlzLmRlZmF1bHREZWZhdWx0ID0gZGVmYXVsdERlZmF1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8qKgotICAgICAgICogVGhlIGRlZmF1bHQgZGVmYXVsdCB2YWx1ZSBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZSwgaWYgaXQncyBhIHByaW1pdGl2ZQotICAgICAgICogdHlwZS4gIFRoaXMgaXMgbWVhbnQgZm9yIHVzZSBpbnNpZGUgdGhpcyBmaWxlIG9ubHksIGhlbmNlIGlzIHByaXZhdGUuCi0gICAgICAgKi8KLSAgICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IGRlZmF1bHREZWZhdWx0OwotICAgIH0KLQotICAgIHByaXZhdGUgRmllbGREZXNjcmlwdG9yKGZpbmFsIEZpZWxkRGVzY3JpcHRvclByb3RvIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRGVzY3JpcHRvciBwYXJlbnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNFeHRlbnNpb24pCi0gICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgICAgZnVsbE5hbWUgPSBjb21wdXRlRnVsbE5hbWUoZmlsZSwgcGFyZW50LCBwcm90by5nZXROYW1lKCkpOwotICAgICAgdGhpcy5maWxlID0gZmlsZTsKLQotICAgICAgaWYgKHByb3RvLmhhc1R5cGUoKSkgewotICAgICAgICB0eXBlID0gVHlwZS52YWx1ZU9mKHByb3RvLmdldFR5cGUoKSk7Ci0gICAgICB9Ci0KLSAgICAgIGlmIChnZXROdW1iZXIoKSA8PSAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICJGaWVsZCBudW1iZXJzIG11c3QgYmUgcG9zaXRpdmUgaW50ZWdlcnMuIik7Ci0gICAgICB9Ci0KLSAgICAgIC8vIE9ubHkgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyBtYXkgYmUgcGFja2VkLgotICAgICAgaWYgKHByb3RvLmdldE9wdGlvbnMoKS5nZXRQYWNrZWQoKSAmJiAhaXNQYWNrYWJsZSgpKSB7Ci0gICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICJbcGFja2VkID0gdHJ1ZV0gY2FuIG9ubHkgYmUgc3BlY2lmaWVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgIiArCi0gICAgICAgICAgImZpZWxkcy4iKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGlzRXh0ZW5zaW9uKSB7Ci0gICAgICAgIGlmICghcHJvdG8uaGFzRXh0ZW5kZWUoKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIG5vdCBzZXQgZm9yIGV4dGVuc2lvbiBmaWVsZC4iKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluaW5nVHlwZSA9IG51bGw7ICAvLyBXaWxsIGJlIGZpbGxlZCBpbiB3aGVuIGNyb3NzLWxpbmtpbmcKLSAgICAgICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICAgICAgZXh0ZW5zaW9uU2NvcGUgPSBwYXJlbnQ7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZXh0ZW5zaW9uU2NvcGUgPSBudWxsOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAocHJvdG8uaGFzRXh0ZW5kZWUoKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgIkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIHNldCBmb3Igbm9uLWV4dGVuc2lvbiBmaWVsZC4iKTsKLSAgICAgICAgfQotICAgICAgICBjb250YWluaW5nVHlwZSA9IHBhcmVudDsKLSAgICAgICAgZXh0ZW5zaW9uU2NvcGUgPSBudWxsOwotICAgICAgfQotCi0gICAgICBmaWxlLnBvb2wuYWRkU3ltYm9sKHRoaXMpOwotICAgIH0KLQotICAgIC8qKiBMb29rIHVwIGFuZCBjcm9zcy1saW5rIGFsbCBmaWVsZCB0eXBlcywgZXRjLiAqLwotICAgIHByaXZhdGUgdm9pZCBjcm9zc0xpbmsoKSB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgaWYgKHByb3RvLmhhc0V4dGVuZGVlKCkpIHsKLSAgICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgZXh0ZW5kZWUgPQotICAgICAgICAgIGZpbGUucG9vbC5sb29rdXBTeW1ib2wocHJvdG8uZ2V0RXh0ZW5kZWUoKSwgdGhpcyk7Ci0gICAgICAgIGlmICghKGV4dGVuZGVlIGluc3RhbmNlb2YgRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldEV4dGVuZGVlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgICB9Ci0gICAgICAgIGNvbnRhaW5pbmdUeXBlID0gKERlc2NyaXB0b3IpZXh0ZW5kZWU7Ci0KLSAgICAgICAgaWYgKCFnZXRDb250YWluaW5nVHlwZSgpLmlzRXh0ZW5zaW9uTnVtYmVyKGdldE51bWJlcigpKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAnXCInICsgZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRGdWxsTmFtZSgpICsKLSAgICAgICAgICAgICAgIlwiIGRvZXMgbm90IGRlY2xhcmUgIiArIGdldE51bWJlcigpICsKLSAgICAgICAgICAgICAgIiBhcyBhbiBleHRlbnNpb24gbnVtYmVyLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChwcm90by5oYXNUeXBlTmFtZSgpKSB7Ci0gICAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHR5cGVEZXNjcmlwdG9yID0KLSAgICAgICAgICBmaWxlLnBvb2wubG9va3VwU3ltYm9sKHByb3RvLmdldFR5cGVOYW1lKCksIHRoaXMpOwotCi0gICAgICAgIGlmICghcHJvdG8uaGFzVHlwZSgpKSB7Ci0gICAgICAgICAgLy8gQ2hvb3NlIGZpZWxkIHR5cGUgYmFzZWQgb24gc3ltYm9sLgotICAgICAgICAgIGlmICh0eXBlRGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IpIHsKLSAgICAgICAgICAgIHR5cGUgPSBUeXBlLk1FU1NBR0U7Ci0gICAgICAgICAgfSBlbHNlIGlmICh0eXBlRGVzY3JpcHRvciBpbnN0YW5jZW9mIEVudW1EZXNjcmlwdG9yKSB7Ci0gICAgICAgICAgICB0eXBlID0gVHlwZS5FTlVNOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICAgICAnXCInICsgcHJvdG8uZ2V0VHlwZU5hbWUoKSArICJcIiBpcyBub3QgYSB0eXBlLiIpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotCi0gICAgICAgIGlmIChnZXRKYXZhVHlwZSgpID09IEphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICBpZiAoISh0eXBlRGVzY3JpcHRvciBpbnN0YW5jZW9mIERlc2NyaXB0b3IpKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICAgICAnXCInICsgcHJvdG8uZ2V0VHlwZU5hbWUoKSArICJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIG1lc3NhZ2VUeXBlID0gKERlc2NyaXB0b3IpdHlwZURlc2NyaXB0b3I7Ci0KLSAgICAgICAgICBpZiAocHJvdG8uaGFzRGVmYXVsdFZhbHVlKCkpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAiTWVzc2FnZXMgY2FuJ3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSBpZiAoZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZS5FTlVNKSB7Ci0gICAgICAgICAgaWYgKCEodHlwZURlc2NyaXB0b3IgaW5zdGFuY2VvZiBFbnVtRGVzY3JpcHRvcikpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAgICdcIicgKyBwcm90by5nZXRUeXBlTmFtZSgpICsgIlwiIGlzIG5vdCBhbiBlbnVtIHR5cGUuIik7Ci0gICAgICAgICAgfQotICAgICAgICAgIGVudW1UeXBlID0gKEVudW1EZXNjcmlwdG9yKXR5cGVEZXNjcmlwdG9yOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgIkZpZWxkIHdpdGggcHJpbWl0aXZlIHR5cGUgaGFzIHR5cGVfbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGdldEphdmFUeXBlKCkgPT0gSmF2YVR5cGUuTUVTU0FHRSB8fAotICAgICAgICAgICAgZ2V0SmF2YVR5cGUoKSA9PSBKYXZhVHlwZS5FTlVNKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCi0gICAgICAgICAgICAiRmllbGQgd2l0aCBtZXNzYWdlIG9yIGVudW0gdHlwZSBtaXNzaW5nIHR5cGVfbmFtZS4iKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICAvLyBXZSBkb24ndCBhdHRlbXB0IHRvIHBhcnNlIHRoZSBkZWZhdWx0IHZhbHVlIHVudGlsIGhlcmUgYmVjYXVzZSBmb3IKLSAgICAgIC8vIGVudW1zIHdlIG5lZWQgdGhlIGVudW0gdHlwZSdzIGRlc2NyaXB0b3IuCi0gICAgICBpZiAocHJvdG8uaGFzRGVmYXVsdFZhbHVlKCkpIHsKLSAgICAgICAgaWYgKGlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgIlJlcGVhdGVkIGZpZWxkcyBjYW5ub3QgaGF2ZSBkZWZhdWx0IHZhbHVlcy4iKTsKLSAgICAgICAgfQotCi0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgc3dpdGNoIChnZXRUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIFNJTlQzMjoKLSAgICAgICAgICAgIGNhc2UgU0ZJWEVEMzI6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VJbnQzMihwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgICAgICBjYXNlIEZJWEVEMzI6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VVSW50MzIocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgSU5UNjQ6Ci0gICAgICAgICAgICBjYXNlIFNJTlQ2NDoKLSAgICAgICAgICAgIGNhc2UgU0ZJWEVENjQ6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VJbnQ2NChwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBVSU5UNjQ6Ci0gICAgICAgICAgICBjYXNlIEZJWEVENjQ6Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IFRleHRGb3JtYXQucGFyc2VVSW50NjQocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgRkxPQVQ6Ci0gICAgICAgICAgICAgIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoImluZiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7Ci0gICAgICAgICAgICAgIH0gZWxzZSBpZiAocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkuZXF1YWxzKCItaW5mIikpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBGbG9hdC5ORUdBVElWRV9JTkZJTklUWTsKLSAgICAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoIm5hbiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRmxvYXQuTmFOOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IEZsb2F0LnZhbHVlT2YocHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkpOwotICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBET1VCTEU6Ci0gICAgICAgICAgICAgIGlmIChwcm90by5nZXREZWZhdWx0VmFsdWUoKS5lcXVhbHMoImluZiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygiLWluZiIpKSB7Ci0gICAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZOwotICAgICAgICAgICAgICB9IGVsc2UgaWYgKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpLmVxdWFscygibmFuIikpIHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBEb3VibGUuTmFOOwotICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IERvdWJsZS52YWx1ZU9mKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgQk9PTDoKLSAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gQm9vbGVhbi52YWx1ZU9mKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gcHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCk7Ci0gICAgICAgICAgICAgIGJyZWFrOwotICAgICAgICAgICAgY2FzZSBCWVRFUzoKLSAgICAgICAgICAgICAgdHJ5IHsKLSAgICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPQotICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKHByb3RvLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICAgICAgICAgICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWU6ICIgKyBlLmdldE1lc3NhZ2UoKSwgZSk7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgICAgIGRlZmF1bHRWYWx1ZSA9IGVudW1UeXBlLmZpbmRWYWx1ZUJ5TmFtZShwcm90by5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgICAgICAgIGlmIChkZWZhdWx0VmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAgICAgIlVua25vd24gZW51bSBkZWZhdWx0IHZhbHVlOiBcIiIgKwotICAgICAgICAgICAgICAgICAgcHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkgKyAnXCInKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgIGNhc2UgR1JPVVA6Ci0gICAgICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgICAgICJNZXNzYWdlIHR5cGUgaGFkIGRlZmF1bHQgdmFsdWUuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLCAKLSAgICAgICAgICAgICAgIkNvdWxkIG5vdCBwYXJzZSBkZWZhdWx0IHZhbHVlOiBcIiIgKyAKLSAgICAgICAgICAgICAgcHJvdG8uZ2V0RGVmYXVsdFZhbHVlKCkgKyAnXCInLCBlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRGV0ZXJtaW5lIHRoZSBkZWZhdWx0IGRlZmF1bHQgZm9yIHRoaXMgZmllbGQuCi0gICAgICAgIGlmIChpc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBzd2l0Y2ggKGdldEphdmFUeXBlKCkpIHsKLSAgICAgICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICAgICAgLy8gV2UgZ3VhcmFudGVlIGVsc2V3aGVyZSB0aGF0IGFuIGVudW0gdHlwZSBhbHdheXMgaGFzIGF0IGxlYXN0Ci0gICAgICAgICAgICAgIC8vIG9uZSBwb3NzaWJsZSB2YWx1ZS4KLSAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gZW51bVR5cGUuZ2V0VmFsdWVzKCkuZ2V0KDApOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICAgICAgZGVmYXVsdFZhbHVlID0gbnVsbDsKLSAgICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgICBkZWZhdWx0VmFsdWUgPSBnZXRKYXZhVHlwZSgpLmRlZmF1bHREZWZhdWx0OwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgaWYgKCFpc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIGZpbGUucG9vbC5hZGRGaWVsZEJ5TnVtYmVyKHRoaXMpOwotICAgICAgfQotCi0gICAgICBpZiAoY29udGFpbmluZ1R5cGUgIT0gbnVsbCAmJgotICAgICAgICAgIGNvbnRhaW5pbmdUeXBlLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpKSB7Ci0gICAgICAgIGlmIChpc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgICAgaWYgKCFpc09wdGlvbmFsKCkgfHwgZ2V0VHlwZSgpICE9IFR5cGUuTUVTU0FHRSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHRoaXMsCi0gICAgICAgICAgICAgICJFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgbWVzc2FnZXMuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgIk1lc3NhZ2VTZXRzIGNhbm5vdCBoYXZlIGZpZWxkcywgb25seSBleHRlbnNpb25zLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIFNlZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc2V0UHJvdG99LiAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBGaWVsZERlc2NyaXB0b3JQcm90byBwcm90bykgewotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZvciBpbnRlcm5hbCB1c2Ugb25seS4gIFRoaXMgaXMgdG8gc2F0aXNmeSB0aGUgRmllbGREZXNjcmlwdG9yTGl0ZQotICAgICAqIGludGVyZmFjZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUxpdGUuQnVpbGRlciBpbnRlcm5hbE1lcmdlRnJvbSgKLSAgICAgICAgTWVzc2FnZUxpdGUuQnVpbGRlciB0bywgTWVzc2FnZUxpdGUgZnJvbSkgewotICAgICAgLy8gRmllbGREZXNjcmlwdG9ycyBhcmUgb25seSB1c2VkIHdpdGggbm9uLWxpdGUgbWVzc2FnZXMgc28gd2UgY2FuIGp1c3QKLSAgICAgIC8vIGRvd24tY2FzdCBhbmQgY2FsbCBtZXJnZUZyb20gZGlyZWN0bHkuCi0gICAgICByZXR1cm4gKChNZXNzYWdlLkJ1aWxkZXIpIHRvKS5tZXJnZUZyb20oKE1lc3NhZ2UpIGZyb20pOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIERlc2NyaWJlcyBhbiBlbnVtIHR5cGUuICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRW51bURlc2NyaXB0b3IKLSAgICAgIGltcGxlbWVudHMgR2VuZXJpY0Rlc2NyaXB0b3IsIEludGVybmFsLkVudW1MaXRlTWFwPEVudW1WYWx1ZURlc2NyaXB0b3I+IHsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudC4KLSAgICAgKiBAc2VlIERlc2NyaXB0b3IjZ2V0SW5kZXgoKQotICAgICAqLwotICAgIHB1YmxpYyBpbnQgZ2V0SW5kZXgoKSB7IHJldHVybiBpbmRleDsgfQotCi0gICAgLyoqIENvbnZlcnQgdGhlIGRlc2NyaXB0b3IgdG8gaXRzIHByb3RvY29sIG1lc3NhZ2UgcmVwcmVzZW50YXRpb24uICovCi0gICAgcHVibGljIEVudW1EZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsgcmV0dXJuIHByb3RvOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB0eXBlJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiBwcm90by5nZXROYW1lKCk7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgdHlwZSdzIGZ1bGx5LXF1YWxpZmllZCBuYW1lLgotICAgICAqIEBzZWUgRGVzY3JpcHRvciNnZXRGdWxsTmFtZSgpCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXRGdWxsTmFtZSgpIHsgcmV0dXJuIGZ1bGxOYW1lOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGxpbmsgRmlsZURlc2NyaXB0b3J9IGNvbnRhaW5pbmcgdGhpcyBkZXNjcmlwdG9yLiAqLwotICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgfQotCi0gICAgLyoqIElmIHRoaXMgaXMgYSBuZXN0ZWQgdHlwZSwgZ2V0IHRoZSBvdXRlciBkZXNjcmlwdG9yLCBvdGhlcndpc2UgbnVsbC4gKi8KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXRDb250YWluaW5nVHlwZSgpIHsgcmV0dXJuIGNvbnRhaW5pbmdUeXBlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB7QGNvZGUgRW51bU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4gKi8KLSAgICBwdWJsaWMgRW51bU9wdGlvbnMgZ2V0T3B0aW9ucygpIHsgcmV0dXJuIHByb3RvLmdldE9wdGlvbnMoKTsgfQotCi0gICAgLyoqIEdldCBhIGxpc3Qgb2YgZGVmaW5lZCB2YWx1ZXMgZm9yIHRoaXMgZW51bS4gKi8KLSAgICBwdWJsaWMgTGlzdDxFbnVtVmFsdWVEZXNjcmlwdG9yPiBnZXRWYWx1ZXMoKSB7Ci0gICAgICByZXR1cm4gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChBcnJheXMuYXNMaXN0KHZhbHVlcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYW4gZW51bSB2YWx1ZSBieSBuYW1lLgotICAgICAqIEBwYXJhbSBuYW1lIFRoZSB1bnF1YWxpZmllZCBuYW1lIG9mIHRoZSB2YWx1ZSAoZS5nLiAiRk9PIikuCi0gICAgICogQHJldHVybiB0aGUgdmFsdWUncyBkZWNzcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZpbmRWYWx1ZUJ5TmFtZShmaW5hbCBTdHJpbmcgbmFtZSkgewotICAgICAgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0KLSAgICAgICAgICBmaWxlLnBvb2wuZmluZFN5bWJvbChmdWxsTmFtZSArICcuJyArIG5hbWUpOwotICAgICAgaWYgKHJlc3VsdCAhPSBudWxsICYmIHJlc3VsdCBpbnN0YW5jZW9mIEVudW1WYWx1ZURlc2NyaXB0b3IpIHsKLSAgICAgICAgcmV0dXJuIChFbnVtVmFsdWVEZXNjcmlwdG9yKXJlc3VsdDsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYW4gZW51bSB2YWx1ZSBieSBudW1iZXIuICBJZiBtdWx0aXBsZSBlbnVtIHZhbHVlcyBoYXZlIHRoZSBzYW1lCi0gICAgICogbnVtYmVyLCB0aGlzIHJldHVybnMgdGhlIGZpcnN0IGRlZmluZWQgdmFsdWUgd2l0aCB0aGF0IG51bWJlci4KLSAgICAgKiBAcGFyYW0gbnVtYmVyIFRoZSB2YWx1ZSdzIG51bWJlci4KLSAgICAgKiBAcmV0dXJuIHRoZSB2YWx1ZSdzIGRlY3NyaXB0b3IsIG9yIHtAY29kZSBudWxsfSBpZiBub3QgZm91bmQuCi0gICAgICovCi0gICAgcHVibGljIEVudW1WYWx1ZURlc2NyaXB0b3IgZmluZFZhbHVlQnlOdW1iZXIoZmluYWwgaW50IG51bWJlcikgewotICAgICAgcmV0dXJuIGZpbGUucG9vbC5lbnVtVmFsdWVzQnlOdW1iZXIuZ2V0KAotICAgICAgICBuZXcgRGVzY3JpcHRvclBvb2wuRGVzY3JpcHRvckludFBhaXIodGhpcywgbnVtYmVyKSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7Ci0gICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvclByb3RvIHByb3RvOwotICAgIHByaXZhdGUgZmluYWwgU3RyaW5nIGZ1bGxOYW1lOwotICAgIHByaXZhdGUgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZTsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGU7Ci0gICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yW10gdmFsdWVzOwotCi0gICAgcHJpdmF0ZSBFbnVtRGVzY3JpcHRvcihmaW5hbCBFbnVtRGVzY3JpcHRvclByb3RvIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQotICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgICAgZnVsbE5hbWUgPSBjb21wdXRlRnVsbE5hbWUoZmlsZSwgcGFyZW50LCBwcm90by5nZXROYW1lKCkpOwotICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgIGNvbnRhaW5pbmdUeXBlID0gcGFyZW50OwotCi0gICAgICBpZiAocHJvdG8uZ2V0VmFsdWVDb3VudCgpID09IDApIHsKLSAgICAgICAgLy8gV2UgY2Fubm90IGFsbG93IGVudW1zIHdpdGggbm8gdmFsdWVzIGJlY2F1c2UgdGhpcyB3b3VsZCBtZWFuIHRoZXJlCi0gICAgICAgIC8vIHdvdWxkIGJlIG5vIHZhbGlkIGRlZmF1bHQgdmFsdWUgZm9yIGZpZWxkcyBvZiB0aGlzIHR5cGUuCi0gICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICJFbnVtcyBtdXN0IGNvbnRhaW4gYXQgbGVhc3Qgb25lIHZhbHVlLiIpOwotICAgICAgfQotCi0gICAgICB2YWx1ZXMgPSBuZXcgRW51bVZhbHVlRGVzY3JpcHRvcltwcm90by5nZXRWYWx1ZUNvdW50KCldOwotICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by5nZXRWYWx1ZUNvdW50KCk7IGkrKykgewotICAgICAgICB2YWx1ZXNbaV0gPSBuZXcgRW51bVZhbHVlRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRWYWx1ZShpKSwgZmlsZSwgdGhpcywgaSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbGUucG9vbC5hZGRTeW1ib2wodGhpcyk7Ci0gICAgfQotCi0gICAgLyoqIFNlZSB7QGxpbmsgRmlsZURlc2NyaXB0b3Ijc2V0UHJvdG99LiAqLwotICAgIHByaXZhdGUgdm9pZCBzZXRQcm90byhmaW5hbCBFbnVtRGVzY3JpcHRvclByb3RvIHByb3RvKSB7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIHZhbHVlc1tpXS5zZXRQcm90byhwcm90by5nZXRWYWx1ZShpKSk7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKioKLSAgICogRGVzY3JpYmVzIG9uZSB2YWx1ZSB3aXRoaW4gYW4gZW51bSB0eXBlLiAgTm90ZSB0aGF0IG11bHRpcGxlIGRlZmluZWQKLSAgICogdmFsdWVzIG1heSBoYXZlIHRoZSBzYW1lIG51bWJlci4gIEluIGdlbmVyYXRlZCBKYXZhIGNvZGUsIGFsbCB2YWx1ZXMKLSAgICogd2l0aCB0aGUgc2FtZSBudW1iZXIgYWZ0ZXIgdGhlIGZpcnN0IGJlY29tZSBhbGlhc2VzIG9mIHRoZSBmaXJzdC4KLSAgICogSG93ZXZlciwgdGhleSBzdGlsbCBoYXZlIGluZGVwZW5kZW50IEVudW1WYWx1ZURlc2NyaXB0b3JzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yCi0gICAgICBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yLCBJbnRlcm5hbC5FbnVtTGl0ZSB7Ci0gICAgLyoqCi0gICAgICogR2V0IHRoZSBpbmRleCBvZiB0aGlzIGRlc2NyaXB0b3Igd2l0aGluIGl0cyBwYXJlbnQuCi0gICAgICogQHNlZSBEZXNjcmlwdG9yI2dldEluZGV4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KLQotICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLwotICAgIHB1YmxpYyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdG9Qcm90bygpIHsgcmV0dXJuIHByb3RvOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB2YWx1ZSdzIHVucXVhbGlmaWVkIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB2YWx1ZSdzIG51bWJlci4gKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsgcmV0dXJuIHByb3RvLmdldE51bWJlcigpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHZhbHVlJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUuCi0gICAgICogQHNlZSBEZXNjcmlwdG9yI2dldEZ1bGxOYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeyByZXR1cm4gZnVsbE5hbWU7IH0KLQotICAgIC8qKiBHZXQgdGhlIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gY29udGFpbmluZyB0aGlzIGRlc2NyaXB0b3IuICovCi0gICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7IHJldHVybiBmaWxlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSB2YWx1ZSdzIGVudW0gdHlwZS4gKi8KLSAgICBwdWJsaWMgRW51bURlc2NyaXB0b3IgZ2V0VHlwZSgpIHsgcmV0dXJuIHR5cGU7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0Bjb2RlIEVudW1WYWx1ZU9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgRW51bVZhbHVlT3B0aW9ucyBnZXRPcHRpb25zKCkgeyByZXR1cm4gcHJvdG8uZ2V0T3B0aW9ucygpOyB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLSAgICBwcml2YXRlIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBFbnVtRGVzY3JpcHRvciB0eXBlOwotCi0gICAgcHJpdmF0ZSBFbnVtVmFsdWVEZXNjcmlwdG9yKGZpbmFsIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byBwcm90bywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRW51bURlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHRoaXMuaW5kZXggPSBpbmRleDsKLSAgICAgIHRoaXMucHJvdG8gPSBwcm90bzsKLSAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0gICAgICB0eXBlID0gcGFyZW50OwotCi0gICAgICBmdWxsTmFtZSA9IHBhcmVudC5nZXRGdWxsTmFtZSgpICsgJy4nICsgcHJvdG8uZ2V0TmFtZSgpOwotCi0gICAgICBmaWxlLnBvb2wuYWRkU3ltYm9sKHRoaXMpOwotICAgICAgZmlsZS5wb29sLmFkZEVudW1WYWx1ZUJ5TnVtYmVyKHRoaXMpOwotICAgIH0KLQotICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHByb3RvKSB7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0gICAgfQotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICAvKiogRGVzY3JpYmVzIGEgc2VydmljZSB0eXBlLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yIGltcGxlbWVudHMgR2VuZXJpY0Rlc2NyaXB0b3IgewotICAgIC8qKgotICAgICAqIEdldCB0aGUgaW5kZXggb2YgdGhpcyBkZXNjcmlwdG9yIHdpdGhpbiBpdHMgcGFyZW50LgotICAgICAqICogQHNlZSBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yI2dldEluZGV4KCkKLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldEluZGV4KCkgeyByZXR1cm4gaW5kZXg7IH0KLQotICAgIC8qKiBDb252ZXJ0IHRoZSBkZXNjcmlwdG9yIHRvIGl0cyBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uLiAqLwotICAgIHB1YmxpYyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQotCi0gICAgLyoqIEdldCB0aGUgdHlwZSdzIHVucXVhbGlmaWVkIG5hbWUuICovCi0gICAgcHVibGljIFN0cmluZyBnZXROYW1lKCkgeyByZXR1cm4gcHJvdG8uZ2V0TmFtZSgpOyB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIHR5cGUncyBmdWxseS1xdWFsaWZpZWQgbmFtZS4KLSAgICAgKiBAc2VlIERlc2NyaXB0b3IjZ2V0RnVsbE5hbWUoKQotICAgICAqLwotICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSB7IHJldHVybiBmdWxsTmFtZTsgfQotCi0gICAgLyoqIEdldCB0aGUge0BsaW5rIEZpbGVEZXNjcmlwdG9yfSBjb250YWluaW5nIHRoaXMgZGVzY3JpcHRvci4gKi8KLSAgICBwdWJsaWMgRmlsZURlc2NyaXB0b3IgZ2V0RmlsZSgpIHsgcmV0dXJuIGZpbGU7IH0KLQotICAgIC8qKiBHZXQgdGhlIHtAY29kZSBTZXJ2aWNlT3B0aW9uc30sIGRlZmluZWQgaW4ge0Bjb2RlIGRlc2NyaXB0b3IucHJvdG99LiAqLwotICAgIHB1YmxpYyBTZXJ2aWNlT3B0aW9ucyBnZXRPcHRpb25zKCkgeyByZXR1cm4gcHJvdG8uZ2V0T3B0aW9ucygpOyB9Ci0KLSAgICAvKiogR2V0IGEgbGlzdCBvZiBtZXRob2RzIGZvciB0aGlzIHNlcnZpY2UuICovCi0gICAgcHVibGljIExpc3Q8TWV0aG9kRGVzY3JpcHRvcj4gZ2V0TWV0aG9kcygpIHsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KEFycmF5cy5hc0xpc3QobWV0aG9kcykpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEZpbmQgYSBtZXRob2QgYnkgbmFtZS4KLSAgICAgKiBAcGFyYW0gbmFtZSBUaGUgdW5xdWFsaWZpZWQgbmFtZSBvZiB0aGUgbWV0aG9kIChlLmcuICJGb28iKS4KLSAgICAgKiBAcmV0dXJuIHRoZSBtZXRob2QncyBkZWNzcmlwdG9yLCBvciB7QGNvZGUgbnVsbH0gaWYgbm90IGZvdW5kLgotICAgICAqLwotICAgIHB1YmxpYyBNZXRob2REZXNjcmlwdG9yIGZpbmRNZXRob2RCeU5hbWUoZmluYWwgU3RyaW5nIG5hbWUpIHsKLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdCA9Ci0gICAgICAgICAgZmlsZS5wb29sLmZpbmRTeW1ib2woZnVsbE5hbWUgKyAnLicgKyBuYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCAmJiByZXN1bHQgaW5zdGFuY2VvZiBNZXRob2REZXNjcmlwdG9yKSB7Ci0gICAgICAgIHJldHVybiAoTWV0aG9kRGVzY3JpcHRvcilyZXN1bHQ7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gbnVsbDsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG87Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlOwotICAgIHByaXZhdGUgTWV0aG9kRGVzY3JpcHRvcltdIG1ldGhvZHM7Ci0KLSAgICBwcml2YXRlIFNlcnZpY2VEZXNjcmlwdG9yKGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgdGhpcy5pbmRleCA9IGluZGV4OwotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgICAgZnVsbE5hbWUgPSBjb21wdXRlRnVsbE5hbWUoZmlsZSwgbnVsbCwgcHJvdG8uZ2V0TmFtZSgpKTsKLSAgICAgIHRoaXMuZmlsZSA9IGZpbGU7Ci0KLSAgICAgIG1ldGhvZHMgPSBuZXcgTWV0aG9kRGVzY3JpcHRvcltwcm90by5nZXRNZXRob2RDb3VudCgpXTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZ2V0TWV0aG9kQ291bnQoKTsgaSsrKSB7Ci0gICAgICAgIG1ldGhvZHNbaV0gPSBuZXcgTWV0aG9kRGVzY3JpcHRvcigKLSAgICAgICAgICBwcm90by5nZXRNZXRob2QoaSksIGZpbGUsIHRoaXMsIGkpOwotICAgICAgfQotCi0gICAgICBmaWxlLnBvb2wuYWRkU3ltYm9sKHRoaXMpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBjcm9zc0xpbmsoKSB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBNZXRob2REZXNjcmlwdG9yIG1ldGhvZCA6IG1ldGhvZHMpIHsKLSAgICAgICAgbWV0aG9kLmNyb3NzTGluaygpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBTZWUge0BsaW5rIEZpbGVEZXNjcmlwdG9yI3NldFByb3RvfS4gKi8KLSAgICBwcml2YXRlIHZvaWQgc2V0UHJvdG8oZmluYWwgU2VydmljZURlc2NyaXB0b3JQcm90byBwcm90bykgewotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1ldGhvZHMubGVuZ3RoOyBpKyspIHsKLSAgICAgICAgbWV0aG9kc1tpXS5zZXRQcm90byhwcm90by5nZXRNZXRob2QoaSkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqCi0gICAqIERlc2NyaWJlcyBvbmUgbWV0aG9kIHdpdGhpbiBhIHNlcnZpY2UgdHlwZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgTWV0aG9kRGVzY3JpcHRvciBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yIHsKLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIGluZGV4IG9mIHRoaXMgZGVzY3JpcHRvciB3aXRoaW4gaXRzIHBhcmVudC4KLSAgICAgKiAqIEBzZWUgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciNnZXRJbmRleCgpCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRJbmRleCgpIHsgcmV0dXJuIGluZGV4OyB9Ci0KLSAgICAvKiogQ29udmVydCB0aGUgZGVzY3JpcHRvciB0byBpdHMgcHJvdG9jb2wgbWVzc2FnZSByZXByZXNlbnRhdGlvbi4gKi8KLSAgICBwdWJsaWMgTWV0aG9kRGVzY3JpcHRvclByb3RvIHRvUHJvdG8oKSB7IHJldHVybiBwcm90bzsgfQotCi0gICAgLyoqIEdldCB0aGUgbWV0aG9kJ3MgdW5xdWFsaWZpZWQgbmFtZS4gKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldE5hbWUoKSB7IHJldHVybiBwcm90by5nZXROYW1lKCk7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbWV0aG9kJ3MgZnVsbHktcXVhbGlmaWVkIG5hbWUuCi0gICAgICogQHNlZSBEZXNjcmlwdG9yI2dldEZ1bGxOYW1lKCkKLSAgICAgKi8KLSAgICBwdWJsaWMgU3RyaW5nIGdldEZ1bGxOYW1lKCkgeyByZXR1cm4gZnVsbE5hbWU7IH0KLQotICAgIC8qKiBHZXQgdGhlIHtAbGluayBGaWxlRGVzY3JpcHRvcn0gY29udGFpbmluZyB0aGlzIGRlc2NyaXB0b3IuICovCi0gICAgcHVibGljIEZpbGVEZXNjcmlwdG9yIGdldEZpbGUoKSB7IHJldHVybiBmaWxlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSBtZXRob2QncyBzZXJ2aWNlIHR5cGUuICovCi0gICAgcHVibGljIFNlcnZpY2VEZXNjcmlwdG9yIGdldFNlcnZpY2UoKSB7IHJldHVybiBzZXJ2aWNlOyB9Ci0KLSAgICAvKiogR2V0IHRoZSBtZXRob2QncyBpbnB1dCB0eXBlLiAqLwotICAgIHB1YmxpYyBEZXNjcmlwdG9yIGdldElucHV0VHlwZSgpIHsgcmV0dXJuIGlucHV0VHlwZTsgfQotCi0gICAgLyoqIEdldCB0aGUgbWV0aG9kJ3Mgb3V0cHV0IHR5cGUuICovCi0gICAgcHVibGljIERlc2NyaXB0b3IgZ2V0T3V0cHV0VHlwZSgpIHsgcmV0dXJuIG91dHB1dFR5cGU7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUge0Bjb2RlIE1ldGhvZE9wdGlvbnN9LCBkZWZpbmVkIGluIHtAY29kZSBkZXNjcmlwdG9yLnByb3RvfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWV0aG9kT3B0aW9ucyBnZXRPcHRpb25zKCkgeyByZXR1cm4gcHJvdG8uZ2V0T3B0aW9ucygpOyB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIGludCBpbmRleDsKLSAgICBwcml2YXRlIE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBmdWxsTmFtZTsKLSAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlOwotCi0gICAgLy8gSW5pdGlhbGl6ZWQgZHVyaW5nIGNyb3NzLWxpbmtpbmcuCi0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yIGlucHV0VHlwZTsKLSAgICBwcml2YXRlIERlc2NyaXB0b3Igb3V0cHV0VHlwZTsKLQotICAgIHByaXZhdGUgTWV0aG9kRGVzY3JpcHRvcihmaW5hbCBNZXRob2REZXNjcmlwdG9yUHJvdG8gcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFNlcnZpY2VEZXNjcmlwdG9yIHBhcmVudCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbiB7Ci0gICAgICB0aGlzLmluZGV4ID0gaW5kZXg7Ci0gICAgICB0aGlzLnByb3RvID0gcHJvdG87Ci0gICAgICB0aGlzLmZpbGUgPSBmaWxlOwotICAgICAgc2VydmljZSA9IHBhcmVudDsKLQotICAgICAgZnVsbE5hbWUgPSBwYXJlbnQuZ2V0RnVsbE5hbWUoKSArICcuJyArIHByb3RvLmdldE5hbWUoKTsKLQotICAgICAgZmlsZS5wb29sLmFkZFN5bWJvbCh0aGlzKTsKLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgY3Jvc3NMaW5rKCkgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIGlucHV0ID0KLSAgICAgICAgZmlsZS5wb29sLmxvb2t1cFN5bWJvbChwcm90by5nZXRJbnB1dFR5cGUoKSwgdGhpcyk7Ci0gICAgICBpZiAoIShpbnB1dCBpbnN0YW5jZW9mIERlc2NyaXB0b3IpKSB7Ci0gICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbih0aGlzLAotICAgICAgICAgICAgJ1wiJyArIHByb3RvLmdldElucHV0VHlwZSgpICsgIlwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLSAgICAgIGlucHV0VHlwZSA9IChEZXNjcmlwdG9yKWlucHV0OwotCi0gICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBvdXRwdXQgPQotICAgICAgICBmaWxlLnBvb2wubG9va3VwU3ltYm9sKHByb3RvLmdldE91dHB1dFR5cGUoKSwgdGhpcyk7Ci0gICAgICBpZiAoIShvdXRwdXQgaW5zdGFuY2VvZiBEZXNjcmlwdG9yKSkgewotICAgICAgICB0aHJvdyBuZXcgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24odGhpcywKLSAgICAgICAgICAgICdcIicgKyBwcm90by5nZXRPdXRwdXRUeXBlKCkgKyAiXCIgaXMgbm90IGEgbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgICAgb3V0cHV0VHlwZSA9IChEZXNjcmlwdG9yKW91dHB1dDsKLSAgICB9Ci0KLSAgICAvKiogU2VlIHtAbGluayBGaWxlRGVzY3JpcHRvciNzZXRQcm90b30uICovCi0gICAgcHJpdmF0ZSB2b2lkIHNldFByb3RvKGZpbmFsIE1ldGhvZERlc2NyaXB0b3JQcm90byBwcm90bykgewotICAgICAgdGhpcy5wcm90byA9IHByb3RvOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIGNvbXB1dGVGdWxsTmFtZShmaW5hbCBGaWxlRGVzY3JpcHRvciBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIERlc2NyaXB0b3IgcGFyZW50LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFN0cmluZyBuYW1lKSB7Ci0gICAgaWYgKHBhcmVudCAhPSBudWxsKSB7Ci0gICAgICByZXR1cm4gcGFyZW50LmdldEZ1bGxOYW1lKCkgKyAnLicgKyBuYW1lOwotICAgIH0gZWxzZSBpZiAoZmlsZS5nZXRQYWNrYWdlKCkubGVuZ3RoKCkgPiAwKSB7Ci0gICAgICByZXR1cm4gZmlsZS5nZXRQYWNrYWdlKCkgKyAnLicgKyBuYW1lOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gbmFtZTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBBbGwgZGVzY3JpcHRvcnMgZXhjZXB0IHtAY29kZSBGaWxlRGVzY3JpcHRvcn0gaW1wbGVtZW50IHRoaXMgdG8gbWFrZQotICAgKiB7QGNvZGUgRGVzY3JpcHRvclBvb2x9J3MgbGlmZSBlYXNpZXIuCi0gICAqLwotICBwcml2YXRlIGludGVyZmFjZSBHZW5lcmljRGVzY3JpcHRvciB7Ci0gICAgTWVzc2FnZSB0b1Byb3RvKCk7Ci0gICAgU3RyaW5nIGdldE5hbWUoKTsKLSAgICBTdHJpbmcgZ2V0RnVsbE5hbWUoKTsKLSAgICBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhyb3duIHdoZW4gYnVpbGRpbmcgZGVzY3JpcHRvcnMgZmFpbHMgYmVjYXVzZSB0aGUgc291cmNlIERlc2NyaXB0b3JQcm90b3MKLSAgICogYXJlIG5vdCB2YWxpZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDU3NTAyMDU3NzU0OTA0ODMxNDhMOwotCi0gICAgLyoqIEdldHMgdGhlIGZ1bGwgbmFtZSBvZiB0aGUgZGVzY3JpcHRvciB3aGVyZSB0aGUgZXJyb3Igb2NjdXJyZWQuICovCi0gICAgcHVibGljIFN0cmluZyBnZXRQcm9ibGVtU3ltYm9sTmFtZSgpIHsgcmV0dXJuIG5hbWU7IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgdGhlIHRoZSBwcm90b2NvbCBtZXNzYWdlIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBpbnZhbGlkIGRlc2NyaXB0b3IuCi0gICAgICovCi0gICAgcHVibGljIE1lc3NhZ2UgZ2V0UHJvYmxlbVByb3RvKCkgeyByZXR1cm4gcHJvdG87IH0KLQotICAgIC8qKgotICAgICAqIEdldHMgYSBodW1hbi1yZWFkYWJsZSBkZXNjcmlwdGlvbiBvZiB0aGUgZXJyb3IuCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBnZXREZXNjcmlwdGlvbigpIHsgcmV0dXJuIGRlc2NyaXB0aW9uOyB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZSBwcm90bzsKLSAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbjsKLQotICAgIHByaXZhdGUgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24oCi0gICAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHByb2JsZW1EZXNjcmlwdG9yLAotICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgIHN1cGVyKHByb2JsZW1EZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCkgKyAiOiAiICsgZGVzY3JpcHRpb24pOwotCi0gICAgICAvLyBOb3RlIHRoYXQgcHJvYmxlbURlc2NyaXB0b3IgbWF5IGJlIHBhcnRpYWxseSB1bmluaXRpYWxpemVkLCBzbyB3ZQotICAgICAgLy8gZG9uJ3Qgd2FudCB0byBleHBvc2UgaXQgZGlyZWN0bHkgdG8gdGhlIHVzZXIuICBTbywgd2Ugb25seSBwcm92aWRlCi0gICAgICAvLyB0aGUgbmFtZSBhbmQgdGhlIG9yaWdpbmFsIHByb3RvLgotICAgICAgbmFtZSA9IHByb2JsZW1EZXNjcmlwdG9yLmdldEZ1bGxOYW1lKCk7Ci0gICAgICBwcm90byA9IHByb2JsZW1EZXNjcmlwdG9yLnRvUHJvdG8oKTsKLSAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKAotICAgICAgICBmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBwcm9ibGVtRGVzY3JpcHRvciwKLSAgICAgICAgZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uLAotICAgICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICAgIHRoaXMocHJvYmxlbURlc2NyaXB0b3IsIGRlc2NyaXB0aW9uKTsKLSAgICAgIGluaXRDYXVzZShjYXVzZSk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgZmluYWwgRmlsZURlc2NyaXB0b3IgcHJvYmxlbURlc2NyaXB0b3IsCi0gICAgICAgIGZpbmFsIFN0cmluZyBkZXNjcmlwdGlvbikgewotICAgICAgc3VwZXIocHJvYmxlbURlc2NyaXB0b3IuZ2V0TmFtZSgpICsgIjogIiArIGRlc2NyaXB0aW9uKTsKLQotICAgICAgLy8gTm90ZSB0aGF0IHByb2JsZW1EZXNjcmlwdG9yIG1heSBiZSBwYXJ0aWFsbHkgdW5pbml0aWFsaXplZCwgc28gd2UKLSAgICAgIC8vIGRvbid0IHdhbnQgdG8gZXhwb3NlIGl0IGRpcmVjdGx5IHRvIHRoZSB1c2VyLiAgU28sIHdlIG9ubHkgcHJvdmlkZQotICAgICAgLy8gdGhlIG5hbWUgYW5kIHRoZSBvcmlnaW5hbCBwcm90by4KLSAgICAgIG5hbWUgPSBwcm9ibGVtRGVzY3JpcHRvci5nZXROYW1lKCk7Ci0gICAgICBwcm90byA9IHByb2JsZW1EZXNjcmlwdG9yLnRvUHJvdG8oKTsKLSAgICAgIHRoaXMuZGVzY3JpcHRpb24gPSBkZXNjcmlwdGlvbjsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBBIHByaXZhdGUgaGVscGVyIGNsYXNzIHdoaWNoIGNvbnRhaW5zIGxvb2t1cCB0YWJsZXMgY29udGFpbmluZyBhbGwgdGhlCi0gICAqIGRlc2NyaXB0b3JzIGRlZmluZWQgaW4gYSBwYXJ0aWN1bGFyIGZpbGUuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9yUG9vbCB7Ci0gICAgRGVzY3JpcHRvclBvb2woZmluYWwgRmlsZURlc2NyaXB0b3JbXSBkZXBlbmRlbmNpZXMpIHsKLSAgICAgIHRoaXMuZGVwZW5kZW5jaWVzID0gbmV3IERlc2NyaXB0b3JQb29sW2RlcGVuZGVuY2llcy5sZW5ndGhdOwotCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY2llcy5sZW5ndGg7IGkrKykgIHsKLSAgICAgICAgdGhpcy5kZXBlbmRlbmNpZXNbaV0gPSBkZXBlbmRlbmNpZXNbaV0ucG9vbDsKLSAgICAgIH0KLQotICAgICAgZm9yIChmaW5hbCBGaWxlRGVzY3JpcHRvciBkZXBlbmRlbmN5IDogZGVwZW5kZW5jaWVzKSB7Ci0gICAgICAgIHRyeSB7Ci0gICAgICAgICAgYWRkUGFja2FnZShkZXBlbmRlbmN5LmdldFBhY2thZ2UoKSwgZGVwZW5kZW5jeSk7Ci0gICAgICAgIH0gY2F0Y2ggKERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgICAvLyBDYW4ndCBoYXBwZW4sIGJlY2F1c2UgYWRkUGFja2FnZSgpIG9ubHkgZmFpbHMgd2hlbiB0aGUgbmFtZQotICAgICAgICAgIC8vIGNvbmZsaWN0cyB3aXRoIGEgbm9uLXBhY2thZ2UsIGJ1dCB3ZSBoYXZlIG5vdCB5ZXQgYWRkZWQgYW55Ci0gICAgICAgICAgLy8gbm9uLXBhY2thZ2VzIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgICAgYXNzZXJ0IGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yUG9vbFtdIGRlcGVuZGVuY2llczsKLQotICAgIHByaXZhdGUgZmluYWwgTWFwPFN0cmluZywgR2VuZXJpY0Rlc2NyaXB0b3I+IGRlc2NyaXB0b3JzQnlOYW1lID0KLSAgICAgIG5ldyBIYXNoTWFwPFN0cmluZywgR2VuZXJpY0Rlc2NyaXB0b3I+KCk7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXA8RGVzY3JpcHRvckludFBhaXIsIEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzQnlOdW1iZXIgPQotICAgICAgbmV3IEhhc2hNYXA8RGVzY3JpcHRvckludFBhaXIsIEZpZWxkRGVzY3JpcHRvcj4oKTsKLSAgICBwcml2YXRlIGZpbmFsIE1hcDxEZXNjcmlwdG9ySW50UGFpciwgRW51bVZhbHVlRGVzY3JpcHRvcj4gZW51bVZhbHVlc0J5TnVtYmVyCi0gICAgICAgID0gbmV3IEhhc2hNYXA8RGVzY3JpcHRvckludFBhaXIsIEVudW1WYWx1ZURlc2NyaXB0b3I+KCk7Ci0KLSAgICAvKiogRmluZCBhIGdlbmVyaWMgZGVzY3JpcHRvciBieSBmdWxseS1xdWFsaWZpZWQgbmFtZS4gKi8KLSAgICBHZW5lcmljRGVzY3JpcHRvciBmaW5kU3ltYm9sKGZpbmFsIFN0cmluZyBmdWxsTmFtZSkgewotICAgICAgR2VuZXJpY0Rlc2NyaXB0b3IgcmVzdWx0ID0gZGVzY3JpcHRvcnNCeU5hbWUuZ2V0KGZ1bGxOYW1lKTsKLSAgICAgIGlmIChyZXN1bHQgIT0gbnVsbCkgewotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfQotCi0gICAgICBmb3IgKGZpbmFsIERlc2NyaXB0b3JQb29sIGRlcGVuZGVuY3kgOiBkZXBlbmRlbmNpZXMpIHsKLSAgICAgICAgcmVzdWx0ID0gZGVwZW5kZW5jeS5kZXNjcmlwdG9yc0J5TmFtZS5nZXQoZnVsbE5hbWUpOwotICAgICAgICBpZiAocmVzdWx0ICE9IG51bGwpIHsKLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIHJldHVybiBudWxsOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIExvb2sgdXAgYSBkZXNjcmlwdG9yIGJ5IG5hbWUsIHJlbGF0aXZlIHRvIHNvbWUgb3RoZXIgZGVzY3JpcHRvci4KLSAgICAgKiBUaGUgbmFtZSBtYXkgYmUgZnVsbHktcXVhbGlmaWVkICh3aXRoIGEgbGVhZGluZyAnLicpLAotICAgICAqIHBhcnRpYWxseS1xdWFsaWZpZWQsIG9yIHVucXVhbGlmaWVkLiAgQysrLWxpa2UgbmFtZSBsb29rdXAgc2VtYW50aWNzCi0gICAgICogYXJlIHVzZWQgdG8gc2VhcmNoIGZvciB0aGUgbWF0Y2hpbmcgZGVzY3JpcHRvci4KLSAgICAgKi8KLSAgICBHZW5lcmljRGVzY3JpcHRvciBsb29rdXBTeW1ib2woZmluYWwgU3RyaW5nIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIHJlbGF0aXZlVG8pCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIC8vIFRPRE8oa2VudG9uKTogIFRoaXMgY291bGQgYmUgb3B0aW1pemVkIGluIGEgbnVtYmVyIG9mIHdheXMuCi0KLSAgICAgIEdlbmVyaWNEZXNjcmlwdG9yIHJlc3VsdDsKLSAgICAgIGlmIChuYW1lLnN0YXJ0c1dpdGgoIi4iKSkgewotICAgICAgICAvLyBGdWxseS1xdWFsaWZpZWQgbmFtZS4KLSAgICAgICAgcmVzdWx0ID0gZmluZFN5bWJvbChuYW1lLnN1YnN0cmluZygxKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBJZiAibmFtZSIgaXMgYSBjb21wb3VuZCBpZGVudGlmaWVyLCB3ZSB3YW50IHRvIHNlYXJjaCBmb3IgdGhlCi0gICAgICAgIC8vIGZpcnN0IGNvbXBvbmVudCBvZiBpdCwgdGhlbiBzZWFyY2ggd2l0aGluIGl0IGZvciB0aGUgcmVzdC4KLSAgICAgICAgZmluYWwgaW50IGZpcnN0UGFydExlbmd0aCA9IG5hbWUuaW5kZXhPZignLicpOwotICAgICAgICBmaW5hbCBTdHJpbmcgZmlyc3RQYXJ0OwotICAgICAgICBpZiAoZmlyc3RQYXJ0TGVuZ3RoID09IC0xKSB7Ci0gICAgICAgICAgZmlyc3RQYXJ0ID0gbmFtZTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBmaXJzdFBhcnQgPSBuYW1lLnN1YnN0cmluZygwLCBmaXJzdFBhcnRMZW5ndGgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gV2Ugd2lsbCBzZWFyY2ggZWFjaCBwYXJlbnQgc2NvcGUgb2YgInJlbGF0aXZlVG8iIGxvb2tpbmcgZm9yIHRoZQotICAgICAgICAvLyBzeW1ib2wuCi0gICAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgc2NvcGVUb1RyeSA9Ci0gICAgICAgICAgICBuZXcgU3RyaW5nQnVpbGRlcihyZWxhdGl2ZVRvLmdldEZ1bGxOYW1lKCkpOwotCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgLy8gQ2hvcCBvZmYgdGhlIGxhc3QgY29tcG9uZW50IG9mIHRoZSBzY29wZS4KLSAgICAgICAgICBmaW5hbCBpbnQgZG90cG9zID0gc2NvcGVUb1RyeS5sYXN0SW5kZXhPZigiLiIpOwotICAgICAgICAgIGlmIChkb3Rwb3MgPT0gLTEpIHsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRTeW1ib2wobmFtZSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgc2NvcGVUb1RyeS5zZXRMZW5ndGgoZG90cG9zICsgMSk7Ci0KLSAgICAgICAgICAgIC8vIEFwcGVuZCBmaXJzdFBhcnQgYW5kIHRyeSB0byBmaW5kLgotICAgICAgICAgICAgc2NvcGVUb1RyeS5hcHBlbmQoZmlyc3RQYXJ0KTsKLSAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRTeW1ib2woc2NvcGVUb1RyeS50b1N0cmluZygpKTsKLQotICAgICAgICAgICAgaWYgKHJlc3VsdCAhPSBudWxsKSB7Ci0gICAgICAgICAgICAgIGlmIChmaXJzdFBhcnRMZW5ndGggIT0gLTEpIHsKLSAgICAgICAgICAgICAgICAvLyBXZSBvbmx5IGZvdW5kIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSBzeW1ib2wuICBOb3cgbG9vayBmb3IKLSAgICAgICAgICAgICAgICAvLyB0aGUgd2hvbGUgdGhpbmcuICBJZiB0aGlzIGZhaWxzLCB3ZSAqZG9uJ3QqIHdhbnQgdG8ga2VlcAotICAgICAgICAgICAgICAgIC8vIHNlYXJjaGluZyBwYXJlbnQgc2NvcGVzLgotICAgICAgICAgICAgICAgIHNjb3BlVG9Ucnkuc2V0TGVuZ3RoKGRvdHBvcyArIDEpOwotICAgICAgICAgICAgICAgIHNjb3BlVG9UcnkuYXBwZW5kKG5hbWUpOwotICAgICAgICAgICAgICAgIHJlc3VsdCA9IGZpbmRTeW1ib2woc2NvcGVUb1RyeS50b1N0cmluZygpKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICAgIH0KLQotICAgICAgICAgICAgLy8gTm90IGZvdW5kLiAgUmVtb3ZlIHRoZSBuYW1lIHNvIHdlIGNhbiB0cnkgYWdhaW4uCi0gICAgICAgICAgICBzY29wZVRvVHJ5LnNldExlbmd0aChkb3Rwb3MpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKHJlbGF0aXZlVG8sCi0gICAgICAgICAgICAnXCInICsgbmFtZSArICJcIiBpcyBub3QgZGVmaW5lZC4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHN5bWJvbCB0byB0aGUgc3ltYm9sIHRhYmxlLiAgSWYgYSBzeW1ib2wgd2l0aCB0aGUgc2FtZSBuYW1lCi0gICAgICogYWxyZWFkeSBleGlzdHMsIHRocm93cyBhbiBlcnJvci4KLSAgICAgKi8KLSAgICB2b2lkIGFkZFN5bWJvbChmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICAgICAgICAgICAgdGhyb3dzIERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIHsKLSAgICAgIHZhbGlkYXRlU3ltYm9sTmFtZShkZXNjcmlwdG9yKTsKLQotICAgICAgZmluYWwgU3RyaW5nIGZ1bGxOYW1lID0gZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpOwotICAgICAgZmluYWwgaW50IGRvdHBvcyA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0KLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIG9sZCA9IGRlc2NyaXB0b3JzQnlOYW1lLnB1dChmdWxsTmFtZSwgZGVzY3JpcHRvcik7Ci0gICAgICBpZiAob2xkICE9IG51bGwpIHsKLSAgICAgICAgZGVzY3JpcHRvcnNCeU5hbWUucHV0KGZ1bGxOYW1lLCBvbGQpOwotCi0gICAgICAgIGlmIChkZXNjcmlwdG9yLmdldEZpbGUoKSA9PSBvbGQuZ2V0RmlsZSgpKSB7Ci0gICAgICAgICAgaWYgKGRvdHBvcyA9PSAtMSkgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgJ1wiJyArIGZ1bGxOYW1lICsgIlwiIGlzIGFscmVhZHkgZGVmaW5lZC4iKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgJ1wiJyArIGZ1bGxOYW1lLnN1YnN0cmluZyhkb3Rwb3MgKyAxKSArCi0gICAgICAgICAgICAgICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gXCIiICsKLSAgICAgICAgICAgICAgZnVsbE5hbWUuc3Vic3RyaW5nKDAsIGRvdHBvcykgKyAiXCIuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAnXCInICsgZnVsbE5hbWUgKyAiXCIgaXMgYWxyZWFkeSBkZWZpbmVkIGluIGZpbGUgXCIiICsKLSAgICAgICAgICAgIG9sZC5nZXRGaWxlKCkuZ2V0TmFtZSgpICsgIlwiLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVwcmVzZW50cyBhIHBhY2thZ2UgaW4gdGhlIHN5bWJvbCB0YWJsZS4gIFdlIHVzZSBQYWNrYWdlRGVzY3JpcHRvcnMKLSAgICAgKiBqdXN0IGFzIHBsYWNlaG9sZGVycyBzbyB0aGF0IHNvbWVvbmUgY2Fubm90IGRlZmluZSwgc2F5LCBhIG1lc3NhZ2UgdHlwZQotICAgICAqIHRoYXQgaGFzIHRoZSBzYW1lIG5hbWUgYXMgYW4gZXhpc3RpbmcgcGFja2FnZS4KLSAgICAgKi8KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBQYWNrYWdlRGVzY3JpcHRvciBpbXBsZW1lbnRzIEdlbmVyaWNEZXNjcmlwdG9yIHsKLSAgICAgIHB1YmxpYyBNZXNzYWdlIHRvUHJvdG8oKSAgICAgICAgeyByZXR1cm4gZmlsZS50b1Byb3RvKCk7IH0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0TmFtZSgpICAgICAgICAgeyByZXR1cm4gbmFtZTsgICAgICAgICAgIH0KLSAgICAgIHB1YmxpYyBTdHJpbmcgZ2V0RnVsbE5hbWUoKSAgICAgeyByZXR1cm4gZnVsbE5hbWU7ICAgICAgIH0KLSAgICAgIHB1YmxpYyBGaWxlRGVzY3JpcHRvciBnZXRGaWxlKCkgeyByZXR1cm4gZmlsZTsgICAgICAgICAgIH0KLQotICAgICAgUGFja2FnZURlc2NyaXB0b3IoZmluYWwgU3RyaW5nIG5hbWUsIGZpbmFsIFN0cmluZyBmdWxsTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGUpIHsKLSAgICAgICAgdGhpcy5maWxlID0gZmlsZTsKLSAgICAgICAgdGhpcy5mdWxsTmFtZSA9IGZ1bGxOYW1lOwotICAgICAgICB0aGlzLm5hbWUgPSBuYW1lOwotICAgICAgfQotCi0gICAgICBwcml2YXRlIGZpbmFsIFN0cmluZyBuYW1lOwotICAgICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmcgZnVsbE5hbWU7Ci0gICAgICBwcml2YXRlIGZpbmFsIEZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIHBhY2thZ2UgdG8gdGhlIHN5bWJvbCB0YWJsZXMuICBJZiBhIHBhY2thZ2UgYnkgdGhlIHNhbWUgbmFtZQotICAgICAqIGFscmVhZHkgZXhpc3RzLCB0aGF0IGlzIGZpbmUsIGJ1dCBpZiBzb21lIG90aGVyIGtpbmQgb2Ygc3ltYm9sIGV4aXN0cwotICAgICAqIHVuZGVyIHRoZSBzYW1lIG5hbWUsIGFuIGV4Y2VwdGlvbiBpcyB0aHJvd24uICBJZiB0aGUgcGFja2FnZSBoYXMKLSAgICAgKiBtdWx0aXBsZSBjb21wb25lbnRzLCB0aGlzIGFsc28gYWRkcyB0aGUgcGFyZW50IHBhY2thZ2UocykuCi0gICAgICovCi0gICAgdm9pZCBhZGRQYWNrYWdlKGZpbmFsIFN0cmluZyBmdWxsTmFtZSwgZmluYWwgRmlsZURlc2NyaXB0b3IgZmlsZSkKLSAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IGRvdHBvcyA9IGZ1bGxOYW1lLmxhc3RJbmRleE9mKCcuJyk7Ci0gICAgICBmaW5hbCBTdHJpbmcgbmFtZTsKLSAgICAgIGlmIChkb3Rwb3MgPT0gLTEpIHsKLSAgICAgICAgbmFtZSA9IGZ1bGxOYW1lOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgYWRkUGFja2FnZShmdWxsTmFtZS5zdWJzdHJpbmcoMCwgZG90cG9zKSwgZmlsZSk7Ci0gICAgICAgIG5hbWUgPSBmdWxsTmFtZS5zdWJzdHJpbmcoZG90cG9zICsgMSk7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIEdlbmVyaWNEZXNjcmlwdG9yIG9sZCA9Ci0gICAgICAgIGRlc2NyaXB0b3JzQnlOYW1lLnB1dChmdWxsTmFtZSwKLSAgICAgICAgICBuZXcgUGFja2FnZURlc2NyaXB0b3IobmFtZSwgZnVsbE5hbWUsIGZpbGUpKTsKLSAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICBkZXNjcmlwdG9yc0J5TmFtZS5wdXQoZnVsbE5hbWUsIG9sZCk7Ci0gICAgICAgIGlmICghKG9sZCBpbnN0YW5jZW9mIFBhY2thZ2VEZXNjcmlwdG9yKSkgewotICAgICAgICAgIHRocm93IG5ldyBEZXNjcmlwdG9yVmFsaWRhdGlvbkV4Y2VwdGlvbihmaWxlLAotICAgICAgICAgICAgICAnXCInICsgbmFtZSArICJcIiBpcyBhbHJlYWR5IGRlZmluZWQgKGFzIHNvbWV0aGluZyBvdGhlciB0aGFuIGEgIgotICAgICAgICAgICAgICArICJwYWNrYWdlKSBpbiBmaWxlIFwiIiArIG9sZC5nZXRGaWxlKCkuZ2V0TmFtZSgpICsgIlwiLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEEgKEdlbmVyaWNEZXNjcmlwdG9yLCBpbnQpIHBhaXIsIHVzZWQgYXMgYSBtYXAga2V5LiAqLwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIERlc2NyaXB0b3JJbnRQYWlyIHsKLSAgICAgIHByaXZhdGUgZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgZGVzY3JpcHRvcjsKLSAgICAgIHByaXZhdGUgZmluYWwgaW50IG51bWJlcjsKLQotICAgICAgRGVzY3JpcHRvckludFBhaXIoZmluYWwgR2VuZXJpY0Rlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgaW50IG51bWJlcikgewotICAgICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgICByZXR1cm4gZGVzY3JpcHRvci5oYXNoQ29kZSgpICogKCgxIDw8IDE2KSAtIDEpICsgbnVtYmVyOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgewotICAgICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9ySW50UGFpcikpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgZmluYWwgRGVzY3JpcHRvckludFBhaXIgb3RoZXIgPSAoRGVzY3JpcHRvckludFBhaXIpb2JqOwotICAgICAgICByZXR1cm4gZGVzY3JpcHRvciA9PSBvdGhlci5kZXNjcmlwdG9yICYmIG51bWJlciA9PSBvdGhlci5udW1iZXI7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWRkcyBhIGZpZWxkIHRvIHRoZSBmaWVsZHNCeU51bWJlciB0YWJsZS4gIFRocm93cyBhbiBleGNlcHRpb24gaWYgYQotICAgICAqIGZpZWxkIHdpdGggaHRlIHNhbWUgY29udGFpbmluZyB0eXBlIGFuZCBudW1iZXIgYWxyZWFkeSBleGlzdHMuCi0gICAgICovCi0gICAgdm9pZCBhZGRGaWVsZEJ5TnVtYmVyKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkKLSAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZmluYWwgRGVzY3JpcHRvckludFBhaXIga2V5ID0KLSAgICAgICAgbmV3IERlc2NyaXB0b3JJbnRQYWlyKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCksIGZpZWxkLmdldE51bWJlcigpKTsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBvbGQgPSBmaWVsZHNCeU51bWJlci5wdXQoa2V5LCBmaWVsZCk7Ci0gICAgICBpZiAob2xkICE9IG51bGwpIHsKLSAgICAgICAgZmllbGRzQnlOdW1iZXIucHV0KGtleSwgb2xkKTsKLSAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGZpZWxkLAotICAgICAgICAgICJGaWVsZCBudW1iZXIgIiArIGZpZWxkLmdldE51bWJlcigpICsKLSAgICAgICAgICAiaGFzIGFscmVhZHkgYmVlbiB1c2VkIGluIFwiIiArCi0gICAgICAgICAgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKS5nZXRGdWxsTmFtZSgpICsKLSAgICAgICAgICAiXCIgYnkgZmllbGQgXCIiICsgb2xkLmdldE5hbWUoKSArICJcIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGRzIGFuIGVudW0gdmFsdWUgdG8gdGhlIGVudW1WYWx1ZXNCeU51bWJlciB0YWJsZS4gIElmIGFuIGVudW0gdmFsdWUKLSAgICAgKiB3aXRoIHRoZSBzYW1lIHR5cGUgYW5kIG51bWJlciBhbHJlYWR5IGV4aXN0cywgZG9lcyBub3RoaW5nLiAgKFRoaXMgaXMKLSAgICAgKiBhbGxvd2VkOyB0aGUgZmlyc3QgdmFsdWUgZGVmaW5lIHdpdGggdGhlIG51bWJlciB0YWtlcyBwcmVjZWRlbmNlLikKLSAgICAgKi8KLSAgICB2b2lkIGFkZEVudW1WYWx1ZUJ5TnVtYmVyKGZpbmFsIEVudW1WYWx1ZURlc2NyaXB0b3IgdmFsdWUpIHsKLSAgICAgIGZpbmFsIERlc2NyaXB0b3JJbnRQYWlyIGtleSA9Ci0gICAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcih2YWx1ZS5nZXRUeXBlKCksIHZhbHVlLmdldE51bWJlcigpKTsKLSAgICAgIGZpbmFsIEVudW1WYWx1ZURlc2NyaXB0b3Igb2xkID0gZW51bVZhbHVlc0J5TnVtYmVyLnB1dChrZXksIHZhbHVlKTsKLSAgICAgIGlmIChvbGQgIT0gbnVsbCkgewotICAgICAgICBlbnVtVmFsdWVzQnlOdW1iZXIucHV0KGtleSwgb2xkKTsKLSAgICAgICAgLy8gTm90IGFuIGVycm9yOiAgTXVsdGlwbGUgZW51bSB2YWx1ZXMgbWF5IGhhdmUgdGhlIHNhbWUgbnVtYmVyLCBidXQKLSAgICAgICAgLy8gd2Ugb25seSB3YW50IHRoZSBmaXJzdCBvbmUgaW4gdGhlIG1hcC4KLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBWZXJpZmllcyB0aGF0IHRoZSBkZXNjcmlwdG9yJ3MgbmFtZSBpcyB2YWxpZCAoaS5lLiBpdCBjb250YWlucyBvbmx5Ci0gICAgICogbGV0dGVycywgZGlnaXRzLCBhbmQgdW5kZXJzY29yZXMsIGFuZCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgZGlnaXQpLgotICAgICAqLwotICAgIHN0YXRpYyB2b2lkIHZhbGlkYXRlU3ltYm9sTmFtZShmaW5hbCBHZW5lcmljRGVzY3JpcHRvciBkZXNjcmlwdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gewotICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSBkZXNjcmlwdG9yLmdldE5hbWUoKTsKLSAgICAgIGlmIChuYW1lLmxlbmd0aCgpID09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsICJNaXNzaW5nIG5hbWUuIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBib29sZWFuIHZhbGlkID0gdHJ1ZTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLmxlbmd0aCgpOyBpKyspIHsKLSAgICAgICAgICBmaW5hbCBjaGFyIGMgPSBuYW1lLmNoYXJBdChpKTsKLSAgICAgICAgICAvLyBOb24tQVNDSUkgY2hhcmFjdGVycyBhcmUgbm90IHZhbGlkIGluIHByb3RvYnVmIGlkZW50aWZpZXJzLCBldmVuCi0gICAgICAgICAgLy8gaWYgdGhleSBhcmUgbGV0dGVycyBvciBkaWdpdHMuCi0gICAgICAgICAgaWYgKGMgPj0gMTI4KSB7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgICAvLyBGaXJzdCBjaGFyYWN0ZXIgbXVzdCBiZSBsZXR0ZXIgb3IgXy4gIFN1YnNlcXVlbnQgY2hhcmFjdGVycyBtYXkKLSAgICAgICAgICAvLyBiZSBsZXR0ZXJzLCBudW1iZXJzLCBvciBkaWdpdHMuCi0gICAgICAgICAgaWYgKENoYXJhY3Rlci5pc0xldHRlcihjKSB8fCBjID09ICdfJyB8fAotICAgICAgICAgICAgICAoQ2hhcmFjdGVyLmlzRGlnaXQoYykgJiYgaSA+IDApKSB7Ci0gICAgICAgICAgICAvLyBWYWxpZAotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICB2YWxpZCA9IGZhbHNlOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpZiAoIXZhbGlkKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IERlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uKGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICdcIicgKyBuYW1lICsgIlwiIGlzIG5vdCBhIHZhbGlkIGlkZW50aWZpZXIuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGMxMDZiNjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0R5bmFtaWNNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MzggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotCi1pbXBvcnQgamF2YS5pby5JbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIE1lc3NhZ2V9IHRoYXQgY2FuIHJlcHJlc2VudCBhcmJpdHJhcnkgdHlwZXMsCi0gKiBnaXZlbiBhIHtAbGluayBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yfS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRHluYW1pY01lc3NhZ2UgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UgewotICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgdHlwZTsKLSAgcHJpdmF0ZSBmaW5hbCBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkczsKLSAgcHJpdmF0ZSBmaW5hbCBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkczsKLSAgcHJpdmF0ZSBpbnQgbWVtb2l6ZWRTaXplID0gLTE7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIHtAY29kZSBEeW5hbWljTWVzc2FnZX0gdXNpbmcgdGhlIGdpdmVuIHtAY29kZSBGaWVsZFNldH0uCi0gICAqLwotICBwcml2YXRlIER5bmFtaWNNZXNzYWdlKERlc2NyaXB0b3IgdHlwZSwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yPiBmaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgIHRoaXMuZmllbGRzID0gZmllbGRzOwotICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHM7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IGEge0Bjb2RlIER5bmFtaWNNZXNzYWdlfSByZXByZXNlbnRpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlCi0gICAqIGdpdmVuIHR5cGUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIGdldERlZmF1bHRJbnN0YW5jZShEZXNjcmlwdG9yIHR5cGUpIHsKLSAgICByZXR1cm4gbmV3IER5bmFtaWNNZXNzYWdlKHR5cGUsIEZpZWxkU2V0LjxGaWVsZERlc2NyaXB0b3I+ZW1wdHlTZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gIH0KLQotICAvKiogUGFyc2UgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4gKi8KLSAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHJldHVybiBuZXdCdWlsZGVyKHR5cGUpLm1lcmdlRnJvbShpbnB1dCkuYnVpbGRQYXJzZWQoKTsKLSAgfQotCi0gIC8qKiBQYXJzZSBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgZnJvbSB0aGUgZ2l2ZW4gaW5wdXQgc3RyZWFtLiAqLwotICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbSgKLSAgICAgIERlc2NyaXB0b3IgdHlwZSwKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSkuYnVpbGRQYXJzZWQoKTsKLSAgfQotCi0gIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm4gaXQuICovCi0gIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgQnl0ZVN0cmluZyBkYXRhKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oZGF0YSkuYnVpbGRQYXJzZWQoKTsKLSAgfQotCi0gIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGFuZCByZXR1cm4gaXQuICovCi0gIHB1YmxpYyBzdGF0aWMgRHluYW1pY01lc3NhZ2UgcGFyc2VGcm9tKERlc2NyaXB0b3IgdHlwZSwgQnl0ZVN0cmluZyBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZFBhcnNlZCgpOwotICB9Ci0KLSAgLyoqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhlIGdpdmVuIHR5cGUgYW5kIHJldHVybiBpdC4gKi8KLSAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBieXRlW10gZGF0YSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkUGFyc2VkKCk7Ci0gIH0KLQotICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBhbmQgcmV0dXJuIGl0LiAqLwotICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIGJ5dGVbXSBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ld0J1aWxkZXIodHlwZSkubWVyZ2VGcm9tKGRhdGEsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZFBhcnNlZCgpOwotICB9Ci0KLSAgLyoqIFBhcnNlIGEgbWVzc2FnZSBvZiB0aGUgZ2l2ZW4gdHlwZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIHJldHVybiBpdC4gKi8KLSAgcHVibGljIHN0YXRpYyBEeW5hbWljTWVzc2FnZSBwYXJzZUZyb20oRGVzY3JpcHRvciB0eXBlLCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkUGFyc2VkKCk7Ci0gIH0KLQotICAvKiogUGFyc2UgYSBtZXNzYWdlIG9mIHRoZSBnaXZlbiB0eXBlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgcmV0dXJuIGl0LiAqLwotICBwdWJsaWMgc3RhdGljIER5bmFtaWNNZXNzYWdlIHBhcnNlRnJvbShEZXNjcmlwdG9yIHR5cGUsIElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcih0eXBlKS5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KS5idWlsZFBhcnNlZCgpOwotICB9Ci0KLSAgLyoqIENvbnN0cnVjdCBhIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9IGZvciB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoRGVzY3JpcHRvciB0eXBlKSB7Ci0gICAgcmV0dXJuIG5ldyBCdWlsZGVyKHR5cGUpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9IGZvciBhIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBhcwotICAgKiB7QGNvZGUgcHJvdG90eXBlfSwgYW5kIGluaXRpYWxpemUgaXQgd2l0aCB7QGNvZGUgcHJvdG90eXBlfSdzIGNvbnRlbnRzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoTWVzc2FnZSBwcm90b3R5cGUpIHsKLSAgICByZXR1cm4gbmV3IEJ1aWxkZXIocHJvdG90eXBlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkpLm1lcmdlRnJvbShwcm90b3R5cGUpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gSW1wbGVtZW50YXRpb24gb2YgTWVzc2FnZSBpbnRlcmZhY2UuCi0KLSAgcHVibGljIERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgcmV0dXJuIHR5cGU7Ci0gIH0KLQotICBwdWJsaWMgRHluYW1pY01lc3NhZ2UgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gZ2V0RGVmYXVsdEluc3RhbmNlKHR5cGUpOwotICB9Ci0KLSAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgIHJldHVybiBmaWVsZHMuZ2V0QWxsRmllbGRzKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgcmV0dXJuIGZpZWxkcy5oYXNGaWVsZChmaWVsZCk7Ci0gIH0KLQotICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICBPYmplY3QgcmVzdWx0ID0gZmllbGRzLmdldEZpZWxkKGZpZWxkKTsKLSAgICBpZiAocmVzdWx0ID09IG51bGwpIHsKLSAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgIHJlc3VsdCA9IGdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJlc3VsdCA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgIHJldHVybiBmaWVsZHMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKLSAgfQotCi0gIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIGludCBpbmRleCkgewotICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICByZXR1cm4gZmllbGRzLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKLSAgfQotCi0gIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKLSAgICByZXR1cm4gdW5rbm93bkZpZWxkczsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGJvb2xlYW4gaXNJbml0aWFsaXplZChEZXNjcmlwdG9yIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGZpZWxkcykgewotICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KLSAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IHR5cGUuZ2V0RmllbGRzKCkpIHsKLSAgICAgIGlmIChmaWVsZC5pc1JlcXVpcmVkKCkpIHsKLSAgICAgICAgaWYgKCFmaWVsZHMuaGFzRmllbGQoZmllbGQpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCi0gICAgcmV0dXJuIGZpZWxkcy5pc0luaXRpYWxpemVkKCk7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIHJldHVybiBpc0luaXRpYWxpemVkKHR5cGUsIGZpZWxkcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBpZiAodHlwZS5nZXRPcHRpb25zKCkuZ2V0TWVzc2FnZVNldFdpcmVGb3JtYXQoKSkgewotICAgICAgZmllbGRzLndyaXRlTWVzc2FnZVNldFRvKG91dHB1dCk7Ci0gICAgICB1bmtub3duRmllbGRzLndyaXRlQXNNZXNzYWdlU2V0VG8ob3V0cHV0KTsKLSAgICB9IGVsc2UgewotICAgICAgZmllbGRzLndyaXRlVG8ob3V0cHV0KTsKLSAgICAgIHVua25vd25GaWVsZHMud3JpdGVUbyhvdXRwdXQpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgaW50IHNpemUgPSBtZW1vaXplZFNpemU7Ci0gICAgaWYgKHNpemUgIT0gLTEpIHJldHVybiBzaXplOwotCi0gICAgaWYgKHR5cGUuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkpIHsKLSAgICAgIHNpemUgPSBmaWVsZHMuZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgICBzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTsKLSAgICB9IGVsc2UgewotICAgICAgc2l6ZSA9IGZpZWxkcy5nZXRTZXJpYWxpemVkU2l6ZSgpOwotICAgICAgc2l6ZSArPSB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgfQotCi0gICAgbWVtb2l6ZWRTaXplID0gc2l6ZTsKLSAgICByZXR1cm4gc2l6ZTsKLSAgfQotCi0gIHB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCkgewotICAgIHJldHVybiBuZXcgQnVpbGRlcih0eXBlKTsKLSAgfQotCi0gIHB1YmxpYyBCdWlsZGVyIHRvQnVpbGRlcigpIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlckZvclR5cGUoKS5tZXJnZUZyb20odGhpcyk7Ci0gIH0KLQotICAvKiogVmVyaWZpZXMgdGhhdCB0aGUgZmllbGQgaXMgYSBmaWVsZCBvZiB0aGlzIG1lc3NhZ2UuICovCi0gIHByaXZhdGUgdm9pZCB2ZXJpZnlDb250YWluaW5nVHlwZShGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBCdWlsZGVyIGZvciB7QGxpbmsgRHluYW1pY01lc3NhZ2V9cy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXI+IHsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3IgdHlwZTsKLSAgICBwcml2YXRlIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZmllbGRzOwotICAgIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHM7Ci0KLSAgICAvKiogQ29uc3RydWN0IGEge0Bjb2RlIEJ1aWxkZXJ9IGZvciB0aGUgZ2l2ZW4gdHlwZS4gKi8KLSAgICBwcml2YXRlIEJ1aWxkZXIoRGVzY3JpcHRvciB0eXBlKSB7Ci0gICAgICB0aGlzLnR5cGUgPSB0eXBlOwotICAgICAgdGhpcy5maWVsZHMgPSBGaWVsZFNldC5uZXdGaWVsZFNldCgpOwotICAgICAgdGhpcy51bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIEltcGxlbWVudGF0aW9uIG9mIE1lc3NhZ2UuQnVpbGRlciBpbnRlcmZhY2UuCi0KLSAgICBwdWJsaWMgQnVpbGRlciBjbGVhcigpIHsKLSAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJDYW5ub3QgY2FsbCBjbGVhcigpIGFmdGVyIGJ1aWxkKCkuIik7Ci0gICAgICB9Ci0gICAgICBmaWVsZHMuY2xlYXIoKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBpZiAob3RoZXIgaW5zdGFuY2VvZiBEeW5hbWljTWVzc2FnZSkgewotICAgICAgICAvLyBUaGlzIHNob3VsZCBiZSBzb21ld2hhdCBmYXN0ZXIgdGhhbiBjYWxsaW5nIHN1cGVyLm1lcmdlRnJvbSgpLgotICAgICAgICBEeW5hbWljTWVzc2FnZSBvdGhlckR5bmFtaWNNZXNzYWdlID0gKER5bmFtaWNNZXNzYWdlKSBvdGhlcjsKLSAgICAgICAgaWYgKG90aGVyRHluYW1pY01lc3NhZ2UudHlwZSAhPSB0eXBlKSB7Ci0gICAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAgICJtZXJnZUZyb20oTWVzc2FnZSkgY2FuIG9ubHkgbWVyZ2UgbWVzc2FnZXMgb2YgdGhlIHNhbWUgdHlwZS4iKTsKLSAgICAgICAgfQotICAgICAgICBmaWVsZHMubWVyZ2VGcm9tKG90aGVyRHluYW1pY01lc3NhZ2UuZmllbGRzKTsKLSAgICAgICAgbWVyZ2VVbmtub3duRmllbGRzKG90aGVyRHluYW1pY01lc3NhZ2UudW5rbm93bkZpZWxkcyk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLm1lcmdlRnJvbShvdGhlcik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIER5bmFtaWNNZXNzYWdlIGJ1aWxkKCkgewotICAgICAgLy8gSWYgZmllbGRzID09IG51bGwsIHdlJ2xsIHRocm93IGFuIGFwcHJvcHJpYXRlIGV4Y2VwdGlvbiBsYXRlci4KLSAgICAgIGlmIChmaWVsZHMgIT0gbnVsbCAmJiAhaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKAotICAgICAgICAgIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBmaWVsZHMsIHVua25vd25GaWVsZHMpKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBidWlsZFBhcnRpYWwoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBIZWxwZXIgZm9yIER5bmFtaWNNZXNzYWdlLnBhcnNlRnJvbSgpIG1ldGhvZHMgdG8gY2FsbC4gIFRocm93cwotICAgICAqIHtAbGluayBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259IGluc3RlYWQgb2YKLSAgICAgKiB7QGxpbmsgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHByaXZhdGUgRHluYW1pY01lc3NhZ2UgYnVpbGRQYXJzZWQoKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIGlmICghaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgIHRocm93IG5ld1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uKAotICAgICAgICAgICAgbmV3IER5bmFtaWNNZXNzYWdlKHR5cGUsIGZpZWxkcywgdW5rbm93bkZpZWxkcykpCi0gICAgICAgICAgLmFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gYnVpbGRQYXJ0aWFsKCk7Ci0gICAgfQotCi0gICAgcHVibGljIER5bmFtaWNNZXNzYWdlIGJ1aWxkUGFydGlhbCgpIHsKLSAgICAgIGlmIChmaWVsZHMgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKAotICAgICAgICAgICAgImJ1aWxkKCkgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgb24gdGhpcyBCdWlsZGVyLiIpOwotICAgICAgfQotICAgICAgZmllbGRzLm1ha2VJbW11dGFibGUoKTsKLSAgICAgIER5bmFtaWNNZXNzYWdlIHJlc3VsdCA9Ci0gICAgICAgIG5ldyBEeW5hbWljTWVzc2FnZSh0eXBlLCBmaWVsZHMsIHVua25vd25GaWVsZHMpOwotICAgICAgZmllbGRzID0gbnVsbDsKLSAgICAgIHVua25vd25GaWVsZHMgPSBudWxsOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKLSAgICAgIEJ1aWxkZXIgcmVzdWx0ID0gbmV3IEJ1aWxkZXIodHlwZSk7Ci0gICAgICByZXN1bHQuZmllbGRzLm1lcmdlRnJvbShmaWVsZHMpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIER5bmFtaWNNZXNzYWdlLmlzSW5pdGlhbGl6ZWQodHlwZSwgZmllbGRzKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiB0eXBlOwotICAgIH0KLQotICAgIHB1YmxpYyBEeW5hbWljTWVzc2FnZSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkgewotICAgICAgcmV0dXJuIGdldERlZmF1bHRJbnN0YW5jZSh0eXBlKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7Ci0gICAgICByZXR1cm4gZmllbGRzLmdldEFsbEZpZWxkcygpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLQotICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgIT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAibmV3QnVpbGRlckZvckZpZWxkIGlzIG9ubHkgdmFsaWQgZm9yIGZpZWxkcyB3aXRoIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLQotICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgICAgcmV0dXJuIGZpZWxkcy5oYXNGaWVsZChmaWVsZCk7Ci0gICAgfQotCi0gICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgIE9iamVjdCByZXN1bHQgPSBmaWVsZHMuZ2V0RmllbGQoZmllbGQpOwotICAgICAgaWYgKHJlc3VsdCA9PSBudWxsKSB7Ci0gICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgcmVzdWx0ID0gZ2V0RGVmYXVsdEluc3RhbmNlKGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdCA9IGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIHNldEZpZWxkKEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICBmaWVsZHMuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICBmaWVsZHMuY2xlYXJGaWVsZChmaWVsZCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgIHJldHVybiBmaWVsZHMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLCBpbnQgaW5kZXgpIHsKLSAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgIHJldHVybiBmaWVsZHMuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIHNldFJlcGVhdGVkRmllbGQoRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgIGZpZWxkcy5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSkgewotICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgICAgZmllbGRzLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKLSAgICAgIHJldHVybiB1bmtub3duRmllbGRzOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIHNldFVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHM7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZVVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKHRoaXMudW5rbm93bkZpZWxkcykKLSAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKQotICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgIHJldHVybiB0aGlzOwotICAgIH0KLQotICAgIC8qKiBWZXJpZmllcyB0aGF0IHRoZSBmaWVsZCBpcyBhIGZpZWxkIG9mIHRoaXMgbWVzc2FnZS4gKi8KLSAgICBwcml2YXRlIHZvaWQgdmVyaWZ5Q29udGFpbmluZ1R5cGUoRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSB0eXBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIkZpZWxkRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRXh0ZW5zaW9uUmVnaXN0cnkuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNGY2YmE5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjY2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSGFzaE1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIEEgdGFibGUgb2Yga25vd24gZXh0ZW5zaW9ucywgc2VhcmNoYWJsZSBieSBuYW1lIG9yIGZpZWxkIG51bWJlci4gIFdoZW4KLSAqIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIHRoYXQgbWlnaHQgaGF2ZSBleHRlbnNpb25zLCB5b3UgbXVzdCBwcm92aWRlCi0gKiBhbiB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnl9IGluIHdoaWNoIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYW55IGV4dGVuc2lvbnMKLSAqIHRoYXQgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBwYXJzZS4gIE90aGVyd2lzZSwgdGhvc2UgZXh0ZW5zaW9ucyB3aWxsIGp1c3QKLSAqIGJlIHRyZWF0ZWQgbGlrZSB1bmtub3duIGZpZWxkcy4KLSAqCi0gKiA8cD5Gb3IgZXhhbXBsZSwgaWYgeW91IGhhZCB0aGUge0Bjb2RlIC5wcm90b30gZmlsZToKLSAqCi0gKiA8cHJlPgotICogb3B0aW9uIGphdmFfY2xhc3MgPSAiTXlQcm90byI7Ci0gKgotICogbWVzc2FnZSBGb28gewotICogICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotICogfQotICoKLSAqIGV4dGVuZCBGb28gewotICogICBvcHRpb25hbCBpbnQzMiBiYXI7Ci0gKiB9Ci0gKiA8L3ByZT4KLSAqCi0gKiBUaGVuIHlvdSBtaWdodCB3cml0ZSBjb2RlIGxpa2U6Ci0gKgotICogPHByZT4KLSAqIEV4dGVuc2lvblJlZ2lzdHJ5IHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKLSAqIHJlZ2lzdHJ5LmFkZChNeVByb3RvLmJhcik7Ci0gKiBNeVByb3RvLkZvbyBtZXNzYWdlID0gTXlQcm90by5Gb28ucGFyc2VGcm9tKGlucHV0LCByZWdpc3RyeSk7Ci0gKiA8L3ByZT4KLSAqCi0gKiA8cD5CYWNrZ3JvdW5kOgotICoKLSAqIDxwPllvdSBtaWdodCB3b25kZXIgd2h5IHRoaXMgaXMgbmVjZXNzYXJ5LiAgVHdvIGFsdGVybmF0aXZlcyBtaWdodCBjb21lIHRvCi0gKiBtaW5kLiAgRmlyc3QsIHlvdSBtaWdodCBpbWFnaW5lIGEgc3lzdGVtIHdoZXJlIGdlbmVyYXRlZCBleHRlbnNpb25zIGFyZQotICogYXV0b21hdGljYWxseSByZWdpc3RlcmVkIHdoZW4gdGhlaXIgY29udGFpbmluZyBjbGFzc2VzIGFyZSBsb2FkZWQuICBUaGlzCi0gKiBpcyBhIHBvcHVsYXIgdGVjaG5pcXVlLCBidXQgaXMgYmFkIGRlc2lnbjsgYW1vbmcgb3RoZXIgdGhpbmdzLCBpdCBjcmVhdGVzIGEKLSAqIHNpdHVhdGlvbiB3aGVyZSBiZWhhdmlvciBjYW4gY2hhbmdlIGRlcGVuZGluZyBvbiB3aGF0IGNsYXNzZXMgaGFwcGVuIHRvIGJlCi0gKiBsb2FkZWQuICBJdCBhbHNvIGludHJvZHVjZXMgYSBzZWN1cml0eSB2dWxuZXJhYmlsaXR5LCBiZWNhdXNlIGFuCi0gKiB1bnByaXZpbGVnZWQgY2xhc3MgY291bGQgY2F1c2UgaXRzIGNvZGUgdG8gYmUgY2FsbGVkIHVuZXhwZWN0ZWRseSBmcm9tIGEKLSAqIHByaXZpbGVnZWQgY2xhc3MgYnkgcmVnaXN0ZXJpbmcgaXRzZWxmIGFzIGFuIGV4dGVuc2lvbiBvZiB0aGUgcmlnaHQgdHlwZS4KLSAqCi0gKiA8cD5Bbm90aGVyIG9wdGlvbiB5b3UgbWlnaHQgY29uc2lkZXIgaXMgbGF6eSBwYXJzaW5nOiBkbyBub3QgcGFyc2UgYW4KLSAqIGV4dGVuc2lvbiB1bnRpbCBpdCBpcyBmaXJzdCByZXF1ZXN0ZWQsIGF0IHdoaWNoIHBvaW50IHRoZSBjYWxsZXIgbXVzdAotICogcHJvdmlkZSBhIHR5cGUgdG8gdXNlLiAgVGhpcyBpbnRyb2R1Y2VzIGEgZGlmZmVyZW50IHNldCBvZiBwcm9ibGVtcy4gIEZpcnN0LAotICogaXQgd291bGQgcmVxdWlyZSBhIG11dGV4IGxvY2sgYW55IHRpbWUgYW4gZXh0ZW5zaW9uIHdhcyBhY2Nlc3NlZCwgd2hpY2gKLSAqIHdvdWxkIGJlIHNsb3cuICBTZWNvbmQsIGNvcnJ1cHQgZGF0YSB3b3VsZCBub3QgYmUgZGV0ZWN0ZWQgdW50aWwgZmlyc3QKLSAqIGFjY2VzcywgYXQgd2hpY2ggcG9pbnQgaXQgd291bGQgYmUgbXVjaCBoYXJkZXIgdG8gZGVhbCB3aXRoIGl0LiAgVGhpcmQsIGl0Ci0gKiBjb3VsZCB2aW9sYXRlIHRoZSBleHBlY3RhdGlvbiB0aGF0IG1lc3NhZ2Ugb2JqZWN0cyBhcmUgaW1tdXRhYmxlLCBzaW5jZSB0aGUKLSAqIHR5cGUgcHJvdmlkZWQgY291bGQgYmUgYW55IGFyYml0cmFyeSBtZXNzYWdlIGNsYXNzLiAgQW4gdW5wcml2aWxlZ2VkIHVzZXIKLSAqIGNvdWxkIHRha2UgYWR2YW50YWdlIG9mIHRoaXMgdG8gaW5qZWN0IGEgbXV0YWJsZSBvYmplY3QgaW50byBhIG1lc3NhZ2UKLSAqIGJlbG9uZ2luZyB0byBwcml2aWxlZ2VkIGNvZGUgYW5kIGNyZWF0ZSBtaXNjaGllZi4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5kcyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgewotICAvKiogQ29uc3RydWN0IGEgbmV3LCBlbXB0eSBpbnN0YW5jZS4gKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeSBuZXdJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0gIH0KLQotICAvKiogR2V0IHRoZSB1bm1vZGlmaWFibGUgc2luZ2xldG9uIGVtcHR5IGluc3RhbmNlLiAqLwotICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldEVtcHR5UmVnaXN0cnkoKSB7Ci0gICAgcmV0dXJuIEVNUFRZOwotICB9Ci0KLSAgLyoqIFJldHVybnMgYW4gdW5tb2RpZmlhYmxlIHZpZXcgb2YgdGhlIHJlZ2lzdHJ5LiAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIEV4dGVuc2lvblJlZ2lzdHJ5IGdldFVubW9kaWZpYWJsZSgpIHsKLSAgICByZXR1cm4gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KHRoaXMpOwotICB9Ci0KLSAgLyoqIEEgKERlc2NyaXB0b3IsIE1lc3NhZ2UpIHBhaXIsIHJldHVybmVkIGJ5IGxvb2t1cCBtZXRob2RzLiAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEV4dGVuc2lvbkluZm8gewotICAgIC8qKiBUaGUgZXh0ZW5zaW9uJ3MgZGVzY3JpcHRvci4gKi8KLSAgICBwdWJsaWMgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0KLSAgICAvKioKLSAgICAgKiBBIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIGV4dGVuc2lvbidzIHR5cGUsIGlmIGl0IGhhcyBhIG1lc3NhZ2UgdHlwZS4KLSAgICAgKiBPdGhlcndpc2UsIHtAY29kZSBudWxsfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2U7Ci0KLSAgICBwcml2YXRlIEV4dGVuc2lvbkluZm8oZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHsKLSAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICBkZWZhdWx0SW5zdGFuY2UgPSBudWxsOwotICAgIH0KLSAgICBwcml2YXRlIEV4dGVuc2lvbkluZm8oZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKSB7Ci0gICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgdGhpcy5kZWZhdWx0SW5zdGFuY2UgPSBkZWZhdWx0SW5zdGFuY2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmQgYW4gZXh0ZW5zaW9uIGJ5IGZ1bGx5LXF1YWxpZmllZCBmaWVsZCBuYW1lLCBpbiB0aGUgcHJvdG8gbmFtZXNwYWNlLgotICAgKiBJLmUuIHtAY29kZSByZXN1bHQuZGVzY3JpcHRvci5mdWxsTmFtZSgpfSB3aWxsIG1hdGNoIHtAY29kZSBmdWxsTmFtZX0gaWYKLSAgICogYSBtYXRjaCBpcyBmb3VuZC4KLSAgICoKLSAgICogQHJldHVybiBJbmZvcm1hdGlvbiBhYm91dCB0aGUgZXh0ZW5zaW9uIGlmIGZvdW5kLCBvciB7QGNvZGUgbnVsbH0KLSAgICogICAgICAgICBvdGhlcndpc2UuCi0gICAqLwotICBwdWJsaWMgRXh0ZW5zaW9uSW5mbyBmaW5kRXh0ZW5zaW9uQnlOYW1lKGZpbmFsIFN0cmluZyBmdWxsTmFtZSkgewotICAgIHJldHVybiBleHRlbnNpb25zQnlOYW1lLmdldChmdWxsTmFtZSk7Ci0gIH0KLQotICAvKioKLSAgICogRmluZCBhbiBleHRlbnNpb24gYnkgY29udGFpbmluZyB0eXBlIGFuZCBmaWVsZCBudW1iZXIuCi0gICAqCi0gICAqIEByZXR1cm4gSW5mb3JtYXRpb24gYWJvdXQgdGhlIGV4dGVuc2lvbiBpZiBmb3VuZCwgb3Ige0Bjb2RlIG51bGx9Ci0gICAqICAgICAgICAgb3RoZXJ3aXNlLgotICAgKi8KLSAgcHVibGljIEV4dGVuc2lvbkluZm8gZmluZEV4dGVuc2lvbkJ5TnVtYmVyKGZpbmFsIERlc2NyaXB0b3IgY29udGFpbmluZ1R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKLSAgICByZXR1cm4gZXh0ZW5zaW9uc0J5TnVtYmVyLmdldCgKLSAgICAgIG5ldyBEZXNjcmlwdG9ySW50UGFpcihjb250YWluaW5nVHlwZSwgZmllbGROdW1iZXIpKTsKLSAgfQotCi0gIC8qKiBBZGQgYW4gZXh0ZW5zaW9uIGZyb20gYSBnZW5lcmF0ZWQgZmlsZSB0byB0aGUgcmVnaXN0cnkuICovCi0gIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjw/LCA/PiBleHRlbnNpb24pIHsKLSAgICBpZiAoZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRKYXZhVHlwZSgpID09Ci0gICAgICAgIEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICBpZiAoZXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKSA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAiUmVnaXN0ZXJlZCBtZXNzYWdlLXR5cGUgZXh0ZW5zaW9uIGhhZCBudWxsIGRlZmF1bHQgaW5zdGFuY2U6ICIgKwotICAgICAgICAgICAgZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRGdWxsTmFtZSgpKTsKLSAgICAgIH0KLSAgICAgIGFkZChuZXcgRXh0ZW5zaW9uSW5mbyhleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkpKTsKLSAgICB9IGVsc2UgewotICAgICAgYWRkKG5ldyBFeHRlbnNpb25JbmZvKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCksIG51bGwpKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQWRkIGEgbm9uLW1lc3NhZ2UtdHlwZSBleHRlbnNpb24gdG8gdGhlIHJlZ2lzdHJ5IGJ5IGRlc2NyaXB0b3IuICovCi0gIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgdHlwZSkgewotICAgIGlmICh0eXBlLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSBtdXN0IGJlIHByb3ZpZGVkIGEgZGVmYXVsdCBpbnN0YW5jZSB3aGVuICIgKwotICAgICAgICAiYWRkaW5nIGFuIGVtYmVkZGVkIG1lc3NhZ2UgZXh0ZW5zaW9uLiIpOwotICAgIH0KLSAgICBhZGQobmV3IEV4dGVuc2lvbkluZm8odHlwZSwgbnVsbCkpOwotICB9Ci0KLSAgLyoqIEFkZCBhIG1lc3NhZ2UtdHlwZSBleHRlbnNpb24gdG8gdGhlIHJlZ2lzdHJ5IGJ5IGRlc2NyaXB0b3IuICovCi0gIHB1YmxpYyB2b2lkIGFkZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgdHlwZSwgZmluYWwgTWVzc2FnZSBkZWZhdWx0SW5zdGFuY2UpIHsKLSAgICBpZiAodHlwZS5nZXRKYXZhVHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiRXh0ZW5zaW9uUmVnaXN0cnkuYWRkKCkgcHJvdmlkZWQgYSBkZWZhdWx0IGluc3RhbmNlIGZvciBhICIgKwotICAgICAgICAibm9uLW1lc3NhZ2UgZXh0ZW5zaW9uLiIpOwotICAgIH0KLSAgICBhZGQobmV3IEV4dGVuc2lvbkluZm8odHlwZSwgZGVmYXVsdEluc3RhbmNlKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBQcml2YXRlIHN0dWZmLgotCi0gIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkoKSB7Ci0gICAgdGhpcy5leHRlbnNpb25zQnlOYW1lID0gbmV3IEhhc2hNYXA8U3RyaW5nLCBFeHRlbnNpb25JbmZvPigpOwotICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0gbmV3IEhhc2hNYXA8RGVzY3JpcHRvckludFBhaXIsIEV4dGVuc2lvbkluZm8+KCk7Ci0gIH0KLQotICBwcml2YXRlIEV4dGVuc2lvblJlZ2lzdHJ5KEV4dGVuc2lvblJlZ2lzdHJ5IG90aGVyKSB7Ci0gICAgc3VwZXIob3RoZXIpOwotICAgIHRoaXMuZXh0ZW5zaW9uc0J5TmFtZSA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdGhlci5leHRlbnNpb25zQnlOYW1lKTsKLSAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9Ci0gICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdGhlci5leHRlbnNpb25zQnlOdW1iZXIpOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBNYXA8U3RyaW5nLCBFeHRlbnNpb25JbmZvPiBleHRlbnNpb25zQnlOYW1lOwotICBwcml2YXRlIGZpbmFsIE1hcDxEZXNjcmlwdG9ySW50UGFpciwgRXh0ZW5zaW9uSW5mbz4gZXh0ZW5zaW9uc0J5TnVtYmVyOwotCi0gIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkoYm9vbGVhbiBlbXB0eSkgewotICAgIHN1cGVyKEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOwotICAgIHRoaXMuZXh0ZW5zaW9uc0J5TmFtZSA9IENvbGxlY3Rpb25zLjxTdHJpbmcsIEV4dGVuc2lvbkluZm8+ZW1wdHlNYXAoKTsKLSAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9Ci0gICAgICAgIENvbGxlY3Rpb25zLjxEZXNjcmlwdG9ySW50UGFpciwgRXh0ZW5zaW9uSW5mbz5lbXB0eU1hcCgpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IEVNUFRZID0gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5KHRydWUpOwotCi0gIHByaXZhdGUgdm9pZCBhZGQoZmluYWwgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24pIHsKLSAgICBpZiAoIWV4dGVuc2lvbi5kZXNjcmlwdG9yLmlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJFeHRlbnNpb25SZWdpc3RyeS5hZGQoKSB3YXMgZ2l2ZW4gYSBGaWVsZERlc2NyaXB0b3IgZm9yIGEgcmVndWxhciAiICsKLSAgICAgICAgIihub24tZXh0ZW5zaW9uKSBmaWVsZC4iKTsKLSAgICB9Ci0KLSAgICBleHRlbnNpb25zQnlOYW1lLnB1dChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpLCBleHRlbnNpb24pOwotICAgIGV4dGVuc2lvbnNCeU51bWJlci5wdXQoCi0gICAgICBuZXcgRGVzY3JpcHRvckludFBhaXIoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0Q29udGFpbmluZ1R5cGUoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXROdW1iZXIoKSksCi0gICAgICBleHRlbnNpb24pOwotCi0gICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkID0gZXh0ZW5zaW9uLmRlc2NyaXB0b3I7Ci0gICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkuZ2V0T3B0aW9ucygpLmdldE1lc3NhZ2VTZXRXaXJlRm9ybWF0KCkgJiYKLSAgICAgICAgZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgZmllbGQuaXNPcHRpb25hbCgpICYmCi0gICAgICAgIGZpZWxkLmdldEV4dGVuc2lvblNjb3BlKCkgPT0gZmllbGQuZ2V0TWVzc2FnZVR5cGUoKSkgewotICAgICAgLy8gVGhpcyBpcyBhbiBleHRlbnNpb24gb2YgYSBNZXNzYWdlU2V0IHR5cGUgZGVmaW5lZCB3aXRoaW4gdGhlIGV4dGVuc2lvbgotICAgICAgLy8gdHlwZSdzIG93biBzY29wZS4gIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSwgYWxsb3cgaXQgdG8gYmUgbG9va2VkCi0gICAgICAvLyB1cCBieSB0eXBlIG5hbWUuCi0gICAgICBleHRlbnNpb25zQnlOYW1lLnB1dChmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldEZ1bGxOYW1lKCksIGV4dGVuc2lvbik7Ci0gICAgfQotICB9Ci0KLSAgLyoqIEEgKEdlbmVyaWNEZXNjcmlwdG9yLCBpbnQpIHBhaXIsIHVzZWQgYXMgYSBtYXAga2V5LiAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBEZXNjcmlwdG9ySW50UGFpciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3I7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyOwotCi0gICAgRGVzY3JpcHRvckludFBhaXIoZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICB0aGlzLmRlc2NyaXB0b3IgPSBkZXNjcmlwdG9yOwotICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yLmhhc2hDb2RlKCkgKiAoKDEgPDwgMTYpIC0gMSkgKyBudW1iZXI7Ci0gICAgfQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb2JqKSB7Ci0gICAgICBpZiAoIShvYmogaW5zdGFuY2VvZiBEZXNjcmlwdG9ySW50UGFpcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZmluYWwgRGVzY3JpcHRvckludFBhaXIgb3RoZXIgPSAoRGVzY3JpcHRvckludFBhaXIpb2JqOwotICAgICAgcmV0dXJuIGRlc2NyaXB0b3IgPT0gb3RoZXIuZGVzY3JpcHRvciAmJiBudW1iZXIgPT0gb3RoZXIubnVtYmVyOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0V4dGVuc2lvblJlZ2lzdHJ5TGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBkNTI4OGRkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9FeHRlbnNpb25SZWdpc3RyeUxpdGUuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE2OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkhhc2hNYXA7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBFcXVpdmFsZW50IHRvIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeX0gYnV0IHN1cHBvcnRzIG9ubHkgImxpdGUiIHR5cGVzLgotICogPHA+Ci0gKiBJZiBhbGwgb2YgeW91ciB0eXBlcyBhcmUgbGl0ZSB0eXBlcywgdGhlbiB5b3Ugb25seSBuZWVkIHRvIHVzZQotICoge0Bjb2RlIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZX0uICBTaW1pbGFybHksIGlmIGFsbCB5b3VyIHR5cGVzIGFyZSByZWd1bGFyCi0gKiB0eXBlcywgdGhlbiB5b3Ugb25seSBuZWVkIHtAbGluayBFeHRlbnNpb25SZWdpc3RyeX0uICBUeXBpY2FsbHkgaXQgZG9lcyBub3QKLSAqIG1ha2Ugc2Vuc2UgdG8gbWl4IHRoZSB0d28sIHNpbmNlIGlmIHlvdSBoYXZlIGFueSByZWd1bGFyIHR5cGVzIGluIHlvdXIKLSAqIHByb2dyYW0sIHlvdSB0aGVuIHJlcXVpcmUgdGhlIGZ1bGwgcnVudGltZSBhbmQgbG9zZSBhbGwgdGhlIGJlbmVmaXRzIG9mCi0gKiB0aGUgbGl0ZSBydW50aW1lLCBzbyB5b3UgbWlnaHQgYXMgd2VsbCBtYWtlIGFsbCB5b3VyIHR5cGVzIGJlIHJlZ3VsYXIgdHlwZXMuCi0gKiBIb3dldmVyLCBpbiBzb21lIGNhc2VzIChlLmcuIHdoZW4gZGVwZW5kaW5nIG9uIG11bHRpcGxlIHRoaXJkLXBhdHJ5IGxpYnJhcmllcwotICogd2hlcmUgb25lIHVzZXMgbGl0ZSB0eXBlcyBhbmQgb25lIHVzZXMgcmVndWxhciksIHlvdSBtYXkgZmluZCB5b3Vyc2VsZgotICogd2FudGluZyB0byBtaXggdGhlIHR3by4gIEluIHRoaXMgY2FzZSB0aGluZ3MgZ2V0IG1vcmUgY29tcGxpY2F0ZWQuCi0gKiA8cD4KLSAqIFRoZXJlIGFyZSB0aHJlZSBmYWN0b3JzIHRvIGNvbnNpZGVyOiAgV2hldGhlciB0aGUgdHlwZSBiZWluZyBleHRlbmRlZCBpcwotICogbGl0ZSwgd2hldGhlciB0aGUgZW1iZWRkZWQgdHlwZSAoaW4gdGhlIGNhc2Ugb2YgYSBtZXNzYWdlLXR5cGVkIGV4dGVuc2lvbikKLSAqIGlzIGxpdGUsIGFuZCB3aGV0aGVyIHRoZSBleHRlbnNpb24gaXRzZWxmIGlzIGxpdGUuICBTaW5jZSBhbGwgdGhyZWUgYXJlCi0gKiBkZWNsYXJlZCBpbiBkaWZmZXJlbnQgZmlsZXMsIHRoZXkgY291bGQgYWxsIGJlIGRpZmZlcmVudC4gIEhlcmUgYXJlIGFsbAotICogdGhlIGNvbWJpbmF0aW9ucyBhbmQgd2hpY2ggdHlwZSBvZiByZWdpc3RyeSB0byB1c2U6Ci0gKiA8cHJlPgotICogICBFeHRlbmRlZCB0eXBlICAgICBJbm5lciB0eXBlICAgIEV4dGVuc2lvbiAgICAgICAgIFVzZSByZWdpc3RyeQotICogICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICogICBsaXRlICAgICAgICAgICAgICBsaXRlICAgICAgICAgIGxpdGUgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZQotICogICBsaXRlICAgICAgICAgICAgICByZWd1bGFyICAgICAgIGxpdGUgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5Ci0gKiAgIHJlZ3VsYXIgICAgICAgICAgIHJlZ3VsYXIgICAgICAgcmVndWxhciAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkKLSAqICAgYWxsIG90aGVyIGNvbWJpbmF0aW9ucyAgICAgICAgICAgICAgICAgICAgICAgICAgICBub3Qgc3VwcG9ydGVkCi0gKiA8L3ByZT4KLSAqIDxwPgotICogTm90ZSB0aGF0IGp1c3QgYXMgcmVndWxhciB0eXBlcyBhcmUgbm90IGFsbG93ZWQgdG8gY29udGFpbiBsaXRlLXR5cGUgZmllbGRzLAotICogdGhleSBhcmUgYWxzbyBub3QgYWxsb3dlZCB0byBjb250YWluIGxpdGUtdHlwZSBleHRlbnNpb25zLiAgVGhpcyBpcyBiZWNhdXNlCi0gKiByZWd1bGFyIHR5cGVzIG11c3QgYmUgZnVsbHkgYWNjZXNzaWJsZSB2aWEgcmVmbGVjdGlvbiwgd2hpY2ggaW4gdHVybiBtZWFucwotICogdGhhdCBhbGwgdGhlIGlubmVyIG1lc3NhZ2VzIG11c3QgYWxzbyBzdXBwb3J0IHJlZmxlY3Rpb24uICBPbiB0aGUgb3RoZXIgaGFuZCwKLSAqIHNpbmNlIHJlZ3VsYXIgdHlwZXMgaW1wbGVtZW50IHRoZSBlbnRpcmUgbGl0ZSBpbnRlcmZhY2UsIHRoZXJlIGlzIG5vIHByb2JsZW0KLSAqIHdpdGggZW1iZWRkaW5nIHJlZ3VsYXIgdHlwZXMgaW5zaWRlIGxpdGUgdHlwZXMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSB7Ci0gIC8qKiBDb25zdHJ1Y3QgYSBuZXcsIGVtcHR5IGluc3RhbmNlLiAqLwotICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBuZXdJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gbmV3IEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpOwotICB9Ci0KLSAgLyoqIEdldCB0aGUgdW5tb2RpZmlhYmxlIHNpbmdsZXRvbiBlbXB0eSBpbnN0YW5jZS4gKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZ2V0RW1wdHlSZWdpc3RyeSgpIHsKLSAgICByZXR1cm4gRU1QVFk7Ci0gIH0KLQotICAvKiogUmV0dXJucyBhbiB1bm1vZGlmaWFibGUgdmlldyBvZiB0aGUgcmVnaXN0cnkuICovCi0gIHB1YmxpYyBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZ2V0VW5tb2RpZmlhYmxlKCkgewotICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEZpbmQgYW4gZXh0ZW5zaW9uIGJ5IGNvbnRhaW5pbmcgdHlwZSBhbmQgZmllbGQgbnVtYmVyLgotICAgKgotICAgKiBAcmV0dXJuIEluZm9ybWF0aW9uIGFib3V0IHRoZSBleHRlbnNpb24gaWYgZm91bmQsIG9yIHtAY29kZSBudWxsfQotICAgKiAgICAgICAgIG90aGVyd2lzZS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgPENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZUxpdGU+Ci0gICAgICBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsID8+Ci0gICAgICAgIGZpbmRMaXRlRXh0ZW5zaW9uQnlOdW1iZXIoCi0gICAgICAgICAgZmluYWwgQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgICAgZmluYWwgaW50IGZpZWxkTnVtYmVyKSB7Ci0gICAgcmV0dXJuIChHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsID8+KQotICAgICAgZXh0ZW5zaW9uc0J5TnVtYmVyLmdldCgKLSAgICAgICAgbmV3IE9iamVjdEludFBhaXIoY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsIGZpZWxkTnVtYmVyKSk7Ci0gIH0KLQotICAvKiogQWRkIGFuIGV4dGVuc2lvbiBmcm9tIGEgbGl0ZSBnZW5lcmF0ZWQgZmlsZSB0byB0aGUgcmVnaXN0cnkuICovCi0gIHB1YmxpYyBmaW5hbCB2b2lkIGFkZCgKLSAgICAgIGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLkdlbmVyYXRlZEV4dGVuc2lvbjw/LCA/PiBleHRlbnNpb24pIHsKLSAgICBleHRlbnNpb25zQnlOdW1iZXIucHV0KAotICAgICAgbmV3IE9iamVjdEludFBhaXIoZXh0ZW5zaW9uLmdldENvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0TnVtYmVyKCkpLAotICAgICAgZXh0ZW5zaW9uKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFByaXZhdGUgc3R1ZmYuCi0KLSAgLy8gQ29uc3RydWN0b3JzIGFyZSBwYWNrYWdlLXByaXZhdGUgc28gdGhhdCBFeHRlbnNpb25SZWdpc3RyeSBjYW4gc3ViY2xhc3MKLSAgLy8gdGhpcy4KLQotICBFeHRlbnNpb25SZWdpc3RyeUxpdGUoKSB7Ci0gICAgdGhpcy5leHRlbnNpb25zQnlOdW1iZXIgPQotICAgICAgICBuZXcgSGFzaE1hcDxPYmplY3RJbnRQYWlyLAotICAgICAgICAgICAgICAgICAgICBHZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248PywgPz4+KCk7Ci0gIH0KLQotICBFeHRlbnNpb25SZWdpc3RyeUxpdGUoRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIG90aGVyKSB7Ci0gICAgaWYgKG90aGVyID09IEVNUFRZKSB7Ci0gICAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9uc0J5TnVtYmVyID0KLSAgICAgICAgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKG90aGVyLmV4dGVuc2lvbnNCeU51bWJlcik7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBNYXA8T2JqZWN0SW50UGFpciwKLSAgICAgICAgICAgICAgICAgICAgR2VuZXJhdGVkTWVzc2FnZUxpdGUuR2VuZXJhdGVkRXh0ZW5zaW9uPD8sID8+PgotICAgICAgZXh0ZW5zaW9uc0J5TnVtYmVyOwotCi0gIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKGJvb2xlYW4gZW1wdHkpIHsKLSAgICB0aGlzLmV4dGVuc2lvbnNCeU51bWJlciA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIEVNUFRZID0KLSAgICBuZXcgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlKHRydWUpOwotCi0gIC8qKiBBIChPYmplY3QsIGludCkgcGFpciwgdXNlZCBhcyBhIG1hcCBrZXkuICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIE9iamVjdEludFBhaXIgewotICAgIHByaXZhdGUgZmluYWwgT2JqZWN0IG9iamVjdDsKLSAgICBwcml2YXRlIGZpbmFsIGludCBudW1iZXI7Ci0KLSAgICBPYmplY3RJbnRQYWlyKGZpbmFsIE9iamVjdCBvYmplY3QsIGZpbmFsIGludCBudW1iZXIpIHsKLSAgICAgIHRoaXMub2JqZWN0ID0gb2JqZWN0OwotICAgICAgdGhpcy5udW1iZXIgPSBudW1iZXI7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICAgIHJldHVybiBTeXN0ZW0uaWRlbnRpdHlIYXNoQ29kZShvYmplY3QpICogKCgxIDw8IDE2KSAtIDEpICsgbnVtYmVyOwotICAgIH0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgT2JqZWN0IG9iaikgewotICAgICAgaWYgKCEob2JqIGluc3RhbmNlb2YgT2JqZWN0SW50UGFpcikpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZmluYWwgT2JqZWN0SW50UGFpciBvdGhlciA9IChPYmplY3RJbnRQYWlyKW9iajsKLSAgICAgIHJldHVybiBvYmplY3QgPT0gb3RoZXIub2JqZWN0ICYmIG51bWJlciA9PSBvdGhlci5udW1iZXI7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRmllbGRTZXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GaWVsZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhODVkYmFhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9GaWVsZFNldC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzg4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogQSBjbGFzcyB3aGljaCByZXByZXNlbnRzIGFuIGFyYml0cmFyeSBzZXQgb2YgZmllbGRzIG9mIHNvbWUgbWVzc2FnZSB0eXBlLgotICogVGhpcyBpcyB1c2VkIHRvIGltcGxlbWVudCB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LCBhbmQgYWxzbyB0byByZXByZXNlbnQKLSAqIGV4dGVuc2lvbnMgaW4ge0BsaW5rIEdlbmVyYXRlZE1lc3NhZ2V9LiAgVGhpcyBjbGFzcyBpcyBwYWNrYWdlLXByaXZhdGUsCi0gKiBzaW5jZSBvdXRzaWRlIHVzZXJzIHNob3VsZCBwcm9iYWJseSBiZSB1c2luZyB7QGxpbmsgRHluYW1pY01lc3NhZ2V9LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLWZpbmFsIGNsYXNzIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGUgZXh0ZW5kcwotICAgICAgRmllbGRTZXQuRmllbGREZXNjcmlwdG9yTGl0ZTxGaWVsZERlc2NyaXB0b3JUeXBlPj4gewotICAvKioKLSAgICogSW50ZXJmYWNlIGZvciBhIEZpZWxkRGVzY3JpcHRvciBvciBsaXRlIGV4dGVuc2lvbiBkZXNjcmlwdG9yLiAgVGhpcwotICAgKiBwcmV2ZW50cyBGaWVsZFNldCBmcm9tIGRlcGVuZGluZyBvbiB7QGxpbmsgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yfS4KLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgRmllbGREZXNjcmlwdG9yTGl0ZTxUIGV4dGVuZHMgRmllbGREZXNjcmlwdG9yTGl0ZTxUPj4KLSAgICAgIGV4dGVuZHMgQ29tcGFyYWJsZTxUPiB7Ci0gICAgaW50IGdldE51bWJlcigpOwotICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCk7Ci0gICAgV2lyZUZvcm1hdC5KYXZhVHlwZSBnZXRMaXRlSmF2YVR5cGUoKTsKLSAgICBib29sZWFuIGlzUmVwZWF0ZWQoKTsKLSAgICBib29sZWFuIGlzUGFja2VkKCk7Ci0gICAgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZ2V0RW51bVR5cGUoKTsKLQotICAgIC8vIElmIGdldExpdGVKYXZhVHlwZSgpID09IE1FU1NBR0UsIHRoaXMgbWVyZ2VzIGEgbWVzc2FnZSBvYmplY3Qgb2YgdGhlCi0gICAgLy8gdHlwZSBpbnRvIGEgYnVpbGRlciBvZiB0aGUgdHlwZS4gIFJldHVybnMge0Bjb2RlIHRvfS4KLSAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIGludGVybmFsTWVyZ2VGcm9tKAotICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIHRvLCBNZXNzYWdlTGl0ZSBmcm9tKTsKLSAgfQotCi0gIHByaXZhdGUgZmluYWwgU21hbGxTb3J0ZWRNYXA8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBmaWVsZHM7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0ltbXV0YWJsZTsKLQotICAvKiogQ29uc3RydWN0IGEgbmV3IEZpZWxkU2V0LiAqLwotICBwcml2YXRlIEZpZWxkU2V0KCkgewotICAgIHRoaXMuZmllbGRzID0gU21hbGxTb3J0ZWRNYXAubmV3RmllbGRNYXAoMTYpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdCBhbiBlbXB0eSBGaWVsZFNldC4gIFRoaXMgaXMgb25seSB1c2VkIHRvIGluaXRpYWxpemUKLSAgICogREVGQVVMVF9JTlNUQU5DRS4KLSAgICovCi0gIHByaXZhdGUgRmllbGRTZXQoZmluYWwgYm9vbGVhbiBkdW1teSkgewotICAgIHRoaXMuZmllbGRzID0gU21hbGxTb3J0ZWRNYXAubmV3RmllbGRNYXAoMCk7Ci0gICAgbWFrZUltbXV0YWJsZSgpOwotICB9Ci0KLSAgLyoqIENvbnN0cnVjdCBhIG5ldyBGaWVsZFNldC4gKi8KLSAgcHVibGljIHN0YXRpYyA8VCBleHRlbmRzIEZpZWxkU2V0LkZpZWxkRGVzY3JpcHRvckxpdGU8VD4+Ci0gICAgICBGaWVsZFNldDxUPiBuZXdGaWVsZFNldCgpIHsKLSAgICByZXR1cm4gbmV3IEZpZWxkU2V0PFQ+KCk7Ci0gIH0KLQotICAvKiogR2V0IGFuIGltbXV0YWJsZSBlbXB0eSBGaWVsZFNldC4gKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBGaWVsZFNldC5GaWVsZERlc2NyaXB0b3JMaXRlPFQ+PgotICAgICAgRmllbGRTZXQ8VD4gZW1wdHlTZXQoKSB7Ci0gICAgcmV0dXJuIERFRkFVTFRfSU5TVEFOQ0U7Ci0gIH0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIEZpZWxkU2V0IERFRkFVTFRfSU5TVEFOQ0UgPSBuZXcgRmllbGRTZXQodHJ1ZSk7Ci0KLSAgLyoqIE1ha2UgdGhpcyBGaWVsZFNldCBpbW11dGFibGUgZnJvbSB0aGlzIHBvaW50IGZvcndhcmQuICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgdm9pZCBtYWtlSW1tdXRhYmxlKCkgewotICAgIGlmIChpc0ltbXV0YWJsZSkgewotICAgICAgcmV0dXJuOwotICAgIH0KLSAgICBmaWVsZHMubWFrZUltbXV0YWJsZSgpOwotICAgIGlzSW1tdXRhYmxlID0gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBSZXR1bnMgd2hldGhlciB0aGUgRmllbGRTZXQgaXMgaW1tdXRhYmxlLiBUaGlzIGlzIHRydWUgaWYgaXQgaXMgdGhlCi0gICAqIHtAbGluayAjZW1wdHlTZXR9IG9yIGlmIHtAbGluayAjbWFrZUltbXV0YWJsZX0gd2VyZSBjYWxsZWQuCi0gICAqCi0gICAqIEByZXR1cm4gd2hldGhlciB0aGUgRmllbGRTZXQgaXMgaW1tdXRhYmxlLgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKSB7Ci0gICAgcmV0dXJuIGlzSW1tdXRhYmxlOwotICB9Ci0KLSAgLyoqCi0gICAqIENsb25lcyB0aGUgRmllbGRTZXQuIFRoZSByZXR1cm5lZCBGaWVsZFNldCB3aWxsIGJlIG11dGFibGUgZXZlbiBpZiB0aGUKLSAgICogb3JpZ2luYWwgRmllbGRTZXQgd2FzIGltbXV0YWJsZS4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbmV3bHkgY2xvbmVkIEZpZWxkU2V0Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGU+IGNsb25lKCkgewotICAgIC8vIFdlIGNhbid0IGp1c3QgY2FsbCBmaWVsZHMuY2xvbmUgYmVjYXVzZSBMaXN0IG9iamVjdHMgaW4gdGhlIG1hcAotICAgIC8vIHNob3VsZCBub3QgYmUgc2hhcmVkLgotICAgIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvclR5cGU+IGNsb25lID0gRmllbGRTZXQubmV3RmllbGRTZXQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7Ci0gICAgICBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA9IGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSk7Ci0gICAgICBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgIGNsb25lLnNldEZpZWxkKGRlc2NyaXB0b3IsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKLSAgICAgIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciA9IGVudHJ5LmdldEtleSgpOwotICAgICAgY2xvbmUuc2V0RmllbGQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBjbG9uZTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIFNlZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2NsZWFyKCl9LiAqLwotICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICBmaWVsZHMuY2xlYXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBzaW1wbGUgbWFwIGNvbnRhaW5pbmcgYWxsIHRoZSBmaWVsZHMuCi0gICAqLwotICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgIHJldHVybiBmaWVsZHMuaXNJbW11dGFibGUoKSA/IGZpZWxkcyA6IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmaWVsZHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhbiBpdGVyYXRvciB0byB0aGUgZmllbGQgbWFwLiBUaGlzIGl0ZXJhdG9yIHNob3VsZCBub3QgYmUgbGVha2VkIG91dAotICAgKiBvZiB0aGUgcHJvdG9idWYgbGlicmFyeSBhcyBpdCBpcyBub3QgcHJvdGVjdGVkIGZyb20gbXV0YXRpb24gd2hlbgotICAgKiBmaWVsZHMgaXMgbm90IGltbXV0YWJsZS4KLSAgICovCi0gIHB1YmxpYyBJdGVyYXRvcjxNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0Pj4gaXRlcmF0b3IoKSB7Ci0gICAgcmV0dXJuIGZpZWxkcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLSAgICoge0BsaW5rIE1lc3NhZ2UjaGFzRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uCi0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IpIHsKLSAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJoYXNGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiBub24tcmVwZWF0ZWQgZmllbGRzLiIpOwotICAgIH0KLQotICAgIHJldHVybiBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpICE9IG51bGw7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLSAgICoge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uICBUaGlzIG1ldGhvZAotICAgKiByZXR1cm5zIHtAY29kZSBudWxsfSBpZiB0aGUgZmllbGQgaXMgbm90IHNldDsgaW4gdGhpcyBjYXNlIGl0IGlzIHVwCi0gICAqIHRvIHRoZSBjYWxsZXIgdG8gZmV0Y2ggdGhlIGZpZWxkJ3MgZGVmYXVsdCB2YWx1ZS4KLSAgICovCi0gIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yKSB7Ci0gICAgcmV0dXJuIGZpZWxkcy5nZXQoZGVzY3JpcHRvcik7Ci0gIH0KLQotICAvKioKLSAgICogVXNlZnVsIGZvciBpbXBsZW1lbnRpbmcKLSAgICoge0BsaW5rIE1lc3NhZ2UuQnVpbGRlciNzZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsT2JqZWN0KX0uCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIHZvaWQgc2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBPYmplY3QgdmFsdWUpIHsKLSAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIGlmICghKHZhbHVlIGluc3RhbmNlb2YgTGlzdCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiV3Jvbmcgb2JqZWN0IHR5cGUgdXNlZCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcmVmbGVjdGlvbi4iKTsKLSAgICAgIH0KLQotICAgICAgLy8gV3JhcCB0aGUgY29udGVudHMgaW4gYSBuZXcgbGlzdCBzbyB0aGF0IHRoZSBjYWxsZXIgY2Fubm90IGNoYW5nZQotICAgICAgLy8gdGhlIGxpc3QncyBjb250ZW50cyBhZnRlciBzZXR0aW5nIGl0LgotICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgbmV3TGlzdC5hZGRBbGwoKExpc3QpdmFsdWUpOwotICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IG5ld0xpc3QpIHsKLSAgICAgICAgdmVyaWZ5VHlwZShkZXNjcmlwdG9yLmdldExpdGVUeXBlKCksIGVsZW1lbnQpOwotICAgICAgfQotICAgICAgdmFsdWUgPSBuZXdMaXN0OwotICAgIH0gZWxzZSB7Ci0gICAgICB2ZXJpZnlUeXBlKGRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwgdmFsdWUpOwotICAgIH0KLQotICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgdmFsdWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi0gICAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjY2xlYXJGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yKSB7Ci0gICAgZmllbGRzLnJlbW92ZShkZXNjcmlwdG9yKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZwotICAgKiB7QGxpbmsgTWVzc2FnZSNnZXRSZXBlYXRlZEZpZWxkQ291bnQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0uCi0gICAqLwotICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IpIHsKLSAgICBpZiAoIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbiBvbmx5IGJlIGNhbGxlZCBvbiByZXBlYXRlZCBmaWVsZHMuIik7Ci0gICAgfQotCi0gICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZmllbGRzLmdldChkZXNjcmlwdG9yKTsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgcmV0dXJuIDA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoKExpc3Q8Pz4pIHZhbHVlKS5zaXplKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFVzZWZ1bCBmb3IgaW1wbGVtZW50aW5nCi0gICAqIHtAbGluayBNZXNzYWdlI2dldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLGludCl9LgotICAgKi8KLSAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCkgewotICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJnZXRSZXBlYXRlZEZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsKLSAgICB9Ci0KLSAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOwotCi0gICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBJbmRleE91dE9mQm91bmRzRXhjZXB0aW9uKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoKExpc3Q8Pz4pIHZhbHVlKS5nZXQoaW5kZXgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZwotICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI3NldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLGludCxPYmplY3QpfS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvclR5cGUgZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgaWYgKCFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgImdldFJlcGVhdGVkRmllbGQoKSBjYW4gb25seSBiZSBjYWxsZWQgb24gcmVwZWF0ZWQgZmllbGRzLiIpOwotICAgIH0KLQotICAgIGZpbmFsIE9iamVjdCBsaXN0ID0gZmllbGRzLmdldChkZXNjcmlwdG9yKTsKLSAgICBpZiAobGlzdCA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbigpOwotICAgIH0KLQotICAgIHZlcmlmeVR5cGUoZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpLCB2YWx1ZSk7Ci0gICAgKChMaXN0KSBsaXN0KS5zZXQoaW5kZXgsIHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBVc2VmdWwgZm9yIGltcGxlbWVudGluZwotICAgKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2FkZFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLE9iamVjdCl9LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyB2b2lkIGFkZFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgIGlmICghZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICJhZGRSZXBlYXRlZEZpZWxkKCkgY2FuIG9ubHkgYmUgY2FsbGVkIG9uIHJlcGVhdGVkIGZpZWxkcy4iKTsKLSAgICB9Ci0KLSAgICB2ZXJpZnlUeXBlKGRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwgdmFsdWUpOwotCi0gICAgZmluYWwgT2JqZWN0IGV4aXN0aW5nVmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOwotICAgIExpc3QgbGlzdDsKLSAgICBpZiAoZXhpc3RpbmdWYWx1ZSA9PSBudWxsKSB7Ci0gICAgICBsaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCBsaXN0KTsKLSAgICB9IGVsc2UgewotICAgICAgbGlzdCA9IChMaXN0KSBleGlzdGluZ1ZhbHVlOwotICAgIH0KLQotICAgIGxpc3QuYWRkKHZhbHVlKTsKLSAgfQotCi0gIC8qKgotICAgKiBWZXJpZmllcyB0aGF0IHRoZSBnaXZlbiBvYmplY3QgaXMgb2YgdGhlIGNvcnJlY3QgdHlwZSB0byBiZSBhIHZhbGlkCi0gICAqIHZhbHVlIGZvciB0aGUgZ2l2ZW4gZmllbGQuICAoRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhpcyBjaGVja3MgaWYgdGhlCi0gICAqIG9iamVjdCBpcyB0aGUgcmlnaHQgdHlwZSB0byBiZSBvbmUgZWxlbWVudCBvZiB0aGUgZmllbGQuKQotICAgKgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgdmFsdWUgaXMgbm90IG9mIHRoZSByaWdodCB0eXBlLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCB2ZXJpZnlUeXBlKGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBpc1ZhbGlkID0gZmFsc2U7Ci0gICAgc3dpdGNoICh0eXBlLmdldEphdmFUeXBlKCkpIHsKLSAgICAgIGNhc2UgSU5UOiAgICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBJbnRlZ2VyICAgOyBicmVhazsKLSAgICAgIGNhc2UgTE9ORzogICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBMb25nICAgICAgOyBicmVhazsKLSAgICAgIGNhc2UgRkxPQVQ6ICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBGbG9hdCAgICAgOyBicmVhazsKLSAgICAgIGNhc2UgRE9VQkxFOiAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBEb3VibGUgICAgOyBicmVhazsKLSAgICAgIGNhc2UgQk9PTEVBTjogICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBCb29sZWFuICAgOyBicmVhazsKLSAgICAgIGNhc2UgU1RSSU5HOiAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBTdHJpbmcgICAgOyBicmVhazsKLSAgICAgIGNhc2UgQllURV9TVFJJTkc6ICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBCeXRlU3RyaW5nOyBicmVhazsKLSAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgQ2FsbGVyIG11c3QgZG8gdHlwZSBjaGVja2luZyBoZXJlLCBJIGd1ZXNzLgotICAgICAgICBpc1ZhbGlkID0gdmFsdWUgaW5zdGFuY2VvZiBJbnRlcm5hbC5FbnVtTGl0ZTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgIC8vIFRPRE8oa2VudG9uKTogIENhbGxlciBtdXN0IGRvIHR5cGUgY2hlY2tpbmcgaGVyZSwgSSBndWVzcy4KLSAgICAgICAgaXNWYWxpZCA9IHZhbHVlIGluc3RhbmNlb2YgTWVzc2FnZUxpdGU7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGlmICghaXNWYWxpZCkgewotICAgICAgLy8gVE9ETyhrZW50b24pOiAgV2hlbiBjaGFpbmluZyBjYWxscyB0byBzZXRGaWVsZCgpLCBpdCBjYW4gYmUgaGFyZCB0bwotICAgICAgLy8gICB0ZWxsIGZyb20gdGhlIHN0YWNrIHRyYWNlIHdoaWNoIGV4YWN0IGNhbGwgZmFpbGVkLCBzaW5jZSB0aGUgd2hvbGUKLSAgICAgIC8vICAgY2hhaW4gaXMgY29uc2lkZXJlZCBvbmUgbGluZSBvZiBjb2RlLiAgSXQgd291bGQgYmUgbmljZSB0byBwcmludAotICAgICAgLy8gICBtb3JlIGluZm9ybWF0aW9uIGhlcmUsIGUuZy4gbmFtaW5nIHRoZSBmaWVsZC4gIFdlIHVzZWQgdG8gZG8gdGhhdC4KLSAgICAgIC8vICAgQnV0IHdlIGNhbid0IG5vdyB0aGF0IEZpZWxkU2V0IGRvZXNuJ3QgdXNlIGRlc2NyaXB0b3JzLiAgTWF5YmUgdGhpcwotICAgICAgLy8gICBpc24ndCBhIGJpZyBkZWFsLCB0aG91Z2gsIHNpbmNlIGl0IHdvdWxkIG9ubHkgcmVhbGx5IGFwcGx5IHdoZW4gdXNpbmcKLSAgICAgIC8vICAgcmVmbGVjdGlvbiBhbmQgZ2VuZXJhbGx5IHBlb3BsZSBkb24ndCBjaGFpbiByZWZsZWN0aW9uIHNldHRlcnMuCi0gICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAiV3Jvbmcgb2JqZWN0IHR5cGUgdXNlZCB3aXRoIHByb3RvY29sIG1lc3NhZ2UgcmVmbGVjdGlvbi4iKTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBQYXJzaW5nIGFuZCBzZXJpYWxpemF0aW9uCi0KLSAgLyoqCi0gICAqIFNlZSB7QGxpbmsgTWVzc2FnZSNpc0luaXRpYWxpemVkKCl9LiAgTm90ZTogIFNpbmNlIHtAY29kZSBGaWVsZFNldH0KLSAgICogaXRzZWxmIGRvZXMgbm90IGhhdmUgYW55IHdheSBvZiBrbm93aW5nIGFib3V0IHJlcXVpcmVkIGZpZWxkcyB0aGF0Ci0gICAqIGFyZW4ndCBhY3R1YWxseSBwcmVzZW50IGluIHRoZSBzZXQsIGl0IGlzIHVwIHRvIHRoZSBjYWxsZXIgdG8gY2hlY2sKLSAgICogdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgotICAgKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7Ci0gICAgICBpZiAoIWlzSW5pdGlhbGl6ZWQoZmllbGRzLmdldEFycmF5RW50cnlBdChpKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKLSAgICAgIGlmICghaXNJbml0aWFsaXplZChlbnRyeSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwcml2YXRlIGJvb2xlYW4gaXNJbml0aWFsaXplZCgKLSAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5KSB7Ci0gICAgZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgZm9yIChmaW5hbCBNZXNzYWdlTGl0ZSBlbGVtZW50OgotICAgICAgICAgICAgICAgICAoTGlzdDxNZXNzYWdlTGl0ZT4pIGVudHJ5LmdldFZhbHVlKCkpIHsKLSAgICAgICAgICBpZiAoIWVsZW1lbnQuaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoISgoTWVzc2FnZUxpdGUpIGVudHJ5LmdldFZhbHVlKCkpLmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKgotICAgKiBHaXZlbiBhIGZpZWxkIHR5cGUsIHJldHVybiB0aGUgd2lyZSB0eXBlLgotICAgKgotICAgKiBAcmV0dXJucyBPbmUgb2YgdGhlIHtAY29kZSBXSVJFVFlQRV99IGNvbnN0YW50cyBkZWZpbmVkIGluCi0gICAqICAgICAgICAgIHtAbGluayBXaXJlRm9ybWF0fS4KLSAgICovCi0gIHN0YXRpYyBpbnQgZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZShmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbGVhbiBpc1BhY2tlZCkgewotICAgIGlmIChpc1BhY2tlZCkgewotICAgICAgcmV0dXJuIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0V2lyZVR5cGUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI21lcmdlRnJvbShNZXNzYWdlKX0sIGJ1dCBtZXJnZXMgZnJvbSBhbm90aGVyIHtAbGluayBGaWVsZFNldH0uCi0gICAqLwotICBwdWJsaWMgdm9pZCBtZXJnZUZyb20oZmluYWwgRmllbGRTZXQ8RmllbGREZXNjcmlwdG9yVHlwZT4gb3RoZXIpIHsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyLmZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7Ci0gICAgICBtZXJnZUZyb21GaWVsZChvdGhlci5maWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpKTsKLSAgICB9Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgICAgICAgb3RoZXIuZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7Ci0gICAgICBtZXJnZUZyb21GaWVsZChlbnRyeSk7Ci0gICAgfQotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHByaXZhdGUgdm9pZCBtZXJnZUZyb21GaWVsZCgKLSAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5KSB7Ci0gICAgZmluYWwgRmllbGREZXNjcmlwdG9yVHlwZSBkZXNjcmlwdG9yID0gZW50cnkuZ2V0S2V5KCk7Ci0gICAgZmluYWwgT2JqZWN0IG90aGVyVmFsdWUgPSBlbnRyeS5nZXRWYWx1ZSgpOwotCi0gICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICBPYmplY3QgdmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOwotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgLy8gT3VyIGxpc3QgaXMgZW1wdHksIGJ1dCB3ZSBzdGlsbCBuZWVkIHRvIG1ha2UgYSBkZWZlbnNpdmUgY29weSBvZgotICAgICAgICAvLyB0aGUgb3RoZXIgbGlzdCBzaW5jZSB3ZSBkb24ndCBrbm93IGlmIHRoZSBvdGhlciBGaWVsZFNldCBpcyBzdGlsbAotICAgICAgICAvLyBtdXRhYmxlLgotICAgICAgICBmaWVsZHMucHV0KGRlc2NyaXB0b3IsIG5ldyBBcnJheUxpc3QoKExpc3QpIG90aGVyVmFsdWUpKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIENvbmNhdGVuYXRlIHRoZSBsaXN0cy4KLSAgICAgICAgKChMaXN0KSB2YWx1ZSkuYWRkQWxsKChMaXN0KSBvdGhlclZhbHVlKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkgPT0gV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICBPYmplY3QgdmFsdWUgPSBmaWVsZHMuZ2V0KGRlc2NyaXB0b3IpOwotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgZmllbGRzLnB1dChkZXNjcmlwdG9yLCBvdGhlclZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE1lcmdlIHRoZSBtZXNzYWdlcy4KLSAgICAgICAgZmllbGRzLnB1dCgKLSAgICAgICAgICAgIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICBkZXNjcmlwdG9yLmludGVybmFsTWVyZ2VGcm9tKAotICAgICAgICAgICAgICAgICgoTWVzc2FnZUxpdGUpIHZhbHVlKS50b0J1aWxkZXIoKSwgKE1lc3NhZ2VMaXRlKSBvdGhlclZhbHVlKQotICAgICAgICAgICAgLmJ1aWxkKCkpOwotICAgICAgfQotCi0gICAgfSBlbHNlIHsKLSAgICAgIGZpZWxkcy5wdXQoZGVzY3JpcHRvciwgb3RoZXJWYWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLy8gVE9ETyhrZW50b24pOiAgTW92ZSBzdGF0aWMgcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbiBtZXRob2RzIGludG8gc29tZQotICAvLyAgIG90aGVyIGNsYXNzLiAgUHJvYmFibHkgV2lyZUZvcm1hdC4KLQotICAvKioKLSAgICogUmVhZCBhIGZpZWxkIG9mIGFueSBwcmltaXRpdmUgdHlwZSBmcm9tIGEgQ29kZWRJbnB1dFN0cmVhbS4gIEVudW1zLAotICAgKiBncm91cHMsIGFuZCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgbm90IGhhbmRsZWQgYnkgdGhpcyBtZXRob2QuCi0gICAqCi0gICAqIEBwYXJhbSBpbnB1dCBUaGUgc3RyZWFtIGZyb20gd2hpY2ggdG8gcmVhZC4KLSAgICogQHBhcmFtIHR5cGUgRGVjbGFyZWQgdHlwZSBvZiB0aGUgZmllbGQuCi0gICAqIEByZXR1cm4gQW4gb2JqZWN0IHJlcHJlc2VudGluZyB0aGUgZmllbGQncyB2YWx1ZSwgb2YgdGhlIGV4YWN0Ci0gICAqICAgICAgICAgdHlwZSB3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieQotICAgKiAgICAgICAgIHtAbGluayBNZXNzYWdlI2dldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvcil9IGZvcgotICAgKiAgICAgICAgIHRoaXMgZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIE9iamVjdCByZWFkUHJpbWl0aXZlRmllbGQoCi0gICAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0LAotICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBzd2l0Y2ggKHR5cGUpIHsKLSAgICAgIGNhc2UgRE9VQkxFICA6IHJldHVybiBpbnB1dC5yZWFkRG91YmxlICAoKTsKLSAgICAgIGNhc2UgRkxPQVQgICA6IHJldHVybiBpbnB1dC5yZWFkRmxvYXQgICAoKTsKLSAgICAgIGNhc2UgSU5UNjQgICA6IHJldHVybiBpbnB1dC5yZWFkSW50NjQgICAoKTsKLSAgICAgIGNhc2UgVUlOVDY0ICA6IHJldHVybiBpbnB1dC5yZWFkVUludDY0ICAoKTsKLSAgICAgIGNhc2UgSU5UMzIgICA6IHJldHVybiBpbnB1dC5yZWFkSW50MzIgICAoKTsKLSAgICAgIGNhc2UgRklYRUQ2NCA6IHJldHVybiBpbnB1dC5yZWFkRml4ZWQ2NCAoKTsKLSAgICAgIGNhc2UgRklYRUQzMiA6IHJldHVybiBpbnB1dC5yZWFkRml4ZWQzMiAoKTsKLSAgICAgIGNhc2UgQk9PTCAgICA6IHJldHVybiBpbnB1dC5yZWFkQm9vbCAgICAoKTsKLSAgICAgIGNhc2UgU1RSSU5HICA6IHJldHVybiBpbnB1dC5yZWFkU3RyaW5nICAoKTsKLSAgICAgIGNhc2UgQllURVMgICA6IHJldHVybiBpbnB1dC5yZWFkQnl0ZXMgICAoKTsKLSAgICAgIGNhc2UgVUlOVDMyICA6IHJldHVybiBpbnB1dC5yZWFkVUludDMyICAoKTsKLSAgICAgIGNhc2UgU0ZJWEVEMzI6IHJldHVybiBpbnB1dC5yZWFkU0ZpeGVkMzIoKTsKLSAgICAgIGNhc2UgU0ZJWEVENjQ6IHJldHVybiBpbnB1dC5yZWFkU0ZpeGVkNjQoKTsKLSAgICAgIGNhc2UgU0lOVDMyICA6IHJldHVybiBpbnB1dC5yZWFkU0ludDMyICAoKTsKLSAgICAgIGNhc2UgU0lOVDY0ICA6IHJldHVybiBpbnB1dC5yZWFkU0ludDY0ICAoKTsKLQotICAgICAgY2FzZSBHUk9VUDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAicmVhZFByaW1pdGl2ZUZpZWxkKCkgY2Fubm90IGhhbmRsZSBuZXN0ZWQgZ3JvdXBzLiIpOwotICAgICAgY2FzZSBNRVNTQUdFOgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJyZWFkUHJpbWl0aXZlRmllbGQoKSBjYW5ub3QgaGFuZGxlIGVtYmVkZGVkIG1lc3NhZ2VzLiIpOwotICAgICAgY2FzZSBFTlVNOgotICAgICAgICAvLyBXZSBkb24ndCBoYW5kbGUgZW51bXMgYmVjYXVzZSB3ZSBkb24ndCBrbm93IHdoYXQgdG8gZG8gaWYgdGhlCi0gICAgICAgIC8vIHZhbHVlIGlzIG5vdCByZWNvZ25pemVkLgotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJyZWFkUHJpbWl0aXZlRmllbGQoKSBjYW5ub3QgaGFuZGxlIGVudW1zLiIpOwotICAgIH0KLQotICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgIlRoZXJlIGlzIG5vIHdheSB0byBnZXQgaGVyZSwgYnV0IHRoZSBjb21waWxlciB0aGlua3Mgb3RoZXJ3aXNlLiIpOwotICB9Ci0KLSAgLyoqIFNlZSB7QGxpbmsgTWVzc2FnZSN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgewotICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkgPQotICAgICAgICAgIGZpZWxkcy5nZXRBcnJheUVudHJ5QXQoaSk7Ci0gICAgICB3cml0ZUZpZWxkKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpLCBvdXRwdXQpOwotICAgIH0KLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5IDoKLSAgICAgICAgIGZpZWxkcy5nZXRPdmVyZmxvd0VudHJpZXMoKSkgewotICAgICAgd3JpdGVGaWVsZChlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI3dyaXRlVG99IGJ1dCB1c2VzIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB3cml0ZU1lc3NhZ2VTZXRUbyhmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgewotICAgICAgd3JpdGVNZXNzYWdlU2V0VG8oZmllbGRzLmdldEFycmF5RW50cnlBdChpKSwgb3V0cHV0KTsKLSAgICB9Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgICAgICAgZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7Ci0gICAgICB3cml0ZU1lc3NhZ2VTZXRUbyhlbnRyeSwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgd3JpdGVNZXNzYWdlU2V0VG8oCi0gICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSwKLSAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpICYmICFkZXNjcmlwdG9yLmlzUGFja2VkKCkpIHsKLSAgICAgIG91dHB1dC53cml0ZU1lc3NhZ2VTZXRFeHRlbnNpb24oZW50cnkuZ2V0S2V5KCkuZ2V0TnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlTGl0ZSkgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHdyaXRlRmllbGQoZGVzY3JpcHRvciwgZW50cnkuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogV3JpdGUgYSBzaW5nbGUgdGFnLXZhbHVlIHBhaXIgdG8gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHN0cmVhbS4KLSAgICogQHBhcmFtIHR5cGUgICBUaGUgZmllbGQncyB0eXBlLgotICAgKiBAcGFyYW0gbnVtYmVyIFRoZSBmaWVsZCdzIG51bWJlci4KLSAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKLSAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5Ci0gICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCi0gICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVFbGVtZW50KGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIC8vIFNwZWNpYWwgY2FzZSBmb3IgZ3JvdXBzLCB3aGljaCBuZWVkIGEgc3RhcnQgYW5kIGVuZCB0YWc7IG90aGVyIGZpZWxkcwotICAgIC8vIGNhbiBqdXN0IHVzZSB3cml0ZVRhZygpIGFuZCB3cml0ZUZpZWxkTm9UYWcoKS4KLSAgICBpZiAodHlwZSA9PSBXaXJlRm9ybWF0LkZpZWxkVHlwZS5HUk9VUCkgewotICAgICAgb3V0cHV0LndyaXRlR3JvdXAobnVtYmVyLCAoTWVzc2FnZUxpdGUpIHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgb3V0cHV0LndyaXRlVGFnKG51bWJlciwgZ2V0V2lyZUZvcm1hdEZvckZpZWxkVHlwZSh0eXBlLCBmYWxzZSkpOwotICAgICAgd3JpdGVFbGVtZW50Tm9UYWcob3V0cHV0LCB0eXBlLCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFdyaXRlIGEgZmllbGQgb2YgYXJiaXRyYXJ5IHR5cGUsIHdpdGhvdXQgaXRzIHRhZywgdG8gdGhlIHN0cmVhbS4KLSAgICoKLSAgICogQHBhcmFtIG91dHB1dCBUaGUgb3V0cHV0IHN0cmVhbS4KLSAgICogQHBhcmFtIHR5cGUgVGhlIGZpZWxkJ3MgdHlwZS4KLSAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKLSAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5Ci0gICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCi0gICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgd3JpdGVFbGVtZW50Tm9UYWcoCi0gICAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQsCi0gICAgICBmaW5hbCBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlLAotICAgICAgZmluYWwgT2JqZWN0IHZhbHVlKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgY2FzZSBET1VCTEUgIDogb3V0cHV0LndyaXRlRG91YmxlTm9UYWcgICgoRG91YmxlICAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIEZMT0FUICAgOiBvdXRwdXQud3JpdGVGbG9hdE5vVGFnICAgKChGbG9hdCAgICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgSU5UNjQgICA6IG91dHB1dC53cml0ZUludDY0Tm9UYWcgICAoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBVSU5UNjQgIDogb3V0cHV0LndyaXRlVUludDY0Tm9UYWcgICgoTG9uZyAgICAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIElOVDMyICAgOiBvdXRwdXQud3JpdGVJbnQzMk5vVGFnICAgKChJbnRlZ2VyICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgRklYRUQ2NCA6IG91dHB1dC53cml0ZUZpeGVkNjROb1RhZyAoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBGSVhFRDMyIDogb3V0cHV0LndyaXRlRml4ZWQzMk5vVGFnICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIEJPT0wgICAgOiBvdXRwdXQud3JpdGVCb29sTm9UYWcgICAgKChCb29sZWFuICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgU1RSSU5HICA6IG91dHB1dC53cml0ZVN0cmluZ05vVGFnICAoKFN0cmluZyAgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBHUk9VUCAgIDogb3V0cHV0LndyaXRlR3JvdXBOb1RhZyAgICgoTWVzc2FnZUxpdGUpIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIE1FU1NBR0UgOiBvdXRwdXQud3JpdGVNZXNzYWdlTm9UYWcgKChNZXNzYWdlTGl0ZSkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgQllURVMgICA6IG91dHB1dC53cml0ZUJ5dGVzTm9UYWcgICAoKEJ5dGVTdHJpbmcgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBVSU5UMzIgIDogb3V0cHV0LndyaXRlVUludDMyTm9UYWcgICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIFNGSVhFRDMyOiBvdXRwdXQud3JpdGVTRml4ZWQzMk5vVGFnKChJbnRlZ2VyICAgICkgdmFsdWUpOyBicmVhazsKLSAgICAgIGNhc2UgU0ZJWEVENjQ6IG91dHB1dC53cml0ZVNGaXhlZDY0Tm9UYWcoKExvbmcgICAgICAgKSB2YWx1ZSk7IGJyZWFrOwotICAgICAgY2FzZSBTSU5UMzIgIDogb3V0cHV0LndyaXRlU0ludDMyTm9UYWcgICgoSW50ZWdlciAgICApIHZhbHVlKTsgYnJlYWs7Ci0gICAgICBjYXNlIFNJTlQ2NCAgOiBvdXRwdXQud3JpdGVTSW50NjROb1RhZyAgKChMb25nICAgICAgICkgdmFsdWUpOyBicmVhazsKLQotICAgICAgY2FzZSBFTlVNOgotICAgICAgICBvdXRwdXQud3JpdGVFbnVtTm9UYWcoKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFdyaXRlIGEgc2luZ2xlIGZpZWxkLiAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgd3JpdGVGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3JMaXRlPD8+IGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUgPSBkZXNjcmlwdG9yLmdldExpdGVUeXBlKCk7Ci0gICAgaW50IG51bWJlciA9IGRlc2NyaXB0b3IuZ2V0TnVtYmVyKCk7Ci0gICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICBmaW5hbCBMaXN0PD8+IHZhbHVlTGlzdCA9IChMaXN0PD8+KXZhbHVlOwotICAgICAgaWYgKGRlc2NyaXB0b3IuaXNQYWNrZWQoKSkgewotICAgICAgICBvdXRwdXQud3JpdGVUYWcobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOwotICAgICAgICAvLyBDb21wdXRlIHRoZSB0b3RhbCBkYXRhIHNpemUgc28gdGhlIGxlbmd0aCBjYW4gYmUgd3JpdHRlbi4KLSAgICAgICAgaW50IGRhdGFTaXplID0gMDsKLSAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHZhbHVlTGlzdCkgewotICAgICAgICAgIGRhdGFTaXplICs9IGNvbXB1dGVFbGVtZW50U2l6ZU5vVGFnKHR5cGUsIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKGRhdGFTaXplKTsKLSAgICAgICAgLy8gV3JpdGUgdGhlIGRhdGEgaXRzZWxmLCB3aXRob3V0IGFueSB0YWdzLgotICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogdmFsdWVMaXN0KSB7Ci0gICAgICAgICAgd3JpdGVFbGVtZW50Tm9UYWcob3V0cHV0LCB0eXBlLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IHZhbHVlTGlzdCkgewotICAgICAgICAgIHdyaXRlRWxlbWVudChvdXRwdXQsIHR5cGUsIG51bWJlciwgZWxlbWVudCk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgd3JpdGVFbGVtZW50KG91dHB1dCwgdHlwZSwgbnVtYmVyLCB2YWx1ZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNlZSB7QGxpbmsgTWVzc2FnZSNnZXRTZXJpYWxpemVkU2l6ZSgpfS4gIEl0J3MgdXAgdG8gdGhlIGNhbGxlciB0byBjYWNoZQotICAgKiB0aGUgcmVzdWx0aW5nIHNpemUgaWYgZGVzaXJlZC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemUoKSB7Ci0gICAgaW50IHNpemUgPSAwOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmdldE51bUFycmF5RW50cmllcygpOyBpKyspIHsKLSAgICAgIGZpbmFsIE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IGVudHJ5ID0KLSAgICAgICAgICBmaWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpOwotICAgICAgc2l6ZSArPSBjb21wdXRlRmllbGRTaXplKGVudHJ5LmdldEtleSgpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgICBmaWVsZHMuZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKLSAgICAgIHNpemUgKz0gY29tcHV0ZUZpZWxkU2l6ZShlbnRyeS5nZXRLZXkoKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotICB9Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICNnZXRTZXJpYWxpemVkU2l6ZX0gYnV0IHVzZXMgTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCkgewotICAgIGludCBzaXplID0gMDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5nZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7Ci0gICAgICBzaXplICs9IGdldE1lc3NhZ2VTZXRTZXJpYWxpemVkU2l6ZShmaWVsZHMuZ2V0QXJyYXlFbnRyeUF0KGkpKTsKLSAgICB9Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgICAgICAgZmllbGRzLmdldE92ZXJmbG93RW50cmllcygpKSB7Ci0gICAgICBzaXplICs9IGdldE1lc3NhZ2VTZXRTZXJpYWxpemVkU2l6ZShlbnRyeSk7Ci0gICAgfQotICAgIHJldHVybiBzaXplOwotICB9Ci0KLSAgcHJpdmF0ZSBpbnQgZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKAotICAgICAgZmluYWwgTWFwLkVudHJ5PEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4gZW50cnkpIHsKLSAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3JUeXBlIGRlc2NyaXB0b3IgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICBpZiAoZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PSBXaXJlRm9ybWF0LkphdmFUeXBlLk1FU1NBR0UgJiYKLSAgICAgICAgIWRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpICYmICFkZXNjcmlwdG9yLmlzUGFja2VkKCkpIHsKLSAgICAgIHJldHVybiBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlTWVzc2FnZVNldEV4dGVuc2lvblNpemUoCi0gICAgICAgICAgZW50cnkuZ2V0S2V5KCkuZ2V0TnVtYmVyKCksIChNZXNzYWdlTGl0ZSkgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjb21wdXRlRmllbGRTaXplKGRlc2NyaXB0b3IsIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhhdCB3b3VsZCBiZSBuZWVkZWQgdG8gZW5jb2RlIGEKLSAgICogc2luZ2xlIHRhZy92YWx1ZSBwYWlyIG9mIGFyYml0cmFyeSB0eXBlLgotICAgKgotICAgKiBAcGFyYW0gdHlwZSAgIFRoZSBmaWVsZCdzIHR5cGUuCi0gICAqIEBwYXJhbSBudW1iZXIgVGhlIGZpZWxkJ3MgbnVtYmVyLgotICAgKiBAcGFyYW0gdmFsdWUgIE9iamVjdCByZXByZXNlbnRpbmcgdGhlIGZpZWxkJ3MgdmFsdWUuICBNdXN0IGJlIG9mIHRoZSBleGFjdAotICAgKiAgICAgICAgICAgICAgIHR5cGUgd2hpY2ggd291bGQgYmUgcmV0dXJuZWQgYnkKLSAgICogICAgICAgICAgICAgICB7QGxpbmsgTWVzc2FnZSNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSBmb3IKLSAgICogICAgICAgICAgICAgICB0aGlzIGZpZWxkLgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgaW50IGNvbXB1dGVFbGVtZW50U2l6ZSgKLSAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsCi0gICAgICBmaW5hbCBpbnQgbnVtYmVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICBpbnQgdGFnU2l6ZSA9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVUYWdTaXplKG51bWJlcik7Ci0gICAgaWYgKHR5cGUgPT0gV2lyZUZvcm1hdC5GaWVsZFR5cGUuR1JPVVApIHsKLSAgICAgIHRhZ1NpemUgKj0gMjsKLSAgICB9Ci0gICAgcmV0dXJuIHRhZ1NpemUgKyBjb21wdXRlRWxlbWVudFNpemVOb1RhZyh0eXBlLCB2YWx1ZSk7Ci0gIH0KLQotICAvKioKLSAgICogQ29tcHV0ZSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgd291bGQgYmUgbmVlZGVkIHRvIGVuY29kZSBhCi0gICAqIHBhcnRpY3VsYXIgdmFsdWUgb2YgYXJiaXRyYXJ5IHR5cGUsIGV4Y2x1ZGluZyB0YWcuCi0gICAqCi0gICAqIEBwYXJhbSB0eXBlICAgVGhlIGZpZWxkJ3MgdHlwZS4KLSAgICogQHBhcmFtIHZhbHVlICBPYmplY3QgcmVwcmVzZW50aW5nIHRoZSBmaWVsZCdzIHZhbHVlLiAgTXVzdCBiZSBvZiB0aGUgZXhhY3QKLSAgICogICAgICAgICAgICAgICB0eXBlIHdoaWNoIHdvdWxkIGJlIHJldHVybmVkIGJ5Ci0gICAqICAgICAgICAgICAgICAge0BsaW5rIE1lc3NhZ2UjZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yKX0gZm9yCi0gICAqICAgICAgICAgICAgICAgdGhpcyBmaWVsZC4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludCBjb21wdXRlRWxlbWVudFNpemVOb1RhZygKLSAgICAgIGZpbmFsIFdpcmVGb3JtYXQuRmllbGRUeXBlIHR5cGUsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgIHN3aXRjaCAodHlwZSkgewotICAgICAgLy8gTm90ZTogIE1pbm9yIHZpb2xhdGlvbiBvZiA4MC1jaGFyIGxpbWl0IHJ1bGUgaGVyZSBiZWNhdXNlIHRoaXMgd291bGQKLSAgICAgIC8vICAgYWN0dWFsbHkgYmUgaGFyZGVyIHRvIHJlYWQgaWYgd2Ugd3JhcHBlZCB0aGUgbGluZXMuCi0gICAgICBjYXNlIERPVUJMRSAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZURvdWJsZVNpemVOb1RhZyAgKChEb3VibGUgICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIEZMT0FUICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZsb2F0U2l6ZU5vVGFnICAgKChGbG9hdCAgICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIElOVDY0ICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUludDY0U2l6ZU5vVGFnICAgKChMb25nICAgICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIFVJTlQ2NCAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQ2NFNpemVOb1RhZyAgKChMb25nICAgICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIElOVDMyICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUludDMyU2l6ZU5vVGFnICAgKChJbnRlZ2VyICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIEZJWEVENjQgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZpeGVkNjRTaXplTm9UYWcgKChMb25nICAgICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIEZJWEVEMzIgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZpeGVkMzJTaXplTm9UYWcgKChJbnRlZ2VyICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIEJPT0wgICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUJvb2xTaXplTm9UYWcgICAgKChCb29sZWFuICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIFNUUklORyAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVN0cmluZ1NpemVOb1RhZyAgKChTdHJpbmcgICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIEdST1VQICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUdyb3VwU2l6ZU5vVGFnICAgKChNZXNzYWdlTGl0ZSl2YWx1ZSk7Ci0gICAgICBjYXNlIE1FU1NBR0UgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZU1lc3NhZ2VTaXplTm9UYWcgKChNZXNzYWdlTGl0ZSl2YWx1ZSk7Ci0gICAgICBjYXNlIEJZVEVTICAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUJ5dGVzU2l6ZU5vVGFnICAgKChCeXRlU3RyaW5nICl2YWx1ZSk7Ci0gICAgICBjYXNlIFVJTlQzMiAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVVJbnQzMlNpemVOb1RhZyAgKChJbnRlZ2VyICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIFNGSVhFRDMyOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNGaXhlZDMyU2l6ZU5vVGFnKChJbnRlZ2VyICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIFNGSVhFRDY0OiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNGaXhlZDY0U2l6ZU5vVGFnKChMb25nICAgICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIFNJTlQzMiAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNJbnQzMlNpemVOb1RhZyAgKChJbnRlZ2VyICAgICl2YWx1ZSk7Ci0gICAgICBjYXNlIFNJTlQ2NCAgOiByZXR1cm4gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVNJbnQ2NFNpemVOb1RhZyAgKChMb25nICAgICAgICl2YWx1ZSk7Ci0KLSAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgcmV0dXJuIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVFbnVtU2l6ZU5vVGFnKAotICAgICAgICAgICAgKChJbnRlcm5hbC5FbnVtTGl0ZSkgdmFsdWUpLmdldE51bWJlcigpKTsKLSAgICB9Ci0KLSAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICJUaGVyZSBpcyBubyB3YXkgdG8gZ2V0IGhlcmUsIGJ1dCB0aGUgY29tcGlsZXIgdGhpbmtzIG90aGVyd2lzZS4iKTsKLSAgfQotCi0gIC8qKgotICAgKiBDb21wdXRlIHRoZSBudW1iZXIgb2YgYnl0ZXMgbmVlZGVkIHRvIGVuY29kZSBhIHBhcnRpY3VsYXIgZmllbGQuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGludCBjb21wdXRlRmllbGRTaXplKGZpbmFsIEZpZWxkRGVzY3JpcHRvckxpdGU8Pz4gZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICBXaXJlRm9ybWF0LkZpZWxkVHlwZSB0eXBlID0gZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpOwotICAgIGludCBudW1iZXIgPSBkZXNjcmlwdG9yLmdldE51bWJlcigpOwotICAgIGlmIChkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgewotICAgICAgaWYgKGRlc2NyaXB0b3IuaXNQYWNrZWQoKSkgewotICAgICAgICBpbnQgZGF0YVNpemUgPSAwOwotICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3Q8Pz4pdmFsdWUpIHsKLSAgICAgICAgICBkYXRhU2l6ZSArPSBjb21wdXRlRWxlbWVudFNpemVOb1RhZyh0eXBlLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gZGF0YVNpemUgKwotICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZVRhZ1NpemUobnVtYmVyKSArCi0gICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUmF3VmFyaW50MzJTaXplKGRhdGFTaXplKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGludCBzaXplID0gMDsKLSAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0PD8+KXZhbHVlKSB7Ci0gICAgICAgICAgc2l6ZSArPSBjb21wdXRlRWxlbWVudFNpemUodHlwZSwgbnVtYmVyLCBlbGVtZW50KTsKLSAgICAgICAgfQotICAgICAgICByZXR1cm4gc2l6ZTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIGNvbXB1dGVFbGVtZW50U2l6ZSh0eXBlLCBudW1iZXIsIHZhbHVlKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiNWVhZGVkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODM0ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uU2VyaWFsaXphYmxlOwotaW1wb3J0IGphdmEubGFuZy5yZWZsZWN0Lkludm9jYXRpb25UYXJnZXRFeGNlcHRpb247Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKioKLSAqIEFsbCBnZW5lcmF0ZWQgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGV4dGVuZCB0aGlzIGNsYXNzLiAgVGhpcyBjbGFzcwotICogaW1wbGVtZW50cyBtb3N0IG9mIHRoZSBNZXNzYWdlIGFuZCBCdWlsZGVyIGludGVyZmFjZXMgdXNpbmcgSmF2YSByZWZsZWN0aW9uLgotICogVXNlcnMgY2FuIGlnbm9yZSB0aGlzIGNsYXNzIGFuZCBwcmV0ZW5kIHRoYXQgZ2VuZXJhdGVkIG1lc3NhZ2VzIGltcGxlbWVudAotICogdGhlIE1lc3NhZ2UgaW50ZXJmYWNlIGRpcmVjdGx5LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBhYnN0cmFjdCBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlCi0gICAgaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAxTDsKLQotICBwcml2YXRlIGZpbmFsIFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzOwotCi0gIC8qKgotICAgKiBGb3IgdGVzdGluZy4gQWxsb3dzIGEgdGVzdCB0byBkaXNhYmxlIHRoZSBvcHRpbWl6YXRpb24gdGhhdCBhdm9pZHMgdXNpbmcKLSAgICogZmllbGQgYnVpbGRlcnMgZm9yIG5lc3RlZCBtZXNzYWdlcyB1bnRpbCB0aGV5IGFyZSByZXF1ZXN0ZWQuIEJ5IGRpc2FibGluZwotICAgKiB0aGlzIG9wdGltaXphdGlvbiwgZXhpc3RpbmcgdGVzdHMgY2FuIGJlIHJldXNlZCB0byB0ZXN0IHRoZSBmaWVsZCBidWlsZGVycy4KLSAgICovCi0gIHByb3RlY3RlZCBzdGF0aWMgYm9vbGVhbiBhbHdheXNVc2VGaWVsZEJ1aWxkZXJzID0gZmFsc2U7Ci0KLSAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2UoKSB7Ci0gICAgdGhpcy51bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOwotICB9Ci0KLSAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2UoQnVpbGRlcjw/PiBidWlsZGVyKSB7Ci0gICAgdGhpcy51bmtub3duRmllbGRzID0gYnVpbGRlci5nZXRVbmtub3duRmllbGRzKCk7Ci0gIH0KLQotIC8qKgotICAqIEZvciB0ZXN0aW5nLiBBbGxvd3MgYSB0ZXN0IHRvIGRpc2FibGUgdGhlIG9wdGltaXphdGlvbiB0aGF0IGF2b2lkcyB1c2luZwotICAqIGZpZWxkIGJ1aWxkZXJzIGZvciBuZXN0ZWQgbWVzc2FnZXMgdW50aWwgdGhleSBhcmUgcmVxdWVzdGVkLiBCeSBkaXNhYmxpbmcKLSAgKiB0aGlzIG9wdGltaXphdGlvbiwgZXhpc3RpbmcgdGVzdHMgY2FuIGJlIHJldXNlZCB0byB0ZXN0IHRoZSBmaWVsZCBidWlsZGVycy4KLSAgKiBTZWUge0BsaW5rIFJlcGVhdGVkRmllbGRCdWlsZGVyfSBhbmQge0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0uCi0gICovCi0gIHN0YXRpYyB2b2lkIGVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCkgewotICAgIGFsd2F5c1VzZUZpZWxkQnVpbGRlcnMgPSB0cnVlOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlIGZvciB0aGlzIHR5cGUuICBXZSBjYW4ndCBoYXZlIHRoZSBtZXNzYWdlCi0gICAqIGNsYXNzIHBhc3MgdGhpcyBpbiB0byB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSBvZiBib290c3RyYXBwaW5nIHRyb3VibGUKLSAgICogd2l0aCBEZXNjcmlwdG9yUHJvdG9zLgotICAgKi8KLSAgcHJvdGVjdGVkIGFic3RyYWN0IEZpZWxkQWNjZXNzb3JUYWJsZSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpOwotCi0gIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5kZXNjcmlwdG9yOwotICB9Ci0KLSAgLyoqIEludGVybmFsIGhlbHBlciB3aGljaCByZXR1cm5zIGEgbXV0YWJsZSBtYXAuICovCi0gIHByaXZhdGUgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHNNdXRhYmxlKCkgewotICAgIGZpbmFsIFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IHJlc3VsdCA9Ci0gICAgICBuZXcgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4oKTsKLSAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7Ci0gICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBkZXNjcmlwdG9yLmdldEZpZWxkcygpKSB7Ci0gICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIGZpbmFsIExpc3Q8Pz4gdmFsdWUgPSAoTGlzdDw/PikgZ2V0RmllbGQoZmllbGQpOwotICAgICAgICBpZiAoIXZhbHVlLmlzRW1wdHkoKSkgewotICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgaWYgKGhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIGdldEZpZWxkKGZpZWxkKSk7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIGZvciAoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkIDogZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5nZXRGaWVsZHMoKSkgewotICAgICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LgotICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSkgewotICAgICAgICBpZiAoIWhhc0ZpZWxkKGZpZWxkKSkgewotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gQ2hlY2sgdGhhdCBlbWJlZGRlZCBtZXNzYWdlcyBhcmUgaW5pdGlhbGl6ZWQuCi0gICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpIGZpbmFsCi0gICAgICAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlTGlzdCA9IChMaXN0PE1lc3NhZ2U+KSBnZXRGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgZm9yIChmaW5hbCBNZXNzYWdlIGVsZW1lbnQgOiBtZXNzYWdlTGlzdCkgewotICAgICAgICAgICAgaWYgKCFlbGVtZW50LmlzSW5pdGlhbGl6ZWQoKSkgewotICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChoYXNGaWVsZChmaWVsZCkgJiYgISgoTWVzc2FnZSkgZ2V0RmllbGQoZmllbGQpKS5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICBwdWJsaWMgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHMoKSB7Ci0gICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChnZXRBbGxGaWVsZHNNdXRhYmxlKCkpOwotICB9Ci0KLSAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5oYXModGhpcyk7Ci0gIH0KLQotICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgcHVibGljIE9iamVjdCBnZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0KHRoaXMpOwotICB9Ci0KLSAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQotICAgICAgLmdldFJlcGVhdGVkQ291bnQodGhpcyk7Ci0gIH0KLQotICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkuZ2V0RmllbGQoZmllbGQpCi0gICAgICAuZ2V0UmVwZWF0ZWQodGhpcywgaW5kZXgpOwotICB9Ci0KLSAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gIHB1YmxpYyBmaW5hbCBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKLSAgICByZXR1cm4gdW5rbm93bkZpZWxkczsKLSAgfQotCi0gIHByb3RlY3RlZCBhYnN0cmFjdCBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoQnVpbGRlclBhcmVudCBwYXJlbnQpOwotCi0gIC8qKgotICAgKiBJbnRlcmZhY2UgZm9yIHRoZSBwYXJlbnQgb2YgYSBCdWlsZGVyIHRoYXQgYWxsb3dzIHRoZSBidWlsZGVyIHRvCi0gICAqIGNvbW11bmljYXRlIGludmFsaWRhdGlvbnMgYmFjayB0byB0aGUgcGFyZW50IGZvciB1c2Ugd2hlbiB1c2luZyBuZXN0ZWQKLSAgICogYnVpbGRlcnMuCi0gICAqLwotICBwcm90ZWN0ZWQgaW50ZXJmYWNlIEJ1aWxkZXJQYXJlbnQgewotCi0gICAgLyoqCi0gICAgICogQSBidWlsZGVyIGJlY29tZXMgZGlydHkgd2hlbmV2ZXIgYSBmaWVsZCBpcyBtb2RpZmllZCAtLSBpbmNsdWRpbmcgZmllbGRzCi0gICAgICogaW4gbmVzdGVkIGJ1aWxkZXJzIC0tIGFuZCBiZWNvbWVzIGNsZWFuIHdoZW4gYnVpbGQoKSBpcyBjYWxsZWQuICBUaHVzLAotICAgICAqIHdoZW4gYSBidWlsZGVyIGJlY29tZXMgZGlydHksIGFsbCBpdHMgcGFyZW50cyBiZWNvbWUgZGlydHkgYXMgd2VsbCwgYW5kCi0gICAgICogd2hlbiBpdCBiZWNvbWVzIGNsZWFuLCBhbGwgaXRzIGNoaWxkcmVuIGJlY29tZSBjbGVhbi4gIFRoZSBkaXJ0aW5lc3MKLSAgICAgKiBzdGF0ZSBpcyB1c2VkIHRvIGludmFsaWRhdGUgY2VydGFpbiBjYWNoZWQgdmFsdWVzLgotICAgICAqIDxicj4KLSAgICAgKiBUbyB0aGlzIGVuZCwgYSBidWlsZGVyIGNhbGxzIG1hcmtBc0RpcnR5KCkgb24gaXRzIHBhcmVudCB3aGVuZXZlciBpdAotICAgICAqIHRyYW5zaXRpb25zIGZyb20gY2xlYW4gdG8gZGlydHkuICBUaGUgcGFyZW50IG11c3QgcHJvcGFnYXRlIHRoaXMgY2FsbCB0bwotICAgICAqIGl0cyBvd24gcGFyZW50LCB1bmxlc3MgaXQgd2FzIGFscmVhZHkgZGlydHksIGluIHdoaWNoIGNhc2UgdGhlCi0gICAgICogZ3JhbmRwYXJlbnQgbXVzdCBuZWNlc3NhcmlseSBhbHJlYWR5IGJlIGRpcnR5IGFzIHdlbGwuICBUaGUgcGFyZW50IGNhbgotICAgICAqIG9ubHkgdHJhbnNpdGlvbiBiYWNrIHRvICJjbGVhbiIgYWZ0ZXIgY2FsbGluZyBidWlsZCgpIG9uIGFsbCBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICB2b2lkIG1hcmtEaXJ0eSgpOwotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQnVpbGRlciA8QnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPgotICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlcjxCdWlsZGVyVHlwZT4gewotCi0gICAgcHJpdmF0ZSBCdWlsZGVyUGFyZW50IGJ1aWxkZXJQYXJlbnQ7Ci0KLSAgICBwcml2YXRlIEJ1aWxkZXJQYXJlbnRJbXBsIG1lQXNQYXJlbnQ7Ci0KLSAgICAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSd2ZSBidWlsdCBhIG1lc3NhZ2UgYW5kIHNvIHdlIGFyZSBub3cgb2JsaWdhdGVkCi0gICAgLy8gdG8gZGlzcGF0Y2ggZGlydHkgaW52YWxpZGF0aW9ucy4gU2VlIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlckxpc3RlbmVyLgotICAgIHByaXZhdGUgYm9vbGVhbiBpc0NsZWFuOwotCi0gICAgcHJpdmF0ZSBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkcyA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLQotICAgIHByb3RlY3RlZCBCdWlsZGVyKCkgewotICAgICAgdGhpcyhudWxsKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgQnVpbGRlcihCdWlsZGVyUGFyZW50IGJ1aWxkZXJQYXJlbnQpIHsKLSAgICAgIHRoaXMuYnVpbGRlclBhcmVudCA9IGJ1aWxkZXJQYXJlbnQ7Ci0gICAgfQotCi0gICAgdm9pZCBkaXNwb3NlKCkgewotICAgICAgYnVpbGRlclBhcmVudCA9IG51bGw7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHRoZSBzdWJjbGFzcyB3aGVuIGEgbWVzc2FnZSBpcyBidWlsdC4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgdm9pZCBvbkJ1aWx0KCkgewotICAgICAgaWYgKGJ1aWxkZXJQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICBtYXJrQ2xlYW4oKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgdGhlIHN1YmNsYXNzIG9yIGEgYnVpbGRlciB0byBub3RpZnkgdXMgdGhhdCBhIG1lc3NhZ2Ugd2FzCi0gICAgICogYnVpbHQgYW5kIG1heSBiZSBjYWNoZWQgYW5kIHRoZXJlZm9yZSBpbnZhbGlkYXRpb25zIGFyZSBuZWVkZWQuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIHZvaWQgbWFya0NsZWFuKCkgewotICAgICAgdGhpcy5pc0NsZWFuID0gdHJ1ZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHdoZXRoZXIgaW52YWxpZGF0aW9ucyBhcmUgbmVlZGVkCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHdoZXRoZXIgaW52YWxpZGF0aW9ucyBhcmUgbmVlZGVkCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gaXNDbGVhbigpIHsKLSAgICAgIHJldHVybiBpc0NsZWFuOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBvbmx5IHRvIHdvcmsgYXJvdW5kIGFuIGFwcGFyZW50IGJ1ZyBpbiB0aGUKLSAgICAvLyBKYXZhIGNvbXBpbGVyIGFuZC9vciBidWlsZCBzeXN0ZW0uICBTZWUgYnVnICMxODk4NDYzLiAgVGhlIG1lcmUgcHJlc2VuY2UKLSAgICAvLyBvZiB0aGlzIGR1bW15IGNsb25lKCkgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgZ28gYXdheS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xvbmUoKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIlRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgaW5pdGlhbGl6YXRpb24gYW5kIGNsZWFyIGNvZGUgcGF0aHMgdG8gYWxsb3cgc3ViY2xhc3NlcyB0bwotICAgICAqIHJlc2V0IGFueSBvZiB0aGVpciBidWlsdGluIGZpZWxkcyBiYWNrIHRvIHRoZSBpbml0aWFsIHZhbHVlcy4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7Ci0gICAgICB1bmtub3duRmllbGRzID0gVW5rbm93bkZpZWxkU2V0LmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlIGZvciB0aGlzIHR5cGUuICBXZSBjYW4ndCBoYXZlIHRoZSBtZXNzYWdlCi0gICAgICogY2xhc3MgcGFzcyB0aGlzIGluIHRvIHRoZSBjb25zdHJ1Y3RvciBiZWNhdXNlIG9mIGJvb3RzdHJhcHBpbmcgdHJvdWJsZQotICAgICAqIHdpdGggRGVzY3JpcHRvclByb3Rvcy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYWJzdHJhY3QgRmllbGRBY2Nlc3NvclRhYmxlIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCk7Ci0KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7Ci0gICAgfQotCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChnZXRBbGxGaWVsZHNNdXRhYmxlKCkpOwotICAgIH0KLQotICAgIC8qKiBJbnRlcm5hbCBoZWxwZXIgd2hpY2ggcmV0dXJucyBhIG11dGFibGUgbWFwLiAqLwotICAgIHByaXZhdGUgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiBnZXRBbGxGaWVsZHNNdXRhYmxlKCkgewotICAgICAgZmluYWwgVHJlZU1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gcmVzdWx0ID0KLSAgICAgICAgbmV3IFRyZWVNYXA8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+KCk7Ci0gICAgICBmaW5hbCBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmRlc2NyaXB0b3I7Ci0gICAgICBmb3IgKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA6IGRlc2NyaXB0b3IuZ2V0RmllbGRzKCkpIHsKLSAgICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgIGZpbmFsIExpc3QgdmFsdWUgPSAoTGlzdCkgZ2V0RmllbGQoZmllbGQpOwotICAgICAgICAgIGlmICghdmFsdWUuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgICByZXN1bHQucHV0KGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChoYXNGaWVsZChmaWVsZCkpIHsKLSAgICAgICAgICAgIHJlc3VsdC5wdXQoZmllbGQsIGdldEZpZWxkKGZpZWxkKSk7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlckZvckZpZWxkKAotICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5uZXdCdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuaGFzKHRoaXMpOwotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBPYmplY3Qgb2JqZWN0ID0gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuZ2V0KHRoaXMpOwotICAgICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAvLyBUaGUgdW5kZXJseWluZyBsaXN0IG9iamVjdCBpcyBzdGlsbCBtb2RpZmlhYmxlIGF0IHRoaXMgcG9pbnQuCi0gICAgICAgIC8vIE1ha2Ugc3VyZSBub3QgdG8gZXhwb3NlIHRoZSBtb2RpZmlhYmxlIGxpc3QgdG8gdGhlIGNhbGxlci4KLSAgICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoKExpc3QpIG9iamVjdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gb2JqZWN0OwotICAgICAgfQotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBzZXRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuc2V0KHRoaXMsIHZhbHVlKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKS5jbGVhcih0aGlzKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICByZXR1cm4gaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkKLSAgICAgICAgICAuZ2V0UmVwZWF0ZWRDb3VudCh0aGlzKTsKLSAgICB9Ci0KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgIHJldHVybiBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQotICAgICAgICAgIC5nZXRSZXBlYXRlZCh0aGlzLCBpbmRleCk7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIHNldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBpbnRlcm5hbEdldEZpZWxkQWNjZXNzb3JUYWJsZSgpLmdldEZpZWxkKGZpZWxkKQotICAgICAgICAuc2V0UmVwZWF0ZWQodGhpcywgaW5kZXgsIHZhbHVlKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGFkZFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKS5nZXRGaWVsZChmaWVsZCkuYWRkUmVwZWF0ZWQodGhpcywgdmFsdWUpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICBwdWJsaWMgZmluYWwgQnVpbGRlclR5cGUgc2V0VW5rbm93bkZpZWxkcygKLSAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9IHVua25vd25GaWVsZHM7Ci0gICAgICBvbkNoYW5nZWQoKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGZpbmFsIEJ1aWxkZXJUeXBlIG1lcmdlVW5rbm93bkZpZWxkcygKLSAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpIHsKLSAgICAgIHRoaXMudW5rbm93bkZpZWxkcyA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKHRoaXMudW5rbm93bkZpZWxkcykKLSAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKQotICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgICAgZm9yIChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQgOiBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZpZWxkcygpKSB7Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KLSAgICAgICAgaWYgKGZpZWxkLmlzUmVxdWlyZWQoKSkgewotICAgICAgICAgIGlmICghaGFzRmllbGQoZmllbGQpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIC8vIENoZWNrIHRoYXQgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgotICAgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSBmaW5hbAotICAgICAgICAgICAgTGlzdDxNZXNzYWdlPiBtZXNzYWdlTGlzdCA9IChMaXN0PE1lc3NhZ2U+KSBnZXRGaWVsZChmaWVsZCk7Ci0gICAgICAgICAgICBmb3IgKGZpbmFsIE1lc3NhZ2UgZWxlbWVudCA6IG1lc3NhZ2VMaXN0KSB7Ci0gICAgICAgICAgICAgIGlmICghZWxlbWVudC5pc0luaXRpYWxpemVkKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgICAgIH0KLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgaWYgKGhhc0ZpZWxkKGZpZWxkKSAmJgotICAgICAgICAgICAgICAgICEoKE1lc3NhZ2UpIGdldEZpZWxkKGZpZWxkKSkuaXNJbml0aWFsaXplZCgpKSB7Ci0gICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIHB1YmxpYyBmaW5hbCBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpIHsKLSAgICAgIHJldHVybiB1bmtub3duRmllbGRzOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQuCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZVVua25vd25GaWVsZCgKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICBmaW5hbCBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHVua25vd25GaWVsZHMubWVyZ2VGaWVsZEZyb20odGFnLCBpbnB1dCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIEJ1aWxkZXJQYXJlbnR9IGZvciBnaXZpbmcgdG8gb3VyIGNoaWxkcmVuLiBUaGlzCi0gICAgICogc21hbGwgaW5uZXIgY2xhc3MgbWFrZXMgaXQgc28gd2UgZG9uJ3QgcHVibGljbHkgZXhwb3NlIHRoZSBCdWlsZGVyUGFyZW50Ci0gICAgICogbWV0aG9kcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIGNsYXNzIEJ1aWxkZXJQYXJlbnRJbXBsIGltcGxlbWVudHMgQnVpbGRlclBhcmVudCB7Ci0KLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgewotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXRzIHRoZSB7QGxpbmsgQnVpbGRlclBhcmVudH0gZm9yIGdpdmluZyB0byBvdXIgY2hpbGRyZW4uCi0gICAgICogQHJldHVybiBUaGUgYnVpbGRlciBwYXJlbnQgZm9yIG91ciBjaGlsZHJlbi4KLSAgICAgKi8KLSAgICBwcm90ZWN0ZWQgQnVpbGRlclBhcmVudCBnZXRQYXJlbnRGb3JDaGlsZHJlbigpIHsKLSAgICAgIGlmIChtZUFzUGFyZW50ID09IG51bGwpIHsKLSAgICAgICAgbWVBc1BhcmVudCA9IG5ldyBCdWlsZGVyUGFyZW50SW1wbCgpOwotICAgICAgfQotICAgICAgcmV0dXJuIG1lQXNQYXJlbnQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIHdoZW4gYSB0aGUgYnVpbGRlciBvciBvbmUgb2YgaXRzIG5lc3RlZCBjaGlsZHJlbiBoYXMgY2hhbmdlZAotICAgICAqIGFuZCBhbnkgcGFyZW50IHNob3VsZCBiZSBub3RpZmllZCBvZiBpdHMgaW52YWxpZGF0aW9uLgotICAgICAqLwotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIG9uQ2hhbmdlZCgpIHsKLSAgICAgIGlmIChpc0NsZWFuICYmIGJ1aWxkZXJQYXJlbnQgIT0gbnVsbCkgewotICAgICAgICBidWlsZGVyUGFyZW50Lm1hcmtEaXJ0eSgpOwotCi0gICAgICAgIC8vIERvbid0IGtlZXAgZGlzcGF0Y2hpbmcgaW52YWxpZGF0aW9ucyB1bnRpbCBidWlsZCBpcyBjYWxsZWQgYWdhaW4uCi0gICAgICAgIGlzQ2xlYW4gPSBmYWxzZTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBFeHRlbnNpb25zLXJlbGF0ZWQgc3R1ZmYKLQotICBwdWJsaWMgaW50ZXJmYWNlIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPAotICAgICAgTWVzc2FnZVR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlTWVzc2FnZT4gZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyIHsKLQotICAgIC8qKiBDaGVjayBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50LiAqLwotICAgIDxUeXBlPiBib29sZWFuIGhhc0V4dGVuc2lvbigKLSAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pOwotCi0gICAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIDxUeXBlPiBpbnQgZ2V0RXh0ZW5zaW9uQ291bnQoCi0gICAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKTsKLQotICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KLSAgICA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pOwotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCi0gICAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAotICAgICAgICBpbnQgaW5kZXgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgZm9yIG1lc3NhZ2UgdHlwZXMgdGhhdCBjb250YWluIGV4dGVuc2lvbiByYW5nZXMKLSAgICogc3ViY2xhc3MgdGhpcy4KLSAgICoKLSAgICogPHA+VGhpcyBjbGFzcyBpbXBsZW1lbnRzIHR5cGUtc2FmZSBhY2Nlc3NvcnMgZm9yIGV4dGVuc2lvbnMuICBUaGV5Ci0gICAqIGltcGxlbWVudCBhbGwgdGhlIHNhbWUgb3BlcmF0aW9ucyB0aGF0IHlvdSBjYW4gZG8gd2l0aCBub3JtYWwgZmllbGRzIC0tCi0gICAqIGUuZy4gImhhcyIsICJnZXQiLCBhbmQgImdldENvdW50IiAtLSBidXQgZm9yIGV4dGVuc2lvbnMuICBUaGUgZXh0ZW5zaW9ucwotICAgKiBhcmUgaWRlbnRpZmllZCB1c2luZyBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIHtAbGluayBHZW5lcmF0ZWRFeHRlbnNpb259OwotICAgKiB0aGUgcHJvdG9jb2wgY29tcGlsZXIgZ2VuZXJhdGVzIGEgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZm9yIGV2ZXJ5Ci0gICAqIGV4dGVuc2lvbiBpbiBpdHMgaW5wdXQuICBUaHJvdWdoIHRoZSBtYWdpYyBvZiBnZW5lcmljcywgYWxsIGlzIG1hZGUKLSAgICogdHlwZS1zYWZlLgotICAgKgotICAgKiA8cD5Gb3IgZXhhbXBsZSwgaW1hZ2luZSB5b3UgaGF2ZSB0aGUge0Bjb2RlIC5wcm90b30gZmlsZToKLSAgICoKLSAgICogPHByZT4KLSAgICogb3B0aW9uIGphdmFfY2xhc3MgPSAiTXlQcm90byI7Ci0gICAqCi0gICAqIG1lc3NhZ2UgRm9vIHsKLSAgICogICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotICAgKiB9Ci0gICAqCi0gICAqIGV4dGVuZCBGb28gewotICAgKiAgIG9wdGlvbmFsIGludDMyIGJhcjsKLSAgICogfQotICAgKiA8L3ByZT4KLSAgICoKLSAgICogPHA+VGhlbiB5b3UgbWlnaHQgd3JpdGUgY29kZSBsaWtlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBNeVByb3RvLkZvbyBmb28gPSBnZXRGb28oKTsKLSAgICogaW50IGkgPSBmb28uZ2V0RXh0ZW5zaW9uKE15UHJvdG8uYmFyKTsKLSAgICogPC9wcmU+Ci0gICAqCi0gICAqIDxwPlNlZSBhbHNvIHtAbGluayBFeHRlbmRhYmxlQnVpbGRlcn0uCi0gICAqLwotICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEV4dGVuZGFibGVNZXNzYWdlPAotICAgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPgotICAgICAgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlCi0gICAgICBpbXBsZW1lbnRzIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPE1lc3NhZ2VUeXBlPiB7Ci0KLSAgICBwcml2YXRlIGZpbmFsIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9uczsKLQotICAgIHByb3RlY3RlZCBFeHRlbmRhYmxlTWVzc2FnZSgpIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IEZpZWxkU2V0Lm5ld0ZpZWxkU2V0KCk7Ci0gICAgfQotCi0gICAgcHJvdGVjdGVkIEV4dGVuZGFibGVNZXNzYWdlKAotICAgICAgICBFeHRlbmRhYmxlQnVpbGRlcjxNZXNzYWdlVHlwZSwgPz4gYnVpbGRlcikgewotICAgICAgc3VwZXIoYnVpbGRlcik7Ci0gICAgICB0aGlzLmV4dGVuc2lvbnMgPSBidWlsZGVyLmJ1aWxkRXh0ZW5zaW9ucygpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZSgKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKLSAgICAgIGlmIChleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkgIT0KLSAgICAgICAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpKSB7Ci0gICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNvbWVvbmUgdXNlcyB1bmNoZWNrZWQgb3BlcmF0aW9ucy4KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRXh0ZW5zaW9uIGlzIGZvciB0eXBlIFwiIiArCi0gICAgICAgICAgZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRDb250YWluaW5nVHlwZSgpLmdldEZ1bGxOYW1lKCkgKwotICAgICAgICAgICJcIiB3aGljaCBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUgXCIiICsKLSAgICAgICAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZ1bGxOYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIGEgc2luZ3VsYXIgZXh0ZW5zaW9uIGlzIHByZXNlbnQuICovCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBib29sZWFuIGhhc0V4dGVuc2lvbigKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pIHsKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5oYXNGaWVsZChleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBpbnQgZ2V0RXh0ZW5zaW9uQ291bnQoCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICByZXR1cm4gKFR5cGUpIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSgKLSAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiwKLSAgICAgICAgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoCi0gICAgICAgICAgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IsIGluZGV4KSk7Ci0gICAgfQotCi0gICAgLyoqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIGNoZWNrIGlmIGFsbCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZC4gKi8KLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBleHRlbnNpb25zQXJlSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5pc0luaXRpYWxpemVkKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiBzdXBlci5pc0luaXRpYWxpemVkKCkgJiYgZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVXNlZCBieSBzdWJjbGFzc2VzIHRvIHNlcmlhbGl6ZSBleHRlbnNpb25zLiAgRXh0ZW5zaW9uIHJhbmdlcyBtYXkgYmUKLSAgICAgKiBpbnRlcmxlYXZlZCB3aXRoIGZpZWxkIG51bWJlcnMsIGJ1dCB3ZSBtdXN0IHdyaXRlIHRoZW0gaW4gY2Fub25pY2FsCi0gICAgICogKHNvcnRlZCBieSBmaWVsZCBudW1iZXIpIG9yZGVyLiAgRXh0ZW5zaW9uV3JpdGVyIGhlbHBzIHVzIHdyaXRlCi0gICAgICogaW5kaXZpZHVhbCByYW5nZXMgb2YgZXh0ZW5zaW9ucyBhdCBvbmNlLgotICAgICAqLwotICAgIHByb3RlY3RlZCBjbGFzcyBFeHRlbnNpb25Xcml0ZXIgewotICAgICAgLy8gSW1hZ2luZSBob3cgbXVjaCBzaW1wbGVyIHRoaXMgY29kZSB3b3VsZCBiZSBpZiBKYXZhIGl0ZXJhdG9ycyBoYWQKLSAgICAgIC8vIGEgd2F5IHRvIGdldCB0aGUgbmV4dCBlbGVtZW50IHdpdGhvdXQgYWR2YW5jaW5nIHRoZSBpdGVyYXRvci4KLQotICAgICAgcHJpdmF0ZSBmaW5hbCBJdGVyYXRvcjxNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+PiBpdGVyID0KLSAgICAgICAgZXh0ZW5zaW9ucy5pdGVyYXRvcigpOwotICAgICAgcHJpdmF0ZSBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IG5leHQ7Ci0gICAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gbWVzc2FnZVNldFdpcmVGb3JtYXQ7Ci0KLSAgICAgIHByaXZhdGUgRXh0ZW5zaW9uV3JpdGVyKGZpbmFsIGJvb2xlYW4gbWVzc2FnZVNldFdpcmVGb3JtYXQpIHsKLSAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgbmV4dCA9IGl0ZXIubmV4dCgpOwotICAgICAgICB9Ci0gICAgICAgIHRoaXMubWVzc2FnZVNldFdpcmVGb3JtYXQgPSBtZXNzYWdlU2V0V2lyZUZvcm1hdDsKLSAgICAgIH0KLQotICAgICAgcHVibGljIHZvaWQgd3JpdGVVbnRpbChmaW5hbCBpbnQgZW5kLCBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAgIHdoaWxlIChuZXh0ICE9IG51bGwgJiYgbmV4dC5nZXRLZXkoKS5nZXROdW1iZXIoKSA8IGVuZCkgewotICAgICAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gbmV4dC5nZXRLZXkoKTsKLSAgICAgICAgICBpZiAobWVzc2FnZVNldFdpcmVGb3JtYXQgJiYgZGVzY3JpcHRvci5nZXRMaXRlSmF2YVR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdC5KYXZhVHlwZS5NRVNTQUdFICYmCi0gICAgICAgICAgICAgICFkZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihkZXNjcmlwdG9yLmdldE51bWJlcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTWVzc2FnZSkgbmV4dC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRmllbGRTZXQud3JpdGVGaWVsZChkZXNjcmlwdG9yLCBuZXh0LmdldFZhbHVlKCksIG91dHB1dCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIGlmIChpdGVyLmhhc05leHQoKSkgewotICAgICAgICAgICAgbmV4dCA9IGl0ZXIubmV4dCgpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBuZXh0ID0gbnVsbDsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIG5ld0V4dGVuc2lvbldyaXRlcigpIHsKLSAgICAgIHJldHVybiBuZXcgRXh0ZW5zaW9uV3JpdGVyKGZhbHNlKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIEV4dGVuc2lvbldyaXRlciBuZXdNZXNzYWdlU2V0RXh0ZW5zaW9uV3JpdGVyKCkgewotICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIodHJ1ZSk7Ci0gICAgfQotCi0gICAgLyoqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIGNvbXB1dGUgdGhlIHNpemUgb2YgZXh0ZW5zaW9ucy4gKi8KLSAgICBwcm90ZWN0ZWQgaW50IGV4dGVuc2lvbnNTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgfQotICAgIHByb3RlY3RlZCBpbnQgZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0KCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0TWVzc2FnZVNldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmbGVjdGlvbgotCi0gICAgcHJvdGVjdGVkIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0RXh0ZW5zaW9uRmllbGRzKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0QWxsRmllbGRzKCk7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgZmluYWwgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiByZXN1bHQgPSBzdXBlci5nZXRBbGxGaWVsZHNNdXRhYmxlKCk7Ci0gICAgICByZXN1bHQucHV0QWxsKGdldEV4dGVuc2lvbkZpZWxkcygpKTsKLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAocmVzdWx0KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc0ZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPSBleHRlbnNpb25zLmdldEZpZWxkKGZpZWxkKTsKLSAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICAgICAgLy8gTGFja2luZyBhbiBFeHRlbnNpb25SZWdpc3RyeSwgd2UgaGF2ZSBubyB3YXkgdG8gZGV0ZXJtaW5lIHRoZQotICAgICAgICAgICAgLy8gZXh0ZW5zaW9uJ3MgcmVhbCB0eXBlLCBzbyB3ZSByZXR1cm4gYSBEeW5hbWljTWVzc2FnZS4KLSAgICAgICAgICAgIHJldHVybiBEeW5hbWljTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoZmllbGQuZ2V0TWVzc2FnZVR5cGUoKSk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIHJldHVybiBmaWVsZC5nZXREZWZhdWx0VmFsdWUoKTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0RmllbGQoZmllbGQpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgICAgdmVyaWZ5Q29udGFpbmluZ1R5cGUoZmllbGQpOwotICAgICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgaWYgKGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICJGaWVsZERlc2NyaXB0b3IgZG9lcyBub3QgbWF0Y2ggbWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZW5lcmF0ZWQgbWVzc2FnZSBidWlsZGVycyBmb3IgbWVzc2FnZSB0eXBlcyB0aGF0IGNvbnRhaW4gZXh0ZW5zaW9uIHJhbmdlcwotICAgKiBzdWJjbGFzcyB0aGlzLgotICAgKgotICAgKiA8cD5UaGlzIGNsYXNzIGltcGxlbWVudHMgdHlwZS1zYWZlIGFjY2Vzc29ycyBmb3IgZXh0ZW5zaW9ucy4gIFRoZXkKLSAgICogaW1wbGVtZW50IGFsbCB0aGUgc2FtZSBvcGVyYXRpb25zIHRoYXQgeW91IGNhbiBkbyB3aXRoIG5vcm1hbCBmaWVsZHMgLS0KLSAgICogZS5nLiAiZ2V0IiwgInNldCIsIGFuZCAiYWRkIiAtLSBidXQgZm9yIGV4dGVuc2lvbnMuICBUaGUgZXh0ZW5zaW9ucyBhcmUKLSAgICogaWRlbnRpZmllZCB1c2luZyBpbnN0YW5jZXMgb2YgdGhlIGNsYXNzIHtAbGluayBHZW5lcmF0ZWRFeHRlbnNpb259OyB0aGUKLSAgICogcHJvdG9jb2wgY29tcGlsZXIgZ2VuZXJhdGVzIGEgc3RhdGljIGluc3RhbmNlIG9mIHRoaXMgY2xhc3MgZm9yIGV2ZXJ5Ci0gICAqIGV4dGVuc2lvbiBpbiBpdHMgaW5wdXQuICBUaHJvdWdoIHRoZSBtYWdpYyBvZiBnZW5lcmljcywgYWxsIGlzIG1hZGUKLSAgICogdHlwZS1zYWZlLgotICAgKgotICAgKiA8cD5Gb3IgZXhhbXBsZSwgaW1hZ2luZSB5b3UgaGF2ZSB0aGUge0Bjb2RlIC5wcm90b30gZmlsZToKLSAgICoKLSAgICogPHByZT4KLSAgICogb3B0aW9uIGphdmFfY2xhc3MgPSAiTXlQcm90byI7Ci0gICAqCi0gICAqIG1lc3NhZ2UgRm9vIHsKLSAgICogICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OwotICAgKiB9Ci0gICAqCi0gICAqIGV4dGVuZCBGb28gewotICAgKiAgIG9wdGlvbmFsIGludDMyIGJhcjsKLSAgICogfQotICAgKiA8L3ByZT4KLSAgICoKLSAgICogPHA+VGhlbiB5b3UgbWlnaHQgd3JpdGUgY29kZSBsaWtlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBNeVByb3RvLkZvbyBmb28gPQotICAgKiAgIE15UHJvdG8uRm9vLm5ld0J1aWxkZXIoKQotICAgKiAgICAgLnNldEV4dGVuc2lvbihNeVByb3RvLmJhciwgMTIzKQotICAgKiAgICAgLmJ1aWxkKCk7Ci0gICAqIDwvcHJlPgotICAgKgotICAgKiA8cD5TZWUgYWxzbyB7QGxpbmsgRXh0ZW5kYWJsZU1lc3NhZ2V9LgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRXh0ZW5kYWJsZUJ1aWxkZXI8Ci0gICAgICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2UsCi0gICAgICAgIEJ1aWxkZXJUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZUJ1aWxkZXI+Ci0gICAgICBleHRlbmRzIEJ1aWxkZXI8QnVpbGRlclR5cGU+Ci0gICAgICBpbXBsZW1lbnRzIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPE1lc3NhZ2VUeXBlPiB7Ci0KLSAgICBwcml2YXRlIEZpZWxkU2V0PEZpZWxkRGVzY3JpcHRvcj4gZXh0ZW5zaW9ucyA9IEZpZWxkU2V0LmVtcHR5U2V0KCk7Ci0KLSAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZUJ1aWxkZXIoKSB7fQotCi0gICAgcHJvdGVjdGVkIEV4dGVuZGFibGVCdWlsZGVyKAotICAgICAgICBCdWlsZGVyUGFyZW50IHBhcmVudCkgewotICAgICAgc3VwZXIocGFyZW50KTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7Ci0gICAgICBleHRlbnNpb25zID0gRmllbGRTZXQuZW1wdHlTZXQoKTsKLSAgICAgIHJldHVybiBzdXBlci5jbGVhcigpOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBvbmx5IHRvIHdvcmsgYXJvdW5kIGFuIGFwcGFyZW50IGJ1ZyBpbiB0aGUKLSAgICAvLyBKYXZhIGNvbXBpbGVyIGFuZC9vciBidWlsZCBzeXN0ZW0uICBTZWUgYnVnICMxODk4NDYzLiAgVGhlIG1lcmUgcHJlc2VuY2UKLSAgICAvLyBvZiB0aGlzIGR1bW15IGNsb25lKCkgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgZ28gYXdheS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xvbmUoKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIlRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiIpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCkgewotICAgICAgaWYgKGV4dGVuc2lvbnMuaXNJbW11dGFibGUoKSkgewotICAgICAgICBleHRlbnNpb25zID0gZXh0ZW5zaW9ucy5jbG9uZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZSgKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKLSAgICAgIGlmIChleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpLmdldENvbnRhaW5pbmdUeXBlKCkgIT0KLSAgICAgICAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpKSB7Ci0gICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNvbWVvbmUgdXNlcyB1bmNoZWNrZWQgb3BlcmF0aW9ucy4KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRXh0ZW5zaW9uIGlzIGZvciB0eXBlIFwiIiArCi0gICAgICAgICAgZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXRDb250YWluaW5nVHlwZSgpLmdldEZ1bGxOYW1lKCkgKwotICAgICAgICAgICJcIiB3aGljaCBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUgXCIiICsKLSAgICAgICAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEZ1bGxOYW1lKCkgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIGEgc2luZ3VsYXIgZXh0ZW5zaW9uIGlzIHByZXNlbnQuICovCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBib29sZWFuIGhhc0V4dGVuc2lvbigKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pIHsKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5oYXNGaWVsZChleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpKTsKLSAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBpbnQgZ2V0RXh0ZW5zaW9uQ291bnQoCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uKSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICBpZiAoZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICByZXR1cm4gKFR5cGUpIENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgaWYgKGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PQotICAgICAgICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSgKLSAgICAgICAgICAgICAgZGVzY3JpcHRvci5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9uLmZyb21SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiwKLSAgICAgICAgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb24uc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoCi0gICAgICAgICAgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IsIGluZGV4KSk7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbiwKLSAgICAgICAgZmluYWwgVHlwZSB2YWx1ZSkgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZGVzY3JpcHRvciwgZXh0ZW5zaW9uLnRvUmVmbGVjdGlvblR5cGUodmFsdWUpKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKiogU2V0IHRoZSB2YWx1ZSBvZiBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIHNldEV4dGVuc2lvbigKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCi0gICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgVHlwZSB2YWx1ZSkgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIGV4dGVuc2lvbnMuc2V0UmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgZGVzY3JpcHRvciwgaW5kZXgsCi0gICAgICAgIGV4dGVuc2lvbi5zaW5ndWxhclRvUmVmbGVjdGlvblR5cGUodmFsdWUpKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKiogQXBwZW5kIGEgdmFsdWUgdG8gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBhZGRFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAotICAgICAgICBmaW5hbCBUeXBlIHZhbHVlKSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBleHRlbnNpb24uZ2V0RGVzY3JpcHRvcigpOwotICAgICAgZXh0ZW5zaW9ucy5hZGRSZXBlYXRlZEZpZWxkKAotICAgICAgICAgIGRlc2NyaXB0b3IsIGV4dGVuc2lvbi5zaW5ndWxhclRvUmVmbGVjdGlvblR5cGUodmFsdWUpKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICB9Ci0KLSAgICAvKiogQ2xlYXIgYW4gZXh0ZW5zaW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgY2xlYXJFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgPz4gZXh0ZW5zaW9uKSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgZXh0ZW5zaW9ucy5jbGVhckZpZWxkKGV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkpOwotICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBjaGVjayBpZiBhbGwgZXh0ZW5zaW9ucyBhcmUgaW5pdGlhbGl6ZWQuICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaXNJbml0aWFsaXplZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgYnVpbGQgY29kZSBwYXRoIHRvIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGV4dGVuc2lvbnMgZm9yCi0gICAgICogYnVpbGRpbmcgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWVsZFNldDxGaWVsZERlc2NyaXB0b3I+IGJ1aWxkRXh0ZW5zaW9ucygpIHsKLSAgICAgIGV4dGVuc2lvbnMubWFrZUltbXV0YWJsZSgpOwotICAgICAgcmV0dXJuIGV4dGVuc2lvbnM7Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiBzdXBlci5pc0luaXRpYWxpemVkKCkgJiYgZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gcGFyc2UgYW4gdW5rbm93biBmaWVsZCBvciBhbiBleHRlbnNpb24uCi0gICAgICogQHJldHVybiB7QGNvZGUgdHJ1ZX0gdW5sZXNzIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwIHRhZy4KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwcm90ZWN0ZWQgYm9vbGVhbiBwYXJzZVVua25vd25GaWVsZCgKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0LkJ1aWxkZXIgdW5rbm93bkZpZWxkcywKLSAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICBmaW5hbCBpbnQgdGFnKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyLm1lcmdlRmllbGRGcm9tKAotICAgICAgICBpbnB1dCwgdW5rbm93bkZpZWxkcywgZXh0ZW5zaW9uUmVnaXN0cnksIHRoaXMsIHRhZyk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gUmVmbGVjdGlvbgotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIE1hcDxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgZmluYWwgTWFwPEZpZWxkRGVzY3JpcHRvciwgT2JqZWN0PiByZXN1bHQgPSBzdXBlci5nZXRBbGxGaWVsZHNNdXRhYmxlKCk7Ci0gICAgICByZXN1bHQucHV0QWxsKGV4dGVuc2lvbnMuZ2V0QWxsRmllbGRzKCkpOwotICAgICAgcmV0dXJuIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChyZXN1bHQpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZmllbGQpOwotICAgICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgICAvLyBMYWNraW5nIGFuIEV4dGVuc2lvblJlZ2lzdHJ5LCB3ZSBoYXZlIG5vIHdheSB0byBkZXRlcm1pbmUgdGhlCi0gICAgICAgICAgICAvLyBleHRlbnNpb24ncyByZWFsIHR5cGUsIHNvIHdlIHJldHVybiBhIER5bmFtaWNNZXNzYWdlLgotICAgICAgICAgICAgcmV0dXJuIER5bmFtaWNNZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZShmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgcmV0dXJuIGZpZWxkLmdldERlZmF1bHRWYWx1ZSgpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5nZXRGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChmaWVsZCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmdldFJlcGVhdGVkRmllbGQoZmllbGQsIGluZGV4KTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLmhhc0ZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgc2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgICBleHRlbnNpb25zLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgIG9uQ2hhbmdlZCgpOwotICAgICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHN1cGVyLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIGNsZWFyRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgICAgZXh0ZW5zaW9ucy5jbGVhckZpZWxkKGZpZWxkKTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuY2xlYXJGaWVsZChmaWVsZCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEJ1aWxkZXJUeXBlIHNldFJlcGVhdGVkRmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICB2ZXJpZnlDb250YWluaW5nVHlwZShmaWVsZCk7Ci0gICAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgICAgZXh0ZW5zaW9ucy5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpOwotICAgICAgICBvbkNoYW5nZWQoKTsKLSAgICAgICAgcmV0dXJuIChCdWlsZGVyVHlwZSkgdGhpczsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzdXBlci5zZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBhZGRSZXBlYXRlZEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIGlmIChmaWVsZC5pc0V4dGVuc2lvbigpKSB7Ci0gICAgICAgIHZlcmlmeUNvbnRhaW5pbmdUeXBlKGZpZWxkKTsKLSAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgICAgb25DaGFuZ2VkKCk7Ci0gICAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gc3VwZXIuYWRkUmVwZWF0ZWRGaWVsZChmaWVsZCwgdmFsdWUpOwotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBmaW5hbCB2b2lkIG1lcmdlRXh0ZW5zaW9uRmllbGRzKGZpbmFsIEV4dGVuZGFibGVNZXNzYWdlIG90aGVyKSB7Ci0gICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7Ci0gICAgICBleHRlbnNpb25zLm1lcmdlRnJvbShvdGhlci5leHRlbnNpb25zKTsKLSAgICAgIG9uQ2hhbmdlZCgpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlDb250YWluaW5nVHlwZShmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpICE9IGdldERlc2NyaXB0b3JGb3JUeXBlKCkpIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiRmllbGREZXNjcmlwdG9yIGRvZXMgbm90IG1hdGNoIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBkZXNjcmlwdG9yIGZvciBhbiBleHRlbnNpb24uIFRoZSBpbXBsZW1lbnRhdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIKLSAgICogdGhlIGV4dGVuc2lvbiBpcyBzY29wZWQgaW4gdGhlIHRvcCBsZXZlbCBvZiBhIGZpbGUgb3Igc2NvcGVkIGluIGEgTWVzc2FnZS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGludGVyZmFjZSBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIHsKLSAgICBGaWVsZERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpOwotICB9Ci0KLSAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KLSAgcHVibGljIHN0YXRpYyA8Q29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlLCBUeXBlPgotICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPgotICAgICAgbmV3TWVzc2FnZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbihmaW5hbCBNZXNzYWdlIHNjb3BlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgZGVzY3JpcHRvckluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBDbGFzcyBzaW5ndWxhclR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UgZGVmYXVsdEluc3RhbmNlKSB7Ci0gICAgLy8gRm9yIGV4dGVuc2lvbnMgc2NvcGVkIHdpdGhpbiBhIE1lc3NhZ2UsIHdlIHVzZSB0aGUgTWVzc2FnZSB0byByZXNvbHZlCi0gICAgLy8gdGhlIG91dGVyIGNsYXNzJ3MgZGVzY3JpcHRvciwgZnJvbSB3aGljaCB0aGUgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgaXMKLSAgICAvLyBvYnRhaW5lZC4KLSAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCi0gICAgICAgIG5ldyBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyKCkgewotICAgICAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgICAgIHB1YmxpYyBGaWVsZERlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvcigpIHsKLSAgICAgICAgICAgIHJldHVybiBzY29wZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpLmdldEV4dGVuc2lvbnMoKQotICAgICAgICAgICAgICAgIC5nZXQoZGVzY3JpcHRvckluZGV4KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0sCi0gICAgICAgIHNpbmd1bGFyVHlwZSwKLSAgICAgICAgZGVmYXVsdEluc3RhbmNlKTsKLSAgfQotCi0gIC8qKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICovCi0gIHB1YmxpYyBzdGF0aWMgPENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZSwgVHlwZT4KLSAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPgotICAgICBuZXdGaWxlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKGZpbmFsIENsYXNzIHNpbmd1bGFyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlIGRlZmF1bHRJbnN0YW5jZSkgewotICAgIC8vIEZvciBleHRlbnNpb25zIHNjb3BlZCB3aXRoaW4gYSBmaWxlLCB3ZSByZWx5IG9uIHRoZSBvdXRlciBjbGFzcydzCi0gICAgLy8gc3RhdGljIGluaXRpYWxpemVyIHRvIGNhbGwgaW50ZXJuYWxJbml0KCkgb24gdGhlIGV4dGVuc2lvbiB3aGVuIHRoZQotICAgIC8vIGRlc2NyaXB0b3IgaXMgYXZhaWxhYmxlLgotICAgIHJldHVybiBuZXcgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPigKLSAgICAgICAgbnVsbCwgIC8vIEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIgaXMgaW5pdGlhbGl6ZWQgaW4gaW50ZXJuYWxJbml0KCk7Ci0gICAgICAgIHNpbmd1bGFyVHlwZSwKLSAgICAgICAgZGVmYXVsdEluc3RhbmNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBUeXBlIHVzZWQgdG8gcmVwcmVzZW50IGdlbmVyYXRlZCBleHRlbnNpb25zLiAgVGhlIHByb3RvY29sIGNvbXBpbGVyCi0gICAqIGdlbmVyYXRlcyBhIHN0YXRpYyBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgdGhpcyBjbGFzcyBmb3IgZWFjaCBleHRlbnNpb24uCi0gICAqCi0gICAqIDxwPkZvciBleGFtcGxlLCBpbWFnaW5lIHlvdSBoYXZlIHRoZSB7QGNvZGUgLnByb3RvfSBmaWxlOgotICAgKgotICAgKiA8cHJlPgotICAgKiBvcHRpb24gamF2YV9jbGFzcyA9ICJNeVByb3RvIjsKLSAgICoKLSAgICogbWVzc2FnZSBGb28gewotICAgKiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7Ci0gICAqIH0KLSAgICoKLSAgICogZXh0ZW5kIEZvbyB7Ci0gICAqICAgb3B0aW9uYWwgaW50MzIgYmFyOwotICAgKiB9Ci0gICAqIDwvcHJlPgotICAgKgotICAgKiA8cD5UaGVuLCB7QGNvZGUgTXlQcm90by5Gb28uYmFyfSBoYXMgdHlwZQotICAgKiB7QGNvZGUgR2VuZXJhdGVkRXh0ZW5zaW9uPE15UHJvdG8uRm9vLCBJbnRlZ2VyPn0uCi0gICAqCi0gICAqIDxwPkluIGdlbmVyYWwsIHVzZXJzIHNob3VsZCBpZ25vcmUgdGhlIGRldGFpbHMgb2YgdGhpcyB0eXBlLCBhbmQgc2ltcGx5IHVzZQotICAgKiB0aGVzZSBzdGF0aWMgc2luZ2xldG9ucyBhcyBwYXJhbWV0ZXJzIHRvIHRoZSBleHRlbnNpb24gYWNjZXNzb3JzIGRlZmluZWQKLSAgICogaW4ge0BsaW5rIEV4dGVuZGFibGVNZXNzYWdlfSBhbmQge0BsaW5rIEV4dGVuZGFibGVCdWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgR2VuZXJhdGVkRXh0ZW5zaW9uPAotICAgICAgQ29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlLCBUeXBlPiB7Ci0gICAgLy8gVE9ETyhrZW50b24pOiAgRmluZCB3YXlzIHRvIGF2b2lkIHVzaW5nIEphdmEgcmVmbGVjdGlvbiB3aXRoaW4gdGhpcwotICAgIC8vICAgY2xhc3MuICBBbHNvIHRyeSB0byBhdm9pZCBzdXBwcmVzc2luZyB1bmNoZWNrZWQgd2FybmluZ3MuCi0KLSAgICAvLyBXZSBjYW4ndCBhbHdheXMgaW5pdGlhbGl6ZSB0aGUgZGVzY3JpcHRvciBvZiBhIEdlbmVyYXRlZEV4dGVuc2lvbiB3aGVuCi0gICAgLy8gd2UgZmlyc3QgY29uc3RydWN0IGl0IGR1ZSB0byBpbml0aWFsaXphdGlvbiBvcmRlciBkaWZmaWN1bHRpZXMgKG5hbWVseSwKLSAgICAvLyB0aGUgZGVzY3JpcHRvciBtYXkgbm90IGhhdmUgYmVlbiBjb25zdHJ1Y3RlZCB5ZXQsIHNpbmNlIGl0IGlzIG9mdGVuCi0gICAgLy8gY29uc3RydWN0ZWQgYnkgdGhlIGluaXRpYWxpemVyIG9mIGEgc2VwYXJhdGUgbW9kdWxlKS4KLSAgICAvLwotICAgIC8vIEluIHRoZSBjYXNlIG9mIG5lc3RlZCBleHRlbnNpb25zLCB3ZSBpbml0aWFsaXplIHRoZQotICAgIC8vIEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIgd2l0aCBhbiBpbnN0YW5jZSB0aGF0IHVzZXMgdGhlIHNjb3BpbmcKLSAgICAvLyBNZXNzYWdlJ3MgZGVmYXVsdCBpbnN0YW5jZSB0byByZXRyaWV2ZSB0aGUgZXh0ZW5zaW9uJ3MgZGVzY3JpcHRvci4KLSAgICAvLwotICAgIC8vIEluIHRoZSBjYXNlIG9mIG5vbi1uZXN0ZWQgZXh0ZW5zaW9ucywgd2UgaW5pdGlhbGl6ZSB0aGUKLSAgICAvLyBFeHRlbnNpb25EZXNjcmlwdG9yUmV0cmlldmVyIHRvIG51bGwgYW5kIHJlbHkgb24gdGhlIG91dGVyIGNsYXNzJ3Mgc3RhdGljCi0gICAgLy8gaW5pdGlhbGl6ZXIgdG8gY2FsbCBpbnRlcm5hbEluaXQoKSBhZnRlciB0aGUgZGVzY3JpcHRvciBoYXMgYmVlbiBwYXJzZWQuCi0gICAgcHJpdmF0ZSBHZW5lcmF0ZWRFeHRlbnNpb24oRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciBkZXNjcmlwdG9yUmV0cmlldmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzIHNpbmd1bGFyVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UpIHsKLSAgICAgIGlmIChNZXNzYWdlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oc2luZ3VsYXJUeXBlKSAmJgotICAgICAgICAgICFzaW5ndWxhclR5cGUuaXNJbnN0YW5jZShtZXNzYWdlRGVmYXVsdEluc3RhbmNlKSkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIkJhZCBtZXNzYWdlRGVmYXVsdEluc3RhbmNlIGZvciAiICsgc2luZ3VsYXJUeXBlLmdldE5hbWUoKSk7Ci0gICAgICB9Ci0gICAgICB0aGlzLmRlc2NyaXB0b3JSZXRyaWV2ZXIgPSBkZXNjcmlwdG9yUmV0cmlldmVyOwotICAgICAgdGhpcy5zaW5ndWxhclR5cGUgPSBzaW5ndWxhclR5cGU7Ci0gICAgICB0aGlzLm1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UgPSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlOwotCi0gICAgICBpZiAoUHJvdG9jb2xNZXNzYWdlRW51bS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKHNpbmd1bGFyVHlwZSkpIHsKLSAgICAgICAgdGhpcy5lbnVtVmFsdWVPZiA9IGdldE1ldGhvZE9yRGllKHNpbmd1bGFyVHlwZSwgInZhbHVlT2YiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRW51bVZhbHVlRGVzY3JpcHRvci5jbGFzcyk7Ci0gICAgICAgIHRoaXMuZW51bUdldFZhbHVlRGVzY3JpcHRvciA9Ci0gICAgICAgICAgICBnZXRNZXRob2RPckRpZShzaW5ndWxhclR5cGUsICJnZXRWYWx1ZURlc2NyaXB0b3IiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRoaXMuZW51bVZhbHVlT2YgPSBudWxsOwotICAgICAgICB0aGlzLmVudW1HZXRWYWx1ZURlc2NyaXB0b3IgPSBudWxsOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICovCi0gICAgcHVibGljIHZvaWQgaW50ZXJuYWxJbml0KGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvclJldHJpZXZlciAhPSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oIkFscmVhZHkgaW5pdGlhbGl6ZWQuIik7Ci0gICAgICB9Ci0gICAgICBkZXNjcmlwdG9yUmV0cmlldmVyID0gbmV3IEV4dGVuc2lvbkRlc2NyaXB0b3JSZXRyaWV2ZXIoKSB7Ci0gICAgICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgICAgICAgcHVibGljIEZpZWxkRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yKCkgewotICAgICAgICAgICAgcmV0dXJuIGRlc2NyaXB0b3I7Ci0gICAgICAgICAgfQotICAgICAgICB9OwotICAgIH0KLQotICAgIHByaXZhdGUgRXh0ZW5zaW9uRGVzY3JpcHRvclJldHJpZXZlciBkZXNjcmlwdG9yUmV0cmlldmVyOwotICAgIHByaXZhdGUgZmluYWwgQ2xhc3Mgc2luZ3VsYXJUeXBlOwotICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGVudW1WYWx1ZU9mOwotICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIGVudW1HZXRWYWx1ZURlc2NyaXB0b3I7Ci0KLSAgICBwdWJsaWMgRmllbGREZXNjcmlwdG9yIGdldERlc2NyaXB0b3IoKSB7Ci0gICAgICBpZiAoZGVzY3JpcHRvclJldHJpZXZlciA9PSBudWxsKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgICAiZ2V0RGVzY3JpcHRvcigpIGNhbGxlZCBiZWZvcmUgaW50ZXJuYWxJbml0KCkiKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBkZXNjcmlwdG9yUmV0cmlldmVyLmdldERlc2NyaXB0b3IoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgZXh0ZW5zaW9uIGlzIGFuIGVtYmVkZGVkIG1lc3NhZ2Ugb3IgZ3JvdXAsIHJldHVybnMgdGhlIGRlZmF1bHQKLSAgICAgKiBpbnN0YW5jZSBvZiB0aGUgbWVzc2FnZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZSBnZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgewotICAgICAgcmV0dXJuIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2U7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVydCBmcm9tIHRoZSB0eXBlIHVzZWQgYnkgdGhlIHJlZmxlY3Rpb24gYWNjZXNzb3JzIHRvIHRoZSB0eXBlIHVzZWQKLSAgICAgKiBieSBuYXRpdmUgYWNjZXNzb3JzLiAgRS5nLiwgZm9yIGVudW1zLCB0aGUgcmVmbGVjdGlvbiBhY2Nlc3NvcnMgdXNlCi0gICAgICogRW51bVZhbHVlRGVzY3JpcHRvcnMgYnV0IHRoZSBuYXRpdmUgYWNjZXNzb3JzIHVzZSB0aGUgZ2VuZXJhdGVkIGVudW0KLSAgICAgKiB0eXBlLgotICAgICAqLwotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHByaXZhdGUgT2JqZWN0IGZyb21SZWZsZWN0aW9uVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOwotICAgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UgfHwKLSAgICAgICAgICAgIGRlc2NyaXB0b3IuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuRU5VTSkgewotICAgICAgICAgIC8vIE11c3QgY29udmVydCB0aGUgd2hvbGUgbGlzdC4KLSAgICAgICAgICBmaW5hbCBMaXN0IHJlc3VsdCA9IG5ldyBBcnJheUxpc3QoKTsKLSAgICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHZhbHVlKSB7Ci0gICAgICAgICAgICByZXN1bHQuYWRkKHNpbmd1bGFyRnJvbVJlZmxlY3Rpb25UeXBlKGVsZW1lbnQpKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBzaW5ndWxhckZyb21SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI2Zyb21SZWZsZWN0aW9uVHlwZShPYmplY3QpfSwgYnV0IGlmIHRoZSB0eXBlIGlzIGEgcmVwZWF0ZWQKLSAgICAgKiB0eXBlLCB0aGlzIGNvbnZlcnRzIGEgc2luZ2xlIGVsZW1lbnQuCi0gICAgICovCi0gICAgcHJpdmF0ZSBPYmplY3Qgc2luZ3VsYXJGcm9tUmVmbGVjdGlvblR5cGUoZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciA9IGdldERlc2NyaXB0b3IoKTsKLSAgICAgIHN3aXRjaCAoZGVzY3JpcHRvci5nZXRKYXZhVHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgICBpZiAoc2luZ3VsYXJUeXBlLmlzSW5zdGFuY2UodmFsdWUpKSB7Ci0gICAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIC8vIEl0IHNlZW1zIHRoZSBjb3B5IG9mIHRoZSBlbWJlZGRlZCBtZXNzYWdlIHN0b3JlZCBpbnNpZGUgdGhlCi0gICAgICAgICAgICAvLyBleHRlbmRlZCBtZXNzYWdlIGlzIG5vdCBvZiB0aGUgZXhhY3QgdHlwZSB0aGUgdXNlciB3YXMKLSAgICAgICAgICAgIC8vIGV4cGVjdGluZy4gIFRoaXMgY2FuIGhhcHBlbiBpZiBhIHVzZXIgZGVmaW5lcyBhCi0gICAgICAgICAgICAvLyBHZW5lcmF0ZWRFeHRlbnNpb24gbWFudWFsbHkgYW5kIGdpdmVzIGl0IGEgZGlmZmVyZW50IHR5cGUuCi0gICAgICAgICAgICAvLyBUaGlzIHNob3VsZCBub3QgaGFwcGVuIGluIG5vcm1hbCB1c2UuICBCdXQsIHRvIGJlIG5pY2UsIHdlJ2xsCi0gICAgICAgICAgICAvLyBjb3B5IHRoZSBtZXNzYWdlIHRvIHdoYXRldmVyIHR5cGUgdGhlIGNhbGxlciB3YXMgZXhwZWN0aW5nLgotICAgICAgICAgICAgcmV0dXJuIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbSgoTWVzc2FnZSkgdmFsdWUpLmJ1aWxkKCk7Ci0gICAgICAgICAgfQotICAgICAgICBjYXNlIEVOVU06Ci0gICAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGVudW1WYWx1ZU9mLCBudWxsLCAoRW51bVZhbHVlRGVzY3JpcHRvcikgdmFsdWUpOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBDb252ZXJ0IGZyb20gdGhlIHR5cGUgdXNlZCBieSB0aGUgbmF0aXZlIGFjY2Vzc29ycyB0byB0aGUgdHlwZSB1c2VkCi0gICAgICogYnkgcmVmbGVjdGlvbiBhY2Nlc3NvcnMuICBFLmcuLCBmb3IgZW51bXMsIHRoZSByZWZsZWN0aW9uIGFjY2Vzc29ycyB1c2UKLSAgICAgKiBFbnVtVmFsdWVEZXNjcmlwdG9ycyBidXQgdGhlIG5hdGl2ZSBhY2Nlc3NvcnMgdXNlIHRoZSBnZW5lcmF0ZWQgZW51bQotICAgICAqIHR5cGUuCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJpdmF0ZSBPYmplY3QgdG9SZWZsZWN0aW9uVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOwotICAgICAgaWYgKGRlc2NyaXB0b3IuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgIGlmIChkZXNjcmlwdG9yLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0pIHsKLSAgICAgICAgICAvLyBNdXN0IGNvbnZlcnQgdGhlIHdob2xlIGxpc3QuCi0gICAgICAgICAgZmluYWwgTGlzdCByZXN1bHQgPSBuZXcgQXJyYXlMaXN0KCk7Ci0gICAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0KSB2YWx1ZSkgewotICAgICAgICAgICAgcmVzdWx0LmFkZChzaW5ndWxhclRvUmVmbGVjdGlvblR5cGUoZWxlbWVudCkpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJldHVybiB2YWx1ZTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIHNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI3RvUmVmbGVjdGlvblR5cGUoT2JqZWN0KX0sIGJ1dCBpZiB0aGUgdHlwZSBpcyBhIHJlcGVhdGVkCi0gICAgICogdHlwZSwgdGhpcyBjb252ZXJ0cyBhIHNpbmdsZSBlbGVtZW50LgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0IHNpbmd1bGFyVG9SZWZsZWN0aW9uVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gZ2V0RGVzY3JpcHRvcigpOwotICAgICAgc3dpdGNoIChkZXNjcmlwdG9yLmdldEphdmFUeXBlKCkpIHsKLSAgICAgICAgY2FzZSBFTlVNOgotICAgICAgICAgIHJldHVybiBpbnZva2VPckRpZShlbnVtR2V0VmFsdWVEZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgcmV0dXJuIHZhbHVlOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIENhbGxzIENsYXNzLmdldE1ldGhvZCBhbmQgdGhyb3dzIGEgUnVudGltZUV4Y2VwdGlvbiBpZiBpdCBmYWlscy4gKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHByaXZhdGUgc3RhdGljIE1ldGhvZCBnZXRNZXRob2RPckRpZSgKLSAgICAgIGZpbmFsIENsYXNzIGNsYXp6LCBmaW5hbCBTdHJpbmcgbmFtZSwgZmluYWwgQ2xhc3MuLi4gcGFyYW1zKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBjbGF6ei5nZXRNZXRob2QobmFtZSwgcGFyYW1zKTsKLSAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICJHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzcyBcIiIgKyBjbGF6ei5nZXROYW1lKCkgKwotICAgICAgICAiXCIgbWlzc2luZyBtZXRob2QgXCIiICsgbmFtZSArICJcIi4iLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQ2FsbHMgaW52b2tlIGFuZCB0aHJvd3MgYSBSdW50aW1lRXhjZXB0aW9uIGlmIGl0IGZhaWxzLiAqLwotICBwcml2YXRlIHN0YXRpYyBPYmplY3QgaW52b2tlT3JEaWUoCi0gICAgICBmaW5hbCBNZXRob2QgbWV0aG9kLCBmaW5hbCBPYmplY3Qgb2JqZWN0LCBmaW5hbCBPYmplY3QuLi4gcGFyYW1zKSB7Ci0gICAgdHJ5IHsKLSAgICAgIHJldHVybiBtZXRob2QuaW52b2tlKG9iamVjdCwgcGFyYW1zKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsQWNjZXNzRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiQ291bGRuJ3QgdXNlIEphdmEgcmVmbGVjdGlvbiB0byBpbXBsZW1lbnQgcHJvdG9jb2wgbWVzc2FnZSAiICsKLSAgICAgICAgInJlZmxlY3Rpb24uIiwgZSk7Ci0gICAgfSBjYXRjaCAoSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiBlKSB7Ci0gICAgICBmaW5hbCBUaHJvd2FibGUgY2F1c2UgPSBlLmdldENhdXNlKCk7Ci0gICAgICBpZiAoY2F1c2UgaW5zdGFuY2VvZiBSdW50aW1lRXhjZXB0aW9uKSB7Ci0gICAgICAgIHRocm93IChSdW50aW1lRXhjZXB0aW9uKSBjYXVzZTsKLSAgICAgIH0gZWxzZSBpZiAoY2F1c2UgaW5zdGFuY2VvZiBFcnJvcikgewotICAgICAgICB0aHJvdyAoRXJyb3IpIGNhdXNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgbmV3IFJ1bnRpbWVFeGNlcHRpb24oCi0gICAgICAgICAgIlVuZXhwZWN0ZWQgZXhjZXB0aW9uIHRocm93biBieSBnZW5lcmF0ZWQgYWNjZXNzb3IgbWV0aG9kLiIsIGNhdXNlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVXNlcnMgc2hvdWxkIGlnbm9yZSB0aGlzIGNsYXNzLiAgVGhpcyBjbGFzcyBwcm92aWRlcyB0aGUgaW1wbGVtZW50YXRpb24KLSAgICogd2l0aCBhY2Nlc3MgdG8gdGhlIGZpZWxkcyBvZiBhIG1lc3NhZ2Ugb2JqZWN0IHVzaW5nIEphdmEgcmVmbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgRmllbGRBY2Nlc3NvclRhYmxlIHsKLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdCBhIEZpZWxkQWNjZXNzb3JUYWJsZSBmb3IgYSBwYXJ0aWN1bGFyIG1lc3NhZ2UgY2xhc3MuICBPbmx5Ci0gICAgICogb25lIEZpZWxkQWNjZXNzb3JUYWJsZSBzaG91bGQgZXZlciBiZSBjb25zdHJ1Y3RlZCBwZXIgY2xhc3MuCi0gICAgICoKLSAgICAgKiBAcGFyYW0gZGVzY3JpcHRvciAgICAgVGhlIHR5cGUncyBkZXNjcmlwdG9yLgotICAgICAqIEBwYXJhbSBjYW1lbENhc2VOYW1lcyBUaGUgY2FtZWxjYXNlIG5hbWVzIG9mIGFsbCBmaWVsZHMgaW4gdGhlIG1lc3NhZ2UuCi0gICAgICogICAgICAgICAgICAgICAgICAgICAgIFRoZXNlIGFyZSB1c2VkIHRvIGRlcml2ZSB0aGUgYWNjZXNzb3IgbWV0aG9kIG5hbWVzLgotICAgICAqIEBwYXJhbSBtZXNzYWdlQ2xhc3MgICBUaGUgbWVzc2FnZSB0eXBlLgotICAgICAqIEBwYXJhbSBidWlsZGVyQ2xhc3MgICBUaGUgYnVpbGRlciB0eXBlLgotICAgICAqLwotICAgIHB1YmxpYyBGaWVsZEFjY2Vzc29yVGFibGUoCi0gICAgICAgIGZpbmFsIERlc2NyaXB0b3IgZGVzY3JpcHRvciwKLSAgICAgICAgZmluYWwgU3RyaW5nW10gY2FtZWxDYXNlTmFtZXMsCi0gICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCi0gICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKLSAgICAgIHRoaXMuZGVzY3JpcHRvciA9IGRlc2NyaXB0b3I7Ci0gICAgICBmaWVsZHMgPSBuZXcgRmllbGRBY2Nlc3NvcltkZXNjcmlwdG9yLmdldEZpZWxkcygpLnNpemUoKV07Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCA9IGRlc2NyaXB0b3IuZ2V0RmllbGRzKCkuZ2V0KGkpOwotICAgICAgICBpZiAoZmllbGQuaXNSZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UpIHsKLSAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEFjY2Vzc29yKAotICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKLSAgICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLmdldEphdmFUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0pIHsKLSAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBSZXBlYXRlZEVudW1GaWVsZEFjY2Vzc29yKAotICAgICAgICAgICAgICBmaWVsZCwgY2FtZWxDYXNlTmFtZXNbaV0sIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZmllbGRzW2ldID0gbmV3IFJlcGVhdGVkRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICAgICAgZmllbGQsIGNhbWVsQ2FzZU5hbWVzW2ldLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICAgICAgICBmaWVsZHNbaV0gPSBuZXcgU2luZ3VsYXJNZXNzYWdlRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICAgICAgZmllbGQsIGNhbWVsQ2FzZU5hbWVzW2ldLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7Ci0gICAgICAgICAgfSBlbHNlIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5FTlVNKSB7Ci0gICAgICAgICAgICBmaWVsZHNbaV0gPSBuZXcgU2luZ3VsYXJFbnVtRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICAgICAgZmllbGQsIGNhbWVsQ2FzZU5hbWVzW2ldLCBtZXNzYWdlQ2xhc3MsIGJ1aWxkZXJDbGFzcyk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIGZpZWxkc1tpXSA9IG5ldyBTaW5ndWxhckZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgICAgIGZpZWxkLCBjYW1lbENhc2VOYW1lc1tpXSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICAgIHByaXZhdGUgZmluYWwgRmllbGRBY2Nlc3NvcltdIGZpZWxkczsKLQotICAgIC8qKiBHZXQgdGhlIEZpZWxkQWNjZXNzb3IgZm9yIGEgcGFydGljdWxhciBmaWVsZC4gKi8KLSAgICBwcml2YXRlIEZpZWxkQWNjZXNzb3IgZ2V0RmllbGQoZmluYWwgRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICBpZiAoZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBkZXNjcmlwdG9yKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIkZpZWxkRGVzY3JpcHRvciBkb2VzIG5vdCBtYXRjaCBtZXNzYWdlIHR5cGUuIik7Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkLmlzRXh0ZW5zaW9uKCkpIHsKLSAgICAgICAgLy8gSWYgdGhpcyB0eXBlIGhhZCBleHRlbnNpb25zLCBpdCB3b3VsZCBzdWJjbGFzcyBFeHRlbmRhYmxlTWVzc2FnZSwKLSAgICAgICAgLy8gd2hpY2ggb3ZlcnJpZGVzIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZSB0byBoYW5kbGUgZXh0ZW5zaW9ucy4KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhpcyB0eXBlIGRvZXMgbm90IGhhdmUgZXh0ZW5zaW9ucy4iKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmaWVsZHNbZmllbGQuZ2V0SW5kZXgoKV07Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQWJzdHJhY3QgaW50ZXJmYWNlIHRoYXQgcHJvdmlkZXMgYWNjZXNzIHRvIGEgc2luZ2xlIGZpZWxkLiAgVGhpcyBpcwotICAgICAqIGltcGxlbWVudGVkIGRpZmZlcmVudGx5IGRlcGVuZGluZyBvbiB0aGUgZmllbGQgdHlwZSBhbmQgY2FyZGluYWxpdHkuCi0gICAgICovCi0gICAgcHJpdmF0ZSBpbnRlcmZhY2UgRmllbGRBY2Nlc3NvciB7Ci0gICAgICBPYmplY3QgZ2V0KEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSk7Ci0gICAgICBPYmplY3QgZ2V0KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKTsKLSAgICAgIHZvaWQgc2V0KEJ1aWxkZXIgYnVpbGRlciwgT2JqZWN0IHZhbHVlKTsKLSAgICAgIE9iamVjdCBnZXRSZXBlYXRlZChHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UsIGludCBpbmRleCk7Ci0gICAgICBPYmplY3QgZ2V0UmVwZWF0ZWQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIsIGludCBpbmRleCk7Ci0gICAgICB2b2lkIHNldFJlcGVhdGVkKEJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpOwotICAgICAgdm9pZCBhZGRSZXBlYXRlZChCdWlsZGVyIGJ1aWxkZXIsIE9iamVjdCB2YWx1ZSk7Ci0gICAgICBib29sZWFuIGhhcyhHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpOwotICAgICAgYm9vbGVhbiBoYXMoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpOwotICAgICAgaW50IGdldFJlcGVhdGVkQ291bnQoR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKTsKLSAgICAgIGludCBnZXRSZXBlYXRlZENvdW50KEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKTsKLSAgICAgIHZvaWQgY2xlYXIoQnVpbGRlciBidWlsZGVyKTsKLSAgICAgIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyKCk7Ci0gICAgfQotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBwcml2YXRlIHN0YXRpYyBjbGFzcyBTaW5ndWxhckZpZWxkQWNjZXNzb3IgaW1wbGVtZW50cyBGaWVsZEFjY2Vzc29yIHsKLSAgICAgIFNpbmd1bGFyRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzKSB7Ci0gICAgICAgIGdldE1ldGhvZCA9IGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lKTsKLSAgICAgICAgZ2V0TWV0aG9kQnVpbGRlciA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lKTsKLSAgICAgICAgdHlwZSA9IGdldE1ldGhvZC5nZXRSZXR1cm5UeXBlKCk7Ci0gICAgICAgIHNldE1ldGhvZCA9IGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgInNldCIgKyBjYW1lbENhc2VOYW1lLCB0eXBlKTsKLSAgICAgICAgaGFzTWV0aG9kID0KLSAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKG1lc3NhZ2VDbGFzcywgImhhcyIgKyBjYW1lbENhc2VOYW1lKTsKLSAgICAgICAgaGFzTWV0aG9kQnVpbGRlciA9Ci0gICAgICAgICAgICBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJoYXMiICsgY2FtZWxDYXNlTmFtZSk7Ci0gICAgICAgIGNsZWFyTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUoYnVpbGRlckNsYXNzLCAiY2xlYXIiICsgY2FtZWxDYXNlTmFtZSk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIE5vdGU6ICBXZSB1c2UgSmF2YSByZWZsZWN0aW9uIHRvIGNhbGwgcHVibGljIG1ldGhvZHMgcmF0aGVyIHRoYW4KLSAgICAgIC8vICAgYWNjZXNzIHByaXZhdGUgZmllbGRzIGRpcmVjdGx5IGFzIHRoaXMgYXZvaWRzIHJ1bnRpbWUgc2VjdXJpdHkKLSAgICAgIC8vICAgY2hlY2tzLgotICAgICAgcHJvdGVjdGVkIGZpbmFsIENsYXNzPD8+IHR5cGU7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldE1ldGhvZDsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0TWV0aG9kQnVpbGRlcjsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2Qgc2V0TWV0aG9kOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBoYXNNZXRob2Q7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGhhc01ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGNsZWFyTWV0aG9kOwotCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldE1ldGhvZCwgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGdldChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICByZXR1cm4gaW52b2tlT3JEaWUoZ2V0TWV0aG9kQnVpbGRlciwgYnVpbGRlcik7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW52b2tlT3JEaWUoc2V0TWV0aG9kLCBidWlsZGVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZCgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJzZXRSZXBlYXRlZEZpZWxkKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgdm9pZCBhZGRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgImFkZFJlcGVhdGVkRmllbGQoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIChCb29sZWFuKSBpbnZva2VPckRpZShoYXNNZXRob2QsIG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIHJldHVybiAoQm9vbGVhbikgaW52b2tlT3JEaWUoaGFzTWV0aG9kQnVpbGRlciwgYnVpbGRlcik7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkQ291bnQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiZ2V0UmVwZWF0ZWRGaWVsZFNpemUoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgImdldFJlcGVhdGVkRmllbGRTaXplKCkgY2FsbGVkIG9uIGEgc2luZ3VsYXIgZmllbGQuIik7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgdm9pZCBjbGVhcihmaW5hbCBCdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgaW52b2tlT3JEaWUoY2xlYXJNZXRob2QsIGJ1aWxkZXIpOwotICAgICAgfQotICAgICAgcHVibGljIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIm5ld0J1aWxkZXJGb3JGaWVsZCgpIGNhbGxlZCBvbiBhIG5vbi1NZXNzYWdlIHR5cGUuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIGltcGxlbWVudHMgRmllbGRBY2Nlc3NvciB7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgQ2xhc3MgdHlwZTsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0TWV0aG9kOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRNZXRob2RCdWlsZGVyOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRSZXBlYXRlZE1ldGhvZDsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgZ2V0UmVwZWF0ZWRNZXRob2RCdWlsZGVyOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBzZXRSZXBlYXRlZE1ldGhvZDsKLSAgICAgIHByb3RlY3RlZCBmaW5hbCBNZXRob2QgYWRkUmVwZWF0ZWRNZXRob2Q7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGdldENvdW50TWV0aG9kOwotICAgICAgcHJvdGVjdGVkIGZpbmFsIE1ldGhvZCBnZXRDb3VudE1ldGhvZEJ1aWxkZXI7Ci0gICAgICBwcm90ZWN0ZWQgZmluYWwgTWV0aG9kIGNsZWFyTWV0aG9kOwotCi0gICAgICBSZXBlYXRlZEZpZWxkQWNjZXNzb3IoCi0gICAgICAgICAgZmluYWwgRmllbGREZXNjcmlwdG9yIGRlc2NyaXB0b3IsIGZpbmFsIFN0cmluZyBjYW1lbENhc2VOYW1lLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlPiBtZXNzYWdlQ2xhc3MsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEJ1aWxkZXI+IGJ1aWxkZXJDbGFzcykgewotICAgICAgICBnZXRNZXRob2QgPSBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJMaXN0Iik7Ci0gICAgICAgIGdldE1ldGhvZEJ1aWxkZXIgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnZXQiICsgY2FtZWxDYXNlTmFtZSArICJMaXN0Iik7Ci0KLQotICAgICAgICBnZXRSZXBlYXRlZE1ldGhvZCA9Ci0gICAgICAgICAgICBnZXRNZXRob2RPckRpZShtZXNzYWdlQ2xhc3MsICJnZXQiICsgY2FtZWxDYXNlTmFtZSwgSW50ZWdlci5UWVBFKTsKLSAgICAgICAgZ2V0UmVwZWF0ZWRNZXRob2RCdWlsZGVyID0KLSAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lLCBJbnRlZ2VyLlRZUEUpOwotICAgICAgICB0eXBlID0gZ2V0UmVwZWF0ZWRNZXRob2QuZ2V0UmV0dXJuVHlwZSgpOwotICAgICAgICBzZXRSZXBlYXRlZE1ldGhvZCA9Ci0gICAgICAgICAgICBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJzZXQiICsgY2FtZWxDYXNlTmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEludGVnZXIuVFlQRSwgdHlwZSk7Ci0gICAgICAgIGFkZFJlcGVhdGVkTWV0aG9kID0KLSAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImFkZCIgKyBjYW1lbENhc2VOYW1lLCB0eXBlKTsKLSAgICAgICAgZ2V0Q291bnRNZXRob2QgPQotICAgICAgICAgICAgZ2V0TWV0aG9kT3JEaWUobWVzc2FnZUNsYXNzLCAiZ2V0IiArIGNhbWVsQ2FzZU5hbWUgKyAiQ291bnQiKTsKLSAgICAgICAgZ2V0Q291bnRNZXRob2RCdWlsZGVyID0KLSAgICAgICAgICAgIGdldE1ldGhvZE9yRGllKGJ1aWxkZXJDbGFzcywgImdldCIgKyBjYW1lbENhc2VOYW1lICsgIkNvdW50Iik7Ci0KLSAgICAgICAgY2xlYXJNZXRob2QgPSBnZXRNZXRob2RPckRpZShidWlsZGVyQ2xhc3MsICJjbGVhciIgKyBjYW1lbENhc2VOYW1lKTsKLSAgICAgIH0KLQotICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRNZXRob2QsIG1lc3NhZ2UpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBnZXQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldE1ldGhvZEJ1aWxkZXIsIGJ1aWxkZXIpOwotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIC8vIEFkZCBhbGwgdGhlIGVsZW1lbnRzIGluZGl2aWR1YWxseS4gIFRoaXMgc2VydmVzIHR3byBwdXJwb3NlczoKLSAgICAgICAgLy8gMSkgVmVyaWZpZXMgdGhhdCBlYWNoIGVsZW1lbnQgaGFzIHRoZSBjb3JyZWN0IHR5cGUuCi0gICAgICAgIC8vIDIpIEluc3VyZXMgdGhhdCB0aGUgY2FsbGVyIGNhbm5vdCBtb2RpZnkgdGhlIGxpc3QgbGF0ZXIgb24gYW5kCi0gICAgICAgIC8vICAgIGhhdmUgdGhlIG1vZGlmaWNhdGlvbnMgYmUgcmVmbGVjdGVkIGluIHRoZSBtZXNzYWdlLgotICAgICAgICBjbGVhcihidWlsZGVyKTsKLSAgICAgICAgZm9yIChmaW5hbCBPYmplY3QgZWxlbWVudCA6IChMaXN0PD8+KSB2YWx1ZSkgewotICAgICAgICAgIGFkZFJlcGVhdGVkKGJ1aWxkZXIsIGVsZW1lbnQpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRSZXBlYXRlZE1ldGhvZCwgbWVzc2FnZSwgaW5kZXgpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZChHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRSZXBlYXRlZE1ldGhvZEJ1aWxkZXIsIGJ1aWxkZXIsIGluZGV4KTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyB2b2lkIHNldFJlcGVhdGVkKGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCBpbmRleCwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIGludm9rZU9yRGllKHNldFJlcGVhdGVkTWV0aG9kLCBidWlsZGVyLCBpbmRleCwgdmFsdWUpOwotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaW52b2tlT3JEaWUoYWRkUmVwZWF0ZWRNZXRob2QsIGJ1aWxkZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBib29sZWFuIGhhcyhmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJoYXNGaWVsZCgpIGNhbGxlZCBvbiBhIHNpbmd1bGFyIGZpZWxkLiIpOwotICAgICAgfQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzKEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiaGFzRmllbGQoKSBjYWxsZWQgb24gYSBzaW5ndWxhciBmaWVsZC4iKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBpbnQgZ2V0UmVwZWF0ZWRDb3VudChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSBpbnZva2VPckRpZShnZXRDb3VudE1ldGhvZCwgbWVzc2FnZSk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkQ291bnQoR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIChJbnRlZ2VyKSBpbnZva2VPckRpZShnZXRDb3VudE1ldGhvZEJ1aWxkZXIsIGJ1aWxkZXIpOwotICAgICAgfQotICAgICAgcHVibGljIHZvaWQgY2xlYXIoZmluYWwgQnVpbGRlciBidWlsZGVyKSB7Ci0gICAgICAgIGludm9rZU9yRGllKGNsZWFyTWV0aG9kLCBidWlsZGVyKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKAotICAgICAgICAgICJuZXdCdWlsZGVyRm9yRmllbGQoKSBjYWxsZWQgb24gYSBub24tTWVzc2FnZSB0eXBlLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgU2luZ3VsYXJFbnVtRmllbGRBY2Nlc3NvcgotICAgICAgICBleHRlbmRzIFNpbmd1bGFyRmllbGRBY2Nlc3NvciB7Ci0gICAgICBTaW5ndWxhckVudW1GaWVsZEFjY2Vzc29yKAotICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKLSAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOwotCi0gICAgICAgIHZhbHVlT2ZNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAidmFsdWVPZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKLSAgICAgICAgZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kID0KLSAgICAgICAgICBnZXRNZXRob2RPckRpZSh0eXBlLCAiZ2V0VmFsdWVEZXNjcmlwdG9yIik7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgTWV0aG9kIHZhbHVlT2ZNZXRob2Q7Ci0gICAgICBwcml2YXRlIE1ldGhvZCBnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2Q7Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgICAgIHJldHVybiBpbnZva2VPckRpZShnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2QsIHN1cGVyLmdldChtZXNzYWdlKSk7Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgc3VwZXIuZ2V0KGJ1aWxkZXIpKTsKLSAgICAgIH0KLQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBzZXQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIuc2V0KGJ1aWxkZXIsIGludm9rZU9yRGllKHZhbHVlT2ZNZXRob2QsIG51bGwsIHZhbHVlKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUmVwZWF0ZWRFbnVtRmllbGRBY2Nlc3NvcgotICAgICAgICBleHRlbmRzIFJlcGVhdGVkRmllbGRBY2Nlc3NvciB7Ci0gICAgICBSZXBlYXRlZEVudW1GaWVsZEFjY2Vzc29yKAotICAgICAgICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkZXNjcmlwdG9yLCBmaW5hbCBTdHJpbmcgY2FtZWxDYXNlTmFtZSwKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZT4gbWVzc2FnZUNsYXNzLAotICAgICAgICAgIGZpbmFsIENsYXNzPD8gZXh0ZW5kcyBCdWlsZGVyPiBidWlsZGVyQ2xhc3MpIHsKLSAgICAgICAgc3VwZXIoZGVzY3JpcHRvciwgY2FtZWxDYXNlTmFtZSwgbWVzc2FnZUNsYXNzLCBidWlsZGVyQ2xhc3MpOwotCi0gICAgICAgIHZhbHVlT2ZNZXRob2QgPSBnZXRNZXRob2RPckRpZSh0eXBlLCAidmFsdWVPZiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yLmNsYXNzKTsKLSAgICAgICAgZ2V0VmFsdWVEZXNjcmlwdG9yTWV0aG9kID0KLSAgICAgICAgICBnZXRNZXRob2RPckRpZSh0eXBlLCAiZ2V0VmFsdWVEZXNjcmlwdG9yIik7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgZmluYWwgTWV0aG9kIHZhbHVlT2ZNZXRob2Q7Ci0gICAgICBwcml2YXRlIGZpbmFsIE1ldGhvZCBnZXRWYWx1ZURlc2NyaXB0b3JNZXRob2Q7Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldChmaW5hbCBHZW5lcmF0ZWRNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHN1cGVyLmdldChtZXNzYWdlKSkgewotICAgICAgICAgIG5ld0xpc3QuYWRkKGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgZWxlbWVudCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ld0xpc3QpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgcHVibGljIE9iamVjdCBnZXQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpIHsKLSAgICAgICAgZmluYWwgTGlzdCBuZXdMaXN0ID0gbmV3IEFycmF5TGlzdCgpOwotICAgICAgICBmb3IgKGZpbmFsIE9iamVjdCBlbGVtZW50IDogKExpc3QpIHN1cGVyLmdldChidWlsZGVyKSkgewotICAgICAgICAgIG5ld0xpc3QuYWRkKGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwgZWxlbWVudCkpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG5ld0xpc3QpOwotICAgICAgfQotCi0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBPYmplY3QgZ2V0UmVwZWF0ZWQoZmluYWwgR2VuZXJhdGVkTWVzc2FnZSBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwKLSAgICAgICAgICBzdXBlci5nZXRSZXBlYXRlZChtZXNzYWdlLCBpbmRleCkpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkKGZpbmFsIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgpIHsKLSAgICAgICAgcmV0dXJuIGludm9rZU9yRGllKGdldFZhbHVlRGVzY3JpcHRvck1ldGhvZCwKLSAgICAgICAgICBzdXBlci5nZXRSZXBlYXRlZChidWlsZGVyLCBpbmRleCkpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgdm9pZCBzZXRSZXBlYXRlZChmaW5hbCBCdWlsZGVyIGJ1aWxkZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIE9iamVjdCB2YWx1ZSkgewotICAgICAgICBzdXBlci5zZXRSZXBlYXRlZChidWlsZGVyLCBpbmRleCwgaW52b2tlT3JEaWUodmFsdWVPZk1ldGhvZCwgbnVsbCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUpKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIuYWRkUmVwZWF0ZWQoYnVpbGRlciwgaW52b2tlT3JEaWUodmFsdWVPZk1ldGhvZCwgbnVsbCwgdmFsdWUpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNpbmd1bGFyTWVzc2FnZUZpZWxkQWNjZXNzb3IKLSAgICAgICAgZXh0ZW5kcyBTaW5ndWxhckZpZWxkQWNjZXNzb3IgewotICAgICAgU2luZ3VsYXJNZXNzYWdlRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzKSB7Ci0gICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGNhbWVsQ2FzZU5hbWUsIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKLQotICAgICAgICBuZXdCdWlsZGVyTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUodHlwZSwgIm5ld0J1aWxkZXIiKTsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbmV3QnVpbGRlck1ldGhvZDsKLQotICAgICAgcHJpdmF0ZSBPYmplY3QgY29lcmNlVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIG5vdCB0aGUgZXhhY3QgcmlnaHQgbWVzc2FnZSB0eXBlLiAgSG93ZXZlciwgaWYgaXQKLSAgICAgICAgICAvLyBpcyBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2FtZSB0eXBlIC0tIGUuZy4gYQotICAgICAgICAgIC8vIER5bmFtaWNNZXNzYWdlIC0tIHdlIHNob3VsZCBhY2NlcHQgaXQuICBJbiB0aGlzIGNhc2Ugd2UgY2FuIG1ha2UKLSAgICAgICAgICAvLyBhIGNvcHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAgcmV0dXJuICgoTWVzc2FnZS5CdWlsZGVyKSBpbnZva2VPckRpZShuZXdCdWlsZGVyTWV0aG9kLCBudWxsKSkKLSAgICAgICAgICAgICAgICAgIC5tZXJnZUZyb20oKE1lc3NhZ2UpIHZhbHVlKS5idWlsZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0KGZpbmFsIEJ1aWxkZXIgYnVpbGRlciwgZmluYWwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHN1cGVyLnNldChidWlsZGVyLCBjb2VyY2VUeXBlKHZhbHVlKSk7Ci0gICAgICB9Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIHB1YmxpYyBNZXNzYWdlLkJ1aWxkZXIgbmV3QnVpbGRlcigpIHsKLSAgICAgICAgcmV0dXJuIChNZXNzYWdlLkJ1aWxkZXIpIGludm9rZU9yRGllKG5ld0J1aWxkZXJNZXRob2QsIG51bGwpOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFJlcGVhdGVkTWVzc2FnZUZpZWxkQWNjZXNzb3IKLSAgICAgICAgZXh0ZW5kcyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IgewotICAgICAgUmVwZWF0ZWRNZXNzYWdlRmllbGRBY2Nlc3NvcigKLSAgICAgICAgICBmaW5hbCBGaWVsZERlc2NyaXB0b3IgZGVzY3JpcHRvciwgZmluYWwgU3RyaW5nIGNhbWVsQ2FzZU5hbWUsCi0gICAgICAgICAgZmluYWwgQ2xhc3M8PyBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2U+IG1lc3NhZ2VDbGFzcywKLSAgICAgICAgICBmaW5hbCBDbGFzczw/IGV4dGVuZHMgQnVpbGRlcj4gYnVpbGRlckNsYXNzKSB7Ci0gICAgICAgIHN1cGVyKGRlc2NyaXB0b3IsIGNhbWVsQ2FzZU5hbWUsIG1lc3NhZ2VDbGFzcywgYnVpbGRlckNsYXNzKTsKLQotICAgICAgICBuZXdCdWlsZGVyTWV0aG9kID0gZ2V0TWV0aG9kT3JEaWUodHlwZSwgIm5ld0J1aWxkZXIiKTsKLSAgICAgIH0KLQotICAgICAgcHJpdmF0ZSBmaW5hbCBNZXRob2QgbmV3QnVpbGRlck1ldGhvZDsKLQotICAgICAgcHJpdmF0ZSBPYmplY3QgY29lcmNlVHlwZShmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgaWYgKHR5cGUuaXNJbnN0YW5jZSh2YWx1ZSkpIHsKLSAgICAgICAgICByZXR1cm4gdmFsdWU7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgLy8gVGhlIHZhbHVlIGlzIG5vdCB0aGUgZXhhY3QgcmlnaHQgbWVzc2FnZSB0eXBlLiAgSG93ZXZlciwgaWYgaXQKLSAgICAgICAgICAvLyBpcyBhbiBhbHRlcm5hdGl2ZSBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgc2FtZSB0eXBlIC0tIGUuZy4gYQotICAgICAgICAgIC8vIER5bmFtaWNNZXNzYWdlIC0tIHdlIHNob3VsZCBhY2NlcHQgaXQuICBJbiB0aGlzIGNhc2Ugd2UgY2FuIG1ha2UKLSAgICAgICAgICAvLyBhIGNvcHkgb2YgdGhlIG1lc3NhZ2UuCi0gICAgICAgICAgcmV0dXJuICgoTWVzc2FnZS5CdWlsZGVyKSBpbnZva2VPckRpZShuZXdCdWlsZGVyTWV0aG9kLCBudWxsKSkKLSAgICAgICAgICAgICAgICAgIC5tZXJnZUZyb20oKE1lc3NhZ2UpIHZhbHVlKS5idWlsZCgpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgc2V0UmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgaW50IGluZGV4LCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIuc2V0UmVwZWF0ZWQoYnVpbGRlciwgaW5kZXgsIGNvZXJjZVR5cGUodmFsdWUpKTsKLSAgICAgIH0KLSAgICAgIEBPdmVycmlkZQotICAgICAgcHVibGljIHZvaWQgYWRkUmVwZWF0ZWQoZmluYWwgQnVpbGRlciBidWlsZGVyLCBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgc3VwZXIuYWRkUmVwZWF0ZWQoYnVpbGRlciwgY29lcmNlVHlwZSh2YWx1ZSkpOwotICAgICAgfQotICAgICAgQE92ZXJyaWRlCi0gICAgICBwdWJsaWMgTWVzc2FnZS5CdWlsZGVyIG5ld0J1aWxkZXIoKSB7Ci0gICAgICAgIHJldHVybiAoTWVzc2FnZS5CdWlsZGVyKSBpbnZva2VPckRpZShuZXdCdWlsZGVyTWV0aG9kLCBudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVwbGFjZXMgdGhpcyBvYmplY3QgaW4gdGhlIG91dHB1dCBzdHJlYW0gd2l0aCBhIHNlcmlhbGl6ZWQgZm9ybS4KLSAgICogUGFydCBvZiBKYXZhJ3Mgc2VyaWFsaXphdGlvbiBtYWdpYy4gIEdlbmVyYXRlZCBzdWItY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0gICAqIHRoaXMgbWV0aG9kIGJ5IGNhbGxpbmcgPGNvZGU+cmV0dXJuIHN1cGVyLndyaXRlUmVwbGFjZSgpOzwvY29kZT4KLSAgICogQHJldHVybiBhIFNlcmlhbGl6ZWRGb3JtIG9mIHRoaXMgbWVzc2FnZQotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3IEdlbmVyYXRlZE1lc3NhZ2VMaXRlLlNlcmlhbGl6ZWRGb3JtKHRoaXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvR2VuZXJhdGVkTWVzc2FnZUxpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxODEzZTliLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNzMxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5PYmplY3RTdHJlYW1FeGNlcHRpb247Ci1pbXBvcnQgamF2YS5pby5TZXJpYWxpemFibGU7Ci1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIExpdGUgdmVyc2lvbiBvZiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGFic3RyYWN0IGNsYXNzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlTGl0ZQotICAgIGltcGxlbWVudHMgU2VyaWFsaXphYmxlIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMUw7Ci0KLSAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2VMaXRlKCkgewotICB9Ci0KLSAgcHJvdGVjdGVkIEdlbmVyYXRlZE1lc3NhZ2VMaXRlKEJ1aWxkZXIgYnVpbGRlcikgewotICB9Ci0KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgQnVpbGRlcjxNZXNzYWdlVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2VMaXRlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQnVpbGRlclR5cGUgZXh0ZW5kcyBCdWlsZGVyPgotICAgICAgZXh0ZW5kcyBBYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXI8QnVpbGRlclR5cGU+IHsKLSAgICBwcm90ZWN0ZWQgQnVpbGRlcigpIHt9Ci0KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xlYXIoKSB7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8vIFRoaXMgaXMgaW1wbGVtZW50ZWQgaGVyZSBvbmx5IHRvIHdvcmsgYXJvdW5kIGFuIGFwcGFyZW50IGJ1ZyBpbiB0aGUKLSAgICAvLyBKYXZhIGNvbXBpbGVyIGFuZC9vciBidWlsZCBzeXN0ZW0uICBTZWUgYnVnICMxODk4NDYzLiAgVGhlIG1lcmUgcHJlc2VuY2UKLSAgICAvLyBvZiB0aGlzIGR1bW15IGNsb25lKCkgaW1wbGVtZW50YXRpb24gbWFrZXMgaXQgZ28gYXdheS4KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlclR5cGUgY2xvbmUoKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oCi0gICAgICAgICAgIlRoaXMgaXMgc3VwcG9zZWQgdG8gYmUgb3ZlcnJpZGRlbiBieSBzdWJjbGFzc2VzLiIpOwotICAgIH0KLQotICAgIC8qKiBBbGwgc3ViY2xhc3NlcyBpbXBsZW1lbnQgdGhpcy4gKi8KLSAgICBwdWJsaWMgYWJzdHJhY3QgQnVpbGRlclR5cGUgbWVyZ2VGcm9tKE1lc3NhZ2VUeXBlIG1lc3NhZ2UpOwotCi0gICAgLy8gRGVmaW5lZCBoZXJlIGZvciByZXR1cm4gdHlwZSBjb3ZhcmlhbmNlLgotICAgIHB1YmxpYyBhYnN0cmFjdCBNZXNzYWdlVHlwZSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBwYXJzZSBhbiB1bmtub3duIGZpZWxkLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCi0gICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgZmluYWwgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBpbnB1dC5za2lwRmllbGQodGFnKTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBFeHRlbnNpb25zLXJlbGF0ZWQgc3R1ZmYKLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IG9mIHtAbGluayBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXJ9LgotICAgKi8KLSAgcHVibGljIGludGVyZmFjZSBFeHRlbmRhYmxlTWVzc2FnZU9yQnVpbGRlcjwKLSAgICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2U+IGV4dGVuZHMgTWVzc2FnZUxpdGVPckJ1aWxkZXIgewotCi0gICAgLyoqIENoZWNrIGlmIGEgc2luZ3VsYXIgZXh0ZW5zaW9uIGlzIHByZXNlbnQuICovCi0gICAgPFR5cGU+IGJvb2xlYW4gaGFzRXh0ZW5zaW9uKAotICAgICAgICBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7Ci0KLSAgICAvKiogR2V0IHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKLSAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pOwotCi0gICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLwotICAgIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbihHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbik7Ci0KLSAgICAvKiogR2V0IG9uZSBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKLSAgICAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCi0gICAgICAgIGludCBpbmRleCk7Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IG9mIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVNZXNzYWdlfS4KLSAgICovCi0gIHB1YmxpYyBhYnN0cmFjdCBzdGF0aWMgY2xhc3MgRXh0ZW5kYWJsZU1lc3NhZ2U8Ci0gICAgICAgIE1lc3NhZ2VUeXBlIGV4dGVuZHMgRXh0ZW5kYWJsZU1lc3NhZ2U8TWVzc2FnZVR5cGU+PgotICAgICAgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlTGl0ZQotICAgICAgaW1wbGVtZW50cyBFeHRlbmRhYmxlTWVzc2FnZU9yQnVpbGRlcjxNZXNzYWdlVHlwZT4gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiBleHRlbnNpb25zOwotCi0gICAgcHJvdGVjdGVkIEV4dGVuZGFibGVNZXNzYWdlKCkgewotICAgICAgdGhpcy5leHRlbnNpb25zID0gRmllbGRTZXQubmV3RmllbGRTZXQoKTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZU1lc3NhZ2UoRXh0ZW5kYWJsZUJ1aWxkZXI8TWVzc2FnZVR5cGUsID8+IGJ1aWxkZXIpIHsKLSAgICAgIHRoaXMuZXh0ZW5zaW9ucyA9IGJ1aWxkZXIuYnVpbGRFeHRlbnNpb25zKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgewotICAgICAgaWYgKGV4dGVuc2lvbi5nZXRDb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSgpICE9Ci0gICAgICAgICAgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKSB7Ci0gICAgICAgIC8vIFRoaXMgY2FuIG9ubHkgaGFwcGVuIGlmIHNvbWVvbmUgdXNlcyB1bmNoZWNrZWQgb3BlcmF0aW9ucy4KLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhpcyBleHRlbnNpb24gaXMgZm9yIGEgZGlmZmVyZW50IG1lc3NhZ2UgdHlwZS4gIFBsZWFzZSBtYWtlICIgKwotICAgICAgICAgICJzdXJlIHRoYXQgeW91IGFyZSBub3Qgc3VwcHJlc3NpbmcgYW55IGdlbmVyaWNzIHR5cGUgd2FybmluZ3MuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIGEgc2luZ3VsYXIgZXh0ZW5zaW9uIGlzIHByZXNlbnQuICovCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBib29sZWFuIGhhc0V4dGVuc2lvbigKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBUeXBlPiBleHRlbnNpb24pIHsKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5oYXNGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGVsZW1lbnRzIGluIGEgcmVwZWF0ZWQgZXh0ZW5zaW9uLiAqLwotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gaW50IGdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbikgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGRDb3VudChleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgfQotCi0gICAgLyoqIEdldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLwotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gVHlwZSBnZXRFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0gZXh0ZW5zaW9ucy5nZXRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgICBpZiAodmFsdWUgPT0gbnVsbCkgewotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLmRlZmF1bHRWYWx1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiAoVHlwZSkgdmFsdWU7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqIEdldCBvbmUgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIExpc3Q8VHlwZT4+IGV4dGVuc2lvbiwKLSAgICAgICAgZmluYWwgaW50IGluZGV4KSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgcmV0dXJuIChUeXBlKSBleHRlbnNpb25zLmdldFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIGluZGV4KTsKLSAgICB9Ci0KLSAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY2hlY2sgaWYgYWxsIGV4dGVuc2lvbnMgYXJlIGluaXRpYWxpemVkLiAqLwotICAgIHByb3RlY3RlZCBib29sZWFuIGV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpIHsKLSAgICAgIHJldHVybiBleHRlbnNpb25zLmlzSW5pdGlhbGl6ZWQoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBVc2VkIGJ5IHN1YmNsYXNzZXMgdG8gc2VyaWFsaXplIGV4dGVuc2lvbnMuICBFeHRlbnNpb24gcmFuZ2VzIG1heSBiZQotICAgICAqIGludGVybGVhdmVkIHdpdGggZmllbGQgbnVtYmVycywgYnV0IHdlIG11c3Qgd3JpdGUgdGhlbSBpbiBjYW5vbmljYWwKLSAgICAgKiAoc29ydGVkIGJ5IGZpZWxkIG51bWJlcikgb3JkZXIuICBFeHRlbnNpb25Xcml0ZXIgaGVscHMgdXMgd3JpdGUKLSAgICAgKiBpbmRpdmlkdWFsIHJhbmdlcyBvZiBleHRlbnNpb25zIGF0IG9uY2UuCi0gICAgICovCi0gICAgcHJvdGVjdGVkIGNsYXNzIEV4dGVuc2lvbldyaXRlciB7Ci0gICAgICAvLyBJbWFnaW5lIGhvdyBtdWNoIHNpbXBsZXIgdGhpcyBjb2RlIHdvdWxkIGJlIGlmIEphdmEgaXRlcmF0b3JzIGhhZAotICAgICAgLy8gYSB3YXkgdG8gZ2V0IHRoZSBuZXh0IGVsZW1lbnQgd2l0aG91dCBhZHZhbmNpbmcgdGhlIGl0ZXJhdG9yLgotCi0gICAgICBwcml2YXRlIGZpbmFsIEl0ZXJhdG9yPE1hcC5FbnRyeTxFeHRlbnNpb25EZXNjcmlwdG9yLCBPYmplY3Q+PiBpdGVyID0KLSAgICAgICAgICAgIGV4dGVuc2lvbnMuaXRlcmF0b3IoKTsKLSAgICAgIHByaXZhdGUgTWFwLkVudHJ5PEV4dGVuc2lvbkRlc2NyaXB0b3IsIE9iamVjdD4gbmV4dDsKLSAgICAgIHByaXZhdGUgZmluYWwgYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdDsKLQotICAgICAgcHJpdmF0ZSBFeHRlbnNpb25Xcml0ZXIoYm9vbGVhbiBtZXNzYWdlU2V0V2lyZUZvcm1hdCkgewotICAgICAgICBpZiAoaXRlci5oYXNOZXh0KCkpIHsKLSAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgIH0KLSAgICAgICAgdGhpcy5tZXNzYWdlU2V0V2lyZUZvcm1hdCA9IG1lc3NhZ2VTZXRXaXJlRm9ybWF0OwotICAgICAgfQotCi0gICAgICBwdWJsaWMgdm9pZCB3cml0ZVVudGlsKGZpbmFsIGludCBlbmQsIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgICAgd2hpbGUgKG5leHQgIT0gbnVsbCAmJiBuZXh0LmdldEtleSgpLmdldE51bWJlcigpIDwgZW5kKSB7Ci0gICAgICAgICAgRXh0ZW5zaW9uRGVzY3JpcHRvciBleHRlbnNpb24gPSBuZXh0LmdldEtleSgpOwotICAgICAgICAgIGlmIChtZXNzYWdlU2V0V2lyZUZvcm1hdCAmJiBleHRlbnNpb24uZ2V0TGl0ZUphdmFUeXBlKCkgPT0KLSAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXQuSmF2YVR5cGUuTUVTU0FHRSAmJgotICAgICAgICAgICAgICAhZXh0ZW5zaW9uLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgb3V0cHV0LndyaXRlTWVzc2FnZVNldEV4dGVuc2lvbihleHRlbnNpb24uZ2V0TnVtYmVyKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNZXNzYWdlTGl0ZSkgbmV4dC5nZXRWYWx1ZSgpKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgRmllbGRTZXQud3JpdGVGaWVsZChleHRlbnNpb24sIG5leHQuZ2V0VmFsdWUoKSwgb3V0cHV0KTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgaWYgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICAgICAgICBuZXh0ID0gaXRlci5uZXh0KCk7Ci0gICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG5leHQgPSBudWxsOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0KLQotICAgIHByb3RlY3RlZCBFeHRlbnNpb25Xcml0ZXIgbmV3RXh0ZW5zaW9uV3JpdGVyKCkgewotICAgICAgcmV0dXJuIG5ldyBFeHRlbnNpb25Xcml0ZXIoZmFsc2UpOwotICAgIH0KLSAgICBwcm90ZWN0ZWQgRXh0ZW5zaW9uV3JpdGVyIG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKSB7Ci0gICAgICByZXR1cm4gbmV3IEV4dGVuc2lvbldyaXRlcih0cnVlKTsKLSAgICB9Ci0KLSAgICAvKiogQ2FsbGVkIGJ5IHN1YmNsYXNzZXMgdG8gY29tcHV0ZSB0aGUgc2l6ZSBvZiBleHRlbnNpb25zLiAqLwotICAgIHByb3RlY3RlZCBpbnQgZXh0ZW5zaW9uc1NlcmlhbGl6ZWRTaXplKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuZ2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICB9Ci0gICAgcHJvdGVjdGVkIGludCBleHRlbnNpb25zU2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRNZXNzYWdlU2V0U2VyaWFsaXplZFNpemUoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IG9mIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVCdWlsZGVyfS4KLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgYWJzdHJhY3Qgc3RhdGljIGNsYXNzIEV4dGVuZGFibGVCdWlsZGVyPAotICAgICAgICBNZXNzYWdlVHlwZSBleHRlbmRzIEV4dGVuZGFibGVNZXNzYWdlPE1lc3NhZ2VUeXBlPiwKLSAgICAgICAgQnVpbGRlclR5cGUgZXh0ZW5kcyBFeHRlbmRhYmxlQnVpbGRlcjxNZXNzYWdlVHlwZSwgQnVpbGRlclR5cGU+PgotICAgICAgZXh0ZW5kcyBCdWlsZGVyPE1lc3NhZ2VUeXBlLCBCdWlsZGVyVHlwZT4KLSAgICAgIGltcGxlbWVudHMgRXh0ZW5kYWJsZU1lc3NhZ2VPckJ1aWxkZXI8TWVzc2FnZVR5cGU+IHsKLSAgICBwcm90ZWN0ZWQgRXh0ZW5kYWJsZUJ1aWxkZXIoKSB7fQotCi0gICAgcHJpdmF0ZSBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiBleHRlbnNpb25zID0gRmllbGRTZXQuZW1wdHlTZXQoKTsKLSAgICBwcml2YXRlIGJvb2xlYW4gZXh0ZW5zaW9uc0lzTXV0YWJsZTsKLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbGVhcigpIHsKLSAgICAgIGV4dGVuc2lvbnMuY2xlYXIoKTsKLSAgICAgIGV4dGVuc2lvbnNJc011dGFibGUgPSBmYWxzZTsKLSAgICAgIHJldHVybiBzdXBlci5jbGVhcigpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCkgewotICAgICAgaWYgKCFleHRlbnNpb25zSXNNdXRhYmxlKSB7Ci0gICAgICAgIGV4dGVuc2lvbnMgPSBleHRlbnNpb25zLmNsb25lKCk7Ci0gICAgICAgIGV4dGVuc2lvbnNJc011dGFibGUgPSB0cnVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSB0aGUgYnVpbGQgY29kZSBwYXRoIHRvIGNyZWF0ZSBhIGNvcHkgb2YgdGhlIGV4dGVuc2lvbnMgZm9yCi0gICAgICogYnVpbGRpbmcgdGhlIG1lc3NhZ2UuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWVsZFNldDxFeHRlbnNpb25EZXNjcmlwdG9yPiBidWlsZEV4dGVuc2lvbnMoKSB7Ci0gICAgICBleHRlbnNpb25zLm1ha2VJbW11dGFibGUoKTsKLSAgICAgIGV4dGVuc2lvbnNJc011dGFibGUgPSBmYWxzZTsKLSAgICAgIHJldHVybiBleHRlbnNpb25zOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZSgKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24pIHsKLSAgICAgIGlmIChleHRlbnNpb24uZ2V0Q29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UoKSAhPQotICAgICAgICAgIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSkgewotICAgICAgICAvLyBUaGlzIGNhbiBvbmx5IGhhcHBlbiBpZiBzb21lb25lIHVzZXMgdW5jaGVja2VkIG9wZXJhdGlvbnMuCi0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oCi0gICAgICAgICAgIlRoaXMgZXh0ZW5zaW9uIGlzIGZvciBhIGRpZmZlcmVudCBtZXNzYWdlIHR5cGUuICBQbGVhc2UgbWFrZSAiICsKLSAgICAgICAgICAic3VyZSB0aGF0IHlvdSBhcmUgbm90IHN1cHByZXNzaW5nIGFueSBnZW5lcmljcyB0eXBlIHdhcm5pbmdzLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBDaGVjayBpZiBhIHNpbmd1bGFyIGV4dGVuc2lvbiBpcyBwcmVzZW50LiAqLwotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gYm9vbGVhbiBoYXNFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgVHlwZT4gZXh0ZW5zaW9uKSB7Ci0gICAgICB2ZXJpZnlFeHRlbnNpb25Db250YWluaW5nVHlwZShleHRlbnNpb24pOwotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaGFzRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IGludCBnZXRFeHRlbnNpb25Db3VudCgKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24pIHsKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIHZhbHVlIG9mIGFuIGV4dGVuc2lvbi4gKi8KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IFR5cGUgZ2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbikgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IGV4dGVuc2lvbnMuZ2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOwotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIGV4dGVuc2lvbi5kZWZhdWx0VmFsdWU7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gKFR5cGUpIHZhbHVlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKiBHZXQgb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBUeXBlIGdldEV4dGVuc2lvbigKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCi0gICAgICAgIGZpbmFsIGludCBpbmRleCkgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIHJldHVybiAoVHlwZSkgZXh0ZW5zaW9ucy5nZXRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgfQotCi0gICAgLy8gVGhpcyBpcyBpbXBsZW1lbnRlZCBoZXJlIG9ubHkgdG8gd29yayBhcm91bmQgYW4gYXBwYXJlbnQgYnVnIGluIHRoZQotICAgIC8vIEphdmEgY29tcGlsZXIgYW5kL29yIGJ1aWxkIHN5c3RlbS4gIFNlZSBidWcgIzE4OTg0NjMuICBUaGUgbWVyZSBwcmVzZW5jZQotICAgIC8vIG9mIHRoaXMgZHVtbXkgY2xvbmUoKSBpbXBsZW1lbnRhdGlvbiBtYWtlcyBpdCBnbyBhd2F5LgotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBCdWlsZGVyVHlwZSBjbG9uZSgpIHsKLSAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigKLSAgICAgICAgICAiVGhpcyBpcyBzdXBwb3NlZCB0byBiZSBvdmVycmlkZGVuIGJ5IHN1YmNsYXNzZXMuIik7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgdmFsdWUgb2YgYW4gZXh0ZW5zaW9uLiAqLwotICAgIHB1YmxpYyBmaW5hbCA8VHlwZT4gQnVpbGRlclR5cGUgc2V0RXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsIFR5cGU+IGV4dGVuc2lvbiwKLSAgICAgICAgZmluYWwgVHlwZSB2YWx1ZSkgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqIFNldCB0aGUgdmFsdWUgb2Ygb25lIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBleHRlbnNpb24uICovCi0gICAgcHVibGljIGZpbmFsIDxUeXBlPiBCdWlsZGVyVHlwZSBzZXRFeHRlbnNpb24oCi0gICAgICAgIGZpbmFsIEdlbmVyYXRlZEV4dGVuc2lvbjxNZXNzYWdlVHlwZSwgTGlzdDxUeXBlPj4gZXh0ZW5zaW9uLAotICAgICAgICBmaW5hbCBpbnQgaW5kZXgsIGZpbmFsIFR5cGUgdmFsdWUpIHsKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7Ci0gICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7Ci0gICAgICBleHRlbnNpb25zLnNldFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZSk7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKiBBcHBlbmQgYSB2YWx1ZSB0byBhIHJlcGVhdGVkIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIGFkZEV4dGVuc2lvbigKLSAgICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCBMaXN0PFR5cGU+PiBleHRlbnNpb24sCi0gICAgICAgIGZpbmFsIFR5cGUgdmFsdWUpIHsKLSAgICAgIHZlcmlmeUV4dGVuc2lvbkNvbnRhaW5pbmdUeXBlKGV4dGVuc2lvbik7Ci0gICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7Ci0gICAgICBleHRlbnNpb25zLmFkZFJlcGVhdGVkRmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgIHJldHVybiAoQnVpbGRlclR5cGUpIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqIENsZWFyIGFuIGV4dGVuc2lvbi4gKi8KLSAgICBwdWJsaWMgZmluYWwgPFR5cGU+IEJ1aWxkZXJUeXBlIGNsZWFyRXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBHZW5lcmF0ZWRFeHRlbnNpb248TWVzc2FnZVR5cGUsID8+IGV4dGVuc2lvbikgewotICAgICAgdmVyaWZ5RXh0ZW5zaW9uQ29udGFpbmluZ1R5cGUoZXh0ZW5zaW9uKTsKLSAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgIGV4dGVuc2lvbnMuY2xlYXJGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgICByZXR1cm4gKEJ1aWxkZXJUeXBlKSB0aGlzOwotICAgIH0KLQotICAgIC8qKiBDYWxsZWQgYnkgc3ViY2xhc3NlcyB0byBjaGVjayBpZiBhbGwgZXh0ZW5zaW9ucyBhcmUgaW5pdGlhbGl6ZWQuICovCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gZXh0ZW5zaW9uc0FyZUluaXRpYWxpemVkKCkgewotICAgICAgcmV0dXJuIGV4dGVuc2lvbnMuaXNJbml0aWFsaXplZCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENhbGxlZCBieSBzdWJjbGFzc2VzIHRvIHBhcnNlIGFuIHVua25vd24gZmllbGQgb3IgYW4gZXh0ZW5zaW9uLgotICAgICAqIEByZXR1cm4ge0Bjb2RlIHRydWV9IHVubGVzcyB0aGUgdGFnIGlzIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHJvdGVjdGVkIGJvb2xlYW4gcGFyc2VVbmtub3duRmllbGQoCi0gICAgICAgIGZpbmFsIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgZmluYWwgaW50IHRhZykgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGZpbmFsIGludCB3aXJlVHlwZSA9IFdpcmVGb3JtYXQuZ2V0VGFnV2lyZVR5cGUodGFnKTsKLSAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciA9IFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKTsKLQotICAgICAgZmluYWwgR2VuZXJhdGVkRXh0ZW5zaW9uPE1lc3NhZ2VUeXBlLCA/PiBleHRlbnNpb24gPQotICAgICAgICBleHRlbnNpb25SZWdpc3RyeS5maW5kTGl0ZUV4dGVuc2lvbkJ5TnVtYmVyKAotICAgICAgICAgICAgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpLCBmaWVsZE51bWJlcik7Ci0KLSAgICAgIGJvb2xlYW4gdW5rbm93biA9IGZhbHNlOwotICAgICAgYm9vbGVhbiBwYWNrZWQgPSBmYWxzZTsKLSAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFVua25vd24gZmllbGQuCi0gICAgICB9IGVsc2UgaWYgKHdpcmVUeXBlID09IEZpZWxkU2V0LmdldFdpcmVGb3JtYXRGb3JGaWVsZFR5cGUoCi0gICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSwKLSAgICAgICAgICAgICAgICAgICBmYWxzZSAgLyogaXNQYWNrZWQgKi8pKSB7Ci0gICAgICAgIHBhY2tlZCA9IGZhbHNlOyAgLy8gTm9ybWFsLCB1bnBhY2tlZCB2YWx1ZS4KLSAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuaXNSZXBlYXRlZCAmJgotICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci50eXBlLmlzUGFja2FibGUoKSAmJgotICAgICAgICAgICAgICAgICB3aXJlVHlwZSA9PSBGaWVsZFNldC5nZXRXaXJlRm9ybWF0Rm9yRmllbGRUeXBlKAotICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldExpdGVUeXBlKCksCi0gICAgICAgICAgICAgICAgICAgdHJ1ZSAgLyogaXNQYWNrZWQgKi8pKSB7Ci0gICAgICAgIHBhY2tlZCA9IHRydWU7ICAvLyBQYWNrZWQgdmFsdWUuCi0gICAgICB9IGVsc2UgewotICAgICAgICB1bmtub3duID0gdHJ1ZTsgIC8vIFdyb25nIHdpcmUgdHlwZS4KLSAgICAgIH0KLQotICAgICAgaWYgKHVua25vd24pIHsgIC8vIFVua25vd24gZmllbGQgb3Igd3Jvbmcgd2lyZSB0eXBlLiAgU2tpcC4KLSAgICAgICAgcmV0dXJuIGlucHV0LnNraXBGaWVsZCh0YWcpOwotICAgICAgfQotCi0gICAgICBpZiAocGFja2VkKSB7Ci0gICAgICAgIGZpbmFsIGludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTsKLSAgICAgICAgZmluYWwgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7Ci0gICAgICAgIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpID09IFdpcmVGb3JtYXQuRmllbGRUeXBlLkVOVU0pIHsKLSAgICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpOwotICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlID0KLSAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRFbnVtVHlwZSgpLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXNuJ3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzCi0gICAgICAgICAgICAgIC8vIGVudW0sIGRyb3AgaXQgKGRvbid0IGV2ZW4gYWRkIGl0IHRvIHVua25vd25GaWVsZHMpLgotICAgICAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB3aGlsZSAoaW5wdXQuZ2V0Qnl0ZXNVbnRpbExpbWl0KCkgPiAwKSB7Ci0gICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUgPQotICAgICAgICAgICAgICBGaWVsZFNldC5yZWFkUHJpbWl0aXZlRmllbGQoaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpKTsKLSAgICAgICAgICAgIGVuc3VyZUV4dGVuc2lvbnNJc011dGFibGUoKTsKLSAgICAgICAgICAgIGV4dGVuc2lvbnMuYWRkUmVwZWF0ZWRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgICBpbnB1dC5wb3BMaW1pdChsaW1pdCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWU7Ci0gICAgICAgIHN3aXRjaCAoZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZUphdmFUeXBlKCkpIHsKLSAgICAgICAgICBjYXNlIE1FU1NBR0U6IHsKLSAgICAgICAgICAgIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgc3ViQnVpbGRlciA9IG51bGw7Ci0gICAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5kZXNjcmlwdG9yLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSBleGlzdGluZ1ZhbHVlID0KLSAgICAgICAgICAgICAgICAgIChNZXNzYWdlTGl0ZSkgZXh0ZW5zaW9ucy5nZXRGaWVsZChleHRlbnNpb24uZGVzY3JpcHRvcik7Ci0gICAgICAgICAgICAgIGlmIChleGlzdGluZ1ZhbHVlICE9IG51bGwpIHsKLSAgICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gZXhpc3RpbmdWYWx1ZS50b0J1aWxkZXIoKTsKLSAgICAgICAgICAgICAgfQotICAgICAgICAgICAgfQotICAgICAgICAgICAgaWYgKHN1YkJ1aWxkZXIgPT0gbnVsbCkgewotICAgICAgICAgICAgICBzdWJCdWlsZGVyID0gZXh0ZW5zaW9uLm1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRMaXRlVHlwZSgpID09Ci0gICAgICAgICAgICAgICAgV2lyZUZvcm1hdC5GaWVsZFR5cGUuR1JPVVApIHsKLSAgICAgICAgICAgICAgaW5wdXQucmVhZEdyb3VwKGV4dGVuc2lvbi5nZXROdW1iZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgIGlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHZhbHVlID0gc3ViQnVpbGRlci5idWlsZCgpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICAgIGZpbmFsIGludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7Ci0gICAgICAgICAgICB2YWx1ZSA9IGV4dGVuc2lvbi5kZXNjcmlwdG9yLmdldEVudW1UeXBlKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLmZpbmRWYWx1ZUJ5TnVtYmVyKHJhd1ZhbHVlKTsKLSAgICAgICAgICAgIC8vIElmIHRoZSBudW1iZXIgaXNuJ3QgcmVjb2duaXplZCBhcyBhIHZhbGlkIHZhbHVlIGZvciB0aGlzIGVudW0sCi0gICAgICAgICAgICAvLyBkcm9wIGl0LgotICAgICAgICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICBkZWZhdWx0OgotICAgICAgICAgICAgdmFsdWUgPSBGaWVsZFNldC5yZWFkUHJpbWl0aXZlRmllbGQoaW5wdXQsCi0gICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IuZ2V0TGl0ZVR5cGUoKSk7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgfQotCi0gICAgICAgIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICBlbnN1cmVFeHRlbnNpb25zSXNNdXRhYmxlKCk7Ci0gICAgICAgICAgZXh0ZW5zaW9ucy5hZGRSZXBlYXRlZEZpZWxkKGV4dGVuc2lvbi5kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgICAgIGV4dGVuc2lvbnMuc2V0RmllbGQoZXh0ZW5zaW9uLmRlc2NyaXB0b3IsIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwcm90ZWN0ZWQgZmluYWwgdm9pZCBtZXJnZUV4dGVuc2lvbkZpZWxkcyhmaW5hbCBNZXNzYWdlVHlwZSBvdGhlcikgewotICAgICAgZW5zdXJlRXh0ZW5zaW9uc0lzTXV0YWJsZSgpOwotICAgICAgZXh0ZW5zaW9ucy5tZXJnZUZyb20oKChFeHRlbmRhYmxlTWVzc2FnZSkgb3RoZXIpLmV4dGVuc2lvbnMpOwotICAgIH0KLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqIEZvciB1c2UgYnkgZ2VuZXJhdGVkIGNvZGUgb25seS4gKi8KLSAgcHVibGljIHN0YXRpYyA8Q29udGFpbmluZ1R5cGUgZXh0ZW5kcyBNZXNzYWdlTGl0ZSwgVHlwZT4KLSAgICAgIEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4KLSAgICAgICAgICBuZXdTaW5ndWxhckdlbmVyYXRlZEV4dGVuc2lvbigKLSAgICAgICAgICAgICAgZmluYWwgQ29udGFpbmluZ1R5cGUgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgICAgICAgIGZpbmFsIFR5cGUgZGVmYXVsdFZhbHVlLAotICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICAgICAgICBmaW5hbCBJbnRlcm5hbC5FbnVtTGl0ZU1hcDw/PiBlbnVtVHlwZU1hcCwKLSAgICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSkgewotICAgIHJldHVybiBuZXcgR2VuZXJhdGVkRXh0ZW5zaW9uPENvbnRhaW5pbmdUeXBlLCBUeXBlPigKLSAgICAgICAgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgIGRlZmF1bHRWYWx1ZSwKLSAgICAgICAgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgbmV3IEV4dGVuc2lvbkRlc2NyaXB0b3IoZW51bVR5cGVNYXAsIG51bWJlciwgdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNSZXBlYXRlZCAqLywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UgLyogaXNQYWNrZWQgKi8pKTsKLSAgfQotCi0gIC8qKiBGb3IgdXNlIGJ5IGdlbmVyYXRlZCBjb2RlIG9ubHkuICovCi0gIHB1YmxpYyBzdGF0aWMgPENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIFR5cGU+Ci0gICAgICBHZW5lcmF0ZWRFeHRlbnNpb248Q29udGFpbmluZ1R5cGUsIFR5cGU+Ci0gICAgICAgICAgbmV3UmVwZWF0ZWRHZW5lcmF0ZWRFeHRlbnNpb24oCi0gICAgICAgICAgICAgIGZpbmFsIENvbnRhaW5pbmdUeXBlIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICAgICAgICBmaW5hbCBJbnRlcm5hbC5FbnVtTGl0ZU1hcDw/PiBlbnVtVHlwZU1hcCwKLSAgICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciwKLSAgICAgICAgICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgICAgICAgZmluYWwgYm9vbGVhbiBpc1BhY2tlZCkgewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKSAgLy8gU3ViY2xhc3NlcyBlbnN1cmUgVHlwZSBpcyBhIExpc3QKLSAgICBUeXBlIGVtcHR5TGlzdCA9IChUeXBlKSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICByZXR1cm4gbmV3IEdlbmVyYXRlZEV4dGVuc2lvbjxDb250YWluaW5nVHlwZSwgVHlwZT4oCi0gICAgICAgIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlLAotICAgICAgICBlbXB0eUxpc3QsCi0gICAgICAgIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgIG5ldyBFeHRlbnNpb25EZXNjcmlwdG9yKAotICAgICAgICAgICAgZW51bVR5cGVNYXAsIG51bWJlciwgdHlwZSwgdHJ1ZSAvKiBpc1JlcGVhdGVkICovLCBpc1BhY2tlZCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgRXh0ZW5zaW9uRGVzY3JpcHRvcgotICAgICAgaW1wbGVtZW50cyBGaWVsZFNldC5GaWVsZERlc2NyaXB0b3JMaXRlPAotICAgICAgICBFeHRlbnNpb25EZXNjcmlwdG9yPiB7Ci0gICAgcHJpdmF0ZSBFeHRlbnNpb25EZXNjcmlwdG9yKAotICAgICAgICBmaW5hbCBJbnRlcm5hbC5FbnVtTGl0ZU1hcDw/PiBlbnVtVHlwZU1hcCwKLSAgICAgICAgZmluYWwgaW50IG51bWJlciwKLSAgICAgICAgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZSwKLSAgICAgICAgZmluYWwgYm9vbGVhbiBpc1JlcGVhdGVkLAotICAgICAgICBmaW5hbCBib29sZWFuIGlzUGFja2VkKSB7Ci0gICAgICB0aGlzLmVudW1UeXBlTWFwID0gZW51bVR5cGVNYXA7Ci0gICAgICB0aGlzLm51bWJlciA9IG51bWJlcjsKLSAgICAgIHRoaXMudHlwZSA9IHR5cGU7Ci0gICAgICB0aGlzLmlzUmVwZWF0ZWQgPSBpc1JlcGVhdGVkOwotICAgICAgdGhpcy5pc1BhY2tlZCA9IGlzUGFja2VkOwotICAgIH0KLQotICAgIHByaXZhdGUgZmluYWwgSW50ZXJuYWwuRW51bUxpdGVNYXA8Pz4gZW51bVR5cGVNYXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBpbnQgbnVtYmVyOwotICAgIHByaXZhdGUgZmluYWwgV2lyZUZvcm1hdC5GaWVsZFR5cGUgdHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNSZXBlYXRlZDsKLSAgICBwcml2YXRlIGZpbmFsIGJvb2xlYW4gaXNQYWNrZWQ7Ci0KLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKLSAgICAgIHJldHVybiBudW1iZXI7Ci0gICAgfQotCi0gICAgcHVibGljIFdpcmVGb3JtYXQuRmllbGRUeXBlIGdldExpdGVUeXBlKCkgewotICAgICAgcmV0dXJuIHR5cGU7Ci0gICAgfQotCi0gICAgcHVibGljIFdpcmVGb3JtYXQuSmF2YVR5cGUgZ2V0TGl0ZUphdmFUeXBlKCkgewotICAgICAgcmV0dXJuIHR5cGUuZ2V0SmF2YVR5cGUoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1JlcGVhdGVkKCkgewotICAgICAgcmV0dXJuIGlzUmVwZWF0ZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gaXNQYWNrZWQoKSB7Ci0gICAgICByZXR1cm4gaXNQYWNrZWQ7Ci0gICAgfQotCi0gICAgcHVibGljIEludGVybmFsLkVudW1MaXRlTWFwPD8+IGdldEVudW1UeXBlKCkgewotICAgICAgcmV0dXJuIGVudW1UeXBlTWFwOwotICAgIH0KLQotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIHB1YmxpYyBNZXNzYWdlTGl0ZS5CdWlsZGVyIGludGVybmFsTWVyZ2VGcm9tKAotICAgICAgICBNZXNzYWdlTGl0ZS5CdWlsZGVyIHRvLCBNZXNzYWdlTGl0ZSBmcm9tKSB7Ci0gICAgICByZXR1cm4gKChCdWlsZGVyKSB0bykubWVyZ2VGcm9tKChHZW5lcmF0ZWRNZXNzYWdlTGl0ZSkgZnJvbSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBjb21wYXJlVG8oRXh0ZW5zaW9uRGVzY3JpcHRvciBvdGhlcikgewotICAgICAgcmV0dXJuIG51bWJlciAtIG90aGVyLm51bWJlcjsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IHRvIHtAbGluayBHZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbn0uCi0gICAqCi0gICAqIFVzZXJzIHNob3VsZCBpZ25vcmUgdGhlIGNvbnRlbnRzIG9mIHRoaXMgY2xhc3MgYW5kIG9ubHkgdXNlIG9iamVjdHMgb2YKLSAgICogdGhpcyB0eXBlIGFzIHBhcmFtZXRlcnMgdG8gZXh0ZW5zaW9uIGFjY2Vzc29ycyBhbmQgRXh0ZW5zaW9uUmVnaXN0cnkuYWRkKCkuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEdlbmVyYXRlZEV4dGVuc2lvbjwKLSAgICAgIENvbnRhaW5pbmdUeXBlIGV4dGVuZHMgTWVzc2FnZUxpdGUsIFR5cGU+IHsKLQotICAgIHByaXZhdGUgR2VuZXJhdGVkRXh0ZW5zaW9uKAotICAgICAgICBmaW5hbCBDb250YWluaW5nVHlwZSBjb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSwKLSAgICAgICAgZmluYWwgVHlwZSBkZWZhdWx0VmFsdWUsCi0gICAgICAgIGZpbmFsIE1lc3NhZ2VMaXRlIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UsCi0gICAgICAgIGZpbmFsIEV4dGVuc2lvbkRlc2NyaXB0b3IgZGVzY3JpcHRvcikgewotICAgICAgLy8gRGVmZW5zaXZlIGNoZWNrcyB0byB2ZXJpZnkgdGhlIGNvcnJlY3QgaW5pdGlhbGl6YXRpb24gb3JkZXIgb2YKLSAgICAgIC8vIEdlbmVyYXRlZEV4dGVuc2lvbnMgYW5kIHRoZWlyIHJlbGF0ZWQgR2VuZXJhdGVkTWVzc2FnZXMuCi0gICAgICBpZiAoY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIk51bGwgY29udGFpbmluZ1R5cGVEZWZhdWx0SW5zdGFuY2UiKTsKLSAgICAgIH0KLSAgICAgIGlmIChkZXNjcmlwdG9yLmdldExpdGVUeXBlKCkgPT0gV2lyZUZvcm1hdC5GaWVsZFR5cGUuTUVTU0FHRSAmJgotICAgICAgICAgIG1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIk51bGwgbWVzc2FnZURlZmF1bHRJbnN0YW5jZSIpOwotICAgICAgfQotICAgICAgdGhpcy5jb250YWluaW5nVHlwZURlZmF1bHRJbnN0YW5jZSA9IGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlOwotICAgICAgdGhpcy5kZWZhdWx0VmFsdWUgPSBkZWZhdWx0VmFsdWU7Ci0gICAgICB0aGlzLm1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UgPSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlOwotICAgICAgdGhpcy5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKLSAgICB9Ci0KLSAgICBwcml2YXRlIGZpbmFsIENvbnRhaW5pbmdUeXBlIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgVHlwZSBkZWZhdWx0VmFsdWU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNZXNzYWdlTGl0ZSBtZXNzYWdlRGVmYXVsdEluc3RhbmNlOwotICAgIHByaXZhdGUgZmluYWwgRXh0ZW5zaW9uRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotCi0gICAgLyoqCi0gICAgICogRGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgdHlwZSBiZWluZyBleHRlbmRlZCwgdXNlZCB0byBpZGVudGlmeSB0aGF0IHR5cGUuCi0gICAgICovCi0gICAgcHVibGljIENvbnRhaW5pbmdUeXBlIGdldENvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlKCkgewotICAgICAgcmV0dXJuIGNvbnRhaW5pbmdUeXBlRGVmYXVsdEluc3RhbmNlOwotICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIGZpZWxkIG51bWJlci4gKi8KLSAgICBwdWJsaWMgaW50IGdldE51bWJlcigpIHsKLSAgICAgIHJldHVybiBkZXNjcmlwdG9yLmdldE51bWJlcigpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBleHRlbnNpb24gaXMgYW4gZW1iZWRkZWQgbWVzc2FnZSwgdGhpcyBpcyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZgotICAgICAqIHRoYXQgdHlwZS4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWVzc2FnZUxpdGUgZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICAgIHJldHVybiBtZXNzYWdlRGVmYXVsdEluc3RhbmNlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBBIHNlcmlhbGl6ZWQgKHNlcmlhbGl6YWJsZSkgZm9ybSBvZiB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UuICBTdG9yZXMgdGhlCi0gICAqIG1lc3NhZ2UgYXMgYSBjbGFzcyBuYW1lIGFuZCBhIGJ5dGUgYXJyYXkuCi0gICAqLwotICBzdGF0aWMgZmluYWwgY2xhc3MgU2VyaWFsaXplZEZvcm0gaW1wbGVtZW50cyBTZXJpYWxpemFibGUgewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IDBMOwotCi0gICAgcHJpdmF0ZSBTdHJpbmcgbWVzc2FnZUNsYXNzTmFtZTsKLSAgICBwcml2YXRlIGJ5dGVbXSBhc0J5dGVzOwotCi0gICAgLyoqCi0gICAgICogQ3JlYXRlcyB0aGUgc2VyaWFsaXplZCBmb3JtIGJ5IGNhbGxpbmcge0BsaW5rIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZUxpdGUjdG9CeXRlQXJyYXl9LgotICAgICAqIEBwYXJhbSByZWd1bGFyRm9ybSB0aGUgbWVzc2FnZSB0byBzZXJpYWxpemUKLSAgICAgKi8KLSAgICBTZXJpYWxpemVkRm9ybShNZXNzYWdlTGl0ZSByZWd1bGFyRm9ybSkgewotICAgICAgbWVzc2FnZUNsYXNzTmFtZSA9IHJlZ3VsYXJGb3JtLmdldENsYXNzKCkuZ2V0TmFtZSgpOwotICAgICAgYXNCeXRlcyA9IHJlZ3VsYXJGb3JtLnRvQnl0ZUFycmF5KCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogV2hlbiByZWFkIGZyb20gYW4gT2JqZWN0SW5wdXRTdHJlYW0sIHRoaXMgbWV0aG9kIGNvbnZlcnRzIHRoaXMgb2JqZWN0Ci0gICAgICogYmFjayB0byB0aGUgcmVndWxhciBmb3JtLiAgUGFydCBvZiBKYXZhJ3Mgc2VyaWFsaXphdGlvbiBtYWdpYy4KLSAgICAgKiBAcmV0dXJuIGEgR2VuZXJhdGVkTWVzc2FnZSBvZiB0aGUgdHlwZSB0aGF0IHdhcyBzZXJpYWxpemVkCi0gICAgICovCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHJvdGVjdGVkIE9iamVjdCByZWFkUmVzb2x2ZSgpIHRocm93cyBPYmplY3RTdHJlYW1FeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgQ2xhc3MgbWVzc2FnZUNsYXNzID0gQ2xhc3MuZm9yTmFtZShtZXNzYWdlQ2xhc3NOYW1lKTsKLSAgICAgICAgTWV0aG9kIG5ld0J1aWxkZXIgPSBtZXNzYWdlQ2xhc3MuZ2V0TWV0aG9kKCJuZXdCdWlsZGVyIik7Ci0gICAgICAgIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICAgICAgICAoTWVzc2FnZUxpdGUuQnVpbGRlcikgbmV3QnVpbGRlci5pbnZva2UobnVsbCk7Ci0gICAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKGFzQnl0ZXMpOwotICAgICAgICByZXR1cm4gYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICAgIH0gY2F0Y2ggKENsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgcHJvdG8gYnVmZmVyIGNsYXNzIiwgZSk7Ci0gICAgICB9IGNhdGNoIChOb1N1Y2hNZXRob2RFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGZpbmQgbmV3QnVpbGRlciBtZXRob2QiLCBlKTsKLSAgICAgIH0gY2F0Y2ggKElsbGVnYWxBY2Nlc3NFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiVW5hYmxlIHRvIGNhbGwgbmV3QnVpbGRlciBtZXRob2QiLCBlKTsKLSAgICAgIH0gY2F0Y2ggKEludm9jYXRpb25UYXJnZXRFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiRXJyb3IgY2FsbGluZyBuZXdCdWlsZGVyIiwgZS5nZXRDYXVzZSgpKTsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVbmFibGUgdG8gdW5kZXJzdGFuZCBwcm90byBidWZmZXIiLCBlKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUmVwbGFjZXMgdGhpcyBvYmplY3QgaW4gdGhlIG91dHB1dCBzdHJlYW0gd2l0aCBhIHNlcmlhbGl6ZWQgZm9ybS4KLSAgICogUGFydCBvZiBKYXZhJ3Mgc2VyaWFsaXphdGlvbiBtYWdpYy4gIEdlbmVyYXRlZCBzdWItY2xhc3NlcyBtdXN0IG92ZXJyaWRlCi0gICAqIHRoaXMgbWV0aG9kIGJ5IGNhbGxpbmcgPGNvZGU+cmV0dXJuIHN1cGVyLndyaXRlUmVwbGFjZSgpOzwvY29kZT4KLSAgICogQHJldHVybiBhIFNlcmlhbGl6ZWRGb3JtIG9mIHRoaXMgbWVzc2FnZQotICAgKi8KLSAgcHJvdGVjdGVkIE9iamVjdCB3cml0ZVJlcGxhY2UoKSB0aHJvd3MgT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3IFNlcmlhbGl6ZWRGb3JtKHRoaXMpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW50ZXJuYWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnRlcm5hbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwNWVhYjU3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnRlcm5hbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMjA2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEuaW8uVW5zdXBwb3J0ZWRFbmNvZGluZ0V4Y2VwdGlvbjsKLQotLyoqCi0gKiBUaGUgY2xhc3NlcyBjb250YWluZWQgd2l0aGluIGFyZSB1c2VkIGludGVybmFsbHkgYnkgdGhlIFByb3RvY29sIEJ1ZmZlcgotICogbGlicmFyeSBhbmQgZ2VuZXJhdGVkIG1lc3NhZ2UgaW1wbGVtZW50YXRpb25zLiBUaGV5IGFyZSBwdWJsaWMgb25seSBiZWNhdXNlCi0gKiB0aG9zZSBnZW5lcmF0ZWQgbWVzc2FnZXMgZG8gbm90IHJlc2lkZSBpbiB0aGUge0Bjb2RlIHByb3RvYnVmfSBwYWNrYWdlLgotICogT3RoZXJzIHNob3VsZCBub3QgdXNlIHRoaXMgY2xhc3MgZGlyZWN0bHkuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotICovCi1wdWJsaWMgY2xhc3MgSW50ZXJuYWwgewotICAvKioKLSAgICogSGVscGVyIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSB0byBjb25zdHJ1Y3QgZGVmYXVsdCB2YWx1ZXMgZm9yIHN0cmluZwotICAgKiBmaWVsZHMuCi0gICAqIDxwPgotICAgKiBUaGUgcHJvdG9jb2wgY29tcGlsZXIgZG9lcyBub3QgYWN0dWFsbHkgY29udGFpbiBhIFVURi04IGRlY29kZXIgLS0gaXQKLSAgICoganVzdCBwdXNoZXMgVVRGLTgtZW5jb2RlZCB0ZXh0IGFyb3VuZCB3aXRob3V0IHRvdWNoaW5nIGl0LiAgVGhlIG9uZSBwbGFjZQotICAgKiB3aGVyZSB0aGlzIHByZXNlbnRzIGEgcHJvYmxlbSBpcyB3aGVuIGdlbmVyYXRpbmcgSmF2YSBzdHJpbmcgbGl0ZXJhbHMuCi0gICAqIFVuaWNvZGUgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nIGxpdGVyYWwgd291bGQgbm9ybWFsbHkgbmVlZCB0byBiZSBlbmNvZGVkCi0gICAqIHVzaW5nIGEgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UsIHdoaWNoIHdvdWxkIHJlcXVpcmUgZGVjb2RpbmcgdGhlbS4KLSAgICogVG8gZ2V0IGFyb3VuZCB0aGlzLCBwcm90b2MgaW5zdGVhZCBlbWJlZHMgdGhlIFVURi04IGJ5dGVzIGludG8gdGhlCi0gICAqIGdlbmVyYXRlZCBjb2RlIGFuZCBsZWF2ZXMgaXQgdG8gdGhlIHJ1bnRpbWUgbGlicmFyeSB0byBkZWNvZGUgdGhlbS4KLSAgICogPHA+Ci0gICAqIEl0IGdldHMgd29yc2UsIHRob3VnaC4gIElmIHByb3RvYyBqdXN0IGdlbmVyYXRlZCBhIGJ5dGUgYXJyYXksIGxpa2U6Ci0gICAqICAgbmV3IGJ5dGVbXSB7MHgxMiwgMHgzNCwgMHg1NiwgMHg3OH0KLSAgICogSmF2YSBhY3R1YWxseSBnZW5lcmF0ZXMgKmNvZGUqIHdoaWNoIGFsbG9jYXRlcyBhbiBhcnJheSBhbmQgdGhlbiBmaWxscwotICAgKiBpbiBlYWNoIHZhbHVlLiAgVGhpcyBpcyBtdWNoIGxlc3MgZWZmaWNpZW50IHRoYW4ganVzdCBlbWJlZGRpbmcgdGhlIGJ5dGVzCi0gICAqIGRpcmVjdGx5IGludG8gdGhlIGJ5dGVjb2RlLiAgVG8gZ2V0IGFyb3VuZCB0aGlzLCB3ZSBuZWVkIGFub3RoZXIKLSAgICogd29yay1hcm91bmQuICBTdHJpbmcgbGl0ZXJhbHMgYXJlIGVtYmVkZGVkIGRpcmVjdGx5LCBzbyBwcm90b2MgYWN0dWFsbHkKLSAgICogZ2VuZXJhdGVzIGEgc3RyaW5nIGxpdGVyYWwgY29ycmVzcG9uZGluZyB0byB0aGUgYnl0ZXMuICBUaGUgZWFzaWVzdCB3YXkKLSAgICogdG8gZG8gdGhpcyBpcyB0byB1c2UgdGhlIElTTy04ODU5LTEgY2hhcmFjdGVyIHNldCwgd2hpY2ggY29ycmVzcG9uZHMgdG8KLSAgICogdGhlIGZpcnN0IDI1NiBjaGFyYWN0ZXJzIG9mIHRoZSBVbmljb2RlIHJhbmdlLiAgUHJvdG9jIGNhbiB0aGVuIHVzZQotICAgKiBnb29kIG9sZCBDRXNjYXBlIHRvIGdlbmVyYXRlIHRoZSBzdHJpbmcuCi0gICAqIDxwPgotICAgKiBTbyB3ZSBoYXZlIGEgc3RyaW5nIGxpdGVyYWwgd2hpY2ggcmVwcmVzZW50cyBhIHNldCBvZiBieXRlcyB3aGljaAotICAgKiByZXByZXNlbnRzIGFub3RoZXIgc3RyaW5nLiAgVGhpcyBmdW5jdGlvbiAtLSBzdHJpbmdEZWZhdWx0VmFsdWUgLS0KLSAgICogY29udmVydHMgZnJvbSB0aGUgZ2VuZXJhdGVkIHN0cmluZyB0byB0aGUgc3RyaW5nIHdlIGFjdHVhbGx5IHdhbnQuICBUaGUKLSAgICogZ2VuZXJhdGVkIGNvZGUgY2FsbHMgdGhpcyBhdXRvbWF0aWNhbGx5LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgc3RyaW5nRGVmYXVsdFZhbHVlKFN0cmluZyBieXRlcykgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gbmV3IFN0cmluZyhieXRlcy5nZXRCeXRlcygiSVNPLTg4NTktMSIpLCAiVVRGLTgiKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSBhbGwgSlZNcyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50Ci0gICAgICAvLyBib3RoIG9mIHRoZSBhYm92ZSBjaGFyYWN0ZXIgc2V0cy4KLSAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oCi0gICAgICAgICAgIkphdmEgVk0gZG9lcyBub3Qgc3VwcG9ydCBhIHN0YW5kYXJkIGNoYXJhY3RlciBzZXQuIiwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBjYWxsZWQgYnkgZ2VuZXJhdGVkIGNvZGUgdG8gY29uc3RydWN0IGRlZmF1bHQgdmFsdWVzIGZvciBieXRlcwotICAgKiBmaWVsZHMuCi0gICAqIDxwPgotICAgKiBUaGlzIGlzIGEgbG90IGxpa2Uge0BsaW5rICNzdHJpbmdEZWZhdWx0VmFsdWV9LCBidXQgZm9yIGJ5dGVzIGZpZWxkcy4KLSAgICogSW4gdGhpcyBjYXNlIHdlIG9ubHkgbmVlZCB0aGUgc2Vjb25kIG9mIHRoZSB0d28gaGFja3MgLS0gYWxsb3dpbmcgdXMgdG8KLSAgICogZW1iZWQgcmF3IGJ5dGVzIGFzIGEgc3RyaW5nIGxpdGVyYWwgd2l0aCBJU08tODg1OS0xIGVuY29kaW5nLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGJ5dGVzRGVmYXVsdFZhbHVlKFN0cmluZyBieXRlcykgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShieXRlcy5nZXRCeXRlcygiSVNPLTg4NTktMSIpKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRoaXMgc2hvdWxkIG5ldmVyIGhhcHBlbiBzaW5jZSBhbGwgSlZNcyBhcmUgcmVxdWlyZWQgdG8gaW1wbGVtZW50Ci0gICAgICAvLyBJU08tODg1OS0xLgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbigKLSAgICAgICAgICAiSmF2YSBWTSBkb2VzIG5vdCBzdXBwb3J0IGEgc3RhbmRhcmQgY2hhcmFjdGVyIHNldC4iLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIGNhbGxlZCBieSBnZW5lcmF0ZWQgY29kZSB0byBkZXRlcm1pbmUgaWYgYSBieXRlIGFycmF5IGlzIGEgdmFsaWQKLSAgICogVVRGLTggZW5jb2RlZCBzdHJpbmcgc3VjaCB0aGF0IHRoZSBvcmlnaW5hbCBieXRlcyBjYW4gYmUgY29udmVydGVkIHRvCi0gICAqIGEgU3RyaW5nIG9iamVjdCBhbmQgdGhlbiBiYWNrIHRvIGEgYnl0ZSBhcnJheSByb3VuZCB0cmlwcGluZyB0aGUgYnl0ZXMKLSAgICogd2l0aG91dCBsb3NzLgotICAgKiA8cD4KLSAgICogVGhpcyBpcyBpbnNwaXJlZCBieSBVVEZfOC5qYXZhIGluIHN1bi5uaW8uY3MuCi0gICAqCi0gICAqIEBwYXJhbSBieXRlU3RyaW5nIHRoZSBzdHJpbmcgdG8gY2hlY2sKLSAgICogQHJldHVybiB3aGV0aGVyIHRoZSBieXRlIGFycmF5IGlzIHJvdW5kIHRyaXBwYWJsZQotICAgKi8KLSAgcHVibGljIHN0YXRpYyBib29sZWFuIGlzVmFsaWRVdGY4KEJ5dGVTdHJpbmcgYnl0ZVN0cmluZykgewotICAgIGludCBpbmRleCA9IDA7Ci0gICAgaW50IHNpemUgPSBieXRlU3RyaW5nLnNpemUoKTsKLSAgICAvLyBUbyBhdm9pZCB0aGUgbWFza2luZywgd2UgY291bGQgY2hhbmdlIHRoaXMgdG8gdXNlIGJ5dGVzOwotICAgIC8vIFRoZW4gWCA+IDB4QzIgZ2V0cyB0dXJuZWQgaW50byBYIDwgLTB4QzI7IFggPCAweDgwCi0gICAgLy8gZ2V0cyB0dXJuZWQgaW50byBYID49IDAsIGV0Yy4KLQotICAgIHdoaWxlIChpbmRleCA8IHNpemUpIHsKLSAgICAgIGludCBieXRlMSA9IGJ5dGVTdHJpbmcuYnl0ZUF0KGluZGV4KyspICYgMHhGRjsKLSAgICAgIGlmIChieXRlMSA8IDB4ODApIHsKLSAgICAgICAgLy8gZmFzdCBsb29wIGZvciBzaW5nbGUgYnl0ZXMKLSAgICAgICAgY29udGludWU7Ci0KLSAgICAgICAgLy8gd2Uga25vdyBmcm9tIHRoaXMgcG9pbnQgb24gdGhhdCB3ZSBoYXZlIDItNCBieXRlIGZvcm1zCi0gICAgICB9IGVsc2UgaWYgKGJ5dGUxIDwgMHhDMiB8fCBieXRlMSA+IDB4RjQpIHsKLSAgICAgICAgLy8gY2F0Y2ggaWxsZWdhbCBmaXJzdCBieXRlczogPCBDMiBvciA+IEY0Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIGlmIChpbmRleCA+PSBzaXplKSB7Ci0gICAgICAgIC8vIGZhaWwgaWYgd2UgcnVuIG91dCBvZiBieXRlcwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpbnQgYnl0ZTIgPSBieXRlU3RyaW5nLmJ5dGVBdChpbmRleCsrKSAmIDB4RkY7Ci0gICAgICBpZiAoYnl0ZTIgPCAweDgwIHx8IGJ5dGUyID4gMHhCRikgewotICAgICAgICAvLyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoYnl0ZTEgPD0gMHhERikgewotICAgICAgICAvLyB0d28tYnl0ZSBmb3JtOyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdCBpcyBzdWZmaWNpZW50Ci0gICAgICAgIGNvbnRpbnVlOwotICAgICAgfQotCi0gICAgICAvLyB3ZSBrbm93IGZyb20gdGhpcyBwb2ludCBvbiB0aGF0IHdlIGhhdmUgMyBvciA0IGJ5dGUgZm9ybXMKLSAgICAgIGlmIChpbmRleCA+PSBzaXplKSB7Ci0gICAgICAgIC8vIGZhaWwgaWYgd2UgcnVuIG91dCBvZiBieXRlcwotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpbnQgYnl0ZTMgPSBieXRlU3RyaW5nLmJ5dGVBdChpbmRleCsrKSAmIDB4RkY7Ci0gICAgICBpZiAoYnl0ZTMgPCAweDgwIHx8IGJ5dGUzID4gMHhCRikgewotICAgICAgICAvLyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdAotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0gICAgICBpZiAoYnl0ZTEgPD0gMHhFRikgewotICAgICAgICAvLyB0aHJlZS1ieXRlIGZvcm0uIFZhc3RseSBtb3JlIGZyZXF1ZW50IHRoYW4gZm91ci1ieXRlIGZvcm1zCi0gICAgICAgIC8vIFRoZSBmb2xsb3dpbmcgaGFzIGFuIGV4dHJhIHRlc3QsIGJ1dCBub3Qgd29ydGggcmVzdHJ1Y3R1cmluZwotICAgICAgICBpZiAoYnl0ZTEgPT0gMHhFMCAmJiBieXRlMiA8IDB4QTAgfHwKLSAgICAgICAgICAgIGJ5dGUxID09IDB4RUQgJiYgYnl0ZTIgPiAweDlGKSB7Ci0gICAgICAgICAgLy8gY2hlY2sgc3BlY2lhbCBjYXNlcyBvZiBieXRlMgotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotCi0gICAgICB9IGVsc2UgewotICAgICAgICAvLyBmb3VyLWJ5dGUgZm9ybQotCi0gICAgICAgIGlmIChpbmRleCA+PSBzaXplKSB7Ci0gICAgICAgICAgLy8gZmFpbCBpZiB3ZSBydW4gb3V0IG9mIGJ5dGVzCi0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICAgIGludCBieXRlNCA9IGJ5dGVTdHJpbmcuYnl0ZUF0KGluZGV4KyspICYgMHhGRjsKLSAgICAgICAgaWYgKGJ5dGU0IDwgMHg4MCB8fCBieXRlNCA+IDB4QkYpIHsKLSAgICAgICAgICAvLyBnZW5lcmFsIHRyYWlsLWJ5dGUgdGVzdAotICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgfQotICAgICAgICAvLyBUaGUgZm9sbG93aW5nIGhhcyBhbiBleHRyYSB0ZXN0LCBidXQgbm90IHdvcnRoIHJlc3RydWN0dXJpbmcKLSAgICAgICAgaWYgKGJ5dGUxID09IDB4RjAgJiYgYnl0ZTIgPCAweDkwIHx8Ci0gICAgICAgICAgICBieXRlMSA9PSAweEY0ICYmIGJ5dGUyID4gMHg4RikgewotICAgICAgICAgIC8vIGNoZWNrIHNwZWNpYWwgY2FzZXMgb2YgYnl0ZTIKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLQotICAvKioKLSAgICogSW50ZXJmYWNlIGZvciBhbiBlbnVtIHZhbHVlIG9yIHZhbHVlIGRlc2NyaXB0b3IsIHRvIGJlIHVzZWQgaW4gRmllbGRTZXQuCi0gICAqIFRoZSBsaXRlIGxpYnJhcnkgc3RvcmVzIGVudW0gdmFsdWVzIGRpcmVjdGx5IGluIEZpZWxkU2V0cyBidXQgdGhlIGZ1bGwKLSAgICogbGlicmFyeSBzdG9yZXMgRW51bVZhbHVlRGVzY3JpcHRvcnMgaW4gb3JkZXIgdG8gYmV0dGVyIHN1cHBvcnQgcmVmbGVjdGlvbi4KLSAgICovCi0gIHB1YmxpYyBpbnRlcmZhY2UgRW51bUxpdGUgewotICAgIGludCBnZXROdW1iZXIoKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcmZhY2UgZm9yIGFuIG9iamVjdCB3aGljaCBtYXBzIGludGVnZXJzIHRvIHtAbGluayBFbnVtTGl0ZX1zLgotICAgKiB7QGxpbmsgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3J9IGltcGxlbWVudHMgdGhpcyBpbnRlcmZhY2UgYnkgbWFwcGluZwotICAgKiBudW1iZXJzIHRvIHtAbGluayBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yfXMuICBBZGRpdGlvbmFsbHksCi0gICAqIGV2ZXJ5IGdlbmVyYXRlZCBlbnVtIHR5cGUgaGFzIGEgc3RhdGljIG1ldGhvZCBpbnRlcm5hbEdldFZhbHVlTWFwKCkgd2hpY2gKLSAgICogcmV0dXJucyBhbiBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIHR5cGUgdGhhdCBtYXBzIG51bWJlcnMgdG8gZW51bSB2YWx1ZXMuCi0gICAqLwotICBwdWJsaWMgaW50ZXJmYWNlIEVudW1MaXRlTWFwPFQgZXh0ZW5kcyBFbnVtTGl0ZT4gewotICAgIFQgZmluZFZhbHVlQnlOdW1iZXIoaW50IG51bWJlcik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTBmN2ZmYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotCi0vKioKLSAqIFRocm93biB3aGVuIGEgcHJvdG9jb2wgbWVzc2FnZSBiZWluZyBwYXJzZWQgaXMgaW52YWxpZCBpbiBzb21lIHdheSwKLSAqIGUuZy4gaXQgY29udGFpbnMgYSBtYWxmb3JtZWQgdmFyaW50IG9yIGEgbmVnYXRpdmUgYnl0ZSBsZW5ndGguCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBleHRlbmRzIElPRXhjZXB0aW9uIHsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gLTE2MTYxNTE3NjMwNzI0NTA0NzZMOwotCi0gIHB1YmxpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oZmluYWwgU3RyaW5nIGRlc2NyaXB0aW9uKSB7Ci0gICAgc3VwZXIoZGVzY3JpcHRpb24pOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB0cnVuY2F0ZWRNZXNzYWdlKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgIldoaWxlIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlLCB0aGUgaW5wdXQgZW5kZWQgdW5leHBlY3RlZGx5ICIgKwotICAgICAgImluIHRoZSBtaWRkbGUgb2YgYSBmaWVsZC4gIFRoaXMgY291bGQgbWVhbiBlaXRoZXIgdGhhbiB0aGUgIiArCi0gICAgICAiaW5wdXQgaGFzIGJlZW4gdHJ1bmNhdGVkIG9yIHRoYXQgYW4gZW1iZWRkZWQgbWVzc2FnZSAiICsKLSAgICAgICJtaXNyZXBvcnRlZCBpdHMgb3duIGxlbmd0aC4iKTsKLSAgfQotCi0gIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gbmVnYXRpdmVTaXplKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgIkNvZGVkSW5wdXRTdHJlYW0gZW5jb3VudGVyZWQgYW4gZW1iZWRkZWQgc3RyaW5nIG9yIG1lc3NhZ2UgIiArCi0gICAgICAid2hpY2ggY2xhaW1lZCB0byBoYXZlIG5lZ2F0aXZlIHNpemUuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIG1hbGZvcm1lZFZhcmludCgpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICJDb2RlZElucHV0U3RyZWFtIGVuY291bnRlcmVkIGEgbWFsZm9ybWVkIHZhcmludC4iKTsKLSAgfQotCi0gIHN0YXRpYyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gaW52YWxpZFRhZygpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICJQcm90b2NvbCBtZXNzYWdlIGNvbnRhaW5lZCBhbiBpbnZhbGlkIHRhZyAoemVybykuIik7Ci0gIH0KLQotICBzdGF0aWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGludmFsaWRFbmRUYWcoKSB7Ci0gICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAiUHJvdG9jb2wgbWVzc2FnZSBlbmQtZ3JvdXAgdGFnIGRpZCBub3QgbWF0Y2ggZXhwZWN0ZWQgdGFnLiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBpbnZhbGlkV2lyZVR5cGUoKSB7Ci0gICAgcmV0dXJuIG5ldyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oCi0gICAgICAiUHJvdG9jb2wgbWVzc2FnZSB0YWcgaGFkIGludmFsaWQgd2lyZSB0eXBlLiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiByZWN1cnNpb25MaW1pdEV4Y2VlZGVkKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKAotICAgICAgIlByb3RvY29sIG1lc3NhZ2UgaGFkIHRvbyBtYW55IGxldmVscyBvZiBuZXN0aW5nLiAgTWF5IGJlIG1hbGljaW91cy4gICIgKwotICAgICAgIlVzZSBDb2RlZElucHV0U3RyZWFtLnNldFJlY3Vyc2lvbkxpbWl0KCkgdG8gaW5jcmVhc2UgdGhlIGRlcHRoIGxpbWl0LiIpOwotICB9Ci0KLSAgc3RhdGljIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBzaXplTGltaXRFeGNlZWRlZCgpIHsKLSAgICByZXR1cm4gbmV3IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbigKLSAgICAgICJQcm90b2NvbCBtZXNzYWdlIHdhcyB0b28gbGFyZ2UuICBNYXkgYmUgbWFsaWNpb3VzLiAgIiArCi0gICAgICAiVXNlIENvZGVkSW5wdXRTdHJlYW0uc2V0U2l6ZUxpbWl0KCkgdG8gaW5jcmVhc2UgdGhlIHNpemUgbGltaXQuIik7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0FycmF5TGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxNjgzYTY0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5SYW5kb21BY2Nlc3M7Ci1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb247Ci0KLS8qKgotICogQW4gaW1wbGVtZW50YXRpb24gb2Yge0BsaW5rIExhenlTdHJpbmdMaXN0fSB0aGF0IHdyYXBzIGFuIEFycmF5TGlzdC4gRWFjaAotICogZWxlbWVudCBpcyBlaXRoZXIgYSBCeXRlU3RyaW5nIG9yIGEgU3RyaW5nLiBJdCBjYWNoZXMgdGhlIGxhc3Qgb25lIHJlcXVlc3RlZAotICogd2hpY2ggaXMgbW9zdCBsaWtlbHkgdGhlIG9uZSBuZWVkZWQgbmV4dC4gVGhpcyBtaW5pbWl6ZXMgbWVtb3J5IHVzYWdlIHdoaWxlCi0gKiBzYXRpc2Z5aW5nIHRoZSBtb3N0IGNvbW1vbiB1c2UgY2FzZXMuCi0gKiA8cD4KLSAqIDxzdHJvbmc+Tm90ZSB0aGF0IHRoaXMgaW1wbGVtZW50YXRpb24gaXMgbm90IHN5bmNocm9uaXplZC48L3N0cm9uZz4KLSAqIElmIG11bHRpcGxlIHRocmVhZHMgYWNjZXNzIGFuIDx0dD5BcnJheUxpc3Q8L3R0PiBpbnN0YW5jZSBjb25jdXJyZW50bHksCi0gKiBhbmQgYXQgbGVhc3Qgb25lIG9mIHRoZSB0aHJlYWRzIG1vZGlmaWVzIHRoZSBsaXN0IHN0cnVjdHVyYWxseSwgaXQKLSAqIDxpPm11c3Q8L2k+IGJlIHN5bmNocm9uaXplZCBleHRlcm5hbGx5LiAgKEEgc3RydWN0dXJhbCBtb2RpZmljYXRpb24gaXMKLSAqIGFueSBvcGVyYXRpb24gdGhhdCBhZGRzIG9yIGRlbGV0ZXMgb25lIG9yIG1vcmUgZWxlbWVudHMsIG9yIGV4cGxpY2l0bHkKLSAqIHJlc2l6ZXMgdGhlIGJhY2tpbmcgYXJyYXk7IG1lcmVseSBzZXR0aW5nIHRoZSB2YWx1ZSBvZiBhbiBlbGVtZW50IGlzIG5vdAotICogYSBzdHJ1Y3R1cmFsIG1vZGlmaWNhdGlvbi4pICBUaGlzIGlzIHR5cGljYWxseSBhY2NvbXBsaXNoZWQgYnkKLSAqIHN5bmNocm9uaXppbmcgb24gc29tZSBvYmplY3QgdGhhdCBuYXR1cmFsbHkgZW5jYXBzdWxhdGVzIHRoZSBsaXN0LgotICogPHA+Ci0gKiBJZiB0aGUgaW1wbGVtZW50YXRpb24gaXMgYWNjZXNzZWQgdmlhIGNvbmN1cnJlbnQgcmVhZHMsIHRoaXMgaXMgdGhyZWFkIHNhZmUuCi0gKiBDb252ZXJzaW9ucyBhcmUgZG9uZSBpbiBhIHRocmVhZCBzYWZlIG1hbm5lci4gSXQncyBwb3NzaWJsZSB0aGF0IHRoZQotICogY29udmVyc2lvbiBtYXkgaGFwcGVuIG1vcmUgdGhhbiBvbmNlIGlmIHR3byB0aHJlYWRzIGF0dGVtcHQgdG8gYWNjZXNzIHRoZQotICogc2FtZSBlbGVtZW50IGFuZCB0aGUgbW9kaWZpY2F0aW9ucyB3ZXJlIG5vdCB2aXNpYmxlIHRvIGVhY2ggb3RoZXIsIGJ1dCB0aGlzCi0gKiB3aWxsIG5vdCByZXN1bHQgaW4gYW55IGNvcnJ1cHRpb24gb2YgdGhlIGxpc3Qgb3IgY2hhbmdlIGluIGJlaGF2aW9yIG90aGVyCi0gKiB0aGFuIHBlcmZvcm1hbmNlLgotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgY2xhc3MgTGF6eVN0cmluZ0FycmF5TGlzdCBleHRlbmRzIEFic3RyYWN0TGlzdDxTdHJpbmc+Ci0gICAgaW1wbGVtZW50cyBMYXp5U3RyaW5nTGlzdCwgUmFuZG9tQWNjZXNzIHsKLQotICBwdWJsaWMgZmluYWwgc3RhdGljIExhenlTdHJpbmdMaXN0IEVNUFRZID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KAotICAgICAgbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKSk7Ci0KLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PE9iamVjdD4gbGlzdDsKLQotICBwdWJsaWMgTGF6eVN0cmluZ0FycmF5TGlzdCgpIHsKLSAgICBsaXN0ID0gbmV3IEFycmF5TGlzdDxPYmplY3Q+KCk7Ci0gIH0KLQotICBwdWJsaWMgTGF6eVN0cmluZ0FycmF5TGlzdChMaXN0PFN0cmluZz4gZnJvbSkgewotICAgIGxpc3QgPSBuZXcgQXJyYXlMaXN0PE9iamVjdD4oZnJvbSk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7Ci0gICAgT2JqZWN0IG8gPSBsaXN0LmdldChpbmRleCk7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKSBvOwotICAgIH0gZWxzZSB7Ci0gICAgICBCeXRlU3RyaW5nIGJzID0gKEJ5dGVTdHJpbmcpIG87Ci0gICAgICBTdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpOwotICAgICAgaWYgKEludGVybmFsLmlzVmFsaWRVdGY4KGJzKSkgewotICAgICAgICBsaXN0LnNldChpbmRleCwgcyk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gczsKLSAgICB9Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBzaXplKCkgewotICAgIHJldHVybiBsaXN0LnNpemUoKTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgU3RyaW5nIHNldChpbnQgaW5kZXgsIFN0cmluZyBzKSB7Ci0gICAgT2JqZWN0IG8gPSBsaXN0LnNldChpbmRleCwgcyk7Ci0gICAgcmV0dXJuIGFzU3RyaW5nKG8pOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyB2b2lkIGFkZChpbnQgaW5kZXgsIFN0cmluZyBlbGVtZW50KSB7Ci0gICAgbGlzdC5hZGQoaW5kZXgsIGVsZW1lbnQpOwotICAgIG1vZENvdW50Kys7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gYWRkQWxsKGludCBpbmRleCwgQ29sbGVjdGlvbjw/IGV4dGVuZHMgU3RyaW5nPiBjKSB7Ci0gICAgYm9vbGVhbiByZXQgPSBsaXN0LmFkZEFsbChpbmRleCwgYyk7Ci0gICAgbW9kQ291bnQrKzsKLSAgICByZXR1cm4gcmV0OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgcmVtb3ZlKGludCBpbmRleCkgewotICAgIE9iamVjdCBvID0gbGlzdC5yZW1vdmUoaW5kZXgpOwotICAgIG1vZENvdW50Kys7Ci0gICAgcmV0dXJuIGFzU3RyaW5nKG8pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgY2xlYXIoKSB7Ci0gICAgbGlzdC5jbGVhcigpOwotICAgIG1vZENvdW50Kys7Ci0gIH0KLQotICAvLyBAT3ZlcnJpZGUKLSAgcHVibGljIHZvaWQgYWRkKEJ5dGVTdHJpbmcgZWxlbWVudCkgewotICAgIGxpc3QuYWRkKGVsZW1lbnQpOwotICAgIG1vZENvdW50Kys7Ci0gIH0KLQotICAvLyBAT3ZlcnJpZGUKLSAgcHVibGljIEJ5dGVTdHJpbmcgZ2V0Qnl0ZVN0cmluZyhpbnQgaW5kZXgpIHsKLSAgICBPYmplY3QgbyA9IGxpc3QuZ2V0KGluZGV4KTsKLSAgICBpZiAobyBpbnN0YW5jZW9mIFN0cmluZykgewotICAgICAgQnl0ZVN0cmluZyBiID0gQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoKFN0cmluZykgbyk7Ci0gICAgICBsaXN0LnNldChpbmRleCwgYik7Ci0gICAgICByZXR1cm4gYjsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIChCeXRlU3RyaW5nKSBvOwotICAgIH0KLSAgfQotCi0gIHByaXZhdGUgU3RyaW5nIGFzU3RyaW5nKE9iamVjdCBvKSB7Ci0gICAgaWYgKG8gaW5zdGFuY2VvZiBTdHJpbmcpIHsKLSAgICAgIHJldHVybiAoU3RyaW5nKSBvOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gKChCeXRlU3RyaW5nKSBvKS50b1N0cmluZ1V0ZjgoKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nTGlzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdMaXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDk3MTM5Y2EuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdMaXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3MiArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBBbiBpbnRlcmZhY2UgZXh0ZW5kaW5nIExpc3QmbHQ7U3RyaW5nJmd0OyB0aGF0IGFsc28gcHJvdmlkZXMgYWNjZXNzIHRvIHRoZQotICogaXRlbXMgb2YgdGhlIGxpc3QgYXMgVVRGOC1lbmNvZGVkIEJ5dGVTdHJpbmcgb2JqZWN0cy4gVGhpcyBpcyB1c2VkIGJ5IHRoZQotICogcHJvdG9jb2wgYnVmZmVyIGltcGxlbWVudGF0aW9uIHRvIHN1cHBvcnQgbGF6aWx5IGNvbnZlcnRpbmcgYnl0ZXMgcGFyc2VkCi0gKiBvdmVyIHRoZSB3aXJlIHRvIFN0cmluZyBvYmplY3RzIHVudGlsIG5lZWRlZCBhbmQgYWxzbyBpbmNyZWFzZXMgdGhlCi0gKiBlZmZpY2llbmN5IG9mIHNlcmlhbGl6YXRpb24gaWYgdGhlIFN0cmluZyB3YXMgbmV2ZXIgcmVxdWVzdGVkIGFzIHRoZQotICogQnl0ZVN0cmluZyBpcyBhbHJlYWR5IGNhY2hlZC4KLSAqIDxwPgotICogVGhpcyBvbmx5IGFkZHMgYWRkaXRpb25hbCBtZXRob2RzIHRoYXQgYXJlIHJlcXVpcmVkIGZvciB0aGUgdXNlIGluIHRoZQotICogcHJvdG9jb2wgYnVmZmVyIGNvZGUgaW4gb3JkZXIgdG8gYmUgYWJsZSBzdWNjZXNzZnVseSByb3VuZCB0cmlwIGJ5dGUgYXJyYXlzCi0gKiB0aHJvdWdoIHBhcnNpbmcgYW5kIHNlcmlhbGl6YXRpb24gd2l0aG91dCBjb252ZXJzaW9uIHRvIHN0cmluZ3MuIEl0J3Mgbm90Ci0gKiBhdHRlbXB0aW5nIHRvIHN1cHBvcnQgdGhlIGZ1bmN0aW9uYWxpdHkgb2Ygc2F5IExpc3QmbHRCeXRlU3RyaW5nJmd0LCBoZW5jZQotICogd2h5IG9ubHkgdGhlc2UgdHdvIHZlcnkgc3BlY2lmaWMgbWV0aG9kcyBhcmUgYWRkZWQuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTGF6eVN0cmluZ0xpc3QgZXh0ZW5kcyBMaXN0PFN0cmluZz4gewotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0IGFzIGEgQnl0ZVN0cmluZy4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IGluZGV4IG9mIHRoZSBlbGVtZW50IHRvIHJldHVybgotICAgKiBAcmV0dXJuIHRoZSBlbGVtZW50IGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0Ci0gICAqIEB0aHJvd3MgSW5kZXhPdXRPZkJvdW5kc0V4Y2VwdGlvbiBpZiB0aGUgaW5kZXggaXMgb3V0IG9mIHJhbmdlCi0gICAqICAgICAgICAgKDx0dD5pbmRleCAmbHQ7IDAgfHwgaW5kZXggJmd0Oz0gc2l6ZSgpPC90dD4pCi0gICAqLwotICBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KTsKLQotICAvKioKLSAgICogQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QgKG9wdGlvbmFsCi0gICAqIG9wZXJhdGlvbikuCi0gICAqCi0gICAqIEBwYXJhbSBlbGVtZW50IGVsZW1lbnQgdG8gYmUgYXBwZW5kZWQgdG8gdGhpcyBsaXN0Ci0gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYgdGhlIDx0dD5hZGQ8L3R0PiBvcGVyYXRpb24KLSAgICogICAgICAgICBpcyBub3Qgc3VwcG9ydGVkIGJ5IHRoaXMgbGlzdAotICAgKi8KLSAgdm9pZCBhZGQoQnl0ZVN0cmluZyBlbGVtZW50KTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2N2M0MTQ4Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMTUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gVE9ETyhrZW50b24pOiAgVXNlIGdlbmVyaWNzPyAgRS5nLiBCdWlsZGVyPEJ1aWxkZXJUeXBlIGV4dGVuZHMgQnVpbGRlcj4sIHRoZW4KLS8vICAgbWVyZ2VGcm9tKigpIGNvdWxkIHJldHVybiBCdWlsZGVyVHlwZSBmb3IgYmV0dGVyIHR5cGUtc2FmZXR5LgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLQotLyoqCi0gKiBBYnN0cmFjdCBpbnRlcmZhY2UgaW1wbGVtZW50ZWQgYnkgUHJvdG9jb2wgTWVzc2FnZSBvYmplY3RzLgotICogPHA+Ci0gKiBTZWUgYWxzbyB7QGxpbmsgTWVzc2FnZUxpdGV9LCB3aGljaCBkZWZpbmVzIG1vc3Qgb2YgdGhlIG1ldGhvZHMgdGhhdCB0eXBpY2FsCi0gKiB1c2VycyBjYXJlIGFib3V0LiAge0BsaW5rIE1lc3NhZ2V9IGFkZHMgdG8gaXQgbWV0aG9kcyB0aGF0IGFyZSBub3QgYXZhaWxhYmxlCi0gKiBpbiB0aGUgImxpdGUiIHJ1bnRpbWUuICBUaGUgYmlnZ2VzdCBhZGRlZCBmZWF0dXJlcyBhcmUgaW50cm9zcGVjdGlvbiBhbmQKLSAqIHJlZmxlY3Rpb24gLS0gaS5lLiwgZ2V0dGluZyBkZXNjcmlwdG9ycyBmb3IgdGhlIG1lc3NhZ2UgdHlwZSBhbmQgYWNjZXNzaW5nCi0gKiB0aGUgZmllbGQgdmFsdWVzIGR5bmFtaWNhbGx5LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZSBleHRlbmRzIE1lc3NhZ2VMaXRlLCBNZXNzYWdlT3JCdWlsZGVyIHsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBDb21wYXJpc29uIGFuZCBoYXNoaW5nCi0KLSAgLyoqCi0gICAqIENvbXBhcmVzIHRoZSBzcGVjaWZpZWQgb2JqZWN0IHdpdGggdGhpcyBtZXNzYWdlIGZvciBlcXVhbGl0eS4gIFJldHVybnMKLSAgICogPHR0PnRydWU8L3R0PiBpZiB0aGUgZ2l2ZW4gb2JqZWN0IGlzIGEgbWVzc2FnZSBvZiB0aGUgc2FtZSB0eXBlIChhcwotICAgKiBkZWZpbmVkIGJ5IHtAY29kZSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfSkgYW5kIGhhcyBpZGVudGljYWwgdmFsdWVzIGZvcgotICAgKiBhbGwgb2YgaXRzIGZpZWxkcy4gIFN1YmNsYXNzZXMgbXVzdCBpbXBsZW1lbnQgdGhpczsgaW5oZXJpdGluZwotICAgKiB7QGNvZGUgT2JqZWN0LmVxdWFscygpfSBpcyBpbmNvcnJlY3QuCi0gICAqCi0gICAqIEBwYXJhbSBvdGhlciBvYmplY3QgdG8gYmUgY29tcGFyZWQgZm9yIGVxdWFsaXR5IHdpdGggdGhpcyBtZXNzYWdlCi0gICAqIEByZXR1cm4gPHR0PnRydWU8L3R0PiBpZiB0aGUgc3BlY2lmaWVkIG9iamVjdCBpcyBlcXVhbCB0byB0aGlzIG1lc3NhZ2UKLSAgICovCi0gIEBPdmVycmlkZQotICBib29sZWFuIGVxdWFscyhPYmplY3Qgb3RoZXIpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgbWVzc2FnZS4gIFRoZSBoYXNoIGNvZGUgb2YgYSBtZXNzYWdlCi0gICAqIHNob3VsZCBtaXggdGhlIG1lc3NhZ2UncyB0eXBlIChvYmplY3QgaWRlbnRpdHkgb2YgdGhlIGRlY3NyaXB0b3IpIHdpdGggaXRzCi0gICAqIGNvbnRlbnRzIChrbm93biBhbmQgdW5rbm93biBmaWVsZCB2YWx1ZXMpLiAgU3ViY2xhc3NlcyBtdXN0IGltcGxlbWVudCB0aGlzOwotICAgKiBpbmhlcml0aW5nIHtAY29kZSBPYmplY3QuaGFzaENvZGUoKX0gaXMgaW5jb3JyZWN0LgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBoYXNoIGNvZGUgdmFsdWUgZm9yIHRoaXMgbWVzc2FnZQotICAgKiBAc2VlIE1hcCNoYXNoQ29kZSgpCi0gICAqLwotICBAT3ZlcnJpZGUKLSAgaW50IGhhc2hDb2RlKCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcy4KLQotICAvKioKLSAgICogQ29udmVydHMgdGhlIG1lc3NhZ2UgdG8gYSBzdHJpbmcgaW4gcHJvdG9jb2wgYnVmZmVyIHRleHQgZm9ybWF0LiBUaGlzIGlzCi0gICAqIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIHtAbGluayBUZXh0Rm9ybWF0I3ByaW50VG9TdHJpbmcoTWVzc2FnZSl9LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIFN0cmluZyB0b1N0cmluZygpOwotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIEJ1aWxkZXJzCi0KLSAgLy8gKEZyb20gTWVzc2FnZUxpdGUsIHJlLWRlY2xhcmVkIGhlcmUgb25seSBmb3IgcmV0dXJuIHR5cGUgY292YXJpYW5jZS4pCi0gIEJ1aWxkZXIgbmV3QnVpbGRlckZvclR5cGUoKTsKLSAgQnVpbGRlciB0b0J1aWxkZXIoKTsKLQotICAvKioKLSAgICogQWJzdHJhY3QgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IFByb3RvY29sIE1lc3NhZ2UgYnVpbGRlcnMuCi0gICAqLwotICBpbnRlcmZhY2UgQnVpbGRlciBleHRlbmRzIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsIE1lc3NhZ2VPckJ1aWxkZXIgewotICAgIC8vIChGcm9tIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsIHJlLWRlY2xhcmVkIGhlcmUgb25seSBmb3IgcmV0dXJuIHR5cGUKLSAgICAvLyBjb3ZhcmlhbmNlLikKLSAgICBCdWlsZGVyIGNsZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB7QGNvZGUgb3RoZXJ9IGludG8gdGhlIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICB7QGNvZGUgb3RoZXJ9IG11c3QKLSAgICAgKiBoYXZlIHRoZSBleGFjdCBzYW1lIHR5cGUgYXMge0Bjb2RlIHRoaXN9IChpLmUuCi0gICAgICoge0Bjb2RlIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgPT0gb3RoZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0pLgotICAgICAqCi0gICAgICogTWVyZ2luZyBvY2N1cnMgYXMgZm9sbG93cy4gIEZvciBlYWNoIGZpZWxkOjxicj4KLSAgICAgKiAqIEZvciBzaW5ndWxhciBwcmltaXRpdmUgZmllbGRzLCBpZiB0aGUgZmllbGQgaXMgc2V0IGluIHtAY29kZSBvdGhlcn0sCi0gICAgICogICB0aGVuIHtAY29kZSBvdGhlcn0ncyB2YWx1ZSBvdmVyd3JpdGVzIHRoZSB2YWx1ZSBpbiB0aGlzIG1lc3NhZ2UuPGJyPgotICAgICAqICogRm9yIHNpbmd1bGFyIG1lc3NhZ2UgZmllbGRzLCBpZiB0aGUgZmllbGQgaXMgc2V0IGluIHtAY29kZSBvdGhlcn0sCi0gICAgICogICBpdCBpcyBtZXJnZWQgaW50byB0aGUgY29ycmVzcG9uZGluZyBzdWItbWVzc2FnZSBvZiB0aGlzIG1lc3NhZ2UKLSAgICAgKiAgIHVzaW5nIHRoZSBzYW1lIG1lcmdpbmcgcnVsZXMuPGJyPgotICAgICAqICogRm9yIHJlcGVhdGVkIGZpZWxkcywgdGhlIGVsZW1lbnRzIGluIHtAY29kZSBvdGhlcn0gYXJlIGNvbmNhdGVuYXRlZAotICAgICAqICAgd2l0aCB0aGUgZWxlbWVudHMgaW4gdGhpcyBtZXNzYWdlLgotICAgICAqCi0gICAgICogVGhpcyBpcyBlcXVpdmFsZW50IHRvIHRoZSB7QGNvZGUgTWVzc2FnZTo6TWVyZ2VGcm9tfSBtZXRob2QgaW4gQysrLgotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKE1lc3NhZ2Ugb3RoZXIpOwotCi0gICAgLy8gKEZyb20gTWVzc2FnZUxpdGUuQnVpbGRlciwgcmUtZGVjbGFyZWQgaGVyZSBvbmx5IGZvciByZXR1cm4gdHlwZQotICAgIC8vIGNvdmFyaWFuY2UuKQotICAgIE1lc3NhZ2UgYnVpbGQoKTsKLSAgICBNZXNzYWdlIGJ1aWxkUGFydGlhbCgpOwotICAgIEJ1aWxkZXIgY2xvbmUoKTsKLSAgICBCdWlsZGVyIG1lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0gICAgQnVpbGRlciBtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBtZXNzYWdlJ3MgdHlwZSdzIGRlc2NyaXB0b3IuCi0gICAgICogU2VlIHtAbGluayBNZXNzYWdlI2dldERlc2NyaXB0b3JGb3JUeXBlKCl9LgotICAgICAqLwotICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLQotICAgIC8qKgotICAgICAqIENyZWF0ZSBhIEJ1aWxkZXIgZm9yIG1lc3NhZ2VzIG9mIHRoZSBhcHByb3ByaWF0ZSB0eXBlIGZvciB0aGUgZ2l2ZW4KLSAgICAgKiBmaWVsZC4gIE1lc3NhZ2VzIGJ1aWx0IHdpdGggdGhpcyBjYW4gdGhlbiBiZSBwYXNzZWQgdG8gc2V0RmllbGQoKSwKLSAgICAgKiBzZXRSZXBlYXRlZEZpZWxkKCksIG9yIGFkZFJlcGVhdGVkRmllbGQoKS4KLSAgICAgKi8KLSAgICBCdWlsZGVyIG5ld0J1aWxkZXJGb3JGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpOwotCi0gICAgLyoqCi0gICAgICogU2V0cyBhIGZpZWxkIHRvIHRoZSBnaXZlbiB2YWx1ZS4gIFRoZSB2YWx1ZSBtdXN0IGJlIG9mIHRoZSBjb3JyZWN0IHR5cGUKLSAgICAgKiBmb3IgdGhpcyBmaWVsZCwgaS5lLiB0aGUgc2FtZSB0eXBlIHRoYXQKLSAgICAgKiB7QGxpbmsgTWVzc2FnZSNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSB3b3VsZCByZXR1cm4uCi0gICAgICovCi0gICAgQnVpbGRlciBzZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQsIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBDbGVhcnMgdGhlIGZpZWxkLiAgVGhpcyBpcyBleGFjdGx5IGVxdWl2YWxlbnQgdG8gY2FsbGluZyB0aGUgZ2VuZXJhdGVkCi0gICAgICogImNsZWFyIiBhY2Nlc3NvciBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQuCi0gICAgICovCi0gICAgQnVpbGRlciBjbGVhckZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7Ci0KLSAgICAvKioKLSAgICAgKiBTZXRzIGFuIGVsZW1lbnQgb2YgYSByZXBlYXRlZCBmaWVsZCB0byB0aGUgZ2l2ZW4gdmFsdWUuICBUaGUgdmFsdWUgbXVzdAotICAgICAqIGJlIG9mIHRoZSBjb3JyZWN0IHR5cGUgZm9yIHRoaXMgZmllbGQsIGkuZS4gdGhlIHNhbWUgdHlwZSB0aGF0Ci0gICAgICoge0BsaW5rIE1lc3NhZ2UjZ2V0UmVwZWF0ZWRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsaW50KX0gd291bGQKLSAgICAgKiByZXR1cm4uCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIG5vdCBhIHJlcGVhdGVkIGZpZWxkLCBvcgotICAgICAqICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KLSAgICAgKi8KLSAgICBCdWlsZGVyIHNldFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsIE9iamVjdCB2YWx1ZSk7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAY29kZSBzZXRSZXBlYXRlZEZpZWxkfSwgYnV0IGFwcGVuZHMgdGhlIHZhbHVlIGFzIGEgbmV3IGVsZW1lbnQuCi0gICAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIG5vdCBhIHJlcGVhdGVkIGZpZWxkLCBvcgotICAgICAqICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KLSAgICAgKi8KLSAgICBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkLCBPYmplY3QgdmFsdWUpOwotCi0gICAgLyoqIFNldCB0aGUge0BsaW5rIFVua25vd25GaWVsZFNldH0gZm9yIHRoaXMgbWVzc2FnZS4gKi8KLSAgICBCdWlsZGVyIHNldFVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpOwotCi0gICAgLyoqCi0gICAgICogTWVyZ2Ugc29tZSB1bmtub3duIGZpZWxkcyBpbnRvIHRoZSB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fSBmb3IgdGhpcwotICAgICAqIG1lc3NhZ2UuCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZVVua25vd25GaWVsZHMoVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gICAgLy8gQ29udmVuaWVuY2UgbWV0aG9kcy4KLQotICAgIC8vIChGcm9tIE1lc3NhZ2VMaXRlLkJ1aWxkZXIsIHJlLWRlY2xhcmVkIGhlcmUgb25seSBmb3IgcmV0dXJuIHR5cGUKLSAgICAvLyBjb3ZhcmlhbmNlLikKLSAgICBCdWlsZGVyIG1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0gICAgQnVpbGRlciBtZXJnZUZyb20oQnl0ZVN0cmluZyBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhKSB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0gICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0gICAgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4sCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0gICAgQnVpbGRlciBtZXJnZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICBCdWlsZGVyIG1lcmdlRnJvbShJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotICAgIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgICBib29sZWFuIG1lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGUuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzMWI4MjU2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9NZXNzYWdlTGl0ZS5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzI1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIFRPRE8oa2VudG9uKTogIFVzZSBnZW5lcmljcz8gIEUuZy4gQnVpbGRlcjxCdWlsZGVyVHlwZSBleHRlbmRzIEJ1aWxkZXI+LCB0aGVuCi0vLyAgIG1lcmdlRnJvbSooKSBjb3VsZCByZXR1cm4gQnVpbGRlclR5cGUgZm9yIGJldHRlciB0eXBlLXNhZmV0eS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT3V0cHV0U3RyZWFtOwotCi0vKioKLSAqIEFic3RyYWN0IGludGVyZmFjZSBpbXBsZW1lbnRlZCBieSBQcm90b2NvbCBNZXNzYWdlIG9iamVjdHMuCi0gKgotICogPHA+VGhpcyBpbnRlcmZhY2UgaXMgaW1wbGVtZW50ZWQgYnkgYWxsIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0cy4gIE5vbi1saXRlCi0gKiBtZXNzYWdlcyBhZGRpdGlvbmFsbHkgaW1wbGVtZW50IHRoZSBNZXNzYWdlIGludGVyZmFjZSwgd2hpY2ggaXMgYSBzdWJjbGFzcwotICogb2YgTWVzc2FnZUxpdGUuICBVc2UgTWVzc2FnZUxpdGUgaW5zdGVhZCB3aGVuIHlvdSBvbmx5IG5lZWQgdGhlIHN1YnNldCBvZgotICogZmVhdHVyZXMgd2hpY2ggaXQgc3VwcG9ydHMgLS0gbmFtZWx5LCBub3RoaW5nIHRoYXQgdXNlcyBkZXNjcmlwdG9ycyBvcgotICogcmVmbGVjdGlvbi4gIFlvdSBjYW4gaW5zdHJ1Y3QgdGhlIHByb3RvY29sIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGNsYXNzZXMKLSAqIHdoaWNoIGltcGxlbWVudCBvbmx5IE1lc3NhZ2VMaXRlLCBub3QgdGhlIGZ1bGwgTWVzc2FnZSBpbnRlcmZhY2UsIGJ5IGFkZGluZwotICogdGhlIGZvbGxvdyBsaW5lIHRvIHRoZSAucHJvdG8gZmlsZToKLSAqIDxwcmU+Ci0gKiAgIG9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0gKiA8L3ByZT4KLSAqCi0gKiA8cD5UaGlzIGlzIHBhcnRpY3VsYXJseSB1c2VmdWwgb24gcmVzb3VyY2UtY29uc3RyYWluZWQgc3lzdGVtcyB3aGVyZSB0aGUKLSAqIGZ1bGwgcHJvdG9jb2wgYnVmZmVycyBydW50aW1lIGxpYnJhcnkgaXMgdG9vIGJpZy4KLSAqCi0gKiA8cD5Ob3RlIHRoYXQgb24gbm9uLWNvbnN0cmFpbmVkIHN5c3RlbXMgKGUuZy4gc2VydmVycykgd2hlbiB5b3UgbmVlZCB0byBsaW5rCi0gKiBpbiBsb3RzIG9mIHByb3RvY29sIGRlZmluaXRpb25zLCBhIGJldHRlciB3YXkgdG8gcmVkdWNlIHRvdGFsIGNvZGUgZm9vdHByaW50Ci0gKiBpcyB0byB1c2Uge0Bjb2RlIG9wdGltaXplX2ZvciA9IENPREVfU0laRX0uICBUaGlzIHdpbGwgbWFrZSB0aGUgZ2VuZXJhdGVkCi0gKiBjb2RlIHNtYWxsZXIgd2hpbGUgc3RpbGwgc3VwcG9ydGluZyBhbGwgdGhlIHNhbWUgZmVhdHVyZXMgKGF0IHRoZSBleHBlbnNlIG9mCi0gKiBzcGVlZCkuICB7QGNvZGUgb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FfSBpcyBiZXN0IHdoZW4geW91IG9ubHkgaGF2ZSBhCi0gKiBzbWFsbCBudW1iZXIgb2YgbWVzc2FnZSB0eXBlcyBsaW5rZWQgaW50byB5b3VyIGJpbmFyeSwgaW4gd2hpY2ggY2FzZSB0aGUKLSAqIHNpemUgb2YgdGhlIHByb3RvY29sIGJ1ZmZlcnMgcnVudGltZSBpdHNlbGYgaXMgdGhlIGJpZ2dlc3QgcHJvYmxlbS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIE1lc3NhZ2VMaXRlIGV4dGVuZHMgTWVzc2FnZUxpdGVPckJ1aWxkZXIgewotCi0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgYW5kIHdyaXRlcyBpdCB0byB7QGNvZGUgb3V0cHV0fS4gIFRoaXMgZG9lcyBub3QKLSAgICogZmx1c2ggb3IgY2xvc2UgdGhlIHN0cmVhbS4KLSAgICovCi0gIHZvaWQgd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAvKioKLSAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgbWVzc2FnZS4gIFRoZSByZXN1bHQKLSAgICogaXMgb25seSBjb21wdXRlZCBvbiB0aGUgZmlyc3QgY2FsbCBhbmQgbWVtb2l6ZWQgYWZ0ZXIgdGhhdC4KLSAgICovCi0gIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIENvbnZlbmllbmNlIG1ldGhvZHMuCi0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSB7QGNvZGUgQnl0ZVN0cmluZ30gYW5kIHJldHVybnMgaXQuIFRoaXMgaXMKLSAgICoganVzdCBhIHRyaXZpYWwgd3JhcHBlciBhcm91bmQKLSAgICoge0BsaW5rICN3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtKX0uCi0gICAqLwotICBCeXRlU3RyaW5nIHRvQnl0ZVN0cmluZygpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEge0Bjb2RlIGJ5dGV9IGFycmF5IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcwotICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZAotICAgKiB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KLSAgICovCi0gIGJ5dGVbXSB0b0J5dGVBcnJheSgpOwotCi0gIC8qKgotICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIGFuZCB3cml0ZXMgaXQgdG8ge0Bjb2RlIG91dHB1dH0uICBUaGlzIGlzIGp1c3QgYQotICAgKiB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIHtAbGluayAjd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LiAgVGhpcyBkb2VzCi0gICAqIG5vdCBmbHVzaCBvciBjbG9zZSB0aGUgc3RyZWFtLgotICAgKiA8cD4KLSAgICogTk9URTogIFByb3RvY29sIEJ1ZmZlcnMgYXJlIG5vdCBzZWxmLWRlbGltaXRpbmcuICBUaGVyZWZvcmUsIGlmIHlvdSB3cml0ZQotICAgKiBhbnkgbW9yZSBkYXRhIHRvIHRoZSBzdHJlYW0gYWZ0ZXIgdGhlIG1lc3NhZ2UsIHlvdSBtdXN0IHNvbWVob3cgZW5zdXJlCi0gICAqIHRoYXQgdGhlIHBhcnNlciBvbiB0aGUgcmVjZWl2aW5nIGVuZCBkb2VzIG5vdCBpbnRlcnByZXQgdGhpcyBhcyBiZWluZwotICAgKiBwYXJ0IG9mIHRoZSBwcm90b2NvbCBtZXNzYWdlLiAgVGhpcyBjYW4gYmUgZG9uZSBlLmcuIGJ5IHdyaXRpbmcgdGhlIHNpemUKLSAgICogb2YgdGhlIG1lc3NhZ2UgYmVmb3JlIHRoZSBkYXRhLCB0aGVuIG1ha2luZyBzdXJlIHRvIGxpbWl0IHRoZSBpbnB1dCB0bwotICAgKiB0aGF0IHNpemUgb24gdGhlIHJlY2VpdmluZyBlbmQgKGUuZy4gYnkgd3JhcHBpbmcgdGhlIElucHV0U3RyZWFtIGluIG9uZQotICAgKiB3aGljaCBsaW1pdHMgdGhlIGlucHV0KS4gIEFsdGVybmF0aXZlbHksIGp1c3QgdXNlCi0gICAqIHtAbGluayAjd3JpdGVEZWxpbWl0ZWRUbyhPdXRwdXRTdHJlYW0pfS4KLSAgICovCi0gIHZvaWQgd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLyoqCi0gICAqIExpa2Uge0BsaW5rICN3cml0ZVRvKE91dHB1dFN0cmVhbSl9LCBidXQgd3JpdGVzIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlCi0gICAqIGFzIGEgdmFyaW50IGJlZm9yZSB3cml0aW5nIHRoZSBkYXRhLiAgVGhpcyBhbGxvd3MgbW9yZSBkYXRhIHRvIGJlIHdyaXR0ZW4KLSAgICogdG8gdGhlIHN0cmVhbSBhZnRlciB0aGUgbWVzc2FnZSB3aXRob3V0IHRoZSBuZWVkIHRvIGRlbGltaXQgdGhlIG1lc3NhZ2UKLSAgICogZGF0YSB5b3Vyc2VsZi4gIFVzZSB7QGxpbmsgQnVpbGRlciNtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0pfSAob3IKLSAgICogdGhlIHN0YXRpYyBtZXRob2Qge0Bjb2RlIFlvdXJNZXNzYWdlVHlwZS5wYXJzZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0pfSkKLSAgICogdG8gcGFyc2UgbWVzc2FnZXMgd3JpdHRlbiBieSB0aGlzIG1ldGhvZC4KLSAgICovCi0gIHZvaWQgd3JpdGVEZWxpbWl0ZWRUbyhPdXRwdXRTdHJlYW0gb3V0cHV0KSB0aHJvd3MgSU9FeGNlcHRpb247Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gQnVpbGRlcnMKLQotICAvKioKLSAgICogQ29uc3RydWN0cyBhIG5ldyBidWlsZGVyIGZvciBhIG1lc3NhZ2Ugb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG1lc3NhZ2UuCi0gICAqLwotICBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIENvbnN0cnVjdHMgYSBidWlsZGVyIGluaXRpYWxpemVkIHdpdGggdGhlIGN1cnJlbnQgbWVzc2FnZS4gIFVzZSB0aGlzIHRvCi0gICAqIGRlcml2ZSBhIG5ldyBtZXNzYWdlIGZyb20gdGhlIGN1cnJlbnQgb25lLgotICAgKi8KLSAgQnVpbGRlciB0b0J1aWxkZXIoKTsKLQotICAvKioKLSAgICogQWJzdHJhY3QgaW50ZXJmYWNlIGltcGxlbWVudGVkIGJ5IFByb3RvY29sIE1lc3NhZ2UgYnVpbGRlcnMuCi0gICAqLwotICBpbnRlcmZhY2UgQnVpbGRlciBleHRlbmRzIE1lc3NhZ2VMaXRlT3JCdWlsZGVyLCBDbG9uZWFibGUgewotICAgIC8qKiBSZXNldHMgYWxsIGZpZWxkcyB0byB0aGVpciBkZWZhdWx0IHZhbHVlcy4gKi8KLSAgICBCdWlsZGVyIGNsZWFyKCk7Ci0KLSAgICAvKioKLSAgICAgKiBDb25zdHJ1Y3QgdGhlIGZpbmFsIG1lc3NhZ2UuICBPbmNlIHRoaXMgaXMgY2FsbGVkLCB0aGUgQnVpbGRlciBpcyBubwotICAgICAqIGxvbmdlciB2YWxpZCwgYW5kIGNhbGxpbmcgYW55IG90aGVyIG1ldGhvZCB3aWxsIHJlc3VsdCBpbiB1bmRlZmluZWQKLSAgICAgKiBiZWhhdmlvciBhbmQgbWF5IHRocm93IGEgTnVsbFBvaW50ZXJFeGNlcHRpb24uICBJZiB5b3UgbmVlZCB0byBjb250aW51ZQotICAgICAqIHdvcmtpbmcgd2l0aCB0aGUgYnVpbGRlciBhZnRlciBjYWxsaW5nIHtAY29kZSBidWlsZCgpfSwge0Bjb2RlIGNsb25lKCl9Ci0gICAgICogaXQgZmlyc3QuCi0gICAgICogQHRocm93cyBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBUaGUgbWVzc2FnZSBpcyBtaXNzaW5nIG9uZSBvciBtb3JlCi0gICAgICogICAgICAgICByZXF1aXJlZCBmaWVsZHMgKGkuZS4ge0BsaW5rICNpc0luaXRpYWxpemVkKCl9IHJldHVybnMgZmFsc2UpLgotICAgICAqICAgICAgICAgVXNlIHtAbGluayAjYnVpbGRQYXJ0aWFsKCl9IHRvIGJ5cGFzcyB0aGlzIGNoZWNrLgotICAgICAqLwotICAgIE1lc3NhZ2VMaXRlIGJ1aWxkKCk7Ci0KLSAgICAvKioKLSAgICAgKiBMaWtlIHtAbGluayAjYnVpbGQoKX0sIGJ1dCBkb2VzIG5vdCB0aHJvdyBhbiBleGNlcHRpb24gaWYgdGhlIG1lc3NhZ2UKLSAgICAgKiBpcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gIEluc3RlYWQsIGEgcGFydGlhbCBtZXNzYWdlIGlzIHJldHVybmVkLgotICAgICAqIE9uY2UgdGhpcyBpcyBjYWxsZWQsIHRoZSBCdWlsZGVyIGlzIG5vIGxvbmdlciB2YWxpZCwgYW5kIGNhbGxpbmcgYW55Ci0gICAgICogd2lsbCByZXN1bHQgaW4gdW5kZWZpbmVkIGJlaGF2aW9yIGFuZCBtYXkgdGhyb3cgYSBOdWxsUG9pbnRlckV4Y2VwdGlvbi4KLSAgICAgKgotICAgICAqIElmIHlvdSBuZWVkIHRvIGNvbnRpbnVlIHdvcmtpbmcgd2l0aCB0aGUgYnVpbGRlciBhZnRlciBjYWxsaW5nCi0gICAgICoge0Bjb2RlIGJ1aWxkUGFydGlhbCgpfSwge0Bjb2RlIGNsb25lKCl9IGl0IGZpcnN0LgotICAgICAqLwotICAgIE1lc3NhZ2VMaXRlIGJ1aWxkUGFydGlhbCgpOwotCi0gICAgLyoqCi0gICAgICogQ2xvbmVzIHRoZSBCdWlsZGVyLgotICAgICAqIEBzZWUgT2JqZWN0I2Nsb25lKCkKLSAgICAgKi8KLSAgICBCdWlsZGVyIGNsb25lKCk7Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBmcm9tIHRoZSBpbnB1dCBhbmQgbWVyZ2VzIGl0IHdpdGggdGhpcwotICAgICAqIG1lc3NhZ2UsIGFzIGlmIHVzaW5nIHtAbGluayBCdWlsZGVyI21lcmdlRnJvbShNZXNzYWdlTGl0ZSl9LgotICAgICAqCi0gICAgICogPHA+V2FybmluZzogIFRoaXMgZG9lcyBub3QgdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudCBpbgotICAgICAqIHRoZSBpbnB1dCBtZXNzYWdlLiAgSWYgeW91IGNhbGwge0BsaW5rICNidWlsZCgpfSB3aXRob3V0IHNldHRpbmcgYWxsCi0gICAgICogcmVxdWlyZWQgZmllbGRzLCBpdCB3aWxsIHRocm93IGFuIHtAbGluayBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbn0sCi0gICAgICogd2hpY2ggaXMgYSB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gYW5kIHRodXMgbWlnaHQgbm90IGJlIGNhdWdodC4gIFRoZXJlCi0gICAgICogYXJlIGEgZmV3IGdvb2Qgd2F5cyB0byBkZWFsIHdpdGggdGhpczoKLSAgICAgKiA8dWw+Ci0gICAgICogICA8bGk+Q2FsbCB7QGxpbmsgI2lzSW5pdGlhbGl6ZWQoKX0gdG8gdmVyaWZ5IHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcwotICAgICAqICAgICAgIGFyZSBzZXQgYmVmb3JlIGJ1aWxkaW5nLgotICAgICAqICAgPGxpPlBhcnNlIHRoZSBtZXNzYWdlIHNlcGFyYXRlbHkgdXNpbmcgb25lIG9mIHRoZSBzdGF0aWMKLSAgICAgKiAgICAgICB7QGNvZGUgcGFyc2VGcm9tfSBtZXRob2RzLCB0aGVuIHVzZSB7QGxpbmsgI21lcmdlRnJvbShNZXNzYWdlTGl0ZSl9Ci0gICAgICogICAgICAgdG8gbWVyZ2UgaXQgd2l0aCB0aGlzIG9uZS4gIHtAY29kZSBwYXJzZUZyb219IHdpbGwgdGhyb3cgYW4KLSAgICAgKiAgICAgICB7QGxpbmsgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9ufSAoYW4ge0Bjb2RlIElPRXhjZXB0aW9ufSkKLSAgICAgKiAgICAgICBpZiBzb21lIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZy4KLSAgICAgKiAgIDxsaT5Vc2Uge0Bjb2RlIGJ1aWxkUGFydGlhbCgpfSB0byBidWlsZCwgd2hpY2ggaWdub3JlcyBtaXNzaW5nCi0gICAgICogICAgICAgcmVxdWlyZWQgZmllbGRzLgotICAgICAqIDwvdWw+Ci0gICAgICoKLSAgICAgKiA8cD5Ob3RlOiAgVGhlIGNhbGxlciBzaG91bGQgY2FsbAotICAgICAqIHtAbGluayBDb2RlZElucHV0U3RyZWFtI2NoZWNrTGFzdFRhZ1dhcyhpbnQpfSBhZnRlciBjYWxsaW5nIHRoaXMgdG8KLSAgICAgKiB2ZXJpZnkgdGhhdCB0aGUgbGFzdCB0YWcgc2VlbiB3YXMgdGhlIGFwcHJvcHJpYXRlIGVuZC1ncm91cCB0YWcsCi0gICAgICogb3IgemVybyBmb3IgRU9GLgotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rIEJ1aWxkZXIjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfSwgYnV0IGFsc28KLSAgICAgKiBwYXJzZXMgZXh0ZW5zaW9ucy4gIFRoZSBleHRlbnNpb25zIHRoYXQgeW91IHdhbnQgdG8gYmUgYWJsZSB0byBwYXJzZQotICAgICAqIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB7QGNvZGUgZXh0ZW5zaW9uUmVnaXN0cnl9LiAgRXh0ZW5zaW9ucyBub3QgaW4KLSAgICAgKiB0aGUgcmVnaXN0cnkgd2lsbCBiZSB0cmVhdGVkIGFzIHVua25vd24gZmllbGRzLgotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAgIC8vIENvbnZlbmllbmNlIG1ldGhvZHMuCi0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBCdWlsZGVyIG1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5KX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBCdWlsZGVyIG1lcmdlRnJvbShCeXRlU3RyaW5nIGRhdGEsCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSkgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuKQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb247Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBtZXNzYWdlIGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtLEV4dGVuc2lvblJlZ2lzdHJ5KX0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBCdWlsZGVyIG1lcmdlRnJvbShieXRlW10gZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhIG1lc3NhZ2Ugb2YgdGhpcyB0eXBlIGFuZCBtZXJnZSBpdCB3aXRoIHRoZQotICAgICAqIG1lc3NhZ2UgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0sRXh0ZW5zaW9uUmVnaXN0cnkpfS4KLSAgICAgKgotICAgICAqIEByZXR1cm4gdGhpcwotICAgICAqLwotICAgIEJ1aWxkZXIgbWVyZ2VGcm9tKGJ5dGVbXSBkYXRhLCBpbnQgb2ZmLCBpbnQgbGVuLAotICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkKLSAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0IHdpdGggdGhlCi0gICAgICogbWVzc2FnZSBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCi0gICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSl9LiAgTm90ZSB0aGF0IHRoaXMgbWV0aG9kIGFsd2F5cwotICAgICAqIHJlYWRzIHRoZSA8aT5lbnRpcmU8L2k+IGlucHV0ICh1bmxlc3MgaXQgdGhyb3dzIGFuIGV4Y2VwdGlvbikuICBJZiB5b3UKLSAgICAgKiB3YW50IGl0IHRvIHN0b3AgZWFybGllciwgeW91IHdpbGwgbmVlZCB0byB3cmFwIHlvdXIgaW5wdXQgaW4gc29tZQotICAgICAqIHdyYXBwZXIgc3RyZWFtIHRoYXQgbGltaXRzIHJlYWRpbmcuICBPciwgdXNlCi0gICAgICoge0BsaW5rIE1lc3NhZ2VMaXRlI3dyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtKX0gdG8gd3JpdGUgeW91ciBtZXNzYWdlCi0gICAgICogYW5kIHtAbGluayAjbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtKX0gdG8gcmVhZCBpdC4KLSAgICAgKiA8cD4KLSAgICAgKiBEZXNwaXRlIHVzdWFsbHkgcmVhZGluZyB0aGUgZW50aXJlIGlucHV0LCB0aGlzIGRvZXMgbm90IGNsb3NlIHRoZSBzdHJlYW0uCi0gICAgICoKLSAgICAgKiBAcmV0dXJuIHRoaXMKLSAgICAgKi8KLSAgICBCdWlsZGVyIG1lcmdlRnJvbShJbnB1dFN0cmVhbSBpbnB1dCkgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogUGFyc2UgYSBtZXNzYWdlIG9mIHRoaXMgdHlwZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0IHdpdGggdGhlCi0gICAgICogbWVzc2FnZSBiZWluZyBidWlsdC4gIFRoaXMgaXMganVzdCBhIHNtYWxsIHdyYXBwZXIgYXJvdW5kCi0gICAgICoge0BsaW5rICNtZXJnZUZyb20oQ29kZWRJbnB1dFN0cmVhbSxFeHRlbnNpb25SZWdpc3RyeSl9LgotICAgICAqCi0gICAgICogQHJldHVybiB0aGlzCi0gICAgICovCi0gICAgQnVpbGRlciBtZXJnZUZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLQotICAgIC8qKgotICAgICAqIExpa2Uge0BsaW5rICNtZXJnZUZyb20oSW5wdXRTdHJlYW0pfSwgYnV0IGRvZXMgbm90IHJlYWQgdW50aWwgRU9GLgotICAgICAqIEluc3RlYWQsIHRoZSBzaXplIG9mIHRoZSBtZXNzYWdlIChlbmNvZGVkIGFzIGEgdmFyaW50KSBpcyByZWFkIGZpcnN0LAotICAgICAqIHRoZW4gdGhlIG1lc3NhZ2UgZGF0YS4gIFVzZQotICAgICAqIHtAbGluayBNZXNzYWdlTGl0ZSN3cml0ZURlbGltaXRlZFRvKE91dHB1dFN0cmVhbSl9IHRvIHdyaXRlIG1lc3NhZ2VzIGluCi0gICAgICogdGhpcyBmb3JtYXQuCi0gICAgICoKLSAgICAgKiBAcmV0dXJucyBUcnVlIGlmIHN1Y2Nlc3NmdWwsIG9yIGZhbHNlIGlmIHRoZSBzdHJlYW0gaXMgYXQgRU9GIHdoZW4gdGhlCi0gICAgICogICAgICAgICAgbWV0aG9kIHN0YXJ0cy4gIEFueSBvdGhlciBlcnJvciAoaW5jbHVkaW5nIHJlYWNoaW5nIEVPRiBkdXJpbmcKLSAgICAgKiAgICAgICAgICBwYXJzaW5nKSB3aWxsIGNhdXNlIGFuIGV4Y2VwdGlvbiB0byBiZSB0aHJvd24uCi0gICAgICovCi0gICAgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uOwotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI21lcmdlRGVsaW1pdGVkRnJvbShJbnB1dFN0cmVhbSl9IGJ1dCBzdXBwb3J0aW5nIGV4dGVuc2lvbnMuCi0gICAgICovCi0gICAgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VMaXRlT3JCdWlsZGVyLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGVPckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggN2NjNzJlOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZUxpdGVPckJ1aWxkZXIuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBCYXNlIGludGVyZmFjZSBmb3IgbWV0aG9kcyBjb21tb24gdG8ge0BsaW5rIE1lc3NhZ2VMaXRlfQotICogYW5kIHtAbGluayBNZXNzYWdlTGl0ZS5CdWlsZGVyfSB0byBwcm92aWRlIHR5cGUgZXF1aXZhbGVuY3kuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgTWVzc2FnZUxpdGVPckJ1aWxkZXIgewotICAvKioKLSAgICogR2V0IGFuIGluc3RhbmNlIG9mIHRoZSB0eXBlIHdpdGggbm8gZmllbGRzIHNldC4gQmVjYXVzZSBubyBmaWVsZHMgYXJlIHNldCwKLSAgICogYWxsIGdldHRlcnMgZm9yIHNpbmd1bGFyIGZpZWxkcyB3aWxsIHJldHVybiBkZWZhdWx0IHZhbHVlcyBhbmQgcmVwZWF0ZWQKLSAgICogZmllbGRzIHdpbGwgYXBwZWFyIGVtcHR5LgotICAgKiBUaGlzIG1heSBvciBtYXkgbm90IGJlIGEgc2luZ2xldG9uLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlCi0gICAqIHtAY29kZSBnZXREZWZhdWx0SW5zdGFuY2UoKX0gbWV0aG9kIG9mIGdlbmVyYXRlZCBtZXNzYWdlIGNsYXNzZXMgaW4gdGhhdAotICAgKiB0aGlzIG1ldGhvZCBpcyBhbiBhYnN0cmFjdCBtZXRob2Qgb2YgdGhlIHtAY29kZSBNZXNzYWdlTGl0ZX0gaW50ZXJmYWNlCi0gICAqIHdoZXJlYXMge0Bjb2RlIGdldERlZmF1bHRJbnN0YW5jZSgpfSBpcyBhIHN0YXRpYyBtZXRob2Qgb2YgYSBzcGVjaWZpYwotICAgKiBjbGFzcy4gIFRoZXkgcmV0dXJuIHRoZSBzYW1lIHRoaW5nLgotICAgKi8KLSAgTWVzc2FnZUxpdGUgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhbmQgYWxsIGVtYmVkZGVkCi0gICAqIG1lc3NhZ2VzIGFyZSBzZXQsIGZhbHNlIG90aGVyd2lzZS4KLSAgICovCi0gIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpOwotCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZU9yQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VPckJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDEzMmU3Yy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZU9yQnVpbGRlci5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTEwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5NYXA7Ci0KLS8qKgotICogQmFzZSBpbnRlcmZhY2UgZm9yIG1ldGhvZHMgY29tbW9uIHRvIHtAbGluayBNZXNzYWdlfSBhbmQKLSAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9IHRvIHByb3ZpZGUgdHlwZSBlcXVpdmFsZW5jeS4KLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqLwotcHVibGljIGludGVyZmFjZSBNZXNzYWdlT3JCdWlsZGVyIGV4dGVuZHMgTWVzc2FnZUxpdGVPckJ1aWxkZXIgewotCi0gIC8vIChGcm9tIE1lc3NhZ2VMaXRlLCByZS1kZWNsYXJlZCBoZXJlIG9ubHkgZm9yIHJldHVybiB0eXBlIGNvdmFyaWFuY2UuKQotICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgTWVzc2FnZSBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCk7Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgbWVzc2FnZSdzIHR5cGUncyBkZXNjcmlwdG9yLiAgVGhpcyBkaWZmZXJzIGZyb20gdGhlCi0gICAqIHtAY29kZSBnZXREZXNjcmlwdG9yKCl9IG1ldGhvZCBvZiBnZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGluIHRoYXQKLSAgICogdGhpcyBtZXRob2QgaXMgYW4gYWJzdHJhY3QgbWV0aG9kIG9mIHRoZSB7QGNvZGUgTWVzc2FnZX0gaW50ZXJmYWNlCi0gICAqIHdoZXJlYXMge0Bjb2RlIGdldERlc2NyaXB0b3IoKX0gaXMgYSBzdGF0aWMgbWV0aG9kIG9mIGEgc3BlY2lmaWMgY2xhc3MuCi0gICAqIFRoZXkgcmV0dXJuIHRoZSBzYW1lIHRoaW5nLgotICAgKi8KLSAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBnZXREZXNjcmlwdG9yRm9yVHlwZSgpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIGEgY29sbGVjdGlvbiBvZiBhbGwgdGhlIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2Ugd2hpY2ggYXJlIHNldAotICAgKiBhbmQgdGhlaXIgY29ycmVzcG9uZGluZyB2YWx1ZXMuICBBIHNpbmd1bGFyICgicmVxdWlyZWQiIG9yICJvcHRpb25hbCIpCi0gICAqIGZpZWxkIGlzIHNldCBpZmYgaGFzRmllbGQoKSByZXR1cm5zIHRydWUgZm9yIHRoYXQgZmllbGQuICBBICJyZXBlYXRlZCIKLSAgICogZmllbGQgaXMgc2V0IGlmZiBnZXRSZXBlYXRlZEZpZWxkU2l6ZSgpIGlzIGdyZWF0ZXIgdGhhbiB6ZXJvLiAgVGhlCi0gICAqIHZhbHVlcyBhcmUgZXhhY3RseSB3aGF0IHdvdWxkIGJlIHJldHVybmVkIGJ5IGNhbGxpbmcKLSAgICoge0BsaW5rICNnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IpfSBmb3IgZWFjaCBmaWVsZC4gIFRoZSBtYXAKLSAgICogaXMgZ3VhcmFudGVlZCB0byBiZSBhIHNvcnRlZCBtYXAsIHNvIGl0ZXJhdGluZyBvdmVyIGl0IHdpbGwgcmV0dXJuIGZpZWxkcwotICAgKiBpbiBvcmRlciBieSBmaWVsZCBudW1iZXIuCi0gICAqIDxicj4KLSAgICogSWYgdGhpcyBpcyBmb3IgYSBidWlsZGVyLCB0aGUgcmV0dXJuZWQgbWFwIG1heSBvciBtYXkgbm90IHJlZmxlY3QgZnV0dXJlCi0gICAqIGNoYW5nZXMgdG8gdGhlIGJ1aWxkZXIuICBFaXRoZXIgd2F5LCB0aGUgcmV0dXJuZWQgbWFwIGlzIGl0c2VsZgotICAgKiB1bm1vZGlmaWFibGUuCi0gICAqLwotICBNYXA8RGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yLCBPYmplY3Q+IGdldEFsbEZpZWxkcygpOwotCi0gIC8qKgotICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlIGdpdmVuIGZpZWxkIGlzIHNldC4gIFRoaXMgaXMgZXhhY3RseSBlcXVpdmFsZW50IHRvCi0gICAqIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCAiaGFzIiBhY2Nlc3NvciBtZXRob2QgY29ycmVzcG9uZGluZyB0byB0aGUgZmllbGQuCi0gICAqIEB0aHJvd3MgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uIFRoZSBmaWVsZCBpcyBhIHJlcGVhdGVkIGZpZWxkLCBvcgotICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCi0gICAqLwotICBib29sZWFuIGhhc0ZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7Ci0KLSAgLyoqCi0gICAqIE9idGFpbnMgdGhlIHZhbHVlIG9mIHRoZSBnaXZlbiBmaWVsZCwgb3IgdGhlIGRlZmF1bHQgdmFsdWUgaWYgaXQgaXMKLSAgICogbm90IHNldC4gIEZvciBwcmltaXRpdmUgZmllbGRzLCB0aGUgYm94ZWQgcHJpbWl0aXZlIHZhbHVlIGlzIHJldHVybmVkLgotICAgKiBGb3IgZW51bSBmaWVsZHMsIHRoZSBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciB0aGUgdmFsdWUgaXMgcmV0dXJlbmQuIEZvcgotICAgKiBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlIGlzIHJldHVybmVkLiAgRm9yIHJlcGVhdGVkCi0gICAqIGZpZWxkcywgYSBqYXZhLnV0aWwuTGlzdCBpcyByZXR1cm5lZC4KLSAgICovCi0gIE9iamVjdCBnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpOwotCi0gIC8qKgotICAgKiBHZXRzIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgb2YgYSByZXBlYXRlZCBmaWVsZC4gIFRoaXMgaXMgZXhhY3RseQotICAgKiBlcXVpdmFsZW50IHRvIGNhbGxpbmcgdGhlIGdlbmVyYXRlZCAiQ291bnQiIGFjY2Vzc29yIG1ldGhvZCBjb3JyZXNwb25kaW5nCi0gICAqIHRvIHRoZSBmaWVsZC4KLSAgICogQHRocm93cyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24gVGhlIGZpZWxkIGlzIG5vdCBhIHJlcGVhdGVkIGZpZWxkLCBvcgotICAgKiAgICAgICAgICAge0Bjb2RlIGZpZWxkLmdldENvbnRhaW5pbmdUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0uCi0gICAqLwotICBpbnQgZ2V0UmVwZWF0ZWRGaWVsZENvdW50KERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCk7Ci0KLSAgLyoqCi0gICAqIEdldHMgYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLiAgRm9yIHByaW1pdGl2ZSBmaWVsZHMsIHRoZSBib3hlZAotICAgKiBwcmltaXRpdmUgdmFsdWUgaXMgcmV0dXJuZWQuICBGb3IgZW51bSBmaWVsZHMsIHRoZSBFbnVtVmFsdWVEZXNjcmlwdG9yCi0gICAqIGZvciB0aGUgdmFsdWUgaXMgcmV0dXJlbmQuIEZvciBlbWJlZGRlZCBtZXNzYWdlIGZpZWxkcywgdGhlIHN1Yi1tZXNzYWdlCi0gICAqIGlzIHJldHVybmVkLgotICAgKiBAdGhyb3dzIElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbiBUaGUgZmllbGQgaXMgbm90IGEgcmVwZWF0ZWQgZmllbGQsIG9yCi0gICAqICAgICAgICAgICB7QGNvZGUgZmllbGQuZ2V0Q29udGFpbmluZ1R5cGUoKSAhPSBnZXREZXNjcmlwdG9yRm9yVHlwZSgpfS4KLSAgICovCi0gIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KTsKLQotICAvKiogR2V0IHRoZSB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fSBmb3IgdGhpcyBtZXNzYWdlLiAqLwotICBVbmtub3duRmllbGRTZXQgZ2V0VW5rbm93bkZpZWxkcygpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvY29sTWVzc2FnZUVudW0uamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Qcm90b2NvbE1lc3NhZ2VFbnVtLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDExMjQwMGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Byb3RvY29sTWVzc2FnZUVudW0uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotCi0vKioKLSAqIEludGVyZmFjZSBvZiB1c2VmdWwgbWV0aG9kcyBhZGRlZCB0byBhbGwgZW51bXMgZ2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbAotICogY29tcGlsZXIuCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgUHJvdG9jb2xNZXNzYWdlRW51bSBleHRlbmRzIEludGVybmFsLkVudW1MaXRlIHsKLQotICAvKioKLSAgICogUmV0dXJuIHRoZSB2YWx1ZSdzIG51bWVyaWMgdmFsdWUgYXMgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0gICAqLwotICBpbnQgZ2V0TnVtYmVyKCk7Ci0KLSAgLyoqCi0gICAqIFJldHVybiB0aGUgdmFsdWUncyBkZXNjcmlwdG9yLCB3aGljaCBjb250YWlucyBpbmZvcm1hdGlvbiBzdWNoIGFzCi0gICAqIHZhbHVlIG5hbWUsIG51bWJlciwgYW5kIHR5cGUuCi0gICAqLwotICBFbnVtVmFsdWVEZXNjcmlwdG9yIGdldFZhbHVlRGVzY3JpcHRvcigpOwotCi0gIC8qKgotICAgKiBSZXR1cm4gdGhlIGVudW0gdHlwZSdzIGRlc2NyaXB0b3IsIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uCi0gICAqIGFib3V0IGVhY2ggZGVmaW5lZCB2YWx1ZSwgZXRjLgotICAgKi8KLSAgRW51bURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9SZXBlYXRlZEZpZWxkQnVpbGRlci5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMjRmNzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2OTYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiA8Y29kZT5SZXBlYXRlZEZpZWxkQnVpbGRlcjwvY29kZT4gaW1wbGVtZW50cyBhIHN0cnVjdHVyZSB0aGF0IGEgcHJvdG9jb2wKLSAqIG1lc3NhZ2UgdXNlcyB0byBob2xkIGEgcmVwZWF0ZWQgZmllbGQgb2Ygb3RoZXIgcHJvdG9jb2wgbWVzc2FnZXMuIEl0IHN1cHBvcnRzCi0gKiB0aGUgY2xhc3NpY2FsIHVzZSBjYXNlIG9mIGFkZGluZyBpbW11dGFibGUge0BsaW5rIE1lc3NhZ2V9J3MgdG8gdGhlCi0gKiByZXBlYXRlZCBmaWVsZCBhbmQgaXMgaGlnaGx5IG9wdGltaXplZCBhcm91bmQgdGhpcyAobm8gZXh0cmEgbWVtb3J5Ci0gKiBhbGxvY2F0aW9ucyBhbmQgc2hhcmluZyBvZiBpbW11dGFibGUgYXJyYXlzKS4KLSAqIDxicj4KLSAqIEl0IGFsc28gc3VwcG9ydHMgdGhlIGFkZGl0aW9uYWwgdXNlIGNhc2Ugb2YgYWRkaW5nIGEge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0KLSAqIHRvIHRoZSByZXBlYXRlZCBmaWVsZCBhbmQgZGVmZXJyaW5nIGNvbnZlcnNpb24gb2YgdGhhdCA8Y29kZT5CdWlsZGVyPC9jb2RlPgotICogdG8gYW4gaW1tdXRhYmxlIDxjb2RlPk1lc3NhZ2U8L2NvZGU+LiBJbiB0aGlzIHdheSwgaXQncyBwb3NzaWJsZSB0byBtYWludGFpbgotICogYSB0cmVlIG9mIDxjb2RlPkJ1aWxkZXI8L2NvZGU+J3MgdGhhdCBhY3RzIGFzIGEgZnVsbHkgcmVhZC93cml0ZSBkYXRhCi0gKiBzdHJ1Y3R1cmUuCi0gKiA8YnI+Ci0gKiBMb2dpY2FsbHksIG9uZSBjYW4gdGhpbmsgb2YgYSB0cmVlIG9mIGJ1aWxkZXJzIGFzIGNvbnZlcnRpbmcgdGhlIGVudGlyZSB0cmVlCi0gKiB0byBtZXNzYWdlcyB3aGVuIGJ1aWxkIGlzIGNhbGxlZCBvbiB0aGUgcm9vdCBvciB3aGVuIGFueSBtZXRob2QgaXMgY2FsbGVkCi0gKiB0aGF0IGRlc2lyZXMgYSBNZXNzYWdlIGluc3RlYWQgb2YgYSBCdWlsZGVyLiBJbiB0ZXJtcyBvZiB0aGUgaW1wbGVtZW50YXRpb24sCi0gKiB0aGUgPGNvZGU+U2luZ2xlRmllbGRCdWlsZGVyPC9jb2RlPiBhbmQgPGNvZGU+UmVwZWF0ZWRGaWVsZEJ1aWxkZXI8L2NvZGU+Ci0gKiBjbGFzc2VzIGNhY2hlIG1lc3NhZ2VzIHRoYXQgd2VyZSBjcmVhdGVkIHNvIHRoYXQgbWVzc2FnZXMgb25seSBuZWVkIHRvIGJlCi0gKiBjcmVhdGVkIHdoZW4gc29tZSBjaGFuZ2Ugb2NjdXJlZCBpbiBpdHMgYnVpbGRlciBvciBhIGJ1aWxkZXIgZm9yIG9uZSBvZiBpdHMKLSAqIGRlc2NlbmRhbnRzLgotICoKLSAqIEBwYXJhbSA8TVR5cGU+IHRoZSB0eXBlIG9mIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAotICogQHBhcmFtIDxCVHlwZT4gdGhlIHR5cGUgb2YgYnVpbGRlciBmb3IgdGhlIGZpZWxkCi0gKiBAcGFyYW0gPElUeXBlPiB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgYW5kIHRoZSBidWlsZGVyCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBSZXBlYXRlZEZpZWxkQnVpbGRlcgotICAgIDxNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCi0gICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAotICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+Ci0gICAgaW1wbGVtZW50cyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgewotCi0gIC8vIFBhcmVudCB0byBzZW5kIGNoYW5nZXMgdG8uCi0gIHByaXZhdGUgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudDsKLQotICAvLyBMaXN0IG9mIG1lc3NhZ2VzLiBOZXZlciBudWxsLiBJdCBtYXkgYmUgaW1tdXRhYmxlLCBpbiB3aGljaCBjYXNlCi0gIC8vIGlzTWVzc2FnZXNMaXN0SW1tdXRhYmxlIHdpbGwgYmUgdHJ1ZS4gU2VlIG5vdGUgYmVsb3cuCi0gIHByaXZhdGUgTGlzdDxNVHlwZT4gbWVzc2FnZXM7Ci0KLSAgLy8gV2hldGhlciBtZXNzYWdlcyBpcyBhbiBtdXRhYmxlIGFycmF5IHRoYXQgY2FuIGJlIG1vZGlmaWVkLgotICBwcml2YXRlIGJvb2xlYW4gaXNNZXNzYWdlc0xpc3RNdXRhYmxlOwotCi0gIC8vIExpc3Qgb2YgYnVpbGRlcnMuIE1heSBiZSBudWxsLCBpbiB3aGljaCBjYXNlLCBubyBuZXN0ZWQgYnVpbGRlcnMgd2VyZQotICAvLyBjcmVhdGVkLiBJZiBub3QgbnVsbCwgZW50cmllcyByZXByZXNlbnQgdGhlIGJ1aWxkZXIgZm9yIHRoYXQgaW5kZXguCi0gIHByaXZhdGUgTGlzdDxTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4+IGJ1aWxkZXJzOwotCi0gIC8vIEhlcmUgYXJlIHRoZSBpbnZhcmlhbnRzIGZvciBtZXNzYWdlcyBhbmQgYnVpbGRlcnM6Ci0gIC8vIDEuIG1lc3NhZ2VzIGlzIG5ldmVyIG51bGwgYW5kIGl0cyBjb3VudCBjb3JyZXNwb25kcyB0byB0aGUgbnVtYmVyIG9mIGl0ZW1zCi0gIC8vICAgIGluIHRoZSByZXBlYXRlZCBmaWVsZC4KLSAgLy8gMi4gSWYgYnVpbGRlcnMgaXMgbm9uLW51bGwsIG1lc3NhZ2VzIGFuZCBidWlsZGVycyBNVVNUIGFsd2F5cwotICAvLyAgICBjb250YWluIHRoZSBzYW1lIG51bWJlciBvZiBpdGVtcy4KLSAgLy8gMy4gRW50cmllcyBpbiBlaXRoZXIgYXJyYXkgY2FuIGJlIG51bGwsIGJ1dCBmb3IgYW55IGluZGV4LCB0aGVyZSBNVVNUIGJlCi0gIC8vICAgIGVpdGhlciBhIE1lc3NhZ2UgaW4gbWVzc2FnZXMgb3IgYSBidWlsZGVyIGluIGJ1aWxkZXJzLgotICAvLyA0LiBJZiB0aGUgYnVpbGRlciBhdCBhbiBpbmRleCBpcyBub24tbnVsbCwgdGhlIGJ1aWxkZXIgaXMKLSAgLy8gICAgYXV0aG9yaXRhdGl2ZS4gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBhIEJ1aWxkZXIgd2FzIHNldCBvbiB0aGUgaW5kZXguCi0gIC8vICAgIEFueSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlcyBhcnJheSBNVVNUIGJlIGlnbm9yZWQuCi0gIC8vIHQuIElmIHRoZSBidWlsZGVyIGF0IGFuIGluZGV4IGlzIG51bGwsIHRoZSBtZXNzYWdlIGluIHRoZSBtZXNzYWdlcwotICAvLyAgICBsaXN0IGlzIGF1dGhvcml0YXRpdmUuIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgYSBNZXNzYWdlIChub3QgYSBCdWlsZGVyKQotICAvLyAgICB3YXMgc2V0IGRpcmVjdGx5IGZvciBhbiBpbmRleC4KLQotICAvLyBJbmRpY2F0ZXMgdGhhdCB3ZSd2ZSBidWlsdCBhIG1lc3NhZ2UgYW5kIHNvIHdlIGFyZSBub3cgb2JsaWdhdGVkCi0gIC8vIHRvIGRpc3BhdGNoIGRpcnR5IGludmFsaWRhdGlvbnMuIFNlZSBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJMaXN0ZW5lci4KLSAgcHJpdmF0ZSBib29sZWFuIGlzQ2xlYW47Ci0KLSAgLy8gQSB2aWV3IG9mIHRoaXMgYnVpbGRlciB0aGF0IGV4cG9zZXMgYSBMaXN0IGludGVyZmFjZSBvZiBtZXNzYWdlcy4gVGhpcyBpcwotICAvLyBpbml0aWFsaXplZCBvbiBkZW1hbmQuIFRoaXMgaXMgZnVsbHkgYmFja2VkIGJ5IHRoaXMgb2JqZWN0IGFuZCBhbGwgY2hhbmdlcwotICAvLyBhcmUgcmVmbGVjdGVkIGluIGl0LiBBY2Nlc3MgdG8gYW55IGl0ZW0gY29udmVydHMgaXQgdG8gYSBtZXNzYWdlIGlmIGl0Ci0gIC8vIHdhcyBhIGJ1aWxkZXIuCi0gIHByaXZhdGUgTWVzc2FnZUV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPiBleHRlcm5hbE1lc3NhZ2VMaXN0OwotCi0gIC8vIEEgdmlldyBvZiB0aGlzIGJ1aWxkZXIgdGhhdCBleHBvc2VzIGEgTGlzdCBpbnRlcmZhY2Ugb2YgYnVpbGRlcnMuIFRoaXMgaXMKLSAgLy8gaW5pdGlhbGl6ZWQgb24gZGVtYW5kLiBUaGlzIGlzIGZ1bGx5IGJhY2tlZCBieSB0aGlzIG9iamVjdCBhbmQgYWxsIGNoYW5nZXMKLSAgLy8gYXJlIHJlZmxlY3RlZCBpbiBpdC4gQWNjZXNzIHRvIGFueSBpdGVtIGNvbnZlcnRzIGl0IHRvIGEgYnVpbGRlciBpZiBpdAotICAvLyB3YXMgYSBtZXNzYWdlLgotICBwcml2YXRlIEJ1aWxkZXJFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZXh0ZXJuYWxCdWlsZGVyTGlzdDsKLQotICAvLyBBIHZpZXcgb2YgdGhpcyBidWlsZGVyIHRoYXQgZXhwb3NlcyBhIExpc3QgaW50ZXJmYWNlIG9mIHRoZSBpbnRlcmZhY2UKLSAgLy8gaW1wbGVtZW50ZWQgYnkgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLiBUaGlzIGlzIGluaXRpYWxpemVkIG9uIGRlbWFuZC4gVGhpcwotICAvLyBpcyBmdWxseSBiYWNrZWQgYnkgdGhpcyBvYmplY3QgYW5kIGFsbCBjaGFuZ2VzIGFyZSByZWZsZWN0ZWQgaW4gaXQuCi0gIC8vIEFjY2VzcyB0byBhbnkgaXRlbSByZXR1cm5zIGVpdGhlciBhIGJ1aWxkZXIgb3IgbWVzc2FnZSBkZXBlbmRpbmcgb24KLSAgLy8gd2hhdCBpcyBtb3N0IGVmZmljaWVudC4KLSAgcHJpdmF0ZSBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+Ci0gICAgICBleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0OwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3RzIGEgbmV3IGJ1aWxkZXIgd2l0aCBhbiBlbXB0eSBsaXN0IG9mIG1lc3NhZ2VzLgotICAgKgotICAgKiBAcGFyYW0gbWVzc2FnZXMgdGhlIGN1cnJlbnQgbGlzdCBvZiBtZXNzYWdlcwotICAgKiBAcGFyYW0gaXNNZXNzYWdlc0xpc3RNdXRhYmxlIFdoZXRoZXIgdGhlIG1lc3NhZ2VzIGxpc3QgaXMgbXV0YWJsZQotICAgKiBAcGFyYW0gcGFyZW50IGEgbGlzdGVuZXIgdG8gbm90aWZ5IG9mIGNoYW5nZXMKLSAgICogQHBhcmFtIGlzQ2xlYW4gd2hldGhlciB0aGUgYnVpbGRlciBpcyBpbml0aWFsbHkgbWFya2VkIGNsZWFuCi0gICAqLwotICBwdWJsaWMgUmVwZWF0ZWRGaWVsZEJ1aWxkZXIoCi0gICAgICBMaXN0PE1UeXBlPiBtZXNzYWdlcywKLSAgICAgIGJvb2xlYW4gaXNNZXNzYWdlc0xpc3RNdXRhYmxlLAotICAgICAgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCwKLSAgICAgIGJvb2xlYW4gaXNDbGVhbikgewotICAgIHRoaXMubWVzc2FnZXMgPSBtZXNzYWdlczsKLSAgICB0aGlzLmlzTWVzc2FnZXNMaXN0TXV0YWJsZSA9IGlzTWVzc2FnZXNMaXN0TXV0YWJsZTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLmlzQ2xlYW4gPSBpc0NsZWFuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAvLyBOdWxsIG91dCBwYXJlbnQgc28gd2Ugc3RvcCBzZW5kaW5nIGl0IGludmFsaWRhdGlvbnMuCi0gICAgcGFyZW50ID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoYXQgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgaXMgbXV0YWJsZSBzbyBpdCBjYW4gYmUgdXBkYXRlZC4gSWYgaXQncwotICAgKiBpbW11dGFibGUsIGEgY29weSBpcyBtYWRlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpIHsKLSAgICBpZiAoIWlzTWVzc2FnZXNMaXN0TXV0YWJsZSkgewotICAgICAgbWVzc2FnZXMgPSBuZXcgQXJyYXlMaXN0PE1UeXBlPihtZXNzYWdlcyk7Ci0gICAgICBpc01lc3NhZ2VzTGlzdE11dGFibGUgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBFbnN1cmVzIHRoYXQgdGhlIGxpc3Qgb2YgYnVpbGRlcnMgaXMgbm90IG51bGwuIElmIGl0J3MgbnVsbCwgdGhlIGxpc3QgaXMKLSAgICogY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQgdG8gYmUgdGhlIHNhbWUgc2l6ZSBhcyB0aGUgbWVzc2FnZXMgbGlzdCB3aXRoCi0gICAqIG51bGwgZW50cmllcy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBlbnN1cmVCdWlsZGVycygpIHsKLSAgICBpZiAodGhpcy5idWlsZGVycyA9PSBudWxsKSB7Ci0gICAgICB0aGlzLmJ1aWxkZXJzID0KLSAgICAgICAgICBuZXcgQXJyYXlMaXN0PFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPj4oCi0gICAgICAgICAgICAgIG1lc3NhZ2VzLnNpemUoKSk7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGJ1aWxkZXJzLmFkZChudWxsKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0cyB0aGUgY291bnQgb2YgaXRlbXMgaW4gdGhlIGxpc3QuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIGNvdW50IG9mIGl0ZW1zIGluIHRoZSBsaXN0LgotICAgKi8KLSAgcHVibGljIGludCBnZXRDb3VudCgpIHsKLSAgICByZXR1cm4gbWVzc2FnZXMuc2l6ZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgd2hldGhlciB0aGUgbGlzdCBpcyBlbXB0eS4KLSAgICoKLSAgICogQHJldHVybiB3aGV0aGVyIHRoZSBsaXN0IGlzIGVtcHR5Ci0gICAqLwotICBwdWJsaWMgYm9vbGVhbiBpc0VtcHR5KCkgewotICAgIHJldHVybiBtZXNzYWdlcy5pc0VtcHR5KCk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIElmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBzdG9yZWQKLSAgICogYXMgYSA8Y29kZT5CdWlsZGVyPC9jb2RlPiwgaXQgaXMgY29udmVydGVkIHRvIGEgPGNvZGU+TWVzc2FnZTwvY29kZT4gYnkKLSAgICogY2FsbGluZyB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2J1aWxkUGFydGlhbH0gb24gaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0Ci0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoZSBzcGVjaWZpZWQgaW5kZXgKLSAgICovCi0gIHB1YmxpYyBNVHlwZSBnZXRNZXNzYWdlKGludCBpbmRleCkgewotICAgIHJldHVybiBnZXRNZXNzYWdlKGluZGV4LCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgaW5kZXguIElmIHRoZSBtZXNzYWdlIGlzIGN1cnJlbnRseSBzdG9yZWQKLSAgICogYXMgYSA8Y29kZT5CdWlsZGVyPC9jb2RlPiwgaXQgaXMgY29udmVydGVkIHRvIGEgPGNvZGU+TWVzc2FnZTwvY29kZT4gYnkKLSAgICogY2FsbGluZyB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyI2J1aWxkUGFydGlhbH0gb24gaXQuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0Ci0gICAqIEBwYXJhbSBmb3JCdWlsZCB0aGlzIGlzIGJlaW5nIGNhbGxlZCBmb3IgYnVpbGQgc28gd2Ugd2FudCB0byBtYWtlIHN1cmUKLSAgICogICAgIHdlIFNpbmdsZUZpZWxkQnVpbGRlci5idWlsZCB0byBzZW5kIGRpcnR5IGludmFsaWRhdGlvbnMKLSAgICogQHJldHVybiB0aGUgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBpbmRleAotICAgKi8KLSAgcHJpdmF0ZSBNVHlwZSBnZXRNZXNzYWdlKGludCBpbmRleCwgYm9vbGVhbiBmb3JCdWlsZCkgewotICAgIGlmICh0aGlzLmJ1aWxkZXJzID09IG51bGwpIHsKLSAgICAgIC8vIFdlIGRvbid0IGhhdmUgYW55IGJ1aWxkZXJzIC0tIHJldHVybiB0aGUgY3VycmVudCBNZXNzYWdlLgotICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkLCBzbyB3ZSBNVVNUIGhhdmUgYQotICAgICAgLy8gTWVzc2FnZS4KLSAgICAgIHJldHVybiBtZXNzYWdlcy5nZXQoaW5kZXgpOwotICAgIH0KLQotICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyID0gYnVpbGRlcnMuZ2V0KGluZGV4KTsKLSAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAvLyBXZSBkb24ndCBoYXZlIGEgYnVpbGRlciAtLSByZXR1cm4gdGhlIGN1cnJlbnQgbWVzc2FnZS4KLSAgICAgIC8vIFRoaXMgaXMgdGhlIGNhc2Ugd2hlcmUgbm8gYnVpbGRlciB3YXMgY3JlYXRlZCBmb3IgdGhlIGVudHJ5IGF0IGluZGV4LAotICAgICAgLy8gc28gd2UgTVVTVCBoYXZlIGEgbWVzc2FnZS4KLSAgICAgIHJldHVybiBtZXNzYWdlcy5nZXQoaW5kZXgpOwotCi0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBmb3JCdWlsZCA/IGJ1aWxkZXIuYnVpbGQoKSA6IGJ1aWxkZXIuZ2V0TWVzc2FnZSgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGEgYnVpbGRlciBmb3IgdGhlIHNwZWNpZmllZCBpbmRleC4gSWYgbm8gYnVpbGRlciBoYXMgYmVlbiBjcmVhdGVkIGZvcgotICAgKiB0aGF0IGluZGV4LCBhIGJ1aWxkZXIgaXMgY3JlYXRlZCBvbiBkZW1hbmQgYnkgY2FsbGluZwotICAgKiB7QGxpbmsgTWVzc2FnZSN0b0J1aWxkZXJ9LgotICAgKgotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IG9mIHRoZSBtZXNzYWdlIHRvIGdldAotICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGZvciB0aGF0IGluZGV4Ci0gICAqLwotICBwdWJsaWMgQlR5cGUgZ2V0QnVpbGRlcihpbnQgaW5kZXgpIHsKLSAgICBlbnN1cmVCdWlsZGVycygpOwotICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyID0gYnVpbGRlcnMuZ2V0KGluZGV4KTsKLSAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICBNVHlwZSBtZXNzYWdlID0gbWVzc2FnZXMuZ2V0KGluZGV4KTsKLSAgICAgIGJ1aWxkZXIgPSBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+KAotICAgICAgICAgIG1lc3NhZ2UsIHRoaXMsIGlzQ2xlYW4pOwotICAgICAgYnVpbGRlcnMuc2V0KGluZGV4LCBidWlsZGVyKTsKLSAgICB9Ci0gICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QnVpbGRlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlIGZvciB0aGUgc3BlY2lmaWVkIGluZGV4LiBUaGlzIG1heSBlaXRoZXIgYmUKLSAgICogYSBidWlsZGVyIG9yIGEgbWVzc2FnZS4gSXQgd2lsbCByZXR1cm4gd2hhdGV2ZXIgaXMgbW9yZSBlZmZpY2llbnQuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggb2YgdGhlIG1lc3NhZ2UgdG8gZ2V0Ci0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2Ugb3IgYnVpbGRlciBmb3IgdGhlIGluZGV4IGFzIHRoZSBiYXNlIGNsYXNzIGludGVyZmFjZQotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBJVHlwZSBnZXRNZXNzYWdlT3JCdWlsZGVyKGludCBpbmRleCkgewotICAgIGlmICh0aGlzLmJ1aWxkZXJzID09IG51bGwpIHsKLSAgICAgIC8vIFdlIGRvbid0IGhhdmUgYW55IGJ1aWxkZXJzIC0tIHJldHVybiB0aGUgY3VycmVudCBNZXNzYWdlLgotICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkLCBzbyB3ZSBNVVNUIGhhdmUgYQotICAgICAgLy8gTWVzc2FnZS4KLSAgICAgIHJldHVybiAoSVR5cGUpIG1lc3NhZ2VzLmdldChpbmRleCk7Ci0gICAgfQotCi0gICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaW5kZXgpOwotICAgIGlmIChidWlsZGVyID09IG51bGwpIHsKLSAgICAgIC8vIFdlIGRvbid0IGhhdmUgYSBidWlsZGVyIC0tIHJldHVybiB0aGUgY3VycmVudCBtZXNzYWdlLgotICAgICAgLy8gVGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBubyBidWlsZGVyIHdhcyBjcmVhdGVkIGZvciB0aGUgZW50cnkgYXQgaW5kZXgsCi0gICAgICAvLyBzbyB3ZSBNVVNUIGhhdmUgYSBtZXNzYWdlLgotICAgICAgcmV0dXJuIChJVHlwZSkgbWVzc2FnZXMuZ2V0KGluZGV4KTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gYnVpbGRlci5nZXRNZXNzYWdlT3JCdWlsZGVyKCk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgYSAgbWVzc2FnZSBhdCB0aGUgc3BlY2lmaWVkIGluZGV4IHJlcGxhY2luZyB0aGUgZXhpc3RpbmcgaXRlbSBhdAotICAgKiB0aGF0IGluZGV4LgotICAgKgotICAgKiBAcGFyYW0gaW5kZXggdGhlIGluZGV4IHRvIHNldC4KLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gc2V0Ci0gICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKLSAgICovCi0gIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBzZXRNZXNzYWdlKAotICAgICAgaW50IGluZGV4LCBNVHlwZSBtZXNzYWdlKSB7Ci0gICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOwotICAgIG1lc3NhZ2VzLnNldChpbmRleCwgbWVzc2FnZSk7Ci0gICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKLSAgICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBlbnRyeSA9Ci0gICAgICAgICAgYnVpbGRlcnMuc2V0KGluZGV4LCBudWxsKTsKLSAgICAgIGlmIChlbnRyeSAhPSBudWxsKSB7Ci0gICAgICAgIGVudHJ5LmRpc3Bvc2UoKTsKLSAgICAgIH0KLSAgICB9Ci0gICAgb25DaGFuZ2VkKCk7Ci0gICAgaW5jcmVtZW50TW9kQ291bnRzKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogQXBwZW5kcyB0aGUgc3BlY2lmaWVkIGVsZW1lbnQgdG8gdGhlIGVuZCBvZiB0aGlzIGxpc3QuCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGFkZAotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYWRkTWVzc2FnZSgKLSAgICAgIE1UeXBlIG1lc3NhZ2UpIHsKLSAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7Ci0gICAgbWVzc2FnZXMuYWRkKG1lc3NhZ2UpOwotICAgIGlmIChidWlsZGVycyAhPSBudWxsKSB7Ci0gICAgICBidWlsZGVycy5hZGQobnVsbCk7Ci0gICAgfQotICAgIG9uQ2hhbmdlZCgpOwotICAgIGluY3JlbWVudE1vZENvdW50cygpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEluc2VydHMgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgotICAgKiBTaGlmdHMgdGhlIGVsZW1lbnQgY3VycmVudGx5IGF0IHRoYXQgcG9zaXRpb24gKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50Ci0gICAqIGVsZW1lbnRzIHRvIHRoZSByaWdodCAoYWRkcyBvbmUgdG8gdGhlaXIgaW5kaWNlcykuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBtZXNzYWdlCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGFkZAotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYWRkTWVzc2FnZSgKLSAgICAgIGludCBpbmRleCwgTVR5cGUgbWVzc2FnZSkgewotICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpOwotICAgIH0KLSAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKLSAgICBtZXNzYWdlcy5hZGQoaW5kZXgsIG1lc3NhZ2UpOwotICAgIGlmIChidWlsZGVycyAhPSBudWxsKSB7Ci0gICAgICBidWlsZGVycy5hZGQoaW5kZXgsIG51bGwpOwotICAgIH0KLSAgICBvbkNoYW5nZWQoKTsKLSAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBBcHBlbmRzIGFsbCBvZiB0aGUgbWVzc2FnZXMgaW4gdGhlIHNwZWNpZmllZCBjb2xsZWN0aW9uIHRvIHRoZSBlbmQgb2YKLSAgICogdGhpcyBsaXN0LCBpbiB0aGUgb3JkZXIgdGhhdCB0aGV5IGFyZSByZXR1cm5lZCBieSB0aGUgc3BlY2lmaWVkCi0gICAqIGNvbGxlY3Rpb24ncyBpdGVyYXRvci4KLSAgICoKLSAgICogQHBhcmFtIHZhbHVlcyB0aGUgbWVzc2FnZXMgdG8gYWRkCi0gICAqIEByZXR1cm4gdGhlIGJ1aWxkZXIKLSAgICovCi0gIHB1YmxpYyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBhZGRBbGxNZXNzYWdlcygKLSAgICAgIEl0ZXJhYmxlPD8gZXh0ZW5kcyBNVHlwZT4gdmFsdWVzKSB7Ci0gICAgZm9yIChmaW5hbCBNVHlwZSB2YWx1ZSA6IHZhbHVlcykgewotICAgICAgaWYgKHZhbHVlID09IG51bGwpIHsKLSAgICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIGlmICh2YWx1ZXMgaW5zdGFuY2VvZiBDb2xsZWN0aW9uKSB7Ci0gICAgICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikgZmluYWwKLSAgICAgIENvbGxlY3Rpb248TVR5cGU+IGNvbGxlY3Rpb24gPSAoQ29sbGVjdGlvbjxNVHlwZT4pIHZhbHVlczsKLSAgICAgIGlmIChjb2xsZWN0aW9uLnNpemUoKSA9PSAwKSB7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7Ci0gICAgICBmb3IgKE1UeXBlIHZhbHVlIDogdmFsdWVzKSB7Ci0gICAgICAgIGFkZE1lc3NhZ2UodmFsdWUpOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKLSAgICAgIGZvciAoTVR5cGUgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgYWRkTWVzc2FnZSh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotICAgIG9uQ2hhbmdlZCgpOwotICAgIGluY3JlbWVudE1vZENvdW50cygpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIEFwcGVuZHMgYSBuZXcgYnVpbGRlciB0byB0aGUgZW5kIG9mIHRoaXMgbGlzdCBhbmQgcmV0dXJucyB0aGUgYnVpbGRlci4KLSAgICoKLSAgICogQHBhcmFtIG1lc3NhZ2UgdGhlIG1lc3NhZ2UgdG8gYWRkIHdoaWNoIGlzIHRoZSBiYXNpcyBvZiB0aGUgYnVpbGRlcgotICAgKiBAcmV0dXJuIHRoZSBuZXcgYnVpbGRlcgotICAgKi8KLSAgcHVibGljIEJUeXBlIGFkZEJ1aWxkZXIoTVR5cGUgbWVzc2FnZSkgewotICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOwotICAgIGVuc3VyZUJ1aWxkZXJzKCk7Ci0gICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPQotICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+KAotICAgICAgICAgICAgbWVzc2FnZSwgdGhpcywgaXNDbGVhbik7Ci0gICAgbWVzc2FnZXMuYWRkKG51bGwpOwotICAgIGJ1aWxkZXJzLmFkZChidWlsZGVyKTsKLSAgICBvbkNoYW5nZWQoKTsKLSAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKLSAgICByZXR1cm4gYnVpbGRlci5nZXRCdWlsZGVyKCk7Ci0gIH0KLQotICAvKioKLSAgICogSW5zZXJ0cyBhIG5ldyBidWlsZGVyIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24gaW4gdGhpcyBsaXN0LgotICAgKiBTaGlmdHMgdGhlIGVsZW1lbnQgY3VycmVudGx5IGF0IHRoYXQgcG9zaXRpb24gKGlmIGFueSkgYW5kIGFueSBzdWJzZXF1ZW50Ci0gICAqIGVsZW1lbnRzIHRvIHRoZSByaWdodCAoYWRkcyBvbmUgdG8gdGhlaXIgaW5kaWNlcykuCi0gICAqCi0gICAqIEBwYXJhbSBpbmRleCB0aGUgaW5kZXggYXQgd2hpY2ggdG8gaW5zZXJ0IHRoZSBidWlsZGVyCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIGFkZCB3aGljaCBpcyB0aGUgYmFzaXMgb2YgdGhlIGJ1aWxkZXIKLSAgICogQHJldHVybiB0aGUgYnVpbGRlcgotICAgKi8KLSAgcHVibGljIEJUeXBlIGFkZEJ1aWxkZXIoaW50IGluZGV4LCBNVHlwZSBtZXNzYWdlKSB7Ci0gICAgZW5zdXJlTXV0YWJsZU1lc3NhZ2VMaXN0KCk7Ci0gICAgZW5zdXJlQnVpbGRlcnMoKTsKLSAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlciA9Ci0gICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4oCi0gICAgICAgICAgICBtZXNzYWdlLCB0aGlzLCBpc0NsZWFuKTsKLSAgICBtZXNzYWdlcy5hZGQoaW5kZXgsIG51bGwpOwotICAgIGJ1aWxkZXJzLmFkZChpbmRleCwgYnVpbGRlcik7Ci0gICAgb25DaGFuZ2VkKCk7Ci0gICAgaW5jcmVtZW50TW9kQ291bnRzKCk7Ci0gICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QnVpbGRlcigpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgdGhlIGVsZW1lbnQgYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbiBpbiB0aGlzIGxpc3QuIFNoaWZ0cyBhbnkKLSAgICogc3Vic2VxdWVudCBlbGVtZW50cyB0byB0aGUgbGVmdCAoc3VidHJhY3RzIG9uZSBmcm9tIHRoZWlyIGluZGljZXMpLgotICAgKiBSZXR1cm5zIHRoZSBlbGVtZW50IHRoYXQgd2FzIHJlbW92ZWQgZnJvbSB0aGUgbGlzdC4KLSAgICoKLSAgICogQHBhcmFtIGluZGV4IHRoZSBpbmRleCBhdCB3aGljaCB0byByZW1vdmUgdGhlIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyB2b2lkIHJlbW92ZShpbnQgaW5kZXgpIHsKLSAgICBlbnN1cmVNdXRhYmxlTWVzc2FnZUxpc3QoKTsKLSAgICBtZXNzYWdlcy5yZW1vdmUoaW5kZXgpOwotICAgIGlmIChidWlsZGVycyAhPSBudWxsKSB7Ci0gICAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gZW50cnkgPQotICAgICAgICAgIGJ1aWxkZXJzLnJlbW92ZShpbmRleCk7Ci0gICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICBlbnRyeS5kaXNwb3NlKCk7Ci0gICAgICB9Ci0gICAgfQotICAgIG9uQ2hhbmdlZCgpOwotICAgIGluY3JlbWVudE1vZENvdW50cygpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlbW92ZXMgYWxsIG9mIHRoZSBlbGVtZW50cyBmcm9tIHRoaXMgbGlzdC4KLSAgICogVGhlIGxpc3Qgd2lsbCBiZSBlbXB0eSBhZnRlciB0aGlzIGNhbGwgcmV0dXJucy4KLSAgICovCi0gIHB1YmxpYyB2b2lkIGNsZWFyKCkgewotICAgIG1lc3NhZ2VzID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgaXNNZXNzYWdlc0xpc3RNdXRhYmxlID0gZmFsc2U7Ci0gICAgaWYgKGJ1aWxkZXJzICE9IG51bGwpIHsKLSAgICAgIGZvciAoU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGVudHJ5IDoKLSAgICAgICAgICBidWlsZGVycykgewotICAgICAgICBpZiAoZW50cnkgIT0gbnVsbCkgewotICAgICAgICAgIGVudHJ5LmRpc3Bvc2UoKTsKLSAgICAgICAgfQotICAgICAgfQotICAgICAgYnVpbGRlcnMgPSBudWxsOwotICAgIH0KLSAgICBvbkNoYW5nZWQoKTsKLSAgICBpbmNyZW1lbnRNb2RDb3VudHMoKTsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZHMgdGhlIGxpc3Qgb2YgbWVzc2FnZXMgZnJvbSB0aGUgYnVpbGRlciBhbmQgcmV0dXJucyB0aGVtLgotICAgKgotICAgKiBAcmV0dXJuIGFuIGltbXV0YWJsZSBsaXN0IG9mIG1lc3NhZ2VzCi0gICAqLwotICBwdWJsaWMgTGlzdDxNVHlwZT4gYnVpbGQoKSB7Ci0gICAgLy8gTm93IHRoYXQgYnVpbGQgaGFzIGJlZW4gY2FsbGVkLCB3ZSBhcmUgcmVxdWlyZWQgdG8gZGlzcGF0Y2gKLSAgICAvLyBpbnZhbGlkYXRpb25zLgotICAgIGlzQ2xlYW4gPSB0cnVlOwotCi0gICAgaWYgKCFpc01lc3NhZ2VzTGlzdE11dGFibGUgJiYgYnVpbGRlcnMgPT0gbnVsbCkgewotICAgICAgLy8gV2Ugc3RpbGwgaGF2ZSBhbiBpbW11dGFibGUgbGlzdCBhbmQgd2UgbmV2ZXIgY3JlYXRlZCBhIGJ1aWxkZXIuCi0gICAgICByZXR1cm4gbWVzc2FnZXM7Ci0gICAgfQotCi0gICAgYm9vbGVhbiBhbGxNZXNzYWdlc0luU3luYyA9IHRydWU7Ci0gICAgaWYgKCFpc01lc3NhZ2VzTGlzdE11dGFibGUpIHsKLSAgICAgIC8vIFdlIHN0aWxsIGhhdmUgYW4gaW1tdXRhYmxlIGxpc3QuIExldCdzIHNlZSBpZiBhbnkgb2YgdGhlbSBhcmUgb3V0Ci0gICAgICAvLyBvZiBzeW5jIHdpdGggdGhlaXIgYnVpbGRlcnMuCi0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VzLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIE1lc3NhZ2UgbWVzc2FnZSA9IG1lc3NhZ2VzLmdldChpKTsKLSAgICAgICAgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIgPSBidWlsZGVycy5nZXQoaSk7Ci0gICAgICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgICAgICBpZiAoYnVpbGRlci5idWlsZCgpICE9IG1lc3NhZ2UpIHsKLSAgICAgICAgICAgIGFsbE1lc3NhZ2VzSW5TeW5jID0gZmFsc2U7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIGlmIChhbGxNZXNzYWdlc0luU3luYykgewotICAgICAgICAvLyBJbW11dGFibGUgbGlzdCBpcyBzdGlsbCBpbiBzeW5jLgotICAgICAgICByZXR1cm4gbWVzc2FnZXM7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLy8gTmVlZCB0byBtYWtlIHN1cmUgbWVzc2FnZXMgaXMgdXAgdG8gZGF0ZQotICAgIGVuc3VyZU11dGFibGVNZXNzYWdlTGlzdCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIG1lc3NhZ2VzLnNldChpLCBnZXRNZXNzYWdlKGksIHRydWUpKTsKLSAgICB9Ci0KLSAgICAvLyBXZSdyZSBnb2luZyB0byByZXR1cm4gb3VyIGxpc3QgYXMgaW1tdXRhYmxlIHNvIHdlIG1hcmsgdGhhdCB3ZSBjYW4KLSAgICAvLyBubyBsb25nZXIgdXBkYXRlIGl0LgotICAgIG1lc3NhZ2VzID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChtZXNzYWdlcyk7Ci0gICAgaXNNZXNzYWdlc0xpc3RNdXRhYmxlID0gZmFsc2U7Ci0gICAgcmV0dXJuIG1lc3NhZ2VzOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBtZXNzYWdlcy4gVGhlIHJldHVybmVkIGxpc3QgaXMgbGl2ZQotICAgKiBhbmQgd2lsbCByZWZsZWN0IGFueSBjaGFuZ2VzIHRvIHRoZSB1bmRlcmx5aW5nIGJ1aWxkZXIuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2VzIGluIHRoZSBsaXN0Ci0gICAqLwotICBwdWJsaWMgTGlzdDxNVHlwZT4gZ2V0TWVzc2FnZUxpc3QoKSB7Ci0gICAgaWYgKGV4dGVybmFsTWVzc2FnZUxpc3QgPT0gbnVsbCkgewotICAgICAgZXh0ZXJuYWxNZXNzYWdlTGlzdCA9Ci0gICAgICAgICAgbmV3IE1lc3NhZ2VFeHRlcm5hbExpc3Q8TVR5cGUsIEJUeXBlLCBJVHlwZT4odGhpcyk7Ci0gICAgfQotICAgIHJldHVybiBleHRlcm5hbE1lc3NhZ2VMaXN0OwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgYSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBidWlsZGVycy4gVGhpcyByZXR1cm5lZCBsaXN0IGlzCi0gICAqIGxpdmUgYW5kIHdpbGwgcmVmbGVjdCBhbnkgY2hhbmdlcyB0byB0aGUgdW5kZXJseWluZyBidWlsZGVyLgotICAgKgotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVycyBpbiB0aGUgbGlzdAotICAgKi8KLSAgcHVibGljIExpc3Q8QlR5cGU+IGdldEJ1aWxkZXJMaXN0KCkgewotICAgIGlmIChleHRlcm5hbEJ1aWxkZXJMaXN0ID09IG51bGwpIHsKLSAgICAgIGV4dGVybmFsQnVpbGRlckxpc3QgPQotICAgICAgICAgIG5ldyBCdWlsZGVyRXh0ZXJuYWxMaXN0PE1UeXBlLCBCVHlwZSwgSVR5cGU+KHRoaXMpOwotICAgIH0KLSAgICByZXR1cm4gZXh0ZXJuYWxCdWlsZGVyTGlzdDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGEgdmlldyBvZiB0aGUgYnVpbGRlciBhcyBhIGxpc3Qgb2YgTWVzc2FnZU9yQnVpbGRlcnMuIFRoaXMgcmV0dXJuZWQKLSAgICogbGlzdCBpcyBsaXZlIGFuZCB3aWxsIHJlZmxlY3QgYW55IGNoYW5nZXMgdG8gdGhlIHVuZGVybHlpbmcgYnVpbGRlci4KLSAgICoKLSAgICogQHJldHVybiB0aGUgYnVpbGRlcnMgaW4gdGhlIGxpc3QKLSAgICovCi0gIHB1YmxpYyBMaXN0PElUeXBlPiBnZXRNZXNzYWdlT3JCdWlsZGVyTGlzdCgpIHsKLSAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdCA9PSBudWxsKSB7Ci0gICAgICBleHRlcm5hbE1lc3NhZ2VPckJ1aWxkZXJMaXN0ID0KLSAgICAgICAgICBuZXcgTWVzc2FnZU9yQnVpbGRlckV4dGVybmFsTGlzdDxNVHlwZSwgQlR5cGUsIElUeXBlPih0aGlzKTsKLSAgICB9Ci0gICAgcmV0dXJuIGV4dGVybmFsTWVzc2FnZU9yQnVpbGRlckxpc3Q7Ci0gIH0KLQotICAvKioKLSAgICogQ2FsbGVkIHdoZW4gYSB0aGUgYnVpbGRlciBvciBvbmUgb2YgaXRzIG5lc3RlZCBjaGlsZHJlbiBoYXMgY2hhbmdlZAotICAgKiBhbmQgYW55IHBhcmVudCBzaG91bGQgYmUgbm90aWZpZWQgb2YgaXRzIGludmFsaWRhdGlvbi4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBvbkNoYW5nZWQoKSB7Ci0gICAgaWYgKGlzQ2xlYW4gJiYgcGFyZW50ICE9IG51bGwpIHsKLSAgICAgIHBhcmVudC5tYXJrRGlydHkoKTsKLQotICAgICAgLy8gRG9uJ3Qga2VlcCBkaXNwYXRjaGluZyBpbnZhbGlkYXRpb25zIHVudGlsIGJ1aWxkIGlzIGNhbGxlZCBhZ2Fpbi4KLSAgICAgIGlzQ2xlYW4gPSBmYWxzZTsKLSAgICB9Ci0gIH0KLQotICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgewotICAgIG9uQ2hhbmdlZCgpOwotICB9Ci0KLSAgLyoqCi0gICAqIEluY3JlbWVudHMgdGhlIG1vZCBjb3VudHMgc28gdGhhdCBhbiBDb25jdXJyZW50TW9kaWZpY2F0aW9uRXhjZXB0aW9uIGNhbgotICAgKiBiZSB0aHJvd24gaWYgY2FsbGluZyBjb2RlIHRyaWVzIHRvIG1vZGlmeSB0aGUgYnVpbGRlciB3aGlsZSBpdHMgaXRlcmF0aW5nCi0gICAqIHRoZSBsaXN0LgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGluY3JlbWVudE1vZENvdW50cygpIHsKLSAgICBpZiAoZXh0ZXJuYWxNZXNzYWdlTGlzdCAhPSBudWxsKSB7Ci0gICAgICBleHRlcm5hbE1lc3NhZ2VMaXN0LmluY3JlbWVudE1vZENvdW50KCk7Ci0gICAgfQotICAgIGlmIChleHRlcm5hbEJ1aWxkZXJMaXN0ICE9IG51bGwpIHsKLSAgICAgIGV4dGVybmFsQnVpbGRlckxpc3QuaW5jcmVtZW50TW9kQ291bnQoKTsKLSAgICB9Ci0gICAgaWYgKGV4dGVybmFsTWVzc2FnZU9yQnVpbGRlckxpc3QgIT0gbnVsbCkgewotICAgICAgZXh0ZXJuYWxNZXNzYWdlT3JCdWlsZGVyTGlzdC5pbmNyZW1lbnRNb2RDb3VudCgpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQcm92aWRlcyBhIGxpdmUgdmlldyBvZiB0aGUgYnVpbGRlciBhcyBhIGxpc3Qgb2YgbWVzc2FnZXMuCi0gICAqCi0gICAqIEBwYXJhbSA8TVR5cGU+IHRoZSB0eXBlIG9mIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAotICAgKiBAcGFyYW0gPEJUeXBlPiB0aGUgdHlwZSBvZiBidWlsZGVyIGZvciB0aGUgZmllbGQKLSAgICogQHBhcmFtIDxJVHlwZT4gdGhlIGNvbW1vbiBpbnRlcmZhY2UgZm9yIHRoZSBtZXNzYWdlIGFuZCB0aGUgYnVpbGRlcgotICAgKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTWVzc2FnZUV4dGVybmFsTGlzdDwKLSAgICAgIE1UeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZSwKLSAgICAgIEJUeXBlIGV4dGVuZHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyLAotICAgICAgSVR5cGUgZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyPgotICAgICAgZXh0ZW5kcyBBYnN0cmFjdExpc3Q8TVR5cGU+IGltcGxlbWVudHMgTGlzdDxNVHlwZT4gewotCi0gICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcjsKLQotICAgIE1lc3NhZ2VFeHRlcm5hbExpc3QoCi0gICAgICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXIpIHsKLSAgICAgIHRoaXMuYnVpbGRlciA9IGJ1aWxkZXI7Ci0gICAgfQotCi0gICAgcHVibGljIGludCBzaXplKCkgewotICAgICAgcmV0dXJuIHRoaXMuYnVpbGRlci5nZXRDb3VudCgpOwotICAgIH0KLQotICAgIHB1YmxpYyBNVHlwZSBnZXQoaW50IGluZGV4KSB7Ci0gICAgICByZXR1cm4gYnVpbGRlci5nZXRNZXNzYWdlKGluZGV4KTsKLSAgICB9Ci0KLSAgICB2b2lkIGluY3JlbWVudE1vZENvdW50KCkgewotICAgICAgbW9kQ291bnQrKzsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUHJvdmlkZXMgYSBsaXZlIHZpZXcgb2YgdGhlIGJ1aWxkZXIgYXMgYSBsaXN0IG9mIGJ1aWxkZXJzLgotICAgKgotICAgKiBAcGFyYW0gPE1UeXBlPiB0aGUgdHlwZSBvZiBtZXNzYWdlIGZvciB0aGUgZmllbGQKLSAgICogQHBhcmFtIDxCVHlwZT4gdGhlIHR5cGUgb2YgYnVpbGRlciBmb3IgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSA8SVR5cGU+IHRoZSBjb21tb24gaW50ZXJmYWNlIGZvciB0aGUgbWVzc2FnZSBhbmQgdGhlIGJ1aWxkZXIKLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEJ1aWxkZXJFeHRlcm5hbExpc3Q8Ci0gICAgICBNVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UsCi0gICAgICBCVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciwKLSAgICAgIElUeXBlIGV4dGVuZHMgTWVzc2FnZU9yQnVpbGRlcj4KLSAgICAgIGV4dGVuZHMgQWJzdHJhY3RMaXN0PEJUeXBlPiBpbXBsZW1lbnRzIExpc3Q8QlR5cGU+IHsKLQotICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IGJ1aWxkZXI7Ci0KLSAgICBCdWlsZGVyRXh0ZXJuYWxMaXN0KAotICAgICAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyKSB7Ci0gICAgICB0aGlzLmJ1aWxkZXIgPSBidWlsZGVyOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICAgIHJldHVybiB0aGlzLmJ1aWxkZXIuZ2V0Q291bnQoKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQlR5cGUgZ2V0KGludCBpbmRleCkgewotICAgICAgcmV0dXJuIGJ1aWxkZXIuZ2V0QnVpbGRlcihpbmRleCk7Ci0gICAgfQotCi0gICAgdm9pZCBpbmNyZW1lbnRNb2RDb3VudCgpIHsKLSAgICAgIG1vZENvdW50Kys7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFByb3ZpZGVzIGEgbGl2ZSB2aWV3IG9mIHRoZSBidWlsZGVyIGFzIGEgbGlzdCBvZiBidWlsZGVycy4KLSAgICoKLSAgICogQHBhcmFtIDxNVHlwZT4gdGhlIHR5cGUgb2YgbWVzc2FnZSBmb3IgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSA8QlR5cGU+IHRoZSB0eXBlIG9mIGJ1aWxkZXIgZm9yIHRoZSBmaWVsZAotICAgKiBAcGFyYW0gPElUeXBlPiB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgYW5kIHRoZSBidWlsZGVyCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBNZXNzYWdlT3JCdWlsZGVyRXh0ZXJuYWxMaXN0PAotICAgICAgTVR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLAotICAgICAgQlR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXIsCi0gICAgICBJVHlwZSBleHRlbmRzIE1lc3NhZ2VPckJ1aWxkZXI+Ci0gICAgICBleHRlbmRzIEFic3RyYWN0TGlzdDxJVHlwZT4gaW1wbGVtZW50cyBMaXN0PElUeXBlPiB7Ci0KLSAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxNVHlwZSwgQlR5cGUsIElUeXBlPiBidWlsZGVyOwotCi0gICAgTWVzc2FnZU9yQnVpbGRlckV4dGVybmFsTGlzdCgKLSAgICAgICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gYnVpbGRlcikgewotICAgICAgdGhpcy5idWlsZGVyID0gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gdGhpcy5idWlsZGVyLmdldENvdW50KCk7Ci0gICAgfQotCi0gICAgcHVibGljIElUeXBlIGdldChpbnQgaW5kZXgpIHsKLSAgICAgIHJldHVybiBidWlsZGVyLmdldE1lc3NhZ2VPckJ1aWxkZXIoaW5kZXgpOwotICAgIH0KLQotICAgIHZvaWQgaW5jcmVtZW50TW9kQ291bnQoKSB7Ci0gICAgICBtb2RDb3VudCsrOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NhbGxiYWNrLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ2FsbGJhY2suamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMWZkMzVlZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ2FsbGJhY2suamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQ3ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBJbnRlcmZhY2UgZm9yIGFuIFJQQyBjYWxsYmFjaywgbm9ybWFsbHkgY2FsbGVkIHdoZW4gYW4gUlBDIGNvbXBsZXRlcy4KLSAqIHtAY29kZSBQYXJhbWV0ZXJUeXBlfSBpcyBub3JtYWxseSB0aGUgbWV0aG9kJ3MgcmVzcG9uc2UgbWVzc2FnZSB0eXBlLgotICoKLSAqIDxwPlN0YXJ0aW5nIHdpdGggdmVyc2lvbiAyLjMuMCwgUlBDIGltcGxlbWVudGF0aW9ucyBzaG91bGQgbm90IHRyeSB0byBidWlsZAotICogb24gdGhpcywgYnV0IHNob3VsZCBpbnN0ZWFkIHByb3ZpZGUgY29kZSBnZW5lcmF0b3IgcGx1Z2lucyB3aGljaCBnZW5lcmF0ZQotICogY29kZSBzcGVjaWZpYyB0byB0aGUgcGFydGljdWxhciBSUEMgaW1wbGVtZW50YXRpb24uICBUaGlzIHdheSB0aGUgZ2VuZXJhdGVkCi0gKiBjb2RlIGNhbiBiZSBtb3JlIGFwcHJvcHJpYXRlIGZvciB0aGUgaW1wbGVtZW50YXRpb24gaW4gdXNlIGFuZCBjYW4gYXZvaWQKLSAqIHVubmVjZXNzYXJ5IGxheWVycyBvZiBpbmRpcmVjdGlvbi4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgaW50ZXJmYWNlIFJwY0NhbGxiYWNrPFBhcmFtZXRlclR5cGU+IHsKLSAgdm9pZCBydW4oUGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXIpOwotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDaGFubmVsLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM2ZWM1NGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY0NoYW5uZWwuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDcxICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiA8cD5BYnN0cmFjdCBpbnRlcmZhY2UgZm9yIGFuIFJQQyBjaGFubmVsLiAgQW4ge0Bjb2RlIFJwY0NoYW5uZWx9IHJlcHJlc2VudHMgYQotICogY29tbXVuaWNhdGlvbiBsaW5lIHRvIGEge0BsaW5rIFNlcnZpY2V9IHdoaWNoIGNhbiBiZSB1c2VkIHRvIGNhbGwgdGhhdAotICoge0BsaW5rIFNlcnZpY2V9J3MgbWV0aG9kcy4gIFRoZSB7QGxpbmsgU2VydmljZX0gbWF5IGJlIHJ1bm5pbmcgb24gYW5vdGhlcgotICogbWFjaGluZS4gIE5vcm1hbGx5LCB5b3Ugc2hvdWxkIG5vdCBjYWxsIGFuIHtAY29kZSBScGNDaGFubmVsfSBkaXJlY3RseSwgYnV0Ci0gKiBpbnN0ZWFkIGNvbnN0cnVjdCBhIHN0dWIge0BsaW5rIFNlcnZpY2V9IHdyYXBwaW5nIGl0LiAgRXhhbXBsZToKLSAqCi0gKiA8cHJlPgotICogICBScGNDaGFubmVsIGNoYW5uZWwgPSBycGNJbXBsLm5ld0NoYW5uZWwoInJlbW90ZWhvc3QuZXhhbXBsZS5jb206MTIzNCIpOwotICogICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBycGNJbXBsLm5ld0NvbnRyb2xsZXIoKTsKLSAqICAgTXlTZXJ2aWNlIHNlcnZpY2UgPSBNeVNlcnZpY2UubmV3U3R1YihjaGFubmVsKTsKLSAqICAgc2VydmljZS5teU1ldGhvZChjb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjayk7Ci0gKiA8L3ByZT4KLSAqCi0gKiA8cD5TdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCB0cnkgdG8gYnVpbGQKLSAqIG9uIHRoaXMsIGJ1dCBzaG91bGQgaW5zdGVhZCBwcm92aWRlIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMgd2hpY2ggZ2VuZXJhdGUKLSAqIGNvZGUgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgUlBDIGltcGxlbWVudGF0aW9uLiAgVGhpcyB3YXkgdGhlIGdlbmVyYXRlZAotICogY29kZSBjYW4gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGluIHVzZSBhbmQgY2FuIGF2b2lkCi0gKiB1bm5lY2Vzc2FyeSBsYXllcnMgb2YgaW5kaXJlY3Rpb24uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGludGVyZmFjZSBScGNDaGFubmVsIHsKLSAgLyoqCi0gICAqIENhbGwgdGhlIGdpdmVuIG1ldGhvZCBvZiB0aGUgcmVtb3RlIHNlcnZpY2UuICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvCi0gICAqIHtAY29kZSBTZXJ2aWNlLmNhbGxNZXRob2QoKX0gd2l0aCBvbmUgaW1wb3J0YW50IGRpZmZlcmVuY2U6ICB0aGUgY2FsbGVyCi0gICAqIGRlY2lkZXMgdGhlIHR5cGVzIG9mIHRoZSB7QGNvZGUgTWVzc2FnZX0gb2JqZWN0cywgbm90IHRoZSBjYWxsZWUuICBUaGUKLSAgICogcmVxdWVzdCBtYXkgYmUgb2YgYW55IHR5cGUgYXMgbG9uZyBhcwotICAgKiB7QGNvZGUgcmVxdWVzdC5nZXREZXNjcmlwdG9yKCkgPT0gbWV0aG9kLmdldElucHV0VHlwZSgpfS4KLSAgICogVGhlIHJlc3BvbnNlIHBhc3NlZCB0byB0aGUgY2FsbGJhY2sgd2lsbCBiZSBvZiB0aGUgc2FtZSB0eXBlIGFzCi0gICAqIHtAY29kZSByZXNwb25zZVByb3RvdHlwZX0gKHdoaWNoIG11c3QgaGF2ZQotICAgKiB7QGNvZGUgZ2V0RGVzY3JpcHRvcigpID09IG1ldGhvZC5nZXRPdXRwdXRUeXBlKCl9KS4KLSAgICovCi0gIHZvaWQgY2FsbE1ldGhvZChEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciwKLSAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgIE1lc3NhZ2UgcmVzcG9uc2VQcm90b3R5cGUsCi0gICAgICAgICAgICAgICAgICBScGNDYWxsYmFjazxNZXNzYWdlPiBkb25lKTsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDb250cm9sbGVyLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjQ29udHJvbGxlci5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBhYWE1NDQ2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ScGNDb250cm9sbGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIDxwPkFuIHtAY29kZSBScGNDb250cm9sbGVyfSBtZWRpYXRlcyBhIHNpbmdsZSBtZXRob2QgY2FsbC4gIFRoZSBwcmltYXJ5Ci0gKiBwdXJwb3NlIG9mIHRoZSBjb250cm9sbGVyIGlzIHRvIHByb3ZpZGUgYSB3YXkgdG8gbWFuaXB1bGF0ZSBzZXR0aW5ncwotICogc3BlY2lmaWMgdG8gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBhbmQgdG8gZmluZCBvdXQgYWJvdXQgUlBDLWxldmVsIGVycm9ycy4KLSAqCi0gKiA8cD5TdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCB0cnkgdG8gYnVpbGQKLSAqIG9uIHRoaXMsIGJ1dCBzaG91bGQgaW5zdGVhZCBwcm92aWRlIGNvZGUgZ2VuZXJhdG9yIHBsdWdpbnMgd2hpY2ggZ2VuZXJhdGUKLSAqIGNvZGUgc3BlY2lmaWMgdG8gdGhlIHBhcnRpY3VsYXIgUlBDIGltcGxlbWVudGF0aW9uLiAgVGhpcyB3YXkgdGhlIGdlbmVyYXRlZAotICogY29kZSBjYW4gYmUgbW9yZSBhcHByb3ByaWF0ZSBmb3IgdGhlIGltcGxlbWVudGF0aW9uIGluIHVzZSBhbmQgY2FuIGF2b2lkCi0gKiB1bm5lY2Vzc2FyeSBsYXllcnMgb2YgaW5kaXJlY3Rpb24uCi0gKgotICogPHA+VGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIHtAY29kZSBScGNDb250cm9sbGVyfSBpbnRlcmZhY2UgYXJlIGludGVuZGVkCi0gKiB0byBiZSBhICJsZWFzdCBjb21tb24gZGVub21pbmF0b3IiIHNldCBvZiBmZWF0dXJlcyB3aGljaCB3ZSBleHBlY3QgYWxsCi0gKiBpbXBsZW1lbnRhdGlvbnMgdG8gc3VwcG9ydC4gIFNwZWNpZmljIGltcGxlbWVudGF0aW9ucyBtYXkgcHJvdmlkZSBtb3JlCi0gKiBhZHZhbmNlZCBmZWF0dXJlcyAoZS5nLiBkZWFkbGluZSBwcm9wYWdhdGlvbikuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGludGVyZmFjZSBScGNDb250cm9sbGVyIHsKLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgY2xpZW50IHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMKLSAgLy8gYXJlIHVuZGVmaW5lZCBvbiB0aGUgc2VydmVyIHNpZGUgKG1heSB0aHJvdyBSdW50aW1lRXhjZXB0aW9ucykuCi0KLSAgLyoqCi0gICAqIFJlc2V0cyB0aGUgUnBjQ29udHJvbGxlciB0byBpdHMgaW5pdGlhbCBzdGF0ZSBzbyB0aGF0IGl0IG1heSBiZSByZXVzZWQgaW4KLSAgICogYSBuZXcgY2FsbC4gIFRoaXMgY2FuIGJlIGNhbGxlZCBmcm9tIHRoZSBjbGllbnQgc2lkZSBvbmx5LiAgSXQgbXVzdCBub3QKLSAgICogYmUgY2FsbGVkIHdoaWxlIGFuIFJQQyBpcyBpbiBwcm9ncmVzcy4KLSAgICovCi0gIHZvaWQgcmVzZXQoKTsKLQotICAvKioKLSAgICogQWZ0ZXIgYSBjYWxsIGhhcyBmaW5pc2hlZCwgcmV0dXJucyB0cnVlIGlmIHRoZSBjYWxsIGZhaWxlZC4gIFRoZSBwb3NzaWJsZQotICAgKiByZWFzb25zIGZvciBmYWlsdXJlIGRlcGVuZCBvbiB0aGUgUlBDIGltcGxlbWVudGF0aW9uLiAge0Bjb2RlIGZhaWxlZCgpfQotICAgKiBtb3N0IG9ubHkgYmUgY2FsbGVkIG9uIHRoZSBjbGllbnQgc2lkZSwgYW5kIG11c3Qgbm90IGJlIGNhbGxlZCBiZWZvcmUgYQotICAgKiBjYWxsIGhhcyBmaW5pc2hlZC4KLSAgICovCi0gIGJvb2xlYW4gZmFpbGVkKCk7Ci0KLSAgLyoqCi0gICAqIElmIHtAY29kZSBmYWlsZWQoKX0gaXMge0Bjb2RlIHRydWV9LCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24KLSAgICogb2YgdGhlIGVycm9yLgotICAgKi8KLSAgU3RyaW5nIGVycm9yVGV4dCgpOwotCi0gIC8qKgotICAgKiBBZHZpc2VzIHRoZSBSUEMgc3lzdGVtIHRoYXQgdGhlIGNhbGxlciBkZXNpcmVzIHRoYXQgdGhlIFJQQyBjYWxsIGJlCi0gICAqIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAotICAgKiB0aGVuIGNhbmNlbCBpdCwgb3IgbWF5IG5vdCBldmVuIGNhbmNlbCB0aGUgY2FsbCBhdCBhbGwuICBJZiB0aGUgY2FsbCBpcwotICAgKiBjYW5jZWxlZCwgdGhlICJkb25lIiBjYWxsYmFjayB3aWxsIHN0aWxsIGJlIGNhbGxlZCBhbmQgdGhlIFJwY0NvbnRyb2xsZXIKLSAgICogd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCi0gICAqLwotICB2b2lkIHN0YXJ0Q2FuY2VsKCk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGhlc2UgY2FsbHMgbWF5IGJlIG1hZGUgZnJvbSB0aGUgc2VydmVyIHNpZGUgb25seS4gIFRoZWlyIHJlc3VsdHMKLSAgLy8gYXJlIHVuZGVmaW5lZCBvbiB0aGUgY2xpZW50IHNpZGUgKG1heSB0aHJvdyBSdW50aW1lRXhjZXB0aW9ucykuCi0KLSAgLyoqCi0gICAqIENhdXNlcyB7QGNvZGUgZmFpbGVkKCl9IHRvIHJldHVybiB0cnVlIG9uIHRoZSBjbGllbnQgc2lkZS4gIHtAY29kZSByZWFzb259Ci0gICAqIHdpbGwgYmUgaW5jb3Jwb3JhdGVkIGludG8gdGhlIG1lc3NhZ2UgcmV0dXJuZWQgYnkge0Bjb2RlIGVycm9yVGV4dCgpfS4KLSAgICogSWYgeW91IGZpbmQgeW91IG5lZWQgdG8gcmV0dXJuIG1hY2hpbmUtcmVhZGFibGUgaW5mb3JtYXRpb24gYWJvdXQKLSAgICogZmFpbHVyZXMsIHlvdSBzaG91bGQgaW5jb3Jwb3JhdGUgaXQgaW50byB5b3VyIHJlc3BvbnNlIHByb3RvY29sIGJ1ZmZlcgotICAgKiBhbmQgc2hvdWxkIE5PVCBjYWxsIHtAY29kZSBzZXRGYWlsZWQoKX0uCi0gICAqLwotICB2b2lkIHNldEZhaWxlZChTdHJpbmcgcmVhc29uKTsKLQotICAvKioKLSAgICogSWYge0Bjb2RlIHRydWV9LCBpbmRpY2F0ZXMgdGhhdCB0aGUgY2xpZW50IGNhbmNlbGVkIHRoZSBSUEMsIHNvIHRoZSBzZXJ2ZXIKLSAgICogbWF5IGFzIHdlbGwgZ2l2ZSB1cCBvbiByZXBseWluZyB0byBpdC4gIFRoaXMgbWV0aG9kIG11c3QgYmUgY2FsbGVkIG9uIHRoZQotICAgKiBzZXJ2ZXIgc2lkZSBvbmx5LiAgVGhlIHNlcnZlciBzaG91bGQgc3RpbGwgY2FsbCB0aGUgZmluYWwgImRvbmUiIGNhbGxiYWNrLgotICAgKi8KLSAgYm9vbGVhbiBpc0NhbmNlbGVkKCk7Ci0KLSAgLyoqCi0gICAqIEFza3MgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYW5jZWxlZC4gIFRoZQotICAgKiBwYXJhbWV0ZXIgcGFzc2VkIHRvIHRoZSBjYWxsYmFjayB3aWxsIGFsd2F5cyBiZSB7QGNvZGUgbnVsbH0uICBUaGUKLSAgICogY2FsbGJhY2sgd2lsbCBhbHdheXMgYmUgY2FsbGVkIGV4YWN0bHkgb25jZS4gIElmIHRoZSBSUEMgY29tcGxldGVzIHdpdGhvdXQKLSAgICogYmVpbmcgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhZnRlciBjb21wbGV0aW9uLiAgSWYgdGhlIFJQQwotICAgKiBoYXMgYWxyZWFkeSBiZWVuIGNhbmNlbGVkIHdoZW4gTm90aWZ5T25DYW5jZWwoKSBpcyBjYWxsZWQsIHRoZSBjYWxsYmFjawotICAgKiB3aWxsIGJlIGNhbGxlZCBpbW1lZGlhdGVseS4KLSAgICoKLSAgICogPHA+e0Bjb2RlIG5vdGlmeU9uQ2FuY2VsKCl9IG11c3QgYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgotICAgKiBJdCBtdXN0IGJlIGNhbGxlZCBvbiB0aGUgc2VydmVyIHNpZGUgb25seS4KLSAgICovCi0gIHZvaWQgbm90aWZ5T25DYW5jZWwoUnBjQ2FsbGJhY2s8T2JqZWN0PiBjYWxsYmFjayk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjVXRpbC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JwY1V0aWwuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYjFiOTU5YS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUnBjVXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTM1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBHcmFiLWJhZyBvZiB1dGlsaXR5IGZ1bmN0aW9ucyB1c2VmdWwgd2hlbiBkZWFsaW5nIHdpdGggUlBDcy4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgZmluYWwgY2xhc3MgUnBjVXRpbCB7Ci0gIHByaXZhdGUgUnBjVXRpbCgpIHt9Ci0KLSAgLyoqCi0gICAqIFRha2UgYW4ge0Bjb2RlIFJwY0NhbGxiYWNrPE1lc3NhZ2U+fSBhbmQgY29udmVydCBpdCB0byBhbgotICAgKiB7QGNvZGUgUnBjQ2FsbGJhY2t9IGFjY2VwdGluZyBhIHNwZWNpZmljIG1lc3NhZ2UgdHlwZS4gIFRoaXMgaXMgYWx3YXlzCi0gICAqIHR5cGUtc2FmZSAocGFyYW1ldGVyIHR5cGUgY29udHJhdmFyaWFuY2UpLgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBzdGF0aWMgPFR5cGUgZXh0ZW5kcyBNZXNzYWdlPiBScGNDYWxsYmFjazxUeXBlPgotICBzcGVjaWFsaXplQ2FsbGJhY2soZmluYWwgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gb3JpZ2luYWxDYWxsYmFjaykgewotICAgIHJldHVybiAoUnBjQ2FsbGJhY2s8VHlwZT4pb3JpZ2luYWxDYWxsYmFjazsKLSAgICAvLyBUaGUgYWJvdmUgY2FzdCB3b3JrcywgYnV0IG9ubHkgZHVlIHRvIHRlY2huaWNhbCBkZXRhaWxzIG9mIHRoZSBKYXZhCi0gICAgLy8gaW1wbGVtZW50YXRpb24uICBBIG1vcmUgdGhlb3JldGljYWxseSBjb3JyZWN0IC0tIGJ1dCBsZXNzIGVmZmljaWVudCAtLQotICAgIC8vIGltcGxlbWVudGF0aW9uIHdvdWxkIGJlIGFzIGZvbGxvd3M6Ci0gICAgLy8gICByZXR1cm4gbmV3IFJwY0NhbGxiYWNrPFR5cGU+KCkgewotICAgIC8vICAgICBwdWJsaWMgdm9pZCBydW4oVHlwZSBwYXJhbWV0ZXIpIHsKLSAgICAvLyAgICAgICBvcmlnaW5hbENhbGxiYWNrLnJ1bihwYXJhbWV0ZXIpOwotICAgIC8vICAgICB9Ci0gICAgLy8gICB9OwotICB9Ci0KLSAgLyoqCi0gICAqIFRha2UgYW4ge0Bjb2RlIFJwY0NhbGxiYWNrfSBhY2NlcHRpbmcgYSBzcGVjaWZpYyBtZXNzYWdlIHR5cGUgYW5kIGNvbnZlcnQKLSAgICogaXQgdG8gYW4ge0Bjb2RlIFJwY0NhbGxiYWNrPE1lc3NhZ2U+fS4gIFRoZSBnZW5lcmFsaXplZCBjYWxsYmFjayB3aWxsCi0gICAqIGFjY2VwdCBhbnkgbWVzc2FnZSBvYmplY3Qgd2hpY2ggaGFzIHRoZSBzYW1lIGRlc2NyaXB0b3IsIGFuZCB3aWxsIGNvbnZlcnQKLSAgICogaXQgdG8gdGhlIGNvcnJlY3QgY2xhc3MgYmVmb3JlIGNhbGxpbmcgdGhlIG9yaWdpbmFsIGNhbGxiYWNrLiAgSG93ZXZlciwKLSAgICogaWYgdGhlIGdlbmVyYWxpemVkIGNhbGxiYWNrIGlzIGdpdmVuIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IGRlc2NyaXB0b3IsCi0gICAqIGFuIGV4Y2VwdGlvbiB3aWxsIGJlIHRocm93bi4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgPFR5cGUgZXh0ZW5kcyBNZXNzYWdlPgotICBScGNDYWxsYmFjazxNZXNzYWdlPiBnZW5lcmFsaXplQ2FsbGJhY2soCi0gICAgICBmaW5hbCBScGNDYWxsYmFjazxUeXBlPiBvcmlnaW5hbENhbGxiYWNrLAotICAgICAgZmluYWwgQ2xhc3M8VHlwZT4gb3JpZ2luYWxDbGFzcywKLSAgICAgIGZpbmFsIFR5cGUgZGVmYXVsdEluc3RhbmNlKSB7Ci0gICAgcmV0dXJuIG5ldyBScGNDYWxsYmFjazxNZXNzYWdlPigpIHsKLSAgICAgIHB1YmxpYyB2b2lkIHJ1bihmaW5hbCBNZXNzYWdlIHBhcmFtZXRlcikgewotICAgICAgICBUeXBlIHR5cGVkUGFyYW1ldGVyOwotICAgICAgICB0cnkgewotICAgICAgICAgIHR5cGVkUGFyYW1ldGVyID0gb3JpZ2luYWxDbGFzcy5jYXN0KHBhcmFtZXRlcik7Ci0gICAgICAgIH0gY2F0Y2ggKENsYXNzQ2FzdEV4Y2VwdGlvbiBpZ25vcmVkKSB7Ci0gICAgICAgICAgdHlwZWRQYXJhbWV0ZXIgPSBjb3B5QXNUeXBlKGRlZmF1bHRJbnN0YW5jZSwgcGFyYW1ldGVyKTsKLSAgICAgICAgfQotICAgICAgICBvcmlnaW5hbENhbGxiYWNrLnJ1bih0eXBlZFBhcmFtZXRlcik7Ci0gICAgICB9Ci0gICAgfTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgbmV3IG1lc3NhZ2Ugb2YgdHlwZSAiVHlwZSIgd2hpY2ggaXMgYSBjb3B5IG9mICJzb3VyY2UiLiAgInNvdXJjZSIKLSAgICogbXVzdCBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3IgYnV0IG1heSBiZSBhIGRpZmZlcmVudCBjbGFzcyAoZS5nLgotICAgKiBEeW5hbWljTWVzc2FnZSkuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSBzdGF0aWMgPFR5cGUgZXh0ZW5kcyBNZXNzYWdlPiBUeXBlIGNvcHlBc1R5cGUoCi0gICAgICBmaW5hbCBUeXBlIHR5cGVEZWZhdWx0SW5zdGFuY2UsIGZpbmFsIE1lc3NhZ2Ugc291cmNlKSB7Ci0gICAgcmV0dXJuIChUeXBlKXR5cGVEZWZhdWx0SW5zdGFuY2UubmV3QnVpbGRlckZvclR5cGUoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLm1lcmdlRnJvbShzb3VyY2UpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBDcmVhdGVzIGEgY2FsbGJhY2sgd2hpY2ggY2FuIG9ubHkgYmUgY2FsbGVkIG9uY2UuICBUaGlzIG1heSBiZSB1c2VmdWwgZm9yCi0gICAqIHNlY3VyaXR5LCB3aGVuIHBhc3NpbmcgYSBjYWxsYmFjayB0byB1bnRydXN0ZWQgY29kZTogIG1vc3QgY2FsbGJhY2tzIGRvCi0gICAqIG5vdCBleHBlY3QgdG8gYmUgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLCBzbyBkb2luZyBzbyBtYXkgZXhwb3NlIGJ1Z3MgaWYgaXQKLSAgICogaXMgbm90IHByZXZlbnRlZC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgPFBhcmFtZXRlclR5cGU+Ci0gICAgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4gbmV3T25lVGltZUNhbGxiYWNrKAotICAgICAgZmluYWwgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4gb3JpZ2luYWxDYWxsYmFjaykgewotICAgIHJldHVybiBuZXcgUnBjQ2FsbGJhY2s8UGFyYW1ldGVyVHlwZT4oKSB7Ci0gICAgICBwcml2YXRlIGJvb2xlYW4gYWxyZWFkeUNhbGxlZCA9IGZhbHNlOwotCi0gICAgICBwdWJsaWMgdm9pZCBydW4oZmluYWwgUGFyYW1ldGVyVHlwZSBwYXJhbWV0ZXIpIHsKLSAgICAgICAgc3luY2hyb25pemVkKHRoaXMpIHsKLSAgICAgICAgICBpZiAoYWxyZWFkeUNhbGxlZCkgewotICAgICAgICAgICAgdGhyb3cgbmV3IEFscmVhZHlDYWxsZWRFeGNlcHRpb24oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYWxyZWFkeUNhbGxlZCA9IHRydWU7Ci0gICAgICAgIH0KLQotICAgICAgICBvcmlnaW5hbENhbGxiYWNrLnJ1bihwYXJhbWV0ZXIpOwotICAgICAgfQotICAgIH07Ci0gIH0KLQotICAvKioKLSAgICogRXhjZXB0aW9uIHRocm93biB3aGVuIGEgb25lLXRpbWUgY2FsbGJhY2sgaXMgY2FsbGVkIG1vcmUgdGhhbiBvbmNlLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBBbHJlYWR5Q2FsbGVkRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gNTQ2OTc0MTI3OTUwNzg0ODI2Nkw7Ci0KLSAgICBwdWJsaWMgQWxyZWFkeUNhbGxlZEV4Y2VwdGlvbigpIHsKLSAgICAgIHN1cGVyKCJUaGlzIFJwY0NhbGxiYWNrIHdhcyBhbHJlYWR5IGNhbGxlZCBhbmQgY2Fubm90IGJlIGNhbGxlZCAiICsKLSAgICAgICAgICAgICJtdWx0aXBsZSB0aW1lcy4iKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZS5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA1NDE1ODVmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TZXJ2aWNlLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIEFic3RyYWN0IGJhc2UgaW50ZXJmYWNlIGZvciBwcm90b2NvbC1idWZmZXItYmFzZWQgUlBDIHNlcnZpY2VzLiAgU2VydmljZXMKLSAqIHRoZW1zZWx2ZXMgYXJlIGFic3RyYWN0IGNsYXNzZXMgKGltcGxlbWVudGVkIGVpdGhlciBieSBzZXJ2ZXJzIG9yIGFzCi0gKiBzdHVicyksIGJ1dCB0aGV5IHN1YmNsYXNzIHRoaXMgYmFzZSBpbnRlcmZhY2UuICBUaGUgbWV0aG9kcyBvZiB0aGlzCi0gKiBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc2VydmljZSB3aXRob3V0IGtub3dpbmcKLSAqIGl0cyBleGFjdCB0eXBlIGF0IGNvbXBpbGUgdGltZSAoYW5hbG9nb3VzIHRvIHRoZSBNZXNzYWdlIGludGVyZmFjZSkuCi0gKgotICogPHA+U3RhcnRpbmcgd2l0aCB2ZXJzaW9uIDIuMy4wLCBSUEMgaW1wbGVtZW50YXRpb25zIHNob3VsZCBub3QgdHJ5IHRvIGJ1aWxkCi0gKiBvbiB0aGlzLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zIHdoaWNoIGdlbmVyYXRlCi0gKiBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5IHRoZSBnZW5lcmF0ZWQKLSAqIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UgYW5kIGNhbiBhdm9pZAotICogdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBpbnRlcmZhY2UgU2VydmljZSB7Ci0gIC8qKgotICAgKiBHZXQgdGhlIHtAY29kZSBTZXJ2aWNlRGVzY3JpcHRvcn0gZGVzY3JpYmluZyB0aGlzIHNlcnZpY2UgYW5kIGl0cyBtZXRob2RzLgotICAgKi8KLSAgRGVzY3JpcHRvcnMuU2VydmljZURlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLQotICAvKioKLSAgICogPHA+Q2FsbCBhIG1ldGhvZCBvZiB0aGUgc2VydmljZSBzcGVjaWZpZWQgYnkgTWV0aG9kRGVzY3JpcHRvci4gIFRoaXMgaXMKLSAgICogbm9ybWFsbHkgaW1wbGVtZW50ZWQgYXMgYSBzaW1wbGUge0Bjb2RlIHN3aXRjaCgpfSB0aGF0IGNhbGxzIHRoZSBzdGFuZGFyZAotICAgKiBkZWZpbml0aW9ucyBvZiB0aGUgc2VydmljZSdzIG1ldGhvZHMuCi0gICAqCi0gICAqIDxwPlByZWNvbmRpdGlvbnM6Ci0gICAqIDx1bD4KLSAgICogICA8bGk+e0Bjb2RlIG1ldGhvZC5nZXRTZXJ2aWNlKCkgPT0gZ2V0RGVzY3JpcHRvckZvclR5cGUoKX0KLSAgICogICA8bGk+e0Bjb2RlIHJlcXVlc3R9IGlzIG9mIHRoZSBleGFjdCBzYW1lIGNsYXNzIGFzIHRoZSBvYmplY3QgcmV0dXJuZWQgYnkKLSAgICogICAgICAge0Bjb2RlIGdldFJlcXVlc3RQcm90b3R5cGUobWV0aG9kKX0uCi0gICAqICAgPGxpPntAY29kZSBjb250cm9sbGVyfSBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgUlBDIGltcGxlbWVudGF0aW9uCi0gICAqICAgICAgIGJlaW5nIHVzZWQgYnkgdGhpcyBTZXJ2aWNlLiAgRm9yIHN0dWJzLCB0aGUgImNvcnJlY3QgdHlwZSIgZGVwZW5kcwotICAgKiAgICAgICBvbiB0aGUgUnBjQ2hhbm5lbCB3aGljaCB0aGUgc3R1YiBpcyB1c2luZy4gIFNlcnZlci1zaWRlIFNlcnZpY2UKLSAgICogICAgICAgaW1wbGVtZW50YXRpb25zIGFyZSBleHBlY3RlZCB0byBhY2NlcHQgd2hhdGV2ZXIgdHlwZSBvZgotICAgKiAgICAgICB7QGNvZGUgUnBjQ29udHJvbGxlcn0gdGhlIHNlcnZlci1zaWRlIFJQQyBpbXBsZW1lbnRhdGlvbiB1c2VzLgotICAgKiA8L3VsPgotICAgKgotICAgKiA8cD5Qb3N0Y29uZGl0aW9uczoKLSAgICogPHVsPgotICAgKiAgIDxsaT57QGNvZGUgZG9uZX0gd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGNvbXBsZXRlLiAgVGhpcyBtYXkgYmUKLSAgICogICAgICAgYmVmb3JlIHtAY29kZSBjYWxsTWV0aG9kKCl9IHJldHVybnMgb3IgaXQgbWF5IGJlIGF0IHNvbWUgcG9pbnQgaW4KLSAgICogICAgICAgdGhlIGZ1dHVyZS4KLSAgICogICA8bGk+VGhlIHBhcmFtZXRlciB0byB7QGNvZGUgZG9uZX0gaXMgdGhlIHJlc3BvbnNlLiAgSXQgbXVzdCBiZSBvZiB0aGUKLSAgICogICAgICAgZXhhY3Qgc2FtZSB0eXBlIGFzIHdvdWxkIGJlIHJldHVybmVkIGJ5Ci0gICAqICAgICAgIHtAY29kZSBnZXRSZXNwb25zZVByb3RvdHlwZShtZXRob2QpfS4KLSAgICogICA8bGk+SWYgdGhlIFJQQyBmYWlsZWQsIHRoZSBwYXJhbWV0ZXIgdG8ge0Bjb2RlIGRvbmV9IHdpbGwgYmUKLSAgICogICAgICAge0Bjb2RlIG51bGx9LiAgRnVydGhlciBkZXRhaWxzIGFib3V0IHRoZSBmYWlsdXJlIGNhbiBiZSBmb3VuZCBieQotICAgKiAgICAgICBxdWVyeWluZyB7QGNvZGUgY29udHJvbGxlcn0uCi0gICAqIDwvdWw+Ci0gICAqLwotICB2b2lkIGNhbGxNZXRob2QoRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBtZXRob2QsCi0gICAgICAgICAgICAgICAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICBNZXNzYWdlIHJlcXVlc3QsCi0gICAgICAgICAgICAgICAgICBScGNDYWxsYmFjazxNZXNzYWdlPiBkb25lKTsKLQotICAvKioKLSAgICogPHA+e0Bjb2RlIGNhbGxNZXRob2QoKX0gcmVxdWlyZXMgdGhhdCB0aGUgcmVxdWVzdCBwYXNzZWQgaW4gaXMgb2YgYQotICAgKiBwYXJ0aWN1bGFyIHN1YmNsYXNzIG9mIHtAY29kZSBNZXNzYWdlfS4gIHtAY29kZSBnZXRSZXF1ZXN0UHJvdG90eXBlKCl9Ci0gICAqIGdldHMgdGhlIGRlZmF1bHQgaW5zdGFuY2VzIG9mIHRoaXMgdHlwZSBmb3IgYSBnaXZlbiBtZXRob2QuICBZb3UgY2FuIHRoZW4KLSAgICogY2FsbCB7QGNvZGUgTWVzc2FnZS5uZXdCdWlsZGVyRm9yVHlwZSgpfSBvbiB0aGlzIGluc3RhbmNlIHRvCi0gICAqIGNvbnN0cnVjdCBhIGJ1aWxkZXIgdG8gYnVpbGQgYW4gb2JqZWN0IHdoaWNoIHlvdSBjYW4gdGhlbiBwYXNzIHRvCi0gICAqIHtAY29kZSBjYWxsTWV0aG9kKCl9LgotICAgKgotICAgKiA8cD5FeGFtcGxlOgotICAgKiA8cHJlPgotICAgKiAgIE1ldGhvZERlc2NyaXB0b3IgbWV0aG9kID0KLSAgICogICAgIHNlcnZpY2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKS5maW5kTWV0aG9kQnlOYW1lKCJGb28iKTsKLSAgICogICBNZXNzYWdlIHJlcXVlc3QgPQotICAgKiAgICAgc3R1Yi5nZXRSZXF1ZXN0UHJvdG90eXBlKG1ldGhvZCkubmV3QnVpbGRlckZvclR5cGUoKQotICAgKiAgICAgICAgIC5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkKCk7Ci0gICAqICAgc2VydmljZS5jYWxsTWV0aG9kKG1ldGhvZCwgcmVxdWVzdCwgY2FsbGJhY2spOwotICAgKiA8L3ByZT4KLSAgICovCi0gIE1lc3NhZ2UgZ2V0UmVxdWVzdFByb3RvdHlwZShEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCk7Ci0KLSAgLyoqCi0gICAqIExpa2Uge0Bjb2RlIGdldFJlcXVlc3RQcm90b3R5cGUoKX0sIGJ1dCBnZXRzIGEgcHJvdG90eXBlIG9mIHRoZSByZXNwb25zZQotICAgKiBtZXNzYWdlLiAge0Bjb2RlIGdldFJlc3BvbnNlUHJvdG90eXBlKCl9IGlzIGdlbmVyYWxseSBub3QgbmVlZGVkIGJlY2F1c2UKLSAgICogdGhlIHtAY29kZSBTZXJ2aWNlfSBpbXBsZW1lbnRhdGlvbiBjb25zdHJ1Y3RzIHRoZSByZXNwb25zZSBtZXNzYWdlIGl0c2VsZiwKLSAgICogYnV0IGl0IG1heSBiZSB1c2VmdWwgaW4gc29tZSBjYXNlcyB0byBrbm93IGFoZWFkIG9mIHRpbWUgd2hhdCB0eXBlIG9mCi0gICAqIG9iamVjdCB3aWxsIGJlIHJldHVybmVkLgotICAgKi8KLSAgTWVzc2FnZSBnZXRSZXNwb25zZVByb3RvdHlwZShEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIG1ldGhvZCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZUV4Y2VwdGlvbi5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggY2RlNjY5ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZUV4Y2VwdGlvbi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIFRocm93biBieSBibG9ja2luZyBSUEMgbWV0aG9kcyB3aGVuIGEgZmFpbHVyZSBvY2N1cnMuCi0gKgotICogQGF1dGhvciBjcG92aXJrQGdvb2dsZS5jb20gKENocmlzIFBvdmlyaykKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VFeGNlcHRpb24gZXh0ZW5kcyBFeGNlcHRpb24gewotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAtMTIxOTI2MjMzNTcyOTg5MTkyMEw7Ci0KLSAgcHVibGljIFNlcnZpY2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICBzdXBlcihtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uKGZpbmFsIFRocm93YWJsZSBjYXVzZSkgewotICAgIHN1cGVyKGNhdXNlKTsKLSAgfQotCi0gIHB1YmxpYyBTZXJ2aWNlRXhjZXB0aW9uKGZpbmFsIFN0cmluZyBtZXNzYWdlLCBmaW5hbCBUaHJvd2FibGUgY2F1c2UpIHsKLSAgICBzdXBlcihtZXNzYWdlLCBjYXVzZSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXIuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TaW5nbGVGaWVsZEJ1aWxkZXIuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDQ0NzVmNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyNDEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIDxjb2RlPlNpbmdsZUZpZWxkQnVpbGRlcjwvY29kZT4gaW1wbGVtZW50cyBhIHN0cnVjdHVyZSB0aGF0IGEgcHJvdG9jb2wKLSAqIG1lc3NhZ2UgdXNlcyB0byBob2xkIGEgc2luZ2xlIGZpZWxkIG9mIGFub3RoZXIgcHJvdG9jb2wgbWVzc2FnZS4gSXQgc3VwcG9ydHMKLSAqIHRoZSBjbGFzc2ljYWwgdXNlIGNhc2Ugb2Ygc2V0dGluZyBhbiBpbW11dGFibGUge0BsaW5rIE1lc3NhZ2V9IGFzIHRoZSB2YWx1ZQotICogb2YgdGhlIGZpZWxkIGFuZCBpcyBoaWdobHkgb3B0aW1pemVkIGFyb3VuZCB0aGlzLgotICogPGJyPgotICogSXQgYWxzbyBzdXBwb3J0cyB0aGUgYWRkaXRpb25hbCB1c2UgY2FzZSBvZiBzZXR0aW5nIGEge0BsaW5rIE1lc3NhZ2UuQnVpbGRlcn0KLSAqIGFzIHRoZSBmaWVsZCBhbmQgZGVmZXJyaW5nIGNvbnZlcnNpb24gb2YgdGhhdCA8Y29kZT5CdWlsZGVyPC9jb2RlPgotICogdG8gYW4gaW1tdXRhYmxlIDxjb2RlPk1lc3NhZ2U8L2NvZGU+LiBJbiB0aGlzIHdheSwgaXQncyBwb3NzaWJsZSB0byBtYWludGFpbgotICogYSB0cmVlIG9mIDxjb2RlPkJ1aWxkZXI8L2NvZGU+J3MgdGhhdCBhY3RzIGFzIGEgZnVsbHkgcmVhZC93cml0ZSBkYXRhCi0gKiBzdHJ1Y3R1cmUuCi0gKiA8YnI+Ci0gKiBMb2dpY2FsbHksIG9uZSBjYW4gdGhpbmsgb2YgYSB0cmVlIG9mIGJ1aWxkZXJzIGFzIGNvbnZlcnRpbmcgdGhlIGVudGlyZSB0cmVlCi0gKiB0byBtZXNzYWdlcyB3aGVuIGJ1aWxkIGlzIGNhbGxlZCBvbiB0aGUgcm9vdCBvciB3aGVuIGFueSBtZXRob2QgaXMgY2FsbGVkCi0gKiB0aGF0IGRlc2lyZXMgYSBNZXNzYWdlIGluc3RlYWQgb2YgYSBCdWlsZGVyLiBJbiB0ZXJtcyBvZiB0aGUgaW1wbGVtZW50YXRpb24sCi0gKiB0aGUgPGNvZGU+U2luZ2xlRmllbGRCdWlsZGVyPC9jb2RlPiBhbmQgPGNvZGU+UmVwZWF0ZWRGaWVsZEJ1aWxkZXI8L2NvZGU+Ci0gKiBjbGFzc2VzIGNhY2hlIG1lc3NhZ2VzIHRoYXQgd2VyZSBjcmVhdGVkIHNvIHRoYXQgbWVzc2FnZXMgb25seSBuZWVkIHRvIGJlCi0gKiBjcmVhdGVkIHdoZW4gc29tZSBjaGFuZ2Ugb2NjdXJlZCBpbiBpdHMgYnVpbGRlciBvciBhIGJ1aWxkZXIgZm9yIG9uZSBvZiBpdHMKLSAqIGRlc2NlbmRhbnRzLgotICoKLSAqIEBwYXJhbSA8TVR5cGU+IHRoZSB0eXBlIG9mIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAotICogQHBhcmFtIDxCVHlwZT4gdGhlIHR5cGUgb2YgYnVpbGRlciBmb3IgdGhlIGZpZWxkCi0gKiBAcGFyYW0gPElUeXBlPiB0aGUgY29tbW9uIGludGVyZmFjZSBmb3IgdGhlIG1lc3NhZ2UgYW5kIHRoZSBidWlsZGVyCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVGaWVsZEJ1aWxkZXIKLSAgICA8TVR5cGUgZXh0ZW5kcyBHZW5lcmF0ZWRNZXNzYWdlLAotICAgICBCVHlwZSBleHRlbmRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlciwKLSAgICAgSVR5cGUgZXh0ZW5kcyBNZXNzYWdlT3JCdWlsZGVyPgotICAgIGltcGxlbWVudHMgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHsKLQotICAvLyBQYXJlbnQgdG8gc2VuZCBjaGFuZ2VzIHRvLgotICBwcml2YXRlIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQ7Ci0KLSAgLy8gSW52YXJpYW50OiBvbmUgb2YgYnVpbGRlciBvciBtZXNzYWdlIGZpZWxkcyBtdXN0IGJlIG5vbi1udWxsLgotCi0gIC8vIElmIHNldCwgdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSB3ZSBhcmUgYmFja2VkIGJ5IGEgYnVpbGRlci4gSW4gdGhpcyBjYXNlLAotICAvLyBtZXNzYWdlIGZpZWxkIHJlcHJlc2VudHMgYSBjYWNoZWQgbWVzc2FnZSBmb3IgdGhlIGJ1aWxkZXIgKG9yIG51bGwgaWYKLSAgLy8gdGhlcmUgaXMgbm8gY2FjaGVkIG1lc3NhZ2UpLgotICBwcml2YXRlIEJUeXBlIGJ1aWxkZXI7Ci0KLSAgLy8gSWYgYnVpbGRlciBpcyBub24tbnVsbCwgdGhpcyByZXByZXNlbnRzIGEgY2FjaGVkIG1lc3NhZ2UgZnJvbSB0aGUgYnVpbGRlci4KLSAgLy8gSWYgYnVpbGRlciBpcyBudWxsLCB0aGlzIGlzIHRoZSBhdXRob3JpdGF0aXZlIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZC4KLSAgcHJpdmF0ZSBNVHlwZSBtZXNzYWdlOwotCi0gIC8vIEluZGljYXRlcyB0aGF0IHdlJ3ZlIGJ1aWx0IGEgbWVzc2FnZSBhbmQgc28gd2UgYXJlIG5vdyBvYmxpZ2F0ZWQKLSAgLy8gdG8gZGlzcGF0Y2ggZGlydHkgaW52YWxpZGF0aW9ucy4gU2VlIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlckxpc3RlbmVyLgotICBwcml2YXRlIGJvb2xlYW4gaXNDbGVhbjsKLQotICBwdWJsaWMgU2luZ2xlRmllbGRCdWlsZGVyKAotICAgICAgTVR5cGUgbWVzc2FnZSwKLSAgICAgIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQsCi0gICAgICBib29sZWFuIGlzQ2xlYW4pIHsKLSAgICBpZiAobWVzc2FnZSA9PSBudWxsKSB7Ci0gICAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTsKLSAgICB9Ci0gICAgdGhpcy5tZXNzYWdlID0gbWVzc2FnZTsKLSAgICB0aGlzLnBhcmVudCA9IHBhcmVudDsKLSAgICB0aGlzLmlzQ2xlYW4gPSBpc0NsZWFuOwotICB9Ci0KLSAgcHVibGljIHZvaWQgZGlzcG9zZSgpIHsKLSAgICAvLyBOdWxsIG91dCBwYXJlbnQgc28gd2Ugc3RvcCBzZW5kaW5nIGl0IGludmFsaWRhdGlvbnMuCi0gICAgcGFyZW50ID0gbnVsbDsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgdGhlIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZC4gSWYgdGhlIG1lc3NhZ2UgaXMgY3VycmVudGx5IHN0b3JlZAotICAgKiBhcyBhIDxjb2RlPkJ1aWxkZXI8L2NvZGU+LCBpdCBpcyBjb252ZXJ0ZWQgdG8gYSA8Y29kZT5NZXNzYWdlPC9jb2RlPiBieQotICAgKiBjYWxsaW5nIHtAbGluayBNZXNzYWdlLkJ1aWxkZXIjYnVpbGRQYXJ0aWFsfSBvbiBpdC4gSWYgbm8gbWVzc2FnZSBoYXMKLSAgICogYmVlbiBzZXQsIHJldHVybnMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhlIG1lc3NhZ2UuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UgZm9yIHRoZSBmaWVsZAotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBNVHlwZSBnZXRNZXNzYWdlKCkgewotICAgIGlmIChtZXNzYWdlID09IG51bGwpIHsKLSAgICAgIC8vIElmIG1lc3NhZ2UgaXMgbnVsbCwgdGhlIGludmFyaWFudCBpcyB0aGF0IHdlIG11c3QgYmUgaGF2ZSBhIGJ1aWxkZXIuCi0gICAgICBtZXNzYWdlID0gKE1UeXBlKSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIH0KLSAgICByZXR1cm4gbWVzc2FnZTsKLSAgfQotCi0gIC8qKgotICAgKiBCdWlsZHMgdGhlIG1lc3NhZ2UgYW5kIHJldHVybnMgaXQuCi0gICAqCi0gICAqIEByZXR1cm4gdGhlIG1lc3NhZ2UKLSAgICovCi0gIHB1YmxpYyBNVHlwZSBidWlsZCgpIHsKLSAgICAvLyBOb3cgdGhhdCBidWlsZCBoYXMgYmVlbiBjYWxsZWQsIHdlIGFyZSByZXF1aXJlZCB0byBkaXNwYXRjaAotICAgIC8vIGludmFsaWRhdGlvbnMuCi0gICAgaXNDbGVhbiA9IHRydWU7Ci0gICAgcmV0dXJuIGdldE1lc3NhZ2UoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXRzIGEgYnVpbGRlciBmb3IgdGhlIGZpZWxkLiBJZiBubyBidWlsZGVyIGhhcyBiZWVuIGNyZWF0ZWQgeWV0LCBhCi0gICAqIGJ1aWxkZXIgaXMgY3JlYXRlZCBvbiBkZW1hbmQgYnkgY2FsbGluZyB7QGxpbmsgTWVzc2FnZSN0b0J1aWxkZXJ9LgotICAgKgotICAgKiBAcmV0dXJuIFRoZSBidWlsZGVyIGZvciB0aGUgZmllbGQKLSAgICovCi0gIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICBwdWJsaWMgQlR5cGUgZ2V0QnVpbGRlcigpIHsKLSAgICBpZiAoYnVpbGRlciA9PSBudWxsKSB7Ci0gICAgICAvLyBidWlsZGVyLm1lcmdlRnJvbSgpIG9uIGEgZnJlc2ggYnVpbGRlcgotICAgICAgLy8gZG9lcyBub3QgY3JlYXRlIGFueSBzdWItb2JqZWN0cyB3aXRoIGluZGVwZW5kZW50IGNsZWFuL2RpcnR5IHN0YXRlcywKLSAgICAgIC8vIHRoZXJlZm9yZSBzZXR0aW5nIHRoZSBidWlsZGVyIGl0c2VsZiB0byBjbGVhbiB3aXRob3V0IGFjdHVhbGx5IGNhbGxpbmcKLSAgICAgIC8vIGJ1aWxkKCkgY2Fubm90IGJyZWFrIGFueSBpbnZhcmlhbnRzLgotICAgICAgYnVpbGRlciA9IChCVHlwZSkgbWVzc2FnZS5uZXdCdWlsZGVyRm9yVHlwZSh0aGlzKTsKLSAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKG1lc3NhZ2UpOyAvLyBuby1vcCBpZiBtZXNzYWdlIGlzIHRoZSBkZWZhdWx0IG1lc3NhZ2UKLSAgICAgIGJ1aWxkZXIubWFya0NsZWFuKCk7Ci0gICAgfQotICAgIHJldHVybiBidWlsZGVyOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldHMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlIGZvciB0aGUgZmllbGQuIFRoaXMgbWF5IGVpdGhlciBiZSBhIGJ1aWxkZXIKLSAgICogb3IgYSBtZXNzYWdlLiBJdCB3aWxsIHJldHVybiB3aGF0ZXZlciBpcyBtb3JlIGVmZmljaWVudC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgbWVzc2FnZSBvciBidWlsZGVyIGZvciB0aGUgZmllbGQgYXMgdGhlIGJhc2UgY2xhc3MgaW50ZXJmYWNlCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHVibGljIElUeXBlIGdldE1lc3NhZ2VPckJ1aWxkZXIoKSB7Ci0gICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgcmV0dXJuICAoSVR5cGUpIGJ1aWxkZXI7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiAoSVR5cGUpIG1lc3NhZ2U7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFNldHMgYSAgbWVzc2FnZSBmb3IgdGhlIGZpZWxkIHJlcGxhY2luZyBhbnkgZXhpc3RpbmcgdmFsdWUuCi0gICAqCi0gICAqIEBwYXJhbSBtZXNzYWdlIHRoZSBtZXNzYWdlIHRvIHNldAotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IHNldE1lc3NhZ2UoCi0gICAgICBNVHlwZSBtZXNzYWdlKSB7Ci0gICAgaWYgKG1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7Ci0gICAgfQotICAgIHRoaXMubWVzc2FnZSA9IG1lc3NhZ2U7Ci0gICAgaWYgKGJ1aWxkZXIgIT0gbnVsbCkgewotICAgICAgYnVpbGRlci5kaXNwb3NlKCk7Ci0gICAgICBidWlsZGVyID0gbnVsbDsKLSAgICB9Ci0gICAgb25DaGFuZ2VkKCk7Ci0gICAgcmV0dXJuIHRoaXM7Ci0gIH0KLQotICAvKioKLSAgICogTWVyZ2VzIHRoZSBmaWVsZCBmcm9tIGFub3RoZXIgZmllbGQuCi0gICAqCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgdG8gbWVyZ2UgZnJvbQotICAgKiBAcmV0dXJuIHRoZSBidWlsZGVyCi0gICAqLwotICBwdWJsaWMgU2luZ2xlRmllbGRCdWlsZGVyPE1UeXBlLCBCVHlwZSwgSVR5cGU+IG1lcmdlRnJvbSgKLSAgICAgIE1UeXBlIHZhbHVlKSB7Ci0gICAgaWYgKGJ1aWxkZXIgPT0gbnVsbCAmJiBtZXNzYWdlID09IG1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKSB7Ci0gICAgICBtZXNzYWdlID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGdldEJ1aWxkZXIoKS5tZXJnZUZyb20odmFsdWUpOwotICAgIH0KLSAgICBvbkNoYW5nZWQoKTsKLSAgICByZXR1cm4gdGhpczsKLSAgfQotCi0gIC8qKgotICAgKiBDbGVhcnMgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KLSAgICoKLSAgICogQHJldHVybiB0aGUgYnVpbGRlcgotICAgKi8KLSAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gIHB1YmxpYyBTaW5nbGVGaWVsZEJ1aWxkZXI8TVR5cGUsIEJUeXBlLCBJVHlwZT4gY2xlYXIoKSB7Ci0gICAgbWVzc2FnZSA9IChNVHlwZSkgKG1lc3NhZ2UgIT0gbnVsbCA/Ci0gICAgICAgIG1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIDoKLSAgICAgICAgYnVpbGRlci5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpOwotICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgIGJ1aWxkZXIuZGlzcG9zZSgpOwotICAgICAgYnVpbGRlciA9IG51bGw7Ci0gICAgfQotICAgIG9uQ2hhbmdlZCgpOwotICAgIHJldHVybiB0aGlzOwotICB9Ci0KLSAgLyoqCi0gICAqIENhbGxlZCB3aGVuIGEgdGhlIGJ1aWxkZXIgb3Igb25lIG9mIGl0cyBuZXN0ZWQgY2hpbGRyZW4gaGFzIGNoYW5nZWQKLSAgICogYW5kIGFueSBwYXJlbnQgc2hvdWxkIGJlIG5vdGlmaWVkIG9mIGl0cyBpbnZhbGlkYXRpb24uCi0gICAqLwotICBwcml2YXRlIHZvaWQgb25DaGFuZ2VkKCkgewotICAgIC8vIElmIGJ1aWxkZXIgaXMgbnVsbCwgdGhpcyBpcyB0aGUgY2FzZSB3aGVyZSBvbkNoYW5nZWQgaXMgYmVpbmcgY2FsbGVkCi0gICAgLy8gZnJvbSBzZXRNZXNzYWdlIG9yIGNsZWFyLgotICAgIGlmIChidWlsZGVyICE9IG51bGwpIHsKLSAgICAgIG1lc3NhZ2UgPSBudWxsOwotICAgIH0KLSAgICBpZiAoaXNDbGVhbiAmJiBwYXJlbnQgIT0gbnVsbCkgewotICAgICAgcGFyZW50Lm1hcmtEaXJ0eSgpOwotCi0gICAgICAvLyBEb24ndCBrZWVwIGRpc3BhdGNoaW5nIGludmFsaWRhdGlvbnMgdW50aWwgYnVpbGQgaXMgY2FsbGVkIGFnYWluLgotICAgICAgaXNDbGVhbiA9IGZhbHNlOwotICAgIH0KLSAgfQotCi0gIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICBwdWJsaWMgdm9pZCBtYXJrRGlydHkoKSB7Ci0gICAgb25DaGFuZ2VkKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TbWFsbFNvcnRlZE1hcC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDFjZjI3MGYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NtYWxsU29ydGVkTWFwLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw2MTggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgamF2YS51dGlsLkFic3RyYWN0TWFwOwotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdFNldDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlMaXN0OwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuSXRlcmF0b3I7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVNYXA7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLk1hcDsKLWltcG9ydCBqYXZhLnV0aWwuTm9TdWNoRWxlbWVudEV4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLnV0aWwuU2V0OwotaW1wb3J0IGphdmEudXRpbC5Tb3J0ZWRNYXA7Ci0KLS8qKgotICogQSBjdXN0b20gbWFwIGltcGxlbWVudGF0aW9uIGZyb20gRmllbGREZXNjcmlwdG9yIHRvIE9iamVjdCBvcHRpbWl6ZWQgdG8KLSAqIG1pbmltaXplIHRoZSBudW1iZXIgb2YgbWVtb3J5IGFsbG9jYXRpb25zIGZvciBpbnN0YW5jZXMgd2l0aCBhIHNtYWxsIG51bWJlcgotICogb2YgbWFwcGluZ3MuIFRoZSBpbXBsZW1lbnRhdGlvbiBzdG9yZXMgdGhlIGZpcnN0IHtAY29kZSBrfSBtYXBwaW5ncyBpbiBhbgotICogYXJyYXkgZm9yIGEgY29uZmlndXJhYmxlIHZhbHVlIG9mIHtAY29kZSBrfSwgYWxsb3dpbmcgZGlyZWN0IGFjY2VzcyB0byB0aGUKLSAqIGNvcnJlc3BvbmRpbmcge0Bjb2RlIEVudHJ5fXMgd2l0aG91dCB0aGUgbmVlZCB0byBjcmVhdGUgYW4gSXRlcmF0b3IuIFRoZQotICogcmVtYWluaW5nIGVudHJpZXMgYXJlIHN0b3JlZCBpbiBhbiBvdmVyZmxvdyBtYXAuIEl0ZXJhdGlvbiBvdmVyIHRoZSBlbnRyaWVzCi0gKiBpbiB0aGUgbWFwIHNob3VsZCBiZSBkb25lIGFzIGZvbGxvd3M6Ci0gKgotICogPHByZT4KLSAqIGZvciAoaW50IGkgPSAwOyBpICZsdDsgZmllbGRNYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCk7IGkrKykgewotICogICBwcm9jZXNzKGZpZWxkTWFwLmdldEFycmF5RW50cnlBdChpKSk7Ci0gKiB9Ci0gKiBmb3IgKE1hcC5FbnRyeSZsdDtLLCBWJmd0OyBlbnRyeSA6IGZpZWxkTWFwLmdldE92ZXJmbG93RW50cmllcygpKSB7Ci0gKiAgIHByb2Nlc3MoZW50cnkpOwotICogfQotICogPC9wcmU+Ci0gKgotICogVGhlIHJlc3VsdGluZyBpdGVyYXRpb24gaXMgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIGZpZWxkIHRhZyBudW1iZXIuIFRoZQotICogb2JqZWN0IHJldHVybmVkIGJ5IHtAbGluayAjZW50cnlTZXQoKX0gYWRoZXJlcyB0byB0aGUgc2FtZSBjb250cmFjdCBidXQgaXMKLSAqIGxlc3MgZWZmaWNpZW50IGFzIGl0IG5lY2Vzc2FyaWx5IGludm9sdmVzIGNyZWF0aW5nIGFuIG9iamVjdCBmb3IgaXRlcmF0aW9uLgotICogPHA+Ci0gKiBUaGUgdHJhZGVvZmYgZm9yIHRoaXMgbWVtb3J5IGVmZmljaWVuY3kgaXMgdGhhdCB0aGUgd29yc3QgY2FzZSBydW5uaW5nIHRpbWUKLSAqIG9mIHRoZSB7QGNvZGUgcHV0KCl9IG9wZXJhdGlvbiBpcyB7QGNvZGUgTyhrICsgbGcgbil9LCB3aGljaCBoYXBwZW5zIHdoZW4KLSAqIGVudHJpZXMgYXJlIGFkZGVkIGluIGRlc2NlbmRpbmcgb3JkZXIuIHtAY29kZSBrfSBzaG91bGQgYmUgY2hvc2VuIHN1Y2ggdGhhdAotICogaXQgY292ZXJzIGVub3VnaCBjb21tb24gY2FzZXMgd2l0aG91dCBhZHZlcnNlbHkgYWZmZWN0aW5nIGxhcmdlciBtYXBzLiBJbgotICogcHJhY3RpY2UsIHRoZSB3b3JzdCBjYXNlIHNjZW5hcmlvIGRvZXMgbm90IGhhcHBlbiBmb3IgZXh0ZW5zaW9ucyBiZWNhdXNlCi0gKiBleHRlbnNpb24gZmllbGRzIGFyZSBzZXJpYWxpemVkIGFuZCBkZXNlcmlhbGl6ZWQgaW4gb3JkZXIgb2YgYXNjZW5kaW5nIHRhZwotICogbnVtYmVyLCBidXQgdGhlIHdvcnN0IGNhc2Ugc2NlbmFyaW8gY2FuIGhhcHBlbiBmb3IgRHluYW1pY01lc3NhZ2VzLgotICogPHA+Ci0gKiBUaGUgcnVubmluZyB0aW1lIGZvciBhbGwgb3RoZXIgb3BlcmF0aW9ucyBpcyBzaW1pbGFyIHRvIHRoYXQgb2YKLSAqIHtAY29kZSBUcmVlTWFwfS4KLSAqIDxwPgotICogSW5zdGFuY2VzIGFyZSBub3QgdGhyZWFkLXNhZmUgdW50aWwge0BsaW5rICNtYWtlSW1tdXRhYmxlKCl9IGlzIGNhbGxlZCwKLSAqIGFmdGVyIHdoaWNoIGFueSBtb2RpZnlpbmcgb3BlcmF0aW9uIHdpbGwgcmVzdWx0IGluIGFuCi0gKiB7QGxpbmsgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb259LgotICoKLSAqIEBhdXRob3IgZGFyaWNrQGdvb2dsZS5jb20gRGFyaWNrIFRvbmcKLSAqLwotLy8gVGhpcyBjbGFzcyBpcyBmaW5hbCBmb3IgYWxsIGludGVudHMgYW5kIHB1cnBvc2VzIGJlY2F1c2UgdGhlIGNvbnN0cnVjdG9yIGlzCi0vLyBwcml2YXRlLiBIb3dldmVyLCB0aGUgRmllbGREZXNjcmlwdG9yLXNwZWNpZmljIGxvZ2ljIGlzIGVuY2Fwc3VsYXRlZCBpbgotLy8gYSBzdWJjbGFzcyB0byBhaWQgdGVzdGFiaWxpdHkgb2YgdGhlIGNvcmUgbG9naWMuCi1jbGFzcyBTbWFsbFNvcnRlZE1hcDxLIGV4dGVuZHMgQ29tcGFyYWJsZTxLPiwgVj4gZXh0ZW5kcyBBYnN0cmFjdE1hcDxLLCBWPiB7Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZm9yIG1hcHBpbmcgRmllbGREZXNjcmlwdG9ycyB0byB0aGVpciB2YWx1ZXMuCi0gICAqIFRoZSB7QGxpbmsgI21ha2VJbW11dGFibGUoKX0gaW1wbGVtZW50YXRpb24gd2lsbCBjb252ZXJ0IHRoZSBMaXN0IHZhbHVlcwotICAgKiBvZiBhbnkgcmVwZWF0ZWQgZmllbGRzIHRvIHVubW9kaWZpYWJsZSBsaXN0cy4KLSAgICoKLSAgICogQHBhcmFtIGFycmF5U2l6ZSBUaGUgc2l6ZSBvZiB0aGUgZW50cnkgYXJyYXkgY29udGFpbmluZyB0aGUKLSAgICogICAgICAgIGxleGljb2dyYXBoaWNhbGx5IHNtYWxsZXN0IG1hcHBpbmdzLgotICAgKi8KLSAgc3RhdGljIDxGaWVsZERlc2NyaXB0b3JUeXBlIGV4dGVuZHMKLSAgICAgIEZpZWxkU2V0LkZpZWxkRGVzY3JpcHRvckxpdGU8RmllbGREZXNjcmlwdG9yVHlwZT4+Ci0gICAgICBTbWFsbFNvcnRlZE1hcDxGaWVsZERlc2NyaXB0b3JUeXBlLCBPYmplY3Q+IG5ld0ZpZWxkTWFwKGludCBhcnJheVNpemUpIHsKLSAgICByZXR1cm4gbmV3IFNtYWxsU29ydGVkTWFwPEZpZWxkRGVzY3JpcHRvclR5cGUsIE9iamVjdD4oYXJyYXlTaXplKSB7Ci0gICAgICBAT3ZlcnJpZGUKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgcHVibGljIHZvaWQgbWFrZUltbXV0YWJsZSgpIHsKLSAgICAgICAgaWYgKCFpc0ltbXV0YWJsZSgpKSB7Ci0gICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBnZXROdW1BcnJheUVudHJpZXMoKTsgaSsrKSB7Ci0gICAgICAgICAgICBmaW5hbCBNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA9Ci0gICAgICAgICAgICAgICAgZ2V0QXJyYXlFbnRyeUF0KGkpOwotICAgICAgICAgICAgaWYgKGVudHJ5LmdldEtleSgpLmlzUmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgICBmaW5hbCBMaXN0IHZhbHVlID0gKExpc3QpIGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICAgICAgICAgIGVudHJ5LnNldFZhbHVlKENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QodmFsdWUpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICB9Ci0gICAgICAgICAgZm9yIChNYXAuRW50cnk8RmllbGREZXNjcmlwdG9yVHlwZSwgT2JqZWN0PiBlbnRyeSA6Ci0gICAgICAgICAgICAgICAgICAgZ2V0T3ZlcmZsb3dFbnRyaWVzKCkpIHsKLSAgICAgICAgICAgIGlmIChlbnRyeS5nZXRLZXkoKS5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgICAgICAgZmluYWwgTGlzdCB2YWx1ZSA9IChMaXN0KSBlbnRyeS5nZXRWYWx1ZSgpOwotICAgICAgICAgICAgICBlbnRyeS5zZXRWYWx1ZShDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KHZhbHVlKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICAgIHN1cGVyLm1ha2VJbW11dGFibGUoKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgLyoqCi0gICAqIENyZWF0ZXMgYSBuZXcgaW5zdGFuY2UgZm9yIHRlc3RpbmcuCi0gICAqCi0gICAqIEBwYXJhbSBhcnJheVNpemUgVGhlIHNpemUgb2YgdGhlIGVudHJ5IGFycmF5IGNvbnRhaW5pbmcgdGhlCi0gICAqICAgICAgICBsZXhpY29ncmFwaGljYWxseSBzbWFsbGVzdCBtYXBwaW5ncy4KLSAgICovCi0gIHN0YXRpYyA8SyBleHRlbmRzIENvbXBhcmFibGU8Sz4sIFY+IFNtYWxsU29ydGVkTWFwPEssIFY+IG5ld0luc3RhbmNlRm9yVGVzdCgKLSAgICAgIGludCBhcnJheVNpemUpIHsKLSAgICByZXR1cm4gbmV3IFNtYWxsU29ydGVkTWFwPEssIFY+KGFycmF5U2l6ZSk7Ci0gIH0KLQotICBwcml2YXRlIGZpbmFsIGludCBtYXhBcnJheVNpemU7Ci0gIC8vIFRoZSAiZW50cnkgYXJyYXkiIGlzIGFjdHVhbGx5IGEgTGlzdCBiZWNhdXNlIGdlbmVyaWMgYXJyYXlzIGFyZSBub3QKLSAgLy8gYWxsb3dlZC4gQXJyYXlMaXN0IGFsc28gbmljZWx5IGhhbmRsZXMgdGhlIGVudHJ5IHNoaWZ0aW5nIG9uIGluc2VydHMgYW5kCi0gIC8vIHJlbW92ZXMuCi0gIHByaXZhdGUgTGlzdDxFbnRyeT4gZW50cnlMaXN0OwotICBwcml2YXRlIE1hcDxLLCBWPiBvdmVyZmxvd0VudHJpZXM7Ci0gIHByaXZhdGUgYm9vbGVhbiBpc0ltbXV0YWJsZTsKLSAgLy8gVGhlIEVudHJ5U2V0IGlzIGEgc3RhdGVsZXNzIHZpZXcgb2YgdGhlIE1hcC4gSXQncyBpbml0aWFsaXplZCB0aGUgZmlyc3QKLSAgLy8gdGltZSBpdCBpcyByZXF1ZXN0ZWQgYW5kIHJldXNlZCBoZW5jZWZvcnRoLgotICBwcml2YXRlIHZvbGF0aWxlIEVudHJ5U2V0IGxhenlFbnRyeVNldDsKLQotICAvKioKLSAgICogQGNvZGUgYXJyYXlTaXplIFNpemUgb2YgdGhlIGFycmF5IGluIHdoaWNoIHRoZSBsZXhpY29ncmFwaGljYWxseSBzbWFsbGVzdAotICAgKiAgICAgICBtYXBwaW5ncyBhcmUgc3RvcmVkLiAoaS5lLiB0aGUge0Bjb2RlIGt9IHJlZmVycmVkIHRvIGluIHRoZSBjbGFzcwotICAgKiAgICAgICBkb2N1bWVudGF0aW9uKS4KLSAgICovCi0gIHByaXZhdGUgU21hbGxTb3J0ZWRNYXAoaW50IGFycmF5U2l6ZSkgewotICAgIHRoaXMubWF4QXJyYXlTaXplID0gYXJyYXlTaXplOwotICAgIHRoaXMuZW50cnlMaXN0ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgdGhpcy5vdmVyZmxvd0VudHJpZXMgPSBDb2xsZWN0aW9ucy5lbXB0eU1hcCgpOwotICB9Ci0KLSAgLyoqIE1ha2UgdGhpcyBtYXAgaW1tdXRhYmxlIGZyb20gdGhpcyBwb2ludCBmb3J3YXJkLiAqLwotICBwdWJsaWMgdm9pZCBtYWtlSW1tdXRhYmxlKCkgewotICAgIGlmICghaXNJbW11dGFibGUpIHsKLSAgICAgIC8vIE5vdGU6IFRoZXJlJ3Mgbm8gbmVlZCB0byB3cmFwIHRoZSBlbnRyeUxpc3QgaW4gYW4gdW5tb2RpZmlhYmxlTGlzdAotICAgICAgLy8gYmVjYXVzZSBub25lIG9mIHRoZSBsaXN0J3MgYWNjZXNzb3JzIGFyZSBleHBvc2VkLiBUaGUgaXRlcmF0b3IoKSBvZgotICAgICAgLy8gb3ZlcmZsb3dFbnRyaWVzLCBvbiB0aGUgb3RoZXIgaGFuZCwgaXMgZXhwb3NlZCBzbyBpdCBtdXN0IGJlIG1hZGUKLSAgICAgIC8vIHVubW9kaWZpYWJsZS4KLSAgICAgIG92ZXJmbG93RW50cmllcyA9IG92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkgPwotICAgICAgICAgIENvbGxlY3Rpb25zLjxLLCBWPmVtcHR5TWFwKCkgOgotICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChvdmVyZmxvd0VudHJpZXMpOwotICAgICAgaXNJbW11dGFibGUgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKiBAcmV0dXJuIFdoZXRoZXIge0BsaW5rICNtYWtlSW1tdXRhYmxlKCl9IGhhcyBiZWVuIGNhbGxlZC4gKi8KLSAgcHVibGljIGJvb2xlYW4gaXNJbW11dGFibGUoKSB7Ci0gICAgcmV0dXJuIGlzSW1tdXRhYmxlOwotICB9Ci0KLSAgLyoqIEByZXR1cm4gVGhlIG51bWJlciBvZiBlbnRyaWVzIGluIHRoZSBlbnRyeSBhcnJheS4gKi8KLSAgcHVibGljIGludCBnZXROdW1BcnJheUVudHJpZXMoKSB7Ci0gICAgcmV0dXJuIGVudHJ5TGlzdC5zaXplKCk7Ci0gIH0KLQotICAvKiogQHJldHVybiBUaGUgYXJyYXkgZW50cnkgYXQgdGhlIGdpdmVuIHtAY29kZSBpbmRleH0uICovCi0gIHB1YmxpYyBNYXAuRW50cnk8SywgVj4gZ2V0QXJyYXlFbnRyeUF0KGludCBpbmRleCkgewotICAgIHJldHVybiBlbnRyeUxpc3QuZ2V0KGluZGV4KTsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIFRoZXJlIG51bWJlciBvZiBvdmVyZmxvdyBlbnRyaWVzLiAqLwotICBwdWJsaWMgaW50IGdldE51bU92ZXJmbG93RW50cmllcygpIHsKLSAgICByZXR1cm4gb3ZlcmZsb3dFbnRyaWVzLnNpemUoKTsKLSAgfQotCi0gIC8qKiBAcmV0dXJuIEFuIGl0ZXJhYmxlIG92ZXIgdGhlIG92ZXJmbG93IGVudHJpZXMuICovCi0gIHB1YmxpYyBJdGVyYWJsZTxNYXAuRW50cnk8SywgVj4+IGdldE92ZXJmbG93RW50cmllcygpIHsKLSAgICByZXR1cm4gb3ZlcmZsb3dFbnRyaWVzLmlzRW1wdHkoKSA/Ci0gICAgICAgIEVtcHR5U2V0LjxNYXAuRW50cnk8SywgVj4+aXRlcmFibGUoKSA6Ci0gICAgICAgIG92ZXJmbG93RW50cmllcy5lbnRyeVNldCgpOwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBpbnQgc2l6ZSgpIHsKLSAgICByZXR1cm4gZW50cnlMaXN0LnNpemUoKSArIG92ZXJmbG93RW50cmllcy5zaXplKCk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGltcGxlbWVudGF0aW9uIHRocm93cyBhIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIG8gaXMgbm90IGFuCi0gICAqIG9iamVjdCBvZiB0eXBlIHtAY29kZSBLfS4KLSAgICoKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBib29sZWFuIGNvbnRhaW5zS2V5KE9iamVjdCBvKSB7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgZmluYWwgSyBrZXkgPSAoSykgbzsKLSAgICByZXR1cm4gYmluYXJ5U2VhcmNoSW5BcnJheShrZXkpID49IDAgfHwgb3ZlcmZsb3dFbnRyaWVzLmNvbnRhaW5zS2V5KGtleSk7Ci0gIH0KLQotICAvKioKLSAgICogVGhlIGltcGxlbWVudGF0aW9uIHRocm93cyBhIHtAY29kZSBDbGFzc0Nhc3RFeGNlcHRpb259IGlmIG8gaXMgbm90IGFuCi0gICAqIG9iamVjdCBvZiB0eXBlIHtAY29kZSBLfS4KLSAgICoKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBWIGdldChPYmplY3QgbykgewotICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgIGZpbmFsIEsga2V5ID0gKEspIG87Ci0gICAgZmluYWwgaW50IGluZGV4ID0gYmluYXJ5U2VhcmNoSW5BcnJheShrZXkpOwotICAgIGlmIChpbmRleCA+PSAwKSB7Ci0gICAgICByZXR1cm4gZW50cnlMaXN0LmdldChpbmRleCkuZ2V0VmFsdWUoKTsKLSAgICB9Ci0gICAgcmV0dXJuIG92ZXJmbG93RW50cmllcy5nZXQoa2V5KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgViBwdXQoSyBrZXksIFYgdmFsdWUpIHsKLSAgICBjaGVja011dGFibGUoKTsKLSAgICBmaW5hbCBpbnQgaW5kZXggPSBiaW5hcnlTZWFyY2hJbkFycmF5KGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgIC8vIFJlcGxhY2UgZXhpc3RpbmcgYXJyYXkgZW50cnkuCi0gICAgICByZXR1cm4gZW50cnlMaXN0LmdldChpbmRleCkuc2V0VmFsdWUodmFsdWUpOwotICAgIH0KLSAgICBlbnN1cmVFbnRyeUFycmF5TXV0YWJsZSgpOwotICAgIGZpbmFsIGludCBpbnNlcnRpb25Qb2ludCA9IC0oaW5kZXggKyAxKTsKLSAgICBpZiAoaW5zZXJ0aW9uUG9pbnQgPj0gbWF4QXJyYXlTaXplKSB7Ci0gICAgICAvLyBQdXQgZGlyZWN0bHkgaW4gb3ZlcmZsb3cuCi0gICAgICByZXR1cm4gZ2V0T3ZlcmZsb3dFbnRyaWVzTXV0YWJsZSgpLnB1dChrZXksIHZhbHVlKTsKLSAgICB9Ci0gICAgLy8gSW5zZXJ0IG5ldyBFbnRyeSBpbiBhcnJheS4KLSAgICBpZiAoZW50cnlMaXN0LnNpemUoKSA9PSBtYXhBcnJheVNpemUpIHsKLSAgICAgIC8vIFNoaWZ0IHRoZSBsYXN0IGFycmF5IGVudHJ5IGludG8gb3ZlcmZsb3cuCi0gICAgICBmaW5hbCBFbnRyeSBsYXN0RW50cnlJbkFycmF5ID0gZW50cnlMaXN0LnJlbW92ZShtYXhBcnJheVNpemUgLSAxKTsKLSAgICAgIGdldE92ZXJmbG93RW50cmllc011dGFibGUoKS5wdXQobGFzdEVudHJ5SW5BcnJheS5nZXRLZXkoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGFzdEVudHJ5SW5BcnJheS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgZW50cnlMaXN0LmFkZChpbnNlcnRpb25Qb2ludCwgbmV3IEVudHJ5KGtleSwgdmFsdWUpKTsKLSAgICByZXR1cm4gbnVsbDsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICBjaGVja011dGFibGUoKTsKLSAgICBpZiAoIWVudHJ5TGlzdC5pc0VtcHR5KCkpIHsKLSAgICAgIGVudHJ5TGlzdC5jbGVhcigpOwotICAgIH0KLSAgICBpZiAoIW92ZXJmbG93RW50cmllcy5pc0VtcHR5KCkpIHsKLSAgICAgIG92ZXJmbG93RW50cmllcy5jbGVhcigpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBUaGUgaW1wbGVtZW50YXRpb24gdGhyb3dzIGEge0Bjb2RlIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgbyBpcyBub3QgYW4KLSAgICogb2JqZWN0IG9mIHR5cGUge0Bjb2RlIEt9LgotICAgKgotICAgKiB7QGluaGVyaXREb2N9Ci0gICAqLwotICBAT3ZlcnJpZGUKLSAgcHVibGljIFYgcmVtb3ZlKE9iamVjdCBvKSB7Ci0gICAgY2hlY2tNdXRhYmxlKCk7Ci0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgZmluYWwgSyBrZXkgPSAoSykgbzsKLSAgICBmaW5hbCBpbnQgaW5kZXggPSBiaW5hcnlTZWFyY2hJbkFycmF5KGtleSk7Ci0gICAgaWYgKGluZGV4ID49IDApIHsKLSAgICAgIHJldHVybiByZW1vdmVBcnJheUVudHJ5QXQoaW5kZXgpOwotICAgIH0KLSAgICAvLyBvdmVyZmxvd0VudHJpZXMgbWlnaHQgYmUgQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTWFwKCksIHNvIG9ubHkKLSAgICAvLyBjYWxsIHJlbW92ZSgpIGlmIGl0IGlzIG5vbi1lbXB0eS4KLSAgICBpZiAob3ZlcmZsb3dFbnRyaWVzLmlzRW1wdHkoKSkgewotICAgICAgcmV0dXJuIG51bGw7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBvdmVyZmxvd0VudHJpZXMucmVtb3ZlKGtleSk7Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBWIHJlbW92ZUFycmF5RW50cnlBdChpbnQgaW5kZXgpIHsKLSAgICBjaGVja011dGFibGUoKTsKLSAgICBmaW5hbCBWIHJlbW92ZWQgPSBlbnRyeUxpc3QucmVtb3ZlKGluZGV4KS5nZXRWYWx1ZSgpOwotICAgIGlmICghb3ZlcmZsb3dFbnRyaWVzLmlzRW1wdHkoKSkgewotICAgICAgLy8gU2hpZnQgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBvdmVyZmxvdyB0byBiZSB0aGUgbGFzdCBlbnRyeSBpbiB0aGUKLSAgICAgIC8vIGFycmF5LgotICAgICAgZmluYWwgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiBpdGVyYXRvciA9Ci0gICAgICAgICAgZ2V0T3ZlcmZsb3dFbnRyaWVzTXV0YWJsZSgpLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICAgIGVudHJ5TGlzdC5hZGQobmV3IEVudHJ5KGl0ZXJhdG9yLm5leHQoKSkpOwotICAgICAgaXRlcmF0b3IucmVtb3ZlKCk7Ci0gICAgfQotICAgIHJldHVybiByZW1vdmVkOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBrZXkgVGhlIGtleSB0byBmaW5kIGluIHRoZSBlbnRyeSBhcnJheS4KLSAgICogQHJldHVybiBUaGUgcmV0dXJuZWQgaW50ZWdlciBwb3NpdGlvbiBmb2xsb3dzIHRoZSBzYW1lIHNlbWFudGljcyBhcyB0aGUKLSAgICogICAgIHZhbHVlIHJldHVybmVkIGJ5IHtAbGluayBqYXZhLnV0aWwuQXJyYXlzI2JpbmFyeVNlYXJjaCgpfS4KLSAgICovCi0gIHByaXZhdGUgaW50IGJpbmFyeVNlYXJjaEluQXJyYXkoSyBrZXkpIHsKLSAgICBpbnQgbGVmdCA9IDA7Ci0gICAgaW50IHJpZ2h0ID0gZW50cnlMaXN0LnNpemUoKSAtIDE7Ci0KLSAgICAvLyBPcHRpbWl6YXRpb246IEZvciB0aGUgY29tbW9uIGNhc2UgaW4gd2hpY2ggZW50cmllcyBhcmUgYWRkZWQgaW4KLSAgICAvLyBhc2NlbmRpbmcgdGFnIG9yZGVyLCBjaGVjayB0aGUgbGFyZ2VzdCBlbGVtZW50IGluIHRoZSBhcnJheSBiZWZvcmUKLSAgICAvLyBkb2luZyBhIGZ1bGwgYmluYXJ5IHNlYXJjaC4KLSAgICBpZiAocmlnaHQgPj0gMCkgewotICAgICAgaW50IGNtcCA9IGtleS5jb21wYXJlVG8oZW50cnlMaXN0LmdldChyaWdodCkuZ2V0S2V5KCkpOwotICAgICAgaWYgKGNtcCA+IDApIHsKLSAgICAgICAgcmV0dXJuIC0ocmlnaHQgKyAyKTsgIC8vIEluc2VydCBwb2ludCBpcyBhZnRlciAicmlnaHQiLgotICAgICAgfSBlbHNlIGlmIChjbXAgPT0gMCkgewotICAgICAgICByZXR1cm4gcmlnaHQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgd2hpbGUgKGxlZnQgPD0gcmlnaHQpIHsKLSAgICAgIGludCBtaWQgPSAobGVmdCArIHJpZ2h0KSAvIDI7Ci0gICAgICBpbnQgY21wID0ga2V5LmNvbXBhcmVUbyhlbnRyeUxpc3QuZ2V0KG1pZCkuZ2V0S2V5KCkpOwotICAgICAgaWYgKGNtcCA8IDApIHsKLSAgICAgICAgcmlnaHQgPSBtaWQgLSAxOwotICAgICAgfSBlbHNlIGlmIChjbXAgPiAwKSB7Ci0gICAgICAgIGxlZnQgPSBtaWQgKyAxOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIG1pZDsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIC0obGVmdCArIDEpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNpbWlsYXIgdG8gdGhlIEFic3RyYWN0TWFwIGltcGxlbWVudGF0aW9uIG9mIHtAY29kZSBrZXlTZXQoKX0gYW5kCi0gICAqIHtAY29kZSB2YWx1ZXMoKX0sIHRoZSBlbnRyeSBzZXQgaXMgY3JlYXRlZCB0aGUgZmlyc3QgdGltZSB0aGlzIG1ldGhvZCBpcwotICAgKiBjYWxsZWQsIGFuZCByZXR1cm5lZCBpbiByZXNwb25zZSB0byBhbGwgc3Vic2VxdWVudCBjYWxscy4KLSAgICoKLSAgICoge0Bpbmhlcml0RG9jfQotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTZXQ8TWFwLkVudHJ5PEssIFY+PiBlbnRyeVNldCgpIHsKLSAgICBpZiAobGF6eUVudHJ5U2V0ID09IG51bGwpIHsKLSAgICAgIGxhenlFbnRyeVNldCA9IG5ldyBFbnRyeVNldCgpOwotICAgIH0KLSAgICByZXR1cm4gbGF6eUVudHJ5U2V0OwotICB9Ci0KLSAgLyoqCi0gICAqIEB0aHJvd3MgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gaWYge0BsaW5rICNtYWtlSW1tdXRhYmxlKCl9IGhhcwotICAgKiAgICAgICAgIGhhcyBiZWVuIGNhbGxlZC4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja011dGFibGUoKSB7Ci0gICAgaWYgKGlzSW1tdXRhYmxlKSB7Ci0gICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQHJldHVybiBhIHtAbGluayBTb3J0ZWRNYXB9IHRvIHdoaWNoIG92ZXJmbG93IGVudHJpZXMgbWFwcGluZ3MgY2FuIGJlCi0gICAqICAgICAgICAgYWRkZWQgb3IgcmVtb3ZlZC4KLSAgICogQHRocm93cyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBpZiB7QGxpbmsgI21ha2VJbW11dGFibGUoKX0gaGFzIGJlZW4KLSAgICogICAgICAgICBjYWxsZWQuCi0gICAqLwotICBAU3VwcHJlc3NXYXJuaW5ncygidW5jaGVja2VkIikKLSAgcHJpdmF0ZSBTb3J0ZWRNYXA8SywgVj4gZ2V0T3ZlcmZsb3dFbnRyaWVzTXV0YWJsZSgpIHsKLSAgICBjaGVja011dGFibGUoKTsKLSAgICBpZiAob3ZlcmZsb3dFbnRyaWVzLmlzRW1wdHkoKSAmJiAhKG92ZXJmbG93RW50cmllcyBpbnN0YW5jZW9mIFRyZWVNYXApKSB7Ci0gICAgICBvdmVyZmxvd0VudHJpZXMgPSBuZXcgVHJlZU1hcDxLLCBWPigpOwotICAgIH0KLSAgICByZXR1cm4gKFNvcnRlZE1hcDxLLCBWPikgb3ZlcmZsb3dFbnRyaWVzOwotICB9Ci0KLSAgLyoqCi0gICAqIExhemlseSBjcmVhdGVzIHRoZSBlbnRyeSBsaXN0LiBBbnkgY29kZSB0aGF0IGFkZHMgdG8gdGhlIGxpc3QgbXVzdCBmaXJzdAotICAgKiBjYWxsIHRoaXMgbWV0aG9kLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGVuc3VyZUVudHJ5QXJyYXlNdXRhYmxlKCkgewotICAgIGNoZWNrTXV0YWJsZSgpOwotICAgIGlmIChlbnRyeUxpc3QuaXNFbXB0eSgpICYmICEoZW50cnlMaXN0IGluc3RhbmNlb2YgQXJyYXlMaXN0KSkgewotICAgICAgZW50cnlMaXN0ID0gbmV3IEFycmF5TGlzdDxFbnRyeT4obWF4QXJyYXlTaXplKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogRW50cnkgaW1wbGVtZW50YXRpb24gdGhhdCBpbXBsZW1lbnRzIENvbXBhcmFibGUgaW4gb3JkZXIgdG8gc3VwcG9ydAotICAgKiBiaW5hcnkgc2VhcmNoIHdpdGluIHRoZSBlbnRyeSBhcnJheS4gQWxzbyBjaGVja3MgbXV0YWJpbGl0eSBpbgotICAgKiB7QGxpbmsgI3NldFZhbHVlKCl9LgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeSBpbXBsZW1lbnRzIE1hcC5FbnRyeTxLLCBWPiwgQ29tcGFyYWJsZTxFbnRyeT4gewotCi0gICAgcHJpdmF0ZSBmaW5hbCBLIGtleTsKLSAgICBwcml2YXRlIFYgdmFsdWU7Ci0KLSAgICBFbnRyeShNYXAuRW50cnk8SywgVj4gY29weSkgewotICAgICAgdGhpcyhjb3B5LmdldEtleSgpLCBjb3B5LmdldFZhbHVlKCkpOwotICAgIH0KLQotICAgIEVudHJ5KEsga2V5LCBWIHZhbHVlKSB7Ci0gICAgICB0aGlzLmtleSA9IGtleTsKLSAgICAgIHRoaXMudmFsdWUgPSB2YWx1ZTsKLSAgICB9Ci0KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgSyBnZXRLZXkoKSB7Ci0gICAgICByZXR1cm4ga2V5OwotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIHB1YmxpYyBWIGdldFZhbHVlKCkgewotICAgICAgcmV0dXJuIHZhbHVlOwotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIHB1YmxpYyBpbnQgY29tcGFyZVRvKEVudHJ5IG90aGVyKSB7Ci0gICAgICByZXR1cm4gZ2V0S2V5KCkuY29tcGFyZVRvKG90aGVyLmdldEtleSgpKTsKLSAgICB9Ci0KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgViBzZXRWYWx1ZShWIG5ld1ZhbHVlKSB7Ci0gICAgICBjaGVja011dGFibGUoKTsKLSAgICAgIGZpbmFsIFYgb2xkVmFsdWUgPSB0aGlzLnZhbHVlOwotICAgICAgdGhpcy52YWx1ZSA9IG5ld1ZhbHVlOwotICAgICAgcmV0dXJuIG9sZFZhbHVlOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhPYmplY3QgbykgewotICAgICAgaWYgKG8gPT0gdGhpcykgewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKSB7Ci0gICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgTWFwLkVudHJ5PD8sID8+IG90aGVyID0gKE1hcC5FbnRyeTw/LCA/PikgbzsKLSAgICAgIHJldHVybiBlcXVhbHMoa2V5LCBvdGhlci5nZXRLZXkoKSkgJiYgZXF1YWxzKHZhbHVlLCBvdGhlci5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuIChrZXkgPT0gbnVsbCA/IDAgOiBrZXkuaGFzaENvZGUoKSkgXgotICAgICAgICAgICh2YWx1ZSA9PSBudWxsID8gMCA6IHZhbHVlLmhhc2hDb2RlKCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgICByZXR1cm4ga2V5ICsgIj0iICsgdmFsdWU7Ci0gICAgfQotCi0gICAgLyoqIGVxdWFscygpIHRoYXQgaGFuZGxlcyBudWxsIHZhbHVlcy4gKi8KLSAgICBwcml2YXRlIGJvb2xlYW4gZXF1YWxzKE9iamVjdCBvMSwgT2JqZWN0IG8yKSB7Ci0gICAgICByZXR1cm4gbzEgPT0gbnVsbCA/IG8yID09IG51bGwgOiBvMS5lcXVhbHMobzIpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTdGF0ZWxlc3MgdmlldyBvZiB0aGUgZW50cmllcyBpbiB0aGUgZmllbGQgbWFwLgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeVNldCBleHRlbmRzIEFic3RyYWN0U2V0PE1hcC5FbnRyeTxLLCBWPj4gewotCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gaXRlcmF0b3IoKSB7Ci0gICAgICByZXR1cm4gbmV3IEVudHJ5SXRlcmF0b3IoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgICByZXR1cm4gU21hbGxTb3J0ZWRNYXAudGhpcy5zaXplKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVGhyb3dzIGEge0BsaW5rIENsYXNzQ2FzdEV4Y2VwdGlvbn0gaWYgbyBpcyBub3Qgb2YgdGhlIGV4cGVjdGVkIHR5cGUuCi0gICAgICoKLSAgICAgKiB7QGluaGVyaXREb2N9Ci0gICAgICovCi0gICAgQE92ZXJyaWRlCi0gICAgcHVibGljIGJvb2xlYW4gY29udGFpbnMoT2JqZWN0IG8pIHsKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgZmluYWwgTWFwLkVudHJ5PEssIFY+IGVudHJ5ID0gKE1hcC5FbnRyeTxLLCBWPikgbzsKLSAgICAgIGZpbmFsIFYgZXhpc3RpbmcgPSBnZXQoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgZmluYWwgViB2YWx1ZSA9IGVudHJ5LmdldFZhbHVlKCk7Ci0gICAgICByZXR1cm4gZXhpc3RpbmcgPT0gdmFsdWUgfHwKLSAgICAgICAgICAoZXhpc3RpbmcgIT0gbnVsbCAmJiBleGlzdGluZy5lcXVhbHModmFsdWUpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBhZGQoTWFwLkVudHJ5PEssIFY+IGVudHJ5KSB7Ci0gICAgICBpZiAoIWNvbnRhaW5zKGVudHJ5KSkgewotICAgICAgICBwdXQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaHJvd3MgYSB7QGxpbmsgQ2xhc3NDYXN0RXhjZXB0aW9ufSBpZiBvIGlzIG5vdCBvZiB0aGUgZXhwZWN0ZWQgdHlwZS4KLSAgICAgKgotICAgICAqIHtAaW5oZXJpdERvY30KLSAgICAgKi8KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiByZW1vdmUoT2JqZWN0IG8pIHsKLSAgICAgIEBTdXBwcmVzc1dhcm5pbmdzKCJ1bmNoZWNrZWQiKQotICAgICAgZmluYWwgTWFwLkVudHJ5PEssIFY+IGVudHJ5ID0gKE1hcC5FbnRyeTxLLCBWPikgbzsKLSAgICAgIGlmIChjb250YWlucyhlbnRyeSkpIHsKLSAgICAgICAgU21hbGxTb3J0ZWRNYXAudGhpcy5yZW1vdmUoZW50cnkuZ2V0S2V5KCkpOwotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgdm9pZCBjbGVhcigpIHsKLSAgICAgIFNtYWxsU29ydGVkTWFwLnRoaXMuY2xlYXIoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogSXRlcmF0b3IgaW1wbGVtZW50YXRpb24gdGhhdCBzd2l0Y2hlcyBmcm9tIHRoZSBlbnRyeSBhcnJheSB0byB0aGUgb3ZlcmZsb3cKLSAgICogZW50cmllcyBhcHByb3ByaWF0ZWx5LgotICAgKi8KLSAgcHJpdmF0ZSBjbGFzcyBFbnRyeUl0ZXJhdG9yIGltcGxlbWVudHMgSXRlcmF0b3I8TWFwLkVudHJ5PEssIFY+PiB7Ci0KLSAgICBwcml2YXRlIGludCBwb3MgPSAtMTsKLSAgICBwcml2YXRlIGJvb2xlYW4gbmV4dENhbGxlZEJlZm9yZVJlbW92ZTsKLSAgICBwcml2YXRlIEl0ZXJhdG9yPE1hcC5FbnRyeTxLLCBWPj4gbGF6eU92ZXJmbG93SXRlcmF0b3I7Ci0KLSAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgcmV0dXJuIChwb3MgKyAxKSA8IGVudHJ5TGlzdC5zaXplKCkgfHwKLSAgICAgICAgICBnZXRPdmVyZmxvd0l0ZXJhdG9yKCkuaGFzTmV4dCgpOwotICAgIH0KLQotICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgIHB1YmxpYyBNYXAuRW50cnk8SywgVj4gbmV4dCgpIHsKLSAgICAgIG5leHRDYWxsZWRCZWZvcmVSZW1vdmUgPSB0cnVlOwotICAgICAgLy8gQWx3YXlzIGluY3JlbWVudCBwb3Mgc28gdGhhdCB3ZSBrbm93IHdoZXRoZXIgdGhlIGxhc3QgcmV0dXJuZWQgdmFsdWUKLSAgICAgIC8vIHdhcyBmcm9tIHRoZSBhcnJheSBvciBmcm9tIG92ZXJmbG93LgotICAgICAgaWYgKCsrcG9zIDwgZW50cnlMaXN0LnNpemUoKSkgewotICAgICAgICByZXR1cm4gZW50cnlMaXN0LmdldChwb3MpOwotICAgICAgfQotICAgICAgcmV0dXJuIGdldE92ZXJmbG93SXRlcmF0b3IoKS5uZXh0KCk7Ci0gICAgfQotCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgaWYgKCFuZXh0Q2FsbGVkQmVmb3JlUmVtb3ZlKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oInJlbW92ZSgpIHdhcyBjYWxsZWQgYmVmb3JlIG5leHQoKSIpOwotICAgICAgfQotICAgICAgbmV4dENhbGxlZEJlZm9yZVJlbW92ZSA9IGZhbHNlOwotICAgICAgY2hlY2tNdXRhYmxlKCk7Ci0KLSAgICAgIGlmIChwb3MgPCBlbnRyeUxpc3Quc2l6ZSgpKSB7Ci0gICAgICAgIHJlbW92ZUFycmF5RW50cnlBdChwb3MtLSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZXRPdmVyZmxvd0l0ZXJhdG9yKCkucmVtb3ZlKCk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSXQgaXMgaW1wb3J0YW50IHRvIGNyZWF0ZSB0aGUgb3ZlcmZsb3cgaXRlcmF0b3Igb25seSBhZnRlciB0aGUgYXJyYXkKLSAgICAgKiBlbnRyaWVzIGhhdmUgYmVlbiBpdGVyYXRlZCBvdmVyIGJlY2F1c2UgdGhlIG92ZXJmbG93IGVudHJ5IHNldCBjaGFuZ2VzCi0gICAgICogd2hlbiB0aGUgY2xpZW50IGNhbGxzIHJlbW92ZSgpIG9uIHRoZSBhcnJheSBlbnRyaWVzLCB3aGljaCBpbnZhbGlkYXRlcwotICAgICAqIGFueSBleGlzdGluZyBpdGVyYXRvcnMuCi0gICAgICovCi0gICAgcHJpdmF0ZSBJdGVyYXRvcjxNYXAuRW50cnk8SywgVj4+IGdldE92ZXJmbG93SXRlcmF0b3IoKSB7Ci0gICAgICBpZiAobGF6eU92ZXJmbG93SXRlcmF0b3IgPT0gbnVsbCkgewotICAgICAgICBsYXp5T3ZlcmZsb3dJdGVyYXRvciA9IG92ZXJmbG93RW50cmllcy5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgICB9Ci0gICAgICByZXR1cm4gbGF6eU92ZXJmbG93SXRlcmF0b3I7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEhlbHBlciBjbGFzcyB0aGF0IGhvbGRzIGltbXV0YWJsZSBpbnN0YW5jZXMgb2YgYW4gSXRlcmFibGUvSXRlcmF0b3IgdGhhdAotICAgKiB3ZSByZXR1cm4gd2hlbiB0aGUgb3ZlcmZsb3cgZW50cmllcyBpcyBlbXB0eS4gVGhpcyBlbGltaW5hdGVzIHRoZSBjcmVhdGlvbgotICAgKiBvZiBhbiBJdGVyYXRvciBvYmplY3Qgd2hlbiB0aGVyZSBpcyBub3RoaW5nIHRvIGl0ZXJhdGUgb3Zlci4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGNsYXNzIEVtcHR5U2V0IHsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhdG9yPE9iamVjdD4gSVRFUkFUT1IgPSBuZXcgSXRlcmF0b3I8T2JqZWN0PigpIHsKLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgICBwdWJsaWMgT2JqZWN0IG5leHQoKSB7Ci0gICAgICAgIHRocm93IG5ldyBOb1N1Y2hFbGVtZW50RXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0gICAgfTsKLQotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIEl0ZXJhYmxlPE9iamVjdD4gSVRFUkFCTEUgPSBuZXcgSXRlcmFibGU8T2JqZWN0PigpIHsKLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIEl0ZXJhdG9yPE9iamVjdD4gaXRlcmF0b3IoKSB7Ci0gICAgICAgIHJldHVybiBJVEVSQVRPUjsKLSAgICAgIH0KLSAgICB9OwotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgc3RhdGljIDxUPiBJdGVyYWJsZTxUPiBpdGVyYWJsZSgpIHsKLSAgICAgIHJldHVybiAoSXRlcmFibGU8VD4pIElURVJBQkxFOwotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXQuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGQ1ZmJkYWIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0NzYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yOwotCi1pbXBvcnQgamF2YS5pby5JT0V4Y2VwdGlvbjsKLWltcG9ydCBqYXZhLm5pby5DaGFyQnVmZmVyOwotaW1wb3J0IGphdmEubWF0aC5CaWdJbnRlZ2VyOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxvY2FsZTsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5NYXRjaGVyOwotaW1wb3J0IGphdmEudXRpbC5yZWdleC5QYXR0ZXJuOwotCi0vKioKLSAqIFByb3ZpZGUgdGV4dCBwYXJzaW5nIGFuZCBmb3JtYXR0aW5nIHN1cHBvcnQgZm9yIHByb3RvMiBpbnN0YW5jZXMuCi0gKiBUaGUgaW1wbGVtZW50YXRpb24gbGFyZ2VseSBmb2xsb3dzIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYy4KLSAqCi0gKiBAYXV0aG9yIHdlbmJvekBnb29nbGUuY29tIFdlbmJvIFpodQotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRleHRGb3JtYXQgewotICBwcml2YXRlIFRleHRGb3JtYXQoKSB7fQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFByaW50ZXIgREVGQVVMVF9QUklOVEVSID0gbmV3IFByaW50ZXIoZmFsc2UpOwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBQcmludGVyIFNJTkdMRV9MSU5FX1BSSU5URVIgPSBuZXcgUHJpbnRlcih0cnVlKTsKLQotICAvKioKLSAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIFByb3RvY29sIE1lc3NhZ2Ugc3VwcGxpZWQgaW50bwotICAgKiB0aGUgcGFyYW1ldGVyIG91dHB1dC4gKFRoaXMgcmVwcmVzZW50YXRpb24gaXMgdGhlIG5ldyB2ZXJzaW9uIG9mIHRoZQotICAgKiBjbGFzc2ljICJQcm90b2NvbFByaW50ZXIiIG91dHB1dCBmcm9tIHRoZSBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXIgc3lzdGVtKQotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSwgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIERFRkFVTFRfUFJJTlRFUi5wcmludChtZXNzYWdlLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKLSAgfQotCi0gIC8qKiBPdXRwdXRzIGEgdGV4dHVhbCByZXByZXNlbnRhdGlvbiBvZiB7QGNvZGUgZmllbGRzfSB0byB7QGNvZGUgb3V0cHV0fS4gKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50KGZpbmFsIFVua25vd25GaWVsZFNldCBmaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgREVGQVVMVF9QUklOVEVSLnByaW50VW5rbm93bkZpZWxkcyhmaWVsZHMsIG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdlbmVyYXRlcyBhIGh1bWFuIHJlYWRhYmxlIGZvcm0gb2YgdGhpcyBtZXNzYWdlLCB1c2VmdWwgZm9yIGRlYnVnZ2luZyBhbmQKLSAgICogb3RoZXIgcHVycG9zZXMsIHdpdGggbm8gbmV3bGluZSBjaGFyYWN0ZXJzLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBTdHJpbmcgc2hvcnREZWJ1Z1N0cmluZyhmaW5hbCBNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICB0cnkgewotICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBTSU5HTEVfTElORV9QUklOVEVSLnByaW50KG1lc3NhZ2UsIG5ldyBUZXh0R2VuZXJhdG9yKHNiKSk7Ci0gICAgICAvLyBTaW5nbGUgbGluZSBtb2RlIGN1cnJlbnRseSBtaWdodCBoYXZlIGFuIGV4dHJhIHNwYWNlIGF0IHRoZSBlbmQuCi0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2VuZXJhdGVzIGEgaHVtYW4gcmVhZGFibGUgZm9ybSBvZiB0aGUgdW5rbm93biBmaWVsZHMsIHVzZWZ1bCBmb3IgZGVidWdnaW5nCi0gICAqIGFuZCBvdGhlciBwdXJwb3Nlcywgd2l0aCBubyBuZXdsaW5lIGNoYXJhY3RlcnMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIFN0cmluZyBzaG9ydERlYnVnU3RyaW5nKGZpbmFsIFVua25vd25GaWVsZFNldCBmaWVsZHMpIHsKLSAgICB0cnkgewotICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciBzYiA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBTSU5HTEVfTElORV9QUklOVEVSLnByaW50VW5rbm93bkZpZWxkcyhmaWVsZHMsIG5ldyBUZXh0R2VuZXJhdG9yKHNiKSk7Ci0gICAgICAvLyBTaW5nbGUgbGluZSBtb2RlIGN1cnJlbnRseSBtaWdodCBoYXZlIGFuIGV4dHJhIHNwYWNlIGF0IHRoZSBlbmQuCi0gICAgICByZXR1cm4gc2IudG9TdHJpbmcoKS50cmltKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGNvZGUgcHJpbnQoKX0sIGJ1dCB3cml0ZXMgZGlyZWN0bHkgdG8gYSB7QGNvZGUgU3RyaW5nfSBhbmQKLSAgICogcmV0dXJucyBpdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50VG9TdHJpbmcoZmluYWwgTWVzc2FnZSBtZXNzYWdlKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgICBwcmludChtZXNzYWdlLCB0ZXh0KTsKLSAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGNvZGUgcHJpbnQoKX0sIGJ1dCB3cml0ZXMgZGlyZWN0bHkgdG8gYSB7QGNvZGUgU3RyaW5nfSBhbmQKLSAgICogcmV0dXJucyBpdC4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50VG9TdHJpbmcoZmluYWwgVW5rbm93bkZpZWxkU2V0IGZpZWxkcykgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBTdHJpbmdCdWlsZGVyIHRleHQgPSBuZXcgU3RyaW5nQnVpbGRlcigpOwotICAgICAgcHJpbnQoZmllbGRzLCB0ZXh0KTsKLSAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgREVGQVVMVF9QUklOVEVSLnByaW50RmllbGQoZmllbGQsIHZhbHVlLCBuZXcgVGV4dEdlbmVyYXRvcihvdXRwdXQpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHByaW50RmllbGRUb1N0cmluZyhmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUpIHsKLSAgICB0cnkgewotICAgICAgZmluYWwgU3RyaW5nQnVpbGRlciB0ZXh0ID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICAgIHByaW50RmllbGQoZmllbGQsIHZhbHVlLCB0ZXh0KTsKLSAgICAgIHJldHVybiB0ZXh0LnRvU3RyaW5nKCk7Ci0gICAgfSBjYXRjaCAoSU9FeGNlcHRpb24gZSkgewotICAgICAgdGhyb3cgbmV3IElsbGVnYWxTdGF0ZUV4Y2VwdGlvbihlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGdpdmVuIGZpZWxkIHZhbHVlLgotICAgKgotICAgKiBAcGFyYW0gZmllbGQgdGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSB2YWx1ZSB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkCi0gICAqIEBwYXJhbSBvdXRwdXQgdGhlIG91dHB1dCB0byB3aGljaCB0byBhcHBlbmQgdGhlIGZvcm1hdHRlZCB2YWx1ZQotICAgKiBAdGhyb3dzIENsYXNzQ2FzdEV4Y2VwdGlvbiBpZiB0aGUgdmFsdWUgaXMgbm90IGFwcHJvcHJpYXRlIGZvciB0aGUKLSAgICogICAgIGdpdmVuIGZpZWxkIGRlc2NyaXB0b3IKLSAgICogQHRocm93cyBJT0V4Y2VwdGlvbiBpZiB0aGVyZSBpcyBhbiBleGNlcHRpb24gd3JpdGluZyB0byB0aGUgb3V0cHV0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgcHJpbnRGaWVsZFZhbHVlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBERUZBVUxUX1BSSU5URVIucHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgbmV3IFRleHRHZW5lcmF0b3Iob3V0cHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogT3V0cHV0cyBhIHRleHR1YWwgcmVwcmVzZW50YXRpb24gb2YgdGhlIHZhbHVlIG9mIGFuIHVua25vd24gZmllbGQuCi0gICAqCi0gICAqIEBwYXJhbSB0YWcgdGhlIGZpZWxkJ3MgdGFnIG51bWJlcgotICAgKiBAcGFyYW0gdmFsdWUgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZAotICAgKiBAcGFyYW0gb3V0cHV0IHRoZSBvdXRwdXQgdG8gd2hpY2ggdG8gYXBwZW5kIHRoZSBmb3JtYXR0ZWQgdmFsdWUKLSAgICogQHRocm93cyBDbGFzc0Nhc3RFeGNlcHRpb24gaWYgdGhlIHZhbHVlIGlzIG5vdCBhcHByb3ByaWF0ZSBmb3IgdGhlCi0gICAqICAgICBnaXZlbiBmaWVsZCBkZXNjcmlwdG9yCi0gICAqIEB0aHJvd3MgSU9FeGNlcHRpb24gaWYgdGhlcmUgaXMgYW4gZXhjZXB0aW9uIHdyaXRpbmcgdG8gdGhlIG91dHB1dAotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHByaW50VW5rbm93bkZpZWxkVmFsdWUoZmluYWwgaW50IHRhZywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBBcHBlbmRhYmxlIG91dHB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBwcmludFVua25vd25GaWVsZFZhbHVlKHRhZywgdmFsdWUsIG5ldyBUZXh0R2VuZXJhdG9yKG91dHB1dCkpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBwcmludFVua25vd25GaWVsZFZhbHVlKGZpbmFsIGludCB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBPYmplY3QgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgc3dpdGNoIChXaXJlRm9ybWF0LmdldFRhZ1dpcmVUeXBlKHRhZykpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6Ci0gICAgICAgIGdlbmVyYXRvci5wcmludCh1bnNpZ25lZFRvU3RyaW5nKChMb25nKSB2YWx1ZSkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9GSVhFRDMyOgotICAgICAgICBnZW5lcmF0b3IucHJpbnQoCi0gICAgICAgICAgICBTdHJpbmcuZm9ybWF0KChMb2NhbGUpIG51bGwsICIweCUwOHgiLCAoSW50ZWdlcikgdmFsdWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NDoKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KFN0cmluZy5mb3JtYXQoKExvY2FsZSkgbnVsbCwgIjB4JTAxNngiLCAoTG9uZykgdmFsdWUpKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlQnl0ZXMoKEJ5dGVTdHJpbmcpIHZhbHVlKSk7Ci0gICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVA6Ci0gICAgICAgIERFRkFVTFRfUFJJTlRFUi5wcmludFVua25vd25GaWVsZHMoKFVua25vd25GaWVsZFNldCkgdmFsdWUsIGdlbmVyYXRvcik7Ci0gICAgICAgIGJyZWFrOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiQmFkIHRhZzogIiArIHRhZyk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIEhlbHBlciBjbGFzcyBmb3IgY29udmVydGluZyBwcm90b2J1ZnMgdG8gdGV4dC4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgY2xhc3MgUHJpbnRlciB7Ci0gICAgLyoqIFdoZXRoZXIgdG8gb21pdCBuZXdsaW5lcyBmcm9tIHRoZSBvdXRwdXQuICovCi0gICAgZmluYWwgYm9vbGVhbiBzaW5nbGVMaW5lTW9kZTsKLQotICAgIHByaXZhdGUgUHJpbnRlcihmaW5hbCBib29sZWFuIHNpbmdsZUxpbmVNb2RlKSB7Ci0gICAgICB0aGlzLnNpbmdsZUxpbmVNb2RlID0gc2luZ2xlTGluZU1vZGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50KGZpbmFsIE1lc3NhZ2UgbWVzc2FnZSwgZmluYWwgVGV4dEdlbmVyYXRvciBnZW5lcmF0b3IpCi0gICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmb3IgKE1hcC5FbnRyeTxGaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZmllbGQKLSAgICAgICAgICA6IG1lc3NhZ2UuZ2V0QWxsRmllbGRzKCkuZW50cnlTZXQoKSkgewotICAgICAgICBwcmludEZpZWxkKGZpZWxkLmdldEtleSgpLCBmaWVsZC5nZXRWYWx1ZSgpLCBnZW5lcmF0b3IpOwotICAgICAgfQotICAgICAgcHJpbnRVbmtub3duRmllbGRzKG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpLCBnZW5lcmF0b3IpOwotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludEZpZWxkKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwgZmluYWwgT2JqZWN0IHZhbHVlLAotICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChmaWVsZC5pc1JlcGVhdGVkKCkpIHsKLSAgICAgICAgLy8gUmVwZWF0ZWQgZmllbGQuICBQcmludCBlYWNoIGVsZW1lbnQuCi0gICAgICAgIGZvciAoT2JqZWN0IGVsZW1lbnQgOiAoTGlzdDw/PikgdmFsdWUpIHsKLSAgICAgICAgICBwcmludFNpbmdsZUZpZWxkKGZpZWxkLCBlbGVtZW50LCBnZW5lcmF0b3IpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBwcmludFNpbmdsZUZpZWxkKGZpZWxkLCB2YWx1ZSwgZ2VuZXJhdG9yKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRTaW5nbGVGaWVsZChmaW5hbCBGaWVsZERlc2NyaXB0b3IgZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgT2JqZWN0IHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBpZiAoZmllbGQuaXNFeHRlbnNpb24oKSkgewotICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlsiKTsKLSAgICAgICAgLy8gV2Ugc3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQgZWxlbWVudHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuCi0gICAgICAgIGlmIChmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpLmdldE9wdGlvbnMoKS5nZXRNZXNzYWdlU2V0V2lyZUZvcm1hdCgpCi0gICAgICAgICAgICAmJiAoZmllbGQuZ2V0VHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5UeXBlLk1FU1NBR0UpCi0gICAgICAgICAgICAmJiAoZmllbGQuaXNPcHRpb25hbCgpKQotICAgICAgICAgICAgLy8gb2JqZWN0IGVxdWFsaXR5Ci0gICAgICAgICAgICAmJiAoZmllbGQuZ2V0RXh0ZW5zaW9uU2NvcGUoKSA9PSBmaWVsZC5nZXRNZXNzYWdlVHlwZSgpKSkgewotICAgICAgICAgIGdlbmVyYXRvci5wcmludChmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldEZ1bGxOYW1lKCkpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdlbmVyYXRvci5wcmludChmaWVsZC5nZXRGdWxsTmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgICBnZW5lcmF0b3IucHJpbnQoIl0iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChmaWVsZC5nZXRUeXBlKCkgPT0gRmllbGREZXNjcmlwdG9yLlR5cGUuR1JPVVApIHsKLSAgICAgICAgICAvLyBHcm91cHMgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggdGhlaXIgb3JpZ2luYWwgY2FwaXRhbGl6YXRpb24uCi0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGZpZWxkLmdldE1lc3NhZ2VUeXBlKCkuZ2V0TmFtZSgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZmllbGQuZ2V0TmFtZSgpKTsKLSAgICAgICAgfQotICAgICAgfQotCi0gICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIiB7ICIpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiIHtcbiIpOwotICAgICAgICAgIGdlbmVyYXRvci5pbmRlbnQoKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KCI6ICIpOwotICAgICAgfQotCi0gICAgICBwcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCBnZW5lcmF0b3IpOwotCi0gICAgICBpZiAoZmllbGQuZ2V0SmF2YVR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuTUVTU0FHRSkgewotICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn0gIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLm91dGRlbnQoKTsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIn1cbiIpOwotICAgICAgICB9Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIiAiKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoIlxuIik7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICB9Ci0KLSAgICBwcml2YXRlIHZvaWQgcHJpbnRGaWVsZFZhbHVlKGZpbmFsIEZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE9iamVjdCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIHN3aXRjaCAoZmllbGQuZ2V0VHlwZSgpKSB7Ci0gICAgICAgIGNhc2UgSU5UMzI6Ci0gICAgICAgIGNhc2UgU0lOVDMyOgotICAgICAgICBjYXNlIFNGSVhFRDMyOgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEludGVnZXIpIHZhbHVlKS50b1N0cmluZygpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIElOVDY0OgotICAgICAgICBjYXNlIFNJTlQ2NDoKLSAgICAgICAgY2FzZSBTRklYRUQ2NDoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChMb25nKSB2YWx1ZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCT09MOgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEJvb2xlYW4pIHZhbHVlKS50b1N0cmluZygpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZMT0FUOgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgoKEZsb2F0KSB2YWx1ZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBET1VCTEU6Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCgoRG91YmxlKSB2YWx1ZSkudG9TdHJpbmcoKSk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBVSU5UMzI6Ci0gICAgICAgIGNhc2UgRklYRUQzMjoKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQodW5zaWduZWRUb1N0cmluZygoSW50ZWdlcikgdmFsdWUpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgY2FzZSBGSVhFRDY0OgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCh1bnNpZ25lZFRvU3RyaW5nKChMb25nKSB2YWx1ZSkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgU1RSSU5HOgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlVGV4dCgoU3RyaW5nKSB2YWx1ZSkpOwotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJZVEVTOgotICAgICAgICAgIGdlbmVyYXRvci5wcmludCgiXCIiKTsKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoZXNjYXBlQnl0ZXMoKEJ5dGVTdHJpbmcpIHZhbHVlKSk7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCJcIiIpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICBnZW5lcmF0b3IucHJpbnQoKChFbnVtVmFsdWVEZXNjcmlwdG9yKSB2YWx1ZSkuZ2V0TmFtZSgpKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIE1FU1NBR0U6Ci0gICAgICAgIGNhc2UgR1JPVVA6Ci0gICAgICAgICAgcHJpbnQoKE1lc3NhZ2UpIHZhbHVlLCBnZW5lcmF0b3IpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgfQotICAgIH0KLQotICAgIHByaXZhdGUgdm9pZCBwcmludFVua25vd25GaWVsZHMoZmluYWwgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBUZXh0R2VuZXJhdG9yIGdlbmVyYXRvcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmb3IgKE1hcC5FbnRyeTxJbnRlZ2VyLCBVbmtub3duRmllbGRTZXQuRmllbGQ+IGVudHJ5IDoKLSAgICAgICAgICAgICAgIHVua25vd25GaWVsZHMuYXNNYXAoKS5lbnRyeVNldCgpKSB7Ci0gICAgICAgIGZpbmFsIGludCBudW1iZXIgPSBlbnRyeS5nZXRLZXkoKTsKLSAgICAgICAgZmluYWwgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZW50cnkuZ2V0VmFsdWUoKTsKLSAgICAgICAgcHJpbnRVbmtub3duRmllbGQobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKLSAgICAgICAgICAgIGZpZWxkLmdldFZhcmludExpc3QoKSwgZ2VuZXJhdG9yKTsKLSAgICAgICAgcHJpbnRVbmtub3duRmllbGQobnVtYmVyLCBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsCi0gICAgICAgICAgICBmaWVsZC5nZXRGaXhlZDMyTGlzdCgpLCBnZW5lcmF0b3IpOwotICAgICAgICBwcmludFVua25vd25GaWVsZChudW1iZXIsIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwKLSAgICAgICAgICAgIGZpZWxkLmdldEZpeGVkNjRMaXN0KCksIGdlbmVyYXRvcik7Ci0gICAgICAgIHByaW50VW5rbm93bkZpZWxkKG51bWJlciwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgICAgICAgICAgZmllbGQuZ2V0TGVuZ3RoRGVsaW1pdGVkTGlzdCgpLCBnZW5lcmF0b3IpOwotICAgICAgICBmb3IgKGZpbmFsIFVua25vd25GaWVsZFNldCB2YWx1ZSA6IGZpZWxkLmdldEdyb3VwTGlzdCgpKSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLnByaW50KGVudHJ5LmdldEtleSgpLnRvU3RyaW5nKCkpOwotICAgICAgICAgIGlmIChzaW5nbGVMaW5lTW9kZSkgewotICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCIgeyAiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2VuZXJhdG9yLnByaW50KCIge1xuIik7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuaW5kZW50KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHByaW50VW5rbm93bkZpZWxkcyh2YWx1ZSwgZ2VuZXJhdG9yKTsKLSAgICAgICAgICBpZiAoc2luZ2xlTGluZU1vZGUpIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgifSAiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgZ2VuZXJhdG9yLm91dGRlbnQoKTsKLSAgICAgICAgICAgIGdlbmVyYXRvci5wcmludCgifVxuIik7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHByaW50VW5rbm93bkZpZWxkKGZpbmFsIGludCBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGludCB3aXJlVHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTGlzdDw/PiB2YWx1ZXMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIFRleHRHZW5lcmF0b3IgZ2VuZXJhdG9yKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBPYmplY3QgdmFsdWUgOiB2YWx1ZXMpIHsKLSAgICAgICAgZ2VuZXJhdG9yLnByaW50KFN0cmluZy52YWx1ZU9mKG51bWJlcikpOwotICAgICAgICBnZW5lcmF0b3IucHJpbnQoIjogIik7Ci0gICAgICAgIHByaW50VW5rbm93bkZpZWxkVmFsdWUod2lyZVR5cGUsIHZhbHVlLCBnZW5lcmF0b3IpOwotICAgICAgICBnZW5lcmF0b3IucHJpbnQoc2luZ2xlTGluZU1vZGUgPyAiICIgOiAiXG4iKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICAvKiogQ29udmVydCBhbiB1bnNpZ25lZCAzMi1iaXQgaW50ZWdlciB0byBhIHN0cmluZy4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuc2lnbmVkVG9TdHJpbmcoZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgaWYgKHZhbHVlID49IDApIHsKLSAgICAgIHJldHVybiBJbnRlZ2VyLnRvU3RyaW5nKHZhbHVlKTsKLSAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIExvbmcudG9TdHJpbmcoKChsb25nKSB2YWx1ZSkgJiAweDAwMDAwMDAwRkZGRkZGRkZMKTsKLSAgICB9Ci0gIH0KLQotICAvKiogQ29udmVydCBhbiB1bnNpZ25lZCA2NC1iaXQgaW50ZWdlciB0byBhIHN0cmluZy4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIHVuc2lnbmVkVG9TdHJpbmcoZmluYWwgbG9uZyB2YWx1ZSkgewotICAgIGlmICh2YWx1ZSA+PSAwKSB7Ci0gICAgICByZXR1cm4gTG9uZy50b1N0cmluZyh2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIC8vIFB1bGwgb2ZmIHRoZSBtb3N0LXNpZ25pZmljYW50IGJpdCBzbyB0aGF0IEJpZ0ludGVnZXIgZG9lc24ndCB0aGluawotICAgICAgLy8gdGhlIG51bWJlciBpcyBuZWdhdGl2ZSwgdGhlbiBzZXQgaXQgYWdhaW4gdXNpbmcgc2V0Qml0KCkuCi0gICAgICByZXR1cm4gQmlnSW50ZWdlci52YWx1ZU9mKHZhbHVlICYgMHg3RkZGRkZGRkZGRkZGRkZGTCkKLSAgICAgICAgICAgICAgICAgICAgICAgLnNldEJpdCg2MykudG9TdHJpbmcoKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogQW4gaW5uZXIgY2xhc3MgZm9yIHdyaXRpbmcgdGV4dCB0byB0aGUgb3V0cHV0IHN0cmVhbS4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFRleHRHZW5lcmF0b3IgewotICAgIHByaXZhdGUgZmluYWwgQXBwZW5kYWJsZSBvdXRwdXQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBTdHJpbmdCdWlsZGVyIGluZGVudCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGF0U3RhcnRPZkxpbmUgPSB0cnVlOwotCi0gICAgcHJpdmF0ZSBUZXh0R2VuZXJhdG9yKGZpbmFsIEFwcGVuZGFibGUgb3V0cHV0KSB7Ci0gICAgICB0aGlzLm91dHB1dCA9IG91dHB1dDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJbmRlbnQgdGV4dCBieSB0d28gc3BhY2VzLiAgQWZ0ZXIgY2FsbGluZyBJbmRlbnQoKSwgdHdvIHNwYWNlcyB3aWxsIGJlCi0gICAgICogaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb2YgdGV4dC4gIEluZGVudCgpIG1heSBiZSBjYWxsZWQKLSAgICAgKiBtdWx0aXBsZSB0aW1lcyB0byBwcm9kdWNlIGRlZXBlciBpbmRlbnRzLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGluZGVudCgpIHsKLSAgICAgIGluZGVudC5hcHBlbmQoIiAgIik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmVkdWNlcyB0aGUgY3VycmVudCBpbmRlbnQgbGV2ZWwgYnkgdHdvIHNwYWNlcywgb3IgY3Jhc2hlcyBpZiB0aGUgaW5kZW50Ci0gICAgICogbGV2ZWwgaXMgemVyby4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBvdXRkZW50KCkgewotICAgICAgZmluYWwgaW50IGxlbmd0aCA9IGluZGVudC5sZW5ndGgoKTsKLSAgICAgIGlmIChsZW5ndGggPT0gMCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKAotICAgICAgICAgICAgIiBPdXRkZW50KCkgd2l0aG91dCBtYXRjaGluZyBJbmRlbnQoKS4iKTsKLSAgICAgIH0KLSAgICAgIGluZGVudC5kZWxldGUobGVuZ3RoIC0gMiwgbGVuZ3RoKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQcmludCB0ZXh0IHRvIHRoZSBvdXRwdXQgc3RyZWFtLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHByaW50KGZpbmFsIENoYXJTZXF1ZW5jZSB0ZXh0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IHNpemUgPSB0ZXh0Lmxlbmd0aCgpOwotICAgICAgaW50IHBvcyA9IDA7Ci0KLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgIGlmICh0ZXh0LmNoYXJBdChpKSA9PSAnXG4nKSB7Ci0gICAgICAgICAgd3JpdGUodGV4dC5zdWJTZXF1ZW5jZShwb3MsIHNpemUpLCBpIC0gcG9zICsgMSk7Ci0gICAgICAgICAgcG9zID0gaSArIDE7Ci0gICAgICAgICAgYXRTdGFydE9mTGluZSA9IHRydWU7Ci0gICAgICAgIH0KLSAgICAgIH0KLSAgICAgIHdyaXRlKHRleHQuc3ViU2VxdWVuY2UocG9zLCBzaXplKSwgc2l6ZSAtIHBvcyk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHdyaXRlKGZpbmFsIENoYXJTZXF1ZW5jZSBkYXRhLCBmaW5hbCBpbnQgc2l6ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIGlmIChzaXplID09IDApIHsKLSAgICAgICAgcmV0dXJuOwotICAgICAgfQotICAgICAgaWYgKGF0U3RhcnRPZkxpbmUpIHsKLSAgICAgICAgYXRTdGFydE9mTGluZSA9IGZhbHNlOwotICAgICAgICBvdXRwdXQuYXBwZW5kKGluZGVudCk7Ci0gICAgICB9Ci0gICAgICBvdXRwdXQuYXBwZW5kKGRhdGEpOwotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIFBhcnNpbmcKLQotICAvKioKLSAgICogUmVwcmVzZW50cyBhIHN0cmVhbSBvZiB0b2tlbnMgcGFyc2VkIGZyb20gYSB7QGNvZGUgU3RyaW5nfS4KLSAgICoKLSAgICogPHA+VGhlIEphdmEgc3RhbmRhcmQgbGlicmFyeSBwcm92aWRlcyBtYW55IGNsYXNzZXMgdGhhdCB5b3UgbWlnaHQgdGhpbmsKLSAgICogd291bGQgYmUgdXNlZnVsIGZvciBpbXBsZW1lbnRpbmcgdGhpcywgYnV0IGFyZW4ndC4gIEZvciBleGFtcGxlOgotICAgKgotICAgKiA8dWw+Ci0gICAqIDxsaT57QGNvZGUgamF2YS5pby5TdHJlYW1Ub2tlbml6ZXJ9OiAgVGhpcyBhbG1vc3QgZG9lcyB3aGF0IHdlIHdhbnQgLS0gb3IsCi0gICAqICAgYXQgbGVhc3QsIHNvbWV0aGluZyB0aGF0IHdvdWxkIGdldCB1cyBjbG9zZSB0byB3aGF0IHdlIHdhbnQgLS0gZXhjZXB0Ci0gICAqICAgZm9yIG9uZSBmYXRhbCBmbGF3OiAgSXQgYXV0b21hdGljYWxseSB1bi1lc2NhcGVzIHN0cmluZ3MgdXNpbmcgSmF2YQotICAgKiAgIGVzY2FwZSBzZXF1ZW5jZXMsIHdoaWNoIGRvIG5vdCBpbmNsdWRlIGFsbCB0aGUgZXNjYXBlIHNlcXVlbmNlcyB3ZQotICAgKiAgIG5lZWQgdG8gc3VwcG9ydCAoZS5nLiAnXHgnKS4KLSAgICogPGxpPntAY29kZSBqYXZhLnV0aWwuU2Nhbm5lcn06ICBUaGlzIHNlZW1zIGxpa2UgYSBncmVhdCB3YXkgYXQgbGVhc3QgdG8KLSAgICogICBwYXJzZSByZWd1bGFyIGV4cHJlc3Npb25zIG91dCBvZiBhIHN0cmVhbSAoc28gd2Ugd291bGRuJ3QgaGF2ZSB0byBsb2FkCi0gICAqICAgdGhlIGVudGlyZSBpbnB1dCBpbnRvIGEgc2luZ2xlIHN0cmluZyBiZWZvcmUgcGFyc2luZykuICBTYWRseSwKLSAgICogICB7QGNvZGUgU2Nhbm5lcn0gcmVxdWlyZXMgdGhhdCB0b2tlbnMgYmUgZGVsaW1pdGVkIHdpdGggc29tZSBkZWxpbWl0ZXIuCi0gICAqICAgVGh1cywgYWx0aG91Z2ggdGhlIHRleHQgImZvbzoiIHNob3VsZCBwYXJzZSB0byB0d28gdG9rZW5zICgiZm9vIiBhbmQKLSAgICogICAiOiIpLCB7QGNvZGUgU2Nhbm5lcn0gd291bGQgcmVjb2duaXplIGl0IG9ubHkgYXMgYSBzaW5nbGUgdG9rZW4uCi0gICAqICAgRnVydGhlcm1vcmUsIHtAY29kZSBTY2FubmVyfSBwcm92aWRlcyBubyB3YXkgdG8gaW5zcGVjdCB0aGUgY29udGVudHMKLSAgICogICBvZiBkZWxpbWl0ZXJzLCBtYWtpbmcgaXQgaW1wb3NzaWJsZSB0byBrZWVwIHRyYWNrIG9mIGxpbmUgYW5kIGNvbHVtbgotICAgKiAgIG51bWJlcnMuCi0gICAqIDwvdWw+Ci0gICAqCi0gICAqIDxwPkx1Y2tpbHksIEphdmEncyByZWd1bGFyIGV4cHJlc3Npb24gc3VwcG9ydCBkb2VzIG1hbmFnZSB0byBiZSB1c2VmdWwgdG8KLSAgICogdXMuICAoQmFyZWx5OiAgV2UgbmVlZCB7QGNvZGUgTWF0Y2hlci51c2VQYXR0ZXJuKCl9LCB3aGljaCBpcyBuZXcgaW4KLSAgICogSmF2YSAxLjUuKSAgU28sIHdlIGNhbiB1c2UgdGhhdCwgYXQgbGVhc3QuICBVbmZvcnR1bmF0ZWx5LCB0aGlzIGltcGxpZXMKLSAgICogdGhhdCB3ZSBuZWVkIHRvIGhhdmUgdGhlIGVudGlyZSBpbnB1dCBpbiBvbmUgY29udGlndW91cyBzdHJpbmcuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBjbGFzcyBUb2tlbml6ZXIgewotICAgIHByaXZhdGUgZmluYWwgQ2hhclNlcXVlbmNlIHRleHQ7Ci0gICAgcHJpdmF0ZSBmaW5hbCBNYXRjaGVyIG1hdGNoZXI7Ci0gICAgcHJpdmF0ZSBTdHJpbmcgY3VycmVudFRva2VuOwotCi0gICAgLy8gVGhlIGNoYXJhY3RlciBpbmRleCB3aXRoaW4gdGhpcy50ZXh0IGF0IHdoaWNoIHRoZSBjdXJyZW50IHRva2VuIGJlZ2lucy4KLSAgICBwcml2YXRlIGludCBwb3MgPSAwOwotCi0gICAgLy8gVGhlIGxpbmUgYW5kIGNvbHVtbiBudW1iZXJzIG9mIHRoZSBjdXJyZW50IHRva2VuLgotICAgIHByaXZhdGUgaW50IGxpbmUgPSAwOwotICAgIHByaXZhdGUgaW50IGNvbHVtbiA9IDA7Ci0KLSAgICAvLyBUaGUgbGluZSBhbmQgY29sdW1uIG51bWJlcnMgb2YgdGhlIHByZXZpb3VzIHRva2VuIChhbGxvd3MgdGhyb3dpbmcKLSAgICAvLyBlcnJvcnMgKmFmdGVyKiBjb25zdW1pbmcpLgotICAgIHByaXZhdGUgaW50IHByZXZpb3VzTGluZSA9IDA7Ci0gICAgcHJpdmF0ZSBpbnQgcHJldmlvdXNDb2x1bW4gPSAwOwotCi0gICAgLy8gV2UgdXNlIHBvc3Nlc2l2ZSBxdWFudGlmaWVycyAoKisgYW5kICsrKSBiZWNhdXNlIG90aGVyd2lzZSB0aGUgSmF2YQotICAgIC8vIHJlZ2V4IG1hdGNoZXIgaGFzIHN0YWNrIG92ZXJmbG93cyBvbiBsYXJnZSBpbnB1dHMuCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBXSElURVNQQUNFID0KLSAgICAgIFBhdHRlcm4uY29tcGlsZSgiKFxcc3woIy4qJCkpKysiLCBQYXR0ZXJuLk1VTFRJTElORSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBUT0tFTiA9IFBhdHRlcm4uY29tcGlsZSgKLSAgICAgICJbYS16QS1aX11bMC05YS16QS1aXystXSorfCIgKyAgICAgICAgICAgICAgICAvLyBhbiBpZGVudGlmaWVyCi0gICAgICAiWy5dP1swLTkrLV1bMC05YS16QS1aXy4rLV0qK3wiICsgICAgICAgICAgICAgLy8gYSBudW1iZXIKLSAgICAgICJcIihbXlwiXG5cXFxcXXxcXFxcLikqKyhcInxcXFxcPyQpfCIgKyAgICAgICAvLyBhIGRvdWJsZS1xdW90ZWQgc3RyaW5nCi0gICAgICAiXCcoW15cJ1xuXFxcXF18XFxcXC4pKisoXCd8XFxcXD8kKSIsICAgICAgICAgLy8gYSBzaW5nbGUtcXVvdGVkIHN0cmluZwotICAgICAgUGF0dGVybi5NVUxUSUxJTkUpOwotCi0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBET1VCTEVfSU5GSU5JVFkgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAiLT9pbmYoaW5pdHkpPyIsCi0gICAgICBQYXR0ZXJuLkNBU0VfSU5TRU5TSVRJVkUpOwotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIFBhdHRlcm4gRkxPQVRfSU5GSU5JVFkgPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAiLT9pbmYoaW5pdHkpP2Y/IiwKLSAgICAgIFBhdHRlcm4uQ0FTRV9JTlNFTlNJVElWRSk7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgUGF0dGVybiBGTE9BVF9OQU4gPSBQYXR0ZXJuLmNvbXBpbGUoCi0gICAgICAibmFuZj8iLAotICAgICAgUGF0dGVybi5DQVNFX0lOU0VOU0lUSVZFKTsKLQotICAgIC8qKiBDb25zdHJ1Y3QgYSB0b2tlbml6ZXIgdGhhdCBwYXJzZXMgdG9rZW5zIGZyb20gdGhlIGdpdmVuIHRleHQuICovCi0gICAgcHJpdmF0ZSBUb2tlbml6ZXIoZmluYWwgQ2hhclNlcXVlbmNlIHRleHQpIHsKLSAgICAgIHRoaXMudGV4dCA9IHRleHQ7Ci0gICAgICB0aGlzLm1hdGNoZXIgPSBXSElURVNQQUNFLm1hdGNoZXIodGV4dCk7Ci0gICAgICBza2lwV2hpdGVzcGFjZSgpOwotICAgICAgbmV4dFRva2VuKCk7Ci0gICAgfQotCi0gICAgLyoqIEFyZSB3ZSBhdCB0aGUgZW5kIG9mIHRoZSBpbnB1dD8gKi8KLSAgICBwdWJsaWMgYm9vbGVhbiBhdEVuZCgpIHsKLSAgICAgIHJldHVybiBjdXJyZW50VG9rZW4ubGVuZ3RoKCkgPT0gMDsKLSAgICB9Ci0KLSAgICAvKiogQWR2YW5jZSB0byB0aGUgbmV4dCB0b2tlbi4gKi8KLSAgICBwdWJsaWMgdm9pZCBuZXh0VG9rZW4oKSB7Ci0gICAgICBwcmV2aW91c0xpbmUgPSBsaW5lOwotICAgICAgcHJldmlvdXNDb2x1bW4gPSBjb2x1bW47Ci0KLSAgICAgIC8vIEFkdmFuY2UgdGhlIGxpbmUgY291bnRlciB0byB0aGUgY3VycmVudCBwb3NpdGlvbi4KLSAgICAgIHdoaWxlIChwb3MgPCBtYXRjaGVyLnJlZ2lvblN0YXJ0KCkpIHsKLSAgICAgICAgaWYgKHRleHQuY2hhckF0KHBvcykgPT0gJ1xuJykgewotICAgICAgICAgICsrbGluZTsKLSAgICAgICAgICBjb2x1bW4gPSAwOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgICsrY29sdW1uOwotICAgICAgICB9Ci0gICAgICAgICsrcG9zOwotICAgICAgfQotCi0gICAgICAvLyBNYXRjaCB0aGUgbmV4dCB0b2tlbi4KLSAgICAgIGlmIChtYXRjaGVyLnJlZ2lvblN0YXJ0KCkgPT0gbWF0Y2hlci5yZWdpb25FbmQoKSkgewotICAgICAgICAvLyBFT0YKLSAgICAgICAgY3VycmVudFRva2VuID0gIiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBtYXRjaGVyLnVzZVBhdHRlcm4oVE9LRU4pOwotICAgICAgICBpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgewotICAgICAgICAgIGN1cnJlbnRUb2tlbiA9IG1hdGNoZXIuZ3JvdXAoKTsKLSAgICAgICAgICBtYXRjaGVyLnJlZ2lvbihtYXRjaGVyLmVuZCgpLCBtYXRjaGVyLnJlZ2lvbkVuZCgpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBUYWtlIG9uZSBjaGFyYWN0ZXIuCi0gICAgICAgICAgY3VycmVudFRva2VuID0gU3RyaW5nLnZhbHVlT2YodGV4dC5jaGFyQXQocG9zKSk7Ci0gICAgICAgICAgbWF0Y2hlci5yZWdpb24ocG9zICsgMSwgbWF0Y2hlci5yZWdpb25FbmQoKSk7Ci0gICAgICAgIH0KLQotICAgICAgICBza2lwV2hpdGVzcGFjZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNraXAgb3ZlciBhbnkgd2hpdGVzcGFjZSBzbyB0aGF0IHRoZSBtYXRjaGVyIHJlZ2lvbiBzdGFydHMgYXQgdGhlIG5leHQKLSAgICAgKiB0b2tlbi4KLSAgICAgKi8KLSAgICBwcml2YXRlIHZvaWQgc2tpcFdoaXRlc3BhY2UoKSB7Ci0gICAgICBtYXRjaGVyLnVzZVBhdHRlcm4oV0hJVEVTUEFDRSk7Ci0gICAgICBpZiAobWF0Y2hlci5sb29raW5nQXQoKSkgewotICAgICAgICBtYXRjaGVyLnJlZ2lvbihtYXRjaGVyLmVuZCgpLCBtYXRjaGVyLnJlZ2lvbkVuZCgpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBleGFjdGx5IG1hdGNoZXMge0Bjb2RlIHRva2VufSwgY29uc3VtZSBpdCBhbmQgcmV0dXJuCi0gICAgICoge0Bjb2RlIHRydWV9LiAgT3RoZXJ3aXNlLCByZXR1cm4ge0Bjb2RlIGZhbHNlfSB3aXRob3V0IGRvaW5nIGFueXRoaW5nLgotICAgICAqLwotICAgIHB1YmxpYyBib29sZWFuIHRyeUNvbnN1bWUoZmluYWwgU3RyaW5nIHRva2VuKSB7Ci0gICAgICBpZiAoY3VycmVudFRva2VuLmVxdWFscyh0b2tlbikpIHsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGV4YWN0bHkgbWF0Y2hlcyB7QGNvZGUgdG9rZW59LCBjb25zdW1lIGl0LiAgT3RoZXJ3aXNlLAotICAgICAqIHRocm93IGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBjb25zdW1lKGZpbmFsIFN0cmluZyB0b2tlbikgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgIGlmICghdHJ5Q29uc3VtZSh0b2tlbikpIHsKLSAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIFwiIiArIHRva2VuICsgIlwiLiIpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFJldHVybnMge0Bjb2RlIHRydWV9IGlmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGludGVnZXIsIGJ1dCBkb2VzCi0gICAgICogbm90IGNvbnN1bWUgaXQuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbG9va2luZ0F0SW50ZWdlcigpIHsKLSAgICAgIGlmIChjdXJyZW50VG9rZW4ubGVuZ3RoKCkgPT0gMCkgewotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIGNoYXIgYyA9IGN1cnJlbnRUb2tlbi5jaGFyQXQoMCk7Ci0gICAgICByZXR1cm4gKCcwJyA8PSBjICYmIGMgPD0gJzknKSB8fAotICAgICAgICAgICAgIGMgPT0gJy0nIHx8IGMgPT0gJysnOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGFuIGlkZW50aWZpZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCi0gICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb25zdW1lSWRlbnRpZmllcigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRUb2tlbi5sZW5ndGgoKTsgaSsrKSB7Ci0gICAgICAgIGZpbmFsIGNoYXIgYyA9IGN1cnJlbnRUb2tlbi5jaGFyQXQoaSk7Ci0gICAgICAgIGlmICgoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHx8Ci0gICAgICAgICAgICAoJ0EnIDw9IGMgJiYgYyA8PSAnWicpIHx8Ci0gICAgICAgICAgICAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8Ci0gICAgICAgICAgICAoYyA9PSAnXycpIHx8IChjID09ICcuJykpIHsKLSAgICAgICAgICAvLyBPSwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKCJFeHBlY3RlZCBpZGVudGlmaWVyLiIpOwotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGZpbmFsIFN0cmluZyByZXN1bHQgPSBjdXJyZW50VG9rZW47Ci0gICAgICBuZXh0VG9rZW4oKTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSAzMi1iaXQgc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMKLSAgICAgKiB2YWx1ZS4gIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29uc3VtZUludDMyKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsIGludCByZXN1bHQgPSBwYXJzZUludDMyKGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgaW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgMzItYml0IHVuc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMKLSAgICAgKiB2YWx1ZS4gIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBpbnQgY29uc3VtZVVJbnQzMigpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBpbnQgcmVzdWx0ID0gcGFyc2VVSW50MzIoY3VycmVudFRva2VuKTsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBpbnRlZ2VyUGFyc2VFeGNlcHRpb24oZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSA2NC1iaXQgc2lnbmVkIGludGVnZXIsIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMKLSAgICAgKiB2YWx1ZS4gIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBsb25nIGNvbnN1bWVJbnQ2NCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHBhcnNlSW50NjQoY3VycmVudFRva2VuKTsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBpbnRlZ2VyUGFyc2VFeGNlcHRpb24oZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogSWYgdGhlIG5leHQgdG9rZW4gaXMgYSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlciwgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cwotICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIGxvbmcgY29uc3VtZVVJbnQ2NCgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBsb25nIHJlc3VsdCA9IHBhcnNlVUludDY0KGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgaW50ZWdlclBhcnNlRXhjZXB0aW9uKGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgZG91YmxlLCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgotICAgICAqIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBkb3VibGUgY29uc3VtZURvdWJsZSgpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICAvLyBXZSBuZWVkIHRvIHBhcnNlIGluZmluaXR5IGFuZCBuYW4gc2VwYXJhdGVseSBiZWNhdXNlCi0gICAgICAvLyBEb3VibGUucGFyc2VEb3VibGUoKSBkb2VzIG5vdCBhY2NlcHQgImluZiIsICJpbmZpbml0eSIsIG9yICJuYW4iLgotICAgICAgaWYgKERPVUJMRV9JTkZJTklUWS5tYXRjaGVyKGN1cnJlbnRUb2tlbikubWF0Y2hlcygpKSB7Ci0gICAgICAgIGZpbmFsIGJvb2xlYW4gbmVnYXRpdmUgPSBjdXJyZW50VG9rZW4uc3RhcnRzV2l0aCgiLSIpOwotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIG5lZ2F0aXZlID8gRG91YmxlLk5FR0FUSVZFX0lORklOSVRZIDogRG91YmxlLlBPU0lUSVZFX0lORklOSVRZOwotICAgICAgfQotICAgICAgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHNJZ25vcmVDYXNlKCJuYW4iKSkgewotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIERvdWJsZS5OYU47Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBkb3VibGUgcmVzdWx0ID0gRG91YmxlLnBhcnNlRG91YmxlKGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZmxvYXRQYXJzZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGZsb2F0LCBjb25zdW1lIGl0IGFuZCByZXR1cm4gaXRzIHZhbHVlLgotICAgICAqIE90aGVyd2lzZSwgdGhyb3cgYSB7QGxpbmsgUGFyc2VFeGNlcHRpb259LgotICAgICAqLwotICAgIHB1YmxpYyBmbG9hdCBjb25zdW1lRmxvYXQoKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgLy8gV2UgbmVlZCB0byBwYXJzZSBpbmZpbml0eSBhbmQgbmFuIHNlcGFyYXRlbHkgYmVjYXVzZQotICAgICAgLy8gRmxvYXQucGFyc2VGbG9hdCgpIGRvZXMgbm90IGFjY2VwdCAiaW5mIiwgImluZmluaXR5Iiwgb3IgIm5hbiIuCi0gICAgICBpZiAoRkxPQVRfSU5GSU5JVFkubWF0Y2hlcihjdXJyZW50VG9rZW4pLm1hdGNoZXMoKSkgewotICAgICAgICBmaW5hbCBib29sZWFuIG5lZ2F0aXZlID0gY3VycmVudFRva2VuLnN0YXJ0c1dpdGgoIi0iKTsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIHJldHVybiBuZWdhdGl2ZSA/IEZsb2F0Lk5FR0FUSVZFX0lORklOSVRZIDogRmxvYXQuUE9TSVRJVkVfSU5GSU5JVFk7Ci0gICAgICB9Ci0gICAgICBpZiAoRkxPQVRfTkFOLm1hdGNoZXIoY3VycmVudFRva2VuKS5tYXRjaGVzKCkpIHsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIHJldHVybiBGbG9hdC5OYU47Ci0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBmbG9hdCByZXN1bHQgPSBGbG9hdC5wYXJzZUZsb2F0KGN1cnJlbnRUb2tlbik7Ci0gICAgICAgIG5leHRUb2tlbigpOwotICAgICAgICByZXR1cm4gcmVzdWx0OwotICAgICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgICAgdGhyb3cgZmxvYXRQYXJzZUV4Y2VwdGlvbihlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIGJvb2xlYW4sIGNvbnN1bWUgaXQgYW5kIHJldHVybiBpdHMgdmFsdWUuCi0gICAgICogT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gY29uc3VtZUJvb2xlYW4oKSB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgICAgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHMoInRydWUiKSB8fAotICAgICAgICAgIGN1cnJlbnRUb2tlbi5lcXVhbHMoInQiKSB8fAotICAgICAgICAgIGN1cnJlbnRUb2tlbi5lcXVhbHMoIjEiKSkgewotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9IGVsc2UgaWYgKGN1cnJlbnRUb2tlbi5lcXVhbHMoImZhbHNlIikgfHwKLSAgICAgICAgICAgICAgICAgY3VycmVudFRva2VuLmVxdWFscygiZiIpIHx8Ci0gICAgICAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5lcXVhbHMoIjAiKSkgewotICAgICAgICBuZXh0VG9rZW4oKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi4iKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBJZiB0aGUgbmV4dCB0b2tlbiBpcyBhIHN0cmluZywgY29uc3VtZSBpdCBhbmQgcmV0dXJuIGl0cyAodW5lc2NhcGVkKQotICAgICAqIHZhbHVlLiAgT3RoZXJ3aXNlLCB0aHJvdyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0uCi0gICAgICovCi0gICAgcHVibGljIFN0cmluZyBjb25zdW1lU3RyaW5nKCkgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICAgIHJldHVybiBjb25zdW1lQnl0ZVN0cmluZygpLnRvU3RyaW5nVXRmOCgpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIElmIHRoZSBuZXh0IHRva2VuIGlzIGEgc3RyaW5nLCBjb25zdW1lIGl0LCB1bmVzY2FwZSBpdCBhcyBhCi0gICAgICoge0BsaW5rIEJ5dGVTdHJpbmd9LCBhbmQgcmV0dXJuIGl0LiAgT3RoZXJ3aXNlLCB0aHJvdyBhCi0gICAgICoge0BsaW5rIFBhcnNlRXhjZXB0aW9ufS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnl0ZVN0cmluZyBjb25zdW1lQnl0ZVN0cmluZygpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBMaXN0PEJ5dGVTdHJpbmc+IGxpc3QgPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7Ci0gICAgICBjb25zdW1lQnl0ZVN0cmluZyhsaXN0KTsKLSAgICAgIHdoaWxlIChjdXJyZW50VG9rZW4uc3RhcnRzV2l0aCgiJyIpIHx8IGN1cnJlbnRUb2tlbi5zdGFydHNXaXRoKCJcIiIpKSB7Ci0gICAgICAgIGNvbnN1bWVCeXRlU3RyaW5nKGxpc3QpOwotICAgICAgfQotICAgICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20obGlzdCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogTGlrZSB7QGxpbmsgI2NvbnN1bWVCeXRlU3RyaW5nKCl9IGJ1dCBhZGRzIGVhY2ggdG9rZW4gb2YgdGhlIHN0cmluZyB0bwotICAgICAqIHRoZSBnaXZlbiBsaXN0LiAgU3RyaW5nIGxpdGVyYWxzICh3aGV0aGVyIGJ5dGVzIG9yIHRleHQpIG1heSBjb21lIGluCi0gICAgICogbXVsdGlwbGUgYWRqYWNlbnQgdG9rZW5zIHdoaWNoIGFyZSBhdXRvbWF0aWNhbGx5IGNvbmNhdGVuYXRlZCwgbGlrZSBpbgotICAgICAqIEMgb3IgUHl0aG9uLgotICAgICAqLwotICAgIHByaXZhdGUgdm9pZCBjb25zdW1lQnl0ZVN0cmluZyhMaXN0PEJ5dGVTdHJpbmc+IGxpc3QpIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBjaGFyIHF1b3RlID0gY3VycmVudFRva2VuLmxlbmd0aCgpID4gMCA/IGN1cnJlbnRUb2tlbi5jaGFyQXQoMCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJ1wwJzsKLSAgICAgIGlmIChxdW90ZSAhPSAnXCInICYmIHF1b3RlICE9ICdcJycpIHsKLSAgICAgICAgdGhyb3cgcGFyc2VFeGNlcHRpb24oIkV4cGVjdGVkIHN0cmluZy4iKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGN1cnJlbnRUb2tlbi5sZW5ndGgoKSA8IDIgfHwKLSAgICAgICAgICBjdXJyZW50VG9rZW4uY2hhckF0KGN1cnJlbnRUb2tlbi5sZW5ndGgoKSAtIDEpICE9IHF1b3RlKSB7Ci0gICAgICAgIHRocm93IHBhcnNlRXhjZXB0aW9uKCJTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIik7Ci0gICAgICB9Ci0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGZpbmFsIFN0cmluZyBlc2NhcGVkID0KLSAgICAgICAgICAgIGN1cnJlbnRUb2tlbi5zdWJzdHJpbmcoMSwgY3VycmVudFRva2VuLmxlbmd0aCgpIC0gMSk7Ci0gICAgICAgIGZpbmFsIEJ5dGVTdHJpbmcgcmVzdWx0ID0gdW5lc2NhcGVCeXRlcyhlc2NhcGVkKTsKLSAgICAgICAgbmV4dFRva2VuKCk7Ci0gICAgICAgIGxpc3QuYWRkKHJlc3VsdCk7Ci0gICAgICB9IGNhdGNoIChJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBwYXJzZUV4Y2VwdGlvbihlLmdldE1lc3NhZ2UoKSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyBhIHtAbGluayBQYXJzZUV4Y2VwdGlvbn0gd2l0aCB0aGUgY3VycmVudCBsaW5lIGFuZCBjb2x1bW4KLSAgICAgKiBudW1iZXJzIGluIHRoZSBkZXNjcmlwdGlvbiwgc3VpdGFibGUgZm9yIHRocm93aW5nLgotICAgICAqLwotICAgIHB1YmxpYyBQYXJzZUV4Y2VwdGlvbiBwYXJzZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgIC8vIE5vdGU6ICBQZW9wbGUgZ2VuZXJhbGx5IHByZWZlciBvbmUtYmFzZWQgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAobGluZSArIDEpICsgIjoiICsgKGNvbHVtbiArIDEpICsgIjogIiArIGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBSZXR1cm5zIGEge0BsaW5rIFBhcnNlRXhjZXB0aW9ufSB3aXRoIHRoZSBsaW5lIGFuZCBjb2x1bW4gbnVtYmVycyBvZgotICAgICAqIHRoZSBwcmV2aW91cyB0b2tlbiBpbiB0aGUgZGVzY3JpcHRpb24sIHN1aXRhYmxlIGZvciB0aHJvd2luZy4KLSAgICAgKi8KLSAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24gcGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAotICAgICAgICBmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgIC8vIE5vdGU6ICBQZW9wbGUgZ2VuZXJhbGx5IHByZWZlciBvbmUtYmFzZWQgbGluZSBhbmQgY29sdW1uIG51bWJlcnMuCi0gICAgICByZXR1cm4gbmV3IFBhcnNlRXhjZXB0aW9uKAotICAgICAgICAocHJldmlvdXNMaW5lICsgMSkgKyAiOiIgKyAocHJldmlvdXNDb2x1bW4gKyAxKSArICI6ICIgKyBkZXNjcmlwdGlvbik7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0cyBhbiBhcHByb3ByaWF0ZSB7QGxpbmsgUGFyc2VFeGNlcHRpb259IGZvciB0aGUgZ2l2ZW4KLSAgICAgKiB7QGNvZGUgTnVtYmVyRm9ybWF0RXhjZXB0aW9ufSB3aGVuIHRyeWluZyB0byBwYXJzZSBhbiBpbnRlZ2VyLgotICAgICAqLwotICAgIHByaXZhdGUgUGFyc2VFeGNlcHRpb24gaW50ZWdlclBhcnNlRXhjZXB0aW9uKAotICAgICAgICBmaW5hbCBOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgcmV0dXJuIHBhcnNlRXhjZXB0aW9uKCJDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiAiICsgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIENvbnN0cnVjdHMgYW4gYXBwcm9wcmlhdGUge0BsaW5rIFBhcnNlRXhjZXB0aW9ufSBmb3IgdGhlIGdpdmVuCi0gICAgICoge0Bjb2RlIE51bWJlckZvcm1hdEV4Y2VwdGlvbn0gd2hlbiB0cnlpbmcgdG8gcGFyc2UgYSBmbG9hdCBvciBkb3VibGUuCi0gICAgICovCi0gICAgcHJpdmF0ZSBQYXJzZUV4Y2VwdGlvbiBmbG9hdFBhcnNlRXhjZXB0aW9uKGZpbmFsIE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICByZXR1cm4gcGFyc2VFeGNlcHRpb24oIkNvdWxkbid0IHBhcnNlIG51bWJlcjogIiArIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKiogVGhyb3duIHdoZW4gcGFyc2luZyBhbiBpbnZhbGlkIHRleHQgZm9ybWF0IG1lc3NhZ2UuICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUGFyc2VFeGNlcHRpb24gZXh0ZW5kcyBJT0V4Y2VwdGlvbiB7Ci0gICAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMzE5NjE4ODA2MDIyNTEwNzcwMkw7Ci0KLSAgICBwdWJsaWMgUGFyc2VFeGNlcHRpb24oZmluYWwgU3RyaW5nIG1lc3NhZ2UpIHsKLSAgICAgIHN1cGVyKG1lc3NhZ2UpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKLSAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgUmVhZGFibGUgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgbWVyZ2UoaW5wdXQsIEV4dGVuc2lvblJlZ2lzdHJ5LmdldEVtcHR5UmVnaXN0cnkoKSwgYnVpbGRlcik7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSB0ZXh0LWZvcm1hdCBtZXNzYWdlIGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgdGhlIGNvbnRlbnRzCi0gICAqIGludG8ge0Bjb2RlIGJ1aWxkZXJ9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1lcmdlKGZpbmFsIENoYXJTZXF1ZW5jZSBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIFBhcnNlRXhjZXB0aW9uIHsKLSAgICBtZXJnZShpbnB1dCwgRXh0ZW5zaW9uUmVnaXN0cnkuZ2V0RW1wdHlSZWdpc3RyeSgpLCBidWlsZGVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKLSAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uICBFeHRlbnNpb25zIHdpbGwgYmUgcmVjb2duaXplZCBpZiB0aGV5IGFyZQotICAgKiByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgUmVhZGFibGUgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAvLyBSZWFkIHRoZSBlbnRpcmUgaW5wdXQgdG8gYSBTdHJpbmcgdGhlbiBwYXJzZSB0aGF0LgotCi0gICAgLy8gSWYgU3RyZWFtVG9rZW5pemVyIHdlcmUgbm90IHF1aXRlIHNvIGNyaXBwbGVkLCBvciBpZiB0aGVyZSB3ZXJlIGEga2luZAotICAgIC8vIG9mIFJlYWRlciB0aGF0IGNvdWxkIHJlYWQgaW4gY2h1bmtzIHRoYXQgbWF0Y2ggc29tZSBwYXJ0aWN1bGFyIHJlZ2V4LAotICAgIC8vIG9yIGlmIHdlIHdhbnRlZCB0byB3cml0ZSBhIGN1c3RvbSBSZWFkZXIgdG8gdG9rZW5pemUgb3VyIHN0cmVhbSwgdGhlbgotICAgIC8vIHdlIHdvdWxkIG5vdCBoYXZlIHRvIHJlYWQgdG8gb25lIGJpZyBTdHJpbmcuICBBbGFzLCBub25lIG9mIHRoZXNlIGlzCi0gICAgLy8gdGhlIGNhc2UuICBPaCB3ZWxsLgotCi0gICAgbWVyZ2UodG9TdHJpbmdCdWlsZGVyKGlucHV0KSwgZXh0ZW5zaW9uUmVnaXN0cnksIGJ1aWxkZXIpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgaW50IEJVRkZFUl9TSVpFID0gNDA5NjsKLQotICAvLyBUT0RPKGNocmlzbik6IFNlZSBpZiB3b3JraW5nIGFyb3VuZCBqYXZhLmlvLlJlYWRlciNyZWFkKENoYXJCdWZmZXIpCi0gIC8vIG92ZXJoZWFkIGlzIHdvcnRod2hpbGUKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nQnVpbGRlciB0b1N0cmluZ0J1aWxkZXIoZmluYWwgUmVhZGFibGUgaW5wdXQpCi0gICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgdGV4dCA9IG5ldyBTdHJpbmdCdWlsZGVyKCk7Ci0gICAgZmluYWwgQ2hhckJ1ZmZlciBidWZmZXIgPSBDaGFyQnVmZmVyLmFsbG9jYXRlKEJVRkZFUl9TSVpFKTsKLSAgICB3aGlsZSAodHJ1ZSkgewotICAgICAgZmluYWwgaW50IG4gPSBpbnB1dC5yZWFkKGJ1ZmZlcik7Ci0gICAgICBpZiAobiA9PSAtMSkgewotICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICAgIGJ1ZmZlci5mbGlwKCk7Ci0gICAgICB0ZXh0LmFwcGVuZChidWZmZXIsIDAsIG4pOwotICAgIH0KLSAgICByZXR1cm4gdGV4dDsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIHRleHQtZm9ybWF0IG1lc3NhZ2UgZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCBtZXJnZSB0aGUgY29udGVudHMKLSAgICogaW50byB7QGNvZGUgYnVpbGRlcn0uICBFeHRlbnNpb25zIHdpbGwgYmUgcmVjb2duaXplZCBpZiB0aGV5IGFyZQotICAgKiByZWdpc3RlcmVkIGluIHtAY29kZSBleHRlbnNpb25SZWdpc3RyeX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgbWVyZ2UoZmluYWwgQ2hhclNlcXVlbmNlIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBmaW5hbCBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBQYXJzZUV4Y2VwdGlvbiB7Ci0gICAgZmluYWwgVG9rZW5pemVyIHRva2VuaXplciA9IG5ldyBUb2tlbml6ZXIoaW5wdXQpOwotCi0gICAgd2hpbGUgKCF0b2tlbml6ZXIuYXRFbmQoKSkgewotICAgICAgbWVyZ2VGaWVsZCh0b2tlbml6ZXIsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSBzaW5nbGUgZmllbGQgZnJvbSB7QGNvZGUgdG9rZW5pemVyfSBhbmQgbWVyZ2UgaXQgaW50bwotICAgKiB7QGNvZGUgYnVpbGRlcn0uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyB2b2lkIG1lcmdlRmllbGQoZmluYWwgVG9rZW5pemVyIHRva2VuaXplciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIpCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgUGFyc2VFeGNlcHRpb24gewotICAgIEZpZWxkRGVzY3JpcHRvciBmaWVsZDsKLSAgICBmaW5hbCBEZXNjcmlwdG9yIHR5cGUgPSBidWlsZGVyLmdldERlc2NyaXB0b3JGb3JUeXBlKCk7Ci0gICAgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24gPSBudWxsOwotCi0gICAgaWYgKHRva2VuaXplci50cnlDb25zdW1lKCJbIikpIHsKLSAgICAgIC8vIEFuIGV4dGVuc2lvbi4KLSAgICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgbmFtZSA9Ci0gICAgICAgICAgbmV3IFN0cmluZ0J1aWxkZXIodG9rZW5pemVyLmNvbnN1bWVJZGVudGlmaWVyKCkpOwotICAgICAgd2hpbGUgKHRva2VuaXplci50cnlDb25zdW1lKCIuIikpIHsKLSAgICAgICAgbmFtZS5hcHBlbmQoJy4nKTsKLSAgICAgICAgbmFtZS5hcHBlbmQodG9rZW5pemVyLmNvbnN1bWVJZGVudGlmaWVyKCkpOwotICAgICAgfQotCi0gICAgICBleHRlbnNpb24gPSBleHRlbnNpb25SZWdpc3RyeS5maW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUudG9TdHJpbmcoKSk7Ci0KLSAgICAgIGlmIChleHRlbnNpb24gPT0gbnVsbCkgewotICAgICAgICB0aHJvdyB0b2tlbml6ZXIucGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAotICAgICAgICAgICJFeHRlbnNpb24gXCIiICsgbmFtZSArICJcIiBub3QgZm91bmQgaW4gdGhlIEV4dGVuc2lvblJlZ2lzdHJ5LiIpOwotICAgICAgfSBlbHNlIGlmIChleHRlbnNpb24uZGVzY3JpcHRvci5nZXRDb250YWluaW5nVHlwZSgpICE9IHR5cGUpIHsKLSAgICAgICAgdGhyb3cgdG9rZW5pemVyLnBhcnNlRXhjZXB0aW9uUHJldmlvdXNUb2tlbigKLSAgICAgICAgICAiRXh0ZW5zaW9uIFwiIiArIG5hbWUgKyAiXCIgZG9lcyBub3QgZXh0ZW5kIG1lc3NhZ2UgdHlwZSBcIiIgKwotICAgICAgICAgIHR5cGUuZ2V0RnVsbE5hbWUoKSArICJcIi4iKTsKLSAgICAgIH0KLQotICAgICAgdG9rZW5pemVyLmNvbnN1bWUoIl0iKTsKLQotICAgICAgZmllbGQgPSBleHRlbnNpb24uZGVzY3JpcHRvcjsKLSAgICB9IGVsc2UgewotICAgICAgZmluYWwgU3RyaW5nIG5hbWUgPSB0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKTsKLSAgICAgIGZpZWxkID0gdHlwZS5maW5kRmllbGRCeU5hbWUobmFtZSk7Ci0KLSAgICAgIC8vIEdyb3VwIG5hbWVzIGFyZSBleHBlY3RlZCB0byBiZSBjYXBpdGFsaXplZCBhcyB0aGV5IGFwcGVhciBpbiB0aGUKLSAgICAgIC8vIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpciBmaWVsZAotICAgICAgLy8gbmFtZXMuCi0gICAgICBpZiAoZmllbGQgPT0gbnVsbCkgewotICAgICAgICAvLyBFeHBsaWNpdGx5IHNwZWNpZnkgVVMgbG9jYWxlIHNvIHRoYXQgdGhpcyBjb2RlIGRvZXMgbm90IGJyZWFrIHdoZW4KLSAgICAgICAgLy8gZXhlY3V0aW5nIGluIFR1cmtleS4KLSAgICAgICAgZmluYWwgU3RyaW5nIGxvd2VyTmFtZSA9IG5hbWUudG9Mb3dlckNhc2UoTG9jYWxlLlVTKTsKLSAgICAgICAgZmllbGQgPSB0eXBlLmZpbmRGaWVsZEJ5TmFtZShsb3dlck5hbWUpOwotICAgICAgICAvLyBJZiB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCB3b3JrZWQgYnV0IHRoZSBmaWVsZCBpcyBOT1QgYSBncm91cCwKLSAgICAgICAgaWYgKGZpZWxkICE9IG51bGwgJiYgZmllbGQuZ2V0VHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvci5UeXBlLkdST1VQKSB7Ci0gICAgICAgICAgZmllbGQgPSBudWxsOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICAvLyBBZ2Fpbiwgc3BlY2lhbC1jYXNlIGdyb3VwIG5hbWVzIGFzIGRlc2NyaWJlZCBhYm92ZS4KLSAgICAgIGlmIChmaWVsZCAhPSBudWxsICYmIGZpZWxkLmdldFR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3IuVHlwZS5HUk9VUCAmJgotICAgICAgICAgICFmaWVsZC5nZXRNZXNzYWdlVHlwZSgpLmdldE5hbWUoKS5lcXVhbHMobmFtZSkpIHsKLSAgICAgICAgZmllbGQgPSBudWxsOwotICAgICAgfQotCi0gICAgICBpZiAoZmllbGQgPT0gbnVsbCkgewotICAgICAgICB0aHJvdyB0b2tlbml6ZXIucGFyc2VFeGNlcHRpb25QcmV2aW91c1Rva2VuKAotICAgICAgICAgICJNZXNzYWdlIHR5cGUgXCIiICsgdHlwZS5nZXRGdWxsTmFtZSgpICsKLSAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIG5hbWUgKyAiXCIuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgT2JqZWN0IHZhbHVlID0gbnVsbDsKLQotICAgIGlmIChmaWVsZC5nZXRKYXZhVHlwZSgpID09IEZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZS5NRVNTQUdFKSB7Ci0gICAgICB0b2tlbml6ZXIudHJ5Q29uc3VtZSgiOiIpOyAgLy8gb3B0aW9uYWwKLQotICAgICAgZmluYWwgU3RyaW5nIGVuZFRva2VuOwotICAgICAgaWYgKHRva2VuaXplci50cnlDb25zdW1lKCI8IikpIHsKLSAgICAgICAgZW5kVG9rZW4gPSAiPiI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICB0b2tlbml6ZXIuY29uc3VtZSgieyIpOwotICAgICAgICBlbmRUb2tlbiA9ICJ9IjsKLSAgICAgIH0KLQotICAgICAgZmluYWwgTWVzc2FnZS5CdWlsZGVyIHN1YkJ1aWxkZXI7Ci0gICAgICBpZiAoZXh0ZW5zaW9uID09IG51bGwpIHsKLSAgICAgICAgc3ViQnVpbGRlciA9IGJ1aWxkZXIubmV3QnVpbGRlckZvckZpZWxkKGZpZWxkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHN1YkJ1aWxkZXIgPSBleHRlbnNpb24uZGVmYXVsdEluc3RhbmNlLm5ld0J1aWxkZXJGb3JUeXBlKCk7Ci0gICAgICB9Ci0KLSAgICAgIHdoaWxlICghdG9rZW5pemVyLnRyeUNvbnN1bWUoZW5kVG9rZW4pKSB7Ci0gICAgICAgIGlmICh0b2tlbml6ZXIuYXRFbmQoKSkgewotICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICJFeHBlY3RlZCBcIiIgKyBlbmRUb2tlbiArICJcIi4iKTsKLSAgICAgICAgfQotICAgICAgICBtZXJnZUZpZWxkKHRva2VuaXplciwgZXh0ZW5zaW9uUmVnaXN0cnksIHN1YkJ1aWxkZXIpOwotICAgICAgfQotCi0gICAgICB2YWx1ZSA9IHN1YkJ1aWxkZXIuYnVpbGQoKTsKLQotICAgIH0gZWxzZSB7Ci0gICAgICB0b2tlbml6ZXIuY29uc3VtZSgiOiIpOwotCi0gICAgICBzd2l0Y2ggKGZpZWxkLmdldFR5cGUoKSkgewotICAgICAgICBjYXNlIElOVDMyOgotICAgICAgICBjYXNlIFNJTlQzMjoKLSAgICAgICAgY2FzZSBTRklYRUQzMjoKLSAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lSW50MzIoKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIElOVDY0OgotICAgICAgICBjYXNlIFNJTlQ2NDoKLSAgICAgICAgY2FzZSBTRklYRUQ2NDoKLSAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lSW50NjQoKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFVJTlQzMjoKLSAgICAgICAgY2FzZSBGSVhFRDMyOgotICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVVSW50MzIoKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFVJTlQ2NDoKLSAgICAgICAgY2FzZSBGSVhFRDY0OgotICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVVSW50NjQoKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEZMT0FUOgotICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVGbG9hdCgpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRE9VQkxFOgotICAgICAgICAgIHZhbHVlID0gdG9rZW5pemVyLmNvbnN1bWVEb3VibGUoKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIEJPT0w6Ci0gICAgICAgICAgdmFsdWUgPSB0b2tlbml6ZXIuY29uc3VtZUJvb2xlYW4oKTsKLSAgICAgICAgICBicmVhazsKLQotICAgICAgICBjYXNlIFNUUklORzoKLSAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lU3RyaW5nKCk7Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgY2FzZSBCWVRFUzoKLSAgICAgICAgICB2YWx1ZSA9IHRva2VuaXplci5jb25zdW1lQnl0ZVN0cmluZygpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgRU5VTToKLSAgICAgICAgICBmaW5hbCBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IGZpZWxkLmdldEVudW1UeXBlKCk7Ci0KLSAgICAgICAgICBpZiAodG9rZW5pemVyLmxvb2tpbmdBdEludGVnZXIoKSkgewotICAgICAgICAgICAgZmluYWwgaW50IG51bWJlciA9IHRva2VuaXplci5jb25zdW1lSW50MzIoKTsKLSAgICAgICAgICAgIHZhbHVlID0gZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXIobnVtYmVyKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCi0gICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpICsKLSAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIHdpdGggbnVtYmVyICIgKyBudW1iZXIgKyAnLicpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBmaW5hbCBTdHJpbmcgaWQgPSB0b2tlbml6ZXIuY29uc3VtZUlkZW50aWZpZXIoKTsKLSAgICAgICAgICAgIHZhbHVlID0gZW51bVR5cGUuZmluZFZhbHVlQnlOYW1lKGlkKTsKLSAgICAgICAgICAgIGlmICh2YWx1ZSA9PSBudWxsKSB7Ci0gICAgICAgICAgICAgIHRocm93IHRva2VuaXplci5wYXJzZUV4Y2VwdGlvblByZXZpb3VzVG9rZW4oCi0gICAgICAgICAgICAgICAgIkVudW0gdHlwZSBcIiIgKyBlbnVtVHlwZS5nZXRGdWxsTmFtZSgpICsKLSAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIHZhbHVlIG5hbWVkIFwiIiArIGlkICsgIlwiLiIpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLQotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGNhc2UgTUVTU0FHRToKLSAgICAgICAgY2FzZSBHUk9VUDoKLSAgICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigiQ2FuJ3QgZ2V0IGhlcmUuIik7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgaWYgKGZpZWxkLmlzUmVwZWF0ZWQoKSkgewotICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICB9Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBVdGlsaXR5IGZ1bmN0aW9ucwotICAvLwotICAvLyBTb21lIG9mIHRoZXNlIG1ldGhvZHMgYXJlIHBhY2thZ2UtcHJpdmF0ZSBiZWNhdXNlIERlc2NyaXB0b3JzLmphdmEgdXNlcwotICAvLyB0aGVtLgotCi0gIC8qKgotICAgKiBFc2NhcGVzIGJ5dGVzIGluIHRoZSBmb3JtYXQgdXNlZCBpbiBwcm90b2NvbCBidWZmZXIgdGV4dCBmb3JtYXQsIHdoaWNoCi0gICAqIGlzIHRoZSBzYW1lIGFzIHRoZSBmb3JtYXQgdXNlZCBmb3IgQyBzdHJpbmcgbGl0ZXJhbHMuICBBbGwgYnl0ZXMKLSAgICogdGhhdCBhcmUgbm90IHByaW50YWJsZSA3LWJpdCBBU0NJSSBjaGFyYWN0ZXJzIGFyZSBlc2NhcGVkLCBhcyB3ZWxsIGFzCi0gICAqIGJhY2tzbGFzaCwgc2luZ2xlLXF1b3RlLCBhbmQgZG91YmxlLXF1b3RlIGNoYXJhY3RlcnMuICBDaGFyYWN0ZXJzIGZvcgotICAgKiB3aGljaCBubyBkZWZpbmVkIHNob3J0LWhhbmQgZXNjYXBlIHNlcXVlbmNlIGlzIGRlZmluZWQgd2lsbCBiZSBlc2NhcGVkCi0gICAqIHVzaW5nIDMtZGlnaXQgb2N0YWwgc2VxdWVuY2VzLgotICAgKi8KLSAgc3RhdGljIFN0cmluZyBlc2NhcGVCeXRlcyhmaW5hbCBCeXRlU3RyaW5nIGlucHV0KSB7Ci0gICAgZmluYWwgU3RyaW5nQnVpbGRlciBidWlsZGVyID0gbmV3IFN0cmluZ0J1aWxkZXIoaW5wdXQuc2l6ZSgpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0LnNpemUoKTsgaSsrKSB7Ci0gICAgICBmaW5hbCBieXRlIGIgPSBpbnB1dC5ieXRlQXQoaSk7Ci0gICAgICBzd2l0Y2ggKGIpIHsKLSAgICAgICAgLy8gSmF2YSBkb2VzIG5vdCByZWNvZ25pemUgXGEgb3IgXHYsIGFwcGFyZW50bHkuCi0gICAgICAgIGNhc2UgMHgwNzogYnVpbGRlci5hcHBlbmQoIlxcYSIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xiJzogYnVpbGRlci5hcHBlbmQoIlxcYiIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xmJzogYnVpbGRlci5hcHBlbmQoIlxcZiIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xuJzogYnVpbGRlci5hcHBlbmQoIlxcbiIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xyJzogYnVpbGRlci5hcHBlbmQoIlxcciIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1x0JzogYnVpbGRlci5hcHBlbmQoIlxcdCIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgMHgwYjogYnVpbGRlci5hcHBlbmQoIlxcdiIgKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1xcJzogYnVpbGRlci5hcHBlbmQoIlxcXFwiKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJ1wnJzogYnVpbGRlci5hcHBlbmQoIlxcXCciKTsgYnJlYWs7Ci0gICAgICAgIGNhc2UgJyInIDogYnVpbGRlci5hcHBlbmQoIlxcXCIiKTsgYnJlYWs7Ci0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgLy8gTm90ZTogIEJ5dGVzIHdpdGggdGhlIGhpZ2gtb3JkZXIgYml0IHNldCBzaG91bGQgYmUgZXNjYXBlZC4gIFNpbmNlCi0gICAgICAgICAgLy8gICBieXRlcyBhcmUgc2lnbmVkLCBzdWNoIGJ5dGVzIHdpbGwgY29tcGFyZSBsZXNzIHRoYW4gMHgyMCwgaGVuY2UKLSAgICAgICAgICAvLyAgIHRoZSBmb2xsb3dpbmcgbGluZSBpcyBjb3JyZWN0LgotICAgICAgICAgIGlmIChiID49IDB4MjApIHsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSBiKTsKLSAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoJ1xcJyk7Ci0gICAgICAgICAgICBidWlsZGVyLmFwcGVuZCgoY2hhcikgKCcwJyArICgoYiA+Pj4gNikgJiAzKSkpOwotICAgICAgICAgICAgYnVpbGRlci5hcHBlbmQoKGNoYXIpICgnMCcgKyAoKGIgPj4+IDMpICYgNykpKTsKLSAgICAgICAgICAgIGJ1aWxkZXIuYXBwZW5kKChjaGFyKSAoJzAnICsgKGIgJiA3KSkpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KLSAgICB9Ci0gICAgcmV0dXJuIGJ1aWxkZXIudG9TdHJpbmcoKTsKLSAgfQotCi0gIC8qKgotICAgKiBVbi1lc2NhcGUgYSBieXRlIHNlcXVlbmNlIGFzIGVzY2FwZWQgdXNpbmcKLSAgICoge0BsaW5rICNlc2NhcGVCeXRlcyhCeXRlU3RyaW5nKX0uICBUd28tZGlnaXQgaGV4IGVzY2FwZXMgKHN0YXJ0aW5nIHdpdGgKLSAgICogIlx4IikgYXJlIGFsc28gcmVjb2duaXplZC4KLSAgICovCi0gIHN0YXRpYyBCeXRlU3RyaW5nIHVuZXNjYXBlQnl0ZXMoZmluYWwgQ2hhclNlcXVlbmNlIGNoYXJTdHJpbmcpCi0gICAgICB0aHJvd3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIHsKLSAgICAvLyBGaXJzdCBjb252ZXJ0IHRoZSBKYXZhIGNoYXJhY2F0ZXIgc2VxdWVuY2UgdG8gVVRGLTggYnl0ZXMuCi0gICAgQnl0ZVN0cmluZyBpbnB1dCA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KGNoYXJTdHJpbmcudG9TdHJpbmcoKSk7Ci0gICAgLy8gVGhlbiB1bmVzY2FwZSBjZXJ0YWluIGJ5dGUgc2VxdWVuY2VzIGludHJvZHVjZWQgYnkgQVNDSUkgJ1xcJy4gIFRoZSB2YWxpZAotICAgIC8vIGVzY2FwZXMgY2FuIGFsbCBiZSBleHByZXNzZWQgd2l0aCBBU0NJSSBjaGFyYWN0ZXJzLCBzbyBpdCBpcyBzYWZlIHRvCi0gICAgLy8gb3BlcmF0ZSBvbiBieXRlcyBoZXJlLgotICAgIC8vCi0gICAgLy8gVW5lc2NhcGluZyB0aGUgaW5wdXQgYnl0ZSBhcnJheSB3aWxsIHJlc3VsdCBpbiBhIGJ5dGUgc2VxdWVuY2UgdGhhdCdzIG5vCi0gICAgLy8gbG9uZ2VyIHRoYW4gdGhlIGlucHV0LiAgVGhhdCdzIGJlY2F1c2UgZWFjaCBlc2NhcGUgc2VxdWVuY2UgaXMgYmV0d2VlbgotICAgIC8vIHR3byBhbmQgZm91ciBieXRlcyBsb25nIGFuZCBzdGFuZHMgZm9yIGEgc2luZ2xlIGJ5dGUuCi0gICAgZmluYWwgYnl0ZVtdIHJlc3VsdCA9IG5ldyBieXRlW2lucHV0LnNpemUoKV07Ci0gICAgaW50IHBvcyA9IDA7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgewotICAgICAgYnl0ZSBjID0gaW5wdXQuYnl0ZUF0KGkpOwotICAgICAgaWYgKGMgPT0gJ1xcJykgewotICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkpIHsKLSAgICAgICAgICArK2k7Ci0gICAgICAgICAgYyA9IGlucHV0LmJ5dGVBdChpKTsKLSAgICAgICAgICBpZiAoaXNPY3RhbChjKSkgewotICAgICAgICAgICAgLy8gT2N0YWwgZXNjYXBlLgotICAgICAgICAgICAgaW50IGNvZGUgPSBkaWdpdFZhbHVlKGMpOwotICAgICAgICAgICAgaWYgKGkgKyAxIDwgaW5wdXQuc2l6ZSgpICYmIGlzT2N0YWwoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKLSAgICAgICAgICAgICAgKytpOwotICAgICAgICAgICAgICBjb2RlID0gY29kZSAqIDggKyBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7Ci0gICAgICAgICAgICB9Ci0gICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNPY3RhbChpbnB1dC5ieXRlQXQoaSArIDEpKSkgewotICAgICAgICAgICAgICArK2k7Ci0gICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogOCArIGRpZ2l0VmFsdWUoaW5wdXQuYnl0ZUF0KGkpKTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIC8vIFRPRE86IENoZWNrIHRoYXQgMCA8PSBjb2RlICYmIGNvZGUgPD0gMHhGRi4KLSAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSljb2RlOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBzd2l0Y2ggKGMpIHsKLSAgICAgICAgICAgICAgY2FzZSAnYScgOiByZXN1bHRbcG9zKytdID0gMHgwNzsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ2InIDogcmVzdWx0W3BvcysrXSA9ICdcYic7IGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdmJyA6IHJlc3VsdFtwb3MrK10gPSAnXGYnOyBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnbicgOiByZXN1bHRbcG9zKytdID0gJ1xuJzsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ3InIDogcmVzdWx0W3BvcysrXSA9ICdccic7IGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICd0JyA6IHJlc3VsdFtwb3MrK10gPSAnXHQnOyBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAndicgOiByZXN1bHRbcG9zKytdID0gMHgwYjsgYnJlYWs7Ci0gICAgICAgICAgICAgIGNhc2UgJ1xcJzogcmVzdWx0W3BvcysrXSA9ICdcXCc7IGJyZWFrOwotICAgICAgICAgICAgICBjYXNlICdcJyc6IHJlc3VsdFtwb3MrK10gPSAnXCcnOyBicmVhazsKLSAgICAgICAgICAgICAgY2FzZSAnIicgOiByZXN1bHRbcG9zKytdID0gJ1wiJzsgYnJlYWs7Ci0KLSAgICAgICAgICAgICAgY2FzZSAneCc6Ci0gICAgICAgICAgICAgICAgLy8gaGV4IGVzY2FwZQotICAgICAgICAgICAgICAgIGludCBjb2RlID0gMDsKLSAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNIZXgoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICAgIGNvZGUgPSBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7Ci0gICAgICAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgICAgICAgIHRocm93IG5ldyBJbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24oCi0gICAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFx4JyB3aXRoIG5vIGRpZ2l0cyIpOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBpZiAoaSArIDEgPCBpbnB1dC5zaXplKCkgJiYgaXNIZXgoaW5wdXQuYnl0ZUF0KGkgKyAxKSkpIHsKLSAgICAgICAgICAgICAgICAgICsraTsKLSAgICAgICAgICAgICAgICAgIGNvZGUgPSBjb2RlICogMTYgKyBkaWdpdFZhbHVlKGlucHV0LmJ5dGVBdChpKSk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJlc3VsdFtwb3MrK10gPSAoYnl0ZSljb2RlOwotICAgICAgICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgICAgICAgdGhyb3cgbmV3IEludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbigKLSAgICAgICAgICAgICAgICAgICAgIkludmFsaWQgZXNjYXBlIHNlcXVlbmNlOiAnXFwiICsgKGNoYXIpYyArICdcJycpOwotICAgICAgICAgICAgfQotICAgICAgICAgIH0KLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0aHJvdyBuZXcgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uKAotICAgICAgICAgICAgICAiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXCcgYXQgZW5kIG9mIHN0cmluZy4iKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0W3BvcysrXSA9IGM7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20ocmVzdWx0LCAwLCBwb3MpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRocm93biBieSB7QGxpbmsgVGV4dEZvcm1hdCN1bmVzY2FwZUJ5dGVzfSBhbmQKLSAgICoge0BsaW5rIFRleHRGb3JtYXQjdW5lc2NhcGVUZXh0fSB3aGVuIGFuIGludmFsaWQgZXNjYXBlIHNlcXVlbmNlIGlzIHNlZW4uCi0gICAqLwotICBzdGF0aWMgY2xhc3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIGV4dGVuZHMgSU9FeGNlcHRpb24gewotICAgIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC04MTY0MDMzNjUwMTQyNTkzMzA0TDsKLQotICAgIEludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbihmaW5hbCBTdHJpbmcgZGVzY3JpcHRpb24pIHsKLSAgICAgIHN1cGVyKGRlc2NyaXB0aW9uKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogTGlrZSB7QGxpbmsgI2VzY2FwZUJ5dGVzKEJ5dGVTdHJpbmcpfSwgYnV0IGVzY2FwZXMgYSB0ZXh0IHN0cmluZy4KLSAgICogTm9uLUFTQ0lJIGNoYXJhY3RlcnMgYXJlIGZpcnN0IGVuY29kZWQgYXMgVVRGLTgsIHRoZW4gZWFjaCBieXRlIGlzIGVzY2FwZWQKLSAgICogaW5kaXZpZHVhbGx5IGFzIGEgMy1kaWdpdCBvY3RhbCBlc2NhcGUuICBZZXMsIGl0J3Mgd2VpcmQuCi0gICAqLwotICBzdGF0aWMgU3RyaW5nIGVzY2FwZVRleHQoZmluYWwgU3RyaW5nIGlucHV0KSB7Ci0gICAgcmV0dXJuIGVzY2FwZUJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KGlucHV0KSk7Ci0gIH0KLQotICAvKioKLSAgICogVW4tZXNjYXBlIGEgdGV4dCBzdHJpbmcgYXMgZXNjYXBlZCB1c2luZyB7QGxpbmsgI2VzY2FwZVRleHQoU3RyaW5nKX0uCi0gICAqIFR3by1kaWdpdCBoZXggZXNjYXBlcyAoc3RhcnRpbmcgd2l0aCAiXHgiKSBhcmUgYWxzbyByZWNvZ25pemVkLgotICAgKi8KLSAgc3RhdGljIFN0cmluZyB1bmVzY2FwZVRleHQoZmluYWwgU3RyaW5nIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSW52YWxpZEVzY2FwZVNlcXVlbmNlRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gdW5lc2NhcGVCeXRlcyhpbnB1dCkudG9TdHJpbmdVdGY4KCk7Ci0gIH0KLQotICAvKiogSXMgdGhpcyBhbiBvY3RhbCBkaWdpdD8gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBpc09jdGFsKGZpbmFsIGJ5dGUgYykgewotICAgIHJldHVybiAnMCcgPD0gYyAmJiBjIDw9ICc3JzsKLSAgfQotCi0gIC8qKiBJcyB0aGlzIGEgaGV4IGRpZ2l0PyAqLwotICBwcml2YXRlIHN0YXRpYyBib29sZWFuIGlzSGV4KGZpbmFsIGJ5dGUgYykgewotICAgIHJldHVybiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHx8Ci0gICAgICAgICAgICgnYScgPD0gYyAmJiBjIDw9ICdmJykgfHwKLSAgICAgICAgICAgKCdBJyA8PSBjICYmIGMgPD0gJ0YnKTsKLSAgfQotCi0gIC8qKgotICAgKiBJbnRlcnByZXQgYSBjaGFyYWN0ZXIgYXMgYSBkaWdpdCAoaW4gYW55IGJhc2UgdXAgdG8gMzYpIGFuZCByZXR1cm4gdGhlCi0gICAqIG51bWVyaWMgdmFsdWUuICBUaGlzIGlzIGxpa2Uge0Bjb2RlIENoYXJhY3Rlci5kaWdpdCgpfSBidXQgd2UgZG9uJ3QgYWNjZXB0Ci0gICAqIG5vbi1BU0NJSSBkaWdpdHMuCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBpbnQgZGlnaXRWYWx1ZShmaW5hbCBieXRlIGMpIHsKLSAgICBpZiAoJzAnIDw9IGMgJiYgYyA8PSAnOScpIHsKLSAgICAgIHJldHVybiBjIC0gJzAnOwotICAgIH0gZWxzZSBpZiAoJ2EnIDw9IGMgJiYgYyA8PSAneicpIHsKLSAgICAgIHJldHVybiBjIC0gJ2EnICsgMTA7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBjIC0gJ0EnICsgMTA7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgMzItYml0IHNpZ25lZCBpbnRlZ2VyIGZyb20gdGhlIHRleHQuICBVbmxpa2UgdGhlIEphdmEgc3RhbmRhcmQKLSAgICoge0Bjb2RlIEludGVnZXIucGFyc2VJbnQoKX0sIHRoaXMgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgcHJlZml4ZXMgIjB4IgotICAgKiBhbmQgIjAiIHRvIHNpZ25pZnkgaGV4aWRlY2ltYWwgYW5kIG9jdGFsIG51bWJlcnMsIHJlc3BlY3RpdmVseS4KLSAgICovCi0gIHN0YXRpYyBpbnQgcGFyc2VJbnQzMihmaW5hbCBTdHJpbmcgdGV4dCkgdGhyb3dzIE51bWJlckZvcm1hdEV4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIChpbnQpIHBhcnNlSW50ZWdlcih0ZXh0LCB0cnVlLCBmYWxzZSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2UgYSAzMi1iaXQgdW5zaWduZWQgaW50ZWdlciBmcm9tIHRoZSB0ZXh0LiAgVW5saWtlIHRoZSBKYXZhIHN0YW5kYXJkCi0gICAqIHtAY29kZSBJbnRlZ2VyLnBhcnNlSW50KCl9LCB0aGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHByZWZpeGVzICIweCIKLSAgICogYW5kICIwIiB0byBzaWduaWZ5IGhleGlkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzLCByZXNwZWN0aXZlbHkuICBUaGUKLSAgICogcmVzdWx0IGlzIGNvZXJjZWQgdG8gYSAoc2lnbmVkKSB7QGNvZGUgaW50fSB3aGVuIHJldHVybmVkIHNpbmNlIEphdmEgaGFzCi0gICAqIG5vIHVuc2lnbmVkIGludGVnZXIgdHlwZS4KLSAgICovCi0gIHN0YXRpYyBpbnQgcGFyc2VVSW50MzIoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgIHJldHVybiAoaW50KSBwYXJzZUludGVnZXIodGV4dCwgZmFsc2UsIGZhbHNlKTsKLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZSBhIDY0LWJpdCBzaWduZWQgaW50ZWdlciBmcm9tIHRoZSB0ZXh0LiAgVW5saWtlIHRoZSBKYXZhIHN0YW5kYXJkCi0gICAqIHtAY29kZSBJbnRlZ2VyLnBhcnNlSW50KCl9LCB0aGlzIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHByZWZpeGVzICIweCIKLSAgICogYW5kICIwIiB0byBzaWduaWZ5IGhleGlkZWNpbWFsIGFuZCBvY3RhbCBudW1iZXJzLCByZXNwZWN0aXZlbHkuCi0gICAqLwotICBzdGF0aWMgbG9uZyBwYXJzZUludDY0KGZpbmFsIFN0cmluZyB0ZXh0KSB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICByZXR1cm4gcGFyc2VJbnRlZ2VyKHRleHQsIHRydWUsIHRydWUpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlIGEgNjQtYml0IHVuc2lnbmVkIGludGVnZXIgZnJvbSB0aGUgdGV4dC4gIFVubGlrZSB0aGUgSmF2YSBzdGFuZGFyZAotICAgKiB7QGNvZGUgSW50ZWdlci5wYXJzZUludCgpfSwgdGhpcyBmdW5jdGlvbiByZWNvZ25pemVzIHRoZSBwcmVmaXhlcyAiMHgiCi0gICAqIGFuZCAiMCIgdG8gc2lnbmlmeSBoZXhpZGVjaW1hbCBhbmQgb2N0YWwgbnVtYmVycywgcmVzcGVjdGl2ZWx5LiAgVGhlCi0gICAqIHJlc3VsdCBpcyBjb2VyY2VkIHRvIGEgKHNpZ25lZCkge0Bjb2RlIGxvbmd9IHdoZW4gcmV0dXJuZWQgc2luY2UgSmF2YSBoYXMKLSAgICogbm8gdW5zaWduZWQgbG9uZyB0eXBlLgotICAgKi8KLSAgc3RhdGljIGxvbmcgcGFyc2VVSW50NjQoZmluYWwgU3RyaW5nIHRleHQpIHRocm93cyBOdW1iZXJGb3JtYXRFeGNlcHRpb24gewotICAgIHJldHVybiBwYXJzZUludGVnZXIodGV4dCwgZmFsc2UsIHRydWUpOwotICB9Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgbG9uZyBwYXJzZUludGVnZXIoZmluYWwgU3RyaW5nIHRleHQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNTaWduZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsIGJvb2xlYW4gaXNMb25nKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgTnVtYmVyRm9ybWF0RXhjZXB0aW9uIHsKLSAgICBpbnQgcG9zID0gMDsKLQotICAgIGJvb2xlYW4gbmVnYXRpdmUgPSBmYWxzZTsKLSAgICBpZiAodGV4dC5zdGFydHNXaXRoKCItIiwgcG9zKSkgewotICAgICAgaWYgKCFpc1NpZ25lZCkgewotICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKCJOdW1iZXIgbXVzdCBiZSBwb3NpdGl2ZTogIiArIHRleHQpOwotICAgICAgfQotICAgICAgKytwb3M7Ci0gICAgICBuZWdhdGl2ZSA9IHRydWU7Ci0gICAgfQotCi0gICAgaW50IHJhZGl4ID0gMTA7Ci0gICAgaWYgKHRleHQuc3RhcnRzV2l0aCgiMHgiLCBwb3MpKSB7Ci0gICAgICBwb3MgKz0gMjsKLSAgICAgIHJhZGl4ID0gMTY7Ci0gICAgfSBlbHNlIGlmICh0ZXh0LnN0YXJ0c1dpdGgoIjAiLCBwb3MpKSB7Ci0gICAgICByYWRpeCA9IDg7Ci0gICAgfQotCi0gICAgZmluYWwgU3RyaW5nIG51bWJlclRleHQgPSB0ZXh0LnN1YnN0cmluZyhwb3MpOwotCi0gICAgbG9uZyByZXN1bHQgPSAwOwotICAgIGlmIChudW1iZXJUZXh0Lmxlbmd0aCgpIDwgMTYpIHsKLSAgICAgIC8vIENhbiBzYWZlbHkgYXNzdW1lIG5vIG92ZXJmbG93LgotICAgICAgcmVzdWx0ID0gTG9uZy5wYXJzZUxvbmcobnVtYmVyVGV4dCwgcmFkaXgpOwotICAgICAgaWYgKG5lZ2F0aXZlKSB7Ci0gICAgICAgIHJlc3VsdCA9IC1yZXN1bHQ7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGJvdW5kcy4KLSAgICAgIC8vIE5vIG5lZWQgdG8gY2hlY2sgZm9yIDY0LWJpdCBudW1iZXJzIHNpbmNlIHRoZXknZCBoYXZlIHRvIGJlIDE2IGNoYXJzCi0gICAgICAvLyBvciBsb25nZXIgdG8gb3ZlcmZsb3cuCi0gICAgICBpZiAoIWlzTG9uZykgewotICAgICAgICBpZiAoaXNTaWduZWQpIHsKLSAgICAgICAgICBpZiAocmVzdWx0ID4gSW50ZWdlci5NQVhfVkFMVUUgfHwgcmVzdWx0IDwgSW50ZWdlci5NSU5fVkFMVUUpIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgaWYgKHJlc3VsdCA+PSAoMUwgPDwgMzIpIHx8IHJlc3VsdCA8IDApIHsKLSAgICAgICAgICAgIHRocm93IG5ldyBOdW1iZXJGb3JtYXRFeGNlcHRpb24oCi0gICAgICAgICAgICAgICJOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgdW5zaWduZWQgaW50ZWdlcjogIiArIHRleHQpOwotICAgICAgICAgIH0KLSAgICAgICAgfQotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICBCaWdJbnRlZ2VyIGJpZ1ZhbHVlID0gbmV3IEJpZ0ludGVnZXIobnVtYmVyVGV4dCwgcmFkaXgpOwotICAgICAgaWYgKG5lZ2F0aXZlKSB7Ci0gICAgICAgIGJpZ1ZhbHVlID0gYmlnVmFsdWUubmVnYXRlKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vIENoZWNrIGJvdW5kcy4KLSAgICAgIGlmICghaXNMb25nKSB7Ci0gICAgICAgIGlmIChpc1NpZ25lZCkgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDMxKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgMzItYml0IHNpZ25lZCBpbnRlZ2VyOiAiICsgdGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDMyKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgMzItYml0IHVuc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGlmIChpc1NpZ25lZCkgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDYzKSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgNjQtYml0IHNpZ25lZCBpbnRlZ2VyOiAiICsgdGV4dCk7Ci0gICAgICAgICAgfQotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGlmIChiaWdWYWx1ZS5iaXRMZW5ndGgoKSA+IDY0KSB7Ci0gICAgICAgICAgICB0aHJvdyBuZXcgTnVtYmVyRm9ybWF0RXhjZXB0aW9uKAotICAgICAgICAgICAgICAiTnVtYmVyIG91dCBvZiByYW5nZSBmb3IgNjQtYml0IHVuc2lnbmVkIGludGVnZXI6ICIgKyB0ZXh0KTsKLSAgICAgICAgICB9Ci0gICAgICAgIH0KLSAgICAgIH0KLQotICAgICAgcmVzdWx0ID0gYmlnVmFsdWUubG9uZ1ZhbHVlKCk7Ci0gICAgfQotCi0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1VuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODc0M2MxMi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24uamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk5ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLQotLyoqCi0gKiBUaHJvd24gd2hlbiBhdHRlbXB0aW5nIHRvIGJ1aWxkIGEgcHJvdG9jb2wgbWVzc2FnZSB0aGF0IGlzIG1pc3NpbmcgcmVxdWlyZWQKLSAqIGZpZWxkcy4gIFRoaXMgaXMgYSB7QGNvZGUgUnVudGltZUV4Y2VwdGlvbn0gYmVjYXVzZSBpdCBub3JtYWxseSByZXByZXNlbnRzCi0gKiBhIHByb2dyYW1taW5nIGVycm9yOiAgaXQgaGFwcGVucyB3aGVuIHNvbWUgY29kZSB3aGljaCBjb25zdHJ1Y3RzIGEgbWVzc2FnZQotICogZmFpbHMgdG8gc2V0IGFsbCB0aGUgZmllbGRzLiAge0Bjb2RlIHBhcnNlRnJvbSgpfSBtZXRob2RzIDxiPmRvIG5vdDwvYj4KLSAqIHRocm93IHRoaXM7IHRoZXkgdGhyb3cgYW4ge0BsaW5rIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0gaWYKLSAqIHJlcXVpcmVkIGZpZWxkcyBhcmUgbWlzc2luZywgYmVjYXVzZSBpdCBpcyBub3QgYSBwcm9ncmFtbWluZyBlcnJvciB0bwotICogcmVjZWl2ZSBhbiBpbmNvbXBsZXRlIG1lc3NhZ2UuICBJbiBvdGhlciB3b3JkcywKLSAqIHtAY29kZSBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbn0gc2hvdWxkIG5ldmVyIGJlIHRocm93biBieSBjb3JyZWN0Ci0gKiBjb2RlLCBidXQge0Bjb2RlIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbn0gbWlnaHQgYmUuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGV4dGVuZHMgUnVudGltZUV4Y2VwdGlvbiB7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGxvbmcgc2VyaWFsVmVyc2lvblVJRCA9IC03NDY2OTI5OTUzMzc0ODgzNTA3TDsKLQotICBwdWJsaWMgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oZmluYWwgTWVzc2FnZUxpdGUgbWVzc2FnZSkgewotICAgIHN1cGVyKCJNZXNzYWdlIHdhcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4gIChMaXRlIHJ1bnRpbWUgY291bGQgbm90ICIgKwotICAgICAgICAgICJkZXRlcm1pbmUgd2hpY2ggZmllbGRzIHdlcmUgbWlzc2luZykuIik7Ci0gICAgbWlzc2luZ0ZpZWxkcyA9IG51bGw7Ci0gIH0KLQotICBwdWJsaWMgVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oZmluYWwgTGlzdDxTdHJpbmc+IG1pc3NpbmdGaWVsZHMpIHsKLSAgICBzdXBlcihidWlsZERlc2NyaXB0aW9uKG1pc3NpbmdGaWVsZHMpKTsKLSAgICB0aGlzLm1pc3NpbmdGaWVsZHMgPSBtaXNzaW5nRmllbGRzOwotICB9Ci0KLSAgcHJpdmF0ZSBmaW5hbCBMaXN0PFN0cmluZz4gbWlzc2luZ0ZpZWxkczsKLQotICAvKioKLSAgICogR2V0IGEgbGlzdCBvZiBodW1hbi1yZWFkYWJsZSBuYW1lcyBvZiByZXF1aXJlZCBmaWVsZHMgbWlzc2luZyBmcm9tIHRoaXMKLSAgICogbWVzc2FnZS4gIEVhY2ggbmFtZSBpcyBhIGZ1bGwgcGF0aCB0byBhIGZpZWxkLCBlLmcuICJmb28uYmFyWzVdLmJheiIuCi0gICAqIFJldHVybnMgbnVsbCBpZiB0aGUgbGl0ZSBydW50aW1lIHdhcyB1c2VkLCBzaW5jZSBpdCBsYWNrcyB0aGUgYWJpbGl0eSB0bwotICAgKiBmaW5kIG1pc3NpbmcgZmllbGRzLgotICAgKi8KLSAgcHVibGljIExpc3Q8U3RyaW5nPiBnZXRNaXNzaW5nRmllbGRzKCkgewotICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KG1pc3NpbmdGaWVsZHMpOwotICB9Ci0KLSAgLyoqCi0gICAqIENvbnZlcnRzIHRoaXMgZXhjZXB0aW9uIHRvIGFuIHtAbGluayBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb259LgotICAgKiBXaGVuIGEgcGFyc2VkIG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHMsIHRoaXMgc2hvdWxkIGJlIHRocm93bgotICAgKiBpbnN0ZWFkIG9mIHtAY29kZSBVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbn0uCi0gICAqLwotICBwdWJsaWMgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGFzSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKCkgewotICAgIHJldHVybiBuZXcgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKGdldE1lc3NhZ2UoKSk7Ci0gIH0KLQotICAvKiogQ29uc3RydWN0IHRoZSBkZXNjcmlwdGlvbiBzdHJpbmcgZm9yIHRoaXMgZXhjZXB0aW9uLiAqLwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYnVpbGREZXNjcmlwdGlvbihmaW5hbCBMaXN0PFN0cmluZz4gbWlzc2luZ0ZpZWxkcykgewotICAgIGZpbmFsIFN0cmluZ0J1aWxkZXIgZGVzY3JpcHRpb24gPQotICAgICAgbmV3IFN0cmluZ0J1aWxkZXIoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIpOwotICAgIGJvb2xlYW4gZmlyc3QgPSB0cnVlOwotICAgIGZvciAoZmluYWwgU3RyaW5nIGZpZWxkIDogbWlzc2luZ0ZpZWxkcykgewotICAgICAgaWYgKGZpcnN0KSB7Ci0gICAgICAgIGZpcnN0ID0gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBkZXNjcmlwdGlvbi5hcHBlbmQoIiwgIik7Ci0gICAgICB9Ci0gICAgICBkZXNjcmlwdGlvbi5hcHBlbmQoZmllbGQpOwotICAgIH0KLSAgICByZXR1cm4gZGVzY3JpcHRpb24udG9TdHJpbmcoKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyNmExNWQwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXQuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDk1MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0TWVzc2FnZUxpdGUuQnVpbGRlci5MaW1pdGVkSW5wdXRTdHJlYW07Ci0KLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uSW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5Db2xsZWN0aW9uczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5UcmVlTWFwOwotCi0vKioKLSAqIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGlzIHVzZWQgdG8ga2VlcCB0cmFjayBvZiBmaWVsZHMgd2hpY2ggd2VyZSBzZWVuIHdoZW4KLSAqIHBhcnNpbmcgYSBwcm90b2NvbCBtZXNzYWdlIGJ1dCB3aG9zZSBmaWVsZCBudW1iZXJzIG9yIHR5cGVzIGFyZSB1bnJlY29nbml6ZWQuCi0gKiBUaGlzIG1vc3QgZnJlcXVlbnRseSBvY2N1cnMgd2hlbiBuZXcgZmllbGRzIGFyZSBhZGRlZCB0byBhIG1lc3NhZ2UgdHlwZQotICogYW5kIHRoZW4gbWVzc2FnZXMgY29udGFpbmluZyB0aG9zZSBmZWlsZHMgYXJlIHJlYWQgYnkgb2xkIHNvZnR3YXJlIHRoYXQgd2FzCi0gKiBjb21waWxlZCBiZWZvcmUgdGhlIG5ldyB0eXBlcyB3ZXJlIGFkZGVkLgotICoKLSAqIDxwPkV2ZXJ5IHtAbGluayBNZXNzYWdlfSBjb250YWlucyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSAoYW5kIGV2ZXJ5Ci0gKiB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfSBjb250YWlucyBhbiB7QGxpbmsgQnVpbGRlcn0pLgotICoKLSAqIDxwPk1vc3QgdXNlcnMgd2lsbCBuZXZlciBuZWVkIHRvIHVzZSB0aGlzIGNsYXNzLgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBVbmtub3duRmllbGRTZXQgaW1wbGVtZW50cyBNZXNzYWdlTGl0ZSB7Ci0gIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0KCkge30KLQotICAvKiogQ3JlYXRlIGEgbmV3IHtAbGluayBCdWlsZGVyfS4gKi8KLSAgcHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7Ci0gICAgcmV0dXJuIEJ1aWxkZXIuY3JlYXRlKCk7Ci0gIH0KLQotICAvKioKLSAgICogQ3JlYXRlIGEgbmV3IHtAbGluayBCdWlsZGVyfSBhbmQgaW5pdGlhbGl6ZSBpdCB0byBiZSBhIGNvcHkKLSAgICogb2Yge0Bjb2RlIGNvcHlGcm9tfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKGZpbmFsIFVua25vd25GaWVsZFNldCBjb3B5RnJvbSkgewotICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGNvcHlGcm9tKTsKLSAgfQotCi0gIC8qKiBHZXQgYW4gZW1wdHkge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICovCi0gIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IGdldERlZmF1bHRJbnN0YW5jZSgpIHsKLSAgICByZXR1cm4gZGVmYXVsdEluc3RhbmNlOwotICB9Ci0gIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gZGVmYXVsdEluc3RhbmNlOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFVua25vd25GaWVsZFNldCBkZWZhdWx0SW5zdGFuY2UgPQotICAgIG5ldyBVbmtub3duRmllbGRTZXQoQ29sbGVjdGlvbnMuPEludGVnZXIsIEZpZWxkPmVtcHR5TWFwKCkpOwotCi0gIC8qKgotICAgKiBDb25zdHJ1Y3QgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gYXJvdW5kIHRoZSBnaXZlbiBtYXAuICBUaGUgbWFwIGlzCi0gICAqIGV4cGVjdGVkIHRvIGJlIGltbXV0YWJsZS4KLSAgICovCi0gIHByaXZhdGUgVW5rbm93bkZpZWxkU2V0KGZpbmFsIE1hcDxJbnRlZ2VyLCBGaWVsZD4gZmllbGRzKSB7Ci0gICAgdGhpcy5maWVsZHMgPSBmaWVsZHM7Ci0gIH0KLSAgcHJpdmF0ZSBNYXA8SW50ZWdlciwgRmllbGQ+IGZpZWxkczsKLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIE9iamVjdCBvdGhlcikgewotICAgIGlmICh0aGlzID09IG90aGVyKSB7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0gICAgcmV0dXJuIChvdGhlciBpbnN0YW5jZW9mIFVua25vd25GaWVsZFNldCkgJiYKLSAgICAgICAgICAgZmllbGRzLmVxdWFscygoKFVua25vd25GaWVsZFNldCkgb3RoZXIpLmZpZWxkcyk7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIGludCBoYXNoQ29kZSgpIHsKLSAgICByZXR1cm4gZmllbGRzLmhhc2hDb2RlKCk7Ci0gIH0KLQotICAvKiogR2V0IGEgbWFwIG9mIGZpZWxkcyBpbiB0aGUgc2V0IGJ5IG51bWJlci4gKi8KLSAgcHVibGljIE1hcDxJbnRlZ2VyLCBGaWVsZD4gYXNNYXAoKSB7Ci0gICAgcmV0dXJuIGZpZWxkczsKLSAgfQotCi0gIC8qKiBDaGVjayBpZiB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIGlzIHByZXNlbnQgaW4gdGhlIHNldC4gKi8KLSAgcHVibGljIGJvb2xlYW4gaGFzRmllbGQoZmluYWwgaW50IG51bWJlcikgewotICAgIHJldHVybiBmaWVsZHMuY29udGFpbnNLZXkobnVtYmVyKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSBmaWVsZCBieSBudW1iZXIuICBSZXR1cm5zIGFuIGVtcHR5IGZpZWxkIGlmIG5vdCBwcmVzZW50LiAgTmV2ZXIKLSAgICogcmV0dXJucyB7QGNvZGUgbnVsbH0uCi0gICAqLwotICBwdWJsaWMgRmllbGQgZ2V0RmllbGQoZmluYWwgaW50IG51bWJlcikgewotICAgIGZpbmFsIEZpZWxkIHJlc3VsdCA9IGZpZWxkcy5nZXQobnVtYmVyKTsKLSAgICByZXR1cm4gKHJlc3VsdCA9PSBudWxsKSA/IEZpZWxkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogcmVzdWx0OwotICB9Ci0KLSAgLyoqIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAqLwotICBwdWJsaWMgdm9pZCB3cml0ZVRvKGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgZW50cnkuZ2V0VmFsdWUoKS53cml0ZVRvKGVudHJ5LmdldEtleSgpLCBvdXRwdXQpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBDb252ZXJ0cyB0aGUgc2V0IHRvIGEgc3RyaW5nIGluIHByb3RvY29sIGJ1ZmZlciB0ZXh0IGZvcm1hdC4gVGhpcyBpcwotICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZAotICAgKiB7QGxpbmsgVGV4dEZvcm1hdCNwcmludFRvU3RyaW5nKFVua25vd25GaWVsZFNldCl9LgotICAgKi8KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBTdHJpbmcgdG9TdHJpbmcoKSB7Ci0gICAgcmV0dXJuIFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyh0aGlzKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEge0Bjb2RlIEJ5dGVTdHJpbmd9IGFuZCByZXR1cm5zIGl0LiBUaGlzIGlzCi0gICAqIGp1c3QgYSB0cml2aWFsIHdyYXBwZXIgYXJvdW5kIHtAbGluayAjd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSl9LgotICAgKi8KLSAgcHVibGljIEJ5dGVTdHJpbmcgdG9CeXRlU3RyaW5nKCkgewotICAgIHRyeSB7Ci0gICAgICBmaW5hbCBCeXRlU3RyaW5nLkNvZGVkQnVpbGRlciBvdXQgPQotICAgICAgICBCeXRlU3RyaW5nLm5ld0NvZGVkQnVpbGRlcihnZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICAgIHdyaXRlVG8ob3V0LmdldENvZGVkT3V0cHV0KCkpOwotICAgICAgcmV0dXJuIG91dC5idWlsZCgpOwotICAgIH0gY2F0Y2ggKGZpbmFsIElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiU2VyaWFsaXppbmcgdG8gYSBCeXRlU3RyaW5nIHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCi0gICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHRvIGEge0Bjb2RlIGJ5dGV9IGFycmF5IGFuZCByZXR1cm5zIGl0LiAgVGhpcyBpcwotICAgKiBqdXN0IGEgdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KLSAgICovCi0gIHB1YmxpYyBieXRlW10gdG9CeXRlQXJyYXkoKSB7Ci0gICAgdHJ5IHsKLSAgICAgIGZpbmFsIGJ5dGVbXSByZXN1bHQgPSBuZXcgYnl0ZVtnZXRTZXJpYWxpemVkU2l6ZSgpXTsKLSAgICAgIGZpbmFsIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJlc3VsdCk7Ci0gICAgICB3cml0ZVRvKG91dHB1dCk7Ci0gICAgICBvdXRwdXQuY2hlY2tOb1NwYWNlTGVmdCgpOwotICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICB9IGNhdGNoIChmaW5hbCBJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgIlNlcmlhbGl6aW5nIHRvIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAiICsKLSAgICAgICAgIihzaG91bGQgbmV2ZXIgaGFwcGVuKS4iLCBlKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogU2VyaWFsaXplcyB0aGUgbWVzc2FnZSBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9LiAgVGhpcyBpcyBqdXN0IGEKLSAgICogdHJpdmlhbCB3cmFwcGVyIGFyb3VuZCB7QGxpbmsgI3dyaXRlVG8oQ29kZWRPdXRwdXRTdHJlYW0pfS4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dCk7Ci0gICAgd3JpdGVUbyhjb2RlZE91dHB1dCk7Ci0gICAgY29kZWRPdXRwdXQuZmx1c2goKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHdyaXRlRGVsaW1pdGVkVG8oT3V0cHV0U3RyZWFtIG91dHB1dCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dCk7Ci0gICAgY29kZWRPdXRwdXQud3JpdGVSYXdWYXJpbnQzMihnZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgICB3cml0ZVRvKGNvZGVkT3V0cHV0KTsKLSAgICBjb2RlZE91dHB1dC5mbHVzaCgpOwotICB9Ci0KLSAgLyoqIEdldCB0aGUgbnVtYmVyIG9mIGJ5dGVzIHJlcXVpcmVkIHRvIGVuY29kZSB0aGlzIHNldC4gKi8KLSAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZSgpIHsKLSAgICBpbnQgcmVzdWx0ID0gMDsKLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgcmVzdWx0ICs9IGVudHJ5LmdldFZhbHVlKCkuZ2V0U2VyaWFsaXplZFNpemUoZW50cnkuZ2V0S2V5KCkpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgLyoqCi0gICAqIFNlcmlhbGl6ZXMgdGhlIHNldCBhbmQgd3JpdGVzIGl0IHRvIHtAY29kZSBvdXRwdXR9IHVzaW5nCi0gICAqIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHdyaXRlQXNNZXNzYWdlU2V0VG8oZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBmaWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgZW50cnkuZ2V0VmFsdWUoKS53cml0ZUFzTWVzc2FnZVNldEV4dGVuc2lvblRvKAotICAgICAgICBlbnRyeS5nZXRLZXkoKSwgb3V0cHV0KTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgc2V0IHVzaW5nCi0gICAqIHtAY29kZSBNZXNzYWdlU2V0fSB3aXJlIGZvcm1hdC4KLSAgICovCi0gIHB1YmxpYyBpbnQgZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKSB7Ci0gICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgZm9yIChmaW5hbCBNYXAuRW50cnk8SW50ZWdlciwgRmllbGQ+IGVudHJ5IDogZmllbGRzLmVudHJ5U2V0KCkpIHsKLSAgICAgIHJlc3VsdCArPSBlbnRyeS5nZXRWYWx1ZSgpLmdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0RXh0ZW5zaW9uKAotICAgICAgICBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgfQotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLQotICBwdWJsaWMgYm9vbGVhbiBpc0luaXRpYWxpemVkKCkgewotICAgIC8vIFVua25vd25GaWVsZFNldHMgZG8gbm90IGhhdmUgcmVxdWlyZWQgZmllbGRzLCBzbyB0aGV5IGFyZSBhbHdheXMKLSAgICAvLyBpbml0aWFsaXplZC4KLSAgICByZXR1cm4gdHJ1ZTsKLSAgfQotCi0gIC8qKiBQYXJzZSBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0uICovCi0gIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShpbnB1dCkuYnVpbGQoKTsKLSAgfQotCi0gIC8qKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gYW5kIHJldHVybiBpdC4gKi8KLSAgcHVibGljIHN0YXRpYyBVbmtub3duRmllbGRTZXQgcGFyc2VGcm9tKGZpbmFsIEJ5dGVTdHJpbmcgZGF0YSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkKCk7Ci0gIH0KLQotICAvKiogUGFyc2Uge0Bjb2RlIGRhdGF9IGFzIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGFuZCByZXR1cm4gaXQuICovCi0gIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBieXRlW10gZGF0YSkKLSAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGRhdGEpLmJ1aWxkKCk7Ci0gIH0KLQotICAvKiogUGFyc2UgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gZnJvbSB7QGNvZGUgaW5wdXR9IGFuZCByZXR1cm4gaXQuICovCi0gIHB1YmxpYyBzdGF0aWMgVW5rbm93bkZpZWxkU2V0IHBhcnNlRnJvbShmaW5hbCBJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkKCk7Ci0gIH0KLQotICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpIHsKLSAgICByZXR1cm4gbmV3QnVpbGRlcigpOwotICB9Ci0KLSAgcHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgewotICAgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKHRoaXMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEJ1aWxkZXIgZm9yIHtAbGluayBVbmtub3duRmllbGRTZXR9cy4KLSAgICoKLSAgICogPHA+Tm90ZSB0aGF0IHRoaXMgY2xhc3MgbWFpbnRhaW5zIHtAbGluayBGaWVsZC5CdWlsZGVyfXMgZm9yIGFsbCBmaWVsZHMKLSAgICogaW4gdGhlIHNldC4gIFRodXMsIGFkZGluZyBvbmUgZWxlbWVudCB0byBhbiBleGlzdGluZyB7QGxpbmsgRmllbGR9IGRvZXMgbm90Ci0gICAqIHJlcXVpcmUgbWFraW5nIGEgY29weS4gIFRoaXMgaXMgaW1wb3J0YW50IGZvciBlZmZpY2llbnQgcGFyc2luZyBvZgotICAgKiB1bmtub3duIHJlcGVhdGVkIGZpZWxkcy4gIEhvd2V2ZXIsIGl0IGltcGxpZXMgdGhhdCB7QGxpbmsgRmllbGR9cyBjYW5ub3QKLSAgICogYmUgY29uc3RydWN0ZWQgaW5kZXBlbmRlbnRseSwgbm9yIGNhbiB0d28ge0BsaW5rIFVua25vd25GaWVsZFNldH1zIHNoYXJlCi0gICAqIHRoZSBzYW1lIHtAY29kZSBGaWVsZH0gb2JqZWN0LgotICAgKgotICAgKiA8cD5Vc2Uge0BsaW5rIFVua25vd25GaWVsZFNldCNuZXdCdWlsZGVyKCl9IHRvIGNvbnN0cnVjdCBhIHtAY29kZSBCdWlsZGVyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBpbXBsZW1lbnRzIE1lc3NhZ2VMaXRlLkJ1aWxkZXIgewotICAgIC8vIFRoaXMgY29uc3RydWN0b3Igc2hvdWxkIG5ldmVyIGJlIGNhbGxlZCBkaXJlY3RseSAoZXhjZXB0IGZyb20gJ2NyZWF0ZScpLgotICAgIHByaXZhdGUgQnVpbGRlcigpIHt9Ci0KLSAgICBwcml2YXRlIE1hcDxJbnRlZ2VyLCBGaWVsZD4gZmllbGRzOwotCi0gICAgLy8gT3B0aW1pemF0aW9uOiAgV2Uga2VlcCBhcm91bmQgYSBidWlsZGVyIGZvciB0aGUgbGFzdCBmaWVsZCB0aGF0IHdhcwotICAgIC8vICAgbW9kaWZpZWQgc28gdGhhdCB3ZSBjYW4gZWZmaWNpZW50bHkgYWRkIHRvIGl0IG11bHRpcGxlIHRpbWVzIGluIGEKLSAgICAvLyAgIHJvdyAoaW1wb3J0YW50IHdoZW4gcGFyc2luZyBhbiB1bmtub3duIHJlcGVhdGVkIGZpZWxkKS4KLSAgICBwcml2YXRlIGludCBsYXN0RmllbGROdW1iZXI7Ci0gICAgcHJpdmF0ZSBGaWVsZC5CdWlsZGVyIGxhc3RGaWVsZDsKLQotICAgIHByaXZhdGUgc3RhdGljIEJ1aWxkZXIgY3JlYXRlKCkgewotICAgICAgQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKLSAgICAgIGJ1aWxkZXIucmVpbml0aWFsaXplKCk7Ci0gICAgICByZXR1cm4gYnVpbGRlcjsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYSBmaWVsZCBidWlsZGVyIGZvciB0aGUgZ2l2ZW4gZmllbGQgbnVtYmVyIHdoaWNoIGluY2x1ZGVzIGFueQotICAgICAqIHZhbHVlcyB0aGF0IGFscmVhZHkgZXhpc3QuCi0gICAgICovCi0gICAgcHJpdmF0ZSBGaWVsZC5CdWlsZGVyIGdldEZpZWxkQnVpbGRlcihmaW5hbCBpbnQgbnVtYmVyKSB7Ci0gICAgICBpZiAobGFzdEZpZWxkICE9IG51bGwpIHsKLSAgICAgICAgaWYgKG51bWJlciA9PSBsYXN0RmllbGROdW1iZXIpIHsKLSAgICAgICAgICByZXR1cm4gbGFzdEZpZWxkOwotICAgICAgICB9Ci0gICAgICAgIC8vIE5vdGU6ICBhZGRGaWVsZCgpIHdpbGwgcmVzZXQgbGFzdEZpZWxkIGFuZCBsYXN0RmllbGROdW1iZXIuCi0gICAgICAgIGFkZEZpZWxkKGxhc3RGaWVsZE51bWJlciwgbGFzdEZpZWxkLmJ1aWxkKCkpOwotICAgICAgfQotICAgICAgaWYgKG51bWJlciA9PSAwKSB7Ci0gICAgICAgIHJldHVybiBudWxsOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgZmluYWwgRmllbGQgZXhpc3RpbmcgPSBmaWVsZHMuZ2V0KG51bWJlcik7Ci0gICAgICAgIGxhc3RGaWVsZE51bWJlciA9IG51bWJlcjsKLSAgICAgICAgbGFzdEZpZWxkID0gRmllbGQubmV3QnVpbGRlcigpOwotICAgICAgICBpZiAoZXhpc3RpbmcgIT0gbnVsbCkgewotICAgICAgICAgIGxhc3RGaWVsZC5tZXJnZUZyb20oZXhpc3RpbmcpOwotICAgICAgICB9Ci0gICAgICAgIHJldHVybiBsYXN0RmllbGQ7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQnVpbGQgdGhlIHtAbGluayBVbmtub3duRmllbGRTZXR9IGFuZCByZXR1cm4gaXQuCi0gICAgICoKLSAgICAgKiA8cD5PbmNlIHtAY29kZSBidWlsZCgpfSBoYXMgYmVlbiBjYWxsZWQsIHRoZSB7QGNvZGUgQnVpbGRlcn0gd2lsbCBubwotICAgICAqIGxvbmdlciBiZSB1c2FibGUuICBDYWxsaW5nIGFueSBtZXRob2QgYWZ0ZXIge0Bjb2RlIGJ1aWxkKCl9IHdpbGwgcmVzdWx0Ci0gICAgICogaW4gdW5kZWZpbmVkIGJlaGF2aW9yIGFuZCBjYW4gY2F1c2UgYSB7QGNvZGUgTnVsbFBvaW50ZXJFeGNlcHRpb259IHRvIGJlCi0gICAgICogdGhyb3duLgotICAgICAqLwotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgYnVpbGQoKSB7Ci0gICAgICBnZXRGaWVsZEJ1aWxkZXIoMCk7ICAvLyBGb3JjZSBsYXN0RmllbGQgdG8gYmUgYnVpbHQuCi0gICAgICBmaW5hbCBVbmtub3duRmllbGRTZXQgcmVzdWx0OwotICAgICAgaWYgKGZpZWxkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgcmVzdWx0ID0gZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXN1bHQgPSBuZXcgVW5rbm93bkZpZWxkU2V0KENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZU1hcChmaWVsZHMpKTsKLSAgICAgIH0KLSAgICAgIGZpZWxkcyA9IG51bGw7Ci0gICAgICByZXR1cm4gcmVzdWx0OwotICAgIH0KLQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgYnVpbGRQYXJ0aWFsKCkgewotICAgICAgLy8gTm8gcmVxdWlyZWQgZmllbGRzLCBzbyB0aGlzIGlzIHRoZSBzYW1lIGFzIGJ1aWxkKCkuCi0gICAgICByZXR1cm4gYnVpbGQoKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgQnVpbGRlciBjbG9uZSgpIHsKLSAgICAgIGdldEZpZWxkQnVpbGRlcigwKTsgIC8vIEZvcmNlIGxhc3RGaWVsZCB0byBiZSBidWlsdC4KLSAgICAgIHJldHVybiBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpLm1lcmdlRnJvbSgKLSAgICAgICAgICBuZXcgVW5rbm93bkZpZWxkU2V0KGZpZWxkcykpOwotICAgIH0KLQotICAgIHB1YmxpYyBVbmtub3duRmllbGRTZXQgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBVbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSB2b2lkIHJlaW5pdGlhbGl6ZSgpIHsKLSAgICAgIGZpZWxkcyA9IENvbGxlY3Rpb25zLmVtcHR5TWFwKCk7Ci0gICAgICBsYXN0RmllbGROdW1iZXIgPSAwOwotICAgICAgbGFzdEZpZWxkID0gbnVsbDsKLSAgICB9Ci0KLSAgICAvKiogUmVzZXQgdGhlIGJ1aWxkZXIgdG8gYW4gZW1wdHkgc2V0LiAqLwotICAgIHB1YmxpYyBCdWlsZGVyIGNsZWFyKCkgewotICAgICAgcmVpbml0aWFsaXplKCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBNZXJnZSB0aGUgZmllbGRzIGZyb20ge0Bjb2RlIG90aGVyfSBpbnRvIHRoaXMgc2V0LiAgSWYgYSBmaWVsZCBudW1iZXIKLSAgICAgKiBleGlzdHMgaW4gYm90aCBzZXRzLCB7QGNvZGUgb3RoZXJ9J3MgdmFsdWVzIGZvciB0aGF0IGZpZWxkIHdpbGwgYmUKLSAgICAgKiBhcHBlbmRlZCB0byB0aGUgdmFsdWVzIGluIHRoaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBVbmtub3duRmllbGRTZXQgb3RoZXIpIHsKLSAgICAgIGlmIChvdGhlciAhPSBnZXREZWZhdWx0SW5zdGFuY2UoKSkgewotICAgICAgICBmb3IgKGZpbmFsIE1hcC5FbnRyeTxJbnRlZ2VyLCBGaWVsZD4gZW50cnkgOiBvdGhlci5maWVsZHMuZW50cnlTZXQoKSkgewotICAgICAgICAgIG1lcmdlRmllbGQoZW50cnkuZ2V0S2V5KCksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBBZGQgYSBmaWVsZCB0byB0aGUge0Bjb2RlIFVua25vd25GaWVsZFNldH0uICBJZiBhIGZpZWxkIHdpdGggdGhlIHNhbWUKLSAgICAgKiBudW1iZXIgYWxyZWFkeSBleGlzdHMsIHRoZSB0d28gYXJlIG1lcmdlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZpZWxkKGZpbmFsIGludCBudW1iZXIsIGZpbmFsIEZpZWxkIGZpZWxkKSB7Ci0gICAgICBpZiAobnVtYmVyID09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7Ci0gICAgICB9Ci0gICAgICBpZiAoaGFzRmllbGQobnVtYmVyKSkgewotICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5tZXJnZUZyb20oZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gT3B0aW1pemF0aW9uOiAgV2UgY291bGQgY2FsbCBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5tZXJnZUZyb20oZmllbGQpCi0gICAgICAgIC8vIGluIHRoaXMgY2FzZSwgYnV0IHRoYXQgd291bGQgY3JlYXRlIGEgY29weSBvZiB0aGUgRmllbGQgb2JqZWN0LgotICAgICAgICAvLyBXZSdkIHJhdGhlciByZXVzZSB0aGUgb25lIHBhc3NlZCB0byB1cywgc28gY2FsbCBhZGRGaWVsZCgpIGluc3RlYWQuCi0gICAgICAgIGFkZEZpZWxkKG51bWJlciwgZmllbGQpOwotICAgICAgfQotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29udmVuaWVuY2UgbWV0aG9kIGZvciBtZXJnaW5nIGEgbmV3IGZpZWxkIGNvbnRhaW5pbmcgYSBzaW5nbGUgdmFyaW50Ci0gICAgICogdmFsdWUuICBUaGlzIGlzIHVzZWQgaW4gcGFydGljdWxhciB3aGVuIGFuIHVua25vd24gZW51bSB2YWx1ZSBpcwotICAgICAqIGVuY291bnRlcmVkLgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlVmFyaW50RmllbGQoZmluYWwgaW50IG51bWJlciwgZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgICBpZiAobnVtYmVyID09IDApIHsKLSAgICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigiWmVybyBpcyBub3QgYSB2YWxpZCBmaWVsZCBudW1iZXIuIik7Ci0gICAgICB9Ci0gICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRWYXJpbnQodmFsdWUpOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgLyoqIENoZWNrIGlmIHRoZSBnaXZlbiBmaWVsZCBudW1iZXIgaXMgcHJlc2VudCBpbiB0aGUgc2V0LiAqLwotICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKGZpbmFsIGludCBudW1iZXIpIHsKLSAgICAgIGlmIChudW1iZXIgPT0gMCkgewotICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKCJaZXJvIGlzIG5vdCBhIHZhbGlkIGZpZWxkIG51bWJlci4iKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiBudW1iZXIgPT0gbGFzdEZpZWxkTnVtYmVyIHx8IGZpZWxkcy5jb250YWluc0tleShudW1iZXIpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIEFkZCBhIGZpZWxkIHRvIHRoZSB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fS4gIElmIGEgZmllbGQgd2l0aCB0aGUgc2FtZQotICAgICAqIG51bWJlciBhbHJlYWR5IGV4aXN0cywgaXQgaXMgcmVtb3ZlZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlciBhZGRGaWVsZChmaW5hbCBpbnQgbnVtYmVyLCBmaW5hbCBGaWVsZCBmaWVsZCkgewotICAgICAgaWYgKG51bWJlciA9PSAwKSB7Ci0gICAgICAgIHRocm93IG5ldyBJbGxlZ2FsQXJndW1lbnRFeGNlcHRpb24oIlplcm8gaXMgbm90IGEgdmFsaWQgZmllbGQgbnVtYmVyLiIpOwotICAgICAgfQotICAgICAgaWYgKGxhc3RGaWVsZCAhPSBudWxsICYmIGxhc3RGaWVsZE51bWJlciA9PSBudW1iZXIpIHsKLSAgICAgICAgLy8gRGlzY2FyZCB0aGlzLgotICAgICAgICBsYXN0RmllbGQgPSBudWxsOwotICAgICAgICBsYXN0RmllbGROdW1iZXIgPSAwOwotICAgICAgfQotICAgICAgaWYgKGZpZWxkcy5pc0VtcHR5KCkpIHsKLSAgICAgICAgZmllbGRzID0gbmV3IFRyZWVNYXA8SW50ZWdlcixGaWVsZD4oKTsKLSAgICAgIH0KLSAgICAgIGZpZWxkcy5wdXQobnVtYmVyLCBmaWVsZCk7Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgYWxsIHByZXNlbnQge0Bjb2RlIEZpZWxkfXMgYXMgYW4gaW1tdXRhYmxlIHtAY29kZSBNYXB9LiAgSWYgbW9yZQotICAgICAqIGZpZWxkcyBhcmUgYWRkZWQsIHRoZSBjaGFuZ2VzIG1heSBvciBtYXkgbm90IGJlIHJlZmxlY3RlZCBpbiB0aGlzIG1hcC4KLSAgICAgKi8KLSAgICBwdWJsaWMgTWFwPEludGVnZXIsIEZpZWxkPiBhc01hcCgpIHsKLSAgICAgIGdldEZpZWxkQnVpbGRlcigwKTsgIC8vIEZvcmNlIGxhc3RGaWVsZCB0byBiZSBidWlsdC4KLSAgICAgIHJldHVybiBDb2xsZWN0aW9ucy51bm1vZGlmaWFibGVNYXAoZmllbGRzKTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhbiBlbnRpcmUgbWVzc2FnZSBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0cyBmaWVsZHMgaW50bwotICAgICAqIHRoaXMgc2V0LgotICAgICAqLwotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbShmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0KSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgd2hpbGUgKHRydWUpIHsKLSAgICAgICAgZmluYWwgaW50IHRhZyA9IGlucHV0LnJlYWRUYWcoKTsKLSAgICAgICAgaWYgKHRhZyA9PSAwIHx8ICFtZXJnZUZpZWxkRnJvbSh0YWcsIGlucHV0KSkgewotICAgICAgICAgIGJyZWFrOwotICAgICAgICB9Ci0gICAgICB9Ci0gICAgICByZXR1cm4gdGhpczsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSBhIHNpbmdsZSBmaWVsZCBmcm9tIHtAY29kZSBpbnB1dH0gYW5kIG1lcmdlIGl0IGludG8gdGhpcyBzZXQuCi0gICAgICogQHBhcmFtIHRhZyBUaGUgZmllbGQncyB0YWcgbnVtYmVyLCB3aGljaCB3YXMgYWxyZWFkeSBwYXJzZWQuCi0gICAgICogQHJldHVybiB7QGNvZGUgZmFsc2V9IGlmIHRoZSB0YWcgaXMgYW4gZW5ncm91cCB0YWcuCi0gICAgICovCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VGaWVsZEZyb20oZmluYWwgaW50IHRhZywgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IG51bWJlciA9IFdpcmVGb3JtYXQuZ2V0VGFnRmllbGROdW1iZXIodGFnKTsKLSAgICAgIHN3aXRjaCAoV2lyZUZvcm1hdC5nZXRUYWdXaXJlVHlwZSh0YWcpKSB7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9WQVJJTlQ6Ci0gICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkVmFyaW50KGlucHV0LnJlYWRJbnQ2NCgpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0ZJWEVENjQ6Ci0gICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkRml4ZWQ2NChpbnB1dC5yZWFkRml4ZWQ2NCgpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICAgICAgZ2V0RmllbGRCdWlsZGVyKG51bWJlcikuYWRkTGVuZ3RoRGVsaW1pdGVkKGlucHV0LnJlYWRCeXRlcygpKTsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgICAgY2FzZSBXaXJlRm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQOgotICAgICAgICAgIGZpbmFsIEJ1aWxkZXIgc3ViQnVpbGRlciA9IG5ld0J1aWxkZXIoKTsKLSAgICAgICAgICBpbnB1dC5yZWFkR3JvdXAobnVtYmVyLCBzdWJCdWlsZGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25SZWdpc3RyeS5nZXRFbXB0eVJlZ2lzdHJ5KCkpOwotICAgICAgICAgIGdldEZpZWxkQnVpbGRlcihudW1iZXIpLmFkZEdyb3VwKHN1YkJ1aWxkZXIuYnVpbGQoKSk7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICAgIGNhc2UgV2lyZUZvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVA6Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICBjYXNlIFdpcmVGb3JtYXQuV0lSRVRZUEVfRklYRUQzMjoKLSAgICAgICAgICBnZXRGaWVsZEJ1aWxkZXIobnVtYmVyKS5hZGRGaXhlZDMyKGlucHV0LnJlYWRGaXhlZDMyKCkpOwotICAgICAgICAgIHJldHVybiB0cnVlOwotICAgICAgICBkZWZhdWx0OgotICAgICAgICAgIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkV2lyZVR5cGUoKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBQYXJzZSB7QGNvZGUgZGF0YX0gYXMgYW4ge0Bjb2RlIFVua25vd25GaWVsZFNldH0gYW5kIG1lcmdlIGl0IHdpdGggdGhlCi0gICAgICogc2V0IGJlaW5nIGJ1aWx0LiAgVGhpcyBpcyBqdXN0IGEgc21hbGwgd3JhcHBlciBhcm91bmQKLSAgICAgKiB7QGxpbmsgI21lcmdlRnJvbShDb2RlZElucHV0U3RyZWFtKX0uCi0gICAgICovCi0gICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGZpbmFsIEJ5dGVTdHJpbmcgZGF0YSkKLSAgICAgICAgdGhyb3dzIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7Ci0gICAgICB0cnkgewotICAgICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gZGF0YS5uZXdDb2RlZElucHV0KCk7Ci0gICAgICAgIG1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9IGNhdGNoIChmaW5hbCBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgQnl0ZVN0cmluZyB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKwotICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIHtAY29kZSBkYXRhfSBhcyBhbiB7QGNvZGUgVW5rbm93bkZpZWxkU2V0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBzZXQgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgYnl0ZVtdIGRhdGEpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7Ci0gICAgICAgIG1lcmdlRnJvbShpbnB1dCk7Ci0gICAgICAgIGlucHV0LmNoZWNrTGFzdFRhZ1dhcygwKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9IGNhdGNoIChmaW5hbCBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBlOwotICAgICAgfSBjYXRjaCAoZmluYWwgSU9FeGNlcHRpb24gZSkgewotICAgICAgICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbigKLSAgICAgICAgICAiUmVhZGluZyBmcm9tIGEgYnl0ZSBhcnJheSB0aHJldyBhbiBJT0V4Y2VwdGlvbiAoc2hvdWxkICIgKwotICAgICAgICAgICJuZXZlciBoYXBwZW4pLiIsIGUpOwotICAgICAgfQotICAgIH0KLQotICAgIC8qKgotICAgICAqIFBhcnNlIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9IGZyb20ge0Bjb2RlIGlucHV0fSBhbmQgbWVyZ2UgaXQgd2l0aCB0aGUKLSAgICAgKiBzZXQgYmVpbmcgYnVpbHQuICBUaGlzIGlzIGp1c3QgYSBzbWFsbCB3cmFwcGVyIGFyb3VuZAotICAgICAqIHtAbGluayAjbWVyZ2VGcm9tKENvZGVkSW5wdXRTdHJlYW0pfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oZmluYWwgSW5wdXRTdHJlYW0gaW5wdXQpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICBmaW5hbCBDb2RlZElucHV0U3RyZWFtIGNvZGVkSW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGlucHV0KTsKLSAgICAgIG1lcmdlRnJvbShjb2RlZElucHV0KTsKLSAgICAgIGNvZGVkSW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgfQotCi0gICAgcHVibGljIGJvb2xlYW4gbWVyZ2VEZWxpbWl0ZWRGcm9tKElucHV0U3RyZWFtIGlucHV0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZmluYWwgaW50IGZpcnN0Qnl0ZSA9IGlucHV0LnJlYWQoKTsKLSAgICAgIGlmIChmaXJzdEJ5dGUgPT0gLTEpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgZmluYWwgaW50IHNpemUgPSBDb2RlZElucHV0U3RyZWFtLnJlYWRSYXdWYXJpbnQzMihmaXJzdEJ5dGUsIGlucHV0KTsKLSAgICAgIGZpbmFsIElucHV0U3RyZWFtIGxpbWl0ZWRJbnB1dCA9IG5ldyBMaW1pdGVkSW5wdXRTdHJlYW0oaW5wdXQsIHNpemUpOwotICAgICAgbWVyZ2VGcm9tKGxpbWl0ZWRJbnB1dCk7Ci0gICAgICByZXR1cm4gdHJ1ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBtZXJnZURlbGltaXRlZEZyb20oCi0gICAgICAgIElucHV0U3RyZWFtIGlucHV0LAotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICAvLyBVbmtub3duRmllbGRTZXQgaGFzIG5vIGV4dGVuc2lvbnMuCi0gICAgICByZXR1cm4gbWVyZ2VEZWxpbWl0ZWRGcm9tKGlucHV0KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oCi0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KLSAgICAgIHJldHVybiBtZXJnZUZyb20oaW5wdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgKLSAgICAgICAgQnl0ZVN0cmluZyBkYXRhLAotICAgICAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgLy8gVW5rbm93bkZpZWxkU2V0IGhhcyBubyBleHRlbnNpb25zLgotICAgICAgcmV0dXJuIG1lcmdlRnJvbShkYXRhKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oYnl0ZVtdIGRhdGEsIGludCBvZmYsIGludCBsZW4pCi0gICAgICAgIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgICAgdHJ5IHsKLSAgICAgICAgZmluYWwgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9Ci0gICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEsIG9mZiwgbGVuKTsKLSAgICAgICAgbWVyZ2VGcm9tKGlucHV0KTsKLSAgICAgICAgaW5wdXQuY2hlY2tMYXN0VGFnV2FzKDApOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IGU7Ci0gICAgICB9IGNhdGNoIChJT0V4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAgICJSZWFkaW5nIGZyb20gYSBieXRlIGFycmF5IHRocmV3IGFuIElPRXhjZXB0aW9uIChzaG91bGQgIiArCi0gICAgICAgICAgIm5ldmVyIGhhcHBlbikuIiwgZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKAotICAgICAgICBieXRlW10gZGF0YSwKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KLSAgICAgIHJldHVybiBtZXJnZUZyb20oZGF0YSk7Ci0gICAgfQotCi0gICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKAotICAgICAgICBieXRlW10gZGF0YSwgaW50IG9mZiwgaW50IGxlbiwKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KQotICAgICAgICB0aHJvd3MgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHsKLSAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KLSAgICAgIHJldHVybiBtZXJnZUZyb20oZGF0YSwgb2ZmLCBsZW4pOwotICAgIH0KLQotICAgIHB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgKLSAgICAgICAgSW5wdXRTdHJlYW0gaW5wdXQsCi0gICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICAgIC8vIFVua25vd25GaWVsZFNldCBoYXMgbm8gZXh0ZW5zaW9ucy4KLSAgICAgIHJldHVybiBtZXJnZUZyb20oaW5wdXQpOwotICAgIH0KLQotICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICAvLyBVbmtub3duRmllbGRTZXRzIGRvIG5vdCBoYXZlIHJlcXVpcmVkIGZpZWxkcywgc28gdGhleSBhcmUgYWx3YXlzCi0gICAgICAvLyBpbml0aWFsaXplZC4KLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBSZXByZXNlbnRzIGEgc2luZ2xlIGZpZWxkIGluIGFuIHtAY29kZSBVbmtub3duRmllbGRTZXR9LgotICAgKgotICAgKiA8cD5BIHtAY29kZSBGaWVsZH0gY29uc2lzdHMgb2YgZml2ZSBsaXN0cyBvZiB2YWx1ZXMuICBUaGUgbGlzdHMgY29ycmVzcG9uZAotICAgKiB0byB0aGUgZml2ZSAid2lyZSB0eXBlcyIgdXNlZCBpbiB0aGUgcHJvdG9jb2wgYnVmZmVyIGJpbmFyeSBmb3JtYXQuCi0gICAqIFRoZSB3aXJlIHR5cGUgb2YgZWFjaCBmaWVsZCBjYW4gYmUgZGV0ZXJtaW5lZCBmcm9tIHRoZSBlbmNvZGVkIGZvcm0gYWxvbmUsCi0gICAqIHdpdGhvdXQga25vd2luZyB0aGUgZmllbGQncyBkZWNsYXJlZCB0eXBlLiAgU28sIHdlIGFyZSBhYmxlIHRvIHBhcnNlCi0gICAqIHVua25vd24gdmFsdWVzIGF0IGxlYXN0IHRoaXMgZmFyIGFuZCBzZXBhcmF0ZSB0aGVtLiAgTm9ybWFsbHksIG9ubHkgb25lCi0gICAqIG9mIHRoZSBmaXZlIGxpc3RzIHdpbGwgY29udGFpbiBhbnkgdmFsdWVzLCBzaW5jZSBpdCBpcyBpbXBvc3NpYmxlIHRvCi0gICAqIGRlZmluZSBhIHZhbGlkIG1lc3NhZ2UgdHlwZSB0aGF0IGRlY2xhcmVzIHR3byBkaWZmZXJlbnQgdHlwZXMgZm9yIHRoZQotICAgKiBzYW1lIGZpZWxkIG51bWJlci4gIEhvd2V2ZXIsIHRoZSBjb2RlIGlzIGRlc2lnbmVkIHRvIGFsbG93IGZvciB0aGUgY2FzZQotICAgKiB3aGVyZSB0aGUgc2FtZSB1bmtub3duIGZpZWxkIG51bWJlciBpcyBlbmNvdW50ZXJlZCB1c2luZyBtdWx0aXBsZSBkaWZmZXJlbnQKLSAgICogd2lyZSB0eXBlcy4KLSAgICoKLSAgICogPHA+e0Bjb2RlIEZpZWxkfSBpcyBhbiBpbW11dGFibGUgY2xhc3MuICBUbyBjb25zdHJ1Y3Qgb25lLCB5b3UgbXVzdCB1c2UgYQotICAgKiB7QGxpbmsgQnVpbGRlcn0uCi0gICAqCi0gICAqIEBzZWUgVW5rbm93bkZpZWxkU2V0Ci0gICAqLwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEZpZWxkIHsKLSAgICBwcml2YXRlIEZpZWxkKCkge30KLQotICAgIC8qKiBDb25zdHJ1Y3QgYSBuZXcge0BsaW5rIEJ1aWxkZXJ9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKCkgewotICAgICAgcmV0dXJuIEJ1aWxkZXIuY3JlYXRlKCk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEgbmV3IHtAbGluayBCdWlsZGVyfSBhbmQgaW5pdGlhbGl6ZSBpdCB0byBhIGNvcHkgb2YKLSAgICAgKiB7QGNvZGUgY29weUZyb219LgotICAgICAqLwotICAgIHB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKGZpbmFsIEZpZWxkIGNvcHlGcm9tKSB7Ci0gICAgICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShjb3B5RnJvbSk7Ci0gICAgfQotCi0gICAgLyoqIEdldCBhbiBlbXB0eSB7QGNvZGUgRmllbGR9LiAqLwotICAgIHB1YmxpYyBzdGF0aWMgRmllbGQgZ2V0RGVmYXVsdEluc3RhbmNlKCkgewotICAgICAgcmV0dXJuIGZpZWxkRGVmYXVsdEluc3RhbmNlOwotICAgIH0KLSAgICBwcml2YXRlIHN0YXRpYyBmaW5hbCBGaWVsZCBmaWVsZERlZmF1bHRJbnN0YW5jZSA9IG5ld0J1aWxkZXIoKS5idWlsZCgpOwotCi0gICAgLyoqIEdldCB0aGUgbGlzdCBvZiB2YXJpbnQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLwotICAgIHB1YmxpYyBMaXN0PExvbmc+IGdldFZhcmludExpc3QoKSAgICAgICAgICAgICAgIHsgcmV0dXJuIHZhcmludDsgICAgICAgICAgfQotCi0gICAgLyoqIEdldCB0aGUgbGlzdCBvZiBmaXhlZDMyIHZhbHVlcyBmb3IgdGhpcyBmaWVsZC4gKi8KLSAgICBwdWJsaWMgTGlzdDxJbnRlZ2VyPiBnZXRGaXhlZDMyTGlzdCgpICAgICAgICAgICB7IHJldHVybiBmaXhlZDMyOyAgICAgICAgIH0KLQotICAgIC8qKiBHZXQgdGhlIGxpc3Qgb2YgZml4ZWQ2NCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICovCi0gICAgcHVibGljIExpc3Q8TG9uZz4gZ2V0Rml4ZWQ2NExpc3QoKSAgICAgICAgICAgICAgeyByZXR1cm4gZml4ZWQ2NDsgICAgICAgICB9Ci0KLSAgICAvKiogR2V0IHRoZSBsaXN0IG9mIGxlbmd0aC1kZWxpbWl0ZWQgdmFsdWVzIGZvciB0aGlzIGZpZWxkLiAqLwotICAgIHB1YmxpYyBMaXN0PEJ5dGVTdHJpbmc+IGdldExlbmd0aERlbGltaXRlZExpc3QoKSB7IHJldHVybiBsZW5ndGhEZWxpbWl0ZWQ7IH0KLQotICAgIC8qKgotICAgICAqIEdldCB0aGUgbGlzdCBvZiBlbWJlZGRlZCBncm91cCB2YWx1ZXMgZm9yIHRoaXMgZmllbGQuICBUaGVzZSBhcmUKLSAgICAgKiByZXByZXNlbnRlZCB1c2luZyB7QGxpbmsgVW5rbm93bkZpZWxkU2V0fXMgcmF0aGVyIHRoYW4ge0BsaW5rIE1lc3NhZ2V9cwotICAgICAqIHNpbmNlIHRoZSBncm91cCdzIHR5cGUgaXMgcHJlc3VtYWJseSB1bmtub3duLgotICAgICAqLwotICAgIHB1YmxpYyBMaXN0PFVua25vd25GaWVsZFNldD4gZ2V0R3JvdXBMaXN0KCkgICAgICB7IHJldHVybiBncm91cDsgICAgICAgICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBib29sZWFuIGVxdWFscyhmaW5hbCBPYmplY3Qgb3RoZXIpIHsKLSAgICAgIGlmICh0aGlzID09IG90aGVyKSB7Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgfQotICAgICAgaWYgKCEob3RoZXIgaW5zdGFuY2VvZiBGaWVsZCkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgcmV0dXJuIEFycmF5cy5lcXVhbHMoZ2V0SWRlbnRpdHlBcnJheSgpLAotICAgICAgICAgICgoRmllbGQpIG90aGVyKS5nZXRJZGVudGl0eUFycmF5KCkpOwotICAgIH0KLQotICAgIEBPdmVycmlkZQotICAgIHB1YmxpYyBpbnQgaGFzaENvZGUoKSB7Ci0gICAgICByZXR1cm4gQXJyYXlzLmhhc2hDb2RlKGdldElkZW50aXR5QXJyYXkoKSk7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogUmV0dXJucyB0aGUgYXJyYXkgb2Ygb2JqZWN0cyB0byBiZSB1c2VkIHRvIHVuaXF1ZWx5IGlkZW50aWZ5IHRoaXMKLSAgICAgKiB7QGxpbmsgRmllbGR9IGluc3RhbmNlLgotICAgICAqLwotICAgIHByaXZhdGUgT2JqZWN0W10gZ2V0SWRlbnRpdHlBcnJheSgpIHsKLSAgICAgIHJldHVybiBuZXcgT2JqZWN0W10gewotICAgICAgICAgIHZhcmludCwKLSAgICAgICAgICBmaXhlZDMyLAotICAgICAgICAgIGZpeGVkNjQsCi0gICAgICAgICAgbGVuZ3RoRGVsaW1pdGVkLAotICAgICAgICAgIGdyb3VwfTsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBTZXJpYWxpemVzIHRoZSBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkIG51bWJlciwgYW5kIHdyaXRlcyBpdCB0bwotICAgICAqIHtAY29kZSBvdXRwdXR9LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlVG8oZmluYWwgaW50IGZpZWxkTnVtYmVyLCBmaW5hbCBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpCi0gICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBsb25nIHZhbHVlIDogdmFyaW50KSB7Ci0gICAgICAgIG91dHB1dC53cml0ZVVJbnQ2NChmaWVsZE51bWJlciwgdmFsdWUpOwotICAgICAgfQotICAgICAgZm9yIChmaW5hbCBpbnQgdmFsdWUgOiBmaXhlZDMyKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUZpeGVkMzIoZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGZvciAoZmluYWwgbG9uZyB2YWx1ZSA6IGZpeGVkNjQpIHsKLSAgICAgICAgb3V0cHV0LndyaXRlRml4ZWQ2NChmaWVsZE51bWJlciwgdmFsdWUpOwotICAgICAgfQotICAgICAgZm9yIChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlIDogbGVuZ3RoRGVsaW1pdGVkKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUJ5dGVzKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGZpbmFsIFVua25vd25GaWVsZFNldCB2YWx1ZSA6IGdyb3VwKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZUdyb3VwKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogR2V0IHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gZW5jb2RlIHRoaXMgZmllbGQsIGluY2x1ZGluZyBmaWVsZAotICAgICAqIG51bWJlci4KLSAgICAgKi8KLSAgICBwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKGZpbmFsIGludCBmaWVsZE51bWJlcikgewotICAgICAgaW50IHJlc3VsdCA9IDA7Ci0gICAgICBmb3IgKGZpbmFsIGxvbmcgdmFsdWUgOiB2YXJpbnQpIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVVSW50NjRTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGZpbmFsIGludCB2YWx1ZSA6IGZpeGVkMzIpIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVGaXhlZDMyU2l6ZShmaWVsZE51bWJlciwgdmFsdWUpOwotICAgICAgfQotICAgICAgZm9yIChmaW5hbCBsb25nIHZhbHVlIDogZml4ZWQ2NCkgewotICAgICAgICByZXN1bHQgKz0gQ29kZWRPdXRwdXRTdHJlYW0uY29tcHV0ZUZpeGVkNjRTaXplKGZpZWxkTnVtYmVyLCB2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBmb3IgKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUgOiBsZW5ndGhEZWxpbWl0ZWQpIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVCeXRlc1NpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIGZvciAoZmluYWwgVW5rbm93bkZpZWxkU2V0IHZhbHVlIDogZ3JvdXApIHsKLSAgICAgICAgcmVzdWx0ICs9IENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVHcm91cFNpemUoZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogU2VyaWFsaXplcyB0aGUgZmllbGQsIGluY2x1ZGluZyBmaWVsZCBudW1iZXIsIGFuZCB3cml0ZXMgaXQgdG8KLSAgICAgKiB7QGNvZGUgb3V0cHV0fSwgdXNpbmcge0Bjb2RlIE1lc3NhZ2VTZXR9IHdpcmUgZm9ybWF0LgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIHdyaXRlQXNNZXNzYWdlU2V0RXh0ZW5zaW9uVG8oCi0gICAgICAgIGZpbmFsIGludCBmaWVsZE51bWJlciwKLSAgICAgICAgZmluYWwgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KQotICAgICAgICB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgZm9yIChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlIDogbGVuZ3RoRGVsaW1pdGVkKSB7Ci0gICAgICAgIG91dHB1dC53cml0ZVJhd01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBHZXQgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBlbmNvZGUgdGhpcyBmaWVsZCwgaW5jbHVkaW5nIGZpZWxkCi0gICAgICogbnVtYmVyLCB1c2luZyB7QGNvZGUgTWVzc2FnZVNldH0gd2lyZSBmb3JtYXQuCi0gICAgICovCi0gICAgcHVibGljIGludCBnZXRTZXJpYWxpemVkU2l6ZUFzTWVzc2FnZVNldEV4dGVuc2lvbihmaW5hbCBpbnQgZmllbGROdW1iZXIpIHsKLSAgICAgIGludCByZXN1bHQgPSAwOwotICAgICAgZm9yIChmaW5hbCBCeXRlU3RyaW5nIHZhbHVlIDogbGVuZ3RoRGVsaW1pdGVkKSB7Ci0gICAgICAgIHJlc3VsdCArPSBDb2RlZE91dHB1dFN0cmVhbS5jb21wdXRlUmF3TWVzc2FnZVNldEV4dGVuc2lvblNpemUoCi0gICAgICAgICAgZmllbGROdW1iZXIsIHZhbHVlKTsKLSAgICAgIH0KLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBMaXN0PExvbmc+IHZhcmludDsKLSAgICBwcml2YXRlIExpc3Q8SW50ZWdlcj4gZml4ZWQzMjsKLSAgICBwcml2YXRlIExpc3Q8TG9uZz4gZml4ZWQ2NDsKLSAgICBwcml2YXRlIExpc3Q8Qnl0ZVN0cmluZz4gbGVuZ3RoRGVsaW1pdGVkOwotICAgIHByaXZhdGUgTGlzdDxVbmtub3duRmllbGRTZXQ+IGdyb3VwOwotCi0gICAgLyoqCi0gICAgICogVXNlZCB0byBidWlsZCBhIHtAbGluayBGaWVsZH0gd2l0aGluIGFuIHtAbGluayBVbmtub3duRmllbGRTZXR9LgotICAgICAqCi0gICAgICogPHA+VXNlIHtAbGluayBGaWVsZCNuZXdCdWlsZGVyKCl9IHRvIGNvbnN0cnVjdCBhIHtAY29kZSBCdWlsZGVyfS4KLSAgICAgKi8KLSAgICBwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgewotICAgICAgLy8gVGhpcyBjb25zdHJ1Y3RvciBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIGRpcmVjdGx5IChleGNlcHQgZnJvbSAnY3JlYXRlJykuCi0gICAgICBwcml2YXRlIEJ1aWxkZXIoKSB7fQotCi0gICAgICBwcml2YXRlIHN0YXRpYyBCdWlsZGVyIGNyZWF0ZSgpIHsKLSAgICAgICAgQnVpbGRlciBidWlsZGVyID0gbmV3IEJ1aWxkZXIoKTsKLSAgICAgICAgYnVpbGRlci5yZXN1bHQgPSBuZXcgRmllbGQoKTsKLSAgICAgICAgcmV0dXJuIGJ1aWxkZXI7Ci0gICAgICB9Ci0KLSAgICAgIHByaXZhdGUgRmllbGQgcmVzdWx0OwotCi0gICAgICAvKioKLSAgICAgICAqIEJ1aWxkIHRoZSBmaWVsZC4gIEFmdGVyIHtAY29kZSBidWlsZCgpfSBoYXMgYmVlbiBjYWxsZWQsIHRoZQotICAgICAgICoge0Bjb2RlIEJ1aWxkZXJ9IGlzIG5vIGxvbmdlciB1c2FibGUuICBDYWxsaW5nIGFueSBvdGhlciBtZXRob2Qgd2lsbAotICAgICAgICogcmVzdWx0IGluIHVuZGVmaW5lZCBiZWhhdmlvciBhbmQgY2FuIGNhdXNlIGEKLSAgICAgICAqIHtAY29kZSBOdWxsUG9pbnRlckV4Y2VwdGlvbn0gdG8gYmUgdGhyb3duLgotICAgICAgICovCi0gICAgICBwdWJsaWMgRmllbGQgYnVpbGQoKSB7Ci0gICAgICAgIGlmIChyZXN1bHQudmFyaW50ID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQudmFyaW50ID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0LnZhcmludCA9IENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0LnZhcmludCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5maXhlZDMyID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQuZml4ZWQzMiA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdC5maXhlZDMyID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQuZml4ZWQzMik7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5maXhlZDY0ID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQuZml4ZWQ2NCA9IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIHJlc3VsdC5maXhlZDY0ID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQuZml4ZWQ2NCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPT0gbnVsbCkgewotICAgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkID0KLSAgICAgICAgICAgIENvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QocmVzdWx0Lmxlbmd0aERlbGltaXRlZCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKHJlc3VsdC5ncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0Lmdyb3VwID0gQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgcmVzdWx0Lmdyb3VwID0gQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdChyZXN1bHQuZ3JvdXApOwotICAgICAgICB9Ci0KLSAgICAgICAgZmluYWwgRmllbGQgcmV0dXJuTWUgPSByZXN1bHQ7Ci0gICAgICAgIHJlc3VsdCA9IG51bGw7Ci0gICAgICAgIHJldHVybiByZXR1cm5NZTsKLSAgICAgIH0KLQotICAgICAgLyoqIERpc2NhcmQgdGhlIGZpZWxkJ3MgY29udGVudHMuICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBjbGVhcigpIHsKLSAgICAgICAgcmVzdWx0ID0gbmV3IEZpZWxkKCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICAvKioKLSAgICAgICAqIE1lcmdlIHRoZSB2YWx1ZXMgaW4ge0Bjb2RlIG90aGVyfSBpbnRvIHRoaXMgZmllbGQuICBGb3IgZWFjaCBsaXN0Ci0gICAgICAgKiBvZiB2YWx1ZXMsIHtAY29kZSBvdGhlcn0ncyB2YWx1ZXMgYXJlIGFwcGVuZCB0byB0aGUgb25lcyBpbiB0aGlzCi0gICAgICAgKiBmaWVsZC4KLSAgICAgICAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKGZpbmFsIEZpZWxkIG90aGVyKSB7Ci0gICAgICAgIGlmICghb3RoZXIudmFyaW50LmlzRW1wdHkoKSkgewotICAgICAgICAgIGlmIChyZXN1bHQudmFyaW50ID09IG51bGwpIHsKLSAgICAgICAgICAgIHJlc3VsdC52YXJpbnQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdC52YXJpbnQuYWRkQWxsKG90aGVyLnZhcmludCk7Ci0gICAgICAgIH0KLSAgICAgICAgaWYgKCFvdGhlci5maXhlZDMyLmlzRW1wdHkoKSkgewotICAgICAgICAgIGlmIChyZXN1bHQuZml4ZWQzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuZml4ZWQzMiA9IG5ldyBBcnJheUxpc3Q8SW50ZWdlcj4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0LmZpeGVkMzIuYWRkQWxsKG90aGVyLmZpeGVkMzIpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghb3RoZXIuZml4ZWQ2NC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBpZiAocmVzdWx0LmZpeGVkNjQgPT0gbnVsbCkgewotICAgICAgICAgICAgcmVzdWx0LmZpeGVkNjQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7Ci0gICAgICAgICAgfQotICAgICAgICAgIHJlc3VsdC5maXhlZDY0LmFkZEFsbChvdGhlci5maXhlZDY0KTsKLSAgICAgICAgfQotICAgICAgICBpZiAoIW90aGVyLmxlbmd0aERlbGltaXRlZC5pc0VtcHR5KCkpIHsKLSAgICAgICAgICBpZiAocmVzdWx0Lmxlbmd0aERlbGltaXRlZCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkID0gbmV3IEFycmF5TGlzdDxCeXRlU3RyaW5nPigpOwotICAgICAgICAgIH0KLSAgICAgICAgICByZXN1bHQubGVuZ3RoRGVsaW1pdGVkLmFkZEFsbChvdGhlci5sZW5ndGhEZWxpbWl0ZWQpOwotICAgICAgICB9Ci0gICAgICAgIGlmICghb3RoZXIuZ3JvdXAuaXNFbXB0eSgpKSB7Ci0gICAgICAgICAgaWYgKHJlc3VsdC5ncm91cCA9PSBudWxsKSB7Ci0gICAgICAgICAgICByZXN1bHQuZ3JvdXAgPSBuZXcgQXJyYXlMaXN0PFVua25vd25GaWVsZFNldD4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgcmVzdWx0Lmdyb3VwLmFkZEFsbChvdGhlci5ncm91cCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKiBBZGQgYSB2YXJpbnQgdmFsdWUuICovCi0gICAgICBwdWJsaWMgQnVpbGRlciBhZGRWYXJpbnQoZmluYWwgbG9uZyB2YWx1ZSkgewotICAgICAgICBpZiAocmVzdWx0LnZhcmludCA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0LnZhcmludCA9IG5ldyBBcnJheUxpc3Q8TG9uZz4oKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQudmFyaW50LmFkZCh2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotCi0gICAgICAvKiogQWRkIGEgZml4ZWQzMiB2YWx1ZS4gKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEZpeGVkMzIoZmluYWwgaW50IHZhbHVlKSB7Ci0gICAgICAgIGlmIChyZXN1bHQuZml4ZWQzMiA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0LmZpeGVkMzIgPSBuZXcgQXJyYXlMaXN0PEludGVnZXI+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmZpeGVkMzIuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKiBBZGQgYSBmaXhlZDY0IHZhbHVlLiAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgYWRkRml4ZWQ2NChmaW5hbCBsb25nIHZhbHVlKSB7Ci0gICAgICAgIGlmIChyZXN1bHQuZml4ZWQ2NCA9PSBudWxsKSB7Ci0gICAgICAgICAgcmVzdWx0LmZpeGVkNjQgPSBuZXcgQXJyYXlMaXN0PExvbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0LmZpeGVkNjQuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0KLSAgICAgIC8qKiBBZGQgYSBsZW5ndGgtZGVsaW1pdGVkIHZhbHVlLiAqLwotICAgICAgcHVibGljIEJ1aWxkZXIgYWRkTGVuZ3RoRGVsaW1pdGVkKGZpbmFsIEJ5dGVTdHJpbmcgdmFsdWUpIHsKLSAgICAgICAgaWYgKHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPT0gbnVsbCkgewotICAgICAgICAgIHJlc3VsdC5sZW5ndGhEZWxpbWl0ZWQgPSBuZXcgQXJyYXlMaXN0PEJ5dGVTdHJpbmc+KCk7Ci0gICAgICAgIH0KLSAgICAgICAgcmVzdWx0Lmxlbmd0aERlbGltaXRlZC5hZGQodmFsdWUpOwotICAgICAgICByZXR1cm4gdGhpczsKLSAgICAgIH0KLQotICAgICAgLyoqIEFkZCBhbiBlbWJlZGRlZCBncm91cC4gKi8KLSAgICAgIHB1YmxpYyBCdWlsZGVyIGFkZEdyb3VwKGZpbmFsIFVua25vd25GaWVsZFNldCB2YWx1ZSkgewotICAgICAgICBpZiAocmVzdWx0Lmdyb3VwID09IG51bGwpIHsKLSAgICAgICAgICByZXN1bHQuZ3JvdXAgPSBuZXcgQXJyYXlMaXN0PFVua25vd25GaWVsZFNldD4oKTsKLSAgICAgICAgfQotICAgICAgICByZXN1bHQuZ3JvdXAuYWRkKHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA4M2U1Yzc5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy9tYWluL2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTQ2ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGphdmEudXRpbC5BYnN0cmFjdExpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLlJhbmRvbUFjY2VzczsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdEl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLQotLyoqCi0gKiBBbiBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgTGF6eVN0cmluZ0xpc3R9IHRoYXQgd3JhcHMgYW5vdGhlcgotICoge0BsaW5rIExhenlTdHJpbmdMaXN0fSBzdWNoIHRoYXQgaXQgY2Fubm90IGJlIG1vZGlmaWVkIHZpYSB0aGUgd3JhcHBlci4KLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqLwotcHVibGljIGNsYXNzIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0IGV4dGVuZHMgQWJzdHJhY3RMaXN0PFN0cmluZz4KLSAgICBpbXBsZW1lbnRzIExhenlTdHJpbmdMaXN0LCBSYW5kb21BY2Nlc3MgewotCi0gIHByaXZhdGUgZmluYWwgTGF6eVN0cmluZ0xpc3QgbGlzdDsKLQotICBwdWJsaWMgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QoTGF6eVN0cmluZ0xpc3QgbGlzdCkgewotICAgIHRoaXMubGlzdCA9IGxpc3Q7Ci0gIH0KLQotICBAT3ZlcnJpZGUKLSAgcHVibGljIFN0cmluZyBnZXQoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGxpc3QuZ2V0KGluZGV4KTsKLSAgfQotCi0gIEBPdmVycmlkZQotICBwdWJsaWMgaW50IHNpemUoKSB7Ci0gICAgcmV0dXJuIGxpc3Quc2l6ZSgpOwotICB9Ci0KLSAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gIHB1YmxpYyBCeXRlU3RyaW5nIGdldEJ5dGVTdHJpbmcoaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIGxpc3QuZ2V0Qnl0ZVN0cmluZyhpbmRleCk7Ci0gIH0KLQotICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgcHVibGljIHZvaWQgYWRkKEJ5dGVTdHJpbmcgZWxlbWVudCkgewotICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICB9Ci0KLSAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gIHB1YmxpYyBMaXN0SXRlcmF0b3I8U3RyaW5nPiBsaXN0SXRlcmF0b3IoZmluYWwgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIG5ldyBMaXN0SXRlcmF0b3I8U3RyaW5nPigpIHsKLSAgICAgIExpc3RJdGVyYXRvcjxTdHJpbmc+IGl0ZXIgPSBsaXN0Lmxpc3RJdGVyYXRvcihpbmRleCk7Ci0KLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIGJvb2xlYW4gaGFzTmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXIuaGFzTmV4dCgpOwotICAgICAgfQotCi0gICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICAgIHB1YmxpYyBTdHJpbmcgbmV4dCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXIubmV4dCgpOwotICAgICAgfQotCi0gICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICAgIHB1YmxpYyBib29sZWFuIGhhc1ByZXZpb3VzKCkgewotICAgICAgICByZXR1cm4gaXRlci5oYXNQcmV2aW91cygpOwotICAgICAgfQotCi0gICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICAgIHB1YmxpYyBTdHJpbmcgcHJldmlvdXMoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyLnByZXZpb3VzKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIGludCBuZXh0SW5kZXgoKSB7Ci0gICAgICAgIHJldHVybiBpdGVyLm5leHRJbmRleCgpOwotICAgICAgfQotCi0gICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICAgIHB1YmxpYyBpbnQgcHJldmlvdXNJbmRleCgpIHsKLSAgICAgICAgcmV0dXJuIGl0ZXIucHJldmlvdXNJbmRleCgpOwotICAgICAgfQotCi0gICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICAgIHB1YmxpYyB2b2lkIHJlbW92ZSgpIHsKLSAgICAgICAgdGhyb3cgbmV3IFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uKCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIHZvaWQgc2V0KFN0cmluZyBvKSB7Ci0gICAgICAgIHRocm93IG5ldyBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbigpOwotICAgICAgfQotCi0gICAgICAvL0BPdmVycmlkZSAoSmF2YSAxLjYgb3ZlcnJpZGUgc2VtYW50aWNzLCBidXQgd2UgbXVzdCBzdXBwb3J0IDEuNSkKLSAgICAgIHB1YmxpYyB2b2lkIGFkZChTdHJpbmcgbykgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci0KLSAgQE92ZXJyaWRlCi0gIHB1YmxpYyBJdGVyYXRvcjxTdHJpbmc+IGl0ZXJhdG9yKCkgewotICAgIHJldHVybiBuZXcgSXRlcmF0b3I8U3RyaW5nPigpIHsKLSAgICAgIEl0ZXJhdG9yPFN0cmluZz4gaXRlciA9IGxpc3QuaXRlcmF0b3IoKTsKLQotICAgICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgICBwdWJsaWMgYm9vbGVhbiBoYXNOZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlci5oYXNOZXh0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIFN0cmluZyBuZXh0KCkgewotICAgICAgICByZXR1cm4gaXRlci5uZXh0KCk7Ci0gICAgICB9Ci0KLSAgICAgIC8vQE92ZXJyaWRlIChKYXZhIDEuNiBvdmVycmlkZSBzZW1hbnRpY3MsIGJ1dCB3ZSBtdXN0IHN1cHBvcnQgMS41KQotICAgICAgcHVibGljIHZvaWQgcmVtb3ZlKCkgewotICAgICAgICB0aHJvdyBuZXcgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24oKTsKLSAgICAgIH0KLSAgICB9OwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL21haW4vamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXQuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTMwZjJhMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvbWFpbi9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTYzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotLyoqCi0gKiBUaGlzIGNsYXNzIGlzIHVzZWQgaW50ZXJuYWxseSBieSB0aGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkgYW5kIGdlbmVyYXRlZAotICogbWVzc2FnZSBpbXBsZW1lbnRhdGlvbnMuICBJdCBpcyBwdWJsaWMgb25seSBiZWNhdXNlIHRob3NlIGdlbmVyYXRlZCBtZXNzYWdlcwotICogZG8gbm90IHJlc2lkZSBpbiB0aGUge0Bjb2RlIHByb3RvYnVmfSBwYWNrYWdlLiAgT3RoZXJzIHNob3VsZCBub3QgdXNlIHRoaXMKLSAqIGNsYXNzIGRpcmVjdGx5LgotICoKLSAqIFRoaXMgY2xhc3MgY29udGFpbnMgY29uc3RhbnRzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHVzZWZ1bCBmb3IgZGVhbGluZyB3aXRoCi0gKiB0aGUgUHJvdG9jb2wgQnVmZmVyIHdpcmUgZm9ybWF0LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBmaW5hbCBjbGFzcyBXaXJlRm9ybWF0IHsKLSAgLy8gRG8gbm90IGFsbG93IGluc3RhbnRpYXRpb24uCi0gIHByaXZhdGUgV2lyZUZvcm1hdCgpIHt9Ci0KLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICA9IDA7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0ZJWEVENjQgICAgICAgICAgPSAxOwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEID0gMjsKLSAgcHVibGljIHN0YXRpYyBmaW5hbCBpbnQgV0lSRVRZUEVfU1RBUlRfR1JPVVAgICAgICA9IDM7Ci0gIHB1YmxpYyBzdGF0aWMgZmluYWwgaW50IFdJUkVUWVBFX0VORF9HUk9VUCAgICAgICAgPSA0OwotICBwdWJsaWMgc3RhdGljIGZpbmFsIGludCBXSVJFVFlQRV9GSVhFRDMyICAgICAgICAgID0gNTsKLQotICBzdGF0aWMgZmluYWwgaW50IFRBR19UWVBFX0JJVFMgPSAzOwotICBzdGF0aWMgZmluYWwgaW50IFRBR19UWVBFX01BU0sgPSAoMSA8PCBUQUdfVFlQRV9CSVRTKSAtIDE7Ci0KLSAgLyoqIEdpdmVuIGEgdGFnIHZhbHVlLCBkZXRlcm1pbmVzIHRoZSB3aXJlIHR5cGUgKHRoZSBsb3dlciAzIGJpdHMpLiAqLwotICBzdGF0aWMgaW50IGdldFRhZ1dpcmVUeXBlKGZpbmFsIGludCB0YWcpIHsKLSAgICByZXR1cm4gdGFnICYgVEFHX1RZUEVfTUFTSzsKLSAgfQotCi0gIC8qKiBHaXZlbiBhIHRhZyB2YWx1ZSwgZGV0ZXJtaW5lcyB0aGUgZmllbGQgbnVtYmVyICh0aGUgdXBwZXIgMjkgYml0cykuICovCi0gIHB1YmxpYyBzdGF0aWMgaW50IGdldFRhZ0ZpZWxkTnVtYmVyKGZpbmFsIGludCB0YWcpIHsKLSAgICByZXR1cm4gdGFnID4+PiBUQUdfVFlQRV9CSVRTOwotICB9Ci0KLSAgLyoqIE1ha2VzIGEgdGFnIHZhbHVlIGdpdmVuIGEgZmllbGQgbnVtYmVyIGFuZCB3aXJlIHR5cGUuICovCi0gIHN0YXRpYyBpbnQgbWFrZVRhZyhmaW5hbCBpbnQgZmllbGROdW1iZXIsIGZpbmFsIGludCB3aXJlVHlwZSkgewotICAgIHJldHVybiAoZmllbGROdW1iZXIgPDwgVEFHX1RZUEVfQklUUykgfCB3aXJlVHlwZTsKLSAgfQotCi0gIC8qKgotICAgKiBMaXRlIGVxdWl2YWxlbnQgdG8ge0BsaW5rIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvci5KYXZhVHlwZX0uICBUaGlzIGlzCi0gICAqIG9ubHkgaGVyZSB0byBzdXBwb3J0IHRoZSBsaXRlIHJ1bnRpbWUgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSB1c2Vycy4KLSAgICovCi0gIHB1YmxpYyBlbnVtIEphdmFUeXBlIHsKLSAgICBJTlQoMCksCi0gICAgTE9ORygwTCksCi0gICAgRkxPQVQoMEYpLAotICAgIERPVUJMRSgwRCksCi0gICAgQk9PTEVBTihmYWxzZSksCi0gICAgU1RSSU5HKCIiKSwKLSAgICBCWVRFX1NUUklORyhCeXRlU3RyaW5nLkVNUFRZKSwKLSAgICBFTlVNKG51bGwpLAotICAgIE1FU1NBR0UobnVsbCk7Ci0KLSAgICBKYXZhVHlwZShmaW5hbCBPYmplY3QgZGVmYXVsdERlZmF1bHQpIHsKLSAgICAgIHRoaXMuZGVmYXVsdERlZmF1bHQgPSBkZWZhdWx0RGVmYXVsdDsKLSAgICB9Ci0KLSAgICAvKioKLSAgICAgKiBUaGUgZGVmYXVsdCBkZWZhdWx0IHZhbHVlIGZvciBmaWVsZHMgb2YgdGhpcyB0eXBlLCBpZiBpdCdzIGEgcHJpbWl0aXZlCi0gICAgICogdHlwZS4KLSAgICAgKi8KLSAgICBPYmplY3QgZ2V0RGVmYXVsdERlZmF1bHQoKSB7Ci0gICAgICByZXR1cm4gZGVmYXVsdERlZmF1bHQ7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBPYmplY3QgZGVmYXVsdERlZmF1bHQ7Ci0gIH0KLQotICAvKioKLSAgICogTGl0ZSBlcXVpdmFsZW50IHRvIHtAbGluayBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IuVHlwZX0uICBUaGlzIGlzCi0gICAqIG9ubHkgaGVyZSB0byBzdXBwb3J0IHRoZSBsaXRlIHJ1bnRpbWUgYW5kIHNob3VsZCBub3QgYmUgdXNlZCBieSB1c2Vycy4KLSAgICovCi0gIHB1YmxpYyBlbnVtIEZpZWxkVHlwZSB7Ci0gICAgRE9VQkxFICAoSmF2YVR5cGUuRE9VQkxFICAgICAsIFdJUkVUWVBFX0ZJWEVENjQgICAgICAgICApLAotICAgIEZMT0FUICAgKEphdmFUeXBlLkZMT0FUICAgICAgLCBXSVJFVFlQRV9GSVhFRDMyICAgICAgICAgKSwKLSAgICBJTlQ2NCAgIChKYXZhVHlwZS5MT05HICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCi0gICAgVUlOVDY0ICAoSmF2YVR5cGUuTE9ORyAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAotICAgIElOVDMyICAgKEphdmFUeXBlLklOVCAgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKLSAgICBGSVhFRDY0IChKYXZhVHlwZS5MT05HICAgICAgICwgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICksCi0gICAgRklYRUQzMiAoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX0ZJWEVEMzIgICAgICAgICApLAotICAgIEJPT0wgICAgKEphdmFUeXBlLkJPT0xFQU4gICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKSwKLSAgICBTVFJJTkcgIChKYXZhVHlwZS5TVFJJTkcgICAgICwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgfSwKLSAgICBHUk9VUCAgIChKYXZhVHlwZS5NRVNTQUdFICAgICwgV0lSRVRZUEVfU1RBUlRfR1JPVVAgICAgICkgewotICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgfSwKLSAgICBNRVNTQUdFIChKYXZhVHlwZS5NRVNTQUdFICAgICwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgfSwKLSAgICBCWVRFUyAgIChKYXZhVHlwZS5CWVRFX1NUUklORywgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgcHVibGljIGJvb2xlYW4gaXNQYWNrYWJsZSgpIHsgcmV0dXJuIGZhbHNlOyB9Ci0gICAgfSwKLSAgICBVSU5UMzIgIChKYXZhVHlwZS5JTlQgICAgICAgICwgV0lSRVRZUEVfVkFSSU5UICAgICAgICAgICksCi0gICAgRU5VTSAgICAoSmF2YVR5cGUuRU5VTSAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAotICAgIFNGSVhFRDMyKEphdmFUeXBlLklOVCAgICAgICAgLCBXSVJFVFlQRV9GSVhFRDMyICAgICAgICAgKSwKLSAgICBTRklYRUQ2NChKYXZhVHlwZS5MT05HICAgICAgICwgV0lSRVRZUEVfRklYRUQ2NCAgICAgICAgICksCi0gICAgU0lOVDMyICAoSmF2YVR5cGUuSU5UICAgICAgICAsIFdJUkVUWVBFX1ZBUklOVCAgICAgICAgICApLAotICAgIFNJTlQ2NCAgKEphdmFUeXBlLkxPTkcgICAgICAgLCBXSVJFVFlQRV9WQVJJTlQgICAgICAgICAgKTsKLQotICAgIEZpZWxkVHlwZShmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZSwgZmluYWwgaW50IHdpcmVUeXBlKSB7Ci0gICAgICB0aGlzLmphdmFUeXBlID0gamF2YVR5cGU7Ci0gICAgICB0aGlzLndpcmVUeXBlID0gd2lyZVR5cGU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBmaW5hbCBKYXZhVHlwZSBqYXZhVHlwZTsKLSAgICBwcml2YXRlIGZpbmFsIGludCB3aXJlVHlwZTsKLQotICAgIHB1YmxpYyBKYXZhVHlwZSBnZXRKYXZhVHlwZSgpIHsgcmV0dXJuIGphdmFUeXBlOyB9Ci0gICAgcHVibGljIGludCBnZXRXaXJlVHlwZSgpIHsgcmV0dXJuIHdpcmVUeXBlOyB9Ci0KLSAgICBwdWJsaWMgYm9vbGVhbiBpc1BhY2thYmxlKCkgeyByZXR1cm4gdHJ1ZTsgfQotICB9Ci0KLSAgLy8gRmllbGQgbnVtYmVycyBmb3IgZmVpbGRzIGluIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQuCi0gIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfSVRFTSAgICA9IDE7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfVFlQRV9JRCA9IDI7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfTUVTU0FHRSA9IDM7Ci0KLSAgLy8gVGFnIG51bWJlcnMuCi0gIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfSVRFTV9UQUcgPQotICAgIG1ha2VUYWcoTUVTU0FHRV9TRVRfSVRFTSwgV0lSRVRZUEVfU1RBUlRfR1JPVVApOwotICBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VUX0lURU1fRU5EX1RBRyA9Ci0gICAgbWFrZVRhZyhNRVNTQUdFX1NFVF9JVEVNLCBXSVJFVFlQRV9FTkRfR1JPVVApOwotICBzdGF0aWMgZmluYWwgaW50IE1FU1NBR0VfU0VUX1RZUEVfSURfVEFHID0KLSAgICBtYWtlVGFnKE1FU1NBR0VfU0VUX1RZUEVfSUQsIFdJUkVUWVBFX1ZBUklOVCk7Ci0gIHN0YXRpYyBmaW5hbCBpbnQgTUVTU0FHRV9TRVRfTUVTU0FHRV9UQUcgPQotICAgIG1ha2VUYWcoTUVTU0FHRV9TRVRfTUVTU0FHRSwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Fic3RyYWN0TWVzc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZDUzY2U4ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvQWJzdHJhY3RNZXNzYWdlVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0T3B0aW1pemVGb3IuVGVzdE9wdGltaXplZEZvclNpemU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25NZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQ7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWRGb3JlaWduOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFVucGFja2VkVHlwZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIEFic3RyYWN0TWVzc2FnZX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIEFic3RyYWN0TWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIC8qKgotICAgKiBFeHRlbmRzIEFic3RyYWN0TWVzc2FnZSBhbmQgd3JhcHMgc29tZSBvdGhlciBtZXNzYWdlIG9iamVjdC4gIFRoZSBtZXRob2RzCi0gICAqIG9mIHRoZSBNZXNzYWdlIGludGVyZmFjZSB3aGljaCBhcmVuJ3QgZXhwbGljaXRseSBpbXBsZW1lbnRlZCBieQotICAgKiBBYnN0cmFjdE1lc3NhZ2UgYXJlIGZvcndhcmRlZCB0byB0aGUgd3JhcHBlZCBvYmplY3QuICBUaGlzIGFsbG93cyB1cyB0bwotICAgKiB0ZXN0IHRoYXQgQWJzdHJhY3RNZXNzYWdlJ3MgaW1wbGVtZW50YXRpb25zIHdvcmsgZXZlbiBpZiB0aGUgd3JhcHBlZAotICAgKiBvYmplY3QgZG9lcyBub3QgdXNlIHRoZW0uCi0gICAqLwotICBwcml2YXRlIHN0YXRpYyBjbGFzcyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIGV4dGVuZHMgQWJzdHJhY3RNZXNzYWdlIHsKLSAgICBwcml2YXRlIGZpbmFsIE1lc3NhZ2Ugd3JhcHBlZE1lc3NhZ2U7Ci0KLSAgICBwdWJsaWMgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihNZXNzYWdlIHdyYXBwZWRNZXNzYWdlKSB7Ci0gICAgICB0aGlzLndyYXBwZWRNZXNzYWdlID0gd3JhcHBlZE1lc3NhZ2U7Ci0gICAgfQotCi0gICAgcHVibGljIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7Ci0gICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICB9Ci0gICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcigKLSAgICAgICAgd3JhcHBlZE1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlRm9yVHlwZSgpKTsKLSAgICB9Ci0gICAgcHVibGljIE1hcDxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgcmV0dXJuIHdyYXBwZWRNZXNzYWdlLmdldEFsbEZpZWxkcygpOwotICAgIH0KLSAgICBwdWJsaWMgYm9vbGVhbiBoYXNGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5oYXNGaWVsZChmaWVsZCk7Ci0gICAgfQotICAgIHB1YmxpYyBPYmplY3QgZ2V0RmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0RmllbGQoZmllbGQpOwotICAgIH0KLSAgICBwdWJsaWMgaW50IGdldFJlcGVhdGVkRmllbGRDb3VudChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgIHJldHVybiB3cmFwcGVkTWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOwotICAgIH0KLSAgICBwdWJsaWMgT2JqZWN0IGdldFJlcGVhdGVkRmllbGQoCi0gICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KSB7Ci0gICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgpOwotICAgIH0KLSAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldFVua25vd25GaWVsZHMoKSB7Ci0gICAgICByZXR1cm4gd3JhcHBlZE1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpOwotICAgIH0KLSAgICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZSgpIHsKLSAgICAgIHJldHVybiBuZXcgQnVpbGRlcih3cmFwcGVkTWVzc2FnZS5uZXdCdWlsZGVyRm9yVHlwZSgpKTsKLSAgICB9Ci0gICAgcHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgewotICAgICAgcmV0dXJuIG5ldyBCdWlsZGVyKHdyYXBwZWRNZXNzYWdlLnRvQnVpbGRlcigpKTsKLSAgICB9Ci0KLSAgICBzdGF0aWMgY2xhc3MgQnVpbGRlciBleHRlbmRzIEFic3RyYWN0TWVzc2FnZS5CdWlsZGVyPEJ1aWxkZXI+IHsKLSAgICAgIHByaXZhdGUgZmluYWwgTWVzc2FnZS5CdWlsZGVyIHdyYXBwZWRCdWlsZGVyOwotCi0gICAgICBwdWJsaWMgQnVpbGRlcihNZXNzYWdlLkJ1aWxkZXIgd3JhcHBlZEJ1aWxkZXIpIHsKLSAgICAgICAgdGhpcy53cmFwcGVkQnVpbGRlciA9IHdyYXBwZWRCdWlsZGVyOwotICAgICAgfQotCi0gICAgICBwdWJsaWMgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBidWlsZCgpIHsKLSAgICAgICAgcmV0dXJuIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKHdyYXBwZWRCdWlsZGVyLmJ1aWxkKCkpOwotICAgICAgfQotICAgICAgcHVibGljIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgYnVpbGRQYXJ0aWFsKCkgewotICAgICAgICByZXR1cm4gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIod3JhcHBlZEJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpOwotICAgICAgfQotICAgICAgcHVibGljIEJ1aWxkZXIgY2xvbmUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcih3cmFwcGVkQnVpbGRlci5jbG9uZSgpKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7Ci0gICAgICAgIHJldHVybiBjbG9uZSgpLmJ1aWxkUGFydGlhbCgpLmlzSW5pdGlhbGl6ZWQoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGdldERlc2NyaXB0b3JGb3JUeXBlKCkgewotICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0RGVzY3JpcHRvckZvclR5cGUoKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIGdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcigKLSAgICAgICAgICB3cmFwcGVkQnVpbGRlci5nZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkpOwotICAgICAgfQotICAgICAgcHVibGljIE1hcDxEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IsIE9iamVjdD4gZ2V0QWxsRmllbGRzKCkgewotICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuZ2V0QWxsRmllbGRzKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgQnVpbGRlciBuZXdCdWlsZGVyRm9yRmllbGQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICAgIHJldHVybiBuZXcgQnVpbGRlcih3cmFwcGVkQnVpbGRlci5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBib29sZWFuIGhhc0ZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgICByZXR1cm4gd3JhcHBlZEJ1aWxkZXIuaGFzRmllbGQoZmllbGQpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBnZXRGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgICAgcmV0dXJuIHdyYXBwZWRCdWlsZGVyLmdldEZpZWxkKGZpZWxkKTsKLSAgICAgIH0KLSAgICAgIHB1YmxpYyBCdWlsZGVyIHNldEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHdyYXBwZWRCdWlsZGVyLnNldEZpZWxkKGZpZWxkLCB2YWx1ZSk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgcHVibGljIEJ1aWxkZXIgY2xlYXJGaWVsZChEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQpIHsKLSAgICAgICAgd3JhcHBlZEJ1aWxkZXIuY2xlYXJGaWVsZChmaWVsZCk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgICAgcHVibGljIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkKSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZmllbGQpOwotICAgICAgfQotICAgICAgcHVibGljIE9iamVjdCBnZXRSZXBlYXRlZEZpZWxkKAotICAgICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgaW50IGluZGV4KSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRSZXBlYXRlZEZpZWxkKGZpZWxkLCBpbmRleCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBPYmplY3QgdmFsdWUpIHsKLSAgICAgICAgd3JhcHBlZEJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmaWVsZCwgaW5kZXgsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKAotICAgICAgICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCwgT2JqZWN0IHZhbHVlKSB7Ci0gICAgICAgIHdyYXBwZWRCdWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZmllbGQsIHZhbHVlKTsKLSAgICAgICAgcmV0dXJuIHRoaXM7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgVW5rbm93bkZpZWxkU2V0IGdldFVua25vd25GaWVsZHMoKSB7Ci0gICAgICAgIHJldHVybiB3cmFwcGVkQnVpbGRlci5nZXRVbmtub3duRmllbGRzKCk7Ci0gICAgICB9Ci0gICAgICBwdWJsaWMgQnVpbGRlciBzZXRVbmtub3duRmllbGRzKFVua25vd25GaWVsZFNldCB1bmtub3duRmllbGRzKSB7Ci0gICAgICAgIHdyYXBwZWRCdWlsZGVyLnNldFVua25vd25GaWVsZHModW5rbm93bkZpZWxkcyk7Ci0gICAgICAgIHJldHVybiB0aGlzOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uVGVzdGVyID0KLSAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLCBudWxsKTsKLQotICBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyID0KLSAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnkoKSk7Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KLSAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoCi0gICAgICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoVGVzdFV0aWwuZ2V0QWxsU2V0KCkpKQotICAgICAgICAuY2xlYXIoKS5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydENsZWFyKChUZXN0QWxsVHlwZXMpIG1lc3NhZ2Uud3JhcHBlZE1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpKQotICAgICAgICAubWVyZ2VGcm9tKFRlc3RVdGlsLmdldEFsbFNldCgpKS5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldCgoVGVzdEFsbFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVkU2l6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgTWVzc2FnZSBhYnN0cmFjdE1lc3NhZ2UgPSBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihUZXN0VXRpbC5nZXRBbGxTZXQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpLAotICAgICAgICAgICAgICAgICBhYnN0cmFjdE1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UgYWJzdHJhY3RNZXNzYWdlID0gbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIoVGVzdFV0aWwuZ2V0QWxsU2V0KCkpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KAotICAgICAgVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShhYnN0cmFjdE1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpKTsKLQotICAgIGFzc2VydEVxdWFscyhUZXN0VXRpbC5nZXRBbGxTZXQoKS50b0J5dGVTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgYWJzdHJhY3RNZXNzYWdlLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpKTsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQotICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCkpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KChUZXN0QWxsVHlwZXMpIG1lc3NhZ2Uud3JhcHBlZE1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhY2tlZFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9Ci0gICAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldCgKLSAgICAgIFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20oYWJzdHJhY3RNZXNzYWdlLnRvQnl0ZVN0cmluZygpKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgIGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFja2VkUGFyc2luZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIG5ldyBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyLkJ1aWxkZXIoVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKSk7Ci0gICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlciBtZXNzYWdlID0KLSAgICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldCgoVGVzdFBhY2tlZFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RVbnBhY2tlZFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlIGFic3RyYWN0TWVzc2FnZSA9Ci0gICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlcihUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydFVucGFja2VkRmllbGRzU2V0KAotICAgICAgVGVzdFVucGFja2VkVHlwZXMucGFyc2VGcm9tKGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLmdldFVucGFja2VkU2V0KCkudG9CeXRlU3RyaW5nKCksCi0gICAgICAgICAgICAgICAgIGFic3RyYWN0TWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQYWNrZWRUb1VucGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCkpOwotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9Ci0gICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldCgKLSAgICAgIChUZXN0VW5wYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VVbnBhY2tlZFRvUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0UGFja2VkVHlwZXMubmV3QnVpbGRlcigpKTsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIG1lc3NhZ2UgPQotICAgICAgYnVpbGRlci5tZXJnZUZyb20oVGVzdFV0aWwuZ2V0VW5wYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoKFRlc3RQYWNrZWRUeXBlcykgbWVzc2FnZS53cmFwcGVkTWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5wYWNrZWRQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCkpOwotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIgbWVzc2FnZSA9Ci0gICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydFVucGFja2VkRmllbGRzU2V0KAotICAgICAgKFRlc3RVbnBhY2tlZFR5cGVzKSBtZXNzYWdlLndyYXBwZWRNZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHRpbWl6ZWRGb3JTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gV2UncmUgbW9zdGx5IG9ubHkgY2hlY2tpbmcgdGhhdCB0aGlzIGNsYXNzIHdhcyBjb21waWxlZCBzdWNjZXNzZnVsbHkuCi0gICAgVGVzdE9wdGltaXplZEZvclNpemUgbWVzc2FnZSA9Ci0gICAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCkuc2V0SSgxKS5idWlsZCgpOwotICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5wYXJzZUZyb20obWVzc2FnZS50b0J5dGVTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUZXN0cyBmb3IgaXNJbml0aWFsaXplZCgpLgotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RSZXF1aXJlZCBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQgPQotICAgIFRlc3RSZXF1aXJlZC5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgVGVzdFJlcXVpcmVkIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQgPQotICAgIFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkuc2V0QSgxKS5zZXRCKDIpLnNldEMoMykuYnVpbGQoKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0SXNJbml0aWFsaXplZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RSZXF1aXJlZC5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpOwotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBhYnN0cmFjdEJ1aWxkZXIgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihidWlsZGVyKTsKLQotICAgIGFzc2VydEZhbHNlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGJ1aWxkZXIuc2V0QSgxKTsKLSAgICBhc3NlcnRGYWxzZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBidWlsZGVyLnNldEIoMSk7Ci0gICAgYXNzZXJ0RmFsc2UoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYnVpbGRlci5zZXRDKDEpOwotICAgIGFzc2VydFRydWUoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Rm9yZWlnbklzSW5pdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UmVxdWlyZWRGb3JlaWduLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpOwotICAgIEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlciBhYnN0cmFjdEJ1aWxkZXIgPQotICAgICAgbmV3IEFic3RyYWN0TWVzc2FnZVdyYXBwZXIuQnVpbGRlcihidWlsZGVyKTsKLQotICAgIGFzc2VydFRydWUoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOwotICAgIGFzc2VydEZhbHNlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0VHJ1ZShhYnN0cmFjdEJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0RmFsc2UoYWJzdHJhY3RCdWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldFJlcGVhdGVkTWVzc2FnZSgwLCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGFic3RyYWN0QnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gVGVzdHMgZm9yIG1lcmdlRnJvbQotCi0gIHN0YXRpYyBmaW5hbCBUZXN0QWxsVHlwZXMgTUVSR0VfU09VUkNFID0KLSAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAuc2V0T3B0aW9uYWxJbnQzMigxKQotICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJmb28iKQotICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCi0gICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImJhciIpCi0gICAgICAuYnVpbGQoKTsKLQotICBzdGF0aWMgZmluYWwgVGVzdEFsbFR5cGVzIE1FUkdFX0RFU1QgPQotICAgIFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgIC5zZXRPcHRpb25hbEludDY0KDIpCi0gICAgICAuc2V0T3B0aW9uYWxTdHJpbmcoImJheiIpCi0gICAgICAuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygzKS5idWlsZCgpKQotICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJxdXgiKQotICAgICAgLmJ1aWxkKCk7Ci0KLSAgc3RhdGljIGZpbmFsIFN0cmluZyBNRVJHRV9SRVNVTFRfVEVYVCA9Ci0gICAgICAib3B0aW9uYWxfaW50MzI6IDFcbiIgKwotICAgICAgIm9wdGlvbmFsX2ludDY0OiAyXG4iICsKLSAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiZm9vXCJcbiIgKwotICAgICAgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSB7XG4iICsKLSAgICAgICIgIGM6IDNcbiIgKwotICAgICAgIn1cbiIgKwotICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJxdXhcIlxuIiArCi0gICAgICAicmVwZWF0ZWRfc3RyaW5nOiBcImJhclwiXG4iOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBBYnN0cmFjdE1lc3NhZ2VXcmFwcGVyIHJlc3VsdCA9Ci0gICAgICBuZXcgQWJzdHJhY3RNZXNzYWdlV3JhcHBlci5CdWlsZGVyKAotICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcihNRVJHRV9ERVNUKSkKLSAgICAgIC5tZXJnZUZyb20oTUVSR0VfU09VUkNFKS5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKE1FUkdFX1JFU1VMVF9URVhULCByZXN1bHQudG9TdHJpbmcoKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBUZXN0cyBmb3IgZXF1YWxzIGFuZCBoYXNoQ29kZQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFcXVhbHNBbmRIYXNoQ29kZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBhID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgVGVzdEFsbFR5cGVzIGIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbFR5cGVzIGMgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcihiKS5hZGRSZXBlYXRlZFN0cmluZygieCIpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbFR5cGVzIGQgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcihjKS5hZGRSZXBlYXRlZFN0cmluZygieSIpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgZSA9IFRlc3RVdGlsLmdldEFsbEV4dGVuc2lvbnNTZXQoKTsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBmID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcihlKQotICAgICAgICAuYWRkRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgOTk5KS5idWlsZCgpOwotCi0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoYSk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoYik7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoYyk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZCk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZSk7Ci0gICAgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoZik7Ci0KLSAgICBjaGVja05vdEVxdWFsKGEsIGIpOwotICAgIGNoZWNrTm90RXF1YWwoYSwgYyk7Ci0gICAgY2hlY2tOb3RFcXVhbChhLCBkKTsKLSAgICBjaGVja05vdEVxdWFsKGEsIGUpOwotICAgIGNoZWNrTm90RXF1YWwoYSwgZik7Ci0KLSAgICBjaGVja05vdEVxdWFsKGIsIGMpOwotICAgIGNoZWNrTm90RXF1YWwoYiwgZCk7Ci0gICAgY2hlY2tOb3RFcXVhbChiLCBlKTsKLSAgICBjaGVja05vdEVxdWFsKGIsIGYpOwotCi0gICAgY2hlY2tOb3RFcXVhbChjLCBkKTsKLSAgICBjaGVja05vdEVxdWFsKGMsIGUpOwotICAgIGNoZWNrTm90RXF1YWwoYywgZik7Ci0KLSAgICBjaGVja05vdEVxdWFsKGQsIGUpOwotICAgIGNoZWNrTm90RXF1YWwoZCwgZik7Ci0KLSAgICBjaGVja05vdEVxdWFsKGUsIGYpOwotCi0gICAgLy8gRGVzZXJpYWxpemluZyBpbnRvIHRoZSBUZXN0RW1wdHlNZXNzYWdlIHN1Y2ggdGhhdCBldmVyeSBmaWVsZAotICAgIC8vIGlzIGFuIHtAbGluayBVbmtub3duRmllbGRTZXQuRmllbGR9LgotICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZSBlVW5rbm93bkZpZWxkcyA9Ci0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZS5wYXJzZUZyb20oZS50b0J5dGVBcnJheSgpKTsKLSAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UgZlVua25vd25GaWVsZHMgPQotICAgICAgICBVbml0dGVzdFByb3RvLlRlc3RFbXB0eU1lc3NhZ2UucGFyc2VGcm9tKGYudG9CeXRlQXJyYXkoKSk7Ci0gICAgY2hlY2tOb3RFcXVhbChlVW5rbm93bkZpZWxkcywgZlVua25vd25GaWVsZHMpOwotICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KGVVbmtub3duRmllbGRzKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChmVW5rbm93bkZpZWxkcyk7Ci0KLSAgICAvLyBTdWJzZXF1ZW50IHJlY29uc3RpdHV0aW9ucyBzaG91bGQgYmUgaWRlbnRpY2FsCi0gICAgVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlIGVVbmtub3duRmllbGRzMiA9Ci0gICAgICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZS5wYXJzZUZyb20oZS50b0J5dGVBcnJheSgpKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChlVW5rbm93bkZpZWxkcywgZVVua25vd25GaWVsZHMyKTsKLSAgfQotCi0KLSAgLyoqCi0gICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gcHJvdG8gaGFzIHN5bWV0cmljIGVxdWFscyBhbmQgaGFzaENvZGUgbWV0aG9kcy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChNZXNzYWdlIG1lc3NhZ2UpIHsKLSAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGl0c2VsZi4KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZSwgbWVzc2FnZSk7Ci0KLSAgICAvLyBPYmplY3Qgc2hvdWxkIGJlIGVxdWFsIHRvIGEgZHluYW1pYyBjb3B5IG9mIGl0c2VsZi4KLSAgICBEeW5hbWljTWVzc2FnZSBkeW5hbWljID0gRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihtZXNzYWdlKS5idWlsZCgpOwotICAgIGNoZWNrRXF1YWxzSXNDb25zaXN0ZW50KG1lc3NhZ2UsIGR5bmFtaWMpOwotICB9Ci0KLSAgLyoqCi0gICAqIEFzc2VydHMgdGhhdCB0aGUgZ2l2ZW4gcHJvdG9zIGFyZSBlcXVhbCBhbmQgaGF2ZSB0aGUgc2FtZSBoYXNoIGNvZGUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tFcXVhbHNJc0NvbnNpc3RlbnQoTWVzc2FnZSBtZXNzYWdlMSwgTWVzc2FnZSBtZXNzYWdlMikgewotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMSwgbWVzc2FnZTIpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMiwgbWVzc2FnZTEpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlMi5oYXNoQ29kZSgpLCBtZXNzYWdlMS5oYXNoQ29kZSgpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc3NlcnRzIHRoYXQgdGhlIGdpdmVuIHByb3RvcyBhcmUgbm90IGVxdWFsIGFuZCBoYXZlIGRpZmZlcmVudCBoYXNoIGNvZGVzLgotICAgKgotICAgKiBAd2FybmluZyBJdCdzIHZhbGlkIGZvciBub24tZXF1YWwgb2JqZWN0cyB0byBoYXZlIHRoZSBzYW1lIGhhc2ggY29kZSwgc28KLSAgICogICB0aGlzIHRlc3QgaXMgc3RyaWN0ZXIgdGhhbiBpdCBuZWVkcyB0byBiZS4gSG93ZXZlciwgdGhpcyBzaG91bGQgaGFwcGVuCi0gICAqICAgcmVsYXRpdmVseSByYXJlbHkuCi0gICAqLwotICBwcml2YXRlIHZvaWQgY2hlY2tOb3RFcXVhbChNZXNzYWdlIG0xLCBNZXNzYWdlIG0yKSB7Ci0gICAgU3RyaW5nIGVxdWFsc0Vycm9yID0gU3RyaW5nLmZvcm1hdCgiJXMgc2hvdWxkIG5vdCBiZSBlcXVhbCB0byAlcyIsIG0xLCBtMik7Ci0gICAgYXNzZXJ0RmFsc2UoZXF1YWxzRXJyb3IsIG0xLmVxdWFscyhtMikpOwotICAgIGFzc2VydEZhbHNlKGVxdWFsc0Vycm9yLCBtMi5lcXVhbHMobTEpKTsKLQotICAgIGFzc2VydEZhbHNlKAotICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyBzaG91bGQgaGF2ZSBhIGRpZmZlcmVudCBoYXNoIGNvZGUgZnJvbSAlcyIsIG0xLCBtMiksCi0gICAgICAgIG0xLmhhc2hDb2RlKCkgPT0gbTIuaGFzaENvZGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZElucHV0U3RyZWFtVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDgzZjdmOGQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkSW5wdXRTdHJlYW1UZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw1MjggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5GaWx0ZXJJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLklucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgQ29kZWRJbnB1dFN0cmVhbX0uCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIENvZGVkSW5wdXRTdHJlYW1UZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAvKioKLSAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIGJ5dGUgYXJyYXkgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKLSAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycwotICAgKiBhYm91dCBwcmVjaXNpb24uCi0gICAqLwotICBwcml2YXRlIGJ5dGVbXSBieXRlcyhpbnQuLi4gYnl0ZXNBc0ludHMpIHsKLSAgICBieXRlW10gYnl0ZXMgPSBuZXcgYnl0ZVtieXRlc0FzSW50cy5sZW5ndGhdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYnl0ZXNBc0ludHMubGVuZ3RoOyBpKyspIHsKLSAgICAgIGJ5dGVzW2ldID0gKGJ5dGUpIGJ5dGVzQXNJbnRzW2ldOwotICAgIH0KLSAgICByZXR1cm4gYnl0ZXM7Ci0gIH0KLQotICAvKioKLSAgICogQW4gSW5wdXRTdHJlYW0gd2hpY2ggbGltaXRzIHRoZSBudW1iZXIgb2YgYnl0ZXMgaXQgcmVhZHMgYXQgYSB0aW1lLgotICAgKiBXZSB1c2UgdGhpcyB0byBtYWtlIHN1cmUgdGhhdCBDb2RlZElucHV0U3RyZWFtIGRvZXNuJ3Qgc2NyZXcgdXAgd2hlbgotICAgKiByZWFkaW5nIGluIHNtYWxsIGJsb2Nrcy4KLSAgICovCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGNsYXNzIFNtYWxsQmxvY2tJbnB1dFN0cmVhbSBleHRlbmRzIEZpbHRlcklucHV0U3RyZWFtIHsKLSAgICBwcml2YXRlIGZpbmFsIGludCBibG9ja1NpemU7Ci0KLSAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKGJ5dGVbXSBkYXRhLCBpbnQgYmxvY2tTaXplKSB7Ci0gICAgICB0aGlzKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSwgYmxvY2tTaXplKTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgU21hbGxCbG9ja0lucHV0U3RyZWFtKElucHV0U3RyZWFtIGluLCBpbnQgYmxvY2tTaXplKSB7Ci0gICAgICBzdXBlcihpbik7Ci0gICAgICB0aGlzLmJsb2NrU2l6ZSA9IGJsb2NrU2l6ZTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgaW50IHJlYWQoYnl0ZVtdIGIpIHRocm93cyBJT0V4Y2VwdGlvbiB7Ci0gICAgICByZXR1cm4gc3VwZXIucmVhZChiLCAwLCBNYXRoLm1pbihiLmxlbmd0aCwgYmxvY2tTaXplKSk7Ci0gICAgfQotCi0gICAgcHVibGljIGludCByZWFkKGJ5dGVbXSBiLCBpbnQgb2ZmLCBpbnQgbGVuKSB0aHJvd3MgSU9FeGNlcHRpb24gewotICAgICAgcmV0dXJuIHN1cGVyLnJlYWQoYiwgb2ZmLCBNYXRoLm1pbihsZW4sIGJsb2NrU2l6ZSkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHJlYWRSYXdWYXJpbnQzMigpIGFuZCByZWFkUmF3VmFyaW50NjQoKSBhbmQKLSAgICogY2hlY2tzIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkVmFyaW50KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoKGludCl2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDMyKCkpOwotCi0gICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGRhdGEpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd1ZhcmludDY0KCkpOwotICAgIGFzc2VydFRydWUoaW5wdXQuaXNBdEVuZCgpKTsKLQotICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCi0gICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDw9IDE2OyBibG9ja1NpemUgKj0gMikgewotICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAotICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOwotICAgICAgYXNzZXJ0RXF1YWxzKChpbnQpdmFsdWUsIGlucHV0LnJlYWRSYXdWYXJpbnQzMigpKTsKLQotICAgICAgaW5wdXQgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKAotICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKGRhdGEsIGJsb2NrU2l6ZSkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBpbnB1dC5yZWFkUmF3VmFyaW50NjQoKSk7Ci0gICAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0gICAgfQotCi0gICAgLy8gVHJ5IHJlYWRpbmcgZGlyZWN0IGZyb20gYW4gSW5wdXRTdHJlYW0uICBXZSB3YW50IHRvIHZlcmlmeSB0aGF0IGl0Ci0gICAgLy8gZG9lc24ndCByZWFkIHBhc3QgdGhlIGVuZCBvZiB0aGUgaW5wdXQsIHNvIHdlIGNvcHkgdG8gYSBuZXcsIGJpZ2dlcgotICAgIC8vIGFycmF5IGZpcnN0LgotICAgIGJ5dGVbXSBsb25nZXJEYXRhID0gbmV3IGJ5dGVbZGF0YS5sZW5ndGggKyAxXTsKLSAgICBTeXN0ZW0uYXJyYXljb3B5KGRhdGEsIDAsIGxvbmdlckRhdGEsIDAsIGRhdGEubGVuZ3RoKTsKLSAgICBJbnB1dFN0cmVhbSByYXdJbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShsb25nZXJEYXRhKTsKLSAgICBhc3NlcnRFcXVhbHMoKGludCl2YWx1ZSwgQ29kZWRJbnB1dFN0cmVhbS5yZWFkUmF3VmFyaW50MzIocmF3SW5wdXQpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgcmF3SW5wdXQuYXZhaWxhYmxlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFBhcnNlcyB0aGUgZ2l2ZW4gYnl0ZXMgdXNpbmcgcmVhZFJhd1ZhcmludDMyKCkgYW5kIHJlYWRSYXdWYXJpbnQ2NCgpIGFuZAotICAgKiBleHBlY3RzIHRoZW0gdG8gZmFpbCB3aXRoIGFuIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB3aG9zZQotICAgKiBkZXNjcmlwdGlvbiBtYXRjaGVzIHRoZSBnaXZlbiBvbmUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgYXNzZXJ0UmVhZFZhcmludEZhaWx1cmUoCi0gICAgICBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZXhwZWN0ZWQsIGJ5dGVbXSBkYXRhKQotICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoZGF0YSk7Ci0gICAgdHJ5IHsKLSAgICAgIGlucHV0LnJlYWRSYXdWYXJpbnQzMigpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkgewotICAgICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldE1lc3NhZ2UoKSwgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLQotICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICB0cnkgewotICAgICAgaW5wdXQucmVhZFJhd1ZhcmludDY0KCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBzdXJlIHdlIGdldCB0aGUgc2FtZSBlcnJvciB3aGVuIHJlYWRpbmcgZGlyZWN0IGZyb20gYW4gSW5wdXRTdHJlYW0uCi0gICAgdHJ5IHsKLSAgICAgIENvZGVkSW5wdXRTdHJlYW0ucmVhZFJhd1ZhcmludDMyKG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShkYXRhKSk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0TWVzc2FnZSgpLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFRlc3RzIHJlYWRSYXdWYXJpbnQzMigpIGFuZCByZWFkUmF3VmFyaW50NjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDApLCAwKTsKLSAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4MDEpLCAxKTsKLSAgICBhc3NlcnRSZWFkVmFyaW50KGJ5dGVzKDB4N2YpLCAxMjcpOwotICAgIC8vIDE0ODgyCi0gICAgYXNzZXJ0UmVhZFZhcmludChieXRlcygweGEyLCAweDc0KSwgKDB4MjIgPDwgMCkgfCAoMHg3NCA8PCA3KSk7Ci0gICAgLy8gMjk2MTQ4ODgzMAotICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCi0gICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAgICgweDBiTCA8PCAyOCkpOwotCi0gICAgLy8gNjQtYml0Ci0gICAgLy8gNzI1NjQ1NjEyNgotICAgIGFzc2VydFJlYWRWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgxYiksCi0gICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAgICgweDFiTCA8PCAyOCkpOwotICAgIC8vIDQxMjU2MjAyNTgwNzE4MzM2Ci0gICAgYXNzZXJ0UmVhZFZhcmludCgKLSAgICAgIGJ5dGVzKDB4ODAsIDB4ZTYsIDB4ZWIsIDB4OWMsIDB4YzMsIDB4YzksIDB4YTQsIDB4NDkpLAotICAgICAgKDB4MDAgPDwgMCkgfCAoMHg2NiA8PCA3KSB8ICgweDZiIDw8IDE0KSB8ICgweDFjIDw8IDIxKSB8Ci0gICAgICAoMHg0M0wgPDwgMjgpIHwgKDB4NDlMIDw8IDM1KSB8ICgweDI0TCA8PCA0MikgfCAoMHg0OUwgPDwgNDkpKTsKLSAgICAvLyAxMTk2NDM3ODMzMDk3ODczNTEzMQotICAgIGFzc2VydFJlYWRWYXJpbnQoCi0gICAgICBieXRlcygweDliLCAweGE4LCAweGY5LCAweGMyLCAweGJiLCAweGQ2LCAweDgwLCAweDg1LCAweGE2LCAweDAxKSwKLSAgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAotICAgICAgKDB4M2JMIDw8IDI4KSB8ICgweDU2TCA8PCAzNSkgfCAoMHgwMEwgPDwgNDIpIHwKLSAgICAgICgweDA1TCA8PCA0OSkgfCAoMHgyNkwgPDwgNTYpIHwgKDB4MDFMIDw8IDYzKSk7Ci0KLSAgICAvLyBGYWlsdXJlcwotICAgIGFzc2VydFJlYWRWYXJpbnRGYWlsdXJlKAotICAgICAgSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uLm1hbGZvcm1lZFZhcmludCgpLAotICAgICAgYnl0ZXMoMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwgMHg4MCwKLSAgICAgICAgICAgIDB4MDApKTsKLSAgICBhc3NlcnRSZWFkVmFyaW50RmFpbHVyZSgKLSAgICAgIEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi50cnVuY2F0ZWRNZXNzYWdlKCksCi0gICAgICBieXRlcygweDgwKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgY2hlY2tzCi0gICAqIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZVtdIGRhdGEsIGludCB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW4zMigpKTsKLSAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0KLSAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKLSAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKLSAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjMyKCkpOwotICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHJlYWRSYXdMaXR0bGVFbmRpYW42NCgpIGFuZCBjaGVja3MKLSAgICogdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIHZhbHVlLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFJlYWRMaXR0bGVFbmRpYW42NChieXRlW10gZGF0YSwgbG9uZyB2YWx1ZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShkYXRhKTsKLSAgICBhc3NlcnRFcXVhbHModmFsdWUsIGlucHV0LnJlYWRSYXdMaXR0bGVFbmRpYW42NCgpKTsKLSAgICBhc3NlcnRUcnVlKGlucHV0LmlzQXRFbmQoKSk7Ci0KLSAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKLSAgICAgIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgICAgbmV3IFNtYWxsQmxvY2tJbnB1dFN0cmVhbShkYXRhLCBibG9ja1NpemUpKTsKLSAgICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgaW5wdXQucmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkpOwotICAgICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOwotICAgIH0KLSAgfQotCi0gIC8qKiBUZXN0cyByZWFkUmF3TGl0dGxlRW5kaWFuMzIoKSBhbmQgcmVhZFJhd0xpdHRsZUVuZGlhbjY0KCkuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkTGl0dGxlRW5kaWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjMyKGJ5dGVzKDB4NzgsIDB4NTYsIDB4MzQsIDB4MTIpLCAweDEyMzQ1Njc4KTsKLSAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuMzIoYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksIDB4OWFiY2RlZjApOwotCi0gICAgYXNzZXJ0UmVhZExpdHRsZUVuZGlhbjY0KAotICAgICAgYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksCi0gICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsKLSAgICBhc3NlcnRSZWFkTGl0dGxlRW5kaWFuNjQoCi0gICAgICBieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyLCAweGYwLCAweGRlLCAweGJjLCAweDlhKSwKLSAgICAgIDB4OWFiY2RlZjAxMjM0NTY3OEwpOwotICB9Ci0KLSAgLyoqIFRlc3QgZGVjb2RlWmlnWmFnMzIoKSBhbmQgZGVjb2RlWmlnWmFnNjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdERlY29kZVppZ1phZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyggMCwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMikpOwotICAgIGFzc2VydEVxdWFscygtMiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigzKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4M0ZGRkZGRkYsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHg3RkZGRkZGRSkpOwotICAgIGFzc2VydEVxdWFscygweEMwMDAwMDAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRiwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigweEZGRkZGRkZFKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4ODAwMDAwMDAsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMHhGRkZGRkZGRikpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCAwLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoLTEsIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMSkpOwotICAgIGFzc2VydEVxdWFscyggMSwgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgyKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0yLCBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDMpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMDNGRkZGRkZGTCwKLSAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwN0ZGRkZGRkVMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkZDMDAwMDAwMEwsCi0gICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHgwMDAwMDAwMDdGRkZGRkZGTCkpOwotICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwN0ZGRkZGRkZMLAotICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4MDAwMDAwMDBGRkZGRkZGRUwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRjgwMDAwMDAwTCwKLSAgICAgICAgICAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgweDAwMDAwMDAwRkZGRkZGRkZMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4N0ZGRkZGRkZGRkZGRkZGRkwsCi0gICAgICAgICAgICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkZGRkZGRkZFTCkpOwotICAgIGFzc2VydEVxdWFscygweDgwMDAwMDAwMDAwMDAwMDBMLAotICAgICAgICAgICAgICAgICBDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KDB4RkZGRkZGRkZGRkZGRkZGRkwpKTsKLSAgfQotCi0gIC8qKiBUZXN0cyByZWFkaW5nIGFuZCBwYXJzaW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IGZpZWxkIHR5cGUuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkV2hvbGVNZXNzYWdlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLQotICAgIGJ5dGVbXSByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlQXJyYXkoKTsKLSAgICBhc3NlcnRFcXVhbHMocmF3Qnl0ZXMubGVuZ3RoLCBtZXNzYWdlLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShyYXdCeXRlcyk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLQotICAgIC8vIFRyeSBkaWZmZXJlbnQgYmxvY2sgc2l6ZXMuCi0gICAgZm9yIChpbnQgYmxvY2tTaXplID0gMTsgYmxvY2tTaXplIDwgMjU2OyBibG9ja1NpemUgKj0gMikgewotICAgICAgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKAotICAgICAgICBuZXcgU21hbGxCbG9ja0lucHV0U3RyZWFtKHJhd0J5dGVzLCBibG9ja1NpemUpKTsKLSAgICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci0gICAgfQotICB9Ci0KLSAgLyoqIFRlc3RzIHNraXBGaWVsZCgpLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0U2tpcFdob2xlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOwotCi0gICAgLy8gQ3JlYXRlIHR3byBwYXJhbGxlbCBpbnB1dHMuICBQYXJzZSBvbmUgYXMgdW5rbm93biBmaWVsZHMgd2hpbGUgdXNpbmcKLSAgICAvLyBza2lwRmllbGQoKSB0byBza2lwIGVhY2ggZmllbGQgb24gdGhlIG90aGVyLiAgRXhwZWN0IHRoZSBzYW1lIHRhZ3MuCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dDEgPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd0J5dGVzKTsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0MiA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOwotICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIHVua25vd25GaWVsZHMgPSBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCB0YWcgPSBpbnB1dDEucmVhZFRhZygpOwotICAgICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQyLnJlYWRUYWcoKSk7Ci0gICAgICBpZiAodGFnID09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgICB1bmtub3duRmllbGRzLm1lcmdlRmllbGRGcm9tKHRhZywgaW5wdXQxKTsKLSAgICAgIGlucHV0Mi5za2lwRmllbGQodGFnKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IGEgYnVnIGluIHNraXBSYXdCeXRlcygpIGhhcyBiZWVuIGZpeGVkOiAgaWYgdGhlIHNraXAgc2tpcHMKLSAgICogZXhhY3RseSB1cCB0byBhIGxpbWl0LCB0aGlzIHNob3VsZCBub3QgYnJlYWsgdGhpbmdzLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNraXBSYXdCeXRlc0J1ZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGJ5dGVbXSByYXdCeXRlcyA9IG5ldyBieXRlW10geyAxLCAyIH07Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3Qnl0ZXMpOwotCi0gICAgaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KDEpOwotICAgIGlucHV0LnNraXBSYXdCeXRlcygxKTsKLSAgICBpbnB1dC5wb3BMaW1pdChsaW1pdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGlucHV0LnJlYWRSYXdCeXRlKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgdGhhdCBhIGJ1ZyBpbiBza2lwUmF3Qnl0ZXMoKSBoYXMgYmVlbiBmaXhlZDogIGlmIHRoZSBza2lwIHNraXBzCi0gICAqIHBhc3QgdGhlIGVuZCBvZiBhIGJ1ZmZlciB3aXRoIGEgbGltaXQgdGhhdCBoYXMgYmVlbiBzZXQgcGFzdCB0aGUgZW5kIG9mCi0gICAqIHRoYXQgYnVmZmVyLCB0aGlzIHNob3VsZCBub3QgYnJlYWsgdGhpbmdzLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFNraXBSYXdCeXRlc1Bhc3RFbmRPZkJ1ZmZlcldpdGhMaW1pdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGJ5dGVbXSByYXdCeXRlcyA9IG5ldyBieXRlW10geyAxLCAyLCAzLCA0LCA1IH07Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCi0gICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0ocmF3Qnl0ZXMsIDMpKTsKLQotICAgIGludCBsaW1pdCA9IGlucHV0LnB1c2hMaW1pdCg0KTsKLSAgICAvLyBJbiBvcmRlciB0byBleHBvc2UgdGhlIGJ1ZyB3ZSBuZWVkIHRvIHJlYWQgYXQgbGVhc3Qgb25lIGJ5dGUgdG8gcHJpbWUgdGhlCi0gICAgLy8gYnVmZmVyIGluc2lkZSB0aGUgQ29kZWRJbnB1dFN0cmVhbS4KLSAgICBhc3NlcnRFcXVhbHMoMSwgaW5wdXQucmVhZFJhd0J5dGUoKSk7Ci0gICAgLy8gU2tpcCB0byB0aGUgZW5kIG9mIHRoZSBsaW1pdC4KLSAgICBpbnB1dC5za2lwUmF3Qnl0ZXMoMyk7Ci0gICAgYXNzZXJ0VHJ1ZShpbnB1dC5pc0F0RW5kKCkpOwotICAgIGlucHV0LnBvcExpbWl0KGxpbWl0KTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgaW5wdXQucmVhZFJhd0J5dGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEh1Z2VCbG9iKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gQWxsb2NhdGUgYW5kIGluaXRpYWxpemUgYSAxTUIgYmxvYi4KLSAgICBieXRlW10gYmxvYiA9IG5ldyBieXRlWzEgPDwgMjBdOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYmxvYi5sZW5ndGg7IGkrKykgewotICAgICAgYmxvYltpXSA9IChieXRlKWk7Ci0gICAgfQotCi0gICAgLy8gTWFrZSBhIG1lc3NhZ2UgY29udGFpbmluZyBpdC4KLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEJ5dGVzKEJ5dGVTdHJpbmcuY29weUZyb20oYmxvYikpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgLy8gU2VyaWFsaXplIGFuZCBwYXJzZSBpdC4gIE1ha2Ugc3VyZSB0byBwYXJzZSBmcm9tIGFuIElucHV0U3RyZWFtLCBub3QKLSAgICAvLyBkaXJlY3RseSBmcm9tIGEgQnl0ZVN0cmluZywgc28gdGhhdCBDb2RlZElucHV0U3RyZWFtIHVzZXMgYnVmZmVyZWQKLSAgICAvLyByZWFkaW5nLgotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9Ci0gICAgICBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkubmV3SW5wdXQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRPcHRpb25hbEJ5dGVzKCksIG1lc3NhZ2UyLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgYWxsIHRoZSBvdGhlciBmaWVsZHMgd2VyZSBwYXJzZWQgY29ycmVjdGx5LgotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMyA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKG1lc3NhZ2UyKQotICAgICAgLnNldE9wdGlvbmFsQnl0ZXMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0T3B0aW9uYWxCeXRlcygpKQotICAgICAgLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkTWFsaWNpb3VzbHlMYXJnZUJsb2IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlU3RyaW5nLk91dHB1dCByYXdPdXRwdXQgPSBCeXRlU3RyaW5nLm5ld091dHB1dCgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7Ci0KLSAgICBpbnQgdGFnID0gV2lyZUZvcm1hdC5tYWtlVGFnKDEsIFdpcmVGb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIodGFnKTsKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigweDdGRkZGRkZGKTsKLSAgICBvdXRwdXQud3JpdGVSYXdCeXRlcyhuZXcgYnl0ZVszMl0pOyAgLy8gUGFkIHdpdGggYSBmZXcgcmFuZG9tIGJ5dGVzLgotICAgIG91dHB1dC5mbHVzaCgpOwotCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQucmVhZFRhZygpKTsKLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dC5yZWFkQnl0ZXMoKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MuCi0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBUZXN0UmVjdXJzaXZlTWVzc2FnZSBtYWtlUmVjdXJzaXZlTWVzc2FnZShpbnQgZGVwdGgpIHsKLSAgICBpZiAoZGVwdGggPT0gMCkgewotICAgICAgcmV0dXJuIFRlc3RSZWN1cnNpdmVNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDUpLmJ1aWxkKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHJldHVybiBUZXN0UmVjdXJzaXZlTWVzc2FnZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEEobWFrZVJlY3Vyc2l2ZU1lc3NhZ2UoZGVwdGggLSAxKSkuYnVpbGQoKTsKLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0TWVzc2FnZURlcHRoKFRlc3RSZWN1cnNpdmVNZXNzYWdlIG1lc3NhZ2UsIGludCBkZXB0aCkgewotICAgIGlmIChkZXB0aCA9PSAwKSB7Ci0gICAgICBhc3NlcnRGYWxzZShtZXNzYWdlLmhhc0EoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNSwgbWVzc2FnZS5nZXRJKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaGFzQSgpKTsKLSAgICAgIGFzc2VydE1lc3NhZ2VEZXB0aChtZXNzYWdlLmdldEEoKSwgZGVwdGggLSAxKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWFsaWNpb3VzUmVjdXJzaW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQnl0ZVN0cmluZyBkYXRhNjQgPSBtYWtlUmVjdXJzaXZlTWVzc2FnZSg2NCkudG9CeXRlU3RyaW5nKCk7Ci0gICAgQnl0ZVN0cmluZyBkYXRhNjUgPSBtYWtlUmVjdXJzaXZlTWVzc2FnZSg2NSkudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBhc3NlcnRNZXNzYWdlRGVwdGgoVGVzdFJlY3Vyc2l2ZU1lc3NhZ2UucGFyc2VGcm9tKGRhdGE2NCksIDY0KTsKLQotICAgIHRyeSB7Ci0gICAgICBUZXN0UmVjdXJzaXZlTWVzc2FnZS5wYXJzZUZyb20oZGF0YTY1KTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MuCi0gICAgfQotCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IGRhdGE2NC5uZXdDb2RlZElucHV0KCk7Ci0gICAgaW5wdXQuc2V0UmVjdXJzaW9uTGltaXQoOCk7Ci0gICAgdHJ5IHsKLSAgICAgIFRlc3RSZWN1cnNpdmVNZXNzYWdlLnBhcnNlRnJvbShpbnB1dCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTaXplTGltaXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDb2RlZElucHV0U3RyZWFtIGlucHV0ID0gQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZSgKLSAgICAgIFRlc3RVdGlsLmdldEFsbFNldCgpLnRvQnl0ZVN0cmluZygpLm5ld0lucHV0KCkpOwotICAgIGlucHV0LnNldFNpemVMaW1pdCgxNik7Ci0KLSAgICB0cnkgewotICAgICAgVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShpbnB1dCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXNldFNpemVDb3VudGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IENvZGVkSW5wdXRTdHJlYW0ubmV3SW5zdGFuY2UoCi0gICAgICAgIG5ldyBTbWFsbEJsb2NrSW5wdXRTdHJlYW0obmV3IGJ5dGVbMjU2XSwgOCkpOwotICAgIGlucHV0LnNldFNpemVMaW1pdCgxNik7Ci0gICAgaW5wdXQucmVhZFJhd0J5dGVzKDE2KTsKLSAgICBhc3NlcnRFcXVhbHMoMTYsIGlucHV0LmdldFRvdGFsQnl0ZXNSZWFkKCkpOwotCi0gICAgdHJ5IHsKLSAgICAgIGlucHV0LnJlYWRSYXdCeXRlKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uISIpOwotICAgIH0gY2F0Y2ggKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzLgotICAgIH0KLQotICAgIGlucHV0LnJlc2V0U2l6ZUNvdW50ZXIoKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgaW5wdXQuZ2V0VG90YWxCeXRlc1JlYWQoKSk7Ci0gICAgaW5wdXQucmVhZFJhd0J5dGUoKTsgIC8vIE5vIGV4Y2VwdGlvbiB0aHJvd24uCi0gICAgaW5wdXQucmVzZXRTaXplQ291bnRlcigpOwotICAgIGFzc2VydEVxdWFscygwLCBpbnB1dC5nZXRUb3RhbEJ5dGVzUmVhZCgpKTsKLQotICAgIHRyeSB7Ci0gICAgICBpbnB1dC5yZWFkUmF3Qnl0ZXMoMTYpOyAgLy8gSGl0cyBsaW1pdCBhZ2Fpbi4KLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24hIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MuCi0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3RzIHRoYXQgaWYgd2UgcmVhZCBhbiBzdHJpbmcgdGhhdCBjb250YWlucyBpbnZhbGlkIFVURi04LCBubyBleGNlcHRpb24KLSAgICogaXMgdGhyb3duLiAgSW5zdGVhZCwgdGhlIGludmFsaWQgYnl0ZXMgYXJlIHJlcGxhY2VkIHdpdGggdGhlIFVuaWNvZGUKLSAgICogInJlcGxhY2VtZW50IGNoYXJhY3RlciIgVStGRkZELgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdFJlYWRJbnZhbGlkVXRmOCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcuT3V0cHV0IHJhd091dHB1dCA9IEJ5dGVTdHJpbmcubmV3T3V0cHV0KCk7Ci0gICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKLQotICAgIGludCB0YWcgPSBXaXJlRm9ybWF0Lm1ha2VUYWcoMSwgV2lyZUZvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMih0YWcpOwotICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKDEpOwotICAgIG91dHB1dC53cml0ZVJhd0J5dGVzKG5ldyBieXRlW10geyAoYnl0ZSkweDgwIH0pOwotICAgIG91dHB1dC5mbHVzaCgpOwotCi0gICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCA9IHJhd091dHB1dC50b0J5dGVTdHJpbmcoKS5uZXdDb2RlZElucHV0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHRhZywgaW5wdXQucmVhZFRhZygpKTsKLSAgICBTdHJpbmcgdGV4dCA9IGlucHV0LnJlYWRTdHJpbmcoKTsKLSAgICBhc3NlcnRFcXVhbHMoMHhmZmZkLCB0ZXh0LmNoYXJBdCgwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVhZEZyb21TbGljZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGJ5dGVbXSBieXRlcyA9IGJ5dGVzKDAsIDEsIDIsIDMsIDQsIDUsIDYsIDcsIDgsIDkpOwotICAgIENvZGVkSW5wdXRTdHJlYW0gaW4gPSBDb2RlZElucHV0U3RyZWFtLm5ld0luc3RhbmNlKGJ5dGVzLCAzLCA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDM7IGkgPCA4OyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBpbi5yZWFkUmF3Qnl0ZSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhpLTIsIGluLmdldFRvdGFsQnl0ZXNSZWFkKCkpOwotICAgIH0KLSAgICAvLyBlb2YKLSAgICBhc3NlcnRFcXVhbHMoMCwgaW4ucmVhZFRhZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoNSwgaW4uZ2V0VG90YWxCeXRlc1JlYWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SW52YWxpZFRhZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEFueSB0YWcgbnVtYmVyIHdoaWNoIGNvcnJlc3BvbmRzIHRvIGZpZWxkIG51bWJlciB6ZXJvIGlzIGludmFsaWQgYW5kCi0gICAgLy8gc2hvdWxkIHRocm93IEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi4KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDg7IGkrKykgewotICAgICAgdHJ5IHsKLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5uZXdJbnN0YW5jZShieXRlcyhpKSkucmVhZFRhZygpOwotICAgICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgYXNzZXJ0RXF1YWxzKEludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbi5pbnZhbGlkVGFnKCkuZ2V0TWVzc2FnZSgpLAotICAgICAgICAgICAgICAgICAgICAgZS5nZXRNZXNzYWdlKCkpOwotICAgICAgfQotICAgIH0KLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0NvZGVkT3V0cHV0U3RyZWFtVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA3NDQ3NmUzLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Db2RlZE91dHB1dFN0cmVhbVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxOCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRUeXBlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgQ29kZWRPdXRwdXRTdHJlYW19LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBjbGFzcyBDb2RlZE91dHB1dFN0cmVhbVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIC8qKgotICAgKiBIZWxwZXIgdG8gY29uc3RydWN0IGEgYnl0ZSBhcnJheSBmcm9tIGEgYnVuY2ggb2YgYnl0ZXMuICBUaGUgaW5wdXRzIGFyZQotICAgKiBhY3R1YWxseSBpbnRzIHNvIHRoYXQgSSBjYW4gdXNlIGhleCBub3RhdGlvbiBhbmQgbm90IGdldCBzdHVwaWQgZXJyb3JzCi0gICAqIGFib3V0IHByZWNpc2lvbi4KLSAgICovCi0gIHByaXZhdGUgYnl0ZVtdIGJ5dGVzKGludC4uLiBieXRlc0FzSW50cykgewotICAgIGJ5dGVbXSBieXRlcyA9IG5ldyBieXRlW2J5dGVzQXNJbnRzLmxlbmd0aF07Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBieXRlc0FzSW50cy5sZW5ndGg7IGkrKykgewotICAgICAgYnl0ZXNbaV0gPSAoYnl0ZSkgYnl0ZXNBc0ludHNbaV07Ci0gICAgfQotICAgIHJldHVybiBieXRlczsKLSAgfQotCi0gIC8qKiBBcnJheXMuYXNMaXN0KCkgZG9lcyBub3Qgd29yayB3aXRoIGFycmF5cyBvZiBwcmltaXRpdmVzLiAgOiggKi8KLSAgcHJpdmF0ZSBMaXN0PEJ5dGU+IHRvTGlzdChieXRlW10gYnl0ZXMpIHsKLSAgICBMaXN0PEJ5dGU+IHJlc3VsdCA9IG5ldyBBcnJheUxpc3Q8Qnl0ZT4oKTsKLSAgICBmb3IgKGJ5dGUgYiA6IGJ5dGVzKSB7Ci0gICAgICByZXN1bHQuYWRkKGIpOwotICAgIH0KLSAgICByZXR1cm4gcmVzdWx0OwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydEVxdWFsQnl0ZXMoYnl0ZVtdIGEsIGJ5dGVbXSBiKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKHRvTGlzdChhKSwgdG9MaXN0KGIpKTsKLSAgfQotCi0gIC8qKgotICAgKiBXcml0ZXMgdGhlIGdpdmVuIHZhbHVlIHVzaW5nIHdyaXRlUmF3VmFyaW50MzIoKSBhbmQgd3JpdGVSYXdWYXJpbnQ2NCgpIGFuZAotICAgKiBjaGVja3MgdGhhdCB0aGUgcmVzdWx0IG1hdGNoZXMgdGhlIGdpdmVuIGJ5dGVzLgotICAgKi8KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBPbmx5IGRvIDMyLWJpdCB3cml0ZSBpZiB0aGUgdmFsdWUgZml0cyBpbiAzMiBiaXRzLgotICAgIGlmICgodmFsdWUgPj4+IDMyKSA9PSAwKSB7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKLSAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDMyKChpbnQpIHZhbHVlKTsKLSAgICAgIG91dHB1dC5mbHVzaCgpOwotICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgIC8vIEFsc28gdHJ5IGNvbXB1dGluZyBzaXplLgotICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVSYXdWYXJpbnQzMlNpemUoKGludCkgdmFsdWUpKTsKLSAgICB9Ci0KLSAgICB7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0gQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0KTsKLSAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKLSAgICAgIG91dHB1dC5mbHVzaCgpOwotICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICAgIC8vIEFsc28gdHJ5IGNvbXB1dGluZyBzaXplLgotICAgICAgYXNzZXJ0RXF1YWxzKGRhdGEubGVuZ3RoLAotICAgICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmNvbXB1dGVSYXdWYXJpbnQ2NFNpemUodmFsdWUpKTsKLSAgICB9Ci0KLSAgICAvLyBUcnkgZGlmZmVyZW50IGJsb2NrIHNpemVzLgotICAgIGZvciAoaW50IGJsb2NrU2l6ZSA9IDE7IGJsb2NrU2l6ZSA8PSAxNjsgYmxvY2tTaXplICo9IDIpIHsKLSAgICAgIC8vIE9ubHkgZG8gMzItYml0IHdyaXRlIGlmIHRoZSB2YWx1ZSBmaXRzIGluIDMyIGJpdHMuCi0gICAgICBpZiAoKHZhbHVlID4+PiAzMikgPT0gMCkgewotICAgICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgICBDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQgPQotICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCwgYmxvY2tTaXplKTsKLSAgICAgICAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoKGludCkgdmFsdWUpOwotICAgICAgICBvdXRwdXQuZmx1c2goKTsKLSAgICAgICAgYXNzZXJ0RXF1YWxCeXRlcyhkYXRhLCByYXdPdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0gICAgICB9Ci0KLSAgICAgIHsKLSAgICAgICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIHJhd091dHB1dCA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0KLSAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7Ci0gICAgICAgIG91dHB1dC53cml0ZVJhd1ZhcmludDY0KHZhbHVlKTsKLSAgICAgICAgb3V0cHV0LmZsdXNoKCk7Ci0gICAgICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotICAgICAgfQotICAgIH0KLSAgfQotCi0gIC8qKiBUZXN0cyB3cml0ZVJhd1ZhcmludDMyKCkgYW5kIHdyaXRlUmF3VmFyaW50NjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFdyaXRlVmFyaW50KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHgwMCksIDApOwotICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4MDEpLCAxKTsKLSAgICBhc3NlcnRXcml0ZVZhcmludChieXRlcygweDdmKSwgMTI3KTsKLSAgICAvLyAxNDg4MgotICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4YTIsIDB4NzQpLCAoMHgyMiA8PCAwKSB8ICgweDc0IDw8IDcpKTsKLSAgICAvLyAyOTYxNDg4ODMwCi0gICAgYXNzZXJ0V3JpdGVWYXJpbnQoYnl0ZXMoMHhiZSwgMHhmNywgMHg5MiwgMHg4NCwgMHgwYiksCi0gICAgICAoMHgzZSA8PCAwKSB8ICgweDc3IDw8IDcpIHwgKDB4MTIgPDwgMTQpIHwgKDB4MDQgPDwgMjEpIHwKLSAgICAgICgweDBiTCA8PCAyOCkpOwotCi0gICAgLy8gNjQtYml0Ci0gICAgLy8gNzI1NjQ1NjEyNgotICAgIGFzc2VydFdyaXRlVmFyaW50KGJ5dGVzKDB4YmUsIDB4ZjcsIDB4OTIsIDB4ODQsIDB4MWIpLAotICAgICAgKDB4M2UgPDwgMCkgfCAoMHg3NyA8PCA3KSB8ICgweDEyIDw8IDE0KSB8ICgweDA0IDw8IDIxKSB8Ci0gICAgICAoMHgxYkwgPDwgMjgpKTsKLSAgICAvLyA0MTI1NjIwMjU4MDcxODMzNgotICAgIGFzc2VydFdyaXRlVmFyaW50KAotICAgICAgYnl0ZXMoMHg4MCwgMHhlNiwgMHhlYiwgMHg5YywgMHhjMywgMHhjOSwgMHhhNCwgMHg0OSksCi0gICAgICAoMHgwMCA8PCAwKSB8ICgweDY2IDw8IDcpIHwgKDB4NmIgPDwgMTQpIHwgKDB4MWMgPDwgMjEpIHwKLSAgICAgICgweDQzTCA8PCAyOCkgfCAoMHg0OUwgPDwgMzUpIHwgKDB4MjRMIDw8IDQyKSB8ICgweDQ5TCA8PCA0OSkpOwotICAgIC8vIDExOTY0Mzc4MzMwOTc4NzM1MTMxCi0gICAgYXNzZXJ0V3JpdGVWYXJpbnQoCi0gICAgICBieXRlcygweDliLCAweGE4LCAweGY5LCAweGMyLCAweGJiLCAweGQ2LCAweDgwLCAweDg1LCAweGE2LCAweDAxKSwKLSAgICAgICgweDFiIDw8IDApIHwgKDB4MjggPDwgNykgfCAoMHg3OSA8PCAxNCkgfCAoMHg0MiA8PCAyMSkgfAotICAgICAgKDB4M2JMIDw8IDI4KSB8ICgweDU2TCA8PCAzNSkgfCAoMHgwMEwgPDwgNDIpIHwKLSAgICAgICgweDA1TCA8PCA0OSkgfCAoMHgyNkwgPDwgNTYpIHwgKDB4MDFMIDw8IDYzKSk7Ci0gIH0KLQotICAvKioKLSAgICogUGFyc2VzIHRoZSBnaXZlbiBieXRlcyB1c2luZyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIGNoZWNrcwotICAgKiB0aGF0IHRoZSByZXN1bHQgbWF0Y2hlcyB0aGUgZ2l2ZW4gdmFsdWUuCi0gICAqLwotICBwcml2YXRlIHZvaWQgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlW10gZGF0YSwgaW50IHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3TGl0dGxlRW5kaWFuMzIodmFsdWUpOwotICAgIG91dHB1dC5mbHVzaCgpOwotICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCi0gICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKSB7Ci0gICAgICByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7Ci0gICAgICBvdXRwdXQud3JpdGVSYXdMaXR0bGVFbmRpYW4zMih2YWx1ZSk7Ci0gICAgICBvdXRwdXQuZmx1c2goKTsKLSAgICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBQYXJzZXMgdGhlIGdpdmVuIGJ5dGVzIHVzaW5nIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKSBhbmQgY2hlY2tzCi0gICAqIHRoYXQgdGhlIHJlc3VsdCBtYXRjaGVzIHRoZSBnaXZlbiB2YWx1ZS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KGJ5dGVbXSBkYXRhLCBsb25nIHZhbHVlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHJhd091dHB1dCk7Ci0gICAgb3V0cHV0LndyaXRlUmF3TGl0dGxlRW5kaWFuNjQodmFsdWUpOwotICAgIG91dHB1dC5mbHVzaCgpOwotICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotCi0gICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPD0gMTY7IGJsb2NrU2l6ZSAqPSAyKSB7Ci0gICAgICByYXdPdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgICBvdXRwdXQgPSBDb2RlZE91dHB1dFN0cmVhbS5uZXdJbnN0YW5jZShyYXdPdXRwdXQsIGJsb2NrU2l6ZSk7Ci0gICAgICBvdXRwdXQud3JpdGVSYXdMaXR0bGVFbmRpYW42NCh2YWx1ZSk7Ci0gICAgICBvdXRwdXQuZmx1c2goKTsKLSAgICAgIGFzc2VydEVxdWFsQnl0ZXMoZGF0YSwgcmF3T3V0cHV0LnRvQnl0ZUFycmF5KCkpOwotICAgIH0KLSAgfQotCi0gIC8qKiBUZXN0cyB3cml0ZVJhd0xpdHRsZUVuZGlhbjMyKCkgYW5kIHdyaXRlUmF3TGl0dGxlRW5kaWFuNjQoKS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFdyaXRlTGl0dGxlRW5kaWFuKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlcygweDc4LCAweDU2LCAweDM0LCAweDEyKSwgMHgxMjM0NTY3OCk7Ci0gICAgYXNzZXJ0V3JpdGVMaXR0bGVFbmRpYW4zMihieXRlcygweGYwLCAweGRlLCAweGJjLCAweDlhKSwgMHg5YWJjZGVmMCk7Ci0KLSAgICBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KAotICAgICAgYnl0ZXMoMHhmMCwgMHhkZSwgMHhiYywgMHg5YSwgMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiksCi0gICAgICAweDEyMzQ1Njc4OWFiY2RlZjBMKTsKLSAgICBhc3NlcnRXcml0ZUxpdHRsZUVuZGlhbjY0KAotICAgICAgYnl0ZXMoMHg3OCwgMHg1NiwgMHgzNCwgMHgxMiwgMHhmMCwgMHhkZSwgMHhiYywgMHg5YSksCi0gICAgICAweDlhYmNkZWYwMTIzNDU2NzhMKTsKLSAgfQotCi0gIC8qKiBUZXN0IGVuY29kZVppZ1phZzMyKCkgYW5kIGVuY29kZVppZ1phZzY0KCkuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RFbmNvZGVaaWdaYWcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoMCwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoIDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoLTEpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoIDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoLTIpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRSwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoMHgzRkZGRkZGRikpOwotICAgIGFzc2VydEVxdWFscygweDdGRkZGRkZGLCBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMigweEMwMDAwMDAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4RkZGRkZGRkUsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKDB4N0ZGRkZGRkYpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRiwgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoMHg4MDAwMDAwMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDAsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KC0xKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KC0yKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAwMDA3RkZGRkZGRUwsCi0gICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4MDAwMDAwMDAzRkZGRkZGRkwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHgwMDAwMDAwMDdGRkZGRkZGTCwKLSAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHhGRkZGRkZGRkMwMDAwMDAwTCkpOwotICAgIGFzc2VydEVxdWFscygweDAwMDAwMDAwRkZGRkZGRkVMLAotICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweDAwMDAwMDAwN0ZGRkZGRkZMKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDB4MDAwMDAwMDBGRkZGRkZGRkwsCi0gICAgICAgICAgICAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KDB4RkZGRkZGRkY4MDAwMDAwMEwpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHhGRkZGRkZGRkZGRkZGRkZFTCwKLSAgICAgICAgICAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoMHg3RkZGRkZGRkZGRkZGRkZGTCkpOwotICAgIGFzc2VydEVxdWFscygweEZGRkZGRkZGRkZGRkZGRkZMLAotICAgICAgICAgICAgICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgweDgwMDAwMDAwMDAwMDAwMDBMKSk7Ci0KLSAgICAvLyBTb21lIGVhc2llci10by12ZXJpZnkgcm91bmQtdHJpcCB0ZXN0cy4gIFRoZSBpbnB1dHMgKG90aGVyIHRoYW4gMCwgMSwgLTEpCi0gICAgLy8gd2VyZSBjaG9zZW4gc2VtaS1yYW5kb21seSB2aWEga2V5Ym9hcmQgYmFzaGluZy4KLSAgICBhc3NlcnRFcXVhbHMoMCwKLSAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwKLSAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMSkpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTEsCi0gICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWczMihDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzMyKC0xKSkpOwotICAgIGFzc2VydEVxdWFscygxNDkyNywKLSAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzMyKENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnMzIoMTQ5MjcpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0zNjEyLAotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnMzIoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWczMigtMzYxMikpKTsKLQotICAgIGFzc2VydEVxdWFscygwLAotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgwKSkpOwotICAgIGFzc2VydEVxdWFscygxLAotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgxKSkpOwotICAgIGFzc2VydEVxdWFscygtMSwKLSAgICAgIENvZGVkT3V0cHV0U3RyZWFtLmVuY29kZVppZ1phZzY0KENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoLTEpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDE0OTI3LAotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgxNDkyNykpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTM2MTIsCi0gICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NChDb2RlZElucHV0U3RyZWFtLmRlY29kZVppZ1phZzY0KC0zNjEyKSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDg1NjkxMjMwNDgwMTQxNkwsCi0gICAgICBDb2RlZE91dHB1dFN0cmVhbS5lbmNvZGVaaWdaYWc2NCgKLSAgICAgICAgQ29kZWRJbnB1dFN0cmVhbS5kZWNvZGVaaWdaYWc2NCgKLSAgICAgICAgICA4NTY5MTIzMDQ4MDE0MTZMKSkpOwotICAgIGFzc2VydEVxdWFscygtNzUxMjM5MDU0Mzk1NzEyNTZMLAotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0uZW5jb2RlWmlnWmFnNjQoCi0gICAgICAgIENvZGVkSW5wdXRTdHJlYW0uZGVjb2RlWmlnWmFnNjQoCi0gICAgICAgICAgLTc1MTIzOTA1NDM5NTcxMjU2TCkpKTsKLSAgfQotCi0gIC8qKiBUZXN0cyB3cml0aW5nIGEgd2hvbGUgbWVzc2FnZSB3aXRoIGV2ZXJ5IGZpZWxkIHR5cGUuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZVdob2xlTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0KLSAgICBieXRlW10gcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZUFycmF5KCk7Ci0gICAgYXNzZXJ0RXF1YWxCeXRlcyhUZXN0VXRpbC5nZXRHb2xkZW5NZXNzYWdlKCkudG9CeXRlQXJyYXkoKSwgcmF3Qnl0ZXMpOwotCi0gICAgLy8gVHJ5IGRpZmZlcmVudCBibG9jayBzaXplcy4KLSAgICBmb3IgKGludCBibG9ja1NpemUgPSAxOyBibG9ja1NpemUgPCAyNTY7IGJsb2NrU2l6ZSAqPSAyKSB7Ci0gICAgICBCeXRlQXJyYXlPdXRwdXRTdHJlYW0gcmF3T3V0cHV0ID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgICAgQ29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0ID0KLSAgICAgICAgQ29kZWRPdXRwdXRTdHJlYW0ubmV3SW5zdGFuY2UocmF3T3V0cHV0LCBibG9ja1NpemUpOwotICAgICAgbWVzc2FnZS53cml0ZVRvKG91dHB1dCk7Ci0gICAgICBvdXRwdXQuZmx1c2goKTsKLSAgICAgIGFzc2VydEVxdWFsQnl0ZXMocmF3Qnl0ZXMsIHJhd091dHB1dC50b0J5dGVBcnJheSgpKTsKLSAgICB9Ci0gIH0KLQotICAvKiogVGVzdHMgd3JpdGluZyBhIHdob2xlIG1lc3NhZ2Ugd2l0aCBldmVyeSBwYWNrZWQgZmllbGQgdHlwZS4gRW5zdXJlcyB0aGUKLSAgICogd2lyZSBmb3JtYXQgb2YgcGFja2VkIGZpZWxkcyBpcyBjb21wYXRpYmxlIHdpdGggQysrLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0V3JpdGVXaG9sZVBhY2tlZEZpZWxkc01lc3NhZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldFBhY2tlZFNldCgpOwotCi0gICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOwotICAgIGFzc2VydEVxdWFsQnl0ZXMoVGVzdFV0aWwuZ2V0R29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSgpLnRvQnl0ZUFycmF5KCksCi0gICAgICAgICAgICAgICAgICAgICByYXdCeXRlcyk7Ci0gIH0KLQotICAvKiogVGVzdCB3cml0aW5nIGEgbWVzc2FnZSBjb250YWluaW5nIGEgbmVnYXRpdmUgZW51bSB2YWx1ZS4gVGhpcyB1c2VkIHRvCi0gICAqIGZhaWwgYmVjYXVzZSB0aGUgc2l6ZSB3YXMgbm90IHByb3Blcmx5IGNvbXB1dGVkIGFzIGEgc2lnbi1leHRlbmRlZCB2YXJpbnQuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RXcml0ZU1lc3NhZ2VXaXRoTmVnYXRpdmVFbnVtVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlNwYXJzZUVudW1NZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgICBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlNwYXJzZUVudW1NZXNzYWdlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0U3BhcnNlRW51bShwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTcGFyc2VFbnVtLlNQQVJTRV9FKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0U3BhcnNlRW51bSgpLmdldE51bWJlcigpIDwgMCk7Ci0gICAgYnl0ZVtdIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVBcnJheSgpOwotICAgIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uU3BhcnNlRW51bU1lc3NhZ2UgbWVzc2FnZTIgPQotICAgICAgICBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlNwYXJzZUVudW1NZXNzYWdlLnBhcnNlRnJvbShyYXdCeXRlcyk7Ci0gICAgYXNzZXJ0RXF1YWxzKHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFNwYXJzZUVudW0uU1BBUlNFX0UsCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2UyLmdldFNwYXJzZUVudW0oKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXByZWNhdGVkRmllbGRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVwcmVjYXRlZEZpZWxkVGVzdC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxZjhiYjQ0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXByZWNhdGVkRmllbGRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw4MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3REZXByZWNhdGVkRmllbGRzOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuQW5ub3RhdGVkRWxlbWVudDsKLWltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5NZXRob2Q7Ci0vKioKLSAqIFRlc3QgZmllbGQgZGVwcmVjYXRpb24KLSAqIAotICogQGF1dGhvciBiaXJkb0Bnb29nbGUuY29tIChSb2JlcnRvIFNjYXJhbXV6emkpCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXByZWNhdGVkRmllbGRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIFN0cmluZ1tdIGRlcHJlY2F0ZWRHZXR0ZXJOYW1lcyA9IHsKLSAgICAgICJoYXNEZXByZWNhdGVkSW50MzIiLAotICAgICAgImdldERlcHJlY2F0ZWRJbnQzMiJ9OwotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBkZXByZWNhdGVkQnVpbGRlckdldHRlck5hbWVzID0gewotICAgICAgImhhc0RlcHJlY2F0ZWRJbnQzMiIsCi0gICAgICAiZ2V0RGVwcmVjYXRlZEludDMyIiwKLSAgICAgICJjbGVhckRlcHJlY2F0ZWRJbnQzMiJ9OwotICAKLSAgcHJpdmF0ZSBTdHJpbmdbXSBkZXByZWNhdGVkQnVpbGRlclNldHRlck5hbWVzID0gewotICAgICAgInNldERlcHJlY2F0ZWRJbnQzMiJ9OyAKLSAgCi0gIHB1YmxpYyB2b2lkIHRlc3REZXByZWNhdGVkRmllbGQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBDbGFzczw/PiBkZXByZWNhdGVkRmllbGRzID0gVGVzdERlcHJlY2F0ZWRGaWVsZHMuY2xhc3M7Ci0gICAgQ2xhc3M8Pz4gZGVwcmVjYXRlZEZpZWxkc0J1aWxkZXIgPSBUZXN0RGVwcmVjYXRlZEZpZWxkcy5CdWlsZGVyLmNsYXNzOwotICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkZXByZWNhdGVkR2V0dGVyTmFtZXMpIHsKLSAgICAgIE1ldGhvZCBtZXRob2QgPSBkZXByZWNhdGVkRmllbGRzLmdldE1ldGhvZChuYW1lKTsKLSAgICAgIGFzc2VydFRydWUoIk1ldGhvZCAiICsgbmFtZSArICIgc2hvdWxkIGJlIGRlcHJlY2F0ZWQiLAotICAgICAgICAgIGlzRGVwcmVjYXRlZChtZXRob2QpKTsKLSAgICB9Ci0gICAgZm9yIChTdHJpbmcgbmFtZSA6IGRlcHJlY2F0ZWRCdWlsZGVyR2V0dGVyTmFtZXMpIHsKLSAgICAgIE1ldGhvZCBtZXRob2QgPSBkZXByZWNhdGVkRmllbGRzQnVpbGRlci5nZXRNZXRob2QobmFtZSk7Ci0gICAgICBhc3NlcnRUcnVlKCJNZXRob2QgIiArIG5hbWUgKyAiIHNob3VsZCBiZSBkZXByZWNhdGVkIiwKLSAgICAgICAgICBpc0RlcHJlY2F0ZWQobWV0aG9kKSk7Ci0gICAgfQotICAgIGZvciAoU3RyaW5nIG5hbWUgOiBkZXByZWNhdGVkQnVpbGRlclNldHRlck5hbWVzKSB7Ci0gICAgICBNZXRob2QgbWV0aG9kID0gZGVwcmVjYXRlZEZpZWxkc0J1aWxkZXIuZ2V0TWV0aG9kKG5hbWUsIGludC5jbGFzcyk7Ci0gICAgICBhc3NlcnRUcnVlKCJNZXRob2QgIiArIG5hbWUgKyAiIHNob3VsZCBiZSBkZXByZWNhdGVkIiwKLSAgICAgICAgICBpc0RlcHJlY2F0ZWQobWV0aG9kKSk7Ci0gICAgfQotICB9Ci0gIAotICBwcml2YXRlIGJvb2xlYW4gaXNEZXByZWNhdGVkKEFubm90YXRlZEVsZW1lbnQgYW5ub3RhdGVkKSB7Ci0gICAgcmV0dXJuIGFubm90YXRlZC5pc0Fubm90YXRpb25QcmVzZW50KERlcHJlY2F0ZWQuY2xhc3MpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnNUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvcnNUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDY1ZDA2ZTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0Rlc2NyaXB0b3JzVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDYwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy5EZXNjcmlwdG9yUHJvdG87Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zLkZpZWxkRGVzY3JpcHRvclByb3RvOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3Rvcy5GaWxlRGVzY3JpcHRvclByb3RvOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb247Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3I7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5TZXJ2aWNlRGVzY3JpcHRvcjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLk1ldGhvZERlc2NyaXB0b3I7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QuVW5pdHRlc3RJbXBvcnQ7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW07Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi50ZXN0LlVuaXR0ZXN0SW1wb3J0LkltcG9ydE1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTZXJ2aWNlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0Q3VzdG9tT3B0aW9uczsKLQotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciB7QGxpbmsgRGVzY3JpcHRvcnN9LgotICoKLSAqIEBhdXRob3Iga2VudG9uQGdvb2dsZS5jb20gS2VudG9uIFZhcmRhCi0gKi8KLXB1YmxpYyBjbGFzcyBEZXNjcmlwdG9yc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgLy8gUmVncmVzc2lvbiB0ZXN0IGZvciBidWcgd2hlcmUgcmVmZXJlbmNpbmcgYSBGaWVsZERlc2NyaXB0b3IuVHlwZSB2YWx1ZQotICAvLyBiZWZvcmUgYSBGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHZhbHVlIHdvdWxkIHlpZWxkIGEKLSAgLy8gRXhjZXB0aW9uSW5Jbml0aWFsaXplckVycm9yLgotICBAU3VwcHJlc3NXYXJuaW5ncygidW51c2VkIikKLSAgcHJpdmF0ZSBzdGF0aWMgZmluYWwgT2JqZWN0IFNUQVRJQ19JTklUX1RFU1QgPSBGaWVsZERlc2NyaXB0b3IuVHlwZS5CT09MOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaWVsZFR5cGVFbnVtTWFwcGluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS52YWx1ZXMoKS5sZW5ndGgsCi0gICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUudmFsdWVzKCkubGVuZ3RoKTsKLSAgICBmb3IgKEZpZWxkRGVzY3JpcHRvci5UeXBlIHR5cGUgOiBGaWVsZERlc2NyaXB0b3IuVHlwZS52YWx1ZXMoKSkgewotICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSBwcm90b1R5cGUgPSB0eXBlLnRvUHJvdG8oKTsKLSAgICAgIGFzc2VydEVxdWFscygiVFlQRV8iICsgdHlwZS5uYW1lKCksIHByb3RvVHlwZS5uYW1lKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKHR5cGUsIEZpZWxkRGVzY3JpcHRvci5UeXBlLnZhbHVlT2YocHJvdG9UeXBlKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEZpbGVEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmlsZURlc2NyaXB0b3IgZmlsZSA9IFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iLCBmaWxlLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdCIsIGZpbGUuZ2V0UGFja2FnZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygiVW5pdHRlc3RQcm90byIsIGZpbGUuZ2V0T3B0aW9ucygpLmdldEphdmFPdXRlckNsYXNzbmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byIsCi0gICAgICAgICAgICAgICAgIGZpbGUudG9Qcm90bygpLmdldE5hbWUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdChVbml0dGVzdEltcG9ydC5nZXREZXNjcmlwdG9yKCkpLAotICAgICAgICAgICAgICAgICBmaWxlLmdldERlcGVuZGVuY2llcygpKTsKLQotICAgIERlc2NyaXB0b3IgbWVzc2FnZVR5cGUgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlVHlwZSwgZmlsZS5nZXRNZXNzYWdlVHlwZXMoKS5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlVHlwZSwgZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIlRlc3RBbGxUeXBlcyIpKTsKLSAgICBhc3NlcnROdWxsKGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOwotICAgIGFzc2VydE51bGwoZmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuZ2V0TWVzc2FnZVR5cGVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBmaWxlLmdldE1lc3NhZ2VUeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBFbnVtRGVzY3JpcHRvciBlbnVtVHlwZSA9IEZvcmVpZ25FbnVtLmdldERlc2NyaXB0b3IoKTsKLSAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIGZpbGUuZ2V0RW51bVR5cGVzKCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIGZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJGb3JlaWduRW51bSIpKTsKLSAgICBhc3NlcnROdWxsKGZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOwotICAgIGFzc2VydE51bGwoZmlsZS5maW5kRW51bVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtIikpOwotICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KEltcG9ydEVudW0uZ2V0RGVzY3JpcHRvcigpKSwKLSAgICAgICAgICAgICAgICAgVW5pdHRlc3RJbXBvcnQuZ2V0RGVzY3JpcHRvcigpLmdldEVudW1UeXBlcygpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuZ2V0RW51bVR5cGVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBmaWxlLmdldEVudW1UeXBlcygpLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBTZXJ2aWNlRGVzY3JpcHRvciBzZXJ2aWNlID0gVGVzdFNlcnZpY2UuZ2V0RGVzY3JpcHRvcigpOwotICAgIGFzc2VydEVxdWFscyhzZXJ2aWNlLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoc2VydmljZSwgZmlsZS5maW5kU2VydmljZUJ5TmFtZSgiVGVzdFNlcnZpY2UiKSk7Ci0gICAgYXNzZXJ0TnVsbChmaWxlLmZpbmRTZXJ2aWNlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOwotICAgIGFzc2VydE51bGwoZmlsZS5maW5kU2VydmljZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLAotICAgICAgICAgICAgICAgICBVbml0dGVzdEltcG9ydC5nZXREZXNjcmlwdG9yKCkuZ2V0U2VydmljZXMoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLmdldFNlcnZpY2VzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KGkpLmdldEluZGV4KCkpOwotICAgIH0KLQotICAgIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gPQotICAgICAgVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXh0ZW5zaW9uLCBmaWxlLmdldEV4dGVuc2lvbnMoKS5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscyhleHRlbnNpb24sCi0gICAgICAgICAgICAgICAgIGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZSgib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIikpOwotICAgIGFzc2VydE51bGwoZmlsZS5maW5kRXh0ZW5zaW9uQnlOYW1lKCJub19zdWNoX2V4dCIpKTsKLSAgICBhc3NlcnROdWxsKGZpbGUuZmluZEV4dGVuc2lvbkJ5TmFtZSgKLSAgICAgICJwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24iKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpLAotICAgICAgICAgICAgICAgICBVbml0dGVzdEltcG9ydC5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUuZ2V0RXh0ZW5zaW9ucygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgZmlsZS5nZXRFeHRlbnNpb25zKCkuZ2V0KGkpLmdldEluZGV4KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRGVzY3JpcHRvciBtZXNzYWdlVHlwZSA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRGVzY3JpcHRvciBuZXN0ZWRUeXBlID0gVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJUZXN0QWxsVHlwZXMiLCBtZXNzYWdlVHlwZS5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscygicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiwgbWVzc2FnZVR5cGUuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBtZXNzYWdlVHlwZS5nZXRGaWxlKCkpOwotICAgIGFzc2VydE51bGwobWVzc2FnZVR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuTWVzc2FnZU9wdGlvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2VUeXBlLmdldE9wdGlvbnMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJUZXN0QWxsVHlwZXMiLCBtZXNzYWdlVHlwZS50b1Byb3RvKCkuZ2V0TmFtZSgpKTsKLQotICAgIGFzc2VydEVxdWFscygiTmVzdGVkTWVzc2FnZSIsIG5lc3RlZFR5cGUuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlIiwKLSAgICAgICAgICAgICAgICAgbmVzdGVkVHlwZS5nZXRGdWxsTmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5nZXREZXNjcmlwdG9yKCksIG5lc3RlZFR5cGUuZ2V0RmlsZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZVR5cGUsIG5lc3RlZFR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7Ci0KLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBtZXNzYWdlVHlwZS5nZXRGaWVsZHMoKS5nZXQoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMiIsIGZpZWxkLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGZpZWxkLCBtZXNzYWdlVHlwZS5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIikpOwotICAgIGFzc2VydE51bGwobWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJub19zdWNoX2ZpZWxkIikpOwotICAgIGFzc2VydEVxdWFscyhmaWVsZCwgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOdW1iZXIoMSkpOwotICAgIGFzc2VydE51bGwobWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOdW1iZXIoNTcxMjgzKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlVHlwZS5nZXRGaWVsZHMoKS5zaXplKCk7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKGksIG1lc3NhZ2VUeXBlLmdldEZpZWxkcygpLmdldChpKS5nZXRJbmRleCgpKTsKLSAgICB9Ci0KLSAgICBhc3NlcnRFcXVhbHMobmVzdGVkVHlwZSwgbWVzc2FnZVR5cGUuZ2V0TmVzdGVkVHlwZXMoKS5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscyhuZXN0ZWRUeXBlLCBtZXNzYWdlVHlwZS5maW5kTmVzdGVkVHlwZUJ5TmFtZSgiTmVzdGVkTWVzc2FnZSIpKTsKLSAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmROZXN0ZWRUeXBlQnlOYW1lKCJOb1N1Y2hUeXBlIikpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZVR5cGUuZ2V0TmVzdGVkVHlwZXMoKS5zaXplKCk7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKGksIG1lc3NhZ2VUeXBlLmdldE5lc3RlZFR5cGVzKCkuZ2V0KGkpLmdldEluZGV4KCkpOwotICAgIH0KLQotICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uZ2V0RGVzY3JpcHRvcigpOwotICAgIGFzc2VydEVxdWFscyhlbnVtVHlwZSwgbWVzc2FnZVR5cGUuZ2V0RW51bVR5cGVzKCkuZ2V0KDApKTsKLSAgICBhc3NlcnRFcXVhbHMoZW51bVR5cGUsIG1lc3NhZ2VUeXBlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiTmVzdGVkRW51bSIpKTsKLSAgICBhc3NlcnROdWxsKG1lc3NhZ2VUeXBlLmZpbmRFbnVtVHlwZUJ5TmFtZSgiTm9TdWNoVHlwZSIpKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VUeXBlLmdldEVudW1UeXBlcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgbWVzc2FnZVR5cGUuZ2V0RW51bVR5cGVzKCkuZ2V0KGkpLmdldEluZGV4KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaWVsZERlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9yIG1lc3NhZ2VUeXBlID0gVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgcHJpbWl0aXZlRmllbGQgPQotICAgICAgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9pbnQzMiIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBlbnVtRmllbGQgPQotICAgICAgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBtZXNzYWdlRmllbGQgPQotICAgICAgbWVzc2FnZVR5cGUuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgY29yZEZpZWxkID0KLSAgICAgIG1lc3NhZ2VUeXBlLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfY29yZCIpOwotICAgIEZpZWxkRGVzY3JpcHRvciBleHRlbnNpb24gPQotICAgICAgVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKTsKLSAgICBGaWVsZERlc2NyaXB0b3IgbmVzdGVkRXh0ZW5zaW9uID0gVGVzdFJlcXVpcmVkLnNpbmdsZS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2ludDMyIiwgcHJpbWl0aXZlRmllbGQuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5vcHRpb25hbF9pbnQzMiIsCi0gICAgICAgICAgICAgICAgIHByaW1pdGl2ZUZpZWxkLmdldEZ1bGxOYW1lKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBwcmltaXRpdmVGaWVsZC5nZXROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VUeXBlLCBwcmltaXRpdmVGaWVsZC5nZXRDb250YWluaW5nVHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5nZXREZXNjcmlwdG9yKCksIHByaW1pdGl2ZUZpZWxkLmdldEZpbGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKEZpZWxkRGVzY3JpcHRvci5UeXBlLklOVDMyLCBwcmltaXRpdmVGaWVsZC5nZXRUeXBlKCkpOwotICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuSU5ULCBwcmltaXRpdmVGaWVsZC5nZXRKYXZhVHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRGVzY3JpcHRvclByb3Rvcy5GaWVsZE9wdGlvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgIHByaW1pdGl2ZUZpZWxkLmdldE9wdGlvbnMoKSk7Ci0gICAgYXNzZXJ0RmFsc2UocHJpbWl0aXZlRmllbGQuaXNFeHRlbnNpb24oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMiIsIHByaW1pdGl2ZUZpZWxkLnRvUHJvdG8oKS5nZXROYW1lKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIsIGVudW1GaWVsZC5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS5FTlVNLCBlbnVtRmllbGQuZ2V0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLkVOVU0sIGVudW1GaWVsZC5nZXRKYXZhVHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBlbnVtRmllbGQuZ2V0RW51bVR5cGUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsIG1lc3NhZ2VGaWVsZC5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuVHlwZS5NRVNTQUdFLCBtZXNzYWdlRmllbGQuZ2V0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLk1FU1NBR0UsIG1lc3NhZ2VGaWVsZC5nZXRKYXZhVHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRm9yZWlnbk1lc3NhZ2UuZ2V0RGVzY3JpcHRvcigpLCBtZXNzYWdlRmllbGQuZ2V0TWVzc2FnZVR5cGUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIm9wdGlvbmFsX2NvcmQiLCBjb3JkRmllbGQuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuU1RSSU5HLCBjb3JkRmllbGQuZ2V0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLlNUUklORywgY29yZEZpZWxkLmdldEphdmFUeXBlKCkpOwotICAgIGFzc2VydEVxdWFscyhEZXNjcmlwdG9yUHJvdG9zLkZpZWxkT3B0aW9ucy5DVHlwZS5DT1JELAotICAgICAgICAgICAgICAgICBjb3JkRmllbGQuZ2V0T3B0aW9ucygpLmdldEN0eXBlKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJvcHRpb25hbF9pbnQzMl9leHRlbnNpb24iLCBleHRlbnNpb24uZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiIsCi0gICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5nZXRGdWxsTmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZXh0ZW5zaW9uLmdldE51bWJlcigpKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0Q29udGFpbmluZ1R5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBleHRlbnNpb24uZ2V0RmlsZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmllbGREZXNjcmlwdG9yLlR5cGUuSU5UMzIsIGV4dGVuc2lvbi5nZXRUeXBlKCkpOwotICAgIGFzc2VydEVxdWFscyhGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUuSU5ULCBleHRlbnNpb24uZ2V0SmF2YVR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuRmllbGRPcHRpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgICBleHRlbnNpb24uZ2V0T3B0aW9ucygpKTsKLSAgICBhc3NlcnRUcnVlKGV4dGVuc2lvbi5pc0V4dGVuc2lvbigpKTsKLSAgICBhc3NlcnRFcXVhbHMobnVsbCwgZXh0ZW5zaW9uLmdldEV4dGVuc2lvblNjb3BlKCkpOwotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uIiwgZXh0ZW5zaW9uLnRvUHJvdG8oKS5nZXROYW1lKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKCJzaW5nbGUiLCBuZXN0ZWRFeHRlbnNpb24uZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RSZXF1aXJlZC5zaW5nbGUiLAotICAgICAgICAgICAgICAgICBuZXN0ZWRFeHRlbnNpb24uZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgIG5lc3RlZEV4dGVuc2lvbi5nZXRFeHRlbnNpb25TY29wZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaWVsZERlc2NyaXB0b3JMYWJlbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZpZWxkRGVzY3JpcHRvciByZXF1aXJlZEZpZWxkID0KLSAgICAgIFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJhIik7Ci0gICAgRmllbGREZXNjcmlwdG9yIG9wdGlvbmFsRmllbGQgPQotICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7Ci0gICAgRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkRmllbGQgPQotICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoInJlcGVhdGVkX2ludDMyIik7Ci0KLSAgICBhc3NlcnRUcnVlKHJlcXVpcmVkRmllbGQuaXNSZXF1aXJlZCgpKTsKLSAgICBhc3NlcnRGYWxzZShyZXF1aXJlZEZpZWxkLmlzUmVwZWF0ZWQoKSk7Ci0gICAgYXNzZXJ0RmFsc2Uob3B0aW9uYWxGaWVsZC5pc1JlcXVpcmVkKCkpOwotICAgIGFzc2VydEZhbHNlKG9wdGlvbmFsRmllbGQuaXNSZXBlYXRlZCgpKTsKLSAgICBhc3NlcnRGYWxzZShyZXBlYXRlZEZpZWxkLmlzUmVxdWlyZWQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShyZXBlYXRlZEZpZWxkLmlzUmVwZWF0ZWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RmllbGREZXNjcmlwdG9yRGVmYXVsdCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIERlc2NyaXB0b3IgZCA9IFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgYXNzZXJ0RmFsc2UoZC5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIikuaGFzRGVmYXVsdFZhbHVlKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBkLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShkLmZpbmRGaWVsZEJ5TmFtZSgiZGVmYXVsdF9pbnQzMiIpLmhhc0RlZmF1bHRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoNDEsIGQuZmluZEZpZWxkQnlOYW1lKCJkZWZhdWx0X2ludDMyIikuZ2V0RGVmYXVsdFZhbHVlKCkpOwotCi0gICAgZCA9IFRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbSgKLSAgICAgICAgIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIlx1MDBmZSIuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSksCi0gICAgICBkLmZpbmRGaWVsZEJ5TmFtZSgiZXNjYXBlZF9ieXRlcyIpLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTEsIGQuZmluZEZpZWxkQnlOYW1lKCJsYXJnZV91aW50MzIiKS5nZXREZWZhdWx0VmFsdWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0xTCwgZC5maW5kRmllbGRCeU5hbWUoImxhcmdlX3VpbnQ2NCIpLmdldERlZmF1bHRWYWx1ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnVtRGVzY3JpcHRvcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0gRm9yZWlnbkVudW0uZ2V0RGVzY3JpcHRvcigpOwotICAgIEVudW1EZXNjcmlwdG9yIG5lc3RlZFR5cGUgPSBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIkZvcmVpZ25FbnVtIiwgZW51bVR5cGUuZ2V0TmFtZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoInByb3RvYnVmX3VuaXR0ZXN0LkZvcmVpZ25FbnVtIiwgZW51bVR5cGUuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBlbnVtVHlwZS5nZXRGaWxlKCkpOwotICAgIGFzc2VydE51bGwoZW51bVR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKERlc2NyaXB0b3JQcm90b3MuRW51bU9wdGlvbnMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICAgIGVudW1UeXBlLmdldE9wdGlvbnMoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoIk5lc3RlZEVudW0iLCBuZXN0ZWRUeXBlLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkRW51bSIsCi0gICAgICAgICAgICAgICAgIG5lc3RlZFR5cGUuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBuZXN0ZWRUeXBlLmdldEZpbGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIG5lc3RlZFR5cGUuZ2V0Q29udGFpbmluZ1R5cGUoKSk7Ci0KLSAgICBFbnVtVmFsdWVEZXNjcmlwdG9yIHZhbHVlID0gRm9yZWlnbkVudW0uRk9SRUlHTl9GT08uZ2V0VmFsdWVEZXNjcmlwdG9yKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBlbnVtVHlwZS5nZXRWYWx1ZXMoKS5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscygiRk9SRUlHTl9GT08iLCB2YWx1ZS5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscyg0LCB2YWx1ZS5nZXROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHZhbHVlLCBlbnVtVHlwZS5maW5kVmFsdWVCeU5hbWUoIkZPUkVJR05fRk9PIikpOwotICAgIGFzc2VydEVxdWFscyh2YWx1ZSwgZW51bVR5cGUuZmluZFZhbHVlQnlOdW1iZXIoNCkpOwotICAgIGFzc2VydE51bGwoZW51bVR5cGUuZmluZFZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bVR5cGUuZ2V0VmFsdWVzKCkuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGFzc2VydEVxdWFscyhpLCBlbnVtVHlwZS5nZXRWYWx1ZXMoKS5nZXQoaSkuZ2V0SW5kZXgoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcnZpY2VEZXNjcmlwdG9yKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU2VydmljZURlc2NyaXB0b3Igc2VydmljZSA9IFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKTsKLQotICAgIGFzc2VydEVxdWFscygiVGVzdFNlcnZpY2UiLCBzZXJ2aWNlLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0U2VydmljZSIsIHNlcnZpY2UuZ2V0RnVsbE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLCBzZXJ2aWNlLmdldEZpbGUoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMiwgc2VydmljZS5nZXRNZXRob2RzKCkuc2l6ZSgpKTsKLQotICAgIE1ldGhvZERlc2NyaXB0b3IgZm9vTWV0aG9kID0gc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KDApOwotICAgIGFzc2VydEVxdWFscygiRm9vIiwgZm9vTWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uRm9vUmVxdWVzdC5nZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgIGZvb01ldGhvZC5nZXRJbnB1dFR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uRm9vUmVzcG9uc2UuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBmb29NZXRob2QuZ2V0T3V0cHV0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZm9vTWV0aG9kLCBzZXJ2aWNlLmZpbmRNZXRob2RCeU5hbWUoIkZvbyIpKTsKLQotICAgIE1ldGhvZERlc2NyaXB0b3IgYmFyTWV0aG9kID0gc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KDEpOwotICAgIGFzc2VydEVxdWFscygiQmFyIiwgYmFyTWV0aG9kLmdldE5hbWUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uQmFyUmVxdWVzdC5nZXREZXNjcmlwdG9yKCksCi0gICAgICAgICAgICAgICAgIGJhck1ldGhvZC5nZXRJbnB1dFR5cGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uQmFyUmVzcG9uc2UuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBiYXJNZXRob2QuZ2V0T3V0cHV0VHlwZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoYmFyTWV0aG9kLCBzZXJ2aWNlLmZpbmRNZXRob2RCeU5hbWUoIkJhciIpKTsKLQotICAgIGFzc2VydE51bGwoc2VydmljZS5maW5kTWV0aG9kQnlOYW1lKCJOb1N1Y2hNZXRob2QiKSk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2UuZ2V0TWV0aG9kcygpLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSwgc2VydmljZS5nZXRNZXRob2RzKCkuZ2V0KGkpLmdldEluZGV4KCkpOwotICAgIH0KLSAgfQotCi0KLSAgcHVibGljIHZvaWQgdGVzdEN1c3RvbU9wdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9yIGRlc2NyaXB0b3IgPQotICAgICAgVW5pdHRlc3RDdXN0b21PcHRpb25zLlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMuZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgIGRlc2NyaXB0b3IuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMubWVzc2FnZU9wdDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKC01NiksCi0gICAgICBkZXNjcmlwdG9yLmdldE9wdGlvbnMoKS5nZXRFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLm1lc3NhZ2VPcHQxKSk7Ci0KLSAgICBGaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgiZmllbGQxIik7Ci0gICAgYXNzZXJ0Tm90TnVsbChmaWVsZCk7Ci0KLSAgICBhc3NlcnRUcnVlKAotICAgICAgZmllbGQuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZmllbGRPcHQxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKExvbmcudmFsdWVPZig4NzY1NDMyMTA5TCksCi0gICAgICBmaWVsZC5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5maWVsZE9wdDEpKTsKLQotICAgIEVudW1EZXNjcmlwdG9yIGVudW1UeXBlID0KLSAgICAgIFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5UZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zLkFuRW51bS5nZXREZXNjcmlwdG9yKCk7Ci0KLSAgICBhc3NlcnRUcnVlKAotICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoSW50ZWdlci52YWx1ZU9mKC03ODkpLAotICAgICAgZW51bVR5cGUuZ2V0T3B0aW9ucygpLmdldEV4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuZW51bU9wdDEpKTsKLQotICAgIFNlcnZpY2VEZXNjcmlwdG9yIHNlcnZpY2UgPQotICAgICAgVW5pdHRlc3RDdXN0b21PcHRpb25zLlRlc3RTZXJ2aWNlV2l0aEN1c3RvbU9wdGlvbnMuZ2V0RGVzY3JpcHRvcigpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgIHNlcnZpY2UuZ2V0T3B0aW9ucygpLmhhc0V4dGVuc2lvbihVbml0dGVzdEN1c3RvbU9wdGlvbnMuc2VydmljZU9wdDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoTG9uZy52YWx1ZU9mKC05ODc2NTQzMjEwTCksCi0gICAgICBzZXJ2aWNlLmdldE9wdGlvbnMoKS5nZXRFeHRlbnNpb24oVW5pdHRlc3RDdXN0b21PcHRpb25zLnNlcnZpY2VPcHQxKSk7Ci0KLSAgICBNZXRob2REZXNjcmlwdG9yIG1ldGhvZCA9IHNlcnZpY2UuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7Ci0gICAgYXNzZXJ0Tm90TnVsbChtZXRob2QpOwotCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgIG1ldGhvZC5nZXRPcHRpb25zKCkuaGFzRXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5tZXRob2RPcHQxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5NZXRob2RPcHQxLk1FVEhPRE9QVDFfVkFMMiwKLSAgICAgIG1ldGhvZC5nZXRPcHRpb25zKCkuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0Q3VzdG9tT3B0aW9ucy5tZXRob2RPcHQxKSk7Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IHRoZSBGaWVsZERlc2NyaXB0b3IuVHlwZSBlbnVtIGlzIHRoZSBzYW1lIGFzIHRoZQotICAgKiBXaXJlRm9ybWF0LkZpZWxkVHlwZSBlbnVtLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEZpZWxkVHlwZVRhYmxlc01hdGNoKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgRmllbGREZXNjcmlwdG9yLlR5cGVbXSB2YWx1ZXMxID0gRmllbGREZXNjcmlwdG9yLlR5cGUudmFsdWVzKCk7Ci0gICAgV2lyZUZvcm1hdC5GaWVsZFR5cGVbXSB2YWx1ZXMyID0gV2lyZUZvcm1hdC5GaWVsZFR5cGUudmFsdWVzKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHModmFsdWVzMS5sZW5ndGgsIHZhbHVlczIubGVuZ3RoKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdmFsdWVzMS5sZW5ndGg7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKHZhbHVlczFbaV0udG9TdHJpbmcoKSwgdmFsdWVzMltpXS50b1N0cmluZygpKTsKLSAgICB9Ci0gIH0KLQotICAvKioKLSAgICogVGVzdCB0aGF0IHRoZSBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGUgZW51bSBpcyB0aGUgc2FtZSBhcyB0aGUKLSAgICogV2lyZUZvcm1hdC5KYXZhVHlwZSBlbnVtLgotICAgKi8KLSAgcHVibGljIHZvaWQgdGVzdEphdmFUeXBlVGFibGVzTWF0Y2goKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGaWVsZERlc2NyaXB0b3IuSmF2YVR5cGVbXSB2YWx1ZXMxID0gRmllbGREZXNjcmlwdG9yLkphdmFUeXBlLnZhbHVlcygpOwotICAgIFdpcmVGb3JtYXQuSmF2YVR5cGVbXSB2YWx1ZXMyID0gV2lyZUZvcm1hdC5KYXZhVHlwZS52YWx1ZXMoKTsKLQotICAgIGFzc2VydEVxdWFscyh2YWx1ZXMxLmxlbmd0aCwgdmFsdWVzMi5sZW5ndGgpOwotCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZXMxLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHModmFsdWVzMVtpXS50b1N0cmluZygpLCB2YWx1ZXMyW2ldLnRvU3RyaW5nKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbm9ybW91c0Rlc2NyaXB0b3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyBmaWxlIGlzIGxhcmdlciB0aGFuIDY0aywgeWV0IGl0IGRpZCBub3QgY2F1c2UKLSAgICAvLyBhIGNvbXBpbGVyIGVycm9yIGR1ZSB0byBhbiBvdmVyLWxvbmcgc3RyaW5nIGxpdGVyYWwuCi0gICAgYXNzZXJ0VHJ1ZSgKLSAgICAgICAgVW5pdHRlc3RFbm9ybW91c0Rlc2NyaXB0b3IuZ2V0RGVzY3JpcHRvcigpCi0gICAgICAgICAgLnRvUHJvdG8oKS5nZXRTZXJpYWxpemVkU2l6ZSgpID4gNjU1MzYpOwotICB9Ci0gIAotICAvKioKLSAgICogVGVzdHMgdGhhdCB0aGUgRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gd29ya3MgYXMgaW50ZW5kZWQuCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0RGVzY3JpcHRvclZhbGlkYXRvckV4Y2VwdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZURlc2NyaXB0b3JQcm90byA9IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAuc2V0TmFtZSgiZm9vLnByb3RvIikKLSAgICAgIC5hZGRNZXNzYWdlVHlwZShEZXNjcmlwdG9yUHJvdG8ubmV3QnVpbGRlcigpCi0gICAgICAuc2V0TmFtZSgiRm9vIikKLSAgICAgICAgLmFkZEZpZWxkKEZpZWxkRGVzY3JpcHRvclByb3RvLm5ld0J1aWxkZXIoKQotICAgICAgICAgIC5zZXRMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbC5MQUJFTF9PUFRJT05BTCkKLSAgICAgICAgICAuc2V0VHlwZShGaWVsZERlc2NyaXB0b3JQcm90by5UeXBlLlRZUEVfSU5UMzIpCi0gICAgICAgICAgLnNldE5hbWUoImZvbyIpCi0gICAgICAgICAgLnNldE51bWJlcigxKQotICAgICAgICAgIC5zZXREZWZhdWx0VmFsdWUoImludmFsaWQiKQotICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKSkKLSAgICAgIC5idWlsZCgpOwotICAgIHRyeSB7Ci0gICAgICBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvci5idWlsZEZyb20oZmlsZURlc2NyaXB0b3JQcm90bywgCi0gICAgICAgICAgbmV3IEZpbGVEZXNjcmlwdG9yWzBdKTsKLSAgICAgIGZhaWwoIkRlc2NyaXB0b3JWYWxpZGF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkIik7Ci0gICAgfSBjYXRjaCAoRGVzY3JpcHRvclZhbGlkYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgLy8gRXhwZWN0ZWQ7IGNoZWNrIHRoYXQgdGhlIGVycm9yIG1lc3NhZ2UgY29udGFpbnMgc29tZSB1c2VmdWwgaGludHMKLSAgICAgIGFzc2VydFRydWUoZS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiZm9vIikgIT0gLTEpOwotICAgICAgYXNzZXJ0VHJ1ZShlLmdldE1lc3NhZ2UoKS5pbmRleE9mKCJGb28iKSAhPSAtMSk7Ci0gICAgICBhc3NlcnRUcnVlKGUuZ2V0TWVzc2FnZSgpLmluZGV4T2YoImludmFsaWQiKSAhPSAtMSk7Ci0gICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKSBpbnN0YW5jZW9mIE51bWJlckZvcm1hdEV4Y2VwdGlvbik7Ci0gICAgICBhc3NlcnRUcnVlKGUuZ2V0Q2F1c2UoKS5nZXRNZXNzYWdlKCkuaW5kZXhPZigiaW52YWxpZCIpICE9IC0xKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9EeW5hbWljTWVzc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWFiY2NkYS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRHluYW1pY01lc3NhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRUeXBlczsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotCi0vKioKLSAqIFVuaXQgdGVzdCBmb3Ige0BsaW5rIER5bmFtaWNNZXNzYWdlfS4gIFNlZSBhbHNvIHtAbGluayBNZXNzYWdlVGVzdH0sIHdoaWNoCi0gKiB0ZXN0cyBzb21lIHtAbGluayBEeW5hbWljTWVzc2FnZX0gZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgY2xhc3MgRHluYW1pY01lc3NhZ2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25UZXN0ZXIgPQotICAgIG5ldyBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIG51bGwpOwotCi0gIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIgPQotICAgIG5ldyBUZXN0VXRpbC5SZWZsZWN0aW9uVGVzdGVyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciBwYWNrZWRSZWZsZWN0aW9uVGVzdGVyID0KLSAgICBuZXcgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlcihUZXN0UGFja2VkVHlwZXMuZ2V0RGVzY3JpcHRvcigpLCBudWxsKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VBY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRBbGxGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdERvdWJsZUJ1aWxkRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICB0cnkgewotICAgICAgYnVpbGRlci5idWlsZCgpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgLy8gU3VjY2Vzcy4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJBZnRlckJ1aWxkRXJyb3IoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIGJ1aWxkZXIuYnVpbGQoKTsKLSAgICB0cnkgewotICAgICAgYnVpbGRlci5jbGVhcigpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChJbGxlZ2FsU3RhdGVFeGNlcHRpb24gZSkgewotICAgICAgLy8gU3VjY2Vzcy4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VFeHRlbnNpb25BY2Nlc3NvcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBXZSBkb24ndCBuZWVkIHRvIGV4dGVuc2l2ZWx5IHRlc3QgRHluYW1pY01lc3NhZ2UncyBoYW5kbGluZyBvZgotICAgIC8vIGV4dGVuc2lvbnMgYmVjYXVzZSwgZnJhbmtseSwgaXQgZG9lc24ndCBkbyBhbnl0aGluZyBzcGVjaWFsIHdpdGggdGhlbS4KLSAgICAvLyBJdCB0cmVhdHMgdGhlbSBqdXN0IGxpa2UgYW55IG90aGVyIGZpZWxkcy4KLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZUV4dGVuc2lvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsRXh0ZW5zaW9ucy5nZXREZXNjcmlwdG9yKCkpOwotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIE1lc3NhZ2UgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZURlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCi0gICAgICBEeW5hbWljTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKAotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpKS5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVNlcmlhbGl6ZWRTaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxTZXQoKTsKLQotICAgIE1lc3NhZ2UuQnVpbGRlciBkeW5hbWljQnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihkeW5hbWljQnVpbGRlcik7Ci0gICAgTWVzc2FnZSBkeW5hbWljTWVzc2FnZSA9IGR5bmFtaWNCdWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpLAotICAgICAgICAgICAgICAgICBkeW5hbWljTWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlciA9Ci0gICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBNZXNzYWdlIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZTIgPSBUZXN0QWxsVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChtZXNzYWdlMik7Ci0KLSAgICAvLyBJbiBmYWN0LCB0aGUgc2VyaWFsaXplZCBmb3JtcyBzaG91bGQgYmUgZXhhY3RseSB0aGUgc2FtZSwgYnl0ZS1mb3ItYnl0ZS4KLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkudG9CeXRlU3RyaW5nKCksIHJhd0J5dGVzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZVBhcnNpbmcoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBCeXRlU3RyaW5nIHJhd0J5dGVzID0gbWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLQotICAgIE1lc3NhZ2UgbWVzc2FnZTIgPQotICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCksIHJhd0J5dGVzKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24obWVzc2FnZTIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXNzYWdlUGFja2VkU2VyaWFsaXphdGlvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0UGFja2VkVHlwZXMuZ2V0RGVzY3JpcHRvcigpKTsKLSAgICBwYWNrZWRSZWZsZWN0aW9uVGVzdGVyLnNldFBhY2tlZEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFBhY2tlZFR5cGVzLnBhcnNlRnJvbShyYXdCeXRlcyk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQobWVzc2FnZTIpOwotCi0gICAgLy8gSW4gZmFjdCwgdGhlIHNlcmlhbGl6ZWQgZm9ybXMgc2hvdWxkIGJlIGV4YWN0bHkgdGhlIHNhbWUsIGJ5dGUtZm9yLWJ5dGUuCi0gICAgYXNzZXJ0RXF1YWxzKFRlc3RVdGlsLmdldFBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpLCByYXdCeXRlcyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RHluYW1pY01lc3NhZ2VQYWNrZWRQYXJzaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RQYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFV0aWwuc2V0UGFja2VkRmllbGRzKGJ1aWxkZXIpOwotICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBNZXNzYWdlIG1lc3NhZ2UyID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLnBhcnNlRnJvbShUZXN0UGFja2VkVHlwZXMuZ2V0RGVzY3JpcHRvcigpLCByYXdCeXRlcyk7Ci0gICAgcGFja2VkUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRQYWNrZWRGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljTWVzc2FnZUNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICBEeW5hbWljTWVzc2FnZSBjb3B5ID0gRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihtZXNzYWdlKS5idWlsZCgpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihjb3B5KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RUb0J1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEeW5hbWljTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPQotICAgICAgICBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBpbnQgdW5rbm93bkZpZWxkTnVtID0gOTsKLSAgICBsb25nIHVua25vd25GaWVsZFZhbCA9IDkwOwotICAgIGJ1aWxkZXIuc2V0VW5rbm93bkZpZWxkcyhVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRGaWVsZCh1bmtub3duRmllbGROdW0sCi0gICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZFZhcmludCh1bmtub3duRmllbGRWYWwpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpKTsKLSAgICBEeW5hbWljTWVzc2FnZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgRHluYW1pY01lc3NhZ2UgZGVyaXZlZCA9IG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLmFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oZGVyaXZlZCk7Ci0gICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QodW5rbm93bkZpZWxkVmFsKSwKLSAgICAgICAgZGVyaXZlZC5nZXRVbmtub3duRmllbGRzKCkuZ2V0RmllbGQodW5rbm93bkZpZWxkTnVtKS5nZXRWYXJpbnRMaXN0KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRm9yY2VGaWVsZEJ1aWxkZXJzUHJlUnVuLmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvRm9yY2VGaWVsZEJ1aWxkZXJzUHJlUnVuLmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDhiNzg4OTMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0ZvcmNlRmllbGRCdWlsZGVyc1ByZVJ1bi5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi0vKioKLSAqIEEgcHJlcnVuIGZvciBhIHRlc3Qgc3VpdGUgdGhhdCBhbGxvd3MgcnVubmluZyB0aGUgZnVsbCBwcm90b2NvbCBidWZmZXIKLSAqIHRlc3RzIGluIGEgbW9kZSB0aGF0IGRpc2FibGVzIHRoZSBvcHRpbWl6YXRpb24gZm9yIG5vdCB1c2luZwotICoge0BsaW5rIFJlcGVhdGVkRmllbGRCdWlsZGVyfSBhbmQge0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0gdW50aWwgdGhleSBhcmUKLSAqIHJlcXVlc3RlZC4gVGhpcyBhbGxvd3MgdXMgdG8gcnVuIGFsbCB0aGUgdGVzdHMgdGhyb3VnaCBib3RoIGNvZGUgcGF0aHMKLSAqIGFuZCBlbnN1cmVzIHRoYXQgYm90aCBjb2RlIHBhdGhzIHByb2R1Y2UgaWRlbnRpY2FsIHJlc3VsdHMuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBGb3JjZUZpZWxkQnVpbGRlcnNQcmVSdW4gaW1wbGVtZW50cyBSdW5uYWJsZSB7Ci0KLSAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gIHB1YmxpYyB2b2lkIHJ1bigpIHsKLSAgICBHZW5lcmF0ZWRNZXNzYWdlLmVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9HZW5lcmF0ZWRNZXNzYWdlVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGFjYjIyMzUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0dlbmVyYXRlZE1lc3NhZ2VUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw5ODAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbEV4dGVuc2lvbnNMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5Vbml0dGVzdEltcG9ydDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5FbnVtV2l0aE5vT3V0ZXI7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTWVzc2FnZVdpdGhOb091dGVyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk11bHRpcGxlRmlsZXNUZXN0UHJvdG87Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTmVzdGVkRXh0ZW5zaW9uLk15TmVzdGVkRXh0ZW5zaW9uOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5lc3RlZEV4dGVuc2lvbkxpdGUuTXlOZXN0ZWRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb24uTWVzc2FnZVRvQmVFeHRlbmRlZDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb24uTXlOb25OZXN0ZWRFeHRlbnNpb247Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Ob25OZXN0ZWRFeHRlbnNpb25MaXRlLk1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0Lk5vbk5lc3RlZEV4dGVuc2lvbkxpdGUuTXlOb25OZXN0ZWRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlNlcnZpY2VXaXRoTm9PdXRlcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RPcHRpbWl6ZWRGb3JTaXplOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0T3B0aW1pemVGb3IuVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdE9wdGltaXplRm9yLlRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemU7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9yZWlnbk1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZU9yQnVpbGRlcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFVucGFja2VkVHlwZXM7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uT2JqZWN0SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuQ29sbGVjdGlvbnM7Ci1pbXBvcnQgamF2YS51dGlsLkxpc3Q7Ci0KLS8qKgotICogVW5pdCB0ZXN0IGZvciBnZW5lcmF0ZWQgbWVzc2FnZXMgYW5kIGdlbmVyYXRlZCBjb2RlLiAgU2VlIGFsc28KLSAqIHtAbGluayBNZXNzYWdlVGVzdH0sIHdoaWNoIHRlc3RzIHNvbWUgZ2VuZXJhdGVkIG1lc3NhZ2UgZnVuY3Rpb25hbGl0eS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgY2xhc3MgR2VuZXJhdGVkTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvblRlc3RlciA9Ci0gICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKSwgbnVsbCk7Ci0KLSAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRJbnN0YW5jZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydFNhbWUoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7Ci0gICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmdldERlZmF1bHRJbnN0YW5jZUZvclR5cGUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVzc2FnZU9yQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VXNpbmdCdWlsZGVyTXVsdGlwbGVUaW1lcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIC8vIHByaW1pdGl2ZSBmaWVsZCBzY2FsYXIgYW5kIHJlcGVhdGVkCi0gICAgYnVpbGRlci5zZXRPcHRpb25hbFNmaXhlZDY0KDEwMCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDEwMCk7Ci0gICAgLy8gZW51bSBmaWVsZCBzY2FsYXIgYW5kIHJlcGVhdGVkCi0gICAgYnVpbGRlci5zZXRPcHRpb25hbEltcG9ydEVudW0oVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfQkFSKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOwotICAgIC8vIHByb3RvIGZpZWxkIHNjYWxhciBhbmQgcmVwZWF0ZWQKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMSkpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygxKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXMgdmFsdWUxID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldFJlcGVhdGVkSW50MzIoMCkpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIsCi0gICAgICAgIHZhbHVlMS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKLSAgICAgICAgdmFsdWUxLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlMS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB0aGF0IGJ1aWxkZXIgZGlkbid0IHVwZGF0ZSBwcmV2aW91c2x5IGNyZWF0ZWQgdmFsdWVzCi0gICAgYnVpbGRlci5zZXRPcHRpb25hbFNmaXhlZDY0KDIwMCk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZEludDMyKDAsIDIwMCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEltcG9ydEVudW0oVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsKLSAgICBidWlsZGVyLnNldFJlcGVhdGVkSW1wb3J0RW51bSgwLCBVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08pOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygyKSk7Ci0gICAgYnVpbGRlci5zZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDAsIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDIpKTsKLQotICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTIgPSBidWlsZGVyLmJ1aWxkKCk7Ci0KLSAgICAvLyBNYWtlIHN1cmUgdmFsdWUxIGRpZG4ndCBjaGFuZ2UuCi0gICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldE9wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwMCwgdmFsdWUxLmdldFJlcGVhdGVkSW50MzIoMCkpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIsCi0gICAgICAgIHZhbHVlMS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUiwKLSAgICAgICAgdmFsdWUxLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIHZhbHVlMS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgdmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKLQotICAgIC8vIE1ha2Ugc3VyZSB2YWx1ZTIgaXMgY29ycmVjdAotICAgIGFzc2VydEVxdWFscygyMDAsIHZhbHVlMi5nZXRPcHRpb25hbFNmaXhlZDY0KCkpOwotICAgIGFzc2VydEVxdWFscygyMDAsIHZhbHVlMi5nZXRSZXBlYXRlZEludDMyKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RJbXBvcnQuSW1wb3J0RW51bS5JTVBPUlRfRk9PLAotICAgICAgICB2YWx1ZTIuZ2V0T3B0aW9uYWxJbXBvcnRFbnVtKCkpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9GT08sCi0gICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEltcG9ydEVudW0oMCkpOwotICAgIGFzc2VydEVxdWFscygyLCB2YWx1ZTIuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIHZhbHVlMi5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKDApLmdldEMoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHJvdG9zU2hhcmVSZXBlYXRlZEFycmF5c0lmRGlkbnRDaGFuZ2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMTAwKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW1wb3J0RW51bShVbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtLklNUE9SVF9CQVIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0KLSAgICBUZXN0QWxsVHlwZXMgdmFsdWUxID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RBbGxUeXBlcyB2YWx1ZTIgPSB2YWx1ZTEudG9CdWlsZGVyKCkuYnVpbGQoKTsKLQotICAgIGFzc2VydFNhbWUodmFsdWUxLmdldFJlcGVhdGVkSW50MzJMaXN0KCksIHZhbHVlMi5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRTYW1lKHZhbHVlMS5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCksCi0gICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCkpOwotICAgIGFzc2VydFNhbWUodmFsdWUxLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCksCi0gICAgICAgIHZhbHVlMi5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlTGlzdCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEFycmF5c0FyZUltbXV0YWJsZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbnQzMigxMDApOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRJbXBvcnRFbnVtKFVuaXR0ZXN0SW1wb3J0LkltcG9ydEVudW0uSU1QT1JUX0JBUik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkSW50MzJMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKGJ1aWxkZXIuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGbG9hdExpc3QoKSk7Ci0KLQotICAgIFRlc3RBbGxUeXBlcyB2YWx1ZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEludDMyTGlzdCgpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZSh2YWx1ZS5nZXRSZXBlYXRlZEltcG9ydEVudW1MaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VMaXN0KCkpOwotICAgIGFzc2VydElzVW5tb2RpZmlhYmxlKHZhbHVlLmdldFJlcGVhdGVkRmxvYXRMaXN0KCkpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydElzVW5tb2RpZmlhYmxlKExpc3Q8Pz4gbGlzdCkgewotICAgIGlmIChsaXN0ID09IENvbGxlY3Rpb25zLmVtcHR5TGlzdCgpKSB7Ci0gICAgICAvLyBPS0FZIC0tIE5lZWQgdG8gY2hlY2sgdGhpcyBiL2MgRW1wdHlMaXN0IGFsbG93cyB5b3UgdG8gY2FsbCBjbGVhci4KLSAgICB9IGVsc2UgewotICAgICAgdHJ5IHsKLSAgICAgICAgbGlzdC5jbGVhcigpOwotICAgICAgICBmYWlsKCJMaXN0IHdhc24ndCBpbW11dGFibGUiKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gZ29vZAotICAgICAgfQotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLnNldE9wdGlvbmFsU3RyaW5nKG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5zZXRPcHRpb25hbEJ5dGVzKG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKSBudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAotICAgICAgICAgIChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CdWlsZGVyKSBudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZyhudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRCeXRlcyhudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKChUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuQnVpbGRlcikgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShudWxsKTsKLSAgICAgIGZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRmllbGRzKGJ1aWxkZXIpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygib25lIik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZFN0cmluZygidHdvIik7Ci0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRTdHJpbmcoMSwgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEJ5dGVzKFRlc3RVdGlsLnRvQnl0ZXMoIm9uZSIpKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkQnl0ZXMoVGVzdFV0aWwudG9CeXRlcygidHdvIikpOwotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLnNldFJlcGVhdGVkQnl0ZXMoMSwgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig0NTYpLmJ1aWxkKCkpOwotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLnNldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgxLCAoVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UpIG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgICB0cnkgewotICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCi0gICAgICAgICAgMSwgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIpIG51bGwpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLQotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTyk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKLSAgICB0cnkgewotICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZE5lc3RlZEVudW0oMSwgbnVsbCk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlcGVhdGVkQXBwZW5kKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0KLSAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkSW50MzIoQXJyYXlzLmFzTGlzdCgxLCAyLCAzLCA0KSk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25FbnVtKEFycmF5cy5hc0xpc3QoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopKTsKLQotICAgIEZvcmVpZ25NZXNzYWdlIGZvcmVpZ25NZXNzYWdlID0KLSAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIpLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5hZGRBbGxSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKEFycmF5cy5hc0xpc3QoZm9yZWlnbk1lc3NhZ2UpKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJMaXN0KCksIEFycmF5cy5hc0xpc3QoMSwgMiwgMywgNCkpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1MaXN0KCksCi0gICAgICAgIEFycmF5cy5hc0xpc3QoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXBlYXRlZEFwcGVuZFJlamVjdHNOdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0KLSAgICBGb3JlaWduTWVzc2FnZSBmb3JlaWduTWVzc2FnZSA9Ci0gICAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDEyKS5idWlsZCgpOwotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCi0gICAgICAgICAgQXJyYXlzLmFzTGlzdChmb3JlaWduTWVzc2FnZSwgKEZvcmVpZ25NZXNzYWdlKSBudWxsKSk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRGb3JlaWduRW51bSgKLSAgICAgICAgICBBcnJheXMuYXNMaXN0KEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBudWxsKSk7Ci0gICAgICBmYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIGJ1aWxkZXIuYWRkQWxsUmVwZWF0ZWRTdHJpbmcoQXJyYXlzLmFzTGlzdCgib25lIiwgbnVsbCkpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBidWlsZGVyLmFkZEFsbFJlcGVhdGVkQnl0ZXMoQXJyYXlzLmFzTGlzdChUZXN0VXRpbC50b0J5dGVzKCJvbmUiKSwgbnVsbCkpOwotICAgICAgZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXR0aW5nRm9yZWlnbk1lc3NhZ2VVc2luZ0J1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLy8gUGFzcyBidWlsZGVyIGZvciBmb3JlaWduIG1lc3NhZ2UgaW5zdGFuY2UuCi0gICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDEyMykpCi0gICAgICAgIC5idWlsZCgpOwotICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZE1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC8vIENyZWF0ZSBleHBlY3RlZCB2ZXJzaW9uIHBhc3NpbmcgZm9yZWlnbiBtZXNzYWdlIGluc3RhbmNlIGV4cGxpY2l0bHkuCi0gICAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKAotICAgICAgICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMTIzKS5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICAvLyBUT0RPKG5nZCk6IFVwZ3JhZGUgdG8gdXNpbmcgcmVhbCAjZXF1YWxzIG1ldGhvZCBvbmNlIGltcGxlbWVudGVkCi0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNldHRpbmdSZXBlYXRlZEZvcmVpZ25NZXNzYWdlVXNpbmdCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC8vIFBhc3MgYnVpbGRlciBmb3IgZm9yZWlnbiBtZXNzYWdlIGluc3RhbmNlLgotICAgICAgICAuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0Qyg0NTYpKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBUZXN0QWxsVHlwZXMgZXhwZWN0ZWRNZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgICAvLyBDcmVhdGUgZXhwZWN0ZWQgdmVyc2lvbiBwYXNzaW5nIGZvcmVpZ24gbWVzc2FnZSBpbnN0YW5jZSBleHBsaWNpdGx5LgotICAgICAgICAuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgKLSAgICAgICAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDQ1NikuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkTWVzc2FnZS50b1N0cmluZygpLCBtZXNzYWdlLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdERlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0Q2xlYXIoVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLmJ1aWxkKCkpOwotCi0gICAgVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzIG1lc3NhZ2UgPQotICAgICAgICBUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBtZXNzYWdlLmdldFV0ZjhTdHJpbmcoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXRJbmZEb3VibGUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKERvdWJsZS5ORUdBVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXROZWdJbmZEb3VibGUoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShEb3VibGUuaXNOYU4obWVzc2FnZS5nZXROYW5Eb3VibGUoKSkpOwotICAgIGFzc2VydEVxdWFscyhGbG9hdC5QT1NJVElWRV9JTkZJTklUWSwgbWVzc2FnZS5nZXRJbmZGbG9hdCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoRmxvYXQuTkVHQVRJVkVfSU5GSU5JVFksIG1lc3NhZ2UuZ2V0TmVnSW5mRmxvYXQoKSk7Ci0gICAgYXNzZXJ0VHJ1ZShGbG9hdC5pc05hTihtZXNzYWdlLmdldE5hbkZsb2F0KCkpKTsKLSAgICBhc3NlcnRFcXVhbHMoIj8gPyA/PyA/PyA/Pz8gPz8vID8/LSIsIG1lc3NhZ2UuZ2V0Q3BwVHJpZ3JhcGgoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRDbGVhcihidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIFRlc3RVdGlsLmFzc2VydENsZWFyKGJ1aWxkZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlZmxlY3Rpb25HZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFV0aWwuc2V0QWxsRmllbGRzKGJ1aWxkZXIpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoYnVpbGRlcik7Ci0KLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRSZWZsZWN0aW9uU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICByZWZsZWN0aW9uVGVzdGVyLm1vZGlmeVJlcGVhdGVkRmllbGRzVmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKGJ1aWxkZXIpOwotCi0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoYnVpbGRlcik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVmbGVjdGlvbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgcmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCi0gICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIHJlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0Q2xlYXJWaWFSZWZsZWN0aW9uKAotICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnVtSW50ZXJmYWNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgYXNzZXJ0VHJ1ZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0RGVmYXVsdE5lc3RlZEVudW0oKQotICAgICAgICBpbnN0YW5jZW9mIFByb3RvY29sTWVzc2FnZUVudW0pOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudW1NYXAoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBJbnRlcm5hbC5FbnVtTGl0ZU1hcDxGb3JlaWduRW51bT4gbWFwID0gRm9yZWlnbkVudW0uaW50ZXJuYWxHZXRWYWx1ZU1hcCgpOwotCi0gICAgZm9yIChGb3JlaWduRW51bSB2YWx1ZSA6IEZvcmVpZ25FbnVtLnZhbHVlcygpKSB7Ci0gICAgICBhc3NlcnRFcXVhbHModmFsdWUsIG1hcC5maW5kVmFsdWVCeU51bWJlcih2YWx1ZS5nZXROdW1iZXIoKSkpOwotICAgIH0KLQotICAgIGFzc2VydFRydWUobWFwLmZpbmRWYWx1ZUJ5TnVtYmVyKDEyMzQ1KSA9PSBudWxsKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVBhY2tlZFRvVW5wYWNrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0VW5wYWNrZWRUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0VW5wYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdFVucGFja2VkVHlwZXMgbWVzc2FnZSA9Ci0gICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKS50b0J5dGVTdHJpbmcoKSkuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRVbnBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVucGFja2VkVG9QYWNrZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UGFja2VkVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdFBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9Ci0gICAgICBidWlsZGVyLm1lcmdlRnJvbShUZXN0VXRpbC5nZXRVbnBhY2tlZFNldCgpLnRvQnl0ZVN0cmluZygpKS5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIEV4dGVuc2lvbnMuCi0KLSAgVGVzdFV0aWwuUmVmbGVjdGlvblRlc3RlciBleHRlbnNpb25zUmVmbGVjdGlvblRlc3RlciA9Ci0gICAgbmV3IFRlc3RVdGlsLlJlZmxlY3Rpb25UZXN0ZXIoVGVzdEFsbEV4dGVuc2lvbnMuZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCkpOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25NZXNzYWdlT3JCdWlsZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlcGVhdGVkU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhidWlsZGVyKTsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvbkRlZmF1bHRzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyKFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRFeHRlbnNpb25zQ2xlYXIoVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25HZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldEFsbEV4dGVuc2lvbnMoYnVpbGRlcik7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihidWlsZGVyKTsKLQotICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbihtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uU2V0dGVycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKLSAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5zZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlcik7Ci0KLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXh0ZW5zaW9uUmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOwotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydFJlZmxlY3Rpb25TZXR0ZXJzUmVqZWN0TnVsbChidWlsZGVyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpOwotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLnNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oYnVpbGRlcik7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIubW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKGJ1aWxkZXIpOwotCi0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChtZXNzYWdlKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25SZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbCgpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0gICAgZXh0ZW5zaW9uc1JlZmxlY3Rpb25UZXN0ZXIuYXNzZXJ0UmVmbGVjdGlvblJlcGVhdGVkU2V0dGVyc1JlamVjdE51bGwoCi0gICAgICAgIGJ1aWxkZXIpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEV4dGVuc2lvblJlZmxlY3Rpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGV4dGVuc2lvbnNSZWZsZWN0aW9uVGVzdGVyLmFzc2VydENsZWFyVmlhUmVmbGVjdGlvbigKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBleHRlbnNpb25zUmVmbGVjdGlvblRlc3Rlci5hc3NlcnRDbGVhclZpYVJlZmxlY3Rpb24oCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXJFeHRlbnNpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBjbGVhckV4dGVuc2lvbigpIGlzIG5vdCBhY3R1YWxseSB1c2VkIGluIFRlc3RVdGlsLCBzbyB0cnkgaXQgbWFudWFsbHkuCi0gICAgYXNzZXJ0RmFsc2UoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpCi0gICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24pCi0gICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDEpCi0gICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pCi0gICAgICAgIC5nZXRFeHRlbnNpb25Db3VudChVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db3B5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgb3JpZ2luYWwgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgY29weSA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIob3JpZ2luYWwpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChjb3B5KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25NZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucyBvcmlnaW5hbCA9Ci0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLm9wdGlvbmFsSW50MzJFeHRlbnNpb24sIDEpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVyZ2VkID0KLSAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnMubmV3QnVpbGRlcigpLm1lcmdlRnJvbShvcmlnaW5hbCkuYnVpbGQoKTsKLSAgICBhc3NlcnRUcnVlKG1lcmdlZC5oYXNFeHRlbnNpb24oVW5pdHRlc3RQcm90by5vcHRpb25hbEludDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAxLCAoaW50KSBtZXJnZWQuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbikpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gTGl0ZSBFeHRlbnNpb25zLgotCi0gIC8vIFdlIHRlc3QgbGl0ZSBleHRlbnNpb25zIGRpcmVjdGx5IGJlY2F1c2UgdGhleSBoYXZlIGEgc2VwYXJhdGUKLSAgLy8gaW1wbGVtZW50YXRpb24gZnJvbSBmdWxsIGV4dGVuc2lvbnMuICBJbiBjb250cmFzdCwgd2UgZG8gbm90IHRlc3QKLSAgLy8gbGl0ZSBmaWVsZHMgZGlyZWN0bHkgc2luY2UgdGhleSBhcmUgaW1wbGVtZW50ZWQgZXhhY3RseSB0aGUgc2FtZSBhcwotICAvLyByZWd1bGFyIGZpZWxkcy4KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbk1lc3NhZ2VPckJ1aWxkZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEV4dGVuc2lvbnNTZXQoYnVpbGRlcik7Ci0KLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25SZXBlYXRlZFNldHRlcnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0VXRpbC5zZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLm1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9ucyhidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZChidWlsZGVyKTsKLQotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIFRlc3RVdGlsLmFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25EZWZhdWx0cygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICAgIFRlc3RVdGlsLmFzc2VydEV4dGVuc2lvbnNDbGVhcihUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyTGl0ZUV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIGNsZWFyRXh0ZW5zaW9uKCkgaXMgbm90IGFjdHVhbGx5IHVzZWQgaW4gVGVzdFV0aWwsIHNvIHRyeSBpdCBtYW51YWxseS4KLSAgICBhc3NlcnRGYWxzZSgKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEpCi0gICAgICAgIC5jbGVhckV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpCi0gICAgICAgIC5oYXNFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlLCAxKQotICAgICAgICAuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKQotICAgICAgICAuZ2V0RXh0ZW5zaW9uQ291bnQoVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGl0ZUV4dGVuc2lvbkNvcHkoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgb3JpZ2luYWwgPSBUZXN0VXRpbC5nZXRBbGxMaXRlRXh0ZW5zaW9uc1NldCgpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBjb3B5ID0KLSAgICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIob3JpZ2luYWwpLmJ1aWxkKCk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChjb3B5KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RMaXRlRXh0ZW5zaW9uTWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG9yaWdpbmFsID0KLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEpLmJ1aWxkKCk7Ci0gICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lcmdlZCA9Ci0gICAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKG9yaWdpbmFsKS5idWlsZCgpOwotICAgIGFzc2VydFRydWUobWVyZ2VkLmhhc0V4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIDEsIChpbnQpIG1lcmdlZC5nZXRFeHRlbnNpb24oVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBtdWx0aXBsZV9maWxlc190ZXN0Ci0KLSAgcHVibGljIHZvaWQgdGVzdE11bHRpcGxlRmlsZXNPcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBXZSBtb3N0bHkganVzdCB3YW50IHRvIGNoZWNrIHRoYXQgdGhpbmdzIGNvbXBpbGUuCi0gICAgTWVzc2FnZVdpdGhOb091dGVyIG1lc3NhZ2UgPQotICAgICAgTWVzc2FnZVdpdGhOb091dGVyLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TmVzdGVkKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRJKDEpKQotICAgICAgICAuYWRkRm9yZWlnbihUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSkpCi0gICAgICAgIC5zZXROZXN0ZWRFbnVtKE1lc3NhZ2VXaXRoTm9PdXRlci5OZXN0ZWRFbnVtLkJBWikKLSAgICAgICAgLnNldEZvcmVpZ25FbnVtKEVudW1XaXRoTm9PdXRlci5CQVIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscyhtZXNzYWdlLCBNZXNzYWdlV2l0aE5vT3V0ZXIucGFyc2VGcm9tKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpKTsKLQotICAgIGFzc2VydEVxdWFscyhNdWx0aXBsZUZpbGVzVGVzdFByb3RvLmdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgTWVzc2FnZVdpdGhOb091dGVyLmdldERlc2NyaXB0b3IoKS5nZXRGaWxlKCkpOwotCi0gICAgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIGZpZWxkID0KLSAgICAgIE1lc3NhZ2VXaXRoTm9PdXRlci5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJmb3JlaWduX2VudW0iKTsKLSAgICBhc3NlcnRFcXVhbHMoRW51bVdpdGhOb091dGVyLkJBUi5nZXRWYWx1ZURlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRGaWVsZChmaWVsZCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKE11bHRpcGxlRmlsZXNUZXN0UHJvdG8uZ2V0RGVzY3JpcHRvcigpLAotICAgICAgICAgICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIuZ2V0RGVzY3JpcHRvcigpLmdldEZpbGUoKSk7Ci0KLSAgICBhc3NlcnRGYWxzZSgKLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpLmhhc0V4dGVuc2lvbigKLSAgICAgICAgTXVsdGlwbGVGaWxlc1Rlc3RQcm90by5leHRlbnNpb25XaXRoT3V0ZXIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RPcHRpb25hbEZpZWxkV2l0aFJlcXVpcmVkU3ViZmllbGRzT3B0aW1pemVkRm9yU2l6ZSgpCi0gICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZSBtZXNzYWdlID0KLSAgICAgICAgVGVzdE9wdGlvbmFsT3B0aW1pemVkRm9yU2l6ZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAotICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5idWlsZFBhcnRpYWwoKQotICAgICAgICApLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIG1lc3NhZ2UgPSBUZXN0T3B0aW9uYWxPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRPKAotICAgICAgICBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKS5zZXRYKDUpLmJ1aWxkUGFydGlhbCgpCi0gICAgICAgICkuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5pbml0aWFsaXplZEV4dGVuc2lvbkluT3B0aW1pemVkRm9yU2l6ZSgpCi0gICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0T3B0aW1pemVkRm9yU2l6ZS5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0T3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCk7Ci0gICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdE9wdGltaXplZEZvclNpemUudGVzdEV4dGVuc2lvbjIsCi0gICAgICAgIFRlc3RSZXF1aXJlZE9wdGltaXplZEZvclNpemUubmV3QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlciA9IFRlc3RPcHRpbWl6ZWRGb3JTaXplLm5ld0J1aWxkZXIoKTsKLSAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0T3B0aW1pemVkRm9yU2l6ZS50ZXN0RXh0ZW5zaW9uMiwKLSAgICAgICAgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZS5uZXdCdWlsZGVyKCkuc2V0WCgxMCkuYnVpbGRQYXJ0aWFsKCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5idWlsZFBhcnRpYWwoKS5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFRvQnVpbGRlcigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQobWVzc2FnZSk7Ci0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RmllbGRDb25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CQl9GSUVMRF9OVU1CRVIsIDEpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuT1BUSU9OQUxfSU5UMzJfRklFTERfTlVNQkVSLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMR1JPVVBfRklFTERfTlVNQkVSLCAxNik7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5PUFRJT05BTF9ORVNURURfTUVTU0FHRV9GSUVMRF9OVU1CRVIsIDE4KTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9FTlVNX0ZJRUxEX05VTUJFUiwgMjEpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLCAzMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFREdST1VQX0ZJRUxEX05VTUJFUiwgNDYpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRklFTERfTlVNQkVSLCA0OCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5SRVBFQVRFRF9ORVNURURfRU5VTV9GSUVMRF9OVU1CRVIsIDUxKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25Db25zdGFudFZhbHVlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlRlc3RSZXF1aXJlZC5TSU5HTEVfRklFTERfTlVNQkVSLCAxMDAwKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5UZXN0UmVxdWlyZWQuTVVMVElfRklFTERfTlVNQkVSLCAxMDAxKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxKTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTEdST1VQX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE2KTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICBVbml0dGVzdFByb3RvLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE4KTsKLSAgICBhc3NlcnRFcXVhbHMoVW5pdHRlc3RQcm90by5PUFRJT05BTF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAyMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfSU5UMzJfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgMzEpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVER1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDYpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgIFVuaXR0ZXN0UHJvdG8uUkVQRUFURURfTkVTVEVEX01FU1NBR0VfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDgpOwotICAgIGFzc2VydEVxdWFscyhVbml0dGVzdFByb3RvLlJFUEVBVEVEX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDUxKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWN1cnNpdmVNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlID0KLSAgICAgICAgVW5pdHRlc3RQcm90by5UZXN0UmVjdXJzaXZlTWVzc2FnZS5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UgIT0gbnVsbCk7Ci0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEEoKSAhPSBudWxsKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0QSgpID09IG1lc3NhZ2UpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RVdGlsLnNldEFsbEZpZWxkcyhidWlsZGVyKTsKLSAgICBUZXN0QWxsVHlwZXMgZXhwZWN0ZWQgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgdHJ5IHsKLSAgICAgIG91dC53cml0ZU9iamVjdChleHBlY3RlZCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLSAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7Ci0gICAgVGVzdEFsbFR5cGVzIGFjdHVhbCA9IChUZXN0QWxsVHlwZXMpIGluLnJlYWRPYmplY3QoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBiYW9zID0gbmV3IEJ5dGVBcnJheU91dHB1dFN0cmVhbSgpOwotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZCA9IGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgT2JqZWN0T3V0cHV0U3RyZWFtIG91dCA9IG5ldyBPYmplY3RPdXRwdXRTdHJlYW0oYmFvcyk7Ci0gICAgdHJ5IHsKLSAgICAgIG91dC53cml0ZU9iamVjdChleHBlY3RlZCk7Ci0gICAgfSBmaW5hbGx5IHsKLSAgICAgIG91dC5jbG9zZSgpOwotICAgIH0KLSAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBiYWlzID0gbmV3IEJ5dGVBcnJheUlucHV0U3RyZWFtKGJhb3MudG9CeXRlQXJyYXkoKSk7Ci0gICAgT2JqZWN0SW5wdXRTdHJlYW0gaW4gPSBuZXcgT2JqZWN0SW5wdXRTdHJlYW0oYmFpcyk7Ci0gICAgVGVzdEFsbFR5cGVzIGFjdHVhbCA9IChUZXN0QWxsVHlwZXMpIGluLnJlYWRPYmplY3QoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQsIGFjdHVhbCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RW51bVZhbHVlcygpIHsKLSAgICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLmdldE51bWJlcigpLAotICAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSX1ZBTFVFKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWi5nZXROdW1iZXIoKSwKLSAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaX1ZBTFVFKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTy5nZXROdW1iZXIoKSwKLSAgICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PX1ZBTFVFKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROb25OZXN0ZWRFeHRlbnNpb25Jbml0aWFsaXphdGlvbigpIHsKLSAgICBhc3NlcnRUcnVlKE5vbk5lc3RlZEV4dGVuc2lvbi5ub25OZXN0ZWRFeHRlbnNpb24KLSAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgaW5zdGFuY2VvZiBNeU5vbk5lc3RlZEV4dGVuc2lvbik7Ci0gICAgYXNzZXJ0RXF1YWxzKCJub25OZXN0ZWRFeHRlbnNpb24iLAotICAgICAgICAgICAgICAgICBOb25OZXN0ZWRFeHRlbnNpb24ubm9uTmVzdGVkRXh0ZW5zaW9uLmdldERlc2NyaXB0b3IoKS5nZXROYW1lKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4dGVuc2lvbkluaXRpYWxpemF0aW9uKCkgewotICAgIGFzc2VydFRydWUoTXlOZXN0ZWRFeHRlbnNpb24ucmVjdXJzaXZlRXh0ZW5zaW9uLmdldE1lc3NhZ2VEZWZhdWx0SW5zdGFuY2UoKQotICAgICAgICAgICAgICAgaW5zdGFuY2VvZiBNZXNzYWdlVG9CZUV4dGVuZGVkKTsKLSAgICBhc3NlcnRFcXVhbHMoInJlY3Vyc2l2ZUV4dGVuc2lvbiIsCi0gICAgICAgICAgICAgICAgIE15TmVzdGVkRXh0ZW5zaW9uLnJlY3Vyc2l2ZUV4dGVuc2lvbi5nZXREZXNjcmlwdG9yKCkuZ2V0TmFtZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROb25OZXN0ZWRFeHRlbnNpb25MaXRlSW5pdGlhbGl6YXRpb24oKSB7Ci0gICAgYXNzZXJ0VHJ1ZShOb25OZXN0ZWRFeHRlbnNpb25MaXRlLm5vbk5lc3RlZEV4dGVuc2lvbkxpdGUKLSAgICAgICAgICAgICAgIC5nZXRNZXNzYWdlRGVmYXVsdEluc3RhbmNlKCkgaW5zdGFuY2VvZiBNeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGUpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5lc3RlZEV4dGVuc2lvbkxpdGVJbml0aWFsaXphdGlvbigpIHsKLSAgICBhc3NlcnRUcnVlKE15TmVzdGVkRXh0ZW5zaW9uTGl0ZS5yZWN1cnNpdmVFeHRlbnNpb25MaXRlCi0gICAgICAgICAgICAgICAuZ2V0TWVzc2FnZURlZmF1bHRJbnN0YW5jZSgpIGluc3RhbmNlb2YgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEludmFsaWRhdGlvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBHZW5lcmF0ZWRNZXNzYWdlLmVuYWJsZUFsd2F5c1VzZUZpZWxkQnVpbGRlcnNGb3JUZXN0aW5nKCk7Ci0gICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UgbmVzdGVkTWVzc2FnZTEgPQotICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKLSAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBuZXN0ZWRNZXNzYWdlMiA9Ci0gICAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5idWlsZCgpOwotCi0gICAgLy8gU2V0IGFsbCB0aHJlZSBmbGF2b3JzIChlbnVtLCBwcmltaXRpdmUsIG1lc3NhZ2UgYW5kIHNpbmd1bGFyL3JlcGVhdGVkKQotICAgIC8vIGFuZCB2ZXJpZnkgbm8gaW52YWxpZGF0aW9ucyBmaXJlZAotICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKLQotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSAoVGVzdEFsbFR5cGVzLkJ1aWxkZXIpCi0gICAgICAgICgoR2VuZXJhdGVkTWVzc2FnZSkgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpKS4KLSAgICAgICAgICAgIG5ld0J1aWxkZXJGb3JUeXBlKG1vY2tQYXJlbnQpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigxKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMSk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZShuZXN0ZWRNZXNzYWdlMSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICAvLyBOb3cgdGVsbCBpdCB3ZSB3YW50IGNoYW5nZXMgYW5kIG1ha2Ugc3VyZSBpdCdzIG9ubHkgZmlyZWQgb25jZQotICAgIC8vIEFuZCBkbyB0aGlzIGZvciBlYWNoIGZsYXZvcgotCi0gICAgLy8gcHJpbWl0aXZlIHNpbmdsZQotICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbEludDMyKDIpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxJbnQzMigzKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLQotICAgIC8vIGVudW0gc2luZ2xlCi0gICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRFbnVtKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICAvLyBtZXNzYWdlIHNpbmdsZQotICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5zZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UobmVzdGVkTWVzc2FnZTIpOwotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLQotICAgIC8vIHByaW1pdGl2ZSByZXBhdGVkCi0gICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkSW50MzIoMik7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEludDMyKDMpOwotICAgIGFzc2VydEVxdWFscyg0LCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gICAgLy8gZW51bSByZXBlYXRlZAotICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZEVudW0oVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkTmVzdGVkRW51bShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOwotICAgIGFzc2VydEVxdWFscyg1LCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotCi0gICAgLy8gbWVzc2FnZSByZXBlYXRlZAotICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UobmVzdGVkTWVzc2FnZTIpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKG5lc3RlZE1lc3NhZ2UxKTsKLSAgICBhc3NlcnRFcXVhbHMoNiwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEludmFsaWRhdGlvbnNfRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKLQotICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IChUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyKQotICAgICAgICAoKEdlbmVyYXRlZE1lc3NhZ2UpIFRlc3RBbGxFeHRlbnNpb25zLmdldERlZmF1bHRJbnN0YW5jZSgpKS4KLSAgICAgICAgICAgIG5ld0J1aWxkZXJGb3JUeXBlKG1vY2tQYXJlbnQpOwotCi0gICAgYnVpbGRlci5hZGRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAxKTsKLSAgICBidWlsZGVyLnNldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDAsIDIpOwotICAgIGJ1aWxkZXIuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLQotICAgIC8vIE5vdyB0ZWxsIGl0IHdlIHdhbnQgY2hhbmdlcyBhbmQgbWFrZSBzdXJlIGl0J3Mgb25seSBmaXJlZCBvbmNlCi0gICAgYnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBidWlsZGVyLmFkZEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24sIDIpOwotICAgIGJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMyk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIGJ1aWxkZXIuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiwgMCwgNCk7Ci0gICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uLCAxLCA1KTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLQotICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5jbGVhckV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkSW50MzJFeHRlbnNpb24pOwotICAgIGJ1aWxkZXIuY2xlYXJFeHRlbnNpb24oVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDMyRXh0ZW5zaW9uKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RCYXNlTWVzc2FnZU9yQnVpbGRlcigpIHsKLSAgICAvLyBNb3N0bHkganVzdCBtYWtlcyBzdXJlIHRoZSBiYXNlIGludGVyZmFjZSBleGlzdHMgYW5kIGhhcyBzb21lIG1ldGhvZHMuCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGVzdEFsbFR5cGVzIG1lc3NhZ2UgPSBidWlsZGVyLmJ1aWxkUGFydGlhbCgpOwotICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlciBidWlsZGVyQXNJbnRlcmZhY2UgPSAoVGVzdEFsbFR5cGVzT3JCdWlsZGVyKSBidWlsZGVyOwotICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlciBtZXNzYWdlQXNJbnRlcmZhY2UgPSAoVGVzdEFsbFR5cGVzT3JCdWlsZGVyKSBtZXNzYWdlOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBtZXNzYWdlQXNJbnRlcmZhY2UuZ2V0RGVmYXVsdEJvb2woKSwKLSAgICAgICAgbWVzc2FnZUFzSW50ZXJmYWNlLmdldERlZmF1bHRCb29sKCkpOwotICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgbWVzc2FnZUFzSW50ZXJmYWNlLmdldE9wdGlvbmFsRG91YmxlKCksCi0gICAgICAgIG1lc3NhZ2VBc0ludGVyZmFjZS5nZXRPcHRpb25hbERvdWJsZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXNzYWdlT3JCdWlsZGVyR2V0dGVycygpIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLQotICAgIC8vIHNpbmdsZSBmaWVsZHMKLSAgICBhc3NlcnRTYW1lKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICBidWlsZGVyLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoKSk7Ci0gICAgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBzdWJCdWlsZGVyID0KLSAgICAgICAgYnVpbGRlci5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlQnVpbGRlcigpOwotICAgIGFzc2VydFNhbWUoc3ViQnVpbGRlciwgYnVpbGRlci5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKCkpOwotCi0gICAgLy8gcmVwZWF0ZWQgZmllbGRzCi0gICAgRm9yZWlnbk1lc3NhZ2UgbTAgPSBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgRm9yZWlnbk1lc3NhZ2UgbTEgPSBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgRm9yZWlnbk1lc3NhZ2UgbTIgPSBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlKG0wKTsKLSAgICBidWlsZGVyLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UobTEpOwotICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZShtMik7Ci0gICAgYXNzZXJ0U2FtZShtMCwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDApKTsKLSAgICBhc3NlcnRTYW1lKG0xLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMSkpOwotICAgIGFzc2VydFNhbWUobTIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigyKSk7Ci0gICAgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBiMCA9IGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUJ1aWxkZXIoMCk7Ci0gICAgRm9yZWlnbk1lc3NhZ2UuQnVpbGRlciBiMSA9IGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZUJ1aWxkZXIoMSk7Ci0gICAgYXNzZXJ0U2FtZShiMCwgYnVpbGRlci5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlT3JCdWlsZGVyKDApKTsKLSAgICBhc3NlcnRTYW1lKGIxLCBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXIoMSkpOwotICAgIGFzc2VydFNhbWUobTIsIGJ1aWxkZXIuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZU9yQnVpbGRlcigyKSk7Ci0KLSAgICBMaXN0PD8gZXh0ZW5kcyBGb3JlaWduTWVzc2FnZU9yQnVpbGRlcj4gbWVzc2FnZU9yQnVpbGRlckxpc3QgPQotICAgICAgICBidWlsZGVyLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VPckJ1aWxkZXJMaXN0KCk7Ci0gICAgYXNzZXJ0U2FtZShiMCwgbWVzc2FnZU9yQnVpbGRlckxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRTYW1lKGIxLCBtZXNzYWdlT3JCdWlsZGVyTGlzdC5nZXQoMSkpOwotICAgIGFzc2VydFNhbWUobTIsIG1lc3NhZ2VPckJ1aWxkZXJMaXN0LmdldCgyKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9MYXp5U3RyaW5nQXJyYXlMaXN0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3RUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDRkY2RjNzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdBcnJheUxpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxMTggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgTGF6eVN0cmluZ0FycmF5TGlzdH0uCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBMYXp5U3RyaW5nQXJyYXlMaXN0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0EgPSAiQSI7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQiA9ICJCIjsKLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19DID0gIkMiOwotCi0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgQllURV9TVFJJTkdfQSA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJBIik7Ci0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgQllURV9TVFJJTkdfQiA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJCIik7Ci0gIHByaXZhdGUgc3RhdGljIEJ5dGVTdHJpbmcgQllURV9TVFJJTkdfQyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJDIik7Ci0KLSAgcHVibGljIHZvaWQgdGVzdEp1c3RTdHJpbmdzKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgbGlzdCA9IG5ldyBMYXp5U3RyaW5nQXJyYXlMaXN0KCk7Ci0gICAgbGlzdC5hZGQoU1RSSU5HX0EpOwotICAgIGxpc3QuYWRkKFNUUklOR19CKTsKLSAgICBsaXN0LmFkZChTVFJJTkdfQyk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMywgbGlzdC5zaXplKCkpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19CLCBsaXN0LmdldCgxKSk7Ci0gICAgYXNzZXJ0U2FtZShTVFJJTkdfQywgbGlzdC5nZXQoMikpOwotCi0gICAgbGlzdC5zZXQoMSwgU1RSSU5HX0MpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0MsIGxpc3QuZ2V0KDEpKTsKLQotICAgIGxpc3QucmVtb3ZlKDEpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QuZ2V0KDApKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19DLCBsaXN0LmdldCgxKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SnVzdEJ5dGVTdHJpbmcoKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCBsaXN0ID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChCWVRFX1NUUklOR19BKTsKLSAgICBsaXN0LmFkZChCWVRFX1NUUklOR19CKTsKLSAgICBsaXN0LmFkZChCWVRFX1NUUklOR19DKTsKLQotICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0gICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19BLCBsaXN0LmdldEJ5dGVTdHJpbmcoMCkpOwotICAgIGFzc2VydFNhbWUoQllURV9TVFJJTkdfQiwgbGlzdC5nZXRCeXRlU3RyaW5nKDEpKTsKLSAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0MsIGxpc3QuZ2V0Qnl0ZVN0cmluZygyKSk7Ci0KLSAgICBsaXN0LnJlbW92ZSgxKTsKLSAgICBhc3NlcnRTYW1lKEJZVEVfU1RSSU5HX0EsIGxpc3QuZ2V0Qnl0ZVN0cmluZygwKSk7Ci0gICAgYXNzZXJ0U2FtZShCWVRFX1NUUklOR19DLCBsaXN0LmdldEJ5dGVTdHJpbmcoMSkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENvbnZlcnNpb25CYWNrQW5kRm9ydGgoKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCBsaXN0ID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKLSAgICBsaXN0LmFkZChTVFJJTkdfQSk7Ci0gICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQik7Ci0gICAgbGlzdC5hZGQoQllURV9TVFJJTkdfQyk7Ci0KLSAgICAvLyBTdHJpbmcgYSBzaG91bGQgYmUgdGhlIHNhbWUgYmVjYXVzZSBpdCB3YXMgb3JpZ2luYWxseSBhIHN0cmluZwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0EsIGxpc3QuZ2V0KDApKTsKLQotICAgIC8vIFN0cmluZyBiIGFuZCBjIHNob3VsZCBiZSBkaWZmZXJlbnQgYmVjYXVzZSB0aGUgc3RyaW5nIGhhcyB0byBiZSBjb21wdXRlZAotICAgIC8vIGZyb20gdGhlIEJ5dGVTdHJpbmcKLSAgICBTdHJpbmcgYlByaW1lID0gbGlzdC5nZXQoMSk7Ci0gICAgYXNzZXJ0Tm90U2FtZShTVFJJTkdfQiwgYlByaW1lKTsKLSAgICBhc3NlcnRFcXVhbHMoU1RSSU5HX0IsIGJQcmltZSk7Ci0gICAgU3RyaW5nIGNQcmltZSA9IGxpc3QuZ2V0KDIpOwotICAgIGFzc2VydE5vdFNhbWUoU1RSSU5HX0MsIGNQcmltZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFNUUklOR19DLCBjUHJpbWUpOwotCi0gICAgLy8gU3RyaW5nIGMgYW5kIGMgc2hvdWxkIHN0YXkgdGhlIHNhbWUgb25jZSBjYWNoZWQuCi0gICAgYXNzZXJ0U2FtZShiUHJpbWUsIGxpc3QuZ2V0KDEpKTsKLSAgICBhc3NlcnRTYW1lKGNQcmltZSwgbGlzdC5nZXQoMikpOwotCi0gICAgLy8gQnl0ZVN0cmluZyBuZWVkcyB0byBiZSBjb21wdXRlZCBmcm9tIHN0cmluZyBmb3IgYm90aCBhIGFuZCBiCi0gICAgQnl0ZVN0cmluZyBhUHJpbWVCeXRlU3RyaW5nID0gbGlzdC5nZXRCeXRlU3RyaW5nKDApOwotICAgIGFzc2VydEVxdWFscyhCWVRFX1NUUklOR19BLCBhUHJpbWVCeXRlU3RyaW5nKTsKLSAgICBCeXRlU3RyaW5nIGJQcmltZUJ5dGVTdHJpbmcgPSBsaXN0LmdldEJ5dGVTdHJpbmcoMSk7Ci0gICAgYXNzZXJ0Tm90U2FtZShCWVRFX1NUUklOR19CLCBiUHJpbWVCeXRlU3RyaW5nKTsKLSAgICBhc3NlcnRFcXVhbHMoQllURV9TVFJJTkdfQiwgbGlzdC5nZXRCeXRlU3RyaW5nKDEpKTsKLQotICAgIC8vIE9uY2UgY2FjaGVkLCBCeXRlU3RyaW5nIHNob3VsZCBzdGF5IGNhY2hlZC4KLSAgICBhc3NlcnRTYW1lKGFQcmltZUJ5dGVTdHJpbmcsIGxpc3QuZ2V0Qnl0ZVN0cmluZygwKSk7Ci0gICAgYXNzZXJ0U2FtZShiUHJpbWVCeXRlU3RyaW5nLCBsaXN0LmdldEJ5dGVTdHJpbmcoMSkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0VuZFRvRW5kVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xhenlTdHJpbmdFbmRUb0VuZFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZTY4NzBiNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGF6eVN0cmluZ0VuZFRvRW5kVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTE1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotCi1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uSU9FeGNlcHRpb247Ci0KLS8qKgotICogVGVzdHMgdG8gbWFrZSBzdXJlIHRoZSBsYXp5IGNvbnZlcnNpb24gb2YgVVRGOC1lbmNvZGVkIGJ5dGUgYXJyYXlzIHRvCi0gKiBzdHJpbmdzIHdvcmtzIGNvcnJlY3RseS4KLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqLwotcHVibGljIGNsYXNzIExhenlTdHJpbmdFbmRUb0VuZFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4ID0KLSAgICAgIEJ5dGVTdHJpbmcuY29weUZyb20obmV3IGJ5dGVbXSB7Ci0gICAgICAgICAgMTE0LCA0LCAtMSwgMCwgLTEsIDAsIC0zMCwgMiwgNCwgLTEsCi0gICAgICAgICAgMCwgLTEsIDAsIC0zMCwgMiwgNCwgLTEsIDAsIC0xLCAwLCB9KTsKLQotICAvKioKLSAgICogVGVzdHMgdGhhdCBhbiBpbnZhbGlkIFVURjggc3RyaW5nIHdpbGwgcm91bmR0cmlwIHRocm91Z2ggYSBwYXJzZQotICAgKiBhbmQgc2VyaWFsaXphdGlvbi4KLSAgICovCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFuZFNlcmlhbGl6ZSgpIHRocm93cyBJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gewotICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzIHRWMiA9IFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLnBhcnNlRnJvbSgKLSAgICAgICAgVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCk7Ci0gICAgQnl0ZVN0cmluZyBieXRlcyA9IHRWMi50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRFcXVhbHMoVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOCwgYnl0ZXMpOwotCi0gICAgdFYyLmdldE9wdGlvbmFsU3RyaW5nKCk7Ci0gICAgYnl0ZXMgPSB0VjIudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjgsIGJ5dGVzKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFuZFdyaXRlKCkgdGhyb3dzIElPRXhjZXB0aW9uIHsKLSAgICBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcyB0VjIgPSBVbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlcy5wYXJzZUZyb20oCi0gICAgICAgIFRFU1RfQUxMX1RZUEVTX1NFUklBTElaRURfV0lUSF9JTExFR0FMX1VURjgpOwotICAgIGJ5dGVbXSBzaW5rID0gbmV3IGJ5dGVbVEVTVF9BTExfVFlQRVNfU0VSSUFMSVpFRF9XSVRIX0lMTEVHQUxfVVRGOC5zaXplKCldOwotICAgIENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKHNpbmspOwotICAgIHRWMi53cml0ZVRvKG91dHB1dFN0cmVhbSk7Ci0gICAgb3V0cHV0U3RyZWFtLmZsdXNoKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgICBURVNUX0FMTF9UWVBFU19TRVJJQUxJWkVEX1dJVEhfSUxMRUdBTF9VVEY4LAotICAgICAgICBCeXRlU3RyaW5nLmNvcHlGcm9tKHNpbmspKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDYWNoaW5nKCkgewotICAgIFN0cmluZyBhID0gImEiOwotICAgIFN0cmluZyBiID0gImIiOwotICAgIFN0cmluZyBjID0gImMiOwotICAgIFVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzIHByb3RvID0gVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbFN0cmluZyhhKQotICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoYikKLSAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKGMpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgLy8gU3RyaW5nIHNob3VsZCBiZSB0aGUgb25lIHdlIHBhc3NlZCBpdC4KLSAgICBhc3NlcnRTYW1lKGEsIHByb3RvLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICAgIGFzc2VydFNhbWUoYiwgcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmcoMCkpOwotICAgIGFzc2VydFNhbWUoYywgcHJvdG8uZ2V0UmVwZWF0ZWRTdHJpbmcoMSkpOwotCi0KLSAgICAvLyBUaGVyZSdzIG5vIHdheSB0byBkaXJlY3RseSBvYnNlcnZlIHRoYXQgdGhlIEJ5dGVTdHJpbmcgaXMgY2FjaGVkCi0gICAgLy8gY29ycmVjdGx5IG9uIHNlcmlhbGl6YXRpb24sIGJ1dCB3ZSBjYW4gb2JzZXJ2ZSB0aGF0IGl0IGhhZCB0byByZWNvbXB1dGUKLSAgICAvLyB0aGUgc3RyaW5nIGFmdGVyIHNlcmlhbGl6YXRpb24uCi0gICAgcHJvdG8udG9CeXRlU3RyaW5nKCk7Ci0gICAgU3RyaW5nIGFQcmltZSA9IHByb3RvLmdldE9wdGlvbmFsU3RyaW5nKCk7Ci0gICAgYXNzZXJ0Tm90U2FtZShhLCBhUHJpbWUpOwotICAgIGFzc2VydEVxdWFscyhhLCBhUHJpbWUpOwotICAgIFN0cmluZyBiUHJpbWUgPSBwcm90by5nZXRSZXBlYXRlZFN0cmluZygwKTsKLSAgICBhc3NlcnROb3RTYW1lKGIsIGJQcmltZSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGIsIGJQcmltZSk7Ci0gICAgU3RyaW5nIGNQcmltZSA9IHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDEpOwotICAgIGFzc2VydE5vdFNhbWUoYywgY1ByaW1lKTsKLSAgICBhc3NlcnRFcXVhbHMoYywgY1ByaW1lKTsKLQotICAgIC8vIEFuZCBub3cgdGhlIHN0cmluZyBzaG91bGQgc3RheSBjYWNoZWQuCi0gICAgYXNzZXJ0U2FtZShhUHJpbWUsIHByb3RvLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICAgIGFzc2VydFNhbWUoYlByaW1lLCBwcm90by5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYXNzZXJ0U2FtZShjUHJpbWUsIHByb3RvLmdldFJlcGVhdGVkU3RyaW5nKDEpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL0xpdGVUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggODM5Njk0ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTGl0ZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDE0OCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsVHlwZXNMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RBbGxFeHRlbnNpb25zTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0TmVzdGVkRXh0ZW5zaW9uTGl0ZTsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5SW5wdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5CeXRlQXJyYXlPdXRwdXRTdHJlYW07Ci1pbXBvcnQgamF2YS5pby5PYmplY3RJbnB1dFN0cmVhbTsKLWltcG9ydCBqYXZhLmlvLk9iamVjdE91dHB1dFN0cmVhbTsKLQotLyoqCi0gKiBUZXN0IGxpdGUgcnVudGltZS4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgY2xhc3MgTGl0ZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIHB1YmxpYyB2b2lkIHNldFVwKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCB0aGF0IG5lc3RlZCBleHRlbnNpb25zIGFyZSBpbml0aWFsaXplZCBjb3JyZWN0bHkgZXZlbiBpZiB0aGUgb3V0ZXIKLSAgICAvLyBjbGFzcyBoYXMgbm90IGJlZW4gYWNjZXNzZWQgZGlyZWN0bHkuICBUaGlzIHdhcyBvbmNlIGEgYnVnIHdpdGggbGl0ZQotICAgIC8vIG1lc3NhZ2VzLgotICAgIC8vCi0gICAgLy8gV2UgcHV0IHRoaXMgaW4gc2V0VXAoKSByYXRoZXIgdGhhbiBpbiBpdHMgb3duIHRlc3QgbWV0aG9kIGJlY2F1c2Ugd2UKLSAgICAvLyBuZWVkIHRvIG1ha2Ugc3VyZSBpdCBydW5zIGJlZm9yZSBhbnkgYWN0dWFsIHRlc3RzLgotICAgIGFzc2VydFRydWUoVGVzdE5lc3RlZEV4dGVuc2lvbkxpdGUubmVzdGVkRXh0ZW5zaW9uICE9IG51bGwpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBTaW5jZSBsaXRlIG1lc3NhZ2VzIGFyZSBhIHN1YnNldCBvZiByZWd1bGFyIG1lc3NhZ2VzLCB3ZSBjYW4gbW9zdGx5Ci0gICAgLy8gYXNzdW1lIHRoYXQgdGhlIGZ1bmN0aW9uYWxpdHkgb2YgbGl0ZSBtZXNzYWdlcyBpcyBhbHJlYWR5IHRob3JvdWdobHkKLSAgICAvLyB0ZXN0ZWQgYnkgdGhlIHJlZ3VsYXIgdGVzdHMuICBBbGwgdGhpcyB0ZXN0IHJlYWxseSB2ZXJpZmllcyBpcyB0aGF0Ci0gICAgLy8gYSBwcm90byB3aXRoIG9wdGltaXplX2ZvciA9IExJVEVfUlVOVElNRSBjb21waWxlcyBjb3JyZWN0bHkgd2hlbgotICAgIC8vIGxpbmtlZCBvbmx5IGFnYWluc3QgdGhlIGxpdGUgbGlicmFyeS4gIFRoYXQgaXMgYWxsIHRlc3RlZCBhdCBjb21waWxlCi0gICAgLy8gdGltZSwgbGVhdmluZyBub3QgbXVjaCB0byBkbyBpbiB0aGlzIG1ldGhvZC4gIExldCdzIGp1c3QgZG8gc29tZSByYW5kb20KLSAgICAvLyBzdHVmZiB0byBtYWtlIHN1cmUgdGhlIGxpdGUgbWVzc2FnZSBpcyBhY3R1YWxseSBoZXJlIGFuZCB1c2FibGUuCi0KLSAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UgPQotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxJbnQzMigxMjMpCi0gICAgICAgICAgICAgICAgICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJoZWxsbyIpCi0gICAgICAgICAgICAgICAgICAgICAgLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig3KSkKLSAgICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UyID0gVGVzdEFsbFR5cGVzTGl0ZS5wYXJzZUZyb20oZGF0YSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlMi5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZ0NvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlMi5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDcsIG1lc3NhZ2UyLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldEJiKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpdGVFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVE9ETyhrZW50b24pOiAgVW5saWtlIG90aGVyIGZlYXR1cmVzIG9mIHRoZSBsaXRlIGxpYnJhcnksIGV4dGVuc2lvbnMgYXJlCi0gICAgLy8gICBpbXBsZW1lbnRlZCBjb21wbGV0ZWx5IGRpZmZlcmVudGx5IGZyb20gdGhlIHJlZ3VsYXIgbGlicmFyeS4gIFdlCi0gICAgLy8gICBzaG91bGQgcHJvYmFibHkgdGVzdCB0aGVtIG1vcmUgdGhvcm91Z2hseS4KLQotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlID0KLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUsIDEyMykKLSAgICAgICAgLmFkZEV4dGVuc2lvbihVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAiaGVsbG8iKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0TGl0ZS5vcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWikKLSAgICAgICAgLnNldEV4dGVuc2lvbihVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNykuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICAvLyBUZXN0IGNvcHlpbmcgYSBtZXNzYWdlLCBzaW5jZSBjb3BpbmcgZXh0ZW5zaW9ucyBhY3R1YWxseSBkb2VzIHVzZSBhCi0gICAgLy8gZGlmZmVyZW50IGNvZGUgcGF0aCBiZXR3ZWVuIGxpdGUgYW5kIHJlZ3VsYXIgbGlicmFyaWVzLCBhbmQgYXMgb2YgdGhpcwotICAgIC8vIHdyaXRpbmcsIHBhcnNpbmcgaGFzbid0IGJlZW4gaW1wbGVtZW50ZWQgeWV0LgotICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBtZXNzYWdlMiA9IG1lc3NhZ2UudG9CdWlsZGVyKCkuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscygxMjMsIChpbnQpIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKLSAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbkNvdW50KAotICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKLSAgICAgICAgVW5pdHRlc3RMaXRlLnJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImhlbGxvIiwgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAotICAgICAgICBVbml0dGVzdExpdGUucmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVosIG1lc3NhZ2UyLmdldEV4dGVuc2lvbigKLSAgICAgICAgVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHMoNywgbWVzc2FnZTIuZ2V0RXh0ZW5zaW9uKAotICAgICAgICBVbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSkuZ2V0QmIoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIGJhb3MgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgVGVzdEFsbFR5cGVzTGl0ZSBleHBlY3RlZCA9Ci0gICAgICBUZXN0QWxsVHlwZXNMaXRlLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgICAgICAgIC5zZXRPcHRpb25hbEludDMyKDEyMykKLSAgICAgICAgICAgICAgICAgICAgICAuYWRkUmVwZWF0ZWRTdHJpbmcoImhlbGxvIikKLSAgICAgICAgICAgICAgICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAotICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDcpKQotICAgICAgICAgICAgICAgICAgICAgIC5idWlsZCgpOwotICAgIE9iamVjdE91dHB1dFN0cmVhbSBvdXQgPSBuZXcgT2JqZWN0T3V0cHV0U3RyZWFtKGJhb3MpOwotICAgIHRyeSB7Ci0gICAgICBvdXQud3JpdGVPYmplY3QoZXhwZWN0ZWQpOwotICAgIH0gZmluYWxseSB7Ci0gICAgICBvdXQuY2xvc2UoKTsKLSAgICB9Ci0gICAgQnl0ZUFycmF5SW5wdXRTdHJlYW0gYmFpcyA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShiYW9zLnRvQnl0ZUFycmF5KCkpOwotICAgIE9iamVjdElucHV0U3RyZWFtIGluID0gbmV3IE9iamVjdElucHV0U3RyZWFtKGJhaXMpOwotICAgIFRlc3RBbGxUeXBlc0xpdGUgYWN0dWFsID0gKFRlc3RBbGxUeXBlc0xpdGUpIGluLnJlYWRPYmplY3QoKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0T3B0aW9uYWxJbnQzMigpLCBhY3R1YWwuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpLAotICAgICAgICBhY3R1YWwuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWQuZ2V0UmVwZWF0ZWRTdHJpbmcoMCksCi0gICAgICAgIGFjdHVhbC5nZXRSZXBlYXRlZFN0cmluZygwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGV4cGVjdGVkLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgpLmdldEJiKCksCi0gICAgICAgIGFjdHVhbC5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UoKS5nZXRCYigpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL01lc3NhZ2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzJmNDdlYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTWVzc2FnZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMxMyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFJlcXVpcmVkRm9yZWlnbjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25NZXNzYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIE1pc2MuIHVuaXQgdGVzdHMgZm9yIG1lc3NhZ2Ugb3BlcmF0aW9ucyB0aGF0IGFwcGx5IHRvIGJvdGggZ2VuZXJhdGVkCi0gKiBhbmQgZHluYW1pYyBtZXNzYWdlcy4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIEtlbnRvbiBWYXJkYQotICovCi1wdWJsaWMgY2xhc3MgTWVzc2FnZVRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0gIC8vIE1lc3NhZ2UtbWVyZ2luZyB0ZXN0cy4KLQotICBzdGF0aWMgZmluYWwgVGVzdEFsbFR5cGVzIE1FUkdFX1NPVVJDRSA9Ci0gICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgLnNldE9wdGlvbmFsSW50MzIoMSkKLSAgICAgIC5zZXRPcHRpb25hbFN0cmluZygiZm9vIikKLSAgICAgIC5zZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKEZvcmVpZ25NZXNzYWdlLmdldERlZmF1bHRJbnN0YW5jZSgpKQotICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJiYXIiKQotICAgICAgLmJ1aWxkKCk7Ci0KLSAgc3RhdGljIGZpbmFsIFRlc3RBbGxUeXBlcyBNRVJHRV9ERVNUID0KLSAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAuc2V0T3B0aW9uYWxJbnQ2NCgyKQotICAgICAgLnNldE9wdGlvbmFsU3RyaW5nKCJiYXoiKQotICAgICAgLnNldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMykuYnVpbGQoKSkKLSAgICAgIC5hZGRSZXBlYXRlZFN0cmluZygicXV4IikKLSAgICAgIC5idWlsZCgpOwotCi0gIHN0YXRpYyBmaW5hbCBTdHJpbmcgTUVSR0VfUkVTVUxUX1RFWFQgPQotICAgICAgIm9wdGlvbmFsX2ludDMyOiAxXG4iICsKLSAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIiArCi0gICAgICAib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiXG4iICsKLSAgICAgICJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2Uge1xuIiArCi0gICAgICAiICBjOiAzXG4iICsKLSAgICAgICJ9XG4iICsKLSAgICAgICJyZXBlYXRlZF9zdHJpbmc6IFwicXV4XCJcbiIgKwotICAgICAgInJlcGVhdGVkX3N0cmluZzogXCJiYXJcIlxuIjsKLQotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzIHJlc3VsdCA9Ci0gICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcihNRVJHRV9ERVNUKQotICAgICAgICAubWVyZ2VGcm9tKE1FUkdFX1NPVVJDRSkuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscyhNRVJHRV9SRVNVTFRfVEVYVCwgcmVzdWx0LnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFRlc3QgbWVyZ2luZyBhIER5bmFtaWNNZXNzYWdlIGludG8gYSBHZW5lcmF0ZWRNZXNzYWdlLiAgQXMgbG9uZyBhcyB0aGV5Ci0gICAqIGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciwgdGhpcyBzaG91bGQgd29yaywgYnV0IGl0IGlzIGFuIGVudGlyZWx5IGRpZmZlcmVudAotICAgKiBjb2RlIHBhdGguCi0gICAqLwotICBwdWJsaWMgdm9pZCB0ZXN0TWVyZ2VGcm9tRHluYW1pYygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcyByZXN1bHQgPQotICAgICAgVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoTUVSR0VfREVTVCkKLSAgICAgICAgLm1lcmdlRnJvbShEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKE1FUkdFX1NPVVJDRSkuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoTUVSR0VfUkVTVUxUX1RFWFQsIHJlc3VsdC50b1N0cmluZygpKTsKLSAgfQotCi0gIC8qKiBUZXN0IG1lcmdpbmcgdHdvIER5bmFtaWNNZXNzYWdlcy4gKi8KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEeW5hbWljTWVzc2FnZSByZXN1bHQgPQotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihNRVJHRV9ERVNUKQotICAgICAgICAubWVyZ2VGcm9tKER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoTUVSR0VfU09VUkNFKS5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscyhNRVJHRV9SRVNVTFRfVEVYVCwgcmVzdWx0LnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gUmVxdWlyZWQtZmllbGQtcmVsYXRlZCB0ZXN0cy4KLQotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBUZXN0UmVxdWlyZWQgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEID0KLSAgICBUZXN0UmVxdWlyZWQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIFRlc3RSZXF1aXJlZCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEID0KLSAgICBUZXN0UmVxdWlyZWQubmV3QnVpbGRlcigpLnNldEEoMSkuc2V0QigyKS5zZXRDKDMpLmJ1aWxkKCk7Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFJlcXVpcmVkLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCk7Ci0KLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0gICAgYnVpbGRlci5zZXRBKDEpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBidWlsZGVyLnNldEIoMSk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICAgIGJ1aWxkZXIuc2V0QygxKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZEZvcmVpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0UmVxdWlyZWRGb3JlaWduLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpOwotCi0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuc2V0T3B0aW9uYWxNZXNzYWdlKFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldFJlcGVhdGVkTWVzc2FnZSgwLCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXF1aXJlZEV4dGVuc2lvbigpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKLQotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRFeHRlbnNpb24oVGVzdFJlcXVpcmVkLnNpbmdsZSwgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0UmVxdWlyZWQuc2luZ2xlLCBURVNUX1JFUVVJUkVEX0lOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRUcnVlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuYWRkRXh0ZW5zaW9uKFRlc3RSZXF1aXJlZC5tdWx0aSwgVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKTsKLSAgICBhc3NlcnRGYWxzZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldEV4dGVuc2lvbihUZXN0UmVxdWlyZWQubXVsdGksIDAsIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkRHluYW1pYygpIHRocm93cyBFeGNlcHRpb24gewotICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RSZXF1aXJlZC5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRHluYW1pY01lc3NhZ2UuQnVpbGRlciBidWlsZGVyID0gRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihkZXNjcmlwdG9yKTsKLQotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJhIiksIDEpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJiIiksIDEpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLSAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJjIiksIDEpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFJlcXVpcmVkRHluYW1pY0ZvcmVpZ24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0UmVxdWlyZWRGb3JlaWduLmdldERlc2NyaXB0b3IoKTsKLSAgICBEeW5hbWljTWVzc2FnZS5CdWlsZGVyIGJ1aWxkZXIgPSBEeW5hbWljTWVzc2FnZS5uZXdCdWlsZGVyKGRlc2NyaXB0b3IpOwotCi0gICAgYXNzZXJ0VHJ1ZShidWlsZGVyLmlzSW5pdGlhbGl6ZWQoKSk7Ci0KLSAgICBidWlsZGVyLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9tZXNzYWdlIiksCi0gICAgICAgICAgICAgICAgICAgICBURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpOwotICAgIGFzc2VydEZhbHNlKGJ1aWxkZXIuaXNJbml0aWFsaXplZCgpKTsKLQotICAgIGJ1aWxkZXIuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX21lc3NhZ2UiKSwKLSAgICAgICAgICAgICAgICAgICAgIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9tZXNzYWdlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCk7Ci0gICAgYXNzZXJ0RmFsc2UoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotCi0gICAgYnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9tZXNzYWdlIiksIDAsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRFU1RfUkVRVUlSRURfSU5JVElBTElaRUQpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFVuaW5pdGlhbGl6ZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgVGVzdFJlcXVpcmVkLm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChVbmluaXRpYWxpemVkTWVzc2FnZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMoIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsIGIsIGMiLCBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJ1aWxkUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFdlJ3JlIG1vc3RseSB0ZXN0aW5nIHRoYXQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICBUZXN0UmVxdWlyZWQgbWVzc2FnZSA9IFRlc3RSZXF1aXJlZC5uZXdCdWlsZGVyKCkuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5lc3RlZFVuaW5pdGlhbGl6ZWRFeGNlcHRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCi0gICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQotICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKLSAgICAgICAgLmJ1aWxkKCk7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKFVuaW5pdGlhbGl6ZWRNZXNzYWdlRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIgKwotICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5hLCAiICsKLSAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYiwgIiArCi0gICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmMsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5hLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYiwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmMsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5hLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYiwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmMiLAotICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEJ1aWxkTmVzdGVkUGFydGlhbCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFdlJ3JlIG1vc3RseSB0ZXN0aW5nIHRoYXQgbm8gZXhjZXB0aW9uIGlzIHRocm93bi4KLSAgICBUZXN0UmVxdWlyZWRGb3JlaWduIG1lc3NhZ2UgPQotICAgICAgVGVzdFJlcXVpcmVkRm9yZWlnbi5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCi0gICAgICAgIC5hZGRSZXBlYXRlZE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQotICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKLSAgICAgICAgLmJ1aWxkUGFydGlhbCgpOwotICAgIGFzc2VydEZhbHNlKG1lc3NhZ2UuaXNJbml0aWFsaXplZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVuaXRpdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgVGVzdFJlcXVpcmVkLnBhcnNlRnJvbShCeXRlU3RyaW5nLkVNUFRZKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VOZXN0ZWRVbml0aXRpYWxpemVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgQnl0ZVN0cmluZyBkYXRhID0KLSAgICAgIFRlc3RSZXF1aXJlZEZvcmVpZ24ubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbE1lc3NhZ2UoVEVTVF9SRVFVSVJFRF9VTklOSVRJQUxJWkVEKQotICAgICAgICAuYWRkUmVwZWF0ZWRNZXNzYWdlKFRFU1RfUkVRVUlSRURfVU5JTklUSUFMSVpFRCkKLSAgICAgICAgLmFkZFJlcGVhdGVkTWVzc2FnZShURVNUX1JFUVVJUkVEX1VOSU5JVElBTElaRUQpCi0gICAgICAgIC5idWlsZFBhcnRpYWwoKS50b0J5dGVTdHJpbmcoKTsKLQotICAgIHRyeSB7Ci0gICAgICBUZXN0UmVxdWlyZWRGb3JlaWduLnBhcnNlRnJvbShkYXRhKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscygKLSAgICAgICAgIk1lc3NhZ2UgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICIgKwotICAgICAgICAib3B0aW9uYWxfbWVzc2FnZS5hLCAiICsKLSAgICAgICAgIm9wdGlvbmFsX21lc3NhZ2UuYiwgIiArCi0gICAgICAgICJvcHRpb25hbF9tZXNzYWdlLmMsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVswXS5hLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMF0uYiwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzBdLmMsICIgKwotICAgICAgICAicmVwZWF0ZWRfbWVzc2FnZVsxXS5hLCAiICsKLSAgICAgICAgInJlcGVhdGVkX21lc3NhZ2VbMV0uYiwgIiArCi0gICAgICAgICJyZXBlYXRlZF9tZXNzYWdlWzFdLmMiLAotICAgICAgICBlLmdldE1lc3NhZ2UoKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNVbmluaXRpYWxpemVkRXhjZXB0aW9uKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgdHJ5IHsKLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKSkuYnVpbGQoKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24gZSkgewotICAgICAgYXNzZXJ0RXF1YWxzKCJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBhLCBiLCBjIiwgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3REeW5hbWljQnVpbGRQYXJ0aWFsKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gV2UncmUgbW9zdGx5IHRlc3RpbmcgdGhhdCBubyBleGNlcHRpb24gaXMgdGhyb3duLgotICAgIER5bmFtaWNNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgRHluYW1pY01lc3NhZ2UubmV3QnVpbGRlcihUZXN0UmVxdWlyZWQuZ2V0RGVzY3JpcHRvcigpKQotICAgICAgICAuYnVpbGRQYXJ0aWFsKCk7Ci0gICAgYXNzZXJ0RmFsc2UobWVzc2FnZS5pc0luaXRpYWxpemVkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdER5bmFtaWNQYXJzZVVuaXRpdGlhbGl6ZWQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICB0cnkgewotICAgICAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yID0gVGVzdFJlcXVpcmVkLmdldERlc2NyaXB0b3IoKTsKLSAgICAgIER5bmFtaWNNZXNzYWdlLnBhcnNlRnJvbShkZXNjcmlwdG9yLCBCeXRlU3RyaW5nLkVNUFRZKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscygiTWVzc2FnZSBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogYSwgYiwgYyIsIGUuZ2V0TWVzc2FnZSgpKTsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OZXN0ZWRCdWlsZGVyc1Rlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9OZXN0ZWRCdWlsZGVyc1Rlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZjUzNzU4MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvTmVzdGVkQnVpbGRlcnNUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxODUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVmVoaWNsZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5XaGVlbDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotaW1wb3J0IGphdmEudXRpbC5BcnJheUxpc3Q7Ci0KLS8qKgotICogVGVzdCBjYXNlcyB0aGF0IGV4ZXJjaXNlIGVuZC10by1lbmQgdXNlIGNhc2VzIGludm9sdmluZwotICoge0BsaW5rIFNpbmdsZUZpZWxkQnVpbGRlcn0gYW5kIHtAbGluayBSZXBlYXRlZEZpZWxkQnVpbGRlcn0uCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBOZXN0ZWRCdWlsZGVyc1Rlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VzQW5kQnVpbGRlcnMoKSB7Ci0gICAgVmVoaWNsZS5CdWlsZGVyIHZlaGljbGVCdWlsZGVyID0gVmVoaWNsZS5uZXdCdWlsZGVyKCk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cyg0KQotICAgICAgICAuc2V0V2lkdGgoMSk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cyg0KQotICAgICAgICAuc2V0V2lkdGgoMik7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cyg0KQotICAgICAgICAuc2V0V2lkdGgoMyk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuYWRkV2hlZWxCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cyg0KQotICAgICAgICAuc2V0V2lkdGgoNCk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIuZ2V0RW5naW5lQnVpbGRlcigpCi0gICAgICAgIC5zZXRMaXRlcnMoMTApOwotCi0gICAgVmVoaWNsZSB2ZWhpY2xlID0gdmVoaWNsZUJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoNCwgdmVoaWNsZS5nZXRXaGVlbENvdW50KCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICBXaGVlbCB3aGVlbCA9IHZlaGljbGUuZ2V0V2hlZWwoaSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNCwgd2hlZWwuZ2V0UmFkaXVzKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKGkgKyAxLCB3aGVlbC5nZXRXaWR0aCgpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDEwLCB2ZWhpY2xlLmdldEVuZ2luZSgpLmdldExpdGVycygpKTsKLQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNDsgaSsrKSB7Ci0gICAgICB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbEJ1aWxkZXIoaSkKLSAgICAgICAgICAuc2V0UmFkaXVzKDUpCi0gICAgICAgICAgLnNldFdpZHRoKGkgKyAxMCk7Ci0gICAgfQotICAgIHZlaGljbGVCdWlsZGVyLmdldEVuZ2luZUJ1aWxkZXIoKS5zZXRMaXRlcnMoMjApOwotCi0gICAgdmVoaWNsZSA9IHZlaGljbGVCdWlsZGVyLmJ1aWxkKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA0OyBpKyspIHsKLSAgICAgIFdoZWVsIHdoZWVsID0gdmVoaWNsZS5nZXRXaGVlbChpKTsKLSAgICAgIGFzc2VydEVxdWFscyg1LCB3aGVlbC5nZXRSYWRpdXMoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoaSArIDEwLCB3aGVlbC5nZXRXaWR0aCgpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDIwLCB2ZWhpY2xlLmdldEVuZ2luZSgpLmdldExpdGVycygpKTsKLSAgICBhc3NlcnRUcnVlKHZlaGljbGUuaGFzRW5naW5lKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lc3NhZ2VzQXJlQ2FjaGVkKCkgewotICAgIFZlaGljbGUuQnVpbGRlciB2ZWhpY2xlQnVpbGRlciA9IFZlaGljbGUubmV3QnVpbGRlcigpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoMSkKLSAgICAgICAgLnNldFdpZHRoKDIpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoMykKLSAgICAgICAgLnNldFdpZHRoKDQpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoNSkKLSAgICAgICAgLnNldFdpZHRoKDYpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsQnVpbGRlcigpCi0gICAgICAgIC5zZXRSYWRpdXMoNykKLSAgICAgICAgLnNldFdpZHRoKDgpOwotCi0gICAgLy8gTWFrZSBzdXJlIG1lc3NhZ2VzIGFyZSBjYWNoZWQuCi0gICAgTGlzdDxXaGVlbD4gd2hlZWxzID0gbmV3IEFycmF5TGlzdDxXaGVlbD4odmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxMaXN0KCkpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2hlZWxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBhc3NlcnRTYW1lKHdoZWVscy5nZXQoaSksIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsKGkpKTsKLSAgICB9Ci0KLSAgICAvLyBOb3cgZ2V0IGJ1aWxkZXJzIGFuZCBjaGVjayB0aGV5IGRpZG4ndCBjaGFuZ2UuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCB3aGVlbHMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsKGkpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHdoZWVscy5zaXplKCk7IGkrKykgewotICAgICAgYXNzZXJ0U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7Ci0gICAgfQotCi0gICAgLy8gQ2hhbmdlIGp1c3Qgb25lCi0gICAgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxCdWlsZGVyKDMpCi0gICAgICAgIC5zZXRSYWRpdXMoMjApLnNldFdpZHRoKDIwKTsKLQotICAgIC8vIE5vdyBnZXQgd2hlZWxzIGFuZCBjaGVjayB0aGF0IG9ubHkgdGhhdCBvbmUgY2hhbmdlZAotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgd2hlZWxzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBpZiAoaSA8IDMpIHsKLSAgICAgICAgYXNzZXJ0U2FtZSh3aGVlbHMuZ2V0KGkpLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbChpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBhc3NlcnROb3RTYW1lKHdoZWVscy5nZXQoaSksIHZlaGljbGVCdWlsZGVyLmdldFdoZWVsKGkpKTsKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlX1dpdGhOZXN0ZWRCdWlsZGVycygpIHsKLSAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQotICAgICAgICAuc2V0UmFkaXVzKDEpCi0gICAgICAgIC5zZXRXaWR0aCgxKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbEJ1aWxkZXIoKQotICAgICAgICAuc2V0UmFkaXVzKDIpCi0gICAgICAgIC5zZXRXaWR0aCgyKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5yZW1vdmVXaGVlbCgwKTsKLQotICAgIGFzc2VydEVxdWFscygxLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbENvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygyLCB2ZWhpY2xlQnVpbGRlci5nZXRXaGVlbCgwKS5nZXRSYWRpdXMoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UmVtb3ZlX1dpdGhOZXN0ZWRNZXNzYWdlcygpIHsKLSAgICBWZWhpY2xlLkJ1aWxkZXIgdmVoaWNsZUJ1aWxkZXIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKTsKLSAgICB2ZWhpY2xlQnVpbGRlci5hZGRXaGVlbChXaGVlbC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFJhZGl1cygxKQotICAgICAgICAuc2V0V2lkdGgoMSkpOwotICAgIHZlaGljbGVCdWlsZGVyLmFkZFdoZWVsKFdoZWVsLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0UmFkaXVzKDIpCi0gICAgICAgIC5zZXRXaWR0aCgyKSk7Ci0gICAgdmVoaWNsZUJ1aWxkZXIucmVtb3ZlV2hlZWwoMCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMSwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWxDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgdmVoaWNsZUJ1aWxkZXIuZ2V0V2hlZWwoMCkuZ2V0UmFkaXVzKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1lcmdlKCkgewotICAgIFZlaGljbGUgdmVoaWNsZTEgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkV2hlZWwoV2hlZWwubmV3QnVpbGRlcigpLnNldFJhZGl1cygxKS5idWlsZCgpKQotICAgICAgICAuYWRkV2hlZWwoV2hlZWwubmV3QnVpbGRlcigpLnNldFJhZGl1cygyKS5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIFZlaGljbGUgdmVoaWNsZTIgPSBWZWhpY2xlLm5ld0J1aWxkZXIoKQotICAgICAgICAubWVyZ2VGcm9tKHZlaGljbGUxKQotICAgICAgICAuYnVpbGQoKTsKLSAgICAvLyBMaXN0IHNob3VsZCBiZSB0aGUgc2FtZSAtLSBubyBhbGxvY2F0aW9uCi0gICAgYXNzZXJ0U2FtZSh2ZWhpY2xlMS5nZXRXaGVlbExpc3QoKSwgdmVoaWNsZTIuZ2V0V2hlZWxMaXN0KCkpOwotCi0gICAgVmVoaWNsZSB2ZWhpY2xlMyA9IHZlaGljbGUxLnRvQnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0U2FtZSh2ZWhpY2xlMS5nZXRXaGVlbExpc3QoKSwgdmVoaWNsZTMuZ2V0V2hlZWxMaXN0KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldHRpbmdCdWlsZGVyTWFya3NGaWVsZEFzSGF2aW5nKCkgewotICAgIFZlaGljbGUuQnVpbGRlciB2ZWhpY2xlQnVpbGRlciA9IFZlaGljbGUubmV3QnVpbGRlcigpOwotICAgIHZlaGljbGVCdWlsZGVyLmdldEVuZ2luZUJ1aWxkZXIoKTsKLSAgICBWZWhpY2xlIHZlaGljbGUgPSB2ZWhpY2xlQnVpbGRlci5idWlsZFBhcnRpYWwoKTsKLSAgICBhc3NlcnRUcnVlKHZlaGljbGUuaGFzRW5naW5lKCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvUmVwZWF0ZWRGaWVsZEJ1aWxkZXJUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGNkY2RjYjIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1JlcGVhdGVkRmllbGRCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTkwICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkNvbGxlY3Rpb25zOwotaW1wb3J0IGphdmEudXRpbC5MaXN0OwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgUmVwZWF0ZWRGaWVsZEJ1aWxkZXJ9LiBUaGlzIHRlc3RzIGJhc2ljIGZ1bmN0aW9uYWxpdHkuCi0gKiBNb3JlIGV4dGVuc2l2ZSB0ZXN0aW5nIGlzIHByb3ZpZGVkIHZpYSBvdGhlciB0ZXN0cyB0aGF0IGV4ZXJjaXNlIHRoZQotICogYnVpbGRlci4KLSAqCi0gKiBAYXV0aG9yIGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLSAqLwotcHVibGljIGNsYXNzIFJlcGVhdGVkRmllbGRCdWlsZGVyVGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLQotICBwdWJsaWMgdm9pZCB0ZXN0QmFzaWNVc2UoKSB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOwotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotCi0gICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKLQotICAgIC8vIE1ha2Ugc3VyZSBpdCBkb2Vzbid0IGNoYW5nZS4KLSAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbGlzdDIgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0U2FtZShsaXN0LCBsaXN0Mik7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0R29pbmdCYWNrQW5kRm9ydGgoKSB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotICAgIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9IG5ld1JlcGVhdGVkRmllbGRCdWlsZGVyKG1vY2tQYXJlbnQpOwotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotCi0gICAgLy8gQ29udmVydCB0byBsaXN0Ci0gICAgTGlzdDxUZXN0QWxsVHlwZXM+IGxpc3QgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbGlzdC5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKLQotICAgIC8vIFVwZGF0ZSAwdGggaXRlbQotICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigwKS5zZXRPcHRpb25hbFN0cmluZygiZm9vIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gICAgbGlzdCA9IGJ1aWxkZXIuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbGlzdC5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKCJmb28iLCBsaXN0LmdldCgwKS5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbGlzdC5nZXQoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRJc1VubW9kaWZpYWJsZShsaXN0KTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RWYXJpb3VzTWV0aG9kcygpIHsKLSAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7Ci0gICAgUmVwZWF0ZWRGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKLSAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0gbmV3UmVwZWF0ZWRGaWVsZEJ1aWxkZXIobW9ja1BhcmVudCk7Ci0gICAgYnVpbGRlci5hZGRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKS5idWlsZCgpKTsKLSAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDIpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkQnVpbGRlcigwLCBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpCi0gICAgICAgIC5zZXRPcHRpb25hbEludDMyKDApOwotICAgIGJ1aWxkZXIuYWRkQnVpbGRlcihUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLnNldE9wdGlvbmFsSW50MzIoMyk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygyLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRNZXNzYWdlKDMpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgICBMaXN0PFRlc3RBbGxUeXBlcz4gbWVzc2FnZXMgPSBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDQsIG1lc3NhZ2VzLnNpemUoKSk7Ci0gICAgYXNzZXJ0U2FtZShtZXNzYWdlcywgYnVpbGRlci5idWlsZCgpKTsgLy8gZXhwZWN0IHNhbWUgbGlzdAotCi0gICAgLy8gUmVtb3ZlIGEgbWVzc2FnZS4KLSAgICBidWlsZGVyLnJlbW92ZSgyKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMywgYnVpbGRlci5nZXRDb3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgxKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMikuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFJlbW92ZSBhIGJ1aWxkZXIuCi0gICAgYnVpbGRlci5yZW1vdmUoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0Q291bnQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFRlc3QgY2xlYXIuCi0gICAgYnVpbGRlci5jbGVhcigpOwotICAgIGFzc2VydEVxdWFscygxLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVyLmdldENvdW50KCkpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5pc0VtcHR5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdExpc3RzKCkgewotICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKLSAgICBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPSBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihtb2NrUGFyZW50KTsKLSAgICBidWlsZGVyLmFkZE1lc3NhZ2UoVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDEpLmJ1aWxkKCkpOwotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZSgwLAotICAgICAgICBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgwKS5nZXRPcHRpb25hbEludDMyKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE1lc3NhZ2UoMSkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFVzZSBsaXN0IG9mIGJ1aWxkZXJzLgotICAgIExpc3Q8VGVzdEFsbFR5cGVzLkJ1aWxkZXI+IGJ1aWxkZXJzID0gYnVpbGRlci5nZXRCdWlsZGVyTGlzdCgpOwotICAgIGFzc2VydEVxdWFscygwLCBidWlsZGVycy5nZXQoMCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlcnMuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYnVpbGRlcnMuZ2V0KDApLnNldE9wdGlvbmFsSW50MzIoMTApOwotICAgIGJ1aWxkZXJzLmdldCgxKS5zZXRPcHRpb25hbEludDMyKDExKTsKLQotICAgIC8vIFVzZSBsaXN0IG9mIHByb3RvcwotICAgIExpc3Q8VGVzdEFsbFR5cGVzPiBwcm90b3MgPSBidWlsZGVyLmdldE1lc3NhZ2VMaXN0KCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEwLCBwcm90b3MuZ2V0KDApLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDExLCBwcm90b3MuZ2V0KDEpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0KLSAgICAvLyBBZGQgYW4gaXRlbSB0byB0aGUgYnVpbGRlcnMgYW5kIHZlcmlmeSBpdCdzIHVwZGF0ZWQgaW4gYm90aAotICAgIGJ1aWxkZXIuYWRkTWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTIpLmJ1aWxkKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBidWlsZGVycy5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBwcm90b3Muc2l6ZSgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRJc1VubW9kaWZpYWJsZShMaXN0PD8+IGxpc3QpIHsKLSAgICBpZiAobGlzdCA9PSBDb2xsZWN0aW9ucy5lbXB0eUxpc3QoKSkgewotICAgICAgLy8gT0tBWSAtLSBOZWVkIHRvIGNoZWNrIHRoaXMgYi9jIEVtcHR5TGlzdCBhbGxvd3MgeW91IHRvIGNhbGwgY2xlYXIuCi0gICAgfSBlbHNlIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGxpc3QuY2xlYXIoKTsKLSAgICAgICAgZmFpbCgiTGlzdCB3YXNuJ3QgaW1tdXRhYmxlIik7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGdvb2QKLSAgICAgIH0KLSAgICB9Ci0gIH0KLQotICBwcml2YXRlIFJlcGVhdGVkRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+Ci0gICAgICBuZXdSZXBlYXRlZEZpZWxkQnVpbGRlcihHZW5lcmF0ZWRNZXNzYWdlLkJ1aWxkZXJQYXJlbnQgcGFyZW50KSB7Ci0gICAgcmV0dXJuIG5ldyBSZXBlYXRlZEZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KENvbGxlY3Rpb25zLjxUZXN0QWxsVHlwZXM+ZW1wdHlMaXN0KCksIGZhbHNlLAotICAgICAgICBwYXJlbnQsIGZhbHNlKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NlcnZpY2VUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZVRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNGJlODRmNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2VydmljZVRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDMyMCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvcjsKLWltcG9ydCBnb29nbGUucHJvdG9idWYubm9fZ2VuZXJpY19zZXJ2aWNlc190ZXN0LlVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuTWVzc2FnZVdpdGhOb091dGVyOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlNlcnZpY2VXaXRoTm9PdXRlcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RTZXJ2aWNlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uRm9vUmVxdWVzdDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvb1Jlc3BvbnNlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uQmFyUmVxdWVzdDsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkJhclJlc3BvbnNlOwotCi1pbXBvcnQgb3JnLmVhc3ltb2NrLmNsYXNzZXh0ZW5zaW9uLkVhc3lNb2NrOwotaW1wb3J0IG9yZy5lYXN5bW9jay5jbGFzc2V4dGVuc2lvbi5JTW9ja3NDb250cm9sOwotaW1wb3J0IG9yZy5lYXN5bW9jay5JQXJndW1lbnRNYXRjaGVyOwotCi1pbXBvcnQgamF2YS51dGlsLkhhc2hTZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlNldDsKLQotaW1wb3J0IGp1bml0LmZyYW1ld29yay5UZXN0Q2FzZTsKLQotLyoqCi0gKiBUZXN0cyBzZXJ2aWNlcyBhbmQgc3R1YnMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGNsYXNzIFNlcnZpY2VUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwcml2YXRlIElNb2Nrc0NvbnRyb2wgY29udHJvbDsKLSAgcHJpdmF0ZSBScGNDb250cm9sbGVyIG1vY2tDb250cm9sbGVyOwotCi0gIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuTWV0aG9kRGVzY3JpcHRvciBmb29EZXNjcmlwdG9yID0KLSAgICBUZXN0U2VydmljZS5nZXREZXNjcmlwdG9yKCkuZ2V0TWV0aG9kcygpLmdldCgwKTsKLSAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5NZXRob2REZXNjcmlwdG9yIGJhckRlc2NyaXB0b3IgPQotICAgIFRlc3RTZXJ2aWNlLmdldERlc2NyaXB0b3IoKS5nZXRNZXRob2RzKCkuZ2V0KDEpOwotCi0gIEBPdmVycmlkZQotICBwcm90ZWN0ZWQgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIHN1cGVyLnNldFVwKCk7Ci0gICAgY29udHJvbCA9IEVhc3lNb2NrLmNyZWF0ZVN0cmljdENvbnRyb2woKTsKLSAgICBtb2NrQ29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgLyoqIFRlc3RzIFNlcnZpY2UuY2FsbE1ldGhvZCgpLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0Q2FsbE1ldGhvZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEZvb1JlcXVlc3QgZm9vUmVxdWVzdCA9IEZvb1JlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgQmFyUmVxdWVzdCBiYXJSZXF1ZXN0ID0gQmFyUmVxdWVzdC5uZXdCdWlsZGVyKCkuYnVpbGQoKTsKLSAgICBNb2NrQ2FsbGJhY2s8TWVzc2FnZT4gZm9vQ2FsbGJhY2sgPSBuZXcgTW9ja0NhbGxiYWNrPE1lc3NhZ2U+KCk7Ci0gICAgTW9ja0NhbGxiYWNrPE1lc3NhZ2U+IGJhckNhbGxiYWNrID0gbmV3IE1vY2tDYWxsYmFjazxNZXNzYWdlPigpOwotICAgIFRlc3RTZXJ2aWNlIG1vY2tTZXJ2aWNlID0gY29udHJvbC5jcmVhdGVNb2NrKFRlc3RTZXJ2aWNlLmNsYXNzKTsKLQotICAgIG1vY2tTZXJ2aWNlLmZvbyhFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy48Rm9vUmVzcG9uc2U+d3JhcHNDYWxsYmFjayhmb29DYWxsYmFjaykpOwotICAgIG1vY2tTZXJ2aWNlLmJhcihFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShiYXJSZXF1ZXN0KSwKLSAgICAgICAgICAgICAgICAgICAgdGhpcy48QmFyUmVzcG9uc2U+d3JhcHNDYWxsYmFjayhiYXJDYWxsYmFjaykpOwotICAgIGNvbnRyb2wucmVwbGF5KCk7Ci0KLSAgICBtb2NrU2VydmljZS5jYWxsTWV0aG9kKGZvb0Rlc2NyaXB0b3IsIG1vY2tDb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9vUmVxdWVzdCwgZm9vQ2FsbGJhY2spOwotICAgIG1vY2tTZXJ2aWNlLmNhbGxNZXRob2QoYmFyRGVzY3JpcHRvciwgbW9ja0NvbnRyb2xsZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBiYXJSZXF1ZXN0LCBiYXJDYWxsYmFjayk7Ci0gICAgY29udHJvbC52ZXJpZnkoKTsKLSAgfQotCi0gIC8qKiBUZXN0cyBTZXJ2aWNlLmdldHtSZXF1ZXN0LFJlc3BvbnNlfVByb3RvdHlwZSgpLiAqLwotICBwdWJsaWMgdm9pZCB0ZXN0R2V0UHJvdG90eXBlKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFNlcnZpY2UgbW9ja1NlcnZpY2UgPSBjb250cm9sLmNyZWF0ZU1vY2soVGVzdFNlcnZpY2UuY2xhc3MpOwotCi0gICAgYXNzZXJ0U2FtZShtb2NrU2VydmljZS5nZXRSZXF1ZXN0UHJvdG90eXBlKGZvb0Rlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgRm9vUmVxdWVzdC5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0U2FtZShtb2NrU2VydmljZS5nZXRSZXNwb25zZVByb3RvdHlwZShmb29EZXNjcmlwdG9yKSwKLSAgICAgICAgICAgICAgIEZvb1Jlc3BvbnNlLmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlcXVlc3RQcm90b3R5cGUoYmFyRGVzY3JpcHRvciksCi0gICAgICAgICAgICAgICBCYXJSZXF1ZXN0LmdldERlZmF1bHRJbnN0YW5jZSgpKTsKLSAgICBhc3NlcnRTYW1lKG1vY2tTZXJ2aWNlLmdldFJlc3BvbnNlUHJvdG90eXBlKGJhckRlc2NyaXB0b3IpLAotICAgICAgICAgICAgICAgQmFyUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpOwotICB9Ci0KLSAgLyoqIFRlc3RzIGdlbmVyYXRlZCBzdHVicy4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFN0dWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGb29SZXF1ZXN0IGZvb1JlcXVlc3QgPSBGb29SZXF1ZXN0Lm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgIEJhclJlcXVlc3QgYmFyUmVxdWVzdCA9IEJhclJlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgTW9ja0NhbGxiYWNrPEZvb1Jlc3BvbnNlPiBmb29DYWxsYmFjayA9IG5ldyBNb2NrQ2FsbGJhY2s8Rm9vUmVzcG9uc2U+KCk7Ci0gICAgTW9ja0NhbGxiYWNrPEJhclJlc3BvbnNlPiBiYXJDYWxsYmFjayA9IG5ldyBNb2NrQ2FsbGJhY2s8QmFyUmVzcG9uc2U+KCk7Ci0gICAgUnBjQ2hhbm5lbCBtb2NrQ2hhbm5lbCA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDaGFubmVsLmNsYXNzKTsKLSAgICBUZXN0U2VydmljZSBzdHViID0gVGVzdFNlcnZpY2UubmV3U3R1Yihtb2NrQ2hhbm5lbCk7Ci0KLSAgICBtb2NrQ2hhbm5lbC5jYWxsTWV0aG9kKAotICAgICAgRWFzeU1vY2suc2FtZShmb29EZXNjcmlwdG9yKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAotICAgICAgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoRm9vUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpLAotICAgICAgdGhpcy48TWVzc2FnZT53cmFwc0NhbGxiYWNrKGZvb0NhbGxiYWNrKSk7Ci0gICAgbW9ja0NoYW5uZWwuY2FsbE1ldGhvZCgKLSAgICAgIEVhc3lNb2NrLnNhbWUoYmFyRGVzY3JpcHRvciksCi0gICAgICBFYXN5TW9jay5zYW1lKG1vY2tDb250cm9sbGVyKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoYmFyUmVxdWVzdCksCi0gICAgICBFYXN5TW9jay5zYW1lKEJhclJlc3BvbnNlLmdldERlZmF1bHRJbnN0YW5jZSgpKSwKLSAgICAgIHRoaXMuPE1lc3NhZ2U+d3JhcHNDYWxsYmFjayhiYXJDYWxsYmFjaykpOwotICAgIGNvbnRyb2wucmVwbGF5KCk7Ci0KLSAgICBzdHViLmZvbyhtb2NrQ29udHJvbGxlciwgZm9vUmVxdWVzdCwgZm9vQ2FsbGJhY2spOwotICAgIHN0dWIuYmFyKG1vY2tDb250cm9sbGVyLCBiYXJSZXF1ZXN0LCBiYXJDYWxsYmFjayk7Ci0gICAgY29udHJvbC52ZXJpZnkoKTsKLSAgfQotCi0gIC8qKiBUZXN0cyBnZW5lcmF0ZWQgYmxvY2tpbmcgc3R1YnMuICovCi0gIHB1YmxpYyB2b2lkIHRlc3RCbG9ja2luZ1N0dWIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBGb29SZXF1ZXN0IGZvb1JlcXVlc3QgPSBGb29SZXF1ZXN0Lm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgIEJhclJlcXVlc3QgYmFyUmVxdWVzdCA9IEJhclJlcXVlc3QubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0gICAgQmxvY2tpbmdScGNDaGFubmVsIG1vY2tDaGFubmVsID0KLSAgICAgICAgY29udHJvbC5jcmVhdGVNb2NrKEJsb2NraW5nUnBjQ2hhbm5lbC5jbGFzcyk7Ci0gICAgVGVzdFNlcnZpY2UuQmxvY2tpbmdJbnRlcmZhY2Ugc3R1YiA9Ci0gICAgICAgIFRlc3RTZXJ2aWNlLm5ld0Jsb2NraW5nU3R1Yihtb2NrQ2hhbm5lbCk7Ci0KLSAgICBGb29SZXNwb25zZSBmb29SZXNwb25zZSA9IEZvb1Jlc3BvbnNlLm5ld0J1aWxkZXIoKS5idWlsZCgpOwotICAgIEJhclJlc3BvbnNlIGJhclJlc3BvbnNlID0gQmFyUmVzcG9uc2UubmV3QnVpbGRlcigpLmJ1aWxkKCk7Ci0KLSAgICBFYXN5TW9jay5leHBlY3QobW9ja0NoYW5uZWwuY2FsbEJsb2NraW5nTWV0aG9kKAotICAgICAgRWFzeU1vY2suc2FtZShmb29EZXNjcmlwdG9yKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAotICAgICAgRWFzeU1vY2suc2FtZShmb29SZXF1ZXN0KSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoRm9vUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKSkuYW5kUmV0dXJuKGZvb1Jlc3BvbnNlKTsKLSAgICBFYXN5TW9jay5leHBlY3QobW9ja0NoYW5uZWwuY2FsbEJsb2NraW5nTWV0aG9kKAotICAgICAgRWFzeU1vY2suc2FtZShiYXJEZXNjcmlwdG9yKSwKLSAgICAgIEVhc3lNb2NrLnNhbWUobW9ja0NvbnRyb2xsZXIpLAotICAgICAgRWFzeU1vY2suc2FtZShiYXJSZXF1ZXN0KSwKLSAgICAgIEVhc3lNb2NrLnNhbWUoQmFyUmVzcG9uc2UuZ2V0RGVmYXVsdEluc3RhbmNlKCkpKSkuYW5kUmV0dXJuKGJhclJlc3BvbnNlKTsKLSAgICBjb250cm9sLnJlcGxheSgpOwotCi0gICAgYXNzZXJ0U2FtZShmb29SZXNwb25zZSwgc3R1Yi5mb28obW9ja0NvbnRyb2xsZXIsIGZvb1JlcXVlc3QpKTsKLSAgICBhc3NlcnRTYW1lKGJhclJlc3BvbnNlLCBzdHViLmJhcihtb2NrQ29udHJvbGxlciwgYmFyUmVxdWVzdCkpOwotICAgIGNvbnRyb2wudmVyaWZ5KCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TmV3UmVmbGVjdGl2ZVNlcnZpY2UoKSB7Ci0gICAgU2VydmljZVdpdGhOb091dGVyLkludGVyZmFjZSBpbXBsID0KLSAgICAgICAgY29udHJvbC5jcmVhdGVNb2NrKFNlcnZpY2VXaXRoTm9PdXRlci5JbnRlcmZhY2UuY2xhc3MpOwotICAgIFJwY0NvbnRyb2xsZXIgY29udHJvbGxlciA9IGNvbnRyb2wuY3JlYXRlTW9jayhScGNDb250cm9sbGVyLmNsYXNzKTsKLSAgICBTZXJ2aWNlIHNlcnZpY2UgPSBTZXJ2aWNlV2l0aE5vT3V0ZXIubmV3UmVmbGVjdGl2ZVNlcnZpY2UoaW1wbCk7Ci0KLSAgICBNZXRob2REZXNjcmlwdG9yIGZvb01ldGhvZCA9Ci0gICAgICAgIFNlcnZpY2VXaXRoTm9PdXRlci5nZXREZXNjcmlwdG9yKCkuZmluZE1ldGhvZEJ5TmFtZSgiRm9vIik7Ci0gICAgTWVzc2FnZVdpdGhOb091dGVyIHJlcXVlc3QgPSBNZXNzYWdlV2l0aE5vT3V0ZXIuZ2V0RGVmYXVsdEluc3RhbmNlKCk7Ci0gICAgUnBjQ2FsbGJhY2s8TWVzc2FnZT4gY2FsbGJhY2sgPSBuZXcgUnBjQ2FsbGJhY2s8TWVzc2FnZT4oKSB7Ci0gICAgICBwdWJsaWMgdm9pZCBydW4oTWVzc2FnZSBwYXJhbWV0ZXIpIHsKLSAgICAgICAgLy8gTm8gcmVhc29uIHRoaXMgc2hvdWxkIGJlIHJ1bi4KLSAgICAgICAgZmFpbCgpOwotICAgICAgfQotICAgIH07Ci0gICAgUnBjQ2FsbGJhY2s8VGVzdEFsbFR5cGVzPiBzcGVjaWFsaXplZENhbGxiYWNrID0KLSAgICAgICAgUnBjVXRpbC5zcGVjaWFsaXplQ2FsbGJhY2soY2FsbGJhY2spOwotCi0gICAgaW1wbC5mb28oRWFzeU1vY2suc2FtZShjb250cm9sbGVyKSwgRWFzeU1vY2suc2FtZShyZXF1ZXN0KSwKLSAgICAgICAgRWFzeU1vY2suc2FtZShzcGVjaWFsaXplZENhbGxiYWNrKSk7Ci0gICAgRWFzeU1vY2suZXhwZWN0TGFzdENhbGwoKTsKLQotICAgIGNvbnRyb2wucmVwbGF5KCk7Ci0KLSAgICBzZXJ2aWNlLmNhbGxNZXRob2QoZm9vTWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjayk7Ci0KLSAgICBjb250cm9sLnZlcmlmeSgpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2UoKSB0aHJvd3MgU2VydmljZUV4Y2VwdGlvbiB7Ci0gICAgU2VydmljZVdpdGhOb091dGVyLkJsb2NraW5nSW50ZXJmYWNlIGltcGwgPQotICAgICAgICBjb250cm9sLmNyZWF0ZU1vY2soU2VydmljZVdpdGhOb091dGVyLkJsb2NraW5nSW50ZXJmYWNlLmNsYXNzKTsKLSAgICBScGNDb250cm9sbGVyIGNvbnRyb2xsZXIgPSBjb250cm9sLmNyZWF0ZU1vY2soUnBjQ29udHJvbGxlci5jbGFzcyk7Ci0gICAgQmxvY2tpbmdTZXJ2aWNlIHNlcnZpY2UgPQotICAgICAgICBTZXJ2aWNlV2l0aE5vT3V0ZXIubmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZShpbXBsKTsKLQotICAgIE1ldGhvZERlc2NyaXB0b3IgZm9vTWV0aG9kID0KLSAgICAgICAgU2VydmljZVdpdGhOb091dGVyLmdldERlc2NyaXB0b3IoKS5maW5kTWV0aG9kQnlOYW1lKCJGb28iKTsKLSAgICBNZXNzYWdlV2l0aE5vT3V0ZXIgcmVxdWVzdCA9IE1lc3NhZ2VXaXRoTm9PdXRlci5nZXREZWZhdWx0SW5zdGFuY2UoKTsKLQotICAgIFRlc3RBbGxUeXBlcyBleHBlY3RlZFJlc3BvbnNlID0gVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpOwotICAgIEVhc3lNb2NrLmV4cGVjdChpbXBsLmZvbyhFYXN5TW9jay5zYW1lKGNvbnRyb2xsZXIpLCBFYXN5TW9jay5zYW1lKHJlcXVlc3QpKSkKLSAgICAgICAgLmFuZFJldHVybihleHBlY3RlZFJlc3BvbnNlKTsKLQotICAgIGNvbnRyb2wucmVwbGF5KCk7Ci0KLSAgICBNZXNzYWdlIHJlc3BvbnNlID0KLSAgICAgICAgc2VydmljZS5jYWxsQmxvY2tpbmdNZXRob2QoZm9vTWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0KTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0ZWRSZXNwb25zZSwgcmVzcG9uc2UpOwotCi0gICAgY29udHJvbC52ZXJpZnkoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3ROb0dlbmVyaWNTZXJ2aWNlcygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIE5vbi1zZXJ2aWNlcyBzaG91bGQgYmUgdXNhYmxlLgotICAgIFVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMuVGVzdE1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICBVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzLlRlc3RNZXNzYWdlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0QSgxMjMpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy50ZXN0RXh0ZW5zaW9uLCA0NTYpCi0gICAgICAgIC5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxMjMsIG1lc3NhZ2UuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy5UZXN0RW51bS5GT08uZ2V0TnVtYmVyKCkpOwotCi0gICAgLy8gQnVpbGQgYSBsaXN0IG9mIHRoZSBjbGFzcyBuYW1lcyBuZXN0ZWQgaW4gVW5pdHRlc3ROb0dlbmVyaWNTZXJ2aWNlcy4KLSAgICBTdHJpbmcgb3V0ZXJOYW1lID0gImdvb2dsZS5wcm90b2J1Zi5ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3QuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICJVbml0dGVzdE5vR2VuZXJpY1NlcnZpY2VzIjsKLSAgICBDbGFzczw/PiBvdXRlckNsYXNzID0gQ2xhc3MuZm9yTmFtZShvdXRlck5hbWUpOwotCi0gICAgU2V0PFN0cmluZz4gaW5uZXJDbGFzc05hbWVzID0gbmV3IEhhc2hTZXQ8U3RyaW5nPigpOwotICAgIGZvciAoQ2xhc3M8Pz4gaW5uZXJDbGFzcyA6IG91dGVyQ2xhc3MuZ2V0Q2xhc3NlcygpKSB7Ci0gICAgICBTdHJpbmcgZnVsbE5hbWUgPSBpbm5lckNsYXNzLmdldE5hbWUoKTsKLSAgICAgIC8vIEZpZ3VyZSBvdXQgdGhlIHVucXVhbGlmaWVkIG5hbWUgb2YgdGhlIGlubmVyIGNsYXNzLgotICAgICAgLy8gTm90ZTogIFN1cnByaXNpbmdseSwgdGhlIGZ1bGwgbmFtZSBvZiBhbiBpbm5lciBjbGFzcyB3aWxsIGJlIHNlcGFyYXRlZAotICAgICAgLy8gICBmcm9tIHRoZSBvdXRlciBjbGFzcyBuYW1lIGJ5IGEgJyQnIHJhdGhlciB0aGFuIGEgJy4nLiAgVGhpcyBpcyBub3QKLSAgICAgIC8vICAgbWVudGlvbmVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBqYXZhLmxhbmcuQ2xhc3MuICBJIGRvbid0IHdhbnQgdG8KLSAgICAgIC8vICAgbWFrZSBhc3N1bXB0aW9ucywgc28gSSdtIGp1c3QgZ29pbmcgdG8gYWNjZXB0IGFueSBjaGFyYWN0ZXIgYXMgdGhlCi0gICAgICAvLyAgIHNlcGFyYXRvci4KLSAgICAgIGFzc2VydFRydWUoZnVsbE5hbWUuc3RhcnRzV2l0aChvdXRlck5hbWUpKTsKLQotICAgICAgaWYgKCFTZXJ2aWNlLmNsYXNzLmlzQXNzaWduYWJsZUZyb20oaW5uZXJDbGFzcykgJiYKLSAgICAgICAgICAhTWVzc2FnZS5jbGFzcy5pc0Fzc2lnbmFibGVGcm9tKGlubmVyQ2xhc3MpICYmCi0gICAgICAgICAgIVByb3RvY29sTWVzc2FnZUVudW0uY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShpbm5lckNsYXNzKSkgewotICAgICAgICAvLyBJZ25vcmUgYW55IGNsYXNzZXMgbm90IGdlbmVyYXRlZCBieSB0aGUgYmFzZSBjb2RlIGdlbmVyYXRvci4KLSAgICAgICAgY29udGludWU7Ci0gICAgICB9Ci0KLSAgICAgIGlubmVyQ2xhc3NOYW1lcy5hZGQoZnVsbE5hbWUuc3Vic3RyaW5nKG91dGVyTmFtZS5sZW5ndGgoKSArIDEpKTsKLSAgICB9Ci0KLSAgICAvLyBObyBzZXJ2aWNlIGNsYXNzIHNob3VsZCBoYXZlIGJlZW4gZ2VuZXJhdGVkLgotICAgIGFzc2VydFRydWUoaW5uZXJDbGFzc05hbWVzLmNvbnRhaW5zKCJUZXN0TWVzc2FnZSIpKTsKLSAgICBhc3NlcnRUcnVlKGlubmVyQ2xhc3NOYW1lcy5jb250YWlucygiVGVzdEVudW0iKSk7Ci0gICAgYXNzZXJ0RmFsc2UoaW5uZXJDbGFzc05hbWVzLmNvbnRhaW5zKCJUZXN0U2VydmljZSIpKTsKLQotICAgIC8vIEJ1dCBkZXNjcmlwdG9ycyBhcmUgdGhlcmUuCi0gICAgRmlsZURlc2NyaXB0b3IgZmlsZSA9IFVuaXR0ZXN0Tm9HZW5lcmljU2VydmljZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIGFzc2VydEVxdWFscygxLCBmaWxlLmdldFNlcnZpY2VzKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoIlRlc3RTZXJ2aWNlIiwgZmlsZS5nZXRTZXJ2aWNlcygpLmdldCgwKS5nZXROYW1lKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBmaWxlLmdldFNlcnZpY2VzKCkuZ2V0KDApLmdldE1ldGhvZHMoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscygiRm9vIiwKLSAgICAgICAgZmlsZS5nZXRTZXJ2aWNlcygpLmdldCgwKS5nZXRNZXRob2RzKCkuZ2V0KDApLmdldE5hbWUoKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiB3cmFwc0NhbGxiYWNrKCkgaXMgYW4gRWFzeU1vY2sgYXJndW1lbnQgcHJlZGljYXRlLiAgd3JhcHNDYWxsYmFjayhjKQotICAgKiBtYXRjaGVzIGEgY2FsbGJhY2sgaWYgY2FsbGluZyB0aGF0IGNhbGxiYWNrIGNhdXNlcyBjIHRvIGJlIGNhbGxlZC4KLSAgICogSW4gb3RoZXIgd29yZHMsIGMgd3JhcHMgdGhlIGdpdmVuIGNhbGxiYWNrLgotICAgKi8KLSAgcHJpdmF0ZSA8VHlwZSBleHRlbmRzIE1lc3NhZ2U+IFJwY0NhbGxiYWNrPFR5cGU+IHdyYXBzQ2FsbGJhY2soCi0gICAgICBNb2NrQ2FsbGJhY2s8Pz4gY2FsbGJhY2spIHsKLSAgICBFYXN5TW9jay5yZXBvcnRNYXRjaGVyKG5ldyBXcmFwc0NhbGxiYWNrKGNhbGxiYWNrKSk7Ci0gICAgcmV0dXJuIG51bGw7Ci0gIH0KLQotICAvKiogVGhlIHBhcmFtZXRlciB0byB3cmFwc0NhbGxiYWNrKCkgbXVzdCBiZSBhIE1vY2tDYWxsYmFjay4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgTW9ja0NhbGxiYWNrPFR5cGUgZXh0ZW5kcyBNZXNzYWdlPgotICAgICAgaW1wbGVtZW50cyBScGNDYWxsYmFjazxUeXBlPiB7Ci0gICAgcHJpdmF0ZSBib29sZWFuIGNhbGxlZCA9IGZhbHNlOwotCi0gICAgcHVibGljIGJvb2xlYW4gaXNDYWxsZWQoKSB7IHJldHVybiBjYWxsZWQ7IH0KLQotICAgIHB1YmxpYyB2b2lkIHJlc2V0KCkgeyBjYWxsZWQgPSBmYWxzZTsgfQotICAgIHB1YmxpYyB2b2lkIHJ1bihUeXBlIG1lc3NhZ2UpIHsgY2FsbGVkID0gdHJ1ZTsgfQotICB9Ci0KLSAgLyoqIEltcGxlbWVudGF0aW9uIG9mIHRoZSB3cmFwc0NhbGxiYWNrKCkgYXJndW1lbnQgbWF0Y2hlci4gKi8KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgV3JhcHNDYWxsYmFjayBpbXBsZW1lbnRzIElBcmd1bWVudE1hdGNoZXIgewotICAgIHByaXZhdGUgTW9ja0NhbGxiYWNrPD8+IGNhbGxiYWNrOwotCi0gICAgcHVibGljIFdyYXBzQ2FsbGJhY2soTW9ja0NhbGxiYWNrPD8+IGNhbGxiYWNrKSB7Ci0gICAgICB0aGlzLmNhbGxiYWNrID0gY2FsbGJhY2s7Ci0gICAgfQotCi0gICAgQFN1cHByZXNzV2FybmluZ3MoInVuY2hlY2tlZCIpCi0gICAgcHVibGljIGJvb2xlYW4gbWF0Y2hlcyhPYmplY3QgYWN0dWFsKSB7Ci0gICAgICBpZiAoIShhY3R1YWwgaW5zdGFuY2VvZiBScGNDYWxsYmFjaykpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgICAgUnBjQ2FsbGJhY2sgYWN0dWFsQ2FsbGJhY2sgPSAoUnBjQ2FsbGJhY2spYWN0dWFsOwotCi0gICAgICBjYWxsYmFjay5yZXNldCgpOwotICAgICAgYWN0dWFsQ2FsbGJhY2sucnVuKG51bGwpOwotICAgICAgcmV0dXJuIGNhbGxiYWNrLmlzQ2FsbGVkKCk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgYXBwZW5kVG8oU3RyaW5nQnVmZmVyIGJ1ZmZlcikgewotICAgICAgYnVmZmVyLmFwcGVuZCgid3JhcHNDYWxsYmFjayhtb2NrQ2FsbGJhY2spIik7Ci0gICAgfQotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyVGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1NpbmdsZUZpZWxkQnVpbGRlclRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWMyZjdlNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU2luZ2xlRmllbGRCdWlsZGVyVGVzdC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMTU1ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLXBhY2thZ2UgY29tLmdvb2dsZS5wcm90b2J1ZjsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzT3JCdWlsZGVyOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi0vKioKLSAqIFRlc3RzIGZvciB7QGxpbmsgU2luZ2xlRmllbGRCdWlsZGVyfS4gVGhpcyB0ZXN0cyBiYXNpYyBmdW5jdGlvbmFsaXR5LgotICogTW9yZSBleHRlbnNpdmUgdGVzdGluZyBpcyBwcm92aWRlZCB2aWEgb3RoZXIgdGVzdHMgdGhhdCBleGVyY2lzZSB0aGUKLSAqIGJ1aWxkZXIuCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBTaW5nbGVGaWVsZEJ1aWxkZXJUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHB1YmxpYyB2b2lkIHRlc3RCYXNpY1VzZUFuZEludmFsaWRhdGlvbnMoKSB7Ci0gICAgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQgbW9ja1BhcmVudCA9IG5ldyBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCgpOwotICAgIFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+IGJ1aWxkZXIgPQotICAgICAgICBuZXcgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXNPckJ1aWxkZXI+KAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlZmF1bHRJbnN0YW5jZSgpLAotICAgICAgICAgICAgbW9ja1BhcmVudCwKLSAgICAgICAgICAgIGZhbHNlKTsKLSAgICBhc3NlcnRTYW1lKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwgYnVpbGRlci5nZXRNZXNzYWdlKCkpOwotICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLmJ1aWxkUGFydGlhbCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLQotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMTApOwotICAgIGFzc2VydEVxdWFscygwLCBtb2NrUGFyZW50LmdldEludmFsaWRhdGlvbkNvdW50KCkpOwotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gYnVpbGRlci5idWlsZCgpOwotICAgIGFzc2VydEVxdWFscygxMCwgbWVzc2FnZS5nZXRPcHRpb25hbEludDMyKCkpOwotCi0gICAgLy8gVGVzdCB0aGF0IHdlIHJlY2VpdmUgaW52YWxpZGF0aW9ucyBub3cgdGhhdCBidWlsZCBoYXMgYmVlbiBjYWxsZWQuCi0gICAgYXNzZXJ0RXF1YWxzKDAsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0gICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigyMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgICAvLyBUZXN0IHRoYXQgd2UgZG9uJ3Qga2VlcCBnZXR0aW5nIGludmFsaWRhdGlvbnMgb24gZXZlcnkgY2hhbmdlCi0gICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigzMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG1vY2tQYXJlbnQuZ2V0SW52YWxpZGF0aW9uQ291bnQoKSk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXRNZXNzYWdlKCkgewotICAgIFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50IG1vY2tQYXJlbnQgPSBuZXcgVGVzdFV0aWwuTW9ja0J1aWxkZXJQYXJlbnQoKTsKLSAgICBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKLSAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPiBidWlsZGVyID0KLSAgICAgICAgbmV3IFNpbmdsZUZpZWxkQnVpbGRlcjxUZXN0QWxsVHlwZXMsIFRlc3RBbGxUeXBlcy5CdWlsZGVyLAotICAgICAgICAgICAgVGVzdEFsbFR5cGVzT3JCdWlsZGVyPigKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSwKLSAgICAgICAgICAgIG1vY2tQYXJlbnQsCi0gICAgICAgICAgICBmYWxzZSk7Ci0gICAgYnVpbGRlci5zZXRNZXNzYWdlKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigwKS5idWlsZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIFVwZGF0ZSBtZXNzYWdlIHVzaW5nIHRoZSBidWlsZGVyCi0gICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigxKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbW9ja1BhcmVudC5nZXRJbnZhbGlkYXRpb25Db3VudCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlci5nZXRCdWlsZGVyKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBidWlsZGVyLmJ1aWxkKCk7Ci0gICAgYnVpbGRlci5nZXRCdWlsZGVyKCkuc2V0T3B0aW9uYWxJbnQzMigyKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgYnVpbGRlci5nZXRCdWlsZGVyKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLQotICAgIC8vIE1ha2Ugc3VyZSBtZXNzYWdlIHN0YXlzIGNhY2hlZAotICAgIGFzc2VydFNhbWUoYnVpbGRlci5nZXRNZXNzYWdlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RDbGVhcigpIHsKLSAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7Ci0gICAgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9Ci0gICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4oCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICBtb2NrUGFyZW50LAotICAgICAgICAgICAgZmFsc2UpOwotICAgIGJ1aWxkZXIuc2V0TWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMCkuYnVpbGQoKSk7Ci0gICAgYXNzZXJ0Tm90U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKLQotICAgIGJ1aWxkZXIuZ2V0QnVpbGRlcigpLnNldE9wdGlvbmFsSW50MzIoMSk7Ci0gICAgYXNzZXJ0Tm90U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgICBidWlsZGVyLmNsZWFyKCk7Ci0gICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZSgpIHsKLSAgICBUZXN0VXRpbC5Nb2NrQnVpbGRlclBhcmVudCBtb2NrUGFyZW50ID0gbmV3IFRlc3RVdGlsLk1vY2tCdWlsZGVyUGFyZW50KCk7Ci0gICAgU2luZ2xlRmllbGRCdWlsZGVyPFRlc3RBbGxUeXBlcywgVGVzdEFsbFR5cGVzLkJ1aWxkZXIsCi0gICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4gYnVpbGRlciA9Ci0gICAgICAgIG5ldyBTaW5nbGVGaWVsZEJ1aWxkZXI8VGVzdEFsbFR5cGVzLCBUZXN0QWxsVHlwZXMuQnVpbGRlciwKLSAgICAgICAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlcj4oCi0gICAgICAgICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksCi0gICAgICAgICAgICBtb2NrUGFyZW50LAotICAgICAgICAgICAgZmFsc2UpOwotCi0gICAgLy8gTWVyZ2UgaW50byBkZWZhdWx0IGZpZWxkLgotICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RBbGxUeXBlcy5nZXREZWZhdWx0SW5zdGFuY2UoKSk7Ci0gICAgYXNzZXJ0U2FtZShUZXN0QWxsVHlwZXMuZ2V0RGVmYXVsdEluc3RhbmNlKCksIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpKTsKLQotICAgIC8vIE1lcmdlIGludG8gbm9uLWRlZmF1bHQgZmllbGQgb24gZXhpc3RpbmcgYnVpbGRlci4KLSAgICBidWlsZGVyLmdldEJ1aWxkZXIoKS5zZXRPcHRpb25hbEludDMyKDIpOwotICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsRG91YmxlKDQuMCkKLSAgICAgICAgLmJ1aWxkUGFydGlhbCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxJbnQzMigpKTsKLSAgICBhc3NlcnRFcXVhbHMoNC4wLCBidWlsZGVyLmdldE1lc3NhZ2UoKS5nZXRPcHRpb25hbERvdWJsZSgpKTsKLQotICAgIC8vIE1lcmdlIGludG8gbm9uLWRlZmF1bHQgZmllbGQgb24gZXhpc3RpbmcgbWVzc2FnZQotICAgIGJ1aWxkZXIuc2V0TWVzc2FnZShUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRPcHRpb25hbEludDMyKDEwKQotICAgICAgICAuYnVpbGRQYXJ0aWFsKCkpOwotICAgIGJ1aWxkZXIubWVyZ2VGcm9tKFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldE9wdGlvbmFsRG91YmxlKDUuMCkKLSAgICAgICAgLmJ1aWxkUGFydGlhbCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTAsIGJ1aWxkZXIuZ2V0TWVzc2FnZSgpLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDUuMCwgYnVpbGRlci5nZXRNZXNzYWdlKCkuZ2V0T3B0aW9uYWxEb3VibGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TbWFsbFNvcnRlZE1hcFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9TbWFsbFNvcnRlZE1hcFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOGY3N2EwMy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvU21hbGxTb3J0ZWRNYXBUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0MjAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5TGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuQXJyYXlzOwotaW1wb3J0IGphdmEudXRpbC5IYXNoTWFwOwotaW1wb3J0IGphdmEudXRpbC5JdGVyYXRvcjsKLWltcG9ydCBqYXZhLnV0aWwuTGlzdDsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotaW1wb3J0IGphdmEudXRpbC5TZXQ7Ci1pbXBvcnQgamF2YS51dGlsLlRyZWVTZXQ7Ci0KLS8qKgotICogQGF1dGhvciBkYXJpY2tAZ29vZ2xlLmNvbSBEYXJpY2sgVG9uZwotICovCi1wdWJsaWMgY2xhc3MgU21hbGxTb3J0ZWRNYXBUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICAvLyBqYXZhLnV0aWwuQWJzdHJhY3RNYXAuU2ltcGxlRW50cnkgaXMgcHJpdmF0ZSBpbiBKREsgMS41LiBXZSByZS1pbXBsZW1lbnQgaXQKLSAgLy8gaGVyZSBmb3IgSkRLIDEuNSB1c2Vycy4KLSAgcHJpdmF0ZSBzdGF0aWMgY2xhc3MgU2ltcGxlRW50cnk8SywgVj4gaW1wbGVtZW50cyBNYXAuRW50cnk8SywgVj4gewotICAgIHByaXZhdGUgZmluYWwgSyBrZXk7Ci0gICAgcHJpdmF0ZSBWIHZhbHVlOwotCi0gICAgU2ltcGxlRW50cnkoSyBrZXksIFYgdmFsdWUpIHsKLSAgICAgIHRoaXMua2V5ID0ga2V5OwotICAgICAgdGhpcy52YWx1ZSA9IHZhbHVlOwotICAgIH0KLQotICAgIHB1YmxpYyBLIGdldEtleSgpIHsKLSAgICAgIHJldHVybiBrZXk7Ci0gICAgfQotCi0gICAgcHVibGljIFYgZ2V0VmFsdWUoKSB7Ci0gICAgICByZXR1cm4gdmFsdWU7Ci0gICAgfQotCi0gICAgcHVibGljIFYgc2V0VmFsdWUoViB2YWx1ZSkgewotICAgICAgViBvbGRWYWx1ZSA9IHRoaXMudmFsdWU7Ci0gICAgICB0aGlzLnZhbHVlID0gdmFsdWU7Ci0gICAgICByZXR1cm4gb2xkVmFsdWU7Ci0gICAgfQotCi0gICAgcHJpdmF0ZSBzdGF0aWMgYm9vbGVhbiBlcShPYmplY3QgbzEsIE9iamVjdCBvMikgewotICAgICAgcmV0dXJuIG8xID09IG51bGwgPyBvMiA9PSBudWxsIDogbzEuZXF1YWxzKG8yKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgYm9vbGVhbiBlcXVhbHMoT2JqZWN0IG8pIHsKLSAgICAgIGlmICghKG8gaW5zdGFuY2VvZiBNYXAuRW50cnkpKQotICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICBNYXAuRW50cnkgZSA9IChNYXAuRW50cnkpIG87Ci0gICAgICByZXR1cm4gZXEoa2V5LCBlLmdldEtleSgpKSAmJiBlcSh2YWx1ZSwgZS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0KLSAgICBAT3ZlcnJpZGUKLSAgICBwdWJsaWMgaW50IGhhc2hDb2RlKCkgewotICAgICAgcmV0dXJuICgoa2V5ID09IG51bGwpID8gMCA6IGtleS5oYXNoQ29kZSgpKSBeCi0gICAgICAgICAgKCh2YWx1ZSA9PSBudWxsKSA/IDAgOiB2YWx1ZS5oYXNoQ29kZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHV0QW5kR2V0QXJyYXlFbnRyaWVzT25seSgpIHsKLSAgICBydW5QdXRBbmRHZXRUZXN0KDMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFB1dEFuZEdldE92ZXJmbG93RW50cmllcygpIHsKLSAgICBydW5QdXRBbmRHZXRUZXN0KDYpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIHJ1blB1dEFuZEdldFRlc3QoaW50IG51bUVsZW1lbnRzKSB7Ci0gICAgLy8gVGVzdCB3aXRoIGV2ZW4gYW5kIG9kZCBhcnJheVNpemUKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAxID0KLSAgICAgICAgU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcDIgPQotICAgICAgICBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoNCk7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwMyA9Ci0gICAgICAgIFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXA0ID0KLSAgICAgICAgU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDQpOwotCi0gICAgLy8gVGVzdCB3aXRoIHB1dHMgaW4gYXNjZW5kaW5nIG9yZGVyLgotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykgewotICAgICAgYXNzZXJ0TnVsbChtYXAxLnB1dChpLCBpICsgMSkpOwotICAgICAgYXNzZXJ0TnVsbChtYXAyLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICAvLyBUZXN0IHdpdGggcHV0cyBpbiBkZXNjZW5kaW5nIG9yZGVyLgotICAgIGZvciAoaW50IGkgPSBudW1FbGVtZW50cyAtIDE7IGkgPj0gMDsgaS0tKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcDMucHV0KGksIGkgKyAxKSk7Ci0gICAgICBhc3NlcnROdWxsKG1hcDQucHV0KGksIGkgKyAxKSk7Ci0gICAgfQotCi0gICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDMsIG51bUVsZW1lbnRzKSwgbWFwMS5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDQsIG51bUVsZW1lbnRzKSwgbWFwMi5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDMsIG51bUVsZW1lbnRzKSwgbWFwMy5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKE1hdGgubWluKDQsIG51bUVsZW1lbnRzKSwgbWFwNC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0KLSAgICBMaXN0PFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+PiBhbGxNYXBzID0KLSAgICAgICAgbmV3IEFycmF5TGlzdDxTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPj4oKTsKLSAgICBhbGxNYXBzLmFkZChtYXAxKTsKLSAgICBhbGxNYXBzLmFkZChtYXAyKTsKLSAgICBhbGxNYXBzLmFkZChtYXAzKTsKLSAgICBhbGxNYXBzLmFkZChtYXA0KTsKLQotICAgIGZvciAoU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwIDogYWxsTWFwcykgewotICAgICAgYXNzZXJ0RXF1YWxzKG51bUVsZW1lbnRzLCBtYXAuc2l6ZSgpKTsKLSAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtRWxlbWVudHM7IGkrKykgewotICAgICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBtYXAuZ2V0KGkpKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICBhc3NlcnRFcXVhbHMobWFwMSwgbWFwMik7Ci0gICAgYXNzZXJ0RXF1YWxzKG1hcDIsIG1hcDMpOwotICAgIGFzc2VydEVxdWFscyhtYXAzLCBtYXA0KTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZXBsYWNpbmdQdXQoKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICAgIGFzc2VydE51bGwobWFwLnJlbW92ZShpICsgMSkpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgbWFwLnB1dChpLCBpICsgMikpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZW1vdmUoKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICAgIGFzc2VydE51bGwobWFwLnJlbW92ZShpICsgMSkpOwotICAgIH0KLQotICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscyg2LCAgbWFwLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1ha2VTb3J0ZWRLZXlTZXQoMCwgMSwgMiwgMywgNCwgNSksIG1hcC5rZXlTZXQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMiksIG1hcC5yZW1vdmUoMSkpOwotICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygyLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscyg1LCAgbWFwLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1ha2VTb3J0ZWRLZXlTZXQoMCwgMiwgMywgNCwgNSksIG1hcC5rZXlTZXQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNSksIG1hcC5yZW1vdmUoNCkpOwotICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscyg0LCAgbWFwLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKG1ha2VTb3J0ZWRLZXlTZXQoMCwgMiwgMywgNSksIG1hcC5rZXlTZXQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoNCksIG1hcC5yZW1vdmUoMykpOwotICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBtYXAuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMobWFrZVNvcnRlZEtleVNldCgwLCAyLCA1KSwgbWFwLmtleVNldCgpKTsKLQotICAgIGFzc2VydE51bGwobWFwLnJlbW92ZSgzKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5zaXplKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKDEpLCBtYXAucmVtb3ZlKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLmdldE51bUFycmF5RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMCwgbWFwLmdldE51bU92ZXJmbG93RW50cmllcygpKTsKLSAgICBhc3NlcnRFcXVhbHMoMiwgbWFwLnNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q2xlYXIoKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0gICAgbWFwLmNsZWFyKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEdldEFycmF5RW50cnlBbmRPdmVyZmxvd0VudHJpZXMoKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAzOyBpKyspIHsKLSAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IG1hcC5nZXRBcnJheUVudHJ5QXQoaSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSksIGVudHJ5LmdldEtleSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpICsgMSksIGVudHJ5LmdldFZhbHVlKCkpOwotICAgIH0KLSAgICBJdGVyYXRvcjxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGl0ID0KLSAgICAgICAgbWFwLmdldE92ZXJmbG93RW50cmllcygpLml0ZXJhdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDM7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydFRydWUoaXQuaGFzTmV4dCgpKTsKLSAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IGl0Lm5leHQoKTsKLSAgICAgIGFzc2VydEVxdWFscyhuZXcgSW50ZWdlcihpKSwgZW50cnkuZ2V0S2V5KCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgZW50cnkuZ2V0VmFsdWUoKSk7Ci0gICAgfQotICAgIGFzc2VydEZhbHNlKGl0Lmhhc05leHQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RW50cnlTZXRDb250YWlucygpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICBTZXQ8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBlbnRyeVNldCA9IG1hcC5lbnRyeVNldCgpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnRUcnVlKAotICAgICAgICAgIGVudHJ5U2V0LmNvbnRhaW5zKG5ldyBTaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPihpLCBpICsgMSkpKTsKLSAgICAgIGFzc2VydEZhbHNlKAotICAgICAgICAgIGVudHJ5U2V0LmNvbnRhaW5zKG5ldyBTaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPihpLCBpKSkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldEFkZCgpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgU2V0PE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gZW50cnlTZXQgPSBtYXAuZW50cnlTZXQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0KLSAgICAgICAgICBuZXcgU2ltcGxlRW50cnk8SW50ZWdlciwgSW50ZWdlcj4oaSwgaSArIDEpOwotICAgICAgYXNzZXJ0VHJ1ZShlbnRyeVNldC5hZGQoZW50cnkpKTsKLSAgICAgIGFzc2VydEZhbHNlKGVudHJ5U2V0LmFkZChlbnRyeSkpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkgKyAxKSwgbWFwLmdldChpKSk7Ci0gICAgfQotICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygzLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscyg2LCBtYXAuc2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldFJlbW92ZSgpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgU2V0PE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gZW50cnlTZXQgPSBtYXAuZW50cnlTZXQoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4gZW50cnkgPQotICAgICAgICAgIG5ldyBTaW1wbGVFbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPihpLCBpICsgMSk7Ci0gICAgICBhc3NlcnRUcnVlKGVudHJ5U2V0LnJlbW92ZShlbnRyeSkpOwotICAgICAgYXNzZXJ0RmFsc2UoZW50cnlTZXQucmVtb3ZlKGVudHJ5KSk7Ci0gICAgfQotICAgIGFzc2VydFRydWUobWFwLmlzRW1wdHkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1BcnJheUVudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5nZXROdW1PdmVyZmxvd0VudHJpZXMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1hcC5zaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVudHJ5U2V0Q2xlYXIoKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0gICAgbWFwLmVudHJ5U2V0KCkuY2xlYXIoKTsKLSAgICBhc3NlcnRUcnVlKG1hcC5pc0VtcHR5KCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtQXJyYXlFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtYXAuZ2V0TnVtT3ZlcmZsb3dFbnRyaWVzKCkpOwotICAgIGFzc2VydEVxdWFscygwLCBtYXAuc2l6ZSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldEl0ZXJhdG9yTmV4dCgpIHsKLSAgICBTbWFsbFNvcnRlZE1hcDxJbnRlZ2VyLCBJbnRlZ2VyPiBtYXAgPSBTbWFsbFNvcnRlZE1hcC5uZXdJbnN0YW5jZUZvclRlc3QoMyk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIGFzc2VydE51bGwobWFwLnB1dChpLCBpICsgMSkpOwotICAgIH0KLSAgICBJdGVyYXRvcjxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGl0ID0gbWFwLmVudHJ5U2V0KCkuaXRlcmF0b3IoKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0VHJ1ZShpdC5oYXNOZXh0KCkpOwotICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOwotICAgICAgYXNzZXJ0RXF1YWxzKG5ldyBJbnRlZ2VyKGkpLCBlbnRyeS5nZXRLZXkoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDEpLCBlbnRyeS5nZXRWYWx1ZSgpKTsKLSAgICB9Ci0gICAgYXNzZXJ0RmFsc2UoaXQuaGFzTmV4dCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFbnRyeVNldEl0ZXJhdG9yUmVtb3ZlKCkgewotICAgIFNtYWxsU29ydGVkTWFwPEludGVnZXIsIEludGVnZXI+IG1hcCA9IFNtYWxsU29ydGVkTWFwLm5ld0luc3RhbmNlRm9yVGVzdCgzKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IDY7IGkrKykgewotICAgICAgYXNzZXJ0TnVsbChtYXAucHV0KGksIGkgKyAxKSk7Ci0gICAgfQotICAgIEl0ZXJhdG9yPE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPj4gaXQgPSBtYXAuZW50cnlTZXQoKS5pdGVyYXRvcigpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnRUcnVlKG1hcC5jb250YWluc0tleShpKSk7Ci0gICAgICBpdC5uZXh0KCk7Ci0gICAgICBpdC5yZW1vdmUoKTsKLSAgICAgIGFzc2VydEZhbHNlKG1hcC5jb250YWluc0tleShpKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoNiAtIGkgLSAxLCBtYXAuc2l6ZSgpKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TWFwRW50cnlNb2RpZmljYXRpb24oKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0gICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBpdCA9IG1hcC5lbnRyeVNldCgpLml0ZXJhdG9yKCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCA2OyBpKyspIHsKLSAgICAgIE1hcC5FbnRyeTxJbnRlZ2VyLCBJbnRlZ2VyPiBlbnRyeSA9IGl0Lm5leHQoKTsKLSAgICAgIGVudHJ5LnNldFZhbHVlKGkgKyAyMyk7Ci0gICAgfQotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoaSArIDIzKSwgbWFwLmdldChpKSk7Ci0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdE1ha2VJbW11dGFibGUoKSB7Ci0gICAgU21hbGxTb3J0ZWRNYXA8SW50ZWdlciwgSW50ZWdlcj4gbWFwID0gU21hbGxTb3J0ZWRNYXAubmV3SW5zdGFuY2VGb3JUZXN0KDMpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgNjsgaSsrKSB7Ci0gICAgICBhc3NlcnROdWxsKG1hcC5wdXQoaSwgaSArIDEpKTsKLSAgICB9Ci0gICAgbWFwLm1ha2VJbW11dGFibGUoKTsKLSAgICBhc3NlcnRFcXVhbHMobmV3IEludGVnZXIoMSksIG1hcC5nZXQoMCkpOwotICAgIGFzc2VydEVxdWFscyg2LCBtYXAuc2l6ZSgpKTsKLQotICAgIHRyeSB7Ci0gICAgICBtYXAucHV0KDIzLCAyMyk7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgfQotCi0gICAgTWFwPEludGVnZXIsIEludGVnZXI+IG90aGVyID0gbmV3IEhhc2hNYXA8SW50ZWdlciwgSW50ZWdlcj4oKTsKLSAgICBvdGhlci5wdXQoMjMsIDIzKTsKLSAgICB0cnkgewotICAgICAgbWFwLnB1dEFsbChvdGhlcik7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIG1hcC5yZW1vdmUoMCk7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIG1hcC5jbGVhcigpOwotICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgIH0KLQotICAgIFNldDxNYXAuRW50cnk8SW50ZWdlciwgSW50ZWdlcj4+IGVudHJ5U2V0ID0gbWFwLmVudHJ5U2V0KCk7Ci0gICAgdHJ5IHsKLSAgICAgIGVudHJ5U2V0LmNsZWFyKCk7Ci0gICAgICBmYWlsKCJFeHBlY3RlZCBVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiIpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgfQotCi0gICAgSXRlcmF0b3I8TWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+PiBpdCA9IGVudHJ5U2V0Lml0ZXJhdG9yKCk7Ci0gICAgd2hpbGUgKGl0Lmhhc05leHQoKSkgewotICAgICAgTWFwLkVudHJ5PEludGVnZXIsIEludGVnZXI+IGVudHJ5ID0gaXQubmV4dCgpOwotICAgICAgdHJ5IHsKLSAgICAgICAgZW50cnkuc2V0VmFsdWUoMCk7Ci0gICAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgaXQucmVtb3ZlKCk7Ci0gICAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgfQotICAgIH0KLQotICAgIFNldDxJbnRlZ2VyPiBrZXlTZXQgPSBtYXAua2V5U2V0KCk7Ci0gICAgdHJ5IHsKLSAgICAgIGtleVNldC5jbGVhcigpOwotICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKLSAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgIH0KLQotICAgIEl0ZXJhdG9yPEludGVnZXI+IGtleXMgPSBrZXlTZXQuaXRlcmF0b3IoKTsKLSAgICB3aGlsZSAoa2V5cy5oYXNOZXh0KCkpIHsKLSAgICAgIEludGVnZXIga2V5ID0ga2V5cy5uZXh0KCk7Ci0gICAgICB0cnkgewotICAgICAgICBrZXlTZXQucmVtb3ZlKGtleSk7Ci0gICAgICAgIGZhaWwoIkV4cGVjdGVkIFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIik7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBleHBlY3RlZCkgewotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAga2V5cy5yZW1vdmUoKTsKLSAgICAgICAgZmFpbCgiRXhwZWN0ZWQgVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24iKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGV4cGVjdGVkKSB7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcHJpdmF0ZSBTZXQ8SW50ZWdlcj4gbWFrZVNvcnRlZEtleVNldChJbnRlZ2VyLi4uIGtleXMpIHsKLSAgICByZXR1cm4gbmV3IFRyZWVTZXQ8SW50ZWdlcj4oQXJyYXlzLjxJbnRlZ2VyPmFzTGlzdChrZXlzKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0QmFkSWRlbnRpZmllcnMuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNmZlZWM0ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGVzdEJhZElkZW50aWZpZXJzLmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLS8qKgotICogVGVzdHMgdGhhdCBwcm90bzIgYXBpIGdlbmVyYXRpb24gZG9lc24ndCBjYXVzZSBjb21waWxlIGVycm9ycyB3aGVuCi0gKiBjb21waWxpbmcgcHJvdG9jb2wgYnVmZmVycyB0aGF0IGhhdmUgbmFtZXMgdGhhdCB3b3VsZCBvdGhlcndpc2UgY29uZmxpY3QKLSAqIGlmIG5vdCBmdWxseSBxdWFsaWZpZWQgKGxpa2UgQERlcHJlY2F0ZWQgYW5kIEBPdmVycmlkZSkuIAotICoKLSAqIEBhdXRob3Igam9ucEBnb29nbGUuY29tIChKb24gUGVybG93KQotICovCi1wdWJsaWMgY2xhc3MgVGVzdEJhZElkZW50aWZpZXJzIGV4dGVuZHMgVGVzdENhc2UgewotCi0gIHB1YmxpYyB2b2lkIHRlc3RDb21waWxhdGlvbigpIHsKLSAgICAvLyBJZiB0aGlzIGNvbXBpbGVzLCBpdCBtZWFucyB0aGUgZ2VuZXJhdGlvbiB3YXMgY29ycmVjdC4KLSAgICBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5EZXByZWNhdGVkLm5ld0J1aWxkZXIoKTsKLSAgICBUZXN0QmFkSWRlbnRpZmllcnNQcm90by5PdmVycmlkZS5uZXdCdWlsZGVyKCk7Ci0gIH0gCi19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVGVzdFV0aWwuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbC5qYXZhCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5MTA5ZjQxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXN0VXRpbC5qYXZhCisrKyAvZGV2L251bGwKQEAgLTEsMzgxMSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlOwotCi0vLyBUaGUgc3RhdGljIGltcG9ydHMgYXJlIHRvIGF2b2lkIDEwMCsgY2hhciBsaW5lcy4gIFRoZSBmb2xsb3dpbmcgaXMgcm91Z2hseSBlcXVpdmFsZW50IHRvCi0vLyBpbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uKjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0SW50MzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRVaW50MzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U2ludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTaW50NjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEZpeGVkMzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEZpeGVkNjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0RmxvYXRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdERvdWJsZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Qm9vbEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0U3RyaW5nRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRCeXRlc0V4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5kZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLmRlZmF1bHRDb3JkRXh0ZW5zaW9uOwotCi1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsVWludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsVWludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEZpeGVkNjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRmxvYXRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxEb3VibGVFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxCb29sRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsQnl0ZXNFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxHcm91cEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5vcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLm9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxDb3JkRXh0ZW5zaW9uOwotCi1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkVWludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkVWludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEZpeGVkNjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRmxvYXRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWREb3VibGVFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRCb29sRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkQnl0ZXNFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRHcm91cEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5yZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucmVwZWF0ZWRDb3JkRXh0ZW5zaW9uOwotCi1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uT3B0aW9uYWxHcm91cF9leHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uUmVwZWF0ZWRHcm91cF9leHRlbnNpb247Ci0KLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRJbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRJbnQ2NEV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRVaW50MzJFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkVWludDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNpbnQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRTaW50NjRFeHRlbnNpb247Ci1pbXBvcnQgc3RhdGljIHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8ucGFja2VkRml4ZWQzMkV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRGaXhlZDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEZsb2F0RXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZERvdWJsZUV4dGVuc2lvbjsKLWltcG9ydCBzdGF0aWMgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5wYWNrZWRCb29sRXh0ZW5zaW9uOwotaW1wb3J0IHN0YXRpYyBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLnBhY2tlZEVudW1FeHRlbnNpb247Ci0KLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRVaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5kZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLmRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZTsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFNpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsU2ZpeGVkNjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEZsb2F0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFN0cmluZ0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLm9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5vcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUub3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZTsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5yZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZTsKLQotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5PcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5SZXBlYXRlZEdyb3VwX2V4dGVuc2lvbl9saXRlOwotCi1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkSW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRTaW50MzJFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkRml4ZWQ2NEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZTsKLWltcG9ydCBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUucGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRGbG9hdEV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZERvdWJsZUV4dGVuc2lvbkxpdGU7Ci1pbXBvcnQgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLnBhY2tlZEJvb2xFeHRlbnNpb25MaXRlOwotaW1wb3J0IHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5wYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZTsKLQotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsRXh0ZW5zaW9uc09yQnVpbGRlcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlczsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxUeXBlc09yQnVpbGRlcjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RQYWNrZWRFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFVucGFja2VkVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5Gb3JlaWduTWVzc2FnZTsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLkZvcmVpZ25FbnVtOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5Vbml0dGVzdEltcG9ydC5JbXBvcnRNZXNzYWdlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYudGVzdC5Vbml0dGVzdEltcG9ydC5JbXBvcnRFbnVtOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbFR5cGVzTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdEFsbEV4dGVuc2lvbnNMaXRlT3JCdWlsZGVyOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RMaXRlLlRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZTsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5Gb3JlaWduTWVzc2FnZUxpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuRm9yZWlnbkVudW1MaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RJbXBvcnRMaXRlLkltcG9ydE1lc3NhZ2VMaXRlOwotaW1wb3J0IGNvbS5nb29nbGUucHJvdG9idWYuVW5pdHRlc3RJbXBvcnRMaXRlLkltcG9ydEVudW1MaXRlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLkFzc2VydDsKLQotaW1wb3J0IGphdmEuaW8uRmlsZTsKLWltcG9ydCBqYXZhLmlvLklPRXhjZXB0aW9uOwotaW1wb3J0IGphdmEuaW8uUmFuZG9tQWNjZXNzRmlsZTsKLQotLyoqCi0gKiBDb250YWlucyBtZXRob2RzIGZvciBzZXR0aW5nIGFsbCBmaWVsZHMgb2Yge0Bjb2RlIFRlc3RBbGxUeXBlc30gdG8KLSAqIHNvbWUgdmF1bGVzIGFzIHdlbGwgYXMgY2hlY2tpbmcgdGhhdCBhbGwgdGhlIGZpZWxkcyBhcmUgc2V0IHRvIHRob3NlIHZhbHVlcy4KLSAqIFRoZXNlIGFyZSB1c2VmdWwgZm9yIHRlc3RpbmcgdmFyaW91cyBwcm90b2NvbCBtZXNzYWdlIGZlYXR1cmVzLCBlLmcuCi0gKiBzZXQgYWxsIGZpZWxkcyBvZiBhIG1lc3NhZ2UsIHNlcmlhbGl6ZSBpdCwgcGFyc2UgaXQsIGFuZCBjaGVjayB0aGF0IGFsbAotICogZmllbGRzIGFyZSBzZXQuCi0gKgotICogPHA+VGhpcyBjb2RlIGlzIG5vdCB0byBiZSB1c2VkIG91dHNpZGUgb2Yge0Bjb2RlIGNvbS5nb29nbGUucHJvdG9idWZ9IGFuZAotICogc3VicGFja2FnZXMuCi0gKgotICogQGF1dGhvciBrZW50b25AZ29vZ2xlLmNvbSBLZW50b24gVmFyZGEKLSAqLwotcHVibGljIGZpbmFsIGNsYXNzIFRlc3RVdGlsIHsKLSAgcHJpdmF0ZSBUZXN0VXRpbCgpIHt9Ci0KLSAgLyoqIEhlbHBlciB0byBjb252ZXJ0IGEgU3RyaW5nIHRvIEJ5dGVTdHJpbmcuICovCi0gIHN0YXRpYyBCeXRlU3RyaW5nIHRvQnl0ZXMoU3RyaW5nIHN0cikgewotICAgIHRyeSB7Ci0gICAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShzdHIuZ2V0Qnl0ZXMoIlVURi04IikpOwotICAgIH0gY2F0Y2goamF2YS5pby5VbnN1cHBvcnRlZEVuY29kaW5nRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKCJVVEYtOCBub3Qgc3VwcG9ydGVkLiIsIGUpOwotICAgIH0KLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSB7QGNvZGUgVGVzdEFsbFR5cGVzfSB3aXRoIGFsbCBmaWVsZHMgc2V0IGFzIHRoZXkgd291bGQgYmUgYnkKLSAgICoge0BsaW5rICNzZXRBbGxGaWVsZHMoVGVzdEFsbFR5cGVzLkJ1aWxkZXIpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgVGVzdEFsbFR5cGVzIGdldEFsbFNldCgpIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRBbGxGaWVsZHMoYnVpbGRlcik7Ci0gICAgcmV0dXJuIGJ1aWxkZXIuYnVpbGQoKTsKLSAgfQotCi0gIC8qKgotICAgKiBHZXQgYSB7QGNvZGUgVGVzdEFsbEV4dGVuc2lvbnN9IHdpdGggYWxsIGZpZWxkcyBzZXQgYXMgdGhleSB3b3VsZCBiZSBieQotICAgKiB7QGxpbmsgI3NldEFsbEV4dGVuc2lvbnMoVGVzdEFsbEV4dGVuc2lvbnMuQnVpbGRlcil9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBUZXN0QWxsRXh0ZW5zaW9ucyBnZXRBbGxFeHRlbnNpb25zU2V0KCkgewotICAgIFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3RBbGxFeHRlbnNpb25zTGl0ZSBnZXRBbGxMaXRlRXh0ZW5zaW9uc1NldCgpIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRBbGxFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRUeXBlcyBnZXRQYWNrZWRTZXQoKSB7Ci0gICAgVGVzdFBhY2tlZFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RQYWNrZWRUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgc2V0UGFja2VkRmllbGRzKGJ1aWxkZXIpOwotICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3RVbnBhY2tlZFR5cGVzIGdldFVucGFja2VkU2V0KCkgewotICAgIFRlc3RVbnBhY2tlZFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RVbnBhY2tlZFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRVbnBhY2tlZEZpZWxkcyhidWlsZGVyKTsKLSAgICByZXR1cm4gYnVpbGRlci5idWlsZCgpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyBUZXN0UGFja2VkRXh0ZW5zaW9ucyBnZXRQYWNrZWRFeHRlbnNpb25zU2V0KCkgewotICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RQYWNrZWRFeHRlbnNpb25zLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRQYWNrZWRFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIFRlc3RQYWNrZWRFeHRlbnNpb25zTGl0ZSBnZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpIHsKLSAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBidWlsZGVyID0KLSAgICAgICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLm5ld0J1aWxkZXIoKTsKLSAgICBzZXRQYWNrZWRFeHRlbnNpb25zKGJ1aWxkZXIpOwotICAgIHJldHVybiBidWlsZGVyLmJ1aWxkKCk7Ci0gIH0KLQotICAvKioKLSAgICogU2V0IGV2ZXJ5IGZpZWxkIG9mIHtAY29kZSBtZXNzYWdlfSB0byB0aGUgdmFsdWVzIGV4cGVjdGVkIGJ5Ci0gICAqIHtAY29kZSBhc3NlcnRBbGxGaWVsZHNTZXQoKX0uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0QWxsRmllbGRzKFRlc3RBbGxUeXBlcy5CdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsSW50MzIgICAoMTAxKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsSW50NjQgICAoMTAyKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsVWludDMyICAoMTAzKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsVWludDY0ICAoMTA0KTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsU2ludDMyICAoMTA1KTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsU2ludDY0ICAoMTA2KTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsRml4ZWQzMiAoMTA3KTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsRml4ZWQ2NCAoMTA4KTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsU2ZpeGVkMzIoMTA5KTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsU2ZpeGVkNjQoMTEwKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsRmxvYXQgICAoMTExKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsRG91YmxlICAoMTEyKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsQm9vbCAgICAodHJ1ZSk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFN0cmluZyAgKCIxMTUiKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsQnl0ZXMgICAodG9CeXRlcygiMTE2IikpOwotCi0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEdyb3VwKAotICAgICAgVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAubmV3QnVpbGRlcigpLnNldEEoMTE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSgKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigxMTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgKLSAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDExOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UoCi0gICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDEyMCkuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsTmVzdGVkRW51bSAoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsRm9yZWlnbkVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOwotICAgIG1lc3NhZ2Uuc2V0T3B0aW9uYWxJbXBvcnRFbnVtIChJbXBvcnRFbnVtLklNUE9SVF9CQVopOwotCi0gICAgbWVzc2FnZS5zZXRPcHRpb25hbFN0cmluZ1BpZWNlKCIxMjQiKTsKLSAgICBtZXNzYWdlLnNldE9wdGlvbmFsQ29yZCgiMTI1Iik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEludDMyICAgKDIwMSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEludDY0ICAgKDIwMik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFVpbnQzMiAgKDIwMyk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFVpbnQ2NCAgKDIwNCk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNpbnQzMiAgKDIwNSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNpbnQ2NCAgKDIwNik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpeGVkMzIgKDIwNyk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpeGVkNjQgKDIwOCk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNmaXhlZDMyKDIwOSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFNmaXhlZDY0KDIxMCk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZsb2F0ICAgKDIxMSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZERvdWJsZSAgKDIxMik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEJvb2wgICAgKHRydWUpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTdHJpbmcgICgiMjE1Iik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEJ5dGVzICAgKHRvQnl0ZXMoIjIxNiIpKTsKLQotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRHcm91cCgKLSAgICAgIFRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLm5ld0J1aWxkZXIoKS5zZXRBKDIxNykuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UoCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoCi0gICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QygyMTkpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbXBvcnRNZXNzYWdlKAotICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgyMjApLmJ1aWxkKCkpOwotCi0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZE5lc3RlZEVudW0gKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkSW1wb3J0RW51bSAoSW1wb3J0RW51bS5JTVBPUlRfQkFSKTsKLQotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTdHJpbmdQaWVjZSgiMjI0Iik7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZENvcmQoIjIyNSIpOwotCi0gICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbnQzMiAgICgzMDEpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbnQ2NCAgICgzMDIpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRVaW50MzIgICgzMDMpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRVaW50NjQgICgzMDQpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTaW50MzIgICgzMDUpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTaW50NjQgICgzMDYpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaXhlZDMyICgzMDcpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaXhlZDY0ICgzMDgpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTZml4ZWQzMigzMDkpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRTZml4ZWQ2NCgzMTApOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGbG9hdCAgICgzMTEpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWREb3VibGUgICgzMTIpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRCb29sICAgIChmYWxzZSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFN0cmluZyAgKCIzMTUiKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkQnl0ZXMgICAodG9CeXRlcygiMzE2IikpOwotCi0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEdyb3VwKAotICAgICAgVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAubmV3QnVpbGRlcigpLnNldEEoMzE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkTmVzdGVkTWVzc2FnZSgKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigzMTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgKLSAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDMxOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoCi0gICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDMyMCkuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkTmVzdGVkRW51bSAoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRm9yZWlnbkVudW0oRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOwotICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRJbXBvcnRFbnVtIChJbXBvcnRFbnVtLklNUE9SVF9CQVopOwotCi0gICAgbWVzc2FnZS5hZGRSZXBlYXRlZFN0cmluZ1BpZWNlKCIzMjQiKTsKLSAgICBtZXNzYWdlLmFkZFJlcGVhdGVkQ29yZCgiMzI1Iik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgbWVzc2FnZS5zZXREZWZhdWx0SW50MzIgICAoNDAxKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRJbnQ2NCAgICg0MDIpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFVpbnQzMiAgKDQwMyk7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0VWludDY0ICAoNDA0KTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRTaW50MzIgICg0MDUpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFNpbnQ2NCAgKDQwNik7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0Rml4ZWQzMiAoNDA3KTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRGaXhlZDY0ICg0MDgpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFNmaXhlZDMyKDQwOSk7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0U2ZpeGVkNjQoNDEwKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRGbG9hdCAgICg0MTEpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdERvdWJsZSAgKDQxMik7Ci0gICAgbWVzc2FnZS5zZXREZWZhdWx0Qm9vbCAgICAoZmFsc2UpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdFN0cmluZyAgKCI0MTUiKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRCeXRlcyAgICh0b0J5dGVzKCI0MTYiKSk7Ci0KLSAgICBtZXNzYWdlLnNldERlZmF1bHROZXN0ZWRFbnVtIChUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08pOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdEZvcmVpZ25FbnVtKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsKLSAgICBtZXNzYWdlLnNldERlZmF1bHRJbXBvcnRFbnVtIChJbXBvcnRFbnVtLklNUE9SVF9GT08pOwotCi0gICAgbWVzc2FnZS5zZXREZWZhdWx0U3RyaW5nUGllY2UoIjQyNCIpOwotICAgIG1lc3NhZ2Uuc2V0RGVmYXVsdENvcmQoIjQyNSIpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBNb2RpZnkgdGhlIHJlcGVhdGVkIGZpZWxkcyBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gY29udGFpbiB0aGUgdmFsdWVzCi0gICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEZpZWxkc01vZGlmaWVkKCl9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIG1vZGlmeVJlcGVhdGVkRmllbGRzKFRlc3RBbGxUeXBlcy5CdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkSW50MzIgICAoMSwgNTAxKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkSW50NjQgICAoMSwgNTAyKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkVWludDMyICAoMSwgNTAzKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkVWludDY0ICAoMSwgNTA0KTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkU2ludDMyICAoMSwgNTA1KTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkU2ludDY0ICAoMSwgNTA2KTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkRml4ZWQzMiAoMSwgNTA3KTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkRml4ZWQ2NCAoMSwgNTA4KTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkU2ZpeGVkMzIoMSwgNTA5KTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkU2ZpeGVkNjQoMSwgNTEwKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmxvYXQgICAoMSwgNTExKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkRG91YmxlICAoMSwgNTEyKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkQm9vbCAgICAoMSwgdHJ1ZSk7Ci0gICAgbWVzc2FnZS5zZXRSZXBlYXRlZFN0cmluZyAgKDEsICI1MTUiKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkQnl0ZXMgICAoMSwgdG9CeXRlcygiNTE2IikpOwotCi0gICAgbWVzc2FnZS5zZXRSZXBlYXRlZEdyb3VwKDEsCi0gICAgICBUZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cC5uZXdCdWlsZGVyKCkuc2V0QSg1MTcpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlKDEsCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoNTE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMSwKLSAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDUxOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UoMSwKLSAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoNTIwKS5idWlsZCgpKTsKLQotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWROZXN0ZWRFbnVtICgxLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08pOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGb3JlaWduRW51bSgxLCBGb3JlaWduRW51bS5GT1JFSUdOX0ZPTyk7Ci0gICAgbWVzc2FnZS5zZXRSZXBlYXRlZEltcG9ydEVudW0gKDEsIEltcG9ydEVudW0uSU1QT1JUX0ZPTyk7Ci0KLSAgICBtZXNzYWdlLnNldFJlcGVhdGVkU3RyaW5nUGllY2UoMSwgIjUyNCIpOwotICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRDb3JkKDEsICI1MjUiKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgotICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxGaWVsZHN9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFsbEZpZWxkc1NldChUZXN0QWxsVHlwZXNPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbnQzMiAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsSW50NjQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFVpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxVaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU2ludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGaXhlZDMyICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQ2NCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbFNmaXhlZDMyKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTZml4ZWQ2NCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsRmxvYXQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbERvdWJsZSAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxCb29sICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsU3RyaW5nICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEJ5dGVzICAgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEdyb3VwICAgICAgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxOZXN0ZWRNZXNzYWdlICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydE1lc3NhZ2UgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRPcHRpb25hbEdyb3VwICAgICAgICAgKCkuaGFzQSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSAoKS5oYXNCYigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKS5oYXNDKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpLmhhc0QoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkRW51bSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNPcHRpb25hbEZvcmVpZ25FbnVtKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRFbnVtICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc09wdGlvbmFsQ29yZCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAxICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQzMiAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMiAgLCBtZXNzYWdlLmdldE9wdGlvbmFsSW50NjQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDMgICwgbWVzc2FnZS5nZXRPcHRpb25hbFVpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA0ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxVaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNSAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDYgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA3ICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGaXhlZDMyICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwOCAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRml4ZWQ2NCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDkgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNmaXhlZDMyKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTEwICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTZml4ZWQ2NCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMSAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRmxvYXQgICAoKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMiAgLCBtZXNzYWdlLmdldE9wdGlvbmFsRG91YmxlICAoKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldE9wdGlvbmFsQm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTE1IiwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZyAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMTE2IiksIG1lc3NhZ2UuZ2V0T3B0aW9uYWxCeXRlcygpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE3LCBtZXNzYWdlLmdldE9wdGlvbmFsR3JvdXAgICAgICAgICAoKS5nZXRBKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE4LCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSAoKS5nZXRCYigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExOSwgbWVzc2FnZS5nZXRPcHRpb25hbEZvcmVpZ25NZXNzYWdlKCkuZ2V0QygpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyMCwgbWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydE1lc3NhZ2UgKCkuZ2V0RCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaLCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaLCBtZXNzYWdlLmdldE9wdGlvbmFsRm9yZWlnbkVudW0oKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9CQVosIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRFbnVtKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTI0IiwgbWVzc2FnZS5nZXRPcHRpb25hbFN0cmluZ1BpZWNlKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjEyNSIsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxDb3JkKCkpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjRDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzJDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NENvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjRDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzJDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NENvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMkNvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0Q291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXRDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGVDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2xDb3VudCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlc0NvdW50ICAgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCAgICAgICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bUNvdW50ICAgICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjQgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzIgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDQgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NCAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA2ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjQgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzIgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOCAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NCAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMigwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTAgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0KDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXQgICAoMCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZSAgKDApLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sICAgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZyAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXMoMCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cCAgICAgICAgICgwKS5nZXRBKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE4LCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSAoMCkuZ2V0QmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgwKS5nZXRDKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjIwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSAoMCkuZ2V0RCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bSAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bSgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9CQVIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZSgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmQoMCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMiAgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjQgICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzIgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDQgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NCAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA2ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjQgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzIgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwOCAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NCAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMigxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTAgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0KDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXQgICAoMSksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTIgICwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZSAgKDEpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sICAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZyAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjMxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXMoMSkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cCAgICAgICAgICgxKS5nZXRBKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE4LCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSAoMSkuZ2V0QmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxKS5nZXRDKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzIwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSAoMSkuZ2V0RCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bSAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bSgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9CQVosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDEpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjMyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZSgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmQoMSkpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEludDMyICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEludDY0ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFNpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEZpeGVkMzIgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEZpeGVkNjQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDMyKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDY0KCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEZsb2F0ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdERvdWJsZSAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEJvb2wgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdFN0cmluZyAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRGVmYXVsdEJ5dGVzICAgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0TmVzdGVkRW51bSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0Rm9yZWlnbkVudW0oKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNEZWZhdWx0SW1wb3J0RW51bSAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmdQaWVjZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0RlZmF1bHRDb3JkKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDEgICwgbWVzc2FnZS5nZXREZWZhdWx0SW50MzIgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDIgICwgbWVzc2FnZS5nZXREZWZhdWx0SW50NjQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDMgICwgbWVzc2FnZS5nZXREZWZhdWx0VWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDQgICwgbWVzc2FnZS5nZXREZWZhdWx0VWludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDUgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDYgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDcgICwgbWVzc2FnZS5nZXREZWZhdWx0Rml4ZWQzMiAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDggICwgbWVzc2FnZS5nZXREZWZhdWx0Rml4ZWQ2NCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDkgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MTAgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ZpeGVkNjQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MTEgICwgbWVzc2FnZS5nZXREZWZhdWx0RmxvYXQgICAoKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMiAgLCBtZXNzYWdlLmdldERlZmF1bHREb3VibGUgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0RGVmYXVsdEJvb2wgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjQxNSIsIG1lc3NhZ2UuZ2V0RGVmYXVsdFN0cmluZyAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiNDE2IiksIG1lc3NhZ2UuZ2V0RGVmYXVsdEJ5dGVzKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sIG1lc3NhZ2UuZ2V0RGVmYXVsdE5lc3RlZEVudW0gKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sIG1lc3NhZ2UuZ2V0RGVmYXVsdEZvcmVpZ25FbnVtKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfRk9PLCBtZXNzYWdlLmdldERlZmF1bHRJbXBvcnRFbnVtKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDI0IiwgbWVzc2FnZS5nZXREZWZhdWx0U3RyaW5nUGllY2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNDI1IiwgbWVzc2FnZS5nZXREZWZhdWx0Q29yZCgpKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBmaWVsZHMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBjbGVhcmVkLCBhbmQgdGhhdCBnZXR0aW5nIHRoZSBmaWVsZHMgcmV0dXJucyB0aGVpcgotICAgKiBkZWZhdWx0IHZhbHVlcy4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRDbGVhcihUZXN0QWxsVHlwZXNPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgIC8vIGhhc0JsYWgoKSBzaG91bGQgaW5pdGlhbGx5IGJlIGZhbHNlIGZvciBhbGwgb3B0aW9uYWwgZmllbGRzLgotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsSW50MzIgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbnQ2NCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFVpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsVWludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFNpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRml4ZWQzMiAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGaXhlZDY0ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbFNmaXhlZDMyKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsU2ZpeGVkNjQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGbG9hdCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbERvdWJsZSAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsQm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmcgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEJ5dGVzICAgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxHcm91cCAgICAgICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsRm9yZWlnbk1lc3NhZ2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc09wdGlvbmFsTmVzdGVkRW51bSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbEltcG9ydEVudW0gKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzT3B0aW9uYWxTdHJpbmdQaWVjZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNPcHRpb25hbENvcmQoKSk7Ci0KLSAgICAvLyBPcHRpb25hbCBmaWVsZHMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHplcm8gb3Igc29tZXRoaW5nIGxpa2UgaXQuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbEludDMyICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbnQ2NCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsVWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFVpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxTaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbEZpeGVkMzIgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGaXhlZDY0ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRPcHRpb25hbFNmaXhlZDY0KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGbG9hdCAgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxEb3VibGUgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxCb29sICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiICAgLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldE9wdGlvbmFsQnl0ZXMoKSk7Ci0KLSAgICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRPcHRpb25hbEdyb3VwICAgICAgICAgKCkuaGFzQSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZE1lc3NhZ2UgKCkuaGFzQmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmhhc0MoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0T3B0aW9uYWxJbXBvcnRNZXNzYWdlICgpLmhhc0QoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxHcm91cCAgICAgICAgICgpLmdldEEoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsTmVzdGVkTWVzc2FnZSAoKS5nZXRCYigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduTWVzc2FnZSgpLmdldEMoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldE9wdGlvbmFsSW1wb3J0TWVzc2FnZSAoKS5nZXREKCkpOwotCi0gICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTywgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZEVudW0gKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sIG1lc3NhZ2UuZ2V0T3B0aW9uYWxGb3JlaWduRW51bSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEltcG9ydEVudW0uSU1QT1JUX0ZPTywgbWVzc2FnZS5nZXRPcHRpb25hbEltcG9ydEVudW0oKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlLmdldE9wdGlvbmFsU3RyaW5nUGllY2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiwgbWVzc2FnZS5nZXRPcHRpb25hbENvcmQoKSk7Ci0KLSAgICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDMyQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50NjRDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50MzJDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQ2NENvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDMyQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50NjRDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkMzJDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQ2NENvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQzMkNvdW50KCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDY0Q291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmxvYXRDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWREb3VibGVDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEJvb2xDb3VudCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nQ291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCeXRlc0NvdW50ICAgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXBDb3VudCAgICAgICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRNZXNzYWdlQ291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25NZXNzYWdlQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZUNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWROZXN0ZWRFbnVtQ291bnQgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZvcmVpZ25FbnVtQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bUNvdW50ICAgICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZ1BpZWNlQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkQ29yZENvdW50KCkpOwotCi0gICAgLy8gaGFzQmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEludDMyICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRJbnQ2NCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0VWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFVpbnQ2NCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTaW50MzIgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZpeGVkMzIgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRGaXhlZDY0ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0U2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdFNmaXhlZDY0KCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRGbG9hdCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0RG91YmxlICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEJvb2wgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmcgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Qnl0ZXMgICAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0TmVzdGVkRW51bSAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRGVmYXVsdEZvcmVpZ25FbnVtKCkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRJbXBvcnRFbnVtICgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0RlZmF1bHRTdHJpbmdQaWVjZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNEZWZhdWx0Q29yZCgpKTsKLQotICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDEgICAgLCBtZXNzYWdlLmdldERlZmF1bHRJbnQzMiAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MiAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEludDY0ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQzICAgICwgbWVzc2FnZS5nZXREZWZhdWx0VWludDMyICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDQgICAgLCBtZXNzYWdlLmdldERlZmF1bHRVaW50NjQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC00NSAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdFNpbnQzMiAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ2ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ludDY0ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNDcgICAgLCBtZXNzYWdlLmdldERlZmF1bHRGaXhlZDMyICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0OCAgICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZpeGVkNjQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIDQ5ICAgICwgbWVzc2FnZS5nZXREZWZhdWx0U2ZpeGVkMzIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygtNTAgICAgLCBtZXNzYWdlLmdldERlZmF1bHRTZml4ZWQ2NCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1MS41ICAsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZsb2F0ICAgKCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyggNTJlMyAgLCBtZXNzYWdlLmdldERlZmF1bHREb3VibGUgICgpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAgICwgbWVzc2FnZS5nZXREZWZhdWx0Qm9vbCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiaGVsbG8iLCBtZXNzYWdlLmdldERlZmF1bHRTdHJpbmcgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIndvcmxkIiksIG1lc3NhZ2UuZ2V0RGVmYXVsdEJ5dGVzKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsIG1lc3NhZ2UuZ2V0RGVmYXVsdE5lc3RlZEVudW0gKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIsIG1lc3NhZ2UuZ2V0RGVmYXVsdEZvcmVpZ25FbnVtKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFSLCBtZXNzYWdlLmdldERlZmF1bHRJbXBvcnRFbnVtKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYWJjIiwgbWVzc2FnZS5nZXREZWZhdWx0U3RyaW5nUGllY2UoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMTIzIiwgbWVzc2FnZS5nZXREZWZhdWx0Q29yZCgpKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGZpZWxkcyBvZgotICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxGaWVsZHN9Ci0gICAqIGZvbGxvd2VkIGJ5IHtAY29kZSBtb2RpZnlSZXBlYXRlZEZpZWxkc30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UmVwZWF0ZWRGaWVsZHNNb2RpZmllZCgKLSAgICAgIFRlc3RBbGxUeXBlc09yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCi0gICAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKLSAgICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50MzJDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQ2NENvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzJDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQ2NENvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQzMkNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDY0Q291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDMyQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkNjRDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdENvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZUNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbENvdW50ICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzQ291bnQgICAoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cENvdW50ICAgICAgICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2VDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRNZXNzYWdlQ291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW1Db3VudCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW1Db3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtQ291bnQgICAgKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2VDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkQ291bnQoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkSW50MzIgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQ2NCAgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFVpbnQzMiAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDY0ICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTaW50MzIgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQ2NCAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRml4ZWQzMiAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDY0ICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNmaXhlZDMyKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkNjQoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGbG9hdCAgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZERvdWJsZSAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkQm9vbCAgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmcgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEJ5dGVzKDApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE3LCBtZXNzYWdlLmdldFJlcGVhdGVkR3JvdXAgICAgICAgICAoMCkuZ2V0QSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOCwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZE1lc3NhZ2UgKDApLmdldEJiKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbk1lc3NhZ2UoMCkuZ2V0QygpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIyMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEltcG9ydE1lc3NhZ2UgKDApLmdldEQoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwgbWVzc2FnZS5nZXRSZXBlYXRlZE5lc3RlZEVudW0gKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkRm9yZWlnbkVudW0oMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoSW1wb3J0RW51bS5JTVBPUlRfQkFSLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0RW51bSgwKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkU3RyaW5nUGllY2UoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRDb3JkKDApKTsKLQotICAgIC8vIEFjdHVhbGx5IHZlcmlmeSB0aGUgc2Vjb25kIChtb2RpZmllZCkgZWxlbWVudHMgbm93LgotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbnQzMiAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEludDY0ICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkVWludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRVaW50NjQgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZFNpbnQzMiAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ludDY0ICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaXhlZDMyICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpeGVkNjQgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkU2ZpeGVkMzIoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTZml4ZWQ2NCgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZsb2F0ICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRG91YmxlICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRCb29sICAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZFN0cmluZyAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkQnl0ZXMoMSkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTcsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRHcm91cCAgICAgICAgICgxKS5nZXRBKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE4LCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkTWVzc2FnZSAoMSkuZ2V0QmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduTWVzc2FnZSgxKS5nZXRDKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTIwLCBtZXNzYWdlLmdldFJlcGVhdGVkSW1wb3J0TWVzc2FnZSAoMSkuZ2V0RCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLCBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bSAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGb3JlaWduRW51bSgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhJbXBvcnRFbnVtLklNUE9SVF9GT08sIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRJbXBvcnRFbnVtKDEpKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjUyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRTdHJpbmdQaWVjZSgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZENvcmQoMSkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gYSB1bmlxdWUgdmFsdWUuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0UGFja2VkRmllbGRzKFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEludDMyICAgKDYwMSk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRJbnQ2NCAgICg2MDIpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkVWludDMyICAoNjAzKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZFVpbnQ2NCAgKDYwNCk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRTaW50MzIgICg2MDUpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ludDY0ICAoNjA2KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEZpeGVkMzIgKDYwNyk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRGaXhlZDY0ICg2MDgpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ZpeGVkMzIoNjA5KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZFNmaXhlZDY0KDYxMCk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRGbG9hdCAgICg2MTEpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkRG91YmxlICAoNjEyKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEJvb2wgICAgKHRydWUpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkRW51bSAgICAoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOwotICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICBtZXNzYWdlLmFkZFBhY2tlZEludDMyICAgKDcwMSk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRJbnQ2NCAgICg3MDIpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkVWludDMyICAoNzAzKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZFVpbnQ2NCAgKDcwNCk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRTaW50MzIgICg3MDUpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ludDY0ICAoNzA2KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEZpeGVkMzIgKDcwNyk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRGaXhlZDY0ICg3MDgpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkU2ZpeGVkMzIoNzA5KTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZFNmaXhlZDY0KDcxMCk7Ci0gICAgbWVzc2FnZS5hZGRQYWNrZWRGbG9hdCAgICg3MTEpOwotICAgIG1lc3NhZ2UuYWRkUGFja2VkRG91YmxlICAoNzEyKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEJvb2wgICAgKGZhbHNlKTsKLSAgICBtZXNzYWdlLmFkZFBhY2tlZEVudW0gICAgKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKLSAgfQotCi0gIC8qKgotICAgKiBTZXQgZXZlcnkgZmllbGQgb2Yge0Bjb2RlIG1lc3NhZ2V9IHRvIGEgdW5pcXVlIHZhbHVlLiBNdXN0IGNvcnJlc3BvbmQgd2l0aAotICAgKiB0aGUgdmFsdWVzIGFwcGxpZWQgYnkge0Bjb2RlIHNldFBhY2tlZEZpZWxkc30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgc2V0VW5wYWNrZWRGaWVsZHMoVGVzdFVucGFja2VkVHlwZXMuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEludDMyICAgKDYwMSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEludDY0ICAgKDYwMik7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFVpbnQzMiAgKDYwMyk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFVpbnQ2NCAgKDYwNCk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNpbnQzMiAgKDYwNSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNpbnQ2NCAgKDYwNik7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZpeGVkMzIgKDYwNyk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZpeGVkNjQgKDYwOCk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNmaXhlZDMyKDYwOSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZFNmaXhlZDY0KDYxMCk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEZsb2F0ICAgKDYxMSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZERvdWJsZSAgKDYxMik7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEJvb2wgICAgKHRydWUpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRFbnVtICAgIChGb3JlaWduRW51bS5GT1JFSUdOX0JBUik7Ci0gICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRJbnQzMiAgICg3MDEpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRJbnQ2NCAgICg3MDIpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRVaW50MzIgICg3MDMpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRVaW50NjQgICg3MDQpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTaW50MzIgICg3MDUpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTaW50NjQgICg3MDYpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRGaXhlZDMyICg3MDcpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRGaXhlZDY0ICg3MDgpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTZml4ZWQzMig3MDkpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRTZml4ZWQ2NCg3MTApOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRGbG9hdCAgICg3MTEpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWREb3VibGUgICg3MTIpOwotICAgIG1lc3NhZ2UuYWRkVW5wYWNrZWRCb29sICAgIChmYWxzZSk7Ci0gICAgbWVzc2FnZS5hZGRVbnBhY2tlZEVudW0gICAgKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCi0gICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldFBhY2tlZEZpZWxkc30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UGFja2VkRmllbGRzU2V0KFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZEludDMyQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZEludDY0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZFVpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZFVpbnQ2NENvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZFNpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZFNpbnQ2NENvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZEZpeGVkMzJDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZEZpeGVkNjRDb3VudCAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZFNmaXhlZDMyQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZFNmaXhlZDY0Q291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZEZsb2F0Q291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZERvdWJsZUNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZEJvb2xDb3VudCAgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFBhY2tlZEVudW1Db3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMSAgLCBtZXNzYWdlLmdldFBhY2tlZEludDMyICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMiAgLCBtZXNzYWdlLmdldFBhY2tlZEludDY0ICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMyAgLCBtZXNzYWdlLmdldFBhY2tlZFVpbnQzMiAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNCAgLCBtZXNzYWdlLmdldFBhY2tlZFVpbnQ2NCAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNSAgLCBtZXNzYWdlLmdldFBhY2tlZFNpbnQzMiAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNiAgLCBtZXNzYWdlLmdldFBhY2tlZFNpbnQ2NCAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNyAgLCBtZXNzYWdlLmdldFBhY2tlZEZpeGVkMzIgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwOCAgLCBtZXNzYWdlLmdldFBhY2tlZEZpeGVkNjQgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwOSAgLCBtZXNzYWdlLmdldFBhY2tlZFNmaXhlZDMyKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMCAgLCBtZXNzYWdlLmdldFBhY2tlZFNmaXhlZDY0KDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMSAgLCBtZXNzYWdlLmdldFBhY2tlZEZsb2F0ICAgKDApLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjEyICAsIG1lc3NhZ2UuZ2V0UGFja2VkRG91YmxlICAoMCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRQYWNrZWRCb29sICAgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwgbWVzc2FnZS5nZXRQYWNrZWRFbnVtKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMSAgLCBtZXNzYWdlLmdldFBhY2tlZEludDMyICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMiAgLCBtZXNzYWdlLmdldFBhY2tlZEludDY0ICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMyAgLCBtZXNzYWdlLmdldFBhY2tlZFVpbnQzMiAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNCAgLCBtZXNzYWdlLmdldFBhY2tlZFVpbnQ2NCAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNSAgLCBtZXNzYWdlLmdldFBhY2tlZFNpbnQzMiAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNiAgLCBtZXNzYWdlLmdldFBhY2tlZFNpbnQ2NCAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNyAgLCBtZXNzYWdlLmdldFBhY2tlZEZpeGVkMzIgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOCAgLCBtZXNzYWdlLmdldFBhY2tlZEZpeGVkNjQgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOSAgLCBtZXNzYWdlLmdldFBhY2tlZFNmaXhlZDMyKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMCAgLCBtZXNzYWdlLmdldFBhY2tlZFNmaXhlZDY0KDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMSAgLCBtZXNzYWdlLmdldFBhY2tlZEZsb2F0ICAgKDEpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEyICAsIG1lc3NhZ2UuZ2V0UGFja2VkRG91YmxlICAoMSksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmYWxzZSwgbWVzc2FnZS5nZXRQYWNrZWRCb29sICAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwgbWVzc2FnZS5nZXRQYWNrZWRFbnVtKDEpKTsKLSAgfQotCi0gIC8qKgotICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCi0gICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldFVucGFja2VkRmllbGRzfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRVbnBhY2tlZEZpZWxkc1NldChUZXN0VW5wYWNrZWRUeXBlcyBtZXNzYWdlKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkSW50MzJDb3VudCAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQ2NENvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQzMkNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkVWludDY0Q291bnQgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50MzJDb3VudCAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQ2NENvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQzMkNvdW50ICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDY0Q291bnQgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDMyQ291bnQoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkNjRDb3VudCgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGbG9hdENvdW50ICAgKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRVbnBhY2tlZERvdWJsZUNvdW50ICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFVucGFja2VkQm9vbENvdW50ICAgICgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRFbnVtQ291bnQgICAoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDEgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDMyICAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMiAgLCBtZXNzYWdlLmdldFVucGFja2VkSW50NjQgICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAzICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50MzIgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDQgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFVpbnQ2NCAgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNSAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDMyICAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA2ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTaW50NjQgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDcgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkMzIgKDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwOCAgLCBtZXNzYWdlLmdldFVucGFja2VkRml4ZWQ2NCAoMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA5ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQzMigwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTAgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNmaXhlZDY0KDApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMSAgLCBtZXNzYWdlLmdldFVucGFja2VkRmxvYXQgICAoMCksIDAuMCk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTIgICwgbWVzc2FnZS5nZXRVbnBhY2tlZERvdWJsZSAgKDApLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHModHJ1ZSAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRCb29sICAgICgwKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwgbWVzc2FnZS5nZXRVbnBhY2tlZEVudW0oMCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAxICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRJbnQzMiAgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDIgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEludDY0ICAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMyAgLCBtZXNzYWdlLmdldFVucGFja2VkVWludDMyICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA0ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRVaW50NjQgICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDUgICwgbWVzc2FnZS5nZXRVbnBhY2tlZFNpbnQzMiAgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNiAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ludDY0ICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA3ICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRGaXhlZDMyICgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDggICwgbWVzc2FnZS5nZXRVbnBhY2tlZEZpeGVkNjQgKDEpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOSAgLCBtZXNzYWdlLmdldFVucGFja2VkU2ZpeGVkMzIoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEwICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWRTZml4ZWQ2NCgxKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTEgICwgbWVzc2FnZS5nZXRVbnBhY2tlZEZsb2F0ICAgKDEpLCAwLjApOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEyICAsIG1lc3NhZ2UuZ2V0VW5wYWNrZWREb3VibGUgICgxKSwgMC4wKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZhbHNlLCBtZXNzYWdlLmdldFVucGFja2VkQm9vbCAgICAoMSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosIG1lc3NhZ2UuZ2V0VW5wYWNrZWRFbnVtKDEpKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSAgLy8gTGlrZSBhYm92ZSwgYnV0IGZvciBleHRlbnNpb25zCi0KLSAgLy8gSmF2YSBnZXRzIGNvbmZ1c2VkIHdpdGggdGhpbmdzIGxpa2UgYXNzZXJ0RXF1YWxzKGludCwgSW50ZWdlcik6ICBpdCBjYW4ndAotICAvLyBkZWNpZGUgd2hldGhlciB0byBjYWxsIGFzc2VydEVxdWFscyhpbnQsIGludCkgb3IgYXNzZXJ0RXF1YWxzKE9iamVjdCwKLSAgLy8gT2JqZWN0KS4gIFNvIHdlIGRlZmluZSB0aGVzZSBtZXRob2RzIHRvIGhlbHAgaXQuCi0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGludCBhLCBpbnQgYikgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUobG9uZyBhLCBsb25nIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZsb2F0IGEsIGZsb2F0IGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIsIDAuMCk7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZG91YmxlIGEsIGRvdWJsZSBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiLCAwLjApOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGJvb2xlYW4gYSwgYm9vbGVhbiBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShTdHJpbmcgYSwgU3RyaW5nIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEJ5dGVTdHJpbmcgYSwgQnl0ZVN0cmluZyBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bSBhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bSBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bSBhLCBGb3JlaWduRW51bSBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtIGEsIEltcG9ydEVudW0gYikgewotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoYSwgYik7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgdm9pZCBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bSBiKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscyhhLCBiKTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyB2b2lkIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUgYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRm9yZWlnbkVudW1MaXRlIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0gIHByaXZhdGUgc3RhdGljIHZvaWQgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlIGEsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEltcG9ydEVudW1MaXRlIGIpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGEsIGIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEdldCBhbiB1bm1vZGlmaWFibGUge0BsaW5rIEV4dGVuc2lvblJlZ2lzdHJ5fSBjb250YWluaW5nIGFsbCB0aGUKLSAgICogZXh0ZW5zaW9ucyBvZiB7QGNvZGUgVGVzdEFsbEV4dGVuc2lvbnN9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBFeHRlbnNpb25SZWdpc3RyeSBnZXRFeHRlbnNpb25SZWdpc3RyeSgpIHsKLSAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsKLSAgICByZXR1cm4gcmVnaXN0cnkuZ2V0VW5tb2RpZmlhYmxlKCk7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBnZXRFeHRlbnNpb25SZWdpc3RyeUxpdGUoKSB7Ci0gICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHJlZ2lzdHJ5ID0gRXh0ZW5zaW9uUmVnaXN0cnlMaXRlLm5ld0luc3RhbmNlKCk7Ci0gICAgcmVnaXN0ZXJBbGxFeHRlbnNpb25zTGl0ZShyZWdpc3RyeSk7Ci0gICAgcmV0dXJuIHJlZ2lzdHJ5LmdldFVubW9kaWZpYWJsZSgpOwotICB9Ci0KLSAgLyoqCi0gICAqIFJlZ2lzdGVyIGFsbCBvZiB7QGNvZGUgVGVzdEFsbEV4dGVuc2lvbnN9J3MgZXh0ZW5zaW9ucyB3aXRoIHRoZQotICAgKiBnaXZlbiB7QGxpbmsgRXh0ZW5zaW9uUmVnaXN0cnl9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHJlZ2lzdGVyQWxsRXh0ZW5zaW9ucyhFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkgewotICAgIFVuaXR0ZXN0UHJvdG8ucmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTsKLSAgICByZWdpc3RlckFsbEV4dGVuc2lvbnNMaXRlKHJlZ2lzdHJ5KTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFsbEV4dGVuc2lvbnNMaXRlKEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSByZWdpc3RyeSkgewotICAgIFVuaXR0ZXN0TGl0ZS5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpOwotICB9Ci0KLSAgLyoqCi0gICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQotICAgKiB7QGNvZGUgYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldCgpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRBbGxFeHRlbnNpb25zKFRlc3RBbGxFeHRlbnNpb25zLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb24gICAsIDEwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICwgMTAyTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICwgMTAzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbiAgLCAxMDRMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgLCAxMDUpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uICAsIDEwNkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbiAsIDEwNyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICwgMTA4TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbiwgMTA5KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uLCAxMTBMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgLCAxMTFGKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbiAgLCAxMTJEKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb24gICAgLCB0cnVlKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgLCAiMTE1Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbiAgICwgdG9CeXRlcygiMTE2IikpOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiwKLSAgICAgIE9wdGlvbmFsR3JvdXBfZXh0ZW5zaW9uLm5ld0J1aWxkZXIoKS5zZXRBKDExNykuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDExOCkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwKLSAgICAgIEZvcmVpZ25NZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRDKDExOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgSW1wb3J0TWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0RCgxMjApLmJ1aWxkKCkpOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fQkFaKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb24sIEltcG9ydEVudW0uSU1QT1JUX0JBWik7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAiMTI0Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uLCAiMTI1Iik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMjAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAyMDJMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAyMDMpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICAsIDIwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICAsIDIwNSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMjA2TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMjA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAyMDhMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAyMDkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDIxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICAsIDIxMUYpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICAsIDIxMkQpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICAsIHRydWUpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsICIyMTUiKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgLCB0b0J5dGVzKCIyMTYiKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uLAotICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24ubmV3QnVpbGRlcigpLnNldEEoMjE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24sCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMjE5KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24sCi0gICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDIyMCkuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFSKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sICIyMjQiKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sICIyMjUiKTsKLQotICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAzMDEpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDMwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDMwMyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMzA0TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMzA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAzMDZMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAzMDcpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDMwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDMwOSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMzEwTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMzExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMzEyRCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgZmFsc2UpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsICIzMTUiKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgLCB0b0J5dGVzKCIzMTYiKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uLAotICAgICAgUmVwZWF0ZWRHcm91cF9leHRlbnNpb24ubmV3QnVpbGRlcigpLnNldEEoMzE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24sCi0gICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMzE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLAotICAgICAgRm9yZWlnbk1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEMoMzE5KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24sCi0gICAgICBJbXBvcnRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXREKDMyMCkuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVopOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfQkFaKTsKLQotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sICIzMjQiKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sICIzMjUiKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICAsIDQwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uICAgLCA0MDJMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uICAsIDQwMyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbiAgLCA0MDRMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uICAsIDQwNSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiAgLCA0MDZMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiAsIDQwNyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb24gLCA0MDhMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb24sIDQwOSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uLCA0MTBMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb24gICAsIDQxMUYpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICwgNDEyRCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb24gICAgLCBmYWxzZSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbiAgLCAiNDE1Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uICAgLCB0b0J5dGVzKCI0MTYiKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbiwgVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb24sIEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbiwgSW1wb3J0RW51bS5JTVBPUlRfRk9PKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgIjQyNCIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uLCAiNDI1Iik7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZXh0ZW5zaW9ucyBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gY29udGFpbiB0aGUgdmFsdWVzCi0gICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAxLCA1MDEpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDEsIDUwMkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDEsIDUwMyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMSwgNTA0TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMSwgNTA1KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAxLCA1MDZMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAxLCA1MDcpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDEsIDUwOEwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDEsIDUwOSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSwgNTEwTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMSwgNTExRik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMSwgNTEyRCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMSwgdHJ1ZSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMSwgIjUxNSIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICAsIDEsIHRvQnl0ZXMoIjUxNiIpKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24sIDEsCi0gICAgICBSZXBlYXRlZEdyb3VwX2V4dGVuc2lvbi5uZXdCdWlsZGVyKCkuc2V0QSg1MTcpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiwgMSwKLSAgICAgIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDEsCi0gICAgICBGb3JlaWduTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0Qyg1MTkpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiwgMSwKLSAgICAgIEltcG9ydE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEQoNTIwKS5idWlsZCgpKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiAsIDEsIFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMSwgRm9yZWlnbkVudW0uRk9SRUlHTl9GT08pOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAsIDEsIEltcG9ydEVudW0uSU1QT1JUX0ZPTyk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAxLCAiNTI0Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAxLCAiNTI1Iik7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBleHRlbnNpb25zIG9mCi0gICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldEFsbEV4dGVuc2lvbnN9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydEFsbEV4dGVuc2lvbnNTZXQoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc09yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKS5oYXNBKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLmhhc0JiKCkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pLmhhc0MoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkuaGFzRCgpKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb24gKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb24gICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjExNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkuZ2V0RCgpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb24pKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24gICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZENvcmRFeHRlbnNpb24pKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiwgMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICwgMCkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gLCAwKS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uLCAwKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiAsIDApLmdldEQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24sIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uLCAwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoZmFsc2UsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMzE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24sIDEpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24gICAgICAgICAsIDEpLmdldEEoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICwgMSkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwgMSkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gLCAxKS5nZXREKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfQkFaLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCAxKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMSkpOwotCi0gICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbiAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb24gKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbikpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb24gICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNDExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg0MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjQxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCI0MTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24gKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0ZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjQyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNDI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb24pKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBjbGVhcmVkLCBhbmQgdGhhdCBnZXR0aW5nIHRoZSBleHRlbnNpb25zIHJldHVybnMgdGhlaXIKLSAgICogZGVmYXVsdCB2YWx1ZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyKFRlc3RBbGxFeHRlbnNpb25zT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAvLyBoYXNCbGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ0V4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb24gICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbiApKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbikpOwotCi0gICAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwRiAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwRCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShCeXRlU3RyaW5nLkVNUFRZLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uKSk7Ci0KLSAgICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkuaGFzQSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkuaGFzQmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pLmhhc0MoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApLmhhc0QoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbiAgICAgICAgICkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApLmdldEQoKSk7Ci0KLSAgICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb24gKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtLklNUE9SVF9GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb24pKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uKSk7Ci0KLSAgICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWREb3VibGVFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbiAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkR3JvdXBFeHRlbnNpb24gICAgICAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiAgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbikpOwotCi0gICAgLy8gUmVwZWF0ZWQgZmllbGRzIGFyZSBlbXB0eSB2aWEgZ2V0RXh0ZW5zaW9uKCkuc2l6ZSgpLgotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbiAgICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb24gICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbikuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uICAgICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgKS5zaXplKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uICAgICkuc2l6ZSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24gICApLnNpemUoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb24gICAgKS5zaXplKCkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uKS5zaXplKCkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uKS5zaXplKCkpOwotCi0gICAgLy8gaGFzQmxhaCgpIHNob3VsZCBhbHNvIGJlIGZhbHNlIGZvciBhbGwgZGVmYXVsdCBmaWVsZHMuCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbikpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbiApKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb24pKTsKLQotICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQzMkV4dGVuc2lvbiAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDJMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb24gICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQzICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50NjRFeHRlbnNpb24gICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgtNDUgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ2TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0NyAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDMyRXh0ZW5zaW9uICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDhMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbiApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ5ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKC01MEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQ2NEV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNTEuNUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb24gICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDUyZTNEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRCb29sRXh0ZW5zaW9uICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiaGVsbG8iLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygid29ybGQiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdE5lc3RlZEVudW1FeHRlbnNpb24gKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoImFiYyIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbikpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTIzIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb24pKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRXh0ZW5zaW9uc30KLSAgICogZm9sbG93ZWQgYnkge0Bjb2RlIG1vZGlmeVJlcGVhdGVkRXh0ZW5zaW9uc30uCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UmVwZWF0ZWRFeHRlbnNpb25zTW9kaWZpZWQoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc09yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgLy8gTW9kaWZ5UmVwZWF0ZWRGaWVsZHMgb25seSBzZXRzIHRoZSBzZWNvbmQgcmVwZWF0ZWQgZWxlbWVudCBvZiBlYWNoCi0gICAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKLSAgICAvLyBlbGVtZW50IGFuZCBzaXplIHdlcmUgKm5vdCogbW9kaWZpZWQuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbiAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb24gICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRHcm91cEV4dGVuc2lvbiAgICAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24gICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24gICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uICAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24pKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb24gICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb24gICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbiAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbiAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb24gICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbiAgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb24sIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb24gICAgICAgICAsIDApLmdldEEoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uICwgMCkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbiwgMCkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb24gLCAwKS5nZXREKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbiwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bS5JTVBPUlRfQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uLCAwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbiwgMCkpOwotCi0gICAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb24gLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb24gLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb24gICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI1MTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uLCAxKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uICAgICAgICAgLCAxKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbiAsIDEpLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb24sIDEpLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uICwgMSkuZ2V0RCgpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb24sIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW0uRk9SRUlHTl9GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW0uSU1QT1JUX0ZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbiwgMSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI1MjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI1MjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb24sIDEpKTsKLSAgfQotCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBzZXRQYWNrZWRFeHRlbnNpb25zKFRlc3RQYWNrZWRFeHRlbnNpb25zLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uICAgLCA2MDEpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uICAgLCA2MDJMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50MzJFeHRlbnNpb24gICwgNjAzKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb24gICwgNjA0TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uICAsIDYwNSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uICAsIDYwNkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb24gLCA2MDcpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb24gLCA2MDhMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbiwgNjA5KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgNjEwTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb24gICAsIDYxMUYpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbiAgLCA2MTJEKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uICAgICwgdHJ1ZSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbiwgRm9yZWlnbkVudW0uRk9SRUlHTl9CQVIpOwotICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICwgNzAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbiAgICwgNzAyTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uICAsIDcwMyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkVWludDY0RXh0ZW5zaW9uICAsIDcwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbiAgLCA3MDUpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbiAgLCA3MDZMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICwgNzA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uICwgNzA4TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDcwOSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkU2ZpeGVkNjRFeHRlbnNpb24sIDcxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uICAgLCA3MTFGKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWREb3VibGVFeHRlbnNpb24gICwgNzEyRCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkQm9vbEV4dGVuc2lvbiAgICAsIGZhbHNlKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uLCBGb3JlaWduRW51bS5GT1JFSUdOX0JBWik7Ci0gIH0KLQotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldChUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlKSB7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEludDMyRXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEludDY0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFVpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFVpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNpbnQzMkV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNpbnQ2NEV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEZpeGVkMzJFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEZpeGVkNjRFeHRlbnNpb24gKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEZsb2F0RXh0ZW5zaW9uICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZERvdWJsZUV4dGVuc2lvbiAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEJvb2xFeHRlbnNpb24gICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEVudW1FeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQ2NEV4dGVuc2lvbiAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTaW50MzJFeHRlbnNpb24gICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb24gLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb24sIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDY0RXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGbG9hdEV4dGVuc2lvbiAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEJvb2xFeHRlbnNpb24gICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtLkZPUkVJR05fQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbiAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkSW50NjRFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb24gICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDMyRXh0ZW5zaW9uICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQ2NEV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRml4ZWQ2NEV4dGVuc2lvbiAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbiwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRmxvYXRFeHRlbnNpb24gICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZERvdWJsZUV4dGVuc2lvbiAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uICAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bS5GT1JFSUdOX0JBWiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRW51bUV4dGVuc2lvbiwgMSkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotICAvLyBMaXRlIGV4dGVuc2lvbnMKLQotICAvKioKLSAgICogU2V0IGV2ZXJ5IGZpZWxkIG9mIHtAY29kZSBtZXNzYWdlfSB0byB0aGUgdmFsdWVzIGV4cGVjdGVkIGJ5Ci0gICAqIHtAY29kZSBhc3NlcnRBbGxFeHRlbnNpb25zU2V0KCl9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldEFsbEV4dGVuc2lvbnMoVGVzdEFsbEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50MzJFeHRlbnNpb25MaXRlICAgLCAxMDEpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlICAgLCAxMDJMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMTAzKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMTA0TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlICAsIDEwNSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlICAsIDEwNkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAxMDcpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAxMDhMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMTA5KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMTEwTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDExMUYpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAxMTJEKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICwgdHJ1ZSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlICAsICIxMTUiKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEJ5dGVzRXh0ZW5zaW9uTGl0ZSAgICwgdG9CeXRlcygiMTE2IikpOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUsCi0gICAgICBPcHRpb25hbEdyb3VwX2V4dGVuc2lvbl9saXRlLm5ld0J1aWxkZXIoKS5zZXRBKDExNykuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMTE4KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIEZvcmVpZ25NZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0QygxMTkpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUsCi0gICAgICBJbXBvcnRNZXNzYWdlTGl0ZS5uZXdCdWlsZGVyKCkuc2V0RCgxMjApLmJ1aWxkKCkpOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFaKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCBJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVopOwotCi0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsICIxMjQiKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb25MaXRlLCAiMTI1Iik7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDIwMSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDIwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAyMDMpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAyMDRMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMjA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMjA2TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDIwNyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDIwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAyMDkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAyMTBMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMjExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDIxMkQpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCB0cnVlKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgIjIxNSIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlICAgLCB0b0J5dGVzKCIyMTYiKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUubmV3QnVpbGRlcigpLnNldEEoMjE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigyMTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXRDKDIxOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIEltcG9ydE1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXREKDIyMCkuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFSKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBUik7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgIjIyNCIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsICIyMjUiKTsKLQotICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMzAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMzAyTCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDMwMyk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDMwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAzMDUpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAzMDZMKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMzA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMzA4TCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDMwOSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDMxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAzMTFGKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMzEyRCk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIGZhbHNlKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgIjMxNSIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlICAgLCB0b0J5dGVzKCIzMTYiKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUubmV3QnVpbGRlcigpLnNldEEoMzE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYigzMTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLAotICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXRDKDMxOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwKLSAgICAgIEltcG9ydE1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXREKDMyMCkuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCBUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFaKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWik7Ci0KLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgIjMyNCIpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsICIzMjUiKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlICAgLCA0MDEpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDQwMkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlICAsIDQwMyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgNDA0TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgNDA1KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCA0MDZMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGUgLCA0MDcpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDQwOEwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDQwOSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgNDEwTCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgNDExRik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUgICwgNDEyRCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlICAgICwgZmFsc2UpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlICAsICI0MTUiKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlICAgLCB0b0J5dGVzKCI0MTYiKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08pOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0ZPTyk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAiNDI0Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlLCAiNDI1Iik7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIE1vZGlmeSB0aGUgcmVwZWF0ZWQgZXh0ZW5zaW9ucyBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gY29udGFpbiB0aGUgdmFsdWVzCi0gICAqIGV4cGVjdGVkIGJ5IHtAY29kZSBhc3NlcnRSZXBlYXRlZEV4dGVuc2lvbnNNb2RpZmllZCgpfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnMoCi0gICAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEsIDUwMSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDEsIDUwMkwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxLCA1MDMpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxLCA1MDRMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSwgNTA1KTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSwgNTA2TCk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEsIDUwNyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDEsIDUwOEwpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAxLCA1MDkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAxLCA1MTBMKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMSwgNTExRik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDEsIDUxMkQpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAxLCB0cnVlKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgMSwgIjUxNSIpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlICAgLCAxLCB0b0J5dGVzKCI1MTYiKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSwgMSwKLSAgICAgIFJlcGVhdGVkR3JvdXBfZXh0ZW5zaW9uX2xpdGUubmV3QnVpbGRlcigpLnNldEEoNTE3KS5idWlsZCgpKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlLCAxLAotICAgICAgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlLm5ld0J1aWxkZXIoKS5zZXRCYig1MTgpLmJ1aWxkKCkpOwotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLCAxLAotICAgICAgRm9yZWlnbk1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXRDKDUxOSkuYnVpbGQoKSk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSwgMSwKLSAgICAgIEltcG9ydE1lc3NhZ2VMaXRlLm5ld0J1aWxkZXIoKS5zZXREKDUyMCkuYnVpbGQoKSk7Ci0KLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICwgMSwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTyk7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIDEsIEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PKTsKLSAgICBtZXNzYWdlLnNldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlICwgMSwgSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfRk9PKTsKLQotICAgIG1lc3NhZ2Uuc2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAxLCAiNTI0Iik7Ci0gICAgbWVzc2FnZS5zZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgMSwgIjUyNSIpOwotICB9Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gIC8qKgotICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZXh0ZW5zaW9ucyBvZgotICAgKiB7QGNvZGUgbWVzc2FnZX0gYXJlIHNldCB0byB0aGUgdmFsdWVzIGFzc2lnbmVkIGJ5IHtAY29kZSBzZXRBbGxFeHRlbnNpb25zfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgdm9pZCBhc3NlcnRBbGxFeHRlbnNpb25zU2V0KAotICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxOZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkuaGFzQSgpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuaGFzQmIoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpLmhhc0MoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmhhc0QoKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgxMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMTE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMTE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDExOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDEyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApLmdldEQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVosCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydEVudW1FeHRlbnNpb25MaXRlKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjEyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIxMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbENvcmRFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSAgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCIyMTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUsIDApKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgLDApLmdldEEoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMCkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsMCkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICwwKS5nZXREKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMjI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDJMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzAzICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDUgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA2TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMDhMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzA5ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTFGICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzEyRCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJvb2xFeHRlbnNpb25MaXRlICAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzE1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygiMzE2IiksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlLCAxKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMzE3LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICwxKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTgsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgLDEpLmdldEJiKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgzMTksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlLDEpLmdldEMoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDMyMCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMSkuZ2V0RCgpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShUZXN0QWxsVHlwZXNMaXRlLk5lc3RlZEVudW0uQkFaLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0JBWiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMzI0IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjMyNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUsIDEpKTsKLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ0V4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDQxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0RG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI0MTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjQxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qnl0ZXNFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0ZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI0MjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI0MjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Q29yZEV4dGVuc2lvbkxpdGUpKTsKLSAgfQotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAvKioKLSAgICogQXNzZXJ0ICh1c2luZyB7QGNvZGUganVuaXQuZnJhbWV3b3JrLkFzc2VydH19IHRoYXQgYWxsIGV4dGVuc2lvbnMgb2YKLSAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBjbGVhcmVkLCBhbmQgdGhhdCBnZXR0aW5nIHRoZSBleHRlbnNpb25zIHJldHVybnMgdGhlaXIKLSAgICogZGVmYXVsdCB2YWx1ZXMuCi0gICAqLwotICBwdWJsaWMgc3RhdGljIHZvaWQgYXNzZXJ0RXh0ZW5zaW9uc0NsZWFyKAotICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAvLyBoYXNCbGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxEb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24ob3B0aW9uYWxDb3JkRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB6ZXJvIG9yIHNvbWV0aGluZyBsaWtlIGl0LgotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxVaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMCAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwTCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMEYgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDBEICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShmYWxzZSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEJ5dGVTdHJpbmcuRU1QVFksIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQnl0ZXNFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApLmhhc0EoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsTmVzdGVkTWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5oYXNCYigpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpLmhhc0MoKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgKS5oYXNEKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgKS5nZXRBKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbk1lc3NhZ2VFeHRlbnNpb25MaXRlKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkuZ2V0RCgpKTsKLQotICAgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihvcHRpb25hbE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0ZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsRm9yZWlnbkVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEltcG9ydEVudW1MaXRlLklNUE9SVF9MSVRFX0ZPTywKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsSW1wb3J0RW51bUV4dGVuc2lvbkxpdGUpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ob3B0aW9uYWxTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIiIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKG9wdGlvbmFsQ29yZEV4dGVuc2lvbkxpdGUpKTsKLQotICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBhcmUgZW1wdHkuCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkMzJFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQnl0ZXNFeHRlbnNpb25MaXRlICAgKSk7Ci0KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWROZXN0ZWRFbnVtRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSAgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICAvLyBoYXNCbGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEludDMyRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0SW50NjRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFVpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U2ludDMyRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEZpeGVkMzJFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0Rml4ZWQ2NEV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDY0RXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0RmxvYXRFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHREb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEJvb2xFeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0U3RyaW5nRXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0V4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdEltcG9ydEVudW1FeHRlbnNpb25MaXRlICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdQaWVjZUV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlKSk7Ci0KLSAgICAvLyBGaWVsZHMgd2l0aCBkZWZhdWx0cyBoYXZlIHRoZWlyIGRlZmF1bHQgdmFsdWVzIChkdWgpLgotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDEgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW50MzJFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0MkwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQzICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFVpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDRMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0VWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKC00NSAgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ2TCAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNpbnQ2NEV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSggNDcgICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Rml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA0OEwgICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDQ5ICAgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgtNTBMICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0U2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCA1MS41RiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIDUyZTNEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdERvdWJsZUV4dGVuc2lvbkxpdGUgICkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0Qm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCJoZWxsbyIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKGRlZmF1bHRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodG9CeXRlcygid29ybGQiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEJ5dGVzRXh0ZW5zaW9uTGl0ZSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0TmVzdGVkRW51bUV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfQkFSLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihkZWZhdWx0SW1wb3J0RW51bUV4dGVuc2lvbkxpdGUpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiYWJjIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiMTIzIiwgbWVzc2FnZS5nZXRFeHRlbnNpb24oZGVmYXVsdENvcmRFeHRlbnNpb25MaXRlKSk7Ci0gIH0KLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgLyoqCi0gICAqIEFzc2VydCAodXNpbmcge0Bjb2RlIGp1bml0LmZyYW1ld29yay5Bc3NlcnR9fSB0aGF0IGFsbCBleHRlbnNpb25zIG9mCi0gICAqIHtAY29kZSBtZXNzYWdlfSBhcmUgc2V0IHRvIHRoZSB2YWx1ZXMgYXNzaWduZWQgYnkge0Bjb2RlIHNldEFsbEV4dGVuc2lvbnN9Ci0gICAqIGZvbGxvd2VkIGJ5IHtAY29kZSBtb2RpZnlSZXBlYXRlZEV4dGVuc2lvbnN9LgotICAgKi8KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFJlcGVhdGVkRXh0ZW5zaW9uc01vZGlmaWVkKAotICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAvLyBNb2RpZnlSZXBlYXRlZEZpZWxkcyBvbmx5IHNldHMgdGhlIHNlY29uZCByZXBlYXRlZCBlbGVtZW50IG9mIGVhY2gKLSAgICAvLyBmaWVsZC4gIEluIGFkZGl0aW9uIHRvIHZlcmlmeWluZyB0aGlzLCB3ZSBhbHNvIHZlcmlmeSB0aGF0IHRoZSBmaXJzdAotICAgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRGbG9hdEV4dGVuc2lvbkxpdGUgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRTdHJpbmdFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUgICApKTsKLQotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEdyb3VwRXh0ZW5zaW9uTGl0ZSAgICAgICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlICAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlICAgICkpOwotCi0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHJlcGVhdGVkQ29yZEV4dGVuc2lvbkxpdGUpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDEgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50NjRFeHRlbnNpb25MaXRlICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwMyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDRMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwNkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQ2NEV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMDcgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQ2NEV4dGVuc2lvbkxpdGUgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIwOSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMTBMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRmxvYXRFeHRlbnNpb25MaXRlICAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxMkQgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZERvdWJsZUV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0cnVlICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIxNSIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEJ5dGVzRXh0ZW5zaW9uTGl0ZSwgMCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDIxNywgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRHcm91cEV4dGVuc2lvbkxpdGUgICAgICAgICAsMCkuZ2V0QSgpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE4LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZE1lc3NhZ2VFeHRlbnNpb25MaXRlICwwKS5nZXRCYigpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoMjE5LCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25NZXNzYWdlRXh0ZW5zaW9uTGl0ZSwwKS5nZXRDKCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgyMjAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW1wb3J0TWVzc2FnZUV4dGVuc2lvbkxpdGUgLDApLmdldEQoKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRFbnVtLkJBUiwKLSAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZvcmVpZ25FbnVtRXh0ZW5zaW9uTGl0ZSwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZShJbXBvcnRFbnVtTGl0ZS5JTVBPUlRfTElURV9CQVIsCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydEVudW1FeHRlbnNpb25MaXRlLCAwKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoIjIyNCIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU3RyaW5nUGllY2VFeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCIyMjUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZENvcmRFeHRlbnNpb25MaXRlLCAwKSk7Ci0KLSAgICAvLyBBY3R1YWxseSB2ZXJpZnkgdGhlIHNlY29uZCAobW9kaWZpZWQpIGVsZW1lbnRzIG5vdy4KLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTAxICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkSW50MzJFeHRlbnNpb25MaXRlICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwMkwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRVaW50MzJFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA0TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkVWludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwNSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTA3ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkRml4ZWQzMkV4dGVuc2lvbkxpdGUgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUwOEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTEwTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkU2ZpeGVkNjRFeHRlbnNpb25MaXRlLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxMUYgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWREb3VibGVFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUodHJ1ZSAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkQm9vbEV4dGVuc2lvbkxpdGUgICAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI1MTUiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ0V4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSh0b0J5dGVzKCI1MTYiKSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRCeXRlc0V4dGVuc2lvbkxpdGUsIDEpKTsKLQotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg1MTcsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHJlcGVhdGVkR3JvdXBFeHRlbnNpb25MaXRlICAgICAgICAgLDEpLmdldEEoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxOCwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWROZXN0ZWRNZXNzYWdlRXh0ZW5zaW9uTGl0ZSAsMSkuZ2V0QmIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDUxOSwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduTWVzc2FnZUV4dGVuc2lvbkxpdGUsMSkuZ2V0QygpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNTIwLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZEltcG9ydE1lc3NhZ2VFeHRlbnNpb25MaXRlICwxKS5nZXREKCkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkRW51bS5GT08sCi0gICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZE5lc3RlZEVudW1FeHRlbnNpb25MaXRlLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKEZvcmVpZ25FbnVtTGl0ZS5GT1JFSUdOX0xJVEVfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRGb3JlaWduRW51bUV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoSW1wb3J0RW51bUxpdGUuSU1QT1JUX0xJVEVfRk9PLAotICAgICAgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRJbXBvcnRFbnVtRXh0ZW5zaW9uTGl0ZSwgMSkpOwotCi0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKCI1MjQiLCBtZXNzYWdlLmdldEV4dGVuc2lvbihyZXBlYXRlZFN0cmluZ1BpZWNlRXh0ZW5zaW9uTGl0ZSwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSgiNTI1IiwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocmVwZWF0ZWRDb3JkRXh0ZW5zaW9uTGl0ZSwgMSkpOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIHNldFBhY2tlZEV4dGVuc2lvbnMoVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgNjAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDYwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgNjAzKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDYwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgNjA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDYwNkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgNjA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDYwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgNjA5KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDYxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgNjExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCA2MTJEKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIHRydWUpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb25MaXRlLCBGb3JlaWduRW51bUxpdGUuRk9SRUlHTl9MSVRFX0JBUik7Ci0gICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEludDMyRXh0ZW5zaW9uTGl0ZSAgICwgNzAxKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRJbnQ2NEV4dGVuc2lvbkxpdGUgICAsIDcwMkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFVpbnQzMkV4dGVuc2lvbkxpdGUgICwgNzAzKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDcwNEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgNzA1KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICAsIDcwNkwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZpeGVkMzJFeHRlbnNpb25MaXRlICwgNzA3KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRGaXhlZDY0RXh0ZW5zaW9uTGl0ZSAsIDcwOEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZFNmaXhlZDMyRXh0ZW5zaW9uTGl0ZSwgNzA5KTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDcxMEwpOwotICAgIG1lc3NhZ2UuYWRkRXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgNzExRik7Ci0gICAgbWVzc2FnZS5hZGRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCA3MTJEKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIGZhbHNlKTsKLSAgICBtZXNzYWdlLmFkZEV4dGVuc2lvbihwYWNrZWRFbnVtRXh0ZW5zaW9uTGl0ZSwgRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVopOwotICB9Ci0KLSAgcHVibGljIHN0YXRpYyB2b2lkIGFzc2VydFBhY2tlZEV4dGVuc2lvbnNTZXQoVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UpIHsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkSW50MzJFeHRlbnNpb25MaXRlICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRVaW50MzJFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkVWludDY0RXh0ZW5zaW9uTGl0ZSAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTaW50NjRFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkRml4ZWQzMkV4dGVuc2lvbkxpdGUgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWRTZml4ZWQzMkV4dGVuc2lvbkxpdGUpKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkU2ZpeGVkNjRFeHRlbnNpb25MaXRlKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICkpOwotICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRFeHRlbnNpb25Db3VudChwYWNrZWREb3VibGVFeHRlbnNpb25MaXRlICApKTsKLSAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uQ291bnQocGFja2VkQm9vbEV4dGVuc2lvbkxpdGUgICAgKSk7Ci0gICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldEV4dGVuc2lvbkNvdW50KHBhY2tlZEVudW1FeHRlbnNpb25MaXRlKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDYxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNjExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMCkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg2MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKHRydWUgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDApKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb25MaXRlLCAwKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwMSAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRJbnQzMkV4dGVuc2lvbkxpdGUgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzAyTCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEludDY0RXh0ZW5zaW9uTGl0ZSAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDMgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkVWludDMyRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRVaW50NjRFeHRlbnNpb25MaXRlICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA1ICAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZFNpbnQzMkV4dGVuc2lvbkxpdGUgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDZMICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ludDY0RXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcwNyAgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRGaXhlZDMyRXh0ZW5zaW9uTGl0ZSAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzA4TCAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZpeGVkNjRFeHRlbnNpb25MaXRlICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MDkgICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkU2ZpeGVkMzJFeHRlbnNpb25MaXRlLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKDcxMEwgLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRTZml4ZWQ2NEV4dGVuc2lvbkxpdGUsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoNzExRiAsIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEZsb2F0RXh0ZW5zaW9uTGl0ZSAgICwgMSkpOwotICAgIGFzc2VydEVxdWFsc0V4YWN0VHlwZSg3MTJEICwgbWVzc2FnZS5nZXRFeHRlbnNpb24ocGFja2VkRG91YmxlRXh0ZW5zaW9uTGl0ZSAgLCAxKSk7Ci0gICAgYXNzZXJ0RXF1YWxzRXhhY3RUeXBlKGZhbHNlLCBtZXNzYWdlLmdldEV4dGVuc2lvbihwYWNrZWRCb29sRXh0ZW5zaW9uTGl0ZSAgICAsIDEpKTsKLSAgICBhc3NlcnRFcXVhbHNFeGFjdFR5cGUoRm9yZWlnbkVudW1MaXRlLkZPUkVJR05fTElURV9CQVosCi0gICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKHBhY2tlZEVudW1FeHRlbnNpb25MaXRlLCAxKSk7Ci0gIH0KLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIC8qKgotICAgKiBQZXJmb3JtcyB0aGUgc2FtZSB0aGluZ3MgdGhhdCB0aGUgbWV0aG9kcyBvZiB7QGNvZGUgVGVzdFV0aWx9IGRvLCBidXQKLSAgICogdmlhIHRoZSByZWZsZWN0aW9uIGludGVyZmFjZS4gIFRoaXMgaXMgaXRzIG93biBjbGFzcyBiZWNhdXNlIGl0IG5lZWRzCi0gICAqIHRvIGtub3cgd2hhdCBkZXNjcmlwdG9yIHRvIHVzZS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgY2xhc3MgUmVmbGVjdGlvblRlc3RlciB7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGJhc2VEZXNjcmlwdG9yOwotICAgIHByaXZhdGUgZmluYWwgRXh0ZW5zaW9uUmVnaXN0cnkgZXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yIGZpbGU7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciBpbXBvcnRGaWxlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG9wdGlvbmFsR3JvdXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIHJlcGVhdGVkR3JvdXA7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIG5lc3RlZE1lc3NhZ2U7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGZvcmVpZ25NZXNzYWdlOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBpbXBvcnRNZXNzYWdlOwotCi0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZ3JvdXBBOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIHJlcGVhdGVkR3JvdXBBOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRmllbGREZXNjcmlwdG9yIG5lc3RlZEI7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZm9yZWlnbkM7Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgaW1wb3J0RDsKLQotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3IgbmVzdGVkRW51bTsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1EZXNjcmlwdG9yIGZvcmVpZ25FbnVtOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bURlc2NyaXB0b3IgaW1wb3J0RW51bTsKLQotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBuZXN0ZWRGb287Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIG5lc3RlZEJhcjsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgbmVzdGVkQmF6OwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBmb3JlaWduRm9vOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBmb3JlaWduQmFyOwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBmb3JlaWduQmF6OwotICAgIHByaXZhdGUgZmluYWwgRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBpbXBvcnRGb287Ci0gICAgcHJpdmF0ZSBmaW5hbCBEZXNjcmlwdG9ycy5FbnVtVmFsdWVEZXNjcmlwdG9yIGltcG9ydEJhcjsKLSAgICBwcml2YXRlIGZpbmFsIERlc2NyaXB0b3JzLkVudW1WYWx1ZURlc2NyaXB0b3IgaW1wb3J0QmF6OwotCi0gICAgLyoqCi0gICAgICogQ29uc3RydWN0IGEge0Bjb2RlIFJlZmxlY3Rpb25UZXN0ZXJ9IHRoYXQgd2lsbCBleHBlY3QgbWVzc2FnZXMgdXNpbmcKLSAgICAgKiB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4KLSAgICAgKgotICAgICAqIE5vcm1hbGx5IHtAY29kZSBiYXNlRGVzY3JpcHRvcn0gc2hvdWxkIGJlIGEgZGVzY3JpcHRvciBmb3IgdGhlIHR5cGUKLSAgICAgKiB7QGNvZGUgVGVzdEFsbFR5cGVzfSwgZGVmaW5lZCBpbgotICAgICAqIHtAY29kZSBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG99LiAgSG93ZXZlciwgaWYKLSAgICAgKiB7QGNvZGUgZXh0ZW5zaW9uUmVnaXN0cnl9IGlzIG5vbi1udWxsLCB0aGVuIHtAY29kZSBiYXNlRGVzY3JpcHRvcn0gc2hvdWxkCi0gICAgICogYmUgZm9yIHtAY29kZSBUZXN0QWxsRXh0ZW5zaW9uc30gaW5zdGVhZCwgYW5kIGluc3RlYWQgb2YgcmVhZGluZyBhbmQKLSAgICAgKiB3cml0aW5nIG5vcm1hbCBmaWVsZHMsIHRoZSB0ZXN0ZXIgd2lsbCByZWFkIGFuZCB3cml0ZSBleHRlbnNpb25zLgotICAgICAqIEFsbCBvZiB7QGNvZGUgVGVzdEFsbEV4dGVuc2lvbnN9JyBleHRlbnNpb25zIG11c3QgYmUgcmVnaXN0ZXJlZCBpbiB0aGUKLSAgICAgKiByZWdpc3RyeS4KLSAgICAgKi8KLSAgICBwdWJsaWMgUmVmbGVjdGlvblRlc3RlcihEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGJhc2VEZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblJlZ2lzdHJ5IGV4dGVuc2lvblJlZ2lzdHJ5KSB7Ci0gICAgICB0aGlzLmJhc2VEZXNjcmlwdG9yID0gYmFzZURlc2NyaXB0b3I7Ci0gICAgICB0aGlzLmV4dGVuc2lvblJlZ2lzdHJ5ID0gZXh0ZW5zaW9uUmVnaXN0cnk7Ci0KLSAgICAgIHRoaXMuZmlsZSA9IGJhc2VEZXNjcmlwdG9yLmdldEZpbGUoKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMSwgZmlsZS5nZXREZXBlbmRlbmNpZXMoKS5zaXplKCkpOwotICAgICAgdGhpcy5pbXBvcnRGaWxlID0gZmlsZS5nZXREZXBlbmRlbmNpZXMoKS5nZXQoMCk7Ci0KLSAgICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgdGVzdEFsbFR5cGVzOwotICAgICAgaWYgKGJhc2VEZXNjcmlwdG9yLmdldE5hbWUoKSA9PSAiVGVzdEFsbFR5cGVzIikgewotICAgICAgICB0ZXN0QWxsVHlwZXMgPSBiYXNlRGVzY3JpcHRvcjsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHRlc3RBbGxUeXBlcyA9IGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJUZXN0QWxsVHlwZXMiKTsKLSAgICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwodGVzdEFsbFR5cGVzKTsKLSAgICAgIH0KLQotICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpIHsKLSAgICAgICAgLy8gVXNlIHRlc3RBbGxUeXBlcywgcmF0aGVyIHRoYW4gYmFzZURlc2NyaXB0b3IsIHRvIGFsbG93Ci0gICAgICAgIC8vIGluaXRpYWxpemF0aW9uIHVzaW5nIFRlc3RQYWNrZWRUeXBlcyBkZXNjcmlwdG9ycy4gVGhlc2Ugb2JqZWN0cwotICAgICAgICAvLyB3b24ndCBiZSB1c2VkIGJ5IHRoZSBtZXRob2RzIGZvciBwYWNrZWQgZmllbGRzLgotICAgICAgICB0aGlzLm9wdGlvbmFsR3JvdXAgPQotICAgICAgICAgIHRlc3RBbGxUeXBlcy5maW5kTmVzdGVkVHlwZUJ5TmFtZSgiT3B0aW9uYWxHcm91cCIpOwotICAgICAgICB0aGlzLnJlcGVhdGVkR3JvdXAgPQotICAgICAgICAgIHRlc3RBbGxUeXBlcy5maW5kTmVzdGVkVHlwZUJ5TmFtZSgiUmVwZWF0ZWRHcm91cCIpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGhpcy5vcHRpb25hbEdyb3VwID0KLSAgICAgICAgICBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiT3B0aW9uYWxHcm91cF9leHRlbnNpb24iKTsKLSAgICAgICAgdGhpcy5yZXBlYXRlZEdyb3VwID0KLSAgICAgICAgICBmaWxlLmZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiUmVwZWF0ZWRHcm91cF9leHRlbnNpb24iKTsKLSAgICAgIH0KLSAgICAgIHRoaXMubmVzdGVkTWVzc2FnZSA9IHRlc3RBbGxUeXBlcy5maW5kTmVzdGVkVHlwZUJ5TmFtZSgiTmVzdGVkTWVzc2FnZSIpOwotICAgICAgdGhpcy5mb3JlaWduTWVzc2FnZSA9IGZpbGUuZmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJGb3JlaWduTWVzc2FnZSIpOwotICAgICAgdGhpcy5pbXBvcnRNZXNzYWdlID0gaW1wb3J0RmlsZS5maW5kTWVzc2FnZVR5cGVCeU5hbWUoIkltcG9ydE1lc3NhZ2UiKTsKLQotICAgICAgdGhpcy5uZXN0ZWRFbnVtID0gdGVzdEFsbFR5cGVzLmZpbmRFbnVtVHlwZUJ5TmFtZSgiTmVzdGVkRW51bSIpOwotICAgICAgdGhpcy5mb3JlaWduRW51bSA9IGZpbGUuZmluZEVudW1UeXBlQnlOYW1lKCJGb3JlaWduRW51bSIpOwotICAgICAgdGhpcy5pbXBvcnRFbnVtID0gaW1wb3J0RmlsZS5maW5kRW51bVR5cGVCeU5hbWUoIkltcG9ydEVudW0iKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwob3B0aW9uYWxHcm91cCApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocmVwZWF0ZWRHcm91cCApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobmVzdGVkTWVzc2FnZSApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZm9yZWlnbk1lc3NhZ2UpOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoaW1wb3J0TWVzc2FnZSApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobmVzdGVkRW51bSAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZm9yZWlnbkVudW0gICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoaW1wb3J0RW51bSAgICApOwotCi0gICAgICB0aGlzLm5lc3RlZEIgID0gbmVzdGVkTWVzc2FnZSAuZmluZEZpZWxkQnlOYW1lKCJiYiIpOwotICAgICAgdGhpcy5mb3JlaWduQyA9IGZvcmVpZ25NZXNzYWdlLmZpbmRGaWVsZEJ5TmFtZSgiYyIpOwotICAgICAgdGhpcy5pbXBvcnREICA9IGltcG9ydE1lc3NhZ2UgLmZpbmRGaWVsZEJ5TmFtZSgiZCIpOwotICAgICAgdGhpcy5uZXN0ZWRGb28gPSBuZXN0ZWRFbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiRk9PIik7Ci0gICAgICB0aGlzLm5lc3RlZEJhciA9IG5lc3RlZEVudW0uZmluZFZhbHVlQnlOYW1lKCJCQVIiKTsKLSAgICAgIHRoaXMubmVzdGVkQmF6ID0gbmVzdGVkRW51bS5maW5kVmFsdWVCeU5hbWUoIkJBWiIpOwotICAgICAgdGhpcy5mb3JlaWduRm9vID0gZm9yZWlnbkVudW0uZmluZFZhbHVlQnlOYW1lKCJGT1JFSUdOX0ZPTyIpOwotICAgICAgdGhpcy5mb3JlaWduQmFyID0gZm9yZWlnbkVudW0uZmluZFZhbHVlQnlOYW1lKCJGT1JFSUdOX0JBUiIpOwotICAgICAgdGhpcy5mb3JlaWduQmF6ID0gZm9yZWlnbkVudW0uZmluZFZhbHVlQnlOYW1lKCJGT1JFSUdOX0JBWiIpOwotICAgICAgdGhpcy5pbXBvcnRGb28gPSBpbXBvcnRFbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiSU1QT1JUX0ZPTyIpOwotICAgICAgdGhpcy5pbXBvcnRCYXIgPSBpbXBvcnRFbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiSU1QT1JUX0JBUiIpOwotICAgICAgdGhpcy5pbXBvcnRCYXogPSBpbXBvcnRFbnVtLmZpbmRWYWx1ZUJ5TmFtZSgiSU1QT1JUX0JBWiIpOwotCi0gICAgICB0aGlzLmdyb3VwQSA9IG9wdGlvbmFsR3JvdXAuZmluZEZpZWxkQnlOYW1lKCJhIik7Ci0gICAgICB0aGlzLnJlcGVhdGVkR3JvdXBBID0gcmVwZWF0ZWRHcm91cC5maW5kRmllbGRCeU5hbWUoImEiKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZ3JvdXBBICAgICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocmVwZWF0ZWRHcm91cEEpOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobmVzdGVkQiAgICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZm9yZWlnbkMgICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoaW1wb3J0RCAgICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobmVzdGVkRm9vICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobmVzdGVkQmFyICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwobmVzdGVkQmF6ICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZm9yZWlnbkZvbyAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZm9yZWlnbkJhciAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoZm9yZWlnbkJheiAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoaW1wb3J0Rm9vICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoaW1wb3J0QmFyICAgICApOwotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwoaW1wb3J0QmF6ICAgICApOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFNob3J0aGFuZCB0byBnZXQgYSBGaWVsZERlc2NyaXB0b3IgZm9yIGEgZmllbGQgb2YgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcy4KLSAgICAgKi8KLSAgICBwcml2YXRlIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmKFN0cmluZyBuYW1lKSB7Ci0gICAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgcmVzdWx0OwotICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpIHsKLSAgICAgICAgcmVzdWx0ID0gYmFzZURlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKG5hbWUpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmVzdWx0ID0gZmlsZS5maW5kRXh0ZW5zaW9uQnlOYW1lKG5hbWUgKyAiX2V4dGVuc2lvbiIpOwotICAgICAgfQotICAgICAgQXNzZXJ0LmFzc2VydE5vdE51bGwocmVzdWx0KTsKLSAgICAgIHJldHVybiByZXN1bHQ7Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogQ2FsbHMge0Bjb2RlIHBhcmVudC5uZXdCdWlsZGVyRm9yRmllbGQoKX0gb3IgdXNlcyB0aGUKLSAgICAgKiB7QGNvZGUgRXh0ZW5zaW9uUmVnaXN0cnl9IHRvIGZpbmQgYW4gYXBwcm9wcmlhdGUgYnVpbGRlciwgZGVwZW5kaW5nCi0gICAgICogb24gd2hhdCB0eXBlIGlzIGJlaW5nIHRlc3RlZC4KLSAgICAgKi8KLSAgICBwcml2YXRlIE1lc3NhZ2UuQnVpbGRlciBuZXdCdWlsZGVyRm9yRmllbGQoCi0gICAgICAgIE1lc3NhZ2UuQnVpbGRlciBwYXJlbnQsIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBmaWVsZCkgewotICAgICAgaWYgKGV4dGVuc2lvblJlZ2lzdHJ5ID09IG51bGwpIHsKLSAgICAgICAgcmV0dXJuIHBhcmVudC5uZXdCdWlsZGVyRm9yRmllbGQoZmllbGQpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRXh0ZW5zaW9uUmVnaXN0cnkuRXh0ZW5zaW9uSW5mbyBleHRlbnNpb24gPQotICAgICAgICAgIGV4dGVuc2lvblJlZ2lzdHJ5LmZpbmRFeHRlbnNpb25CeU51bWJlcihmaWVsZC5nZXRDb250YWluaW5nVHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5nZXROdW1iZXIoKSk7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGV4dGVuc2lvbik7Ci0gICAgICAgIEFzc2VydC5hc3NlcnROb3ROdWxsKGV4dGVuc2lvbi5kZWZhdWx0SW5zdGFuY2UpOwotICAgICAgICByZXR1cm4gZXh0ZW5zaW9uLmRlZmF1bHRJbnN0YW5jZS5uZXdCdWlsZGVyRm9yVHlwZSgpOwotICAgICAgfQotICAgIH0KLQotICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIC8qKgotICAgICAqIFNldCBldmVyeSBmaWVsZCBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gdGhlIHZhbHVlcyBleHBlY3RlZCBieQotICAgICAqIHtAY29kZSBhc3NlcnRBbGxGaWVsZHNTZXQoKX0sIHVzaW5nIHRoZSB7QGxpbmsgTWVzc2FnZS5CdWlsZGVyfQotICAgICAqIHJlZmxlY3Rpb24gaW50ZXJmYWNlLgotICAgICAqLwotICAgIHZvaWQgc2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIgICApLCAxMDEgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfaW50NjQiICAgKSwgMTAyTCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3VpbnQzMiIgICksIDEwMyApOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF91aW50NjQiICApLCAxMDRMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfc2ludDMyIiAgKSwgMTA1ICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQ2NCIgICksIDEwNkwpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIiApLCAxMDcgKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQ2NCIgKSwgMTA4TCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDMyIiksIDEwOSApOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQ2NCIpLCAxMTBMKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfZmxvYXQiICAgKSwgMTExRik7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2RvdWJsZSIgICksIDExMkQpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9ib29sIiAgICApLCB0cnVlKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiAgKSwgIjExNSIpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIgICApLCB0b0J5dGVzKCIxMTYiKSk7Ci0KLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxncm91cCIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigib3B0aW9uYWxncm91cCIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKGdyb3VwQSwgMTE3KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQobmVzdGVkQiwgMTE4KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChmb3JlaWduQywgMTE5KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQoaW1wb3J0RCwgMTIwKS5idWlsZCgpKTsKLQotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSwgIG5lc3RlZEJheik7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduQmF6KTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICksICBpbXBvcnRCYXopOwotCi0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIgKSwgIjEyNCIpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJvcHRpb25hbF9jb3JkIiApLCAiMTI1Iik7Ci0KLSAgICAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAyMDEgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAyMDJMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiICApLCAyMDMgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAyMDRMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAyMDUgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiICApLCAyMDZMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAyMDcgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAyMDhMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAyMDkgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAyMTBMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAyMTFGKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiICApLCAyMTJEKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCB0cnVlKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAiMjE1Iik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiICAgKSwgdG9CeXRlcygiMjE2IikpOwotCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRncm91cCIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKHJlcGVhdGVkR3JvdXBBLCAyMTcpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpKQotICAgICAgICAgICAgICAgLnNldEZpZWxkKG5lc3RlZEIsIDIxOCkuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksCi0gICAgICAgIG5ld0J1aWxkZXJGb3JGaWVsZChtZXNzYWdlLCBmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChmb3JlaWduQywgMjE5KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChpbXBvcnRELCAyMjApLmJ1aWxkKCkpOwotCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRCYXIpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLCBmb3JlaWduQmFyKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwgIGltcG9ydEJhcik7Ci0KLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiICksICIyMjQiKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiApLCAiMjI1Iik7Ci0KLSAgICAgIC8vIEFkZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAzMDEgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAzMDJMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiICApLCAzMDMgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAzMDRMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAzMDUgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiICApLCAzMDZMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAzMDcgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAzMDhMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAzMDkgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAzMTBMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAzMTFGKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiICApLCAzMTJEKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCBmYWxzZSk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgIjMxNSIpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiAgICksIHRvQnl0ZXMoIjMxNiIpKTsKLQotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkZ3JvdXAiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChyZXBlYXRlZEdyb3VwQSwgMzE3KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCAzMTgpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQoZm9yZWlnbkMsIDMxOSkuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQoaW1wb3J0RCwgMzIwKS5idWlsZCgpKTsKLQotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAgbmVzdGVkQmF6KTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgZm9yZWlnbkJheik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksICBpbXBvcnRCYXopOwotCi0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiApLCAiMzI0Iik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIgKSwgIjMyNSIpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfaW50MzIiICAgKSwgNDAxICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfaW50NjQiICAgKSwgNDAyTCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfdWludDMyIiAgKSwgNDAzICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfdWludDY0IiAgKSwgNDA0TCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfc2ludDMyIiAgKSwgNDA1ICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfc2ludDY0IiAgKSwgNDA2TCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfZml4ZWQzMiIgKSwgNDA3ICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfZml4ZWQ2NCIgKSwgNDA4TCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkMzIiKSwgNDA5ICk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkNjQiKSwgNDEwTCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfZmxvYXQiICAgKSwgNDExRik7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfZG91YmxlIiAgKSwgNDEyRCk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfYm9vbCIgICAgKSwgZmFsc2UpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZyIgICksICI0MTUiKTsKLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9ieXRlcyIgICApLCB0b0J5dGVzKCI0MTYiKSk7Ci0KLSAgICAgIG1lc3NhZ2Uuc2V0RmllbGQoZigiZGVmYXVsdF9uZXN0ZWRfZW51bSIgKSwgIG5lc3RlZEZvbyk7Ci0gICAgICBtZXNzYWdlLnNldEZpZWxkKGYoImRlZmF1bHRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25Gb28pOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2ltcG9ydF9lbnVtIiApLCAgaW1wb3J0Rm9vKTsKLQotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIgKSwgIjQyNCIpOwotICAgICAgbWVzc2FnZS5zZXRGaWVsZChmKCJkZWZhdWx0X2NvcmQiICksICI0MjUiKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBNb2RpZnkgdGhlIHJlcGVhdGVkIGZpZWxkcyBvZiB7QGNvZGUgbWVzc2FnZX0gdG8gY29udGFpbiB0aGUgdmFsdWVzCi0gICAgICogZXhwZWN0ZWQgYnkge0Bjb2RlIGFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWQoKX0sIHVzaW5nIHRoZQotICAgICAqIHtAbGluayBNZXNzYWdlLkJ1aWxkZXJ9IHJlZmxlY3Rpb24gaW50ZXJmYWNlLgotICAgICAqLwotICAgIHZvaWQgbW9kaWZ5UmVwZWF0ZWRGaWVsZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UuQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50MzIiICAgKSwgMSwgNTAxICk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMSwgNTAyTCk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMSwgNTAzICk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDY0IiAgKSwgMSwgNTA0TCk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMSwgNTA1ICk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMSwgNTA2TCk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMSwgNTA3ICk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMSwgNTA4TCk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMSwgNTA5ICk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMSwgNTEwTCk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMSwgNTExRik7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMSwgNTEyRCk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSwgMSwgdHJ1ZSk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMSwgIjUxNSIpOwotICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiAgICksIDEsIHRvQnl0ZXMoIjUxNiIpKTsKLQotICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwgMSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkZ3JvdXAiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChyZXBlYXRlZEdyb3VwQSwgNTE3KS5idWlsZCgpKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAxLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSkKLSAgICAgICAgICAgICAgIC5zZXRGaWVsZChuZXN0ZWRCLCA1MTgpLmJ1aWxkKCkpOwotICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAxLAotICAgICAgICBuZXdCdWlsZGVyRm9yRmllbGQobWVzc2FnZSwgZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQoZm9yZWlnbkMsIDUxOSkuYnVpbGQoKSk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSwKLSAgICAgICAgbmV3QnVpbGRlckZvckZpZWxkKG1lc3NhZ2UsIGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpCi0gICAgICAgICAgICAgICAuc2V0RmllbGQoaW1wb3J0RCwgNTIwKS5idWlsZCgpKTsKLQotICAgICAgbWVzc2FnZS5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLCAxLCAgbmVzdGVkRm9vKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMSwgZm9yZWlnbkZvbyk7Ci0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksIDEsICBpbXBvcnRGb28pOwotCi0gICAgICBtZXNzYWdlLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDEsICI1MjQiKTsKLSAgICAgIG1lc3NhZ2Uuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDEsICI1MjUiKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCi0gICAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBzZXQgdG8gdGhlIHZhbHVlcyBhc3NpZ25lZCBieSB7QGNvZGUgc2V0QWxsRmllbGRzfSwKLSAgICAgKiB1c2luZyB0aGUge0BsaW5rIE1lc3NhZ2V9IHJlZmxlY3Rpb24gaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFzc2VydEFsbEZpZWxkc1NldFZpYVJlZmxlY3Rpb24oTWVzc2FnZU9yQnVpbGRlciBtZXNzYWdlKSB7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9ieXRlcyIgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxncm91cCIgICAgICAgICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsZ3JvdXAiKSkpLmhhc0ZpZWxkKGdyb3VwQSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChuZXN0ZWRCKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZSgKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChmb3JlaWduQykpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChpbXBvcnREKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X2VudW0iICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9jb3JkIikpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDEgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwMkwgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTAzICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDRMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwNSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA2TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMDcgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEwOEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTA5ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygxMTBMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExMUYgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTEyRCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMTUiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMTE2IiksIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfYnl0ZXMiKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxncm91cCIpKSkuZ2V0RmllbGQoZ3JvdXBBKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDExOCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMTE5LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDEyMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEQpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmF6LCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXosIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJheiwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjQiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjUiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiKSkpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDMyIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkMzIiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDY0IikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Jvb2wiICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ieXRlcyIgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRncm91cCIgICAgICAgICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICAgICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9jb3JkIikpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjIxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMCkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEdyb3VwQSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTgsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE5LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjIwLAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDApKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAwKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQzMiIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwMkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50NjQiICAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQzMiIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50NjQiICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwNSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDMyIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQ2NCIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDMyIiApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMwOEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQ2NCIgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDMyIiksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxMUYgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ib29sIiAgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIzMTUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCIzMTYiKSwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDEpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygzMTcsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRncm91cCIpLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRHcm91cEEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMzE4LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChuZXN0ZWRCKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMxOSwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGZvcmVpZ25DKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDMyMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBuZXN0ZWRCYXosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgKSwxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbXBvcnRCYXosIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgKSwxKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjMyNCIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmdfcGllY2UiKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMzI1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2NvcmQiKSwgMSkpOwotCi0gICAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfaW50MzIiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ludDY0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfdWludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ZpeGVkNjQiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfYm9vbCIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9ieXRlcyIgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRUcnVlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9uZXN0ZWRfZW51bSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydFRydWUobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0VHJ1ZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfY29yZCIpKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDAxICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwMkwgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDMgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA0TCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwNSAgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDZMICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDA3ICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQwOEwgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MDkgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNDEwTCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDQxMUYgLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg0MTJEICwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MTUiLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc3RyaW5nIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0b0J5dGVzKCI0MTYiKSwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2J5dGVzIikpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkRm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfbmVzdGVkX2VudW0iICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X2ZvcmVpZ25fZW51bSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCBpbXBvcnRGb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI0MjQiLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfc3RyaW5nX3BpZWNlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjQyNSIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9jb3JkIikpKTsKLSAgICB9Ci0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgICAvKioKLSAgICAgKiBBc3NlcnQgKHVzaW5nIHtAY29kZSBqdW5pdC5mcmFtZXdvcmsuQXNzZXJ0fX0gdGhhdCBhbGwgZmllbGRzIG9mCi0gICAgICoge0Bjb2RlIG1lc3NhZ2V9IGFyZSBjbGVhcmVkLCBhbmQgdGhhdCBnZXR0aW5nIHRoZSBmaWVsZHMgcmV0dXJucyB0aGVpcgotICAgICAqIGRlZmF1bHQgdmFsdWVzLCB1c2luZyB0aGUge0BsaW5rIE1lc3NhZ2V9IHJlZmxlY3Rpb24gaW50ZXJmYWNlLgotICAgICAqLwotICAgIHB1YmxpYyB2b2lkIGFzc2VydENsZWFyVmlhUmVmbGVjdGlvbihNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGluaXRpYWxseSBiZSBmYWxzZSBmb3IgYWxsIG9wdGlvbmFsIGZpZWxkcy4KLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDMyIiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ludDY0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3VpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkMzIiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZpeGVkNjQiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZyIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxncm91cCIgICAgICAgICAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJvcHRpb25hbF9zdHJpbmdfcGllY2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigib3B0aW9uYWxfY29yZCIpKSk7Ci0KLSAgICAgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gemVybyBvciBzb21ldGhpbmcgbGlrZSBpdC4KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW50MzIiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3VpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfdWludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwICAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBMICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZml4ZWQzMiIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwTCAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAgICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3NmaXhlZDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfc2ZpeGVkNjQiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwRiAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDBEICAgLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2RvdWJsZSIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfYm9vbCIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiIiAgICwgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9zdHJpbmciICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKEJ5dGVTdHJpbmcuRU1QVFksIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfYnl0ZXMiKSkpOwotCi0gICAgICAvLyBFbWJlZGRlZCBtZXNzYWdlcyBzaG91bGQgYWxzbyBiZSBjbGVhci4KLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxncm91cCIpKSkuaGFzRmllbGQoZ3JvdXBBKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5oYXNGaWVsZChuZXN0ZWRCKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UoCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuaGFzRmllbGQoZm9yZWlnbkMpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZSgKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmhhc0ZpZWxkKGltcG9ydEQpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbGdyb3VwIikpKS5nZXRGaWVsZChncm91cEEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChmb3JlaWduQykpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIpKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoaW1wb3J0RCkpOwotCi0gICAgICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkRm9vLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9lbnVtIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25Gb28sIG1lc3NhZ2UuZ2V0RmllbGQoZigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEZvbywgbWVzc2FnZS5nZXRGaWVsZChmKCJvcHRpb25hbF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIiLCBtZXNzYWdlLmdldEZpZWxkKGYoIm9wdGlvbmFsX2NvcmQiKSkpOwotCi0gICAgICAvLyBSZXBlYXRlZCBmaWVsZHMgYXJlIGVtcHR5LgotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ludDY0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZpeGVkNjQiICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2Zsb2F0IiAgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygwLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZyIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYnl0ZXMiICAgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkZ3JvdXAiICAgICAgICAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiAgICApKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMCwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfY29yZCIpKSk7Ci0KLSAgICAgIC8vIGhhc19ibGFoKCkgc2hvdWxkIGFsc28gYmUgZmFsc2UgZm9yIGFsbCBkZWZhdWx0IGZpZWxkcy4KLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfaW50MzIiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3VpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfdWludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfZml4ZWQzMiIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3NmaXhlZDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRGYWxzZShtZXNzYWdlLmhhc0ZpZWxkKGYoImRlZmF1bHRfYm9vbCIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9uZXN0ZWRfZW51bSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9pbXBvcnRfZW51bSIgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RmFsc2UobWVzc2FnZS5oYXNGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEZhbHNlKG1lc3NhZ2UuaGFzRmllbGQoZigiZGVmYXVsdF9jb3JkIiApKSk7Ci0KLSAgICAgIC8vIEZpZWxkcyB3aXRoIGRlZmF1bHRzIGhhdmUgdGhlaXIgZGVmYXVsdCB2YWx1ZXMgKGR1aCkuCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MSAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbnQzMiIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MkwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0MyAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF91aW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF91aW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC00NSAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NkwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zaW50NjQiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0NyAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDMyIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0OEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA0OSAgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQzMiIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKC01MEwgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zZml4ZWQ2NCIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1MS41RiAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCA1MmUzRCAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9kb3VibGUiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgICAsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9ib29sIiAgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCJoZWxsbyIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9zdHJpbmciICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIndvcmxkIiksIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9ieXRlcyIpKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEJhciwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X25lc3RlZF9lbnVtIiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKGZvcmVpZ25CYXIsIG1lc3NhZ2UuZ2V0RmllbGQoZigiZGVmYXVsdF9mb3JlaWduX2VudW0iKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmFyLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfaW1wb3J0X2VudW0iICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiYWJjIiwgbWVzc2FnZS5nZXRGaWVsZChmKCJkZWZhdWx0X3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIxMjMiLCBtZXNzYWdlLmdldEZpZWxkKGYoImRlZmF1bHRfY29yZCIpKSk7Ci0gICAgfQotCi0KLSAgICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICAgIHB1YmxpYyB2b2lkIGFzc2VydFJlcGVhdGVkRmllbGRzTW9kaWZpZWRWaWFSZWZsZWN0aW9uKAotICAgICAgICBNZXNzYWdlT3JCdWlsZGVyIG1lc3NhZ2UpIHsKLSAgICAgIC8vIE1vZGlmeVJlcGVhdGVkRmllbGRzIG9ubHkgc2V0cyB0aGUgc2Vjb25kIHJlcGVhdGVkIGVsZW1lbnQgb2YgZWFjaAotICAgICAgLy8gZmllbGQuICBJbiBhZGRpdGlvbiB0byB2ZXJpZnlpbmcgdGhpcywgd2UgYWxzbyB2ZXJpZnkgdGhhdCB0aGUgZmlyc3QKLSAgICAgIC8vIGVsZW1lbnQgYW5kIHNpemUgd2VyZSAqbm90KiBtb2RpZmllZC4KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfaW50MzIiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbnQ2NCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3VpbnQzMiIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfdWludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zaW50MzIiICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NpbnQ2NCIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9maXhlZDY0IiApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3NmaXhlZDMyIikpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mbG9hdCIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2RvdWJsZSIgICkpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkQ291bnQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9zdHJpbmciICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2J5dGVzIiAgICkpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZGdyb3VwIiAgICAgICAgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9uZXN0ZWRfZW51bSIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgICAgKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZENvdW50KGYoInJlcGVhdGVkX2NvcmQiKSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW50MzIiICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDY0IiAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjAzICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF91aW50MzIiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDY0IiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NpbnQzMiIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA2TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50NjQiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIwNyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZml4ZWQzMiIgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkNjQiICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjA5ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zZml4ZWQzMiIpLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxMEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkNjQiKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Zsb2F0IiAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjEyRCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9kb3VibGUiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYm9vbCIgICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiMjE1IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHModG9CeXRlcygiMjE2IiksIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9ieXRlcyIpLCAwKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoMjE3LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkZ3JvdXAiKSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHJlcGVhdGVkR3JvdXBBKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDIxOCwKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAwKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQobmVzdGVkQikpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMTksCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIiksIDApKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChmb3JlaWduQykpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyMjAsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKGltcG9ydEQpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggbmVzdGVkQmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyggaW1wb3J0QmFyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfaW1wb3J0X2VudW0iICksMCkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCIyMjQiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nX3BpZWNlIiksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjIyNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9jb3JkIiksIDApKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDEgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ludDMyIiAgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9pbnQ2NCIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfdWludDMyIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDRMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3VpbnQ2NCIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zaW50MzIiICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ludDY0IiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MDcgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZpeGVkMzIiICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9maXhlZDY0IiApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc2ZpeGVkMzIiKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTBMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9mbG9hdCIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyh0cnVlICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2Jvb2wiICAgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIjUxNSIsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRvQnl0ZXMoIjUxNiIpLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgMSkpOwotCi0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDUxNywKLSAgICAgICAgKChNZXNzYWdlKW1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZGdyb3VwIiksIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChyZXBlYXRlZEdyb3VwQSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg1MTgsCi0gICAgICAgICgoTWVzc2FnZSltZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwgMSkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKG5lc3RlZEIpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTE5LAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpLCAxKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQoZm9yZWlnbkMpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNTIwLAotICAgICAgICAoKE1lc3NhZ2UpbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIiksIDEpKQotICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChpbXBvcnREKSk7Ci0KLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIG5lc3RlZEZvbywgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkZvbywgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoIGltcG9ydEZvbywgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiApLDEpKTsKLQotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygiNTI0IiwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZ19waWVjZSIpLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKCI1MjUiLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfY29yZCIpLCAxKSk7Ci0gICAgfQotCi0gICAgcHVibGljIHZvaWQgc2V0UGFja2VkRmllbGRzVmlhUmVmbGVjdGlvbihNZXNzYWdlLkJ1aWxkZXIgbWVzc2FnZSkgewotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQzMiIgICApLCA2MDEgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiICAgKSwgNjAyTCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQzMiIgICksIDYwMyApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50NjQiICApLCA2MDRMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiAgKSwgNjA1ICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQ2NCIgICksIDYwNkwpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDMyIiApLCA2MDcgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIgKSwgNjA4TCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDMyIiksIDYwOSApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQ2NCIpLCA2MTBMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZmxvYXQiICAgKSwgNjExRik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIgICksIDYxMkQpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9ib29sIiAgICApLCB0cnVlKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZW51bSIgKSwgIGZvcmVpZ25CYXIpOwotICAgICAgLy8gQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQzMiIgICApLCA3MDEgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiICAgKSwgNzAyTCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQzMiIgICksIDcwMyApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50NjQiICApLCA3MDRMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiAgKSwgNzA1ICk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQ2NCIgICksIDcwNkwpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDMyIiApLCA3MDcgKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIgKSwgNzA4TCk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDMyIiksIDcwOSApOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQ2NCIpLCA3MTBMKTsKLSAgICAgIG1lc3NhZ2UuYWRkUmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZmxvYXQiICAgKSwgNzExRik7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIgICksIDcxMkQpOwotICAgICAgbWVzc2FnZS5hZGRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9ib29sIiAgICApLCBmYWxzZSk7Ci0gICAgICBtZXNzYWdlLmFkZFJlcGVhdGVkRmllbGQoZigicGFja2VkX2VudW0iICksICBmb3JlaWduQmF6KTsKLSAgICB9Ci0KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRQYWNrZWRGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKE1lc3NhZ2VPckJ1aWxkZXIgbWVzc2FnZSkgewotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfaW50MzIiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfaW50NjQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfdWludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfdWludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ludDMyIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ludDY0IiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZml4ZWQzMiIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZml4ZWQ2NCIgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ZpeGVkMzIiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfc2ZpeGVkNjQiKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZmxvYXQiICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZG91YmxlIiAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfYm9vbCIgICAgKSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscygyLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGRDb3VudChmKCJwYWNrZWRfZW51bSIgICApKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwMSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ludDMyIiAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjAyTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50NjQiICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDMgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF91aW50MzIiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQ2NCIgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA1ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ludDMyIiAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDZMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50NjQiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYwNyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2ZpeGVkMzIiICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjA4TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQ2NCIgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MDkgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zZml4ZWQzMiIpLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDYxMEwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDY0IiksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNjExRiAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZmxvYXQiICAgKSwgMCkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg2MTJEICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9kb3VibGUiICApLCAwKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKHRydWUgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2Jvb2wiICAgICksIDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZm9yZWlnbkJhciwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9lbnVtIiApLDApKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzAxICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfaW50MzIiICAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDJMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9pbnQ2NCIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwMyAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3VpbnQzMiIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA0TCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfdWludDY0IiAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDUgICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9zaW50MzIiICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwNkwgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NpbnQ2NCIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzA3ICAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfZml4ZWQzMiIgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MDhMICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9maXhlZDY0IiApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcwOSAgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX3NmaXhlZDMyIiksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoNzEwTCAsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfc2ZpeGVkNjQiKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyg3MTFGICwgbWVzc2FnZS5nZXRSZXBlYXRlZEZpZWxkKGYoInBhY2tlZF9mbG9hdCIgICApLCAxKSk7Ci0gICAgICBBc3NlcnQuYXNzZXJ0RXF1YWxzKDcxMkQgLCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2RvdWJsZSIgICksIDEpKTsKLSAgICAgIEFzc2VydC5hc3NlcnRFcXVhbHMoZmFsc2UsIG1lc3NhZ2UuZ2V0UmVwZWF0ZWRGaWVsZChmKCJwYWNrZWRfYm9vbCIgICAgKSwgMSkpOwotICAgICAgQXNzZXJ0LmFzc2VydEVxdWFscyhmb3JlaWduQmF6LCBtZXNzYWdlLmdldFJlcGVhdGVkRmllbGQoZigicGFja2VkX2VudW0iICksMSkpOwotICAgIH0KLQotICAgIC8qKgotICAgICAqIFZlcmlmaWVzIHRoYXQgdGhlIHJlZmxlY3Rpb24gc2V0dGVycyBmb3IgdGhlIGdpdmVuLkJ1aWxkZXIgb2JqZWN0IHRocm93IGEKLSAgICAgKiBOdWxsUG9pbnRlckV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBwYXNzZWQgYSBudWxsIHZhbHVlLiAgVXNlcyBBc3NlcnQgdG8gdGhyb3cgYW4KLSAgICAgKiBhcHByb3ByaWF0ZSBhc3NlcnRpb24gZmFpbHVyZSwgaWYgdGhlIGNvbmRpdGlvbiBpcyBub3QgdmVyaWZpZWQuCi0gICAgICovCi0gICAgcHVibGljIHZvaWQgYXNzZXJ0UmVmbGVjdGlvblNldHRlcnNSZWplY3ROdWxsKE1lc3NhZ2UuQnVpbGRlciBidWlsZGVyKQotICAgICAgICB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZigib3B0aW9uYWxfc3RyaW5nIiksIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0RmllbGQoZigib3B0aW9uYWxfYnl0ZXMiKSwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5zZXRGaWVsZChmKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIpLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKSBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLnNldEZpZWxkKGYoIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgKFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkJ1aWxkZXIpIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLQotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX3N0cmluZyIpLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuYWRkUmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0gICAgfQotCi0gICAgLyoqCi0gICAgICogVmVyaWZpZXMgdGhhdCB0aGUgcmVmbGVjdGlvbiByZXBlYXRlZCBzZXR0ZXJzIGZvciB0aGUgZ2l2ZW4gQnVpbGRlciBvYmplY3QgdGhyb3cgYQotICAgICAqIE51bGxQb2ludGVyRXhjZXB0aW9uIGlmIHRoZXkgYXJlIHBhc3NlZCBhIG51bGwgdmFsdWUuICBVc2VzIEFzc2VydCB0byB0aHJvdyBhbiBhcHByb3ByaWF0ZQotICAgICAqIGFzc2VydGlvbiBmYWlsdXJlLCBpZiB0aGUgY29uZGl0aW9uIGlzIG5vdCB2ZXJpZmllZC4KLSAgICAgKi8KLSAgICBwdWJsaWMgdm9pZCBhc3NlcnRSZWZsZWN0aW9uUmVwZWF0ZWRTZXR0ZXJzUmVqZWN0TnVsbChNZXNzYWdlLkJ1aWxkZXIgYnVpbGRlcikKLSAgICAgICAgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfc3RyaW5nIiksICJvbmUiKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9zdHJpbmciKSwgMCwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotCi0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfYnl0ZXMiKSwgdG9CeXRlcygib25lIikpOwotICAgICAgdHJ5IHsKLSAgICAgICAgYnVpbGRlci5zZXRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX2J5dGVzIiksIDAsIG51bGwpOwotICAgICAgICBBc3NlcnQuZmFpbCgiRXhjZXB0aW9uIHdhcyBub3QgdGhyb3duIik7Ci0gICAgICB9IGNhdGNoIChOdWxsUG9pbnRlckV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIFdlIGV4cGVjdCB0aGlzIGV4Y2VwdGlvbi4KLSAgICAgIH0KLQotICAgICAgYnVpbGRlci5hZGRSZXBlYXRlZEZpZWxkKGYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiksIG5lc3RlZEJheik7Ci0gICAgICB0cnkgewotICAgICAgICBidWlsZGVyLnNldFJlcGVhdGVkRmllbGQoZigicmVwZWF0ZWRfbmVzdGVkX2VudW0iKSwgMCwgbnVsbCk7Ci0gICAgICAgIEFzc2VydC5mYWlsKCJFeGNlcHRpb24gd2FzIG5vdCB0aHJvd24iKTsKLSAgICAgIH0gY2F0Y2ggKE51bGxQb2ludGVyRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gV2UgZXhwZWN0IHRoaXMgZXhjZXB0aW9uLgotICAgICAgfQotCi0gICAgICBidWlsZGVyLmFkZFJlcGVhdGVkRmllbGQoCi0gICAgICAgICAgZigicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKSwKLSAgICAgICAgICBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5uZXdCdWlsZGVyKCkuc2V0QmIoMjE4KS5idWlsZCgpKTsKLSAgICAgIHRyeSB7Ci0gICAgICAgIGJ1aWxkZXIuc2V0UmVwZWF0ZWRGaWVsZChmKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCAwLCBudWxsKTsKLSAgICAgICAgQXNzZXJ0LmZhaWwoIkV4Y2VwdGlvbiB3YXMgbm90IHRocm93biIpOwotICAgICAgfSBjYXRjaCAoTnVsbFBvaW50ZXJFeGNlcHRpb24gZSkgewotICAgICAgICAvLyBXZSBleHBlY3QgdGhpcyBleGNlcHRpb24uCi0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBmaWxlUGF0aCBUaGUgcGF0aCByZWxhdGl2ZSB0bwotICAgKiB7QGxpbmsgI2dldFRlc3REYXRhRGlyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgU3RyaW5nIHJlYWRUZXh0RnJvbUZpbGUoU3RyaW5nIGZpbGVQYXRoKSB7Ci0gICAgcmV0dXJuIHJlYWRCeXRlc0Zyb21GaWxlKGZpbGVQYXRoKS50b1N0cmluZ1V0ZjgoKTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIEZpbGUgZ2V0VGVzdERhdGFEaXIoKSB7Ci0gICAgLy8gU2VhcmNoIGVhY2ggcGFyZW50IGRpcmVjdG9yeSBsb29raW5nIGZvciAic3JjL2dvb2dsZS9wcm90b2J1ZiIuCi0gICAgRmlsZSBhbmNlc3RvciA9IG5ldyBGaWxlKCIuIik7Ci0gICAgdHJ5IHsKLSAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0Q2Fub25pY2FsRmlsZSgpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgICAiQ291bGRuJ3QgZ2V0IGNhbm9uaWNhbCBuYW1lIG9mIHdvcmtpbmcgZGlyZWN0b3J5LiIsIGUpOwotICAgIH0KLSAgICB3aGlsZSAoYW5jZXN0b3IgIT0gbnVsbCAmJiBhbmNlc3Rvci5leGlzdHMoKSkgewotICAgICAgaWYgKG5ldyBGaWxlKGFuY2VzdG9yLCAic3JjL2dvb2dsZS9wcm90b2J1ZiIpLmV4aXN0cygpKSB7Ci0gICAgICAgIHJldHVybiBuZXcgRmlsZShhbmNlc3RvciwgInNyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEiKTsKLSAgICAgIH0KLSAgICAgIGFuY2VzdG9yID0gYW5jZXN0b3IuZ2V0UGFyZW50RmlsZSgpOwotICAgIH0KLQotICAgIHRocm93IG5ldyBSdW50aW1lRXhjZXB0aW9uKAotICAgICAgIkNvdWxkIG5vdCBmaW5kIGdvbGRlbiBmaWxlcy4gIFRoaXMgdGVzdCBtdXN0IGJlIHJ1biBmcm9tIHdpdGhpbiB0aGUgIiArCi0gICAgICAicHJvdG9idWYgc291cmNlIHBhY2thZ2Ugc28gdGhhdCBpdCBjYW4gcmVhZCB0ZXN0IGRhdGEgZmlsZXMgZnJvbSB0aGUgIiArCi0gICAgICAiQysrIHNvdXJjZSB0cmVlLiIpOwotICB9Ci0KLSAgLyoqCi0gICAqIEBwYXJhbSBmaWxlbmFtZSBUaGUgcGF0aCByZWxhdGl2ZSB0bwotICAgKiB7QGxpbmsgI2dldFRlc3REYXRhRGlyfS4KLSAgICovCi0gIHB1YmxpYyBzdGF0aWMgQnl0ZVN0cmluZyByZWFkQnl0ZXNGcm9tRmlsZShTdHJpbmcgZmlsZW5hbWUpIHsKLSAgICBGaWxlIGZ1bGxQYXRoID0gbmV3IEZpbGUoZ2V0VGVzdERhdGFEaXIoKSwgZmlsZW5hbWUpOwotICAgIHRyeSB7Ci0gICAgICBSYW5kb21BY2Nlc3NGaWxlIGZpbGUgPSBuZXcgUmFuZG9tQWNjZXNzRmlsZShmdWxsUGF0aCwgInIiKTsKLSAgICAgIGJ5dGVbXSBjb250ZW50ID0gbmV3IGJ5dGVbKGludCkgZmlsZS5sZW5ndGgoKV07Ci0gICAgICBmaWxlLnJlYWRGdWxseShjb250ZW50KTsKLSAgICAgIHJldHVybiBCeXRlU3RyaW5nLmNvcHlGcm9tKGNvbnRlbnQpOwotICAgIH0gY2F0Y2ggKElPRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIFRocm93IGEgUnVudGltZUV4Y2VwdGlvbiBoZXJlIHNvIHRoYXQgd2UgY2FuIGNhbGwgdGhpcyBmdW5jdGlvbiBmcm9tCi0gICAgICAvLyBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotICAgICAgdGhyb3cgbmV3IElsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbigKLSAgICAgICAgIkNvdWxkbid0IHJlYWQgZmlsZTogIiArIGZ1bGxQYXRoLmdldFBhdGgoKSwgZSk7Ci0gICAgfQotICB9Ci0KLSAgLyoqCi0gICAqIEdldCB0aGUgYnl0ZXMgb2YgdGhlICJnb2xkZW4gbWVzc2FnZSIuICBUaGlzIGlzIGEgc2VyaWFsaXplZCBUZXN0QWxsVHlwZXMKLSAgICogd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5Ci0gICAqIHtAbGluayAjc2V0QWxsRmllbGRzKFRlc3RBbGxUeXBlcy5CdWlsZGVyKX0sIGJ1dCBpdCBpcyBsb2FkZWQgZnJvbSBhIGZpbGUKLSAgICogb24gZGlzayByYXRoZXIgdGhhbiBnZW5lcmF0ZWQgZHluYW1pY2FsbHkuICBUaGUgZmlsZSBpcyBhY3R1YWxseSBnZW5lcmF0ZWQKLSAgICogYnkgQysrIGNvZGUsIHNvIHRlc3RpbmcgYWdhaW5zdCBpdCB2ZXJpZmllcyBjb21wYXRpYmlsaXR5IHdpdGggQysrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGdldEdvbGRlbk1lc3NhZ2UoKSB7Ci0gICAgaWYgKGdvbGRlbk1lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgZ29sZGVuTWVzc2FnZSA9IHJlYWRCeXRlc0Zyb21GaWxlKCJnb2xkZW5fbWVzc2FnZSIpOwotICAgIH0KLSAgICByZXR1cm4gZ29sZGVuTWVzc2FnZTsKLSAgfQotICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIGdvbGRlbk1lc3NhZ2UgPSBudWxsOwotCi0gIC8qKgotICAgKiBHZXQgdGhlIGJ5dGVzIG9mIHRoZSAiZ29sZGVuIHBhY2tlZCBmaWVsZHMgbWVzc2FnZSIuICBUaGlzIGlzIGEgc2VyaWFsaXplZAotICAgKiBUZXN0UGFja2VkVHlwZXMgd2l0aCBhbGwgZmllbGRzIHNldCBhcyB0aGV5IHdvdWxkIGJlIGJ5Ci0gICAqIHtAbGluayAjc2V0UGFja2VkRmllbGRzKFRlc3RQYWNrZWRUeXBlcy5CdWlsZGVyKX0sIGJ1dCBpdCBpcyBsb2FkZWQgZnJvbSBhCi0gICAqIGZpbGUgb24gZGlzayByYXRoZXIgdGhhbiBnZW5lcmF0ZWQgZHluYW1pY2FsbHkuICBUaGUgZmlsZSBpcyBhY3R1YWxseQotICAgKiBnZW5lcmF0ZWQgYnkgQysrIGNvZGUsIHNvIHRlc3RpbmcgYWdhaW5zdCBpdCB2ZXJpZmllcyBjb21wYXRpYmlsaXR5IHdpdGgKLSAgICogQysrLgotICAgKi8KLSAgcHVibGljIHN0YXRpYyBCeXRlU3RyaW5nIGdldEdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2UoKSB7Ci0gICAgaWYgKGdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2UgPT0gbnVsbCkgewotICAgICAgZ29sZGVuUGFja2VkRmllbGRzTWVzc2FnZSA9Ci0gICAgICAgICAgcmVhZEJ5dGVzRnJvbUZpbGUoImdvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UiKTsKLSAgICB9Ci0gICAgcmV0dXJuIGdvbGRlblBhY2tlZEZpZWxkc01lc3NhZ2U7Ci0gIH0KLSAgcHJpdmF0ZSBzdGF0aWMgQnl0ZVN0cmluZyBnb2xkZW5QYWNrZWRGaWVsZHNNZXNzYWdlID0gbnVsbDsKLQotICAvKioKLSAgICogTW9jayBpbXBsZW1lbnRhdGlvbiBvZiB7QGxpbmsgR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50fSBmb3IgdGVzdGluZy4KLSAgICoKLSAgICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gICAqLwotICBwdWJsaWMgc3RhdGljIGNsYXNzIE1vY2tCdWlsZGVyUGFyZW50Ci0gICAgICBpbXBsZW1lbnRzIEdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCB7Ci0KLSAgICBwcml2YXRlIGludCBpbnZhbGlkYXRpb25zOwotCi0gICAgLy9AT3ZlcnJpZGUgKEphdmEgMS42IG92ZXJyaWRlIHNlbWFudGljcywgYnV0IHdlIG11c3Qgc3VwcG9ydCAxLjUpCi0gICAgcHVibGljIHZvaWQgbWFya0RpcnR5KCkgewotICAgICAgaW52YWxpZGF0aW9ucysrOwotICAgIH0KLQotICAgIHB1YmxpYyBpbnQgZ2V0SW52YWxpZGF0aW9uQ291bnQoKSB7Ci0gICAgICByZXR1cm4gaW52YWxpZGF0aW9uczsKLSAgICB9Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9UZXh0Rm9ybWF0VGVzdC5qYXZhIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDQ3NjkwZDEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1RleHRGb3JtYXRUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSw3NTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3I7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0OwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLk9uZVN0cmluZzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2U7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS5pby5TdHJpbmdSZWFkZXI7Ci0KLS8qKgotICogVGVzdCBjYXNlIGZvciB7QGxpbmsgVGV4dEZvcm1hdH0uCi0gKgotICogVE9ETyh3ZW5ib3opOiBFeHRlbnNpb25UZXN0IGFuZCByZXN0IG9mIHRleHRfZm9ybWF0X3VuaXR0ZXN0LmNjLgotICoKLSAqIEBhdXRob3Igd2VuYm96QGdvb2dsZS5jb20gKFdlbmJvIFpodSkKLSAqLwotcHVibGljIGNsYXNzIFRleHRGb3JtYXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotCi0gIC8vIEEgYmFzaWMgc3RyaW5nIHdpdGggZGlmZmVyZW50IGVzY2FwYWJsZSBjaGFyYWN0ZXJzIGZvciB0ZXN0aW5nLgotICBwcml2YXRlIGZpbmFsIHN0YXRpYyBTdHJpbmcga0VzY2FwZVRlc3RTdHJpbmcgPQotICAgICAgIlwiQSBzdHJpbmcgd2l0aCAnIGNoYXJhY3RlcnMgXG4gYW5kIFxyIG5ld2xpbmVzIGFuZCBcdCB0YWJzIGFuZCBcMDAxICIKLSAgICAgICAgICArICJzbGFzaGVzIFxcIjsKLQotICAvLyBBIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBhYm92ZSBzdHJpbmcgd2l0aCBhbGwgdGhlIGNoYXJhY3RlcnMgZXNjYXBlZC4KLSAgcHJpdmF0ZSBmaW5hbCBzdGF0aWMgU3RyaW5nIGtFc2NhcGVUZXN0U3RyaW5nRXNjYXBlZCA9Ci0gICAgICAiXFxcIkEgc3RyaW5nIHdpdGggXFwnIGNoYXJhY3RlcnMgXFxuIGFuZCBcXHIgbmV3bGluZXMgIgotICAgICAgICAgICsgImFuZCBcXHQgdGFicyBhbmQgXFwwMDEgc2xhc2hlcyBcXFxcIjsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgYWxsRmllbGRzU2V0VGV4dCA9IFRlc3RVdGlsLnJlYWRUZXh0RnJvbUZpbGUoCi0gICAgInRleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0Iik7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBhbGxFeHRlbnNpb25zU2V0VGV4dCA9IFRlc3RVdGlsLnJlYWRUZXh0RnJvbUZpbGUoCi0gICAgInRleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQiKTsKLQotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgZXhvdGljVGV4dCA9Ci0gICAgInJlcGVhdGVkX2ludDMyOiAtMVxuIiArCi0gICAgInJlcGVhdGVkX2ludDMyOiAtMjE0NzQ4MzY0OFxuIiArCi0gICAgInJlcGVhdGVkX2ludDY0OiAtMVxuIiArCi0gICAgInJlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOFxuIiArCi0gICAgInJlcGVhdGVkX3VpbnQzMjogNDI5NDk2NzI5NVxuIiArCi0gICAgInJlcGVhdGVkX3VpbnQzMjogMjE0NzQ4MzY0OFxuIiArCi0gICAgInJlcGVhdGVkX3VpbnQ2NDogMTg0NDY3NDQwNzM3MDk1NTE2MTVcbiIgKwotICAgICJyZXBlYXRlZF91aW50NjQ6IDkyMjMzNzIwMzY4NTQ3NzU4MDhcbiIgKwotICAgICJyZXBlYXRlZF9kb3VibGU6IDEyMy4wXG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNVxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMC4xMjVcbiIgKwotICAgICJyZXBlYXRlZF9kb3VibGU6IC4xMjVcbiIgKwotICAgICJyZXBlYXRlZF9kb3VibGU6IC0uMTI1XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzRTE3XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzRSsxN1xuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogLTEuMjNlLTE3XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAuMjNlKzE3XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAtLjIzRTE3XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxLjIzNUUyMlxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogMS4yMzVFLTE4XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2Nzg5XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiBJbmZpbml0eVxuIiArCi0gICAgInJlcGVhdGVkX2RvdWJsZTogLUluZmluaXR5XG4iICsKLSAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiIgKwotICAgICJyZXBlYXRlZF9zdHJpbmc6IFwiXFwwMDBcXDAwMVxcYVxcYlxcZlxcblxcclxcdFxcdlxcXFxcXCdcXFwiIiArCi0gICAgICAiXFwzNDFcXDIxMFxcMjY0XCJcbiIgKwotICAgICJyZXBlYXRlZF9ieXRlczogXCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCJcXDM3NlwiXG4iOwotCi0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBjYW5vbmljYWxFeG90aWNUZXh0ID0KLSAgICAgIGV4b3RpY1RleHQucmVwbGFjZSgiOiAuIiwgIjogMC4iKS5yZXBsYWNlKCI6IC0uIiwgIjogLTAuIikgICAvLyBzaG9ydC1mb3JtIGRvdWJsZQotICAgICAgLnJlcGxhY2UoIjIzZSIsICIyM0UiKS5yZXBsYWNlKCJFKyIsICJFIikucmVwbGFjZSgiMC4yM0UxNyIsICIyLjNFMTYiKTsKLQotICBwcml2YXRlIFN0cmluZyBtZXNzYWdlU2V0VGV4dCA9Ci0gICAgIltwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbiIgKwotICAgICIgIGk6IDEyM1xuIiArCi0gICAgIn1cbiIgKwotICAgICJbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4iICsKLSAgICAiICBzdHI6IFwiZm9vXCJcbiIgKwotICAgICJ9XG4iOwotCi0gIC8qKiBQcmludCBUZXN0QWxsVHlwZXMgYW5kIGNvbXBhcmUgd2l0aCBnb2xkZW4gZmlsZS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFByaW50TWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN0cmluZyBqYXZhVGV4dCA9IFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhUZXN0VXRpbC5nZXRBbGxTZXQoKSk7Ci0KLSAgICAvLyBKYXZhIGxpa2VzIHRvIGFkZCBhIHRyYWlsaW5nICIuMCIgdG8gZmxvYXRzIGFuZCBkb3VibGVzLiAgQyBwcmludGYKLSAgICAvLyAod2l0aCAlZyBmb3JtYXQpIGRvZXMgbm90LiAgT3VyIGdvbGRlbiBmaWxlcyBhcmUgdXNlZCBmb3IgYm90aAotICAgIC8vIEMrKyBhbmQgSmF2YSBUZXh0Rm9ybWF0IGNsYXNzZXMsIHNvIHdlIG5lZWQgdG8gY29uZm9ybS4KLSAgICBqYXZhVGV4dCA9IGphdmFUZXh0LnJlcGxhY2UoIi4wXG4iLCAiXG4iKTsKLQotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHNTZXRUZXh0LCBqYXZhVGV4dCk7Ci0gIH0KLQotICAvKiogUHJpbnQgVGVzdEFsbEV4dGVuc2lvbnMgYW5kIGNvbXBhcmUgd2l0aCBnb2xkZW4gZmlsZS4gKi8KLSAgcHVibGljIHZvaWQgdGVzdFByaW50RXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIFN0cmluZyBqYXZhVGV4dCA9IFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCkpOwotCi0gICAgLy8gSmF2YSBsaWtlcyB0byBhZGQgYSB0cmFpbGluZyAiLjAiIHRvIGZsb2F0cyBhbmQgZG91Ymxlcy4gIEMgcHJpbnRmCi0gICAgLy8gKHdpdGggJWcgZm9ybWF0KSBkb2VzIG5vdC4gIE91ciBnb2xkZW4gZmlsZXMgYXJlIHVzZWQgZm9yIGJvdGgKLSAgICAvLyBDKysgYW5kIEphdmEgVGV4dEZvcm1hdCBjbGFzc2VzLCBzbyB3ZSBuZWVkIHRvIGNvbmZvcm0uCi0gICAgamF2YVRleHQgPSBqYXZhVGV4dC5yZXBsYWNlKCIuMFxuIiwgIlxuIik7Ci0KLSAgICBhc3NlcnRFcXVhbHMoYWxsRXh0ZW5zaW9uc1NldFRleHQsIGphdmFUZXh0KTsKLSAgfQotCi0gIC8vIENyZWF0ZXMgYW4gZXhhbXBsZSB1bmtub3duIGZpZWxkIHNldC4KLSAgcHJpdmF0ZSBVbmtub3duRmllbGRTZXQgbWFrZVVua25vd25GaWVsZFNldCgpIHsKLSAgICByZXR1cm4gVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkRmllbGQoNSwKLSAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoMSkKLSAgICAgICAgICAgIC5hZGRGaXhlZDMyKDIpCi0gICAgICAgICAgICAuYWRkRml4ZWQ2NCgzKQotICAgICAgICAgICAgLmFkZExlbmd0aERlbGltaXRlZChCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiNCIpKQotICAgICAgICAgICAgLmFkZEdyb3VwKAotICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkRmllbGQoMTAsCi0gICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAgICAgLmFkZFZhcmludCg1KQotICAgICAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYWRkRmllbGQoOCwKLSAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoMSkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoMikKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoMykKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYWRkRmllbGQoMTUsCi0gICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KDB4QUJDREVGMTIzNDU2Nzg5MEwpCi0gICAgICAgICAgICAuYWRkRml4ZWQzMigweEFCQ0QxMjM0KQotICAgICAgICAgICAgLmFkZEZpeGVkNjQoMHhBQkNERUYxMjM0NTY3ODkwTCkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQcmludFVua25vd25GaWVsZHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0IHByaW50aW5nIG9mIHVua25vd24gZmllbGRzIGluIGEgbWVzc2FnZS4KLQotICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VW5rbm93bkZpZWxkcyhtYWtlVW5rbm93bkZpZWxkU2V0KCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgIjU6IDFcbiIgKwotICAgICAgIjU6IDB4MDAwMDAwMDJcbiIgKwotICAgICAgIjU6IDB4MDAwMDAwMDAwMDAwMDAwM1xuIiArCi0gICAgICAiNTogXCI0XCJcbiIgKwotICAgICAgIjUge1xuIiArCi0gICAgICAiICAxMDogNVxuIiArCi0gICAgICAifVxuIiArCi0gICAgICAiODogMVxuIiArCi0gICAgICAiODogMlxuIiArCi0gICAgICAiODogM1xuIiArCi0gICAgICAiMTU6IDEyMzc5ODEzODEyMTc3ODkzNTIwXG4iICsKLSAgICAgICIxNTogMHhhYmNkMTIzNFxuIiArCi0gICAgICAiMTU6IDB4YWJjZGVmMTIzNDU2Nzg5MFxuIiwKLSAgICAgIFRleHRGb3JtYXQucHJpbnRUb1N0cmluZyhtZXNzYWdlKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UHJpbnRGaWVsZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBkYXRhRmllbGQgPQotICAgICAgT25lU3RyaW5nLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoImRhdGEiKTsKLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAiZGF0YTogXCJ0ZXN0IGRhdGFcIlxuIiwKLSAgICAgIFRleHRGb3JtYXQucHJpbnRGaWVsZFRvU3RyaW5nKGRhdGFGaWVsZCwgInRlc3QgZGF0YSIpKTsKLQotICAgIGZpbmFsIEZpZWxkRGVzY3JpcHRvciBvcHRpb25hbEZpZWxkID0KLSAgICAgIFRlc3RBbGxUeXBlcy5nZXREZXNjcmlwdG9yKCkuZmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOwotICAgIGZpbmFsIE9iamVjdCB2YWx1ZSA9IE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDQyKS5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKAotICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHtcbiAgYmI6IDQyXG59XG4iLAotICAgICAgVGV4dEZvcm1hdC5wcmludEZpZWxkVG9TdHJpbmcob3B0aW9uYWxGaWVsZCwgdmFsdWUpKTsKLSAgfQotCi0gIC8qKgotICAgKiBIZWxwZXIgdG8gY29uc3RydWN0IGEgQnl0ZVN0cmluZyBmcm9tIGEgU3RyaW5nIGNvbnRhaW5pbmcgb25seSA4LWJpdAotICAgKiBjaGFyYWN0ZXJzLiAgVGhlIGNoYXJhY3RlcnMgYXJlIGNvbnZlcnRlZCBkaXJlY3RseSB0byBieXRlcywgKm5vdCoKLSAgICogZW5jb2RlZCB1c2luZyBVVEYtOC4KLSAgICovCi0gIHByaXZhdGUgQnl0ZVN0cmluZyBieXRlcyhTdHJpbmcgc3RyKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICByZXR1cm4gQnl0ZVN0cmluZy5jb3B5RnJvbShzdHIuZ2V0Qnl0ZXMoIklTTy04ODU5LTEiKSk7Ci0gIH0KLQotICAvKioKLSAgICogSGVscGVyIHRvIGNvbnN0cnVjdCBhIEJ5dGVTdHJpbmcgZnJvbSBhIGJ1bmNoIG9mIGJ5dGVzLiAgVGhlIGlucHV0cyBhcmUKLSAgICogYWN0dWFsbHkgaW50cyBzbyB0aGF0IEkgY2FuIHVzZSBoZXggbm90YXRpb24gYW5kIG5vdCBnZXQgc3R1cGlkIGVycm9ycwotICAgKiBhYm91dCBwcmVjaXNpb24uCi0gICAqLwotICBwcml2YXRlIEJ5dGVTdHJpbmcgYnl0ZXMoaW50Li4uIGJ5dGVzQXNJbnRzKSB7Ci0gICAgYnl0ZVtdIGJ5dGVzID0gbmV3IGJ5dGVbYnl0ZXNBc0ludHMubGVuZ3RoXTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGJ5dGVzQXNJbnRzLmxlbmd0aDsgaSsrKSB7Ci0gICAgICBieXRlc1tpXSA9IChieXRlKSBieXRlc0FzSW50c1tpXTsKLSAgICB9Ci0gICAgcmV0dXJuIEJ5dGVTdHJpbmcuY29weUZyb20oYnl0ZXMpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFByaW50RXhvdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgTWVzc2FnZSBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKQotICAgICAgLy8gU2lnbmVkIHZzLiB1bnNpZ25lZCBudW1iZXJzLgotICAgICAgLmFkZFJlcGVhdGVkSW50MzIgKC0xKQotICAgICAgLmFkZFJlcGVhdGVkVWludDMyKC0xKQotICAgICAgLmFkZFJlcGVhdGVkSW50NjQgKC0xKQotICAgICAgLmFkZFJlcGVhdGVkVWludDY0KC0xKQotCi0gICAgICAuYWRkUmVwZWF0ZWRJbnQzMiAoMSAgPDwgMzEpCi0gICAgICAuYWRkUmVwZWF0ZWRVaW50MzIoMSAgPDwgMzEpCi0gICAgICAuYWRkUmVwZWF0ZWRJbnQ2NCAoMWwgPDwgNjMpCi0gICAgICAuYWRkUmVwZWF0ZWRVaW50NjQoMWwgPDwgNjMpCi0KLSAgICAgIC8vIEZsb2F0cyBvZiB2YXJpb3VzIHByZWNpc2lvbnMgYW5kIGV4cG9uZW50cy4KLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzLjUpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMC4xMjUpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLjEyNSkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgtLjEyNSkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjNlMTUpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoMTIzZTE1KQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKC0xLjIzZS0xNykKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSguMjNlMTcpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoLTIzZTE1KQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyMy41ZTIwKQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKDEyMy41ZS0yMCkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZSgxMjMuNDU2Nzg5KQotICAgICAgLmFkZFJlcGVhdGVkRG91YmxlKERvdWJsZS5QT1NJVElWRV9JTkZJTklUWSkKLSAgICAgIC5hZGRSZXBlYXRlZERvdWJsZShEb3VibGUuTkVHQVRJVkVfSU5GSU5JVFkpCi0gICAgICAuYWRkUmVwZWF0ZWREb3VibGUoRG91YmxlLk5hTikKLQotICAgICAgLy8gU3RyaW5ncyBhbmQgYnl0ZXMgdGhhdCBuZWVkaW5nIGVzY2FwaW5nLgotICAgICAgLmFkZFJlcGVhdGVkU3RyaW5nKCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCJcdTEyMzQiKQotICAgICAgLmFkZFJlcGVhdGVkQnl0ZXMoYnl0ZXMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIlx1MDBmZSIpKQotICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoY2Fub25pY2FsRXhvdGljVGV4dCwgbWVzc2FnZS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQcmludE1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KLSAgICAgIFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uLAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkuc2V0SSgxMjMpLmJ1aWxkKCkpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oCi0gICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24sCi0gICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm5ld0J1aWxkZXIoKS5zZXRTdHIoImZvbyIpLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotCi0gICAgYXNzZXJ0RXF1YWxzKG1lc3NhZ2VTZXRUZXh0LCBtZXNzYWdlU2V0LnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2UoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXh0Rm9ybWF0Lm1lcmdlKGFsbEZpZWxkc1NldFRleHQsIGJ1aWxkZXIpOwotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChidWlsZGVyLmJ1aWxkKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlUmVhZGVyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShuZXcgU3RyaW5nUmVhZGVyKGFsbEZpZWxkc1NldFRleHQpLCBidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoYnVpbGRlci5idWlsZCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsRXh0ZW5zaW9ucy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsRXh0ZW5zaW9ucy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShhbGxFeHRlbnNpb25zU2V0VGV4dCwKLSAgICAgICAgICAgICAgICAgICAgIFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCksCi0gICAgICAgICAgICAgICAgICAgICBidWlsZGVyKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KGJ1aWxkZXIuYnVpbGQoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VDb21wYXRpYmlsaXR5KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIG9yaWdpbmFsID0gInJlcGVhdGVkX2Zsb2F0OiBpbmZcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLWluZlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBuYW5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogaW5mZlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtaW5mZlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBuYW5mXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMGZcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogaW5maW5pdHlmXG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eWZcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IGluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiAtaW5maW5pdHlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IG5hblxuIjsKLSAgICBTdHJpbmcgY2Fub25pY2FsID0gICJyZXBlYXRlZF9mbG9hdDogSW5maW5pdHlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiAtSW5maW5pdHlcbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBOYU5cbiIgKwotICAgICAgICAgICAgICAgICAgICAgICAgInJlcGVhdGVkX2Zsb2F0OiBJbmZpbml0eVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IC1JbmZpbml0eVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IE5hTlxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IDEuMFxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZmxvYXQ6IEluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mbG9hdDogLUluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IEluZmluaXR5XG4iICsKLSAgICAgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9kb3VibGU6IC1JbmZpbml0eVxuIiArCi0gICAgICAgICAgICAgICAgICAgICAgICAicmVwZWF0ZWRfZG91YmxlOiBOYU5cbiI7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShvcmlnaW5hbCwgYnVpbGRlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKGNhbm9uaWNhbCwgYnVpbGRlci5idWlsZCgpLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlRXhvdGljKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShleG90aWNUZXh0LCBidWlsZGVyKTsKLQotICAgIC8vIFRvbyBsYXp5IHRvIGNoZWNrIHRoaW5ncyBpbmRpdmlkdWFsbHkuICBEb24ndCB0cnkgdG8gZGVidWcgdGhpcwotICAgIC8vIGlmIHRlc3RQcmludEV4b3RpYygpIGlzIGZhaWxpbmcuCi0gICAgYXNzZXJ0RXF1YWxzKGNhbm9uaWNhbEV4b3RpY1RleHQsIGJ1aWxkZXIuYnVpbGQoKS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKLSAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pOwotCi0gICAgVGVzdE1lc3NhZ2VTZXQuQnVpbGRlciBidWlsZGVyID0gVGVzdE1lc3NhZ2VTZXQubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UobWVzc2FnZVNldFRleHQsIGV4dGVuc2lvblJlZ2lzdHJ5LCBidWlsZGVyKTsKLSAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0gYnVpbGRlci5idWlsZCgpOwotCi0gICAgYXNzZXJ0VHJ1ZShtZXNzYWdlU2V0Lmhhc0V4dGVuc2lvbigKLSAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEyMywgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCi0gICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0SSgpKTsKLSAgICBhc3NlcnRUcnVlKG1lc3NhZ2VTZXQuaGFzRXh0ZW5zaW9uKAotICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pKTsKLSAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1lc3NhZ2VTZXQuZ2V0RXh0ZW5zaW9uKAotICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pLmdldFN0cigpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU51bWVyaWNFbnVtKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfbmVzdGVkX2VudW06IDIiLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFSLCBidWlsZGVyLmdldE9wdGlvbmFsTmVzdGVkRW51bSgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUFuZ2xlQnJhY2tldHMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJPcHRpb25hbEdyb3VwOiA8IGE6IDEgPiIsIGJ1aWxkZXIpOwotICAgIGFzc2VydFRydWUoYnVpbGRlci5oYXNPcHRpb25hbEdyb3VwKCkpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9wdGlvbmFsR3JvdXAoKS5nZXRBKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFBhcnNlQ29tbWVudCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UoCi0gICAgICAiIyB0aGlzIGlzIGEgY29tbWVudFxuIiArCi0gICAgICAib3B0aW9uYWxfaW50MzI6IDEgICMgYW5vdGhlciBjb21tZW50XG4iICsKLSAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIiArCi0gICAgICAiIyBFT0YgY29tbWVudCIsIGJ1aWxkZXIpOwotICAgIGFzc2VydEVxdWFscygxLCBidWlsZGVyLmdldE9wdGlvbmFsSW50MzIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDIsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxJbnQ2NCgpKTsKLSAgfQotCi0gIHByaXZhdGUgdm9pZCBhc3NlcnRQYXJzZUVycm9yKFN0cmluZyBlcnJvciwgU3RyaW5nIHRleHQpIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5tZXJnZSh0ZXh0LCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpLCBidWlsZGVyKTsKLSAgICAgIGZhaWwoIkV4cGVjdGVkIHBhcnNlIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LlBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIGFzc2VydEVxdWFscyhlcnJvciwgZS5nZXRNZXNzYWdlKCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUVycm9ycygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToxNjogRXhwZWN0ZWQgXCI6XCIuIiwKLSAgICAgICJvcHRpb25hbF9pbnQzMiAxMjMiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MjM6IEV4cGVjdGVkIGlkZW50aWZpZXIuIiwKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogPyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToxODogQ291bGRuJ3QgcGFyc2UgaW50ZWdlcjogTnVtYmVyIG11c3QgYmUgcG9zaXRpdmU6IC0xIiwKLSAgICAgICJvcHRpb25hbF91aW50MzI6IC0xIik7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjE3OiBDb3VsZG4ndCBwYXJzZSBpbnRlZ2VyOiBOdW1iZXIgb3V0IG9mIHJhbmdlIGZvciAzMi1iaXQgc2lnbmVkICIgKwotICAgICAgICAiaW50ZWdlcjogODIzMDE0ODEyOTA4NDkwMTIzODUyMzAxNTciLAotICAgICAgIm9wdGlvbmFsX2ludDMyOiA4MjMwMTQ4MTI5MDg0OTAxMjM4NTIzMDE1NyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToxNjogRXhwZWN0ZWQgXCJ0cnVlXCIgb3IgXCJmYWxzZVwiLiIsCi0gICAgICAib3B0aW9uYWxfYm9vbDogbWF5YmUiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTY6IEV4cGVjdGVkIFwidHJ1ZVwiIG9yIFwiZmFsc2VcIi4iLAotICAgICAgIm9wdGlvbmFsX2Jvb2w6IDIiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTg6IEV4cGVjdGVkIHN0cmluZy4iLAotICAgICAgIm9wdGlvbmFsX3N0cmluZzogMTIzIik7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjE4OiBTdHJpbmcgbWlzc2luZyBlbmRpbmcgcXVvdGUuIiwKLSAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwidWVvYXVhb2UiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLAotICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJ1ZW9hdWFvZVxuIiArCi0gICAgICAib3B0aW9uYWxfaW50MzI6IDEyMyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToxODogSW52YWxpZCBlc2NhcGUgc2VxdWVuY2U6ICdcXHonIiwKLSAgICAgICJvcHRpb25hbF9zdHJpbmc6IFwiXFx6XCIiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MTg6IFN0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4iLAotICAgICAgIm9wdGlvbmFsX3N0cmluZzogXCJ1ZW9hdWFvZVxuIiArCi0gICAgICAib3B0aW9uYWxfaW50MzI6IDEyMyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyOiBFeHRlbnNpb24gXCJub3N1Y2hleHRcIiBub3QgZm91bmQgaW4gdGhlIEV4dGVuc2lvblJlZ2lzdHJ5LiIsCi0gICAgICAiW25vc3VjaGV4dF06IDEyMyIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyMDogRXh0ZW5zaW9uIFwicHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXCIgZG9lcyAiICsKLSAgICAgICAgIm5vdCBleHRlbmQgbWVzc2FnZSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzXCIuIiwKLSAgICAgICJbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uXTogMTIzIik7Ci0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjE6IE1lc3NhZ2UgdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiIGhhcyBubyBmaWVsZCAiICsKLSAgICAgICAgIm5hbWVkIFwibm9zdWNoZmllbGRcIi4iLAotICAgICAgIm5vc3VjaGZpZWxkOiAxMjMiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MjE6IEV4cGVjdGVkIFwiPlwiLiIsCi0gICAgICAiT3B0aW9uYWxHcm91cCA8IGE6IDEiKTsKLSAgICBhc3NlcnRQYXJzZUVycm9yKAotICAgICAgIjE6MjM6IEVudW0gdHlwZSBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtXCIgaGFzIG5vICIgKwotICAgICAgICAidmFsdWUgbmFtZWQgXCJOT19TVUNIX1ZBTFVFXCIuIiwKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogTk9fU1VDSF9WQUxVRSIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyMzogRW51bSB0eXBlIFwicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW1cIiBoYXMgbm8gIiArCi0gICAgICAgICJ2YWx1ZSB3aXRoIG51bWJlciAxMjMuIiwKLSAgICAgICJvcHRpb25hbF9uZXN0ZWRfZW51bTogMTIzIik7Ci0KLSAgICAvLyBEZWxpbWl0ZXJzIG11c3QgbWF0Y2guCi0gICAgYXNzZXJ0UGFyc2VFcnJvcigKLSAgICAgICIxOjIyOiBFeHBlY3RlZCBpZGVudGlmaWVyLiIsCi0gICAgICAiT3B0aW9uYWxHcm91cCA8IGE6IDEgfSIpOwotICAgIGFzc2VydFBhcnNlRXJyb3IoCi0gICAgICAiMToyMjogRXhwZWN0ZWQgaWRlbnRpZmllci4iLAotICAgICAgIk9wdGlvbmFsR3JvdXAgeyBhOiAxID4iKTsKLSAgfQotCi0gIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLSAgcHVibGljIHZvaWQgdGVzdEVzY2FwZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEVzY2FwZSBzZXF1ZW5jZXMuCi0gICAgYXNzZXJ0RXF1YWxzKCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiLAotICAgICAgVGV4dEZvcm1hdC5lc2NhcGVCeXRlcyhieXRlcygiXDBcMDAxXDAwN1xiXGZcblxyXHRcMDEzXFxcJ1wiIikpKTsKLSAgICBhc3NlcnRFcXVhbHMoIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIiIsCi0gICAgICBUZXh0Rm9ybWF0LmVzY2FwZVRleHQoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIiIpKTsKLSAgICBhc3NlcnRFcXVhbHMoYnl0ZXMoIlwwXDAwMVwwMDdcYlxmXG5cclx0XDAxM1xcXCdcIiIpLAotICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXDAwMFxcMDAxXFxhXFxiXFxmXFxuXFxyXFx0XFx2XFxcXFxcJ1xcXCIiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcMFwwMDFcMDA3XGJcZlxuXHJcdFwwMTNcXFwnXCIiLAotICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxcMDAwXFwwMDFcXGFcXGJcXGZcXG5cXHJcXHRcXHZcXFxcXFwnXFxcIiIpKTsKLSAgICBhc3NlcnRFcXVhbHMoa0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkLAotICAgICAgVGV4dEZvcm1hdC5lc2NhcGVUZXh0KGtFc2NhcGVUZXN0U3RyaW5nKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGtFc2NhcGVUZXN0U3RyaW5nLAotICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoa0VzY2FwZVRlc3RTdHJpbmdFc2NhcGVkKSk7Ci0KLSAgICAvLyBVbmljb2RlIGhhbmRsaW5nLgotICAgIGFzc2VydEVxdWFscygiXFwzNDFcXDIxMFxcMjY0IiwgVGV4dEZvcm1hdC5lc2NhcGVUZXh0KCJcdTEyMzQiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcXDM0MVxcMjEwXFwyNjQiLAotICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LmVzY2FwZUJ5dGVzKGJ5dGVzKDB4ZTEsIDB4ODgsIDB4YjQpKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFwzNDFcXDIxMFxcMjY0IikpOwotICAgIGFzc2VydEVxdWFscyhieXRlcygweGUxLCAweDg4LCAweGI0KSwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXDM0MVxcMjEwXFwyNjQiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCJcdTEyMzQiLCBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFx4ZTFcXHg4OFxceGI0IikpOwotICAgIGFzc2VydEVxdWFscyhieXRlcygweGUxLCAweDg4LCAweGI0KSwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZUJ5dGVzKCJcXHhlMVxceDg4XFx4YjQiKSk7Ci0KLSAgICAvLyBIYW5kbGluZyBvZiBzdHJpbmdzIHdpdGggdW5lc2NhcGVkIFVuaWNvZGUgY2hhcmFjdGVycyA+IDI1NS4KLSAgICBmaW5hbCBTdHJpbmcgemggPSAiXHU5OTk5XHU2ZTJmXHU0ZTBhXHU2ZDc3XHVkODRmXHVkZjgwXHU4YzUwXHU5MjgwXHU4ODRjIjsKLSAgICBCeXRlU3RyaW5nIHpoQnl0ZVN0cmluZyA9IEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KHpoKTsKLSAgICBhc3NlcnRFcXVhbHMoemhCeXRlU3RyaW5nLCBUZXh0Rm9ybWF0LnVuZXNjYXBlQnl0ZXMoemgpKTsKLQotICAgIC8vIEVycm9ycy4KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC51bmVzY2FwZVRleHQoIlxceCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LkludmFsaWRFc2NhcGVTZXF1ZW5jZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQudW5lc2NhcGVUZXh0KCJcXHoiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBUZXh0Rm9ybWF0LnVuZXNjYXBlVGV4dCgiXFwiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5JbnZhbGlkRXNjYXBlU2VxdWVuY2VFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUludGVnZXIoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDAsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggICAgICAgICAgIjAiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAxLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAgICAgICIxIikpOwotICAgIGFzc2VydEVxdWFscyggICAgICAgICAtMSwgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAgICAgICAgICItMSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgMTIzNDUsIFRleHRGb3JtYXQucGFyc2VJbnQzMiggICAgICAiMTIzNDUiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgLTEyMzQ1LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoICAgICAiLTEyMzQ1IikpOwotICAgIGFzc2VydEVxdWFscyggMjE0NzQ4MzY0NywgVGV4dEZvcm1hdC5wYXJzZUludDMyKCAiMjE0NzQ4MzY0NyIpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTIxNDc0ODM2NDgsIFRleHRGb3JtYXQucGFyc2VJbnQzMigiLTIxNDc0ODM2NDgiKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgICAgICAgIDAsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoICAgICAgICAgIjAiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAgICAgICAxLCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCAgICAgICAgICIxIikpOwotICAgIGFzc2VydEVxdWFscyggICAgICAgICAgICAxMjM0NSwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMiggICAgICIxMjM0NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgIDIxNDc0ODM2NDcsIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIjIxNDc0ODM2NDciKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKChpbnQpIDIxNDc0ODM2NDhMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDMyKCIyMTQ3NDgzNjQ4IikpOwotICAgIGFzc2VydEVxdWFscygoaW50KSA0Mjk0OTY3Mjk1TCwgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMigiNDI5NDk2NzI5NSIpKTsKLQotICAgIGFzc2VydEVxdWFscyggICAgICAgICAgMEwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICAgICAgIjAiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgICAgICAxTCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAgICAgICAgICAiMSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgLTFMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICAgICAgICAgIi0xIikpOwotICAgIGFzc2VydEVxdWFscyggICAgICAxMjM0NUwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCggICAgICAiMTIzNDUiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCAgICAgLTEyMzQ1TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAgICAgIi0xMjM0NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDIxNDc0ODM2NDdMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICIyMTQ3NDgzNjQ3IikpOwotICAgIGFzc2VydEVxdWFscygtMjE0NzQ4MzY0OEwsIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTIxNDc0ODM2NDgiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKCA0Mjk0OTY3Mjk1TCwgVGV4dEZvcm1hdC5wYXJzZUludDY0KCAiNDI5NDk2NzI5NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTZMLCBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoICI0Mjk0OTY3Mjk2IikpOwotICAgIGFzc2VydEVxdWFscyg5MjIzMzcyMDM2ODU0Nzc1ODA3TCwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA3IikpOwotICAgIGFzc2VydEVxdWFscygtOTIyMzM3MjAzNjg1NDc3NTgwOEwsCi0gICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDgiKSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDBMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICAgICAiMCIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgICAgIDFMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICAgICAiMSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoICAgICAgMTIzNDVMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAgICAgICIxMjM0NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDIxNDc0ODM2NDdMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiMjE0NzQ4MzY0NyIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTVMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiNDI5NDk2NzI5NSIpKTsKLSAgICBhc3NlcnRFcXVhbHMoIDQyOTQ5NjcyOTZMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCAiNDI5NDk2NzI5NiIpKTsKLSAgICBhc3NlcnRFcXVhbHMoOTIyMzM3MjAzNjg1NDc3NTgwN0wsCi0gICAgICAgICAgICAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50NjQoIjkyMjMzNzIwMzY4NTQ3NzU4MDciKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC05MjIzMzcyMDM2ODU0Nzc1ODA4TCwKLSAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiOTIyMzM3MjAzNjg1NDc3NTgwOCIpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTFMLCBUZXh0Rm9ybWF0LnBhcnNlVUludDY0KCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIpKTsKLQotICAgIC8vIEhleAotICAgIGFzc2VydEVxdWFscygweDEyMzRhYmNkLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIjB4MTIzNGFiY2QiKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKC0weDEyMzRhYmNkLCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIi0weDEyMzRhYmNkIikpOwotICAgIGFzc2VydEVxdWFscygtMSwgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiMHhmZmZmZmZmZmZmZmZmZmZmIikpOwotICAgIGFzc2VydEVxdWFscygweDdmZmZmZmZmZmZmZmZmZmZMLAotICAgICAgICAgICAgICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50NjQoIjB4N2ZmZmZmZmZmZmZmZmZmZiIpKTsKLQotICAgIC8vIE9jdGFsCi0gICAgYXNzZXJ0RXF1YWxzKDAxMjM0NTY3LCBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIjAxMjM0NTY3IikpOwotCi0gICAgLy8gT3V0LW9mLXJhbmdlCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQzMigiMjE0NzQ4MzY0OCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLQotICAgIHRyeSB7Ci0gICAgICBUZXh0Rm9ybWF0LnBhcnNlSW50MzIoIi0yMTQ3NDgzNjQ5Iik7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VVSW50MzIoIjQyOTQ5NjcyOTYiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQzMigiLTEiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZUludDY0KCI5MjIzMzcyMDM2ODU0Nzc1ODA4Iik7Ci0gICAgICBmYWlsKCJTaG91bGQgaGF2ZSB0aHJvd24gYW4gZXhjZXB0aW9uLiIpOwotICAgIH0gY2F0Y2ggKE51bWJlckZvcm1hdEV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQ2NCgiLTkyMjMzNzIwMzY4NTQ3NzU4MDkiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiMTg0NDY3NDQwNzM3MDk1NTE2MTYiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICB0cnkgewotICAgICAgVGV4dEZvcm1hdC5wYXJzZVVJbnQ2NCgiLTEiKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoTnVtYmVyRm9ybWF0RXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0KLSAgICAvLyBOb3QgYSBudW1iZXIuCi0gICAgdHJ5IHsKLSAgICAgIFRleHRGb3JtYXQucGFyc2VJbnQzMigiYWJjZCIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChOdW1iZXJGb3JtYXRFeGNlcHRpb24gZSkgewotICAgICAgLy8gc3VjY2VzcwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVN0cmluZygpIHRocm93cyBFeGNlcHRpb24gewotICAgIGZpbmFsIFN0cmluZyB6aCA9ICJcdTk5OTlcdTZlMmZcdTRlMGFcdTZkNzdcdWQ4NGZcdWRmODBcdThjNTBcdTkyODBcdTg4NGMiOwotICAgIFRlc3RBbGxUeXBlcy5CdWlsZGVyIGJ1aWxkZXIgPSBUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpOwotICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX3N0cmluZzogXCIiICsgemggKyAiXCIiLCBidWlsZGVyKTsKLSAgICBhc3NlcnRFcXVhbHMoemgsIGJ1aWxkZXIuZ2V0T3B0aW9uYWxTdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VMb25nU3RyaW5nKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgU3RyaW5nIGxvbmdUZXh0ID0KLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiICsKLSAgICAgICIxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAxMjM0NTY3ODkwMTIzNDU2Nzg5MDEyMzQ1Njc4OTAiOwotCi0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfc3RyaW5nOiBcIiIgKyBsb25nVGV4dCArICJcIiIsIGJ1aWxkZXIpOwotICAgIGFzc2VydEVxdWFscyhsb25nVGV4dCwgYnVpbGRlci5nZXRPcHRpb25hbFN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUJvb2xlYW4oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBTdHJpbmcgZ29vZFRleHQgPQotICAgICAgICAicmVwZWF0ZWRfYm9vbDogdCAgcmVwZWF0ZWRfYm9vbCA6IDBcbiIgKwotICAgICAgICAicmVwZWF0ZWRfYm9vbCA6ZiByZXBlYXRlZF9ib29sOjEiOwotICAgIFN0cmluZyBnb29kVGV4dENhbm9uaWNhbCA9Ci0gICAgICAgICJyZXBlYXRlZF9ib29sOiB0cnVlXG4iICsKLSAgICAgICAgInJlcGVhdGVkX2Jvb2w6IGZhbHNlXG4iICsKLSAgICAgICAgInJlcGVhdGVkX2Jvb2w6IGZhbHNlXG4iICsKLSAgICAgICAgInJlcGVhdGVkX2Jvb2w6IHRydWVcbiI7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZShnb29kVGV4dCwgYnVpbGRlcik7Ci0gICAgYXNzZXJ0RXF1YWxzKGdvb2RUZXh0Q2Fub25pY2FsLCBidWlsZGVyLmJ1aWxkKCkudG9TdHJpbmcoKSk7Ci0KLSAgICB0cnkgewotICAgICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYmFkQnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgICBUZXh0Rm9ybWF0Lm1lcmdlKCJvcHRpb25hbF9ib29sOjIiLCBiYWRCdWlsZGVyKTsKLSAgICAgIGZhaWwoIlNob3VsZCBoYXZlIHRocm93biBhbiBleGNlcHRpb24uIik7Ci0gICAgfSBjYXRjaCAoVGV4dEZvcm1hdC5QYXJzZUV4Y2VwdGlvbiBlKSB7Ci0gICAgICAvLyBzdWNjZXNzCi0gICAgfQotICAgIHRyeSB7Ci0gICAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBiYWRCdWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICAgIFRleHRGb3JtYXQubWVyZ2UoIm9wdGlvbmFsX2Jvb2w6IGZvbyIsIGJhZEJ1aWxkZXIpOwotICAgICAgZmFpbCgiU2hvdWxkIGhhdmUgdGhyb3duIGFuIGV4Y2VwdGlvbi4iKTsKLSAgICB9IGNhdGNoIChUZXh0Rm9ybWF0LlBhcnNlRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIHN1Y2Nlc3MKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VBZGphY2VudFN0cmluZ0xpdGVyYWxzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdEFsbFR5cGVzLkJ1aWxkZXIgYnVpbGRlciA9IFRlc3RBbGxUeXBlcy5uZXdCdWlsZGVyKCk7Ci0gICAgVGV4dEZvcm1hdC5tZXJnZSgib3B0aW9uYWxfc3RyaW5nOiBcImZvb1wiICdjb3JnZScgXCJncmF1bHRcIiIsIGJ1aWxkZXIpOwotICAgIGFzc2VydEVxdWFscygiZm9vY29yZ2VncmF1bHQiLCBidWlsZGVyLmdldE9wdGlvbmFsU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFByaW50RmllbGRWYWx1ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiXCJIZWxsb1wiIiwgIkhlbGxvIiwgInJlcGVhdGVkX3N0cmluZyIpOwotICAgIGFzc2VydFByaW50RmllbGRWYWx1ZSgiMTIzLjAiLCAgMTIzZiwgInJlcGVhdGVkX2Zsb2F0Iik7Ci0gICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxMjMuMCIsICAxMjNkLCAicmVwZWF0ZWRfZG91YmxlIik7Ci0gICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxMjMiLCAgMTIzLCAicmVwZWF0ZWRfaW50MzIiKTsKLSAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIjEyMyIsICAxMjNMLCAicmVwZWF0ZWRfaW50NjQiKTsKLSAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoInRydWUiLCAgdHJ1ZSwgInJlcGVhdGVkX2Jvb2wiKTsKLSAgICBhc3NlcnRQcmludEZpZWxkVmFsdWUoIjQyOTQ5NjcyOTUiLCAweEZGRkZGRkZGLCAicmVwZWF0ZWRfdWludDMyIik7Ci0gICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCIxODQ0Njc0NDA3MzcwOTU1MTYxNSIsICAweEZGRkZGRkZGRkZGRkZGRkZMLAotICAgICAgICAicmVwZWF0ZWRfdWludDY0Iik7Ci0gICAgYXNzZXJ0UHJpbnRGaWVsZFZhbHVlKCJcIlxcMDAxXFwwMDJcXDAwM1wiIiwKLSAgICAgICAgQnl0ZVN0cmluZy5jb3B5RnJvbShuZXcgYnl0ZVtdIHsxLCAyLCAzfSksICJyZXBlYXRlZF9ieXRlcyIpOwotICB9Ci0KLSAgcHJpdmF0ZSB2b2lkIGFzc2VydFByaW50RmllbGRWYWx1ZShTdHJpbmcgZXhwZWN0LCBPYmplY3QgdmFsdWUsCi0gICAgICBTdHJpbmcgZmllbGROYW1lKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMuQnVpbGRlciBidWlsZGVyID0gVGVzdEFsbFR5cGVzLm5ld0J1aWxkZXIoKTsKLSAgICBTdHJpbmdCdWlsZGVyIHNiID0gbmV3IFN0cmluZ0J1aWxkZXIoKTsKLSAgICBUZXh0Rm9ybWF0LnByaW50RmllbGRWYWx1ZSgKLSAgICAgICAgVGVzdEFsbFR5cGVzLmdldERlc2NyaXB0b3IoKS5maW5kRmllbGRCeU5hbWUoZmllbGROYW1lKSwKLSAgICAgICAgdmFsdWUsIHNiKTsKLSAgICBhc3NlcnRFcXVhbHMoZXhwZWN0LCBzYi50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTaG9ydERlYnVnU3RyaW5nKCkgewotICAgIGFzc2VydEVxdWFscygib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyBiYjogNDIgfSByZXBlYXRlZF9pbnQzMjogMSIKLSAgICAgICAgKyAiIHJlcGVhdGVkX3VpbnQzMjogMiIsCi0gICAgICAgIFRleHRGb3JtYXQuc2hvcnREZWJ1Z1N0cmluZyhUZXN0QWxsVHlwZXMubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkUmVwZWF0ZWRJbnQzMigxKQotICAgICAgICAgICAgLmFkZFJlcGVhdGVkVWludDMyKDIpCi0gICAgICAgICAgICAuc2V0T3B0aW9uYWxOZXN0ZWRNZXNzYWdlKAotICAgICAgICAgICAgICAgIE5lc3RlZE1lc3NhZ2UubmV3QnVpbGRlcigpLnNldEJiKDQyKS5idWlsZCgpKQotICAgICAgICAgICAgLmJ1aWxkKCkpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTaG9ydERlYnVnU3RyaW5nX3Vua25vd24oKSB7Ci0gICAgYXNzZXJ0RXF1YWxzKCI1OiAxIDU6IDB4MDAwMDAwMDIgNTogMHgwMDAwMDAwMDAwMDAwMDAzIDU6IFwiNFwiIDUgeyAxMDogNSB9IgotICAgICAgICArICIgODogMSA4OiAyIDg6IDMgMTU6IDEyMzc5ODEzODEyMTc3ODkzNTIwIDE1OiAweGFiY2QxMjM0IDE1OiIKLSAgICAgICAgKyAiIDB4YWJjZGVmMTIzNDU2Nzg5MCIsCi0gICAgICAgIFRleHRGb3JtYXQuc2hvcnREZWJ1Z1N0cmluZyhtYWtlVW5rbm93bkZpZWxkU2V0KCkpKTsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbmtub3duRmllbGRTZXRUZXN0LmphdmEKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGVhMDg4YjMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1Vua25vd25GaWVsZFNldFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQzNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0QWxsVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0RW1wdHlNZXNzYWdlOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkFycmF5czsKLWltcG9ydCBqYXZhLnV0aWwuTWFwOwotCi0vKioKLSAqIFRlc3RzIHJlbGF0ZWQgdG8gdW5rbm93biBmaWVsZCBoYW5kbGluZy4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0gKi8KLXB1YmxpYyBjbGFzcyBVbmtub3duRmllbGRTZXRUZXN0IGV4dGVuZHMgVGVzdENhc2UgewotICBwdWJsaWMgdm9pZCBzZXRVcCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIGRlc2NyaXB0b3IgPSBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpOwotICAgIGFsbEZpZWxkcyA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotICAgIGFsbEZpZWxkc0RhdGEgPSBhbGxGaWVsZHMudG9CeXRlU3RyaW5nKCk7Ci0gICAgZW1wdHlNZXNzYWdlID0gVGVzdEVtcHR5TWVzc2FnZS5wYXJzZUZyb20oYWxsRmllbGRzRGF0YSk7Ci0gICAgdW5rbm93bkZpZWxkcyA9IGVtcHR5TWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCk7Ci0gIH0KLQotICBVbmtub3duRmllbGRTZXQuRmllbGQgZ2V0RmllbGQoU3RyaW5nIG5hbWUpIHsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgZmllbGQgPSBkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZShuYW1lKTsKLSAgICBhc3NlcnROb3ROdWxsKGZpZWxkKTsKLSAgICByZXR1cm4gdW5rbm93bkZpZWxkcy5nZXRGaWVsZChmaWVsZC5nZXROdW1iZXIoKSk7Ci0gIH0KLQotICAvLyBDb25zdHJ1Y3RzIGEgcHJvdG9jb2wgYnVmZmVyIHdoaWNoIGNvbnRhaW5zIGZpZWxkcyB3aXRoIGFsbCB0aGUgc2FtZQotICAvLyBudW1iZXJzIGFzIGFsbEZpZWxkc0RhdGEgZXhjZXB0IHRoYXQgZWFjaCBmaWVsZCBpcyBzb21lIG90aGVyIHdpcmUKLSAgLy8gdHlwZS4KLSAgQnl0ZVN0cmluZyBnZXRCaXphcnJvRGF0YSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFVua25vd25GaWVsZFNldC5CdWlsZGVyIGJpemFycm9GaWVsZHMgPSBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpOwotCi0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIHZhcmludEZpZWxkID0KLSAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkuYWRkVmFyaW50KDEpLmJ1aWxkKCk7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpeGVkMzJGaWVsZCA9Ci0gICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpLmFkZEZpeGVkMzIoMSkuYnVpbGQoKTsKLQotICAgIGZvciAoTWFwLkVudHJ5PEludGVnZXIsIFVua25vd25GaWVsZFNldC5GaWVsZD4gZW50cnkgOgotICAgICAgICAgdW5rbm93bkZpZWxkcy5hc01hcCgpLmVudHJ5U2V0KCkpIHsKLSAgICAgIGlmIChlbnRyeS5nZXRWYWx1ZSgpLmdldFZhcmludExpc3QoKS5pc0VtcHR5KCkpIHsKLSAgICAgICAgLy8gT3JpZ2luYWwgZmllbGQgaXMgbm90IGEgdmFyaW50LCBzbyB1c2UgYSB2YXJpbnQuCi0gICAgICAgIGJpemFycm9GaWVsZHMuYWRkRmllbGQoZW50cnkuZ2V0S2V5KCksIHZhcmludEZpZWxkKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIC8vIE9yaWdpbmFsIGZpZWxkICppcyogYSB2YXJpbnQsIHNvIHVzZSBzb21ldGhpbmcgZWxzZS4KLSAgICAgICAgYml6YXJyb0ZpZWxkcy5hZGRGaWVsZChlbnRyeS5nZXRLZXkoKSwgZml4ZWQzMkZpZWxkKTsKLSAgICAgIH0KLSAgICB9Ci0KLSAgICByZXR1cm4gYml6YXJyb0ZpZWxkcy5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotICB9Ci0KLSAgRGVzY3JpcHRvcnMuRGVzY3JpcHRvciBkZXNjcmlwdG9yOwotICBUZXN0QWxsVHlwZXMgYWxsRmllbGRzOwotICBCeXRlU3RyaW5nIGFsbEZpZWxkc0RhdGE7Ci0KLSAgLy8gQW4gZW1wdHkgbWVzc2FnZSB0aGF0IGhhcyBiZWVuIHBhcnNlZCBmcm9tIGFsbEZpZWxkc0RhdGEuICBTbywgaXQgaGFzCi0gIC8vIHVua25vd24gZmllbGRzIG9mIGV2ZXJ5IHR5cGUuCi0gIFRlc3RFbXB0eU1lc3NhZ2UgZW1wdHlNZXNzYWdlOwotICBVbmtub3duRmllbGRTZXQgdW5rbm93bkZpZWxkczsKLQotICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi0gIHB1YmxpYyB2b2lkIHRlc3RWYXJpbnQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPSBnZXRGaWVsZCgib3B0aW9uYWxfaW50MzIiKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0VmFyaW50TGlzdCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKGFsbEZpZWxkcy5nZXRPcHRpb25hbEludDMyKCksCi0gICAgICAgICAgICAgICAgIChsb25nKSBmaWVsZC5nZXRWYXJpbnRMaXN0KCkuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaXhlZDMyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsX2ZpeGVkMzIiKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0Rml4ZWQzMkxpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxGaXhlZDMyKCksCi0gICAgICAgICAgICAgICAgIChpbnQpIGZpZWxkLmdldEZpeGVkMzJMaXN0KCkuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RGaXhlZDY0KCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsX2ZpeGVkNjQiKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgZmllbGQuZ2V0Rml4ZWQ2NExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxGaXhlZDY0KCksCi0gICAgICAgICAgICAgICAgIChsb25nKSBmaWVsZC5nZXRGaXhlZDY0TGlzdCgpLmdldCgwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0TGVuZ3RoRGVsaW1pdGVkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gZ2V0RmllbGQoIm9wdGlvbmFsX2J5dGVzIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxCeXRlcygpLAotICAgICAgICAgICAgICAgICBmaWVsZC5nZXRMZW5ndGhEZWxpbWl0ZWRMaXN0KCkuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RHcm91cCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIERlc2NyaXB0b3JzLkZpZWxkRGVzY3JpcHRvciBuZXN0ZWRGaWVsZERlc2NyaXB0b3IgPQotICAgICAgVGVzdEFsbFR5cGVzLk9wdGlvbmFsR3JvdXAuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgiYSIpOwotICAgIGFzc2VydE5vdE51bGwobmVzdGVkRmllbGREZXNjcmlwdG9yKTsKLQotICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBmaWVsZCA9IGdldEZpZWxkKCJvcHRpb25hbGdyb3VwIik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldEdyb3VwTGlzdCgpLnNpemUoKSk7Ci0KLSAgICBVbmtub3duRmllbGRTZXQgZ3JvdXAgPSBmaWVsZC5nZXRHcm91cExpc3QoKS5nZXQoMCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGdyb3VwLmFzTWFwKCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRUcnVlKGdyb3VwLmhhc0ZpZWxkKG5lc3RlZEZpZWxkRGVzY3JpcHRvci5nZXROdW1iZXIoKSkpOwotCi0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIG5lc3RlZEZpZWxkID0KLSAgICAgIGdyb3VwLmdldEZpZWxkKG5lc3RlZEZpZWxkRGVzY3JpcHRvci5nZXROdW1iZXIoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIG5lc3RlZEZpZWxkLmdldFZhcmludExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHMuZ2V0T3B0aW9uYWxHcm91cCgpLmdldEEoKSwKLSAgICAgICAgICAgICAgICAgKGxvbmcpIG5lc3RlZEZpZWxkLmdldFZhcmludExpc3QoKS5nZXQoMCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIENoZWNrIHRoYXQgc2VyaWFsaXppbmcgdGhlIFVua25vd25GaWVsZFNldCBwcm9kdWNlcyB0aGUgb3JpZ2luYWwgZGF0YQotICAgIC8vIGFnYWluLgotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IGVtcHR5TWVzc2FnZS50b0J5dGVTdHJpbmcoKTsKLSAgICBhc3NlcnRFcXVhbHMoYWxsRmllbGRzRGF0YSwgZGF0YSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0Q29weUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0RW1wdHlNZXNzYWdlIG1lc3NhZ2UgPQotICAgICAgVGVzdEVtcHR5TWVzc2FnZS5uZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGVtcHR5TWVzc2FnZSkuYnVpbGQoKTsKLQotICAgIGFzc2VydEVxdWFscyhlbXB0eU1lc3NhZ2UudG9TdHJpbmcoKSwgbWVzc2FnZS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNZXJnZUZyb20oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0RW1wdHlNZXNzYWdlIHNvdXJjZSA9Ci0gICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0VW5rbm93bkZpZWxkcygKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkRmllbGQoMiwKLSAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoMikuYnVpbGQoKSkKLSAgICAgICAgICAgIC5hZGRGaWVsZCgzLAotICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLmFkZFZhcmludCg0KS5idWlsZCgpKQotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpOwotICAgIFRlc3RFbXB0eU1lc3NhZ2UgZGVzdGluYXRpb24gPQotICAgICAgVGVzdEVtcHR5TWVzc2FnZS5uZXdCdWlsZGVyKCkKLSAgICAgICAgLnNldFVua25vd25GaWVsZHMoCi0gICAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEZpZWxkKDEsCi0gICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkVmFyaW50KDEpLmJ1aWxkKCkpCi0gICAgICAgICAgICAuYWRkRmllbGQoMywKLSAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5hZGRWYXJpbnQoMykuYnVpbGQoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAubWVyZ2VGcm9tKHNvdXJjZSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAiMTogMVxuIiArCi0gICAgICAiMjogMlxuIiArCi0gICAgICAiMzogM1xuIiArCi0gICAgICAiMzogNFxuIiwKLSAgICAgIGRlc3RpbmF0aW9uLnRvU3RyaW5nKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVW5rbm93bkZpZWxkU2V0IGZpZWxkcyA9Ci0gICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpLm1lcmdlRnJvbSh1bmtub3duRmllbGRzKS5jbGVhcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0VHJ1ZShmaWVsZHMuYXNNYXAoKS5pc0VtcHR5KCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdENsZWFyTWVzc2FnZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIFRlc3RFbXB0eU1lc3NhZ2UgbWVzc2FnZSA9Ci0gICAgICBUZXN0RW1wdHlNZXNzYWdlLm5ld0J1aWxkZXIoKS5tZXJnZUZyb20oZW1wdHlNZXNzYWdlKS5jbGVhcigpLmJ1aWxkKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDAsIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VLbm93bkFuZFVua25vd24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0IG1peGluZyBrbm93biBhbmQgdW5rbm93biBmaWVsZHMgd2hlbiBwYXJzaW5nLgotCi0gICAgVW5rbm93bkZpZWxkU2V0IGZpZWxkcyA9Ci0gICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcih1bmtub3duRmllbGRzKQotICAgICAgICAuYWRkRmllbGQoMTIzNDU2LAotICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkuYWRkVmFyaW50KDY1NDMyMSkuYnVpbGQoKSkKLSAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBCeXRlU3RyaW5nIGRhdGEgPSBmaWVsZHMudG9CeXRlU3RyaW5nKCk7Ci0gICAgVGVzdEFsbFR5cGVzIGRlc3RpbmF0aW9uID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShkYXRhKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydEFsbEZpZWxkc1NldChkZXN0aW5hdGlvbik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGRlc3RpbmF0aW9uLmdldFVua25vd25GaWVsZHMoKS5hc01hcCgpLnNpemUoKSk7Ci0KLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZmllbGQgPQotICAgICAgZGVzdGluYXRpb24uZ2V0VW5rbm93bkZpZWxkcygpLmdldEZpZWxkKDEyMzQ1Nik7Ci0gICAgYXNzZXJ0RXF1YWxzKDEsIGZpZWxkLmdldFZhcmludExpc3QoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyg2NTQzMjEsIChsb25nKSBmaWVsZC5nZXRWYXJpbnRMaXN0KCkuZ2V0KDApKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ1R5cGVUcmVhdGVkQXNVbmtub3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCB0aGF0IGZpZWxkcyBvZiB0aGUgd3Jvbmcgd2lyZSB0eXBlIGFyZSB0cmVhdGVkIGxpa2UgdW5rbm93biBmaWVsZHMKLSAgICAvLyB3aGVuIHBhcnNpbmcuCi0KLSAgICBCeXRlU3RyaW5nIGJpemFycm9EYXRhID0gZ2V0Qml6YXJyb0RhdGEoKTsKLSAgICBUZXN0QWxsVHlwZXMgYWxsVHlwZXNNZXNzYWdlID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShiaXphcnJvRGF0YSk7Ci0gICAgVGVzdEVtcHR5TWVzc2FnZSBlbXB0eU1lc3NhZ2UgPSBUZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShiaXphcnJvRGF0YSk7Ci0KLSAgICAvLyBBbGwgZmllbGRzIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQgYXMgdW5rbm93biwgc28gdGhlIGRlYnVnIHN0cmluZ3MKLSAgICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuCi0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TWVzc2FnZS50b1N0cmluZygpLCBhbGxUeXBlc01lc3NhZ2UudG9TdHJpbmcoKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0VW5rbm93bkV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBNYWtlIHN1cmUgZmllbGRzIGFyZSBwcm9wZXJseSBwYXJzZWQgdG8gdGhlIFVua25vd25GaWVsZFNldCBldmVuIHdoZW4KLSAgICAvLyB0aGV5IGFyZSBkZWNsYXJlZCBhcyBleHRlbnNpb24gbnVtYmVycy4KLQotICAgIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyBtZXNzYWdlID0KLSAgICAgIFRlc3RFbXB0eU1lc3NhZ2VXaXRoRXh0ZW5zaW9ucy5wYXJzZUZyb20oYWxsRmllbGRzRGF0YSk7Ci0KLSAgICBhc3NlcnRFcXVhbHModW5rbm93bkZpZWxkcy5hc01hcCgpLnNpemUoKSwKLSAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkuYXNNYXAoKS5zaXplKCkpOwotICAgIGFzc2VydEVxdWFscyhhbGxGaWVsZHNEYXRhLCBtZXNzYWdlLnRvQnl0ZVN0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RXcm9uZ0V4dGVuc2lvblR5cGVUcmVhdGVkQXNVbmtub3duKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdCB0aGF0IGZpZWxkcyBvZiB0aGUgd3Jvbmcgd2lyZSB0eXBlIGFyZSB0cmVhdGVkIGxpa2UgdW5rbm93biBmaWVsZHMKLSAgICAvLyB3aGVuIHBhcnNpbmcgZXh0ZW5zaW9ucy4KLQotICAgIEJ5dGVTdHJpbmcgYml6YXJyb0RhdGEgPSBnZXRCaXphcnJvRGF0YSgpOwotICAgIFRlc3RBbGxFeHRlbnNpb25zIGFsbEV4dGVuc2lvbnNNZXNzYWdlID0KLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zLnBhcnNlRnJvbShiaXphcnJvRGF0YSk7Ci0gICAgVGVzdEVtcHR5TWVzc2FnZSBlbXB0eU1lc3NhZ2UgPSBUZXN0RW1wdHlNZXNzYWdlLnBhcnNlRnJvbShiaXphcnJvRGF0YSk7Ci0KLSAgICAvLyBBbGwgZmllbGRzIHNob3VsZCBoYXZlIGJlZW4gaW50ZXJwcmV0ZWQgYXMgdW5rbm93biwgc28gdGhlIGRlYnVnIHN0cmluZ3MKLSAgICAvLyBzaG91bGQgYmUgdGhlIHNhbWUuCi0gICAgYXNzZXJ0RXF1YWxzKGVtcHR5TWVzc2FnZS50b1N0cmluZygpLAotICAgICAgICAgICAgICAgICBhbGxFeHRlbnNpb25zTWVzc2FnZS50b1N0cmluZygpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVVua25vd25FbnVtVmFsdWUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3Igc2luZ3VsYXJGaWVsZCA9Ci0gICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX2VudW0iKTsKLSAgICBEZXNjcmlwdG9ycy5GaWVsZERlc2NyaXB0b3IgcmVwZWF0ZWRGaWVsZCA9Ci0gICAgICBUZXN0QWxsVHlwZXMuZ2V0RGVzY3JpcHRvcigpLmZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX2VudW0iKTsKLSAgICBhc3NlcnROb3ROdWxsKHNpbmd1bGFyRmllbGQpOwotICAgIGFzc2VydE5vdE51bGwocmVwZWF0ZWRGaWVsZCk7Ci0KLSAgICBCeXRlU3RyaW5nIGRhdGEgPQotICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuYWRkRmllbGQoc2luZ3VsYXJGaWVsZC5nZXROdW1iZXIoKSwKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkJBUi5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoNSkgICAvLyBub3QgdmFsaWQKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYWRkRmllbGQocmVwZWF0ZWRGaWVsZC5nZXROdW1iZXIoKSwKLSAgICAgICAgICBVbmtub3duRmllbGRTZXQuRmllbGQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkVmFyaW50KFRlc3RBbGxUeXBlcy5OZXN0ZWRFbnVtLkZPTy5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoNCkgICAvLyBub3QgdmFsaWQKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uQkFaLmdldE51bWJlcigpKQotICAgICAgICAgICAgLmFkZFZhcmludCg2KSAgIC8vIG5vdCB2YWxpZAotICAgICAgICAgICAgLmJ1aWxkKCkpCi0gICAgICAgIC5idWlsZCgpCi0gICAgICAgIC50b0J5dGVTdHJpbmcoKTsKLQotICAgIHsKLSAgICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdEFsbFR5cGVzLnBhcnNlRnJvbShkYXRhKTsKLSAgICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRPcHRpb25hbE5lc3RlZEVudW0oKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEFycmF5cy5hc0xpc3QoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopLAotICAgICAgICBtZXNzYWdlLmdldFJlcGVhdGVkTmVzdGVkRW51bUxpc3QoKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoQXJyYXlzLmFzTGlzdCg1TCksCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHNpbmd1bGFyRmllbGQuZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpbnRMaXN0KCkpOwotICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNEwsIDZMKSwKLSAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmdldFVua25vd25GaWVsZHMoKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0RmllbGQocmVwZWF0ZWRGaWVsZC5nZXROdW1iZXIoKSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldFZhcmludExpc3QoKSk7Ci0gICAgfQotCi0gICAgewotICAgICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZSA9Ci0gICAgICAgIFRlc3RBbGxFeHRlbnNpb25zLnBhcnNlRnJvbShkYXRhLCBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVIsCi0gICAgICAgIG1lc3NhZ2UuZ2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ub3B0aW9uYWxOZXN0ZWRFbnVtRXh0ZW5zaW9uKSk7Ci0gICAgICBhc3NlcnRFcXVhbHMoCi0gICAgICAgIEFycmF5cy5hc0xpc3QoVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0uRk9PLCBUZXN0QWxsVHlwZXMuTmVzdGVkRW51bS5CQVopLAotICAgICAgICBtZXNzYWdlLmdldEV4dGVuc2lvbihVbml0dGVzdFByb3RvLnJlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbikpOwotICAgICAgYXNzZXJ0RXF1YWxzKEFycmF5cy5hc0xpc3QoNUwpLAotICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0VW5rbm93bkZpZWxkcygpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRGaWVsZChzaW5ndWxhckZpZWxkLmdldE51bWJlcigpKQotICAgICAgICAgICAgICAgICAgICAgICAgICAuZ2V0VmFyaW50TGlzdCgpKTsKLSAgICAgIGFzc2VydEVxdWFscyhBcnJheXMuYXNMaXN0KDRMLCA2TCksCi0gICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXRVbmtub3duRmllbGRzKCkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgLmdldEZpZWxkKHJlcGVhdGVkRmllbGQuZ2V0TnVtYmVyKCkpCi0gICAgICAgICAgICAgICAgICAgICAgICAgIC5nZXRWYXJpbnRMaXN0KCkpOwotICAgIH0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RMYXJnZVZhcmludCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVTdHJpbmcgZGF0YSA9Ci0gICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgIC5hZGRGaWVsZCgxLAotICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoMHg3RkZGRkZGRkZGRkZGRkZGTCkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKQotICAgICAgICAudG9CeXRlU3RyaW5nKCk7Ci0gICAgVW5rbm93bkZpZWxkU2V0IHBhcnNlZCA9IFVua25vd25GaWVsZFNldC5wYXJzZUZyb20oZGF0YSk7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gcGFyc2VkLmdldEZpZWxkKDEpOwotICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRWYXJpbnRMaXN0KCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMHg3RkZGRkZGRkZGRkZGRkZGTCwgKGxvbmcpZmllbGQuZ2V0VmFyaW50TGlzdCgpLmdldCgwKSk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0RXF1YWxzQW5kSGFzaENvZGUoKSB7Ci0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpeGVkMzJGaWVsZCA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaXhlZDMyKDEpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLSAgICBVbmtub3duRmllbGRTZXQuRmllbGQgZml4ZWQ2NEZpZWxkID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEZpeGVkNjQoMSkKLSAgICAgICAgICAgIC5idWlsZCgpOwotICAgIFVua25vd25GaWVsZFNldC5GaWVsZCB2YXJJbnRGaWVsZCA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRWYXJpbnQoMSkKLSAgICAgICAgICAgIC5idWlsZCgpOwotICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBsZW5ndGhEZWxpbWl0ZWRGaWVsZCA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRMZW5ndGhEZWxpbWl0ZWQoQnl0ZVN0cmluZy5FTVBUWSkKLSAgICAgICAgICAgIC5idWlsZCgpOwotICAgIFVua25vd25GaWVsZFNldC5GaWVsZCBncm91cEZpZWxkID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEdyb3VwKHVua25vd25GaWVsZHMpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLQotICAgIFVua25vd25GaWVsZFNldCBhID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEZpZWxkKDEsIGZpeGVkMzJGaWVsZCkKLSAgICAgICAgICAgIC5idWlsZCgpOwotICAgIFVua25vd25GaWVsZFNldCBiID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEZpZWxkKDEsIGZpeGVkNjRGaWVsZCkKLSAgICAgICAgICAgIC5idWlsZCgpOwotICAgIFVua25vd25GaWVsZFNldCBjID0KLSAgICAgICAgVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLmFkZEZpZWxkKDEsIHZhckludEZpZWxkKQotICAgICAgICAgICAgLmJ1aWxkKCk7Ci0gICAgVW5rbm93bkZpZWxkU2V0IGQgPQotICAgICAgICBVbmtub3duRmllbGRTZXQubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuYWRkRmllbGQoMSwgbGVuZ3RoRGVsaW1pdGVkRmllbGQpCi0gICAgICAgICAgICAuYnVpbGQoKTsKLSAgICBVbmtub3duRmllbGRTZXQgZSA9Ci0gICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaWVsZCgxLCBncm91cEZpZWxkKQotICAgICAgICAgICAgLmJ1aWxkKCk7Ci0KLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChhKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChiKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChjKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChkKTsKLSAgICBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChlKTsKLQotICAgIGNoZWNrTm90RXF1YWwoYSwgYik7Ci0gICAgY2hlY2tOb3RFcXVhbChhLCBjKTsKLSAgICBjaGVja05vdEVxdWFsKGEsIGQpOwotICAgIGNoZWNrTm90RXF1YWwoYSwgZSk7Ci0gICAgY2hlY2tOb3RFcXVhbChiLCBjKTsKLSAgICBjaGVja05vdEVxdWFsKGIsIGQpOwotICAgIGNoZWNrTm90RXF1YWwoYiwgZSk7Ci0gICAgY2hlY2tOb3RFcXVhbChjLCBkKTsKLSAgICBjaGVja05vdEVxdWFsKGMsIGUpOwotICAgIGNoZWNrTm90RXF1YWwoZCwgZSk7Ci0gIH0KLQotICAvKioKLSAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBmaWVsZCBzZXRzIGFyZSBub3QgZXF1YWwgYW5kIGhhdmUgZGlmZmVyZW50Ci0gICAqIGhhc2ggY29kZXMuCi0gICAqCi0gICAqIEB3YXJuaW5nIEl0J3MgdmFsaWQgZm9yIG5vbi1lcXVhbCBvYmplY3RzIHRvIGhhdmUgdGhlIHNhbWUgaGFzaCBjb2RlLCBzbwotICAgKiAgIHRoaXMgdGVzdCBpcyBzdHJpY3RlciB0aGFuIGl0IG5lZWRzIHRvIGJlLiBIb3dldmVyLCB0aGlzIHNob3VsZCBoYXBwZW4KLSAgICogICByZWxhdGl2ZWx5IHJhcmVseS4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja05vdEVxdWFsKFVua25vd25GaWVsZFNldCBzMSwgVW5rbm93bkZpZWxkU2V0IHMyKSB7Ci0gICAgU3RyaW5nIGVxdWFsc0Vycm9yID0gU3RyaW5nLmZvcm1hdCgiJXMgc2hvdWxkIG5vdCBiZSBlcXVhbCB0byAlcyIsIHMxLCBzMik7Ci0gICAgYXNzZXJ0RmFsc2UoZXF1YWxzRXJyb3IsIHMxLmVxdWFscyhzMikpOwotICAgIGFzc2VydEZhbHNlKGVxdWFsc0Vycm9yLCBzMi5lcXVhbHMoczEpKTsKLQotICAgIGFzc2VydEZhbHNlKAotICAgICAgICBTdHJpbmcuZm9ybWF0KCIlcyBzaG91bGQgaGF2ZSBhIGRpZmZlcmVudCBoYXNoIGNvZGUgZnJvbSAlcyIsIHMxLCBzMiksCi0gICAgICAgIHMxLmhhc2hDb2RlKCkgPT0gczIuaGFzaENvZGUoKSk7Ci0gIH0KLQotICAvKioKLSAgICogQXNzZXJ0cyB0aGF0IHRoZSBnaXZlbiBmaWVsZCBzZXRzIGFyZSBlcXVhbCBhbmQgaGF2ZSBpZGVudGljYWwgaGFzaCBjb2Rlcy4KLSAgICovCi0gIHByaXZhdGUgdm9pZCBjaGVja0VxdWFsc0lzQ29uc2lzdGVudChVbmtub3duRmllbGRTZXQgc2V0KSB7Ci0gICAgLy8gT2JqZWN0IHNob3VsZCBiZSBlcXVhbCB0byBpdHNlbGYuCi0gICAgYXNzZXJ0RXF1YWxzKHNldCwgc2V0KTsKLQotICAgIC8vIE9iamVjdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBjb3B5IG9mIGl0c2VsZi4KLSAgICBVbmtub3duRmllbGRTZXQgY29weSA9IFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKHNldCkuYnVpbGQoKTsKLSAgICBhc3NlcnRFcXVhbHMoc2V0LCBjb3B5KTsKLSAgICBhc3NlcnRFcXVhbHMoY29weSwgc2V0KTsKLSAgICBhc3NlcnRFcXVhbHMoc2V0Lmhhc2hDb2RlKCksIGNvcHkuaGFzaENvZGUoKSk7Ci0gIH0KLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdFRlc3QuamF2YSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZWQ1ZDA2OS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3RUZXN0LmphdmEKKysrIC9kZXYvbnVsbApAQCAtMSwxNTIgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotcGFja2FnZSBjb20uZ29vZ2xlLnByb3RvYnVmOwotCi1pbXBvcnQganVuaXQuZnJhbWV3b3JrLlRlc3RDYXNlOwotCi1pbXBvcnQgamF2YS51dGlsLkl0ZXJhdG9yOwotaW1wb3J0IGphdmEudXRpbC5MaXN0SXRlcmF0b3I7Ci0KLS8qKgotICogVGVzdHMgZm9yIHtAbGluayBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdH0uCi0gKgotICogQGF1dGhvciBqb25wQGdvb2dsZS5jb20gKEpvbiBQZXJsb3cpCi0gKi8KLXB1YmxpYyBjbGFzcyBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdFRlc3QgZXh0ZW5kcyBUZXN0Q2FzZSB7Ci0KLSAgcHJpdmF0ZSBzdGF0aWMgU3RyaW5nIFNUUklOR19BID0gIkEiOwotICBwcml2YXRlIHN0YXRpYyBTdHJpbmcgU1RSSU5HX0IgPSAiQiI7Ci0gIHByaXZhdGUgc3RhdGljIFN0cmluZyBTVFJJTkdfQyA9ICJDIjsKLQotICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIEJZVEVfU1RSSU5HX0EgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiQSIpOwotICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIEJZVEVfU1RSSU5HX0IgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiQiIpOwotICBwcml2YXRlIHN0YXRpYyBCeXRlU3RyaW5nIEJZVEVfU1RSSU5HX0MgPSBCeXRlU3RyaW5nLmNvcHlGcm9tVXRmOCgiQyIpOwotCi0gIHB1YmxpYyB2b2lkIHRlc3RSZWFkT25seU1ldGhvZHMoKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCByYXdMaXN0ID0gY3JlYXRlU2FtcGxlTGlzdCgpOwotICAgIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0IGxpc3QgPSBuZXcgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QocmF3TGlzdCk7Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGxpc3Quc2l6ZSgpKTsKLSAgICBhc3NlcnRTYW1lKFNUUklOR19BLCBsaXN0LmdldCgwKSk7Ci0gICAgYXNzZXJ0U2FtZShTVFJJTkdfQiwgbGlzdC5nZXQoMSkpOwotICAgIGFzc2VydFNhbWUoU1RSSU5HX0MsIGxpc3QuZ2V0KDIpKTsKLSAgICBhc3NlcnRFcXVhbHMoQllURV9TVFJJTkdfQSwgbGlzdC5nZXRCeXRlU3RyaW5nKDApKTsKLSAgICBhc3NlcnRFcXVhbHMoQllURV9TVFJJTkdfQiwgbGlzdC5nZXRCeXRlU3RyaW5nKDEpKTsKLSAgICBhc3NlcnRFcXVhbHMoQllURV9TVFJJTkdfQywgbGlzdC5nZXRCeXRlU3RyaW5nKDIpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RNb2RpZnlNZXRob2RzKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKLSAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOwotCi0gICAgdHJ5IHsKLSAgICAgIGxpc3QucmVtb3ZlKDApOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5hZGQoU1RSSU5HX0IpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICAgIGFzc2VydEVxdWFscygzLCBsaXN0LnNpemUoKSk7Ci0KLSAgICB0cnkgewotICAgICAgbGlzdC5zZXQoMSwgU1RSSU5HX0IpOwotICAgICAgZmFpbCgpOwotICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgIC8vIGV4cGVjdGVkCi0gICAgfQotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdEl0ZXJhdG9yKCkgewotICAgIExhenlTdHJpbmdBcnJheUxpc3QgcmF3TGlzdCA9IGNyZWF0ZVNhbXBsZUxpc3QoKTsKLSAgICBVbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdCBsaXN0ID0gbmV3IFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0KHJhd0xpc3QpOwotCi0gICAgSXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5pdGVyYXRvcigpOwotICAgIGludCBjb3VudCA9IDA7Ci0gICAgd2hpbGUgKGl0ZXIuaGFzTmV4dCgpKSB7Ci0gICAgICBpdGVyLm5leHQoKTsKLSAgICAgIGNvdW50Kys7Ci0gICAgICB0cnkgewotICAgICAgICBpdGVyLnJlbW92ZSgpOwotICAgICAgICBmYWlsKCk7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgfQotICAgIGFzc2VydEVxdWFscygzLCBjb3VudCk7Ci0KLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RMaXN0SXRlcmF0b3IoKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCByYXdMaXN0ID0gY3JlYXRlU2FtcGxlTGlzdCgpOwotICAgIFVubW9kaWZpYWJsZUxhenlTdHJpbmdMaXN0IGxpc3QgPSBuZXcgVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QocmF3TGlzdCk7Ci0KLSAgICBMaXN0SXRlcmF0b3I8U3RyaW5nPiBpdGVyID0gbGlzdC5saXN0SXRlcmF0b3IoKTsKLSAgICBpbnQgY291bnQgPSAwOwotICAgIHdoaWxlIChpdGVyLmhhc05leHQoKSkgewotICAgICAgaXRlci5uZXh0KCk7Ci0gICAgICBjb3VudCsrOwotICAgICAgdHJ5IHsKLSAgICAgICAgaXRlci5yZW1vdmUoKTsKLSAgICAgICAgZmFpbCgpOwotICAgICAgfSBjYXRjaCAoVW5zdXBwb3J0ZWRPcGVyYXRpb25FeGNlcHRpb24gZSkgewotICAgICAgICAvLyBleHBlY3RlZAotICAgICAgfQotICAgICAgdHJ5IHsKLSAgICAgICAgaXRlci5zZXQoImJhciIpOwotICAgICAgICBmYWlsKCk7Ci0gICAgICB9IGNhdGNoIChVbnN1cHBvcnRlZE9wZXJhdGlvbkV4Y2VwdGlvbiBlKSB7Ci0gICAgICAgIC8vIGV4cGVjdGVkCi0gICAgICB9Ci0gICAgICB0cnkgewotICAgICAgICBpdGVyLmFkZCgiYmFyIik7Ci0gICAgICAgIGZhaWwoKTsKLSAgICAgIH0gY2F0Y2ggKFVuc3VwcG9ydGVkT3BlcmF0aW9uRXhjZXB0aW9uIGUpIHsKLSAgICAgICAgLy8gZXhwZWN0ZWQKLSAgICAgIH0KLSAgICB9Ci0gICAgYXNzZXJ0RXF1YWxzKDMsIGNvdW50KTsKLQotICB9Ci0KLSAgcHJpdmF0ZSBMYXp5U3RyaW5nQXJyYXlMaXN0IGNyZWF0ZVNhbXBsZUxpc3QoKSB7Ci0gICAgTGF6eVN0cmluZ0FycmF5TGlzdCByYXdMaXN0ID0gbmV3IExhenlTdHJpbmdBcnJheUxpc3QoKTsKLSAgICByYXdMaXN0LmFkZChTVFJJTkdfQSk7Ci0gICAgcmF3TGlzdC5hZGQoU1RSSU5HX0IpOwotICAgIHJhd0xpc3QuYWRkKFNUUklOR19DKTsKLSAgICByZXR1cm4gcmF3TGlzdDsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL1dpcmVGb3JtYXRUZXN0LmphdmEgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdFRlc3QuamF2YQpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNWVhMWRkNi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvV2lyZUZvcm1hdFRlc3QuamF2YQorKysgL2Rldi9udWxsCkBAIC0xLDQyNyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi1wYWNrYWdlIGNvbS5nb29nbGUucHJvdG9idWY7Ci0KLWltcG9ydCBqdW5pdC5mcmFtZXdvcmsuVGVzdENhc2U7Ci0KLWltcG9ydCBqYXZhLmlvLkJ5dGVBcnJheUlucHV0U3RyZWFtOwotaW1wb3J0IGphdmEuaW8uQnl0ZUFycmF5T3V0cHV0U3RyZWFtOwotCi1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90bzsKLWltcG9ydCBwcm90b2J1Zl91bml0dGVzdC5Vbml0dGVzdFByb3RvLlRlc3RBbGxFeHRlbnNpb25zOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEFsbFR5cGVzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdEZpZWxkT3JkZXJpbmdzOwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0UHJvdG8uVGVzdFBhY2tlZEV4dGVuc2lvbnM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RQcm90by5UZXN0UGFja2VkVHlwZXM7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0OwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5SYXdNZXNzYWdlU2V0OwotaW1wb3J0IHByb3RvYnVmX3VuaXR0ZXN0LlVuaXR0ZXN0TXNldC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE7Ci1pbXBvcnQgcHJvdG9idWZfdW5pdHRlc3QuVW5pdHRlc3RNc2V0LlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMjsKLWltcG9ydCBjb20uZ29vZ2xlLnByb3RvYnVmLlVuaXR0ZXN0TGl0ZS5UZXN0QWxsRXh0ZW5zaW9uc0xpdGU7Ci1pbXBvcnQgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbml0dGVzdExpdGUuVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlOwotCi0vKioKLSAqIFRlc3RzIHJlbGF0ZWQgdG8gcGFyc2luZyBhbmQgc2VyaWFsaXphdGlvbi4KLSAqCi0gKiBAYXV0aG9yIGtlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpCi0gKi8KLXB1YmxpYyBjbGFzcyBXaXJlRm9ybWF0VGVzdCBleHRlbmRzIFRlc3RDYXNlIHsKLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6YXRpb24oKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotCi0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRQYWNrZWRTZXQoKTsKLQotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcy5zaXplKCksIG1lc3NhZ2UuZ2V0U2VyaWFsaXplZFNpemUoKSk7Ci0KLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZTIgPSBUZXN0UGFja2VkVHlwZXMucGFyc2VGcm9tKHJhd0J5dGVzKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9ucygpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCi0gICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbEV4dGVuc2lvbnMgdGhlbiBwYXJzZSBpdCBhcyBUZXN0QWxsVHlwZXMKLSAgICAvLyBpdCBzaG91bGQgd29yay4KLQotICAgIFRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRBbGxFeHRlbnNpb25zU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdFBhY2tlZFR5cGVzIGFuZCBUZXN0UGFja2VkRXh0ZW5zaW9ucyBzaG91bGQgaGF2ZSBjb21wYXRpYmxlIHdpcmUKLSAgICAvLyBmb3JtYXRzOyBjaGVjayB0aGF0IHRoZXkgc2VyaWFsaXplIHRvIHRoZSBzYW1lIHN0cmluZy4KLSAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0UGFja2VkRXh0ZW5zaW9uc1NldCgpOwotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotCi0gICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlczIgPSBtZXNzYWdlMi50b0J5dGVTdHJpbmcoKTsKLQotICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemF0aW9uUGFja2VkV2l0aG91dEdldFNlcmlhbGl6ZWRTaXplKCkKLSAgICAgIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFdyaXRlIGRpcmVjdGx5IHRvIGFuIE91dHB1dFN0cmVhbSwgd2l0aG91dCBpbnZva2luZyBnZXRTZXJpYWxpemVkU2l6ZSgpCi0gICAgLy8gVGhpcyB1c2VkIHRvIGJlIGEgYnVnIHdoZXJlIHRoZSBzaXplIG9mIGEgcGFja2VkIGZpZWxkIHdhcyBpbmNvcnJlY3QsCi0gICAgLy8gc2luY2UgZ2V0U2VyaWFsaXplZFNpemUoKSB3YXMgbmV2ZXIgaW52b2tlZC4KLSAgICBUZXN0UGFja2VkVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldFBhY2tlZFNldCgpOwotCi0gICAgLy8gRGlyZWN0bHkgY29uc3RydWN0IGEgQ29kZWRPdXRwdXRTdHJlYW0gYXJvdW5kIHRoZSBhY3R1YWwgT3V0cHV0U3RyZWFtLAotICAgIC8vIGluIGNhc2Ugd3JpdGVUbyhPdXRwdXRTdHJlYW0gb3V0cHV0KSBpbnZva2VzIGdldFNlcmlhbGl6ZWRTaXplKCk7Ci0gICAgQnl0ZUFycmF5T3V0cHV0U3RyZWFtIG91dHB1dFN0cmVhbSA9IG5ldyBCeXRlQXJyYXlPdXRwdXRTdHJlYW0oKTsKLSAgICBDb2RlZE91dHB1dFN0cmVhbSBjb2RlZE91dHB1dCA9IENvZGVkT3V0cHV0U3RyZWFtLm5ld0luc3RhbmNlKG91dHB1dFN0cmVhbSk7Ci0KLSAgICBtZXNzYWdlLndyaXRlVG8oY29kZWRPdXRwdXQpOwotCi0gICAgY29kZWRPdXRwdXQuZmx1c2goKTsKLQotICAgIFRlc3RQYWNrZWRUeXBlcyBtZXNzYWdlMiA9IFRlc3RQYWNrZWRUeXBlcy5wYXJzZUZyb20oCi0gICAgICAgIG91dHB1dFN0cmVhbS50b0J5dGVBcnJheSgpKTsKLQotICAgIFRlc3RVdGlsLmFzc2VydFBhY2tlZEZpZWxkc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplRXh0ZW5zaW9uc0xpdGUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0QWxsVHlwZXMgYW5kIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZSBmb3JtYXRzLAotICAgIC8vIHNvIGlmIHdlIHNlcmlhbGl6ZSBhIFRlc3RBbGxFeHRlbnNpb25zIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbFR5cGVzCi0gICAgLy8gaXQgc2hvdWxkIHdvcmsuCi0KLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbExpdGVFeHRlbnNpb25zU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0gICAgYXNzZXJ0RXF1YWxzKHJhd0J5dGVzLnNpemUoKSwgbWVzc2FnZS5nZXRTZXJpYWxpemVkU2l6ZSgpKTsKLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlMiA9IFRlc3RBbGxUeXBlcy5wYXJzZUZyb20ocmF3Qnl0ZXMpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RTZXJpYWxpemVQYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3RQYWNrZWRUeXBlcyBhbmQgVGVzdFBhY2tlZEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlCi0gICAgLy8gZm9ybWF0czsgY2hlY2sgdGhhdCB0aGV5IHNlcmlhbGl6ZSB0byB0aGUgc2FtZSBzdHJpbmcuCi0gICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpOwotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotCi0gICAgVGVzdFBhY2tlZFR5cGVzIG1lc3NhZ2UyID0gVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlczIgPSBtZXNzYWdlMi50b0J5dGVTdHJpbmcoKTsKLQotICAgIGFzc2VydEVxdWFscyhyYXdCeXRlcywgcmF3Qnl0ZXMyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZUV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBUZXN0QWxsVHlwZXMgYW5kIFRlc3RBbGxFeHRlbnNpb25zIHNob3VsZCBoYXZlIGNvbXBhdGlibGUgd2lyZSBmb3JtYXRzLAotICAgIC8vIHNvIGlmIHdlIHNlcmlhbGl6ZSBhIFRlc3RBbGxUeXBlcyB0aGVuIHBhcnNlIGl0IGFzIFRlc3RBbGxFeHRlbnNpb25zCi0gICAgLy8gaXQgc2hvdWxkIHdvcmsuCi0KLSAgICBUZXN0QWxsVHlwZXMgbWVzc2FnZSA9IFRlc3RVdGlsLmdldEFsbFNldCgpOwotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotCi0gICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVnaXN0cnkgPSBUZXN0VXRpbC5nZXRFeHRlbnNpb25SZWdpc3RyeSgpOwotCi0gICAgVGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTIgPQotICAgICAgVGVzdEFsbEV4dGVuc2lvbnMucGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZVBhY2tlZEV4dGVuc2lvbnMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBFbnN1cmUgdGhhdCBwYWNrZWQgZXh0ZW5zaW9ucyBjYW4gYmUgcHJvcGVybHkgcGFyc2VkLgotICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRQYWNrZWRFeHRlbnNpb25zU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgICBUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlMiA9Ci0gICAgICAgIFRlc3RQYWNrZWRFeHRlbnNpb25zLnBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFRlc3RBbGxUeXBlcyBhbmQgVGVzdEFsbEV4dGVuc2lvbnMgc2hvdWxkIGhhdmUgY29tcGF0aWJsZSB3aXJlIGZvcm1hdHMsCi0gICAgLy8gc28gaWYgd2Ugc2VyaWFsaXplIGEgVGVzdEFsbFR5cGVzIHRoZW4gcGFyc2UgaXQgYXMgVGVzdEFsbEV4dGVuc2lvbnMKLSAgICAvLyBpdCBzaG91bGQgd29yay4KLQotICAgIFRlc3RBbGxUeXBlcyBtZXNzYWdlID0gVGVzdFV0aWwuZ2V0QWxsU2V0KCk7Ci0gICAgQnl0ZVN0cmluZyByYXdCeXRlcyA9IG1lc3NhZ2UudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICBFeHRlbnNpb25SZWdpc3RyeUxpdGUgcmVnaXN0cnlfbGl0ZSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSgpOwotCi0gICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UyID0KLSAgICAgIFRlc3RBbGxFeHRlbnNpb25zTGl0ZS5wYXJzZUZyb20ocmF3Qnl0ZXMsIHJlZ2lzdHJ5X2xpdGUpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Ci0KLSAgICAvLyBUcnkgYWdhaW4gdXNpbmcgYSBmdWxsIGV4dGVuc2lvbiByZWdpc3RyeS4KLSAgICBFeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9IFRlc3RVdGlsLmdldEV4dGVuc2lvblJlZ2lzdHJ5KCk7Ci0KLSAgICBUZXN0QWxsRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZTMgPQotICAgICAgVGVzdEFsbEV4dGVuc2lvbnNMaXRlLnBhcnNlRnJvbShyYXdCeXRlcywgcmVnaXN0cnkpOwotCi0gICAgVGVzdFV0aWwuYXNzZXJ0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMyk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VQYWNrZWRFeHRlbnNpb25zTGl0ZSgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIEVuc3VyZSB0aGF0IHBhY2tlZCBleHRlbnNpb25zIGNhbiBiZSBwcm9wZXJseSBwYXJzZWQuCi0gICAgVGVzdFBhY2tlZEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UgPSBUZXN0VXRpbC5nZXRMaXRlUGFja2VkRXh0ZW5zaW9uc1NldCgpOwotICAgIEJ5dGVTdHJpbmcgcmF3Qnl0ZXMgPSBtZXNzYWdlLnRvQnl0ZVN0cmluZygpOwotCi0gICAgRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIHJlZ2lzdHJ5ID0gVGVzdFV0aWwuZ2V0RXh0ZW5zaW9uUmVnaXN0cnlMaXRlKCk7Ci0KLSAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZTIgPQotICAgICAgICBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUucGFyc2VGcm9tKHJhd0J5dGVzLCByZWdpc3RyeSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RFeHRlbnNpb25zU2VyaWFsaXplZFNpemUoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBhc3NlcnRFcXVhbHMoVGVzdFV0aWwuZ2V0QWxsU2V0KCkuZ2V0U2VyaWFsaXplZFNpemUoKSwKLSAgICAgICAgICAgICAgICAgVGVzdFV0aWwuZ2V0QWxsRXh0ZW5zaW9uc1NldCgpLmdldFNlcmlhbGl6ZWRTaXplKCkpOwotICB9Ci0KLSAgcHVibGljIHZvaWQgdGVzdFNlcmlhbGl6ZURlbGltaXRlZCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIEJ5dGVBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQgPSBuZXcgQnl0ZUFycmF5T3V0cHV0U3RyZWFtKCk7Ci0gICAgVGVzdFV0aWwuZ2V0QWxsU2V0KCkud3JpdGVEZWxpbWl0ZWRUbyhvdXRwdXQpOwotICAgIG91dHB1dC53cml0ZSgxMik7Ci0gICAgVGVzdFV0aWwuZ2V0UGFja2VkU2V0KCkud3JpdGVEZWxpbWl0ZWRUbyhvdXRwdXQpOwotICAgIG91dHB1dC53cml0ZSgzNCk7Ci0KLSAgICBCeXRlQXJyYXlJbnB1dFN0cmVhbSBpbnB1dCA9IG5ldyBCeXRlQXJyYXlJbnB1dFN0cmVhbShvdXRwdXQudG9CeXRlQXJyYXkoKSk7Ci0KLSAgICBUZXN0VXRpbC5hc3NlcnRBbGxGaWVsZHNTZXQoVGVzdEFsbFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkpOwotICAgIGFzc2VydEVxdWFscygxMiwgaW5wdXQucmVhZCgpKTsKLSAgICBUZXN0VXRpbC5hc3NlcnRQYWNrZWRGaWVsZHNTZXQoVGVzdFBhY2tlZFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkpOwotICAgIGFzc2VydEVxdWFscygzNCwgaW5wdXQucmVhZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoLTEsIGlucHV0LnJlYWQoKSk7Ci0KLSAgICAvLyBXZSdyZSBhdCBFT0YsIHNvIHBhcnNpbmcgYWdhaW4gc2hvdWxkIHJldHVybiBudWxsLgotICAgIGFzc2VydFRydWUoVGVzdEFsbFR5cGVzLnBhcnNlRGVsaW1pdGVkRnJvbShpbnB1dCkgPT0gbnVsbCk7Ci0gIH0KLQotICBwcml2YXRlIHZvaWQgYXNzZXJ0RmllbGRzSW5PcmRlcihCeXRlU3RyaW5nIGRhdGEpIHRocm93cyBFeGNlcHRpb24gewotICAgIENvZGVkSW5wdXRTdHJlYW0gaW5wdXQgPSBkYXRhLm5ld0NvZGVkSW5wdXQoKTsKLSAgICBpbnQgcHJldmlvdXNUYWcgPSAwOwotCi0gICAgd2hpbGUgKHRydWUpIHsKLSAgICAgIGludCB0YWcgPSBpbnB1dC5yZWFkVGFnKCk7Ci0gICAgICBpZiAodGFnID09IDApIHsKLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGFzc2VydFRydWUodGFnID4gcHJldmlvdXNUYWcpOwotICAgICAgcHJldmlvdXNUYWcgPSB0YWc7Ci0gICAgICBpbnB1dC5za2lwRmllbGQodGFnKTsKLSAgICB9Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0SW50ZXJsZWF2ZWRGaWVsZHNBbmRFeHRlbnNpb25zKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gVGVzdHMgdGhhdCBmaWVsZHMgYXJlIHdyaXR0ZW4gaW4gb3JkZXIgZXZlbiB3aGVuIGV4dGVuc2lvbiByYW5nZXMKLSAgICAvLyBhcmUgaW50ZXJsZWF2ZWQgd2l0aCBmaWVsZCBudW1iZXJzLgotICAgIEJ5dGVTdHJpbmcgZGF0YSA9Ci0gICAgICBUZXN0RmllbGRPcmRlcmluZ3MubmV3QnVpbGRlcigpCi0gICAgICAgIC5zZXRNeUludCgxKQotICAgICAgICAuc2V0TXlTdHJpbmcoImZvbyIpCi0gICAgICAgIC5zZXRNeUZsb2F0KDEuMEYpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5teUV4dGVuc2lvbkludCwgMjMpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZywgImJhciIpCi0gICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotICAgIGFzc2VydEZpZWxkc0luT3JkZXIoZGF0YSk7Ci0KLSAgICBEZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IgPSBUZXN0RmllbGRPcmRlcmluZ3MuZ2V0RGVzY3JpcHRvcigpOwotICAgIEJ5dGVTdHJpbmcgZHluYW1pY19kYXRhID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzLmdldERlc2NyaXB0b3IoKSkKLSAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9pbnQiKSwgMUwpCi0gICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfc3RyaW5nIiksICJmb28iKQotICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X2Zsb2F0IiksIDEuMEYpCi0gICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50LmdldERlc2NyaXB0b3IoKSwgMjMpCi0gICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uU3RyaW5nLmdldERlc2NyaXB0b3IoKSwgImJhciIpCi0gICAgICAgIC5idWlsZCgpLnRvQnl0ZVN0cmluZygpOwotICAgIGFzc2VydEZpZWxkc0luT3JkZXIoZHluYW1pY19kYXRhKTsKLSAgfQotCi0gIHByaXZhdGUgRXh0ZW5zaW9uUmVnaXN0cnkgZ2V0VGVzdEZpZWxkT3JkZXJpbmdzUmVnaXN0cnkoKSB7Ci0gICAgRXh0ZW5zaW9uUmVnaXN0cnkgcmVzdWx0ID0gRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTsKLSAgICByZXN1bHQuYWRkKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25JbnQpOwotICAgIHJlc3VsdC5hZGQoVW5pdHRlc3RQcm90by5teUV4dGVuc2lvblN0cmluZyk7Ci0gICAgcmV0dXJuIHJlc3VsdDsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzKCkgdGhyb3dzIEV4Y2VwdGlvbiB7Ci0gICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBwYXJzZSBhIG1lc3NhZ2UgdGhhdCBjb250YWlucyBtdWx0aXBsZSBleHRlbnNpb25zCi0gICAgLy8gcmFuZ2VzLgotICAgIFRlc3RGaWVsZE9yZGVyaW5ncyBzb3VyY2UgPQotICAgICAgVGVzdEZpZWxkT3JkZXJpbmdzLm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0TXlJbnQoMSkKLSAgICAgICAgLnNldE15U3RyaW5nKCJmb28iKQotICAgICAgICAuc2V0TXlGbG9hdCgxLjBGKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25JbnQsIDIzKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKFVuaXR0ZXN0UHJvdG8ubXlFeHRlbnNpb25TdHJpbmcsICJiYXIiKQotICAgICAgICAuYnVpbGQoKTsKLSAgICBUZXN0RmllbGRPcmRlcmluZ3MgZGVzdCA9Ci0gICAgICBUZXN0RmllbGRPcmRlcmluZ3MucGFyc2VGcm9tKHNvdXJjZS50b0J5dGVTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0VGVzdEZpZWxkT3JkZXJpbmdzUmVnaXN0cnkoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKHNvdXJjZSwgZGVzdCk7Ci0gIH0KLQotICBwdWJsaWMgdm9pZCB0ZXN0UGFyc2VNdWx0aXBsZUV4dGVuc2lvblJhbmdlc0R5bmFtaWMoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICAvLyBTYW1lIGFzIGFib3ZlIGV4Y2VwdCB3aXRoIER5bmFtaWNNZXNzYWdlLgotICAgIERlc2NyaXB0b3JzLkRlc2NyaXB0b3IgZGVzY3JpcHRvciA9IFRlc3RGaWVsZE9yZGVyaW5ncy5nZXREZXNjcmlwdG9yKCk7Ci0gICAgRHluYW1pY01lc3NhZ2Ugc291cmNlID0KLSAgICAgIER5bmFtaWNNZXNzYWdlLm5ld0J1aWxkZXIoVGVzdEZpZWxkT3JkZXJpbmdzLmdldERlc2NyaXB0b3IoKSkKLSAgICAgICAgLnNldEZpZWxkKGRlc2NyaXB0b3IuZmluZEZpZWxkQnlOYW1lKCJteV9pbnQiKSwgMUwpCi0gICAgICAgIC5zZXRGaWVsZChkZXNjcmlwdG9yLmZpbmRGaWVsZEJ5TmFtZSgibXlfc3RyaW5nIiksICJmb28iKQotICAgICAgICAuc2V0RmllbGQoZGVzY3JpcHRvci5maW5kRmllbGRCeU5hbWUoIm15X2Zsb2F0IiksIDEuMEYpCi0gICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uSW50LmdldERlc2NyaXB0b3IoKSwgMjMpCi0gICAgICAgIC5zZXRGaWVsZChVbml0dGVzdFByb3RvLm15RXh0ZW5zaW9uU3RyaW5nLmdldERlc2NyaXB0b3IoKSwgImJhciIpCi0gICAgICAgIC5idWlsZCgpOwotICAgIER5bmFtaWNNZXNzYWdlIGRlc3QgPQotICAgICAgRHluYW1pY01lc3NhZ2UucGFyc2VGcm9tKGRlc2NyaXB0b3IsIHNvdXJjZS50b0J5dGVTdHJpbmcoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRUZXN0RmllbGRPcmRlcmluZ3NSZWdpc3RyeSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoc291cmNlLCBkZXN0KTsKLSAgfQotCi0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBVTktOT1dOX1RZUEVfSUQgPSAxNTUwMDU1OwotICBwcml2YXRlIHN0YXRpYyBmaW5hbCBpbnQgVFlQRV9JRF8xID0KLSAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEuZ2V0RGVzY3JpcHRvcigpLmdldEV4dGVuc2lvbnMoKS5nZXQoMCkuZ2V0TnVtYmVyKCk7Ci0gIHByaXZhdGUgc3RhdGljIGZpbmFsIGludCBUWVBFX0lEXzIgPQotICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5nZXREZXNjcmlwdG9yKCkuZ2V0RXh0ZW5zaW9ucygpLmdldCgwKS5nZXROdW1iZXIoKTsKLQotICBwdWJsaWMgdm9pZCB0ZXN0U2VyaWFsaXplTWVzc2FnZVNldCgpIHRocm93cyBFeGNlcHRpb24gewotICAgIC8vIFNldCB1cCBhIFRlc3RNZXNzYWdlU2V0IHdpdGggdHdvIGtub3duIG1lc3NhZ2VzIGFuZCBhbiB1bmtub3duIG9uZS4KLSAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KLSAgICAgIFRlc3RNZXNzYWdlU2V0Lm5ld0J1aWxkZXIoKQotICAgICAgICAuc2V0RXh0ZW5zaW9uKAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uLAotICAgICAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5uZXdCdWlsZGVyKCkuc2V0SSgxMjMpLmJ1aWxkKCkpCi0gICAgICAgIC5zZXRFeHRlbnNpb24oCi0gICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24sCi0gICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm5ld0J1aWxkZXIoKS5zZXRTdHIoImZvbyIpLmJ1aWxkKCkpCi0gICAgICAgIC5zZXRVbmtub3duRmllbGRzKAotICAgICAgICAgIFVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgIC5hZGRGaWVsZChVTktOT1dOX1RZUEVfSUQsCi0gICAgICAgICAgICAgIFVua25vd25GaWVsZFNldC5GaWVsZC5uZXdCdWlsZGVyKCkKLSAgICAgICAgICAgICAgICAuYWRkTGVuZ3RoRGVsaW1pdGVkKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJiYXIiKSkKLSAgICAgICAgICAgICAgICAuYnVpbGQoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IG1lc3NhZ2VTZXQudG9CeXRlU3RyaW5nKCk7Ci0KLSAgICAvLyBQYXJzZSBiYWNrIHVzaW5nIFJhd01lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KLSAgICBSYXdNZXNzYWdlU2V0IHJhdyA9IFJhd01lc3NhZ2VTZXQucGFyc2VGcm9tKGRhdGEpOwotCi0gICAgYXNzZXJ0VHJ1ZShyYXcuZ2V0VW5rbm93bkZpZWxkcygpLmFzTWFwKCkuaXNFbXB0eSgpKTsKLQotICAgIGFzc2VydEVxdWFscygzLCByYXcuZ2V0SXRlbUNvdW50KCkpOwotICAgIGFzc2VydEVxdWFscyhUWVBFX0lEXzEsIHJhdy5nZXRJdGVtKDApLmdldFR5cGVJZCgpKTsKLSAgICBhc3NlcnRFcXVhbHMoVFlQRV9JRF8yLCByYXcuZ2V0SXRlbSgxKS5nZXRUeXBlSWQoKSk7Ci0gICAgYXNzZXJ0RXF1YWxzKFVOS05PV05fVFlQRV9JRCwgcmF3LmdldEl0ZW0oMikuZ2V0VHlwZUlkKCkpOwotCi0gICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2UxID0KLSAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5wYXJzZUZyb20oCi0gICAgICAgIHJhdy5nZXRJdGVtKDApLmdldE1lc3NhZ2UoKS50b0J5dGVBcnJheSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlMS5nZXRJKCkpOwotCi0gICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2UyID0KLSAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5wYXJzZUZyb20oCi0gICAgICAgIHJhdy5nZXRJdGVtKDEpLmdldE1lc3NhZ2UoKS50b0J5dGVBcnJheSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImZvbyIsIG1lc3NhZ2UyLmdldFN0cigpKTsKLQotICAgIGFzc2VydEVxdWFscygiYmFyIiwgcmF3LmdldEl0ZW0oMikuZ2V0TWVzc2FnZSgpLnRvU3RyaW5nVXRmOCgpKTsKLSAgfQotCi0gIHB1YmxpYyB2b2lkIHRlc3RQYXJzZU1lc3NhZ2VTZXQoKSB0aHJvd3MgRXhjZXB0aW9uIHsKLSAgICBFeHRlbnNpb25SZWdpc3RyeSBleHRlbnNpb25SZWdpc3RyeSA9IEV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7Ci0gICAgZXh0ZW5zaW9uUmVnaXN0cnkuYWRkKFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKTsKLSAgICBleHRlbnNpb25SZWdpc3RyeS5hZGQoVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yLm1lc3NhZ2VTZXRFeHRlbnNpb24pOwotCi0gICAgLy8gU2V0IHVwIGEgUmF3TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCi0gICAgUmF3TWVzc2FnZVNldCByYXcgPQotICAgICAgUmF3TWVzc2FnZVNldC5uZXdCdWlsZGVyKCkKLSAgICAgICAgLmFkZEl0ZW0oCi0gICAgICAgICAgUmF3TWVzc2FnZVNldC5JdGVtLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgLnNldFR5cGVJZChUWVBFX0lEXzEpCi0gICAgICAgICAgICAuc2V0TWVzc2FnZSgKLSAgICAgICAgICAgICAgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xLm5ld0J1aWxkZXIoKQotICAgICAgICAgICAgICAgIC5zZXRJKDEyMykKLSAgICAgICAgICAgICAgICAuYnVpbGQoKS50b0J5dGVTdHJpbmcoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYWRkSXRlbSgKLSAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0VHlwZUlkKFRZUEVfSURfMikKLSAgICAgICAgICAgIC5zZXRNZXNzYWdlKAotICAgICAgICAgICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAgICAgLnNldFN0cigiZm9vIikKLSAgICAgICAgICAgICAgICAuYnVpbGQoKS50b0J5dGVTdHJpbmcoKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYWRkSXRlbSgKLSAgICAgICAgICBSYXdNZXNzYWdlU2V0Lkl0ZW0ubmV3QnVpbGRlcigpCi0gICAgICAgICAgICAuc2V0VHlwZUlkKFVOS05PV05fVFlQRV9JRCkKLSAgICAgICAgICAgIC5zZXRNZXNzYWdlKEJ5dGVTdHJpbmcuY29weUZyb21VdGY4KCJiYXIiKSkKLSAgICAgICAgICAgIC5idWlsZCgpKQotICAgICAgICAuYnVpbGQoKTsKLQotICAgIEJ5dGVTdHJpbmcgZGF0YSA9IHJhdy50b0J5dGVTdHJpbmcoKTsKLQotICAgIC8vIFBhcnNlIGFzIGEgVGVzdE1lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KLSAgICBUZXN0TWVzc2FnZVNldCBtZXNzYWdlU2V0ID0KLSAgICAgIFRlc3RNZXNzYWdlU2V0LnBhcnNlRnJvbShkYXRhLCBleHRlbnNpb25SZWdpc3RyeSk7Ci0KLSAgICBhc3NlcnRFcXVhbHMoMTIzLCBtZXNzYWdlU2V0LmdldEV4dGVuc2lvbigKLSAgICAgIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMS5tZXNzYWdlU2V0RXh0ZW5zaW9uKS5nZXRJKCkpOwotICAgIGFzc2VydEVxdWFscygiZm9vIiwgbWVzc2FnZVNldC5nZXRFeHRlbnNpb24oCi0gICAgICBUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIubWVzc2FnZVNldEV4dGVuc2lvbikuZ2V0U3RyKCkpOwotCi0gICAgLy8gQ2hlY2sgZm9yIHVua25vd24gZmllbGQgd2l0aCB0eXBlIExFTkdUSF9ERUxJTUlURUQsCi0gICAgLy8gICBudW1iZXIgVU5LTk9XTl9UWVBFX0lELCBhbmQgY29udGVudHMgImJhciIuCi0gICAgVW5rbm93bkZpZWxkU2V0IHVua25vd25GaWVsZHMgPSBtZXNzYWdlU2V0LmdldFVua25vd25GaWVsZHMoKTsKLSAgICBhc3NlcnRFcXVhbHMoMSwgdW5rbm93bkZpZWxkcy5hc01hcCgpLnNpemUoKSk7Ci0gICAgYXNzZXJ0VHJ1ZSh1bmtub3duRmllbGRzLmhhc0ZpZWxkKFVOS05PV05fVFlQRV9JRCkpOwotCi0gICAgVW5rbm93bkZpZWxkU2V0LkZpZWxkIGZpZWxkID0gdW5rbm93bkZpZWxkcy5nZXRGaWVsZChVTktOT1dOX1RZUEVfSUQpOwotICAgIGFzc2VydEVxdWFscygxLCBmaWVsZC5nZXRMZW5ndGhEZWxpbWl0ZWRMaXN0KCkuc2l6ZSgpKTsKLSAgICBhc3NlcnRFcXVhbHMoImJhciIsIGZpZWxkLmdldExlbmd0aERlbGltaXRlZExpc3QoKS5nZXQoMCkudG9TdHJpbmdVdGY4KCkpOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbXVsdGlwbGVfZmlsZXNfdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5YTA0MDE0Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9tdWx0aXBsZV9maWxlc190ZXN0LnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNzEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKQotLy8KLS8vIEEgcHJvdG8gZmlsZSB3aGljaCB0ZXN0cyB0aGUgamF2YV9tdWx0aXBsZV9maWxlcyBvcHRpb24uCi0KLQotLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgotLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKLW9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKLQotaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8iOwotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1vcHRpb24gamF2YV9tdWx0aXBsZV9maWxlcyA9IHRydWU7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiTXVsdGlwbGVGaWxlc1Rlc3RQcm90byI7Ci0KLW1lc3NhZ2UgTWVzc2FnZVdpdGhOb091dGVyIHsKLSAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHsKLSAgICBvcHRpb25hbCBpbnQzMiBpID0gMTsKLSAgfQotICBlbnVtIE5lc3RlZEVudW0gewotICAgIEJBWiA9IDM7Ci0gIH0KLSAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBuZXN0ZWQgPSAxOwotICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZm9yZWlnbiA9IDI7Ci0gIG9wdGlvbmFsIE5lc3RlZEVudW0gbmVzdGVkX2VudW0gPSAzOwotICBvcHRpb25hbCBFbnVtV2l0aE5vT3V0ZXIgZm9yZWlnbl9lbnVtID0gNDsKLX0KLQotZW51bSBFbnVtV2l0aE5vT3V0ZXIgewotICBGT08gPSAxOwotICBCQVIgPSAyOwotfQotCi1zZXJ2aWNlIFNlcnZpY2VXaXRoTm9PdXRlciB7Ci0gIHJwYyBGb28oTWVzc2FnZVdpdGhOb091dGVyKSByZXR1cm5zKFRlc3RBbGxUeXBlcyk7Ci19Ci0KLWV4dGVuZCBUZXN0QWxsRXh0ZW5zaW9ucyB7Ci0gIG9wdGlvbmFsIGludDMyIGV4dGVuc2lvbl93aXRoX291dGVyID0gMTIzNDU2NzsKLX0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfYnVpbGRlcnNfdGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfYnVpbGRlcnNfdGVzdC5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYWJmZmI5ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2J1aWxkZXJzX3Rlc3QucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw1MyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLS8vCi0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBqYXZhX211bHRpcGxlX2ZpbGVzID0gdHJ1ZTsKLW9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJOZXN0ZWRCdWlsZGVycyI7Ci0KLQotbWVzc2FnZSBWZWhpY2xlIHsKLSAgb3B0aW9uYWwgRW5naW5lIGVuZ2luZSA9IDE7Ci0gIHJlcGVhdGVkIFdoZWVsIHdoZWVsID0gMjsKLX0KLQotbWVzc2FnZSBFbmdpbmUgewotICBvcHRpb25hbCBpbnQzMiBjeWxpbmRlciA9IDE7Ci0gIG9wdGlvbmFsIGludDMyIGxpdGVycyA9IDI7Ci19Ci0KLW1lc3NhZ2UgV2hlZWwgewotICBvcHRpb25hbCBpbnQzMiByYWRpdXMgPSAxOwotICBvcHRpb25hbCBpbnQzMiB3aWR0aCA9IDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbmVzdGVkX2V4dGVuc2lvbi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA5ZmU1ZDU2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDUgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCi0vLwotLy8gQSBwcm90byBmaWxlIHdpdGggbmVzdGVkIGV4dGVuc2lvbnMuIE5vdGUgdGhhdCB0aGlzIG11c3QgYmUgZGVmaW5lZCBpbgotLy8gYSBzZXBhcmF0ZSBmaWxlIHRvIHByb3Blcmx5IHRlc3QgdGhlIGluaXRpYWxpemF0aW9uIG9mIHRoZSBvdXRlciBjbGFzcy4KLQotCi1pbXBvcnQgImNvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8iOwotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1tZXNzYWdlIE15TmVzdGVkRXh0ZW5zaW9uIHsKLSAgZXh0ZW5kIE1lc3NhZ2VUb0JlRXh0ZW5kZWQgewotICAgIG9wdGlvbmFsIE1lc3NhZ2VUb0JlRXh0ZW5kZWQgcmVjdXJzaXZlRXh0ZW5zaW9uID0gMjsKLSAgfQotfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9uZXN0ZWRfZXh0ZW5zaW9uX2xpdGUucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDE2ZWU0NmUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDQ4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogRGFyaWNrIFRvbmcgKGRhcmlja0Bnb29nbGUuY29tKQotLy8KLS8vIEEgcHJvdG8gZmlsZSB3aXRoIG5lc3RlZCBleHRlbnNpb25zIGZvciBhIE1lc3NhZ2VMaXRlIG1lc3NhZ2VzLiBOb3RlIHRoYXQKLS8vIHRoaXMgbXVzdCBiZSBkZWZpbmVkIGluIGEgc2VwYXJhdGUgZmlsZSB0byBwcm9wZXJseSB0ZXN0IHRoZSBpbml0aWFsaXphdGlvbgotLy8gb2YgdGhlIG91dGVyIGNsYXNzLgotCi0KLXBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7Ci0KLW9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUU7Ci0KLWltcG9ydCAiY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvIjsKLQotbWVzc2FnZSBNeU5lc3RlZEV4dGVuc2lvbkxpdGUgewotICBleHRlbmQgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQgewotICAgIG9wdGlvbmFsIE1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkIHJlY3Vyc2l2ZUV4dGVuc2lvbkxpdGUgPSAzOwotICB9Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb24ucHJvdG8KZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY2MWI0MTkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2phdmEvc3JjL3Rlc3QvamF2YS9jb20vZ29vZ2xlL3Byb3RvYnVmL25vbl9uZXN0ZWRfZXh0ZW5zaW9uLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNDggKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCi0vLwotLy8gQSBwcm90byBmaWxlIHdpdGggZXh0ZW5zaW9ucy4KLQotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1tZXNzYWdlIE1lc3NhZ2VUb0JlRXh0ZW5kZWQgewotICBleHRlbnNpb25zIDEgdG8gbWF4OwotfQotCi1tZXNzYWdlIE15Tm9uTmVzdGVkRXh0ZW5zaW9uIHsKLX0KLQotZXh0ZW5kIE1lc3NhZ2VUb0JlRXh0ZW5kZWQgewotICBvcHRpb25hbCBNeU5vbk5lc3RlZEV4dGVuc2lvbiBub25OZXN0ZWRFeHRlbnNpb24gPSAxOwotfQotCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvbm9uX25lc3RlZF9leHRlbnNpb25fbGl0ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAzYzgyNjU5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi9ub25fbmVzdGVkX2V4dGVuc2lvbl9saXRlLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTAgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBEYXJpY2sgVG9uZyAoZGFyaWNrQGdvb2dsZS5jb20pCi0vLwotLy8gQSBwcm90byBmaWxlIHdpdGggZXh0ZW5zaW9ucyBmb3IgYSBNZXNzYWdlTGl0ZSBtZXNzYWdlcy4KLQotCi1wYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OwotCi1vcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOwotCi1tZXNzYWdlIE1lc3NhZ2VMaXRlVG9CZUV4dGVuZGVkIHsKLSAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKLX0KLQotbWVzc2FnZSBNeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGUgewotfQotCi1leHRlbmQgTWVzc2FnZUxpdGVUb0JlRXh0ZW5kZWQgewotICBvcHRpb25hbCBNeU5vbk5lc3RlZEV4dGVuc2lvbkxpdGUgbm9uTmVzdGVkRXh0ZW5zaW9uTGl0ZSA9IDE7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qYXZhL3NyYy90ZXN0L2phdmEvY29tL2dvb2dsZS9wcm90b2J1Zi90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggOTYxMGU5ZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamF2YS9zcmMvdGVzdC9qYXZhL2NvbS9nb29nbGUvcHJvdG9idWYvdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KKysrIC9kZXYvbnVsbApAQCAtMSw5MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IGpvbnBAZ29vZ2xlLmNvbSAoSm9uIFBlcmxvdykKLQotLy8gVGhpcyBmaWxlIHRlc3RzIHRoYXQgdmFyaW91cyBpZGVudGlmaWVycyB3b3JrIGFzIGZpZWxkIGFuZCB0eXBlIG5hbWVzIGV2ZW4KLS8vIHRob3VnaCB0aGUgc2FtZSBpZGVudGlmaWVycyBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBqYXZhIGNvZGUgZ2VuZXJhdG9yLgotCi0KLS8vIFNvbWUgZ2VuZXJpY19zZXJ2aWNlcyBvcHRpb24ocykgYWRkZWQgYXV0b21hdGljYWxseS4KLS8vIFNlZTogIGh0dHA6Ly9nby9wcm90bzItZ2VuZXJpYy1zZXJ2aWNlcy1kZWZhdWx0Ci1vcHRpb24gamF2YV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAvLyBhdXRvLWFkZGVkCi0KLXBhY2thZ2UgaW9fcHJvdG9jb2xfdGVzdHM7Ci0KLW9wdGlvbiBqYXZhX3BhY2thZ2UgPSAiY29tLmdvb2dsZS5wcm90b2J1ZiI7Ci1vcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSAiVGVzdEJhZElkZW50aWZpZXJzUHJvdG8iOwotCi1tZXNzYWdlIFRlc3RNZXNzYWdlIHsKLX0KLQotbWVzc2FnZSBEZXByZWNhdGVkIHsKLSAgZW51bSBUZXN0RW51bSB7Ci0gICAgRk9PID0gMTsKLSAgfQotCi0gIG9wdGlvbmFsIGludDMyIGZpZWxkMSA9IDEgW2RlcHJlY2F0ZWQ9dHJ1ZV07Ci0gIG9wdGlvbmFsIFRlc3RFbnVtIGZpZWxkMiA9IDIgW2RlcHJlY2F0ZWQ9dHJ1ZV07Ci0gIG9wdGlvbmFsIFRlc3RNZXNzYWdlIGZpZWxkMyA9IDMgW2RlcHJlY2F0ZWQ9dHJ1ZV07Ci19Ci0KLW1lc3NhZ2UgT3ZlcnJpZGUgewotICBvcHRpb25hbCBpbnQzMiBvdmVycmlkZSA9IDE7Ci19Ci0KLW1lc3NhZ2UgT2JqZWN0IHsKLSAgb3B0aW9uYWwgaW50MzIgb2JqZWN0ID0gMTsKLX0KLQotbWVzc2FnZSBTdHJpbmcgewotICBvcHRpb25hbCBzdHJpbmcgc3RyaW5nID0gMTsKLX0KLQotbWVzc2FnZSBJbnRlZ2VyIHsKLSAgb3B0aW9uYWwgaW50MzIgaW50ZWdlciA9IDE7Ci19Ci0KLW1lc3NhZ2UgTG9uZyB7Ci0gIG9wdGlvbmFsIGludDMyIGxvbmcgPSAxOwotfQotCi1tZXNzYWdlIEZsb2F0IHsKLSAgb3B0aW9uYWwgZmxvYXQgZmxvYXQgPSAxOwotfQotCi1tZXNzYWdlIERvdWJsZSB7Ci0gIG9wdGlvbmFsIGRvdWJsZSBkb3VibGUgPSAxOwotfQotCi1zZXJ2aWNlIFRlc3RDb25mbGljdGluZ01ldGhvZE5hbWVzIHsKLSAgcnBjIE92ZXJyaWRlKFRlc3RNZXNzYWdlKSByZXR1cm5zIChUZXN0TWVzc2FnZSk7Ci19Ci0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2plbmtpbnMvUkVBRE1FLm1kIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2plbmtpbnMvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qZW5raW5zL1JFQURNRS5tZApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2plbmtpbnMvUkVBRE1FLm1kCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qZW5raW5zL2J1aWxkX2FuZF9ydW5fZG9ja2VyLnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2plbmtpbnMvYnVpbGRfYW5kX3J1bl9kb2NrZXIuc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2plbmtpbnMvYnVpbGRfYW5kX3J1bl9kb2NrZXIuc2gKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qZW5raW5zL2J1aWxkX2FuZF9ydW5fZG9ja2VyLnNoCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qZW5raW5zL2J1aWxkY21kcy9SRUFETUUubWQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamVua2lucy9idWlsZGNtZHMvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qZW5raW5zL2J1aWxkY21kcy9SRUFETUUubWQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qZW5raW5zL2J1aWxkY21kcy9SRUFETUUubWQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2plbmtpbnMvYnVpbGRjbWRzL3B1bGxfcmVxdWVzdC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qZW5raW5zL2J1aWxkY21kcy9wdWxsX3JlcXVlc3Quc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL2plbmtpbnMvYnVpbGRjbWRzL3B1bGxfcmVxdWVzdC5zaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2plbmtpbnMvYnVpbGRjbWRzL3B1bGxfcmVxdWVzdC5zaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamVua2lucy9kb2NrZXIvRG9ja2VyZmlsZSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qZW5raW5zL2RvY2tlci9Eb2NrZXJmaWxlCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qZW5raW5zL2RvY2tlci9Eb2NrZXJmaWxlCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamVua2lucy9kb2NrZXIvRG9ja2VyZmlsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamVua2lucy9tYWtlX3Rlc3Rfb3V0cHV0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL2plbmtpbnMvbWFrZV90ZXN0X291dHB1dC5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvamVua2lucy9tYWtlX3Rlc3Rfb3V0cHV0LnB5CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamVua2lucy9tYWtlX3Rlc3Rfb3V0cHV0LnB5CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qZW5raW5zL3B1bGxfcmVxdWVzdF9pbl9kb2NrZXIuc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvamVua2lucy9wdWxsX3JlcXVlc3RfaW5fZG9ja2VyLnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9qZW5raW5zL3B1bGxfcmVxdWVzdF9pbl9kb2NrZXIuc2gKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9qZW5raW5zL3B1bGxfcmVxdWVzdF9pbl9kb2NrZXIuc2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL200L2FjX3N5c3RlbV9leHRlbnNpb25zLm00IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL200L2FjX3N5c3RlbV9leHRlbnNpb25zLm00CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9tNC9hY19zeXN0ZW1fZXh0ZW5zaW9ucy5tNApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL200L2FjX3N5c3RlbV9leHRlbnNpb25zLm00CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9tNC9hY3hfY2hlY2tfc3VuY2MubTQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvbTQvYWN4X2NoZWNrX3N1bmNjLm00CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9tNC9hY3hfY2hlY2tfc3VuY2MubTQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9tNC9hY3hfY2hlY2tfc3VuY2MubTQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL200L2FjeF9wdGhyZWFkLm00IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL200L2FjeF9wdGhyZWFkLm00CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9tNC9hY3hfcHRocmVhZC5tNApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL200L2FjeF9wdGhyZWFkLm00CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9tNC9zdGxfaGFzaC5tNCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9tNC9zdGxfaGFzaC5tNApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvbTQvc3RsX2hhc2gubTQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9tNC9zdGxfaGFzaC5tNApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGF0Y2hlcy8wMDAzLXJlbW92ZS1zdGF0aWMtaW5pdGlhbGl6ZXJzLnBhdGNoIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3BhdGNoZXMvMDAwMy1yZW1vdmUtc3RhdGljLWluaXRpYWxpemVycy5wYXRjaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGF0Y2hlcy8wMDAzLXJlbW92ZS1zdGF0aWMtaW5pdGlhbGl6ZXJzLnBhdGNoCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcGF0Y2hlcy8wMDAzLXJlbW92ZS1zdGF0aWMtaW5pdGlhbGl6ZXJzLnBhdGNoCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wYXRjaGVzLzAwMDQtZml4LWludGVnZXItdHlwZXMtYW5kLXNoYXJlZC1saWJyYXJ5LWV4cG9ydHMucGF0Y2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcGF0Y2hlcy8wMDA0LWZpeC1pbnRlZ2VyLXR5cGVzLWFuZC1zaGFyZWQtbGlicmFyeS1leHBvcnRzLnBhdGNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wYXRjaGVzLzAwMDQtZml4LWludGVnZXItdHlwZXMtYW5kLXNoYXJlZC1saWJyYXJ5LWV4cG9ydHMucGF0Y2gKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wYXRjaGVzLzAwMDQtZml4LWludGVnZXItdHlwZXMtYW5kLXNoYXJlZC1saWJyYXJ5LWV4cG9ydHMucGF0Y2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BhdGNoZXMvMDAwNS1maXgtaW5jbHVkZS1qcy1nZW5lcmF0b3IucGF0Y2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcGF0Y2hlcy8wMDA1LWZpeC1pbmNsdWRlLWpzLWdlbmVyYXRvci5wYXRjaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGF0Y2hlcy8wMDA1LWZpeC1pbmNsdWRlLWpzLWdlbmVyYXRvci5wYXRjaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3BhdGNoZXMvMDAwNS1maXgtaW5jbHVkZS1qcy1nZW5lcmF0b3IucGF0Y2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BhdGNoZXMvMDAwNy11bmlubGluZV9nb29nbGVvbmNlLnBhdGNoIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3BhdGNoZXMvMDAwNy11bmlubGluZV9nb29nbGVvbmNlLnBhdGNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wYXRjaGVzLzAwMDctdW5pbmxpbmVfZ29vZ2xlb25jZS5wYXRjaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3BhdGNoZXMvMDAwNy11bmlubGluZV9nb29nbGVvbmNlLnBhdGNoCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wYXRjaGVzLzAwMDgtdW5pbmxpbmVfZ2V0X2VtcHR5X3N0cmluZy5wYXRjaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wYXRjaGVzLzAwMDgtdW5pbmxpbmVfZ2V0X2VtcHR5X3N0cmluZy5wYXRjaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGF0Y2hlcy8wMDA4LXVuaW5saW5lX2dldF9lbXB0eV9zdHJpbmcucGF0Y2gKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wYXRjaGVzLzAwMDgtdW5pbmxpbmVfZ2V0X2VtcHR5X3N0cmluZy5wYXRjaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGF0Y2hlcy8wMDA5LXVuaW5saW5lLWFyZW5hc3RyaW5nLnBhdGNoIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3BhdGNoZXMvMDAwOS11bmlubGluZS1hcmVuYXN0cmluZy5wYXRjaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGF0Y2hlcy8wMDA5LXVuaW5saW5lLWFyZW5hc3RyaW5nLnBhdGNoCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcGF0Y2hlcy8wMDA5LXVuaW5saW5lLWFyZW5hc3RyaW5nLnBhdGNoCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wYXRjaGVzLzAwMTAtdW5pbmxpbmUtZ2VuZXJhdGVkLWNvZGUucGF0Y2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcGF0Y2hlcy8wMDEwLXVuaW5saW5lLWdlbmVyYXRlZC1jb2RlLnBhdGNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wYXRjaGVzLzAwMTAtdW5pbmxpbmUtZ2VuZXJhdGVkLWNvZGUucGF0Y2gKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wYXRjaGVzLzAwMTAtdW5pbmxpbmUtZ2VuZXJhdGVkLWNvZGUucGF0Y2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3BhdGNoZXMvMDAxMS1saWJwcm90b2J1Zl9leHBvcnQucGF0Y2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcGF0Y2hlcy8wMDExLWxpYnByb3RvYnVmX2V4cG9ydC5wYXRjaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcGF0Y2hlcy8wMDExLWxpYnByb3RvYnVmX2V4cG9ydC5wYXRjaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3BhdGNoZXMvMDAxMS1saWJwcm90b2J1Zl9leHBvcnQucGF0Y2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3Bvc3RfcHJvY2Vzc19kaXN0LnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Bvc3RfcHJvY2Vzc19kaXN0LnNoCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wb3N0X3Byb2Nlc3NfZGlzdC5zaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Bvc3RfcHJvY2Vzc19kaXN0LnNoCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b19saWJyYXJ5LmduaSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b19saWJyYXJ5LmduaQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9fbGlicmFyeS5nbmkKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b19saWJyYXJ5LmduaQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9idWYtbGl0ZS5wYy5pbiBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zi1saXRlLnBjLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b2J1Zi1saXRlLnBjLmluCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWYtbGl0ZS5wYy5pbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9idWYuYnpsIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLmJ6bApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9idWYuYnpsCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWYuYnpsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWYuZ3lwIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLmd5cAppbmRleCBkY2VkN2JjLi5lOTg1ODM2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWYuZ3lwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zi5neXAKQEAgLTYsMTMxICs2LDI1IEBACiAgICdjb25kaXRpb25zJzogWwogICAgIFsndXNlX3N5c3RlbV9wcm90b2J1Zj09MCcsIHsKICAgICAgICdjb25kaXRpb25zJzogWwotICAgICAgICBbJ09TIT0ic3RhcmJvYXJkIiBhbmQgYWN0dWFsX3RhcmdldF9hcmNoPT0id2luIicsIHsKLSAgICAgICAgICAndGFyZ2V0X2RlZmF1bHRzJzogewotICAgICAgICAgICAgJ21zdnNfZGlzYWJsZWRfd2FybmluZ3MnOiBbCi0gICAgICAgICAgICAgICMgZm9yY2luZyB2YWx1ZSB0byBib29sICd0cnVlJyBvciAnZmFsc2UnIChwZXJmb3JtYW5jZSB3YXJuaW5nKQotICAgICAgICAgICAgICA0ODAwLAotICAgICAgICAgICAgXSwKLSAgICAgICAgICB9LAotICAgICAgICB9XSwKLSAgICAgICAgWydPUz09InN0YXJib2FyZCIgYW5kIGFjdHVhbF90YXJnZXRfYXJjaD09InBzMyInLCB7Ci0gICAgICAgICAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKLSAgICAgICAgICAgICdjZmxhZ3NfY2NfaG9zdCc6IFsKLSAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLXJlc3VsdCcsCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgIH1dLAotICAgICAgICBbJ09TIT0id2luIicsIHsKLSAgICAgICAgICAndmFyaWFibGVzJzogewotICAgICAgICAgICAgJ2NvbmZpZ19oX2Rpcic6Ci0gICAgICAgICAgICAgICcuJywgICMgY3JhZnRlZCBmb3IgZ2NjL2xpbnV4LgotICAgICAgICAgIH0sCi0gICAgICAgIH0sIHsgICMgZWxzZSwgT1M9PSJ3aW4iCi0gICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKLSAgICAgICAgICAgICdjb25maWdfaF9kaXInOgotICAgICAgICAgICAgICAndnNwcm9qZWN0cycsICAjIGNyYWZ0ZWQgZm9yIG1zdmMuCi0gICAgICAgICAgfSwKKyAgICAgICAgWydPUz09IndpbiInLCB7CiAgICAgICAgICAgJ3RhcmdldF9kZWZhdWx0cyc6IHsKICAgICAgICAgICAgICdtc3ZzX2Rpc2FibGVkX3dhcm5pbmdzJzogWwogICAgICAgICAgICAgICA0MDE4LCAgIyBzaWduZWQvdW5zaWduZWQgbWlzbWF0Y2ggaW4gY29tcGFyaXNvbgorICAgICAgICAgICAgICA0MDY1LCAgIyBzd2l0Y2ggc3RhdGVtZW50IGNvbnRhaW5zICdkZWZhdWx0JyBidXQgbm8gJ2Nhc2UnIGxhYmVscworICAgICAgICAgICAgICA0MTQ2LCAgIyB1bmFyeSBtaW51cyBvcGVyYXRvciBhcHBsaWVkIHRvIHVuc2lnbmVkIHR5cGUKICAgICAgICAgICAgICAgNDI0NCwgICMgaW1wbGljaXQgY29udmVyc2lvbiwgcG9zc2libGUgbG9zcyBvZiBkYXRhCisgICAgICAgICAgICAgIDQyNjcsICAjIHNpemVfdCB0byBpbnQgdHJ1bmNhdGlvbgorICAgICAgICAgICAgICA0MjkxLCAgIyBubyBtYXRjaGluZyBvcGVyYXRvciBkZWxldGUgZm9yIGEgcGxhY2VtZW50IG5ldworICAgICAgICAgICAgICA0MzA1LCAgIyBkb3VibGUgdG8gZmxvYXQgdHJ1bmNhdGlvbgogICAgICAgICAgICAgICA0MzU1LCAgIyAndGhpcycgdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0CisgICAgICAgICAgICAgIDQ1MDYsICAjIG5vIGRlZmluaXRpb24gZm9yIGlubGluZSBmdW5jdGlvbiAocHJvdG9idWYgaXNzdWUgIzI0MCkKKyAgICAgICAgICAgICAgNDcxNSwgICMgbm90IGFsbCBjb250cm9sIHBhdGhzIHJldHVybiBhIHZhbHVlIChmaXhlZCBpbiB0cnVuaykKICAgICAgICAgICAgIF0sCiAgICAgICAgICAgICAnZGVmaW5lcyEnOiBbCiAgICAgICAgICAgICAgICdXSU4zMl9MRUFOX0FORF9NRUFOJywgICMgUHJvdG9idWYgZGVmaW5lcyB0aGlzIGl0c2VsZi4KICAgICAgICAgICAgIF0sCiAgICAgICAgICAgfSwKICAgICAgICAgfV0sCi0gICAgICAgIFsnT1M9PSJpb3MiJywgewotICAgICAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICAgICAnbmluamFfb3V0cHV0X2Rpcic6ICduaW5qYS1wcm90b2MnLAotICAgICAgICAgICAgJ25pbmphX3Byb2R1Y3RfZGlyJzoKLSAgICAgICAgICAgICAgJzwoREVQVEgpL3hjb2RlYnVpbGQvPChuaW5qYV9vdXRwdXRfZGlyKS88KENPTkZJR1VSQVRJT05fTkFNRSknLAotICAgICAgICAgICAgIyBHeXAgdG8gcmVydW4KLSAgICAgICAgICAgICdyZV9ydW5fdGFyZ2V0cyc6IFsKLSAgICAgICAgICAgICAgJ3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLmd5cCcsCi0gICAgICAgICAgICBdLAotICAgICAgICAgIH0sCi0gICAgICAgICAgJ3RhcmdldHMnOiBbCi0gICAgICAgICAgICB7Ci0gICAgICAgICAgICAgICMgT24gaU9TLCBnZW5lcmF0aW5nIHByb3RvYyBpcyBkb25lIHZpYSB0d28gYWN0aW9uczogKDEpIGNvbXBpbGluZwotICAgICAgICAgICAgICAjIHRoZSBleGVjdXRhYmxlIHdpdGggbmluamEsIGFuZCAoMikgY29weWluZyB0aGUgZXhlY3V0YWJsZSBpbnRvIGEKLSAgICAgICAgICAgICAgIyBsb2NhdGlvbiB0aGF0IGlzIHNoYXJlZCB3aXRoIG90aGVyIHByb2plY3RzLiBUaGVzZSBhY3Rpb25zIGFyZQotICAgICAgICAgICAgICAjIHNlcGFyYXRlZCBpbnRvIHR3byB0YXJnZXRzIGluIG9yZGVyIHRvIGJlIGFibGUgdG8gc3BlY2lmeSB0aGF0IHRoZQotICAgICAgICAgICAgICAjIHNlY29uZCBhY3Rpb24gc2hvdWxkIG5vdCBydW4gdW50aWwgdGhlIGZpcnN0IGFjdGlvbiBmaW5pc2hlcyAoc2luY2UKLSAgICAgICAgICAgICAgIyB0aGUgb3JkZXJpbmcgb2YgbXVsdGlwbGUgYWN0aW9ucyBpbiBvbmUgdGFyZ2V0IGlzIGRlZmluZWQgb25seSBieQotICAgICAgICAgICAgICAjIGlucHV0cyBhbmQgb3V0cHV0cywgYW5kIGl0J3MgaW1wb3NzaWJsZSB0byBzZXQgY29ycmVjdCBpbnB1dHMgZm9yCi0gICAgICAgICAgICAgICMgdGhlIG5pbmphIGJ1aWxkLCBzbyBzZXR0aW5nIGFsbCB0aGUgaW5wdXRzIGFuZCBvdXRwdXRzIGlzbid0IGFuCi0gICAgICAgICAgICAgICMgb3B0aW9uKS4gVGhlIGZpcnN0IHRhcmdldCBpcyBnaXZlbiBoZXJlOyB0aGUgc2Vjb25kIHRhcmdldCBpcyB0aGUKLSAgICAgICAgICAgICAgIyBub3JtYWwgcHJvdG9jIHRhcmdldCB1bmRlciB0aGUgY29uZGl0aW9uIHRoYXQgIk9TPT1pT1MiLgotICAgICAgICAgICAgICAndGFyZ2V0X25hbWUnOiAnY29tcGlsZV9wcm90b2MnLAotICAgICAgICAgICAgICAndHlwZSc6ICdub25lJywKLSAgICAgICAgICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9idWlsZC9pb3MvbWFjX2J1aWxkLmd5cGknXSwKLSAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ2NvbXBpbGUgcHJvdG9jJywKLSAgICAgICAgICAgICAgICAgICdpbnB1dHMnOiBbXSwKLSAgICAgICAgICAgICAgICAgICdvdXRwdXRzJzogW10sCi0gICAgICAgICAgICAgICAgICAnYWN0aW9uJzogWwotICAgICAgICAgICAgICAgICAgICAnPEAobmluamFfY21kKScsCi0gICAgICAgICAgICAgICAgICAgICdwcm90b2MnLAotICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICdtZXNzYWdlJzogJ0dlbmVyYXRpbmcgdGhlIEMrKyBwcm90b2NvbCBidWZmZXJzIGNvbXBpbGVyJywKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfSwKLSAgICAgICAgICBdLAotICAgICAgICB9XSwKLSAgICAgICAgWydPUz09ImFuZHJvaWQiJywgewotICAgICAgICAgICd0YXJnZXRzJzogWwotICAgICAgICAgICAgewotICAgICAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9idWZfbGl0ZV9qYXZhbGliJywKLSAgICAgICAgICAgICAgJ3R5cGUnIDogJ25vbmUnLAotICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgICAgICdwcm90b2MjaG9zdCcsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICd2YXJpYWJsZXMnOiB7Ci0gICAgICAgICAgICAgICAgJ3NjcmlwdF9kZXNjcmlwdG9ycyc6ICcuL3Byb3RvYnVmX2xpdGVfamF2YV9kZXNjcmlwdG9yX3Byb3RvLnB5JywKLSAgICAgICAgICAgICAgICAnc2NyaXB0X3BvbSc6ICcuL3Byb3RvYnVmX2xpdGVfamF2YV9wYXJzZV9wb20ucHknLAotICAgICAgICAgICAgICAgICdwcm90b2MnOiAnPChQUk9EVUNUX0RJUikvPChFWEVDVVRBQkxFX1BSRUZJWClwcm90b2M8KEVYRUNVVEFCTEVfU1VGRklYKScsCi0gICAgICAgICAgICAgICAgIyBWYXJpYWJsZXMgbmVlZGVkIGJ5IGphdmEuZ3lwaSBiZWxvdy4KLSAgICAgICAgICAgICAgICAnamF2YV9vdXRfZGlyJzogJzwoUFJPRFVDVF9ESVIpL2phdmFfcHJvdG8vcHJvdG9idWZfbGl0ZV9qYXZhX2Rlc2NyaXB0b3JfcHJvdG8nLAotICAgICAgICAgICAgICAgICdnZW5lcmF0ZWRfc3JjX2RpcnMnOiBbJzwoamF2YV9vdXRfZGlyKSddLAotICAgICAgICAgICAgICAgICdwYWNrYWdlX25hbWUnOiAnPChfdGFyZ2V0X25hbWUpJywKLSAgICAgICAgICAgICAgICAnamF2YV9pbl9kaXInOiAnamF2YScsCi0gICAgICAgICAgICAgICAgJ21hdmVuX3BvbSc6ICc8KGphdmFfaW5fZGlyKS9wb20ueG1sJywKLSAgICAgICAgICAgICAgICAnamF2YWNfaW5jbHVkZXMnOiBbJzwhQCg8KHNjcmlwdF9wb20pIDwobWF2ZW5fcG9tKSknXSwKLSAgICAgICAgICAgICAgICAnYWRkaXRpb25hbF9pbnB1dF9wYXRocyc6IFsKLSAgICAgICAgICAgICAgICAgICc8KGphdmFfb3V0X2RpcikvY29tL2dvb2dsZS9wcm90b2J1Zi9EZXNjcmlwdG9yUHJvdG9zLmphdmEnCi0gICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgJ2FjdGlvbnMnOiBbCi0gICAgICAgICAgICAgICAgewotICAgICAgICAgICAgICAgICAgJ2FjdGlvbl9uYW1lJzogJ3Byb3RvYnVmX2xpdGVfamF2YV9nZW5fZGVzY3JpcHRvcl9wcm90bycsCi0gICAgICAgICAgICAgICAgICAnaW5wdXRzJzogWwotICAgICAgICAgICAgICAgICAgICAnPChzY3JpcHRfZGVzY3JpcHRvcnMpJywKLSAgICAgICAgICAgICAgICAgICAgJzwocHJvdG9jKScsCi0gICAgICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8nLAotICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICAgICdvdXRwdXRzJzogWwotICAgICAgICAgICAgICAgICAgICAnPChqYXZhX291dF9kaXIpL2NvbS9nb29nbGUvcHJvdG9idWYvRGVzY3JpcHRvclByb3Rvcy5qYXZhJywKLSAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAnYWN0aW9uJzogWwotICAgICAgICAgICAgICAgICAgICAnPChzY3JpcHRfZGVzY3JpcHRvcnMpJywKLSAgICAgICAgICAgICAgICAgICAgJzwocHJvdG9jKScsCi0gICAgICAgICAgICAgICAgICAgICc8KGphdmFfb3V0X2RpciknLAotICAgICAgICAgICAgICAgICAgICAnc3JjJywKLSAgICAgICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bycsCi0gICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgJ21lc3NhZ2UnOiAnR2VuZXJhdGluZyBkZXNjcmlwdG9yIHByb3RvcyBmb3IgSmF2YScsCi0gICAgICAgICAgICAgICAgfSwKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgIyBOb3cgdGhhdCB3ZSBoYXZlIGdlbmVyYXRlZCBEZXNjcmlwdG9yUHJvdG9zLmphdmEsIGJ1aWxkIGphci4KLSAgICAgICAgICAgICAgJ2luY2x1ZGVzJzogWycuLi8uLi9idWlsZC9qYXZhLmd5cGknXSwKLSAgICAgICAgICAgIH0sCi0gICAgICAgICAgXQotICAgICAgICB9XSwKICAgICAgIF0sCiAgICAgICAndGFyZ2V0cyc6IFsKICAgICAgICAgIyBUaGUgImxpdGUiIGxpYiBpcyBhYm91dCAxLzd0aCB0aGUgc2l6ZSBvZiB0aGUgaGVhdnkgbGliLApAQCAtMTQzLDcyICszNywyOSBAQAogICAgICAgICAjIHRvIHlvdXIgLnByb3RvIGZpbGUuCiAgICAgICAgIHsKICAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9idWZfbGl0ZScsCi0gICAgICAgICAgJ3R5cGUnOiAnc3RhdGljX2xpYnJhcnknLAorICAgICAgICAgICd0eXBlJzogJzwoY29tcG9uZW50KScsCiAgICAgICAgICAgJ3Rvb2xzZXRzJzogWydob3N0JywgJ3RhcmdldCddLAotICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fZ2NjLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgnLAotCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmNjJywKLSAgICAgICAgICAgICc8KGNvbmZpZ19oX2RpcikvY29uZmlnLmgnLAorICAgICAgICAgICdpbmNsdWRlcyc6IFsKKyAgICAgICAgICAgICdwcm90b2J1Zl9saXRlLmd5cGknLAogICAgICAgICAgIF0sCi0gICAgICAgICAgJ2luY2x1ZGVfZGlycyc6IFsKLSAgICAgICAgICAgICc8KGNvbmZpZ19oX2RpciknLAotICAgICAgICAgICAgJ3NyYycsCi0gICAgICAgICAgXSwKLSAgICAgICAgICAjIFRoaXMgbWFjcm8gbXVzdCBiZSBkZWZpbmVkIHRvIHN1cHByZXNzIHRoZSB1c2Ugb2YgZHluYW1pY19jYXN0PD4sCi0gICAgICAgICAgIyB3aGljaCByZXF1aXJlcyBSVFRJLgotICAgICAgICAgICdkZWZpbmVzJzogWwotICAgICAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19SVFRJJywKLSAgICAgICAgICAgICdHT09HTEVfUFJPVE9CVUZfTk9fU1RBVElDX0lOSVRJQUxJWkVSJywKLSAgICAgICAgICBdLAotCi0gICAgICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7Ci0gICAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWwotICAgICAgICAgICAgICAnPChjb25maWdfaF9kaXIpJywKLSAgICAgICAgICAgICAgJ3NyYycsCisgICAgICAgICAgJ3ZhcmlhYmxlcyc6IHsKKyAgICAgICAgICAgICdjbGFuZ193YXJuaW5nX2ZsYWdzJzogWworICAgICAgICAgICAgICAjIHByb3RvYnVmLTMgY29udGFpbnMgYSBmZXcgZnVuY3Rpb25zIHRoYXQgYXJlIHVudXNlZC4KKyAgICAgICAgICAgICAgJy1Xbm8tdW51c2VkLWZ1bmN0aW9uJywKICAgICAgICAgICAgIF0sCisgICAgICAgICAgfSwKKyAgICAgICAgICAjIFJlcXVpcmVkIGZvciBjb21wb25lbnQgYnVpbGRzLiBTZWUgaHR0cDovL2NyYnVnLmNvbS8xNzI4MDAuCisgICAgICAgICAgJ2RlZmluZXMnOiBbCisgICAgICAgICAgICAnTElCUFJPVE9CVUZfRVhQT1JUUycsCisgICAgICAgICAgICAnUFJPVE9CVUZfVVNFX0RMTFMnLAorICAgICAgICAgIF0sCisgICAgICAgICAgJ2RpcmVjdF9kZXBlbmRlbnRfc2V0dGluZ3MnOiB7CiAgICAgICAgICAgICAnZGVmaW5lcyc6IFsKLSAgICAgICAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19SVFRJJywKLSAgICAgICAgICAgICAgJ0dPT0dMRV9QUk9UT0JVRl9OT19TVEFUSUNfSU5JVElBTElaRVInLAorICAgICAgICAgICAgICAnUFJPVE9CVUZfVVNFX0RMTFMnLAogICAgICAgICAgICAgXSwKICAgICAgICAgICB9LAogICAgICAgICB9LAotICAgICAgICAjIFRoaXMgaXMgdGhlIGZ1bGwsIGhlYXZ5IHByb3RvYnVmIGxpYiB0aGF0J3MgbmVlZGVkIGZvciBjKysgLnByb3RvJ3MKKyAgICAgICAgIyBUaGlzIGlzIHRoZSBmdWxsLCBoZWF2eSBwcm90b2J1ZiBsaWIgdGhhdCdzIG5lZWRlZCBmb3IgYysrIC5wcm90b3MKICAgICAgICAgIyB0aGF0IGRvbid0IHNwZWNpZnkgdGhlIExJVEVfUlVOVElNRSBvcHRpb24uICBUaGUgcHJvdG9jb2wKICAgICAgICAgIyBjb21waWxlciBpdHNlbGYgKHByb3RvYykgZmFsbHMgaW50byB0aGF0IGNhdGVnb3J5LgogICAgICAgICAjCkBAIC0yMTcsMTUxICs2OCwzNTggQEAKICAgICAgICAgICAndGFyZ2V0X25hbWUnOiAncHJvdG9idWZfZnVsbF9kb19ub3RfdXNlJywKICAgICAgICAgICAndHlwZSc6ICdzdGF0aWNfbGlicmFyeScsCiAgICAgICAgICAgJ3Rvb2xzZXRzJzogWydob3N0JywndGFyZ2V0J10sCisgICAgICAgICAgJ2luY2x1ZGVzJzogWworICAgICAgICAgICAgJ3Byb3RvYnVmX2xpdGUuZ3lwaScsCisgICAgICAgICAgXSwKKyAgICAgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAgICAgJ2NsYW5nX3dhcm5pbmdfZmxhZ3MnOiBbCisgICAgICAgICAgICAgICMgcHJvdG9idWYtMyBjb250YWlucyBhIGZldyBmdW5jdGlvbnMgdGhhdCBhcmUgdW51c2VkLgorICAgICAgICAgICAgICAnLVduby11bnVzZWQtZnVuY3Rpb24nLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICB9LAogICAgICAgICAgICdzb3VyY2VzJzogWwotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmgnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCcsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9hcGkucGIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MnLAogICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MnLAogICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucGIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucGIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmgnLAogCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCcsCisgICAgICAgICAgICAjIGd6aXBfc3RyZWFtLmNjIHB1bGxzIGluIHpsaWIsIGJ1dCBpdCdzIG5vdCBhY3R1YWxseSB1c2VkIGJ5CisgICAgICAgICAgICAjIHByb3RvYywganVzdCBieSB0ZXN0IGNvZGUsIHNvIGluc3RlYWQgb2YgY29tcGlsaW5nIHpsaWIgZm9yIHRoZQorICAgICAgICAgICAgIyBob3N0LCBsZXQncyBqdXN0IGV4Y2x1ZGUgdGhpcy4KKyAgICAgICAgICAgICMgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MnLAorICAgICAgICAgICAgIyAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oJywKKworICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vc3RydG9kLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YS5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX2ludGVybmFsLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRodXRpbC5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aGxpbWl0cy5oJywKICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MnLAogICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zaW5nbGV0b24kLmgnLAogICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wYi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2NvbnN0YW50cy5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2xvY2F0aW9uX3RyYWNrZXIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9sb2NhdGlvbl90cmFja2VyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfc291cmNlLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3dyaXRlci5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdXRpbGl0eS5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmNjJywKKyAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyLmgnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaCcsCiAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYycsCi0gICAgICAgICAgICAjIFRoaXMgZmlsZSBwdWxscyBpbiB6bGliLCBidXQgaXQncyBub3QgYWN0dWFsbHkgdXNlZCBieSBwcm90b2MsIHNvCi0gICAgICAgICAgICAjIGluc3RlYWQgb2YgY29tcGlsaW5nIHpsaWIgZm9yIHRoZSBob3N0LCBsZXQncyBqdXN0IGV4Y2x1ZGUgdGhpcy4KLSAgICAgICAgICAgICMgJ3NyYy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MnLAotICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjJywKLSAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYycsCi0gICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MnLAorICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCcsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5jYycsCisgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oJywKICAgICAgICAgICBdLAorICAgICAgICB9LAorICAgICAgICB7CisgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3Byb3RvY19saWInLAorICAgICAgICAgICd0eXBlJzogJ3N0YXRpY19saWJyYXJ5JywKKyAgICAgICAgICAndG9vbHNldHMnOiBbJ2hvc3QnXSwKKyAgICAgICAgICAnc291cmNlcyc6IFsKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9lbnVtX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfbWVzc2FnZV9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF93cmFwcGVyX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0LmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0LmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZF9saXRlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkX2xpdGUuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9saXRlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2xpdGUuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uX2xpdGUuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvcl9mYWN0b3J5LmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZF9saXRlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGRfbGl0ZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXIuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkX2xpdGUuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2xpdGUuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lX3Jlc29sdmVyLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lX3Jlc29sdmVyLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZF9saXRlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGRfbGl0ZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NoYXJlZF9jb2RlX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGRfbGl0ZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2VudW0uY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2VudW1fZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2V4dGVuc2lvbi5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19leHRlbnNpb24uaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpbGUuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19nZW5lcmF0b3IuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19oZWxwZXJzLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2hlbHBlcnMuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tYXBfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWFwX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZV9maWVsZC5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcHJpbWl0aXZlX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX3ByaW1pdGl2ZV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2pzL2pzX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qcy9qc19nZW5lcmF0b3IuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2V4dGVuc2lvbi5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5oIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYyIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmgiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MiLAorICAgICAgICAgICAgInNyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaCIsCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjIiwKKyAgICAgICAgICAgICJzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuaCIsCisgICAgICAgICAgXSwKKyAgICAgICAgICAndmFyaWFibGVzJzogeworICAgICAgICAgICAgJ2NsYW5nX3dhcm5pbmdfZmxhZ3MnOiBbCisgICAgICAgICAgICAgICMgcHJvdG9idWYtMyBjb250YWlucyBhIGZldyBmdW5jdGlvbnMgdGhhdCBhcmUgdW51c2VkLgorICAgICAgICAgICAgICAnLVduby11bnVzZWQtZnVuY3Rpb24nLAorICAgICAgICAgICAgXSwKKyAgICAgICAgICB9LAogICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCi0gICAgICAgICAgICAncHJvdG9idWZfbGl0ZScsCisgICAgICAgICAgICAncHJvdG9idWZfZnVsbF9kb19ub3RfdXNlJywKICAgICAgICAgICBdLAotICAgICAgICAgICdleHBvcnRfZGVwZW5kZW50X3NldHRpbmdzJzogWwotICAgICAgICAgICAgJ3Byb3RvYnVmX2xpdGUnLAorICAgICAgICAgICdpbmNsdWRlX2RpcnMnOiBbCisgICAgICAgICAgICAnc3JjJywKICAgICAgICAgICBdLAogICAgICAgICB9LAogICAgICAgICB7CiAgICAgICAgICAgJ3RhcmdldF9uYW1lJzogJ3Byb3RvYycsCi0gICAgICAgICAgJ2NvbmRpdGlvbnMnOiBbCi0gICAgICAgICAgICBbJ09TIT0iaW9zIicsIHsKLSAgICAgICAgICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCi0gICAgICAgICAgICAgICd0b29sc2V0cyc6IFsnaG9zdCddLAotICAgICAgICAgICAgICAnc291cmNlcyc6IFsKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmgnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmgnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmgnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmNjJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oJywKLSAgICAgICAgICAgICAgICAnc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYycsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmgnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmgnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaCcsCi0gICAgICAgICAgICAgICAgJ3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MnLAotICAgICAgICAgICAgICAgICdzcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgICAgICdwcm90b2J1Zl9mdWxsX2RvX25vdF91c2UnLAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWwotICAgICAgICAgICAgICAgICc8KGNvbmZpZ19oX2RpciknLAotICAgICAgICAgICAgICAgICdzcmMvc3JjJywKLSAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgIH0sIHsgICMgZWxzZSwgT1M9PSJpb3MiCi0gICAgICAgICAgICAgICd0eXBlJzogJ25vbmUnLAotICAgICAgICAgICAgICAnZGVwZW5kZW5jaWVzJzogWwotICAgICAgICAgICAgICAgICdjb21waWxlX3Byb3RvYycsCi0gICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICdhY3Rpb25zJzogWwotICAgICAgICAgICAgICAgIHsKLSAgICAgICAgICAgICAgICAgICdhY3Rpb25fbmFtZSc6ICdjb3B5IHByb3RvYycsCi0gICAgICAgICAgICAgICAgICAnaW5wdXRzJzogWwotICAgICAgICAgICAgICAgICAgICAnPChuaW5qYV9wcm9kdWN0X2RpcikvcHJvdG9jJywKLSAgICAgICAgICAgICAgICAgIF0sCi0gICAgICAgICAgICAgICAgICAnb3V0cHV0cyc6IFsKLSAgICAgICAgICAgICAgICAgICAgJzwoUFJPRFVDVF9ESVIpL3Byb3RvYycsCi0gICAgICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgICAgICAgJ2FjdGlvbic6IFsKLSAgICAgICAgICAgICAgICAgICAgJ2NwJywKLSAgICAgICAgICAgICAgICAgICAgJzwobmluamFfcHJvZHVjdF9kaXIpL3Byb3RvYycsCi0gICAgICAgICAgICAgICAgICAgICc8KFBST0RVQ1RfRElSKS9wcm90b2MnLAotICAgICAgICAgICAgICAgICAgXSwKLSAgICAgICAgICAgICAgICB9LAotICAgICAgICAgICAgICBdLAotICAgICAgICAgICAgfV0sCisgICAgICAgICAgJ3R5cGUnOiAnZXhlY3V0YWJsZScsCisgICAgICAgICAgJ3Rvb2xzZXRzJzogWydob3N0J10sCisgICAgICAgICAgJ3NvdXJjZXMnOiBbCisgICAgICAgICAgICAic3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjIiwKKyAgICAgICAgICBdLAorICAgICAgICAgICdkZXBlbmRlbmNpZXMnOiBbCisgICAgICAgICAgICAncHJvdG9jX2xpYicsCisgICAgICAgICAgXSwKKyAgICAgICAgICAnaW5jbHVkZV9kaXJzJzogWworICAgICAgICAgICAgJ3NyYycsCiAgICAgICAgICAgXSwKICAgICAgICAgfSwKICAgICAgICAgewpAQCAtMzcyLDQ1ICs0MzAsNTUgQEAKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgJ2Rlc3RpbmF0aW9uJzogJzwoUFJPRFVDVF9ESVIpL3B5cHJvdG8vZ29vZ2xlLycsCiAgICAgICAgICAgICAgICdmaWxlcyc6IFsKLSAgICAgICAgICAgICAgICAjIGdvb2dsZS8gbW9kdWxlIGdldHMgYW4gZW1wdHkgX19pbml0X18ucHkuCiAgICAgICAgICAgICAgICAgJ19faW5pdF9fLnB5JywKICAgICAgICAgICAgICAgXSwKICAgICAgICAgICAgIH0sCiAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KFBST0RVQ1RfRElSKS9weXByb3RvL2dvb2dsZS90aGlyZF9wYXJ0eS9zaXgvJywKKyAgICAgICAgICAgICAgJ2ZpbGVzJzogWworICAgICAgICAgICAgICAgICd0aGlyZF9wYXJ0eS9zaXgvc2l4LnB5JywKKyAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgIH0sCisgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICdkZXN0aW5hdGlvbic6ICc8KFBST0RVQ1RfRElSKS9weXByb3RvL2dvb2dsZS9wcm90b2J1ZicsCiAgICAgICAgICAgICAgICdmaWxlcyc6IFsKICAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9fX2luaXRfXy5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wb29sLnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9qc29uX2Zvcm1hdC5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9mYWN0b3J5LnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9wcm90b19idWlsZGVyLnB5JywKICAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5JywKICAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLnB5JywKICAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlX3JlZmxlY3Rpb24ucHknLAorICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL3N5bWJvbF9kYXRhYmFzZS5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9lbmNvZGluZy5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHknLAogCiAgICAgICAgICAgICAgICAgIyBUT0RPKG5jYXJ0ZXIpOiBwcm90b2MncyBweXRob24gZ2VuZXJhdG9yIHRyZWF0cwotICAgICAgICAgICAgICAgICMgZGVzY3JpcHRvci5wcm90byBzcGVjaWFsbHksIGJ1dCBpdCdzIG5vdCBwb3NzaWJsZSB0byB0cmlnZ2VyCi0gICAgICAgICAgICAgICAgIyB0aGUgc3BlY2lhbCB0cmVhdG1lbnQgdW5sZXNzIHlvdSBydW4gcHJvdG9jIGZyb20gLi9zcmMvc3JjCi0gICAgICAgICAgICAgICAgIyAodGhlIHRyZWF0bWVudCBpcyBiYXNlZCBvbiB0aGUgcGF0aCB0byB0aGUgLnByb3RvIGZpbGUKLSAgICAgICAgICAgICAgICAjIG1hdGNoaW5nIGEgY29uc3RhbnQgZXhhY3RseSkuIEknbSBub3Qgc3VyZSBob3cgdG8gY29udmluY2UKLSAgICAgICAgICAgICAgICAjIGd5cCB0byBleGVjdXRlIGEgcnVsZSBmcm9tIGEgZGlmZmVyZW50IGRpcmVjdG9yeS4gIFVudGlsIHRoaXMKLSAgICAgICAgICAgICAgICAjIGlzIHJlc29sdmVkLCB1c2UgYSBjb3B5IG9mIGRlc2NyaXB0b3JfcGIyLnB5IHRoYXQgSSBtYW51YWxseQotICAgICAgICAgICAgICAgICMgZ2VuZXJhdGVkLgotICAgICAgICAgICAgICAgICdkZXNjcmlwdG9yX3BiMi5weScsCisgICAgICAgICAgICAgICAgIyBkZXNjcmlwdG9yLnByb3RvIHNwZWNpYWxseSwgYnV0IG9ubHkgd2hlbiB0aGUgaW5wdXQgcGF0aCBpcworICAgICAgICAgICAgICAgICMgZXhhY3RseSAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iLiAgSSdtIG5vdCBzdXJlIGhvdworICAgICAgICAgICAgICAgICMgdG8gZXhlY3V0ZSBhIHJ1bGUgZnJvbSBhIGRpZmZlcmVudCBkaXJlY3RvcnkuICBGb3Igbm93LCB1c2UgYQorICAgICAgICAgICAgICAgICMgbWFudWFsbHktZ2VuZXJhdGVkIGNvcHkgb2YgZGVzY3JpcHRvcl9wYjIucHkuCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9wYjIucHknLAogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgfSwKICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgJ2Rlc3RpbmF0aW9uJzogJzwoUFJPRFVDVF9ESVIpL3B5cHJvdG8vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsJywKICAgICAgICAgICAgICAgJ2ZpbGVzJzogWwogICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19faW5pdF9fLnB5JywKKyAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fcGFyYW1ldGVyaXplZC5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5JywKICAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXJzLnB5JywKLSAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jcHBfbWVzc2FnZS5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVjb2Rlci5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2Rlci5weScsCi0gICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZ2VuZXJhdG9yX3Rlc3QucHknLAorICAgICAgICAgICAgICAgICdweXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2VudW1fdHlwZV93cmFwcGVyLnB5JywKICAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX2xpc3RlbmVyLnB5JywKICAgICAgICAgICAgICAgICAncHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fbWVzc2FnZS5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weScsCisgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2VsbF9rbm93bl90eXBlcy5weScsCiAgICAgICAgICAgICAgICAgJ3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHknLAogICAgICAgICAgICAgICBdLAogICAgICAgICAgICAgfSwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3Byb3RvYnVmLnBjLmluIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLnBjLmluCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b2J1Zi5wYy5pbgpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmLnBjLmluCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b2J1Zl9saXRlLmd5cGkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWZfbGl0ZS5neXBpCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b2J1Zl9saXRlLmd5cGkKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlLmd5cGkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2phdmFfZGVzY3JpcHRvcl9wcm90by5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2phdmFfZGVzY3JpcHRvcl9wcm90by5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMjk2N2NlOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9idWZfbGl0ZV9qYXZhX2Rlc2NyaXB0b3JfcHJvdG8ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw0OSArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0jIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSIiIkdlbmVyYXRlIGphdmEgRGVzY3JpcHRvclByb3RvIGZpbGUuCi0KLVVzYWdlOgotICAgIHByb3RvYnVmX2xpdGVfamF2YV9kZXNjcmlwdG9yX3Byb3RvLnB5IHtwcm90b2N9IHtqYXZhX291dH0ge2luY2x1ZGV9IHtwcm90b19maWxlc30KLQotVGhpcyBpcyBhIGhlbHBlciBmaWxlIGZvciB0aGUgcHJvdG9idWZfbGl0ZV9qYXZhX2dlbl9kZXNjcmlwdG9yX3Byb3RvIGFjdGlvbiBpbgotcHJvdG9idWYuZ3lwLgotCi1JdCBwZXJmb3JtcyB0aGUgZm9sbG93aW5nIHN0ZXBzOgotMS4gUmVjdXJzaXZlbHkgZGVsZXRlcyBvbGQgamF2YV9vdXQgZGlyZWN0b3J5LgotMi4gQ3JlYXRlcyBqYXZhX291dCBkaXJlY3RvcnkuCi0zLiBHZW5lcmF0ZXMgSmF2YSBkZXNjcmlwdG9yIHByb3RvIGZpbGUgdXNpbmcgcHJvdG9jLgotIiIiCi0KLWltcG9ydCBvcwotaW1wb3J0IHNodXRpbAotaW1wb3J0IHN1YnByb2Nlc3MKLWltcG9ydCBzeXMKLQotZGVmIG1haW4oYXJndik6Ci0gIGlmIGxlbihhcmd2KSA8IDQ6Ci0gICAgdXNhZ2UoKQotICAgIHJldHVybiAxCi0KLSAgcHJvdG9jX3BhdGgsIGphdmFfb3V0LCBpbmNsdWRlID0gYXJndlsxOjRdCi0gIHByb3RvX2ZpbGVzID0gYXJndls0Ol0KLQotICAjIERlbGV0ZSBhbGwgb2xkIHNvdXJjZXMKLSAgaWYgb3MucGF0aC5leGlzdHMoamF2YV9vdXQpOgotICAgIHNodXRpbC5ybXRyZWUoamF2YV9vdXQpCi0KLSAgIyBDcmVhdGUgc291cmNlIGRpcmVjdG9yeQotICBvcy5tYWtlZGlycyhqYXZhX291dCkKLQotICAjIEdlbmVyYXRlIEphdmEgZmlsZXMgdXNpbmcgcHJvdG9jCi0gIHJldHVybiBzdWJwcm9jZXNzLmNhbGwoCi0gICAgICBbcHJvdG9jX3BhdGgsICctLWphdmFfb3V0JywgamF2YV9vdXQsICctSScgKyBpbmNsdWRlXQotICAgICAgKyBwcm90b19maWxlcykKLQotZGVmIHVzYWdlKCk6Ci0gIHByaW50KF9fZG9jX18pOwotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICBzeXMuZXhpdChtYWluKHN5cy5hcmd2KSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2J1Zl9saXRlX2phdmFfcGFyc2VfcG9tLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfamF2YV9wYXJzZV9wb20ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDY3NWM1Y2YuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYnVmX2xpdGVfamF2YV9wYXJzZV9wb20ucHkKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0jIS91c3IvYmluL2VudiBweXRob24KLSMgQ29weXJpZ2h0IChjKSAyMDEyIFRoZSBDaHJvbWl1bSBBdXRob3JzLiBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBVc2Ugb2YgdGhpcyBzb3VyY2UgY29kZSBpcyBnb3Zlcm5lZCBieSBhIEJTRC1zdHlsZSBsaWNlbnNlIHRoYXQgY2FuIGJlCi0jIGZvdW5kIGluIHRoZSBMSUNFTlNFIGZpbGUuCi0KLSIiIlBhcnNlcyB0aGUgTWF2ZW4gcG9tLnhtbCBmaWxlIGZvciB3aGljaCBmaWxlcyB0byBpbmNsdWRlIGluIGEgbGl0ZSBidWlsZC4KLQotVXNhZ2U6Ci0gICAgcHJvdG9idWZfbGl0ZV9qYXZhX3BhcnNlX3BvbS5weSB7cGF0aCB0byBwb20ueG1sfQotCi1UaGlzIGlzIGEgaGVscGVyIGZpbGUgZm9yIHRoZSBwcm90b2J1Zl9saXRlX2phdmEgdGFyZ2V0IGluIHByb3RvYnVmLmd5cC4KLQotSXQgcGFyc2VzIHRoZSBwb20ueG1sIGZpbGUsIGFuZCBsb29rcyBmb3IgYWxsIHRoZSBpbmNsdWRlcyBzcGVjaWZpZWQgaW4gdGhlCi0nbGl0ZScgcHJvZmlsZS4gSXQgZG9lcyBub3QgcmV0dXJuIGFuZCB0ZXN0IGluY2x1ZGVzLgotCi1UaGUgcmVzdWx0IGlzIHByaW50ZWQgYXMgb25lIGxpbmUgcGVyIGVudHJ5LgotIiIiCi0KLWltcG9ydCBzeXMKLQotZnJvbSB4bWwuZXRyZWUgaW1wb3J0IEVsZW1lbnRUcmVlCi0KLWRlZiBtYWluKGFyZ3YpOgotICBpZiAobGVuKGFyZ3YpIDwgMik6Ci0gICAgdXNhZ2UoKQotICAgIHJldHVybiAxCi0KLSAgIyBTZXR1cCBhbGwgZmlsZSBhbmQgWE1MIHF1ZXJ5IHBhdGhzLgotICBwb21fcGF0aCA9IGFyZ3ZbMV0KLSAgbmFtZXNwYWNlID0gIntodHRwOi8vbWF2ZW4uYXBhY2hlLm9yZy9QT00vNC4wLjB9IgotICBwcm9maWxlX3BhdGggPSAnezB9cHJvZmlsZXMvezB9cHJvZmlsZScuZm9ybWF0KG5hbWVzcGFjZSkKLSAgaWRfcGF0aCA9ICd7MH1pZCcuZm9ybWF0KG5hbWVzcGFjZSkKLSAgcGx1Z2luX3BhdGggPSBcCi0gICAgJ3swfWJ1aWxkL3swfXBsdWdpbnMvezB9cGx1Z2luJy5mb3JtYXQobmFtZXNwYWNlKQotICBhcnRpZmFjdF9wYXRoID0gJ3swfWFydGlmYWN0SWQnLmZvcm1hdChuYW1lc3BhY2UpCi0gIGluY2x1ZGVfcGF0aCA9ICd7MH1jb25maWd1cmF0aW9uL3swfWluY2x1ZGVzL3swfWluY2x1ZGUnLmZvcm1hdChuYW1lc3BhY2UpCi0KLSAgIyBQYXJzZSBYTUwgZmlsZSBhbmQgc3RvcmUgcmVzdWx0IGluIGluY2x1ZGVzIGxpc3QuCi0gIGluY2x1ZGVzID0gW10KLSAgZm9yIHByb2ZpbGUgaW4gRWxlbWVudFRyZWUucGFyc2UocG9tX3BhdGgpLmdldHJvb3QoKS5maW5kYWxsKHByb2ZpbGVfcGF0aCk6Ci0gICAgaWRfZWxlbWVudCA9IHByb2ZpbGUuZmluZChpZF9wYXRoKQotICAgIGlmIChpZF9lbGVtZW50IGlzIG5vdCBOb25lIGFuZCBpZF9lbGVtZW50LnRleHQgPT0gJ2xpdGUnKToKLSAgICAgIGZvciBwbHVnaW4gaW4gcHJvZmlsZS5maW5kYWxsKHBsdWdpbl9wYXRoKToKLSAgICAgICAgYXJ0aWZhY3RfZWxlbWVudCA9IHBsdWdpbi5maW5kKGFydGlmYWN0X3BhdGgpCi0gICAgICAgIGlmIChhcnRpZmFjdF9lbGVtZW50IGlzIG5vdCBOb25lIGFuZAotICAgICAgICAgICAgYXJ0aWZhY3RfZWxlbWVudC50ZXh0ID09ICdtYXZlbi1jb21waWxlci1wbHVnaW4nKToKLSAgICAgICAgICBmb3IgaW5jbHVkZSBpbiBwbHVnaW4uZmluZGFsbChpbmNsdWRlX3BhdGgpOgotICAgICAgICAgICAgaW5jbHVkZXMuYXBwZW5kKGluY2x1ZGUudGV4dCkKLQotICAjIFByaW50IHJlc3VsdCB0byBzdGRvdXQsIG9uZSBpdGVtIG9uIGVhY2ggbGluZS4KLSAgcHJpbnQgJ1xuJy5qb2luKGluY2x1ZGVzKQotCi1kZWYgdXNhZ2UoKToKLSAgcHJpbnQoX19kb2NfXyk7Ci0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHN5cy5leGl0KG1haW4oc3lzLmFyZ3YpKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9jLWFydGlmYWN0cy9Eb2NrZXJmaWxlIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYy1hcnRpZmFjdHMvRG9ja2VyZmlsZQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9jLWFydGlmYWN0cy9Eb2NrZXJmaWxlCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9jLWFydGlmYWN0cy9Eb2NrZXJmaWxlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9wcm90b2MtYXJ0aWZhY3RzL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2MtYXJ0aWZhY3RzL1JFQURNRS5tZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9jLWFydGlmYWN0cy9SRUFETUUubWQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2MtYXJ0aWZhY3RzL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvcHJvdG9jLWFydGlmYWN0cy9idWlsZC1wcm90b2Muc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9jLWFydGlmYWN0cy9idWlsZC1wcm90b2Muc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3Byb3RvYy1hcnRpZmFjdHMvYnVpbGQtcHJvdG9jLnNoCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHJvdG9jLWFydGlmYWN0cy9idWlsZC1wcm90b2Muc2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3Byb3RvYy1hcnRpZmFjdHMvcG9tLnhtbCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9wcm90b2MtYXJ0aWZhY3RzL3BvbS54bWwKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3Byb3RvYy1hcnRpZmFjdHMvcG9tLnhtbApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3Byb3RvYy1hcnRpZmFjdHMvcG9tLnhtbApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9SRUFETUUudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9SRUFETUUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2ZGMxNDRlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vUkVBRE1FLnR4dAorKysgL2Rldi9udWxsCkBAIC0xLDEwMCArMCwwIEBACi1Qcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLUNvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuCi0KLVRoaXMgZGlyZWN0b3J5IGNvbnRhaW5zIHRoZSBQeXRob24gUHJvdG9jb2wgQnVmZmVycyBydW50aW1lIGxpYnJhcnkuCi0KLU5vcm1hbGx5LCB0aGlzIGRpcmVjdG9yeSBjb21lcyBhcyBwYXJ0IG9mIHRoZSBwcm90b2J1ZiBwYWNrYWdlLCBhdmFpbGFibGUKLWZyb206Ci0KLSAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmCi0KLVRoZSBjb21wbGV0ZSBwYWNrYWdlIGluY2x1ZGVzIHRoZSBDKysgc291cmNlIGNvZGUsIHdoaWNoIGluY2x1ZGVzIHRoZQotUHJvdG9jb2wgQ29tcGlsZXIgKHByb3RvYykuICBJZiB5b3UgZG93bmxvYWRlZCB0aGlzIHBhY2thZ2UgZnJvbSBQeVBJCi1vciBzb21lIG90aGVyIFB5dGhvbi1zcGVjaWZpYyBzb3VyY2UsIHlvdSBtYXkgaGF2ZSByZWNlaXZlZCBvbmx5IHRoZQotUHl0aG9uIHBhcnQgb2YgdGhlIGNvZGUuICBJbiB0aGlzIGNhc2UsIHlvdSB3aWxsIG5lZWQgdG8gb2J0YWluIHRoZQotUHJvdG9jb2wgQ29tcGlsZXIgZnJvbSBzb21lIG90aGVyIHNvdXJjZSBiZWZvcmUgeW91IGNhbiB1c2UgdGhpcwotcGFja2FnZS4KLQotRGV2ZWxvcG1lbnQgV2FybmluZwotPT09PT09PT09PT09PT09PT09PQotCi1UaGUgUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIFByb3RvY29sIEJ1ZmZlcnMgaXMgbm90IGFzIG1hdHVyZSBhcyB0aGUgQysrCi1hbmQgSmF2YSBpbXBsZW1lbnRhdGlvbnMuICBJdCBtYXkgYmUgbW9yZSBidWdneSwgYW5kIGl0IGlzIGtub3duIHRvIGJlCi1wcmV0dHkgc2xvdyBhdCB0aGlzIHRpbWUuICBJZiB5b3Ugd291bGQgbGlrZSB0byBoZWxwIGZpeCB0aGVzZSBpc3N1ZXMsCi1qb2luIHRoZSBQcm90b2NvbCBCdWZmZXJzIGRpc2N1c3Npb24gbGlzdCBhbmQgbGV0IHVzIGtub3chCi0KLUluc3RhbGxhdGlvbgotPT09PT09PT09PT09Ci0KLTEpIE1ha2Ugc3VyZSB5b3UgaGF2ZSBQeXRob24gMi40IG9yIG5ld2VyLiAgSWYgaW4gZG91YnQsIHJ1bjoKLQotICAgICAkIHB5dGhvbiAtVgotCi0yKSBJZiB5b3UgZG8gbm90IGhhdmUgc2V0dXB0b29scyBpbnN0YWxsZWQsIG5vdGUgdGhhdCBpdCB3aWxsIGJlCi0gICBkb3dubG9hZGVkIGFuZCBpbnN0YWxsZWQgYXV0b21hdGljYWxseSBhcyBzb29uIGFzIHlvdSBydW4gc2V0dXAucHkuCi0gICBJZiB5b3Ugd291bGQgcmF0aGVyIGluc3RhbGwgaXQgbWFudWFsbHksIHlvdSBtYXkgZG8gc28gYnkgZm9sbG93aW5nCi0gICB0aGUgaW5zdHJ1Y3Rpb25zIG9uIHRoaXMgcGFnZToKLQotICAgICBodHRwOi8vcGVhay50ZWxlY29tbXVuaXR5LmNvbS9EZXZDZW50ZXIvRWFzeUluc3RhbGwjaW5zdGFsbGF0aW9uLWluc3RydWN0aW9ucwotCi0zKSBCdWlsZCB0aGUgQysrIGNvZGUsIG9yIGluc3RhbGwgYSBiaW5hcnkgZGlzdHJpYnV0aW9uIG9mIHByb3RvYy4gIElmCi0gICB5b3UgaW5zdGFsbCBhIGJpbmFyeSBkaXN0cmlidXRpb24sIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIHRoZSBzYW1lCi0gICB2ZXJzaW9uIGFzIHRoaXMgcGFja2FnZS4gIElmIGluIGRvdWJ0LCBydW46Ci0KLSAgICAgJCBwcm90b2MgLS12ZXJzaW9uCi0KLTQpIFJ1biB0aGUgdGVzdHM6Ci0KLSAgICAgJCBweXRob24gc2V0dXAucHkgdGVzdAotCi0gICBJZiBzb21lIHRlc3RzIGZhaWwsIHRoaXMgbGlicmFyeSBtYXkgbm90IHdvcmsgY29ycmVjdGx5IG9uIHlvdXIKLSAgIHN5c3RlbS4gIENvbnRpbnVlIGF0IHlvdXIgb3duIHJpc2suCi0KLSAgIFBsZWFzZSBub3RlIHRoYXQgdGhlcmUgaXMgYSBrbm93biBwcm9ibGVtIHdpdGggc29tZSB2ZXJzaW9ucyBvZgotICAgUHl0aG9uIG9uIEN5Z3dpbiB3aGljaCBjYXVzZXMgdGhlIHRlc3RzIHRvIGZhaWwgYWZ0ZXIgcHJpbnRpbmcgdGhlCi0gICBlcnJvcjogICJzZW1faW5pdDogUmVzb3VyY2UgdGVtcG9yYXJpbHkgdW5hdmFpbGFibGUiLiAgVGhpcyBhcHBlYXJzCi0gICB0byBiZSBhIGJ1ZyBlaXRoZXIgaW4gQ3lnd2luIG9yIGluIFB5dGhvbjoKLSAgICAgaHR0cDovL3d3dy5jeWd3aW4uY29tL21sL2N5Z3dpbi8yMDA1LTA3L21zZzAxMzc4Lmh0bWwKLSAgIFdlIGRvIG5vdCBrbm93IGlmIG9yIHdoZW4gaXQgbWlnaHQgbWUgZml4ZWQuICBXZSBhbHNvIGRvIG5vdCBrbm93Ci0gICBob3cgbGlrZWx5IGl0IGlzIHRoYXQgdGhpcyBidWcgd2lsbCBhZmZlY3QgdXNlcnMgaW4gcHJhY3RpY2UuCi0KLTUpIEluc3RhbGw6Ci0KLSAgICAgJCBweXRob24gc2V0dXAucHkgaW5zdGFsbAotCi0gICBUaGlzIHN0ZXAgbWF5IHJlcXVpcmUgc3VwZXJ1c2VyIHByaXZpbGVnZXMuCi0gICBOT1RFOiBUbyB1c2UgQysrIGltcGxlbWVudGF0aW9uLCB5b3UgbmVlZCB0byBpbnN0YWxsIEMrKyBwcm90b2J1ZiBydW50aW1lCi0gICBsaWJyYXJ5IG9mIHRoZSBzYW1lIHZlcnNpb24gYW5kIGV4cG9ydCB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgYmVmb3JlIHRoaXMKLSAgIHN0ZXAuIFNlZSB0aGUgIkMrKyBJbXBsZW1lbnRhdGlvbiIgc2VjdGlvbiBiZWxvdyBmb3IgbW9yZSBkZXRhaWxzLgotCi1Vc2FnZQotPT09PT0KLQotVGhlIGNvbXBsZXRlIGRvY3VtZW50YXRpb24gZm9yIFByb3RvY29sIEJ1ZmZlcnMgaXMgYXZhaWxhYmxlIHZpYSB0aGUKLXdlYiBhdDoKLQotICBodHRwOi8vY29kZS5nb29nbGUuY29tL2FwaXMvcHJvdG9jb2xidWZmZXJzLwotCi1DKysgSW1wbGVtZW50YXRpb24KLT09PT09PT09PT09PT09PT09PQotCi1XQVJOSU5HOiBUaGlzIGlzIEVYUEVSSU1FTlRBTCBhbmQgb25seSBhdmFpbGFibGUgZm9yIENQeXRob24gcGxhdGZvcm1zLgotCi1UaGUgQysrIGltcGxlbWVudGF0aW9uIGZvciBQeXRob24gbWVzc2FnZXMgaXMgYnVpbHQgYXMgYSBQeXRob24gZXh0ZW5zaW9uIHRvCi1pbXByb3ZlIHRoZSBvdmVyYWxsIHByb3RvYnVmIFB5dGhvbiBwZXJmb3JtYW5jZS4KLQotVG8gdXNlIHRoZSBDKysgaW1wbGVtZW50YXRpb24sIHlvdSBuZWVkIHRvOgotMSkgSW5zdGFsbCB0aGUgQysrIHByb3RvYnVmIHJ1bnRpbWUgbGlicmFyeSwgcGxlYXNlIHNlZSBpbnN0cnVjdGlvbnMgaW4gdGhlCi0gICBwYXJlbnQgZGlyZWN0b3J5LgotMikgRXhwb3J0IGFuIGVudmlyb25tZW50IHZhcmlhYmxlOgotCi0gICQgZXhwb3J0IFBST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OPWNwcAotCi1Zb3UgbmVlZCB0byBleHBvcnQgdGhpcyB2YXJpYWJsZSBiZWZvcmUgcnVubmluZyBzZXR1cC5weSBzY3JpcHQgdG8gYnVpbGQgYW5kCi1pbnN0YWxsIHRoZSBleHRlbnNpb24uICBZb3UgbXVzdCBhbHNvIHNldCB0aGUgdmFyaWFibGUgYXQgcnVudGltZSwgb3RoZXJ3aXNlCi10aGUgcHVyZS1QeXRob24gaW1wbGVtZW50YXRpb24gd2lsbCBiZSB1c2VkLiBJbiBhIGZ1dHVyZSByZWxlYXNlLCB3ZSB3aWxsCi1jaGFuZ2UgdGhlIGRlZmF1bHQgc28gdGhhdCBDKysgaW1wbGVtZW50YXRpb24gaXMgdXNlZCB3aGVuZXZlciBpdCBpcyBhdmFpbGFibGUuCi1JdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBydW4gYHB5dGhvbiBzZXR1cC5weSB0ZXN0YCBhZnRlciBzZXR0aW5nIHRoZQotdmFyaWFibGUgdG8gImNwcCIsIHNvIHRoZSB0ZXN0cyB3aWxsIGJlIGFnYWluc3QgQysrIGltcGxlbWVudGVkIFB5dGhvbgotbWVzc2FnZXMuCi0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZXpfc2V0dXAucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2V6X3NldHVwLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBhMmNmNzc3Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZXpfc2V0dXAucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyODMgKzAsMCBAQAotIyFweXRob24KLQotIyBUaGlzIGZpbGUgd2FzIG9idGFpbmVkIGZyb206Ci0jICAgaHR0cDovL3BlYWsudGVsZWNvbW11bml0eS5jb20vZGlzdC9lel9zZXR1cC5weQotIyBvbiAyMDExLzEvMjEuCi0KLSIiIkJvb3RzdHJhcCBzZXR1cHRvb2xzIGluc3RhbGxhdGlvbgotCi1JZiB5b3Ugd2FudCB0byB1c2Ugc2V0dXB0b29scyBpbiB5b3VyIHBhY2thZ2UncyBzZXR1cC5weSwganVzdCBpbmNsdWRlIHRoaXMKLWZpbGUgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdpdGggaXQsIGFuZCBhZGQgdGhpcyB0byB0aGUgdG9wIG9mIHlvdXIgc2V0dXAucHk6OgotCi0gICAgZnJvbSBlel9zZXR1cCBpbXBvcnQgdXNlX3NldHVwdG9vbHMKLSAgICB1c2Vfc2V0dXB0b29scygpCi0KLUlmIHlvdSB3YW50IHRvIHJlcXVpcmUgYSBzcGVjaWZpYyB2ZXJzaW9uIG9mIHNldHVwdG9vbHMsIHNldCBhIGRvd25sb2FkCi1taXJyb3IsIG9yIHVzZSBhbiBhbHRlcm5hdGUgZG93bmxvYWQgZGlyZWN0b3J5LCB5b3UgY2FuIGRvIHNvIGJ5IHN1cHBseWluZwotdGhlIGFwcHJvcHJpYXRlIG9wdGlvbnMgdG8gYGB1c2Vfc2V0dXB0b29scygpYGAuCi0KLVRoaXMgZmlsZSBjYW4gYWxzbyBiZSBydW4gYXMgYSBzY3JpcHQgdG8gaW5zdGFsbCBvciB1cGdyYWRlIHNldHVwdG9vbHMuCi0iIiIKLWltcG9ydCBzeXMKLURFRkFVTFRfVkVSU0lPTiA9ICIwLjZjMTEiCi1ERUZBVUxUX1VSTCAgICAgPSAiaHR0cDovL3B5cGkucHl0aG9uLm9yZy9wYWNrYWdlcy8lcy9zL3NldHVwdG9vbHMvIiAlIHN5cy52ZXJzaW9uWzozXQotCi1tZDVfZGF0YSA9IHsKLSAgICAnc2V0dXB0b29scy0wLjZiMS1weTIuMy5lZ2cnOiAnODgyMmNhZjkwMTI1MGQ4NDhiOTk2YjdmMjVjNmU2Y2EnLAotICAgICdzZXR1cHRvb2xzLTAuNmIxLXB5Mi40LmVnZyc6ICdiNzlhOGE0MDNlNDUwMmZiYjg1ZWUzZjE5NDE3MzVjYicsCi0gICAgJ3NldHVwdG9vbHMtMC42YjItcHkyLjMuZWdnJzogJzU2NTc3NTlkOGE2ZDhmYzQ0MDcwYTlkMDcyNzJkOTliJywKLSAgICAnc2V0dXB0b29scy0wLjZiMi1weTIuNC5lZ2cnOiAnNDk5NmE4ZDE2OWQyYmU2NjFmYTMyYTZlNTJlNGY4MmEnLAotICAgICdzZXR1cHRvb2xzLTAuNmIzLXB5Mi4zLmVnZyc6ICdiYjMxYzBmYzczOTlhNjM1Nzk5NzVjYWQ5ZjVhMDYxOCcsCi0gICAgJ3NldHVwdG9vbHMtMC42YjMtcHkyLjQuZWdnJzogJzM4YThjNmIzZDZlY2QyMjI0N2YxNzlmN2RhNjY5ZmFjJywKLSAgICAnc2V0dXB0b29scy0wLjZiNC1weTIuMy5lZ2cnOiAnNjIwNDVhMjRlZDRlMWViYzc3ZmUwMzlhYTRlNmY3ZTUnLAotICAgICdzZXR1cHRvb2xzLTAuNmI0LXB5Mi40LmVnZyc6ICc0Y2IyYTE4NWQyMjhkYWNmZmIyZDE3ZjEwM2IzYjFjNCcsCi0gICAgJ3NldHVwdG9vbHMtMC42YzEtcHkyLjMuZWdnJzogJ2IzZjJiNTUzOWQ2NWNiN2Y3NGFkNzkxMjdmMWE5MDhjJywKLSAgICAnc2V0dXB0b29scy0wLjZjMS1weTIuNC5lZ2cnOiAnYjQ1YWRlZGEwNjY3ZDJkMmZmZTE0MDA5MzY0ZjJhNGInLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMC1weTIuMy5lZ2cnOiAnY2UxZTJhYjVkM2EwMjU2NDU2ZDlmYzEzODAwYTcwOTAnLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMC1weTIuNC5lZ2cnOiAnNTdkNmQ5ZDZlOWI4MDc3MmM1OWE1M2E4NDMzYTVkZDQnLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMC1weTIuNS5lZ2cnOiAnZGU0NmFjOGIxYzk3Yzg5NTU3MmU1ZTg1OTZhZWI4YzcnLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMC1weTIuNi5lZ2cnOiAnNThlYTQwYWVmMDZkYTAyY2U2NDE0OTU1MjNhMGI3ZjUnLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMS1weTIuMy5lZ2cnOiAnMmJhZWFjNmUxM2Q0MTRhOWQyOGU3YmE1YjVhNTk2ZGUnLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMS1weTIuNC5lZ2cnOiAnYmQ2MzlmOWIwZWFjNGM0MjQ5NzAzNGRlYzJlYzBjMmInLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMS1weTIuNS5lZ2cnOiAnNjRjOTRmM2JmN2E3MmExM2VjODNlMGIyNGYyNzQ5YjInLAotICAgICdzZXR1cHRvb2xzLTAuNmMxMS1weTIuNi5lZ2cnOiAnYmZhOTIxMDBiZDc3MmQ1YTIxM2VlZGQzNTZkNjQwODYnLAotICAgICdzZXR1cHRvb2xzLTAuNmMyLXB5Mi4zLmVnZyc6ICdmMDA2NGJmNmFhMmI3ZDBmM2JhMGI0M2YyMDgxN2MyNycsCi0gICAgJ3NldHVwdG9vbHMtMC42YzItcHkyLjQuZWdnJzogJzYxNjE5MmVlYzM1ZjQ3ZThlYTE2Y2Q2YTEyMmI3Mjc3JywKLSAgICAnc2V0dXB0b29scy0wLjZjMy1weTIuMy5lZ2cnOiAnZjE4MWZhMTI1ZGZlODVhMjU5YzljZDZmMWQ3Yjc4ZmEnLAotICAgICdzZXR1cHRvb2xzLTAuNmMzLXB5Mi40LmVnZyc6ICdlMGVkNzQ2ODJjOTk4YmZiNzNiZjgwM2E1MGU3YjcxZScsCi0gICAgJ3NldHVwdG9vbHMtMC42YzMtcHkyLjUuZWdnJzogJ2FiZWYxNmZkZDYxOTU1NTE0ODQxYzdjNmJkOTg5NjVlJywKLSAgICAnc2V0dXB0b29scy0wLjZjNC1weTIuMy5lZ2cnOiAnYjBiOTEzMWFjYWIzMjAyMmJmYWM3ZjQ0YzVkNzk3MWYnLAotICAgICdzZXR1cHRvb2xzLTAuNmM0LXB5Mi40LmVnZyc6ICcyYTFmOTY1NmQ0ZmJmM2M5N2JmOTQ2YzBhMTI0ZTZlMicsCi0gICAgJ3NldHVwdG9vbHMtMC42YzQtcHkyLjUuZWdnJzogJzhmNWEwNTJlMzJjZGI5YzcyYmNmNGI1NTI2ZjI4YWZjJywKLSAgICAnc2V0dXB0b29scy0wLjZjNS1weTIuMy5lZ2cnOiAnZWU5ZmQ4MDk2NWRhMDRmMmYzZTZiMzU3NmU5ZDgxNjcnLAotICAgICdzZXR1cHRvb2xzLTAuNmM1LXB5Mi40LmVnZyc6ICdhZmUyYWRmMWMwMTcwMWVlODQxNzYxZjViY2Q4YWE2NCcsCi0gICAgJ3NldHVwdG9vbHMtMC42YzUtcHkyLjUuZWdnJzogJ2E4ZDNmNjE0OTRjY2FhODcxNGRmZWQzN2JjY2QzZDVkJywKLSAgICAnc2V0dXB0b29scy0wLjZjNi1weTIuMy5lZ2cnOiAnMzU2ODZiNzgxMTZhNjY4ODQ3MjM3YjY5ZDU0OWVjMjAnLAotICAgICdzZXR1cHRvb2xzLTAuNmM2LXB5Mi40LmVnZyc6ICczYzU2YWY1N2JlMzIyNTAxOTI2MGE2NDQ0MzAwNjVhYicsCi0gICAgJ3NldHVwdG9vbHMtMC42YzYtcHkyLjUuZWdnJzogJ2IyZjhhNzUyMDcwOWE1YjM0ZjgwOTQ2ZGU1ZjAyZjUzJywKLSAgICAnc2V0dXB0b29scy0wLjZjNy1weTIuMy5lZ2cnOiAnMjA5ZmRmOWFkYzNhNjE1ZTUxMTViNzI1NjU4ZTEzZTInLAotICAgICdzZXR1cHRvb2xzLTAuNmM3LXB5Mi40LmVnZyc6ICc1YThmOTU0ODA3ZDQ2YTBmYjY3Y2YxZjI2YzU1YTgyZScsCi0gICAgJ3NldHVwdG9vbHMtMC42YzctcHkyLjUuZWdnJzogJzQ1ZDJhZDI4Zjk3NTBlNzQzNDExMWZkZTgzMWU4MzcyJywKLSAgICAnc2V0dXB0b29scy0wLjZjOC1weTIuMy5lZ2cnOiAnNTA3NTlkMjliMzQ5ZGI4Y2ZkODA3YmE4MzAzZjE5MDInLAotICAgICdzZXR1cHRvb2xzLTAuNmM4LXB5Mi40LmVnZyc6ICdjYmEzOGQ3NGY3ZDQ4M2MwNmU5ZGFhNjA3MGNjZTZkZScsCi0gICAgJ3NldHVwdG9vbHMtMC42YzgtcHkyLjUuZWdnJzogJzE3MjE3NDdlZTMyOWRjMTUwNTkwYTU4YjNlMWFjOTViJywKLSAgICAnc2V0dXB0b29scy0wLjZjOS1weTIuMy5lZ2cnOiAnYTgzYzQwMjA0MTQ4MDdiNDk2ZTRjZmJlMDg1MDdjMDMnLAotICAgICdzZXR1cHRvb2xzLTAuNmM5LXB5Mi40LmVnZyc6ICcyNjBhMmJlMmU1Mzg4ZDY2YmRhZWUwNmFiZWM2MzQyYScsCi0gICAgJ3NldHVwdG9vbHMtMC42YzktcHkyLjUuZWdnJzogJ2ZlNjdjM2U1YTE3YjEyYzBlN2M1NDFiN2VhNDNhOGU2JywKLSAgICAnc2V0dXB0b29scy0wLjZjOS1weTIuNi5lZ2cnOiAnY2EzN2IxZmYxNmZhMmVkZTZlMTkzODNlN2I1OTI0NWEnLAotfQotCi1pbXBvcnQgc3lzLCBvcwotdHJ5OiBmcm9tIGhhc2hsaWIgaW1wb3J0IG1kNQotZXhjZXB0IEltcG9ydEVycm9yOiBmcm9tIG1kNSBpbXBvcnQgbWQ1Ci0KLWRlZiBfdmFsaWRhdGVfbWQ1KGVnZ19uYW1lLCBkYXRhKToKLSAgICBpZiBlZ2dfbmFtZSBpbiBtZDVfZGF0YToKLSAgICAgICAgZGlnZXN0ID0gbWQ1KGRhdGEpLmhleGRpZ2VzdCgpCi0gICAgICAgIGlmIGRpZ2VzdCAhPSBtZDVfZGF0YVtlZ2dfbmFtZV06Ci0gICAgICAgICAgICBwcmludCA+PnN5cy5zdGRlcnIsICgKLSAgICAgICAgICAgICAgICAibWQ1IHZhbGlkYXRpb24gb2YgJXMgZmFpbGVkISAgKFBvc3NpYmxlIGRvd25sb2FkIHByb2JsZW0/KSIKLSAgICAgICAgICAgICAgICAlIGVnZ19uYW1lCi0gICAgICAgICAgICApCi0gICAgICAgICAgICBzeXMuZXhpdCgyKQotICAgIHJldHVybiBkYXRhCi0KLWRlZiB1c2Vfc2V0dXB0b29scygKLSAgICB2ZXJzaW9uPURFRkFVTFRfVkVSU0lPTiwgZG93bmxvYWRfYmFzZT1ERUZBVUxUX1VSTCwgdG9fZGlyPW9zLmN1cmRpciwKLSAgICBkb3dubG9hZF9kZWxheT0xNQotKToKLSAgICAiIiJBdXRvbWF0aWNhbGx5IGZpbmQvZG93bmxvYWQgc2V0dXB0b29scyBhbmQgbWFrZSBpdCBhdmFpbGFibGUgb24gc3lzLnBhdGgKLQotICAgIGB2ZXJzaW9uYCBzaG91bGQgYmUgYSB2YWxpZCBzZXR1cHRvb2xzIHZlcnNpb24gbnVtYmVyIHRoYXQgaXMgYXZhaWxhYmxlCi0gICAgYXMgYW4gZWdnIGZvciBkb3dubG9hZCB1bmRlciB0aGUgYGRvd25sb2FkX2Jhc2VgIFVSTCAod2hpY2ggc2hvdWxkIGVuZCB3aXRoCi0gICAgYSAnLycpLiAgYHRvX2RpcmAgaXMgdGhlIGRpcmVjdG9yeSB3aGVyZSBzZXR1cHRvb2xzIHdpbGwgYmUgZG93bmxvYWRlZCwgaWYKLSAgICBpdCBpcyBub3QgYWxyZWFkeSBhdmFpbGFibGUuICBJZiBgZG93bmxvYWRfZGVsYXlgIGlzIHNwZWNpZmllZCwgaXQgc2hvdWxkCi0gICAgYmUgdGhlIG51bWJlciBvZiBzZWNvbmRzIHRoYXQgd2lsbCBiZSBwYXVzZWQgYmVmb3JlIGluaXRpYXRpbmcgYSBkb3dubG9hZCwKLSAgICBzaG91bGQgb25lIGJlIHJlcXVpcmVkLiAgSWYgYW4gb2xkZXIgdmVyc2lvbiBvZiBzZXR1cHRvb2xzIGlzIGluc3RhbGxlZCwKLSAgICB0aGlzIHJvdXRpbmUgd2lsbCBwcmludCBhIG1lc3NhZ2UgdG8gYGBzeXMuc3RkZXJyYGAgYW5kIHJhaXNlIFN5c3RlbUV4aXQgaW4KLSAgICBhbiBhdHRlbXB0IHRvIGFib3J0IHRoZSBjYWxsaW5nIHNjcmlwdC4KLSAgICAiIiIKLSAgICB3YXNfaW1wb3J0ZWQgPSAncGtnX3Jlc291cmNlcycgaW4gc3lzLm1vZHVsZXMgb3IgJ3NldHVwdG9vbHMnIGluIHN5cy5tb2R1bGVzCi0gICAgZGVmIGRvX2Rvd25sb2FkKCk6Ci0gICAgICAgIGVnZyA9IGRvd25sb2FkX3NldHVwdG9vbHModmVyc2lvbiwgZG93bmxvYWRfYmFzZSwgdG9fZGlyLCBkb3dubG9hZF9kZWxheSkKLSAgICAgICAgc3lzLnBhdGguaW5zZXJ0KDAsIGVnZykKLSAgICAgICAgaW1wb3J0IHNldHVwdG9vbHM7IHNldHVwdG9vbHMuYm9vdHN0cmFwX2luc3RhbGxfZnJvbSA9IGVnZwotICAgIHRyeToKLSAgICAgICAgaW1wb3J0IHBrZ19yZXNvdXJjZXMKLSAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgIHJldHVybiBkb19kb3dubG9hZCgpICAgICAgIAotICAgIHRyeToKLSAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKCJzZXR1cHRvb2xzPj0iK3ZlcnNpb24pOyByZXR1cm4KLSAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3QsIGU6Ci0gICAgICAgIGlmIHdhc19pbXBvcnRlZDoKLSAgICAgICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgKAotICAgICAgICAgICAgIlRoZSByZXF1aXJlZCB2ZXJzaW9uIG9mIHNldHVwdG9vbHMgKD49JXMpIGlzIG5vdCBhdmFpbGFibGUsIGFuZFxuIgotICAgICAgICAgICAgImNhbid0IGJlIGluc3RhbGxlZCB3aGlsZSB0aGlzIHNjcmlwdCBpcyBydW5uaW5nLiBQbGVhc2UgaW5zdGFsbFxuIgotICAgICAgICAgICAgIiBhIG1vcmUgcmVjZW50IHZlcnNpb24gZmlyc3QsIHVzaW5nICdlYXN5X2luc3RhbGwgLVUgc2V0dXB0b29scycuIgotICAgICAgICAgICAgIlxuXG4oQ3VycmVudGx5IHVzaW5nICVyKSIKLSAgICAgICAgICAgICkgJSAodmVyc2lvbiwgZS5hcmdzWzBdKQotICAgICAgICAgICAgc3lzLmV4aXQoMikKLSAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5EaXN0cmlidXRpb25Ob3RGb3VuZDoKLSAgICAgICAgcGFzcwotCi0gICAgZGVsIHBrZ19yZXNvdXJjZXMsIHN5cy5tb2R1bGVzWydwa2dfcmVzb3VyY2VzJ10gICAgIyByZWxvYWQgb2sKLSAgICByZXR1cm4gZG9fZG93bmxvYWQoKQotCi1kZWYgZG93bmxvYWRfc2V0dXB0b29scygKLSAgICB2ZXJzaW9uPURFRkFVTFRfVkVSU0lPTiwgZG93bmxvYWRfYmFzZT1ERUZBVUxUX1VSTCwgdG9fZGlyPW9zLmN1cmRpciwKLSAgICBkZWxheSA9IDE1Ci0pOgotICAgICIiIkRvd25sb2FkIHNldHVwdG9vbHMgZnJvbSBhIHNwZWNpZmllZCBsb2NhdGlvbiBhbmQgcmV0dXJuIGl0cyBmaWxlbmFtZQotCi0gICAgYHZlcnNpb25gIHNob3VsZCBiZSBhIHZhbGlkIHNldHVwdG9vbHMgdmVyc2lvbiBudW1iZXIgdGhhdCBpcyBhdmFpbGFibGUKLSAgICBhcyBhbiBlZ2cgZm9yIGRvd25sb2FkIHVuZGVyIHRoZSBgZG93bmxvYWRfYmFzZWAgVVJMICh3aGljaCBzaG91bGQgZW5kCi0gICAgd2l0aCBhICcvJykuIGB0b19kaXJgIGlzIHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGVnZyB3aWxsIGJlIGRvd25sb2FkZWQuCi0gICAgYGRlbGF5YCBpcyB0aGUgbnVtYmVyIG9mIHNlY29uZHMgdG8gcGF1c2UgYmVmb3JlIGFuIGFjdHVhbCBkb3dubG9hZCBhdHRlbXB0LgotICAgICIiIgotICAgIGltcG9ydCB1cmxsaWIyLCBzaHV0aWwKLSAgICBlZ2dfbmFtZSA9ICJzZXR1cHRvb2xzLSVzLXB5JXMuZWdnIiAlICh2ZXJzaW9uLHN5cy52ZXJzaW9uWzozXSkKLSAgICB1cmwgPSBkb3dubG9hZF9iYXNlICsgZWdnX25hbWUKLSAgICBzYXZldG8gPSBvcy5wYXRoLmpvaW4odG9fZGlyLCBlZ2dfbmFtZSkKLSAgICBzcmMgPSBkc3QgPSBOb25lCi0gICAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNhdmV0byk6ICAjIEF2b2lkIHJlcGVhdGVkIGRvd25sb2FkcwotICAgICAgICB0cnk6Ci0gICAgICAgICAgICBmcm9tIGRpc3R1dGlscyBpbXBvcnQgbG9nCi0gICAgICAgICAgICBpZiBkZWxheToKLSAgICAgICAgICAgICAgICBsb2cud2FybigiIiIKLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotVGhpcyBzY3JpcHQgcmVxdWlyZXMgc2V0dXB0b29scyB2ZXJzaW9uICVzIHRvIHJ1biAoZXZlbiB0byBkaXNwbGF5Ci1oZWxwKS4gIEkgd2lsbCBhdHRlbXB0IHRvIGRvd25sb2FkIGl0IGZvciB5b3UgKGZyb20KLSVzKSwgYnV0Ci15b3UgbWF5IG5lZWQgdG8gZW5hYmxlIGZpcmV3YWxsIGFjY2VzcyBmb3IgdGhpcyBzY3JpcHQgZmlyc3QuCi1JIHdpbGwgc3RhcnQgdGhlIGRvd25sb2FkIGluICVkIHNlY29uZHMuCi0KLShOb3RlOiBpZiB0aGlzIG1hY2hpbmUgZG9lcyBub3QgaGF2ZSBuZXR3b3JrIGFjY2VzcywgcGxlYXNlIG9idGFpbiB0aGUgZmlsZQotCi0gICAlcwotCi1hbmQgcGxhY2UgaXQgaW4gdGhpcyBkaXJlY3RvcnkgYmVmb3JlIHJlcnVubmluZyB0aGlzIHNjcmlwdC4pCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0iIiIsCi0gICAgICAgICAgICAgICAgICAgIHZlcnNpb24sIGRvd25sb2FkX2Jhc2UsIGRlbGF5LCB1cmwKLSAgICAgICAgICAgICAgICApOyBmcm9tIHRpbWUgaW1wb3J0IHNsZWVwOyBzbGVlcChkZWxheSkKLSAgICAgICAgICAgIGxvZy53YXJuKCJEb3dubG9hZGluZyAlcyIsIHVybCkKLSAgICAgICAgICAgIHNyYyA9IHVybGxpYjIudXJsb3Blbih1cmwpCi0gICAgICAgICAgICAjIFJlYWQvd3JpdGUgYWxsIGluIG9uZSBibG9jaywgc28gd2UgZG9uJ3QgY3JlYXRlIGEgY29ycnVwdCBmaWxlCi0gICAgICAgICAgICAjIGlmIHRoZSBkb3dubG9hZCBpcyBpbnRlcnJ1cHRlZC4KLSAgICAgICAgICAgIGRhdGEgPSBfdmFsaWRhdGVfbWQ1KGVnZ19uYW1lLCBzcmMucmVhZCgpKQotICAgICAgICAgICAgZHN0ID0gb3BlbihzYXZldG8sIndiIik7IGRzdC53cml0ZShkYXRhKQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgc3JjOiBzcmMuY2xvc2UoKQotICAgICAgICAgICAgaWYgZHN0OiBkc3QuY2xvc2UoKQotICAgIHJldHVybiBvcy5wYXRoLnJlYWxwYXRoKHNhdmV0bykKLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLQotCi0KLWRlZiBtYWluKGFyZ3YsIHZlcnNpb249REVGQVVMVF9WRVJTSU9OKToKLSAgICAiIiJJbnN0YWxsIG9yIHVwZ3JhZGUgc2V0dXB0b29scyBhbmQgRWFzeUluc3RhbGwiIiIKLSAgICB0cnk6Ci0gICAgICAgIGltcG9ydCBzZXR1cHRvb2xzCi0gICAgZXhjZXB0IEltcG9ydEVycm9yOgotICAgICAgICBlZ2cgPSBOb25lCi0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGVnZyA9IGRvd25sb2FkX3NldHVwdG9vbHModmVyc2lvbiwgZGVsYXk9MCkKLSAgICAgICAgICAgIHN5cy5wYXRoLmluc2VydCgwLGVnZykKLSAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgotICAgICAgICAgICAgcmV0dXJuIG1haW4obGlzdChhcmd2KStbZWdnXSkgICAjIHdlJ3JlIGRvbmUgaGVyZQotICAgICAgICBmaW5hbGx5OgotICAgICAgICAgICAgaWYgZWdnIGFuZCBvcy5wYXRoLmV4aXN0cyhlZ2cpOgotICAgICAgICAgICAgICAgIG9zLnVubGluayhlZ2cpCi0gICAgZWxzZToKLSAgICAgICAgaWYgc2V0dXB0b29scy5fX3ZlcnNpb25fXyA9PSAnMC4wLjEnOgotICAgICAgICAgICAgcHJpbnQgPj5zeXMuc3RkZXJyLCAoCi0gICAgICAgICAgICAiWW91IGhhdmUgYW4gb2Jzb2xldGUgdmVyc2lvbiBvZiBzZXR1cHRvb2xzIGluc3RhbGxlZC4gIFBsZWFzZVxuIgotICAgICAgICAgICAgInJlbW92ZSBpdCBmcm9tIHlvdXIgc3lzdGVtIGVudGlyZWx5IGJlZm9yZSByZXJ1bm5pbmcgdGhpcyBzY3JpcHQuIgotICAgICAgICAgICAgKQotICAgICAgICAgICAgc3lzLmV4aXQoMikKLQotICAgIHJlcSA9ICJzZXR1cHRvb2xzPj0iK3ZlcnNpb24KLSAgICBpbXBvcnQgcGtnX3Jlc291cmNlcwotICAgIHRyeToKLSAgICAgICAgcGtnX3Jlc291cmNlcy5yZXF1aXJlKHJlcSkKLSAgICBleGNlcHQgcGtnX3Jlc291cmNlcy5WZXJzaW9uQ29uZmxpY3Q6Ci0gICAgICAgIHRyeToKLSAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgotICAgICAgICBleGNlcHQgSW1wb3J0RXJyb3I6Ci0gICAgICAgICAgICBmcm9tIGVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgotICAgICAgICBtYWluKGxpc3QoYXJndikrW2Rvd25sb2FkX3NldHVwdG9vbHMoZGVsYXk9MCldKQotICAgICAgICBzeXMuZXhpdCgwKSAjIHRyeSB0byBmb3JjZSBhbiBleGl0Ci0gICAgZWxzZToKLSAgICAgICAgaWYgYXJndjoKLSAgICAgICAgICAgIGZyb20gc2V0dXB0b29scy5jb21tYW5kLmVhc3lfaW5zdGFsbCBpbXBvcnQgbWFpbgotICAgICAgICAgICAgbWFpbihhcmd2KQotICAgICAgICBlbHNlOgotICAgICAgICAgICAgcHJpbnQgIlNldHVwdG9vbHMgdmVyc2lvbiIsdmVyc2lvbiwib3IgZ3JlYXRlciBoYXMgYmVlbiBpbnN0YWxsZWQuIgotICAgICAgICAgICAgcHJpbnQgJyhSdW4gImV6X3NldHVwLnB5IC1VIHNldHVwdG9vbHMiIHRvIHJlaW5zdGFsbCBvciB1cGdyYWRlLiknCi0KLWRlZiB1cGRhdGVfbWQ1KGZpbGVuYW1lcyk6Ci0gICAgIiIiVXBkYXRlIG91ciBidWlsdC1pbiBtZDUgcmVnaXN0cnkiIiIKLQotICAgIGltcG9ydCByZQotCi0gICAgZm9yIG5hbWUgaW4gZmlsZW5hbWVzOgotICAgICAgICBiYXNlID0gb3MucGF0aC5iYXNlbmFtZShuYW1lKQotICAgICAgICBmID0gb3BlbihuYW1lLCdyYicpCi0gICAgICAgIG1kNV9kYXRhW2Jhc2VdID0gbWQ1KGYucmVhZCgpKS5oZXhkaWdlc3QoKQotICAgICAgICBmLmNsb3NlKCkKLQotICAgIGRhdGEgPSBbIiAgICAlcjogJXIsXG4iICUgaXQgZm9yIGl0IGluIG1kNV9kYXRhLml0ZW1zKCldCi0gICAgZGF0YS5zb3J0KCkKLSAgICByZXBsID0gIiIuam9pbihkYXRhKQotCi0gICAgaW1wb3J0IGluc3BlY3QKLSAgICBzcmNmaWxlID0gaW5zcGVjdC5nZXRzb3VyY2VmaWxlKHN5cy5tb2R1bGVzW19fbmFtZV9fXSkKLSAgICBmID0gb3BlbihzcmNmaWxlLCAncmInKTsgc3JjID0gZi5yZWFkKCk7IGYuY2xvc2UoKQotCi0gICAgbWF0Y2ggPSByZS5zZWFyY2goIlxubWQ1X2RhdGEgPSB7XG4oW159XSspfSIsIHNyYykKLSAgICBpZiBub3QgbWF0Y2g6Ci0gICAgICAgIHByaW50ID4+c3lzLnN0ZGVyciwgIkludGVybmFsIGVycm9yISIKLSAgICAgICAgc3lzLmV4aXQoMikKLQotICAgIHNyYyA9IHNyY1s6bWF0Y2guc3RhcnQoMSldICsgcmVwbCArIHNyY1ttYXRjaC5lbmQoMSk6XQotICAgIGYgPSBvcGVuKHNyY2ZpbGUsJ3cnKQotICAgIGYud3JpdGUoc3JjKQotICAgIGYuY2xvc2UoKQotCi0KLWlmIF9fbmFtZV9fPT0nX19tYWluX18nOgotICAgIGlmIGxlbihzeXMuYXJndik+MiBhbmQgc3lzLmFyZ3ZbMV09PSctLW1kNXVwZGF0ZSc6Ci0gICAgICAgIHVwZGF0ZV9tZDUoc3lzLmFyZ3ZbMjpdKQotICAgIGVsc2U6Ci0gICAgICAgIG1haW4oc3lzLmFyZ3ZbMTpdKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvX19pbml0X18ucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9fX2luaXRfXy5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZGU0MGVhNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9fX2luaXRfXy5weQorKysgL2Rldi9udWxsCkBAIC0xICswLDAgQEAKLV9faW1wb3J0X18oJ3BrZ19yZXNvdXJjZXMnKS5kZWNsYXJlX25hbWVzcGFjZShfX25hbWVfXykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL19faW5pdF9fLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvX19pbml0X18ucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDhkMWM4YjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvX19pbml0X18ucHkKKysrIC9kZXYvbnVsbApAQCAtMSArMCwwIEBACi0gCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2Y2MDliZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTk4ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJEZXNjcmlwdG9ycyBlc3NlbnRpYWxseSBjb250YWluIGV4YWN0bHkgdGhlIGluZm9ybWF0aW9uIGZvdW5kIGluIGEgLnByb3RvCi1maWxlLCBpbiB0eXBlcyB0aGF0IG1ha2UgdGhpcyBpbmZvcm1hdGlvbiBhY2Nlc3NpYmxlIGluIFB5dGhvbi4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJwotCi0KLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBhcGlfaW1wbGVtZW50YXRpb24KLQotCi1pZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgotICBmcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgY3BwX21lc3NhZ2UKLQotCi1jbGFzcyBFcnJvcihFeGNlcHRpb24pOgotICAiIiJCYXNlIGVycm9yIGZvciB0aGlzIG1vZHVsZS4iIiIKLQotCi1jbGFzcyBEZXNjcmlwdG9yQmFzZShvYmplY3QpOgotCi0gICIiIkRlc2NyaXB0b3JzIGJhc2UgY2xhc3MuCi0KLSAgVGhpcyBjbGFzcyBpcyB0aGUgYmFzZSBvZiBhbGwgZGVzY3JpcHRvciBjbGFzc2VzLiBJdCBwcm92aWRlcyBjb21tb24gb3B0aW9ucwotICByZWxhdGVkIGZ1bmN0aW9uYWlsaXR5LgotCi0gIEF0dHJpYnV0ZXM6Ci0gICAgaGFzX29wdGlvbnM6ICBUcnVlIGlmIHRoZSBkZXNjcmlwdG9yIGhhcyBub24tZGVmYXVsdCBvcHRpb25zLiAgVXN1YWxseSBpdAotICAgICAgICBpcyBub3QgbmVjZXNzYXJ5IHRvIHJlYWQgdGhpcyAtLSBqdXN0IGNhbGwgR2V0T3B0aW9ucygpIHdoaWNoIHdpbGwKLSAgICAgICAgaGFwcGlseSByZXR1cm4gdGhlIGRlZmF1bHQgaW5zdGFuY2UuICBIb3dldmVyLCBpdCdzIHNvbWV0aW1lcyB1c2VmdWwKLSAgICAgICAgZm9yIGVmZmljaWVuY3ksIGFuZCBhbHNvIHVzZWZ1bCBpbnNpZGUgdGhlIHByb3RvYnVmIGltcGxlbWVudGF0aW9uIHRvCi0gICAgICAgIGF2b2lkIHNvbWUgYm9vdHN0cmFwcGluZyBpc3N1ZXMuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUpOgotICAgICIiIkluaXRpYWxpemUgdGhlIGRlc2NyaXB0b3IgZ2l2ZW4gaXRzIG9wdGlvbnMgbWVzc2FnZSBhbmQgdGhlIG5hbWUgb2YgdGhlCi0gICAgY2xhc3Mgb2YgdGhlIG9wdGlvbnMgbWVzc2FnZS4gVGhlIG5hbWUgb2YgdGhlIGNsYXNzIGlzIHJlcXVpcmVkIGluIGNhc2UKLSAgICB0aGUgb3B0aW9ucyBtZXNzYWdlIGlzIE5vbmUgYW5kIGhhcyB0byBiZSBjcmVhdGVkLgotICAgICIiIgotICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zCi0gICAgc2VsZi5fb3B0aW9uc19jbGFzc19uYW1lID0gb3B0aW9uc19jbGFzc19uYW1lCi0KLSAgICAjIERvZXMgdGhpcyBkZXNjcmlwdG9yIGhhdmUgbm9uLWRlZmF1bHQgb3B0aW9ucz8KLSAgICBzZWxmLmhhc19vcHRpb25zID0gb3B0aW9ucyBpcyBub3QgTm9uZQotCi0gIGRlZiBHZXRPcHRpb25zKHNlbGYpOgotICAgICIiIlJldHJpZXZlcyBkZXNjcmlwdG9yIG9wdGlvbnMuCi0KLSAgICBUaGlzIG1ldGhvZCByZXR1cm5zIHRoZSBvcHRpb25zIHNldCBvciBjcmVhdGVzIHRoZSBkZWZhdWx0IG9wdGlvbnMgZm9yIHRoZQotICAgIGRlc2NyaXB0b3IuCi0gICAgIiIiCi0gICAgaWYgc2VsZi5fb3B0aW9uczoKLSAgICAgIHJldHVybiBzZWxmLl9vcHRpb25zCi0gICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCi0gICAgdHJ5OgotICAgICAgb3B0aW9uc19jbGFzcyA9IGdldGF0dHIoZGVzY3JpcHRvcl9wYjIsIHNlbGYuX29wdGlvbnNfY2xhc3NfbmFtZSkKLSAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1Vua25vd24gb3B0aW9ucyBjbGFzcyBuYW1lICVzIScgJQotICAgICAgICAgICAgICAgICAgICAgICAgIChzZWxmLl9vcHRpb25zX2NsYXNzX25hbWUpKQotICAgIHNlbGYuX29wdGlvbnMgPSBvcHRpb25zX2NsYXNzKCkKLSAgICByZXR1cm4gc2VsZi5fb3B0aW9ucwotCi0KLWNsYXNzIF9OZXN0ZWREZXNjcmlwdG9yQmFzZShEZXNjcmlwdG9yQmFzZSk6Ci0gICIiIkNvbW1vbiBjbGFzcyBmb3IgZGVzY3JpcHRvcnMgdGhhdCBjYW4gYmUgbmVzdGVkLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBvcHRpb25zLCBvcHRpb25zX2NsYXNzX25hbWUsIG5hbWUsIGZ1bGxfbmFtZSwKLSAgICAgICAgICAgICAgIGZpbGUsIGNvbnRhaW5pbmdfdHlwZSwgc2VyaWFsaXplZF9zdGFydD1Ob25lLAotICAgICAgICAgICAgICAgc2VyaWFsaXplZF9lbmQ9Tm9uZSk6Ci0gICAgIiIiQ29uc3RydWN0b3IuCi0KLSAgICBBcmdzOgotICAgICAgb3B0aW9uczogUHJvdG9jb2wgbWVzc2FnZSBvcHRpb25zIG9yIE5vbmUKLSAgICAgICAgdG8gdXNlIGRlZmF1bHQgbWVzc2FnZSBvcHRpb25zLgotICAgICAgb3B0aW9uc19jbGFzc19uYW1lOiAoc3RyKSBUaGUgY2xhc3MgbmFtZSBvZiB0aGUgYWJvdmUgb3B0aW9ucy4KLQotICAgICAgbmFtZTogKHN0cikgTmFtZSBvZiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZS4KLSAgICAgIGZ1bGxfbmFtZTogKHN0cikgRnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUsCi0gICAgICAgIHdoaWNoIHdpbGwgaW5jbHVkZSBwcm90b2NvbCAicGFja2FnZSIgbmFtZSBhbmQgdGhlIG5hbWUgb2YgYW55Ci0gICAgICAgIGVuY2xvc2luZyB0eXBlcy4KLSAgICAgIGZpbGU6IChGaWxlRGVzY3JpcHRvcikgUmVmZXJlbmNlIHRvIGZpbGUgaW5mby4KLSAgICAgIGNvbnRhaW5pbmdfdHlwZTogaWYgcHJvdmlkZWQsIHRoaXMgaXMgYSBuZXN0ZWQgZGVzY3JpcHRvciwgd2l0aCB0aGlzCi0gICAgICAgIGRlc2NyaXB0b3IgYXMgcGFyZW50LCBvdGhlcndpc2UgTm9uZS4KLSAgICAgIHNlcmlhbGl6ZWRfc3RhcnQ6IFRoZSBzdGFydCBpbmRleCAoaW5jbHVzaXZlKSBpbiBibG9jayBpbiB0aGUKLSAgICAgICAgZmlsZS5zZXJpYWxpemVkX3BiIHRoYXQgZGVzY3JpYmVzIHRoaXMgZGVzY3JpcHRvci4KLSAgICAgIHNlcmlhbGl6ZWRfZW5kOiBUaGUgZW5kIGluZGV4IChleGNsdXNpdmUpIGluIGJsb2NrIGluIHRoZQotICAgICAgICBmaWxlLnNlcmlhbGl6ZWRfcGIgdGhhdCBkZXNjcmliZXMgdGhpcyBkZXNjcmlwdG9yLgotICAgICIiIgotICAgIHN1cGVyKF9OZXN0ZWREZXNjcmlwdG9yQmFzZSwgc2VsZikuX19pbml0X18oCi0gICAgICAgIG9wdGlvbnMsIG9wdGlvbnNfY2xhc3NfbmFtZSkKLQotICAgIHNlbGYubmFtZSA9IG5hbWUKLSAgICAjIFRPRE8oZmFsayk6IEFkZCBmdW5jdGlvbiB0byBjYWxjdWxhdGUgZnVsbF9uYW1lIGluc3RlYWQgb2YgaGF2aW5nIGl0IGluCi0gICAgIyAgICAgICAgICAgICBtZW1vcnk/Ci0gICAgc2VsZi5mdWxsX25hbWUgPSBmdWxsX25hbWUKLSAgICBzZWxmLmZpbGUgPSBmaWxlCi0gICAgc2VsZi5jb250YWluaW5nX3R5cGUgPSBjb250YWluaW5nX3R5cGUKLQotICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQgPSBzZXJpYWxpemVkX3N0YXJ0Ci0gICAgc2VsZi5fc2VyaWFsaXplZF9lbmQgPSBzZXJpYWxpemVkX2VuZAotCi0gIGRlZiBHZXRUb3BMZXZlbENvbnRhaW5pbmdUeXBlKHNlbGYpOgotICAgICIiIlJldHVybnMgdGhlIHJvb3QgaWYgdGhpcyBpcyBhIG5lc3RlZCB0eXBlLCBvciBpdHNlbGYgaWYgaXRzIHRoZSByb290LiIiIgotICAgIGRlc2MgPSBzZWxmCi0gICAgd2hpbGUgZGVzYy5jb250YWluaW5nX3R5cGUgaXMgbm90IE5vbmU6Ci0gICAgICBkZXNjID0gZGVzYy5jb250YWluaW5nX3R5cGUKLSAgICByZXR1cm4gZGVzYwotCi0gIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6Ci0gICAgIiIiQ29waWVzIHRoaXMgdG8gdGhlIG1hdGNoaW5nIHByb3RvIGluIGRlc2NyaXB0b3JfcGIyLgotCi0gICAgQXJnczoKLSAgICAgIHByb3RvOiBBbiBlbXB0eSBwcm90byBpbnN0YW5jZSBmcm9tIGRlc2NyaXB0b3JfcGIyLgotCi0gICAgUmFpc2VzOgotICAgICAgRXJyb3I6IElmIHNlbGYgY291bGRudCBiZSBzZXJpYWxpemVkLCBkdWUgdG8gdG8gZmV3IGNvbnN0cnVjdG9yIGFyZ3VtZW50cy4KLSAgICAiIiIKLSAgICBpZiAoc2VsZi5maWxlIGlzIG5vdCBOb25lIGFuZAotICAgICAgICBzZWxmLl9zZXJpYWxpemVkX3N0YXJ0IGlzIG5vdCBOb25lIGFuZAotICAgICAgICBzZWxmLl9zZXJpYWxpemVkX2VuZCBpcyBub3QgTm9uZSk6Ci0gICAgICBwcm90by5QYXJzZUZyb21TdHJpbmcoc2VsZi5maWxlLnNlcmlhbGl6ZWRfcGJbCi0gICAgICAgICAgc2VsZi5fc2VyaWFsaXplZF9zdGFydDpzZWxmLl9zZXJpYWxpemVkX2VuZF0pCi0gICAgZWxzZToKLSAgICAgIHJhaXNlIEVycm9yKCdEZXNjcmlwdG9yIGRvZXMgbm90IGNvbnRhaW4gc2VyaWFsaXphdGlvbi4nKQotCi0KLWNsYXNzIERlc2NyaXB0b3IoX05lc3RlZERlc2NyaXB0b3JCYXNlKToKLQotICAiIiJEZXNjcmlwdG9yIGZvciBhIHByb3RvY29sIG1lc3NhZ2UgdHlwZS4KLQotICBBIERlc2NyaXB0b3IgaW5zdGFuY2UgaGFzIHRoZSBmb2xsb3dpbmcgYXR0cmlidXRlczoKLQotICAgIG5hbWU6IChzdHIpIE5hbWUgb2YgdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuCi0gICAgZnVsbF9uYW1lOiAoc3RyKSBGdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZSwKLSAgICAgIHdoaWNoIHdpbGwgaW5jbHVkZSBwcm90b2NvbCAicGFja2FnZSIgbmFtZSBhbmQgdGhlIG5hbWUgb2YgYW55Ci0gICAgICBlbmNsb3NpbmcgdHlwZXMuCi0KLSAgICBjb250YWluaW5nX3R5cGU6IChEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gdGhlIGRlc2NyaXB0b3Igb2YgdGhlCi0gICAgICB0eXBlIGNvbnRhaW5pbmcgdXMsIG9yIE5vbmUgaWYgdGhpcyBpcyB0b3AtbGV2ZWwuCi0KLSAgICBmaWVsZHM6IChsaXN0IG9mIEZpZWxkRGVzY3JpcHRvcnMpIEZpZWxkIGRlc2NyaXB0b3JzIGZvciBhbGwKLSAgICAgIGZpZWxkcyBpbiB0aGlzIHR5cGUuCi0gICAgZmllbGRzX2J5X251bWJlcjogKGRpY3QgaW50IC0+IEZpZWxkRGVzY3JpcHRvcikgU2FtZSBGaWVsZERlc2NyaXB0b3IKLSAgICAgIG9iamVjdHMgYXMgaW4gfGZpZWxkc3wsIGJ1dCBpbmRleGVkIGJ5ICJudW1iZXIiIGF0dHJpYnV0ZSBpbiBlYWNoCi0gICAgICBGaWVsZERlc2NyaXB0b3IuCi0gICAgZmllbGRzX2J5X25hbWU6IChkaWN0IHN0ciAtPiBGaWVsZERlc2NyaXB0b3IpIFNhbWUgRmllbGREZXNjcmlwdG9yCi0gICAgICBvYmplY3RzIGFzIGluIHxmaWVsZHN8LCBidXQgaW5kZXhlZCBieSAibmFtZSIgYXR0cmlidXRlIGluIGVhY2gKLSAgICAgIEZpZWxkRGVzY3JpcHRvci4KLQotICAgIG5lc3RlZF90eXBlczogKGxpc3Qgb2YgRGVzY3JpcHRvcnMpIERlc2NyaXB0b3IgcmVmZXJlbmNlcwotICAgICAgZm9yIGFsbCBwcm90b2NvbCBtZXNzYWdlIHR5cGVzIG5lc3RlZCB3aXRoaW4gdGhpcyBvbmUuCi0gICAgbmVzdGVkX3R5cGVzX2J5X25hbWU6IChkaWN0IHN0ciAtPiBEZXNjcmlwdG9yKSBTYW1lIERlc2NyaXB0b3IKLSAgICAgIG9iamVjdHMgYXMgaW4gfG5lc3RlZF90eXBlc3wsIGJ1dCBpbmRleGVkIGJ5ICJuYW1lIiBhdHRyaWJ1dGUKLSAgICAgIGluIGVhY2ggRGVzY3JpcHRvci4KLQotICAgIGVudW1fdHlwZXM6IChsaXN0IG9mIEVudW1EZXNjcmlwdG9ycykgRW51bURlc2NyaXB0b3IgcmVmZXJlbmNlcwotICAgICAgZm9yIGFsbCBlbnVtcyBjb250YWluZWQgd2l0aGluIHRoaXMgdHlwZS4KLSAgICBlbnVtX3R5cGVzX2J5X25hbWU6IChkaWN0IHN0ciAtPkVudW1EZXNjcmlwdG9yKSBTYW1lIEVudW1EZXNjcmlwdG9yCi0gICAgICBvYmplY3RzIGFzIGluIHxlbnVtX3R5cGVzfCwgYnV0IGluZGV4ZWQgYnkgIm5hbWUiIGF0dHJpYnV0ZQotICAgICAgaW4gZWFjaCBFbnVtRGVzY3JpcHRvci4KLSAgICBlbnVtX3ZhbHVlc19ieV9uYW1lOiAoZGljdCBzdHIgLT4gRW51bVZhbHVlRGVzY3JpcHRvcikgRGljdCBtYXBwaW5nCi0gICAgICBmcm9tIGVudW0gdmFsdWUgbmFtZSB0byBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciB0aGF0IHZhbHVlLgotCi0gICAgZXh0ZW5zaW9uczogKGxpc3Qgb2YgRmllbGREZXNjcmlwdG9yKSBBbGwgZXh0ZW5zaW9ucyBkZWZpbmVkIGRpcmVjdGx5Ci0gICAgICB3aXRoaW4gdGhpcyBtZXNzYWdlIHR5cGUgKE5PVCB3aXRoaW4gYSBuZXN0ZWQgdHlwZSkuCi0gICAgZXh0ZW5zaW9uc19ieV9uYW1lOiAoZGljdCwgc3RyaW5nIC0+IEZpZWxkRGVzY3JpcHRvcikgU2FtZSBGaWVsZERlc2NyaXB0b3IKLSAgICAgIG9iamVjdHMgYXMgfGV4dGVuc2lvbnN8LCBidXQgaW5kZXhlZCBieSAibmFtZSIgYXR0cmlidXRlIG9mIGVhY2gKLSAgICAgIEZpZWxkRGVzY3JpcHRvci4KLQotICAgIGlzX2V4dGVuZGFibGU6ICBEb2VzIHRoaXMgdHlwZSBkZWZpbmUgYW55IGV4dGVuc2lvbiByYW5nZXM/Ci0KLSAgICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuTWVzc2FnZU9wdGlvbnMpIFByb3RvY29sIG1lc3NhZ2Ugb3B0aW9ucyBvciBOb25lCi0gICAgICB0byB1c2UgZGVmYXVsdCBtZXNzYWdlIG9wdGlvbnMuCi0KLSAgICBmaWxlOiAoRmlsZURlc2NyaXB0b3IpIFJlZmVyZW5jZSB0byBmaWxlIGRlc2NyaXB0b3IuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmdWxsX25hbWUsIGZpbGVuYW1lLCBjb250YWluaW5nX3R5cGUsIGZpZWxkcywKLSAgICAgICAgICAgICAgIG5lc3RlZF90eXBlcywgZW51bV90eXBlcywgZXh0ZW5zaW9ucywgb3B0aW9ucz1Ob25lLAotICAgICAgICAgICAgICAgaXNfZXh0ZW5kYWJsZT1UcnVlLCBleHRlbnNpb25fcmFuZ2VzPU5vbmUsIGZpbGU9Tm9uZSwKLSAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwgc2VyaWFsaXplZF9lbmQ9Tm9uZSk6Ci0gICAgIiIiQXJndW1lbnRzIHRvIF9faW5pdF9fKCkgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24KLSAgICBvZiBEZXNjcmlwdG9yIGZpZWxkcyBhYm92ZS4KLQotICAgIE5vdGUgdGhhdCBmaWxlbmFtZSBpcyBhbiBvYnNvbGV0ZSBhcmd1bWVudCwgdGhhdCBpcyBub3QgdXNlZCBhbnltb3JlLgotICAgIFBsZWFzZSB1c2UgZmlsZS5uYW1lIHRvIGFjY2VzcyB0aGlzIGFzIGFuIGF0dHJpYnV0ZS4KLSAgICAiIiIKLSAgICBzdXBlcihEZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKLSAgICAgICAgb3B0aW9ucywgJ01lc3NhZ2VPcHRpb25zJywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlLAotICAgICAgICBjb250YWluaW5nX3R5cGUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKLSAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9zdGFydCkKLQotICAgICMgV2UgaGF2ZSBmaWVsZHMgaW4gYWRkaXRpb24gdG8gZmllbGRzX2J5X25hbWUgYW5kIGZpZWxkc19ieV9udW1iZXIsCi0gICAgIyBzbyB0aGF0OgotICAgICMgICAxLiBDbGllbnRzIGNhbiBpbmRleCBmaWVsZHMgYnkgIm9yZGVyIGluIHdoaWNoIHRoZXkncmUgbGlzdGVkLiIKLSAgICAjICAgMi4gQ2xpZW50cyBjYW4gZWFzaWx5IGl0ZXJhdGUgb3ZlciBhbGwgZmllbGRzIHdpdGggdGhlIHRlcnNlCi0gICAgIyAgICAgIHN5bnRheDogZm9yIGYgaW4gZGVzY3JpcHRvci5maWVsZHM6IC4uLgotICAgIHNlbGYuZmllbGRzID0gZmllbGRzCi0gICAgZm9yIGZpZWxkIGluIHNlbGYuZmllbGRzOgotICAgICAgZmllbGQuY29udGFpbmluZ190eXBlID0gc2VsZgotICAgIHNlbGYuZmllbGRzX2J5X251bWJlciA9IGRpY3QoKGYubnVtYmVyLCBmKSBmb3IgZiBpbiBmaWVsZHMpCi0gICAgc2VsZi5maWVsZHNfYnlfbmFtZSA9IGRpY3QoKGYubmFtZSwgZikgZm9yIGYgaW4gZmllbGRzKQotCi0gICAgc2VsZi5uZXN0ZWRfdHlwZXMgPSBuZXN0ZWRfdHlwZXMKLSAgICBzZWxmLm5lc3RlZF90eXBlc19ieV9uYW1lID0gZGljdCgodC5uYW1lLCB0KSBmb3IgdCBpbiBuZXN0ZWRfdHlwZXMpCi0KLSAgICBzZWxmLmVudW1fdHlwZXMgPSBlbnVtX3R5cGVzCi0gICAgZm9yIGVudW1fdHlwZSBpbiBzZWxmLmVudW1fdHlwZXM6Ci0gICAgICBlbnVtX3R5cGUuY29udGFpbmluZ190eXBlID0gc2VsZgotICAgIHNlbGYuZW51bV90eXBlc19ieV9uYW1lID0gZGljdCgodC5uYW1lLCB0KSBmb3IgdCBpbiBlbnVtX3R5cGVzKQotICAgIHNlbGYuZW51bV92YWx1ZXNfYnlfbmFtZSA9IGRpY3QoCi0gICAgICAgICh2Lm5hbWUsIHYpIGZvciB0IGluIGVudW1fdHlwZXMgZm9yIHYgaW4gdC52YWx1ZXMpCi0KLSAgICBzZWxmLmV4dGVuc2lvbnMgPSBleHRlbnNpb25zCi0gICAgZm9yIGV4dGVuc2lvbiBpbiBzZWxmLmV4dGVuc2lvbnM6Ci0gICAgICBleHRlbnNpb24uZXh0ZW5zaW9uX3Njb3BlID0gc2VsZgotICAgIHNlbGYuZXh0ZW5zaW9uc19ieV9uYW1lID0gZGljdCgoZi5uYW1lLCBmKSBmb3IgZiBpbiBleHRlbnNpb25zKQotICAgIHNlbGYuaXNfZXh0ZW5kYWJsZSA9IGlzX2V4dGVuZGFibGUKLSAgICBzZWxmLmV4dGVuc2lvbl9yYW5nZXMgPSBleHRlbnNpb25fcmFuZ2VzCi0KLSAgICBzZWxmLl9zZXJpYWxpemVkX3N0YXJ0ID0gc2VyaWFsaXplZF9zdGFydAotICAgIHNlbGYuX3NlcmlhbGl6ZWRfZW5kID0gc2VyaWFsaXplZF9lbmQKLQotICBkZWYgQ29weVRvUHJvdG8oc2VsZiwgcHJvdG8pOgotICAgICIiIkNvcGllcyB0aGlzIHRvIGEgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLgotCi0gICAgQXJnczoKLSAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8uCi0gICAgIiIiCi0gICAgIyBUaGlzIGZ1bmN0aW9uIGlzIG92ZXJyaWRlbiB0byBnaXZlIGEgYmV0dGVyIGRvYyBjb21tZW50LgotICAgIHN1cGVyKERlc2NyaXB0b3IsIHNlbGYpLkNvcHlUb1Byb3RvKHByb3RvKQotCi0KLSMgVE9ETyhyb2JpbnNvbik6IFdlIHNob3VsZCBoYXZlIGFnZ3Jlc3NpdmUgY2hlY2tpbmcgaGVyZSwKLSMgZm9yIGV4YW1wbGU6Ci0jICAgKiBJZiB5b3Ugc3BlY2lmeSBhIHJlcGVhdGVkIGZpZWxkLCB5b3Ugc2hvdWxkIG5vdCBiZSBhbGxvd2VkCi0jICAgICB0byBzcGVjaWZ5IGEgZGVmYXVsdCB2YWx1ZS4KLSMgICAqIFtPdGhlciBleGFtcGxlcyBoZXJlIGFzIG5lZWRlZF0uCi0jCi0jIFRPRE8ocm9iaW5zb24pOiBmb3IgdGhpcyBhbmQgb3RoZXIgKkRlc2NyaXB0b3IgY2xhc3Nlcywgd2UKLSMgbWlnaHQgYWxzbyB3YW50IHRvIGxvY2sgdGhpbmdzIGRvd24gYWdncmVzc2l2ZWx5IChlLmcuLAotIyBwcmV2ZW50IGNsaWVudHMgZnJvbSBzZXR0aW5nIHRoZSBhdHRyaWJ1dGVzKS4gIEhhdmluZwotIyBzdHJvbmdlciBpbnZhcmlhbnRzIGhlcmUgaW4gZ2VuZXJhbCB3aWxsIHJlZHVjZSB0aGUgbnVtYmVyCi0jIG9mIHJ1bnRpbWUgY2hlY2tzIHdlIG11c3QgZG8gaW4gcmVmbGVjdGlvbi5weS4uLgotY2xhc3MgRmllbGREZXNjcmlwdG9yKERlc2NyaXB0b3JCYXNlKToKLQotICAiIiJEZXNjcmlwdG9yIGZvciBhIHNpbmdsZSBmaWVsZCBpbiBhIC5wcm90byBmaWxlLgotCi0gIEEgRmllbGREZXNjcmlwdG9yIGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpdWJ0ZXM6Ci0KLSAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgZmllbGQsIGV4YWN0bHkgYXMgaXQgYXBwZWFycyBpbiAucHJvdG8uCi0gICAgZnVsbF9uYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgZmllbGQsIGluY2x1ZGluZyBjb250YWluaW5nIHNjb3BlLiAgVGhpcyBpcwotICAgICAgcGFydGljdWxhcmx5IHJlbGV2YW50IGZvciBleHRlbnNpb25zLgotICAgIGluZGV4OiAoaW50KSBEZW5zZSwgMC1pbmRleGVkIGluZGV4IGdpdmluZyB0aGUgb3JkZXIgdGhhdCB0aGlzCi0gICAgICBmaWVsZCB0ZXh0dWFsbHkgYXBwZWFycyB3aXRoaW4gaXRzIG1lc3NhZ2UgaW4gdGhlIC5wcm90byBmaWxlLgotICAgIG51bWJlcjogKGludCkgVGFnIG51bWJlciBkZWNsYXJlZCBmb3IgdGhpcyBmaWVsZCBpbiB0aGUgLnByb3RvIGZpbGUuCi0KLSAgICB0eXBlOiAoT25lIG9mIHRoZSBUWVBFXyogY29uc3RhbnRzIGJlbG93KSBEZWNsYXJlZCB0eXBlLgotICAgIGNwcF90eXBlOiAoT25lIG9mIHRoZSBDUFBUWVBFXyogY29uc3RhbnRzIGJlbG93KSBDKysgdHlwZSB1c2VkIHRvCi0gICAgICByZXByZXNlbnQgdGhpcyBmaWVsZC4KLQotICAgIGxhYmVsOiAoT25lIG9mIHRoZSBMQUJFTF8qIGNvbnN0YW50cyBiZWxvdykgVGVsbHMgd2hldGhlciB0aGlzCi0gICAgICBmaWVsZCBpcyBvcHRpb25hbCwgcmVxdWlyZWQsIG9yIHJlcGVhdGVkLgotICAgIGhhc19kZWZhdWx0X3ZhbHVlOiAoYm9vbCkgVHJ1ZSBpZiB0aGlzIGZpZWxkIGhhcyBhIGRlZmF1bHQgdmFsdWUgZGVmaW5lZCwKLSAgICAgIG90aGVyd2lzZSBmYWxzZS4KLSAgICBkZWZhdWx0X3ZhbHVlOiAoVmFyaWVzKSBEZWZhdWx0IHZhbHVlIG9mIHRoaXMgZmllbGQuICBPbmx5Ci0gICAgICBtZWFuaW5nZnVsIGZvciBub24tcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcy4gIFJlcGVhdGVkIGZpZWxkcwotICAgICAgc2hvdWxkIGFsd2F5cyBzZXQgdGhpcyB0byBbXSwgYW5kIG5vbi1yZXBlYXRlZCBjb21wb3NpdGUKLSAgICAgIGZpZWxkcyBzaG91bGQgYWx3YXlzIHNldCB0aGlzIHRvIE5vbmUuCi0KLSAgICBjb250YWluaW5nX3R5cGU6IChEZXNjcmlwdG9yKSBEZXNjcmlwdG9yIG9mIHRoZSBwcm90b2NvbCBtZXNzYWdlCi0gICAgICB0eXBlIHRoYXQgY29udGFpbnMgdGhpcyBmaWVsZC4gIFNldCBieSB0aGUgRGVzY3JpcHRvciBjb25zdHJ1Y3RvcgotICAgICAgaWYgd2UncmUgcGFzc2VkIGludG8gb25lLgotICAgICAgU29tZXdoYXQgY29uZnVzaW5nbHksIGZvciBleHRlbnNpb24gZmllbGRzLCB0aGlzIGlzIHRoZQotICAgICAgZGVzY3JpcHRvciBvZiB0aGUgRVhURU5ERUQgbWVzc2FnZSwgbm90IHRoZSBkZXNjcmlwdG9yCi0gICAgICBvZiB0aGUgbWVzc2FnZSBjb250YWluaW5nIHRoaXMgZmllbGQuICAoU2VlIGlzX2V4dGVuc2lvbiBhbmQKLSAgICAgIGV4dGVuc2lvbl9zY29wZSBiZWxvdykuCi0gICAgbWVzc2FnZV90eXBlOiAoRGVzY3JpcHRvcikgSWYgYSBjb21wb3NpdGUgZmllbGQsIGEgZGVzY3JpcHRvcgotICAgICAgb2YgdGhlIG1lc3NhZ2UgdHlwZSBjb250YWluZWQgaW4gdGhpcyBmaWVsZC4gIE90aGVyd2lzZSwgdGhpcyBpcyBOb25lLgotICAgIGVudW1fdHlwZTogKEVudW1EZXNjcmlwdG9yKSBJZiB0aGlzIGZpZWxkIGNvbnRhaW5zIGFuIGVudW0sIGEKLSAgICAgIGRlc2NyaXB0b3Igb2YgdGhhdCBlbnVtLiAgT3RoZXJ3aXNlLCB0aGlzIGlzIE5vbmUuCi0KLSAgICBpc19leHRlbnNpb246IFRydWUgaWZmIHRoaXMgZGVzY3JpYmVzIGFuIGV4dGVuc2lvbiBmaWVsZC4KLSAgICBleHRlbnNpb25fc2NvcGU6IChEZXNjcmlwdG9yKSBPbmx5IG1lYW5pbmdmdWwgaWYgaXNfZXh0ZW5zaW9uIGlzIFRydWUuCi0gICAgICBHaXZlcyB0aGUgbWVzc2FnZSB0aGF0IGltbWVkaWF0ZWx5IGNvbnRhaW5zIHRoaXMgZXh0ZW5zaW9uIGZpZWxkLgotICAgICAgV2lsbCBiZSBOb25lIGlmZiB3ZSdyZSBhIHRvcC1sZXZlbCAoZmlsZS1sZXZlbCkgZXh0ZW5zaW9uIGZpZWxkLgotCi0gICAgb3B0aW9uczogKGRlc2NyaXB0b3JfcGIyLkZpZWxkT3B0aW9ucykgUHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBvcHRpb25zIG9yCi0gICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IGZpZWxkIG9wdGlvbnMuCi0gICIiIgotCi0gICMgTXVzdCBiZSBjb25zaXN0ZW50IHdpdGggQysrIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSBlbnVtIGluCi0gICMgZGVzY3JpcHRvci5oLgotICAjCi0gICMgVE9ETyhyb2JpbnNvbik6IEZpbmQgYSB3YXkgdG8gZWxpbWluYXRlIHRoaXMgcmVwZXRpdGlvbi4KLSAgVFlQRV9ET1VCTEUgICAgICAgICA9IDEKLSAgVFlQRV9GTE9BVCAgICAgICAgICA9IDIKLSAgVFlQRV9JTlQ2NCAgICAgICAgICA9IDMKLSAgVFlQRV9VSU5UNjQgICAgICAgICA9IDQKLSAgVFlQRV9JTlQzMiAgICAgICAgICA9IDUKLSAgVFlQRV9GSVhFRDY0ICAgICAgICA9IDYKLSAgVFlQRV9GSVhFRDMyICAgICAgICA9IDcKLSAgVFlQRV9CT09MICAgICAgICAgICA9IDgKLSAgVFlQRV9TVFJJTkcgICAgICAgICA9IDkKLSAgVFlQRV9HUk9VUCAgICAgICAgICA9IDEwCi0gIFRZUEVfTUVTU0FHRSAgICAgICAgPSAxMQotICBUWVBFX0JZVEVTICAgICAgICAgID0gMTIKLSAgVFlQRV9VSU5UMzIgICAgICAgICA9IDEzCi0gIFRZUEVfRU5VTSAgICAgICAgICAgPSAxNAotICBUWVBFX1NGSVhFRDMyICAgICAgID0gMTUKLSAgVFlQRV9TRklYRUQ2NCAgICAgICA9IDE2Ci0gIFRZUEVfU0lOVDMyICAgICAgICAgPSAxNwotICBUWVBFX1NJTlQ2NCAgICAgICAgID0gMTgKLSAgTUFYX1RZUEUgICAgICAgICAgICA9IDE4Ci0KLSAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBDKysgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGVudW0gaW4KLSAgIyBkZXNjcmlwdG9yLmguCi0gICMKLSAgIyBUT0RPKHJvYmluc29uKTogRmluZCBhIHdheSB0byBlbGltaW5hdGUgdGhpcyByZXBldGl0aW9uLgotICBDUFBUWVBFX0lOVDMyICAgICAgID0gMQotICBDUFBUWVBFX0lOVDY0ICAgICAgID0gMgotICBDUFBUWVBFX1VJTlQzMiAgICAgID0gMwotICBDUFBUWVBFX1VJTlQ2NCAgICAgID0gNAotICBDUFBUWVBFX0RPVUJMRSAgICAgID0gNQotICBDUFBUWVBFX0ZMT0FUICAgICAgID0gNgotICBDUFBUWVBFX0JPT0wgICAgICAgID0gNwotICBDUFBUWVBFX0VOVU0gICAgICAgID0gOAotICBDUFBUWVBFX1NUUklORyAgICAgID0gOQotICBDUFBUWVBFX01FU1NBR0UgICAgID0gMTAKLSAgTUFYX0NQUFRZUEUgICAgICAgICA9IDEwCi0KLSAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCBDKysgRmllbGREZXNjcmlwdG9yOjpMYWJlbCBlbnVtIGluCi0gICMgZGVzY3JpcHRvci5oLgotICAjCi0gICMgVE9ETyhyb2JpbnNvbik6IEZpbmQgYSB3YXkgdG8gZWxpbWluYXRlIHRoaXMgcmVwZXRpdGlvbi4KLSAgTEFCRUxfT1BUSU9OQUwgICAgICA9IDEKLSAgTEFCRUxfUkVRVUlSRUQgICAgICA9IDIKLSAgTEFCRUxfUkVQRUFURUQgICAgICA9IDMKLSAgTUFYX0xBQkVMICAgICAgICAgICA9IDMKLQotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBpbmRleCwgbnVtYmVyLCB0eXBlLCBjcHBfdHlwZSwgbGFiZWwsCi0gICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlLCBtZXNzYWdlX3R5cGUsIGVudW1fdHlwZSwgY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uLCBleHRlbnNpb25fc2NvcGUsIG9wdGlvbnM9Tm9uZSwKLSAgICAgICAgICAgICAgIGhhc19kZWZhdWx0X3ZhbHVlPVRydWUpOgotICAgICIiIlRoZSBhcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgZGVzY3JpcHRpb24gb2YgRmllbGREZXNjcmlwdG9yCi0gICAgYXR0cmlidXRlcyBhYm92ZS4KLQotICAgIE5vdGUgdGhhdCBjb250YWluaW5nX3R5cGUgbWF5IGJlIE5vbmUsIGFuZCBtYXkgYmUgc2V0IGxhdGVyIGlmIG5lY2Vzc2FyeQotICAgICh0byBkZWFsIHdpdGggY2lyY3VsYXIgcmVmZXJlbmNlcyBiZXR3ZWVuIG1lc3NhZ2UgdHlwZXMsIGZvciBleGFtcGxlKS4KLSAgICBMaWtld2lzZSBmb3IgZXh0ZW5zaW9uX3Njb3BlLgotICAgICIiIgotICAgIHN1cGVyKEZpZWxkRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18ob3B0aW9ucywgJ0ZpZWxkT3B0aW9ucycpCi0gICAgc2VsZi5uYW1lID0gbmFtZQotICAgIHNlbGYuZnVsbF9uYW1lID0gZnVsbF9uYW1lCi0gICAgc2VsZi5pbmRleCA9IGluZGV4Ci0gICAgc2VsZi5udW1iZXIgPSBudW1iZXIKLSAgICBzZWxmLnR5cGUgPSB0eXBlCi0gICAgc2VsZi5jcHBfdHlwZSA9IGNwcF90eXBlCi0gICAgc2VsZi5sYWJlbCA9IGxhYmVsCi0gICAgc2VsZi5oYXNfZGVmYXVsdF92YWx1ZSA9IGhhc19kZWZhdWx0X3ZhbHVlCi0gICAgc2VsZi5kZWZhdWx0X3ZhbHVlID0gZGVmYXVsdF92YWx1ZQotICAgIHNlbGYuY29udGFpbmluZ190eXBlID0gY29udGFpbmluZ190eXBlCi0gICAgc2VsZi5tZXNzYWdlX3R5cGUgPSBtZXNzYWdlX3R5cGUKLSAgICBzZWxmLmVudW1fdHlwZSA9IGVudW1fdHlwZQotICAgIHNlbGYuaXNfZXh0ZW5zaW9uID0gaXNfZXh0ZW5zaW9uCi0gICAgc2VsZi5leHRlbnNpb25fc2NvcGUgPSBleHRlbnNpb25fc2NvcGUKLSAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpID09ICdjcHAnOgotICAgICAgaWYgaXNfZXh0ZW5zaW9uOgotICAgICAgICBzZWxmLl9jZGVzY3JpcHRvciA9IGNwcF9tZXNzYWdlLkdldEV4dGVuc2lvbkRlc2NyaXB0b3IoZnVsbF9uYW1lKQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fY2Rlc2NyaXB0b3IgPSBjcHBfbWVzc2FnZS5HZXRGaWVsZERlc2NyaXB0b3IoZnVsbF9uYW1lKQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9jZGVzY3JpcHRvciA9IE5vbmUKLQotCi1jbGFzcyBFbnVtRGVzY3JpcHRvcihfTmVzdGVkRGVzY3JpcHRvckJhc2UpOgotCi0gICIiIkRlc2NyaXB0b3IgZm9yIGFuIGVudW0gZGVmaW5lZCBpbiBhIC5wcm90byBmaWxlLgotCi0gIEFuIEVudW1EZXNjcmlwdG9yIGluc3RhbmNlIGhhcyB0aGUgZm9sbG93aW5nIGF0dHJpYnV0ZXM6Ci0KLSAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoZSBlbnVtIHR5cGUuCi0gICAgZnVsbF9uYW1lOiAoc3RyKSBGdWxsIG5hbWUgb2YgdGhlIHR5cGUsIGluY2x1ZGluZyBwYWNrYWdlIG5hbWUKLSAgICAgIGFuZCBhbnkgZW5jbG9zaW5nIHR5cGUocykuCi0KLSAgICB2YWx1ZXM6IChsaXN0IG9mIEVudW1WYWx1ZURlc2NyaXB0b3JzKSBMaXN0IG9mIHRoZSB2YWx1ZXMKLSAgICAgIGluIHRoaXMgZW51bS4KLSAgICB2YWx1ZXNfYnlfbmFtZTogKGRpY3Qgc3RyIC0+IEVudW1WYWx1ZURlc2NyaXB0b3IpIFNhbWUgYXMgfHZhbHVlc3wsCi0gICAgICBidXQgaW5kZXhlZCBieSB0aGUgIm5hbWUiIGZpZWxkIG9mIGVhY2ggRW51bVZhbHVlRGVzY3JpcHRvci4KLSAgICB2YWx1ZXNfYnlfbnVtYmVyOiAoZGljdCBpbnQgLT4gRW51bVZhbHVlRGVzY3JpcHRvcikgU2FtZSBhcyB8dmFsdWVzfCwKLSAgICAgIGJ1dCBpbmRleGVkIGJ5IHRoZSAibnVtYmVyIiBmaWVsZCBvZiBlYWNoIEVudW1WYWx1ZURlc2NyaXB0b3IuCi0gICAgY29udGFpbmluZ190eXBlOiAoRGVzY3JpcHRvcikgRGVzY3JpcHRvciBvZiB0aGUgaW1tZWRpYXRlIGNvbnRhaW5pbmcKLSAgICAgIHR5cGUgb2YgdGhpcyBlbnVtLCBvciBOb25lIGlmIHRoaXMgaXMgYW4gZW51bSBkZWZpbmVkIGF0IHRoZQotICAgICAgdG9wIGxldmVsIGluIGEgLnByb3RvIGZpbGUuICBTZXQgYnkgRGVzY3JpcHRvcidzIGNvbnN0cnVjdG9yCi0gICAgICBpZiB3ZSdyZSBwYXNzZWQgaW50byBvbmUuCi0gICAgZmlsZTogKEZpbGVEZXNjcmlwdG9yKSBSZWZlcmVuY2UgdG8gZmlsZSBkZXNjcmlwdG9yLgotICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5FbnVtT3B0aW9ucykgRW51bSBvcHRpb25zIG1lc3NhZ2Ugb3IKLSAgICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgZW51bSBvcHRpb25zLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgbmFtZSwgZnVsbF9uYW1lLCBmaWxlbmFtZSwgdmFsdWVzLAotICAgICAgICAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsIG9wdGlvbnM9Tm9uZSwgZmlsZT1Ob25lLAotICAgICAgICAgICAgICAgc2VyaWFsaXplZF9zdGFydD1Ob25lLCBzZXJpYWxpemVkX2VuZD1Ob25lKToKLSAgICAiIiJBcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlLgotCi0gICAgTm90ZSB0aGF0IGZpbGVuYW1lIGlzIGFuIG9ic29sZXRlIGFyZ3VtZW50LCB0aGF0IGlzIG5vdCB1c2VkIGFueW1vcmUuCi0gICAgUGxlYXNlIHVzZSBmaWxlLm5hbWUgdG8gYWNjZXNzIHRoaXMgYXMgYW4gYXR0cmlidXRlLgotICAgICIiIgotICAgIHN1cGVyKEVudW1EZXNjcmlwdG9yLCBzZWxmKS5fX2luaXRfXygKLSAgICAgICAgb3B0aW9ucywgJ0VudW1PcHRpb25zJywgbmFtZSwgZnVsbF9uYW1lLCBmaWxlLAotICAgICAgICBjb250YWluaW5nX3R5cGUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKLSAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9zdGFydCkKLQotICAgIHNlbGYudmFsdWVzID0gdmFsdWVzCi0gICAgZm9yIHZhbHVlIGluIHNlbGYudmFsdWVzOgotICAgICAgdmFsdWUudHlwZSA9IHNlbGYKLSAgICBzZWxmLnZhbHVlc19ieV9uYW1lID0gZGljdCgodi5uYW1lLCB2KSBmb3IgdiBpbiB2YWx1ZXMpCi0gICAgc2VsZi52YWx1ZXNfYnlfbnVtYmVyID0gZGljdCgodi5udW1iZXIsIHYpIGZvciB2IGluIHZhbHVlcykKLQotICAgIHNlbGYuX3NlcmlhbGl6ZWRfc3RhcnQgPSBzZXJpYWxpemVkX3N0YXJ0Ci0gICAgc2VsZi5fc2VyaWFsaXplZF9lbmQgPSBzZXJpYWxpemVkX2VuZAotCi0gIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6Ci0gICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvLgotCi0gICAgQXJnczoKLSAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5FbnVtRGVzY3JpcHRvclByb3RvLgotICAgICIiIgotICAgICMgVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZW4gdG8gZ2l2ZSBhIGJldHRlciBkb2MgY29tbWVudC4KLSAgICBzdXBlcihFbnVtRGVzY3JpcHRvciwgc2VsZikuQ29weVRvUHJvdG8ocHJvdG8pCi0KLQotY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6Ci0KLSAgIiIiRGVzY3JpcHRvciBmb3IgYSBzaW5nbGUgdmFsdWUgd2l0aGluIGFuIGVudW0uCi0KLSAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoaXMgdmFsdWUuCi0gICAgaW5kZXg6IChpbnQpIERlbnNlLCAwLWluZGV4ZWQgaW5kZXggZ2l2aW5nIHRoZSBvcmRlciB0aGF0IHRoaXMKLSAgICAgIHZhbHVlIGFwcGVhcnMgdGV4dHVhbGx5IHdpdGhpbiBpdHMgZW51bSBpbiB0aGUgLnByb3RvIGZpbGUuCi0gICAgbnVtYmVyOiAoaW50KSBBY3R1YWwgbnVtYmVyIGFzc2lnbmVkIHRvIHRoaXMgZW51bSB2YWx1ZS4KLSAgICB0eXBlOiAoRW51bURlc2NyaXB0b3IpIEVudW1EZXNjcmlwdG9yIHRvIHdoaWNoIHRoaXMgdmFsdWUKLSAgICAgIGJlbG9uZ3MuICBTZXQgYnkgRW51bURlc2NyaXB0b3IncyBjb25zdHJ1Y3RvciBpZiB3ZSdyZQotICAgICAgcGFzc2VkIGludG8gb25lLgotICAgIG9wdGlvbnM6IChkZXNjcmlwdG9yX3BiMi5FbnVtVmFsdWVPcHRpb25zKSBFbnVtIHZhbHVlIG9wdGlvbnMgbWVzc2FnZSBvcgotICAgICAgTm9uZSB0byB1c2UgZGVmYXVsdCBlbnVtIHZhbHVlIG9wdGlvbnMgb3B0aW9ucy4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIGluZGV4LCBudW1iZXIsIHR5cGU9Tm9uZSwgb3B0aW9ucz1Ob25lKToKLSAgICAiIiJBcmd1bWVudHMgYXJlIGFzIGRlc2NyaWJlZCBpbiB0aGUgYXR0cmlidXRlIGRlc2NyaXB0aW9uIGFib3ZlLiIiIgotICAgIHN1cGVyKEVudW1WYWx1ZURlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMsICdFbnVtVmFsdWVPcHRpb25zJykKLSAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgc2VsZi5pbmRleCA9IGluZGV4Ci0gICAgc2VsZi5udW1iZXIgPSBudW1iZXIKLSAgICBzZWxmLnR5cGUgPSB0eXBlCi0KLQotY2xhc3MgU2VydmljZURlc2NyaXB0b3IoX05lc3RlZERlc2NyaXB0b3JCYXNlKToKLQotICAiIiJEZXNjcmlwdG9yIGZvciBhIHNlcnZpY2UuCi0KLSAgICBuYW1lOiAoc3RyKSBOYW1lIG9mIHRoZSBzZXJ2aWNlLgotICAgIGZ1bGxfbmFtZTogKHN0cikgRnVsbCBuYW1lIG9mIHRoZSBzZXJ2aWNlLCBpbmNsdWRpbmcgcGFja2FnZSBuYW1lLgotICAgIGluZGV4OiAoaW50KSAwLWluZGV4ZWQgaW5kZXggZ2l2aW5nIHRoZSBvcmRlciB0aGF0IHRoaXMgc2VydmljZXMKLSAgICAgIGRlZmluaXRpb24gYXBwZWFycyB3aXRoaW5nIHRoZSAucHJvdG8gZmlsZS4KLSAgICBtZXRob2RzOiAobGlzdCBvZiBNZXRob2REZXNjcmlwdG9yKSBMaXN0IG9mIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhpcwotICAgICAgc2VydmljZS4KLSAgICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuU2VydmljZU9wdGlvbnMpIFNlcnZpY2Ugb3B0aW9ucyBtZXNzYWdlIG9yCi0gICAgICBOb25lIHRvIHVzZSBkZWZhdWx0IHNlcnZpY2Ugb3B0aW9ucy4KLSAgICBmaWxlOiAoRmlsZURlc2NyaXB0b3IpIFJlZmVyZW5jZSB0byBmaWxlIGluZm8uCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmdWxsX25hbWUsIGluZGV4LCBtZXRob2RzLCBvcHRpb25zPU5vbmUsIGZpbGU9Tm9uZSwKLSAgICAgICAgICAgICAgIHNlcmlhbGl6ZWRfc3RhcnQ9Tm9uZSwgc2VyaWFsaXplZF9lbmQ9Tm9uZSk6Ci0gICAgc3VwZXIoU2VydmljZURlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKAotICAgICAgICBvcHRpb25zLCAnU2VydmljZU9wdGlvbnMnLCBuYW1lLCBmdWxsX25hbWUsIGZpbGUsCi0gICAgICAgIE5vbmUsIHNlcmlhbGl6ZWRfc3RhcnQ9c2VyaWFsaXplZF9zdGFydCwKLSAgICAgICAgc2VyaWFsaXplZF9lbmQ9c2VyaWFsaXplZF9lbmQpCi0gICAgc2VsZi5pbmRleCA9IGluZGV4Ci0gICAgc2VsZi5tZXRob2RzID0gbWV0aG9kcwotICAgICMgU2V0IHRoZSBjb250YWluaW5nIHNlcnZpY2UgZm9yIGVhY2ggbWV0aG9kIGluIHRoaXMgc2VydmljZS4KLSAgICBmb3IgbWV0aG9kIGluIHNlbGYubWV0aG9kczoKLSAgICAgIG1ldGhvZC5jb250YWluaW5nX3NlcnZpY2UgPSBzZWxmCi0KLSAgZGVmIEZpbmRNZXRob2RCeU5hbWUoc2VsZiwgbmFtZSk6Ci0gICAgIiIiU2VhcmNoZXMgZm9yIHRoZSBzcGVjaWZpZWQgbWV0aG9kLCBhbmQgcmV0dXJucyBpdHMgZGVzY3JpcHRvci4iIiIKLSAgICBmb3IgbWV0aG9kIGluIHNlbGYubWV0aG9kczoKLSAgICAgIGlmIG5hbWUgPT0gbWV0aG9kLm5hbWU6Ci0gICAgICAgIHJldHVybiBtZXRob2QKLSAgICByZXR1cm4gTm9uZQotCi0gIGRlZiBDb3B5VG9Qcm90byhzZWxmLCBwcm90byk6Ci0gICAgIiIiQ29waWVzIHRoaXMgdG8gYSBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLgotCi0gICAgQXJnczoKLSAgICAgIHByb3RvOiBBbiBlbXB0eSBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLgotICAgICIiIgotICAgICMgVGhpcyBmdW5jdGlvbiBpcyBvdmVycmlkZW4gdG8gZ2l2ZSBhIGJldHRlciBkb2MgY29tbWVudC4KLSAgICBzdXBlcihTZXJ2aWNlRGVzY3JpcHRvciwgc2VsZikuQ29weVRvUHJvdG8ocHJvdG8pCi0KLQotY2xhc3MgTWV0aG9kRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6Ci0KLSAgIiIiRGVzY3JpcHRvciBmb3IgYSBtZXRob2QgaW4gYSBzZXJ2aWNlLgotCi0gIG5hbWU6IChzdHIpIE5hbWUgb2YgdGhlIG1ldGhvZCB3aXRoaW4gdGhlIHNlcnZpY2UuCi0gIGZ1bGxfbmFtZTogKHN0cikgRnVsbCBuYW1lIG9mIG1ldGhvZC4KLSAgaW5kZXg6IChpbnQpIDAtaW5kZXhlZCBpbmRleCBvZiB0aGUgbWV0aG9kIGluc2lkZSB0aGUgc2VydmljZS4KLSAgY29udGFpbmluZ19zZXJ2aWNlOiAoU2VydmljZURlc2NyaXB0b3IpIFRoZSBzZXJ2aWNlIHRoYXQgY29udGFpbnMgdGhpcwotICAgIG1ldGhvZC4KLSAgaW5wdXRfdHlwZTogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIG1ldGhvZCBhY2NlcHRzLgotICBvdXRwdXRfdHlwZTogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIG1lc3NhZ2UgdGhhdCB0aGlzIG1ldGhvZCByZXR1cm5zLgotICBvcHRpb25zOiAoZGVzY3JpcHRvcl9wYjIuTWV0aG9kT3B0aW9ucykgTWV0aG9kIG9wdGlvbnMgbWVzc2FnZSBvcgotICAgIE5vbmUgdG8gdXNlIGRlZmF1bHQgbWV0aG9kIG9wdGlvbnMuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBuYW1lLCBmdWxsX25hbWUsIGluZGV4LCBjb250YWluaW5nX3NlcnZpY2UsCi0gICAgICAgICAgICAgICBpbnB1dF90eXBlLCBvdXRwdXRfdHlwZSwgb3B0aW9ucz1Ob25lKToKLSAgICAiIiJUaGUgYXJndW1lbnRzIGFyZSBhcyBkZXNjcmliZWQgaW4gdGhlIGRlc2NyaXB0aW9uIG9mIE1ldGhvZERlc2NyaXB0b3IKLSAgICBhdHRyaWJ1dGVzIGFib3ZlLgotCi0gICAgTm90ZSB0aGF0IGNvbnRhaW5pbmdfc2VydmljZSBtYXkgYmUgTm9uZSwgYW5kIG1heSBiZSBzZXQgbGF0ZXIgaWYgbmVjZXNzYXJ5LgotICAgICIiIgotICAgIHN1cGVyKE1ldGhvZERlc2NyaXB0b3IsIHNlbGYpLl9faW5pdF9fKG9wdGlvbnMsICdNZXRob2RPcHRpb25zJykKLSAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgc2VsZi5mdWxsX25hbWUgPSBmdWxsX25hbWUKLSAgICBzZWxmLmluZGV4ID0gaW5kZXgKLSAgICBzZWxmLmNvbnRhaW5pbmdfc2VydmljZSA9IGNvbnRhaW5pbmdfc2VydmljZQotICAgIHNlbGYuaW5wdXRfdHlwZSA9IGlucHV0X3R5cGUKLSAgICBzZWxmLm91dHB1dF90eXBlID0gb3V0cHV0X3R5cGUKLQotCi1jbGFzcyBGaWxlRGVzY3JpcHRvcihEZXNjcmlwdG9yQmFzZSk6Ci0gICIiIkRlc2NyaXB0b3IgZm9yIGEgZmlsZS4gTWltaWNzIHRoZSBkZXNjcmlwdG9yX3BiMi5GaWxlRGVzY3JpcHRvclByb3RvLgotCi0gIG5hbWU6IG5hbWUgb2YgZmlsZSwgcmVsYXRpdmUgdG8gcm9vdCBvZiBzb3VyY2UgdHJlZS4KLSAgcGFja2FnZTogbmFtZSBvZiB0aGUgcGFja2FnZQotICBzZXJpYWxpemVkX3BiOiAoc3RyKSBCeXRlIHN0cmluZyBvZiBzZXJpYWxpemVkCi0gICAgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90by4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG5hbWUsIHBhY2thZ2UsIG9wdGlvbnM9Tm9uZSwgc2VyaWFsaXplZF9wYj1Ob25lKToKLSAgICAiIiJDb25zdHJ1Y3Rvci4iIiIKLSAgICBzdXBlcihGaWxlRGVzY3JpcHRvciwgc2VsZikuX19pbml0X18ob3B0aW9ucywgJ0ZpbGVPcHRpb25zJykKLQotICAgIHNlbGYubWVzc2FnZV90eXBlc19ieV9uYW1lID0ge30KLSAgICBzZWxmLm5hbWUgPSBuYW1lCi0gICAgc2VsZi5wYWNrYWdlID0gcGFja2FnZQotICAgIHNlbGYuc2VyaWFsaXplZF9wYiA9IHNlcmlhbGl6ZWRfcGIKLSAgICBpZiAoYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAnY3BwJyBhbmQKLSAgICAgICAgc2VsZi5zZXJpYWxpemVkX3BiIGlzIG5vdCBOb25lKToKLSAgICAgIGNwcF9tZXNzYWdlLkJ1aWxkRmlsZShzZWxmLnNlcmlhbGl6ZWRfcGIpCi0KLSAgZGVmIENvcHlUb1Byb3RvKHNlbGYsIHByb3RvKToKLSAgICAiIiJDb3BpZXMgdGhpcyB0byBhIGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uCi0KLSAgICBBcmdzOgotICAgICAgcHJvdG86IEFuIGVtcHR5IGRlc2NyaXB0b3JfcGIyLkZpbGVEZXNjcmlwdG9yUHJvdG8uCi0gICAgIiIiCi0gICAgcHJvdG8uUGFyc2VGcm9tU3RyaW5nKHNlbGYuc2VyaWFsaXplZF9wYikKLQotCi1kZWYgX1BhcnNlT3B0aW9ucyhtZXNzYWdlLCBzdHJpbmcpOgotICAiIiJQYXJzZXMgc2VyaWFsaXplZCBvcHRpb25zLgotCi0gIFRoaXMgaGVscGVyIGZ1bmN0aW9uIGlzIHVzZWQgdG8gcGFyc2Ugc2VyaWFsaXplZCBvcHRpb25zIGluIGdlbmVyYXRlZAotICBwcm90bzIgZmlsZXMuIEl0IG11c3Qgbm90IGJlIHVzZWQgb3V0c2lkZSBwcm90bzIuCi0gICIiIgotICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhzdHJpbmcpCi0gIHJldHVybiBtZXNzYWdlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9fX2luaXRfXy5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19faW5pdF9fLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4ZDFjOGI2Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL19faW5pdF9fLnB5CisrKyAvZGV2L251bGwKQEAgLTEgKzAsMCBAQAotIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvYXBpX2ltcGxlbWVudGF0aW9uLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBiM2U0MTJlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2FwaV9pbXBsZW1lbnRhdGlvbi5weQorKysgL2Rldi9udWxsCkBAIC0xLDY0ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiIKLVRoaXMgbW9kdWxlIGlzIHRoZSBjZW50cmFsIGVudGl0eSB0aGF0IGRldGVybWluZXMgd2hpY2ggaW1wbGVtZW50YXRpb24gb2YgdGhlCi1BUEkgaXMgdXNlZC4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCi0KLWltcG9ydCBvcwotIyBUaGlzIGVudmlyb25tZW50IHZhcmlhYmxlIGNhbiBiZSB1c2VkIHRvIHN3aXRjaCB0byBhIGNlcnRhaW4gaW1wbGVtZW50YXRpb24KLSMgb2YgdGhlIFB5dGhvbiBBUEkuIFJpZ2h0IG5vdyBvbmx5ICdweXRob24nIGFuZCAnY3BwJyBhcmUgdmFsaWQgdmFsdWVzLiBBbnkKLSMgb3RoZXIgdmFsdWUgd2lsbCBiZSBpZ25vcmVkLgotX2ltcGxlbWVudGF0aW9uX3R5cGUgPSBvcy5nZXRlbnYoJ1BST1RPQ09MX0JVRkZFUlNfUFlUSE9OX0lNUExFTUVOVEFUSU9OJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICdweXRob24nKQotCi0KLWlmIF9pbXBsZW1lbnRhdGlvbl90eXBlICE9ICdweXRob24nOgotICAjIEZvciBub3csIGJ5IGRlZmF1bHQgdXNlIHRoZSBwdXJlLVB5dGhvbiBpbXBsZW1lbnRhdGlvbi4KLSAgIyBUaGUgY29kZSBiZWxvdyBjaGVja3MgaWYgdGhlIEMgZXh0ZW5zaW9uIGlzIGF2YWlsYWJsZSBhbmQKLSAgIyB1c2VzIGl0IGlmIGl0IGlzIGF2YWlsYWJsZS4KLSAgX2ltcGxlbWVudGF0aW9uX3R5cGUgPSAnY3BwJwotICAjIyBEZXRlcm1pbmUgYXV0b21hdGljYWxseSB3aGljaCBpbXBsZW1lbnRhdGlvbiB0byB1c2UuCi0gICN0cnk6Ci0gICMgIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBjcHBfbWVzc2FnZQotICAjICBfaW1wbGVtZW50YXRpb25fdHlwZSA9ICdjcHAnCi0gICNleGNlcHQgSW1wb3J0RXJyb3IsIGU6Ci0gICMgIF9pbXBsZW1lbnRhdGlvbl90eXBlID0gJ3B5dGhvbicKLQotCi0jIFVzYWdlIG9mIHRoaXMgZnVuY3Rpb24gaXMgZGlzY291cmFnZWQuIENsaWVudHMgc2hvdWxkbid0IGNhcmUgd2hpY2gKLSMgaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSSBpcyBpbiB1c2UuIE5vdGUgdGhhdCB0aGVyZSBpcyBubyBndWFyYW50ZWUKLSMgdGhhdCBkaWZmZXJlbmNlcyBiZXR3ZWVuIEFQSXMgd2lsbCBiZSBtYWludGFpbmVkLgotIyBQbGVhc2UgZG9uJ3QgdXNlIHRoaXMgZnVuY3Rpb24gaWYgcG9zc2libGUuCi1kZWYgVHlwZSgpOgotICByZXR1cm4gX2ltcGxlbWVudGF0aW9uX3R5cGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9jb250YWluZXJzLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwOTdhM2MyLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NvbnRhaW5lcnMucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNTkgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkNvbnRhaW5zIGNvbnRhaW5lciBjbGFzc2VzIHRvIHJlcHJlc2VudCBkaWZmZXJlbnQgcHJvdG9jb2wgYnVmZmVyIHR5cGVzLgotCi1UaGlzIGZpbGUgZGVmaW5lcyBjb250YWluZXIgY2xhc3NlcyB3aGljaCByZXByZXNlbnQgY2F0ZWdvcmllcyBvZiBwcm90b2NvbAotYnVmZmVyIGZpZWxkIHR5cGVzIHdoaWNoIG5lZWQgZXh0cmEgbWFpbnRlbmFuY2UuIEN1cnJlbnRseSB0aGVzZSBjYXRlZ29yaWVzCi1hcmU6Ci0gIC0gUmVwZWF0ZWQgc2NhbGFyIGZpZWxkcyAtIFRoZXNlIGFyZSBhbGwgcmVwZWF0ZWQgZmllbGRzIHdoaWNoIGFyZW4ndAotICAgIGNvbXBvc2l0ZSAoZS5nLiB0aGV5IGFyZSBvZiBzaW1wbGUgdHlwZXMgbGlrZSBpbnQzMiwgc3RyaW5nLCBldGMpLgotICAtIFJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMgLSBSZXBlYXRlZCBmaWVsZHMgd2hpY2ggYXJlIGNvbXBvc2l0ZS4gVGhpcwotICAgIGluY2x1ZGVzIGdyb3VwcyBhbmQgbmVzdGVkIG1lc3NhZ2VzLgotIiIiCi0KLV9fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKLQotCi1jbGFzcyBCYXNlQ29udGFpbmVyKG9iamVjdCk6Ci0KLSAgIiIiQmFzZSBjb250YWluZXIgY2xhc3MuIiIiCi0KLSAgIyBNaW5pbWl6ZXMgbWVtb3J5IHVzYWdlIGFuZCBkaXNhbGxvd3MgYXNzaWdubWVudCB0byBvdGhlciBhdHRyaWJ1dGVzLgotICBfX3Nsb3RzX18gPSBbJ19tZXNzYWdlX2xpc3RlbmVyJywgJ192YWx1ZXMnXQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtZXNzYWdlX2xpc3RlbmVyKToKLSAgICAiIiIKLSAgICBBcmdzOgotICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQSBNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgIFRoZSBSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzCi0gICAgICAgIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gICAgIiIiCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lciA9IG1lc3NhZ2VfbGlzdGVuZXIKLSAgICBzZWxmLl92YWx1ZXMgPSBbXQotCi0gIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgICIiIlJldHJpZXZlcyBpdGVtIGJ5IHRoZSBzcGVjaWZpZWQga2V5LiIiIgotICAgIHJldHVybiBzZWxmLl92YWx1ZXNba2V5XQotCi0gIGRlZiBfX2xlbl9fKHNlbGYpOgotICAgICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiB0aGUgY29udGFpbmVyLiIiIgotICAgIHJldHVybiBsZW4oc2VsZi5fdmFsdWVzKQotCi0gIGRlZiBfX25lX18oc2VsZiwgb3RoZXIpOgotICAgICIiIkNoZWNrcyBpZiBhbm90aGVyIGluc3RhbmNlIGlzbid0IGVxdWFsIHRvIHRoaXMgb25lLiIiIgotICAgICMgVGhlIGNvbmNyZXRlIGNsYXNzZXMgc2hvdWxkIGRlZmluZSBfX2VxX18uCi0gICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCi0KLSAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgIHJhaXNlIFR5cGVFcnJvcigndW5oYXNoYWJsZSBvYmplY3QnKQotCi0gIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICByZXR1cm4gcmVwcihzZWxmLl92YWx1ZXMpCi0KLSAgZGVmIHNvcnQoc2VsZiwgc29ydF9mdW5jdGlvbj1jbXApOgotICAgIHNlbGYuX3ZhbHVlcy5zb3J0KHNvcnRfZnVuY3Rpb24pCi0KLQotY2xhc3MgUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lcihCYXNlQ29udGFpbmVyKToKLQotICAiIiJTaW1wbGUsIHR5cGUtY2hlY2tlZCwgbGlzdC1saWtlIGNvbnRhaW5lciBmb3IgaG9sZGluZyByZXBlYXRlZCBzY2FsYXJzLiIiIgotCi0gICMgRGlzYWxsb3dzIGFzc2lnbm1lbnQgdG8gb3RoZXIgYXR0cmlidXRlcy4KLSAgX19zbG90c19fID0gWydfdHlwZV9jaGVja2VyJ10KLQotICBkZWYgX19pbml0X18oc2VsZiwgbWVzc2FnZV9saXN0ZW5lciwgdHlwZV9jaGVja2VyKToKLSAgICAiIiIKLSAgICBBcmdzOgotICAgICAgbWVzc2FnZV9saXN0ZW5lcjogQSBNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uCi0gICAgICAgIFRoZSBSZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyIHdpbGwgY2FsbCB0aGlzIG9iamVjdCdzCi0gICAgICAgIE1vZGlmaWVkKCkgbWV0aG9kIHdoZW4gaXQgaXMgbW9kaWZpZWQuCi0gICAgICB0eXBlX2NoZWNrZXI6IEEgdHlwZV9jaGVja2Vycy5WYWx1ZUNoZWNrZXIgaW5zdGFuY2UgdG8gcnVuIG9uIGVsZW1lbnRzCi0gICAgICAgIGluc2VydGVkIGludG8gdGhpcyBjb250YWluZXIuCi0gICAgIiIiCi0gICAgc3VwZXIoUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lciwgc2VsZikuX19pbml0X18obWVzc2FnZV9saXN0ZW5lcikKLSAgICBzZWxmLl90eXBlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXIKLQotICBkZWYgYXBwZW5kKHNlbGYsIHZhbHVlKToKLSAgICAiIiJBcHBlbmRzIGFuIGl0ZW0gdG8gdGhlIGxpc3QuIFNpbWlsYXIgdG8gbGlzdC5hcHBlbmQoKS4iIiIKLSAgICBzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKLSAgICBzZWxmLl92YWx1ZXMuYXBwZW5kKHZhbHVlKQotICAgIGlmIG5vdCBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLmRpcnR5OgotICAgICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIGluc2VydChzZWxmLCBrZXksIHZhbHVlKToKLSAgICAiIiJJbnNlcnRzIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIFNpbWlsYXIgdG8gbGlzdC5pbnNlcnQoKS4iIiIKLSAgICBzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKLSAgICBzZWxmLl92YWx1ZXMuaW5zZXJ0KGtleSwgdmFsdWUpCi0gICAgaWYgbm90IHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuZGlydHk6Ci0gICAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgZXh0ZW5kKHNlbGYsIGVsZW1fc2VxKToKLSAgICAiIiJFeHRlbmRzIGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4gc2VxdWVuY2UuIFNpbWlsYXIgdG8gbGlzdC5leHRlbmQoKS4iIiIKLSAgICBpZiBub3QgZWxlbV9zZXE6Ci0gICAgICByZXR1cm4KLQotICAgIG5ld192YWx1ZXMgPSBbXQotICAgIGZvciBlbGVtIGluIGVsZW1fc2VxOgotICAgICAgc2VsZi5fdHlwZV9jaGVja2VyLkNoZWNrVmFsdWUoZWxlbSkKLSAgICAgIG5ld192YWx1ZXMuYXBwZW5kKGVsZW0pCi0gICAgc2VsZi5fdmFsdWVzLmV4dGVuZChuZXdfdmFsdWVzKQotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXIpOgotICAgICIiIkFwcGVuZHMgdGhlIGNvbnRlbnRzIG9mIGFub3RoZXIgcmVwZWF0ZWQgZmllbGQgb2YgdGhlIHNhbWUgdHlwZSB0byB0aGlzCi0gICAgb25lLiBXZSBkbyBub3QgY2hlY2sgdGhlIHR5cGVzIG9mIHRoZSBpbmRpdmlkdWFsIGZpZWxkcy4KLSAgICAiIiIKLSAgICBzZWxmLl92YWx1ZXMuZXh0ZW5kKG90aGVyLl92YWx1ZXMpCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIHJlbW92ZShzZWxmLCBlbGVtKToKLSAgICAiIiJSZW1vdmVzIGFuIGl0ZW0gZnJvbSB0aGUgbGlzdC4gU2ltaWxhciB0byBsaXN0LnJlbW92ZSgpLiIiIgotICAgIHNlbGYuX3ZhbHVlcy5yZW1vdmUoZWxlbSkKLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6Ci0gICAgIiIiU2V0cyB0aGUgaXRlbSBvbiB0aGUgc3BlY2lmaWVkIHBvc2l0aW9uLiIiIgotICAgIHNlbGYuX3R5cGVfY2hlY2tlci5DaGVja1ZhbHVlKHZhbHVlKQotICAgIHNlbGYuX3ZhbHVlc1trZXldID0gdmFsdWUKLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgX19nZXRzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKLSAgICAiIiJSZXRyaWV2ZXMgdGhlIHN1YnNldCBvZiBpdGVtcyBmcm9tIGJldHdlZW4gdGhlIHNwZWNpZmllZCBpbmRpY2VzLiIiIgotICAgIHJldHVybiBzZWxmLl92YWx1ZXNbc3RhcnQ6c3RvcF0KLQotICBkZWYgX19zZXRzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wLCB2YWx1ZXMpOgotICAgICIiIlNldHMgdGhlIHN1YnNldCBvZiBpdGVtcyBmcm9tIGJldHdlZW4gdGhlIHNwZWNpZmllZCBpbmRpY2VzLiIiIgotICAgIG5ld192YWx1ZXMgPSBbXQotICAgIGZvciB2YWx1ZSBpbiB2YWx1ZXM6Ci0gICAgICBzZWxmLl90eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKLSAgICAgIG5ld192YWx1ZXMuYXBwZW5kKHZhbHVlKQotICAgIHNlbGYuX3ZhbHVlc1tzdGFydDpzdG9wXSA9IG5ld192YWx1ZXMKLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgX19kZWxpdGVtX18oc2VsZiwga2V5KToKLSAgICAiIiJEZWxldGVzIHRoZSBpdGVtIGF0IHRoZSBzcGVjaWZpZWQgcG9zaXRpb24uIiIiCi0gICAgZGVsIHNlbGYuX3ZhbHVlc1trZXldCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIF9fZGVsc2xpY2VfXyhzZWxmLCBzdGFydCwgc3RvcCk6Ci0gICAgIiIiRGVsZXRlcyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCi0gICAgZGVsIHNlbGYuX3ZhbHVlc1tzdGFydDpzdG9wXQotICAgIHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuTW9kaWZpZWQoKQotCi0gIGRlZiBfX2VxX18oc2VsZiwgb3RoZXIpOgotICAgICIiIkNvbXBhcmVzIHRoZSBjdXJyZW50IGluc3RhbmNlIHdpdGggYW5vdGhlciBvbmUuIiIiCi0gICAgaWYgc2VsZiBpcyBvdGhlcjoKLSAgICAgIHJldHVybiBUcnVlCi0gICAgIyBTcGVjaWFsIGNhc2UgZm9yIHRoZSBzYW1lIHR5cGUgd2hpY2ggc2hvdWxkIGJlIGNvbW1vbiBhbmQgZmFzdC4KLSAgICBpZiBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICByZXR1cm4gb3RoZXIuX3ZhbHVlcyA9PSBzZWxmLl92YWx1ZXMKLSAgICAjIFdlIGFyZSBwcmVzdW1hYmx5IGNvbXBhcmluZyBhZ2FpbnN0IHNvbWUgb3RoZXIgc2VxdWVuY2UgdHlwZS4KLSAgICByZXR1cm4gb3RoZXIgPT0gc2VsZi5fdmFsdWVzCi0KLQotY2xhc3MgUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lcihCYXNlQ29udGFpbmVyKToKLQotICAiIiJTaW1wbGUsIGxpc3QtbGlrZSBjb250YWluZXIgZm9yIGhvbGRpbmcgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4iIiIKLQotICAjIERpc2FsbG93cyBhc3NpZ25tZW50IHRvIG90aGVyIGF0dHJpYnV0ZXMuCi0gIF9fc2xvdHNfXyA9IFsnX21lc3NhZ2VfZGVzY3JpcHRvciddCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG1lc3NhZ2VfbGlzdGVuZXIsIG1lc3NhZ2VfZGVzY3JpcHRvcik6Ci0gICAgIiIiCi0gICAgTm90ZSB0aGF0IHdlIHBhc3MgaW4gYSBkZXNjcmlwdG9yIGluc3RlYWQgb2YgdGhlIGdlbmVyYXRlZCBkaXJlY3RseSwKLSAgICBzaW5jZSBhdCB0aGUgdGltZSB3ZSBjb25zdHJ1Y3QgYSBfUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lciB3ZQotICAgIGhhdmVuJ3QgeWV0IG5lY2Vzc2FyaWx5IGluaXRpYWxpemVkIHRoZSB0eXBlIHRoYXQgd2lsbCBiZSBjb250YWluZWQgaW4gdGhlCi0gICAgY29udGFpbmVyLgotCi0gICAgQXJnczoKLSAgICAgIG1lc3NhZ2VfbGlzdGVuZXI6IEEgTWVzc2FnZUxpc3RlbmVyIGltcGxlbWVudGF0aW9uLgotICAgICAgICBUaGUgUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lciB3aWxsIGNhbGwgdGhpcyBvYmplY3QncwotICAgICAgICBNb2RpZmllZCgpIG1ldGhvZCB3aGVuIGl0IGlzIG1vZGlmaWVkLgotICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBBIERlc2NyaXB0b3IgaW5zdGFuY2UgZGVzY3JpYmluZyB0aGUgcHJvdG9jb2wgdHlwZQotICAgICAgICB0aGF0IHNob3VsZCBiZSBwcmVzZW50IGluIHRoaXMgY29udGFpbmVyLiAgV2UnbGwgdXNlIHRoZQotICAgICAgICBfY29uY3JldGVfY2xhc3MgZmllbGQgb2YgdGhpcyBkZXNjcmlwdG9yIHdoZW4gdGhlIGNsaWVudCBjYWxscyBhZGQoKS4KLSAgICAiIiIKLSAgICBzdXBlcihSZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyLCBzZWxmKS5fX2luaXRfXyhtZXNzYWdlX2xpc3RlbmVyKQotICAgIHNlbGYuX21lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvcgotCi0gIGRlZiBhZGQoc2VsZiwgKiprd2FyZ3MpOgotICAgICIiIkFkZHMgYSBuZXcgZWxlbWVudCBhdCB0aGUgZW5kIG9mIHRoZSBsaXN0IGFuZCByZXR1cm5zIGl0LiBLZXl3b3JkCi0gICAgYXJndW1lbnRzIG1heSBiZSB1c2VkIHRvIGluaXRpYWxpemUgdGhlIGVsZW1lbnQuCi0gICAgIiIiCi0gICAgbmV3X2VsZW1lbnQgPSBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IuX2NvbmNyZXRlX2NsYXNzKCoqa3dhcmdzKQotICAgIG5ld19lbGVtZW50Ll9TZXRMaXN0ZW5lcihzZWxmLl9tZXNzYWdlX2xpc3RlbmVyKQotICAgIHNlbGYuX3ZhbHVlcy5hcHBlbmQobmV3X2VsZW1lbnQpCi0gICAgaWYgbm90IHNlbGYuX21lc3NhZ2VfbGlzdGVuZXIuZGlydHk6Ci0gICAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLSAgICByZXR1cm4gbmV3X2VsZW1lbnQKLQotICBkZWYgZXh0ZW5kKHNlbGYsIGVsZW1fc2VxKToKLSAgICAiIiJFeHRlbmRzIGJ5IGFwcGVuZGluZyB0aGUgZ2l2ZW4gc2VxdWVuY2Ugb2YgZWxlbWVudHMgb2YgdGhlIHNhbWUgdHlwZQotICAgIGFzIHRoaXMgb25lLCBjb3B5aW5nIGVhY2ggaW5kaXZpZHVhbCBtZXNzYWdlLgotICAgICIiIgotICAgIG1lc3NhZ2VfY2xhc3MgPSBzZWxmLl9tZXNzYWdlX2Rlc2NyaXB0b3IuX2NvbmNyZXRlX2NsYXNzCi0gICAgbGlzdGVuZXIgPSBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyCi0gICAgdmFsdWVzID0gc2VsZi5fdmFsdWVzCi0gICAgZm9yIG1lc3NhZ2UgaW4gZWxlbV9zZXE6Ci0gICAgICBuZXdfZWxlbWVudCA9IG1lc3NhZ2VfY2xhc3MoKQotICAgICAgbmV3X2VsZW1lbnQuX1NldExpc3RlbmVyKGxpc3RlbmVyKQotICAgICAgbmV3X2VsZW1lbnQuTWVyZ2VGcm9tKG1lc3NhZ2UpCi0gICAgICB2YWx1ZXMuYXBwZW5kKG5ld19lbGVtZW50KQotICAgIGxpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyKToKLSAgICAiIiJBcHBlbmRzIHRoZSBjb250ZW50cyBvZiBhbm90aGVyIHJlcGVhdGVkIGZpZWxkIG9mIHRoZSBzYW1lIHR5cGUgdG8gdGhpcwotICAgIG9uZSwgY29weWluZyBlYWNoIGluZGl2aWR1YWwgbWVzc2FnZS4KLSAgICAiIiIKLSAgICBzZWxmLmV4dGVuZChvdGhlci5fdmFsdWVzKQotCi0gIGRlZiBfX2dldHNsaWNlX18oc2VsZiwgc3RhcnQsIHN0b3ApOgotICAgICIiIlJldHJpZXZlcyB0aGUgc3Vic2V0IG9mIGl0ZW1zIGZyb20gYmV0d2VlbiB0aGUgc3BlY2lmaWVkIGluZGljZXMuIiIiCi0gICAgcmV0dXJuIHNlbGYuX3ZhbHVlc1tzdGFydDpzdG9wXQotCi0gIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgICIiIkRlbGV0ZXMgdGhlIGl0ZW0gYXQgdGhlIHNwZWNpZmllZCBwb3NpdGlvbi4iIiIKLSAgICBkZWwgc2VsZi5fdmFsdWVzW2tleV0KLSAgICBzZWxmLl9tZXNzYWdlX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBkZWYgX19kZWxzbGljZV9fKHNlbGYsIHN0YXJ0LCBzdG9wKToKLSAgICAiIiJEZWxldGVzIHRoZSBzdWJzZXQgb2YgaXRlbXMgZnJvbSBiZXR3ZWVuIHRoZSBzcGVjaWZpZWQgaW5kaWNlcy4iIiIKLSAgICBkZWwgc2VsZi5fdmFsdWVzW3N0YXJ0OnN0b3BdCi0gICAgc2VsZi5fbWVzc2FnZV9saXN0ZW5lci5Nb2RpZmllZCgpCi0KLSAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgIiIiQ29tcGFyZXMgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugd2l0aCBhbm90aGVyIG9uZS4iIiIKLSAgICBpZiBzZWxmIGlzIG90aGVyOgotICAgICAgcmV0dXJuIFRydWUKLSAgICBpZiBub3QgaXNpbnN0YW5jZShvdGhlciwgc2VsZi5fX2NsYXNzX18pOgotICAgICAgcmFpc2UgVHlwZUVycm9yKCdDYW4gb25seSBjb21wYXJlIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMgYWdhaW5zdCAnCi0gICAgICAgICAgICAgICAgICAgICAgJ290aGVyIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZHMuJykKLSAgICByZXR1cm4gc2VsZi5fdmFsdWVzID09IG90aGVyLl92YWx1ZXMKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2NwcF9tZXNzYWdlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY3BwX21lc3NhZ2UucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDNmNDI2NTAuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvY3BwX21lc3NhZ2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2MTYgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkNvbnRhaW5zIGhlbHBlciBmdW5jdGlvbnMgdXNlZCB0byBjcmVhdGUgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGZyb20KLURlc2NyaXB0b3Igb2JqZWN0cyBhdCBydW50aW1lIGJhY2tlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIEMrKyBBUEkuCi0iIiIKLQotX19hdXRob3JfXyA9ICdwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpJwotCi1pbXBvcnQgb3BlcmF0b3IKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBfbmV0X3Byb3RvMl9fX3B5dGhvbgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKLQotCi1fTEFCRUxfUkVQRUFURUQgPSBfbmV0X3Byb3RvMl9fX3B5dGhvbi5MQUJFTF9SRVBFQVRFRAotX0xBQkVMX09QVElPTkFMID0gX25ldF9wcm90bzJfX19weXRob24uTEFCRUxfT1BUSU9OQUwKLV9DUFBUWVBFX01FU1NBR0UgPSBfbmV0X3Byb3RvMl9fX3B5dGhvbi5DUFBUWVBFX01FU1NBR0UKLV9UWVBFX01FU1NBR0UgPSBfbmV0X3Byb3RvMl9fX3B5dGhvbi5UWVBFX01FU1NBR0UKLQotCi1kZWYgR2V0RGVzY3JpcHRvclBvb2woKToKLSAgIiIiQ3JlYXRlcyBhIG5ldyBEZXNjcmlwdG9yUG9vbCBDKysgb2JqZWN0LiIiIgotICByZXR1cm4gX25ldF9wcm90bzJfX19weXRob24uTmV3Q0Rlc2NyaXB0b3JQb29sKCkKLQotCi1fcG9vbCA9IEdldERlc2NyaXB0b3JQb29sKCkKLQotCi1kZWYgR2V0RmllbGREZXNjcmlwdG9yKGZ1bGxfZmllbGRfbmFtZSk6Ci0gICIiIlNlYXJjaGVzIGZvciBhIGZpZWxkIGRlc2NyaXB0b3IgZ2l2ZW4gYSBmdWxsIGZpZWxkIG5hbWUuIiIiCi0gIHJldHVybiBfcG9vbC5GaW5kRmllbGRCeU5hbWUoZnVsbF9maWVsZF9uYW1lKQotCi0KLWRlZiBCdWlsZEZpbGUoY29udGVudCk6Ci0gICIiIlJlZ2lzdGVycyBhIG5ldyBwcm90byBmaWxlIGluIHRoZSB1bmRlcmx5aW5nIEMrKyBkZXNjcmlwdG9yIHBvb2wuIiIiCi0gIF9uZXRfcHJvdG8yX19fcHl0aG9uLkJ1aWxkRmlsZShjb250ZW50KQotCi0KLWRlZiBHZXRFeHRlbnNpb25EZXNjcmlwdG9yKGZ1bGxfZXh0ZW5zaW9uX25hbWUpOgotICAiIiJTZWFyY2hlcyBmb3IgZXh0ZW5zaW9uIGRlc2NyaXB0b3IgZ2l2ZW4gYSBmdWxsIGZpZWxkIG5hbWUuIiIiCi0gIHJldHVybiBfcG9vbC5GaW5kRXh0ZW5zaW9uQnlOYW1lKGZ1bGxfZXh0ZW5zaW9uX25hbWUpCi0KLQotZGVmIE5ld0NNZXNzYWdlKGZ1bGxfbWVzc2FnZV9uYW1lKToKLSAgIiIiQ3JlYXRlcyBhIG5ldyBDKysgcHJvdG9jb2wgbWVzc2FnZSBieSBpdHMgbmFtZS4iIiIKLSAgcmV0dXJuIF9uZXRfcHJvdG8yX19fcHl0aG9uLk5ld0NNZXNzYWdlKGZ1bGxfbWVzc2FnZV9uYW1lKQotCi0KLWRlZiBTY2FsYXJQcm9wZXJ0eShjZGVzY3JpcHRvcik6Ci0gICIiIlJldHVybnMgYSBzY2FsYXIgcHJvcGVydHkgZm9yIHRoZSBnaXZlbiBkZXNjcmlwdG9yLiIiIgotCi0gIGRlZiBHZXR0ZXIoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2Ntc2cuR2V0U2NhbGFyKGNkZXNjcmlwdG9yKQotCi0gIGRlZiBTZXR0ZXIoc2VsZiwgdmFsdWUpOgotICAgIHNlbGYuX2Ntc2cuU2V0U2NhbGFyKGNkZXNjcmlwdG9yLCB2YWx1ZSkKLQotICByZXR1cm4gcHJvcGVydHkoR2V0dGVyLCBTZXR0ZXIpCi0KLQotZGVmIENvbXBvc2l0ZVByb3BlcnR5KGNkZXNjcmlwdG9yLCBtZXNzYWdlX3R5cGUpOgotICAiIiJSZXR1cm5zIGEgUHl0aG9uIHByb3BlcnR5IHRoZSBnaXZlbiBjb21wb3NpdGUgZmllbGQuIiIiCi0KLSAgZGVmIEdldHRlcihzZWxmKToKLSAgICBzdWJfbWVzc2FnZSA9IHNlbGYuX2NvbXBvc2l0ZV9maWVsZHMuZ2V0KGNkZXNjcmlwdG9yLm5hbWUsIE5vbmUpCi0gICAgaWYgc3ViX21lc3NhZ2UgaXMgTm9uZToKLSAgICAgIGNtZXNzYWdlID0gc2VsZi5fY21zZy5OZXdTdWJNZXNzYWdlKGNkZXNjcmlwdG9yKQotICAgICAgc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3R5cGUuX2NvbmNyZXRlX2NsYXNzKF9fY21lc3NhZ2U9Y21lc3NhZ2UpCi0gICAgICBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2NkZXNjcmlwdG9yLm5hbWVdID0gc3ViX21lc3NhZ2UKLSAgICByZXR1cm4gc3ViX21lc3NhZ2UKLQotICByZXR1cm4gcHJvcGVydHkoR2V0dGVyKQotCi0KLWNsYXNzIFJlcGVhdGVkU2NhbGFyQ29udGFpbmVyKG9iamVjdCk6Ci0gICIiIkNvbnRhaW5lciBmb3IgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcy4iIiIKLQotICBfX3Nsb3RzX18gPSBbJ19tZXNzYWdlJywgJ19jZmllbGRfZGVzY3JpcHRvcicsICdfY21zZyddCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIG1zZywgY2ZpZWxkX2Rlc2NyaXB0b3IpOgotICAgIHNlbGYuX21lc3NhZ2UgPSBtc2cKLSAgICBzZWxmLl9jbXNnID0gbXNnLl9jbXNnCi0gICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IgPSBjZmllbGRfZGVzY3JpcHRvcgotCi0gIGRlZiBhcHBlbmQoc2VsZiwgdmFsdWUpOgotICAgIHNlbGYuX2Ntc2cuQWRkUmVwZWF0ZWRTY2FsYXIoCi0gICAgICAgIHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSkKLQotICBkZWYgZXh0ZW5kKHNlbGYsIHNlcXVlbmNlKToKLSAgICBmb3IgZWxlbWVudCBpbiBzZXF1ZW5jZToKLSAgICAgIHNlbGYuYXBwZW5kKGVsZW1lbnQpCi0KLSAgZGVmIGluc2VydChzZWxmLCBrZXksIHZhbHVlKToKLSAgICB2YWx1ZXMgPSBzZWxmW3NsaWNlKE5vbmUsIE5vbmUsIE5vbmUpXQotICAgIHZhbHVlcy5pbnNlcnQoa2V5LCB2YWx1ZSkKLSAgICBzZWxmLl9jbXNnLkFzc2lnblJlcGVhdGVkU2NhbGFyKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZXMpCi0KLSAgZGVmIHJlbW92ZShzZWxmLCB2YWx1ZSk6Ci0gICAgdmFsdWVzID0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KLSAgICB2YWx1ZXMucmVtb3ZlKHZhbHVlKQotICAgIHNlbGYuX2Ntc2cuQXNzaWduUmVwZWF0ZWRTY2FsYXIoc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIHZhbHVlcykKLQotICBkZWYgX19zZXRpdGVtX18oc2VsZiwga2V5LCB2YWx1ZSk6Ci0gICAgdmFsdWVzID0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KLSAgICB2YWx1ZXNba2V5XSA9IHZhbHVlCi0gICAgc2VsZi5fY21zZy5Bc3NpZ25SZXBlYXRlZFNjYWxhcihzZWxmLl9jZmllbGRfZGVzY3JpcHRvciwgdmFsdWVzKQotCi0gIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgIHJldHVybiBzZWxmLl9jbXNnLkdldFJlcGVhdGVkU2NhbGFyKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCBrZXkpCi0KLSAgZGVmIF9fZGVsaXRlbV9fKHNlbGYsIGtleSk6Ci0gICAgc2VsZi5fY21zZy5EZWxldGVSZXBlYXRlZEZpZWxkKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCBrZXkpCi0KLSAgZGVmIF9fbGVuX18oc2VsZik6Ci0gICAgcmV0dXJuIGxlbihzZWxmW3NsaWNlKE5vbmUsIE5vbmUsIE5vbmUpXSkKLQotICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKLSAgICBpZiBzZWxmIGlzIG90aGVyOgotICAgICAgcmV0dXJuIFRydWUKLSAgICBpZiBub3Qgb3BlcmF0b3IuaXNTZXF1ZW5jZVR5cGUob3RoZXIpOgotICAgICAgcmFpc2UgVHlwZUVycm9yKAotICAgICAgICAgICdDYW4gb25seSBjb21wYXJlIHJlcGVhdGVkIHNjYWxhciBmaWVsZHMgYWdhaW5zdCBzZXF1ZW5jZXMuJykKLSAgICAjIFdlIGFyZSBwcmVzdW1hYmx5IGNvbXBhcmluZyBhZ2FpbnN0IHNvbWUgb3RoZXIgc2VxdWVuY2UgdHlwZS4KLSAgICByZXR1cm4gb3RoZXIgPT0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KLQotICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKLSAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKLQotICBkZWYgX19oYXNoX18oc2VsZik6Ci0gICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCi0KLSAgZGVmIHNvcnQoc2VsZiwgc29ydF9mdW5jdGlvbj1jbXApOgotICAgIHZhbHVlcyA9IHNlbGZbc2xpY2UoTm9uZSwgTm9uZSwgTm9uZSldCi0gICAgdmFsdWVzLnNvcnQoc29ydF9mdW5jdGlvbikKLSAgICBzZWxmLl9jbXNnLkFzc2lnblJlcGVhdGVkU2NhbGFyKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZXMpCi0KLQotZGVmIFJlcGVhdGVkU2NhbGFyUHJvcGVydHkoY2Rlc2NyaXB0b3IpOgotICAiIiJSZXR1cm5zIGEgUHl0aG9uIHByb3BlcnR5IHRoZSBnaXZlbiByZXBlYXRlZCBzY2FsYXIgZmllbGQuIiIiCi0KLSAgZGVmIEdldHRlcihzZWxmKToKLSAgICBjb250YWluZXIgPSBzZWxmLl9jb21wb3NpdGVfZmllbGRzLmdldChjZGVzY3JpcHRvci5uYW1lLCBOb25lKQotICAgIGlmIGNvbnRhaW5lciBpcyBOb25lOgotICAgICAgY29udGFpbmVyID0gUmVwZWF0ZWRTY2FsYXJDb250YWluZXIoc2VsZiwgY2Rlc2NyaXB0b3IpCi0gICAgICBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2NkZXNjcmlwdG9yLm5hbWVdID0gY29udGFpbmVyCi0gICAgcmV0dXJuIGNvbnRhaW5lcgotCi0gIGRlZiBTZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKLSAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIGNkZXNjcmlwdG9yLm5hbWUpCi0KLSAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIGNkZXNjcmlwdG9yLm5hbWUKLSAgcmV0dXJuIHByb3BlcnR5KEdldHRlciwgU2V0dGVyLCBkb2M9ZG9jKQotCi0KLWNsYXNzIFJlcGVhdGVkQ29tcG9zaXRlQ29udGFpbmVyKG9iamVjdCk6Ci0gICIiIkNvbnRhaW5lciBmb3IgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4iIiIKLQotICBfX3Nsb3RzX18gPSBbJ19tZXNzYWdlJywgJ19zdWJjbGFzcycsICdfY2ZpZWxkX2Rlc2NyaXB0b3InLCAnX2Ntc2cnXQotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtc2csIGNmaWVsZF9kZXNjcmlwdG9yLCBzdWJjbGFzcyk6Ci0gICAgc2VsZi5fbWVzc2FnZSA9IG1zZwotICAgIHNlbGYuX2Ntc2cgPSBtc2cuX2Ntc2cKLSAgICBzZWxmLl9zdWJjbGFzcyA9IHN1YmNsYXNzCi0gICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IgPSBjZmllbGRfZGVzY3JpcHRvcgotCi0gIGRlZiBhZGQoc2VsZiwgKiprd2FyZ3MpOgotICAgIGNtZXNzYWdlID0gc2VsZi5fY21zZy5BZGRNZXNzYWdlKHNlbGYuX2NmaWVsZF9kZXNjcmlwdG9yKQotICAgIHJldHVybiBzZWxmLl9zdWJjbGFzcyhfX2NtZXNzYWdlPWNtZXNzYWdlLCBfX293bmVyPXNlbGYuX21lc3NhZ2UsICoqa3dhcmdzKQotCi0gIGRlZiBleHRlbmQoc2VsZiwgZWxlbV9zZXEpOgotICAgICIiIkV4dGVuZHMgYnkgYXBwZW5kaW5nIHRoZSBnaXZlbiBzZXF1ZW5jZSBvZiBlbGVtZW50cyBvZiB0aGUgc2FtZSB0eXBlCi0gICAgYXMgdGhpcyBvbmUsIGNvcHlpbmcgZWFjaCBpbmRpdmlkdWFsIG1lc3NhZ2UuCi0gICAgIiIiCi0gICAgZm9yIG1lc3NhZ2UgaW4gZWxlbV9zZXE6Ci0gICAgICBzZWxmLmFkZCgpLk1lcmdlRnJvbShtZXNzYWdlKQotCi0gIGRlZiBNZXJnZUZyb20oc2VsZiwgb3RoZXIpOgotICAgIGZvciBtZXNzYWdlIGluIG90aGVyWzpdOgotICAgICAgc2VsZi5hZGQoKS5NZXJnZUZyb20obWVzc2FnZSkKLQotICBkZWYgX19nZXRpdGVtX18oc2VsZiwga2V5KToKLSAgICBjbWVzc2FnZXMgPSBzZWxmLl9jbXNnLkdldFJlcGVhdGVkTWVzc2FnZSgKLSAgICAgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIGtleSkKLSAgICBzdWJjbGFzcyA9IHNlbGYuX3N1YmNsYXNzCi0gICAgaWYgbm90IGlzaW5zdGFuY2UoY21lc3NhZ2VzLCBsaXN0KToKLSAgICAgIHJldHVybiBzdWJjbGFzcyhfX2NtZXNzYWdlPWNtZXNzYWdlcywgX19vd25lcj1zZWxmLl9tZXNzYWdlKQotCi0gICAgcmV0dXJuIFtzdWJjbGFzcyhfX2NtZXNzYWdlPW0sIF9fb3duZXI9c2VsZi5fbWVzc2FnZSkgZm9yIG0gaW4gY21lc3NhZ2VzXQotCi0gIGRlZiBfX2RlbGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgIHNlbGYuX2Ntc2cuRGVsZXRlUmVwZWF0ZWRGaWVsZCgKLSAgICAgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIGtleSkKLQotICBkZWYgX19sZW5fXyhzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fY21zZy5GaWVsZExlbmd0aChzZWxmLl9jZmllbGRfZGVzY3JpcHRvcikKLQotICBkZWYgX19lcV9fKHNlbGYsIG90aGVyKToKLSAgICAiIiJDb21wYXJlcyB0aGUgY3VycmVudCBpbnN0YW5jZSB3aXRoIGFub3RoZXIgb25lLiIiIgotICAgIGlmIHNlbGYgaXMgb3RoZXI6Ci0gICAgICByZXR1cm4gVHJ1ZQotICAgIGlmIG5vdCBpc2luc3RhbmNlKG90aGVyLCBzZWxmLl9fY2xhc3NfXyk6Ci0gICAgICByYWlzZSBUeXBlRXJyb3IoJ0NhbiBvbmx5IGNvbXBhcmUgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcyBhZ2FpbnN0ICcKLSAgICAgICAgICAgICAgICAgICAgICAnb3RoZXIgcmVwZWF0ZWQgY29tcG9zaXRlIGZpZWxkcy4nKQotICAgIG1lc3NhZ2VzID0gc2VsZltzbGljZShOb25lLCBOb25lLCBOb25lKV0KLSAgICBvdGhlcl9tZXNzYWdlcyA9IG90aGVyW3NsaWNlKE5vbmUsIE5vbmUsIE5vbmUpXQotICAgIHJldHVybiBtZXNzYWdlcyA9PSBvdGhlcl9tZXNzYWdlcwotCi0gIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKLQotICBkZWYgc29ydChzZWxmLCBzb3J0X2Z1bmN0aW9uPWNtcCk6Ci0gICAgbWVzc2FnZXMgPSBbXQotICAgIGZvciBpbmRleCBpbiByYW5nZShsZW4oc2VsZikpOgotICAgICAgIyBtZXNzYWdlc1tpXVswXSBpcyB3aGVyZSB0aGUgaS10aCBlbGVtZW50IG9mIHRoZSBuZXcgYXJyYXkgaGFzIHRvIGNvbWUKLSAgICAgICMgZnJvbS4KLSAgICAgICMgbWVzc2FnZXNbaV1bMV0gaXMgd2hlcmUgdGhlIGktdGggZWxlbWVudCBvZiB0aGUgb2xkIGFycmF5IGhhcyB0byBnby4KLSAgICAgIG1lc3NhZ2VzLmFwcGVuZChbaW5kZXgsIDAsIHNlbGZbaW5kZXhdXSkKLSAgICBtZXNzYWdlcy5zb3J0KGxhbWJkYSB4LHk6IHNvcnRfZnVuY3Rpb24oeFsyXSwgeVsyXSkpCi0KLSAgICAjIFJlbWVtYmVyIHdoaWNoIHBvc2l0aW9uIGVhY2ggZWxlbWVudHMgaGFzIHRvIG1vdmUgdG8uCi0gICAgZm9yIGkgaW4gcmFuZ2UobGVuKG1lc3NhZ2VzKSk6Ci0gICAgICBtZXNzYWdlc1ttZXNzYWdlc1tpXVswXV1bMV0gPSBpCi0KLSAgICAjIEFwcGx5IHRoZSB0cmFuc3Bvc2l0aW9uLgotICAgIGZvciBpIGluIHJhbmdlKGxlbihtZXNzYWdlcykpOgotICAgICAgZnJvbV9wb3NpdGlvbiA9IG1lc3NhZ2VzW2ldWzBdCi0gICAgICBpZiBpID09IGZyb21fcG9zaXRpb246Ci0gICAgICAgIGNvbnRpbnVlCi0gICAgICBzZWxmLl9jbXNnLlN3YXBSZXBlYXRlZEZpZWxkRWxlbWVudHMoCi0gICAgICAgICAgc2VsZi5fY2ZpZWxkX2Rlc2NyaXB0b3IsIGksIGZyb21fcG9zaXRpb24pCi0gICAgICBtZXNzYWdlc1ttZXNzYWdlc1tpXVsxXV1bMF0gPSBmcm9tX3Bvc2l0aW9uCi0KLQotZGVmIFJlcGVhdGVkQ29tcG9zaXRlUHJvcGVydHkoY2Rlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZSk6Ci0gICIiIlJldHVybnMgYSBQeXRob24gcHJvcGVydHkgZm9yIHRoZSBnaXZlbiByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiIiCi0KLSAgZGVmIEdldHRlcihzZWxmKToKLSAgICBjb250YWluZXIgPSBzZWxmLl9jb21wb3NpdGVfZmllbGRzLmdldChjZGVzY3JpcHRvci5uYW1lLCBOb25lKQotICAgIGlmIGNvbnRhaW5lciBpcyBOb25lOgotICAgICAgY29udGFpbmVyID0gUmVwZWF0ZWRDb21wb3NpdGVDb250YWluZXIoCi0gICAgICAgICAgc2VsZiwgY2Rlc2NyaXB0b3IsIG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MpCi0gICAgICBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2NkZXNjcmlwdG9yLm5hbWVdID0gY29udGFpbmVyCi0gICAgcmV0dXJuIGNvbnRhaW5lcgotCi0gIGRlZiBTZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKLSAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIGNkZXNjcmlwdG9yLm5hbWUpCi0KLSAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIGNkZXNjcmlwdG9yLm5hbWUKLSAgcmV0dXJuIHByb3BlcnR5KEdldHRlciwgU2V0dGVyLCBkb2M9ZG9jKQotCi0KLWNsYXNzIEV4dGVuc2lvbkRpY3Qob2JqZWN0KToKLSAgIiIiRXh0ZW5zaW9uIGRpY3Rpb25hcnkgYWRkZWQgdG8gZWFjaCBwcm90b2NvbCBtZXNzYWdlLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtc2cpOgotICAgIHNlbGYuX21lc3NhZ2UgPSBtc2cKLSAgICBzZWxmLl9jbXNnID0gbXNnLl9jbXNnCi0gICAgc2VsZi5fdmFsdWVzID0ge30KLQotICBkZWYgX19zZXRpdGVtX18oc2VsZiwgZXh0ZW5zaW9uLCB2YWx1ZSk6Ci0gICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLSAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKLSAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCi0gICAgY2Rlc2NyaXB0b3IgPSBleHRlbnNpb24uX2NkZXNjcmlwdG9yCi0gICAgaWYgKGNkZXNjcmlwdG9yLmxhYmVsICE9IF9MQUJFTF9PUFRJT05BTCBvcgotICAgICAgICBjZGVzY3JpcHRvci5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFKToKLSAgICAgIHJhaXNlIFR5cGVFcnJvcignRXh0ZW5zaW9uICVyIGlzIHJlcGVhdGVkIGFuZC9vciBhIGNvbXBvc2l0ZSB0eXBlLicgJSAoCi0gICAgICAgICAgZXh0ZW5zaW9uLmZ1bGxfbmFtZSwpKQotICAgIHNlbGYuX2Ntc2cuU2V0U2NhbGFyKGNkZXNjcmlwdG9yLCB2YWx1ZSkKLSAgICBzZWxmLl92YWx1ZXNbZXh0ZW5zaW9uXSA9IHZhbHVlCi0KLSAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGV4dGVuc2lvbik6Ci0gICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLSAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKLSAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCi0KLSAgICBjZGVzY3JpcHRvciA9IGV4dGVuc2lvbi5fY2Rlc2NyaXB0b3IKLSAgICBpZiAoY2Rlc2NyaXB0b3IubGFiZWwgIT0gX0xBQkVMX1JFUEVBVEVEIGFuZAotICAgICAgICBjZGVzY3JpcHRvci5jcHBfdHlwZSAhPSBfQ1BQVFlQRV9NRVNTQUdFKToKLSAgICAgIHJldHVybiBzZWxmLl9jbXNnLkdldFNjYWxhcihjZGVzY3JpcHRvcikKLQotICAgIGV4dCA9IHNlbGYuX3ZhbHVlcy5nZXQoZXh0ZW5zaW9uLCBOb25lKQotICAgIGlmIGV4dCBpcyBub3QgTm9uZToKLSAgICAgIHJldHVybiBleHQKLQotICAgIGV4dCA9IHNlbGYuX0NyZWF0ZU5ld0hhbmRsZShleHRlbnNpb24pCi0gICAgc2VsZi5fdmFsdWVzW2V4dGVuc2lvbl0gPSBleHQKLSAgICByZXR1cm4gZXh0Ci0KLSAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik6Ci0gICAgZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLSAgICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb24sIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKToKLSAgICAgIHJhaXNlIEtleUVycm9yKCdCYWQgZXh0ZW5zaW9uICVyLicgJSAoZXh0ZW5zaW9uLCkpCi0gICAgc2VsZi5fY21zZy5DbGVhckZpZWxkQnlEZXNjcmlwdG9yKGV4dGVuc2lvbi5fY2Rlc2NyaXB0b3IpCi0gICAgaWYgZXh0ZW5zaW9uIGluIHNlbGYuX3ZhbHVlczoKLSAgICAgIGRlbCBzZWxmLl92YWx1ZXNbZXh0ZW5zaW9uXQotCi0gIGRlZiBIYXNFeHRlbnNpb24oc2VsZiwgZXh0ZW5zaW9uKToKLSAgICBmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotICAgIGlmIG5vdCBpc2luc3RhbmNlKGV4dGVuc2lvbiwgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IpOgotICAgICAgcmFpc2UgS2V5RXJyb3IoJ0JhZCBleHRlbnNpb24gJXIuJyAlIChleHRlbnNpb24sKSkKLSAgICByZXR1cm4gc2VsZi5fY21zZy5IYXNGaWVsZEJ5RGVzY3JpcHRvcihleHRlbnNpb24uX2NkZXNjcmlwdG9yKQotCi0gIGRlZiBfRmluZEV4dGVuc2lvbkJ5TmFtZShzZWxmLCBuYW1lKToKLSAgICAiIiJUcmllcyB0byBmaW5kIGEga25vd24gZXh0ZW5zaW9uIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lLgotCi0gICAgQXJnczoKLSAgICAgIG5hbWU6IEV4dGVuc2lvbiBmdWxsIG5hbWUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgRXh0ZW5zaW9uIGZpZWxkIGRlc2NyaXB0b3IuCi0gICAgIiIiCi0gICAgcmV0dXJuIHNlbGYuX21lc3NhZ2UuX2V4dGVuc2lvbnNfYnlfbmFtZS5nZXQobmFtZSwgTm9uZSkKLQotICBkZWYgX0NyZWF0ZU5ld0hhbmRsZShzZWxmLCBleHRlbnNpb24pOgotICAgIGNkZXNjcmlwdG9yID0gZXh0ZW5zaW9uLl9jZGVzY3JpcHRvcgotICAgIGlmIChjZGVzY3JpcHRvci5sYWJlbCAhPSBfTEFCRUxfUkVQRUFURUQgYW5kCi0gICAgICAgIGNkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0UpOgotICAgICAgY21lc3NhZ2UgPSBzZWxmLl9jbXNnLk5ld1N1Yk1lc3NhZ2UoY2Rlc2NyaXB0b3IpCi0gICAgICByZXR1cm4gZXh0ZW5zaW9uLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoX19jbWVzc2FnZT1jbWVzc2FnZSkKLQotICAgIGlmIGNkZXNjcmlwdG9yLmxhYmVsID09IF9MQUJFTF9SRVBFQVRFRDoKLSAgICAgIGlmIGNkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBSZXBlYXRlZENvbXBvc2l0ZUNvbnRhaW5lcigKLSAgICAgICAgICAgIHNlbGYuX21lc3NhZ2UsIGNkZXNjcmlwdG9yLCBleHRlbnNpb24ubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcykKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJldHVybiBSZXBlYXRlZFNjYWxhckNvbnRhaW5lcihzZWxmLl9tZXNzYWdlLCBjZGVzY3JpcHRvcikKLSAgICAjIFRoaXMgc2hvdWxkbid0IGhhcHBlbiEKLSAgICBhc3NlcnQgRmFsc2UKLSAgICByZXR1cm4gTm9uZQotCi0KLWRlZiBOZXdNZXNzYWdlKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6Ci0gICIiIkNyZWF0ZXMgYSBuZXcgcHJvdG9jb2wgbWVzc2FnZSAqY2xhc3MqLiIiIgotICBfQWRkQ2xhc3NBdHRyaWJ1dGVzRm9yTmVzdGVkRXh0ZW5zaW9ucyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpCi0gIF9BZGRFbnVtVmFsdWVzKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKLSAgX0FkZERlc2NyaXB0b3JzKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKLQotCi1kZWYgSW5pdE1lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJDb25zdHJ1Y3RzIGEgbmV3IG1lc3NhZ2UgaW5zdGFuY2UgKGNhbGxlZCBiZWZvcmUgaW5zdGFuY2UncyBfX2luaXRfXykuIiIiCi0gIGNscy5fZXh0ZW5zaW9uc19ieV9uYW1lID0ge30KLSAgX0FkZEluaXRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRNZXNzYWdlTWV0aG9kcyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotCi0KLWRlZiBfQWRkRGVzY3JpcHRvcnMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKLSAgIiIiU2V0cyB1cCBhIG5ldyBwcm90b2NvbCBtZXNzYWdlIGNsYXNzIGRpY3Rpb25hcnkuCi0KLSAgQXJnczoKLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IEEgRGVzY3JpcHRvciBpbnN0YW5jZSBkZXNjcmliaW5nIHRoaXMgbWVzc2FnZSB0eXBlLgotICAgIGRpY3Rpb25hcnk6IENsYXNzIGRpY3Rpb25hcnkgdG8gd2hpY2ggd2UnbGwgYWRkIGEgJ19fc2xvdHNfXycgZW50cnkuCi0gICIiIgotICBkaWN0aW9uYXJ5WydfX2Rlc2NyaXB0b3JzJ10gPSB7fQotICBmb3IgZmllbGQgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkczoKLSAgICBkaWN0aW9uYXJ5WydfX2Rlc2NyaXB0b3JzJ11bZmllbGQubmFtZV0gPSBHZXRGaWVsZERlc2NyaXB0b3IoCi0gICAgICAgIGZpZWxkLmZ1bGxfbmFtZSkKLQotICBkaWN0aW9uYXJ5WydfX3Nsb3RzX18nXSA9IGxpc3QoZGljdGlvbmFyeVsnX19kZXNjcmlwdG9ycyddLml0ZXJrZXlzKCkpICsgWwotICAgICAgJ19jbXNnJywgJ19vd25lcicsICdfY29tcG9zaXRlX2ZpZWxkcycsICdFeHRlbnNpb25zJ10KLQotCi1kZWYgX0FkZEVudW1WYWx1ZXMobWVzc2FnZV9kZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKLSAgIiIiU2V0cyBjbGFzcy1sZXZlbCBhdHRyaWJ1dGVzIGZvciBhbGwgZW51bSBmaWVsZHMgZGVmaW5lZCBpbiB0aGlzIG1lc3NhZ2UuCi0KLSAgQXJnczoKLSAgICBtZXNzYWdlX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3Igb2JqZWN0IGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KLSAgICBkaWN0aW9uYXJ5OiBDbGFzcyBkaWN0aW9uYXJ5IHRoYXQgc2hvdWxkIGJlIHBvcHVsYXRlZC4KLSAgIiIiCi0gIGZvciBlbnVtX3R5cGUgaW4gbWVzc2FnZV9kZXNjcmlwdG9yLmVudW1fdHlwZXM6Ci0gICAgZm9yIGVudW1fdmFsdWUgaW4gZW51bV90eXBlLnZhbHVlczoKLSAgICAgIGRpY3Rpb25hcnlbZW51bV92YWx1ZS5uYW1lXSA9IGVudW1fdmFsdWUubnVtYmVyCi0KLQotZGVmIF9BZGRDbGFzc0F0dHJpYnV0ZXNGb3JOZXN0ZWRFeHRlbnNpb25zKG1lc3NhZ2VfZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6Ci0gICIiIkFkZHMgY2xhc3MgYXR0cmlidXRlcyBmb3IgdGhlIG5lc3RlZCBleHRlbnNpb25zLiIiIgotICBleHRlbnNpb25fZGljdCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKLSAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6Ci0gICAgYXNzZXJ0IGV4dGVuc2lvbl9uYW1lIG5vdCBpbiBkaWN0aW9uYXJ5Ci0gICAgZGljdGlvbmFyeVtleHRlbnNpb25fbmFtZV0gPSBleHRlbnNpb25fZmllbGQKLQotCi1kZWYgX0FkZEluaXRNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJBZGRzIGFuIF9faW5pdF9fIG1ldGhvZCB0byBjbHMuIiIiCi0KLSAgIyBDcmVhdGUgYW5kIGF0dGFjaCBtZXNzYWdlIGZpZWxkIHByb3BlcnRpZXMgdG8gdGhlIG1lc3NhZ2UgY2xhc3MuCi0gICMgVGhpcyBjYW4gYmUgZG9uZSBqdXN0IG9uY2UgcGVyIG1lc3NhZ2UgY2xhc3MsIHNpbmNlIHByb3BlcnR5IHNldHRlcnMgYW5kCi0gICMgZ2V0dGVycyBhcmUgcGFzc2VkIHRoZSBtZXNzYWdlIGluc3RhbmNlLgotICAjIFRoaXMgbWFrZXMgbWVzc2FnZSBpbnN0YW50aWF0aW9uIGV4dHJlbWVseSBmYXN0LCBhbmQgYXQgdGhlIHNhbWUgdGltZSBpdAotICAjIGRvZXNuJ3QgcmVxdWlyZSB0aGUgY3JlYXRpb24gb2YgcHJvcGVydHkgb2JqZWN0cyBmb3IgZWFjaCBtZXNzYWdlIGluc3RhbmNlLAotICAjIHdoaWNoIHNhdmVzIGEgbG90IG9mIG1lbW9yeS4KLSAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6Ci0gICAgZmllbGRfY2Rlc2NyaXB0b3IgPSBjbHMuX19kZXNjcmlwdG9yc1tmaWVsZC5uYW1lXQotICAgIGlmIGZpZWxkLmxhYmVsID09IF9MQUJFTF9SRVBFQVRFRDoKLSAgICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIHZhbHVlID0gUmVwZWF0ZWRDb21wb3NpdGVQcm9wZXJ0eShmaWVsZF9jZGVzY3JpcHRvciwgZmllbGQubWVzc2FnZV90eXBlKQotICAgICAgZWxzZToKLSAgICAgICAgdmFsdWUgPSBSZXBlYXRlZFNjYWxhclByb3BlcnR5KGZpZWxkX2NkZXNjcmlwdG9yKQotICAgIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gX0NQUFRZUEVfTUVTU0FHRToKLSAgICAgIHZhbHVlID0gQ29tcG9zaXRlUHJvcGVydHkoZmllbGRfY2Rlc2NyaXB0b3IsIGZpZWxkLm1lc3NhZ2VfdHlwZSkKLSAgICBlbHNlOgotICAgICAgdmFsdWUgPSBTY2FsYXJQcm9wZXJ0eShmaWVsZF9jZGVzY3JpcHRvcikKLSAgICBzZXRhdHRyKGNscywgZmllbGQubmFtZSwgdmFsdWUpCi0KLSAgICAjIEF0dGFjaCBhIGNvbnN0YW50IHdpdGggdGhlIGZpZWxkIG51bWJlci4KLSAgICBjb25zdGFudF9uYW1lID0gZmllbGQubmFtZS51cHBlcigpICsgJ19GSUVMRF9OVU1CRVInCi0gICAgc2V0YXR0cihjbHMsIGNvbnN0YW50X25hbWUsIGZpZWxkLm51bWJlcikKLQotICBkZWYgSW5pdChzZWxmLCAqKmt3YXJncyk6Ci0gICAgIiIiTWVzc2FnZSBjb25zdHJ1Y3Rvci4iIiIKLSAgICBjbWVzc2FnZSA9IGt3YXJncy5wb3AoJ19fY21lc3NhZ2UnLCBOb25lKQotICAgIGlmIGNtZXNzYWdlIGlzIE5vbmU6Ci0gICAgICBzZWxmLl9jbXNnID0gTmV3Q01lc3NhZ2UobWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkKLSAgICBlbHNlOgotICAgICAgc2VsZi5fY21zZyA9IGNtZXNzYWdlCi0KLSAgICAjIEtlZXAgYSByZWZlcmVuY2UgdG8gdGhlIG93bmVyLCBhcyB0aGUgb3duZXIga2VlcHMgYSByZWZlcmVuY2UgdG8gdGhlCi0gICAgIyB1bmRlcmx5aW5nIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlLgotICAgIG93bmVyID0ga3dhcmdzLnBvcCgnX19vd25lcicsIE5vbmUpCi0gICAgaWYgb3duZXIgaXMgbm90IE5vbmU6Ci0gICAgICBzZWxmLl9vd25lciA9IG93bmVyCi0KLSAgICBzZWxmLkV4dGVuc2lvbnMgPSBFeHRlbnNpb25EaWN0KHNlbGYpCi0gICAgc2VsZi5fY29tcG9zaXRlX2ZpZWxkcyA9IHt9Ci0KLSAgICBmb3IgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgotICAgICAgZmllbGRfY2Rlc2NyaXB0b3IgPSBzZWxmLl9fZGVzY3JpcHRvcnMuZ2V0KGZpZWxkX25hbWUsIE5vbmUpCi0gICAgICBpZiBmaWVsZF9jZGVzY3JpcHRvciBpcyBOb25lOgotICAgICAgICByYWlzZSBWYWx1ZUVycm9yKCdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAiJXMiIGZpZWxkLicgJSBmaWVsZF9uYW1lKQotICAgICAgaWYgZmllbGRfY2Rlc2NyaXB0b3IubGFiZWwgPT0gX0xBQkVMX1JFUEVBVEVEOgotICAgICAgICBpZiBmaWVsZF9jZGVzY3JpcHRvci5jcHBfdHlwZSA9PSBfQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgIGZvciB2YWwgaW4gZmllbGRfdmFsdWU6Ci0gICAgICAgICAgICBnZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUpLmFkZCgpLk1lcmdlRnJvbSh2YWwpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgZ2V0YXR0cihzZWxmLCBmaWVsZF9uYW1lKS5leHRlbmQoZmllbGRfdmFsdWUpCi0gICAgICBlbGlmIGZpZWxkX2NkZXNjcmlwdG9yLmNwcF90eXBlID09IF9DUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGdldGF0dHIoc2VsZiwgZmllbGRfbmFtZSkuTWVyZ2VGcm9tKGZpZWxkX3ZhbHVlKQotICAgICAgZWxzZToKLSAgICAgICAgc2V0YXR0cihzZWxmLCBmaWVsZF9uYW1lLCBmaWVsZF92YWx1ZSkKLQotICBJbml0Ll9fbW9kdWxlX18gPSBOb25lCi0gIEluaXQuX19kb2NfXyA9IE5vbmUKLSAgY2xzLl9faW5pdF9fID0gSW5pdAotCi0KLWRlZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGZpZWxkKToKLSAgIiIiQ2hlY2tzIGlmIGEgZmllbGQgaXMgYSBtZXNzYWdlIHNldCBleHRlbnNpb24uIiIiCi0gIHJldHVybiAoZmllbGQuaXNfZXh0ZW5zaW9uIGFuZAotICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5oYXNfb3B0aW9ucyBhbmQKLSAgICAgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IGFuZAotICAgICAgICAgIGZpZWxkLnR5cGUgPT0gX1RZUEVfTUVTU0FHRSBhbmQKLSAgICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUgPT0gZmllbGQuZXh0ZW5zaW9uX3Njb3BlIGFuZAotICAgICAgICAgIGZpZWxkLmxhYmVsID09IF9MQUJFTF9PUFRJT05BTCkKLQotCi1kZWYgX0FkZE1lc3NhZ2VNZXRob2RzKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiQWRkcyB0aGUgbWV0aG9kcyB0byBhIHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuIiIiCi0gIGlmIG1lc3NhZ2VfZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgotCi0gICAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbik6Ci0gICAgICBzZWxmLkV4dGVuc2lvbnMuQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQotCi0gICAgZGVmIEhhc0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb24pOgotICAgICAgcmV0dXJuIHNlbGYuRXh0ZW5zaW9ucy5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKQotCi0gIGRlZiBIYXNGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKLSAgICByZXR1cm4gc2VsZi5fY21zZy5IYXNGaWVsZChmaWVsZF9uYW1lKQotCi0gIGRlZiBDbGVhckZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgotICAgIGlmIGZpZWxkX25hbWUgaW4gc2VsZi5fY29tcG9zaXRlX2ZpZWxkczoKLSAgICAgIGRlbCBzZWxmLl9jb21wb3NpdGVfZmllbGRzW2ZpZWxkX25hbWVdCi0gICAgc2VsZi5fY21zZy5DbGVhckZpZWxkKGZpZWxkX25hbWUpCi0KLSAgZGVmIENsZWFyKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9jbXNnLkNsZWFyKCkKLQotICBkZWYgSXNJbml0aWFsaXplZChzZWxmLCBlcnJvcnM9Tm9uZSk6Ci0gICAgaWYgc2VsZi5fY21zZy5Jc0luaXRpYWxpemVkKCk6Ci0gICAgICByZXR1cm4gVHJ1ZQotICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKLSAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSk7Ci0gICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIFNlcmlhbGl6ZVRvU3RyaW5nKHNlbGYpOgotICAgIGlmIG5vdCBzZWxmLklzSW5pdGlhbGl6ZWQoKToKLSAgICAgIHJhaXNlIG1lc3NhZ2UuRW5jb2RlRXJyb3IoCi0gICAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcgKwotICAgICAgICAgICcsJy5qb2luKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpKQotICAgIHJldHVybiBzZWxmLl9jbXNnLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICBkZWYgU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9jbXNnLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCi0KLSAgZGVmIFBhcnNlRnJvbVN0cmluZyhzZWxmLCBzZXJpYWxpemVkKToKLSAgICBzZWxmLkNsZWFyKCkKLSAgICBzZWxmLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotCi0gIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6Ci0gICAgYnl0ZV9zaXplID0gc2VsZi5fY21zZy5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBpZiBieXRlX3NpemUgPCAwOgotICAgICAgcmFpc2UgbWVzc2FnZS5EZWNvZGVFcnJvcignVW5hYmxlIHRvIG1lcmdlIGZyb20gc3RyaW5nLicpCi0gICAgcmV0dXJuIGJ5dGVfc2l6ZQotCi0gIGRlZiBNZXJnZUZyb20oc2VsZiwgbXNnKToKLSAgICBpZiBub3QgaXNpbnN0YW5jZShtc2csIGNscyk6Ci0gICAgICByYWlzZSBUeXBlRXJyb3IoCi0gICAgICAgICAgIlBhcmFtZXRlciB0byBNZXJnZUZyb20oKSBtdXN0IGJlIGluc3RhbmNlIG9mIHNhbWUgY2xhc3MuIikKLSAgICBzZWxmLl9jbXNnLk1lcmdlRnJvbShtc2cuX2Ntc2cpCi0KLSAgZGVmIENvcHlGcm9tKHNlbGYsIG1zZyk6Ci0gICAgc2VsZi5fY21zZy5Db3B5RnJvbShtc2cuX2Ntc2cpCi0KLSAgZGVmIEJ5dGVTaXplKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9jbXNnLkJ5dGVTaXplKCkKLQotICBkZWYgU2V0SW5QYXJlbnQoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2Ntc2cuU2V0SW5QYXJlbnQoKQotCi0gIGRlZiBMaXN0RmllbGRzKHNlbGYpOgotICAgIGFsbF9maWVsZHMgPSBbXQotICAgIGZpZWxkX2xpc3QgPSBzZWxmLl9jbXNnLkxpc3RGaWVsZHMoKQotICAgIGZpZWxkc19ieV9uYW1lID0gY2xzLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWUKLSAgICBmb3IgaXNfZXh0ZW5zaW9uLCBmaWVsZF9uYW1lIGluIGZpZWxkX2xpc3Q6Ci0gICAgICBpZiBpc19leHRlbnNpb246Ci0gICAgICAgIGV4dGVuc2lvbiA9IGNscy5fZXh0ZW5zaW9uc19ieV9uYW1lW2ZpZWxkX25hbWVdCi0gICAgICAgIGFsbF9maWVsZHMuYXBwZW5kKChleHRlbnNpb24sIHNlbGYuRXh0ZW5zaW9uc1tleHRlbnNpb25dKSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IgPSBmaWVsZHNfYnlfbmFtZVtmaWVsZF9uYW1lXQotICAgICAgICBhbGxfZmllbGRzLmFwcGVuZCgKLSAgICAgICAgICAgIChmaWVsZF9kZXNjcmlwdG9yLCBnZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUpKSkKLSAgICBhbGxfZmllbGRzLnNvcnQoa2V5PWxhbWJkYSBpdGVtOiBpdGVtWzBdLm51bWJlcikKLSAgICByZXR1cm4gYWxsX2ZpZWxkcwotCi0gIGRlZiBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2Ntc2cuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkKLQotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fY21zZy5EZWJ1Z1N0cmluZygpCi0KLSAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgaWYgc2VsZiBpcyBvdGhlcjoKLSAgICAgIHJldHVybiBUcnVlCi0gICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKLSAgICAgIHJldHVybiBGYWxzZQotICAgIHJldHVybiBzZWxmLkxpc3RGaWVsZHMoKSA9PSBvdGhlci5MaXN0RmllbGRzKCkKLQotICBkZWYgX19uZV9fKHNlbGYsIG90aGVyKToKLSAgICByZXR1cm4gbm90IHNlbGYgPT0gb3RoZXIKLQotICBkZWYgX19oYXNoX18oc2VsZik6Ci0gICAgcmFpc2UgVHlwZUVycm9yKCd1bmhhc2hhYmxlIG9iamVjdCcpCi0KLSAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgotICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZiwgYXNfdXRmOD1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKLQotICAjIEF0dGFjaCB0aGUgbG9jYWwgbWV0aG9kcyB0byB0aGUgbWVzc2FnZSBjbGFzcy4KLSAgZm9yIGtleSwgdmFsdWUgaW4gbG9jYWxzKCkuY29weSgpLml0ZXJpdGVtcygpOgotICAgIGlmIGtleSBub3QgaW4gKCdrZXknLCAndmFsdWUnLCAnX19idWlsdGluc19fJywgJ19fbmFtZV9fJywgJ19fZG9jX18nKToKLSAgICAgIHNldGF0dHIoY2xzLCBrZXksIHZhbHVlKQotCi0gICMgU3RhdGljIG1ldGhvZHM6Ci0KLSAgZGVmIFJlZ2lzdGVyRXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpOgotICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlID0gY2xzLkRFU0NSSVBUT1IKLSAgICBjbHMuX2V4dGVuc2lvbnNfYnlfbmFtZVtleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZV0gPSBleHRlbnNpb25faGFuZGxlCi0KLSAgICBpZiBfSXNNZXNzYWdlU2V0RXh0ZW5zaW9uKGV4dGVuc2lvbl9oYW5kbGUpOgotICAgICAgIyBNZXNzYWdlU2V0IGV4dGVuc2lvbi4gIEFsc28gcmVnaXN0ZXIgdW5kZXIgdHlwZSBuYW1lLgotICAgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbCi0gICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUuZnVsbF9uYW1lXSA9IGV4dGVuc2lvbl9oYW5kbGUKLSAgY2xzLlJlZ2lzdGVyRXh0ZW5zaW9uID0gc3RhdGljbWV0aG9kKFJlZ2lzdGVyRXh0ZW5zaW9uKQotCi0gIGRlZiBGcm9tU3RyaW5nKHN0cmluZyk6Ci0gICAgbXNnID0gY2xzKCkKLSAgICBtc2cuTWVyZ2VGcm9tU3RyaW5nKHN0cmluZykKLSAgICByZXR1cm4gbXNnCi0gIGNscy5Gcm9tU3RyaW5nID0gc3RhdGljbWV0aG9kKEZyb21TdHJpbmcpCi0KLQotCi1kZWYgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiQWRkcyBwcm9wZXJ0aWVzIGZvciBhbGwgZmllbGRzIGluIHRoaXMgcHJvdG9jb2wgbWVzc2FnZSB0eXBlLiIiIgotICBleHRlbnNpb25fZGljdCA9IG1lc3NhZ2VfZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKLSAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6Ci0gICAgY29uc3RhbnRfbmFtZSA9IGV4dGVuc2lvbl9uYW1lLnVwcGVyKCkgKyAnX0ZJRUxEX05VTUJFUicKLSAgICBzZXRhdHRyKGNscywgY29uc3RhbnRfbmFtZSwgZXh0ZW5zaW9uX2ZpZWxkLm51bWJlcikKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2RlY29kZXIucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZWNvZGVyLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA1NWY3NDZmLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2RlY29kZXIucHkKKysrIC9kZXYvbnVsbApAQCAtMSw3MTQgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkNvZGUgZm9yIGRlY29kaW5nIHByb3RvY29sIGJ1ZmZlciBwcmltaXRpdmVzLgotCi1UaGlzIGNvZGUgaXMgdmVyeSBzaW1pbGFyIHRvIGVuY29kZXIucHkgLS0gcmVhZCB0aGUgZG9jcyBmb3IgdGhhdCBtb2R1bGUgZmlyc3QuCi0KLUEgImRlY29kZXIiIGlzIGEgZnVuY3Rpb24gd2l0aCB0aGUgc2lnbmF0dXJlOgotICBEZWNvZGUoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCkKLVRoZSBhcmd1bWVudHMgYXJlOgotICBidWZmZXI6ICAgICBUaGUgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGVuY29kZWQgbWVzc2FnZS4KLSAgcG9zOiAgICAgICAgVGhlIGN1cnJlbnQgcG9zaXRpb24gaW4gdGhlIHN0cmluZy4KLSAgZW5kOiAgICAgICAgVGhlIHBvc2l0aW9uIGluIHRoZSBzdHJpbmcgd2hlcmUgdGhlIGN1cnJlbnQgbWVzc2FnZSBlbmRzLiAgTWF5IGJlCi0gICAgICAgICAgICAgIGxlc3MgdGhhbiBsZW4oYnVmZmVyKSBpZiB3ZSdyZSByZWFkaW5nIGEgc3ViLW1lc3NhZ2UuCi0gIG1lc3NhZ2U6ICAgIFRoZSBtZXNzYWdlIG9iamVjdCBpbnRvIHdoaWNoIHdlJ3JlIHBhcnNpbmcuCi0gIGZpZWxkX2RpY3Q6IG1lc3NhZ2UuX2ZpZWxkcyAoYXZvaWRzIGEgaGFzaHRhYmxlIGxvb2t1cCkuCi1UaGUgZGVjb2RlciByZWFkcyB0aGUgZmllbGQgYW5kIHN0b3JlcyBpdCBpbnRvIGZpZWxkX2RpY3QsIHJldHVybmluZyB0aGUgbmV3Ci1idWZmZXIgcG9zaXRpb24uICBBIGRlY29kZXIgZm9yIGEgcmVwZWF0ZWQgZmllbGQgbWF5IHByb2FjdGl2ZWx5IGRlY29kZSBhbGwgb2YKLXRoZSBlbGVtZW50cyBvZiB0aGF0IGZpZWxkLCBpZiB0aGV5IGFwcGVhciBjb25zZWN1dGl2ZWx5LgotCi1Ob3RlIHRoYXQgZGVjb2RlcnMgbWF5IHRocm93IGFueSBvZiB0aGUgZm9sbG93aW5nOgotICBJbmRleEVycm9yOiAgSW5kaWNhdGVzIGEgdHJ1bmNhdGVkIG1lc3NhZ2UuCi0gIHN0cnVjdC5lcnJvcjogIFVucGFja2luZyBvZiBhIGZpeGVkLXdpZHRoIGZpZWxkIGZhaWxlZC4KLSAgbWVzc2FnZS5EZWNvZGVFcnJvcjogIE90aGVyIGVycm9ycy4KLQotRGVjb2RlcnMgYXJlIGV4cGVjdGVkIHRvIHJhaXNlIGFuIGV4Y2VwdGlvbiBpZiB0aGV5IGFyZSBjYWxsZWQgd2l0aCBwb3MgPiBlbmQuCi1UaGlzIGFsbG93cyBjYWxsZXJzIHRvIGJlIGxheCBhYm91dCBib3VuZHMgY2hlY2tpbmc6ICBpdCdzIGZpbmV0byByZWFkIHBhc3QKLSJlbmQiIGFzIGxvbmcgYXMgeW91IGFyZSBzdXJlIHRoYXQgc29tZW9uZSBlbHNlIHdpbGwgbm90aWNlIGFuZCB0aHJvdyBhbgotZXhjZXB0aW9uIGxhdGVyIG9uLgotCi1Tb21ldGhpbmcgdXAgdGhlIGNhbGwgc3RhY2sgaXMgZXhwZWN0ZWQgdG8gY2F0Y2ggSW5kZXhFcnJvciBhbmQgc3RydWN0LmVycm9yCi1hbmQgY29udmVydCB0aGVtIHRvIG1lc3NhZ2UuRGVjb2RlRXJyb3IuCi0KLURlY29kZXJzIGFyZSBjb25zdHJ1Y3RlZCB1c2luZyBkZWNvZGVyIGNvbnN0cnVjdG9ycyB3aXRoIHRoZSBzaWduYXR1cmU6Ci0gIE1ha2VEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCkKLVRoZSBhcmd1bWVudHMgYXJlOgotICBmaWVsZF9udW1iZXI6ICBUaGUgZmllbGQgbnVtYmVyIG9mIHRoZSBmaWVsZCB3ZSB3YW50IHRvIGRlY29kZS4KLSAgaXNfcmVwZWF0ZWQ6ICAgSXMgdGhlIGZpZWxkIGEgcmVwZWF0ZWQgZmllbGQ/IChib29sKQotICBpc19wYWNrZWQ6ICAgICBJcyB0aGUgZmllbGQgYSBwYWNrZWQgZmllbGQ/IChib29sKQotICBrZXk6ICAgICAgICAgICBUaGUga2V5IHRvIHVzZSB3aGVuIGxvb2tpbmcgdXAgdGhlIGZpZWxkIHdpdGhpbiBmaWVsZF9kaWN0LgotICAgICAgICAgICAgICAgICAoVGhpcyBpcyBhY3R1YWxseSB0aGUgRmllbGREZXNjcmlwdG9yIGJ1dCBub3RoaW5nIGluIHRoaXMKLSAgICAgICAgICAgICAgICAgZmlsZSBzaG91bGQgZGVwZW5kIG9uIHRoYXQuKQotICBuZXdfZGVmYXVsdDogICBBIGZ1bmN0aW9uIHdoaWNoIHRha2VzIGEgbWVzc2FnZSBvYmplY3QgYXMgYSBwYXJhbWV0ZXIgYW5kCi0gICAgICAgICAgICAgICAgIHJldHVybnMgYSBuZXcgaW5zdGFuY2Ugb2YgdGhlIGRlZmF1bHQgdmFsdWUgZm9yIHRoaXMgZmllbGQuCi0gICAgICAgICAgICAgICAgIChUaGlzIGlzIGNhbGxlZCBmb3IgcmVwZWF0ZWQgZmllbGRzIGFuZCBzdWItbWVzc2FnZXMsIHdoZW4gYW4KLSAgICAgICAgICAgICAgICAgaW5zdGFuY2UgZG9lcyBub3QgYWxyZWFkeSBleGlzdC4pCi0KLUFzIHdpdGggZW5jb2RlcnMsIHdlIGRlZmluZSBhIGRlY29kZXIgY29uc3RydWN0b3IgZm9yIGV2ZXJ5IHR5cGUgb2YgZmllbGQuCi1UaGVuLCBmb3IgZXZlcnkgZmllbGQgb2YgZXZlcnkgbWVzc2FnZSBjbGFzcyB3ZSBjb25zdHJ1Y3QgYW4gYWN0dWFsIGRlY29kZXIuCi1UaGF0IGRlY29kZXIgZ29lcyBpbnRvIGEgZGljdCBpbmRleGVkIGJ5IHRhZywgc28gd2hlbiB3ZSBkZWNvZGUgYSBtZXNzYWdlCi13ZSByZXBlYXRlZGx5IHJlYWQgYSB0YWcsIGxvb2sgdXAgdGhlIGNvcnJlc3BvbmRpbmcgZGVjb2RlciwgYW5kIGludm9rZSBpdC4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ2tlbnRvbkBnb29nbGUuY29tIChLZW50b24gVmFyZGEpJwotCi1pbXBvcnQgc3RydWN0Ci1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW5jb2RlcgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0Ci1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQotCi0KLSMgVGhpcyB3aWxsIG92ZXJmbG93IGFuZCB0aHVzIGJlY29tZSBJRUVFLTc1NCAiaW5maW5pdHkiLiAgV2Ugd291bGQgdXNlCi0jICJmbG9hdCgnaW5mJykiIGJ1dCBpdCBkb2Vzbid0IHdvcmsgb24gV2luZG93cyBwcmUtUHl0aG9uLTIuNi4KLV9QT1NfSU5GID0gMWUxMDAwMAotX05FR19JTkYgPSAtX1BPU19JTkYKLV9OQU4gPSBfUE9TX0lORiAqIDAKLQotCi0jIFRoaXMgaXMgbm90IGZvciBvcHRpbWl6YXRpb24sIGJ1dCByYXRoZXIgdG8gYXZvaWQgY29uZmxpY3RzIHdpdGggbG9jYWwKLSMgdmFyaWFibGVzIG5hbWVkICJtZXNzYWdlIi4KLV9EZWNvZGVFcnJvciA9IG1lc3NhZ2UuRGVjb2RlRXJyb3IKLQotCi1kZWYgX1ZhcmludERlY29kZXIobWFzayk6Ci0gICIiIlJldHVybiBhbiBlbmNvZGVyIGZvciBhIGJhc2ljIHZhcmludCB2YWx1ZSAoZG9lcyBub3QgaW5jbHVkZSB0YWcpLgotCi0gIERlY29kZWQgdmFsdWVzIHdpbGwgYmUgYml0d2lzZS1hbmRlZCB3aXRoIHRoZSBnaXZlbiBtYXNrIGJlZm9yZSBiZWluZwotICByZXR1cm5lZCwgZS5nLiB0byBsaW1pdCB0aGVtIHRvIDMyIGJpdHMuICBUaGUgcmV0dXJuZWQgZGVjb2RlciBkb2VzIG5vdAotICB0YWtlIHRoZSB1c3VhbCAiZW5kIiBwYXJhbWV0ZXIgLS0gdGhlIGNhbGxlciBpcyBleHBlY3RlZCB0byBkbyBib3VuZHMgY2hlY2tpbmcKLSAgYWZ0ZXIgdGhlIGZhY3QgKG9mdGVuIHRoZSBjYWxsZXIgY2FuIGRlZmVyIHN1Y2ggY2hlY2tpbmcgdW50aWwgbGF0ZXIpLiAgVGhlCi0gIGRlY29kZXIgcmV0dXJucyBhICh2YWx1ZSwgbmV3X3BvcykgcGFpci4KLSAgIiIiCi0KLSAgbG9jYWxfb3JkID0gb3JkCi0gIGRlZiBEZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpOgotICAgIHJlc3VsdCA9IDAKLSAgICBzaGlmdCA9IDAKLSAgICB3aGlsZSAxOgotICAgICAgYiA9IGxvY2FsX29yZChidWZmZXJbcG9zXSkKLSAgICAgIHJlc3VsdCB8PSAoKGIgJiAweDdmKSA8PCBzaGlmdCkKLSAgICAgIHBvcyArPSAxCi0gICAgICBpZiBub3QgKGIgJiAweDgwKToKLSAgICAgICAgcmVzdWx0ICY9IG1hc2sKLSAgICAgICAgcmV0dXJuIChyZXN1bHQsIHBvcykKLSAgICAgIHNoaWZ0ICs9IDcKLSAgICAgIGlmIHNoaWZ0ID49IDY0OgotICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RvbyBtYW55IGJ5dGVzIHdoZW4gZGVjb2RpbmcgdmFyaW50LicpCi0gIHJldHVybiBEZWNvZGVWYXJpbnQKLQotCi1kZWYgX1NpZ25lZFZhcmludERlY29kZXIobWFzayk6Ci0gICIiIkxpa2UgX1ZhcmludERlY29kZXIoKSBidXQgZGVjb2RlcyBzaWduZWQgdmFsdWVzLiIiIgotCi0gIGxvY2FsX29yZCA9IG9yZAotICBkZWYgRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKToKLSAgICByZXN1bHQgPSAwCi0gICAgc2hpZnQgPSAwCi0gICAgd2hpbGUgMToKLSAgICAgIGIgPSBsb2NhbF9vcmQoYnVmZmVyW3Bvc10pCi0gICAgICByZXN1bHQgfD0gKChiICYgMHg3ZikgPDwgc2hpZnQpCi0gICAgICBwb3MgKz0gMQotICAgICAgaWYgbm90IChiICYgMHg4MCk6Ci0gICAgICAgIGlmIHJlc3VsdCA+IDB4N2ZmZmZmZmZmZmZmZmZmZjoKLSAgICAgICAgICByZXN1bHQgLT0gKDEgPDwgNjQpCi0gICAgICAgICAgcmVzdWx0IHw9IH5tYXNrCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgcmVzdWx0ICY9IG1hc2sKLSAgICAgICAgcmV0dXJuIChyZXN1bHQsIHBvcykKLSAgICAgIHNoaWZ0ICs9IDcKLSAgICAgIGlmIHNoaWZ0ID49IDY0OgotICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RvbyBtYW55IGJ5dGVzIHdoZW4gZGVjb2RpbmcgdmFyaW50LicpCi0gIHJldHVybiBEZWNvZGVWYXJpbnQKLQotCi1fRGVjb2RlVmFyaW50ID0gX1ZhcmludERlY29kZXIoKDEgPDwgNjQpIC0gMSkKLV9EZWNvZGVTaWduZWRWYXJpbnQgPSBfU2lnbmVkVmFyaW50RGVjb2RlcigoMSA8PCA2NCkgLSAxKQotCi0jIFVzZSB0aGVzZSB2ZXJzaW9ucyBmb3IgdmFsdWVzIHdoaWNoIG11c3QgYmUgbGltaXRlZCB0byAzMiBiaXRzLgotX0RlY29kZVZhcmludDMyID0gX1ZhcmludERlY29kZXIoKDEgPDwgMzIpIC0gMSkKLV9EZWNvZGVTaWduZWRWYXJpbnQzMiA9IF9TaWduZWRWYXJpbnREZWNvZGVyKCgxIDw8IDMyKSAtIDEpCi0KLQotZGVmIFJlYWRUYWcoYnVmZmVyLCBwb3MpOgotICAiIiJSZWFkIGEgdGFnIGZyb20gdGhlIGJ1ZmZlciwgYW5kIHJldHVybiBhICh0YWdfYnl0ZXMsIG5ld19wb3MpIHR1cGxlLgotCi0gIFdlIHJldHVybiB0aGUgcmF3IGJ5dGVzIG9mIHRoZSB0YWcgcmF0aGVyIHRoYW4gZGVjb2RpbmcgdGhlbS4gIFRoZSByYXcKLSAgYnl0ZXMgY2FuIHRoZW4gYmUgdXNlZCB0byBsb29rIHVwIHRoZSBwcm9wZXIgZGVjb2Rlci4gIFRoaXMgZWZmZWN0aXZlbHkgYWxsb3dzCi0gIHVzIHRvIHRyYWRlIHNvbWUgd29yayB0aGF0IHdvdWxkIGJlIGRvbmUgaW4gcHVyZS1weXRob24gKGRlY29kaW5nIGEgdmFyaW50KQotICBmb3Igd29yayB0aGF0IGlzIGRvbmUgaW4gQyAoc2VhcmNoaW5nIGZvciBhIGJ5dGUgc3RyaW5nIGluIGEgaGFzaCB0YWJsZSkuCi0gIEluIGEgbG93LWxldmVsIGxhbmd1YWdlIGl0IHdvdWxkIGJlIG11Y2ggY2hlYXBlciB0byBkZWNvZGUgdGhlIHZhcmludCBhbmQKLSAgdXNlIHRoYXQsIGJ1dCBub3QgaW4gUHl0aG9uLgotICAiIiIKLQotICBzdGFydCA9IHBvcwotICB3aGlsZSBvcmQoYnVmZmVyW3Bvc10pICYgMHg4MDoKLSAgICBwb3MgKz0gMQotICBwb3MgKz0gMQotICByZXR1cm4gKGJ1ZmZlcltzdGFydDpwb3NdLCBwb3MpCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotCi0KLWRlZiBfU2ltcGxlRGVjb2Rlcih3aXJlX3R5cGUsIGRlY29kZV92YWx1ZSk6Ci0gICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhIGRlY29kZXIgZm9yIGZpZWxkcyBvZiBhIHBhcnRpY3VsYXIgdHlwZS4KLQotICBBcmdzOgotICAgICAgd2lyZV90eXBlOiAgVGhlIGZpZWxkJ3Mgd2lyZSB0eXBlLgotICAgICAgZGVjb2RlX3ZhbHVlOiAgQSBmdW5jdGlvbiB3aGljaCBkZWNvZGVzIGFuIGluZGl2aWR1YWwgdmFsdWUsIGUuZy4KLSAgICAgICAgX0RlY29kZVZhcmludCgpCi0gICIiIgotCi0gIGRlZiBTcGVjaWZpY0RlY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLCBrZXksIG5ld19kZWZhdWx0KToKLSAgICBpZiBpc19wYWNrZWQ6Ci0gICAgICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0gICAgICBkZWYgRGVjb2RlUGFja2VkRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQotICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCi0gICAgICAgIChlbmRwb2ludCwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKLSAgICAgICAgZW5kcG9pbnQgKz0gcG9zCi0gICAgICAgIGlmIGVuZHBvaW50ID4gZW5kOgotICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICAgICAgd2hpbGUgcG9zIDwgZW5kcG9pbnQ6Ci0gICAgICAgICAgKGVsZW1lbnQsIHBvcykgPSBkZWNvZGVfdmFsdWUoYnVmZmVyLCBwb3MpCi0gICAgICAgICAgdmFsdWUuYXBwZW5kKGVsZW1lbnQpCi0gICAgICAgIGlmIHBvcyA+IGVuZHBvaW50OgotICAgICAgICAgIGRlbCB2YWx1ZVstMV0gICAjIERpc2NhcmQgY29ycnVwdCB2YWx1ZS4KLSAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1BhY2tlZCBlbGVtZW50IHdhcyB0cnVuY2F0ZWQuJykKLSAgICAgICAgcmV0dXJuIHBvcwotICAgICAgcmV0dXJuIERlY29kZVBhY2tlZEZpZWxkCi0gICAgZWxpZiBpc19yZXBlYXRlZDoKLSAgICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKLSAgICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKLSAgICAgICAgaWYgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgICB3aGlsZSAxOgotICAgICAgICAgIChlbGVtZW50LCBuZXdfcG9zKSA9IGRlY29kZV92YWx1ZShidWZmZXIsIHBvcykKLSAgICAgICAgICB2YWx1ZS5hcHBlbmQoZWxlbWVudCkKLSAgICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkCi0gICAgICAgICAgIyBmaWVsZC4KLSAgICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgotICAgICAgICAgIGlmIGJ1ZmZlcltuZXdfcG9zOnBvc10gIT0gdGFnX2J5dGVzIG9yIG5ld19wb3MgPj0gZW5kOgotICAgICAgICAgICAgIyBQcmVkaWN0aW9uIGZhaWxlZC4gIFJldHVybi4KLSAgICAgICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICAgICAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgICByZXR1cm4gRGVjb2RlUmVwZWF0ZWRGaWVsZAotICAgIGVsc2U6Ci0gICAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICAgIChmaWVsZF9kaWN0W2tleV0sIHBvcykgPSBkZWNvZGVfdmFsdWUoYnVmZmVyLCBwb3MpCi0gICAgICAgIGlmIHBvcyA+IGVuZDoKLSAgICAgICAgICBkZWwgZmllbGRfZGljdFtrZXldICAjIERpc2NhcmQgY29ycnVwdCB2YWx1ZS4KLSAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCi0gICAgICAgIHJldHVybiBwb3MKLSAgICAgIHJldHVybiBEZWNvZGVGaWVsZAotCi0gIHJldHVybiBTcGVjaWZpY0RlY29kZXIKLQotCi1kZWYgX01vZGlmaWVkRGVjb2Rlcih3aXJlX3R5cGUsIGRlY29kZV92YWx1ZSwgbW9kaWZ5X3ZhbHVlKToKLSAgIiIiTGlrZSBTaW1wbGVEZWNvZGVyIGJ1dCBhZGRpdGlvbmFsbHkgaW52b2tlcyBtb2RpZnlfdmFsdWUgb24gZXZlcnkgdmFsdWUKLSAgYmVmb3JlIHN0b3JpbmcgaXQuICBVc3VhbGx5IG1vZGlmeV92YWx1ZSBpcyBaaWdaYWdEZWNvZGUuCi0gICIiIgotCi0gICMgUmV1c2luZyBfU2ltcGxlRGVjb2RlciBpcyBzbGlnaHRseSBzbG93ZXIgdGhhbiBjb3B5aW5nIGEgYnVuY2ggb2YgY29kZSwgYnV0Ci0gICMgbm90IGVub3VnaCB0byBtYWtlIGEgc2lnbmlmaWNhbnQgZGlmZmVyZW5jZS4KLQotICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgotICAgIChyZXN1bHQsIG5ld19wb3MpID0gZGVjb2RlX3ZhbHVlKGJ1ZmZlciwgcG9zKQotICAgIHJldHVybiAobW9kaWZ5X3ZhbHVlKHJlc3VsdCksIG5ld19wb3MpCi0gIHJldHVybiBfU2ltcGxlRGVjb2Rlcih3aXJlX3R5cGUsIElubmVyRGVjb2RlKQotCi0KLWRlZiBfU3RydWN0UGFja0RlY29kZXIod2lyZV90eXBlLCBmb3JtYXQpOgotICAiIiJSZXR1cm4gYSBjb25zdHJ1Y3RvciBmb3IgYSBkZWNvZGVyIGZvciBhIGZpeGVkLXdpZHRoIGZpZWxkLgotCi0gIEFyZ3M6Ci0gICAgICB3aXJlX3R5cGU6ICBUaGUgZmllbGQncyB3aXJlIHR5cGUuCi0gICAgICBmb3JtYXQ6ICBUaGUgZm9ybWF0IHN0cmluZyB0byBwYXNzIHRvIHN0cnVjdC51bnBhY2soKS4KLSAgIiIiCi0KLSAgdmFsdWVfc2l6ZSA9IHN0cnVjdC5jYWxjc2l6ZShmb3JtYXQpCi0gIGxvY2FsX3VucGFjayA9IHN0cnVjdC51bnBhY2sKLQotICAjIFJldXNpbmcgX1NpbXBsZURlY29kZXIgaXMgc2xpZ2h0bHkgc2xvd2VyIHRoYW4gY29weWluZyBhIGJ1bmNoIG9mIGNvZGUsIGJ1dAotICAjIG5vdCBlbm91Z2ggdG8gbWFrZSBhIHNpZ25pZmljYW50IGRpZmZlcmVuY2UuCi0KLSAgIyBOb3RlIHRoYXQgd2UgZXhwZWN0IHNvbWVvbmUgdXAtc3RhY2sgdG8gY2F0Y2ggc3RydWN0LmVycm9yIGFuZCBjb252ZXJ0Ci0gICMgaXQgdG8gX0RlY29kZUVycm9yIC0tIHRoaXMgd2F5IHdlIGRvbid0IGhhdmUgdG8gc2V0IHVwIGV4Y2VwdGlvbi0KLSAgIyBoYW5kbGluZyBibG9ja3MgZXZlcnkgdGltZSB3ZSBwYXJzZSBvbmUgdmFsdWUuCi0KLSAgZGVmIElubmVyRGVjb2RlKGJ1ZmZlciwgcG9zKToKLSAgICBuZXdfcG9zID0gcG9zICsgdmFsdWVfc2l6ZQotICAgIHJlc3VsdCA9IGxvY2FsX3VucGFjayhmb3JtYXQsIGJ1ZmZlcltwb3M6bmV3X3Bvc10pWzBdCi0gICAgcmV0dXJuIChyZXN1bHQsIG5ld19wb3MpCi0gIHJldHVybiBfU2ltcGxlRGVjb2Rlcih3aXJlX3R5cGUsIElubmVyRGVjb2RlKQotCi0KLWRlZiBfRmxvYXREZWNvZGVyKCk6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIGZsb2F0IGZpZWxkLgotCi0gIFRoaXMgY29kZSB3b3JrcyBhcm91bmQgYSBidWcgaW4gc3RydWN0LnVucGFjayBmb3Igbm9uLWZpbml0ZSAzMi1iaXQKLSAgZmxvYXRpbmctcG9pbnQgdmFsdWVzLgotICAiIiIKLQotICBsb2NhbF91bnBhY2sgPSBzdHJ1Y3QudW5wYWNrCi0KLSAgZGVmIElubmVyRGVjb2RlKGJ1ZmZlciwgcG9zKToKLSAgICAjIFdlIGV4cGVjdCBhIDMyLWJpdCB2YWx1ZSBpbiBsaXR0bGUtZW5kaWFuIGJ5dGUgb3JkZXIuICBCaXQgMSBpcyB0aGUgc2lnbgotICAgICMgYml0LCBiaXRzIDItOSByZXByZXNlbnQgdGhlIGV4cG9uZW50LCBhbmQgYml0cyAxMC0zMiBhcmUgdGhlIHNpZ25pZmljYW5kLgotICAgIG5ld19wb3MgPSBwb3MgKyA0Ci0gICAgZmxvYXRfYnl0ZXMgPSBidWZmZXJbcG9zOm5ld19wb3NdCi0KLSAgICAjIElmIHRoaXMgdmFsdWUgaGFzIGFsbCBpdHMgZXhwb25lbnQgYml0cyBzZXQsIHRoZW4gaXQncyBub24tZmluaXRlLgotICAgICMgSW4gUHl0aG9uIDIuNCwgc3RydWN0LnVucGFjayB3aWxsIGNvbnZlcnQgaXQgdG8gYSBmaW5pdGUgNjQtYml0IHZhbHVlLgotICAgICMgVG8gYXZvaWQgdGhhdCwgd2UgcGFyc2UgaXQgc3BlY2lhbGx5LgotICAgIGlmICgoZmxvYXRfYnl0ZXNbM10gaW4gJ1x4N0ZceEZGJykKLSAgICAgICAgYW5kIChmbG9hdF9ieXRlc1syXSA+PSAnXHg4MCcpKToKLSAgICAgICMgSWYgYXQgbGVhc3Qgb25lIHNpZ25pZmljYW5kIGJpdCBpcyBzZXQuLi4KLSAgICAgIGlmIGZsb2F0X2J5dGVzWzA6M10gIT0gJ1x4MDBceDAwXHg4MCc6Ci0gICAgICAgIHJldHVybiAoX05BTiwgbmV3X3BvcykKLSAgICAgICMgSWYgc2lnbiBiaXQgaXMgc2V0Li4uCi0gICAgICBpZiBmbG9hdF9ieXRlc1szXSA9PSAnXHhGRic6Ci0gICAgICAgIHJldHVybiAoX05FR19JTkYsIG5ld19wb3MpCi0gICAgICByZXR1cm4gKF9QT1NfSU5GLCBuZXdfcG9zKQotCi0gICAgIyBOb3RlIHRoYXQgd2UgZXhwZWN0IHNvbWVvbmUgdXAtc3RhY2sgdG8gY2F0Y2ggc3RydWN0LmVycm9yIGFuZCBjb252ZXJ0Ci0gICAgIyBpdCB0byBfRGVjb2RlRXJyb3IgLS0gdGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSB0byBzZXQgdXAgZXhjZXB0aW9uLQotICAgICMgaGFuZGxpbmcgYmxvY2tzIGV2ZXJ5IHRpbWUgd2UgcGFyc2Ugb25lIHZhbHVlLgotICAgIHJlc3VsdCA9IGxvY2FsX3VucGFjaygnPGYnLCBmbG9hdF9ieXRlcylbMF0KLSAgICByZXR1cm4gKHJlc3VsdCwgbmV3X3BvcykKLSAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsIElubmVyRGVjb2RlKQotCi0KLWRlZiBfRG91YmxlRGVjb2RlcigpOgotICAiIiJSZXR1cm5zIGEgZGVjb2RlciBmb3IgYSBkb3VibGUgZmllbGQuCi0KLSAgVGhpcyBjb2RlIHdvcmtzIGFyb3VuZCBhIGJ1ZyBpbiBzdHJ1Y3QudW5wYWNrIGZvciBub3QtYS1udW1iZXIuCi0gICIiIgotCi0gIGxvY2FsX3VucGFjayA9IHN0cnVjdC51bnBhY2sKLQotICBkZWYgSW5uZXJEZWNvZGUoYnVmZmVyLCBwb3MpOgotICAgICMgV2UgZXhwZWN0IGEgNjQtYml0IHZhbHVlIGluIGxpdHRsZS1lbmRpYW4gYnl0ZSBvcmRlci4gIEJpdCAxIGlzIHRoZSBzaWduCi0gICAgIyBiaXQsIGJpdHMgMi0xMiByZXByZXNlbnQgdGhlIGV4cG9uZW50LCBhbmQgYml0cyAxMy02NCBhcmUgdGhlIHNpZ25pZmljYW5kLgotICAgIG5ld19wb3MgPSBwb3MgKyA4Ci0gICAgZG91YmxlX2J5dGVzID0gYnVmZmVyW3BvczpuZXdfcG9zXQotCi0gICAgIyBJZiB0aGlzIHZhbHVlIGhhcyBhbGwgaXRzIGV4cG9uZW50IGJpdHMgc2V0IGFuZCBhdCBsZWFzdCBvbmUgc2lnbmlmaWNhbmQKLSAgICAjIGJpdCBzZXQsIGl0J3Mgbm90IGEgbnVtYmVyLiAgSW4gUHl0aG9uIDIuNCwgc3RydWN0LnVucGFjayB3aWxsIHRyZWF0IGl0Ci0gICAgIyBhcyBpbmYgb3IgLWluZi4gIFRvIGF2b2lkIHRoYXQsIHdlIHRyZWF0IGl0IHNwZWNpYWxseS4KLSAgICBpZiAoKGRvdWJsZV9ieXRlc1s3XSBpbiAnXHg3Rlx4RkYnKQotICAgICAgICBhbmQgKGRvdWJsZV9ieXRlc1s2XSA+PSAnXHhGMCcpCi0gICAgICAgIGFuZCAoZG91YmxlX2J5dGVzWzA6N10gIT0gJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjAnKSk6Ci0gICAgICByZXR1cm4gKF9OQU4sIG5ld19wb3MpCi0KLSAgICAjIE5vdGUgdGhhdCB3ZSBleHBlY3Qgc29tZW9uZSB1cC1zdGFjayB0byBjYXRjaCBzdHJ1Y3QuZXJyb3IgYW5kIGNvbnZlcnQKLSAgICAjIGl0IHRvIF9EZWNvZGVFcnJvciAtLSB0aGlzIHdheSB3ZSBkb24ndCBoYXZlIHRvIHNldCB1cCBleGNlcHRpb24tCi0gICAgIyBoYW5kbGluZyBibG9ja3MgZXZlcnkgdGltZSB3ZSBwYXJzZSBvbmUgdmFsdWUuCi0gICAgcmVzdWx0ID0gbG9jYWxfdW5wYWNrKCc8ZCcsIGRvdWJsZV9ieXRlcylbMF0KLSAgICByZXR1cm4gKHJlc3VsdCwgbmV3X3BvcykKLSAgcmV0dXJuIF9TaW1wbGVEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsIElubmVyRGVjb2RlKQotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotCi1JbnQzMkRlY29kZXIgPSBFbnVtRGVjb2RlciA9IF9TaW1wbGVEZWNvZGVyKAotICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVNpZ25lZFZhcmludDMyKQotCi1JbnQ2NERlY29kZXIgPSBfU2ltcGxlRGVjb2RlcigKLSAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVTaWduZWRWYXJpbnQpCi0KLVVJbnQzMkRlY29kZXIgPSBfU2ltcGxlRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQzMikKLVVJbnQ2NERlY29kZXIgPSBfU2ltcGxlRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQpCi0KLVNJbnQzMkRlY29kZXIgPSBfTW9kaWZpZWREZWNvZGVyKAotICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0RlY29kZVZhcmludDMyLCB3aXJlX2Zvcm1hdC5aaWdaYWdEZWNvZGUpCi1TSW50NjREZWNvZGVyID0gX01vZGlmaWVkRGVjb2RlcigKLSAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9EZWNvZGVWYXJpbnQsIHdpcmVfZm9ybWF0LlppZ1phZ0RlY29kZSkKLQotIyBOb3RlIHRoYXQgUHl0aG9uIGNvbnZlbmllbnRseSBndWFyYW50ZWVzIHRoYXQgd2hlbiB1c2luZyB0aGUgJzwnIHByZWZpeCBvbgotIyBmb3JtYXRzLCB0aGV5IHdpbGwgYWxzbyBoYXZlIHRoZSBzYW1lIHNpemUgYWNyb3NzIGFsbCBwbGF0Zm9ybXMgKGFzIG9wcG9zZWQKLSMgdG8gd2l0aG91dCB0aGUgcHJlZml4LCB3aGVyZSB0aGVpciBzaXplcyBkZXBlbmQgb24gdGhlIEMgY29tcGlsZXIncyBiYXNpYwotIyB0eXBlIHNpemVzKS4KLUZpeGVkMzJEZWNvZGVyICA9IF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPEknKQotRml4ZWQ2NERlY29kZXIgID0gX1N0cnVjdFBhY2tEZWNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8UScpCi1TRml4ZWQzMkRlY29kZXIgPSBfU3RydWN0UGFja0RlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxpJykKLVNGaXhlZDY0RGVjb2RlciA9IF9TdHJ1Y3RQYWNrRGVjb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPHEnKQotRmxvYXREZWNvZGVyID0gX0Zsb2F0RGVjb2RlcigpCi1Eb3VibGVEZWNvZGVyID0gX0RvdWJsZURlY29kZXIoKQotCi1Cb29sRGVjb2RlciA9IF9Nb2RpZmllZERlY29kZXIoCi0gICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULCBfRGVjb2RlVmFyaW50LCBib29sKQotCi0KLWRlZiBTdHJpbmdEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIHN0cmluZyBmaWVsZC4iIiIKLQotICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0gIGxvY2FsX3VuaWNvZGUgPSB1bmljb2RlCi0KLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQotICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgd2hpbGUgMToKLSAgICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCi0gICAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCi0gICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgc3RyaW5nLicpCi0gICAgICAgIHZhbHVlLmFwcGVuZChsb2NhbF91bmljb2RlKGJ1ZmZlcltwb3M6bmV3X3Bvc10sICd1dGYtOCcpKQotICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkIGZpZWxkLgotICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgotICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKLSAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgotICAgICAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgcmV0dXJuIERlY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKLSAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCi0gICAgICBpZiBuZXdfcG9zID4gZW5kOgotICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBzdHJpbmcuJykKLSAgICAgIGZpZWxkX2RpY3Rba2V5XSA9IGxvY2FsX3VuaWNvZGUoYnVmZmVyW3BvczpuZXdfcG9zXSwgJ3V0Zi04JykKLSAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgcmV0dXJuIERlY29kZUZpZWxkCi0KLQotZGVmIEJ5dGVzRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpOgotICAiIiJSZXR1cm5zIGEgZGVjb2RlciBmb3IgYSBieXRlcyBmaWVsZC4iIiIKLQotICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0KLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQotICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgd2hpbGUgMToKLSAgICAgICAgKHNpemUsIHBvcykgPSBsb2NhbF9EZWNvZGVWYXJpbnQoYnVmZmVyLCBwb3MpCi0gICAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCi0gICAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgc3RyaW5nLicpCi0gICAgICAgIHZhbHVlLmFwcGVuZChidWZmZXJbcG9zOm5ld19wb3NdKQotICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkIGZpZWxkLgotICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgotICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKLSAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgotICAgICAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgcmV0dXJuIERlY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICAoc2l6ZSwgcG9zKSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKLSAgICAgIG5ld19wb3MgPSBwb3MgKyBzaXplCi0gICAgICBpZiBuZXdfcG9zID4gZW5kOgotICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBzdHJpbmcuJykKLSAgICAgIGZpZWxkX2RpY3Rba2V5XSA9IGJ1ZmZlcltwb3M6bmV3X3Bvc10KLSAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgcmV0dXJuIERlY29kZUZpZWxkCi0KLQotZGVmIEdyb3VwRGVjb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQsIGtleSwgbmV3X2RlZmF1bHQpOgotICAiIiJSZXR1cm5zIGEgZGVjb2RlciBmb3IgYSBncm91cCBmaWVsZC4iIiIKLQotICBlbmRfdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9udW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkKLSAgZW5kX3RhZ19sZW4gPSBsZW4oZW5kX3RhZ19ieXRlcykKLQotICBhc3NlcnQgbm90IGlzX3BhY2tlZAotICBpZiBpc19yZXBlYXRlZDoKLSAgICB0YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKGZpZWxkX251bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1NUQVJUX0dST1VQKQotICAgIHRhZ19sZW4gPSBsZW4odGFnX2J5dGVzKQotICAgIGRlZiBEZWNvZGVSZXBlYXRlZEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgd2hpbGUgMToKLSAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKLSAgICAgICAgIyBSZWFkIHN1Yi1tZXNzYWdlLgotICAgICAgICBwb3MgPSB2YWx1ZS5hZGQoKS5fSW50ZXJuYWxQYXJzZShidWZmZXIsIHBvcywgZW5kKQotICAgICAgICAjIFJlYWQgZW5kIHRhZy4KLSAgICAgICAgbmV3X3BvcyA9IHBvcytlbmRfdGFnX2xlbgotICAgICAgICBpZiBidWZmZXJbcG9zOm5ld19wb3NdICE9IGVuZF90YWdfYnl0ZXMgb3IgbmV3X3BvcyA+IGVuZDoKLSAgICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ01pc3NpbmcgZ3JvdXAgZW5kIHRhZy4nKQotICAgICAgICAjIFByZWRpY3QgdGhhdCB0aGUgbmV4dCB0YWcgaXMgYW5vdGhlciBjb3B5IG9mIHRoZSBzYW1lIHJlcGVhdGVkIGZpZWxkLgotICAgICAgICBwb3MgPSBuZXdfcG9zICsgdGFnX2xlbgotICAgICAgICBpZiBidWZmZXJbbmV3X3Bvczpwb3NdICE9IHRhZ19ieXRlcyBvciBuZXdfcG9zID09IGVuZDoKLSAgICAgICAgICAjIFByZWRpY3Rpb24gZmFpbGVkLiAgUmV0dXJuLgotICAgICAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgcmV0dXJuIERlY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICBkZWYgRGVjb2RlRmllbGQoYnVmZmVyLCBwb3MsIGVuZCwgbWVzc2FnZSwgZmllbGRfZGljdCk6Ci0gICAgICB2YWx1ZSA9IGZpZWxkX2RpY3QuZ2V0KGtleSkKLSAgICAgIGlmIHZhbHVlIGlzIE5vbmU6Ci0gICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCi0gICAgICAjIFJlYWQgc3ViLW1lc3NhZ2UuCi0gICAgICBwb3MgPSB2YWx1ZS5fSW50ZXJuYWxQYXJzZShidWZmZXIsIHBvcywgZW5kKQotICAgICAgIyBSZWFkIGVuZCB0YWcuCi0gICAgICBuZXdfcG9zID0gcG9zK2VuZF90YWdfbGVuCi0gICAgICBpZiBidWZmZXJbcG9zOm5ld19wb3NdICE9IGVuZF90YWdfYnl0ZXMgb3IgbmV3X3BvcyA+IGVuZDoKLSAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNaXNzaW5nIGdyb3VwIGVuZCB0YWcuJykKLSAgICAgIHJldHVybiBuZXdfcG9zCi0gICAgcmV0dXJuIERlY29kZUZpZWxkCi0KLQotZGVmIE1lc3NhZ2VEZWNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCwga2V5LCBuZXdfZGVmYXVsdCk6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIG1lc3NhZ2UgZmllbGQuIiIiCi0KLSAgbG9jYWxfRGVjb2RlVmFyaW50ID0gX0RlY29kZVZhcmludAotCi0gIGFzc2VydCBub3QgaXNfcGFja2VkCi0gIGlmIGlzX3JlcGVhdGVkOgotICAgIHRhZ19ieXRlcyA9IGVuY29kZXIuVGFnQnl0ZXMoZmllbGRfbnVtYmVyLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKLSAgICB0YWdfbGVuID0gbGVuKHRhZ19ieXRlcykKLSAgICBkZWYgRGVjb2RlUmVwZWF0ZWRGaWVsZChidWZmZXIsIHBvcywgZW5kLCBtZXNzYWdlLCBmaWVsZF9kaWN0KToKLSAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQotICAgICAgaWYgdmFsdWUgaXMgTm9uZToKLSAgICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LnNldGRlZmF1bHQoa2V5LCBuZXdfZGVmYXVsdChtZXNzYWdlKSkKLSAgICAgIHdoaWxlIDE6Ci0gICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5nZXQoa2V5KQotICAgICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICAgIHZhbHVlID0gZmllbGRfZGljdC5zZXRkZWZhdWx0KGtleSwgbmV3X2RlZmF1bHQobWVzc2FnZSkpCi0gICAgICAgICMgUmVhZCBsZW5ndGguCi0gICAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgICBuZXdfcG9zID0gcG9zICsgc2l6ZQotICAgICAgICBpZiBuZXdfcG9zID4gZW5kOgotICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICAgICAgIyBSZWFkIHN1Yi1tZXNzYWdlLgotICAgICAgICBpZiB2YWx1ZS5hZGQoKS5fSW50ZXJuYWxQYXJzZShidWZmZXIsIHBvcywgbmV3X3BvcykgIT0gbmV3X3BvczoKLSAgICAgICAgICAjIFRoZSBvbmx5IHJlYXNvbiBfSW50ZXJuYWxQYXJzZSB3b3VsZCByZXR1cm4gZWFybHkgaXMgaWYgaXQKLSAgICAgICAgICAjIGVuY291bnRlcmVkIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdVbmV4cGVjdGVkIGVuZC1ncm91cCB0YWcuJykKLSAgICAgICAgIyBQcmVkaWN0IHRoYXQgdGhlIG5leHQgdGFnIGlzIGFub3RoZXIgY29weSBvZiB0aGUgc2FtZSByZXBlYXRlZCBmaWVsZC4KLSAgICAgICAgcG9zID0gbmV3X3BvcyArIHRhZ19sZW4KLSAgICAgICAgaWYgYnVmZmVyW25ld19wb3M6cG9zXSAhPSB0YWdfYnl0ZXMgb3IgbmV3X3BvcyA9PSBlbmQ6Ci0gICAgICAgICAgIyBQcmVkaWN0aW9uIGZhaWxlZC4gIFJldHVybi4KLSAgICAgICAgICByZXR1cm4gbmV3X3BvcwotICAgIHJldHVybiBEZWNvZGVSZXBlYXRlZEZpZWxkCi0gIGVsc2U6Ci0gICAgZGVmIERlY29kZUZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChrZXkpCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdChrZXksIG5ld19kZWZhdWx0KG1lc3NhZ2UpKQotICAgICAgIyBSZWFkIGxlbmd0aC4KLSAgICAgIChzaXplLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgbmV3X3BvcyA9IHBvcyArIHNpemUKLSAgICAgIGlmIG5ld19wb3MgPiBlbmQ6Ci0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICAgICMgUmVhZCBzdWItbWVzc2FnZS4KLSAgICAgIGlmIHZhbHVlLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgcG9zLCBuZXdfcG9zKSAhPSBuZXdfcG9zOgotICAgICAgICAjIFRoZSBvbmx5IHJlYXNvbiBfSW50ZXJuYWxQYXJzZSB3b3VsZCByZXR1cm4gZWFybHkgaXMgaWYgaXQgZW5jb3VudGVyZWQKLSAgICAgICAgIyBhbiBlbmQtZ3JvdXAgdGFnLgotICAgICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1VuZXhwZWN0ZWQgZW5kLWdyb3VwIHRhZy4nKQotICAgICAgcmV0dXJuIG5ld19wb3MKLSAgICByZXR1cm4gRGVjb2RlRmllbGQKLQotCi0jIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLU1FU1NBR0VfU0VUX0lURU1fVEFHID0gZW5jb2Rlci5UYWdCeXRlcygxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9TVEFSVF9HUk9VUCkKLQotZGVmIE1lc3NhZ2VTZXRJdGVtRGVjb2RlcihleHRlbnNpb25zX2J5X251bWJlcik6Ci0gICIiIlJldHVybnMgYSBkZWNvZGVyIGZvciBhIE1lc3NhZ2VTZXQgaXRlbS4KLQotICBUaGUgcGFyYW1ldGVyIGlzIHRoZSBfZXh0ZW5zaW9uc19ieV9udW1iZXIgbWFwIGZvciB0aGUgbWVzc2FnZSBjbGFzcy4KLQotICBUaGUgbWVzc2FnZSBzZXQgbWVzc2FnZSBsb29rcyBsaWtlIHRoaXM6Ci0gICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKLSAgICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKLSAgICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7Ci0gICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKLSAgICAgIH0KLSAgICB9Ci0gICIiIgotCi0gIHR5cGVfaWRfdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcygyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpCi0gIG1lc3NhZ2VfdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcygzLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICBpdGVtX2VuZF90YWdfYnl0ZXMgPSBlbmNvZGVyLlRhZ0J5dGVzKDEsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkKLQotICBsb2NhbF9SZWFkVGFnID0gUmVhZFRhZwotICBsb2NhbF9EZWNvZGVWYXJpbnQgPSBfRGVjb2RlVmFyaW50Ci0gIGxvY2FsX1NraXBGaWVsZCA9IFNraXBGaWVsZAotCi0gIGRlZiBEZWNvZGVJdGVtKGJ1ZmZlciwgcG9zLCBlbmQsIG1lc3NhZ2UsIGZpZWxkX2RpY3QpOgotICAgIHR5cGVfaWQgPSAtMQotICAgIG1lc3NhZ2Vfc3RhcnQgPSAtMQotICAgIG1lc3NhZ2VfZW5kID0gLTEKLQotICAgICMgVGVjaG5pY2FsbHksIHR5cGVfaWQgYW5kIG1lc3NhZ2UgY2FuIGFwcGVhciBpbiBhbnkgb3JkZXIsIHNvIHdlIG5lZWQKLSAgICAjIGEgbGl0dGxlIGxvb3AgaGVyZS4KLSAgICB3aGlsZSAxOgotICAgICAgKHRhZ19ieXRlcywgcG9zKSA9IGxvY2FsX1JlYWRUYWcoYnVmZmVyLCBwb3MpCi0gICAgICBpZiB0YWdfYnl0ZXMgPT0gdHlwZV9pZF90YWdfYnl0ZXM6Ci0gICAgICAgICh0eXBlX2lkLCBwb3MpID0gbG9jYWxfRGVjb2RlVmFyaW50KGJ1ZmZlciwgcG9zKQotICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gbWVzc2FnZV90YWdfYnl0ZXM6Ci0gICAgICAgIChzaXplLCBtZXNzYWdlX3N0YXJ0KSA9IGxvY2FsX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKLSAgICAgICAgcG9zID0gbWVzc2FnZV9lbmQgPSBtZXNzYWdlX3N0YXJ0ICsgc2l6ZQotICAgICAgZWxpZiB0YWdfYnl0ZXMgPT0gaXRlbV9lbmRfdGFnX2J5dGVzOgotICAgICAgICBicmVhawotICAgICAgZWxzZToKLSAgICAgICAgcG9zID0gU2tpcEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIHRhZ19ieXRlcykKLSAgICAgICAgaWYgcG9zID09IC0xOgotICAgICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWlzc2luZyBncm91cCBlbmQgdGFnLicpCi0KLSAgICBpZiBwb3MgPiBlbmQ6Ci0gICAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCi0KLSAgICBpZiB0eXBlX2lkID09IC0xOgotICAgICAgcmFpc2UgX0RlY29kZUVycm9yKCdNZXNzYWdlU2V0IGl0ZW0gbWlzc2luZyB0eXBlX2lkLicpCi0gICAgaWYgbWVzc2FnZV9zdGFydCA9PSAtMToKLSAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignTWVzc2FnZVNldCBpdGVtIG1pc3NpbmcgbWVzc2FnZS4nKQotCi0gICAgZXh0ZW5zaW9uID0gZXh0ZW5zaW9uc19ieV9udW1iZXIuZ2V0KHR5cGVfaWQpCi0gICAgaWYgZXh0ZW5zaW9uIGlzIG5vdCBOb25lOgotICAgICAgdmFsdWUgPSBmaWVsZF9kaWN0LmdldChleHRlbnNpb24pCi0gICAgICBpZiB2YWx1ZSBpcyBOb25lOgotICAgICAgICB2YWx1ZSA9IGZpZWxkX2RpY3Quc2V0ZGVmYXVsdCgKLSAgICAgICAgICAgIGV4dGVuc2lvbiwgZXh0ZW5zaW9uLm1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKSkKLSAgICAgIGlmIHZhbHVlLl9JbnRlcm5hbFBhcnNlKGJ1ZmZlciwgbWVzc2FnZV9zdGFydCxtZXNzYWdlX2VuZCkgIT0gbWVzc2FnZV9lbmQ6Ci0gICAgICAgICMgVGhlIG9ubHkgcmVhc29uIF9JbnRlcm5hbFBhcnNlIHdvdWxkIHJldHVybiBlYXJseSBpcyBpZiBpdCBlbmNvdW50ZXJlZAotICAgICAgICAjIGFuIGVuZC1ncm91cCB0YWcuCi0gICAgICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCi0KLSAgICByZXR1cm4gcG9zCi0KLSAgcmV0dXJuIERlY29kZUl0ZW0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBPcHRpbWl6YXRpb24gaXMgbm90IGFzIGhlYXZ5IGhlcmUgYmVjYXVzZSBjYWxscyB0byBTa2lwRmllbGQoKSBhcmUgcmFyZSwKLSMgZXhjZXB0IGZvciBoYW5kbGluZyBlbmQtZ3JvdXAgdGFncy4KLQotZGVmIF9Ta2lwVmFyaW50KGJ1ZmZlciwgcG9zLCBlbmQpOgotICAiIiJTa2lwIGEgdmFyaW50IHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgotCi0gIHdoaWxlIG9yZChidWZmZXJbcG9zXSkgJiAweDgwOgotICAgIHBvcyArPSAxCi0gIHBvcyArPSAxCi0gIGlmIHBvcyA+IGVuZDoKLSAgICByYWlzZSBfRGVjb2RlRXJyb3IoJ1RydW5jYXRlZCBtZXNzYWdlLicpCi0gIHJldHVybiBwb3MKLQotZGVmIF9Ta2lwRml4ZWQ2NChidWZmZXIsIHBvcywgZW5kKToKLSAgIiIiU2tpcCBhIGZpeGVkNjQgdmFsdWUuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCi0KLSAgcG9zICs9IDgKLSAgaWYgcG9zID4gZW5kOgotICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgcmV0dXJuIHBvcwotCi1kZWYgX1NraXBMZW5ndGhEZWxpbWl0ZWQoYnVmZmVyLCBwb3MsIGVuZCk6Ci0gICIiIlNraXAgYSBsZW5ndGgtZGVsaW1pdGVkIHZhbHVlLiAgUmV0dXJucyB0aGUgbmV3IHBvc2l0aW9uLiIiIgotCi0gIChzaXplLCBwb3MpID0gX0RlY29kZVZhcmludChidWZmZXIsIHBvcykKLSAgcG9zICs9IHNpemUKLSAgaWYgcG9zID4gZW5kOgotICAgIHJhaXNlIF9EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgcmV0dXJuIHBvcwotCi1kZWYgX1NraXBHcm91cChidWZmZXIsIHBvcywgZW5kKToKLSAgIiIiU2tpcCBzdWItZ3JvdXAuICBSZXR1cm5zIHRoZSBuZXcgcG9zaXRpb24uIiIiCi0KLSAgd2hpbGUgMToKLSAgICAodGFnX2J5dGVzLCBwb3MpID0gUmVhZFRhZyhidWZmZXIsIHBvcykKLSAgICBuZXdfcG9zID0gU2tpcEZpZWxkKGJ1ZmZlciwgcG9zLCBlbmQsIHRhZ19ieXRlcykKLSAgICBpZiBuZXdfcG9zID09IC0xOgotICAgICAgcmV0dXJuIHBvcwotICAgIHBvcyA9IG5ld19wb3MKLQotZGVmIF9FbmRHcm91cChidWZmZXIsIHBvcywgZW5kKToKLSAgIiIiU2tpcHBpbmcgYW4gRU5EX0dST1VQIHRhZyByZXR1cm5zIC0xIHRvIHRlbGwgdGhlIHBhcmVudCBsb29wIHRvIGJyZWFrLiIiIgotCi0gIHJldHVybiAtMQotCi1kZWYgX1NraXBGaXhlZDMyKGJ1ZmZlciwgcG9zLCBlbmQpOgotICAiIiJTa2lwIGEgZml4ZWQzMiB2YWx1ZS4gIFJldHVybnMgdGhlIG5ldyBwb3NpdGlvbi4iIiIKLQotICBwb3MgKz0gNAotICBpZiBwb3MgPiBlbmQ6Ci0gICAgcmFpc2UgX0RlY29kZUVycm9yKCdUcnVuY2F0ZWQgbWVzc2FnZS4nKQotICByZXR1cm4gcG9zCi0KLWRlZiBfUmFpc2VJbnZhbGlkV2lyZVR5cGUoYnVmZmVyLCBwb3MsIGVuZCk6Ci0gICIiIlNraXAgZnVuY3Rpb24gZm9yIHVua25vd24gd2lyZSB0eXBlcy4gIFJhaXNlcyBhbiBleGNlcHRpb24uIiIiCi0KLSAgcmFpc2UgX0RlY29kZUVycm9yKCdUYWcgaGFkIGludmFsaWQgd2lyZSB0eXBlLicpCi0KLWRlZiBfRmllbGRTa2lwcGVyKCk6Ci0gICIiIkNvbnN0cnVjdHMgdGhlIFNraXBGaWVsZCBmdW5jdGlvbi4iIiIKLQotICBXSVJFVFlQRV9UT19TS0lQUEVSID0gWwotICAgICAgX1NraXBWYXJpbnQsCi0gICAgICBfU2tpcEZpeGVkNjQsCi0gICAgICBfU2tpcExlbmd0aERlbGltaXRlZCwKLSAgICAgIF9Ta2lwR3JvdXAsCi0gICAgICBfRW5kR3JvdXAsCi0gICAgICBfU2tpcEZpeGVkMzIsCi0gICAgICBfUmFpc2VJbnZhbGlkV2lyZVR5cGUsCi0gICAgICBfUmFpc2VJbnZhbGlkV2lyZVR5cGUsCi0gICAgICBdCi0KLSAgd2lyZXR5cGVfbWFzayA9IHdpcmVfZm9ybWF0LlRBR19UWVBFX01BU0sKLSAgbG9jYWxfb3JkID0gb3JkCi0KLSAgZGVmIFNraXBGaWVsZChidWZmZXIsIHBvcywgZW5kLCB0YWdfYnl0ZXMpOgotICAgICIiIlNraXBzIGEgZmllbGQgd2l0aCB0aGUgc3BlY2lmaWVkIHRhZy4KLQotICAgIHxwb3N8IHNob3VsZCBwb2ludCB0byB0aGUgYnl0ZSBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLgotCi0gICAgUmV0dXJuczoKLSAgICAgICAgVGhlIG5ldyBwb3NpdGlvbiAoYWZ0ZXIgdGhlIHRhZyB2YWx1ZSksIG9yIC0xIGlmIHRoZSB0YWcgaXMgYW4gZW5kLWdyb3VwCi0gICAgICAgIHRhZyAoaW4gd2hpY2ggY2FzZSB0aGUgY2FsbGluZyBsb29wIHNob3VsZCBicmVhaykuCi0gICAgIiIiCi0KLSAgICAjIFRoZSB3aXJlIHR5cGUgaXMgYWx3YXlzIGluIHRoZSBmaXJzdCBieXRlIHNpbmNlIHZhcmludHMgYXJlIGxpdHRsZS1lbmRpYW4uCi0gICAgd2lyZV90eXBlID0gbG9jYWxfb3JkKHRhZ19ieXRlc1swXSkgJiB3aXJldHlwZV9tYXNrCi0gICAgcmV0dXJuIFdJUkVUWVBFX1RPX1NLSVBQRVJbd2lyZV90eXBlXShidWZmZXIsIHBvcywgZW5kKQotCi0gIHJldHVybiBTa2lwRmllbGQKLQotU2tpcEZpZWxkID0gX0ZpZWxkU2tpcHBlcigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9kZXNjcmlwdG9yX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDA1YzI3NDUuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZGVzY3JpcHRvcl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMzM0ICswLDAgQEAKLSMhIC91c3IvYmluL3B5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlVuaXR0ZXN0IGZvciBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZGVzY3JpcHRvci4iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfaW1wb3J0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Ci0KLQotVEVTVF9FTVBUWV9NRVNTQUdFX0RFU0NSSVBUT1JfQVNDSUkgPSAiIiIKLW5hbWU6ICdUZXN0RW1wdHlNZXNzYWdlJwotIiIiCi0KLQotY2xhc3MgRGVzY3JpcHRvclRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLm15X2ZpbGUgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKAotICAgICAgICBuYW1lPSdzb21lL2ZpbGVuYW1lL3NvbWUucHJvdG8nLAotICAgICAgICBwYWNrYWdlPSdwcm90b2J1Zl91bml0dGVzdCcKLSAgICAgICAgKQotICAgIHNlbGYubXlfZW51bSA9IGRlc2NyaXB0b3IuRW51bURlc2NyaXB0b3IoCi0gICAgICAgIG5hbWU9J0ZvcmVpZ25FbnVtJywKLSAgICAgICAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5Gb3JlaWduRW51bScsCi0gICAgICAgIGZpbGVuYW1lPU5vbmUsCi0gICAgICAgIGZpbGU9c2VsZi5teV9maWxlLAotICAgICAgICB2YWx1ZXM9WwotICAgICAgICAgIGRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcihuYW1lPSdGT1JFSUdOX0ZPTycsIGluZGV4PTAsIG51bWJlcj00KSwKLSAgICAgICAgICBkZXNjcmlwdG9yLkVudW1WYWx1ZURlc2NyaXB0b3IobmFtZT0nRk9SRUlHTl9CQVInLCBpbmRleD0xLCBudW1iZXI9NSksCi0gICAgICAgICAgZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKG5hbWU9J0ZPUkVJR05fQkFaJywgaW5kZXg9MiwgbnVtYmVyPTYpLAotICAgICAgICBdKQotICAgIHNlbGYubXlfbWVzc2FnZSA9IGRlc2NyaXB0b3IuRGVzY3JpcHRvcigKLSAgICAgICAgbmFtZT0nTmVzdGVkTWVzc2FnZScsCi0gICAgICAgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UnLAotICAgICAgICBmaWxlbmFtZT1Ob25lLAotICAgICAgICBmaWxlPXNlbGYubXlfZmlsZSwKLSAgICAgICAgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICAgIGZpZWxkcz1bCi0gICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IoCi0gICAgICAgICAgICBuYW1lPSdiYicsCi0gICAgICAgICAgICBmdWxsX25hbWU9J3Byb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLmJiJywKLSAgICAgICAgICAgIGluZGV4PTAsIG51bWJlcj0xLAotICAgICAgICAgICAgdHlwZT01LCBjcHBfdHlwZT0xLCBsYWJlbD0xLAotICAgICAgICAgICAgaGFzX2RlZmF1bHRfdmFsdWU9RmFsc2UsIGRlZmF1bHRfdmFsdWU9MCwKLSAgICAgICAgICAgIG1lc3NhZ2VfdHlwZT1Ob25lLCBlbnVtX3R5cGU9Tm9uZSwgY29udGFpbmluZ190eXBlPU5vbmUsCi0gICAgICAgICAgICBpc19leHRlbnNpb249RmFsc2UsIGV4dGVuc2lvbl9zY29wZT1Ob25lKSwKLSAgICAgICAgXSwKLSAgICAgICAgbmVzdGVkX3R5cGVzPVtdLAotICAgICAgICBlbnVtX3R5cGVzPVsKLSAgICAgICAgICBzZWxmLm15X2VudW0sCi0gICAgICAgIF0sCi0gICAgICAgIGV4dGVuc2lvbnM9W10pCi0gICAgc2VsZi5teV9tZXRob2QgPSBkZXNjcmlwdG9yLk1ldGhvZERlc2NyaXB0b3IoCi0gICAgICAgIG5hbWU9J0JhcicsCi0gICAgICAgIGZ1bGxfbmFtZT0ncHJvdG9idWZfdW5pdHRlc3QuVGVzdFNlcnZpY2UuQmFyJywKLSAgICAgICAgaW5kZXg9MCwKLSAgICAgICAgY29udGFpbmluZ19zZXJ2aWNlPU5vbmUsCi0gICAgICAgIGlucHV0X3R5cGU9Tm9uZSwKLSAgICAgICAgb3V0cHV0X3R5cGU9Tm9uZSkKLSAgICBzZWxmLm15X3NlcnZpY2UgPSBkZXNjcmlwdG9yLlNlcnZpY2VEZXNjcmlwdG9yKAotICAgICAgICBuYW1lPSdUZXN0U2VydmljZVdpdGhPcHRpb25zJywKLSAgICAgICAgZnVsbF9uYW1lPSdwcm90b2J1Zl91bml0dGVzdC5UZXN0U2VydmljZVdpdGhPcHRpb25zJywKLSAgICAgICAgZmlsZT1zZWxmLm15X2ZpbGUsCi0gICAgICAgIGluZGV4PTAsCi0gICAgICAgIG1ldGhvZHM9WwotICAgICAgICAgICAgc2VsZi5teV9tZXRob2QKLSAgICAgICAgXSkKLQotICBkZWYgdGVzdEVudW1GaXh1cHMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2VudW0sIHNlbGYubXlfZW51bS52YWx1ZXNbMF0udHlwZSkKLQotICBkZWYgdGVzdENvbnRhaW5pbmdUeXBlRml4dXBzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLCBzZWxmLm15X21lc3NhZ2UuZmllbGRzWzBdLmNvbnRhaW5pbmdfdHlwZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZSwgc2VsZi5teV9lbnVtLmNvbnRhaW5pbmdfdHlwZSkKLQotICBkZWYgdGVzdENvbnRhaW5pbmdTZXJ2aWNlRml4dXBzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9zZXJ2aWNlLCBzZWxmLm15X21ldGhvZC5jb250YWluaW5nX3NlcnZpY2UpCi0KLSAgZGVmIHRlc3RHZXRPcHRpb25zKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9lbnVtLkdldE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLkVudW1PcHRpb25zKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLm15X2VudW0udmFsdWVzWzBdLkdldE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLkVudW1WYWx1ZU9wdGlvbnMoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZS5HZXRPcHRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5NZXNzYWdlT3B0aW9ucygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9tZXNzYWdlLmZpZWxkc1swXS5HZXRPcHRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5GaWVsZE9wdGlvbnMoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWV0aG9kLkdldE9wdGlvbnMoKSwKLSAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3JfcGIyLk1ldGhvZE9wdGlvbnMoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfc2VydmljZS5HZXRPcHRpb25zKCksCi0gICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlT3B0aW9ucygpKQotCi0gIGRlZiB0ZXN0RmlsZURlc2NyaXB0b3JSZWZlcmVuY2VzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5teV9lbnVtLmZpbGUsIHNlbGYubXlfZmlsZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfbWVzc2FnZS5maWxlLCBzZWxmLm15X2ZpbGUpCi0KLSAgZGVmIHRlc3RGaWxlRGVzY3JpcHRvcihzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZmlsZS5uYW1lLCAnc29tZS9maWxlbmFtZS9zb21lLnByb3RvJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYubXlfZmlsZS5wYWNrYWdlLCAncHJvdG9idWZfdW5pdHRlc3QnKQotCi0KLWNsYXNzIERlc2NyaXB0b3JDb3B5VG9Qcm90b1Rlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICAiIiJUZXN0cyBmb3IgQ29weVRvIGZ1bmN0aW9ucyBvZiBEZXNjcmlwdG9yLiIiIgotCi0gIGRlZiBfQXNzZXJ0UHJvdG9FcXVhbChzZWxmLCBhY3R1YWxfcHJvdG8sIGV4cGVjdGVkX2NsYXNzLCBleHBlY3RlZF9hc2NpaSk6Ci0gICAgZXhwZWN0ZWRfcHJvdG8gPSBleHBlY3RlZF9jbGFzcygpCi0gICAgdGV4dF9mb3JtYXQuTWVyZ2UoZXhwZWN0ZWRfYXNjaWksIGV4cGVjdGVkX3Byb3RvKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgYWN0dWFsX3Byb3RvLCBleHBlY3RlZF9wcm90bywKLSAgICAgICAgJ05vdCBlcXVhbCxcbkFjdHVhbDpcbiVzXG5FeHBlY3RlZDpcbiVzXG4nCi0gICAgICAgICUgKHN0cihhY3R1YWxfcHJvdG8pLCBzdHIoZXhwZWN0ZWRfcHJvdG8pKSkKLQotICBkZWYgX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKHNlbGYsIGRlc2MsIGV4cGVjdGVkX3Byb3RvX2NsYXNzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkX3Byb3RvX2FzY2lpKToKLSAgICBhY3R1YWwgPSBleHBlY3RlZF9wcm90b19jbGFzcygpCi0gICAgZGVzYy5Db3B5VG9Qcm90byhhY3R1YWwpCi0gICAgc2VsZi5fQXNzZXJ0UHJvdG9FcXVhbCgKLSAgICAgICAgYWN0dWFsLCBleHBlY3RlZF9wcm90b19jbGFzcywgZXhwZWN0ZWRfcHJvdG9fYXNjaWkpCi0KLSAgZGVmIHRlc3RDb3B5VG9Qcm90b19FbXB0eU1lc3NhZ2Uoc2VsZik6Ci0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlLkRFU0NSSVBUT1IsCi0gICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKLSAgICAgICAgVEVTVF9FTVBUWV9NRVNTQUdFX0RFU0NSSVBUT1JfQVNDSUkpCi0KLSAgZGVmIHRlc3RDb3B5VG9Qcm90b19OZXN0ZWRNZXNzYWdlKHNlbGYpOgotICAgIFRFU1RfTkVTVEVEX01FU1NBR0VfQVNDSUkgPSAiIiIKLSAgICAgIG5hbWU6ICdOZXN0ZWRNZXNzYWdlJwotICAgICAgZmllbGQ6IDwKLSAgICAgICAgbmFtZTogJ2JiJwotICAgICAgICBudW1iZXI6IDEKLSAgICAgICAgbGFiZWw6IDEgICMgT3B0aW9uYWwKLSAgICAgICAgdHlwZTogNSAgIyBUWVBFX0lOVDMyCi0gICAgICA+Ci0gICAgICAiIiIKLQotICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUiwKLSAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAotICAgICAgICBURVNUX05FU1RFRF9NRVNTQUdFX0FTQ0lJKQotCi0gIGRlZiB0ZXN0Q29weVRvUHJvdG9fRm9yZWlnbk5lc3RlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgVEVTVF9GT1JFSUdOX05FU1RFRF9BU0NJSSA9ICIiIgotICAgICAgbmFtZTogJ1Rlc3RGb3JlaWduTmVzdGVkJwotICAgICAgZmllbGQ6IDwKLSAgICAgICAgbmFtZTogJ2ZvcmVpZ25fbmVzdGVkJwotICAgICAgICBudW1iZXI6IDEKLSAgICAgICAgbGFiZWw6IDEgICMgT3B0aW9uYWwKLSAgICAgICAgdHlwZTogMTEgICMgVFlQRV9NRVNTQUdFCi0gICAgICAgIHR5cGVfbmFtZTogJy5wcm90b2J1Zl91bml0dGVzdC5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZScKLSAgICAgID4KLSAgICAgICIiIgotCi0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0Rm9yZWlnbk5lc3RlZC5ERVNDUklQVE9SLAotICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCi0gICAgICAgIFRFU1RfRk9SRUlHTl9ORVNURURfQVNDSUkpCi0KLSAgZGVmIHRlc3RDb3B5VG9Qcm90b19Gb3JlaWduRW51bShzZWxmKToKLSAgICBURVNUX0ZPUkVJR05fRU5VTV9BU0NJSSA9ICIiIgotICAgICAgbmFtZTogJ0ZvcmVpZ25FbnVtJwotICAgICAgdmFsdWU6IDwKLSAgICAgICAgbmFtZTogJ0ZPUkVJR05fRk9PJwotICAgICAgICBudW1iZXI6IDQKLSAgICAgID4KLSAgICAgIHZhbHVlOiA8Ci0gICAgICAgIG5hbWU6ICdGT1JFSUdOX0JBUicKLSAgICAgICAgbnVtYmVyOiA1Ci0gICAgICA+Ci0gICAgICB2YWx1ZTogPAotICAgICAgICBuYW1lOiAnRk9SRUlHTl9CQVonCi0gICAgICAgIG51bWJlcjogNgotICAgICAgPgotICAgICAgIiIiCi0KLSAgICBzZWxmLl9JbnRlcm5hbFRlc3RDb3B5VG9Qcm90bygKLSAgICAgICAgdW5pdHRlc3RfcGIyLl9GT1JFSUdORU5VTSwKLSAgICAgICAgZGVzY3JpcHRvcl9wYjIuRW51bURlc2NyaXB0b3JQcm90bywKLSAgICAgICAgVEVTVF9GT1JFSUdOX0VOVU1fQVNDSUkpCi0KLSAgZGVmIHRlc3RDb3B5VG9Qcm90b19PcHRpb25zKHNlbGYpOgotICAgIFRFU1RfREVQUkVDQVRFRF9GSUVMRFNfQVNDSUkgPSAiIiIKLSAgICAgIG5hbWU6ICdUZXN0RGVwcmVjYXRlZEZpZWxkcycKLSAgICAgIGZpZWxkOiA8Ci0gICAgICAgIG5hbWU6ICdkZXByZWNhdGVkX2ludDMyJwotICAgICAgICBudW1iZXI6IDEKLSAgICAgICAgbGFiZWw6IDEgICMgT3B0aW9uYWwKLSAgICAgICAgdHlwZTogNSAgIyBUWVBFX0lOVDMyCi0gICAgICAgIG9wdGlvbnM6IDwKLSAgICAgICAgICBkZXByZWNhdGVkOiB0cnVlCi0gICAgICAgID4KLSAgICAgID4KLSAgICAgICIiIgotCi0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0RGVwcmVjYXRlZEZpZWxkcy5ERVNDUklQVE9SLAotICAgICAgICBkZXNjcmlwdG9yX3BiMi5EZXNjcmlwdG9yUHJvdG8sCi0gICAgICAgIFRFU1RfREVQUkVDQVRFRF9GSUVMRFNfQVNDSUkpCi0KLSAgZGVmIHRlc3RDb3B5VG9Qcm90b19BbGxFeHRlbnNpb25zKHNlbGYpOgotICAgIFRFU1RfRU1QVFlfTUVTU0FHRV9XSVRIX0VYVEVOU0lPTlNfQVNDSUkgPSAiIiIKLSAgICAgIG5hbWU6ICdUZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMnCi0gICAgICBleHRlbnNpb25fcmFuZ2U6IDwKLSAgICAgICAgc3RhcnQ6IDEKLSAgICAgICAgZW5kOiA1MzY4NzA5MTIKLSAgICAgID4KLSAgICAgICIiIgotCi0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlV2l0aEV4dGVuc2lvbnMuREVTQ1JJUFRPUiwKLSAgICAgICAgZGVzY3JpcHRvcl9wYjIuRGVzY3JpcHRvclByb3RvLAotICAgICAgICBURVNUX0VNUFRZX01FU1NBR0VfV0lUSF9FWFRFTlNJT05TX0FTQ0lJKQotCi0gIGRlZiB0ZXN0Q29weVRvUHJvdG9fU2V2ZXJhbEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgVEVTVF9NRVNTQUdFX1dJVEhfU0VWRVJBTF9FWFRFTlNJT05TX0FTQ0lJID0gIiIiCi0gICAgICBuYW1lOiAnVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzJwotICAgICAgZXh0ZW5zaW9uX3JhbmdlOiA8Ci0gICAgICAgIHN0YXJ0OiA0MgotICAgICAgICBlbmQ6IDQzCi0gICAgICA+Ci0gICAgICBleHRlbnNpb25fcmFuZ2U6IDwKLSAgICAgICAgc3RhcnQ6IDQxNDMKLSAgICAgICAgZW5kOiA0MjQ0Ci0gICAgICA+Ci0gICAgICBleHRlbnNpb25fcmFuZ2U6IDwKLSAgICAgICAgc3RhcnQ6IDY1NTM2Ci0gICAgICAgIGVuZDogNTM2ODcwOTEyCi0gICAgICA+Ci0gICAgICAiIiIKLQotICAgIHNlbGYuX0ludGVybmFsVGVzdENvcHlUb1Byb3RvKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdE11bHRpcGxlRXh0ZW5zaW9uUmFuZ2VzLkRFU0NSSVBUT1IsCi0gICAgICAgIGRlc2NyaXB0b3JfcGIyLkRlc2NyaXB0b3JQcm90bywKLSAgICAgICAgVEVTVF9NRVNTQUdFX1dJVEhfU0VWRVJBTF9FWFRFTlNJT05TX0FTQ0lJKQotCi0gIGRlZiB0ZXN0Q29weVRvUHJvdG9fRmlsZURlc2NyaXB0b3Ioc2VsZik6Ci0gICAgVU5JVFRFU1RfSU1QT1JUX0ZJTEVfREVTQ1JJUFRPUl9BU0NJSSA9ICgiIiIKLSAgICAgIG5hbWU6ICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvJwotICAgICAgcGFja2FnZTogJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcKLSAgICAgIG1lc3NhZ2VfdHlwZTogPAotICAgICAgICBuYW1lOiAnSW1wb3J0TWVzc2FnZScKLSAgICAgICAgZmllbGQ6IDwKLSAgICAgICAgICBuYW1lOiAnZCcKLSAgICAgICAgICBudW1iZXI6IDEKLSAgICAgICAgICBsYWJlbDogMSAgIyBPcHRpb25hbAotICAgICAgICAgIHR5cGU6IDUgICMgVFlQRV9JTlQzMgotICAgICAgICA+Ci0gICAgICA+Ci0gICAgICAiIiIgKwotICAgICAgIiIiZW51bV90eXBlOiA8Ci0gICAgICAgIG5hbWU6ICdJbXBvcnRFbnVtJwotICAgICAgICB2YWx1ZTogPAotICAgICAgICAgIG5hbWU6ICdJTVBPUlRfRk9PJwotICAgICAgICAgIG51bWJlcjogNwotICAgICAgICA+Ci0gICAgICAgIHZhbHVlOiA8Ci0gICAgICAgICAgbmFtZTogJ0lNUE9SVF9CQVInCi0gICAgICAgICAgbnVtYmVyOiA4Ci0gICAgICAgID4KLSAgICAgICAgdmFsdWU6IDwKLSAgICAgICAgICBuYW1lOiAnSU1QT1JUX0JBWicKLSAgICAgICAgICBudW1iZXI6IDkKLSAgICAgICAgPgotICAgICAgPgotICAgICAgb3B0aW9uczogPAotICAgICAgICBqYXZhX3BhY2thZ2U6ICdjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QnCi0gICAgICAgIG9wdGltaXplX2ZvcjogMSAgIyBTUEVFRAotICAgICAgPgotICAgICAgIiIiKQotCi0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuREVTQ1JJUFRPUiwKLSAgICAgICAgZGVzY3JpcHRvcl9wYjIuRmlsZURlc2NyaXB0b3JQcm90bywKLSAgICAgICAgVU5JVFRFU1RfSU1QT1JUX0ZJTEVfREVTQ1JJUFRPUl9BU0NJSSkKLQotICBkZWYgdGVzdENvcHlUb1Byb3RvX1NlcnZpY2VEZXNjcmlwdG9yKHNlbGYpOgotICAgIFRFU1RfU0VSVklDRV9BU0NJSSA9ICIiIgotICAgICAgbmFtZTogJ1Rlc3RTZXJ2aWNlJwotICAgICAgbWV0aG9kOiA8Ci0gICAgICAgIG5hbWU6ICdGb28nCi0gICAgICAgIGlucHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuRm9vUmVxdWVzdCcKLSAgICAgICAgb3V0cHV0X3R5cGU6ICcucHJvdG9idWZfdW5pdHRlc3QuRm9vUmVzcG9uc2UnCi0gICAgICA+Ci0gICAgICBtZXRob2Q6IDwKLSAgICAgICAgbmFtZTogJ0JhcicKLSAgICAgICAgaW5wdXRfdHlwZTogJy5wcm90b2J1Zl91bml0dGVzdC5CYXJSZXF1ZXN0JwotICAgICAgICBvdXRwdXRfdHlwZTogJy5wcm90b2J1Zl91bml0dGVzdC5CYXJSZXNwb25zZScKLSAgICAgID4KLSAgICAgICIiIgotCi0gICAgc2VsZi5fSW50ZXJuYWxUZXN0Q29weVRvUHJvdG8oCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZS5ERVNDUklQVE9SLAotICAgICAgICBkZXNjcmlwdG9yX3BiMi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLAotICAgICAgICBURVNUX1NFUlZJQ0VfQVNDSUkpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGVyLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvZW5jb2Rlci5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzc3OTc1ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9lbmNvZGVyLnB5CisrKyAvZGV2L251bGwKQEAgLTEsNzY5ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJDb2RlIGZvciBlbmNvZGluZyBwcm90b2NvbCBtZXNzYWdlIHByaW1pdGl2ZXMuCi0KLUNvbnRhaW5zIHRoZSBsb2dpYyBmb3IgZW5jb2RpbmcgZXZlcnkgbG9naWNhbCBwcm90b2NvbCBmaWVsZCB0eXBlCi1pbnRvIG9uZSBvZiB0aGUgNSBwaHlzaWNhbCB3aXJlIHR5cGVzLgotCi1UaGlzIGNvZGUgaXMgZGVzaWduZWQgdG8gcHVzaCB0aGUgUHl0aG9uIGludGVycHJldGVyJ3MgcGVyZm9ybWFuY2UgdG8gdGhlCi1saW1pdHMuCi0KLVRoZSBiYXNpYyBpZGVhIGlzIHRoYXQgYXQgc3RhcnR1cCB0aW1lLCBmb3IgZXZlcnkgZmllbGQgKGkuZS4gZXZlcnkKLUZpZWxkRGVzY3JpcHRvcikgd2UgY29uc3RydWN0IHR3byBmdW5jdGlvbnM6ICBhICJzaXplciIgYW5kIGFuICJlbmNvZGVyIi4gIFRoZQotc2l6ZXIgdGFrZXMgYSB2YWx1ZSBvZiB0aGlzIGZpZWxkJ3MgdHlwZSBhbmQgY29tcHV0ZXMgaXRzIGJ5dGUgc2l6ZS4gIFRoZQotZW5jb2RlciB0YWtlcyBhIHdyaXRlciBmdW5jdGlvbiBhbmQgYSB2YWx1ZS4gIEl0IGVuY29kZXMgdGhlIHZhbHVlIGludG8gYnl0ZQotc3RyaW5ncyBhbmQgaW52b2tlcyB0aGUgd3JpdGVyIGZ1bmN0aW9uIHRvIHdyaXRlIHRob3NlIHN0cmluZ3MuICBUeXBpY2FsbHkgdGhlCi13cml0ZXIgZnVuY3Rpb24gaXMgdGhlIHdyaXRlKCkgbWV0aG9kIG9mIGEgY1N0cmluZ0lPLgotCi1XZSB0cnkgdG8gZG8gYXMgbXVjaCB3b3JrIGFzIHBvc3NpYmxlIHdoZW4gY29uc3RydWN0aW5nIHRoZSB3cml0ZXIgYW5kIHRoZQotc2l6ZXIgcmF0aGVyIHRoYW4gd2hlbiBjYWxsaW5nIHRoZW0uICBJbiBwYXJ0aWN1bGFyOgotKiBXZSBjb3B5IGFueSBuZWVkZWQgZ2xvYmFsIGZ1bmN0aW9ucyB0byBsb2NhbCB2YXJpYWJsZXMsIHNvIHRoYXQgd2UgZG8gbm90IG5lZWQKLSAgdG8gZG8gY29zdGx5IGdsb2JhbCB0YWJsZSBsb29rdXBzIGF0IHJ1bnRpbWUuCi0qIFNpbWlsYXJseSwgd2UgdHJ5IHRvIGRvIGFueSBhdHRyaWJ1dGUgbG9va3VwcyBhdCBzdGFydHVwIHRpbWUgaWYgcG9zc2libGUuCi0qIEV2ZXJ5IGZpZWxkJ3MgdGFnIGlzIGVuY29kZWQgdG8gYnl0ZXMgYXQgc3RhcnR1cCwgc2luY2UgaXQgY2FuJ3QgY2hhbmdlIGF0Ci0gIHJ1bnRpbWUuCi0qIFdoYXRldmVyIGNvbXBvbmVudCBvZiB0aGUgZmllbGQgc2l6ZSB3ZSBjYW4gY29tcHV0ZSBhdCBzdGFydHVwLCB3ZSBkby4KLSogV2UgKmF2b2lkKiBzaGFyaW5nIGNvZGUgaWYgZG9pbmcgc28gd291bGQgbWFrZSB0aGUgY29kZSBzbG93ZXIgYW5kIG5vdCBzaGFyaW5nCi0gIGRvZXMgbm90IGJ1cmRlbiB1cyB0b28gbXVjaC4gIEZvciBleGFtcGxlLCBlbmNvZGVycyBmb3IgcmVwZWF0ZWQgZmllbGRzIGRvCi0gIG5vdCBqdXN0IGNhbGwgdGhlIGVuY29kZXJzIGZvciBzaW5ndWxhciBmaWVsZHMgaW4gYSBsb29wIGJlY2F1c2UgdGhpcyB3b3VsZAotICBhZGQgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbCBvdmVyaGVhZCBmb3IgZXZlcnkgbG9vcCBpdGVyYXRpb247IGluc3RlYWQsIHdlCi0gIG1hbnVhbGx5IGlubGluZSB0aGUgc2luZ2xlLXZhbHVlIGVuY29kZXIgaW50byB0aGUgbG9vcC4KLSogSWYgYSBQeXRob24gZnVuY3Rpb24gbGFja3MgYSByZXR1cm4gc3RhdGVtZW50LCBQeXRob24gYWN0dWFsbHkgZ2VuZXJhdGVzCi0gIGluc3RydWN0aW9ucyB0byBwb3AgdGhlIHJlc3VsdCBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQgb2ZmIHRoZSBzdGFjaywgcHVzaAotICBOb25lIG9udG8gdGhlIHN0YWNrLCBhbmQgdGhlbiByZXR1cm4gdGhhdC4gIElmIHdlIHJlYWxseSBkb24ndCBjYXJlIHdoYXQKLSAgdmFsdWUgaXMgcmV0dXJuZWQsIHRoZW4gd2UgY2FuIHNhdmUgdHdvIGluc3RydWN0aW9ucyBieSByZXR1cm5pbmcgdGhlCi0gIHJlc3VsdCBvZiB0aGUgbGFzdCBzdGF0ZW1lbnQuICBJdCBsb29rcyBmdW5ueSBidXQgaXQgaGVscHMuCi0qIFdlIGFzc3VtZSB0aGF0IHR5cGUgYW5kIGJvdW5kcyBjaGVja2luZyBoYXMgaGFwcGVuZWQgYXQgYSBoaWdoZXIgbGV2ZWwuCi0iIiIKLQotX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKLQotaW1wb3J0IHN0cnVjdAotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0Ci0KLQotIyBUaGlzIHdpbGwgb3ZlcmZsb3cgYW5kIHRodXMgYmVjb21lIElFRUUtNzU0ICJpbmZpbml0eSIuICBXZSB3b3VsZCB1c2UKLSMgImZsb2F0KCdpbmYnKSIgYnV0IGl0IGRvZXNuJ3Qgd29yayBvbiBXaW5kb3dzIHByZS1QeXRob24tMi42LgotX1BPU19JTkYgPSAxZTEwMDAwCi1fTkVHX0lORiA9IC1fUE9TX0lORgotCi0KLWRlZiBfVmFyaW50U2l6ZSh2YWx1ZSk6Ci0gICIiIkNvbXB1dGUgdGhlIHNpemUgb2YgYSB2YXJpbnQgdmFsdWUuIiIiCi0gIGlmIHZhbHVlIDw9IDB4N2Y6IHJldHVybiAxCi0gIGlmIHZhbHVlIDw9IDB4M2ZmZjogcmV0dXJuIDIKLSAgaWYgdmFsdWUgPD0gMHgxZmZmZmY6IHJldHVybiAzCi0gIGlmIHZhbHVlIDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKLSAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmY6IHJldHVybiA1Ci0gIGlmIHZhbHVlIDw9IDB4M2ZmZmZmZmZmZmY6IHJldHVybiA2Ci0gIGlmIHZhbHVlIDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKLSAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmZmZmZmZmZjogcmV0dXJuIDgKLSAgaWYgdmFsdWUgPD0gMHg3ZmZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOQotICByZXR1cm4gMTAKLQotCi1kZWYgX1NpZ25lZFZhcmludFNpemUodmFsdWUpOgotICAiIiJDb21wdXRlIHRoZSBzaXplIG9mIGEgc2lnbmVkIHZhcmludCB2YWx1ZS4iIiIKLSAgaWYgdmFsdWUgPCAwOiByZXR1cm4gMTAKLSAgaWYgdmFsdWUgPD0gMHg3ZjogcmV0dXJuIDEKLSAgaWYgdmFsdWUgPD0gMHgzZmZmOiByZXR1cm4gMgotICBpZiB2YWx1ZSA8PSAweDFmZmZmZjogcmV0dXJuIDMKLSAgaWYgdmFsdWUgPD0gMHhmZmZmZmZmOiByZXR1cm4gNAotICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZjogcmV0dXJuIDUKLSAgaWYgdmFsdWUgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKLSAgaWYgdmFsdWUgPD0gMHgxZmZmZmZmZmZmZmZmOiByZXR1cm4gNwotICBpZiB2YWx1ZSA8PSAweGZmZmZmZmZmZmZmZmZmOiByZXR1cm4gOAotICBpZiB2YWx1ZSA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5Ci0gIHJldHVybiAxMAotCi0KLWRlZiBfVGFnU2l6ZShmaWVsZF9udW1iZXIpOgotICAiIiJSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8gc2VyaWFsaXplIGEgdGFnIHdpdGggdGhpcyBmaWVsZAotICBudW1iZXIuIiIiCi0gICMgSnVzdCBwYXNzIGluIHR5cGUgMCwgc2luY2UgdGhlIHR5cGUgd29uJ3QgYWZmZWN0IHRoZSB0YWcrdHlwZSBzaXplLgotICByZXR1cm4gX1ZhcmludFNpemUod2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIDApKQotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgSW4gdGhpcyBzZWN0aW9uIHdlIGRlZmluZSBzb21lIGdlbmVyaWMgc2l6ZXJzLiAgRWFjaCBvZiB0aGVzZSBmdW5jdGlvbnMKLSMgdGFrZXMgcGFyYW1ldGVycyBzcGVjaWZpYyB0byBhIHBhcnRpY3VsYXIgZmllbGQgdHlwZSwgZS5nLiBpbnQzMiBvciBmaXhlZDY0LgotIyBJdCByZXR1cm5zIGFub3RoZXIgZnVuY3Rpb24gd2hpY2ggaW4gdHVybiB0YWtlcyBwYXJhbWV0ZXJzIHNwZWNpZmljIHRvIGEKLSMgcGFydGljdWxhciBmaWVsZCwgZS5nLiB0aGUgZmllbGQgbnVtYmVyIGFuZCB3aGV0aGVyIGl0IGlzIHJlcGVhdGVkIG9yIHBhY2tlZC4KLSMgTG9vayBhdCB0aGUgbmV4dCBzZWN0aW9uIHRvIHNlZSBob3cgdGhlc2UgYXJlIHVzZWQuCi0KLQotZGVmIF9TaW1wbGVTaXplcihjb21wdXRlX3ZhbHVlX3NpemUpOgotICAiIiJBIHNpemVyIHdoaWNoIHVzZXMgdGhlIGZ1bmN0aW9uIGNvbXB1dGVfdmFsdWVfc2l6ZSB0byBjb21wdXRlIHRoZSBzaXplIG9mCi0gIGVhY2ggdmFsdWUuICBUeXBpY2FsbHkgY29tcHV0ZV92YWx1ZV9zaXplIGlzIF9WYXJpbnRTaXplLiIiIgotCi0gIGRlZiBTcGVjaWZpY1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCi0gICAgaWYgaXNfcGFja2VkOgotICAgICAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCi0gICAgICBkZWYgUGFja2VkRmllbGRTaXplKHZhbHVlKToKLSAgICAgICAgcmVzdWx0ID0gMAotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICByZXN1bHQgKz0gY29tcHV0ZV92YWx1ZV9zaXplKGVsZW1lbnQpCi0gICAgICAgIHJldHVybiByZXN1bHQgKyBsb2NhbF9WYXJpbnRTaXplKHJlc3VsdCkgKyB0YWdfc2l6ZQotICAgICAgcmV0dXJuIFBhY2tlZEZpZWxkU2l6ZQotICAgIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgcmVzdWx0ICs9IGNvbXB1dGVfdmFsdWVfc2l6ZShlbGVtZW50KQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKLSAgICBlbHNlOgotICAgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICAgIHJldHVybiB0YWdfc2l6ZSArIGNvbXB1dGVfdmFsdWVfc2l6ZSh2YWx1ZSkKLSAgICAgIHJldHVybiBGaWVsZFNpemUKLQotICByZXR1cm4gU3BlY2lmaWNTaXplcgotCi0KLWRlZiBfTW9kaWZpZWRTaXplcihjb21wdXRlX3ZhbHVlX3NpemUsIG1vZGlmeV92YWx1ZSk6Ci0gICIiIkxpa2UgU2ltcGxlU2l6ZXIsIGJ1dCBtb2RpZnlfdmFsdWUgaXMgaW52b2tlZCBvbiBlYWNoIHZhbHVlIGJlZm9yZSBpdCBpcwotICBwYXNzZWQgdG8gY29tcHV0ZV92YWx1ZV9zaXplLiAgbW9kaWZ5X3ZhbHVlIGlzIHR5cGljYWxseSBaaWdaYWdFbmNvZGUuIiIiCi0KLSAgZGVmIFNwZWNpZmljU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKLSAgICBpZiBpc19wYWNrZWQ6Ci0gICAgICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKLSAgICAgIGRlZiBQYWNrZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgICByZXN1bHQgPSAwCi0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gcmVzdWx0ICsgbG9jYWxfVmFyaW50U2l6ZShyZXN1bHQpICsgdGFnX3NpemUKLSAgICAgIHJldHVybiBQYWNrZWRGaWVsZFNpemUKLSAgICBlbGlmIGlzX3JlcGVhdGVkOgotICAgICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKLSAgICAgICAgcmVzdWx0ID0gdGFnX3NpemUgKiBsZW4odmFsdWUpCi0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHJlc3VsdCArPSBjb21wdXRlX3ZhbHVlX3NpemUobW9kaWZ5X3ZhbHVlKGVsZW1lbnQpKQotICAgICAgICByZXR1cm4gcmVzdWx0Ci0gICAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKLSAgICBlbHNlOgotICAgICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICAgIHJldHVybiB0YWdfc2l6ZSArIGNvbXB1dGVfdmFsdWVfc2l6ZShtb2RpZnlfdmFsdWUodmFsdWUpKQotICAgICAgcmV0dXJuIEZpZWxkU2l6ZQotCi0gIHJldHVybiBTcGVjaWZpY1NpemVyCi0KLQotZGVmIF9GaXhlZFNpemVyKHZhbHVlX3NpemUpOgotICAiIiJMaWtlIF9TaW1wbGVTaXplciBleGNlcHQgZm9yIGEgZml4ZWQtc2l6ZSBmaWVsZC4gIFRoZSBpbnB1dCBpcyB0aGUgc2l6ZQotICBvZiBvbmUgdmFsdWUuIiIiCi0KLSAgZGVmIFNwZWNpZmljU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKLSAgICBpZiBpc19wYWNrZWQ6Ci0gICAgICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKLSAgICAgIGRlZiBQYWNrZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgICByZXN1bHQgPSBsZW4odmFsdWUpICogdmFsdWVfc2l6ZQotICAgICAgICByZXR1cm4gcmVzdWx0ICsgbG9jYWxfVmFyaW50U2l6ZShyZXN1bHQpICsgdGFnX3NpemUKLSAgICAgIHJldHVybiBQYWNrZWRGaWVsZFNpemUKLSAgICBlbGlmIGlzX3JlcGVhdGVkOgotICAgICAgZWxlbWVudF9zaXplID0gdmFsdWVfc2l6ZSArIHRhZ19zaXplCi0gICAgICBkZWYgUmVwZWF0ZWRGaWVsZFNpemUodmFsdWUpOgotICAgICAgICByZXR1cm4gbGVuKHZhbHVlKSAqIGVsZW1lbnRfc2l6ZQotICAgICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCi0gICAgZWxzZToKLSAgICAgIGZpZWxkX3NpemUgPSB2YWx1ZV9zaXplICsgdGFnX3NpemUKLSAgICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgotICAgICAgICByZXR1cm4gZmllbGRfc2l6ZQotICAgICAgcmV0dXJuIEZpZWxkU2l6ZQotCi0gIHJldHVybiBTcGVjaWZpY1NpemVyCi0KLQotIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotIyBIZXJlIHdlIGRlY2xhcmUgYSBzaXplciBjb25zdHJ1Y3RvciBmb3IgZWFjaCBmaWVsZCB0eXBlLiAgRWFjaCAic2l6ZXIKLSMgY29uc3RydWN0b3IiIGlzIGEgZnVuY3Rpb24gdGhhdCB0YWtlcyAoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKQotIyBhcyBwYXJhbWV0ZXJzIGFuZCByZXR1cm5zIGEgc2l6ZXIsIHdoaWNoIGluIHR1cm4gdGFrZXMgYSBmaWVsZCB2YWx1ZSBhcwotIyBhIHBhcmFtZXRlciBhbmQgcmV0dXJucyBpdHMgZW5jb2RlZCBzaXplLgotCi0KLUludDMyU2l6ZXIgPSBJbnQ2NFNpemVyID0gRW51bVNpemVyID0gX1NpbXBsZVNpemVyKF9TaWduZWRWYXJpbnRTaXplKQotCi1VSW50MzJTaXplciA9IFVJbnQ2NFNpemVyID0gX1NpbXBsZVNpemVyKF9WYXJpbnRTaXplKQotCi1TSW50MzJTaXplciA9IFNJbnQ2NFNpemVyID0gX01vZGlmaWVkU2l6ZXIoCi0gICAgX1NpZ25lZFZhcmludFNpemUsIHdpcmVfZm9ybWF0LlppZ1phZ0VuY29kZSkKLQotRml4ZWQzMlNpemVyID0gU0ZpeGVkMzJTaXplciA9IEZsb2F0U2l6ZXIgID0gX0ZpeGVkU2l6ZXIoNCkKLUZpeGVkNjRTaXplciA9IFNGaXhlZDY0U2l6ZXIgPSBEb3VibGVTaXplciA9IF9GaXhlZFNpemVyKDgpCi0KLUJvb2xTaXplciA9IF9GaXhlZFNpemVyKDEpCi0KLQotZGVmIFN0cmluZ1NpemVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICIiIlJldHVybnMgYSBzaXplciBmb3IgYSBzdHJpbmcgZmllbGQuIiIiCi0KLSAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCi0gIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQotICBsb2NhbF9sZW4gPSBsZW4KLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKLSAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIGwgPSBsb2NhbF9sZW4oZWxlbWVudC5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICAgIHJlc3VsdCArPSBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAotICAgICAgcmV0dXJuIHJlc3VsdAotICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQotICBlbHNlOgotICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgotICAgICAgbCA9IGxvY2FsX2xlbih2YWx1ZS5lbmNvZGUoJ3V0Zi04JykpCi0gICAgICByZXR1cm4gdGFnX3NpemUgKyBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAotICAgIHJldHVybiBGaWVsZFNpemUKLQotCi1kZWYgQnl0ZXNTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgYnl0ZXMgZmllbGQuIiIiCi0KLSAgdGFnX3NpemUgPSBfVGFnU2l6ZShmaWVsZF9udW1iZXIpCi0gIGxvY2FsX1ZhcmludFNpemUgPSBfVmFyaW50U2l6ZQotICBsb2NhbF9sZW4gPSBsZW4KLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKLSAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIGwgPSBsb2NhbF9sZW4oZWxlbWVudCkKLSAgICAgICAgcmVzdWx0ICs9IGxvY2FsX1ZhcmludFNpemUobCkgKyBsCi0gICAgICByZXR1cm4gcmVzdWx0Ci0gICAgcmV0dXJuIFJlcGVhdGVkRmllbGRTaXplCi0gIGVsc2U6Ci0gICAgZGVmIEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICBsID0gbG9jYWxfbGVuKHZhbHVlKQotICAgICAgcmV0dXJuIHRhZ19zaXplICsgbG9jYWxfVmFyaW50U2l6ZShsKSArIGwKLSAgICByZXR1cm4gRmllbGRTaXplCi0KLQotZGVmIEdyb3VwU2l6ZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgIiIiUmV0dXJucyBhIHNpemVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgotCi0gIHRhZ19zaXplID0gX1RhZ1NpemUoZmllbGRfbnVtYmVyKSAqIDIKLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgZGVmIFJlcGVhdGVkRmllbGRTaXplKHZhbHVlKToKLSAgICAgIHJlc3VsdCA9IHRhZ19zaXplICogbGVuKHZhbHVlKQotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIHJlc3VsdCArPSBlbGVtZW50LkJ5dGVTaXplKCkKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICByZXR1cm4gUmVwZWF0ZWRGaWVsZFNpemUKLSAgZWxzZToKLSAgICBkZWYgRmllbGRTaXplKHZhbHVlKToKLSAgICAgIHJldHVybiB0YWdfc2l6ZSArIHZhbHVlLkJ5dGVTaXplKCkKLSAgICByZXR1cm4gRmllbGRTaXplCi0KLQotZGVmIE1lc3NhZ2VTaXplcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAiIiJSZXR1cm5zIGEgc2l6ZXIgZm9yIGEgbWVzc2FnZSBmaWVsZC4iIiIKLQotICB0YWdfc2l6ZSA9IF9UYWdTaXplKGZpZWxkX251bWJlcikKLSAgbG9jYWxfVmFyaW50U2l6ZSA9IF9WYXJpbnRTaXplCi0gIGFzc2VydCBub3QgaXNfcGFja2VkCi0gIGlmIGlzX3JlcGVhdGVkOgotICAgIGRlZiBSZXBlYXRlZEZpZWxkU2l6ZSh2YWx1ZSk6Ci0gICAgICByZXN1bHQgPSB0YWdfc2l6ZSAqIGxlbih2YWx1ZSkKLSAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICBsID0gZWxlbWVudC5CeXRlU2l6ZSgpCi0gICAgICAgIHJlc3VsdCArPSBsb2NhbF9WYXJpbnRTaXplKGwpICsgbAotICAgICAgcmV0dXJuIHJlc3VsdAotICAgIHJldHVybiBSZXBlYXRlZEZpZWxkU2l6ZQotICBlbHNlOgotICAgIGRlZiBGaWVsZFNpemUodmFsdWUpOgotICAgICAgbCA9IHZhbHVlLkJ5dGVTaXplKCkKLSAgICAgIHJldHVybiB0YWdfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCi0gICAgcmV0dXJuIEZpZWxkU2l6ZQotCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgTWVzc2FnZVNldCBpcyBzcGVjaWFsLgotCi0KLWRlZiBNZXNzYWdlU2V0SXRlbVNpemVyKGZpZWxkX251bWJlcik6Ci0gICIiIlJldHVybnMgYSBzaXplciBmb3IgZXh0ZW5zaW9ucyBvZiBNZXNzYWdlU2V0LgotCi0gIFRoZSBtZXNzYWdlIHNldCBtZXNzYWdlIGxvb2tzIGxpa2UgdGhpczoKLSAgICBtZXNzYWdlIE1lc3NhZ2VTZXQgewotICAgICAgcmVwZWF0ZWQgZ3JvdXAgSXRlbSA9IDEgewotICAgICAgICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKLSAgICAgICAgcmVxdWlyZWQgc3RyaW5nIG1lc3NhZ2UgPSAzOwotICAgICAgfQotICAgIH0KLSAgIiIiCi0gIHN0YXRpY19zaXplID0gKF9UYWdTaXplKDEpICogMiArIF9UYWdTaXplKDIpICsgX1ZhcmludFNpemUoZmllbGRfbnVtYmVyKSArCi0gICAgICAgICAgICAgICAgIF9UYWdTaXplKDMpKQotICBsb2NhbF9WYXJpbnRTaXplID0gX1ZhcmludFNpemUKLQotICBkZWYgRmllbGRTaXplKHZhbHVlKToKLSAgICBsID0gdmFsdWUuQnl0ZVNpemUoKQotICAgIHJldHVybiBzdGF0aWNfc2l6ZSArIGxvY2FsX1ZhcmludFNpemUobCkgKyBsCi0KLSAgcmV0dXJuIEZpZWxkU2l6ZQotCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgRW5jb2RlcnMhCi0KLQotZGVmIF9WYXJpbnRFbmNvZGVyKCk6Ci0gICIiIlJldHVybiBhbiBlbmNvZGVyIGZvciBhIGJhc2ljIHZhcmludCB2YWx1ZSAoZG9lcyBub3QgaW5jbHVkZSB0YWcpLiIiIgotCi0gIGxvY2FsX2NociA9IGNocgotICBkZWYgRW5jb2RlVmFyaW50KHdyaXRlLCB2YWx1ZSk6Ci0gICAgYml0cyA9IHZhbHVlICYgMHg3ZgotICAgIHZhbHVlID4+PSA3Ci0gICAgd2hpbGUgdmFsdWU6Ci0gICAgICB3cml0ZShsb2NhbF9jaHIoMHg4MHxiaXRzKSkKLSAgICAgIGJpdHMgPSB2YWx1ZSAmIDB4N2YKLSAgICAgIHZhbHVlID4+PSA3Ci0gICAgcmV0dXJuIHdyaXRlKGxvY2FsX2NocihiaXRzKSkKLQotICByZXR1cm4gRW5jb2RlVmFyaW50Ci0KLQotZGVmIF9TaWduZWRWYXJpbnRFbmNvZGVyKCk6Ci0gICIiIlJldHVybiBhbiBlbmNvZGVyIGZvciBhIGJhc2ljIHNpZ25lZCB2YXJpbnQgdmFsdWUgKGRvZXMgbm90IGluY2x1ZGUKLSAgdGFnKS4iIiIKLQotICBsb2NhbF9jaHIgPSBjaHIKLSAgZGVmIEVuY29kZVNpZ25lZFZhcmludCh3cml0ZSwgdmFsdWUpOgotICAgIGlmIHZhbHVlIDwgMDoKLSAgICAgIHZhbHVlICs9ICgxIDw8IDY0KQotICAgIGJpdHMgPSB2YWx1ZSAmIDB4N2YKLSAgICB2YWx1ZSA+Pj0gNwotICAgIHdoaWxlIHZhbHVlOgotICAgICAgd3JpdGUobG9jYWxfY2hyKDB4ODB8Yml0cykpCi0gICAgICBiaXRzID0gdmFsdWUgJiAweDdmCi0gICAgICB2YWx1ZSA+Pj0gNwotICAgIHJldHVybiB3cml0ZShsb2NhbF9jaHIoYml0cykpCi0KLSAgcmV0dXJuIEVuY29kZVNpZ25lZFZhcmludAotCi0KLV9FbmNvZGVWYXJpbnQgPSBfVmFyaW50RW5jb2RlcigpCi1fRW5jb2RlU2lnbmVkVmFyaW50ID0gX1NpZ25lZFZhcmludEVuY29kZXIoKQotCi0KLWRlZiBfVmFyaW50Qnl0ZXModmFsdWUpOgotICAiIiJFbmNvZGUgdGhlIGdpdmVuIGludGVnZXIgYXMgYSB2YXJpbnQgYW5kIHJldHVybiB0aGUgYnl0ZXMuICBUaGlzIGlzIG9ubHkKLSAgY2FsbGVkIGF0IHN0YXJ0dXAgdGltZSBzbyBpdCBkb2Vzbid0IG5lZWQgdG8gYmUgZmFzdC4iIiIKLQotICBwaWVjZXMgPSBbXQotICBfRW5jb2RlVmFyaW50KHBpZWNlcy5hcHBlbmQsIHZhbHVlKQotICByZXR1cm4gIiIuam9pbihwaWVjZXMpCi0KLQotZGVmIFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKToKLSAgIiIiRW5jb2RlIHRoZSBnaXZlbiB0YWcgYW5kIHJldHVybiB0aGUgYnl0ZXMuICBPbmx5IGNhbGxlZCBhdCBzdGFydHVwLiIiIgotCi0gIHJldHVybiBfVmFyaW50Qnl0ZXMod2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkpCi0KLSMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSMgQXMgd2l0aCBzaXplcnMgKHNlZSBhYm92ZSksIHdlIGhhdmUgYSBudW1iZXIgb2YgY29tbW9uIGVuY29kZXIKLSMgaW1wbGVtZW50YXRpb25zLgotCi0KLWRlZiBfU2ltcGxlRW5jb2Rlcih3aXJlX3R5cGUsIGVuY29kZV92YWx1ZSwgY29tcHV0ZV92YWx1ZV9zaXplKToKLSAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGFuIGVuY29kZXIgZm9yIGZpZWxkcyBvZiBhIHBhcnRpY3VsYXIgdHlwZS4KLQotICBBcmdzOgotICAgICAgd2lyZV90eXBlOiAgVGhlIGZpZWxkJ3Mgd2lyZSB0eXBlLCBmb3IgZW5jb2RpbmcgdGFncy4KLSAgICAgIGVuY29kZV92YWx1ZTogIEEgZnVuY3Rpb24gd2hpY2ggZW5jb2RlcyBhbiBpbmRpdmlkdWFsIHZhbHVlLCBlLmcuCi0gICAgICAgIF9FbmNvZGVWYXJpbnQoKS4KLSAgICAgIGNvbXB1dGVfdmFsdWVfc2l6ZTogIEEgZnVuY3Rpb24gd2hpY2ggY29tcHV0ZXMgdGhlIHNpemUgb2YgYW4gaW5kaXZpZHVhbAotICAgICAgICB2YWx1ZSwgZS5nLiBfVmFyaW50U2l6ZSgpLgotICAiIiIKLQotICBkZWYgU3BlY2lmaWNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICAgaWYgaXNfcGFja2VkOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotICAgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgc2l6ZSA9IDAKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgc2l6ZSArPSBjb21wdXRlX3ZhbHVlX3NpemUoZWxlbWVudCkKLSAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBzaXplKQotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICBlbmNvZGVfdmFsdWUod3JpdGUsIGVsZW1lbnQpCi0gICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKLSAgICBlbGlmIGlzX3JlcGVhdGVkOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICAgICAgZW5jb2RlX3ZhbHVlKHdyaXRlLCBlbGVtZW50KQotICAgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgICBlbHNlOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICByZXR1cm4gZW5jb2RlX3ZhbHVlKHdyaXRlLCB2YWx1ZSkKLSAgICAgIHJldHVybiBFbmNvZGVGaWVsZAotCi0gIHJldHVybiBTcGVjaWZpY0VuY29kZXIKLQotCi1kZWYgX01vZGlmaWVkRW5jb2Rlcih3aXJlX3R5cGUsIGVuY29kZV92YWx1ZSwgY29tcHV0ZV92YWx1ZV9zaXplLCBtb2RpZnlfdmFsdWUpOgotICAiIiJMaWtlIFNpbXBsZUVuY29kZXIgYnV0IGFkZGl0aW9uYWxseSBpbnZva2VzIG1vZGlmeV92YWx1ZSBvbiBldmVyeSB2YWx1ZQotICBiZWZvcmUgcGFzc2luZyBpdCB0byBlbmNvZGVfdmFsdWUuICBVc3VhbGx5IG1vZGlmeV92YWx1ZSBpcyBaaWdaYWdFbmNvZGUuIiIiCi0KLSAgZGVmIFNwZWNpZmljRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAgIGlmIGlzX3BhY2tlZDoKLSAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKLSAgICAgIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKLSAgICAgIGRlZiBFbmNvZGVQYWNrZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICAgIHNpemUgPSAwCi0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHNpemUgKz0gY29tcHV0ZV92YWx1ZV9zaXplKG1vZGlmeV92YWx1ZShlbGVtZW50KSkKLSAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBzaXplKQotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICBlbmNvZGVfdmFsdWUod3JpdGUsIG1vZGlmeV92YWx1ZShlbGVtZW50KSkKLSAgICAgIHJldHVybiBFbmNvZGVQYWNrZWRGaWVsZAotICAgIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgICBlbmNvZGVfdmFsdWUod3JpdGUsIG1vZGlmeV92YWx1ZShlbGVtZW50KSkKLSAgICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCi0gICAgZWxzZToKLSAgICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV90eXBlKQotICAgICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgcmV0dXJuIGVuY29kZV92YWx1ZSh3cml0ZSwgbW9kaWZ5X3ZhbHVlKHZhbHVlKSkKLSAgICAgIHJldHVybiBFbmNvZGVGaWVsZAotCi0gIHJldHVybiBTcGVjaWZpY0VuY29kZXIKLQotCi1kZWYgX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfdHlwZSwgZm9ybWF0KToKLSAgIiIiUmV0dXJuIGEgY29uc3RydWN0b3IgZm9yIGFuIGVuY29kZXIgZm9yIGEgZml4ZWQtd2lkdGggZmllbGQuCi0KLSAgQXJnczoKLSAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZSwgZm9yIGVuY29kaW5nIHRhZ3MuCi0gICAgICBmb3JtYXQ6ICBUaGUgZm9ybWF0IHN0cmluZyB0byBwYXNzIHRvIHN0cnVjdC5wYWNrKCkuCi0gICIiIgotCi0gIHZhbHVlX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoZm9ybWF0KQotCi0gIGRlZiBTcGVjaWZpY0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgICBsb2NhbF9zdHJ1Y3RfcGFjayA9IHN0cnVjdC5wYWNrCi0gICAgaWYgaXNfcGFja2VkOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotICAgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsZW4odmFsdWUpICogdmFsdWVfc2l6ZSkKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKLSAgICAgIHJldHVybiBFbmNvZGVQYWNrZWRGaWVsZAotICAgIGVsaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfdHlwZSkKLSAgICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgICB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIGVsZW1lbnQpKQotICAgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgICBlbHNlOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICByZXR1cm4gd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCB2YWx1ZSkpCi0gICAgICByZXR1cm4gRW5jb2RlRmllbGQKLQotICByZXR1cm4gU3BlY2lmaWNFbmNvZGVyCi0KLQotZGVmIF9GbG9hdGluZ1BvaW50RW5jb2Rlcih3aXJlX3R5cGUsIGZvcm1hdCk6Ci0gICIiIlJldHVybiBhIGNvbnN0cnVjdG9yIGZvciBhbiBlbmNvZGVyIGZvciBmbG9hdCBmaWVsZHMuCi0KLSAgVGhpcyBpcyBsaWtlIFN0cnVjdFBhY2tFbmNvZGVyLCBidXQgY2F0Y2hlcyBlcnJvcnMgdGhhdCBtYXkgYmUgZHVlIHRvCi0gIHBhc3Npbmcgbm9uLWZpbml0ZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMgdG8gc3RydWN0LnBhY2ssIGFuZCBtYWtlcyBhCi0gIHNlY29uZCBhdHRlbXB0IHRvIGVuY29kZSB0aG9zZSB2YWx1ZXMuCi0KLSAgQXJnczoKLSAgICAgIHdpcmVfdHlwZTogIFRoZSBmaWVsZCdzIHdpcmUgdHlwZSwgZm9yIGVuY29kaW5nIHRhZ3MuCi0gICAgICBmb3JtYXQ6ICBUaGUgZm9ybWF0IHN0cmluZyB0byBwYXNzIHRvIHN0cnVjdC5wYWNrKCkuCi0gICIiIgotCi0gIHZhbHVlX3NpemUgPSBzdHJ1Y3QuY2FsY3NpemUoZm9ybWF0KQotICBpZiB2YWx1ZV9zaXplID09IDQ6Ci0gICAgZGVmIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIHZhbHVlKToKLSAgICAgICMgUmVtZW1iZXIgdGhhdCB0aGUgc2VyaWFsaXplZCBmb3JtIHVzZXMgbGl0dGxlLWVuZGlhbiBieXRlIG9yZGVyLgotICAgICAgaWYgdmFsdWUgPT0gX1BPU19JTkY6Ci0gICAgICAgIHdyaXRlKCdceDAwXHgwMFx4ODBceDdGJykKLSAgICAgIGVsaWYgdmFsdWUgPT0gX05FR19JTkY6Ci0gICAgICAgIHdyaXRlKCdceDAwXHgwMFx4ODBceEZGJykKLSAgICAgIGVsaWYgdmFsdWUgIT0gdmFsdWU6ICAgICAgICAgICAjIE5hTgotICAgICAgICB3cml0ZSgnXHgwMFx4MDBceEMwXHg3RicpCi0gICAgICBlbHNlOgotICAgICAgICByYWlzZQotICBlbGlmIHZhbHVlX3NpemUgPT0gODoKLSAgICBkZWYgRW5jb2RlTm9uRmluaXRlT3JSYWlzZSh3cml0ZSwgdmFsdWUpOgotICAgICAgaWYgdmFsdWUgPT0gX1BPU19JTkY6Ci0gICAgICAgIHdyaXRlKCdceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHg3RicpCi0gICAgICBlbGlmIHZhbHVlID09IF9ORUdfSU5GOgotICAgICAgICB3cml0ZSgnXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQotICAgICAgZWxpZiB2YWx1ZSAhPSB2YWx1ZTogICAgICAgICAgICAgICAgICAgICAgICAgIyBOYU4KLSAgICAgICAgd3JpdGUoJ1x4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJykKLSAgICAgIGVsc2U6Ci0gICAgICAgIHJhaXNlCi0gIGVsc2U6Ci0gICAgcmFpc2UgVmFsdWVFcnJvcignQ2FuXCd0IGVuY29kZSBmbG9hdGluZy1wb2ludCB2YWx1ZXMgdGhhdCBhcmUgJwotICAgICAgICAgICAgICAgICAgICAgJyVkIGJ5dGVzIGxvbmcgKG9ubHkgNCBvciA4KScgJSB2YWx1ZV9zaXplKQotCi0gIGRlZiBTcGVjaWZpY0VuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgICBsb2NhbF9zdHJ1Y3RfcGFjayA9IHN0cnVjdC5wYWNrCi0gICAgaWYgaXNfcGFja2VkOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICAgICAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotICAgICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsZW4odmFsdWUpICogdmFsdWVfc2l6ZSkKLSAgICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgICAgIyBUaGlzIHRyeS9leGNlcHQgYmxvY2sgaXMgZ29pbmcgdG8gYmUgZmFzdGVyIHRoYW4gYW55IGNvZGUgdGhhdAotICAgICAgICAgICMgd2UgY291bGQgd3JpdGUgdG8gY2hlY2sgd2hldGhlciBlbGVtZW50IGlzIGZpbml0ZS4KLSAgICAgICAgICB0cnk6Ci0gICAgICAgICAgICB3cml0ZShsb2NhbF9zdHJ1Y3RfcGFjayhmb3JtYXQsIGVsZW1lbnQpKQotICAgICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKLSAgICAgICAgICAgIEVuY29kZU5vbkZpbml0ZU9yUmFpc2Uod3JpdGUsIGVsZW1lbnQpCi0gICAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKLSAgICBlbGlmIGlzX3JlcGVhdGVkOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICAgICAgdHJ5OgotICAgICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCBlbGVtZW50KSkKLSAgICAgICAgICBleGNlcHQgU3lzdGVtRXJyb3I6Ci0gICAgICAgICAgICBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCBlbGVtZW50KQotICAgICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgICBlbHNlOgotICAgICAgdGFnX2J5dGVzID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpCi0gICAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgICB0cnk6Ci0gICAgICAgICAgd3JpdGUobG9jYWxfc3RydWN0X3BhY2soZm9ybWF0LCB2YWx1ZSkpCi0gICAgICAgIGV4Y2VwdCBTeXN0ZW1FcnJvcjoKLSAgICAgICAgICBFbmNvZGVOb25GaW5pdGVPclJhaXNlKHdyaXRlLCB2YWx1ZSkKLSAgICAgIHJldHVybiBFbmNvZGVGaWVsZAotCi0gIHJldHVybiBTcGVjaWZpY0VuY29kZXIKLQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIEhlcmUgd2UgZGVjbGFyZSBhbiBlbmNvZGVyIGNvbnN0cnVjdG9yIGZvciBlYWNoIGZpZWxkIHR5cGUuICBUaGVzZSB3b3JrCi0jIHZlcnkgc2ltaWxhcmx5IHRvIHNpemVyIGNvbnN0cnVjdG9ycywgZGVzY3JpYmVkIGVhcmxpZXIuCi0KLQotSW50MzJFbmNvZGVyID0gSW50NjRFbmNvZGVyID0gRW51bUVuY29kZXIgPSBfU2ltcGxlRW5jb2RlcigKLSAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9FbmNvZGVTaWduZWRWYXJpbnQsIF9TaWduZWRWYXJpbnRTaXplKQotCi1VSW50MzJFbmNvZGVyID0gVUludDY0RW5jb2RlciA9IF9TaW1wbGVFbmNvZGVyKAotICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwgX0VuY29kZVZhcmludCwgX1ZhcmludFNpemUpCi0KLVNJbnQzMkVuY29kZXIgPSBTSW50NjRFbmNvZGVyID0gX01vZGlmaWVkRW5jb2RlcigKLSAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsIF9FbmNvZGVWYXJpbnQsIF9WYXJpbnRTaXplLAotICAgIHdpcmVfZm9ybWF0LlppZ1phZ0VuY29kZSkKLQotIyBOb3RlIHRoYXQgUHl0aG9uIGNvbnZlbmllbnRseSBndWFyYW50ZWVzIHRoYXQgd2hlbiB1c2luZyB0aGUgJzwnIHByZWZpeCBvbgotIyBmb3JtYXRzLCB0aGV5IHdpbGwgYWxzbyBoYXZlIHRoZSBzYW1lIHNpemUgYWNyb3NzIGFsbCBwbGF0Zm9ybXMgKGFzIG9wcG9zZWQKLSMgdG8gd2l0aG91dCB0aGUgcHJlZml4LCB3aGVyZSB0aGVpciBzaXplcyBkZXBlbmQgb24gdGhlIEMgY29tcGlsZXIncyBiYXNpYwotIyB0eXBlIHNpemVzKS4KLUZpeGVkMzJFbmNvZGVyICA9IF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLCAnPEknKQotRml4ZWQ2NEVuY29kZXIgID0gX1N0cnVjdFBhY2tFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsICc8UScpCi1TRml4ZWQzMkVuY29kZXIgPSBfU3RydWN0UGFja0VuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwgJzxpJykKLVNGaXhlZDY0RW5jb2RlciA9IF9TdHJ1Y3RQYWNrRW5jb2Rlcih3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDY0LCAnPHEnKQotRmxvYXRFbmNvZGVyICAgID0gX0Zsb2F0aW5nUG9pbnRFbmNvZGVyKHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVEMzIsICc8ZicpCi1Eb3VibGVFbmNvZGVyICAgPSBfRmxvYXRpbmdQb2ludEVuY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwgJzxkJykKLQotCi1kZWYgQm9vbEVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIGJvb2xlYW4gZmllbGQuIiIiCi0KLSAgZmFsc2VfYnl0ZSA9IGNocigwKQotICB0cnVlX2J5dGUgPSBjaHIoMSkKLSAgaWYgaXNfcGFja2VkOgotICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKLSAgICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50Ci0gICAgZGVmIEVuY29kZVBhY2tlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICB3cml0ZSh0YWdfYnl0ZXMpCi0gICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxlbih2YWx1ZSkpCi0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgaWYgZWxlbWVudDoKLSAgICAgICAgICB3cml0ZSh0cnVlX2J5dGUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgd3JpdGUoZmFsc2VfYnl0ZSkKLSAgICByZXR1cm4gRW5jb2RlUGFja2VkRmllbGQKLSAgZWxpZiBpc19yZXBlYXRlZDoKLSAgICB0YWdfYnl0ZXMgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCkKLSAgICBkZWYgRW5jb2RlUmVwZWF0ZWRGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgZm9yIGVsZW1lbnQgaW4gdmFsdWU6Ci0gICAgICAgIHdyaXRlKHRhZ19ieXRlcykKLSAgICAgICAgaWYgZWxlbWVudDoKLSAgICAgICAgICB3cml0ZSh0cnVlX2J5dGUpCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgd3JpdGUoZmFsc2VfYnl0ZSkKLSAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAotICBlbHNlOgotICAgIHRhZ19ieXRlcyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKQotICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgd3JpdGUodGFnX2J5dGVzKQotICAgICAgaWYgdmFsdWU6Ci0gICAgICAgIHJldHVybiB3cml0ZSh0cnVlX2J5dGUpCi0gICAgICByZXR1cm4gd3JpdGUoZmFsc2VfYnl0ZSkKLSAgICByZXR1cm4gRW5jb2RlRmllbGQKLQotCi1kZWYgU3RyaW5nRW5jb2RlcihmaWVsZF9udW1iZXIsIGlzX3JlcGVhdGVkLCBpc19wYWNrZWQpOgotICAiIiJSZXR1cm5zIGFuIGVuY29kZXIgZm9yIGEgc3RyaW5nIGZpZWxkLiIiIgotCi0gIHRhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkKLSAgbG9jYWxfRW5jb2RlVmFyaW50ID0gX0VuY29kZVZhcmludAotICBsb2NhbF9sZW4gPSBsZW4KLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICBlbmNvZGVkID0gZWxlbWVudC5lbmNvZGUoJ3V0Zi04JykKLSAgICAgICAgd3JpdGUodGFnKQotICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxvY2FsX2xlbihlbmNvZGVkKSkKLSAgICAgICAgd3JpdGUoZW5jb2RlZCkKLSAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAotICBlbHNlOgotICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgZW5jb2RlZCA9IHZhbHVlLmVuY29kZSgndXRmLTgnKQotICAgICAgd3JpdGUodGFnKQotICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4oZW5jb2RlZCkpCi0gICAgICByZXR1cm4gd3JpdGUoZW5jb2RlZCkKLSAgICByZXR1cm4gRW5jb2RlRmllbGQKLQotCi1kZWYgQnl0ZXNFbmNvZGVyKGZpZWxkX251bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCk6Ci0gICIiIlJldHVybnMgYW4gZW5jb2RlciBmb3IgYSBieXRlcyBmaWVsZC4iIiIKLQotICB0YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpCi0gIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKLSAgbG9jYWxfbGVuID0gbGVuCi0gIGFzc2VydCBub3QgaXNfcGFja2VkCi0gIGlmIGlzX3JlcGVhdGVkOgotICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgd3JpdGUodGFnKQotICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGxvY2FsX2xlbihlbGVtZW50KSkKLSAgICAgICAgd3JpdGUoZWxlbWVudCkKLSAgICByZXR1cm4gRW5jb2RlUmVwZWF0ZWRGaWVsZAotICBlbHNlOgotICAgIGRlZiBFbmNvZGVGaWVsZCh3cml0ZSwgdmFsdWUpOgotICAgICAgd3JpdGUodGFnKQotICAgICAgbG9jYWxfRW5jb2RlVmFyaW50KHdyaXRlLCBsb2NhbF9sZW4odmFsdWUpKQotICAgICAgcmV0dXJuIHdyaXRlKHZhbHVlKQotICAgIHJldHVybiBFbmNvZGVGaWVsZAotCi0KLWRlZiBHcm91cEVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIGdyb3VwIGZpZWxkLiIiIgotCi0gIHN0YXJ0X3RhZyA9IFRhZ0J5dGVzKGZpZWxkX251bWJlciwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApCi0gIGVuZF90YWcgPSBUYWdCeXRlcyhmaWVsZF9udW1iZXIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0VORF9HUk9VUCkKLSAgYXNzZXJ0IG5vdCBpc19wYWNrZWQKLSAgaWYgaXNfcmVwZWF0ZWQ6Ci0gICAgZGVmIEVuY29kZVJlcGVhdGVkRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICB3cml0ZShzdGFydF90YWcpCi0gICAgICAgIGVsZW1lbnQuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQotICAgICAgICB3cml0ZShlbmRfdGFnKQotICAgIHJldHVybiBFbmNvZGVSZXBlYXRlZEZpZWxkCi0gIGVsc2U6Ci0gICAgZGVmIEVuY29kZUZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICB3cml0ZShzdGFydF90YWcpCi0gICAgICB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUpCi0gICAgICByZXR1cm4gd3JpdGUoZW5kX3RhZykKLSAgICByZXR1cm4gRW5jb2RlRmllbGQKLQotCi1kZWYgTWVzc2FnZUVuY29kZXIoZmllbGRfbnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkKToKLSAgIiIiUmV0dXJucyBhbiBlbmNvZGVyIGZvciBhIG1lc3NhZ2UgZmllbGQuIiIiCi0KLSAgdGFnID0gVGFnQnl0ZXMoZmllbGRfbnVtYmVyLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKQotICBsb2NhbF9FbmNvZGVWYXJpbnQgPSBfRW5jb2RlVmFyaW50Ci0gIGFzc2VydCBub3QgaXNfcGFja2VkCi0gIGlmIGlzX3JlcGVhdGVkOgotICAgIGRlZiBFbmNvZGVSZXBlYXRlZEZpZWxkKHdyaXRlLCB2YWx1ZSk6Ci0gICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgd3JpdGUodGFnKQotICAgICAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIGVsZW1lbnQuQnl0ZVNpemUoKSkKLSAgICAgICAgZWxlbWVudC5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUpCi0gICAgcmV0dXJuIEVuY29kZVJlcGVhdGVkRmllbGQKLSAgZWxzZToKLSAgICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICAgIHdyaXRlKHRhZykKLSAgICAgIGxvY2FsX0VuY29kZVZhcmludCh3cml0ZSwgdmFsdWUuQnl0ZVNpemUoKSkKLSAgICAgIHJldHVybiB2YWx1ZS5fSW50ZXJuYWxTZXJpYWxpemUod3JpdGUpCi0gICAgcmV0dXJuIEVuY29kZUZpZWxkCi0KLQotIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotIyBBcyBiZWZvcmUsIE1lc3NhZ2VTZXQgaXMgc3BlY2lhbC4KLQotCi1kZWYgTWVzc2FnZVNldEl0ZW1FbmNvZGVyKGZpZWxkX251bWJlcik6Ci0gICIiIkVuY29kZXIgZm9yIGV4dGVuc2lvbnMgb2YgTWVzc2FnZVNldC4KLQotICBUaGUgbWVzc2FnZSBzZXQgbWVzc2FnZSBsb29rcyBsaWtlIHRoaXM6Ci0gICAgbWVzc2FnZSBNZXNzYWdlU2V0IHsKLSAgICAgIHJlcGVhdGVkIGdyb3VwIEl0ZW0gPSAxIHsKLSAgICAgICAgcmVxdWlyZWQgaW50MzIgdHlwZV9pZCA9IDI7Ci0gICAgICAgIHJlcXVpcmVkIHN0cmluZyBtZXNzYWdlID0gMzsKLSAgICAgIH0KLSAgICB9Ci0gICIiIgotICBzdGFydF9ieXRlcyA9ICIiLmpvaW4oWwotICAgICAgVGFnQnl0ZXMoMSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVApLAotICAgICAgVGFnQnl0ZXMoMiwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwKLSAgICAgIF9WYXJpbnRCeXRlcyhmaWVsZF9udW1iZXIpLAotICAgICAgVGFnQnl0ZXMoMywgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCldKQotICBlbmRfYnl0ZXMgPSBUYWdCeXRlcygxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9FTkRfR1JPVVApCi0gIGxvY2FsX0VuY29kZVZhcmludCA9IF9FbmNvZGVWYXJpbnQKLQotICBkZWYgRW5jb2RlRmllbGQod3JpdGUsIHZhbHVlKToKLSAgICB3cml0ZShzdGFydF9ieXRlcykKLSAgICBsb2NhbF9FbmNvZGVWYXJpbnQod3JpdGUsIHZhbHVlLkJ5dGVTaXplKCkpCi0gICAgdmFsdWUuX0ludGVybmFsU2VyaWFsaXplKHdyaXRlKQotICAgIHJldHVybiB3cml0ZShlbmRfYnl0ZXMpCi0KLSAgcmV0dXJuIEVuY29kZUZpZWxkCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9nZW5lcmF0b3JfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2dlbmVyYXRvcl90ZXN0LnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCBiM2Y3ZDliLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL2dlbmVyYXRvcl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQ0ICswLDAgQEAKLSMhIC91c3IvYmluL3B5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSMgVE9ETyhyb2JpbnNvbik6IEZsZXNoIHRoaXMgb3V0IGNvbnNpZGVyYWJseS4gIFdlIGZvY3VzZWQgb24gcmVmbGVjdGlvbl90ZXN0LnB5Ci0jIGZpcnN0LCBzaW5jZSBpdCdzIHRlc3RpbmcgdGhlIHN1YnRsZXIgY29kZSwgYW5kIHNpbmNlIGl0IHByb3ZpZGVzIGRlY2VudAotIyBpbmRpcmVjdCB0ZXN0aW5nIG9mIHRoZSBwcm90b2NvbCBjb21waWxlciBvdXRwdXQuCi0KLSIiIlVuaXR0ZXN0IHRoYXQgZGlyZWN0bHkgdGVzdHMgdGhlIG91dHB1dCBvZiB0aGUgcHVyZS1QeXRob24gcHJvdG9jb2wKLWNvbXBpbGVyLiAgU2VlIC8vZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fdGVzdC5weSBmb3IgYSB0ZXN0IHdoaWNoCi1mdXJ0aGVyIGVuc3VyZXMgdGhhdCB3ZSBjYW4gdXNlIFB5dGhvbiBwcm90b2NvbCBtZXNzYWdlIG9iamVjdHMgYXMgd2UgZXhwZWN0LgotIiIiCi0KLV9fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCi0KLWltcG9ydCB1bml0dGVzdAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc2VydmljZQotCi1NQVhfRVhURU5TSU9OID0gNTM2ODcwOTEyCi0KLQotY2xhc3MgR2VuZXJhdG9yVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3ROZXN0ZWRNZXNzYWdlRGVzY3JpcHRvcihzZWxmKToKLSAgICBmaWVsZF9uYW1lID0gJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJwotICAgIHByb3RvX3R5cGUgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgcHJvdG9fdHlwZS5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IsCi0gICAgICAgIHByb3RvX3R5cGUuREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVtmaWVsZF9uYW1lXS5tZXNzYWdlX3R5cGUpCi0KLSAgZGVmIHRlc3RFbnVtcyhzZWxmKToKLSAgICAjIFdlIHRlc3Qgb25seSBtb2R1bGUtbGV2ZWwgZW51bXMgaGVyZS4KLSAgICAjIFRPRE8ocm9iaW5zb24pOiBFeGFtaW5lIGRlc2NyaXB0b3JzIGRpcmVjdGx5IHRvIGNoZWNrCi0gICAgIyBlbnVtIGRlc2NyaXB0b3Igb3V0cHV0LgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgdW5pdHRlc3RfcGIyLkZPUkVJR05fRk9PKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaKQotCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLkZPTykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8uQkFSKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90by5CQVopCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWikKLQotICBkZWYgdGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKCkKLQotICAgICMgUHl0aG9uIHByZS0yLjYgZG9lcyBub3QgaGF2ZSBpc2luZigpIG9yIGlzbmFuKCkgZnVuY3Rpb25zLCBzbyB3ZSBoYXZlCi0gICAgIyB0byBwcm92aWRlIG91ciBvd24uCi0gICAgZGVmIGlzbmFuKHZhbCk6Ci0gICAgICAjIE5hTiBpcyBuZXZlciBlcXVhbCB0byBpdHNlbGYuCi0gICAgICByZXR1cm4gdmFsICE9IHZhbAotICAgIGRlZiBpc2luZih2YWwpOgotICAgICAgIyBJbmZpbml0eSB0aW1lcyB6ZXJvIGVxdWFscyBOYU4uCi0gICAgICByZXR1cm4gbm90IGlzbmFuKHZhbCkgYW5kIGlzbmFuKHZhbCAqIDApCi0KLSAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYobWVzc2FnZS5pbmZfZG91YmxlKSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5pbmZfZG91YmxlID4gMCkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNpbmYobWVzc2FnZS5uZWdfaW5mX2RvdWJsZSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UubmVnX2luZl9kb3VibGUgPCAwKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihtZXNzYWdlLm5hbl9kb3VibGUpKQotCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5mKG1lc3NhZ2UuaW5mX2Zsb2F0KSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5pbmZfZmxvYXQgPiAwKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc2luZihtZXNzYWdlLm5lZ19pbmZfZmxvYXQpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm5lZ19pbmZfZmxvYXQgPCAwKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihtZXNzYWdlLm5hbl9mbG9hdCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgiPyA/ID8/ID8/ID8/PyA/Py8gPz8tIiwgbWVzc2FnZS5jcHBfdHJpZ3JhcGgpCi0KLSAgZGVmIHRlc3RIYXNEZWZhdWx0VmFsdWVzKHNlbGYpOgotICAgIGRlc2MgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IKLQotICAgIGV4cGVjdGVkX2hhc19kZWZhdWx0X2J5X25hbWUgPSB7Ci0gICAgICAgICdvcHRpb25hbF9pbnQzMic6IEZhbHNlLAotICAgICAgICAncmVwZWF0ZWRfaW50MzInOiBGYWxzZSwKLSAgICAgICAgJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJzogRmFsc2UsCi0gICAgICAgICdkZWZhdWx0X2ludDMyJzogVHJ1ZSwKLSAgICB9Ci0KLSAgICBoYXNfZGVmYXVsdF9ieV9uYW1lID0gZGljdCgKLSAgICAgICAgWyhmLm5hbWUsIGYuaGFzX2RlZmF1bHRfdmFsdWUpCi0gICAgICAgICBmb3IgZiBpbiBkZXNjLmZpZWxkcwotICAgICAgICAgaWYgZi5uYW1lIGluIGV4cGVjdGVkX2hhc19kZWZhdWx0X2J5X25hbWVdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXhwZWN0ZWRfaGFzX2RlZmF1bHRfYnlfbmFtZSwgaGFzX2RlZmF1bHRfYnlfbmFtZSkKLQotICBkZWYgdGVzdENvbnRhaW5pbmdUeXBlQmVoYXZpb3JGb3JFeHRlbnNpb25zKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbi5jb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMuREVTQ1JJUFRPUikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlLmNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucy5ERVNDUklQVE9SKQotCi0gIGRlZiB0ZXN0RXh0ZW5zaW9uU2NvcGUoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLmV4dGVuc2lvbl9zY29wZSwKLSAgICAgICAgICAgICAgICAgICAgIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZS5leHRlbnNpb25fc2NvcGUsCi0gICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLkRFU0NSSVBUT1IpCi0KLSAgZGVmIHRlc3RJc0V4dGVuc2lvbihzZWxmKToKLSAgICBzZWxmLmFzc2VydFRydWUodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbi5pc19leHRlbnNpb24pCi0gICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlLmlzX2V4dGVuc2lvbikKLQotICAgIG1lc3NhZ2VfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuREVTQ1JJUFRPUgotICAgIG5vbl9leHRlbnNpb25fZGVzY3JpcHRvciA9IG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHNfYnlfbmFtZVsnYSddCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBub25fZXh0ZW5zaW9uX2Rlc2NyaXB0b3IuaXNfZXh0ZW5zaW9uKQotCi0gIGRlZiB0ZXN0T3B0aW9ucyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uREVTQ1JJUFRPUi5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQpCi0KLSAgZGVmIHRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnMoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9jdXN0b21fb3B0aW9uc19wYjIuVGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9ucygpCi0gICAgZW51bV9vcHRpb25zID0gcHJvdG8uREVTQ1JJUFRPUi5lbnVtX3R5cGVzX2J5X25hbWVbJ0FuRW51bSddLkdldE9wdGlvbnMoKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShlbnVtX29wdGlvbnMgaXMgbm90IE5vbmUpCi0gICAgIyBUT0RPKGdwcyk6IFdlIHJlYWxseSBzaG91bGQgdGVzdCBmb3IgdGhlIHByZXNlbnNlIG9mIHRoZSBlbnVtX29wdDEKLSAgICAjIGV4dGVuc2lvbiBhbmQgZm9yIGl0cyB2YWx1ZSB0byBiZSBzZXQgdG8gLTc4OS4KLQotICBkZWYgdGVzdE5lc3RlZFR5cGVzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKAotICAgICAgICBzZXQodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLm5lc3RlZF90eXBlcyksCi0gICAgICAgIHNldChbCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UuREVTQ1JJUFRPUiwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT3B0aW9uYWxHcm91cC5ERVNDUklQVE9SLAotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLkRFU0NSSVBUT1IsCi0gICAgICAgIF0pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UuREVTQ1JJUFRPUi5uZXN0ZWRfdHlwZXMsIFtdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5ERVNDUklQVE9SLm5lc3RlZF90eXBlcywgW10pCi0KLSAgZGVmIHRlc3RDb250YWluaW5nVHlwZShzZWxmKToKLSAgICBzZWxmLmFzc2VydFRydWUoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlIGlzIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRUcnVlKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlIGlzIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwLkRFU0NSSVBUT1IuY29udGFpbmluZ190eXBlLAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IpCi0KLSAgZGVmIHRlc3RDb250YWluaW5nVHlwZUluRW51bURlc2NyaXB0b3Ioc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRUcnVlKHVuaXR0ZXN0X3BiMi5fRk9SRUlHTkVOVU0uY29udGFpbmluZ190eXBlIGlzIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFU19ORVNURURFTlVNLmNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuREVTQ1JJUFRPUikKLQotICBkZWYgdGVzdFBhY2thZ2Uoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5ERVNDUklQVE9SLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBkZXNjID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlLkRFU0NSSVBUT1IKLSAgICBzZWxmLmFzc2VydEVxdWFsKGRlc2MuZmlsZS5wYWNrYWdlLCAncHJvdG9idWZfdW5pdHRlc3QnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X2ltcG9ydF9wYjIuSW1wb3J0TWVzc2FnZS5ERVNDUklQVE9SLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuX0ZPUkVJR05FTlVNLmZpbGUucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuX1RFU1RBTExUWVBFU19ORVNURURFTlVNLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9pbXBvcnRfcGIyLl9JTVBPUlRFTlVNLmZpbGUucGFja2FnZSwKLSAgICAgICAgJ3Byb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydCcpCi0KLSAgZGVmIHRlc3RFeHRlbnNpb25SYW5nZShzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkRFU0NSSVBUT1IuZXh0ZW5zaW9uX3JhbmdlcywgW10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zLkRFU0NSSVBUT1IuZXh0ZW5zaW9uX3JhbmdlcywKLSAgICAgICAgWygxLCBNQVhfRVhURU5TSU9OKV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RNdWx0aXBsZUV4dGVuc2lvblJhbmdlcy5ERVNDUklQVE9SLmV4dGVuc2lvbl9yYW5nZXMsCi0gICAgICAgIFsoNDIsIDQzKSwgKDQxNDMsIDQyNDQpLCAoNjU1MzYsIE1BWF9FWFRFTlNJT04pXSkKLQotICBkZWYgdGVzdEZpbGVEZXNjcmlwdG9yKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IubmFtZSwKLSAgICAgICAgICAgICAgICAgICAgICdnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkRFU0NSSVBUT1IucGFja2FnZSwgJ3Byb3RvYnVmX3VuaXR0ZXN0JykKLSAgICBzZWxmLmFzc2VydEZhbHNlKHVuaXR0ZXN0X3BiMi5ERVNDUklQVE9SLnNlcmlhbGl6ZWRfcGIgaXMgTm9uZSkKLQotICBkZWYgdGVzdE5vR2VuZXJpY1NlcnZpY2VzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAiVGVzdE1lc3NhZ2UiKSkKLSAgICBzZWxmLmFzc2VydFRydWUoaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgIkZPTyIpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShoYXNhdHRyKHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyLCAidGVzdF9leHRlbnNpb24iKSkKLQotICAgICMgTWFrZSBzdXJlIHVuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXNfcGIyIGhhcyBubyBzZXJ2aWNlcyBzdWJjbGFzc2luZwotICAgICMgUHJvdG8yIFNlcnZpY2UgY2xhc3MuCi0gICAgaWYgaGFzYXR0cih1bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzX3BiMiwgIlRlc3RTZXJ2aWNlIik6Ci0gICAgICBzZWxmLmFzc2VydEZhbHNlKGlzc3ViY2xhc3ModW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlc19wYjIuVGVzdFNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2VydmljZS5TZXJ2aWNlKSkKLQotICBkZWYgdGVzdE1lc3NhZ2VUeXBlc0J5TmFtZShzZWxmKToKLSAgICBmaWxlX3R5cGUgPSB1bml0dGVzdF9wYjIuREVTQ1JJUFRPUgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTLAotICAgICAgICBmaWxlX3R5cGUubWVzc2FnZV90eXBlc19ieV9uYW1lW3VuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTLm5hbWVdKQotCi0gICAgIyBOZXN0ZWQgbWVzc2FnZXMgc2hvdWxkbid0IGJlIGluY2x1ZGVkIGluIHRoZSBtZXNzYWdlX3R5cGVzX2J5X25hbWUKLSAgICAjIGRpY3Rpb25hcnkgKGxpa2UgaW4gdGhlIEMrKyBBUEkpLgotICAgIHNlbGYuYXNzZXJ0RmFsc2UoCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5fVEVTVEFMTFRZUEVTX05FU1RFRE1FU1NBR0UubmFtZSBpbgotICAgICAgICBmaWxlX3R5cGUubWVzc2FnZV90eXBlc19ieV9uYW1lKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfbGlzdGVuZXIucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDEwODAyMzQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbWVzc2FnZV9saXN0ZW5lci5weQorKysgL2Rldi9udWxsCkBAIC0xLDc4ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJEZWZpbmVzIGEgbGlzdGVuZXIgaW50ZXJmYWNlIGZvciBvYnNlcnZpbmcgY2VydGFpbgotc3RhdGUgdHJhbnNpdGlvbnMgb24gTWVzc2FnZSBvYmplY3RzLgotCi1BbHNvIGRlZmluZXMgYSBudWxsIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJmYWNlLgotIiIiCi0KLV9fYXV0aG9yX18gPSAncm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbiknCi0KLQotY2xhc3MgTWVzc2FnZUxpc3RlbmVyKG9iamVjdCk6Ci0KLSAgIiIiTGlzdGVucyBmb3IgbW9kaWZpY2F0aW9ucyBtYWRlIHRvIGEgbWVzc2FnZS4gIE1lYW50IHRvIGJlIHJlZ2lzdGVyZWQgdmlhCi0gIE1lc3NhZ2UuX1NldExpc3RlbmVyKCkuCi0KLSAgQXR0cmlidXRlczoKLSAgICBkaXJ0eTogIElmIFRydWUsIHRoZW4gY2FsbGluZyBNb2RpZmllZCgpIHdvdWxkIGJlIGEgbm8tb3AuICBUaGlzIGNhbiBiZQotICAgICAgICAgICAgdXNlZCB0byBhdm9pZCB0aGVzZSBjYWxscyBlbnRpcmVseSBpbiB0aGUgY29tbW9uIGNhc2UuCi0gICIiIgotCi0gIGRlZiBNb2RpZmllZChzZWxmKToKLSAgICAiIiJDYWxsZWQgZXZlcnkgdGltZSB0aGUgbWVzc2FnZSBpcyBtb2RpZmllZCBpbiBzdWNoIGEgd2F5IHRoYXQgdGhlIHBhcmVudAotICAgIG1lc3NhZ2UgbWF5IG5lZWQgdG8gYmUgdXBkYXRlZC4gIFRoaXMgY3VycmVudGx5IG1lYW5zIGVpdGhlcjoKLSAgICAoYSkgVGhlIG1lc3NhZ2Ugd2FzIG1vZGlmaWVkIGZvciB0aGUgZmlyc3QgdGltZSwgc28gdGhlIHBhcmVudCBtZXNzYWdlCi0gICAgICAgIHNob3VsZCBoZW5jZWZvcnRoIG1hcmsgdGhlIG1lc3NhZ2UgYXMgcHJlc2VudC4KLSAgICAoYikgVGhlIG1lc3NhZ2UncyBjYWNoZWQgYnl0ZSBzaXplIGJlY2FtZSBkaXJ0eSAtLSBpLmUuIHRoZSBtZXNzYWdlIHdhcwotICAgICAgICBtb2RpZmllZCBmb3IgdGhlIGZpcnN0IHRpbWUgYWZ0ZXIgYSBwcmV2aW91cyBjYWxsIHRvIEJ5dGVTaXplKCkuCi0gICAgICAgIFRoZXJlZm9yZSB0aGUgcGFyZW50IHNob3VsZCBhbHNvIG1hcmsgaXRzIGJ5dGUgc2l6ZSBhcyBkaXJ0eS4KLSAgICBOb3RlIHRoYXQgKGEpIGltcGxpZXMgKGIpLCBzaW5jZSBuZXcgb2JqZWN0cyBzdGFydCBvdXQgd2l0aCBhIGNsaWVudCBjYWNoZWQKLSAgICBzaXplICh6ZXJvKS4gIEhvd2V2ZXIsIHdlIGRvY3VtZW50IChhKSBleHBsaWNpdGx5IGJlY2F1c2UgaXQgaXMgaW1wb3J0YW50LgotCi0gICAgTW9kaWZpZWQoKSB3aWxsICpvbmx5KiBiZSBjYWxsZWQgaW4gcmVzcG9uc2UgdG8gb25lIG9mIHRoZXNlIHR3byBldmVudHMgLS0KLSAgICBub3QgZXZlcnkgdGltZSB0aGUgc3ViLW1lc3NhZ2UgaXMgbW9kaWZpZWQuCi0KLSAgICBOb3RlIHRoYXQgaWYgdGhlIGxpc3RlbmVyJ3MgfGRpcnR5fCBhdHRyaWJ1dGUgaXMgdHJ1ZSwgdGhlbiBjYWxsaW5nCi0gICAgTW9kaWZpZWQgYXQgdGhlIG1vbWVudCB3b3VsZCBiZSBhIG5vLW9wLCBzbyBpdCBjYW4gYmUgc2tpcHBlZC4gIFBlcmZvcm1hbmNlLQotICAgIHNlbnNpdGl2ZSBjYWxsZXJzIHNob3VsZCBjaGVjayB0aGlzIGF0dHJpYnV0ZSBkaXJlY3RseSBiZWZvcmUgY2FsbGluZyBzaW5jZQotICAgIGl0IHdpbGwgYmUgdHJ1ZSBtb3N0IG9mIHRoZSB0aW1lLgotICAgICIiIgotCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0KLWNsYXNzIE51bGxNZXNzYWdlTGlzdGVuZXIob2JqZWN0KToKLQotICAiIiJOby1vcCBNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24uIiIiCi0KLSAgZGVmIE1vZGlmaWVkKHNlbGYpOgotICAgIHBhc3MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21lc3NhZ2VfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNjUxNzQzNy4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tZXNzYWdlX3Rlc3QucHkKKysrIC9kZXYvbnVsbApAQCAtMSwzNDMgKzAsMCBAQAotIyEgL3Vzci9iaW4vcHl0aG9uCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVGVzdHMgcHl0aG9uIHByb3RvY29sIGJ1ZmZlcnMgYWdhaW5zdCB0aGUgZ29sZGVuIG1lc3NhZ2UuCi0KLU5vdGUgdGhhdCB0aGUgZ29sZGVuIG1lc3NhZ2VzIGV4ZXJjaXNlIGV2ZXJ5IGtub3duIGZpZWxkIHR5cGUsIHRodXMgdGhpcwotdGVzdCBlbmRzIHVwIGV4ZXJjaXNpbmcgYW5kIHZlcmlmeWluZyBuZWFybHkgYWxsIG9mIHRoZSBwYXJzaW5nIGFuZAotc2VyaWFsaXphdGlvbiBjb2RlIGluIHRoZSB3aG9sZSBsaWJyYXJ5LgotCi1UT0RPKGtlbnRvbik6ICBNZXJnZSB3aXRoIHdpcmVfZm9ybWF0X3Rlc3Q/ICBJdCBkb2Vzbid0IG1ha2UgYSB3aG9sZSBsb3Qgb2YKLXNlbnNlIHRvIGNhbGwgdGhpcyBhIHRlc3Qgb2YgdGhlICJtZXNzYWdlIiBtb2R1bGUsIHdoaWNoIG9ubHkgZGVjbGFyZXMgYW4KLWFic3RyYWN0IGludGVyZmFjZS4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ2dwc0Bnb29nbGUuY29tIChHcmVnb3J5IFAuIFNtaXRoKScKLQotaW1wb3J0IGNvcHkKLWltcG9ydCBtYXRoCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9pbXBvcnRfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgdW5pdHRlc3RfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdGVzdF91dGlsCi0KLSMgUHl0aG9uIHByZS0yLjYgZG9lcyBub3QgaGF2ZSBpc2luZigpIG9yIGlzbmFuKCkgZnVuY3Rpb25zLCBzbyB3ZSBoYXZlCi0jIHRvIHByb3ZpZGUgb3VyIG93bi4KLWRlZiBpc25hbih2YWwpOgotICAjIE5hTiBpcyBuZXZlciBlcXVhbCB0byBpdHNlbGYuCi0gIHJldHVybiB2YWwgIT0gdmFsCi1kZWYgaXNpbmYodmFsKToKLSAgIyBJbmZpbml0eSB0aW1lcyB6ZXJvIGVxdWFscyBOYU4uCi0gIHJldHVybiBub3QgaXNuYW4odmFsKSBhbmQgaXNuYW4odmFsICogMCkKLWRlZiBJc1Bvc0luZih2YWwpOgotICByZXR1cm4gaXNpbmYodmFsKSBhbmQgKHZhbCA+IDApCi1kZWYgSXNOZWdJbmYodmFsKToKLSAgcmV0dXJuIGlzaW5mKHZhbCkgYW5kICh2YWwgPCAwKQotCi1jbGFzcyBNZXNzYWdlVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RHb2xkZW5NZXNzYWdlKHNlbGYpOgotICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9tZXNzYWdlJykucmVhZCgpCi0gICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgdGVzdF91dGlsLkV4cGVjdEFsbEZpZWxkc1NldChzZWxmLCBnb2xkZW5fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKLSAgICBnb2xkZW5fY29weSA9IGNvcHkuZGVlcGNvcHkoZ29sZGVuX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCi0KLSAgZGVmIHRlc3RHb2xkZW5FeHRlbnNpb25zKHNlbGYpOgotICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9tZXNzYWdlJykucmVhZCgpCi0gICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKLSAgICBhbGxfc2V0ID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhhbGxfc2V0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKGFsbF9zZXQsIGdvbGRlbl9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpID09IGdvbGRlbl9kYXRhKQotICAgIGdvbGRlbl9jb3B5ID0gY29weS5kZWVwY29weShnb2xkZW5fbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX2NvcHkuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKLQotICBkZWYgdGVzdEdvbGRlblBhY2tlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgZ29sZGVuX2RhdGEgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZSgnZ29sZGVuX3BhY2tlZF9maWVsZHNfbWVzc2FnZScpLnJlYWQoKQotICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIGFsbF9zZXQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKGFsbF9zZXQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoYWxsX3NldCwgZ29sZGVuX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGFsbF9zZXQuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKLSAgICBnb2xkZW5fY29weSA9IGNvcHkuZGVlcGNvcHkoZ29sZGVuX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCi0KLSAgZGVmIHRlc3RHb2xkZW5QYWNrZWRFeHRlbnNpb25zKHNlbGYpOgotICAgIGdvbGRlbl9kYXRhID0gdGVzdF91dGlsLkdvbGRlbkZpbGUoJ2dvbGRlbl9wYWNrZWRfZmllbGRzX21lc3NhZ2UnKS5yZWFkKCkKLSAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIGFsbF9zZXQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRFeHRlbnNpb25zKGFsbF9zZXQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoYWxsX3NldCwgZ29sZGVuX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGFsbF9zZXQuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKLSAgICBnb2xkZW5fY29weSA9IGNvcHkuZGVlcGNvcHkoZ29sZGVuX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9jb3B5LlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCi0KLSAgZGVmIHRlc3RQb3NpdGl2ZUluZmluaXR5KHNlbGYpOgotICAgIGdvbGRlbl9kYXRhID0gKCdceDVEXHgwMFx4MDBceDgwXHg3RicKLSAgICAgICAgICAgICAgICAgICAnXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjBceDdGJwotICAgICAgICAgICAgICAgICAgICdceENEXHgwMlx4MDBceDAwXHg4MFx4N0YnCi0gICAgICAgICAgICAgICAgICAgJ1x4RDFceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4N0YnKQotICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc1Bvc0luZihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9mbG9hdCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKSkKLSAgICBzZWxmLmFzc2VydFRydWUoSXNQb3NJbmYoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzBdKSkKLSAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKLQotICBkZWYgdGVzdE5lZ2F0aXZlSW5maW5pdHkoc2VsZik6Ci0gICAgZ29sZGVuX2RhdGEgPSAoJ1x4NURceDAwXHgwMFx4ODBceEZGJwotICAgICAgICAgICAgICAgICAgICdceDYxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnCi0gICAgICAgICAgICAgICAgICAgJ1x4Q0RceDAyXHgwMFx4MDBceDgwXHhGRicKLSAgICAgICAgICAgICAgICAgICAnXHhEMVx4MDJceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHhGRicpCi0gICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzTmVnSW5mKGdvbGRlbl9tZXNzYWdlLm9wdGlvbmFsX2Zsb2F0KSkKLSAgICBzZWxmLmFzc2VydFRydWUoSXNOZWdJbmYoZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKSkKLSAgICBzZWxmLmFzc2VydFRydWUoSXNOZWdJbmYoZ29sZGVuX21lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMF0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpID09IGdvbGRlbl9kYXRhKQotCi0gIGRlZiB0ZXN0Tm90QU51bWJlcihzZWxmKToKLSAgICBnb2xkZW5fZGF0YSA9ICgnXHg1RFx4MDBceDAwXHhDMFx4N0YnCi0gICAgICAgICAgICAgICAgICAgJ1x4NjFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEY4XHg3RicKLSAgICAgICAgICAgICAgICAgICAnXHhDRFx4MDJceDAwXHgwMFx4QzBceDdGJwotICAgICAgICAgICAgICAgICAgICdceEQxXHgwMlx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJykKLSAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5vcHRpb25hbF9kb3VibGUpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShpc25hbihnb2xkZW5fbWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzbmFuKGdvbGRlbl9tZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCi0KLSAgZGVmIHRlc3RQb3NpdGl2ZUluZmluaXR5UGFja2VkKHNlbGYpOgotICAgIGdvbGRlbl9kYXRhID0gKCdceEEyXHgwNlx4MDRceDAwXHgwMFx4ODBceDdGJwotICAgICAgICAgICAgICAgICAgICdceEFBXHgwNlx4MDhceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceEYwXHg3RicpCi0gICAgZ29sZGVuX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKLSAgICBnb2xkZW5fbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZ29sZGVuX2RhdGEpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9mbG9hdFswXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKElzUG9zSW5mKGdvbGRlbl9tZXNzYWdlLnBhY2tlZF9kb3VibGVbMF0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShnb2xkZW5fbWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpID09IGdvbGRlbl9kYXRhKQotCi0gIGRlZiB0ZXN0TmVnYXRpdmVJbmZpbml0eVBhY2tlZChzZWxmKToKLSAgICBnb2xkZW5fZGF0YSA9ICgnXHhBMlx4MDZceDA0XHgwMFx4MDBceDgwXHhGRicKLSAgICAgICAgICAgICAgICAgICAnXHhBQVx4MDZceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhGMFx4RkYnKQotICAgIGdvbGRlbl9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgZ29sZGVuX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGdvbGRlbl9kYXRhKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZmxvYXRbMF0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShJc05lZ0luZihnb2xkZW5fbWVzc2FnZS5wYWNrZWRfZG91YmxlWzBdKSkKLSAgICBzZWxmLmFzc2VydFRydWUoZ29sZGVuX21lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSA9PSBnb2xkZW5fZGF0YSkKLQotICBkZWYgdGVzdE5vdEFOdW1iZXJQYWNrZWQoc2VsZik6Ci0gICAgZ29sZGVuX2RhdGEgPSAoJ1x4QTJceDA2XHgwNFx4MDBceDAwXHhDMFx4N0YnCi0gICAgICAgICAgICAgICAgICAgJ1x4QUFceDA2XHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4RjhceDdGJykKLSAgICBnb2xkZW5fbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIGdvbGRlbl9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhnb2xkZW5fZGF0YSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2UucGFja2VkX2Zsb2F0WzBdKSkKLSAgICBzZWxmLmFzc2VydFRydWUoaXNuYW4oZ29sZGVuX21lc3NhZ2UucGFja2VkX2RvdWJsZVswXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGdvbGRlbl9tZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkgPT0gZ29sZGVuX2RhdGEpCi0KLSAgZGVmIHRlc3RFeHRyZW1lRmxvYXRWYWx1ZXMoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotCi0gICAgIyBNb3N0IHBvc2l0aXZlIGV4cG9uZW50LCBubyBzaWduaWZpY2FuZCBiaXRzIHNldC4KLSAgICBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzID0gbWF0aC5wb3coMiwgMTI3KQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IGtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMpCi0KLSAgICAjIE1vc3QgcG9zaXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgotICAgIGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAxMjcpCi0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgPT0ga01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdCkKLQotICAgICMgUmVwZWF0IGxhc3QgdHdvIGNhc2VzIHdpdGggdmFsdWVzIG9mIHNhbWUgbWFnbml0dWRlLCBidXQgbmVnYXRpdmUuCi0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQotCi0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdFBvc0V4cG9uZW50T25lU2lnQml0Ci0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdFBvc0V4cG9uZW50T25lU2lnQml0KQotCi0gICAgIyBNb3N0IG5lZ2F0aXZlIGV4cG9uZW50LCBubyBzaWduaWZpY2FuZCBiaXRzIHNldC4KLSAgICBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzID0gbWF0aC5wb3coMiwgLTEyNykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0ga01vc3ROZWdFeHBvbmVudE5vU2lnQml0cwotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSBrTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzKQotCi0gICAgIyBNb3N0IG5lZ2F0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KLSAgICBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgLTEyNykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID0ga01vc3ROZWdFeHBvbmVudE9uZVNpZ0JpdAotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9PSBrTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQotCi0gICAgIyBSZXBlYXQgbGFzdCB0d28gY2FzZXMgd2l0aCB2YWx1ZXMgb2YgdGhlIHNhbWUgbWFnbml0dWRlLCBidXQgbmVnYXRpdmUuCi0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzKQotCi0gICAgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCA9IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0Ci0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ID09IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQotCi0gIGRlZiB0ZXN0RXh0cmVtZUZsb2F0VmFsdWVzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgICMgTW9zdCBwb3NpdGl2ZSBleHBvbmVudCwgbm8gc2lnbmlmaWNhbmQgYml0cyBzZXQuCi0gICAga01vc3RQb3NFeHBvbmVudE5vU2lnQml0cyA9IG1hdGgucG93KDIsIDEwMjMpCi0gICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSBrTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQotCi0gICAgIyBNb3N0IHBvc2l0aXZlIGV4cG9uZW50LCBvbmUgc2lnbmlmaWNhbmQgYml0IHNldC4KLSAgICBrTW9zdFBvc0V4cG9uZW50T25lU2lnQml0ID0gMS41ICogbWF0aC5wb3coMiwgMTAyMykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiBzYW1lIG1hZ25pdHVkZSwgYnV0IG5lZ2F0aXZlLgotICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0UG9zRXhwb25lbnROb1NpZ0JpdHMKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdFBvc0V4cG9uZW50Tm9TaWdCaXRzKQotCi0gICAgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPSAta01vc3RQb3NFeHBvbmVudE9uZVNpZ0JpdAotICAgIG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgICBzZWxmLmFzc2VydFRydWUobWVzc2FnZS5vcHRpb25hbF9kb3VibGUgPT0gLWtNb3N0UG9zRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG5vIHNpZ25pZmljYW5kIGJpdHMgc2V0LgotICAgIGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMgPSBtYXRoLnBvdygyLCAtMTAyMykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnROb1NpZ0JpdHMpCi0KLSAgICAjIE1vc3QgbmVnYXRpdmUgZXhwb25lbnQsIG9uZSBzaWduaWZpY2FuZCBiaXQgc2V0LgotICAgIGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQgPSAxLjUgKiBtYXRoLnBvdygyLCAtMTAyMykKLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IGtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQpCi0KLSAgICAjIFJlcGVhdCBsYXN0IHR3byBjYXNlcyB3aXRoIHZhbHVlcyBvZiB0aGUgc2FtZSBtYWduaXR1ZGUsIGJ1dCBuZWdhdGl2ZS4KLSAgICBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9IC1rTW9zdE5lZ0V4cG9uZW50Tm9TaWdCaXRzCi0gICAgbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSA9PSAta01vc3ROZWdFeHBvbmVudE5vU2lnQml0cykKLQotICAgIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID0gLWtNb3N0TmVnRXhwb25lbnRPbmVTaWdCaXQKLSAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhtZXNzYWdlLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlID09IC1rTW9zdE5lZ0V4cG9uZW50T25lU2lnQml0KQotCi0gIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkU2NhbGFyRmllbGRzRGVmYXVsdENvbXBhcmF0b3Ioc2VsZik6Ci0gICAgIiIiQ2hlY2sgc29tZSBkaWZmZXJlbnQgdHlwZXMgd2l0aCB0aGUgZGVmYXVsdCBjb21wYXJhdG9yLiIiIgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgICMgVE9ETyhtYXR0cCk6IHdvdWxkIHRlc3RpbmcgbW9yZSBzY2FsYXIgdHlwZXMgc3RyZW5ndGhlbiB0ZXN0PwotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzBdLCAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlsxXSwgMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMl0sIDMpCi0KLSAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LmFwcGVuZCgxLjEpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMS4zKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQuYXBwZW5kKDEuMikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0LnNvcnQoKQotICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFswXSwgMS4xKQotICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsxXSwgMS4yKQotICAgIHNlbGYuYXNzZXJ0QWxtb3N0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9mbG9hdFsyXSwgMS4zKQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdhJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ2MnKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYicpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSwgJ2EnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMV0sICdiJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzJdLCAnYycpCi0KLSAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLmFwcGVuZCgnYScpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoJ2MnKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKCdiJykKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzLnNvcnQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1swXSwgJ2EnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1sxXSwgJ2InKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9ieXRlc1syXSwgJ2MnKQotCi0gIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkU2NhbGFyRmllbGRzQ3VzdG9tQ29tcGFyYXRvcihzZWxmKToKLSAgICAiIiJDaGVjayBzb21lIGRpZmZlcmVudCB0eXBlcyB3aXRoIGN1c3RvbSBjb21wYXJhdG9yLiIiIgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0zKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0yKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKC0xKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuc29ydChsYW1iZGEgeCx5OiBjbXAoYWJzKHgpLCBhYnMoeSkpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9pbnQzMlswXSwgLTEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzFdLCAtMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJbMl0sIC0zKQotCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdhYWEnKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYmInKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnYycpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuc29ydChsYW1iZGEgeCx5OiBjbXAobGVuKHgpLCBsZW4oeSkpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0sICdjJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzFdLCAnYmInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMl0sICdhYWEnKQotCi0gIGRlZiB0ZXN0U29ydGluZ1JlcGVhdGVkQ29tcG9zaXRlRmllbGRzQ3VzdG9tQ29tcGFyYXRvcihzZWxmKToKLSAgICAiIiJDaGVjayBwYXNzaW5nIGEgY3VzdG9tIGNvbXBhcmF0b3IgdG8gc29ydCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4iIiIKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gMQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpLmJiID0gNgotICAgIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSA1Ci0gICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDQKLSAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLnNvcnQobGFtYmRhIHgseTogY21wKHguYmIsIHkuYmIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYiwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIsIDIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdLmJiLCAzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVszXS5iYiwgNCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbNF0uYmIsIDUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzVdLmJiLCA2KQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCBlMmQ5NzAxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL21vcmVfZXh0ZW5zaW9ucy5wcm90bworKysgL2Rldi9udWxsCkBAIC0xLDU4ICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKLQotCi1wYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbDsKLQotCi1tZXNzYWdlIFRvcExldmVsTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIEV4dGVuZGVkTWVzc2FnZSBzdWJtZXNzYWdlID0gMTsKLX0KLQotCi1tZXNzYWdlIEV4dGVuZGVkTWVzc2FnZSB7Ci0gIGV4dGVuc2lvbnMgMSB0byBtYXg7Ci19Ci0KLQotbWVzc2FnZSBGb3JlaWduTWVzc2FnZSB7Ci0gIG9wdGlvbmFsIGludDMyIGZvcmVpZ25fbWVzc2FnZV9pbnQgPSAxOwotfQotCi0KLWV4dGVuZCBFeHRlbmRlZE1lc3NhZ2UgewotICBvcHRpb25hbCBpbnQzMiBvcHRpb25hbF9pbnRfZXh0ZW5zaW9uID0gMTsKLSAgb3B0aW9uYWwgRm9yZWlnbk1lc3NhZ2Ugb3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24gPSAyOwotCi0gIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludF9leHRlbnNpb24gPSAzOwotICByZXBlYXRlZCBGb3JlaWduTWVzc2FnZSByZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbiA9IDQ7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9tZXNzYWdlcy5wcm90bwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYzcwMWI0NC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvCisrKyAvZGV2L251bGwKQEAgLTEsNTEgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiByb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKQotCi0KLXBhY2thZ2UgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsOwotCi0vLyBBIG1lc3NhZ2Ugd2hlcmUgdGFnIG51bWJlcnMgYXJlIGxpc3RlZCBvdXQgb2Ygb3JkZXIsIHRvIGFsbG93IHVzIHRvIHRlc3Qgb3VyCi0vLyBjYW5vbmljYWxpemF0aW9uIG9mIHNlcmlhbGl6ZWQgb3V0cHV0LCB3aGljaCBzaG91bGQgYWx3YXlzIGJlIGluIHRhZyBvcmRlci4KLS8vIFdlIGFsc28gbWl4IGluIHNvbWUgZXh0ZW5zaW9ucyBmb3IgZXh0cmEgZnVuLgotbWVzc2FnZSBPdXRPZk9yZGVyRmllbGRzIHsKLSAgb3B0aW9uYWwgICBzaW50MzIgb3B0aW9uYWxfc2ludDMyICAgPSAgNTsKLSAgZXh0ZW5zaW9ucyA0IHRvIDQ7Ci0gIG9wdGlvbmFsICAgdWludDMyIG9wdGlvbmFsX3VpbnQzMiAgID0gIDM7Ci0gIGV4dGVuc2lvbnMgMiB0byAyOwotICBvcHRpb25hbCAgICBpbnQzMiBvcHRpb25hbF9pbnQzMiAgICA9ICAxOwotfTsKLQotCi1leHRlbmQgT3V0T2ZPcmRlckZpZWxkcyB7Ci0gIG9wdGlvbmFsICAgdWludDY0IG9wdGlvbmFsX3VpbnQ2NCAgID0gIDQ7Ci0gIG9wdGlvbmFsICAgIGludDY0IG9wdGlvbmFsX2ludDY0ICAgID0gIDI7Ci19CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9weXRob25fbWVzc2FnZS5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3B5dGhvbl9tZXNzYWdlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCA2NmZjYTkxLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3B5dGhvbl9tZXNzYWdlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTA5OCArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIyBUaGlzIGNvZGUgaXMgbWVhbnQgdG8gd29yayBvbiBQeXRob24gMi40IGFuZCBhYm92ZSBvbmx5LgotIwotIyBUT0RPKHJvYmluc29uKTogSGVscGVycyBmb3IgdmVyYm9zZSwgY29tbW9uIGNoZWNrcyBsaWtlIHNlZWluZyBpZiBhCi0jIGRlc2NyaXB0b3IncyBjcHBfdHlwZSBpcyBDUFBUWVBFX01FU1NBR0UuCi0KLSIiIkNvbnRhaW5zIGEgbWV0YWNsYXNzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgdG8gY3JlYXRlCi1wcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZnJvbSBEZXNjcmlwdG9yIG9iamVjdHMgYXQgcnVudGltZS4KLQotUmVjYWxsIHRoYXQgYSBtZXRhY2xhc3MgaXMgdGhlICJ0eXBlIiBvZiBhIGNsYXNzLgotKEEgY2xhc3MgaXMgdG8gYSBtZXRhY2xhc3Mgd2hhdCBhbiBpbnN0YW5jZSBpcyB0byBhIGNsYXNzLikKLQotSW4gdGhpcyBjYXNlLCB3ZSB1c2UgdGhlIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgbWV0YWNsYXNzCi10byBpbmplY3QgYWxsIHRoZSB1c2VmdWwgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBjbGFzc2VzCi1vdXRwdXQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyIGF0IGNvbXBpbGUtdGltZS4KLQotVGhlIHVwc2hvdCBvZiBhbGwgdGhpcyBpcyB0aGF0IHRoZSByZWFsIGltcGxlbWVudGF0aW9uCi1kZXRhaWxzIGZvciBBTEwgcHVyZS1QeXRob24gcHJvdG9jb2wgYnVmZmVycyBhcmUgKmhlcmUgaW4KLXRoaXMgZmlsZSouCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotdHJ5OgotICBmcm9tIGNTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWV4Y2VwdCBJbXBvcnRFcnJvcjoKLSAgZnJvbSBTdHJpbmdJTyBpbXBvcnQgU3RyaW5nSU8KLWltcG9ydCBzdHJ1Y3QKLWltcG9ydCB3ZWFrcmVmCi0KLSMgV2UgdXNlICJhcyIgdG8gYXZvaWQgbmFtZSBjb2xsaXNpb25zIHdpdGggdmFyaWFibGVzLgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGNvbnRhaW5lcnMKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZWNvZGVyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZW5jb2RlcgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1lc3NhZ2VfbGlzdGVuZXIgYXMgbWVzc2FnZV9saXN0ZW5lcl9tb2QKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0eXBlX2NoZWNrZXJzCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBkZXNjcmlwdG9yIGFzIGRlc2NyaXB0b3JfbW9kCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBtZXNzYWdlX21vZAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHRleHRfZm9ybWF0Ci0KLV9GaWVsZERlc2NyaXB0b3IgPSBkZXNjcmlwdG9yX21vZC5GaWVsZERlc2NyaXB0b3IKLQotCi1kZWYgTmV3TWVzc2FnZShkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KToKLSAgX0FkZENsYXNzQXR0cmlidXRlc0Zvck5lc3RlZEV4dGVuc2lvbnMoZGVzY3JpcHRvciwgZGljdGlvbmFyeSkKLSAgX0FkZFNsb3RzKGRlc2NyaXB0b3IsIGRpY3Rpb25hcnkpCi0KLQotZGVmIEluaXRNZXNzYWdlKGRlc2NyaXB0b3IsIGNscyk6Ci0gIGNscy5fZGVjb2RlcnNfYnlfdGFnID0ge30KLSAgY2xzLl9leHRlbnNpb25zX2J5X25hbWUgPSB7fQotICBjbHMuX2V4dGVuc2lvbnNfYnlfbnVtYmVyID0ge30KLSAgaWYgKGRlc2NyaXB0b3IuaGFzX29wdGlvbnMgYW5kCi0gICAgICBkZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCk6Ci0gICAgY2xzLl9kZWNvZGVyc19ieV90YWdbZGVjb2Rlci5NRVNTQUdFX1NFVF9JVEVNX1RBR10gPSAoCi0gICAgICAgIGRlY29kZXIuTWVzc2FnZVNldEl0ZW1EZWNvZGVyKGNscy5fZXh0ZW5zaW9uc19ieV9udW1iZXIpKQotCi0gICMgQXR0YWNoIHN0dWZmIHRvIGVhY2ggRmllbGREZXNjcmlwdG9yIGZvciBxdWljayBsb29rdXAgbGF0ZXIgb24uCi0gIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKLSAgICBfQXR0YWNoRmllbGRIZWxwZXJzKGNscywgZmllbGQpCi0KLSAgX0FkZEVudW1WYWx1ZXMoZGVzY3JpcHRvciwgY2xzKQotICBfQWRkSW5pdE1ldGhvZChkZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRQcm9wZXJ0aWVzRm9yRmllbGRzKGRlc2NyaXB0b3IsIGNscykKLSAgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKGRlc2NyaXB0b3IsIGNscykKLSAgX0FkZFN0YXRpY01ldGhvZHMoY2xzKQotICBfQWRkTWVzc2FnZU1ldGhvZHMoZGVzY3JpcHRvciwgY2xzKQotICBfQWRkUHJpdmF0ZUhlbHBlck1ldGhvZHMoY2xzKQotCi0KLSMgU3RhdGVsZXNzIGhlbHBlcnMgZm9yIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgYmVsb3cuCi0jIE91dHNpZGUgY2xpZW50cyBzaG91bGQgbm90IGFjY2VzcyB0aGVzZSBkaXJlY3RseS4KLSMKLSMgSSBvcHRlZCBub3QgdG8gbWFrZSBhbnkgb2YgdGhlc2UgbWV0aG9kcyBvbiB0aGUgbWV0YWNsYXNzLCB0byBtYWtlIGl0IG1vcmUKLSMgY2xlYXIgdGhhdCBJJ20gbm90IHJlYWxseSB1c2luZyBhbnkgc3RhdGUgdGhlcmUgYW5kIHRvIGtlZXAgY2xpZW50cyBmcm9tCi0jIHRoaW5raW5nIHRoYXQgdGhleSBoYXZlIGRpcmVjdCBhY2Nlc3MgdG8gdGhlc2UgY29uc3RydWN0aW9uIGhlbHBlcnMuCi0KLQotZGVmIF9Qcm9wZXJ0eU5hbWUocHJvdG9fZmllbGRfbmFtZSk6Ci0gICIiIlJldHVybnMgdGhlIG5hbWUgb2YgdGhlIHB1YmxpYyBwcm9wZXJ0eSBhdHRyaWJ1dGUgd2hpY2gKLSAgY2xpZW50cyBjYW4gdXNlIHRvIGdldCBhbmQgKGluIHNvbWUgY2FzZXMpIHNldCB0aGUgdmFsdWUKLSAgb2YgYSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgotCi0gIEFyZ3M6Ci0gICAgcHJvdG9fZmllbGRfbmFtZTogVGhlIHByb3RvY29sIG1lc3NhZ2UgZmllbGQgbmFtZSwgZXhhY3RseQotICAgICAgYXMgaXQgYXBwZWFycyAob3Igd291bGQgYXBwZWFyKSBpbiBhIC5wcm90byBmaWxlLgotICAiIiIKLSAgIyBUT0RPKHJvYmluc29uKTogRXNjYXBlIFB5dGhvbiBrZXl3b3JkcyAoZS5nLiwgeWllbGQpLCBhbmQgdGVzdCB0aGlzIHN1cHBvcnQuCi0gICMgbm5vcndpdHogbWFrZXMgbXkgZGF5IGJ5IHdyaXRpbmc6Ci0gICMgIiIiCi0gICMgRllJLiAgU2VlIHRoZSBrZXl3b3JkIG1vZHVsZSBpbiB0aGUgc3RkbGliLiBUaGlzIGNvdWxkIGJlIGFzIHNpbXBsZSBhczoKLSAgIwotICAjIGlmIGtleXdvcmQuaXNrZXl3b3JkKHByb3RvX2ZpZWxkX25hbWUpOgotICAjICAgcmV0dXJuIHByb3RvX2ZpZWxkX25hbWUgKyAiXyIKLSAgIyByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQotICAjICIiIgotICAjIEtlbnRvbiBzYXlzOiAgVGhlIGFib3ZlIGlzIGEgQkFEIElERUEuICBQZW9wbGUgcmVseSBvbiBiZWluZyBhYmxlIHRvIHVzZQotICAjICAgZ2V0YXR0cigpIGFuZCBzZXRhdHRyKCkgdG8gcmVmbGVjdGl2ZWx5IG1hbmlwdWxhdGUgZmllbGQgdmFsdWVzLiAgSWYgd2UKLSAgIyAgIHJlbmFtZSB0aGUgcHJvcGVydGllcywgdGhlbiBldmVyeSBzdWNoIHVzZXIgaGFzIHRvIGFsc28gbWFrZSBzdXJlIHRvIGFwcGx5Ci0gICMgICB0aGUgc2FtZSB0cmFuc2Zvcm1hdGlvbi4gIE5vdGUgdGhhdCBjdXJyZW50bHkgaWYgeW91IG5hbWUgYSBmaWVsZCAieWllbGQiLAotICAjICAgeW91IGNhbiBzdGlsbCBhY2Nlc3MgaXQganVzdCBmaW5lIHVzaW5nIGdldGF0dHIvc2V0YXR0ciAtLSBpdCdzIG5vdCBldmVuCi0gICMgICB0aGF0IGN1bWJlcnNvbWUgdG8gZG8gc28uCi0gICMgVE9ETyhrZW50b24pOiAgUmVtb3ZlIHRoaXMgbWV0aG9kIGVudGlyZWx5IGlmL3doZW4gZXZlcnlvbmUgYWdyZWVzIHdpdGggbXkKLSAgIyAgIHBvc2l0aW9uLgotICByZXR1cm4gcHJvdG9fZmllbGRfbmFtZQotCi0KLWRlZiBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKG1lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpOgotICAiIiJWZXJpZnkgdGhhdCB0aGUgZ2l2ZW4gZXh0ZW5zaW9uIGhhbmRsZSBpcyB2YWxpZC4iIiIKLQotICBpZiBub3QgaXNpbnN0YW5jZShleHRlbnNpb25faGFuZGxlLCBfRmllbGREZXNjcmlwdG9yKToKLSAgICByYWlzZSBLZXlFcnJvcignSGFzRXh0ZW5zaW9uKCkgZXhwZWN0cyBhbiBleHRlbnNpb24gaGFuZGxlLCBnb3Q6ICVzJyAlCi0gICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZSkKLQotICBpZiBub3QgZXh0ZW5zaW9uX2hhbmRsZS5pc19leHRlbnNpb246Ci0gICAgcmFpc2UgS2V5RXJyb3IoJyIlcyIgaXMgbm90IGFuIGV4dGVuc2lvbi4nICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCi0KLSAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5jb250YWluaW5nX3R5cGUgaXMgbm90IG1lc3NhZ2UuREVTQ1JJUFRPUjoKLSAgICByYWlzZSBLZXlFcnJvcignRXh0ZW5zaW9uICIlcyIgZXh0ZW5kcyBtZXNzYWdlIHR5cGUgIiVzIiwgYnV0IHRoaXMgJwotICAgICAgICAgICAgICAgICAgICdtZXNzYWdlIGlzIG9mIHR5cGUgIiVzIi4nICUKLSAgICAgICAgICAgICAgICAgICAoZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUsCi0gICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY29udGFpbmluZ190eXBlLmZ1bGxfbmFtZSwKLSAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5ERVNDUklQVE9SLmZ1bGxfbmFtZSkpCi0KLQotZGVmIF9BZGRTbG90cyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGRpY3Rpb25hcnkpOgotICAiIiJBZGRzIGEgX19zbG90c19fIGVudHJ5IHRvIGRpY3Rpb25hcnksIGNvbnRhaW5pbmcgdGhlIG5hbWVzIG9mIGFsbCB2YWxpZAotICBhdHRyaWJ1dGVzIGZvciB0aGlzIG1lc3NhZ2UgdHlwZS4KLQotICBBcmdzOgotICAgIG1lc3NhZ2VfZGVzY3JpcHRvcjogQSBEZXNjcmlwdG9yIGluc3RhbmNlIGRlc2NyaWJpbmcgdGhpcyBtZXNzYWdlIHR5cGUuCi0gICAgZGljdGlvbmFyeTogQ2xhc3MgZGljdGlvbmFyeSB0byB3aGljaCB3ZSdsbCBhZGQgYSAnX19zbG90c19fJyBlbnRyeS4KLSAgIiIiCi0gIGRpY3Rpb25hcnlbJ19fc2xvdHNfXyddID0gWydfY2FjaGVkX2J5dGVfc2l6ZScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eScsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfZmllbGRzJywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJ19pc19wcmVzZW50X2luX3BhcmVudCcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfbGlzdGVuZXInLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAnX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbicsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICdfX3dlYWtyZWZfXyddCi0KLQotZGVmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGQpOgotICByZXR1cm4gKGZpZWxkLmlzX2V4dGVuc2lvbiBhbmQKLSAgICAgICAgICBmaWVsZC5jb250YWluaW5nX3R5cGUuaGFzX29wdGlvbnMgYW5kCi0gICAgICAgICAgZmllbGQuY29udGFpbmluZ190eXBlLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCBhbmQKLSAgICAgICAgICBmaWVsZC50eXBlID09IF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFIGFuZAotICAgICAgICAgIGZpZWxkLm1lc3NhZ2VfdHlwZSA9PSBmaWVsZC5leHRlbnNpb25fc2NvcGUgYW5kCi0gICAgICAgICAgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9PUFRJT05BTCkKLQotCi1kZWYgX0F0dGFjaEZpZWxkSGVscGVycyhjbHMsIGZpZWxkX2Rlc2NyaXB0b3IpOgotICBpc19yZXBlYXRlZCA9IChmaWVsZF9kZXNjcmlwdG9yLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQpCi0gIGlzX3BhY2tlZCA9IChmaWVsZF9kZXNjcmlwdG9yLmhhc19vcHRpb25zIGFuZAotICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5HZXRPcHRpb25zKCkucGFja2VkKQotCi0gIGlmIF9Jc01lc3NhZ2VTZXRFeHRlbnNpb24oZmllbGRfZGVzY3JpcHRvcik6Ci0gICAgZmllbGRfZW5jb2RlciA9IGVuY29kZXIuTWVzc2FnZVNldEl0ZW1FbmNvZGVyKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyKQotICAgIHNpemVyID0gZW5jb2Rlci5NZXNzYWdlU2V0SXRlbVNpemVyKGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyKQotICBlbHNlOgotICAgIGZpZWxkX2VuY29kZXIgPSB0eXBlX2NoZWNrZXJzLlRZUEVfVE9fRU5DT0RFUltmaWVsZF9kZXNjcmlwdG9yLnR5cGVdKAotICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCkKLSAgICBzaXplciA9IHR5cGVfY2hlY2tlcnMuVFlQRV9UT19TSVpFUltmaWVsZF9kZXNjcmlwdG9yLnR5cGVdKAotICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgaXNfcmVwZWF0ZWQsIGlzX3BhY2tlZCkKLQotICBmaWVsZF9kZXNjcmlwdG9yLl9lbmNvZGVyID0gZmllbGRfZW5jb2RlcgotICBmaWVsZF9kZXNjcmlwdG9yLl9zaXplciA9IHNpemVyCi0gIGZpZWxkX2Rlc2NyaXB0b3IuX2RlZmF1bHRfY29uc3RydWN0b3IgPSBfRGVmYXVsdFZhbHVlQ29uc3RydWN0b3JGb3JGaWVsZCgKLSAgICAgIGZpZWxkX2Rlc2NyaXB0b3IpCi0KLSAgZGVmIEFkZERlY29kZXIod2lyZXR5cGUsIGlzX3BhY2tlZCk6Ci0gICAgdGFnX2J5dGVzID0gZW5jb2Rlci5UYWdCeXRlcyhmaWVsZF9kZXNjcmlwdG9yLm51bWJlciwgd2lyZXR5cGUpCi0gICAgY2xzLl9kZWNvZGVyc19ieV90YWdbdGFnX2J5dGVzXSA9ICgKLSAgICAgICAgdHlwZV9jaGVja2Vycy5UWVBFX1RPX0RFQ09ERVJbZmllbGRfZGVzY3JpcHRvci50eXBlXSgKLSAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3IubnVtYmVyLCBpc19yZXBlYXRlZCwgaXNfcGFja2VkLAotICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvciwgZmllbGRfZGVzY3JpcHRvci5fZGVmYXVsdF9jb25zdHJ1Y3RvcikpCi0KLSAgQWRkRGVjb2Rlcih0eXBlX2NoZWNrZXJzLkZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFW2ZpZWxkX2Rlc2NyaXB0b3IudHlwZV0sCi0gICAgICAgICAgICAgRmFsc2UpCi0KLSAgaWYgaXNfcmVwZWF0ZWQgYW5kIHdpcmVfZm9ybWF0LklzVHlwZVBhY2thYmxlKGZpZWxkX2Rlc2NyaXB0b3IudHlwZSk6Ci0gICAgIyBUbyBzdXBwb3J0IHdpcmUgY29tcGF0aWJpbGl0eSBvZiBhZGRpbmcgcGFja2VkID0gdHJ1ZSwgYWRkIGEgZGVjb2RlciBmb3IKLSAgICAjIHBhY2tlZCB2YWx1ZXMgcmVnYXJkbGVzcyBvZiB0aGUgZmllbGQncyBvcHRpb25zLgotICAgIEFkZERlY29kZXIod2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgVHJ1ZSkKLQotCi1kZWYgX0FkZENsYXNzQXR0cmlidXRlc0Zvck5lc3RlZEV4dGVuc2lvbnMoZGVzY3JpcHRvciwgZGljdGlvbmFyeSk6Ci0gIGV4dGVuc2lvbl9kaWN0ID0gZGVzY3JpcHRvci5leHRlbnNpb25zX2J5X25hbWUKLSAgZm9yIGV4dGVuc2lvbl9uYW1lLCBleHRlbnNpb25fZmllbGQgaW4gZXh0ZW5zaW9uX2RpY3QuaXRlcml0ZW1zKCk6Ci0gICAgYXNzZXJ0IGV4dGVuc2lvbl9uYW1lIG5vdCBpbiBkaWN0aW9uYXJ5Ci0gICAgZGljdGlvbmFyeVtleHRlbnNpb25fbmFtZV0gPSBleHRlbnNpb25fZmllbGQKLQotCi1kZWYgX0FkZEVudW1WYWx1ZXMoZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiU2V0cyBjbGFzcy1sZXZlbCBhdHRyaWJ1dGVzIGZvciBhbGwgZW51bSBmaWVsZHMgZGVmaW5lZCBpbiB0aGlzIG1lc3NhZ2UuCi0KLSAgQXJnczoKLSAgICBkZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9iamVjdCBmb3IgdGhpcyBtZXNzYWdlIHR5cGUuCi0gICAgY2xzOiBDbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcgZm9yIHRoaXMgbWVzc2FnZSB0eXBlLgotICAiIiIKLSAgZm9yIGVudW1fdHlwZSBpbiBkZXNjcmlwdG9yLmVudW1fdHlwZXM6Ci0gICAgZm9yIGVudW1fdmFsdWUgaW4gZW51bV90eXBlLnZhbHVlczoKLSAgICAgIHNldGF0dHIoY2xzLCBlbnVtX3ZhbHVlLm5hbWUsIGVudW1fdmFsdWUubnVtYmVyKQotCi0KLWRlZiBfRGVmYXVsdFZhbHVlQ29uc3RydWN0b3JGb3JGaWVsZChmaWVsZCk6Ci0gICIiIlJldHVybnMgYSBmdW5jdGlvbiB3aGljaCByZXR1cm5zIGEgZGVmYXVsdCB2YWx1ZSBmb3IgYSBmaWVsZC4KLQotICBBcmdzOgotICAgIGZpZWxkOiBGaWVsZERlc2NyaXB0b3Igb2JqZWN0IGZvciB0aGlzIGZpZWxkLgotCi0gIFRoZSByZXR1cm5lZCBmdW5jdGlvbiBoYXMgb25lIGFyZ3VtZW50OgotICAgIG1lc3NhZ2U6IE1lc3NhZ2UgaW5zdGFuY2UgY29udGFpbmluZyB0aGlzIGZpZWxkLCBvciBhIHdlYWtyZWYgcHJveHkKLSAgICAgIG9mIHNhbWUuCi0KLSAgVGhhdCBmdW5jdGlvbiBpbiB0dXJuIHJldHVybnMgYSBkZWZhdWx0IHZhbHVlIGZvciB0aGlzIGZpZWxkLiAgVGhlIGRlZmF1bHQKLSAgICB2YWx1ZSBtYXkgcmVmZXIgYmFjayB0byB8bWVzc2FnZXwgdmlhIGEgd2VhayByZWZlcmVuY2UuCi0gICIiIgotCi0gIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgaWYgZmllbGQuZGVmYXVsdF92YWx1ZSAhPSBbXToKLSAgICAgIHJhaXNlIFZhbHVlRXJyb3IoJ1JlcGVhdGVkIGZpZWxkIGRlZmF1bHQgdmFsdWUgbm90IGVtcHR5IGxpc3Q6ICVzJyAlICgKLSAgICAgICAgICBmaWVsZC5kZWZhdWx0X3ZhbHVlKSkKLSAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICMgV2UgY2FuJ3QgbG9vayBhdCBfY29uY3JldGVfY2xhc3MgeWV0IHNpbmNlIGl0IG1pZ2h0IG5vdCBoYXZlCi0gICAgICAjIGJlZW4gc2V0LiAgKERlcGVuZHMgb24gb3JkZXIgaW4gd2hpY2ggd2UgaW5pdGlhbGl6ZSB0aGUgY2xhc3NlcykuCi0gICAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKLSAgICAgIGRlZiBNYWtlUmVwZWF0ZWRNZXNzYWdlRGVmYXVsdChtZXNzYWdlKToKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRDb21wb3NpdGVGaWVsZENvbnRhaW5lcigKLSAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgZmllbGQubWVzc2FnZV90eXBlKQotICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZE1lc3NhZ2VEZWZhdWx0Ci0gICAgZWxzZToKLSAgICAgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoZmllbGQuY3BwX3R5cGUsIGZpZWxkLnR5cGUpCi0gICAgICBkZWYgTWFrZVJlcGVhdGVkU2NhbGFyRGVmYXVsdChtZXNzYWdlKToKLSAgICAgICAgcmV0dXJuIGNvbnRhaW5lcnMuUmVwZWF0ZWRTY2FsYXJGaWVsZENvbnRhaW5lcigKLSAgICAgICAgICAgIG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbiwgdHlwZV9jaGVja2VyKQotICAgICAgcmV0dXJuIE1ha2VSZXBlYXRlZFNjYWxhckRlZmF1bHQKLQotICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAjIF9jb25jcmV0ZV9jbGFzcyBtYXkgbm90IHlldCBiZSBpbml0aWFsaXplZC4KLSAgICBtZXNzYWdlX3R5cGUgPSBmaWVsZC5tZXNzYWdlX3R5cGUKLSAgICBkZWYgTWFrZVN1Yk1lc3NhZ2VEZWZhdWx0KG1lc3NhZ2UpOgotICAgICAgcmVzdWx0ID0gbWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpCi0gICAgICByZXN1bHQuX1NldExpc3RlbmVyKG1lc3NhZ2UuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbikKLSAgICAgIHJldHVybiByZXN1bHQKLSAgICByZXR1cm4gTWFrZVN1Yk1lc3NhZ2VEZWZhdWx0Ci0KLSAgZGVmIE1ha2VTY2FsYXJEZWZhdWx0KG1lc3NhZ2UpOgotICAgIHJldHVybiBmaWVsZC5kZWZhdWx0X3ZhbHVlCi0gIHJldHVybiBNYWtlU2NhbGFyRGVmYXVsdAotCi0KLWRlZiBfQWRkSW5pdE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkFkZHMgYW4gX19pbml0X18gbWV0aG9kIHRvIGNscy4iIiIKLSAgZmllbGRzID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkcwotICBkZWYgaW5pdChzZWxmLCAqKmt3YXJncyk6Ci0gICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZSA9IDAKLSAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5ID0gbGVuKGt3YXJncykgPiAwCi0gICAgc2VsZi5fZmllbGRzID0ge30KLSAgICBzZWxmLl9pc19wcmVzZW50X2luX3BhcmVudCA9IEZhbHNlCi0gICAgc2VsZi5fbGlzdGVuZXIgPSBtZXNzYWdlX2xpc3RlbmVyX21vZC5OdWxsTWVzc2FnZUxpc3RlbmVyKCkKLSAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4gPSBfTGlzdGVuZXIoc2VsZikKLSAgICBmb3IgZmllbGRfbmFtZSwgZmllbGRfdmFsdWUgaW4ga3dhcmdzLml0ZXJpdGVtcygpOgotICAgICAgZmllbGQgPSBfR2V0RmllbGRCeU5hbWUobWVzc2FnZV9kZXNjcmlwdG9yLCBmaWVsZF9uYW1lKQotICAgICAgaWYgZmllbGQgaXMgTm9uZToKLSAgICAgICAgcmFpc2UgVHlwZUVycm9yKCIlcygpIGdvdCBhbiB1bmV4cGVjdGVkIGtleXdvcmQgYXJndW1lbnQgJyVzJyIgJQotICAgICAgICAgICAgICAgICAgICAgICAgKG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lLCBmaWVsZF9uYW1lKSkKLSAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgICAgIGNvcHkgPSBmaWVsZC5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmKQotICAgICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRTogICMgQ29tcG9zaXRlCi0gICAgICAgICAgZm9yIHZhbCBpbiBmaWVsZF92YWx1ZToKLSAgICAgICAgICAgIGNvcHkuYWRkKCkuTWVyZ2VGcm9tKHZhbCkKLSAgICAgICAgZWxzZTogICMgU2NhbGFyCi0gICAgICAgICAgY29weS5leHRlbmQoZmllbGRfdmFsdWUpCi0gICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5Ci0gICAgICBlbGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBjb3B5ID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKLSAgICAgICAgY29weS5NZXJnZUZyb20oZmllbGRfdmFsdWUpCi0gICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSBjb3B5Ci0gICAgICBlbHNlOgotICAgICAgICBzZXRhdHRyKHNlbGYsIGZpZWxkX25hbWUsIGZpZWxkX3ZhbHVlKQotCi0gIGluaXQuX19tb2R1bGVfXyA9IE5vbmUKLSAgaW5pdC5fX2RvY19fID0gTm9uZQotICBjbHMuX19pbml0X18gPSBpbml0Ci0KLQotZGVmIF9HZXRGaWVsZEJ5TmFtZShtZXNzYWdlX2Rlc2NyaXB0b3IsIGZpZWxkX25hbWUpOgotICAiIiJSZXR1cm5zIGEgZmllbGQgZGVzY3JpcHRvciBieSBmaWVsZCBuYW1lLgotCi0gIEFyZ3M6Ci0gICAgbWVzc2FnZV9kZXNjcmlwdG9yOiBBIERlc2NyaXB0b3IgZGVzY3JpYmluZyBhbGwgZmllbGRzIGluIG1lc3NhZ2UuCi0gICAgZmllbGRfbmFtZTogVGhlIG5hbWUgb2YgdGhlIGZpZWxkIHRvIHJldHJpZXZlLgotICBSZXR1cm5zOgotICAgIFRoZSBmaWVsZCBkZXNjcmlwdG9yIGFzc29jaWF0ZWQgd2l0aCB0aGUgZmllbGQgbmFtZS4KLSAgIiIiCi0gIHRyeToKLSAgICByZXR1cm4gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCi0gIGV4Y2VwdCBLZXlFcnJvcjoKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAiJXMiIGZpZWxkLicgJSBmaWVsZF9uYW1lKQotCi0KLWRlZiBfQWRkUHJvcGVydGllc0ZvckZpZWxkcyhkZXNjcmlwdG9yLCBjbHMpOgotICAiIiJBZGRzIHByb3BlcnRpZXMgZm9yIGFsbCBmaWVsZHMgaW4gdGhpcyBwcm90b2NvbCBtZXNzYWdlIHR5cGUuIiIiCi0gIGZvciBmaWVsZCBpbiBkZXNjcmlwdG9yLmZpZWxkczoKLSAgICBfQWRkUHJvcGVydGllc0ZvckZpZWxkKGZpZWxkLCBjbHMpCi0KLSAgaWYgZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgotICAgICMgX0V4dGVuc2lvbkRpY3QgaXMganVzdCBhbiBhZGFwdG9yIHdpdGggbm8gc3RhdGUgc28gd2UgYWxsb2NhdGUgYSBuZXcgb25lCi0gICAgIyBldmVyeSB0aW1lIGl0IGlzIGFjY2Vzc2VkLgotICAgIGNscy5FeHRlbnNpb25zID0gcHJvcGVydHkobGFtYmRhIHNlbGY6IF9FeHRlbnNpb25EaWN0KHNlbGYpKQotCi0KLWRlZiBfQWRkUHJvcGVydGllc0ZvckZpZWxkKGZpZWxkLCBjbHMpOgotICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIHByb3RvY29sIG1lc3NhZ2UgZmllbGQuCi0gIENsaWVudHMgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCBhbmQgKGluIHRoZSBjYXNlCi0gIG9mIG5vbi1yZXBlYXRlZCBzY2FsYXIgZmllbGRzKSBkaXJlY3RseSBzZXQgdGhlIHZhbHVlCi0gIG9mIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KLQotICBBcmdzOgotICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KLSAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCi0gICIiIgotICAjIENhdGNoIGl0IGlmIHdlIGFkZCBvdGhlciB0eXBlcyB0aGF0IHdlIHNob3VsZAotICAjIGhhbmRsZSBzcGVjaWFsbHkgaGVyZS4KLSAgYXNzZXJ0IF9GaWVsZERlc2NyaXB0b3IuTUFYX0NQUFRZUEUgPT0gMTAKLQotICBjb25zdGFudF9uYW1lID0gZmllbGQubmFtZS51cHBlcigpICsgIl9GSUVMRF9OVU1CRVIiCi0gIHNldGF0dHIoY2xzLCBjb25zdGFudF9uYW1lLCBmaWVsZC5udW1iZXIpCi0KLSAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICBfQWRkUHJvcGVydGllc0ZvclJlcGVhdGVkRmllbGQoZmllbGQsIGNscykKLSAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkQ29tcG9zaXRlRmllbGQoZmllbGQsIGNscykKLSAgZWxzZToKLSAgICBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkU2NhbGFyRmllbGQoZmllbGQsIGNscykKLQotCi1kZWYgX0FkZFByb3BlcnRpZXNGb3JSZXBlYXRlZEZpZWxkKGZpZWxkLCBjbHMpOgotICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhICJyZXBlYXRlZCIgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4gIENsaWVudHMKLSAgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCB3aGljaCB3aWxsIGJlIGVpdGhlciBhCi0gIF9SZXBlYXRlZFNjYWxhckZpZWxkQ29udGFpbmVyIG9yIF9SZXBlYXRlZENvbXBvc2l0ZUZpZWxkQ29udGFpbmVyIChzZWUKLSAgYmVsb3cpLgotCi0gIE5vdGUgdGhhdCB3aGVuIGNsaWVudHMgYWRkIHZhbHVlcyB0byB0aGVzZSBjb250YWluZXJzLCB3ZSBwZXJmb3JtCi0gIHR5cGUtY2hlY2tpbmcgaW4gdGhlIGNhc2Ugb2YgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkcywgYW5kIHdlIGFsc28gc2V0IGFueQotICBuZWNlc3NhcnkgImhhcyIgYml0cyBhcyBhIHNpZGUtZWZmZWN0LgotCi0gIEFyZ3M6Ci0gICAgZmllbGQ6IEEgRmllbGREZXNjcmlwdG9yIGZvciB0aGlzIGZpZWxkLgotICAgIGNsczogVGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KLSAgIiIiCi0gIHByb3RvX2ZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCi0gIHByb3BlcnR5X25hbWUgPSBfUHJvcGVydHlOYW1lKHByb3RvX2ZpZWxkX25hbWUpCi0KLSAgZGVmIGdldHRlcihzZWxmKToKLSAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5nZXQoZmllbGQpCi0gICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKLSAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KLSAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKLQotICAgICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKLSAgICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQotICAgICAgIyB0YWtlIHRoYXQgb2JqZWN0IGFuZCBkaXNjYXJkIG91cnMuCi0gICAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCi0gICAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKLSAgICAgICMgICBpbiBzZXZlcmFsIG90aGVyIGxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuCi0gICAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5zZXRkZWZhdWx0KGZpZWxkLCBmaWVsZF92YWx1ZSkKLSAgICByZXR1cm4gZmllbGRfdmFsdWUKLSAgZ2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCi0gIGdldHRlci5fX2RvY19fID0gJ0dldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKLQotICAjIFdlIGRlZmluZSBhIHNldHRlciBqdXN0IHNvIHdlIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBhIG1vcmUKLSAgIyBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCi0gIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKLSAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byByZXBlYXRlZCBmaWVsZCAnCi0gICAgICAgICAgICAgICAgICAgICAgICAgJyIlcyIgaW4gcHJvdG9jb2wgbWVzc2FnZSBvYmplY3QuJyAlIHByb3RvX2ZpZWxkX25hbWUpCi0KLSAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKLSAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5KGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKSkKLQotCi1kZWYgX0FkZFByb3BlcnRpZXNGb3JOb25SZXBlYXRlZFNjYWxhckZpZWxkKGZpZWxkLCBjbHMpOgotICAiIiJBZGRzIGEgcHVibGljIHByb3BlcnR5IGZvciBhIG5vbnJlcGVhdGVkLCBzY2FsYXIgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZC4KLSAgQ2xpZW50cyBjYW4gdXNlIHRoaXMgcHJvcGVydHkgdG8gZ2V0IGFuZCBkaXJlY3RseSBzZXQgdGhlIHZhbHVlIG9mIHRoZSBmaWVsZC4KLSAgTm90ZSB0aGF0IHdoZW4gdGhlIGNsaWVudCBzZXRzIHRoZSB2YWx1ZSBvZiBhIGZpZWxkIGJ5IHVzaW5nIHRoaXMgcHJvcGVydHksCi0gIGFsbCBuZWNlc3NhcnkgImhhcyIgYml0cyBhcmUgc2V0IGFzIGEgc2lkZS1lZmZlY3QsIGFuZCB3ZSBhbHNvIHBlcmZvcm0KLSAgdHlwZS1jaGVja2luZy4KLQotICBBcmdzOgotICAgIGZpZWxkOiBBIEZpZWxkRGVzY3JpcHRvciBmb3IgdGhpcyBmaWVsZC4KLSAgICBjbHM6IFRoZSBjbGFzcyB3ZSdyZSBjb25zdHJ1Y3RpbmcuCi0gICIiIgotICBwcm90b19maWVsZF9uYW1lID0gZmllbGQubmFtZQotICBwcm9wZXJ0eV9uYW1lID0gX1Byb3BlcnR5TmFtZShwcm90b19maWVsZF9uYW1lKQotICB0eXBlX2NoZWNrZXIgPSB0eXBlX2NoZWNrZXJzLkdldFR5cGVDaGVja2VyKGZpZWxkLmNwcF90eXBlLCBmaWVsZC50eXBlKQotICBkZWZhdWx0X3ZhbHVlID0gZmllbGQuZGVmYXVsdF92YWx1ZQotICB2YWxpZF92YWx1ZXMgPSBzZXQoKQotCi0gIGRlZiBnZXR0ZXIoc2VsZik6Ci0gICAgcmV0dXJuIHNlbGYuX2ZpZWxkcy5nZXQoZmllbGQsIGRlZmF1bHRfdmFsdWUpCi0gIGdldHRlci5fX21vZHVsZV9fID0gTm9uZQotICBnZXR0ZXIuX19kb2NfXyA9ICdHZXR0ZXIgZm9yICVzLicgJSBwcm90b19maWVsZF9uYW1lCi0gIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKLSAgICB0eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZShuZXdfdmFsdWUpCi0gICAgc2VsZi5fZmllbGRzW2ZpZWxkXSA9IG5ld192YWx1ZQotICAgICMgQ2hlY2sgX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgaW5saW5lIHRvIGltcHJvdmUgcGVyZm9ybWFuY2UsIHNpbmNlIHNjYWxhcgotICAgICMgc2V0dGVycyBhcmUgY2FsbGVkIGZyZXF1ZW50bHkuCi0gICAgaWYgbm90IHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHk6Ci0gICAgICBzZWxmLl9Nb2RpZmllZCgpCi0KLSAgc2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCi0gIHNldHRlci5fX2RvY19fID0gJ1NldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKLQotICAjIEFkZCBhIHByb3BlcnR5IHRvIGVuY2Fwc3VsYXRlIHRoZSBnZXR0ZXIvc2V0dGVyLgotICBkb2MgPSAnTWFnaWMgYXR0cmlidXRlIGdlbmVyYXRlZCBmb3IgIiVzIiBwcm90byBmaWVsZC4nICUgcHJvdG9fZmllbGRfbmFtZQotICBzZXRhdHRyKGNscywgcHJvcGVydHlfbmFtZSwgcHJvcGVydHkoZ2V0dGVyLCBzZXR0ZXIsIGRvYz1kb2MpKQotCi0KLWRlZiBfQWRkUHJvcGVydGllc0Zvck5vblJlcGVhdGVkQ29tcG9zaXRlRmllbGQoZmllbGQsIGNscyk6Ci0gICIiIkFkZHMgYSBwdWJsaWMgcHJvcGVydHkgZm9yIGEgbm9ucmVwZWF0ZWQsIGNvbXBvc2l0ZSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkLgotICBBIGNvbXBvc2l0ZSBmaWVsZCBpcyBhICJncm91cCIgb3IgIm1lc3NhZ2UiIGZpZWxkLgotCi0gIENsaWVudHMgY2FuIHVzZSB0aGlzIHByb3BlcnR5IHRvIGdldCB0aGUgdmFsdWUgb2YgdGhlIGZpZWxkLCBidXQgY2Fubm90Ci0gIGFzc2lnbiB0byB0aGUgcHJvcGVydHkgZGlyZWN0bHkuCi0KLSAgQXJnczoKLSAgICBmaWVsZDogQSBGaWVsZERlc2NyaXB0b3IgZm9yIHRoaXMgZmllbGQuCi0gICAgY2xzOiBUaGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgotICAiIiIKLSAgIyBUT0RPKHJvYmluc29uKTogUmVtb3ZlIGR1cGxpY2F0aW9uIHdpdGggc2ltaWxhciBtZXRob2QKLSAgIyBmb3Igbm9uLXJlcGVhdGVkIHNjYWxhcnMuCi0gIHByb3RvX2ZpZWxkX25hbWUgPSBmaWVsZC5uYW1lCi0gIHByb3BlcnR5X25hbWUgPSBfUHJvcGVydHlOYW1lKHByb3RvX2ZpZWxkX25hbWUpCi0gIG1lc3NhZ2VfdHlwZSA9IGZpZWxkLm1lc3NhZ2VfdHlwZQotCi0gIGRlZiBnZXR0ZXIoc2VsZik6Ci0gICAgZmllbGRfdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQotICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6Ci0gICAgICAjIENvbnN0cnVjdCBhIG5ldyBvYmplY3QgdG8gcmVwcmVzZW50IHRoaXMgZmllbGQuCi0gICAgICBmaWVsZF92YWx1ZSA9IG1lc3NhZ2VfdHlwZS5fY29uY3JldGVfY2xhc3MoKQotICAgICAgZmllbGRfdmFsdWUuX1NldExpc3RlbmVyKHNlbGYuX2xpc3RlbmVyX2Zvcl9jaGlsZHJlbikKLQotICAgICAgIyBBdG9taWNhbGx5IGNoZWNrIGlmIGFub3RoZXIgdGhyZWFkIGhhcyBwcmVlbXB0ZWQgdXMgYW5kLCBpZiBub3QsIHN3YXAKLSAgICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQotICAgICAgIyB0YWtlIHRoYXQgb2JqZWN0IGFuZCBkaXNjYXJkIG91cnMuCi0gICAgICAjIFdBUk5JTkc6ICBXZSBhcmUgcmVseWluZyBvbiBzZXRkZWZhdWx0KCkgYmVpbmcgYXRvbWljLiAgVGhpcyBpcyB0cnVlCi0gICAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKLSAgICAgICMgICBpbiBzZXZlcmFsIG90aGVyIGxvY2F0aW9ucyBpbiB0aGlzIGZpbGUuCi0gICAgICBmaWVsZF92YWx1ZSA9IHNlbGYuX2ZpZWxkcy5zZXRkZWZhdWx0KGZpZWxkLCBmaWVsZF92YWx1ZSkKLSAgICByZXR1cm4gZmllbGRfdmFsdWUKLSAgZ2V0dGVyLl9fbW9kdWxlX18gPSBOb25lCi0gIGdldHRlci5fX2RvY19fID0gJ0dldHRlciBmb3IgJXMuJyAlIHByb3RvX2ZpZWxkX25hbWUKLQotICAjIFdlIGRlZmluZSBhIHNldHRlciBqdXN0IHNvIHdlIGNhbiB0aHJvdyBhbiBleGNlcHRpb24gd2l0aCBhIG1vcmUKLSAgIyBoZWxwZnVsIGVycm9yIG1lc3NhZ2UuCi0gIGRlZiBzZXR0ZXIoc2VsZiwgbmV3X3ZhbHVlKToKLSAgICByYWlzZSBBdHRyaWJ1dGVFcnJvcignQXNzaWdubWVudCBub3QgYWxsb3dlZCB0byBjb21wb3NpdGUgZmllbGQgJwotICAgICAgICAgICAgICAgICAgICAgICAgICciJXMiIGluIHByb3RvY29sIG1lc3NhZ2Ugb2JqZWN0LicgJSBwcm90b19maWVsZF9uYW1lKQotCi0gICMgQWRkIGEgcHJvcGVydHkgdG8gZW5jYXBzdWxhdGUgdGhlIGdldHRlci4KLSAgZG9jID0gJ01hZ2ljIGF0dHJpYnV0ZSBnZW5lcmF0ZWQgZm9yICIlcyIgcHJvdG8gZmllbGQuJyAlIHByb3RvX2ZpZWxkX25hbWUKLSAgc2V0YXR0cihjbHMsIHByb3BlcnR5X25hbWUsIHByb3BlcnR5KGdldHRlciwgc2V0dGVyLCBkb2M9ZG9jKSkKLQotCi1kZWYgX0FkZFByb3BlcnRpZXNGb3JFeHRlbnNpb25zKGRlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkFkZHMgcHJvcGVydGllcyBmb3IgYWxsIGZpZWxkcyBpbiB0aGlzIHByb3RvY29sIG1lc3NhZ2UgdHlwZS4iIiIKLSAgZXh0ZW5zaW9uX2RpY3QgPSBkZXNjcmlwdG9yLmV4dGVuc2lvbnNfYnlfbmFtZQotICBmb3IgZXh0ZW5zaW9uX25hbWUsIGV4dGVuc2lvbl9maWVsZCBpbiBleHRlbnNpb25fZGljdC5pdGVyaXRlbXMoKToKLSAgICBjb25zdGFudF9uYW1lID0gZXh0ZW5zaW9uX25hbWUudXBwZXIoKSArICJfRklFTERfTlVNQkVSIgotICAgIHNldGF0dHIoY2xzLCBjb25zdGFudF9uYW1lLCBleHRlbnNpb25fZmllbGQubnVtYmVyKQotCi0KLWRlZiBfQWRkU3RhdGljTWV0aG9kcyhjbHMpOgotICAjIFRPRE8ocm9iaW5zb24pOiBUaGlzIHByb2JhYmx5IG5lZWRzIHRvIGJlIHRocmVhZC1zYWZlKD8pCi0gIGRlZiBSZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb25faGFuZGxlKToKLSAgICBleHRlbnNpb25faGFuZGxlLmNvbnRhaW5pbmdfdHlwZSA9IGNscy5ERVNDUklQVE9SCi0gICAgX0F0dGFjaEZpZWxkSGVscGVycyhjbHMsIGV4dGVuc2lvbl9oYW5kbGUpCi0KLSAgICAjIFRyeSB0byBpbnNlcnQgb3VyIGV4dGVuc2lvbiwgZmFpbGluZyBpZiBhbiBleHRlbnNpb24gd2l0aCB0aGUgc2FtZSBudW1iZXIKLSAgICAjIGFscmVhZHkgZXhpc3RzLgotICAgIGFjdHVhbF9oYW5kbGUgPSBjbHMuX2V4dGVuc2lvbnNfYnlfbnVtYmVyLnNldGRlZmF1bHQoCi0gICAgICAgIGV4dGVuc2lvbl9oYW5kbGUubnVtYmVyLCBleHRlbnNpb25faGFuZGxlKQotICAgIGlmIGFjdHVhbF9oYW5kbGUgaXMgbm90IGV4dGVuc2lvbl9oYW5kbGU6Ci0gICAgICByYWlzZSBBc3NlcnRpb25FcnJvcigKLSAgICAgICAgICAnRXh0ZW5zaW9ucyAiJXMiIGFuZCAiJXMiIGJvdGggdHJ5IHRvIGV4dGVuZCBtZXNzYWdlIHR5cGUgIiVzIiB3aXRoICcKLSAgICAgICAgICAnZmllbGQgbnVtYmVyICVkLicgJQotICAgICAgICAgIChleHRlbnNpb25faGFuZGxlLmZ1bGxfbmFtZSwgYWN0dWFsX2hhbmRsZS5mdWxsX25hbWUsCi0gICAgICAgICAgIGNscy5ERVNDUklQVE9SLmZ1bGxfbmFtZSwgZXh0ZW5zaW9uX2hhbmRsZS5udW1iZXIpKQotCi0gICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWVdID0gZXh0ZW5zaW9uX2hhbmRsZQotCi0gICAgaGFuZGxlID0gZXh0ZW5zaW9uX2hhbmRsZSAgIyBhdm9pZCBsaW5lIHdyYXBwaW5nCi0gICAgaWYgX0lzTWVzc2FnZVNldEV4dGVuc2lvbihoYW5kbGUpOgotICAgICAgIyBNZXNzYWdlU2V0IGV4dGVuc2lvbi4gIEFsc28gcmVnaXN0ZXIgdW5kZXIgdHlwZSBuYW1lLgotICAgICAgY2xzLl9leHRlbnNpb25zX2J5X25hbWVbCi0gICAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5tZXNzYWdlX3R5cGUuZnVsbF9uYW1lXSA9IGV4dGVuc2lvbl9oYW5kbGUKLQotICBjbHMuUmVnaXN0ZXJFeHRlbnNpb24gPSBzdGF0aWNtZXRob2QoUmVnaXN0ZXJFeHRlbnNpb24pCi0KLSAgZGVmIEZyb21TdHJpbmcocyk6Ci0gICAgbWVzc2FnZSA9IGNscygpCi0gICAgbWVzc2FnZS5NZXJnZUZyb21TdHJpbmcocykKLSAgICByZXR1cm4gbWVzc2FnZQotICBjbHMuRnJvbVN0cmluZyA9IHN0YXRpY21ldGhvZChGcm9tU3RyaW5nKQotCi0KLWRlZiBfSXNQcmVzZW50KGl0ZW0pOgotICAiIiJHaXZlbiBhIChGaWVsZERlc2NyaXB0b3IsIHZhbHVlKSB0dXBsZSBmcm9tIF9maWVsZHMsIHJldHVybiB0cnVlIGlmIHRoZQotICB2YWx1ZSBzaG91bGQgYmUgaW5jbHVkZWQgaW4gdGhlIGxpc3QgcmV0dXJuZWQgYnkgTGlzdEZpZWxkcygpLiIiIgotCi0gIGlmIGl0ZW1bMF0ubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICByZXR1cm4gYm9vbChpdGVtWzFdKQotICBlbGlmIGl0ZW1bMF0uY3BwX3R5cGUgPT0gX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgcmV0dXJuIGl0ZW1bMV0uX2lzX3ByZXNlbnRfaW5fcGFyZW50Ci0gIGVsc2U6Ci0gICAgcmV0dXJuIFRydWUKLQotCi1kZWYgX0FkZExpc3RGaWVsZHNNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgotCi0gIGRlZiBMaXN0RmllbGRzKHNlbGYpOgotICAgIGFsbF9maWVsZHMgPSBbaXRlbSBmb3IgaXRlbSBpbiBzZWxmLl9maWVsZHMuaXRlcml0ZW1zKCkgaWYgX0lzUHJlc2VudChpdGVtKV0KLSAgICBhbGxfZmllbGRzLnNvcnQoa2V5ID0gbGFtYmRhIGl0ZW06IGl0ZW1bMF0ubnVtYmVyKQotICAgIHJldHVybiBhbGxfZmllbGRzCi0KLSAgY2xzLkxpc3RGaWVsZHMgPSBMaXN0RmllbGRzCi0KLQotZGVmIF9BZGRIYXNGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0KLSAgc2luZ3VsYXJfZmllbGRzID0ge30KLSAgZm9yIGZpZWxkIGluIG1lc3NhZ2VfZGVzY3JpcHRvci5maWVsZHM6Ci0gICAgaWYgZmllbGQubGFiZWwgIT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgIHNpbmd1bGFyX2ZpZWxkc1tmaWVsZC5uYW1lXSA9IGZpZWxkCi0KLSAgZGVmIEhhc0ZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgotICAgIHRyeToKLSAgICAgIGZpZWxkID0gc2luZ3VsYXJfZmllbGRzW2ZpZWxkX25hbWVdCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcigKLSAgICAgICAgICAnUHJvdG9jb2wgbWVzc2FnZSBoYXMgbm8gc2luZ3VsYXIgIiVzIiBmaWVsZC4nICUgZmllbGRfbmFtZSkKLQotICAgIGlmIGZpZWxkLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGZpZWxkKQotICAgICAgcmV0dXJuIHZhbHVlIGlzIG5vdCBOb25lIGFuZCB2YWx1ZS5faXNfcHJlc2VudF9pbl9wYXJlbnQKLSAgICBlbHNlOgotICAgICAgcmV0dXJuIGZpZWxkIGluIHNlbGYuX2ZpZWxkcwotICBjbHMuSGFzRmllbGQgPSBIYXNGaWVsZAotCi0KLWRlZiBfQWRkQ2xlYXJGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBDbGVhckZpZWxkKHNlbGYsIGZpZWxkX25hbWUpOgotICAgIHRyeToKLSAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lW2ZpZWxkX25hbWVdCi0gICAgZXhjZXB0IEtleUVycm9yOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcignUHJvdG9jb2wgbWVzc2FnZSBoYXMgbm8gIiVzIiBmaWVsZC4nICUgZmllbGRfbmFtZSkKLQotICAgIGlmIGZpZWxkIGluIHNlbGYuX2ZpZWxkczoKLSAgICAgICMgTm90ZTogIElmIHRoZSBmaWVsZCBpcyBhIHN1Yi1tZXNzYWdlLCBpdHMgbGlzdGVuZXIgd2lsbCBzdGlsbCBwb2ludAotICAgICAgIyAgIGF0IHVzLiAgVGhhdCdzIGZpbmUsIGJlY2F1c2UgdGhlIHdvcnN0IHRoYW4gY2FuIGhhcHBlbiBpcyB0aGF0IGl0Ci0gICAgICAjICAgd2lsbCBjYWxsIF9Nb2RpZmllZCgpIGFuZCBpbnZhbGlkYXRlIG91ciBieXRlIHNpemUuICBCaWcgZGVhbC4KLSAgICAgIGRlbCBzZWxmLl9maWVsZHNbZmllbGRdCi0KLSAgICAjIEFsd2F5cyBjYWxsIF9Nb2RpZmllZCgpIC0tIGV2ZW4gaWYgbm90aGluZyB3YXMgY2hhbmdlZCwgdGhpcyBpcwotICAgICMgYSBtdXRhdGluZyBtZXRob2QsIGFuZCB0aHVzIGNhbGxpbmcgaXQgc2hvdWxkIGNhdXNlIHRoZSBmaWVsZCB0byBiZWNvbWUKLSAgICAjIHByZXNlbnQgaW4gdGhlIHBhcmVudCBtZXNzYWdlLgotICAgIHNlbGYuX01vZGlmaWVkKCkKLQotICBjbHMuQ2xlYXJGaWVsZCA9IENsZWFyRmllbGQKLQotCi1kZWYgX0FkZENsZWFyRXh0ZW5zaW9uTWV0aG9kKGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBDbGVhckV4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKLSAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpCi0KLSAgICAjIFNpbWlsYXIgdG8gQ2xlYXJGaWVsZCgpLCBhYm92ZS4KLSAgICBpZiBleHRlbnNpb25faGFuZGxlIGluIHNlbGYuX2ZpZWxkczoKLSAgICAgIGRlbCBzZWxmLl9maWVsZHNbZXh0ZW5zaW9uX2hhbmRsZV0KLSAgICBzZWxmLl9Nb2RpZmllZCgpCi0gIGNscy5DbGVhckV4dGVuc2lvbiA9IENsZWFyRXh0ZW5zaW9uCi0KLQotZGVmIF9BZGRDbGVhck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBDbGVhcihzZWxmKToKLSAgICAjIENsZWFyIGZpZWxkcy4KLSAgICBzZWxmLl9maWVsZHMgPSB7fQotICAgIHNlbGYuX01vZGlmaWVkKCkKLSAgY2xzLkNsZWFyID0gQ2xlYXIKLQotCi1kZWYgX0FkZEhhc0V4dGVuc2lvbk1ldGhvZChjbHMpOgotICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgotICBkZWYgSGFzRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgotICAgIF9WZXJpZnlFeHRlbnNpb25IYW5kbGUoc2VsZiwgZXh0ZW5zaW9uX2hhbmRsZSkKLSAgICBpZiBleHRlbnNpb25faGFuZGxlLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgICByYWlzZSBLZXlFcnJvcignIiVzIiBpcyByZXBlYXRlZC4nICUgZXh0ZW5zaW9uX2hhbmRsZS5mdWxsX25hbWUpCi0KLSAgICBpZiBleHRlbnNpb25faGFuZGxlLmNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICAgdmFsdWUgPSBzZWxmLl9maWVsZHMuZ2V0KGV4dGVuc2lvbl9oYW5kbGUpCi0gICAgICByZXR1cm4gdmFsdWUgaXMgbm90IE5vbmUgYW5kIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudAotICAgIGVsc2U6Ci0gICAgICByZXR1cm4gZXh0ZW5zaW9uX2hhbmRsZSBpbiBzZWxmLl9maWVsZHMKLSAgY2xzLkhhc0V4dGVuc2lvbiA9IEhhc0V4dGVuc2lvbgotCi0KLWRlZiBfQWRkRXF1YWxzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLSAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgaWYgKG5vdCBpc2luc3RhbmNlKG90aGVyLCBtZXNzYWdlX21vZC5NZXNzYWdlKSBvcgotICAgICAgICBvdGhlci5ERVNDUklQVE9SICE9IHNlbGYuREVTQ1JJUFRPUik6Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICAgIGlmIHNlbGYgaXMgb3RoZXI6Ci0gICAgICByZXR1cm4gVHJ1ZQotCi0gICAgcmV0dXJuIHNlbGYuTGlzdEZpZWxkcygpID09IG90aGVyLkxpc3RGaWVsZHMoKQotCi0gIGNscy5fX2VxX18gPSBfX2VxX18KLQotCi1kZWYgX0FkZFN0ck1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZikKLSAgY2xzLl9fc3RyX18gPSBfX3N0cl9fCi0KLQotZGVmIF9BZGRVbmljb2RlTWV0aG9kKHVudXNlZF9tZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0KLSAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgotICAgIHJldHVybiB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcoc2VsZiwgYXNfdXRmOD1UcnVlKS5kZWNvZGUoJ3V0Zi04JykKLSAgY2xzLl9fdW5pY29kZV9fID0gX191bmljb2RlX18KLQotCi1kZWYgX0FkZFNldExpc3RlbmVyTWV0aG9kKGNscyk6Ci0gICIiIkhlbHBlciBmb3IgX0FkZE1lc3NhZ2VNZXRob2RzKCkuIiIiCi0gIGRlZiBTZXRMaXN0ZW5lcihzZWxmLCBsaXN0ZW5lcik6Ci0gICAgaWYgbGlzdGVuZXIgaXMgTm9uZToKLSAgICAgIHNlbGYuX2xpc3RlbmVyID0gbWVzc2FnZV9saXN0ZW5lcl9tb2QuTnVsbE1lc3NhZ2VMaXN0ZW5lcigpCi0gICAgZWxzZToKLSAgICAgIHNlbGYuX2xpc3RlbmVyID0gbGlzdGVuZXIKLSAgY2xzLl9TZXRMaXN0ZW5lciA9IFNldExpc3RlbmVyCi0KLQotZGVmIF9CeXRlc0Zvck5vblJlcGVhdGVkRWxlbWVudCh2YWx1ZSwgZmllbGRfbnVtYmVyLCBmaWVsZF90eXBlKToKLSAgIiIiUmV0dXJucyB0aGUgbnVtYmVyIG9mIGJ5dGVzIG5lZWRlZCB0byBzZXJpYWxpemUgYSBub24tcmVwZWF0ZWQgZWxlbWVudC4KLSAgVGhlIHJldHVybmVkIGJ5dGUgY291bnQgaW5jbHVkZXMgc3BhY2UgZm9yIHRhZyBpbmZvcm1hdGlvbiBhbmQgYW55Ci0gIG90aGVyIGFkZGl0aW9uYWwgc3BhY2UgYXNzb2NpYXRlZCB3aXRoIHNlcmlhbGl6aW5nIHZhbHVlLgotCi0gIEFyZ3M6Ci0gICAgdmFsdWU6IFZhbHVlIHdlJ3JlIHNlcmlhbGl6aW5nLgotICAgIGZpZWxkX251bWJlcjogRmllbGQgbnVtYmVyIG9mIHRoaXMgdmFsdWUuICAoU2luY2UgdGhlIGZpZWxkIG51bWJlcgotICAgICAgaXMgc3RvcmVkIGFzIHBhcnQgb2YgYSB2YXJpbnQtZW5jb2RlZCB0YWcsIHRoaXMgaGFzIGFuIGltcGFjdAotICAgICAgb24gdGhlIHRvdGFsIGJ5dGVzIHJlcXVpcmVkIHRvIHNlcmlhbGl6ZSB0aGUgdmFsdWUpLgotICAgIGZpZWxkX3R5cGU6IFRoZSB0eXBlIG9mIHRoZSBmaWVsZC4gIE9uZSBvZiB0aGUgVFlQRV8qIGNvbnN0YW50cwotICAgICAgd2l0aGluIEZpZWxkRGVzY3JpcHRvci4KLSAgIiIiCi0gIHRyeToKLSAgICBmbiA9IHR5cGVfY2hlY2tlcnMuVFlQRV9UT19CWVRFX1NJWkVfRk5bZmllbGRfdHlwZV0KLSAgICByZXR1cm4gZm4oZmllbGRfbnVtYmVyLCB2YWx1ZSkKLSAgZXhjZXB0IEtleUVycm9yOgotICAgIHJhaXNlIG1lc3NhZ2VfbW9kLkVuY29kZUVycm9yKCdVbnJlY29nbml6ZWQgZmllbGQgdHlwZTogJWQnICUgZmllbGRfdHlwZSkKLQotCi1kZWYgX0FkZEJ5dGVTaXplTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLQotICBkZWYgQnl0ZVNpemUoc2VsZik6Ci0gICAgaWYgbm90IHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHk6Ci0gICAgICByZXR1cm4gc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZQotCi0gICAgc2l6ZSA9IDAKLSAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgZmllbGRfdmFsdWUgaW4gc2VsZi5MaXN0RmllbGRzKCk6Ci0gICAgICBzaXplICs9IGZpZWxkX2Rlc2NyaXB0b3IuX3NpemVyKGZpZWxkX3ZhbHVlKQotCi0gICAgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZSA9IHNpemUKLSAgICBzZWxmLl9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5ID0gRmFsc2UKLSAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4uZGlydHkgPSBGYWxzZQotICAgIHJldHVybiBzaXplCi0KLSAgY2xzLkJ5dGVTaXplID0gQnl0ZVNpemUKLQotCi1kZWYgX0FkZFNlcmlhbGl6ZVRvU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLQotICBkZWYgU2VyaWFsaXplVG9TdHJpbmcoc2VsZik6Ci0gICAgIyBDaGVjayBpZiB0aGUgbWVzc2FnZSBoYXMgYWxsIG9mIGl0cyByZXF1aXJlZCBmaWVsZHMgc2V0LgotICAgIGVycm9ycyA9IFtdCi0gICAgaWYgbm90IHNlbGYuSXNJbml0aWFsaXplZCgpOgotICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRW5jb2RlRXJyb3IoCi0gICAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcgKwotICAgICAgICAgICcsJy5qb2luKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpKQotICAgIHJldHVybiBzZWxmLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCi0gIGNscy5TZXJpYWxpemVUb1N0cmluZyA9IFNlcmlhbGl6ZVRvU3RyaW5nCi0KLQotZGVmIF9BZGRTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpOgotICAiIiJIZWxwZXIgZm9yIF9BZGRNZXNzYWdlTWV0aG9kcygpLiIiIgotCi0gIGRlZiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc2VsZik6Ci0gICAgb3V0ID0gU3RyaW5nSU8oKQotICAgIHNlbGYuX0ludGVybmFsU2VyaWFsaXplKG91dC53cml0ZSkKLSAgICByZXR1cm4gb3V0LmdldHZhbHVlKCkKLSAgY2xzLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZyA9IFNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZwotCi0gIGRlZiBJbnRlcm5hbFNlcmlhbGl6ZShzZWxmLCB3cml0ZV9ieXRlcyk6Ci0gICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIGZpZWxkX3ZhbHVlIGluIHNlbGYuTGlzdEZpZWxkcygpOgotICAgICAgZmllbGRfZGVzY3JpcHRvci5fZW5jb2Rlcih3cml0ZV9ieXRlcywgZmllbGRfdmFsdWUpCi0gIGNscy5fSW50ZXJuYWxTZXJpYWxpemUgPSBJbnRlcm5hbFNlcmlhbGl6ZQotCi0KLWRlZiBfQWRkTWVyZ2VGcm9tU3RyaW5nTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKToKLSAgIiIiSGVscGVyIGZvciBfQWRkTWVzc2FnZU1ldGhvZHMoKS4iIiIKLSAgZGVmIE1lcmdlRnJvbVN0cmluZyhzZWxmLCBzZXJpYWxpemVkKToKLSAgICBsZW5ndGggPSBsZW4oc2VyaWFsaXplZCkKLSAgICB0cnk6Ci0gICAgICBpZiBzZWxmLl9JbnRlcm5hbFBhcnNlKHNlcmlhbGl6ZWQsIDAsIGxlbmd0aCkgIT0gbGVuZ3RoOgotICAgICAgICAjIFRoZSBvbmx5IHJlYXNvbiBfSW50ZXJuYWxQYXJzZSB3b3VsZCByZXR1cm4gZWFybHkgaXMgaWYgaXQKLSAgICAgICAgIyBlbmNvdW50ZXJlZCBhbiBlbmQtZ3JvdXAgdGFnLgotICAgICAgICByYWlzZSBtZXNzYWdlX21vZC5EZWNvZGVFcnJvcignVW5leHBlY3RlZCBlbmQtZ3JvdXAgdGFnLicpCi0gICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICByYWlzZSBtZXNzYWdlX21vZC5EZWNvZGVFcnJvcignVHJ1bmNhdGVkIG1lc3NhZ2UuJykKLSAgICBleGNlcHQgc3RydWN0LmVycm9yLCBlOgotICAgICAgcmFpc2UgbWVzc2FnZV9tb2QuRGVjb2RlRXJyb3IoZSkKLSAgICByZXR1cm4gbGVuZ3RoICAgIyBSZXR1cm4gdGhpcyBmb3IgbGVnYWN5IHJlYXNvbnMuCi0gIGNscy5NZXJnZUZyb21TdHJpbmcgPSBNZXJnZUZyb21TdHJpbmcKLQotICBsb2NhbF9SZWFkVGFnID0gZGVjb2Rlci5SZWFkVGFnCi0gIGxvY2FsX1NraXBGaWVsZCA9IGRlY29kZXIuU2tpcEZpZWxkCi0gIGRlY29kZXJzX2J5X3RhZyA9IGNscy5fZGVjb2RlcnNfYnlfdGFnCi0KLSAgZGVmIEludGVybmFsUGFyc2Uoc2VsZiwgYnVmZmVyLCBwb3MsIGVuZCk6Ci0gICAgc2VsZi5fTW9kaWZpZWQoKQotICAgIGZpZWxkX2RpY3QgPSBzZWxmLl9maWVsZHMKLSAgICB3aGlsZSBwb3MgIT0gZW5kOgotICAgICAgKHRhZ19ieXRlcywgbmV3X3BvcykgPSBsb2NhbF9SZWFkVGFnKGJ1ZmZlciwgcG9zKQotICAgICAgZmllbGRfZGVjb2RlciA9IGRlY29kZXJzX2J5X3RhZy5nZXQodGFnX2J5dGVzKQotICAgICAgaWYgZmllbGRfZGVjb2RlciBpcyBOb25lOgotICAgICAgICBuZXdfcG9zID0gbG9jYWxfU2tpcEZpZWxkKGJ1ZmZlciwgbmV3X3BvcywgZW5kLCB0YWdfYnl0ZXMpCi0gICAgICAgIGlmIG5ld19wb3MgPT0gLTE6Ci0gICAgICAgICAgcmV0dXJuIHBvcwotICAgICAgICBwb3MgPSBuZXdfcG9zCi0gICAgICBlbHNlOgotICAgICAgICBwb3MgPSBmaWVsZF9kZWNvZGVyKGJ1ZmZlciwgbmV3X3BvcywgZW5kLCBzZWxmLCBmaWVsZF9kaWN0KQotICAgIHJldHVybiBwb3MKLSAgY2xzLl9JbnRlcm5hbFBhcnNlID0gSW50ZXJuYWxQYXJzZQotCi0KLWRlZiBfQWRkSXNJbml0aWFsaXplZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkFkZHMgdGhlIElzSW5pdGlhbGl6ZWQgYW5kIEZpbmRJbml0aWFsaXphdGlvbkVycm9yIG1ldGhvZHMgdG8gdGhlCi0gIHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuIiIiCi0KLSAgcmVxdWlyZWRfZmllbGRzID0gW2ZpZWxkIGZvciBmaWVsZCBpbiBtZXNzYWdlX2Rlc2NyaXB0b3IuZmllbGRzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpZiBmaWVsZC5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUVVJUkVEXQotCi0gIGRlZiBJc0luaXRpYWxpemVkKHNlbGYsIGVycm9ycz1Ob25lKToKLSAgICAiIiJDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBvZiBhIG1lc3NhZ2UgYXJlIHNldC4KLQotICAgIEFyZ3M6Ci0gICAgICBlcnJvcnM6ICBBIGxpc3Qgd2hpY2gsIGlmIHByb3ZpZGVkLCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZSBmaWVsZAotICAgICAgICAgICAgICAgcGF0aHMgb2YgYWxsIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRydWUgaWZmIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBoYXMgYWxsIHJlcXVpcmVkIGZpZWxkcyBzZXQuCi0gICAgIiIiCi0KLSAgICAjIFBlcmZvcm1hbmNlIGlzIGNyaXRpY2FsIHNvIHdlIGF2b2lkIEhhc0ZpZWxkKCkgYW5kIExpc3RGaWVsZHMoKS4KLQotICAgIGZvciBmaWVsZCBpbiByZXF1aXJlZF9maWVsZHM6Ci0gICAgICBpZiAoZmllbGQgbm90IGluIHNlbGYuX2ZpZWxkcyBvcgotICAgICAgICAgIChmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSBhbmQKLSAgICAgICAgICAgbm90IHNlbGYuX2ZpZWxkc1tmaWVsZF0uX2lzX3ByZXNlbnRfaW5fcGFyZW50KSk6Ci0gICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKLSAgICAgICAgICBlcnJvcnMuZXh0ZW5kKHNlbGYuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKCkpCi0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBzZWxmLl9maWVsZHMuaXRlcml0ZW1zKCk6Ci0gICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgaWYgZmllbGQubGFiZWwgPT0gX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgICAgICBmb3IgZWxlbWVudCBpbiB2YWx1ZToKLSAgICAgICAgICAgIGlmIG5vdCBlbGVtZW50LklzSW5pdGlhbGl6ZWQoKToKLSAgICAgICAgICAgICAgaWYgZXJyb3JzIGlzIG5vdCBOb25lOgotICAgICAgICAgICAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkKLSAgICAgICAgICAgICAgcmV0dXJuIEZhbHNlCi0gICAgICAgIGVsaWYgdmFsdWUuX2lzX3ByZXNlbnRfaW5fcGFyZW50IGFuZCBub3QgdmFsdWUuSXNJbml0aWFsaXplZCgpOgotICAgICAgICAgIGlmIGVycm9ycyBpcyBub3QgTm9uZToKLSAgICAgICAgICAgIGVycm9ycy5leHRlbmQoc2VsZi5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKSkKLSAgICAgICAgICByZXR1cm4gRmFsc2UKLQotICAgIHJldHVybiBUcnVlCi0KLSAgY2xzLklzSW5pdGlhbGl6ZWQgPSBJc0luaXRpYWxpemVkCi0KLSAgZGVmIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzZWxmKToKLSAgICAiIiJGaW5kcyByZXF1aXJlZCBmaWVsZHMgd2hpY2ggYXJlIG5vdCBpbml0aWFsaXplZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIGxpc3Qgb2Ygc3RyaW5ncy4gIEVhY2ggc3RyaW5nIGlzIGEgcGF0aCB0byBhbiB1bmluaXRpYWxpemVkIGZpZWxkIGZyb20KLSAgICAgIHRoZSB0b3AtbGV2ZWwgbWVzc2FnZSwgZS5nLiAiZm9vLmJhcls1XS5iYXoiLgotICAgICIiIgotCi0gICAgZXJyb3JzID0gW10gICMgc2ltcGxpZnkgdGhpbmdzCi0KLSAgICBmb3IgZmllbGQgaW4gcmVxdWlyZWRfZmllbGRzOgotICAgICAgaWYgbm90IHNlbGYuSGFzRmllbGQoZmllbGQubmFtZSk6Ci0gICAgICAgIGVycm9ycy5hcHBlbmQoZmllbGQubmFtZSkKLQotICAgIGZvciBmaWVsZCwgdmFsdWUgaW4gc2VsZi5MaXN0RmllbGRzKCk6Ci0gICAgICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgotICAgICAgICAgIG5hbWUgPSAiKCVzKSIgJSBmaWVsZC5mdWxsX25hbWUKLSAgICAgICAgZWxzZToKLSAgICAgICAgICBuYW1lID0gZmllbGQubmFtZQotCi0gICAgICAgIGlmIGZpZWxkLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQ6Ci0gICAgICAgICAgZm9yIGkgaW4geHJhbmdlKGxlbih2YWx1ZSkpOgotICAgICAgICAgICAgZWxlbWVudCA9IHZhbHVlW2ldCi0gICAgICAgICAgICBwcmVmaXggPSAiJXNbJWRdLiIgJSAobmFtZSwgaSkKLSAgICAgICAgICAgIHN1Yl9lcnJvcnMgPSBlbGVtZW50LkZpbmRJbml0aWFsaXphdGlvbkVycm9ycygpCi0gICAgICAgICAgICBlcnJvcnMgKz0gWyBwcmVmaXggKyBlcnJvciBmb3IgZXJyb3IgaW4gc3ViX2Vycm9ycyBdCi0gICAgICAgIGVsc2U6Ci0gICAgICAgICAgcHJlZml4ID0gbmFtZSArICIuIgotICAgICAgICAgIHN1Yl9lcnJvcnMgPSB2YWx1ZS5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoKQotICAgICAgICAgIGVycm9ycyArPSBbIHByZWZpeCArIGVycm9yIGZvciBlcnJvciBpbiBzdWJfZXJyb3JzIF0KLQotICAgIHJldHVybiBlcnJvcnMKLQotICBjbHMuRmluZEluaXRpYWxpemF0aW9uRXJyb3JzID0gRmluZEluaXRpYWxpemF0aW9uRXJyb3JzCi0KLQotZGVmIF9BZGRNZXJnZUZyb21NZXRob2QoY2xzKToKLSAgTEFCRUxfUkVQRUFURUQgPSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVECi0gIENQUFRZUEVfTUVTU0FHRSA9IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFCi0KLSAgZGVmIE1lcmdlRnJvbShzZWxmLCBtc2cpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKG1zZywgY2xzKToKLSAgICAgIHJhaXNlIFR5cGVFcnJvcigKLSAgICAgICAgICAiUGFyYW1ldGVyIHRvIE1lcmdlRnJvbSgpIG11c3QgYmUgaW5zdGFuY2Ugb2Ygc2FtZSBjbGFzcy4iKQotCi0gICAgYXNzZXJ0IG1zZyBpcyBub3Qgc2VsZgotICAgIHNlbGYuX01vZGlmaWVkKCkKLQotICAgIGZpZWxkcyA9IHNlbGYuX2ZpZWxkcwotCi0gICAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBtc2cuX2ZpZWxkcy5pdGVyaXRlbXMoKToKLSAgICAgIGlmIGZpZWxkLmxhYmVsID09IExBQkVMX1JFUEVBVEVEOgotICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkcy5nZXQoZmllbGQpCi0gICAgICAgIGlmIGZpZWxkX3ZhbHVlIGlzIE5vbmU6Ci0gICAgICAgICAgIyBDb25zdHJ1Y3QgYSBuZXcgb2JqZWN0IHRvIHJlcHJlc2VudCB0aGlzIGZpZWxkLgotICAgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKLSAgICAgICAgICBmaWVsZHNbZmllbGRdID0gZmllbGRfdmFsdWUKLSAgICAgICAgZmllbGRfdmFsdWUuTWVyZ2VGcm9tKHZhbHVlKQotICAgICAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIGlmIHZhbHVlLl9pc19wcmVzZW50X2luX3BhcmVudDoKLSAgICAgICAgICBmaWVsZF92YWx1ZSA9IGZpZWxkcy5nZXQoZmllbGQpCi0gICAgICAgICAgaWYgZmllbGRfdmFsdWUgaXMgTm9uZToKLSAgICAgICAgICAgICMgQ29uc3RydWN0IGEgbmV3IG9iamVjdCB0byByZXByZXNlbnQgdGhpcyBmaWVsZC4KLSAgICAgICAgICAgIGZpZWxkX3ZhbHVlID0gZmllbGQuX2RlZmF1bHRfY29uc3RydWN0b3Ioc2VsZikKLSAgICAgICAgICAgIGZpZWxkc1tmaWVsZF0gPSBmaWVsZF92YWx1ZQotICAgICAgICAgIGZpZWxkX3ZhbHVlLk1lcmdlRnJvbSh2YWx1ZSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHNlbGYuX2ZpZWxkc1tmaWVsZF0gPSB2YWx1ZQotICBjbHMuTWVyZ2VGcm9tID0gTWVyZ2VGcm9tCi0KLQotZGVmIF9BZGRNZXNzYWdlTWV0aG9kcyhtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscyk6Ci0gICIiIkFkZHMgaW1wbGVtZW50YXRpb25zIG9mIGFsbCBNZXNzYWdlIG1ldGhvZHMgdG8gY2xzLiIiIgotICBfQWRkTGlzdEZpZWxkc01ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZEhhc0ZpZWxkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkQ2xlYXJGaWVsZE1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgaWYgbWVzc2FnZV9kZXNjcmlwdG9yLmlzX2V4dGVuZGFibGU6Ci0gICAgX0FkZENsZWFyRXh0ZW5zaW9uTWV0aG9kKGNscykKLSAgICBfQWRkSGFzRXh0ZW5zaW9uTWV0aG9kKGNscykKLSAgX0FkZENsZWFyTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkRXF1YWxzTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkU3RyTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkVW5pY29kZU1ldGhvZChtZXNzYWdlX2Rlc2NyaXB0b3IsIGNscykKLSAgX0FkZFNldExpc3RlbmVyTWV0aG9kKGNscykKLSAgX0FkZEJ5dGVTaXplTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkU2VyaWFsaXplVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRNZXJnZUZyb21TdHJpbmdNZXRob2QobWVzc2FnZV9kZXNjcmlwdG9yLCBjbHMpCi0gIF9BZGRJc0luaXRpYWxpemVkTWV0aG9kKG1lc3NhZ2VfZGVzY3JpcHRvciwgY2xzKQotICBfQWRkTWVyZ2VGcm9tTWV0aG9kKGNscykKLQotCi1kZWYgX0FkZFByaXZhdGVIZWxwZXJNZXRob2RzKGNscyk6Ci0gICIiIkFkZHMgaW1wbGVtZW50YXRpb24gb2YgcHJpdmF0ZSBoZWxwZXIgbWV0aG9kcyB0byBjbHMuIiIiCi0KLSAgZGVmIE1vZGlmaWVkKHNlbGYpOgotICAgICIiIlNldHMgdGhlIF9jYWNoZWRfYnl0ZV9zaXplX2RpcnR5IGJpdCB0byB0cnVlLAotICAgIGFuZCBwcm9wYWdhdGVzIHRoaXMgdG8gb3VyIGxpc3RlbmVyIGlmZiB0aGlzIHdhcyBhIHN0YXRlIGNoYW5nZS4KLSAgICAiIiIKLQotICAgICMgTm90ZTogIFNvbWUgY2FsbGVycyBjaGVjayBfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSBiZWZvcmUgY2FsbGluZwotICAgICMgICBfTW9kaWZpZWQoKSBhcyBhbiBleHRyYSBvcHRpbWl6YXRpb24uICBTbywgaWYgdGhpcyBtZXRob2QgaXMgZXZlcgotICAgICMgICBjaGFuZ2VkIHN1Y2ggdGhhdCBpdCBkb2VzIHN0dWZmIGV2ZW4gd2hlbiBfY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eSBpcwotICAgICMgICBhbHJlYWR5IHRydWUsIHRoZSBjYWxsZXJzIG5lZWQgdG8gYmUgdXBkYXRlZC4KLSAgICBpZiBub3Qgc2VsZi5fY2FjaGVkX2J5dGVfc2l6ZV9kaXJ0eToKLSAgICAgIHNlbGYuX2NhY2hlZF9ieXRlX3NpemVfZGlydHkgPSBUcnVlCi0gICAgICBzZWxmLl9saXN0ZW5lcl9mb3JfY2hpbGRyZW4uZGlydHkgPSBUcnVlCi0gICAgICBzZWxmLl9pc19wcmVzZW50X2luX3BhcmVudCA9IFRydWUKLSAgICAgIHNlbGYuX2xpc3RlbmVyLk1vZGlmaWVkKCkKLQotICBjbHMuX01vZGlmaWVkID0gTW9kaWZpZWQKLSAgY2xzLlNldEluUGFyZW50ID0gTW9kaWZpZWQKLQotCi1jbGFzcyBfTGlzdGVuZXIob2JqZWN0KToKLQotICAiIiJNZXNzYWdlTGlzdGVuZXIgaW1wbGVtZW50YXRpb24gdGhhdCBhIHBhcmVudCBtZXNzYWdlIHJlZ2lzdGVycyB3aXRoIGl0cwotICBjaGlsZCBtZXNzYWdlLgotCi0gIEluIG9yZGVyIHRvIHN1cHBvcnQgc2VtYW50aWNzIGxpa2U6Ci0KLSAgICBmb28uYmFyLmJhei5xdXggPSAyMwotICAgIGFzc2VydCBmb28uSGFzRmllbGQoJ2JhcicpCi0KLSAgLi4uY2hpbGQgb2JqZWN0cyBtdXN0IGhhdmUgYmFjayByZWZlcmVuY2VzIHRvIHRoZWlyIHBhcmVudHMuCi0gIFRoaXMgaGVscGVyIGNsYXNzIGlzIGF0IHRoZSBoZWFydCBvZiB0aGlzIHN1cHBvcnQuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBwYXJlbnRfbWVzc2FnZSk6Ci0gICAgIiIiQXJnczoKLSAgICAgIHBhcmVudF9tZXNzYWdlOiBUaGUgbWVzc2FnZSB3aG9zZSBfTW9kaWZpZWQoKSBtZXRob2Qgd2Ugc2hvdWxkIGNhbGwgd2hlbgotICAgICAgICB3ZSByZWNlaXZlIE1vZGlmaWVkKCkgbWVzc2FnZXMuCi0gICAgIiIiCi0gICAgIyBUaGlzIGxpc3RlbmVyIGVzdGFibGlzaGVzIGEgYmFjayByZWZlcmVuY2UgZnJvbSBhIGNoaWxkIChjb250YWluZWQpIG9iamVjdAotICAgICMgdG8gaXRzIHBhcmVudCAoY29udGFpbmluZykgb2JqZWN0LiAgV2UgbWFrZSB0aGlzIGEgd2VhayByZWZlcmVuY2UgdG8gYXZvaWQKLSAgICAjIGNyZWF0aW5nIGN5Y2xpYyBnYXJiYWdlIHdoZW4gdGhlIGNsaWVudCBmaW5pc2hlcyB3aXRoIHRoZSAncGFyZW50JyBvYmplY3QKLSAgICAjIGluIHRoZSB0cmVlLgotICAgIGlmIGlzaW5zdGFuY2UocGFyZW50X21lc3NhZ2UsIHdlYWtyZWYuUHJveHlUeXBlKToKLSAgICAgIHNlbGYuX3BhcmVudF9tZXNzYWdlX3dlYWtyZWYgPSBwYXJlbnRfbWVzc2FnZQotICAgIGVsc2U6Ci0gICAgICBzZWxmLl9wYXJlbnRfbWVzc2FnZV93ZWFrcmVmID0gd2Vha3JlZi5wcm94eShwYXJlbnRfbWVzc2FnZSkKLQotICAgICMgQXMgYW4gb3B0aW1pemF0aW9uLCB3ZSBhbHNvIGluZGljYXRlIGRpcmVjdGx5IG9uIHRoZSBsaXN0ZW5lciB3aGV0aGVyCi0gICAgIyBvciBub3QgdGhlIHBhcmVudCBtZXNzYWdlIGlzIGRpcnR5LiAgVGhpcyB3YXkgd2UgY2FuIGF2b2lkIHRyYXZlcnNpbmcKLSAgICAjIHVwIHRoZSB0cmVlIGluIHRoZSBjb21tb24gY2FzZS4KLSAgICBzZWxmLmRpcnR5ID0gRmFsc2UKLQotICBkZWYgTW9kaWZpZWQoc2VsZik6Ci0gICAgaWYgc2VsZi5kaXJ0eToKLSAgICAgIHJldHVybgotICAgIHRyeToKLSAgICAgICMgUHJvcGFnYXRlIHRoZSBzaWduYWwgdG8gb3VyIHBhcmVudHMgaWZmIHRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIHNldC4KLSAgICAgIHNlbGYuX3BhcmVudF9tZXNzYWdlX3dlYWtyZWYuX01vZGlmaWVkKCkKLSAgICBleGNlcHQgUmVmZXJlbmNlRXJyb3I6Ci0gICAgICAjIFdlIGNhbiBnZXQgaGVyZSBpZiBhIGNsaWVudCBoYXMga2VwdCBhIHJlZmVyZW5jZSB0byBhIGNoaWxkIG9iamVjdCwKLSAgICAgICMgYW5kIGlzIG5vdyBzZXR0aW5nIGEgZmllbGQgb24gaXQsIGJ1dCB0aGUgY2hpbGQncyBwYXJlbnQgaGFzIGJlZW4KLSAgICAgICMgZ2FyYmFnZS1jb2xsZWN0ZWQuICBUaGlzIGlzIG5vdCBhbiBlcnJvci4KLSAgICAgIHBhc3MKLQotCi0jIFRPRE8ocm9iaW5zb24pOiBNb3ZlIGVsc2V3aGVyZT8gIFRoaXMgZmlsZSBpcyBnZXR0aW5nIHByZXR0eSByaWRpY3Vsb3VzLi4uCi0jIFRPRE8ocm9iaW5zb24pOiBVbmlmeSBlcnJvciBoYW5kbGluZyBvZiAidW5rbm93biBleHRlbnNpb24iIGNyYXAuCi0jIFRPRE8ocm9iaW5zb24pOiBTdXBwb3J0IGl0ZXJpdGVtcygpLXN0eWxlIGl0ZXJhdGlvbiBvdmVyIGFsbAotIyBleHRlbnNpb25zIHdpdGggdGhlICJoYXMiIGJpdHMgdHVybmVkIG9uPwotY2xhc3MgX0V4dGVuc2lvbkRpY3Qob2JqZWN0KToKLQotICAiIiJEaWN0LWxpa2UgY29udGFpbmVyIGZvciBzdXBwb3J0aW5nIGFuIGluZGV4YWJsZSAiRXh0ZW5zaW9ucyIKLSAgZmllbGQgb24gcHJvdG8gaW5zdGFuY2VzLgotCi0gIE5vdGUgdGhhdCBpbiBhbGwgY2FzZXMgd2UgZXhwZWN0IGV4dGVuc2lvbiBoYW5kbGVzIHRvIGJlCi0gIEZpZWxkRGVzY3JpcHRvcnMuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBleHRlbmRlZF9tZXNzYWdlKToKLSAgICAiIiJleHRlbmRlZF9tZXNzYWdlOiBNZXNzYWdlIGluc3RhbmNlIGZvciB3aGljaCB3ZSBhcmUgdGhlIEV4dGVuc2lvbnMgZGljdC4KLSAgICAiIiIKLQotICAgIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UgPSBleHRlbmRlZF9tZXNzYWdlCi0KLSAgZGVmIF9fZ2V0aXRlbV9fKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgotICAgICIiIlJldHVybnMgdGhlIGN1cnJlbnQgdmFsdWUgb2YgdGhlIGdpdmVuIGV4dGVuc2lvbiBoYW5kbGUuIiIiCi0KLSAgICBfVmVyaWZ5RXh0ZW5zaW9uSGFuZGxlKHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UsIGV4dGVuc2lvbl9oYW5kbGUpCi0KLSAgICByZXN1bHQgPSBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHMuZ2V0KGV4dGVuc2lvbl9oYW5kbGUpCi0gICAgaWYgcmVzdWx0IGlzIG5vdCBOb25lOgotICAgICAgcmV0dXJuIHJlc3VsdAotCi0gICAgaWYgZXh0ZW5zaW9uX2hhbmRsZS5sYWJlbCA9PSBfRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgICAgcmVzdWx0ID0gZXh0ZW5zaW9uX2hhbmRsZS5fZGVmYXVsdF9jb25zdHJ1Y3RvcihzZWxmLl9leHRlbmRlZF9tZXNzYWdlKQotICAgIGVsaWYgZXh0ZW5zaW9uX2hhbmRsZS5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICAgIHJlc3VsdCA9IGV4dGVuc2lvbl9oYW5kbGUubWVzc2FnZV90eXBlLl9jb25jcmV0ZV9jbGFzcygpCi0gICAgICB0cnk6Ci0gICAgICAgIHJlc3VsdC5fU2V0TGlzdGVuZXIoc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5fbGlzdGVuZXJfZm9yX2NoaWxkcmVuKQotICAgICAgZXhjZXB0IFJlZmVyZW5jZUVycm9yOgotICAgICAgICBwYXNzCi0gICAgZWxzZToKLSAgICAgICMgU2luZ3VsYXIgc2NhbGFyIC0tIGp1c3QgcmV0dXJuIHRoZSBkZWZhdWx0IHdpdGhvdXQgaW5zZXJ0aW5nIGludG8gdGhlCi0gICAgICAjIGRpY3QuCi0gICAgICByZXR1cm4gZXh0ZW5zaW9uX2hhbmRsZS5kZWZhdWx0X3ZhbHVlCi0KLSAgICAjIEF0b21pY2FsbHkgY2hlY2sgaWYgYW5vdGhlciB0aHJlYWQgaGFzIHByZWVtcHRlZCB1cyBhbmQsIGlmIG5vdCwgc3dhcAotICAgICMgaW4gdGhlIG5ldyBvYmplY3Qgd2UganVzdCBjcmVhdGVkLiAgSWYgc29tZW9uZSBoYXMgcHJlZW1wdGVkIHVzLCB3ZQotICAgICMgdGFrZSB0aGF0IG9iamVjdCBhbmQgZGlzY2FyZCBvdXJzLgotICAgICMgV0FSTklORzogIFdlIGFyZSByZWx5aW5nIG9uIHNldGRlZmF1bHQoKSBiZWluZyBhdG9taWMuICBUaGlzIGlzIHRydWUKLSAgICAjICAgaW4gQ1B5dGhvbiBidXQgd2UgaGF2ZW4ndCBpbnZlc3RpZ2F0ZWQgb3RoZXJzLiAgVGhpcyB3YXJuaW5nIGFwcGVhcnMKLSAgICAjICAgaW4gc2V2ZXJhbCBvdGhlciBsb2NhdGlvbnMgaW4gdGhpcyBmaWxlLgotICAgIHJlc3VsdCA9IHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX2ZpZWxkcy5zZXRkZWZhdWx0KAotICAgICAgICBleHRlbnNpb25faGFuZGxlLCByZXN1bHQpCi0KLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcik6Ci0gICAgaWYgbm90IGlzaW5zdGFuY2Uob3RoZXIsIHNlbGYuX19jbGFzc19fKToKLSAgICAgIHJldHVybiBGYWxzZQotCi0gICAgbXlfZmllbGRzID0gc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZS5MaXN0RmllbGRzKCkKLSAgICBvdGhlcl9maWVsZHMgPSBvdGhlci5fZXh0ZW5kZWRfbWVzc2FnZS5MaXN0RmllbGRzKCkKLQotICAgICMgR2V0IHJpZCBvZiBub24tZXh0ZW5zaW9uIGZpZWxkcy4KLSAgICBteV9maWVsZHMgICAgPSBbIGZpZWxkIGZvciBmaWVsZCBpbiBteV9maWVsZHMgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uIF0KLSAgICBvdGhlcl9maWVsZHMgPSBbIGZpZWxkIGZvciBmaWVsZCBpbiBvdGhlcl9maWVsZHMgaWYgZmllbGQuaXNfZXh0ZW5zaW9uIF0KLQotICAgIHJldHVybiBteV9maWVsZHMgPT0gb3RoZXJfZmllbGRzCi0KLSAgZGVmIF9fbmVfXyhzZWxmLCBvdGhlcik6Ci0gICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyCi0KLSAgZGVmIF9faGFzaF9fKHNlbGYpOgotICAgIHJhaXNlIFR5cGVFcnJvcigndW5oYXNoYWJsZSBvYmplY3QnKQotCi0gICMgTm90ZSB0aGF0IHRoaXMgaXMgb25seSBtZWFuaW5nZnVsIGZvciBub24tcmVwZWF0ZWQsIHNjYWxhciBleHRlbnNpb24KLSAgIyBmaWVsZHMuICBOb3RlIGFsc28gdGhhdCB3ZSBtYXkgaGF2ZSB0byBjYWxsIF9Nb2RpZmllZCgpIHdoZW4gd2UgZG8KLSAgIyBzdWNjZXNzZnVsbHkgc2V0IGEgZmllbGQgdGhpcyB3YXksIHRvIHNldCBhbnkgbmVjc3NhcnkgImhhcyIgYml0cyBpbiB0aGUKLSAgIyBhbmNlc3RvcnMgb2YgdGhlIGV4dGVuZGVkIG1lc3NhZ2UuCi0gIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBleHRlbnNpb25faGFuZGxlLCB2YWx1ZSk6Ci0gICAgIiIiSWYgZXh0ZW5zaW9uX2hhbmRsZSBzcGVjaWZpZXMgYSBub24tcmVwZWF0ZWQsIHNjYWxhciBleHRlbnNpb24KLSAgICBmaWVsZCwgc2V0cyB0aGUgdmFsdWUgb2YgdGhhdCBmaWVsZC4KLSAgICAiIiIKLQotICAgIF9WZXJpZnlFeHRlbnNpb25IYW5kbGUoc2VsZi5fZXh0ZW5kZWRfbWVzc2FnZSwgZXh0ZW5zaW9uX2hhbmRsZSkKLQotICAgIGlmIChleHRlbnNpb25faGFuZGxlLmxhYmVsID09IF9GaWVsZERlc2NyaXB0b3IuTEFCRUxfUkVQRUFURUQgb3IKLSAgICAgICAgZXh0ZW5zaW9uX2hhbmRsZS5jcHBfdHlwZSA9PSBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRSk6Ci0gICAgICByYWlzZSBUeXBlRXJyb3IoCi0gICAgICAgICAgJ0Nhbm5vdCBhc3NpZ24gdG8gZXh0ZW5zaW9uICIlcyIgYmVjYXVzZSBpdCBpcyBhIHJlcGVhdGVkIG9yICcKLSAgICAgICAgICAnY29tcG9zaXRlIHR5cGUuJyAlIGV4dGVuc2lvbl9oYW5kbGUuZnVsbF9uYW1lKQotCi0gICAgIyBJdCdzIHNsaWdodGx5IHdhc3RlZnVsIHRvIGxvb2t1cCB0aGUgdHlwZSBjaGVja2VyIGVhY2ggdGltZSwKLSAgICAjIGJ1dCB3ZSBleHBlY3QgdGhpcyB0byBiZSBhIHZhbmlzaGluZ2x5IHVuY29tbW9uIGNhc2UgYW55d2F5LgotICAgIHR5cGVfY2hlY2tlciA9IHR5cGVfY2hlY2tlcnMuR2V0VHlwZUNoZWNrZXIoCi0gICAgICAgIGV4dGVuc2lvbl9oYW5kbGUuY3BwX3R5cGUsIGV4dGVuc2lvbl9oYW5kbGUudHlwZSkKLSAgICB0eXBlX2NoZWNrZXIuQ2hlY2tWYWx1ZSh2YWx1ZSkKLSAgICBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9maWVsZHNbZXh0ZW5zaW9uX2hhbmRsZV0gPSB2YWx1ZQotICAgIHNlbGYuX2V4dGVuZGVkX21lc3NhZ2UuX01vZGlmaWVkKCkKLQotICBkZWYgX0ZpbmRFeHRlbnNpb25CeU5hbWUoc2VsZiwgbmFtZSk6Ci0gICAgIiIiVHJpZXMgdG8gZmluZCBhIGtub3duIGV4dGVuc2lvbiB3aXRoIHRoZSBzcGVjaWZpZWQgbmFtZS4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBFeHRlbnNpb24gZnVsbCBuYW1lLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEV4dGVuc2lvbiBmaWVsZCBkZXNjcmlwdG9yLgotICAgICIiIgotICAgIHJldHVybiBzZWxmLl9leHRlbmRlZF9tZXNzYWdlLl9leHRlbnNpb25zX2J5X25hbWUuZ2V0KG5hbWUsIE5vbmUpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9yZWZsZWN0aW9uX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9yZWZsZWN0aW9uX3Rlc3QucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDdiOWQzMzkuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvcmVmbGVjdGlvbl90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjQyMSArMCwwIEBACi0jISAvdXNyL2Jpbi9weXRob24KLSMgLSotIGNvZGluZzogdXRmLTggLSotCi0jCi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVW5pdHRlc3QgZm9yIHJlZmxlY3Rpb24ucHksIHdoaWNoIGFsc28gaW5kaXJlY3RseSB0ZXN0cyB0aGUgb3V0cHV0IG9mIHRoZQotcHVyZS1QeXRob24gcHJvdG9jb2wgY29tcGlsZXIuCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotaW1wb3J0IG9wZXJhdG9yCi1pbXBvcnQgc3RydWN0Ci0KLWltcG9ydCB1bml0dGVzdAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9tc2V0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3JfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IG1lc3NhZ2UKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgbW9yZV9leHRlbnNpb25zX3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IG1vcmVfbWVzc2FnZXNfcGIyCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgd2lyZV9mb3JtYXQKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB0ZXN0X3V0aWwKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBkZWNvZGVyCi0KLQotY2xhc3MgX01pbmlEZWNvZGVyKG9iamVjdCk6Ci0gICIiIkRlY29kZXMgYSBzdHJlYW0gb2YgdmFsdWVzIGZyb20gYSBzdHJpbmcuCi0KLSAgT25jZSB1cG9uIGEgdGltZSB3ZSBhY3R1YWxseSBoYWQgYSBjbGFzcyBjYWxsZWQgZGVjb2Rlci5EZWNvZGVyLiAgVGhlbiB3ZQotICBnb3QgcmlkIG9mIGl0IGR1cmluZyBhIHJlZGVzaWduIHRoYXQgbWFkZSBkZWNvZGluZyBtdWNoLCBtdWNoIGZhc3RlciBvdmVyYWxsLgotICBCdXQgYSBjb3VwbGUgdGVzdHMgaW4gdGhpcyBmaWxlIHVzZWQgaXQgdG8gY2hlY2sgdGhhdCB0aGUgc2VyaWFsaXplZCBmb3JtIG9mCi0gIGEgbWVzc2FnZSB3YXMgY29ycmVjdC4gIFNvLCB0aGlzIGNsYXNzIGltcGxlbWVudHMganVzdCB0aGUgbWV0aG9kcyB0aGF0IHdlcmUKLSAgdXNlZCBieSBzYWlkIHRlc3RzLCBzbyB0aGF0IHdlIGRvbid0IGhhdmUgdG8gcmV3cml0ZSB0aGUgdGVzdHMuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBieXRlcyk6Ci0gICAgc2VsZi5fYnl0ZXMgPSBieXRlcwotICAgIHNlbGYuX3BvcyA9IDAKLQotICBkZWYgUmVhZFZhcmludChzZWxmKToKLSAgICByZXN1bHQsIHNlbGYuX3BvcyA9IGRlY29kZXIuX0RlY29kZVZhcmludChzZWxmLl9ieXRlcywgc2VsZi5fcG9zKQotICAgIHJldHVybiByZXN1bHQKLQotICBSZWFkSW50MzIgPSBSZWFkVmFyaW50Ci0gIFJlYWRJbnQ2NCA9IFJlYWRWYXJpbnQKLSAgUmVhZFVJbnQzMiA9IFJlYWRWYXJpbnQKLSAgUmVhZFVJbnQ2NCA9IFJlYWRWYXJpbnQKLQotICBkZWYgUmVhZFNJbnQ2NChzZWxmKToKLSAgICByZXR1cm4gd2lyZV9mb3JtYXQuWmlnWmFnRGVjb2RlKHNlbGYuUmVhZFZhcmludCgpKQotCi0gIFJlYWRTSW50MzIgPSBSZWFkU0ludDY0Ci0KLSAgZGVmIFJlYWRGaWVsZE51bWJlckFuZFdpcmVUeXBlKHNlbGYpOgotICAgIHJldHVybiB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcoc2VsZi5SZWFkVmFyaW50KCkpCi0KLSAgZGVmIFJlYWRGbG9hdChzZWxmKToKLSAgICByZXN1bHQgPSBzdHJ1Y3QudW5wYWNrKCI8ZiIsIHNlbGYuX2J5dGVzW3NlbGYuX3BvczpzZWxmLl9wb3MrNF0pWzBdCi0gICAgc2VsZi5fcG9zICs9IDQKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIFJlYWREb3VibGUoc2VsZik6Ci0gICAgcmVzdWx0ID0gc3RydWN0LnVucGFjaygiPGQiLCBzZWxmLl9ieXRlc1tzZWxmLl9wb3M6c2VsZi5fcG9zKzhdKVswXQotICAgIHNlbGYuX3BvcyArPSA4Ci0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBFbmRPZlN0cmVhbShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5fcG9zID09IGxlbihzZWxmLl9ieXRlcykKLQotCi1jbGFzcyBSZWZsZWN0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIGFzc2VydExpc3RzRXF1YWwoc2VsZiwgdmFsdWVzLCBvdGhlcnMpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwobGVuKHZhbHVlcyksIGxlbihvdGhlcnMpKQotICAgIGZvciBpIGluIHJhbmdlKGxlbih2YWx1ZXMpKToKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodmFsdWVzW2ldLCBvdGhlcnNbaV0pCi0KLSAgZGVmIHRlc3RTY2FsYXJDb25zdHJ1Y3RvcihzZWxmKToKLSAgICAjIENvbnN0cnVjdG9yIHdpdGggb25seSBzY2FsYXIgdHlwZXMgc2hvdWxkIHN1Y2NlZWQuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAotICAgICAgICBvcHRpb25hbF9pbnQzMj0yNCwKLSAgICAgICAgb3B0aW9uYWxfZG91YmxlPTU0LjMyMSwKLSAgICAgICAgb3B0aW9uYWxfc3RyaW5nPSdvcHRpb25hbF9zdHJpbmcnKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyNCwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1NC4zMjEsIHByb3RvLm9wdGlvbmFsX2RvdWJsZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvcHRpb25hbF9zdHJpbmcnLCBwcm90by5vcHRpb25hbF9zdHJpbmcpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhckNvbnN0cnVjdG9yKHNlbGYpOgotICAgICMgQ29uc3RydWN0b3Igd2l0aCBvbmx5IHJlcGVhdGVkIHNjYWxhciB0eXBlcyBzaG91bGQgc3VjY2VlZC4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCi0gICAgICAgIHJlcGVhdGVkX2ludDMyPVsxLCAyLCAzLCA0XSwKLSAgICAgICAgcmVwZWF0ZWRfZG91YmxlPVsxLjIzLCA1NC4zMjFdLAotICAgICAgICByZXBlYXRlZF9ib29sPVtUcnVlLCBGYWxzZSwgRmFsc2VdLAotICAgICAgICByZXBlYXRlZF9zdHJpbmc9WyJvcHRpb25hbF9zdHJpbmciXSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKFsxLCAyLCAzLCA0XSwgbGlzdChwcm90by5yZXBlYXRlZF9pbnQzMikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoWzEuMjMsIDU0LjMyMV0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfZG91YmxlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhbVHJ1ZSwgRmFsc2UsIEZhbHNlXSwgbGlzdChwcm90by5yZXBlYXRlZF9ib29sKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhbIm9wdGlvbmFsX3N0cmluZyJdLCBsaXN0KHByb3RvLnJlcGVhdGVkX3N0cmluZykpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZENvbXBvc2l0ZUNvbnN0cnVjdG9yKHNlbGYpOgotICAgICMgQ29uc3RydWN0b3Igd2l0aCBvbmx5IHJlcGVhdGVkIGNvbXBvc2l0ZSB0eXBlcyBzaG91bGQgc3VjY2VlZC4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCi0gICAgICAgIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlPVsKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTyksCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoCi0gICAgICAgICAgICAgICAgYmI9dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVIpXSwKLSAgICAgICAgcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlPVsKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPS00MyksCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz00NTMyNCksCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xMildLAotICAgICAgICByZXBlYXRlZGdyb3VwPVsKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cCgpLAotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKGE9MSksCi0gICAgICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoYT0yKV0pCi0KLSAgICBzZWxmLmFzc2VydEVxdWFscygKLSAgICAgICAgW3VuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PKSwKLSAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUildLAotICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscygKLSAgICAgICAgW3VuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPS00MyksCi0gICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz00NTMyNCksCi0gICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xMildLAotICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoCi0gICAgICAgIFt1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJlcGVhdGVkR3JvdXAoKSwKLSAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUmVwZWF0ZWRHcm91cChhPTEpLAotICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5SZXBlYXRlZEdyb3VwKGE9MildLAotICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkZ3JvdXApKQotCi0gIGRlZiB0ZXN0TWl4ZWRDb25zdHJ1Y3RvcihzZWxmKToKLSAgICAjIENvbnN0cnVjdG9yIHdpdGggb25seSBtaXhlZCB0eXBlcyBzaG91bGQgc3VjY2VlZC4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCi0gICAgICAgIG9wdGlvbmFsX2ludDMyPTI0LAotICAgICAgICBvcHRpb25hbF9zdHJpbmc9J29wdGlvbmFsX3N0cmluZycsCi0gICAgICAgIHJlcGVhdGVkX2RvdWJsZT1bMS4yMywgNTQuMzIxXSwKLSAgICAgICAgcmVwZWF0ZWRfYm9vbD1bVHJ1ZSwgRmFsc2UsIEZhbHNlXSwKLSAgICAgICAgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9WwotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKAotICAgICAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PKSwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUildLAotICAgICAgICByZXBlYXRlZF9mb3JlaWduX21lc3NhZ2U9WwotICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKGM9LTQzKSwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTQ1MzI0KSwKLSAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPTEyKV0pCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDI0LCBwcm90by5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdvcHRpb25hbF9zdHJpbmcnLCBwcm90by5vcHRpb25hbF9zdHJpbmcpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoWzEuMjMsIDU0LjMyMV0sIGxpc3QocHJvdG8ucmVwZWF0ZWRfZG91YmxlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhbVHJ1ZSwgRmFsc2UsIEZhbHNlXSwgbGlzdChwcm90by5yZXBlYXRlZF9ib29sKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscygKLSAgICAgICAgW3VuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgIGJiPXVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuRk9PKSwKLSAgICAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSgKLSAgICAgICAgICAgICBiYj11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUildLAotICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscygKLSAgICAgICAgW3VuaXR0ZXN0X3BiMi5Gb3JlaWduTWVzc2FnZShjPS00MyksCi0gICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz00NTMyNCksCi0gICAgICAgICB1bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xMildLAotICAgICAgICBsaXN0KHByb3RvLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSkpCi0KLSAgZGVmIHRlc3RDb25zdHJ1Y3RvclR5cGVFcnJvcihzZWxmKToKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBvcHRpb25hbF9pbnQzMj0iZm9vIikKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBvcHRpb25hbF9zdHJpbmc9MTIzNCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT0xMjM0KQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX2ludDMyPTEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoCi0gICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfaW50MzI9WyJmb28iXSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9zdHJpbmc9MTIzNCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcygKLSAgICAgICAgVHlwZUVycm9yLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLCByZXBlYXRlZF9zdHJpbmc9WzEyMzRdKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKAotICAgICAgICBUeXBlRXJyb3IsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMsIHJlcGVhdGVkX25lc3RlZF9tZXNzYWdlPTEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoCi0gICAgICAgIFR5cGVFcnJvciwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcywgcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2U9WzEyMzRdKQotCi0gIGRlZiB0ZXN0Q29uc3RydWN0b3JJbnZhbGlkYXRlc0NhY2hlZEJ5dGVTaXplKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKG9wdGlvbmFsX2ludDMyID0gMTIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoMiwgbWVzc2FnZS5CeXRlU2l6ZSgpKQotCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoCi0gICAgICAgIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5CeXRlU2l6ZSgpKQotCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMocmVwZWF0ZWRfaW50MzIgPSBbMTJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKDMsIG1lc3NhZ2UuQnl0ZVNpemUoKSkKLQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKAotICAgICAgICByZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA9IFt1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoMywgbWVzc2FnZS5CeXRlU2l6ZSgpKQotCi0gIGRlZiB0ZXN0U2ltcGxlSGFzQml0cyhzZWxmKToKLSAgICAjIFRlc3QgYSBzY2FsYXIuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9pbnQzMicpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCi0gICAgIyBIYXNGaWVsZCgpIHNob3VsZG4ndCBiZSB0cnVlIGlmIGFsbCB3ZSd2ZSBkb25lIGlzCi0gICAgIyByZWFkIHRoZSBkZWZhdWx0IHZhbHVlLgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCi0gICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgIyBTZXR0aW5nIGEgdmFsdWUgaG93ZXZlciAqc2hvdWxkKiBzZXQgdGhlICJoYXMiIGJpdC4KLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCi0gICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgICMgQW5kIGNsZWFyaW5nIHRoYXQgdmFsdWUgc2hvdWxkIHVuc2V0IHRoZSAiaGFzIiBiaXQuCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLQotICBkZWYgdGVzdEhhc0JpdHNXaXRoU2luZ2x5TmVzdGVkU2NhbGFyKHNlbGYpOgotICAgICMgSGVscGVyIHVzZWQgdG8gdGVzdCBmb3JlaWduIG1lc3NhZ2VzIGFuZCBncm91cHMuCi0gICAgIwotICAgICMgY29tcG9zaXRlX2ZpZWxkX25hbWUgc2hvdWxkIGJlIHRoZSBuYW1lIG9mIGEgbm9uLXJlcGVhdGVkCi0gICAgIyBjb21wb3NpdGUgKGkuZS4sIGZvcmVpZ24gb3IgZ3JvdXApIGZpZWxkIGluIFRlc3RBbGxUeXBlcywKLSAgICAjIGFuZCBzY2FsYXJfZmllbGRfbmFtZSBzaG91bGQgYmUgdGhlIG5hbWUgb2YgYW4gaW50ZWdlci12YWx1ZWQKLSAgICAjIHNjYWxhciBmaWVsZCB3aXRoaW4gdGhhdCBjb21wb3NpdGUuCi0gICAgIwotICAgICMgSSBuZXZlciB0aG91Z2h0IEknZCBtaXNzIEMrKyBtYWNyb3MgYW5kIHRlbXBsYXRlcyBzbyBtdWNoLiA6KAotICAgICMgVGhpcyBoZWxwZXIgaXMgc2VtYW50aWNhbGx5IGp1c3Q6Ci0gICAgIwotICAgICMgICBhc3NlcnQgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLnNjYWxhcl9maWVsZCA9PSAwCi0gICAgIyAgIGFzc2VydCBub3QgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKCdzY2FsYXJfZmllbGQnKQotICAgICMgICBhc3NlcnQgbm90IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQotICAgICMKLSAgICAjICAgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLnNjYWxhcl9maWVsZCA9IDEwCi0gICAgIyAgIG9sZF9jb21wb3NpdGVfZmllbGQgPSBwcm90by5jb21wb3NpdGVfZmllbGQKLSAgICAjCi0gICAgIyAgIGFzc2VydCBwcm90by5jb21wb3NpdGVfZmllbGQuc2NhbGFyX2ZpZWxkID09IDEwCi0gICAgIyAgIGFzc2VydCBwcm90by5jb21wb3NpdGVfZmllbGQuSGFzRmllbGQoJ3NjYWxhcl9maWVsZCcpCi0gICAgIyAgIGFzc2VydCBwcm90by5IYXNGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKLSAgICAjCi0gICAgIyAgIHByb3RvLkNsZWFyRmllbGQoJ2NvbXBvc2l0ZV9maWVsZCcpCi0gICAgIwotICAgICMgICBhc3NlcnQgbm90IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZCgnc2NhbGFyX2ZpZWxkJykKLSAgICAjICAgYXNzZXJ0IG5vdCBwcm90by5IYXNGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykKLSAgICAjICAgYXNzZXJ0IHByb3RvLmNvbXBvc2l0ZV9maWVsZC5zY2FsYXJfZmllbGQgPT0gMAotICAgICMKLSAgICAjICAgIyBOb3cgZW5zdXJlIHRoYXQgQ2xlYXJGaWVsZCgnY29tcG9zaXRlX2ZpZWxkJykgZGlzY29ubmVjdGVkCi0gICAgIyAgICMgdGhlIG9sZCBmaWVsZCBvYmplY3QgZnJvbSB0aGUgb2JqZWN0IHRyZWUuLi4KLSAgICAjICAgYXNzZXJ0IG9sZF9jb21wb3NpdGVfZmllbGQgaXMgbm90IHByb3RvLmNvbXBvc2l0ZV9maWVsZAotICAgICMgICBvbGRfY29tcG9zaXRlX2ZpZWxkLnNjYWxhcl9maWVsZCA9IDIwCi0gICAgIyAgIGFzc2VydCBub3QgcHJvdG8uY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKCdzY2FsYXJfZmllbGQnKQotICAgICMgICBhc3NlcnQgbm90IHByb3RvLkhhc0ZpZWxkKCdjb21wb3NpdGVfZmllbGQnKQotICAgIGRlZiBUZXN0Q29tcG9zaXRlSGFzQml0cyhjb21wb3NpdGVfZmllbGRfbmFtZSwgc2NhbGFyX2ZpZWxkX25hbWUpOgotICAgICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICAgICMgRmlyc3QsIGNoZWNrIHRoYXQgd2UgY2FuIGdldCB0aGUgc2NhbGFyIHZhbHVlLCBhbmQgc2VlIHRoYXQgaXQncyB0aGUKLSAgICAgICMgZGVmYXVsdCAoMCksIGJ1dCB0aGF0IHByb3RvLkhhc0ZpZWxkKCdvbXBvc2l0ZScpIGFuZAotICAgICAgIyBwcm90by5jb21wb3NpdGUuSGFzRmllbGQoJ3NjYWxhcicpIHdpbGwgc3RpbGwgcmV0dXJuIEZhbHNlLgotICAgICAgY29tcG9zaXRlX2ZpZWxkID0gZ2V0YXR0cihwcm90bywgY29tcG9zaXRlX2ZpZWxkX25hbWUpCi0gICAgICBvcmlnaW5hbF9zY2FsYXJfdmFsdWUgPSBnZXRhdHRyKGNvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIG9yaWdpbmFsX3NjYWxhcl92YWx1ZSkKLSAgICAgICMgQXNzZXJ0IHRoYXQgdGhlIGNvbXBvc2l0ZSBvYmplY3QgZG9lcyBub3QgImhhdmUiIHRoZSBzY2FsYXIuCi0gICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZChzY2FsYXJfZmllbGRfbmFtZSkpCi0gICAgICAjIEFzc2VydCB0aGF0IHByb3RvIGRvZXMgbm90ICJoYXZlIiB0aGUgY29tcG9zaXRlIGZpZWxkLgotICAgICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZChjb21wb3NpdGVfZmllbGRfbmFtZSkpCi0KLSAgICAgICMgTm93IHNldCB0aGUgc2NhbGFyIHdpdGhpbiB0aGUgY29tcG9zaXRlIGZpZWxkLiAgRW5zdXJlIHRoYXQgdGhlIHNldHRpbmcKLSAgICAgICMgaXMgcmVmbGVjdGVkLCBhbmQgdGhhdCBwcm90by5IYXNGaWVsZCgnY29tcG9zaXRlJykgYW5kCi0gICAgICAjIHByb3RvLmNvbXBvc2l0ZS5IYXNGaWVsZCgnc2NhbGFyJykgbm93IGJvdGggcmV0dXJuIFRydWUuCi0gICAgICBuZXdfdmFsID0gMjAKLSAgICAgIHNldGF0dHIoY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSwgbmV3X3ZhbCkKLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwobmV3X3ZhbCwgZ2V0YXR0cihjb21wb3NpdGVfZmllbGQsIHNjYWxhcl9maWVsZF9uYW1lKSkKLSAgICAgICMgSG9sZCBvbiB0byBhIHJlZmVyZW5jZSB0byB0aGUgY3VycmVudCBjb21wb3NpdGVfZmllbGQgb2JqZWN0LgotICAgICAgb2xkX2NvbXBvc2l0ZV9maWVsZCA9IGNvbXBvc2l0ZV9maWVsZAotICAgICAgIyBBc3NlcnQgdGhhdCB0aGUgaGFzIG1ldGhvZHMgbm93IHJldHVybiB0cnVlLgotICAgICAgc2VsZi5hc3NlcnRUcnVlKGNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZChzY2FsYXJfZmllbGRfbmFtZSkpCi0gICAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoY29tcG9zaXRlX2ZpZWxkX25hbWUpKQotCi0gICAgICAjIE5vdyBjYWxsIHRoZSBjbGVhciBtZXRob2QuLi4KLSAgICAgIHByb3RvLkNsZWFyRmllbGQoY29tcG9zaXRlX2ZpZWxkX25hbWUpCi0KLSAgICAgICMgLi4uYW5kIGVuc3VyZSB0aGF0IHRoZSAiaGFzIiBiaXRzIGFyZSBhbGwgYmFjayB0byBGYWxzZS4uLgotICAgICAgY29tcG9zaXRlX2ZpZWxkID0gZ2V0YXR0cihwcm90bywgY29tcG9zaXRlX2ZpZWxkX25hbWUpCi0gICAgICBzZWxmLmFzc2VydFRydWUobm90IGNvbXBvc2l0ZV9maWVsZC5IYXNGaWVsZChzY2FsYXJfZmllbGRfbmFtZSkpCi0gICAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKGNvbXBvc2l0ZV9maWVsZF9uYW1lKSkKLSAgICAgICMgLi4uYW5kIGVuc3VyZSB0aGF0IHRoZSBzY2FsYXIgZmllbGQgaGFzIHJldHVybmVkIHRvIGl0cyBkZWZhdWx0LgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhdHRyKGNvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUpKQotCi0gICAgICAjIEZpbmFsbHksIGVuc3VyZSB0aGF0IG1vZGlmaWNhdGlvbnMgdG8gdGhlIG9sZCBjb21wb3NpdGUgZmllbGQgb2JqZWN0Ci0gICAgICAjIGRvbid0IGhhdmUgYW55IGVmZmVjdCBvbiB0aGUgcGFyZW50LiBQb3NzaWJsZSBvbmx5IHdpdGggdGhlIHB1cmUtcHl0aG9uCi0gICAgICAjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCi0gICAgICAjCi0gICAgICAjIChOT1RFIHRoYXQgd2hlbiB3ZSBjbGVhciB0aGUgY29tcG9zaXRlIGZpZWxkIGluIHRoZSBwYXJlbnQsIHdlIGFjdHVhbGx5Ci0gICAgICAjIGRvbid0IHJlY3Vyc2l2ZWx5IGNsZWFyIGRvd24gdGhlIHRyZWUuICBJbnN0ZWFkLCB3ZSBqdXN0IGRpc2Nvbm5lY3QgdGhlCi0gICAgICAjIGNsZWFyZWQgY29tcG9zaXRlIGZyb20gdGhlIHRyZWUuKQotICAgICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKLSAgICAgICAgcmV0dXJuCi0gICAgICBzZWxmLmFzc2VydFRydWUob2xkX2NvbXBvc2l0ZV9maWVsZCBpcyBub3QgY29tcG9zaXRlX2ZpZWxkKQotICAgICAgc2V0YXR0cihvbGRfY29tcG9zaXRlX2ZpZWxkLCBzY2FsYXJfZmllbGRfbmFtZSwgbmV3X3ZhbCkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgY29tcG9zaXRlX2ZpZWxkLkhhc0ZpZWxkKHNjYWxhcl9maWVsZF9uYW1lKSkKLSAgICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoY29tcG9zaXRlX2ZpZWxkX25hbWUpKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBnZXRhdHRyKGNvbXBvc2l0ZV9maWVsZCwgc2NhbGFyX2ZpZWxkX25hbWUpKQotCi0gICAgIyBUZXN0IHNpbXBsZSwgc2luZ2xlLWxldmVsIG5lc3Rpbmcgd2hlbiB3ZSBzZXQgYSBzY2FsYXIuCi0gICAgVGVzdENvbXBvc2l0ZUhhc0JpdHMoJ29wdGlvbmFsZ3JvdXAnLCAnYScpCi0gICAgVGVzdENvbXBvc2l0ZUhhc0JpdHMoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJywgJ2JiJykKLSAgICBUZXN0Q29tcG9zaXRlSGFzQml0cygnb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlJywgJ2MnKQotICAgIFRlc3RDb21wb3NpdGVIYXNCaXRzKCdvcHRpb25hbF9pbXBvcnRfbWVzc2FnZScsICdkJykKLQotICBkZWYgdGVzdFJlZmVyZW5jZXNUb05lc3RlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBuZXN0ZWQgPSBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQotICAgIGRlbCBwcm90bwotICAgICMgQSBwcmV2aW91cyB2ZXJzaW9uIGhhZCBhIGJ1ZyB3aGVyZSB0aGlzIHdvdWxkIHJhaXNlIGFuIGV4Y2VwdGlvbiB3aGVuCi0gICAgIyBoaXR0aW5nIGEgbm93LWRlYWQgd2VhayByZWZlcmVuY2UuCi0gICAgbmVzdGVkLmJiID0gMjMKLQotICBkZWYgdGVzdERpc2Nvbm5lY3RpbmdOZXN0ZWRNZXNzYWdlQmVmb3JlU2V0dGluZ0ZpZWxkKHNlbGYpOgotICAgIGlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgIT0gJ3B5dGhvbic6Ci0gICAgICByZXR1cm4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG5lc3RlZCA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCi0gICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSAgIyBTaG91bGQgZGlzY29ubmVjdCBmcm9tIHBhcmVudAotICAgIHNlbGYuYXNzZXJ0VHJ1ZShuZXN0ZWQgaXMgbm90IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKQotICAgIG5lc3RlZC5iYiA9IDIzCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotCi0gIGRlZiB0ZXN0SGFzQml0c1doZW5Nb2RpZnlpbmdSZXBlYXRlZEZpZWxkcyhzZWxmKToKLSAgICAjIFRlc3QgbmVzdGluZyB3aGVuIHdlIGFkZCBhbiBlbGVtZW50IHRvIGEgcmVwZWF0ZWQgZmllbGQgaW4gYSBzdWJtZXNzYWdlLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cygpCi0gICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UubmVzdGVkbWVzc2FnZV9yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICBbNV0sIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotCi0gICAgIyBEbyB0aGUgc2FtZSB0ZXN0LCBidXQgd2l0aCBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZCB3aXRoaW4gdGhlCi0gICAgIyBzdWJtZXNzYWdlLgotICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLm5lc3RlZG1lc3NhZ2VfcmVwZWF0ZWRfZm9yZWlnbm1lc3NhZ2UuYWRkKCkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgZGVmIHRlc3RIYXNCaXRzRm9yTWFueUxldmVsc09mTmVzdGluZyhzZWxmKToKLSAgICAjIFRlc3QgbmVzdGluZyBtYW55IGxldmVscyBkZWVwLgotICAgIHJlY3Vyc2l2ZV9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0TXV0dWFsUmVjdXJzaW9uQSgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCByZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCByZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcmVjdXJzaXZlX3Byb3RvLkhhc0ZpZWxkKCdiYicpKQotICAgIHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIub3B0aW9uYWxfaW50MzIgPSA1Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCByZWN1cnNpdmVfcHJvdG8uYmIuYS5iYi5hLmJiLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uSGFzRmllbGQoJ2JiJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHJlY3Vyc2l2ZV9wcm90by5iYi5IYXNGaWVsZCgnYScpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShyZWN1cnNpdmVfcHJvdG8uYmIuYS5IYXNGaWVsZCgnYmInKSkKLSAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuSGFzRmllbGQoJ2EnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5IYXNGaWVsZCgnYmInKSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHJlY3Vyc2l2ZV9wcm90by5iYi5hLmJiLmEuYmIuSGFzRmllbGQoJ2EnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocmVjdXJzaXZlX3Byb3RvLmJiLmEuYmIuYS5iYi5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLQotICBkZWYgdGVzdFNpbmd1bGFyTGlzdEZpZWxkcyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX2ZpeGVkMzIgPSAxCi0gICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSA1Ci0gICAgcHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ2ZvbycKLSAgICAjIEFjY2VzcyBzdWItbWVzc2FnZSBidXQgZG9uJ3Qgc2V0IGl0IHlldC4KLSAgICBuZXN0ZWRfbWVzc2FnZSA9IHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJyAgXSwgNSksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9maXhlZDMyJ10sIDEpLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfc3RyaW5nJyBdLCAnZm9vJykgXSwKLSAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKLQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiID0gMTIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJyAgXSwgNSksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9maXhlZDMyJ10sIDEpLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsnb3B0aW9uYWxfc3RyaW5nJyBdLCAnZm9vJyksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScgXSwKLSAgICAgICAgICAgICBuZXN0ZWRfbWVzc2FnZSkgXSwKLSAgICAgIHByb3RvLkxpc3RGaWVsZHMoKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkTGlzdEZpZWxkcyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLnJlcGVhdGVkX2ZpeGVkMzIuYXBwZW5kKDEpCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDUpCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDExKQotICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoWydmb28nLCAnYmFyJ10pCi0gICAgcHJvdG8ucmVwZWF0ZWRfc3RyaW5nLmV4dGVuZChbXSkKLSAgICBwcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYXonKQotICAgIHByb3RvLnJlcGVhdGVkX3N0cmluZy5leHRlbmQoc3RyKHgpIGZvciB4IGluIHhyYW5nZSgyKSkKLSAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDIxCi0gICAgcHJvdG8ucmVwZWF0ZWRfYm9vbCAgIyBBY2Nlc3MgYnV0IGRvbid0IHNldCBhbnl0aGluZzsgc2hvdWxkIG5vdCBiZSBsaXN0ZWQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ29wdGlvbmFsX2ludDMyJyAgXSwgMjEpLAotICAgICAgICAocHJvdG8uREVTQ1JJUFRPUi5maWVsZHNfYnlfbmFtZVsncmVwZWF0ZWRfaW50MzInICBdLCBbNSwgMTFdKSwKLSAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ3JlcGVhdGVkX2ZpeGVkMzInXSwgWzFdKSwKLSAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ3JlcGVhdGVkX3N0cmluZycgXSwKLSAgICAgICAgICBbJ2ZvbycsICdiYXInLCAnYmF6JywgJzAnLCAnMSddKSBdLAotICAgICAgcHJvdG8uTGlzdEZpZWxkcygpKQotCi0gIGRlZiB0ZXN0U2luZ3VsYXJMaXN0RXh0ZW5zaW9ucyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25dID0gMQotICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgXSA9IDUKLSAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uIF0gPSAnZm9vJwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICBbICh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICAsIDUpLAotICAgICAgICAodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ZpeGVkMzJfZXh0ZW5zaW9uLCAxKSwKLSAgICAgICAgKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICwgJ2ZvbycpIF0sCi0gICAgICBwcm90by5MaXN0RmllbGRzKCkpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZExpc3RFeHRlbnNpb25zKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbl0uYXBwZW5kKDEpCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICBdLmFwcGVuZCg1KQotICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgXS5hcHBlbmQoMTEpCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiBdLmFwcGVuZCgnZm9vJykKLSAgICBwcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uIF0uYXBwZW5kKCdiYXInKQotICAgIHByb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gXS5hcHBlbmQoJ2JheicpCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uICBdID0gMjEKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgWyAodW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgLCAyMSksCi0gICAgICAgICh1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uICAsIFs1LCAxMV0pLAotICAgICAgICAodW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCBbMV0pLAotICAgICAgICAodW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gLCBbJ2ZvbycsICdiYXInLCAnYmF6J10pIF0sCi0gICAgICBwcm90by5MaXN0RmllbGRzKCkpCi0KLSAgZGVmIHRlc3RMaXN0RmllbGRzQW5kRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHNBbmRFeHRlbnNpb25zKHByb3RvKQotICAgIHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIFsgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ215X2ludCcgICBdLCAxKSwKLSAgICAgICAgKHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50ICAgICAgICAgICAgICAgLCAyMyksCi0gICAgICAgIChwcm90by5ERVNDUklQVE9SLmZpZWxkc19ieV9uYW1lWydteV9zdHJpbmcnXSwgJ2ZvbycpLAotICAgICAgICAodW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9zdHJpbmcgICAgICAgICAgICAsICdiYXInKSwKLSAgICAgICAgKHByb3RvLkRFU0NSSVBUT1IuZmllbGRzX2J5X25hbWVbJ215X2Zsb2F0JyBdLCAxLjApIF0sCi0gICAgICBwcm90by5MaXN0RmllbGRzKCkpCi0KLSAgZGVmIHRlc3REZWZhdWx0VmFsdWVzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ludDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfdWludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfdWludDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfc2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfc2ludDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfZml4ZWQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX2ZpeGVkNjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwcm90by5vcHRpb25hbF9zZml4ZWQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLm9wdGlvbmFsX3NmaXhlZDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMC4wLCBwcm90by5vcHRpb25hbF9mbG9hdCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAuMCwgcHJvdG8ub3B0aW9uYWxfZG91YmxlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsIHByb3RvLm9wdGlvbmFsX2Jvb2wpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnJywgcHJvdG8ub3B0aW9uYWxfc3RyaW5nKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJycsIHByb3RvLm9wdGlvbmFsX2J5dGVzKQotCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0MSwgcHJvdG8uZGVmYXVsdF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBwcm90by5kZWZhdWx0X2ludDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDMsIHByb3RvLmRlZmF1bHRfdWludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDQsIHByb3RvLmRlZmF1bHRfdWludDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTQ1LCBwcm90by5kZWZhdWx0X3NpbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQ2LCBwcm90by5kZWZhdWx0X3NpbnQ2NCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQ3LCBwcm90by5kZWZhdWx0X2ZpeGVkMzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0OCwgcHJvdG8uZGVmYXVsdF9maXhlZDY0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNDksIHByb3RvLmRlZmF1bHRfc2ZpeGVkMzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtNTAsIHByb3RvLmRlZmF1bHRfc2ZpeGVkNjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1MS41LCBwcm90by5kZWZhdWx0X2Zsb2F0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNTJlMywgcHJvdG8uZGVmYXVsdF9kb3VibGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBwcm90by5kZWZhdWx0X2Jvb2wpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnaGVsbG8nLCBwcm90by5kZWZhdWx0X3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCd3b3JsZCcsIHByb3RvLmRlZmF1bHRfYnl0ZXMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUiwgcHJvdG8uZGVmYXVsdF9uZXN0ZWRfZW51bSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUiwgcHJvdG8uZGVmYXVsdF9mb3JlaWduX2VudW0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVIsCi0gICAgICAgICAgICAgICAgICAgICBwcm90by5kZWZhdWx0X2ltcG9ydF9lbnVtKQotCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHUxMjM0JywgcHJvdG8udXRmOF9zdHJpbmcpCi0KLSAgZGVmIHRlc3RIYXNGaWVsZFdpdGhVbmtub3duRmllbGROYW1lKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgcHJvdG8uSGFzRmllbGQsICdub25leGlzdGVudF9maWVsZCcpCi0KLSAgZGVmIHRlc3RDbGVhckZpZWxkV2l0aFVua25vd25GaWVsZE5hbWUoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBwcm90by5DbGVhckZpZWxkLCAnbm9uZXhpc3RlbnRfZmllbGQnKQotCi0gIGRlZiB0ZXN0RGlzYWxsb3dlZEFzc2lnbm1lbnRzKHNlbGYpOgotICAgICMgSXQncyBpbGxlZ2FsIHRvIGFzc2lnbiB2YWx1ZXMgZGlyZWN0bHkgdG8gcmVwZWF0ZWQgZmllbGRzCi0gICAgIyBvciB0byBub25yZXBlYXRlZCBjb21wb3NpdGUgZmllbGRzLiAgRW5zdXJlIHRoYXQgdGhpcyBmYWlscy4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgICMgUmVwZWF0ZWQgZmllbGRzLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ3JlcGVhdGVkX2ludDMyJywgMTApCi0gICAgIyBMaXN0cyBzaG91bGRuJ3Qgd29yaywgZWl0aGVyLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEF0dHJpYnV0ZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ3JlcGVhdGVkX2ludDMyJywgWzEwXSkKLSAgICAjIENvbXBvc2l0ZSBmaWVsZHMuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLAotICAgICAgICAgICAgICAgICAgICAgICdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScsIDIzKQotICAgICMgQXNzaWdubWVudCB0byBhIHJlcGVhdGVkIG5lc3RlZCBtZXNzYWdlIGZpZWxkIHdpdGhvdXQgc3BlY2lmeWluZwotICAgICMgdGhlIGluZGV4IGluIHRoZSBhcnJheSBvZiBuZXN0ZWQgbWVzc2FnZXMuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICdiYicsIDM0KQotICAgICMgQXNzaWdubWVudCB0byBhbiBhdHRyaWJ1dGUgb2YgYSByZXBlYXRlZCBmaWVsZC4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhBdHRyaWJ1dGVFcnJvciwgc2V0YXR0ciwgcHJvdG8ucmVwZWF0ZWRfZmxvYXQsCi0gICAgICAgICAgICAgICAgICAgICAgJ3NvbWVfYXR0cmlidXRlJywgMzQpCi0gICAgIyBwcm90by5ub25leGlzdGVudF9maWVsZCA9IDIzIHNob3VsZCBmYWlsIGFzIHdlbGwuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoQXR0cmlidXRlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnbm9uZXhpc3RlbnRfZmllbGQnLCAyMykKLQotICBkZWYgdGVzdFNpbmdsZVNjYWxhclR5cGVTYWZldHkoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHNldGF0dHIsIHByb3RvLCAnb3B0aW9uYWxfaW50MzInLCAxLjEpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2ludDMyJywgJ2ZvbycpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX3N0cmluZycsIDEwKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9ieXRlcycsIDEwKQotCi0gIGRlZiB0ZXN0U2luZ2xlU2NhbGFyQm91bmRzQ2hlY2tpbmcoc2VsZik6Ci0gICAgZGVmIFRlc3RNaW5BbmRNYXhJbnRlZ2VycyhmaWVsZF9uYW1lLCBleHBlY3RlZF9taW4sIGV4cGVjdGVkX21heCk6Ci0gICAgICBwYiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgICAgc2V0YXR0cihwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWluKQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9taW4sIGdldGF0dHIocGIsIGZpZWxkX25hbWUpKQotICAgICAgc2V0YXR0cihwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWF4KQotICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9tYXgsIGdldGF0dHIocGIsIGZpZWxkX25hbWUpKQotICAgICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwgc2V0YXR0ciwgcGIsIGZpZWxkX25hbWUsIGV4cGVjdGVkX21pbiAtIDEpCi0gICAgICBzZWxmLmFzc2VydFJhaXNlcyhWYWx1ZUVycm9yLCBzZXRhdHRyLCBwYiwgZmllbGRfbmFtZSwgZXhwZWN0ZWRfbWF4ICsgMSkKLQotICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfaW50MzInLCAtKDEgPDwgMzEpLCAoMSA8PCAzMSkgLSAxKQotICAgIFRlc3RNaW5BbmRNYXhJbnRlZ2Vycygnb3B0aW9uYWxfdWludDMyJywgMCwgMHhmZmZmZmZmZikKLSAgICBUZXN0TWluQW5kTWF4SW50ZWdlcnMoJ29wdGlvbmFsX2ludDY0JywgLSgxIDw8IDYzKSwgKDEgPDwgNjMpIC0gMSkKLSAgICBUZXN0TWluQW5kTWF4SW50ZWdlcnMoJ29wdGlvbmFsX3VpbnQ2NCcsIDAsIDB4ZmZmZmZmZmZmZmZmZmZmZikKLQotICAgIHBiID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0gPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSkKLQotICAgICMgSW52YWxpZCBlbnVtIHZhbHVlcy4KLSAgICBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDAKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtKQotCi0gICAgYnl0ZXNfc2l6ZV9iZWZvcmUgPSBwYi5CeXRlU2l6ZSgpCi0KLSAgICBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSA9IDQKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHBiLm9wdGlvbmFsX25lc3RlZF9lbnVtKQotCi0gICAgcGIub3B0aW9uYWxfbmVzdGVkX2VudW0gPSAwCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBwYi5vcHRpb25hbF9uZXN0ZWRfZW51bSkKLQotICAgICMgTWFrZSBzdXJlIHRoYXQgc2V0dGluZyB0aGUgc2FtZSBlbnVtIGZpZWxkIGRvZXNuJ3QganVzdCBhZGQgdW5rbm93bgotICAgICMgZmllbGRzIChidXQgb3ZlcndyaXRlcyB0aGVtKS4KLSAgICBzZWxmLmFzc2VydEVxdWFsKGJ5dGVzX3NpemVfYmVmb3JlLCBwYi5CeXRlU2l6ZSgpKQotCi0gICAgIyBJcyB0aGUgaW52YWxpZCB2YWx1ZSBwcmVzZXJ2ZWQgYWZ0ZXIgc2VyaWFsaXphdGlvbj8KLSAgICBzZXJpYWxpemVkID0gcGIuU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHBiMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHBiMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHBiMi5vcHRpb25hbF9uZXN0ZWRfZW51bSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHBiLCBwYjIpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhclR5cGVTYWZldHkoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCwgMS4xKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kLCAnZm9vJykKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX3N0cmluZywgMTApCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90by5yZXBlYXRlZF9ieXRlcywgMTApCi0KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTApCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0gPSAyMwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fc2V0aXRlbV9fLCA1MDAsIDIzKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19zZXRpdGVtX18sIDAsICdhYmMnKQotCi0gICAgIyBSZXBlYXRlZCBlbnVtcyB0ZXN0cy4KLSAgICAjcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKDApCi0KLSAgZGVmIHRlc3RTaW5nbGVTY2FsYXJHZXR0ZXJzQW5kU2V0dGVycyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCi0gICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9pbnQzMikKLQotICAgIHByb3RvLm9wdGlvbmFsX3VpbnQ2NCA9IDB4ZmZmZmZmZmZmZmZmCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZiwgcHJvdG8ub3B0aW9uYWxfdWludDY0KQotICAgIHByb3RvLm9wdGlvbmFsX3VpbnQ2NCA9IDB4ZmZmZmZmZmZmZmZmZmZmZgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZmZmZmZmZmZmLCBwcm90by5vcHRpb25hbF91aW50NjQpCi0gICAgIyBUT0RPKHJvYmluc29uKTogVGVzdCBhbGwgb3RoZXIgc2NhbGFyIGZpZWxkIHR5cGVzLgotCi0gIGRlZiB0ZXN0U2luZ2xlU2NhbGFyQ2xlYXJGaWVsZChzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgICMgU2hvdWxkIGJlIGFsbG93ZWQgdG8gY2xlYXIgc29tZXRoaW5nIHRoYXQncyBub3QgdGhlcmUgKGEgbm8tb3ApLgotICAgIHByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ludDMyJykKLSAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX2ludDMyJykpCi0gICAgcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8ub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLSAgICAjIFRPRE8ocm9iaW5zb24pOiBUZXN0IGFsbCBvdGhlciBzY2FsYXIgZmllbGQgdHlwZXMuCi0KLSAgZGVmIHRlc3RFbnVtcyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8uRk9PKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90by5CQVIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBUikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHByb3RvLkJBWikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFaKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRTY2FsYXJzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLnJlcGVhdGVkX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTApCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDE1KQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5yZXBlYXRlZF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKFs1LCAxMCwgMTVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCBzaW5nbGUgcmV0cmlldmFsLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTFdKQotICAgICMgVGVzdCBvdXQtb2YtYm91bmRzIGluZGljZXMuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19nZXRpdGVtX18sIDEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19nZXRpdGVtX18sIC0xMjM0KQotICAgICMgVGVzdCBpbmNvcnJlY3QgdHlwZXMgcGFzc2VkIHRvIF9fZ2V0aXRlbV9fLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19nZXRpdGVtX18sICdmb28nKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19nZXRpdGVtX18sIE5vbmUpCi0KLSAgICAjIFRlc3Qgc2luZ2xlIGFzc2lnbm1lbnQuCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0gPSAyMAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDIwLCAxNV0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQotCi0gICAgIyBUZXN0IGluc2VydGlvbi4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5pbnNlcnQoMSwgMjUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMjUsIDIwLCAxNV0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQotCi0gICAgIyBUZXN0IHNsaWNlIHJldHJpZXZhbC4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMzApCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbMjUsIDIwLCAxNV0sIHByb3RvLnJlcGVhdGVkX2ludDMyWzE6NF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMjUsIDIwLCAxNSwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMls6XSkKLQotICAgICMgVGVzdCBzbGljZSBhc3NpZ25tZW50IHdpdGggYW4gaXRlcmF0b3IKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMlsxOjRdID0gKGkgZm9yIGkgaW4geHJhbmdlKDMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDAsIDEsIDIsIDMwXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICAjIFRlc3Qgc2xpY2UgYXNzaWdubWVudC4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMlsxOjRdID0gWzM1LCA0MCwgNDVdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDQwLCA0NSwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCB0aGF0IHdlIGNhbiB1c2UgdGhlIGZpZWxkIGFzIGFuIGl0ZXJhdG9yLgotICAgIHJlc3VsdCA9IFtdCi0gICAgZm9yIGkgaW4gcHJvdG8ucmVwZWF0ZWRfaW50MzI6Ci0gICAgICByZXN1bHQuYXBwZW5kKGkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDQwLCA0NSwgMzBdLCByZXN1bHQpCi0KLSAgICAjIFRlc3Qgc2luZ2xlIGRlbGV0aW9uLgotICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlsyXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzUsIDM1LCA0NSwgMzBdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCBzbGljZSBkZWxldGlvbi4KLSAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMjpdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzVdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICAgICMgVGVzdCBleHRlbmRpbmcuCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKFszLCAxM10pCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNSwgMzUsIDMsIDEzXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICAjIFRlc3QgY2xlYXJpbmcuCi0gICAgcHJvdG8uQ2xlYXJGaWVsZCgncmVwZWF0ZWRfaW50MzInKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0pCi0gICAgIyBUZXN0IGFzc2lnbm1lbnQgdG8gYSBuZWdhdGl2ZSBpbmRleC4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0gPSAyCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0pCi0KLSAgICAjIFRlc3QgZGVsZXRpb24gYXQgbmVnYXRpdmUgaW5kaWNlcy4KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMls6XSA9IFswLCAxLCAyLCAzXQotICAgIGRlbCBwcm90by5yZXBlYXRlZF9pbnQzMlstMV0KLSAgICBzZWxmLmFzc2VydEVxdWFsKFswLCAxLCAyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTJdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbMCwgMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQotCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfaW50MzIuX19kZWxpdGVtX18sIC0zKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLl9fZGVsaXRlbV9fLCAzMDApCi0KLSAgICBkZWwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbLTI6LTFdCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbMl0sIHByb3RvLnJlcGVhdGVkX2ludDMyKQotCi0gICAgZGVsIHByb3RvLnJlcGVhdGVkX2ludDMyWzEwMDoxMDAwMF0KLSAgICBzZWxmLmFzc2VydEVxdWFsKFsyXSwgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNSZW1vdmUoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8ucmVwZWF0ZWRfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQotICAgIHByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMCkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoNSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgbGVuKHByb3RvLnJlcGVhdGVkX2ludDMyKSkKLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoNSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIGxlbihwcm90by5yZXBlYXRlZF9pbnQzMikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMCwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBwcm90by5yZXBlYXRlZF9pbnQzMlsxXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHByb3RvLnJlcGVhdGVkX2ludDMyWzJdKQotCi0gICAgcHJvdG8ucmVwZWF0ZWRfaW50MzIucmVtb3ZlKDUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTAsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0pCi0KLSAgICBwcm90by5yZXBlYXRlZF9pbnQzMi5yZW1vdmUoMTApCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBsZW4ocHJvdG8ucmVwZWF0ZWRfaW50MzIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMF0pCi0KLSAgICAjIFJlbW92ZSBhIG5vbi1leGlzdGVudCBlbGVtZW50LgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsIHByb3RvLnJlcGVhdGVkX2ludDMyLnJlbW92ZSwgMTIzKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSkpCi0gICAgbTAgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0xID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbChbbTAsIG0xXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2UobTAsIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSkpCi0KLSAgICAjIFRlc3Qgb3V0LW9mLWJvdW5kcyBpbmRpY2VzLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEluZGV4RXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAotICAgICAgICAgICAgICAgICAgICAgIDEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoSW5kZXhFcnJvciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuX19nZXRpdGVtX18sCi0gICAgICAgICAgICAgICAgICAgICAgLTEyMzQpCi0KLSAgICAjIFRlc3QgaW5jb3JyZWN0IHR5cGVzIHBhc3NlZCB0byBfX2dldGl0ZW1fXy4KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLl9fZ2V0aXRlbV9fLAotICAgICAgICAgICAgICAgICAgICAgICdmb28nKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuX19nZXRpdGVtX18sCi0gICAgICAgICAgICAgICAgICAgICAgTm9uZSkKLQotICAgICMgVGVzdCBzbGljZSByZXRyaWV2YWwuCi0gICAgbTIgPSBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0zID0gcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBtNCA9IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAotICAgICAgICBbbTEsIG0yLCBtM10sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzE6NF0pCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAotICAgICAgICBbbTAsIG0xLCBtMiwgbTMsIG00XSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbOl0pCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKAotICAgICAgICBbbTAsIG0xXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbOjJdKQotICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKLSAgICAgICAgW20yLCBtMywgbTRdLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyOl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgbTAsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdKQotICAgIHNlbGYuYXNzZXJ0TGlzdHNFcXVhbCgKLSAgICAgICAgW20wXSwgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbOjFdKQotCi0gICAgIyBUZXN0IHRoYXQgd2UgY2FuIHVzZSB0aGUgZmllbGQgYXMgYW4gaXRlcmF0b3IuCi0gICAgcmVzdWx0ID0gW10KLSAgICBmb3IgaSBpbiBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZToKLSAgICAgIHJlc3VsdC5hcHBlbmQoaSkKLSAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoW20wLCBtMSwgbTIsIG0zLCBtNF0sIHJlc3VsdCkKLQotICAgICMgVGVzdCBzaW5nbGUgZGVsZXRpb24uCi0gICAgZGVsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdCi0gICAgc2VsZi5hc3NlcnRMaXN0c0VxdWFsKFttMCwgbTEsIG0zLCBtNF0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotCi0gICAgIyBUZXN0IHNsaWNlIGRlbGV0aW9uLgotICAgIGRlbCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyOl0KLSAgICBzZWxmLmFzc2VydExpc3RzRXF1YWwoW20wLCBtMV0sIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotCi0gICAgIyBUZXN0IGV4dGVuZGluZy4KLSAgICBuMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZShiYj0xKQotICAgIG4yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlKGJiPTIpCi0gICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuZXh0ZW5kKFtuMSxuMl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBsZW4ocHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobjEsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobjIsIHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzNdKQotCi0gICAgIyBUZXN0IGNsZWFyaW5nLgotICAgIHByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlJykKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLQotICAgICMgVGVzdCBjb25zdHJ1Y3RpbmcgYW4gZWxlbWVudCB3aGlsZSBhZGRpbmcgaXQuCi0gICAgcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKGJiPTIzKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgbGVuKHByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBwcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXS5iYikKLQotICBkZWYgdGVzdEhhbmRXcml0dGVuUmVmbGVjdGlvbihzZWxmKToKLSAgICAjIEhhbmQgd3JpdHRlbiBleHRlbnNpb25zIGFyZSBvbmx5IHN1cHBvcnRlZCBieSB0aGUgcHVyZS1QeXRob24KLSAgICAjIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCi0gICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSAhPSAncHl0aG9uJzoKLSAgICAgIHJldHVybgotCi0gICAgRmllbGREZXNjcmlwdG9yID0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IKLSAgICBmb29fZmllbGRfZGVzY3JpcHRvciA9IEZpZWxkRGVzY3JpcHRvcigKLSAgICAgICAgbmFtZT0nZm9vX2ZpZWxkJywgZnVsbF9uYW1lPSdNeVByb3RvLmZvb19maWVsZCcsCi0gICAgICAgIGluZGV4PTAsIG51bWJlcj0xLCB0eXBlPUZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0LAotICAgICAgICBjcHBfdHlwZT1GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9JTlQ2NCwKLSAgICAgICAgbGFiZWw9RmllbGREZXNjcmlwdG9yLkxBQkVMX09QVElPTkFMLCBkZWZhdWx0X3ZhbHVlPTAsCi0gICAgICAgIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBtZXNzYWdlX3R5cGU9Tm9uZSwgZW51bV90eXBlPU5vbmUsCi0gICAgICAgIGlzX2V4dGVuc2lvbj1GYWxzZSwgZXh0ZW5zaW9uX3Njb3BlPU5vbmUsCi0gICAgICAgIG9wdGlvbnM9ZGVzY3JpcHRvcl9wYjIuRmllbGRPcHRpb25zKCkpCi0gICAgbXlkZXNjcmlwdG9yID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKAotICAgICAgICBuYW1lPSdNeVByb3RvJywgZnVsbF9uYW1lPSdNeVByb3RvJywgZmlsZW5hbWU9J2lnbm9yZWQnLAotICAgICAgICBjb250YWluaW5nX3R5cGU9Tm9uZSwgbmVzdGVkX3R5cGVzPVtdLCBlbnVtX3R5cGVzPVtdLAotICAgICAgICBmaWVsZHM9W2Zvb19maWVsZF9kZXNjcmlwdG9yXSwgZXh0ZW5zaW9ucz1bXSwKLSAgICAgICAgb3B0aW9ucz1kZXNjcmlwdG9yX3BiMi5NZXNzYWdlT3B0aW9ucygpKQotICAgIGNsYXNzIE15UHJvdG9DbGFzcyhtZXNzYWdlLk1lc3NhZ2UpOgotICAgICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgotICAgICAgX19tZXRhY2xhc3NfXyA9IHJlZmxlY3Rpb24uR2VuZXJhdGVkUHJvdG9jb2xNZXNzYWdlVHlwZQotICAgIG15cHJvdG9faW5zdGFuY2UgPSBNeVByb3RvQ2xhc3MoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBteXByb3RvX2luc3RhbmNlLkhhc0ZpZWxkKCdmb29fZmllbGQnKSkKLSAgICBteXByb3RvX2luc3RhbmNlLmZvb19maWVsZCA9IDIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgbXlwcm90b19pbnN0YW5jZS5mb29fZmllbGQpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG15cHJvdG9faW5zdGFuY2UuSGFzRmllbGQoJ2Zvb19maWVsZCcpKQotCi0gIGRlZiB0ZXN0VG9wTGV2ZWxFeHRlbnNpb25zRm9yT3B0aW9uYWxTY2FsYXIoc2VsZik6Ci0gICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24KLSAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQotICAgICMgQXMgd2l0aCBub3JtYWwgc2NhbGFyIGZpZWxkcywganVzdCBkb2luZyBhIHJlYWQgZG9lc24ndCBhY3R1YWxseSBzZXQgdGhlCi0gICAgIyAiaGFzIiBiaXQuCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLSAgICAjIEFjdHVhbGx5IHNldCB0aGUgdGhpbmcuCi0gICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gMjMKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgICMgRW5zdXJlIHRoYXQgY2xlYXJpbmcgd29ya3MgYXMgd2VsbC4KLSAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLQotICBkZWYgdGVzdFRvcExldmVsRXh0ZW5zaW9uc0ZvclJlcGVhdGVkU2NhbGFyKHNlbGYpOgotICAgIGV4dGVuZGVlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkpCi0gICAgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmFwcGVuZCgnZm9vJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsnZm9vJ10sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKLSAgICBzdHJpbmdfbGlzdCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQotICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIGxlbihleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShzdHJpbmdfbGlzdCBpcyBub3QgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQotICAgICMgU2hvdWxkbid0IGJlIGFsbG93ZWQgdG8gZG8gRXh0ZW5zaW9uc1tleHRlbnNpb25dID0gJ2EnCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBvcGVyYXRvci5zZXRpdGVtLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zLAotICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbiwgJ2EnKQotCi0gIGRlZiB0ZXN0VG9wTGV2ZWxFeHRlbnNpb25zRm9yT3B0aW9uYWxNZXNzYWdlKHNlbGYpOgotICAgIGV4dGVuZGVlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYykKLSAgICAjIEFzIHdpdGggbm9ybWFsIChub24tZXh0ZW5zaW9uKSBmaWVsZHMsIG1lcmVseSByZWFkaW5nIGZyb20gdGhlCi0gICAgIyB0aGluZyBzaG91bGRuJ3Qgc2V0IHRoZSAiaGFzIiBiaXQuCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLSAgICBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYyA9IDIzCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyMywgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgICMgU2F2ZSBhIHJlZmVyZW5jZSBoZXJlLgotICAgIGZvcmVpZ25fbWVzc2FnZSA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQotICAgIGV4dGVuZGVlX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICBzZWxmLmFzc2VydFRydWUoZm9yZWlnbl9tZXNzYWdlIGlzIG5vdCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCi0gICAgIyBTZXR0aW5nIGEgZmllbGQgb24gZm9yZWlnbl9tZXNzYWdlIG5vdyBzaG91bGRuJ3Qgc2V0Ci0gICAgIyBhbnkgImhhcyIgYml0cyBvbiBleHRlbmRlZV9wcm90by4KLSAgICBmb3JlaWduX21lc3NhZ2UuYyA9IDQyCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0MiwgZm9yZWlnbl9tZXNzYWdlLmMpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGZvcmVpZ25fbWVzc2FnZS5IYXNGaWVsZCgnYycpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uKGV4dGVuc2lvbikpCi0gICAgIyBTaG91bGRuJ3QgYmUgYWxsb3dlZCB0byBkbyBFeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAnYScKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIG9wZXJhdG9yLnNldGl0ZW0sIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLCAnYScpCi0KLSAgZGVmIHRlc3RUb3BMZXZlbEV4dGVuc2lvbnNGb3JSZXBlYXRlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkpCi0gICAgZ3JvdXAgPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYWRkKCkKLSAgICBncm91cC5hID0gMjMKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl1bMF0uYSkKLSAgICBncm91cC5hID0gNDIKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl1bMF0uYSkKLSAgICBncm91cF9saXN0ID0gZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCi0gICAgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGdyb3VwX2xpc3QgaXMgbm90IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSkKLSAgICAjIFNob3VsZG4ndCBiZSBhbGxvd2VkIHRvIGRvIEV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9ICdhJwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgb3BlcmF0b3Iuc2V0aXRlbSwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucywKLSAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24sICdhJykKLQotICBkZWYgdGVzdE5lc3RlZEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgZXh0ZW5kZWVfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGV4dGVuc2lvbiA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlCi0KLSAgICAjIFdlIGp1c3QgdGVzdCB0aGUgbm9uLXJlcGVhdGVkIGNhc2UuCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLSAgICByZXF1aXJlZCA9IGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcmVxdWlyZWQuYSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbihleHRlbnNpb24pKQotICAgIHJlcXVpcmVkLmEgPSAyMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLSAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgc2VsZi5hc3NlcnRUcnVlKHJlcXVpcmVkIGlzIG5vdCBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24oZXh0ZW5zaW9uKSkKLQotICAjIElmIG1lc3NhZ2UgQSBkaXJlY3RseSBjb250YWlucyBtZXNzYWdlIEIsIGFuZAotICAjIGEuSGFzRmllbGQoJ2InKSBpcyBjdXJyZW50bHkgRmFsc2UsIHRoZW4gbXV0YXRpbmcgYW55Ci0gICMgZXh0ZW5zaW9uIGluIEIgc2hvdWxkIGNoYW5nZSBhLkhhc0ZpZWxkKCdiJykgdG8gVHJ1ZQotICAjIChhbmQgc28gb24gdXAgdGhlIG9iamVjdCB0cmVlKS4KLSAgZGVmIHRlc3RIYXNCaXRzRm9yQW5jZXN0b3JzT2ZFeHRlbmRlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgIyBPcHRpb25hbCBzY2FsYXIgZXh0ZW5zaW9uLgotICAgIHRvcGxldmVsID0gbW9yZV9leHRlbnNpb25zX3BiMi5Ub3BMZXZlbE1lc3NhZ2UoKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKLSAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uXSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCi0gICAgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb25dID0gMjMKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCi0gICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfaW50X2V4dGVuc2lvbl0pCi0gICAgc2VsZi5hc3NlcnRUcnVlKHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCi0KLSAgICAjIFJlcGVhdGVkIHNjYWxhciBleHRlbnNpb24uCi0gICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoW10sIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKLSAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uXSkKLSAgICBzZWxmLmFzc2VydFRydWUobm90IHRvcGxldmVsLkhhc0ZpZWxkKCdzdWJtZXNzYWdlJykpCi0gICAgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX2ludF9leHRlbnNpb25dLmFwcGVuZCgyMykKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsyM10sIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKLSAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9pbnRfZXh0ZW5zaW9uXSkKLSAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLQotICAgICMgT3B0aW9uYWwgbWVzc2FnZSBleHRlbnNpb24uCi0gICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX21lc3NhZ2VfZXh0ZW5zaW9uXS5mb3JlaWduX21lc3NhZ2VfaW50KQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLSAgICB0b3BsZXZlbC5zdWJtZXNzYWdlLkV4dGVuc2lvbnNbCi0gICAgICAgIG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb25dLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAyMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjMsIHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKLSAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9tZXNzYWdlX2V4dGVuc2lvbl0uZm9yZWlnbl9tZXNzYWdlX2ludCkKLSAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLQotICAgICMgUmVwZWF0ZWQgbWVzc2FnZSBleHRlbnNpb24uCi0gICAgdG9wbGV2ZWwgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLlRvcExldmVsTWVzc2FnZSgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCB0b3BsZXZlbC5IYXNGaWVsZCgnc3VibWVzc2FnZScpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgbGVuKHRvcGxldmVsLnN1Ym1lc3NhZ2UuRXh0ZW5zaW9uc1sKLSAgICAgICAgbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbl0pKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgdG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLSAgICBmb3JlaWduID0gdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZm9yZWlnbiwgdG9wbGV2ZWwuc3VibWVzc2FnZS5FeHRlbnNpb25zWwotICAgICAgICBtb3JlX2V4dGVuc2lvbnNfcGIyLnJlcGVhdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXVswXSkKLSAgICBzZWxmLmFzc2VydFRydWUodG9wbGV2ZWwuSGFzRmllbGQoJ3N1Ym1lc3NhZ2UnKSkKLQotICBkZWYgdGVzdERpc2Nvbm5lY3Rpb25BZnRlckNsZWFyaW5nRW1wdHlNZXNzYWdlKHNlbGYpOgotICAgIHRvcGxldmVsID0gbW9yZV9leHRlbnNpb25zX3BiMi5Ub3BMZXZlbE1lc3NhZ2UoKQotICAgIGV4dGVuZGVlX3Byb3RvID0gdG9wbGV2ZWwuc3VibWVzc2FnZQotICAgIGV4dGVuc2lvbiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24KLSAgICBleHRlbnNpb25fcHJvdG8gPSBleHRlbmRlZV9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KLSAgICBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgZXh0ZW5zaW9uX3Byb3RvLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAyMwotCi0gICAgc2VsZi5hc3NlcnRUcnVlKGV4dGVuc2lvbl9wcm90byBpcyBub3QgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dKQotCi0gIGRlZiB0ZXN0RXh0ZW5zaW9uRmFpbHVyZU1vZGVzKHNlbGYpOgotICAgIGV4dGVuZGVlX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLQotICAgICMgVHJ5IG5vbi1leHRlbnNpb24taGFuZGxlIGFyZ3VtZW50cyB0byBIYXNFeHRlbnNpb24sCi0gICAgIyBDbGVhckV4dGVuc2lvbigpLCBhbmQgRXh0ZW5zaW9uc1tdLi4uCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkhhc0V4dGVuc2lvbiwgMTIzNCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uQ2xlYXJFeHRlbnNpb24sIDEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMuX19nZXRpdGVtX18sIDEyMzQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoS2V5RXJyb3IsIGV4dGVuZGVlX3Byb3RvLkV4dGVuc2lvbnMuX19zZXRpdGVtX18sIDEyMzQsIDUpCi0KLSAgICAjIFRyeSBzb21ldGhpbmcgdGhhdCAqaXMqIGFuIGV4dGVuc2lvbiBoYW5kbGUsIGp1c3Qgbm90IGZvcgotICAgICMgdGhpcyBtZXNzYWdlLi4uCi0gICAgdW5rbm93bl9oYW5kbGUgPSBtb3JlX2V4dGVuc2lvbnNfcGIyLm9wdGlvbmFsX2ludF9leHRlbnNpb24KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uSGFzRXh0ZW5zaW9uLAotICAgICAgICAgICAgICAgICAgICAgIHVua25vd25faGFuZGxlKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5DbGVhckV4dGVuc2lvbiwKLSAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2hhbmRsZSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX2dldGl0ZW1fXywKLSAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2hhbmRsZSkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhLZXlFcnJvciwgZXh0ZW5kZWVfcHJvdG8uRXh0ZW5zaW9ucy5fX3NldGl0ZW1fXywKLSAgICAgICAgICAgICAgICAgICAgICB1bmtub3duX2hhbmRsZSwgNSkKLQotICAgICMgVHJ5IGNhbGwgSGFzRXh0ZW5zaW9uKCkgd2l0aCBhIHZhbGlkIGhhbmRsZSwgYnV0IGZvciBhCi0gICAgIyAqcmVwZWF0ZWQqIGZpZWxkLiAgKEp1c3QgYXMgd2l0aCBub24tZXh0ZW5zaW9uIHJlcGVhdGVkCi0gICAgIyBmaWVsZHMsIEhhcyooKSBpc24ndCBzdXBwb3J0ZWQgZm9yIGV4dGVuc2lvbiByZXBlYXRlZCBmaWVsZHMpLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKEtleUVycm9yLCBleHRlbmRlZV9wcm90by5IYXNFeHRlbnNpb24sCi0gICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pCi0KLSAgZGVmIHRlc3RTdGF0aWNQYXJzZUZyb20oc2VsZik6Ci0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bzEpCi0KLSAgICBzdHJpbmcxID0gcHJvdG8xLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZyb21TdHJpbmcoc3RyaW5nMSkKLQotICAgICMgTWVzc2FnZXMgc2hvdWxkIGJlIGVxdWFsLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8yLCBwcm90bzEpCi0KLSAgZGVmIHRlc3RNZXJnZUZyb21TaW5ndWxhckZpZWxkKHNlbGYpOgotICAgICMgVGVzdCBtZXJnZSB3aXRoIGp1c3QgYSBzaW5ndWxhciBmaWVsZC4KLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzEub3B0aW9uYWxfaW50MzIgPSAxCi0KLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICAjIFRoaXMgc2hvdWxkbid0IGdldCBvdmVyd3JpdHRlbi4KLSAgICBwcm90bzIub3B0aW9uYWxfc3RyaW5nID0gJ3ZhbHVlJwotCi0gICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgndmFsdWUnLCBwcm90bzIub3B0aW9uYWxfc3RyaW5nKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tUmVwZWF0ZWRGaWVsZChzZWxmKToKLSAgICAjIFRlc3QgbWVyZ2Ugd2l0aCBqdXN0IGEgcmVwZWF0ZWQgZmllbGQuCi0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIHByb3RvMS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMikKLQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMi5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMCkKLSAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzFdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8yLnJlcGVhdGVkX2ludDMyWzJdKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tT3B0aW9uYWxHcm91cChzZWxmKToKLSAgICAjIFRlc3QgbWVyZ2Ugd2l0aCBhbiBvcHRpb25hbCBncm91cC4KLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzEub3B0aW9uYWxncm91cC5hID0gMTIKLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEyLCBwcm90bzIub3B0aW9uYWxncm91cC5hKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tUmVwZWF0ZWROZXN0ZWRNZXNzYWdlKHNlbGYpOgotICAgICMgVGVzdCBtZXJnZSB3aXRoIGEgcmVwZWF0ZWQgbmVzdGVkIG1lc3NhZ2UuCi0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbSA9IHByb3RvMS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0uYmIgPSAxMjMKLSAgICBtID0gcHJvdG8xLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgbS5iYiA9IDMyMQotCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbSA9IHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIG0uYmIgPSA5OTkKLSAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDk5OSwgcHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBwcm90bzIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMV0uYmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzMjEsIHByb3RvMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsyXS5iYikKLQotICAgIHByb3RvMyA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5NZXJnZUZyb20ocHJvdG8yLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOTk5LCBwcm90bzMucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMsIHByb3RvMy5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVsxXS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMyMSwgcHJvdG8zLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzJdLmJiKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tQWxsRmllbGRzKHNlbGYpOgotICAgICMgV2l0aCBhbGwgZmllbGRzIHNldC4KLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvMSkKLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzIuTWVyZ2VGcm9tKHByb3RvMSkKLQotICAgICMgTWVzc2FnZXMgc2hvdWxkIGJlIGVxdWFsLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8yLCBwcm90bzEpCi0KLSAgICAjIFNlcmlhbGl6ZWQgc3RyaW5nIHNob3VsZCBiZSBlcXVhbCB0b28uCi0gICAgc3RyaW5nMSA9IHByb3RvMS5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc3RyaW5nMiA9IHByb3RvMi5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzdHJpbmcxLCBzdHJpbmcyKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tRXh0ZW5zaW9uc1Npbmd1bGFyKHNlbGYpOgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgcHJvdG8xLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gPSAxCi0KLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDEsIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tRXh0ZW5zaW9uc1JlcGVhdGVkKHNlbGYpOgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgcHJvdG8xLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0uYXBwZW5kKDEpCi0gICAgcHJvdG8xLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl0uYXBwZW5kKDIpCi0KLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHByb3RvMi5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dLmFwcGVuZCgwKQotICAgIHByb3RvMi5NZXJnZUZyb20ocHJvdG8xKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICAgIDMsIGxlbihwcm90bzIuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgMCwgcHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl1bMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgMSwgcHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl1bMV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgICAgMiwgcHJvdG8yLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbl1bMl0pCi0KLSAgZGVmIHRlc3RNZXJnZUZyb21FeHRlbnNpb25zTmVzdGVkTWVzc2FnZShzZWxmKToKLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIGV4dDEgPSBwcm90bzEuRXh0ZW5zaW9uc1sKLSAgICAgICAgdW5pdHRlc3RfcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0KLSAgICBtID0gZXh0MS5hZGQoKQotICAgIG0uYmIgPSAyMjIKLSAgICBtID0gZXh0MS5hZGQoKQotICAgIG0uYmIgPSAzMzMKLQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgZXh0MiA9IHByb3RvMi5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXQotICAgIG0gPSBleHQyLmFkZCgpCi0gICAgbS5iYiA9IDExMQotCi0gICAgcHJvdG8yLk1lcmdlRnJvbShwcm90bzEpCi0gICAgZXh0MiA9IHByb3RvMi5FeHRlbnNpb25zWwotICAgICAgICB1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgbGVuKGV4dDIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTExLCBleHQyWzBdLmJiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMjIyLCBleHQyWzFdLmJiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMzMzLCBleHQyWzJdLmJiKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tQnVnKHNlbGYpOgotICAgIG1lc3NhZ2UxID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbWVzc2FnZTIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgICMgQ2F1c2Ugb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgdG8gYmUgaW5zdGFudGlhdGVkIHdpdGhpbiBtZXNzYWdlMSwgZXZlbgotICAgICMgdGhvdWdoIGl0IGlzIG5vdCBjb25zaWRlcmVkIHRvIGJlICJwcmVzZW50Ii4KLSAgICBtZXNzYWdlMS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQotICAgIHNlbGYuYXNzZXJ0RmFsc2UobWVzc2FnZTEuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICAjIE1lcmdlIGludG8gbWVzc2FnZTIuICBUaGlzIHNob3VsZCBub3QgaW5zdGFudGlhdGUgdGhlIGZpZWxkIGlzIG1lc3NhZ2UyLgotICAgIG1lc3NhZ2UyLk1lcmdlRnJvbShtZXNzYWdlMSkKLSAgICBzZWxmLmFzc2VydEZhbHNlKG1lc3NhZ2UyLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotCi0gIGRlZiB0ZXN0Q29weUZyb21TaW5ndWxhckZpZWxkKHNlbGYpOgotICAgICMgVGVzdCBjb3B5IHdpdGgganVzdCBhIHNpbmd1bGFyIGZpZWxkLgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMS5vcHRpb25hbF9pbnQzMiA9IDEKLSAgICBwcm90bzEub3B0aW9uYWxfc3RyaW5nID0gJ2ltcG9ydGFudC10ZXh0JwotCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8yLm9wdGlvbmFsX3N0cmluZyA9ICd2YWx1ZScKLQotICAgIHByb3RvMi5Db3B5RnJvbShwcm90bzEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIub3B0aW9uYWxfaW50MzIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnaW1wb3J0YW50LXRleHQnLCBwcm90bzIub3B0aW9uYWxfc3RyaW5nKQotCi0gIGRlZiB0ZXN0Q29weUZyb21SZXBlYXRlZEZpZWxkKHNlbGYpOgotICAgICMgVGVzdCBjb3B5IHdpdGggYSByZXBlYXRlZCBmaWVsZC4KLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzEucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDEpCi0gICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyKQotCi0gICAgcHJvdG8yID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8yLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgwKQotICAgIHByb3RvMi5Db3B5RnJvbShwcm90bzEpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlswXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvMi5yZXBlYXRlZF9pbnQzMlsxXSkKLQotICBkZWYgdGVzdENvcHlGcm9tQWxsRmllbGRzKHNlbGYpOgotICAgICMgV2l0aCBhbGwgZmllbGRzIHNldC4KLSAgICBwcm90bzEgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKHByb3RvMSkKLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90bzIuQ29weUZyb20ocHJvdG8xKQotCi0gICAgIyBNZXNzYWdlcyBzaG91bGQgYmUgZXF1YWwuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90bzIsIHByb3RvMSkKLQotICAgICMgU2VyaWFsaXplZCBzdHJpbmcgc2hvdWxkIGJlIGVxdWFsIHRvby4KLSAgICBzdHJpbmcxID0gcHJvdG8xLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzdHJpbmcyID0gcHJvdG8yLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHN0cmluZzEsIHN0cmluZzIpCi0KLSAgZGVmIHRlc3RDb3B5RnJvbVNlbGYoc2VsZik6Ci0gICAgcHJvdG8xID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8xLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIHByb3RvMS5vcHRpb25hbF9pbnQzMiA9IDIKLSAgICBwcm90bzEub3B0aW9uYWxfc3RyaW5nID0gJ2ltcG9ydGFudC10ZXh0JwotCi0gICAgcHJvdG8xLkNvcHlGcm9tKHByb3RvMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMS5yZXBlYXRlZF9pbnQzMlswXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvMS5vcHRpb25hbF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdpbXBvcnRhbnQtdGV4dCcsIHByb3RvMS5vcHRpb25hbF9zdHJpbmcpCi0KLSAgZGVmIHRlc3RDb3B5RnJvbUJhZFR5cGUoc2VsZik6Ci0gICAgIyBUaGUgcHl0aG9uIGltcGxlbWVudGF0aW9uIGRvZXNuJ3QgcmFpc2UgYW4gZXhjZXB0aW9uIGluIHRoaXMKLSAgICAjIGNhc2UuIEluIHRoZW9yeSBpdCBzaG91bGQuCi0gICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKLSAgICAgIHJldHVybgotICAgIHByb3RvMSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBwcm90bzEuQ29weUZyb20sIHByb3RvMikKLQotICBkZWYgdGVzdENsZWFyKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhwcm90bykKLSAgICAjIENsZWFyIHRoZSBtZXNzYWdlLgotICAgIHByb3RvLkNsZWFyKCkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhwcm90by5CeXRlU2l6ZSgpLCAwKQotICAgIGVtcHR5X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMocHJvdG8sIGVtcHR5X3Byb3RvKQotCi0gICAgIyBUZXN0IGlmIGV4dGVuc2lvbnMgd2hpY2ggd2VyZSBzZXQgYXJlIGNsZWFyZWQuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKHByb3RvKQotICAgICMgQ2xlYXIgdGhlIG1lc3NhZ2UuCi0gICAgcHJvdG8uQ2xlYXIoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHByb3RvLkJ5dGVTaXplKCksIDApCi0gICAgZW1wdHlfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKHByb3RvLCBlbXB0eV9wcm90bykKLQotICBkZWYgYXNzZXJ0SW5pdGlhbGl6ZWQoc2VsZiwgcHJvdG8pOgotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5Jc0luaXRpYWxpemVkKCkpCi0gICAgIyBOZWl0aGVyIG1ldGhvZCBzaG91bGQgcmFpc2UgYW4gZXhjZXB0aW9uLgotICAgIHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQotCi0gIGRlZiBhc3NlcnROb3RJbml0aWFsaXplZChzZWxmLCBwcm90byk6Ci0gICAgc2VsZi5hc3NlcnRGYWxzZShwcm90by5Jc0luaXRpYWxpemVkKCkpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcpCi0gICAgIyAiUGFydGlhbCIgc2VyaWFsaXphdGlvbiBkb2Vzbid0IGNhcmUgaWYgbWVzc2FnZSBpcyB1bmluaXRpYWxpemVkLgotICAgIHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCi0KLSAgZGVmIHRlc3RJc0luaXRpYWxpemVkKHNlbGYpOgotICAgICMgVHJpdmlhbCBjYXNlcyAtIGFsbCBvcHRpb25hbCBmaWVsZHMgYW5kIGV4dGVuc2lvbnMuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQotCi0gICAgIyBUaGUgY2FzZSBvZiB1bmluaXRpYWxpemVkIHJlcXVpcmVkIGZpZWxkcy4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQotICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCi0gICAgcHJvdG8uYSA9IHByb3RvLmIgPSBwcm90by5jID0gMgotICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCi0KLSAgICAjIFRoZSBjYXNlIG9mIHVuaW5pdGlhbGl6ZWQgc3VibWVzc2FnZS4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKCkKLSAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQotICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYSA9IDEKLSAgICBzZWxmLmFzc2VydE5vdEluaXRpYWxpemVkKHByb3RvKQotICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYiA9IDAKLSAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlLmMgPSAwCi0gICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKLQotICAgICMgVW5pbml0aWFsaXplZCByZXBlYXRlZCBzdWJtZXNzYWdlLgotICAgIG1lc3NhZ2UxID0gcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZS5hZGQoKQotICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCi0gICAgbWVzc2FnZTEuYSA9IG1lc3NhZ2UxLmIgPSBtZXNzYWdlMS5jID0gMAotICAgIHNlbGYuYXNzZXJ0SW5pdGlhbGl6ZWQocHJvdG8pCi0KLSAgICAjIFVuaW5pdGlhbGl6ZWQgcmVwZWF0ZWQgZ3JvdXAgaW4gYW4gZXh0ZW5zaW9uLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLm11bHRpCi0gICAgbWVzc2FnZTEgPSBwcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0uYWRkKCkKLSAgICBtZXNzYWdlMiA9IHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hZGQoKQotICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCi0gICAgbWVzc2FnZTEuYSA9IDEKLSAgICBtZXNzYWdlMS5iID0gMQotICAgIG1lc3NhZ2UxLmMgPSAxCi0gICAgc2VsZi5hc3NlcnROb3RJbml0aWFsaXplZChwcm90bykKLSAgICBtZXNzYWdlMi5hID0gMgotICAgIG1lc3NhZ2UyLmIgPSAyCi0gICAgbWVzc2FnZTIuYyA9IDIKLSAgICBzZWxmLmFzc2VydEluaXRpYWxpemVkKHByb3RvKQotCi0gICAgIyBVbmluaXRpYWxpemVkIG5vbnJlcGVhdGVkIG1lc3NhZ2UgaW4gYW4gZXh0ZW5zaW9uLgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBleHRlbnNpb24gPSB1bml0dGVzdF9wYjIuVGVzdFJlcXVpcmVkLnNpbmdsZQotICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5hID0gMQotICAgIHNlbGYuYXNzZXJ0Tm90SW5pdGlhbGl6ZWQocHJvdG8pCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmIgPSAyCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dLmMgPSAzCi0gICAgc2VsZi5hc3NlcnRJbml0aWFsaXplZChwcm90bykKLQotICAgICMgVHJ5IHBhc3NpbmcgYW4gZXJyb3JzIGxpc3QuCi0gICAgZXJyb3JzID0gW10KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQotICAgIHNlbGYuYXNzZXJ0RmFsc2UocHJvdG8uSXNJbml0aWFsaXplZChlcnJvcnMpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZXJyb3JzLCBbJ2EnLCAnYicsICdjJ10pCi0KLSAgZGVmIHRlc3RTdHJpbmdVVEY4RW5jb2Rpbmcoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgICMgQXNzaWdubWVudCBvZiBhIHVuaWNvZGUgb2JqZWN0IHRvIGEgZmllbGQgb2YgdHlwZSAnYnl0ZXMnIGlzIG5vdCBhbGxvd2VkLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX2J5dGVzJywgdSd1bmljb2RlIG9iamVjdCcpCi0KLSAgICAjIENoZWNrIHRoYXQgdGhlIGRlZmF1bHQgdmFsdWUgaXMgb2YgcHl0aG9uJ3MgJ3VuaWNvZGUnIHR5cGUuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByb3RvLm9wdGlvbmFsX3N0cmluZyksIHVuaWNvZGUpCi0KLSAgICBwcm90by5vcHRpb25hbF9zdHJpbmcgPSB1bmljb2RlKCdUZXN0aW5nJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLm9wdGlvbmFsX3N0cmluZywgc3RyKCdUZXN0aW5nJykpCi0KLSAgICAjIEFzc2lnbiBhIHZhbHVlIG9mIHR5cGUgJ3N0cicgd2hpY2ggY2FuIGJlIGVuY29kZWQgaW4gVVRGLTguCi0gICAgcHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gc3RyKCdUZXN0aW5nJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLm9wdGlvbmFsX3N0cmluZywgdW5pY29kZSgnVGVzdGluZycpKQotCi0gICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKLSAgICAgICMgVmFsdWVzIG9mIHR5cGUgJ3N0cicgYXJlIGFsc28gYWNjZXB0ZWQgYXMgbG9uZyBhcyB0aGV5IGNhbiBiZQotICAgICAgIyBlbmNvZGVkIGluIFVURi04LgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0eXBlKHByb3RvLm9wdGlvbmFsX3N0cmluZyksIHN0cikKLQotICAgICMgVHJ5IHRvIGFzc2lnbiBhICdzdHInIHZhbHVlIHdoaWNoIGNvbnRhaW5zIGJ5dGVzIHRoYXQgYXJlbid0IDctYml0IEFTQ0lJLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFZhbHVlRXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICAgc2V0YXR0ciwgcHJvdG8sICdvcHRpb25hbF9zdHJpbmcnLCBzdHIoJ2FceDgwYScpKQotICAgICMgQXNzaWduIGEgJ3N0cicgb2JqZWN0IHdoaWNoIGNvbnRhaW5zIGEgVVRGLTggZW5jb2RlZCBzdHJpbmcuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICBzZXRhdHRyLCBwcm90bywgJ29wdGlvbmFsX3N0cmluZycsICfQotC10YHRgicpCi0gICAgIyBObyBleGNlcHRpb24gdGhyb3duLgotICAgIHByb3RvLm9wdGlvbmFsX3N0cmluZyA9ICdhYmMnCi0KLSAgZGVmIHRlc3RTdHJpbmdVVEY4U2VyaWFsaXphdGlvbihzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKLSAgICBleHRlbnNpb25fbWVzc2FnZSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMgotICAgIGV4dGVuc2lvbiA9IGV4dGVuc2lvbl9tZXNzYWdlLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotCi0gICAgdGVzdF91dGY4ID0gdSfQotC10YHRgicKLSAgICB0ZXN0X3V0ZjhfYnl0ZXMgPSB0ZXN0X3V0ZjguZW5jb2RlKCd1dGYtOCcpCi0KLSAgICAjICdUZXN0JyBpbiBhbm90aGVyIGxhbmd1YWdlLCB1c2luZyBVVEYtOCBjaGFyc2V0LgotICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXS5zdHIgPSB0ZXN0X3V0ZjgKLQotICAgICMgU2VyaWFsaXplIHVzaW5nIHRoZSBNZXNzYWdlU2V0IHdpcmUgZm9ybWF0ICh0aGlzIGlzIHNwZWNpZmllZCBpbiB0aGUKLSAgICAjIC5wcm90byBmaWxlKS4KLSAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgIyBDaGVjayBieXRlIHNpemUuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCi0KLSAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKLSAgICByYXcuTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0KLSAgICBtZXNzYWdlMiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMigpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIGxlbihyYXcuaXRlbSkpCi0gICAgIyBDaGVjayB0aGF0IHRoZSB0eXBlX2lkIGlzIHRoZSBzYW1lIGFzIHRoZSB0YWcgSUQgaW4gdGhlIC5wcm90byBmaWxlLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwocmF3Lml0ZW1bMF0udHlwZV9pZCwgMTU0Nzc2OSkKLQotICAgICMgQ2hlY2sgdGhlIGFjdHVhbCBieXRlcyBvbiB0aGUgd2lyZS4KLSAgICBzZWxmLmFzc2VydFRydWUoCi0gICAgICAgIHJhdy5pdGVtWzBdLm1lc3NhZ2UuZW5kc3dpdGgodGVzdF91dGY4X2J5dGVzKSkKLSAgICBtZXNzYWdlMi5NZXJnZUZyb21TdHJpbmcocmF3Lml0ZW1bMF0ubWVzc2FnZSkKLQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodHlwZShtZXNzYWdlMi5zdHIpLCB1bmljb2RlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwobWVzc2FnZTIuc3RyLCB0ZXN0X3V0ZjgpCi0KLSAgICAjIFRoZSBwdXJlIFB5dGhvbiBBUEkgdGhyb3dzIGFuIGV4Y2VwdGlvbiBvbiBNZXJnZUZyb21TdHJpbmcoKSwKLSAgICAjIGlmIGFueSBvZiB0aGUgc3RyaW5nIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBjYW4ndCBiZSBVVEYtOCBkZWNvZGVkLgotICAgICMgVGhlIEMrKyBpbXBsZW1lbnRhdGlvbiBvZiB0aGUgQVBJIGhhcyBubyB3YXkgdG8gY2hlY2sgdGhhdCBvbgotICAgICMgTWVyZ2VGcm9tU3RyaW5nIGFuZCB0aHVzIGhhcyBubyB3YXkgdG8gdGhyb3cgdGhlIGV4Y2VwdGlvbi4KLSAgICAjCi0gICAgIyBUaGUgcHVyZSBQeXRob24gQVBJIGFsd2F5cyByZXR1cm5zIG9iamVjdHMgb2YgdHlwZSAndW5pY29kZScgKFVURi04Ci0gICAgIyBlbmNvZGVkKSwgb3IgJ3N0cicgKGluIDcgYml0IEFTQ0lJKS4KLSAgICBieXRlcyA9IHJhdy5pdGVtWzBdLm1lc3NhZ2UucmVwbGFjZSgKLSAgICAgICAgdGVzdF91dGY4X2J5dGVzLCBsZW4odGVzdF91dGY4X2J5dGVzKSAqICdceGZmJykKLQotICAgIHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCA9IEZhbHNlCi0gICAgdHJ5OgotICAgICAgbWVzc2FnZTIuTWVyZ2VGcm9tU3RyaW5nKGJ5dGVzKQotICAgIGV4Y2VwdCBVbmljb2RlRGVjb2RlRXJyb3IsIGU6Ci0gICAgICB1bmljb2RlX2RlY29kZV9mYWlsZWQgPSBUcnVlCi0gICAgc3RyaW5nX2ZpZWxkID0gbWVzc2FnZTIuc3RyCi0gICAgc2VsZi5hc3NlcnRUcnVlKHVuaWNvZGVfZGVjb2RlX2ZhaWxlZCBvciB0eXBlKHN0cmluZ19maWVsZCkgPT0gc3RyKQotCi0gIGRlZiB0ZXN0RW1wdHlOZXN0ZWRNZXNzYWdlKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuTWVyZ2VGcm9tKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkNvcHlGcm9tKAotICAgICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLk1lcmdlRnJvbVN0cmluZygnJykKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZygnJykKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0KLSAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8yLkhhc0ZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpKQotCi0gIGRlZiB0ZXN0U2V0SW5QYXJlbnQoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEZhbHNlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCi0gICAgcHJvdG8ub3B0aW9uYWxncm91cC5TZXRJblBhcmVudCgpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCi0KLQotIyAgU2luY2Ugd2UgaGFkIHNvIG1hbnkgdGVzdHMgZm9yIHByb3RvY29sIGJ1ZmZlciBlcXVhbGl0eSwgd2UgYnJva2UgdGhlc2Ugb3V0Ci0jICBpbnRvIHNlcGFyYXRlIFRlc3RDYXNlIGNsYXNzZXMuCi0KLQotY2xhc3MgVGVzdEFsbFR5cGVzRXF1YWxpdHlUZXN0KHVuaXR0ZXN0LlRlc3RDYXNlKToKLQotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgc2VsZi5maXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgZGVmIHRlc3ROb3RIYXNoYWJsZShzZWxmKToKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIHNlbGYuZmlyc3RfcHJvdG8pCi0KLSAgZGVmIHRlc3RTZWxmRXF1YWxpdHkoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLmZpcnN0X3Byb3RvKQotCi0gIGRlZiB0ZXN0RW1wdHlQcm90b3NFcXVhbChzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotCi0KLWNsYXNzIEZ1bGxQcm90b3NFcXVhbGl0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gICIiIkVxdWFsaXR5IHRlc3RzIHVzaW5nIGNvbXBsZXRlbHktZnVsbCBwcm90b3MgYXMgYSBzdGFydGluZyBwb2ludC4iIiIKLQotICBkZWYgc2V0VXAoc2VsZik6Ci0gICAgc2VsZi5maXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhzZWxmLmZpcnN0X3Byb3RvKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoc2VsZi5zZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3ROb3RIYXNoYWJsZShzZWxmKToKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIGhhc2gsIHNlbGYuZmlyc3RfcHJvdG8pCi0KLSAgZGVmIHRlc3ROb25lTm90RXF1YWwoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBOb25lKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoTm9uZSwgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3ROb3RFcXVhbFRvT3RoZXJNZXNzYWdlKHNlbGYpOgotICAgIHRoaXJkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZCgpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCB0aGlyZF9wcm90bykKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHRoaXJkX3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdEFsbEZpZWxkc0ZpbGxlZEVxdWFsaXR5KHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3ROb25SZXBlYXRlZFNjYWxhcihzZWxmKToKLSAgICAjIE5vbnJlcGVhdGVkIHNjYWxhciBmaWVsZCBjaGFuZ2Ugc2hvdWxkIGNhdXNlIGluZXF1YWxpdHkuCi0gICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9pbnQzMiArPSAxCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLSAgICAjIC4uLmFzIHNob3VsZCBjbGVhcmluZyBhIGZpZWxkLgotICAgIHNlbGYuZmlyc3RfcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3ROb25SZXBlYXRlZENvbXBvc2l0ZShzZWxmKToKLSAgICAjIENoYW5nZSBhIG5vbnJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiICs9IDEKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgLT0gMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgIyBDbGVhciBhIGZpZWxkIGluIHRoZSBuZXN0ZWQgbWVzc2FnZS4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkNsZWFyRmllbGQoJ2JiJykKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotICAgIHNlbGYuZmlyc3RfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIgPSAoCi0gICAgICAgIHNlbGYuc2Vjb25kX3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLmJiKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgIyBSZW1vdmUgdGhlIG5lc3RlZCBtZXNzYWdlIGVudGlyZWx5LgotICAgIHNlbGYuZmlyc3RfcHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UnKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcihzZWxmKToKLSAgICAjIENoYW5nZSBhIHJlcGVhdGVkIHNjYWxhciBmaWVsZC4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCg1KQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdyZXBlYXRlZF9pbnQzMicpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlKHNlbGYpOgotICAgICMgQ2hhbmdlIHZhbHVlIHdpdGhpbiBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiICs9IDEKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotICAgIHNlbGYuZmlyc3RfcHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VbMF0uYmIgLT0gMQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgIyBBZGQgYSB2YWx1ZSB0byBhIHJlcGVhdGVkIGNvbXBvc2l0ZSBmaWVsZC4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChzZWxmLmZpcnN0X3Byb3RvLCBzZWxmLnNlY29uZF9wcm90bykKLSAgICBzZWxmLnNlY29uZF9wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3ROb25SZXBlYXRlZFNjYWxhckhhc0JpdHMoc2VsZik6Ci0gICAgIyBFbnN1cmUgdGhhdCB3ZSB0ZXN0ICJoYXMiIGJpdHMgYXMgd2VsbCBhcyB2YWx1ZSBmb3IKLSAgICAjIG5vbnJlcGVhdGVkIHNjYWxhciBmaWVsZC4KLSAgICBzZWxmLmZpcnN0X3Byb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ludDMyJykKLSAgICBzZWxmLnNlY29uZF9wcm90by5vcHRpb25hbF9pbnQzMiA9IDAKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotCi0gIGRlZiB0ZXN0Tm9uUmVwZWF0ZWRDb21wb3NpdGVIYXNCaXRzKHNlbGYpOgotICAgICMgRW5zdXJlIHRoYXQgd2UgdGVzdCAiaGFzIiBiaXRzIGFzIHdlbGwgYXMgdmFsdWUgZm9yCi0gICAgIyBub25yZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuCi0gICAgc2VsZi5maXJzdF9wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZScpCi0gICAgc2VsZi5zZWNvbmRfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYmInKQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoc2VsZi5maXJzdF9wcm90bywgc2VsZi5zZWNvbmRfcHJvdG8pCi0gICAgc2VsZi5maXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDAKLSAgICBzZWxmLmZpcnN0X3Byb3RvLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkNsZWFyRmllbGQoJ2JiJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlbGYuZmlyc3RfcHJvdG8sIHNlbGYuc2Vjb25kX3Byb3RvKQotCi0KLWNsYXNzIEV4dGVuc2lvbkVxdWFsaXR5VGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RFeHRlbnNpb25FcXVhbGl0eShzZWxmKToKLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0gICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoZmlyc3RfcHJvdG8pCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotICAgIHRlc3RfdXRpbC5TZXRBbGxFeHRlbnNpb25zKHNlY29uZF9wcm90bykKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgICAjIEVuc3VyZSB0aGF0IHdlIGNoZWNrIHZhbHVlIGVxdWFsaXR5LgotICAgIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gKz0gMQotICAgIHNlbGYuYXNzZXJ0Tm90RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLSAgICBmaXJzdF9wcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dIC09IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgICAjIEVuc3VyZSB0aGF0IHdlIGFsc28gbG9vayBhdCAiaGFzIiBiaXRzLgotICAgIGZpcnN0X3Byb3RvLkNsZWFyRXh0ZW5zaW9uKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb24pCi0gICAgc2Vjb25kX3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gPSAwCi0gICAgc2VsZi5hc3NlcnROb3RFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotICAgIGZpcnN0X3Byb3RvLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbl0gPSAwCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotCi0gICAgIyBFbnN1cmUgdGhhdCBkaWZmZXJlbmNlcyBpbiBjYWNoZWQgdmFsdWVzCi0gICAgIyBkb24ndCBtYXR0ZXIgaWYgImhhcyIgYml0cyBhcmUgYm90aCBmYWxzZS4KLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAwLCBmaXJzdF9wcm90by5FeHRlbnNpb25zW3VuaXR0ZXN0X3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotCi1jbGFzcyBNdXR1YWxSZWN1cnNpb25FcXVhbGl0eVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0RXF1YWxpdHlXaXRoTXV0dWFsUmVjdXJzaW9uKHNlbGYpOgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RNdXR1YWxSZWN1cnNpb25BKCkKLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdE11dHVhbFJlY3Vyc2lvbkEoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLSAgICBmaXJzdF9wcm90by5iYi5hLmJiLm9wdGlvbmFsX2ludDMyID0gMjMKLSAgICBzZWxmLmFzc2VydE5vdEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0gICAgc2Vjb25kX3Byb3RvLmJiLmEuYmIub3B0aW9uYWxfaW50MzIgPSAyMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotCi1jbGFzcyBCeXRlU2l6ZVRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgc2VsZi5leHRlbmRlZF9wcm90byA9IG1vcmVfZXh0ZW5zaW9uc19wYjIuRXh0ZW5kZWRNZXNzYWdlKCkKLSAgICBzZWxmLnBhY2tlZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIHNlbGYucGFja2VkX2V4dGVuZGVkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRFeHRlbnNpb25zKCkKLQotICBkZWYgU2l6ZShzZWxmKToKLSAgICByZXR1cm4gc2VsZi5wcm90by5CeXRlU2l6ZSgpCi0KLSAgZGVmIHRlc3RFbXB0eU1lc3NhZ2Uoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0KLSAgZGVmIHRlc3RTaXplZE9uS3dhcmdzKHNlbGYpOgotICAgICMgVXNlIGEgc2VwYXJhdGUgbWVzc2FnZSB0byBlbnN1cmUgdGVzdGluZyByaWdodCBhZnRlciBjcmVhdGlvbi4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBwcm90b19rd2FyZ3MgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKG9wdGlvbmFsX2ludDY0ID0gMSkKLSAgICAjIE9uZSBieXRlIGZvciB0aGUgdGFnLCBvbmUgdG8gZW5jb2RlIHZhcmludCAxLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG9fa3dhcmdzLkJ5dGVTaXplKCkpCi0KLSAgZGVmIHRlc3RWYXJpbnRzKHNlbGYpOgotICAgIGRlZiBUZXN0KGksIGV4cGVjdGVkX3ZhcmludF9zaXplKToKLSAgICAgIHNlbGYucHJvdG8uQ2xlYXIoKQotICAgICAgc2VsZi5wcm90by5vcHRpb25hbF9pbnQ2NCA9IGkKLSAgICAgICMgQWRkIG9uZSB0byB0aGUgdmFyaW50IHNpemUgZm9yIHRoZSB0YWcgaW5mbwotICAgICAgIyBmb3IgdGFnIDEuCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3ZhcmludF9zaXplICsgMSwgc2VsZi5TaXplKCkpCi0gICAgVGVzdCgwLCAxKQotICAgIFRlc3QoMSwgMSkKLSAgICBmb3IgaSwgbnVtX2J5dGVzIGluIHppcChyYW5nZSg3LCA2MywgNyksIHJhbmdlKDEsIDEwMDAwKSk6Ci0gICAgICBUZXN0KCgxIDw8IGkpIC0gMSwgbnVtX2J5dGVzKQotICAgIFRlc3QoLTEsIDEwKQotICAgIFRlc3QoLTIsIDEwKQotICAgIFRlc3QoLSgxIDw8IDYzKSwgMTApCi0KLSAgZGVmIHRlc3RTdHJpbmdzKHNlbGYpOgotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJycKLSAgICAjIE5lZWQgb25lIGJ5dGUgZm9yIHRhZyBpbmZvICh0YWcgIzE0KSwgYW5kIG9uZSBieXRlIGZvciBsZW5ndGguCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzZWxmLlNpemUoKSkKLQotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nID0gJ2FiYycKLSAgICAjIE5lZWQgb25lIGJ5dGUgZm9yIHRhZyBpbmZvICh0YWcgIzE0KSwgYW5kIG9uZSBieXRlIGZvciBsZW5ndGguCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgbGVuKHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nKSwgc2VsZi5TaXplKCkpCi0KLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX3N0cmluZyA9ICd4JyAqIDEyOAotICAgICMgTmVlZCBvbmUgYnl0ZSBmb3IgdGFnIGluZm8gKHRhZyAjMTQpLCBhbmQgVFdPIGJ5dGVzIGZvciBsZW5ndGguCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzICsgbGVuKHNlbGYucHJvdG8ub3B0aW9uYWxfc3RyaW5nKSwgc2VsZi5TaXplKCkpCi0KLSAgZGVmIHRlc3RPdGhlck51bWVyaWNzKHNlbGYpOgotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZml4ZWQzMiA9IDEyMzQKLSAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDQgYnl0ZXMgZm9yIGZpeGVkMzIuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBzZWxmLlNpemUoKSkKLSAgICBzZWxmLnByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0KLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZpeGVkNjQgPSAxMjM0Ci0gICAgIyBPbmUgYnl0ZSBmb3IgdGFnIGFuZCA4IGJ5dGVzIGZvciBmaXhlZDY0LgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOSwgc2VsZi5TaXplKCkpCi0gICAgc2VsZi5wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9mbG9hdCA9IDEuMjM0Ci0gICAgIyBPbmUgYnl0ZSBmb3IgdGFnIGFuZCA0IGJ5dGVzIGZvciBmbG9hdC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYuU2l6ZSgpKQotICAgIHNlbGYucHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfZG91YmxlID0gMS4yMzQKLSAgICAjIE9uZSBieXRlIGZvciB0YWcgYW5kIDggYnl0ZXMgZm9yIGZsb2F0LgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOSwgc2VsZi5TaXplKCkpCi0gICAgc2VsZi5wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9zaW50MzIgPSA2NAotICAgICMgT25lIGJ5dGUgZm9yIHRhZyBhbmQgMiBieXRlcyBmb3IgemlnLXphZy1lbmNvZGVkIDY0LgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5TaXplKCkpCi0gICAgc2VsZi5wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotCi0gIGRlZiB0ZXN0Q29tcG9zaXRlcyhzZWxmKToKLSAgICAjIDMgYnl0ZXMuCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9ICgxIDw8IDE0KQotICAgICMgUGx1cyBvbmUgYnl0ZSBmb3IgYmIgdGFnLgotICAgICMgUGx1cyAxIGJ5dGUgZm9yIG9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHNlcmlhbGl6ZWQgc2l6ZS4KLSAgICAjIFBsdXMgdHdvIGJ5dGVzIGZvciBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSB0YWcuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzICsgMSArIDEgKyAyLCBzZWxmLlNpemUoKSkKLQotICBkZWYgdGVzdEdyb3VwcyhzZWxmKToKLSAgICAjIDQgYnl0ZXMuCi0gICAgc2VsZi5wcm90by5vcHRpb25hbGdyb3VwLmEgPSAoMSA8PCAyMSkKLSAgICAjIFBsdXMgdHdvIGJ5dGVzIGZvciB8YXwgdGFnLgotICAgICMgUGx1cyAyICogdHdvIGJ5dGVzIGZvciBTVEFSVF9HUk9VUCBhbmQgRU5EX0dST1VQIHRhZ3MuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0ICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnMoc2VsZik6Ci0gICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTApICAjIDEgYnl0ZS4KLSAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMjgpICAjIDIgYnl0ZXMuCi0gICAgIyBBbHNvIG5lZWQgMiBieXRlcyBmb3IgZWFjaCBlbnRyeSBmb3IgdGFnLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSArIDIgKyAyKjIsIHNlbGYuU2l6ZSgpKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRTY2FsYXJzRXh0ZW5kKHNlbGYpOgotICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIuZXh0ZW5kKFsxMCwgMTI4XSkgICMgMyBieXRlcy4KLSAgICAjIEFsc28gbmVlZCAyIGJ5dGVzIGZvciBlYWNoIGVudHJ5IGZvciB0YWcuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxICsgMiArIDIqMiwgc2VsZi5TaXplKCkpCi0KLSAgZGVmIHRlc3RSZXBlYXRlZFNjYWxhcnNSZW1vdmUoc2VsZik6Ci0gICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMTApICAjIDEgYnl0ZS4KLSAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxMjgpICAjIDIgYnl0ZXMuCi0gICAgIyBBbHNvIG5lZWQgMiBieXRlcyBmb3IgZWFjaCBlbnRyeSBmb3IgdGFnLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSArIDIgKyAyKjIsIHNlbGYuU2l6ZSgpKQotICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzIucmVtb3ZlKDEyOCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEgKyAyLCBzZWxmLlNpemUoKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkQ29tcG9zaXRlcyhzZWxmKToKLSAgICAjIEVtcHR5IG1lc3NhZ2UuICAyIGJ5dGVzIHRhZyBwbHVzIDEgYnl0ZSBsZW5ndGguCi0gICAgZm9yZWlnbl9tZXNzYWdlXzAgPSBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgIyAyIGJ5dGVzIHRhZyBwbHVzIDEgYnl0ZSBsZW5ndGggcGx1cyAxIGJ5dGUgYmIgdGFnIDEgYnl0ZSBpbnQuCi0gICAgZm9yZWlnbl9tZXNzYWdlXzEgPSBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlLmFkZCgpCi0gICAgZm9yZWlnbl9tZXNzYWdlXzEuYmIgPSA3Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgMSArIDIgKyAxICsgMSArIDEsIHNlbGYuU2l6ZSgpKQotCi0gIGRlZiB0ZXN0UmVwZWF0ZWRDb21wb3NpdGVzRGVsZXRlKHNlbGYpOgotICAgICMgRW1wdHkgbWVzc2FnZS4gIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aC4KLSAgICBmb3JlaWduX21lc3NhZ2VfMCA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KLSAgICBmb3JlaWduX21lc3NhZ2VfMSA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBmb3JlaWduX21lc3NhZ2VfMS5iYiA9IDkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMiArIDEgKyAxICsgMSwgc2VsZi5TaXplKCkpCi0KLSAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KLSAgICBkZWwgc2VsZi5wcm90by5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZVswXQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIDEgKyAxICsgMSwgc2VsZi5TaXplKCkpCi0KLSAgICAjIE5vdyBhZGQgYSBuZXcgbWVzc2FnZS4KLSAgICBmb3JlaWduX21lc3NhZ2VfMiA9IHNlbGYucHJvdG8ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBmb3JlaWduX21lc3NhZ2VfMi5iYiA9IDEyCi0KLSAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KLSAgICAjIDIgYnl0ZXMgdGFnIHBsdXMgMSBieXRlIGxlbmd0aCBwbHVzIDEgYnl0ZSBiYiB0YWcgMSBieXRlIGludC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAxICsgMSArIDEgKyAyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKLQotICAgICMgMiBieXRlcyB0YWcgcGx1cyAxIGJ5dGUgbGVuZ3RoIHBsdXMgMSBieXRlIGJiIHRhZyAxIGJ5dGUgaW50LgotICAgIGRlbCBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyICsgMSArIDEgKyAxLCBzZWxmLlNpemUoKSkKLQotICAgIGRlbCBzZWxmLnByb3RvLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLlNpemUoKSkKLQotICBkZWYgdGVzdFJlcGVhdGVkR3JvdXBzKHNlbGYpOgotICAgICMgMi1ieXRlIFNUQVJUX0dST1VQIHBsdXMgMi1ieXRlIEVORF9HUk9VUC4KLSAgICBncm91cF8wID0gc2VsZi5wcm90by5yZXBlYXRlZGdyb3VwLmFkZCgpCi0gICAgIyAyLWJ5dGUgU1RBUlRfR1JPVVAgcGx1cyAyLWJ5dGUgfGF8IHRhZyArIDEtYnl0ZSB8YXwKLSAgICAjIHBsdXMgMi1ieXRlIEVORF9HUk9VUC4KLSAgICBncm91cF8xID0gc2VsZi5wcm90by5yZXBlYXRlZGdyb3VwLmFkZCgpCi0gICAgZ3JvdXBfMS5hID0gIDcKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIgKyAyICsgMiArIDIgKyAxICsgMiwgc2VsZi5TaXplKCkpCi0KLSAgZGVmIHRlc3RFeHRlbnNpb25zKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHByb3RvLkJ5dGVTaXplKCkpCi0gICAgZXh0ZW5zaW9uID0gdW5pdHRlc3RfcGIyLm9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbiAgIyBGaWVsZCAjMSwgMSBieXRlLgotICAgIHByb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXSA9IDIzCi0gICAgIyAxIGJ5dGUgZm9yIHRhZywgMSBieXRlIGZvciB2YWx1ZS4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvLkJ5dGVTaXplKCkpCi0KLSAgZGVmIHRlc3RDYWNoZUludmFsaWRhdGlvbkZvck5vbnJlcGVhdGVkU2NhbGFyKHNlbGYpOgotICAgICMgVGVzdCBub24tZXh0ZW5zaW9uLgotICAgIHNlbGYucHJvdG8ub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9pbnQzMiA9IDEyOAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYucHJvdG8uQ2xlYXJGaWVsZCgnb3B0aW9uYWxfaW50MzInKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotCi0gICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCi0gICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5vcHRpb25hbF9pbnRfZXh0ZW5zaW9uCi0gICAgc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0gPSAxMjgKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLmV4dGVuZGVkX3Byb3RvLkNsZWFyRXh0ZW5zaW9uKGV4dGVuc2lvbikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLQotICBkZWYgdGVzdENhY2hlSW52YWxpZGF0aW9uRm9yUmVwZWF0ZWRTY2FsYXIoc2VsZik6Ci0gICAgIyBUZXN0IG5vbi1leHRlbnNpb24uCi0gICAgc2VsZi5wcm90by5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDMsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLnByb3RvLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNiwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0gPSAxMjgKLSAgICBzZWxmLmFzc2VydEVxdWFsKDcsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ3JlcGVhdGVkX2ludDMyJykKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLQotICAgICMgVGVzdCB3aXRoaW4gZXh0ZW5zaW9uLgotICAgIGV4dGVuc2lvbiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIucmVwZWF0ZWRfaW50X2V4dGVuc2lvbgotICAgIHJlcGVhdGVkID0gc2VsZi5leHRlbmRlZF9wcm90by5FeHRlbnNpb25zW2V4dGVuc2lvbl0KLSAgICByZXBlYXRlZC5hcHBlbmQoMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICByZXBlYXRlZC5hcHBlbmQoMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICByZXBlYXRlZFsxXSA9IDEyOAotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotCi0gIGRlZiB0ZXN0Q2FjaGVJbnZhbGlkYXRpb25Gb3JOb25yZXBlYXRlZE1lc3NhZ2Uoc2VsZik6Ci0gICAgIyBUZXN0IG5vbi1leHRlbnNpb24uCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuYyA9IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKDUsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLSAgICBzZWxmLnByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMTI4Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5wcm90by5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UuQ2xlYXJGaWVsZCgnYycpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5wcm90by5DbGVhckZpZWxkKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotCi0gICAgaWYgYXBpX2ltcGxlbWVudGF0aW9uLlR5cGUoKSA9PSAncHl0aG9uJzoKLSAgICAgICMgVGhpcyBpcyBvbmx5IHBvc3NpYmxlIGluIHB1cmUtUHl0aG9uIGltcGxlbWVudGF0aW9uIG9mIHRoZSBBUEkuCi0gICAgICBjaGlsZCA9IHNlbGYucHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlCi0gICAgICBzZWxmLnByb3RvLkNsZWFyRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpCi0gICAgICBjaGlsZC5jID0gMTI4Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHNlbGYucHJvdG8uQnl0ZVNpemUoKSkKLQotICAgICMgVGVzdCB3aXRoaW4gZXh0ZW5zaW9uLgotICAgIGV4dGVuc2lvbiA9IG1vcmVfZXh0ZW5zaW9uc19wYjIub3B0aW9uYWxfbWVzc2FnZV9leHRlbnNpb24KLSAgICBjaGlsZCA9IHNlbGYuZXh0ZW5kZWRfcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb25dCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgY2hpbGQuZm9yZWlnbl9tZXNzYWdlX2ludCA9IDEKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBjaGlsZC5mb3JlaWduX21lc3NhZ2VfaW50ID0gMTI4Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5leHRlbmRlZF9wcm90by5DbGVhckV4dGVuc2lvbihleHRlbnNpb24pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0KLSAgZGVmIHRlc3RDYWNoZUludmFsaWRhdGlvbkZvclJlcGVhdGVkTWVzc2FnZShzZWxmKToKLSAgICAjIFRlc3Qgbm9uLWV4dGVuc2lvbi4KLSAgICBjaGlsZDAgPSBzZWxmLnByb3RvLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5hZGQoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYucHJvdG8ucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlLmFkZCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgY2hpbGQwLmMgPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg4LCBzZWxmLnByb3RvLkJ5dGVTaXplKCkpCi0gICAgc2VsZi5wcm90by5DbGVhckZpZWxkKCdyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wcm90by5CeXRlU2l6ZSgpKQotCi0gICAgIyBUZXN0IHdpdGhpbiBleHRlbnNpb24uCi0gICAgZXh0ZW5zaW9uID0gbW9yZV9leHRlbnNpb25zX3BiMi5yZXBlYXRlZF9tZXNzYWdlX2V4dGVuc2lvbgotICAgIGNoaWxkX2xpc3QgPSBzZWxmLmV4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbZXh0ZW5zaW9uXQotICAgIGNoaWxkMCA9IGNoaWxkX2xpc3QuYWRkKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLSAgICBjaGlsZF9saXN0LmFkZCgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgY2hpbGQwLmZvcmVpZ25fbWVzc2FnZV9pbnQgPSAxCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg2LCBzZWxmLmV4dGVuZGVkX3Byb3RvLkJ5dGVTaXplKCkpCi0gICAgY2hpbGQwLkNsZWFyRmllbGQoJ2ZvcmVpZ25fbWVzc2FnZV9pbnQnKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIHNlbGYuZXh0ZW5kZWRfcHJvdG8uQ2xlYXJFeHRlbnNpb24oZXh0ZW5zaW9uKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotCi0gIGRlZiB0ZXN0UGFja2VkUmVwZWF0ZWRTY2FsYXJzKHNlbGYpOgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKLQotICAgIHNlbGYucGFja2VkX3Byb3RvLnBhY2tlZF9pbnQzMi5hcHBlbmQoMTApICAgIyAxIGJ5dGUuCi0gICAgc2VsZi5wYWNrZWRfcHJvdG8ucGFja2VkX2ludDMyLmFwcGVuZCgxMjgpICAjIDIgYnl0ZXMuCi0gICAgIyBUaGUgdGFnIGlzIDIgYnl0ZXMgKHRoZSBmaWVsZCBudW1iZXIgaXMgOTApLCBhbmQgdGhlIHZhcmludAotICAgICMgc3RvcmluZyB0aGUgbGVuZ3RoIGlzIDEgYnl0ZS4KLSAgICBpbnRfc2l6ZSA9IDEgKyAyICsgMwotICAgIHNlbGYuYXNzZXJ0RXF1YWwoaW50X3NpemUsIHNlbGYucGFja2VkX3Byb3RvLkJ5dGVTaXplKCkpCi0KLSAgICBzZWxmLnBhY2tlZF9wcm90by5wYWNrZWRfZG91YmxlLmFwcGVuZCg0LjIpICAgIyA4IGJ5dGVzCi0gICAgc2VsZi5wYWNrZWRfcHJvdG8ucGFja2VkX2RvdWJsZS5hcHBlbmQoMy4yNSkgICMgOCBieXRlcwotICAgICMgMiBtb3JlIHRhZyBieXRlcywgMSBtb3JlIGxlbmd0aCBieXRlLgotICAgIGRvdWJsZV9zaXplID0gOCArIDggKyAzCi0gICAgc2VsZi5hc3NlcnRFcXVhbChpbnRfc2l6ZStkb3VibGVfc2l6ZSwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKLQotICAgIHNlbGYucGFja2VkX3Byb3RvLkNsZWFyRmllbGQoJ3BhY2tlZF9pbnQzMicpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChkb3VibGVfc2l6ZSwgc2VsZi5wYWNrZWRfcHJvdG8uQnl0ZVNpemUoKSkKLQotICBkZWYgdGVzdFBhY2tlZEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBzZWxmLnBhY2tlZF9leHRlbmRlZF9wcm90by5CeXRlU2l6ZSgpKQotICAgIGV4dGVuc2lvbiA9IHNlbGYucGFja2VkX2V4dGVuZGVkX3Byb3RvLkV4dGVuc2lvbnNbCi0gICAgICAgIHVuaXR0ZXN0X3BiMi5wYWNrZWRfZml4ZWQzMl9leHRlbnNpb25dCi0gICAgZXh0ZW5zaW9uLmV4dGVuZChbMSwgMiwgMywgNF0pICAgIyAxNiBieXRlcwotICAgICMgVGFnIGlzIDMgYnl0ZXMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxOSwgc2VsZi5wYWNrZWRfZXh0ZW5kZWRfcHJvdG8uQnl0ZVNpemUoKSkKLQotCi0jIElzc3VlcyB0byBiZSBzdXJlIHRvIGNvdmVyIGluY2x1ZGU6Ci0jICAgKiBIYW5kbGluZyBvZiB1bnJlY29nbml6ZWQgdGFncyAoInVuaW50ZXJwcmV0ZWRfYnl0ZXMiKS4KLSMgICAqIEhhbmRsaW5nIG9mIE1lc3NhZ2VTZXRzLgotIyAgICogQ29uc2lzdGVudCBvcmRlcmluZyBvZiB0YWdzIGluIHRoZSB3aXJlIGZvcm1hdCwKLSMgICAgIGluY2x1ZGluZyBvcmRlcmluZyBiZXR3ZWVuIGV4dGVuc2lvbnMgYW5kIG5vbi1leHRlbnNpb24KLSMgICAgIGZpZWxkcy4KLSMgICAqIENvbnNpc3RlbnQgc2VyaWFsaXphdGlvbiBvZiBuZWdhdGl2ZSBudW1iZXJzLCBlc3BlY2lhbGx5Ci0jICAgICBuZWdhdGl2ZSBpbnQzMnMuCi0jICAgKiBIYW5kbGluZyBvZiBlbXB0eSBzdWJtZXNzYWdlcyAod2l0aCBhbmQgd2l0aG91dCAiaGFzIgotIyAgICAgYml0cyBzZXQpLgotCi1jbGFzcyBTZXJpYWxpemF0aW9uVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RTZXJpYWxpemVFbXRweU1lc3NhZ2Uoc2VsZik6Ci0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQotICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3RTZXJpYWxpemVBbGxGaWVsZHMoc2VsZik6Ci0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKGZpcnN0X3Byb3RvKQotICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCi0gICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdFNlcmlhbGl6ZUFsbEV4dGVuc2lvbnMoc2VsZik6Ci0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbEV4dGVuc2lvbnMoKQotICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMoZmlyc3RfcHJvdG8pCi0gICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChmaXJzdF9wcm90bywgc2Vjb25kX3Byb3RvKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplTmVnYXRpdmVWYWx1ZXMoc2VsZik6Ci0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLQotICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyID0gLTEKLSAgICBmaXJzdF9wcm90by5vcHRpb25hbF9pbnQ2NCA9IC0oMiA8PCA0MCkKLSAgICBmaXJzdF9wcm90by5vcHRpb25hbF9zaW50MzIgPSAtMwotICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX3NpbnQ2NCA9IC0oNCA8PCA0MCkKLSAgICBmaXJzdF9wcm90by5vcHRpb25hbF9zZml4ZWQzMiA9IC01Ci0gICAgZmlyc3RfcHJvdG8ub3B0aW9uYWxfc2ZpeGVkNjQgPSAtKDYgPDwgNDApCi0KLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZyb21TdHJpbmcoCi0gICAgICAgIGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3RQYXJzZVRydW5jYXRlZChzZWxmKToKLSAgICAjIFRoaXMgdGVzdCBpcyBvbmx5IGFwcGxpY2FibGUgZm9yIHRoZSBQeXRob24gaW1wbGVtZW50YXRpb24gb2YgdGhlIEFQSS4KLSAgICBpZiBhcGlfaW1wbGVtZW50YXRpb24uVHlwZSgpICE9ICdweXRob24nOgotICAgICAgcmV0dXJuCi0KLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMoZmlyc3RfcHJvdG8pCi0gICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgIGZvciB0cnVuY2F0aW9uX3BvaW50IGluIHhyYW5nZShsZW4oc2VyaWFsaXplZCkgKyAxKToKLSAgICAgIHRyeToKLSAgICAgICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgICAgIHVua25vd25fZmllbGRzID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UoKQotICAgICAgICBwb3MgPSBzZWNvbmRfcHJvdG8uX0ludGVybmFsUGFyc2Uoc2VyaWFsaXplZCwgMCwgdHJ1bmNhdGlvbl9wb2ludCkKLSAgICAgICAgIyBJZiB3ZSBkaWRuJ3QgcmFpc2UgYW4gZXJyb3IgdGhlbiB3ZSByZWFkIGV4YWN0bHkgdGhlIGFtb3VudCBleHBlY3RlZC4KLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cnVuY2F0aW9uX3BvaW50LCBwb3MpCi0KLSAgICAgICAgIyBQYXJzaW5nIHRvIHVua25vd24gZmllbGRzIHNob3VsZCBub3QgdGhyb3cgaWYgcGFyc2luZyB0byBrbm93biBmaWVsZHMKLSAgICAgICAgIyBkaWQgbm90LgotICAgICAgICB0cnk6Ci0gICAgICAgICAgcG9zMiA9IHVua25vd25fZmllbGRzLl9JbnRlcm5hbFBhcnNlKHNlcmlhbGl6ZWQsIDAsIHRydW5jYXRpb25fcG9pbnQpCi0gICAgICAgICAgc2VsZi5hc3NlcnRFcXVhbCh0cnVuY2F0aW9uX3BvaW50LCBwb3MyKQotICAgICAgICBleGNlcHQgbWVzc2FnZS5EZWNvZGVFcnJvcjoKLSAgICAgICAgICBzZWxmLmZhaWwoJ1BhcnNpbmcgdW5rbm93biBmaWVsZHMgZmFpbGVkIHdoZW4gcGFyc2luZyBrbm93biBmaWVsZHMgJwotICAgICAgICAgICAgICAgICAgICAnZGlkIG5vdC4nKQotICAgICAgZXhjZXB0IG1lc3NhZ2UuRGVjb2RlRXJyb3I6Ci0gICAgICAgICMgUGFyc2luZyB1bmtub3duIGZpZWxkcyBzaG91bGQgYWxzbyBmYWlsLgotICAgICAgICBzZWxmLmFzc2VydFJhaXNlcyhtZXNzYWdlLkRlY29kZUVycm9yLCB1bmtub3duX2ZpZWxkcy5fSW50ZXJuYWxQYXJzZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgc2VyaWFsaXplZCwgMCwgdHJ1bmNhdGlvbl9wb2ludCkKLQotICBkZWYgdGVzdENhbm9uaWNhbFNlcmlhbGl6YXRpb25PcmRlcihzZWxmKToKLSAgICBwcm90byA9IG1vcmVfbWVzc2FnZXNfcGIyLk91dE9mT3JkZXJGaWVsZHMoKQotICAgICMgVGhlc2UgYXJlIGFsc28gdGhlaXIgdGFnIG51bWJlcnMuICBFdmVuIHRob3VnaCB3ZSdyZSBzZXR0aW5nIHRoZXNlIGluCi0gICAgIyByZXZlcnNlLXRhZyBvcmRlciBBTkQgdGhleSdyZSBsaXN0ZWQgaW4gcmV2ZXJzZSB0YWctb3JkZXIgaW4gdGhlIC5wcm90bwotICAgICMgZmlsZSwgdGhleSBzaG91bGQgbm9uZXRoZWxlc3MgYmUgc2VyaWFsaXplZCBpbiB0YWcgb3JkZXIuCi0gICAgcHJvdG8ub3B0aW9uYWxfc2ludDMyID0gNQotICAgIHByb3RvLkV4dGVuc2lvbnNbbW9yZV9tZXNzYWdlc19wYjIub3B0aW9uYWxfdWludDY0XSA9IDQKLSAgICBwcm90by5vcHRpb25hbF91aW50MzIgPSAzCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1ttb3JlX21lc3NhZ2VzX3BiMi5vcHRpb25hbF9pbnQ2NF0gPSAyCi0gICAgcHJvdG8ub3B0aW9uYWxfaW50MzIgPSAxCi0gICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKLSAgICBkID0gX01pbmlEZWNvZGVyKHNlcmlhbGl6ZWQpCi0gICAgUmVhZFRhZyA9IGQuUmVhZEZpZWxkTnVtYmVyQW5kV2lyZVR5cGUKLSAgICBzZWxmLmFzc2VydEVxdWFsKCgxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQpLCBSZWFkVGFnKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDIsIHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCksIFJlYWRUYWcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGQuUmVhZEludDY0KCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoMywgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgZC5SZWFkVUludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoNCwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCwgZC5SZWFkVUludDY0KCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoNSwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5UKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNSwgZC5SZWFkU0ludDMyKCkpCi0KLSAgZGVmIHRlc3RDYW5vbmljYWxTZXJpYWxpemF0aW9uT3JkZXJTYW1lQXNDcHAoc2VsZik6Ci0gICAgIyBDb3B5IG9mIHRoZSBzYW1lIHRlc3Qgd2UgdXNlIGZvciBDKysuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEZpZWxkT3JkZXJpbmdzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzQW5kRXh0ZW5zaW9ucyhwcm90bykKLSAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHRlc3RfdXRpbC5FeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihzZXJpYWxpemVkKQotCi0gIGRlZiB0ZXN0TWVyZ2VGcm9tU3RyaW5nV2hlbkZpZWxkc0FscmVhZHlTZXQoc2VsZik6Ci0gICAgZmlyc3RfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBmaXJzdF9wcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdmb29iYXInKQotICAgIGZpcnN0X3Byb3RvLm9wdGlvbmFsX2ludDMyID0gMjMKLSAgICBmaXJzdF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDQyCi0gICAgc2VyaWFsaXplZCA9IGZpcnN0X3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgIHNlY29uZF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlY29uZF9wcm90by5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdiYXonKQotICAgIHNlY29uZF9wcm90by5vcHRpb25hbF9pbnQzMiA9IDEwMAotICAgIHNlY29uZF9wcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDk5OQotCi0gICAgc2Vjb25kX3Byb3RvLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotICAgICMgRW5zdXJlIHRoYXQgd2UgYXBwZW5kIHRvIHJlcGVhdGVkIGZpZWxkcy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKFsnYmF6JywgJ2Zvb2JhciddLCBsaXN0KHNlY29uZF9wcm90by5yZXBlYXRlZF9zdHJpbmcpKQotICAgICMgRW5zdXJlIHRoYXQgd2Ugb3ZlcndyaXRlIG5vbnJlcGVhdGQgc2NhbGFycy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDIzLCBzZWNvbmRfcHJvdG8ub3B0aW9uYWxfaW50MzIpCi0gICAgIyBFbnN1cmUgdGhhdCB3ZSByZWN1cnNpdmVseSBjYWxsIE1lcmdlRnJvbVN0cmluZygpIG9uCi0gICAgIyBzdWJtZXNzYWdlcy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDQyLCBzZWNvbmRfcHJvdG8ub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCi0KLSAgZGVmIHRlc3RNZXNzYWdlU2V0V2lyZUZvcm1hdChzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKLSAgICBleHRlbnNpb25fbWVzc2FnZTEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEKLSAgICBleHRlbnNpb25fbWVzc2FnZTIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjIKLSAgICBleHRlbnNpb24xID0gZXh0ZW5zaW9uX21lc3NhZ2UxLm1lc3NhZ2Vfc2V0X2V4dGVuc2lvbgotICAgIGV4dGVuc2lvbjIgPSBleHRlbnNpb25fbWVzc2FnZTIubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb24xXS5pID0gMTIzCi0gICAgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb24yXS5zdHIgPSAnZm9vJwotCi0gICAgIyBTZXJpYWxpemUgdXNpbmcgdGhlIE1lc3NhZ2VTZXQgd2lyZSBmb3JtYXQgKHRoaXMgaXMgc3BlY2lmaWVkIGluIHRoZQotICAgICMgLnByb3RvIGZpbGUpLgotICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLAotICAgICAgICAgICAgICAgICAgICAgcmF3LkRFU0NSSVBUT1IuR2V0T3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQotICAgIHJhdy5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGxlbihyYXcuaXRlbSkpCi0KLSAgICBtZXNzYWdlMSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpCi0gICAgbWVzc2FnZTEuTWVyZ2VGcm9tU3RyaW5nKHJhdy5pdGVtWzBdLm1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxMjMsIG1lc3NhZ2UxLmkpCi0KLSAgICBtZXNzYWdlMiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMigpCi0gICAgbWVzc2FnZTIuTWVyZ2VGcm9tU3RyaW5nKHJhdy5pdGVtWzFdLm1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vJywgbWVzc2FnZTIuc3RyKQotCi0gICAgIyBEZXNlcmlhbGl6ZSB1c2luZyB0aGUgTWVzc2FnZVNldCB3aXJlIGZvcm1hdC4KLSAgICBwcm90bzIgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldCgpCi0gICAgcHJvdG8yLk1lcmdlRnJvbVN0cmluZyhzZXJpYWxpemVkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLCBwcm90bzIuRXh0ZW5zaW9uc1tleHRlbnNpb24xXS5pKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIHByb3RvMi5FeHRlbnNpb25zW2V4dGVuc2lvbjJdLnN0cikKLQotICAgICMgQ2hlY2sgYnl0ZSBzaXplLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwocHJvdG8yLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHByb3RvLkJ5dGVTaXplKCksIGxlbihzZXJpYWxpemVkKSkKLQotICBkZWYgdGVzdE1lc3NhZ2VTZXRXaXJlRm9ybWF0VW5rbm93bkV4dGVuc2lvbihzZWxmKToKLSAgICAjIENyZWF0ZSBhIG1lc3NhZ2UgdXNpbmcgdGhlIG1lc3NhZ2Ugc2V0IHdpcmUgZm9ybWF0IHdpdGggYW4gdW5rbm93bgotICAgICMgbWVzc2FnZS4KLSAgICByYXcgPSB1bml0dGVzdF9tc2V0X3BiMi5SYXdNZXNzYWdlU2V0KCkKLQotICAgICMgQWRkIGFuIGl0ZW0uCi0gICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCi0gICAgaXRlbS50eXBlX2lkID0gMTU0NTAwOAotICAgIGV4dGVuc2lvbl9tZXNzYWdlMSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMQotICAgIG1lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKCkKLSAgICBtZXNzYWdlMS5pID0gMTIzNDUKLSAgICBpdGVtLm1lc3NhZ2UgPSBtZXNzYWdlMS5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICAjIEFkZCBhIHNlY29uZCwgdW5rbm93biBleHRlbnNpb24uCi0gICAgaXRlbSA9IHJhdy5pdGVtLmFkZCgpCi0gICAgaXRlbS50eXBlX2lkID0gMTU0NTAwOQotICAgIGV4dGVuc2lvbl9tZXNzYWdlMSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMQotICAgIG1lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xKCkKLSAgICBtZXNzYWdlMS5pID0gMTIzNDYKLSAgICBpdGVtLm1lc3NhZ2UgPSBtZXNzYWdlMS5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICAjIEFkZCBhbm90aGVyIHVua25vd24gZXh0ZW5zaW9uLgotICAgIGl0ZW0gPSByYXcuaXRlbS5hZGQoKQotICAgIGl0ZW0udHlwZV9pZCA9IDE1NDUwMTAKLSAgICBtZXNzYWdlMSA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMigpCi0gICAgbWVzc2FnZTEuc3RyID0gJ2ZvbycKLSAgICBpdGVtLm1lc3NhZ2UgPSBtZXNzYWdlMS5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICBzZXJpYWxpemVkID0gcmF3LlNlcmlhbGl6ZVRvU3RyaW5nKCkKLQotICAgICMgUGFyc2UgbWVzc2FnZSB1c2luZyB0aGUgbWVzc2FnZSBzZXQgd2lyZSBmb3JtYXQuCi0gICAgcHJvdG8gPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldCgpCi0gICAgcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0KLSAgICAjIENoZWNrIHRoYXQgdGhlIG1lc3NhZ2UgcGFyc2VkIHdlbGwuCi0gICAgZXh0ZW5zaW9uX21lc3NhZ2UxID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xCi0gICAgZXh0ZW5zaW9uMSA9IGV4dGVuc2lvbl9tZXNzYWdlMS5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBzZWxmLmFzc2VydEVxdWFscygxMjM0NSwgcHJvdG8uRXh0ZW5zaW9uc1tleHRlbnNpb24xXS5pKQotCi0gIGRlZiB0ZXN0VW5rbm93bkZpZWxkcyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxGaWVsZHMocHJvdG8pCi0KLSAgICBzZXJpYWxpemVkID0gcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgIyBUaGUgZW1wdHkgbWVzc2FnZSBzaG91bGQgYmUgcGFyc2FibGUgd2l0aCBhbGwgb2YgdGhlIGZpZWxkcwotICAgICMgdW5rbm93bi4KLSAgICBwcm90bzIgPSB1bml0dGVzdF9wYjIuVGVzdEVtcHR5TWVzc2FnZSgpCi0KLSAgICAjIFBhcnNpbmcgdGhpcyBtZXNzYWdlIHNob3VsZCBzdWNjZWVkLgotICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICAgICMgTm93IHRlc3Qgd2l0aCBhIGludDY0IGZpZWxkIHNldC4KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHByb3RvLm9wdGlvbmFsX2ludDY0ID0gMHgwZmZmZmZmZmZmZmZmZmZmCi0gICAgc2VyaWFsaXplZCA9IHByb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCkKLSAgICAjIFRoZSBlbXB0eSBtZXNzYWdlIHNob3VsZCBiZSBwYXJzYWJsZSB3aXRoIGFsbCBvZiB0aGUgZmllbGRzCi0gICAgIyB1bmtub3duLgotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0RW1wdHlNZXNzYWdlKCkKLSAgICAjIFBhcnNpbmcgdGhpcyBtZXNzYWdlIHNob3VsZCBzdWNjZWVkLgotICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICBkZWYgX0NoZWNrUmFpc2VzKHNlbGYsIGV4Y19jbGFzcywgY2FsbGFibGVfb2JqLCBleGNlcHRpb24pOgotICAgICIiIlRoaXMgbWV0aG9kIGNoZWNrcyBpZiB0aGUgZXhjcGV0aW9uIHR5cGUgYW5kIG1lc3NhZ2UgYXJlIGFzIGV4cGVjdGVkLiIiIgotICAgIHRyeToKLSAgICAgIGNhbGxhYmxlX29iaigpCi0gICAgZXhjZXB0IGV4Y19jbGFzcywgZXg6Ci0gICAgICAjIENoZWNrIGlmIHRoZSBleGNlcHRpb24gbWVzc2FnZSBpcyB0aGUgcmlnaHQgb25lLgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChleGNlcHRpb24sIHN0cihleCkpCi0gICAgICByZXR1cm4KLSAgICBlbHNlOgotICAgICAgcmFpc2Ugc2VsZi5mYWlsdXJlRXhjZXB0aW9uKCclcyBub3QgcmFpc2VkJyAlIHN0cihleGNfY2xhc3MpKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplVW5pbml0aWFsaXplZChzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQotICAgIHNlbGYuX0NoZWNrUmFpc2VzKAotICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAotICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKLSAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGEsYixjJykKLSAgICAjIFNob3VsZG4ndCByYWlzZSBleGNlcHRpb25zLgotICAgIHBhcnRpYWwgPSBwcm90by5TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoKQotCi0gICAgcHJvdG8uYSA9IDEKLSAgICBzZWxmLl9DaGVja1JhaXNlcygKLSAgICAgICAgbWVzc2FnZS5FbmNvZGVFcnJvciwKLSAgICAgICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcsCi0gICAgICAgICdNZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiBiLGMnKQotICAgICMgU2hvdWxkbid0IHJhaXNlIGV4Y2VwdGlvbnMuCi0gICAgcGFydGlhbCA9IHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCi0KLSAgICBwcm90by5iID0gMgotICAgIHNlbGYuX0NoZWNrUmFpc2VzKAotICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAotICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKLSAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6IGMnKQotICAgICMgU2hvdWxkbid0IHJhaXNlIGV4Y2VwdGlvbnMuCi0gICAgcGFydGlhbCA9IHByb3RvLlNlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygpCi0KLSAgICBwcm90by5jID0gMwotICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgIyBTaG91bGRuJ3QgcmFpc2UgZXhjZXB0aW9ucy4KLSAgICBwYXJ0aWFsID0gcHJvdG8uU2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCkKLQotICAgIHByb3RvMiA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoKQotICAgIHByb3RvMi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvMi5hKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8yLmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90bzIuYykKLSAgICBwcm90bzIuUGFyc2VGcm9tU3RyaW5nKHBhcnRpYWwpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90bzIuYSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIHByb3RvMi5iKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgcHJvdG8yLmMpCi0KLSAgZGVmIHRlc3RTZXJpYWxpemVVbmluaXRpYWxpemVkU3ViTWVzc2FnZShzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKCkKLQotICAgICMgU3ViLW1lc3NhZ2UgZG9lc24ndCBleGlzdCB5ZXQsIHNvIHRoaXMgc3VjY2VlZHMuCi0gICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5hID0gMQotICAgIHNlbGYuX0NoZWNrUmFpc2VzKAotICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAotICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKLSAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcKLSAgICAgICAgJ29wdGlvbmFsX21lc3NhZ2UuYixvcHRpb25hbF9tZXNzYWdlLmMnKQotCi0gICAgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5iID0gMgotICAgIHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuYyA9IDMKLSAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0KLSAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlLmFkZCgpLmEgPSAxCi0gICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZS5hZGQoKS5iID0gMgotICAgIHNlbGYuX0NoZWNrUmFpc2VzKAotICAgICAgICBtZXNzYWdlLkVuY29kZUVycm9yLAotICAgICAgICBwcm90by5TZXJpYWxpemVUb1N0cmluZywKLSAgICAgICAgJ01lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICcKLSAgICAgICAgJ3JlcGVhdGVkX21lc3NhZ2VbMF0uYixyZXBlYXRlZF9tZXNzYWdlWzBdLmMsJwotICAgICAgICAncmVwZWF0ZWRfbWVzc2FnZVsxXS5hLHJlcGVhdGVkX21lc3NhZ2VbMV0uYycpCi0KLSAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzBdLmIgPSAyCi0gICAgcHJvdG8ucmVwZWF0ZWRfbWVzc2FnZVswXS5jID0gMwotICAgIHByb3RvLnJlcGVhdGVkX21lc3NhZ2VbMV0uYSA9IDEKLSAgICBwcm90by5yZXBlYXRlZF9tZXNzYWdlWzFdLmMgPSAzCi0gICAgcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gIGRlZiB0ZXN0U2VyaWFsaXplQWxsUGFja2VkRmllbGRzKHNlbGYpOgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhmaXJzdF9wcm90bykKLSAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8uQnl0ZVNpemUoKSwgbGVuKHNlcmlhbGl6ZWQpKQotICAgIGJ5dGVzX3JlYWQgPSBzZWNvbmRfcHJvdG8uTWVyZ2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChzZWNvbmRfcHJvdG8uQnl0ZVNpemUoKSwgYnl0ZXNfcmVhZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGZpcnN0X3Byb3RvLCBzZWNvbmRfcHJvdG8pCi0KLSAgZGVmIHRlc3RTZXJpYWxpemVBbGxQYWNrZWRFeHRlbnNpb25zKHNlbGYpOgotICAgIGZpcnN0X3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRFeHRlbnNpb25zKCkKLSAgICBzZWNvbmRfcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZEV4dGVuc2lvbnMoKQotICAgIHRlc3RfdXRpbC5TZXRBbGxQYWNrZWRFeHRlbnNpb25zKGZpcnN0X3Byb3RvKQotICAgIHNlcmlhbGl6ZWQgPSBmaXJzdF9wcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgYnl0ZXNfcmVhZCA9IHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHNlY29uZF9wcm90by5CeXRlU2l6ZSgpLCBieXRlc19yZWFkKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoZmlyc3RfcHJvdG8sIHNlY29uZF9wcm90bykKLQotICBkZWYgdGVzdE1lcmdlUGFja2VkRnJvbVN0cmluZ1doZW5Tb21lRmllbGRzQWxyZWFkeVNldChzZWxmKToKLSAgICBmaXJzdF9wcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIGZpcnN0X3Byb3RvLnBhY2tlZF9pbnQzMi5leHRlbmQoWzEsIDJdKQotICAgIGZpcnN0X3Byb3RvLnBhY2tlZF9kb3VibGUuYXBwZW5kKDMuMCkKLSAgICBzZXJpYWxpemVkID0gZmlyc3RfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoKQotCi0gICAgc2Vjb25kX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgc2Vjb25kX3Byb3RvLnBhY2tlZF9pbnQzMi5hcHBlbmQoMykKLSAgICBzZWNvbmRfcHJvdG8ucGFja2VkX2RvdWJsZS5leHRlbmQoWzEuMCwgMi4wXSkKLSAgICBzZWNvbmRfcHJvdG8ucGFja2VkX3NpbnQzMi5hcHBlbmQoNCkKLQotICAgIHNlY29uZF9wcm90by5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFszLCAxLCAyXSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9pbnQzMikKLSAgICBzZWxmLmFzc2VydEVxdWFsKFsxLjAsIDIuMCwgMy4wXSwgc2Vjb25kX3Byb3RvLnBhY2tlZF9kb3VibGUpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChbNF0sIHNlY29uZF9wcm90by5wYWNrZWRfc2ludDMyKQotCi0gIGRlZiB0ZXN0UGFja2VkRmllbGRzV2lyZUZvcm1hdChzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIHByb3RvLnBhY2tlZF9pbnQzMi5leHRlbmQoWzEsIDIsIDE1MCwgM10pICAjIDEgKyAxICsgMiArIDEgYnl0ZXMKLSAgICBwcm90by5wYWNrZWRfZG91YmxlLmV4dGVuZChbMS4wLCAxMDAwLjBdKSAgIyA4ICsgOCBieXRlcwotICAgIHByb3RvLnBhY2tlZF9mbG9hdC5hcHBlbmQoMi4wKSAgICAgICAgICAgICAjIDQgYnl0ZXMsIHdpbGwgYmUgYmVmb3JlIGRvdWJsZQotICAgIHNlcmlhbGl6ZWQgPSBwcm90by5TZXJpYWxpemVUb1N0cmluZygpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChwcm90by5CeXRlU2l6ZSgpLCBsZW4oc2VyaWFsaXplZCkpCi0gICAgZCA9IF9NaW5pRGVjb2RlcihzZXJpYWxpemVkKQotICAgIFJlYWRUYWcgPSBkLlJlYWRGaWVsZE51bWJlckFuZFdpcmVUeXBlCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoOTAsIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpLCBSZWFkVGFnKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxKzErMSsyLCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgZC5SZWFkSW50MzIoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDIsIGQuUmVhZEludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxNTAsIGQuUmVhZEludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoKDEwMCwgd2lyZV9mb3JtYXQuV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCksIFJlYWRUYWcoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDQsIGQuUmVhZEludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLjAsIGQuUmVhZEZsb2F0KCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgoMTAxLCB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSwgUmVhZFRhZygpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoOCs4LCBkLlJlYWRJbnQzMigpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMS4wLCBkLlJlYWREb3VibGUoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwMDAuMCwgZC5SZWFkRG91YmxlKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKGQuRW5kT2ZTdHJlYW0oKSkKLQotICBkZWYgdGVzdFBhcnNlUGFja2VkRnJvbVVucGFja2VkKHNlbGYpOgotICAgIHVucGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsVW5wYWNrZWRGaWVsZHModW5wYWNrZWQpCi0gICAgcGFja2VkID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgcGFja2VkLk1lcmdlRnJvbVN0cmluZyh1bnBhY2tlZC5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIGV4cGVjdGVkID0gdW5pdHRlc3RfcGIyLlRlc3RQYWNrZWRUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbFBhY2tlZEZpZWxkcyhleHBlY3RlZCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkLCBwYWNrZWQpCi0KLSAgZGVmIHRlc3RQYXJzZVVucGFja2VkRnJvbVBhY2tlZChzZWxmKToKLSAgICBwYWNrZWQgPSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsUGFja2VkRmllbGRzKHBhY2tlZCkKLSAgICB1bnBhY2tlZCA9IHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcygpCi0gICAgdW5wYWNrZWQuTWVyZ2VGcm9tU3RyaW5nKHBhY2tlZC5TZXJpYWxpemVUb1N0cmluZygpKQotICAgIGV4cGVjdGVkID0gdW5pdHRlc3RfcGIyLlRlc3RVbnBhY2tlZFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsVW5wYWNrZWRGaWVsZHMoZXhwZWN0ZWQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZCwgdW5wYWNrZWQpCi0KLSAgZGVmIHRlc3RGaWVsZE51bWJlcnMoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZS5CQl9GSUVMRF9OVU1CRVIsIDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMX0lOVDMyX0ZJRUxEX05VTUJFUiwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxHUk9VUF9GSUVMRF9OVU1CRVIsIDE2KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUiwgMTgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuT1BUSU9OQUxfTkVTVEVEX0VOVU1fRklFTERfTlVNQkVSLCAyMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURfSU5UMzJfRklFTERfTlVNQkVSLCAzMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURHUk9VUF9GSUVMRF9OVU1CRVIsIDQ2KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoCi0gICAgICB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLlJFUEVBVEVEX05FU1RFRF9NRVNTQUdFX0ZJRUxEX05VTUJFUiwgNDgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuUkVQRUFURURfTkVTVEVEX0VOVU1fRklFTERfTlVNQkVSLCA1MSkKLQotICBkZWYgdGVzdEV4dGVuc2lvbkZpZWxkTnVtYmVycyhzZWxmKToKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuc2luZ2xlLm51bWJlciwgMTAwMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQuU0lOR0xFX0ZJRUxEX05VTUJFUiwgMTAwMCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQubXVsdGkubnVtYmVyLCAxMDAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RSZXF1aXJlZC5NVUxUSV9GSUVMRF9OVU1CRVIsIDEwMDEpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIub3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLm51bWJlciwgMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5PUFRJT05BTF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uLm51bWJlciwgMTYpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuT1BUSU9OQUxHUk9VUF9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAxNikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24ubnVtYmVyLCAxOCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgdW5pdHRlc3RfcGIyLk9QVElPTkFMX05FU1RFRF9NRVNTQUdFX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsIDE4KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbi5udW1iZXIsIDIxKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLk9QVElPTkFMX05FU1RFRF9FTlVNX0VYVEVOU0lPTl9GSUVMRF9OVU1CRVIsCi0gICAgICAyMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb24ubnVtYmVyLCAzMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9JTlQzMl9FWFRFTlNJT05fRklFTERfTlVNQkVSLCAzMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbi5udW1iZXIsIDQ2KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlJFUEVBVEVER1JPVVBfRVhURU5TSU9OX0ZJRUxEX05VTUJFUiwgNDYpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uLm51bWJlciwgNDgpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgKLSAgICAgIHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9ORVNURURfTUVTU0FHRV9FWFRFTlNJT05fRklFTERfTlVNQkVSLCA0OCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24ubnVtYmVyLCA1MSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5SRVBFQVRFRF9ORVNURURfRU5VTV9FWFRFTlNJT05fRklFTERfTlVNQkVSLAotICAgICAgNTEpCi0KLSAgZGVmIHRlc3RJbml0S3dhcmdzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygKLSAgICAgICAgb3B0aW9uYWxfaW50MzI9MSwKLSAgICAgICAgb3B0aW9uYWxfc3RyaW5nPSdmb28nLAotICAgICAgICBvcHRpb25hbF9ib29sPVRydWUsCi0gICAgICAgIG9wdGlvbmFsX2J5dGVzPSdiYXInLAotICAgICAgICBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZT11bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UoYmI9MSksCi0gICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZT11bml0dGVzdF9wYjIuRm9yZWlnbk1lc3NhZ2UoYz0xKSwKLSAgICAgICAgb3B0aW9uYWxfbmVzdGVkX2VudW09dW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCi0gICAgICAgIG9wdGlvbmFsX2ZvcmVpZ25fZW51bT11bml0dGVzdF9wYjIuRk9SRUlHTl9GT08sCi0gICAgICAgIHJlcGVhdGVkX2ludDMyPVsxLCAyLCAzXSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX3N0cmluZycpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9lbnVtJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLkhhc0ZpZWxkKCdvcHRpb25hbF9mb3JlaWduX2VudW0nKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ2ZvbycsIHByb3RvLm9wdGlvbmFsX3N0cmluZykKLSAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHByb3RvLm9wdGlvbmFsX2Jvb2wpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnYmFyJywgcHJvdG8ub3B0aW9uYWxfYnl0ZXMpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYikKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08sCi0gICAgICAgICAgICAgICAgICAgICBwcm90by5vcHRpb25hbF9uZXN0ZWRfZW51bSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywgcHJvdG8ub3B0aW9uYWxfZm9yZWlnbl9lbnVtKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoWzEsIDIsIDNdLCBwcm90by5yZXBlYXRlZF9pbnQzMikKLQotICBkZWYgdGVzdEluaXRBcmdzVW5rbm93bkZpZWxkTmFtZShzZWxmKToKLSAgICBkZWYgSW5pdGFsaXplRW1wdHlNZXNzYWdlV2l0aEV4dHJhS2V5d29yZEFyZygpOgotICAgICAgdW51c2VkX3Byb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RFbXB0eU1lc3NhZ2UodW5rbm93bj0ndW5rbm93bicpCi0gICAgc2VsZi5fQ2hlY2tSYWlzZXMoVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICBJbml0YWxpemVFbXB0eU1lc3NhZ2VXaXRoRXh0cmFLZXl3b3JkQXJnLAotICAgICAgICAgICAgICAgICAgICAgICdQcm90b2NvbCBtZXNzYWdlIGhhcyBubyAidW5rbm93biIgZmllbGQuJykKLQotICBkZWYgdGVzdEluaXRSZXF1aXJlZEt3YXJncyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSXNJbml0aWFsaXplZCgpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYScpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYicpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5IYXNGaWVsZCgnYycpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShub3QgcHJvdG8uSGFzRmllbGQoJ2R1bW15MicpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8uYSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLmIpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBwcm90by5jKQotCi0gIGRlZiB0ZXN0SW5pdFJlcXVpcmVkRm9yZWlnbkt3YXJncyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWRGb3JlaWduKAotICAgICAgICBvcHRpb25hbF9tZXNzYWdlPXVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8uSGFzRmllbGQoJ29wdGlvbmFsX21lc3NhZ2UnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5Jc0luaXRpYWxpemVkKCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLm9wdGlvbmFsX21lc3NhZ2UuSGFzRmllbGQoJ2EnKSkKLSAgICBzZWxmLmFzc2VydFRydWUocHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5IYXNGaWVsZCgnYicpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdjJykpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG5vdCBwcm90by5vcHRpb25hbF9tZXNzYWdlLkhhc0ZpZWxkKCdkdW1teTInKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0UmVxdWlyZWQoYT0xLCBiPTEsIGM9MSksCi0gICAgICAgICAgICAgICAgICAgICBwcm90by5vcHRpb25hbF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5hKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5iKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgcHJvdG8ub3B0aW9uYWxfbWVzc2FnZS5jKQotCi0gIGRlZiB0ZXN0SW5pdFJlcGVhdGVkS3dhcmdzKHNlbGYpOgotICAgIHByb3RvID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcyhyZXBlYXRlZF9pbnQzMj1bMSwgMiwgM10pCi0gICAgc2VsZi5hc3NlcnRUcnVlKHByb3RvLklzSW5pdGlhbGl6ZWQoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIHByb3RvLnJlcGVhdGVkX2ludDMyWzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgcHJvdG8ucmVwZWF0ZWRfaW50MzJbMV0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgzLCBwcm90by5yZXBlYXRlZF9pbnQzMlsyXSkKLQotCi1jbGFzcyBPcHRpb25zVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RNZXNzYWdlT3B0aW9ucyhzZWxmKToKLSAgICBwcm90byA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0KCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsCi0gICAgICAgICAgICAgICAgICAgICBwcm90by5ERVNDUklQVE9SLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoRmFsc2UsCi0gICAgICAgICAgICAgICAgICAgICBwcm90by5ERVNDUklQVE9SLkdldE9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKLQotICBkZWYgdGVzdFBhY2tlZE9wdGlvbnMoc2VsZik6Ci0gICAgcHJvdG8gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBwcm90by5vcHRpb25hbF9pbnQzMiA9IDEKLSAgICBwcm90by5vcHRpb25hbF9kb3VibGUgPSAzLjAKLSAgICBmb3IgZmllbGRfZGVzY3JpcHRvciwgXyBpbiBwcm90by5MaXN0RmllbGRzKCk6Ci0gICAgICBzZWxmLmFzc2VydEVxdWFsKEZhbHNlLCBmaWVsZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5wYWNrZWQpCi0KLSAgICBwcm90byA9IHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkVHlwZXMoKQotICAgIHByb3RvLnBhY2tlZF9pbnQzMi5hcHBlbmQoMSkKLSAgICBwcm90by5wYWNrZWRfZG91YmxlLmFwcGVuZCgzLjApCi0gICAgZm9yIGZpZWxkX2Rlc2NyaXB0b3IsIF8gaW4gcHJvdG8uTGlzdEZpZWxkcygpOgotICAgICAgc2VsZi5hc3NlcnRFcXVhbChUcnVlLCBmaWVsZF9kZXNjcmlwdG9yLkdldE9wdGlvbnMoKS5wYWNrZWQpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKHJlZmxlY3Rpb24uX0ZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRCwKLSAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfZGVzY3JpcHRvci5sYWJlbCkKLQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvc2VydmljZV9yZWZsZWN0aW9uX3Rlc3QucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggZTA0ZjgyNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9zZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdC5weQorKysgL2Rldi9udWxsCkBAIC0xLDEzNiArMCwwIEBACi0jISAvdXNyL2Jpbi9weXRob24KLSMKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0iIiJUZXN0cyBmb3IgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLnNlcnZpY2VfcmVmbGVjdGlvbi4iIiIKLQotX19hdXRob3JfXyA9ICdwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpJwotCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlX3JlZmxlY3Rpb24KLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlCi0KLQotY2xhc3MgRm9vVW5pdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0U2VydmljZShzZWxmKToKLSAgICBjbGFzcyBNb2NrUnBjQ2hhbm5lbChzZXJ2aWNlLlJwY0NoYW5uZWwpOgotICAgICAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kLCBjb250cm9sbGVyLCByZXF1ZXN0LCByZXNwb25zZSwgY2FsbGJhY2spOgotICAgICAgICBzZWxmLm1ldGhvZCA9IG1ldGhvZAotICAgICAgICBzZWxmLmNvbnRyb2xsZXIgPSBjb250cm9sbGVyCi0gICAgICAgIHNlbGYucmVxdWVzdCA9IHJlcXVlc3QKLSAgICAgICAgY2FsbGJhY2socmVzcG9uc2UpCi0KLSAgICBjbGFzcyBNb2NrUnBjQ29udHJvbGxlcihzZXJ2aWNlLlJwY0NvbnRyb2xsZXIpOgotICAgICAgZGVmIFNldEZhaWxlZChzZWxmLCBtc2cpOgotICAgICAgICBzZWxmLmZhaWx1cmVfbWVzc2FnZSA9IG1zZwotCi0gICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IE5vbmUKLQotICAgIGNsYXNzIE15U2VydmljZSh1bml0dGVzdF9wYjIuVGVzdFNlcnZpY2UpOgotICAgICAgcGFzcwotCi0gICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IE5vbmUKLQotICAgIGRlZiBNeUNhbGxiYWNrKHJlc3BvbnNlKToKLSAgICAgIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UgPSByZXNwb25zZQotCi0gICAgcnBjX2NvbnRyb2xsZXIgPSBNb2NrUnBjQ29udHJvbGxlcigpCi0gICAgY2hhbm5lbCA9IE1vY2tScGNDaGFubmVsKCkKLSAgICBzcnZjID0gTXlTZXJ2aWNlKCkKLSAgICBzcnZjLkZvbyhycGNfY29udHJvbGxlciwgdW5pdHRlc3RfcGIyLkZvb1JlcXVlc3QoKSwgTXlDYWxsYmFjaykKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdNZXRob2QgRm9vIG5vdCBpbXBsZW1lbnRlZC4nLAotICAgICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgc2VsZi5jYWxsYmFja19yZXNwb25zZSkKLQotICAgIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSA9IE5vbmUKLQotICAgIHNlcnZpY2VfZGVzY3JpcHRvciA9IHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZS5HZXREZXNjcmlwdG9yKCkKLSAgICBzcnZjLkNhbGxNZXRob2Qoc2VydmljZV9kZXNjcmlwdG9yLm1ldGhvZHNbMV0sIHJwY19jb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuQmFyUmVxdWVzdCgpLCBNeUNhbGxiYWNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoJ01ldGhvZCBCYXIgbm90IGltcGxlbWVudGVkLicsCi0gICAgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlci5mYWlsdXJlX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChOb25lLCBzZWxmLmNhbGxiYWNrX3Jlc3BvbnNlKQotICAgIAotICAgIGNsYXNzIE15U2VydmljZUltcGwodW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlKToKLSAgICAgIGRlZiBGb28oc2VsZiwgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGRvbmUpOgotICAgICAgICBzZWxmLmZvb19jYWxsZWQgPSBUcnVlCi0gICAgICBkZWYgQmFyKHNlbGYsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBkb25lKToKLSAgICAgICAgc2VsZi5iYXJfY2FsbGVkID0gVHJ1ZQotCi0gICAgc3J2YyA9IE15U2VydmljZUltcGwoKQotICAgIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSA9IE5vbmUKLSAgICBzcnZjLkZvbyhycGNfY29udHJvbGxlciwgdW5pdHRlc3RfcGIyLkZvb1JlcXVlc3QoKSwgTXlDYWxsYmFjaykKLSAgICBzZWxmLmFzc2VydEVxdWFsKE5vbmUsIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKFRydWUsIHNydmMuZm9vX2NhbGxlZCkKLQotICAgIHJwY19jb250cm9sbGVyLmZhaWx1cmVfbWVzc2FnZSA9IE5vbmUKLSAgICBzcnZjLkNhbGxNZXRob2Qoc2VydmljZV9kZXNjcmlwdG9yLm1ldGhvZHNbMV0sIHJwY19jb250cm9sbGVyLAotICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuQmFyUmVxdWVzdCgpLCBNeUNhbGxiYWNrKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoTm9uZSwgcnBjX2NvbnRyb2xsZXIuZmFpbHVyZV9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoVHJ1ZSwgc3J2Yy5iYXJfY2FsbGVkKQotCi0gIGRlZiB0ZXN0U2VydmljZVN0dWIoc2VsZik6Ci0gICAgY2xhc3MgTW9ja1JwY0NoYW5uZWwoc2VydmljZS5ScGNDaGFubmVsKToKLSAgICAgIGRlZiBDYWxsTWV0aG9kKHNlbGYsIG1ldGhvZCwgY29udHJvbGxlciwgcmVxdWVzdCwKLSAgICAgICAgICAgICAgICAgICAgIHJlc3BvbnNlX2NsYXNzLCBjYWxsYmFjayk6Ci0gICAgICAgIHNlbGYubWV0aG9kID0gbWV0aG9kCi0gICAgICAgIHNlbGYuY29udHJvbGxlciA9IGNvbnRyb2xsZXIKLSAgICAgICAgc2VsZi5yZXF1ZXN0ID0gcmVxdWVzdAotICAgICAgICBjYWxsYmFjayhyZXNwb25zZV9jbGFzcygpKQotCi0gICAgc2VsZi5jYWxsYmFja19yZXNwb25zZSA9IE5vbmUKLQotICAgIGRlZiBNeUNhbGxiYWNrKHJlc3BvbnNlKToKLSAgICAgIHNlbGYuY2FsbGJhY2tfcmVzcG9uc2UgPSByZXNwb25zZQotCi0gICAgY2hhbm5lbCA9IE1vY2tScGNDaGFubmVsKCkKLSAgICBzdHViID0gdW5pdHRlc3RfcGIyLlRlc3RTZXJ2aWNlX1N0dWIoY2hhbm5lbCkKLSAgICBycGNfY29udHJvbGxlciA9ICdjb250cm9sbGVyJwotICAgIHJlcXVlc3QgPSAncmVxdWVzdCcKLQotICAgICMgR2V0RGVzY3JpcHRvciBub3cgc3RhdGljLCBzdGlsbCB3b3JrcyBhcyBpbnN0YW5jZSBtZXRob2QgZm9yIGNvbXBhdGFiaWxpdHkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0U2VydmljZV9TdHViLkdldERlc2NyaXB0b3IoKSwKLSAgICAgICAgICAgICAgICAgICAgIHN0dWIuR2V0RGVzY3JpcHRvcigpKQotCi0gICAgIyBJbnZva2UgbWV0aG9kLgotICAgIHN0dWIuRm9vKHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBNeUNhbGxiYWNrKQotCi0gICAgc2VsZi5hc3NlcnRUcnVlKGlzaW5zdGFuY2Uoc2VsZi5jYWxsYmFja19yZXNwb25zZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bml0dGVzdF9wYjIuRm9vUmVzcG9uc2UpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocmVxdWVzdCwgY2hhbm5lbC5yZXF1ZXN0KQotICAgIHNlbGYuYXNzZXJ0RXF1YWwocnBjX2NvbnRyb2xsZXIsIGNoYW5uZWwuY29udHJvbGxlcikKLSAgICBzZWxmLmFzc2VydEVxdWFsKHN0dWIuR2V0RGVzY3JpcHRvcigpLm1ldGhvZHNbMF0sIGNoYW5uZWwubWV0aG9kKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF91dGlsLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGVzdF91dGlsLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxZGYxNjE5Li4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3Rlc3RfdXRpbC5weQorKysgL2Rldi9udWxsCkBAIC0xLDYzNSArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiVXRpbGl0aWVzIGZvciBQeXRob24gcHJvdG8yIHRlc3RzLgotCi1UaGlzIGlzIGludGVudGlvbmFsbHkgbW9kZWxlZCBvbiBDKysgY29kZSBpbgotLy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLiouCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotaW1wb3J0IG9zLnBhdGgKLQotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X2ltcG9ydF9wYjIKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB1bml0dGVzdF9wYjIKLQotCi1kZWYgU2V0QWxsRmllbGRzKG1lc3NhZ2UpOgotICAiIiJTZXRzIGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgotCi0gIEFyZ3M6Ci0gICAgbWVzc2FnZTogQSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzIGluc3RhbmNlLgotICAiIiIKLQotICAjCi0gICMgT3B0aW9uYWwgZmllbGRzLgotICAjCi0KLSAgbWVzc2FnZS5vcHRpb25hbF9pbnQzMiAgICA9IDEwMQotICBtZXNzYWdlLm9wdGlvbmFsX2ludDY0ICAgID0gMTAyCi0gIG1lc3NhZ2Uub3B0aW9uYWxfdWludDMyICAgPSAxMDMKLSAgbWVzc2FnZS5vcHRpb25hbF91aW50NjQgICA9IDEwNAotICBtZXNzYWdlLm9wdGlvbmFsX3NpbnQzMiAgID0gMTA1Ci0gIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDY0ICAgPSAxMDYKLSAgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyICA9IDEwNwotICBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQgID0gMTA4Ci0gIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIgPSAxMDkKLSAgbWVzc2FnZS5vcHRpb25hbF9zZml4ZWQ2NCA9IDExMAotICBtZXNzYWdlLm9wdGlvbmFsX2Zsb2F0ICAgID0gMTExCi0gIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlICAgPSAxMTIKLSAgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICA9IFRydWUKLSAgIyBUT0RPKHJvYmluc29uKTogRmlybWx5IHNwZWMgb3V0IGFuZCB0ZXN0IGhvdwotICAjIHByb3RvcyBpbnRlcmFjdCB3aXRoIHVuaWNvZGUuICBPbmUgc3BlY2lmaWMgZXhhbXBsZToKLSAgIyB3aGF0IGhhcHBlbnMgaWYgd2UgY2hhbmdlIHRoZSBsaXRlcmFsIGJlbG93IHRvCi0gICMgdScxMTUnPyAgV2hhdCAqc2hvdWxkKiBoYXBwZW4/ICBTdGlsbCBzb21lIGRpc2N1c3Npb24KLSAgIyB0byBmaW5pc2ggd2l0aCBLZW50b24gYWJvdXQgYnl0ZXMgdnMuIHN0cmluZ3MKLSAgIyBhbmQgZm9yY2luZyBldmVyeXRoaW5nIHRvIGJlIHV0ZjguIDotLwotICBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgID0gJzExNScKLSAgbWVzc2FnZS5vcHRpb25hbF9ieXRlcyAgICA9ICcxMTYnCi0KLSAgbWVzc2FnZS5vcHRpb25hbGdyb3VwLmEgPSAxMTcKLSAgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZS5iYiA9IDExOAotICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5jID0gMTE5Ci0gIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UuZCA9IDEyMAotCi0gIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0gPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWgotICBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fZW51bSA9IHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWgotICBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtID0gdW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaCi0KLSAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmdfcGllY2UgPSAnMTI0JwotICBtZXNzYWdlLm9wdGlvbmFsX2NvcmQgPSAnMTI1JwotCi0gICMKLSAgIyBSZXBlYXRlZCBmaWVsZHMuCi0gICMKLQotICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgyMDEpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDIwMikKLSAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDIwMykKLSAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDIwNCkKLSAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDIwNSkKLSAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDIwNikKLSAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgyMDcpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMjA4KQotICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgyMDkpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDIxMCkKLSAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMjExKQotICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMjEyKQotICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKFRydWUpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgnMjE1JykKLSAgbWVzc2FnZS5yZXBlYXRlZF9ieXRlcy5hcHBlbmQoJzIxNicpCi0KLSAgbWVzc2FnZS5yZXBlYXRlZGdyb3VwLmFkZCgpLmEgPSAyMTcKLSAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZS5hZGQoKS5iYiA9IDIxOAotICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZS5hZGQoKS5jID0gMjE5Ci0gIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UuYWRkKCkuZCA9IDIyMAotCi0gIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSKQotICBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bS5hcHBlbmQodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSKQotICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtLmFwcGVuZCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVIpCi0KLSAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2UuYXBwZW5kKCcyMjQnKQotICBtZXNzYWdlLnJlcGVhdGVkX2NvcmQuYXBwZW5kKCcyMjUnKQotCi0gICMgQWRkIGEgc2Vjb25kIG9uZSBvZiBlYWNoIGZpZWxkLgotICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgzMDEpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKDMwMikKLSAgbWVzc2FnZS5yZXBlYXRlZF91aW50MzIuYXBwZW5kKDMwMykKLSAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDMwNCkKLSAgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIuYXBwZW5kKDMwNSkKLSAgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjQuYXBwZW5kKDMwNikKLSAgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyLmFwcGVuZCgzMDcpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NC5hcHBlbmQoMzA4KQotICBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyLmFwcGVuZCgzMDkpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQuYXBwZW5kKDMxMCkKLSAgbWVzc2FnZS5yZXBlYXRlZF9mbG9hdC5hcHBlbmQoMzExKQotICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMzEyKQotICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wuYXBwZW5kKEZhbHNlKQotICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJzMxNScpCi0gIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMuYXBwZW5kKCczMTYnKQotCi0gIG1lc3NhZ2UucmVwZWF0ZWRncm91cC5hZGQoKS5hID0gMzE3Ci0gIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkuYmIgPSAzMTgKLSAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UuYWRkKCkuYyA9IDMxOQotICBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlLmFkZCgpLmQgPSAzMjAKLQotICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtLmFwcGVuZCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkJBWikKLSAgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0uYXBwZW5kKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWikKLSAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bS5hcHBlbmQodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaKQotCi0gIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nX3BpZWNlLmFwcGVuZCgnMzI0JykKLSAgbWVzc2FnZS5yZXBlYXRlZF9jb3JkLmFwcGVuZCgnMzI1JykKLQotICAjCi0gICMgRmllbGRzIHRoYXQgaGF2ZSBkZWZhdWx0cy4KLSAgIwotCi0gIG1lc3NhZ2UuZGVmYXVsdF9pbnQzMiA9IDQwMQotICBtZXNzYWdlLmRlZmF1bHRfaW50NjQgPSA0MDIKLSAgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMiA9IDQwMwotICBtZXNzYWdlLmRlZmF1bHRfdWludDY0ID0gNDA0Ci0gIG1lc3NhZ2UuZGVmYXVsdF9zaW50MzIgPSA0MDUKLSAgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCA9IDQwNgotICBtZXNzYWdlLmRlZmF1bHRfZml4ZWQzMiA9IDQwNwotICBtZXNzYWdlLmRlZmF1bHRfZml4ZWQ2NCA9IDQwOAotICBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIgPSA0MDkKLSAgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0ID0gNDEwCi0gIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCA9IDQxMQotICBtZXNzYWdlLmRlZmF1bHRfZG91YmxlID0gNDEyCi0gIG1lc3NhZ2UuZGVmYXVsdF9ib29sID0gRmFsc2UKLSAgbWVzc2FnZS5kZWZhdWx0X3N0cmluZyA9ICc0MTUnCi0gIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcyA9ICc0MTYnCi0KLSAgbWVzc2FnZS5kZWZhdWx0X25lc3RlZF9lbnVtID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5GT08KLSAgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSA9IHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTwotICBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0gPSB1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08KLQotICBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nX3BpZWNlID0gJzQyNCcKLSAgbWVzc2FnZS5kZWZhdWx0X2NvcmQgPSAnNDI1JwotCi0KLWRlZiBTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UpOgotICAiIiJTZXRzIGV2ZXJ5IGV4dGVuc2lvbiBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KLQotICBBcmdzOgotICAgIG1lc3NhZ2U6IEEgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zIGluc3RhbmNlLgotICAiIiIKLQotICBleHRlbnNpb25zID0gbWVzc2FnZS5FeHRlbnNpb25zCi0gIHBiMiA9IHVuaXR0ZXN0X3BiMgotICBpbXBvcnRfcGIyID0gdW5pdHRlc3RfaW1wb3J0X3BiMgotCi0gICMKLSAgIyBPcHRpb25hbCBmaWVsZHMuCi0gICMKLQotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9pbnQzMl9leHRlbnNpb25dID0gMTAxCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ludDY0X2V4dGVuc2lvbl0gPSAxMDIKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfdWludDMyX2V4dGVuc2lvbl0gPSAxMDMKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfdWludDY0X2V4dGVuc2lvbl0gPSAxMDQKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ludDMyX2V4dGVuc2lvbl0gPSAxMDUKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfc2ludDY0X2V4dGVuc2lvbl0gPSAxMDYKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZml4ZWQzMl9leHRlbnNpb25dID0gMTA3Ci0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ZpeGVkNjRfZXh0ZW5zaW9uXSA9IDEwOAotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9zZml4ZWQzMl9leHRlbnNpb25dID0gMTA5Ci0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3NmaXhlZDY0X2V4dGVuc2lvbl0gPSAxMTAKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uXSA9IDExMQotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uXSA9IDExMgotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9ib29sX2V4dGVuc2lvbl0gPSBUcnVlCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25dID0gJzExNScKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uXSA9ICcxMTYnCi0KLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxncm91cF9leHRlbnNpb25dLmEgPSAxMTcKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXS5iYiA9IDExOAotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uXS5jID0gMTE5Ci0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0uZCA9IDEyMAotCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX25lc3RlZF9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuVGVzdEFsbFR5cGVzLkJBWgotICBleHRlbnNpb25zW3BiMi5vcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25dID0gcGIyLlRlc3RBbGxUeXBlcy5CQVoKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuRk9SRUlHTl9CQVoKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXSA9IGltcG9ydF9wYjIuSU1QT1JUX0JBWgotCi0gIGV4dGVuc2lvbnNbcGIyLm9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb25dID0gJzEyNCcKLSAgZXh0ZW5zaW9uc1twYjIub3B0aW9uYWxfY29yZF9leHRlbnNpb25dID0gJzEyNScKLQotICAjCi0gICMgUmVwZWF0ZWQgZmllbGRzLgotICAjCi0KLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjAxKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDIpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDMpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDQpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgyMDUpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMDYpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA3KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDIwOCkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMjA5KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgyMTApCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDIxMSkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDIxMikKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChUcnVlKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uXS5hcHBlbmQoJzIxNScpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbl0uYXBwZW5kKCcyMTYnKQotCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uXS5hZGQoKS5hID0gMjE3Ci0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuYmIgPSAyMTgKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl0uYWRkKCkuYyA9IDIxOQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmQgPSAyMjAKLQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuVGVzdEFsbFR5cGVzLkJBUikKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKHBiMi5GT1JFSUdOX0JBUikKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQoaW1wb3J0X3BiMi5JTVBPUlRfQkFSKQotCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25dLmFwcGVuZCgnMjI0JykKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfY29yZF9leHRlbnNpb25dLmFwcGVuZCgnMjI1JykKLQotICAjIEFwcGVuZCBhIHNlY29uZCBvbmUgb2YgZWFjaCBmaWVsZC4KLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzAxKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDIpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgzMDMpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDQpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQzMl9leHRlbnNpb25dLmFwcGVuZCgzMDUpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX3NpbnQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMDYpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA3KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbl0uYXBwZW5kKDMwOCkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uXS5hcHBlbmQoMzA5KQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb25dLmFwcGVuZCgzMTApCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbl0uYXBwZW5kKDMxMSkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbl0uYXBwZW5kKDMxMikKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfYm9vbF9leHRlbnNpb25dLmFwcGVuZChGYWxzZSkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbl0uYXBwZW5kKCczMTUnKQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9ieXRlc19leHRlbnNpb25dLmFwcGVuZCgnMzE2JykKLQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZGdyb3VwX2V4dGVuc2lvbl0uYWRkKCkuYSA9IDMxNwotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmJiID0gMzE4Ci0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25dLmFkZCgpLmMgPSAzMTkKLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uXS5hZGQoKS5kID0gMzIwCi0KLSAgZXh0ZW5zaW9uc1twYjIucmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uXS5hcHBlbmQocGIyLlRlc3RBbGxUeXBlcy5CQVopCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25dLmFwcGVuZChwYjIuRk9SRUlHTl9CQVopCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl0uYXBwZW5kKGltcG9ydF9wYjIuSU1QT1JUX0JBWikKLQotICBleHRlbnNpb25zW3BiMi5yZXBlYXRlZF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXS5hcHBlbmQoJzMyNCcpCi0gIGV4dGVuc2lvbnNbcGIyLnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uXS5hcHBlbmQoJzMyNScpCi0KLSAgIwotICAjIEZpZWxkcyB3aXRoIGRlZmF1bHRzLgotICAjCi0KLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9pbnQzMl9leHRlbnNpb25dID0gNDAxCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uXSA9IDQwMgotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3VpbnQzMl9leHRlbnNpb25dID0gNDAzCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfdWludDY0X2V4dGVuc2lvbl0gPSA0MDQKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9zaW50MzJfZXh0ZW5zaW9uXSA9IDQwNQotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NpbnQ2NF9leHRlbnNpb25dID0gNDA2Ci0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZml4ZWQzMl9leHRlbnNpb25dID0gNDA3Ci0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZml4ZWQ2NF9leHRlbnNpb25dID0gNDA4Ci0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc2ZpeGVkMzJfZXh0ZW5zaW9uXSA9IDQwOQotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3NmaXhlZDY0X2V4dGVuc2lvbl0gPSA0MTAKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9mbG9hdF9leHRlbnNpb25dID0gNDExCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfZG91YmxlX2V4dGVuc2lvbl0gPSA0MTIKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ib29sX2V4dGVuc2lvbl0gPSBGYWxzZQotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X3N0cmluZ19leHRlbnNpb25dID0gJzQxNScKLSAgZXh0ZW5zaW9uc1twYjIuZGVmYXVsdF9ieXRlc19leHRlbnNpb25dID0gJzQxNicKLQotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X25lc3RlZF9lbnVtX2V4dGVuc2lvbl0gPSBwYjIuVGVzdEFsbFR5cGVzLkZPTwotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2ZvcmVpZ25fZW51bV9leHRlbnNpb25dID0gcGIyLkZPUkVJR05fRk9PCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uXSA9IGltcG9ydF9wYjIuSU1QT1JUX0ZPTwotCi0gIGV4dGVuc2lvbnNbcGIyLmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbl0gPSAnNDI0JwotICBleHRlbnNpb25zW3BiMi5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXSA9ICc0MjUnCi0KLQotZGVmIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMobWVzc2FnZSk6Ci0gICIiIlNldHMgZXZlcnkgZmllbGQgYW5kIGV4dGVuc2lvbiBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KLQotICBBcmdzOgotICAgIG1lc3NhZ2U6IEEgdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UuCi0gICIiIgotICBtZXNzYWdlLm15X2ludCA9IDEKLSAgbWVzc2FnZS5teV9zdHJpbmcgPSAnZm9vJwotICBtZXNzYWdlLm15X2Zsb2F0ID0gMS4wCi0gIG1lc3NhZ2UuRXh0ZW5zaW9uc1t1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX2ludF0gPSAyMwotICBtZXNzYWdlLkV4dGVuc2lvbnNbdW5pdHRlc3RfcGIyLm15X2V4dGVuc2lvbl9zdHJpbmddID0gJ2JhcicKLQotCi1kZWYgRXhwZWN0QWxsRmllbGRzQW5kRXh0ZW5zaW9uc0luT3JkZXIoc2VyaWFsaXplZCk6Ci0gICIiIkVuc3VyZXMgdGhhdCBzZXJpYWxpemVkIGlzIHRoZSBzZXJpYWxpemF0aW9uIHdlIGV4cGVjdCBmb3IgYSBtZXNzYWdlCi0gIGZpbGxlZCB3aXRoIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnMoKS4gIChTcGVjaWZpY2FsbHksIGVuc3VyZXMgdGhhdCB0aGUKLSAgc2VyaWFsaXphdGlvbiBpcyBpbiBjYW5vbmljYWwsIHRhZy1udW1iZXIgb3JkZXIpLgotICAiIiIKLSAgbXlfZXh0ZW5zaW9uX2ludCA9IHVuaXR0ZXN0X3BiMi5teV9leHRlbnNpb25faW50Ci0gIG15X2V4dGVuc2lvbl9zdHJpbmcgPSB1bml0dGVzdF9wYjIubXlfZXh0ZW5zaW9uX3N0cmluZwotICBleHBlY3RlZF9zdHJpbmdzID0gW10KLSAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0RmllbGRPcmRlcmluZ3MoKQotICBtZXNzYWdlLm15X2ludCA9IDEgICMgRmllbGQgMS4KLSAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICBtZXNzYWdlLkNsZWFyKCkKLSAgbWVzc2FnZS5FeHRlbnNpb25zW215X2V4dGVuc2lvbl9pbnRdID0gMjMgICMgRmllbGQgNS4KLSAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICBtZXNzYWdlLkNsZWFyKCkKLSAgbWVzc2FnZS5teV9zdHJpbmcgPSAnZm9vJyAgIyBGaWVsZCAxMS4KLSAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICBtZXNzYWdlLkNsZWFyKCkKLSAgbWVzc2FnZS5FeHRlbnNpb25zW215X2V4dGVuc2lvbl9zdHJpbmddID0gJ2JhcicgICMgRmllbGQgNTAuCi0gIGV4cGVjdGVkX3N0cmluZ3MuYXBwZW5kKG1lc3NhZ2UuU2VyaWFsaXplVG9TdHJpbmcoKSkKLSAgbWVzc2FnZS5DbGVhcigpCi0gIG1lc3NhZ2UubXlfZmxvYXQgPSAxLjAKLSAgZXhwZWN0ZWRfc3RyaW5ncy5hcHBlbmQobWVzc2FnZS5TZXJpYWxpemVUb1N0cmluZygpKQotICBtZXNzYWdlLkNsZWFyKCkKLSAgZXhwZWN0ZWQgPSAnJy5qb2luKGV4cGVjdGVkX3N0cmluZ3MpCi0KLSAgaWYgZXhwZWN0ZWQgIT0gc2VyaWFsaXplZDoKLSAgICByYWlzZSBWYWx1ZUVycm9yKCdFeHBlY3RlZCAlciwgZm91bmQgJXInICUgKGV4cGVjdGVkLCBzZXJpYWxpemVkKSkKLQotCi1kZWYgRXhwZWN0QWxsRmllbGRzU2V0KHRlc3RfY2FzZSwgbWVzc2FnZSk6Ci0gICIiIkNoZWNrIGFsbCBmaWVsZHMgZm9yIGNvcnJlY3QgdmFsdWVzIGhhdmUgYWZ0ZXIgU2V0KkZpZWxkcygpIGlzIGNhbGxlZC4iIiIKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50MzInKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfaW50NjQnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfdWludDMyJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX3VpbnQ2NCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zaW50MzInKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc2ludDY0JykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZpeGVkMzInKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZml4ZWQ2NCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQzMicpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zZml4ZWQ2NCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9mbG9hdCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9kb3VibGUnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYm9vbCcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9zdHJpbmcnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfYnl0ZXMnKSkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX25lc3RlZF9tZXNzYWdlJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZScpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbF9pbXBvcnRfbWVzc2FnZScpKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2Uub3B0aW9uYWxncm91cC5IYXNGaWVsZCgnYScpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlLkhhc0ZpZWxkKCdiYicpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZS5IYXNGaWVsZCgnYycpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlLkhhc0ZpZWxkKCdkJykpCi0KLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfbmVzdGVkX2VudW0nKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfZm9yZWlnbl9lbnVtJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2ltcG9ydF9lbnVtJykpCi0KLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnb3B0aW9uYWxfc3RyaW5nX3BpZWNlJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsX2NvcmQnKSkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAxLCBtZXNzYWdlLm9wdGlvbmFsX2ludDMyKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAyLCBtZXNzYWdlLm9wdGlvbmFsX2ludDY0KQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTAzLCBtZXNzYWdlLm9wdGlvbmFsX3VpbnQzMikKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNCwgbWVzc2FnZS5vcHRpb25hbF91aW50NjQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDUsIG1lc3NhZ2Uub3B0aW9uYWxfc2ludDMyKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA2LCBtZXNzYWdlLm9wdGlvbmFsX3NpbnQ2NCkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDEwNywgbWVzc2FnZS5vcHRpb25hbF9maXhlZDMyKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMTA4LCBtZXNzYWdlLm9wdGlvbmFsX2ZpeGVkNjQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMDksIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkMzIpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTEsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTIsIG1lc3NhZ2Uub3B0aW9uYWxfZG91YmxlKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoVHJ1ZSwgbWVzc2FnZS5vcHRpb25hbF9ib29sKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNScsIG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzExNicsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMpCi0KLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDExNywgbWVzc2FnZS5vcHRpb25hbGdyb3VwLmEpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTgsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UuYmIpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMTksIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlLmMpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgxMjAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UuZCkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcy5CQVosCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9CQVosCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9lbnVtKQotCi0gICMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfdWludDMyKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX3VpbnQ2NCkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zaW50MzIpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfc2ludDY0KSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkMzIpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQzMikpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zZml4ZWQ2NCkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9mbG9hdCkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9kb3VibGUpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMpKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZGdyb3VwKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlKSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIsIGxlbihtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSkpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0pKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW0pKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyLCBsZW4obWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdfcGllY2UpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMiwgbGVuKG1lc3NhZ2UucmVwZWF0ZWRfY29yZCkpCi0KLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMlswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwMiwgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NFswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwMywgbWVzc2FnZS5yZXBlYXRlZF91aW50MzJbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDQsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA1LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQzMlswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwNiwgbWVzc2FnZS5yZXBlYXRlZF9zaW50NjRbMF0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMDcsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMlswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDIwOCwgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDY0WzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjA5LCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDMyWzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjEwLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0WzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjExLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0WzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjEyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKFRydWUsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbFswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCcyMTUnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1swXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCcyMTYnLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzBdKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFswXS5hKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzBdLmJiKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZVswXS5jKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlWzBdLmQpCi0KLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bVswXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBUiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtWzBdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bVswXSkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzAxLCBtZXNzYWdlLnJlcGVhdGVkX2ludDMyWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzAyLCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzAzLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMlsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwNCwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDUsIG1lc3NhZ2UucmVwZWF0ZWRfc2ludDMyWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA2LCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NFsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDMwNywgbWVzc2FnZS5yZXBlYXRlZF9maXhlZDMyWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzA4LCBtZXNzYWdlLnJlcGVhdGVkX2ZpeGVkNjRbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMDksIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzJbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjRbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTEsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXRbMV0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTIsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbFsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCczMTUnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1sxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKCczMTYnLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzWzFdKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgzMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cFsxXS5hKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlWzFdLmJiKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZVsxXS5jKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlWzFdLmQpCi0KLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMuQkFaLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bVsxXSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWiwKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtWzFdKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwodW5pdHRlc3RfaW1wb3J0X3BiMi5JTVBPUlRfQkFaLAotICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bVsxXSkKLQotICAjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9pbnQzMicpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ludDY0JykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDMyJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfdWludDY0JykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ludDMyJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc2ludDY0JykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZml4ZWQzMicpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X2ZpeGVkNjQnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9zZml4ZWQzMicpKQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X3NmaXhlZDY0JykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZmxvYXQnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9kb3VibGUnKSkKLSAgdGVzdF9jYXNlLmFzc2VydFRydWUobWVzc2FnZS5IYXNGaWVsZCgnZGVmYXVsdF9ib29sJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfc3RyaW5nJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfYnl0ZXMnKSkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdkZWZhdWx0X25lc3RlZF9lbnVtJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfZm9yZWlnbl9lbnVtJykpCi0gIHRlc3RfY2FzZS5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ2RlZmF1bHRfaW1wb3J0X2VudW0nKSkKLQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDAxLCBtZXNzYWdlLmRlZmF1bHRfaW50MzIpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDIsIG1lc3NhZ2UuZGVmYXVsdF9pbnQ2NCkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwMywgbWVzc2FnZS5kZWZhdWx0X3VpbnQzMikKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNCwgbWVzc2FnZS5kZWZhdWx0X3VpbnQ2NCkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNSwgbWVzc2FnZS5kZWZhdWx0X3NpbnQzMikKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNiwgbWVzc2FnZS5kZWZhdWx0X3NpbnQ2NCkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQwNywgbWVzc2FnZS5kZWZhdWx0X2ZpeGVkMzIpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MDgsIG1lc3NhZ2UuZGVmYXVsdF9maXhlZDY0KQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDA5LCBtZXNzYWdlLmRlZmF1bHRfc2ZpeGVkMzIpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCg0MTAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKDQxMSwgbWVzc2FnZS5kZWZhdWx0X2Zsb2F0KQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoNDEyLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoRmFsc2UsIG1lc3NhZ2UuZGVmYXVsdF9ib29sKQotICB0ZXN0X2Nhc2UuYXNzZXJ0RXF1YWwoJzQxNScsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcpCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCgnNDE2JywgbWVzc2FnZS5kZWZhdWx0X2J5dGVzKQotCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzLkZPTywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9uZXN0ZWRfZW51bSkKLSAgdGVzdF9jYXNlLmFzc2VydEVxdWFsKHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0ZPTywKLSAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0pCi0gIHRlc3RfY2FzZS5hc3NlcnRFcXVhbCh1bml0dGVzdF9pbXBvcnRfcGIyLklNUE9SVF9GT08sCi0gICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0pCi0KLWRlZiBHb2xkZW5GaWxlKGZpbGVuYW1lKToKLSAgIiIiRmluZHMgdGhlIGdpdmVuIGdvbGRlbiBmaWxlIGFuZCByZXR1cm5zIGEgZmlsZSBvYmplY3QgcmVwcmVzZW50aW5nIGl0LiIiIgotCi0gICMgU2VhcmNoIHVwIHRoZSBkaXJlY3RvcnkgdHJlZSBsb29raW5nIGZvciB0aGUgQysrIHByb3RvYnVmIHNvdXJjZSBjb2RlLgotICBwYXRoID0gJy4nCi0gIHdoaWxlIG9zLnBhdGguZXhpc3RzKHBhdGgpOgotICAgIGlmIG9zLnBhdGguZXhpc3RzKG9zLnBhdGguam9pbihwYXRoLCAnc3JjL2dvb2dsZS9wcm90b2J1ZicpKToKLSAgICAgICMgRm91bmQgaXQuICBMb2FkIHRoZSBnb2xkZW4gZmlsZSBmcm9tIHRoZSB0ZXN0ZGF0YSBkaXJlY3RvcnkuCi0gICAgICBmdWxsX3BhdGggPSBvcy5wYXRoLmpvaW4ocGF0aCwgJ3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEnLCBmaWxlbmFtZSkKLSAgICAgIHJldHVybiBvcGVuKGZ1bGxfcGF0aCwgJ3JiJykKLSAgICBwYXRoID0gb3MucGF0aC5qb2luKHBhdGgsICcuLicpCi0KLSAgcmFpc2UgUnVudGltZUVycm9yKAotICAgICdDb3VsZCBub3QgZmluZCBnb2xkZW4gZmlsZXMuICBUaGlzIHRlc3QgbXVzdCBiZSBydW4gZnJvbSB3aXRoaW4gdGhlICcKLSAgICAncHJvdG9idWYgc291cmNlIHBhY2thZ2Ugc28gdGhhdCBpdCBjYW4gcmVhZCB0ZXN0IGRhdGEgZmlsZXMgZnJvbSB0aGUgJwotICAgICdDKysgc291cmNlIHRyZWUuJykKLQotCi1kZWYgU2V0QWxsUGFja2VkRmllbGRzKG1lc3NhZ2UpOgotICAiIiJTZXRzIGV2ZXJ5IGZpZWxkIGluIHRoZSBtZXNzYWdlIHRvIGEgdW5pcXVlIHZhbHVlLgotCi0gIEFyZ3M6Ci0gICAgbWVzc2FnZTogQSB1bml0dGVzdF9wYjIuVGVzdFBhY2tlZFR5cGVzIGluc3RhbmNlLgotICAiIiIKLSAgbWVzc2FnZS5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCi0gIG1lc3NhZ2UucGFja2VkX2ludDY0LmV4dGVuZChbNjAyLCA3MDJdKQotICBtZXNzYWdlLnBhY2tlZF91aW50MzIuZXh0ZW5kKFs2MDMsIDcwM10pCi0gIG1lc3NhZ2UucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKLSAgbWVzc2FnZS5wYWNrZWRfc2ludDMyLmV4dGVuZChbNjA1LCA3MDVdKQotICBtZXNzYWdlLnBhY2tlZF9zaW50NjQuZXh0ZW5kKFs2MDYsIDcwNl0pCi0gIG1lc3NhZ2UucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCi0gIG1lc3NhZ2UucGFja2VkX2ZpeGVkNjQuZXh0ZW5kKFs2MDgsIDcwOF0pCi0gIG1lc3NhZ2UucGFja2VkX3NmaXhlZDMyLmV4dGVuZChbNjA5LCA3MDldKQotICBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKLSAgbWVzc2FnZS5wYWNrZWRfZmxvYXQuZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQotICBtZXNzYWdlLnBhY2tlZF9kb3VibGUuZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQotICBtZXNzYWdlLnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQotICBtZXNzYWdlLnBhY2tlZF9lbnVtLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKLQotCi1kZWYgU2V0QWxsUGFja2VkRXh0ZW5zaW9ucyhtZXNzYWdlKToKLSAgIiIiU2V0cyBldmVyeSBleHRlbnNpb24gaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCi0KLSAgQXJnczoKLSAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0UGFja2VkRXh0ZW5zaW9ucyBpbnN0YW5jZS4KLSAgIiIiCi0gIGV4dGVuc2lvbnMgPSBtZXNzYWdlLkV4dGVuc2lvbnMKLSAgcGIyID0gdW5pdHRlc3RfcGIyCi0KLSAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2ludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDEsIDcwMV0pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9pbnQ2NF9leHRlbnNpb25dLmV4dGVuZChbNjAyLCA3MDJdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfdWludDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDMsIDcwM10pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYwNCwgNzA0XSkKLSAgZXh0ZW5zaW9uc1twYjIucGFja2VkX3NpbnQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA1LCA3MDVdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDYsIDcwNl0pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDcsIDcwN10pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MDgsIDcwOF0pCi0gIGV4dGVuc2lvbnNbcGIyLnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb25dLmV4dGVuZChbNjA5LCA3MDldKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uXS5leHRlbmQoWzYxMCwgNzEwXSkKLSAgZXh0ZW5zaW9uc1twYjIucGFja2VkX2Zsb2F0X2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTEuMCwgNzExLjBdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbl0uZXh0ZW5kKFs2MTIuMCwgNzEyLjBdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfYm9vbF9leHRlbnNpb25dLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQotICBleHRlbnNpb25zW3BiMi5wYWNrZWRfZW51bV9leHRlbnNpb25dLmV4dGVuZChbdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFSLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3RfcGIyLkZPUkVJR05fQkFaXSkKLQotCi1kZWYgU2V0QWxsVW5wYWNrZWRGaWVsZHMobWVzc2FnZSk6Ci0gICIiIlNldHMgZXZlcnkgZmllbGQgaW4gdGhlIG1lc3NhZ2UgdG8gYSB1bmlxdWUgdmFsdWUuCi0KLSAgQXJnczoKLSAgICBtZXNzYWdlOiBBIHVuaXR0ZXN0X3BiMi5UZXN0VW5wYWNrZWRUeXBlcyBpbnN0YW5jZS4KLSAgIiIiCi0gIG1lc3NhZ2UudW5wYWNrZWRfaW50MzIuZXh0ZW5kKFs2MDEsIDcwMV0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfaW50NjQuZXh0ZW5kKFs2MDIsIDcwMl0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfdWludDMyLmV4dGVuZChbNjAzLCA3MDNdKQotICBtZXNzYWdlLnVucGFja2VkX3VpbnQ2NC5leHRlbmQoWzYwNCwgNzA0XSkKLSAgbWVzc2FnZS51bnBhY2tlZF9zaW50MzIuZXh0ZW5kKFs2MDUsIDcwNV0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfc2ludDY0LmV4dGVuZChbNjA2LCA3MDZdKQotICBtZXNzYWdlLnVucGFja2VkX2ZpeGVkMzIuZXh0ZW5kKFs2MDcsIDcwN10pCi0gIG1lc3NhZ2UudW5wYWNrZWRfZml4ZWQ2NC5leHRlbmQoWzYwOCwgNzA4XSkKLSAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQzMi5leHRlbmQoWzYwOSwgNzA5XSkKLSAgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NC5leHRlbmQoWzYxMCwgNzEwXSkKLSAgbWVzc2FnZS51bnBhY2tlZF9mbG9hdC5leHRlbmQoWzYxMS4wLCA3MTEuMF0pCi0gIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlLmV4dGVuZChbNjEyLjAsIDcxMi4wXSkKLSAgbWVzc2FnZS51bnBhY2tlZF9ib29sLmV4dGVuZChbVHJ1ZSwgRmFsc2VdKQotICBtZXNzYWdlLnVucGFja2VkX2VudW0uZXh0ZW5kKFt1bml0dGVzdF9wYjIuRk9SRUlHTl9CQVIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaXR0ZXN0X3BiMi5GT1JFSUdOX0JBWl0pCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXh0X2Zvcm1hdF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdGV4dF9mb3JtYXRfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzNkOTdkMS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC90ZXh0X2Zvcm1hdF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsNTcxICswLDAgQEAKLSMhIC91c3IvYmluL3B5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi50ZXh0X2Zvcm1hdC4iIiIKLQotX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKLQotaW1wb3J0IGRpZmZsaWIKLWltcG9ydCByZQotCi1pbXBvcnQgdW5pdHRlc3QKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCB0ZXh0X2Zvcm1hdAotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHRlc3RfdXRpbAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X3BiMgotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHVuaXR0ZXN0X21zZXRfcGIyCi0KLQotY2xhc3MgVGV4dEZvcm1hdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotICBkZWYgUmVhZEdvbGRlbihzZWxmLCBnb2xkZW5fZmlsZW5hbWUpOgotICAgIGYgPSB0ZXN0X3V0aWwuR29sZGVuRmlsZShnb2xkZW5fZmlsZW5hbWUpCi0gICAgZ29sZGVuX2xpbmVzID0gZi5yZWFkbGluZXMoKQotICAgIGYuY2xvc2UoKQotICAgIHJldHVybiBnb2xkZW5fbGluZXMKLQotICBkZWYgQ29tcGFyZVRvR29sZGVuRmlsZShzZWxmLCB0ZXh0LCBnb2xkZW5fZmlsZW5hbWUpOgotICAgIGdvbGRlbl9saW5lcyA9IHNlbGYuUmVhZEdvbGRlbihnb2xkZW5fZmlsZW5hbWUpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5MaW5lcyh0ZXh0LCBnb2xkZW5fbGluZXMpCi0KLSAgZGVmIENvbXBhcmVUb0dvbGRlblRleHQoc2VsZiwgdGV4dCwgZ29sZGVuX3RleHQpOgotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuTGluZXModGV4dCwgZ29sZGVuX3RleHQuc3BsaXRsaW5lcygxKSkKLQotICBkZWYgQ29tcGFyZVRvR29sZGVuTGluZXMoc2VsZiwgdGV4dCwgZ29sZGVuX2xpbmVzKToKLSAgICBhY3R1YWxfbGluZXMgPSB0ZXh0LnNwbGl0bGluZXMoMSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKGdvbGRlbl9saW5lcywgYWN0dWFsX2xpbmVzLAotICAgICAgIlRleHQgZG9lc24ndCBtYXRjaCBnb2xkZW4uICBEaWZmOlxuIiArCi0gICAgICAnJy5qb2luKGRpZmZsaWIubmRpZmYoZ29sZGVuX2xpbmVzLCBhY3R1YWxfbGluZXMpKSkKLQotICBkZWYgdGVzdFByaW50QWxsRmllbGRzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5GaWxlKAotICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcyh0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkpLAotICAgICAgJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0JykKLQotICBkZWYgdGVzdFByaW50QWxsRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKQotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuRmlsZSgKLSAgICAgIHNlbGYuUmVtb3ZlUmVkdW5kYW50WmVyb3ModGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UpKSwKLSAgICAgICd0ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0JykKLQotICBkZWYgdGVzdFByaW50TWVzc2FnZVNldChzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQotICAgIGV4dDEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgZXh0MiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0MV0uaSA9IDIzCi0gICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0ciA9ICdmb28nCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSwKLSAgICAgICdtZXNzYWdlX3NldCB7XG4nCi0gICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xXSB7XG4nCi0gICAgICAnICAgIGk6IDIzXG4nCi0gICAgICAnICB9XG4nCi0gICAgICAnICBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7XG4nCi0gICAgICAnICAgIHN0cjogXCJmb29cIlxuJwotICAgICAgJyAgfVxuJwotICAgICAgJ31cbicpCi0KLSAgZGVmIHRlc3RQcmludEV4b3RpYyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQ2NC5hcHBlbmQoLTkyMjMzNzIwMzY4NTQ3NzU4MDgpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF91aW50NjQuYXBwZW5kKDE4NDQ2NzQ0MDczNzA5NTUxNjE1KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxMjMuNDU2KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZTIyKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlLmFwcGVuZCgxLjIzZS0xOCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQoJ1wwMDBcMDAxXGFcYlxmXG5cclx0XHZcXFwnIicpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKHUnXHUwMGZjXHVhNzFmJykKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCi0gICAgICBzZWxmLlJlbW92ZVJlZHVuZGFudFplcm9zKHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKSksCi0gICAgICAncmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4XG4nCi0gICAgICAncmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNVxuJwotICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMTIzLjQ1NlxuJwotICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjJcbicKLSAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjNlLTE4XG4nCi0gICAgICAncmVwZWF0ZWRfc3RyaW5nOiAnCi0gICAgICAgICciXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcXCdcXCIiXG4nCi0gICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXFwzMDNcXDI3NFxcMzUyXFwyMzRcXDIzNyJcbicpCi0KLSAgZGVmIHRlc3RQcmludE5lc3RlZE1lc3NhZ2VBc09uZUxpbmUoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG1zZyA9IG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UuYWRkKCkKLSAgICBtc2cuYmIgPSA0MjsKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCi0gICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSwKLSAgICAgICAgJ3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgYmI6IDQyIH0nKQotCi0gIGRlZiB0ZXN0UHJpbnRSZXBlYXRlZEZpZWxkc0FzT25lTGluZShzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMi5hcHBlbmQoMSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2ludDMyLmFwcGVuZCgxKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzIuYXBwZW5kKDMpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCJHb29nbGUiKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCgiWnVyaWNoIikKLSAgICBzZWxmLkNvbXBhcmVUb0dvbGRlblRleHQoCi0gICAgICAgIHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlKSwKLSAgICAgICAgJ3JlcGVhdGVkX2ludDMyOiAxIHJlcGVhdGVkX2ludDMyOiAxIHJlcGVhdGVkX2ludDMyOiAzICcKLSAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogIkdvb2dsZSIgcmVwZWF0ZWRfc3RyaW5nOiAiWnVyaWNoIicpCi0KLSAgZGVmIHRlc3RQcmludE5lc3RlZE5ld0xpbmVJblN0cmluZ0FzT25lTGluZShzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgPSAiYVxubmV3XG5saW5lIgotICAgIHNlbGYuQ29tcGFyZVRvR29sZGVuVGV4dCgKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKG1lc3NhZ2UsIGFzX29uZV9saW5lPVRydWUpLAotICAgICAgICAnb3B0aW9uYWxfc3RyaW5nOiAiYVxcbm5ld1xcbmxpbmUiJykKLQotICBkZWYgdGVzdFByaW50TWVzc2FnZVNldEFzT25lTGluZShzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQotICAgIGV4dDEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgZXh0MiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBtZXNzYWdlLm1lc3NhZ2Vfc2V0LkV4dGVuc2lvbnNbZXh0MV0uaSA9IDIzCi0gICAgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDJdLnN0ciA9ICdmb28nCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAotICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSksCi0gICAgICAgICdtZXNzYWdlX3NldCB7JwotICAgICAgICAnIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHsnCi0gICAgICAgICcgaTogMjMnCi0gICAgICAgICcgfScKLSAgICAgICAgJyBbcHJvdG9idWZfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yXSB7JwotICAgICAgICAnIHN0cjogXCJmb29cIicKLSAgICAgICAgJyB9JwotICAgICAgICAnIH0nKQotCi0gIGRlZiB0ZXN0UHJpbnRFeG90aWNBc09uZUxpbmUoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKC05MjIzMzcyMDM2ODU0Nzc1ODA4KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0LmFwcGVuZCgxODQ0Njc0NDA3MzcwOTU1MTYxNSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMTIzLjQ1NikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UyMikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UtMTgpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJyInKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1J1x1MDBmY1x1YTcxZicpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KAotICAgICAgc2VsZi5SZW1vdmVSZWR1bmRhbnRaZXJvcygKLSAgICAgICAgICB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSkpLAotICAgICAgJ3JlcGVhdGVkX2ludDY0OiAtOTIyMzM3MjAzNjg1NDc3NTgwOCcKLSAgICAgICcgcmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNScKLSAgICAgICcgcmVwZWF0ZWRfZG91YmxlOiAxMjMuNDU2JwotICAgICAgJyByZXBlYXRlZF9kb3VibGU6IDEuMjNlKzIyJwotICAgICAgJyByZXBlYXRlZF9kb3VibGU6IDEuMjNlLTE4JwotICAgICAgJyByZXBlYXRlZF9zdHJpbmc6ICcKLSAgICAgICciXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcXCdcXCIiJwotICAgICAgJyByZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFwzNTJcXDIzNFxcMjM3IicpCi0KLSAgZGVmIHRlc3RSb3VuZFRyaXBFeG90aWNBc09uZUxpbmUoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQuYXBwZW5kKC05MjIzMzcyMDM2ODU0Nzc1ODA4KQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0LmFwcGVuZCgxODQ0Njc0NDA3MzcwOTU1MTYxNSkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMTIzLjQ1NikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UyMikKLSAgICBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZS5hcHBlbmQoMS4yM2UtMTgpCi0gICAgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmcuYXBwZW5kKCdcMDAwXDAwMVxhXGJcZlxuXHJcdFx2XFxcJyInKQotICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nLmFwcGVuZCh1J1x1MDBmY1x1YTcxZicpCi0KLSAgICAjIFRlc3QgYXNfdXRmOCA9IEZhbHNlLgotICAgIHdpcmVfdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZygKLSAgICAgICAgbWVzc2FnZSwgYXNfb25lX2xpbmU9VHJ1ZSwgYXNfdXRmOD1GYWxzZSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRleHRfZm9ybWF0Lk1lcmdlKHdpcmVfdGV4dCwgcGFyc2VkX21lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMobWVzc2FnZSwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgICAjIFRlc3QgYXNfdXRmOCA9IFRydWUuCi0gICAgd2lyZV90ZXh0ID0gdGV4dF9mb3JtYXQuTWVzc2FnZVRvU3RyaW5nKAotICAgICAgICBtZXNzYWdlLCBhc19vbmVfbGluZT1UcnVlLCBhc191dGY4PVRydWUpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh3aXJlX3RleHQsIHBhcnNlZF9tZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0UHJpbnRSYXdVdGY4U3RyaW5nKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZy5hcHBlbmQodSdcdTAwZmNcdWE3MWYnKQotICAgIHRleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfdXRmOCA9IFRydWUpCi0gICAgc2VsZi5Db21wYXJlVG9Hb2xkZW5UZXh0KHRleHQsICdyZXBlYXRlZF9zdHJpbmc6ICJcMzAzXDI3NFwzNTJcMjM0XDIzNyJcbicpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBwYXJzZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLQotICBkZWYgdGVzdE1lc3NhZ2VUb1N0cmluZyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLkZvcmVpZ25NZXNzYWdlKCkKLSAgICBtZXNzYWdlLmMgPSAxMjMKLSAgICBzZWxmLmFzc2VydEVxdWFsKCdjOiAxMjNcbicsIHN0cihtZXNzYWdlKSkKLQotICBkZWYgUmVtb3ZlUmVkdW5kYW50WmVyb3Moc2VsZiwgdGV4dCk6Ci0gICAgIyBTb21lIHBsYXRmb3JtcyBwcmludCAxZSs1IGFzIDFlKzAwNS4gIFRoaXMgaXMgZmluZSwgYnV0IHdlIG5lZWQgdG8gcmVtb3ZlCi0gICAgIyB0aGVzZSB6ZXJvcyBpbiBvcmRlciB0byBtYXRjaCB0aGUgZ29sZGVuIGZpbGUuCi0gICAgdGV4dCA9IHRleHQucmVwbGFjZSgnZSswJywnZSsnKS5yZXBsYWNlKCdlKzAnLCdlKycpIFwKLSAgICAgICAgICAgICAgIC5yZXBsYWNlKCdlLTAnLCdlLScpLnJlcGxhY2UoJ2UtMCcsJ2UtJykKLSAgICAjIEZsb2F0aW5nIHBvaW50IGZpZWxkcyBhcmUgcHJpbnRlZCB3aXRoIC4wIHN1ZmZpeCBldmVuIGlmIHRoZXkgYXJlCi0gICAgIyBhY3R1YWx5IGludGVnZXIgbnVtYmVycy4KLSAgICB0ZXh0ID0gcmUuY29tcGlsZSgnXC4wJCcsIHJlLk1VTFRJTElORSkuc3ViKCcnLCB0ZXh0KQotICAgIHJldHVybiB0ZXh0Ci0KLSAgZGVmIHRlc3RNZXJnZUdvbGRlbihzZWxmKToKLSAgICBnb2xkZW5fdGV4dCA9ICdcbicuam9pbihzZWxmLlJlYWRHb2xkZW4oJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0JykpCi0gICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0X2Zvcm1hdC5NZXJnZShnb2xkZW5fdGV4dCwgcGFyc2VkX21lc3NhZ2UpCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGVzdF91dGlsLlNldEFsbEZpZWxkcyhtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0RXF1YWxzKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0TWVyZ2VHb2xkZW5FeHRlbnNpb25zKHNlbGYpOgotICAgIGdvbGRlbl90ZXh0ID0gJ1xuJy5qb2luKHNlbGYuUmVhZEdvbGRlbigKLSAgICAgICAgJ3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQnKSkKLSAgICBwYXJzZWRfbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgdGV4dF9mb3JtYXQuTWVyZ2UoZ29sZGVuX3RleHQsIHBhcnNlZF9tZXNzYWdlKQotCi0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgdGVzdF91dGlsLlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhtZXNzYWdlLCBwYXJzZWRfbWVzc2FnZSkKLQotICBkZWYgdGVzdE1lcmdlQWxsRmllbGRzKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRmllbGRzKG1lc3NhZ2UpCi0gICAgYXNjaWlfdGV4dCA9IHRleHRfZm9ybWF0Lk1lc3NhZ2VUb1N0cmluZyhtZXNzYWdlKQotCi0gICAgcGFyc2VkX21lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0X2Zvcm1hdC5NZXJnZShhc2NpaV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotICAgIHRlc3RfdXRpbC5FeHBlY3RBbGxGaWVsZHNTZXQoc2VsZiwgbWVzc2FnZSkKLQotICBkZWYgdGVzdE1lcmdlQWxsRXh0ZW5zaW9ucyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXN0X3V0aWwuU2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlKQotICAgIGFzY2lpX3RleHQgPSB0ZXh0X2Zvcm1hdC5NZXNzYWdlVG9TdHJpbmcobWVzc2FnZSkKLQotICAgIHBhcnNlZF9tZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxFeHRlbnNpb25zKCkKLSAgICB0ZXh0X2Zvcm1hdC5NZXJnZShhc2NpaV90ZXh0LCBwYXJzZWRfbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKG1lc3NhZ2UsIHBhcnNlZF9tZXNzYWdlKQotCi0gIGRlZiB0ZXN0TWVyZ2VNZXNzYWdlU2V0KHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gKCdyZXBlYXRlZF91aW50NjQ6IDFcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF91aW50NjQ6IDJcbicpCi0gICAgdGV4dF9mb3JtYXQuTWVyZ2UodGV4dCwgbWVzc2FnZSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiwgbWVzc2FnZS5yZXBlYXRlZF91aW50NjRbMV0pCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfbXNldF9wYjIuVGVzdE1lc3NhZ2VTZXRDb250YWluZXIoKQotICAgIHRleHQgPSAoJ21lc3NhZ2Vfc2V0IHtcbicKLSAgICAgICAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjFdIHtcbicKLSAgICAgICAgICAgICcgICAgaTogMjNcbicKLSAgICAgICAgICAgICcgIH1cbicKLSAgICAgICAgICAgICcgIFtwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjJdIHtcbicKLSAgICAgICAgICAgICcgICAgc3RyOiBcImZvb1wiXG4nCi0gICAgICAgICAgICAnICB9XG4nCi0gICAgICAgICAgICAnfVxuJykKLSAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQotICAgIGV4dDEgPSB1bml0dGVzdF9tc2V0X3BiMi5UZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEubWVzc2FnZV9zZXRfZXh0ZW5zaW9uCi0gICAgZXh0MiA9IHVuaXR0ZXN0X21zZXRfcGIyLlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMi5tZXNzYWdlX3NldF9leHRlbnNpb24KLSAgICBzZWxmLmFzc2VydEVxdWFscygyMywgbWVzc2FnZS5tZXNzYWdlX3NldC5FeHRlbnNpb25zW2V4dDFdLmkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoJ2ZvbycsIG1lc3NhZ2UubWVzc2FnZV9zZXQuRXh0ZW5zaW9uc1tleHQyXS5zdHIpCi0KLSAgZGVmIHRlc3RNZXJnZUV4b3RpYyhzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICgncmVwZWF0ZWRfaW50NjQ6IC05MjIzMzcyMDM2ODU0Nzc1ODA4XG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfdWludDY0OiAxODQ0Njc0NDA3MzcwOTU1MTYxNVxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMTIzLjQ1NlxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX2RvdWJsZTogMS4yM2UrMjJcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF9kb3VibGU6IDEuMjNlLTE4XG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiBcbicKLSAgICAgICAgICAgICciXFwwMDBcXDAwMVxcMDA3XFwwMTBcXDAxNFxcblxcclxcdFxcMDEzXFxcXFxcXCdcXCIiXG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiZm9vIiBcJ2NvcmdlXCcgImdyYXVsdCJcbicKLSAgICAgICAgICAgICdyZXBlYXRlZF9zdHJpbmc6ICJcXDMwM1xcMjc0XFwzNTJcXDIzNFxcMjM3IlxuJwotICAgICAgICAgICAgJ3JlcGVhdGVkX3N0cmluZzogIlxceGMzXFx4YmMiXG4nCi0gICAgICAgICAgICAncmVwZWF0ZWRfc3RyaW5nOiAiXHhjM1x4YmMiXG4nKQotICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCi0KLSAgICBzZWxmLmFzc2VydEVxdWFsKC05MjIzMzcyMDM2ODU0Nzc1ODA4LCBtZXNzYWdlLnJlcGVhdGVkX2ludDY0WzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTg0NDY3NDQwNzM3MDk1NTE2MTUsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0WzBdKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTIzLjQ1NiwgbWVzc2FnZS5yZXBlYXRlZF9kb3VibGVbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLjIzZTIyLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVsxXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDEuMjNlLTE4LCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZVsyXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKAotICAgICAgICAnXDAwMFwwMDFcYVxiXGZcblxyXHRcdlxcXCciJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMF0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgnZm9vY29yZ2VncmF1bHQnLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZ1sxXSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKHUnXHUwMGZjXHVhNzFmJywgbWVzc2FnZS5yZXBlYXRlZF9zdHJpbmdbMl0pCi0gICAgc2VsZi5hc3NlcnRFcXVhbCh1J1x1MDBmYycsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nWzNdKQotCi0gIGRlZiB0ZXN0TWVyZ2VFbXB0eVRleHQoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRleHQgPSAnJwotICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRFcXVhbHModW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpLCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0TWVyZ2VJbnZhbGlkVXRmOChzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICdyZXBlYXRlZF9zdHJpbmc6ICJcXHhjM1xceGMzIicKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdE1lcmdlU2luZ2xlV29yZChzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICdmb28nCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNXaXRoTWVzc2FnZSgKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgKCcxOjEgOiBNZXNzYWdlIHR5cGUgInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIgaGFzIG5vIGZpZWxkIG5hbWVkICcKLSAgICAgICAgICciZm9vIi4nKSwKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVyZ2UsIHRleHQsIG1lc3NhZ2UpCi0KLSAgZGVmIHRlc3RNZXJnZVVua25vd25GaWVsZChzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICd1bmtub3duX2ZpZWxkOiA4XG4nCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNXaXRoTWVzc2FnZSgKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgKCcxOjEgOiBNZXNzYWdlIHR5cGUgInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIgaGFzIG5vIGZpZWxkIG5hbWVkICcKLSAgICAgICAgICcidW5rbm93bl9maWVsZCIuJyksCi0gICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQotCi0gIGRlZiB0ZXN0TWVyZ2VCYWRFeHRlbnNpb24oc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsRXh0ZW5zaW9ucygpCi0gICAgdGV4dCA9ICdbdW5rbm93bl9leHRlbnNpb25dOiA4XG4nCi0gICAgc2VsZi5hc3NlcnRSYWlzZXNXaXRoTWVzc2FnZSgKLSAgICAgICAgdGV4dF9mb3JtYXQuUGFyc2VFcnJvciwKLSAgICAgICAgJzE6MiA6IEV4dGVuc2lvbiAidW5rbm93bl9leHRlbnNpb24iIG5vdCByZWdpc3RlcmVkLicsCi0gICAgICAgIHRleHRfZm9ybWF0Lk1lcmdlLCB0ZXh0LCBtZXNzYWdlKQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLAotICAgICAgICAoJzE6MiA6IE1lc3NhZ2UgdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIiBkb2VzIG5vdCBoYXZlICcKLSAgICAgICAgICdleHRlbnNpb25zLicpLAotICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdE1lcmdlR3JvdXBOb3RDbG9zZWQoc2VsZik6Ci0gICAgbWVzc2FnZSA9IHVuaXR0ZXN0X3BiMi5UZXN0QWxsVHlwZXMoKQotICAgIHRleHQgPSAnUmVwZWF0ZWRHcm91cDogPCcKLSAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCAnMToxNiA6IEV4cGVjdGVkICI+Ii4nLAotICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKLQotICAgIHRleHQgPSAnUmVwZWF0ZWRHcm91cDogeycKLSAgICBzZWxmLmFzc2VydFJhaXNlc1dpdGhNZXNzYWdlKAotICAgICAgICB0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCAnMToxNiA6IEV4cGVjdGVkICJ9Ii4nLAotICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgdGVzdE1lcmdlRW1wdHlHcm91cChzZWxmKToKLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICdPcHRpb25hbEdyb3VwOiB7fScKLSAgICB0ZXh0X2Zvcm1hdC5NZXJnZSh0ZXh0LCBtZXNzYWdlKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZShtZXNzYWdlLkhhc0ZpZWxkKCdvcHRpb25hbGdyb3VwJykpCi0KLSAgICBtZXNzYWdlLkNsZWFyKCkKLQotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJ09wdGlvbmFsR3JvdXA6IDw+JwotICAgIHRleHRfZm9ybWF0Lk1lcmdlKHRleHQsIG1lc3NhZ2UpCi0gICAgc2VsZi5hc3NlcnRUcnVlKG1lc3NhZ2UuSGFzRmllbGQoJ29wdGlvbmFsZ3JvdXAnKSkKLQotICBkZWYgdGVzdE1lcmdlQmFkRW51bVZhbHVlKHNlbGYpOgotICAgIG1lc3NhZ2UgPSB1bml0dGVzdF9wYjIuVGVzdEFsbFR5cGVzKCkKLSAgICB0ZXh0ID0gJ29wdGlvbmFsX25lc3RlZF9lbnVtOiBCQVJSJwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICgnMToyMyA6IEVudW0gdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0iICcKLSAgICAgICAgICdoYXMgbm8gdmFsdWUgbmFtZWQgQkFSUi4nKSwKLSAgICAgICAgdGV4dF9mb3JtYXQuTWVyZ2UsIHRleHQsIG1lc3NhZ2UpCi0KLSAgICBtZXNzYWdlID0gdW5pdHRlc3RfcGIyLlRlc3RBbGxUeXBlcygpCi0gICAgdGV4dCA9ICdvcHRpb25hbF9uZXN0ZWRfZW51bTogMTAwJwotICAgIHNlbGYuYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2UoCi0gICAgICAgIHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsCi0gICAgICAgICgnMToyMyA6IEVudW0gdHlwZSAicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLk5lc3RlZEVudW0iICcKLSAgICAgICAgICdoYXMgbm8gdmFsdWUgd2l0aCBudW1iZXIgMTAwLicpLAotICAgICAgICB0ZXh0X2Zvcm1hdC5NZXJnZSwgdGV4dCwgbWVzc2FnZSkKLQotICBkZWYgYXNzZXJ0UmFpc2VzV2l0aE1lc3NhZ2Uoc2VsZiwgZV9jbGFzcywgZSwgZnVuYywgKmFyZ3MsICoqa3dhcmdzKToKLSAgICAiIiJTYW1lIGFzIGFzc2VydFJhaXNlcywgYnV0IGFsc28gY29tcGFyZXMgdGhlIGV4Y2VwdGlvbiBtZXNzYWdlLiIiIgotICAgIGlmIGhhc2F0dHIoZV9jbGFzcywgJ19fbmFtZV9fJyk6Ci0gICAgICBleGNfbmFtZSA9IGVfY2xhc3MuX19uYW1lX18KLSAgICBlbHNlOgotICAgICAgZXhjX25hbWUgPSBzdHIoZV9jbGFzcykKLQotICAgIHRyeToKLSAgICAgIGZ1bmMoKmFyZ3MsICoqa3dhcmdzKQotICAgIGV4Y2VwdCBlX2NsYXNzLCBleHByOgotICAgICAgaWYgc3RyKGV4cHIpICE9IGU6Ci0gICAgICAgIG1zZyA9ICclcyByYWlzZWQsIGJ1dCB3aXRoIHdyb25nIG1lc3NhZ2U6ICIlcyIgaW5zdGVhZCBvZiAiJXMiJwotICAgICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24obXNnICUgKGV4Y19uYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cihleHByKS5lbmNvZGUoJ3N0cmluZ19lc2NhcGUnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlLmVuY29kZSgnc3RyaW5nX2VzY2FwZScpKSkKLSAgICAgIHJldHVybgotICAgIGVsc2U6Ci0gICAgICByYWlzZSBzZWxmLmZhaWx1cmVFeGNlcHRpb24oJyVzIG5vdCByYWlzZWQnICUgZXhjX25hbWUpCi0KLQotY2xhc3MgVG9rZW5pemVyVGVzdCh1bml0dGVzdC5UZXN0Q2FzZSk6Ci0KLSAgZGVmIHRlc3RTaW1wbGVUb2tlbkNhc2VzKHNlbGYpOgotICAgIHRleHQgPSAoJ2lkZW50aWZpZXIxOiJzdHJpbmcxIlxuICAgICBcblxuJwotICAgICAgICAgICAgJ2lkZW50aWZpZXIyIDogXG4gXG4xMjMgIFxuICBpZGVudGlmaWVyMyA6XCdzdHJpbmdcJ1xuJwotICAgICAgICAgICAgJ2lkZW50aWZpRVJfNCA6IDEuMWUrMiBJRDU6LTAuMjMgSUQ2OlwnYWFhYVxcXCdiYmJiXCdcbicKLSAgICAgICAgICAgICdJRDcgOiAiYWFcXCJiYiJcblxuXG5cbiBJRDg6IHtBOmluZiBCOi1pbmYgQzp0cnVlIEQ6ZmFsc2V9XG4nCi0gICAgICAgICAgICAnSUQ5OiAyMiBJRDEwOiAtMTExMTExMTExMTExMTExMTExIElEMTE6IC0yMlxuJwotICAgICAgICAgICAgJ0lEMTI6IDIyMjIyMjIyMjIyMjIyMjIyMjIgJwotICAgICAgICAgICAgJ2ZhbHNlX2Jvb2w6ICAwIHRydWVfQk9PTDp0IFxuIHRydWVfYm9vbDE6ICAxIGZhbHNlX0JPT0wxOmYgJyApCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQotICAgIG1ldGhvZHMgPSBbKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpZXIxJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVTdHJpbmcsICdzdHJpbmcxJyksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnaWRlbnRpZmllcjInKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUludDMyLCAxMjMpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ2lkZW50aWZpZXIzJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVTdHJpbmcsICdzdHJpbmcnKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdpZGVudGlmaUVSXzQnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCAxLjFlKzIpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lENScpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lRmxvYXQsIC0wLjIzKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDYnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ2FhYWFcJ2JiYmInKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDcnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZVN0cmluZywgJ2FhXCJiYicpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0lEOCcpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgJ3snLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0EnKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCB0ZXh0X2Zvcm1hdC5fSU5GSU5JVFkpLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllciwgJ0InKSwKLSAgICAgICAgICAgICAgICc6JywKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUZsb2F0LCAtdGV4dF9mb3JtYXQuX0lORklOSVRZKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdDJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBUcnVlKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdEJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBGYWxzZSksCi0gICAgICAgICAgICAgICAnfScsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQ5JyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVVaW50MzIsIDIyKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdJRDEwJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJbnQ2NCwgLTExMTExMTExMTExMTExMTExMSksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQxMScpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lSW50MzIsIC0yMiksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAnSUQxMicpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lVWludDY0LCAyMjIyMjIyMjIyMjIyMjIyMjIyKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdmYWxzZV9ib29sJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBGYWxzZSksCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyLCAndHJ1ZV9CT09MJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBUcnVlKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICd0cnVlX2Jvb2wxJyksCi0gICAgICAgICAgICAgICAnOicsCi0gICAgICAgICAgICAgICAodG9rZW5pemVyLkNvbnN1bWVCb29sLCBUcnVlKSwKLSAgICAgICAgICAgICAgICh0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIsICdmYWxzZV9CT09MMScpLAotICAgICAgICAgICAgICAgJzonLAotICAgICAgICAgICAgICAgKHRva2VuaXplci5Db25zdW1lQm9vbCwgRmFsc2UpXQotCi0gICAgaSA9IDAKLSAgICB3aGlsZSBub3QgdG9rZW5pemVyLkF0RW5kKCk6Ci0gICAgICBtID0gbWV0aG9kc1tpXQotICAgICAgaWYgdHlwZShtKSA9PSBzdHI6Ci0gICAgICAgIHRva2VuID0gdG9rZW5pemVyLnRva2VuCi0gICAgICAgIHNlbGYuYXNzZXJ0RXF1YWwodG9rZW4sIG0pCi0gICAgICAgIHRva2VuaXplci5OZXh0VG9rZW4oKQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChtWzFdLCBtWzBdKCkpCi0gICAgICBpICs9IDEKLQotICBkZWYgdGVzdENvbnN1bWVJbnRlZ2VycyhzZWxmKToKLSAgICAjIFRoaXMgdGVzdCBvbmx5IHRlc3RzIHRoZSBmYWlsdXJlcyBpbiB0aGUgaW50ZWdlciBwYXJzaW5nIG1ldGhvZHMgYXMgd2VsbAotICAgICMgYXMgdGhlICcwJyBzcGVjaWFsIGNhc2VzLgotICAgIGludDY0X21heCA9ICgxIDw8IDYzKSAtIDEKLSAgICB1aW50MzJfbWF4ID0gKDEgPDwgMzIpIC0gMQotICAgIHRleHQgPSAnLTEgJWQgJWQnICUgKHVpbnQzMl9tYXggKyAxLCBpbnQ2NF9tYXggKyAxKQotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMikKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0xLCB0b2tlbml6ZXIuQ29uc3VtZUludDMyKCkpCi0KLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQzMikKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUludDMyKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwodWludDMyX21heCArIDEsIHRva2VuaXplci5Db25zdW1lSW50NjQoKSkKLQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lSW50NjQpCi0gICAgc2VsZi5hc3NlcnRFcXVhbChpbnQ2NF9tYXggKyAxLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCgpKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0b2tlbml6ZXIuQXRFbmQoKSkKLQotICAgIHRleHQgPSAnLTAgLTAgMCAwJwotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRva2VuaXplci5Db25zdW1lVWludDMyKCkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCgpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMCwgdG9rZW5pemVyLkNvbnN1bWVVaW50MzIoKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDAsIHRva2VuaXplci5Db25zdW1lVWludDY0KCkpCi0gICAgc2VsZi5hc3NlcnRUcnVlKHRva2VuaXplci5BdEVuZCgpKQotCi0gIGRlZiB0ZXN0Q29uc3VtZUJ5dGVTdHJpbmcoc2VsZik6Ci0gICAgdGV4dCA9ICcic3RyaW5nMVwnJwotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCi0KLSAgICB0ZXh0ID0gJ3N0cmluZzEiJwotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCi0KLSAgICB0ZXh0ID0gJ1xuIlxceHQiJwotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCi0KLSAgICB0ZXh0ID0gJ1xuIlxcIicKLSAgICB0b2tlbml6ZXIgPSB0ZXh0X2Zvcm1hdC5fVG9rZW5pemVyKHRleHQpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXModGV4dF9mb3JtYXQuUGFyc2VFcnJvciwgdG9rZW5pemVyLkNvbnN1bWVCeXRlU3RyaW5nKQotCi0gICAgdGV4dCA9ICdcbiJcXHgiJwotICAgIHRva2VuaXplciA9IHRleHRfZm9ybWF0Ll9Ub2tlbml6ZXIodGV4dCkKLSAgICBzZWxmLmFzc2VydFJhaXNlcyh0ZXh0X2Zvcm1hdC5QYXJzZUVycm9yLCB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcpCi0KLSAgZGVmIHRlc3RDb25zdW1lQm9vbChzZWxmKToKLSAgICB0ZXh0ID0gJ25vdC1hLWJvb2wnCi0gICAgdG9rZW5pemVyID0gdGV4dF9mb3JtYXQuX1Rva2VuaXplcih0ZXh0KQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKHRleHRfZm9ybWF0LlBhcnNlRXJyb3IsIHRva2VuaXplci5Db25zdW1lQm9vbCkKLQotICBkZWYgdGVzdEluZk5hbihzZWxmKToKLSAgICAjIE1ha2Ugc3VyZSBvdXIgaW5maW5pdHkgYW5kIE5hTiBkZWZpbml0aW9ucyBhcmUgc291bmQuCi0gICAgc2VsZi5hc3NlcnRFcXVhbHMoZmxvYXQsIHR5cGUodGV4dF9mb3JtYXQuX0lORklOSVRZKSkKLSAgICBzZWxmLmFzc2VydEVxdWFscyhmbG9hdCwgdHlwZSh0ZXh0X2Zvcm1hdC5fTkFOKSkKLSAgICBzZWxmLmFzc2VydFRydWUodGV4dF9mb3JtYXQuX05BTiAhPSB0ZXh0X2Zvcm1hdC5fTkFOKQotCi0gICAgaW5mX3RpbWVzX3plcm8gPSB0ZXh0X2Zvcm1hdC5fSU5GSU5JVFkgKiAwCi0gICAgc2VsZi5hc3NlcnRUcnVlKGluZl90aW1lc196ZXJvICE9IGluZl90aW1lc196ZXJvKQotICAgIHNlbGYuYXNzZXJ0VHJ1ZSh0ZXh0X2Zvcm1hdC5fSU5GSU5JVFkgPiAwKQotCi0KLWlmIF9fbmFtZV9fID09ICdfX21haW5fXyc6Ci0gIHVuaXR0ZXN0Lm1haW4oKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3R5cGVfY2hlY2tlcnMucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDJiM2NkNGQuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvdHlwZV9jaGVja2Vycy5weQorKysgL2Rldi9udWxsCkBAIC0xLDI4NiArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiUHJvdmlkZXMgdHlwZSBjaGVja2luZyByb3V0aW5lcy4KLQotVGhpcyBtb2R1bGUgZGVmaW5lcyB0eXBlIGNoZWNraW5nIHV0aWxpdGllcyBpbiB0aGUgZm9ybXMgb2YgZGljdGlvbmFyaWVzOgotCi1WQUxVRV9DSEVDS0VSUzogQSBkaWN0aW9uYXJ5IG9mIGZpZWxkIHR5cGVzIGFuZCBhIHZhbHVlIHZhbGlkYXRpb24gb2JqZWN0LgotVFlQRV9UT19CWVRFX1NJWkVfRk46IEEgZGljdGlvbmFyeSB3aXRoIGZpZWxkIHR5cGVzIGFuZCBhIHNpemUgY29tcHV0aW5nCi0gIGZ1bmN0aW9uLgotVFlQRV9UT19TRVJJQUxJWkVfTUVUSE9EOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlcyBhbmQgc2VyaWFsaXphdGlvbgotICBmdW5jdGlvbi4KLUZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFOiBBIGRpY3Rpb25hcnkgd2l0aCBmaWVsZCB0eXBlZCBhbmQgdGhlaXIKLSAgY29yZXNwb25kaW5nIHdpcmUgdHlwZXMuCi1UWVBFX1RPX0RFU0VSSUFMSVpFX01FVEhPRDogQSBkaWN0aW9uYXJ5IHdpdGggZmllbGQgdHlwZXMgYW5kIGRlc2VyaWFsaXphdGlvbgotICBmdW5jdGlvbi4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJwotCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgZGVjb2RlcgotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IGVuY29kZXIKLWZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCB3aXJlX2Zvcm1hdAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLQotX0ZpZWxkRGVzY3JpcHRvciA9IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yCi0KLQotZGVmIEdldFR5cGVDaGVja2VyKGNwcF90eXBlLCBmaWVsZF90eXBlKToKLSAgIiIiUmV0dXJucyBhIHR5cGUgY2hlY2tlciBmb3IgYSBtZXNzYWdlIGZpZWxkIG9mIHRoZSBzcGVjaWZpZWQgdHlwZXMuCi0KLSAgQXJnczoKLSAgICBjcHBfdHlwZTogQysrIHR5cGUgb2YgdGhlIGZpZWxkIChzZWUgZGVzY3JpcHRvci5weSkuCi0gICAgZmllbGRfdHlwZTogUHJvdG9jb2wgbWVzc2FnZSBmaWVsZCB0eXBlIChzZWUgZGVzY3JpcHRvci5weSkuCi0KLSAgUmV0dXJuczoKLSAgICBBbiBpbnN0YW5jZSBvZiBUeXBlQ2hlY2tlciB3aGljaCBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhlIHR5cGVzCi0gICAgb2YgdmFsdWVzIGFzc2lnbmVkIHRvIGEgZmllbGQgb2YgdGhlIHNwZWNpZmllZCB0eXBlLgotICAiIiIKLSAgaWYgKGNwcF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9TVFJJTkcgYW5kCi0gICAgICBmaWVsZF90eXBlID09IF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkcpOgotICAgIHJldHVybiBVbmljb2RlVmFsdWVDaGVja2VyKCkKLSAgcmV0dXJuIF9WQUxVRV9DSEVDS0VSU1tjcHBfdHlwZV0KLQotCi0jIE5vbmUgb2YgdGhlIHR5cGVjaGVja2VycyBiZWxvdyBtYWtlIGFueSBhdHRlbXB0IHRvIGd1YXJkIGFnYWluc3QgcGVvcGxlCi0jIHN1YmNsYXNzaW5nIGJ1aWx0aW4gdHlwZXMgYW5kIGRvaW5nIHdlaXJkIHRoaW5ncy4gIFdlJ3JlIG5vdCB0cnlpbmcgdG8KLSMgcHJvdGVjdCBhZ2FpbnN0IG1hbGljaW91cyBjbGllbnRzIGhlcmUsIGp1c3QgcGVvcGxlIGFjY2lkZW50YWxseSBzaG9vdGluZwotIyB0aGVtc2VsdmVzIGluIHRoZSBmb290IGluIG9idmlvdXMgd2F5cy4KLQotY2xhc3MgVHlwZUNoZWNrZXIob2JqZWN0KToKLQotICAiIiJUeXBlIGNoZWNrZXIgdXNlZCB0byBjYXRjaCB0eXBlIGVycm9ycyBhcyBlYXJseSBhcyBwb3NzaWJsZQotICB3aGVuIHRoZSBjbGllbnQgaXMgc2V0dGluZyBzY2FsYXIgZmllbGRzIGluIHByb3RvY29sIG1lc3NhZ2VzLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgKmFjY2VwdGFibGVfdHlwZXMpOgotICAgIHNlbGYuX2FjY2VwdGFibGVfdHlwZXMgPSBhY2NlcHRhYmxlX3R5cGVzCi0KLSAgZGVmIENoZWNrVmFsdWUoc2VsZiwgcHJvcG9zZWRfdmFsdWUpOgotICAgIGlmIG5vdCBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCBzZWxmLl9hY2NlcHRhYmxlX3R5cGVzKToKLSAgICAgIG1lc3NhZ2UgPSAoJyUuMTAyNHIgaGFzIHR5cGUgJXMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzJyAlCi0gICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSwgdHlwZShwcm9wb3NlZF92YWx1ZSksIHNlbGYuX2FjY2VwdGFibGVfdHlwZXMpKQotICAgICAgcmFpc2UgVHlwZUVycm9yKG1lc3NhZ2UpCi0KLQotIyBJbnRWYWx1ZUNoZWNrZXIgYW5kIGl0cyBzdWJjbGFzc2VzIHBlcmZvcm0gaW50ZWdlciB0eXBlLWNoZWNrcwotIyBhbmQgYm91bmRzLWNoZWNrcy4KLWNsYXNzIEludFZhbHVlQ2hlY2tlcihvYmplY3QpOgotCi0gICIiIkNoZWNrZXIgdXNlZCBmb3IgaW50ZWdlciBmaWVsZHMuICBQZXJmb3JtcyB0eXBlLWNoZWNrIGFuZCByYW5nZSBjaGVjay4iIiIKLQotICBkZWYgQ2hlY2tWYWx1ZShzZWxmLCBwcm9wb3NlZF92YWx1ZSk6Ci0gICAgaWYgbm90IGlzaW5zdGFuY2UocHJvcG9zZWRfdmFsdWUsIChpbnQsIGxvbmcpKToKLSAgICAgIG1lc3NhZ2UgPSAoJyUuMTAyNHIgaGFzIHR5cGUgJXMsIGJ1dCBleHBlY3RlZCBvbmUgb2Y6ICVzJyAlCi0gICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSwgdHlwZShwcm9wb3NlZF92YWx1ZSksIChpbnQsIGxvbmcpKSkKLSAgICAgIHJhaXNlIFR5cGVFcnJvcihtZXNzYWdlKQotICAgIGlmIG5vdCBzZWxmLl9NSU4gPD0gcHJvcG9zZWRfdmFsdWUgPD0gc2VsZi5fTUFYOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcignVmFsdWUgb3V0IG9mIHJhbmdlOiAlZCcgJSBwcm9wb3NlZF92YWx1ZSkKLQotCi1jbGFzcyBVbmljb2RlVmFsdWVDaGVja2VyKG9iamVjdCk6Ci0KLSAgIiIiQ2hlY2tlciB1c2VkIGZvciBzdHJpbmcgZmllbGRzLiIiIgotCi0gIGRlZiBDaGVja1ZhbHVlKHNlbGYsIHByb3Bvc2VkX3ZhbHVlKToKLSAgICBpZiBub3QgaXNpbnN0YW5jZShwcm9wb3NlZF92YWx1ZSwgKHN0ciwgdW5pY29kZSkpOgotICAgICAgbWVzc2FnZSA9ICgnJS4xMDI0ciBoYXMgdHlwZSAlcywgYnV0IGV4cGVjdGVkIG9uZSBvZjogJXMnICUKLSAgICAgICAgICAgICAgICAgKHByb3Bvc2VkX3ZhbHVlLCB0eXBlKHByb3Bvc2VkX3ZhbHVlKSwgKHN0ciwgdW5pY29kZSkpKQotICAgICAgcmFpc2UgVHlwZUVycm9yKG1lc3NhZ2UpCi0KLSAgICAjIElmIHRoZSB2YWx1ZSBpcyBvZiB0eXBlICdzdHInIG1ha2Ugc3VyZSB0aGF0IGl0IGlzIGluIDctYml0IEFTQ0lJCi0gICAgIyBlbmNvZGluZy4KLSAgICBpZiBpc2luc3RhbmNlKHByb3Bvc2VkX3ZhbHVlLCBzdHIpOgotICAgICAgdHJ5OgotICAgICAgICB1bmljb2RlKHByb3Bvc2VkX3ZhbHVlLCAnYXNjaWknKQotICAgICAgZXhjZXB0IFVuaWNvZGVEZWNvZGVFcnJvcjoKLSAgICAgICAgcmFpc2UgVmFsdWVFcnJvcignJS4xMDI0ciBoYXMgdHlwZSBzdHIsIGJ1dCBpc25cJ3QgaW4gNy1iaXQgQVNDSUkgJwotICAgICAgICAgICAgICAgICAgICAgICAgICdlbmNvZGluZy4gTm9uLUFTQ0lJIHN0cmluZ3MgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gJwotICAgICAgICAgICAgICAgICAgICAgICAgICd1bmljb2RlIG9iamVjdHMgYmVmb3JlIGJlaW5nIGFkZGVkLicgJQotICAgICAgICAgICAgICAgICAgICAgICAgIChwcm9wb3NlZF92YWx1ZSkpCi0KLQotY2xhc3MgSW50MzJWYWx1ZUNoZWNrZXIoSW50VmFsdWVDaGVja2VyKToKLSAgIyBXZSdyZSBzdXJlIHRvIHVzZSBpbnRzIGluc3RlYWQgb2YgbG9uZ3MgaGVyZSBzaW5jZSBjb21wYXJpc29uIG1heSBiZSBtb3JlCi0gICMgZWZmaWNpZW50LgotICBfTUlOID0gLTIxNDc0ODM2NDgKLSAgX01BWCA9IDIxNDc0ODM2NDcKLQotCi1jbGFzcyBVaW50MzJWYWx1ZUNoZWNrZXIoSW50VmFsdWVDaGVja2VyKToKLSAgX01JTiA9IDAKLSAgX01BWCA9ICgxIDw8IDMyKSAtIDEKLQotCi1jbGFzcyBJbnQ2NFZhbHVlQ2hlY2tlcihJbnRWYWx1ZUNoZWNrZXIpOgotICBfTUlOID0gLSgxIDw8IDYzKQotICBfTUFYID0gKDEgPDwgNjMpIC0gMQotCi0KLWNsYXNzIFVpbnQ2NFZhbHVlQ2hlY2tlcihJbnRWYWx1ZUNoZWNrZXIpOgotICBfTUlOID0gMAotICBfTUFYID0gKDEgPDwgNjQpIC0gMQotCi0KLSMgVHlwZS1jaGVja2VycyBmb3IgYWxsIHNjYWxhciBDUFBUWVBFcy4KLV9WQUxVRV9DSEVDS0VSUyA9IHsKLSAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfSU5UMzI6IEludDMyVmFsdWVDaGVja2VyKCksCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX0lOVDY0OiBJbnQ2NFZhbHVlQ2hlY2tlcigpLAotICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9VSU5UMzI6IFVpbnQzMlZhbHVlQ2hlY2tlcigpLAotICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9VSU5UNjQ6IFVpbnQ2NFZhbHVlQ2hlY2tlcigpLAotICAgIF9GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9ET1VCTEU6IFR5cGVDaGVja2VyKAotICAgICAgICBmbG9hdCwgaW50LCBsb25nKSwKLSAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRkxPQVQ6IFR5cGVDaGVja2VyKAotICAgICAgICBmbG9hdCwgaW50LCBsb25nKSwKLSAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfQk9PTDogVHlwZUNoZWNrZXIoYm9vbCwgaW50KSwKLSAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfRU5VTTogSW50MzJWYWx1ZUNoZWNrZXIoKSwKLSAgICBfRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfU1RSSU5HOiBUeXBlQ2hlY2tlcihzdHIpLAotICAgIH0KLQotCi0jIE1hcCBmcm9tIGZpZWxkIHR5cGUgdG8gYSBmdW5jdGlvbiBGLCBzdWNoIHRoYXQgRihmaWVsZF9udW0sIHZhbHVlKQotIyBnaXZlcyB0aGUgdG90YWwgYnl0ZSBzaXplIGZvciBhIHZhbHVlIG9mIHRoZSBnaXZlbiB0eXBlLiAgVGhpcwotIyBieXRlIHNpemUgaW5jbHVkZXMgdGFnIGluZm9ybWF0aW9uIGFuZCBhbnkgb3RoZXIgYWRkaXRpb25hbCBzcGFjZQotIyBhc3NvY2lhdGVkIHdpdGggc2VyaWFsaXppbmcgInZhbHVlIi4KLVRZUEVfVE9fQllURV9TSVpFX0ZOID0gewotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IHdpcmVfZm9ybWF0LkRvdWJsZUJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogd2lyZV9mb3JtYXQuRmxvYXRCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IHdpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQ2NDogd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiB3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiB3aXJlX2Zvcm1hdC5GaXhlZDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzI6IHdpcmVfZm9ybWF0LkZpeGVkMzJCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogd2lyZV9mb3JtYXQuQm9vbEJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6IHdpcmVfZm9ybWF0LlN0cmluZ0J5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogd2lyZV9mb3JtYXQuR3JvdXBCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogd2lyZV9mb3JtYXQuTWVzc2FnZUJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzogd2lyZV9mb3JtYXQuQnl0ZXNCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDMyOiB3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVENjQ6IHdpcmVfZm9ybWF0LlNGaXhlZDY0Qnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogd2lyZV9mb3JtYXQuU0ludDMyQnl0ZVNpemUsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogd2lyZV9mb3JtYXQuU0ludDY0Qnl0ZVNpemUKLSAgICB9Ci0KLQotIyBNYXBzIGZyb20gZmllbGQgdHlwZXMgdG8gZW5jb2RlciBjb25zdHJ1Y3RvcnMuCi1UWVBFX1RPX0VOQ09ERVIgPSB7Ci0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRTogZW5jb2Rlci5Eb3VibGVFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogZW5jb2Rlci5GbG9hdEVuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDY0OiBlbmNvZGVyLkludDY0RW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0OiBlbmNvZGVyLlVJbnQ2NEVuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiBlbmNvZGVyLkludDMyRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogZW5jb2Rlci5GaXhlZDY0RW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogZW5jb2Rlci5GaXhlZDMyRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogZW5jb2Rlci5Cb29sRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU1RSSU5HOiBlbmNvZGVyLlN0cmluZ0VuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOiBlbmNvZGVyLkdyb3VwRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogZW5jb2Rlci5NZXNzYWdlRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6IGVuY29kZXIuQnl0ZXNFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UMzI6IGVuY29kZXIuVUludDMyRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogZW5jb2Rlci5FbnVtRW5jb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0ZJWEVEMzI6IGVuY29kZXIuU0ZpeGVkMzJFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogZW5jb2Rlci5TRml4ZWQ2NEVuY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogZW5jb2Rlci5TSW50MzJFbmNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQ6IGVuY29kZXIuU0ludDY0RW5jb2RlciwKLSAgICB9Ci0KLQotIyBNYXBzIGZyb20gZmllbGQgdHlwZXMgdG8gc2l6ZXIgY29uc3RydWN0b3JzLgotVFlQRV9UT19TSVpFUiA9IHsKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiBlbmNvZGVyLkRvdWJsZVNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVDogZW5jb2Rlci5GbG9hdFNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogZW5jb2Rlci5JbnQ2NFNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IGVuY29kZXIuVUludDY0U2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0lOVDMyOiBlbmNvZGVyLkludDMyU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVENjQ6IGVuY29kZXIuRml4ZWQ2NFNpemVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiBlbmNvZGVyLkZpeGVkMzJTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogZW5jb2Rlci5Cb29sU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzogZW5jb2Rlci5TdHJpbmdTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IGVuY29kZXIuR3JvdXBTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRTogZW5jb2Rlci5NZXNzYWdlU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0JZVEVTOiBlbmNvZGVyLkJ5dGVzU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogZW5jb2Rlci5VSW50MzJTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRU5VTTogZW5jb2Rlci5FbnVtU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiBlbmNvZGVyLlNGaXhlZDMyU2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiBlbmNvZGVyLlNGaXhlZDY0U2l6ZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQzMjogZW5jb2Rlci5TSW50MzJTaXplciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDY0OiBlbmNvZGVyLlNJbnQ2NFNpemVyLAotICAgIH0KLQotCi0jIE1hcHMgZnJvbSBmaWVsZCB0eXBlIHRvIGEgZGVjb2RlciBjb25zdHJ1Y3Rvci4KLVRZUEVfVE9fREVDT0RFUiA9IHsKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRE9VQkxFOiBkZWNvZGVyLkRvdWJsZURlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUOiBkZWNvZGVyLkZsb2F0RGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQ6IGRlY29kZXIuSW50NjREZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IGRlY29kZXIuVUludDY0RGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzI6IGRlY29kZXIuSW50MzJEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDY0OiBkZWNvZGVyLkZpeGVkNjREZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9GSVhFRDMyOiBkZWNvZGVyLkZpeGVkMzJEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CT09MOiBkZWNvZGVyLkJvb2xEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6IGRlY29kZXIuU3RyaW5nRGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVA6IGRlY29kZXIuR3JvdXBEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFOiBkZWNvZGVyLk1lc3NhZ2VEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzogZGVjb2Rlci5CeXRlc0RlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogZGVjb2Rlci5VSW50MzJEZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOiBkZWNvZGVyLkVudW1EZWNvZGVyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQzMjogZGVjb2Rlci5TRml4ZWQzMkRlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDY0OiBkZWNvZGVyLlNGaXhlZDY0RGVjb2RlciwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyOiBkZWNvZGVyLlNJbnQzMkRlY29kZXIsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogZGVjb2Rlci5TSW50NjREZWNvZGVyLAotICAgIH0KLQotIyBNYXBzIGZyb20gZmllbGQgdHlwZSB0byBleHBlY3RlZCB3aXJldHlwZS4KLUZJRUxEX1RZUEVfVE9fV0lSRV9UWVBFID0gewotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9ET1VCTEU6IHdpcmVfZm9ybWF0LldJUkVUWVBFX0ZJWEVENjQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX0ZMT0FUOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9JTlQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9VSU5UNjQ6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzI6IHdpcmVfZm9ybWF0LldJUkVUWVBFX1ZBUklOVCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQzMiwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkc6Ci0gICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfU1RBUlRfR1JPVVAsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX01FU1NBR0U6Ci0gICAgICB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUzoKLSAgICAgIHdpcmVfZm9ybWF0LldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMjogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9GSVhFRDMyLAotICAgIF9GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfRklYRUQ2NCwKLSAgICBfRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyOiB3aXJlX2Zvcm1hdC5XSVJFVFlQRV9WQVJJTlQsCi0gICAgX0ZpZWxkRGVzY3JpcHRvci5UWVBFX1NJTlQ2NDogd2lyZV9mb3JtYXQuV0lSRVRZUEVfVkFSSU5ULAotICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL2ludGVybmFsL3dpcmVfZm9ybWF0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGM5NDFmZTEuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyNjggKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkNvbnN0YW50cyBhbmQgc3RhdGljIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHByb3RvY29sIGJ1ZmZlciB3aXJlIGZvcm1hdC4iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotaW1wb3J0IHN0cnVjdAotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLWZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlCi0KLQotVEFHX1RZUEVfQklUUyA9IDMgICMgTnVtYmVyIG9mIGJpdHMgdXNlZCB0byBob2xkIHR5cGUgaW5mbyBpbiBhIHByb3RvIHRhZy4KLVRBR19UWVBFX01BU0sgPSAoMSA8PCBUQUdfVFlQRV9CSVRTKSAtIDEgICMgMHg3Ci0KLSMgVGhlc2UgbnVtYmVycyBpZGVudGlmeSB0aGUgd2lyZSB0eXBlIG9mIGEgcHJvdG9jb2wgYnVmZmVyIHZhbHVlLgotIyBXZSB1c2UgdGhlIGxlYXN0LXNpZ25pZmljYW50IFRBR19UWVBFX0JJVFMgYml0cyBvZiB0aGUgdmFyaW50LWVuY29kZWQKLSMgdGFnLWFuZC10eXBlIHRvIHN0b3JlIG9uZSBvZiB0aGVzZSBXSVJFVFlQRV8qIGNvbnN0YW50cy4KLSMgVGhlc2UgdmFsdWVzIG11c3QgbWF0Y2ggV2lyZVR5cGUgZW51bSBpbiBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaC4KLVdJUkVUWVBFX1ZBUklOVCA9IDAKLVdJUkVUWVBFX0ZJWEVENjQgPSAxCi1XSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEID0gMgotV0lSRVRZUEVfU1RBUlRfR1JPVVAgPSAzCi1XSVJFVFlQRV9FTkRfR1JPVVAgPSA0Ci1XSVJFVFlQRV9GSVhFRDMyID0gNQotX1dJUkVUWVBFX01BWCA9IDUKLQotCi0jIEJvdW5kcyBmb3IgdmFyaW91cyBpbnRlZ2VyIHR5cGVzLgotSU5UMzJfTUFYID0gaW50KCgxIDw8IDMxKSAtIDEpCi1JTlQzMl9NSU4gPSBpbnQoLSgxIDw8IDMxKSkKLVVJTlQzMl9NQVggPSAoMSA8PCAzMikgLSAxCi0KLUlOVDY0X01BWCA9ICgxIDw8IDYzKSAtIDEKLUlOVDY0X01JTiA9IC0oMSA8PCA2MykKLVVJTlQ2NF9NQVggPSAoMSA8PCA2NCkgLSAxCi0KLSMgInN0cnVjdCIgZm9ybWF0IHN0cmluZ3MgdGhhdCB3aWxsIGVuY29kZS9kZWNvZGUgdGhlIHNwZWNpZmllZCBmb3JtYXRzLgotRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOID0gJzxJJwotRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOID0gJzxRJwotRk9STUFUX0ZMT0FUX0xJVFRMRV9FTkRJQU4gPSAnPGYnCi1GT1JNQVRfRE9VQkxFX0xJVFRMRV9FTkRJQU4gPSAnPGQnCi0KLQotIyBXZSdsbCBoYXZlIHRvIHByb3ZpZGUgYWx0ZXJuYXRlIGltcGxlbWVudGF0aW9ucyBvZiBBcHBlbmRMaXR0bGVFbmRpYW4qKCkgb24KLSMgYW55IGFyY2hpdGVjdHVyZXMgd2hlcmUgdGhlc2UgY2hlY2tzIGZhaWwuCi1pZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQzMl9MSVRUTEVfRU5ESUFOKSAhPSA0OgotICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJJIiBpcyBub3QgYSAzMi1iaXQgbnVtYmVyLicpCi1pZiBzdHJ1Y3QuY2FsY3NpemUoRk9STUFUX1VJTlQ2NF9MSVRUTEVfRU5ESUFOKSAhPSA4OgotICByYWlzZSBBc3NlcnRpb25FcnJvcignRm9ybWF0ICJRIiBpcyBub3QgYSA2NC1iaXQgbnVtYmVyLicpCi0KLQotZGVmIFBhY2tUYWcoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpOgotICAiIiJSZXR1cm5zIGFuIHVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyIHRoYXQgZW5jb2RlcyB0aGUgZmllbGQgbnVtYmVyIGFuZAotICB3aXJlIHR5cGUgaW5mb3JtYXRpb24gaW4gc3RhbmRhcmQgcHJvdG9jb2wgbWVzc2FnZSB3aXJlIGZvcm1hdC4KLQotICBBcmdzOgotICAgIGZpZWxkX251bWJlcjogRXhwZWN0ZWQgdG8gYmUgYW4gaW50ZWdlciBpbiB0aGUgcmFuZ2UgWzEsIDEgPDwgMjkpCi0gICAgd2lyZV90eXBlOiBPbmUgb2YgdGhlIFdJUkVUWVBFXyogY29uc3RhbnRzLgotICAiIiIKLSAgaWYgbm90IDAgPD0gd2lyZV90eXBlIDw9IF9XSVJFVFlQRV9NQVg6Ci0gICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVW5rbm93biB3aXJlIHR5cGU6ICVkJyAlIHdpcmVfdHlwZSkKLSAgcmV0dXJuIChmaWVsZF9udW1iZXIgPDwgVEFHX1RZUEVfQklUUykgfCB3aXJlX3R5cGUKLQotCi1kZWYgVW5wYWNrVGFnKHRhZyk6Ci0gICIiIlRoZSBpbnZlcnNlIG9mIFBhY2tUYWcoKS4gIEdpdmVuIGFuIHVuc2lnbmVkIDMyLWJpdCBudW1iZXIsCi0gIHJldHVybnMgYSAoZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUpIHR1cGxlLgotICAiIiIKLSAgcmV0dXJuICh0YWcgPj4gVEFHX1RZUEVfQklUUyksICh0YWcgJiBUQUdfVFlQRV9NQVNLKQotCi0KLWRlZiBaaWdaYWdFbmNvZGUodmFsdWUpOgotICAiIiJaaWdaYWcgVHJhbnNmb3JtOiAgRW5jb2RlcyBzaWduZWQgaW50ZWdlcnMgc28gdGhhdCB0aGV5IGNhbiBiZQotICBlZmZlY3RpdmVseSB1c2VkIHdpdGggdmFyaW50IGVuY29kaW5nLiAgU2VlIHdpcmVfZm9ybWF0LmggZm9yCi0gIG1vcmUgZGV0YWlscy4KLSAgIiIiCi0gIGlmIHZhbHVlID49IDA6Ci0gICAgcmV0dXJuIHZhbHVlIDw8IDEKLSAgcmV0dXJuICh2YWx1ZSA8PCAxKSBeICh+MCkKLQotCi1kZWYgWmlnWmFnRGVjb2RlKHZhbHVlKToKLSAgIiIiSW52ZXJzZSBvZiBaaWdaYWdFbmNvZGUoKS4iIiIKLSAgaWYgbm90IHZhbHVlICYgMHgxOgotICAgIHJldHVybiB2YWx1ZSA+PiAxCi0gIHJldHVybiAodmFsdWUgPj4gMSkgXiAofjApCi0KLQotCi0jIFRoZSAqQnl0ZVNpemUoKSBmdW5jdGlvbnMgYmVsb3cgcmV0dXJuIHRoZSBudW1iZXIgb2YgYnl0ZXMgcmVxdWlyZWQgdG8KLSMgc2VyaWFsaXplICJmaWVsZCBudW1iZXIgKyB0eXBlIiBpbmZvcm1hdGlvbiBhbmQgdGhlbiBzZXJpYWxpemUgdGhlIHZhbHVlLgotCi0KLWRlZiBJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgaW50MzIpOgotICByZXR1cm4gSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKQotCi0KLWRlZiBJbnQzMkJ5dGVTaXplTm9UYWcoaW50MzIpOgotICByZXR1cm4gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50MzIpCi0KLQotZGVmIEludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6Ci0gICMgSGF2ZSB0byBjb252ZXJ0IHRvIHVpbnQgYmVmb3JlIGNhbGxpbmcgVUludDY0Qnl0ZVNpemUoKS4KLSAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgMHhmZmZmZmZmZmZmZmZmZmZmICYgaW50NjQpCi0KLQotZGVmIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKToKLSAgcmV0dXJuIFVJbnQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgdWludDMyKQotCi0KLWRlZiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHVpbnQ2NCk6Ci0gIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcodWludDY0KQotCi0KLWRlZiBTSW50MzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGludDMyKToKLSAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgWmlnWmFnRW5jb2RlKGludDMyKSkKLQotCi1kZWYgU0ludDY0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBpbnQ2NCk6Ci0gIHJldHVybiBVSW50NjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIFppZ1phZ0VuY29kZShpbnQ2NCkpCi0KLQotZGVmIEZpeGVkMzJCeXRlU2l6ZShmaWVsZF9udW1iZXIsIGZpeGVkMzIpOgotICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKLQotCi1kZWYgRml4ZWQ2NEJ5dGVTaXplKGZpZWxkX251bWJlciwgZml4ZWQ2NCk6Ci0gIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgOAotCi0KLWRlZiBTRml4ZWQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgc2ZpeGVkMzIpOgotICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKLQotCi1kZWYgU0ZpeGVkNjRCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHNmaXhlZDY0KToKLSAgcmV0dXJuIFRhZ0J5dGVTaXplKGZpZWxkX251bWJlcikgKyA4Ci0KLQotZGVmIEZsb2F0Qnl0ZVNpemUoZmllbGRfbnVtYmVyLCBmbHQpOgotICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDQKLQotCi1kZWYgRG91YmxlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBkb3VibGUpOgotICByZXR1cm4gVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSArIDgKLQotCi1kZWYgQm9vbEJ5dGVTaXplKGZpZWxkX251bWJlciwgYik6Ci0gIHJldHVybiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpICsgMQotCi0KLWRlZiBFbnVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBlbnVtKToKLSAgcmV0dXJuIFVJbnQzMkJ5dGVTaXplKGZpZWxkX251bWJlciwgZW51bSkKLQotCi1kZWYgU3RyaW5nQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBzdHJpbmcpOgotICByZXR1cm4gQnl0ZXNCeXRlU2l6ZShmaWVsZF9udW1iZXIsIHN0cmluZy5lbmNvZGUoJ3V0Zi04JykpCi0KLQotZGVmIEJ5dGVzQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBiKToKLSAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCi0gICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhsZW4oYikpCi0gICAgICAgICAgKyBsZW4oYikpCi0KLQotZGVmIEdyb3VwQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKLSAgcmV0dXJuICgyICogVGFnQnl0ZVNpemUoZmllbGRfbnVtYmVyKSAgIyBTVEFSVCBhbmQgRU5EIGdyb3VwLgotICAgICAgICAgICsgbWVzc2FnZS5CeXRlU2l6ZSgpKQotCi0KLWRlZiBNZXNzYWdlQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtZXNzYWdlKToKLSAgcmV0dXJuIChUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpCi0gICAgICAgICAgKyBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhtZXNzYWdlLkJ5dGVTaXplKCkpCi0gICAgICAgICAgKyBtZXNzYWdlLkJ5dGVTaXplKCkpCi0KLQotZGVmIE1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoZmllbGRfbnVtYmVyLCBtc2cpOgotICAjIEZpcnN0IGNvbXB1dGUgdGhlIHNpemVzIG9mIHRoZSB0YWdzLgotICAjIFRoZXJlIGFyZSAyIHRhZ3MgZm9yIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBvZiB0aGUgcmVwZWF0ZWQgZ3JvdXAsIHRoYXQKLSAgIyBpcyBmaWVsZCBudW1iZXIgMSwgb25lIHdpdGggZmllbGQgbnVtYmVyIDIgKHR5cGVfaWQpIGFuZCBvbmUgd2l0aCBmaWVsZAotICAjIG51bWJlciAzIChtZXNzYWdlKS4KLSAgdG90YWxfc2l6ZSA9ICgyICogVGFnQnl0ZVNpemUoMSkgKyBUYWdCeXRlU2l6ZSgyKSArIFRhZ0J5dGVTaXplKDMpKQotCi0gICMgQWRkIHRoZSBudW1iZXIgb2YgYnl0ZXMgZm9yIHR5cGVfaWQuCi0gIHRvdGFsX3NpemUgKz0gX1ZhclVJbnQ2NEJ5dGVTaXplTm9UYWcoZmllbGRfbnVtYmVyKQotCi0gIG1lc3NhZ2Vfc2l6ZSA9IG1zZy5CeXRlU2l6ZSgpCi0KLSAgIyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGZvciBlbmNvZGluZyB0aGUgbGVuZ3RoIG9mIHRoZSBtZXNzYWdlLgotICB0b3RhbF9zaXplICs9IF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKG1lc3NhZ2Vfc2l6ZSkKLQotICAjIFRoZSBzaXplIG9mIHRoZSBtZXNzYWdlLgotICB0b3RhbF9zaXplICs9IG1lc3NhZ2Vfc2l6ZQotICByZXR1cm4gdG90YWxfc2l6ZQotCi0KLWRlZiBUYWdCeXRlU2l6ZShmaWVsZF9udW1iZXIpOgotICAiIiJSZXR1cm5zIHRoZSBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSB0YWcgd2l0aCB0aGlzIGZpZWxkIG51bWJlci4iIiIKLSAgIyBKdXN0IHBhc3MgaW4gdHlwZSAwLCBzaW5jZSB0aGUgdHlwZSB3b24ndCBhZmZlY3QgdGhlIHRhZyt0eXBlIHNpemUuCi0gIHJldHVybiBfVmFyVUludDY0Qnl0ZVNpemVOb1RhZyhQYWNrVGFnKGZpZWxkX251bWJlciwgMCkpCi0KLQotIyBQcml2YXRlIGhlbHBlciBmdW5jdGlvbiBmb3IgdGhlICpCeXRlU2l6ZSgpIGZ1bmN0aW9ucyBhYm92ZS4KLQotZGVmIF9WYXJVSW50NjRCeXRlU2l6ZU5vVGFnKHVpbnQ2NCk6Ci0gICIiIlJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyByZXF1aXJlZCB0byBzZXJpYWxpemUgYSBzaW5nbGUgdmFyaW50Ci0gIHVzaW5nIGJvdW5kYXJ5IHZhbHVlIGNvbXBhcmlzb25zLiAodW5yb2xsZWQgbG9vcCBvcHRpbWl6YXRpb24gLVdQaWVyY2UpCi0gIHVpbnQ2NCBtdXN0IGJlIHVuc2lnbmVkLgotICAiIiIKLSAgaWYgdWludDY0IDw9IDB4N2Y6IHJldHVybiAxCi0gIGlmIHVpbnQ2NCA8PSAweDNmZmY6IHJldHVybiAyCi0gIGlmIHVpbnQ2NCA8PSAweDFmZmZmZjogcmV0dXJuIDMKLSAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZjogcmV0dXJuIDQKLSAgaWYgdWludDY0IDw9IDB4N2ZmZmZmZmZmOiByZXR1cm4gNQotICBpZiB1aW50NjQgPD0gMHgzZmZmZmZmZmZmZjogcmV0dXJuIDYKLSAgaWYgdWludDY0IDw9IDB4MWZmZmZmZmZmZmZmZjogcmV0dXJuIDcKLSAgaWYgdWludDY0IDw9IDB4ZmZmZmZmZmZmZmZmZmY6IHJldHVybiA4Ci0gIGlmIHVpbnQ2NCA8PSAweDdmZmZmZmZmZmZmZmZmZmY6IHJldHVybiA5Ci0gIGlmIHVpbnQ2NCA+IFVJTlQ2NF9NQVg6Ci0gICAgcmFpc2UgbWVzc2FnZS5FbmNvZGVFcnJvcignVmFsdWUgb3V0IG9mIHJhbmdlOiAlZCcgJSB1aW50NjQpCi0gIHJldHVybiAxMAotCi0KLU5PTl9QQUNLQUJMRV9UWVBFUyA9ICgKLSAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TVFJJTkcsCi0gIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfR1JPVVAsCi0gIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfTUVTU0FHRSwKLSAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9CWVRFUwotKQotCi0KLWRlZiBJc1R5cGVQYWNrYWJsZShmaWVsZF90eXBlKToKLSAgIiIiUmV0dXJuIHRydWUgaWZmIHBhY2thYmxlID0gdHJ1ZSBpcyB2YWxpZCBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KLQotICBBcmdzOgotICAgIGZpZWxkX3R5cGU6IGEgRmllbGREZXNjcmlwdG9yOjpUeXBlIHZhbHVlLgotCi0gIFJldHVybnM6Ci0gICAgVHJ1ZSBpZmYgZmllbGRzIG9mIHRoaXMgdHlwZSBhcmUgcGFja2FibGUuCi0gICIiIgotICByZXR1cm4gZmllbGRfdHlwZSBub3QgaW4gTk9OX1BBQ0tBQkxFX1RZUEVTCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdF90ZXN0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvd2lyZV9mb3JtYXRfdGVzdC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzYwMDc3OC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC93aXJlX2Zvcm1hdF90ZXN0LnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjUzICswLDAgQEAKLSMhIC91c3IvYmluL3B5dGhvbgotIwotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIlRlc3QgZm9yIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53aXJlX2Zvcm1hdC4iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotaW1wb3J0IHVuaXR0ZXN0Ci1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZQotZnJvbSBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwgaW1wb3J0IHdpcmVfZm9ybWF0Ci0KLQotY2xhc3MgV2lyZUZvcm1hdFRlc3QodW5pdHRlc3QuVGVzdENhc2UpOgotCi0gIGRlZiB0ZXN0UGFja1RhZyhzZWxmKToKLSAgICBmaWVsZF9udW1iZXIgPSAweGFiYwotICAgIHRhZ190eXBlID0gMgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoKGZpZWxkX251bWJlciA8PCAzKSB8IHRhZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuUGFja1RhZyhmaWVsZF9udW1iZXIsIHRhZ190eXBlKSkKLSAgICBQYWNrVGFnID0gd2lyZV9mb3JtYXQuUGFja1RhZwotICAgICMgTnVtYmVyIHRvbyBoaWdoLgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRW5jb2RlRXJyb3IsIFBhY2tUYWcsIGZpZWxkX251bWJlciwgNikKLSAgICAjIE51bWJlciB0b28gbG93LgotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKG1lc3NhZ2UuRW5jb2RlRXJyb3IsIFBhY2tUYWcsIGZpZWxkX251bWJlciwgLTEpCi0KLSAgZGVmIHRlc3RVbnBhY2tUYWcoc2VsZik6Ci0gICAgIyBUZXN0IGZpZWxkIG51bWJlcnMgdGhhdCB3aWxsIHJlcXVpcmUgdmFyaW91cyB2YXJpbnQgc2l6ZXMuCi0gICAgZm9yIGV4cGVjdGVkX2ZpZWxkX251bWJlciBpbiAoMSwgMTUsIDE2LCAyMDQ3LCAyMDQ4KToKLSAgICAgIGZvciBleHBlY3RlZF93aXJlX3R5cGUgaW4gcmFuZ2UoNik6ICAjIEhpZ2hlc3QtbnVtYmVyZWQgd2lyZXR5cGUgaXMgNS4KLSAgICAgICAgZmllbGRfbnVtYmVyLCB3aXJlX3R5cGUgPSB3aXJlX2Zvcm1hdC5VbnBhY2tUYWcoCi0gICAgICAgICAgICB3aXJlX2Zvcm1hdC5QYWNrVGFnKGV4cGVjdGVkX2ZpZWxkX251bWJlciwgZXhwZWN0ZWRfd2lyZV90eXBlKSkKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF9maWVsZF9udW1iZXIsIGZpZWxkX251bWJlcikKLSAgICAgICAgc2VsZi5hc3NlcnRFcXVhbChleHBlY3RlZF93aXJlX3R5cGUsIHdpcmVfdHlwZSkKLQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCBOb25lKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCAnYWJjJykKLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIHdpcmVfZm9ybWF0LlVucGFja1RhZywgMC4wKQotICAgIHNlbGYuYXNzZXJ0UmFpc2VzKFR5cGVFcnJvciwgd2lyZV9mb3JtYXQuVW5wYWNrVGFnLCBvYmplY3QoKSkKLQotICBkZWYgdGVzdFppZ1phZ0VuY29kZShzZWxmKToKLSAgICBaID0gd2lyZV9mb3JtYXQuWmlnWmFnRW5jb2RlCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBaKDApKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMSwgWigtMSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBaKDEpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMywgWigtMikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCg0LCBaKDIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZSwgWigweDdmZmZmZmZmKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKDB4ZmZmZmZmZmYsIFooLTB4ODAwMDAwMDApKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHhmZmZmZmZmZmZmZmZmZmZlLCBaKDB4N2ZmZmZmZmZmZmZmZmZmZikpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgweGZmZmZmZmZmZmZmZmZmZmYsIFooLTB4ODAwMDAwMDAwMDAwMDAwMCkpCi0KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAnYWJjZCcpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAwLjApCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCBvYmplY3QoKSkKLQotICBkZWYgdGVzdFppZ1phZ0RlY29kZShzZWxmKToKLSAgICBaID0gd2lyZV9mb3JtYXQuWmlnWmFnRGVjb2RlCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgwLCBaKDApKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTEsIFooMSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgxLCBaKDIpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoLTIsIFooMykpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgyLCBaKDQpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHg3ZmZmZmZmZiwgWigweGZmZmZmZmZlKSkKLSAgICBzZWxmLmFzc2VydEVxdWFsKC0weDgwMDAwMDAwLCBaKDB4ZmZmZmZmZmYpKQotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMHg3ZmZmZmZmZmZmZmZmZmZmLCBaKDB4ZmZmZmZmZmZmZmZmZmZmZSkpCi0gICAgc2VsZi5hc3NlcnRFcXVhbCgtMHg4MDAwMDAwMDAwMDAwMDAwLCBaKDB4ZmZmZmZmZmZmZmZmZmZmZikpCi0KLSAgICBzZWxmLmFzc2VydFJhaXNlcyhUeXBlRXJyb3IsIFosIE5vbmUpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAnYWJjZCcpCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCAwLjApCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMoVHlwZUVycm9yLCBaLCBvYmplY3QoKSkKLQotICBkZWYgTnVtZXJpY0J5dGVTaXplVGVzdEhlbHBlcihzZWxmLCBieXRlX3NpemVfZm4sIHZhbHVlLCBleHBlY3RlZF92YWx1ZV9zaXplKToKLSAgICAjIFVzZSBmaWVsZCBudW1iZXJzIHRoYXQgY2F1c2UgdmFyaW91cyBieXRlIHNpemVzIGZvciB0aGUgdGFnIGluZm9ybWF0aW9uLgotICAgIGZvciBmaWVsZF9udW1iZXIsIHRhZ19ieXRlcyBpbiAoKDE1LCAxKSwgKDE2LCAyKSwgKDIwNDcsIDIpLCAoMjA0OCwgMykpOgotICAgICAgZXhwZWN0ZWRfc2l6ZSA9IGV4cGVjdGVkX3ZhbHVlX3NpemUgKyB0YWdfYnl0ZXMKLSAgICAgIGFjdHVhbF9zaXplID0gYnl0ZV9zaXplX2ZuKGZpZWxkX251bWJlciwgdmFsdWUpCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKGV4cGVjdGVkX3NpemUsIGFjdHVhbF9zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAnYnl0ZV9zaXplX2ZuOiAlcywgZmllbGRfbnVtYmVyOiAlZCwgdmFsdWU6ICVyXG4nCi0gICAgICAgICAgICAgICAgICAgICAgICdFeHBlY3RlZDogJWQsIEFjdHVhbDogJWQnJSAoCi0gICAgICAgICAgYnl0ZV9zaXplX2ZuLCBmaWVsZF9udW1iZXIsIHZhbHVlLCBleHBlY3RlZF9zaXplLCBhY3R1YWxfc2l6ZSkpCi0KLSAgZGVmIHRlc3RCeXRlU2l6ZUZ1bmN0aW9ucyhzZWxmKToKLSAgICAjIFRlc3QgYWxsIG51bWVyaWMgKkJ5dGVTaXplKCkgZnVuY3Rpb25zLgotICAgIE5VTUVSSUNfQVJHUyA9IFsKLSAgICAgICAgIyBJbnQzMkJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLCAwLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkludDMyQnl0ZVNpemUsIDEyNywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQzMkJ5dGVTaXplLCAxMjgsIDJdLAotICAgICAgICBbd2lyZV9mb3JtYXQuSW50MzJCeXRlU2l6ZSwgLTEsIDEwXSwKLSAgICAgICAgIyBJbnQ2NEJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLCAwLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkludDY0Qnl0ZVNpemUsIDEyNywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5JbnQ2NEJ5dGVTaXplLCAxMjgsIDJdLAotICAgICAgICBbd2lyZV9mb3JtYXQuSW50NjRCeXRlU2l6ZSwgLTEsIDEwXSwKLSAgICAgICAgIyBVSW50MzJCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsIDAsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuVUludDMyQnl0ZVNpemUsIDEyNywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50MzJCeXRlU2l6ZSwgMTI4LCAyXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQzMkJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UMzJfTUFYLCA1XSwKLSAgICAgICAgIyBVSW50NjRCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsIDAsIDFdLAotICAgICAgICBbd2lyZV9mb3JtYXQuVUludDY0Qnl0ZVNpemUsIDEyNywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMTI4LCAyXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlVJbnQ2NEJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UNjRfTUFYLCAxMF0sCi0gICAgICAgICMgU0ludDMyQnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAwLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCAtMSwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgMSwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgLTYzLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCA2MywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50MzJCeXRlU2l6ZSwgLTY0LCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQzMkJ5dGVTaXplLCA2NCwgMl0sCi0gICAgICAgICMgU0ludDY0Qnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAwLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCAtMSwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgMSwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgLTYzLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCA2MywgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TSW50NjRCeXRlU2l6ZSwgLTY0LCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNJbnQ2NEJ5dGVTaXplLCA2NCwgMl0sCi0gICAgICAgICMgRml4ZWQzMkJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5GaXhlZDMyQnl0ZVNpemUsIDAsIDRdLAotICAgICAgICBbd2lyZV9mb3JtYXQuRml4ZWQzMkJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5VSU5UMzJfTUFYLCA0XSwKLSAgICAgICAgIyBGaXhlZDY0Qnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LkZpeGVkNjRCeXRlU2l6ZSwgMCwgOF0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5GaXhlZDY0Qnl0ZVNpemUsIHdpcmVfZm9ybWF0LlVJTlQ2NF9NQVgsIDhdLAotICAgICAgICAjIFNGaXhlZDMyQnl0ZVNpemUoKS4KLSAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDMyQnl0ZVNpemUsIDAsIDRdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkMzJCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuSU5UMzJfTUlOLCA0XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LlNGaXhlZDMyQnl0ZVNpemUsIHdpcmVfZm9ybWF0LklOVDMyX01BWCwgNF0sCi0gICAgICAgICMgU0ZpeGVkNjRCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkNjRCeXRlU2l6ZSwgMCwgOF0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5TRml4ZWQ2NEJ5dGVTaXplLCB3aXJlX2Zvcm1hdC5JTlQ2NF9NSU4sIDhdLAotICAgICAgICBbd2lyZV9mb3JtYXQuU0ZpeGVkNjRCeXRlU2l6ZSwgd2lyZV9mb3JtYXQuSU5UNjRfTUFYLCA4XSwKLSAgICAgICAgIyBGbG9hdEJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5GbG9hdEJ5dGVTaXplLCAwLjAsIDRdLAotICAgICAgICBbd2lyZV9mb3JtYXQuRmxvYXRCeXRlU2l6ZSwgMTAwMDAwMDAwMC4wLCA0XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkZsb2F0Qnl0ZVNpemUsIC0xMDAwMDAwMDAwLjAsIDRdLAotICAgICAgICAjIERvdWJsZUJ5dGVTaXplKCkuCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5Eb3VibGVCeXRlU2l6ZSwgMC4wLCA4XSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkRvdWJsZUJ5dGVTaXplLCAxMDAwMDAwMDAwLjAsIDhdLAotICAgICAgICBbd2lyZV9mb3JtYXQuRG91YmxlQnl0ZVNpemUsIC0xMDAwMDAwMDAwLjAsIDhdLAotICAgICAgICAjIEJvb2xCeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuQm9vbEJ5dGVTaXplLCBGYWxzZSwgMV0sCi0gICAgICAgIFt3aXJlX2Zvcm1hdC5Cb29sQnl0ZVNpemUsIFRydWUsIDFdLAotICAgICAgICAjIEVudW1CeXRlU2l6ZSgpLgotICAgICAgICBbd2lyZV9mb3JtYXQuRW51bUJ5dGVTaXplLCAwLCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwgMTI3LCAxXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwgMTI4LCAyXSwKLSAgICAgICAgW3dpcmVfZm9ybWF0LkVudW1CeXRlU2l6ZSwgd2lyZV9mb3JtYXQuVUlOVDMyX01BWCwgNV0sCi0gICAgICAgIF0KLSAgICBmb3IgYXJncyBpbiBOVU1FUklDX0FSR1M6Ci0gICAgICBzZWxmLk51bWVyaWNCeXRlU2l6ZVRlc3RIZWxwZXIoKmFyZ3MpCi0KLSAgICAjIFRlc3Qgc3RyaW5ncyBhbmQgYnl0ZXMuCi0gICAgZm9yIGJ5dGVfc2l6ZV9mbiBpbiAod2lyZV9mb3JtYXQuU3RyaW5nQnl0ZVNpemUsIHdpcmVfZm9ybWF0LkJ5dGVzQnl0ZVNpemUpOgotICAgICAgIyAxIGJ5dGUgZm9yIHRhZywgMSBieXRlIGZvciBsZW5ndGgsIDMgYnl0ZXMgZm9yIGNvbnRlbnRzLgotICAgICAgc2VsZi5hc3NlcnRFcXVhbCg1LCBieXRlX3NpemVfZm4oMTAsICdhYmMnKSkKLSAgICAgICMgMiBieXRlcyBmb3IgdGFnLCAxIGJ5dGUgZm9yIGxlbmd0aCwgMyBieXRlcyBmb3IgY29udGVudHMuCi0gICAgICBzZWxmLmFzc2VydEVxdWFsKDYsIGJ5dGVfc2l6ZV9mbigxNiwgJ2FiYycpKQotICAgICAgIyAyIGJ5dGVzIGZvciB0YWcsIDIgYnl0ZXMgZm9yIGxlbmd0aCwgMTI4IGJ5dGVzIGZvciBjb250ZW50cy4KLSAgICAgIHNlbGYuYXNzZXJ0RXF1YWwoMTMyLCBieXRlX3NpemVfZm4oMTYsICdhJyAqIDEyOCkpCi0KLSAgICAjIFRlc3QgVVRGLTggc3RyaW5nIGJ5dGUgc2l6ZSBjYWxjdWxhdGlvbi4KLSAgICAjIDEgYnl0ZSBmb3IgdGFnLCAxIGJ5dGUgZm9yIGxlbmd0aCwgOCBieXRlcyBmb3IgY29udGVudC4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDEwLCB3aXJlX2Zvcm1hdC5TdHJpbmdCeXRlU2l6ZSgKLSAgICAgICAgNSwgdW5pY29kZSgnXHhkMFx4YTJceGQwXHhiNVx4ZDFceDgxXHhkMVx4ODInLCAndXRmLTgnKSkpCi0KLSAgICBjbGFzcyBNb2NrTWVzc2FnZShvYmplY3QpOgotICAgICAgZGVmIF9faW5pdF9fKHNlbGYsIGJ5dGVfc2l6ZSk6Ci0gICAgICAgIHNlbGYuYnl0ZV9zaXplID0gYnl0ZV9zaXplCi0gICAgICBkZWYgQnl0ZVNpemUoc2VsZik6Ci0gICAgICAgIHJldHVybiBzZWxmLmJ5dGVfc2l6ZQotCi0gICAgbWVzc2FnZV9ieXRlX3NpemUgPSAxMAotICAgIG1vY2tfbWVzc2FnZSA9IE1vY2tNZXNzYWdlKGJ5dGVfc2l6ZT1tZXNzYWdlX2J5dGVfc2l6ZSkKLSAgICAjIFRlc3QgZ3JvdXBzLgotICAgICMgKDIgKiAxKSBieXRlcyBmb3IgYmVnaW4gYW5kIGVuZCB0YWdzLCBwbHVzIG1lc3NhZ2VfYnl0ZV9zaXplLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIG1lc3NhZ2VfYnl0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuR3JvdXBCeXRlU2l6ZSgxLCBtb2NrX21lc3NhZ2UpKQotICAgICMgKDIgKiAyKSBieXRlcyBmb3IgYmVnaW4gYW5kIGVuZCB0YWdzLCBwbHVzIG1lc3NhZ2VfYnl0ZV9zaXplLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoNCArIG1lc3NhZ2VfYnl0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuR3JvdXBCeXRlU2l6ZSgxNiwgbW9ja19tZXNzYWdlKSkKLQotICAgICMgVGVzdCBtZXNzYWdlcy4KLSAgICAjIDEgYnl0ZSBmb3IgdGFnLCBwbHVzIDEgYnl0ZSBmb3IgbGVuZ3RoLCBwbHVzIGNvbnRlbnRzLgotICAgIHNlbGYuYXNzZXJ0RXF1YWwoMiArIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUsCi0gICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlQnl0ZVNpemUoMSwgbW9ja19tZXNzYWdlKSkKLSAgICAjIDIgYnl0ZXMgZm9yIHRhZywgcGx1cyAxIGJ5dGUgZm9yIGxlbmd0aCwgcGx1cyBjb250ZW50cy4KLSAgICBzZWxmLmFzc2VydEVxdWFsKDMgKyBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplLAotICAgICAgICAgICAgICAgICAgICAgd2lyZV9mb3JtYXQuTWVzc2FnZUJ5dGVTaXplKDE2LCBtb2NrX21lc3NhZ2UpKQotICAgICMgMiBieXRlcyBmb3IgdGFnLCBwbHVzIDIgYnl0ZXMgZm9yIGxlbmd0aCwgcGx1cyBjb250ZW50cy4KLSAgICBtb2NrX21lc3NhZ2UuYnl0ZV9zaXplID0gMTI4Ci0gICAgc2VsZi5hc3NlcnRFcXVhbCg0ICsgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VCeXRlU2l6ZSgxNiwgbW9ja19tZXNzYWdlKSkKLQotCi0gICAgIyBUZXN0IG1lc3NhZ2Ugc2V0IGl0ZW0gYnl0ZSBzaXplLgotICAgICMgNCBieXRlcyBmb3IgdGFncywgcGx1cyAxIGJ5dGUgZm9yIGxlbmd0aCwgcGx1cyAxIGJ5dGUgZm9yIHR5cGVfaWQsCi0gICAgIyBwbHVzIGNvbnRlbnRzLgotICAgIG1vY2tfbWVzc2FnZS5ieXRlX3NpemUgPSAxMAotICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSArIDYsCi0gICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKDEsIG1vY2tfbWVzc2FnZSkpCi0KLSAgICAjIDQgYnl0ZXMgZm9yIHRhZ3MsIHBsdXMgMiBieXRlcyBmb3IgbGVuZ3RoLCBwbHVzIDEgYnl0ZSBmb3IgdHlwZV9pZCwKLSAgICAjIHBsdXMgY29udGVudHMuCi0gICAgbW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSA9IDEyOAotICAgIHNlbGYuYXNzZXJ0RXF1YWwobW9ja19tZXNzYWdlLmJ5dGVfc2l6ZSArIDcsCi0gICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKDEsIG1vY2tfbWVzc2FnZSkpCi0KLSAgICAjIDQgYnl0ZXMgZm9yIHRhZ3MsIHBsdXMgMiBieXRlcyBmb3IgbGVuZ3RoLCBwbHVzIDIgYnl0ZSBmb3IgdHlwZV9pZCwKLSAgICAjIHBsdXMgY29udGVudHMuCi0gICAgc2VsZi5hc3NlcnRFcXVhbChtb2NrX21lc3NhZ2UuYnl0ZV9zaXplICsgOCwKLSAgICAgICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0Lk1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoMTI4LCBtb2NrX21lc3NhZ2UpKQotCi0gICAgIyBUb28tbG9uZyB2YXJpbnQuCi0gICAgc2VsZi5hc3NlcnRSYWlzZXMobWVzc2FnZS5FbmNvZGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgICB3aXJlX2Zvcm1hdC5VSW50NjRCeXRlU2l6ZSwgMSwgMSA8PCAxMjgpCi0KLQotaWYgX19uYW1lX18gPT0gJ19fbWFpbl9fJzoKLSAgdW5pdHRlc3QubWFpbigpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNmYxOWY4NS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMjY4ICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jIFRPRE8ocm9iaW5zb24pOiBXZSBzaG91bGQganVzdCBtYWtlIHRoZXNlIG1ldGhvZHMgYWxsICJwdXJlLXZpcnR1YWwiIGFuZCBtb3ZlCi0jIGFsbCBpbXBsZW1lbnRhdGlvbiBvdXQsIGludG8gcmVmbGVjdGlvbi5weSBmb3Igbm93LgotCi0KLSIiIkNvbnRhaW5zIGFuIGFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2VzLiIiIgotCi1fX2F1dGhvcl9fID0gJ3JvYmluc29uQGdvb2dsZS5jb20gKFdpbGwgUm9iaW5zb24pJwotCi0KLWNsYXNzIEVycm9yKEV4Y2VwdGlvbik6IHBhc3MKLWNsYXNzIERlY29kZUVycm9yKEVycm9yKTogcGFzcwotY2xhc3MgRW5jb2RlRXJyb3IoRXJyb3IpOiBwYXNzCi0KLQotY2xhc3MgTWVzc2FnZShvYmplY3QpOgotCi0gICIiIkFic3RyYWN0IGJhc2UgY2xhc3MgZm9yIHByb3RvY29sIG1lc3NhZ2VzLgotCi0gIFByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyBhcmUgYWxtb3N0IGFsd2F5cyBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sCi0gIGNvbXBpbGVyLiAgVGhlc2UgZ2VuZXJhdGVkIHR5cGVzIHN1YmNsYXNzIE1lc3NhZ2UgYW5kIGltcGxlbWVudCB0aGUgbWV0aG9kcwotICBzaG93biBiZWxvdy4KLQotICBUT0RPKHJvYmluc29uKTogTGluayB0byBhbiBIVE1MIGRvY3VtZW50IGhlcmUuCi0KLSAgVE9ETyhyb2JpbnNvbik6IERvY3VtZW50IHRoYXQgaW5zdGFuY2VzIG9mIHRoaXMgY2xhc3Mgd2lsbCBhbHNvCi0gIGhhdmUgYW4gRXh0ZW5zaW9ucyBhdHRyaWJ1dGUgd2l0aCBfX2dldGl0ZW1fXyBhbmQgX19zZXRpdGVtX18uCi0gIEFnYWluLCBub3Qgc3VyZSBob3cgdG8gYmVzdCBjb252ZXkgdGhpcy4KLQotICBUT0RPKHJvYmluc29uKTogRG9jdW1lbnQgdGhhdCB0aGUgY2xhc3MgbXVzdCBhbHNvIGhhdmUgYSBzdGF0aWMKLSAgICBSZWdpc3RlckV4dGVuc2lvbihleHRlbnNpb25fZmllbGQpIG1ldGhvZC4KLSAgICBOb3Qgc3VyZSBob3cgdG8gYmVzdCBleHByZXNzIGF0IHRoaXMgcG9pbnQuCi0gICIiIgotCi0gICMgVE9ETyhyb2JpbnNvbik6IERvY3VtZW50IHRoZXNlIGZpZWxkcyBhbmQgbWV0aG9kcy4KLQotICBfX3Nsb3RzX18gPSBbXQotCi0gIERFU0NSSVBUT1IgPSBOb25lCi0KLSAgZGVmIF9fZGVlcGNvcHlfXyhzZWxmLCBtZW1vPU5vbmUpOgotICAgIGNsb25lID0gdHlwZShzZWxmKSgpCi0gICAgY2xvbmUuTWVyZ2VGcm9tKHNlbGYpCi0gICAgcmV0dXJuIGNsb25lCi0KLSAgZGVmIF9fZXFfXyhzZWxmLCBvdGhlcl9tc2cpOgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgX19uZV9fKHNlbGYsIG90aGVyX21zZyk6Ci0gICAgIyBDYW4ndCBqdXN0IHNheSBzZWxmICE9IG90aGVyX21zZywgc2luY2UgdGhhdCB3b3VsZCBpbmZpbml0ZWx5IHJlY3Vyc2UuIDopCi0gICAgcmV0dXJuIG5vdCBzZWxmID09IG90aGVyX21zZwotCi0gIGRlZiBfX2hhc2hfXyhzZWxmKToKLSAgICByYWlzZSBUeXBlRXJyb3IoJ3VuaGFzaGFibGUgb2JqZWN0JykKLQotICBkZWYgX19zdHJfXyhzZWxmKToKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIF9fdW5pY29kZV9fKHNlbGYpOgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgTWVyZ2VGcm9tKHNlbGYsIG90aGVyX21zZyk6Ci0gICAgIiIiTWVyZ2VzIHRoZSBjb250ZW50cyBvZiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2UgaW50byBjdXJyZW50IG1lc3NhZ2UuCi0KLSAgICBUaGlzIG1ldGhvZCBtZXJnZXMgdGhlIGNvbnRlbnRzIG9mIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSBpbnRvIHRoZSBjdXJyZW50Ci0gICAgbWVzc2FnZS4gU2luZ3VsYXIgZmllbGRzIHRoYXQgYXJlIHNldCBpbiB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugb3ZlcndyaXRlCi0gICAgdGhlIGNvcnJlc3BvbmRpbmcgZmllbGRzIGluIHRoZSBjdXJyZW50IG1lc3NhZ2UuIFJlcGVhdGVkIGZpZWxkcyBhcmUKLSAgICBhcHBlbmRlZC4gU2luZ3VsYXIgc3ViLW1lc3NhZ2VzIGFuZCBncm91cHMgYXJlIHJlY3Vyc2l2ZWx5IG1lcmdlZC4KLQotICAgIEFyZ3M6Ci0gICAgICBvdGhlcl9tc2c6IE1lc3NhZ2UgdG8gbWVyZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgQ29weUZyb20oc2VsZiwgb3RoZXJfbXNnKToKLSAgICAiIiJDb3BpZXMgdGhlIGNvbnRlbnQgb2YgdGhlIHNwZWNpZmllZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4KLQotICAgIFRoZSBtZXRob2QgY2xlYXJzIHRoZSBjdXJyZW50IG1lc3NhZ2UgYW5kIHRoZW4gbWVyZ2VzIHRoZSBzcGVjaWZpZWQKLSAgICBtZXNzYWdlIHVzaW5nIE1lcmdlRnJvbS4KLQotICAgIEFyZ3M6Ci0gICAgICBvdGhlcl9tc2c6IE1lc3NhZ2UgdG8gY29weSBpbnRvIHRoZSBjdXJyZW50IG9uZS4KLSAgICAiIiIKLSAgICBpZiBzZWxmIGlzIG90aGVyX21zZzoKLSAgICAgIHJldHVybgotICAgIHNlbGYuQ2xlYXIoKQotICAgIHNlbGYuTWVyZ2VGcm9tKG90aGVyX21zZykKLQotICBkZWYgQ2xlYXIoc2VsZik6Ci0gICAgIiIiQ2xlYXJzIGFsbCBkYXRhIHRoYXQgd2FzIHNldCBpbiB0aGUgbWVzc2FnZS4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIFNldEluUGFyZW50KHNlbGYpOgotICAgICIiIk1hcmsgdGhpcyBhcyBwcmVzZW50IGluIHRoZSBwYXJlbnQuCi0KLSAgICBUaGlzIG5vcm1hbGx5IGhhcHBlbnMgYXV0b21hdGljYWxseSB3aGVuIHlvdSBhc3NpZ24gYSBmaWVsZCBvZiBhCi0gICAgc3ViLW1lc3NhZ2UsIGJ1dCBzb21ldGltZXMgeW91IHdhbnQgdG8gbWFrZSB0aGUgc3ViLW1lc3NhZ2UKLSAgICBwcmVzZW50IHdoaWxlIGtlZXBpbmcgaXQgZW1wdHkuICBJZiB5b3UgZmluZCB5b3Vyc2VsZiB1c2luZyB0aGlzLAotICAgIHlvdSBtYXkgd2FudCB0byByZWNvbnNpZGVyIHlvdXIgZGVzaWduLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgSXNJbml0aWFsaXplZChzZWxmKToKLSAgICAiIiJDaGVja3MgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIG1ldGhvZCByZXR1cm5zIFRydWUgaWYgdGhlIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQgKGkuZS4gYWxsIG9mIGl0cwotICAgICAgcmVxdWlyZWQgZmllbGRzIGFyZSBzZXQpLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICAjIFRPRE8ocm9iaW5zb24pOiBNZXJnZUZyb21TdHJpbmcoKSBzaG91bGQgcHJvYmFibHkgcmV0dXJuIE5vbmUgYW5kIGJlCi0gICMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgYSBoZWxwZXIgdGhhdCByZXR1cm5zIHRoZSAjIG9mIGJ5dGVzIHJlYWQuICBPdXIKLSAgIyBkZXNlcmlhbGl6YXRpb24gcm91dGluZXMgd291bGQgdXNlIHRoZSBoZWxwZXIgd2hlbiByZWN1cnNpdmVseQotICAjIGRlc2VyaWFsaXppbmcsIGJ1dCB0aGUgZW5kIHVzZXIgd291bGQgYWxtb3N0IGFsd2F5cyBqdXN0IHdhbnQgdGhlIG5vLXJldHVybgotICAjIE1lcmdlRnJvbVN0cmluZygpLgotCi0gIGRlZiBNZXJnZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6Ci0gICAgIiIiTWVyZ2VzIHNlcmlhbGl6ZWQgcHJvdG9jb2wgYnVmZmVyIGRhdGEgaW50byB0aGlzIG1lc3NhZ2UuCi0KLSAgICBXaGVuIHdlIGZpbmQgYSBmaWVsZCBpbiB8c2VyaWFsaXplZHwgdGhhdCBpcyBhbHJlYWR5IHByZXNlbnQKLSAgICBpbiB0aGlzIG1lc3NhZ2U6Ci0gICAgICAtIElmIGl0J3MgYSAicmVwZWF0ZWQiIGZpZWxkLCB3ZSBhcHBlbmQgdG8gdGhlIGVuZCBvZiBvdXIgbGlzdC4KLSAgICAgIC0gRWxzZSwgaWYgaXQncyBhIHNjYWxhciwgd2Ugb3ZlcndyaXRlIG91ciBmaWVsZC4KLSAgICAgIC0gRWxzZSwgKGl0J3MgYSBub25yZXBlYXRlZCBjb21wb3NpdGUpLCB3ZSByZWN1cnNpdmVseSBtZXJnZQotICAgICAgICBpbnRvIHRoZSBleGlzdGluZyBjb21wb3NpdGUuCi0KLSAgICBUT0RPKHJvYmluc29uKTogRG9jdW1lbnQgaGFuZGxpbmcgb2YgdW5rbm93biBmaWVsZHMuCi0KLSAgICBBcmdzOgotICAgICAgc2VyaWFsaXplZDogQW55IG9iamVjdCB0aGF0IGFsbG93cyB1cyB0byBjYWxsIGJ1ZmZlcihzZXJpYWxpemVkKQotICAgICAgICB0byBhY2Nlc3MgYSBzdHJpbmcgb2YgYnl0ZXMgdXNpbmcgdGhlIGJ1ZmZlciBpbnRlcmZhY2UuCi0KLSAgICBUT0RPKHJvYmluc29uKTogV2hlbiB3ZSBzd2l0Y2ggdG8gYSBoZWxwZXIsIHRoaXMgd2lsbCByZXR1cm4gTm9uZS4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgZnJvbSB8c2VyaWFsaXplZHwuCi0gICAgICBGb3Igbm9uLWdyb3VwIG1lc3NhZ2VzLCB0aGlzIHdpbGwgYWx3YXlzIGJlIGxlbihzZXJpYWxpemVkKSwKLSAgICAgIGJ1dCBmb3IgbWVzc2FnZXMgd2hpY2ggYXJlIGFjdHVhbGx5IGdyb3VwcywgdGhpcyB3aWxsCi0gICAgICBnZW5lcmFsbHkgYmUgbGVzcyB0aGFuIGxlbihzZXJpYWxpemVkKSwgc2luY2Ugd2UgbXVzdAotICAgICAgc3RvcCB3aGVuIHdlIHJlYWNoIGFuIEVORF9HUk9VUCB0YWcuICBOb3RlIHRoYXQgaWYKLSAgICAgIHdlICpkbyogc3RvcCBiZWNhdXNlIG9mIGFuIEVORF9HUk9VUCB0YWcsIHRoZSBudW1iZXIKLSAgICAgIG9mIGJ5dGVzIHJldHVybmVkIGRvZXMgbm90IGluY2x1ZGUgdGhlIGJ5dGVzCi0gICAgICBmb3IgdGhlIEVORF9HUk9VUCB0YWcgaW5mb3JtYXRpb24uCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBQYXJzZUZyb21TdHJpbmcoc2VsZiwgc2VyaWFsaXplZCk6Ci0gICAgIiIiTGlrZSBNZXJnZUZyb21TdHJpbmcoKSwgZXhjZXB0IHdlIGNsZWFyIHRoZSBvYmplY3QgZmlyc3QuIiIiCi0gICAgc2VsZi5DbGVhcigpCi0gICAgc2VsZi5NZXJnZUZyb21TdHJpbmcoc2VyaWFsaXplZCkKLQotICBkZWYgU2VyaWFsaXplVG9TdHJpbmcoc2VsZik6Ci0gICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBiaW5hcnkgc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBtZXNzYWdlIGlmIGFsbCBvZiB0aGUgcmVxdWlyZWQKLSAgICAgIGZpZWxkcyBpbiB0aGUgbWVzc2FnZSBhcmUgc2V0IChpLmUuIHRoZSBtZXNzYWdlIGlzIGluaXRpYWxpemVkKS4KLQotICAgIFJhaXNlczoKLSAgICAgIG1lc3NhZ2UuRW5jb2RlRXJyb3IgaWYgdGhlIG1lc3NhZ2UgaXNuJ3QgaW5pdGlhbGl6ZWQuCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoc2VsZik6Ci0gICAgIiIiU2VyaWFsaXplcyB0aGUgcHJvdG9jb2wgbWVzc2FnZSB0byBhIGJpbmFyeSBzdHJpbmcuCi0KLSAgICBUaGlzIG1ldGhvZCBpcyBzaW1pbGFyIHRvIFNlcmlhbGl6ZVRvU3RyaW5nIGJ1dCBkb2Vzbid0IGNoZWNrIGlmIHRoZQotICAgIG1lc3NhZ2UgaXMgaW5pdGlhbGl6ZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgdGhlIHBhcnRpYWwgbWVzc2FnZS4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgIyBUT0RPKHJvYmluc29uKTogRGVjaWRlIHdoZXRoZXIgd2UgbGlrZSB0aGVzZSBiZXR0ZXIKLSAgIyB0aGFuIGF1dG8tZ2VuZXJhdGVkIGhhc19mb28oKSBhbmQgY2xlYXJfZm9vKCkgbWV0aG9kcwotICAjIG9uIHRoZSBpbnN0YW5jZXMgdGhlbXNlbHZlcy4gIFRoaXMgd2F5IGlzIGxlc3MgY29uc2lzdGVudAotICAjIHdpdGggQysrLCBidXQgaXQgbWFrZXMgcmVmbGVjdGlvbi10eXBlIGFjY2VzcyBlYXNpZXIgYW5kCi0gICMgcmVkdWNlcyB0aGUgbnVtYmVyIG9mIG1hZ2ljYWxseSBhdXRvZ2VuZXJhdGVkIHRoaW5ncy4KLSAgIwotICAjIFRPRE8ocm9iaW5zb24pOiBCZSBzdXJlIHRvIGRvY3VtZW50IChhbmQgdGVzdCkgZXhhY3RseQotICAjIHdoaWNoIGZpZWxkIG5hbWVzIGFyZSBhY2NlcHRlZCBoZXJlLiAgQXJlIHdlIGNhc2Utc2Vuc2l0aXZlPwotICAjIFdoYXQgZG8gd2UgZG8gd2l0aCBmaWVsZHMgdGhhdCBzaGFyZSBuYW1lcyB3aXRoIFB5dGhvbiBrZXl3b3JkcwotICAjIGxpa2UgJ2xhbWJkYScgYW5kICd5aWVsZCc/Ci0gICMKLSAgIyBubm9yd2l0eiBzYXlzOgotICAjICIiIgotICAjIFR5cGljYWxseSAoaW4gcHl0aG9uKSwgYW4gdW5kZXJzY29yZSBpcyBhcHBlbmRlZCB0byBuYW1lcyB0aGF0IGFyZQotICAjIGtleXdvcmRzLiBTbyB0aGV5IHdvdWxkIGJlY29tZSBsYW1iZGFfIG9yIHlpZWxkXy4KLSAgIyAiIiIKLSAgZGVmIExpc3RGaWVsZHMoc2VsZik6Ci0gICAgIiIiUmV0dXJucyBhIGxpc3Qgb2YgKEZpZWxkRGVzY3JpcHRvciwgdmFsdWUpIHR1cGxlcyBmb3IgYWxsCi0gICAgZmllbGRzIGluIHRoZSBtZXNzYWdlIHdoaWNoIGFyZSBub3QgZW1wdHkuICBBIHNpbmd1bGFyIGZpZWxkIGlzIG5vbi1lbXB0eQotICAgIGlmIEhhc0ZpZWxkKCkgd291bGQgcmV0dXJuIHRydWUsIGFuZCBhIHJlcGVhdGVkIGZpZWxkIGlzIG5vbi1lbXB0eSBpZgotICAgIGl0IGNvbnRhaW5zIGF0IGxlYXN0IG9uZSBlbGVtZW50LiAgVGhlIGZpZWxkcyBhcmUgb3JkZXJlZCBieSBmaWVsZAotICAgIG51bWJlciIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgSGFzRmllbGQoc2VsZiwgZmllbGRfbmFtZSk6Ci0gICAgIiIiQ2hlY2tzIGlmIGEgY2VydGFpbiBmaWVsZCBpcyBzZXQgZm9yIHRoZSBtZXNzYWdlLiBOb3RlIGlmIHRoZQotICAgIGZpZWxkX25hbWUgaXMgbm90IGRlZmluZWQgaW4gdGhlIG1lc3NhZ2UgZGVzY3JpcHRvciwgVmFsdWVFcnJvciB3aWxsIGJlCi0gICAgcmFpc2VkLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgQ2xlYXJGaWVsZChzZWxmLCBmaWVsZF9uYW1lKToKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIEhhc0V4dGVuc2lvbihzZWxmLCBleHRlbnNpb25faGFuZGxlKToKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIENsZWFyRXh0ZW5zaW9uKHNlbGYsIGV4dGVuc2lvbl9oYW5kbGUpOgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgQnl0ZVNpemUoc2VsZik6Ci0gICAgIiIiUmV0dXJucyB0aGUgc2VyaWFsaXplZCBzaXplIG9mIHRoaXMgbWVzc2FnZS4KLSAgICBSZWN1cnNpdmVseSBjYWxscyBCeXRlU2l6ZSgpIG9uIGFsbCBjb250YWluZWQgbWVzc2FnZXMuCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBfU2V0TGlzdGVuZXIoc2VsZiwgbWVzc2FnZV9saXN0ZW5lcik6Ci0gICAgIiIiSW50ZXJuYWwgbWV0aG9kIHVzZWQgYnkgdGhlIHByb3RvY29sIG1lc3NhZ2UgaW1wbGVtZW50YXRpb24uCi0gICAgQ2xpZW50cyBzaG91bGQgbm90IGNhbGwgdGhpcyBkaXJlY3RseS4KLQotICAgIFNldHMgYSBsaXN0ZW5lciB0aGF0IHRoaXMgbWVzc2FnZSB3aWxsIGNhbGwgb24gY2VydGFpbiBzdGF0ZSB0cmFuc2l0aW9ucy4KLQotICAgIFRoZSBwdXJwb3NlIG9mIHRoaXMgbWV0aG9kIGlzIHRvIHJlZ2lzdGVyIGJhY2stZWRnZXMgZnJvbSBjaGlsZHJlbiB0bwotICAgIHBhcmVudHMgYXQgcnVudGltZSwgZm9yIHRoZSBwdXJwb3NlIG9mIHNldHRpbmcgImhhcyIgYml0cyBhbmQKLSAgICBieXRlLXNpemUtZGlydHkgYml0cyBpbiB0aGUgcGFyZW50IGFuZCBhbmNlc3RvciBvYmplY3RzIHdoZW5ldmVyIGEgY2hpbGQgb3IKLSAgICBkZXNjZW5kYW50IG9iamVjdCBpcyBtb2RpZmllZC4KLQotICAgIElmIHRoZSBjbGllbnQgd2FudHMgdG8gZGlzY29ubmVjdCB0aGlzIE1lc3NhZ2UgZnJvbSB0aGUgb2JqZWN0IHRyZWUsIHNoZQotICAgIGV4cGxpY2l0bHkgc2V0cyBjYWxsYmFjayB0byBOb25lLgotCi0gICAgSWYgbWVzc2FnZV9saXN0ZW5lciBpcyBOb25lLCB1bnJlZ2lzdGVycyBhbnkgZXhpc3RpbmcgbGlzdGVuZXIuICBPdGhlcndpc2UsCi0gICAgbWVzc2FnZV9saXN0ZW5lciBtdXN0IGltcGxlbWVudCB0aGUgTWVzc2FnZUxpc3RlbmVyIGludGVyZmFjZSBpbgotICAgIGludGVybmFsL21lc3NhZ2VfbGlzdGVuZXIucHksIGFuZCB3ZSBkaXNjYXJkIGFueSBsaXN0ZW5lciByZWdpc3RlcmVkCi0gICAgdmlhIGEgcHJldmlvdXMgX1NldExpc3RlbmVyKCkgY2FsbC4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24tcHJvdG8yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uLXByb3RvMi5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMTgxZDdlOS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob24tcHJvdG8yLmNjCisrKyAvZGV2L251bGwKQEAgLTEsMTY2MCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHBldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdikKLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotI2luY2x1ZGUgPG1hcD4KLSNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8dmVjdG9yPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fcHJvdG9idWYuaD4KLQotLyogSXMgNjRiaXQgKi8KLSNkZWZpbmUgSVNfNjRCSVQgKFNJWkVPRl9MT05HID09IDgpCi0KLSNkZWZpbmUgRklFTERfQkVMT05HU19UT19NRVNTQUdFKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpIFwKLSAgICAoKG1lc3NhZ2UpLT5HZXREZXNjcmlwdG9yKCkgPT0gKGZpZWxkX2Rlc2NyaXB0b3IpLT5jb250YWluaW5nX3R5cGUoKSkKLQotI2RlZmluZSBGSUVMRF9JU19SRVBFQVRFRChmaWVsZF9kZXNjcmlwdG9yKSAgICAgICAgICAgICAgICAgXAotICAgICgoZmllbGRfZGVzY3JpcHRvciktPmxhYmVsKCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCkKLQotI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpbnQzMiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSwga2ludDMybWluX3B5LCBraW50MzJtYXhfcHkpKSB7IFwKLSAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9JTlQ2NChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaW50NjQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFDaGVja0FuZEdldEludGVnZXIoYXJnLCAmdmFsdWUsIGtpbnQ2NG1pbl9weSwga2ludDY0bWF4X3B5KSkgeyBcCi0gICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0jZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfVUlOVDMyKGFyZywgdmFsdWUpICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIHVpbnQzMiB2YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghQ2hlY2tBbmRHZXRJbnRlZ2VyKGFyZywgJnZhbHVlLCBrUHl0aG9uWmVybywga3VpbnQzMm1heF9weSkpIHsgXAotICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB1aW50NjQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICBpZiAoIUNoZWNrQW5kR2V0SW50ZWdlcihhcmcsICZ2YWx1ZSwga1B5dGhvblplcm8sIGt1aW50NjRtYXhfcHkpKSB7IFwKLSAgICAgIHJldHVybiBOVUxMOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICB9Ci0KLSNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9GTE9BVChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZmxvYXQgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFDaGVja0FuZEdldEZsb2F0KGFyZywgJnZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0KLSNkZWZpbmUgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSkgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgZG91YmxlIHZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgaWYgKCFDaGVja0FuZEdldERvdWJsZShhcmcsICZ2YWx1ZSkpIHsgICAgICAgICAgICAgICAgICBcCi0gICAgICByZXR1cm4gTlVMTDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgfQotCi0jZGVmaW5lIEdPT0dMRV9DSEVDS19HRVRfQk9PTChhcmcsIHZhbHVlKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGJvb2wgdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGlmICghQ2hlY2tBbmRHZXRCb29sKGFyZywgJnZhbHVlKSkgeyAgICAgICAgICAgICAgICAgICAgXAotICAgICAgcmV0dXJuIE5VTEw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIH0KLQotI2RlZmluZSBDKHN0cikgY29uc3RfY2FzdDxjaGFyKj4oc3RyKQotCi0vLyAtLS0gR2xvYmFsczoKLQotLy8gQ29uc3RhbnRzIHVzZWQgZm9yIGludGVnZXIgdHlwZSByYW5nZSBjaGVja2luZy4KLXN0YXRpYyBQeU9iamVjdCoga1B5dGhvblplcm87Ci1zdGF0aWMgUHlPYmplY3QqIGtpbnQzMm1pbl9weTsKLXN0YXRpYyBQeU9iamVjdCoga2ludDMybWF4X3B5Owotc3RhdGljIFB5T2JqZWN0KiBrdWludDMybWF4X3B5Owotc3RhdGljIFB5T2JqZWN0KiBraW50NjRtaW5fcHk7Ci1zdGF0aWMgUHlPYmplY3QqIGtpbnQ2NG1heF9weTsKLXN0YXRpYyBQeU9iamVjdCoga3VpbnQ2NG1heF9weTsKLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLS8vIC0tLSBTdXBwb3J0IFJvdXRpbmVzOgotCi1zdGF0aWMgdm9pZCBBZGRDb25zdGFudHMoUHlPYmplY3QqIG1vZHVsZSkgewotICBzdHJ1Y3QgTmFtZVZhbHVlIHsKLSAgICBjaGFyKiBuYW1lOwotICAgIGludDMyIHZhbHVlOwotICB9IGNvbnN0YW50c1tdID0gewotICAgIC8vIExhYmVsczoKLSAgICB7IkxBQkVMX09QVElPTkFMIiwgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpMQUJFTF9PUFRJT05BTH0sCi0gICAgeyJMQUJFTF9SRVFVSVJFRCIsIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVRVUlSRUR9LAotICAgIHsiTEFCRUxfUkVQRUFURUQiLCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEfSwKLSAgICAvLyBDUFAgdHlwZXM6Ci0gICAgeyJDUFBUWVBFX01FU1NBR0UiLCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRX0sCi0gICAgLy8gRmllbGQgVHlwZXM6Ci0gICAgeyJUWVBFX01FU1NBR0UiLCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRX0sCi0gICAgLy8gRW5kLgotICAgIHtOVUxMLCAwfQotICB9OwotCi0gIGZvciAoTmFtZVZhbHVlKiBjb25zdGFudCA9IGNvbnN0YW50czsKLSAgICAgICBjb25zdGFudC0+bmFtZSAhPSBOVUxMOyBjb25zdGFudCsrKSB7Ci0gICAgUHlNb2R1bGVfQWRkSW50Q29uc3RhbnQobW9kdWxlLCBjb25zdGFudC0+bmFtZSwgY29uc3RhbnQtPnZhbHVlKTsKLSAgfQotfQotCi0vLyAtLS0gQ01lc3NhZ2UgQ3VzdG9tIFR5cGU6Ci0KLS8vIC0tLS0tLSBUeXBlIEZvcndhcmQgRGVjbGFyYXRpb246Ci0KLXN0cnVjdCBDTWVzc2FnZTsKLXN0cnVjdCBDTWVzc2FnZV9UeXBlOwotCi1zdGF0aWMgdm9pZCBDTWVzc2FnZURlYWxsb2MoQ01lc3NhZ2UqIHNlbGYpOwotc3RhdGljIGludCBDTWVzc2FnZUluaXQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlU3RyKENNZXNzYWdlKiBzZWxmKTsKLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9BZGRNZXNzYWdlKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZFJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0Fzc2lnblJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0J5dGVTaXplKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ2xlYXJGaWVsZEJ5RGVzY3JpcHRvcigKLSAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Db3B5RnJvbShDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9EZWJ1Z1N0cmluZyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9EZWxldGVSZXBlYXRlZEZpZWxkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0VxdWFscyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9GaWVsZExlbmd0aChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoQ01lc3NhZ2UqIHNlbGYpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRSZXBlYXRlZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfR2V0UmVwZWF0ZWRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfR2V0U2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0hhc0ZpZWxkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0hhc0ZpZWxkQnlEZXNjcmlwdG9yKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0lzSW5pdGlhbGl6ZWQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTGlzdEZpZWxkcyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9NZXJnZUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTWVyZ2VGcm9tU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX011dGFibGVNZXNzYWdlKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX05ld1N1Yk1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKTsKLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU2V0U2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NlcmlhbGl6ZVBhcnRpYWxUb1N0cmluZygKLSAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9TZXJpYWxpemVUb1N0cmluZyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9TZXRJblBhcmVudChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpOwotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Td2FwUmVwZWF0ZWRGaWVsZEVsZW1lbnRzKAotICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncyk7Ci0KLS8vIC0tLS0tLSBPYmplY3QgRGVmaW5pdGlvbjoKLQotdHlwZWRlZiBzdHJ1Y3QgQ01lc3NhZ2UgewotICBQeU9iamVjdF9IRUFECi0KLSAgc3RydWN0IENNZXNzYWdlKiBwYXJlbnQ7ICAvLyBOVUxMIGlmIHdhc24ndCBjcmVhdGVkIGZyb20gYW5vdGhlciBtZXNzYWdlLgotICBDRmllbGREZXNjcmlwdG9yKiBwYXJlbnRfZmllbGQ7Ci0gIGNvbnN0IGNoYXIqIGZ1bGxfbmFtZTsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZTsKLSAgYm9vbCBmcmVlX21lc3NhZ2U7Ci0gIGJvb2wgcmVhZF9vbmx5OwotfSBDTWVzc2FnZTsKLQotLy8gLS0tLS0tIE1ldGhvZCBUYWJsZToKLQotI2RlZmluZSBDTUVUSE9EKG5hbWUsIGFyZ3MsIGRvYykgICBcCi0gIHsgQygjbmFtZSksIChQeUNGdW5jdGlvbilDTWVzc2FnZV8jI25hbWUsIGFyZ3MsIEMoZG9jKSB9Ci1zdGF0aWMgUHlNZXRob2REZWYgQ01lc3NhZ2VNZXRob2RzW10gPSB7Ci0gIENNRVRIT0QoQWRkTWVzc2FnZSwgTUVUSF9PLAotICAgICAgICAgICJBZGRzIGEgbmV3IG1lc3NhZ2UgdG8gYSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiksCi0gIENNRVRIT0QoQWRkUmVwZWF0ZWRTY2FsYXIsIE1FVEhfVkFSQVJHUywKLSAgICAgICAgICAiQWRkcyBhIHNjYWxhciB0byBhIHJlcGVhdGVkIHNjYWxhciBmaWVsZC4iKSwKLSAgQ01FVEhPRChBc3NpZ25SZXBlYXRlZFNjYWxhciwgTUVUSF9WQVJBUkdTLAotICAgICAgICAgICJDbGVhcnMgYW5kIHNldHMgdGhlIHZhbHVlcyBvZiBhIHJlcGVhdGVkIHNjYWxhciBmaWVsZC4iKSwKLSAgQ01FVEhPRChCeXRlU2l6ZSwgTUVUSF9OT0FSR1MsCi0gICAgICAgICAgIlJldHVybnMgdGhlIHNpemUgb2YgdGhlIG1lc3NhZ2UgaW4gYnl0ZXMuIiksCi0gIENNRVRIT0QoQ2xlYXIsIE1FVEhfTk9BUkdTLAotICAgICAgICAgICJDbGVhcnMgYSBwcm90b2NvbCBtZXNzYWdlLiIpLAotICBDTUVUSE9EKENsZWFyRmllbGQsIE1FVEhfTywKLSAgICAgICAgICAiQ2xlYXJzIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBieSBuYW1lLiIpLAotICBDTUVUSE9EKENsZWFyRmllbGRCeURlc2NyaXB0b3IsIE1FVEhfTywKLSAgICAgICAgICAiQ2xlYXJzIGEgcHJvdG9jb2wgbWVzc2FnZSBmaWVsZCBieSBkZXNjcmlwdG9yLiIpLAotICBDTUVUSE9EKENvcHlGcm9tLCBNRVRIX08sCi0gICAgICAgICAgIkNvcGllcyBhIHByb3RvY29sIG1lc3NhZ2UgaW50byB0aGUgY3VycmVudCBtZXNzYWdlLiIpLAotICBDTUVUSE9EKERlYnVnU3RyaW5nLCBNRVRIX05PQVJHUywKLSAgICAgICAgICAiUmV0dXJucyB0aGUgZGVidWcgc3RyaW5nIG9mIGEgcHJvdG9jb2wgbWVzc2FnZS4iKSwKLSAgQ01FVEhPRChEZWxldGVSZXBlYXRlZEZpZWxkLCBNRVRIX1ZBUkFSR1MsCi0gICAgICAgICAgIkRlbGV0ZXMgYSBzbGljZSBvZiB2YWx1ZXMgZnJvbSBhIHJlcGVhdGVkIGZpZWxkLiIpLAotICBDTUVUSE9EKEVxdWFscywgTUVUSF9PLAotICAgICAgICAgICJDaGVja3MgaWYgdHdvIHByb3RvY29sIG1lc3NhZ2VzIGFyZSBlcXVhbCAoYnkgaWRlbnRpdHkpLiIpLAotICBDTUVUSE9EKEZpZWxkTGVuZ3RoLCBNRVRIX08sCi0gICAgICAgICAgIlJldHVybnMgdGhlIG51bWJlciBvZiBlbGVtZW50cyBpbiBhIHJlcGVhdGVkIGZpZWxkLiIpLAotICBDTUVUSE9EKEZpbmRJbml0aWFsaXphdGlvbkVycm9ycywgTUVUSF9OT0FSR1MsCi0gICAgICAgICAgIlJldHVybnMgdGhlIGluaXRpYWxpemF0aW9uIGVycm9ycyBvZiBhIG1lc3NhZ2UuIiksCi0gIENNRVRIT0QoR2V0UmVwZWF0ZWRNZXNzYWdlLCBNRVRIX1ZBUkFSR1MsCi0gICAgICAgICAgIlJldHVybnMgYSBtZXNzYWdlIGZyb20gYSByZXBlYXRlZCBjb21wb3NpdGUgZmllbGQuIiksCi0gIENNRVRIT0QoR2V0UmVwZWF0ZWRTY2FsYXIsIE1FVEhfVkFSQVJHUywKLSAgICAgICAgICAiUmV0dXJucyBhIHNjYWxhciB2YWx1ZSBmcm9tIGEgcmVwZWF0ZWQgc2NhbGFyIGZpZWxkLiIpLAotICBDTUVUSE9EKEdldFNjYWxhciwgTUVUSF9PLAotICAgICAgICAgICJSZXR1cm5zIHRoZSBzY2FsYXIgdmFsdWUgb2YgYSBmaWVsZC4iKSwKLSAgQ01FVEhPRChIYXNGaWVsZCwgTUVUSF9PLAotICAgICAgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldC4iKSwKLSAgQ01FVEhPRChIYXNGaWVsZEJ5RGVzY3JpcHRvciwgTUVUSF9PLAotICAgICAgICAgICJDaGVja3MgaWYgYSBtZXNzYWdlIGZpZWxkIGlzIHNldCBieSBnaXZlbiBpdHMgZGVzY3JpcHRvciIpLAotICBDTUVUSE9EKElzSW5pdGlhbGl6ZWQsIE1FVEhfTk9BUkdTLAotICAgICAgICAgICJDaGVja3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBvZiBhIHByb3RvY29sIG1lc3NhZ2UgYXJlIHNldC4iKSwKLSAgQ01FVEhPRChMaXN0RmllbGRzLCBNRVRIX05PQVJHUywKLSAgICAgICAgICAiTGlzdHMgYWxsIHNldCBmaWVsZHMgb2YgYSBtZXNzYWdlLiIpLAotICBDTUVUSE9EKE1lcmdlRnJvbSwgTUVUSF9PLAotICAgICAgICAgICJNZXJnZXMgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iKSwKLSAgQ01FVEhPRChNZXJnZUZyb21TdHJpbmcsIE1FVEhfTywKLSAgICAgICAgICAiTWVyZ2VzIGEgc2VyaWFsaXplZCBtZXNzYWdlIGludG8gdGhlIGN1cnJlbnQgbWVzc2FnZS4iKSwKLSAgQ01FVEhPRChNdXRhYmxlTWVzc2FnZSwgTUVUSF9PLAotICAgICAgICAgICJSZXR1cm5zIGEgbmV3IGluc3RhbmNlIG9mIGEgbmVzdGVkIHByb3RvY29sIG1lc3NhZ2UuIiksCi0gIENNRVRIT0QoTmV3U3ViTWVzc2FnZSwgTUVUSF9PLAotICAgICAgICAgICJDcmVhdGVzIGFuZCByZXR1cm5zIGEgcHl0aG9uIG1lc3NhZ2UgZ2l2ZW4gdGhlIGRlc2NyaXB0b3Igb2YgYSAiCi0gICAgICAgICAgImNvbXBvc2l0ZSBmaWVsZCBvZiB0aGUgY3VycmVudCBtZXNzYWdlLiIpLAotICBDTUVUSE9EKFNldFNjYWxhciwgTUVUSF9WQVJBUkdTLAotICAgICAgICAgICJTZXRzIHRoZSB2YWx1ZSBvZiBhIHNpbmd1bGFyIHNjYWxhciBmaWVsZC4iKSwKLSAgQ01FVEhPRChTZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcsIE1FVEhfVkFSQVJHUywKLSAgICAgICAgICAiU2VyaWFsaXplcyB0aGUgbWVzc2FnZSB0byBhIHN0cmluZywgZXZlbiBpZiBpdCBpc24ndCBpbml0aWFsaXplZC4iKSwKLSAgQ01FVEhPRChTZXJpYWxpemVUb1N0cmluZywgTUVUSF9OT0FSR1MsCi0gICAgICAgICAgIlNlcmlhbGl6ZXMgdGhlIG1lc3NhZ2UgdG8gYSBzdHJpbmcsIG9ubHkgZm9yIGluaXRpYWxpemVkIG1lc3NhZ2VzLiIpLAotICBDTUVUSE9EKFNldEluUGFyZW50LCBNRVRIX05PQVJHUywKLSAgICAgICAgICAiU2V0cyB0aGUgaGFzIGJpdCBvZiB0aGUgZ2l2ZW4gZmllbGQgaW4gaXRzIHBhcmVudCBtZXNzYWdlLiIpLAotICBDTUVUSE9EKFN3YXBSZXBlYXRlZEZpZWxkRWxlbWVudHMsIE1FVEhfVkFSQVJHUywKLSAgICAgICAgICAiU3dhcHMgdGhlIGVsZW1lbnRzIGluIHR3byBwb3NpdGlvbnMgaW4gYSByZXBlYXRlZCBmaWVsZC4iKSwKLSAgeyBOVUxMLCBOVUxMIH0KLX07Ci0jdW5kZWYgQ01FVEhPRAotCi1zdGF0aWMgUHlNZW1iZXJEZWYgQ01lc3NhZ2VNZW1iZXJzW10gPSB7Ci0gIHsgQygiZnVsbF9uYW1lIiksIFRfU1RSSU5HLCBvZmZzZXRvZihDTWVzc2FnZSwgZnVsbF9uYW1lKSwgMCwgIkZ1bGwgbmFtZSIgfSwKLSAgeyBOVUxMIH0KLX07Ci0KLS8vIC0tLS0tLSBUeXBlIERlZmluaXRpb246Ci0KLS8vIFRoZSBkZWZpbml0aW9uIGZvciB0aGUgdHlwZSBvYmplY3QgdGhhdCBjYXB0dXJlcyB0aGUgdHlwZSBvZiBDTWVzc2FnZQotLy8gaW4gUHl0aG9uLgotUHlUeXBlT2JqZWN0IENNZXNzYWdlX1R5cGUgPSB7Ci0gIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0gIDAsCi0gIEMoImdvb2dsZTMubmV0Lmdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuIgotICAgICJfbmV0X3Byb3RvMl9fX3B5dGhvbi4iCi0gICAgIkNNZXNzYWdlIiksICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9uYW1lCi0gIHNpemVvZihDTWVzc2FnZSksICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzaWNzaXplCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaXRlbXNpemUKLSAgKGRlc3RydWN0b3IpQ01lc3NhZ2VEZWFsbG9jLCAgICAgICAgIC8vICB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcHJpbnQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9yZXByCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfc2VxdWVuY2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9hc19tYXBwaW5nCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NhbGwKLSAgKHJlcHJmdW5jKUNNZXNzYWdlU3RyLCAgICAgICAgICAgICAgIC8vICB0cF9zdHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX3NldGF0dHJvCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYXNfYnVmZmVyCi0gIFB5X1RQRkxBR1NfREVGQVVMVCwgICAgICAgICAgICAgICAgICAvLyAgdHBfZmxhZ3MKLSAgQygiQSBQcm90b2NvbE1lc3NhZ2UiKSwgICAgICAgICAgICAgIC8vICB0cF9kb2MKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF90cmF2ZXJzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfcmljaGNvbXBhcmUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF93ZWFrbGlzdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9pdGVybmV4dAotICBDTWVzc2FnZU1ldGhvZHMsICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX21ldGhvZHMKLSAgQ01lc3NhZ2VNZW1iZXJzLCAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9tZW1iZXJzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZ2V0c2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfYmFzZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gIHRwX2RpY3QKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9nZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kZXNjcl9zZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICB0cF9kaWN0b2Zmc2V0Ci0gIChpbml0cHJvYylDTWVzc2FnZUluaXQsICAgICAgICAgICAgICAvLyAgdHBfaW5pdAotICBQeVR5cGVfR2VuZXJpY0FsbG9jLCAgICAgICAgICAgICAgICAgLy8gIHRwX2FsbG9jCi0gIFB5VHlwZV9HZW5lcmljTmV3LCAgICAgICAgICAgICAgICAgICAvLyAgdHBfbmV3Ci0gIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyAgdHBfZnJlZQotfTsKLQotLy8gLS0tLS0tIEhlbHBlciBGdW5jdGlvbnM6Ci0KLXN0YXRpYyB2b2lkIEZvcm1hdFR5cGVFcnJvcihQeU9iamVjdCogYXJnLCBjaGFyKiBleHBlY3RlZF90eXBlcykgewotICBQeU9iamVjdCogcyA9IFB5T2JqZWN0X1N0cihQeU9iamVjdF9UeXBlKGFyZykpOwotICBQeU9iamVjdCogcmVwciA9IFB5T2JqZWN0X1JlcHIoUHlPYmplY3RfVHlwZShhcmcpKTsKLSAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICIlLjEwMHMgaGFzIHR5cGUgJS4xMDBzLCBidXQgZXhwZWN0ZWQgb25lIG9mOiAlcyIsCi0gICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocmVwciksCi0gICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocyksCi0gICAgICAgICAgICAgICBleHBlY3RlZF90eXBlcyk7Ci0gIFB5X0RFQ1JFRihzKTsKLSAgUHlfREVDUkVGKHJlcHIpOwotfQotCi10ZW1wbGF0ZSA8Y2xhc3MgVD4KLXN0YXRpYyBib29sIENoZWNrQW5kR2V0SW50ZWdlcigKLSAgICBQeU9iamVjdCogYXJnLCBUKiB2YWx1ZSwgUHlPYmplY3QqIG1pbiwgUHlPYmplY3QqIG1heCkgewotICBib29sIGlzX2xvbmcgPSBQeUxvbmdfQ2hlY2soYXJnKTsKLSAgaWYgKCFQeUludF9DaGVjayhhcmcpICYmICFpc19sb25nKSB7Ci0gICAgRm9ybWF0VHlwZUVycm9yKGFyZywgImludCwgbG9uZyIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIGlmIChQeU9iamVjdF9Db21wYXJlKG1pbiwgYXJnKSA+IDAgfHwgUHlPYmplY3RfQ29tcGFyZShtYXgsIGFyZykgPCAwKSB7Ci0gICAgUHlPYmplY3QqIHMgPSBQeU9iamVjdF9TdHIoYXJnKTsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwKLSAgICAgICAgICAgICAgICAgIlZhbHVlIG91dCBvZiByYW5nZTogJXMiLAotICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocykpOwotICAgIFB5X0RFQ1JFRihzKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgaWYgKGlzX2xvbmcpIHsKLSAgICBpZiAobWluID09IGtQeXRob25aZXJvKSB7Ci0gICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNVbnNpZ25lZExvbmdMb25nKGFyZykpOwotICAgIH0gZWxzZSB7Ci0gICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxUPihQeUxvbmdfQXNMb25nTG9uZyhhcmcpKTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8VD4oUHlJbnRfQXNMb25nKGFyZykpOwotICB9Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBDaGVja0FuZEdldERvdWJsZShQeU9iamVjdCogYXJnLCBkb3VibGUqIHZhbHVlKSB7Ci0gIGlmICghUHlJbnRfQ2hlY2soYXJnKSAmJiAhUHlMb25nX0NoZWNrKGFyZykgJiYKLSAgICAgICFQeUZsb2F0X0NoZWNrKGFyZykpIHsKLSAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBsb25nLCBmbG9hdCIpOwotICAgIHJldHVybiBmYWxzZTsKLSAgfQotICAqdmFsdWUgPSBQeUZsb2F0X0FzRG91YmxlKGFyZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBDaGVja0FuZEdldEZsb2F0KFB5T2JqZWN0KiBhcmcsIGZsb2F0KiB2YWx1ZSkgewotICBkb3VibGUgZG91YmxlX3ZhbHVlOwotICBpZiAoIUNoZWNrQW5kR2V0RG91YmxlKGFyZywgJmRvdWJsZV92YWx1ZSkpIHsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgKnZhbHVlID0gc3RhdGljX2Nhc3Q8ZmxvYXQ+KGRvdWJsZV92YWx1ZSk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgYm9vbCBDaGVja0FuZEdldEJvb2woUHlPYmplY3QqIGFyZywgYm9vbCogdmFsdWUpIHsKLSAgaWYgKCFQeUludF9DaGVjayhhcmcpICYmICFQeUJvb2xfQ2hlY2soYXJnKSAmJiAhUHlMb25nX0NoZWNrKGFyZykpIHsKLSAgICBGb3JtYXRUeXBlRXJyb3IoYXJnLCAiaW50LCBsb25nLCBib29sIik7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gICp2YWx1ZSA9IHN0YXRpY19jYXN0PGJvb2w+KFB5SW50X0FzTG9uZyhhcmcpKTsKLSAgcmV0dXJuIHRydWU7Ci19Ci0KLWdvb2dsZTo6cHJvdG9idWY6OkR5bmFtaWNNZXNzYWdlRmFjdG9yeSogZ2xvYmFsX21lc3NhZ2VfZmFjdG9yeSA9IE5VTEw7Ci1zdGF0aWMgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogQ3JlYXRlTWVzc2FnZShjb25zdCBjaGFyKiBtZXNzYWdlX3R5cGUpIHsKLSAgc3RyaW5nIG1lc3NhZ2VfbmFtZShtZXNzYWdlX3R5cGUpOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0KLSAgICAgIEdldERlc2NyaXB0b3JQb29sKCktPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShtZXNzYWdlX25hbWUpOwotICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcmV0dXJuIGdsb2JhbF9tZXNzYWdlX2ZhY3RvcnktPkdldFByb3RvdHlwZShkZXNjcmlwdG9yKTsKLX0KLQotc3RhdGljIGJvb2wgQ2hlY2tBbmRTZXRTdHJpbmcoCi0gICAgUHlPYmplY3QqIGFyZywgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKLSAgICBib29sIGFwcGVuZCwKLSAgICBpbnQgaW5kZXgpIHsKLSAgR09PR0xFX0RDSEVDSyhkZXNjcmlwdG9yLT50eXBlKCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyB8fAotICAgICAgICAgZGVzY3JpcHRvci0+dHlwZSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyk7Ci0gIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgPT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIGlmICghUHlTdHJpbmdfQ2hlY2soYXJnKSAmJiAhUHlVbmljb2RlX0NoZWNrKGFyZykpIHsKLSAgICAgIEZvcm1hdFR5cGVFcnJvcihhcmcsICJzdHIsIHVuaWNvZGUiKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotICAgICAgUHlPYmplY3QqIHVuaWNvZGUgPSBQeVVuaWNvZGVfRnJvbUVuY29kZWRPYmplY3QoYXJnLCAiYXNjaWkiLCBOVUxMKTsKLSAgICAgIGlmICh1bmljb2RlID09IE5VTEwpIHsKLSAgICAgICAgUHlPYmplY3QqIHJlcHIgPSBQeU9iamVjdF9SZXByKGFyZyk7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLAotICAgICAgICAgICAgICAgICAgICAgIiVzIGhhcyB0eXBlIHN0ciwgYnV0IGlzbid0IGluIDctYml0IEFTQ0lJICIKLSAgICAgICAgICAgICAgICAgICAgICJlbmNvZGluZy4gTm9uLUFTQ0lJIHN0cmluZ3MgbXVzdCBiZSBjb252ZXJ0ZWQgdG8gIgotICAgICAgICAgICAgICAgICAgICAgInVuaWNvZGUgb2JqZWN0cyBiZWZvcmUgYmVpbmcgYWRkZWQuIiwKLSAgICAgICAgICAgICAgICAgICAgIFB5U3RyaW5nX0FTX1NUUklORyhyZXByKSk7Ci0gICAgICAgIFB5X0RFQ1JFRihyZXByKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgUHlfREVDUkVGKHVuaWNvZGUpOwotICAgICAgfQotICAgIH0KLSAgfSBlbHNlIGlmICghUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotICAgIEZvcm1hdFR5cGVFcnJvcihhcmcsICJzdHIiKTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBQeU9iamVjdCogZW5jb2RlZF9zdHJpbmcgPSBOVUxMOwotICBpZiAoZGVzY3JpcHRvci0+dHlwZSgpID09IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKLSAgICBpZiAoUHlTdHJpbmdfQ2hlY2soYXJnKSkgewotICAgICAgZW5jb2RlZF9zdHJpbmcgPSBQeVN0cmluZ19Bc0VuY29kZWRPYmplY3QoYXJnLCAidXRmLTgiLCBOVUxMKTsKLSAgICB9IGVsc2UgewotICAgICAgZW5jb2RlZF9zdHJpbmcgPSBQeVVuaWNvZGVfQXNFbmNvZGVkT2JqZWN0KGFyZywgInV0Zi04IiwgTlVMTCk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIC8vIEluIHRoaXMgY2FzZSBmaWVsZCB0eXBlIGlzICJieXRlcyIuCi0gICAgZW5jb2RlZF9zdHJpbmcgPSBhcmc7Ci0gICAgUHlfSU5DUkVGKGVuY29kZWRfc3RyaW5nKTsKLSAgfQotCi0gIGlmIChlbmNvZGVkX3N0cmluZyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgY2hhciogdmFsdWU7Ci0gIFB5X3NzaXplX3QgdmFsdWVfbGVuOwotICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGVuY29kZWRfc3RyaW5nLCAmdmFsdWUsICZ2YWx1ZV9sZW4pIDwgMCkgewotICAgIFB5X0RFQ1JFRihlbmNvZGVkX3N0cmluZyk7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0KLSAgc3RyaW5nIHZhbHVlX3N0cmluZyh2YWx1ZSwgdmFsdWVfbGVuKTsKLSAgaWYgKGFwcGVuZCkgewotICAgIHJlZmxlY3Rpb24tPkFkZFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCB2YWx1ZV9zdHJpbmcpOwotICB9IGVsc2UgaWYgKGluZGV4IDwgMCkgewotICAgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBkZXNjcmlwdG9yLCB2YWx1ZV9zdHJpbmcpOwotICB9IGVsc2UgewotICAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIGRlc2NyaXB0b3IsIGluZGV4LCB2YWx1ZV9zdHJpbmcpOwotICB9Ci0gIFB5X0RFQ1JFRihlbmNvZGVkX3N0cmluZyk7Ci0gIHJldHVybiB0cnVlOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIFRvU3RyaW5nT2JqZWN0KAotICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgc3RyaW5nIHZhbHVlKSB7Ci0gIGlmIChkZXNjcmlwdG9yLT50eXBlKCkgIT0gZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSh2YWx1ZS5jX3N0cigpLCB2YWx1ZS5sZW5ndGgoKSk7Ci0gIH0KLQotICBQeU9iamVjdCogcmVzdWx0ID0gUHlVbmljb2RlX0RlY29kZVVURjgodmFsdWUuY19zdHIoKSwgdmFsdWUubGVuZ3RoKCksIE5VTEwpOwotICAvLyBJZiB0aGUgc3RyaW5nIGNhbid0IGJlIGRlY29kZWQgaW4gVVRGLTgsIGp1c3QgcmV0dXJuIGEgc3RyaW5nIG9iamVjdCB0aGF0Ci0gIC8vIGNvbnRhaW5zIHRoZSByYXcgYnl0ZXMuIFRoaXMgY2FuJ3QgaGFwcGVuIGlmIHRoZSB2YWx1ZSB3YXMgYXNzaWduZWQgdXNpbmcKLSAgLy8gdGhlIG1lbWJlcnMgb2YgdGhlIFB5dGhvbiBtZXNzYWdlIG9iamVjdCwgYnV0IGNhbiBoYXBwZW4gaWYgdGhlIHZhbHVlcyB3ZXJlCi0gIC8vIHBhcnNlZCBmcm9tIHRoZSB3aXJlIChiaW5hcnkpLgotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICBQeUVycl9DbGVhcigpOwotICAgIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKHZhbHVlLmNfc3RyKCksIHZhbHVlLmxlbmd0aCgpKTsKLSAgfQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgdm9pZCBBc3N1cmVXcml0YWJsZShDTWVzc2FnZSogc2VsZikgewotICBpZiAoc2VsZiA9PSBOVUxMIHx8Ci0gICAgICBzZWxmLT5wYXJlbnQgPT0gTlVMTCB8fAotICAgICAgc2VsZi0+cGFyZW50X2ZpZWxkID09IE5VTEwpIHsKLSAgICByZXR1cm47Ci0gIH0KLQotICBpZiAoIXNlbGYtPnJlYWRfb25seSkgewotICAgIHJldHVybjsKLSAgfQotCi0gIEFzc3VyZVdyaXRhYmxlKHNlbGYtPnBhcmVudCk7Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPnBhcmVudC0+bWVzc2FnZTsKLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgc2VsZi0+bWVzc2FnZSA9IHJlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAotICAgICAgbWVzc2FnZSwgc2VsZi0+cGFyZW50X2ZpZWxkLT5kZXNjcmlwdG9yLCBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKLSAgc2VsZi0+cmVhZF9vbmx5ID0gZmFsc2U7Ci0gIHNlbGYtPnBhcmVudCA9IE5VTEw7Ci0gIHNlbGYtPnBhcmVudF9maWVsZCA9IE5VTEw7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogSW50ZXJuYWxHZXRTY2FsYXIoCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwKLSAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IpIHsKLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLQotICBpZiAoIUZJRUxEX0JFTE9OR1NfVE9fTUVTU0FHRShmaWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlKSkgewotICAgIFB5RXJyX1NldFN0cmluZygKLSAgICAgICAgUHlFeGNfS2V5RXJyb3IsICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFB5T2JqZWN0KiByZXN1bHQgPSBOVUxMOwotICBzd2l0Y2ggKGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpIHsKLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogewotICAgICAgaW50MzIgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRJbnQzMigqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKLSAgICAgIGludDY0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0SW50NjQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotI2lmIElTXzY0QklUCi0gICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh2YWx1ZSk7Ci0jZWxzZQotICAgICAgcmVzdWx0ID0gUHlMb25nX0Zyb21Mb25nTG9uZyh2YWx1ZSk7Ci0jZW5kaWYKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFVJbnQzMigqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0jaWYgSVNfNjRCSVQKLSAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKLSNlbHNlCi0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKLSNlbmRpZgotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogewotICAgICAgdWludDY0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0VUludDY0KCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSNpZiBJU182NEJJVAotICAgICAgaWYgKHZhbHVlIDw9IHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWF4KSkgewotICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhzdGF0aWNfY2FzdDx1aW50NjQ+KHZhbHVlKSk7Ci0gICAgICB9Ci0jZWxzZQotICAgICAgaWYgKHZhbHVlIDw9IHN0YXRpY19jYXN0PHVpbnQzMj4oa2ludDMybWF4KSkgewotICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlKSk7Ci0gICAgICB9Ci0jZW5kaWYKLSAgICAgIGVsc2UgeyAgLy8gTk9MSU5UCi0gICAgICAgIHJlc3VsdCA9IFB5TG9uZ19Gcm9tVW5zaWduZWRMb25nTG9uZyh2YWx1ZSk7Ci0gICAgICB9Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKLSAgICAgIGZsb2F0IHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0RmxvYXQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKLSAgICAgIGRvdWJsZSB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldERvdWJsZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgICByZXN1bHQgPSBQeUZsb2F0X0Zyb21Eb3VibGUodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKLSAgICAgIGJvb2wgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRCb29sKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgICAgIHJlc3VsdCA9IFB5Qm9vbF9Gcm9tTG9uZyh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICBzdHJpbmcgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgICAgcmVzdWx0ID0gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06IHsKLSAgICAgIGlmICghbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcikpIHsKLSAgICAgICAgLy8gTG9vayBmb3IgdGhlIHZhbHVlIGluIHRoZSB1bmtub3duIGZpZWxkcy4KLSAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkX3NldCA9Ci0gICAgICAgICAgICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRfc2V0LT5maWVsZF9jb3VudCgpOyArK2kpIHsKLSAgICAgICAgICBpZiAodW5rbm93bl9maWVsZF9zZXQtPmZpZWxkKGkpLm51bWJlcigpID09Ci0gICAgICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPm51bWJlcigpKSB7Ci0gICAgICAgICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyh1bmtub3duX2ZpZWxkX3NldC0+ZmllbGQoaSkudmFyaW50KCkpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0gICAgICB9Ci0KLSAgICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KLSAgICAgICAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0RW51bSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKGVudW1fdmFsdWUtPm51bWJlcigpKTsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBkZWZhdWx0OgotICAgICAgUHlFcnJfRm9ybWF0KAotICAgICAgICAgIFB5RXhjX1N5c3RlbUVycm9yLCAiR2V0dGluZyBhIHZhbHVlIGZyb20gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAotICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOwotICB9Ci0KLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBJbnRlcm5hbFNldFNjYWxhcigKLSAgICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IsCi0gICAgUHlPYmplY3QqIGFyZykgewotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIGlmICghRklFTERfQkVMT05HU19UT19NRVNTQUdFKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKAotICAgICAgICBQeUV4Y19LZXlFcnJvciwgIkZpZWxkIGRvZXMgbm90IGJlbG9uZyB0byBtZXNzYWdlISIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgc3dpdGNoIChmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKSB7Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UMzIoYXJnLCB2YWx1ZSk7Ci0gICAgICByZWZsZWN0aW9uLT5TZXRJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfSU5UNjQoYXJnLCB2YWx1ZSk7Ci0gICAgICByZWZsZWN0aW9uLT5TZXRJbnQ2NChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQzMihhcmcsIHZhbHVlKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQzMihtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0OiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX1VJTlQ2NChhcmcsIHZhbHVlKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldFVJbnQ2NChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfRkxPQVQoYXJnLCB2YWx1ZSk7Ci0gICAgICByZWZsZWN0aW9uLT5TZXRGbG9hdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0RPVUJMRShhcmcsIHZhbHVlKTsKLSAgICAgIHJlZmxlY3Rpb24tPlNldERvdWJsZShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9CT09MKGFyZywgdmFsdWUpOwotICAgICAgcmVmbGVjdGlvbi0+U2V0Qm9vbChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCB2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICBpZiAoIUNoZWNrQW5kU2V0U3RyaW5nKAotICAgICAgICAgIGFyZywgbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgcmVmbGVjdGlvbiwgZmFsc2UsIC0xKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpOwotICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9Ci0gICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7Ci0gICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KLSAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKLSAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBlbnVtX3ZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGJvb2wgYWRkZWQgPSBmYWxzZTsKLSAgICAgICAgLy8gQWRkIHRoZSB2YWx1ZSB0byB0aGUgdW5rbm93biBmaWVsZHMuCi0gICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZF9zZXQgPQotICAgICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5NdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlKTsKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkX3NldC0+ZmllbGRfY291bnQoKTsgKytpKSB7Ci0gICAgICAgICAgaWYgKHVua25vd25fZmllbGRfc2V0LT5maWVsZChpKS5udW1iZXIoKSA9PQotICAgICAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5udW1iZXIoKSkgewotICAgICAgICAgICAgdW5rbm93bl9maWVsZF9zZXQtPm11dGFibGVfZmllbGQoaSktPnNldF92YXJpbnQodmFsdWUpOwotICAgICAgICAgICAgYWRkZWQgPSB0cnVlOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgaWYgKCFhZGRlZCkgewotICAgICAgICAgIHVua25vd25fZmllbGRfc2V0LT5BZGRWYXJpbnQoZmllbGRfZGVzY3JpcHRvci0+bnVtYmVyKCksIHZhbHVlKTsKLSAgICAgICAgfQotICAgICAgICByZWZsZWN0aW9uLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJTZXR0aW5nIHZhbHVlIHRvIGEgZmllbGQgb2YgdW5rbm93biB0eXBlICVkIiwKLSAgICAgICAgICBmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKLSAgfQotCi0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEludGVybmFsQWRkUmVwZWF0ZWRTY2FsYXIoCi0gICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSwgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yLAotICAgIFB5T2JqZWN0KiBhcmcpIHsKLQotICBpZiAoIUZJRUxEX0JFTE9OR1NfVE9fTUVTU0FHRShmaWVsZF9kZXNjcmlwdG9yLCBtZXNzYWdlKSkgewotICAgIFB5RXJyX1NldFN0cmluZygKLSAgICAgICAgUHlFeGNfS2V5RXJyb3IsICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgewotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpOwotICAgICAgcmVmbGVjdGlvbi0+QWRkSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDY0OiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDY0KGFyZywgdmFsdWUpOwotICAgICAgcmVmbGVjdGlvbi0+QWRkSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UMzIoYXJnLCB2YWx1ZSk7Ci0gICAgICByZWZsZWN0aW9uLT5BZGRVSW50MzIobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9VSU5UNjQoYXJnLCB2YWx1ZSk7Ci0gICAgICByZWZsZWN0aW9uLT5BZGRVSW50NjQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0ZMT0FUKGFyZywgdmFsdWUpOwotICAgICAgcmVmbGVjdGlvbi0+QWRkRmxvYXQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRTogewotICAgICAgR09PR0xFX0NIRUNLX0dFVF9ET1VCTEUoYXJnLCB2YWx1ZSk7Ci0gICAgICByZWZsZWN0aW9uLT5BZGREb3VibGUobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0JPT0w6IHsKLSAgICAgIEdPT0dMRV9DSEVDS19HRVRfQk9PTChhcmcsIHZhbHVlKTsKLSAgICAgIHJlZmxlY3Rpb24tPkFkZEJvb2wobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogewotICAgICAgaWYgKCFDaGVja0FuZFNldFN0cmluZygKLSAgICAgICAgICBhcmcsIG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIHJlZmxlY3Rpb24sIHRydWUsIC0xKSkgewotICAgICAgICByZXR1cm4gTlVMTDsKLSAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOiB7Ci0gICAgICBHT09HTEVfQ0hFQ0tfR0VUX0lOVDMyKGFyZywgdmFsdWUpOwotICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciA9Ci0gICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+ZW51bV90eXBlKCk7Ci0gICAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KLSAgICAgICAgICBlbnVtX2Rlc2NyaXB0b3ItPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKLSAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBlbnVtX3ZhbHVlKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIFB5T2JqZWN0KiBzID0gUHlPYmplY3RfU3RyKGFyZyk7Ci0gICAgICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19WYWx1ZUVycm9yLCAiVW5rbm93biBlbnVtIHZhbHVlOiAlcyIsCi0gICAgICAgICAgICAgICAgICAgICBQeVN0cmluZ19BU19TVFJJTkcocykpOwotICAgICAgICBQeV9ERUNSRUYocyk7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsICJBZGRpbmcgdmFsdWUgdG8gYSBmaWVsZCBvZiB1bmtub3duIHR5cGUgJWQiLAotICAgICAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmNwcF90eXBlKCkpOwotICB9Ci0KLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogSW50ZXJuYWxHZXRSZXBlYXRlZFNjYWxhcigKLSAgICBDTWVzc2FnZSogY21lc3NhZ2UsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICBpbnQgaW5kZXgpIHsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IGNtZXNzYWdlLT5tZXNzYWdlOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIGludCBmaWVsZF9zaXplID0gcmVmbGVjdGlvbi0+RmllbGRTaXplKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgaWYgKGluZGV4IDwgMCkgewotICAgIGluZGV4ID0gZmllbGRfc2l6ZSArIGluZGV4OwotICB9Ci0gIGlmIChpbmRleCA8IDAgfHwgaW5kZXggPj0gZmllbGRfc2l6ZSkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19JbmRleEVycm9yLAotICAgICAgICAgICAgICAgICAibGlzdCBhc3NpZ25tZW50IGluZGV4ICglZCkgb3V0IG9mIHJhbmdlIiwgaW5kZXgpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgUHlPYmplY3QqIHJlc3VsdCA9IE5VTEw7Ci0gIHN3aXRjaCAoZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSkgewotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOiB7Ci0gICAgICBpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoCi0gICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKLSAgICAgIHJlc3VsdCA9IFB5SW50X0Zyb21Mb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NDogewotICAgICAgaW50NjQgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0KAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6IHsKLSAgICAgIHVpbnQzMiB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDMyKAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbUxvbmdMb25nKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UNjQ6IHsKLSAgICAgIHVpbnQ2NCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkVUludDY0KAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcodmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7Ci0gICAgICBmbG9hdCB2YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRmxvYXQoCi0gICAgICAgICAgKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKLSAgICAgIHJlc3VsdCA9IFB5RmxvYXRfRnJvbURvdWJsZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRE9VQkxFOiB7Ci0gICAgICBkb3VibGUgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZSgKLSAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOwotICAgICAgcmVzdWx0ID0gUHlGbG9hdF9Gcm9tRG91YmxlKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgICBjYXNlIGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOiB7Ci0gICAgICBib29sIHZhbHVlID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sKAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUJvb2xfRnJvbUxvbmcodmFsdWUgPyAxIDogMCk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogewotICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9Ci0gICAgICAgICAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRSZXBlYXRlZEVudW0oCi0gICAgICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICByZXN1bHQgPSBQeUludF9Gcm9tTG9uZyhlbnVtX3ZhbHVlLT5udW1iZXIoKSk7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gICAgY2FzZSBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICBzdHJpbmcgdmFsdWUgPSByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZygKLSAgICAgICAgICAqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaW5kZXgpOwotICAgICAgcmVzdWx0ID0gVG9TdHJpbmdPYmplY3QoZmllbGRfZGVzY3JpcHRvciwgdmFsdWUpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGNhc2UgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6IHsKLSAgICAgIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7Ci0gICAgICBpZiAocHlfY21zZyA9PSBOVUxMKSB7Ci0gICAgICAgIHJldHVybiBOVUxMOwotICAgICAgfQotICAgICAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbXNnID0gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKAotICAgICAgICAgICptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICBweV9jbXNnLT5wYXJlbnQgPSBjbWVzc2FnZTsKLSAgICAgIHB5X2Ntc2ctPmZ1bGxfbmFtZSA9IGZpZWxkX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCk7Ci0gICAgICBweV9jbXNnLT5tZXNzYWdlID0gY29uc3RfY2FzdDxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKj4oJm1zZyk7Ci0gICAgICBweV9jbXNnLT5mcmVlX21lc3NhZ2UgPSBmYWxzZTsKLSAgICAgIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOwotICAgICAgcmVzdWx0ID0gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOwotICAgICAgYnJlYWs7Ci0gICAgfQotICAgIGRlZmF1bHQ6Ci0gICAgICBQeUVycl9Gb3JtYXQoCi0gICAgICAgICAgUHlFeGNfU3lzdGVtRXJyb3IsCi0gICAgICAgICAgIkdldHRpbmcgdmFsdWUgZnJvbSBhIHJlcGVhdGVkIGZpZWxkIG9mIHVua25vd24gdHlwZSAlZCIsCi0gICAgICAgICAgZmllbGRfZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7Ci0gIH0KLQotICByZXR1cm4gcmVzdWx0OwotfQotCi1zdGF0aWMgUHlPYmplY3QqIEludGVybmFsR2V0UmVwZWF0ZWRTY2FsYXJTbGljZSgKLSAgICBDTWVzc2FnZSogY21lc3NhZ2UsIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciwKLSAgICBQeU9iamVjdCogc2xpY2UpIHsKLSAgUHlfc3NpemVfdCBmcm9tOwotICBQeV9zc2l6ZV90IHRvOwotICBQeV9zc2l6ZV90IHN0ZXA7Ci0gIFB5X3NzaXplX3QgbGVuZ3RoOwotICBib29sIHJldHVybl9saXN0ID0gZmFsc2U7Ci0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBjbWVzc2FnZS0+bWVzc2FnZTsKLQotICBpZiAoUHlJbnRfQ2hlY2soc2xpY2UpKSB7Ci0gICAgZnJvbSA9IHRvID0gUHlJbnRfQXNMb25nKHNsaWNlKTsKLSAgfSBlbHNlIGlmIChQeUxvbmdfQ2hlY2soc2xpY2UpKSB7Ci0gICAgZnJvbSA9IHRvID0gUHlMb25nX0FzTG9uZyhzbGljZSk7Ci0gIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKLSAgICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICAgIGxlbmd0aCA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gICAgUHlTbGljZV9HZXRJbmRpY2VzKAotICAgICAgICByZWludGVycHJldF9jYXN0PFB5U2xpY2VPYmplY3QqPihzbGljZSksIGxlbmd0aCwgJmZyb20sICZ0bywgJnN0ZXApOwotICAgIHJldHVybl9saXN0ID0gdHJ1ZTsKLSAgfSBlbHNlIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmICghcmV0dXJuX2xpc3QpIHsKLSAgICByZXR1cm4gSW50ZXJuYWxHZXRSZXBlYXRlZFNjYWxhcihjbWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgZnJvbSk7Ci0gIH0KLQotICBQeU9iamVjdCogbGlzdCA9IFB5TGlzdF9OZXcoMCk7Ci0gIGlmIChsaXN0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChmcm9tIDw9IHRvKSB7Ci0gICAgaWYgKHN0ZXAgPCAwKSByZXR1cm4gbGlzdDsKLSAgICBmb3IgKFB5X3NzaXplX3QgaW5kZXggPSBmcm9tOyBpbmRleCA8IHRvOyBpbmRleCArPSBzdGVwKSB7Ci0gICAgICBpZiAoaW5kZXggPCAwIHx8IGluZGV4ID49IGxlbmd0aCkgYnJlYWs7Ci0gICAgICBQeU9iamVjdCogcyA9IEludGVybmFsR2V0UmVwZWF0ZWRTY2FsYXIoCi0gICAgICAgICAgY21lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IsIGluZGV4KTsKLSAgICAgIFB5TGlzdF9BcHBlbmQobGlzdCwgcyk7Ci0gICAgICBQeV9ERUNSRUYocyk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChzdGVwID4gMCkgcmV0dXJuIGxpc3Q7Ci0gICAgZm9yIChQeV9zc2l6ZV90IGluZGV4ID0gZnJvbTsgaW5kZXggPiB0bzsgaW5kZXggKz0gc3RlcCkgewotICAgICAgaWYgKGluZGV4IDwgMCB8fCBpbmRleCA+PSBsZW5ndGgpIGJyZWFrOwotICAgICAgUHlPYmplY3QqIHMgPSBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyKAotICAgICAgICAgIGNtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yLCBpbmRleCk7Ci0gICAgICBQeUxpc3RfQXBwZW5kKGxpc3QsIHMpOwotICAgICAgUHlfREVDUkVGKHMpOwotICAgIH0KLSAgfQotICByZXR1cm4gbGlzdDsKLX0KLQotLy8gLS0tLS0tIEMgQ29uc3RydWN0b3IvRGVzdHJ1Y3RvcjoKLQotc3RhdGljIGludCBDTWVzc2FnZUluaXQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0ICphcmdzLCBQeU9iamVjdCAqa3dkcykgewotICBzZWxmLT5tZXNzYWdlID0gTlVMTDsKLSAgcmV0dXJuIDA7Ci19Ci0KLXN0YXRpYyB2b2lkIENNZXNzYWdlRGVhbGxvYyhDTWVzc2FnZSogc2VsZikgewotICBpZiAoc2VsZi0+ZnJlZV9tZXNzYWdlKSB7Ci0gICAgaWYgKHNlbGYtPnJlYWRfb25seSkgewotICAgICAgUHlFcnJfV3JpdGVVbnJhaXNhYmxlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Ci0gICAgfQotICAgIGRlbGV0ZSBzZWxmLT5tZXNzYWdlOwotICB9Ci0gIHNlbGYtPm9iX3R5cGUtPnRwX2ZyZWUocmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHNlbGYpKTsKLX0KLQotLy8gLS0tLS0tIE1ldGhvZHM6Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ2xlYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotICBzZWxmLT5tZXNzYWdlLT5DbGVhcigpOwotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9Jc0luaXRpYWxpemVkKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPklzSW5pdGlhbGl6ZWQoKSA/IDEgOiAwKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9IYXNGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgewotICBjaGFyKiBmaWVsZF9uYW1lOwotICBpZiAoUHlTdHJpbmdfQXNTdHJpbmdBbmRTaXplKGFyZywgJmZpZWxkX25hbWUsIE5VTEwpIDwgMCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7Ci0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7Ci0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgICBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7Ci0gIGlmIChmaWVsZF9kZXNjcmlwdG9yID09IE5VTEwpIHsKLSAgICBQeUVycl9Gb3JtYXQoUHlFeGNfVmFsdWVFcnJvciwgIlVua25vd24gZmllbGQgJXMuIiwgZmllbGRfbmFtZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBib29sIGhhc19maWVsZCA9Ci0gICAgICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCptZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZyhoYXNfZmllbGQgPyAxIDogMCk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfSGFzRmllbGRCeURlc2NyaXB0b3IoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3IgPSBOVUxMOwotICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhyZWludGVycHJldF9jYXN0PFB5T2JqZWN0ICo+KGFyZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBmaWVsZCBkZXNjcmlwdG9yIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgY2ZpZWxkX2Rlc2NyaXB0b3IgPSByZWludGVycHJldF9jYXN0PENGaWVsZERlc2NyaXB0b3IqPihhcmcpOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQotICAgICAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3I7Ci0KLSAgaWYgKCFGSUVMRF9CRUxPTkdTX1RPX01FU1NBR0UoZmllbGRfZGVzY3JpcHRvciwgbWVzc2FnZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfS2V5RXJyb3IsCi0gICAgICAgICAgICAgICAgICAgICJGaWVsZCBkb2VzIG5vdCBiZWxvbmcgdG8gbWVzc2FnZSEiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGlmIChGSUVMRF9JU19SRVBFQVRFRChmaWVsZF9kZXNjcmlwdG9yKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19LZXlFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIkZpZWxkIGlzIHJlcGVhdGVkLiBBIHNpbmd1bGFyIG1ldGhvZCBpcyByZXF1aXJlZC4iKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGJvb2wgaGFzX2ZpZWxkID0KLSAgICAgIG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKGhhc19maWVsZCA/IDEgOiAwKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9DbGVhckZpZWxkQnlEZXNjcmlwdG9yKAotICAgIENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yID0gTlVMTDsKLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJNdXN0IGJlIGEgZmllbGQgZGVzY3JpcHRvciIpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNmaWVsZF9kZXNjcmlwdG9yID0gcmVpbnRlcnByZXRfY2FzdDxDRmllbGREZXNjcmlwdG9yKj4oYXJnKTsKLQotICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KLSAgICAgIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yOwotCi0gIGlmICghRklFTERfQkVMT05HU19UT19NRVNTQUdFKGZpZWxkX2Rlc2NyaXB0b3IsIG1lc3NhZ2UpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX0tleUVycm9yLAotICAgICAgICAgICAgICAgICAgICAiRmllbGQgZG9lcyBub3QgYmVsb25nIHRvIG1lc3NhZ2UhIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkNsZWFyRmllbGQobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvcik7Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0NsZWFyRmllbGQoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgY2hhciogZmllbGRfbmFtZTsKLSAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZmaWVsZF9uYW1lLCBOVUxMKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3IqIGZpZWxkX2Rlc2NyaXB0b3IgPQotICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX25hbWUpOwotICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1ZhbHVlRXJyb3IsICJVbmtub3duIGZpZWxkICVzLiIsIGZpZWxkX25hbWUpOwotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRTY2FsYXIoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2Rlc2NyaXB0b3IgPSBOVUxMOwotICBpZiAoIVB5T2JqZWN0X1R5cGVDaGVjayhyZWludGVycHJldF9jYXN0PFB5T2JqZWN0ICo+KGFyZyksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICZDRmllbGREZXNjcmlwdG9yX1R5cGUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBmaWVsZCBkZXNjcmlwdG9yIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgY2Rlc2NyaXB0b3IgPSByZWludGVycHJldF9jYXN0PENGaWVsZERlc2NyaXB0b3IqPihhcmcpOwotCi0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICByZXR1cm4gSW50ZXJuYWxHZXRTY2FsYXIobWVzc2FnZSwgY2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0dldFJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKLSAgUHlPYmplY3QqIHNsaWNlOwotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgQygiTyFPOkdldFJlcGVhdGVkU2NhbGFyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyU2xpY2UoCi0gICAgICBzZWxmLCBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciwgc2xpY2UpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0Fzc2lnblJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKLSAgUHlPYmplY3QqIHNsaWNlOwotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgQygiTyFPOkFzc2lnblJlcGVhdGVkU2NhbGFyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5DbGVhckZpZWxkKG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yKTsKLQotICBQeU9iamVjdCogaXRlciA9IFB5T2JqZWN0X0dldEl0ZXIoc2xpY2UpOwotICBQeU9iamVjdCogbmV4dDsKLSAgd2hpbGUgKChuZXh0ID0gUHlJdGVyX05leHQoaXRlcikpICE9IE5VTEwpIHsKLSAgICBpZiAoSW50ZXJuYWxBZGRSZXBlYXRlZFNjYWxhcigKLSAgICAgICAgICAgIG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBuZXh0KSA9PSBOVUxMKSB7Ci0gICAgICBQeV9ERUNSRUYobmV4dCk7Ci0gICAgICBQeV9ERUNSRUYoaXRlcik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gICAgUHlfREVDUkVGKG5leHQpOwotICB9Ci0gIFB5X0RFQ1JFRihpdGVyKTsKLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfRGVsZXRlUmVwZWF0ZWRGaWVsZChDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIFB5T2JqZWN0KiBzbGljZTsKLSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEMoIk8hTzpEZWxldGVSZXBlYXRlZEZpZWxkIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBBc3N1cmVXcml0YWJsZShzZWxmKTsKLQotICBQeV9zc2l6ZV90IGxlbmd0aCwgZnJvbSwgdG8sIHN0ZXAsIHNsaWNlX2xlbmd0aDsKLSAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7Ci0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9Ci0gICAgICBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvcjsKLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgaW50IG1pbiwgbWF4OwotICBsZW5ndGggPSByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm1lc3NhZ2UsIGZpZWxkX2Rlc2NyaXB0b3IpOwotCi0gIGlmIChQeUludF9DaGVjayhzbGljZSkgfHwgUHlMb25nX0NoZWNrKHNsaWNlKSkgewotICAgIGZyb20gPSB0byA9IFB5TG9uZ19Bc0xvbmcoc2xpY2UpOwotICAgIGlmIChmcm9tIDwgMCkgewotICAgICAgZnJvbSA9IHRvID0gbGVuZ3RoICsgZnJvbTsKLSAgICB9Ci0gICAgc3RlcCA9IDE7Ci0gICAgbWluID0gbWF4ID0gZnJvbTsKLQotICAgIC8vIFJhbmdlIGNoZWNrLgotICAgIGlmIChmcm9tIDwgMCB8fCBmcm9tID49IGxlbmd0aCkgewotICAgICAgUHlFcnJfRm9ybWF0KFB5RXhjX0luZGV4RXJyb3IsICJsaXN0IGFzc2lnbm1lbnQgaW5kZXggb3V0IG9mIHJhbmdlIik7Ci0gICAgICByZXR1cm4gTlVMTDsKLSAgICB9Ci0gIH0gZWxzZSBpZiAoUHlTbGljZV9DaGVjayhzbGljZSkpIHsKLSAgICBmcm9tID0gdG8gPSBzdGVwID0gc2xpY2VfbGVuZ3RoID0gMDsKLSAgICBQeVNsaWNlX0dldEluZGljZXNFeCgKLSAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxQeVNsaWNlT2JqZWN0Kj4oc2xpY2UpLAotICAgICAgICBsZW5ndGgsICZmcm9tLCAmdG8sICZzdGVwLCAmc2xpY2VfbGVuZ3RoKTsKLSAgICBpZiAoZnJvbSA8IHRvKSB7Ci0gICAgICBtaW4gPSBmcm9tOwotICAgICAgbWF4ID0gdG8gLSAxOwotICAgIH0gZWxzZSB7Ci0gICAgICBtaW4gPSB0byArIDE7Ci0gICAgICBtYXggPSBmcm9tOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAibGlzdCBpbmRpY2VzIG11c3QgYmUgaW50ZWdlcnMiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIFB5X3NzaXplX3QgaSA9IGZyb207Ci0gIHN0ZDo6dmVjdG9yPGJvb2w+IHRvX2RlbGV0ZShsZW5ndGgsIGZhbHNlKTsKLSAgd2hpbGUgKGkgPj0gbWluICYmIGkgPD0gbWF4KSB7Ci0gICAgdG9fZGVsZXRlW2ldID0gdHJ1ZTsKLSAgICBpICs9IHN0ZXA7Ci0gIH0KLQotICB0byA9IDA7Ci0gIGZvciAoaSA9IDA7IGkgPCBsZW5ndGg7ICsraSkgewotICAgIGlmICghdG9fZGVsZXRlW2ldKSB7Ci0gICAgICBpZiAoaSAhPSB0bykgewotICAgICAgICByZWZsZWN0aW9uLT5Td2FwRWxlbWVudHMobWVzc2FnZSwgZmllbGRfZGVzY3JpcHRvciwgaSwgdG8pOwotICAgICAgfQotICAgICAgKyt0bzsKLSAgICB9Ci0gIH0KLQotICB3aGlsZSAoaSA+IHRvKSB7Ci0gICAgcmVmbGVjdGlvbi0+UmVtb3ZlTGFzdChtZXNzYWdlLCBmaWVsZF9kZXNjcmlwdG9yKTsKLSAgICAtLWk7Ci0gIH0KLQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NldFNjYWxhcihDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIFB5T2JqZWN0KiBhcmc7Ci0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86U2V0U2NhbGFyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZhcmcpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQXNzdXJlV3JpdGFibGUoc2VsZik7Ci0KLSAgcmV0dXJuIEludGVybmFsU2V0U2NhbGFyKHNlbGYtPm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBhcmcpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZFJlcGVhdGVkU2NhbGFyKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvcjsKLSAgUHlPYmplY3QqIHZhbHVlOwotICBpZiAoIVB5QXJnX1BhcnNlVHVwbGUoYXJncywgQygiTyFPOkFkZFJlcGVhdGVkU2NhbGFyIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZ2YWx1ZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBBc3N1cmVXcml0YWJsZShzZWxmKTsKLQotICByZXR1cm4gSW50ZXJuYWxBZGRSZXBlYXRlZFNjYWxhcigKLSAgICAgIHNlbGYtPm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCB2YWx1ZSk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfRmllbGRMZW5ndGgoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7Ci0gIGludCBsZW5ndGggPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkZpZWxkU2l6ZSgKLSAgICAgICptZXNzYWdlLCBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvcik7Ci0gIHJldHVybiBQeUludF9Gcm9tTG9uZyhsZW5ndGgpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0RlYnVnU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZyhzZWxmLT5tZXNzYWdlLT5EZWJ1Z1N0cmluZygpLmNfc3RyKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NlcmlhbGl6ZVRvU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBpbnQgc2l6ZSA9IHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplKCk7Ci0gIGlmIChzaXplIDw9IDApIHsKLSAgICByZXR1cm4gUHlTdHJpbmdfRnJvbVN0cmluZygiIik7Ci0gIH0KLSAgUHlPYmplY3QqIHJlc3VsdCA9IFB5U3RyaW5nX0Zyb21TdHJpbmdBbmRTaXplKE5VTEwsIHNpemUpOwotICBpZiAocmVzdWx0ID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjaGFyKiBidWZmZXIgPSBQeVN0cmluZ19BU19TVFJJTkcocmVzdWx0KTsKLSAgc2VsZi0+bWVzc2FnZS0+U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihidWZmZXIpKTsKLSAgcmV0dXJuIHJlc3VsdDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9TZXJpYWxpemVQYXJ0aWFsVG9TdHJpbmcoCi0gICAgQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIHN0cmluZyBjb250ZW50czsKLSAgc2VsZi0+bWVzc2FnZS0+U2VyaWFsaXplUGFydGlhbFRvU3RyaW5nKCZjb250ZW50cyk7Ci0gIHJldHVybiBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShjb250ZW50cy5jX3N0cigpLCBjb250ZW50cy5zaXplKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlU3RyKENNZXNzYWdlKiBzZWxmKSB7Ci0gIGNoYXIgc3RyWzEwMjRdOwotICBzdHJbc2l6ZW9mKHN0cikgLSAxXSA9IDA7Ci0gIHNucHJpbnRmKHN0ciwgc2l6ZW9mKHN0cikgLSAxLCAiQ01lc3NhZ2U6IDwlcD4iLCBzZWxmLT5tZXNzYWdlKTsKLSAgcmV0dXJuIFB5U3RyaW5nX0Zyb21TdHJpbmcoc3RyKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9NZXJnZUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ01lc3NhZ2UqIG90aGVyX21lc3NhZ2U7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBtZXNzYWdlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7Ci0gIGlmIChvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgIT0KLSAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJUcmllZCB0byBtZXJnZSBmcm9tIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IHR5cGUuICIKLSAgICAgICAgICAgICAgICAgInRvOiAlcywgZnJvbTogJXMiLAotICAgICAgICAgICAgICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCksCi0gICAgICAgICAgICAgICAgIG90aGVyX21lc3NhZ2UtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQXNzdXJlV3JpdGFibGUoc2VsZik7Ci0KLSAgc2VsZi0+bWVzc2FnZS0+TWVyZ2VGcm9tKCpvdGhlcl9tZXNzYWdlLT5tZXNzYWdlKTsKLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfQ29weUZyb20oQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ01lc3NhZ2UqIG90aGVyX21lc3NhZ2U7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwgIk11c3QgYmUgYSBtZXNzYWdlIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7Ci0gIGlmIChvdGhlcl9tZXNzYWdlLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkgIT0KLSAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKSkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsCi0gICAgICAgICAgICAgICAgICJUcmllZCB0byBjb3B5IGZyb20gYSBtZXNzYWdlIHdpdGggYSBkaWZmZXJlbnQgdHlwZS4gIgotICAgICAgICAgICAgICAgICAidG86ICVzLCBmcm9tOiAlcyIsCi0gICAgICAgICAgICAgICAgIHNlbGYtPm1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKSwKLSAgICAgICAgICAgICAgICAgb3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotCi0gIHNlbGYtPm1lc3NhZ2UtPkNvcHlGcm9tKCpvdGhlcl9tZXNzYWdlLT5tZXNzYWdlKTsKLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTWVyZ2VGcm9tU3RyaW5nKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIGNvbnN0IHZvaWQqIGRhdGE7Ci0gIFB5X3NzaXplX3QgZGF0YV9sZW5ndGg7Ci0gIGlmIChQeU9iamVjdF9Bc1JlYWRCdWZmZXIoYXJnLCAmZGF0YSwgJmRhdGFfbGVuZ3RoKSA8IDApIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotICBnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgKLSAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSwgZGF0YV9sZW5ndGgpOwotICBib29sIHN1Y2Nlc3MgPSBzZWxmLT5tZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0KTsKLSAgaWYgKHN1Y2Nlc3MpIHsKLSAgICByZXR1cm4gUHlJbnRfRnJvbUxvbmcoc2VsZi0+bWVzc2FnZS0+Qnl0ZVNpemUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFB5SW50X0Zyb21Mb25nKC0xKTsKLSAgfQotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0J5dGVTaXplKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICByZXR1cm4gUHlMb25nX0Zyb21Mb25nKHNlbGYtPm1lc3NhZ2UtPkJ5dGVTaXplKCkpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX1NldEluUGFyZW50KENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBBc3N1cmVXcml0YWJsZShzZWxmKTsKLSAgUHlfUkVUVVJOX05PTkU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfU3dhcFJlcGVhdGVkRmllbGRFbGVtZW50cygKLSAgICBDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZ3MpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIGludCBpbmRleDEsIGluZGV4MjsKLSAgaWYgKCFQeUFyZ19QYXJzZVR1cGxlKGFyZ3MsIEMoIk8haWk6U3dhcFJlcGVhdGVkRmllbGRFbGVtZW50cyIpLAotICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSwgJmNmaWVsZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgJmluZGV4MSwgJmluZGV4MikpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotCi0gIHJlZmxlY3Rpb24tPlN3YXBFbGVtZW50cygKLSAgICAgIG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLCBpbmRleDEsIGluZGV4Mik7Ci0gIFB5X1JFVFVSTl9OT05FOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0FkZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7Ci0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotCi0gIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7Ci0gIGlmIChweV9jbXNnID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBzdWJfbWVzc2FnZSA9Ci0gICAgICByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yKTsKLQotICBweV9jbXNnLT5wYXJlbnQgPSBOVUxMOwotICBweV9jbXNnLT5mdWxsX25hbWUgPSBzdWJfbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKS5jX3N0cigpOwotICBweV9jbXNnLT5tZXNzYWdlID0gc3ViX21lc3NhZ2U7Ci0gIHB5X2Ntc2ctPmZyZWVfbWVzc2FnZSA9IGZhbHNlOwotICBweV9jbXNnLT5yZWFkX29ubHkgPSBmYWxzZTsKLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihweV9jbXNnKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9HZXRSZXBlYXRlZE1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIENGaWVsZERlc2NyaXB0b3IqIGNmaWVsZF9kZXNjcmlwdG9yOwotICBQeU9iamVjdCogc2xpY2U7Ci0gIGlmICghUHlBcmdfUGFyc2VUdXBsZShhcmdzLCBDKCJPIU86R2V0UmVwZWF0ZWRNZXNzYWdlIiksCi0gICAgICAgICAgICAgICAgICAgICAgICAmQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLCAmY2ZpZWxkX2Rlc2NyaXB0b3IsICZzbGljZSkpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBJbnRlcm5hbEdldFJlcGVhdGVkU2NhbGFyU2xpY2UoCi0gICAgICBzZWxmLCBjZmllbGRfZGVzY3JpcHRvci0+ZGVzY3JpcHRvciwgc2xpY2UpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX05ld1N1Yk1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7Ci0KLSAgQ01lc3NhZ2UqIHB5X2Ntc2cgPSBQeU9iamVjdF9OZXcoQ01lc3NhZ2UsICZDTWVzc2FnZV9UeXBlKTsKLSAgaWYgKHB5X2Ntc2cgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IHNlbGYtPm1lc3NhZ2U7Ci0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OlJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7Ci0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KLSAgICAgIHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoKm1lc3NhZ2UsIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKLQotICBweV9jbXNnLT5mdWxsX25hbWUgPSBzdWJfbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCk7Ci0gIHB5X2Ntc2ctPnBhcmVudCA9IHNlbGY7Ci0gIHB5X2Ntc2ctPnBhcmVudF9maWVsZCA9IGNmaWVsZF9kZXNjcmlwdG9yOwotICBweV9jbXNnLT5tZXNzYWdlID0gY29uc3RfY2FzdDxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKLSAgcHlfY21zZy0+ZnJlZV9tZXNzYWdlID0gZmFsc2U7Ci0gIHB5X2Ntc2ctPnJlYWRfb25seSA9IHRydWU7Ci0gIHJldHVybiByZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4ocHlfY21zZyk7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ01lc3NhZ2VfTXV0YWJsZU1lc3NhZ2UoQ01lc3NhZ2UqIHNlbGYsIFB5T2JqZWN0KiBhcmcpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvciogY2ZpZWxkX2Rlc2NyaXB0b3I7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QgKj4oYXJnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgJkNGaWVsZERlc2NyaXB0b3JfVHlwZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIGZpZWxkIGRlc2NyaXB0b3IiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBjZmllbGRfZGVzY3JpcHRvciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Q0ZpZWxkRGVzY3JpcHRvcio+KGFyZyk7Ci0gIEFzc3VyZVdyaXRhYmxlKHNlbGYpOwotCi0gIENNZXNzYWdlKiBweV9jbXNnID0gUHlPYmplY3RfTmV3KENNZXNzYWdlLCAmQ01lc3NhZ2VfVHlwZSk7Ci0gIGlmIChweV9jbXNnID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UgPSBzZWxmLT5tZXNzYWdlOwotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpOwotICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtdXRhYmxlX21lc3NhZ2UgPQotICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgY2ZpZWxkX2Rlc2NyaXB0b3ItPmRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5KTsKLQotICBweV9jbXNnLT5mdWxsX25hbWUgPSBtdXRhYmxlX21lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkuY19zdHIoKTsKLSAgcHlfY21zZy0+bWVzc2FnZSA9IG11dGFibGVfbWVzc2FnZTsKLSAgcHlfY21zZy0+ZnJlZV9tZXNzYWdlID0gZmFsc2U7Ci0gIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0VxdWFscyhDTWVzc2FnZSogc2VsZiwgUHlPYmplY3QqIGFyZykgewotICBDTWVzc2FnZSogb3RoZXJfbWVzc2FnZTsKLSAgaWYgKCFQeU9iamVjdF9UeXBlQ2hlY2socmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCAqPihhcmcpLCAmQ01lc3NhZ2VfVHlwZSkpIHsKLSAgICBQeUVycl9TZXRTdHJpbmcoUHlFeGNfVHlwZUVycm9yLCAiTXVzdCBiZSBhIG1lc3NhZ2UiKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotICBvdGhlcl9tZXNzYWdlID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGFyZyk7Ci0KLSAgaWYgKG90aGVyX21lc3NhZ2UtPm1lc3NhZ2UgPT0gc2VsZi0+bWVzc2FnZSkgewotICAgIHJldHVybiBQeUJvb2xfRnJvbUxvbmcoMSk7Ci0gIH0KLQotICBpZiAob3RoZXJfbWVzc2FnZS0+bWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpICE9Ci0gICAgICBzZWxmLT5tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpIHsKLSAgICByZXR1cm4gUHlCb29sX0Zyb21Mb25nKDApOwotICB9Ci0KLSAgcmV0dXJuIFB5Qm9vbF9Gcm9tTG9uZygxKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDTWVzc2FnZV9MaXN0RmllbGRzKENNZXNzYWdlKiBzZWxmLCBQeU9iamVjdCogYXJncykgewotICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6UmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKLSAgdmVjdG9yPGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKLSAgcmVmbGVjdGlvbi0+TGlzdEZpZWxkcygqbWVzc2FnZSwgJmZpZWxkcyk7Ci0KLSAgUHlPYmplY3QqIGxpc3QgPSBQeUxpc3RfTmV3KGZpZWxkcy5zaXplKCkpOwotICBpZiAobGlzdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBmb3IgKHVuc2lnbmVkIGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgewotICAgIGJvb2wgaXNfZXh0ZW5zaW9uID0gZmllbGRzW2ldLT5pc19leHRlbnNpb24oKTsKLSAgICBQeU9iamVjdCogdCA9IFB5VHVwbGVfTmV3KDIpOwotICAgIGlmICh0ID09IE5VTEwpIHsKLSAgICAgIFB5X0RFQ1JFRihsaXN0KTsKLSAgICAgIHJldHVybiBOVUxMOwotICAgIH0KLQotICAgIFB5T2JqZWN0KiBpc19leHRlbnNpb25fb2JqZWN0ID0gUHlCb29sX0Zyb21Mb25nKGlzX2V4dGVuc2lvbiA/IDEgOiAwKTsKLQotICAgIFB5T2JqZWN0KiBmaWVsZF9uYW1lOwotICAgIGNvbnN0IHN0cmluZyogczsKLSAgICBpZiAoaXNfZXh0ZW5zaW9uKSB7Ci0gICAgICBzID0gJmZpZWxkc1tpXS0+ZnVsbF9uYW1lKCk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHMgPSAmZmllbGRzW2ldLT5uYW1lKCk7Ci0gICAgfQotICAgIGZpZWxkX25hbWUgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZShzLT5jX3N0cigpLCBzLT5sZW5ndGgoKSk7Ci0gICAgaWYgKGZpZWxkX25hbWUgPT0gTlVMTCkgewotICAgICAgUHlfREVDUkVGKGxpc3QpOwotICAgICAgUHlfREVDUkVGKHQpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotCi0gICAgUHlUdXBsZV9TRVRfSVRFTSh0LCAwLCBpc19leHRlbnNpb25fb2JqZWN0KTsKLSAgICBQeVR1cGxlX1NFVF9JVEVNKHQsIDEsIGZpZWxkX25hbWUpOwotICAgIFB5TGlzdF9TRVRfSVRFTShsaXN0LCBpLCB0KTsKLSAgfQotCi0gIHJldHVybiBsaXN0OwotfQotCi1zdGF0aWMgUHlPYmplY3QqIENNZXNzYWdlX0ZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhDTWVzc2FnZSogc2VsZikgewotICBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBtZXNzYWdlID0gc2VsZi0+bWVzc2FnZTsKLSAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwotICBtZXNzYWdlLT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7Ci0KLSAgUHlPYmplY3QqIGVycm9yX2xpc3QgPSBQeUxpc3RfTmV3KGVycm9ycy5zaXplKCkpOwotICBpZiAoZXJyb3JfbGlzdCA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDA7IGkgPCBlcnJvcnMuc2l6ZSgpOyArK2kpIHsKLSAgICBjb25zdCBzdHJpbmcmIGVycm9yID0gZXJyb3JzW2ldOwotICAgIFB5T2JqZWN0KiBlcnJvcl9zdHJpbmcgPSBQeVN0cmluZ19Gcm9tU3RyaW5nQW5kU2l6ZSgKLSAgICAgICAgZXJyb3IuY19zdHIoKSwgZXJyb3IubGVuZ3RoKCkpOwotICAgIGlmIChlcnJvcl9zdHJpbmcgPT0gTlVMTCkgewotICAgICAgUHlfREVDUkVGKGVycm9yX2xpc3QpOwotICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgfQotICAgIFB5TGlzdF9TRVRfSVRFTShlcnJvcl9saXN0LCBpLCBlcnJvcl9zdHJpbmcpOwotICB9Ci0gIHJldHVybiBlcnJvcl9saXN0OwotfQotCi0vLyAtLS0tLS0gUHl0aG9uIENvbnN0cnVjdG9yOgotCi1QeU9iamVjdCogUHl0aG9uX05ld0NNZXNzYWdlKFB5T2JqZWN0KiBpZ25vcmVkLCBQeU9iamVjdCogYXJnKSB7Ci0gIGNvbnN0IGNoYXIqIG1lc3NhZ2VfdHlwZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZyk7Ci0gIGlmIChtZXNzYWdlX3R5cGUgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSA9IENyZWF0ZU1lc3NhZ2UobWVzc2FnZV90eXBlKTsKLSAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJDb3VsZG4ndCBjcmVhdGUgbWVzc2FnZSBvZiB0eXBlICVzISIsCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBDTWVzc2FnZSogcHlfY21zZyA9IFB5T2JqZWN0X05ldyhDTWVzc2FnZSwgJkNNZXNzYWdlX1R5cGUpOwotICBpZiAocHlfY21zZyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgcHlfY21zZy0+bWVzc2FnZSA9IG1lc3NhZ2UtPk5ldygpOwotICBweV9jbXNnLT5mcmVlX21lc3NhZ2UgPSB0cnVlOwotICBweV9jbXNnLT5mdWxsX25hbWUgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpLmNfc3RyKCk7Ci0gIHB5X2Ntc2ctPnJlYWRfb25seSA9IGZhbHNlOwotICBweV9jbXNnLT5wYXJlbnQgPSBOVUxMOwotICBweV9jbXNnLT5wYXJlbnRfZmllbGQgPSBOVUxMOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KHB5X2Ntc2cpOwotfQotCi0vLyAtLS0gTW9kdWxlIEZ1bmN0aW9ucyAoZXhwb3NlZCB0byBQeXRob24pOgotCi1QeU1ldGhvZERlZiBtZXRob2RzW10gPSB7Ci0gIHsgQygiTmV3Q01lc3NhZ2UiKSwgKFB5Q0Z1bmN0aW9uKVB5dGhvbl9OZXdDTWVzc2FnZSwKLSAgICBNRVRIX08sCi0gICAgQygiQ3JlYXRlcyBhIG5ldyBDKysgcHJvdG9jb2wgbWVzc2FnZSwgZ2l2ZW4gaXRzIGZ1bGwgbmFtZS4iKSB9LAotICB7IEMoIk5ld0NEZXNjcmlwdG9yUG9vbCIpLCAoUHlDRnVuY3Rpb24pUHl0aG9uX05ld0NEZXNjcmlwdG9yUG9vbCwKLSAgICBNRVRIX05PQVJHUywKLSAgICBDKCJDcmVhdGVzIGEgbmV3IEMrKyBkZXNjcmlwdG9yIHBvb2wuIikgfSwKLSAgeyBDKCJCdWlsZEZpbGUiKSwgKFB5Q0Z1bmN0aW9uKVB5dGhvbl9CdWlsZEZpbGUsCi0gICAgTUVUSF9PLAotICAgIEMoIlJlZ2lzdGVycyBhIG5ldyBwcm90b2NvbCBidWZmZXIgZmlsZSBpbiB0aGUgZ2xvYmFsIEMrKyBkZXNjcmlwdG9yICIKLSAgICAgICJwb29sLiIpIH0sCi0gIHtOVUxMfQotfTsKLQotLy8gLS0tIEV4cG9zaW5nIHRoZSBDIHByb3RvIGxpdmluZyBpbnNpZGUgUHl0aG9uIHByb3RvIHRvIEMgY29kZToKLQotZXh0ZXJuIGNvbnN0IE1lc3NhZ2UqICgqR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7Ci1leHRlcm4gTWVzc2FnZSogKCpNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZyk7Ci0KLXN0YXRpYyBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKiBHZXRDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7Ci0gIFB5T2JqZWN0KiBjX21zZ19vYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1zZywgIl9jbXNnIik7Ci0gIGlmIChjX21zZ19vYmogPT0gTlVMTCkgewotICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlfREVDUkVGKGNfbXNnX29iaik7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNfbXNnX29iaiwgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ01lc3NhZ2UqIGNfbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGNfbXNnX29iaik7Ci0gIHJldHVybiBjX21zZy0+bWVzc2FnZTsKLX0KLQotc3RhdGljIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvSW1wbChQeU9iamVjdCogbXNnKSB7Ci0gIFB5T2JqZWN0KiBjX21zZ19vYmogPSBQeU9iamVjdF9HZXRBdHRyU3RyaW5nKG1zZywgIl9jbXNnIik7Ci0gIGlmIChjX21zZ19vYmogPT0gTlVMTCkgewotICAgIFB5RXJyX0NsZWFyKCk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgUHlfREVDUkVGKGNfbXNnX29iaik7Ci0gIGlmICghUHlPYmplY3RfVHlwZUNoZWNrKGNfbXNnX29iaiwgJkNNZXNzYWdlX1R5cGUpKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLSAgQ01lc3NhZ2UqIGNfbXNnID0gcmVpbnRlcnByZXRfY2FzdDxDTWVzc2FnZSo+KGNfbXNnX29iaik7Ci0gIEFzc3VyZVdyaXRhYmxlKGNfbXNnKTsKLSAgcmV0dXJuIGNfbXNnLT5tZXNzYWdlOwotfQotCi0vLyAtLS0gTW9kdWxlIEluaXQgRnVuY3Rpb246Ci0KLXN0YXRpYyBjb25zdCBjaGFyIG1vZHVsZV9kb2NzdHJpbmdbXSA9Ci0icHl0aG9uLXByb3RvMiBpcyBhIG1vZHVsZSB0aGF0IGNhbiBiZSB1c2VkIHRvIGVuaGFuY2UgcHJvdG8yIFB5dGhvbiBBUElcbiIKLSJwZXJmb3JtYW5jZS5cbiIKLSJcbiIKLSJJdCBwcm92aWRlcyBhY2Nlc3MgdG8gdGhlIHByb3RvY29sIGJ1ZmZlcnMgQysrIHJlZmxlY3Rpb24gQVBJIHRoYXRcbiIKLSJpbXBsZW1lbnRzIHRoZSBiYXNpYyBwcm90b2NvbCBidWZmZXIgZnVuY3Rpb25zLiI7Ci0KLWV4dGVybiAiQyIgewotICB2b2lkIGluaXRfbmV0X3Byb3RvMl9fX3B5dGhvbigpIHsKLSAgICAvLyBJbml0aWFsaXplIGNvbnN0YW50cy4KLSAgICBrUHl0aG9uWmVybyA9IFB5SW50X0Zyb21Mb25nKDApOwotICAgIGtpbnQzMm1pbl9weSA9IFB5SW50X0Zyb21Mb25nKGtpbnQzMm1pbik7Ci0gICAga2ludDMybWF4X3B5ID0gUHlJbnRfRnJvbUxvbmcoa2ludDMybWF4KTsKLSAgICBrdWludDMybWF4X3B5ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhrdWludDMybWF4KTsKLSAgICBraW50NjRtaW5fcHkgPSBQeUxvbmdfRnJvbUxvbmdMb25nKGtpbnQ2NG1pbik7Ci0gICAga2ludDY0bWF4X3B5ID0gUHlMb25nX0Zyb21Mb25nTG9uZyhraW50NjRtYXgpOwotICAgIGt1aW50NjRtYXhfcHkgPSBQeUxvbmdfRnJvbVVuc2lnbmVkTG9uZ0xvbmcoa3VpbnQ2NG1heCk7Ci0KLSAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5ID0gbmV3IER5bmFtaWNNZXNzYWdlRmFjdG9yeShHZXREZXNjcmlwdG9yUG9vbCgpKTsKLSAgICBnbG9iYWxfbWVzc2FnZV9mYWN0b3J5LT5TZXREZWxlZ2F0ZVRvR2VuZXJhdGVkRmFjdG9yeSh0cnVlKTsKLQotICAgIC8vIEV4cG9ydCBvdXIgZnVuY3Rpb25zIHRvIFB5dGhvbi4KLSAgICBQeU9iamVjdCAqbTsKLSAgICBtID0gUHlfSW5pdE1vZHVsZTMoQygiX25ldF9wcm90bzJfX19weXRob24iKSwgbWV0aG9kcywgQyhtb2R1bGVfZG9jc3RyaW5nKSk7Ci0gICAgaWYgKG0gPT0gTlVMTCkgewotICAgICAgcmV0dXJuOwotICAgIH0KLQotICAgIEFkZENvbnN0YW50cyhtKTsKLQotICAgIENNZXNzYWdlX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7Ci0gICAgaWYgKFB5VHlwZV9SZWFkeSgmQ01lc3NhZ2VfVHlwZSkgPCAwKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgaWYgKCFJbml0RGVzY3JpcHRvcigpKSB7Ci0gICAgICByZXR1cm47Ci0gICAgfQotCi0gICAgLy8gT3ZlcnJpZGUge0dldCxNdXRhYmxlfUNQcm90b0luc2lkZVB5UHJvdG8uCi0gICAgR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0ciA9IEdldENQcm90b0luc2lkZVB5UHJvdG9JbXBsOwotICAgIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvUHRyID0gTXV0YWJsZUNQcm90b0luc2lkZVB5UHJvdG9JbXBsOwotICB9Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBweXRob24KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5jYwpkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggZmI4N2JhZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5jYworKysgL2Rldi9udWxsCkBAIC0xLDMzNCArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHBldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdikKLQotI2luY2x1ZGUgPFB5dGhvbi5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLQotI2RlZmluZSBDKHN0cikgY29uc3RfY2FzdDxjaGFyKj4oc3RyKQotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgcHl0aG9uIHsKLQotc3RhdGljIHZvaWQgQ0ZpZWxkRGVzY3JpcHRvckRlYWxsb2MoQ0ZpZWxkRGVzY3JpcHRvciogc2VsZik7Ci0KLXN0YXRpYyBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbCogZ19kZXNjcmlwdG9yX3Bvb2wgPSBOVUxMOwotCi1zdGF0aWMgUHlPYmplY3QqIENGaWVsZERlc2NyaXB0b3JfR2V0RnVsbE5hbWUoCi0gICAgQ0ZpZWxkRGVzY3JpcHRvciogc2VsZiwgdm9pZCAqY2xvc3VyZSkgewotICBQeV9YSU5DUkVGKHNlbGYtPmZ1bGxfbmFtZSk7Ci0gIHJldHVybiBzZWxmLT5mdWxsX25hbWU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ0ZpZWxkRGVzY3JpcHRvcl9HZXROYW1lKAotICAgIENGaWVsZERlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgUHlfWElOQ1JFRihzZWxmLT5uYW1lKTsKLSAgcmV0dXJuIHNlbGYtPm5hbWU7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ0ZpZWxkRGVzY3JpcHRvcl9HZXRDcHBUeXBlKAotICAgIENGaWVsZERlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgUHlfWElOQ1JFRihzZWxmLT5jcHBfdHlwZSk7Ci0gIHJldHVybiBzZWxmLT5jcHBfdHlwZTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDRmllbGREZXNjcmlwdG9yX0dldExhYmVsKAotICAgIENGaWVsZERlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgUHlfWElOQ1JFRihzZWxmLT5sYWJlbCk7Ci0gIHJldHVybiBzZWxmLT5sYWJlbDsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDRmllbGREZXNjcmlwdG9yX0dldElEKAotICAgIENGaWVsZERlc2NyaXB0b3IgKnNlbGYsIHZvaWQgKmNsb3N1cmUpIHsKLSAgUHlfWElOQ1JFRihzZWxmLT5pZCk7Ci0gIHJldHVybiBzZWxmLT5pZDsKLX0KLQotCi1zdGF0aWMgUHlHZXRTZXREZWYgQ0ZpZWxkRGVzY3JpcHRvckdldHRlcnNbXSA9IHsKLSAgeyBDKCJmdWxsX25hbWUiKSwKLSAgICAoZ2V0dGVyKUNGaWVsZERlc2NyaXB0b3JfR2V0RnVsbE5hbWUsIE5VTEwsICJGdWxsIG5hbWUiLCBOVUxMfSwKLSAgeyBDKCJuYW1lIiksCi0gICAgKGdldHRlcilDRmllbGREZXNjcmlwdG9yX0dldE5hbWUsIE5VTEwsICJsYXN0IG5hbWUiLCBOVUxMfSwKLSAgeyBDKCJjcHBfdHlwZSIpLAotICAgIChnZXR0ZXIpQ0ZpZWxkRGVzY3JpcHRvcl9HZXRDcHBUeXBlLCBOVUxMLCAiQysrIFR5cGUiLCBOVUxMfSwKLSAgeyBDKCJsYWJlbCIpLAotICAgIChnZXR0ZXIpQ0ZpZWxkRGVzY3JpcHRvcl9HZXRMYWJlbCwgTlVMTCwgIkxhYmVsIiwgTlVMTH0sCi0gIHsgQygiaWQiKSwKLSAgICAoZ2V0dGVyKUNGaWVsZERlc2NyaXB0b3JfR2V0SUQsIE5VTEwsICJJRCIsIE5VTEx9LAotICB7TlVMTH0KLX07Ci0KLVB5VHlwZU9iamVjdCBDRmllbGREZXNjcmlwdG9yX1R5cGUgPSB7Ci0gIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0gIDAsCi0gIEMoImdvb2dsZTMubmV0Lmdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuIgotICAgICJfbmV0X3Byb3RvMl9fX3B5dGhvbi4iCi0gICAgIkNGaWVsZERlc2NyaXB0b3IiKSwgICAgICAgICAgICAgICAgLy8gdHBfbmFtZQotICBzaXplb2YoQ0ZpZWxkRGVzY3JpcHRvciksICAgICAgICAgICAgIC8vIHRwX2Jhc2ljc2l6ZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZW1zaXplCi0gIChkZXN0cnVjdG9yKUNGaWVsZERlc2NyaXB0b3JEZWFsbG9jLCAgLy8gdHBfZGVhbGxvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3ByaW50Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3NldGF0dHIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jb21wYXJlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX251bWJlcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX3NlcXVlbmNlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2hhc2gKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jYWxsCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9zZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgotICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZsYWdzCi0gIEMoIkEgRmllbGQgRGVzY3JpcHRvciIpLCAgICAgICAgICAgICAgLy8gdHBfZG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9jbGVhcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX3JpY2hjb21wYXJlCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pdGVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaXRlcm5leHQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZXRob2RzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfbWVtYmVycwotICBDRmllbGREZXNjcmlwdG9yR2V0dGVycywgICAgICAgICAgICAgIC8vIHRwX2dldHNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Jhc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3JfZ2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3Jfc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGljdG9mZnNldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2luaXQKLSAgUHlUeXBlX0dlbmVyaWNBbGxvYywgICAgICAgICAgICAgICAgICAvLyB0cF9hbGxvYwotICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgIC8vIHRwX25ldwotICBQeU9iamVjdF9EZWwsICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2ZyZWUKLX07Ci0KLXN0YXRpYyB2b2lkIENGaWVsZERlc2NyaXB0b3JEZWFsbG9jKENGaWVsZERlc2NyaXB0b3IqIHNlbGYpIHsKLSAgUHlfREVDUkVGKHNlbGYtPmZ1bGxfbmFtZSk7Ci0gIFB5X0RFQ1JFRihzZWxmLT5uYW1lKTsKLSAgUHlfREVDUkVGKHNlbGYtPmNwcF90eXBlKTsKLSAgUHlfREVDUkVGKHNlbGYtPmxhYmVsKTsKLSAgUHlfREVDUkVGKHNlbGYtPmlkKTsKLSAgc2VsZi0+b2JfdHlwZS0+dHBfZnJlZShyZWludGVycHJldF9jYXN0PFB5T2JqZWN0Kj4oc2VsZikpOwotfQotCi10eXBlZGVmIHN0cnVjdCB7Ci0gIFB5T2JqZWN0X0hFQUQKLQotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbCogcG9vbDsKLX0gQ0Rlc2NyaXB0b3JQb29sOwotCi1zdGF0aWMgdm9pZCBDRGVzY3JpcHRvclBvb2xEZWFsbG9jKENEZXNjcmlwdG9yUG9vbCogc2VsZik7Ci0KLXN0YXRpYyBQeU9iamVjdCogQ0Rlc2NyaXB0b3JQb29sX05ld0NEZXNjcmlwdG9yKAotICAgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcikgewotICBDRmllbGREZXNjcmlwdG9yKiBjZmllbGRfZGVzY3JpcHRvciA9IFB5T2JqZWN0X05ldygKLSAgICAgIENGaWVsZERlc2NyaXB0b3IsICZDRmllbGREZXNjcmlwdG9yX1R5cGUpOwotICBpZiAoY2ZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNmaWVsZF9kZXNjcmlwdG9yLT5kZXNjcmlwdG9yID0gZmllbGRfZGVzY3JpcHRvcjsKLQotICBjZmllbGRfZGVzY3JpcHRvci0+ZnVsbF9uYW1lID0gUHlTdHJpbmdfRnJvbVN0cmluZygKLSAgICAgIGZpZWxkX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOwotICBjZmllbGRfZGVzY3JpcHRvci0+bmFtZSA9IFB5U3RyaW5nX0Zyb21TdHJpbmcoCi0gICAgICBmaWVsZF9kZXNjcmlwdG9yLT5uYW1lKCkuY19zdHIoKSk7Ci0gIGNmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSA9IFB5TG9uZ19Gcm9tTG9uZyhmaWVsZF9kZXNjcmlwdG9yLT5jcHBfdHlwZSgpKTsKLSAgY2ZpZWxkX2Rlc2NyaXB0b3ItPmxhYmVsID0gUHlMb25nX0Zyb21Mb25nKGZpZWxkX2Rlc2NyaXB0b3ItPmxhYmVsKCkpOwotICBjZmllbGRfZGVzY3JpcHRvci0+aWQgPSBQeUxvbmdfRnJvbVZvaWRQdHIoY2ZpZWxkX2Rlc2NyaXB0b3IpOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KGNmaWVsZF9kZXNjcmlwdG9yKTsKLX0KLQotc3RhdGljIFB5T2JqZWN0KiBDRGVzY3JpcHRvclBvb2xfRmluZEZpZWxkQnlOYW1lKAotICAgIENEZXNjcmlwdG9yUG9vbCogc2VsZiwgUHlPYmplY3QqIGFyZykgewotICBjb25zdCBjaGFyKiBmdWxsX2ZpZWxkX25hbWUgPSBQeVN0cmluZ19Bc1N0cmluZyhhcmcpOwotICBpZiAoZnVsbF9maWVsZF9uYW1lID09IE5VTEwpIHsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvciA9IE5VTEw7Ci0KLSAgZmllbGRfZGVzY3JpcHRvciA9IHNlbGYtPnBvb2wtPkZpbmRGaWVsZEJ5TmFtZShmdWxsX2ZpZWxkX25hbWUpOwotICBpZiAoZmllbGRfZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfRm9ybWF0KFB5RXhjX1R5cGVFcnJvciwgIkNvdWxkbid0IGZpbmQgZmllbGQgJS4yMDBzIiwKLSAgICAgICAgICAgICAgICAgZnVsbF9maWVsZF9uYW1lKTsKLSAgICByZXR1cm4gTlVMTDsKLSAgfQotCi0gIHJldHVybiBDRGVzY3JpcHRvclBvb2xfTmV3Q0Rlc2NyaXB0b3IoZmllbGRfZGVzY3JpcHRvcik7Ci19Ci0KLXN0YXRpYyBQeU9iamVjdCogQ0Rlc2NyaXB0b3JQb29sX0ZpbmRFeHRlbnNpb25CeU5hbWUoCi0gICAgQ0Rlc2NyaXB0b3JQb29sKiBzZWxmLCBQeU9iamVjdCogYXJnKSB7Ci0gIGNvbnN0IGNoYXIqIGZ1bGxfZmllbGRfbmFtZSA9IFB5U3RyaW5nX0FzU3RyaW5nKGFyZyk7Ci0gIGlmIChmdWxsX2ZpZWxkX25hbWUgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0KLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yID0KLSAgICAgIHNlbGYtPnBvb2wtPkZpbmRFeHRlbnNpb25CeU5hbWUoZnVsbF9maWVsZF9uYW1lKTsKLSAgaWYgKGZpZWxkX2Rlc2NyaXB0b3IgPT0gTlVMTCkgewotICAgIFB5RXJyX0Zvcm1hdChQeUV4Y19UeXBlRXJyb3IsICJDb3VsZG4ndCBmaW5kIGZpZWxkICUuMjAwcyIsCi0gICAgICAgICAgICAgICAgIGZ1bGxfZmllbGRfbmFtZSk7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICByZXR1cm4gQ0Rlc2NyaXB0b3JQb29sX05ld0NEZXNjcmlwdG9yKGZpZWxkX2Rlc2NyaXB0b3IpOwotfQotCi1zdGF0aWMgUHlNZXRob2REZWYgQ0Rlc2NyaXB0b3JQb29sTWV0aG9kc1tdID0gewotICB7IEMoIkZpbmRGaWVsZEJ5TmFtZSIpLAotICAgIChQeUNGdW5jdGlvbilDRGVzY3JpcHRvclBvb2xfRmluZEZpZWxkQnlOYW1lLAotICAgIE1FVEhfTywKLSAgICBDKCJTZWFyY2hlcyBmb3IgYSBmaWVsZCBkZXNjcmlwdG9yIGJ5IGZ1bGwgbmFtZS4iKSB9LAotICB7IEMoIkZpbmRFeHRlbnNpb25CeU5hbWUiKSwKLSAgICAoUHlDRnVuY3Rpb24pQ0Rlc2NyaXB0b3JQb29sX0ZpbmRFeHRlbnNpb25CeU5hbWUsCi0gICAgTUVUSF9PLAotICAgIEMoIlNlYXJjaGVzIGZvciBleHRlbnNpb24gZGVzY3JpcHRvciBieSBmdWxsIG5hbWUuIikgfSwKLSAge05VTEx9Ci19OwotCi1QeVR5cGVPYmplY3QgQ0Rlc2NyaXB0b3JQb29sX1R5cGUgPSB7Ci0gIFB5T2JqZWN0X0hFQURfSU5JVCgmUHlUeXBlX1R5cGUpCi0gIDAsCi0gIEMoImdvb2dsZTMubmV0Lmdvb2dsZS5wcm90b2J1Zi5weXRob24uaW50ZXJuYWwuIgotICAgICJfbmV0X3Byb3RvMl9fX3B5dGhvbi4iCi0gICAgIkNGaWVsZERlc2NyaXB0b3IiKSwgICAgICAgICAgICAgICAvLyB0cF9uYW1lCi0gIHNpemVvZihDRGVzY3JpcHRvclBvb2wpLCAgICAgICAgICAgICAvLyB0cF9iYXNpY3NpemUKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZW1zaXplCi0gIChkZXN0cnVjdG9yKUNEZXNjcmlwdG9yUG9vbERlYWxsb2MsICAvLyB0cF9kZWFsbG9jCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9wcmludAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZ2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfcmVwcgotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbnVtYmVyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9hc19zZXF1ZW5jZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfYXNfbWFwcGluZwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfaGFzaAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfY2FsbAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc3RyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRhdHRybwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfc2V0YXR0cm8KLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2FzX2J1ZmZlcgotICBQeV9UUEZMQUdTX0RFRkFVTFQsICAgICAgICAgICAgICAgICAgLy8gdHBfZmxhZ3MKLSAgQygiQSBEZXNjcmlwdG9yIFBvb2wiKSwgICAgICAgICAgICAgIC8vIHRwX2RvYwotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfdHJhdmVyc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2NsZWFyCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9yaWNoY29tcGFyZQotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfd2Vha2xpc3RvZmZzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXIKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2l0ZXJuZXh0Ci0gIENEZXNjcmlwdG9yUG9vbE1ldGhvZHMsICAgICAgICAgICAgICAvLyB0cF9tZXRob2RzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9tZW1iZXJzCi0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9nZXRzZXQKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Jhc2UKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2RpY3QKLSAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRwX2Rlc2NyX2dldAotICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdHBfZGVzY3Jfc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9kaWN0b2Zmc2V0Ci0gIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9pbml0Ci0gIFB5VHlwZV9HZW5lcmljQWxsb2MsICAgICAgICAgICAgICAgICAvLyB0cF9hbGxvYwotICBQeVR5cGVfR2VuZXJpY05ldywgICAgICAgICAgICAgICAgICAgLy8gdHBfbmV3Ci0gIFB5T2JqZWN0X0RlbCwgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cF9mcmVlCi19OwotCi1zdGF0aWMgdm9pZCBDRGVzY3JpcHRvclBvb2xEZWFsbG9jKENEZXNjcmlwdG9yUG9vbCogc2VsZikgewotICBzZWxmLT5vYl90eXBlLT50cF9mcmVlKHJlaW50ZXJwcmV0X2Nhc3Q8UHlPYmplY3QqPihzZWxmKSk7Ci19Ci0KLWdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sKiBHZXREZXNjcmlwdG9yUG9vbCgpIHsKLSAgaWYgKGdfZGVzY3JpcHRvcl9wb29sID09IE5VTEwpIHsKLSAgICBnX2Rlc2NyaXB0b3JfcG9vbCA9IG5ldyBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbCgKLSAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCkpOwotICB9Ci0gIHJldHVybiBnX2Rlc2NyaXB0b3JfcG9vbDsKLX0KLQotUHlPYmplY3QqIFB5dGhvbl9OZXdDRGVzY3JpcHRvclBvb2woUHlPYmplY3QqIGlnbm9yZWQsIFB5T2JqZWN0KiBhcmdzKSB7Ci0gIENEZXNjcmlwdG9yUG9vbCogY2Rlc2NyaXB0b3JfcG9vbCA9IFB5T2JqZWN0X05ldygKLSAgICAgIENEZXNjcmlwdG9yUG9vbCwgJkNEZXNjcmlwdG9yUG9vbF9UeXBlKTsKLSAgaWYgKGNkZXNjcmlwdG9yX3Bvb2wgPT0gTlVMTCkgewotICAgIHJldHVybiBOVUxMOwotICB9Ci0gIGNkZXNjcmlwdG9yX3Bvb2wtPnBvb2wgPSBHZXREZXNjcmlwdG9yUG9vbCgpOwotICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxQeU9iamVjdCo+KGNkZXNjcmlwdG9yX3Bvb2wpOwotfQotCi1QeU9iamVjdCogUHl0aG9uX0J1aWxkRmlsZShQeU9iamVjdCogaWdub3JlZCwgUHlPYmplY3QqIGFyZykgewotICBjaGFyKiBtZXNzYWdlX3R5cGU7Ci0gIFB5X3NzaXplX3QgbWVzc2FnZV9sZW47Ci0KLSAgaWYgKFB5U3RyaW5nX0FzU3RyaW5nQW5kU2l6ZShhcmcsICZtZXNzYWdlX3R5cGUsICZtZXNzYWdlX2xlbikgPCAwKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIGlmICghZmlsZV9wcm90by5QYXJzZUZyb21BcnJheShtZXNzYWdlX3R5cGUsIG1lc3NhZ2VfbGVuKSkgewotICAgIFB5RXJyX1NldFN0cmluZyhQeUV4Y19UeXBlRXJyb3IsICJDb3VsZG4ndCBwYXJzZSBmaWxlIGNvbnRlbnQhIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICAvLyBJZiB0aGlzIGZpbGUgaXMgYWxyZWFkeSBpbiB0aGUgZ2VuZXJhdGVkIHBvb2wsIGRvbid0IGFkZCBpdCBhZ2Fpbi4KLSAgaWYgKGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLT5GaW5kRmlsZUJ5TmFtZSgKLSAgICAgIGZpbGVfcHJvdG8ubmFtZSgpKSAhPSBOVUxMKSB7Ci0gICAgUHlfUkVUVVJOX05PTkU7Ci0gIH0KLQotICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IEdldERlc2NyaXB0b3JQb29sKCktPkJ1aWxkRmlsZSgKLSAgICAgIGZpbGVfcHJvdG8pOwotICBpZiAoZGVzY3JpcHRvciA9PSBOVUxMKSB7Ci0gICAgUHlFcnJfU2V0U3RyaW5nKFB5RXhjX1R5cGVFcnJvciwKLSAgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IGJ1aWxkIHByb3RvIGZpbGUgaW50byBkZXNjcmlwdG9yIHBvb2whIik7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0KLQotICBQeV9SRVRVUk5fTk9ORTsKLX0KLQotYm9vbCBJbml0RGVzY3JpcHRvcigpIHsKLSAgQ0ZpZWxkRGVzY3JpcHRvcl9UeXBlLnRwX25ldyA9IFB5VHlwZV9HZW5lcmljTmV3OwotICBpZiAoUHlUeXBlX1JlYWR5KCZDRmllbGREZXNjcmlwdG9yX1R5cGUpIDwgMCkKLSAgICByZXR1cm4gZmFsc2U7Ci0KLSAgQ0Rlc2NyaXB0b3JQb29sX1R5cGUudHBfbmV3ID0gUHlUeXBlX0dlbmVyaWNOZXc7Ci0gIGlmIChQeVR5cGVfUmVhZHkoJkNEZXNjcmlwdG9yUG9vbF9UeXBlKSA8IDApCi0gICAgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi19ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggNTIzMjY4MC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9weWV4dC9weXRob25fZGVzY3JpcHRvci5oCisrKyAvZGV2L251bGwKQEAgLTEsODcgKzAsMCBAQAotLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0vLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLS8vCi0vLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLS8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLS8vIG1ldDoKLS8vCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotLy8gZGlzdHJpYnV0aW9uLgotLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLS8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0vLwotLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLS8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0vLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLS8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLS8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotLy8gQXV0aG9yOiBwZXRhckBnb29nbGUuY29tIChQZXRhciBQZXRyb3YpCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9ERVNDUklQVE9SX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUFlUSE9OX0RFU0NSSVBUT1JfSF9fCi0KLSNpbmNsdWRlIDxQeXRob24uaD4KLSNpbmNsdWRlIDxzdHJ1Y3RtZW1iZXIuaD4KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0KLSNpZiBQWV9WRVJTSU9OX0hFWCA8IDB4MDIwNTAwMDAgJiYgIWRlZmluZWQoUFlfU1NJWkVfVF9NSU4pCi10eXBlZGVmIGludCBQeV9zc2l6ZV90OwotI2RlZmluZSBQWV9TU0laRV9UX01BWCBJTlRfTUFYCi0jZGVmaW5lIFBZX1NTSVpFX1RfTUlOIElOVF9NSU4KLSNlbmRpZgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci1uYW1lc3BhY2UgcHl0aG9uIHsKLQotdHlwZWRlZiBzdHJ1Y3QgewotICBQeU9iamVjdF9IRUFECi0KLSAgLy8gVGhlIHByb3RvMiBkZXNjcmlwdG9yIHRoYXQgdGhpcyBvYmplY3QgcmVwcmVzZW50cy4KLSAgY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yOwotCi0gIC8vIEZ1bGwgbmFtZSBvZiB0aGUgZmllbGQgKFB5U3RyaW5nKS4KLSAgUHlPYmplY3QqIGZ1bGxfbmFtZTsKLQotICAvLyBOYW1lIG9mIHRoZSBmaWVsZCAoUHlTdHJpbmcpLgotICBQeU9iamVjdCogbmFtZTsKLQotICAvLyBDKysgdHlwZSBvZiB0aGUgZmllbGQgKFB5TG9uZykuCi0gIFB5T2JqZWN0KiBjcHBfdHlwZTsKLQotICAvLyBOYW1lIG9mIHRoZSBmaWVsZCAoUHlMb25nKS4KLSAgUHlPYmplY3QqIGxhYmVsOwotCi0gIC8vIElkZW50aXR5IG9mIHRoZSBkZXNjcmlwdG9yIChQeUxvbmcgdXNlZCBhcyBhIHBvaW5lcikuCi0gIFB5T2JqZWN0KiBpZDsKLX0gQ0ZpZWxkRGVzY3JpcHRvcjsKLQotZXh0ZXJuIFB5VHlwZU9iamVjdCBDRmllbGREZXNjcmlwdG9yX1R5cGU7Ci0KLWV4dGVybiBQeVR5cGVPYmplY3QgQ0Rlc2NyaXB0b3JQb29sX1R5cGU7Ci0KLQotUHlPYmplY3QqIFB5dGhvbl9OZXdDRGVzY3JpcHRvclBvb2woUHlPYmplY3QqIGlnbm9yZWQsIFB5T2JqZWN0KiBhcmdzKTsKLVB5T2JqZWN0KiBQeXRob25fQnVpbGRGaWxlKFB5T2JqZWN0KiBpZ25vcmVkLCBQeU9iamVjdCogYXJncyk7Ci1ib29sIEluaXREZXNjcmlwdG9yKCk7Ci1nb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbCogR2V0RGVzY3JpcHRvclBvb2woKTsKLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9ERVNDUklQVE9SX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmNjCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAxYjFhYjVkLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5jYworKysgL2Rldi9udWxsCkBAIC0xLDYzICswLDAgQEAKLS8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0vLwotLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0vLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0vLyBtZXQ6Ci0vLwotLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLS8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLS8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLS8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLS8vIGRpc3RyaWJ1dGlvbi4KLS8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLS8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0vLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotLy8KLS8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLS8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLS8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0vLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLS8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLS8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0vLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0vLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLS8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLS8vIEF1dGhvcjogcXJjemFrQGdvb2dsZS5jb20gKE1hcmNpbiBLb3dhbGN6eWspCi0KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLW5hbWVzcGFjZSBweXRob24gewotCi1zdGF0aWMgY29uc3QgTWVzc2FnZSogR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1N0dWIoUHlPYmplY3QqIG1zZykgewotICByZXR1cm4gTlVMTDsKLX0KLXN0YXRpYyBNZXNzYWdlKiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1N0dWIoUHlPYmplY3QqIG1zZykgewotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gVGhpcyBpcyBpbml0aWFsaXplZCB3aXRoIGEgZGVmYXVsdCwgc3R1YiBpbXBsZW1lbnRhdGlvbi4KLS8vIElmIHB5dGhvbi1nb29nbGUucHJvdG9idWYuY2MgaXMgbG9hZGVkLCB0aGUgZnVuY3Rpb24gcG9pbnRlciBpcyBvdmVycmlkZGVuCi0vLyB3aXRoIGEgZnVsbCBpbXBsZW1lbnRhdGlvbi4KLWNvbnN0IE1lc3NhZ2UqICgqR2V0Q1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZykgPQotICAgIEdldENQcm90b0luc2lkZVB5UHJvdG9TdHViOwotTWVzc2FnZSogKCpNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cikoUHlPYmplY3QqIG1zZykgPQotICAgIE11dGFibGVDUHJvdG9JbnNpZGVQeVByb3RvU3R1YjsKLQotY29uc3QgTWVzc2FnZSogR2V0Q1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKSB7Ci0gIHJldHVybiBHZXRDUHJvdG9JbnNpZGVQeVByb3RvUHRyKG1zZyk7Ci19Ci1NZXNzYWdlKiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKSB7Ci0gIHJldHVybiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90b1B0cihtc2cpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcHl0aG9uCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbl9wcm90b2J1Zi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGM1YjBiMWMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmgKKysrIC9kZXYvbnVsbApAQCAtMSw1NyArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBBdXRob3I6IHFyY3pha0Bnb29nbGUuY29tIChNYXJjaW4gS293YWxjenlrKQotLy8KLS8vIFRoaXMgbW9kdWxlIGV4cG9zZXMgdGhlIEMgcHJvdG8gaW5zaWRlIHRoZSBnaXZlbiBQeXRob24gcHJvdG8sIGluCi0vLyBjYXNlIHRoZSBQeXRob24gcHJvdG8gaXMgaW1wbGVtZW50ZWQgd2l0aCBhIEMgcHJvdG8uCi0KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QWVRIT05fUFJPVE9CVUZfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QWVRIT05fUFlUSE9OX1BST1RPQlVGX0hfXwotCi0jaW5jbHVkZSA8UHl0aG9uLmg+Ci0KLW5hbWVzcGFjZSBnb29nbGUgewotbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotY2xhc3MgTWVzc2FnZTsKLQotbmFtZXNwYWNlIHB5dGhvbiB7Ci0KLS8vIFJldHVybiB0aGUgcG9pbnRlciB0byB0aGUgQyBwcm90byBpbnNpZGUgdGhlIGdpdmVuIFB5dGhvbiBwcm90bywKLS8vIG9yIE5VTEwgd2hlbiB0aGlzIGlzIG5vdCBhIFB5dGhvbiBwcm90byBpbXBsZW1lbnRlZCB3aXRoIGEgQyBwcm90by4KLWNvbnN0IE1lc3NhZ2UqIEdldENQcm90b0luc2lkZVB5UHJvdG8oUHlPYmplY3QqIG1zZyk7Ci1NZXNzYWdlKiBNdXRhYmxlQ1Byb3RvSW5zaWRlUHlQcm90byhQeU9iamVjdCogbXNnKTsKLQotfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0KLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BZVEhPTl9QWVRIT05fUFJPVE9CVUZfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMTM3M2M4OC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTQyICswLDAgQEAKLSMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0Ci0jIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCi0jCi0jIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCi0jIG1ldDoKLSMKLSMgICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKLSMgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0jIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKLSMgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQotIyBkaXN0cmlidXRpb24uCi0jICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKLSMgY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KLSMgdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLSMKLSMgVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUwotIyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKLSMgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKLSMgT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0jIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCi0jIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotIyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCi0jIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQotIyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0jIFRoaXMgY29kZSBpcyBtZWFudCB0byB3b3JrIG9uIFB5dGhvbiAyLjQgYW5kIGFib3ZlIG9ubHkuCi0KLSIiIkNvbnRhaW5zIGEgbWV0YWNsYXNzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHVzZWQgdG8gY3JlYXRlCi1wcm90b2NvbCBtZXNzYWdlIGNsYXNzZXMgZnJvbSBEZXNjcmlwdG9yIG9iamVjdHMgYXQgcnVudGltZS4KLQotUmVjYWxsIHRoYXQgYSBtZXRhY2xhc3MgaXMgdGhlICJ0eXBlIiBvZiBhIGNsYXNzLgotKEEgY2xhc3MgaXMgdG8gYSBtZXRhY2xhc3Mgd2hhdCBhbiBpbnN0YW5jZSBpcyB0byBhIGNsYXNzLikKLQotSW4gdGhpcyBjYXNlLCB3ZSB1c2UgdGhlIEdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUgbWV0YWNsYXNzCi10byBpbmplY3QgYWxsIHRoZSB1c2VmdWwgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBjbGFzc2VzCi1vdXRwdXQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyIGF0IGNvbXBpbGUtdGltZS4KLQotVGhlIHVwc2hvdCBvZiBhbGwgdGhpcyBpcyB0aGF0IHRoZSByZWFsIGltcGxlbWVudGF0aW9uCi1kZXRhaWxzIGZvciBBTEwgcHVyZS1QeXRob24gcHJvdG9jb2wgYnVmZmVycyBhcmUgKmhlcmUgaW4KLXRoaXMgZmlsZSouCi0iIiIKLQotX19hdXRob3JfXyA9ICdyb2JpbnNvbkBnb29nbGUuY29tIChXaWxsIFJvYmluc29uKScKLQotCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgYXBpX2ltcGxlbWVudGF0aW9uCi1mcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvciBhcyBkZXNjcmlwdG9yX21vZAotX0ZpZWxkRGVzY3JpcHRvciA9IGRlc2NyaXB0b3JfbW9kLkZpZWxkRGVzY3JpcHRvcgotCi0KLWlmIGFwaV9pbXBsZW1lbnRhdGlvbi5UeXBlKCkgPT0gJ2NwcCc6Ci0gIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBjcHBfbWVzc2FnZQotICBfTmV3TWVzc2FnZSA9IGNwcF9tZXNzYWdlLk5ld01lc3NhZ2UKLSAgX0luaXRNZXNzYWdlID0gY3BwX21lc3NhZ2UuSW5pdE1lc3NhZ2UKLWVsc2U6Ci0gIGZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBweXRob25fbWVzc2FnZQotICBfTmV3TWVzc2FnZSA9IHB5dGhvbl9tZXNzYWdlLk5ld01lc3NhZ2UKLSAgX0luaXRNZXNzYWdlID0gcHl0aG9uX21lc3NhZ2UuSW5pdE1lc3NhZ2UKLQotCi1jbGFzcyBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlKHR5cGUpOgotCi0gICIiIk1ldGFjbGFzcyBmb3IgcHJvdG9jb2wgbWVzc2FnZSBjbGFzc2VzIGNyZWF0ZWQgYXQgcnVudGltZSBmcm9tIERlc2NyaXB0b3JzLgotCi0gIFdlIGFkZCBpbXBsZW1lbnRhdGlvbnMgZm9yIGFsbCBtZXRob2RzIGRlc2NyaWJlZCBpbiB0aGUgTWVzc2FnZSBjbGFzcy4gIFdlCi0gIGFsc28gY3JlYXRlIHByb3BlcnRpZXMgdG8gYWxsb3cgZ2V0dGluZy9zZXR0aW5nIGFsbCBmaWVsZHMgaW4gdGhlIHByb3RvY29sCi0gIG1lc3NhZ2UuICBGaW5hbGx5LCB3ZSBjcmVhdGUgc2xvdHMgdG8gcHJldmVudCB1c2VycyBmcm9tIGFjY2lkZW50YWxseQotICAic2V0dGluZyIgbm9uZXhpc3RlbnQgZmllbGRzIGluIHRoZSBwcm90b2NvbCBtZXNzYWdlLCB3aGljaCB0aGVuIHdvdWxkbid0IGdldAotICBzZXJpYWxpemVkIC8gZGVzZXJpYWxpemVkIHByb3Blcmx5LgotCi0gIFRoZSBwcm90b2NvbCBjb21waWxlciBjdXJyZW50bHkgdXNlcyB0aGlzIG1ldGFjbGFzcyB0byBjcmVhdGUgcHJvdG9jb2wKLSAgbWVzc2FnZSBjbGFzc2VzIGF0IHJ1bnRpbWUuICBDbGllbnRzIGNhbiBhbHNvIG1hbnVhbGx5IGNyZWF0ZSB0aGVpciBvd24KLSAgY2xhc3NlcyBhdCBydW50aW1lLCBhcyBpbiB0aGlzIGV4YW1wbGU6Ci0KLSAgbXlkZXNjcmlwdG9yID0gRGVzY3JpcHRvciguLi4uLikKLSAgY2xhc3MgTXlQcm90b0NsYXNzKE1lc3NhZ2UpOgotICAgIF9fbWV0YWNsYXNzX18gPSBHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlCi0gICAgREVTQ1JJUFRPUiA9IG15ZGVzY3JpcHRvcgotICBteXByb3RvX2luc3RhbmNlID0gTXlQcm90b0NsYXNzKCkKLSAgbXlwcm90by5mb29fZmllbGQgPSAyMwotICAuLi4KLSAgIiIiCi0KLSAgIyBNdXN0IGJlIGNvbnNpc3RlbnQgd2l0aCB0aGUgcHJvdG9jb2wtY29tcGlsZXIgY29kZSBpbgotICAjIHByb3RvMi9jb21waWxlci9pbnRlcm5hbC9nZW5lcmF0b3IuKi4KLSAgX0RFU0NSSVBUT1JfS0VZID0gJ0RFU0NSSVBUT1InCi0KLSAgZGVmIF9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSk6Ci0gICAgIiIiQ3VzdG9tIGFsbG9jYXRpb24gZm9yIHJ1bnRpbWUtZ2VuZXJhdGVkIGNsYXNzIHR5cGVzLgotCi0gICAgV2Ugb3ZlcnJpZGUgX19uZXdfXyBiZWNhdXNlIHRoaXMgaXMgYXBwYXJlbnRseSB0aGUgb25seSBwbGFjZQotICAgIHdoZXJlIHdlIGNhbiBtZWFuaW5nZnVsbHkgc2V0IF9fc2xvdHNfXyBvbiB0aGUgY2xhc3Mgd2UncmUgY3JlYXRpbmcoPykuCi0gICAgKFRoZSBpbnRlcnBsYXkgYmV0d2VlbiBtZXRhY2xhc3NlcyBhbmQgc2xvdHMgaXMgbm90IHZlcnkgd2VsbC1kb2N1bWVudGVkKS4KLQotICAgIEFyZ3M6Ci0gICAgICBuYW1lOiBOYW1lIG9mIHRoZSBjbGFzcyAoaWdub3JlZCwgYnV0IHJlcXVpcmVkIGJ5IHRoZQotICAgICAgICBtZXRhY2xhc3MgcHJvdG9jb2wpLgotICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3Mgd2UncmUgY29uc3RydWN0aW5nLgotICAgICAgICAoU2hvdWxkIGJlIG1lc3NhZ2UuTWVzc2FnZSkuICBXZSBpZ25vcmUgdGhpcyBmaWVsZCwgYnV0Ci0gICAgICAgIGl0J3MgcmVxdWlyZWQgYnkgdGhlIG1ldGFjbGFzcyBwcm90b2NvbAotICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIHdlJ3JlCi0gICAgICAgIGNvbnN0cnVjdGluZy4gIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4KLSAgICAgICAgYSBEZXNjcmlwdG9yIG9iamVjdCBkZXNjcmliaW5nIHRoaXMgcHJvdG9jb2wgbWVzc2FnZQotICAgICAgICB0eXBlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIE5ld2x5LWFsbG9jYXRlZCBjbGFzcy4KLSAgICAiIiIKLSAgICBkZXNjcmlwdG9yID0gZGljdGlvbmFyeVtHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlLl9ERVNDUklQVE9SX0tFWV0KLSAgICBfTmV3TWVzc2FnZShkZXNjcmlwdG9yLCBkaWN0aW9uYXJ5KQotICAgIHN1cGVyY2xhc3MgPSBzdXBlcihHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlLCBjbHMpCi0KLSAgICBuZXdfY2xhc3MgPSBzdXBlcmNsYXNzLl9fbmV3X18oY2xzLCBuYW1lLCBiYXNlcywgZGljdGlvbmFyeSkKLSAgICBzZXRhdHRyKGRlc2NyaXB0b3IsICdfY29uY3JldGVfY2xhc3MnLCBuZXdfY2xhc3MpCi0gICAgcmV0dXJuIG5ld19jbGFzcwotCi0gIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KToKLSAgICAiIiJIZXJlIHdlIHBlcmZvcm0gdGhlIG1ham9yaXR5IG9mIG91ciB3b3JrIG9uIHRoZSBjbGFzcy4KLSAgICBXZSBhZGQgZW51bSBnZXR0ZXJzLCBhbiBfX2luaXRfXyBtZXRob2QsIGltcGxlbWVudGF0aW9ucwotICAgIG9mIGFsbCBNZXNzYWdlIG1ldGhvZHMsIGFuZCBwcm9wZXJ0aWVzIGZvciBhbGwgZmllbGRzCi0gICAgaW4gdGhlIHByb3RvY29sIHR5cGUuCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogTmFtZSBvZiB0aGUgY2xhc3MgKGlnbm9yZWQsIGJ1dCByZXF1aXJlZCBieSB0aGUKLSAgICAgICAgbWV0YWNsYXNzIHByb3RvY29sKS4KLSAgICAgIGJhc2VzOiBCYXNlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIHdlJ3JlIGNvbnN0cnVjdGluZy4KLSAgICAgICAgKFNob3VsZCBiZSBtZXNzYWdlLk1lc3NhZ2UpLiAgV2UgaWdub3JlIHRoaXMgZmllbGQsIGJ1dAotICAgICAgICBpdCdzIHJlcXVpcmVkIGJ5IHRoZSBtZXRhY2xhc3MgcHJvdG9jb2wKLSAgICAgIGRpY3Rpb25hcnk6IFRoZSBjbGFzcyBkaWN0aW9uYXJ5IG9mIHRoZSBjbGFzcyB3ZSdyZQotICAgICAgICBjb25zdHJ1Y3RpbmcuICBkaWN0aW9uYXJ5W19ERVNDUklQVE9SX0tFWV0gbXVzdCBjb250YWluCi0gICAgICAgIGEgRGVzY3JpcHRvciBvYmplY3QgZGVzY3JpYmluZyB0aGlzIHByb3RvY29sIG1lc3NhZ2UKLSAgICAgICAgdHlwZS4KLSAgICAiIiIKLSAgICBkZXNjcmlwdG9yID0gZGljdGlvbmFyeVtHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlLl9ERVNDUklQVE9SX0tFWV0KLSAgICBfSW5pdE1lc3NhZ2UoZGVzY3JpcHRvciwgY2xzKQotICAgIHN1cGVyY2xhc3MgPSBzdXBlcihHZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlLCBjbHMpCi0gICAgc3VwZXJjbGFzcy5fX2luaXRfXyhuYW1lLCBiYXNlcywgZGljdGlvbmFyeSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAxODBiNzBlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UucHkKKysrIC9kZXYvbnVsbApAQCAtMSwyMjYgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkRFUFJFQ0FURUQ6ICBEZWNsYXJlcyB0aGUgUlBDIHNlcnZpY2UgaW50ZXJmYWNlcy4KLQotVGhpcyBtb2R1bGUgZGVjbGFyZXMgdGhlIGFic3RyYWN0IGludGVyZmFjZXMgdW5kZXJseWluZyBwcm90bzIgUlBDCi1zZXJ2aWNlcy4gIFRoZXNlIGFyZSBpbnRlbmRlZCB0byBiZSBpbmRlcGVuZGVudCBvZiBhbnkgcGFydGljdWxhciBSUEMKLWltcGxlbWVudGF0aW9uLCBzbyB0aGF0IHByb3RvMiBzZXJ2aWNlcyBjYW4gYmUgdXNlZCBvbiB0b3Agb2YgYSB2YXJpZXR5Ci1vZiBpbXBsZW1lbnRhdGlvbnMuICBTdGFydGluZyB3aXRoIHZlcnNpb24gMi4zLjAsIFJQQyBpbXBsZW1lbnRhdGlvbnMgc2hvdWxkCi1ub3QgdHJ5IHRvIGJ1aWxkIG9uIHRoZXNlLCBidXQgc2hvdWxkIGluc3RlYWQgcHJvdmlkZSBjb2RlIGdlbmVyYXRvciBwbHVnaW5zCi13aGljaCBnZW5lcmF0ZSBjb2RlIHNwZWNpZmljIHRvIHRoZSBwYXJ0aWN1bGFyIFJQQyBpbXBsZW1lbnRhdGlvbi4gIFRoaXMgd2F5Ci10aGUgZ2VuZXJhdGVkIGNvZGUgY2FuIGJlIG1vcmUgYXBwcm9wcmlhdGUgZm9yIHRoZSBpbXBsZW1lbnRhdGlvbiBpbiB1c2UKLWFuZCBjYW4gYXZvaWQgdW5uZWNlc3NhcnkgbGF5ZXJzIG9mIGluZGlyZWN0aW9uLgotIiIiCi0KLV9fYXV0aG9yX18gPSAncGV0YXJAZ29vZ2xlLmNvbSAoUGV0YXIgUGV0cm92KScKLQotCi1jbGFzcyBScGNFeGNlcHRpb24oRXhjZXB0aW9uKToKLSAgIiIiRXhjZXB0aW9uIHJhaXNlZCBvbiBmYWlsZWQgYmxvY2tpbmcgUlBDIG1ldGhvZCBjYWxsLiIiIgotICBwYXNzCi0KLQotY2xhc3MgU2VydmljZShvYmplY3QpOgotCi0gICIiIkFic3RyYWN0IGJhc2UgaW50ZXJmYWNlIGZvciBwcm90b2NvbC1idWZmZXItYmFzZWQgUlBDIHNlcnZpY2VzLgotCi0gIFNlcnZpY2VzIHRoZW1zZWx2ZXMgYXJlIGFic3RyYWN0IGNsYXNzZXMgKGltcGxlbWVudGVkIGVpdGhlciBieSBzZXJ2ZXJzIG9yIGFzCi0gIHN0dWJzKSwgYnV0IHRoZXkgc3ViY2xhc3MgdGhpcyBiYXNlIGludGVyZmFjZS4gVGhlIG1ldGhvZHMgb2YgdGhpcwotICBpbnRlcmZhY2UgY2FuIGJlIHVzZWQgdG8gY2FsbCB0aGUgbWV0aG9kcyBvZiB0aGUgc2VydmljZSB3aXRob3V0IGtub3dpbmcKLSAgaXRzIGV4YWN0IHR5cGUgYXQgY29tcGlsZSB0aW1lIChhbmFsb2dvdXMgdG8gdGhlIE1lc3NhZ2UgaW50ZXJmYWNlKS4KLSAgIiIiCi0KLSAgZGVmIEdldERlc2NyaXB0b3IoKToKLSAgICAiIiJSZXRyaWV2ZXMgdGhpcyBzZXJ2aWNlJ3MgZGVzY3JpcHRvci4iIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLAotICAgICAgICAgICAgICAgICByZXF1ZXN0LCBkb25lKToKLSAgICAiIiJDYWxscyBhIG1ldGhvZCBvZiB0aGUgc2VydmljZSBzcGVjaWZpZWQgYnkgbWV0aG9kX2Rlc2NyaXB0b3IuCi0KLSAgICBJZiAiZG9uZSIgaXMgTm9uZSB0aGVuIHRoZSBjYWxsIGlzIGJsb2NraW5nIGFuZCB0aGUgcmVzcG9uc2UKLSAgICBtZXNzYWdlIHdpbGwgYmUgcmV0dXJuZWQgZGlyZWN0bHkuICBPdGhlcndpc2UgdGhlIGNhbGwgaXMgYXN5bmNocm9ub3VzCi0gICAgYW5kICJkb25lIiB3aWxsIGxhdGVyIGJlIGNhbGxlZCB3aXRoIHRoZSByZXNwb25zZSB2YWx1ZS4KLQotICAgIEluIHRoZSBibG9ja2luZyBjYXNlLCBScGNFeGNlcHRpb24gd2lsbCBiZSByYWlzZWQgb24gZXJyb3IuCi0KLSAgICBQcmVjb25kaXRpb25zOgotICAgICogbWV0aG9kX2Rlc2NyaXB0b3Iuc2VydmljZSA9PSBHZXREZXNjcmlwdG9yCi0gICAgKiByZXF1ZXN0IGlzIG9mIHRoZSBleGFjdCBzYW1lIGNsYXNzZXMgYXMgcmV0dXJuZWQgYnkKLSAgICAgIEdldFJlcXVlc3RDbGFzcyhtZXRob2QpLgotICAgICogQWZ0ZXIgdGhlIGNhbGwgaGFzIHN0YXJ0ZWQsIHRoZSByZXF1ZXN0IG11c3Qgbm90IGJlIG1vZGlmaWVkLgotICAgICogInJwY19jb250cm9sbGVyIiBpcyBvZiB0aGUgY29ycmVjdCB0eXBlIGZvciB0aGUgUlBDIGltcGxlbWVudGF0aW9uIGJlaW5nCi0gICAgICB1c2VkIGJ5IHRoaXMgU2VydmljZS4gIEZvciBzdHVicywgdGhlICJjb3JyZWN0IHR5cGUiIGRlcGVuZHMgb24gdGhlCi0gICAgICBScGNDaGFubmVsIHdoaWNoIHRoZSBzdHViIGlzIHVzaW5nLgotCi0gICAgUG9zdGNvbmRpdGlvbnM6Ci0gICAgKiAiZG9uZSIgd2lsbCBiZSBjYWxsZWQgd2hlbiB0aGUgbWV0aG9kIGlzIGNvbXBsZXRlLiAgVGhpcyBtYXkgYmUKLSAgICAgIGJlZm9yZSBDYWxsTWV0aG9kKCkgcmV0dXJucyBvciBpdCBtYXkgYmUgYXQgc29tZSBwb2ludCBpbiB0aGUgZnV0dXJlLgotICAgICogSWYgdGhlIFJQQyBmYWlsZWQsIHRoZSByZXNwb25zZSB2YWx1ZSBwYXNzZWQgdG8gImRvbmUiIHdpbGwgYmUgTm9uZS4KLSAgICAgIEZ1cnRoZXIgZGV0YWlscyBhYm91dCB0aGUgZmFpbHVyZSBjYW4gYmUgZm91bmQgYnkgcXVlcnlpbmcgdGhlCi0gICAgICBScGNDb250cm9sbGVyLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgR2V0UmVxdWVzdENsYXNzKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yKToKLSAgICAiIiJSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgcmVxdWVzdCBtZXNzYWdlIGZvciB0aGUgc3BlY2lmaWVkIG1ldGhvZC4KLQotICAgIENhbGxNZXRob2QoKSByZXF1aXJlcyB0aGF0IHRoZSByZXF1ZXN0IGlzIG9mIGEgcGFydGljdWxhciBzdWJjbGFzcyBvZgotICAgIE1lc3NhZ2UuIEdldFJlcXVlc3RDbGFzcygpIGdldHMgdGhlIGRlZmF1bHQgaW5zdGFuY2Ugb2YgdGhpcyByZXF1aXJlZAotICAgIHR5cGUuCi0KLSAgICBFeGFtcGxlOgotICAgICAgbWV0aG9kID0gc2VydmljZS5HZXREZXNjcmlwdG9yKCkuRmluZE1ldGhvZEJ5TmFtZSgiRm9vIikKLSAgICAgIHJlcXVlc3QgPSBzdHViLkdldFJlcXVlc3RDbGFzcyhtZXRob2QpKCkKLSAgICAgIHJlcXVlc3QuUGFyc2VGcm9tU3RyaW5nKGlucHV0KQotICAgICAgc2VydmljZS5DYWxsTWV0aG9kKG1ldGhvZCwgcmVxdWVzdCwgY2FsbGJhY2spCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gIGRlZiBHZXRSZXNwb25zZUNsYXNzKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yKToKLSAgICAiIiJSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBmb3IgdGhlIHNwZWNpZmllZCBtZXRob2QuCi0KLSAgICBUaGlzIG1ldGhvZCBpc24ndCByZWFsbHkgbmVlZGVkLCBhcyB0aGUgUnBjQ2hhbm5lbCdzIENhbGxNZXRob2QgY29uc3RydWN0cwotICAgIHRoZSByZXNwb25zZSBwcm90b2NvbCBtZXNzYWdlLiBJdCdzIHByb3ZpZGVkIGFueXdheSBpbiBjYXNlIGl0IGlzIHVzZWZ1bAotICAgIGZvciB0aGUgY2FsbGVyIHRvIGtub3cgdGhlIHJlc3BvbnNlIHR5cGUgaW4gYWR2YW5jZS4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLQotY2xhc3MgUnBjQ29udHJvbGxlcihvYmplY3QpOgotCi0gICIiIkFuIFJwY0NvbnRyb2xsZXIgbWVkaWF0ZXMgYSBzaW5nbGUgbWV0aG9kIGNhbGwuCi0KLSAgVGhlIHByaW1hcnkgcHVycG9zZSBvZiB0aGUgY29udHJvbGxlciBpcyB0byBwcm92aWRlIGEgd2F5IHRvIG1hbmlwdWxhdGUKLSAgc2V0dGluZ3Mgc3BlY2lmaWMgdG8gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbiBhbmQgdG8gZmluZCBvdXQgYWJvdXQgUlBDLWxldmVsCi0gIGVycm9ycy4gVGhlIG1ldGhvZHMgcHJvdmlkZWQgYnkgdGhlIFJwY0NvbnRyb2xsZXIgaW50ZXJmYWNlIGFyZSBpbnRlbmRlZAotICB0byBiZSBhICJsZWFzdCBjb21tb24gZGVub21pbmF0b3IiIHNldCBvZiBmZWF0dXJlcyB3aGljaCB3ZSBleHBlY3QgYWxsCi0gIGltcGxlbWVudGF0aW9ucyB0byBzdXBwb3J0LiAgU3BlY2lmaWMgaW1wbGVtZW50YXRpb25zIG1heSBwcm92aWRlIG1vcmUKLSAgYWR2YW5jZWQgZmVhdHVyZXMgKGUuZy4gZGVhZGxpbmUgcHJvcGFnYXRpb24pLgotICAiIiIKLQotICAjIENsaWVudC1zaWRlIG1ldGhvZHMgYmVsb3cKLQotICBkZWYgUmVzZXQoc2VsZik6Ci0gICAgIiIiUmVzZXRzIHRoZSBScGNDb250cm9sbGVyIHRvIGl0cyBpbml0aWFsIHN0YXRlLgotCi0gICAgQWZ0ZXIgdGhlIFJwY0NvbnRyb2xsZXIgaGFzIGJlZW4gcmVzZXQsIGl0IG1heSBiZSByZXVzZWQgaW4KLSAgICBhIG5ldyBjYWxsLiBNdXN0IG5vdCBiZSBjYWxsZWQgd2hpbGUgYW4gUlBDIGlzIGluIHByb2dyZXNzLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgRmFpbGVkKHNlbGYpOgotICAgICIiIlJldHVybnMgdHJ1ZSBpZiB0aGUgY2FsbCBmYWlsZWQuCi0KLSAgICBBZnRlciBhIGNhbGwgaGFzIGZpbmlzaGVkLCByZXR1cm5zIHRydWUgaWYgdGhlIGNhbGwgZmFpbGVkLiAgVGhlIHBvc3NpYmxlCi0gICAgcmVhc29ucyBmb3IgZmFpbHVyZSBkZXBlbmQgb24gdGhlIFJQQyBpbXBsZW1lbnRhdGlvbi4gIEZhaWxlZCgpIG11c3Qgbm90Ci0gICAgYmUgY2FsbGVkIGJlZm9yZSBhIGNhbGwgaGFzIGZpbmlzaGVkLiAgSWYgRmFpbGVkKCkgcmV0dXJucyB0cnVlLCB0aGUKLSAgICBjb250ZW50cyBvZiB0aGUgcmVzcG9uc2UgbWVzc2FnZSBhcmUgdW5kZWZpbmVkLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgRXJyb3JUZXh0KHNlbGYpOgotICAgICIiIklmIEZhaWxlZCBpcyB0cnVlLCByZXR1cm5zIGEgaHVtYW4tcmVhZGFibGUgZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLiIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgU3RhcnRDYW5jZWwoc2VsZik6Ci0gICAgIiIiSW5pdGlhdGUgY2FuY2VsbGF0aW9uLgotCi0gICAgQWR2aXNlcyB0aGUgUlBDIHN5c3RlbSB0aGF0IHRoZSBjYWxsZXIgZGVzaXJlcyB0aGF0IHRoZSBSUEMgY2FsbCBiZQotICAgIGNhbmNlbGVkLiAgVGhlIFJQQyBzeXN0ZW0gbWF5IGNhbmNlbCBpdCBpbW1lZGlhdGVseSwgbWF5IHdhaXQgYXdoaWxlIGFuZAotICAgIHRoZW4gY2FuY2VsIGl0LCBvciBtYXkgbm90IGV2ZW4gY2FuY2VsIHRoZSBjYWxsIGF0IGFsbC4gIElmIHRoZSBjYWxsIGlzCi0gICAgY2FuY2VsZWQsIHRoZSAiZG9uZSIgY2FsbGJhY2sgd2lsbCBzdGlsbCBiZSBjYWxsZWQgYW5kIHRoZSBScGNDb250cm9sbGVyCi0gICAgd2lsbCBpbmRpY2F0ZSB0aGF0IHRoZSBjYWxsIGZhaWxlZCBhdCB0aGF0IHRpbWUuCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgotCi0gICMgU2VydmVyLXNpZGUgbWV0aG9kcyBiZWxvdwotCi0gIGRlZiBTZXRGYWlsZWQoc2VsZiwgcmVhc29uKToKLSAgICAiIiJTZXRzIGEgZmFpbHVyZSByZWFzb24uCi0KLSAgICBDYXVzZXMgRmFpbGVkKCkgdG8gcmV0dXJuIHRydWUgb24gdGhlIGNsaWVudCBzaWRlLiAgInJlYXNvbiIgd2lsbCBiZQotICAgIGluY29ycG9yYXRlZCBpbnRvIHRoZSBtZXNzYWdlIHJldHVybmVkIGJ5IEVycm9yVGV4dCgpLiAgSWYgeW91IGZpbmQKLSAgICB5b3UgbmVlZCB0byByZXR1cm4gbWFjaGluZS1yZWFkYWJsZSBpbmZvcm1hdGlvbiBhYm91dCBmYWlsdXJlcywgeW91Ci0gICAgc2hvdWxkIGluY29ycG9yYXRlIGl0IGludG8geW91ciByZXNwb25zZSBwcm90b2NvbCBidWZmZXIgYW5kIHNob3VsZAotICAgIE5PVCBjYWxsIFNldEZhaWxlZCgpLgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgSXNDYW5jZWxlZChzZWxmKToKLSAgICAiIiJDaGVja3MgaWYgdGhlIGNsaWVudCBjYW5jZWxsZWQgdGhlIFJQQy4KLQotICAgIElmIHRydWUsIGluZGljYXRlcyB0aGF0IHRoZSBjbGllbnQgY2FuY2VsZWQgdGhlIFJQQywgc28gdGhlIHNlcnZlciBtYXkKLSAgICBhcyB3ZWxsIGdpdmUgdXAgb24gcmVwbHlpbmcgdG8gaXQuICBUaGUgc2VydmVyIHNob3VsZCBzdGlsbCBjYWxsIHRoZQotICAgIGZpbmFsICJkb25lIiBjYWxsYmFjay4KLSAgICAiIiIKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIE5vdGlmeU9uQ2FuY2VsKHNlbGYsIGNhbGxiYWNrKToKLSAgICAiIiJTZXRzIGEgY2FsbGJhY2sgdG8gaW52b2tlIG9uIGNhbmNlbC4KLQotICAgIEFza3MgdGhhdCB0aGUgZ2l2ZW4gY2FsbGJhY2sgYmUgY2FsbGVkIHdoZW4gdGhlIFJQQyBpcyBjYW5jZWxlZC4gIFRoZQotICAgIGNhbGxiYWNrIHdpbGwgYWx3YXlzIGJlIGNhbGxlZCBleGFjdGx5IG9uY2UuICBJZiB0aGUgUlBDIGNvbXBsZXRlcyB3aXRob3V0Ci0gICAgYmVpbmcgY2FuY2VsZWQsIHRoZSBjYWxsYmFjayB3aWxsIGJlIGNhbGxlZCBhZnRlciBjb21wbGV0aW9uLiAgSWYgdGhlIFJQQwotICAgIGhhcyBhbHJlYWR5IGJlZW4gY2FuY2VsZWQgd2hlbiBOb3RpZnlPbkNhbmNlbCgpIGlzIGNhbGxlZCwgdGhlIGNhbGxiYWNrCi0gICAgd2lsbCBiZSBjYWxsZWQgaW1tZWRpYXRlbHkuCi0KLSAgICBOb3RpZnlPbkNhbmNlbCgpIG11c3QgYmUgY2FsbGVkIG5vIG1vcmUgdGhhbiBvbmNlIHBlciByZXF1ZXN0LgotICAgICIiIgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotCi1jbGFzcyBScGNDaGFubmVsKG9iamVjdCk6Ci0KLSAgIiIiQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhbiBSUEMgY2hhbm5lbC4KLQotICBBbiBScGNDaGFubmVsIHJlcHJlc2VudHMgYSBjb21tdW5pY2F0aW9uIGxpbmUgdG8gYSBzZXJ2aWNlIHdoaWNoIGNhbiBiZSB1c2VkCi0gIHRvIGNhbGwgdGhhdCBzZXJ2aWNlJ3MgbWV0aG9kcy4gIFRoZSBzZXJ2aWNlIG1heSBiZSBydW5uaW5nIG9uIGFub3RoZXIKLSAgbWFjaGluZS4gTm9ybWFsbHksIHlvdSBzaG91bGQgbm90IHVzZSBhbiBScGNDaGFubmVsIGRpcmVjdGx5LCBidXQgaW5zdGVhZAotICBjb25zdHJ1Y3QgYSBzdHViIHtAbGluayBTZXJ2aWNlfSB3cmFwcGluZyBpdC4gIEV4YW1wbGU6Ci0KLSAgRXhhbXBsZToKLSAgICBScGNDaGFubmVsIGNoYW5uZWwgPSBycGNJbXBsLkNoYW5uZWwoInJlbW90ZWhvc3QuZXhhbXBsZS5jb206MTIzNCIpCi0gICAgUnBjQ29udHJvbGxlciBjb250cm9sbGVyID0gcnBjSW1wbC5Db250cm9sbGVyKCkKLSAgICBNeVNlcnZpY2Ugc2VydmljZSA9IE15U2VydmljZV9TdHViKGNoYW5uZWwpCi0gICAgc2VydmljZS5NeU1ldGhvZChjb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaykKLSAgIiIiCi0KLSAgZGVmIENhbGxNZXRob2Qoc2VsZiwgbWV0aG9kX2Rlc2NyaXB0b3IsIHJwY19jb250cm9sbGVyLAotICAgICAgICAgICAgICAgICByZXF1ZXN0LCByZXNwb25zZV9jbGFzcywgZG9uZSk6Ci0gICAgIiIiQ2FsbHMgdGhlIG1ldGhvZCBpZGVudGlmaWVkIGJ5IHRoZSBkZXNjcmlwdG9yLgotCi0gICAgQ2FsbCB0aGUgZ2l2ZW4gbWV0aG9kIG9mIHRoZSByZW1vdGUgc2VydmljZS4gIFRoZSBzaWduYXR1cmUgb2YgdGhpcwotICAgIHByb2NlZHVyZSBsb29rcyB0aGUgc2FtZSBhcyBTZXJ2aWNlLkNhbGxNZXRob2QoKSwgYnV0IHRoZSByZXF1aXJlbWVudHMKLSAgICBhcmUgbGVzcyBzdHJpY3QgaW4gb25lIGltcG9ydGFudCB3YXk6ICB0aGUgcmVxdWVzdCBvYmplY3QgZG9lc24ndCBoYXZlIHRvCi0gICAgYmUgb2YgYW55IHNwZWNpZmljIGNsYXNzIGFzIGxvbmcgYXMgaXRzIGRlc2NyaXB0b3IgaXMgbWV0aG9kLmlucHV0X3R5cGUuCi0gICAgIiIiCi0gICAgcmFpc2UgTm90SW1wbGVtZW50ZWRFcnJvcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvc2VydmljZV9yZWZsZWN0aW9uLnB5CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDc1NQppbmRleCA4NTFlODNlLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2VfcmVmbGVjdGlvbi5weQorKysgL2Rldi9udWxsCkBAIC0xLDI4NCArMCwwIEBACi0jIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAotIyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLSMgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotIwotIyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKLSMgbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotIyBtZXQ6Ci0jCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0jIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KLSMgICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQotIyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0jIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKLSMgZGlzdHJpYnV0aW9uLgotIyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0jIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCi0jIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCi0jCi0jIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKLSMgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKLSMgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0jIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCi0jIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAotIyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAotIyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKLSMgVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotIyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKLSMgT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KLQotIiIiQ29udGFpbnMgbWV0YWNsYXNzZXMgdXNlZCB0byBjcmVhdGUgcHJvdG9jb2wgc2VydmljZSBhbmQgc2VydmljZSBzdHViCi1jbGFzc2VzIGZyb20gU2VydmljZURlc2NyaXB0b3Igb2JqZWN0cyBhdCBydW50aW1lLgotCi1UaGUgR2VuZXJhdGVkU2VydmljZVR5cGUgYW5kIEdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZSBtZXRhY2xhc3NlcyBhcmUgdXNlZCB0bwotaW5qZWN0IGFsbCB1c2VmdWwgZnVuY3Rpb25hbGl0eSBpbnRvIHRoZSBjbGFzc2VzIG91dHB1dCBieSB0aGUgcHJvdG9jb2wKLWNvbXBpbGVyIGF0IGNvbXBpbGUtdGltZS4KLSIiIgotCi1fX2F1dGhvcl9fID0gJ3BldGFyQGdvb2dsZS5jb20gKFBldGFyIFBldHJvdiknCi0KLQotY2xhc3MgR2VuZXJhdGVkU2VydmljZVR5cGUodHlwZSk6Ci0KLSAgIiIiTWV0YWNsYXNzIGZvciBzZXJ2aWNlIGNsYXNzZXMgY3JlYXRlZCBhdCBydW50aW1lIGZyb20gU2VydmljZURlc2NyaXB0b3JzLgotCi0gIEltcGxlbWVudGF0aW9ucyBmb3IgYWxsIG1ldGhvZHMgZGVzY3JpYmVkIGluIHRoZSBTZXJ2aWNlIGNsYXNzIGFyZSBhZGRlZCBoZXJlCi0gIGJ5IHRoaXMgY2xhc3MuIFdlIGFsc28gY3JlYXRlIHByb3BlcnRpZXMgdG8gYWxsb3cgZ2V0dGluZy9zZXR0aW5nIGFsbCBmaWVsZHMKLSAgaW4gdGhlIHByb3RvY29sIG1lc3NhZ2UuCi0KLSAgVGhlIHByb3RvY29sIGNvbXBpbGVyIGN1cnJlbnRseSB1c2VzIHRoaXMgbWV0YWNsYXNzIHRvIGNyZWF0ZSBwcm90b2NvbCBzZXJ2aWNlCi0gIGNsYXNzZXMgYXQgcnVudGltZS4gQ2xpZW50cyBjYW4gYWxzbyBtYW51YWxseSBjcmVhdGUgdGhlaXIgb3duIGNsYXNzZXMgYXQKLSAgcnVudGltZSwgYXMgaW4gdGhpcyBleGFtcGxlOgotCi0gIG15ZGVzY3JpcHRvciA9IFNlcnZpY2VEZXNjcmlwdG9yKC4uLi4uKQotICBjbGFzcyBNeVByb3RvU2VydmljZShzZXJ2aWNlLlNlcnZpY2UpOgotICAgIF9fbWV0YWNsYXNzX18gPSBHZW5lcmF0ZWRTZXJ2aWNlVHlwZQotICAgIERFU0NSSVBUT1IgPSBteWRlc2NyaXB0b3IKLSAgbXlzZXJ2aWNlX2luc3RhbmNlID0gTXlQcm90b1NlcnZpY2UoKQotICAuLi4KLSAgIiIiCi0KLSAgX0RFU0NSSVBUT1JfS0VZID0gJ0RFU0NSSVBUT1InCi0KLSAgZGVmIF9faW5pdF9fKGNscywgbmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpOgotICAgICIiIkNyZWF0ZXMgYSBtZXNzYWdlIHNlcnZpY2UgY2xhc3MuCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogTmFtZSBvZiB0aGUgY2xhc3MgKGlnbm9yZWQsIGJ1dCByZXF1aXJlZCBieSB0aGUgbWV0YWNsYXNzCi0gICAgICAgIHByb3RvY29sKS4KLSAgICAgIGJhc2VzOiBCYXNlIGNsYXNzZXMgb2YgdGhlIGNsYXNzIGJlaW5nIGNvbnN0cnVjdGVkLgotICAgICAgZGljdGlvbmFyeTogVGhlIGNsYXNzIGRpY3Rpb25hcnkgb2YgdGhlIGNsYXNzIGJlaW5nIGNvbnN0cnVjdGVkLgotICAgICAgICBkaWN0aW9uYXJ5W19ERVNDUklQVE9SX0tFWV0gbXVzdCBjb250YWluIGEgU2VydmljZURlc2NyaXB0b3Igb2JqZWN0Ci0gICAgICAgIGRlc2NyaWJpbmcgdGhpcyBwcm90b2NvbCBzZXJ2aWNlIHR5cGUuCi0gICAgIiIiCi0gICAgIyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGNsYXNzIGRvZXNuJ3QgaGF2ZSBhIGRlc2NyaXB0b3IuIFRoaXMgaGFwcGVucwotICAgICMgd2hlbiBhIHNlcnZpY2UgY2xhc3MgaXMgc3ViY2xhc3NlZC4KLSAgICBpZiBHZW5lcmF0ZWRTZXJ2aWNlVHlwZS5fREVTQ1JJUFRPUl9LRVkgbm90IGluIGRpY3Rpb25hcnk6Ci0gICAgICByZXR1cm4KLSAgICBkZXNjcmlwdG9yID0gZGljdGlvbmFyeVtHZW5lcmF0ZWRTZXJ2aWNlVHlwZS5fREVTQ1JJUFRPUl9LRVldCi0gICAgc2VydmljZV9idWlsZGVyID0gX1NlcnZpY2VCdWlsZGVyKGRlc2NyaXB0b3IpCi0gICAgc2VydmljZV9idWlsZGVyLkJ1aWxkU2VydmljZShjbHMpCi0KLQotY2xhc3MgR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlKEdlbmVyYXRlZFNlcnZpY2VUeXBlKToKLQotICAiIiJNZXRhY2xhc3MgZm9yIHNlcnZpY2Ugc3R1YnMgY3JlYXRlZCBhdCBydW50aW1lIGZyb20gU2VydmljZURlc2NyaXB0b3JzLgotCi0gIFRoaXMgY2xhc3MgaGFzIHNpbWlsYXIgcmVzcG9uc2liaWxpdGllcyBhcyBHZW5lcmF0ZWRTZXJ2aWNlVHlwZSwgZXhjZXB0IHRoYXQKLSAgaXQgY3JlYXRlcyB0aGUgc2VydmljZSBzdHViIGNsYXNzZXMuCi0gICIiIgotCi0gIF9ERVNDUklQVE9SX0tFWSA9ICdERVNDUklQVE9SJwotCi0gIGRlZiBfX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkaWN0aW9uYXJ5KToKLSAgICAiIiJDcmVhdGVzIGEgbWVzc2FnZSBzZXJ2aWNlIHN0dWIgY2xhc3MuCi0KLSAgICBBcmdzOgotICAgICAgbmFtZTogTmFtZSBvZiB0aGUgY2xhc3MgKGlnbm9yZWQsIGhlcmUpLgotICAgICAgYmFzZXM6IEJhc2UgY2xhc3NlcyBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCi0gICAgICBkaWN0aW9uYXJ5OiBUaGUgY2xhc3MgZGljdGlvbmFyeSBvZiB0aGUgY2xhc3MgYmVpbmcgY29uc3RydWN0ZWQuCi0gICAgICAgIGRpY3Rpb25hcnlbX0RFU0NSSVBUT1JfS0VZXSBtdXN0IGNvbnRhaW4gYSBTZXJ2aWNlRGVzY3JpcHRvciBvYmplY3QKLSAgICAgICAgZGVzY3JpYmluZyB0aGlzIHByb3RvY29sIHNlcnZpY2UgdHlwZS4KLSAgICAiIiIKLSAgICBzdXBlcihHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUsIGNscykuX19pbml0X18obmFtZSwgYmFzZXMsIGRpY3Rpb25hcnkpCi0gICAgIyBEb24ndCBkbyBhbnl0aGluZyBpZiB0aGlzIGNsYXNzIGRvZXNuJ3QgaGF2ZSBhIGRlc2NyaXB0b3IuIFRoaXMgaGFwcGVucwotICAgICMgd2hlbiBhIHNlcnZpY2Ugc3R1YiBpcyBzdWJjbGFzc2VkLgotICAgIGlmIEdlbmVyYXRlZFNlcnZpY2VTdHViVHlwZS5fREVTQ1JJUFRPUl9LRVkgbm90IGluIGRpY3Rpb25hcnk6Ci0gICAgICByZXR1cm4KLSAgICBkZXNjcmlwdG9yID0gZGljdGlvbmFyeVtHZW5lcmF0ZWRTZXJ2aWNlU3R1YlR5cGUuX0RFU0NSSVBUT1JfS0VZXQotICAgIHNlcnZpY2Vfc3R1Yl9idWlsZGVyID0gX1NlcnZpY2VTdHViQnVpbGRlcihkZXNjcmlwdG9yKQotICAgIHNlcnZpY2Vfc3R1Yl9idWlsZGVyLkJ1aWxkU2VydmljZVN0dWIoY2xzKQotCi0KLWNsYXNzIF9TZXJ2aWNlQnVpbGRlcihvYmplY3QpOgotCi0gICIiIlRoaXMgY2xhc3MgY29uc3RydWN0cyBhIHByb3RvY29sIHNlcnZpY2UgY2xhc3MgdXNpbmcgYSBzZXJ2aWNlIGRlc2NyaXB0b3IuCi0KLSAgR2l2ZW4gYSBzZXJ2aWNlIGRlc2NyaXB0b3IsIHRoaXMgY2xhc3MgY29uc3RydWN0cyBhIGNsYXNzIHRoYXQgcmVwcmVzZW50cwotICB0aGUgc3BlY2lmaWVkIHNlcnZpY2UgZGVzY3JpcHRvci4gT25lIHNlcnZpY2UgYnVpbGRlciBpbnN0YW5jZSBjb25zdHJ1Y3RzCi0gIGV4YWN0bHkgb25lIHNlcnZpY2UgY2xhc3MuIFRoYXQgbWVhbnMgYWxsIGluc3RhbmNlcyBvZiB0aGF0IGNsYXNzIHNoYXJlIHRoZQotICBzYW1lIGJ1aWxkZXIuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2aWNlX2Rlc2NyaXB0b3IpOgotICAgICIiIkluaXRpYWxpemVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIGNsYXNzIGJ1aWxkZXIuCi0KLSAgICBBcmdzOgotICAgICAgc2VydmljZV9kZXNjcmlwdG9yOiBTZXJ2aWNlRGVzY3JpcHRvciB0byB1c2Ugd2hlbiBjb25zdHJ1Y3RpbmcgdGhlCi0gICAgICAgIHNlcnZpY2UgY2xhc3MuCi0gICAgIiIiCi0gICAgc2VsZi5kZXNjcmlwdG9yID0gc2VydmljZV9kZXNjcmlwdG9yCi0KLSAgZGVmIEJ1aWxkU2VydmljZShzZWxmLCBjbHMpOgotICAgICIiIkNvbnN0cnVjdHMgdGhlIHNlcnZpY2UgY2xhc3MuCi0KLSAgICBBcmdzOgotICAgICAgY2xzOiBUaGUgY2xhc3MgdGhhdCB3aWxsIGJlIGNvbnN0cnVjdGVkLgotICAgICIiIgotCi0gICAgIyBDYWxsTWV0aG9kIG5lZWRzIHRvIG9wZXJhdGUgd2l0aCBhbiBpbnN0YW5jZSBvZiB0aGUgU2VydmljZSBjbGFzcy4gVGhpcwotICAgICMgaW50ZXJuYWwgd3JhcHBlciBmdW5jdGlvbiBleGlzdHMgb25seSB0byBiZSBhYmxlIHRvIHBhc3MgdGhlIHNlcnZpY2UKLSAgICAjIGluc3RhbmNlIHRvIHRoZSBtZXRob2QgdGhhdCBkb2VzIHRoZSByZWFsIENhbGxNZXRob2Qgd29yay4KLSAgICBkZWYgX1dyYXBDYWxsTWV0aG9kKHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKToKLSAgICAgIHJldHVybiBzZWxmLl9DYWxsTWV0aG9kKHNydmMsIG1ldGhvZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2spCi0gICAgc2VsZi5jbHMgPSBjbHMKLSAgICBjbHMuQ2FsbE1ldGhvZCA9IF9XcmFwQ2FsbE1ldGhvZAotICAgIGNscy5HZXREZXNjcmlwdG9yID0gc3RhdGljbWV0aG9kKGxhbWJkYTogc2VsZi5kZXNjcmlwdG9yKQotICAgIGNscy5HZXREZXNjcmlwdG9yLl9fZG9jX18gPSAiUmV0dXJucyB0aGUgc2VydmljZSBkZXNjcmlwdG9yLiIKLSAgICBjbHMuR2V0UmVxdWVzdENsYXNzID0gc2VsZi5fR2V0UmVxdWVzdENsYXNzCi0gICAgY2xzLkdldFJlc3BvbnNlQ2xhc3MgPSBzZWxmLl9HZXRSZXNwb25zZUNsYXNzCi0gICAgZm9yIG1ldGhvZCBpbiBzZWxmLmRlc2NyaXB0b3IubWV0aG9kczoKLSAgICAgIHNldGF0dHIoY2xzLCBtZXRob2QubmFtZSwgc2VsZi5fR2VuZXJhdGVOb25JbXBsZW1lbnRlZE1ldGhvZChtZXRob2QpKQotCi0gIGRlZiBfQ2FsbE1ldGhvZChzZWxmLCBzcnZjLCBtZXRob2RfZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjayk6Ci0gICAgIiIiQ2FsbHMgdGhlIG1ldGhvZCBkZXNjcmliZWQgYnkgYSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvci4KLQotICAgIEFyZ3M6Ci0gICAgICBzcnZjOiBJbnN0YW5jZSBvZiB0aGUgc2VydmljZSBmb3Igd2hpY2ggdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotICAgICAgbWV0aG9kX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3IgdGhhdCByZXByZXNlbnQgdGhlIG1ldGhvZCB0byBjYWxsLgotICAgICAgcnBjX2NvbnRyb2xsZXI6IFJQQyBjb250cm9sbGVyIHRvIHVzZSBmb3IgdGhpcyBtZXRob2QncyBleGVjdXRpb24uCi0gICAgICByZXF1ZXN0OiBSZXF1ZXN0IHByb3RvY29sIG1lc3NhZ2UuCi0gICAgICBjYWxsYmFjazogQSBjYWxsYmFjayB0byBpbnZva2UgYWZ0ZXIgdGhlIG1ldGhvZCBoYXMgY29tcGxldGVkLgotICAgICIiIgotICAgIGlmIG1ldGhvZF9kZXNjcmlwdG9yLmNvbnRhaW5pbmdfc2VydmljZSAhPSBzZWxmLmRlc2NyaXB0b3I6Ci0gICAgICByYWlzZSBSdW50aW1lRXJyb3IoCi0gICAgICAgICAgJ0NhbGxNZXRob2QoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3Jvbmcgc2VydmljZSB0eXBlLicpCi0gICAgbWV0aG9kID0gZ2V0YXR0cihzcnZjLCBtZXRob2RfZGVzY3JpcHRvci5uYW1lKQotICAgIHJldHVybiBtZXRob2QocnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKQotCi0gIGRlZiBfR2V0UmVxdWVzdENsYXNzKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yKToKLSAgICAiIiJSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgcmVxdWVzdCBwcm90b2NvbCBtZXNzYWdlLgotCi0gICAgQXJnczoKLSAgICAgIG1ldGhvZF9kZXNjcmlwdG9yOiBEZXNjcmlwdG9yIG9mIHRoZSBtZXRob2QgZm9yIHdoaWNoIHRvIHJldHVybiB0aGUKLSAgICAgICAgcmVxdWVzdCBwcm90b2NvbCBtZXNzYWdlIGNsYXNzLgotCi0gICAgUmV0dXJuczoKLSAgICAgIEEgY2xhc3MgdGhhdCByZXByZXNlbnRzIHRoZSBpbnB1dCBwcm90b2NvbCBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgIG1ldGhvZC4KLSAgICAiIiIKLSAgICBpZiBtZXRob2RfZGVzY3JpcHRvci5jb250YWluaW5nX3NlcnZpY2UgIT0gc2VsZi5kZXNjcmlwdG9yOgotICAgICAgcmFpc2UgUnVudGltZUVycm9yKAotICAgICAgICAgICdHZXRSZXF1ZXN0Q2xhc3MoKSBnaXZlbiBtZXRob2QgZGVzY3JpcHRvciBmb3Igd3Jvbmcgc2VydmljZSB0eXBlLicpCi0gICAgcmV0dXJuIG1ldGhvZF9kZXNjcmlwdG9yLmlucHV0X3R5cGUuX2NvbmNyZXRlX2NsYXNzCi0KLSAgZGVmIF9HZXRSZXNwb25zZUNsYXNzKHNlbGYsIG1ldGhvZF9kZXNjcmlwdG9yKToKLSAgICAiIiJSZXR1cm5zIHRoZSBjbGFzcyBvZiB0aGUgcmVzcG9uc2UgcHJvdG9jb2wgbWVzc2FnZS4KLQotICAgIEFyZ3M6Ci0gICAgICBtZXRob2RfZGVzY3JpcHRvcjogRGVzY3JpcHRvciBvZiB0aGUgbWV0aG9kIGZvciB3aGljaCB0byByZXR1cm4gdGhlCi0gICAgICAgIHJlc3BvbnNlIHByb3RvY29sIG1lc3NhZ2UgY2xhc3MuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBjbGFzcyB0aGF0IHJlcHJlc2VudHMgdGhlIG91dHB1dCBwcm90b2NvbCBtZXNzYWdlIG9mIHRoZSBzcGVjaWZpZWQKLSAgICAgIG1ldGhvZC4KLSAgICAiIiIKLSAgICBpZiBtZXRob2RfZGVzY3JpcHRvci5jb250YWluaW5nX3NlcnZpY2UgIT0gc2VsZi5kZXNjcmlwdG9yOgotICAgICAgcmFpc2UgUnVudGltZUVycm9yKAotICAgICAgICAgICdHZXRSZXNwb25zZUNsYXNzKCkgZ2l2ZW4gbWV0aG9kIGRlc2NyaXB0b3IgZm9yIHdyb25nIHNlcnZpY2UgdHlwZS4nKQotICAgIHJldHVybiBtZXRob2RfZGVzY3JpcHRvci5vdXRwdXRfdHlwZS5fY29uY3JldGVfY2xhc3MKLQotICBkZWYgX0dlbmVyYXRlTm9uSW1wbGVtZW50ZWRNZXRob2Qoc2VsZiwgbWV0aG9kKToKLSAgICAiIiJHZW5lcmF0ZXMgYW5kIHJldHVybnMgYSBtZXRob2QgdGhhdCBjYW4gYmUgc2V0IGZvciBhIHNlcnZpY2UgbWV0aG9kcy4KLQotICAgIEFyZ3M6Ci0gICAgICBtZXRob2Q6IERlc2NyaXB0b3Igb2YgdGhlIHNlcnZpY2UgbWV0aG9kIGZvciB3aGljaCBhIG1ldGhvZCBpcyB0byBiZQotICAgICAgICBnZW5lcmF0ZWQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgQSBtZXRob2QgdGhhdCBjYW4gYmUgYWRkZWQgdG8gdGhlIHNlcnZpY2UgY2xhc3MuCi0gICAgIiIiCi0gICAgcmV0dXJuIGxhbWJkYSBpbnN0LCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2s6ICgKLSAgICAgICAgc2VsZi5fTm9uSW1wbGVtZW50ZWRNZXRob2QobWV0aG9kLm5hbWUsIHJwY19jb250cm9sbGVyLCBjYWxsYmFjaykpCi0KLSAgZGVmIF9Ob25JbXBsZW1lbnRlZE1ldGhvZChzZWxmLCBtZXRob2RfbmFtZSwgcnBjX2NvbnRyb2xsZXIsIGNhbGxiYWNrKToKLSAgICAiIiJUaGUgYm9keSBvZiBhbGwgbWV0aG9kcyBpbiB0aGUgZ2VuZXJhdGVkIHNlcnZpY2UgY2xhc3MuCi0KLSAgICBBcmdzOgotICAgICAgbWV0aG9kX25hbWU6IE5hbWUgb2YgdGhlIG1ldGhvZCBiZWluZyBleGVjdXRlZC4KLSAgICAgIHJwY19jb250cm9sbGVyOiBSUEMgY29udHJvbGxlciB1c2VkIHRvIGV4ZWN1dGUgdGhpcyBtZXRob2QuCi0gICAgICBjYWxsYmFjazogQSBjYWxsYmFjayB3aGljaCB3aWxsIGJlIGludm9rZWQgd2hlbiB0aGUgbWV0aG9kIGZpbmlzaGVzLgotICAgICIiIgotICAgIHJwY19jb250cm9sbGVyLlNldEZhaWxlZCgnTWV0aG9kICVzIG5vdCBpbXBsZW1lbnRlZC4nICUgbWV0aG9kX25hbWUpCi0gICAgY2FsbGJhY2soTm9uZSkKLQotCi1jbGFzcyBfU2VydmljZVN0dWJCdWlsZGVyKG9iamVjdCk6Ci0KLSAgIiIiQ29uc3RydWN0cyBhIHByb3RvY29sIHNlcnZpY2Ugc3R1YiBjbGFzcyB1c2luZyBhIHNlcnZpY2UgZGVzY3JpcHRvci4KLQotICBHaXZlbiBhIHNlcnZpY2UgZGVzY3JpcHRvciwgdGhpcyBjbGFzcyBjb25zdHJ1Y3RzIGEgc3VpdGFibGUgc3R1YiBjbGFzcy4KLSAgQSBzdHViIGlzIGp1c3QgYSB0eXBlLXNhZmUgd3JhcHBlciBhcm91bmQgYW4gUnBjQ2hhbm5lbCB3aGljaCBlbXVsYXRlcyBhCi0gIGxvY2FsIGltcGxlbWVudGF0aW9uIG9mIHRoZSBzZXJ2aWNlLgotCi0gIE9uZSBzZXJ2aWNlIHN0dWIgYnVpbGRlciBpbnN0YW5jZSBjb25zdHJ1Y3RzIGV4YWN0bHkgb25lIGNsYXNzLiBJdCBtZWFucyBhbGwKLSAgaW5zdGFuY2VzIG9mIHRoYXQgY2xhc3Mgc2hhcmUgdGhlIHNhbWUgc2VydmljZSBzdHViIGJ1aWxkZXIuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBzZXJ2aWNlX2Rlc2NyaXB0b3IpOgotICAgICIiIkluaXRpYWxpemVzIGFuIGluc3RhbmNlIG9mIHRoZSBzZXJ2aWNlIHN0dWIgY2xhc3MgYnVpbGRlci4KLQotICAgIEFyZ3M6Ci0gICAgICBzZXJ2aWNlX2Rlc2NyaXB0b3I6IFNlcnZpY2VEZXNjcmlwdG9yIHRvIHVzZSB3aGVuIGNvbnN0cnVjdGluZyB0aGUKLSAgICAgICAgc3R1YiBjbGFzcy4KLSAgICAiIiIKLSAgICBzZWxmLmRlc2NyaXB0b3IgPSBzZXJ2aWNlX2Rlc2NyaXB0b3IKLQotICBkZWYgQnVpbGRTZXJ2aWNlU3R1YihzZWxmLCBjbHMpOgotICAgICIiIkNvbnN0cnVjdHMgdGhlIHN0dWIgY2xhc3MuCi0KLSAgICBBcmdzOgotICAgICAgY2xzOiBUaGUgY2xhc3MgdGhhdCB3aWxsIGJlIGNvbnN0cnVjdGVkLgotICAgICIiIgotCi0gICAgZGVmIF9TZXJ2aWNlU3R1YkluaXQoc3R1YiwgcnBjX2NoYW5uZWwpOgotICAgICAgc3R1Yi5ycGNfY2hhbm5lbCA9IHJwY19jaGFubmVsCi0gICAgc2VsZi5jbHMgPSBjbHMKLSAgICBjbHMuX19pbml0X18gPSBfU2VydmljZVN0dWJJbml0Ci0gICAgZm9yIG1ldGhvZCBpbiBzZWxmLmRlc2NyaXB0b3IubWV0aG9kczoKLSAgICAgIHNldGF0dHIoY2xzLCBtZXRob2QubmFtZSwgc2VsZi5fR2VuZXJhdGVTdHViTWV0aG9kKG1ldGhvZCkpCi0KLSAgZGVmIF9HZW5lcmF0ZVN0dWJNZXRob2Qoc2VsZiwgbWV0aG9kKToKLSAgICByZXR1cm4gKGxhbWJkYSBpbnN0LCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwgY2FsbGJhY2s9Tm9uZToKLSAgICAgICAgc2VsZi5fU3R1Yk1ldGhvZChpbnN0LCBtZXRob2QsIHJwY19jb250cm9sbGVyLCByZXF1ZXN0LCBjYWxsYmFjaykpCi0KLSAgZGVmIF9TdHViTWV0aG9kKHNlbGYsIHN0dWIsIG1ldGhvZF9kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgcnBjX2NvbnRyb2xsZXIsIHJlcXVlc3QsIGNhbGxiYWNrKToKLSAgICAiIiJUaGUgYm9keSBvZiBhbGwgc2VydmljZSBtZXRob2RzIGluIHRoZSBnZW5lcmF0ZWQgc3R1YiBjbGFzcy4KLQotICAgIEFyZ3M6Ci0gICAgICBzdHViOiBTdHViIGluc3RhbmNlLgotICAgICAgbWV0aG9kX2Rlc2NyaXB0b3I6IERlc2NyaXB0b3Igb2YgdGhlIGludm9rZWQgbWV0aG9kLgotICAgICAgcnBjX2NvbnRyb2xsZXI6IFJwYyBjb250cm9sbGVyIHRvIGV4ZWN1dGUgdGhlIG1ldGhvZC4KLSAgICAgIHJlcXVlc3Q6IFJlcXVlc3QgcHJvdG9jb2wgbWVzc2FnZS4KLSAgICAgIGNhbGxiYWNrOiBBIGNhbGxiYWNrIHRvIGV4ZWN1dGUgd2hlbiB0aGUgbWV0aG9kIGZpbmlzaGVzLgotICAgIFJldHVybnM6Ci0gICAgICBSZXNwb25zZSBtZXNzYWdlIChpbiBjYXNlIG9mIGJsb2NraW5nIGNhbGwpLgotICAgICIiIgotICAgIHJldHVybiBzdHViLnJwY19jaGFubmVsLkNhbGxNZXRob2QoCi0gICAgICAgIG1ldGhvZF9kZXNjcmlwdG9yLCBycGNfY29udHJvbGxlciwgcmVxdWVzdCwKLSAgICAgICAgbWV0aG9kX2Rlc2NyaXB0b3Iub3V0cHV0X3R5cGUuX2NvbmNyZXRlX2NsYXNzLCBjYWxsYmFjaykKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IGMzYTFjZjYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQucHkKKysrIC9kZXYvbnVsbApAQCAtMSw2OTEgKzAsMCBAQAotIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KLSMKLSMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0Ci0jIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKLSMgbWV0OgotIwotIyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAotIyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0jICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKLSMgY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgotIyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0jIGRpc3RyaWJ1dGlvbi4KLSMgICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cwotIyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotIyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgotIwotIyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0jICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCi0jIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgotIyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotIyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKLSMgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAotIyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLSMgREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCi0jIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKLSMgKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0jIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCi0KLSIiIkNvbnRhaW5zIHJvdXRpbmVzIGZvciBwcmludGluZyBwcm90b2NvbCBtZXNzYWdlcyBpbiB0ZXh0IGZvcm1hdC4iIiIKLQotX19hdXRob3JfXyA9ICdrZW50b25AZ29vZ2xlLmNvbSAoS2VudG9uIFZhcmRhKScKLQotaW1wb3J0IGNTdHJpbmdJTwotaW1wb3J0IHJlCi0KLWZyb20gY29sbGVjdGlvbnMgaW1wb3J0IGRlcXVlCi1mcm9tIGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbCBpbXBvcnQgdHlwZV9jaGVja2VycwotZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IKLQotX19hbGxfXyA9IFsgJ01lc3NhZ2VUb1N0cmluZycsICdQcmludE1lc3NhZ2UnLCAnUHJpbnRGaWVsZCcsCi0gICAgICAgICAgICAnUHJpbnRGaWVsZFZhbHVlJywgJ01lcmdlJyBdCi0KLQotIyBJbmZpbml0eSBhbmQgTmFOIGFyZSBub3QgZXhwbGljaXRseSBzdXBwb3J0ZWQgYnkgUHl0aG9uIHByZS0yLjYsIGFuZAotIyBmbG9hdCgnaW5mJykgZG9lcyBub3Qgd29yayBvbiBXaW5kb3dzIChwcmUtMi42KS4KLV9JTkZJTklUWSA9IDFlMTAwMDAgICAgIyBvdmVyZmxvd3MsIHRodXMgd2lsbCBhY3R1YWxseSBiZSBpbmZpbml0eS4KLV9OQU4gPSBfSU5GSU5JVFkgKiAwCi0KLQotY2xhc3MgUGFyc2VFcnJvcihFeGNlcHRpb24pOgotICAiIiJUaHJvd24gaW4gY2FzZSBvZiBBU0NJSSBwYXJzaW5nIGVycm9yLiIiIgotCi0KLWRlZiBNZXNzYWdlVG9TdHJpbmcobWVzc2FnZSwgYXNfdXRmOD1GYWxzZSwgYXNfb25lX2xpbmU9RmFsc2UpOgotICBvdXQgPSBjU3RyaW5nSU8uU3RyaW5nSU8oKQotICBQcmludE1lc3NhZ2UobWVzc2FnZSwgb3V0LCBhc191dGY4PWFzX3V0ZjgsIGFzX29uZV9saW5lPWFzX29uZV9saW5lKQotICByZXN1bHQgPSBvdXQuZ2V0dmFsdWUoKQotICBvdXQuY2xvc2UoKQotICBpZiBhc19vbmVfbGluZToKLSAgICByZXR1cm4gcmVzdWx0LnJzdHJpcCgpCi0gIHJldHVybiByZXN1bHQKLQotCi1kZWYgUHJpbnRNZXNzYWdlKG1lc3NhZ2UsIG91dCwgaW5kZW50PTAsIGFzX3V0Zjg9RmFsc2UsIGFzX29uZV9saW5lPUZhbHNlKToKLSAgZm9yIGZpZWxkLCB2YWx1ZSBpbiBtZXNzYWdlLkxpc3RGaWVsZHMoKToKLSAgICBpZiBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9SRVBFQVRFRDoKLSAgICAgIGZvciBlbGVtZW50IGluIHZhbHVlOgotICAgICAgICBQcmludEZpZWxkKGZpZWxkLCBlbGVtZW50LCBvdXQsIGluZGVudCwgYXNfdXRmOCwgYXNfb25lX2xpbmUpCi0gICAgZWxzZToKLSAgICAgIFByaW50RmllbGQoZmllbGQsIHZhbHVlLCBvdXQsIGluZGVudCwgYXNfdXRmOCwgYXNfb25lX2xpbmUpCi0KLQotZGVmIFByaW50RmllbGQoZmllbGQsIHZhbHVlLCBvdXQsIGluZGVudD0wLCBhc191dGY4PUZhbHNlLCBhc19vbmVfbGluZT1GYWxzZSk6Ci0gICIiIlByaW50IGEgc2luZ2xlIGZpZWxkIG5hbWUvdmFsdWUgcGFpci4gIEZvciByZXBlYXRlZCBmaWVsZHMsIHRoZSB2YWx1ZQotICBzaG91bGQgYmUgYSBzaW5nbGUgZWxlbWVudC4iIiIKLQotICBvdXQud3JpdGUoJyAnICogaW5kZW50KTsKLSAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgotICAgIG91dC53cml0ZSgnWycpCi0gICAgaWYgKGZpZWxkLmNvbnRhaW5pbmdfdHlwZS5HZXRPcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgYW5kCi0gICAgICAgIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9NRVNTQUdFIGFuZAotICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUgPT0gZmllbGQuZXh0ZW5zaW9uX3Njb3BlIGFuZAotICAgICAgICBmaWVsZC5sYWJlbCA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5MQUJFTF9PUFRJT05BTCk6Ci0gICAgICBvdXQud3JpdGUoZmllbGQubWVzc2FnZV90eXBlLmZ1bGxfbmFtZSkKLSAgICBlbHNlOgotICAgICAgb3V0LndyaXRlKGZpZWxkLmZ1bGxfbmFtZSkKLSAgICBvdXQud3JpdGUoJ10nKQotICBlbGlmIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9HUk9VUDoKLSAgICAjIEZvciBncm91cHMsIHVzZSB0aGUgY2FwaXRhbGl6ZWQgbmFtZS4KLSAgICBvdXQud3JpdGUoZmllbGQubWVzc2FnZV90eXBlLm5hbWUpCi0gIGVsc2U6Ci0gICAgb3V0LndyaXRlKGZpZWxkLm5hbWUpCi0KLSAgaWYgZmllbGQuY3BwX3R5cGUgIT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9NRVNTQUdFOgotICAgICMgVGhlIGNvbG9uIGlzIG9wdGlvbmFsIGluIHRoaXMgY2FzZSwgYnV0IG91ciBjcm9zcy1sYW5ndWFnZSBnb2xkZW4gZmlsZXMKLSAgICAjIGRvbid0IGluY2x1ZGUgaXQuCi0gICAgb3V0LndyaXRlKCc6ICcpCi0KLSAgUHJpbnRGaWVsZFZhbHVlKGZpZWxkLCB2YWx1ZSwgb3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lKQotICBpZiBhc19vbmVfbGluZToKLSAgICBvdXQud3JpdGUoJyAnKQotICBlbHNlOgotICAgIG91dC53cml0ZSgnXG4nKQotCi0KLWRlZiBQcmludEZpZWxkVmFsdWUoZmllbGQsIHZhbHVlLCBvdXQsIGluZGVudD0wLAotICAgICAgICAgICAgICAgICAgICBhc191dGY4PUZhbHNlLCBhc19vbmVfbGluZT1GYWxzZSk6Ci0gICIiIlByaW50IGEgc2luZ2xlIGZpZWxkIHZhbHVlIChub3QgaW5jbHVkaW5nIG5hbWUpLiAgRm9yIHJlcGVhdGVkIGZpZWxkcywKLSAgdGhlIHZhbHVlIHNob3VsZCBiZSBhIHNpbmdsZSBlbGVtZW50LiIiIgotCi0gIGlmIGZpZWxkLmNwcF90eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkNQUFRZUEVfTUVTU0FHRToKLSAgICBpZiBhc19vbmVfbGluZToKLSAgICAgIG91dC53cml0ZSgnIHsgJykKLSAgICAgIFByaW50TWVzc2FnZSh2YWx1ZSwgb3V0LCBpbmRlbnQsIGFzX3V0ZjgsIGFzX29uZV9saW5lKQotICAgICAgb3V0LndyaXRlKCd9JykKLSAgICBlbHNlOgotICAgICAgb3V0LndyaXRlKCcge1xuJykKLSAgICAgIFByaW50TWVzc2FnZSh2YWx1ZSwgb3V0LCBpbmRlbnQgKyAyLCBhc191dGY4LCBhc19vbmVfbGluZSkKLSAgICAgIG91dC53cml0ZSgnICcgKiBpbmRlbnQgKyAnfScpCi0gIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9FTlVNOgotICAgIG91dC53cml0ZShmaWVsZC5lbnVtX3R5cGUudmFsdWVzX2J5X251bWJlclt2YWx1ZV0ubmFtZSkKLSAgZWxpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX1NUUklORzoKLSAgICBvdXQud3JpdGUoJ1wiJykKLSAgICBpZiB0eXBlKHZhbHVlKSBpcyB1bmljb2RlOgotICAgICAgb3V0LndyaXRlKF9DRXNjYXBlKHZhbHVlLmVuY29kZSgndXRmLTgnKSwgYXNfdXRmOCkpCi0gICAgZWxzZToKLSAgICAgIG91dC53cml0ZShfQ0VzY2FwZSh2YWx1ZSwgYXNfdXRmOCkpCi0gICAgb3V0LndyaXRlKCdcIicpCi0gIGVsaWYgZmllbGQuY3BwX3R5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuQ1BQVFlQRV9CT09MOgotICAgIGlmIHZhbHVlOgotICAgICAgb3V0LndyaXRlKCJ0cnVlIikKLSAgICBlbHNlOgotICAgICAgb3V0LndyaXRlKCJmYWxzZSIpCi0gIGVsc2U6Ci0gICAgb3V0LndyaXRlKHN0cih2YWx1ZSkpCi0KLQotZGVmIE1lcmdlKHRleHQsIG1lc3NhZ2UpOgotICAiIiJNZXJnZXMgYW4gQVNDSUkgcmVwcmVzZW50YXRpb24gb2YgYSBwcm90b2NvbCBtZXNzYWdlIGludG8gYSBtZXNzYWdlLgotCi0gIEFyZ3M6Ci0gICAgdGV4dDogTWVzc2FnZSBBU0NJSSByZXByZXNlbnRhdGlvbi4KLSAgICBtZXNzYWdlOiBBIHByb3RvY29sIGJ1ZmZlciBtZXNzYWdlIHRvIG1lcmdlIGludG8uCi0KLSAgUmFpc2VzOgotICAgIFBhcnNlRXJyb3I6IE9uIEFTQ0lJIHBhcnNpbmcgcHJvYmxlbXMuCi0gICIiIgotICB0b2tlbml6ZXIgPSBfVG9rZW5pemVyKHRleHQpCi0gIHdoaWxlIG5vdCB0b2tlbml6ZXIuQXRFbmQoKToKLSAgICBfTWVyZ2VGaWVsZCh0b2tlbml6ZXIsIG1lc3NhZ2UpCi0KLQotZGVmIF9NZXJnZUZpZWxkKHRva2VuaXplciwgbWVzc2FnZSk6Ci0gICIiIk1lcmdlcyBhIHNpbmdsZSBwcm90b2NvbCBtZXNzYWdlIGZpZWxkIGludG8gYSBtZXNzYWdlLgotCi0gIEFyZ3M6Ci0gICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgbmFtZSBhbmQgdmFsdWVzLgotICAgIG1lc3NhZ2U6IEEgcHJvdG9jb2wgbWVzc2FnZSB0byByZWNvcmQgdGhlIGRhdGEuCi0KLSAgUmFpc2VzOgotICAgIFBhcnNlRXJyb3I6IEluIGNhc2Ugb2YgQVNDSUkgcGFyc2luZyBwcm9ibGVtcy4KLSAgIiIiCi0gIG1lc3NhZ2VfZGVzY3JpcHRvciA9IG1lc3NhZ2UuREVTQ1JJUFRPUgotICBpZiB0b2tlbml6ZXIuVHJ5Q29uc3VtZSgnWycpOgotICAgIG5hbWUgPSBbdG9rZW5pemVyLkNvbnN1bWVJZGVudGlmaWVyKCldCi0gICAgd2hpbGUgdG9rZW5pemVyLlRyeUNvbnN1bWUoJy4nKToKLSAgICAgIG5hbWUuYXBwZW5kKHRva2VuaXplci5Db25zdW1lSWRlbnRpZmllcigpKQotICAgIG5hbWUgPSAnLicuam9pbihuYW1lKQotCi0gICAgaWYgbm90IG1lc3NhZ2VfZGVzY3JpcHRvci5pc19leHRlbmRhYmxlOgotICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICdNZXNzYWdlIHR5cGUgIiVzIiBkb2VzIG5vdCBoYXZlIGV4dGVuc2lvbnMuJyAlCi0gICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkKLSAgICBmaWVsZCA9IG1lc3NhZ2UuRXh0ZW5zaW9ucy5fRmluZEV4dGVuc2lvbkJ5TmFtZShuYW1lKQotICAgIGlmIG5vdCBmaWVsZDoKLSAgICAgIHJhaXNlIHRva2VuaXplci5QYXJzZUVycm9yUHJldmlvdXNUb2tlbigKLSAgICAgICAgICAnRXh0ZW5zaW9uICIlcyIgbm90IHJlZ2lzdGVyZWQuJyAlIG5hbWUpCi0gICAgZWxpZiBtZXNzYWdlX2Rlc2NyaXB0b3IgIT0gZmllbGQuY29udGFpbmluZ190eXBlOgotICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICdFeHRlbnNpb24gIiVzIiBkb2VzIG5vdCBleHRlbmQgbWVzc2FnZSB0eXBlICIlcyIuJyAlICgKLSAgICAgICAgICAgICAgbmFtZSwgbWVzc2FnZV9kZXNjcmlwdG9yLmZ1bGxfbmFtZSkpCi0gICAgdG9rZW5pemVyLkNvbnN1bWUoJ10nKQotICBlbHNlOgotICAgIG5hbWUgPSB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKQotICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLmdldChuYW1lLCBOb25lKQotCi0gICAgIyBHcm91cCBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FwaXRhbGl6ZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlCi0gICAgIyAucHJvdG8gZmlsZSwgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGVpciB0eXBlIG5hbWVzLCBub3QgdGhlaXIgZmllbGQKLSAgICAjIG5hbWVzLgotICAgIGlmIG5vdCBmaWVsZDoKLSAgICAgIGZpZWxkID0gbWVzc2FnZV9kZXNjcmlwdG9yLmZpZWxkc19ieV9uYW1lLmdldChuYW1lLmxvd2VyKCksIE5vbmUpCi0gICAgICBpZiBmaWVsZCBhbmQgZmllbGQudHlwZSAhPSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQOgotICAgICAgICBmaWVsZCA9IE5vbmUKLQotICAgIGlmIChmaWVsZCBhbmQgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0dST1VQIGFuZAotICAgICAgICBmaWVsZC5tZXNzYWdlX3R5cGUubmFtZSAhPSBuYW1lKToKLSAgICAgIGZpZWxkID0gTm9uZQotCi0gICAgaWYgbm90IGZpZWxkOgotICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICdNZXNzYWdlIHR5cGUgIiVzIiBoYXMgbm8gZmllbGQgbmFtZWQgIiVzIi4nICUgKAotICAgICAgICAgICAgICBtZXNzYWdlX2Rlc2NyaXB0b3IuZnVsbF9uYW1lLCBuYW1lKSkKLQotICBpZiBmaWVsZC5jcHBfdHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5DUFBUWVBFX01FU1NBR0U6Ci0gICAgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzonKQotCi0gICAgaWYgdG9rZW5pemVyLlRyeUNvbnN1bWUoJzwnKToKLSAgICAgIGVuZF90b2tlbiA9ICc+JwotICAgIGVsc2U6Ci0gICAgICB0b2tlbml6ZXIuQ29uc3VtZSgneycpCi0gICAgICBlbmRfdG9rZW4gPSAnfScKLQotICAgIGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgICAgaWYgZmllbGQuaXNfZXh0ZW5zaW9uOgotICAgICAgICBzdWJfbWVzc2FnZSA9IG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0uYWRkKCkKLSAgICAgIGVsc2U6Ci0gICAgICAgIHN1Yl9tZXNzYWdlID0gZ2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lKS5hZGQoKQotICAgIGVsc2U6Ci0gICAgICBpZiBmaWVsZC5pc19leHRlbnNpb246Ci0gICAgICAgIHN1Yl9tZXNzYWdlID0gbWVzc2FnZS5FeHRlbnNpb25zW2ZpZWxkXQotICAgICAgZWxzZToKLSAgICAgICAgc3ViX21lc3NhZ2UgPSBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpCi0gICAgICBzdWJfbWVzc2FnZS5TZXRJblBhcmVudCgpCi0KLSAgICB3aGlsZSBub3QgdG9rZW5pemVyLlRyeUNvbnN1bWUoZW5kX3Rva2VuKToKLSAgICAgIGlmIHRva2VuaXplci5BdEVuZCgpOgotICAgICAgICByYWlzZSB0b2tlbml6ZXIuUGFyc2VFcnJvclByZXZpb3VzVG9rZW4oJ0V4cGVjdGVkICIlcyIuJyAlIChlbmRfdG9rZW4pKQotICAgICAgX01lcmdlRmllbGQodG9rZW5pemVyLCBzdWJfbWVzc2FnZSkKLSAgZWxzZToKLSAgICBfTWVyZ2VTY2FsYXJGaWVsZCh0b2tlbml6ZXIsIG1lc3NhZ2UsIGZpZWxkKQotCi0KLWRlZiBfTWVyZ2VTY2FsYXJGaWVsZCh0b2tlbml6ZXIsIG1lc3NhZ2UsIGZpZWxkKToKLSAgIiIiTWVyZ2VzIGEgc2luZ2xlIHByb3RvY29sIG1lc3NhZ2Ugc2NhbGFyIGZpZWxkIGludG8gYSBtZXNzYWdlLgotCi0gIEFyZ3M6Ci0gICAgdG9rZW5pemVyOiBBIHRva2VuaXplciB0byBwYXJzZSB0aGUgZmllbGQgdmFsdWUuCi0gICAgbWVzc2FnZTogQSBwcm90b2NvbCBtZXNzYWdlIHRvIHJlY29yZCB0aGUgZGF0YS4KLSAgICBmaWVsZDogVGhlIGRlc2NyaXB0b3Igb2YgdGhlIGZpZWxkIHRvIGJlIG1lcmdlZC4KLQotICBSYWlzZXM6Ci0gICAgUGFyc2VFcnJvcjogSW4gY2FzZSBvZiBBU0NJSSBwYXJzaW5nIHByb2JsZW1zLgotICAgIFJ1bnRpbWVFcnJvcjogT24gcnVudGltZSBlcnJvcnMuCi0gICIiIgotICB0b2tlbml6ZXIuQ29uc3VtZSgnOicpCi0gIHZhbHVlID0gTm9uZQotCi0gIGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UMzIsCi0gICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfU0lOVDMyLAotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NGSVhFRDMyKToKLSAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lSW50MzIoKQotICBlbGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfSU5UNjQsCi0gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TSU5UNjQsCi0gICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9TRklYRUQ2NCk6Ci0gICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUludDY0KCkKLSAgZWxpZiBmaWVsZC50eXBlIGluIChkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1VJTlQzMiwKLSAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0ZJWEVEMzIpOgotICAgIHZhbHVlID0gdG9rZW5pemVyLkNvbnN1bWVVaW50MzIoKQotICBlbGlmIGZpZWxkLnR5cGUgaW4gKGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfVUlOVDY0LAotICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfRklYRUQ2NCk6Ci0gICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZVVpbnQ2NCgpCi0gIGVsaWYgZmllbGQudHlwZSBpbiAoZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9GTE9BVCwKLSAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX0RPVUJMRSk6Ci0gICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUZsb2F0KCkKLSAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQk9PTDoKLSAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lQm9vbCgpCi0gIGVsaWYgZmllbGQudHlwZSA9PSBkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvci5UWVBFX1NUUklORzoKLSAgICB2YWx1ZSA9IHRva2VuaXplci5Db25zdW1lU3RyaW5nKCkKLSAgZWxpZiBmaWVsZC50eXBlID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLlRZUEVfQllURVM6Ci0gICAgdmFsdWUgPSB0b2tlbml6ZXIuQ29uc3VtZUJ5dGVTdHJpbmcoKQotICBlbGlmIGZpZWxkLnR5cGUgPT0gZGVzY3JpcHRvci5GaWVsZERlc2NyaXB0b3IuVFlQRV9FTlVNOgotICAgICMgRW51bSBjYW4gYmUgc3BlY2lmaWVkIGJ5IGEgbnVtYmVyICh0aGUgZW51bSB2YWx1ZSksIG9yIGJ5Ci0gICAgIyBhIHN0cmluZyBsaXRlcmFsICh0aGUgZW51bSBuYW1lKS4KLSAgICBlbnVtX2Rlc2NyaXB0b3IgPSBmaWVsZC5lbnVtX3R5cGUKLSAgICBpZiB0b2tlbml6ZXIuTG9va2luZ0F0SW50ZWdlcigpOgotICAgICAgbnVtYmVyID0gdG9rZW5pemVyLkNvbnN1bWVJbnQzMigpCi0gICAgICBlbnVtX3ZhbHVlID0gZW51bV9kZXNjcmlwdG9yLnZhbHVlc19ieV9udW1iZXIuZ2V0KG51bWJlciwgTm9uZSkKLSAgICAgIGlmIGVudW1fdmFsdWUgaXMgTm9uZToKLSAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICAgJ0VudW0gdHlwZSAiJXMiIGhhcyBubyB2YWx1ZSB3aXRoIG51bWJlciAlZC4nICUgKAotICAgICAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci5mdWxsX25hbWUsIG51bWJlcikpCi0gICAgZWxzZToKLSAgICAgIGlkZW50aWZpZXIgPSB0b2tlbml6ZXIuQ29uc3VtZUlkZW50aWZpZXIoKQotICAgICAgZW51bV92YWx1ZSA9IGVudW1fZGVzY3JpcHRvci52YWx1ZXNfYnlfbmFtZS5nZXQoaWRlbnRpZmllciwgTm9uZSkKLSAgICAgIGlmIGVudW1fdmFsdWUgaXMgTm9uZToKLSAgICAgICAgcmFpc2UgdG9rZW5pemVyLlBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKAotICAgICAgICAgICAgJ0VudW0gdHlwZSAiJXMiIGhhcyBubyB2YWx1ZSBuYW1lZCAlcy4nICUgKAotICAgICAgICAgICAgICAgIGVudW1fZGVzY3JpcHRvci5mdWxsX25hbWUsIGlkZW50aWZpZXIpKQotICAgIHZhbHVlID0gZW51bV92YWx1ZS5udW1iZXIKLSAgZWxzZToKLSAgICByYWlzZSBSdW50aW1lRXJyb3IoJ1Vua25vd24gZmllbGQgdHlwZSAlZCcgJSBmaWVsZC50eXBlKQotCi0gIGlmIGZpZWxkLmxhYmVsID09IGRlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yLkxBQkVMX1JFUEVBVEVEOgotICAgIGlmIGZpZWxkLmlzX2V4dGVuc2lvbjoKLSAgICAgIG1lc3NhZ2UuRXh0ZW5zaW9uc1tmaWVsZF0uYXBwZW5kKHZhbHVlKQotICAgIGVsc2U6Ci0gICAgICBnZXRhdHRyKG1lc3NhZ2UsIGZpZWxkLm5hbWUpLmFwcGVuZCh2YWx1ZSkKLSAgZWxzZToKLSAgICBpZiBmaWVsZC5pc19leHRlbnNpb246Ci0gICAgICBtZXNzYWdlLkV4dGVuc2lvbnNbZmllbGRdID0gdmFsdWUKLSAgICBlbHNlOgotICAgICAgc2V0YXR0cihtZXNzYWdlLCBmaWVsZC5uYW1lLCB2YWx1ZSkKLQotCi1jbGFzcyBfVG9rZW5pemVyKG9iamVjdCk6Ci0gICIiIlByb3RvY29sIGJ1ZmZlciBBU0NJSSByZXByZXNlbnRhdGlvbiB0b2tlbml6ZXIuCi0KLSAgVGhpcyBjbGFzcyBoYW5kbGVzIHRoZSBsb3dlciBsZXZlbCBzdHJpbmcgcGFyc2luZyBieSBzcGxpdHRpbmcgaXQgaW50bwotICBtZWFuaW5nZnVsIHRva2Vucy4KLQotICBJdCB3YXMgZGlyZWN0bHkgcG9ydGVkIGZyb20gdGhlIEphdmEgcHJvdG9jb2wgYnVmZmVyIEFQSS4KLSAgIiIiCi0KLSAgX1dISVRFU1BBQ0UgPSByZS5jb21waWxlKCcoXFxzfCgjLiokKSkrJywgcmUuTVVMVElMSU5FKQotICBfVE9LRU4gPSByZS5jb21waWxlKAotICAgICAgJ1thLXpBLVpfXVswLTlhLXpBLVpfKy1dKnwnICAgICAgICAgICAjIGFuIGlkZW50aWZpZXIKLSAgICAgICdbMC05Ky1dWzAtOWEtekEtWl8uKy1dKnwnICAgICAgICAgICAgIyBhIG51bWJlcgotICAgICAgJ1wiKFteXCJcblxcXFxdfFxcXFwuKSooXCJ8XFxcXD8kKXwnICAjIGEgZG91YmxlLXF1b3RlZCBzdHJpbmcKLSAgICAgICdcJyhbXlwnXG5cXFxcXXxcXFxcLikqKFwnfFxcXFw/JCknKSAgIyBhIHNpbmdsZS1xdW90ZWQgc3RyaW5nCi0gIF9JREVOVElGSUVSID0gcmUuY29tcGlsZSgnXHcrJykKLSAgX0lOVEVHRVJfQ0hFQ0tFUlMgPSBbdHlwZV9jaGVja2Vycy5VaW50MzJWYWx1ZUNoZWNrZXIoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9jaGVja2Vycy5JbnQzMlZhbHVlQ2hlY2tlcigpLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrZXJzLlVpbnQ2NFZhbHVlQ2hlY2tlcigpLAotICAgICAgICAgICAgICAgICAgICAgICB0eXBlX2NoZWNrZXJzLkludDY0VmFsdWVDaGVja2VyKCldCi0gIF9GTE9BVF9JTkZJTklUWSA9IHJlLmNvbXBpbGUoJy0/aW5mKGluaXR5KT9mPycsIHJlLklHTk9SRUNBU0UpCi0gIF9GTE9BVF9OQU4gPSByZS5jb21waWxlKCJuYW5mPyIsIHJlLklHTk9SRUNBU0UpCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHRleHRfbWVzc2FnZSk6Ci0gICAgc2VsZi5fdGV4dF9tZXNzYWdlID0gdGV4dF9tZXNzYWdlCi0KLSAgICBzZWxmLl9wb3NpdGlvbiA9IDAKLSAgICBzZWxmLl9saW5lID0gLTEKLSAgICBzZWxmLl9jb2x1bW4gPSAwCi0gICAgc2VsZi5fdG9rZW5fc3RhcnQgPSBOb25lCi0gICAgc2VsZi50b2tlbiA9ICcnCi0gICAgc2VsZi5fbGluZXMgPSBkZXF1ZSh0ZXh0X21lc3NhZ2Uuc3BsaXQoJ1xuJykpCi0gICAgc2VsZi5fY3VycmVudF9saW5lID0gJycKLSAgICBzZWxmLl9wcmV2aW91c19saW5lID0gMAotICAgIHNlbGYuX3ByZXZpb3VzX2NvbHVtbiA9IDAKLSAgICBzZWxmLl9Ta2lwV2hpdGVzcGFjZSgpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotCi0gIGRlZiBBdEVuZChzZWxmKToKLSAgICAiIiJDaGVja3MgdGhlIGVuZCBvZiB0aGUgdGV4dCB3YXMgcmVhY2hlZC4KLQotICAgIFJldHVybnM6Ci0gICAgICBUcnVlIGlmZiB0aGUgZW5kIHdhcyByZWFjaGVkLgotICAgICIiIgotICAgIHJldHVybiBzZWxmLnRva2VuID09ICcnCi0KLSAgZGVmIF9Qb3BMaW5lKHNlbGYpOgotICAgIHdoaWxlIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpIDw9IHNlbGYuX2NvbHVtbjoKLSAgICAgIGlmIG5vdCBzZWxmLl9saW5lczoKLSAgICAgICAgc2VsZi5fY3VycmVudF9saW5lID0gJycKLSAgICAgICAgcmV0dXJuCi0gICAgICBzZWxmLl9saW5lICs9IDEKLSAgICAgIHNlbGYuX2NvbHVtbiA9IDAKLSAgICAgIHNlbGYuX2N1cnJlbnRfbGluZSA9IHNlbGYuX2xpbmVzLnBvcGxlZnQoKQotCi0gIGRlZiBfU2tpcFdoaXRlc3BhY2Uoc2VsZik6Ci0gICAgd2hpbGUgVHJ1ZToKLSAgICAgIHNlbGYuX1BvcExpbmUoKQotICAgICAgbWF0Y2ggPSBzZWxmLl9XSElURVNQQUNFLm1hdGNoKHNlbGYuX2N1cnJlbnRfbGluZSwgc2VsZi5fY29sdW1uKQotICAgICAgaWYgbm90IG1hdGNoOgotICAgICAgICBicmVhawotICAgICAgbGVuZ3RoID0gbGVuKG1hdGNoLmdyb3VwKDApKQotICAgICAgc2VsZi5fY29sdW1uICs9IGxlbmd0aAotCi0gIGRlZiBUcnlDb25zdW1lKHNlbGYsIHRva2VuKToKLSAgICAiIiJUcmllcyB0byBjb25zdW1lIGEgZ2l2ZW4gcGllY2Ugb2YgdGV4dC4KLQotICAgIEFyZ3M6Ci0gICAgICB0b2tlbjogVGV4dCB0byBjb25zdW1lLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRydWUgaWZmIHRoZSB0ZXh0IHdhcyBjb25zdW1lZC4KLSAgICAiIiIKLSAgICBpZiBzZWxmLnRva2VuID09IHRva2VuOgotICAgICAgc2VsZi5OZXh0VG9rZW4oKQotICAgICAgcmV0dXJuIFRydWUKLSAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgQ29uc3VtZShzZWxmLCB0b2tlbik6Ci0gICAgIiIiQ29uc3VtZXMgYSBwaWVjZSBvZiB0ZXh0LgotCi0gICAgQXJnczoKLSAgICAgIHRva2VuOiBUZXh0IHRvIGNvbnN1bWUuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBJZiB0aGUgdGV4dCBjb3VsZG4ndCBiZSBjb25zdW1lZC4KLSAgICAiIiIKLSAgICBpZiBub3Qgc2VsZi5UcnlDb25zdW1lKHRva2VuKToKLSAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3IoJ0V4cGVjdGVkICIlcyIuJyAlIHRva2VuKQotCi0gIGRlZiBMb29raW5nQXRJbnRlZ2VyKHNlbGYpOgotICAgICIiIkNoZWNrcyBpZiB0aGUgY3VycmVudCB0b2tlbiBpcyBhbiBpbnRlZ2VyLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRydWUgaWZmIHRoZSBjdXJyZW50IHRva2VuIGlzIGFuIGludGVnZXIuCi0gICAgIiIiCi0gICAgaWYgbm90IHNlbGYudG9rZW46Ci0gICAgICByZXR1cm4gRmFsc2UKLSAgICBjID0gc2VsZi50b2tlblswXQotICAgIHJldHVybiAoYyA+PSAnMCcgYW5kIGMgPD0gJzknKSBvciBjID09ICctJyBvciBjID09ICcrJwotCi0gIGRlZiBDb25zdW1lSWRlbnRpZmllcihzZWxmKToKLSAgICAiIiJDb25zdW1lcyBwcm90b2NvbCBtZXNzYWdlIGZpZWxkIGlkZW50aWZpZXIuCi0KLSAgICBSZXR1cm5zOgotICAgICAgSWRlbnRpZmllciBzdHJpbmcuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBJZiBhbiBpZGVudGlmaWVyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIHJlc3VsdCA9IHNlbGYudG9rZW4KLSAgICBpZiBub3Qgc2VsZi5fSURFTlRJRklFUi5tYXRjaChyZXN1bHQpOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcignRXhwZWN0ZWQgaWRlbnRpZmllci4nKQotICAgIHNlbGYuTmV4dFRva2VuKCkKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIENvbnN1bWVJbnQzMihzZWxmKToKLSAgICAiIiJDb25zdW1lcyBhIHNpZ25lZCAzMmJpdCBpbnRlZ2VyIG51bWJlci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgaW50ZWdlciBwYXJzZWQuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBJZiBhIHNpZ25lZCAzMmJpdCBpbnRlZ2VyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IHNlbGYuX1BhcnNlSW50ZWdlcihzZWxmLnRva2VuLCBpc19zaWduZWQ9VHJ1ZSwgaXNfbG9uZz1GYWxzZSkKLSAgICBleGNlcHQgVmFsdWVFcnJvciwgZToKLSAgICAgIHJhaXNlIHNlbGYuX0ludGVnZXJQYXJzZUVycm9yKGUpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgQ29uc3VtZVVpbnQzMihzZWxmKToKLSAgICAiIiJDb25zdW1lcyBhbiB1bnNpZ25lZCAzMmJpdCBpbnRlZ2VyIG51bWJlci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgaW50ZWdlciBwYXJzZWQuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBJZiBhbiB1bnNpZ25lZCAzMmJpdCBpbnRlZ2VyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IHNlbGYuX1BhcnNlSW50ZWdlcihzZWxmLnRva2VuLCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9RmFsc2UpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6Ci0gICAgICByYWlzZSBzZWxmLl9JbnRlZ2VyUGFyc2VFcnJvcihlKQotICAgIHNlbGYuTmV4dFRva2VuKCkKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIENvbnN1bWVJbnQ2NChzZWxmKToKLSAgICAiIiJDb25zdW1lcyBhIHNpZ25lZCA2NGJpdCBpbnRlZ2VyIG51bWJlci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgaW50ZWdlciBwYXJzZWQuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBQYXJzZUVycm9yOiBJZiBhIHNpZ25lZCA2NGJpdCBpbnRlZ2VyIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IHNlbGYuX1BhcnNlSW50ZWdlcihzZWxmLnRva2VuLCBpc19zaWduZWQ9VHJ1ZSwgaXNfbG9uZz1UcnVlKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgotICAgICAgcmFpc2Ugc2VsZi5fSW50ZWdlclBhcnNlRXJyb3IoZSkKLSAgICBzZWxmLk5leHRUb2tlbigpCi0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBDb25zdW1lVWludDY0KHNlbGYpOgotICAgICIiIkNvbnN1bWVzIGFuIHVuc2lnbmVkIDY0Yml0IGludGVnZXIgbnVtYmVyLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBpbnRlZ2VyIHBhcnNlZC4KLQotICAgIFJhaXNlczoKLSAgICAgIFBhcnNlRXJyb3I6IElmIGFuIHVuc2lnbmVkIDY0Yml0IGludGVnZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gc2VsZi5fUGFyc2VJbnRlZ2VyKHNlbGYudG9rZW4sIGlzX3NpZ25lZD1GYWxzZSwgaXNfbG9uZz1UcnVlKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgotICAgICAgcmFpc2Ugc2VsZi5fSW50ZWdlclBhcnNlRXJyb3IoZSkKLSAgICBzZWxmLk5leHRUb2tlbigpCi0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBDb25zdW1lRmxvYXQoc2VsZik6Ci0gICAgIiIiQ29uc3VtZXMgYW4gZmxvYXRpbmcgcG9pbnQgbnVtYmVyLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBudW1iZXIgcGFyc2VkLgotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogSWYgYSBmbG9hdGluZyBwb2ludCBudW1iZXIgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgdGV4dCA9IHNlbGYudG9rZW4KLSAgICBpZiBzZWxmLl9GTE9BVF9JTkZJTklUWS5tYXRjaCh0ZXh0KToKLSAgICAgIHNlbGYuTmV4dFRva2VuKCkKLSAgICAgIGlmIHRleHQuc3RhcnRzd2l0aCgnLScpOgotICAgICAgICByZXR1cm4gLV9JTkZJTklUWQotICAgICAgcmV0dXJuIF9JTkZJTklUWQotCi0gICAgaWYgc2VsZi5fRkxPQVRfTkFOLm1hdGNoKHRleHQpOgotICAgICAgc2VsZi5OZXh0VG9rZW4oKQotICAgICAgcmV0dXJuIF9OQU4KLQotICAgIHRyeToKLSAgICAgIHJlc3VsdCA9IGZsb2F0KHRleHQpCi0gICAgZXhjZXB0IFZhbHVlRXJyb3IsIGU6Ci0gICAgICByYWlzZSBzZWxmLl9GbG9hdFBhcnNlRXJyb3IoZSkKLSAgICBzZWxmLk5leHRUb2tlbigpCi0gICAgcmV0dXJuIHJlc3VsdAotCi0gIGRlZiBDb25zdW1lQm9vbChzZWxmKToKLSAgICAiIiJDb25zdW1lcyBhIGJvb2xlYW4gdmFsdWUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGJvb2wgcGFyc2VkLgotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogSWYgYSBib29sZWFuIHZhbHVlIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIGlmIHNlbGYudG9rZW4gaW4gKCd0cnVlJywgJ3QnLCAnMScpOgotICAgICAgc2VsZi5OZXh0VG9rZW4oKQotICAgICAgcmV0dXJuIFRydWUKLSAgICBlbGlmIHNlbGYudG9rZW4gaW4gKCdmYWxzZScsICdmJywgJzAnKToKLSAgICAgIHNlbGYuTmV4dFRva2VuKCkKLSAgICAgIHJldHVybiBGYWxzZQotICAgIGVsc2U6Ci0gICAgICByYWlzZSBzZWxmLl9QYXJzZUVycm9yKCdFeHBlY3RlZCAidHJ1ZSIgb3IgImZhbHNlIi4nKQotCi0gIGRlZiBDb25zdW1lU3RyaW5nKHNlbGYpOgotICAgICIiIkNvbnN1bWVzIGEgc3RyaW5nIHZhbHVlLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBzdHJpbmcgcGFyc2VkLgotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogSWYgYSBzdHJpbmcgdmFsdWUgY291bGRuJ3QgYmUgY29uc3VtZWQuCi0gICAgIiIiCi0gICAgYnl0ZXMgPSBzZWxmLkNvbnN1bWVCeXRlU3RyaW5nKCkKLSAgICB0cnk6Ci0gICAgICByZXR1cm4gdW5pY29kZShieXRlcywgJ3V0Zi04JykKLSAgICBleGNlcHQgVW5pY29kZURlY29kZUVycm9yLCBlOgotICAgICAgcmFpc2Ugc2VsZi5fU3RyaW5nUGFyc2VFcnJvcihlKQotCi0gIGRlZiBDb25zdW1lQnl0ZVN0cmluZyhzZWxmKToKLSAgICAiIiJDb25zdW1lcyBhIGJ5dGUgYXJyYXkgdmFsdWUuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGFycmF5IHBhcnNlZCAoYXMgYSBzdHJpbmcpLgotCi0gICAgUmFpc2VzOgotICAgICAgUGFyc2VFcnJvcjogSWYgYSBieXRlIGFycmF5IHZhbHVlIGNvdWxkbid0IGJlIGNvbnN1bWVkLgotICAgICIiIgotICAgIGxpc3QgPSBbc2VsZi5fQ29uc3VtZVNpbmdsZUJ5dGVTdHJpbmcoKV0KLSAgICB3aGlsZSBsZW4oc2VsZi50b2tlbikgPiAwIGFuZCBzZWxmLnRva2VuWzBdIGluICgnXCcnLCAnIicpOgotICAgICAgbGlzdC5hcHBlbmQoc2VsZi5fQ29uc3VtZVNpbmdsZUJ5dGVTdHJpbmcoKSkKLSAgICByZXR1cm4gIiIuam9pbihsaXN0KQotCi0gIGRlZiBfQ29uc3VtZVNpbmdsZUJ5dGVTdHJpbmcoc2VsZik6Ci0gICAgIiIiQ29uc3VtZSBvbmUgdG9rZW4gb2YgYSBzdHJpbmcgbGl0ZXJhbC4KLQotICAgIFN0cmluZyBsaXRlcmFscyAod2hldGhlciBieXRlcyBvciB0ZXh0KSBjYW4gY29tZSBpbiBtdWx0aXBsZSBhZGphY2VudAotICAgIHRva2VucyB3aGljaCBhcmUgYXV0b21hdGljYWxseSBjb25jYXRlbmF0ZWQsIGxpa2UgaW4gQyBvciBQeXRob24uICBUaGlzCi0gICAgbWV0aG9kIG9ubHkgY29uc3VtZXMgb25lIHRva2VuLgotICAgICIiIgotICAgIHRleHQgPSBzZWxmLnRva2VuCi0gICAgaWYgbGVuKHRleHQpIDwgMSBvciB0ZXh0WzBdIG5vdCBpbiAoJ1wnJywgJyInKToKLSAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3IoJ0V4cHRlY3RlZCBzdHJpbmcuJykKLQotICAgIGlmIGxlbih0ZXh0KSA8IDIgb3IgdGV4dFstMV0gIT0gdGV4dFswXToKLSAgICAgIHJhaXNlIHNlbGYuX1BhcnNlRXJyb3IoJ1N0cmluZyBtaXNzaW5nIGVuZGluZyBxdW90ZS4nKQotCi0gICAgdHJ5OgotICAgICAgcmVzdWx0ID0gX0NVbmVzY2FwZSh0ZXh0WzE6LTFdKQotICAgIGV4Y2VwdCBWYWx1ZUVycm9yLCBlOgotICAgICAgcmFpc2Ugc2VsZi5fUGFyc2VFcnJvcihzdHIoZSkpCi0gICAgc2VsZi5OZXh0VG9rZW4oKQotICAgIHJldHVybiByZXN1bHQKLQotICBkZWYgX1BhcnNlSW50ZWdlcihzZWxmLCB0ZXh0LCBpc19zaWduZWQ9RmFsc2UsIGlzX2xvbmc9RmFsc2UpOgotICAgICIiIlBhcnNlcyBhbiBpbnRlZ2VyLgotCi0gICAgQXJnczoKLSAgICAgIHRleHQ6IFRoZSB0ZXh0IHRvIHBhcnNlLgotICAgICAgaXNfc2lnbmVkOiBUcnVlIGlmIGEgc2lnbmVkIGludGVnZXIgbXVzdCBiZSBwYXJzZWQuCi0gICAgICBpc19sb25nOiBUcnVlIGlmIGEgbG9uZyBpbnRlZ2VyIG11c3QgYmUgcGFyc2VkLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBpbnRlZ2VyIHZhbHVlLgotCi0gICAgUmFpc2VzOgotICAgICAgVmFsdWVFcnJvcjogVGhyb3duIElmZiB0aGUgdGV4dCBpcyBub3QgYSB2YWxpZCBpbnRlZ2VyLgotICAgICIiIgotICAgIHBvcyA9IDAKLSAgICBpZiB0ZXh0LnN0YXJ0c3dpdGgoJy0nKToKLSAgICAgIHBvcyArPSAxCi0KLSAgICBiYXNlID0gMTAKLSAgICBpZiB0ZXh0LnN0YXJ0c3dpdGgoJzB4JywgcG9zKSBvciB0ZXh0LnN0YXJ0c3dpdGgoJzBYJywgcG9zKToKLSAgICAgIGJhc2UgPSAxNgotICAgIGVsaWYgdGV4dC5zdGFydHN3aXRoKCcwJywgcG9zKToKLSAgICAgIGJhc2UgPSA4Ci0KLSAgICAjIERvIHRoZSBhY3R1YWwgcGFyc2luZy4gRXhjZXB0aW9uIGhhbmRsaW5nIGlzIHByb3BhZ2F0ZWQgdG8gY2FsbGVyLgotICAgIHJlc3VsdCA9IGludCh0ZXh0LCBiYXNlKQotCi0gICAgIyBDaGVjayBpZiB0aGUgaW50ZWdlciBpcyBzYW5lLiBFeGNlcHRpb25zIGhhbmRsZWQgYnkgY2FsbGVycy4KLSAgICBjaGVja2VyID0gc2VsZi5fSU5URUdFUl9DSEVDS0VSU1syICogaW50KGlzX2xvbmcpICsgaW50KGlzX3NpZ25lZCldCi0gICAgY2hlY2tlci5DaGVja1ZhbHVlKHJlc3VsdCkKLSAgICByZXR1cm4gcmVzdWx0Ci0KLSAgZGVmIFBhcnNlRXJyb3JQcmV2aW91c1Rva2VuKHNlbGYsIG1lc3NhZ2UpOgotICAgICIiIkNyZWF0ZXMgYW5kICpyZXR1cm5zKiBhIFBhcnNlRXJyb3IgZm9yIHRoZSBwcmV2aW91c2x5IHJlYWQgdG9rZW4uCi0KLSAgICBBcmdzOgotICAgICAgbWVzc2FnZTogQSBtZXNzYWdlIHRvIHNldCBmb3IgdGhlIGV4Y2VwdGlvbi4KLQotICAgIFJldHVybnM6Ci0gICAgICBBIFBhcnNlRXJyb3IgaW5zdGFuY2UuCi0gICAgIiIiCi0gICAgcmV0dXJuIFBhcnNlRXJyb3IoJyVkOiVkIDogJXMnICUgKAotICAgICAgICBzZWxmLl9wcmV2aW91c19saW5lICsgMSwgc2VsZi5fcHJldmlvdXNfY29sdW1uICsgMSwgbWVzc2FnZSkpCi0KLSAgZGVmIF9QYXJzZUVycm9yKHNlbGYsIG1lc3NhZ2UpOgotICAgICIiIkNyZWF0ZXMgYW5kICpyZXR1cm5zKiBhIFBhcnNlRXJyb3IgZm9yIHRoZSBjdXJyZW50IHRva2VuLiIiIgotICAgIHJldHVybiBQYXJzZUVycm9yKCclZDolZCA6ICVzJyAlICgKLSAgICAgICAgc2VsZi5fbGluZSArIDEsIHNlbGYuX2NvbHVtbiAtIGxlbihzZWxmLnRva2VuKSArIDEsIG1lc3NhZ2UpKQotCi0gIGRlZiBfSW50ZWdlclBhcnNlRXJyb3Ioc2VsZiwgZSk6Ci0gICAgcmV0dXJuIHNlbGYuX1BhcnNlRXJyb3IoJ0NvdWxkblwndCBwYXJzZSBpbnRlZ2VyOiAnICsgc3RyKGUpKQotCi0gIGRlZiBfRmxvYXRQYXJzZUVycm9yKHNlbGYsIGUpOgotICAgIHJldHVybiBzZWxmLl9QYXJzZUVycm9yKCdDb3VsZG5cJ3QgcGFyc2UgbnVtYmVyOiAnICsgc3RyKGUpKQotCi0gIGRlZiBfU3RyaW5nUGFyc2VFcnJvcihzZWxmLCBlKToKLSAgICByZXR1cm4gc2VsZi5fUGFyc2VFcnJvcignQ291bGRuXCd0IHBhcnNlIHN0cmluZzogJyArIHN0cihlKSkKLQotICBkZWYgTmV4dFRva2VuKHNlbGYpOgotICAgICIiIlJlYWRzIHRoZSBuZXh0IG1lYW5pbmdmdWwgdG9rZW4uIiIiCi0gICAgc2VsZi5fcHJldmlvdXNfbGluZSA9IHNlbGYuX2xpbmUKLSAgICBzZWxmLl9wcmV2aW91c19jb2x1bW4gPSBzZWxmLl9jb2x1bW4KLQotICAgIHNlbGYuX2NvbHVtbiArPSBsZW4oc2VsZi50b2tlbikKLSAgICBzZWxmLl9Ta2lwV2hpdGVzcGFjZSgpCi0KLSAgICBpZiBub3Qgc2VsZi5fbGluZXMgYW5kIGxlbihzZWxmLl9jdXJyZW50X2xpbmUpIDw9IHNlbGYuX2NvbHVtbjoKLSAgICAgIHNlbGYudG9rZW4gPSAnJwotICAgICAgcmV0dXJuCi0KLSAgICBtYXRjaCA9IHNlbGYuX1RPS0VOLm1hdGNoKHNlbGYuX2N1cnJlbnRfbGluZSwgc2VsZi5fY29sdW1uKQotICAgIGlmIG1hdGNoOgotICAgICAgdG9rZW4gPSBtYXRjaC5ncm91cCgwKQotICAgICAgc2VsZi50b2tlbiA9IHRva2VuCi0gICAgZWxzZToKLSAgICAgIHNlbGYudG9rZW4gPSBzZWxmLl9jdXJyZW50X2xpbmVbc2VsZi5fY29sdW1uXQotCi0KLSMgdGV4dC5lbmNvZGUoJ3N0cmluZ19lc2NhcGUnKSBkb2VzIG5vdCBzZWVtIHRvIHNhdGlzZnkgb3VyIG5lZWRzIGFzIGl0Ci0jIGVuY29kZXMgdW5wcmludGFibGUgY2hhcmFjdGVycyB1c2luZyB0d28tZGlnaXQgaGV4IGVzY2FwZXMgd2hlcmVhcyBvdXIKLSMgQysrIHVuZXNjYXBpbmcgZnVuY3Rpb24gYWxsb3dzIGhleCBlc2NhcGVzIHRvIGJlIGFueSBsZW5ndGguICBTbywKLSMgIlwwMDExIi5lbmNvZGUoJ3N0cmluZ19lc2NhcGUnKSBlbmRzIHVwIGJlaW5nICJcXHgwMTEiLCB3aGljaCB3aWxsIGJlCi0jIGRlY29kZWQgaW4gQysrIGFzIGEgc2luZ2xlLWNoYXJhY3RlciBzdHJpbmcgd2l0aCBjaGFyIGNvZGUgMHgxMS4KLWRlZiBfQ0VzY2FwZSh0ZXh0LCBhc191dGY4KToKLSAgZGVmIGVzY2FwZShjKToKLSAgICBvID0gb3JkKGMpCi0gICAgaWYgbyA9PSAxMDogcmV0dXJuIHIiXG4iICAgIyBvcHRpb25hbCBlc2NhcGUKLSAgICBpZiBvID09IDEzOiByZXR1cm4gciJcciIgICAjIG9wdGlvbmFsIGVzY2FwZQotICAgIGlmIG8gPT0gIDk6IHJldHVybiByIlx0IiAgICMgb3B0aW9uYWwgZXNjYXBlCi0gICAgaWYgbyA9PSAzOTogcmV0dXJuIHIiXCciICAgIyBvcHRpb25hbCBlc2NhcGUKLQotICAgIGlmIG8gPT0gMzQ6IHJldHVybiByJ1wiJyAgICMgbmVjZXNzYXJ5IGVzY2FwZQotICAgIGlmIG8gPT0gOTI6IHJldHVybiByIlxcIiAgICMgbmVjZXNzYXJ5IGVzY2FwZQotCi0gICAgIyBuZWNlc3NhcnkgZXNjYXBlcwotICAgIGlmIG5vdCBhc191dGY4IGFuZCAobyA+PSAxMjcgb3IgbyA8IDMyKTogcmV0dXJuICJcXCUwM28iICUgbwotICAgIHJldHVybiBjCi0gIHJldHVybiAiIi5qb2luKFtlc2NhcGUoYykgZm9yIGMgaW4gdGV4dF0pCi0KLQotX0NVTkVTQ0FQRV9IRVggPSByZS5jb21waWxlKCdcXFxceChbMC05YS1mQS1GXXsyfXxbMC05YS1mQS1GXSknKQotCi0KLWRlZiBfQ1VuZXNjYXBlKHRleHQpOgotICBkZWYgUmVwbGFjZUhleChtKToKLSAgICByZXR1cm4gY2hyKGludChtLmdyb3VwKDApWzI6XSwgMTYpKQotICAjIFRoaXMgaXMgcmVxdWlyZWQgYmVjYXVzZSB0aGUgJ3N0cmluZ19lc2NhcGUnIGVuY29kaW5nIGRvZXNuJ3QKLSAgIyBhbGxvdyBzaW5nbGUtZGlnaXQgaGV4IGVzY2FwZXMgKGxpa2UgJ1x4ZicpLgotICByZXN1bHQgPSBfQ1VORVNDQVBFX0hFWC5zdWIoUmVwbGFjZUhleCwgdGV4dCkKLSAgcmV0dXJuIHJlc3VsdC5kZWNvZGUoJ3N0cmluZ19lc2NhcGUnKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9tb3gucHkgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL21veC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggY2U4MGJhNS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL21veC5weQorKysgL2Rldi9udWxsCkBAIC0xLDE0MDEgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24yLjQKLSMKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIHRlc3RpbmcuICBUaGUgb3JpZ2luYWwgaXMgYXQ6Ci0jICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3B5bW94LwotCi0iIiJNb3gsIGFuIG9iamVjdC1tb2NraW5nIGZyYW1ld29yayBmb3IgUHl0aG9uLgotCi1Nb3ggd29ya3MgaW4gdGhlIHJlY29yZC1yZXBsYXktdmVyaWZ5IHBhcmFkaWdtLiAgV2hlbiB5b3UgZmlyc3QgY3JlYXRlCi1hIG1vY2sgb2JqZWN0LCBpdCBpcyBpbiByZWNvcmQgbW9kZS4gIFlvdSB0aGVuIHByb2dyYW1tYXRpY2FsbHkgc2V0Ci10aGUgZXhwZWN0ZWQgYmVoYXZpb3Igb2YgdGhlIG1vY2sgb2JqZWN0ICh3aGF0IG1ldGhvZHMgYXJlIHRvIGJlCi1jYWxsZWQgb24gaXQsIHdpdGggd2hhdCBwYXJhbWV0ZXJzLCB3aGF0IHRoZXkgc2hvdWxkIHJldHVybiwgYW5kIGluCi13aGF0IG9yZGVyKS4KLQotT25jZSB5b3UgaGF2ZSBzZXQgdXAgdGhlIGV4cGVjdGVkIG1vY2sgYmVoYXZpb3IsIHlvdSBwdXQgaXQgaW4gcmVwbGF5Ci1tb2RlLiAgTm93IHRoZSBtb2NrIHJlc3BvbmRzIHRvIG1ldGhvZCBjYWxscyBqdXN0IGFzIHlvdSB0b2xkIGl0IHRvLgotSWYgYW4gdW5leHBlY3RlZCBtZXRob2QgKG9yIGFuIGV4cGVjdGVkIG1ldGhvZCB3aXRoIHVuZXhwZWN0ZWQKLXBhcmFtZXRlcnMpIGlzIGNhbGxlZCwgdGhlbiBhbiBleGNlcHRpb24gd2lsbCBiZSByYWlzZWQuCi0KLU9uY2UgeW91IGFyZSBkb25lIGludGVyYWN0aW5nIHdpdGggdGhlIG1vY2ssIHlvdSBuZWVkIHRvIHZlcmlmeSB0aGF0Ci1hbGwgdGhlIGV4cGVjdGVkIGludGVyYWN0aW9ucyBvY2N1cmVkLiAgKE1heWJlIHlvdXIgY29kZSBleGl0ZWQKLXByZW1hdHVyZWx5IHdpdGhvdXQgY2FsbGluZyBzb21lIGNsZWFudXAgbWV0aG9kISkgIFRoZSB2ZXJpZnkgcGhhc2UKLWVuc3VyZXMgdGhhdCBldmVyeSBleHBlY3RlZCBtZXRob2Qgd2FzIGNhbGxlZDsgb3RoZXJ3aXNlLCBhbiBleGNlcHRpb24KLXdpbGwgYmUgcmFpc2VkLgotCi1TdWdnZXN0ZWQgdXNhZ2UgLyB3b3JrZmxvdzoKLQotICAjIENyZWF0ZSBNb3ggZmFjdG9yeQotICBteV9tb3ggPSBNb3goKQotCi0gICMgQ3JlYXRlIGEgbW9jayBkYXRhIGFjY2VzcyBvYmplY3QKLSAgbW9ja19kYW8gPSBteV9tb3guQ3JlYXRlTW9jayhEQU9DbGFzcykKLQotICAjIFNldCB1cCBleHBlY3RlZCBiZWhhdmlvcgotICBtb2NrX2Rhby5SZXRyaWV2ZVBlcnNvbldpdGhJZGVudGlmaWVyKCcxJykuQW5kUmV0dXJuKHBlcnNvbikKLSAgbW9ja19kYW8uRGVsZXRlUGVyc29uKHBlcnNvbikKLQotICAjIFB1dCBtb2NrcyBpbiByZXBsYXkgbW9kZQotICBteV9tb3guUmVwbGF5QWxsKCkKLQotICAjIEluamVjdCBtb2NrIG9iamVjdCBhbmQgcnVuIHRlc3QKLSAgY29udHJvbGxlci5TZXREYW8obW9ja19kYW8pCi0gIGNvbnRyb2xsZXIuRGVsZXRlUGVyc29uQnlJZCgnMScpCi0KLSAgIyBWZXJpZnkgYWxsIG1ldGhvZHMgd2VyZSBjYWxsZWQgYXMgZXhwZWN0ZWQKLSAgbXlfbW94LlZlcmlmeUFsbCgpCi0iIiIKLQotZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKLWltcG9ydCByZQotaW1wb3J0IHR5cGVzCi1pbXBvcnQgdW5pdHRlc3QKLQotaW1wb3J0IHN0dWJvdXQKLQotY2xhc3MgRXJyb3IoQXNzZXJ0aW9uRXJyb3IpOgotICAiIiJCYXNlIGV4Y2VwdGlvbiBmb3IgdGhpcyBtb2R1bGUuIiIiCi0KLSAgcGFzcwotCi0KLWNsYXNzIEV4cGVjdGVkTWV0aG9kQ2FsbHNFcnJvcihFcnJvcik6Ci0gICIiIlJhaXNlZCB3aGVuIFZlcmlmeSgpIGlzIGNhbGxlZCBiZWZvcmUgYWxsIGV4cGVjdGVkIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZAotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWRfbWV0aG9kcyk6Ci0gICAgIiIiSW5pdCBleGNlcHRpb24uCi0KLSAgICBBcmdzOgotICAgICAgIyBleHBlY3RlZF9tZXRob2RzOiBBIHNlcXVlbmNlIG9mIE1vY2tNZXRob2Qgb2JqZWN0cyB0aGF0IHNob3VsZCBoYXZlIGJlZW4KLSAgICAgICMgICBjYWxsZWQuCi0gICAgICBleHBlY3RlZF9tZXRob2RzOiBbTW9ja01ldGhvZF0KLQotICAgIFJhaXNlczoKLSAgICAgIFZhbHVlRXJyb3I6IGlmIGV4cGVjdGVkX21ldGhvZHMgY29udGFpbnMgbm8gbWV0aG9kcy4KLSAgICAiIiIKLQotICAgIGlmIG5vdCBleHBlY3RlZF9tZXRob2RzOgotICAgICAgcmFpc2UgVmFsdWVFcnJvcigiVGhlcmUgbXVzdCBiZSBhdCBsZWFzdCBvbmUgZXhwZWN0ZWQgbWV0aG9kIikKLSAgICBFcnJvci5fX2luaXRfXyhzZWxmKQotICAgIHNlbGYuX2V4cGVjdGVkX21ldGhvZHMgPSBleHBlY3RlZF9tZXRob2RzCi0KLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgY2FsbHMgPSAiXG4iLmpvaW4oWyIlM2QuICAlcyIgJSAoaSwgbSkKLSAgICAgICAgICAgICAgICAgICAgICAgZm9yIGksIG0gaW4gZW51bWVyYXRlKHNlbGYuX2V4cGVjdGVkX21ldGhvZHMpXSkKLSAgICByZXR1cm4gIlZlcmlmeTogRXhwZWN0ZWQgbWV0aG9kcyBuZXZlciBjYWxsZWQ6XG4lcyIgJSAoY2FsbHMsKQotCi0KLWNsYXNzIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IoRXJyb3IpOgotICAiIiJSYWlzZWQgd2hlbiBhbiB1bmV4cGVjdGVkIG1ldGhvZCBpcyBjYWxsZWQuCi0KLSAgVGhpcyBjYW4gb2NjdXIgaWYgYSBtZXRob2QgaXMgY2FsbGVkIHdpdGggaW5jb3JyZWN0IHBhcmFtZXRlcnMsIG9yIG91dCBvZiB0aGUKLSAgc3BlY2lmaWVkIG9yZGVyLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgdW5leHBlY3RlZF9tZXRob2QsIGV4cGVjdGVkKToKLSAgICAiIiJJbml0IGV4Y2VwdGlvbi4KLQotICAgIEFyZ3M6Ci0gICAgICAjIHVuZXhwZWN0ZWRfbWV0aG9kOiBNb2NrTWV0aG9kIHRoYXQgd2FzIGNhbGxlZCBidXQgd2FzIG5vdCBhdCB0aGUgaGVhZCBvZgotICAgICAgIyAgIHRoZSBleHBlY3RlZF9tZXRob2QgcXVldWUuCi0gICAgICAjIGV4cGVjdGVkOiBNb2NrTWV0aG9kIG9yIFVub3JkZXJlZEdyb3VwIHRoZSBtZXRob2Qgc2hvdWxkIGhhdmUKLSAgICAgICMgICBiZWVuIGluLgotICAgICAgdW5leHBlY3RlZF9tZXRob2Q6IE1vY2tNZXRob2QKLSAgICAgIGV4cGVjdGVkOiBNb2NrTWV0aG9kIG9yIFVub3JkZXJlZEdyb3VwCi0gICAgIiIiCi0KLSAgICBFcnJvci5fX2luaXRfXyhzZWxmKQotICAgIHNlbGYuX3VuZXhwZWN0ZWRfbWV0aG9kID0gdW5leHBlY3RlZF9tZXRob2QKLSAgICBzZWxmLl9leHBlY3RlZCA9IGV4cGVjdGVkCi0KLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgcmV0dXJuICJVbmV4cGVjdGVkIG1ldGhvZCBjYWxsOiAlcy4gIEV4cGVjdGluZzogJXMiICUgXAotICAgICAgKHNlbGYuX3VuZXhwZWN0ZWRfbWV0aG9kLCBzZWxmLl9leHBlY3RlZCkKLQotCi1jbGFzcyBVbmtub3duTWV0aG9kQ2FsbEVycm9yKEVycm9yKToKLSAgIiIiUmFpc2VkIGlmIGFuIHVua25vd24gbWV0aG9kIGlzIHJlcXVlc3RlZCBvZiB0aGUgbW9jayBvYmplY3QuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHVua25vd25fbWV0aG9kX25hbWUpOgotICAgICIiIkluaXQgZXhjZXB0aW9uLgotCi0gICAgQXJnczoKLSAgICAgICMgdW5rbm93bl9tZXRob2RfbmFtZTogTWV0aG9kIGNhbGwgdGhhdCBpcyBub3QgcGFydCBvZiB0aGUgbW9ja2VkIGNsYXNzJ3MKLSAgICAgICMgICBwdWJsaWMgaW50ZXJmYWNlLgotICAgICAgdW5rbm93bl9tZXRob2RfbmFtZTogc3RyCi0gICAgIiIiCi0KLSAgICBFcnJvci5fX2luaXRfXyhzZWxmKQotICAgIHNlbGYuX3Vua25vd25fbWV0aG9kX25hbWUgPSB1bmtub3duX21ldGhvZF9uYW1lCi0KLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgcmV0dXJuICJNZXRob2QgY2FsbGVkIGlzIG5vdCBhIG1lbWJlciBvZiB0aGUgb2JqZWN0OiAlcyIgJSBcCi0gICAgICBzZWxmLl91bmtub3duX21ldGhvZF9uYW1lCi0KLQotY2xhc3MgTW94KG9iamVjdCk6Ci0gICIiIk1veDogYSBmYWN0b3J5IGZvciBjcmVhdGluZyBtb2NrIG9iamVjdHMuIiIiCi0KLSAgIyBBIGxpc3Qgb2YgdHlwZXMgdGhhdCBzaG91bGQgYmUgc3R1YmJlZCBvdXQgd2l0aCBNb2NrT2JqZWN0cyAoYXMKLSAgIyBvcHBvc2VkIHRvIE1vY2tBbnl0aGluZ3MpLgotICBfVVNFX01PQ0tfT0JKRUNUID0gW3R5cGVzLkNsYXNzVHlwZSwgdHlwZXMuSW5zdGFuY2VUeXBlLCB0eXBlcy5Nb2R1bGVUeXBlLAotICAgICAgICAgICAgICAgICAgICAgIHR5cGVzLk9iamVjdFR5cGUsIHR5cGVzLlR5cGVUeXBlXQotCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAiIiJJbml0aWFsaXplIGEgbmV3IE1veC4iIiIKLQotICAgIHNlbGYuX21vY2tfb2JqZWN0cyA9IFtdCi0gICAgc2VsZi5zdHVicyA9IHN0dWJvdXQuU3R1Yk91dEZvclRlc3RpbmcoKQotCi0gIGRlZiBDcmVhdGVNb2NrKHNlbGYsIGNsYXNzX3RvX21vY2spOgotICAgICIiIkNyZWF0ZSBhIG5ldyBtb2NrIG9iamVjdC4KLQotICAgIEFyZ3M6Ci0gICAgICAjIGNsYXNzX3RvX21vY2s6IHRoZSBjbGFzcyB0byBiZSBtb2NrZWQKLSAgICAgIGNsYXNzX3RvX21vY2s6IGNsYXNzCi0KLSAgICBSZXR1cm5zOgotICAgICAgTW9ja09iamVjdCB0aGF0IGNhbiBiZSB1c2VkIGFzIHRoZSBjbGFzc190b19tb2NrIHdvdWxkIGJlLgotICAgICIiIgotCi0gICAgbmV3X21vY2sgPSBNb2NrT2JqZWN0KGNsYXNzX3RvX21vY2spCi0gICAgc2VsZi5fbW9ja19vYmplY3RzLmFwcGVuZChuZXdfbW9jaykKLSAgICByZXR1cm4gbmV3X21vY2sKLQotICBkZWYgQ3JlYXRlTW9ja0FueXRoaW5nKHNlbGYpOgotICAgICIiIkNyZWF0ZSBhIG1vY2sgdGhhdCB3aWxsIGFjY2VwdCBhbnkgbWV0aG9kIGNhbGxzLgotCi0gICAgVGhpcyBkb2VzIG5vdCBlbmZvcmNlIGFuIGludGVyZmFjZS4KLSAgICAiIiIKLQotICAgIG5ld19tb2NrID0gTW9ja0FueXRoaW5nKCkKLSAgICBzZWxmLl9tb2NrX29iamVjdHMuYXBwZW5kKG5ld19tb2NrKQotICAgIHJldHVybiBuZXdfbW9jawotCi0gIGRlZiBSZXBsYXlBbGwoc2VsZik6Ci0gICAgIiIiU2V0IGFsbCBtb2NrIG9iamVjdHMgdG8gcmVwbGF5IG1vZGUuIiIiCi0KLSAgICBmb3IgbW9ja19vYmogaW4gc2VsZi5fbW9ja19vYmplY3RzOgotICAgICAgbW9ja19vYmouX1JlcGxheSgpCi0KLQotICBkZWYgVmVyaWZ5QWxsKHNlbGYpOgotICAgICIiIkNhbGwgdmVyaWZ5IG9uIGFsbCBtb2NrIG9iamVjdHMgY3JlYXRlZC4iIiIKLQotICAgIGZvciBtb2NrX29iaiBpbiBzZWxmLl9tb2NrX29iamVjdHM6Ci0gICAgICBtb2NrX29iai5fVmVyaWZ5KCkKLQotICBkZWYgUmVzZXRBbGwoc2VsZik6Ci0gICAgIiIiQ2FsbCByZXNldCBvbiBhbGwgbW9jayBvYmplY3RzLiAgVGhpcyBkb2VzIG5vdCB1bnNldCBzdHVicy4iIiIKLQotICAgIGZvciBtb2NrX29iaiBpbiBzZWxmLl9tb2NrX29iamVjdHM6Ci0gICAgICBtb2NrX29iai5fUmVzZXQoKQotCi0gIGRlZiBTdHViT3V0V2l0aE1vY2soc2VsZiwgb2JqLCBhdHRyX25hbWUsIHVzZV9tb2NrX2FueXRoaW5nPUZhbHNlKToKLSAgICAiIiJSZXBsYWNlIGEgbWV0aG9kLCBhdHRyaWJ1dGUsIGV0Yy4gd2l0aCBhIE1vY2suCi0KLSAgICBUaGlzIHdpbGwgcmVwbGFjZSBhIGNsYXNzIG9yIG1vZHVsZSB3aXRoIGEgTW9ja09iamVjdCwgYW5kIGV2ZXJ5dGhpbmcgZWxzZQotICAgIChtZXRob2QsIGZ1bmN0aW9uLCBldGMpIHdpdGggYSBNb2NrQW55dGhpbmcuICBUaGlzIGNhbiBiZSBvdmVycmlkZGVuIHRvCi0gICAgYWx3YXlzIHVzZSBhIE1vY2tBbnl0aGluZyBieSBzZXR0aW5nIHVzZV9tb2NrX2FueXRoaW5nIHRvIFRydWUuCi0KLSAgICBBcmdzOgotICAgICAgb2JqOiBBIFB5dGhvbiBvYmplY3QgKGNsYXNzLCBtb2R1bGUsIGluc3RhbmNlLCBjYWxsYWJsZSkuCi0gICAgICBhdHRyX25hbWU6IHN0ci4gIFRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgdG8gcmVwbGFjZSB3aXRoIGEgbW9jay4KLSAgICAgIHVzZV9tb2NrX2FueXRoaW5nOiBib29sLiBUcnVlIGlmIGEgTW9ja0FueXRoaW5nIHNob3VsZCBiZSB1c2VkIHJlZ2FyZGxlc3MKLSAgICAgICAgb2YgdGhlIHR5cGUgb2YgYXR0cmlidXRlLgotICAgICIiIgotCi0gICAgYXR0cl90b19yZXBsYWNlID0gZ2V0YXR0cihvYmosIGF0dHJfbmFtZSkKLSAgICBpZiB0eXBlKGF0dHJfdG9fcmVwbGFjZSkgaW4gc2VsZi5fVVNFX01PQ0tfT0JKRUNUIGFuZCBub3QgdXNlX21vY2tfYW55dGhpbmc6Ci0gICAgICBzdHViID0gc2VsZi5DcmVhdGVNb2NrKGF0dHJfdG9fcmVwbGFjZSkKLSAgICBlbHNlOgotICAgICAgc3R1YiA9IHNlbGYuQ3JlYXRlTW9ja0FueXRoaW5nKCkKLQotICAgIHNlbGYuc3R1YnMuU2V0KG9iaiwgYXR0cl9uYW1lLCBzdHViKQotCi0gIGRlZiBVbnNldFN0dWJzKHNlbGYpOgotICAgICIiIlJlc3RvcmUgc3R1YnMgdG8gdGhlaXIgb3JpZ2luYWwgc3RhdGUuIiIiCi0KLSAgICBzZWxmLnN0dWJzLlVuc2V0QWxsKCkKLQotZGVmIFJlcGxheSgqYXJncyk6Ci0gICIiIlB1dCBtb2NrcyBpbnRvIFJlcGxheSBtb2RlLgotCi0gIEFyZ3M6Ci0gICAgIyBhcmdzIGlzIGFueSBudW1iZXIgb2YgbW9ja3MgdG8gcHV0IGludG8gcmVwbGF5IG1vZGUuCi0gICIiIgotCi0gIGZvciBtb2NrIGluIGFyZ3M6Ci0gICAgbW9jay5fUmVwbGF5KCkKLQotCi1kZWYgVmVyaWZ5KCphcmdzKToKLSAgIiIiVmVyaWZ5IG1vY2tzLgotCi0gIEFyZ3M6Ci0gICAgIyBhcmdzIGlzIGFueSBudW1iZXIgb2YgbW9ja3MgdG8gYmUgdmVyaWZpZWQuCi0gICIiIgotCi0gIGZvciBtb2NrIGluIGFyZ3M6Ci0gICAgbW9jay5fVmVyaWZ5KCkKLQotCi1kZWYgUmVzZXQoKmFyZ3MpOgotICAiIiJSZXNldCBtb2Nrcy4KLQotICBBcmdzOgotICAgICMgYXJncyBpcyBhbnkgbnVtYmVyIG9mIG1vY2tzIHRvIGJlIHJlc2V0LgotICAiIiIKLQotICBmb3IgbW9jayBpbiBhcmdzOgotICAgIG1vY2suX1Jlc2V0KCkKLQotCi1jbGFzcyBNb2NrQW55dGhpbmc6Ci0gICIiIkEgbW9jayB0aGF0IGNhbiBiZSB1c2VkIHRvIG1vY2sgYW55dGhpbmcuCi0KLSAgVGhpcyBpcyBoZWxwZnVsIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBkbyBub3QgcHJvdmlkZSBhIHB1YmxpYyBpbnRlcmZhY2UuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICAiIiIgIiIiCi0gICAgc2VsZi5fUmVzZXQoKQotCi0gIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBtZXRob2RfbmFtZSk6Ci0gICAgIiIiSW50ZXJjZXB0IG1ldGhvZCBjYWxscyBvbiB0aGlzIG9iamVjdC4KLQotICAgICBBIG5ldyBNb2NrTWV0aG9kIGlzIHJldHVybmVkIHRoYXQgaXMgYXdhcmUgb2YgdGhlIE1vY2tBbnl0aGluZydzCi0gICAgIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4gIFRoZSBjYWxsIHdpbGwgYmUgcmVjb3JkZWQgb3IgcmVwbGF5ZWQKLSAgICAgYnkgdGhlIE1vY2tNZXRob2QncyBfX2NhbGxfXy4KLQotICAgIEFyZ3M6Ci0gICAgICAjIG1ldGhvZCBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgIG1ldGhvZF9uYW1lOiBzdHIKLQotICAgIFJldHVybnM6Ci0gICAgICBBIG5ldyBNb2NrTWV0aG9kIGF3YXJlIG9mIE1vY2tBbnl0aGluZydzIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4KLSAgICAiIiIKLQotICAgIHJldHVybiBzZWxmLl9DcmVhdGVNb2NrTWV0aG9kKG1ldGhvZF9uYW1lKQotCi0gIGRlZiBfQ3JlYXRlTW9ja01ldGhvZChzZWxmLCBtZXRob2RfbmFtZSk6Ci0gICAgIiIiQ3JlYXRlIGEgbmV3IG1vY2sgbWV0aG9kIGNhbGwgYW5kIHJldHVybiBpdC4KLQotICAgIEFyZ3M6Ci0gICAgICAjIG1ldGhvZCBuYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kIGJlaW5nIGNhbGxlZC4KLSAgICAgIG1ldGhvZF9uYW1lOiBzdHIKLQotICAgIFJldHVybnM6Ci0gICAgICBBIG5ldyBNb2NrTWV0aG9kIGF3YXJlIG9mIE1vY2tBbnl0aGluZydzIHN0YXRlIChyZWNvcmQgb3IgcmVwbGF5KS4KLSAgICAiIiIKLQotICAgIHJldHVybiBNb2NrTWV0aG9kKG1ldGhvZF9uYW1lLCBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSwKLSAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSkKLQotICBkZWYgX19ub256ZXJvX18oc2VsZik6Ci0gICAgIiIiUmV0dXJuIDEgZm9yIG5vbnplcm8gc28gdGhlIG1vY2sgY2FuIGJlIHVzZWQgYXMgYSBjb25kaXRpb25hbC4iIiIKLQotICAgIHJldHVybiAxCi0KLSAgZGVmIF9fZXFfXyhzZWxmLCByaHMpOgotICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIHRvIGNvbXBhcmUgb2JqZWN0cy4iIiIKLQotICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tBbnl0aGluZykgYW5kCi0gICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSA9PSByaHMuX3JlcGxheV9tb2RlIGFuZAotICAgICAgICAgICAgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUgPT0gcmhzLl9leHBlY3RlZF9jYWxsc19xdWV1ZSkKLQotICBkZWYgX19uZV9fKHNlbGYsIHJocyk6Ci0gICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgdG8gY29tcGFyZSBvYmplY3RzLiIiIgotCi0gICAgcmV0dXJuIG5vdCBzZWxmID09IHJocwotCi0gIGRlZiBfUmVwbGF5KHNlbGYpOgotICAgICIiIlN0YXJ0IHJlcGxheWluZyBleHBlY3RlZCBtZXRob2QgY2FsbHMuIiIiCi0KLSAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IFRydWUKLQotICBkZWYgX1ZlcmlmeShzZWxmKToKLSAgICAiIiJWZXJpZnkgdGhhdCBhbGwgb2YgdGhlIGV4cGVjdGVkIGNhbGxzIGhhdmUgYmVlbiBtYWRlLgotCi0gICAgUmFpc2VzOgotICAgICAgRXhwZWN0ZWRNZXRob2RDYWxsc0Vycm9yOiBpZiB0aGVyZSBhcmUgc3RpbGwgbW9yZSBtZXRob2QgY2FsbHMgaW4gdGhlCi0gICAgICAgIGV4cGVjdGVkIHF1ZXVlLgotICAgICIiIgotCi0gICAgIyBJZiB0aGUgbGlzdCBvZiBleHBlY3RlZCBjYWxscyBpcyBub3QgZW1wdHksIHJhaXNlIGFuIGV4Y2VwdGlvbgotICAgIGlmIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlOgotICAgICAgIyBUaGUgbGFzdCBNdWx0aXBsZVRpbWVzR3JvdXAgaXMgbm90IHBvcHBlZCBmcm9tIHRoZSBxdWV1ZS4KLSAgICAgIGlmIChsZW4oc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUpID09IDEgYW5kCi0gICAgICAgICAgaXNpbnN0YW5jZShzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZVswXSwgTXVsdGlwbGVUaW1lc0dyb3VwKSBhbmQKLSAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZVswXS5Jc1NhdGlzZmllZCgpKToKLSAgICAgICAgcGFzcwotICAgICAgZWxzZToKLSAgICAgICAgcmFpc2UgRXhwZWN0ZWRNZXRob2RDYWxsc0Vycm9yKHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKQotCi0gIGRlZiBfUmVzZXQoc2VsZik6Ci0gICAgIiIiUmVzZXQgdGhlIHN0YXRlIG9mIHRoaXMgbW9jayB0byByZWNvcmQgbW9kZSB3aXRoIGFuIGVtcHR5IHF1ZXVlLiIiIgotCi0gICAgIyBNYWludGFpbiBhIGxpc3Qgb2YgbWV0aG9kIGNhbGxzIHdlIGFyZSBleHBlY3RpbmcKLSAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSA9IGRlcXVlKCkKLQotICAgICMgTWFrZSBzdXJlIHdlIGFyZSBpbiBzZXR1cCBtb2RlLCBub3QgcmVwbGF5IG1vZGUKLSAgICBzZWxmLl9yZXBsYXlfbW9kZSA9IEZhbHNlCi0KLQotY2xhc3MgTW9ja09iamVjdChNb2NrQW55dGhpbmcsIG9iamVjdCk6Ci0gICIiIkEgbW9jayBvYmplY3QgdGhhdCBzaW11bGF0ZXMgdGhlIHB1YmxpYy9wcm90ZWN0ZWQgaW50ZXJmYWNlIG9mIGEgY2xhc3MuIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGNsYXNzX3RvX21vY2spOgotICAgICIiIkluaXRpYWxpemUgYSBtb2NrIG9iamVjdC4KLQotICAgIFRoaXMgZGV0ZXJtaW5lcyB0aGUgbWV0aG9kcyBhbmQgcHJvcGVydGllcyBvZiB0aGUgY2xhc3MgYW5kIHN0b3JlcyB0aGVtLgotCi0gICAgQXJnczoKLSAgICAgICMgY2xhc3NfdG9fbW9jazogY2xhc3MgdG8gYmUgbW9ja2VkCi0gICAgICBjbGFzc190b19tb2NrOiBjbGFzcwotICAgICIiIgotCi0gICAgIyBUaGlzIGlzIHVzZWQgdG8gaGFjayBhcm91bmQgdGhlIG1peGluL2luaGVyaXRhbmNlIG9mIE1vY2tBbnl0aGluZywgd2hpY2gKLSAgICAjIGlzIG5vdCBhIHByb3BlciBvYmplY3QgKGl0IGNhbiBiZSBhbnl0aGluZy4gOi0pCi0gICAgTW9ja0FueXRoaW5nLl9fZGljdF9fWydfX2luaXRfXyddKHNlbGYpCi0KLSAgICAjIEdldCBhIGxpc3Qgb2YgYWxsIHRoZSBwdWJsaWMgYW5kIHNwZWNpYWwgbWV0aG9kcyB3ZSBzaG91bGQgbW9jay4KLSAgICBzZWxmLl9rbm93bl9tZXRob2RzID0gc2V0KCkKLSAgICBzZWxmLl9rbm93bl92YXJzID0gc2V0KCkKLSAgICBzZWxmLl9jbGFzc190b19tb2NrID0gY2xhc3NfdG9fbW9jawotICAgIGZvciBtZXRob2QgaW4gZGlyKGNsYXNzX3RvX21vY2spOgotICAgICAgaWYgY2FsbGFibGUoZ2V0YXR0cihjbGFzc190b19tb2NrLCBtZXRob2QpKToKLSAgICAgICAgc2VsZi5fa25vd25fbWV0aG9kcy5hZGQobWV0aG9kKQotICAgICAgZWxzZToKLSAgICAgICAgc2VsZi5fa25vd25fdmFycy5hZGQobWV0aG9kKQotCi0gIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKLSAgICAiIiJJbnRlcmNlcHQgYXR0cmlidXRlIHJlcXVlc3Qgb24gdGhpcyBvYmplY3QuCi0KLSAgICBJZiB0aGUgYXR0cmlidXRlIGlzIGEgcHVibGljIGNsYXNzIHZhcmlhYmxlLCBpdCB3aWxsIGJlIHJldHVybmVkIGFuZCBub3QKLSAgICByZWNvcmRlZCBhcyBhIGNhbGwuCi0KLSAgICBJZiB0aGUgYXR0cmlidXRlIGlzIG5vdCBhIHZhcmlhYmxlLCBpdCBpcyBoYW5kbGVkIGxpa2UgYSBtZXRob2QKLSAgICBjYWxsLiBUaGUgbWV0aG9kIG5hbWUgaXMgY2hlY2tlZCBhZ2FpbnN0IHRoZSBzZXQgb2YgbW9ja2FibGUKLSAgICBtZXRob2RzLCBhbmQgYSBuZXcgTW9ja01ldGhvZCBpcyByZXR1cm5lZCB0aGF0IGlzIGF3YXJlIG9mIHRoZQotICAgIE1vY2tPYmplY3QncyBzdGF0ZSAocmVjb3JkIG9yIHJlcGxheSkuICBUaGUgY2FsbCB3aWxsIGJlIHJlY29yZGVkCi0gICAgb3IgcmVwbGF5ZWQgYnkgdGhlIE1vY2tNZXRob2QncyBfX2NhbGxfXy4KLQotICAgIEFyZ3M6Ci0gICAgICAjIG5hbWU6IHRoZSBuYW1lIG9mIHRoZSBhdHRyaWJ1dGUgYmVpbmcgcmVxdWVzdGVkLgotICAgICAgbmFtZTogc3RyCi0KLSAgICBSZXR1cm5zOgotICAgICAgRWl0aGVyIGEgY2xhc3MgdmFyaWFibGUgb3IgYSBuZXcgTW9ja01ldGhvZCB0aGF0IGlzIGF3YXJlIG9mIHRoZSBzdGF0ZQotICAgICAgb2YgdGhlIG1vY2sgKHJlY29yZCBvciByZXBsYXkpLgotCi0gICAgUmFpc2VzOgotICAgICAgVW5rbm93bk1ldGhvZENhbGxFcnJvciBpZiB0aGUgTW9ja09iamVjdCBkb2VzIG5vdCBtb2NrIHRoZSByZXF1ZXN0ZWQKLSAgICAgICAgICBtZXRob2QuCi0gICAgIiIiCi0KLSAgICBpZiBuYW1lIGluIHNlbGYuX2tub3duX3ZhcnM6Ci0gICAgICByZXR1cm4gZ2V0YXR0cihzZWxmLl9jbGFzc190b19tb2NrLCBuYW1lKQotCi0gICAgaWYgbmFtZSBpbiBzZWxmLl9rbm93bl9tZXRob2RzOgotICAgICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QobmFtZSkKLQotICAgIHJhaXNlIFVua25vd25NZXRob2RDYWxsRXJyb3IobmFtZSkKLQotICBkZWYgX19lcV9fKHNlbGYsIHJocyk6Ci0gICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgdG8gY29tcGFyZSBvYmplY3RzLiIiIgotCi0gICAgcmV0dXJuIChpc2luc3RhbmNlKHJocywgTW9ja09iamVjdCkgYW5kCi0gICAgICAgICAgICBzZWxmLl9jbGFzc190b19tb2NrID09IHJocy5fY2xhc3NfdG9fbW9jayBhbmQKLSAgICAgICAgICAgIHNlbGYuX3JlcGxheV9tb2RlID09IHJocy5fcmVwbGF5X21vZGUgYW5kCi0gICAgICAgICAgICBzZWxmLl9leHBlY3RlZF9jYWxsc19xdWV1ZSA9PSByaHMuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlKQotCi0gIGRlZiBfX3NldGl0ZW1fXyhzZWxmLCBrZXksIHZhbHVlKToKLSAgICAiIiJQcm92aWRlIGN1c3RvbSBsb2dpYyBmb3IgbW9ja2luZyBjbGFzc2VzIHRoYXQgc3VwcG9ydCBpdGVtIGFzc2lnbm1lbnQuCi0KLSAgICBBcmdzOgotICAgICAga2V5OiBLZXkgdG8gc2V0IHRoZSB2YWx1ZSBmb3IuCi0gICAgICB2YWx1ZTogVmFsdWUgdG8gc2V0LgotCi0gICAgUmV0dXJuczoKLSAgICAgIEV4cGVjdGVkIHJldHVybiB2YWx1ZSBpbiByZXBsYXkgbW9kZS4gIEEgTW9ja01ldGhvZCBvYmplY3QgZm9yIHRoZQotICAgICAgX19zZXRpdGVtX18gbWV0aG9kIHRoYXQgaGFzIGFscmVhZHkgYmVlbiBjYWxsZWQgaWYgbm90IGluIHJlcGxheSBtb2RlLgotCi0gICAgUmFpc2VzOgotICAgICAgVHlwZUVycm9yIGlmIHRoZSB1bmRlcmx5aW5nIGNsYXNzIGRvZXMgbm90IHN1cHBvcnQgaXRlbSBhc3NpZ25tZW50LgotICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgb2JqZWN0IGRvZXMgbm90IGV4cGVjdCB0aGUgY2FsbCB0bwotICAgICAgICBfX3NldGl0ZW1fXy4KLQotICAgICIiIgotICAgIHNldGl0ZW0gPSBzZWxmLl9jbGFzc190b19tb2NrLl9fZGljdF9fLmdldCgnX19zZXRpdGVtX18nLCBOb25lKQotCi0gICAgIyBWZXJpZnkgdGhlIGNsYXNzIHN1cHBvcnRzIGl0ZW0gYXNzaWdubWVudC4KLSAgICBpZiBzZXRpdGVtIGlzIE5vbmU6Ci0gICAgICByYWlzZSBUeXBlRXJyb3IoJ29iamVjdCBkb2VzIG5vdCBzdXBwb3J0IGl0ZW0gYXNzaWdubWVudCcpCi0KLSAgICAjIElmIHdlIGFyZSBpbiByZXBsYXkgbW9kZSB0aGVuIHNpbXBseSBjYWxsIHRoZSBtb2NrIF9fc2V0aXRlbV9fIG1ldGhvZC4KLSAgICBpZiBzZWxmLl9yZXBsYXlfbW9kZToKLSAgICAgIHJldHVybiBNb2NrTWV0aG9kKCdfX3NldGl0ZW1fXycsIHNlbGYuX2V4cGVjdGVkX2NhbGxzX3F1ZXVlLAotICAgICAgICAgICAgICAgICAgICAgICAgc2VsZi5fcmVwbGF5X21vZGUpKGtleSwgdmFsdWUpCi0KLQotICAgICMgT3RoZXJ3aXNlLCBjcmVhdGUgYSBtb2NrIG1ldGhvZCBfX3NldGl0ZW1fXy4KLSAgICByZXR1cm4gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZCgnX19zZXRpdGVtX18nKShrZXksIHZhbHVlKQotCi0gIGRlZiBfX2dldGl0ZW1fXyhzZWxmLCBrZXkpOgotICAgICIiIlByb3ZpZGUgY3VzdG9tIGxvZ2ljIGZvciBtb2NraW5nIGNsYXNzZXMgdGhhdCBhcmUgc3Vic2NyaXB0YWJsZS4KLQotICAgIEFyZ3M6Ci0gICAgICBrZXk6IEtleSB0byByZXR1cm4gdGhlIHZhbHVlIGZvci4KLQotICAgIFJldHVybnM6Ci0gICAgICBFeHBlY3RlZCByZXR1cm4gdmFsdWUgaW4gcmVwbGF5IG1vZGUuICBBIE1vY2tNZXRob2Qgb2JqZWN0IGZvciB0aGUKLSAgICAgIF9fZ2V0aXRlbV9fIG1ldGhvZCB0aGF0IGhhcyBhbHJlYWR5IGJlZW4gY2FsbGVkIGlmIG5vdCBpbiByZXBsYXkgbW9kZS4KLQotICAgIFJhaXNlczoKLSAgICAgIFR5cGVFcnJvciBpZiB0aGUgdW5kZXJseWluZyBjbGFzcyBpcyBub3Qgc3Vic2NyaXB0YWJsZS4KLSAgICAgIFVuZXhwZWN0ZWRNZXRob2RDYWxsRXJyb3IgaWYgdGhlIG9iamVjdCBkb2VzIG5vdCBleHBlY3QgdGhlIGNhbGwgdG8KLSAgICAgICAgX19zZXRpdGVtX18uCi0KLSAgICAiIiIKLSAgICBnZXRpdGVtID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fZ2V0aXRlbV9fJywgTm9uZSkKLQotICAgICMgVmVyaWZ5IHRoZSBjbGFzcyBzdXBwb3J0cyBpdGVtIGFzc2lnbm1lbnQuCi0gICAgaWYgZ2V0aXRlbSBpcyBOb25lOgotICAgICAgcmFpc2UgVHlwZUVycm9yKCd1bnN1YnNjcmlwdGFibGUgb2JqZWN0JykKLQotICAgICMgSWYgd2UgYXJlIGluIHJlcGxheSBtb2RlIHRoZW4gc2ltcGx5IGNhbGwgdGhlIG1vY2sgX19nZXRpdGVtX18gbWV0aG9kLgotICAgIGlmIHNlbGYuX3JlcGxheV9tb2RlOgotICAgICAgcmV0dXJuIE1vY2tNZXRob2QoJ19fZ2V0aXRlbV9fJywgc2VsZi5fZXhwZWN0ZWRfY2FsbHNfcXVldWUsCi0gICAgICAgICAgICAgICAgICAgICAgICBzZWxmLl9yZXBsYXlfbW9kZSkoa2V5KQotCi0KLSAgICAjIE90aGVyd2lzZSwgY3JlYXRlIGEgbW9jayBtZXRob2QgX19nZXRpdGVtX18uCi0gICAgcmV0dXJuIHNlbGYuX0NyZWF0ZU1vY2tNZXRob2QoJ19fZ2V0aXRlbV9fJykoa2V5KQotCi0gIGRlZiBfX2NhbGxfXyhzZWxmLCAqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcyk6Ci0gICAgIiIiUHJvdmlkZSBjdXN0b20gbG9naWMgZm9yIG1vY2tpbmcgY2xhc3NlcyB0aGF0IGFyZSBjYWxsYWJsZS4iIiIKLQotICAgICMgVmVyaWZ5IHRoZSBjbGFzcyB3ZSBhcmUgbW9ja2luZyBpcyBjYWxsYWJsZQotICAgIGNhbGxhYmxlID0gc2VsZi5fY2xhc3NfdG9fbW9jay5fX2RpY3RfXy5nZXQoJ19fY2FsbF9fJywgTm9uZSkKLSAgICBpZiBjYWxsYWJsZSBpcyBOb25lOgotICAgICAgcmFpc2UgVHlwZUVycm9yKCdOb3QgY2FsbGFibGUnKQotCi0gICAgIyBCZWNhdXNlIHRoZSBjYWxsIGlzIGhhcHBlbmluZyBkaXJlY3RseSBvbiB0aGlzIG9iamVjdCBpbnN0ZWFkIG9mIGEgbWV0aG9kLAotICAgICMgdGhlIGNhbGwgb24gdGhlIG1vY2sgbWV0aG9kIGlzIG1hZGUgcmlnaHQgaGVyZQotICAgIG1vY2tfbWV0aG9kID0gc2VsZi5fQ3JlYXRlTW9ja01ldGhvZCgnX19jYWxsX18nKQotICAgIHJldHVybiBtb2NrX21ldGhvZCgqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcykKLQotICBAcHJvcGVydHkKLSAgZGVmIF9fY2xhc3NfXyhzZWxmKToKLSAgICAiIiJSZXR1cm4gdGhlIGNsYXNzIHRoYXQgaXMgYmVpbmcgbW9ja2VkLiIiIgotCi0gICAgcmV0dXJuIHNlbGYuX2NsYXNzX3RvX21vY2sKLQotCi1jbGFzcyBNb2NrTWV0aG9kKG9iamVjdCk6Ci0gICIiIkNhbGxhYmxlIG1vY2sgbWV0aG9kLgotCi0gIEEgTW9ja01ldGhvZCBzaG91bGQgYWN0IGV4YWN0bHkgbGlrZSB0aGUgbWV0aG9kIGl0IG1vY2tzLCBhY2NlcHRpbmcgcGFyYW1ldGVycwotICBhbmQgcmV0dXJuaW5nIGEgdmFsdWUsIG9yIHRocm93aW5nIGFuIGV4Y2VwdGlvbiAoYXMgc3BlY2lmaWVkKS4gIFdoZW4gdGhpcwotICBtZXRob2QgaXMgY2FsbGVkLCBpdCBjYW4gb3B0aW9uYWxseSB2ZXJpZnkgd2hldGhlciB0aGUgY2FsbGVkIG1ldGhvZCAobmFtZSBhbmQKLSAgc2lnbmF0dXJlKSBtYXRjaGVzIHRoZSBleHBlY3RlZCBtZXRob2QuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBtZXRob2RfbmFtZSwgY2FsbF9xdWV1ZSwgcmVwbGF5X21vZGUpOgotICAgICIiIkNvbnN0cnVjdCBhIG5ldyBtb2NrIG1ldGhvZC4KLQotICAgIEFyZ3M6Ci0gICAgICAjIG1ldGhvZF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgbWV0aG9kCi0gICAgICAjIGNhbGxfcXVldWU6IGRlcXVlIG9mIGNhbGxzLCB2ZXJpZnkgdGhpcyBjYWxsIGFnYWluc3QgdGhlIGhlYWQsIG9yIGFkZAotICAgICAgIyAgICAgdGhpcyBjYWxsIHRvIHRoZSBxdWV1ZS4KLSAgICAgICMgcmVwbGF5X21vZGU6IEZhbHNlIGlmIHdlIGFyZSByZWNvcmRpbmcsIFRydWUgaWYgd2UgYXJlIHZlcmlmeWluZyBjYWxscwotICAgICAgIyAgICAgYWdhaW5zdCB0aGUgY2FsbCBxdWV1ZS4KLSAgICAgIG1ldGhvZF9uYW1lOiBzdHIKLSAgICAgIGNhbGxfcXVldWU6IGxpc3Qgb3IgZGVxdWUKLSAgICAgIHJlcGxheV9tb2RlOiBib29sCi0gICAgIiIiCi0KLSAgICBzZWxmLl9uYW1lID0gbWV0aG9kX25hbWUKLSAgICBzZWxmLl9jYWxsX3F1ZXVlID0gY2FsbF9xdWV1ZQotICAgIGlmIG5vdCBpc2luc3RhbmNlKGNhbGxfcXVldWUsIGRlcXVlKToKLSAgICAgIHNlbGYuX2NhbGxfcXVldWUgPSBkZXF1ZShzZWxmLl9jYWxsX3F1ZXVlKQotICAgIHNlbGYuX3JlcGxheV9tb2RlID0gcmVwbGF5X21vZGUKLQotICAgIHNlbGYuX3BhcmFtcyA9IE5vbmUKLSAgICBzZWxmLl9uYW1lZF9wYXJhbXMgPSBOb25lCi0gICAgc2VsZi5fcmV0dXJuX3ZhbHVlID0gTm9uZQotICAgIHNlbGYuX2V4Y2VwdGlvbiA9IE5vbmUKLSAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSBOb25lCi0KLSAgZGVmIF9fY2FsbF9fKHNlbGYsICpwYXJhbXMsICoqbmFtZWRfcGFyYW1zKToKLSAgICAiIiJMb2cgcGFyYW1ldGVycyBhbmQgcmV0dXJuIHRoZSBzcGVjaWZpZWQgcmV0dXJuIHZhbHVlLgotCi0gICAgSWYgdGhlIE1vY2soQW55dGhpbmcvT2JqZWN0KSBhc3NvY2lhdGVkIHdpdGggdGhpcyBjYWxsIGlzIGluIHJlY29yZCBtb2RlLAotICAgIHRoaXMgTW9ja01ldGhvZCB3aWxsIGJlIHB1c2hlZCBvbnRvIHRoZSBleHBlY3RlZCBjYWxsIHF1ZXVlLiAgSWYgdGhlIG1vY2sKLSAgICBpcyBpbiByZXBsYXkgbW9kZSwgdGhpcyB3aWxsIHBvcCBhIE1vY2tNZXRob2Qgb2ZmIHRoZSB0b3Agb2YgdGhlIHF1ZXVlIGFuZAotICAgIHZlcmlmeSB0aGlzIGNhbGwgaXMgZXF1YWwgdG8gdGhlIGV4cGVjdGVkIGNhbGwuCi0KLSAgICBSYWlzZXM6Ci0gICAgICBVbmV4cGVjdGVkTWV0aG9kQ2FsbCBpZiB0aGlzIGNhbGwgaXMgc3VwcG9zZWQgdG8gbWF0Y2ggYW4gZXhwZWN0ZWQgbWV0aG9kCi0gICAgICAgIGNhbGwgYW5kIGl0IGRvZXMgbm90LgotICAgICIiIgotCi0gICAgc2VsZi5fcGFyYW1zID0gcGFyYW1zCi0gICAgc2VsZi5fbmFtZWRfcGFyYW1zID0gbmFtZWRfcGFyYW1zCi0KLSAgICBpZiBub3Qgc2VsZi5fcmVwbGF5X21vZGU6Ci0gICAgICBzZWxmLl9jYWxsX3F1ZXVlLmFwcGVuZChzZWxmKQotICAgICAgcmV0dXJuIHNlbGYKLQotICAgIGV4cGVjdGVkX21ldGhvZCA9IHNlbGYuX1ZlcmlmeU1ldGhvZENhbGwoKQotCi0gICAgaWYgZXhwZWN0ZWRfbWV0aG9kLl9zaWRlX2VmZmVjdHM6Ci0gICAgICBleHBlY3RlZF9tZXRob2QuX3NpZGVfZWZmZWN0cygqcGFyYW1zLCAqKm5hbWVkX3BhcmFtcykKLQotICAgIGlmIGV4cGVjdGVkX21ldGhvZC5fZXhjZXB0aW9uOgotICAgICAgcmFpc2UgZXhwZWN0ZWRfbWV0aG9kLl9leGNlcHRpb24KLQotICAgIHJldHVybiBleHBlY3RlZF9tZXRob2QuX3JldHVybl92YWx1ZQotCi0gIGRlZiBfX2dldGF0dHJfXyhzZWxmLCBuYW1lKToKLSAgICAiIiJSYWlzZSBhbiBBdHRyaWJ1dGVFcnJvciB3aXRoIGEgaGVscGZ1bCBtZXNzYWdlLiIiIgotCi0gICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoJ01vY2tNZXRob2QgaGFzIG5vIGF0dHJpYnV0ZSAiJXMiLiAnCi0gICAgICAgICdEaWQgeW91IHJlbWVtYmVyIHRvIHB1dCB5b3VyIG1vY2tzIGluIHJlcGxheSBtb2RlPycgJSBuYW1lKQotCi0gIGRlZiBfUG9wTmV4dE1ldGhvZChzZWxmKToKLSAgICAiIiJQb3AgdGhlIG5leHQgbWV0aG9kIGZyb20gb3VyIGNhbGwgcXVldWUuIiIiCi0gICAgdHJ5OgotICAgICAgcmV0dXJuIHNlbGYuX2NhbGxfcXVldWUucG9wbGVmdCgpCi0gICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICByYWlzZSBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKHNlbGYsIE5vbmUpCi0KLSAgZGVmIF9WZXJpZnlNZXRob2RDYWxsKHNlbGYpOgotICAgICIiIlZlcmlmeSB0aGUgY2FsbGVkIG1ldGhvZCBpcyBleHBlY3RlZC4KLQotICAgIFRoaXMgY2FuIGJlIGFuIG9yZGVyZWQgbWV0aG9kLCBvciBwYXJ0IG9mIGFuIHVub3JkZXJlZCBzZXQuCi0KLSAgICBSZXR1cm5zOgotICAgICAgVGhlIGV4cGVjdGVkIG1vY2sgbWV0aG9kLgotCi0gICAgUmFpc2VzOgotICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGwgaWYgdGhlIG1ldGhvZCBjYWxsZWQgd2FzIG5vdCBleHBlY3RlZC4KLSAgICAiIiIKLQotICAgIGV4cGVjdGVkID0gc2VsZi5fUG9wTmV4dE1ldGhvZCgpCi0KLSAgICAjIExvb3AgaGVyZSwgYmVjYXVzZSB3ZSBtaWdodCBoYXZlIGEgTWV0aG9kR3JvdXAgZm9sbG93ZWQgYnkgYW5vdGhlcgotICAgICMgZ3JvdXAuCi0gICAgd2hpbGUgaXNpbnN0YW5jZShleHBlY3RlZCwgTWV0aG9kR3JvdXApOgotICAgICAgZXhwZWN0ZWQsIG1ldGhvZCA9IGV4cGVjdGVkLk1ldGhvZENhbGxlZChzZWxmKQotICAgICAgaWYgbWV0aG9kIGlzIG5vdCBOb25lOgotICAgICAgICByZXR1cm4gbWV0aG9kCi0KLSAgICAjIFRoaXMgaXMgYSBtb2NrIG1ldGhvZCwgc28ganVzdCBjaGVjayBlcXVhbGl0eS4KLSAgICBpZiBleHBlY3RlZCAhPSBzZWxmOgotICAgICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihzZWxmLCBleHBlY3RlZCkKLQotICAgIHJldHVybiBleHBlY3RlZAotCi0gIGRlZiBfX3N0cl9fKHNlbGYpOgotICAgIHBhcmFtcyA9ICcsICcuam9pbigKLSAgICAgICAgW3JlcHIocCkgZm9yIHAgaW4gc2VsZi5fcGFyYW1zIG9yIFtdXSArCi0gICAgICAgIFsnJXM9JXInICUgeCBmb3IgeCBpbiBzb3J0ZWQoKHNlbGYuX25hbWVkX3BhcmFtcyBvciB7fSkuaXRlbXMoKSldKQotICAgIGRlc2MgPSAiJXMoJXMpIC0+ICVyIiAlIChzZWxmLl9uYW1lLCBwYXJhbXMsIHNlbGYuX3JldHVybl92YWx1ZSkKLSAgICByZXR1cm4gZGVzYwotCi0gIGRlZiBfX2VxX18oc2VsZiwgcmhzKToKLSAgICAiIiJUZXN0IHdoZXRoZXIgdGhpcyBNb2NrTWV0aG9kIGlzIGVxdWl2YWxlbnQgdG8gYW5vdGhlciBNb2NrTWV0aG9kLgotCi0gICAgQXJnczoKLSAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0Ci0gICAgICByaHM6IE1vY2tNZXRob2QKLSAgICAiIiIKLQotICAgIHJldHVybiAoaXNpbnN0YW5jZShyaHMsIE1vY2tNZXRob2QpIGFuZAotICAgICAgICAgICAgc2VsZi5fbmFtZSA9PSByaHMuX25hbWUgYW5kCi0gICAgICAgICAgICBzZWxmLl9wYXJhbXMgPT0gcmhzLl9wYXJhbXMgYW5kCi0gICAgICAgICAgICBzZWxmLl9uYW1lZF9wYXJhbXMgPT0gcmhzLl9uYW1lZF9wYXJhbXMpCi0KLSAgZGVmIF9fbmVfXyhzZWxmLCByaHMpOgotICAgICIiIlRlc3Qgd2hldGhlciB0aGlzIE1vY2tNZXRob2QgaXMgbm90IGVxdWl2YWxlbnQgdG8gYW5vdGhlciBNb2NrTWV0aG9kLgotCi0gICAgQXJnczoKLSAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0Ci0gICAgICByaHM6IE1vY2tNZXRob2QKLSAgICAiIiIKLQotICAgIHJldHVybiBub3Qgc2VsZiA9PSByaHMKLQotICBkZWYgR2V0UG9zc2libGVHcm91cChzZWxmKToKLSAgICAiIiJSZXR1cm5zIGEgcG9zc2libGUgZ3JvdXAgZnJvbSB0aGUgZW5kIG9mIHRoZSBjYWxsIHF1ZXVlIG9yIE5vbmUgaWYgbm8KLSAgICBvdGhlciBtZXRob2RzIGFyZSBvbiB0aGUgc3RhY2suCi0gICAgIiIiCi0KLSAgICAjIFJlbW92ZSB0aGlzIG1ldGhvZCBmcm9tIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBzbyB3ZSBjYW4gYWRkIGl0IHRvIGEgZ3JvdXAuCi0gICAgdGhpc19tZXRob2QgPSBzZWxmLl9jYWxsX3F1ZXVlLnBvcCgpCi0gICAgYXNzZXJ0IHRoaXNfbWV0aG9kID09IHNlbGYKLQotICAgICMgRGV0ZXJtaW5lIGlmIHRoZSB0YWlsIG9mIHRoZSBxdWV1ZSBpcyBhIGdyb3VwLCBvciBqdXN0IGEgcmVndWxhciBvcmRlcmVkCi0gICAgIyBtb2NrIG1ldGhvZC4KLSAgICBncm91cCA9IE5vbmUKLSAgICB0cnk6Ci0gICAgICBncm91cCA9IHNlbGYuX2NhbGxfcXVldWVbLTFdCi0gICAgZXhjZXB0IEluZGV4RXJyb3I6Ci0gICAgICBwYXNzCi0KLSAgICByZXR1cm4gZ3JvdXAKLQotICBkZWYgX0NoZWNrQW5kQ3JlYXRlTmV3R3JvdXAoc2VsZiwgZ3JvdXBfbmFtZSwgZ3JvdXBfY2xhc3MpOgotICAgICIiIkNoZWNrcyBpZiB0aGUgbGFzdCBtZXRob2QgKGEgcG9zc2libGUgZ3JvdXApIGlzIGFuIGluc3RhbmNlIG9mIG91cgotICAgIGdyb3VwX2NsYXNzLiBBZGRzIHRoZSBjdXJyZW50IG1ldGhvZCB0byB0aGlzIGdyb3VwIG9yIGNyZWF0ZXMgYSBuZXcgb25lLgotCi0gICAgQXJnczoKLQotICAgICAgZ3JvdXBfbmFtZTogdGhlIG5hbWUgb2YgdGhlIGdyb3VwLgotICAgICAgZ3JvdXBfY2xhc3M6IHRoZSBjbGFzcyB1c2VkIHRvIGNyZWF0ZSBpbnN0YW5jZSBvZiB0aGlzIG5ldyBncm91cAotICAgICIiIgotICAgIGdyb3VwID0gc2VsZi5HZXRQb3NzaWJsZUdyb3VwKCkKLQotICAgICMgSWYgdGhpcyBpcyBhIGdyb3VwLCBhbmQgaXQgaXMgdGhlIGNvcnJlY3QgZ3JvdXAsIGFkZCB0aGUgbWV0aG9kLgotICAgIGlmIGlzaW5zdGFuY2UoZ3JvdXAsIGdyb3VwX2NsYXNzKSBhbmQgZ3JvdXAuZ3JvdXBfbmFtZSgpID09IGdyb3VwX25hbWU6Ci0gICAgICBncm91cC5BZGRNZXRob2Qoc2VsZikKLSAgICAgIHJldHVybiBzZWxmCi0KLSAgICAjIENyZWF0ZSBhIG5ldyBncm91cCBhbmQgYWRkIHRoZSBtZXRob2QuCi0gICAgbmV3X2dyb3VwID0gZ3JvdXBfY2xhc3MoZ3JvdXBfbmFtZSkKLSAgICBuZXdfZ3JvdXAuQWRkTWV0aG9kKHNlbGYpCi0gICAgc2VsZi5fY2FsbF9xdWV1ZS5hcHBlbmQobmV3X2dyb3VwKQotICAgIHJldHVybiBzZWxmCi0KLSAgZGVmIEluQW55T3JkZXIoc2VsZiwgZ3JvdXBfbmFtZT0iZGVmYXVsdCIpOgotICAgICIiIk1vdmUgdGhpcyBtZXRob2QgaW50byBhIGdyb3VwIG9mIHVub3JkZXJlZCBjYWxscy4KLQotICAgIEEgZ3JvdXAgb2YgdW5vcmRlcmVkIGNhbGxzIG11c3QgYmUgZGVmaW5lZCB0b2dldGhlciwgYW5kIG11c3QgYmUgZXhlY3V0ZWQKLSAgICBpbiBmdWxsIGJlZm9yZSB0aGUgbmV4dCBleHBlY3RlZCBtZXRob2QgY2FuIGJlIGNhbGxlZC4gIFRoZXJlIGNhbiBiZQotICAgIG11bHRpcGxlIGdyb3VwcyB0aGF0IGFyZSBleHBlY3RlZCBzZXJpYWxseSwgaWYgdGhleSBhcmUgZ2l2ZW4KLSAgICBkaWZmZXJlbnQgZ3JvdXAgbmFtZXMuICBUaGUgc2FtZSBncm91cCBuYW1lIGNhbiBiZSByZXVzZWQgaWYgdGhlcmUgaXMgYQotICAgIHN0YW5kYXJkIG1ldGhvZCBjYWxsLCBvciBhIGdyb3VwIHdpdGggYSBkaWZmZXJlbnQgbmFtZSwgc3BsaWNlZCBiZXR3ZWVuCi0gICAgdXNhZ2VzLgotCi0gICAgQXJnczoKLSAgICAgIGdyb3VwX25hbWU6IHRoZSBuYW1lIG9mIHRoZSB1bm9yZGVyZWQgZ3JvdXAuCi0KLSAgICBSZXR1cm5zOgotICAgICAgc2VsZgotICAgICIiIgotICAgIHJldHVybiBzZWxmLl9DaGVja0FuZENyZWF0ZU5ld0dyb3VwKGdyb3VwX25hbWUsIFVub3JkZXJlZEdyb3VwKQotCi0gIGRlZiBNdWx0aXBsZVRpbWVzKHNlbGYsIGdyb3VwX25hbWU9ImRlZmF1bHQiKToKLSAgICAiIiJNb3ZlIHRoaXMgbWV0aG9kIGludG8gZ3JvdXAgb2YgY2FsbHMgd2hpY2ggbWF5IGJlIGNhbGxlZCBtdWx0aXBsZSB0aW1lcy4KLQotICAgIEEgZ3JvdXAgb2YgcmVwZWF0aW5nIGNhbGxzIG11c3QgYmUgZGVmaW5lZCB0b2dldGhlciwgYW5kIG11c3QgYmUgZXhlY3V0ZWQgaW4KLSAgICBmdWxsIGJlZm9yZSB0aGUgbmV4dCBleHBlY3RlZCBtZWh0b2QgY2FuIGJlIGNhbGxlZC4KLQotICAgIEFyZ3M6Ci0gICAgICBncm91cF9uYW1lOiB0aGUgbmFtZSBvZiB0aGUgdW5vcmRlcmVkIGdyb3VwLgotCi0gICAgUmV0dXJuczoKLSAgICAgIHNlbGYKLSAgICAiIiIKLSAgICByZXR1cm4gc2VsZi5fQ2hlY2tBbmRDcmVhdGVOZXdHcm91cChncm91cF9uYW1lLCBNdWx0aXBsZVRpbWVzR3JvdXApCi0KLSAgZGVmIEFuZFJldHVybihzZWxmLCByZXR1cm5fdmFsdWUpOgotICAgICIiIlNldCB0aGUgdmFsdWUgdG8gcmV0dXJuIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotCi0gICAgQXJnczoKLSAgICAgICMgcmV0dXJuX3ZhbHVlIGNhbiBiZSBhbnl0aGluZy4KLSAgICAiIiIKLQotICAgIHNlbGYuX3JldHVybl92YWx1ZSA9IHJldHVybl92YWx1ZQotICAgIHJldHVybiByZXR1cm5fdmFsdWUKLQotICBkZWYgQW5kUmFpc2Uoc2VsZiwgZXhjZXB0aW9uKToKLSAgICAiIiJTZXQgdGhlIGV4Y2VwdGlvbiB0byByYWlzZSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLQotICAgIEFyZ3M6Ci0gICAgICAjIGV4Y2VwdGlvbjogdGhlIGV4Y2VwdGlvbiB0byByYWlzZSB3aGVuIHRoaXMgbWV0aG9kIGlzIGNhbGxlZC4KLSAgICAgIGV4Y2VwdGlvbjogRXhjZXB0aW9uCi0gICAgIiIiCi0KLSAgICBzZWxmLl9leGNlcHRpb24gPSBleGNlcHRpb24KLQotICBkZWYgV2l0aFNpZGVFZmZlY3RzKHNlbGYsIHNpZGVfZWZmZWN0cyk6Ci0gICAgIiIiU2V0IHRoZSBzaWRlIGVmZmVjdHMgdGhhdCBhcmUgc2ltdWxhdGVkIHdoZW4gdGhpcyBtZXRob2QgaXMgY2FsbGVkLgotCi0gICAgQXJnczoKLSAgICAgIHNpZGVfZWZmZWN0czogQSBjYWxsYWJsZSB3aGljaCBtb2RpZmllcyB0aGUgcGFyYW1ldGVycyBvciBvdGhlciByZWxldmFudAotICAgICAgICBzdGF0ZSB3aGljaCBhIGdpdmVuIHRlc3QgY2FzZSBkZXBlbmRzIG9uLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFNlbGYgZm9yIGNoYWluaW5nIHdpdGggQW5kUmV0dXJuIGFuZCBBbmRSYWlzZS4KLSAgICAiIiIKLSAgICBzZWxmLl9zaWRlX2VmZmVjdHMgPSBzaWRlX2VmZmVjdHMKLSAgICByZXR1cm4gc2VsZgotCi1jbGFzcyBDb21wYXJhdG9yOgotICAiIiJCYXNlIGNsYXNzIGZvciBhbGwgTW94IGNvbXBhcmF0b3JzLgotCi0gIEEgQ29tcGFyYXRvciBjYW4gYmUgdXNlZCBhcyBhIHBhcmFtZXRlciB0byBhIG1vY2tlZCBtZXRob2Qgd2hlbiB0aGUgZXhhY3QKLSAgdmFsdWUgaXMgbm90IGtub3duLiAgRm9yIGV4YW1wbGUsIHRoZSBjb2RlIHlvdSBhcmUgdGVzdGluZyBtaWdodCBidWlsZCB1cCBhCi0gIGxvbmcgU1FMIHN0cmluZyB0aGF0IGlzIHBhc3NlZCB0byB5b3VyIG1vY2sgREFPLiBZb3UncmUgb25seSBpbnRlcmVzdGVkIHRoYXQKLSAgdGhlIElOIGNsYXVzZSBjb250YWlucyB0aGUgcHJvcGVyIHByaW1hcnkga2V5cywgc28geW91IGNhbiBzZXQgeW91ciBtb2NrCi0gIHVwIGFzIGZvbGxvd3M6Ci0KLSAgbW9ja19kYW8uUnVuUXVlcnkoU3RyQ29udGFpbnMoJ0lOICgxLCAyLCA0LCA1KScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCi0KLSAgTm93IHdoYXRldmVyIHF1ZXJ5IGlzIHBhc3NlZCBpbiBtdXN0IGNvbnRhaW4gdGhlIHN0cmluZyAnSU4gKDEsIDIsIDQsIDUpJy4KLQotICBBIENvbXBhcmF0b3IgbWF5IHJlcGxhY2Ugb25lIG9yIG1vcmUgcGFyYW1ldGVycywgZm9yIGV4YW1wbGU6Ci0gICMgcmV0dXJuIGF0IG1vc3QgMTAgcm93cwotICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnU0VMRUNUJyksIDEwKQotCi0gIG9yCi0KLSAgIyBSZXR1cm4gc29tZSBub24tZGV0ZXJtaW5pc3RpYyBudW1iZXIgb2Ygcm93cwotICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnU0VMRUNUJyksIElzQShpbnQpKQotICAiIiIKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiU3BlY2lhbCBlcXVhbHMgbWV0aG9kIHRoYXQgYWxsIGNvbXBhcmF0b3JzIG11c3QgaW1wbGVtZW50LgotCi0gICAgQXJnczoKLSAgICAgIHJoczogYW55IHB5dGhvbiBvYmplY3QKLSAgICAiIiIKLQotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IsICdtZXRob2QgbXVzdCBiZSBpbXBsZW1lbnRlZCBieSBhIHN1YmNsYXNzLicKLQotICBkZWYgX19lcV9fKHNlbGYsIHJocyk6Ci0gICAgcmV0dXJuIHNlbGYuZXF1YWxzKHJocykKLQotICBkZWYgX19uZV9fKHNlbGYsIHJocyk6Ci0gICAgcmV0dXJuIG5vdCBzZWxmLmVxdWFscyhyaHMpCi0KLQotY2xhc3MgSXNBKENvbXBhcmF0b3IpOgotICAiIiJUaGlzIGNsYXNzIHdyYXBzIGEgYmFzaWMgUHl0aG9uIHR5cGUgb3IgY2xhc3MuICBJdCBpcyB1c2VkIHRvIHZlcmlmeQotICB0aGF0IGEgcGFyYW1ldGVyIGlzIG9mIHRoZSBnaXZlbiB0eXBlIG9yIGNsYXNzLgotCi0gIEV4YW1wbGU6Ci0gIG1vY2tfZGFvLkNvbm5lY3QoSXNBKERiQ29ubmVjdEluZm8pKQotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgY2xhc3NfbmFtZSk6Ci0gICAgIiIiSW5pdGlhbGl6ZSBJc0EKLQotICAgIEFyZ3M6Ci0gICAgICBjbGFzc19uYW1lOiBiYXNpYyBweXRob24gdHlwZSBvciBhIGNsYXNzCi0gICAgIiIiCi0KLSAgICBzZWxmLl9jbGFzc19uYW1lID0gY2xhc3NfbmFtZQotCi0gIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKLSAgICAiIiJDaGVjayB0byBzZWUgaWYgdGhlIFJIUyBpcyBhbiBpbnN0YW5jZSBvZiBjbGFzc19uYW1lLgotCi0gICAgQXJnczoKLSAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0Ci0gICAgICByaHM6IG9iamVjdAotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIHRyeToKLSAgICAgIHJldHVybiBpc2luc3RhbmNlKHJocywgc2VsZi5fY2xhc3NfbmFtZSkKLSAgICBleGNlcHQgVHlwZUVycm9yOgotICAgICAgIyBDaGVjayByYXcgdHlwZXMgaWYgdGhlcmUgd2FzIGEgdHlwZSBlcnJvci4gIFRoaXMgaXMgaGVscGZ1bCBmb3IKLSAgICAgICMgdGhpbmdzIGxpa2UgY1N0cmluZ0lPLlN0cmluZ0lPLgotICAgICAgcmV0dXJuIHR5cGUocmhzKSA9PSB0eXBlKHNlbGYuX2NsYXNzX25hbWUpCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiBzdHIoc2VsZi5fY2xhc3NfbmFtZSkKLQotY2xhc3MgSXNBbG1vc3QoQ29tcGFyYXRvcik6Ci0gICIiIkNvbXBhcmlzb24gY2xhc3MgdXNlZCB0byBjaGVjayB3aGV0aGVyIGEgcGFyYW1ldGVyIGlzIG5lYXJseSBlcXVhbAotICB0byBhIGdpdmVuIHZhbHVlLiAgR2VuZXJhbGx5IHVzZWZ1bCBmb3IgZmxvYXRpbmcgcG9pbnQgbnVtYmVycy4KLQotICBFeGFtcGxlIG1vY2tfZGFvLlNldFRpbWVvdXQoKElzQWxtb3N0KDMuOSkpKQotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgZmxvYXRfdmFsdWUsIHBsYWNlcz03KToKLSAgICAiIiJJbml0aWFsaXplIElzQWxtb3N0LgotCi0gICAgQXJnczoKLSAgICAgIGZsb2F0X3ZhbHVlOiBUaGUgdmFsdWUgZm9yIG1ha2luZyB0aGUgY29tcGFyaXNvbi4KLSAgICAgIHBsYWNlczogVGhlIG51bWJlciBvZiBkZWNpbWFsIHBsYWNlcyB0byByb3VuZCB0by4KLSAgICAiIiIKLQotICAgIHNlbGYuX2Zsb2F0X3ZhbHVlID0gZmxvYXRfdmFsdWUKLSAgICBzZWxmLl9wbGFjZXMgPSBwbGFjZXMKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiQ2hlY2sgdG8gc2VlIGlmIFJIUyBpcyBhbG1vc3QgZXF1YWwgdG8gZmxvYXRfdmFsdWUKLQotICAgIEFyZ3M6Ci0gICAgICByaHM6IHRoZSB2YWx1ZSB0byBjb21wYXJlIHRvIGZsb2F0X3ZhbHVlCi0KLSAgICBSZXR1cm5zOgotICAgICAgYm9vbAotICAgICIiIgotCi0gICAgdHJ5OgotICAgICAgcmV0dXJuIHJvdW5kKHJocy1zZWxmLl9mbG9hdF92YWx1ZSwgc2VsZi5fcGxhY2VzKSA9PSAwCi0gICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICMgVGhpcyBpcyBwcm9iYWJseSBiZWNhdXNlIGVpdGhlciBmbG9hdF92YWx1ZSBvciByaHMgaXMgbm90IGEgbnVtYmVyLgotICAgICAgcmV0dXJuIEZhbHNlCi0KLSAgZGVmIF9fcmVwcl9fKHNlbGYpOgotICAgIHJldHVybiBzdHIoc2VsZi5fZmxvYXRfdmFsdWUpCi0KLWNsYXNzIFN0ckNvbnRhaW5zKENvbXBhcmF0b3IpOgotICAiIiJDb21wYXJpc29uIGNsYXNzIHVzZWQgdG8gY2hlY2sgd2hldGhlciBhIHN1YnN0cmluZyBleGlzdHMgaW4gYQotICBzdHJpbmcgcGFyYW1ldGVyLiAgVGhpcyBjYW4gYmUgdXNlZnVsIGluIG1vY2tpbmcgYSBkYXRhYmFzZSB3aXRoIFNRTAotICBwYXNzZWQgaW4gYXMgYSBzdHJpbmcgcGFyYW1ldGVyLCBmb3IgZXhhbXBsZS4KLQotICBFeGFtcGxlOgotICBtb2NrX2Rhby5SdW5RdWVyeShTdHJDb250YWlucygnSU4gKDEsIDIsIDQsIDUpJykpLkFuZFJldHVybihtb2NrX3Jlc3VsdCkKLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHNlYXJjaF9zdHJpbmcpOgotICAgICIiIkluaXRpYWxpemUuCi0KLSAgICBBcmdzOgotICAgICAgIyBzZWFyY2hfc3RyaW5nOiB0aGUgc3RyaW5nIHlvdSBhcmUgc2VhcmNoaW5nIGZvcgotICAgICAgc2VhcmNoX3N0cmluZzogc3RyCi0gICAgIiIiCi0KLSAgICBzZWxmLl9zZWFyY2hfc3RyaW5nID0gc2VhcmNoX3N0cmluZwotCi0gIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKLSAgICAiIiJDaGVjayB0byBzZWUgaWYgdGhlIHNlYXJjaF9zdHJpbmcgaXMgY29udGFpbmVkIGluIHRoZSByaHMgc3RyaW5nLgotCi0gICAgQXJnczoKLSAgICAgICMgcmhzOiB0aGUgcmlnaHQgaGFuZCBzaWRlIG9mIHRoZSB0ZXN0Ci0gICAgICByaHM6IG9iamVjdAotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIHRyeToKLSAgICAgIHJldHVybiByaHMuZmluZChzZWxmLl9zZWFyY2hfc3RyaW5nKSA+IC0xCi0gICAgZXhjZXB0IEV4Y2VwdGlvbjoKLSAgICAgIHJldHVybiBGYWxzZQotCi0gIGRlZiBfX3JlcHJfXyhzZWxmKToKLSAgICByZXR1cm4gJzxzdHIgY29udGFpbmluZyBcJyVzXCc+JyAlIHNlbGYuX3NlYXJjaF9zdHJpbmcKLQotCi1jbGFzcyBSZWdleChDb21wYXJhdG9yKToKLSAgIiIiQ2hlY2tzIGlmIGEgc3RyaW5nIG1hdGNoZXMgYSByZWd1bGFyIGV4cHJlc3Npb24uCi0KLSAgVGhpcyB1c2VzIGEgZ2l2ZW4gcmVndWxhciBleHByZXNzaW9uIHRvIGRldGVybWluZSBlcXVhbGl0eS4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIHBhdHRlcm4sIGZsYWdzPTApOgotICAgICIiIkluaXRpYWxpemUuCi0KLSAgICBBcmdzOgotICAgICAgIyBwYXR0ZXJuIGlzIHRoZSByZWd1bGFyIGV4cHJlc3Npb24gdG8gc2VhcmNoIGZvcgotICAgICAgcGF0dGVybjogc3RyCi0gICAgICAjIGZsYWdzIHBhc3NlZCB0byByZS5jb21waWxlIGZ1bmN0aW9uIGFzIHRoZSBzZWNvbmQgYXJndW1lbnQKLSAgICAgIGZsYWdzOiBpbnQKLSAgICAiIiIKLQotICAgIHNlbGYucmVnZXggPSByZS5jb21waWxlKHBhdHRlcm4sIGZsYWdzPWZsYWdzKQotCi0gIGRlZiBlcXVhbHMoc2VsZiwgcmhzKToKLSAgICAiIiJDaGVjayB0byBzZWUgaWYgcmhzIG1hdGNoZXMgcmVndWxhciBleHByZXNzaW9uIHBhdHRlcm4uCi0KLSAgICBSZXR1cm5zOgotICAgICAgYm9vbAotICAgICIiIgotCi0gICAgcmV0dXJuIHNlbGYucmVnZXguc2VhcmNoKHJocykgaXMgbm90IE5vbmUKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcyA9ICc8cmVndWxhciBleHByZXNzaW9uIFwnJXNcJycgJSBzZWxmLnJlZ2V4LnBhdHRlcm4KLSAgICBpZiBzZWxmLnJlZ2V4LmZsYWdzOgotICAgICAgcyArPSAnLCBmbGFncz0lZCcgJSBzZWxmLnJlZ2V4LmZsYWdzCi0gICAgcyArPSAnPicKLSAgICByZXR1cm4gcwotCi0KLWNsYXNzIEluKENvbXBhcmF0b3IpOgotICAiIiJDaGVja3Mgd2hldGhlciBhbiBpdGVtIChvciBrZXkpIGlzIGluIGEgbGlzdCAob3IgZGljdCkgcGFyYW1ldGVyLgotCi0gIEV4YW1wbGU6Ci0gIG1vY2tfZGFvLkdldFVzZXJzSW5mbyhJbignZXhwZWN0ZWRVc2VyTmFtZScpKS5BbmRSZXR1cm4obW9ja19yZXN1bHQpCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBrZXkpOgotICAgICIiIkluaXRpYWxpemUuCi0KLSAgICBBcmdzOgotICAgICAgIyBrZXkgaXMgYW55IHRoaW5nIHRoYXQgY291bGQgYmUgaW4gYSBsaXN0IG9yIGEga2V5IGluIGEgZGljdAotICAgICIiIgotCi0gICAgc2VsZi5fa2V5ID0ga2V5Ci0KLSAgZGVmIGVxdWFscyhzZWxmLCByaHMpOgotICAgICIiIkNoZWNrIHRvIHNlZSB3aGV0aGVyIGtleSBpcyBpbiByaHMuCi0KLSAgICBBcmdzOgotICAgICAgcmhzOiBkaWN0Ci0KLSAgICBSZXR1cm5zOgotICAgICAgYm9vbAotICAgICIiIgotCi0gICAgcmV0dXJuIHNlbGYuX2tleSBpbiByaHMKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuICc8c2VxdWVuY2Ugb3IgbWFwIGNvbnRhaW5pbmcgXCclc1wnPicgJSBzZWxmLl9rZXkKLQotCi1jbGFzcyBDb250YWluc0tleVZhbHVlKENvbXBhcmF0b3IpOgotICAiIiJDaGVja3Mgd2hldGhlciBhIGtleS92YWx1ZSBwYWlyIGlzIGluIGEgZGljdCBwYXJhbWV0ZXIuCi0KLSAgRXhhbXBsZToKLSAgbW9ja19kYW8uVXBkYXRlVXNlcnMoQ29udGFpbnNLZXlWYWx1ZSgnc3RldmVwbScsIHN0ZXZlcG1fdXNlcl9pbmZvKSkKLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGtleSwgdmFsdWUpOgotICAgICIiIkluaXRpYWxpemUuCi0KLSAgICBBcmdzOgotICAgICAgIyBrZXk6IGEga2V5IGluIGEgZGljdAotICAgICAgIyB2YWx1ZTogdGhlIGNvcnJlc3BvbmRpbmcgdmFsdWUKLSAgICAiIiIKLQotICAgIHNlbGYuX2tleSA9IGtleQotICAgIHNlbGYuX3ZhbHVlID0gdmFsdWUKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiQ2hlY2sgd2hldGhlciB0aGUgZ2l2ZW4ga2V5L3ZhbHVlIHBhaXIgaXMgaW4gdGhlIHJocyBkaWN0LgotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIHRyeToKLSAgICAgIHJldHVybiByaHNbc2VsZi5fa2V5XSA9PSBzZWxmLl92YWx1ZQotICAgIGV4Y2VwdCBFeGNlcHRpb246Ci0gICAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuICc8bWFwIGNvbnRhaW5pbmcgdGhlIGVudHJ5IFwnJXM6ICVzXCc+JyAlIChzZWxmLl9rZXksIHNlbGYuX3ZhbHVlKQotCi0KLWNsYXNzIFNhbWVFbGVtZW50c0FzKENvbXBhcmF0b3IpOgotICAiIiJDaGVja3Mgd2hldGhlciBpdGVyYWJsZXMgY29udGFpbiB0aGUgc2FtZSBlbGVtZW50cyAoaWdub3Jpbmcgb3JkZXIpLgotCi0gIEV4YW1wbGU6Ci0gIG1vY2tfZGFvLlByb2Nlc3NVc2VycyhTYW1lRWxlbWVudHNBcygnc3RldmVwbScsICdzYWxvbWFraScpKQotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgZXhwZWN0ZWRfc2VxKToKLSAgICAiIiJJbml0aWFsaXplLgotCi0gICAgQXJnczoKLSAgICAgIGV4cGVjdGVkX3NlcTogYSBzZXF1ZW5jZQotICAgICIiIgotCi0gICAgc2VsZi5fZXhwZWN0ZWRfc2VxID0gZXhwZWN0ZWRfc2VxCi0KLSAgZGVmIGVxdWFscyhzZWxmLCBhY3R1YWxfc2VxKToKLSAgICAiIiJDaGVjayB0byBzZWUgd2hldGhlciBhY3R1YWxfc2VxIGhhcyBzYW1lIGVsZW1lbnRzIGFzIGV4cGVjdGVkX3NlcS4KLQotICAgIEFyZ3M6Ci0gICAgICBhY3R1YWxfc2VxOiBzZXF1ZW5jZQotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIHRyeToKLSAgICAgIGV4cGVjdGVkID0gZGljdChbKGVsZW1lbnQsIE5vbmUpIGZvciBlbGVtZW50IGluIHNlbGYuX2V4cGVjdGVkX3NlcV0pCi0gICAgICBhY3R1YWwgPSBkaWN0KFsoZWxlbWVudCwgTm9uZSkgZm9yIGVsZW1lbnQgaW4gYWN0dWFsX3NlcV0pCi0gICAgZXhjZXB0IFR5cGVFcnJvcjoKLSAgICAgICMgRmFsbCBiYWNrIHRvIHNsb3dlciBsaXN0LWNvbXBhcmUgaWYgYW55IG9mIHRoZSBvYmplY3RzIGFyZSB1bmhhc2hhYmxlLgotICAgICAgZXhwZWN0ZWQgPSBsaXN0KHNlbGYuX2V4cGVjdGVkX3NlcSkKLSAgICAgIGFjdHVhbCA9IGxpc3QoYWN0dWFsX3NlcSkKLSAgICAgIGV4cGVjdGVkLnNvcnQoKQotICAgICAgYWN0dWFsLnNvcnQoKQotICAgIHJldHVybiBleHBlY3RlZCA9PSBhY3R1YWwKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuICc8c2VxdWVuY2Ugd2l0aCBzYW1lIGVsZW1lbnRzIGFzIFwnJXNcJz4nICUgc2VsZi5fZXhwZWN0ZWRfc2VxCi0KLQotY2xhc3MgQW5kKENvbXBhcmF0b3IpOgotICAiIiJFdmFsdWF0ZXMgb25lIG9yIG1vcmUgQ29tcGFyYXRvcnMgb24gUkhTIGFuZCByZXR1cm5zIGFuIEFORCBvZiB0aGUgcmVzdWx0cy4KLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsICphcmdzKToKLSAgICAiIiJJbml0aWFsaXplLgotCi0gICAgQXJnczoKLSAgICAgICphcmdzOiBPbmUgb3IgbW9yZSBDb21wYXJhdG9yCi0gICAgIiIiCi0KLSAgICBzZWxmLl9jb21wYXJhdG9ycyA9IGFyZ3MKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiQ2hlY2tzIHdoZXRoZXIgYWxsIENvbXBhcmF0b3JzIGFyZSBlcXVhbCB0byByaHMuCi0KLSAgICBBcmdzOgotICAgICAgIyByaHM6IGNhbiBiZSBhbnl0aGluZwotCi0gICAgUmV0dXJuczoKLSAgICAgIGJvb2wKLSAgICAiIiIKLQotICAgIGZvciBjb21wYXJhdG9yIGluIHNlbGYuX2NvbXBhcmF0b3JzOgotICAgICAgaWYgbm90IGNvbXBhcmF0b3IuZXF1YWxzKHJocyk6Ci0gICAgICAgIHJldHVybiBGYWxzZQotCi0gICAgcmV0dXJuIFRydWUKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuICc8QU5EICVzPicgJSBzdHIoc2VsZi5fY29tcGFyYXRvcnMpCi0KLQotY2xhc3MgT3IoQ29tcGFyYXRvcik6Ci0gICIiIkV2YWx1YXRlcyBvbmUgb3IgbW9yZSBDb21wYXJhdG9ycyBvbiBSSFMgYW5kIHJldHVybnMgYW4gT1Igb2YgdGhlIHJlc3VsdHMuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCAqYXJncyk6Ci0gICAgIiIiSW5pdGlhbGl6ZS4KLQotICAgIEFyZ3M6Ci0gICAgICAqYXJnczogT25lIG9yIG1vcmUgTW94IGNvbXBhcmF0b3JzCi0gICAgIiIiCi0KLSAgICBzZWxmLl9jb21wYXJhdG9ycyA9IGFyZ3MKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiQ2hlY2tzIHdoZXRoZXIgYW55IENvbXBhcmF0b3IgaXMgZXF1YWwgdG8gcmhzLgotCi0gICAgQXJnczoKLSAgICAgICMgcmhzOiBjYW4gYmUgYW55dGhpbmcKLQotICAgIFJldHVybnM6Ci0gICAgICBib29sCi0gICAgIiIiCi0KLSAgICBmb3IgY29tcGFyYXRvciBpbiBzZWxmLl9jb21wYXJhdG9yczoKLSAgICAgIGlmIGNvbXBhcmF0b3IuZXF1YWxzKHJocyk6Ci0gICAgICAgIHJldHVybiBUcnVlCi0KLSAgICByZXR1cm4gRmFsc2UKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuICc8T1IgJXM+JyAlIHN0cihzZWxmLl9jb21wYXJhdG9ycykKLQotCi1jbGFzcyBGdW5jKENvbXBhcmF0b3IpOgotICAiIiJDYWxsIGEgZnVuY3Rpb24gdGhhdCBzaG91bGQgdmVyaWZ5IHRoZSBwYXJhbWV0ZXIgcGFzc2VkIGluIGlzIGNvcnJlY3QuCi0KLSAgWW91IG1heSBuZWVkIHRoZSBhYmlsaXR5IHRvIHBlcmZvcm0gbW9yZSBhZHZhbmNlZCBvcGVyYXRpb25zIG9uIHRoZSBwYXJhbWV0ZXIKLSAgaW4gb3JkZXIgdG8gdmFsaWRhdGUgaXQuICBZb3UgY2FuIHVzZSB0aGlzIHRvIGhhdmUgYSBjYWxsYWJsZSB2YWxpZGF0ZSBhbnkKLSAgcGFyYW1ldGVyLiBUaGUgY2FsbGFibGUgc2hvdWxkIHJldHVybiBlaXRoZXIgVHJ1ZSBvciBGYWxzZS4KLQotCi0gIEV4YW1wbGU6Ci0KLSAgZGVmIG15UGFyYW1WYWxpZGF0b3IocGFyYW0pOgotICAgICMgQWR2YW5jZWQgbG9naWMgaGVyZQotICAgIHJldHVybiBUcnVlCi0KLSAgbW9ja19kYW8uRG9Tb21ldGhpbmcoRnVuYyhteVBhcmFtVmFsaWRhdG9yKSwgdHJ1ZSkKLSAgIiIiCi0KLSAgZGVmIF9faW5pdF9fKHNlbGYsIGZ1bmMpOgotICAgICIiIkluaXRpYWxpemUuCi0KLSAgICBBcmdzOgotICAgICAgZnVuYzogY2FsbGFibGUgdGhhdCB0YWtlcyBvbmUgcGFyYW1ldGVyIGFuZCByZXR1cm5zIGEgYm9vbAotICAgICIiIgotCi0gICAgc2VsZi5fZnVuYyA9IGZ1bmMKLQotICBkZWYgZXF1YWxzKHNlbGYsIHJocyk6Ci0gICAgIiIiVGVzdCB3aGV0aGVyIHJocyBwYXNzZXMgdGhlIGZ1bmN0aW9uIHRlc3QuCi0KLSAgICByaHMgaXMgcGFzc2VkIGludG8gZnVuYy4KLQotICAgIEFyZ3M6Ci0gICAgICByaHM6IGFueSBweXRob24gb2JqZWN0Ci0KLSAgICBSZXR1cm5zOgotICAgICAgdGhlIHJlc3VsdCBvZiBmdW5jKHJocykKLSAgICAiIiIKLQotICAgIHJldHVybiBzZWxmLl9mdW5jKHJocykKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuIHN0cihzZWxmLl9mdW5jKQotCi0KLWNsYXNzIElnbm9yZUFyZyhDb21wYXJhdG9yKToKLSAgIiIiSWdub3JlIGFuIGFyZ3VtZW50LgotCi0gIFRoaXMgY2FuIGJlIHVzZWQgd2hlbiB3ZSBkb24ndCBjYXJlIGFib3V0IGFuIGFyZ3VtZW50IG9mIGEgbWV0aG9kIGNhbGwuCi0KLSAgRXhhbXBsZToKLSAgIyBDaGVjayBpZiBDYXN0TWFnaWMgaXMgY2FsbGVkIHdpdGggMyBhcyBmaXJzdCBhcmcgYW5kICdkaXNhcHBlYXInIGFzIHRoaXJkLgotICBteW1vY2suQ2FzdE1hZ2ljKDMsIElnbm9yZUFyZygpLCAnZGlzYXBwZWFyJykKLSAgIiIiCi0KLSAgZGVmIGVxdWFscyhzZWxmLCB1bnVzZWRfcmhzKToKLSAgICAiIiJJZ25vcmVzIGFyZ3VtZW50cyBhbmQgcmV0dXJucyBUcnVlLgotCi0gICAgQXJnczoKLSAgICAgIHVudXNlZF9yaHM6IGFueSBweXRob24gb2JqZWN0Ci0KLSAgICBSZXR1cm5zOgotICAgICAgYWx3YXlzIHJldHVybnMgVHJ1ZQotICAgICIiIgotCi0gICAgcmV0dXJuIFRydWUKLQotICBkZWYgX19yZXByX18oc2VsZik6Ci0gICAgcmV0dXJuICc8SWdub3JlQXJnPicKLQotCi1jbGFzcyBNZXRob2RHcm91cChvYmplY3QpOgotICAiIiJCYXNlIGNsYXNzIGNvbnRhaW5pbmcgY29tbW9uIGJlaGF2aW91ciBmb3IgTWV0aG9kR3JvdXBzLiIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cF9uYW1lKToKLSAgICBzZWxmLl9ncm91cF9uYW1lID0gZ3JvdXBfbmFtZQotCi0gIGRlZiBncm91cF9uYW1lKHNlbGYpOgotICAgIHJldHVybiBzZWxmLl9ncm91cF9uYW1lCi0KLSAgZGVmIF9fc3RyX18oc2VsZik6Ci0gICAgcmV0dXJuICc8JXMgIiVzIj4nICUgKHNlbGYuX19jbGFzc19fLl9fbmFtZV9fLCBzZWxmLl9ncm91cF9uYW1lKQotCi0gIGRlZiBBZGRNZXRob2Qoc2VsZiwgbW9ja19tZXRob2QpOgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotICBkZWYgTWV0aG9kQ2FsbGVkKHNlbGYsIG1vY2tfbWV0aG9kKToKLSAgICByYWlzZSBOb3RJbXBsZW1lbnRlZEVycm9yCi0KLSAgZGVmIElzU2F0aXNmaWVkKHNlbGYpOgotICAgIHJhaXNlIE5vdEltcGxlbWVudGVkRXJyb3IKLQotY2xhc3MgVW5vcmRlcmVkR3JvdXAoTWV0aG9kR3JvdXApOgotICAiIiJVbm9yZGVyZWRHcm91cCBob2xkcyBhIHNldCBvZiBtZXRob2QgY2FsbHMgdGhhdCBtYXkgb2NjdXIgaW4gYW55IG9yZGVyLgotCi0gIFRoaXMgY29uc3RydWN0IGlzIGhlbHBmdWwgZm9yIG5vbi1kZXRlcm1pbmlzdGljIGV2ZW50cywgc3VjaCBhcyBpdGVyYXRpbmcKLSAgb3ZlciB0aGUga2V5cyBvZiBhIGRpY3QuCi0gICIiIgotCi0gIGRlZiBfX2luaXRfXyhzZWxmLCBncm91cF9uYW1lKToKLSAgICBzdXBlcihVbm9yZGVyZWRHcm91cCwgc2VsZikuX19pbml0X18oZ3JvdXBfbmFtZSkKLSAgICBzZWxmLl9tZXRob2RzID0gW10KLQotICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKLSAgICAiIiJBZGQgYSBtZXRob2QgdG8gdGhpcyBncm91cC4KLQotICAgIEFyZ3M6Ci0gICAgICBtb2NrX21ldGhvZDogQSBtb2NrIG1ldGhvZCB0byBiZSBhZGRlZCB0byB0aGlzIGdyb3VwLgotICAgICIiIgotCi0gICAgc2VsZi5fbWV0aG9kcy5hcHBlbmQobW9ja19tZXRob2QpCi0KLSAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6Ci0gICAgIiIiUmVtb3ZlIGEgbWV0aG9kIGNhbGwgZnJvbSB0aGUgZ3JvdXAuCi0KLSAgICBJZiB0aGUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgc2V0LCBhbiBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIHdpbGwgYmUKLSAgICByYWlzZWQuCi0KLSAgICBBcmdzOgotICAgICAgbW9ja19tZXRob2Q6IGEgbW9jayBtZXRob2QgdGhhdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBtZXRob2QgaW4gdGhlIGdyb3VwLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBtb2NrIG1ldGhvZCBmcm9tIHRoZSBncm91cAotCi0gICAgUmFpc2VzOgotICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgbW9ja19tZXRob2Qgd2FzIG5vdCBpbiB0aGUgZ3JvdXAuCi0gICAgIiIiCi0KLSAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMsIGFuZCBpZiBzbywgcmVtb3ZlIGl0IGZyb20gdGhlIHNldAotICAgICMgYW5kIHJldHVybiBpdC4KLSAgICBmb3IgbWV0aG9kIGluIHNlbGYuX21ldGhvZHM6Ci0gICAgICBpZiBtZXRob2QgPT0gbW9ja19tZXRob2Q6Ci0gICAgICAgICMgUmVtb3ZlIHRoZSBjYWxsZWQgbW9ja19tZXRob2QgaW5zdGVhZCBvZiB0aGUgbWV0aG9kIGluIHRoZSBncm91cC4KLSAgICAgICAgIyBUaGUgY2FsbGVkIG1ldGhvZCB3aWxsIG1hdGNoIGFueSBjb21wYXJhdG9ycyB3aGVuIGVxdWFsaXR5IGlzIGNoZWNrZWQKLSAgICAgICAgIyBkdXJpbmcgcmVtb3ZhbC4gIFRoZSBtZXRob2QgaW4gdGhlIGdyb3VwIGNvdWxkIHBhc3MgYSBjb21wYXJhdG9yIHRvCi0gICAgICAgICMgYW5vdGhlciBjb21wYXJhdG9yIGR1cmluZyB0aGUgZXF1YWxpdHkgY2hlY2suCi0gICAgICAgIHNlbGYuX21ldGhvZHMucmVtb3ZlKG1vY2tfbWV0aG9kKQotCi0gICAgICAgICMgSWYgdGhpcyBncm91cCBpcyBub3QgZW1wdHksIHB1dCBpdCBiYWNrIGF0IHRoZSBoZWFkIG9mIHRoZSBxdWV1ZS4KLSAgICAgICAgaWYgbm90IHNlbGYuSXNTYXRpc2ZpZWQoKToKLSAgICAgICAgICBtb2NrX21ldGhvZC5fY2FsbF9xdWV1ZS5hcHBlbmRsZWZ0KHNlbGYpCi0KLSAgICAgICAgcmV0dXJuIHNlbGYsIG1ldGhvZAotCi0gICAgcmFpc2UgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvcihtb2NrX21ldGhvZCwgc2VsZikKLQotICBkZWYgSXNTYXRpc2ZpZWQoc2VsZik6Ci0gICAgIiIiUmV0dXJuIFRydWUgaWYgdGhlcmUgYXJlIG5vdCBhbnkgbWV0aG9kcyBpbiB0aGlzIGdyb3VwLiIiIgotCi0gICAgcmV0dXJuIGxlbihzZWxmLl9tZXRob2RzKSA9PSAwCi0KLQotY2xhc3MgTXVsdGlwbGVUaW1lc0dyb3VwKE1ldGhvZEdyb3VwKToKLSAgIiIiTXVsdGlwbGVUaW1lc0dyb3VwIGhvbGRzIG1ldGhvZHMgdGhhdCBtYXkgYmUgY2FsbGVkIGFueSBudW1iZXIgb2YgdGltZXMuCi0KLSAgTm90ZTogRWFjaCBtZXRob2QgbXVzdCBiZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4KLQotICBUaGlzIGlzIGhlbHBmdWwsIGlmIHlvdSBkb24ndCBrbm93IG9yIGNhcmUgaG93IG1hbnkgdGltZXMgYSBtZXRob2QgaXMgY2FsbGVkLgotICAiIiIKLQotICBkZWYgX19pbml0X18oc2VsZiwgZ3JvdXBfbmFtZSk6Ci0gICAgc3VwZXIoTXVsdGlwbGVUaW1lc0dyb3VwLCBzZWxmKS5fX2luaXRfXyhncm91cF9uYW1lKQotICAgIHNlbGYuX21ldGhvZHMgPSBzZXQoKQotICAgIHNlbGYuX21ldGhvZHNfY2FsbGVkID0gc2V0KCkKLQotICBkZWYgQWRkTWV0aG9kKHNlbGYsIG1vY2tfbWV0aG9kKToKLSAgICAiIiJBZGQgYSBtZXRob2QgdG8gdGhpcyBncm91cC4KLQotICAgIEFyZ3M6Ci0gICAgICBtb2NrX21ldGhvZDogQSBtb2NrIG1ldGhvZCB0byBiZSBhZGRlZCB0byB0aGlzIGdyb3VwLgotICAgICIiIgotCi0gICAgc2VsZi5fbWV0aG9kcy5hZGQobW9ja19tZXRob2QpCi0KLSAgZGVmIE1ldGhvZENhbGxlZChzZWxmLCBtb2NrX21ldGhvZCk6Ci0gICAgIiIiUmVtb3ZlIGEgbWV0aG9kIGNhbGwgZnJvbSB0aGUgZ3JvdXAuCi0KLSAgICBJZiB0aGUgbWV0aG9kIGlzIG5vdCBpbiB0aGUgc2V0LCBhbiBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yIHdpbGwgYmUKLSAgICByYWlzZWQuCi0KLSAgICBBcmdzOgotICAgICAgbW9ja19tZXRob2Q6IGEgbW9jayBtZXRob2QgdGhhdCBzaG91bGQgYmUgZXF1YWwgdG8gYSBtZXRob2QgaW4gdGhlIGdyb3VwLgotCi0gICAgUmV0dXJuczoKLSAgICAgIFRoZSBtb2NrIG1ldGhvZCBmcm9tIHRoZSBncm91cAotCi0gICAgUmFpc2VzOgotICAgICAgVW5leHBlY3RlZE1ldGhvZENhbGxFcnJvciBpZiB0aGUgbW9ja19tZXRob2Qgd2FzIG5vdCBpbiB0aGUgZ3JvdXAuCi0gICAgIiIiCi0KLSAgICAjIENoZWNrIHRvIHNlZSBpZiB0aGlzIG1ldGhvZCBleGlzdHMsIGFuZCBpZiBzbyBhZGQgaXQgdG8gdGhlIHNldCBvZgotICAgICMgY2FsbGVkIG1ldGhvZHMuCi0KLSAgICBmb3IgbWV0aG9kIGluIHNlbGYuX21ldGhvZHM6Ci0gICAgICBpZiBtZXRob2QgPT0gbW9ja19tZXRob2Q6Ci0gICAgICAgIHNlbGYuX21ldGhvZHNfY2FsbGVkLmFkZChtb2NrX21ldGhvZCkKLSAgICAgICAgIyBBbHdheXMgcHV0IHRoaXMgZ3JvdXAgYmFjayBvbiB0b3Agb2YgdGhlIHF1ZXVlLCBiZWNhdXNlIHdlIGRvbid0IGtub3cKLSAgICAgICAgIyB3aGVuIHdlIGFyZSBkb25lLgotICAgICAgICBtb2NrX21ldGhvZC5fY2FsbF9xdWV1ZS5hcHBlbmRsZWZ0KHNlbGYpCi0gICAgICAgIHJldHVybiBzZWxmLCBtZXRob2QKLQotICAgIGlmIHNlbGYuSXNTYXRpc2ZpZWQoKToKLSAgICAgIG5leHRfbWV0aG9kID0gbW9ja19tZXRob2QuX1BvcE5leHRNZXRob2QoKTsKLSAgICAgIHJldHVybiBuZXh0X21ldGhvZCwgTm9uZQotICAgIGVsc2U6Ci0gICAgICByYWlzZSBVbmV4cGVjdGVkTWV0aG9kQ2FsbEVycm9yKG1vY2tfbWV0aG9kLCBzZWxmKQotCi0gIGRlZiBJc1NhdGlzZmllZChzZWxmKToKLSAgICAiIiJSZXR1cm4gVHJ1ZSBpZiBhbGwgbWV0aG9kcyBpbiB0aGlzIGdyb3VwIGFyZSBjYWxsZWQgYXQgbGVhc3Qgb25jZS4iIiIKLSAgICAjIE5PVEUocHN5Y2hvKTogV2UgY2FuJ3QgdXNlIHRoZSBzaW1wbGUgc2V0IGRpZmZlcmVuY2UgaGVyZSBiZWNhdXNlIHdlIHdhbnQKLSAgICAjIHRvIG1hdGNoIGRpZmZlcmVudCBwYXJhbWV0ZXJzIHdoaWNoIGFyZSBjb25zaWRlcmVkIHRoZSBzYW1lIGUuZy4gSXNBKHN0cikKLSAgICAjIGFuZCBzb21lIHN0cmluZy4gVGhpcyBzb2x1dGlvbiBpcyBPKG5eMikgYnV0IG4gc2hvdWxkIGJlIHNtYWxsLgotICAgIHRtcCA9IHNlbGYuX21ldGhvZHMuY29weSgpCi0gICAgZm9yIGNhbGxlZCBpbiBzZWxmLl9tZXRob2RzX2NhbGxlZDoKLSAgICAgIGZvciBleHBlY3RlZCBpbiB0bXA6Ci0gICAgICAgIGlmIGNhbGxlZCA9PSBleHBlY3RlZDoKLSAgICAgICAgICB0bXAucmVtb3ZlKGV4cGVjdGVkKQotICAgICAgICAgIGlmIG5vdCB0bXA6Ci0gICAgICAgICAgICByZXR1cm4gVHJ1ZQotICAgICAgICAgIGJyZWFrCi0gICAgcmV0dXJuIEZhbHNlCi0KLQotY2xhc3MgTW94TWV0YVRlc3RCYXNlKHR5cGUpOgotICAiIiJNZXRhY2xhc3MgdG8gYWRkIG1veCBjbGVhbnVwIGFuZCB2ZXJpZmljYXRpb24gdG8gZXZlcnkgdGVzdC4KLQotICBBcyB0aGUgbW94IHVuaXQgdGVzdGluZyBjbGFzcyBpcyBiZWluZyBjb25zdHJ1Y3RlZCAoTW94VGVzdEJhc2Ugb3IgYQotICBzdWJjbGFzcyksIHRoaXMgbWV0YWNsYXNzIHdpbGwgbW9kaWZ5IGFsbCB0ZXN0IGZ1bmN0aW9ucyB0byBjYWxsIHRoZQotICBDbGVhblVwTW94IG1ldGhvZCBvZiB0aGUgdGVzdCBjbGFzcyBhZnRlciB0aGV5IGZpbmlzaC4gVGhpcyBtZWFucyB0aGF0Ci0gIHVuc3R1YmJpbmcgYW5kIHZlcmlmeWluZyB3aWxsIGhhcHBlbiBmb3IgZXZlcnkgdGVzdCB3aXRoIG5vIGFkZGl0aW9uYWwgY29kZSwKLSAgYW5kIGFueSBmYWlsdXJlcyB3aWxsIHJlc3VsdCBpbiB0ZXN0IGZhaWx1cmVzIGFzIG9wcG9zZWQgdG8gZXJyb3JzLgotICAiIiIKLQotICBkZWYgX19pbml0X18oY2xzLCBuYW1lLCBiYXNlcywgZCk6Ci0gICAgdHlwZS5fX2luaXRfXyhjbHMsIG5hbWUsIGJhc2VzLCBkKQotCi0gICAgIyBhbHNvIGdldCBhbGwgdGhlIGF0dHJpYnV0ZXMgZnJvbSB0aGUgYmFzZSBjbGFzc2VzIHRvIGFjY291bnQKLSAgICAjIGZvciBhIGNhc2Ugd2hlbiB0ZXN0IGNsYXNzIGlzIG5vdCB0aGUgaW1tZWRpYXRlIGNoaWxkIG9mIE1veFRlc3RCYXNlCi0gICAgZm9yIGJhc2UgaW4gYmFzZXM6Ci0gICAgICBmb3IgYXR0cl9uYW1lIGluIGRpcihiYXNlKToKLSAgICAgICAgZFthdHRyX25hbWVdID0gZ2V0YXR0cihiYXNlLCBhdHRyX25hbWUpCi0KLSAgICBmb3IgZnVuY19uYW1lLCBmdW5jIGluIGQuaXRlbXMoKToKLSAgICAgIGlmIGZ1bmNfbmFtZS5zdGFydHN3aXRoKCd0ZXN0JykgYW5kIGNhbGxhYmxlKGZ1bmMpOgotICAgICAgICBzZXRhdHRyKGNscywgZnVuY19uYW1lLCBNb3hNZXRhVGVzdEJhc2UuQ2xlYW5VcFRlc3QoY2xzLCBmdW5jKSkKLQotICBAc3RhdGljbWV0aG9kCi0gIGRlZiBDbGVhblVwVGVzdChjbHMsIGZ1bmMpOgotICAgICIiIkFkZHMgTW94IGNsZWFudXAgY29kZSB0byBhbnkgTW94VGVzdEJhc2UgbWV0aG9kLgotCi0gICAgQWx3YXlzIHVuc2V0cyBzdHVicyBhZnRlciBhIHRlc3QuIFdpbGwgdmVyaWZ5IGFsbCBtb2NrcyBmb3IgdGVzdHMgdGhhdAotICAgIG90aGVyd2lzZSBwYXNzLgotCi0gICAgQXJnczoKLSAgICAgIGNsczogTW94VGVzdEJhc2Ugb3Igc3ViY2xhc3M7IHRoZSBjbGFzcyB3aG9zZSB0ZXN0IG1ldGhvZCB3ZSBhcmUgYWx0ZXJpbmcuCi0gICAgICBmdW5jOiBtZXRob2Q7IHRoZSBtZXRob2Qgb2YgdGhlIE1veFRlc3RCYXNlIHRlc3QgY2xhc3Mgd2Ugd2lzaCB0byBhbHRlci4KLQotICAgIFJldHVybnM6Ci0gICAgICBUaGUgbW9kaWZpZWQgbWV0aG9kLgotICAgICIiIgotICAgIGRlZiBuZXdfbWV0aG9kKHNlbGYsICphcmdzLCAqKmt3YXJncyk6Ci0gICAgICBtb3hfb2JqID0gZ2V0YXR0cihzZWxmLCAnbW94JywgTm9uZSkKLSAgICAgIGNsZWFudXBfbW94ID0gRmFsc2UKLSAgICAgIGlmIG1veF9vYmogYW5kIGlzaW5zdGFuY2UobW94X29iaiwgTW94KToKLSAgICAgICAgY2xlYW51cF9tb3ggPSBUcnVlCi0gICAgICB0cnk6Ci0gICAgICAgIGZ1bmMoc2VsZiwgKmFyZ3MsICoqa3dhcmdzKQotICAgICAgZmluYWxseToKLSAgICAgICAgaWYgY2xlYW51cF9tb3g6Ci0gICAgICAgICAgbW94X29iai5VbnNldFN0dWJzKCkKLSAgICAgIGlmIGNsZWFudXBfbW94OgotICAgICAgICBtb3hfb2JqLlZlcmlmeUFsbCgpCi0gICAgbmV3X21ldGhvZC5fX25hbWVfXyA9IGZ1bmMuX19uYW1lX18KLSAgICBuZXdfbWV0aG9kLl9fZG9jX18gPSBmdW5jLl9fZG9jX18KLSAgICBuZXdfbWV0aG9kLl9fbW9kdWxlX18gPSBmdW5jLl9fbW9kdWxlX18KLSAgICByZXR1cm4gbmV3X21ldGhvZAotCi0KLWNsYXNzIE1veFRlc3RCYXNlKHVuaXR0ZXN0LlRlc3RDYXNlKToKLSAgIiIiQ29udmVuaWVuY2UgdGVzdCBjbGFzcyB0byBtYWtlIHN0dWJiaW5nIGVhc2llci4KLQotICBTZXRzIHVwIGEgIm1veCIgYXR0cmlidXRlIHdoaWNoIGlzIGFuIGluc3RhbmNlIG9mIE1veCAtIGFueSBtb3ggdGVzdHMgd2lsbAotICB3YW50IHRoaXMuIEFsc28gYXV0b21hdGljYWxseSB1bnNldHMgYW55IHN0dWJzIGFuZCB2ZXJpZmllcyB0aGF0IGFsbCBtb2NrCi0gIG1ldGhvZHMgaGF2ZSBiZWVuIGNhbGxlZCBhdCB0aGUgZW5kIG9mIGVhY2ggdGVzdCwgZWxpbWluYXRpbmcgYm9pbGVycGxhdGUKLSAgY29kZS4KLSAgIiIiCi0KLSAgX19tZXRhY2xhc3NfXyA9IE1veE1ldGFUZXN0QmFzZQotCi0gIGRlZiBzZXRVcChzZWxmKToKLSAgICBzZWxmLm1veCA9IE1veCgpCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL3NldHVwLnB5IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3B5dGhvbi9zZXR1cC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggN2Q5NzE0ZS4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL3NldHVwLnB5CisrKyAvZGV2L251bGwKQEAgLTEsMTUyICswLDAgQEAKLSMhIC91c3IvYmluL3B5dGhvbgotIwotIyBTZWUgUkVBRE1FIGZvciB1c2FnZSBpbnN0cnVjdGlvbnMuCi0KLSMgV2UgbXVzdCB1c2Ugc2V0dXB0b29scywgbm90IGRpc3R1dGlscywgYmVjYXVzZSB3ZSBuZWVkIHRvIHVzZSB0aGUKLSMgbmFtZXNwYWNlX3BhY2thZ2VzIG9wdGlvbiBmb3IgdGhlICJnb29nbGUiIHBhY2thZ2UuCi1mcm9tIGV6X3NldHVwIGltcG9ydCB1c2Vfc2V0dXB0b29scwotdXNlX3NldHVwdG9vbHMoKQotCi1mcm9tIHNldHVwdG9vbHMgaW1wb3J0IHNldHVwLCBFeHRlbnNpb24KLWZyb20gZGlzdHV0aWxzLnNwYXduIGltcG9ydCBmaW5kX2V4ZWN1dGFibGUKLWltcG9ydCBzeXMKLWltcG9ydCBvcwotaW1wb3J0IHN1YnByb2Nlc3MKLQotbWFpbnRhaW5lcl9lbWFpbCA9ICJwcm90b2J1ZkBnb29nbGVncm91cHMuY29tIgotCi0jIEZpbmQgdGhlIFByb3RvY29sIENvbXBpbGVyLgotaWYgb3MucGF0aC5leGlzdHMoIi4uL3NyYy9wcm90b2MiKToKLSAgcHJvdG9jID0gIi4uL3NyYy9wcm90b2MiCi1lbGlmIG9zLnBhdGguZXhpc3RzKCIuLi9zcmMvcHJvdG9jLmV4ZSIpOgotICBwcm90b2MgPSAiLi4vc3JjL3Byb3RvYy5leGUiCi1lbGlmIG9zLnBhdGguZXhpc3RzKCIuLi92c3Byb2plY3RzL0RlYnVnL3Byb3RvYy5leGUiKToKLSAgcHJvdG9jID0gIi4uL3ZzcHJvamVjdHMvRGVidWcvcHJvdG9jLmV4ZSIKLWVsaWYgb3MucGF0aC5leGlzdHMoIi4uL3ZzcHJvamVjdHMvUmVsZWFzZS9wcm90b2MuZXhlIik6Ci0gIHByb3RvYyA9ICIuLi92c3Byb2plY3RzL1JlbGVhc2UvcHJvdG9jLmV4ZSIKLWVsc2U6Ci0gIHByb3RvYyA9IGZpbmRfZXhlY3V0YWJsZSgicHJvdG9jIikKLQotZGVmIGdlbmVyYXRlX3Byb3RvKHNvdXJjZSk6Ci0gICIiIkludm9rZXMgdGhlIFByb3RvY29sIENvbXBpbGVyIHRvIGdlbmVyYXRlIGEgX3BiMi5weSBmcm9tIHRoZSBnaXZlbgotICAucHJvdG8gZmlsZS4gIERvZXMgbm90aGluZyBpZiB0aGUgb3V0cHV0IGFscmVhZHkgZXhpc3RzIGFuZCBpcyBuZXdlciB0aGFuCi0gIHRoZSBpbnB1dC4iIiIKLQotICBvdXRwdXQgPSBzb3VyY2UucmVwbGFjZSgiLnByb3RvIiwgIl9wYjIucHkiKS5yZXBsYWNlKCIuLi9zcmMvIiwgIiIpCi0KLSAgaWYgbm90IG9zLnBhdGguZXhpc3RzKHNvdXJjZSk6Ci0gICAgcHJpbnQgIkNhbid0IGZpbmQgcmVxdWlyZWQgZmlsZTogIiArIHNvdXJjZQotICAgIHN5cy5leGl0KC0xKQotCi0gIGlmIChub3Qgb3MucGF0aC5leGlzdHMob3V0cHV0KSBvcgotICAgICAgKG9zLnBhdGguZXhpc3RzKHNvdXJjZSkgYW5kCi0gICAgICAgb3MucGF0aC5nZXRtdGltZShzb3VyY2UpID4gb3MucGF0aC5nZXRtdGltZShvdXRwdXQpKSk6Ci0gICAgcHJpbnQgIkdlbmVyYXRpbmcgJXMuLi4iICUgb3V0cHV0Ci0KLSAgICBpZiBwcm90b2MgPT0gTm9uZToKLSAgICAgIHN5cy5zdGRlcnIud3JpdGUoCi0gICAgICAgICAgInByb3RvYyBpcyBub3QgaW5zdGFsbGVkIG5vciBmb3VuZCBpbiAuLi9zcmMuICBQbGVhc2UgY29tcGlsZSBpdCAiCi0gICAgICAgICAgIm9yIGluc3RhbGwgdGhlIGJpbmFyeSBwYWNrYWdlLlxuIikKLSAgICAgIHN5cy5leGl0KC0xKQotCi0gICAgcHJvdG9jX2NvbW1hbmQgPSBbIHByb3RvYywgIi1JLi4vc3JjIiwgIi1JLiIsICItLXB5dGhvbl9vdXQ9LiIsIHNvdXJjZSBdCi0gICAgaWYgc3VicHJvY2Vzcy5jYWxsKHByb3RvY19jb21tYW5kKSAhPSAwOgotICAgICAgc3lzLmV4aXQoLTEpCi0KLWRlZiBNYWtlVGVzdFN1aXRlKCk6Ci0gICMgVGhpcyBpcyBhcHBhcmVudGx5IG5lZWRlZCBvbiBzb21lIHN5c3RlbXMgdG8gbWFrZSBzdXJlIHRoYXQgdGhlIHRlc3RzCi0gICMgd29yayBldmVuIGlmIGEgcHJldmlvdXMgdmVyc2lvbiBpcyBhbHJlYWR5IGluc3RhbGxlZC4KLSAgaWYgJ2dvb2dsZScgaW4gc3lzLm1vZHVsZXM6Ci0gICAgZGVsIHN5cy5tb2R1bGVzWydnb29nbGUnXQotCi0gIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIikKLSAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iKQotICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8iKQotICBnZW5lcmF0ZV9wcm90bygiLi4vc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvIikKLSAgZ2VuZXJhdGVfcHJvdG8oIi4uL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90byIpCi0gIGdlbmVyYXRlX3Byb3RvKCJnb29nbGUvcHJvdG9idWYvaW50ZXJuYWwvbW9yZV9leHRlbnNpb25zLnByb3RvIikKLSAgZ2VuZXJhdGVfcHJvdG8oImdvb2dsZS9wcm90b2J1Zi9pbnRlcm5hbC9tb3JlX21lc3NhZ2VzLnByb3RvIikKLQotICBpbXBvcnQgdW5pdHRlc3QKLSAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5nZW5lcmF0b3JfdGVzdCAgICAgYXMgZ2VuZXJhdG9yX3Rlc3QKLSAgaW1wb3J0IGdvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5kZXNjcmlwdG9yX3Rlc3QgICAgYXMgZGVzY3JpcHRvcl90ZXN0Ci0gIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwucmVmbGVjdGlvbl90ZXN0ICAgIGFzIHJlZmxlY3Rpb25fdGVzdAotICBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLnNlcnZpY2VfcmVmbGVjdGlvbl90ZXN0IFwKLSAgICBhcyBzZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdAotICBpbXBvcnQgZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLnRleHRfZm9ybWF0X3Rlc3QgICBhcyB0ZXh0X2Zvcm1hdF90ZXN0Ci0gIGltcG9ydCBnb29nbGUucHJvdG9idWYuaW50ZXJuYWwud2lyZV9mb3JtYXRfdGVzdCAgIGFzIHdpcmVfZm9ybWF0X3Rlc3QKLQotICBsb2FkZXIgPSB1bml0dGVzdC5kZWZhdWx0VGVzdExvYWRlcgotICBzdWl0ZSA9IHVuaXR0ZXN0LlRlc3RTdWl0ZSgpCi0gIGZvciB0ZXN0IGluIFsgZ2VuZXJhdG9yX3Rlc3QsCi0gICAgICAgICAgICAgICAgZGVzY3JpcHRvcl90ZXN0LAotICAgICAgICAgICAgICAgIHJlZmxlY3Rpb25fdGVzdCwKLSAgICAgICAgICAgICAgICBzZXJ2aWNlX3JlZmxlY3Rpb25fdGVzdCwKLSAgICAgICAgICAgICAgICB0ZXh0X2Zvcm1hdF90ZXN0LAotICAgICAgICAgICAgICAgIHdpcmVfZm9ybWF0X3Rlc3QgXToKLSAgICBzdWl0ZS5hZGRUZXN0KGxvYWRlci5sb2FkVGVzdHNGcm9tTW9kdWxlKHRlc3QpKQotCi0gIHJldHVybiBzdWl0ZQotCi1pZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgotICAjIFRPRE8oa2VudG9uKTogIEludGVncmF0ZSB0aGlzIGludG8gc2V0dXB0b29scyBzb21laG93PwotICBpZiBsZW4oc3lzLmFyZ3YpID49IDIgYW5kIHN5cy5hcmd2WzFdID09ICJjbGVhbiI6Ci0gICAgIyBEZWxldGUgZ2VuZXJhdGVkIF9wYjIucHkgZmlsZXMgYW5kIC5weWMgZmlsZXMgaW4gdGhlIGNvZGUgdHJlZS4KLSAgICBmb3IgKGRpcnBhdGgsIGRpcm5hbWVzLCBmaWxlbmFtZXMpIGluIG9zLndhbGsoIi4iKToKLSAgICAgIGZvciBmaWxlbmFtZSBpbiBmaWxlbmFtZXM6Ci0gICAgICAgIGZpbGVwYXRoID0gb3MucGF0aC5qb2luKGRpcnBhdGgsIGZpbGVuYW1lKQotICAgICAgICBpZiBmaWxlcGF0aC5lbmRzd2l0aCgiX3BiMi5weSIpIG9yIGZpbGVwYXRoLmVuZHN3aXRoKCIucHljIikgb3IgXAotICAgICAgICAgIGZpbGVwYXRoLmVuZHN3aXRoKCIuc28iKSBvciBmaWxlcGF0aC5lbmRzd2l0aCgiLm8iKToKLSAgICAgICAgICBvcy5yZW1vdmUoZmlsZXBhdGgpCi0gIGVsc2U6Ci0gICAgIyBHZW5lcmF0ZSBuZWNlc3NhcnkgLnByb3RvIGZpbGUgaWYgaXQgZG9lc24ndCBleGlzdC4KLSAgICAjIFRPRE8oa2VudG9uKTogIE1heWJlIHdlIHNob3VsZCBob29rIHRoaXMgaW50byBhIGRpc3R1dGlscyBjb21tYW5kPwotICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKQotICAgIGdlbmVyYXRlX3Byb3RvKCIuLi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90byIpCi0KLSAgZXh0X21vZHVsZV9saXN0ID0gW10KLQotICAjIEMrKyBpbXBsZW1lbnRhdGlvbiBleHRlbnNpb24KLSAgaWYgb3MuZ2V0ZW52KCJQUk9UT0NPTF9CVUZGRVJTX1BZVEhPTl9JTVBMRU1FTlRBVElPTiIsICJweXRob24iKSA9PSAiY3BwIjoKLSAgICBwcmludCAiVXNpbmcgRVhQRVJJTUVOVEFMIEMrKyBJbXBsbWVuZXRhdGlvbi4iCi0gICAgZXh0X21vZHVsZV9saXN0LmFwcGVuZChFeHRlbnNpb24oCi0gICAgICAgICJnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuX25ldF9wcm90bzJfX19weXRob24iLAotICAgICAgICBbICJnb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX2Rlc2NyaXB0b3IuY2MiLAotICAgICAgICAgICJnb29nbGUvcHJvdG9idWYvcHlleHQvcHl0aG9uX3Byb3RvYnVmLmNjIiwKLSAgICAgICAgICAiZ29vZ2xlL3Byb3RvYnVmL3B5ZXh0L3B5dGhvbi1wcm90bzIuY2MiIF0sCi0gICAgICAgIGluY2x1ZGVfZGlycyA9IFsgIi4iIF0sCi0gICAgICAgIGxpYnJhcmllcyA9IFsgInByb3RvYnVmIiBdKSkKLQotICBzZXR1cChuYW1lID0gJ3Byb3RvYnVmJywKLSAgICAgICAgdmVyc2lvbiA9ICcyLjQuMi1wcmUnLAotICAgICAgICBwYWNrYWdlcyA9IFsgJ2dvb2dsZScgXSwKLSAgICAgICAgbmFtZXNwYWNlX3BhY2thZ2VzID0gWyAnZ29vZ2xlJyBdLAotICAgICAgICB0ZXN0X3N1aXRlID0gJ3NldHVwLk1ha2VUZXN0U3VpdGUnLAotICAgICAgICAjIE11c3QgbGlzdCBtb2R1bGVzIGV4cGxpY2l0bHkgc28gdGhhdCB3ZSBkb24ndCBpbnN0YWxsIHRlc3RzLgotICAgICAgICBweV9tb2R1bGVzID0gWwotICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuYXBpX2ltcGxlbWVudGF0aW9uJywKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLmNvbnRhaW5lcnMnLAotICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuY3BwX21lc3NhZ2UnLAotICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwuZGVjb2RlcicsCi0gICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC5lbmNvZGVyJywKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmludGVybmFsLm1lc3NhZ2VfbGlzdGVuZXInLAotICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwucHl0aG9uX21lc3NhZ2UnLAotICAgICAgICAgICdnb29nbGUucHJvdG9idWYuaW50ZXJuYWwudHlwZV9jaGVja2VycycsCi0gICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5pbnRlcm5hbC53aXJlX2Zvcm1hdCcsCi0gICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5kZXNjcmlwdG9yJywKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmRlc2NyaXB0b3JfcGIyJywKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLnBsdWdpbl9wYjInLAotICAgICAgICAgICdnb29nbGUucHJvdG9idWYubWVzc2FnZScsCi0gICAgICAgICAgJ2dvb2dsZS5wcm90b2J1Zi5yZWZsZWN0aW9uJywKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnNlcnZpY2UnLAotICAgICAgICAgICdnb29nbGUucHJvdG9idWYuc2VydmljZV9yZWZsZWN0aW9uJywKLSAgICAgICAgICAnZ29vZ2xlLnByb3RvYnVmLnRleHRfZm9ybWF0JyBdLAotICAgICAgICBleHRfbW9kdWxlcyA9IGV4dF9tb2R1bGVfbGlzdCwKLSAgICAgICAgdXJsID0gJ2h0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8nLAotICAgICAgICBtYWludGFpbmVyID0gbWFpbnRhaW5lcl9lbWFpbCwKLSAgICAgICAgbWFpbnRhaW5lcl9lbWFpbCA9ICdwcm90b2J1ZkBnb29nbGVncm91cHMuY29tJywKLSAgICAgICAgbGljZW5zZSA9ICdOZXcgQlNEIExpY2Vuc2UnLAotICAgICAgICBkZXNjcmlwdGlvbiA9ICdQcm90b2NvbCBCdWZmZXJzJywKLSAgICAgICAgbG9uZ19kZXNjcmlwdGlvbiA9Ci0gICAgICAgICAgIlByb3RvY29sIEJ1ZmZlcnMgYXJlIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0LiIsCi0gICAgICAgICkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vc3R1Ym91dC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9weXRob24vc3R1Ym91dC5weQpkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggYWVlNGYyZC4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvcHl0aG9uL3N0dWJvdXQucHkKKysrIC9kZXYvbnVsbApAQCAtMSwxNDAgKzAsMCBAQAotIyEvdXNyL2Jpbi9weXRob24yLjQKLSMKLSMgQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4KLSMKLSMgTGljZW5zZWQgdW5kZXIgdGhlIEFwYWNoZSBMaWNlbnNlLCBWZXJzaW9uIDIuMCAodGhlICJMaWNlbnNlIik7Ci0jIHlvdSBtYXkgbm90IHVzZSB0aGlzIGZpbGUgZXhjZXB0IGluIGNvbXBsaWFuY2Ugd2l0aCB0aGUgTGljZW5zZS4KLSMgWW91IG1heSBvYnRhaW4gYSBjb3B5IG9mIHRoZSBMaWNlbnNlIGF0Ci0jCi0jICAgICAgaHR0cDovL3d3dy5hcGFjaGUub3JnL2xpY2Vuc2VzL0xJQ0VOU0UtMi4wCi0jCi0jIFVubGVzcyByZXF1aXJlZCBieSBhcHBsaWNhYmxlIGxhdyBvciBhZ3JlZWQgdG8gaW4gd3JpdGluZywgc29mdHdhcmUKLSMgZGlzdHJpYnV0ZWQgdW5kZXIgdGhlIExpY2Vuc2UgaXMgZGlzdHJpYnV0ZWQgb24gYW4gIkFTIElTIiBCQVNJUywKLSMgV0lUSE9VVCBXQVJSQU5USUVTIE9SIENPTkRJVElPTlMgT0YgQU5ZIEtJTkQsIGVpdGhlciBleHByZXNzIG9yIGltcGxpZWQuCi0jIFNlZSB0aGUgTGljZW5zZSBmb3IgdGhlIHNwZWNpZmljIGxhbmd1YWdlIGdvdmVybmluZyBwZXJtaXNzaW9ucyBhbmQKLSMgbGltaXRhdGlvbnMgdW5kZXIgdGhlIExpY2Vuc2UuCi0KLSMgVGhpcyBmaWxlIGlzIHVzZWQgZm9yIHRlc3RpbmcuICBUaGUgb3JpZ2luYWwgaXMgYXQ6Ci0jICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3B5bW94LwotCi1jbGFzcyBTdHViT3V0Rm9yVGVzdGluZzoKLSAgIiIiU2FtcGxlIFVzYWdlOgotICAgICBZb3Ugd2FudCBvcy5wYXRoLmV4aXN0cygpIHRvIGFsd2F5cyByZXR1cm4gdHJ1ZSBkdXJpbmcgdGVzdGluZy4KLQotICAgICBzdHVicyA9IFN0dWJPdXRGb3JUZXN0aW5nKCkKLSAgICAgc3R1YnMuU2V0KG9zLnBhdGgsICdleGlzdHMnLCBsYW1iZGEgeDogMSkKLSAgICAgICAuLi4KLSAgICAgc3R1YnMuVW5zZXRBbGwoKQotCi0gICAgIFRoZSBhYm92ZSBjaGFuZ2VzIG9zLnBhdGguZXhpc3RzIGludG8gYSBsYW1iZGEgdGhhdCByZXR1cm5zIDEuICBPbmNlCi0gICAgIHRoZSAuLi4gcGFydCBvZiB0aGUgY29kZSBmaW5pc2hlcywgdGhlIFVuc2V0QWxsKCkgbG9va3MgdXAgdGhlIG9sZCB2YWx1ZQotICAgICBvZiBvcy5wYXRoLmV4aXN0cyBhbmQgcmVzdG9yZXMgaXQuCi0KLSAgIiIiCi0gIGRlZiBfX2luaXRfXyhzZWxmKToKLSAgICBzZWxmLmNhY2hlID0gW10KLSAgICBzZWxmLnN0dWJzID0gW10KLQotICBkZWYgX19kZWxfXyhzZWxmKToKLSAgICBzZWxmLlNtYXJ0VW5zZXRBbGwoKQotICAgIHNlbGYuVW5zZXRBbGwoKQotCi0gIGRlZiBTbWFydFNldChzZWxmLCBvYmosIGF0dHJfbmFtZSwgbmV3X2F0dHIpOgotICAgICIiIlJlcGxhY2Ugb2JqLmF0dHJfbmFtZSB3aXRoIG5ld19hdHRyLiBUaGlzIG1ldGhvZCBpcyBzbWFydCBhbmQgd29ya3MKLSAgICAgICBhdCB0aGUgbW9kdWxlLCBjbGFzcywgYW5kIGluc3RhbmNlIGxldmVsIHdoaWxlIHByZXNlcnZpbmcgcHJvcGVyCi0gICAgICAgaW5oZXJpdGFuY2UuIEl0IHdpbGwgbm90IHN0dWIgb3V0IEMgdHlwZXMgaG93ZXZlciB1bmxlc3MgdGhhdCBoYXMgYmVlbgotICAgICAgIGV4cGxpY2l0bHkgYWxsb3dlZCBieSB0aGUgdHlwZS4KLQotICAgICAgIFRoaXMgbWV0aG9kIHN1cHBvcnRzIHRoZSBjYXNlIHdoZXJlIGF0dHJfbmFtZSBpcyBhIHN0YXRpY21ldGhvZCBvciBhCi0gICAgICAgY2xhc3NtZXRob2Qgb2Ygb2JqLgotCi0gICAgICAgTm90ZXM6Ci0gICAgICAtIElmIG9iaiBpcyBhbiBpbnN0YW5jZSwgdGhlbiBpdCBpcyBpdHMgY2xhc3MgdGhhdCB3aWxsIGFjdHVhbGx5IGJlCi0gICAgICAgIHN0dWJiZWQuIE5vdGUgdGhhdCB0aGUgbWV0aG9kIFNldCgpIGRvZXMgbm90IGRvIHRoYXQ6IGlmIG9iaiBpcwotICAgICAgICBhbiBpbnN0YW5jZSwgaXQgKGFuZCBub3QgaXRzIGNsYXNzKSB3aWxsIGJlIHN0dWJiZWQuCi0gICAgICAtIFRoZSBzdHViYmluZyBpcyB1c2luZyB0aGUgYnVpbHRpbiBnZXRhdHRyIGFuZCBzZXRhdHRyLiBTbywgdGhlIF9fZ2V0X18KLSAgICAgICAgYW5kIF9fc2V0X18gd2lsbCBiZSBjYWxsZWQgd2hlbiBzdHViYmluZyAoVE9ETzogQSBiZXR0ZXIgaWRlYSB3b3VsZAotICAgICAgICBwcm9iYWJseSBiZSB0byBtYW5pcHVsYXRlIG9iai5fX2RpY3RfXyBpbnN0ZWFkIG9mIGdldGF0dHIoKSBhbmQKLSAgICAgICAgc2V0YXR0cigpKS4KLQotICAgICAgIFJhaXNlcyBBdHRyaWJ1dGVFcnJvciBpZiB0aGUgYXR0cmlidXRlIGNhbm5vdCBiZSBmb3VuZC4KLSAgICAiIiIKLSAgICBpZiAoaW5zcGVjdC5pc21vZHVsZShvYmopIG9yCi0gICAgICAgIChub3QgaW5zcGVjdC5pc2NsYXNzKG9iaikgYW5kIG9iai5fX2RpY3RfXy5oYXNfa2V5KGF0dHJfbmFtZSkpKToKLSAgICAgIG9yaWdfb2JqID0gb2JqCi0gICAgICBvcmlnX2F0dHIgPSBnZXRhdHRyKG9iaiwgYXR0cl9uYW1lKQotCi0gICAgZWxzZToKLSAgICAgIGlmIG5vdCBpbnNwZWN0LmlzY2xhc3Mob2JqKToKLSAgICAgICAgbXJvID0gbGlzdChpbnNwZWN0LmdldG1ybyhvYmouX19jbGFzc19fKSkKLSAgICAgIGVsc2U6Ci0gICAgICAgIG1ybyA9IGxpc3QoaW5zcGVjdC5nZXRtcm8ob2JqKSkKLQotICAgICAgbXJvLnJldmVyc2UoKQotCi0gICAgICBvcmlnX2F0dHIgPSBOb25lCi0KLSAgICAgIGZvciBjbHMgaW4gbXJvOgotICAgICAgICB0cnk6Ci0gICAgICAgICAgb3JpZ19vYmogPSBjbHMKLSAgICAgICAgICBvcmlnX2F0dHIgPSBnZXRhdHRyKG9iaiwgYXR0cl9uYW1lKQotICAgICAgICBleGNlcHQgQXR0cmlidXRlRXJyb3I6Ci0gICAgICAgICAgY29udGludWUKLQotICAgIGlmIG9yaWdfYXR0ciBpcyBOb25lOgotICAgICAgcmFpc2UgQXR0cmlidXRlRXJyb3IoIkF0dHJpYnV0ZSBub3QgZm91bmQuIikKLQotICAgICMgQ2FsbGluZyBnZXRhdHRyKCkgb24gYSBzdGF0aWNtZXRob2QgdHJhbnNmb3JtcyBpdCB0byBhICdub3JtYWwnIGZ1bmN0aW9uLgotICAgICMgV2UgbmVlZCB0byBlbnN1cmUgdGhhdCB3ZSBwdXQgaXQgYmFjayBhcyBhIHN0YXRpY21ldGhvZC4KLSAgICBvbGRfYXR0cmlidXRlID0gb2JqLl9fZGljdF9fLmdldChhdHRyX25hbWUpCi0gICAgaWYgb2xkX2F0dHJpYnV0ZSBpcyBub3QgTm9uZSBhbmQgaXNpbnN0YW5jZShvbGRfYXR0cmlidXRlLCBzdGF0aWNtZXRob2QpOgotICAgICAgb3JpZ19hdHRyID0gc3RhdGljbWV0aG9kKG9yaWdfYXR0cikKLQotICAgIHNlbGYuc3R1YnMuYXBwZW5kKChvcmlnX29iaiwgYXR0cl9uYW1lLCBvcmlnX2F0dHIpKQotICAgIHNldGF0dHIob3JpZ19vYmosIGF0dHJfbmFtZSwgbmV3X2F0dHIpCi0KLSAgZGVmIFNtYXJ0VW5zZXRBbGwoc2VsZik6Ci0gICAgIiIiUmV2ZXJzZXMgYWxsIHRoZSBTbWFydFNldCgpIGNhbGxzLCByZXN0b3JpbmcgdGhpbmdzIHRvIHRoZWlyIG9yaWdpbmFsCi0gICAgZGVmaW5pdGlvbi4gIEl0cyBva2F5IHRvIGNhbGwgU21hcnRVbnNldEFsbCgpIHJlcGVhdGVkbHksIGFzIGxhdGVyIGNhbGxzCi0gICAgaGF2ZSBubyBlZmZlY3QgaWYgbm8gU21hcnRTZXQoKSBjYWxscyBoYXZlIGJlZW4gbWFkZS4KLQotICAgICIiIgotICAgIHNlbGYuc3R1YnMucmV2ZXJzZSgpCi0KLSAgICBmb3IgYXJncyBpbiBzZWxmLnN0dWJzOgotICAgICAgc2V0YXR0cigqYXJncykKLQotICAgIHNlbGYuc3R1YnMgPSBbXQotCi0gIGRlZiBTZXQoc2VsZiwgcGFyZW50LCBjaGlsZF9uYW1lLCBuZXdfY2hpbGQpOgotICAgICIiIlJlcGxhY2UgY2hpbGRfbmFtZSdzIG9sZCBkZWZpbml0aW9uIHdpdGggbmV3X2NoaWxkLCBpbiB0aGUgY29udGV4dAotICAgIG9mIHRoZSBnaXZlbiBwYXJlbnQuICBUaGUgcGFyZW50IGNvdWxkIGJlIGEgbW9kdWxlIHdoZW4gdGhlIGNoaWxkIGlzIGEKLSAgICBmdW5jdGlvbiBhdCBtb2R1bGUgc2NvcGUuICBPciB0aGUgcGFyZW50IGNvdWxkIGJlIGEgY2xhc3Mgd2hlbiBhIGNsYXNzJwotICAgIG1ldGhvZCBpcyBiZWluZyByZXBsYWNlZC4gIFRoZSBuYW1lZCBjaGlsZCBpcyBzZXQgdG8gbmV3X2NoaWxkLCB3aGlsZQotICAgIHRoZSBwcmlvciBkZWZpbml0aW9uIGlzIHNhdmVkIGF3YXkgZm9yIGxhdGVyLCB3aGVuIFVuc2V0QWxsKCkgaXMgY2FsbGVkLgotCi0gICAgVGhpcyBtZXRob2Qgc3VwcG9ydHMgdGhlIGNhc2Ugd2hlcmUgY2hpbGRfbmFtZSBpcyBhIHN0YXRpY21ldGhvZCBvciBhCi0gICAgY2xhc3NtZXRob2Qgb2YgcGFyZW50LgotICAgICIiIgotICAgIG9sZF9jaGlsZCA9IGdldGF0dHIocGFyZW50LCBjaGlsZF9uYW1lKQotCi0gICAgb2xkX2F0dHJpYnV0ZSA9IHBhcmVudC5fX2RpY3RfXy5nZXQoY2hpbGRfbmFtZSkKLSAgICBpZiBvbGRfYXR0cmlidXRlIGlzIG5vdCBOb25lIGFuZCBpc2luc3RhbmNlKG9sZF9hdHRyaWJ1dGUsIHN0YXRpY21ldGhvZCk6Ci0gICAgICBvbGRfY2hpbGQgPSBzdGF0aWNtZXRob2Qob2xkX2NoaWxkKQotCi0gICAgc2VsZi5jYWNoZS5hcHBlbmQoKHBhcmVudCwgb2xkX2NoaWxkLCBjaGlsZF9uYW1lKSkKLSAgICBzZXRhdHRyKHBhcmVudCwgY2hpbGRfbmFtZSwgbmV3X2NoaWxkKQotCi0gIGRlZiBVbnNldEFsbChzZWxmKToKLSAgICAiIiJSZXZlcnNlcyBhbGwgdGhlIFNldCgpIGNhbGxzLCByZXN0b3JpbmcgdGhpbmdzIHRvIHRoZWlyIG9yaWdpbmFsCi0gICAgZGVmaW5pdGlvbi4gIEl0cyBva2F5IHRvIGNhbGwgVW5zZXRBbGwoKSByZXBlYXRlZGx5LCBhcyBsYXRlciBjYWxscyBoYXZlCi0gICAgbm8gZWZmZWN0IGlmIG5vIFNldCgpIGNhbGxzIGhhdmUgYmVlbiBtYWRlLgotCi0gICAgIiIiCi0gICAgIyBVbmRvIGNhbGxzIHRvIFNldCgpIGluIHJldmVyc2Ugb3JkZXIsIGluIGNhc2UgU2V0KCkgd2FzIGNhbGxlZCBvbiB0aGUKLSAgICAjIHNhbWUgYXJndW1lbnRzIHJlcGVhdGVkbHkgKHdhbnQgdGhlIG9yaWdpbmFsIGNhbGwgdG8gYmUgbGFzdCBvbmUgdW5kb25lKQotICAgIHNlbGYuY2FjaGUucmV2ZXJzZSgpCi0KLSAgICBmb3IgKHBhcmVudCwgb2xkX2NoaWxkLCBjaGlsZF9uYW1lKSBpbiBzZWxmLmNhY2hlOgotICAgICAgc2V0YXR0cihwYXJlbnQsIGNoaWxkX25hbWUsIG9sZF9jaGlsZCkKLSAgICBzZWxmLmNhY2hlID0gW10KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NpeC5CVUlMRCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zaXguQlVJTEQKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NpeC5CVUlMRApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NpeC5CVUlMRApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9NYWtlZmlsZS5hbSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvTWFrZWZpbGUuYW0KaW5kZXggZGI5ZTdhZi4uODAwNjU1MCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9NYWtlZmlsZS5hbQorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL01ha2VmaWxlLmFtCkBAIC00LDE3ICs0LDI1IEBACiBHWkNIRUNLUFJPR1JBTVMgPSB6Y2d6aXAgemNndW56aXAKIEdaSEVBREVSUyA9IGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCiBHWlRFU1RTID0gZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtX3VuaXR0ZXN0LnNoCitaTElCX0RFRiA9IC1ESEFWRV9aTElCPTEKIGVsc2UKIEdaQ0hFQ0tQUk9HUkFNUyA9CiBHWkhFQURFUlMgPQogR1pURVNUUyA9CitaTElCX0RFRiA9CitlbmRpZgorCitpZiBIQVZFX1BUSFJFQUQKK1BUSFJFQURfREVGID0gLURIQVZFX1BUSFJFQUQ9MQorZWxzZQorUFRIUkVBRF9ERUYgPQogZW5kaWYKIAogaWYgR0NDCiAjIFRoZXNlIGFyZSBnb29kIHdhcm5pbmdzIHRvIHR1cm4gb24gYnkgZGVmYXVsdAotTk9fT1BUX0NYWEZMQUdTID0gJChQVEhSRUFEX0NGTEFHUykgLVdhbGwgLVd3cml0ZS1zdHJpbmdzIC1Xb3ZlcmxvYWRlZC12aXJ0dWFsIC1Xbm8tc2lnbi1jb21wYXJlCitOT19PUFRfQ1hYRkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKSAkKFBUSFJFQURfREVGKSAkKFpMSUJfREVGKSAtV2FsbCAtV3dyaXRlLXN0cmluZ3MgLVdvdmVybG9hZGVkLXZpcnR1YWwgLVduby1zaWduLWNvbXBhcmUKIGVsc2UKLU5PX09QVF9DWFhGTEFHUyA9ICQoUFRIUkVBRF9DRkxBR1MpCitOT19PUFRfQ1hYRkxBR1MgPSAkKFBUSFJFQURfQ0ZMQUdTKSAkKFBUSFJFQURfREVGKSAkKFpMSUJfREVGKQogZW5kaWYKIAogQU1fQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykgJChQUk9UT0JVRl9PUFRfRkxBRykKQEAgLTI0LDcgKzMyLDE3IEBACiAjIElmIEkgc2F5ICJkaXN0X2luY2x1ZGVfREFUQSIsIGF1dG9tYWtlIGNvbXBsYWlucyB0aGF0ICQoaW5jbHVkZWRpcikgaXMgbm90CiAjIGEgImxlZ2l0aW1hdGUiIGRpcmVjdG9yeSBmb3IgREFUQS4gIFNjcmV3IHlvdSwgYXV0b21ha2UuCiBwcm90b2RpciA9ICQoaW5jbHVkZWRpcikKLW5vYmFzZV9kaXN0X3Byb3RvX0RBVEEgPSBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byBcCitub2Jhc2VfZGlzdF9wcm90b19EQVRBID0gZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvYW55LnByb3RvICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8gICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucHJvdG8gICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8gICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KIAogIyBOb3Qgc3VyZSB3aHkgdGhlc2UgZG9uJ3QgZ2V0IGNsZWFuZWQgYXV0b21hdGljYWxseS4KQEAgLTM3LDYxICs1NSwxNTAgQEAKIE1BSU5UQUlORVJDTEVBTkZJTEVTID0gICBcCiAgIE1ha2VmaWxlLmluCiAKLW5vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmggICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWlwc19nY2MuaCAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmggICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgJChHWkhFQURFUlMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmgKK25vYmFzZV9pbmNsdWRlX0hFQURFUlMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNfc2VxdWVuY2VfbnVtLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG93ZXIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybTY0X2djYy5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fZ2NjLmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmggXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19nZW5lcmljX2djYy5oICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wbmFjbC5oICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfc29sYXJpcy5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3RzYW4uaCAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmggICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaCAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYWxsYmFjay5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvZmFzdG1lbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zY29wZWRfcHRyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NpbmdsZXRvbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcGkucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvYW55LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV9yZWZsZWN0aW9uLmggICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXAuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX3R5cGVfaGFuZGxlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb24uaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICQoR1pIRUFERVJTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX25hbWVzLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lcy5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19nZW5lcmF0b3IuaCAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuaCAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaCAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaAogCiBsaWJfTFRMSUJSQVJJRVMgPSBsaWJwcm90b2J1Zi1saXRlLmxhIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQogCiBsaWJwcm90b2J1Zl9saXRlX2xhX0xJQkFERCA9ICQoUFRIUkVBRF9MSUJTKQotbGlicHJvdG9idWZfbGl0ZV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyA3OjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAorbGlicHJvdG9idWZfbGl0ZV9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAxMDowOjAgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKIGxpYnByb3RvYnVmX2xpdGVfbGFfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGh1dGlsLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c19tYWNyb3MuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmggICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEwMywzNSArMjEwLDkxIEBACiAgIGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYwogCiBsaWJwcm90b2J1Zl9sYV9MSUJBREQgPSAkKFBUSFJFQURfTElCUykKLWxpYnByb3RvYnVmX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvIDc6MDowIC1leHBvcnQtZHluYW1pYyAtbm8tdW5kZWZpbmVkCitsaWJwcm90b2J1Zl9sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyAxMDowOjAgLWV4cG9ydC1keW5hbWljIC1uby11bmRlZmluZWQKIGxpYnByb3RvYnVmX2xhX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgJChsaWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25faW50ZXJuYWwuaCAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYyAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYworICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yLmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5jYyAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5oICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9leHBlY3Rpbmdfb2JqZWN0d3JpdGVyLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX2VzY2FwaW5nLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9sb2NhdGlvbl90cmFja2VyLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9tb2NrX2Vycm9yX2xpc3RlbmVyLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3RfbG9jYXRpb25fdHJhY2tlci5oICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfc291cmNlLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuY2MgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuaCAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuY2MgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaCAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuaCAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9zdHJ1Y3R1cmVkX29iamVjdHdyaXRlci5oICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uY2MgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuaCAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuY2MKKworbm9kaXN0X2xpYnByb3RvYnVmX2xhX1NPVVJDRVMgPSAkKG5vZGlzdF9saWJwcm90b2J1Zl9saXRlX2xhX1NPVVJDRVMpCiAKIGxpYnByb3RvY19sYV9MSUJBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEKLWxpYnByb3RvY19sYV9MREZMQUdTID0gLXZlcnNpb24taW5mbyA3OjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAorbGlicHJvdG9jX2xhX0xERkxBR1MgPSAtdmVyc2lvbi1pbmZvIDEwOjA6MCAtZXhwb3J0LWR5bmFtaWMgLW5vLXVuZGVmaW5lZAogbGlicHJvdG9jX2xhX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MgICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyAgICAgICAgICAgXApAQCAtMTU0LDQwICszMTcsMTU5IEBACiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuY2MgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5oICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaCAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5jYyAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5oICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuaCAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5jYyAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5oICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYyAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9saXRlLmNjICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYyAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZF9saXRlLmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZF9saXRlLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9saXRlLmggICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uX2xpdGUuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uX2xpdGUuaCAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaCAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5jYyAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5oICAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuY2MgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuaCAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkLmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkLmggICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkX2xpdGUuY2NcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkX2xpdGUuaCBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuaCAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5jYyAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9saXRlLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyLmNjICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuY2MgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYyAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmggICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9saXRlLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuaCAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5jYyAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmggICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkX2xpdGUuY2MgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkX2xpdGUuaCAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmNjICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmggICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYyAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmNjICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmggICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYworICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmNjICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5jYyAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5oICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmllbGQuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmllbGQuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5jYyAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5oICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWFwX2ZpZWxkLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWFwX2ZpZWxkLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZS5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZS5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZV9maWVsZC5jYyAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZV9maWVsZC5oICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcGFyYW1zLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcHJpbWl0aXZlX2ZpZWxkLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX3ByaW1pdGl2ZV9maWVsZC5oIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmNjICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmggICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmggIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uY2MgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uaCAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5jYyAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmNjICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmggICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuY2MgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmNjICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmggICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuY2MgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuaCAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmNjICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmggICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX29uZW9mLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5oICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmNjICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmggICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmNjICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9maWVsZF9iYXNlLmggICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3IuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9oZWxwZXJzLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tYXBfZmllbGQuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tYXBfZmllbGQuaCAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmNjICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmggICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmggICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuY2MgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuaCAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlZmxlY3Rpb25fY2xhc3MuaCAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuaCBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmggXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuY2MgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuaCBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5oIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5jYyAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5oCiAKIGJpbl9QUk9HUkFNUyA9IHByb3RvYwogcHJvdG9jX0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYQpAQCAtMTk1LDE5ICs0NzcsNTEgQEAKIAogIyBUZXN0cyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1wcm90b2NfaW5wdXRzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8gICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8gICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90byAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvCitwcm90b2NfaW5wdXRzID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnByb3RvICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8gICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfbGl0ZS5wcm90byAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8gICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljX2xpdGUucHJvdG8gICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90byAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9pbXBvcnQucHJvdG8gICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYS5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wcm90byAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8gICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnByb3RvICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucHJvdG8gICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucHJvdG8gICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wcm90byAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnByb3RvICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfd2VsbF9rbm93bl90eXBlcy5wcm90byAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnByb3RvICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wcm90byAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnByb3RvICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucHJvdG8gXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnByb3RvICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9tYXBzLnByb3RvICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9vbmVvZnMucHJvdG8gICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9zdHJ1Y3QucHJvdG8gICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS90aW1lc3RhbXBfZHVyYXRpb24ucHJvdG8gXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucHJvdG8gICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnByb3RvICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2xhcmdlX2VudW1fdmFsdWUucHJvdG8KIAogRVhUUkFfRElTVCA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAkKHByb3RvY19pbnB1dHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMjE1LDQzICs1MjksMTE2IEBACiAgIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaCAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9vbmVvZl9pbXBsZW1lbnRlZCAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9wcm90bzMgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fcGFja2VkX2ZpZWxkc19tZXNzYWdlICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9iYWRfdXRmOF9zdHJpbmcgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9tYXBfdGVzdF9kYXRhLnR4dCAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0ICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHkudHh0ICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5X29uZW9mLnR4dCAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0ICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhX3BvaW50eS50eHQgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZS5wcm90byAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZS5yYiAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhY2thZ2VfaW5mby5oICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2ggICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8KKyAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKIAogcHJvdG9jX2xpdGVfb3V0cHV0cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuY2MgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuaAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucGIuaCAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmNjICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnBiLmgKIAotcHJvdG9jX291dHB1dHMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAkKHByb3RvY19saXRlX291dHB1dHMpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1wdHkucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmNjICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmggICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmNjICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnBiLmggICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuY2MgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaCAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuY2MgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucGIuaCAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5jYyAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wYi5oICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5jYyAgXAotICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wYi5oCitwcm90b2Nfb3V0cHV0cyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICQocHJvdG9jX2xpdGVfb3V0cHV0cykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmNjICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmggICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5jYyAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wYi5oICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wYi5oICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnBiLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnBiLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucGIuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmNjICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnBiLmggICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5jYyAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wYi5oICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmggICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmNjICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmggICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9pbXBvcnQucGIuY2MgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9pbXBvcnQucGIuaCAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYS5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYS5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19maWVsZF9wcmVzZW5jZS5wYi5oICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmNjICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnBiLmggICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucGIuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmNjICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0yLnBiLmggICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuY2MgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucGIuaCAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuaCAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmFfbGl0ZS5wYi5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnBiLmggICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucGIuY2MgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfbGl0ZS5wYi5oICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuY2MgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucGIuaCAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYW55cy5wYi5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucGIuaCAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5jYyAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZS5wYi5oICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZGVmYXVsdF92YWx1ZV90ZXN0LnBiLmggIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wYi5oICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5jYyAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wYi5oICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnBiLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmNjICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnBiLmggICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnBiLmggIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmNjICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl9mb3JtYXRfcHJvdG8zLnBiLmggICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wYi5oCiAKIEJVSUxUX1NPVVJDRVMgPSAkKHByb3RvY19vdXRwdXRzKQogCkBAIC0yNzUsNiArNjYyLDExIEBACiAkKHByb3RvY19vdXRwdXRzKTogdW5pdHRlc3RfcHJvdG9fbWlkZGxlbWFuCiAKIENPTU1PTl9URVNUX1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWxfaW1wbC5oICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTI4MywzMSArNjc1LDU1IEBACiAgIGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaAogCiBjaGVja19QUk9HUkFNUyA9IHByb3RvYyBwcm90b2J1Zi10ZXN0IHByb3RvYnVmLWxhenktZGVzY3JpcHRvci10ZXN0IFwKLSAgICAgICAgICAgICAgICAgcHJvdG9idWYtbGl0ZS10ZXN0IHRlc3RfcGx1Z2luICQoR1pDSEVDS1BST0dSQU1TKQorICAgICAgICAgICAgICAgICBwcm90b2J1Zi1saXRlLXRlc3QgdGVzdF9wbHVnaW4gcHJvdG9idWYtbGl0ZS1hcmVuYS10ZXN0IFwKKyAgICAgICAgICAgICAgICAgJChHWkNIRUNLUFJPR1JBTVMpCiBwcm90b2J1Zl90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLmxhIGxpYnByb3RvYy5sYSBcCi0gICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdC5sYSAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdF9tYWluLmxhCi1wcm90b2J1Zl90ZXN0X0NQUEZMQUdTID0gLUkkKHRvcF9zcmNkaXIpL2d0ZXN0L2luY2x1ZGUgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgLUkkKHRvcF9idWlsZGRpcikvZ3Rlc3QvaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2d0ZXN0L2xpYi9saWJndGVzdC5sYSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2xpYi9saWJnbW9jay5sYSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2xpYi9saWJnbW9ja19tYWluLmxhCitwcm90b2J1Zl90ZXN0X0NQUEZMQUdTID0gLUkkKHNyY2RpcikvLi4vZ21vY2svZ3Rlc3QvaW5jbHVkZSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgLUkkKHNyY2RpcikvLi4vZ21vY2svaW5jbHVkZQogIyBEaXNhYmxlIG9wdGltaXphdGlvbiBmb3IgdGVzdHMgdW5sZXNzIHRoZSB1c2VyIGV4cGxpY2l0bHkgYXNrZWQgZm9yIGl0LAogIyBzaW5jZSB0ZXN0X3V0aWwuY2MgdGFrZXMgZm9yZXZlciB0byBjb21waWxlIHdpdGggb3B0aW1pemF0aW9uICh3aXRoIEdDQykuCiAjIFNlZSBjb25maWd1cmUuYWMgZm9yIG1vcmUgaW5mby4KIHByb3RvYnVmX3Rlc3RfQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykKIHByb3RvYnVmX3Rlc3RfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zl91bml0dGVzdC5jYyAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZF91bml0dGVzdC5jYyAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FueV90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3ByZXNlcnZlX3Vua25vd25fZW51bV90ZXN0LmNjICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV9saXRlX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi93ZWxsX2tub3duX3R5cGVzX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICBcCiAgIGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMTksMTkgKzczNSw0MSBAQAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5oICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL21ldGFkYXRhX3Rlc3QuY2MgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50X3VuaXR0ZXN0LmNjICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9wbHVnaW5fdW5pdHRlc3QuY2MgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvcl91bml0dGVzdC5jYyAgICAgXAorICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9jb21wYXJhdG9yX3Rlc3QuY2MgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWxfdGVzdC5jYyAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlcl90ZXN0LmNjIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXJfdGVzdC5jYyAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyX3Rlc3QuY2MgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MgXAorICBnb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYyBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYyAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbF90ZXN0LmNjICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjICAgICAgICAgICAgICBcCiAgICQoQ09NTU9OX1RFU1RfU09VUkNFUykKKworCiBub2Rpc3RfcHJvdG9idWZfdGVzdF9TT1VSQ0VTID0gJChwcm90b2Nfb3V0cHV0cykKIAogIyBSdW4gY3BwX3VuaXR0ZXN0IGFnYWluIHdpdGggUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUyBkZWZpbmVkLgogcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEgXAotICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3QubGEgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICQodG9wX2J1aWxkZGlyKS9ndGVzdC9saWIvbGliZ3Rlc3RfbWFpbi5sYQotcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvZ3Rlc3QvaW5jbHVkZSAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2luY2x1ZGUgIFwKKyAgICAgICAgICAgICAgICAgICAgICBsaWJwcm90b2MubGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuLi9nbW9jay9ndGVzdC9saWIvbGliZ3Rlc3QubGEgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuLi9nbW9jay9saWIvbGliZ21vY2subGEgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAuLi9nbW9jay9saWIvbGliZ21vY2tfbWFpbi5sYQorcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi9nbW9jay9pbmNsdWRlICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUkkKHNyY2RpcikvLi4vZ21vY2svZ3Rlc3QvaW5jbHVkZSBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1EUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwogcHJvdG9idWZfbGF6eV9kZXNjcmlwdG9yX3Rlc3RfQ1hYRkxBR1MgPSAkKE5PX09QVF9DWFhGTEFHUykKIHByb3RvYnVmX2xhenlfZGVzY3JpcHRvcl90ZXN0X1NPVVJDRVMgPSAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTMzOSwyMCArNzc3LDQ0IEBACiAgICQoQ09NTU9OX1RFU1RfU09VUkNFUykKIG5vZGlzdF9wcm90b2J1Zl9sYXp5X2Rlc2NyaXB0b3JfdGVzdF9TT1VSQ0VTID0gJChwcm90b2Nfb3V0cHV0cykKIAotIyBCdWlsZCBsaXRlX3VuaXR0ZXN0IHNlcGFyYXRlbHksIHNpbmNlIGl0IGRvZXNuJ3QgdXNlIGd0ZXN0LgorQ09NTU9OX0xJVEVfVEVTVF9TT1VSQ0VTID0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaAorCisjIEJ1aWxkIGxpdGVfdW5pdHRlc3Qgc2VwYXJhdGVseSwgc2luY2UgaXQgZG9lc24ndCB1c2UgZ3Rlc3QuIEl0IGNhbid0CisjIGRlcGVuZCBvbiBndGVzdCBiZWNhdXNlIG91ciBpbnRlcm5hbCB2ZXJzaW9uIG9mIGd0ZXN0IGRlcGVuZCBvbiBwcm90bworIyBmdWxsIHJ1bnRpbWUgYW5kIHdlIHdhbnQgdG8gbWFrZSBzdXJlIHRoaXMgdGVzdCBidWlsZHMgd2l0aG91dCBmdWxsCisjIHJ1bnRpbWUuCiBwcm90b2J1Zl9saXRlX3Rlc3RfTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYtbGl0ZS5sYQogcHJvdG9idWZfbGl0ZV90ZXN0X0NYWEZMQUdTID0gJChOT19PUFRfQ1hYRkxBR1MpCiBwcm90b2J1Zl9saXRlX3Rlc3RfU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuY2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIGdvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oCisgICQoQ09NTU9OX0xJVEVfVEVTVF9TT1VSQ0VTKQogbm9kaXN0X3Byb3RvYnVmX2xpdGVfdGVzdF9TT1VSQ0VTID0gJChwcm90b2NfbGl0ZV9vdXRwdXRzKQogCisjIGxpdGVfYXJlbmFfdW5pdHRlc3QgZGVwZW5kcyBvbiBndGVzdCBiZWNhdXNlIHRlYm9yaW5nQCBmb3VuZCB0aGF0IHdpdGhvdXQKKyMgZ3Rlc3Qgd2hlbiBidWlsZGluZyB0aGUgdGVzdCBpbnRlcm5hbGx5IG91ciBtZW1vcnkgc2FuaXRpemVyIGRvZXNuJ3QgZGV0ZWN0CisjIG1lbW9yeSBsZWFrcyAoZG9uJ3Qga25vdyB3aHkpLgorcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X0xEQUREID0gJChQVEhSRUFEX0xJQlMpIGxpYnByb3RvYnVmLWxpdGUubGEgXAorICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2d0ZXN0L2xpYi9saWJndGVzdC5sYSAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2xpYi9saWJnbW9jay5sYSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgIC4uL2dtb2NrL2xpYi9saWJnbW9ja19tYWluLmxhCitwcm90b2J1Zl9saXRlX2FyZW5hX3Rlc3RfQ1BQRkxBR1MgPSAtSSQoc3JjZGlyKS8uLi9nbW9jay9pbmNsdWRlICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC1JJChzcmNkaXIpLy4uL2dtb2NrL2d0ZXN0L2luY2x1ZGUKK3Byb3RvYnVmX2xpdGVfYXJlbmFfdGVzdF9DWFhGTEFHUyA9ICQoTk9fT1BUX0NYWEZMQUdTKQorcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMgPSAgICAgICBcCisgIGdvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjIFwKKyAgJChDT01NT05fTElURV9URVNUX1NPVVJDRVMpCitub2Rpc3RfcHJvdG9idWZfbGl0ZV9hcmVuYV90ZXN0X1NPVVJDRVMgPSAkKHByb3RvY19saXRlX291dHB1dHMpCisKICMgVGVzdCBwbHVnaW4gYmluYXJ5LgogdGVzdF9wbHVnaW5fTERBREQgPSAkKFBUSFJFQURfTElCUykgbGlicHJvdG9idWYubGEgbGlicHJvdG9jLmxhIFwKLSAgICAgICAgICAgICAgICAgICAgJCh0b3BfYnVpbGRkaXIpL2d0ZXN0L2xpYi9saWJndGVzdC5sYQotdGVzdF9wbHVnaW5fQ1BQRkxBR1MgPSAtSSQodG9wX3NyY2RpcikvZ3Rlc3QvaW5jbHVkZSAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgLUkkKHRvcF9idWlsZGRpcikvZ3Rlc3QvaW5jbHVkZQorICAgICAgICAgICAgICAgICAgICAuLi9nbW9jay9ndGVzdC9saWIvbGliZ3Rlc3QubGEKK3Rlc3RfcGx1Z2luX0NQUEZMQUdTID0gLUkkKHNyY2RpcikvLi4vZ21vY2svZ3Rlc3QvaW5jbHVkZQogdGVzdF9wbHVnaW5fU09VUkNFUyA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYyAgICAgICAgICAgICAgXAogICBnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtMzY4LDQgKzgzMCw1IEBACiBlbmRpZgogCiBURVNUUyA9IHByb3RvYnVmLXRlc3QgcHJvdG9idWYtbGF6eS1kZXNjcmlwdG9yLXRlc3QgcHJvdG9idWYtbGl0ZS10ZXN0IFwKLSAgICAgICAgZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2ggJChHWlRFU1RTKQorICAgICAgICBnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCAkKEdaVEVTVFMpICAgICBcCisgICAgICAgIHByb3RvYnVmLWxpdGUtYXJlbmEtdGVzdApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL1JFQURNRS5tZCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvUkVBRE1FLm1kCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvUkVBRE1FLm1kCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL1JFQURNRS5tZApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvU0VCUyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL1NFQlMKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGJhMzNjNzMuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvU0VCUworKysgL2Rldi9udWxsCkBAIC0xLDI0MCArMCwwIEBACi0jICoqRVhQRVJJTUVOVEFMKioKLSMKLSMgU2VlIGh0dHA6Ly9zZWJzLmdvb2dsZWNvZGUuY29tCi0jCi0jIFRoaXMgaXMgYW4gZXhwZXJpbWVudGFsIGJ1aWxkIGRlZmluaXRpb24gZmlsZSB1c2luZyB0aGUgU0VCUyBidWlsZCBzeXN0ZW0uCi0jIEkgKEtlbnRvbiBWYXJkYSwgbWFpbnRhaW5lciBvZiBQcm90b2NvbCBCdWZmZXJzKSBoYXBwZW4gdG8gYmUgdGhlIGF1dGhvciBvZgotIyBTRUJTLCB0aG91Z2ggU0VCUyBpcyBub3QgYSBHb29nbGUgcHJvamVjdC4gIEknbSBzdGlja2luZyB0aGlzIGZpbGUgaW4KLSMgcHJvdG9idWYncyBTVk4gYmVjYXVzZSB0aGF0J3MgdGhlIGVhc2llc3QgcGxhY2UgZm9yIG1lIHRvIHB1dCBpdCwgYW5kIGl0Ci0jIHNob3VsZG4ndCBoYXJtIGFueW9uZS4gIFRoaXMgZmlsZSBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIGRpc3RyaWJ1dGlvbi4KLSMKLSMgQ3VycmVudGx5LCB0byB1c2UgdGhpcyBmaWxlLCB5b3UgbXVzdCBnZW5lcmF0ZSBjb25maWcuaCBhbmQgcHV0IGl0IGF0IHRoZQotIyB0b3AgbGV2ZWwgb2YgdGhlIHNvdXJjZSB0cmVlLgotCi1fY3BwID0gc2Vicy5pbXBvcnRfKCIvL3NlYnMvY3BwLnNlYnMiKQotCi0jID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0jIFB1YmxpYyB0YXJnZXRzCi0KLXByb3RvYnVmX2xpdGUgPSBfY3BwLkxpYnJhcnkoCi0gIG5hbWUgPSAicHJvdG9idWYtbGl0ZSIsCi0gIHNyY3MgPSBbICJzdHVicy9jb21tb24uY2MiLAotICAgICAgICAgICAic3R1YnMvb25jZS5jYyIsCi0gICAgICAgICAgICJzdHVicy9oYXNoLmNjIiwKLSAgICAgICAgICAgInN0dWJzL2hhc2guaCIsCi0gICAgICAgICAgICJzdHVicy9tYXAtdXRpbC5oIiwKLSAgICAgICAgICAgInN0dWJzL3N0bF91dGlsLWlubC5oIiwKLSAgICAgICAgICAgImV4dGVuc2lvbl9zZXQuY2MiLAotICAgICAgICAgICAiZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYyIsCi0gICAgICAgICAgICJtZXNzYWdlX2xpdGUuY2MiLAotICAgICAgICAgICAicmVwZWF0ZWRfZmllbGQuY2MiLAotICAgICAgICAgICAid2lyZV9mb3JtYXRfbGl0ZS5jYyIsCi0gICAgICAgICAgICJpby9jb2RlZF9zdHJlYW0uY2MiLAotICAgICAgICAgICAiaW8vemVyb19jb3B5X3N0cmVhbS5jYyIsCi0gICAgICAgICAgICJpby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYyIgXSwKLSAgZGVwcyA9IFsgX2NwcC5TeXN0ZW1MaWJyYXJ5KG5hbWUgPSAicHRocmVhZCIpIF0pCi0KLXByb3RvYnVmID0gX2NwcC5MaWJyYXJ5KAotICBuYW1lID0gInByb3RvYnVmIiwKLSAgc3JjcyA9IFsgInN0dWJzL3N0cnV0aWwuY2MiLAotICAgICAgICAgICAic3R1YnMvc3RydXRpbC5oIiwKLSAgICAgICAgICAgInN0dWJzL3N1YnN0aXR1dGUuY2MiLAotICAgICAgICAgICAic3R1YnMvc3Vic3RpdHV0ZS5oIiwKLSAgICAgICAgICAgInN0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyIsCi0gICAgICAgICAgICJkZXNjcmlwdG9yLmNjIiwKLSAgICAgICAgICAgImRlc2NyaXB0b3IucGIuY2MiLAotICAgICAgICAgICAiZGVzY3JpcHRvcl9kYXRhYmFzZS5jYyIsCi0gICAgICAgICAgICJkeW5hbWljX21lc3NhZ2UuY2MiLAotICAgICAgICAgICAiZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyIsCi0gICAgICAgICAgICJnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjIiwKLSAgICAgICAgICAgIm1lc3NhZ2UuY2MiLAotICAgICAgICAgICAicmVmbGVjdGlvbl9vcHMuY2MiLAotICAgICAgICAgICAic2VydmljZS5jYyIsCi0gICAgICAgICAgICJ0ZXh0X2Zvcm1hdC5jYyIsCi0gICAgICAgICAgICJ1bmtub3duX2ZpZWxkX3NldC5jYyIsCi0gICAgICAgICAgICJ3aXJlX2Zvcm1hdC5jYyIsCi0gICAgICAgICAgICJpby9nemlwX3N0cmVhbS5jYyIsCi0gICAgICAgICAgICJpby9wcmludGVyLmNjIiwKLSAgICAgICAgICAgImlvL3Rva2VuaXplci5jYyIsCi0gICAgICAgICAgICJpby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvaW1wb3J0ZXIuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvcGFyc2VyLmNjIiBdLAotICBkZXBzID0gWyBwcm90b2J1Zl9saXRlLAotICAgICAgICAgICBfY3BwLlN5c3RlbUxpYnJhcnkobmFtZSA9ICJ6IikgXSkKLQotbGlicHJvdG9jID0gX2NwcC5MaWJyYXJ5KAotICBuYW1lID0gInByb3RvYyIsCi0gIHNyY3MgPSBbICJjb21waWxlci9jb2RlX2dlbmVyYXRvci5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfZW51bS5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2VudW0uaCIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfZmllbGQuaCIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2ZpbGUuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9maWxlLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaCIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaCIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfZW51bS5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfZW51bS5oIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9maWxlLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9maWxlLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmgiLAotICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MiLAotICAgICAgICAgICAiY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaCIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaCIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oIiwKLSAgICAgICAgICAgImNvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjIiBdLAotICBkZXBzID0gWyBwcm90b2J1ZiBdKQotCi1wcm90b2MgPSBfY3BwLkJpbmFyeSgKLSAgbmFtZSA9ICJwcm90b2MiLAotICBzcmNzID0gWyAiY29tcGlsZXIvbWFpbi5jYyIgXSwKLSAgZGVwcyA9IFsgbGlicHJvdG9jIF0pCi0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgUHJvdG9idWZMaWJyYXJ5IHJ1bGUgY2xhc3MKLQotY2xhc3MgUHJvdG9idWZMaWJyYXJ5KHNlYnMuUnVsZSk6Ci0gIGFyZ3VtZW50X3NwZWMgPSBzZWJzLkFyZ3VtZW50U3BlYyhzcmNzID0gW3NlYnMuQXJ0aWZhY3RdLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwcyA9IChbc2Vicy5SdWxlXSwgW10pLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGl0ZSA9IChib29sLCBGYWxzZSkpCi0KLSAgZGVmIF9leHBhbmQoc2VsZiwgYXJncyk6Ci0gICAgZm9yIGRlcCBpbiBhcmdzLmRlcHM6Ci0gICAgICBpZiBub3QgaXNpbnN0YW5jZShkZXAsIFByb3RvYnVmTGlicmFyeSk6Ci0gICAgICAgIHJhaXNlIHNlYnMuRGVmaW5pdGlvbkVycm9yKAotICAgICAgICAgICJEZXBlbmRlbmN5IG9mIFByb3RvYnVmTGlicmFyeSBpcyBub3QgYSBQcm90b2J1ZkxpYnJhcnk6ICVzIiAlIGRlcCkKLQotICAgIHByb3RvYy5leHBhbmRfb25jZSgpCi0KLSAgICAjIFdlIG11c3QgYnVpbGQgcHJvdG9jIGZvciB0aGUgaG9zdCBjb25maWd1cmF0aW9uIHRvIGFsbG93IGNyb3NzLWNvbXBpbGluZy4KLSAgICBob3N0X3Byb3RvYyA9IHNlbGYuY29udGV4dC5jb25maWd1cmVkX2FydGlmYWN0KHByb3RvYy5iaW5hcnksICJob3N0IikKLQotICAgIHByb3RvY19hY3Rpb24gPSBzZWxmLmNvbnRleHQuYWN0aW9uKHNlbGYsICJwcm90b2J1ZiIpCi0gICAgcHJvdG9jX2FyZ3MgPSBbaG9zdF9wcm90b2MsICItSXNyYyIsICItSXRtcCIsICItSWluY2x1ZGUiLCItLWNwcF9vdXQ9dG1wIl0KLQotICAgIGNwcF9zcmNzID0gW10KLSAgICBmb3Igc3JjIGluIGFyZ3Muc3JjczoKLSAgICAgIHByb3RvY19hcmdzLmFwcGVuZChzcmMpCi0KLSAgICAgICMgV2UgY2Fubm90IGJ1aWxkIC5wcm90byBmaWxlcyBmcm9tIG90aGVyIHBhY2thZ2VzIGJlY2F1c2UgdGhlIC5wYi5jYwotICAgICAgIyBhbmQgLnBiLmggZmlsZXMgd291bGQgYmUgd3JpdHRlbiB0byB0aGF0IHBhY2thZ2UsIGFuZCB3ZSBhcmVuJ3QgYWxsb3dlZAotICAgICAgIyB0byB3cml0ZSB0byBvdGhlciBwYWNrYWdlcy4KLSAgICAgIGlmIHNlbGYuY29udGV4dC5sb2NhbF9maWxlbmFtZShzcmMpIGlzIE5vbmU6Ci0gICAgICAgIHJhaXNlIHNlYnMuRGVmaW5pdGlvbkVycm9yKAotICAgICAgICAgICJTb3VyY2UgZmlsZSBpcyBub3QgaW4gdGhpcyBwYWNrYWdlOiAlcyIgJSBzcmMpCi0KLSAgICAgIGNjX2FydGlmYWN0ID0gc2VsZi5jb250ZXh0LmRlcml2ZWRfYXJ0aWZhY3Qoc3JjLCAiLnBiLmNjIiwgcHJvdG9jX2FjdGlvbikKLSAgICAgIGhlYWRlcl9hcnRpZmFjdCA9IHNlbGYuY29udGV4dC5kZXJpdmVkX2FydGlmYWN0KAotICAgICAgICAgIHNyYywgIi5wYi5oIiwgcHJvdG9jX2FjdGlvbikKLQotICAgICAgY3BwX3NyY3MuYXBwZW5kKGNjX2FydGlmYWN0KQotICAgICAgY3BwX3NyY3MuYXBwZW5kKGhlYWRlcl9hcnRpZmFjdCkKLQotICAgIHByb3RvY19hY3Rpb24uc2V0X2NvbW1hbmQoCi0gICAgICBzZWJzLlN1YnByb2Nlc3NDb21tYW5kKHByb3RvY19hY3Rpb24sIHByb3RvY19hcmdzLCBpbXBsaWNpdCA9IGNwcF9zcmNzKSkKLQotICAgIGRlcHMgPSBsaXN0KGFyZ3MuZGVwcykKLSAgICBpZiBhcmdzLmxpdGU6Ci0gICAgICBkZXBzLmFwcGVuZChwcm90b2J1Zl9saXRlKQotICAgIGVsc2U6Ci0gICAgICBkZXBzLmFwcGVuZChwcm90b2J1ZikKLQotICAgIHNlbGYuX19jcHBfbGlicmFyeSA9IF9jcHAuTGlicmFyeShzcmNzID0gY3BwX3NyY3MsIGRlcHMgPSBkZXBzLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0ID0gc2VsZi5jb250ZXh0KQotICAgIHNlbGYuX19jcHBfbGlicmFyeS5sYWJlbCA9IHNlbGYubGFiZWwKLSAgICBzZWxmLm91dHB1dHMgPSBbXQotCi0gIGRlZiBhc19jcHBfbGlicmFyeShzZWxmKToKLSAgICBzZWxmLmV4cGFuZF9vbmNlKCkKLSAgICByZXR1cm4gc2VsZi5fX2NwcF9saWJyYXJ5Ci0KLSMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLSMgVGVzdHMKLQotX2xpdGVfdGVzdF9wcm90b3MgPSBQcm90b2J1ZkxpYnJhcnkoCi0gIHNyY3MgPSBbICJ1bml0dGVzdF9saXRlLnByb3RvIiwKLSAgICAgICAgICAgInVuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIiBdLAotICBsaXRlID0gVHJ1ZSkKLV90ZXN0X3Byb3RvcyA9IFByb3RvYnVmTGlicmFyeSgKLSAgc3JjcyA9IFsgInVuaXR0ZXN0LnByb3RvIiwKLSAgICAgICAgICAgInVuaXR0ZXN0X2VtcHR5LnByb3RvIiwKLSAgICAgICAgICAgInVuaXR0ZXN0X2ltcG9ydC5wcm90byIsCi0gICAgICAgICAgICJ1bml0dGVzdF9tc2V0LnByb3RvIiwKLSAgICAgICAgICAgInVuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byIsCi0gICAgICAgICAgICJ1bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8iLAotICAgICAgICAgICAidW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iLAotICAgICAgICAgICAidW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8iLAotICAgICAgICAgICAiY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90byIgXSwKLSAgZGVwcyA9IFsgX2xpdGVfdGVzdF9wcm90b3MgXSkKLQotX3Rlc3RfdXRpbCA9IF9jcHAuTGlicmFyeSgKLSAgbmFtZSA9ICJ0ZXN0X3V0aWwiLAotICBzcmNzID0gWyAidGVzdF91dGlsLmNjIiwKLSAgICAgICAgICAgInRlc3RfdXRpbC5oIiwKLSAgICAgICAgICAgInRlc3RpbmcvZ29vZ2xldGVzdC5jYyIsCi0gICAgICAgICAgICJ0ZXN0aW5nL2dvb2dsZXRlc3QuaCIsCi0gICAgICAgICAgICJ0ZXN0aW5nL2ZpbGUuY2MiLAotICAgICAgICAgICAidGVzdGluZy9maWxlLmgiIF0sCi0gIGRlcHMgPSBbIHByb3RvYnVmLCBfdGVzdF9wcm90b3MsIF9jcHAuU3lzdGVtTGlicmFyeShuYW1lID0gImd0ZXN0IildICkKLQotcHJvdG9idWZfbGl0ZV90ZXN0ID0gX2NwcC5UZXN0KAotICBzcmNzID0gWyAibGl0ZV91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJ0ZXN0X3V0aWxfbGl0ZS5jYyIsCi0gICAgICAgICAgICJ0ZXN0X3V0aWxfbGl0ZS5oIiBdLAotICBkZXBzID0gWyBfbGl0ZV90ZXN0X3Byb3RvcyBdKQotCi1wcm90b2J1Zl90ZXN0ID0gX2NwcC5UZXN0KAotICBzcmNzID0gWyAic3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgICAgInN0dWJzL29uY2VfdW5pdHRlc3QuY2MiLAotICAgICAgICAgICAic3R1YnMvc3RydXRpbF91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJzdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWRfdW5pdHRlc3QuY2MiLAotICAgICAgICAgICAiZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJkZXNjcmlwdG9yX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgICAgImR5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJleHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgICAgImdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MiLAotICAgICAgICAgICAibWVzc2FnZV91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJyZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJyZXBlYXRlZF9maWVsZF91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJ0ZXh0X2Zvcm1hdF91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJ1bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJ3aXJlX2Zvcm1hdF91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJpby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MiLAotICAgICAgICAgICAiaW8vcHJpbnRlcl91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJpby90b2tlbml6ZXJfdW5pdHRlc3QuY2MiLAotICAgICAgICAgICAiaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL2ltcG9ydGVyX3VuaXR0ZXN0LmNjIiwKLSAgICAgICAgICAgImNvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX2Jvb3RzdHJhcF91bml0dGVzdC5jYyIsCi0gICAgICAgICAgICJjb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjIiBdLAotICBkZXBzID0gWyBwcm90b2J1ZiwgbGlicHJvdG9jLCBfdGVzdF91dGlsLAotICAgICAgICAgICBfY3BwLlN5c3RlbUxpYnJhcnkobmFtZSA9ICJndGVzdF9tYWluIikgXSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FueS5wYi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucGIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYW55LnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hbnlfdGVzdC5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYW55X3Rlc3QucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXBpLnBiLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wYi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcGkucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FwaS5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmEuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTIyMDRiNwotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hLmgKQEAgLTAsMCArMSw5MzMgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9BUkVOQV9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSRU5BX0hfXworCisjaW5jbHVkZSA8bGltaXRzPgorI2lmZGVmIG1heAorI3VuZGVmIG1heCAgLy8gVmlzdWFsIFN0dWRpbyBkZWZpbmVzIHRoaXMgbWFjcm8KKyNlbmRpZgorI2lmIF9fY3BsdXNwbHVzID49IDIwMTEwM0wKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHMuaD4KKyNlbmRpZgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmICFfSEFTX0VYQ0VQVElPTlMKKy8vIFdvcmsgYXJvdW5kIGJ1Z3MgaW4gTVNWQyA8dHlwZWluZm8+IGhlYWRlciB3aGVuIF9IQVNfRVhDRVBUSU9OUz0wLgorI2luY2x1ZGUgPGV4Y2VwdGlvbj4KKyNpbmNsdWRlIDx0eXBlaW5mbz4KK25hbWVzcGFjZSBzdGQgewordXNpbmcgdHlwZV9pbmZvID0gOjp0eXBlX2luZm87Cit9CisjZWxzZQorI2luY2x1ZGUgPHR5cGVpbmZvPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljX3NlcXVlbmNlX251bS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbXV0ZXguaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHMuaD4KKworCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIEFyZW5hOyAgICAgICAvLyBkZWZpbmVkIGJlbG93CitjbGFzcyBNZXNzYWdlOyAgICAgLy8gbWVzc2FnZS5oCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBBcmVuYVN0cmluZzsgLy8gYXJlbmFzdHJpbmcuaAorY2xhc3MgTGF6eUZpZWxkOyAgIC8vIGxhenlfZmllbGQuaAorCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPgorY2xhc3MgR2VuZXJpY1R5cGVIYW5kbGVyOyAvLyByZXBlYXRlZF9maWVsZC5oCisKKy8vIFRlbXBsYXRlZCBjbGVhbnVwIG1ldGhvZHMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiB2b2lkIGFyZW5hX2Rlc3RydWN0X29iamVjdCh2b2lkKiBvYmplY3QpIHsKKyAgcmVpbnRlcnByZXRfY2FzdDxUKj4ob2JqZWN0KS0+flQoKTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+IHZvaWQgYXJlbmFfZGVsZXRlX29iamVjdCh2b2lkKiBvYmplY3QpIHsKKyAgZGVsZXRlIHJlaW50ZXJwcmV0X2Nhc3Q8VCo+KG9iamVjdCk7Cit9CitpbmxpbmUgdm9pZCBhcmVuYV9mcmVlKHZvaWQqIG9iamVjdCwgc2l6ZV90IC8qIHNpemUgKi8pIHsKKyNpZm5kZWYgU1RBUkJPQVJECisgIGZyZWUob2JqZWN0KTsKKyNlbHNlCisgIFNiTWVtb3J5RGVhbGxvY2F0ZShvYmplY3QpOworI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKK30KKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEFyZW5hT3B0aW9ucyBwcm92aWRlcyBvcHRpb25hbCBhZGRpdGlvbmFsIHBhcmFtZXRlcnMgdG8gYXJlbmEgY29uc3RydWN0aW9uCisvLyB0aGF0IGNvbnRyb2wgaXRzIGJsb2NrLWFsbG9jYXRpb24gYmVoYXZpb3IuCitzdHJ1Y3QgQXJlbmFPcHRpb25zIHsKKyAgLy8gVGhpcyBkZWZpbmVzIHRoZSBzaXplIG9mIHRoZSBmaXJzdCBibG9jayByZXF1ZXN0ZWQgZnJvbSB0aGUgc3lzdGVtIG1hbGxvYy4KKyAgLy8gU3Vic2VxdWVudCBibG9jayBzaXplcyB3aWxsIGluY3JlYXNlIGluIGEgZ2VvbWV0cmljIHNlcmllcyB1cCB0byBhIG1heGltdW0uCisgIHNpemVfdCBzdGFydF9ibG9ja19zaXplOworCisgIC8vIFRoaXMgZGVmaW5lcyB0aGUgbWF4aW11bSBibG9jayBzaXplIHJlcXVlc3RlZCBmcm9tIHN5c3RlbSBtYWxsb2MgKHVubGVzcyBhbgorICAvLyBpbmRpdmlkdWFsIGFyZW5hIGFsbG9jYXRpb24gcmVxdWVzdCBvY2N1cnMgd2l0aCBhIHNpemUgbGFyZ2VyIHRoYW4gdGhpcworICAvLyBtYXhpbXVtKS4gUmVxdWVzdGVkIGJsb2NrIHNpemVzIGluY3JlYXNlIHVwIHRvIHRoaXMgdmFsdWUsIHRoZW4gcmVtYWluCisgIC8vIGhlcmUuCisgIHNpemVfdCBtYXhfYmxvY2tfc2l6ZTsKKworICAvLyBBbiBpbml0aWFsIGJsb2NrIG9mIG1lbW9yeSBmb3IgdGhlIGFyZW5hIHRvIHVzZSwgb3IgTlVMTCBmb3Igbm9uZS4gSWYKKyAgLy8gcHJvdmlkZWQsIHRoZSBibG9jayBtdXN0IGxpdmUgYXQgbGVhc3QgYXMgbG9uZyBhcyB0aGUgYXJlbmEgaXRzZWxmLiBUaGUKKyAgLy8gY3JlYXRvciBvZiB0aGUgQXJlbmEgcmV0YWlucyBvd25lcnNoaXAgb2YgdGhlIGJsb2NrIGFmdGVyIHRoZSBBcmVuYSBpcworICAvLyBkZXN0cm95ZWQuCisgIGNoYXIqIGluaXRpYWxfYmxvY2s7CisKKyAgLy8gVGhlIHNpemUgb2YgdGhlIGluaXRpYWwgYmxvY2ssIGlmIHByb3ZpZGVkLgorICBzaXplX3QgaW5pdGlhbF9ibG9ja19zaXplOworCisgIC8vIEEgZnVuY3Rpb24gcG9pbnRlciB0byBhbiBhbGxvYyBtZXRob2QgdGhhdCByZXR1cm5zIG1lbW9yeSBibG9ja3Mgb2Ygc2l6ZQorICAvLyByZXF1ZXN0ZWQuIEJ5IGRlZmF1bHQsIGl0IGNvbnRhaW5zIGEgcHRyIHRvIHRoZSBtYWxsb2MgZnVuY3Rpb24uCisgIC8vCisgIC8vIE5PVEU6IGJsb2NrX2FsbG9jIGFuZCBkZWFsbG9jIGZ1bmN0aW9ucyBhcmUgZXhwZWN0ZWQgdG8gYmVoYXZlIGxpa2UKKyAgLy8gbWFsbG9jIGFuZCBmcmVlLCBpbmNsdWRpbmcgQXNhbiBwb2lzb25pbmcuCisgIHZvaWQqICgqYmxvY2tfYWxsb2MpKHNpemVfdCk7CisgIC8vIEEgZnVuY3Rpb24gcG9pbnRlciB0byBhIGRlYWxsb2MgbWV0aG9kIHRoYXQgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBibG9ja3MKKyAgLy8gZnJvbSB0aGUgYXJlbmEuIEJ5IGRlZmF1bHQsIGl0IGNvbnRhaW5zIGEgcHRyIHRvIGEgd3JhcHBlciBmdW5jdGlvbiB0aGF0CisgIC8vIGNhbGxzIGZyZWUuCisgIHZvaWQgKCpibG9ja19kZWFsbG9jKSh2b2lkKiwgc2l6ZV90KTsKKworICAvLyBIb29rcyBmb3IgYWRkaW5nIGV4dGVybmFsIGZ1bmN0aW9uYWxpdHkgc3VjaCBhcyB1c2VyLXNwZWNpZmljIG1ldHJpY3MKKyAgLy8gY29sbGVjdGlvbiwgc3BlY2lmaWMgZGVidWdnaW5nIGFiaWxpdGllcywgZXRjLgorICAvLyBJbml0IGhvb2sgbWF5IHJldHVybiBhIHBvaW50ZXIgdG8gYSBjb29raWUgdG8gYmUgc3RvcmVkIGluIHRoZSBhcmVuYS4KKyAgLy8gcmVzZXQgYW5kIGRlc3RydWN0aW9uIGhvb2tzIHdpbGwgdGhlbiBiZSBjYWxsZWQgd2l0aCB0aGUgc2FtZSBjb29raWUKKyAgLy8gcG9pbnRlci4gVGhpcyBhbGxvd3MgdXMgdG8gc2F2ZSBhbiBleHRlcm5hbCBvYmplY3QgcGVyIGFyZW5hIGluc3RhbmNlIGFuZAorICAvLyB1c2UgaXQgb24gdGhlIG90aGVyIGhvb2tzIChOb3RlOiBJdCBpcyBqdXN0IGFzIGxlZ2FsIGZvciBpbml0IHRvIHJldHVybgorICAvLyBOVUxMIGFuZCBub3QgdXNlIHRoZSBjb29raWUgZmVhdHVyZSkuCisgIC8vIG9uX2FyZW5hX3Jlc2V0IGFuZCBvbl9hcmVuYV9kZXN0cnVjdGlvbiBhbHNvIHJlY2VpdmUgdGhlIHNwYWNlIHVzZWQgaW4KKyAgLy8gdGhlIGFyZW5hIGp1c3QgYmVmb3JlIHRoZSByZXNldC4KKyAgdm9pZCogKCpvbl9hcmVuYV9pbml0KShBcmVuYSogYXJlbmEpOworICB2b2lkICgqb25fYXJlbmFfcmVzZXQpKEFyZW5hKiBhcmVuYSwgdm9pZCogY29va2llLCB1aW50NjQgc3BhY2VfdXNlZCk7CisgIHZvaWQgKCpvbl9hcmVuYV9kZXN0cnVjdGlvbikoQXJlbmEqIGFyZW5hLCB2b2lkKiBjb29raWUsIHVpbnQ2NCBzcGFjZV91c2VkKTsKKworICAvLyB0eXBlX2luZm8gaXMgcHJvbWlzZWQgdG8gYmUgc3RhdGljIC0gaXRzIGxpZmV0aW1lIGV4dGVuZHMgdG8KKyAgLy8gbWF0Y2ggcHJvZ3JhbSdzIGxpZmV0aW1lIChJdCBpcyBnaXZlbiBieSB0eXBlaWQgb3BlcmF0b3IpLgorICAvLyBOb3RlOiB0eXBlaWQodm9pZCkgd2lsbCBiZSBwYXNzZWQgYXMgYWxsb2NhdGVkX3R5cGUgZXZlcnkgdGltZSB3ZQorICAvLyBpbnRlbnRpb25hbGx5IHdhbnQgdG8gYXZvaWQgbW9uaXRvcmluZyBhbiBhbGxvY2F0aW9uLiAoaS5lLiBpbnRlcm5hbAorICAvLyBhbGxvY2F0aW9ucyBmb3IgbWFuYWdpbmcgdGhlIGFyZW5hKQorICB2b2lkICgqb25fYXJlbmFfYWxsb2NhdGlvbikoY29uc3Qgc3RkOjp0eXBlX2luZm8qIGFsbG9jYXRlZF90eXBlLAorICAgICAgdWludDY0IGFsbG9jX3NpemUsIHZvaWQqIGNvb2tpZSk7CisKKyAgQXJlbmFPcHRpb25zKCkKKyAgICAgIDogc3RhcnRfYmxvY2tfc2l6ZShrRGVmYXVsdFN0YXJ0QmxvY2tTaXplKSwKKyAgICAgICAgbWF4X2Jsb2NrX3NpemUoa0RlZmF1bHRNYXhCbG9ja1NpemUpLAorICAgICAgICBpbml0aWFsX2Jsb2NrKE5VTEwpLAorICAgICAgICBpbml0aWFsX2Jsb2NrX3NpemUoMCksCisjaWZuZGVmIFNUQVJCT0FSRAorICAgICAgICBibG9ja19hbGxvYygmbWFsbG9jKSwKKyNlbHNlCisgICAgICAgIGJsb2NrX2FsbG9jKCZTYk1lbW9yeUFsbG9jYXRlKSwKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisgICAgICAgIGJsb2NrX2RlYWxsb2MoJmludGVybmFsOjphcmVuYV9mcmVlKSwKKyAgICAgICAgb25fYXJlbmFfaW5pdChOVUxMKSwKKyAgICAgICAgb25fYXJlbmFfcmVzZXQoTlVMTCksCisgICAgICAgIG9uX2FyZW5hX2Rlc3RydWN0aW9uKE5VTEwpLAorICAgICAgICBvbl9hcmVuYV9hbGxvY2F0aW9uKE5VTEwpIHt9CisKKyBwcml2YXRlOgorICAvLyBDb25zdGFudHMgZGVmaW5lIGRlZmF1bHQgc3RhcnRpbmcgYmxvY2sgc2l6ZSBhbmQgbWF4IGJsb2NrIHNpemUgZm9yCisgIC8vIGFyZW5hIGFsbG9jYXRvciBiZWhhdmlvciAtLSBzZWUgZGVzY3JpcHRpb25zIGFib3ZlLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtEZWZhdWx0U3RhcnRCbG9ja1NpemUgPSAyNTY7CisgIHN0YXRpYyBjb25zdCBzaXplX3Qga0RlZmF1bHRNYXhCbG9ja1NpemUgICA9IDgxOTI7Cit9OworCisvLyBTdXBwb3J0IGZvciBub24tUlRUSSBlbnZpcm9ubWVudHMuIChUaGUgbWV0cmljcyBob29rcyBBUEkgdXNlcyB0eXBlCisvLyBpbmZvcm1hdGlvbi4pCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJCisjZGVmaW5lIFJUVElfVFlQRV9JRCh0eXBlKSAoJnR5cGVpZCh0eXBlKSkKKyNlbHNlCisjZGVmaW5lIFJUVElfVFlQRV9JRCh0eXBlKSAoTlVMTCkKKyNlbmRpZgorCisvLyBBcmVuYSBhbGxvY2F0b3IuIEFyZW5hIGFsbG9jYXRpb24gcmVwbGFjZXMgb3JkaW5hcnkgKGhlYXAtYmFzZWQpIGFsbG9jYXRpb24KKy8vIHdpdGggbmV3L2RlbGV0ZSwgYW5kIGltcHJvdmVzIHBlcmZvcm1hbmNlIGJ5IGFnZ3JlZ2F0aW5nIGFsbG9jYXRpb25zIGludG8KKy8vIGxhcmdlciBibG9ja3MgYW5kIGZyZWVpbmcgYWxsb2NhdGlvbnMgYWxsIGF0IG9uY2UuIFByb3RvY29sIG1lc3NhZ2VzIGFyZQorLy8gYWxsb2NhdGVkIG9uIGFuIGFyZW5hIGJ5IHVzaW5nIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFQ+KEFyZW5hKiksIGJlbG93LCBhbmQKKy8vIGFyZSBhdXRvbWF0aWNhbGx5IGZyZWVkIHdoZW4gdGhlIGFyZW5hIGlzIGRlc3Ryb3llZC4KKy8vCisvLyBUaGlzIGlzIGEgdGhyZWFkLXNhZmUgaW1wbGVtZW50YXRpb246IG11bHRpcGxlIHRocmVhZHMgbWF5IGFsbG9jYXRlIGZyb20gdGhlCisvLyBhcmVuYSBjb25jdXJyZW50bHkuIERlc3RydWN0aW9uIGlzIG5vdCB0aHJlYWQtc2FmZSBhbmQgdGhlIGRlc3RydWN0aW5nCisvLyB0aHJlYWQgbXVzdCBzeW5jaHJvbml6ZSB3aXRoIHVzZXJzIG9mIHRoZSBhcmVuYSBmaXJzdC4KKy8vCisvLyBBbiBhcmVuYSBwcm92aWRlcyB0d28gYWxsb2NhdGlvbiBpbnRlcmZhY2VzOiBDcmVhdGVNZXNzYWdlPFQ+LCB3aGljaCB3b3JrcworLy8gZm9yIGFyZW5hLWVuYWJsZWQgcHJvdG8yIG1lc3NhZ2UgdHlwZXMgYXMgd2VsbCBhcyBvdGhlciB0eXBlcyB0aGF0IHNhdGlzZnkKKy8vIHRoZSBhcHByb3ByaWF0ZSBwcm90b2NvbCAoZGVzY3JpYmVkIGJlbG93KSwgYW5kIENyZWF0ZTxUPiwgd2hpY2ggd29ya3MgZm9yCisvLyBhbnkgYXJiaXRyYXJ5IHR5cGUgVC4gQ3JlYXRlTWVzc2FnZTxUPiBpcyBiZXR0ZXIgd2hlbiB0aGUgdHlwZSBUIHN1cHBvcnRzIGl0LAorLy8gYmVjYXVzZSB0aGlzIGludGVyZmFjZSAoaSkgcGFzc2VzIHRoZSBhcmVuYSBwb2ludGVyIHRvIHRoZSBjcmVhdGVkIG9iamVjdCBzbworLy8gdGhhdCBpdHMgc3ViLW9iamVjdHMgYW5kIGludGVybmFsIGFsbG9jYXRpb25zIGNhbiB1c2UgdGhlIGFyZW5hIHRvbywgYW5kIChpaSkKKy8vIGVsaWRlcyB0aGUgb2JqZWN0J3MgZGVzdHJ1Y3RvciBjYWxsIHdoZW4gcG9zc2libGUuIENyZWF0ZTxUPiBkb2VzIG5vdCBwbGFjZQorLy8gYW55IHNwZWNpYWwgcmVxdWlyZW1lbnRzIG9uIHRoZSB0eXBlIFQsIGFuZCB3aWxsIGludm9rZSB0aGUgb2JqZWN0J3MKKy8vIGRlc3RydWN0b3Igd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkLgorLy8KKy8vIFRoZSBhcmVuYSBtZXNzYWdlIGFsbG9jYXRpb24gcHJvdG9jb2wsIHJlcXVpcmVkIGJ5IENyZWF0ZU1lc3NhZ2U8VD4sIGlzIGFzCisvLyBmb2xsb3dzOgorLy8KKy8vIC0gVGhlIHR5cGUgVCBtdXN0IGhhdmUgKGF0IGxlYXN0KSB0d28gY29uc3RydWN0b3JzOiBhIGNvbnN0cnVjdG9yIHdpdGggbm8KKy8vICAgYXJndW1lbnRzLCBjYWxsZWQgd2hlbiBhIFQgaXMgYWxsb2NhdGVkIG9uIHRoZSBoZWFwOyBhbmQgYSBjb25zdHJ1Y3RvciB3aXRoCisvLyAgIGEgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZ3VtZW50LCBjYWxsZWQgd2hlbiBhIFQgaXMgYWxsb2NhdGVkIG9uIGFuIGFyZW5hLiBJZiB0aGUKKy8vICAgc2Vjb25kIGNvbnN0cnVjdG9yIGlzIGNhbGxlZCB3aXRoIGEgTlVMTCBhcmVuYSBwb2ludGVyLCBpdCBtdXN0IGJlCisvLyAgIGVxdWl2YWxlbnQgdG8gaW52b2tpbmcgdGhlIGZpcnN0IChuby1hcmd1bWVudCkgY29uc3RydWN0b3IuCisvLworLy8gLSBUaGUgdHlwZSBUIG11c3QgaGF2ZSBhIHBhcnRpY3VsYXIgdHlwZSB0cmFpdDogYSBuZXN0ZWQgdHlwZQorLy8gICB8SW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVffC4gVGhpcyBpcyB1c3VhbGx5IGEgdHlwZWRlZiB0byB8dm9pZHwuIElmIG5vCisvLyAgIHN1Y2ggdHlwZSB0cmFpdCBleGlzdHMsIHRoZW4gdGhlIGluc3RhbnRpYXRpb24gQ3JlYXRlTWVzc2FnZTxUPiB3aWxsIGZhaWwKKy8vICAgdG8gY29tcGlsZS4KKy8vCisvLyAtIFRoZSB0eXBlIFQgKm1heSogaGF2ZSB0aGUgdHlwZSB0cmFpdCB8RGVzdHJ1Y3RvclNraXBwYWJsZV98LiBJZiB0aGlzIHR5cGUKKy8vICAgdHJhaXQgaXMgcHJlc2VudCBpbiB0aGUgdHlwZSwgdGhlbiBpdHMgZGVzdHJ1Y3RvciB3aWxsIG5vdCBiZSBjYWxsZWQgaWYgYW5kCisvLyAgIG9ubHkgaWYgaXQgd2FzIHBhc3NlZCBhIG5vbi1OVUxMIGFyZW5hIHBvaW50ZXIuIElmIHRoaXMgdHlwZSB0cmFpdCBpcyBub3QKKy8vICAgcHJlc2VudCBvbiB0aGUgdHlwZSwgdGhlbiBpdHMgZGVzdHJ1Y3RvciBpcyBhbHdheXMgY2FsbGVkIHdoZW4gdGhlCisvLyAgIGNvbnRhaW5pbmcgYXJlbmEgaXMgZGVzdHJveWVkLgorLy8KKy8vIC0gT25lLSBhbmQgdHdvLXVzZXItYXJndW1lbnQgZm9ybXMgb2YgQ3JlYXRlTWVzc2FnZTxUPigpIGFsc28gZXhpc3QgdGhhdAorLy8gICBmb3J3YXJkIHRoZXNlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyB0byBUJ3MgY29uc3RydWN0b3I6IGZvciBleGFtcGxlLAorLy8gICBDcmVhdGVNZXNzYWdlPFQ+KEFyZW5hKiwgYXJnMSwgYXJnMikgZm9yd2FyZHMgdG8gYSBjb25zdHJ1Y3RvciBUKEFyZW5hKiwKKy8vICAgYXJnMSwgYXJnMikuCisvLworLy8gVGhpcyBwcm90b2NvbCBpcyBpbXBsZW1lbnRlZCBieSBhbGwgYXJlbmEtZW5hYmxlZCBwcm90bzIgbWVzc2FnZSBjbGFzc2VzIGFzCisvLyB3ZWxsIGFzIFJlcGVhdGVkUHRyRmllbGQuCisKKyNpZiBfX2NwbHVzcGx1cyA+PSAyMDExMDNMCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgQXJlbmEgZmluYWwgeworI2Vsc2UKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBBcmVuYSB7CisjZW5kaWYKKyBwdWJsaWM6CisgIC8vIEFyZW5hIGNvbnN0cnVjdG9yIHRha2luZyBjdXN0b20gb3B0aW9ucy4gU2VlIEFyZW5hT3B0aW9ucyBiZWxvdyBmb3IKKyAgLy8gZGVzY3JpcHRpb25zIG9mIHRoZSBvcHRpb25zIGF2YWlsYWJsZS4KKyAgZXhwbGljaXQgQXJlbmEoY29uc3QgQXJlbmFPcHRpb25zJiBvcHRpb25zKSA6IG9wdGlvbnNfKG9wdGlvbnMpIHsKKyAgICBJbml0KCk7CisgIH0KKworICAvLyBEZWZhdWx0IGNvbnN0cnVjdG9yIHdpdGggc2Vuc2libGUgZGVmYXVsdCBvcHRpb25zLCB0dW5lZCBmb3IgYXZlcmFnZQorICAvLyB1c2UtY2FzZXMuCisgIEFyZW5hKCkgeworICAgIEluaXQoKTsKKyAgfQorCisgIC8vIERlc3RydWN0b3IgZGVsZXRlcyBhbGwgb3duZWQgaGVhcCBhbGxvY2F0ZWQgb2JqZWN0cywgYW5kIGRlc3RydWN0cyBvYmplY3RzCisgIC8vIHRoYXQgaGF2ZSBub24tdHJpdmlhbCBkZXN0cnVjdG9ycywgZXhjZXB0IGZvciBwcm90bzIgbWVzc2FnZSBvYmplY3RzIHdob3NlCisgIC8vIGRlc3RydWN0b3JzIGNhbiBiZSBza2lwcGVkLiBBbHNvLCBmcmVlcyBhbGwgYmxvY2tzIGV4Y2VwdCB0aGUgaW5pdGlhbCBibG9jaworICAvLyBpZiBpdCB3YXMgcGFzc2VkIGluLgorICB+QXJlbmEoKTsKKworICAvLyBBUEkgdG8gY3JlYXRlIHByb3RvMiBtZXNzYWdlIG9iamVjdHMgb24gdGhlIGFyZW5hLiBJZiB0aGUgYXJlbmEgcGFzc2VkIGluCisgIC8vIGlzIE5VTEwsIHRoZW4gYSBoZWFwIGFsbG9jYXRlZCBvYmplY3QgaXMgcmV0dXJuZWQuIFR5cGUgVCBtdXN0IGJlIGEgbWVzc2FnZQorICAvLyBkZWZpbmVkIGluIGEgLnByb3RvIGZpbGUgd2l0aCBjY19lbmFibGVfYXJlbmFzIHNldCB0byB0cnVlLCBvdGhlcndpc2UgYQorICAvLyBjb21waWxhdGlvbiBlcnJvciB3aWxsIG9jY3VyLgorICAvLworICAvLyBSZXBlYXRlZEZpZWxkIGFuZCBSZXBlYXRlZFB0ckZpZWxkIG1heSBhbHNvIGJlIGluc3RhbnRpYXRlZCBkaXJlY3RseSBvbiBhbgorICAvLyBhcmVuYSB3aXRoIHRoaXMgbWV0aG9kLgorICAvLworICAvLyBUaGlzIGZ1bmN0aW9uIGFsc28gYWNjZXB0cyBhbnkgdHlwZSBUIHRoYXQgc2F0aXNmaWVzIHRoZSBhcmVuYSBtZXNzYWdlCisgIC8vIGFsbG9jYXRpb24gcHJvdG9jb2wsIGRvY3VtZW50ZWQgYWJvdmUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIFQqIENyZWF0ZU1lc3NhZ2UoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIHsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIG5ldyBUOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDxUPihzdGF0aWNfY2FzdDxUKj4oMCkpOworICAgIH0KKyAgfQorCisgIC8vIE9uZS1hcmd1bWVudCBmb3JtIG9mIENyZWF0ZU1lc3NhZ2UuIFRoaXMgaXMgdXNlZnVsIGZvciBjb25zdHJ1Y3Rpbmcgb2JqZWN0cworICAvLyB0aGF0IGltcGxlbWVudCB0aGUgYXJlbmEgbWVzc2FnZSBjb25zdHJ1Y3Rpb24gcHJvdG9jb2wgZGVzY3JpYmVkIGFib3ZlIGJ1dAorICAvLyB0YWtlIGFkZGl0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIFQqIENyZWF0ZU1lc3NhZ2UoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsIGNvbnN0IEFyZyYgYXJnKSB7CisgICAgaWYgKGFyZW5hID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBuZXcgVChOVUxMLCBhcmcpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZU1lc3NhZ2VJbnRlcm5hbDxUPihzdGF0aWNfY2FzdDxUKj4oMCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcpOworICAgIH0KKyAgfQorCisgIC8vIFR3by1hcmd1bWVudCBmb3JtIG9mIENyZWF0ZU1lc3NhZ2UuIFRoaXMgaXMgdXNlZnVsIGZvciBjb25zdHJ1Y3Rpbmcgb2JqZWN0cworICAvLyB0aGF0IGltcGxlbWVudCB0aGUgYXJlbmEgbWVzc2FnZSBjb25zdHJ1Y3Rpb24gcHJvdG9jb2wgZGVzY3JpYmVkIGFib3ZlIGJ1dAorICAvLyB0YWtlIGFkZGl0aW9uYWwgY29uc3RydWN0b3IgYXJndW1lbnRzLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIHN0YXRpYyBUKiBDcmVhdGVNZXNzYWdlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcyJiBhcmcyKSB7CisgICAgaWYgKGFyZW5hID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBuZXcgVChOVUxMLCBhcmcxLCBhcmcyKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVNZXNzYWdlSW50ZXJuYWw8VD4oc3RhdGljX2Nhc3Q8VCo+KDApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgYXJnMik7CisgICAgfQorICB9CisKKyAgLy8gQVBJIHRvIGNyZWF0ZSBhbnkgb2JqZWN0cyBvbiB0aGUgYXJlbmEuIE5vdGUgdGhhdCBvbmx5IHRoZSBvYmplY3Qgd2lsbAorICAvLyBiZSBjcmVhdGVkIG9uIHRoZSBhcmVuYTsgdGhlIHVuZGVybHlpbmcgcHRycyAoaW4gY2FzZSBvZiBhIHByb3RvMiBtZXNzYWdlKQorICAvLyB3aWxsIGJlIHN0aWxsIGhlYXAgYWxsb2NhdGVkLiBQcm90byBtZXNzYWdlcyBzaG91bGQgdXN1YWxseSBiZSBhbGxvY2F0ZWQKKyAgLy8gd2l0aCBDcmVhdGVNZXNzYWdlPFQ+KCkgaW5zdGVhZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IGV2ZW4gaWYgVCBzYXRpc2ZpZXMgdGhlIGFyZW5hIG1lc3NhZ2UgY29uc3RydWN0aW9uIHByb3RvY29sCisgIC8vIChJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8gdHJhaXQgYW5kIG9wdGlvbmFsIERlc3RydWN0b3JTa2lwcGFibGVfCisgIC8vIHRyYWl0KSwgYXMgZGVzY3JpYmVkIGFib3ZlLCB0aGlzIGZ1bmN0aW9uIGRvZXMgbm90IGZvbGxvdyB0aGUgcHJvdG9jb2w7CisgIC8vIGluc3RlYWQsIGl0IHRyZWF0cyBUIGFzIGEgYmxhY2stYm94IHR5cGUsIGp1c3QgYXMgaWYgaXQgZGlkIG5vdCBoYXZlIHRoZXNlCisgIC8vIHRyYWl0cy4gU3BlY2lmaWNhbGx5LCBUJ3MgY29uc3RydWN0b3IgYXJndW1lbnRzIHdpbGwgYWx3YXlzIGJlIG9ubHkgdGhvc2UKKyAgLy8gcGFzc2VkIHRvIENyZWF0ZTxUPigpIC0tIG5vIGFkZGl0aW9uYWwgYXJlbmEgcG9pbnRlciBpcyBpbXBsaWNpdGx5IGFkZGVkLgorICAvLyBGdXJ0aGVybW9yZSwgdGhlIGRlc3RydWN0b3Igd2lsbCBhbHdheXMgYmUgY2FsbGVkIGF0IGFyZW5hIGRlc3RydWN0aW9uIHRpbWUKKyAgLy8gKHVubGVzcyB0aGUgZGVzdHJ1Y3RvciBpcyB0cml2aWFsKS4gSGVuY2UsIGZyb20gVCdzIHBvaW50IG9mIHZpZXcsIGl0IGlzIGFzCisgIC8vIGlmIHRoZSBvYmplY3Qgd2VyZSBhbGxvY2F0ZWQgb24gdGhlIGhlYXAgKGV4Y2VwdCB0aGF0IHRoZSB1bmRlcmx5aW5nIG1lbW9yeQorICAvLyBpcyBvYnRhaW5lZCBmcm9tIHRoZSBhcmVuYSkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIFQqIENyZWF0ZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgeworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gbmV3IFQoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPihnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUpOworICAgIH0KKyAgfQorCisgIC8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdpdGggb25lIGNvbnN0cnVjdG9yIGFyZ3VtZW50IGZvciB0aGUgY3JlYXRlZCBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmc+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBzdGF0aWMgVCogQ3JlYXRlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLCBjb25zdCBBcmcmIGFyZykgeworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gbmV3IFQoYXJnKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPihnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZyk7CisgICAgfQorICB9CisKKyAgLy8gVmVyc2lvbiBvZiB0aGUgYWJvdmUgd2l0aCB0d28gY29uc3RydWN0b3IgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlZCBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIFQqIENyZWF0ZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMikgeworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gbmV3IFQoYXJnMSwgYXJnMik7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhcmVuYS0+Q3JlYXRlSW50ZXJuYWw8VD4oZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Omhhc190cml2aWFsX2Rlc3RydWN0b3I8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCBhcmcyKTsKKyAgICB9CisgIH0KKworICAvLyBWZXJzaW9uIG9mIHRoZSBhYm92ZSB3aXRoIHRocmVlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZWQKKyAgLy8gb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMz4KKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHN0YXRpYyBUKiBDcmVhdGUoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczKSB7CisgICAgaWYgKGFyZW5hID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBuZXcgVChhcmcxLCBhcmcyLCBhcmczKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPihnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIGFyZzIsIGFyZzMpOworICAgIH0KKyAgfQorCisgIC8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdpdGggZm91ciBjb25zdHJ1Y3RvciBhcmd1bWVudHMgZm9yIHRoZSBjcmVhdGVkCisgIC8vIG9iamVjdC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmc0PgorICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGFyZzMsIGNvbnN0IEFyZzQmIGFyZzQpIHsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIG5ldyBUKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOworICAgIH0gZWxzZSB7CisgICAgICByZXR1cm4gYXJlbmEtPkNyZWF0ZUludGVybmFsPFQ+KGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCk7CisgICAgfQorICB9CisKKyAgLy8gVmVyc2lvbiBvZiB0aGUgYWJvdmUgd2l0aCBmaXZlIGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZWQKKyAgLy8gb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzU+CisgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgVCogQ3JlYXRlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc1JiBhcmc1KSB7CisgICAgaWYgKGFyZW5hID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBuZXcgVChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPihnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUpOworICAgIH0KKyAgfQorCisgIC8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdpdGggc2l4IGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZWQKKyAgLy8gb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzUsIHR5cGVuYW1lIEFyZzY+CisgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgVCogQ3JlYXRlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsIGNvbnN0IEFyZzImIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywgY29uc3QgQXJnNCYgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc1JiBhcmc1LCBjb25zdCBBcmc2JiBhcmc2KSB7CisgICAgaWYgKGFyZW5hID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBuZXcgVChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPihnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYpOworICAgIH0KKyAgfQorCisgIC8vIFZlcnNpb24gb2YgdGhlIGFib3ZlIHdpdGggc2V2ZW4gY29uc3RydWN0b3IgYXJndW1lbnRzIGZvciB0aGUgY3JlYXRlZAorICAvLyBvYmplY3QuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNSwgdHlwZW5hbWUgQXJnNiwgdHlwZW5hbWUgQXJnNz4KKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHN0YXRpYyBUKiBDcmVhdGUoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczLCBjb25zdCBBcmc0JiBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzUmIGFyZzUsIGNvbnN0IEFyZzYmIGFyZzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNyYgYXJnNykgeworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gbmV3IFQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhcmVuYS0+Q3JlYXRlSW50ZXJuYWw8VD4oZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Omhhc190cml2aWFsX2Rlc3RydWN0b3I8VD46OnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3KTsKKyAgICB9CisgIH0KKworICAvLyBWZXJzaW9uIG9mIHRoZSBhYm92ZSB3aXRoIGVpZ2h0IGNvbnN0cnVjdG9yIGFyZ3VtZW50cyBmb3IgdGhlIGNyZWF0ZWQKKyAgLy8gb2JqZWN0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzUsIHR5cGVuYW1lIEFyZzYsIHR5cGVuYW1lIEFyZzcsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmc4PgorICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgc3RhdGljIFQqIENyZWF0ZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLCBjb25zdCBBcmcyJiBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGFyZzMsIGNvbnN0IEFyZzQmIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNSYgYXJnNSwgY29uc3QgQXJnNiYgYXJnNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc3JiBhcmc3LCBjb25zdCBBcmc4JiBhcmc4KSB7CisgICAgaWYgKGFyZW5hID09IE5VTEwpIHsKKyAgICAgIHJldHVybiBuZXcgVChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1LCBhcmc2LCBhcmc3LCBhcmc4KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGFyZW5hLT5DcmVhdGVJbnRlcm5hbDxUPigKKyAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aGFzX3RyaXZpYWxfZGVzdHJ1Y3RvcjxUPjo6dmFsdWUsCisgICAgICAgICAgYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCk7CisgICAgfQorICB9CisKKyAgLy8gQ3JlYXRlIGFuIGFycmF5IG9mIG9iamVjdCB0eXBlIFQgb24gdGhlIGFyZW5hICp3aXRob3V0KiBpbnZva2luZyB0aGUKKyAgLy8gY29uc3RydWN0b3Igb2YgVC4gSWYgYGFyZW5hYCBpcyBudWxsLCB0aGVuIHRoZSByZXR1cm4gdmFsdWUgc2hvdWxkIGJlIGZyZWVkCisgIC8vIHdpdGggYGRlbGV0ZVtdIHg7YCAob3IgYDo6b3BlcmF0b3IgZGVsZXRlW10oeCk7YCkuCisgIC8vIFRvIGVuc3VyZSBzYWZlIHVzZXMsIHRoaXMgZnVuY3Rpb24gY2hlY2tzIGF0IGNvbXBpbGUgdGltZQorICAvLyAod2hlbiBjb21waWxlZCBhcyBDKysxMSkgdGhhdCBUIGlzIHRyaXZpYWxseSBkZWZhdWx0LWNvbnN0cnVjdGlibGUgYW5kCisgIC8vIHRyaXZpYWxseSBkZXN0cnVjdGlibGUuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIFQqIENyZWF0ZUFycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hLCBzaXplX3QgbnVtX2VsZW1lbnRzKSB7CisgICAgR09PR0xFX0NIRUNLX0xFKG51bV9lbGVtZW50cywKKyAgICAgICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC8gc2l6ZW9mKFQpKQorICAgICAgICA8PCAiUmVxdWVzdGVkIHNpemUgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHNpemVfdC4iOworICAgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KDo6b3BlcmF0b3IgbmV3W10obnVtX2VsZW1lbnRzICogc2l6ZW9mKFQpKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBhcmVuYS0+Q3JlYXRlSW50ZXJuYWxSYXdBcnJheTxUPihudW1fZWxlbWVudHMpOworICAgIH0KKyAgfQorCisgIC8vIFJldHVybnMgdGhlIHRvdGFsIHNwYWNlIHVzZWQgYnkgdGhlIGFyZW5hLCB3aGljaCBpcyB0aGUgc3VtcyBvZiB0aGUgc2l6ZXMKKyAgLy8gb2YgdGhlIHVuZGVybHlpbmcgYmxvY2tzLiBUaGUgdG90YWwgc3BhY2UgdXNlZCBtYXkgbm90IGluY2x1ZGUgdGhlIG5ldworICAvLyBibG9ja3MgdGhhdCBhcmUgYWxsb2NhdGVkIGJ5IHRoaXMgYXJlbmEgZnJvbSBvdGhlciB0aHJlYWRzIGNvbmN1cnJlbnRseQorICAvLyB3aXRoIHRoZSBjYWxsIHRvIHRoaXMgbWV0aG9kLgorICBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHVpbnQ2NCBTcGFjZUFsbG9jYXRlZCgpIGNvbnN0OworICAvLyBBcyBhYm92ZSwgYnV0IGRvZXMgbm90IGluY2x1ZGUgYW55IGZyZWUgc3BhY2UgaW4gdW5kZXJseWluZyBibG9ja3MuCisgIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgdWludDY0IFNwYWNlVXNlZCgpIGNvbnN0OworCisgIC8vIENvbWJpbmVzIFNwYWNlQWxsb2NhdGVkIGFuZCBTcGFjZVVzZWQuIFJldHVybnMgYSBwYWlyIG9mCisgIC8vIDxzcGFjZV9hbGxvY2F0ZWQsIHNwYWNlX3VzZWQ+LgorICBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHBhaXI8dWludDY0LCB1aW50NjQ+IFNwYWNlQWxsb2NhdGVkQW5kVXNlZCgpIGNvbnN0OworCisgIC8vIEZyZWVzIGFsbCBzdG9yYWdlIGFsbG9jYXRlZCBieSB0aGlzIGFyZW5hIGFmdGVyIGNhbGxpbmcgZGVzdHJ1Y3RvcnMKKyAgLy8gcmVnaXN0ZXJlZCB3aXRoIE93bkRlc3RydWN0b3IoKSBhbmQgZnJlZWluZyBvYmplY3RzIHJlZ2lzdGVyZWQgd2l0aCBPd24oKS4KKyAgLy8gQW55IG9iamVjdHMgYWxsb2NhdGVkIG9uIHRoaXMgYXJlbmEgYXJlIHVudXNhYmxlIGFmdGVyIHRoaXMgY2FsbC4gSXQgYWxzbworICAvLyByZXR1cm5zIHRoZSB0b3RhbCBzcGFjZSB1c2VkIGJ5IHRoZSBhcmVuYSB3aGljaCBpcyB0aGUgc3VtcyBvZiB0aGUgc2l6ZXMKKyAgLy8gb2YgdGhlIGFsbG9jYXRlZCBibG9ja3MuIFRoaXMgbWV0aG9kIGlzIG5vdCB0aHJlYWQtc2FmZS4KKyAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSB1aW50NjQgUmVzZXQoKTsKKworICAvLyBBZGRzIHxvYmplY3R8IHRvIGEgbGlzdCBvZiBoZWFwLWFsbG9jYXRlZCBvYmplY3RzIHRvIGJlIGZyZWVkIHdpdGggfGRlbGV0ZXwKKyAgLy8gd2hlbiB0aGUgYXJlbmEgaXMgZGVzdHJveWVkIG9yIHJlc2V0LgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gR09PR0xFX0FUVFJJQlVURV9OT0lOTElORQorICB2b2lkIE93bihUKiBvYmplY3QpIHsKKyAgICBPd25JbnRlcm5hbChvYmplY3QsIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjppc19jb252ZXJ0aWJsZTxUKiwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKj4oKSk7CisgIH0KKworICAvLyBBZGRzIHxvYmplY3R8IHRvIGEgbGlzdCBvZiBvYmplY3RzIHdob3NlIGRlc3RydWN0b3JzIHdpbGwgYmUgbWFudWFsbHkKKyAgLy8gY2FsbGVkIHdoZW4gdGhlIGFyZW5hIGlzIGRlc3Ryb3llZCBvciByZXNldC4gVGhpcyBkaWZmZXJzIGZyb20gT3duKCkgaW4KKyAgLy8gdGhhdCBpdCBkb2VzIG5vdCBmcmVlIHRoZSB1bmRlcmx5aW5nIG1lbW9yeSB3aXRoIHxkZWxldGV8OyBoZW5jZSwgaXQgaXMKKyAgLy8gbm9ybWFsbHkgb25seSB1c2VkIGZvciBvYmplY3RzIHRoYXQgYXJlIHBsYWNlbWVudC1uZXdlZCBpbnRvCisgIC8vIGFyZW5hLWFsbG9jYXRlZCBtZW1vcnkuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCisgIHZvaWQgT3duRGVzdHJ1Y3RvcihUKiBvYmplY3QpIHsKKyAgICBpZiAob2JqZWN0ICE9IE5VTEwpIHsKKyAgICAgIEFkZExpc3ROb2RlKG9iamVjdCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOworICAgIH0KKyAgfQorCisgIC8vIEFkZHMgYSBjdXN0b20gbWVtYmVyIGZ1bmN0aW9uIG9uIGFuIG9iamVjdCB0byB0aGUgbGlzdCBvZiBkZXN0cnVjdG9ycyB0aGF0CisgIC8vIHdpbGwgYmUgbWFudWFsbHkgY2FsbGVkIHdoZW4gdGhlIGFyZW5hIGlzIGRlc3Ryb3llZCBvciByZXNldC4gVGhpcyBkaWZmZXJzCisgIC8vIGZyb20gT3duRGVzdHJ1Y3RvcigpIGluIHRoYXQgYW55IG1lbWJlciBmdW5jdGlvbiBtYXkgYmUgc3BlY2lmaWVkLCBub3Qgb25seQorICAvLyB0aGUgY2xhc3MgZGVzdHJ1Y3Rvci4KKyAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSB2b2lkIE93bkN1c3RvbURlc3RydWN0b3Iodm9pZCogb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpkZXN0cnVjdCkodm9pZCopKSB7CisgICAgQWRkTGlzdE5vZGUob2JqZWN0LCBkZXN0cnVjdCk7CisgIH0KKworICAvLyBSZXRyaWV2ZXMgdGhlIGFyZW5hIGFzc29jaWF0ZWQgd2l0aCB8dmFsdWV8IGlmIHx2YWx1ZXwgaXMgYW4gYXJlbmEtY2FwYWJsZQorICAvLyBtZXNzYWdlLCBvciBOVUxMIG90aGVyd2lzZS4gVGhpcyBkaWZmZXJzIGZyb20gdmFsdWUtPkdldEFyZW5hKCkgaW4gdGhhdCB0aGUKKyAgLy8gbGF0dGVyIGlzIGEgdmlydHVhbCBjYWxsLCB3aGlsZSB0aGlzIG1ldGhvZCBpcyBhIHRlbXBsYXRlZCBjYWxsIHRoYXQKKyAgLy8gcmVzb2x2ZXMgYXQgY29tcGlsZS10aW1lLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hKGNvbnN0IFQqIHZhbHVlKSB7CisgICAgcmV0dXJuIEdldEFyZW5hSW50ZXJuYWwodmFsdWUsIHN0YXRpY19jYXN0PFQqPigwKSk7CisgIH0KKworIHByaXZhdGU6CisgIHN0cnVjdCBJbnRlcm5hbElzQXJlbmFDb25zdHJ1Y3RhYmxlSGVscGVyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIHN0YXRpYyBjaGFyIEFyZW5hQ29uc3RydWN0YWJsZSgKKyAgICAgICAgY29uc3QgdHlwZW5hbWUgVTo6SW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfKik7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgZG91YmxlIEFyZW5hQ29uc3RydWN0YWJsZSguLi4pOworICB9OworCisgcHVibGljOgorICAvLyBIZWxwZXIgdHlwZXRyYWl0IHRoYXQgaW5kaWNhdGVzIHN1cHBvcnQgZm9yIGFyZW5hcyBpbiBhIHR5cGUgVCBhdCBjb21waWxlCisgIC8vIHRpbWUuIFRoaXMgaXMgcHVibGljIG9ubHkgdG8gYWxsb3cgY29uc3RydWN0aW9uIG9mIGhpZ2hlci1sZXZlbCB0ZW1wbGF0ZWQKKyAgLy8gdXRpbGl0aWVzLiBpc19hcmVuYV9jb25zdHJ1Y3RhYmxlPFQ+Ojp2YWx1ZSBpcyB0cnVlIGlmIHRoZSBtZXNzYWdlIHR5cGUgVAorICAvLyBoYXMgYXJlbmEgc3VwcG9ydCBlbmFibGVkLCBhbmQgZmFsc2Ugb3RoZXJ3aXNlLgorICAvLworICAvLyBUaGlzIGlzIGluc2lkZSBBcmVuYSBiZWNhdXNlIG9ubHkgQXJlbmEgaGFzIHRoZSBmcmllbmQgcmVsYXRpb25zaGlwcworICAvLyBuZWNlc3NhcnkgdG8gc2VlIHRoZSB1bmRlcmx5aW5nIGdlbmVyYXRlZCBjb2RlIHRyYWl0cy4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0cnVjdCBpc19hcmVuYV9jb25zdHJ1Y3RhYmxlCisgICAgICA6IHB1YmxpYyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6aW50ZWdyYWxfY29uc3RhbnQ8CisgICAgICAgICAgICBib29sLCBzaXplb2YoSW50ZXJuYWxJc0FyZW5hQ29uc3RydWN0YWJsZUhlbHBlcjo6QXJlbmFDb25zdHJ1Y3RhYmxlPAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IFQ+KHN0YXRpY19jYXN0PGNvbnN0IFQqPigwKSkpID09IHNpemVvZihjaGFyKT4geworICB9OworCisgcHJpdmF0ZToKKyAgLy8gQmxvY2tzIGFyZSB2YXJpYWJsZSBsZW5ndGggbWFsbG9jLWVkIG9iamVjdHMuICBUaGUgZm9sbG93aW5nIHN0cnVjdHVyZQorICAvLyBkZXNjcmliZXMgdGhlIGNvbW1vbiBoZWFkZXIgZm9yIGFsbCBibG9ja3MuCisgIHN0cnVjdCBCbG9jayB7CisgICAgdm9pZCogb3duZXI7ICAgLy8gJlRocmVhZENhY2hlIG9mIHRocmVhZCB0aGF0IG93bnMgdGhpcyBibG9jaywgb3IKKyAgICAgICAgICAgICAgICAgICAvLyAmdGhpcy0+b3duZXIgaWYgbm90IHlldCBvd25lZCBieSBhIHRocmVhZC4KKyAgICBCbG9jayogbmV4dDsgICAvLyBOZXh0IGJsb2NrIGluIGFyZW5hIChtYXkgaGF2ZSBkaWZmZXJlbnQgb3duZXIpCisgICAgLy8gKChjaGFyKikgJmJsb2NrKSArIHBvcyBpcyBuZXh0IGF2YWlsYWJsZSBieXRlLiBJdCBpcyBhbHdheXMKKyAgICAvLyBhbGlnbmVkIGF0IGEgbXVsdGlwbGUgb2YgOCBieXRlcy4KKyAgICBzaXplX3QgcG9zOworICAgIHNpemVfdCBzaXplOyAgLy8gdG90YWwgc2l6ZSBvZiB0aGUgYmxvY2suCisgICAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHNpemVfdCBhdmFpbCgpIGNvbnN0IHsgcmV0dXJuIHNpemUgLSBwb3M7IH0KKyAgICAvLyBkYXRhIGZvbGxvd3MKKyAgfTsKKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJpY1R5cGVIYW5kbGVyOworICBmcmllbmQgY2xhc3MgTW9ja0FyZW5hOyAgICAgICAgICAgICAgLy8gRm9yIHVuaXQtdGVzdGluZy4KKyAgZnJpZW5kIGNsYXNzIGludGVybmFsOjpBcmVuYVN0cmluZzsgIC8vIEZvciBBbGxvY2F0ZUFsaWduZWQuCisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6TGF6eUZpZWxkOyAgICAvLyBGb3IgQ3JlYXRlTWF5YmVNZXNzYWdlLgorCisgIHN0cnVjdCBUaHJlYWRDYWNoZSB7CisgICAgLy8gVGhlIFRocmVhZENhY2hlIGlzIGNvbnNpZGVyZWQgdmFsaWQgYXMgbG9uZyBhcyB0aGlzIG1hdGNoZXMgdGhlCisgICAgLy8gbGlmZWN5Y2xlX2lkIG9mIHRoZSBhcmVuYSBiZWluZyB1c2VkLgorICAgIGludDY0IGxhc3RfbGlmZWN5Y2xlX2lkX3NlZW47CisgICAgQmxvY2sqIGxhc3RfYmxvY2tfdXNlZF87CisgIH07CisKKyAgc3RhdGljIGNvbnN0IHNpemVfdCBrSGVhZGVyU2l6ZSA9IHNpemVvZihCbG9jayk7CisgIHN0YXRpYyBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6U2VxdWVuY2VOdW1iZXIgbGlmZWN5Y2xlX2lkX2dlbmVyYXRvcl87CisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFETE9DQUwpCisgIC8vIEFuZHJvaWQgbmRrIGRvZXMgbm90IHN1cHBvcnQgR09PR0xFX1RIUkVBRF9MT0NBTCBrZXl3b3JkIHNvIHdlIHVzZSBhIGN1c3RvbSB0aHJlYWQKKyAgLy8gbG9jYWwgc3RvcmFnZSBjbGFzcyB3ZSBpbXBsZW1lbnRlZC4KKyAgLy8gaU9TIGFsc28gZG9lcyBub3Qgc3VwcG9ydCB0aGUgR09PR0xFX1RIUkVBRF9MT0NBTCBrZXl3b3JkLgorICBzdGF0aWMgVGhyZWFkQ2FjaGUmIHRocmVhZF9jYWNoZSgpOworI2VsaWYgZGVmaW5lZChQUk9UT0JVRl9VU0VfRExMUykKKyAgLy8gVGhyZWFkIGxvY2FsIHZhcmlhYmxlcyBjYW5ub3QgYmUgZXhwb3NlZCB0aHJvdWdoIERMTCBpbnRlcmZhY2UgYnV0IHdlIGNhbgorICAvLyB3cmFwIHRoZW0gaW4gc3RhdGljIGZ1bmN0aW9ucy4KKyAgc3RhdGljIFRocmVhZENhY2hlJiB0aHJlYWRfY2FjaGUoKTsKKyNlbHNlCisgIHN0YXRpYyBHT09HTEVfVEhSRUFEX0xPQ0FMIFRocmVhZENhY2hlIHRocmVhZF9jYWNoZV87CisgIHN0YXRpYyBUaHJlYWRDYWNoZSYgdGhyZWFkX2NhY2hlKCkgeyByZXR1cm4gdGhyZWFkX2NhY2hlXzsgfQorI2VuZGlmCisKKyAgLy8gU0ZJTkFFIGZvciBza2lwcGluZyBhZGRpdGlvbiB0byBkZWxldGUgbGlzdCBmb3IgYSBtZXNzYWdlIHR5cGUgd2hlbiBjcmVhdGVkCisgIC8vIHdpdGggQ3JlYXRlTWVzc2FnZS4gVGhpcyBpcyBtYWlubHkgdG8gc2tpcCBwcm90bzIvcHJvdG8xIG1lc3NhZ2Ugb2JqZWN0cworICAvLyB3aXRoIGNjX2VuYWJsZV9hcmVuYXM9dHJ1ZSBmcm9tIGJlaW5nIHBhcnQgb2YgdGhlIGRlbGV0ZSBsaXN0LiBBbHNvLCBub3RlLAorICAvLyBjb21waWxlciB3aWxsIG9wdGltaXplIG91dCB0aGUgYnJhbmNoIGluIENyZWF0ZUludGVybmFsPFQ+LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIGJvb2wgU2tpcERlbGV0ZUxpc3QodHlwZW5hbWUgVDo6RGVzdHJ1Y3RvclNraXBwYWJsZV8qKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworICAvLyBGb3IgbWVzc2FnZSBvYmplY3RzIHRoYXQgZG9uJ3QgaGF2ZSB0aGUgRGVzdHJ1Y3RvclNraXBwYWJsZV8gdHJhaXQsIHdlCisgIC8vIGFsd2F5cyBhZGQgdG8gdGhlIGRlbGV0ZSBsaXN0LgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdGF0aWMgaW5saW5lIGJvb2wgU2tpcERlbGV0ZUxpc3QoLi4uKSB7CisgICAgcmV0dXJuIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpoYXNfdHJpdmlhbF9kZXN0cnVjdG9yPFQ+Ojp2YWx1ZTsKKyAgfQorCisgcHJpdmF0ZToKKyAgc3RydWN0IEludGVybmFsSXNEZXN0cnVjdG9yU2tpcHBhYmxlSGVscGVyIHsKKyAgICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPgorICAgIHN0YXRpYyBjaGFyIERlc3RydWN0b3JTa2lwcGFibGUoCisgICAgICAgIGNvbnN0IHR5cGVuYW1lIFU6OkRlc3RydWN0b3JTa2lwcGFibGVfKik7CisgICAgdGVtcGxhdGU8dHlwZW5hbWUgVT4KKyAgICBzdGF0aWMgZG91YmxlIERlc3RydWN0b3JTa2lwcGFibGUoLi4uKTsKKyAgfTsKKworIHB1YmxpYzoKKyAgLy8gSGVscGVyIHR5cGV0cmFpdCB0aGF0IGluZGljYXRlcyB3aGV0aGVyIHRoZSBkZXNjdHJ1Y3RvciBvZiB0eXBlIFQgc2hvdWxkIGJlCisgIC8vIGNhbGxlZCB3aGVuIGFyZW5hIGlzIGRlc3Ryb3llZCBhdCBjb21waWxlIHRpbWUuIFRoaXMgaXMgb25seSB0byBhbGxvdworICAvLyBjb25zdHJ1Y3Rpb24gb2YgaGlnaGVyLWxldmVsIHRlbXBsYXRlZCB1dGlsaXRpZXMuCisgIC8vIGlzX2Rlc3RydWN0b3Jfc2tpcHBhYmxlPFQ+Ojp2YWx1ZSBpcyB0cnVlIGlmIHRoZSBkZXN0cnVjdG9yIG9mIHRoZSBtZXNzYWdlCisgIC8vIHR5cGUgVCBzaG91bGQgbm90IGJlIGNhbGxlZCB3aGVuIGFyZW5hIGlzIGRlc3Ryb3llZCBvciBmYWxzZSBvdGhlcndpc2UuCisgIC8vIFRoaXMgaXMgaW5zaWRlIEFyZW5hIGJlY2F1c2Ugb25seSBBcmVuYSBoYXMgdGhlIGZyaWVuZCByZWxhdGlvbnNoaXBzCisgIC8vIG5lY2Vzc2FyeSB0byBzZWUgdGhlIHVuZGVybHlpbmcgZ2VuZXJhdGVkIGNvZGUgdHJhaXRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBzdHJ1Y3QgaXNfZGVzdHJ1Y3Rvcl9za2lwcGFibGUKKyAgICAgIDogcHVibGljIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjppbnRlZ3JhbF9jb25zdGFudDwKKyAgICAgICAgICAgIGJvb2wsCisgICAgICAgICAgICBzaXplb2YoSW50ZXJuYWxJc0Rlc3RydWN0b3JTa2lwcGFibGVIZWxwZXI6OkRlc3RydWN0b3JTa2lwcGFibGU8CisgICAgICAgICAgICAgICAgICAgY29uc3QgVD4oc3RhdGljX2Nhc3Q8Y29uc3QgVCo+KDApKSkgPT0gc2l6ZW9mKGNoYXIpIHx8CisgICAgICAgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Omhhc190cml2aWFsX2Rlc3RydWN0b3I8VD46OnZhbHVlPiB7fTsKKworICAvLyBDcmVhdGVNZXNzYWdlPFQ+IHJlcXVpcmVzIHRoYXQgVCBzdXBwb3J0cyBhcmVuYXMsIGJ1dCB0aGlzIHByaXZhdGUgbWV0aG9kCisgIC8vIHdvcmtzIHdoZXRoZXIgb3Igbm90IFQgc3VwcG9ydHMgYXJlbmFzLiBUaGVzZSBhcmUgbm90IGV4cG9zZWQgdG8gdXNlciBjb2RlCisgIC8vIGFzIGl0IGNhbiBjYXVzZSBjb25mdXNpbmcgQVBJIHVzYWdlcywgYW5kIGVuZCB1cCBoYXZpbmcgZG91YmxlIGZyZWUgaW4KKyAgLy8gdXNlciBjb2RlLiBUaGVzZSBhcmUgdXNlZCBvbmx5IGludGVybmFsbHkgZnJvbSBMYXp5RmllbGQgYW5kIFJlcGVhdGVkCisgIC8vIGZpZWxkcywgc2luY2UgdGhleSBhcmUgZGVzaWduZWQgdG8gd29yayBpbiBhbGwgbW9kZSBjb21iaW5hdGlvbnMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIE1zZz4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIHN0YXRpYyBNc2cqIENyZWF0ZU1heWJlTWVzc2FnZSgKKyAgICAgIEFyZW5hKiBhcmVuYSwgdHlwZW5hbWUgTXNnOjpJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8qKSB7CisgICAgcmV0dXJuIENyZWF0ZU1lc3NhZ2U8TXNnPihhcmVuYSk7CisgIH0KKworICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIFQqIENyZWF0ZU1heWJlTWVzc2FnZShBcmVuYSogYXJlbmEsIC4uLikgeworICAgIHJldHVybiBDcmVhdGU8VD4oYXJlbmEpOworICB9CisKKyAgLy8gSnVzdCBhbGxvY2F0ZSB0aGUgcmVxdWlyZWQgc2l6ZSBmb3IgdGhlIGdpdmVuIHR5cGUgYXNzdW1pbmcgdGhlCisgIC8vIHR5cGUgaGFzIGEgdHJpdmlhbCBjb25zdHJ1Y3Rvci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFQqIENyZWF0ZUludGVybmFsUmF3QXJyYXkoc2l6ZV90IG51bV9lbGVtZW50cykgeworICAgIEdPT0dMRV9DSEVDS19MRShudW1fZWxlbWVudHMsCisgICAgICAgICAgICAgc3RkOjpudW1lcmljX2xpbWl0czxzaXplX3Q+OjptYXgoKSAvIHNpemVvZihUKSkKKyAgICAgICAgPDwgIlJlcXVlc3RlZCBzaXplIGlzIHRvbyBsYXJnZSB0byBmaXQgaW50byBzaXplX3QuIjsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VCo+KAorICAgICAgICBBbGxvY2F0ZUFsaWduZWQoUlRUSV9UWVBFX0lEKFQpLCBzaXplb2YoVCkgKiBudW1fZWxlbWVudHMpKTsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgVCogQ3JlYXRlSW50ZXJuYWwoYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgeworICAgIFQqIHQgPSBuZXcgKEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSkpIFQoKTsKKyAgICBpZiAoIXNraXBfZXhwbGljaXRfb3duZXJzaGlwKSB7CisgICAgICBBZGRMaXN0Tm9kZSh0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7CisgICAgfQorICAgIHJldHVybiB0OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZz4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFQqIENyZWF0ZUludGVybmFsKGJvb2wgc2tpcF9leHBsaWNpdF9vd25lcnNoaXAsIGNvbnN0IEFyZyYgYXJnKSB7CisgICAgVCogdCA9IG5ldyAoQWxsb2NhdGVBbGlnbmVkKFJUVElfVFlQRV9JRChUKSwgc2l6ZW9mKFQpKSkgVChhcmcpOworICAgIGlmICghc2tpcF9leHBsaWNpdF9vd25lcnNoaXApIHsKKyAgICAgIEFkZExpc3ROb2RlKHQsICZpbnRlcm5hbDo6YXJlbmFfZGVzdHJ1Y3Rfb2JqZWN0PFQ+KTsKKyAgICB9CisgICAgcmV0dXJuIHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFQqIENyZWF0ZUludGVybmFsKAorICAgICAgYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCwgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMikgeworICAgIFQqIHQgPSBuZXcgKEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSkpIFQoYXJnMSwgYXJnMik7CisgICAgaWYgKCFza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgeworICAgICAgQWRkTGlzdE5vZGUodCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOworICAgIH0KKyAgICByZXR1cm4gdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczPgorICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgVCogQ3JlYXRlSW50ZXJuYWwoYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMiYgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMykgeworICAgIFQqIHQgPSBuZXcgKEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSkpCisgICAgICAgIFQoYXJnMSwgYXJnMiwgYXJnMyk7CisgICAgaWYgKCFza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgeworICAgICAgQWRkTGlzdE5vZGUodCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOworICAgIH0KKyAgICByZXR1cm4gdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJnND4KKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIFQqIENyZWF0ZUludGVybmFsKGJvb2wgc2tpcF9leHBsaWNpdF9vd25lcnNoaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzImIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzQmIGFyZzQpIHsKKyAgICBUKiB0ID0gbmV3IChBbGxvY2F0ZUFsaWduZWQoUlRUSV9UWVBFX0lEKFQpLCBzaXplb2YoVCkpKQorICAgICAgICBUKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQpOworICAgIGlmICghc2tpcF9leHBsaWNpdF9vd25lcnNoaXApIHsKKyAgICAgIEFkZExpc3ROb2RlKHQsICZpbnRlcm5hbDo6YXJlbmFfZGVzdHJ1Y3Rfb2JqZWN0PFQ+KTsKKyAgICB9CisgICAgcmV0dXJuIHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzU+CisgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBUKiBDcmVhdGVJbnRlcm5hbChib29sIHNraXBfZXhwbGljaXRfb3duZXJzaGlwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcxJiBhcmcxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmcyJiBhcmcyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmczJiBhcmczLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc0JiBhcmc0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBcmc1JiBhcmc1KSB7CisgICAgVCogdCA9IG5ldyAoQWxsb2NhdGVBbGlnbmVkKFJUVElfVFlQRV9JRChUKSwgc2l6ZW9mKFQpKSkKKyAgICAgICAgVChhcmcxLCBhcmcyLCBhcmczLCBhcmc0LCBhcmc1KTsKKyAgICBpZiAoIXNraXBfZXhwbGljaXRfb3duZXJzaGlwKSB7CisgICAgICBBZGRMaXN0Tm9kZSh0LCAmaW50ZXJuYWw6OmFyZW5hX2Rlc3RydWN0X29iamVjdDxUPik7CisgICAgfQorICAgIHJldHVybiB0OworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzIsIHR5cGVuYW1lIEFyZzMsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmc0LCB0eXBlbmFtZSBBcmc1LCB0eXBlbmFtZSBBcmc2PgorICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgVCogQ3JlYXRlSW50ZXJuYWwoYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMiYgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNCYgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNSYgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNiYgYXJnNikgeworICAgIFQqIHQgPSBuZXcgKEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSkpCisgICAgICAgIFQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNik7CisgICAgaWYgKCFza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgeworICAgICAgQWRkTGlzdE5vZGUodCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOworICAgIH0KKyAgICByZXR1cm4gdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBULCB0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyLCB0eXBlbmFtZSBBcmczLAorICAgICAgICAgICAgdHlwZW5hbWUgQXJnNCwgdHlwZW5hbWUgQXJnNSwgdHlwZW5hbWUgQXJnNiwgdHlwZW5hbWUgQXJnNz4KKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIFQqIENyZWF0ZUludGVybmFsKGJvb2wgc2tpcF9leHBsaWNpdF9vd25lcnNoaXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzEmIGFyZzEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzImIGFyZzIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzMmIGFyZzMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzQmIGFyZzQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzUmIGFyZzUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzYmIGFyZzYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFyZzcmIGFyZzcpIHsKKyAgICBUKiB0ID0gbmV3IChBbGxvY2F0ZUFsaWduZWQoUlRUSV9UWVBFX0lEKFQpLCBzaXplb2YoVCkpKQorICAgICAgICBUKGFyZzEsIGFyZzIsIGFyZzMsIGFyZzQsIGFyZzUsIGFyZzYsIGFyZzcpOworICAgIGlmICghc2tpcF9leHBsaWNpdF9vd25lcnNoaXApIHsKKyAgICAgIEFkZExpc3ROb2RlKHQsICZpbnRlcm5hbDo6YXJlbmFfZGVzdHJ1Y3Rfb2JqZWN0PFQ+KTsKKyAgICB9CisgICAgcmV0dXJuIHQ7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMiwgdHlwZW5hbWUgQXJnMywKKyAgICAgICAgICAgIHR5cGVuYW1lIEFyZzQsIHR5cGVuYW1lIEFyZzUsIHR5cGVuYW1lIEFyZzYsIHR5cGVuYW1lIEFyZzcsCisgICAgICAgICAgICB0eXBlbmFtZSBBcmc4PgorICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgVCogQ3JlYXRlSW50ZXJuYWwoYm9vbCBza2lwX2V4cGxpY2l0X293bmVyc2hpcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMiYgYXJnMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMyYgYXJnMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNCYgYXJnNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNSYgYXJnNSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNiYgYXJnNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnNyYgYXJnNywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnOCYgYXJnOCkgeworICAgIFQqIHQgPSBuZXcgKEFsbG9jYXRlQWxpZ25lZChSVFRJX1RZUEVfSUQoVCksIHNpemVvZihUKSkpCisgICAgICAgIFQoYXJnMSwgYXJnMiwgYXJnMywgYXJnNCwgYXJnNSwgYXJnNiwgYXJnNywgYXJnOCk7CisgICAgaWYgKCFza2lwX2V4cGxpY2l0X293bmVyc2hpcCkgeworICAgICAgQWRkTGlzdE5vZGUodCwgJmludGVybmFsOjphcmVuYV9kZXN0cnVjdF9vYmplY3Q8VD4pOworICAgIH0KKyAgICByZXR1cm4gdDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgVCogQ3JlYXRlTWVzc2FnZUludGVybmFsKHR5cGVuYW1lIFQ6OkludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXyopIHsKKyAgICByZXR1cm4gQ3JlYXRlSW50ZXJuYWw8VCwgQXJlbmEqPihTa2lwRGVsZXRlTGlzdDxUPihzdGF0aWNfY2FzdDxUKj4oMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEFyZz4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFQqIENyZWF0ZU1lc3NhZ2VJbnRlcm5hbCh0eXBlbmFtZSBUOjpJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnJiBhcmcpIHsKKyAgICByZXR1cm4gQ3JlYXRlSW50ZXJuYWw8VCwgQXJlbmEqPihTa2lwRGVsZXRlTGlzdDxUPihzdGF0aWNfY2FzdDxUKj4oMCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoaXMsIGFyZyk7CisgIH0KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVCwgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIFQqIENyZWF0ZU1lc3NhZ2VJbnRlcm5hbCh0eXBlbmFtZSBUOjpJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8qLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQXJnMSYgYXJnMSwgY29uc3QgQXJnMiYgYXJnMikgeworICAgIHJldHVybiBDcmVhdGVJbnRlcm5hbDxULCBBcmVuYSo+KFNraXBEZWxldGVMaXN0PFQ+KHN0YXRpY19jYXN0PFQqPigwKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcywgYXJnMSwgYXJnMik7CisgIH0KKworICAvLyBDcmVhdGVJbkFyZW5hU3RvcmFnZSBpcyB1c2VkIHRvIGltcGxlbWVudCBtYXAgZmllbGQuIFdpdGhvdXQgaXQsCisgIC8vIGdvb2dsZTo6cHJvdG9idWY6Ok1hcCBuZWVkIHRvIGNhbGwgZ2VuZXJhdGVkIG1lc3NhZ2UncyBwcm90ZWN0ZWQgYXJlbmEgY29uc3RydWN0b3IsCisgIC8vIHdoaWNoIG5lZWRzIHRvIGRlY2xhcmUgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwIGFzIGZyaWVuZCBvZiBnZW5lcmF0ZWQgbWVzc2FnZS4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIENyZWF0ZUluQXJlbmFTdG9yYWdlKFQqIHB0ciwgQXJlbmEqIGFyZW5hKSB7CisgICAgQ3JlYXRlSW5BcmVuYVN0b3JhZ2VJbnRlcm5hbChwdHIsIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZW5hbWUgaXNfYXJlbmFfY29uc3RydWN0YWJsZTxUPjo6dHlwZSgpKTsKKyAgICBSZWdpc3RlckRlc3RydWN0b3JJbnRlcm5hbChwdHIsIGFyZW5hLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIGlzX2Rlc3RydWN0b3Jfc2tpcHBhYmxlPFQ+Ojp0eXBlKCkpOworICB9CisKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIHN0YXRpYyB2b2lkIENyZWF0ZUluQXJlbmFTdG9yYWdlSW50ZXJuYWwoCisgICAgICBUKiBwdHIsIEFyZW5hKiBhcmVuYSwgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSkgeworICAgIG5ldyAocHRyKSBUKGFyZW5hKTsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4KKyAgc3RhdGljIHZvaWQgQ3JlYXRlSW5BcmVuYVN0b3JhZ2VJbnRlcm5hbCgKKyAgICAgIFQqIHB0ciwgQXJlbmEqIC8qYXJlbmEqLywgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmZhbHNlX3R5cGUpIHsKKyAgICBuZXcgKHB0cikgVDsKKyAgfQorCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdm9pZCBSZWdpc3RlckRlc3RydWN0b3JJbnRlcm5hbCgKKyAgICAgIFQqIC8qcHRyKi8sIEFyZW5hKiAvKmFyZW5hKi8sIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUpIHt9CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgorICBzdGF0aWMgdm9pZCBSZWdpc3RlckRlc3RydWN0b3JJbnRlcm5hbCgKKyAgICAgIFQqIHB0ciwgQXJlbmEqIGFyZW5hLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZmFsc2VfdHlwZSkgeworICAgIGFyZW5hLT5Pd25EZXN0cnVjdG9yKHB0cik7CisgIH0KKworICAvLyBUaGVzZSBpbXBsZW1lbnQgT3duKCksIHdoaWNoIHJlZ2lzdGVycyBhbiBvYmplY3QgZm9yIGRlbGV0aW9uIChkZXN0cnVjdG9yCisgIC8vIGNhbGwgYW5kIG9wZXJhdG9yIGRlbGV0ZSgpKS4gVGhlIHNlY29uZCBwYXJhbWV0ZXIgaGFzIHR5cGUgJ3RydWVfdHlwZScgaWYgVAorICAvLyBpcyBhIHN1YnR5cGUgb2YgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIGFuZCAnZmFsc2VfdHlwZScgb3RoZXJ3aXNlLiBDb2xsYXBzaW5nCisgIC8vIGFsbCB0ZW1wbGF0ZSBpbnN0YW50aWF0aW9ucyB0byBvbmUgZm9yIGdlbmVyaWMgTWVzc2FnZSByZWR1Y2VzIGNvZGUgc2l6ZSwKKyAgLy8gdXNpbmcgdGhlIHZpcnR1YWwgZGVzdHJ1Y3RvciBpbnN0ZWFkLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgdm9pZCBPd25JbnRlcm5hbChUKiBvYmplY3QsIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUpIHsKKyAgICBpZiAob2JqZWN0ICE9IE5VTEwpIHsKKyAgICAgIEFkZExpc3ROb2RlKG9iamVjdCwgJmludGVybmFsOjphcmVuYV9kZWxldGVfb2JqZWN0PCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgPik7CisgICAgfQorICB9CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICB2b2lkIE93bkludGVybmFsKFQqIG9iamVjdCwgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmZhbHNlX3R5cGUpIHsKKyAgICBpZiAob2JqZWN0ICE9IE5VTEwpIHsKKyAgICAgIEFkZExpc3ROb2RlKG9iamVjdCwgJmludGVybmFsOjphcmVuYV9kZWxldGVfb2JqZWN0PFQ+KTsKKyAgICB9CisgIH0KKworICAvLyBJbXBsZW1lbnRhdGlvbiBmb3IgR2V0QXJlbmEoKS4gT25seSBtZXNzYWdlIG9iamVjdHMgd2l0aAorICAvLyBJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8gdGFncyBjYW4gYmUgYXNzb2NpYXRlZCB3aXRoIGFuIGFyZW5hLCBhbmQgc3VjaAorICAvLyBvYmplY3RzIG11c3QgaW1wbGVtZW50IGEgR2V0QXJlbmFOb1ZpcnR1YWwoKSBtZXRob2QuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBzdGF0aWMgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFJbnRlcm5hbCgKKyAgICAgIGNvbnN0IFQqIHZhbHVlLCB0eXBlbmFtZSBUOjpJbnRlcm5hbEFyZW5hQ29uc3RydWN0YWJsZV8qKSB7CisgICAgcmV0dXJuIHZhbHVlLT5HZXRBcmVuYU5vVmlydHVhbCgpOworICB9CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4gR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisgIHN0YXRpYyA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYUludGVybmFsKGNvbnN0IFQqIC8qdmFsdWUqLywgLi4uKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICAvLyBBbGxvY2F0ZSBhbmQgYWxzbyBvcHRpb25hbGx5IGNhbGwgb25fYXJlbmFfYWxsb2NhdGlvbiBjYWxsYmFjayB3aXRoIHRoZQorICAvLyBhbGxvY2F0ZWQgdHlwZSBpbmZvIHdoZW4gdGhlIGhvb2tzIGFyZSBpbiBwbGFjZSBpbiBBcmVuYU9wdGlvbnMgYW5kCisgIC8vIHRoZSBjb29raWUgaXMgbm90IG51bGwuCisgIHZvaWQqIEFsbG9jYXRlQWxpZ25lZChjb25zdCBzdGQ6OnR5cGVfaW5mbyogYWxsb2NhdGVkLCBzaXplX3Qgbik7CisKKyAgLy8gQWxsb2NhdGUgYW4gaW50ZXJuYWwgYWxsb2NhdGlvbiwgYXZvaWRpbmcgb3B0aW9uYWwgdHlwZWQgbW9uaXRvcmluZy4KKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHZvaWQqIEFsbG9jYXRlQWxpZ25lZChzaXplX3QgbikgeworICAgIHJldHVybiBBbGxvY2F0ZUFsaWduZWQoTlVMTCwgbik7CisgIH0KKworICB2b2lkIEluaXQoKTsKKworICAvLyBGcmVlIGFsbCBibG9ja3MgYW5kIHJldHVybiB0aGUgdG90YWwgc3BhY2UgdXNlZCB3aGljaCBpcyB0aGUgc3VtcyBvZiBzaXplcworICAvLyBvZiB0aGUgYWxsIHRoZSBhbGxvY2F0ZWQgYmxvY2tzLgorICB1aW50NjQgRnJlZUJsb2NrcygpOworCisgIC8vIEFkZCBvYmplY3QgcG9pbnRlciBhbmQgY2xlYW51cCBmdW5jdGlvbiBwb2ludGVyIHRvIHRoZSBsaXN0LgorICAvLyBUT0RPKHJvaGFuYW5pbCwgY2ZhbGxpbik6IFdlIGNvdWxkIHBhc3MgaW4gYSBzdWItYXJlbmEgaW50byB0aGlzIG1ldGhvZAorICAvLyB0byBhdm9pZCBwb2xsdXRpbmcgYmxvY2tzIG9mIHRoaXMgYXJlbmEgd2l0aCBsaXN0IG5vZGVzLiBUaGlzIHdvdWxkIGhlbHAgaW4KKyAgLy8gbWl4ZWQgbW9kZSAod2hlcmUgbWFueSBwcm90b2J1ZnMgaGF2ZSBjY19lbmFibGVfYXJlbmFzPWZhbHNlKSwgYW5kIGlzIGFuCisgIC8vIGFsdGVybmF0aXZlIHRvIGEgY2h1bmtlZCBsaW5rZWQtbGlzdCwgYnV0IHdpdGggZXh0cmEgb3ZlcmhlYWQgb2YgKm5leHQuCisgIHZvaWQgQWRkTGlzdE5vZGUodm9pZCogZWxlbSwgdm9pZCAoKmNsZWFudXApKHZvaWQqKSk7CisgIC8vIERlbGV0ZSBvciBEZXN0cnVjdCBhbGwgb2JqZWN0cyBvd25lZCBieSB0aGUgYXJlbmEuCisgIHZvaWQgQ2xlYW51cExpc3QoKTsKKyAgdWludDY0IFJlc2V0SW50ZXJuYWwoKTsKKworICBpbmxpbmUgdm9pZCBTZXRUaHJlYWRDYWNoZUJsb2NrKEJsb2NrKiBibG9jaykgeworICAgIHRocmVhZF9jYWNoZSgpLmxhc3RfYmxvY2tfdXNlZF8gPSBibG9jazsKKyAgICB0aHJlYWRfY2FjaGUoKS5sYXN0X2xpZmVjeWNsZV9pZF9zZWVuID0gbGlmZWN5Y2xlX2lkXzsKKyAgfQorCisgIGludDY0IGxpZmVjeWNsZV9pZF87ICAvLyBVbmlxdWUgZm9yIGVhY2ggYXJlbmEuIENoYW5nZXMgb24gUmVzZXQoKS4KKworICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXRvbWljV29yZCBibG9ja3NfOyAgLy8gSGVhZCBvZiBsaW5rZWQgbGlzdCBvZiBhbGwgYWxsb2NhdGVkIGJsb2NrcworICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXRvbWljV29yZCBoaW50XzsgICAgLy8gRmFzdCB0aHJlYWQtbG9jYWwgYmxvY2sgYWNjZXNzCisKKyAgLy8gTm9kZSBjb250YWlucyB0aGUgcHRyIG9mIHRoZSBvYmplY3QgdG8gYmUgY2xlYW5lZCB1cCBhbmQgdGhlIGFzc29jaWF0ZWQKKyAgLy8gY2xlYW51cCBmdW5jdGlvbiBwdHIuCisgIHN0cnVjdCBOb2RlIHsKKyAgICB2b2lkKiBlbGVtOyAgICAgICAgICAgICAgLy8gUG9pbnRlciB0byB0aGUgb2JqZWN0IHRvIGJlIGNsZWFuZWQgdXAuCisgICAgdm9pZCAoKmNsZWFudXApKHZvaWQqKTsgIC8vIEZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGRlc3RydWN0b3Igb3IgZGVsZXRlci4KKyAgICBOb2RlKiBuZXh0OyAgICAgICAgICAgICAgLy8gTmV4dCBub2RlIGluIHRoZSBsaXN0LgorICB9OworCisgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBdG9taWNXb3JkIGNsZWFudXBfbGlzdF87ICAvLyBIZWFkIG9mIGEgbGlua2VkIGxpc3Qgb2Ygbm9kZXMgY29udGFpbmluZyBvYmplY3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gcHRycyBhbmQgY2xlYW51cCBtZXRob2RzLgorCisgIGJvb2wgb3duc19maXJzdF9ibG9ja187ICAgIC8vIEluZGljYXRlcyB0aGF0IGFyZW5hIG93bnMgdGhlIGZpcnN0IGJsb2NrCisgIE11dGV4IGJsb2Nrc19sb2NrXzsKKworICB2b2lkIEFkZEJsb2NrKEJsb2NrKiBiKTsKKyAgLy8gQWNjZXNzIG11c3QgYmUgc3luY2hyb25pemVkLCBlaXRoZXIgYnkgYmxvY2tzX2xvY2tfIG9yIGJ5IGJlaW5nIGNhbGxlZCBmcm9tCisgIC8vIEluaXQoKS9SZXNldCgpLgorICB2b2lkIEFkZEJsb2NrSW50ZXJuYWwoQmxvY2sqIGIpOworICB2b2lkKiBTbG93QWxsb2Moc2l6ZV90IG4pOworICBCbG9jayogRmluZEJsb2NrKHZvaWQqIG1lKTsKKyAgQmxvY2sqIE5ld0Jsb2NrKHZvaWQqIG1lLCBCbG9jayogbXlfbGFzdF9ibG9jaywgc2l6ZV90IG4sCisgICAgICAgICAgICAgICAgICBzaXplX3Qgc3RhcnRfYmxvY2tfc2l6ZSwgc2l6ZV90IG1heF9ibG9ja19zaXplKTsKKyAgc3RhdGljIHZvaWQqIEFsbG9jRnJvbUJsb2NrKEJsb2NrKiBiLCBzaXplX3Qgbik7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIFQ+CisgIGZyaWVuZCBjbGFzcyBNYXA7CisKKyAgLy8gVGhlIGFyZW5hIG1heSBzYXZlIGEgY29va2llIGl0IHJlY2VpdmVzIGZyb20gdGhlIGV4dGVybmFsIG9uX2luaXQgaG9vaworICAvLyBhbmQgdGhlbiB1c2UgaXQgd2hlbiBjYWxsaW5nIHRoZSBvbl9yZXNldCBhbmQgb25fZGVzdHJ1Y3Rpb24gaG9va3MuCisgIHZvaWQqIGhvb2tzX2Nvb2tpZV87CisKKyAgQXJlbmFPcHRpb25zIG9wdGlvbnNfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhBcmVuYSk7Cit9OworCisvLyBEZWZpbmVkIGFib3ZlIGZvciBzdXBwb3J0aW5nIGVudmlyb25tZW50cyB3aXRob3V0IFJUVEkuCisjdW5kZWYgUlRUSV9UWVBFX0lECisKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BUkVOQV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfbmMuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV9uYy5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV9uYy5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfbmMuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfbmNfdGVzdC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hX25jX3Rlc3QucHkKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfbmNfdGVzdC5weQpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfbmNfdGVzdC5weQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV90ZXN0X3V0aWwuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdGVzdF91dGlsLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYV91bml0dGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvYXJlbmFzdHJpbmcuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nX3VuaXR0ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZ191bml0dGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYwppbmRleCA0NTVjMjM5Li40NzNlYjRlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzQsNiArMzQsNyBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogCkBAIC00NCw2ICs0NSwxMSBAQAogQ29kZUdlbmVyYXRvcjo6fkNvZGVHZW5lcmF0b3IoKSB7fQogR2VuZXJhdG9yQ29udGV4dDo6fkdlbmVyYXRvckNvbnRleHQoKSB7fQogCitpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qCitHZW5lcmF0b3JDb250ZXh0OjpPcGVuRm9yQXBwZW5kKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKKyAgcmV0dXJuIE5VTEw7Cit9CisKIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogR2VuZXJhdG9yQ29udGV4dDo6T3BlbkZvckluc2VydCgKICAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGluc2VydGlvbl9wb2ludCkgewogICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBHZW5lcmF0b3JDb250ZXh0IGRvZXMgbm90IHN1cHBvcnQgaW5zZXJ0aW9uLiI7CkBAIC01OCw4ICs2NCw3IEBACiAvLyBQYXJzZXMgYSBzZXQgb2YgY29tbWEtZGVsaW1pdGVkIG5hbWUvdmFsdWUgcGFpcnMuCiB2b2lkIFBhcnNlR2VuZXJhdG9yUGFyYW1ldGVyKGNvbnN0IHN0cmluZyYgdGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4qIG91dHB1dCkgewotICB2ZWN0b3I8c3RyaW5nPiBwYXJ0czsKLSAgU3BsaXRTdHJpbmdVc2luZyh0ZXh0LCAiLCIsICZwYXJ0cyk7CisgIHZlY3RvcjxzdHJpbmc+IHBhcnRzID0gU3BsaXQodGV4dCwgIiwiLCB0cnVlKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKSB7CiAgICAgc3RyaW5nOjpzaXplX3R5cGUgZXF1YWxzX3BvcyA9IHBhcnRzW2ldLmZpbmRfZmlyc3Rfb2YoJz0nKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oCmluZGV4IDI1MmY2OGQuLmI5ODlmMTUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNzksNiArNzksMzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGdlbmVyYXRvcl9jb250ZXh0LAogICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBlcnJvcikgY29uc3QgPSAwOwogCisgIC8vIEdlbmVyYXRlcyBjb2RlIGZvciBhbGwgZ2l2ZW4gcHJvdG8gZmlsZXMsIGdlbmVyYXRpbmcgb25lIG9yIG1vcmUgZmlsZXMgaW4KKyAgLy8gdGhlIGdpdmVuIG91dHB1dCBkaXJlY3RvcnkuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIHNob3VsZCBiZSBjYWxsZWQgaW5zdGVhZCBvZiB8R2VuZXJhdGUoKXwgd2hlbgorICAvLyB8SGFzR2VuZXJhdGVBbGwoKXwgcmV0dXJucyB8dHJ1ZXwuIEl0IGlzIHVzZWQgdG8gZW11bGF0ZSBsZWdhY3kgc2VtYW50aWNzCisgIC8vIHdoZW4gbW9yZSB0aGFuIG9uZSBgLnByb3RvYCBmaWxlIGlzIHNwZWNpZmllZCBvbiBvbmUgY29tcGlsZXIgaW52b2NhdGlvbi4KKyAgLy8KKyAgLy8gV0FSTklORzogUGxlYXNlIGRvIG5vdCB1c2UgdW5sZXNzIGxlZ2FjeSBzZW1hbnRpY3MgZm9yY2UgdGhlIGNvZGUgZ2VuZXJhdG9yCisgIC8vIHRvIHByb2R1Y2UgYSBzaW5nbGUgb3V0cHV0IGZpbGUgZm9yIGFsbCBpbnB1dCBmaWxlcywgb3Igb3RoZXJ3aXNlIHJlcXVpcmUKKyAgLy8gYW4gZXhhbWluYXRpb24gb2YgYWxsIGlucHV0IGZpbGVzIGZpcnN0LiBUaGUgY2Fub25pY2FsIGNvZGUgZ2VuZXJhdG9yCisgIC8vIGRlc2lnbiBwcm9kdWNlcyBvbmUgb3V0cHV0IGZpbGUgcGVyIGlucHV0IC5wcm90byBmaWxlLCBhbmQgd2UgZG8gbm90IHdpc2gKKyAgLy8gdG8gZW5jb3VyYWdlIGFsdGVybmF0ZSBkZXNpZ25zLgorICAvLworICAvLyBBIHBhcmFtZXRlciBpcyBnaXZlbiBhcyBwYXNzZWQgb24gdGhlIGNvbW1hbmQgbGluZSwgYXMgaW4gfEdlbmVyYXRlKCl8CisgIC8vIGFib3ZlLgorICAvLworICAvLyBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bC4gIE90aGVyd2lzZSwgc2V0cyAqZXJyb3IgdG8gYSBkZXNjcmlwdGlvbiBvZgorICAvLyB0aGUgcHJvYmxlbSAoZS5nLiAiaW52YWxpZCBwYXJhbWV0ZXIiKSBhbmQgcmV0dXJucyBmYWxzZS4KKyAgdmlydHVhbCBib29sIEdlbmVyYXRlQWxsKGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBmaWxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcGFyYW1ldGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogZ2VuZXJhdG9yX2NvbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGVycm9yKSBjb25zdCB7CisgICAgKmVycm9yID0gIlVuaW1wbGVtZW50ZWQgR2VuZXJhdGVBbGwoKSBtZXRob2QuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIGNvZGUgZ2VuZXJhdG9yIGV4cGVjdHMgdG8gcmVjZWl2ZSBhbGwgRmlsZURlc2NyaXB0b3JzCisgIC8vIGF0IG9uY2UgKHZpYSB8R2VuZXJhdGVBbGwoKXwpLCByYXRoZXIgdGhhbiBvbmUgYXQgYSB0aW1lICh2aWEKKyAgLy8gfEdlbmVyYXRlKCl8KS4gVGhpcyBpcyByZXF1aXJlZCB0byBpbXBsZW1lbnQgbGVnYWN5IHNlbWFudGljcy4KKyAgdmlydHVhbCBib29sIEhhc0dlbmVyYXRlQWxsKCkgY29uc3QgeyByZXR1cm4gZmFsc2U7IH0KKwogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlR2VuZXJhdG9yKTsKIH07CkBAIC0xMDQsNiArMTM1LDkgQEAKICAgLy8gY29udGFpbiAiLiIgb3IgIi4uIiBjb21wb25lbnRzLgogICB2aXJ0dWFsIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSA9IDA7CiAKKyAgLy8gU2ltaWxhciB0byBPcGVuKCkgYnV0IHRoZSBvdXRwdXQgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUgZmlsZSBpZiBleGlzdHMKKyAgdmlydHVhbCBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW5Gb3JBcHBlbmQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKICAgLy8gQ3JlYXRlcyBhIFplcm9Db3B5T3V0cHV0U3RyZWFtIHdoaWNoIHdpbGwgaW5zZXJ0IGNvZGUgaW50byB0aGUgZ2l2ZW4gZmlsZQogICAvLyBhdCB0aGUgZ2l2ZW4gaW5zZXJ0aW9uIHBvaW50LiAgU2VlIHBsdWdpbi5wcm90byAocGx1Z2luLnBiLmgpIGZvciBtb3JlCiAgIC8vIGluZm9ybWF0aW9uIG9uIGluc2VydGlvbiBwb2ludHMuICBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuY2MKaW5kZXggYzViZTliNC4uZmNhZDZiNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMyw2ICszMyw3IEBACiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaD4KIAogI2luY2x1ZGUgPHN0ZGlvLmg+CiAjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CkBAIC00NSwxMiArNDYsMjUgQEAKICNpbmNsdWRlIDx1bmlzdGQuaD4KICNlbmRpZgogI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8ZnN0cmVhbT4KICNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxjdHlwZS5oPgogCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfQVJDSF9TUEFSQworI2luY2x1ZGUgPGxpbWl0cy5oPiAvL0ZvciBQQVRIX01BWAorI2VuZGlmCisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisKKyNpZmRlZiBfX0FQUExFX18KKyNpbmNsdWRlIDxtYWNoLW8vZHlsZC5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaD4KQEAgLTU5LDEyICs3MywxNCBAQAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKIAogbmFtZXNwYWNlIGdvb2dsZSB7CkBAIC0xNDUsOCArMTYxLDggQEAKIGJvb2wgVmVyaWZ5RGlyZWN0b3J5RXhpc3RzKGNvbnN0IHN0cmluZyYgcGF0aCkgewogICBpZiAocGF0aC5lbXB0eSgpKSByZXR1cm4gdHJ1ZTsKIAotICBpZiAoYWNjZXNzKHBhdGguY19zdHIoKSwgV19PSykgPT0gLTEpIHsKLSAgICBjZXJyIDw8IHBhdGggPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgZW5kbDsKKyAgaWYgKGFjY2VzcyhwYXRoLmNfc3RyKCksIEZfT0spID09IC0xKSB7CisgICAgc3RkOjpjZXJyIDw8IHBhdGggPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgc3RkOjplbmRsOwogICAgIHJldHVybiBmYWxzZTsKICAgfSBlbHNlIHsKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTE1OSwxNSArMTc1LDE0IEBACiAvLyBkaXJlY3RvcmllcyBsaXN0ZWQgaW4gfGZpbGVuYW1lfC4KIGJvb2wgVHJ5Q3JlYXRlUGFyZW50RGlyZWN0b3J5KGNvbnN0IHN0cmluZyYgcHJlZml4LCBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CiAgIC8vIFJlY3Vyc2l2ZWx5IGNyZWF0ZSBwYXJlbnQgZGlyZWN0b3JpZXMgdG8gdGhlIG91dHB1dCBmaWxlLgotICB2ZWN0b3I8c3RyaW5nPiBwYXJ0czsKLSAgU3BsaXRTdHJpbmdVc2luZyhmaWxlbmFtZSwgIi8iLCAmcGFydHMpOworICB2ZWN0b3I8c3RyaW5nPiBwYXJ0cyA9IFNwbGl0KGZpbGVuYW1lLCAiLyIsIHRydWUpOwogICBzdHJpbmcgcGF0aF9zb19mYXIgPSBwcmVmaXg7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFydHMuc2l6ZSgpIC0gMTsgaSsrKSB7CiAgICAgcGF0aF9zb19mYXIgKz0gcGFydHNbaV07CiAgICAgaWYgKG1rZGlyKHBhdGhfc29fZmFyLmNfc3RyKCksIDA3NzcpICE9IDApIHsKICAgICAgIGlmIChlcnJubyAhPSBFRVhJU1QpIHsKLSAgICAgICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3aGlsZSB0cnlpbmcgdG8gY3JlYXRlIGRpcmVjdG9yeSAiCi0gICAgICAgICAgICAgPDwgcGF0aF9zb19mYXIgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgZW5kbDsKKyAgICAgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lIDw8ICI6IHdoaWxlIHRyeWluZyB0byBjcmVhdGUgZGlyZWN0b3J5ICIKKyAgICAgICAgICAgICAgICAgIDw8IHBhdGhfc29fZmFyIDw8ICI6ICIgPDwgc3RyZXJyb3IoZXJybm8pIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KQEAgLTE3Nyw2ICsxOTIsNzggQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKKy8vIEdldCB0aGUgYWJzb2x1dGUgcGF0aCBvZiB0aGlzIHByb3RvYyBiaW5hcnkuCitib29sIEdldFByb3RvY0Fic29sdXRlUGF0aChzdHJpbmcqIHBhdGgpIHsKKyNpZmRlZiBfV0lOMzIKKyAgY2hhciBidWZmZXJbTUFYX1BBVEhdOworICBpbnQgbGVuID0gR2V0TW9kdWxlRmlsZU5hbWVBKE5VTEwsIGJ1ZmZlciwgTUFYX1BBVEgpOworI2VsaWYgX19BUFBMRV9fCisgIGNoYXIgYnVmZmVyW1BBVEhfTUFYXTsKKyAgaW50IGxlbiA9IDA7CisKKyAgY2hhciBkaXJ0eWJ1ZmZlcltQQVRIX01BWF07CisgIHVpbnQzMl90IHNpemUgPSBzaXplb2YoZGlydHlidWZmZXIpOworICBpZiAoX05TR2V0RXhlY3V0YWJsZVBhdGgoZGlydHlidWZmZXIsICZzaXplKSA9PSAwKSB7CisgICAgcmVhbHBhdGgoZGlydHlidWZmZXIsIGJ1ZmZlcik7CisgICAgbGVuID0gc3RybGVuKGJ1ZmZlcik7CisgIH0KKyNlbHNlCisgIGNoYXIgYnVmZmVyW1BBVEhfTUFYXTsKKyAgaW50IGxlbiA9IHJlYWRsaW5rKCIvcHJvYy9zZWxmL2V4ZSIsIGJ1ZmZlciwgUEFUSF9NQVgpOworI2VuZGlmCisgIGlmIChsZW4gPiAwKSB7CisgICAgcGF0aC0+YXNzaWduKGJ1ZmZlciwgbGVuKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworLy8gV2hldGhlciBhIHBhdGggaXMgd2hlcmUgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gYW5kIG90aGVyIHdlbGwta25vd24KKy8vIHR5cGUgcHJvdG9zIGFyZSBpbnN0YWxsZWQuCitib29sIElzSW5zdGFsbGVkUHJvdG9QYXRoKGNvbnN0IHN0cmluZyYgcGF0aCkgeworICAvLyBDaGVja2luZyB0aGUgZGVzY3JpcHRvci5wcm90byBmaWxlIHNob3VsZCBiZSBnb29kIGVub3VnaC4KKyAgc3RyaW5nIGZpbGVfcGF0aCA9IHBhdGggKyAiL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKKyAgcmV0dXJuIGFjY2VzcyhmaWxlX3BhdGguY19zdHIoKSwgRl9PSykgIT0gLTE7Cit9CisKKy8vIEFkZCB0aGUgcGF0aHMgd2hlcmUgZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXRvci5wcm90byBhbmQgb3RoZXIgd2VsbC1rbm93bgorLy8gdHlwZSBwcm90b3MgYXJlIGluc3RhbGxlZC4KK3ZvaWQgQWRkRGVmYXVsdFByb3RvUGF0aHModmVjdG9yPHBhaXI8c3RyaW5nLCBzdHJpbmc+ID4qIHBhdGhzKSB7CisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBUaGUgY29kZSBjdXJyZW50bHkgb25seSBjaGVja3MgcmVsYXRpdmUgcGF0aHMgb2Ygd2hlcmUKKyAgLy8gdGhlIHByb3RvYyBiaW5hcnkgaXMgaW5zdGFsbGVkLiBXZSBwcm9iYWJseSBzaG91bGQgbWFrZSBpdCBoYW5kbGUgbW9yZQorICAvLyBjYXNlcyB0aGFuIHRoYXQuCisgIHN0cmluZyBwYXRoOworICBpZiAoIUdldFByb3RvY0Fic29sdXRlUGF0aCgmcGF0aCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgLy8gU3RyaXAgdGhlIGJpbmFyeSBuYW1lLgorICBzaXplX3QgcG9zID0gcGF0aC5maW5kX2xhc3Rfb2YoIi9cXCIpOworICBpZiAocG9zID09IHN0cmluZzo6bnBvcyB8fCBwb3MgPT0gMCkgeworICAgIHJldHVybjsKKyAgfQorICBwYXRoID0gcGF0aC5zdWJzdHIoMCwgcG9zKTsKKyAgLy8gQ2hlY2sgdGhlIGJpbmFyeSdzIGRpcmVjdG9yeS4KKyAgaWYgKElzSW5zdGFsbGVkUHJvdG9QYXRoKHBhdGgpKSB7CisgICAgcGF0aHMtPnB1c2hfYmFjayhwYWlyPHN0cmluZywgc3RyaW5nPigiIiwgcGF0aCkpOworICAgIHJldHVybjsKKyAgfQorICAvLyBDaGVjayBpZiB0aGVyZSBpcyBhbiBpbmNsdWRlIHN1YmRpcmVjdG9yeS4KKyAgaWYgKElzSW5zdGFsbGVkUHJvdG9QYXRoKHBhdGggKyAiL2luY2x1ZGUiKSkgeworICAgIHBhdGhzLT5wdXNoX2JhY2socGFpcjxzdHJpbmcsIHN0cmluZz4oIiIsIHBhdGggKyAiL2luY2x1ZGUiKSk7CisgICAgcmV0dXJuOworICB9CisgIC8vIENoZWNrIGlmIHRoZSB1cHBlciBsZXZlbCBkaXJlY3RvcnkgaGFzIGFuICJpbmNsdWRlIiBzdWJkaXJlY3RvcnkuCisgIHBvcyA9IHBhdGguZmluZF9sYXN0X29mKCIvXFwiKTsKKyAgaWYgKHBvcyA9PSBzdHJpbmc6Om5wb3MgfHwgcG9zID09IDApIHsKKyAgICByZXR1cm47CisgIH0KKyAgcGF0aCA9IHBhdGguc3Vic3RyKDAsIHBvcyk7CisgIGlmIChJc0luc3RhbGxlZFByb3RvUGF0aChwYXRoICsgIi9pbmNsdWRlIikpIHsKKyAgICBwYXRocy0+cHVzaF9iYWNrKHBhaXI8c3RyaW5nLCBzdHJpbmc+KCIiLCBwYXRoICsgIi9pbmNsdWRlIikpOworICAgIHJldHVybjsKKyAgfQorfQogfSAgLy8gbmFtZXNwYWNlCiAKIC8vIEEgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgdGhhdCBwcmludHMgZXJyb3JzIHRvIHN0ZGVyci4KQEAgLTE5MCwxNSArMjc3LDM1IEBACiAgIC8vIGltcGxlbWVudHMgTXVsdGlGaWxlRXJyb3JDb2xsZWN0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHZvaWQgQWRkRXJyb3IoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCiAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgQWRkRXJyb3JPcldhcm5pbmcoZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSwgImVycm9yIiwgc3RkOjpjZXJyKTsKKyAgfQogCisgIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIEFkZEVycm9yT3JXYXJuaW5nKGZpbGVuYW1lLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UsICJ3YXJuaW5nIiwgc3RkOjpjbG9nKTsKKyAgfQorCisgIC8vIGltcGxlbWVudHMgaW86OkVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIEFkZEVycm9yKCJpbnB1dCIsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CisgIH0KKworICB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIEFkZEVycm9yT3JXYXJuaW5nKCJpbnB1dCIsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSwgIndhcm5pbmciLCBzdGQ6OmNsb2cpOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIEFkZEVycm9yT3JXYXJuaW5nKAorICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyYgdHlwZSwgb3N0cmVhbSYgb3V0KSB7CiAgICAgLy8gUHJpbnQgZnVsbCBwYXRoIHdoZW4gcnVubmluZyB1bmRlciBNU1ZTCiAgICAgc3RyaW5nIGRmaWxlOwogICAgIGlmIChmb3JtYXRfID09IENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfTVNWUyAmJgogICAgICAgICB0cmVlXyAhPSBOVUxMICYmCiAgICAgICAgIHRyZWVfLT5WaXJ0dWFsRmlsZVRvRGlza0ZpbGUoZmlsZW5hbWUsICZkZmlsZSkpIHsKLSAgICAgIGNlcnIgPDwgZGZpbGU7CisgICAgICBvdXQgPDwgZGZpbGU7CiAgICAgfSBlbHNlIHsKLSAgICAgIGNlcnIgPDwgZmlsZW5hbWU7CisgICAgICBvdXQgPDwgZmlsZW5hbWU7CiAgICAgfQogCiAgICAgLy8gVXNlcnMgdHlwaWNhbGx5IGV4cGVjdCAxLWJhc2VkIGxpbmUvY29sdW1uIG51bWJlcnMsIHNvIHdlIGFkZCAxCkBAIC0yMDcsMjMgKzMxNCwyMiBAQAogICAgICAgLy8gQWxsb3cgZm9yIGJvdGggR0NDLSBhbmQgVmlzdWFsLVN0dWRpby1jb21wYXRpYmxlIG91dHB1dC4KICAgICAgIHN3aXRjaCAoZm9ybWF0XykgewogICAgICAgICBjYXNlIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpFUlJPUl9GT1JNQVRfR0NDOgotICAgICAgICAgIGNlcnIgPDwgIjoiIDw8IChsaW5lICsgMSkgPDwgIjoiIDw8IChjb2x1bW4gKyAxKTsKKyAgICAgICAgICBvdXQgPDwgIjoiIDw8IChsaW5lICsgMSkgPDwgIjoiIDw8IChjb2x1bW4gKyAxKTsKICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBDb21tYW5kTGluZUludGVyZmFjZTo6RVJST1JfRk9STUFUX01TVlM6Ci0gICAgICAgICAgY2VyciA8PCAiKCIgPDwgKGxpbmUgKyAxKSA8PCAiKSA6IGVycm9yIGluIGNvbHVtbj0iIDw8IChjb2x1bW4gKyAxKTsKKyAgICAgICAgICBvdXQgPDwgIigiIDw8IChsaW5lICsgMSkgPDwgIikgOiAiCisgICAgICAgICAgICAgIDw8IHR5cGUgPDwgIiBpbiBjb2x1bW49IiA8PCAoY29sdW1uICsgMSk7CiAgICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogCi0gICAgY2VyciA8PCAiOiAiIDw8IG1lc3NhZ2UgPDwgZW5kbDsKKyAgICBpZiAodHlwZSA9PSAid2FybmluZyIpIHsKKyAgICAgIG91dCA8PCAiOiB3YXJuaW5nOiAiIDw8IG1lc3NhZ2UgPDwgc3RkOjplbmRsOworICAgIH0gZWxzZSB7CisgICAgICBvdXQgPDwgIjogIiA8PCBtZXNzYWdlIDw8IHN0ZDo6ZW5kbDsKKyAgICB9CiAgIH0KIAotICAvLyBpbXBsZW1lbnRzIGlvOjpFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKLSAgICBBZGRFcnJvcigiaW5wdXQiLCBsaW5lLCBjb2x1bW4sIG1lc3NhZ2UpOwotICB9Ci0KLSBwcml2YXRlOgogICBjb25zdCBFcnJvckZvcm1hdCBmb3JtYXRfOwogICBEaXNrU291cmNlVHJlZSAqdHJlZV87CiB9OwpAQCAtMjQ5LDggKzM1NSwxMiBAQAogICAvLyBmb3JtYXQsIHVubGVzcyBvbmUgaGFzIGFscmVhZHkgYmVlbiB3cml0dGVuLgogICB2b2lkIEFkZEphck1hbmlmZXN0KCk7CiAKKyAgLy8gR2V0IG5hbWUgb2YgYWxsIG91dHB1dCBmaWxlcy4KKyAgdm9pZCBHZXRPdXRwdXRGaWxlbmFtZXModmVjdG9yPHN0cmluZz4qIG91dHB1dF9maWxlbmFtZXMpOworCiAgIC8vIGltcGxlbWVudHMgR2VuZXJhdG9yQ29udGV4dCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisgIGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbSogT3BlbkZvckFwcGVuZChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKICAgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuRm9ySW5zZXJ0KAogICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQpOwogICB2b2lkIExpc3RQYXJzZWRGaWxlcyh2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiogb3V0cHV0KSB7CkBAIC0yNzAsNyArMzgwLDggQEAKIGNsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpNZW1vcnlPdXRwdXRTdHJlYW0KICAgICA6IHB1YmxpYyBpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0gewogIHB1YmxpYzoKLSAgTWVtb3J5T3V0cHV0U3RyZWFtKEdlbmVyYXRvckNvbnRleHRJbXBsKiBkaXJlY3RvcnksIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworICBNZW1vcnlPdXRwdXRTdHJlYW0oR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgYXBwZW5kX21vZGUpOwogICBNZW1vcnlPdXRwdXRTdHJlYW0oR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50KTsKICAgdmlydHVhbCB+TWVtb3J5T3V0cHV0U3RyZWFtKCk7CkBAIC0yODksOCArNDAwLDExIEBACiAgIC8vIFRoZSBzdHJpbmcgd2UncmUgYnVpbGRpbmcuCiAgIHN0cmluZyBkYXRhXzsKIAorICAvLyBXaGV0aGVyIHdlIHNob3VsZCBhcHBlbmQgdGhlIG91dHB1dCBzdHJlYW0gdG8gdGhlIGV4aXN0aW5nIGZpbGUuCisgIGJvb2wgYXBwZW5kX21vZGVfOworCiAgIC8vIFN0cmluZ091dHB1dFN0cmVhbSB3cml0aW5nIHRvIGRhdGFfLgotICBzY29wZWRfcHRyPGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0+IGlubmVyXzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6U3RyaW5nT3V0cHV0U3RyZWFtPiBpbm5lcl87CiB9OwogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMzUsNyArNDQ5LDcgQEAKIAogICAgIGlmIChmaWxlX2Rlc2NyaXB0b3IgPCAwKSB7CiAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKLSAgICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7CisgICAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7CiAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgfQogCkBAIC0zNTksOSArNDczLDkgQEAKIAogICAgICAgICBpZiAod3JpdGVfcmVzdWx0IDwgMCkgewogICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOwotICAgICAgICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogd3JpdGU6ICIgPDwgc3RyZXJyb3IoZXJyb3IpOworICAgICAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3cml0ZTogIiA8PCBzdHJlcnJvcihlcnJvcik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3cml0ZSgpIHJldHVybmVkIHplcm8/IiA8PCBlbmRsOworICAgICAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZSA8PCAiOiB3cml0ZSgpIHJldHVybmVkIHplcm8/IiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpAQCAtMzcyLDcgKzQ4Niw3IEBACiAKICAgICBpZiAoY2xvc2UoZmlsZV9kZXNjcmlwdG9yKSAhPSAwKSB7CiAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKLSAgICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogY2xvc2U6ICIgPDwgc3RyZXJyb3IoZXJyb3IpOworICAgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lIDw8ICI6IGNsb3NlOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KQEAgLTM5NSw3ICs1MDksNyBAQAogCiAgIGlmIChmaWxlX2Rlc2NyaXB0b3IgPCAwKSB7CiAgICAgaW50IGVycm9yID0gZXJybm87Ci0gICAgY2VyciA8PCBmaWxlbmFtZSA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm9yKTsKKyAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihlcnJvcik7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKQEAgLTQxMSwxMSArNTI1LDExIEBACiAgIHppcF93cml0ZXIuV3JpdGVEaXJlY3RvcnkoKTsKIAogICBpZiAoc3RyZWFtLkdldEVycm5vKCkgIT0gMCkgewotICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihzdHJlYW0uR2V0RXJybm8oKSkgPDwgZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihzdHJlYW0uR2V0RXJybm8oKSkgPDwgc3RkOjplbmRsOwogICB9CiAKICAgaWYgKCFzdHJlYW0uQ2xvc2UoKSkgewotICAgIGNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihzdHJlYW0uR2V0RXJybm8oKSkgPDwgZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgZmlsZW5hbWUgPDwgIjogIiA8PCBzdHJlcnJvcihzdHJlYW0uR2V0RXJybm8oKSkgPDwgc3RkOjplbmRsOwogICB9CiAKICAgcmV0dXJuIHRydWU7CkBAIC00MzEsOSArNTQ1LDIzIEBACiAgIH0KIH0KIAordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6OkdldE91dHB1dEZpbGVuYW1lcygKKyAgICB2ZWN0b3I8c3RyaW5nPiogb3V0cHV0X2ZpbGVuYW1lcykgeworICBmb3IgKG1hcDxzdHJpbmcsIHN0cmluZyo+OjppdGVyYXRvciBpdGVyID0gZmlsZXNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBmaWxlc18uZW5kKCk7ICsraXRlcikgeworICAgIG91dHB1dF9maWxlbmFtZXMtPnB1c2hfYmFjayhpdGVyLT5maXJzdCk7CisgIH0KK30KKwogaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdG9yQ29udGV4dEltcGw6Ok9wZW4oCiAgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICByZXR1cm4gbmV3IE1lbW9yeU91dHB1dFN0cmVhbSh0aGlzLCBmaWxlbmFtZSk7CisgIHJldHVybiBuZXcgTWVtb3J5T3V0cHV0U3RyZWFtKHRoaXMsIGZpbGVuYW1lLCBmYWxzZSk7Cit9CisKK2lvOjpaZXJvQ29weU91dHB1dFN0cmVhbSoKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpHZW5lcmF0b3JDb250ZXh0SW1wbDo6T3BlbkZvckFwcGVuZCgKKyAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHJldHVybiBuZXcgTWVtb3J5T3V0cHV0U3RyZWFtKHRoaXMsIGZpbGVuYW1lLCB0cnVlKTsKIH0KIAogaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKgpAQCAtNDQ1LDkgKzU3MywxMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBDb21tYW5kTGluZUludGVyZmFjZTo6TWVtb3J5T3V0cHV0U3RyZWFtOjpNZW1vcnlPdXRwdXRTdHJlYW0oCi0gICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSwgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkKKyAgICBHZW5lcmF0b3JDb250ZXh0SW1wbCogZGlyZWN0b3J5LCBjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBib29sIGFwcGVuZF9tb2RlKQogICAgIDogZGlyZWN0b3J5XyhkaXJlY3RvcnkpLAogICAgICAgZmlsZW5hbWVfKGZpbGVuYW1lKSwKKyAgICAgIGFwcGVuZF9tb2RlXyhhcHBlbmRfbW9kZSksCiAgICAgICBpbm5lcl8obmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oJmRhdGFfKSkgewogfQogCkBAIC00NzAsOCArNTk5LDEzIEBACiAgIGlmIChpbnNlcnRpb25fcG9pbnRfLmVtcHR5KCkpIHsKICAgICAvLyBUaGlzIHdhcyBqdXN0IGEgcmVndWxhciBPcGVuKCkuCiAgICAgaWYgKCptYXBfc2xvdCAhPSBOVUxMKSB7Ci0gICAgICBjZXJyIDw8IGZpbGVuYW1lXyA8PCAiOiBUcmllZCB0byB3cml0ZSB0aGUgc2FtZSBmaWxlIHR3aWNlLiIgPDwgZW5kbDsKLSAgICAgIGRpcmVjdG9yeV8tPmhhZF9lcnJvcl8gPSB0cnVlOworICAgICAgaWYgKGFwcGVuZF9tb2RlXykgeworICAgICAgICAoKm1hcF9zbG90KS0+YXBwZW5kKGRhdGFfKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZV8gPDwgIjogVHJpZWQgdG8gd3JpdGUgdGhlIHNhbWUgZmlsZSB0d2ljZS4iCisgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICAgIGRpcmVjdG9yeV8tPmhhZF9lcnJvcl8gPSB0cnVlOworICAgICAgfQogICAgICAgcmV0dXJuOwogICAgIH0KIApAQCAtNDg3LDggKzYyMSw5IEBACiAKICAgICAvLyBGaW5kIHRoZSBmaWxlIHdlIGFyZSBnb2luZyB0byBpbnNlcnQgaW50by4KICAgICBpZiAoKm1hcF9zbG90ID09IE5VTEwpIHsKLSAgICAgIGNlcnIgPDwgZmlsZW5hbWVfIDw8ICI6IFRyaWVkIHRvIGluc2VydCBpbnRvIGZpbGUgdGhhdCBkb2Vzbid0IGV4aXN0LiIKLSAgICAgICAgICAgPDwgZW5kbDsKKyAgICAgIHN0ZDo6Y2VyciA8PCBmaWxlbmFtZV8KKyAgICAgICAgICAgICAgICA8PCAiOiBUcmllZCB0byBpbnNlcnQgaW50byBmaWxlIHRoYXQgZG9lc24ndCBleGlzdC4iCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOwogICAgICAgZGlyZWN0b3J5Xy0+aGFkX2Vycm9yXyA9IHRydWU7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTAwLDggKzYzNSw4IEBACiAgICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gdGFyZ2V0LT5maW5kKG1hZ2ljX3N0cmluZyk7CiAKICAgICBpZiAocG9zID09IHN0cmluZzo6bnBvcykgewotICAgICAgY2VyciA8PCBmaWxlbmFtZV8gPDwgIjogaW5zZXJ0aW9uIHBvaW50IFwiIiA8PCBpbnNlcnRpb25fcG9pbnRfCi0gICAgICAgICAgIDw8ICJcIiBub3QgZm91bmQuIiA8PCBlbmRsOworICAgICAgc3RkOjpjZXJyIDw8IGZpbGVuYW1lXyA8PCAiOiBpbnNlcnRpb24gcG9pbnQgXCIiIDw8IGluc2VydGlvbl9wb2ludF8KKyAgICAgICAgICAgICAgICA8PCAiXCIgbm90IGZvdW5kLiIgPDwgc3RkOjplbmRsOwogICAgICAgZGlyZWN0b3J5Xy0+aGFkX2Vycm9yXyA9IHRydWU7CiAgICAgICByZXR1cm47CiAgICAgfQpAQCAtNTY0LDggKzY5OSwxMCBAQAogCiBDb21tYW5kTGluZUludGVyZmFjZTo6Q29tbWFuZExpbmVJbnRlcmZhY2UoKQogICA6IG1vZGVfKE1PREVfQ09NUElMRSksCisgICAgcHJpbnRfbW9kZV8oUFJJTlRfTk9ORSksCiAgICAgZXJyb3JfZm9ybWF0XyhFUlJPUl9GT1JNQVRfR0NDKSwKICAgICBpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyhmYWxzZSksCisgICAgc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfKGZhbHNlKSwKICAgICBkaXNhbGxvd19zZXJ2aWNlc18oZmFsc2UpLAogICAgIGlucHV0c19hcmVfcHJvdG9fcGF0aF9yZWxhdGl2ZV8oZmFsc2UpIHt9CiBDb21tYW5kTGluZUludGVyZmFjZTo6fkNvbW1hbmRMaW5lSW50ZXJmYWNlKCkge30KQEAgLTU3NCw5ICs3MTEsMjMgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaGVscF90ZXh0KSB7CiAgIEdlbmVyYXRvckluZm8gaW5mbzsKKyAgaW5mby5mbGFnX25hbWUgPSBmbGFnX25hbWU7CiAgIGluZm8uZ2VuZXJhdG9yID0gZ2VuZXJhdG9yOwogICBpbmZvLmhlbHBfdGV4dCA9IGhlbHBfdGV4dDsKLSAgZ2VuZXJhdG9yc19bZmxhZ19uYW1lXSA9IGluZm87CisgIGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lX1tmbGFnX25hbWVdID0gaW5mbzsKK30KKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UmVnaXN0ZXJHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBmbGFnX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbl9mbGFnX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGhlbHBfdGV4dCkgeworICBHZW5lcmF0b3JJbmZvIGluZm87CisgIGluZm8uZmxhZ19uYW1lID0gZmxhZ19uYW1lOworICBpbmZvLm9wdGlvbl9mbGFnX25hbWUgPSBvcHRpb25fZmxhZ19uYW1lOworICBpbmZvLmdlbmVyYXRvciA9IGdlbmVyYXRvcjsKKyAgaW5mby5oZWxwX3RleHQgPSBoZWxwX3RleHQ7CisgIGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lX1tmbGFnX25hbWVdID0gaW5mbzsKKyAgZ2VuZXJhdG9yc19ieV9vcHRpb25fbmFtZV9bb3B0aW9uX2ZsYWdfbmFtZV0gPSBpbmZvOwogfQogCiB2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpBbGxvd1BsdWdpbnMoY29uc3Qgc3RyaW5nJiBleGVfbmFtZV9wcmVmaXgpIHsKQEAgLTU4NSw3ICs3MzYsMTYgQEAKIAogaW50IENvbW1hbmRMaW5lSW50ZXJmYWNlOjpSdW4oaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkgewogICBDbGVhcigpOwotICBpZiAoIVBhcnNlQXJndW1lbnRzKGFyZ2MsIGFyZ3YpKSByZXR1cm4gMTsKKyAgc3dpdGNoIChQYXJzZUFyZ3VtZW50cyhhcmdjLCBhcmd2KSkgeworICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfRVhJVDoKKyAgICAgIHJldHVybiAwOworICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRkFJTDoKKyAgICAgIHJldHVybiAxOworICAgIGNhc2UgUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUU6CisgICAgICBicmVhazsKKyAgfQorCisgIEFkZERlZmF1bHRQcm90b1BhdGhzKCZwcm90b19wYXRoXyk7CiAKICAgLy8gU2V0IHVwIHRoZSBzb3VyY2UgdHJlZS4KICAgRGlza1NvdXJjZVRyZWUgc291cmNlX3RyZWU7CkBAIC02MDksNyArNzY5LDkgQEAKICAgLy8gUGFyc2UgZWFjaCBmaWxlLgogICBmb3IgKGludCBpID0gMDsgaSA8IGlucHV0X2ZpbGVzXy5zaXplKCk7IGkrKykgewogICAgIC8vIEltcG9ydCB0aGUgZmlsZS4KKyAgICBpbXBvcnRlci5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoaW5wdXRfZmlsZXNfW2ldKTsKICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogcGFyc2VkX2ZpbGUgPSBpbXBvcnRlci5JbXBvcnQoaW5wdXRfZmlsZXNfW2ldKTsKKyAgICBpbXBvcnRlci5DbGVhclVudXNlZEltcG9ydFRyYWNrRmlsZXMoKTsKICAgICBpZiAocGFyc2VkX2ZpbGUgPT0gTlVMTCkgcmV0dXJuIDE7CiAgICAgcGFyc2VkX2ZpbGVzLnB1c2hfYmFjayhwYXJzZWRfZmlsZSk7CiAKQEAgLTYyNCw3ICs3ODYsNiBAQAogICAvLyBXZSBjb25zdHJ1Y3QgYSBzZXBhcmF0ZSBHZW5lcmF0b3JDb250ZXh0IGZvciBlYWNoIG91dHB1dCBsb2NhdGlvbi4gIE5vdGUKICAgLy8gdGhhdCB0d28gY29kZSBnZW5lcmF0b3JzIG1heSBvdXRwdXQgdG8gdGhlIHNhbWUgbG9jYXRpb24sIGluIHdoaWNoIGNhc2UKICAgLy8gdGhleSBzaG91bGQgc2hhcmUgYSBzaW5nbGUgR2VuZXJhdG9yQ29udGV4dCBzbyB0aGF0IE9wZW5Gb3JJbnNlcnQoKSB3b3Jrcy4KLSAgdHlwZWRlZiBoYXNoX21hcDxzdHJpbmcsIEdlbmVyYXRvckNvbnRleHRJbXBsKj4gR2VuZXJhdG9yQ29udGV4dE1hcDsKICAgR2VuZXJhdG9yQ29udGV4dE1hcCBvdXRwdXRfZGlyZWN0b3JpZXM7CiAKICAgLy8gR2VuZXJhdGUgb3V0cHV0LgpAQCAtNjcxLDYgKzgzMiwxMyBAQAogICAgIH0KICAgfQogCisgIGlmICghZGVwZW5kZW5jeV9vdXRfbmFtZV8uZW1wdHkoKSkgeworICAgIGlmICghR2VuZXJhdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlKHBhcnNlZF9maWxlcywgb3V0cHV0X2RpcmVjdG9yaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzb3VyY2VfdHJlZSkpIHsKKyAgICAgIHJldHVybiAxOworICAgIH0KKyAgfQorCiAgIFNUTERlbGV0ZVZhbHVlcygmb3V0cHV0X2RpcmVjdG9yaWVzKTsKIAogICBpZiAoIWRlc2NyaXB0b3Jfc2V0X25hbWVfLmVtcHR5KCkpIHsKQEAgLTY5OCw2ICs4NjYsMjUgQEAKICAgICB9CiAgIH0KIAorICBpZiAobW9kZV8gPT0gTU9ERV9QUklOVCkgeworICAgIHN3aXRjaCAocHJpbnRfbW9kZV8pIHsKKyAgICAgIGNhc2UgUFJJTlRfRlJFRV9GSUVMRFM6CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgKytpKSB7CisgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZkID0gcGFyc2VkX2ZpbGVzW2ldOworICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmQtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2opIHsKKyAgICAgICAgICAgIFByaW50RnJlZUZpZWxkTnVtYmVycyhmZC0+bWVzc2FnZV90eXBlKGopKTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFBSSU5UX05PTkU6CisgICAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJJZiB0aGUgY29kZSByZWFjaGVzIGhlcmUsIGl0IHVzdWFsbHkgbWVhbnMgYSBidWcgb2YgIgorICAgICAgICAgICAgICAgICAgICAgImZsYWcgcGFyc2luZyBpbiB0aGUgQ29tbW9uYWRMaW5lSW50ZXJmYWNlLiI7CisgICAgICAgIHJldHVybiAxOworCisgICAgICAvLyBEbyBub3QgYWRkIGEgZGVmYXVsdCBjYXNlLgorICAgIH0KKyAgfQorCiAgIHJldHVybiAwOwogfQogCkBAIC03MTAsOSArODk3LDEyIEBACiAgIG91dHB1dF9kaXJlY3RpdmVzXy5jbGVhcigpOwogICBjb2RlY190eXBlXy5jbGVhcigpOwogICBkZXNjcmlwdG9yX3NldF9uYW1lXy5jbGVhcigpOworICBkZXBlbmRlbmN5X291dF9uYW1lXy5jbGVhcigpOwogCiAgIG1vZGVfID0gTU9ERV9DT01QSUxFOworICBwcmludF9tb2RlXyA9IFBSSU5UX05PTkU7CiAgIGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfID0gZmFsc2U7CisgIHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XyA9IGZhbHNlOwogICBkaXNhbGxvd19zZXJ2aWNlc18gPSBmYWxzZTsKIH0KIApAQCAtNzI2LDI3ICs5MTYsMzEgQEAKICAgICAgICAgaW5wdXRfZmlsZXNfW2ldID0gdmlydHVhbF9maWxlOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgRGlza1NvdXJjZVRyZWU6OlNIQURPV0VEOgotICAgICAgICBjZXJyIDw8IGlucHV0X2ZpbGVzX1tpXSA8PCAiOiBJbnB1dCBpcyBzaGFkb3dlZCBpbiB0aGUgLS1wcm90b19wYXRoICIKLSAgICAgICAgICAgICAgICAiYnkgXCIiIDw8IHNoYWRvd2luZ19kaXNrX2ZpbGUgPDwgIlwiLiAgRWl0aGVyIHVzZSB0aGUgbGF0dGVyICIKLSAgICAgICAgICAgICAgICAiZmlsZSBhcyB5b3VyIGlucHV0IG9yIHJlb3JkZXIgdGhlIC0tcHJvdG9fcGF0aCBzbyB0aGF0IHRoZSAiCi0gICAgICAgICAgICAgICAgImZvcm1lciBmaWxlJ3MgbG9jYXRpb24gY29tZXMgZmlyc3QuIiA8PCBlbmRsOworICAgICAgICBzdGQ6OmNlcnIgPDwgaW5wdXRfZmlsZXNfW2ldCisgICAgICAgICAgICAgICAgICA8PCAiOiBJbnB1dCBpcyBzaGFkb3dlZCBpbiB0aGUgLS1wcm90b19wYXRoIGJ5IFwiIgorICAgICAgICAgICAgICAgICAgPDwgc2hhZG93aW5nX2Rpc2tfZmlsZQorICAgICAgICAgICAgICAgICAgPDwgIlwiLiAgRWl0aGVyIHVzZSB0aGUgbGF0dGVyIGZpbGUgYXMgeW91ciBpbnB1dCBvciByZW9yZGVyICIKKyAgICAgICAgICAgICAgICAgICAgICJ0aGUgLS1wcm90b19wYXRoIHNvIHRoYXQgdGhlIGZvcm1lciBmaWxlJ3MgbG9jYXRpb24gIgorICAgICAgICAgICAgICAgICAgICAgImNvbWVzIGZpcnN0LiIgPDwgc3RkOjplbmRsOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICBjYXNlIERpc2tTb3VyY2VUcmVlOjpDQU5OT1RfT1BFTjoKLSAgICAgICAgY2VyciA8PCBpbnB1dF9maWxlc19baV0gPDwgIjogIiA8PCBzdHJlcnJvcihlcnJubykgPDwgZW5kbDsKKyAgICAgICAgc3RkOjpjZXJyIDw8IGlucHV0X2ZpbGVzX1tpXSA8PCAiOiAiIDw8IHN0cmVycm9yKGVycm5vKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIGNhc2UgRGlza1NvdXJjZVRyZWU6Ok5PX01BUFBJTkc6CiAgICAgICAgIC8vIEZpcnN0IGNoZWNrIGlmIHRoZSBmaWxlIGV4aXN0cyBhdCBhbGwuCiAgICAgICAgIGlmIChhY2Nlc3MoaW5wdXRfZmlsZXNfW2ldLmNfc3RyKCksIEZfT0spIDwgMCkgewogICAgICAgICAgIC8vIEZpbGUgZG9lcyBub3QgZXZlbiBleGlzdC4KLSAgICAgICAgICBjZXJyIDw8IGlucHV0X2ZpbGVzX1tpXSA8PCAiOiAiIDw8IHN0cmVycm9yKEVOT0VOVCkgPDwgZW5kbDsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgaW5wdXRfZmlsZXNfW2ldIDw8ICI6ICIgPDwgc3RyZXJyb3IoRU5PRU5UKSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgY2VyciA8PCBpbnB1dF9maWxlc19baV0gPDwgIjogRmlsZSBkb2VzIG5vdCByZXNpZGUgd2l0aGluIGFueSBwYXRoICIKLSAgICAgICAgICAgICAgICAgICJzcGVjaWZpZWQgdXNpbmcgLS1wcm90b19wYXRoIChvciAtSSkuICBZb3UgbXVzdCBzcGVjaWZ5IGEgIgotICAgICAgICAgICAgICAgICAgIi0tcHJvdG9fcGF0aCB3aGljaCBlbmNvbXBhc3NlcyB0aGlzIGZpbGUuICBOb3RlIHRoYXQgdGhlICIKLSAgICAgICAgICAgICAgICAgICJwcm90b19wYXRoIG11c3QgYmUgYW4gZXhhY3QgcHJlZml4IG9mIHRoZSAucHJvdG8gZmlsZSAiCi0gICAgICAgICAgICAgICAgICAibmFtZXMgLS0gcHJvdG9jIGlzIHRvbyBkdW1iIHRvIGZpZ3VyZSBvdXQgd2hlbiB0d28gcGF0aHMgIgotICAgICAgICAgICAgICAgICAgIihlLmcuIGFic29sdXRlIGFuZCByZWxhdGl2ZSkgYXJlIGVxdWl2YWxlbnQgKGl0J3MgaGFyZGVyICIKLSAgICAgICAgICAgICAgICAgICJ0aGFuIHlvdSB0aGluaykuIiA8PCBlbmRsOworICAgICAgICAgIHN0ZDo6Y2VycgorICAgICAgICAgICAgICA8PCBpbnB1dF9maWxlc19baV0KKyAgICAgICAgICAgICAgPDwgIjogRmlsZSBkb2VzIG5vdCByZXNpZGUgd2l0aGluIGFueSBwYXRoICIKKyAgICAgICAgICAgICAgICAgInNwZWNpZmllZCB1c2luZyAtLXByb3RvX3BhdGggKG9yIC1JKS4gIFlvdSBtdXN0IHNwZWNpZnkgYSAiCisgICAgICAgICAgICAgICAgICItLXByb3RvX3BhdGggd2hpY2ggZW5jb21wYXNzZXMgdGhpcyBmaWxlLiAgTm90ZSB0aGF0IHRoZSAiCisgICAgICAgICAgICAgICAgICJwcm90b19wYXRoIG11c3QgYmUgYW4gZXhhY3QgcHJlZml4IG9mIHRoZSAucHJvdG8gZmlsZSAiCisgICAgICAgICAgICAgICAgICJuYW1lcyAtLSBwcm90b2MgaXMgdG9vIGR1bWIgdG8gZmlndXJlIG91dCB3aGVuIHR3byBwYXRocyAiCisgICAgICAgICAgICAgICAgICIoZS5nLiBhYnNvbHV0ZSBhbmQgcmVsYXRpdmUpIGFyZSBlcXVpdmFsZW50IChpdCdzIGhhcmRlciAiCisgICAgICAgICAgICAgICAgICJ0aGFuIHlvdSB0aGluaykuIiA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KQEAgLTc1NSw1NSArOTQ5LDg0IEBACiAgIHJldHVybiB0cnVlOwogfQogCi1ib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50cyhpbnQgYXJnYywgY29uc3QgY2hhciogY29uc3QgYXJndltdKSB7CisKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpQYXJzZUFyZ3VtZW50U3RhdHVzCitDb21tYW5kTGluZUludGVyZmFjZTo6UGFyc2VBcmd1bWVudHMoaW50IGFyZ2MsIGNvbnN0IGNoYXIqIGNvbnN0IGFyZ3ZbXSkgewogICBleGVjdXRhYmxlX25hbWVfID0gYXJndlswXTsKIAorICB2ZWN0b3I8c3RyaW5nPiBhcmd1bWVudHM7CisgIGZvciAoaW50IGkgPSAxOyBpIDwgYXJnYzsgKytpKSB7CisgICAgYXJndW1lbnRzLnB1c2hfYmFjayhhcmd2W2ldKTsKKyAgfQorCiAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBhbGwgYXJndW1lbnRzIGFuZCBwYXJzZSB0aGVtLgotICBmb3IgKGludCBpID0gMTsgaSA8IGFyZ2M7IGkrKykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3VtZW50cy5zaXplKCk7ICsraSkgewogICAgIHN0cmluZyBuYW1lLCB2YWx1ZTsKIAotICAgIGlmIChQYXJzZUFyZ3VtZW50KGFyZ3ZbaV0sICZuYW1lLCAmdmFsdWUpKSB7CisgICAgaWYgKFBhcnNlQXJndW1lbnQoYXJndW1lbnRzW2ldLmNfc3RyKCksICZuYW1lLCAmdmFsdWUpKSB7CiAgICAgICAvLyBSZXR1cm5lZCB0cnVlID0+IFVzZSB0aGUgbmV4dCBhcmd1bWVudCBhcyB0aGUgZmxhZyB2YWx1ZS4KLSAgICAgIGlmIChpICsgMSA9PSBhcmdjIHx8IGFyZ3ZbaSsxXVswXSA9PSAnLScpIHsKLSAgICAgICAgY2VyciA8PCAiTWlzc2luZyB2YWx1ZSBmb3IgZmxhZzogIiA8PCBuYW1lIDw8IGVuZGw7CisgICAgICBpZiAoaSArIDEgPT0gYXJndW1lbnRzLnNpemUoKSB8fCBhcmd1bWVudHNbaSArIDFdWzBdID09ICctJykgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIk1pc3NpbmcgdmFsdWUgZm9yIGZsYWc6ICIgPDwgbmFtZSA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIGlmIChuYW1lID09ICItLWRlY29kZSIpIHsKLSAgICAgICAgICBjZXJyIDw8ICJUbyBkZWNvZGUgYW4gdW5rbm93biBtZXNzYWdlLCB1c2UgLS1kZWNvZGVfcmF3LiIgPDwgZW5kbDsKKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgIlRvIGRlY29kZSBhbiB1bmtub3duIG1lc3NhZ2UsIHVzZSAtLWRlY29kZV9yYXcuIgorICAgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgICAgIH0KLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgICsraTsKLSAgICAgICAgdmFsdWUgPSBhcmd2W2ldOworICAgICAgICB2YWx1ZSA9IGFyZ3VtZW50c1tpXTsKICAgICAgIH0KICAgICB9CiAKLSAgICBpZiAoIUludGVycHJldEFyZ3VtZW50KG5hbWUsIHZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgIFBhcnNlQXJndW1lbnRTdGF0dXMgc3RhdHVzID0gSW50ZXJwcmV0QXJndW1lbnQobmFtZSwgdmFsdWUpOworICAgIGlmIChzdGF0dXMgIT0gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUUpCisgICAgICByZXR1cm4gc3RhdHVzOwogICB9CiAKICAgLy8gSWYgbm8gLS1wcm90b19wYXRoIHdhcyBnaXZlbiwgdXNlIHRoZSBjdXJyZW50IHdvcmtpbmcgZGlyZWN0b3J5LgogICBpZiAocHJvdG9fcGF0aF8uZW1wdHkoKSkgewotICAgIHByb3RvX3BhdGhfLnB1c2hfYmFjayhtYWtlX3BhaXI8c3RyaW5nLCBzdHJpbmc+KCIiLCAiLiIpKTsKKyAgICAvLyBEb24ndCB1c2UgbWFrZV9wYWlyIGFzIHRoZSBvbGQvZGVmYXVsdCBzdGFuZGFyZCBsaWJyYXJ5IG9uIFNvbGFyaXMKKyAgICAvLyBkb2Vzbid0IHN1cHBvcnQgaXQgd2l0aG91dCBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCB3aGljaCBhcmUKKyAgICAvLyBpbmNvbXBhdGlibGUgd2l0aCBDKysweCdzIG1ha2VfcGFpci4KKyAgICBwcm90b19wYXRoXy5wdXNoX2JhY2socGFpcjxzdHJpbmcsIHN0cmluZz4oIiIsICIuIikpOwogICB9CiAKICAgLy8gQ2hlY2sgc29tZSBlcnJyb3IgY2FzZXMuCiAgIGJvb2wgZGVjb2RpbmdfcmF3ID0gKG1vZGVfID09IE1PREVfREVDT0RFKSAmJiBjb2RlY190eXBlXy5lbXB0eSgpOwogICBpZiAoZGVjb2RpbmdfcmF3ICYmICFpbnB1dF9maWxlc18uZW1wdHkoKSkgewotICAgIGNlcnIgPDwgIldoZW4gdXNpbmcgLS1kZWNvZGVfcmF3LCBubyBpbnB1dCBmaWxlcyBzaG91bGQgYmUgZ2l2ZW4uIiA8PCBlbmRsOwotICAgIHJldHVybiBmYWxzZTsKKyAgICBzdGQ6OmNlcnIgPDwgIldoZW4gdXNpbmcgLS1kZWNvZGVfcmF3LCBubyBpbnB1dCBmaWxlcyBzaG91bGQgYmUgZ2l2ZW4uIgorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CiAgIH0gZWxzZSBpZiAoIWRlY29kaW5nX3JhdyAmJiBpbnB1dF9maWxlc18uZW1wdHkoKSkgewotICAgIGNlcnIgPDwgIk1pc3NpbmcgaW5wdXQgZmlsZS4iIDw8IGVuZGw7Ci0gICAgcmV0dXJuIGZhbHNlOworICAgIHN0ZDo6Y2VyciA8PCAiTWlzc2luZyBpbnB1dCBmaWxlLiIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwogICB9CiAgIGlmIChtb2RlXyA9PSBNT0RFX0NPTVBJTEUgJiYgb3V0cHV0X2RpcmVjdGl2ZXNfLmVtcHR5KCkgJiYKICAgICAgIGRlc2NyaXB0b3Jfc2V0X25hbWVfLmVtcHR5KCkpIHsKLSAgICBjZXJyIDw8ICJNaXNzaW5nIG91dHB1dCBkaXJlY3RpdmVzLiIgPDwgZW5kbDsKLSAgICByZXR1cm4gZmFsc2U7CisgICAgc3RkOjpjZXJyIDw8ICJNaXNzaW5nIG91dHB1dCBkaXJlY3RpdmVzLiIgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOworICB9CisgIGlmIChtb2RlXyAhPSBNT0RFX0NPTVBJTEUgJiYgIWRlcGVuZGVuY3lfb3V0X25hbWVfLmVtcHR5KCkpIHsKKyAgICBzdGQ6OmNlcnIgPDwgIkNhbiBvbmx5IHVzZSAtLWRlcGVuZGVuY3lfb3V0PUZJTEUgd2hlbiBnZW5lcmF0aW5nIGNvZGUuIgorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgIH0KKyAgaWYgKCFkZXBlbmRlbmN5X291dF9uYW1lXy5lbXB0eSgpICYmIGlucHV0X2ZpbGVzXy5zaXplKCkgPiAxKSB7CisgICAgc3RkOjpjZXJyCisgICAgICAgIDw8ICJDYW4gb25seSBwcm9jZXNzIG9uZSBpbnB1dCBmaWxlIHdoZW4gdXNpbmcgLS1kZXBlbmRlbmN5X291dD1GSUxFLiIKKyAgICAgICAgPDwgc3RkOjplbmRsOworICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwogICB9CiAgIGlmIChpbXBvcnRzX2luX2Rlc2NyaXB0b3Jfc2V0XyAmJiBkZXNjcmlwdG9yX3NldF9uYW1lXy5lbXB0eSgpKSB7Ci0gICAgY2VyciA8PCAiLS1pbmNsdWRlX2ltcG9ydHMgb25seSBtYWtlcyBzZW5zZSB3aGVuIGNvbWJpbmVkIHdpdGggIgotICAgICAgICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfb3V0LiIgPDwgZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIi0taW5jbHVkZV9pbXBvcnRzIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBjb21iaW5lZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfb3V0LiIgPDwgc3RkOjplbmRsOworICB9CisgIGlmIChzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8gJiYgZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgeworICAgIHN0ZDo6Y2VyciA8PCAiLS1pbmNsdWRlX3NvdXJjZV9pbmZvIG9ubHkgbWFrZXMgc2Vuc2Ugd2hlbiBjb21iaW5lZCB3aXRoICIKKyAgICAgICAgICAgICAgICAgIi0tZGVzY3JpcHRvcl9zZXRfb3V0LiIgPDwgc3RkOjplbmRsOwogICB9CiAKLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9DT05USU5VRTsKIH0KIAogYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6UGFyc2VBcmd1bWVudChjb25zdCBjaGFyKiBhcmcsCkBAIC04NTMsOCArMTA3NiwxMCBAQAogICBpZiAoKm5hbWUgPT0gIi1oIiB8fCAqbmFtZSA9PSAiLS1oZWxwIiB8fAogICAgICAgKm5hbWUgPT0gIi0tZGlzYWxsb3dfc2VydmljZXMiIHx8CiAgICAgICAqbmFtZSA9PSAiLS1pbmNsdWRlX2ltcG9ydHMiIHx8CisgICAgICAqbmFtZSA9PSAiLS1pbmNsdWRlX3NvdXJjZV9pbmZvIiB8fAogICAgICAgKm5hbWUgPT0gIi0tdmVyc2lvbiIgfHwKLSAgICAgICpuYW1lID09ICItLWRlY29kZV9yYXciKSB7CisgICAgICAqbmFtZSA9PSAiLS1kZWNvZGVfcmF3IiB8fAorICAgICAgKm5hbWUgPT0gIi0tcHJpbnRfZnJlZV9maWVsZF9udW1iZXJzIikgewogICAgIC8vIEhBQ0s6ICBUaGVzZSBhcmUgdGhlIG9ubHkgZmxhZ3MgdGhhdCBkb24ndCB0YWtlIGEgdmFsdWUuCiAgICAgLy8gICBUaGV5IHByb2JhYmx5IHNob3VsZCBub3QgYmUgaGFyZC1jb2RlZCBsaWtlIHRoaXMgYnV0IGZvciBub3cgaXQncwogICAgIC8vICAgbm90IHdvcnRoIGRvaW5nIGJldHRlci4KQEAgLTg2NSwxNiArMTA5MCwxOSBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6SW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgeworQ29tbWFuZExpbmVJbnRlcmZhY2U6OlBhcnNlQXJndW1lbnRTdGF0dXMKK0NvbW1hbmRMaW5lSW50ZXJmYWNlOjpJbnRlcnByZXRBcmd1bWVudChjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgewogICBpZiAobmFtZS5lbXB0eSgpKSB7CiAgICAgLy8gTm90IGEgZmxhZy4gIEp1c3QgYSBmaWxlbmFtZS4KICAgICBpZiAodmFsdWUuZW1wdHkoKSkgewotICAgICAgY2VyciA8PCAiWW91IHNlZW0gdG8gaGF2ZSBwYXNzZWQgYW4gZW1wdHkgc3RyaW5nIGFzIG9uZSBvZiB0aGUgIgotICAgICAgICAgICAgICAiYXJndW1lbnRzIHRvICIgPDwgZXhlY3V0YWJsZV9uYW1lXyA8PCAiLiAgVGhpcyBpcyBhY3R1YWxseSAiCi0gICAgICAgICAgICAgICJzb3J0IG9mIGhhcmQgdG8gZG8uICBDb25ncmF0cy4gIFVuZm9ydHVuYXRlbHkgaXQgaXMgbm90IHZhbGlkICIKLSAgICAgICAgICAgICAgImlucHV0IHNvIHRoZSBwcm9ncmFtIGlzIGdvaW5nIHRvIGRpZSBub3cuIiA8PCBlbmRsOwotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgc3RkOjpjZXJyCisgICAgICAgICAgPDwgIllvdSBzZWVtIHRvIGhhdmUgcGFzc2VkIGFuIGVtcHR5IHN0cmluZyBhcyBvbmUgb2YgdGhlICIKKyAgICAgICAgICAgICAiYXJndW1lbnRzIHRvICIgPDwgZXhlY3V0YWJsZV9uYW1lXworICAgICAgICAgIDw8ICIuICBUaGlzIGlzIGFjdHVhbGx5ICIKKyAgICAgICAgICAgICAic29ydCBvZiBoYXJkIHRvIGRvLiAgQ29uZ3JhdHMuICBVbmZvcnR1bmF0ZWx5IGl0IGlzIG5vdCB2YWxpZCAiCisgICAgICAgICAgICAgImlucHV0IHNvIHRoZSBwcm9ncmFtIGlzIGdvaW5nIHRvIGRpZSBub3cuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICB9CiAKICAgICBpbnB1dF9maWxlc18ucHVzaF9iYWNrKHZhbHVlKTsKQEAgLTg4Myw4ICsxMTExLDggQEAKICAgICAvLyBKYXZhJ3MgLWNsYXNzcGF0aCAoYW5kIHNvbWUgb3RoZXIgbGFuZ3VhZ2VzKSBkZWxpbWl0cyBwYXRoIGNvbXBvbmVudHMKICAgICAvLyB3aXRoIGNvbG9ucy4gIExldCdzIGFjY2VwdCB0aGF0IHN5bnRheCB0b28ganVzdCB0byBtYWtlIHRoaW5ncyBtb3JlCiAgICAgLy8gaW50dWl0aXZlLgotICAgIHZlY3RvcjxzdHJpbmc+IHBhcnRzOwotICAgIFNwbGl0U3RyaW5nVXNpbmcodmFsdWUsIGtQYXRoU2VwYXJhdG9yLCAmcGFydHMpOworICAgIHZlY3RvcjxzdHJpbmc+IHBhcnRzID0gU3BsaXQoCisgICAgICAgIHZhbHVlLCBrUGF0aFNlcGFyYXRvciwgdHJ1ZSk7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKSB7CiAgICAgICBzdHJpbmcgdmlydHVhbF9wYXRoOwpAQCAtOTAwLDU0ICsxMTI4LDc4IEBACiAgICAgICB9CiAKICAgICAgIGlmIChkaXNrX3BhdGguZW1wdHkoKSkgewotICAgICAgICBjZXJyIDw8ICItLXByb3RvX3BhdGggcGFzc2VkIGVtcHR5IGRpcmVjdG9yeSBuYW1lLiAgKFVzZSBcIi5cIiBmb3IgIgotICAgICAgICAgICAgICAgICJjdXJyZW50IGRpcmVjdG9yeS4pIiA8PCBlbmRsOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIHN0ZDo6Y2VycgorICAgICAgICAgICAgPDwgIi0tcHJvdG9fcGF0aCBwYXNzZWQgZW1wdHkgZGlyZWN0b3J5IG5hbWUuICAoVXNlIFwiLlwiIGZvciAiCisgICAgICAgICAgICAgICAiY3VycmVudCBkaXJlY3RvcnkuKSIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICAgIH0KIAogICAgICAgLy8gTWFrZSBzdXJlIGRpc2sgcGF0aCBleGlzdHMsIHdhcm4gb3RoZXJ3aXNlLgogICAgICAgaWYgKGFjY2VzcyhkaXNrX3BhdGguY19zdHIoKSwgRl9PSykgPCAwKSB7Ci0gICAgICAgIGNlcnIgPDwgZGlza19wYXRoIDw8ICI6IHdhcm5pbmc6IGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdC4iIDw8IGVuZGw7CisgICAgICAgIHN0ZDo6Y2VyciA8PCBkaXNrX3BhdGggPDwgIjogd2FybmluZzogZGlyZWN0b3J5IGRvZXMgbm90IGV4aXN0LiIKKyAgICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICAgIH0KIAotICAgICAgcHJvdG9fcGF0aF8ucHVzaF9iYWNrKG1ha2VfcGFpcih2aXJ0dWFsX3BhdGgsIGRpc2tfcGF0aCkpOworICAgICAgLy8gRG9uJ3QgdXNlIG1ha2VfcGFpciBhcyB0aGUgb2xkL2RlZmF1bHQgc3RhbmRhcmQgbGlicmFyeSBvbiBTb2xhcmlzCisgICAgICAvLyBkb2Vzbid0IHN1cHBvcnQgaXQgd2l0aG91dCBleHBsaWNpdCB0ZW1wbGF0ZSBwYXJhbWV0ZXJzLCB3aGljaCBhcmUKKyAgICAgIC8vIGluY29tcGF0aWJsZSB3aXRoIEMrKzB4J3MgbWFrZV9wYWlyLgorICAgICAgcHJvdG9fcGF0aF8ucHVzaF9iYWNrKHBhaXI8c3RyaW5nLCBzdHJpbmc+KHZpcnR1YWxfcGF0aCwgZGlza19wYXRoKSk7CiAgICAgfQogCiAgIH0gZWxzZSBpZiAobmFtZSA9PSAiLW8iIHx8IG5hbWUgPT0gIi0tZGVzY3JpcHRvcl9zZXRfb3V0IikgewogICAgIGlmICghZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgewotICAgICAgY2VyciA8PCBuYW1lIDw8ICIgbWF5IG9ubHkgYmUgcGFzc2VkIG9uY2UuIiA8PCBlbmRsOwotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiBtYXkgb25seSBiZSBwYXNzZWQgb25jZS4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwogICAgIH0KICAgICBpZiAodmFsdWUuZW1wdHkoKSkgewotICAgICAgY2VyciA8PCBuYW1lIDw8ICIgcmVxdWlyZXMgYSBub24tZW1wdHkgdmFsdWUuIiA8PCBlbmRsOwotICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgc3RkOjpjZXJyIDw8IG5hbWUgPDwgIiByZXF1aXJlcyBhIG5vbi1lbXB0eSB2YWx1ZS4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwogICAgIH0KICAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7Ci0gICAgICBjZXJyIDw8ICJDYW5ub3QgdXNlIC0tZW5jb2RlIG9yIC0tZGVjb2RlIGFuZCBnZW5lcmF0ZSBkZXNjcmlwdG9ycyBhdCB0aGUgIgotICAgICAgICAgICAgICAic2FtZSB0aW1lLiIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHN0ZDo6Y2VycgorICAgICAgICAgIDw8ICJDYW5ub3QgdXNlIC0tZW5jb2RlIG9yIC0tZGVjb2RlIGFuZCBnZW5lcmF0ZSBkZXNjcmlwdG9ycyBhdCB0aGUgIgorICAgICAgICAgICAgICJzYW1lIHRpbWUuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICB9CiAgICAgZGVzY3JpcHRvcl9zZXRfbmFtZV8gPSB2YWx1ZTsKIAorICB9IGVsc2UgaWYgKG5hbWUgPT0gIi0tZGVwZW5kZW5jeV9vdXQiKSB7CisgICAgaWYgKCFkZXBlbmRlbmN5X291dF9uYW1lXy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGlmICh2YWx1ZS5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgbmFtZSA8PCAiIHJlcXVpcmVzIGEgbm9uLWVtcHR5IHZhbHVlLiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIGRlcGVuZGVuY3lfb3V0X25hbWVfID0gdmFsdWU7CisKICAgfSBlbHNlIGlmIChuYW1lID09ICItLWluY2x1ZGVfaW1wb3J0cyIpIHsKICAgICBpZiAoaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8pIHsKLSAgICAgIGNlcnIgPDwgbmFtZSA8PCAiIG1heSBvbmx5IGJlIHBhc3NlZCBvbmNlLiIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHN0ZDo6Y2VyciA8PCBuYW1lIDw8ICIgbWF5IG9ubHkgYmUgcGFzc2VkIG9uY2UuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICB9CiAgICAgaW1wb3J0c19pbl9kZXNjcmlwdG9yX3NldF8gPSB0cnVlOwogCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1pbmNsdWRlX3NvdXJjZV9pbmZvIikgeworICAgIGlmIChzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8pIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBuYW1lIDw8ICIgbWF5IG9ubHkgYmUgcGFzc2VkIG9uY2UuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisgICAgc291cmNlX2luZm9faW5fZGVzY3JpcHRvcl9zZXRfID0gdHJ1ZTsKKwogICB9IGVsc2UgaWYgKG5hbWUgPT0gIi1oIiB8fCBuYW1lID09ICItLWhlbHAiKSB7CiAgICAgUHJpbnRIZWxwVGV4dCgpOwotICAgIHJldHVybiBmYWxzZTsgIC8vIEV4aXQgd2l0aG91dCBydW5uaW5nIGNvbXBpbGVyLgorICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9ET05FX0FORF9FWElUOyAgLy8gRXhpdCB3aXRob3V0IHJ1bm5pbmcgY29tcGlsZXIuCiAKICAgfSBlbHNlIGlmIChuYW1lID09ICItLXZlcnNpb24iKSB7CiAgICAgaWYgKCF2ZXJzaW9uX2luZm9fLmVtcHR5KCkpIHsKLSAgICAgIGNvdXQgPDwgdmVyc2lvbl9pbmZvXyA8PCBlbmRsOworICAgICAgc3RkOjpjb3V0IDw8IHZlcnNpb25faW5mb18gPDwgc3RkOjplbmRsOwogICAgIH0KICAgICBjb3V0IDw8ICJsaWJwcm90b2MgIgogICAgICAgICAgPDwgcHJvdG9idWY6OmludGVybmFsOjpWZXJzaW9uU3RyaW5nKEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OKQogICAgICAgICAgPDwgZW5kbDsKLSAgICByZXR1cm4gZmFsc2U7ICAvLyBFeGl0IHdpdGhvdXQgcnVubmluZyBjb21waWxlci4KKyAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfRVhJVDsgIC8vIEV4aXQgd2l0aG91dCBydW5uaW5nIGNvbXBpbGVyLgogCiAgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1kaXNhbGxvd19zZXJ2aWNlcyIpIHsKICAgICBkaXNhbGxvd19zZXJ2aWNlc18gPSB0cnVlOwpAQCAtOTU1LDI2ICsxMjA3LDI5IEBACiAgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1lbmNvZGUiIHx8IG5hbWUgPT0gIi0tZGVjb2RlIiB8fAogICAgICAgICAgICAgIG5hbWUgPT0gIi0tZGVjb2RlX3JhdyIpIHsKICAgICBpZiAobW9kZV8gIT0gTU9ERV9DT01QSUxFKSB7Ci0gICAgICBjZXJyIDw8ICJPbmx5IG9uZSBvZiAtLWVuY29kZSBhbmQgLS1kZWNvZGUgY2FuIGJlIHNwZWNpZmllZC4iIDw8IGVuZGw7Ci0gICAgICByZXR1cm4gZmFsc2U7CisgICAgICBzdGQ6OmNlcnIgPDwgIk9ubHkgb25lIG9mIC0tZW5jb2RlIGFuZCAtLWRlY29kZSBjYW4gYmUgc3BlY2lmaWVkLiIKKyAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICB9CiAgICAgaWYgKCFvdXRwdXRfZGlyZWN0aXZlc18uZW1wdHkoKSB8fCAhZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgewotICAgICAgY2VyciA8PCAiQ2Fubm90IHVzZSAiIDw8IG5hbWUKLSAgICAgICAgICAgPDwgIiBhbmQgZ2VuZXJhdGUgY29kZSBvciBkZXNjcmlwdG9ycyBhdCB0aGUgc2FtZSB0aW1lLiIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiQ2Fubm90IHVzZSAiIDw8IG5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIGFuZCBnZW5lcmF0ZSBjb2RlIG9yIGRlc2NyaXB0b3JzIGF0IHRoZSBzYW1lIHRpbWUuIgorICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBQQVJTRV9BUkdVTUVOVF9GQUlMOwogICAgIH0KIAogICAgIG1vZGVfID0gKG5hbWUgPT0gIi0tZW5jb2RlIikgPyBNT0RFX0VOQ09ERSA6IE1PREVfREVDT0RFOwogCiAgICAgaWYgKHZhbHVlLmVtcHR5KCkgJiYgbmFtZSAhPSAiLS1kZWNvZGVfcmF3IikgewotICAgICAgY2VyciA8PCAiVHlwZSBuYW1lIGZvciAiIDw8IG5hbWUgPDwgIiBjYW5ub3QgYmUgYmxhbmsuIiA8PCBlbmRsOworICAgICAgc3RkOjpjZXJyIDw8ICJUeXBlIG5hbWUgZm9yICIgPDwgbmFtZSA8PCAiIGNhbm5vdCBiZSBibGFuay4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgIGlmIChuYW1lID09ICItLWRlY29kZSIpIHsKLSAgICAgICAgY2VyciA8PCAiVG8gZGVjb2RlIGFuIHVua25vd24gbWVzc2FnZSwgdXNlIC0tZGVjb2RlX3Jhdy4iIDw8IGVuZGw7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiVG8gZGVjb2RlIGFuIHVua25vd24gbWVzc2FnZSwgdXNlIC0tZGVjb2RlX3Jhdy4iCisgICAgICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgICB9Ci0gICAgICByZXR1cm4gZmFsc2U7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICB9IGVsc2UgaWYgKCF2YWx1ZS5lbXB0eSgpICYmIG5hbWUgPT0gIi0tZGVjb2RlX3JhdyIpIHsKLSAgICAgIGNlcnIgPDwgIi0tZGVjb2RlX3JhdyBkb2VzIG5vdCB0YWtlIGEgcGFyYW1ldGVyLiIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiLS1kZWNvZGVfcmF3IGRvZXMgbm90IHRha2UgYSBwYXJhbWV0ZXIuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICB9CiAKICAgICBjb2RlY190eXBlXyA9IHZhbHVlOwpAQCAtOTg1LDE3ICsxMjQwLDE3IEBACiAgICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAibXN2cyIpIHsKICAgICAgIGVycm9yX2Zvcm1hdF8gPSBFUlJPUl9GT1JNQVRfTVNWUzsKICAgICB9IGVsc2UgewotICAgICAgY2VyciA8PCAiVW5rbm93biBlcnJvciBmb3JtYXQ6ICIgPDwgdmFsdWUgPDwgZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBlcnJvciBmb3JtYXQ6ICIgPDwgdmFsdWUgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CiAgICAgfQogCiAgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1wbHVnaW4iKSB7CiAgICAgaWYgKHBsdWdpbl9wcmVmaXhfLmVtcHR5KCkpIHsKLSAgICAgIGNlcnIgPDwgIlRoaXMgY29tcGlsZXIgZG9lcyBub3Qgc3VwcG9ydCBwbHVnaW5zLiIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiVGhpcyBjb21waWxlciBkb2VzIG5vdCBzdXBwb3J0IHBsdWdpbnMuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKICAgICB9CiAKLSAgICBzdHJpbmcgbmFtZTsKKyAgICBzdHJpbmcgcGx1Z2luX25hbWU7CiAgICAgc3RyaW5nIHBhdGg7CiAKICAgICBzdHJpbmc6OnNpemVfdHlwZSBlcXVhbHNfcG9zID0gdmFsdWUuZmluZF9maXJzdF9vZignPScpOwpAQCAtMTAwMyw2MiArMTI1OCw4OCBAQAogICAgICAgLy8gVXNlIHRoZSBiYXNlbmFtZSBvZiB0aGUgZmlsZS4KICAgICAgIHN0cmluZzo6c2l6ZV90eXBlIHNsYXNoX3BvcyA9IHZhbHVlLmZpbmRfbGFzdF9vZignLycpOwogICAgICAgaWYgKHNsYXNoX3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgICAgbmFtZSA9IHZhbHVlOworICAgICAgICBwbHVnaW5fbmFtZSA9IHZhbHVlOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgbmFtZSA9IHZhbHVlLnN1YnN0cihzbGFzaF9wb3MgKyAxKTsKKyAgICAgICAgcGx1Z2luX25hbWUgPSB2YWx1ZS5zdWJzdHIoc2xhc2hfcG9zICsgMSk7CiAgICAgICB9CiAgICAgICBwYXRoID0gdmFsdWU7CiAgICAgfSBlbHNlIHsKLSAgICAgIG5hbWUgPSB2YWx1ZS5zdWJzdHIoMCwgZXF1YWxzX3Bvcyk7CisgICAgICBwbHVnaW5fbmFtZSA9IHZhbHVlLnN1YnN0cigwLCBlcXVhbHNfcG9zKTsKICAgICAgIHBhdGggPSB2YWx1ZS5zdWJzdHIoZXF1YWxzX3BvcyArIDEpOwogICAgIH0KIAotICAgIHBsdWdpbnNfW25hbWVdID0gcGF0aDsKKyAgICBwbHVnaW5zX1twbHVnaW5fbmFtZV0gPSBwYXRoOwogCisgIH0gZWxzZSBpZiAobmFtZSA9PSAiLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMiKSB7CisgICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJDYW5ub3QgdXNlICIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgYW5kIHVzZSAtLWVuY29kZSwgLS1kZWNvZGUgb3IgcHJpbnQgIgorICAgICAgICAgICAgICAgIDw8ICJvdGhlciBpbmZvIGF0IHRoZSBzYW1lIHRpbWUuIiA8PCBzdGQ6OmVuZGw7CisgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICB9CisgICAgaWYgKCFvdXRwdXRfZGlyZWN0aXZlc18uZW1wdHkoKSB8fCAhZGVzY3JpcHRvcl9zZXRfbmFtZV8uZW1wdHkoKSkgeworICAgICAgc3RkOjpjZXJyIDw8ICJDYW5ub3QgdXNlICIgPDwgbmFtZQorICAgICAgICAgICAgICAgIDw8ICIgYW5kIGdlbmVyYXRlIGNvZGUgb3IgZGVzY3JpcHRvcnMgYXQgdGhlIHNhbWUgdGltZS4iCisgICAgICAgICAgICAgICAgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIFBBUlNFX0FSR1VNRU5UX0ZBSUw7CisgICAgfQorICAgIG1vZGVfID0gTU9ERV9QUklOVDsKKyAgICBwcmludF9tb2RlXyA9IFBSSU5UX0ZSRUVfRklFTERTOwogICB9IGVsc2UgewogICAgIC8vIFNvbWUgb3RoZXIgZmxhZy4gIExvb2sgaXQgdXAgaW4gdGhlIGdlbmVyYXRvcnMgbGlzdC4KLSAgICBjb25zdCBHZW5lcmF0b3JJbmZvKiBnZW5lcmF0b3JfaW5mbyA9IEZpbmRPck51bGwoZ2VuZXJhdG9yc18sIG5hbWUpOworICAgIGNvbnN0IEdlbmVyYXRvckluZm8qIGdlbmVyYXRvcl9pbmZvID0KKyAgICAgICAgRmluZE9yTnVsbChnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV8sIG5hbWUpOwogICAgIGlmIChnZW5lcmF0b3JfaW5mbyA9PSBOVUxMICYmCiAgICAgICAgIChwbHVnaW5fcHJlZml4Xy5lbXB0eSgpIHx8ICFIYXNTdWZmaXhTdHJpbmcobmFtZSwgIl9vdXQiKSkpIHsKLSAgICAgIGNlcnIgPDwgIlVua25vd24gZmxhZzogIiA8PCBuYW1lIDw8IGVuZGw7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0gICAgfQotCi0gICAgLy8gSXQncyBhbiBvdXRwdXQgZmxhZy4gIEFkZCBpdCB0byB0aGUgb3V0cHV0IGRpcmVjdGl2ZXMuCi0gICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgewotICAgICAgY2VyciA8PCAiQ2Fubm90IHVzZSAtLWVuY29kZSBvciAtLWRlY29kZSBhbmQgZ2VuZXJhdGUgY29kZSBhdCB0aGUgIgotICAgICAgICAgICAgICAic2FtZSB0aW1lLiIgPDwgZW5kbDsKLSAgICAgIHJldHVybiBmYWxzZTsKLSAgICB9Ci0KLSAgICBPdXRwdXREaXJlY3RpdmUgZGlyZWN0aXZlOwotICAgIGRpcmVjdGl2ZS5uYW1lID0gbmFtZTsKLSAgICBpZiAoZ2VuZXJhdG9yX2luZm8gPT0gTlVMTCkgewotICAgICAgZGlyZWN0aXZlLmdlbmVyYXRvciA9IE5VTEw7CisgICAgICAvLyBDaGVjayBpZiBpdCdzIGEgZ2VuZXJhdG9yIG9wdGlvbiBmbGFnLgorICAgICAgZ2VuZXJhdG9yX2luZm8gPSBGaW5kT3JOdWxsKGdlbmVyYXRvcnNfYnlfb3B0aW9uX25hbWVfLCBuYW1lKTsKKyAgICAgIGlmIChnZW5lcmF0b3JfaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiVW5rbm93biBmbGFnOiAiIDw8IG5hbWUgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmluZyogcGFyYW1ldGVycyA9ICZnZW5lcmF0b3JfcGFyYW1ldGVyc19bZ2VuZXJhdG9yX2luZm8tPmZsYWdfbmFtZV07CisgICAgICAgIGlmICghcGFyYW1ldGVycy0+ZW1wdHkoKSkgeworICAgICAgICAgIHBhcmFtZXRlcnMtPmFwcGVuZCgiLCIpOworICAgICAgICB9CisgICAgICAgIHBhcmFtZXRlcnMtPmFwcGVuZCh2YWx1ZSk7CisgICAgICB9CiAgICAgfSBlbHNlIHsKLSAgICAgIGRpcmVjdGl2ZS5nZW5lcmF0b3IgPSBnZW5lcmF0b3JfaW5mby0+Z2VuZXJhdG9yOwotICAgIH0KKyAgICAgIC8vIEl0J3MgYW4gb3V0cHV0IGZsYWcuICBBZGQgaXQgdG8gdGhlIG91dHB1dCBkaXJlY3RpdmVzLgorICAgICAgaWYgKG1vZGVfICE9IE1PREVfQ09NUElMRSkgeworICAgICAgICBzdGQ6OmNlcnIgPDwgIkNhbm5vdCB1c2UgLS1lbmNvZGUsIC0tZGVjb2RlIG9yIHByaW50IC5wcm90byBpbmZvIGFuZCAiCisgICAgICAgICAgICAgICAgICAgICAiZ2VuZXJhdGUgY29kZSBhdCB0aGUgc2FtZSB0aW1lLiIgPDwgc3RkOjplbmRsOworICAgICAgICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRkFJTDsKKyAgICAgIH0KIAotICAgIC8vIFNwbGl0IHZhbHVlIGF0ICc6JyB0byBzZXBhcmF0ZSB0aGUgZ2VuZXJhdG9yIHBhcmFtZXRlciBmcm9tIHRoZQotICAgIC8vIGZpbGVuYW1lLiAgSG93ZXZlciwgYXZvaWQgZG9pbmcgdGhpcyBpZiB0aGUgY29sb24gaXMgcGFydCBvZiBhIHZhbGlkCi0gICAgLy8gV2luZG93cy1zdHlsZSBhYnNvbHV0ZSBwYXRoLgotICAgIHN0cmluZzo6c2l6ZV90eXBlIGNvbG9uX3BvcyA9IHZhbHVlLmZpbmRfZmlyc3Rfb2YoJzonKTsKLSAgICBpZiAoY29sb25fcG9zID09IHN0cmluZzo6bnBvcyB8fCBJc1dpbmRvd3NBYnNvbHV0ZVBhdGgodmFsdWUpKSB7Ci0gICAgICBkaXJlY3RpdmUub3V0cHV0X2xvY2F0aW9uID0gdmFsdWU7Ci0gICAgfSBlbHNlIHsKLSAgICAgIGRpcmVjdGl2ZS5wYXJhbWV0ZXIgPSB2YWx1ZS5zdWJzdHIoMCwgY29sb25fcG9zKTsKLSAgICAgIGRpcmVjdGl2ZS5vdXRwdXRfbG9jYXRpb24gPSB2YWx1ZS5zdWJzdHIoY29sb25fcG9zICsgMSk7Ci0gICAgfQorICAgICAgT3V0cHV0RGlyZWN0aXZlIGRpcmVjdGl2ZTsKKyAgICAgIGRpcmVjdGl2ZS5uYW1lID0gbmFtZTsKKyAgICAgIGlmIChnZW5lcmF0b3JfaW5mbyA9PSBOVUxMKSB7CisgICAgICAgIGRpcmVjdGl2ZS5nZW5lcmF0b3IgPSBOVUxMOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZGlyZWN0aXZlLmdlbmVyYXRvciA9IGdlbmVyYXRvcl9pbmZvLT5nZW5lcmF0b3I7CisgICAgICB9CiAKLSAgICBvdXRwdXRfZGlyZWN0aXZlc18ucHVzaF9iYWNrKGRpcmVjdGl2ZSk7CisgICAgICAvLyBTcGxpdCB2YWx1ZSBhdCAnOicgdG8gc2VwYXJhdGUgdGhlIGdlbmVyYXRvciBwYXJhbWV0ZXIgZnJvbSB0aGUKKyAgICAgIC8vIGZpbGVuYW1lLiAgSG93ZXZlciwgYXZvaWQgZG9pbmcgdGhpcyBpZiB0aGUgY29sb24gaXMgcGFydCBvZiBhIHZhbGlkCisgICAgICAvLyBXaW5kb3dzLXN0eWxlIGFic29sdXRlIHBhdGguCisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBjb2xvbl9wb3MgPSB2YWx1ZS5maW5kX2ZpcnN0X29mKCc6Jyk7CisgICAgICBpZiAoY29sb25fcG9zID09IHN0cmluZzo6bnBvcyB8fCBJc1dpbmRvd3NBYnNvbHV0ZVBhdGgodmFsdWUpKSB7CisgICAgICAgIGRpcmVjdGl2ZS5vdXRwdXRfbG9jYXRpb24gPSB2YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGRpcmVjdGl2ZS5wYXJhbWV0ZXIgPSB2YWx1ZS5zdWJzdHIoMCwgY29sb25fcG9zKTsKKyAgICAgICAgZGlyZWN0aXZlLm91dHB1dF9sb2NhdGlvbiA9IHZhbHVlLnN1YnN0cihjb2xvbl9wb3MgKyAxKTsKKyAgICAgIH0KKworICAgICAgb3V0cHV0X2RpcmVjdGl2ZXNfLnB1c2hfYmFjayhkaXJlY3RpdmUpOworICAgIH0KICAgfQogCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gUEFSU0VfQVJHVU1FTlRfRE9ORV9BTkRfQ09OVElOVUU7CiB9CiAKIHZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2U6OlByaW50SGVscFRleHQoKSB7CiAgIC8vIFNvcnJ5IGZvciBpbmRlbnRhdGlvbiBoZXJlOyBsaW5lIHdyYXBwaW5nIHdvdWxkIGJlIHVnbGllci4KLSAgY2VyciA8PAorICBzdGQ6OmNlcnIgPDwKICJVc2FnZTogIiA8PCBleGVjdXRhYmxlX25hbWVfIDw8ICIgW09QVElPTl0gUFJPVE9fRklMRVNcbiIKICJQYXJzZSBQUk9UT19GSUxFUyBhbmQgZ2VuZXJhdGUgb3V0cHV0IGJhc2VkIG9uIHRoZSBvcHRpb25zIGdpdmVuOlxuIgogIiAgLUlQQVRILCAtLXByb3RvX3BhdGg9UEFUSCAgIFNwZWNpZnkgdGhlIGRpcmVjdG9yeSBpbiB3aGljaCB0byBzZWFyY2ggZm9yXG4iCkBAIC0xMDg2LDExICsxMzY3LDI2IEBACiAiICAtLWluY2x1ZGVfaW1wb3J0cyAgICAgICAgICAgV2hlbiB1c2luZyAtLWRlc2NyaXB0b3Jfc2V0X291dCwgYWxzbyBpbmNsdWRlXG4iCiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsIGRlcGVuZGVuY2llcyBvZiB0aGUgaW5wdXQgZmlsZXMgaW4gdGhlXG4iCiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0LCBzbyB0aGF0IHRoZSBzZXQgaXMgc2VsZi1jb250YWluZWQuXG4iCisiICAtLWluY2x1ZGVfc291cmNlX2luZm8gICAgICAgV2hlbiB1c2luZyAtLWRlc2NyaXB0b3Jfc2V0X291dCwgZG8gbm90IHN0cmlwXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlQ29kZUluZm8gZnJvbSB0aGUgRmlsZURlc2NyaXB0b3JQcm90by5cbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIHJlc3VsdHMgaW4gdmFzdGx5IGxhcmdlciBkZXNjcmlwdG9ycyB0aGF0XG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZSBpbmZvcm1hdGlvbiBhYm91dCB0aGUgb3JpZ2luYWxcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiBvZiBlYWNoIGRlY2wgaW4gdGhlIHNvdXJjZSBmaWxlIGFzXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2VsbCBhcyBzdXJyb3VuZGluZyBjb21tZW50cy5cbiIKKyIgIC0tZGVwZW5kZW5jeV9vdXQ9RklMRSAgICAgICBXcml0ZSBhIGRlcGVuZGVuY3kgb3V0cHV0IGZpbGUgaW4gdGhlIGZvcm1hdFxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4cGVjdGVkIGJ5IG1ha2UuIFRoaXMgd3JpdGVzIHRoZSB0cmFuc2l0aXZlXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0IG9mIGlucHV0IGZpbGUgcGF0aHMgdG8gRklMRVxuIgogIiAgLS1lcnJvcl9mb3JtYXQ9Rk9STUFUICAgICAgIFNldCB0aGUgZm9ybWF0IGluIHdoaWNoIHRvIHByaW50IGVycm9ycy5cbiIKICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGT1JNQVQgbWF5IGJlICdnY2MnICh0aGUgZGVmYXVsdCkgb3IgJ21zdnMnXG4iCi0iICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvIGZvcm1hdCkuIiA8PCBlbmRsOworIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChNaWNyb3NvZnQgVmlzdWFsIFN0dWRpbyBmb3JtYXQpLlxuIgorIiAgLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMgIFByaW50IHRoZSBmcmVlIGZpZWxkIG51bWJlcnMgb2YgdGhlIG1lc3NhZ2VzXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmaW5lZCBpbiB0aGUgZ2l2ZW4gcHJvdG8gZmlsZXMuIEdyb3VwcyBzaGFyZVxuIgorIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBzYW1lIGZpZWxkIG51bWJlciBzcGFjZSB3aXRoIHRoZSBwYXJlbnQgXG4iCisiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS4gRXh0ZW5zaW9uIHJhbmdlcyBhcmUgY291bnRlZCBhcyBcbiIKKyIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvY2N1cGllZCBmaWVsZHMgbnVtYmVycy5cbiIKKyAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgaWYgKCFwbHVnaW5fcHJlZml4Xy5lbXB0eSgpKSB7Ci0gICAgY2VyciA8PAorICAgIHN0ZDo6Y2VyciA8PAogIiAgLS1wbHVnaW49RVhFQ1VUQUJMRSAgICAgICAgIFNwZWNpZmllcyBhIHBsdWdpbiBleGVjdXRhYmxlIHRvIHVzZS5cbiIKICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOb3JtYWxseSwgcHJvdG9jIHNlYXJjaGVzIHRoZSBQQVRIIGZvclxuIgogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsdWdpbnMsIGJ1dCB5b3UgbWF5IHNwZWNpZnkgYWRkaXRpb25hbFxuIgpAQCAtMTA5OCwxNyArMTM5NCwxNyBAQAogIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFkZGl0aW9uYWxseSwgRVhFQ1VUQUJMRSBtYXkgYmUgb2YgdGhlIGZvcm1cbiIKICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOQU1FPVBBVEgsIGluIHdoaWNoIGNhc2UgdGhlIGdpdmVuIHBsdWdpbiBuYW1lXG4iCiAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXMgbWFwcGVkIHRvIHRoZSBnaXZlbiBleGVjdXRhYmxlIGV2ZW4gaWZcbiIKLSIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZXhlY3V0YWJsZSdzIG93biBuYW1lIGRpZmZlcnMuIiA8PCBlbmRsOworIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBleGVjdXRhYmxlJ3Mgb3duIG5hbWUgZGlmZmVycy4iIDw8IHN0ZDo6ZW5kbDsKICAgfQogCi0gIGZvciAoR2VuZXJhdG9yTWFwOjppdGVyYXRvciBpdGVyID0gZ2VuZXJhdG9yc18uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGdlbmVyYXRvcnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgZm9yIChHZW5lcmF0b3JNYXA6Oml0ZXJhdG9yIGl0ZXIgPSBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV8uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGdlbmVyYXRvcnNfYnlfZmxhZ19uYW1lXy5lbmQoKTsgKytpdGVyKSB7CiAgICAgLy8gRklYTUUoa2VudG9uKTogIElmIHRoZSB0ZXh0IGlzIGxvbmcgZW5vdWdoIGl0IHdpbGwgd3JhcCwgd2hpY2ggaXMgdWdseSwKICAgICAvLyAgIGJ1dCBmaXhpbmcgdGhpcyBuaWNlbHkgKGUuZy4gc3BsaXR0aW5nIG9uIHNwYWNlcykgaXMgcHJvYmFibHkgbW9yZQogICAgIC8vICAgdHJvdWJsZSB0aGFuIGl0J3Mgd29ydGguCi0gICAgY2VyciA8PCAiICAiIDw8IGl0ZXItPmZpcnN0IDw8ICI9T1VUX0RJUiAiCi0gICAgICAgICA8PCBzdHJpbmcoMTkgLSBpdGVyLT5maXJzdC5zaXplKCksICcgJykgIC8vIFNwYWNlcyBmb3IgYWxpZ25tZW50LgotICAgICAgICAgPDwgaXRlci0+c2Vjb25kLmhlbHBfdGV4dCA8PCBlbmRsOworICAgIHN0ZDo6Y2VyciA8PCAiICAiIDw8IGl0ZXItPmZpcnN0IDw8ICI9T1VUX0RJUiAiCisgICAgICAgICAgICAgIDw8IHN0cmluZygxOSAtIGl0ZXItPmZpcnN0LnNpemUoKSwgJyAnKSAgLy8gU3BhY2VzIGZvciBhbGlnbm1lbnQuCisgICAgICAgICAgICAgIDw8IGl0ZXItPnNlY29uZC5oZWxwX3RleHQgPDwgc3RkOjplbmRsOwogICB9CiB9CiAKQEAgLTExMzEsMjAgKzE0MjcsMTA4IEBACiAgICAgaWYgKCFHZW5lcmF0ZVBsdWdpbk91dHB1dChwYXJzZWRfZmlsZXMsIHBsdWdpbl9uYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3V0cHV0X2RpcmVjdGl2ZS5wYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dCwgJmVycm9yKSkgewotICAgICAgY2VyciA8PCBvdXRwdXRfZGlyZWN0aXZlLm5hbWUgPDwgIjogIiA8PCBlcnJvciA8PCBlbmRsOworICAgICAgc3RkOjpjZXJyIDw8IG91dHB1dF9kaXJlY3RpdmUubmFtZSA8PCAiOiAiIDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0gZWxzZSB7CiAgICAgLy8gUmVndWxhciBnZW5lcmF0b3IuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKLSAgICAgIGlmICghb3V0cHV0X2RpcmVjdGl2ZS5nZW5lcmF0b3ItPkdlbmVyYXRlKAotICAgICAgICAgIHBhcnNlZF9maWxlc1tpXSwgb3V0cHV0X2RpcmVjdGl2ZS5wYXJhbWV0ZXIsCi0gICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQsICZlcnJvcikpIHsKLSAgICAgICAgLy8gR2VuZXJhdG9yIHJldHVybmVkIGFuIGVycm9yLgotICAgICAgICBjZXJyIDw8IG91dHB1dF9kaXJlY3RpdmUubmFtZSA8PCAiOiAiIDw8IHBhcnNlZF9maWxlc1tpXS0+bmFtZSgpIDw8ICI6ICIKLSAgICAgICAgICAgICA8PCBlcnJvciA8PCBlbmRsOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgc3RyaW5nIHBhcmFtZXRlcnMgPSBvdXRwdXRfZGlyZWN0aXZlLnBhcmFtZXRlcjsKKyAgICBpZiAoIWdlbmVyYXRvcl9wYXJhbWV0ZXJzX1tvdXRwdXRfZGlyZWN0aXZlLm5hbWVdLmVtcHR5KCkpIHsKKyAgICAgIGlmICghcGFyYW1ldGVycy5lbXB0eSgpKSB7CisgICAgICAgIHBhcmFtZXRlcnMuYXBwZW5kKCIsIik7CiAgICAgICB9CisgICAgICBwYXJhbWV0ZXJzLmFwcGVuZChnZW5lcmF0b3JfcGFyYW1ldGVyc19bb3V0cHV0X2RpcmVjdGl2ZS5uYW1lXSk7CisgICAgfQorICAgIGlmIChvdXRwdXRfZGlyZWN0aXZlLmdlbmVyYXRvci0+SGFzR2VuZXJhdGVBbGwoKSkgeworICAgICAgaWYgKCFvdXRwdXRfZGlyZWN0aXZlLmdlbmVyYXRvci0+R2VuZXJhdGVBbGwoCisgICAgICAgICAgcGFyc2VkX2ZpbGVzLCBwYXJhbWV0ZXJzLCBnZW5lcmF0b3JfY29udGV4dCwgJmVycm9yKSkgeworICAgICAgICAgIC8vIEdlbmVyYXRvciByZXR1cm5lZCBhbiBlcnJvci4KKyAgICAgICAgICBzdGQ6OmNlcnIgPDwgb3V0cHV0X2RpcmVjdGl2ZS5uYW1lIDw8ICI6ICIKKyAgICAgICAgICAgICAgICAgICAgPDwgIjogIiA8PCBlcnJvciA8PCBzdGQ6OmVuZGw7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgICBpZiAoIW91dHB1dF9kaXJlY3RpdmUuZ2VuZXJhdG9yLT5HZW5lcmF0ZShwYXJzZWRfZmlsZXNbaV0sIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LCAmZXJyb3IpKSB7CisgICAgICAgICAgLy8gR2VuZXJhdG9yIHJldHVybmVkIGFuIGVycm9yLgorICAgICAgICAgIHN0ZDo6Y2VyciA8PCBvdXRwdXRfZGlyZWN0aXZlLm5hbWUgPDwgIjogIiA8PCBwYXJzZWRfZmlsZXNbaV0tPm5hbWUoKQorICAgICAgICAgICAgICAgICAgICA8PCAiOiAiIDw8IGVycm9yIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBDb21tYW5kTGluZUludGVyZmFjZTo6R2VuZXJhdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlKAorICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+JiBwYXJzZWRfZmlsZXMsCisgICAgY29uc3QgR2VuZXJhdG9yQ29udGV4dE1hcCYgb3V0cHV0X2RpcmVjdG9yaWVzLAorICAgIERpc2tTb3VyY2VUcmVlKiBzb3VyY2VfdHJlZSkgeworICBGaWxlRGVzY3JpcHRvclNldCBmaWxlX3NldDsKKworICBzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBhbHJlYWR5X3NlZW47CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7CisgICAgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhwYXJzZWRfZmlsZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFscmVhZHlfc2VlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfc2V0Lm11dGFibGVfZmlsZSgpKTsKKyAgfQorCisgIHZlY3RvcjxzdHJpbmc+IG91dHB1dF9maWxlbmFtZXM7CisgIGZvciAoR2VuZXJhdG9yQ29udGV4dE1hcDo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IG91dHB1dF9kaXJlY3Rvcmllcy5iZWdpbigpOworICAgICAgIGl0ZXIgIT0gb3V0cHV0X2RpcmVjdG9yaWVzLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBjb25zdCBzdHJpbmcmIGxvY2F0aW9uID0gaXRlci0+Zmlyc3Q7CisgICAgR2VuZXJhdG9yQ29udGV4dEltcGwqIGRpcmVjdG9yeSA9IGl0ZXItPnNlY29uZDsKKyAgICB2ZWN0b3I8c3RyaW5nPiByZWxhdGl2ZV9vdXRwdXRfZmlsZW5hbWVzOworICAgIGRpcmVjdG9yeS0+R2V0T3V0cHV0RmlsZW5hbWVzKCZyZWxhdGl2ZV9vdXRwdXRfZmlsZW5hbWVzKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlbGF0aXZlX291dHB1dF9maWxlbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICAgIHN0cmluZyBvdXRwdXRfZmlsZW5hbWUgPSBsb2NhdGlvbiArIHJlbGF0aXZlX291dHB1dF9maWxlbmFtZXNbaV07CisgICAgICBpZiAob3V0cHV0X2ZpbGVuYW1lLmNvbXBhcmUoMCwgMiwgIi4vIikgPT0gMCkgeworICAgICAgICBvdXRwdXRfZmlsZW5hbWUgPSBvdXRwdXRfZmlsZW5hbWUuc3Vic3RyKDIpOworICAgICAgfQorICAgICAgb3V0cHV0X2ZpbGVuYW1lcy5wdXNoX2JhY2sob3V0cHV0X2ZpbGVuYW1lKTsKKyAgICB9CisgIH0KKworICBpbnQgZmQ7CisgIGRvIHsKKyAgICBmZCA9IG9wZW4oZGVwZW5kZW5jeV9vdXRfbmFtZV8uY19zdHIoKSwKKyAgICAgICAgICAgICAgT19XUk9OTFkgfCBPX0NSRUFUIHwgT19UUlVOQyB8IE9fQklOQVJZLCAwNjY2KTsKKyAgfSB3aGlsZSAoZmQgPCAwICYmIGVycm5vID09IEVJTlRSKTsKKworICBpZiAoZmQgPCAwKSB7CisgICAgcGVycm9yKGRlcGVuZGVuY3lfb3V0X25hbWVfLmNfc3RyKCkpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlvOjpGaWxlT3V0cHV0U3RyZWFtIG91dChmZCk7CisgIGlvOjpQcmludGVyIHByaW50ZXIoJm91dCwgJyQnKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IG91dHB1dF9maWxlbmFtZXMuc2l6ZSgpOyBpKyspIHsKKyAgICBwcmludGVyLlByaW50KG91dHB1dF9maWxlbmFtZXNbaV0uY19zdHIoKSk7CisgICAgaWYgKGkgPT0gb3V0cHV0X2ZpbGVuYW1lcy5zaXplKCkgLSAxKSB7CisgICAgICBwcmludGVyLlByaW50KCI6Iik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXIuUHJpbnQoIiBcXFxuIik7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX3NldC5maWxlX3NpemUoKTsgaSsrKSB7CisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZmlsZSA9IGZpbGVfc2V0LmZpbGUoaSk7CisgICAgY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX2ZpbGUgPSBmaWxlLm5hbWUoKTsKKyAgICBzdHJpbmcgZGlza19maWxlOworICAgIGlmIChzb3VyY2VfdHJlZSAmJgorICAgICAgICBzb3VyY2VfdHJlZS0+VmlydHVhbEZpbGVUb0Rpc2tGaWxlKHZpcnR1YWxfZmlsZSwgJmRpc2tfZmlsZSkpIHsKKyAgICAgIHByaW50ZXIuUHJpbnQoIiAkZGlza19maWxlJCIsICJkaXNrX2ZpbGUiLCBkaXNrX2ZpbGUpOworICAgICAgaWYgKGkgPCBmaWxlX3NldC5maWxlX3NpemUoKSAtIDEpIHByaW50ZXIuUHJpbnQoIlxcXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgc3RkOjpjZXJyIDw8ICJVbmFibGUgdG8gaWRlbnRpZnkgcGF0aCBmb3IgZmlsZSAiIDw8IHZpcnR1YWxfZmlsZQorICAgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKKyAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KIApAQCAtMTE2OCw4ICsxNTUyLDEwIEBACiAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXJzZWRfZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICByZXF1ZXN0LmFkZF9maWxlX3RvX2dlbmVyYXRlKHBhcnNlZF9maWxlc1tpXS0+bmFtZSgpKTsKLSAgICBHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKHBhcnNlZF9maWxlc1tpXSwgJmFscmVhZHlfc2VlbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcXVlc3QubXV0YWJsZV9wcm90b19maWxlKCkpOworICAgIEdldFRyYW5zaXRpdmVEZXBlbmRlbmNpZXMocGFyc2VkX2ZpbGVzW2ldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIEluY2x1ZGUganNvbl9uYW1lIGZvciBwbHVnaW5zLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgIC8vIEluY2x1ZGUgc291cmNlIGNvZGUgaW5mby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHJlYWR5X3NlZW4sIHJlcXVlc3QubXV0YWJsZV9wcm90b19maWxlKCkpOwogICB9CiAKICAgLy8gSW52b2tlIHRoZSBwbHVnaW4uCkBAIC0xMTg5LDcgKzE1NzUsNyBAQAogCiAgIC8vIFdyaXRlIHRoZSBmaWxlcy4gIFdlIGRvIHRoaXMgZXZlbiBpZiB0aGVyZSB3YXMgYSBnZW5lcmF0b3IgZXJyb3IgaW4gb3JkZXIKICAgLy8gdG8gbWF0Y2ggdGhlIGJlaGF2aW9yIG9mIGEgY29tcGlsZWQtaW4gZ2VuZXJhdG9yLgotICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gY3VycmVudF9vdXRwdXQ7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBjdXJyZW50X291dHB1dDsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNwb25zZS5maWxlX3NpemUoKTsgaSsrKSB7CiAgICAgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpGaWxlJiBvdXRwdXRfZmlsZSA9IHJlc3BvbnNlLmZpbGUoaSk7CiAKQEAgLTEyMzMsMTIgKzE2MTksMTIgQEAKICAgLy8gTG9vayB1cCB0aGUgdHlwZS4KICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSA9IHBvb2wtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZShjb2RlY190eXBlXyk7CiAgIGlmICh0eXBlID09IE5VTEwpIHsKLSAgICBjZXJyIDw8ICJUeXBlIG5vdCBkZWZpbmVkOiAiIDw8IGNvZGVjX3R5cGVfIDw8IGVuZGw7CisgICAgc3RkOjpjZXJyIDw8ICJUeXBlIG5vdCBkZWZpbmVkOiAiIDw8IGNvZGVjX3R5cGVfIDw8IHN0ZDo6ZW5kbDsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIAogICBEeW5hbWljTWVzc2FnZUZhY3RvcnkgZHluYW1pY19mYWN0b3J5KHBvb2wpOwotICBzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UoZHluYW1pY19mYWN0b3J5LkdldFByb3RvdHlwZSh0eXBlKS0+TmV3KCkpOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UoZHluYW1pY19mYWN0b3J5LkdldFByb3RvdHlwZSh0eXBlKS0+TmV3KCkpOwogCiAgIGlmIChtb2RlXyA9PSBNT0RFX0VOQ09ERSkgewogICAgIFNldEZkVG9UZXh0TW9kZShTVERJTl9GSUxFTk8pOwpAQCAtMTI1OSwzMiArMTY0NSwzMiBAQAogICAgIHBhcnNlci5BbGxvd1BhcnRpYWxNZXNzYWdlKHRydWUpOwogCiAgICAgaWYgKCFwYXJzZXIuUGFyc2UoJmluLCBtZXNzYWdlLmdldCgpKSkgewotICAgICAgY2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIGlucHV0LiIgPDwgZW5kbDsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIGlucHV0LiIgPDwgc3RkOjplbmRsOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfSBlbHNlIHsKICAgICAvLyBJbnB1dCBpcyBiaW5hcnkuCiAgICAgaWYgKCFtZXNzYWdlLT5QYXJzZVBhcnRpYWxGcm9tWmVyb0NvcHlTdHJlYW0oJmluKSkgewotICAgICAgY2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIGlucHV0LiIgPDwgZW5kbDsKKyAgICAgIHN0ZDo6Y2VyciA8PCAiRmFpbGVkIHRvIHBhcnNlIGlucHV0LiIgPDwgc3RkOjplbmRsOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfQogCiAgIGlmICghbWVzc2FnZS0+SXNJbml0aWFsaXplZCgpKSB7Ci0gICAgY2VyciA8PCAid2FybmluZzogIElucHV0IG1lc3NhZ2UgaXMgbWlzc2luZyByZXF1aXJlZCBmaWVsZHM6ICAiCi0gICAgICAgICA8PCBtZXNzYWdlLT5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgPDwgZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgIndhcm5pbmc6ICBJbnB1dCBtZXNzYWdlIGlzIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAgIgorICAgICAgICAgICAgICA8PCBtZXNzYWdlLT5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkgPDwgc3RkOjplbmRsOwogICB9CiAKICAgaWYgKG1vZGVfID09IE1PREVfRU5DT0RFKSB7CiAgICAgLy8gT3V0cHV0IGlzIGJpbmFyeS4KICAgICBpZiAoIW1lc3NhZ2UtPlNlcmlhbGl6ZVBhcnRpYWxUb1plcm9Db3B5U3RyZWFtKCZvdXQpKSB7Ci0gICAgICBjZXJyIDw8ICJvdXRwdXQ6IEkvTyBlcnJvci4iIDw8IGVuZGw7CisgICAgICBzdGQ6OmNlcnIgPDwgIm91dHB1dDogSS9PIGVycm9yLiIgPDwgc3RkOjplbmRsOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfSBlbHNlIHsKICAgICAvLyBPdXRwdXQgaXMgdGV4dC4KICAgICBpZiAoIVRleHRGb3JtYXQ6OlByaW50KCptZXNzYWdlLCAmb3V0KSkgewotICAgICAgY2VyciA8PCAib3V0cHV0OiBJL08gZXJyb3IuIiA8PCBlbmRsOworICAgICAgc3RkOjpjZXJyIDw8ICJvdXRwdXQ6IEkvTyBlcnJvci4iIDw8IHN0ZDo6ZW5kbDsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KQEAgLTEyOTksMTIgKzE2ODUsMjMgQEAKICAgaWYgKGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfKSB7CiAgICAgc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gYWxyZWFkeV9zZWVuOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBHZXRUcmFuc2l0aXZlRGVwZW5kZW5jaWVzKAotICAgICAgICAgIHBhcnNlZF9maWxlc1tpXSwgJmFscmVhZHlfc2VlbiwgZmlsZV9zZXQubXV0YWJsZV9maWxlKCkpOworICAgICAgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhwYXJzZWRfZmlsZXNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUsICAvLyBJbmNsdWRlIGpzb25fbmFtZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZhbHJlYWR5X3NlZW4sIGZpbGVfc2V0Lm11dGFibGVfZmlsZSgpKTsKICAgICB9CiAgIH0gZWxzZSB7CisgICAgc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4gYWxyZWFkeV9zZWVuOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgICBwYXJzZWRfZmlsZXNbaV0tPkNvcHlUbyhmaWxlX3NldC5hZGRfZmlsZSgpKTsKKyAgICAgIGlmICghYWxyZWFkeV9zZWVuLmluc2VydChwYXJzZWRfZmlsZXNbaV0pLnNlY29uZCkgeworICAgICAgICBjb250aW51ZTsKKyAgICAgIH0KKyAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGVfcHJvdG8gPSBmaWxlX3NldC5hZGRfZmlsZSgpOworICAgICAgcGFyc2VkX2ZpbGVzW2ldLT5Db3B5VG8oZmlsZV9wcm90byk7CisgICAgICBwYXJzZWRfZmlsZXNbaV0tPkNvcHlKc29uTmFtZVRvKGZpbGVfcHJvdG8pOworICAgICAgaWYgKHNvdXJjZV9pbmZvX2luX2Rlc2NyaXB0b3Jfc2V0XykgeworICAgICAgICBwYXJzZWRfZmlsZXNbaV0tPkNvcHlTb3VyY2VDb2RlSW5mb1RvKGZpbGVfcHJvdG8pOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xMzIxLDEyICsxNzE4LDE0IEBACiAKICAgaW86OkZpbGVPdXRwdXRTdHJlYW0gb3V0KGZkKTsKICAgaWYgKCFmaWxlX3NldC5TZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKCZvdXQpKSB7Ci0gICAgY2VyciA8PCBkZXNjcmlwdG9yX3NldF9uYW1lXyA8PCAiOiAiIDw8IHN0cmVycm9yKG91dC5HZXRFcnJubygpKSA8PCBlbmRsOworICAgIHN0ZDo6Y2VyciA8PCBkZXNjcmlwdG9yX3NldF9uYW1lXyA8PCAiOiAiIDw8IHN0cmVycm9yKG91dC5HZXRFcnJubygpKQorICAgICAgICAgICAgICA8PCBzdGQ6OmVuZGw7CiAgICAgb3V0LkNsb3NlKCk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAgIGlmICghb3V0LkNsb3NlKCkpIHsKLSAgICBjZXJyIDw8IGRlc2NyaXB0b3Jfc2V0X25hbWVfIDw8ICI6ICIgPDwgc3RyZXJyb3Iob3V0LkdldEVycm5vKCkpIDw8IGVuZGw7CisgICAgc3RkOjpjZXJyIDw8IGRlc2NyaXB0b3Jfc2V0X25hbWVfIDw8ICI6ICIgPDwgc3RyZXJyb3Iob3V0LkdldEVycm5vKCkpCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtMTMzNSw2ICsxNzM0LDggQEAKIAogdm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6R2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcygKICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICBib29sIGluY2x1ZGVfanNvbl9uYW1lLAorICAgIGJvb2wgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvLAogICAgIHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4sCiAgICAgUmVwZWF0ZWRQdHJGaWVsZDxGaWxlRGVzY3JpcHRvclByb3RvPiogb3V0cHV0KSB7CiAgIGlmICghYWxyZWFkeV9zZWVuLT5pbnNlcnQoZmlsZSkuc2Vjb25kKSB7CkBAIC0xMzQ0LDEzICsxNzQ1LDEzNCBAQAogCiAgIC8vIEFkZCBhbGwgZGVwZW5kZW5jaWVzLgogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhmaWxlLT5kZXBlbmRlbmN5KGkpLCBhbHJlYWR5X3NlZW4sIG91dHB1dCk7CisgICAgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcyhmaWxlLT5kZXBlbmRlbmN5KGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5jbHVkZV9qc29uX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmNsdWRlX3NvdXJjZV9jb2RlX2luZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbHJlYWR5X3NlZW4sIG91dHB1dCk7CiAgIH0KIAogICAvLyBBZGQgdGhpcyBmaWxlLgotICBmaWxlLT5Db3B5VG8ob3V0cHV0LT5BZGQoKSk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG5ld19kZXNjcmlwdG9yID0gb3V0cHV0LT5BZGQoKTsKKyAgZmlsZS0+Q29weVRvKG5ld19kZXNjcmlwdG9yKTsKKyAgaWYgKGluY2x1ZGVfanNvbl9uYW1lKSB7CisgICAgZmlsZS0+Q29weUpzb25OYW1lVG8obmV3X2Rlc2NyaXB0b3IpOworICB9CisgIGlmIChpbmNsdWRlX3NvdXJjZV9jb2RlX2luZm8pIHsKKyAgICBmaWxlLT5Db3B5U291cmNlQ29kZUluZm9UbyhuZXdfZGVzY3JpcHRvcik7CisgIH0KIH0KIAorbmFtZXNwYWNlIHsKKworLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgUHJpbnRGcmVlRmllbGROdW1iZXJzLgorLy8gU3RvcmVzIG9jY3VwaWVkIHJhbmdlcyBpbnRvIHRoZSByYW5nZXMgcGFyYW1ldGVyLCBhbmQgbmV4dCBsZXZlbCBvZiBzdWIKKy8vIG1lc3NhZ2UgdHlwZXMgaW50byB0aGUgbmVzdGVkX21lc3NhZ2VzIHBhcmFtZXRlci4gIFRoZSBGaWVsZFJhbmdlIGlzIGxlZnQKKy8vIGluY2x1c2l2ZSwgcmlnaHQgZXhjbHVzaXZlLiBpLmUuIFthLCBiKS4KKy8vCisvLyBOZXN0ZWQgTWVzc2FnZXM6CisvLyBOb3RlIHRoYXQgaXQgb25seSBzdG9yZXMgdGhlIG5lc3RlZCBtZXNzYWdlIHR5cGUsIGlmZiB0aGUgbmVzdGVkIHR5cGUgaXMKKy8vIGVpdGhlciBhIGRpcmVjdCBjaGlsZCBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvciwgb3IgdGhlIG5lc3RlZCB0eXBlIGlzIGEKKy8vIGRlY2VuZGVudCBvZiB0aGUgZ2l2ZW4gZGVzY3JpcHRvciBhbmQgYWxsIHRoZSBub2RlcyBiZXR3ZWVuIHRoZQorLy8gbmVzdGVkIHR5cGUgYW5kIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGFyZSBncm91cCB0eXBlcy4gZS5nLgorLy8KKy8vIG1lc3NhZ2UgRm9vIHsKKy8vICAgbWVzc2FnZSBCYXIgeworLy8gICAgIG1lc3NhZ2UgTmVzdGVkQmFyIHt9CisvLyAgIH0KKy8vICAgZ3JvdXAgQmF6ID0gMSB7CisvLyAgICAgZ3JvdXAgTmVzdGVkQmF6R3JvdXAgPSAyIHsKKy8vICAgICAgIG1lc3NhZ2UgUXV6IHsKKy8vICAgICAgICAgbWVzc2FnZSBOZXN0ZWRRdXoge30KKy8vICAgICAgIH0KKy8vICAgICB9CisvLyAgICAgbWVzc2FnZSBOZXN0ZWRCYXoge30KKy8vICAgfQorLy8gfQorLy8KKy8vIEluIHRoaXMgY2FzZSwgQmFyLCBRdXogYW5kIE5lc3RlZEJheiB3aWxsIGJlIGFkZGVkIGludG8gdGhlIG5lc3RlZCB0eXBlcy4KKy8vIFNpbmNlIGZyZWUgZmllbGQgbnVtYmVycyBvZiBncm91cCB0eXBlcyB3aWxsIG5vdCBiZSBwcmludGVkLCB0aGlzIG1ha2VzIHN1cmUKKy8vIHRoZSBuZXN0ZWQgbWVzc2FnZSB0eXBlcyBpbiBncm91cHMgd2lsbCBub3QgYmUgZHJvcHBlZC4gVGhlIG5lc3RlZF9tZXNzYWdlcworLy8gcGFyYW1ldGVyIHdpbGwgY29udGFpbiB0aGUgZGlyZWN0IGNoaWxkcmVuICh3aGVuIGdyb3VwcyBhcmUgaWdub3JlZCBpbiB0aGUKKy8vIHRyZWUpIG9mIHRoZSBnaXZlbiBkZXNjcmlwdG9yIGZvciB0aGUgY2FsbGVyIHRvIHRyYXZlcnNlLiBUaGUgZGVjbGFyYXRpb24KKy8vIG9yZGVyIG9mIHRoZSBuZXN0ZWQgbWVzc2FnZXMgaXMgYWxzbyBwcmVzZXJ2ZWQuCit0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IEZpZWxkUmFuZ2U7Cit2b2lkIEdhdGhlck9jY3VwaWVkRmllbGRSYW5nZXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQ8RmllbGRSYW5nZT4qIHJhbmdlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcio+KiBuZXN0ZWRfbWVzc2FnZXMpIHsKKyAgc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBncm91cHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOworICAgIHJhbmdlcy0+aW5zZXJ0KEZpZWxkUmFuZ2UoZmQtPm51bWJlcigpLCBmZC0+bnVtYmVyKCkgKyAxKSk7CisgICAgaWYgKGZkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICBncm91cHMuaW5zZXJ0KGZkLT5tZXNzYWdlX3R5cGUoKSk7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgeworICAgIHJhbmdlcy0+aW5zZXJ0KEZpZWxkUmFuZ2UoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX3JhbmdlKGkpLT5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kKSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5yZXNlcnZlZF9yYW5nZV9jb3VudCgpOyArK2kpIHsKKyAgICByYW5nZXMtPmluc2VydChGaWVsZFJhbmdlKGRlc2NyaXB0b3ItPnJlc2VydmVkX3JhbmdlKGkpLT5zdGFydCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPnJlc2VydmVkX3JhbmdlKGkpLT5lbmQpKTsKKyAgfQorICAvLyBIYW5kbGUgdGhlIG5lc3RlZCBtZXNzYWdlcy9ncm91cHMgaW4gZGVjbGFyYXRpb24gb3JkZXIgdG8gbWFrZSBpdAorICAvLyBwb3N0LW9yZGVyIHN0cmljdC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWRfZGVzYyA9IGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpOworICAgIGlmIChncm91cHMuZmluZChuZXN0ZWRfZGVzYykgIT0gZ3JvdXBzLmVuZCgpKSB7CisgICAgICBHYXRoZXJPY2N1cGllZEZpZWxkUmFuZ2VzKG5lc3RlZF9kZXNjLCByYW5nZXMsIG5lc3RlZF9tZXNzYWdlcyk7CisgICAgfSBlbHNlIHsKKyAgICAgIG5lc3RlZF9tZXNzYWdlcy0+cHVzaF9iYWNrKG5lc3RlZF9kZXNjKTsKKyAgICB9CisgIH0KK30KKworLy8gVXRpbGl0eSBmdW5jdGlvbiBmb3IgUHJpbnRGcmVlRmllbGROdW1iZXJzLgorLy8gQWN0dWFsbHkgcHJpbnRzIHRoZSBmb3JtYXR0ZWQgZnJlZSBmaWVsZCBudW1iZXJzIGZvciBnaXZlbiBtZXNzYWdlIG5hbWUgYW5kCisvLyBvY2N1cGllZCByYW5nZXMuCit2b2lkIEZvcm1hdEZyZWVGaWVsZE51bWJlcnMoY29uc3Qgc3RyaW5nJiBuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNldDxGaWVsZFJhbmdlPiYgcmFuZ2VzKSB7CisgIHN0cmluZyBvdXRwdXQ7CisgIFN0cmluZ0FwcGVuZEYoJm91dHB1dCwgIiUtMzVzIGZyZWU6IiwgbmFtZS5jX3N0cigpKTsKKyAgaW50IG5leHRfZnJlZV9udW1iZXIgPSAxOworICBmb3IgKHNldDxGaWVsZFJhbmdlPjo6Y29uc3RfaXRlcmF0b3IgaSA9IHJhbmdlcy5iZWdpbigpOworICAgICAgIGkgIT0gcmFuZ2VzLmVuZCgpOyArK2kpIHsKKyAgICAvLyBUaGlzIGhhcHBlbnMgd2hlbiBncm91cHMgcmUtdXNlIHBhcmVudCBmaWVsZCBudW1iZXJzLCBpbiB3aGljaAorICAgIC8vIGNhc2Ugd2Ugc2tpcCB0aGUgRmllbGRSYW5nZSBlbnRpcmVseS4KKyAgICBpZiAobmV4dF9mcmVlX251bWJlciA+PSBpLT5zZWNvbmQpIGNvbnRpbnVlOworCisgICAgaWYgKG5leHRfZnJlZV9udW1iZXIgPCBpLT5maXJzdCkgeworICAgICAgaWYgKG5leHRfZnJlZV9udW1iZXIgKyAxID09IGktPmZpcnN0KSB7CisgICAgICAgIC8vIFNpbmdsZXRvbgorICAgICAgICBTdHJpbmdBcHBlbmRGKCZvdXRwdXQsICIgJWQiLCBuZXh0X2ZyZWVfbnVtYmVyKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJhbmdlCisgICAgICAgIFN0cmluZ0FwcGVuZEYoJm91dHB1dCwgIiAlZC0lZCIsIG5leHRfZnJlZV9udW1iZXIsIGktPmZpcnN0IC0gMSk7CisgICAgICB9CisgICAgfQorICAgIG5leHRfZnJlZV9udW1iZXIgPSBpLT5zZWNvbmQ7CisgIH0KKyAgaWYgKG5leHRfZnJlZV9udW1iZXIgPD0gRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSB7CisgICAgU3RyaW5nQXBwZW5kRigmb3V0cHV0LCAiICVkLUlORiIsIG5leHRfZnJlZV9udW1iZXIpOworICB9CisgIHN0ZDo6Y291dCA8PCBvdXRwdXQgPDwgc3RkOjplbmRsOworfQorCit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZTo6UHJpbnRGcmVlRmllbGROdW1iZXJzKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc2V0PEZpZWxkUmFuZ2U+IHJhbmdlczsKKyAgdmVjdG9yPGNvbnN0IERlc2NyaXB0b3IqPiBuZXN0ZWRfbWVzc2FnZXM7CisgIEdhdGhlck9jY3VwaWVkRmllbGRSYW5nZXMoZGVzY3JpcHRvciwgJnJhbmdlcywgJm5lc3RlZF9tZXNzYWdlcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRfbWVzc2FnZXMuc2l6ZSgpOyArK2kpIHsKKyAgICBQcmludEZyZWVGaWVsZE51bWJlcnMobmVzdGVkX21lc3NhZ2VzW2ldKTsKKyAgfQorICBGb3JtYXRGcmVlRmllbGROdW1iZXJzKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCByYW5nZXMpOworfQorCisKIAogfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaAppbmRleCAwYjUwN2Q4Li5kMTM3NzY2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zOSw2ICszOSw3IEBACiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DT01NQU5EX0xJTkVfSU5URVJGQUNFX0hfXwogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxtYXA+CkBAIC00OCw4ICs0OSw5IEBACiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKLWNsYXNzIEZpbGVEZXNjcmlwdG9yOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCitjbGFzcyBEZXNjcmlwdG9yOyAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IuaAogY2xhc3MgRGVzY3JpcHRvclBvb2w7ICAgICAgICAvLyBkZXNjcmlwdG9yLmgKK2NsYXNzIEZpbGVEZXNjcmlwdG9yOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCiBjbGFzcyBGaWxlRGVzY3JpcHRvclByb3RvOyAgIC8vIGRlc2NyaXB0b3IucGIuaAogdGVtcGxhdGU8dHlwZW5hbWUgVD4gY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZDsgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKIApAQCAtMTEyLDYgKzExNCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGhlbHBfdGV4dCk7CiAKKyAgLy8gUmVnaXN0ZXIgYSBjb2RlIGdlbmVyYXRvciBmb3IgYSBsYW5ndWFnZS4KKyAgLy8gQmVzaWRlcyBmbGFnX25hbWUgeW91IGNhbiBzcGVjaWZ5IGFub3RoZXIgb3B0aW9uX2ZsYWdfbmFtZSB0aGF0IGNvdWxkIGJlCisgIC8vIHVzZWQgdG8gcGFzcyBleHRyYSBwYXJhbWV0ZXJzIHRvIHRoZSByZWdpc3RlcmVkIGNvZGUgZ2VuZXJhdG9yLgorICAvLyBTdXBwb3NlIHlvdSBoYXZlIHJlZ2lzdGVyZWQgYSBnZW5lcmF0b3IgYnkgY2FsbGluZzoKKyAgLy8gICBjb21tYW5kX2xpbmVfaW50ZXJmYWNlLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWZvb19vdXQiLCAiLS1mb29fb3B0IiwgLi4uKQorICAvLyBUaGVuIHlvdSBjb3VsZCBpbnZva2UgdGhlIGNvbXBpbGVyIHdpdGggYSBjb21tYW5kIGxpa2U6CisgIC8vICAgcHJvdG9jIC0tZm9vX291dD1lbmFibGVfYmFyOm91dGRpciAtLWZvb19vcHQ9ZW5hYmxlX2JhegorICAvLyBUaGlzIHdpbGwgcGFzcyAiZW5hYmxlX2JhcixlbmFibGVfYmF6IiBhcyB0aGUgcGFyYW1ldGVyIHRvIHRoZSBnZW5lcmF0b3IuCisgIHZvaWQgUmVnaXN0ZXJHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBmbGFnX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBvcHRpb25fZmxhZ19uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvZGVHZW5lcmF0b3IqIGdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGhlbHBfdGV4dCk7CisKICAgLy8gRW5hYmxlcyAicGx1Z2lucyIuICBJbiB0aGlzIG1vZGUsIGlmIGEgY29tbWFuZC1saW5lIGZsYWcgZW5kcyB3aXRoICJfb3V0IgogICAvLyBidXQgZG9lcyBub3QgbWF0Y2ggYW55IHJlZ2lzdGVyZWQgZ2VuZXJhdG9yLCB0aGUgY29tcGlsZXIgd2lsbCBhdHRlbXB0IHRvCiAgIC8vIGZpbmQgYSAicGx1Z2luIiB0byBpbXBsZW1lbnQgdGhlIGdlbmVyYXRvci4gIFBsdWdpbnMgYXJlIGp1c3QgZXhlY3V0YWJsZXMuCkBAIC0xNzYsNiArMTkxLDcgQEAKICAgY2xhc3MgRXJyb3JQcmludGVyOwogICBjbGFzcyBHZW5lcmF0b3JDb250ZXh0SW1wbDsKICAgY2xhc3MgTWVtb3J5T3V0cHV0U3RyZWFtOworICB0eXBlZGVmIGhhc2hfbWFwPHN0cmluZywgR2VuZXJhdG9yQ29udGV4dEltcGwqPiBHZW5lcmF0b3JDb250ZXh0TWFwOwogCiAgIC8vIENsZWFyIHN0YXRlIGZyb20gcHJldmlvdXMgUnVuKCkuCiAgIHZvaWQgQ2xlYXIoKTsKQEAgLTE4NiwxNCArMjAyLDIyIEBACiAgIGJvb2wgTWFrZUlucHV0c0JlUHJvdG9QYXRoUmVsYXRpdmUoCiAgICAgRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlKTsKIAorICAvLyBSZXR1cm4gc3RhdHVzIGZvciBQYXJzZUFyZ3VtZW50cygpIGFuZCBJbnRlcnByZXRBcmd1bWVudCgpLgorICBlbnVtIFBhcnNlQXJndW1lbnRTdGF0dXMgeworICAgIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0NPTlRJTlVFLAorICAgIFBBUlNFX0FSR1VNRU5UX0RPTkVfQU5EX0VYSVQsCisgICAgUEFSU0VfQVJHVU1FTlRfRkFJTAorICB9OworCiAgIC8vIFBhcnNlIGFsbCBjb21tYW5kLWxpbmUgYXJndW1lbnRzLgotICBib29sIFBhcnNlQXJndW1lbnRzKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pOworICBQYXJzZUFyZ3VtZW50U3RhdHVzIFBhcnNlQXJndW1lbnRzKGludCBhcmdjLCBjb25zdCBjaGFyKiBjb25zdCBhcmd2W10pOworCiAKICAgLy8gUGFyc2VzIGEgY29tbWFuZC1saW5lIGFyZ3VtZW50IGludG8gYSBuYW1lL3ZhbHVlIHBhaXIuICBSZXR1cm5zCiAgIC8vIHRydWUgaWYgdGhlIG5leHQgYXJndW1lbnQgaW4gdGhlIGFyZ3Ygc2hvdWxkIGJlIHVzZWQgYXMgdGhlIHZhbHVlLAogICAvLyBmYWxzZSBvdGhlcndpc2UuCiAgIC8vCi0gIC8vIEV4bWFwbGVzOgorICAvLyBFeGFtcGxlczoKICAgLy8gICAiLUlzcmMvcHJvdG9zIiAtPgogICAvLyAgICAgbmFtZSA9ICItSSIsIHZhbHVlID0gInNyYy9wcm90b3MiCiAgIC8vICAgIi0tY3BwX291dD1zcmMvZm9vLnBiMi5jYyIgLT4KQEAgLTIwMyw3ICsyMjcsOCBAQAogICBib29sIFBhcnNlQXJndW1lbnQoY29uc3QgY2hhciogYXJnLCBzdHJpbmcqIG5hbWUsIHN0cmluZyogdmFsdWUpOwogCiAgIC8vIEludGVycHJldHMgYXJndW1lbnRzIHBhcnNlZCB3aXRoIFBhcnNlQXJndW1lbnQuCi0gIGJvb2wgSW50ZXJwcmV0QXJndW1lbnQoY29uc3Qgc3RyaW5nJiBuYW1lLCBjb25zdCBzdHJpbmcmIHZhbHVlKTsKKyAgUGFyc2VBcmd1bWVudFN0YXR1cyBJbnRlcnByZXRBcmd1bWVudChjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSk7CiAKICAgLy8gUHJpbnQgdGhlIC0taGVscCB0ZXh0IHRvIHN0ZGVyci4KICAgdm9pZCBQcmludEhlbHBUZXh0KCk7CkBAIC0yMjUsMTcgKzI1MCw0NCBAQAogICAvLyBJbXBsZW1lbnRzIHRoZSAtLWRlc2NyaXB0b3Jfc2V0X291dCBvcHRpb24uCiAgIGJvb2wgV3JpdGVEZXNjcmlwdG9yU2V0KGNvbnN0IHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlcyk7CiAKKyAgLy8gSW1wbGVtZW50cyB0aGUgLS1kZXBlbmRlbmN5X291dCBvcHRpb24KKyAgYm9vbCBHZW5lcmF0ZURlcGVuZGVuY3lNYW5pZmVzdEZpbGUoCisgICAgICBjb25zdCB2ZWN0b3I8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiYgcGFyc2VkX2ZpbGVzLAorICAgICAgY29uc3QgR2VuZXJhdG9yQ29udGV4dE1hcCYgb3V0cHV0X2RpcmVjdG9yaWVzLAorICAgICAgRGlza1NvdXJjZVRyZWUqIHNvdXJjZV90cmVlKTsKKwogICAvLyBHZXQgYWxsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIG9mIHRoZSBnaXZlbiBmaWxlIChpbmNsdWRpbmcgdGhlIGZpbGUKICAgLy8gaXRzZWxmKSwgYWRkaW5nIHRoZW0gdG8gdGhlIGdpdmVuIGxpc3Qgb2YgRmlsZURlc2NyaXB0b3JQcm90b3MuICBUaGUKICAgLy8gcHJvdG9zIHdpbGwgYmUgb3JkZXJlZCBzdWNoIHRoYXQgZXZlcnkgZmlsZSBpcyBsaXN0ZWQgYmVmb3JlIGFueSBmaWxlIHRoYXQKICAgLy8gZGVwZW5kcyBvbiBpdCwgc28gdGhhdCB5b3UgY2FuIGNhbGwgRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZSgpIG9uIHRoZW0KICAgLy8gaW4gb3JkZXIuICBBbnkgZmlsZXMgaW4gKmFscmVhZHlfc2VlbiB3aWxsIG5vdCBiZSBhZGRlZCwgYW5kIGVhY2ggZmlsZQotICAvLyBhZGRlZCB3aWxsIGJlIGluc2VydGVkIGludG8gKmFscmVhZHlfc2Vlbi4KKyAgLy8gYWRkZWQgd2lsbCBiZSBpbnNlcnRlZCBpbnRvICphbHJlYWR5X3NlZW4uICBJZiBpbmNsdWRlX3NvdXJjZV9jb2RlX2luZm8gaXMKKyAgLy8gdHJ1ZSB0aGVuIGluY2x1ZGUgdGhlIHNvdXJjZSBjb2RlIGluZm9ybWF0aW9uIGluIHRoZSBGaWxlRGVzY3JpcHRvclByb3Rvcy4KKyAgLy8gSWYgaW5jbHVkZV9qc29uX25hbWUgaXMgdHJ1ZSwgcG9wdWxhdGUgdGhlIGpzb25fbmFtZSBmaWVsZCBvZgorICAvLyBGaWVsZERlc2NyaXB0b3JQcm90byBmb3IgYWxsIGZpZWxkcy4KICAgc3RhdGljIHZvaWQgR2V0VHJhbnNpdGl2ZURlcGVuZGVuY2llcygKICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgYm9vbCBpbmNsdWRlX2pzb25fbmFtZSwKKyAgICAgIGJvb2wgaW5jbHVkZV9zb3VyY2VfY29kZV9pbmZvLAogICAgICAgc2V0PGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbiwKICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RmlsZURlc2NyaXB0b3JQcm90bz4qIG91dHB1dCk7CiAKKyAgLy8gSW1wbGVtZW50cyB0aGUgLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMuIFRoaXMgZnVuY3Rpb24gcHJpbnRzIGZyZWUgZmllbGQKKyAgLy8gbnVtYmVycyBpbnRvIHN0ZG91dCBmb3IgdGhlIG1lc3NhZ2UgYW5kIGl0J3MgbmVzdGVkIG1lc3NhZ2UgdHlwZXMgaW4KKyAgLy8gcG9zdC1vcmRlciwgaS5lLiBuZXN0ZWQgdHlwZXMgZmlyc3QuIFByaW50ZWQgcmFuZ2UgYXJlIGxlZnQtcmlnaHQKKyAgLy8gaW5jbHVzaXZlLCBpLmUuIFthLCBiXS4KKyAgLy8KKyAgLy8gR3JvdXBzOgorICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBncm91cHMgYXJlIGNvbnNpZGVyZWQgdG8gc2hhcmUgdGhlIHNhbWUKKyAgLy8gZmllbGQgbnVtYmVyIHNwYWNlIHdpdGggdGhlIHBhcmVudCBtZXNzYWdlLCB0aHVzIGl0IHdpbGwgbm90IHByaW50IGZyZWUKKyAgLy8gZmllbGQgbnVtYmVycyBmb3IgZ3JvdXBzLiBUaGUgZmllbGQgbnVtYmVycyB1c2VkIGluIHRoZSBncm91cHMgYXJlCisgIC8vIGV4Y2x1ZGVkIGluIHRoZSBmcmVlIGZpZWxkIG51bWJlcnMgb2YgdGhlIHBhcmVudCBtZXNzYWdlLgorICAvLworICAvLyBFeHRlbnNpb24gUmFuZ2VzOgorICAvLyBFeHRlbnNpb24gcmFuZ2VzIGFyZSBjb25zaWRlcmVkIG9jdXBwaWVkIGZpZWxkIG51bWJlcnMgYW5kIHRoZXkgd2lsbCBub3QgYmUKKyAgLy8gbGlzdGVkIGFzIGZyZWUgbnVtYmVycyBpbiB0aGUgb3V0cHV0LgorICB2b2lkIFByaW50RnJlZUZpZWxkTnVtYmVycyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKwogICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIC8vIFRoZSBuYW1lIG9mIHRoZSBleGVjdXRhYmxlIGFzIGludm9rZWQgKGkuZS4gYXJndlswXSkuCkBAIC0yNDQsMTMgKzI5NiwyMSBAQAogICAvLyBWZXJzaW9uIGluZm8gc2V0IHdpdGggU2V0VmVyc2lvbkluZm8oKS4KICAgc3RyaW5nIHZlcnNpb25faW5mb187CiAKLSAgLy8gTWFwIGZyb20gZmxhZyBuYW1lcyB0byByZWdpc3RlcmVkIGdlbmVyYXRvcnMuCisgIC8vIFJlZ2lzdGVyZWQgZ2VuZXJhdG9ycy4KICAgc3RydWN0IEdlbmVyYXRvckluZm8geworICAgIHN0cmluZyBmbGFnX25hbWU7CisgICAgc3RyaW5nIG9wdGlvbl9mbGFnX25hbWU7CiAgICAgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yOwogICAgIHN0cmluZyBoZWxwX3RleHQ7CiAgIH07CiAgIHR5cGVkZWYgbWFwPHN0cmluZywgR2VuZXJhdG9ySW5mbz4gR2VuZXJhdG9yTWFwOwotICBHZW5lcmF0b3JNYXAgZ2VuZXJhdG9yc187CisgIEdlbmVyYXRvck1hcCBnZW5lcmF0b3JzX2J5X2ZsYWdfbmFtZV87CisgIEdlbmVyYXRvck1hcCBnZW5lcmF0b3JzX2J5X29wdGlvbl9uYW1lXzsKKyAgLy8gQSBtYXAgZnJvbSBnZW5lcmF0b3IgbmFtZXMgdG8gdGhlIHBhcmFtZXRlcnMgc3BlY2lmaWVkIHVzaW5nIHRoZSBvcHRpb24KKyAgLy8gZmxhZy4gRm9yIGV4YW1wbGUsIGlmIHRoZSB1c2VyIGludm9rZXMgdGhlIGNvbXBpbGVyIHdpdGg6CisgIC8vICAgcHJvdG9jIC0tZm9vX291dD1vdXRwdXRkaXIgLS1mb29fb3B0PWVuYWJsZV9iYXIgLi4uCisgIC8vIFRoZW4gdGhlcmUgd2lsbCBiZSBhbiBlbnRyeSAoIi0tZm9vX291dCIsICJlbmFibGVfYmFyIikgaW4gdGhpcyBtYXAuCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gZ2VuZXJhdG9yX3BhcmFtZXRlcnNfOwogCiAgIC8vIFNlZSBBbGxvd1BsdWdpbnMoKS4gIElmIHRoaXMgaXMgZW1wdHksIHBsdWdpbnMgYXJlbid0IGFsbG93ZWQuCiAgIHN0cmluZyBwbHVnaW5fcHJlZml4XzsKQEAgLTI2NCwxMSArMzI0LDE5IEBACiAgIGVudW0gTW9kZSB7CiAgICAgTU9ERV9DT01QSUxFLCAgLy8gTm9ybWFsIG1vZGU6ICBwYXJzZSAucHJvdG8gZmlsZXMgYW5kIGNvbXBpbGUgdGhlbS4KICAgICBNT0RFX0VOQ09ERSwgICAvLyAtLWVuY29kZTogIHJlYWQgdGV4dCBmcm9tIHN0ZGluLCB3cml0ZSBiaW5hcnkgdG8gc3Rkb3V0LgotICAgIE1PREVfREVDT0RFICAgIC8vIC0tZGVjb2RlOiAgcmVhZCBiaW5hcnkgZnJvbSBzdGRpbiwgd3JpdGUgdGV4dCB0byBzdGRvdXQuCisgICAgTU9ERV9ERUNPREUsICAgLy8gLS1kZWNvZGU6ICByZWFkIGJpbmFyeSBmcm9tIHN0ZGluLCB3cml0ZSB0ZXh0IHRvIHN0ZG91dC4KKyAgICBNT0RFX1BSSU5ULCAgICAvLyBQcmludCBtb2RlOiBwcmludCBpbmZvIG9mIHRoZSBnaXZlbiAucHJvdG8gZmlsZXMgYW5kIGV4aXQuCiAgIH07CiAKICAgTW9kZSBtb2RlXzsKIAorICBlbnVtIFByaW50TW9kZSB7CisgICAgUFJJTlRfTk9ORSwgICAgICAgICAgICAgICAvLyBOb3QgaW4gTU9ERV9QUklOVAorICAgIFBSSU5UX0ZSRUVfRklFTERTLCAgICAgICAgLy8gLS1wcmludF9mcmVlX2ZpZWxkcworICB9OworCisgIFByaW50TW9kZSBwcmludF9tb2RlXzsKKwogICBlbnVtIEVycm9yRm9ybWF0IHsKICAgICBFUlJPUl9GT1JNQVRfR0NDLCAgIC8vIEdDQyBlcnJvciBvdXRwdXQgZm9ybWF0IChkZWZhdWx0KS4KICAgICBFUlJPUl9GT1JNQVRfTVNWUyAgIC8vIFZpc3VhbCBTdHVkaW8gb3V0cHV0ICgtLWVycm9yX2Zvcm1hdD1tc3ZzKS4KQEAgLTI5NywxMSArMzY1LDE5IEBACiAgIC8vIEZpbGVEZXNjcmlwdG9yU2V0IHNob3VsZCBiZSB3cml0dGVuLiAgT3RoZXJ3aXNlLCBlbXB0eS4KICAgc3RyaW5nIGRlc2NyaXB0b3Jfc2V0X25hbWVfOwogCisgIC8vIElmIC0tZGVwZW5kZW5jeV9vdXQgd2FzIGdpdmVuLCB0aGlzIGlzIHRoZSBwYXRoIHRvIHRoZSBmaWxlIHdoZXJlIHRoZQorICAvLyBkZXBlbmRlbmN5IGZpbGUgd2lsbCBiZSB3cml0dGVuLiBPdGhlcndpc2UsIGVtcHR5LgorICBzdHJpbmcgZGVwZW5kZW5jeV9vdXRfbmFtZV87CisKICAgLy8gVHJ1ZSBpZiAtLWluY2x1ZGVfaW1wb3J0cyB3YXMgZ2l2ZW4sIG1lYW5pbmcgdGhhdCB3ZSBzaG91bGQKICAgLy8gd3JpdGUgYWxsIHRyYW5zaXRpdmUgZGVwZW5kZW5jaWVzIHRvIHRoZSBEZXNjcmlwdG9yU2V0LiAgT3RoZXJ3aXNlLCBvbmx5CiAgIC8vIHRoZSAucHJvdG8gZmlsZXMgbGlzdGVkIG9uIHRoZSBjb21tYW5kLWxpbmUgYXJlIGFkZGVkLgogICBib29sIGltcG9ydHNfaW5fZGVzY3JpcHRvcl9zZXRfOwogCisgIC8vIFRydWUgaWYgLS1pbmNsdWRlX3NvdXJjZV9pbmZvIHdhcyBnaXZlbiwgbWVhbmluZyB0aGF0IHdlIHNob3VsZCBub3Qgc3RyaXAKKyAgLy8gU291cmNlQ29kZUluZm8gZnJvbSB0aGUgRGVzY3JpcHRvclNldC4KKyAgYm9vbCBzb3VyY2VfaW5mb19pbl9kZXNjcmlwdG9yX3NldF87CisKICAgLy8gV2FzIHRoZSAtLWRpc2FsbG93X3NlcnZpY2VzIGZsYWcgdXNlZD8KICAgYm9vbCBkaXNhbGxvd19zZXJ2aWNlc187CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlX3VuaXR0ZXN0LmNjCmluZGV4IGQ1YjNhMWQuLjliNTA0ZDIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZV91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDAsNiArNDAsMTAgQEAKICNlbHNlCiAjaW5jbHVkZSA8dW5pc3RkLmg+CiAjZW5kaWYKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KQEAgLTQ3LDYgKzUxLDcgQEAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb21tYW5kX2xpbmVfaW50ZXJmYWNlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgpAQCAtNTUsMTMgKzYwLDE5IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCisKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBjb21waWxlciB7CiAKKy8vIERpc2FibGUgdGhlIHdob2xlIHRlc3Qgd2hlbiB3ZSB1c2UgdGNtYWxsb2MgZm9yICJkcmFjb25pYW4iIGhlYXAgY2hlY2tzLCBpbgorLy8gd2hpY2ggY2FzZSB0Y21hbGxvYyB3aWxsIHByaW50IHdhcm5pbmdzIHRoYXQgZmFpbCB0aGUgcGx1Z2luIHRlc3RzLgorI2lmICFHT09HTEVfUFJPVE9CVUZfSEVBUF9DSEVDS19EUkFDT05JQU4KKwogI2lmIGRlZmluZWQoX1dJTjMyKQogI2lmbmRlZiBTVERJTl9GSUxFTk8KICNkZWZpbmUgU1RESU5fRklMRU5PIDAKQEAgLTc2LDYgKzg3LDEwIEBACiAKIG5hbWVzcGFjZSB7CiAKK2Jvb2wgRmlsZUV4aXN0cyhjb25zdCBzdHJpbmcmIHBhdGgpIHsKKyAgcmV0dXJuIEZpbGU6OkV4aXN0cyhwYXRoKTsKK30KKwogY2xhc3MgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHByb3RlY3RlZDoKICAgdmlydHVhbCB2b2lkIFNldFVwKCk7CkBAIC0xMDIsNiArMTE3LDE2IEBACiAgIC8vIENyZWF0ZSBhIHN1YmRpcmVjdG9yeSB3aXRoaW4gdGVtcF9kaXJlY3RvcnlfLgogICB2b2lkIENyZWF0ZVRlbXBEaXIoY29uc3Qgc3RyaW5nJiBuYW1lKTsKIAorI2lmZGVmIFBST1RPQlVGX09QRU5TT1VSQ0UKKyAgLy8gQ2hhbmdlIHdvcmtpbmcgZGlyZWN0b3J5IHRvIHRlbXAgZGlyZWN0b3J5LgorICB2b2lkIFN3aXRjaFRvVGVtcERpcmVjdG9yeSgpIHsKKyAgICBGaWxlOjpDaGFuZ2VXb3JraW5nRGlyZWN0b3J5KHRlbXBfZGlyZWN0b3J5Xyk7CisgIH0KKyNlbHNlICAvLyAhUFJPVE9CVUZfT1BFTlNPVVJDRQorICAvLyBUT0RPKHRlYm9yaW5nKTogRmlndXJlIG91dCBob3cgdG8gY2hhbmdlIGFuZCBnZXQgd29ya2luZyBkaXJlY3RvcnkgaW4KKyAgLy8gZ29vZ2xlMy4KKyNlbmRpZiAgLy8gIVBST1RPQlVGX09QRU5TT1VSQ0UKKwogICB2b2lkIFNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKGJvb2wgZW5hYmxlKSB7CiAgICAgY2xpXy5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZShlbmFibGUpOwogICB9CkBAIC0xMjIsNiArMTQ3LDEzIEBACiAgIC8vIHN1YnN0cmluZy4KICAgdm9pZCBFeHBlY3RFcnJvclN1YnN0cmluZyhjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZyk7CiAKKyAgLy8gTGlrZSBFeHBlY3RFcnJvclN1YnN0cmluZywgYnV0IGNoZWNrcyB0aGF0IFJ1bigpIHJldHVybmVkIHplcm8uCisgIHZvaWQgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoCisgICAgICBjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZyk7CisKKyAgLy8gQ2hlY2tzIHRoYXQgdGhlIGNhcHR1cmVkIHN0ZG91dCBpcyB0aGUgc2FtZSBhcyB0aGUgZXhwZWN0ZWRfdGV4dC4KKyAgdm9pZCBFeHBlY3RDYXB0dXJlZFN0ZG91dChjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3RleHQpOworCiAgIC8vIFJldHVybnMgdHJ1ZSBpZiBFeHBlY3RFcnJvclN1YnN0cmluZyhleHBlY3RlZF9zdWJzdHJpbmcpIHdvdWxkIHBhc3MsIGJ1dAogICAvLyBkb2VzIG5vdCBmYWlsIG90aGVyd2lzZS4KICAgYm9vbCBIYXNBbHRlcm5hdGVFcnJvclN1YnN0cmluZyhjb25zdCBzdHJpbmcmIGV4cGVjdGVkX3N1YnN0cmluZyk7CkBAIC0xNTksNiArMTkxLDkgQEAKICAgdm9pZCBSZWFkRGVzY3JpcHRvclNldChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAogICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yU2V0KiBkZXNjcmlwdG9yX3NldCk7CiAKKyAgdm9pZCBFeHBlY3RGaWxlQ29udGVudChjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgY29udGVudCk7CisKICBwcml2YXRlOgogICAvLyBUaGUgb2JqZWN0IHdlIGFyZSB0ZXN0aW5nLgogICBDb21tYW5kTGluZUludGVyZmFjZSBjbGlfOwpAQCAtMTc4LDYgKzIxMyw5IEBACiAgIC8vIFRoZSBjYXB0dXJlZCBzdGRlcnIgb3V0cHV0LgogICBzdHJpbmcgZXJyb3JfdGV4dF87CiAKKyAgLy8gVGhlIGNhcHR1cmVkIHN0ZG91dC4KKyAgc3RyaW5nIGNhcHR1cmVkX3N0ZG91dF87CisKICAgLy8gUG9pbnRlcnMgd2hpY2ggbmVlZCB0byBiZSBkZWxldGVkIGxhdGVyLgogICB2ZWN0b3I8Q29kZUdlbmVyYXRvcio+IG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfOwogCkBAIC0yMTUsMTcgKzI1MywxNyBAQAogCiAgIC8vIElmIHRoZSB0ZW1wIGRpcmVjdG9yeSBhbHJlYWR5IGV4aXN0cywgaXQgbXVzdCBiZSBsZWZ0IG92ZXIgZnJvbSBhCiAgIC8vIHByZXZpb3VzIHJ1bi4gIERlbGV0ZSBpdC4KLSAgaWYgKEZpbGU6OkV4aXN0cyh0ZW1wX2RpcmVjdG9yeV8pKSB7CisgIGlmIChGaWxlRXhpc3RzKHRlbXBfZGlyZWN0b3J5XykpIHsKICAgICBGaWxlOjpEZWxldGVSZWN1cnNpdmVseSh0ZW1wX2RpcmVjdG9yeV8sIE5VTEwsIE5VTEwpOwogICB9CiAKICAgLy8gQ3JlYXRlIHRoZSB0ZW1wIGRpcmVjdG9yeS4KLSAgR09PR0xFX0NIRUNLKEZpbGU6OkNyZWF0ZURpcih0ZW1wX2RpcmVjdG9yeV8uY19zdHIoKSwgREVGQVVMVF9GSUxFX01PREUpKTsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkNyZWF0ZURpcih0ZW1wX2RpcmVjdG9yeV8sIDA3NzcpKTsKIAogICAvLyBSZWdpc3RlciBnZW5lcmF0b3JzLgogICBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBuZXcgTW9ja0NvZGVHZW5lcmF0b3IoInRlc3RfZ2VuZXJhdG9yIik7CiAgIG1vY2tfZ2VuZXJhdG9yc190b19kZWxldGVfLnB1c2hfYmFjayhnZW5lcmF0b3IpOwotICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXRlc3Rfb3V0IiwgZ2VuZXJhdG9yLCAiVGVzdCBvdXRwdXQuIik7CisgIGNsaV8uUmVnaXN0ZXJHZW5lcmF0b3IoIi0tdGVzdF9vdXQiLCAiLS10ZXN0X29wdCIsIGdlbmVyYXRvciwgIlRlc3Qgb3V0cHV0LiIpOwogICBjbGlfLlJlZ2lzdGVyR2VuZXJhdG9yKCItdCIsIGdlbmVyYXRvciwgIlRlc3Qgb3V0cHV0LiIpOwogCiAgIGdlbmVyYXRvciA9IG5ldyBNb2NrQ29kZUdlbmVyYXRvcigiYWx0X2dlbmVyYXRvciIpOwpAQCAtMjQxLDcgKzI3OSw5IEBACiAKIHZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpUZWFyRG93bigpIHsKICAgLy8gRGVsZXRlIHRoZSB0ZW1wIGRpcmVjdG9yeS4KLSAgRmlsZTo6RGVsZXRlUmVjdXJzaXZlbHkodGVtcF9kaXJlY3RvcnlfLCBOVUxMLCBOVUxMKTsKKyAgaWYgKEZpbGVFeGlzdHModGVtcF9kaXJlY3RvcnlfKSkgeworICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KHRlbXBfZGlyZWN0b3J5XywgTlVMTCwgTlVMTCk7CisgIH0KIAogICAvLyBEZWxldGUgYWxsIHRoZSBNb2NrQ29kZUdlbmVyYXRvcnMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbW9ja19nZW5lcmF0b3JzX3RvX2RlbGV0ZV8uc2l6ZSgpOyBpKyspIHsKQEAgLTI1MSwxMSArMjkxLDE1IEBACiB9CiAKIHZvaWQgQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0OjpSdW4oY29uc3Qgc3RyaW5nJiBjb21tYW5kKSB7Ci0gIHZlY3RvcjxzdHJpbmc+IGFyZ3M7Ci0gIFNwbGl0U3RyaW5nVXNpbmcoY29tbWFuZCwgIiAiLCAmYXJncyk7CisgIHZlY3RvcjxzdHJpbmc+IGFyZ3MgPSBTcGxpdChjb21tYW5kLCAiICIsIHRydWUpOwogCiAgIGlmICghZGlzYWxsb3dfcGx1Z2luc18pIHsKICAgICBjbGlfLkFsbG93UGx1Z2lucygicHJlZml4LSIpOworI2lmbmRlZiBHT09HTEVfVEhJUkRfUEFSVFlfUFJPVE9CVUYKKyAgICBzdHJpbmcgcGx1Z2luX3BhdGg7CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1RFU1RfUExVR0lOX1BBVEgKKyAgICBwbHVnaW5fcGF0aCA9IEdPT0dMRV9QUk9UT0JVRl9URVNUX1BMVUdJTl9QQVRIOworI2Vsc2UKICAgICBjb25zdCBjaGFyKiBwb3NzaWJsZV9wYXRoc1tdID0gewogICAgICAgLy8gV2hlbiBidWlsZGluZyB3aXRoIHNoYXJlZCBsaWJyYXJpZXMsIGxpYnRvb2wgaGlkZXMgdGhlIHJlYWwgZXhlY3V0YWJsZQogICAgICAgLy8gaW4gLmxpYnMgYW5kIHB1dHMgYSBmYWtlIHdyYXBwZXIgaW4gdGhlIGN1cnJlbnQgZGlyZWN0b3J5LgpAQCAtMjczLDE3ICszMTcsMjAgQEAKICAgICAgICJ0ZXN0X3BsdWdpbi5leGUiLCAgICAgICAgLy8gT3RoZXIgV2luMzIgKE1TVkMpCiAgICAgICAidGVzdF9wbHVnaW4iLCAgICAgICAgICAgIC8vIFVuaXgKICAgICB9OwotCi0gICAgc3RyaW5nIHBsdWdpbl9wYXRoOwotCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKHBvc3NpYmxlX3BhdGhzKTsgaSsrKSB7CiAgICAgICBpZiAoYWNjZXNzKHBvc3NpYmxlX3BhdGhzW2ldLCBGX09LKSA9PSAwKSB7CiAgICAgICAgIHBsdWdpbl9wYXRoID0gcG9zc2libGVfcGF0aHNbaV07CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KKyNlbmRpZgogCiAgICAgaWYgKHBsdWdpbl9wYXRoLmVtcHR5KCkpIHsKKyNlbHNlCisgICAgc3RyaW5nIHBsdWdpbl9wYXRoID0gInRoaXJkX3BhcnR5L3Byb3RvYnVmL3Rlc3RfcGx1Z2luIjsKKworICAgIGlmIChhY2Nlc3MocGx1Z2luX3BhdGguY19zdHIoKSwgRl9PSykgIT0gMCkgeworI2VuZGlmICAvLyBHT09HTEVfVEhJUkRfUEFSVFlfUFJPVE9CVUYKICAgICAgIEdPT0dMRV9MT0coRVJST1IpCiAgICAgICAgICAgPDwgIlBsdWdpbiBleGVjdXRhYmxlIG5vdCBmb3VuZC4gIFBsdWdpbiB0ZXN0cyBhcmUgbGlrZWx5IHRvIGZhaWwuIjsKICAgICB9IGVsc2UgewpAQCAtMjkxLDE4ICszMzgsMjcgQEAKICAgICB9CiAgIH0KIAotICBzY29wZWRfYXJyYXk8Y29uc3QgY2hhcio+IGFyZ3YobmV3IGNvbnN0IGNoYXIqW2FyZ3Muc2l6ZSgpXSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBjaGFyICogPiBhcmd2KG5ldyBjb25zdCBjaGFyKiBbYXJncy5zaXplKCldKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGFyZ3Muc2l6ZSgpOyBpKyspIHsKICAgICBhcmdzW2ldID0gU3RyaW5nUmVwbGFjZShhcmdzW2ldLCAiJHRtcGRpciIsIHRlbXBfZGlyZWN0b3J5XywgdHJ1ZSk7CiAgICAgYXJndltpXSA9IGFyZ3NbaV0uY19zdHIoKTsKICAgfQogCisgIC8vIFRPRE8oamllbHVvKTogQ3lnd2luIGRvZXNuJ3Qgd29yayB3ZWxsIGlmIHdlIHRyeSB0byBjYXB0dXJlIHN0ZGVyciBhbmQKKyAgLy8gc3Rkb3V0IGF0IHRoZSBzYW1lIHRpbWUuIE5lZWQgdG8gZmlndXJlIG91dCB3aHkgYW5kIGFkZCB0aGlzIGNhcHR1cmUgYmFjaworICAvLyBmb3IgQ3lnd2luLgorI2lmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisgIENhcHR1cmVUZXN0U3Rkb3V0KCk7CisjZW5kaWYKICAgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKIAogICByZXR1cm5fY29kZV8gPSBjbGlfLlJ1bihhcmdzLnNpemUoKSwgYXJndi5nZXQoKSk7CiAKICAgZXJyb3JfdGV4dF8gPSBHZXRDYXB0dXJlZFRlc3RTdGRlcnIoKTsKKyNpZiAhZGVmaW5lZChfX0NZR1dJTl9fKQorICBjYXB0dXJlZF9zdGRvdXRfID0gR2V0Q2FwdHVyZWRUZXN0U3Rkb3V0KCk7CisjZW5kaWYKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzE0LDE2ICszNzAsMjIgQEAKICAgc3RyaW5nOjpzaXplX3R5cGUgc2xhc2hfcG9zID0gbmFtZS5maW5kX2xhc3Rfb2YoJy8nKTsKICAgaWYgKHNsYXNoX3BvcyAhPSBzdHJpbmc6Om5wb3MpIHsKICAgICBzdHJpbmcgZGlyID0gbmFtZS5zdWJzdHIoMCwgc2xhc2hfcG9zKTsKLSAgICBGaWxlOjpSZWN1cnNpdmVseUNyZWF0ZURpcih0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBkaXIsIDA3NzcpOworICAgIGlmICghRmlsZUV4aXN0cyh0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBkaXIpKSB7CisgICAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6UmVjdXJzaXZlbHlDcmVhdGVEaXIodGVtcF9kaXJlY3RvcnlfICsgIi8iICsgZGlyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDc3NykpOworICAgIH0KICAgfQogCiAgIC8vIFdyaXRlIGZpbGUuCiAgIHN0cmluZyBmdWxsX25hbWUgPSB0ZW1wX2RpcmVjdG9yeV8gKyAiLyIgKyBuYW1lOwotICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGNvbnRlbnRzLCBmdWxsX25hbWUpOworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoCisgICAgICBmdWxsX25hbWUsIFN0cmluZ1JlcGxhY2UoY29udGVudHMsICIkdG1wZGlyIiwgdGVtcF9kaXJlY3RvcnlfLCB0cnVlKSwKKyAgICAgIHRydWUpKTsKIH0KIAogdm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkNyZWF0ZVRlbXBEaXIoY29uc3Qgc3RyaW5nJiBuYW1lKSB7Ci0gIEZpbGU6OlJlY3Vyc2l2ZWx5Q3JlYXRlRGlyKHRlbXBfZGlyZWN0b3J5XyArICIvIiArIG5hbWUsIDA3NzcpOworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6UmVjdXJzaXZlbHlDcmVhdGVEaXIodGVtcF9kaXJlY3RvcnlfICsgIi8iICsgbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMDc3NykpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zNDUsNiArNDA3LDEyIEBACiAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIGV4cGVjdGVkX3N1YnN0cmluZywgZXJyb3JfdGV4dF8pOwogfQogCit2b2lkIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6RXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoCisgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKKyAgRVhQRUNUX0VRKDAsIHJldHVybl9jb2RlXyk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIGV4cGVjdGVkX3N1YnN0cmluZywgZXJyb3JfdGV4dF8pOworfQorCiBib29sIENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdDo6SGFzQWx0ZXJuYXRlRXJyb3JTdWJzdHJpbmcoCiAgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF9zdWJzdHJpbmcpIHsKICAgRVhQRUNUX05FKDAsIHJldHVybl9jb2RlXyk7CkBAIC00MDQsMTQgKzQ3MiwyOSBAQAogICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIEZpbGVEZXNjcmlwdG9yU2V0KiBkZXNjcmlwdG9yX3NldCkgewogICBzdHJpbmcgcGF0aCA9IHRlbXBfZGlyZWN0b3J5XyArICIvIiArIGZpbGVuYW1lOwogICBzdHJpbmcgZmlsZV9jb250ZW50czsKLSAgaWYgKCFGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKHBhdGgsICZmaWxlX2NvbnRlbnRzKSkgewotICAgIEZBSUwoKSA8PCAiRmlsZSBub3QgZm91bmQ6ICIgPDwgcGF0aDsKLSAgfQorICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMocGF0aCwgJmZpbGVfY29udGVudHMsIHRydWUpKTsKKwogICBpZiAoIWRlc2NyaXB0b3Jfc2V0LT5QYXJzZUZyb21TdHJpbmcoZmlsZV9jb250ZW50cykpIHsKICAgICBGQUlMKCkgPDwgIkNvdWxkIG5vdCBwYXJzZSBmaWxlIGNvbnRlbnRzOiAiIDw8IHBhdGg7CiAgIH0KIH0KIAordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdENhcHR1cmVkU3Rkb3V0KAorICAgIGNvbnN0IHN0cmluZyYgZXhwZWN0ZWRfdGV4dCkgeworICBFWFBFQ1RfRVEoZXhwZWN0ZWRfdGV4dCwgY2FwdHVyZWRfc3Rkb3V0Xyk7Cit9CisKKwordm9pZCBDb21tYW5kTGluZUludGVyZmFjZVRlc3Q6OkV4cGVjdEZpbGVDb250ZW50KAorICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgY29udGVudCkgeworICBzdHJpbmcgcGF0aCA9IHRlbXBfZGlyZWN0b3J5XyArICIvIiArIGZpbGVuYW1lOworICBzdHJpbmcgZmlsZV9jb250ZW50czsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKHBhdGgsICZmaWxlX2NvbnRlbnRzLCB0cnVlKSk7CisKKyAgRVhQRUNUX0VRKFN0cmluZ1JlcGxhY2UoY29udGVudCwgIiR0bXBkaXIiLCB0ZW1wX2RpcmVjdG9yeV8sIHRydWUpLAorICAgICAgICAgICAgZmlsZV9jb250ZW50cyk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgQmFzaWNPdXRwdXQpIHsKQEAgLTU0NCw2ICs2MjcsMzIgQEAKICAgRXhwZWN0R2VuZXJhdGVkKCJ0ZXN0X3BsdWdpbiIsICJUZXN0UGx1Z2luUGFyYW1ldGVyIiwgImZvby5wcm90byIsICJGb28iKTsKIH0KIAorVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgRXh0cmFHZW5lcmF0b3JQYXJhbWV0ZXJzKSB7CisgIC8vIFRlc3QgdGhhdCBnZW5lcmF0b3IgcGFyYW1ldGVycyBzcGVjaWZpZWQgd2l0aCB0aGUgb3B0aW9uIGZsYWcgYXJlCisgIC8vIGNvcnJlY3RseSBwYXNzZWQgdG8gdGhlIGNvZGUgZ2VuZXJhdG9yLgorCisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIC8vIENyZWF0ZSB0aGUgImEiIGFuZCAiYiIgc3ViLWRpcmVjdG9yaWVzLgorICBDcmVhdGVUZW1wRGlyKCJhIik7CisgIENyZWF0ZVRlbXBEaXIoImIiKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyICIKKyAgICAgICItLXRlc3Rfb3B0PWZvbzEgIgorICAgICAgIi0tdGVzdF9vdXQ9YmFyOiR0bXBkaXIvYSAiCisgICAgICAiLS10ZXN0X29wdD1mb28yICIKKyAgICAgICItLXRlc3Rfb3V0PWJhejokdG1wZGlyL2IgIgorICAgICAgIi0tdGVzdF9vcHQ9Zm9vMyAiCisgICAgICAiLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKyAgRXhwZWN0R2VuZXJhdGVkKAorICAgICAgInRlc3RfZ2VuZXJhdG9yIiwgImJhcixmb28xLGZvbzIsZm9vMyIsICJmb28ucHJvdG8iLCAiRm9vIiwgImEiKTsKKyAgRXhwZWN0R2VuZXJhdGVkKAorICAgICAgInRlc3RfZ2VuZXJhdG9yIiwgImJheixmb28xLGZvbzIsZm9vMyIsICJmb28ucHJvdG8iLCAiRm9vIiwgImIiKTsKK30KKwogVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgSW5zZXJ0KSB7CiAgIC8vIFRlc3QgcnVubmluZyBhIGdlbmVyYXRvciB0aGF0IGluc2VydHMgY29kZSBpbnRvIGFub3RoZXIncyBvdXRwdXQuCiAKQEAgLTY1NSw3ICs3NjQsNyBAQAogI2VuZGlmCiAKICAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXRlc3Rfb3V0PSR0bXBkaXIgIgotICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2EiUEFUSF9TRVBBUkFUT1IiJHRtcGRpci9iIGZvby5wcm90byIpOworICAgICAgIi0tcHJvdG9fcGF0aD0kdG1wZGlyL2EiIFBBVEhfU0VQQVJBVE9SICIkdG1wZGlyL2IgZm9vLnByb3RvIik7CiAKICN1bmRlZiBQQVRIX1NFUEFSQVRPUgogCkBAIC03NzcsOCArODg2LDc2IEBACiAgIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OwogICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOwogICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKLSAgQVNTRVJUX0VRKDEsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDEsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKICAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm5hbWUoKSk7CisgIC8vIERlc2NyaXB0b3Igc2V0IHNob3VsZCBub3QgaGF2ZSBzb3VyY2UgY29kZSBpbmZvLgorICBFWFBFQ1RfRkFMU0UoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKKyAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIGhhdmUganNvbl9uYW1lLgorICBFWFBFQ1RfRVEoIkJhciIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubWVzc2FnZV90eXBlKDApLm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCkubmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5tZXNzYWdlX3R5cGUoMCkuZmllbGQoMCkuaGFzX2pzb25fbmFtZSgpKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXNjcmlwdG9yU2V0V2l0aER1cGxpY2F0ZXMpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmF6LnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCisgICAgIm1lc3NhZ2UgQmF6IHtcbiIKKyAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKKyAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlc2NyaXB0b3Jfc2V0X291dD0kdG1wZGlyL2Rlc2NyaXB0b3Jfc2V0ICIKKyAgICAgICItLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8gZm9vLnByb3RvIGJhci5wcm90byBiYXoucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworCisgIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OworICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgRVhQRUNUX0VRKDMsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm5hbWUoKSk7CisgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5uYW1lKCkpOworICBFWFBFQ1RfRVEoImJhei5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMikubmFtZSgpKTsKKyAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIG5vdCBoYXZlIHNvdXJjZSBjb2RlIGluZm8uCisgIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworICAvLyBEZXNjcmlwdG9yIHNldCBzaG91bGQgaGF2ZSBqc29uX25hbWUuCisgIEVYUEVDVF9FUSgiQmFyIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5tZXNzYWdlX3R5cGUoMCkubmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmb28iLCBkZXNjcmlwdG9yX3NldC5maWxlKDApLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKS5uYW1lKCkpOworICBFWFBFQ1RfVFJVRShkZXNjcmlwdG9yX3NldC5maWxlKDApLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKS5oYXNfanNvbl9uYW1lKCkpOworfQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlc2NyaXB0b3JTZXRXaXRoU291cmNlSW5mbykgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBGb28ge31cbiIpOworICBDcmVhdGVUZW1wRmlsZSgiYmFyLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAiaW1wb3J0IFwiZm9vLnByb3RvXCI7XG4iCisgICAgIm1lc3NhZ2UgQmFyIHtcbiIKKyAgICAiICBvcHRpb25hbCBGb28gZm9vID0gMTtcbiIKKyAgICAifVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLWRlc2NyaXB0b3Jfc2V0X291dD0kdG1wZGlyL2Rlc2NyaXB0b3Jfc2V0ICIKKyAgICAgICItLWluY2x1ZGVfc291cmNlX2luZm8gLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBGaWxlRGVzY3JpcHRvclNldCBkZXNjcmlwdG9yX3NldDsKKyAgUmVhZERlc2NyaXB0b3JTZXQoImRlc2NyaXB0b3Jfc2V0IiwgJmRlc2NyaXB0b3Jfc2V0KTsKKyAgaWYgKEhhc0ZhdGFsRmFpbHVyZSgpKSByZXR1cm47CisgIEVYUEVDVF9FUSgxLCBkZXNjcmlwdG9yX3NldC5maWxlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiYmFyLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOworICAvLyBTb3VyY2UgY29kZSBpbmZvIGluY2x1ZGVkLgorICBFWFBFQ1RfVFJVRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOwogfQogCiBURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZVRyYW5zaXRpdmVEZXNjcmlwdG9yU2V0KSB7CkBAIC04MDAsMTUgKzk3NywxMjQgQEAKICAgRmlsZURlc2NyaXB0b3JTZXQgZGVzY3JpcHRvcl9zZXQ7CiAgIFJlYWREZXNjcmlwdG9yU2V0KCJkZXNjcmlwdG9yX3NldCIsICZkZXNjcmlwdG9yX3NldCk7CiAgIGlmIChIYXNGYXRhbEZhaWx1cmUoKSkgcmV0dXJuOwotICBBU1NFUlRfRVEoMiwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMiwgZGVzY3JpcHRvcl9zZXQuZmlsZV9zaXplKCkpOwogICBpZiAoZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkgPT0gImJhci5wcm90byIpIHsKICAgICBzdGQ6OnN3YXAoZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzBdLAogICAgICAgICAgICAgICBkZXNjcmlwdG9yX3NldC5tdXRhYmxlX2ZpbGUoKS0+bXV0YWJsZV9kYXRhKClbMV0pOwogICB9CiAgIEVYUEVDVF9FUSgiZm9vLnByb3RvIiwgZGVzY3JpcHRvcl9zZXQuZmlsZSgwKS5uYW1lKCkpOwogICBFWFBFQ1RfRVEoImJhci5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkubmFtZSgpKTsKKyAgLy8gRGVzY3JpcHRvciBzZXQgc2hvdWxkIG5vdCBoYXZlIHNvdXJjZSBjb2RlIGluZm8uCisgIEVYUEVDVF9GQUxTRShkZXNjcmlwdG9yX3NldC5maWxlKDApLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworICBFWFBFQ1RfRkFMU0UoZGVzY3JpcHRvcl9zZXQuZmlsZSgxKS5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKIH0KIAorVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVUcmFuc2l0aXZlRGVzY3JpcHRvclNldFdpdGhTb3VyY2VJbmZvKSB7CisgIENyZWF0ZVRlbXBGaWxlKCJmb28ucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJtZXNzYWdlIEZvbyB7fVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKCJiYXIucHJvdG8iLAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICJpbXBvcnQgXCJmb28ucHJvdG9cIjtcbiIKKyAgICAibWVzc2FnZSBCYXIge1xuIgorICAgICIgIG9wdGlvbmFsIEZvbyBmb28gPSAxO1xuIgorICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVzY3JpcHRvcl9zZXRfb3V0PSR0bXBkaXIvZGVzY3JpcHRvcl9zZXQgIgorICAgICAgIi0taW5jbHVkZV9pbXBvcnRzIC0taW5jbHVkZV9zb3VyY2VfaW5mbyAtLXByb3RvX3BhdGg9JHRtcGRpciBiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworCisgIEZpbGVEZXNjcmlwdG9yU2V0IGRlc2NyaXB0b3Jfc2V0OworICBSZWFkRGVzY3JpcHRvclNldCgiZGVzY3JpcHRvcl9zZXQiLCAmZGVzY3JpcHRvcl9zZXQpOworICBpZiAoSGFzRmF0YWxGYWlsdXJlKCkpIHJldHVybjsKKyAgRVhQRUNUX0VRKDIsIGRlc2NyaXB0b3Jfc2V0LmZpbGVfc2l6ZSgpKTsKKyAgaWYgKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpID09ICJiYXIucHJvdG8iKSB7CisgICAgc3RkOjpzd2FwKGRlc2NyaXB0b3Jfc2V0Lm11dGFibGVfZmlsZSgpLT5tdXRhYmxlX2RhdGEoKVswXSwKKyAgICAgICAgICAgICAgZGVzY3JpcHRvcl9zZXQubXV0YWJsZV9maWxlKCktPm11dGFibGVfZGF0YSgpWzFdKTsKKyAgfQorICBFWFBFQ1RfRVEoImZvby5wcm90byIsIGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkubmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJiYXIucHJvdG8iLCBkZXNjcmlwdG9yX3NldC5maWxlKDEpLm5hbWUoKSk7CisgIC8vIFNvdXJjZSBjb2RlIGluZm8gaW5jbHVkZWQuCisgIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMCkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7CisgIEVYUEVDVF9UUlVFKGRlc2NyaXB0b3Jfc2V0LmZpbGUoMSkuaGFzX3NvdXJjZV9jb2RlX2luZm8oKSk7Cit9CisKKyNpZmRlZiBfV0lOMzIKKy8vIFRPRE8odGVib3JpbmcpOiBGaWd1cmUgb3V0IGhvdyB0byB3cml0ZSB0ZXN0IG9uIHdpbmRvd3MuCisjZWxzZQorVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgV3JpdGVEZXBlbmRlbmN5TWFuaWZlc3RGaWxlR2l2ZW5Ud29JbnB1dHMpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXBlbmRlbmN5X291dD0kdG1wZGlyL21hbmlmZXN0ICIKKyAgICAgICItLXRlc3Rfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIGZvby5wcm90byIpOworCisgIEV4cGVjdEVycm9yVGV4dCgKKyAgICAgICJDYW4gb25seSBwcm9jZXNzIG9uZSBpbnB1dCBmaWxlIHdoZW4gdXNpbmcgLS1kZXBlbmRlbmN5X291dD1GSUxFLlxuIik7Cit9CisKKyNpZmRlZiBQUk9UT0JVRl9PUEVOU09VUkNFCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlcGVuZGVuY3lNYW5pZmVzdEZpbGUpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgIn1cbiIpOworCisgIHN0cmluZyBjdXJyZW50X3dvcmtpbmdfZGlyZWN0b3J5ID0gZ2V0Y3dkKE5VTEwsIDApOworICBTd2l0Y2hUb1RlbXBEaXJlY3RvcnkoKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tZGVwZW5kZW5jeV9vdXQ9bWFuaWZlc3QgLS10ZXN0X291dD0uICIKKyAgICAgICJiYXIucHJvdG8iKTsKKworICBFeHBlY3ROb0Vycm9ycygpOworCisgIEV4cGVjdEZpbGVDb250ZW50KCJtYW5pZmVzdCIsCisgICAgICAgICAgICAgICAgICAgICJiYXIucHJvdG8uTW9ja0NvZGVHZW5lcmF0b3IudGVzdF9nZW5lcmF0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgImZvby5wcm90b1xcXG4gYmFyLnByb3RvIik7CisKKyAgRmlsZTo6Q2hhbmdlV29ya2luZ0RpcmVjdG9yeShjdXJyZW50X3dvcmtpbmdfZGlyZWN0b3J5KTsKK30KKyNlbHNlICAvLyAhUFJPVE9CVUZfT1BFTlNPVVJDRQorLy8gVE9ETyh0ZWJvcmluZyk6IEZpZ3VyZSBvdXQgaG93IHRvIGNoYW5nZSBhbmQgZ2V0IHdvcmtpbmcgZGlyZWN0b3J5IGluCisvLyBnb29nbGUzLgorI2VuZGlmICAvLyAhUFJPVE9CVUZfT1BFTlNPVVJDRQorCitURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBXcml0ZURlcGVuZGVuY3lNYW5pZmVzdEZpbGVGb3JBYnNvbHV0ZVBhdGgpIHsKKyAgQ3JlYXRlVGVtcEZpbGUoImZvby5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgIm1lc3NhZ2UgRm9vIHt9XG4iKTsKKyAgQ3JlYXRlVGVtcEZpbGUoImJhci5wcm90byIsCisgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgIiAgb3B0aW9uYWwgRm9vIGZvbyA9IDE7XG4iCisgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1kZXBlbmRlbmN5X291dD0kdG1wZGlyL21hbmlmZXN0ICIKKyAgICAgICItLXRlc3Rfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgYmFyLnByb3RvIik7CisKKyAgRXhwZWN0Tm9FcnJvcnMoKTsKKworICBFeHBlY3RGaWxlQ29udGVudCgibWFuaWZlc3QiLAorICAgICAgICAgICAgICAgICAgICAiJHRtcGRpci9iYXIucHJvdG8uTW9ja0NvZGVHZW5lcmF0b3IudGVzdF9nZW5lcmF0b3I6ICIKKyAgICAgICAgICAgICAgICAgICAgIiR0bXBkaXIvZm9vLnByb3RvXFxcbiAkdG1wZGlyL2Jhci5wcm90byIpOworfQorI2VuZGlmICAvLyAhX1dJTjMyCisKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBQYXJzZUVycm9ycykgewpAQCAtMTEyOSw2ICsxNDE1LDI5IEBACiAjZW5kaWYKIH0KIAorVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luUmVjZWl2ZXNTb3VyY2VDb2RlSW5mbykgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbyB7fVxuIik7CisKKyAgUnVuKCJwcm90b2NvbF9jb21waWxlciAtLXBsdWdfb3V0PSR0bXBkaXIgLS1wcm90b19wYXRoPSR0bXBkaXIgZm9vLnByb3RvIik7CisKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoCisgICAgICAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbzogMS4iKTsKK30KKworVEVTVF9GKENvbW1hbmRMaW5lSW50ZXJmYWNlVGVzdCwgUGx1Z2luUmVjZWl2ZXNKc29uTmFtZSkgeworICBDcmVhdGVUZW1wRmlsZSgiZm9vLnByb3RvIiwKKyAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAibWVzc2FnZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNKc29uTmFtZSB7XG4iCisgICAgIiAgb3B0aW9uYWwgaW50MzIgdmFsdWUgPSAxO1xuIgorICAgICJ9XG4iKTsKKworICBSdW4oInByb3RvY29sX2NvbXBpbGVyIC0tcGx1Z19vdXQ9JHRtcGRpciAtLXByb3RvX3BhdGg9JHRtcGRpciBmb28ucHJvdG8iKTsKKworICBFeHBlY3RFcnJvclN1YnN0cmluZygiU2F3IGpzb25fbmFtZTogMSIpOworfQorCiBURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBHZW5lcmF0b3JQbHVnaW5Ob3RGb3VuZCkgewogICAvLyBUZXN0IHdoYXQgaGFwcGVucyBpZiB0aGUgcGx1Z2luIGlzbid0IGZvdW5kLgogCkBAIC0xMTcxLDExICsxNDgwLDExIEBACiBURVNUX0YoQ29tbWFuZExpbmVJbnRlcmZhY2VUZXN0LCBIZWxwVGV4dCkgewogICBSdW4oInRlc3RfZXhlY19uYW1lIC0taGVscCIpOwogCi0gIEV4cGVjdEVycm9yU3Vic3RyaW5nKCJVc2FnZTogdGVzdF9leGVjX25hbWUgIik7Ci0gIEV4cGVjdEVycm9yU3Vic3RyaW5nKCItLXRlc3Rfb3V0PU9VVF9ESVIiKTsKLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIlRlc3Qgb3V0cHV0LiIpOwotICBFeHBlY3RFcnJvclN1YnN0cmluZygiLS1hbHRfb3V0PU9VVF9ESVIiKTsKLSAgRXhwZWN0RXJyb3JTdWJzdHJpbmcoIkFsdCBvdXRwdXQuIik7CisgIEV4cGVjdEVycm9yU3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKCJVc2FnZTogdGVzdF9leGVjX25hbWUgIik7CisgIEV4cGVjdEVycm9yU3Vic3RyaW5nV2l0aFplcm9SZXR1cm5Db2RlKCItLXRlc3Rfb3V0PU9VVF9ESVIiKTsKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoIlRlc3Qgb3V0cHV0LiIpOworICBFeHBlY3RFcnJvclN1YnN0cmluZ1dpdGhaZXJvUmV0dXJuQ29kZSgiLS1hbHRfb3V0PU9VVF9ESVIiKTsKKyAgRXhwZWN0RXJyb3JTdWJzdHJpbmdXaXRoWmVyb1JldHVybkNvZGUoIkFsdCBvdXRwdXQuIik7CiB9CiAKIFRFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIEdjY0Zvcm1hdEVycm9ycykgewpAQCAtMTI4NSw2ICsxNTk0LDc2IEBACiAgIEV4cGVjdEVycm9yVGV4dCgiTWlzc2luZyB2YWx1ZSBmb3IgZmxhZzogLS10ZXN0X291dFxuIik7CiB9CiAKK1RFU1RfRihDb21tYW5kTGluZUludGVyZmFjZVRlc3QsIFByaW50RnJlZUZpZWxkTnVtYmVycykgeworICBDcmVhdGVUZW1wRmlsZSgKKyAgICAgICJmb28ucHJvdG8iLAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYSA9IDI7XG4iCisgICAgICAiICBvcHRpb25hbCBzdHJpbmcgYiA9IDQ7XG4iCisgICAgICAiICBvcHRpb25hbCBzdHJpbmcgYyA9IDU7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQ2NCBkID0gODtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGRvdWJsZSBlID0gMTA7XG4iCisgICAgICAifVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKAorICAgICAgImJhci5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBhID0gMjtcbiIKKyAgICAgICIgIGV4dGVuc2lvbnMgNCB0byA1O1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50NjQgZCA9IDg7XG4iCisgICAgICAiICBleHRlbnNpb25zIDEwO1xuIgorICAgICAgIn1cbiIpOworICBDcmVhdGVUZW1wRmlsZSgKKyAgICAgICJiYXoucHJvdG8iLAorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAibWVzc2FnZSBCYXoge1xuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYSA9IDI7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQ2NCBkID0gODtcbiIKKyAgICAgICIgIGV4dGVuc2lvbnMgMTUgdG8gbWF4O1xuIiAgLy8gdW5vcmRlcmVkLgorICAgICAgIiAgZXh0ZW5zaW9ucyAxMztcbiIKKyAgICAgICIgIGV4dGVuc2lvbnMgMTAgdG8gMTI7XG4iCisgICAgICAiICBleHRlbnNpb25zIDU7XG4iCisgICAgICAiICBleHRlbnNpb25zIDQ7XG4iCisgICAgICAifVxuIik7CisgIENyZWF0ZVRlbXBGaWxlKAorICAgICAgInF1ei5wcm90byIsCisgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICJtZXNzYWdlIFF1eiB7XG4iCisgICAgICAiICBtZXNzYWdlIEZvbyB7fVxuIiAgLy8gbmVzdGVkIG1lc3NhZ2UKKyAgICAgICIgIG9wdGlvbmFsIGludDMyIGEgPSAyO1xuIgorICAgICAgIiAgb3B0aW9uYWwgZ3JvdXAgQyA9IDQge1xuIgorICAgICAgIiAgICBvcHRpb25hbCBpbnQzMiBkID0gNTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIGV4dGVuc2lvbnMgOCB0byAxMDtcbiIKKyAgICAgICIgIG9wdGlvbmFsIGdyb3VwIEUgPSAxMSB7XG4iCisgICAgICAiICAgIG9wdGlvbmFsIGludDMyIGYgPSA5O1xuIiAgICAvLyBleHBsaWNpdGx5IHJldXNlIGV4dGVuc2lvbiByYW5nZSA4LTEwCisgICAgICAiICAgIG9wdGlvbmFsIGdyb3VwIEcgPSAxNSB7XG4iICAvLyBuZXN0ZWQgZ3JvdXAKKyAgICAgICIgICAgICBtZXNzYWdlIEZvbyB7fVxuIiAgICAgICAgIC8vIG5lc3RlZCBtZXNzYWdlIGluc2lkZSBuZXN0ZWQgZ3JvdXAKKyAgICAgICIgICAgfVxuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIpOworCisgIFJ1bigicHJvdG9jb2xfY29tcGlsZXIgLS1wcmludF9mcmVlX2ZpZWxkX251bWJlcnMgLS1wcm90b19wYXRoPSR0bXBkaXIgIgorICAgICAgImZvby5wcm90byBiYXIucHJvdG8gYmF6LnByb3RvIHF1ei5wcm90byIpOworCisgIEV4cGVjdE5vRXJyb3JzKCk7CisKKyAgLy8gVE9ETyhqaWVsdW8pOiBDeWd3aW4gZG9lc24ndCB3b3JrIHdlbGwgaWYgd2UgdHJ5IHRvIGNhcHR1cmUgc3RkZXJyIGFuZAorICAvLyBzdGRvdXQgYXQgdGhlIHNhbWUgdGltZS4gTmVlZCB0byBmaWd1cmUgb3V0IHdoeSBhbmQgYWRkIHRoaXMgdGVzdCBiYWNrCisgIC8vIGZvciBDeWd3aW4uCisjaWYgIWRlZmluZWQoX19DWUdXSU5fXykKKyAgRXhwZWN0Q2FwdHVyZWRTdGRvdXQoCisgICAgICAiZm9vLkZvbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZTogMSAzIDYtNyA5IDExLUlORlxuIgorICAgICAgIkJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWU6IDEgMyA2LTcgOSAxMS1JTkZcbiIKKyAgICAgICJCYXogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOiAxIDMgNi03IDkgMTRcbiIKKyAgICAgICJRdXouRm9vICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcmVlOiAxLUlORlxuIgorICAgICAgIlF1ei5FLkcuRm9vICAgICAgICAgICAgICAgICAgICAgICAgIGZyZWU6IDEtSU5GXG4iCisgICAgICAiUXV6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZTogMSAzIDYtNyAxMi0xNCAxNi1JTkZcbiIpOworI2VuZGlmCit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogLy8gVGVzdCBmb3IgLS1lbmNvZGUgYW5kIC0tZGVjb2RlLiAgTm90ZSB0aGF0IGl0IHdvdWxkIGJlIGVhc2llciB0byBkbyB0aGlzCkBAIC0xMzA0LDcgKzE2ODMsNyBAQAogCiAgIHZvaWQgUmVkaXJlY3RTdGRpbkZyb21UZXh0KGNvbnN0IHN0cmluZyYgaW5wdXQpIHsKICAgICBzdHJpbmcgZmlsZW5hbWUgPSBUZXN0VGVtcERpcigpICsgIi90ZXN0X3N0ZGluIjsKLSAgICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGlucHV0LCBmaWxlbmFtZSk7CisgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlNldENvbnRlbnRzKGZpbGVuYW1lLCBpbnB1dCwgdHJ1ZSkpOwogICAgIEdPT0dMRV9DSEVDSyhSZWRpcmVjdFN0ZGluRnJvbUZpbGUoZmlsZW5hbWUpKTsKICAgfQogCkBAIC0xMzM4LDcgKzE3MTcsNyBAQAogICAgIFNwbGl0U3RyaW5nVXNpbmcoY29tbWFuZCwgIiAiLCAmYXJncyk7CiAgICAgYXJncy5wdXNoX2JhY2soIi0tcHJvdG9fcGF0aD0iICsgVGVzdFNvdXJjZURpcigpKTsKIAotICAgIHNjb3BlZF9hcnJheTxjb25zdCBjaGFyKj4gYXJndihuZXcgY29uc3QgY2hhcipbYXJncy5zaXplKCldKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Y29uc3QgY2hhciAqID4gYXJndihuZXcgY29uc3QgY2hhciogW2FyZ3Muc2l6ZSgpXSk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhcmdzLnNpemUoKTsgaSsrKSB7CiAgICAgICBhcmd2W2ldID0gYXJnc1tpXS5jX3N0cigpOwogICAgIH0KQEAgLTEzNTksNyArMTczOCw3IEBACiAKICAgdm9pZCBFeHBlY3RTdGRvdXRNYXRjaGVzQmluYXJ5RmlsZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CiAgICAgc3RyaW5nIGV4cGVjdGVkX291dHB1dDsKLSAgICBBU1NFUlRfVFJVRShGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKGZpbGVuYW1lLCAmZXhwZWN0ZWRfb3V0cHV0KSk7CisgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKGZpbGVuYW1lLCAmZXhwZWN0ZWRfb3V0cHV0LCB0cnVlKSk7CiAKICAgICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGJlY2F1c2Ugd2UgZG9uJ3Qgd2FudCB0byBwcmludCByYXcgYmluYXJ5IGRhdGEgdG8KICAgICAvLyBzdGRvdXQgb24gZmFpbHVyZS4KQEAgLTEzNjgsNyArMTc0Nyw3IEBACiAKICAgdm9pZCBFeHBlY3RTdGRvdXRNYXRjaGVzVGV4dEZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewogICAgIHN0cmluZyBleHBlY3RlZF9vdXRwdXQ7Ci0gICAgQVNTRVJUX1RSVUUoRmlsZTo6UmVhZEZpbGVUb1N0cmluZyhmaWxlbmFtZSwgJmV4cGVjdGVkX291dHB1dCkpOworICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpHZXRDb250ZW50cyhmaWxlbmFtZSwgJmV4cGVjdGVkX291dHB1dCwgdHJ1ZSkpOwogCiAgICAgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHQoZXhwZWN0ZWRfb3V0cHV0KTsKICAgfQpAQCAtMTM4OCwyMiArMTc2NywyMyBAQAogfTsKIAogVEVTVF9GKEVuY29kZURlY29kZVRlc3QsIEVuY29kZSkgewotICBSZWRpcmVjdFN0ZGluRnJvbUZpbGUoVGVzdFNvdXJjZURpcigpICsKLSAgICAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dCIpOworICBSZWRpcmVjdFN0ZGluRnJvbUZpbGUoVGVzdFNvdXJjZURpcigpICsgIi9nb29nbGUvcHJvdG9idWYvIgorICAgICJ0ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dCIpOwogICBFWFBFQ1RfVFJVRShSdW4oImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byAiCiAgICAgICAgICAgICAgICAgICAiLS1lbmNvZGU9cHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzIikpOwogICBFeHBlY3RTdGRvdXRNYXRjaGVzQmluYXJ5RmlsZShUZXN0U291cmNlRGlyKCkgKwotICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIik7CisgICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQiKTsKICAgRXhwZWN0U3RkZXJyTWF0Y2hlc1RleHQoIiIpOwogfQogCiBURVNUX0YoRW5jb2RlRGVjb2RlVGVzdCwgRGVjb2RlKSB7CiAgIFJlZGlyZWN0U3RkaW5Gcm9tRmlsZShUZXN0U291cmNlRGlyKCkgKwotICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIik7CisgICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQiKTsKICAgRVhQRUNUX1RSVUUoUnVuKCJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8gIgogICAgICAgICAgICAgICAgICAgIi0tZGVjb2RlPXByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpKTsKICAgRXhwZWN0U3Rkb3V0TWF0Y2hlc1RleHRGaWxlKFRlc3RTb3VyY2VEaXIoKSArCi0gICAgIi9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQiKTsKKyAgICAiL2dvb2dsZS9wcm90b2J1Zi8iCisgICAgInRlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfb25lb2ZfaW1wbGVtZW50ZWQudHh0Iik7CiAgIEV4cGVjdFN0ZGVyck1hdGNoZXNUZXh0KCIiKTsKIH0KIApAQCAtMTQ0Nyw2ICsxODI3LDggQEAKIAogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCisjZW5kaWYgIC8vICFHT09HTEVfUFJPVE9CVUZfSEVBUF9DSEVDS19EUkFDT05JQU4KKwogfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfYm9vdHN0cmFwX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MKaW5kZXggYmNmYTUwMi4uNzc0NTFhYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9ib290c3RyYXBfdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQ4LDEyICs0OCwxMyBAQAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCkBAIC05MywxMiArOTQsMTMgQEAKICAgICAgIDw8ICJHZW5lcmF0b3IgZmFpbGVkIHRvIGdlbmVyYXRlIGZpbGU6ICIgPDwgdmlydHVhbF9maWxlbmFtZTsKIAogICAgIHN0cmluZyBhY3R1YWxfY29udGVudHM7Ci0gICAgRmlsZTo6UmVhZEZpbGVUb1N0cmluZ09yRGllKAotICAgICAgVGVzdFNvdXJjZURpcigpICsgIi8iICsgcGh5c2ljYWxfZmlsZW5hbWUsCi0gICAgICAmYWN0dWFsX2NvbnRlbnRzKTsKKyAgICBHT09HTEVfQ0hFQ0tfT0soCisgICAgICAgIEZpbGU6OkdldENvbnRlbnRzKFRlc3RTb3VyY2VEaXIoKSArICIvIiArIHBoeXNpY2FsX2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAmYWN0dWFsX2NvbnRlbnRzLCB0cnVlKSk7CiAgICAgRVhQRUNUX1RSVUUoYWN0dWFsX2NvbnRlbnRzID09ICpleHBlY3RlZF9jb250ZW50cykKICAgICAgIDw8IHBoeXNpY2FsX2ZpbGVuYW1lIDw8ICIgbmVlZHMgdG8gYmUgcmVnZW5lcmF0ZWQuICBQbGVhc2UgcnVuICIKLSAgICAgICAgICJnZW5lcmF0ZV9kZXNjcmlwdG9yX3Byb3RvLnNoIGFuZCBhZGQgdGhpcyBmaWxlICIKKyAgICAgICAgICJnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcmVsZWFzZV9jb21waWxlci5zaCBhbmQgIgorICAgICAgICAgImdlbmVyYXRlX2Rlc2NyaXB0b3JfcHJvdG8uc2guIFRoZW4gYWRkIHRoaXMgZmlsZSAiCiAgICAgICAgICAidG8geW91ciBDTC4iOwogICB9CiAKQEAgLTEwNiw3ICsxMDgsNyBAQAogCiAgIHZpcnR1YWwgaW86Olplcm9Db3B5T3V0cHV0U3RyZWFtKiBPcGVuKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKICAgICBzdHJpbmcqKiBtYXBfc2xvdCA9ICZmaWxlc19bZmlsZW5hbWVdOwotICAgIGlmICgqbWFwX3Nsb3QgIT0gTlVMTCkgZGVsZXRlICptYXBfc2xvdDsKKyAgICBkZWxldGUgKm1hcF9zbG90OwogICAgICptYXBfc2xvdCA9IG5ldyBzdHJpbmc7CiAKICAgICByZXR1cm4gbmV3IGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0oKm1hcF9zbG90KTsKQEAgLTEzMiw4ICsxMzQsNyBAQAogICBDcHBHZW5lcmF0b3IgZ2VuZXJhdG9yOwogICBNb2NrR2VuZXJhdG9yQ29udGV4dCBjb250ZXh0OwogICBzdHJpbmcgZXJyb3I7Ci0gIHN0cmluZyBwYXJhbWV0ZXI7Ci0gIHBhcmFtZXRlciA9ICJkbGxleHBvcnRfZGVjbD1MSUJQUk9UT0JVRl9FWFBPUlQiOworICBzdHJpbmcgcGFyYW1ldGVyID0gImRsbGV4cG9ydF9kZWNsPUxJQlBST1RPQlVGX0VYUE9SVCI7CiAgIEFTU0VSVF9UUlVFKGdlbmVyYXRvci5HZW5lcmF0ZShwcm90b19maWxlLCBwYXJhbWV0ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY29udGV4dCwgJmVycm9yKSk7CiAgIHBhcmFtZXRlciA9ICJkbGxleHBvcnRfZGVjbD1MSUJQUk9UT0NfRVhQT1JUIjsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5jYwppbmRleCA3NmQyYjc5Li5jODFjNTk4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMiw3ICszMiw2IEBACiAvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAotI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxtYXA+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmg+CkBAIC00NSwzNCArNDQsNjUgQEAKIG5hbWVzcGFjZSBjb21waWxlciB7CiBuYW1lc3BhY2UgY3BwIHsKIAorbmFtZXNwYWNlIHsKKy8vIFRoZSBHT09HTEVfQVJSQVlTSVpFIGNvbnN0YW50IGlzIHRoZSBtYXggZW51bSB2YWx1ZSBwbHVzIDEuIElmIHRoZSBtYXggZW51bSB2YWx1ZQorLy8gaXMgOjpnb29nbGU6OnByb3RvYnVmOjpraW50MzJtYXgsIEdPT0dMRV9BUlJBWVNJWkUgd2lsbCBvdmVyZmxvdy4gSW4gc3VjaCBjYXNlcyB3ZSBzaG91bGQgb21pdCB0aGUKKy8vIGdlbmVyYXRpb24gb2YgdGhlIEdPT0dMRV9BUlJBWVNJWkUgY29uc3RhbnQuCitib29sIFNob3VsZEdlbmVyYXRlQXJyYXlTaXplKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGludDMyIG1heF92YWx1ZSA9IGRlc2NyaXB0b3ItPnZhbHVlKDApLT5udW1iZXIoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+dmFsdWUoaSktPm51bWJlcigpID4gbWF4X3ZhbHVlKSB7CisgICAgICBtYXhfdmFsdWUgPSBkZXNjcmlwdG9yLT52YWx1ZShpKS0+bnVtYmVyKCk7CisgICAgfQorICB9CisgIHJldHVybiBtYXhfdmFsdWUgIT0gOjpnb29nbGU6OnByb3RvYnVmOjpraW50MzJtYXg7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKwogRW51bUdlbmVyYXRvcjo6RW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkbGxleHBvcnRfZGVjbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKICAgICBjbGFzc25hbWVfKENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSkpLAotICAgIGRsbGV4cG9ydF9kZWNsXyhkbGxleHBvcnRfZGVjbCkgeworICAgIG9wdGlvbnNfKG9wdGlvbnMpLAorICAgIGdlbmVyYXRlX2FycmF5X3NpemVfKFNob3VsZEdlbmVyYXRlQXJyYXlTaXplKGRlc2NyaXB0b3IpKSB7CiB9CiAKIEVudW1HZW5lcmF0b3I6On5FbnVtR2VuZXJhdG9yKCkge30KIAordm9pZCBFbnVtR2VuZXJhdG9yOjpGaWxsRm9yd2FyZERlY2xhcmF0aW9uKAorICAgIG1hcDxzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4qIGVudW1fbmFtZXMpIHsKKyAgaWYgKCFvcHRpb25zXy5wcm90b19oKSB7CisgICAgcmV0dXJuOworICB9CisgICgqZW51bV9uYW1lcylbY2xhc3NuYW1lX10gPSBkZXNjcmlwdG9yXzsKK30KKwogdm9pZCBFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZURlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwogICB2YXJzWyJjbGFzc25hbWUiXSA9IGNsYXNzbmFtZV87CiAgIHZhcnNbInNob3J0X25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcnNbImVudW1iYXNlIl0gPSBjbGFzc25hbWVfICsgKG9wdGlvbnNfLnByb3RvX2ggPyAiIDogaW50IiA6ICIiKTsKIAotICBwcmludGVyLT5QcmludCh2YXJzLCAiZW51bSAkY2xhc3NuYW1lJCB7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFycywgImVudW0gJGVudW1iYXNlJCB7XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoImVudW1iYXNlIiwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5JbmRlbnQoKTsKIAogICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBtaW5fdmFsdWUgPSBkZXNjcmlwdG9yXy0+dmFsdWUoMCk7CiAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIG1heF92YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZSgwKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKLSAgICB2YXJzWyJuYW1lIl0gPSBkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm5hbWUoKTsKLSAgICB2YXJzWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5udW1iZXIoKSk7CisgICAgdmFyc1sibmFtZSJdID0gRW51bVZhbHVlTmFtZShkZXNjcmlwdG9yXy0+dmFsdWUoaSkpOworICAgIC8vIEluIEMrKywgYW4gdmFsdWUgb2YgLTIxNDc0ODM2NDggZ2V0cyBpbnRlcnByZXRlZCBhcyB0aGUgbmVnYXRpdmUgb2YKKyAgICAvLyAyMTQ3NDgzNjQ4LCBhbmQgc2luY2UgMjE0NzQ4MzY0OCBjYW4ndCBmaXQgaW4gYW4gaW50ZWdlciwgdGhpcyBwcm9kdWNlcyBhCisgICAgLy8gY29tcGlsZXIgd2FybmluZy4gIFRoaXMgd29ya3MgYXJvdW5kIHRoYXQgaXNzdWUuCisgICAgdmFyc1sibnVtYmVyIl0gPSBJbnQzMlRvU3RyaW5nKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bnVtYmVyKCkpOwogICAgIHZhcnNbInByZWZpeCJdID0gKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMKSA/CiAgICAgICAiIiA6IGNsYXNzbmFtZV8gKyAiXyI7CisgICAgdmFyc1siZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKSA/CisgICAgICAgICIgUFJPVE9CVUZfREVQUkVDQVRFRCIgOiAiIjsKIAogICAgIGlmIChpID4gMCkgcHJpbnRlci0+UHJpbnQoIixcbiIpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsICIkcHJlZml4JCRuYW1lJCA9ICRudW1iZXIkIik7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywgIiRwcmVmaXgkJG5hbWUkJGRlcHJlY2F0aW9uJCA9ICRudW1iZXIkIik7CiAKICAgICBpZiAoZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5udW1iZXIoKSA8IG1pbl92YWx1ZS0+bnVtYmVyKCkpIHsKICAgICAgIG1pbl92YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKTsKQEAgLTgyLDM0ICsxMTIsNDggQEAKICAgICB9CiAgIH0KIAorICBpZiAoSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gRm9yIG5ldyBlbnVtIHNlbWFudGljczogZ2VuZXJhdGUgbWluIGFuZCBtYXggc2VudGluZWwgdmFsdWVzIGVxdWFsIHRvCisgICAgLy8gSU5UMzJfTUlOIGFuZCBJTlQzMl9NQVgKKyAgICBpZiAoZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCkgPiAwKSBwcmludGVyLT5QcmludCgiLFxuIik7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgIiRjbGFzc25hbWUkXyRwcmVmaXgkSU5UX01JTl9TRU5USU5FTF9ET19OT1RfVVNFXyA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6a2ludDMybWluLFxuIgorICAgICAgICAiJGNsYXNzbmFtZSRfJHByZWZpeCRJTlRfTUFYX1NFTlRJTkVMX0RPX05PVF9VU0VfID0gOjpnb29nbGU6OnByb3RvYnVmOjpraW50MzJtYXgiKTsKKyAgfQorCiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoIlxufTtcbiIpOwogCi0gIHZhcnNbIm1pbl9uYW1lIl0gPSBtaW5fdmFsdWUtPm5hbWUoKTsKLSAgdmFyc1sibWF4X25hbWUiXSA9IG1heF92YWx1ZS0+bmFtZSgpOworICB2YXJzWyJtaW5fbmFtZSJdID0gRW51bVZhbHVlTmFtZShtaW5fdmFsdWUpOworICB2YXJzWyJtYXhfbmFtZSJdID0gRW51bVZhbHVlTmFtZShtYXhfdmFsdWUpOwogCi0gIGlmIChkbGxleHBvcnRfZGVjbF8uZW1wdHkoKSkgeworICBpZiAob3B0aW9uc18uZGxsZXhwb3J0X2RlY2wuZW1wdHkoKSkgewogICAgIHZhcnNbImRsbGV4cG9ydCJdID0gIiI7CiAgIH0gZWxzZSB7Ci0gICAgdmFyc1siZGxsZXhwb3J0Il0gPSBkbGxleHBvcnRfZGVjbF8gKyAiICI7CisgICAgdmFyc1siZGxsZXhwb3J0Il0gPSBvcHRpb25zXy5kbGxleHBvcnRfZGVjbCArICIgIjsKICAgfQogCiAgIHByaW50ZXItPlByaW50KHZhcnMsCiAgICAgIiRkbGxleHBvcnQkYm9vbCAkY2xhc3NuYW1lJF9Jc1ZhbGlkKGludCB2YWx1ZSk7XG4iCiAgICAgImNvbnN0ICRjbGFzc25hbWUkICRwcmVmaXgkJHNob3J0X25hbWUkX01JTiA9ICRwcmVmaXgkJG1pbl9uYW1lJDtcbiIKLSAgICAiY29uc3QgJGNsYXNzbmFtZSQgJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYID0gJHByZWZpeCQkbWF4X25hbWUkO1xuIgotICAgICJjb25zdCBpbnQgJHByZWZpeCQkc2hvcnRfbmFtZSRfQVJSQVlTSVpFID0gJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYICsgMTtcbiIKLSAgICAiXG4iKTsKKyAgICAiY29uc3QgJGNsYXNzbmFtZSQgJHByZWZpeCQkc2hvcnRfbmFtZSRfTUFYID0gJHByZWZpeCQkbWF4X25hbWUkO1xuIik7CiAKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChnZW5lcmF0ZV9hcnJheV9zaXplXykgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAiY29uc3QgaW50ICRwcmVmaXgkJHNob3J0X25hbWUkX0FSUkFZU0laRSA9ICIKKyAgICAgICIkcHJlZml4JCRzaG9ydF9uYW1lJF9NQVggKyAxO1xuXG4iKTsKKyAgfQorCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgIiRkbGxleHBvcnQkY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIik7CiAgICAgLy8gVGhlIF9OYW1lIGFuZCBfUGFyc2UgbWV0aG9kcwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkX05hbWUoJGNsYXNzbmFtZSQgdmFsdWUpIHtcbiIKLSAgICAgICIgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKFxuIgotICAgICAgIiAgICAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yKCksIHZhbHVlKTtcbiIKLSAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywKKyAgICAgICAgImlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJF9OYW1lKCRjbGFzc25hbWUkIHZhbHVlKSB7XG4iCisgICAgICAgICIgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOYW1lT2ZFbnVtKFxuIgorICAgICAgICAiICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKSwgdmFsdWUpO1xuIgorICAgICAgICAifVxuIik7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAgICJpbmxpbmUgYm9vbCAkY2xhc3NuYW1lJF9QYXJzZShcbiIKICAgICAgICIgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgJGNsYXNzbmFtZSQqIHZhbHVlKSB7XG4iCkBAIC0xMjEsNyArMTY1LDExIEBACiAKIHZvaWQgRW51bUdlbmVyYXRvcjo6CiBHZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICBwcmludGVyLT5QcmludCgKKyAgICAgICJ0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgJGNsYXNzbmFtZSQ+IDogOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlICIKKyAgICAgICJ7fTtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCB0cnVlKSk7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICBwcmludGVyLT5QcmludCgKICAgICAgICJ0ZW1wbGF0ZSA8PlxuIgogICAgICAgImlubGluZSBjb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3I8ICRjbGFzc25hbWUkPigpIHtcbiIKQEAgLTEzNSwxMiArMTgzLDE2IEBACiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKICAgdmFyc1sibmVzdGVkX25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CiAgIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKKyAgdmFyc1siY29uc3RleHByIl0gPSBvcHRpb25zXy5wcm90b19oID8gImNvbnN0ZXhwciAiIDogIiI7CiAgIHByaW50ZXItPlByaW50KHZhcnMsICJ0eXBlZGVmICRjbGFzc25hbWUkICRuZXN0ZWRfbmFtZSQ7XG4iKTsKIAogICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBqKyspIHsKLSAgICB2YXJzWyJ0YWciXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShqKS0+bmFtZSgpOworICAgIHZhcnNbInRhZyJdID0gRW51bVZhbHVlTmFtZShkZXNjcmlwdG9yXy0+dmFsdWUoaikpOworICAgIHZhcnNbImRlcHJlY2F0ZWRfYXR0ciJdID0gZGVzY3JpcHRvcl8tPnZhbHVlKGopLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpID8KKyAgICAgICJQUk9UT0JVRl9ERVBSRUNBVEVEX0FUVFIgIiA6ICIiOwogICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAic3RhdGljIGNvbnN0ICRuZXN0ZWRfbmFtZSQgJHRhZyQgPSAkY2xhc3NuYW1lJF8kdGFnJDtcbiIpOworICAgICAgIiRkZXByZWNhdGVkX2F0dHIkc3RhdGljICRjb25zdGV4cHIkY29uc3QgJG5lc3RlZF9uYW1lJCAkdGFnJCA9XG4iCisgICAgICAiICAkY2xhc3NuYW1lJF8kdGFnJDtcbiIpOwogICB9CiAKICAgcHJpbnRlci0+UHJpbnQodmFycywKQEAgLTE1MCwyMCArMjAyLDI1IEBACiAgICAgInN0YXRpYyBjb25zdCAkbmVzdGVkX25hbWUkICRuZXN0ZWRfbmFtZSRfTUlOID1cbiIKICAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX01JTjtcbiIKICAgICAic3RhdGljIGNvbnN0ICRuZXN0ZWRfbmFtZSQgJG5lc3RlZF9uYW1lJF9NQVggPVxuIgotICAgICIgICRjbGFzc25hbWUkXyRuZXN0ZWRfbmFtZSRfTUFYO1xuIgotICAgICJzdGF0aWMgY29uc3QgaW50ICRuZXN0ZWRfbmFtZSRfQVJSQVlTSVpFID1cbiIKLSAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX0FSUkFZU0laRTtcbiIpOworICAgICIgICRjbGFzc25hbWUkXyRuZXN0ZWRfbmFtZSRfTUFYO1xuIik7CisgIGlmIChnZW5lcmF0ZV9hcnJheV9zaXplXykgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAic3RhdGljIGNvbnN0IGludCAkbmVzdGVkX25hbWUkX0FSUkFZU0laRSA9XG4iCisgICAgICAiICAkY2xhc3NuYW1lJF8kbmVzdGVkX25hbWUkX0FSUkFZU0laRTtcbiIpOworICB9CiAKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgInN0YXRpYyBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvcipcbiIKICAgICAgICIkbmVzdGVkX25hbWUkX2Rlc2NyaXB0b3IoKSB7XG4iCiAgICAgICAiICByZXR1cm4gJGNsYXNzbmFtZSRfZGVzY3JpcHRvcigpO1xuIgogICAgICAgIn1cbiIpOwogICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAic3RhdGljIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkbmVzdGVkX25hbWUkX05hbWUoJG5lc3RlZF9uYW1lJCB2YWx1ZSkge1xuIgotICAgICAgIiAgcmV0dXJuICRjbGFzc25hbWUkX05hbWUodmFsdWUpO1xuIgotICAgICAgIn1cbiIpOworICAgICAgICAgICAgICAgICAgICJzdGF0aWMgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICIKKyAgICAgICAgICAgICAgICAgICAiJG5lc3RlZF9uYW1lJF9OYW1lKCRuZXN0ZWRfbmFtZSQgdmFsdWUpIHsiCisgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJF9OYW1lKHZhbHVlKTtcbiIKKyAgICAgICAgICAgICAgICAgICAifVxuIik7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAgICJzdGF0aWMgaW5saW5lIGJvb2wgJG5lc3RlZF9uYW1lJF9QYXJzZShjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lLFxuIgogICAgICAgIiAgICAkbmVzdGVkX25hbWUkKiB2YWx1ZSkge1xuIgpAQCAtMTkxLDggKzI0OCw5IEBACiB2b2lkIEVudW1HZW5lcmF0b3I6OkdlbmVyYXRlTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CiAgIHZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKKyAgdmFyc1siY29uc3RleHByIl0gPSBvcHRpb25zXy5wcm90b19oID8gImNvbnN0ZXhwciAiIDogIiI7CiAKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqICRjbGFzc25hbWUkX2Rlc2NyaXB0b3IoKSB7XG4iCiAgICAgICAiICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTtcbiIKQEAgLTIxOCw3ICsyNzYsNyBAQAogICAgICAgIGl0ZXIgIT0gbnVtYmVycy5lbmQoKTsgKytpdGVyKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiICAgIGNhc2UgJG51bWJlciQ6XG4iLAotICAgICAgIm51bWJlciIsIFNpbXBsZUl0b2EoKml0ZXIpKTsKKyAgICAgICJudW1iZXIiLCBJbnQzMlRvU3RyaW5nKCppdGVyKSk7CiAgIH0KIAogICBwcmludGVyLT5QcmludCh2YXJzLApAQCAtMjMyLDIzICsyOTAsMjYgQEAKICAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7CiAgICAgLy8gV2UgbmVlZCB0byAiZGVmaW5lIiB0aGUgc3RhdGljIGNvbnN0YW50cyB3aGljaCB3ZXJlIGRlY2xhcmVkIGluIHRoZQogICAgIC8vIGhlYWRlciwgdG8gZ2l2ZSB0aGUgbGlua2VyIGEgcGxhY2UgdG8gcHV0IHRoZW0uICBPciBhdCBsZWFzdCB0aGUgQysrCi0gICAgLy8gc3RhbmRhcmQgc2F5cyB3ZSBoYXZlIHRvLiAgTVNWQyBhY3R1YWxseSBpbnNpc3RzIHRoYSB3ZSBkbyBfbm90XyBkZWZpbmUKLSAgICAvLyB0aGVtIGFnYWluIGluIHRoZSAuY2MgZmlsZS4KLSAgICBwcmludGVyLT5QcmludCgiI2lmbmRlZiBfTVNDX1ZFUlxuIik7CisgICAgLy8gc3RhbmRhcmQgc2F5cyB3ZSBoYXZlIHRvLiAgTVNWQyBhY3R1YWxseSBpbnNpc3RzIHRoYXQgd2UgZG8gX25vdF8gZGVmaW5lCisgICAgLy8gdGhlbSBhZ2FpbiBpbiB0aGUgLmNjIGZpbGUsIHByaW9yIHRvIFZDKysgMjAxNS4KKyAgICBwcmludGVyLT5QcmludCgiI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwXG4iKTsKIAogICAgIHZhcnNbInBhcmVudCJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwgZmFsc2UpOwogICAgIHZhcnNbIm5lc3RlZF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOwogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgewotICAgICAgdmFyc1sidmFsdWUiXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpOworICAgICAgdmFyc1sidmFsdWUiXSA9IEVudW1WYWx1ZU5hbWUoZGVzY3JpcHRvcl8tPnZhbHVlKGkpKTsKICAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAgICJjb25zdCAkY2xhc3NuYW1lJCAkcGFyZW50JDo6JHZhbHVlJDtcbiIpOworICAgICAgICAiJGNvbnN0ZXhwciRjb25zdCAkY2xhc3NuYW1lJCAkcGFyZW50JDo6JHZhbHVlJDtcbiIpOwogICAgIH0KICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgImNvbnN0ICRjbGFzc25hbWUkICRwYXJlbnQkOjokbmVzdGVkX25hbWUkX01JTjtcbiIKLSAgICAgICJjb25zdCAkY2xhc3NuYW1lJCAkcGFyZW50JDo6JG5lc3RlZF9uYW1lJF9NQVg7XG4iCi0gICAgICAiY29uc3QgaW50ICRwYXJlbnQkOjokbmVzdGVkX25hbWUkX0FSUkFZU0laRTtcbiIpOworICAgICAgImNvbnN0ICRjbGFzc25hbWUkICRwYXJlbnQkOjokbmVzdGVkX25hbWUkX01BWDtcbiIpOworICAgIGlmIChnZW5lcmF0ZV9hcnJheV9zaXplXykgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgImNvbnN0IGludCAkcGFyZW50JDo6JG5lc3RlZF9uYW1lJF9BUlJBWVNJWkU7XG4iKTsKKyAgICB9CiAKLSAgICBwcmludGVyLT5QcmludCgiI2VuZGlmICAvLyBfTVNDX1ZFUlxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoIiNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDBcbiIpOwogICB9CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmgKaW5kZXggNThmNzcyMS4uOTBlZGYwMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDcgKzM1LDEwIEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRU5VTV9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9FTlVNX0hfXwogCisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgPHNldD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewpAQCAtNTIsMTIgKzU1LDE5IEBACiBjbGFzcyBFbnVtR2VuZXJhdG9yIHsKICBwdWJsaWM6CiAgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgotICBleHBsaWNpdCBFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGxsZXhwb3J0X2RlY2wpOworICBFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKICAgfkVudW1HZW5lcmF0b3IoKTsKIAogICAvLyBIZWFkZXIgc3R1ZmYuCiAKKyAgLy8gRmlsbHMgdGhlIG5hbWUgdG8gdXNlIHdoZW4gZGVjbGFyaW5nIHRoZSBlbnVtLiBUaGlzIGlzIGZvciB1c2Ugd2hlbgorICAvLyBnZW5lcmF0aW5nIG90aGVyIC5wcm90by5oIGZpbGVzLiBUaGlzIGNvZGUgc2hvdWxkIGJlIHBsYWNlZCB3aXRoaW4gdGhlCisgIC8vIGVudW0ncyBwYWNrYWdlIG5hbWVzcGFjZSwgYnV0IE5PVCB3aXRoaW4gYW55IGNsYXNzLCBldmVuIGZvciBuZXN0ZWQKKyAgLy8gZW51bXMuIEEgZ2l2ZW4ga2V5IGluIGVudW1fbmFtZXMgd2lsbCBtYXAgZnJvbSBhbiBlbnVtIGNsYXNzIG5hbWUgdG8gdGhlCisgIC8vIEVudW1EZXNjcmlwdG9yIHRoYXQgd2FzIHJlc3BvbnNpYmxlIGZvciBpdHMgaW5jbHVzaW9uIGluIHRoZSBtYXAuIFRoaXMgY2FuCisgIC8vIGJlIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBpdC4KKyAgdm9pZCBGaWxsRm9yd2FyZERlY2xhcmF0aW9uKG1hcDxzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4qIGVudW1fbmFtZXMpOworCiAgIC8vIEdlbmVyYXRlIGhlYWRlciBjb2RlIGRlZmluaW5nIHRoZSBlbnVtLiAgVGhpcyBjb2RlIHNob3VsZCBiZSBwbGFjZWQKICAgLy8gd2l0aGluIHRoZSBlbnVtJ3MgcGFja2FnZSBuYW1lc3BhY2UsIGJ1dCBOT1Qgd2l0aGluIGFueSBjbGFzcywgZXZlbiBmb3IKICAgLy8gbmVzdGVkIGVudW1zLgpAQCAtODUsOCArOTUsMTAgQEAKIAogIHByaXZhdGU6CiAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgc3RyaW5nIGNsYXNzbmFtZV87Ci0gIHN0cmluZyBkbGxleHBvcnRfZGVjbF87CisgIGNvbnN0IHN0cmluZyBjbGFzc25hbWVfOworICBjb25zdCBPcHRpb25zJiBvcHRpb25zXzsKKyAgLy8gd2hldGhlciB0byBnZW5lcmF0ZSB0aGUgKl9BUlJBWVNJWkUgY29uc3RhbnQuCisgIGNvbnN0IGJvb2wgZ2VuZXJhdGVfYXJyYXlfc2l6ZV87CiAKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1HZW5lcmF0b3IpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5jYwppbmRleCBhMzY5ZjQxLi4xMDI1MmIzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9lbnVtX2ZpZWxkLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNSw4ICszNSw4IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNDYsMjEgKzQ2LDIzIEBACiBuYW1lc3BhY2UgewogCiB2b2lkIFNldEVudW1WYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgewotICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCB2YXJpYWJsZXMpOworICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7CiAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlZmF1bHRfdmFsdWUgPSBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX2VudW0oKTsKICAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCksIHRydWUpOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IFNpbXBsZUl0b2EoZGVmYXVsdF92YWx1ZS0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IEludDMyVG9TdHJpbmcoZGVmYXVsdF92YWx1ZS0+bnVtYmVyKCkpOworICAoKnZhcmlhYmxlcylbImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1FbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKLSAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CitFbnVtRmllbGRHZW5lcmF0b3I6OkVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXywgb3B0aW9ucyk7CiB9CiAKIEVudW1GaWVsZEdlbmVyYXRvcjo6fkVudW1GaWVsZEdlbmVyYXRvcigpIHt9CkBAIC03MywyMCArNzUsMjkgQEAKIHZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaW5saW5lICR0eXBlJCAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCi0gICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQgJG5hbWUkKCkgY29uc3Q7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSk7XG4iKTsKIH0KIAogdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3QgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKKyAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUiIDogIiI7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAiJGlubGluZSQgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKICAgICAiICByZXR1cm4gc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KCRuYW1lJF8pO1xuIgogICAgICJ9XG4iCi0gICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgotICAgICIgIEdPT0dMRV9EQ0hFQ0soJHR5cGUkX0lzVmFsaWQodmFsdWUpKTtcbiIKLSAgICAiICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIik7CisgIGlmICghSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICIgIGFzc2VydCgkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICIgICRzZXRfaGFzYml0JFxuIgogICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgogICAgICJ9XG4iKTsKIH0KIApAQCAtMTE2LDE2ICsxMjcsMjggQEAKICAgICAiaW50IHZhbHVlO1xuIgogICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgogICAgICIgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KFxuIgotICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIKLSAgICAiaWYgKCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSkge1xuIgotICAgICIgIHNldF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iKTsKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAiICAgICAgIGlucHV0LCAmdmFsdWUpKSk7XG4iKTsKKyAgaWYgKEhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAifSBlbHNlIHtcbiIKLSAgICAgICIgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KCRudW1iZXIkLCB2YWx1ZSk7XG4iKTsKKyAgICAgICJzZXRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoJHR5cGUkX0lzVmFsaWQodmFsdWUpKSB7XG4iCisgICAgICAiICBzZXRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7CisgICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgICAiICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgkbnVtYmVyJCwgdmFsdWUpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICAgIiAgdW5rbm93bl9maWVsZHNfc3RyZWFtLldyaXRlVmFyaW50MzIoJHRhZyQpO1xuIgorICAgICAgICAiICB1bmtub3duX2ZpZWxkc19zdHJlYW0uV3JpdGVWYXJpbnQzMih2YWx1ZSk7XG4iLAorICAgICAgICAidGFnIiwgU2ltcGxlSXRvYShpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yXykpKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJ9XG4iKTsKICAgfQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJ9XG4iKTsKIH0KIAogdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6OgpAQCAtMTUxLDEwICsxNzQsNjUgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Ci1SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgewotICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK0VudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0VudW1PbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogRW51bUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG9wdGlvbnMpIHsKKyAgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7Cit9CisKK0VudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjp+RW51bU9uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQorCit2b2lkIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3QgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKKyAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUiIDogIiI7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAiJGlubGluZSQgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKKyAgICAiICBpZiAoaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgIiAgICByZXR1cm4gc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KCRvbmVvZl9wcmVmaXgkJG5hbWUkXyk7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiBzdGF0aWNfY2FzdDwgJHR5cGUkID4oJGRlZmF1bHQkKTtcbiIKKyAgICAifVxuIgorICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIik7CisgIGlmICghSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICIgIGFzc2VydCgkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRvbmVvZl9wcmVmaXgkJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkb25lb2ZfcHJlZml4JCRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKwordm9pZCBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBEb24ndCBwcmludCBhbnkgc3dhcHBpbmcgY29kZS4gU3dhcHBpbmcgdGhlIHVuaW9uIHdpbGwgc3dhcCB0aGlzIGZpZWxkLgorfQorCit2b2lkIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgJGNsYXNzbmFtZSRfZGVmYXVsdF9vbmVvZl9pbnN0YW5jZV8tPiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6UmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXywgb3B0aW9ucyk7CiB9CiAKIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoKSB7fQpAQCAtMTYzLDcgKzI0MSw4IEBACiBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDxpbnQ+ICRuYW1lJF87XG4iKTsKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkgJiYgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpICYmCisgICAgICBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAibXV0YWJsZSBpbnQgXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXztcbiIpOwogICB9CkBAIC0xNzIsMzUgKzI1MSw1MSBAQAogdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSAkdHlwZSQgJG5hbWUkKGludCBpbmRleCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCi0gICAgImlubGluZSB2b2lkIGFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQgJG5hbWUkKGludCBpbmRleCkgY29uc3Q7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKTtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIGFkZF8kbmFtZSQoJHR5cGUkIHZhbHVlKTtcbiIpOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4mICRuYW1lJCgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDxpbnQ+KiBtdXRhYmxlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIpOworICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDxpbnQ+JiAkbmFtZSQoKSBjb25zdDtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiogbXV0YWJsZV8kbmFtZSQoKTtcbiIpOwogfQogCiB2b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lIiA6ICIiOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgIiRpbmxpbmUkICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIiAgcmV0dXJuIHN0YXRpY19jYXN0PCAkdHlwZSQgPigkbmFtZSRfLkdldChpbmRleCkpO1xuIgogICAgICJ9XG4iCi0gICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgR09PR0xFX0RDSEVDSygkdHlwZSRfSXNWYWxpZCh2YWx1ZSkpO1xuIgorICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iKTsKKyAgaWYgKCFIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgIiAgYXNzZXJ0KCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCiAgICAgIiAgJG5hbWUkXy5TZXQoaW5kZXgsIHZhbHVlKTtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgogICAgICJ9XG4iCi0gICAgImlubGluZSB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgotICAgICIgIEdPT0dMRV9EQ0hFQ0soJHR5cGUkX0lzVmFsaWQodmFsdWUpKTtcbiIKKyAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIpOworICBpZiAoIUhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAiICBhc3NlcnQoJHR5cGUkX0lzVmFsaWQodmFsdWUpKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKICAgICAiICAkbmFtZSRfLkFkZCh2YWx1ZSk7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDokZnVsbF9uYW1lJClcbiIKICAgICAifVxuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiZcbiIKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICIkaW5saW5lJCBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8aW50PiZcbiIKICAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDokZnVsbF9uYW1lJClcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKICAgICAifVxuIgotICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPGludD4qXG4iCisgICAgIiRpbmxpbmUkIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDxpbnQ+KlxuIgogICAgICIkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDokZnVsbF9uYW1lJClcbiIKICAgICAiICByZXR1cm4gJiRuYW1lJF87XG4iCiAgICAgIn1cbiIpOwogfQpAQCAtMjE3LDcgKzMxMiw3IEBACiAKIHZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7CiB9CiAKIHZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgpAQCAtMjMyLDI3ICszMjcsNTkgQEAKICAgICAiaW50IHZhbHVlO1xuIgogICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgogICAgICIgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KFxuIgotICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIKLSAgICAiaWYgKCR0eXBlJF9Jc1ZhbGlkKHZhbHVlKSkge1xuIgotICAgICIgIGFkZF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iKTsKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAiICAgICAgIGlucHV0LCAmdmFsdWUpKSk7XG4iKTsKKyAgaWYgKEhhc1ByZXNlcnZpbmdVbmtub3duRW51bVNlbWFudGljcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAifSBlbHNlIHtcbiIKLSAgICAgICIgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KCRudW1iZXIkLCB2YWx1ZSk7XG4iKTsKKyAgICAgICJhZGRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoJHR5cGUkX0lzVmFsaWQodmFsdWUpKSB7XG4iCisgICAgICAiICBhZGRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7CisgICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgICAiICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCgkbnVtYmVyJCwgdmFsdWUpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICAgIiAgdW5rbm93bl9maWVsZHNfc3RyZWFtLldyaXRlVmFyaW50MzIodGFnKTtcbiIKKyAgICAgICAgIiAgdW5rbm93bl9maWVsZHNfc3RyZWFtLldyaXRlVmFyaW50MzIodmFsdWUpO1xuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKICAgfQotICBwcmludGVyLT5QcmludCgifVxuIik7CiB9CiAKIHZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbVdpdGhQYWNraW5nKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmICghZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgewotICAgIC8vIFdlIHVzZSBhIG5vbi1pbmxpbmVkIGltcGxlbWVudGF0aW9uIGluIHRoaXMgY2FzZSwgc2luY2UgdGhpcyBwYXRoIHdpbGwKLSAgICAvLyByYXJlbHkgYmUgZXhlY3V0ZWQuCi0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkRW51bU5vSW5saW5lKFxuIgotICAgICAgIiAgICAgICBpbnB1dCxcbiIKLSAgICAgICIgICAgICAgJiR0eXBlJF9Jc1ZhbGlkLFxuIgotICAgICAgIiAgICAgICB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSkpO1xuIik7CisgIGlmICghZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgICAvLyBUaGlzIHBhdGggaXMgcmFyZWx5IGV4ZWN1dGVkLCBzbyB3ZSB1c2UgYSBub24taW5saW5lZCBpbXBsZW1lbnRhdGlvbi4KKyAgICBpZiAoSGFzUHJlc2VydmluZ1Vua25vd25FbnVtU2VtYW50aWNzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAiRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjoiCisgICAgICAgICAgICAgICAgICAgICJXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZEVudW1QcmVzZXJ2ZVVua25vd25zKFxuIgorICAgICAgICAiICAgICAgIGlucHV0LFxuIgorICAgICAgICAiICAgICAgICRudW1iZXIkLFxuIgorICAgICAgICAiICAgICAgIE5VTEwsXG4iCisgICAgICAgICIgICAgICAgTlVMTCxcbiIKKyAgICAgICAgIiAgICAgICB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSkpO1xuIik7CisgICAgfSBlbHNlIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAiRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpSZWFkUGFja2VkRW51bVByZXNlcnZlVW5rbm93bnMoXG4iCisgICAgICAgICIgICAgICAgaW5wdXQsXG4iCisgICAgICAgICIgICAgICAgJG51bWJlciQsXG4iCisgICAgICAgICIgICAgICAgJHR5cGUkX0lzVmFsaWQsXG4iCisgICAgICAgICIgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLFxuIgorICAgICAgICAiICAgICAgIHRoaXMtPm11dGFibGVfJG5hbWUkKCkpKSk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgIkRPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6IgorICAgICAgICAgICAgICAgICAgICAgIldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkRW51bVByZXNlcnZlVW5rbm93bnMoXG4iCisgICAgICAgICIgICAgICAgaW5wdXQsXG4iCisgICAgICAgICIgICAgICAgJG51bWJlciQsXG4iCisgICAgICAgICIgICAgICAgJHR5cGUkX0lzVmFsaWQsXG4iCisgICAgICAgICIgICAgICAgJnVua25vd25fZmllbGRzX3N0cmVhbSxcbiIKKyAgICAgICAgIiAgICAgICB0aGlzLT5tdXRhYmxlXyRuYW1lJCgpKSkpO1xuIik7CisgICAgfQogICB9IGVsc2UgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgbGVuZ3RoO1xuIgpAQCAtMjYzLDEwICszOTAsMjcgQEAKICAgICAgICIgIGludCB2YWx1ZTtcbiIKICAgICAgICIgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8XG4iCiAgICAgICAiICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPihcbiIKLSAgICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIKKyAgICAgICIgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTtcbiIpOworICAgIGlmIChIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICBhZGRfJG5hbWUkKHN0YXRpY19jYXN0PCAkdHlwZSQgPih2YWx1ZSkpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiICBpZiAoJHR5cGUkX0lzVmFsaWQodmFsdWUpKSB7XG4iCiAgICAgICAiICAgIGFkZF8kbmFtZSQoc3RhdGljX2Nhc3Q8ICR0eXBlJCA+KHZhbHVlKSk7XG4iCi0gICAgICAiICB9XG4iCisgICAgICAiICB9IGVsc2Uge1xuIik7CisgICAgICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAiICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+QWRkVmFyaW50KCRudW1iZXIkLCB2YWx1ZSk7XG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICIgICAgdW5rbm93bl9maWVsZHNfc3RyZWFtLldyaXRlVmFyaW50MzIodGFnKTtcbiIKKyAgICAgICAgIiAgICB1bmtub3duX2ZpZWxkc19zdHJlYW0uV3JpdGVWYXJpbnQzMih2YWx1ZSk7XG4iKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiAgfVxuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAifVxuIgogICAgICAgImlucHV0LT5Qb3BMaW1pdChsaW1pdCk7XG4iKTsKICAgfQpAQCAtMjc0LDcgKzQxOCw3IEBACiAKIHZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgewogICAgIC8vIFdyaXRlIHRoZSB0YWcgYW5kIHRoZSBzaXplLgogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiaWYgKHRoaXMtPiRuYW1lJF9zaXplKCkgPiAwKSB7XG4iCkBAIC0yODcsNyArNDMxLDcgQEAKICAgfQogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iKTsKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtTm9UYWcoXG4iCiAgICAgICAiICAgIHRoaXMtPiRuYW1lJChpKSwgb3V0cHV0KTtcbiIpOwpAQCAtMzAxLDcgKzQ0NSw3IEBACiAKIHZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKICAgICAvLyBXcml0ZSB0aGUgdGFnIGFuZCB0aGUgc2l6ZS4KICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImlmICh0aGlzLT4kbmFtZSRfc2l6ZSgpID4gMCkge1xuIgpAQCAtMzE1LDcgKzQ1OSw3IEBACiAgIH0KICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnVG9BcnJheShcbiIKICAgICAgICIgICAgdGhpcy0+JG5hbWUkKGkpLCB0YXJnZXQpO1xuIik7CkBAIC0zMzksMTMgKzQ4MywxNSBAQAogICAgICAgIiAgICB0aGlzLT4kbmFtZSQoaSkpO1xuIgogICAgICAgIn1cbiIpOwogCi0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImlmIChkYXRhX3NpemUgPiAwKSB7XG4iCiAgICAgICAiICB0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgogICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGRhdGFfc2l6ZSk7XG4iCiAgICAgICAifVxuIgorICAgICAgIkdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7XG4iCiAgICAgICAiXyRuYW1lJF9jYWNoZWRfYnl0ZV9zaXplXyA9IGRhdGFfc2l6ZTtcbiIKKyAgICAgICJHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTtcbiIKICAgICAgICJ0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTtcbiIpOwogICB9IGVsc2UgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oCmluZGV4IDA3OTM0MzAuLmZlMjFjNTcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZW51bV9maWVsZC5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00NiwxMyArNDYsMTQgQEAKIAogY2xhc3MgRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICBFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKICAgfkVudW1GaWVsZEdlbmVyYXRvcigpOwogCiAgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtNjIsMjIgKzYzLDQyIEBACiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKIAotIHByaXZhdGU6CisgcHJvdGVjdGVkOgogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CiAKKyBwcml2YXRlOgogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bUZpZWxkR2VuZXJhdG9yKTsKIH07CiAKK2NsYXNzIEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIEVudW1GaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+RW51bU9uZW9mRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKTsKK307CisKIGNsYXNzIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAgIH5SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcigpOwogCiAgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5jYwppbmRleCA2NThhNzA3Ny4uYzQyZjE2MiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTU3LDkgKzU3LDkgQEAKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogRXh0ZW5zaW9uR2VuZXJhdG9yOjpFeHRlbnNpb25HZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkbGxleHBvcnRfZGVjbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCiAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCi0gICAgZGxsZXhwb3J0X2RlY2xfKGRsbGV4cG9ydF9kZWNsKSB7CisgICAgb3B0aW9uc18ob3B0aW9ucykgewogICAvLyBDb25zdHJ1Y3QgdHlwZV90cmFpdHNfLgogICBpZiAoZGVzY3JpcHRvcl8tPmlzX3JlcGVhdGVkKCkpIHsKICAgICB0eXBlX3RyYWl0c18gPSAiUmVwZWF0ZWQiOwpAQCAtMTA2LDggKzEwNiw4IEBACiAgIC8vIGV4cG9ydC9pbXBvcnQgc3BlY2lmaWVyLgogICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKICAgICB2YXJzWyJxdWFsaWZpZXIiXSA9ICJleHRlcm4iOwotICAgIGlmICghZGxsZXhwb3J0X2RlY2xfLmVtcHR5KCkpIHsKLSAgICAgIHZhcnNbInF1YWxpZmllciJdID0gZGxsZXhwb3J0X2RlY2xfICsgIiAiICsgdmFyc1sicXVhbGlmaWVyIl07CisgICAgaWYgKCFvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpKSB7CisgICAgICB2YXJzWyJxdWFsaWZpZXIiXSA9IG9wdGlvbnNfLmRsbGV4cG9ydF9kZWNsICsgIiAiICsgdmFyc1sicXVhbGlmaWVyIl07CiAgICAgfQogICB9IGVsc2UgewogICAgIHZhcnNbInF1YWxpZmllciJdID0gInN0YXRpYyI7CkBAIC0xNTUsNyArMTU1LDcgQEAKICAgLy8gTGlrZXdpc2UsIGNsYXNzIG1lbWJlcnMgbmVlZCB0byBkZWNsYXJlIHRoZSBmaWVsZCBjb25zdGFudCB2YXJpYWJsZS4KICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSAhPSBOVUxMKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICIjaWZuZGVmIF9NU0NfVkVSXG4iCisgICAgICAiI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwXG4iCiAgICAgICAiY29uc3QgaW50ICRzY29wZSQkY29uc3RhbnRfbmFtZSQ7XG4iCiAgICAgICAiI2VuZGlmXG4iKTsKICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmgKaW5kZXggMzA2OGIwOS4uMWMxY2FmMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9leHRlbnNpb24uaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2V4dGVuc2lvbi5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNyw2ICszNyw3IEBACiAKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNTcsNyArNTgsNyBAQAogIHB1YmxpYzoKICAgLy8gU2VlIGdlbmVyYXRvci5jYyBmb3IgdGhlIG1lYW5pbmcgb2YgZGxsZXhwb3J0X2RlY2wuCiAgIGV4cGxpY2l0IEV4dGVuc2lvbkdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRsbGV4cG9ydF9kZWNsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogICB+RXh0ZW5zaW9uR2VuZXJhdG9yKCk7CiAKICAgLy8gSGVhZGVyIHN0dWZmLgpAQCAtNzIsNyArNzMsNyBAQAogIHByaXZhdGU6CiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CiAgIHN0cmluZyB0eXBlX3RyYWl0c187Ci0gIHN0cmluZyBkbGxleHBvcnRfZGVjbF87CisgIE9wdGlvbnMgb3B0aW9uc187CiAKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEV4dGVuc2lvbkdlbmVyYXRvcik7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuY2MKaW5kZXggMTAzY2FjNC4uYjNiYTNhMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMywxNCArMzMsMjEgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW1fZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tYXBfZmllbGQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAKQEAgLTUyLDE4ICs1OSw1MSBAQAogdXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7CiAKIHZvaWQgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgICgqdmFyaWFibGVzKVsibmFtZSJdID0gRmllbGROYW1lKGRlc2NyaXB0b3IpOwogICAoKnZhcmlhYmxlcylbImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPmluZGV4KCkpOwogICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CiAgICgqdmFyaWFibGVzKVsiY2xhc3NuYW1lIl0gPSBDbGFzc05hbWUoRmllbGRTY29wZShkZXNjcmlwdG9yKSwgZmFsc2UpOwogICAoKnZhcmlhYmxlcylbImRlY2xhcmVkX3R5cGUiXSA9IERlY2xhcmVkVHlwZU1ldGhvZE5hbWUoZGVzY3JpcHRvci0+dHlwZSgpKTsKIAorICAvLyBub25fbnVsbF9wdHJfdG9fbmFtZSBpcyB1c2FibGUgb25seSBpZiBoYXNfJG5hbWUkIGlzIHRydWUuICBJdCB5aWVsZHMgYQorICAvLyBwb2ludGVyIHRoYXQgd2lsbCBub3QgYmUgTlVMTC4gIFN1YmNsYXNzZXMgb2YgRmllbGRHZW5lcmF0b3IgbWF5IHNldAorICAvLyAoKnZhcmlhYmxlcylbIm5vbl9udWxsX3B0cl90b19uYW1lIl0gZGlmZmVyZW50bHkuCisgICgqdmFyaWFibGVzKVsibm9uX251bGxfcHRyX3RvX25hbWUiXSA9CisgICAgICBTdHJDYXQoIiZ0aGlzLT4iLCBGaWVsZE5hbWUoZGVzY3JpcHRvciksICIoKSIpOworCiAgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCiAgICAgV2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yLT5udW1iZXIoKSwgZGVzY3JpcHRvci0+dHlwZSgpKSk7CiAgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKICAgICAgID8gIiBQUk9UT0JVRl9ERVBSRUNBVEVEIiA6ICIiOworICAoKnZhcmlhYmxlcylbImRlcHJlY2F0ZWRfYXR0ciJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQorICAgICAgPyAiUFJPVE9CVUZfREVQUkVDQVRFRF9BVFRSICIgOiAiIjsKIAorICAoKnZhcmlhYmxlcylbImNwcGdldCJdID0gIkdldCI7CisKKyAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvci0+ZmlsZSgpKSkgeworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc2JpdCJdID0KKyAgICAgICAgInNldF9oYXNfIiArIEZpZWxkTmFtZShkZXNjcmlwdG9yKSArICIoKTsiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzYml0Il0gPQorICAgICAgICAiY2xlYXJfaGFzXyIgKyBGaWVsZE5hbWUoZGVzY3JpcHRvcikgKyAiKCk7IjsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNiaXQiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzYml0Il0gPSAiIjsKKyAgfQorCisgIC8vIEJ5IGRlZmF1bHQsIGVtcHR5IHN0cmluZywgc28gdGhhdCBnZW5lcmljIGNvZGUgdXNlZCBmb3IgYm90aCBvbmVvZnMgYW5kCisgIC8vIHNpbmd1bGFyIGZpZWxkcyBjYW4gYmUgd3JpdHRlbi4KKyAgKCp2YXJpYWJsZXMpWyJvbmVvZl9wcmVmaXgiXSA9ICIiOworfQorCit2b2lkIFNldENvbW1vbk9uZW9mRmllbGRWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgeworICBjb25zdCBzdHJpbmcgcHJlZml4ID0gZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpLT5uYW1lKCkgKyAiXy4iOworICAoKnZhcmlhYmxlcylbIm9uZW9mX3ByZWZpeCJdID0gcHJlZml4OworICAoKnZhcmlhYmxlcylbIm9uZW9mX25hbWUiXSA9IGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKS0+bmFtZSgpOworICAoKnZhcmlhYmxlcylbIm5vbl9udWxsX3B0cl90b19uYW1lIl0gPQorICAgICAgU3RyQ2F0KHByZWZpeCwgKCp2YXJpYWJsZXMpWyJuYW1lIl0sICJfIik7CiB9CiAKIEZpZWxkR2VuZXJhdG9yOjp+RmllbGRHZW5lcmF0b3IoKSB7fQpAQCAtODAsNDYgKzEyMCw2OCBAQAogCiB9CiAKLUZpZWxkR2VuZXJhdG9yTWFwOjpGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAotICAgIGZpZWxkX2dlbmVyYXRvcnNfKAotICAgICAgbmV3IHNjb3BlZF9wdHI8RmllbGRHZW5lcmF0b3I+W2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCldKSB7CitGaWVsZEdlbmVyYXRvck1hcDo6RmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgICBvcHRpb25zXyhvcHRpb25zKSwKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfKAorICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEZpZWxkR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXSkgewogICAvLyBDb25zdHJ1Y3QgYWxsIHRoZSBGaWVsZEdlbmVyYXRvcnMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc19baV0ucmVzZXQoTWFrZUdlbmVyYXRvcihkZXNjcmlwdG9yLT5maWVsZChpKSkpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfW2ldLnJlc2V0KE1ha2VHZW5lcmF0b3IoZGVzY3JpcHRvci0+ZmllbGQoaSksIG9wdGlvbnMpKTsKICAgfQogfQogCi1GaWVsZEdlbmVyYXRvciogRmllbGRHZW5lcmF0b3JNYXA6Ok1ha2VHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworRmllbGRHZW5lcmF0b3IqIEZpZWxkR2VuZXJhdG9yTWFwOjpNYWtlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgewogICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CiAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgaWYgKGZpZWxkLT5pc19tYXAoKSkgeworICAgICAgICAgIHJldHVybiBuZXcgTWFwRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOworICAgICAgICB9CiAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CiAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CiAgICAgICAgICAgZGVmYXVsdDogIC8vIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgaGFuZGxlcyB1bmtub3duIGN0eXBlcy4KICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CiAgICAgICAgIH0KICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06Ci0gICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3IoZmllbGQpOworICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CisgICAgfQorICB9IGVsc2UgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICByZXR1cm4gbmV3IE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICBkZWZhdWx0OiAgLy8gU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvciBoYW5kbGVzIHVua25vd24gY3R5cGVzLgorICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOworICAgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IEVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcihmaWVsZCwgb3B0aW9ucyk7CiAgICAgfQogICB9IGVsc2UgewogICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBuZXcgTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOwogICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgogICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewogICAgICAgICAgIGRlZmF1bHQ6ICAvLyBTdHJpbmdGaWVsZEdlbmVyYXRvciBoYW5kbGVzIHVua25vd24gY3R5cGVzLgogICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgICAgICByZXR1cm4gbmV3IFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGZpZWxkKTsKKyAgICAgICAgICAgIHJldHVybiBuZXcgU3RyaW5nRmllbGRHZW5lcmF0b3IoZmllbGQsIG9wdGlvbnMpOwogICAgICAgICB9CiAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgICByZXR1cm4gbmV3IEVudW1GaWVsZEdlbmVyYXRvcihmaWVsZCk7CisgICAgICAgIHJldHVybiBuZXcgRW51bUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgIHJldHVybiBuZXcgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoZmllbGQpOworICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGZpZWxkLCBvcHRpb25zKTsKICAgICB9CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaAppbmRleCBjMzAzYTMzLi4zYjAxMjUyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpZWxkLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNiwxMCArMzYsMTQgQEAKICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9GSUVMRF9IX18KIAogI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfb3B0aW9ucy5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CkBAIC01NywxMSArNjEsMTUgQEAKIC8vIFsnbmFtZScsICdpbmRleCcsICdudW1iZXInLCAnY2xhc3NuYW1lJywgJ2RlY2xhcmVkX3R5cGUnLCAndGFnX3NpemUnLAogLy8gJ2RlcHJlY2F0aW9uJ10uCiB2b2lkIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKwordm9pZCBTZXRDb21tb25PbmVvZkZpZWxkVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpOwogCiBjbGFzcyBGaWVsZEdlbmVyYXRvciB7CiAgcHVibGljOgotICBGaWVsZEdlbmVyYXRvcigpIHt9CisgIGV4cGxpY2l0IEZpZWxkR2VuZXJhdG9yKGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIDogb3B0aW9uc18ob3B0aW9ucykge30KICAgdmlydHVhbCB+RmllbGRHZW5lcmF0b3IoKTsKIAogICAvLyBHZW5lcmF0ZSBsaW5lcyBvZiBjb2RlIGRlY2xhcmluZyBtZW1iZXJzIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBjbGFzcwpAQCAtNjksMjAgKzc3LDUxIEBACiAgIC8vIGNsYXNzLgogICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwogCisgIC8vIEdlbmVyYXRlIHN0YXRpYyBkZWZhdWx0IHZhcmlhYmxlIGZvciB0aGlzIGZpZWxkLiBUaGVzZSBhcmUgcGxhY2VkIGluc2lkZQorICAvLyB0aGUgbWVzc2FnZSBjbGFzcy4gTW9zdCBmaWVsZCB0eXBlcyBkb24ndCBuZWVkIHRoaXMsIHNvIHRoZSBkZWZhdWx0CisgIC8vIGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgorICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTdGF0aWNNZW1iZXJzKGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KKworICAvLyBHZW5lcmF0ZSBwcm90b3R5cGVzIGZvciBhY2Nlc3NvcnMgdGhhdCB3aWxsIG1hbmlwdWxhdGUgaW1wb3J0ZWQKKyAgLy8gbWVzc2FnZXMgaW5saW5lLiAgVGhlc2UgYXJlIGZvciAucHJvdG8uaCBoZWFkZXJzLgorICAvLworICAvLyBJbiAucHJvdG8uaCBtb2RlLCB0aGUgaGVhZGVycyBvZiBpbXBvcnRzIGFyZSBub3QgI2luY2x1ZGVkLiBIb3dldmVyLAorICAvLyBmdW5jdGlvbnMgdGhhdCBtYW5pcHVsYXRlIHRoZSBpbXBvcnRlZCBtZXNzYWdlIHR5cGVzIG5lZWQgYWNjZXNzIHRvCisgIC8vIHRoZSBjbGFzcyBkZWZpbml0aW9uIG9mIHRoZSBpbXBvcnRlZCBtZXNzYWdlLCBtZWFuaW5nIHRoYXQgdGhlIGhlYWRlcnMKKyAgLy8gbXVzdCBiZSAjaW5jbHVkZWQuIFRvIGdldCBhcm91bmQgdGhpcywgZnVuY3Rpb25zIHRoYXQgbWFuaXB1bGF0ZQorICAvLyBpbXBvcnRlZCBtZXNzYWdlIG9iamVjdHMgYXJlIGRlZmluZWQgYXMgZGVwZW5kZW50IGZ1bmN0aW9ucyBpbiBhIGJhc2UKKyAgLy8gdGVtcGxhdGUgY2xhc3MuIEJ5IG1ha2luZyB0aGVtIGRlcGVuZGVudCB0ZW1wbGF0ZSBmdW5jdGlvbnMsIHRoZQorICAvLyBmdW5jdGlvbiB0ZW1wbGF0ZXMgd2lsbCBub3QgYmUgaW5zdGFudGlhdGVkIHVudGlsIHRoZXkgYXJlIGNhbGxlZCwgc28KKyAgLy8gd2UgY2FuIGRlZmVyIHRvIHRob3NlIHRyYW5zbGF0aW9uIHVuaXRzIHRvICNpbmNsdWRlIHRoZSBuZWNlc3NhcnkKKyAgLy8gZ2VuZXJhdGVkIGhlYWRlcnMuCisgIC8vCisgIC8vIFNlZToKKyAgLy8gaHR0cDovL2VuLmNwcHJlZmVyZW5jZS5jb20vdy9jcHAvbGFuZ3VhZ2UvY2xhc3NfdGVtcGxhdGUjSW1wbGljaXRfaW5zdGFudGlhdGlvbgorICAvLworICAvLyBNb3N0IGZpZWxkIHR5cGVzIGRvbid0IG5lZWQgdGhpcywgc28gdGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gaXMgZW1wdHkuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKICAgLy8gR2VuZXJhdGUgcHJvdG90eXBlcyBmb3IgYWxsIG9mIHRoZSBhY2Nlc3NvciBmdW5jdGlvbnMgcmVsYXRlZCB0byB0aGlzCiAgIC8vIGZpZWxkLiAgVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGNsYXNzIGRlZmluaXRpb24uCiAgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CiAKKyAgLy8gR2VuZXJhdGUgaW5saW5lIGRlZmluaXRpb25zIG9mIGRlcGVuZW50IGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgdGhpcyBmaWVsZC4KKyAgLy8gVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGhlYWRlciBhZnRlciBhbGwgY2xhc3MgZGVmaW5pdGlvbnMuCisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZURlcGVuZGVudElubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisKICAgLy8gR2VuZXJhdGUgaW5saW5lIGRlZmluaXRpb25zIG9mIGFjY2Vzc29yIGZ1bmN0aW9ucyBmb3IgdGhpcyBmaWVsZC4KICAgLy8gVGhlc2UgYXJlIHBsYWNlZCBpbnNpZGUgdGhlIGhlYWRlciBhZnRlciBhbGwgY2xhc3MgZGVmaW5pdGlvbnMuCisgIC8vIEluIG5vbi0ucHJvdG8uaCBtb2RlLCB0aGlzIGdlbmVyYXRlcyBkZXBlbmRlbnQgYWNjZXNzb3IgZnVuY3Rpb25zIGFzIHdlbGwuCiAgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpIGNvbnN0ID0gMDsKIAogICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBvZiBhY2Nlc3NvcnMgdGhhdCBhcmVuJ3QgaW5saW5lZC4gIFRoZXNlIGFyZQogICAvLyBwbGFjZWQgc29tZXdoZXJlIGluIHRoZSAuY2MgZmlsZS4KICAgLy8gTW9zdCBmaWVsZCB0eXBlcyBkb24ndCBuZWVkIHRoaXMsIHNvIHRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGlzIGVtcHR5LgogICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKAotICAgIGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7fQorICAgIGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KIAogICAvLyBHZW5lcmF0ZSBsaW5lcyBvZiBjb2RlIChzdGF0ZW1lbnRzLCBub3QgZGVjbGFyYXRpb25zKSB3aGljaCBjbGVhciB0aGUKICAgLy8gZmllbGQuICBUaGlzIGlzIHVzZWQgdG8gZGVmaW5lIHRoZSBjbGVhcl8kbmFtZSQoKSBtZXRob2QgYXMgd2VsbCBhcwpAQCAtMTEyLDcgKzE1MSwyNSBAQAogICAvLyBHZW5lcmF0ZSBhbnkgY29kZSB0aGF0IG5lZWRzIHRvIGdvIGluIHRoZSBjbGFzcydzIFNoYXJlZER0b3IoKSBtZXRob2QsCiAgIC8vIGludm9rZWQgYnkgdGhlIGRlc3RydWN0b3IuCiAgIC8vIE1vc3QgZmllbGQgdHlwZXMgZG9uJ3QgbmVlZCB0aGlzLCBzbyB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBpcyBlbXB0eS4KLSAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KKworICAvLyBHZW5lcmF0ZSBhIG1hbnVhbCBkZXN0cnVjdG9yIGludm9jYXRpb24gZm9yIHVzZSB3aGVuIHRoZSBtZXNzYWdlIGlzIG9uIGFuCisgIC8vIGFyZW5hLiBUaGUgY29kZSB0aGF0IHRoaXMgbWV0aG9kIGdlbmVyYXRlcyB3aWxsIGJlIGV4ZWN1dGVkIGluc2lkZSBhCisgIC8vIHNoYXJlZC1mb3ItdGhlLXdob2xlLW1lc3NhZ2UtY2xhc3MgbWV0aG9kIHJlZ2lzdGVyZWQgd2l0aCBPd25EZXN0cnVjdG9yKCkuCisgIC8vIFRoZSBtZXRob2Qgc2hvdWxkIHJldHVybiB8dHJ1ZXwgaWYgaXQgZ2VuZXJhdGVkIGFueSBjb2RlIHRoYXQgcmVxdWlyZXMgYQorICAvLyBjYWxsOyB0aGlzIGFsbG93cyB0aGUgbWVzc2FnZSBnZW5lcmF0b3IgdG8gZWxpbWluYXRlIHRoZSBPd25EZXN0cnVjdG9yKCkKKyAgLy8gcmVnaXN0cmF0aW9uIGlmIG5vIGZpZWxkcyByZXF1aXJlIGl0LgorICB2aXJ0dWFsIGJvb2wgR2VuZXJhdGVBcmVuYURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gR2VuZXJhdGUgY29kZSB0aGF0IGFsbG9jYXRlcyB0aGUgZmllbGRzJ3MgZGVmYXVsdCBpbnN0YW5jZS4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRGVmYXVsdEluc3RhbmNlQWxsb2NhdG9yKGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykKKyAgICAgIGNvbnN0IHt9CisKKyAgLy8gR2VuZXJhdGUgY29kZSB0aGF0IHNob3VsZCBiZSBydW4gd2hlbiBTaHV0ZG93blByb3RvYnVmTGlicmFyeSgpIGlzIGNhbGxlZCwKKyAgLy8gdG8gZGVsZXRlIGFsbCBkeW5hbWljYWxseS1hbGxvY2F0ZWQgb2JqZWN0cy4KKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2h1dGRvd25Db2RlKGlvOjpQcmludGVyKiAvKnByaW50ZXIqLykgY29uc3Qge30KIAogICAvLyBHZW5lcmF0ZSBsaW5lcyB0byBkZWNvZGUgdGhpcyBmaWVsZCwgd2hpY2ggd2lsbCBiZSBwbGFjZWQgaW5zaWRlIHRoZQogICAvLyBtZXNzYWdlJ3MgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKSBtZXRob2QuCkBAIC0xMzcsNiArMTk0LDkgQEAKICAgLy8gYXJlIHBsYWNlZCBpbiB0aGUgbWVzc2FnZSdzIEJ5dGVTaXplKCkgbWV0aG9kLgogICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwogCisgcHJvdGVjdGVkOgorICBjb25zdCBPcHRpb25zJiBvcHRpb25zXzsKKwogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZEdlbmVyYXRvcik7CiB9OwpAQCAtMTQ0LDE2ICsyMDQsMTggQEAKIC8vIENvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGNvbnN0cnVjdHMgRmllbGRHZW5lcmF0b3JzIGZvciBhIERlc2NyaXB0b3IuCiBjbGFzcyBGaWVsZEdlbmVyYXRvck1hcCB7CiAgcHVibGljOgotICBleHBsaWNpdCBGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgRmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAgIH5GaWVsZEdlbmVyYXRvck1hcCgpOwogCiAgIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBnZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CiAKICBwcml2YXRlOgogICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgc2NvcGVkX2FycmF5PHNjb3BlZF9wdHI8RmllbGRHZW5lcmF0b3I+ID4gZmllbGRfZ2VuZXJhdG9yc187CisgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnNfOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj4gPiBmaWVsZF9nZW5lcmF0b3JzXzsKIAotICBzdGF0aWMgRmllbGRHZW5lcmF0b3IqIE1ha2VHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisgIHN0YXRpYyBGaWVsZEdlbmVyYXRvciogTWFrZUdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkR2VuZXJhdG9yTWFwKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuY2MKaW5kZXggM2U2ZDQxNC4uZGUyMDQ3NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzMsNiArMzMsMTMgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2ZpbGUuaD4KKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHNldD4KKwogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2VudW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZXh0ZW5zaW9uLmg+CkBAIC01MCwzNyArNTcsMzYgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1GaWxlR2VuZXJhdG9yOjpGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGRsbGV4cG9ydF9kZWNsKQotICA6IGZpbGVfKGZpbGUpLAotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc18oCi0gICAgICBuZXcgc2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPltmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKV0pLAotICAgIGVudW1fZ2VuZXJhdG9yc18oCi0gICAgICBuZXcgc2NvcGVkX3B0cjxFbnVtR2VuZXJhdG9yPltmaWxlLT5lbnVtX3R5cGVfY291bnQoKV0pLAotICAgIHNlcnZpY2VfZ2VuZXJhdG9yc18oCi0gICAgICBuZXcgc2NvcGVkX3B0cjxTZXJ2aWNlR2VuZXJhdG9yPltmaWxlLT5zZXJ2aWNlX2NvdW50KCldKSwKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18oCi0gICAgICBuZXcgc2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+W2ZpbGUtPmV4dGVuc2lvbl9jb3VudCgpXSksCi0gICAgZGxsZXhwb3J0X2RlY2xfKGRsbGV4cG9ydF9kZWNsKSB7CitGaWxlR2VuZXJhdG9yOjpGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogZmlsZV8oZmlsZSksCisgICAgICBvcHRpb25zXyhvcHRpb25zKSwKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc18oCisgICAgICAgICAgbmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZUdlbmVyYXRvcj5bZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCldKSwKKyAgICAgIGVudW1fZ2VuZXJhdG9yc18oCisgICAgICAgICAgbmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RW51bUdlbmVyYXRvcj5bZmlsZS0+ZW51bV90eXBlX2NvdW50KCldKSwKKyAgICAgIHNlcnZpY2VfZ2VuZXJhdG9yc18oCisgICAgICAgICAgbmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8U2VydmljZUdlbmVyYXRvcj5bZmlsZS0+c2VydmljZV9jb3VudCgpXSksCisgICAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18oCisgICAgICAgICAgbmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RXh0ZW5zaW9uR2VuZXJhdG9yPltmaWxlLT5leHRlbnNpb25fY291bnQoKV0pIHsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAotICAgICAgbmV3IE1lc3NhZ2VHZW5lcmF0b3IoZmlsZS0+bWVzc2FnZV90eXBlKGkpLCBkbGxleHBvcnRfZGVjbCkpOworICAgICAgbmV3IE1lc3NhZ2VHZW5lcmF0b3IoZmlsZS0+bWVzc2FnZV90eXBlKGkpLCBvcHRpb25zKSk7CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKICAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAotICAgICAgbmV3IEVudW1HZW5lcmF0b3IoZmlsZS0+ZW51bV90eXBlKGkpLCBkbGxleHBvcnRfZGVjbCkpOworICAgICAgbmV3IEVudW1HZW5lcmF0b3IoZmlsZS0+ZW51bV90eXBlKGkpLCBvcHRpb25zKSk7CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CiAgICAgc2VydmljZV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKLSAgICAgIG5ldyBTZXJ2aWNlR2VuZXJhdG9yKGZpbGUtPnNlcnZpY2UoaSksIGRsbGV4cG9ydF9kZWNsKSk7CisgICAgICBuZXcgU2VydmljZUdlbmVyYXRvcihmaWxlLT5zZXJ2aWNlKGkpLCBvcHRpb25zKSk7CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKICAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0ucmVzZXQoCi0gICAgICBuZXcgRXh0ZW5zaW9uR2VuZXJhdG9yKGZpbGUtPmV4dGVuc2lvbihpKSwgZGxsZXhwb3J0X2RlY2wpKTsKKyAgICAgIG5ldyBFeHRlbnNpb25HZW5lcmF0b3IoZmlsZS0+ZXh0ZW5zaW9uKGkpLCBvcHRpb25zKSk7CiAgIH0KIAogICBTcGxpdFN0cmluZ1VzaW5nKGZpbGVfLT5wYWNrYWdlKCksICIuIiwgJnBhY2thZ2VfcGFydHNfKTsKQEAgLTg4LDE2MCArOTQsMTMxIEBACiAKIEZpbGVHZW5lcmF0b3I6On5GaWxlR2VuZXJhdG9yKCkge30KIAotdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUhlYWRlcihpbzo6UHJpbnRlciogcHJpbnRlcikgewordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVByb3RvSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgaW5mb19wYXRoKSB7CisgIGlmICghb3B0aW9uc18ucHJvdG9faCkgeworICAgIHJldHVybjsKKyAgfQorCiAgIHN0cmluZyBmaWxlbmFtZV9pZGVudGlmaWVyID0gRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVfLT5uYW1lKCkpOworICBHZW5lcmF0ZVRvcEhlYWRlckd1YXJkKHByaW50ZXIsIGZpbGVuYW1lX2lkZW50aWZpZXIpOwogCi0gIC8vIEdlbmVyYXRlIHRvcCBvZiBoZWFkZXIuCi0gIHByaW50ZXItPlByaW50KAotICAgICIvLyBHZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGJ1ZmZlciBjb21waWxlci4gIERPIE5PVCBFRElUIVxuIgotICAgICIvLyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKLSAgICAiXG4iCi0gICAgIiNpZm5kZWYgUFJPVE9CVUZfJGZpbGVuYW1lX2lkZW50aWZpZXIkX19JTkNMVURFRFxuIgotICAgICIjZGVmaW5lIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIKLSAgICAiXG4iCi0gICAgIiNpbmNsdWRlIDxzdHJpbmc+XG4iCi0gICAgIlxuIiwKLSAgICAiZmlsZW5hbWUiLCBmaWxlXy0+bmFtZSgpLAotICAgICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7CiAKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+XG4iCi0gICAgIlxuIik7CisgIEdlbmVyYXRlTGlicmFyeUluY2x1ZGVzKHByaW50ZXIpOwogCi0gIC8vIFZlcmlmeSB0aGUgcHJvdG9idWYgbGlicmFyeSBoZWFkZXIgdmVyc2lvbiBpcyBjb21wYXRpYmxlIHdpdGggdGhlIHByb3RvYwotICAvLyB2ZXJzaW9uIGJlZm9yZSBnb2luZyBhbnkgZnVydGhlci4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiNpZiBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiA8ICRtaW5faGVhZGVyX3ZlcnNpb24kXG4iCi0gICAgIiNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzXG4iCi0gICAgIiNlcnJvciBpbmNvbXBhdGlibGUgd2l0aCB5b3VyIFByb3RvY29sIEJ1ZmZlciBoZWFkZXJzLiAgUGxlYXNlIHVwZGF0ZVxuIgotICAgICIjZXJyb3IgeW91ciBoZWFkZXJzLlxuIgotICAgICIjZW5kaWZcbiIKLSAgICAiI2lmICRwcm90b2NfdmVyc2lvbiQgPCBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OXG4iCi0gICAgIiNlcnJvciBUaGlzIGZpbGUgd2FzIGdlbmVyYXRlZCBieSBhbiBvbGRlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpc1xuIgotICAgICIjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZVxuIgotICAgICIjZXJyb3IgcmVnZW5lcmF0ZSB0aGlzIGZpbGUgd2l0aCBhIG5ld2VyIHZlcnNpb24gb2YgcHJvdG9jLlxuIgotICAgICIjZW5kaWZcbiIKLSAgICAiXG4iLAotICAgICJtaW5faGVhZGVyX3ZlcnNpb24iLAotICAgICAgU2ltcGxlSXRvYShwcm90b2J1Zjo6aW50ZXJuYWw6OmtNaW5IZWFkZXJWZXJzaW9uRm9yUHJvdG9jKSwKLSAgICAicHJvdG9jX3ZlcnNpb24iLCBTaW1wbGVJdG9hKEdPT0dMRV9QUk9UT0JVRl9WRVJTSU9OKSk7Ci0KLSAgLy8gT0ssIGl0J3Mgbm93IHNhZmUgdG8gI2luY2x1ZGUgb3RoZXIgZmlsZXMuCi0gIHByaW50ZXItPlByaW50KAotICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD5cbiIKLSAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPlxuIgotICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD5cbiIpOwotCi0gIGlmIChIYXNVbmtub3duRmllbGRzKGZpbGVfKSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwID0gZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5KGkpOworICAgIGNvbnN0IGNoYXIqIGV4dGVuc2lvbiA9ICIucHJvdG8uaCI7CisgICAgc3RyaW5nIGRlcGVuZGVuY3kgPSBTdHJpcFByb3RvKGRlcC0+bmFtZSgpKSArIGV4dGVuc2lvbjsKICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+XG4iKTsKKyAgICAgICIjaW5jbHVkZSBcIiRkZXBlbmRlbmN5JFwiICAvLyBJV1lVIHByYWdtYTogZXhwb3J0XG4iLAorICAgICAgImRlcGVuZGVuY3kiLCBkZXBlbmRlbmN5KTsKICAgfQogCi0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD5cbiIpOwotICB9Ci0KLSAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXykpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaD5cbiIpOwotICB9Ci0KLQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiNpbmNsdWRlIFwiJGRlcGVuZGVuY3kkLnBiLmhcIlxuIiwKLSAgICAgICJkZXBlbmRlbmN5IiwgU3RyaXBQcm90byhmaWxlXy0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpKSk7Ci0gIH0KKyAgR2VuZXJhdGVNZXRhZGF0YVByYWdtYShwcmludGVyLCBpbmZvX3BhdGgpOwogCiAgIHByaW50ZXItPlByaW50KAogICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpXG4iKTsKIAorCisgIEdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9ucyhwcmludGVyKTsKKwogICAvLyBPcGVuIG5hbWVzcGFjZS4KICAgR2VuZXJhdGVOYW1lc3BhY2VPcGVuZXJzKHByaW50ZXIpOwogCi0gIC8vIEZvcndhcmQtZGVjbGFyZSB0aGUgQWRkRGVzY3JpcHRvcnMsIEFzc2lnbkRlc2NyaXB0b3JzLCBhbmQgU2h1dGRvd25GaWxlCi0gIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGVtIHRvIGJlIGZyaWVuZHMgb2YgZWFjaCBjbGFzcy4KKyAgR2VuZXJhdGVHbG9iYWxTdGF0ZUZ1bmN0aW9uRGVjbGFyYXRpb25zKHByaW50ZXIpOworCisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIEdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOworCisgIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworCisgIEdlbmVyYXRlTWVzc2FnZURlZmluaXRpb25zKHByaW50ZXIpOworCisgIHByaW50ZXItPlByaW50KCJcbiIpOworICBwcmludGVyLT5QcmludChrVGhpY2tTZXBhcmF0b3IpOworICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICBHZW5lcmF0ZVNlcnZpY2VEZWZpbml0aW9ucyhwcmludGVyKTsKKworICBHZW5lcmF0ZUV4dGVuc2lvbklkZW50aWZpZXJzKHByaW50ZXIpOworCisgIHByaW50ZXItPlByaW50KCJcbiIpOworICBwcmludGVyLT5QcmludChrVGhpY2tTZXBhcmF0b3IpOworICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICBHZW5lcmF0ZUlubGluZUZ1bmN0aW9uRGVmaW5pdGlvbnMocHJpbnRlcik7CisKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgIlxuIgotICAgICIvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuXG4iCi0gICAgInZvaWQgJGRsbGV4cG9ydF9kZWNsJCAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIiwKLSAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpLAotICAgICJkbGxleHBvcnRfZGVjbCIsIGRsbGV4cG9ydF9kZWNsXyk7CisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpXG4iCisgICAgIlxuIik7CisKKyAgLy8gQ2xvc2UgdXAgbmFtZXNwYWNlLgorICBHZW5lcmF0ZU5hbWVzcGFjZUNsb3NlcnMocHJpbnRlcik7CisKKyAgLy8gV2UgbmVlZCB0byBzcGVjaWFsaXplIHNvbWUgdGVtcGxhdGVzIGluIHRoZSA6Omdvb2dsZTo6cHJvdG9idWYgbmFtZXNwYWNlOgorICBHZW5lcmF0ZVByb3RvMk5hbWVzcGFjZUVudW1TcGVjaWFsaXphdGlvbnMocHJpbnRlcik7CiAKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IHB1dCBkbGxleHBvcnRfZGVjbCBvbiB0aGVzZSBiZWNhdXNlIHRoZXkgYXJlIG9ubHkKLSAgICAvLyBjYWxsZWQgYnkgdGhlIC5wYi5jYyBmaWxlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQuCi0gICAgInZvaWQgJGFzc2lnbmRlc2NyaXB0b3JzbmFtZSQoKTtcbiIKLSAgICAidm9pZCAkc2h1dGRvd25maWxlbmFtZSQoKTtcbiIKLSAgICAiXG4iLAotICAgICJhc3NpZ25kZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSksCi0gICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKKyAgICAiXG4iCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnbG9iYWxfc2NvcGUpXG4iCisgICAgIlxuIik7CiAKLSAgLy8gR2VuZXJhdGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgY2xhc3Nlcy4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9uKHByaW50ZXIpOworICBHZW5lcmF0ZUJvdHRvbUhlYWRlckd1YXJkKHByaW50ZXIsIGZpbGVuYW1lX2lkZW50aWZpZXIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlUEJIZWFkZXIoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbmZvX3BhdGgpIHsKKyAgc3RyaW5nIGZpbGVuYW1lX2lkZW50aWZpZXIgPQorICAgICAgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVfLT5uYW1lKCkgKyAob3B0aW9uc18ucHJvdG9faCA/ICIucGIuaCIgOiAiIikpOworICBHZW5lcmF0ZVRvcEhlYWRlckd1YXJkKHByaW50ZXIsIGZpbGVuYW1lX2lkZW50aWZpZXIpOworCisgIGlmIChvcHRpb25zXy5wcm90b19oKSB7CisgICAgcHJpbnRlci0+UHJpbnQoIiNpbmNsdWRlIFwiJGJhc2VuYW1lJC5wcm90by5oXCIgIC8vIElXWVUgcHJhZ21hOiBleHBvcnRcbiIsCisgICAgICAgICAgICAgICAgICAgImJhc2VuYW1lIiwgU3RyaXBQcm90byhmaWxlXy0+bmFtZSgpKSk7CisgIH0gZWxzZSB7CisgICAgR2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMocHJpbnRlcik7CiAgIH0KKyAgR2VuZXJhdGVEZXBlbmRlbmN5SW5jbHVkZXMocHJpbnRlcik7CisgIEdlbmVyYXRlTWV0YWRhdGFQcmFnbWEocHJpbnRlciwgaW5mb19wYXRoKTsKIAotICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcylcbiIpOwogCi0gIC8vIEdlbmVyYXRlIGVudW0gZGVmaW5pdGlvbnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhwcmludGVyKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWZpbml0aW9uKHByaW50ZXIpOwotICB9CiAKLSAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7CiAKLSAgLy8gR2VuZXJhdGUgY2xhc3MgZGVmaW5pdGlvbnMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOwotICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gICAgfQotICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHByaW50ZXIpOwotICB9CisgIC8vIE9wZW4gbmFtZXNwYWNlLgorICBHZW5lcmF0ZU5hbWVzcGFjZU9wZW5lcnMocHJpbnRlcik7CiAKLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7Ci0gIHByaW50ZXItPlByaW50KCJcbiIpOworICBpZiAoIW9wdGlvbnNfLnByb3RvX2gpIHsKKyAgICBHZW5lcmF0ZUdsb2JhbFN0YXRlRnVuY3Rpb25EZWNsYXJhdGlvbnMocHJpbnRlcik7CisgICAgR2VuZXJhdGVNZXNzYWdlRm9yd2FyZERlY2xhcmF0aW9ucyhwcmludGVyKTsKIAotICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfKSkgewotICAgIC8vIEdlbmVyYXRlIHNlcnZpY2UgZGVmaW5pdGlvbnMuCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIGlmIChpID4gMCkgewotICAgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOwotICAgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgICAgIH0KLSAgICAgIHNlcnZpY2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVjbGFyYXRpb25zKHByaW50ZXIpOwotICAgIH0KKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAgIEdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOworCisgICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAgIEdlbmVyYXRlTWVzc2FnZURlZmluaXRpb25zKHByaW50ZXIpOwogCiAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CiAgICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgfQogCi0gIC8vIERlY2xhcmUgZXh0ZW5zaW9uIGlkZW50aWZpZXJzLgotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9uKHByaW50ZXIpOwotICB9CisgICAgR2VuZXJhdGVTZXJ2aWNlRGVmaW5pdGlvbnMocHJpbnRlcik7CiAKLSAgcHJpbnRlci0+UHJpbnQoIlxuIik7Ci0gIHByaW50ZXItPlByaW50KGtUaGlja1NlcGFyYXRvcik7Ci0gIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIEdlbmVyYXRlRXh0ZW5zaW9uSWRlbnRpZmllcnMocHJpbnRlcik7CiAKLSAgLy8gR2VuZXJhdGUgY2xhc3MgaW5saW5lIG1ldGhvZHMuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoaSA+IDApIHsKLSAgICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKLSAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgIH0KLSAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUlubGluZU1ldGhvZHMocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoa1RoaWNrU2VwYXJhdG9yKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKworICAgIEdlbmVyYXRlSW5saW5lRnVuY3Rpb25EZWZpbml0aW9ucyhwcmludGVyKTsKICAgfQogCiAgIHByaW50ZXItPlByaW50KApAQCAtMjUxLDI3ICsyMjgsOSBAQAogICAvLyBDbG9zZSB1cCBuYW1lc3BhY2UuCiAgIEdlbmVyYXRlTmFtZXNwYWNlQ2xvc2VycyhwcmludGVyKTsKIAotICAvLyBFbWl0IEdldEVudW1EZXNjcmlwdG9yIHNwZWNpYWxpemF0aW9ucyBpbnRvIGdvb2dsZTo6cHJvdG9idWYgbmFtZXNwYWNlOgotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7Ci0gICAgLy8gVGhlIFNXSUcgY29uZGl0aW9uYWwgaXMgdG8gYXZvaWQgYSBudWxsLXBvaW50ZXIgZGVyZWZlcmVuY2UKLSAgICAvLyAoYnVnIDE5ODQ5NjQpIGluIHN3aWctMS4zLjIxIHJlc3VsdGluZyBmcm9tIHRoZSBmb2xsb3dpbmcgc3ludGF4OgotICAgIC8vICAgbmFtZXNwYWNlIFggeyB2b2lkIFk8Wjo6Vz4oKTsgfQotICAgIC8vIHdoaWNoIGFwcGVhcnMgaW4gR2V0RW51bURlc2NyaXB0b3IoKSBzcGVjaWFsaXphdGlvbnMuCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJcbiIKLSAgICAgICAgIiNpZm5kZWYgU1dJR1xuIgotICAgICAgICAibmFtZXNwYWNlIGdvb2dsZSB7XG5uYW1lc3BhY2UgcHJvdG9idWYge1xuIgotICAgICAgICAiXG4iKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOwotICAgIH0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUdldEVudW1EZXNjcmlwdG9yU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIlxuIgotICAgICAgICAifSAgLy8gbmFtZXNwYWNlIGdvb2dsZVxufSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmXG4iCi0gICAgICAgICIjZW5kaWYgIC8vIFNXSUdcbiIpOworICBpZiAoIW9wdGlvbnNfLnByb3RvX2gpIHsKKyAgICAvLyBXZSBuZWVkIHRvIHNwZWNpYWxpemUgc29tZSB0ZW1wbGF0ZXMgaW4gdGhlIDo6Z29vZ2xlOjpwcm90b2J1ZiBuYW1lc3BhY2U6CisgICAgR2VuZXJhdGVQcm90bzJOYW1lc3BhY2VFbnVtU3BlY2lhbGl6YXRpb25zKHByaW50ZXIpOwogICB9CiAKICAgcHJpbnRlci0+UHJpbnQoCkBAIC0yNzksNDEgKzIzOCw2NiBAQAogICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2xvYmFsX3Njb3BlKVxuIgogICAgICJcbiIpOwogCi0gIHByaW50ZXItPlByaW50KAotICAgICIjZW5kaWYgIC8vIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIsCi0gICAgImZpbGVuYW1lX2lkZW50aWZpZXIiLCBmaWxlbmFtZV9pZGVudGlmaWVyKTsKKyAgR2VuZXJhdGVCb3R0b21IZWFkZXJHdWFyZChwcmludGVyLCBmaWxlbmFtZV9pZGVudGlmaWVyKTsKIH0KIAogdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVNvdXJjZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBjb25zdCBib29sIHVzZV9zeXN0ZW1faW5jbHVkZSA9IElzV2VsbEtub3duTWVzc2FnZShmaWxlXyk7CisgIHN0cmluZyBoZWFkZXIgPQorICAgICAgU3RyaXBQcm90byhmaWxlXy0+bmFtZSgpKSArIChvcHRpb25zXy5wcm90b19oID8gIi5wcm90by5oIiA6ICIucGIuaCIpOwogICBwcmludGVyLT5QcmludCgKICAgICAiLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKKyAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCiAgICAgIlxuIgotCiAgICAgLy8gVGhlIGdlbmVyYXRlZCBjb2RlIGNhbGxzIGFjY2Vzc29ycyB0aGF0IG1pZ2h0IGJlIGRlcHJlY2F0ZWQuIFdlIGRvbid0CiAgICAgLy8gd2FudCB0aGUgY29tcGlsZXIgdG8gd2FybiBpbiBnZW5lcmF0ZWQgY29kZS4KICAgICAiI2RlZmluZSBJTlRFUk5BTF9TVVBQUkVTU19QUk9UT0JVRl9GSUVMRF9ERVBSRUNBVElPTlxuIgotICAgICIjaW5jbHVkZSBcIiRiYXNlbmFtZSQucGIuaFwiXG4iCisgICAgIiNpbmNsdWRlICRsZWZ0JCRoZWFkZXIkJHJpZ2h0JFxuIgogICAgICJcbiIKICAgICAiI2luY2x1ZGUgPGFsZ29yaXRobT5cbiIgICAgLy8gZm9yIHN3YXAoKQogICAgICJcbiIKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD5cbiIKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0Lmg+XG4iCiAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPlxuIgogICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPlxuIgogICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+XG4iLAotICAgICJiYXNlbmFtZSIsIFN0cmlwUHJvdG8oZmlsZV8tPm5hbWUoKSkpOworICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCksCisgICAgImhlYWRlciIsIGhlYWRlciwKKyAgICAibGVmdCIsIHVzZV9zeXN0ZW1faW5jbHVkZSA/ICI8IiA6ICJcIiIsCisgICAgInJpZ2h0IiwgdXNlX3N5c3RlbV9pbmNsdWRlID8gIj4iIDogIlwiIik7CiAKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSkgeworICAvLyBVbmtub3duIGZpZWxkcyBpbXBsZW1lbnRhdGlvbiBpbiBsaXRlIG1vZGUgdXNlcyBTdHJpbmdPdXRwdXRTdHJlYW0KKyAgaWYgKCFVc2VVbmtub3duRmllbGRTZXQoZmlsZV8sIG9wdGlvbnNfKSAmJiBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPlxuIik7CisgIH0KKworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSkgewogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPlxuIgorICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPlxuIgogICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD5cbiIKICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+XG4iKTsKICAgfQogCisgIGlmIChvcHRpb25zXy5wcm90b19oKSB7CisgICAgLy8gVXNlIHRoZSBzbWFsbGVyIC5wcm90by5oIGZpbGVzLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVwID0gZmlsZV8tPmRlcGVuZGVuY3koaSk7CisgICAgICBjb25zdCBjaGFyKiBleHRlbnNpb24gPSAiLnByb3RvLmgiOworICAgICAgc3RyaW5nIGRlcGVuZGVuY3kgPSBTdHJpcFByb3RvKGRlcC0+bmFtZSgpKSArIGV4dGVuc2lvbjsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIjaW5jbHVkZSBcIiRkZXBlbmRlbmN5JFwiXG4iLAorICAgICAgICAgICJkZXBlbmRlbmN5IiwgZGVwZW5kZW5jeSk7CisgICAgfQorICB9CisKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcylcbiIpOwogCiAgIEdlbmVyYXRlTmFtZXNwYWNlT3BlbmVycyhwcmludGVyKTsKIAotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXywgb3B0aW9uc18pKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiXG4iCiAgICAgICAibmFtZXNwYWNlIHtcbiIKQEAgLTMyNyw3ICszMTEsNyBAQAogICAgICAgICAibmFtZSIsIENsYXNzTmFtZShmaWxlXy0+ZW51bV90eXBlKGkpLCBmYWxzZSkpOwogICAgIH0KIAotICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXywgb3B0aW9uc18pKSB7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgewogICAgICAgICBwcmludGVyLT5QcmludCgKICAgICAgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvciogJG5hbWUkX2Rlc2NyaXB0b3JfID0gTlVMTDtcbiIsCkBAIC0zNTIsMTMgKzMzNiwzMiBAQAogCiAgIC8vIEdlbmVyYXRlIGNsYXNzZXMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoaSA9PSAwICYmIEhhc0dlbmVyYXRlZE1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIlxuIgorICAgICAgICAgICJuYW1lc3BhY2Uge1xuIgorICAgICAgICAgICJcbiIKKyAgICAgICAgICAic3RhdGljIHZvaWQgTWVyZ2VGcm9tRmFpbChpbnQgbGluZSkgR09PR0xFX0FUVFJJQlVURV9DT0xEO1xuIgorICAgICAgICAgICJHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHN0YXRpYyB2b2lkIE1lcmdlRnJvbUZhaWwoaW50IGxpbmUpIHtcbiIKKyAgICAgICAgICAiICBHT09HTEVfQ0hFQ0soZmFsc2UpIDw8IF9fRklMRV9fIDw8IFwiOlwiIDw8IGxpbmU7XG4iCisgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAiXG4iCisgICAgICAgICAgIn0gIC8vIG5hbWVzcGFjZVxuIgorICAgICAgICAgICJcbiIpOworICAgIH0KICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKICAgICBwcmludGVyLT5QcmludChrVGhpY2tTZXBhcmF0b3IpOwogICAgIHByaW50ZXItPlByaW50KCJcbiIpOwogICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NNZXRob2RzKHByaW50ZXIpOworCisgICAgcHJpbnRlci0+UHJpbnQoIiNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlNcbiIpOworICAgIC8vIEdlbmVyYXRlIGNsYXNzIGlubGluZSBtZXRob2RzLgorICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW5saW5lTWV0aG9kcyhwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpc19pbmxpbmUgPSAqLyBmYWxzZSk7CisgICAgcHJpbnRlci0+UHJpbnQoIiNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTXG4iKTsKICAgfQogCi0gIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgewogICAgIC8vIEdlbmVyYXRlIHNlcnZpY2VzLgogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CiAgICAgICBpZiAoaSA9PSAwKSBwcmludGVyLT5QcmludCgiXG4iKTsKQEAgLTM4NCw2ICszODcsNjMgQEAKICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSlcbiIpOwogfQogCitjbGFzcyBGaWxlR2VuZXJhdG9yOjpGb3J3YXJkRGVjbGFyYXRpb25zIHsKKyBwdWJsaWM6CisgIH5Gb3J3YXJkRGVjbGFyYXRpb25zKCkgeworICAgIGZvciAobWFwPHN0cmluZywgRm9yd2FyZERlY2xhcmF0aW9ucyAqPjo6aXRlcmF0b3IgaXQgPSBuYW1lc3BhY2VzXy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW5kID0gbmFtZXNwYWNlc18uZW5kKCk7CisgICAgICAgICBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgIGRlbGV0ZSBpdC0+c2Vjb25kOworICAgIH0KKyAgICBuYW1lc3BhY2VzXy5jbGVhcigpOworICB9CisKKyAgRm9yd2FyZERlY2xhcmF0aW9ucyogQWRkT3JHZXROYW1lc3BhY2UoY29uc3Qgc3RyaW5nJiBuc19uYW1lKSB7CisgICAgRm9yd2FyZERlY2xhcmF0aW9ucyomIG5zID0gbmFtZXNwYWNlc19bbnNfbmFtZV07CisgICAgaWYgKG5zID09IE5VTEwpIHsKKyAgICAgIG5zID0gbmV3IEZvcndhcmREZWNsYXJhdGlvbnM7CisgICAgfQorICAgIHJldHVybiBuczsKKyAgfQorCisgIG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPiYgY2xhc3NlcygpIHsgcmV0dXJuIGNsYXNzZXNfOyB9CisgIG1hcDxzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4mIGVudW1zKCkgeyByZXR1cm4gZW51bXNfOyB9CisKKyAgdm9pZCBQcmludChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAgIGZvciAobWFwPHN0cmluZywgY29uc3QgRW51bURlc2NyaXB0b3IgKj46OmNvbnN0X2l0ZXJhdG9yCisgICAgICAgICAgICAgaXQgPSBlbnVtc18uYmVnaW4oKSwKKyAgICAgICAgICAgICBlbmQgPSBlbnVtc18uZW5kKCk7CisgICAgICAgICBpdCAhPSBlbmQ7ICsraXQpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJlbnVtICRlbnVtbmFtZSQgOiBpbnQ7XG4iLCAiZW51bW5hbWUiLCBpdC0+Zmlyc3QpOworICAgICAgcHJpbnRlci0+QW5ub3RhdGUoImVudW1uYW1lIiwgaXQtPnNlY29uZCk7CisgICAgICBwcmludGVyLT5QcmludCgiYm9vbCAkZW51bW5hbWUkX0lzVmFsaWQoaW50IHZhbHVlKTtcbiIsICJlbnVtbmFtZSIsCisgICAgICAgICAgICAgICAgICAgICBpdC0+Zmlyc3QpOworICAgIH0KKyAgICBmb3IgKG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IgKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2xhc3Nlc18uYmVnaW4oKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGNsYXNzZXNfLmVuZCgpOworICAgICAgICAgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgICBwcmludGVyLT5QcmludCgiY2xhc3MgJGNsYXNzbmFtZSQ7XG4iLCAiY2xhc3NuYW1lIiwgaXQtPmZpcnN0KTsKKyAgICAgIHByaW50ZXItPkFubm90YXRlKCJjbGFzc25hbWUiLCBpdC0+c2Vjb25kKTsKKyAgICB9CisgICAgZm9yIChtYXA8c3RyaW5nLCBGb3J3YXJkRGVjbGFyYXRpb25zICo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgIGl0ID0gbmFtZXNwYWNlc18uYmVnaW4oKSwKKyAgICAgICAgICAgICBlbmQgPSBuYW1lc3BhY2VzXy5lbmQoKTsKKyAgICAgICAgIGl0ICE9IGVuZDsgKytpdCkgeworICAgICAgcHJpbnRlci0+UHJpbnQoIm5hbWVzcGFjZSAkbnNuYW1lJCB7XG4iLAorICAgICAgICAgICAgICAgICAgICAgIm5zbmFtZSIsIGl0LT5maXJzdCk7CisgICAgICBpdC0+c2Vjb25kLT5QcmludChwcmludGVyKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJ9ICAvLyBuYW1lc3BhY2UgJG5zbmFtZSRcbiIsCisgICAgICAgICAgICAgICAgICAgICAibnNuYW1lIiwgaXQtPmZpcnN0KTsKKyAgICB9CisgIH0KKworCisgcHJpdmF0ZToKKyAgbWFwPHN0cmluZywgRm9yd2FyZERlY2xhcmF0aW9ucyo+IG5hbWVzcGFjZXNfOworICBtYXA8c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj4gY2xhc3Nlc187CisgIG1hcDxzdHJpbmcsIGNvbnN0IEVudW1EZXNjcmlwdG9yKj4gZW51bXNfOworfTsKKwogdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKICAgLy8gQWRkRGVzY3JpcHRvcnMoKSBpcyBhIGZpbGUtbGV2ZWwgcHJvY2VkdXJlIHdoaWNoIGFkZHMgdGhlIGVuY29kZWQKICAgLy8gRmlsZURlc2NyaXB0b3JQcm90byBmb3IgdGhpcyAucHJvdG8gZmlsZSB0byB0aGUgZ2xvYmFsIERlc2NyaXB0b3JQb29sIGZvcgpAQCAtNDAyLDcgKzQ2Miw3IEBACiAKICAgLy8gSW4gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FIG1vZGUsIHdlIGRvbid0IGdlbmVyYXRlIEFzc2lnbkRlc2NyaXB0b3JzKCkKICAgLy8gYW5kIHdlIG9ubHkgdXNlIEFkZERlc2NyaXB0b3JzKCkgdG8gYWxsb2NhdGUgZGVmYXVsdCBpbnN0YW5jZXMuCi0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXykpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKICAgICBwcmludGVyLT5QcmludCgKICAgICAgICJcbiIKICAgICAgICJ2b2lkICRhc3NpZ25kZXNjcmlwdG9yc25hbWUkKCkge1xuIiwKQEAgLTQzNSw3ICs0OTUsNyBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKICAgICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemVyKHByaW50ZXIsIGkpOwogICAgIH0KLSAgICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfKSkgeworICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgewogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKICAgICAgICAgc2VydmljZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6ZXIocHJpbnRlciwgaSk7CiAgICAgICB9CkBAIC01MDEsMjAgKzU2MSwyMyBAQAogCiAgIC8vIE5vdyBnZW5lcmF0ZSB0aGUgQWRkRGVzY3JpcHRvcnMoKSBmdW5jdGlvbi4KICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgIGZpbGVfLCBwcmludGVyLAotICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAvLyBOb3RlIHRoYXQgd2UgZG9uJ3QgbmVlZCBhbnkgc3BlY2lhbCBzeW5jaHJvbml6YXRpb24gaW4gdGhlIGZvbGxvd2luZyBjb2RlCi0gICAgLy8gYmVjYXVzZSBpdCBpcyBjYWxsZWQgYXQgc3RhdGljIGluaXQgdGltZSBiZWZvcmUgYW55IHRocmVhZHMgZXhpc3QuCi0gICAgInZvaWQgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKSB7XG4iCi0gICAgIiAgc3RhdGljIGJvb2wgYWxyZWFkeV9oZXJlID0gZmFsc2U7XG4iCi0gICAgIiAgaWYgKGFscmVhZHlfaGVyZSkgcmV0dXJuO1xuIgotICAgICIgIGFscmVhZHlfaGVyZSA9IHRydWU7XG4iCi0gICAgIiAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OO1xuIiwKLSAgICAvLyBXaXRob3V0LgotICAgICJ2b2lkICRhZGRkZXNjcmlwdG9yc25hbWUkX2ltcGwoKSB7XG4iCi0gICAgIiAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OO1xuIiwKLSAgICAvLyBWYXJzLgotICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSkpOworICAgICAgZmlsZV8sIG9wdGlvbnNfLCBwcmludGVyLAorICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IG5lZWQgYW55IHNwZWNpYWwgc3luY2hyb25pemF0aW9uIGluIHRoZSBmb2xsb3dpbmcKKyAgICAgIC8vIGNvZGUKKyAgICAgIC8vIGJlY2F1c2UgaXQgaXMgY2FsbGVkIGF0IHN0YXRpYyBpbml0IHRpbWUgYmVmb3JlIGFueSB0aHJlYWRzIGV4aXN0LgorICAgICAgInZvaWQgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKSB7XG4iCisgICAgICAiICBzdGF0aWMgYm9vbCBhbHJlYWR5X2hlcmUgPSBmYWxzZTtcbiIKKyAgICAgICIgIGlmIChhbHJlYWR5X2hlcmUpIHJldHVybjtcbiIKKyAgICAgICIgIGFscmVhZHlfaGVyZSA9IHRydWU7XG4iCisgICAgICAiICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047XG4iCisgICAgICAiXG4iLAorICAgICAgLy8gV2l0aG91dC4KKyAgICAgICJ2b2lkICRhZGRkZXNjcmlwdG9yc25hbWUkX2ltcGwoKSB7XG4iCisgICAgICAiICBHT09HTEVfUFJPVE9CVUZfVkVSSUZZX1ZFUlNJT047XG4iCisgICAgICAiXG4iLAorICAgICAgLy8gVmFycy4KKyAgICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSkpOwogCiAgIHByaW50ZXItPkluZGVudCgpOwogCkBAIC01MjMsMjAgKzU4NiwxNSBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgewogICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXBlbmRlbmN5ID0gZmlsZV8tPmRlcGVuZGVuY3koaSk7CiAgICAgLy8gUHJpbnQgdGhlIG5hbWVzcGFjZSBwcmVmaXggZm9yIHRoZSBkZXBlbmRlbmN5LgotICAgIHZlY3RvcjxzdHJpbmc+IGRlcGVuZGVuY3lfcGFja2FnZV9wYXJ0czsKLSAgICBTcGxpdFN0cmluZ1VzaW5nKGRlcGVuZGVuY3ktPnBhY2thZ2UoKSwgIi4iLCAmZGVwZW5kZW5jeV9wYWNrYWdlX3BhcnRzKTsKLSAgICBwcmludGVyLT5QcmludCgiOjoiKTsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lfcGFja2FnZV9wYXJ0cy5zaXplKCk7IGkrKykgewotICAgICAgcHJpbnRlci0+UHJpbnQoIiRuYW1lJDo6IiwKLSAgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgZGVwZW5kZW5jeV9wYWNrYWdlX3BhcnRzW2ldKTsKLSAgICB9CisgICAgc3RyaW5nIGFkZF9kZXNjX25hbWUgPSBRdWFsaWZpZWRGaWxlTGV2ZWxTeW1ib2woCisgICAgICAgIGRlcGVuZGVuY3ktPnBhY2thZ2UoKSwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlcGVuZGVuY3ktPm5hbWUoKSkpOwogICAgIC8vIENhbGwgaXRzIEFkZERlc2NyaXB0b3JzIGZ1bmN0aW9uLgogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIiRuYW1lJCgpO1xuIiwKLSAgICAgICJuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlcGVuZGVuY3ktPm5hbWUoKSkpOworICAgICAgIm5hbWUiLCBhZGRfZGVzY19uYW1lKTsKICAgfQogCi0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXykpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKICAgICAvLyBFbWJlZCB0aGUgZGVzY3JpcHRvci4gIFdlIHNpbXBseSBzZXJpYWxpemUgdGhlIGVudGlyZSBGaWxlRGVzY3JpcHRvclByb3RvCiAgICAgLy8gYW5kIGVtYmVkIGl0IGFzIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIGlzIHBhcnNlZCBhbmQgYnVpbHQgaW50byByZWFsCiAgICAgLy8gZGVzY3JpcHRvcnMgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4KQEAgLTU0NSwxOCArNjAzLDYwIEBACiAgICAgc3RyaW5nIGZpbGVfZGF0YTsKICAgICBmaWxlX3Byb3RvLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2RhdGEpOwogCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6SW50ZXJuYWxBZGRHZW5lcmF0ZWRGaWxlKCIpOworI2lmZGVmIF9NU0NfVkVSCisgICAgYm9vbCBicmVha2Rvd25fbGFyZ2VfZmlsZSA9IHRydWU7CisjZWxzZQorICAgIGJvb2wgYnJlYWtkb3duX2xhcmdlX2ZpbGUgPSBmYWxzZTsKKyNlbmRpZgorICAgIC8vIFdvcmthcm91bmQgZm9yIE1TVkM6ICJFcnJvciBDMTA5MTogY29tcGlsZXIgbGltaXQ6IHN0cmluZyBleGNlZWRzIDY1NTM1CisgICAgLy8gYnl0ZXMgaW4gbGVuZ3RoIi4gRGVjbGFyZSBhIHN0YXRpYyBhcnJheSBvZiBjaGFyYWN0ZXJzIHJhdGhlciB0aGFuIHVzZSBhCisgICAgLy8gc3RyaW5nIGxpdGVyYWwuCisgICAgaWYgKGJyZWFrZG93bl9sYXJnZV9maWxlICYmIGZpbGVfZGF0YS5zaXplKCkgPiA2NTUzNSkgeworICAgICAgLy8gVGhpcyBoYXMgdG8gYmUgZXhwbGljaXRseSBtYXJrZWQgYXMgYSBzaWduZWQgY2hhciBiZWNhdXNlIHRoZSBnZW5lcmF0ZWQKKyAgICAgIC8vIGNvZGUgcHV0cyBuZWdhdGl2ZSB2YWx1ZXMgaW4gdGhlIGFycmF5LCBhbmQgc29tZXRpbWVzIHBsYWluIGNoYXIgaXMKKyAgICAgIC8vIHVuc2lnbmVkLiBUaGF0IGltcGxpY2l0IG5hcnJvd2luZyBjb252ZXJzaW9uIGlzIG5vdCBhbGxvd2VkIGluIEMrKzExLgorICAgICAgLy8gPGh0dHA6Ly9zdGFja292ZXJmbG93LmNvbS9xdWVzdGlvbnMvNDQzNDE0MC9uYXJyb3dpbmctY29udmVyc2lvbnMtaW4tYzB4LWlzLWl0LWp1c3QtbWUtb3ItZG9lcy10aGlzLXNvdW5kLWxpa2UtYS1icmVha2luPgorICAgICAgLy8gaGFzIGRldGFpbHMgb24gd2h5LgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgInN0YXRpYyBjb25zdCBzaWduZWQgY2hhciBkZXNjcmlwdG9yW10gPSB7XG4iKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOwogCi0gICAgLy8gT25seSB3cml0ZSA0MCBieXRlcyBwZXIgbGluZS4KLSAgICBzdGF0aWMgY29uc3QgaW50IGtCeXRlc1BlckxpbmUgPSA0MDsKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZGF0YS5zaXplKCk7IGkgKz0ga0J5dGVzUGVyTGluZSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoIlxuICBcIiRkYXRhJFwiIiwKLSAgICAgICAgImRhdGEiLCBFc2NhcGVUcmlncmFwaHMoQ0VzY2FwZShmaWxlX2RhdGEuc3Vic3RyKGksIGtCeXRlc1BlckxpbmUpKSkpOworICAgICAgLy8gT25seSB3cml0ZSAyNSBieXRlcyBwZXIgbGluZS4KKyAgICAgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVyTGluZSA9IDI1OworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX2RhdGEuc2l6ZSgpOykgeworICAgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwga0J5dGVzUGVyTGluZSAmJiBpIDwgZmlsZV9kYXRhLnNpemUoKTsgKytpLCArK2opIHsKKyAgICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgICAgICIkY2hhciQsICIsCisgICAgICAgICAgICAgICAgImNoYXIiLCBTaW1wbGVJdG9hKGZpbGVfZGF0YVtpXSkpOworICAgICAgICAgIH0KKyAgICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICAgIlxuIik7CisgICAgICB9CisKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJ9O1xuIik7CisKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoZGVzY3JpcHRvciwgJHNpemUkKTtcbiIsCisgICAgICAgICAgInNpemUiLCBTaW1wbGVJdG9hKGZpbGVfZGF0YS5zaXplKCkpKTsKKworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OkludGVybmFsQWRkR2VuZXJhdGVkRmlsZSgiKTsKKworICAgICAgLy8gT25seSB3cml0ZSA0MCBieXRlcyBwZXIgbGluZS4KKyAgICAgIHN0YXRpYyBjb25zdCBpbnQga0J5dGVzUGVyTGluZSA9IDQwOworICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX2RhdGEuc2l6ZSgpOyBpICs9IGtCeXRlc1BlckxpbmUpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIlxuICBcIiRkYXRhJFwiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgImRhdGEiLAorICAgICAgICAgICAgICAgICAgICAgICBFc2NhcGVUcmlncmFwaHMoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBDRXNjYXBlKGZpbGVfZGF0YS5zdWJzdHIoaSwga0J5dGVzUGVyTGluZSkpKSk7CiAgICAgfQogICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiwgJHNpemUkKTtcbiIsCi0gICAgICAic2l6ZSIsIFNpbXBsZUl0b2EoZmlsZV9kYXRhLnNpemUoKSkpOworICAgICAgICAiLCAkc2l6ZSQpO1xuIiwKKyAgICAgICAgInNpemUiLCBTaW1wbGVJdG9hKGZpbGVfZGF0YS5zaXplKCkpKTsKKyAgICB9CiAKICAgICAvLyBDYWxsIE1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkRmlsZSgpLgogICAgIHByaW50ZXItPlByaW50KApAQCAtNTg4LDIzICs2ODgsMjMgQEAKICAgICAiXG4iKTsKIAogICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgZmlsZV8sIHByaW50ZXIsCi0gICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotICAgICIvLyBGb3JjZSBBZGREZXNjcmlwdG9ycygpIHRvIGJlIGNhbGxlZCBhdCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gdGltZS5cbiIKLSAgICAic3RydWN0IFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl8kZmlsZW5hbWUkIHtcbiIKLSAgICAiICBTdGF0aWNEZXNjcmlwdG9ySW5pdGlhbGl6ZXJfJGZpbGVuYW1lJCgpIHtcbiIKLSAgICAiICAgICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iCi0gICAgIiAgfVxuIgotICAgICJ9IHN0YXRpY19kZXNjcmlwdG9yX2luaXRpYWxpemVyXyRmaWxlbmFtZSRfO1xuIiwKLSAgICAvLyBXaXRob3V0LgotICAgICJHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKCRhZGRkZXNjcmlwdG9yc25hbWUkX29uY2VfKTtcbiIKLSAgICAidm9pZCAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpIHtcbiIKLSAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCYkYWRkZGVzY3JpcHRvcnNuYW1lJF9vbmNlXyxcbiIKLSAgICAiICAgICAgICAgICAgICAgICAmJGFkZGRlc2NyaXB0b3JzbmFtZSRfaW1wbCk7XG4iCi0gICAgIn1cbiIsCi0gICAgLy8gVmFycy4KLSAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpLAotICAgICJmaWxlbmFtZSIsIEZpbGVuYW1lSWRlbnRpZmllcihmaWxlXy0+bmFtZSgpKSk7CisgICAgICBmaWxlXywgb3B0aW9uc18sIHByaW50ZXIsCisgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgICAiLy8gRm9yY2UgQWRkRGVzY3JpcHRvcnMoKSB0byBiZSBjYWxsZWQgYXQgc3RhdGljIGluaXRpYWxpemF0aW9uIHRpbWUuXG4iCisgICAgICAic3RydWN0IFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl8kZmlsZW5hbWUkIHtcbiIKKyAgICAgICIgIFN0YXRpY0Rlc2NyaXB0b3JJbml0aWFsaXplcl8kZmlsZW5hbWUkKCkge1xuIgorICAgICAgIiAgICAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn0gc3RhdGljX2Rlc2NyaXB0b3JfaW5pdGlhbGl6ZXJfJGZpbGVuYW1lJF87XG4iLAorICAgICAgLy8gV2l0aG91dC4KKyAgICAgICJHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKCRhZGRkZXNjcmlwdG9yc25hbWUkX29uY2VfKTtcbiIKKyAgICAgICJ2b2lkICRhZGRkZXNjcmlwdG9yc25hbWUkKCkge1xuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgmJGFkZGRlc2NyaXB0b3JzbmFtZSRfb25jZV8sXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAmJGFkZGRlc2NyaXB0b3JzbmFtZSRfaW1wbCk7XG4iCisgICAgICAifVxuIiwKKyAgICAgIC8vIFZhcnMuCisgICAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGZpbGVfLT5uYW1lKCkpLCAiZmlsZW5hbWUiLAorICAgICAgRmlsZW5hbWVJZGVudGlmaWVyKGZpbGVfLT5uYW1lKCkpKTsKIH0KIAogdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZU5hbWVzcGFjZU9wZW5lcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKQEAgLTYyNSw2ICs3MjUsMzQzIEBACiAgIH0KIH0KIAordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgRm9yd2FyZERlY2xhcmF0aW9ucyBkZWNsczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBGaWxlR2VuZXJhdG9yIGRlcGVuZGVuY3koZmlsZV8tPmRlcGVuZGVuY3koaSksIG9wdGlvbnNfKTsKKyAgICBkZXBlbmRlbmN5LkZpbGxGb3J3YXJkRGVjbGFyYXRpb25zKCZkZWNscyk7CisgIH0KKyAgRmlsbEZvcndhcmREZWNsYXJhdGlvbnMoJmRlY2xzKTsKKyAgZGVjbHMuUHJpbnQocHJpbnRlcik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6RmlsbEZvcndhcmREZWNsYXJhdGlvbnMoRm9yd2FyZERlY2xhcmF0aW9ucyogZGVjbHMpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgRmlsZUdlbmVyYXRvciBkZXBlbmRlbmN5KGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKSwgb3B0aW9uc18pOworICAgIGRlcGVuZGVuY3kuRmlsbEZvcndhcmREZWNsYXJhdGlvbnMoZGVjbHMpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcGFja2FnZV9wYXJ0c18uc2l6ZSgpOyBpKyspIHsKKyAgICBkZWNscyA9IGRlY2xzLT5BZGRPckdldE5hbWVzcGFjZShwYWNrYWdlX3BhcnRzX1tpXSk7CisgIH0KKyAgLy8gR2VuZXJhdGUgZW51bSBkZWZpbml0aW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkZpbGxFbnVtRm9yd2FyZERlY2xhcmF0aW9ucygmZGVjbHMtPmVudW1zKCkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5GaWxsRm9yd2FyZERlY2xhcmF0aW9uKCZkZWNscy0+ZW51bXMoKSk7CisgIH0KKyAgLy8gR2VuZXJhdGUgZm9yd2FyZCBkZWNsYXJhdGlvbnMgb2YgY2xhc3Nlcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkZpbGxNZXNzYWdlRm9yd2FyZERlY2xhcmF0aW9ucygKKyAgICAgICAgJmRlY2xzLT5jbGFzc2VzKCkpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVUb3BIZWFkZXJHdWFyZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGVuYW1lX2lkZW50aWZpZXIpIHsKKyAgLy8gR2VuZXJhdGUgdG9wIG9mIGhlYWRlci4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKKyAgICAgICIvLyBzb3VyY2U6ICRmaWxlbmFtZSRcbiIKKyAgICAgICJcbiIKKyAgICAgICIjaWZuZGVmIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIKKyAgICAgICIjZGVmaW5lIFBST1RPQlVGXyRmaWxlbmFtZV9pZGVudGlmaWVyJF9fSU5DTFVERURcbiIKKyAgICAgICJcbiIKKyAgICAgICIjaW5jbHVkZSA8c3RyaW5nPlxuIiwKKyAgICAgICJmaWxlbmFtZSIsIGZpbGVfLT5uYW1lKCksICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7CisgIHByaW50ZXItPlByaW50KCJcbiIpOworfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlQm90dG9tSGVhZGVyR3VhcmQoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IHN0cmluZyYgZmlsZW5hbWVfaWRlbnRpZmllcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAiI2VuZGlmICAvLyBQUk9UT0JVRl8kZmlsZW5hbWVfaWRlbnRpZmllciRfX0lOQ0xVREVEXG4iLAorICAgICJmaWxlbmFtZV9pZGVudGlmaWVyIiwgZmlsZW5hbWVfaWRlbnRpZmllcik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD5cbiIKKyAgICAiXG4iKTsKKworICAvLyBWZXJpZnkgdGhlIHByb3RvYnVmIGxpYnJhcnkgaGVhZGVyIHZlcnNpb24gaXMgY29tcGF0aWJsZSB3aXRoIHRoZSBwcm90b2MKKyAgLy8gdmVyc2lvbiBiZWZvcmUgZ29pbmcgYW55IGZ1cnRoZXIuCisgIHByaW50ZXItPlByaW50KAorICAgICIjaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAkbWluX2hlYWRlcl92ZXJzaW9uJFxuIgorICAgICIjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpc1xuIgorICAgICIjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZSB1cGRhdGVcbiIKKyAgICAiI2Vycm9yIHlvdXIgaGVhZGVycy5cbiIKKyAgICAiI2VuZGlmXG4iCisgICAgIiNpZiAkcHJvdG9jX3ZlcnNpb24kIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTlxuIgorICAgICIjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYW4gb2xkZXIgdmVyc2lvbiBvZiBwcm90b2Mgd2hpY2ggaXNcbiIKKyAgICAiI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2VcbiIKKyAgICAiI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy5cbiIKKyAgICAiI2VuZGlmXG4iCisgICAgIlxuIiwKKyAgICAibWluX2hlYWRlcl92ZXJzaW9uIiwKKyAgICAgIFNpbXBsZUl0b2EocHJvdG9idWY6OmludGVybmFsOjprTWluSGVhZGVyVmVyc2lvbkZvclByb3RvYyksCisgICAgInByb3RvY192ZXJzaW9uIiwgU2ltcGxlSXRvYShHT09HTEVfUFJPVE9CVUZfVkVSU0lPTikpOworCisgIC8vIE9LLCBpdCdzIG5vdyBzYWZlIHRvICNpbmNsdWRlIG90aGVyIGZpbGVzLgorICBwcmludGVyLT5QcmludCgKKyAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYS5oPlxuIgorICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+XG4iCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPlxuIik7CisgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaD5cbiIpOworICB9CisgIGlmIChmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgPiAwKSB7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPlxuIik7CisgICAgfQorICB9CisgIHByaW50ZXItPlByaW50KAorICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+XG4iCisgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPlxuIik7CisgIGlmIChIYXNNYXBGaWVsZHMoZmlsZV8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcC5oPlxuIik7CisgICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaD5cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfbGl0ZS5oPlxuIik7CisgICAgfQorICB9CisKKyAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhmaWxlXykpIHsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oPlxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICIjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuaD5cbiIpOworICAgIH0KKyAgfQorCisgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIG9wdGlvbnNfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc2VydmljZS5oPlxuIik7CisgIH0KKworICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGZpbGVfLCBvcHRpb25zXykgJiYgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD5cbiIpOworICB9CisKKworICBpZiAoSXNBbnlNZXNzYWdlKGZpbGVfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYW55Lmg+XG4iKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlTWV0YWRhdGFQcmFnbWEoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbmZvX3BhdGgpIHsKKyAgaWYgKCFpbmZvX3BhdGguZW1wdHkoKSAmJiAhb3B0aW9uc18uYW5ub3RhdGlvbl9wcmFnbWFfbmFtZS5lbXB0eSgpICYmCisgICAgICAhb3B0aW9uc18uYW5ub3RhdGlvbl9ndWFyZF9uYW1lLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiNpZmRlZiAkZ3VhcmQkXG4iCisgICAgICAgICIjcHJhZ21hICRwcmFnbWEkIFwiJGluZm9fcGF0aCRcIlxuIgorICAgICAgICAiI2VuZGlmICAvLyAkZ3VhcmQkXG4iLAorICAgICAgICAiZ3VhcmQiLCBvcHRpb25zXy5hbm5vdGF0aW9uX2d1YXJkX25hbWUsICJwcmFnbWEiLAorICAgICAgICBvcHRpb25zXy5hbm5vdGF0aW9uX3ByYWdtYV9uYW1lLCAiaW5mb19wYXRoIiwgaW5mb19wYXRoKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlRGVwZW5kZW5jeUluY2x1ZGVzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHNldDxzdHJpbmc+IHB1YmxpY19pbXBvcnRfbmFtZXM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHB1YmxpY19pbXBvcnRfbmFtZXMuaW5zZXJ0KGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgYm9vbCB1c2Vfc3lzdGVtX2luY2x1ZGUgPSBJc1dlbGxLbm93bk1lc3NhZ2UoZmlsZV8tPmRlcGVuZGVuY3koaSkpOworICAgIGNvbnN0IHN0cmluZyYgbmFtZSA9IGZpbGVfLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCk7CisgICAgYm9vbCBwdWJsaWNfaW1wb3J0ID0gKHB1YmxpY19pbXBvcnRfbmFtZXMuY291bnQobmFtZSkgIT0gMCk7CisKKworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiNpbmNsdWRlICRsZWZ0JCRkZXBlbmRlbmN5JC5wYi5oJHJpZ2h0JCRpd3l1JFxuIiwKKyAgICAgICJkZXBlbmRlbmN5IiwgU3RyaXBQcm90byhuYW1lKSwKKyAgICAgICJpd3l1IiwgKHB1YmxpY19pbXBvcnQpID8gIiAgLy8gSVdZVSBwcmFnbWE6IGV4cG9ydCIgOiAiIiwKKyAgICAgICJsZWZ0IiwgdXNlX3N5c3RlbV9pbmNsdWRlID8gIjwiIDogIlwiIiwKKyAgICAgICJyaWdodCIsIHVzZV9zeXN0ZW1faW5jbHVkZSA/ICI+IiA6ICJcIiIpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVHbG9iYWxTdGF0ZUZ1bmN0aW9uRGVjbGFyYXRpb25zKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIEZvcndhcmQtZGVjbGFyZSB0aGUgQWRkRGVzY3JpcHRvcnMsIEFzc2lnbkRlc2NyaXB0b3JzLCBhbmQgU2h1dGRvd25GaWxlCisgIC8vIGZ1bmN0aW9ucywgc28gdGhhdCB3ZSBjYW4gZGVjbGFyZSB0aGVtIHRvIGJlIGZyaWVuZHMgb2YgZWFjaCBjbGFzcy4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgLS0gZG8gbm90IGNhbGwgdGhlc2UuXG4iCisgICAgInZvaWQgJGRsbGV4cG9ydF9kZWNsJCRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAorICAgICJhZGRkZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSksCisgICAgImRsbGV4cG9ydF9kZWNsIiwKKyAgICBvcHRpb25zXy5kbGxleHBvcnRfZGVjbC5lbXB0eSgpID8gIiIgOiBvcHRpb25zXy5kbGxleHBvcnRfZGVjbCArICIgIik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgLy8gTm90ZSB0aGF0IHdlIGRvbid0IHB1dCBkbGxleHBvcnRfZGVjbCBvbiB0aGVzZSBiZWNhdXNlIHRoZXkgYXJlIG9ubHkKKyAgICAvLyBjYWxsZWQgYnkgdGhlIC5wYi5jYyBmaWxlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQuCisgICAgInZvaWQgJGFzc2lnbmRlc2NyaXB0b3JzbmFtZSQoKTtcbiIKKyAgICAidm9pZCAkc2h1dGRvd25maWxlbmFtZSQoKTtcbiIKKyAgICAiXG4iLAorICAgICJhc3NpZ25kZXNjcmlwdG9yc25hbWUiLCBHbG9iYWxBc3NpZ25EZXNjcmlwdG9yc05hbWUoZmlsZV8tPm5hbWUoKSksCisgICAgInNodXRkb3duZmlsZW5hbWUiLCBHbG9iYWxTaHV0ZG93bkZpbGVOYW1lKGZpbGVfLT5uYW1lKCkpKTsKK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZU1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPiBjbGFzc2VzOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+RmlsbE1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKCZjbGFzc2VzKTsKKyAgfQorICBmb3IgKG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IgKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY2xhc3Nlcy5iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuZCA9IGNsYXNzZXMuZW5kKCk7CisgICAgICAgaXQgIT0gZW5kOyArK2l0KSB7CisgICAgcHJpbnRlci0+UHJpbnQoImNsYXNzICRjbGFzc25hbWUkO1xuIiwgImNsYXNzbmFtZSIsIGl0LT5maXJzdCk7CisgICAgcHJpbnRlci0+QW5ub3RhdGUoImNsYXNzbmFtZSIsIGl0LT5zZWNvbmQpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVNZXNzYWdlRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gR2VuZXJhdGUgY2xhc3MgZGVmaW5pdGlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOworICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgfQorICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uKHByaW50ZXIpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVFbnVtRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gR2VuZXJhdGUgZW51bSBkZWZpbml0aW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRW51bURlZmluaXRpb25zKHByaW50ZXIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlZmluaXRpb24ocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVNlcnZpY2VEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfLCBvcHRpb25zXykpIHsKKyAgICAvLyBHZW5lcmF0ZSBzZXJ2aWNlIGRlZmluaXRpb25zLgorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPnNlcnZpY2VfY291bnQoKTsgaSsrKSB7CisgICAgICBpZiAoaSA+IDApIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgICAgICB9CisgICAgICBzZXJ2aWNlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlY2xhcmF0aW9ucyhwcmludGVyKTsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICBwcmludGVyLT5QcmludChrVGhpY2tTZXBhcmF0b3IpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVFeHRlbnNpb25JZGVudGlmaWVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBEZWNsYXJlIGV4dGVuc2lvbiBpZGVudGlmaWVycy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgeworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZWNsYXJhdGlvbihwcmludGVyKTsKKyAgfQorfQorCit2b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlSW5saW5lRnVuY3Rpb25EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBBbiBhc2lkZSBhYm91dCBpbmxpbmUgZnVuY3Rpb25zIGluIC5wcm90by5oIG1vZGU6CisgIC8vCisgIC8vIFRoZSBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMgc3ltYm9sIGNvbnRyb2xzIGNvbmRpdGlvbmFsbHkKKyAgLy8gbW92aW5nIG11Y2ggb2YgdGhlIGlubGluZSBmdW5jdGlvbnMgdG8gdGhlIC5wYi5jYyBmaWxlLCB3aGljaCBjYW4gYmUgYQorICAvLyBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBiZW5lZml0IGZvciBjb21waWxhdGlvbiB0aW1lLCBhdCB0aGUgZXhwZW5zZQorICAvLyBvZiBub24taW5saW5lIGZ1bmN0aW9uIGNhbGxzLgorICAvLworICAvLyBIb3dldmVyLCBpbiAucHJvdG8uaCBtb2RlLCB0aGUgZGVmaW5pdGlvbiBvZiB0aGUgaW50ZXJuYWwgZGVwZW5kZW50CisgIC8vIGJhc2UgY2xhc3MgbXVzdCByZW1haW4gaW4gdGhlIGhlYWRlciwgYW5kIGNhbiBuZXZlciBiZSBvdXQtbGluZWQuIFRoZQorICAvLyBkZXBlbmRlbnQgYmFzZSBjbGFzcyBhbHNvIG5lZWRzIGFjY2VzcyB0byBoYXMtYml0IG1hbmlwdWF0aW9uCisgIC8vIGZ1bmN0aW9ucywgc28gdGhlIGhhcy1iaXQgZnVuY3Rpb25zIG11c3QgYmUgdW5jb25kaXRpb25hbGx5IGlubGluZWQgaW4KKyAgLy8gcHJvdG9faCBtb2RlLgorICAvLworICAvLyBUaGlzIGdpdmVzIHVzIHRocmVlIGZsYXZvcnMgb2YgZnVuY3Rpb25zOgorICAvLworICAvLyAgMS4gRnVuY3Rpb25zIG9uIHRoZSBtZXNzYWdlIG5vdCB1c2VkIGJ5IHRoZSBpbnRlcm5hbCBkZXBlbmRlbnQgYmFzZQorICAvLyAgICAgY2xhc3M6IGluIC5wcm90by5oIG1vZGUsIG9ubHkgc29tZSBmdW5jdGlvbnMgYXJlIGRlZmluZWQgb24gdGhlCisgIC8vICAgICBtZXNzYWdlIGNsYXNzOyBvdGhlcnMgYXJlIGRlZmluZWQgb24gdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzLgorICAvLyAgICAgVGhlc2UgYXJlIGd1YXJkZWQgYW5kIGNhbiBiZSBvdXQtbGluZWQuIFRoZXNlIGFyZSBnZW5lcmF0ZWQgYnkKKyAgLy8gICAgIEdlbmVyYXRlSW5saW5lTWV0aG9kcywgYW5kIGluY2x1ZGUgaGFzXyogYml0IGZ1bmN0aW9ucyBpbgorICAvLyAgICAgbm9uLXByb3RvX2ggbW9kZS4KKyAgLy8KKyAgLy8gIDIuIEZ1bmN0aW9ucyBvbiB0aGUgaW50ZXJuYWwgZGVwZW5kZW50IGJhc2UgY2xhc3M6IHRoZXNlIGZ1bmN0aW9ucworICAvLyAgICAgYXJlIGRlcGVuZGVudCBvbiBhIHRlbXBsYXRlIHBhcmFtZXRlciwgc28gdGhleSBhbHdheXMgbmVlZCB0bworICAvLyAgICAgcmVtYWluIGluIHRoZSBoZWFkZXIuCisgIC8vCisgIC8vICAzLiBGdW5jdGlvbnMgb24gdGhlIG1lc3NhZ2UgdGhhdCBhcmUgdXNlZCBieSB0aGUgZGVwZW5kZW50IGJhc2U6IHRoZQorICAvLyAgICAgZGVwZW5kZW50IGJhc2UgY2xhc3MgZG93biBjYXN0cyBpdHNlbGYgdG8gdGhlIG1lc3NhZ2UKKyAgLy8gICAgIGltcGxlbWVudGF0aW9uIGNsYXNzIHRvIGFjY2VzcyB0aGVzZSBmdW5jdGlvbnMgKHRoZSBoYXNfKiBiaXQKKyAgLy8gICAgIG1hbmlwdWxhdGlvbiBmdW5jdGlvbnMpLiBVbmxpa2UgIzEsIHRoZXNlIGZ1bmN0aW9ucyBtdXN0CisgIC8vICAgICB1bmNvbmRpdGlvbmFsbHkgcmVtYWluIGluIHRoZSBoZWFkZXIuIFRoZXNlIGFyZSBlbWl0dGVkIGJ5CisgIC8vICAgICBHZW5lcmF0ZURlcGVuZGVudElubGluZU1ldGhvZHMsIGV2ZW4gdGhvdWdoIHRoZXkgYXJlIG5vdCBhY3R1YWxseQorICAvLyAgICAgZGVwZW5kZW50LgorCisgIHByaW50ZXItPlByaW50KCIjaWYgIVBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSU1xuIik7CisgIC8vIEdlbmVyYXRlIGNsYXNzIGlubGluZSBtZXRob2RzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGkgPiAwKSB7CisgICAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlzX2lubGluZSA9ICovIHRydWUpOworICB9CisgIHByaW50ZXItPlByaW50KCIjZW5kaWYgIC8vICFQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlNcbiIpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoaSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICAgIH0KKyAgICAvLyBNZXRob2RzIG9mIHRoZSBkZXBlbmRlbnQgYmFzZSBjbGFzcyBtdXN0IGFsd2F5cyBiZSBpbmxpbmUgaW4gdGhlIGhlYWRlci4KKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZURlcGVuZGVudElubGluZU1ldGhvZHMocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVByb3RvMk5hbWVzcGFjZUVudW1TcGVjaWFsaXphdGlvbnMoCisgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gRW1pdCBHZXRFbnVtRGVzY3JpcHRvciBzcGVjaWFsaXphdGlvbnMgaW50byBnb29nbGU6OnByb3RvYnVmIG5hbWVzcGFjZToKKyAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhmaWxlXykpIHsKKyAgICAvLyBUaGUgU1dJRyBjb25kaXRpb25hbCBpcyB0byBhdm9pZCBhIG51bGwtcG9pbnRlciBkZXJlZmVyZW5jZQorICAgIC8vIChidWcgMTk4NDk2NCkgaW4gc3dpZy0xLjMuMjEgcmVzdWx0aW5nIGZyb20gdGhlIGZvbGxvd2luZyBzeW50YXg6CisgICAgLy8gICBuYW1lc3BhY2UgWCB7IHZvaWQgWTxaOjpXPigpOyB9CisgICAgLy8gd2hpY2ggYXBwZWFycyBpbiBHZXRFbnVtRGVzY3JpcHRvcigpIHNwZWNpYWxpemF0aW9ucy4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIlxuIgorICAgICAgICAiI2lmbmRlZiBTV0lHXG4iCisgICAgICAgICJuYW1lc3BhY2UgZ29vZ2xlIHtcbm5hbWVzcGFjZSBwcm90b2J1ZiB7XG4iCisgICAgICAgICJcbiIpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7CisgICAgfQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIGVudW1fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlR2V0RW51bURlc2NyaXB0b3JTcGVjaWFsaXphdGlvbnMocHJpbnRlcik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiXG4iCisgICAgICAgICJ9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWZcbn0gIC8vIG5hbWVzcGFjZSBnb29nbGVcbiIKKyAgICAgICAgIiNlbmRpZiAgLy8gU1dJR1xuIik7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIGNwcAogfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmgKaW5kZXggYjRlMDEyOC4uNWRjZjY5MiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWxlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDEwICszNSwxNSBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX0ZJTEVfSF9fCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9DUFBfRklMRV9IX18KIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpZm5kZWYgX1NIQVJFRF9QVFJfSAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+CisjZW5kaWYKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNjAsMTQgKzY1LDIzIEBACiBjbGFzcyBGaWxlR2VuZXJhdG9yIHsKICBwdWJsaWM6CiAgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgotICBleHBsaWNpdCBGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGxsZXhwb3J0X2RlY2wpOworICBGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKICAgfkZpbGVHZW5lcmF0b3IoKTsKIAotICB2b2lkIEdlbmVyYXRlSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgLy8gaW5mb19wYXRoLCBpZiBub24tZW1wdHksIHNob3VsZCBiZSB0aGUgcGF0aCAocmVsYXRpdmUgdG8gcHJpbnRlcidzIG91dHB1dCkKKyAgLy8gdG8gdGhlIG1ldGFkYXRhIGZpbGUgZGVzY3JpYmluZyB0aGlzIHByb3RvIGhlYWRlci4KKyAgdm9pZCBHZW5lcmF0ZVByb3RvSGVhZGVyKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBpbmZvX3BhdGgpOworICAvLyBpbmZvX3BhdGgsIGlmIG5vbi1lbXB0eSwgc2hvdWxkIGJlIHRoZSBwYXRoIChyZWxhdGl2ZSB0byBwcmludGVyJ3Mgb3V0cHV0KQorICAvLyB0byB0aGUgbWV0YWRhdGEgZmlsZSBkZXNjcmliaW5nIHRoaXMgUEIgaGVhZGVyLgorICB2b2lkIEdlbmVyYXRlUEJIZWFkZXIoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGluZm9fcGF0aCk7CiAgIHZvaWQgR2VuZXJhdGVTb3VyY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOwogCiAgcHJpdmF0ZToKKyAgLy8gSW50ZXJuYWwgdHlwZSB1c2VkIGJ5IEdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9ucyAoZGVmaW5lZCBpbiBmaWxlLmNjKS4KKyAgY2xhc3MgRm9yd2FyZERlY2xhcmF0aW9uczsKKwogICAvLyBHZW5lcmF0ZSB0aGUgQnVpbGREZXNjcmlwdG9ycygpIHByb2NlZHVyZSwgd2hpY2ggYnVpbGRzIGFsbCBkZXNjcmlwdG9ycwogICAvLyBmb3IgdHlwZXMgZGVmaW5lZCBpbiB0aGUgZmlsZS4KICAgdm9pZCBHZW5lcmF0ZUJ1aWxkRGVzY3JpcHRvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwpAQCAtNzUsMTggKzg5LDcwIEBACiAgIHZvaWQgR2VuZXJhdGVOYW1lc3BhY2VPcGVuZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKICAgdm9pZCBHZW5lcmF0ZU5hbWVzcGFjZUNsb3NlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwogCi0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlXzsKKyAgLy8gRm9yIG90aGVyIGltcG9ydHMsIGdlbmVyYXRlcyB0aGVpciBmb3J3YXJkLWRlY2xhcmF0aW9ucy4KKyAgdm9pZCBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwogCi0gIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+ID4gbWVzc2FnZV9nZW5lcmF0b3JzXzsKLSAgc2NvcGVkX2FycmF5PHNjb3BlZF9wdHI8RW51bUdlbmVyYXRvcj4gPiBlbnVtX2dlbmVyYXRvcnNfOwotICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxTZXJ2aWNlR2VuZXJhdG9yPiA+IHNlcnZpY2VfZ2VuZXJhdG9yc187Ci0gIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisgIC8vIEludGVybmFsIGhlbHBlciB1c2VkIGJ5IEdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9uczogZmlsbHMgJ2RlY2xzJworICAvLyB3aXRoIGFsbCBuZWNlc3NhcnkgZm9yd2FyZC1kZWNsYXJhdGlvbnMgZm9yIHRoaXMgZmlsZSBhbmQgaXRzCisgIC8vIHRyYW5zaWVudCBkZXBlZG5lbmNpZXMuCisgIHZvaWQgRmlsbEZvcndhcmREZWNsYXJhdGlvbnMoRm9yd2FyZERlY2xhcmF0aW9ucyogZGVjbHMpOworCisgIC8vIEdlbmVyYXRlcyB0b3Agb3IgYm90dG9tIG9mIGEgaGVhZGVyIGZpbGUuCisgIHZvaWQgR2VuZXJhdGVUb3BIZWFkZXJHdWFyZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWVfaWRlbnRpZmllcik7CisgIHZvaWQgR2VuZXJhdGVCb3R0b21IZWFkZXJHdWFyZChpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWVfaWRlbnRpZmllcik7CisKKyAgLy8gR2VuZXJhdGVzICNpbmNsdWRlIGRpcmVjdGl2ZXMuCisgIHZvaWQgR2VuZXJhdGVMaWJyYXJ5SW5jbHVkZXMoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlRGVwZW5kZW5jeUluY2x1ZGVzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZSBhIHByYWdtYSB0byBwdWxsIGluIG1ldGFkYXRhIHVzaW5nIHRoZSBnaXZlbiBpbmZvX3BhdGggKGlmCisgIC8vIG5vbi1lbXB0eSkuIGluZm9fcGF0aCBzaG91bGQgYmUgcmVsYXRpdmUgdG8gcHJpbnRlcidzIG91dHB1dC4KKyAgdm9pZCBHZW5lcmF0ZU1ldGFkYXRhUHJhZ21hKGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBzdHJpbmcmIGluZm9fcGF0aCk7CisKKyAgLy8gR2VuZXJhdGVzIGEgY291cGxlIG9mIGRpZmZlcmVudCBwaWVjZXMgYmVmb3JlIGRlZmluaXRpb25zOgorICB2b2lkIEdlbmVyYXRlR2xvYmFsU3RhdGVGdW5jdGlvbkRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGVzIHR5cGVzIGZvciBjbGFzc2VzLgorICB2b2lkIEdlbmVyYXRlTWVzc2FnZURlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZXMgZm9yd2FyZC1kZWNsYXJhdGlvbnMgZm9yIGp1c3QgdGhpcyBmaWxlJ3MgY2xhc3Nlcy4gVGhpcyBpcworICAvLyB1c2VkIGZvciAucGIuaCBoZWFkZXJzLCBidXQgbm90IGluIHByb3RvX2ggbW9kZS4KKyAgdm9pZCBHZW5lcmF0ZU1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBGaWxscyBpbiB0eXBlcyBmb3IgZm9yd2FyZCBkZWNsYXJhdGlvbnMuIFRoaXMgaXMgdXNlZCBpbnRlcm5hbGx5LCBhbmQKKyAgLy8gYWxzbyBieSBvdGhlciBGaWxlR2VuZXJhdG9ycyB0byBkZXRlcm1pbmUgaW1wb3J0cycgZGVjbGFyYXRpb25zLgorICB2b2lkIEZpbGxNZXNzYWdlRm9yd2FyZERlY2xhcmF0aW9ucyhGb3J3YXJkRGVjbGFyYXRpb25zKiBkZWNscyk7CisgIHZvaWQgRmlsbE1lc3NhZ2VEZWZpbml0aW9ucyhGb3J3YXJkRGVjbGFyYXRpb25zKiBkZWNscyk7CisKKyAgLy8gR2VuZXJhdGVzIGVudW0gZGVmaW5pdGlvbnMuCisgIHZvaWQgR2VuZXJhdGVFbnVtRm9yd2FyZERlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgRmlsbEVudW1Gb3J3YXJkRGVjbGFyYXRpb25zKEZvcndhcmREZWNsYXJhdGlvbnMqIGRlY2xzKTsKKyAgdm9pZCBHZW5lcmF0ZUVudW1EZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGVzIGdlbmVyaWMgc2VydmljZSBkZWZpbml0aW9ucy4KKyAgdm9pZCBHZW5lcmF0ZVNlcnZpY2VEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgLy8gR2VuZXJhdGVzIGV4dGVuc2lvbiBpZGVudGlmaWVycy4KKyAgdm9pZCBHZW5lcmF0ZUV4dGVuc2lvbklkZW50aWZpZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICAvLyBHZW5lcmF0ZXMgaW5saW5lIGZ1bmN0aW9uIGRlZmludGlvbnMuCisgIHZvaWQgR2VuZXJhdGVJbmxpbmVGdW5jdGlvbkRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKworICB2b2lkIEdlbmVyYXRlUHJvdG8yTmFtZXNwYWNlRW51bVNwZWNpYWxpemF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGVfOworICBjb25zdCBPcHRpb25zIG9wdGlvbnNfOworCisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+ID4gbWVzc2FnZV9nZW5lcmF0b3JzXzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RW51bUdlbmVyYXRvcj4gPiBlbnVtX2dlbmVyYXRvcnNfOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxTZXJ2aWNlR2VuZXJhdG9yPiA+IHNlcnZpY2VfZ2VuZXJhdG9yc187CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CiAKICAgLy8gRS5nLiBpZiB0aGUgcGFja2FnZSBpcyBmb28uYmFyLCBwYWNrYWdlX3BhcnRzXyBpcyB7ImZvbyIsICJiYXIifS4KICAgdmVjdG9yPHN0cmluZz4gcGFja2FnZV9wYXJ0c187CiAKLSAgc3RyaW5nIGRsbGV4cG9ydF9kZWNsXzsKLQogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmlsZUdlbmVyYXRvcik7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjCmluZGV4IGJiODRlMmEuLjMxZDE4OWMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNSw2ICszNSwxMCBAQAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oPgogCiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpZm5kZWYgX1NIQVJFRF9QVFJfSAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+CisjZW5kaWYKICNpbmNsdWRlIDx1dGlsaXR5PgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmlsZS5oPgpAQCAtNzgsMTEgKzgyLDIyIEBACiAgIC8vICAgfQogICAvLyBGT09fRVhQT1JUIGlzIGEgbWFjcm8gd2hpY2ggc2hvdWxkIGV4cGFuZCB0byBfX2RlY2xzcGVjKGRsbGV4cG9ydCkgb3IKICAgLy8gX19kZWNsc3BlYyhkbGxpbXBvcnQpIGRlcGVuZGluZyBvbiB3aGF0IGlzIGJlaW5nIGNvbXBpbGVkLgotICBzdHJpbmcgZGxsZXhwb3J0X2RlY2w7CisgIC8vCisgIE9wdGlvbnMgZmlsZV9vcHRpb25zOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3B0aW9ucy5zaXplKCk7IGkrKykgewogICAgIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJkbGxleHBvcnRfZGVjbCIpIHsKLSAgICAgIGRsbGV4cG9ydF9kZWNsID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgICBmaWxlX29wdGlvbnMuZGxsZXhwb3J0X2RlY2wgPSBvcHRpb25zW2ldLnNlY29uZDsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gInNhZmVfYm91bmRhcnlfY2hlY2siKSB7CisgICAgICBmaWxlX29wdGlvbnMuc2FmZV9ib3VuZGFyeV9jaGVjayA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJhbm5vdGF0ZV9oZWFkZXJzIikgeworICAgICAgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMgPSB0cnVlOworICAgIH0gZWxzZSBpZiAob3B0aW9uc1tpXS5maXJzdCA9PSAiYW5ub3RhdGlvbl9wcmFnbWFfbmFtZSIpIHsKKyAgICAgIGZpbGVfb3B0aW9ucy5hbm5vdGF0aW9uX3ByYWdtYV9uYW1lID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJhbm5vdGF0aW9uX2d1YXJkX25hbWUiKSB7CisgICAgICBmaWxlX29wdGlvbnMuYW5ub3RhdGlvbl9ndWFyZF9uYW1lID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJsaXRlIikgeworICAgICAgZmlsZV9vcHRpb25zLmVuZm9yY2VfbGl0ZSA9IHRydWU7CiAgICAgfSBlbHNlIHsKICAgICAgICplcnJvciA9ICJVbmtub3duIGdlbmVyYXRvciBvcHRpb246ICIgKyBvcHRpb25zW2ldLmZpcnN0OwogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtOTMsMjIgKzEwOCw1MyBAQAogCiAKICAgc3RyaW5nIGJhc2VuYW1lID0gU3RyaXBQcm90byhmaWxlLT5uYW1lKCkpOworCisgIEZpbGVHZW5lcmF0b3IgZmlsZV9nZW5lcmF0b3IoZmlsZSwgZmlsZV9vcHRpb25zKTsKKworICAvLyBHZW5lcmF0ZSBoZWFkZXIocykuCisgIGlmIChmaWxlX29wdGlvbnMucHJvdG9faCkgeworICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGJhc2VuYW1lICsgIi5wcm90by5oIikpOworICAgIEdlbmVyYXRlZENvZGVJbmZvIGFubm90YXRpb25zOworICAgIGlvOjpBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGFubm90YXRpb25fY29sbGVjdG9yKAorICAgICAgICAmYW5ub3RhdGlvbnMpOworICAgIHN0cmluZyBpbmZvX3BhdGggPSBiYXNlbmFtZSArICIucHJvdG8uaC5tZXRhIjsKKyAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnLCBmaWxlX29wdGlvbnMuYW5ub3RhdGVfaGVhZGVycworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/ICZhbm5vdGF0aW9uX2NvbGxlY3RvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwpOworICAgIGZpbGVfZ2VuZXJhdG9yLkdlbmVyYXRlUHJvdG9IZWFkZXIoCisgICAgICAgICZwcmludGVyLCBmaWxlX29wdGlvbnMuYW5ub3RhdGVfaGVhZGVycyA/IGluZm9fcGF0aCA6ICIiKTsKKyAgICBpZiAoZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMpIHsKKyAgICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBpbmZvX291dHB1dCgKKyAgICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihpbmZvX3BhdGgpKTsKKyAgICAgIGFubm90YXRpb25zLlNlcmlhbGl6ZVRvWmVyb0NvcHlTdHJlYW0oaW5mb19vdXRwdXQuZ2V0KCkpOworICAgIH0KKyAgfQorCiAgIGJhc2VuYW1lLmFwcGVuZCgiLnBiIik7Ci0KLSAgRmlsZUdlbmVyYXRvciBmaWxlX2dlbmVyYXRvcihmaWxlLCBkbGxleHBvcnRfZGVjbCk7Ci0KLSAgLy8gR2VuZXJhdGUgaGVhZGVyLgogICB7Ci0gICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKLSAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGJhc2VuYW1lICsgIi5oIikpOwotICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOwotICAgIGZpbGVfZ2VuZXJhdG9yLkdlbmVyYXRlSGVhZGVyKCZwcmludGVyKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihiYXNlbmFtZSArICIuaCIpKTsKKyAgICBHZW5lcmF0ZWRDb2RlSW5mbyBhbm5vdGF0aW9uczsKKyAgICBpbzo6QW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBhbm5vdGF0aW9uX2NvbGxlY3RvcigKKyAgICAgICAgJmFubm90YXRpb25zKTsKKyAgICBzdHJpbmcgaW5mb19wYXRoID0gYmFzZW5hbWUgKyAiLmgubWV0YSI7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJywgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmYW5ub3RhdGlvbl9jb2xsZWN0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMKTsKKyAgICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZVBCSGVhZGVyKAorICAgICAgICAmcHJpbnRlciwgZmlsZV9vcHRpb25zLmFubm90YXRlX2hlYWRlcnMgPyBpbmZvX3BhdGggOiAiIik7CisgICAgaWYgKGZpbGVfb3B0aW9ucy5hbm5vdGF0ZV9oZWFkZXJzKSB7CisgICAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gaW5mb19vdXRwdXQoCisgICAgICAgICAgZ2VuZXJhdG9yX2NvbnRleHQtPk9wZW4oaW5mb19wYXRoKSk7CisgICAgICBhbm5vdGF0aW9ucy5TZXJpYWxpemVUb1plcm9Db3B5U3RyZWFtKGluZm9fb3V0cHV0LmdldCgpKTsKKyAgICB9CiAgIH0KIAogICAvLyBHZW5lcmF0ZSBjYyBmaWxlLgogICB7Ci0gICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKLSAgICAgIGdlbmVyYXRvcl9jb250ZXh0LT5PcGVuKGJhc2VuYW1lICsgIi5jYyIpKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgICAgICBnZW5lcmF0b3JfY29udGV4dC0+T3BlbihiYXNlbmFtZSArICIuY2MiKSk7CiAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CiAgICAgZmlsZV9nZW5lcmF0b3IuR2VuZXJhdGVTb3VyY2UoJnByaW50ZXIpOwogICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaAppbmRleCBhOTBlODRkLi4zZDUxN2NmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2dlbmVyYXRvci5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5jYwppbmRleCBjNGI4NjhjLi4yYWQ0ZDM2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zOSw2ICszOSw3IEBACiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CkBAIC01MSw2ICs1MiwxMCBAQAogCiBuYW1lc3BhY2UgewogCitzdGF0aWMgY29uc3QgY2hhciBrQW55TWVzc2FnZU5hbWVbXSA9ICJBbnkiOworc3RhdGljIGNvbnN0IGNoYXIga0FueVByb3RvRmlsZVtdID0gImdvb2dsZS9wcm90b2J1Zi9hbnkucHJvdG8iOworc3RhdGljIGNvbnN0IGNoYXIga0dvb2dsZVByb3RvYnVmUHJlZml4W10gPSAiZ29vZ2xlL3Byb3RvYnVmLyI7CisKIHN0cmluZyBEb3RzVG9VbmRlcnNjb3Jlcyhjb25zdCBzdHJpbmcmIG5hbWUpIHsKICAgcmV0dXJuIFN0cmluZ1JlcGxhY2UobmFtZSwgIi4iLCAiXyIsIHRydWUpOwogfQpAQCAtNjAsMTYgKzY1LDE4IEBACiB9CiAKIGNvbnN0IGNoYXIqIGNvbnN0IGtLZXl3b3JkTGlzdFtdID0gewotICAiYW5kIiwgImFuZF9lcSIsICJhc20iLCAiYXV0byIsICJiaXRhbmQiLCAiYml0b3IiLCAiYm9vbCIsICJicmVhayIsICJjYXNlIiwKLSAgImNhdGNoIiwgImNoYXIiLCAiY2xhc3MiLCAiY29tcGwiLCAiY29uc3QiLCAiY29uc3RfY2FzdCIsICJjb250aW51ZSIsCi0gICJkZWZhdWx0IiwgImRlbGV0ZSIsICJkbyIsICJkb3VibGUiLCAiZHluYW1pY19jYXN0IiwgImVsc2UiLCAiZW51bSIsCi0gICJleHBsaWNpdCIsICJleHRlcm4iLCAiZmFsc2UiLCAiZmxvYXQiLCAiZm9yIiwgImZyaWVuZCIsICJnb3RvIiwgImlmIiwKLSAgImlubGluZSIsICJpbnQiLCAibG9uZyIsICJtdXRhYmxlIiwgIm5hbWVzcGFjZSIsICJuZXciLCAibm90IiwgIm5vdF9lcSIsCisgICJhbGlnbmFzIiwgImFsaWdub2YiLCAiYW5kIiwgImFuZF9lcSIsICJhc20iLCAiYXV0byIsICJiaXRhbmQiLCAiYml0b3IiLAorICAiYm9vbCIsICJicmVhayIsICJjYXNlIiwgImNhdGNoIiwgImNoYXIiLCAiY2xhc3MiLCAiY29tcGwiLCAiY29uc3QiLAorICAiY29uc3RleHByIiwgImNvbnN0X2Nhc3QiLCAiY29udGludWUiLCAiZGVjbHR5cGUiLCAiZGVmYXVsdCIsICJkZWxldGUiLCAiZG8iLAorICAiZG91YmxlIiwgImR5bmFtaWNfY2FzdCIsICJlbHNlIiwgImVudW0iLCAiZXhwbGljaXQiLCAiZXhwb3J0IiwgImV4dGVybiIsCisgICJmYWxzZSIsICJmbG9hdCIsICJmb3IiLCAiZnJpZW5kIiwgImdvdG8iLCAiaWYiLCAiaW5saW5lIiwgImludCIsICJsb25nIiwKKyAgIm11dGFibGUiLCAibmFtZXNwYWNlIiwgIm5ldyIsICJub2V4Y2VwdCIsICJub3QiLCAibm90X2VxIiwgIk5VTEwiLAogICAib3BlcmF0b3IiLCAib3IiLCAib3JfZXEiLCAicHJpdmF0ZSIsICJwcm90ZWN0ZWQiLCAicHVibGljIiwgInJlZ2lzdGVyIiwKICAgInJlaW50ZXJwcmV0X2Nhc3QiLCAicmV0dXJuIiwgInNob3J0IiwgInNpZ25lZCIsICJzaXplb2YiLCAic3RhdGljIiwKLSAgInN0YXRpY19jYXN0IiwgInN0cnVjdCIsICJzd2l0Y2giLCAidGVtcGxhdGUiLCAidGhpcyIsICJ0aHJvdyIsICJ0cnVlIiwgInRyeSIsCi0gICJ0eXBlZGVmIiwgInR5cGVpZCIsICJ0eXBlbmFtZSIsICJ1bmlvbiIsICJ1bnNpZ25lZCIsICJ1c2luZyIsICJ2aXJ0dWFsIiwKLSAgInZvaWQiLCAidm9sYXRpbGUiLCAid2NoYXJfdCIsICJ3aGlsZSIsICJ4b3IiLCAieG9yX2VxIgorICAic3RhdGljX2Fzc2VydCIsICJzdGF0aWNfY2FzdCIsICJzdHJ1Y3QiLCAic3dpdGNoIiwgInRlbXBsYXRlIiwgInRoaXMiLAorICAidGhyZWFkX2xvY2FsIiwgInRocm93IiwgInRydWUiLCAidHJ5IiwgInR5cGVkZWYiLCAidHlwZWlkIiwgInR5cGVuYW1lIiwKKyAgInVuaW9uIiwgInVuc2lnbmVkIiwgInVzaW5nIiwgInZpcnR1YWwiLCAidm9pZCIsICJ2b2xhdGlsZSIsICJ3Y2hhcl90IiwKKyAgIndoaWxlIiwgInhvciIsICJ4b3JfZXEiCiB9OwogCiBoYXNoX3NldDxzdHJpbmc+IE1ha2VLZXl3b3Jkc01hcCgpIHsKQEAgLTgyLDYgKzg5LDIyIEBACiAKIGhhc2hfc2V0PHN0cmluZz4ga0tleXdvcmRzID0gTWFrZUtleXdvcmRzTWFwKCk7CiAKKy8vIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgZGVzY3JpcHRvciBoYXMgYW4gZXh0ZW5zaW9uLiBUaGlzIGluY2x1ZGVzIGl0cworLy8gbmVzdGVkIHR5cGVzLgorYm9vbCBIYXNFeHRlbnNpb24oY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBpZiAoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCkgPiAwKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzRXh0ZW5zaW9uKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIHN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgY2FwX25leHRfbGV0dGVyKSB7CiAgIHN0cmluZyByZXN1bHQ7CiAgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCkBAIC0xMDcsMjIgKzEzMCw2IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLS8vIFJldHVybnMgd2hldGhlciB0aGUgcHJvdmlkZWQgZGVzY3JpcHRvciBoYXMgYW4gZXh0ZW5zaW9uLiBUaGlzIGluY2x1ZGVzIGl0cwotLy8gbmVzdGVkIHR5cGVzLgotYm9vbCBIYXNFeHRlbnNpb24oY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICBpZiAoZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCkgPiAwKSB7Ci0gICAgcmV0dXJuIHRydWU7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKLSAgICBpZiAoSGFzRXh0ZW5zaW9uKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpKSkgewotICAgICAgcmV0dXJuIHRydWU7Ci0gICAgfQotICB9Ci0gIHJldHVybiBmYWxzZTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlCi0KIGNvbnN0IGNoYXIga1RoaWNrU2VwYXJhdG9yW10gPQogICAiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKIGNvbnN0IGNoYXIga1RoaW5TZXBhcmF0b3JbXSA9CkBAIC0xNDgsNyArMTU1LDcgQEAKIHN0cmluZyBDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpIHsKICAgaWYgKGVudW1fZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgewogICAgIGlmIChxdWFsaWZpZWQpIHsKLSAgICAgIHJldHVybiBEb3RzVG9Db2xvbnMoZW51bV9kZXNjcmlwdG9yLT5mdWxsX25hbWUoKSk7CisgICAgICByZXR1cm4gIjo6IiArIERvdHNUb0NvbG9ucyhlbnVtX2Rlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpKTsKICAgICB9IGVsc2UgewogICAgICAgcmV0dXJuIGVudW1fZGVzY3JpcHRvci0+bmFtZSgpOwogICAgIH0KQEAgLTE2MSw5ICsxNjgsMjIgQEAKIH0KIAogCi1zdHJpbmcgU3VwZXJDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+ZmlsZSgpKSA/Ci0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIiA6ICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VMaXRlIjsKK3N0cmluZyBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gQ2xhc3NOYW1lKGRlc2NyaXB0b3IsIGZhbHNlKSArICJfSW50ZXJuYWxCYXNlIjsKK30KKworc3RyaW5nIFN1cGVyQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmZpbGUoKSwgb3B0aW9ucykKKyAgICAgICAgICAgICA/ICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UiCisgICAgICAgICAgICAgOiAiOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZSI7Cit9CisKK3N0cmluZyBEZXBlbmRlbnRCYXNlRG93bkNhc3QoKSB7CisgIHJldHVybiAicmVpbnRlcnByZXRfY2FzdDxUKj4odGhpcyktPiI7Cit9CisKK3N0cmluZyBEZXBlbmRlbnRCYXNlQ29uc3REb3duQ2FzdCgpIHsKKyAgcmV0dXJuICJyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPih0aGlzKS0+IjsKIH0KIAogc3RyaW5nIEZpZWxkTmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CkBAIC0xNzUsNiArMTk1LDE0IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3N0cmluZyBFbnVtVmFsdWVOYW1lKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUpIHsKKyAgc3RyaW5nIHJlc3VsdCA9IGVudW1fdmFsdWUtPm5hbWUoKTsKKyAgaWYgKGtLZXl3b3Jkcy5jb3VudChyZXN1bHQpID4gMCkgeworICAgIHJlc3VsdC5hcHBlbmQoIl8iKTsKKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCiBzdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewogICBzdHJpbmcgZmllbGRfbmFtZSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSk7CiAgIHN0cmluZyByZXN1bHQgPSAiayIgKyBmaWVsZF9uYW1lICsgIkZpZWxkTnVtYmVyIjsKQEAgLTE5MSw2ICsyMTksNjAgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorYm9vbCBJc0ZpZWxkRGVwZW5kZW50KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgIT0gTlVMTCAmJgorICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgeworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBtYXBfZGVzY3JpcHRvciA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcF9kZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGlmIChJc0ZpZWxkRGVwZW5kZW50KG1hcF9kZXNjcmlwdG9yLT5maWVsZChpKSkpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgIT0gTlVMTCkgeworICAgIC8vIE9uZW9mIGZpZWxkcyB3aWxsIGFsd2F5cyBiZSBkZXBlbmRlbnQuCisgICAgLy8KKyAgICAvLyBUaGlzIGlzIGEgdW5pcXVlIGNhc2UgZm9yIGZpZWxkIGNvZGVnZW4uIEZpZWxkIGdlbmVyYXRvcnMgYXJlCisgICAgLy8gcmVzcG9uc2libGUgZm9yIGdlbmVyYXRpbmcgYWxsIHRoZSBmaWVsZC1zcGVjaWZpYyBhY2Nlc3NvcgorICAgIC8vIGZ1bmN0aW9ucywgZXhjZXB0IGZvciB0aGUgY2xlYXJfKigpIGZ1bmN0aW9uOyBpbnN0ZWFkLCBmaWVsZAorICAgIC8vIGdlbmVyYXRvcnMgcHJvZHVjZSBpbmxpbmUgY2xlYXJpbmcgY29kZS4KKyAgICAvLworICAgIC8vIEZvciBub24tb25lb2YgZmllbGRzLCB0aGUgTWVzc2FnZSBjbGFzcyB1c2VzIHRoZSBpbmxpbmUgY2xlYXJpbmcKKyAgICAvLyBjb2RlIHRvIGRlZmluZSB0aGUgZmllbGQncyBjbGVhcl8qKCkgZnVuY3Rpb24sIGFzIHdlbGwgYXMgaW4gdGhlCisgICAgLy8gZGVzdHJ1Y3Rvci4gRm9yIG9uZW9mIGZpZWxkcywgdGhlIE1lc3NhZ2UgY2xhc3MgZ2VuZXJhdGVzIGEgbXVjaAorICAgIC8vIG1vcmUgY29tcGxpY2F0ZWQgY2xlYXJfKigpIGZ1bmN0aW9uLCB3aGljaCBjbGVhcnMgb25seSB0aGUgb25lb2YKKyAgICAvLyBtZW1iZXIgdGhhdCBpcyBzZXQsIGluIGFkZGl0aW9uIHRvIGNsZWFyaW5nIG1ldGhvZHMgZm9yIGVhY2ggb2YgdGhlCisgICAgLy8gb25lb2YgbWVtYmVycyBpbmRpdmlkdWFsbHkuCisgICAgLy8KKyAgICAvLyBTaW5jZSBvbmVvZnMgZG8gbm90IGhhdmUgdGhlaXIgb3duIGdlbmVyYXRvciBjbGFzcywgdGhlIE1lc3NhZ2UgY29kZQorICAgIC8vIGdlbmVyYXRpb24gbG9naWMgd291bGQgYmUgc2lnbmlmaWNhbnRseSBjb21wbGljYXRlZCBpbiBvcmRlciB0bworICAgIC8vIHNwbGl0IGRlcGVuZGVudCBhbmQgbm9uLWRlcGVuZGVudCBtYW5pcHVsYXRpb24gbG9naWMgYmFzZWQgb24KKyAgICAvLyB3aGV0aGVyIHRoZSBvbmVvZiB0cnVseSBuZWVkcyB0byBiZSBkZXBlbmRlbnQ7IHNvLCBmb3Igb25lb2YgZmllbGRzLAorICAgIC8vIHdlIGp1c3QgYXNzdW1lIGl0IChhbmQgaXRzIGNvbnN0aXR1ZW50cykgc2hvdWxkIGJlIG1hbmlwdWxhdGVkIGJ5IGEKKyAgICAvLyBkZXBlbmRlbnQgYmFzZSBjbGFzcyBmdW5jdGlvbi4KKyAgICAvLworICAgIC8vIFRoaXMgaXMgbGVzcyBwcmVjaXNlIHRoYW4gaG93IGRlcGVuZGVudCBtZXNzYWdlLXR5cGVkIGZpZWxkcyBhcmUKKyAgICAvLyBoYW5kbGVkLCBidXQgdGhlIGNvc3QgaXMgbGltaXRlZCB0byBvbmx5IHRoZSBnZW5lcmF0ZWQgY29kZSBmb3IgdGhlCisgICAgLy8gb25lb2YgZmllbGQsIHdoaWNoIHNlZW1zIGxpa2UgYW4gYWNjZXB0YWJsZSB0cmFkZW9mZi4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICBpZiAoZmllbGQtPmZpbGUoKSA9PSBmaWVsZC0+bWVzc2FnZV90eXBlKCktPmZpbGUoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKworc3RyaW5nIERlcGVuZGVudFR5cGVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuICJJbnRlcm5hbEJhc2VfIiArIGZpZWxkLT5uYW1lKCkgKyAiX1QiOworfQorCiBzdHJpbmcgRmllbGRNZXNzYWdlVHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewogICAvLyBOb3RlOiAgVGhlIEdvb2dsZS1pbnRlcm5hbCB2ZXJzaW9uIG9mIFByb3RvY29sIEJ1ZmZlcnMgdXNlcyB0aGlzIGZ1bmN0aW9uCiAgIC8vICAgYXMgYSBob29rIHBvaW50IGZvciBoYWNrcyB0byBzdXBwb3J0IGxlZ2FjeSBjb2RlLgpAQCAtMjU2LDE0ICszMzgsMzUgQEAKICAgcmV0dXJuICIiOwogfQogCitzdHJpbmcgSW50MzJUb1N0cmluZyhpbnQgbnVtYmVyKSB7CisgIC8vIGdjYyByZWplY3RzIHRoZSBkZWNpbWFsIGZvcm0gb2Yga2ludDMybWluLgorICBpZiAobnVtYmVyID09IGtpbnQzMm1pbikgeworICAgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChraW50MzJtaW4gPT0gKH4weDdmZmZmZmZmKSwga2ludDMybWluX3ZhbHVlX2Vycm9yKTsKKyAgICByZXR1cm4gIih+MHg3ZmZmZmZmZikiOworICB9IGVsc2UgeworICAgIHJldHVybiBTaW1wbGVJdG9hKG51bWJlcik7CisgIH0KK30KKworc3RyaW5nIEludDY0VG9TdHJpbmcoaW50NjQgbnVtYmVyKSB7CisgIC8vIGdjYyByZWplY3RzIHRoZSBkZWNpbWFsIGZvcm0gb2Yga2ludDY0bWluCisgIGlmIChudW1iZXIgPT0ga2ludDY0bWluKSB7CisgICAgLy8gTWFrZSBzdXJlIHdlIGFyZSBpbiBhIDIncyBjb21wbGVtZW50IHN5c3RlbS4KKyAgICBHT09HTEVfQ09NUElMRV9BU1NFUlQoa2ludDY0bWluID09IEdPT0dMRV9MT05HTE9ORyh+MHg3ZmZmZmZmZmZmZmZmZmZmKSwKKyAgICAgICAgICAgICAgICAgICBraW50NjRtaW5fdmFsdWVfZXJyb3IpOworICAgIHJldHVybiAiR09PR0xFX0xPTkdMT05HKH4weDdmZmZmZmZmZmZmZmZmZmYpIjsKKyAgfQorICByZXR1cm4gIkdPT0dMRV9MT05HTE9ORygiICsgU2ltcGxlSXRvYShudW1iZXIpICsgIikiOworfQorCiBzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewogICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyOgotICAgICAgcmV0dXJuIFNpbXBsZUl0b2EoZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50MzIoKSk7CisgICAgICByZXR1cm4gSW50MzJUb1N0cmluZyhmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQzMigpKTsKICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9VSU5UMzI6CiAgICAgICByZXR1cm4gU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50MzIoKSkgKyAidSI7CiAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6Ci0gICAgICByZXR1cm4gIkdPT0dMRV9MT05HTE9ORygiICsgU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9pbnQ2NCgpKSArICIpIjsKKyAgICAgIHJldHVybiBJbnQ2NFRvU3RyaW5nKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkpOwogICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKICAgICAgIHJldHVybiAiR09PR0xFX1VMT05HTE9ORygiICsgU2ltcGxlSXRvYShmaWVsZC0+ZGVmYXVsdF92YWx1ZV91aW50NjQoKSkrICIpIjsKICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6IHsKQEAgLTMwNiwxMCArNDA5LDExIEBACiAgICAgICByZXR1cm4gc3RyaW5nczo6U3Vic3RpdHV0ZSgKICAgICAgICAgICAic3RhdGljX2Nhc3Q8ICQwID4oJDEpIiwKICAgICAgICAgICBDbGFzc05hbWUoZmllbGQtPmVudW1fdHlwZSgpLCB0cnVlKSwKLSAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpKTsKKyAgICAgICAgICBJbnQzMlRvU3RyaW5nKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpKTsKICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICByZXR1cm4gIlwiIiArIEVzY2FwZVRyaWdyYXBocyhDRXNjYXBlKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSkgKwotICAgICAgICAgICAgICJcIiI7CisgICAgICByZXR1cm4gIlwiIiArIEVzY2FwZVRyaWdyYXBocygKKyAgICAgICAgQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpICsKKyAgICAgICAgIlwiIjsKICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgogICAgICAgcmV0dXJuIEZpZWxkTWVzc2FnZVR5cGVOYW1lKGZpZWxkKSArICI6OmRlZmF1bHRfaW5zdGFuY2UoKSI7CiAgIH0KQEAgLTMyOSw5ICs0MzMsNyBAQAogICAgIH0gZWxzZSB7CiAgICAgICAvLyBOb3QgYWxwaGFudW1lcmljLiAgVG8gYXZvaWQgYW55IHBvc3NpYmlsaXR5IG9mIG5hbWUgY29uZmxpY3RzIHdlCiAgICAgICAvLyB1c2UgdGhlIGhleCBjb2RlIGZvciB0aGUgY2hhcmFjdGVyLgotICAgICAgcmVzdWx0LnB1c2hfYmFjaygnXycpOwotICAgICAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOwotICAgICAgcmVzdWx0LmFwcGVuZChGYXN0SGV4VG9CdWZmZXIoc3RhdGljX2Nhc3Q8dWludDg+KGZpbGVuYW1lW2ldKSwgYnVmZmVyKSk7CisgICAgICBTdHJBcHBlbmQoJnJlc3VsdCwgIl8iLCBzdHJpbmdzOjpIZXgoc3RhdGljX2Nhc3Q8dWludDg+KGZpbGVuYW1lW2ldKSkpOwogICAgIH0KICAgfQogICByZXR1cm4gcmVzdWx0OwpAQCAtMzUyLDEzICs0NTQsNDIgQEAKICAgcmV0dXJuICJwcm90b2J1Zl9TaHV0ZG93bkZpbGVfIiArIEZpbGVuYW1lSWRlbnRpZmllcihmaWxlbmFtZSk7CiB9CiAKKy8vIFJldHVybiB0aGUgcXVhbGlmaWVkIEMrKyBuYW1lIGZvciBhIGZpbGUgbGV2ZWwgc3ltYm9sLgorc3RyaW5nIFF1YWxpZmllZEZpbGVMZXZlbFN5bWJvbChjb25zdCBzdHJpbmcmIHBhY2thZ2UsIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBpZiAocGFja2FnZS5lbXB0eSgpKSB7CisgICAgcmV0dXJuIFN0ckNhdCgiOjoiLCBuYW1lKTsKKyAgfQorICByZXR1cm4gU3RyQ2F0KCI6OiIsIERvdHNUb0NvbG9ucyhwYWNrYWdlKSwgIjo6IiwgbmFtZSk7Cit9CisKIC8vIEVzY2FwZSBDKysgdHJpZ3JhcGhzIGJ5IGVzY2FwaW5nIHF1ZXN0aW9uIG1hcmtzIHRvIFw/CiBzdHJpbmcgRXNjYXBlVHJpZ3JhcGhzKGNvbnN0IHN0cmluZyYgdG9fZXNjYXBlKSB7CiAgIHJldHVybiBTdHJpbmdSZXBsYWNlKHRvX2VzY2FwZSwgIj8iLCAiXFw/IiwgdHJ1ZSk7CiB9CiAKLWJvb2wgU3RhdGljSW5pdGlhbGl6ZXJzRm9yY2VkKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7Ci0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlKSB8fCBmaWxlLT5leHRlbnNpb25fY291bnQoKSA+IDApIHsKKy8vIEVzY2FwZWQgZnVuY3Rpb24gbmFtZSB0byBlbGltaW5hdGUgbmFtaW5nIGNvbmZsaWN0Lgorc3RyaW5nIFNhZmVGdW5jdGlvbk5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCkgeworICAvLyBEbyBub3QgdXNlIEZpZWxkTmFtZSgpIHNpbmNlIGl0IHdpbGwgZXNjYXBlIGtleXdvcmRzLgorICBzdHJpbmcgbmFtZSA9IGZpZWxkLT5uYW1lKCk7CisgIExvd2VyU3RyaW5nKCZuYW1lKTsKKyAgc3RyaW5nIGZ1bmN0aW9uX25hbWUgPSBwcmVmaXggKyBuYW1lOworICBpZiAoZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZ1bmN0aW9uX25hbWUpKSB7CisgICAgLy8gU2luZ2xlIHVuZGVyc2NvcmUgd2lsbCBhbHNvIG1ha2UgaXQgY29uZmxpY3Rpbmcgd2l0aCB0aGUgcHJpdmF0ZSBkYXRhCisgICAgLy8gbWVtYmVyLiBXZSB1c2UgZG91YmxlIHVuZGVyc2NvcmUgdG8gZXNjYXBlIGZ1bmN0aW9uIG5hbWVzLgorICAgIGZ1bmN0aW9uX25hbWUuYXBwZW5kKCJfXyIpOworICB9IGVsc2UgaWYgKGtLZXl3b3Jkcy5jb3VudChuYW1lKSA+IDApIHsKKyAgICAvLyBJZiB0aGUgZmllbGQgbmFtZSBpcyBhIGtleXdvcmQsIHdlIGFwcGVuZCB0aGUgdW5kZXJzY29yZSBiYWNrIHRvIGtlZXAgaXQKKyAgICAvLyBjb25zaXN0ZW50IHdpdGggb3RoZXIgZnVuY3Rpb24gbmFtZXMuCisgICAgZnVuY3Rpb25fbmFtZS5hcHBlbmQoIl8iKTsKKyAgfQorICByZXR1cm4gZnVuY3Rpb25fbmFtZTsKK30KKworYm9vbCBTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlLCBvcHRpb25zKSB8fCBmaWxlLT5leHRlbnNpb25fY291bnQoKSA+IDApIHsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKQEAgLTM3MCwxMCArNTAxLDEwIEBACiB9CiAKIHZvaWQgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgaW86OlByaW50ZXIqIHByaW50ZXIsCiAgICAgY29uc3QgY2hhciogd2l0aF9zdGF0aWNfaW5pdCwgY29uc3QgY2hhciogd2l0aG91dF9zdGF0aWNfaW5pdCwKLSAgICBjb25zdCBjaGFyKiB2YXIxLCBjb25zdCBzdHJpbmcmIHZhbDEsCi0gICAgY29uc3QgY2hhciogdmFyMiwgY29uc3Qgc3RyaW5nJiB2YWwyKSB7CisgICAgY29uc3QgY2hhciogdmFyMSwgY29uc3Qgc3RyaW5nJiB2YWwxLCBjb25zdCBjaGFyKiB2YXIyLAorICAgIGNvbnN0IHN0cmluZyYgdmFsMikgewogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CiAgIGlmICh2YXIxKSB7CiAgICAgdmFyc1t2YXIxXSA9IHZhbDE7CkBAIC0zODIsMTQgKzUxMywxNiBAQAogICAgIHZhcnNbdmFyMl0gPSB2YWwyOwogICB9CiAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKLSAgICAgIHZhcnMsIGZpbGUsIHByaW50ZXIsIHdpdGhfc3RhdGljX2luaXQsIHdpdGhvdXRfc3RhdGljX2luaXQpOworICAgICAgdmFycywgZmlsZSwgb3B0aW9ucywgcHJpbnRlciwgd2l0aF9zdGF0aWNfaW5pdCwgd2l0aG91dF9zdGF0aWNfaW5pdCk7CiB9CiAKLXZvaWQgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcnMsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBjaGFyKiB3aXRoX3N0YXRpY19pbml0LAotICAgIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQpIHsKLSAgaWYgKFN0YXRpY0luaXRpYWxpemVyc0ZvcmNlZChmaWxlKSkgewordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogd2l0aF9zdGF0aWNfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQpIHsKKyAgaWYgKFN0YXRpY0luaXRpYWxpemVyc0ZvcmNlZChmaWxlLCBvcHRpb25zKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcnMsIHdpdGhfc3RhdGljX2luaXQpOwogICB9IGVsc2UgewogICAgIHByaW50ZXItPlByaW50KHZhcnMsIChzdHJpbmcoCkBAIC00MDEsNiArNTM0LDE3MCBAQAogICB9CiB9CiAKKworc3RhdGljIGJvb2wgSGFzTWFwRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoZGVzY3JpcHRvci0+ZmllbGQoaSktPmlzX21hcCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzTWFwRmllbGRzKGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlKGkpKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhhc01hcEZpZWxkcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBpZiAoSGFzTWFwRmllbGRzKGZpbGUtPm1lc3NhZ2VfdHlwZShpKSkpIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RhdGljIGJvb2wgSGFzRW51bURlZmluaXRpb25zKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgeworICBpZiAobWVzc2FnZV90eXBlLT5lbnVtX3R5cGVfY291bnQoKSA+IDApIHJldHVybiB0cnVlOworICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhtZXNzYWdlX3R5cGUtPm5lc3RlZF90eXBlKGkpKSkgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhhc0VudW1EZWZpbml0aW9ucyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICBpZiAoZmlsZS0+ZW51bV90eXBlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgaWYgKEhhc0VudW1EZWZpbml0aW9ucyhmaWxlLT5tZXNzYWdlX3R5cGUoaSkpKSByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgSXNTdHJpbmdPck1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzI6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9ET1VCTEU6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIHRydWU7CisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIGZhbHNlOworfQorCitGaWVsZE9wdGlvbnM6OkNUeXBlIEVmZmVjdGl2ZVN0cmluZ0NUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgR09PR0xFX0RDSEVDSyhmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKTsKKyAgLy8gT3Blbi1zb3VyY2UgcHJvdG9idWYgcmVsZWFzZSBvbmx5IHN1cHBvcnRzIFNUUklORyBjdHlwZS4KKyAgcmV0dXJuIEZpZWxkT3B0aW9uczo6U1RSSU5HOworCit9CisKK2Jvb2wgSXNBbnlNZXNzYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5uYW1lKCkgPT0ga0FueVByb3RvRmlsZTsKK30KKworYm9vbCBJc0FueU1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gZGVzY3JpcHRvci0+bmFtZSgpID09IGtBbnlNZXNzYWdlTmFtZSAmJgorICAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5uYW1lKCkgPT0ga0FueVByb3RvRmlsZTsKK30KKworYm9vbCBJc1dlbGxLbm93bk1lc3NhZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuICFkZXNjcmlwdG9yLT5uYW1lKCkuY29tcGFyZSgwLCAxNiwga0dvb2dsZVByb3RvYnVmUHJlZml4KTsKK30KKworZW51bSBVdGY4Q2hlY2tNb2RlIHsKKyAgU1RSSUNUID0gMCwgIC8vIFBhcnNpbmcgd2lsbCBmYWlsIGlmIG5vbiBVVEYtOCBkYXRhIGlzIGluIHN0cmluZyBmaWVsZHMuCisgIFZFUklGWSA9IDEsICAvLyBPbmx5IGxvZyBhbiBlcnJvciBidXQgcGFyc2luZyB3aWxsIHN1Y2NlZWQuCisgIE5PTkUgPSAyLCAgLy8gTm8gVVRGLTggY2hlY2suCit9OworCisvLyBXaGljaCBsZXZlbCBvZiBVVEYtOCBlbmZvcmNlbWFudCBpcyBwbGFjZWQgb24gdGhpcyBmaWxlLgorc3RhdGljIFV0ZjhDaGVja01vZGUgR2V0VXRmOENoZWNrTW9kZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIGlmIChmaWVsZC0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgIHJldHVybiBTVFJJQ1Q7CisgIH0gZWxzZSBpZiAoR2V0T3B0aW1pemVGb3IoZmllbGQtPmZpbGUoKSwgb3B0aW9ucykgIT0KKyAgICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FKSB7CisgICAgcmV0dXJuIFZFUklGWTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTk9ORTsKKyAgfQorfQorCitzdGF0aWMgdm9pZCBHZW5lcmF0ZVV0ZjhDaGVja0NvZGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9wYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBzdHJpY3RfZnVuY3Rpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmVyaWZ5X2Z1bmN0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIHN3aXRjaCAoR2V0VXRmOENoZWNrTW9kZShmaWVsZCwgb3B0aW9ucykpIHsKKyAgICBjYXNlIFNUUklDVDogeworICAgICAgaWYgKGZvcl9wYXJzZSkgeworICAgICAgICBwcmludGVyLT5QcmludCgiRE9fKCIpOworICAgICAgfQorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZnVuY3Rpb24kKFxuIiwKKyAgICAgICAgICAiZnVuY3Rpb24iLCBzdHJpY3RfZnVuY3Rpb24pOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsIHBhcmFtZXRlcnMpOworICAgICAgaWYgKGZvcl9wYXJzZSkgeworICAgICAgICBwcmludGVyLT5QcmludCgiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlBBUlNFLFxuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyLT5QcmludCgiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNFUklBTElaRSxcbiIpOworICAgICAgfQorICAgICAgcHJpbnRlci0+UHJpbnQoIlwiJGZ1bGxfbmFtZSRcIikiLCAiZnVsbF9uYW1lIiwgZmllbGQtPmZ1bGxfbmFtZSgpKTsKKyAgICAgIGlmIChmb3JfcGFyc2UpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIikiKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KCI7XG4iKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIFZFUklGWTogeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OiRmdW5jdGlvbiQoXG4iLAorICAgICAgICAgICJmdW5jdGlvbiIsIHZlcmlmeV9mdW5jdGlvbik7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywgcGFyYW1ldGVycyk7CisgICAgICBpZiAoZm9yX3BhcnNlKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSxcbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSxcbiIpOworICAgICAgfQorICAgICAgcHJpbnRlci0+UHJpbnQoIlwiJGZ1bGxfbmFtZSRcIik7XG4iLCAiZnVsbF9uYW1lIiwgZmllbGQtPmZ1bGxfbmFtZSgpKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIE5PTkU6CisgICAgICBicmVhazsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywgYm9vbCBmb3JfcGFyc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlKGZpZWxkLCBvcHRpb25zLCBmb3JfcGFyc2UsIHZhcmlhYmxlcywgcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICJWZXJpZnlVdGY4U3RyaW5nIiwgIlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZXIpOworfQorCit2b2lkIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvckNvcmQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9wYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogcGFyYW1ldGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBHZW5lcmF0ZVV0ZjhDaGVja0NvZGUoZmllbGQsIG9wdGlvbnMsIGZvcl9wYXJzZSwgdmFyaWFibGVzLCBwYXJhbWV0ZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgIlZlcmlmeVV0ZjhDb3JkIiwgIlZlcmlmeVVURjhDb3JkTmFtZWRGaWVsZCIsIHByaW50ZXIpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgY3BwCiB9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9oZWxwZXJzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaAppbmRleCA2OTBmYmVjLi4wMThhY2ZjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX2hlbHBlcnMuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzcsOCArMzcsOSBAQAogCiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTY2LDcgKzY3LDE4IEBACiBzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGJvb2wgcXVhbGlmaWVkKTsKIHN0cmluZyBDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzY3JpcHRvciwgYm9vbCBxdWFsaWZpZWQpOwogCi1zdHJpbmcgU3VwZXJDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisvLyBOYW1lIG9mIHRoZSBDUlRQIGNsYXNzIHRlbXBsYXRlIChmb3IgdXNlIHdpdGggcHJvdG9faCkuCisvLyBUaGlzIGlzIGEgY2xhc3MgbmFtZSwgbGlrZSAiUHJvdG9OYW1lX0ludGVybmFsQmFzZSIuCitzdHJpbmcgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCisvLyBOYW1lIG9mIHRoZSBiYXNlIGNsYXNzOiBlaXRoZXIgdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzIChmb3IgdXNlIHdpdGgKKy8vIHByb3RvX2gpIG9yIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UuCitzdHJpbmcgU3VwZXJDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CisKKy8vIFJldHVybnMgYSBzdHJpbmcgdGhhdCBkb3duLWNhc3RzIGZyb20gdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzIHRvIHRoZQorLy8gZGVyaXZlZCBjbGFzcy4KK3N0cmluZyBEZXBlbmRlbnRCYXNlRG93bkNhc3QoKTsKK3N0cmluZyBEZXBlbmRlbnRCYXNlQ29uc3REb3duQ2FzdCgpOwogCiAvLyBHZXQgdGhlICh1bnF1YWxpZmllZCkgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciB0aGlzIGZpZWxkIGluIEMrKyBjb2RlLgogLy8gVGhlIG5hbWUgaXMgY29lcmNlZCB0byBsb3dlci1jYXNlIHRvIGVtdWxhdGUgcHJvdG8xIGJlaGF2aW9yLiAgUGVvcGxlCkBAIC03NCw2ICs4Niw5IEBACiAvLyBhbnl3YXksIHNvIG5vcm1hbGx5IHRoaXMganVzdCByZXR1cm5zIGZpZWxkLT5uYW1lKCkuCiBzdHJpbmcgRmllbGROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwogCisvLyBHZXQgdGhlIHNhbml0aXplZCBuYW1lIHRoYXQgc2hvdWxkIGJlIHVzZWQgZm9yIHRoZSBnaXZlbiBlbnVtIGluIEMrKyBjb2RlLgorc3RyaW5nIEVudW1WYWx1ZU5hbWUoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSk7CisKIC8vIEdldCB0aGUgdW5xdWFsaWZpZWQgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBhIGZpZWxkJ3MgZmllbGQKIC8vIG51bWJlciBjb25zdGFudC4KIHN0cmluZyBGaWVsZENvbnN0YW50TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKQEAgLTg1LDEyICsxMDAsMjYgQEAKICAgICBmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCkgOiBmaWVsZC0+Y29udGFpbmluZ190eXBlKCk7CiB9CiAKKy8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZ2l2ZW4gJ2ZpZWxkX2Rlc2NyaXB0b3InIGhhcyBhIG1lc3NhZ2UgdHlwZSB0aGF0IGlzCisvLyBhIGRlcGVuZGVuY3kgb2YgdGhlIGZpbGUgd2hlcmUgdGhlIGZpZWxkIGlzIGRlZmluZWQgKGkuZS4sIHRoZSBmaWVsZAorLy8gdHlwZSBpcyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IGZpbGUgdGhhbiB0aGUgbWVzc2FnZSBob2xkaW5nIHRoZSBmaWVsZCkuCisvLworLy8gVGhpcyBvbmx5IGFwcGxpZXMgdG8gTWVzc2FnZS10eXBlZCBmaWVsZHMuIEVudW0tdHlwZWQgZmllbGRzIG1heSByZWZlcgorLy8gdG8gYW4gZW51bSBpbiBhIGRlcGVuZGVuY3k7IGhvd2V2ZXIsIGVudW1zIGFyZSBzcGVjaWZpZWQgYW5kCisvLyBmb3J3YXJkLWRlY2xhcmVkIHdpdGggYW4gZW51bS1iYXNlLCBzbyB0aGUgZGVmaW5pdGlvbiBpcyBub3QgcmVxdWlyZWQgdG8KKy8vIG1hbmlwdWxhdGUgdGhlIGZpZWxkIHZhbHVlLgorYm9vbCBJc0ZpZWxkRGVwZW5kZW50KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfZGVzY3JpcHRvcik7CisKKy8vIFJldHVybnMgdGhlIG5hbWUgdGhhdCBzaG91bGQgYmUgdXNlZCBmb3IgZm9yY2luZyBkZXBlbmRlbnQgbG9va3VwIGZyb20gYQorLy8gZGVwZW5kZW50IGJhc2UgY2xhc3MuCitzdHJpbmcgRGVwZW5kZW50VHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CisKIC8vIFJldHVybnMgdGhlIGZ1bGx5LXF1YWxpZmllZCB0eXBlIG5hbWUgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLiAgVXN1YWxseSB0aGlzCiAvLyBpcyBqdXN0IENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksIHRydWUpOwogc3RyaW5nIEZpZWxkTWVzc2FnZVR5cGVOYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwogCiAvLyBTdHJpcHMgIi5wcm90byIgb3IgIi5wcm90b2RldmVsIiBmcm9tIHRoZSBlbmQgb2YgYSBmaWxlbmFtZS4KLXN0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpOworTElCUFJPVE9DX0VYUE9SVCBzdHJpbmcgU3RyaXBQcm90byhjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKIAogLy8gR2V0IHRoZSBDKysgdHlwZSBuYW1lIGZvciBhIHByaW1pdGl2ZSB0eXBlIChlLmcuICJkb3VibGUiLCAiOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiIsIGV0Yy4pLgogLy8gTm90ZTogIG5vbi1idWlsdC1pbiB0eXBlIG5hbWVzIHdpbGwgYmUgcXVhbGlmaWVkLCBtZWFuaW5nIHRoZXkgd2lsbCBzdGFydApAQCAtMTAzLDYgKzEzMiwxMiBAQAogLy8gbWV0aG9kcyBvZiBXaXJlRm9ybWF0LiAgRm9yIGV4YW1wbGUsIFRZUEVfSU5UMzIgYmVjb21lcyAiSW50MzIiLgogY29uc3QgY2hhciogRGVjbGFyZWRUeXBlTWV0aG9kTmFtZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSk7CiAKKy8vIFJldHVybiB0aGUgY29kZSB0aGF0IGV2YWx1YXRlcyB0byB0aGUgbnVtYmVyIHdoZW4gY29tcGlsZWQuCitzdHJpbmcgSW50MzJUb1N0cmluZyhpbnQgbnVtYmVyKTsKKworLy8gUmV0dXJuIHRoZSBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBudW1iZXIgd2hlbiBjb21waWxlZC4KK3N0cmluZyBJbnQ2NFRvU3RyaW5nKGludDY0IG51bWJlcik7CisKIC8vIEdldCBjb2RlIHRoYXQgZXZhbHVhdGVzIHRvIHRoZSBmaWVsZCdzIGRlZmF1bHQgdmFsdWUuCiBzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOwogCkBAIC0xMTUsNjQgKzE1MCwxNTMgQEAKIC8vIFJldHVybiB0aGUgbmFtZSBvZiB0aGUgQXNzaWduRGVzY3JpcHRvcnMoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgogc3RyaW5nIEdsb2JhbEFzc2lnbkRlc2NyaXB0b3JzTmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lKTsKIAorLy8gUmV0dXJuIHRoZSBxdWFsaWZpZWQgQysrIG5hbWUgZm9yIGEgZmlsZSBsZXZlbCBzeW1ib2wuCitzdHJpbmcgUXVhbGlmaWVkRmlsZUxldmVsU3ltYm9sKGNvbnN0IHN0cmluZyYgcGFja2FnZSwgY29uc3Qgc3RyaW5nJiBuYW1lKTsKKwogLy8gUmV0dXJuIHRoZSBuYW1lIG9mIHRoZSBTaHV0ZG93bkZpbGUoKSBmdW5jdGlvbiBmb3IgYSBnaXZlbiBmaWxlLgogc3RyaW5nIEdsb2JhbFNodXRkb3duRmlsZU5hbWUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CiAKIC8vIEVzY2FwZSBDKysgdHJpZ3JhcGhzIGJ5IGVzY2FwaW5nIHF1ZXN0aW9uIG1hcmtzIHRvIFw/CiBzdHJpbmcgRXNjYXBlVHJpZ3JhcGhzKGNvbnN0IHN0cmluZyYgdG9fZXNjYXBlKTsKIAotLy8gRG8gbWVzc2FnZSBjbGFzc2VzIGluIHRoaXMgZmlsZSBrZWVwIHRyYWNrIG9mIHVua25vd24gZmllbGRzPwotaW5saW5lIGJvb2wgSGFzVW5rbm93bkZpZWxkcyhjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZSkgewotICByZXR1cm4gZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUUgfHwKLSAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5yZXRhaW5fdW5rbm93bl9maWVsZHMoKTsKKy8vIEVzY2FwZWQgZnVuY3Rpb24gbmFtZSB0byBlbGltaW5hdGUgbmFtaW5nIGNvbmZsaWN0Lgorc3RyaW5nIFNhZmVGdW5jdGlvbk5hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCk7CisKKy8vIFJldHVybnMgdHJ1ZSBpZiB1bmtub3duIGZpZWxkcyBhcmUgcHJlc2V2ZWQgYWZ0ZXIgcGFyc2luZy4KK2lubGluZSBib29sIFByZXNlcnZlVW5rbm93bkZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlKSB7CisgIHJldHVybiBtZXNzYWdlLT5maWxlKCktPnN5bnRheCgpICE9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOwogfQogCisvLyBSZXR1cm5zIHRoZSBvcHRpbWl6ZSBtb2RlIGZvciA8ZmlsZT4sIHJlc3BlY3RpbmcgPG9wdGlvbnMuZW5mb3JjZV9saXRlPi4KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEdldE9wdGltaXplRm9yKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKworLy8gSWYgUHJlc2VydmVVbmtub3duRmllbGRzKCkgaXMgdHJ1ZSwgZGV0ZXJtaW5lcyB3aGV0aGVyIHVua25vd24KKy8vIGZpZWxkcyB3aWxsIGJlIHN0b3JlZCBpbiBhbiBVbmtub3duRmllbGRTZXQgb3IgYSBzdHJpbmcuCisvLyBJZiBQcmVzZXJ2ZVVua25vd25GaWVsZHMoKSBpcyBmYWxzZSwgdGhpcyBtZXRob2Qgd2lsbCBub3QgYmUKKy8vIHVzZWQuCitpbmxpbmUgYm9vbCBVc2VVbmtub3duRmllbGRTZXQoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gR2V0T3B0aW1pemVGb3IoZmlsZSwgb3B0aW9ucykgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK30KKworCisvLyBEb2VzIHRoZSBmaWxlIGhhdmUgYW55IG1hcCBmaWVsZHMsIG5lY2Vzc2l0YXRpbmcgdGhlIGZpbGUgdG8gaW5jbHVkZQorLy8gbWFwX2ZpZWxkX2lubC5oIGFuZCBtYXAuaC4KK2Jvb2wgSGFzTWFwRmllbGRzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKKworLy8gRG9lcyB0aGlzIGZpbGUgaGF2ZSBhbnkgZW51bSB0eXBlIGRlZmluaXRpb25zPworYm9vbCBIYXNFbnVtRGVmaW5pdGlvbnMoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworCiAvLyBEb2VzIHRoaXMgZmlsZSBoYXZlIGdlbmVyYXRlZCBwYXJzaW5nLCBzZXJpYWxpemF0aW9uLCBhbmQgb3RoZXIKIC8vIHN0YW5kYXJkIG1ldGhvZHMgZm9yIHdoaWNoIHJlZmxlY3Rpb24tYmFzZWQgZmFsbGJhY2sgaW1wbGVtZW50YXRpb25zIGV4aXN0PwotaW5saW5lIGJvb2wgSGFzR2VuZXJhdGVkTWV0aG9kcyhjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZSkgewotICByZXR1cm4gZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9IEZpbGVPcHRpb25zOjpDT0RFX1NJWkU7CitpbmxpbmUgYm9vbCBIYXNHZW5lcmF0ZWRNZXRob2RzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIHJldHVybiBHZXRPcHRpbWl6ZUZvcihmaWxlLCBvcHRpb25zKSAhPSBGaWxlT3B0aW9uczo6Q09ERV9TSVpFOwogfQogCi0vLyBEbyBtZXNzYWdlIGNsYXNzZXMgaW4gdGhpcyBmaWxlIGhhdmUgZGVzY3JpcHRvciBhbmQgcmVmZWxjdGlvbiBtZXRob2RzPwotaW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGUpIHsKLSAgcmV0dXJuIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOworLy8gRG8gbWVzc2FnZSBjbGFzc2VzIGluIHRoaXMgZmlsZSBoYXZlIGRlc2NyaXB0b3IgYW5kIHJlZmxlY3Rpb24gbWV0aG9kcz8KK2lubGluZSBib29sIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gR2V0T3B0aW1pemVGb3IoZmlsZSwgb3B0aW9ucykgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKIH0KIAogLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGdlbmVyaWMgc2VydmljZXMgZm9yIHRoaXMgZmlsZT8KLWlubGluZSBib29sIEhhc0dlbmVyaWNTZXJ2aWNlcyhjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZSkgeworaW5saW5lIGJvb2wgSGFzR2VuZXJpY1NlcnZpY2VzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKICAgcmV0dXJuIGZpbGUtPnNlcnZpY2VfY291bnQoKSA+IDAgJiYKLSAgICAgICAgIGZpbGUtPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FICYmCisgICAgICAgICBHZXRPcHRpbWl6ZUZvcihmaWxlLCBvcHRpb25zKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FICYmCiAgICAgICAgICBmaWxlLT5vcHRpb25zKCkuY2NfZ2VuZXJpY19zZXJ2aWNlcygpOwogfQogCi0vLyBTaG91bGQgc3RyaW5nIGZpZWxkcyBpbiB0aGlzIGZpbGUgdmVyaWZ5IHRoYXQgdGhlaXIgY29udGVudHMgYXJlIFVURi04PwotaW5saW5lIGJvb2wgSGFzVXRmOFZlcmlmaWNhdGlvbihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgewotICByZXR1cm4gZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Ci19Ci0KIC8vIFNob3VsZCB3ZSBnZW5lcmF0ZSBhIHNlcGFyYXRlLCBzdXBlci1vcHRpbWl6ZWQgY29kZSBwYXRoIGZvciBzZXJpYWxpemluZyB0bwogLy8gZmxhdCBhcnJheXM/ICBXZSBkb24ndCBkbyB0aGlzIGluIExpdGUgbW9kZSBiZWNhdXNlIHdlJ2QgcmF0aGVyIHJlZHVjZSBjb2RlCiAvLyBzaXplLgotaW5saW5lIGJvb2wgSGFzRmFzdEFycmF5U2VyaWFsaXphdGlvbihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgewotICByZXR1cm4gZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpID09IEZpbGVPcHRpb25zOjpTUEVFRDsKK2lubGluZSBib29sIEhhc0Zhc3RBcnJheVNlcmlhbGl6YXRpb24oY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIEdldE9wdGltaXplRm9yKGZpbGUsIG9wdGlvbnMpID09IEZpbGVPcHRpb25zOjpTUEVFRDsKIH0KIAogLy8gUmV0dXJucyB3aGV0aGVyIHdlIGhhdmUgdG8gZ2VuZXJhdGUgY29kZSB3aXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi1ib29sIFN0YXRpY0luaXRpYWxpemVyc0ZvcmNlZChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7Citib29sIFN0YXRpY0luaXRpYWxpemVyc0ZvcmNlZChjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogCiAvLyBQcmludHMgJ3dpdGhfc3RhdGljX2luaXQnIGlmIHN0YXRpYyBpbml0aWFsaXplcnMgaGF2ZSB0byBiZSB1c2VkIGZvciB0aGUKIC8vIHByb3ZpZGVkIGZpbGUuIE90aGVyd2lzZSBlbWl0cyBib3RoICd3aXRoX3N0YXRpY19pbml0JyBhbmQKIC8vICd3aXRob3V0X3N0YXRpY19pbml0JyB1c2luZyAjaWZkZWYuCiB2b2lkIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGlvOjpQcmludGVyKiBwcmludGVyLAogICAgIGNvbnN0IGNoYXIqIHdpdGhfc3RhdGljX2luaXQsIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQsCi0gICAgY29uc3QgY2hhciogdmFyMSA9IE5VTEwsIGNvbnN0IHN0cmluZyYgdmFsMSA9ICIiLAotICAgIGNvbnN0IGNoYXIqIHZhcjIgPSBOVUxMLCBjb25zdCBzdHJpbmcmIHZhbDIgPSAiIik7CisgICAgY29uc3QgY2hhciogdmFyMSA9IE5VTEwsIGNvbnN0IHN0cmluZyYgdmFsMSA9ICIiLCBjb25zdCBjaGFyKiB2YXIyID0gTlVMTCwKKyAgICBjb25zdCBzdHJpbmcmIHZhbDIgPSAiIik7CiAKLXZvaWQgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcnMsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAotICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBjaGFyKiB3aXRoX3N0YXRpY19pbml0LAotICAgIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQpOwordm9pZCBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogd2l0aF9zdGF0aWNfaW5pdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHdpdGhvdXRfc3RhdGljX2luaXQpOworCisKK2lubGluZSBib29sIElzTWFwRW50cnlNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5tYXBfZW50cnkoKTsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBmaWVsZCdzIENQUFRZUEUgaXMgc3RyaW5nIG9yIG1lc3NhZ2UuCitib29sIElzU3RyaW5nT3JNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisvLyBGb3IgYSBzdHJpbmcgZmllbGQsIHJldHVybnMgdGhlIGVmZmVjdGl2ZSBjdHlwZS4gIElmIHRoZSBhY3R1YWwgY3R5cGUgaXMKKy8vIG5vdCBzdXBwb3J0ZWQsIHJldHVybnMgdGhlIGRlZmF1bHQgb2YgU1RSSU5HLgorRmllbGRPcHRpb25zOjpDVHlwZSBFZmZlY3RpdmVTdHJpbmdDVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKworc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3Qgc3RyaW5nJiBpbnB1dCwgYm9vbCBjYXBfbmV4dF9sZXR0ZXIpOworCitpbmxpbmUgYm9vbCBIYXNGaWVsZFByZXNlbmNlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIHJldHVybiBmaWxlLT5zeW50YXgoKSAhPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKK30KKworLy8gUmV0dXJucyB0cnVlIGlmICdlbnVtJyBzZW1hbnRpY3MgYXJlIHN1Y2ggdGhhdCB1bmtub3duIHZhbHVlcyBhcmUgcHJlc2VydmVkCisvLyBpbiB0aGUgZW51bSBmaWVsZCBpdHNlbGYsIHJhdGhlciB0aGFuIGdvaW5nIHRvIHRoZSBVbmtub3duRmllbGRTZXQuCitpbmxpbmUgYm9vbCBIYXNQcmVzZXJ2aW5nVW5rbm93bkVudW1TZW1hbnRpY3MoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKyAgcmV0dXJuIGZpbGUtPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOworfQorCitpbmxpbmUgYm9vbCBTdXBwb3J0c0FyZW5hcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICByZXR1cm4gZmlsZS0+b3B0aW9ucygpLmNjX2VuYWJsZV9hcmVuYXMoKTsKK30KKworaW5saW5lIGJvb2wgU3VwcG9ydHNBcmVuYXMoY29uc3QgRGVzY3JpcHRvciogZGVzYykgeworICByZXR1cm4gU3VwcG9ydHNBcmVuYXMoZGVzYy0+ZmlsZSgpKTsKK30KKworaW5saW5lIGJvb2wgU3VwcG9ydHNBcmVuYXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gU3VwcG9ydHNBcmVuYXMoZmllbGQtPmZpbGUoKSk7Cit9CisKK2Jvb2wgSXNBbnlNZXNzYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK2Jvb2wgSXNBbnlNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCitib29sIElzV2VsbEtub3duTWVzc2FnZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKK3ZvaWQgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zLCBib29sIGZvcl9wYXJzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHBhcmFtZXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcik7CisKK3ZvaWQgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yQ29yZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsIGJvb2wgZm9yX3BhcnNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBwYXJhbWV0ZXJzLCBpbzo6UHJpbnRlciogcHJpbnRlcik7CisKK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBHZXRPcHRpbWl6ZUZvcigKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICByZXR1cm4gb3B0aW9ucy5lbmZvcmNlX2xpdGUKKyAgICAgID8gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRQorICAgICAgOiBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCk7Cit9CiAKIH0gIC8vIG5hbWVzcGFjZSBjcHAKIH0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWFwX2ZpZWxkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWFwX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tYXBfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21hcF9maWVsZC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuY2MKaW5kZXggNDI0ODc0Ny4uM2Y4ZTNiNyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsNiArMzUsMTAgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaD4KQEAgLTQ4LDYgKzUyLDcgQEAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgogCisKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBjb21waWxlciB7CkBAIC01OCwxMCArNjMsMTUgQEAKIAogbmFtZXNwYWNlIHsKIAotdm9pZCBQcmludEZpZWxkQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICAvLyBQcmludCB0aGUgZmllbGQncyBwcm90by1zeW50YXggZGVmaW5pdGlvbiBhcyBhIGNvbW1lbnQuICBXZSBkb24ndCB3YW50IHRvCi0gIC8vIHByaW50IGdyb3VwIGJvZGllcyBzbyB3ZSBjdXQgb2ZmIGFmdGVyIHRoZSBmaXJzdCBsaW5lLgotICBzdHJpbmcgZGVmID0gZmllbGQtPkRlYnVnU3RyaW5nKCk7Cit0ZW1wbGF0ZSA8Y2xhc3MgVD4KK3ZvaWQgUHJpbnRGaWVsZENvbW1lbnQoaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IFQqIGZpZWxkKSB7CisgIC8vIFByaW50IHRoZSBmaWVsZCdzIChvciBvbmVvZidzKSBwcm90by1zeW50YXggZGVmaW5pdGlvbiBhcyBhIGNvbW1lbnQuCisgIC8vIFdlIGRvbid0IHdhbnQgdG8gcHJpbnQgZ3JvdXAgYm9kaWVzIHNvIHdlIGN1dCBvZmYgYWZ0ZXIgdGhlIGZpcnN0CisgIC8vIGxpbmUuCisgIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOworICBvcHRpb25zLmVsaWRlX2dyb3VwX2JvZHkgPSB0cnVlOworICBvcHRpb25zLmVsaWRlX29uZW9mX2JvZHkgPSB0cnVlOworICBzdHJpbmcgZGVmID0gZmllbGQtPkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7CiAgIHByaW50ZXItPlByaW50KCIvLyAkZGVmJFxuIiwKICAgICAiZGVmIiwgZGVmLnN1YnN0cigwLCBkZWYuZmluZF9maXJzdF9vZignXG4nKSkpOwogfQpAQCAtNzMsMTUgKzgzLDYgQEAKICAgfQogfTsKIAotY29uc3QgY2hhcioga1dpcmVUeXBlTmFtZXNbXSA9IHsKLSAgIlZBUklOVCIsCi0gICJGSVhFRDY0IiwKLSAgIkxFTkdUSF9ERUxJTUlURUQiLAotICAiU1RBUlRfR1JPVVAiLAotICAiRU5EX0dST1VQIiwKLSAgIkZJWEVEMzIiLAotfTsKLQogLy8gU29ydCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBEZXNjcmlwdG9yIGJ5IG51bWJlciBpbnRvIGEgbmV3W10nZCBhcnJheQogLy8gYW5kIHJldHVybiBpdC4KIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioqIFNvcnRGaWVsZHNCeU51bWJlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CkBAIC05MCw4ICs5MSw4IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgZmllbGRzW2ldID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7CiAgIH0KLSAgc29ydChmaWVsZHMsIGZpZWxkcyArIGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCksCi0gICAgICAgRmllbGRPcmRlcmluZ0J5TnVtYmVyKCkpOworICBzdGQ6OnNvcnQoZmllbGRzLCBmaWVsZHMgKyBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLAorICAgICAgICAgICAgRmllbGRPcmRlcmluZ0J5TnVtYmVyKCkpOwogICByZXR1cm4gZmllbGRzOwogfQogCkBAIC0xMDMsMTQgKzEwNCwyMCBAQAogICB9CiB9OwogCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlICJyZXF1aXJlZCIgcmVzdHJpY3Rpb24gY2hlY2sgc2hvdWxkIGJlIGlnbm9yZWQgZm9yIHRoZQorLy8gZ2l2ZW4gZmllbGQuCitpbmxpbmUgc3RhdGljIGJvb2wgU2hvdWxkSWdub3JlUmVxdWlyZWRGaWVsZENoZWNrKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpIHsKKyAgcmV0dXJuIGZhbHNlOworfQorCiAvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NhZ2UgdHlwZSBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcy4gIElmIGl0IGRvZXNuJ3QsCiAvLyB3ZSBjYW4gb3B0aW1pemUgb3V0IGNhbGxzIHRvIGl0cyBJc0luaXRpYWxpemVkKCkgbWV0aG9kLgogLy8KIC8vIGFscmVhZHlfc2VlbiBpcyB1c2VkIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzYW1lIHR5cGUgbXVsdGlwbGUgdGltZXMKIC8vIChhbmQgYWxzbyB0byBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaW9uKS4KLXN0YXRpYyBib29sIEhhc1JlcXVpcmVkRmllbGRzKAotICAgIGNvbnN0IERlc2NyaXB0b3IqIHR5cGUsCi0gICAgaGFzaF9zZXQ8Y29uc3QgRGVzY3JpcHRvcio+KiBhbHJlYWR5X3NlZW4pIHsKK3N0YXRpYyBib29sIEhhc1JlcXVpcmVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbikgewogICBpZiAoYWxyZWFkeV9zZWVuLT5jb3VudCh0eXBlKSA+IDApIHsKICAgICAvLyBTaW5jZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiBhIHJlcXVpcmVkIGZpZWxkIGNhdXNlcyB0aGUgd2hvbGUKICAgICAvLyBmdW5jdGlvbiB0byByZXR1cm4gdHJ1ZSwgd2UgY2FuIGFzc3VtZSB0aGF0IGlmIHRoZSB0eXBlIGlzIGFscmVhZHkKQEAgLTEyOSw4ICsxMzYsOSBAQAogICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgewogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgaWYgKEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgYWxyZWFkeV9zZWVuKSkgeworICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgICAhU2hvdWxkSWdub3JlUmVxdWlyZWRGaWVsZENoZWNrKGZpZWxkLCBvcHRpb25zKSkgeworICAgICAgaWYgKEhhc1JlcXVpcmVkRmllbGRzKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgb3B0aW9ucywgYWxyZWFkeV9zZWVuKSkgewogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KICAgICB9CkBAIC0xMzksOSArMTQ3LDkgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCi1zdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSB7CitzdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiB0eXBlLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBhbHJlYWR5X3NlZW47Ci0gIHJldHVybiBIYXNSZXF1aXJlZEZpZWxkcyh0eXBlLCAmYWxyZWFkeV9zZWVuKTsKKyAgcmV0dXJuIEhhc1JlcXVpcmVkRmllbGRzKHR5cGUsIG9wdGlvbnMsICZhbHJlYWR5X3NlZW4pOwogfQogCiAvLyBUaGlzIHJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIGNvbXBpbGVyJ3MgYWxpZ25tZW50IGZvciB0aGUgZmllbGQuICBUaGlzCkBAIC0yNDYsOCArMjU0LDkgQEAKICAgICBhbGlnbmVkX3RvXzQucHVzaF9iYWNrKGZpZWxkX2dyb3VwKTsKICAgfQogICAvLyBTb3J0IGJ5IHByZWZlcnJlZCBsb2NhdGlvbiB0byBrZWVwIGZpZWxkcyBhcyBjbG9zZSB0byB0aGVpciBvcmlnaW5hbAotICAvLyBsb2NhdGlvbiBhcyBwb3NzaWJsZS4KLSAgc29ydChhbGlnbmVkX3RvXzQuYmVnaW4oKSwgYWxpZ25lZF90b180LmVuZCgpKTsKKyAgLy8gbG9jYXRpb24gYXMgcG9zc2libGUuICBVc2luZyBzdGFibGVfc29ydCBlbnN1cmVzIHRoYXQgdGhlIG91dHB1dCBpcworICAvLyBjb25zaXN0ZW50IGFjcm9zcyBydW5zLgorICBzdGQ6OnN0YWJsZV9zb3J0KGFsaWduZWRfdG9fNC5iZWdpbigpLCBhbGlnbmVkX3RvXzQuZW5kKCkpOwogCiAgIC8vIE5vdyBncm91cCBmaWVsZHMgYWxpZ25lZCB0byA0IGJ5dGVzIChvciB0aGUgNC1maWVsZCBncm91cHMgY3JlYXRlZCBhYm92ZSkKICAgLy8gaW50byBwYWlycywgYW5kIHRyZWF0IHRob3NlIGxpa2UgYSBzaW5nbGUgZmllbGQgYWxpZ25lZCB0byA4IGJ5dGVzLgpAQCAtMjYyLDkgKzI3MSw4IEBACiAgICAgfQogICAgIGFsaWduZWRfdG9fOC5wdXNoX2JhY2soZmllbGRfZ3JvdXApOwogICB9Ci0gIC8vIFNvcnQgYnkgcHJlZmVycmVkIGxvY2F0aW9uIHRvIGtlZXAgZmllbGRzIGFzIGNsb3NlIHRvIHRoZWlyIG9yaWdpbmFsCi0gIC8vIGxvY2F0aW9uIGFzIHBvc3NpYmxlLgotICBzb3J0KGFsaWduZWRfdG9fOC5iZWdpbigpLCBhbGlnbmVkX3RvXzguZW5kKCkpOworICAvLyBTb3J0IGJ5IHByZWZlcnJlZCBsb2NhdGlvbi4KKyAgc3RkOjpzdGFibGVfc29ydChhbGlnbmVkX3RvXzguYmVnaW4oKSwgYWxpZ25lZF90b184LmVuZCgpKTsKIAogICAvLyBOb3cgcHVsbCBvdXQgYWxsIHRoZSBGaWVsZERlc2NyaXB0b3JzIGluIG9yZGVyLgogICBmaWVsZHMtPmNsZWFyKCk7CkBAIC0yNzUsNDggKzI4MywxNjQgQEAKICAgfQogfQogCitzdHJpbmcgTWVzc2FnZVR5cGVQcm90b05hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKTsKIH0KIAorLy8gRW1pdHMgYW4gaWYtc3RhdGVtZW50IHdpdGggYSBjb25kaXRpb24gdGhhdCBldmFsdWF0ZXMgdG8gdHJ1ZSBpZiB8ZmllbGR8IGlzCisvLyBjb25zaWRlcmVkIG5vbi1kZWZhdWx0ICh3aWxsIGJlIHNlbnQgb3ZlciB0aGUgd2lyZSksIGZvciBtZXNzYWdlIHR5cGVzCisvLyB3aXRob3V0IHRydWUgZmllbGQgcHJlc2VuY2UuIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBpZgorLy8gIUhhc0ZpZWxkUHJlc2VuY2UobWVzc2FnZV9kZXNjcmlwdG9yKS4KK2Jvb2wgRW1pdEZpZWxkTm9uRGVmYXVsdENvbmRpdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIE1lcmdlIGFuZCBzZXJpYWxpemUgc2VtYW50aWNzOiBwcmltaXRpdmUgZmllbGRzIGFyZSBtZXJnZWQvc2VyaWFsaXplZCBvbmx5CisgIC8vIGlmIG5vbi16ZXJvIChudW1lcmljKSBvciBub24tZW1wdHkgKHN0cmluZykuCisgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgIWZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmICgkcHJlZml4JCRuYW1lJCgpLnNpemUoKSA+IDApIHtcbiIsCisgICAgICAgICAgInByZWZpeCIsIHByZWZpeCwKKyAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIC8vIE1lc3NhZ2UgZmllbGRzIHN0aWxsIGhhdmUgaGFzXyRuYW1lJCgpIG1ldGhvZHMuCisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKCRwcmVmaXgkaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAgICJwcmVmaXgiLCBwcmVmaXgsCisgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlmICgkcHJlZml4JCRuYW1lJCgpICE9IDApIHtcbiIsCisgICAgICAgICAgInByZWZpeCIsIHByZWZpeCwKKyAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgIH0KKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gRG9lcyB0aGUgZ2l2ZW4gZmllbGQgaGF2ZSBhIGhhc18kbmFtZSQoKSBtZXRob2Q/Citib29sIEhhc0hhc01ldGhvZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIGlmIChIYXNGaWVsZFByZXNlbmNlKGZpZWxkLT5maWxlKCkpKSB7CisgICAgLy8gSW4gcHJvdG8xL3Byb3RvMiwgZXZlcnkgZmllbGQgaGFzIGEgaGFzXyRuYW1lJCgpIG1ldGhvZC4KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICAvLyBGb3IgbWVzc2FnZSB0eXBlcyB3aXRob3V0IHRydWUgZmllbGQgcHJlc2VuY2UsIG9ubHkgZmllbGRzIHdpdGggYSBtZXNzYWdlCisgIC8vIHR5cGUgaGF2ZSBhIGhhc18kbmFtZSQoKSBtZXRob2QuCisgIHJldHVybiBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTsKK30KKworLy8gQ29sbGVjdHMgbWFwIGVudHJ5IG1lc3NhZ2UgdHlwZSBpbmZvcm1hdGlvbi4KK3ZvaWQgQ29sbGVjdE1hcEluZm8oY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7CisgIEdPT0dMRV9DSEVDSyhJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yKSk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5ID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJrZXkiKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWwgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInZhbHVlIik7CisgICgqdmFyaWFibGVzKVsia2V5Il0gPSBQcmltaXRpdmVUeXBlTmFtZShrZXktPmNwcF90eXBlKCkpOworICBzd2l0Y2ggKHZhbC0+Y3BwX3R5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAoKnZhcmlhYmxlcylbInZhbCJdID0gRmllbGRNZXNzYWdlVHlwZU5hbWUodmFsKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAoKnZhcmlhYmxlcylbInZhbCJdID0gQ2xhc3NOYW1lKHZhbC0+ZW51bV90eXBlKCksIHRydWUpOworICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICgqdmFyaWFibGVzKVsidmFsIl0gPSBQcmltaXRpdmVUeXBlTmFtZSh2YWwtPmNwcF90eXBlKCkpOworICB9CisgICgqdmFyaWFibGVzKVsia2V5X3dpcmVfdHlwZSJdID0KKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV8iICsKKyAgICAgIFRvVXBwZXIoRGVjbGFyZWRUeXBlTWV0aG9kTmFtZShrZXktPnR5cGUoKSkpOworICAoKnZhcmlhYmxlcylbInZhbF93aXJlX3R5cGUiXSA9CisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfIiArCisgICAgICBUb1VwcGVyKERlY2xhcmVkVHlwZU1ldGhvZE5hbWUodmFsLT50eXBlKCkpKTsKK30KKworLy8gRG9lcyB0aGUgZ2l2ZW4gZmllbGQgaGF2ZSBhIHByaXZhdGUgKGludGVybmFsIGhlbHBlciBvbmx5KSBoYXNfJG5hbWUkKCkKKy8vIG1ldGhvZD8KK2Jvb2wgSGFzUHJpdmF0ZUhhc01ldGhvZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIC8vIE9ubHkgZm9yIG9uZW9mcyBpbiBtZXNzYWdlIHR5cGVzIHdpdGggbm8gZmllbGQgcHJlc2VuY2UuIGhhc18kbmFtZSQoKSwKKyAgLy8gYmFzZWQgb24gdGhlIG9uZW9mIGNhc2UsIGlzIHN0aWxsIHVzZWZ1bCBpbnRlcm5hbGx5IGZvciBnZW5lcmF0ZWQgY29kZS4KKyAgcmV0dXJuICghSGFzRmllbGRQcmVzZW5jZShmaWVsZC0+ZmlsZSgpKSAmJgorICAgICAgICAgIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgIT0gTlVMTCk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBNZXNzYWdlR2VuZXJhdG9yOjpNZXNzYWdlR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGxsZXhwb3J0X2RlY2wpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCi0gICAgY2xhc3NuYW1lXyhDbGFzc05hbWUoZGVzY3JpcHRvciwgZmFsc2UpKSwKLSAgICBkbGxleHBvcnRfZGVjbF8oZGxsZXhwb3J0X2RlY2wpLAotICAgIGZpZWxkX2dlbmVyYXRvcnNfKGRlc2NyaXB0b3IpLAotICAgIG5lc3RlZF9nZW5lcmF0b3JzXyhuZXcgc2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPlsKLSAgICAgIGRlc2NyaXB0b3ItPm5lc3RlZF90eXBlX2NvdW50KCldKSwKLSAgICBlbnVtX2dlbmVyYXRvcnNfKG5ldyBzY29wZWRfcHRyPEVudW1HZW5lcmF0b3I+WwotICAgICAgZGVzY3JpcHRvci0+ZW51bV90eXBlX2NvdW50KCldKSwKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18obmV3IHNjb3BlZF9wdHI8RXh0ZW5zaW9uR2VuZXJhdG9yPlsKLSAgICAgIGRlc2NyaXB0b3ItPmV4dGVuc2lvbl9jb3VudCgpXSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgICBjbGFzc25hbWVfKENsYXNzTmFtZShkZXNjcmlwdG9yLCBmYWxzZSkpLAorICAgICAgb3B0aW9uc18ob3B0aW9ucyksCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXyhkZXNjcmlwdG9yLCBvcHRpb25zKSwKKyAgICAgIG5lc3RlZF9nZW5lcmF0b3JzXyhuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjwKKyAgICAgICAgICBNZXNzYWdlR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZV9jb3VudCgpXSksCisgICAgICBlbnVtX2dlbmVyYXRvcnNfKAorICAgICAgICAgIG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEVudW1HZW5lcmF0b3I+W2Rlc2NyaXB0b3ItPmVudW1fdHlwZV9jb3VudCgpXSksCisgICAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18obmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8CisgICAgICAgICAgRXh0ZW5zaW9uR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKV0pLAorICAgICAgdXNlX2RlcGVuZGVudF9iYXNlXyhmYWxzZSkgewogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CiAgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAotICAgICAgbmV3IE1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvci0+bmVzdGVkX3R5cGUoaSksIGRsbGV4cG9ydF9kZWNsKSk7CisgICAgICBuZXcgTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yLT5uZXN0ZWRfdHlwZShpKSwgb3B0aW9ucykpOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CiAgICAgZW51bV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKLSAgICAgIG5ldyBFbnVtR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmVudW1fdHlwZShpKSwgZGxsZXhwb3J0X2RlY2wpKTsKKyAgICAgIG5ldyBFbnVtR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmVudW1fdHlwZShpKSwgb3B0aW9ucykpOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CiAgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAotICAgICAgbmV3IEV4dGVuc2lvbkdlbmVyYXRvcihkZXNjcmlwdG9yLT5leHRlbnNpb24oaSksIGRsbGV4cG9ydF9kZWNsKSk7CisgICAgICBuZXcgRXh0ZW5zaW9uR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmV4dGVuc2lvbihpKSwgb3B0aW9ucykpOworICB9CisKKyAgbnVtX3JlcXVpcmVkX2ZpZWxkc18gPSAwOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGlmIChkZXNjcmlwdG9yLT5maWVsZChpKS0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgKytudW1fcmVxdWlyZWRfZmllbGRzXzsKKyAgICB9CisgICAgaWYgKG9wdGlvbnMucHJvdG9faCAmJiBJc0ZpZWxkRGVwZW5kZW50KGRlc2NyaXB0b3ItPmZpZWxkKGkpKSkgeworICAgICAgdXNlX2RlcGVuZGVudF9iYXNlXyA9IHRydWU7CisgICAgfQorICB9CisgIGlmIChvcHRpb25zLnByb3RvX2ggJiYgZGVzY3JpcHRvci0+b25lb2ZfZGVjbF9jb3VudCgpID4gMCkgeworICAgIC8vIEFsd2F5cyBtYWtlIG9uZW9mcyBkZXBlbmRlbnQuCisgICAgdXNlX2RlcGVuZGVudF9iYXNlXyA9IHRydWU7CiAgIH0KIH0KIAogTWVzc2FnZUdlbmVyYXRvcjo6fk1lc3NhZ2VHZW5lcmF0b3IoKSB7fQogCiB2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVGb3J3YXJkRGVjbGFyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgcHJpbnRlci0+UHJpbnQoImNsYXNzICRjbGFzc25hbWUkO1xuIiwKLSAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworRmlsbE1lc3NhZ2VGb3J3YXJkRGVjbGFyYXRpb25zKG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPiogY2xhc3NfbmFtZXMpIHsKKyAgKCpjbGFzc19uYW1lcylbY2xhc3NuYW1lX10gPSBkZXNjcmlwdG9yXzsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRm9yd2FyZERlY2xhcmF0aW9uKHByaW50ZXIpOworICAgIC8vIG1hcCBlbnRyeSBtZXNzYWdlIGRvZXNuJ3QgbmVlZCBmb3J3YXJkIGRlY2xhcmF0aW9uLiBTaW5jZSBtYXAgZW50cnkKKyAgICAvLyBtZXNzYWdlIGNhbm5vdCBiZSBhIHRvcCBsZXZlbCBjbGFzcywgd2UganVzdCBuZWVkIHRvIGF2b2lkIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbiBoZXJlLgorICAgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKKyAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkZpbGxNZXNzYWdlRm9yd2FyZERlY2xhcmF0aW9ucyhjbGFzc19uYW1lcyk7CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0ZpbGxFbnVtRm9yd2FyZERlY2xhcmF0aW9ucyhtYXA8c3RyaW5nLCBjb25zdCBFbnVtRGVzY3JpcHRvcio+KiBlbnVtX25hbWVzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+RmlsbEVudW1Gb3J3YXJkRGVjbGFyYXRpb25zKGVudW1fbmFtZXMpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBlbnVtX2dlbmVyYXRvcnNfW2ldLT5GaWxsRm9yd2FyZERlY2xhcmF0aW9uKGVudW1fbmFtZXMpOwogICB9CiB9CiAKQEAgLTM0Miw2ICs0NjYsMjggQEAKIH0KIAogdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRGVwZW5kZW50RmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworCisgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOworCisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOworCisgICAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8gJiYgSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKKyAgICAgIC8vIElmIHRoZSBtZXNzYWdlIGlzIGRlcGVuZGVudCwgdGhlIGlubGluZSBjbGVhcl8qKCkgbWV0aG9kIHdpbGwgbmVlZAorICAgICAgLy8gdG8gZGVsZXRlIHRoZSBtZXNzYWdlIHR5cGUsIHNvIGl0IG11c3QgYmUgaW4gdGhlIGRlcGVuZGVudCBiYXNlCisgICAgICAvLyBjbGFzcy4gKFNlZSBhbHNvIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucy4pCisgICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIGNsZWFyXyRuYW1lJCgpO1xuIik7CisgICAgfQorICAgIC8vIEdlbmVyYXRlIHR5cGUtc3BlY2lmaWMgYWNjZXNzb3IgZGVjbGFyYXRpb25zLgorICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKKyAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgogR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CkBAIC0zNDksMTcgKzQ5NSw0MyBAQAogICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKIAogICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhmaWVsZCwgJnZhcnMpOworICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOwogICAgIHZhcnNbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGZpZWxkKTsKIAotICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywgImlubGluZSBpbnQgJG5hbWUkX3NpemUoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywgImlubGluZSBib29sIGhhc18kbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgICBib29sIGRlcGVuZGVudF9maWVsZCA9IHVzZV9kZXBlbmRlbnRfYmFzZV8gJiYgSXNGaWVsZERlcGVuZGVudChmaWVsZCk7CisgICAgaWYgKGRlcGVuZGVudF9maWVsZCAmJgorICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSAmJgorICAgICAgICAhZmllbGQtPmlzX21hcCgpKSB7CisgICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIGRlcGVuZGVudCwgdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzIGRldGVybWluZXMKKyAgICAgIC8vIHRoZSBtZXNzYWdlIHR5cGUgZnJvbSB0aGUgZGVyaXZlZCBjbGFzcyAod2hpY2ggaXMgYSB0ZW1wbGF0ZQorICAgICAgLy8gcGFyYW1ldGVyKS4gVGhpcyB0eXBlZGVmIGlzIGZvciB0aGF0OgorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgInByaXZhdGU6XG4iCisgICAgICAgICAgInR5cGVkZWYgJGZpZWxkX3R5cGUkICRkZXBlbmRlbnRfdHlwZSQ7XG4iCisgICAgICAgICAgInB1YmxpYzpcbiIsCisgICAgICAgICAgImZpZWxkX3R5cGUiLCBGaWVsZE1lc3NhZ2VUeXBlTmFtZShmaWVsZCksCisgICAgICAgICAgImRlcGVuZGVudF90eXBlIiwgRGVwZW5kZW50VHlwZU5hbWUoZmllbGQpKTsKICAgICB9CiAKLSAgICBwcmludGVyLT5QcmludCh2YXJzLCAiaW5saW5lIHZvaWQgY2xlYXJfJG5hbWUkKCkkZGVwcmVjYXRpb24kO1xuIik7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFycywgInN0YXRpYyBjb25zdCBpbnQgJGNvbnN0YW50X25hbWUkID0gJG51bWJlciQ7XG4iKTsKKyAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsICIkZGVwcmVjYXRlZF9hdHRyJGludCAkbmFtZSRfc2l6ZSgpIGNvbnN0O1xuIik7CisgICAgfSBlbHNlIGlmIChIYXNIYXNNZXRob2QoZmllbGQpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLCAiJGRlcHJlY2F0ZWRfYXR0ciRib29sIGhhc18kbmFtZSQoKSBjb25zdDtcbiIpOworICAgIH0gZWxzZSBpZiAoSGFzUHJpdmF0ZUhhc01ldGhvZChmaWVsZCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICAgInByaXZhdGU6XG4iCisgICAgICAgICAgImJvb2wgaGFzXyRuYW1lJCgpIGNvbnN0O1xuIgorICAgICAgICAgICJwdWJsaWM6XG4iKTsKKyAgICB9CisKKyAgICBpZiAoIWRlcGVuZGVudF9maWVsZCkgeworICAgICAgLy8gSWYgdGhpcyBmaWVsZCBpcyBkZXBlbmRlbnQsIHRoZW4gaXRzIGNsZWFyXygpIG1ldGhvZCBpcyBpbiB0aGUKKyAgICAgIC8vIGRlcGVuZW50IGJhc2UgY2xhc3MuIChTZWUgYWxzbyBHZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zLikKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgY2xlYXJfJG5hbWUkKCk7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRzdGF0aWMgY29uc3QgaW50ICRjb25zdGFudF9uYW1lJCA9ICIKKyAgICAgICAgICAgICAgICAgICAiJG51bWJlciQ7XG4iKTsKIAogICAgIC8vIEdlbmVyYXRlIHR5cGUtc3BlY2lmaWMgYWNjZXNzb3IgZGVjbGFyYXRpb25zLgogICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhwcmludGVyKTsKQEAgLTM3NCwxMCArNTQ2LDIwMiBAQAogICAgICAgIkdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKCRjbGFzc25hbWUkKVxuIiwKICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKICAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIkY2FtZWxfb25lb2ZfbmFtZSRDYXNlICRvbmVvZl9uYW1lJF9jYXNlKCkgY29uc3Q7XG4iLAorICAgICAgICAiY2FtZWxfb25lb2ZfbmFtZSIsCisgICAgICAgIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICJvbmVvZl9uYW1lIiwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSk7CisgIH0KIH0KIAogdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CitHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoIXVzZV9kZXBlbmRlbnRfYmFzZV8pIHJldHVybjsKKworICBwcmludGVyLT5QcmludCgiLy8gJGNsYXNzbmFtZSRcblxuIiwgImNsYXNzbmFtZSIsCisgICAgICAgICAgICAgICAgIERlcGVuZGVudEJhc2VDbGFzc1RlbXBsYXRlTmFtZShkZXNjcmlwdG9yXykpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisKKyAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CisKKyAgICAvLyBUaGVzZSBmdW5jdGlvbnMgYXJlIG5vdCByZWFsbHkgZGVwZW5kZW50OiB0aGV5IGFyZSBwYXJ0IG9mIHRoZQorICAgIC8vIChub24tZGVwZW5kZW50KSBkZXJpdmVkIGNsYXNzLiBIb3dldmVyLCB0aGV5IG5lZWQgdG8gbGl2ZSBvdXRzaWRlCisgICAgLy8gYW55ICNpZmRlZiBndWFyZHMsIHNvIHdlIHRyZWF0IHRoZW0gYXMgaWYgdGhleSB3ZXJlIGRlcGVuZGVudC4KKyAgICAvLworICAgIC8vIFNlZSB0aGUgY29tbWVudCBpbiBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZUlubGluZUZ1bmN0aW9uRGVmaW5pdGlvbnMKKyAgICAvLyBmb3IgYSBtb3JlIGNvbXBsZXRlIGV4cGxhbmF0aW9uLgorICAgIGlmICh1c2VfZGVwZW5kZW50X2Jhc2VfICYmIElzRmllbGREZXBlbmRlbnQoZmllbGQpKSB7CisgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgICAgICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhmaWVsZCwgJnZhcnMsIG9wdGlvbnNfKTsKKyAgICAgIHZhcnNbImlubGluZSJdID0gImlubGluZSAiOworICAgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgICAgdmFyc1siZmllbGRfbmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKTsKKyAgICAgICAgdmFyc1sib25lb2ZfbmFtZSJdID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+bmFtZSgpOworICAgICAgICB2YXJzWyJvbmVvZl9pbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpKTsKKyAgICAgICAgR2VuZXJhdGVPbmVvZk1lbWJlckhhc0JpdHMoZmllbGQsIHZhcnMsIHByaW50ZXIpOworICAgICAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgLy8gVGhlcmUgd2lsbCBiZSBubyBoZWFkZXIgZ3VhcmQsIHNvIHRoaXMgYWx3YXlzIGhhcyB0byBiZSBpbmxpbmUuCisgICAgICAgIEdlbmVyYXRlU2luZ3VsYXJGaWVsZEhhc0JpdHMoZmllbGQsIHZhcnMsIHByaW50ZXIpOworICAgICAgfQorICAgICAgLy8gdmFycyBuZWVkZWQgZm9yIGNsZWFyXygpLCB3aGljaCBpcyBpbiB0aGUgZGVwZW5kZW50IGJhc2U6CisgICAgICAvLyAoU2VlIGFsc28gR2VuZXJhdGVEZXBlbmRlbnRGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zLikKKyAgICAgIHZhcnNbInRtcGwiXSA9ICJ0ZW1wbGF0ZTxjbGFzcyBUPlxuIjsKKyAgICAgIHZhcnNbImRlcGVuZGVudF9jbGFzc25hbWUiXSA9CisgICAgICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfKSArICI8VD4iOworICAgICAgdmFyc1sidGhpc19tZXNzYWdlIl0gPSBEZXBlbmRlbnRCYXNlRG93bkNhc3QoKTsKKyAgICAgIHZhcnNbInRoaXNfY29uc3RfbWVzc2FnZSJdID0gRGVwZW5kZW50QmFzZUNvbnN0RG93bkNhc3QoKTsKKyAgICAgIEdlbmVyYXRlRmllbGRDbGVhcihmaWVsZCwgdmFycywgcHJpbnRlcik7CisgICAgfQorCisgICAgLy8gR2VuZXJhdGUgdHlwZS1zcGVjaWZpYyBhY2Nlc3NvcnMuCisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKQorICAgICAgICAuR2VuZXJhdGVEZXBlbmRlbnRJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKHByaW50ZXIpOworCisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBoYXNfJG5hbWUkKCkgYW5kIGNsZWFyX2hhc18kbmFtZSQoKSBmdW5jdGlvbnMgZm9yIG9uZW9mcworICAvLyBTaW1pbGFyIHRvIG90aGVyIGhhcy1iaXRzLCB0aGVzZSBtdXN0IGFsd2F5cyBiZSBpbiB0aGUgaGVhZGVyIGlmIHdlCisgIC8vIGFyZSB1c2luZyBhIGRlcGVuZGVudCBiYXNlIGNsYXNzLgorICBHZW5lcmF0ZU9uZW9mSGFzQml0cyhwcmludGVyLCB0cnVlIC8qIGlzX2lubGluZSAqLyk7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZVNpbmd1bGFyRmllbGRIYXNCaXRzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAvLyBOLkIuOiB3aXRob3V0IGZpZWxkIHByZXNlbmNlLCB3ZSBkbyBub3QgdXNlIGhhcy1iaXRzIG9yIGdlbmVyYXRlCisgICAgLy8gaGFzXyRuYW1lJCgpIG1ldGhvZHMuCisgICAgdmFyc1siaGFzX2FycmF5X2luZGV4Il0gPSBTaW1wbGVJdG9hKGZpZWxkLT5pbmRleCgpIC8gMzIpOworICAgIHZhcnNbImhhc19tYXNrIl0gPSBTdHJDYXQoc3RyaW5nczo6SGV4KDF1IDw8IChmaWVsZC0+aW5kZXgoKSAlIDMyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmdzOjpaRVJPX1BBRF84KSk7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIkaW5saW5lJCIKKyAgICAgICJib29sICRjbGFzc25hbWUkOjpoYXNfJG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuIChfaGFzX2JpdHNfWyRoYXNfYXJyYXlfaW5kZXgkXSAmIDB4JGhhc19tYXNrJHUpICE9IDA7XG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIgorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF9oYXNfJG5hbWUkKCkge1xuIgorICAgICAgIiAgX2hhc19iaXRzX1skaGFzX2FycmF5X2luZGV4JF0gfD0gMHgkaGFzX21hc2skdTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQiCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Y2xlYXJfaGFzXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgIF9oYXNfYml0c19bJGhhc19hcnJheV9pbmRleCRdICY9IH4weCRoYXNfbWFzayR1O1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIC8vIE1lc3NhZ2UgZmllbGRzIGhhdmUgYSBoYXNfJG5hbWUkKCkgbWV0aG9kLgorICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgYm9vbCBpc19sYXp5ID0gZmFsc2U7CisgICAgICBpZiAoaXNfbGF6eSkgeworICAgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAgICIkaW5saW5lJCIKKyAgICAgICAgICAiYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gISRuYW1lJF8uSXNDbGVhcmVkKCk7XG4iCisgICAgICAgICAgIn1cbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAiJGlubGluZSQiCisgICAgICAgICAgImJvb2wgJGNsYXNzbmFtZSQ6Omhhc18kbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAgICAgIiAgcmV0dXJuICFfaXNfZGVmYXVsdF9pbnN0YW5jZV8gJiYgJG5hbWUkXyAhPSBOVUxMO1xuIgorICAgICAgICAgICJ9XG4iKTsKKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlT25lb2ZIYXNCaXRzKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIGlzX2lubGluZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgICB2YXJzWyJvbmVvZl9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpOworICAgIHZhcnNbIm9uZW9mX2luZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5pbmRleCgpKTsKKyAgICB2YXJzWyJjYXBfb25lb2ZfbmFtZSJdID0KKyAgICAgICAgVG9VcHBlcihkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKTsKKyAgICB2YXJzWyJjbGFzc25hbWUiXSA9IGNsYXNzbmFtZV87CisgICAgdmFyc1siaW5saW5lIl0gPSAoaXNfaW5saW5lID8gImlubGluZSAiIDogIiIpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJzLAorICAgICAgICAiJGlubGluZSQiCisgICAgICAgICJib29sICRjbGFzc25hbWUkOjpoYXNfJG9uZW9mX25hbWUkKCkgY29uc3Qge1xuIgorICAgICAgICAiICByZXR1cm4gJG9uZW9mX25hbWUkX2Nhc2UoKSAhPSAkY2FwX29uZW9mX25hbWUkX05PVF9TRVQ7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICIkaW5saW5lJCIKKyAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyX2hhc18kb25lb2ZfbmFtZSQoKSB7XG4iCisgICAgICAgICIgIF9vbmVvZl9jYXNlX1skb25lb2ZfaW5kZXgkXSA9ICRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVDtcbiIKKyAgICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZU9uZW9mTWVtYmVySGFzQml0cyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIFNpbmd1bGFyIGZpZWxkIGluIGEgb25lb2YKKyAgLy8gTi5CLjogV2l0aG91dCBmaWVsZCBwcmVzZW5jZSwgd2UgZG8gbm90IHVzZSBoYXMtYml0cyBvciBnZW5lcmF0ZQorICAvLyBoYXNfJG5hbWUkKCkgbWV0aG9kcywgYnV0IG9uZW9mcyBzdGlsbCBoYXZlIHNldF9oYXNfJG5hbWUkKCkuCisgIC8vIE9uZW9mcyBhbHNvIGhhdmUgaGFzXyRuYW1lJCgpIGJ1dCBvbmx5IGFzIGEgcHJpdmF0ZSBoZWxwZXIKKyAgLy8gbWV0aG9kLCBzbyB0aGF0IGdlbmVyYXRlZCBjb2RlIGlzIHNsaWdodGx5IGNsZWFuZXIgKHZzLiAgY29tcGFyaW5nCisgIC8vIF9vbmVvZl9jYXNlX1tpbmRleF0gYWdhaW5zdCBhIGNvbnN0YW50IGV2ZXJ5d2hlcmUpLgorICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIkaW5saW5lJCIKKyAgICAiYm9vbCAkY2xhc3NuYW1lJDo6aGFzXyRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAiICByZXR1cm4gJG9uZW9mX25hbWUkX2Nhc2UoKSA9PSBrJGZpZWxkX25hbWUkO1xuIgorICAgICJ9XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiJGlubGluZSQiCisgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF9oYXNfJG5hbWUkKCkge1xuIgorICAgICIgIF9vbmVvZl9jYXNlX1skb25lb2ZfaW5kZXgkXSA9IGskZmllbGRfbmFtZSQ7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZENsZWFyKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywKKyAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBHZW5lcmF0ZSBjbGVhcl8kbmFtZSQoKSAoU2VlIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlY2xhcmF0aW9ucyBhbmQKKyAgLy8gR2VuZXJhdGVEZXBlbmRlbnRGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zLCAkZGVwZW5kZW50X2NsYXNzbmFtZSQgaXMKKyAgLy8gc2V0IGJ5IHRoZSBHZW5lcmF0ZSpEZWZpbml0aW9ucyBmdW5jdGlvbnMuKQorICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIkdG1wbCQiCisgICAgIiRpbmxpbmUkIgorICAgICJ2b2lkICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6Y2xlYXJfJG5hbWUkKCkge1xuIik7CisKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAvLyBDbGVhciB0aGlzIGZpZWxkIG9ubHkgaWYgaXQgaXMgdGhlIGFjdGl2ZSBmaWVsZCBpbiB0aGlzIG9uZW9mLAorICAgIC8vIG90aGVyd2lzZSBpZ25vcmUKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImlmICgkdGhpc19tZXNzYWdlJGhhc18kbmFtZSQoKSkge1xuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKQorICAgICAgICAuR2VuZXJhdGVDbGVhcmluZ0NvZGUocHJpbnRlcik7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIkdGhpc19tZXNzYWdlJGNsZWFyX2hhc18kb25lb2ZfbmFtZSQoKTtcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0gZWxzZSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKQorICAgICAgICAuR2VuZXJhdGVDbGVhcmluZ0NvZGUocHJpbnRlcik7CisgICAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgIiR0aGlzX21lc3NhZ2UkY2xlYXJfaGFzXyRuYW1lJCgpO1xuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpIHsKICAgcHJpbnRlci0+UHJpbnQoIi8vICRjbGFzc25hbWUkXG5cbiIsICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKQEAgLTM4Niw3NiArNzUwLDE1NCBAQAogICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKIAogICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKLSAgICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhmaWVsZCwgJnZhcnMpOworICAgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGZpZWxkLCAmdmFycywgb3B0aW9uc18pOworICAgIHZhcnNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSAiIDogIiI7CisgICAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8gJiYgSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKKyAgICAgIHZhcnNbInRtcGwiXSA9ICJ0ZW1wbGF0ZTxjbGFzcyBUPlxuIjsKKyAgICAgIHZhcnNbImRlcGVuZGVudF9jbGFzc25hbWUiXSA9CisgICAgICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfKSArICI8VD4iOworICAgICAgdmFyc1sidGhpc19tZXNzYWdlIl0gPSAicmVpbnRlcnByZXRfY2FzdDxUKj4odGhpcyktPiI7CisgICAgICB2YXJzWyJ0aGlzX2NvbnN0X21lc3NhZ2UiXSA9ICJyZWludGVycHJldF9jYXN0PGNvbnN0IFQqPih0aGlzKS0+IjsKKyAgICB9IGVsc2UgeworICAgICAgdmFyc1sidG1wbCJdID0gIiI7CisgICAgICB2YXJzWyJkZXBlbmRlbnRfY2xhc3NuYW1lIl0gPSB2YXJzWyJjbGFzc25hbWUiXTsKKyAgICAgIHZhcnNbInRoaXNfbWVzc2FnZSJdID0gIiI7CisgICAgICB2YXJzWyJ0aGlzX2NvbnN0X21lc3NhZ2UiXSA9ICIiOworICAgIH0KIAogICAgIC8vIEdlbmVyYXRlIGhhc18kbmFtZSQoKSBvciAkbmFtZSRfc2l6ZSgpLgogICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewogICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICAgImlubGluZSBpbnQgJGNsYXNzbmFtZSQ6OiRuYW1lJF9zaXplKCkgY29uc3Qge1xuIgorICAgICAgICAiJGlubGluZSQiCisgICAgICAgICJpbnQgJGNsYXNzbmFtZSQ6OiRuYW1lJF9zaXplKCkgY29uc3Qge1xuIgogICAgICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCiAgICAgICAgICJ9XG4iKTsKKyAgICB9IGVsc2UgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIHZhcnNbImZpZWxkX25hbWUiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZmllbGQtPm5hbWUoKSwgdHJ1ZSk7CisgICAgICB2YXJzWyJvbmVvZl9uYW1lIl0gPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5uYW1lKCk7CisgICAgICB2YXJzWyJvbmVvZl9pbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpKTsKKyAgICAgIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXyB8fCAhSXNGaWVsZERlcGVuZGVudChmaWVsZCkpIHsKKyAgICAgICAgR2VuZXJhdGVPbmVvZk1lbWJlckhhc0JpdHMoZmllbGQsIHZhcnMsIHByaW50ZXIpOworICAgICAgfQogICAgIH0gZWxzZSB7CiAgICAgICAvLyBTaW5ndWxhciBmaWVsZC4KLSAgICAgIGNoYXIgYnVmZmVyW2tGYXN0VG9CdWZmZXJTaXplXTsKLSAgICAgIHZhcnNbImhhc19hcnJheV9pbmRleCJdID0gU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSAvIDMyKTsKLSAgICAgIHZhcnNbImhhc19tYXNrIl0gPSBGYXN0SGV4MzJUb0J1ZmZlcigxdSA8PCAoZmllbGQtPmluZGV4KCkgJSAzMiksIGJ1ZmZlcik7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAiaW5saW5lIGJvb2wgJGNsYXNzbmFtZSQ6Omhhc18kbmFtZSQoKSBjb25zdCB7XG4iCi0gICAgICAgICIgIHJldHVybiAoX2hhc19iaXRzX1skaGFzX2FycmF5X2luZGV4JF0gJiAweCRoYXNfbWFzayR1KSAhPSAwO1xuIgotICAgICAgICAifVxuIgotICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9oYXNfJG5hbWUkKCkge1xuIgotICAgICAgICAiICBfaGFzX2JpdHNfWyRoYXNfYXJyYXlfaW5kZXgkXSB8PSAweCRoYXNfbWFzayR1O1xuIgotICAgICAgICAifVxuIgotICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyX2hhc18kbmFtZSQoKSB7XG4iCi0gICAgICAgICIgIF9oYXNfYml0c19bJGhhc19hcnJheV9pbmRleCRdICY9IH4weCRoYXNfbWFzayR1O1xuIgotICAgICAgICAifVxuIgotICAgICAgICApOworICAgICAgaWYgKCF1c2VfZGVwZW5kZW50X2Jhc2VfIHx8ICFJc0ZpZWxkRGVwZW5kZW50KGZpZWxkKSkgeworICAgICAgICBHZW5lcmF0ZVNpbmd1bGFyRmllbGRIYXNCaXRzKGZpZWxkLCB2YXJzLCBwcmludGVyKTsKKyAgICAgIH0KICAgICB9CiAKLSAgICAvLyBHZW5lcmF0ZSBjbGVhcl8kbmFtZSQoKQotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmNsZWFyXyRuYW1lJCgpIHtcbiIpOwotCi0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKLSAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAgICAgICAgICAgICAgIiAgY2xlYXJfaGFzXyRuYW1lJCgpO1xuIik7CisgICAgaWYgKCF1c2VfZGVwZW5kZW50X2Jhc2VfIHx8ICFJc0ZpZWxkRGVwZW5kZW50KGZpZWxkKSkgeworICAgICAgR2VuZXJhdGVGaWVsZENsZWFyKGZpZWxkLCB2YXJzLCBwcmludGVyKTsKICAgICB9CiAKLSAgICBwcmludGVyLT5QcmludCgifVxuIik7Ci0KICAgICAvLyBHZW5lcmF0ZSB0eXBlLXNwZWNpZmljIGFjY2Vzc29ycy4KLSAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKKyAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2lubGluZSk7CiAKICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKICAgfQorCisgIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXykgeworICAgIC8vIEdlbmVyYXRlIGhhc18kbmFtZSQoKSBhbmQgY2xlYXJfaGFzXyRuYW1lJCgpIGZ1bmN0aW9ucyBmb3Igb25lb2ZzCisgICAgLy8gSWYgd2UgYXJlbid0IHVzaW5nIGEgZGVwZW5kZW50IGJhc2UsIHRoZXkgY2FuIGJlIHdpdGggdGhlIG90aGVyIGZ1bmN0aW9ucworICAgIC8vIHRoYXQgYXJlICNpZmRlZi1ndWFyZGVkLgorICAgIEdlbmVyYXRlT25lb2ZIYXNCaXRzKHByaW50ZXIsIGlzX2lubGluZSk7CisgIH0KK30KKworLy8gSGVscGVyIGZvciB0aGUgY29kZSB0aGF0IGVtaXRzIHRoZSBDbGVhcigpIG1ldGhvZC4KK3N0YXRpYyBib29sIENhbkNsZWFyQnlaZXJvaW5nKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpIHx8IGZpZWxkLT5pc19leHRlbnNpb24oKSkgcmV0dXJuIGZhbHNlOworICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRU5VTToKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCktPm51bWJlcigpID09IDA7CisgICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfSU5UMzI6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfaW50MzIoKSA9PSAwOworICAgIGNhc2UgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0lOVDY0OgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2ludDY0KCkgPT0gMDsKKyAgICBjYXNlIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDMyKCkgPT0gMDsKKyAgICBjYXNlIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICByZXR1cm4gZmllbGQtPmRlZmF1bHRfdmFsdWVfdWludDY0KCkgPT0gMDsKKyAgICBjYXNlIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9mbG9hdCgpID09IDA7CisgICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfRE9VQkxFOgorICAgICAgcmV0dXJuIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpID09IDA7CisgICAgY2FzZSBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfQk9PTDoKKyAgICAgIHJldHVybiBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9ib29sKCkgPT0gZmFsc2U7CisgICAgZGVmYXVsdDoKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXBlbmRlbnRCYXNlQ2xhc3NEZWZpbml0aW9uKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGlmICghdXNlX2RlcGVuZGVudF9iYXNlXykgeworICAgIHJldHVybjsKKyAgfQorCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1siY2xhc3NuYW1lIl0gPSBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoZGVzY3JpcHRvcl8pOworICB2YXJzWyJzdXBlcmNsYXNzIl0gPSBTdXBlckNsYXNzTmFtZShkZXNjcmlwdG9yXywgb3B0aW9uc18pOworCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgorICAgICJjbGFzcyAkY2xhc3NuYW1lJCA6IHB1YmxpYyAkc3VwZXJjbGFzcyQge1xuIgorICAgICIgcHVibGljOlxuIik7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIiRjbGFzc25hbWUkKCkge31cbiIKKyAgICAidmlydHVhbCB+JGNsYXNzbmFtZSQoKSB7fVxuIgorICAgICJcbiIpOworCisgIC8vIEdlbmVyYXRlIGRlcGVuZGVudCBhY2Nlc3NvciBtZXRob2RzIGZvciBhbGwgZmllbGRzLgorICBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7CisKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifTtcbiIpOwogfQogCiB2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgogR2VuZXJhdGVDbGFzc0RlZmluaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gbWFwIGVudHJ5IG1lc3NhZ2UgZG9lc24ndCBuZWVkIGNsYXNzIGRlZmluaXRpb24uIFNpbmNlIG1hcCBlbnRyeSBtZXNzYWdlCisgICAgLy8gY2Fubm90IGJlIGEgdG9wIGxldmVsIGNsYXNzLCB3ZSBqdXN0IG5lZWQgdG8gYXZvaWQgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQ2xhc3NEZWZpbml0aW9uIGhlcmUuCisgICAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkpIGNvbnRpbnVlOwogICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc0RlZmluaXRpb24ocHJpbnRlcik7CiAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CiAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOwogICAgIHByaW50ZXItPlByaW50KCJcbiIpOwogICB9CiAKKyAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8pIHsKKyAgICBHZW5lcmF0ZURlcGVuZGVudEJhc2VDbGFzc0RlZmluaXRpb24ocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgfQorCiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKICAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOwogICB2YXJzWyJmaWVsZF9jb3VudCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSk7Ci0gIGlmIChkbGxleHBvcnRfZGVjbF8uZW1wdHkoKSkgeworICB2YXJzWyJvbmVvZl9kZWNsX2NvdW50Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCkpOworICBpZiAob3B0aW9uc18uZGxsZXhwb3J0X2RlY2wuZW1wdHkoKSkgewogICAgIHZhcnNbImRsbGV4cG9ydCJdID0gIiI7CiAgIH0gZWxzZSB7Ci0gICAgdmFyc1siZGxsZXhwb3J0Il0gPSBkbGxleHBvcnRfZGVjbF8gKyAiICI7CisgICAgdmFyc1siZGxsZXhwb3J0Il0gPSBvcHRpb25zXy5kbGxleHBvcnRfZGVjbCArICIgIjsKICAgfQotICB2YXJzWyJzdXBlcmNsYXNzIl0gPSBTdXBlckNsYXNzTmFtZShkZXNjcmlwdG9yXyk7Ci0KKyAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8pIHsKKyAgICB2YXJzWyJzdXBlcmNsYXNzIl0gPQorICAgICAgICBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoZGVzY3JpcHRvcl8pICsgIjwiICsgY2xhc3NuYW1lXyArICI+IjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJzdXBlcmNsYXNzIl0gPSBTdXBlckNsYXNzTmFtZShkZXNjcmlwdG9yXywgb3B0aW9uc18pOworICB9CiAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgImNsYXNzICRkbGxleHBvcnQkJGNsYXNzbmFtZSQgOiBwdWJsaWMgJHN1cGVyY2xhc3MkIHtcbiIKLSAgICAiIHB1YmxpYzpcbiIpOworICAgICJjbGFzcyAkZGxsZXhwb3J0JCRjbGFzc25hbWUkIDogcHVibGljICRzdXBlcmNsYXNzJCB7XG4iKTsKKyAgcHJpbnRlci0+QW5ub3RhdGUoImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfKTsKKyAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8pIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLCAiICBmcmllbmQgY2xhc3MgJHN1cGVyY2xhc3MkO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoIiBwdWJsaWM6XG4iKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKICAgcHJpbnRlci0+UHJpbnQodmFycywKQEAgLTQ3MCwyMCArOTEyLDYyIEBACiAgICAgIn1cbiIKICAgICAiXG4iKTsKIAotICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJcbiIKKyAgICAgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHtcbiIKKyAgICAgICAgIiAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHVua25vd25fZmllbGRzKCkgY29uc3Qge1xuIgorICAgICAgICAgICIgIHJldHVybiBfdW5rbm93bl9maWVsZHNfLkdldChcbiIKKyAgICAgICAgICAiICAgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTtcbiIKKyAgICAgICAgICAifVxuIgorICAgICAgICAgICJcbiIKKyAgICAgICAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7XG4iCisgICAgICAgICAgIiAgcmV0dXJuIF91bmtub3duX2ZpZWxkc18uTXV0YWJsZShcbiIKKyAgICAgICAgICAiICAgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLFxuIgorICAgICAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICAgICAifVxuIgorICAgICAgICAgICJcbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gX3Vua25vd25fZmllbGRzXy5HZXROb0FyZW5hKFxuIgorICAgICAgICAgICIgICAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpO1xuIgorICAgICAgICAgICJ9XG4iCisgICAgICAgICAgIlxuIgorICAgICAgICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHtcbiIKKyAgICAgICAgICAiICByZXR1cm4gX3Vua25vd25fZmllbGRzXy5NdXRhYmxlTm9BcmVuYShcbiIKKyAgICAgICAgICAiICAgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTtcbiIKKyAgICAgICAgICAifVxuIgorICAgICAgICAgICJcbiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIE4uQi46IFdlIGV4Y2x1ZGUgR2V0QXJlbmEoKSB3aGVuIGFyZW5hIHN1cHBvcnQgaXMgZGlzYWJsZWQsIGZhbGxpbmcgYmFjayBvbgorICAvLyBNZXNzYWdlTGl0ZSdzIGltcGxlbWVudGF0aW9uIHdoaWNoIHJldHVybnMgTlVMTCByYXRoZXIgdGhhbiBnZW5lcmF0aW5nIG91cgorICAvLyBvd24gbWV0aG9kIHdoaWNoIHJldHVybnMgTlVMTCwgaW4gb3JkZXIgdG8gcmVkdWNlIGNvZGUgc2l6ZS4KKyAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgeworICAgIC8vIHZpcnR1YWwgbWV0aG9kIHZlcnNpb24gb2YgR2V0QXJlbmFOb1ZpcnR1YWwoKSwgcmVxdWlyZWQgZm9yIGdlbmVyaWMgZGlzcGF0Y2ggZ2l2ZW4gYQorICAgIC8vIE1lc3NhZ2VMaXRlKiAoZS5nLiwgaW4gUmVwZWF0ZWRGaWVsZDo6QWRkQWxsb2NhdGVkKCkpLgogICAgIHByaW50ZXItPlByaW50KAotICAgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7XG4iCi0gICAgICAiICByZXR1cm4gX3Vua25vd25fZmllbGRzXztcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiXG4iCi0gICAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkge1xuIgotICAgICAgIiAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIpOworICAgICAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hKCkgY29uc3QgeyByZXR1cm4gR2V0QXJlbmFOb1ZpcnR1YWwoKTsgfVxuIgorICAgICAgICAiaW5saW5lIHZvaWQqIEdldE1heWJlQXJlbmFQb2ludGVyKCkgY29uc3Qge1xuIgorICAgICAgICAiICByZXR1cm4gTWF5YmVBcmVuYVB0cigpO1xuIgorICAgICAgICAifVxuIik7CiAgIH0KIAogICAvLyBPbmx5IGdlbmVyYXRlIHRoaXMgbWVtYmVyIGlmIGl0J3Mgbm90IGRpc2FibGVkLgotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSAmJgogICAgICAgIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAgICJzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7XG4iKTsKQEAgLTQ5Myw3ICs5NzcsMzQgQEAKICAgICAic3RhdGljIGNvbnN0ICRjbGFzc25hbWUkJiBkZWZhdWx0X2luc3RhbmNlKCk7XG4iCiAgICAgIlxuIik7CiAKLSAgaWYgKCFTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgLy8gR2VuZXJhdGUgZW51bSB2YWx1ZXMgZm9yIGV2ZXJ5IGZpZWxkIGluIG9uZW9mcy4gT25lIGxpc3QgaXMgZ2VuZXJhdGVkIGZvcgorICAvLyBlYWNoIG9uZW9mIHdpdGggYW4gYWRkaXRpb25hbCAqX05PVF9TRVQgdmFsdWUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJlbnVtICRjYW1lbF9vbmVvZl9uYW1lJENhc2Uge1xuIiwKKyAgICAgICAgImNhbWVsX29uZW9mX25hbWUiLAorICAgICAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCksIHRydWUpKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJrJGZpZWxkX25hbWUkID0gJGZpZWxkX251bWJlciQsXG4iLAorICAgICAgICAgICJmaWVsZF9uYW1lIiwKKyAgICAgICAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKAorICAgICAgICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGQoaiktPm5hbWUoKSwgdHJ1ZSksCisgICAgICAgICAgImZpZWxkX251bWJlciIsCisgICAgICAgICAgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGQoaiktPm51bWJlcigpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUID0gMCxcbiIsCisgICAgICAgICJjYXBfb25lb2ZfbmFtZSIsCisgICAgICAgIFRvVXBwZXIoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSkpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIn07XG4iCisgICAgICAgICJcbiIpOworICB9CisKKyAgaWYgKCFTdGF0aWNJbml0aWFsaXplcnNGb3JjZWQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAgICIjaWZkZWYgR09PR0xFX1BST1RPQlVGX05PX1NUQVRJQ19JTklUSUFMSVpFUlxuIgogICAgICAgIi8vIFJldHVybnMgdGhlIGludGVybmFsIGRlZmF1bHQgaW5zdGFuY2UgcG9pbnRlci4gVGhpcyBmdW5jdGlvbiBjYW5cbiIKQEAgLTUwNywxNSArMTAxOCwzNyBAQAogICAgICAgIlxuIik7CiAgIH0KIAorCisgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInZvaWQgVW5zYWZlQXJlbmFTd2FwKCRjbGFzc25hbWUkKiBvdGhlcik7XG4iKTsKKyAgfQorCisgIGlmIChJc0FueU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICIvLyBpbXBsZW1lbnRzIEFueSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIgorICAgICAgIlxuIgorICAgICAgInZvaWQgUGFja0Zyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBtZXNzYWdlKTtcbiIKKyAgICAgICJ2b2lkIFBhY2tGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbWVzc2FnZSxcbiIKKyAgICAgICIgICAgICAgICAgICAgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHR5cGVfdXJsX3ByZWZpeCk7XG4iCisgICAgICAiYm9vbCBVbnBhY2tUbyg6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0O1xuIgorICAgICAgInRlbXBsYXRlPHR5cGVuYW1lIFQ+IGJvb2wgSXMoKSBjb25zdCB7XG4iCisgICAgICAiICByZXR1cm4gX2FueV9tZXRhZGF0YV8uSXM8VD4oKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKyAgfQorCiAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgInZvaWQgU3dhcCgkY2xhc3NuYW1lJCogb3RoZXIpO1xuIgorICAgICJHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHZvaWQgU3dhcCgkY2xhc3NuYW1lJCogb3RoZXIpO1xuIgogICAgICJcbiIKICAgICAiLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIKICAgICAiXG4iCi0gICAgIiRjbGFzc25hbWUkKiBOZXcoKSBjb25zdDtcbiIpOworICAgICJpbmxpbmUgJGNsYXNzbmFtZSQqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfVxuIgorICAgICJcbiIKKyAgICAiJGNsYXNzbmFtZSQqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7XG4iKTsKIAotICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICBpZiAoSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CiAgICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgICAidm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pO1xuIgogICAgICAgICAidm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTtcbiIpOwpAQCAtNTM1LDIyICsxMDY4LDkwIEBACiAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTtcbiIKICAgICAgICJ2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhcbiIKICAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7XG4iKTsKLSAgICBpZiAoSGFzRmFzdEFycmF5U2VyaWFsaXphdGlvbihkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIERpc2NhcmRVbmtub3duRmllbGRzKCkgaXMgaW1wbGVtZW50ZWQgaW4gbWVzc2FnZS5jYyB1c2luZyByZWZsZWN0aW9ucy4gV2UKKyAgICAvLyBuZWVkIHRvIGltcGxlbWVudCB0aGlzIGZ1bmN0aW9uIGluIGdlbmVyYXRlZCBjb2RlIGZvciBtZXNzYWdlcy4KKyAgICBpZiAoIVVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAidm9pZCBEaXNjYXJkVW5rbm93bkZpZWxkcygpO1xuIik7CisgICAgfQorICAgIGlmIChIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewogICAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7XG4iKTsKICAgICB9CiAgIH0KIAotICBwcmludGVyLT5QcmludCh2YXJzLAorICAvLyBDaGVjayBhbGwgRmllbGREZXNjcmlwdG9ycyBpbmNsdWRpbmcgdGhvc2UgaW4gb25lb2ZzIHRvIGVzdGltYXRlCisgIC8vIHdoZXRoZXIgOjpzdGQ6OnN0cmluZyBpcyBsaWtlbHkgdG8gYmUgdXNlZCwgYW5kIGRlcGVuZGluZyBvbiB0aGF0CisgIC8vIGVzdGltYXRlLCBzZXQgdXNlc19zdHJpbmdfIHRvIHRydWUgb3IgZmFsc2UuICBUaGF0IGNvbnRvbHMKKyAgLy8gd2hldGhlciB0byBmb3JjZSBpbml0aWFsaXphdGlvbiBvZiBlbXB0eV9zdHJpbmdfIGluIFNoYXJlZEN0b3IoKS4KKyAgLy8gSXQncyBvZnRlbiBhZHZhbnRhZ2VvdXMgdG8gZG8gc28gdG8ga2VlcCAiaXMgZW1wdHlfc3RyaW5nXworICAvLyBpbml0ZWQ/IiBjb2RlIGZyb20gYXBwZWFyaW5nIGFsbCBvdmVyIHRoZSBwbGFjZS4KKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGRlc2NyaXB0b3JzOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBkZXNjcmlwdG9ycy5wdXNoX2JhY2soZGVzY3JpcHRvcl8tPmZpZWxkKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgZGVzY3JpcHRvcnMucHVzaF9iYWNrKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKSk7CisgICAgfQorICB9CisgIHVzZXNfc3RyaW5nXyA9IGZhbHNlOworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSAmJgorICAgICAgIVVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICB1c2VzX3N0cmluZ18gPSB0cnVlOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcnMuc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcnNbaV07CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcpIHsKKyAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgIGRlZmF1bHQ6IHVzZXNfc3RyaW5nXyA9IHRydWU7IGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorCisgIHByaW50ZXItPlByaW50KAogICAgICJpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH1cbiIKICAgICAicHJpdmF0ZTpcbiIKICAgICAidm9pZCBTaGFyZWRDdG9yKCk7XG4iCiAgICAgInZvaWQgU2hhcmVkRHRvcigpO1xuIgogICAgICJ2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0O1xuIgotICAgICJwdWJsaWM6XG4iCi0gICAgIlxuIik7CisgICAgInZvaWQgSW50ZXJuYWxTd2FwKCRjbGFzc25hbWUkKiBvdGhlcik7XG4iLAorICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInByb3RlY3RlZDpcbiIKKyAgICAgICJleHBsaWNpdCAkY2xhc3NuYW1lJCg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7XG4iCisgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICJzdGF0aWMgdm9pZCBBcmVuYUR0b3Iodm9pZCogb2JqZWN0KTtcbiIKKyAgICAgICJpbmxpbmUgdm9pZCBSZWdpc3RlckFyZW5hRHRvcig6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICB9CiAKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7XG4iCisgICAgICAiICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHtcbiIKKyAgICAgICIgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAicHVibGljOlxuIgorICAgICAgIlxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAicHJpdmF0ZTpcbiIKKyAgICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7XG4iCisgICAgICAiICByZXR1cm4gX2FyZW5hX3B0cl87XG4iCisgICAgICAifVxuIgorICAgICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBNYXliZUFyZW5hUHRyKCkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuIF9hcmVuYV9wdHJfO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJwdWJsaWM6XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICBwcmludGVyLT5QcmludCgKICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7XG4iCiAgICAgICAiXG4iKTsKQEAgLTU2Nyw5ICsxMTY4LDExIEBACiAgIC8vIEltcG9ydCBhbGwgbmVzdGVkIG1lc3NhZ2UgY2xhc3NlcyBpbnRvIHRoaXMgY2xhc3MncyBzY29wZSB3aXRoIHR5cGVkZWZzLgogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKICAgICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZSA9IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKTsKLSAgICBwcmludGVyLT5QcmludCgidHlwZWRlZiAkbmVzdGVkX2Z1bGxfbmFtZSQgJG5lc3RlZF9uYW1lJDtcbiIsCi0gICAgICAgICAgICAgICAgICAgIm5lc3RlZF9uYW1lIiwgbmVzdGVkX3R5cGUtPm5hbWUoKSwKLSAgICAgICAgICAgICAgICAgICAibmVzdGVkX2Z1bGxfbmFtZSIsIENsYXNzTmFtZShuZXN0ZWRfdHlwZSwgZmFsc2UpKTsKKyAgICBpZiAoIUlzTWFwRW50cnlNZXNzYWdlKG5lc3RlZF90eXBlKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoInR5cGVkZWYgJG5lc3RlZF9mdWxsX25hbWUkICRuZXN0ZWRfbmFtZSQ7XG4iLAorICAgICAgICAgICAgICAgICAgICAgIm5lc3RlZF9uYW1lIiwgbmVzdGVkX3R5cGUtPm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICJuZXN0ZWRfZnVsbF9uYW1lIiwgQ2xhc3NOYW1lKG5lc3RlZF90eXBlLCBmYWxzZSkpOworICAgIH0KICAgfQogCiAgIGlmIChkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKSA+IDApIHsKQEAgLTYwNSwxOCArMTIwOCw2NiBAQAogICBwcmludGVyLT5QcmludCgiIHByaXZhdGU6XG4iKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKKwogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKICAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJpbmxpbmUgdm9pZCBzZXRfaGFzXyRuYW1lJCgpO1xuIiwKLSAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSk7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImlubGluZSB2b2lkIGNsZWFyX2hhc18kbmFtZSQoKTtcbiIsCi0gICAgICAgICJuYW1lIiwgRmllbGROYW1lKGRlc2NyaXB0b3JfLT5maWVsZChpKSkpOworICAgICAgLy8gc2V0X2hhc18qKiooKSBnZW5lcmF0ZWQgaW4gYWxsIHByb3RvMS8yIGNvZGUgYW5kIGluIG9uZW9mcyAob25seSkgZm9yCisgICAgICAvLyBtZXNzYWdlcyB3aXRob3V0IHRydWUgZmllbGQgcHJlc2VuY2UuCisgICAgICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSB8fAorICAgICAgICAgIGRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpbmxpbmUgdm9pZCBzZXRfaGFzXyRuYW1lJCgpO1xuIiwKKyAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKKyAgICAgIH0KKyAgICAgIC8vIGNsZWFyX2hhc18qKiooKSBnZW5lcmF0ZWQgb25seSBmb3Igbm9uLW9uZW9mIGZpZWxkcworICAgICAgLy8gaW4gcHJvdG8xLzIuCisgICAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpICYmCisgICAgICAgICAgSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaW5saW5lIHZvaWQgY2xlYXJfaGFzXyRuYW1lJCgpO1xuIiwKKyAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShkZXNjcmlwdG9yXy0+ZmllbGQoaSkpKTsKKyAgICAgIH0KICAgICB9CiAgIH0KICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CiAKKyAgLy8gR2VuZXJhdGUgb25lb2YgZnVuY3Rpb24gZGVjbGFyYXRpb25zCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpbmxpbmUgYm9vbCBoYXNfJG9uZW9mX25hbWUkKCkgY29uc3Q7XG4iCisgICAgICAgICJ2b2lkIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgICAiaW5saW5lIHZvaWQgY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuXG4iLAorICAgICAgICAib25lb2ZfbmFtZSIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpOworICB9CisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pICYmCisgICAgICAhZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpICYmCisgICAgICBudW1fcmVxdWlyZWRfZmllbGRzXyA+IDEpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIi8vIGhlbHBlciBmb3IgQnl0ZVNpemUoKVxuIgorICAgICAgICAiaW50IFJlcXVpcmVkRmllbGRzQnl0ZVNpemVGYWxsYmFjaygpIGNvbnN0O1xuXG4iKTsKKyAgfQorCisgIC8vIFByZXBhcmUgZGVjbHMgZm9yIF9jYWNoZWRfc2l6ZV8gYW5kIF9oYXNfYml0c18uICBUaGVpciBwb3NpdGlvbiBpbiB0aGUKKyAgLy8gb3V0cHV0IHdpbGwgYmUgZGV0ZXJtaW5lZCBsYXRlci4KKworICBib29sIG5lZWRfdG9fZW1pdF9jYWNoZWRfc2l6ZSA9IHRydWU7CisgIC8vIFRPRE8oa2VudG9uKTogIE1ha2UgX2NhY2hlZF9zaXplXyBhbiBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KKyAgY29uc3Qgc3RyaW5nIGNhY2hlZF9zaXplX2RlY2wgPSAibXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXztcbiI7CisKKyAgLy8gVE9ETyhqaWVsdW8pIC0gT3B0aW1pemUgX2hhc19iaXRzXyBmb3IgcmVwZWF0ZWQgYW5kIG9uZW9mIGZpZWxkcy4KKyAgc2l6ZV90IHNpemVvZl9oYXNfYml0cyA9IChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSArIDMxKSAvIDMyICogNDsKKyAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpID09IDApIHsKKyAgICAvLyBaZXJvLXNpemUgYXJyYXlzIGFyZW4ndCB0ZWNobmljYWxseSBhbGxvd2VkLCBhbmQgTVNWQyBpbiBwYXJ0aWN1bGFyCisgICAgLy8gZG9lc24ndCBsaWtlIHRoZW0uICBXZSBzdGlsbCBuZWVkIHRvIGRlY2xhcmUgdGhlc2UgYXJyYXlzIHRvIG1ha2UKKyAgICAvLyBvdGhlciBjb2RlIGNvbXBpbGUuICBTaW5jZSB0aGlzIGlzIGFuIHVuY29tbW9uIGNhc2UsIHdlJ2xsIGp1c3QgZGVjbGFyZQorICAgIC8vIHRoZW0gd2l0aCBzaXplIDEgYW5kIHdhc3RlIHNvbWUgc3BhY2UuICBPaCB3ZWxsLgorICAgIHNpemVvZl9oYXNfYml0cyA9IDQ7CisgIH0KKyAgY29uc3Qgc3RyaW5nIGhhc19iaXRzX2RlY2wgPSBzaXplb2ZfaGFzX2JpdHMgPT0gMCA/ICIiIDoKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyIgKyBTaW1wbGVJdG9hKHNpemVvZl9oYXNfYml0cyAvIDQpICsgIl07XG4iOworCisKICAgLy8gVG8gbWluaW1pemUgcGFkZGluZywgZGF0YSBtZW1iZXJzIGFyZSBkaXZpZGVkIGludG8gdGhyZWUgc2VjdGlvbnM6CiAgIC8vICgxKSBtZW1iZXJzIGFzc3VtZWQgdG8gYWxpZ24gdG8gOCBieXRlcwogICAvLyAoMikgbWVtYmVycyBjb3JyZXNwb25kaW5nIHRvIG1lc3NhZ2UgZmllbGRzLCByZS1vcmRlcmVkIHRvIG9wdGltaXplCkBAIC02MzEsNTggKzEyODIsMTQxIEBACiAgICAgICAiXG4iKTsKICAgfQogCi0gIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXztcbiIKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBfdW5rbm93bl9maWVsZHNfO1xuIgorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIF9hcmVuYV9wdHJfO1xuIgogICAgICAgIlxuIik7CiAgIH0KIAorICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE7XG4iCisgICAgICAidHlwZWRlZiB2b2lkIEludGVybmFsQXJlbmFDb25zdHJ1Y3RhYmxlXztcbiIKKyAgICAgICJ0eXBlZGVmIHZvaWQgRGVzdHJ1Y3RvclNraXBwYWJsZV87XG4iKTsKKyAgfQorCisgIGlmIChIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gX2hhc19iaXRzXyBpcyBmcmVxdWVudGx5IGFjY2Vzc2VkLCBzbyB0byByZWR1Y2UgY29kZSBzaXplIGFuZCBpbXByb3ZlCisgICAgLy8gc3BlZWQsIGl0IHNob3VsZCBiZSBjbG9zZSB0byB0aGUgc3RhcnQgb2YgdGhlIG9iamVjdC4gIEJ1dCwgdHJ5IG5vdCB0bworICAgIC8vIHdhc3RlIHNwYWNlOl9oYXNfYml0c18gYnkgaXRzZWxmIGFsd2F5cyBtYWtlcyBzZW5zZSBpZiBpdHMgc2l6ZSBpcyBhCisgICAgLy8gbXVsdGlwbGUgb2YgOCwgYnV0LCBvdGhlcndpc2UsIG1heWJlIF9oYXNfYml0c18gYW5kIGNhY2hlZF9zaXplXyB0b2dldGhlcgorICAgIC8vIHdpbGwgd29yayB3ZWxsLgorICAgIHByaW50ZXItPlByaW50KGhhc19iaXRzX2RlY2wuY19zdHIoKSk7CisgICAgaWYgKChzaXplb2ZfaGFzX2JpdHMgJSA4KSAhPSAwKSB7CisgICAgICBwcmludGVyLT5QcmludChjYWNoZWRfc2l6ZV9kZWNsLmNfc3RyKCkpOworICAgICAgbmVlZF90b19lbWl0X2NhY2hlZF9zaXplID0gZmFsc2U7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFdpdGhvdXQgZmllbGQgcHJlc2VuY2UsIHdlIG5lZWQgYW5vdGhlciB3YXkgdG8gZGlzYW1iaWd1YXRlIHRoZSBkZWZhdWx0CisgICAgLy8gaW5zdGFuY2UsIGJlY2F1c2UgdGhlIGRlZmF1bHQgaW5zdGFuY2UncyBzdWJtZXNzYWdlIGZpZWxkcyAoaWYgYW55KSBzdG9yZQorICAgIC8vIHBvaW50ZXJzIHRvIHRoZSBkZWZhdWx0IGluc3RhbmNlcyBvZiB0aGUgc3VibWVzc2FnZXMgZXZlbiB3aGVuIHRoZXkKKyAgICAvLyBhcmVuJ3QgcHJlc2VudC4gQWx0ZXJuYXRpdmVzIHRvIHRoaXMgYXBwcm9hY2ggbWlnaHQgYmUgdG8gKGkpIHVzZSBhCisgICAgLy8gdGFnZ2VkIHBvaW50ZXIgb24gYWxsIG1lc3NhZ2UgZmllbGRzLCBzZXR0aW5nIGEgdGFnIGJpdCBmb3IgIm5vdCByZWFsbHkKKyAgICAvLyBwcmVzZW50LCBqdXN0IGRlZmF1bHQgaW5zdGFuY2UiOyBvciAoaWkpIGNvbXBhcmluZyB8dGhpc3wgYWdhaW5zdCB0aGUKKyAgICAvLyByZXR1cm4gdmFsdWUgZnJvbSBHZW5lcmF0ZWRNZXNzYWdlRmFjdG9yeTo6R2V0UHJvdG90eXBlKCkgaW4gYWxsCisgICAgLy8gaGFzXyRmaWVsZCQoKSBjYWxscy4gSG93ZXZlciwgYm90aCBvZiB0aGVzZSBvcHRpb25zIGFyZSBtdWNoIG1vcmUKKyAgICAvLyBleHBlbnNpdmUgKGluIGNvZGUgc2l6ZSBhbmQgQ1BVIG92ZXJoZWFkKSB0aGFuIGp1c3QgY2hlY2tpbmcgYSBmaWVsZCBpbgorICAgIC8vIHRoZSBtZXNzYWdlLiBMb25nLXRlcm0sIHRoZSBiZXN0IHNvbHV0aW9uIHdvdWxkIGJlIHRvIHJlYXJjaGl0ZWN0IHRoZQorICAgIC8vIGRlZmF1bHQgaW5zdGFuY2UgZGVzaWduIG5vdCB0byBzdG9yZSBwb2ludGVycyB0byBzdWJtZXNzYWdlIGRlZmF1bHQKKyAgICAvLyBpbnN0YW5jZXMsIGFuZCBoYXZlIHJlZmxlY3Rpb24gZ2V0IHRob3NlIHNvbWUgb3RoZXIgd2F5OyBidXQgdGhhdCBjaGFuZ2UKKyAgICAvLyB3b3VsZCBoYXZlIHRvbyBtdWNoIGltcGFjdCBvbiBwcm90bzIuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiYm9vbCBfaXNfZGVmYXVsdF9pbnN0YW5jZV87XG4iKTsKKyAgfQorCiAgIC8vIEZpZWxkIG1lbWJlcnM6CiAKKyAgLy8gTGlzdCBmaWVsZHMgd2hpY2ggZG9lc24ndCBiZWxvbmcgdG8gYW55IG9uZW9mCiAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGhhc2hfbWFwPHN0cmluZywgaW50PiBmaWVsZG5hbWVfdG9fY2h1bms7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvcl8tPmZpZWxkKGkpKTsKKyAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgICAgZmllbGRzLnB1c2hfYmFjayhmaWVsZCk7CisgICAgICBmaWVsZG5hbWVfdG9fY2h1bmtbRmllbGROYW1lKGZpZWxkKV0gPSBpIC8gODsKKyAgICB9CiAgIH0KICAgT3B0aW1pemVQYWRkaW5nKCZmaWVsZHMpOworICAvLyBFbWl0IHNvbWUgcHJpdmF0ZSBhbmQgc3RhdGljIG1lbWJlcnMKKyAgcnVuc19vZl9maWVsZHNfID0gdmVjdG9yPCB2ZWN0b3I8c3RyaW5nPiA+KDEpOwogICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgewotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZHNbaV0pLkdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMocHJpbnRlcik7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGZpZWxkc1tpXTsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvciYgZ2VuZXJhdG9yID0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKTsKKyAgICBnZW5lcmF0b3IuR2VuZXJhdGVTdGF0aWNNZW1iZXJzKHByaW50ZXIpOworICAgIGdlbmVyYXRvci5HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKHByaW50ZXIpOworICAgIGlmIChDYW5DbGVhckJ5WmVyb2luZyhmaWVsZCkpIHsKKyAgICAgIGNvbnN0IHN0cmluZyYgZmllbGRuYW1lID0gRmllbGROYW1lKGZpZWxkKTsKKyAgICAgIGlmICghcnVuc19vZl9maWVsZHNfLmJhY2soKS5lbXB0eSgpICYmCisgICAgICAgICAgKGZpZWxkbmFtZV90b19jaHVua1tydW5zX29mX2ZpZWxkc18uYmFjaygpLmJhY2soKV0gIT0KKyAgICAgICAgICAgZmllbGRuYW1lX3RvX2NodW5rW2ZpZWxkbmFtZV0pKSB7CisgICAgICAgIHJ1bnNfb2ZfZmllbGRzXy5wdXNoX2JhY2sodmVjdG9yPHN0cmluZz4oKSk7CisgICAgICB9CisgICAgICBydW5zX29mX2ZpZWxkc18uYmFjaygpLnB1c2hfYmFjayhmaWVsZG5hbWUpOworICAgIH0gZWxzZSBpZiAoIXJ1bnNfb2ZfZmllbGRzXy5iYWNrKCkuZW1wdHkoKSkgeworICAgICAgcnVuc19vZl9maWVsZHNfLnB1c2hfYmFjayh2ZWN0b3I8c3RyaW5nPigpKTsKKyAgICB9CisgIH0KKworICAvLyBGb3IgZWFjaCBvbmVvZiBnZW5lcmF0ZSBhIHVuaW9uCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ1bmlvbiAkY2FtZWxfb25lb2ZfbmFtZSRVbmlvbiB7XG4iCisgICAgICAgIC8vIGV4cGxpY2l0IGVtcHR5IGNvbnN0cnVjdG9yIGlzIG5lZWRlZCB3aGVuIHVuaW9uIGNvbnRhaW5zCisgICAgICAgIC8vIEFyZW5hU3RyaW5nUHRyIG1lbWJlcnMgZm9yIHN0cmluZyBmaWVsZHMuCisgICAgICAgICIgICRjYW1lbF9vbmVvZl9uYW1lJFVuaW9uKCkge31cbiIsCisgICAgICAgICJjYW1lbF9vbmVvZl9uYW1lIiwKKyAgICAgICAgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpLCB0cnVlKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGRfY291bnQoKTsgaisrKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkKGopKS5HZW5lcmF0ZVByaXZhdGVNZW1iZXJzKHByaW50ZXIpOworICAgIH0KKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9ICRvbmVvZl9uYW1lJF87XG4iLAorICAgICAgICAib25lb2ZfbmFtZSIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZChqKSkuR2VuZXJhdGVTdGF0aWNNZW1iZXJzKHByaW50ZXIpOworICAgIH0KICAgfQogCiAgIC8vIE1lbWJlcnMgYXNzdW1lZCB0byBhbGlnbiB0byA0IGJ5dGVzOgogCi0gIC8vIFRPRE8oa2VudG9uKTogIE1ha2UgX2NhY2hlZF9zaXplXyBhbiBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiXG4iCi0gICAgICAibXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXztcbiIpOworICBpZiAobmVlZF90b19lbWl0X2NhY2hlZF9zaXplKSB7CisgICAgcHJpbnRlci0+UHJpbnQoY2FjaGVkX3NpemVfZGVjbC5jX3N0cigpKTsKKyAgICBuZWVkX3RvX2VtaXRfY2FjaGVkX3NpemUgPSBmYWxzZTsKKyAgfQogCi0gIC8vIEdlbmVyYXRlIF9oYXNfYml0c18uCi0gIGlmIChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSA+IDApIHsKKyAgLy8gR2VuZXJhdGUgX29uZW9mX2Nhc2VfLgorICBpZiAoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKCRmaWVsZF9jb3VudCQgKyAzMSkgLyAzMl07XG4iCisgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX29uZW9mX2Nhc2VfWyRvbmVvZl9kZWNsX2NvdW50JF07XG4iCiAgICAgICAiXG4iKTsKLSAgfSBlbHNlIHsKLSAgICAvLyBaZXJvLXNpemUgYXJyYXlzIGFyZW4ndCB0ZWNobmljYWxseSBhbGxvd2VkLCBhbmQgTVNWQyBpbiBwYXJ0aWN1bGFyCi0gICAgLy8gZG9lc24ndCBsaWtlIHRoZW0uICBXZSBzdGlsbCBuZWVkIHRvIGRlY2xhcmUgdGhlc2UgYXJyYXlzIHRvIG1ha2UKLSAgICAvLyBvdGhlciBjb2RlIGNvbXBpbGUuICBTaW5jZSB0aGlzIGlzIGFuIHVuY29tbW9uIGNhc2UsIHdlJ2xsIGp1c3QgZGVjbGFyZQotICAgIC8vIHRoZW0gd2l0aCBzaXplIDEgYW5kIHdhc3RlIHNvbWUgc3BhY2UuICBPaCB3ZWxsLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07XG4iCi0gICAgICAiXG4iKTsKKyAgfQorCisgIC8vIEdlbmVyYXRlIF9hbnlfbWV0YWRhdGFfIGZvciB0aGUgQW55IHR5cGUuCisgIGlmIChJc0FueU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbnlNZXRhZGF0YSBfYW55X21ldGFkYXRhXztcbiIpOwogICB9CiAKICAgLy8gRGVjbGFyZSBBZGREZXNjcmlwdG9ycygpLCBCdWlsZERlc2NyaXB0b3JzKCksIGFuZCBTaHV0ZG93bkZpbGUoKSBhcwogICAvLyBmcmllbmRzIHNvIHRoYXQgdGhleSBjYW4gYWNjZXNzIHByaXZhdGUgc3RhdGljIHZhcmlhYmxlcyBsaWtlCiAgIC8vIGRlZmF1bHRfaW5zdGFuY2VfIGFuZCByZWZsZWN0aW9uXy4KICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIHByaW50ZXIsCi0gICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotICAgICJmcmllbmQgdm9pZCAkZGxsZXhwb3J0X2RlY2wkICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAotICAgIC8vIFdpdGhvdXQuCi0gICAgImZyaWVuZCB2b2lkICRkbGxleHBvcnRfZGVjbCQgJGFkZGRlc2NyaXB0b3JzbmFtZSRfaW1wbCgpO1xuIiwKLSAgICAvLyBWYXJzLgotICAgICJkbGxleHBvcnRfZGVjbCIsIGRsbGV4cG9ydF9kZWNsXywKLSAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwKLSAgICBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSk7CisgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKKyAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAgICJmcmllbmQgdm9pZCAkZGxsZXhwb3J0X2RlY2wkICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAorICAgICAgLy8gV2l0aG91dC4KKyAgICAgICJmcmllbmQgdm9pZCAkZGxsZXhwb3J0X2RlY2wkICRhZGRkZXNjcmlwdG9yc25hbWUkX2ltcGwoKTtcbiIsCisgICAgICAvLyBWYXJzLgorICAgICAgImRsbGV4cG9ydF9kZWNsIiwgb3B0aW9uc18uZGxsZXhwb3J0X2RlY2wsICJhZGRkZXNjcmlwdG9yc25hbWUiLAorICAgICAgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOwogCiAgIHByaW50ZXItPlByaW50KAogICAgICJmcmllbmQgdm9pZCAkYXNzaWduZGVzY3JpcHRvcnNuYW1lJCgpO1xuIgpAQCAtNjk5LDI2ICsxNDMzLDkyIEBACiAKICAgcHJpbnRlci0+T3V0ZGVudCgpOwogICBwcmludGVyLT5QcmludCh2YXJzLCAifTsiKTsKKyAgR09PR0xFX0RDSEVDSyghbmVlZF90b19lbWl0X2NhY2hlZF9zaXplKTsKIH0KIAogdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworR2VuZXJhdGVEZXBlbmRlbnRJbmxpbmVNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewotICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVJbmxpbmVNZXRob2RzKHByaW50ZXIpOworICAgIC8vIG1hcCBlbnRyeSBtZXNzYWdlIGRvZXNuJ3QgbmVlZCBpbmxpbmUgbWV0aG9kcy4gU2luY2UgbWFwIGVudHJ5IG1lc3NhZ2UKKyAgICAvLyBjYW5ub3QgYmUgYSB0b3AgbGV2ZWwgY2xhc3MsIHdlIGp1c3QgbmVlZCB0byBhdm9pZCBjYWxsaW5nCisgICAgLy8gR2VuZXJhdGVJbmxpbmVNZXRob2RzIGhlcmUuCisgICAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkpIGNvbnRpbnVlOworICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXBlbmRlbnRJbmxpbmVNZXRob2RzKHByaW50ZXIpOwogICAgIHByaW50ZXItPlByaW50KGtUaGluU2VwYXJhdG9yKTsKICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKICAgfQogCi0gIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKHByaW50ZXIpOworICBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyKTsKK30KKwordm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gbWFwIGVudHJ5IG1lc3NhZ2UgZG9lc24ndCBuZWVkIGlubGluZSBtZXRob2RzLiBTaW5jZSBtYXAgZW50cnkgbWVzc2FnZQorICAgIC8vIGNhbm5vdCBiZSBhIHRvcCBsZXZlbCBjbGFzcywgd2UganVzdCBuZWVkIHRvIGF2b2lkIGNhbGxpbmcKKyAgICAvLyBHZW5lcmF0ZUlubGluZU1ldGhvZHMgaGVyZS4KKyAgICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKSkgY29udGludWU7CisgICAgbmVzdGVkX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZUlubGluZU1ldGhvZHMocHJpbnRlciwgaXNfaW5saW5lKTsKKyAgICBwcmludGVyLT5QcmludChrVGhpblNlcGFyYXRvcik7CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CisgIH0KKworICBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhwcmludGVyLCBpc19pbmxpbmUpOworCisgIC8vIEdlbmVyYXRlIG9uZW9mX2Nhc2UoKSBmdW5jdGlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbImNsYXNzX25hbWUiXSA9IGNsYXNzbmFtZV87CisgICAgdmFyc1siY2FtZWxfb25lb2ZfbmFtZSJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZSgKKyAgICAgICAgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSwgdHJ1ZSk7CisgICAgdmFyc1sib25lb2ZfbmFtZSJdID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKTsKKyAgICB2YXJzWyJvbmVvZl9pbmRleCJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+aW5kZXgoKSk7CisgICAgdmFyc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lICIgOiAiIjsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFycywKKyAgICAgICAgIiRpbmxpbmUkIgorICAgICAgICAiJGNsYXNzX25hbWUkOjokY2FtZWxfb25lb2ZfbmFtZSRDYXNlICRjbGFzc19uYW1lJDo6IgorICAgICAgICAiJG9uZW9mX25hbWUkX2Nhc2UoKSBjb25zdCB7XG4iCisgICAgICAgICIgIHJldHVybiAkY2xhc3NfbmFtZSQ6OiRjYW1lbF9vbmVvZl9uYW1lJENhc2UoIgorICAgICAgICAiX29uZW9mX2Nhc2VfWyRvbmVvZl9pbmRleCRdKTtcbiIKKyAgICAgICAgIn1cbiIpOworICB9CiB9CiAKIHZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CiBHZW5lcmF0ZURlc2NyaXB0b3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogJG5hbWUkX2Rlc2NyaXB0b3JfID0gTlVMTDtcbiIKLSAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qXG4iCi0gICAgIiAgJG5hbWUkX3JlZmxlY3Rpb25fID0gTlVMTDtcbiIsCi0gICAgIm5hbWUiLCBjbGFzc25hbWVfKTsKKyAgaWYgKCFJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqICRuYW1lJF9kZXNjcmlwdG9yXyA9IE5VTEw7XG4iCisgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qXG4iCisgICAgICAiICAkbmFtZSRfcmVmbGVjdGlvbl8gPSBOVUxMO1xuIiwKKyAgICAgICJuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiAkbmFtZSRfZGVzY3JpcHRvcl8gPSBOVUxMO1xuIiwKKyAgICAgICJuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0KKworICAvLyBHZW5lcmF0ZSBvbmVvZiBkZWZhdWx0IGluc3RhbmNlIGZvciByZWZsZWN0aW9uIHVzYWdlLgorICBpZiAoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgic3RydWN0ICRuYW1lJE9uZW9mSW5zdGFuY2Uge1xuIiwKKyAgICAgICAgICAgICAgICAgICAibmFtZSIsIGNsYXNzbmFtZV8pOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIiAgIik7CisgICAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSB8fAorICAgICAgICAgICAgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkcgJiYKKyAgICAgICAgICAgICBFZmZlY3RpdmVTdHJpbmdDVHlwZShmaWVsZCkgIT0gRmllbGRPcHRpb25zOjpTVFJJTkcpKSB7CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoImNvbnN0ICIpOworICAgICAgICB9CisgICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVQcml2YXRlTWVtYmVycyhwcmludGVyKTsKKyAgICAgIH0KKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCgifSogJG5hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfID0gTlVMTDtcbiIsCisgICAgICAgICAgICAgICAgICAgIm5hbWUiLCBjbGFzc25hbWVfKTsKKyAgfQogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewogICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVEZXNjcmlwdG9yRGVjbGFyYXRpb25zKHByaW50ZXIpOwpAQCAtNzUwLDE5ICsxNTUwLDQ0IEBACiAgICAgICAgICIkcGFyZW50JF9kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoJGluZGV4JCk7XG4iKTsKICAgfQogCisgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXykpIHJldHVybjsKKwogICAvLyBHZW5lcmF0ZSB0aGUgb2Zmc2V0cy4KICAgR2VuZXJhdGVPZmZzZXRzKHByaW50ZXIpOwogCisgIGNvbnN0IGJvb2wgcGFzc19wb29sX2FuZF9mYWN0b3J5ID0gZmFsc2U7CisgIHZhcnNbImZuIl0gPSBwYXNzX3Bvb2xfYW5kX2ZhY3RvcnkgPworICAgICAgIm5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiIgOgorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIgorICAgICAgIjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24iOwogICAvLyBDb25zdHJ1Y3QgdGhlIHJlZmxlY3Rpb24gb2JqZWN0LgogICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICIkY2xhc3NuYW1lJF9yZWZsZWN0aW9uXyA9XG4iCi0gICAgIiAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKFxuIgorICAgICIgICRmbiQoXG4iCiAgICAgIiAgICAkY2xhc3NuYW1lJF9kZXNjcmlwdG9yXyxcbiIKICAgICAiICAgICRjbGFzc25hbWUkOjpkZWZhdWx0X2luc3RhbmNlXyxcbiIKLSAgICAiICAgICRjbGFzc25hbWUkX29mZnNldHNfLFxuIgotICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgkY2xhc3NuYW1lJCwgX2hhc19iaXRzX1swXSksXG4iCisgICAgIiAgICAkY2xhc3NuYW1lJF9vZmZzZXRzXyxcbiIpOworICBpZiAoIUhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAvLyBJZiB3ZSBkb24ndCBoYXZlIGZpZWxkIHByZXNlbmNlLCB0aGVuIF9oYXNfYml0c18gZG9lcyBub3QgZXhpc3QuCisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiICAgIC0xLFxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoJGNsYXNzbmFtZSQsIF9oYXNfYml0c19bMF0pLFxuIik7CisgIH0KKworICAvLyBVbmtub3duIGZpZWxkIG9mZnNldDogZWl0aGVyIHBvaW50cyB0byB0aGUgdW5rbm93biBmaWVsZCBzZXQgaWYgZW1iZWRkZWQKKyAgLy8gZGlyZWN0bHksIG9yIGluZGljYXRlcyB0aGF0IHRoZSB1bmtub3duIGZpZWxkIHNldCBpcyBzdG9yZWQgYXMgcGFydCBvZiB0aGUKKyAgLy8gaW50ZXJuYWwgbWV0YWRhdGEgaWYgbm90LgorICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIiAgICAtMSxcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCiAgICAgIiAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKCIKICAgICAgICIkY2xhc3NuYW1lJCwgX3Vua25vd25fZmllbGRzXyksXG4iKTsKKyAgfQorCiAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCkBAIC03NzIsMTAgKzE1OTcsNDcgQEAKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgIiAgICAtMSxcbiIpOwogICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiICAgICRjbGFzc25hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfLFxuIgorICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCisgICAgICAiJGNsYXNzbmFtZSQsIF9vbmVvZl9jYXNlX1swXSksXG4iKTsKKyAgfQorCisgIGlmIChwYXNzX3Bvb2xfYW5kX2ZhY3RvcnkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLFxuIik7CisgICAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgICAgICAgICAgICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLFxuIik7CisgIH0KKwogICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSxcbiIKLSAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksXG4iCi0gICAgIiAgICBzaXplb2YoJGNsYXNzbmFtZSQpKTtcbiIpOworICAgICIgICAgc2l6ZW9mKCRjbGFzc25hbWUkKSxcbiIpOworCisgIC8vIEFyZW5hIG9mZnNldDogZWl0aGVyIGFuIG9mZnNldCB0byB0aGUgbWV0YWRhdGEgc3RydWN0IHRoYXQgY29udGFpbnMgdGhlCisgIC8vIGFyZW5hIHBvaW50ZXIgYW5kIHVua25vd24gZmllbGQgc2V0IChpbiBhIHNwYWNlLWVmZmljaWVudCB3YXkpIGlmIHdlIHVzZQorICAvLyB0aGF0IGltcGxlbWVudGF0aW9uIHN0cmF0ZWd5LCBvciBhbiBvZmZzZXQgZGlyZWN0bHkgdG8gdGhlIGFyZW5hIHBvaW50ZXIgaWYKKyAgLy8gbm90IChiZWNhdXNlIGUuZy4gd2UgZG9uJ3QgaGF2ZSBhbiB1bmtub3duIGZpZWxkIHNldCkuCisgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoIgorICAgICIkY2xhc3NuYW1lJCwgX2ludGVybmFsX21ldGFkYXRhXyksXG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCisgICAgIiRjbGFzc25hbWUkLCBfYXJlbmFfKSxcbiIpOworICB9CisKKyAgLy8gaXNfZGVmYXVsdF9pbnN0YW5jZV8gb2Zmc2V0LgorICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgIiAgICAtMSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICIgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgiCisgICAgIiRjbGFzc25hbWUkLCBfaXNfZGVmYXVsdF9pbnN0YW5jZV8pKTtcbiIpOworICB9CiAKICAgLy8gSGFuZGxlIG5lc3RlZCB0eXBlcy4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CkBAIC03OTAsMTAgKzE2NTIsMzcgQEAKIHZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CiBHZW5lcmF0ZVR5cGVSZWdpc3RyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIC8vIFJlZ2lzdGVyIHRoaXMgbWVzc2FnZSB0eXBlIHdpdGggdGhlIG1lc3NhZ2UgZmFjdG9yeS4KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKFxuIgotICAgICIgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfLCAmJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7XG4iLAotICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgaWYgKCFJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZShcbiIKKyAgICAgICIgICAgJGNsYXNzbmFtZSRfZGVzY3JpcHRvcl8sICYkY2xhc3NuYW1lJDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0KKyAgZWxzZSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIENvbGxlY3RNYXBJbmZvKGRlc2NyaXB0b3JfLCAmdmFycyk7CisgICAgdmFyc1siY2xhc3NuYW1lIl0gPSBjbGFzc25hbWVfOworCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiB2YWwgPSBkZXNjcmlwdG9yXy0+RmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpOworICAgIGlmIChkZXNjcmlwdG9yXy0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMiAmJgorICAgICAgICB2YWwtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSkgeworICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVmYXVsdF92YWx1ZSA9IHZhbC0+ZGVmYXVsdF92YWx1ZV9lbnVtKCk7CisgICAgICB2YXJzWyJkZWZhdWx0X2VudW1fdmFsdWUiXSA9IEludDMyVG9TdHJpbmcoZGVmYXVsdF92YWx1ZS0+bnVtYmVyKCkpOworICAgIH0gZWxzZSB7CisgICAgICB2YXJzWyJkZWZhdWx0X2VudW1fdmFsdWUiXSA9ICIwIjsKKyAgICB9CisKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKFxuIgorICAgICAgIiAgICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfLFxuIgorICAgICAgIiAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok1hcEVudHJ5PFxuIgorICAgICAgIiAgICAgICAgICAka2V5JCxcbiIKKyAgICAgICIgICAgICAgICAgJHZhbCQsXG4iCisgICAgICAiICAgICAgICAgICRrZXlfd2lyZV90eXBlJCxcbiIKKyAgICAgICIgICAgICAgICAgJHZhbF93aXJlX3R5cGUkLFxuIgorICAgICAgIiAgICAgICAgICAkZGVmYXVsdF9lbnVtX3ZhbHVlJD46OkNyZWF0ZURlZmF1bHRJbnN0YW5jZShcbiIKKyAgICAgICIgICAgICAgICAgICAgICRjbGFzc25hbWUkX2Rlc2NyaXB0b3JfKSk7XG4iKTsKKyAgfQogCiAgIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgewpAQCAtODAzLDYgKzE2OTIsMTUgQEAKIAogdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKIEdlbmVyYXRlRGVmYXVsdEluc3RhbmNlQWxsb2NhdG9yKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIENvbnN0cnVjdCB0aGUgZGVmYXVsdCBpbnN0YW5jZXMgb2YgYWxsIGZpZWxkcywgYXMgdGhleSB3aWxsIGJlIHVzZWQKKyAgLy8gd2hlbiBjcmVhdGluZyB0aGUgZGVmYXVsdCBpbnN0YW5jZSBvZiB0aGUgZW50aXJlIG1lc3NhZ2UuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IocHJpbnRlcik7CisgIH0KKworICBpZiAoSXNNYXBFbnRyeU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSByZXR1cm47CisKICAgLy8gQ29uc3RydWN0IHRoZSBkZWZhdWx0IGluc3RhbmNlLiAgV2UgY2FuJ3QgY2FsbCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB5ZXQKICAgLy8gYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZSBhbGwgZGVmYXVsdCBpbnN0YW5jZXMgdGhhdCB0aGlzIG9uZSBtaWdodAogICAvLyBkZXBlbmQgb24gYXJlIGNvbnN0cnVjdGVkIGZpcnN0LgpAQCAtODEwLDYgKzE3MDgsMTMgQEAKICAgICAiJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3ICRjbGFzc25hbWUkKCk7XG4iLAogICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKIAorICBpZiAoKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSAmJgorICAgICAgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgIiRjbGFzc25hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfID0gbmV3ICRjbGFzc25hbWUkT25lb2ZJbnN0YW5jZSgpO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0KKwogICAvLyBIYW5kbGUgbmVzdGVkIHR5cGVzLgogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKICAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmYXVsdEluc3RhbmNlQWxsb2NhdG9yKHByaW50ZXIpOwpAQCAtODMwLDYgKzE3MzUsMTAgQEAKIAogICAvLyBIYW5kbGUgbmVzdGVkIHR5cGVzLgogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICAvLyBtYXAgZW50cnkgbWVzc2FnZSBkb2Vzbid0IG5lZWQgdG8gaW5pdGlhbGl6ZSBkZWZhdWx0IGluc3RhbmNlIG1hbnVhbGx5LgorICAgIC8vIFNpbmNlIG1hcCBlbnRyeSBtZXNzYWdlIGNhbm5vdCBiZSBhIHRvcCBsZXZlbCBjbGFzcywgd2UganVzdCBuZWVkIHRvCisgICAgLy8gYXZvaWQgY2FsbGluZyBEZWZhdWx0SW5zdGFuY2VJbml0aWFsaXplciBoZXJlLgorICAgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKICAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlRGVmYXVsdEluc3RhbmNlSW5pdGlhbGl6ZXIocHJpbnRlcik7CiAgIH0KIH0KQEAgLTg0MCwyNSArMTc0OSw3MSBAQAogICAgICJkZWxldGUgJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfO1xuIiwKICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CiAKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKSA+IDApIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiZGVsZXRlICRjbGFzc25hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfO1xuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgIH0KICAgICBwcmludGVyLT5QcmludCgKICAgICAgICJkZWxldGUgJGNsYXNzbmFtZSRfcmVmbGVjdGlvbl87XG4iLAogICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwogICB9CiAKKyAgLy8gSGFuZGxlIGRlZmF1bHQgaW5zdGFuY2VzIG9mIGZpZWxkcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKKyAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZVNodXRkb3duQ29kZShwcmludGVyKTsKKyAgfQorCiAgIC8vIEhhbmRsZSBuZXN0ZWQgdHlwZXMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChJc01hcEVudHJ5TWVzc2FnZShkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpKSBjb250aW51ZTsKICAgICBuZXN0ZWRfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlU2h1dGRvd25Db2RlKHByaW50ZXIpOwogICB9CiB9CiAKIHZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CiBHZW5lcmF0ZUNsYXNzTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBtdXRhYmxlX3Vua25vd25fZmllbGRzIHdyYXBwZXIgZnVuY3Rpb24gZm9yIExhenlTdHJpbmdPdXRwdXRTdHJlYW0KKyAgLy8gY2FsbGJhY2suCisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pICYmCisgICAgICAhVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAic3RhdGljIDo6c3RkOjpzdHJpbmcqIE11dGFibGVVbmtub3duRmllbGRzRm9yJGNsYXNzbmFtZSQoXG4iCisgICAgICAgICIgICAgJGNsYXNzbmFtZSQqIHB0cikge1xuIgorICAgICAgICAiICByZXR1cm4gcHRyLT5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7XG4iCisgICAgICAgICJ9XG4iCisgICAgICAgICJcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgfQorICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlBhY2tGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbWVzc2FnZSkge1xuIgorICAgICAgIiAgX2FueV9tZXRhZGF0YV8uUGFja0Zyb20obWVzc2FnZSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlBhY2tGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgbWVzc2FnZSxcbiIKKyAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nJiB0eXBlX3VybF9wcmVmaXgpIHtcbiIKKyAgICAgICIgIF9hbnlfbWV0YWRhdGFfLlBhY2tGcm9tKG1lc3NhZ2UsIHR5cGVfdXJsX3ByZWZpeCk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgImJvb2wgJGNsYXNzbmFtZSQ6OlVucGFja1RvKDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSogbWVzc2FnZSkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuIF9hbnlfbWV0YWRhdGFfLlVucGFja1RvKG1lc3NhZ2UpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0KKwogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5lbnVtX3R5cGVfY291bnQoKTsgaSsrKSB7CiAgICAgZW51bV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVNZXRob2RzKHByaW50ZXIpOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgLy8gbWFwIGVudHJ5IG1lc3NhZ2UgZG9lc24ndCBuZWVkIGNsYXNzIG1ldGhvZHMuIFNpbmNlIG1hcCBlbnRyeSBtZXNzYWdlCisgICAgLy8gY2Fubm90IGJlIGEgdG9wIGxldmVsIGNsYXNzLCB3ZSBqdXN0IG5lZWQgdG8gYXZvaWQgY2FsbGluZworICAgIC8vIEdlbmVyYXRlQ2xhc3NNZXRob2RzIGhlcmUuCisgICAgaWYgKElzTWFwRW50cnlNZXNzYWdlKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkpIGNvbnRpbnVlOwogICAgIG5lc3RlZF9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVDbGFzc01ldGhvZHMocHJpbnRlcik7CiAgICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CiAgICAgcHJpbnRlci0+UHJpbnQoa1RoaW5TZXBhcmF0b3IpOwpAQCAtODcyLDcgKzE4MjcsNyBAQAogICB9CiAKICAgLy8gR2VuZXJhdGUgZmllbGQgbnVtYmVyIGNvbnN0YW50cy4KLSAgcHJpbnRlci0+UHJpbnQoIiNpZm5kZWYgX01TQ19WRVJcbiIpOworICBwcmludGVyLT5QcmludCgiI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwXG4iKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKICAgICBwcmludGVyLT5QcmludCgKQEAgLTg4MSw3ICsxODM2LDcgQEAKICAgICAgICJjb25zdGFudF9uYW1lIiwgRmllbGRDb25zdGFudE5hbWUoZmllbGQpKTsKICAgfQogICBwcmludGVyLT5QcmludCgKLSAgICAiI2VuZGlmICAvLyAhX01TQ19WRVJcbiIKKyAgICAiI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMFxuIgogICAgICJcbiIpOwogCiAgIC8vIERlZmluZSBleHRlbnNpb24gaWRlbnRpZmllcnMuCkBAIC04OTIsNyArMTg0NywxMiBAQAogICBHZW5lcmF0ZVN0cnVjdG9ycyhwcmludGVyKTsKICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CiAKLSAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCkgPiAwKSB7CisgICAgR2VuZXJhdGVPbmVvZkNsZWFyKHByaW50ZXIpOworICAgIHByaW50ZXItPlByaW50KCJcbiIpOworICB9CisKKyAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CiAgICAgR2VuZXJhdGVDbGVhcihwcmludGVyKTsKICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKIApAQCAtOTAyLDcgKzE4NjIsNyBAQAogICAgIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKHByaW50ZXIpOwogICAgIHByaW50ZXItPlByaW50KCJcbiIpOwogCi0gICAgaWYgKEhhc0Zhc3RBcnJheVNlcmlhbGl6YXRpb24oZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBpZiAoSGFzRmFzdEFycmF5U2VyaWFsaXphdGlvbihkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICAgIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShwcmludGVyKTsKICAgICAgIHByaW50ZXItPlByaW50KCJcbiIpOwogICAgIH0KQEAgLTkyMyw3ICsxODgzLDcgQEAKICAgR2VuZXJhdGVTd2FwKHByaW50ZXIpOwogICBwcmludGVyLT5QcmludCgiXG4iKTsKIAotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgJGNsYXNzbmFtZSQ6OkdldE1ldGFkYXRhKCkgY29uc3Qge1xuIgogICAgICAgIiAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7XG4iCkBAIC05NDgsMTggKzE5MDgsMzUgQEAKIAogdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKIEdlbmVyYXRlT2Zmc2V0cyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAic3RhdGljIGNvbnN0IGludCAkY2xhc3NuYW1lJF9vZmZzZXRzX1skZmllbGRfY291bnQkXSA9IHtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCi0gICAgImZpZWxkX2NvdW50IiwgU2ltcGxlSXRvYShtYXgoMSwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpKSk7CisgIHByaW50ZXItPlByaW50KCJzdGF0aWMgY29uc3QgaW50ICRjbGFzc25hbWUkX29mZnNldHNfWyRmaWVsZF9jb3VudCRdID0ge1xuIiwKKyAgICAgICAgICAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmaWVsZF9jb3VudCIsCisgICAgICAgICAgICAgICAgIFNpbXBsZUl0b2Eoc3RkOjptYXgoMSwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpKSkpOwogICBwcmludGVyLT5JbmRlbnQoKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiUFJPVE8yX0dFTkVSQVRFRF9ERUZBVUxUX09ORU9GX0ZJRUxEX09GRlNFVCgiCisgICAgICAgICAgIiRjbGFzc25hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfLCAkbmFtZSRfKSxcbiIsCisgICAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIkdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoJGNsYXNzbmFtZSQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJG5hbWUkXyksXG4iLAorICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLAorICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgfQorICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSk7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVCgkY2xhc3NuYW1lJCwgJG5hbWUkXyksXG4iLAogICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCi0gICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgIm5hbWUiLCBvbmVvZi0+bmFtZSgpKTsKICAgfQogCiAgIHByaW50ZXItPk91dGRlbnQoKTsKQEAgLTk3MywxNiArMTk1MCwzOSBAQAogICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIl9jYWNoZWRfc2l6ZV8gPSAwO1xuIik7Ci0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgaWYgKCFIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBfaXNfZGVmYXVsdF9pbnN0YW5jZV8gPSBmYWxzZTtcbiIpOwogICB9CiAKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIjo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoU3RyQ2F0KAorICAgICAgdXNlc19zdHJpbmdfID8gIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7XG4iIDogIiIsCisgICAgICAiX2NhY2hlZF9zaXplXyA9IDA7XG4iKS5jX3N0cigpKTsKKworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSAmJgorICAgICAgIVVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIl91bmtub3duX2ZpZWxkc18uVW5zYWZlU2V0RGVmYXVsdChcbiIKKyAgICAgICAgIiAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpO1xuIik7CisgIH0KKworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgIC5HZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KKworICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIjo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7XG4iKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iLAorICAgICAgICAib25lb2ZfbmFtZSIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpOworICB9CiAKICAgcHJpbnRlci0+T3V0ZGVudCgpOwogICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKQEAgLTk5NCwxOCArMTk5NCw1MyBAQAogICAgICJ2b2lkICRjbGFzc25hbWUkOjpTaGFyZWREdG9yKCkge1xuIiwKICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CiAgIHByaW50ZXItPkluZGVudCgpOwotICAvLyBXcml0ZSB0aGUgZGVzdHJ1Y3RvcnMgZm9yIGVhY2ggZmllbGQuCisgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICAvLyBEbyBub3RoaW5nIHdoZW4gdGhlIG1lc3NhZ2UgaXMgYWxsb2NhdGVkIGluIGFuIGFyZW5hLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgImlmIChHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpIHtcbiIKKyAgICAgICIgIHJldHVybjtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIC8vIFdyaXRlIHRoZSBkZXNjdHJ1Y3RvciBmb3IgX3Vua25vd25fZmllbGRzXyBpbiBsaXRlIHJ1bnRpbWUuCisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pICYmCisgICAgICAhVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJfdW5rbm93bl9maWVsZHNfLkRlc3Ryb3koXG4iCisgICAgICAgICAgIiAgICAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksXG4iCisgICAgICAgICAgIiAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiX3Vua25vd25fZmllbGRzXy5EZXN0cm95Tm9BcmVuYShcbiIKKyAgICAgICAgICAiICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7XG4iKTsKKyAgICB9CisgIH0KKworICAvLyBXcml0ZSB0aGUgZGVzdHJ1Y3RvcnMgZm9yIGVhY2ggZmllbGQgZXhjZXB0IG9uZW9mIG1lbWJlcnMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCi0gICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgICB9CisgIH0KKworICAvLyBHZW5lcmF0ZSBjb2RlIHRvIGRlc3RydWN0IG9uZW9mcy4gQ2xlYXJpbmcgc2hvdWxkIGRvIHRoZSB3b3JrLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKGhhc18kb25lb2ZfbmFtZSQoKSkge1xuIgorICAgICAgICAiICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICAgIn1cbiIsCisgICAgICAgICJvbmVvZl9uYW1lIiwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSk7CiAgIH0KIAogICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKLSAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgImlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7XG4iLAotICAgIC8vIFdpdGhvdXQuCi0gICAgImlmICh0aGlzICE9ICZkZWZhdWx0X2luc3RhbmNlKCkpIHtcbiIpOworICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18sIHByaW50ZXIsCisgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgICAiaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHtcbiIsCisgICAgICAvLyBXaXRob3V0LgorICAgICAgImlmICh0aGlzICE9ICZkZWZhdWx0X2luc3RhbmNlKCkpIHtcbiIpOwogCiAgIC8vIFdlIG5lZWQgdG8gZGVsZXRlIGFsbCBlbWJlZGRlZCBtZXNzYWdlcy4KICAgLy8gVE9ETyhrZW50b24pOiAgSWYgd2UgbWFrZSB1bnNldCBtZXNzYWdlcyBwb2ludCBhdCBkZWZhdWx0IGluc3RhbmNlcwpAQCAtMTAxNiw4ICsyMDUxLDEyIEBACiAKICAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmCiAgICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgiICBkZWxldGUgJG5hbWUkXztcbiIsCi0gICAgICAgICAgICAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgLy8gU2tpcCBvbmVvZiBtZW1iZXJzCisgICAgICBpZiAoIWZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiICBkZWxldGUgJG5hbWUkXztcbiIsCisgICAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOworICAgICAgfQogICAgIH0KICAgfQogCkBAIC0xMDI5LDIzICsyMDY4LDEyOCBAQAogfQogCiB2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgotR2VuZXJhdGVTdHJ1Y3RvcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgc3RyaW5nIHN1cGVyY2xhc3MgPSBTdXBlckNsYXNzTmFtZShkZXNjcmlwdG9yXyk7Ci0KLSAgLy8gR2VuZXJhdGUgdGhlIGRlZmF1bHQgY29uc3RydWN0b3IuCitHZW5lcmF0ZUFyZW5hRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gR2VuZXJhdGUgdGhlIEFyZW5hRHRvcigpIG1ldGhvZC4gVHJhY2sgd2hldGhlciBhbnkgZmllbGRzIGFjdHVhbGx5IHByb2R1Y2VkCisgIC8vIGNvZGUgdGhhdCBuZWVkcyB0byBiZSBjYWxsZWQuCiAgIHByaW50ZXItPlByaW50KAotICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoKVxuIgotICAgICIgIDogJHN1cGVyY2xhc3MkKCkge1xuIgotICAgICIgIFNoYXJlZEN0b3IoKTtcbiIKLSAgICAifVxuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKLSAgICAic3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MpOworICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OkFyZW5hRHRvcih2b2lkKiBvYmplY3QpIHtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIHByaW50ZXItPkluZGVudCgpOworCisgIC8vIFRoaXMgY29kZSBpcyBwbGFjZWQgaW5zaWRlIGEgc3RhdGljIG1ldGhvZCwgcmF0aGVyIHRoYW4gYW4gb3JkaW5hcnkgb25lLAorICAvLyBzaW5jZSB0aGF0IHNpbXBsaWZpZXMgQXJlbmEncyBkZXN0cnVjdG9yIGxpc3QgKG9yZGluYXJ5IGZ1bmN0aW9uIHBvaW50ZXJzCisgIC8vIHJhdGhlciB0aGFuIG1lbWJlciBmdW5jdGlvbiBwb2ludGVycykuIF90aGlzIGlzIHRoZSBvYmplY3QgYmVpbmcKKyAgLy8gZGVzdHJ1Y3RlZC4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiJGNsYXNzbmFtZSQqIF90aGlzID0gcmVpbnRlcnByZXRfY2FzdDwgJGNsYXNzbmFtZSQqID4ob2JqZWN0KTtcbiIKKyAgICAgIC8vIGF2b2lkIGFuICJ1bnVzZWQgdmFyaWFibGUiIHdhcm5pbmcgaW4gY2FzZSBubyBmaWVsZHMgaGF2ZSBkdG9yIGNvZGUuCisgICAgICAiKHZvaWQpX3RoaXM7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIGJvb2wgbmVlZF9yZWdpc3RyYXRpb24gPSBmYWxzZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgICAgICAgICAgICAgICAgLkdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShwcmludGVyKSkgeworICAgICAgbmVlZF9yZWdpc3RyYXRpb24gPSB0cnVlOworICAgIH0KKyAgfQorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICAgIn1cbiIpOworCisgIGlmIChuZWVkX3JlZ2lzdHJhdGlvbikgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OlJlZ2lzdGVyQXJlbmFEdG9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSB7XG4iCisgICAgICAgICIgIGlmIChhcmVuYSAhPSBOVUxMKSB7XG4iCisgICAgICAgICIgICAgYXJlbmEtPk93bkN1c3RvbURlc3RydWN0b3IodGhpcywgJiRjbGFzc25hbWUkOjpBcmVuYUR0b3IpO1xuIgorICAgICAgICAiICB9XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpSZWdpc3RlckFyZW5hRHRvcig6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkge1xuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZVN0cnVjdG9ycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBzdHJpbmcgc3VwZXJjbGFzczsKKyAgaWYgKHVzZV9kZXBlbmRlbnRfYmFzZV8pIHsKKyAgICBzdXBlcmNsYXNzID0KKyAgICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfKSArICI8IiArIGNsYXNzbmFtZV8gKyAiPiI7CisgIH0gZWxzZSB7CisgICAgc3VwZXJjbGFzcyA9IFN1cGVyQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLCBvcHRpb25zXyk7CisgIH0KKyAgc3RyaW5nIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgPSBzdXBlcmNsYXNzICsgIigpIjsKKworICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgKz0gIixcbiAgX2V4dGVuc2lvbnNfKGFyZW5hKSI7CisgIH0KKworICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgKz0gIixcbiAgX2ludGVybmFsX21ldGFkYXRhXyhhcmVuYSkiOworICB9IGVsc2UgeworICAgIGluaXRpYWxpemVyX3dpdGhfYXJlbmEgKz0gIixcbiAgX2FyZW5hX3B0cl8oYXJlbmEpIjsKKyAgfQorCisgIC8vIEluaXRpYWxpemUgbWVtYmVyIHZhcmlhYmxlcyB3aXRoIGFyZW5hIGNvbnN0cnVjdG9yLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBib29sIGhhc19hcmVuYV9jb25zdHJ1Y3RvciA9IGRlc2NyaXB0b3JfLT5maWVsZChpKS0+aXNfcmVwZWF0ZWQoKTsKKyAgICBpZiAoaGFzX2FyZW5hX2NvbnN0cnVjdG9yKSB7CisgICAgICBpbml0aWFsaXplcl93aXRoX2FyZW5hICs9IHN0cmluZygiLFxuICAiKSArCisgICAgICAgICAgRmllbGROYW1lKGRlc2NyaXB0b3JfLT5maWVsZChpKSkgKyBzdHJpbmcoIl8oYXJlbmEpIik7CisgICAgfQorICB9CisKKyAgaWYgKElzQW55TWVzc2FnZShkZXNjcmlwdG9yXykpIHsKKyAgICBpbml0aWFsaXplcl93aXRoX2FyZW5hICs9ICIsXG4gIF9hbnlfbWV0YWRhdGFfKCZ0eXBlX3VybCwgJnZhbHVlXykiOworICB9CisKKyAgc3RyaW5nIGluaXRpYWxpemVyX251bGw7CisgIGluaXRpYWxpemVyX251bGwgPSAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSA/CisgICAgIiwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSIgOiAiLCBfYXJlbmFfcHRyXyhOVUxMKSIpOworICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgeworICAgIGluaXRpYWxpemVyX251bGwgKz0gIiwgX2FueV9tZXRhZGF0YV8oJnR5cGVfdXJsXywgJnZhbHVlXykiOworICB9CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiJGNsYXNzbmFtZSQ6OiRjbGFzc25hbWUkKClcbiIKKyAgICAgICIgIDogJHN1cGVyY2xhc3MkKCkkaW5pdGlhbGl6ZXIkIHtcbiIKKyAgICAgICIgIFNoYXJlZEN0b3IoKTtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3RvcjokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgICAic3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MsCisgICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpLAorICAgICAgImluaXRpYWxpemVyIiwgaW5pdGlhbGl6ZXJfbnVsbCk7CisKKyAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiXG4iCisgICAgICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpXG4iCisgICAgICAgICIgIDogJGluaXRpYWxpemVyJCB7XG4iCisgICAgICAgICIgIFNoYXJlZEN0b3IoKTtcbiIKKyAgICAgICAgIiAgUmVnaXN0ZXJBcmVuYUR0b3IoYXJlbmEpO1xuIgorICAgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoYXJlbmFfY29uc3RydWN0b3I6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICAiaW5pdGlhbGl6ZXIiLCBpbml0aWFsaXplcl93aXRoX2FyZW5hLAorICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKKyAgICAgICAgInN1cGVyY2xhc3MiLCBzdXBlcmNsYXNzLAorICAgICAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKyAgfQogCiAgIHByaW50ZXItPlByaW50KAogICAgICJcbiIKICAgICAidm9pZCAkY2xhc3NuYW1lJDo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkge1xuIiwKICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CiAKKyAgaWYgKCFIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICBfaXNfZGVmYXVsdF9pbnN0YW5jZV8gPSB0cnVlO1xuIik7CisgIH0KKwogICAvLyBUaGUgZGVmYXVsdCBpbnN0YW5jZSBuZWVkcyBhbGwgb2YgaXRzIGVtYmVkZGVkIG1lc3NhZ2UgcG9pbnRlcnMKICAgLy8gY3Jvc3MtbGlua2VkIHRvIG90aGVyIGRlZmF1bHQgaW5zdGFuY2VzLiAgV2UgY2FuJ3QgZG8gdGhpcyBpbml0aWFsaXphdGlvbgogICAvLyBpbiB0aGUgY29uc3RydWN0b3IgYmVjYXVzZSBzb21lIG90aGVyIGRlZmF1bHQgaW5zdGFuY2VzIG1heSBub3QgaGF2ZSBiZWVuCkBAIC0xMDU2LDE3ICsyMjAwLDI3IEBACiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKIAogICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKLSAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgPT0gTlVMTCB8fAorICAgICAgICAgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSkgeworICAgICAgc3RyaW5nIG5hbWU7CisgICAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgICBuYW1lID0gY2xhc3NuYW1lXyArICJfZGVmYXVsdF9vbmVvZl9pbnN0YW5jZV8tPiI7CisgICAgICB9CisgICAgICBuYW1lICs9IEZpZWxkTmFtZShmaWVsZCk7CiAgICAgICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIHByaW50ZXIsCi0gICAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAgICAgIiAgJG5hbWUkXyA9IGNvbnN0X2Nhc3Q8ICR0eXBlJCo+KCYkdHlwZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7XG4iLAotICAgICAgICAvLyBXaXRob3V0LgotICAgICAgICAiICAkbmFtZSRfID0gY29uc3RfY2FzdDwgJHR5cGUkKj4oXG4iCi0gICAgICAgICIgICAgICAkdHlwZSQ6OmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSk7XG4iLAotICAgICAgICAvLyBWYXJzLgotICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCksCi0gICAgICAgICJ0eXBlIiwgRmllbGRNZXNzYWdlVHlwZU5hbWUoZmllbGQpKTsKKyAgICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKKyAgICAgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgICAgICAgIiAgJG5hbWUkXyA9IGNvbnN0X2Nhc3Q8ICR0eXBlJCo+KCYkdHlwZSQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7XG4iLAorICAgICAgICAgIC8vIFdpdGhvdXQuCisgICAgICAgICAgIiAgJG5hbWUkXyA9IGNvbnN0X2Nhc3Q8ICR0eXBlJCo+KFxuIgorICAgICAgICAgICIgICAgICAkdHlwZSQ6OmludGVybmFsX2RlZmF1bHRfaW5zdGFuY2UoKSk7XG4iLAorICAgICAgICAgIC8vIFZhcnMuCisgICAgICAgICAgIm5hbWUiLCBuYW1lLCAidHlwZSIsIEZpZWxkTWVzc2FnZVR5cGVOYW1lKGZpZWxkKSk7CisgICAgfSBlbHNlIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpICYmCisgICAgICAgICAgICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCisgICAgICAgICAgLkdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKHByaW50ZXIpOwogICAgIH0KICAgfQogICBwcmludGVyLT5QcmludCgKQEAgLTEwNzYsMTMgKzIyMzAsMjkgQEAKICAgLy8gR2VuZXJhdGUgdGhlIGNvcHkgY29uc3RydWN0b3IuCiAgIHByaW50ZXItPlByaW50KAogICAgICIkY2xhc3NuYW1lJDo6JGNsYXNzbmFtZSQoY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pXG4iCi0gICAgIiAgOiAkc3VwZXJjbGFzcyQoKSB7XG4iCisgICAgIiAgOiAkc3VwZXJjbGFzcyQoKSIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgInN1cGVyY2xhc3MiLCBzdXBlcmNsYXNzLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiLFxuICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkiKTsKKyAgfSBlbHNlIGlmICghVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgIHByaW50ZXItPlByaW50KCIsXG4gICAgX2FyZW5hX3B0cl8oTlVMTCkiKTsKKyAgfQorICBpZiAoSXNBbnlNZXNzYWdlKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KCIsXG4gICAgX2FueV9tZXRhZGF0YV8oJnR5cGVfdXJsXywgJnZhbHVlXykiKTsKKyAgfQorICBwcmludGVyLT5QcmludCgiIHtcbiIpOworICBwcmludGVyLT5QcmludCgKICAgICAiICBTaGFyZWRDdG9yKCk7XG4iCiAgICAgIiAgTWVyZ2VGcm9tKGZyb20pO1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOiRmdWxsX25hbWUkKVxuIgogICAgICJ9XG4iCiAgICAgIlxuIiwKICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywKLSAgICAic3VwZXJjbGFzcyIsIHN1cGVyY2xhc3MpOworICAgICJzdXBlcmNsYXNzIiwgc3VwZXJjbGFzcywKKyAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKIAogICAvLyBHZW5lcmF0ZSB0aGUgc2hhcmVkIGNvbnN0cnVjdG9yIGNvZGUuCiAgIEdlbmVyYXRlU2hhcmVkQ29uc3RydWN0b3JDb2RlKHByaW50ZXIpOwpAQCAtMTA5MCwxNCArMjI2MCwyMSBAQAogICAvLyBHZW5lcmF0ZSB0aGUgZGVzdHJ1Y3Rvci4KICAgcHJpbnRlci0+UHJpbnQoCiAgICAgIiRjbGFzc25hbWUkOjp+JGNsYXNzbmFtZSQoKSB7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIiAgU2hhcmVkRHRvcigpO1xuIgogICAgICJ9XG4iCiAgICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCisgICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CiAKICAgLy8gR2VuZXJhdGUgdGhlIHNoYXJlZCBkZXN0cnVjdG9yIGNvZGUuCiAgIEdlbmVyYXRlU2hhcmVkRGVzdHJ1Y3RvckNvZGUocHJpbnRlcik7CiAKKyAgLy8gR2VuZXJhdGUgdGhlIGFyZW5hLXNwZWNpZmljIGRlc3RydWN0b3IgY29kZS4KKyAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgeworICAgIEdlbmVyYXRlQXJlbmFEZXN0cnVjdG9yQ29kZShwcmludGVyKTsKKyAgfQorCiAgIC8vIEdlbmVyYXRlIFNldENhY2hlZFNpemUuCiAgIHByaW50ZXItPlByaW50KAogICAgICJ2b2lkICRjbGFzc25hbWUkOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7XG4iCkBAIC0xMTA4LDcgKzIyODUsNyBAQAogICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKIAogICAvLyBPbmx5IGdlbmVyYXRlIHRoaXMgbWVtYmVyIGlmIGl0J3Mgbm90IGRpc2FibGVkLgotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSAmJgogICAgICAgIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiAkY2xhc3NuYW1lJDo6ZGVzY3JpcHRvcigpIHtcbiIKQEAgLTExMjYsMTA3ICsyMzAzLDI0OSBAQAogICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKIAogICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCi0gICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKLSAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgIiAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpICRhZGRkZXNjcmlwdG9yc25hbWUkKCk7XG4iLAotICAgIC8vIFdpdGhvdXQuCi0gICAgIiAgJGFkZGRlc2NyaXB0b3JzbmFtZSQoKTtcbiIsCi0gICAgLy8gVmFycy4KLSAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwKLSAgICBHbG9iYWxBZGREZXNjcmlwdG9yc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKS0+bmFtZSgpKSk7CisgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKKyAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAgICIgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIiwKKyAgICAgIC8vIFdpdGhvdXQuCisgICAgICAiICAkYWRkZGVzY3JpcHRvcnNuYW1lJCgpO1xuIiwKKyAgICAgIC8vIFZhcnMuCisgICAgICAiYWRkZGVzY3JpcHRvcnNuYW1lIiwKKyAgICAgIEdsb2JhbEFkZERlc2NyaXB0b3JzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpLT5uYW1lKCkpKTsKIAogICBwcmludGVyLT5QcmludCgKICAgICAiICByZXR1cm4gKmRlZmF1bHRfaW5zdGFuY2VfO1xuIgogICAgICJ9XG4iCiAgICAgIlxuIgogICAgICIkY2xhc3NuYW1lJCogJGNsYXNzbmFtZSQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDtcbiIKLSAgICAiXG4iCi0gICAgIiRjbGFzc25hbWUkKiAkY2xhc3NuYW1lJDo6TmV3KCkgY29uc3Qge1xuIgotICAgICIgIHJldHVybiBuZXcgJGNsYXNzbmFtZSQ7XG4iCi0gICAgIn1cbiIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sCi0gICAgImFkZGRlc2NyaXB0b3JzbmFtZSIsCi0gICAgR2xvYmFsQWRkRGVzY3JpcHRvcnNOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCktPm5hbWUoKSkpOworICAgICJcbiIsCisgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworCisgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIkY2xhc3NuYW1lJCogJGNsYXNzbmFtZSQ6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Qge1xuIgorICAgICAgIiAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8JGNsYXNzbmFtZSQ+KGFyZW5hKTtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiRjbGFzc25hbWUkKiAkY2xhc3NuYW1lJDo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7XG4iCisgICAgICAiICAkY2xhc3NuYW1lJCogbiA9IG5ldyAkY2xhc3NuYW1lJDtcbiIKKyAgICAgICIgIGlmIChhcmVuYSAhPSBOVUxMKSB7XG4iCisgICAgICAiICAgIGFyZW5hLT5Pd24obik7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gbjtcbiIKKyAgICAgICJ9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICB9CisKK30KKworLy8gUmV0dXJuIHRoZSBudW1iZXIgb2YgYml0cyBzZXQgaW4gbiwgYSBub24tbmVnYXRpdmUgaW50ZWdlci4KK3N0YXRpYyBpbnQgcG9wY250KHVpbnQzMiBuKSB7CisgIGludCByZXN1bHQgPSAwOworICB3aGlsZSAobiAhPSAwKSB7CisgICAgcmVzdWx0ICs9IChuICYgMSk7CisgICAgbiA9IG4gLyAyOworICB9CisgIHJldHVybiByZXN1bHQ7CiB9CiAKIHZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CiBHZW5lcmF0ZUNsZWFyKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIHByaW50ZXItPlByaW50KCJ2b2lkICRjbGFzc25hbWUkOjpDbGVhcigpIHtcbiIsCi0gICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q2xlYXIoKSB7XG4iCisgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iLAorICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwogICBwcmludGVyLT5JbmRlbnQoKTsKIAotICBpbnQgbGFzdF9pbmRleCA9IC0xOwotCisgIC8vIFN0ZXAgMTogRXh0ZW5zaW9ucwogICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewogICAgIHByaW50ZXItPlByaW50KCJfZXh0ZW5zaW9uc18uQ2xlYXIoKTtcbiIpOwogICB9CiAKKyAgLy8gU3RlcCAyOiBFdmVyeXRoaW5nIGJ1dCBleHRlbnNpb25zLCByZXBlYXRlZHMsIHVuaW9ucy4KKyAgLy8gVGhlc2UgYXJlIGhhbmRsZWQgaW4gY2h1bmtzIG9mIDguICBUaGUgZmlyc3QgY2h1bmsgaXMKKyAgLy8gdGhlIG5vbi1leHRlbnNpb25zLW5vbi1yZXBlYXRlZHMtbm9uLXVuaW9ucyBpbgorICAvLyAgZGVzY3JpcHRvcl8tPmZpZWxkKDApLCBkZXNjcmlwdG9yXy0+ZmllbGQoMSksIC4uLiBkZXNjcmlwdG9yXy0+ZmllbGQoNyksCisgIC8vIGFuZCB0aGUgc2Vjb25kIGNodW5rIGlzIHRoZSBzYW1lIGZvcgorICAvLyAgZGVzY3JpcHRvcl8tPmZpZWxkKDgpLCBkZXNjcmlwdG9yXy0+ZmllbGQoOSksIC4uLiBkZXNjcmlwdG9yXy0+ZmllbGQoMTUpLAorICAvLyBldGMuCisgIHNldDxpbnQ+IHN0ZXAyX2luZGljZXM7CisgIGhhc2hfbWFwPHN0cmluZywgaW50PiBmaWVsZG5hbWVfdG9fY2h1bms7CisgIGhhc2hfbWFwPGludCwgc3RyaW5nPiBtZW1zZXRzX2Zvcl9jaHVuazsKKyAgaGFzaF9tYXA8aW50LCBpbnQ+IG1lbXNldF9maWVsZF9jb3VudF9mb3JfY2h1bms7CisgIGhhc2hfc2V0PHN0cmluZz4gaGFuZGxlZDsgIC8vIGZpZWxkcyB0aGF0IGFwcGVhciBhbnl3aGVyZSBpbiBtZW1zZXRzX2Zvcl9jaHVuaworICBoYXNoX21hcDxpbnQsIHVpbnQzMj4gZmllbGRzX21hc2tfZm9yX2NodW5rOwogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotCi0gICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgLy8gV2UgY2FuIHVzZSB0aGUgZmFjdCB0aGF0IF9oYXNfYml0c18gaXMgYSBnaWFudCBiaXRmaWVsZCB0byBvdXIKLSAgICAgIC8vIGFkdmFudGFnZTogIFdlIGNhbiBjaGVjayB1cCB0byAzMiBiaXRzIGF0IGEgdGltZSBmb3IgZXF1YWxpdHkgdG8KLSAgICAgIC8vIHplcm8sIGFuZCBza2lwIHRoZSB3aG9sZSByYW5nZSBpZiBzby4gIFRoaXMgY2FuIGltcHJvdmUgdGhlIHNwZWVkCi0gICAgICAvLyBvZiBDbGVhcigpIGZvciBtZXNzYWdlcyB3aGljaCBjb250YWluIGEgdmVyeSBsYXJnZSBudW1iZXIgb2YKLSAgICAgIC8vIG9wdGlvbmFsIGZpZWxkcyBvZiB3aGljaCBvbmx5IGEgZmV3IGFyZSB1c2VkIGF0IGEgdGltZS4gIEhlcmUsCi0gICAgICAvLyB3ZSd2ZSBjaG9zZW4gdG8gY2hlY2sgOCBiaXRzIGF0IGEgdGltZSByYXRoZXIgdGhhbiAzMi4KLSAgICAgIGlmIChpIC8gOCAhPSBsYXN0X2luZGV4IC8gOCB8fCBsYXN0X2luZGV4IDwgMCkgewotICAgICAgICBpZiAobGFzdF9pbmRleCA+PSAwKSB7Ci0gICAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgICAgICAgfQotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiaWYgKF9oYXNfYml0c19bJGluZGV4JCAvIDMyXSAmICgweGZmdSA8PCAoJGluZGV4JCAlIDMyKSkpIHtcbiIsCi0gICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSkpOwotICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKLSAgICAgIH0KLSAgICAgIGxhc3RfaW5kZXggPSBpOwotCi0gICAgICAvLyBJdCdzIGZhc3RlciB0byBqdXN0IG92ZXJ3cml0ZSBwcmltaXRpdmUgdHlwZXMsIGJ1dCB3ZSBzaG91bGQKLSAgICAgIC8vIG9ubHkgY2xlYXIgc3RyaW5ncyBhbmQgbWVzc2FnZXMgaWYgdGhleSB3ZXJlIHNldC4KLSAgICAgIC8vIFRPRE8oa2VudG9uKTogIExldCB0aGUgQ3BwRmllbGRHZW5lcmF0b3IgZGVjaWRlIHRoaXMgc29tZWhvdy4KLSAgICAgIGJvb2wgc2hvdWxkX2NoZWNrX2JpdCA9Ci0gICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFIHx8Ci0gICAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc7Ci0KLSAgICAgIGlmIChzaG91bGRfY2hlY2tfYml0KSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAotICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7Ci0gICAgICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICAgfQotCi0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOwotCi0gICAgICBpZiAoc2hvdWxkX2NoZWNrX2JpdCkgewotICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgICAgIH0KKyAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmICFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBzdGVwMl9pbmRpY2VzLmluc2VydChpKTsKKyAgICAgIGludCBjaHVuayA9IGkgLyA4OworICAgICAgZmllbGRuYW1lX3RvX2NodW5rW0ZpZWxkTmFtZShmaWVsZCldID0gY2h1bms7CisgICAgICBmaWVsZHNfbWFza19mb3JfY2h1bmtbY2h1bmtdIHw9IHN0YXRpY19jYXN0PHVpbnQzMj4oMSkgPDwgKGkgJSAzMik7CiAgICAgfQogICB9CiAKLSAgaWYgKGxhc3RfaW5kZXggPj0gMCkgeworICAvLyBTdGVwIDJhOiBHcmVlZGlseSBzZWVrIHJ1bnMgb2YgZmllbGRzIHRoYXQgY2FuIGJlIGNsZWFyZWQgYnkgbWVtc2V0LXRvLTAuCisgIC8vIFRoZSBnZW5lcmF0ZWQgY29kZSB1c2VzIHR3byBtYWNyb3MgdG8gaGVscCBpdCBjbGVhciBydW5zIG9mIGZpZWxkczoKKyAgLy8gWlJfSEVMUEVSXyhmMSkgLSBaUl9IRUxQRVJfKGYwKSBjb21wdXRlcyB0aGUgZGlmZmVyZW5jZSwgaW4gYnl0ZXMsIG9mIHRoZQorICAvLyBwb3NpdGlvbnMgb2YgdHdvIGZpZWxkcyBpbiB0aGUgTWVzc2FnZS4KKyAgLy8gWlJfIHplcm9lcyBhIG5vbi1lbXB0eSByYW5nZSBvZiBmaWVsZHMgdmlhIG1lbXNldC4KKyAgY29uc3QgY2hhciogbWFjcm9zID0KKyAgICAgICIjaWYgZGVmaW5lZChfX2NsYW5nX18pXG4iCisgICAgICAiI2RlZmluZSBaUl9IRUxQRVJfKGYpIFxcXG4iCisgICAgICAiICBfUHJhZ21hKFwiY2xhbmcgZGlhZ25vc3RpYyBwdXNoXCIpIFxcXG4iCisgICAgICAiICBfUHJhZ21hKFwiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFxcXCItV2ludmFsaWQtb2Zmc2V0b2ZcXFwiXCIpIFxcXG4iCisgICAgICAiICBfX2J1aWx0aW5fb2Zmc2V0b2YoJGNsYXNzbmFtZSQsIGYpIFxcXG4iCisgICAgICAiICBfUHJhZ21hKFwiY2xhbmcgZGlhZ25vc3RpYyBwb3BcIilcbiIKKyAgICAgICIjZWxzZVxuIgorICAgICAgIiNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcXFxuIgorICAgICAgIiAgJnJlaW50ZXJwcmV0X2Nhc3Q8JGNsYXNzbmFtZSQqPigxNiktPmYpXG4iCisgICAgICAiI2VuZGlmXG5cbiIKKyAgICAgICIjZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1xcXG4iCisgICAgICAiICA6Om1lbXNldCgmZmlyc3QsIDAsXFxcbiIKKyAgICAgICIgICAgICAgICAgIFpSX0hFTFBFUl8obGFzdCkgLSBaUl9IRUxQRVJfKGZpcnN0KSArIHNpemVvZihsYXN0KSk7XFxcbiIKKyAgICAgICJ9IHdoaWxlICgwKVxuXG4iOworICBmb3IgKGludCBpID0gMDsgaSA8IHJ1bnNfb2ZfZmllbGRzXy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBydW4gPSBydW5zX29mX2ZpZWxkc19baV07CisgICAgaWYgKHJ1bi5zaXplKCkgPCAyKSBjb250aW51ZTsKKyAgICBjb25zdCBzdHJpbmcmIGZpcnN0X2ZpZWxkX25hbWUgPSBydW5bMF07CisgICAgY29uc3Qgc3RyaW5nJiBsYXN0X2ZpZWxkX25hbWUgPSBydW4uYmFjaygpOworICAgIGludCBjaHVuayA9IGZpZWxkbmFtZV90b19jaHVua1tydW5bMF1dOworICAgIG1lbXNldHNfZm9yX2NodW5rW2NodW5rXS5hcHBlbmQoCisgICAgICAiWlJfKCIgKyBmaXJzdF9maWVsZF9uYW1lICsgIl8sICIgKyBsYXN0X2ZpZWxkX25hbWUgKyAiXyk7XG4iKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IHJ1bi5zaXplKCk7IGorKykgeworICAgICAgR09PR0xFX0RDSEVDS19FUShjaHVuaywgZmllbGRuYW1lX3RvX2NodW5rW3J1bltqXV0pOworICAgICAgaGFuZGxlZC5pbnNlcnQocnVuW2pdKTsKKyAgICB9CisgICAgbWVtc2V0X2ZpZWxkX2NvdW50X2Zvcl9jaHVua1tjaHVua10gKz0gcnVuLnNpemUoKTsKKyAgfQorICBjb25zdCBib29sIG1hY3Jvc19hcmVfbmVlZGVkID0gaGFuZGxlZC5zaXplKCkgPiAwOworICBpZiAobWFjcm9zX2FyZV9uZWVkZWQpIHsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQobWFjcm9zLAorICAgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgfQorICAvLyBTdGVwIDJiOiBGaW5pc2ggc3RlcCAyLCBpZ25vcmluZyBmaWVsZHMgaGFuZGxlZCBpbiBzdGVwIDJhLgorICBpbnQgbGFzdF9pbmRleCA9IC0xOworICBib29sIGNodW5rX2Jsb2NrX2luX3Byb2dyZXNzID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGlmIChzdGVwMl9pbmRpY2VzLmNvdW50KGkpID09IDApIGNvbnRpbnVlOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgY29uc3Qgc3RyaW5nIGZpZWxkbmFtZSA9IEZpZWxkTmFtZShmaWVsZCk7CisgICAgaWYgKGkgLyA4ICE9IGxhc3RfaW5kZXggLyA4IHx8IGxhc3RfaW5kZXggPCAwKSB7CisgICAgICAvLyBFbmQgcHJldmlvdXMgY2h1bmssIGlmIHRoZXJlIHdhcyBvbmUuCisgICAgICBpZiAoY2h1bmtfYmxvY2tfaW5fcHJvZ3Jlc3MpIHsKKyAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgICAgICAgIGNodW5rX2Jsb2NrX2luX3Byb2dyZXNzID0gZmFsc2U7CisgICAgICB9CisgICAgICAvLyBTdGFydCBjaHVuay4KKyAgICAgIGNvbnN0IHN0cmluZyYgbWVtc2V0cyA9IG1lbXNldHNfZm9yX2NodW5rW2kgLyA4XTsKKyAgICAgIHVpbnQzMiBtYXNrID0gZmllbGRzX21hc2tfZm9yX2NodW5rW2kgLyA4XTsKKyAgICAgIGludCBjb3VudCA9IHBvcGNudChtYXNrKTsKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfR0UoY291bnQsIDEpOworICAgICAgaWYgKGNvdW50ID09IDEgfHwKKyAgICAgICAgICAoY291bnQgPD0gNCAmJiBjb3VudCA9PSBtZW1zZXRfZmllbGRfY291bnRfZm9yX2NodW5rW2kgLyA4XSkpIHsKKyAgICAgICAgLy8gTm8gImlmIiBoZXJlIGJlY2F1c2UgdGhlIGNodW5rIGlzIHRyaXZpYWwuCisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgImlmIChfaGFzX2JpdHNfWyRpbmRleCQgLyAzMl0gJiAkbWFzayR1KSB7XG4iLAorICAgICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShpIC8gOCAqIDgpLAorICAgICAgICAgICAgIm1hc2siLCBTaW1wbGVJdG9hKG1hc2spKTsKKyAgICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgICAgICBjaHVua19ibG9ja19pbl9wcm9ncmVzcyA9IHRydWU7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KG1lbXNldHMuY19zdHIoKSk7CisgICAgfQorICAgIGxhc3RfaW5kZXggPSBpOworICAgIGlmIChoYW5kbGVkLmNvdW50KGZpZWxkbmFtZSkgPiAwKSBjb250aW51ZTsKKworICAgIC8vIEl0J3MgZmFzdGVyIHRvIGp1c3Qgb3ZlcndyaXRlIHByaW1pdGl2ZSB0eXBlcywgYnV0IHdlIHNob3VsZAorICAgIC8vIG9ubHkgY2xlYXIgc3RyaW5ncyBhbmQgbWVzc2FnZXMgaWYgdGhleSB3ZXJlIHNldC4KKyAgICAvLyBUT0RPKGtlbnRvbik6ICBMZXQgdGhlIENwcEZpZWxkR2VuZXJhdG9yIGRlY2lkZSB0aGlzIHNvbWVob3cuCisgICAgYm9vbCBzaG91bGRfY2hlY2tfYml0ID0KKyAgICAgIGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFIHx8CisgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOworCisgICAgYm9vbCBoYXZlX2VuY2xvc2luZ19pZiA9IGZhbHNlOworICAgIGlmIChzaG91bGRfY2hlY2tfYml0ICYmCisgICAgICAgIC8vIElmIG5vIGZpZWxkIHByZXNlbmNlLCB0aGVuIGFsd2F5cyBjbGVhciBzdHJpbmdzL21lc3NhZ2VzIGFzIHdlbGwuCisgICAgICAgIEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLCAibmFtZSIsIGZpZWxkbmFtZSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIGhhdmVfZW5jbG9zaW5nX2lmID0gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAodXNlX2RlcGVuZGVudF9iYXNlXyAmJiBJc0ZpZWxkRGVwZW5kZW50KGZpZWxkKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoImNsZWFyXyRuYW1lJCgpO1xuIiwgIm5hbWUiLCBmaWVsZG5hbWUpOworICAgIH0gZWxzZSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworICAgIH0KKworICAgIGlmIChoYXZlX2VuY2xvc2luZ19pZikgeworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgIH0KKyAgfQorCisgIGlmIChjaHVua19ibG9ja19pbl9wcm9ncmVzcykgewogICAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgICBwcmludGVyLT5QcmludCgifVxuIik7CiAgIH0KKyAgaWYgKG1hY3Jvc19hcmVfbmVlZGVkKSB7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJcbiN1bmRlZiBaUl9IRUxQRVJfXG4jdW5kZWYgWlJfXG5cbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICB9CiAKLSAgLy8gUmVwZWF0ZWQgZmllbGRzIGRvbid0IHVzZSBfaGFzX2JpdHNfIHNvIHdlIGNsZWFyIHRoZW0gaW4gYSBzZXBhcmF0ZQotICAvLyBwYXNzLgorICAvLyBTdGVwIDM6IFJlcGVhdGVkIGZpZWxkcyBkb24ndCB1c2UgX2hhc19iaXRzXzsgZW1pdCBjb2RlIHRvIGNsZWFyIHRoZW0gaGVyZS4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKIAogICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKKyAgICAgIGlmICh1c2VfZGVwZW5kZW50X2Jhc2VfICYmIElzRmllbGREZXBlbmRlbnQoZmllbGQpKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KCJjbGVhcl8kbmFtZSQoKTtcbiIsICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQ2xlYXJpbmdDb2RlKHByaW50ZXIpOworICAgICAgfQogICAgIH0KICAgfQogCi0gIHByaW50ZXItPlByaW50KAotICAgICI6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpO1xuIik7Ci0KLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgLy8gU3RlcCA0OiBVbmlvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAibXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpO1xuIik7CisgICAgICAgICJjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIsCisgICAgICAgICJvbmVvZl9uYW1lIiwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPm5hbWUoKSk7CisgIH0KKworICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIFN0ZXAgNTogRXZlcnl0aGluZyBlbHNlLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIjo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7XG4iKTsKKyAgfQorCisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7XG4iCisgICAgICAgICIgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJfdW5rbm93bl9maWVsZHNfLkNsZWFyVG9FbXB0eShcbiIKKyAgICAgICAgICAiICAgICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSxcbiIKKyAgICAgICAgICAiICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiX3Vua25vd25fZmllbGRzXy5DbGVhclRvRW1wdHlOb0FyZW5hKFxuIgorICAgICAgICAgICIgICAgJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTtcbiIpOworICAgICAgfQorICAgIH0KICAgfQogCiAgIHByaW50ZXItPk91dGRlbnQoKTsKQEAgLTEyMzQsMjggKzI1NTMsMTMxIEBACiB9CiAKIHZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZU9uZW9mQ2xlYXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgLy8gR2VuZXJhdGVkIGZ1bmN0aW9uIGNsZWFycyB0aGUgYWN0aXZlIGZpZWxkIGFuZCB1bmlvbiBjYXNlIChlLmcuIGZvb19jYXNlXykuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBvbmVvZl92YXJzOworICAgIG9uZW9mX3ZhcnNbImNsYXNzbmFtZSJdID0gY2xhc3NuYW1lXzsKKyAgICBvbmVvZl92YXJzWyJvbmVvZm5hbWUiXSA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCk7CisgICAgb25lb2ZfdmFyc1siZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCk7CisgICAgc3RyaW5nIG1lc3NhZ2VfY2xhc3M7CisKKyAgICBwcmludGVyLT5QcmludChvbmVvZl92YXJzLAorICAgICAgICAgICAgICAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpjbGVhcl8kb25lb2ZuYW1lJCgpIHtcbiIKKyAgICAgICAgICAgICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG9uZV9vZl9jbGVhcl9zdGFydDoiCisgICAgICAgICAgICAgICAgICAgIiRmdWxsX25hbWUkKVxuIik7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQob25lb2ZfdmFycywKKyAgICAgICAgInN3aXRjaCgkb25lb2ZuYW1lJF9jYXNlKCkpIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJjYXNlIGskZmllbGRfbmFtZSQ6IHtcbiIsCisgICAgICAgICAgImZpZWxkX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgLy8gV2UgY2xlYXIgb25seSBhbGxvY2F0ZWQgb2JqZWN0cyBpbiBvbmVvZnMKKyAgICAgIGlmICghSXNTdHJpbmdPck1lc3NhZ2UoZmllbGQpKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgIi8vIE5vIG5lZWQgdG8gY2xlYXJcbiIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUNsZWFyaW5nQ29kZShwcmludGVyKTsKKyAgICAgIH0KKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJicmVhaztcbiIpOworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImNhc2UgJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUOiB7XG4iCisgICAgICAgICIgIGJyZWFrO1xuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgImNhcF9vbmVvZl9uYW1lIiwKKyAgICAgICAgVG9VcHBlcihkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKSk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifVxuIgorICAgICAgICAiX29uZW9mX2Nhc2VfWyRvbmVvZl9pbmRleCRdID0gJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUO1xuIiwKKyAgICAgICAgIm9uZW9mX2luZGV4IiwgU2ltcGxlSXRvYShpKSwKKyAgICAgICAgImNhcF9vbmVvZl9uYW1lIiwKKyAgICAgICAgVG9VcHBlcihkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKSk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifVxuIgorICAgICAgICAiXG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgogR2VuZXJhdGVTd2FwKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIEdlbmVyYXRlIHRoZSBTd2FwIG1lbWJlciBmdW5jdGlvbi4KLSAgcHJpbnRlci0+UHJpbnQoInZvaWQgJGNsYXNzbmFtZSQ6OlN3YXAoJGNsYXNzbmFtZSQqIG90aGVyKSB7XG4iLAorICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gR2VuZXJhdGUgdGhlIFN3YXAgbWVtYmVyIGZ1bmN0aW9uLiBUaGlzIGlzIGEgbGlnaHR3ZWlnaHQgd3JhcHBlciBhcm91bmQKKyAgICAvLyBVbnNhZmVBcmVuYVN3YXAoKSAvIE1lcmdlRnJvbSgpIHdpdGggdGVtcG9yYXJpZXMsIGRlcGVuZGluZyBvbiB0aGUgbWVtb3J5CisgICAgLy8gb3duZXJzaGlwIHNpdHVhdGlvbjogc3dhcHBpbmcgYWNyb3NzIGFyZW5hcyBvciBiZXR3ZWVuIGFuIGFyZW5hIGFuZCBhCisgICAgLy8gaGVhcCByZXF1aXJlcyBjb3B5aW5nLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSB2b2lkICRjbGFzc25hbWUkOjpTd2FwKCRjbGFzc25hbWUkKiBvdGhlcikge1xuIgorICAgICAgICAiICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuO1xuIgorICAgICAgICAiICBpZiAoR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSkge1xuIgorICAgICAgICAiICAgIEludGVybmFsU3dhcChvdGhlcik7XG4iCisgICAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAgICIgICAgJGNsYXNzbmFtZSQgdGVtcDtcbiIKKyAgICAgICAgIiAgICB0ZW1wLk1lcmdlRnJvbSgqdGhpcyk7XG4iCisgICAgICAgICIgICAgQ29weUZyb20oKm90aGVyKTtcbiIKKyAgICAgICAgIiAgICBvdGhlci0+Q29weUZyb20odGVtcCk7XG4iCisgICAgICAgICIgIH1cbiIKKyAgICAgICAgIn1cbiIKKyAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlVuc2FmZUFyZW5hU3dhcCgkY2xhc3NuYW1lJCogb3RoZXIpIHtcbiIKKyAgICAgICAgIiAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjtcbiIKKyAgICAgICAgIiAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYU5vVmlydHVhbCgpID09IG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICAgIiAgSW50ZXJuYWxTd2FwKG90aGVyKTtcbiIKKyAgICAgICAgIn1cbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OlN3YXAoJGNsYXNzbmFtZSQqIG90aGVyKSB7XG4iCisgICAgICAgICIgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47XG4iCisgICAgICAgICIgIEludGVybmFsU3dhcChvdGhlcik7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0KKworICAvLyBHZW5lcmF0ZSB0aGUgVW5zYWZlQXJlbmFTd2FwIG1lbWJlciBmdW5jdGlvbi4KKyAgcHJpbnRlci0+UHJpbnQoInZvaWQgJGNsYXNzbmFtZSQ6OkludGVybmFsU3dhcCgkY2xhc3NuYW1lJCogb3RoZXIpIHtcbiIsCiAgICAgICAgICAgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJpZiAob3RoZXIgIT0gdGhpcykge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOwogCi0gIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewogICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVTd2FwcGluZ0NvZGUocHJpbnRlcik7CiAgICAgfQogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCAoZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgKyAzMSkgLyAzMjsgKytpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgic3RkOjpzd2FwKF9oYXNfYml0c19bJGkkXSwgb3RoZXItPl9oYXNfYml0c19bJGkkXSk7XG4iLAotICAgICAgICAgICAgICAgICAgICAgImkiLCBTaW1wbGVJdG9hKGkpKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJzdGQ6OnN3YXAoJG9uZW9mX25hbWUkXywgb3RoZXItPiRvbmVvZl9uYW1lJF8pO1xuIgorICAgICAgICAic3RkOjpzd2FwKF9vbmVvZl9jYXNlX1skaSRdLCBvdGhlci0+X29uZW9mX2Nhc2VfWyRpJF0pO1xuIiwKKyAgICAgICAgIm9uZW9mX25hbWUiLCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpLAorICAgICAgICAiaSIsIFNpbXBsZUl0b2EoaSkpOwogICAgIH0KIAotICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7ICsraSkgeworICAgICAgICBwcmludGVyLT5QcmludCgic3RkOjpzd2FwKF9oYXNfYml0c19bJGkkXSwgb3RoZXItPl9oYXNfYml0c19bJGkkXSk7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAiaSIsIFNpbXBsZUl0b2EoaSkpOworICAgICAgfQorICAgIH0KKworICAgIC8vIElnbm9yZSBQcmVzZXJ2ZVVua25vd25GaWVsZHMgaGVyZSAtIGFsd2F5cyBzd2FwIGludGVybmFsX21ldGFkYXRhIGFzIGl0CisgICAgLy8gbWF5IGNvbnRhaW4gbW9yZSB0aGFuIGp1c3QgdW5rbm93biBmaWVsZHMuCisgICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTtcbiIpOworICAgIH0gZWxzZSB7CiAgICAgICBwcmludGVyLT5QcmludCgiX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7XG4iKTsKICAgICB9CisKICAgICBwcmludGVyLT5QcmludCgic3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTtcbiIpOwogICAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CiAgICAgICBwcmludGVyLT5QcmludCgiX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pO1xuIik7CkBAIC0xMjY2LDE5ICsyNjg4LDE5IEBACiAKICAgcHJpbnRlci0+T3V0ZGVudCgpOwogICBwcmludGVyLT5QcmludCgifVxuIik7Ci0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQogCiB2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgogR2VuZXJhdGVNZXJnZUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICAvLyBHZW5lcmF0ZSB0aGUgZ2VuZXJhbGl6ZWQgTWVyZ2VGcm9tIChha2EgdGhhdCB3aGljaCB0YWtlcyBpbiB0aGUgTWVzc2FnZQogICAgIC8vIGJhc2UgY2xhc3MgYXMgYSBwYXJhbWV0ZXIpLgogICAgIHByaW50ZXItPlByaW50KAotICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHtcbiIKLSAgICAgICIgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkge1xuIgorICAgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6IgorICAgICAgICAiJGZ1bGxfbmFtZSQpXG4iCisgICAgICAgICIgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7XG4iLAorICAgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CiAgICAgcHJpbnRlci0+SW5kZW50KCk7CiAKICAgICAvLyBDYXN0IHRoZSBtZXNzYWdlIHRvIHRoZSBwcm9wZXIgdHlwZS4gSWYgd2UgZmluZCB0aGF0IHRoZSBtZXNzYWdlIGlzCkBAIC0xMjg2LDE1ICsyNzA4LDE5IEBACiAgICAgLy8gc3lzdGVtLCBhcyB0aGUgR09PR0xFX0NIRUNLIGFib3ZlIGVuc3VyZWQgdGhhdCB3ZSBoYXZlIHRoZSBzYW1lIGRlc2NyaXB0b3IKICAgICAvLyBmb3IgZWFjaCBtZXNzYWdlLgogICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNvbnN0ICRjbGFzc25hbWUkKiBzb3VyY2UgPVxuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCAkY2xhc3NuYW1lJCo+KFxuIgotICAgICAgIiAgICAmZnJvbSk7XG4iCisgICAgICAiY29uc3QgJGNsYXNzbmFtZSQqIHNvdXJjZSA9IFxuIgorICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0ICRjbGFzc25hbWUkPihcbiIKKyAgICAgICIgICAgICAgICZmcm9tKTtcbiIKICAgICAgICJpZiAoc291cmNlID09IE5VTEwpIHtcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6IgorICAgICAgIiRmdWxsX25hbWUkKVxuIgogICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7XG4iCiAgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6IgorICAgICAgIiRmdWxsX25hbWUkKVxuIgogICAgICAgIiAgTWVyZ2VGcm9tKCpzb3VyY2UpO1xuIgogICAgICAgIn1cbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CiAKICAgICBwcmludGVyLT5PdXRkZW50KCk7CiAgICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CkBAIC0xMzExLDkgKzI3MzcsMTEgQEAKIAogICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3Mtc3BlY2lmaWMgTWVyZ2VGcm9tLCB3aGljaCBhdm9pZHMgdGhlIEdPT0dMRV9DSEVDSyBhbmQgY2FzdC4KICAgcHJpbnRlci0+UHJpbnQoCi0gICAgInZvaWQgJGNsYXNzbmFtZSQ6Ok1lcmdlRnJvbShjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSkge1xuIgotICAgICIgIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7XG4iLAotICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpNZXJnZUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pIHtcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDoiCisgICAgICAiJGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pO1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLCAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKICAgLy8gTWVyZ2UgUmVwZWF0ZWQgZmllbGRzLiBUaGVzZSBmaWVsZHMgZG8gbm90IHJlcXVpcmUgYQpAQCAtMTMyNiw0MCArMjc1NCw4NSBAQAogICAgIH0KICAgfQogCisgIC8vIE1lcmdlIG9uZW9mIGZpZWxkcy4gT25lb2YgZmllbGQgcmVxdWlyZXMgb25lb2YgY2FzZSBjaGVjay4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgInN3aXRjaCAoZnJvbS4kb25lb2ZuYW1lJF9jYXNlKCkpIHtcbiIsCisgICAgICAgICJvbmVvZm5hbWUiLCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGQoaik7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiY2FzZSBrJGZpZWxkX25hbWUkOiB7XG4iLAorICAgICAgICAgICJmaWVsZF9uYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCB0cnVlKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVNZXJnaW5nQ29kZShwcmludGVyKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJicmVhaztcbiIpOworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImNhc2UgJGNhcF9vbmVvZl9uYW1lJF9OT1RfU0VUOiB7XG4iCisgICAgICAgICIgIGJyZWFrO1xuIgorICAgICAgICAifVxuIiwKKyAgICAgICAgImNhcF9vbmVvZl9uYW1lIiwKKyAgICAgICAgVG9VcHBlcihkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+bmFtZSgpKSk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAifVxuIik7CisgIH0KKwogICAvLyBNZXJnZSBPcHRpb25hbCBhbmQgUmVxdWlyZWQgZmllbGRzIChhZnRlciBhIF9oYXNfYml0IGNoZWNrKS4KICAgaW50IGxhc3RfaW5kZXggPSAtMTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyArK2kpIHsKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwogCi0gICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgLy8gU2VlIGFib3ZlIGluIEdlbmVyYXRlQ2xlYXIgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoaXMuCi0gICAgICBpZiAoaSAvIDggIT0gbGFzdF9pbmRleCAvIDggfHwgbGFzdF9pbmRleCA8IDApIHsKLSAgICAgICAgaWYgKGxhc3RfaW5kZXggPj0gMCkgewotICAgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgICAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAgICAgLy8gU2VlIGFib3ZlIGluIEdlbmVyYXRlQ2xlYXIgZm9yIGFuIGV4cGxhbmF0aW9uIG9mIHRoaXMuCisgICAgICAgIGlmIChpIC8gOCAhPSBsYXN0X2luZGV4IC8gOCB8fCBsYXN0X2luZGV4IDwgMCkgeworICAgICAgICAgIGlmIChsYXN0X2luZGV4ID49IDApIHsKKyAgICAgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICAgICAgICB9CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiaWYgKGZyb20uX2hhc19iaXRzX1skaW5kZXgkIC8gMzJdICYgIgorICAgICAgICAgICAgIigweGZmdSA8PCAoJGluZGV4JCAlIDMyKSkpIHtcbiIsCisgICAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGZpZWxkLT5pbmRleCgpKSk7CisgICAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CiAgICAgICAgIH0KLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmIChmcm9tLl9oYXNfYml0c19bJGluZGV4JCAvIDMyXSAmICgweGZmdSA8PCAoJGluZGV4JCAlIDMyKSkpIHtcbiIsCi0gICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShmaWVsZC0+aW5kZXgoKSkpOwotICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKICAgICAgIH0KIAogICAgICAgbGFzdF9pbmRleCA9IGk7CiAKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaWYgKGZyb20uaGFzXyRuYW1lJCgpKSB7XG4iLAotICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwotICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBib29sIGhhdmVfZW5jbG9zaW5nX2lmID0gZmFsc2U7CisgICAgICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKGZyb20uaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgICBoYXZlX2VuY2xvc2luZ19pZiA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBNZXJnZSBzZW1hbnRpY3Mgd2l0aG91dCB0cnVlIGZpZWxkIHByZXNlbmNlOiBwcmltaXRpdmUgZmllbGRzIGFyZQorICAgICAgICAvLyBtZXJnZWQgb25seSBpZiBub24temVybyAobnVtZXJpYykgb3Igbm9uLWVtcHR5IChzdHJpbmcpLgorICAgICAgICBoYXZlX2VuY2xvc2luZ19pZiA9IEVtaXRGaWVsZE5vbkRlZmF1bHRDb25kaXRpb24oCisgICAgICAgICAgICBwcmludGVyLCAiZnJvbS4iLCBmaWVsZCk7CisgICAgICB9CiAKICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVNZXJnaW5nQ29kZShwcmludGVyKTsKIAotICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgICAgaWYgKGhhdmVfZW5jbG9zaW5nX2lmKSB7CisgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgICAgfQogICAgIH0KICAgfQogCi0gIGlmIChsYXN0X2luZGV4ID49IDApIHsKKyAgaWYgKEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgICAgIGxhc3RfaW5kZXggPj0gMCkgewogICAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgICBwcmludGVyLT5QcmludCgifVxuIik7CiAgIH0KQEAgLTEzNjgsOSArMjg0MSwxOCBAQAogICAgIHByaW50ZXItPlByaW50KCJfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTtcbiIpOwogICB9CiAKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpO1xuIik7CisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHtcbiIKKyAgICAgICAgIiAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIH0gZWxzZSB7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImlmICghZnJvbS51bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHtcbiIKKyAgICAgICAgIiAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5hcHBlbmQoZnJvbS51bmtub3duX2ZpZWxkcygpKTtcbiIKKyAgICAgICAgIn1cbiIpOworICAgIH0KICAgfQogCiAgIHByaW50ZXItPk91dGRlbnQoKTsKQEAgLTEzNzksMTIgKzI4NjEsMTQgQEAKIAogdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKIEdlbmVyYXRlQ29weUZyb20oaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKICAgICAvLyBHZW5lcmF0ZSB0aGUgZ2VuZXJhbGl6ZWQgQ29weUZyb20gKGFrYSB0aGF0IHdoaWNoIHRha2VzIGluIHRoZSBNZXNzYWdlCiAgICAgLy8gYmFzZSBjbGFzcyBhcyBhIHBhcmFtZXRlcikuCiAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7XG4iLAotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7XG4iCisgICAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0OiIKKyAgICAgICAgIiRmdWxsX25hbWUkKVxuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwogICAgIHByaW50ZXItPkluZGVudCgpOwogCiAgICAgcHJpbnRlci0+UHJpbnQoCkBAIC0xMzk4LDggKzI4ODIsMTAgQEAKIAogICAvLyBHZW5lcmF0ZSB0aGUgY2xhc3Mtc3BlY2lmaWMgQ29weUZyb20uCiAgIHByaW50ZXItPlByaW50KAotICAgICJ2b2lkICRjbGFzc25hbWUkOjpDb3B5RnJvbShjb25zdCAkY2xhc3NuYW1lJCYgZnJvbSkge1xuIiwKLSAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6Q29weUZyb20oY29uc3QgJGNsYXNzbmFtZSQmIGZyb20pIHtcbiIKKyAgICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0OiIKKyAgICAgICIkZnVsbF9uYW1lJClcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXywgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CiAgIHByaW50ZXItPkluZGVudCgpOwogCiAgIHByaW50ZXItPlByaW50KApAQCAtMTQyMSwxNSArMjkwNywxNSBAQAogICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwogCiAgICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKLSAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAgICIgIHJldHVybiBfZXh0ZW5zaW9uc18uUGFyc2VNZXNzYWdlU2V0KGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXyxcbiIKLSAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSk7XG4iLAotICAgICAgLy8gV2l0aG91dC4KLSAgICAgICIgIHJldHVybiBfZXh0ZW5zaW9uc18uUGFyc2VNZXNzYWdlU2V0KGlucHV0LCAmZGVmYXVsdF9pbnN0YW5jZSgpLFxuIgotICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKTtcbiIsCi0gICAgICAvLyBWYXJzLgotICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKKyAgICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgICAiICByZXR1cm4gX2V4dGVuc2lvbnNfLlBhcnNlTWVzc2FnZVNldChpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sXG4iCisgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSk7XG4iLAorICAgICAgICAvLyBXaXRob3V0LgorICAgICAgICAiICByZXR1cm4gX2V4dGVuc2lvbnNfLlBhcnNlTWVzc2FnZVNldChpbnB1dCwgJmRlZmF1bHRfaW5zdGFuY2UoKSxcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKTtcbiIsCisgICAgICAgIC8vIFZhcnMuCisgICAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKIAogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIn1cbiIpOwpAQCAtMTQzOSwxNCArMjkyNSw0NSBAQAogICBwcmludGVyLT5QcmludCgKICAgICAiYm9vbCAkY2xhc3NuYW1lJDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKFxuIgogICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHtcbiIKLSAgICAiI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZVxuIgotICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZztcbiIKLSAgICAiICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHtcbiIsCisgICAgIiNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlXG4iCisgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnO1xuIiwKICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CiAKKyAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykgJiYKKyAgICAgICFVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgLy8gVXNlIExhenlTdHJpbmdPdXRwdXRTdHJpbmcgdG8gYXZvaWQgaW5pdGlhbGl6aW5nIHVua25vd24gZmllbGRzIHN0cmluZworICAgIC8vIHVubGVzcyBpdCBpcyBhY3R1YWxseSBuZWVkZWQuIEZvciB0aGUgc2FtZSByZWFzb24sIGRpc2FibGUgZWFnZXIgcmVmcmVzaAorICAgIC8vIG9uIHRoZSBDb2RlZE91dHB1dFN0cmVhbS4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkxhenlTdHJpbmdPdXRwdXRTdHJlYW0gdW5rbm93bl9maWVsZHNfc3RyaW5nKFxuIgorICAgICAgIiAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5ld1Blcm1hbmVudENhbGxiYWNrKFxuIgorICAgICAgIiAgICAgICAgICAmTXV0YWJsZVVua25vd25GaWVsZHNGb3IkY2xhc3NuYW1lJCwgdGhpcykpO1xuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0gdW5rbm93bl9maWVsZHNfc3RyZWFtKFxuIgorICAgICAgIiAgICAgICZ1bmtub3duX2ZpZWxkc19zdHJpbmcsIGZhbHNlKTtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CisgIH0KKworICBwcmludGVyLT5QcmludCgKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCiAgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgiZm9yICg7Oykge1xuIik7CiAgIHByaW50ZXItPkluZGVudCgpOwogCisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IgKiA+IG9yZGVyZWRfZmllbGRzKAorICAgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CisgIHVpbnQzMiBtYXh0YWcgPSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSA9PSAwID8gMCA6CisgICAgICBXaXJlRm9ybWF0OjpNYWtlVGFnKG9yZGVyZWRfZmllbGRzW2Rlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpIC0gMV0pOworICBjb25zdCBpbnQga0N1dG9mZjAgPSAxMjc7ICAgICAgICAgICAgICAgLy8gZml0cyBpbiAxLWJ5dGUgdmFyaW50CisgIGNvbnN0IGludCBrQ3V0b2ZmMSA9ICgxMjcgPDwgNykgKyAxMjc7ICAvLyBmaXRzIGluIDItYnl0ZSB2YXJpbnQKKyAgcHJpbnRlci0+UHJpbnQoIjo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9ICIKKyAgICAgICAgICAgICAgICAgImlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigkbWF4JCk7XG4iCisgICAgICAgICAgICAgICAgICJ0YWcgPSBwLmZpcnN0O1xuIgorICAgICAgICAgICAgICAgICAiaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDtcbiIsCisgICAgICAgICAgICAgICAgICJtYXgiLCBTaW1wbGVJdG9hKG1heHRhZyA8PSBrQ3V0b2ZmMCA/IGtDdXRvZmYwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1heHRhZyA8PSBrQ3V0b2ZmMSA/IGtDdXRvZmYxIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1heHRhZykpKTsKICAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpID4gMCkgewogICAgIC8vIFdlIGRvbid0IGV2ZW4gd2FudCB0byBwcmludCB0aGUgc3dpdGNoKCkgaWYgd2UgaGF2ZSBubyBmaWVsZHMgYmVjYXVzZQogICAgIC8vIE1TVkMgZGlzbGlrZXMgc3dpdGNoKCkgc3RhdGVtZW50cyB0aGF0IGNvbnRhaW4gb25seSBhIGRlZmF1bHQgdmFsdWUuCkBAIC0xNDU2LDE2ICsyOTczLDI5IEBACiAgICAgLy8gb2YgZWFjaCBjYXNlLiAgSG93ZXZlciwgdGhpcyBpcyBhY3R1YWxseSBhIGJpdCBzbG93ZXIgaW4gcHJhY3RpY2UgYXMgaXQKICAgICAvLyBjcmVhdGVzIGEganVtcCB0YWJsZSB0aGF0IGlzIDh4IGxhcmdlciBhbmQgc3BhcnNlciwgYW5kIG1lYW53aGlsZSB0aGUKICAgICAvLyBpZigpcyBhcmUgaGlnaGx5IHByZWRpY3RhYmxlLgotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHtcbiIpOworICAgIHByaW50ZXItPlByaW50KCJzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoiCisgICAgICAgICAgICAgICAgICAgIkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHtcbiIpOwogCiAgICAgcHJpbnRlci0+SW5kZW50KCk7CiAKLSAgICBzY29wZWRfYXJyYXk8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3JkZXJlZF9maWVsZHMoCi0gICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKLQorICAgIC8vIEZpbmQgcmVwZWF0ZWQgbWVzc2FnZXMgYW5kIGdyb3VwcyBub3csIHRvIHNpbXBsaWZ5IHdoYXQgZm9sbG93cy4KKyAgICBoYXNoX3NldDxpbnQ+IGZpZWxkc193aXRoX3BhcnNlX2xvb3A7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gb3JkZXJlZF9maWVsZHNbaV07CisgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgICAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSB8fAorICAgICAgICAgICBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkpIHsKKyAgICAgICAgZmllbGRzX3dpdGhfcGFyc2VfbG9vcC5pbnNlcnQoaSk7CisgICAgICB9CisgICAgfQorCisgICAgLy8gbmVlZF9sYWJlbCBpcyB0cnVlIGlmIHdlIGdlbmVyYXRlZCAiZ290byBwYXJzZV8kbmFtZSQiIHdoaWxlIGhhbmRsaW5nIHRoZQorICAgIC8vIHByZXZpb3VzIGZpZWxkLgorICAgIGJvb2wgbmVlZF9sYWJlbCA9IGZhbHNlOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IG9yZGVyZWRfZmllbGRzW2ldOworICAgICAgY29uc3QgYm9vbCBsb29wcyA9IGZpZWxkc193aXRoX3BhcnNlX2xvb3AuY291bnQoaSkgPiAwOworICAgICAgY29uc3QgYm9vbCBuZXh0X2ZpZWxkX2xvb3BzID0gZmllbGRzX3dpdGhfcGFyc2VfbG9vcC5jb3VudChpICsgMSkgPiAwOwogCiAgICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CiAKQEAgLTE0NzYsMTkgKzMwMDYsMjQgQEAKICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBmaWVsZF9nZW5lcmF0b3IgPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpOwogCiAgICAgICAvLyBFbWl0IGNvZGUgdG8gcGFyc2UgdGhlIGNvbW1vbiwgZXhwZWN0ZWQgY2FzZS4KLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09XG4iCi0gICAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFXyR3aXJldHlwZSQpIHtcbiIsCi0gICAgICAgICJ3aXJldHlwZSIsIGtXaXJlVHlwZU5hbWVzW1dpcmVGb3JtYXQ6OldpcmVUeXBlRm9yRmllbGQoZmllbGQpXSk7CisgICAgICBwcmludGVyLT5QcmludCgiaWYgKHRhZyA9PSAkY29tbW9udGFnJCkge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICJjb21tb250YWciLCBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZmllbGQpKSk7CiAKLSAgICAgIGlmIChpID4gMCB8fCAoZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgIWZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpKSB7CisgICAgICBpZiAobmVlZF9sYWJlbCB8fAorICAgICAgICAgIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPmlzX3BhY2tlZCgpICYmICFsb29wcykpIHsKICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgIiBwYXJzZV8kbmFtZSQ6XG4iLAorICAgICAgICAgICAgIiBwYXJzZV8kbmFtZSQ6XG4iLAorICAgICAgICAgICAgIm5hbWUiLCBmaWVsZC0+bmFtZSgpKTsKKyAgICAgIH0KKyAgICAgIGlmIChsb29wcykgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpO1xuIgorICAgICAgICAgICIgcGFyc2VfbG9vcF8kbmFtZSQ6XG4iLAogICAgICAgICAgICJuYW1lIiwgZmllbGQtPm5hbWUoKSk7CiAgICAgICB9CiAKICAgICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICAgaWYgKGZpZWxkLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgICAgIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHsKICAgICAgICAgZmllbGRfZ2VuZXJhdG9yLkdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhwcmludGVyKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKHByaW50ZXIpOwpAQCAtMTQ5NiwyMSArMzAzMSwyMyBAQAogICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwogCiAgICAgICAvLyBFbWl0IGNvZGUgdG8gcGFyc2UgdW5leHBlY3RlZGx5IHBhY2tlZCBvciB1bnBhY2tlZCB2YWx1ZXMuCi0gICAgICBpZiAoZmllbGQtPmlzX3BhY2thYmxlKCkgJiYgZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkgewotICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAifSBlbHNlIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKVxuIgotICAgICAgICAgICIgICAgICAgICAgID09IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKLSAgICAgICAgICAiICAgICAgICAgICAgICBXSVJFVFlQRV8kd2lyZXR5cGUkKSB7XG4iLAotICAgICAgICAgICJ3aXJldHlwZSIsCi0gICAgICAgICAga1dpcmVUeXBlTmFtZXNbV2lyZUZvcm1hdDo6V2lyZVR5cGVGb3JGaWVsZFR5cGUoZmllbGQtPnR5cGUoKSldKTsKKyAgICAgIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHsKKyAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJldHlwZSA9CisgICAgICAgICAgICBXaXJlRm9ybWF0OjpXaXJlVHlwZUZvckZpZWxkVHlwZShmaWVsZC0+dHlwZSgpKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIn0gZWxzZSBpZiAodGFnID09ICR1bmNvbW1vbnRhZyQpIHtcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICJ1bmNvbW1vbnRhZyIsIFNpbXBsZUl0b2EoCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLCB3aXJldHlwZSkpKTsKICAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CiAgICAgICAgIGZpZWxkX2dlbmVyYXRvci5HZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKHByaW50ZXIpOwogICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19wYWNrYWJsZSgpICYmICFmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJ9IGVsc2UgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpXG4iCi0gICAgICAgICAgIiAgICAgICAgICAgPT0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgotICAgICAgICAgICIgICAgICAgICAgICAgIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHtcbiIpOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcGFja2FibGUoKSAmJiAhZmllbGQtPmlzX3BhY2tlZCgpKSB7CisgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZXR5cGUgPQorICAgICAgICAgICAgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEOworICAgICAgICBwcmludGVyLT5QcmludCgifSBlbHNlIGlmICh0YWcgPT0gJHVuY29tbW9udGFnJCkge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgInVuY29tbW9udGFnIiwgU2ltcGxlSXRvYSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIHdpcmV0eXBlKSkpOwogICAgICAgICBwcmludGVyLT5JbmRlbnQoKTsKICAgICAgICAgZmllbGRfZ2VuZXJhdG9yLkdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW1XaXRoUGFja2luZyhwcmludGVyKTsKICAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwpAQCAtMTUxOCwzMSArMzA1NSw1OCBAQAogCiAgICAgICBwcmludGVyLT5QcmludCgKICAgICAgICAgIn0gZWxzZSB7XG4iCi0gICAgICAgICIgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7XG4iCisgICAgICAgICIgIGdvdG8gaGFuZGxlX3VudXN1YWw7XG4iCiAgICAgICAgICJ9XG4iKTsKIAogICAgICAgLy8gc3dpdGNoKCkgaXMgc2xvdyBzaW5jZSBpdCBjYW4ndCBiZSBwcmVkaWN0ZWQgd2VsbC4gIEluc2VydCBzb21lIGlmKClzCiAgICAgICAvLyBoZXJlIHRoYXQgYXR0ZW1wdCB0byBwcmVkaWN0IHRoZSBuZXh0IHRhZy4KLSAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSkgewotICAgICAgICAvLyBFeHBlY3QgcmVwZWF0cyBvZiB0aGlzIGZpZWxkLgorICAgICAgLy8gRm9yIG5vbi1wYWNrZWQgcmVwZWF0ZWQgZmllbGRzLCBleHBlY3QgdGhlIHNhbWUgdGFnIGFnYWluLgorICAgICAgaWYgKGxvb3BzKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoaW5wdXQtPkV4cGVjdFRhZygkdGFnJCkpIGdvdG8gcGFyc2VfbG9vcF8kbmFtZSQ7XG4iLAorICAgICAgICAgICJ0YWciLCBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZmllbGQpKSwKKyAgICAgICAgICAibmFtZSIsIGZpZWxkLT5uYW1lKCkpOworICAgICAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhZmllbGQtPmlzX3BhY2tlZCgpKSB7CiAgICAgICAgIHByaW50ZXItPlByaW50KAogICAgICAgICAgICJpZiAoaW5wdXQtPkV4cGVjdFRhZygkdGFnJCkpIGdvdG8gcGFyc2VfJG5hbWUkO1xuIiwKICAgICAgICAgICAidGFnIiwgU2ltcGxlSXRvYShXaXJlRm9ybWF0OjpNYWtlVGFnKGZpZWxkKSksCiAgICAgICAgICAgIm5hbWUiLCBmaWVsZC0+bmFtZSgpKTsKICAgICAgIH0KIAotICAgICAgaWYgKGkgKyAxIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpIHsKLSAgICAgICAgLy8gRXhwZWN0IHRoZSBuZXh0IGZpZWxkIGluIG9yZGVyLgotICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5leHRfZmllbGQgPSBvcmRlcmVkX2ZpZWxkc1tpICsgMV07CisgICAgICAvLyBIYXZlIHdlIGVtaXR0ZWQgImlmIChpbnB1dC0+RXhwZWN0VGFnKCRuZXh0X3RhZyQpKSAuLi4iIHlldD8KKyAgICAgIGJvb2wgZW1pdHRlZF9nb3RvX25leHRfdGFnID0gZmFsc2U7CisKKyAgICAgIC8vIEZvciByZXBlYXRlZCBtZXNzYWdlcy9ncm91cHMsIHdlIG5lZWQgdG8gZGVjcmVtZW50IHJlY3Vyc2lvbiBkZXB0aCwKKyAgICAgIC8vIHVubGVzcyB0aGUgbmV4dCB0YWcgaXMgYWxzbyBmb3IgYSByZXBlYXRlZCBtZXNzYWdlL2dyb3VwLgorICAgICAgaWYgKGxvb3BzKSB7CisgICAgICAgIGlmIChuZXh0X2ZpZWxkX2xvb3BzKSB7CisgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXh0X2ZpZWxkID0gb3JkZXJlZF9maWVsZHNbaSArIDFdOworICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0VGFnKCRuZXh0X3RhZyQpKSBnb3RvIHBhcnNlX2xvb3BfJG5leHRfbmFtZSQ7XG4iLAorICAgICAgICAgICAgIm5leHRfdGFnIiwgU2ltcGxlSXRvYShXaXJlRm9ybWF0OjpNYWtlVGFnKG5leHRfZmllbGQpKSwKKyAgICAgICAgICAgICJuZXh0X25hbWUiLCBuZXh0X2ZpZWxkLT5uYW1lKCkpOworICAgICAgICAgIGVtaXR0ZWRfZ290b19uZXh0X3RhZyA9IHRydWU7CisgICAgICAgIH0KICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmIChpbnB1dC0+RXhwZWN0VGFnKCRuZXh0X3RhZyQpKSBnb3RvIHBhcnNlXyRuZXh0X25hbWUkO1xuIiwKLSAgICAgICAgICAibmV4dF90YWciLCBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcobmV4dF9maWVsZCkpLAotICAgICAgICAgICJuZXh0X25hbWUiLCBuZXh0X2ZpZWxkLT5uYW1lKCkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gRXhwZWN0IEVPRi4KLSAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgRXhwZWN0IGdyb3VwIGVuZC10YWc/Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlO1xuIik7CisgICAgICAgICAgImlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpO1xuIik7CisgICAgICB9CisKKyAgICAgIC8vIElmIHRoZXJlIGFyZSBtb3JlIGZpZWxkcywgZXhwZWN0IHRoZSBuZXh0IG9uZS4KKyAgICAgIG5lZWRfbGFiZWwgPSBmYWxzZTsKKyAgICAgIGlmICghZW1pdHRlZF9nb3RvX25leHRfdGFnKSB7CisgICAgICAgIGlmIChpICsgMSA9PSBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSkgeworICAgICAgICAgIC8vIEV4cGVjdCBFT0YuCisgICAgICAgICAgLy8gVE9ETyhrZW50b24pOiAgRXhwZWN0IGdyb3VwIGVuZC10YWc/CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7XG4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5leHRfZmllbGQgPSBvcmRlcmVkX2ZpZWxkc1tpICsgMV07CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiaWYgKGlucHV0LT5FeHBlY3RUYWcoJG5leHRfdGFnJCkpIGdvdG8gcGFyc2VfJG5leHRfbmFtZSQ7XG4iLAorICAgICAgICAgICAgIm5leHRfdGFnIiwgU2ltcGxlSXRvYShXaXJlRm9ybWF0OjpNYWtlVGFnKG5leHRfZmllbGQpKSwKKyAgICAgICAgICAgICJuZXh0X25hbWUiLCBuZXh0X2ZpZWxkLT5uYW1lKCkpOworICAgICAgICAgIG5lZWRfbGFiZWwgPSB0cnVlOworICAgICAgICB9CiAgICAgICB9CiAKICAgICAgIHByaW50ZXItPlByaW50KApAQCAtMTU1MiwxNyArMzExNiwxOSBAQAogICAgICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CiAgICAgfQogCi0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiZGVmYXVsdDoge1xuIgotICAgICAgImhhbmRsZV91bmludGVycHJldGVkOlxuIik7CisgICAgcHJpbnRlci0+UHJpbnQoImRlZmF1bHQ6IHtcbiIpOwogICAgIHByaW50ZXItPkluZGVudCgpOwogICB9CiAKLSAgLy8gSXMgdGhpcyBhbiBlbmQtZ3JvdXAgdGFnPyAgSWYgc28sIHRoaXMgbXVzdCBiZSB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgorICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJoYW5kbGVfdW51c3VhbDpcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgLy8gSWYgdGFnIGlzIDAgb3IgYW4gZW5kLWdyb3VwIHRhZyB0aGVuIHRoaXMgbXVzdCBiZSB0aGUgZW5kIG9mIHRoZSBtZXNzYWdlLgogICBwcmludGVyLT5QcmludCgKLSAgICAiaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09XG4iCisgICAgImlmICh0YWcgPT0gMCB8fFxuIgorICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT1cbiIKICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHtcbiIKLSAgICAiICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAiICBnb3RvIHN1Y2Nlc3M7XG4iCiAgICAgIn1cbiIpOwogCiAgIC8vIEhhbmRsZSBleHRlbnNpb24gcmFuZ2VzLgpAQCAtMTU5MSwyMiArMzE1NywzMyBAQAogICAgICAgfQogICAgIH0KICAgICBwcmludGVyLT5QcmludCgiKSB7XG4iKTsKLSAgICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgICAgUHJpbnRIYW5kbGluZ09wdGlvbmFsU3RhdGljSW5pdGlhbGl6ZXJzKAotICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBwcmludGVyLAotICAgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCi0gICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXyxcbiIKLSAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpO1xuIiwKLSAgICAgICAgLy8gV2l0aG91dC4KLSAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsICZkZWZhdWx0X2luc3RhbmNlKCksXG4iCi0gICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTtcbiIpOworICAgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgICBQcmludEhhbmRsaW5nT3B0aW9uYWxTdGF0aWNJbml0aWFsaXplcnMoCisgICAgICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKKyAgICAgICAgICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KKyAgICAgICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXyxcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTtcbiIsCisgICAgICAgICAgICAvLyBXaXRob3V0LgorICAgICAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsICZkZWZhdWx0X2luc3RhbmNlKCksXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7XG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKKyAgICAgICAgICAgIGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfLCBwcmludGVyLAorICAgICAgICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLFxuIgorICAgICAgICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ1bmtub3duX2ZpZWxkc19zdHJlYW0pKTtcbiIsCisgICAgICAgICAgICAvLyBXaXRob3V0LgorICAgICAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsICZkZWZhdWx0X2luc3RhbmNlKCksXG4iCisgICAgICAgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnVua25vd25fZmllbGRzX3N0cmVhbSkpO1xuIik7CisgICAgICB9CiAgICAgfSBlbHNlIHsKICAgICAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKLSAgICAgICAgZGVzY3JpcHRvcl8tPmZpbGUoKSwgcHJpbnRlciwKLSAgICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgotICAgICAgICAiICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sIE5VTEwpKTtcbiIsCi0gICAgICAgIC8vIFdpdGhvdXQuCi0gICAgICAgICIgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZGVmYXVsdF9pbnN0YW5jZSgpLCBOVUxMKSk7XG4iKTsKKyAgICAgICAgICBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXywgcHJpbnRlciwKKyAgICAgICAgICAvLyBXaXRoIHN0YXRpYyBpbml0aWFsaXplcnMuCisgICAgICAgICAgIiAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfKTtcbiIsCisgICAgICAgICAgLy8gV2l0aG91dC4KKyAgICAgICAgICAiICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgJmRlZmF1bHRfaW5zdGFuY2UoKSk7XG4iKTsKICAgICB9CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiICBjb250aW51ZTtcbiIKQEAgLTE2MTQsMTIgKzMxOTEsMTkgQEAKICAgfQogCiAgIC8vIFdlIHJlYWxseSBkb24ndCByZWNvZ25pemUgdGhpcyB0YWcuICBTa2lwIGl0LgotICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpO1xuIik7CisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKFVzZVVua25vd25GaWVsZFNldChkZXNjcmlwdG9yXy0+ZmlsZSgpLCBvcHRpb25zXykpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZChcbiIKKyAgICAgICAgIiAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoXG4iCisgICAgICAgICIgICAgaW5wdXQsIHRhZywgJnVua25vd25fZmllbGRzX3N0cmVhbSkpO1xuIik7CisgICAgfQogICB9IGVsc2UgewogICAgIHByaW50ZXItPlByaW50KAotICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIE5VTEwpKTtcbiIpOworICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpKTtcbiIpOwogICB9CiAKICAgaWYgKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpID4gMCkgewpAQCAtMTYzMywyMSArMzIxNywzMCBAQAogICBwcmludGVyLT5PdXRkZW50KCk7CiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgfVxuIiAgICAgICAgICAgICAgICAgICAvLyB3aGlsZQorICAgICIgIH1cbiIgICAgICAgICAgICAgICAgICAgLy8gZm9yICg7OykKKyAgICAic3VjY2VzczpcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2VzczokZnVsbF9uYW1lJClcbiIKICAgICAiICByZXR1cm4gdHJ1ZTtcbiIKKyAgICAiZmFpbHVyZTpcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTokZnVsbF9uYW1lJClcbiIKKyAgICAiICByZXR1cm4gZmFsc2U7XG4iCiAgICAgIiN1bmRlZiBET19cbiIKLSAgICAifVxuIik7CisgICAgIn1cbiIsICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOwogfQogCiB2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU2VyaWFsaXplT25lRmllbGQoCiAgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgdG9fYXJyYXkpIHsKICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOwogCi0gIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgYm9vbCBoYXZlX2VuY2xvc2luZ19pZiA9IGZhbHNlOworICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmIEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKICAgICBwcmludGVyLT5QcmludCgKICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAogICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBoYXZlX2VuY2xvc2luZ19pZiA9IHRydWU7CisgIH0gZWxzZSBpZiAoIUhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBoYXZlX2VuY2xvc2luZ19pZiA9IEVtaXRGaWVsZE5vbkRlZmF1bHRDb25kaXRpb24ocHJpbnRlciwgInRoaXMtPiIsIGZpZWxkKTsKICAgfQogCiAgIGlmICh0b19hcnJheSkgewpAQCAtMTY1Nyw3ICszMjUwLDcgQEAKICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKHByaW50ZXIpOwogICB9CiAKLSAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICBpZiAoaGF2ZV9lbmNsb3NpbmdfaWYpIHsKICAgICBwcmludGVyLT5PdXRkZW50KCk7CiAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogICB9CkBAIC0xNjkyLDExICszMjg1LDEwIEBACiAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHtcbiIKICAgICAgICIgIF9leHRlbnNpb25zXy5TZXJpYWxpemVNZXNzYWdlU2V0V2l0aENhY2hlZFNpemVzKG91dHB1dCk7XG4iLAogICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoXG4iCi0gICAgICAgICIgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpO1xuIik7Ci0gICAgfQorICAgIEdPT0dMRV9DSEVDSyhVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoXG4iCisgICAgICAiICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTtcbiIpOwogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIn1cbiIpOwogICAgIHJldHVybjsKQEAgLTE3MDgsOCArMzMwMCwxNiBAQAogICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCiAgIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keShwcmludGVyLCBmYWxzZSk7CiAKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOiRmdWxsX25hbWUkKVxuIiwKKyAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKwogICBwcmludGVyLT5PdXRkZW50KCk7CiAgIHByaW50ZXItPlByaW50KAogICAgICJ9XG4iKTsKQEAgLTE3MjUsMTIgKzMzMjUsMTEgQEAKICAgICAgICIgIHRhcmdldCA9XG4iCiAgICAgICAiICAgICAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHRhcmdldCk7XG4iLAogICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOwotICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgotICAgICAgICAiICAgICAgICAgICAgIFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXNUb0FycmF5KFxuIgotICAgICAgICAiICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTtcbiIpOwotICAgIH0KKyAgICBHT09HTEVfQ0hFQ0soVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpcbiIKKyAgICAgICIgICAgICAgICAgICAgU2VyaWFsaXplVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1RvQXJyYXkoXG4iCisgICAgICAiICAgICAgICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTtcbiIpOwogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIiAgcmV0dXJuIHRhcmdldDtcbiIKICAgICAgICJ9XG4iKTsKQEAgLTE3NDMsOCArMzM0MiwxNiBAQAogICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCiAgIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keShwcmludGVyLCB0cnVlKTsKIAorICBwcmludGVyLT5QcmludCgKKyAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgIiAgcmV0dXJuIHRhcmdldDtcbiIKQEAgLTE3NTMsMTUgKzMzNjAsMTUgQEAKIAogdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzQm9keShpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCB0b19hcnJheSkgewotICBzY29wZWRfYXJyYXk8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3JkZXJlZF9maWVsZHMoCi0gICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IgKiA+IG9yZGVyZWRfZmllbGRzKAorICAgICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CiAKICAgdmVjdG9yPGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKj4gc29ydGVkX2V4dGVuc2lvbnM7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyArK2kpIHsKICAgICBzb3J0ZWRfZXh0ZW5zaW9ucy5wdXNoX2JhY2soZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZShpKSk7CiAgIH0KLSAgc29ydChzb3J0ZWRfZXh0ZW5zaW9ucy5iZWdpbigpLCBzb3J0ZWRfZXh0ZW5zaW9ucy5lbmQoKSwKLSAgICAgICBFeHRlbnNpb25SYW5nZVNvcnRlcigpKTsKKyAgc3RkOjpzb3J0KHNvcnRlZF9leHRlbnNpb25zLmJlZ2luKCksIHNvcnRlZF9leHRlbnNpb25zLmVuZCgpLAorICAgICAgICAgICAgRXh0ZW5zaW9uUmFuZ2VTb3J0ZXIoKSk7CiAKICAgLy8gTWVyZ2UgdGhlIGZpZWxkcyBhbmQgdGhlIGV4dGVuc2lvbiByYW5nZXMsIGJvdGggc29ydGVkIGJ5IGZpZWxkIG51bWJlci4KICAgaW50IGksIGo7CkBAIC0xNzgzLDM5ICszMzkwLDg0IEBACiAgICAgfQogICB9CiAKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCgiaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHtcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIGlmICh0b19hcnJheSkgeworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgIGlmIChVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CisgICAgICBwcmludGVyLT5QcmludCgiaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7XG4iKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgaWYgKHRvX2FycmF5KSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJ0YXJnZXQgPSAiCisgICAgICAgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheShcbiIKKyAgICAgICAgICAiICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7XG4iKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKFxuIgorICAgICAgICAgICIgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTtcbiIpOworICAgICAgfQorICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworCiAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInRhcmdldCA9ICIKLSAgICAgICAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoXG4iCi0gICAgICAgICIgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTtcbiIpOworICAgICAgICAifVxuIik7CiAgICAgfSBlbHNlIHsKICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoXG4iCi0gICAgICAgICIgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTtcbiIpOworICAgICAgICAib3V0cHV0LT5Xcml0ZVJhdyh1bmtub3duX2ZpZWxkcygpLmRhdGEoKSxcbiIKKyAgICAgICAgIiAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8aW50Pih1bmtub3duX2ZpZWxkcygpLnNpemUoKSkpO1xuIik7CiAgICAgfQotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIn1cbiIpOwogICB9CiB9CiAKK3N0YXRpYyB2ZWN0b3I8dWludDMyPiBSZXF1aXJlZEZpZWxkc0JpdE1hc2soY29uc3QgRGVzY3JpcHRvciogZGVzYykgeworICB2ZWN0b3I8dWludDMyPiByZXN1bHQ7CisgIHVpbnQzMiBtYXNrID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoaSA+IDAgJiYgaSAlIDMyID09IDApIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2sobWFzayk7CisgICAgICBtYXNrID0gMDsKKyAgICB9CisgICAgaWYgKGRlc2MtPmZpZWxkKGkpLT5pc19yZXF1aXJlZCgpKSB7CisgICAgICBtYXNrIHw9ICgxIDw8IChpICYgMzEpKTsKKyAgICB9CisgIH0KKyAgaWYgKG1hc2sgIT0gMCkgeworICAgIHJlc3VsdC5wdXNoX2JhY2sobWFzayk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gQ3JlYXRlIGFuIGV4cHJlc3Npb24gdGhhdCBldmFsdWF0ZXMgdG8KKy8vICAiZm9yIGFsbCBpLCAoX2hhc19iaXRzX1tpXSAmIG1hc2tzW2ldKSA9PSBtYXNrc1tpXSIKKy8vIG1hc2tzIGlzIGFsbG93ZWQgdG8gYmUgc2hvcnRlciB0aGFuIF9oYXNfYml0c18sIGJ1dCBhdCBsZWFzdCBvbmUgZWxlbWVudCBvZgorLy8gbWFza3MgbXVzdCBiZSBub24temVyby4KK3N0YXRpYyBzdHJpbmcgQ29uZGl0aW9uYWxUb0NoZWNrQml0bWFza3MoY29uc3QgdmVjdG9yPHVpbnQzMj4mIG1hc2tzKSB7CisgIHZlY3RvcjxzdHJpbmc+IHBhcnRzOworICBmb3IgKGludCBpID0gMDsgaSA8IG1hc2tzLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKG1hc2tzW2ldID09IDApIGNvbnRpbnVlOworICAgIHN0cmluZyBtID0gU3RyQ2F0KCIweCIsIHN0cmluZ3M6OkhleChtYXNrc1tpXSwgc3RyaW5nczo6WkVST19QQURfOCkpOworICAgIC8vIEVhY2ggeG9yIGV2YWx1YXRlcyB0byAwIGlmIHRoZSBleHBlY3RlZCBiaXRzIGFyZSBwcmVzZW50LgorICAgIHBhcnRzLnB1c2hfYmFjayhTdHJDYXQoIigoX2hhc19iaXRzX1siLCBpLCAiXSAmICIsIG0sICIpIF4gIiwgbSwgIikiKSk7CisgIH0KKyAgR09PR0xFX0NIRUNLKCFwYXJ0cy5lbXB0eSgpKTsKKyAgLy8gSWYgd2UgaGF2ZSBtdWx0aXBsZSBwYXJ0cywgZWFjaCBleHBlY3RlZCB0byBiZSAwLCB0aGVuIGJpdHdpc2Utb3IgdGhlbS4KKyAgc3RyaW5nIHJlc3VsdCA9IHBhcnRzLnNpemUoKSA9PSAxID8gcGFydHNbMF0gOgorICAgICAgU3RyQ2F0KCIoIiwgSm9pbihwYXJ0cywgIlxuICAgICAgIHwgIiksICIpIik7CisgIHJldHVybiByZXN1bHQgKyAiID09IDAiOworfQorCiB2b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OgogR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CiAgICAgLy8gU3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQuCiAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiaW50ICRjbGFzc25hbWUkOjpCeXRlU2l6ZSgpIGNvbnN0IHtcbiIKLSAgICAgICIgIGludCB0b3RhbF9zaXplID0gX2V4dGVuc2lvbnNfLk1lc3NhZ2VTZXRCeXRlU2l6ZSgpO1xuIiwKLSAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfKTsKLSAgICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgotICAgICAgICAiICAgICAgQ29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKHVua25vd25fZmllbGRzKCkpO1xuIik7Ci0gICAgfQorICAgICAgICAiaW50ICRjbGFzc25hbWUkOjpCeXRlU2l6ZSgpIGNvbnN0IHtcbiIKKyAgICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX3NldF9ieXRlX3NpemVfc3RhcnQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAgICIgIGludCB0b3RhbF9zaXplID0gX2V4dGVuc2lvbnNfLk1lc3NhZ2VTZXRCeXRlU2l6ZSgpO1xuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworICAgIEdPT0dMRV9DSEVDSyhVc2VVbmtub3duRmllbGRTZXQoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHtcbiIKKyAgICAgICIgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6XG4iCisgICAgICAiICAgICAgQ29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKHVua25vd25fZmllbGRzKCkpO1xuIgorICAgICAgIn1cbiIpOwogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIiAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTtcbiIKICAgICAgICIgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplO1xuIgpAQCAtMTgyNSw1MyArMzQ3NywxNTkgQEAKICAgICByZXR1cm47CiAgIH0KIAorICBpZiAobnVtX3JlcXVpcmVkX2ZpZWxkc18gPiAxICYmIEhhc0ZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAvLyBFbWl0IGEgZnVuY3Rpb24gKHJhcmVseSB1c2VkLCB3ZSBob3BlKSB0aGF0IGhhbmRsZXMgdGhlIHJlcXVpcmVkIGZpZWxkcworICAgIC8vIGJ5IGNoZWNraW5nIGZvciBlYWNoIG9uZSBpbmRpdmlkdWFsbHkuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpbnQgJGNsYXNzbmFtZSQ6OlJlcXVpcmVkRmllbGRzQnl0ZVNpemVGYWxsYmFjaygpIGNvbnN0IHtcbiIKKyAgICAgICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChyZXF1aXJlZF9maWVsZHNfYnl0ZV9zaXplX2ZhbGxiYWNrX3N0YXJ0OiIKKyAgICAgICAgIiRmdWxsX25hbWUkKVxuIiwKKyAgICAgICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8sICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJpbnQgdG90YWxfc2l6ZSA9IDA7XG4iKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUJ5dGVTaXplKHByaW50ZXIpOworICAgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICAgIH0KKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoIlxuIgorICAgICAgICAgICAgICAgICAgICJyZXR1cm4gdG90YWxfc2l6ZTtcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKwogICBwcmludGVyLT5QcmludCgKLSAgICAiaW50ICRjbGFzc25hbWUkOjpCeXRlU2l6ZSgpIGNvbnN0IHtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGNsYXNzbmFtZV8pOworICAgICAgImludCAkY2xhc3NuYW1lJDo6Qnl0ZVNpemUoKSBjb25zdCB7XG4iCisgICAgICAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0OiRmdWxsX25hbWUkKVxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBjbGFzc25hbWVfLCAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAgIHByaW50ZXItPlByaW50KAogICAgICJpbnQgdG90YWxfc2l6ZSA9IDA7XG4iCiAgICAgIlxuIik7CiAKLSAgaW50IGxhc3RfaW5kZXggPSAtMTsKKyAgLy8gSGFuZGxlIHJlcXVpcmVkIGZpZWxkcyAoaWYgYW55KS4gIFdlIGV4cGVjdCBhbGwgb2YgdGhlbSB0byBiZQorICAvLyBwcmVzZW50LCBzbyBlbWl0IG9uZSBjb25kaXRpb25hbCB0aGF0IGNoZWNrcyBmb3IgdGhhdC4gIElmIHRoZXkgYXJlIGFsbAorICAvLyBwcmVzZW50IHRoZW4gdGhlIGZhc3QgcGF0aCBleGVjdXRlczsgb3RoZXJ3aXNlIHRoZSBzbG93IHBhdGggZXhlY3V0ZXMuCisgIGlmIChudW1fcmVxdWlyZWRfZmllbGRzXyA+IDEgJiYgSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIFRoZSBmYXN0IHBhdGggd29ya3MgaWYgYWxsIHJlcXVpcmVkIGZpZWxkcyBhcmUgcHJlc2VudC4KKyAgICB2ZWN0b3I8dWludDMyPiBtYXNrc19mb3JfaGFzX2JpdHMgPSBSZXF1aXJlZEZpZWxkc0JpdE1hc2soZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KChzdHJpbmcoImlmICgiKSArCisgICAgICAgICAgICAgICAgICAgIENvbmRpdGlvbmFsVG9DaGVja0JpdG1hc2tzKG1hc2tzX2Zvcl9oYXNfYml0cykgKworICAgICAgICAgICAgICAgICAgICAiKSB7ICAvLyBBbGwgcmVxdWlyZWQgZmllbGRzIGFyZSBwcmVzZW50LlxuIikuY19zdHIoKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSkgY29udGludWU7CisgICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlQnl0ZVNpemUocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9IGVsc2Uge1xuIiAgLy8gdGhlIHNsb3cgcGF0aAorICAgICAgICAgICAgICAgICAgICIgIHRvdGFsX3NpemUgKz0gUmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCk7XG4iCisgICAgICAgICAgICAgICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIC8vIG51bV9yZXF1aXJlZF9maWVsZHNfIDw9IDE6IG5vIG5lZWQgdG8gYmUgdHJpY2t5CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSkgY29udGludWU7CisgICAgICBQcmludEZpZWxkQ29tbWVudChwcmludGVyLCBmaWVsZCk7CisgICAgICBwcmludGVyLT5QcmludCgiaWYgKGhhc18kbmFtZSQoKSkge1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICB9CisgIH0KIAorICAvLyBIYW5kbGUgb3B0aW9uYWwgZmllbGRzICh3b3JyeSBiZWxvdyBhYm91dCByZXBlYXRlZHMsIG9uZW9mcywgZXRjLikuCisgIC8vIFRoZXNlIGFyZSBoYW5kbGVkIGluIGNodW5rcyBvZiA4LiAgVGhlIGZpcnN0IGNodW5rIGlzCisgIC8vIHRoZSBub24tcmVxdWlyZWRzLW5vbi1yZXBlYXRlZHMtbm9uLXVuaW9ucy1ub24tZXh0ZW5zaW9ucyBpbgorICAvLyAgZGVzY3JpcHRvcl8tPmZpZWxkKDApLCBkZXNjcmlwdG9yXy0+ZmllbGQoMSksIC4uLiBkZXNjcmlwdG9yXy0+ZmllbGQoNyksCisgIC8vIGFuZCB0aGUgc2Vjb25kIGNodW5rIGlzIHRoZSBzYW1lIGZvcgorICAvLyAgZGVzY3JpcHRvcl8tPmZpZWxkKDgpLCBkZXNjcmlwdG9yXy0+ZmllbGQoOSksIC4uLiBkZXNjcmlwdG9yXy0+ZmllbGQoMTUpLAorICAvLyBldGMuCisgIGhhc2hfbWFwPGludCwgdWludDMyPiBmaWVsZHNfbWFza19mb3JfY2h1bms7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKCFmaWVsZC0+aXNfcmVxdWlyZWQoKSAmJiAhZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYKKyAgICAgICAgIWZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIGZpZWxkc19tYXNrX2Zvcl9jaHVua1tpIC8gOF0gfD0gc3RhdGljX2Nhc3Q8dWludDMyPigxKSA8PCAoaSAlIDMyKTsKKyAgICB9CisgIH0KIAotICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgaW50IGxhc3RfaW5kZXggPSAtMTsKKyAgYm9vbCBjaHVua19ibG9ja19pbl9wcm9ncmVzcyA9IGZhbHNlOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmICghZmllbGQtPmlzX3JlcXVpcmVkKCkgJiYgIWZpZWxkLT5pc19yZXBlYXRlZCgpICYmCisgICAgICAgICFmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7CiAgICAgICAvLyBTZWUgYWJvdmUgaW4gR2VuZXJhdGVDbGVhciBmb3IgYW4gZXhwbGFuYXRpb24gb2YgdGhpcy4KICAgICAgIC8vIFRPRE8oa2VudG9uKTogIFNoYXJlIGNvZGU/ICBVbmNsZWFyIGhvdyB0byBkbyBzbyB3aXRob3V0CiAgICAgICAvLyAgIG92ZXItZW5naW5lZXJpbmcuCi0gICAgICBpZiAoKGkgLyA4KSAhPSAobGFzdF9pbmRleCAvIDgpIHx8Ci0gICAgICAgICAgbGFzdF9pbmRleCA8IDApIHsKLSAgICAgICAgaWYgKGxhc3RfaW5kZXggPj0gMCkgeworICAgICAgaWYgKGkgLyA4ICE9IGxhc3RfaW5kZXggLyA4IHx8IGxhc3RfaW5kZXggPCAwKSB7CisgICAgICAgIC8vIEVuZCBwcmV2aW91cyBjaHVuaywgaWYgdGhlcmUgd2FzIG9uZS4KKyAgICAgICAgaWYgKGNodW5rX2Jsb2NrX2luX3Byb2dyZXNzKSB7CiAgICAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwogICAgICAgICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICAgICAgICBjaHVua19ibG9ja19pbl9wcm9ncmVzcyA9IGZhbHNlOwogICAgICAgICB9Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICJpZiAoX2hhc19iaXRzX1skaW5kZXgkIC8gMzJdICYgKDB4ZmZ1IDw8ICgkaW5kZXgkICUgMzIpKSkge1xuIiwKLSAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGZpZWxkLT5pbmRleCgpKSk7Ci0gICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgICAvLyBTdGFydCBjaHVuay4KKyAgICAgICAgdWludDMyIG1hc2sgPSBmaWVsZHNfbWFza19mb3JfY2h1bmtbaSAvIDhdOworICAgICAgICBpbnQgY291bnQgPSBwb3BjbnQobWFzayk7CisgICAgICAgIEdPT0dMRV9EQ0hFQ0tfR0UoY291bnQsIDEpOworICAgICAgICBpZiAoY291bnQgPT0gMSkgeworICAgICAgICAgIC8vIE5vICJpZiIgaGVyZSBiZWNhdXNlIHRoZSBjaHVuayBpcyB0cml2aWFsLgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICAgImlmIChfaGFzX2JpdHNfWyRpbmRleCQgLyAzMl0gJiAkbWFzayR1KSB7XG4iLAorICAgICAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGkpLAorICAgICAgICAgICAgICAibWFzayIsIFNpbXBsZUl0b2EobWFzaykpOworICAgICAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICAgICAgICBjaHVua19ibG9ja19pbl9wcm9ncmVzcyA9IHRydWU7CisgICAgICAgICAgfQorICAgICAgICB9CiAgICAgICB9CiAgICAgICBsYXN0X2luZGV4ID0gaTsKIAogICAgICAgUHJpbnRGaWVsZENvbW1lbnQocHJpbnRlciwgZmllbGQpOwogCi0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImlmIChoYXNfJG5hbWUkKCkpIHtcbiIsCi0gICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7Ci0gICAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICAgIGJvb2wgaGF2ZV9lbmNsb3NpbmdfaWYgPSBmYWxzZTsKKyAgICAgIGlmIChIYXNGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoaGFzXyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgICBoYXZlX2VuY2xvc2luZ19pZiA9IHRydWU7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBXaXRob3V0IGZpZWxkIHByZXNlbmNlOiBmaWVsZCBpcyBzZXJpYWxpemVkIG9ubHkgaWYgaXQgaGFzIGEKKyAgICAgICAgLy8gbm9uLWRlZmF1bHQgdmFsdWUuCisgICAgICAgIGhhdmVfZW5jbG9zaW5nX2lmID0gRW1pdEZpZWxkTm9uRGVmYXVsdENvbmRpdGlvbigKKyAgICAgICAgICAgIHByaW50ZXIsICJ0aGlzLT4iLCBmaWVsZCk7CisgICAgICB9CiAKICAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVCeXRlU2l6ZShwcmludGVyKTsKIAotICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJ9XG4iCi0gICAgICAgICJcbiIpOworICAgICAgaWYgKGhhdmVfZW5jbG9zaW5nX2lmKSB7CisgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAiXG4iKTsKKyAgICAgIH0KICAgICB9CiAgIH0KIAotICBpZiAobGFzdF9pbmRleCA+PSAwKSB7CisgIGlmIChjaHVua19ibG9ja19pbl9wcm9ncmVzcykgewogICAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgICBwcmludGVyLT5QcmludCgifVxuIik7CiAgIH0KQEAgLTE4ODgsMjEgKzM2NDYsNTcgQEAKICAgICB9CiAgIH0KIAorICAvLyBGaWVsZHMgaW5zaWRlIGEgb25lb2YgZG9uJ3QgdXNlIF9oYXNfYml0c18gc28gd2UgY291bnQgdGhlbSBpbiBhIHNlcGFyYXRlCisgIC8vIHBhc3MuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJzd2l0Y2ggKCRvbmVvZm5hbWUkX2Nhc2UoKSkge1xuIiwKKyAgICAgICAgIm9uZW9mbmFtZSIsIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGZpZWxkKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJjYXNlIGskZmllbGRfbmFtZSQ6IHtcbiIsCisgICAgICAgICAgImZpZWxkX25hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGZpZWxkLT5uYW1lKCksIHRydWUpKTsKKyAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUJ5dGVTaXplKHByaW50ZXIpOworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgImJyZWFrO1xuIik7CisgICAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAifVxuIik7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiY2FzZSAkY2FwX29uZW9mX25hbWUkX05PVF9TRVQ6IHtcbiIKKyAgICAgICAgIiAgYnJlYWs7XG4iCisgICAgICAgICJ9XG4iLAorICAgICAgICAiY2FwX29uZW9mX25hbWUiLAorICAgICAgICBUb1VwcGVyKGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5uYW1lKCkpKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJ9XG4iKTsKKyAgfQorCiAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAidG90YWxfc2l6ZSArPSBfZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTtcbiIKICAgICAgICJcbiIpOwogICB9CiAKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCgiaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHtcbiIpOwotICAgIHByaW50ZXItPkluZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInRvdGFsX3NpemUgKz1cbiIKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoXG4iCi0gICAgICAiICAgIHVua25vd25fZmllbGRzKCkpO1xuIik7Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXykpIHsKKyAgICBpZiAoVXNlVW5rbm93bkZpZWxkU2V0KGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHtcbiIKKyAgICAgICAgIiAgdG90YWxfc2l6ZSArPVxuIgorICAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZShcbiIKKyAgICAgICAgIiAgICAgIHVua25vd25fZmllbGRzKCkpO1xuIgorICAgICAgICAifVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAidG90YWxfc2l6ZSArPSB1bmtub3duX2ZpZWxkcygpLnNpemUoKTtcbiIKKyAgICAgICAgIlxuIik7CisgICAgfQogICB9CiAKICAgLy8gV2UgdXBkYXRlIF9jYWNoZWRfc2l6ZV8gZXZlbiB0aG91Z2ggdGhpcyBpcyBhIGNvbnN0IG1ldGhvZC4gIEluIHRoZW9yeSwKQEAgLTE5MjcsMjcgKzM3MjEsMjggQEAKICAgICAiY2xhc3NuYW1lIiwgY2xhc3NuYW1lXyk7CiAgIHByaW50ZXItPkluZGVudCgpOwogCi0gIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4gIFdlIGNhbiBkbyB0aGlzCi0gIC8vIG1vc3QgZWZmaWNpZW50bHkgYnkgY2hlY2tpbmcgMzIgImhhcyBiaXRzIiBhdCBhIHRpbWUuCi0gIGludCBoYXNfYml0c19hcnJheV9zaXplID0gKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzX2JpdHNfYXJyYXlfc2l6ZTsgaSsrKSB7Ci0gICAgdWludDMyIG1hc2sgPSAwOwotICAgIGZvciAoaW50IGJpdCA9IDA7IGJpdCA8IDMyOyBiaXQrKykgewotICAgICAgaW50IGluZGV4ID0gaSAqIDMyICsgYml0OwotICAgICAgaWYgKGluZGV4ID49IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKSBicmVhazsKLSAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaW5kZXgpOworICBpZiAoSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4gIFdlIGNhbiBkbyB0aGlzCisgICAgLy8gbW9zdCBlZmZpY2llbnRseSBieSBjaGVja2luZyAzMiAiaGFzIGJpdHMiIGF0IGEgdGltZS4KKyAgICBpbnQgaGFzX2JpdHNfYXJyYXlfc2l6ZSA9IChkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSArIDMxKSAvIDMyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgaGFzX2JpdHNfYXJyYXlfc2l6ZTsgaSsrKSB7CisgICAgICB1aW50MzIgbWFzayA9IDA7CisgICAgICBmb3IgKGludCBiaXQgPSAwOyBiaXQgPCAzMjsgYml0KyspIHsKKyAgICAgICAgaW50IGluZGV4ID0gaSAqIDMyICsgYml0OworICAgICAgICBpZiAoaW5kZXggPj0gZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkpIGJyZWFrOworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGluZGV4KTsKIAotICAgICAgaWYgKGZpZWxkLT5pc19yZXF1aXJlZCgpKSB7Ci0gICAgICAgIG1hc2sgfD0gMSA8PCBiaXQ7CisgICAgICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgICAgIG1hc2sgfD0gMSA8PCBiaXQ7CisgICAgICAgIH0KICAgICAgIH0KLSAgICB9CiAKLSAgICBpZiAobWFzayAhPSAwKSB7Ci0gICAgICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImlmICgoX2hhc19iaXRzX1skaSRdICYgMHgkbWFzayQpICE9IDB4JG1hc2skKSByZXR1cm4gZmFsc2U7XG4iLAotICAgICAgICAiaSIsIFNpbXBsZUl0b2EoaSksCi0gICAgICAgICJtYXNrIiwgRmFzdEhleDMyVG9CdWZmZXIobWFzaywgYnVmZmVyKSk7CisgICAgICBpZiAobWFzayAhPSAwKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJpZiAoKF9oYXNfYml0c19bJGkkXSAmIDB4JG1hc2skKSAhPSAweCRtYXNrJCkgcmV0dXJuIGZhbHNlO1xuIiwKKyAgICAgICAgICAiaSIsIFNpbXBsZUl0b2EoaSksCisgICAgICAgICAgIm1hc2siLCBTdHJDYXQoc3RyaW5nczo6SGV4KG1hc2ssIHN0cmluZ3M6OlpFUk9fUEFEXzgpKSk7CisgICAgICB9CiAgICAgfQogICB9CiAKQEAgLTE5NTYsMTkgKzM3NTEsMzAgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKLSAgICAgICAgSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgICAhU2hvdWxkSWdub3JlUmVxdWlyZWRGaWVsZENoZWNrKGZpZWxkLCBvcHRpb25zXykgJiYKKyAgICAgICAgSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBvcHRpb25zXykpIHsKICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewogICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIKLSAgICAgICAgICAiICBpZiAoIXRoaXMtPiRuYW1lJChpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAiaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT4kbmFtZSQoKSkpIgorICAgICAgICAgICIgcmV0dXJuIGZhbHNlO1xuIiwKICAgICAgICAgICAibmFtZSIsIEZpZWxkTmFtZShmaWVsZCkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgImlmIChoYXNfJG5hbWUkKCkpIHtcbiIKLSAgICAgICAgICAiICBpZiAoIXRoaXMtPiRuYW1lJCgpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgICAgICJ9XG4iLAotICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgIGlmIChmaWVsZC0+b3B0aW9ucygpLndlYWsoKSB8fCAhZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgICAgIC8vIEZvciB3ZWFrIGZpZWxkcywgdXNlIHRoZSBkYXRhIG1lbWJlciAoOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKikgaW5zdGVhZAorICAgICAgICAgIC8vIG9mIHRoZSBnZXR0ZXIgdG8gYXZvaWQgYSBsaW5rIGRlcGVuZGVuY3kgb24gdGhlIHdlYWsgbWVzc2FnZSB0eXBlCisgICAgICAgICAgLy8gd2hpY2ggaXMgb25seSBmb3J3YXJkIGRlY2xhcmVkLgorICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIgorICAgICAgICAgICAgICAiICBpZiAoIXRoaXMtPiRuYW1lJF8tPklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICJuYW1lIiwgRmllbGROYW1lKGZpZWxkKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiaWYgKGhhc18kbmFtZSQoKSkge1xuIgorICAgICAgICAgICAgIiAgaWYgKCF0aGlzLT4kbmFtZSQoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgIm5hbWUiLCBGaWVsZE5hbWUoZmllbGQpKTsKKyAgICAgICAgfQogICAgICAgfQogICAgIH0KICAgfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaAppbmRleCAwNDc3OGY2Li4zMTIyM2UxIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2UuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsOSArMzUsMTQgQEAKICNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0NQUF9NRVNTQUdFX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfQ1BQX01FU1NBR0VfSF9fCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTU2LDE0ICs2MSwxOSBAQAogY2xhc3MgTWVzc2FnZUdlbmVyYXRvciB7CiAgcHVibGljOgogICAvLyBTZWUgZ2VuZXJhdG9yLmNjIGZvciB0aGUgbWVhbmluZyBvZiBkbGxleHBvcnRfZGVjbC4KLSAgZXhwbGljaXQgTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGxsZXhwb3J0X2RlY2wpOworICBNZXNzYWdlR2VuZXJhdG9yKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogICB+TWVzc2FnZUdlbmVyYXRvcigpOwogCiAgIC8vIEhlYWRlciBzdHVmZi4KIAotICAvLyBHZW5lcmF0ZSBmb3dhcmQgZGVjbGFyYXRpb25zIGZvciB0aGlzIGNsYXNzIGFuZCBhbGwgaXRzIG5lc3RlZCB0eXBlcy4KLSAgdm9pZCBHZW5lcmF0ZUZvcndhcmREZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIC8vIFJldHVybiBuYW1lcyBmb3IgZm93YXJkIGRlY2xhcmF0aW9ucyBvZiB0aGlzIGNsYXNzIGFuZCBhbGwgaXRzIG5lc3RlZAorICAvLyB0eXBlcy4gQSBnaXZlbiBrZXkgaW4ge2NsYXNzLGVudW19X25hbWVzIHdpbGwgbWFwIGZyb20gYSBjbGFzcyBuYW1lIHRvIHRoZQorICAvLyBkZXNjcmlwdG9yIHRoYXQgd2FzIHJlc3BvbnNpYmxlIGZvciBpdHMgaW5jbHVzaW9uIGluIHRoZSBtYXAuIFRoaXMgY2FuIGJlCisgIC8vIHVzZWQgdG8gYXNzb2NpYXRlIHRoZSBkZXNjcmlwdG9yIHdpdGggdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBpdC4KKyAgdm9pZCBGaWxsTWVzc2FnZUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgICBtYXA8c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj4qIGNsYXNzX25hbWVzKTsKKyAgdm9pZCBGaWxsRW51bUZvcndhcmREZWNsYXJhdGlvbnMoCisgICAgICBtYXA8c3RyaW5nLCBjb25zdCBFbnVtRGVzY3JpcHRvcio+KiBlbnVtX25hbWVzKTsKIAogICAvLyBHZW5lcmF0ZSBkZWZpbml0aW9ucyBvZiBhbGwgbmVzdGVkIGVudW1zIChtdXN0IGNvbWUgYmVmb3JlIGNsYXNzCiAgIC8vIGRlZmluaXRpb25zIGJlY2F1c2UgdGhvc2UgY2xhc3NlcyB1c2UgdGhlIGVudW1zIGRlZmluaXRpb25zKS4KQEAgLTc4LDcgKzg4LDEwIEBACiAKICAgLy8gR2VuZXJhdGUgZGVmaW5pdGlvbnMgb2YgaW5saW5lIG1ldGhvZHMgKHBsYWNlZCBhdCB0aGUgZW5kIG9mIHRoZSBoZWFkZXIKICAgLy8gZmlsZSkuCi0gIHZvaWQgR2VuZXJhdGVJbmxpbmVNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgaXNfaW5saW5lKTsKKworICAvLyBEZXBlbmRlbnQgbWV0aG9kcyBhcmUgYWx3YXlzIGlubGluZS4KKyAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudElubGluZU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOwogCiAgIC8vIFNvdXJjZSBmaWxlIHN0dWZmLgogCkBAIC0xMTEsOCArMTI0LDExIEBACiAKICBwcml2YXRlOgogICAvLyBHZW5lcmF0ZSBkZWNsYXJhdGlvbnMgYW5kIGRlZmluaXRpb25zIG9mIGFjY2Vzc29ycyBmb3IgZmllbGRzLgorICB2b2lkIEdlbmVyYXRlRGVwZW5kZW50QmFzZUNsYXNzRGVmaW5pdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVEZXBlbmRlbnRGaWVsZEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKICAgdm9pZCBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlRmllbGRBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEZpZWxkQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgaXNfaW5saW5lKTsKIAogICAvLyBHZW5lcmF0ZSB0aGUgZmllbGQgb2Zmc2V0cyBhcnJheS4KICAgdm9pZCBHZW5lcmF0ZU9mZnNldHMoaW86OlByaW50ZXIqIHByaW50ZXIpOwpAQCAtMTI4LDkgKzE0NCwxMiBAQAogICB2b2lkIEdlbmVyYXRlU2hhcmVkQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKICAgLy8gR2VuZXJhdGUgdGhlIHNoYXJlZCBkZXN0cnVjdG9yIGNvZGUuCiAgIHZvaWQgR2VuZXJhdGVTaGFyZWREZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIC8vIEdlbmVyYXRlIHRoZSBhcmVuYS1zcGVjaWZpYyBkZXN0cnVjdG9yIGNvZGUuCisgIHZvaWQgR2VuZXJhdGVBcmVuYURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKIAogICAvLyBHZW5lcmF0ZSBzdGFuZGFyZCBNZXNzYWdlIG1ldGhvZHMuCiAgIHZvaWQgR2VuZXJhdGVDbGVhcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVPbmVvZkNsZWFyKGlvOjpQcmludGVyKiBwcmludGVyKTsKICAgdm9pZCBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKTsKICAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKTsKQEAgLTE1MSwxMyArMTcwLDMyIEBACiAgICAgICBib29sIHVuYm91bmRlZCk7CiAKIAorICAvLyBHZW5lcmF0ZXMgaGFzX2ZvbygpIGZ1bmN0aW9ucyBhbmQgdmFyaWFibGVzIGZvciBzaW5ndWxhciBmaWVsZCBoYXMtYml0cy4KKyAgdm9pZCBHZW5lcmF0ZVNpbmd1bGFyRmllbGRIYXNCaXRzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIC8vIEdlbmVyYXRlcyBoYXNfZm9vKCkgZnVuY3Rpb25zIGFuZCB2YXJpYWJsZXMgZm9yIG9uZW9mIGZpZWxkIGhhcy1iaXRzLgorICB2b2lkIEdlbmVyYXRlT25lb2ZIYXNCaXRzKGlvOjpQcmludGVyKiBwcmludGVyLCBib29sIGlzX2lubGluZSk7CisgIC8vIEdlbmVyYXRlcyBoYXNfZm9vX2JhcigpIGZ1bmN0aW9ucyBmb3Igb25lb2YgbWVtYmVycy4KKyAgdm9pZCBHZW5lcmF0ZU9uZW9mTWVtYmVySGFzQml0cyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOworICAvLyBHZW5lcmF0ZXMgdGhlIGNsZWFyX2ZvbygpIG1ldGhvZCBmb3IgYSBmaWVsZC4KKyAgdm9pZCBHZW5lcmF0ZUZpZWxkQ2xlYXIoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOworCiAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwogICBzdHJpbmcgY2xhc3NuYW1lXzsKLSAgc3RyaW5nIGRsbGV4cG9ydF9kZWNsXzsKKyAgT3B0aW9ucyBvcHRpb25zXzsKICAgRmllbGRHZW5lcmF0b3JNYXAgZmllbGRfZ2VuZXJhdG9yc187Ci0gIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+ID4gbmVzdGVkX2dlbmVyYXRvcnNfOwotICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxFbnVtR2VuZXJhdG9yPiA+IGVudW1fZ2VuZXJhdG9yc187Ci0gIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisgIHZlY3RvcjwgdmVjdG9yPHN0cmluZz4gPiBydW5zX29mX2ZpZWxkc187ICAvLyB0aGF0IG1pZ2h0IGJlIHRyaXZpYWxseSBjbGVhcmVkCisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2VHZW5lcmF0b3I+ID4gbmVzdGVkX2dlbmVyYXRvcnNfOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxFbnVtR2VuZXJhdG9yPiA+IGVudW1fZ2VuZXJhdG9yc187CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisgIGludCBudW1fcmVxdWlyZWRfZmllbGRzXzsKKyAgYm9vbCB1c2VzX3N0cmluZ187CisgIGJvb2wgdXNlX2RlcGVuZGVudF9iYXNlXzsKIAogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUdlbmVyYXRvcik7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmNjCmluZGV4IDdjNzg1ZTcuLjMzMmMwMjYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfbWVzc2FnZV9maWVsZC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQ1LDIzICs0NSw0NSBAQAogbmFtZXNwYWNlIHsKIAogdm9pZCBTZXRNZXNzYWdlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKLSAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgdmFyaWFibGVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykgeworICBTZXRDb21tb25GaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCB2YXJpYWJsZXMsIG9wdGlvbnMpOwogICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IEZpZWxkTWVzc2FnZVR5cGVOYW1lKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbInN0cmVhbV93cml0ZXIiXSA9ICgqdmFyaWFibGVzKVsiZGVjbGFyZWRfdHlwZSJdICsKLSAgICAgIChIYXNGYXN0QXJyYXlTZXJpYWxpemF0aW9uKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpLT5maWxlKCkpID8KLSAgICAgICAiTWF5YmVUb0FycmF5IiA6Ci0gICAgICAgIiIpOworICBpZiAoZGVzY3JpcHRvci0+b3B0aW9ucygpLndlYWsoKSB8fCAhZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgKCp2YXJpYWJsZXMpWyJub25fbnVsbF9wdHJfdG9fbmFtZSJdID0KKyAgICAgICAgU3RyQ2F0KCJ0aGlzLT4iLCAoKnZhcmlhYmxlcylbIm5hbWUiXSwgIl8iKTsKKyAgfQorICAoKnZhcmlhYmxlcylbInN0cmVhbV93cml0ZXIiXSA9CisgICAgICAoKnZhcmlhYmxlcylbImRlY2xhcmVkX3R5cGUiXSArCisgICAgICAoSGFzRmFzdEFycmF5U2VyaWFsaXphdGlvbihkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKS0+ZmlsZSgpLCBvcHRpb25zKQorICAgICAgICAgICA/ICJNYXliZVRvQXJyYXkiCisgICAgICAgICAgIDogIiIpOworICAvLyBOT1RFOiBFc2NhcGVkIGhlcmUgdG8gdW5ibG9jayBwcm90bzEtPnByb3RvMiBtaWdyYXRpb24uCisgIC8vIFRPRE8obGl1amlzaSk6IEV4dGVuZCB0aGlzIHRvIGFwcGx5IGZvciBvdGhlciBjb25mbGljdGluZyBtZXRob2RzLgorICAoKnZhcmlhYmxlcylbInJlbGVhc2VfbmFtZSJdID0KKyAgICAgIFNhZmVGdW5jdGlvbk5hbWUoZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsICJyZWxlYXNlXyIpOworICAoKnZhcmlhYmxlcylbImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CisgIGlmIChvcHRpb25zLnByb3RvX2ggJiYgSXNGaWVsZERlcGVuZGVudChkZXNjcmlwdG9yKSkgeworICAgICgqdmFyaWFibGVzKVsiZGVwZW5kZW50X3R5cGUiXSA9ICJUOjoiICsgRGVwZW5kZW50VHlwZU5hbWUoZGVzY3JpcHRvcik7CisgICAgKCp2YXJpYWJsZXMpWyJkZXBlbmRlbnRfdHlwZW5hbWUiXSA9CisgICAgICAgICJ0eXBlbmFtZSBUOjoiICsgRGVwZW5kZW50VHlwZU5hbWUoZGVzY3JpcHRvcik7CisgIH0gZWxzZSB7CisgICAgKCp2YXJpYWJsZXMpWyJkZXBlbmRlbnRfdHlwZSJdID0gRmllbGRNZXNzYWdlVHlwZU5hbWUoZGVzY3JpcHRvcik7CisgICAgKCp2YXJpYWJsZXMpWyJkZXBlbmRlbnRfdHlwZW5hbWUiXSA9IEZpZWxkTWVzc2FnZVR5cGVOYW1lKGRlc2NyaXB0b3IpOworICB9CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1NZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKLSAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CitNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ok1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksCisgICAgICBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICAgIGRlcGVuZGVudF9maWVsZF8ob3B0aW9ucy5wcm90b19oICYmIElzRmllbGREZXBlbmRlbnQoZGVzY3JpcHRvcikpIHsKKyAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXywgb3B0aW9ucyk7CiB9CiAKIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6fk1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CkBAIC03Miw0NCArOTQsMzkwIEBACiB9CiAKIHZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKK0dlbmVyYXRlR2V0dGVyRGVjbGFyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgJHR5cGUkKiBtdXRhYmxlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lICR0eXBlJCogcmVsZWFzZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0ICR0eXBlJCYgJG5hbWUkKCkgY29uc3Q7XG4iKTsKIH0KIAogdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CitHZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghZGVwZW5kZW50X2ZpZWxkXykgeworICAgIHJldHVybjsKKyAgfQorICAvLyBBcmVuYSBtYW5pcHVsYXRpb24gY29kZSBpcyBvdXQtb2YtbGluZSBpbiB0aGUgZGVyaXZlZCBtZXNzYWdlIGNsYXNzLgogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgJHR5cGUkJiAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIik7CisgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkKiBtdXRhYmxlXyRuYW1lJCgpO1xuIgorICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogJHJlbGVhc2VfbmFtZSQoKTtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHNldF9hbGxvY2F0ZWRfJG5hbWUkKCR0eXBlJCogJG5hbWUkKTtcbiIpOworfQorCit2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICJwcml2YXRlOlxuIgorICAgICAgICJ2b2lkIF9zbG93X211dGFibGVfJG5hbWUkKCk7XG4iKTsKKyAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAidm9pZCBfc2xvd19zZXRfYWxsb2NhdGVkXyRuYW1lJChcbiIKKyAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIG1lc3NhZ2VfYXJlbmEsICR0eXBlJCoqICRuYW1lJCk7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAiJHR5cGUkKiBfc2xvd18kcmVsZWFzZV9uYW1lJCgpO1xuIgorICAgICAgICJwdWJsaWM6XG4iKTsKKyAgfQorICBHZW5lcmF0ZUdldHRlckRlY2xhcmF0aW9uKHByaW50ZXIpOworICBpZiAoIWRlcGVuZGVudF9maWVsZF8pIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkKiBtdXRhYmxlXyRuYW1lJCgpO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkKiAkcmVsZWFzZV9uYW1lJCgpO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCk7XG4iKTsKKyAgfQorICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogdW5zYWZlX2FyZW5hX3JlbGVhc2VfJG5hbWUkKCk7XG4iCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkXyRuYW1lJChcbiIKKyAgICAgICIgICAgJHR5cGUkKiAkbmFtZSQpO1xuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpfc2xvd19tdXRhYmxlXyRuYW1lJCgpIHtcbiIpOworICAgICAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAiICAkbmFtZSRfID0gOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWVzc2FnZTwgJHR5cGUkID4oXG4iCisgICAgICAgICAgIiAgICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIik7CisgICAgICB9IGVsc2UgeworICAgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAgICIgICRuYW1lJF8gPSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGU8ICR0eXBlJCA+KFxuIgorICAgICAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIpOworICAgICAgfQorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAifVxuIgorICAgICAgIiR0eXBlJCogJGNsYXNzbmFtZSQ6Ol9zbG93XyRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiAgaWYgKCRuYW1lJF8gPT0gTlVMTCkge1xuIgorICAgICAgIiAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICR0eXBlJCogdGVtcCA9IG5ldyAkdHlwZSQ7XG4iCisgICAgICAiICAgIHRlbXAtPk1lcmdlRnJvbSgqJG5hbWUkXyk7XG4iCisgICAgICAiICAgICRuYW1lJF8gPSBOVUxMO1xuIgorICAgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiJHR5cGUkKiAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3JlbGVhc2VfJG5hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgJGNsZWFyX2hhc2JpdCRcbiIKKyAgICAgICIgICR0eXBlJCogdGVtcCA9ICRuYW1lJF87XG4iCisgICAgICAiICAkbmFtZSRfID0gTlVMTDtcbiIKKyAgICAgICIgIHJldHVybiB0ZW1wO1xuIgorICAgICAgIn1cbiIpOworICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICAvLyBOT1RFOiB0aGUgc2FtZSBsb2dpYyBpcyBtaXJyb3JlZCBpbiB3ZWFrX21lc3NhZ2VfZmllbGQuY2MuIEFueQorICAgICAgLy8gYXJlbmEtcmVsYXRlZCBzZW1hbnRpY3MgY2hhbmdlcyBzaG91bGQgYmUgbWFkZSBpbiBib3RoIHBsYWNlcy4KKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6Ol9zbG93X3NldF9hbGxvY2F0ZWRfJG5hbWUkKFxuIgorICAgICAgICAgICIgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogbWVzc2FnZV9hcmVuYSwgJHR5cGUkKiogJG5hbWUkKSB7XG4iCisgICAgICAgICAgIiAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBOVUxMICYmIFxuIgorICAgICAgICAgICIgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkdldEFyZW5hKCokbmFtZSQpID09IE5VTEwpIHtcbiIKKyAgICAgICAgICAiICAgICAgbWVzc2FnZV9hcmVuYS0+T3duKCokbmFtZSQpO1xuIgorICAgICAgICAgICIgICAgfSBlbHNlIGlmIChtZXNzYWdlX2FyZW5hICE9XG4iCisgICAgICAgICAgIiAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkdldEFyZW5hKCokbmFtZSQpKSB7XG4iCisgICAgICAgICAgIiAgICAgICR0eXBlJCogbmV3XyRuYW1lJCA9IFxuIgorICAgICAgICAgICIgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVNZXNzYWdlPCAkdHlwZSQgPihcbiIKKyAgICAgICAgICAiICAgICAgICAgICAgbWVzc2FnZV9hcmVuYSk7XG4iCisgICAgICAgICAgIiAgICAgIG5ld18kbmFtZSQtPkNvcHlGcm9tKCoqJG5hbWUkKTtcbiIKKyAgICAgICAgICAiICAgICAgKiRuYW1lJCA9IG5ld18kbmFtZSQ7XG4iCisgICAgICAgICAgIiAgICB9XG4iCisgICAgICAgICAgIn1cbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkXyRuYW1lJChcbiIKKyAgICAgICIgICAgJHR5cGUkKiAkbmFtZSQpIHtcbiIKKyAgICAgIC8vIElmIHdlJ3JlIG5vdCBvbiBhbiBhcmVuYSwgZnJlZSB3aGF0ZXZlciB3ZSB3ZXJlIGhvbGRpbmcgYmVmb3JlLgorICAgICAgLy8gKElmIHdlIGFyZSBvbiBhcmVuYSwgd2UgY2FuIGp1c3QgZm9yZ2V0IHRoZSBlYXJsaWVyIHBvaW50ZXIuKQorICAgICAgIiAgaWYgKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gTlVMTCkge1xuIgorICAgICAgIiAgICBkZWxldGUgJG5hbWUkXztcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRuYW1lJF8gPSAkbmFtZSQ7XG4iCisgICAgICAiICBpZiAoJG5hbWUkKSB7XG4iCisgICAgICAiICAgICRzZXRfaGFzYml0JFxuIgorICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICIgICAgJGNsZWFyX2hhc2JpdCRcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZCIKKyAgICAgICI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXBlbmRlbnRJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghZGVwZW5kZW50X2ZpZWxkXykgeworICAgIHJldHVybjsKKyAgfQorCisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICAvLyBGb3IgdGhlIENSVFAgYmFzZSBjbGFzcywgYWxsIG11dGF0aW9uIG1ldGhvZHMgYXJlIGRlcGVuZGVudCwgYW5kIHNvCisgIC8vIHRoZXkgbXVzdCBiZSBpbiB0aGUgaGVhZGVyLgorICB2YXJpYWJsZXNbImRlcGVuZGVudF9jbGFzc25hbWUiXSA9CisgICAgICBEZXBlbmRlbnRCYXNlQ2xhc3NUZW1wbGF0ZU5hbWUoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSArICI8VD4iOworICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdID0gRGVwZW5kZW50QmFzZURvd25DYXN0KCk7CisgIGlmICghdmFyaWFibGVzWyJzZXRfaGFzYml0Il0uZW1wdHkoKSkgeworICAgIHZhcmlhYmxlc1sic2V0X2hhc2JpdCJdID0KKyAgICAgICAgdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSArIHZhcmlhYmxlc1sic2V0X2hhc2JpdCJdOworICB9CisgIGlmICghdmFyaWFibGVzWyJjbGVhcl9oYXNiaXQiXS5lbXB0eSgpKSB7CisgICAgdmFyaWFibGVzWyJjbGVhcl9oYXNiaXQiXSA9CisgICAgICAgIHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gKyB2YXJpYWJsZXNbImNsZWFyX2hhc2JpdCJdOworICB9CisKKyAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKKyAgICAgICJpbmxpbmUgJHR5cGUkKiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICAkZGVwZW5kZW50X3R5cGVuYW1lJComICRuYW1lJF8gPSAkdGhpc19tZXNzYWdlJCRuYW1lJF87XG4iCisgICAgICAiICBpZiAoJG5hbWUkXyA9PSBOVUxMKSB7XG4iCisgICAgICAiICAgICR0aGlzX21lc3NhZ2UkX3Nsb3dfbXV0YWJsZV8kbmFtZSQoKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAifVxuIgorICAgICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgorICAgICAgImlubGluZSAkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6JHJlbGVhc2VfbmFtZSQoKSB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiYgJG5hbWUkXyA9ICR0aGlzX21lc3NhZ2UkJG5hbWUkXztcbiIKKyAgICAgICIgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICBpZiAoJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpIHtcbiIKKyAgICAgICIgICAgcmV0dXJuICR0aGlzX21lc3NhZ2UkX3Nsb3dfJHJlbGVhc2VfbmFtZSQoKTtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiB0ZW1wID0gJG5hbWUkXztcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9IE5VTEw7XG4iCisgICAgICAiICAgIHJldHVybiB0ZW1wO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiIKKyAgICAgICJzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCkge1xuIgorICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9ICR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKTtcbiIKKyAgICAgICIgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiYgJG5hbWUkXyA9ICR0aGlzX21lc3NhZ2UkJG5hbWUkXztcbiIKKyAgICAgICIgIGlmIChtZXNzYWdlX2FyZW5hID09IE5VTEwpIHtcbiIKKyAgICAgICIgICAgZGVsZXRlICRuYW1lJF87XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBpZiAoJG5hbWUkICE9IE5VTEwpIHtcbiIpOworICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICAvLyBJZiB3ZSdyZSBvbiBhbiBhcmVuYSBhbmQgdGhlIGluY29taW5nIG1lc3NhZ2UgaXMgbm90LCBzaW1wbHkgT3duKCkgaXQKKyAgICAgIC8vIHJhdGhlciB0aGFuIGNvcHkgdG8gdGhlIGFyZW5hIC0tIGVpdGhlciB3YXkgd2UgbmVlZCBhIGhlYXAgZGVhbGxvYywKKyAgICAgIC8vIHNvIHdlIG1pZ2h0IGFzIHdlbGwgZGVmZXIgaXQuIE90aGVyd2lzZSwgaWYgaW5jb21pbmcgbWVzc2FnZSBpcyBvbiBhCisgICAgICAvLyBkaWZmZXJlbnQgb3duZXJzaGlwIGRvbWFpbiAoc3BlY2lmaWMgYXJlbmEsIG9yIHRoZSBoZWFwKSB0aGFuIHdlIGFyZSwKKyAgICAgIC8vIGNvcHkgdG8gb3VyIGFyZW5hIChvciBoZWFwLCBhcyB0aGUgY2FzZSBtYXkgYmUpLgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgICAiICAgICR0aGlzX21lc3NhZ2UkX3Nsb3dfc2V0X2FsbG9jYXRlZF8kbmFtZSQobWVzc2FnZV9hcmVuYSwgIgorICAgICAgICAiJiRuYW1lJCk7XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgICAiICAgIGlmIChtZXNzYWdlX2FyZW5hICE9IE5VTEwpIHtcbiIKKyAgICAgICAgIiAgICAgIG1lc3NhZ2VfYXJlbmEtPk93bigkbmFtZSQpO1xuIgorICAgICAgICAiICAgIH1cbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiICB9XG4iCisgICAgICAiICAkbmFtZSRfID0gJG5hbWUkO1xuIgorICAgICAgIiAgaWYgKCRuYW1lJCkge1xuIgorICAgICAgIiAgICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICB9XG4iCisgICAgICAvLyBUT0RPKGRsaik6IG1vdmUgaW5zZXJ0aW9uIHBvaW50cyB0byBtZXNzYWdlIGNsYXNzLgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgorICAgICAgImlubGluZSAkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiYgJG5hbWUkXyA9ICR0aGlzX21lc3NhZ2UkJG5hbWUkXztcbiIKKyAgICAgICIgIGlmICgkbmFtZSRfID09IE5VTEwpIHtcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9IG5ldyAkZGVwZW5kZW50X3R5cGVuYW1lJDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAifVxuIgorICAgICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgorICAgICAgImlubGluZSAkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6JHJlbGVhc2VfbmFtZSQoKSB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICAkZGVwZW5kZW50X3R5cGVuYW1lJComICRuYW1lJF8gPSAkdGhpc19tZXNzYWdlJCRuYW1lJF87XG4iCisgICAgICAiICAkZGVwZW5kZW50X3R5cGVuYW1lJCogdGVtcCA9ICRuYW1lJF87XG4iCisgICAgICAiICAkbmFtZSRfID0gTlVMTDtcbiIKKyAgICAgICIgIHJldHVybiB0ZW1wO1xuIgorICAgICAgIn1cbiIKKyAgICAgICJ0ZW1wbGF0ZSA8Y2xhc3MgVD5cbiIKKyAgICAgICJpbmxpbmUgdm9pZCAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiIKKyAgICAgICJzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCkge1xuIgorICAgICAgIiAgJGRlcGVuZGVudF90eXBlbmFtZSQqJiAkbmFtZSRfID0gJHRoaXNfbWVzc2FnZSQkbmFtZSRfO1xuIgorICAgICAgIiAgZGVsZXRlICRuYW1lJF87XG4iKTsKKworICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiICBpZiAoJG5hbWUkICE9IE5VTEwgJiYgc3RhdGljX2Nhc3Q8ICRkZXBlbmRlbnRfdHlwZW5hbWUkKiA+KCRuYW1lJCkiCisgICAgICAiLT5HZXRBcmVuYSgpICE9IE5VTEwpIHtcbiIKKyAgICAgICIgICAgJGRlcGVuZGVudF90eXBlbmFtZSQqIG5ld18kbmFtZSQgPSBuZXcgJGRlcGVuZGVudF90eXBlbmFtZSQ7XG4iCisgICAgICAiICAgIG5ld18kbmFtZSQtPkNvcHlGcm9tKCokbmFtZSQpO1xuIgorICAgICAgIiAgICAkbmFtZSQgPSBuZXdfJG5hbWUkO1xuIgorICAgICAgIiAgfVxuIik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiAgJG5hbWUkXyA9ICRuYW1lJDtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIKKyAgICAgICIgICAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICAkY2xlYXJfaGFzYml0JFxuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICB2YXJpYWJsZXNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSAiIDogIiI7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAiJGlubGluZSRjb25zdCAkdHlwZSQmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIpOwogCiAgIFByaW50SGFuZGxpbmdPcHRpb25hbFN0YXRpY0luaXRpYWxpemVycygKLSAgICB2YXJpYWJsZXNfLCBkZXNjcmlwdG9yXy0+ZmlsZSgpLCBwcmludGVyLAotICAgIC8vIFdpdGggc3RhdGljIGluaXRpYWxpemVycy4KLSAgICAiICByZXR1cm4gJG5hbWUkXyAhPSBOVUxMID8gKiRuYW1lJF8gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPiRuYW1lJF87XG4iLAotICAgIC8vIFdpdGhvdXQuCi0gICAgIiAgcmV0dXJuICRuYW1lJF8gIT0gTlVMTCA/ICokbmFtZSRfIDogKmRlZmF1bHRfaW5zdGFuY2UoKS4kbmFtZSRfO1xuIik7CisgICAgICB2YXJpYWJsZXMsIGRlc2NyaXB0b3JfLT5maWxlKCksIG9wdGlvbnNfLCBwcmludGVyLAorICAgICAgLy8gV2l0aCBzdGF0aWMgaW5pdGlhbGl6ZXJzLgorICAgICAgIiAgcmV0dXJuICRuYW1lJF8gIT0gTlVMTCA/ICokbmFtZSRfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT4kbmFtZSRfO1xuIiwKKyAgICAgIC8vIFdpdGhvdXQuCisgICAgICAiICByZXR1cm4gJG5hbWUkXyAhPSBOVUxMID8gKiRuYW1lJF8gOiAqZGVmYXVsdF9pbnN0YW5jZSgpLiRuYW1lJF87XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLCAifVxuIik7CiAKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAifVxuIgotICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCi0gICAgIiAgc2V0X2hhc18kbmFtZSQoKTtcbiIKLSAgICAiICBpZiAoJG5hbWUkXyA9PSBOVUxMKSAkbmFtZSRfID0gbmV3ICR0eXBlJDtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIgotICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6cmVsZWFzZV8kbmFtZSQoKSB7XG4iCi0gICAgIiAgY2xlYXJfaGFzXyRuYW1lJCgpO1xuIgotICAgICIgICR0eXBlJCogdGVtcCA9ICRuYW1lJF87XG4iCi0gICAgIiAgJG5hbWUkXyA9IE5VTEw7XG4iCi0gICAgIiAgcmV0dXJuIHRlbXA7XG4iCi0gICAgIn1cbiIpOworICBpZiAoZGVwZW5kZW50X2ZpZWxkXykgeworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiJGlubGluZSQiCisgICAgICAiJHR5cGUkKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgIGlmICgkbmFtZSRfID09IE5VTEwpIHtcbiIKKyAgICAgICIgICAgX3Nsb3dfbXV0YWJsZV8kbmFtZSQoKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIgorICAgICAgIiR0eXBlJCogJGNsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICAkY2xlYXJfaGFzYml0JFxuIgorICAgICAgIiAgaWYgKEdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gTlVMTCkge1xuIgorICAgICAgIiAgICByZXR1cm4gX3Nsb3dfJHJlbGVhc2VfbmFtZSQoKTtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICR0eXBlJCogdGVtcCA9ICRuYW1lJF87XG4iCisgICAgICAiICAgICRuYW1lJF8gPSBOVUxMO1xuIgorICAgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgIgorICAgICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKCR0eXBlJCogJG5hbWUkKSB7XG4iCisgICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBtZXNzYWdlX2FyZW5hID0gR2V0QXJlbmFOb1ZpcnR1YWwoKTtcbiIKKyAgICAgICIgIGlmIChtZXNzYWdlX2FyZW5hID09IE5VTEwpIHtcbiIKKyAgICAgICIgICAgZGVsZXRlICRuYW1lJF87XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBpZiAoJG5hbWUkICE9IE5VTEwpIHtcbiIpOworICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICAvLyBJZiB3ZSdyZSBvbiBhbiBhcmVuYSBhbmQgdGhlIGluY29taW5nIG1lc3NhZ2UgaXMgbm90LCBzaW1wbHkgT3duKCkgaXQKKyAgICAgIC8vIHJhdGhlciB0aGFuIGNvcHkgdG8gdGhlIGFyZW5hIC0tIGVpdGhlciB3YXkgd2UgbmVlZCBhIGhlYXAgZGVhbGxvYywKKyAgICAgIC8vIHNvIHdlIG1pZ2h0IGFzIHdlbGwgZGVmZXIgaXQuIE90aGVyd2lzZSwgaWYgaW5jb21pbmcgbWVzc2FnZSBpcyBvbiBhCisgICAgICAvLyBkaWZmZXJlbnQgb3duZXJzaGlwIGRvbWFpbiAoc3BlY2lmaWMgYXJlbmEsIG9yIHRoZSBoZWFwKSB0aGFuIHdlIGFyZSwKKyAgICAgIC8vIGNvcHkgdG8gb3VyIGFyZW5hIChvciBoZWFwLCBhcyB0aGUgY2FzZSBtYXkgYmUpLgorICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgICAiICAgIF9zbG93X3NldF9hbGxvY2F0ZWRfJG5hbWUkKG1lc3NhZ2VfYXJlbmEsICYkbmFtZSQpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICAgIiAgICBpZiAobWVzc2FnZV9hcmVuYSAhPSBOVUxMKSB7XG4iCisgICAgICAgICIgICAgICBtZXNzYWdlX2FyZW5hLT5Pd24oJG5hbWUkKTtcbiIKKyAgICAgICAgIiAgICB9XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiAgfVxuIgorICAgICAgIiAgJG5hbWUkXyA9ICRuYW1lJDtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIKKyAgICAgICIgICAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICAkY2xlYXJfaGFzYml0JFxuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiRpbmxpbmUkIgorICAgICAgIiR0eXBlJCogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICBpZiAoJG5hbWUkXyA9PSBOVUxMKSB7XG4iCisgICAgICAiICAgICRuYW1lJF8gPSBuZXcgJHR5cGUkO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQiCisgICAgICAiJHR5cGUkKiAkY2xhc3NuYW1lJDo6JHJlbGVhc2VfbmFtZSQoKSB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICAkdHlwZSQqIHRlbXAgPSAkbmFtZSRfO1xuIgorICAgICAgIiAgJG5hbWUkXyA9IE5VTEw7XG4iCisgICAgICAiICByZXR1cm4gdGVtcDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQiCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0X2FsbG9jYXRlZF8kbmFtZSQoJHR5cGUkKiAkbmFtZSQpIHtcbiIKKyAgICAgICIgIGRlbGV0ZSAkbmFtZSRfO1xuIik7CisKKyAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMICYmICRuYW1lJC0+R2V0QXJlbmEoKSAhPSBOVUxMKSB7XG4iCisgICAgICAiICAgICR0eXBlJCogbmV3XyRuYW1lJCA9IG5ldyAkdHlwZSQ7XG4iCisgICAgICAiICAgIG5ld18kbmFtZSQtPkNvcHlGcm9tKCokbmFtZSQpO1xuIgorICAgICAgIiAgICAkbmFtZSQgPSBuZXdfJG5hbWUkO1xuIgorICAgICAgIiAgfVxuIik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiAgJG5hbWUkXyA9ICRuYW1lJDtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIKKyAgICAgICIgICAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICAkY2xlYXJfaGFzYml0JFxuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CisgIH0KIH0KIAogdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRuYW1lJF8gIT0gTlVMTCkgJG5hbWUkXy0+JHR5cGUkOjpDbGVhcigpO1xuIik7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdID0gZGVwZW5kZW50X2ZpZWxkXyA/IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpIDogIiI7CisgIGlmICghSGFzRmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgaGFzLWJpdHMsIG1lc3NhZ2UgcHJlc2VuY2UgaXMgaW5kaWNhdGVkIG9ubHkgYnkgcHRyICE9CisgICAgLy8gTlVMTC4gVGh1cyBvbiBjbGVhciwgd2UgbmVlZCB0byBkZWxldGUgdGhlIG9iamVjdC4KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiaWYgKCR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBOVUxMICYmICIKKyAgICAgICIkdGhpc19tZXNzYWdlJCRuYW1lJF8gIT0gTlVMTCkgZGVsZXRlICR0aGlzX21lc3NhZ2UkJG5hbWUkXztcbiIKKyAgICAgICIkdGhpc19tZXNzYWdlJCRuYW1lJF8gPSBOVUxMO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgImlmICgkdGhpc19tZXNzYWdlJCRuYW1lJF8gIT0gTlVMTCkgJHRoaXNfbWVzc2FnZSQkbmFtZSRfLT4iCisgICAgICAiJGRlcGVuZGVudF90eXBlJDo6Q2xlYXIoKTtcbiIpOworICB9CiB9CiAKIHZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKQEAgLTE0NSw3ICs1MTMsNyBAQAogR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJHN0cmVhbV93cml0ZXIkKFxuIgotICAgICIgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoKSwgb3V0cHV0KTtcbiIpOworICAgICIgICRudW1iZXIkLCAqJG5vbl9udWxsX3B0cl90b19uYW1lJCwgb3V0cHV0KTtcbiIpOwogfQogCiB2b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CkBAIC0xNTMsNyArNTIxLDcgQEAKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAidGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgogICAgICIgIFdyaXRlJGRlY2xhcmVkX3R5cGUkTm9WaXJ0dWFsVG9BcnJheShcbiIKLSAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoKSwgdGFyZ2V0KTtcbiIpOworICAgICIgICAgJG51bWJlciQsICokbm9uX251bGxfcHRyX3RvX25hbWUkLCB0YXJnZXQpO1xuIik7CiB9CiAKIHZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKQEAgLTE2MSwxNSArNTI5LDI5OSBAQAogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJ0b3RhbF9zaXplICs9ICR0YWdfc2l6ZSQgK1xuIgogICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjokZGVjbGFyZWRfdHlwZSRTaXplTm9WaXJ0dWFsKFxuIgotICAgICIgICAgdGhpcy0+JG5hbWUkKCkpO1xuIik7CisgICAgIiAgICAqJG5vbl9udWxsX3B0cl90b19uYW1lJCk7XG4iKTsKIH0KIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgewotICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK01lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK01lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgIDogTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGRlc2NyaXB0b3IsIG9wdGlvbnMpLAorICAgIGRlcGVuZGVudF9iYXNlXyhvcHRpb25zLnByb3RvX2gpIHsKKyAgU2V0Q29tbW9uT25lb2ZGaWVsZFZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7Cit9CisKK01lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjp+TWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQorCisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXBlbmRlbnRBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBPbmVvZiBmaWVsZCBnZXR0ZXJzIG11c3QgYmUgZGVwZW5kZW50IGFzIHRoZXkgY2FsbCBkZWZhdWx0X2luc3RhbmNlKCkuCisgIC8vIE90aGVyd2lzZSwgdGhlIGxvZ2ljIGlzIHRoZSBzYW1lIGFzIE1lc3NhZ2VGaWVsZHMuCisgIGlmICghZGVwZW5kZW50X2ZpZWxkXykgeworICAgIHJldHVybjsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgJHR5cGUkJiAkbmFtZSQoKSBjb25zdDtcbiIpOworICBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdlbmVyYXRlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7Cit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVHZXR0ZXJEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBPbmVvZiBmaWVsZCBnZXR0ZXJzIG11c3QgYmUgZGVwZW5kZW50IGFzIHRoZXkgY2FsbCBkZWZhdWx0X2luc3RhbmNlKCkuCisgIC8vIFVubGlrZSBNZXNzYWdlRmllbGQsIHRoaXMgbWVhbnMgdGhlcmUgaXMgbm8gKG5vbi1kZXBlbmRlbnQpIGdldHRlciB0bworICAvLyBnZW5lcmF0ZS4KKyAgaWYgKGRlcGVuZGVudF9maWVsZF8pIHsKKyAgICByZXR1cm47CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0ICR0eXBlJCYgJG5hbWUkKCkgY29uc3Q7XG4iKTsKK30KKwordm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZURlcGVuZGVudElubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gRm9yIHRoZSBDUlRQIGJhc2UgY2xhc3MsIGFsbCBtdXRhdGlvbiBtZXRob2RzIGFyZSBkZXBlbmRlbnQsIGFuZCBzbworICAvLyB0aGV5IG11c3QgYmUgaW4gdGhlIGhlYWRlci4KKyAgaWYgKCFkZXBlbmRlbnRfYmFzZV8pIHsKKyAgICByZXR1cm47CisgIH0KKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc1siaW5saW5lIl0gPSAiaW5saW5lICI7CisgIHZhcmlhYmxlc1siZGVwZW5kZW50X2NsYXNzbmFtZSJdID0KKyAgICAgIERlcGVuZGVudEJhc2VDbGFzc1RlbXBsYXRlTmFtZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpICsgIjxUPiI7CisgIHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gPSAicmVpbnRlcnByZXRfY2FzdDxUKj4odGhpcyktPiI7CisgIC8vIENvbnN0IG1lc3NhZ2UgYWNjZXNzIGlzIG5lZWRlZCBmb3IgdGhlIGRlcGVuZGVudCBnZXR0ZXIuCisgIHZhcmlhYmxlc1sidGhpc19jb25zdF9tZXNzYWdlIl0gPSAicmVpbnRlcnByZXRfY2FzdDxjb25zdCBUKj4odGhpcyktPiI7CisgIHZhcmlhYmxlc1sidG1wbCJdID0gInRlbXBsYXRlIDxjbGFzcyBUPlxuIjsKKyAgdmFyaWFibGVzWyJmaWVsZF9tZW1iZXIiXSA9IHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFyaWFibGVzWyJvbmVvZl9wcmVmaXgiXSArIHZhcmlhYmxlc1sibmFtZSJdICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfIjsKKyAgSW50ZXJuYWxHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnModmFyaWFibGVzLCBwcmludGVyKTsKK30KKwordm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKKyAgaWYgKGRlcGVuZGVudF9iYXNlXykgeworICAgIHJldHVybjsKKyAgfQorICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKKyAgdmFyaWFibGVzWyJpbmxpbmUiXSA9IGlzX2lubGluZSA/ICJpbmxpbmUgIiA6ICIiOworICB2YXJpYWJsZXNbImRlcGVuZGVudF9jbGFzc25hbWUiXSA9IHZhcmlhYmxlc1siY2xhc3NuYW1lIl07CisgIHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gPSAiIjsKKyAgdmFyaWFibGVzWyJ0aGlzX2NvbnN0X21lc3NhZ2UiXSA9ICIiOworICB2YXJpYWJsZXNbInRtcGwiXSA9ICIiOworICB2YXJpYWJsZXNbImZpZWxkX21lbWJlciJdID0KKyAgICAgIHZhcmlhYmxlc1sib25lb2ZfcHJlZml4Il0gKyB2YXJpYWJsZXNbIm5hbWUiXSArICJfIjsKKyAgdmFyaWFibGVzWyJkZXBlbmRlbnRfdHlwZSJdID0gdmFyaWFibGVzWyJ0eXBlIl07CisgIEludGVybmFsR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKHZhcmlhYmxlcywgcHJpbnRlcik7Cit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICB2YXJpYWJsZXNbImZpZWxkX21lbWJlciJdID0KKyAgICAgIHZhcmlhYmxlc1sib25lb2ZfcHJlZml4Il0gKyB2YXJpYWJsZXNbIm5hbWUiXSArICJfIjsKKworICAvL3ByaW50ZXItPlByaW50KHZhcmlhYmxlcywKK30KKwordm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitJbnRlcm5hbEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgIiR0bXBsJCIKKyAgICAiJGlubGluZSQgIgorICAgICJjb25zdCAkdHlwZSQmICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgIiAgcmV0dXJuICR0aGlzX2NvbnN0X21lc3NhZ2UkaGFzXyRuYW1lJCgpXG4iCisgICAgIiAgICAgID8gKiR0aGlzX2NvbnN0X21lc3NhZ2UkJG9uZW9mX3ByZWZpeCQkbmFtZSRfXG4iCisgICAgIiAgICAgIDogJGRlcGVuZGVudF90eXBlJDo6ZGVmYXVsdF9pbnN0YW5jZSgpO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiR0bXBsJCIKKyAgICAgICIkaW5saW5lJCIKKyAgICAgICIkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoKSB7XG4iCisgICAgICAiICBpZiAoISR0aGlzX21lc3NhZ2UkaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgICR0aGlzX21lc3NhZ2UkY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgICR0aGlzX21lc3NhZ2Ukc2V0X2hhc18kbmFtZSQoKTtcbiIpOworICAgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXy0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAgICAiICAgICRmaWVsZF9tZW1iZXIkID0gXG4iCisgICAgICAgICAiICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWVzc2FnZTwgJGRlcGVuZGVudF90eXBlbmFtZSQgPihcbiIKKyAgICAgICAgICIgICAgICAkdGhpc19tZXNzYWdlJEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICAgICIgICAgJHRoaXNfbWVzc2FnZSQkb25lb2ZfcHJlZml4JCRuYW1lJF8gPSBcbiIKKyAgICAgICAgICIgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGU8ICRkZXBlbmRlbnRfdHlwZW5hbWUkID4oXG4iCisgICAgICAgICAiICAgICAgJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiICB9XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiAkZmllbGRfbWVtYmVyJDtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJHRtcGwkIgorICAgICAgIiRpbmxpbmUkIgorICAgICAgIiR0eXBlJCogJGRlcGVuZGVudF9jbGFzc25hbWUkOjokcmVsZWFzZV9uYW1lJCgpIHtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgaWYgKCR0aGlzX21lc3NhZ2UkaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgICR0aGlzX21lc3NhZ2UkY2xlYXJfaGFzXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgICBpZiAoJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpIHtcbiIKKyAgICAgIC8vIE4uQi46IHNhZmUgdG8gdXNlIHRoZSB1bmRlcmx5aW5nIGZpZWxkIHBvaW50ZXIgaGVyZSBiZWNhdXNlIHdlIGFyZSBzdXJlCisgICAgICAvLyB0aGF0IGl0IGlzIG5vbi1OVUxMIChiZWNhdXNlIGhhc18kbmFtZSQoKSByZXR1cm5lZCB0cnVlKS4KKyAgICAgICIgICAgICAkZGVwZW5kZW50X3R5cGVuYW1lJCogdGVtcCA9IG5ldyAkZGVwZW5kZW50X3R5cGVuYW1lJDtcbiIKKyAgICAgICIgICAgICB0ZW1wLT5NZXJnZUZyb20oKiRmaWVsZF9tZW1iZXIkKTtcbiIKKyAgICAgICIgICAgICAkZmllbGRfbWVtYmVyJCA9IE5VTEw7XG4iCisgICAgICAiICAgICAgcmV0dXJuIHRlbXA7XG4iCisgICAgICAiICAgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICAgJGRlcGVuZGVudF90eXBlbmFtZSQqIHRlbXAgPSAkZmllbGRfbWVtYmVyJDtcbiIKKyAgICAgICIgICAgICAkZmllbGRfbWVtYmVyJCA9IE5VTEw7XG4iCisgICAgICAiICAgICAgcmV0dXJuIHRlbXA7XG4iCisgICAgICAiICAgIH1cbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBOVUxMO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICIkdG1wbCQiCisgICAgICAiJGlubGluZSQiCisgICAgICAidm9pZCAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiIKKyAgICAgICJzZXRfYWxsb2NhdGVkXyRuYW1lJCgkdHlwZSQqICRuYW1lJCkge1xuIgorICAgICAgIiAgJHRoaXNfbWVzc2FnZSRjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIpOworCisgICAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICAgLy8gSWYgaW5jb21pbmcgbWVzc2FnZSBpcyBvbiB0aGUgaGVhcCBhbmQgd2UgYXJlIG9uIGFuIGFyZW5hLCBqdXN0IE93bigpCisgICAgICAgIC8vIGl0IChzZWUgYWJvdmUpLiBJZiBpdCdzIG9uIGEgZGlmZmVyZW50IGFyZW5hIHRoYW4gd2UgYXJlIG9yIG9uZSBvZiB1cworICAgICAgICAvLyBpcyBvbiB0aGUgaGVhcCwgd2UgbWFrZSBhIGNvcHkgdG8gb3VyIGFyZW5hL2hlYXAuCisgICAgICAgICIgICAgaWYgKCR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSAhPSBOVUxMICYmXG4iCisgICAgICAgICIgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkdldEFyZW5hKCRuYW1lJCkgPT0gTlVMTCkge1xuIgorICAgICAgICAiICAgICAgJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpLT5Pd24oJG5hbWUkKTtcbiIKKyAgICAgICAgIiAgICB9IGVsc2UgaWYgKCR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSAhPVxuIgorICAgICAgICAiICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6R2V0QXJlbmEoJG5hbWUkKSkge1xuIgorICAgICAgICAiICAgICAgJGRlcGVuZGVudF90eXBlbmFtZSQqIG5ld18kbmFtZSQgPSBcbiIKKyAgICAgICAgIiAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVNZXNzYWdlPCAkZGVwZW5kZW50X3R5cGVuYW1lJCA+KFxuIgorICAgICAgICAiICAgICAgICAgICR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCisgICAgICAgICIgICAgICBuZXdfJG5hbWUkLT5Db3B5RnJvbSgqJG5hbWUkKTtcbiIKKyAgICAgICAgIiAgICAgICRuYW1lJCA9IG5ld18kbmFtZSQ7XG4iCisgICAgICAgICIgICAgfVxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICAgIiAgICBpZiAoJHRoaXNfbWVzc2FnZSRHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpIHtcbiIKKyAgICAgICAgIiAgICAgICR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKS0+T3duKCRuYW1lJCk7XG4iCisgICAgICAgICIgICAgfVxuIik7CisgICAgfQorCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiAgICAkdGhpc19tZXNzYWdlJHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRmaWVsZF9tZW1iZXIkID0gJG5hbWUkO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkICR0eXBlJCogJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9yZWxlYXNlXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfcmVsZWFzZSIKKyAgICAgICI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICBpZiAoaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgIGNsZWFyX2hhc18kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgJHR5cGUkKiB0ZW1wID0gJG9uZW9mX3ByZWZpeCQkbmFtZSRfO1xuIgorICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8gPSBOVUxMO1xuIgorICAgICAgIiAgICByZXR1cm4gdGVtcDtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBOVUxMO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjp1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF8kbmFtZSQiCisgICAgICAiKCR0eXBlJCogJG5hbWUkKSB7XG4iCisgICAgICAvLyBXZSByZWx5IG9uIHRoZSBvbmVvZiBjbGVhciBtZXRob2QgdG8gZnJlZSB0aGUgZWFybGllciBjb250ZW50cyBvZiB0aGlzCisgICAgICAvLyBvbmVvZi4gV2UgY2FuIGRpcmVjdGx5IHVzZSB0aGUgcG9pbnRlciB3ZSdyZSBnaXZlbiB0byBzZXQgdGhlIG5ldworICAgICAgLy8gdmFsdWUuCisgICAgICAiICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIKKyAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICIgICAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfID0gJG5hbWUkO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkOiIKKyAgICAgICIkZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiJHRtcGwkIgorICAgICAgIiRpbmxpbmUkIgorICAgICAgIiR0eXBlJCogJGRlcGVuZGVudF9jbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgIGlmICghJHRoaXNfbWVzc2FnZSRoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICAgIiAgICAkZmllbGRfbWVtYmVyJCA9IG5ldyAkZGVwZW5kZW50X3R5cGVuYW1lJDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICRmaWVsZF9tZW1iZXIkO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkdG1wbCQiCisgICAgICAiJGlubGluZSQiCisgICAgICAiJHR5cGUkKiAkZGVwZW5kZW50X2NsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICBpZiAoJHRoaXNfbWVzc2FnZSRoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgJHRoaXNfbWVzc2FnZSRjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiB0ZW1wID0gJGZpZWxkX21lbWJlciQ7XG4iCisgICAgICAiICAgICRmaWVsZF9tZW1iZXIkID0gTlVMTDtcbiIKKyAgICAgICIgICAgcmV0dXJuIHRlbXA7XG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICByZXR1cm4gTlVMTDtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiJHRtcGwkIgorICAgICAgIiRpbmxpbmUkIgorICAgICAgInZvaWQgJGRlcGVuZGVudF9jbGFzc25hbWUkOjoiCisgICAgICAic2V0X2FsbG9jYXRlZF8kbmFtZSQoJHR5cGUkKiAkbmFtZSQpIHtcbiIKKyAgICAgICIgICR0aGlzX21lc3NhZ2UkY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICBpZiAoJG5hbWUkKSB7XG4iKTsKKyAgICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgICAiICAgIGlmIChzdGF0aWNfY2FzdDwgJGRlcGVuZGVudF90eXBlbmFtZSQqPigkbmFtZSQpLT4iCisgICAgICAgICJHZXRBcmVuYSgpICE9IE5VTEwpIHtcbiIKKyAgICAgICAgIiAgICAgICRkZXBlbmRlbnRfdHlwZW5hbWUkKiBuZXdfJG5hbWUkID0gbmV3ICRkZXBlbmRlbnRfdHlwZW5hbWUkO1xuIgorICAgICAgICAiICAgICAgbmV3XyRuYW1lJC0+Q29weUZyb20oKiRuYW1lJCk7XG4iCisgICAgICAgICIgICAgICAkbmFtZSQgPSBuZXdfJG5hbWUkO1xuIgorICAgICAgICAiICAgIH1cbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiICAgICR0aGlzX21lc3NhZ2Ukc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICIgICAgJGZpZWxkX21lbWJlciQgPSAkbmFtZSQ7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIE1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdID0gZGVwZW5kZW50X2ZpZWxkXyA/IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpIDogIiI7CisgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiaWYgKCR0aGlzX21lc3NhZ2UkR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBOVUxMKSB7XG4iCisgICAgICAiICBkZWxldGUgJHRoaXNfbWVzc2FnZSQkb25lb2ZfcHJlZml4JCRuYW1lJF87XG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgImRlbGV0ZSAkdGhpc19tZXNzYWdlJCRvbmVvZl9wcmVmaXgkJG5hbWUkXztcbiIpOworICB9Cit9CisKK3ZvaWQgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gRG9uJ3QgcHJpbnQgYW55IHN3YXBwaW5nIGNvZGUuIFN3YXBwaW5nIHRoZSB1bmlvbiB3aWxsIHN3YXAgdGhpcyBmaWVsZC4KK30KKwordm9pZCBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBEb24ndCBwcmludCBhbnkgY29uc3RydWN0b3IgY29kZS4gVGhlIGZpZWxkIGlzIGluIGEgdW5pb24uIFdlIGFsbG9jYXRlCisgIC8vIHNwYWNlIG9ubHkgd2hlbiB0aGlzIGZpZWxkIGlzIHVzZWQuCit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICA6IEZpZWxkR2VuZXJhdG9yKG9wdGlvbnMpLAorICAgICAgZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgICBkZXBlbmRlbnRfZmllbGRfKG9wdGlvbnMucHJvdG9faCAmJiBJc0ZpZWxkRGVwZW5kZW50KGRlc2NyaXB0b3IpKSwKKyAgICAgIGRlcGVuZGVudF9nZXR0ZXJfKGRlcGVuZGVudF9maWVsZF8gJiYgb3B0aW9ucy5zYWZlX2JvdW5kYXJ5X2NoZWNrKSB7CisgIFNldE1lc3NhZ2VWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOwogfQogCiBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKCkge30KQEAgLTE4MSw0NCArODMzLDE2MCBAQAogfQogCiB2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKK0ludGVybmFsR2VuZXJhdGVUeXBlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJG5hbWUkKGludCBpbmRleCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgJHR5cGUkKiBtdXRhYmxlXyRuYW1lJChpbnQgaW5kZXgpJGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lICR0eXBlJCogYWRkXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIpOworICAgICIkZGVwcmVjYXRlZF9hdHRyJCR0eXBlJCogbXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KTtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciQkdHlwZSQqIGFkZF8kbmFtZSQoKTtcbiIpOworICBpZiAoZGVwZW5kZW50X2dldHRlcl8pIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiZcbiIKKyAgICAgICIgICAgJG5hbWUkKCkgY29uc3Q7XG4iKTsKKyAgfQogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiZcbiIKLSAgICAiICAgICRuYW1lJCgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4qXG4iCi0gICAgIiAgICBtdXRhYmxlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIpOworICAgICIkZGVwcmVjYXRlZF9hdHRyJDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgIiAgICBtdXRhYmxlXyRuYW1lJCgpO1xuIik7CiB9CiAKIHZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSBjb25zdCAkdHlwZSQmICRjbGFzc25hbWUkOjokbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF8uR2V0KGluZGV4KTtcbiIKK0dlbmVyYXRlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKGRlcGVuZGVudF9nZXR0ZXJfKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0ICR0eXBlJCYgJG5hbWUkKGludCBpbmRleCkgY29uc3Q7XG4iKTsKKyAgfQorICBpZiAoZGVwZW5kZW50X2ZpZWxkXykgeworICAgIEludGVybmFsR2VuZXJhdGVUeXBlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghZGVwZW5kZW50X2dldHRlcl8pIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgJHR5cGUkJiAkbmFtZSQoaW50IGluZGV4KSBjb25zdDtcbiIpOworICB9CisgIGlmICghZGVwZW5kZW50X2ZpZWxkXykgeworICAgIEludGVybmFsR2VuZXJhdGVUeXBlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMocHJpbnRlcik7CisgIH0KKyAgaWYgKCFkZXBlbmRlbnRfZ2V0dGVyXykgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+JlxuIgorICAgICAgIiAgICAkbmFtZSQoKSBjb25zdDtcbiIpOworICB9Cit9CisKK3ZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXBlbmRlbnRJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmICghZGVwZW5kZW50X2ZpZWxkXykgeworICAgIHJldHVybjsKKyAgfQorICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlcyh2YXJpYWJsZXNfKTsKKyAgLy8gRm9yIHRoZSBDUlRQIGJhc2UgY2xhc3MsIGFsbCBtdXRhdGlvbiBtZXRob2RzIGFyZSBkZXBlbmRlbnQsIGFuZCBzbworICAvLyB0aGV5IG11c3QgYmUgaW4gdGhlIGhlYWRlci4KKyAgdmFyaWFibGVzWyJkZXBlbmRlbnRfY2xhc3NuYW1lIl0gPQorICAgICAgRGVwZW5kZW50QmFzZUNsYXNzVGVtcGxhdGVOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkgKyAiPFQ+IjsKKyAgdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSA9IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpOworICB2YXJpYWJsZXNbInRoaXNfY29uc3RfbWVzc2FnZSJdID0gRGVwZW5kZW50QmFzZUNvbnN0RG93bkNhc3QoKTsKKworICBpZiAoZGVwZW5kZW50X2dldHRlcl8pIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iCisgICAgICAiaW5saW5lIGNvbnN0ICR0eXBlJCYgJGRlcGVuZGVudF9jbGFzc25hbWUkOjokbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICR0aGlzX2NvbnN0X21lc3NhZ2UkJG5hbWUkXy4kY3BwZ2V0JChpbmRleCk7XG4iCisgICAgICAifVxuIik7CisgIH0KKworICAvLyBHZW5lcmF0ZSBwZXItZWxlbWVudCBhY2Nlc3NvcnM6CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iCisgICAgImlubGluZSAkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgLy8gVE9ETyhkbGopOiBtb3ZlIGluc2VydGlvbiBwb2ludHMKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKKyAgICAiICByZXR1cm4gJHRoaXNfbWVzc2FnZSQkbmFtZSRfLk11dGFibGUoaW5kZXgpO1xuIgogICAgICJ9XG4iCi0gICAgImlubGluZSAkdHlwZSQqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJChpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5NdXRhYmxlKGluZGV4KTtcbiIKLSAgICAifVxuIgotICAgICJpbmxpbmUgJHR5cGUkKiAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5BZGQoKTtcbiIKKyAgICAidGVtcGxhdGUgPGNsYXNzIFQ+XG4iCisgICAgImlubGluZSAkdHlwZSQqICRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOiRmdWxsX25hbWUkKVxuIgorICAgICIgIHJldHVybiAkdGhpc19tZXNzYWdlJCRuYW1lJF8uQWRkKCk7XG4iCiAgICAgIn1cbiIpOwotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPiZcbiIKLSAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIgorCisKKyAgaWYgKGRlcGVuZGVudF9nZXR0ZXJfKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgorICAgICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8ICR0eXBlJCA+JlxuIgorICAgICAgIiRkZXBlbmRlbnRfY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJHRoaXNfY29uc3RfbWVzc2FnZSQkbmFtZSRfO1xuIgorICAgICAgIn1cbiIpOworICB9CisKKyAgLy8gR2VuZXJhdGUgbXV0YWJsZSBhY2Nlc3MgdG8gdGhlIGVudGlyZSBsaXN0OgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgInRlbXBsYXRlIDxjbGFzcyBUPlxuIgogICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCAkdHlwZSQgPipcbiIKLSAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKKyAgICAiJGRlcGVuZGVudF9jbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OiRmdWxsX25hbWUkKVxuIgorICAgICIgIHJldHVybiAmJHRoaXNfbWVzc2FnZSQkbmFtZSRfO1xuIgogICAgICJ9XG4iKTsKIH0KIAogdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lICIgOiAiIjsKKworICBpZiAoIWRlcGVuZGVudF9nZXR0ZXJfKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiRpbmxpbmUkIgorICAgICAgImNvbnN0ICR0eXBlJCYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy4kY3BwZ2V0JChpbmRleCk7XG4iCisgICAgICAifVxuIik7CisgIH0KKworICBpZiAoIWRlcGVuZGVudF9maWVsZF8pIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgICAiJGlubGluZSQiCisgICAgICAiJHR5cGUkKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgICAvLyBUT0RPKGRsaik6IG1vdmUgaW5zZXJ0aW9uIHBvaW50cworICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5NdXRhYmxlKGluZGV4KTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQiCisgICAgICAiJHR5cGUkKiAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5BZGQoKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorCisKKyAgaWYgKCFkZXBlbmRlbnRfZmllbGRfKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiRpbmxpbmUkIgorICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgICAiJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorICBpZiAoIWRlcGVuZGVudF9nZXR0ZXJfKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiRpbmxpbmUkIgorICAgICAgImNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgJHR5cGUkID4mXG4iCisgICAgICAiJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5DbGVhcigpO1xuIik7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICB2YXJpYWJsZXNbInRoaXNfbWVzc2FnZSJdID0gZGVwZW5kZW50X2ZpZWxkXyA/IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpIDogIiI7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywgIiR0aGlzX21lc3NhZ2UkJG5hbWUkXy5DbGVhcigpO1xuIik7CiB9CiAKIHZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgpAQCAtMjI4LDcgKzk5Niw3IEBACiAKIHZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8uU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPiRuYW1lJF8pO1xuIik7CiB9CiAKIHZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgpAQCAtMjQwLDExICsxMDA4LDEzIEBACiBHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKFxuIgorICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6IgorICAgICAgIlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aChcbiIKICAgICAgICIgICAgICBpbnB1dCwgYWRkXyRuYW1lJCgpKSk7XG4iKTsKICAgfSBlbHNlIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwTm9WaXJ0dWFsKFxuIgorICAgICAgIkRPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6IgorICAgICAgIlJlYWRHcm91cE5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoXG4iCiAgICAgICAiICAgICAgJG51bWJlciQsIGlucHV0LCBhZGRfJG5hbWUkKCkpKTtcbiIpOwogICB9CiB9CkBAIC0yNTIsNyArMTAyMiw3IEBACiB2b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+JG5hbWUkX3NpemUoKTsgaSsrKSB7XG4iCisgICAgImZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+JG5hbWUkX3NpemUoKTsgaSA8IG47IGkrKykge1xuIgogICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRzdHJlYW1fd3JpdGVyJChcbiIKICAgICAiICAgICRudW1iZXIkLCB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iCiAgICAgIn1cbiIpOwpAQCAtMjYxLDcgKzEwMzEsNyBAQAogdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAiZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7XG4iCiAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgogICAgICIgICAgV3JpdGUkZGVjbGFyZWRfdHlwZSROb1ZpcnR1YWxUb0FycmF5KFxuIgogICAgICIgICAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKGkpLCB0YXJnZXQpO1xuIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaAppbmRleCBmNTE0NzI3Li5kOGQ5Mjc5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX21lc3NhZ2VfZmllbGQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDYsMTMgKzQ2LDE4IEBACiAKIGNsYXNzIE1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CiAgcHVibGljOgotICBleHBsaWNpdCBNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogICB+TWVzc2FnZUZpZWxkR2VuZXJhdG9yKCk7CiAKICAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKLSAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRGVwZW5kZW50SW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtNjIsMjIgKzY3LDYwIEBACiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKIAotIHByaXZhdGU6CisgcHJvdGVjdGVkOgorICB2b2lkIEdlbmVyYXRlQXJlbmFNYW5pcHVsYXRpb25Db2RlKGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz4mIHZhcmlhYmxlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlR2V0dGVyRGVjbGFyYXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIGNvbnN0IGJvb2wgZGVwZW5kZW50X2ZpZWxkXzsKICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOwogCisgcHJpdmF0ZToKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7CiB9OwogCitjbGFzcyBNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBNZXNzYWdlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgfk1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudEFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZURlcGVuZGVudElubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTm9uSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQgR2VuZXJhdGVHZXR0ZXJEZWNsYXJhdGlvbihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICB2b2lkIEludGVybmFsR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKAorICAgICAgY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFyaWFibGVzLCBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyAgY29uc3QgYm9vbCBkZXBlbmRlbnRfYmFzZV87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcik7Cit9OworCiBjbGFzcyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CiAgcHVibGljOgotICBleHBsaWNpdCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogICB+UmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoKTsKIAogICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVEZXBlbmRlbnRJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtODgsNyArMTMxLDEyIEBACiAgIHZvaWQgR2VuZXJhdGVCeXRlU2l6ZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAKICBwcml2YXRlOgorICB2b2lkIEludGVybmFsR2VuZXJhdGVUeXBlRGVwZW5kZW50QWNjZXNzb3JEZWNsYXJhdGlvbnMoCisgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKyAgY29uc3QgYm9vbCBkZXBlbmRlbnRfZmllbGRfOworICBjb25zdCBib29sIGRlcGVuZGVudF9nZXR0ZXJfOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CiAKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9vcHRpb25zLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcGx1Z2luX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MKaW5kZXggNWM0YWE0Zi4uMzRhNDFkOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wbHVnaW5fdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM0LDE0ICszNCwyMCBAQAogLy8gICBJdCBzZWVtZWQgbGlrZSBwYXJhbWV0ZXJpemluZyBpdCB3b3VsZCBhZGQgbW9yZSBjb21wbGV4aXR5IHRoYW4gaXQgaXMKIC8vICAgd29ydGguCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9nZW5lcmF0b3IuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CkBAIC02NywxMyArNzMsMTA3IEBACiAgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgImluY2x1ZGVzIiwgY29udGV4dCk7CiAgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmNjIiwgIm5hbWVzcGFjZV9zY29wZSIsIGNvbnRleHQpOwogICAgIFRyeUluc2VydCgidGVzdC5wYi5jYyIsICJnbG9iYWxfc2NvcGUiLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYW4gb3B0aW9uYWwgaW50MzI6CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub3B0SW50IiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIub3B0SW50IiwgY29udGV4dCk7CisKKyAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGEgcmVwZWF0ZWQgaW50MzI6CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVwZWF0ZWRJbnQiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5yZXBlYXRlZEludCIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcXVpcmVkIHN0cmluZzoKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXF1aXJlZFN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcXVpcmVkU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X2NoYXI6Zm9vLkJhci5yZXF1aXJlZFN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9wb2ludGVyOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfYWxsb2NhdGVkOmZvby5CYXIucmVxdWlyZWRTdHJpbmciLAorICAgICAgICAgICAgICBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfY2hhcjpmb28uQmFyLnJlcXVpcmVkU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X3BvaW50ZXI6Zm9vLkJhci5yZXF1aXJlZFN0cmluZyIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcGVhdGVkIHN0cmluZzoKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLnJlcGVhdGVkU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X2NoYXI6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9wb2ludGVyOmZvby5CYXIucmVwZWF0ZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIucmVwZWF0ZWRTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfY2hhcjpmb28uQmFyLnJlcGVhdGVkU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X3BvaW50ZXI6Zm9vLkJhci5yZXBlYXRlZFN0cmluZyIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBpbnQgaW5zaWRlIG9uZW9me306CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub25lT2ZJbnQiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXQ6Zm9vLkJhci5vbmVPZkludCIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHN0cmluZyBpbnNpZGUgb25lb2Z7fToKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLm9uZU9mU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X2NoYXI6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9wb2ludGVyOmZvby5CYXIub25lT2ZTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIub25lT2ZTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfYWxsb2NhdGVkOmZvby5CYXIub25lT2ZTdHJpbmciLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9zZXRfY2hhcjpmb28uQmFyLm9uZU9mU3RyaW5nIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0X3BvaW50ZXI6Zm9vLkJhci5vbmVPZlN0cmluZyIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBvcHRpb25hbCBtZXNzYWdlOgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9wdE1lc3NhZ2UiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlOmZvby5CYXIub3B0TWVzc2FnZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9hbGxvY2F0ZWQ6Zm9vLkJhci5vcHRNZXNzYWdlIiwgY29udGV4dCk7CisKKyAgICAvLyBDaGVjayBmaWVsZCBhY2Nlc3NvcnMgZm9yIGEgcmVwZWF0ZWQgbWVzc2FnZToKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9hZGQ6Zm9vLkJhci5yZXBlYXRlZE1lc3NhZ2UiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5yZXBlYXRlZE1lc3NhZ2UiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9saXN0OmZvby5CYXIucmVwZWF0ZWRNZXNzYWdlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLnJlcGVhdGVkTWVzc2FnZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGVfbGlzdDpmb28uQmFyLnJlcGVhdGVkTWVzc2FnZSIsCisgICAgICAgICAgICAgIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIG1lc3NhZ2UgaW5zaWRlIG9uZW9me306CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIub25lT2ZNZXNzYWdlIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLm9uZU9mTWVzc2FnZSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldF9hbGxvY2F0ZWQ6Zm9vLkJhci5vbmVPZk1lc3NhZ2UiLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYW4gb3B0aW9uYWwgZW51bToKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9nZXQ6Zm9vLkJhci5vcHRFbnVtIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIub3B0RW51bSIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcGVhdGVkIGVudW06CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVwZWF0ZWRFbnVtIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIucmVwZWF0ZWRFbnVtIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfYWRkOmZvby5CYXIucmVwZWF0ZWRFbnVtIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbGlzdDpmb28uQmFyLnJlcGVhdGVkRW51bSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGVfbGlzdDpmb28uQmFyLnJlcGVhdGVkRW51bSIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhbiBlbnVtIGluc2lkZSBvbmVvZnt9OgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9uZU9mRW51bSIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLm9uZU9mRW51bSIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcXVpcmVkIGNvcmQ6CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVxdWlyZWRDb3JkIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIucmVxdWlyZWRDb3JkIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbXV0YWJsZTpmb28uQmFyLnJlcXVpcmVkQ29yZCIsIGNvbnRleHQpOworCisgICAgLy8gQ2hlY2sgZmllbGQgYWNjZXNzb3JzIGZvciBhIHJlcGVhdGVkIGNvcmQ6CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfZ2V0OmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfc2V0OmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfYWRkOmZvby5CYXIucmVwZWF0ZWRDb3JkIiwgY29udGV4dCk7CisgICAgVHJ5SW5zZXJ0KCJ0ZXN0LnBiLmgiLCAiZmllbGRfbGlzdDpmb28uQmFyLnJlcGVhdGVkQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGU6Zm9vLkJhci5yZXBlYXRlZENvcmQiLCBjb250ZXh0KTsKKyAgICBUcnlJbnNlcnQoInRlc3QucGIuaCIsICJmaWVsZF9tdXRhYmxlX2xpc3Q6Zm9vLkJhci5yZXBlYXRlZENvcmQiLCBjb250ZXh0KTsKKworICAgIC8vIENoZWNrIGZpZWxkIGFjY2Vzc29ycyBmb3IgYSBjb3JkIGluc2lkZSBvbmVvZnt9OgorICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX2dldDpmb28uQmFyLm9uZU9mQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX3NldDpmb28uQmFyLm9uZU9mQ29yZCIsIGNvbnRleHQpOworICAgIFRyeUluc2VydCgidGVzdC5wYi5oIiwgImZpZWxkX211dGFibGU6Zm9vLkJhci5vbmVPZkNvcmQiLCBjb250ZXh0KTsKKwogICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgdm9pZCBUcnlJbnNlcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCiAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKLSAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KSk7CiAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CiAgICAgcHJpbnRlci5QcmludCgiLy8gaW5zZXJ0ZWQgJG5hbWUkXG4iLCAibmFtZSIsIGluc2VydGlvbl9wb2ludCk7CiAgIH0KQEAgLTgzLDEzICsxODMsNDQgQEAKIC8vIG5vdCB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHktcGxhY2VkOyB0aGF0IHdvdWxkIHJlcXVpcmUgYWN0dWFsbHkKIC8vIGNvbXBpbGluZyB0aGUgb3V0cHV0IHdoaWNoIGlzIGEgYml0IG1vcmUgdGhhbiBJIGNhcmUgdG8gZG8gZm9yIHRoaXMgdGVzdC4KIFRFU1QoQ3BwUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgewotICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKAotICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAicGFja2FnZSBmb287XG4iCi0gICAgICAibWVzc2FnZSBCYXIge1xuIgotICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKLSAgICAgICJ9XG4iLAotICAgICAgVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIpOworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0gVGh1ZCB7IFZBTFVFID0gMDsgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1lc3NhZ2UgQmF6IHt9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIGludDMyIG9wdEludCA9IDE7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkSW50ID0gMjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICByZXF1aXJlZCBzdHJpbmcgcmVxdWlyZWRTdHJpbmcgPSAzO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRTdHJpbmcgPSA0O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG9wdGlvbmFsIEJheiBvcHRNZXNzYWdlID0gNjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVwZWF0ZWQgQmF6IHJlcGVhdGVkTWVzc2FnZSA9IDc7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgb3B0aW9uYWwgVGh1ZCBvcHRFbnVtID0gODtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgcmVwZWF0ZWQgVGh1ZCByZXBlYXRlZEVudW0gPSA5O1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcXVpcmVkIHN0cmluZyByZXF1aXJlZENvcmQgPSAxMCBbXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY3R5cGUgPSBDT1JEXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIF07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZENvcmQgPSAxMSBbXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgY3R5cGUgPSBDT1JEXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIF07XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgb25lb2YgUXV4IHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBpbnQ2NCBvbmVPZkludCA9IDIwO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIHN0cmluZyBvbmVPZlN0cmluZyA9IDIxO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgIEJheiBvbmVPZk1lc3NhZ2UgPSAyMjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBUaHVkIG9uZU9mRW51bSA9IDIzOyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICBzdHJpbmcgb25lT2ZDb3JkID0gMjQgW1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgY3R5cGUgPSBDT1JEXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgXTtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSkpOwogCiAgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb21tYW5kTGluZUludGVyZmFjZSBjbGk7CiAgIGNsaS5TZXRJbnB1dHNBcmVQcm90b1BhdGhSZWxhdGl2ZSh0cnVlKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MKaW5kZXggNWU4ZGYwZi4uNjUwZjAzOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTgwLDggKzgwLDkgQEAKIH0KIAogdm9pZCBTZXRQcmltaXRpdmVWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7Ci0gIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7CiAgICgqdmFyaWFibGVzKVsidHlwZSJdID0gUHJpbWl0aXZlVHlwZU5hbWUoZGVzY3JpcHRvci0+Y3BwX3R5cGUoKSk7CiAgICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOwogICAoKnZhcmlhYmxlcylbInRhZyJdID0gU2ltcGxlSXRvYShpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7CkBAIC05MiwxNiArOTMsMTcgQEAKICAgKCp2YXJpYWJsZXMpWyJ3aXJlX2Zvcm1hdF9maWVsZF90eXBlIl0gPQogICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoiICsgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9OYW1lKAogICAgICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGU+KGRlc2NyaXB0b3ItPnR5cGUoKSkpOworICAoKnZhcmlhYmxlcylbImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7Ci0gIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXyk7CitQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6UHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKIH0KIAogUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6On5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9CkBAIC0xMTQsMTkgKzExNiwyMyBAQAogdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUFjY2Vzc29yRGVjbGFyYXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSAkdHlwZSQgJG5hbWUkKCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIik7CisgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkICRuYW1lJCgpIGNvbnN0O1xuIgorICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpO1xuIik7CiB9CiAKIHZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lIiA6ICIiOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgIiRpbmxpbmUkICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCiAgICAgIn1cbiIKLSAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCi0gICAgIiAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiICAkc2V0X2hhc2JpdCRcbiIKICAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKICAgICAifVxuIik7CiB9CiAKQEAgLTE1Niw3ICsxNjIsNyBAQAogICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgogICAgICIgICAgICAgICAkdHlwZSQsICR3aXJlX2Zvcm1hdF9maWVsZF90eXBlJD4oXG4iCiAgICAgIiAgICAgICBpbnB1dCwgJiRuYW1lJF8pKSk7XG4iCi0gICAgInNldF9oYXNfJG5hbWUkKCk7XG4iKTsKKyAgICAiJHNldF9oYXNiaXQkXG4iKTsKIH0KIAogdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CkBAIC0xODksMTIgKzE5NSw3MiBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgotUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgewotICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgOiBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBvcHRpb25zKSB7CisgIFNldENvbW1vbk9uZW9mRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworfQogCi0gIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkucGFja2VkKCkpIHsKK1ByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6On5QcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKCkge30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lIiA6ICIiOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgIiRpbmxpbmUkICR0eXBlJCAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgIiAgaWYgKGhhc18kbmFtZSQoKSkge1xuIgorICAgICIgICAgcmV0dXJuICRvbmVvZl9wcmVmaXgkJG5hbWUkXztcbiIKKyAgICAiICB9XG4iCisgICAgIiAgcmV0dXJuICRkZWZhdWx0JDtcbiIKKyAgICAifVxuIgorICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgIiAgICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgIiAgfVxuIgorICAgICIgICRvbmVvZl9wcmVmaXgkJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRvbmVvZl9wcmVmaXgkJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIpOworfQorCit2b2lkIFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gRG9uJ3QgcHJpbnQgYW55IHN3YXBwaW5nIGNvZGUuIFN3YXBwaW5nIHRoZSB1bmlvbiB3aWxsIHN3YXAgdGhpcyBmaWVsZC4KK30KKwordm9pZCBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KAorICAgICAgdmFyaWFibGVzXywKKyAgICAgICIgICRjbGFzc25hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfLT4kbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7Cit9CisKK3ZvaWQgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICJET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPFxuIgorICAgICIgICAgICAgICAkdHlwZSQsICR3aXJlX2Zvcm1hdF9maWVsZF90eXBlJD4oXG4iCisgICAgIiAgICAgICBpbnB1dCwgJiRvbmVvZl9wcmVmaXgkJG5hbWUkXykpKTtcbiIKKyAgICAic2V0X2hhc18kbmFtZSQoKTtcbiIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1JlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OlJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBjb25zdCBPcHRpb25zJiBvcHRpb25zKQorICAgIDogRmllbGRHZW5lcmF0b3Iob3B0aW9ucyksIGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKKyAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfLCBvcHRpb25zKTsKKworICBpZiAoZGVzY3JpcHRvci0+aXNfcGFja2VkKCkpIHsKICAgICB2YXJpYWJsZXNfWyJwYWNrZWRfcmVhZGVyIl0gPSAiUmVhZFBhY2tlZFByaW1pdGl2ZSI7CiAgICAgdmFyaWFibGVzX1sicmVwZWF0ZWRfcmVhZGVyIl0gPSAiUmVhZFJlcGVhdGVkUHJpbWl0aXZlTm9JbmxpbmUiOwogICB9IGVsc2UgewpAQCAtMjA5LDcgKzI3NSw4IEBACiBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4gJG5hbWUkXztcbiIpOwotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJiBIYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYKKyAgICAgIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgb3B0aW9uc18pKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgICJtdXRhYmxlIGludCBfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfO1xuIik7CiAgIH0KQEAgLTIxOCwzNSArMjg1LDQyIEBACiB2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgJHR5cGUkICRuYW1lJChpbnQgaW5kZXgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lIHZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgdm9pZCBhZGRfJG5hbWUkKCR0eXBlJCB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIik7CisgICAgIiRkZXByZWNhdGVkX2F0dHIkJHR5cGUkICRuYW1lJChpbnQgaW5kZXgpIGNvbnN0O1xuIgorICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSk7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBhZGRfJG5hbWUkKCR0eXBlJCB2YWx1ZSk7XG4iKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4mXG4iCi0gICAgIiAgICAkbmFtZSQoKSBjb25zdCRkZXByZWNhdGlvbiQ7XG4iCi0gICAgImlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+KlxuIgotICAgICIgICAgbXV0YWJsZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+JlxuIgorICAgICIgICAgJG5hbWUkKCkgY29uc3Q7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCAkdHlwZSQgPipcbiIKKyAgICAiICAgIG11dGFibGVfJG5hbWUkKCk7XG4iKTsKIH0KIAogdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgJHR5cGUkICRjbGFzc25hbWUkOjokbmFtZSQoaW50IGluZGV4KSBjb25zdCB7XG4iCitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsIGJvb2wgaXNfaW5saW5lKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICB2YXJpYWJsZXNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSIgOiAiIjsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICIkaW5saW5lJCAkdHlwZSQgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgogICAgICIgIHJldHVybiAkbmFtZSRfLkdldChpbmRleCk7XG4iCiAgICAgIn1cbiIKLSAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCAkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkge1xuIgogICAgICIgICRuYW1lJF8uU2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKICAgICAifVxuIgotICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKKyAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKICAgICAiICAkbmFtZSRfLkFkZCh2YWx1ZSk7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDokZnVsbF9uYW1lJClcbiIKICAgICAifVxuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8ICR0eXBlJCA+JlxuIgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgIiRpbmxpbmUkIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4mXG4iCiAgICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCiAgICAgIn1cbiIKLSAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4qXG4iCisgICAgIiRpbmxpbmUkIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgJHR5cGUkID4qXG4iCiAgICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OiRmdWxsX25hbWUkKVxuIgogICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKICAgICAifVxuIik7CiB9CkBAIC0yNjMsNyArMzM3LDcgQEAKIAogdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLlN3YXAoJm90aGVyLT4kbmFtZSRfKTtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT4kbmFtZSRfKTtcbiIpOwogfQogCiB2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgpAQCAtMjg5LDcgKzM2Myw3IEBACiAKIHZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CiAgICAgLy8gV3JpdGUgdGhlIHRhZyBhbmQgdGhlIHNpemUuCiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgICJpZiAodGhpcy0+JG5hbWUkX3NpemUoKSA+IDApIHtcbiIKQEAgLTMwMiw3ICszNzYsNyBAQAogICB9CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOwotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZSRkZWNsYXJlZF90eXBlJE5vVGFnKFxuIgogICAgICAgIiAgICB0aGlzLT4kbmFtZSQoaSksIG91dHB1dCk7XG4iKTsKQEAgLTMxNiw3ICszOTAsNyBAQAogCiB2b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKICAgICAvLyBXcml0ZSB0aGUgdGFnIGFuZCB0aGUgc2l6ZS4KICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImlmICh0aGlzLT4kbmFtZSRfc2l6ZSgpID4gMCkge1xuIgpAQCAtMzMwLDcgKzQwNCw3IEBACiAgIH0KICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgIiAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlxuIgogICAgICAgIiAgICBXcml0ZSRkZWNsYXJlZF90eXBlJE5vVGFnVG9BcnJheSh0aGlzLT4kbmFtZSQoaSksIHRhcmdldCk7XG4iKTsKQEAgLTM2MCwxMyArNDM0LDE1IEBACiAgICAgICAiZGF0YV9zaXplID0gJGZpeGVkX3NpemUkICogdGhpcy0+JG5hbWUkX3NpemUoKTtcbiIpOwogICB9CiAKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiaWYgKGRhdGFfc2l6ZSA+IDApIHtcbiIKICAgICAgICIgIHRvdGFsX3NpemUgKz0gJHRhZ19zaXplJCArXG4iCiAgICAgICAiICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoZGF0YV9zaXplKTtcbiIKICAgICAgICJ9XG4iCisgICAgICAiR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTtcbiIKICAgICAgICJfJG5hbWUkX2NhY2hlZF9ieXRlX3NpemVfID0gZGF0YV9zaXplO1xuIgorICAgICAgIkdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpO1xuIgogICAgICAgInRvdGFsX3NpemUgKz0gZGF0YV9zaXplO1xuIik7CiAgIH0gZWxzZSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3ByaW1pdGl2ZV9maWVsZC5oCmluZGV4IDhmY2Q3NGEuLjY1NWViZGUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfcHJpbWl0aXZlX2ZpZWxkLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9wcmltaXRpdmVfZmllbGQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDYsMTMgKzQ2LDE1IEBACiAKIGNsYXNzIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucyk7CiAgIH5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOwogCiAgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtNjIsMjIgKzY0LDQzIEBACiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUJ5dGVTaXplKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKIAotIHByaXZhdGU6CisgcHJvdGVjdGVkOgogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CiAKKyBwcml2YXRlOgogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOwogfTsKIAorY2xhc3MgUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBQcmltaXRpdmVGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKKyAgflByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlQ2xlYXJpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVN3YXBwaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDb25zdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IpOworfTsKKwogY2xhc3MgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CiAgcHVibGljOgotICBleHBsaWNpdCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogICB+UmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOwogCiAgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIHZvaWQgR2VuZXJhdGVQcml2YXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmNjCmluZGV4IGMyODI1NjguLjIyNmMyYWEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3NlcnZpY2UuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQzLDE0ICs0MywxNCBAQAogbmFtZXNwYWNlIGNwcCB7CiAKIFNlcnZpY2VHZW5lcmF0b3I6OlNlcnZpY2VHZW5lcmF0b3IoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGxsZXhwb3J0X2RlY2wpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCiAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgewogICB2YXJzX1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOwogICB2YXJzX1siZnVsbF9uYW1lIl0gPSBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCk7Ci0gIGlmIChkbGxleHBvcnRfZGVjbC5lbXB0eSgpKSB7CisgIGlmIChvcHRpb25zLmRsbGV4cG9ydF9kZWNsLmVtcHR5KCkpIHsKICAgICB2YXJzX1siZGxsZXhwb3J0Il0gPSAiIjsKICAgfSBlbHNlIHsKLSAgICB2YXJzX1siZGxsZXhwb3J0Il0gPSBkbGxleHBvcnRfZGVjbCArICIgIjsKKyAgICB2YXJzX1siZGxsZXhwb3J0Il0gPSBvcHRpb25zLmRsbGV4cG9ydF9kZWNsICsgIiAiOwogICB9CiB9CiAKQEAgLTMwMSw3ICszMDEsNyBAQAogICBwcmludGVyLT5QcmludCh2YXJzXywKICAgICAiICAgIGRlZmF1bHQ6XG4iCiAgICAgIiAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8IFwiQmFkIG1ldGhvZCBpbmRleDsgdGhpcyBzaG91bGQgbmV2ZXIgaGFwcGVuLlwiO1xuIgotICAgICIgICAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSo+KE5VTEwpO1xuIgorICAgICIgICAgICByZXR1cm4gKnN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqPihOVUxMKTtcbiIKICAgICAiICB9XG4iCiAgICAgIn1cbiIKICAgICAiXG4iKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc2VydmljZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgKaW5kZXggMTBlOWRkMy4uZWRlMmZkOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zZXJ2aWNlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM3LDcgKzM3LDcgQEAKIAogI2luY2x1ZGUgPG1hcD4KICNpbmNsdWRlIDxzdHJpbmc+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX29wdGlvbnMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKQEAgLTU1LDcgKzU1LDcgQEAKICBwdWJsaWM6CiAgIC8vIFNlZSBnZW5lcmF0b3IuY2MgZm9yIHRoZSBtZWFuaW5nIG9mIGRsbGV4cG9ydF9kZWNsLgogICBleHBsaWNpdCBTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZGxsZXhwb3J0X2RlY2wpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOwogICB+U2VydmljZUdlbmVyYXRvcigpOwogCiAgIC8vIEhlYWRlciBzdHVmZi4KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MKaW5kZXggM2NlYzJiNi4uMWQ3NDM0NSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQ2LDMzICs0Niw2NSBAQAogbmFtZXNwYWNlIHsKIAogdm9pZCBTZXRTdHJpbmdWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7Ci0gIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIHZhcmlhYmxlcywgb3B0aW9ucyk7CiAgICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdID0gRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHRfdmFyaWFibGUiXSA9IGRlc2NyaXB0b3ItPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKQotICAgICAgPyAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nIgotICAgICAgOiAiX2RlZmF1bHRfIiArIEZpZWxkTmFtZShkZXNjcmlwdG9yKSArICJfIjsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X2xlbmd0aCJdID0KKyAgICAgIFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5sZW5ndGgoKSk7CisgIHN0cmluZyBkZWZhdWx0X3ZhcmlhYmxlX3N0cmluZyA9CisgICAgICBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkKKyAgICAgICAgICA/ICImOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkiCisgICAgICAgICAgOiAiX2RlZmF1bHRfIiArIEZpZWxkTmFtZShkZXNjcmlwdG9yKSArICJfIjsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhcmlhYmxlIl0gPSBkZWZhdWx0X3ZhcmlhYmxlX3N0cmluZzsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X3ZhbHVlX2luaXQiXSA9CisgICAgICBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkKKyAgICAgID8gIiIgOiAiKiIgKyBkZWZhdWx0X3ZhcmlhYmxlX3N0cmluZzsKICAgKCp2YXJpYWJsZXMpWyJwb2ludGVyX3R5cGUiXSA9CiAgICAgICBkZXNjcmlwdG9yLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTID8gInZvaWQiIDogImNoYXIiOworICAvLyBOT1RFOiBFc2NhcGVkIGhlcmUgdG8gdW5ibG9jayBwcm90bzEtPnByb3RvMiBtaWdyYXRpb24uCisgIC8vIFRPRE8obGl1amlzaSk6IEV4dGVuZCB0aGlzIHRvIGFwcGx5IGZvciBvdGhlciBjb25mbGljdGluZyBtZXRob2RzLgorICAoKnZhcmlhYmxlcylbInJlbGVhc2VfbmFtZSJdID0KKyAgICAgIFNhZmVGdW5jdGlvbk5hbWUoZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3IsICJyZWxlYXNlXyIpOworICAoKnZhcmlhYmxlcylbImZ1bGxfbmFtZSJdID0gZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCk7CisKKyAgKCp2YXJpYWJsZXMpWyJzdHJpbmdfcGllY2UiXSA9ICI6OnN0ZDo6c3RyaW5nIjsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKLSAgU2V0U3RyaW5nVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK1N0cmluZ0ZpZWxkR2VuZXJhdG9yOjpTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT3B0aW9ucyYgb3B0aW9ucykKKyAgICA6IEZpZWxkR2VuZXJhdG9yKG9wdGlvbnMpLCBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CisgIFNldFN0cmluZ1ZhcmlhYmxlcyhkZXNjcmlwdG9yLCAmdmFyaWFibGVzXywgb3B0aW9ucyk7CiB9CiAKIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjp+U3RyaW5nRmllbGRHZW5lcmF0b3IoKSB7fQogCiB2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIjo6c3RkOjpzdHJpbmcqICRuYW1lJF87XG4iKTsKKyAgLy8gTi5CLiB0aGF0IHdlIGNvbnRpbnVlIHRvIHVzZSB8QXJlbmFTdHJpbmdQdHJ8IGluc3RlYWQgb2YgfHN0cmluZyp8IGZvcgorICAvLyBzdHJpbmcgZmllbGRzLCBldmVuIHdoZW4gU3VwcG9ydEFyZW5hcyhkZXNjcmlwdG9yXykgPT0gZmFsc2UuIFdoeT8KKyAgLy8gVGhlIHNpbXBsZSBhbnN3ZXIgaXMgdG8gYXZvaWQgdW5tYWludGFpbmFibGUgY29tcGxleGl0eS4gVGhlIHJlZmxlY3Rpb24KKyAgLy8gY29kZSBhc3N1bWVzIEFyZW5hU3RyaW5nUHRycy4gVGhlc2UgYXJlICphbG1vc3QqIGluLW1lbW9yeS1jb21wYXRpYmxlIHdpdGgKKyAgLy8gc3RyaW5nKiwgZXhjZXB0IGZvciB0aGUgcG9pbnRlciB0YWdzIGFuZCByZWxhdGVkIG93bmVyc2hpcCBzZW1hbnRpY3MuIFdlCisgIC8vIGNvdWxkIG1vZGlmeSB0aGUgcnVudGltZSBjb2RlIHRvIHVzZSBzdHJpbmcqIGZvciB0aGUgbm90LXN1cHBvcnRpbmctYXJlbmFzCisgIC8vIGNhc2UsIGJ1dCB0aGlzIHdvdWxkIHJlcXVpcmUgYSB3YXkgdG8gZGV0ZWN0IHdoaWNoIHR5cGUgb2YgY2xhc3Mgd2FzCisgIC8vIGdlbmVyYXRlZCAoYWRkaW5nIG92ZXJoZWFkIGFuZCBjb21wbGV4aXR5IHRvIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKQorICAvLyBhbmQgbGl0dGVyaW5nIHRoZSBydW50aW1lIGNvZGUgcGF0aHMgd2l0aCBjb25kaXRpb25hbHMuIEl0J3Mgc2ltcGxlciB0bworICAvLyBzdGljayB3aXRoIHRoaXMgYnV0IHVzZSBsaWdodHdlaWdodCBhY2Nlc3NvcnMgdGhhdCBhc3N1bWUgYXJlbmEgPT0gTlVMTC4KKyAgLy8gVGhlcmUgc2hvdWxkIGJlIHZlcnkgbGl0dGxlIG92ZXJoZWFkIGFueXdheSBiZWNhdXNlIGl0J3MganVzdCBhIHRhZ2dlZAorICAvLyBwb2ludGVyIGluLW1lbW9yeS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyICRuYW1lJF87XG4iKTsKK30KKwordm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVN0YXRpY01lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgInN0YXRpYyBjb25zdCA6OnN0ZDo6c3RyaW5nICRkZWZhdWx0X3ZhcmlhYmxlJDtcbiIpOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGF0aWMgOjpzdGQ6OnN0cmluZyogJGRlZmF1bHRfdmFyaWFibGUkO1xuIik7CiAgIH0KIH0KIApAQCAtOTQsNyArMTI2LDExIEBACiAgIC8vIGZpbGVzIHRoYXQgYXBwbGllZCB0aGUgY3R5cGUuICBUaGUgZmllbGQgY2FuIHN0aWxsIGJlIGFjY2Vzc2VkIHZpYSB0aGUKICAgLy8gcmVmbGVjdGlvbiBpbnRlcmZhY2Ugc2luY2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlIGlzIGluZGVwZW5kZW50IG9mCiAgIC8vIHRoZSBzdHJpbmcncyB1bmRlcmx5aW5nIHJlcHJlc2VudGF0aW9uLgotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5jdHlwZSgpICE9IEZpZWxkT3B0aW9uczo6U1RSSU5HKSB7CisKKyAgYm9vbCB1bmtub3duX2N0eXBlID0KKyAgICAgIGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPSBFZmZlY3RpdmVTdHJpbmdDVHlwZShkZXNjcmlwdG9yXyk7CisKKyAgaWYgKHVua25vd25fY3R5cGUpIHsKICAgICBwcmludGVyLT5PdXRkZW50KCk7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiIHByaXZhdGU6XG4iCkBAIC0xMDMsMTUgKzEzOSwyMyBAQAogICB9CiAKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRuYW1lJCgpIGNvbnN0JGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lIHZvaWQgc2V0XyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCi0gICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkiCi0gICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV8kbmFtZSQoKSRkZXByZWNhdGlvbiQ7XG4iCi0gICAgImlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIpOworICAgICIkZGVwcmVjYXRlZF9hdHRyJGNvbnN0IDo6c3RkOjpzdHJpbmcmICRuYW1lJCgpIGNvbnN0O1xuIgorICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0XyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKTtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHNldF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkiCisgICAgICAgICAgICAgICAgICI7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkOjpzdGQ6OnN0cmluZyogbXV0YWJsZV8kbmFtZSQoKTtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6OnN0ZDo6c3RyaW5nKiAkcmVsZWFzZV9uYW1lJCgpO1xuIgorICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgc2V0X2FsbG9jYXRlZF8kbmFtZSQoOjpzdGQ6OnN0cmluZyogJG5hbWUkKTtcbiIpOworICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRlZF9hdHRyJDo6c3RkOjpzdHJpbmcqIHVuc2FmZV9hcmVuYV9yZWxlYXNlXyRuYW1lJCgpO1xuIgorICAgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCB1bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZF8kbmFtZSQoXG4iCisgICAgICAiICAgIDo6c3RkOjpzdHJpbmcqICRuYW1lJCk7XG4iKTsKKyAgfQogCi0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLmN0eXBlKCkgIT0gRmllbGRPcHRpb25zOjpTVFJJTkcpIHsKKworICBpZiAodW5rbm93bl9jdHlwZSkgewogICAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgICBwcmludGVyLT5QcmludCgiIHB1YmxpYzpcbiIpOwogICAgIHByaW50ZXItPkluZGVudCgpOwpAQCAtMTE5LDEwNCArMTYzLDIwNSBAQAogfQogCiB2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6OiRuYW1lJCgpIGNvbnN0IHtcbiIKLSAgICAiICByZXR1cm4gKiRuYW1lJF87XG4iCi0gICAgIn1cbiIKLSAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHtcbiIKLSAgICAiICBzZXRfaGFzXyRuYW1lJCgpO1xuIgotICAgICIgIGlmICgkbmFtZSRfID09ICYkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIKLSAgICAiICAgICRuYW1lJF8gPSBuZXcgOjpzdGQ6OnN0cmluZztcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgJG5hbWUkXy0+YXNzaWduKHZhbHVlKTtcbiIKLSAgICAifVxuIgotICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgotICAgICIgIHNldF9oYXNfJG5hbWUkKCk7XG4iCi0gICAgIiAgaWYgKCRuYW1lJF8gPT0gJiRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgotICAgICIgICAgJG5hbWUkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nO1xuIgotICAgICIgIH1cbiIKLSAgICAiICAkbmFtZSRfLT5hc3NpZ24odmFsdWUpO1xuIgotICAgICJ9XG4iCi0gICAgImlubGluZSAiCi0gICAgInZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkge1xuIgotICAgICIgIHNldF9oYXNfJG5hbWUkKCk7XG4iCi0gICAgIiAgaWYgKCRuYW1lJF8gPT0gJiRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgotICAgICIgICAgJG5hbWUkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nO1xuIgotICAgICIgIH1cbiIKLSAgICAiICAkbmFtZSRfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTtcbiIKLSAgICAifVxuIgotICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgotICAgICIgIHNldF9oYXNfJG5hbWUkKCk7XG4iCi0gICAgIiAgaWYgKCRuYW1lJF8gPT0gJiRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIgICAgJG5hbWUkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nO1xuIik7CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lIiA6ICIiOworICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiRpbmxpbmUkIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF8uR2V0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHtcbiIKKyAgICAgICIgICRzZXRfaGFzYml0JFxuIgorICAgICAgIiAgJG5hbWUkXy5TZXQoJGRlZmF1bHRfdmFyaWFibGUkLCB2YWx1ZSwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKSB7XG4iCisgICAgICAiICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgICRuYW1lJF8uU2V0KCRkZWZhdWx0X3ZhcmlhYmxlJCwgJHN0cmluZ19waWVjZSQodmFsdWUpLFxuIgorICAgICAgIiAgICAgICAgICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkICIKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSxcbiIKKyAgICAgICIgICAgc2l6ZV90IHNpemUpIHtcbiIKKyAgICAgICIgICRzZXRfaGFzYml0JFxuIgorICAgICAgIiAgJG5hbWUkXy5TZXQoJGRlZmF1bHRfdmFyaWFibGUkLCAkc3RyaW5nX3BpZWNlJChcbiIKKyAgICAgICIgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpLCBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLk11dGFibGUoJGRlZmF1bHRfdmFyaWFibGUkLCBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICAkY2xlYXJfaGFzYml0JFxuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF8uUmVsZWFzZSgkZGVmYXVsdF92YXJpYWJsZSQsIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3JlbGVhc2VfJG5hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpO1xuIgorICAgICAgIiAgJGNsZWFyX2hhc2JpdCRcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLlVuc2FmZUFyZW5hUmVsZWFzZSgkZGVmYXVsdF92YXJpYWJsZSQsXG4iCisgICAgICAiICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKDo6c3RkOjpzdHJpbmcqICRuYW1lJCkge1xuIgorICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMKSB7XG4iCisgICAgICAiICAgICRzZXRfaGFzYml0JFxuIgorICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICIgICAgJGNsZWFyX2hhc2JpdCRcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRuYW1lJF8uU2V0QWxsb2NhdGVkKCRkZWZhdWx0X3ZhcmlhYmxlJCwgJG5hbWUkLFxuIgorICAgICAgIiAgICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnVuc2FmZV9hcmVuYV9zZXRfYWxsb2NhdGVkXyRuYW1lJChcbiIKKyAgICAgICIgICAgOjpzdGQ6OnN0cmluZyogJG5hbWUkKSB7XG4iCisgICAgICAiICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gTlVMTCk7XG4iCisgICAgICAiICBpZiAoJG5hbWUkICE9IE5VTEwpIHtcbiIKKyAgICAgICIgICAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICB9IGVsc2Uge1xuIgorICAgICAgIiAgICAkY2xlYXJfaGFzYml0JFxuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgJG5hbWUkXy5VbnNhZmVBcmVuYVNldEFsbG9jYXRlZCgkZGVmYXVsdF92YXJpYWJsZSQsXG4iCisgICAgICAiICAgICAgJG5hbWUkLCBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF91bnNhZmVfYXJlbmFfc2V0X2FsbG9jYXRlZDoiCisgICAgICAiJGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CiAgIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIgICAgJG5hbWUkXyA9IG5ldyA6OnN0ZDo6c3RyaW5nKCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iKTsKKyAgICAvLyBOby1hcmVuYSBjYXNlLgorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICIkaW5saW5lJCBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6JG5hbWUkKCkgY29uc3Qge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLkdldE5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkge1xuIgorICAgICAgIiAgJHNldF9oYXNiaXQkXG4iCisgICAgICAiICAkbmFtZSRfLlNldE5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkLCB2YWx1ZSk7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKSB7XG4iCisgICAgICAiICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgICRuYW1lJF8uU2V0Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQsICRzdHJpbmdfcGllY2UkKHZhbHVlKSk7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkICIKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgIgorICAgICAgInNpemVfdCBzaXplKSB7XG4iCisgICAgICAiICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgICRuYW1lJF8uU2V0Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQsXG4iCisgICAgICAiICAgICAgJHN0cmluZ19waWVjZSQocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAgICIgICRzZXRfaGFzYml0JFxuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5NdXRhYmxlTm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6JHJlbGVhc2VfbmFtZSQoKSB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXy5SZWxlYXNlTm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfYWxsb2NhdGVkXyRuYW1lJCg6OnN0ZDo6c3RyaW5nKiAkbmFtZSQpIHtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQgIT0gTlVMTCkge1xuIgorICAgICAgIiAgICAkc2V0X2hhc2JpdCRcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgICRjbGVhcl9oYXNiaXQkXG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAkbmFtZSRfLlNldEFsbG9jYXRlZE5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkLCAkbmFtZSQpO1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIik7CiAgIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgIn1cbiIKLSAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjpyZWxlYXNlXyRuYW1lJCgpIHtcbiIKLSAgICAiICBjbGVhcl9oYXNfJG5hbWUkKCk7XG4iCi0gICAgIiAgaWYgKCRuYW1lJF8gPT0gJiRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgotICAgICIgICAgcmV0dXJuIE5VTEw7XG4iCi0gICAgIiAgfSBlbHNlIHtcbiIKLSAgICAiICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSAkbmFtZSRfO1xuIgotICAgICIgICAgJG5hbWUkXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAiICAgIHJldHVybiB0ZW1wO1xuIgotICAgICIgIH1cbiIKLSAgICAifVxuIik7CiB9CiAKIHZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIGlmICghZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgIC8vIEluaXRpYWxpemVkIGluIEdlbmVyYXRlRGVmYXVsdEluc3RhbmNlQWxsb2NhdG9yLgogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiY29uc3QgOjpzdGQ6OnN0cmluZyAkY2xhc3NuYW1lJDo6JGRlZmF1bHRfdmFyaWFibGUkKCRkZWZhdWx0JCk7XG4iKTsKKyAgICAgICI6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6JGRlZmF1bHRfdmFyaWFibGUkID0gTlVMTDtcbiIpOwogICB9CiB9CiAKIHZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICgkbmFtZSRfICE9ICYkZGVmYXVsdF92YXJpYWJsZSQpIHtcbiIKLSAgICAgICIgICRuYW1lJF8tPmNsZWFyKCk7XG4iCi0gICAgICAifVxuIik7CisgIC8vIFR3by1kaW1lbnNpb24gc3BlY2lhbGl6YXRpb24gaGVyZTogc3VwcG9ydGluZyBhcmVuYXMgb3Igbm90LCBhbmQgZGVmYXVsdAorICAvLyB2YWx1ZSBpcyB0aGUgZW1wdHkgc3RyaW5nIG9yIG5vdC4gQ29tcGxleGl0eSBoZXJlIGVuc3VyZXMgdGhlIG1pbmltYWwKKyAgLy8gbnVtYmVyIG9mIGJyYW5jaGVzIC8gYW1vdW50IG9mIGV4dHJhbmVvdXMgY29kZSBhdCBydW50aW1lIChnaXZlbiB0aGF0IHRoZQorICAvLyBiZWxvdyBtZXRob2RzIGFyZSBpbmxpbmVkIG9uZS1saW5lcnMpIQorICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpLmVtcHR5KCkpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICIkbmFtZSRfLkNsZWFyVG9FbXB0eSgkZGVmYXVsdF92YXJpYWJsZSQsIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICIkbmFtZSRfLkNsZWFyVG9EZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iKTsKKyAgICB9CiAgIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoJG5hbWUkXyAhPSAmJGRlZmF1bHRfdmFyaWFibGUkKSB7XG4iCi0gICAgICAiICAkbmFtZSRfLT5hc3NpZ24oJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKLSAgICAgICJ9XG4iKTsKKyAgICBpZiAoZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgIiRuYW1lJF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICIkbmFtZSRfLkNsZWFyVG9EZWZhdWx0Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7CisgICAgfQogICB9CiB9CiAKIHZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAic2V0XyRuYW1lJChmcm9tLiRuYW1lJCgpKTtcbiIpOworICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pIHx8IGRlc2NyaXB0b3JfLT5jb250YWluaW5nX29uZW9mKCkgIT0gTlVMTCkgeworICAgIC8vIFRPRE8oZ3Bpa2UpOiBpbXByb3ZlIHRoaXMKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAic2V0XyRuYW1lJChmcm9tLiRuYW1lJCgpKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJHNldF9oYXNiaXQkXG4iCisgICAgICAiJG5hbWUkXy5Bc3NpZ25XaXRoRGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQsIGZyb20uJG5hbWUkXyk7XG4iKTsKKyAgfQogfQogCiB2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJzdGQ6OnN3YXAoJG5hbWUkXywgb3RoZXItPiRuYW1lJF8pO1xuIik7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLlN3YXAoJm90aGVyLT4kbmFtZSRfKTtcbiIpOwogfQogCiB2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRuYW1lJF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJiRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iKTsKKyAgICAgICIkbmFtZSRfLlVuc2FmZVNldERlZmF1bHQoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIpOwogfQogCiB2b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlRGVzdHJ1Y3RvckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRuYW1lJF8gIT0gJiRkZWZhdWx0X3ZhcmlhYmxlJCkge1xuIgotICAgICIgIGRlbGV0ZSAkbmFtZSRfO1xuIgotICAgICJ9XG4iKTsKKyAgaWYgKFN1cHBvcnRzQXJlbmFzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJG5hbWUkXy5EZXN0cm95KCRkZWZhdWx0X3ZhcmlhYmxlJCwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRuYW1lJF8uRGVzdHJveU5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVEZWZhdWx0SW5zdGFuY2VBbGxvY2F0b3IoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkY2xhc3NuYW1lJDo6JGRlZmF1bHRfdmFyaWFibGUkID1cbiIKKyAgICAgICIgICAgbmV3IDo6c3RkOjpzdHJpbmcoJGRlZmF1bHQkLCAkZGVmYXVsdF9sZW5ndGgkKTtcbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKCFkZXNjcmlwdG9yXy0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKS5lbXB0eSgpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJkZWxldGUgJGNsYXNzbmFtZSQ6OiRkZWZhdWx0X3ZhcmlhYmxlJDtcbiIpOworICB9CiB9CiAKIHZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgpAQCAtMjI0LDM3ICszNjksMzIgQEAKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkJGRlY2xhcmVkX3R5cGUkKFxuIgogICAgICIgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV8kbmFtZSQoKSkpO1xuIik7Ci0gIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCi0gICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCi0gICAgICAiICB0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpO1xuIik7CisKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZygKKyAgICAgICAgZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCB0cnVlLCB2YXJpYWJsZXNfLAorICAgICAgICAidGhpcy0+JG5hbWUkKCkuZGF0YSgpLCB0aGlzLT4kbmFtZSQoKS5sZW5ndGgoKSxcbiIsIHByaW50ZXIpOwogICB9CiB9CiAKIHZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKEhhc1V0ZjhWZXJpZmljYXRpb24oZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKLSAgICAgIGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhcbiIKLSAgICAgICIgIHRoaXMtPiRuYW1lJCgpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKCkubGVuZ3RoKCksXG4iCi0gICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpO1xuIik7CisgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBHZW5lcmF0ZVV0ZjhDaGVja0NvZGVGb3JTdHJpbmcoCisgICAgICAgIGRlc2NyaXB0b3JfLCBvcHRpb25zXywgZmFsc2UsIHZhcmlhYmxlc18sCisgICAgICAgICJ0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIiwgcHJpbnRlcik7CiAgIH0KICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlJGRlY2xhcmVkX3R5cGUkKFxuIgorICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSRNYXliZUFsaWFzZWQoXG4iCiAgICAgIiAgJG51bWJlciQsIHRoaXMtPiRuYW1lJCgpLCBvdXRwdXQpO1xuIik7CiB9CiAKIHZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCi0gICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoXG4iCi0gICAgICAiICB0aGlzLT4kbmFtZSQoKS5kYXRhKCksIHRoaXMtPiRuYW1lJCgpLmxlbmd0aCgpLFxuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTtcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKAorICAgICAgICBkZXNjcmlwdG9yXywgb3B0aW9uc18sIGZhbHNlLCB2YXJpYWJsZXNfLAorICAgICAgICAidGhpcy0+JG5hbWUkKCkuZGF0YSgpLCB0aGlzLT4kbmFtZSQoKS5sZW5ndGgoKSxcbiIsIHByaW50ZXIpOwogICB9CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgInRhcmdldCA9XG4iCkBAIC0yNzIsMTAgKzQxMiwyNzEgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLVJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpIHsKLSAgU2V0U3RyaW5nVmFyaWFibGVzKGRlc2NyaXB0b3IsICZ2YXJpYWJsZXNfKTsKK1N0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgorU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBTdHJpbmdGaWVsZEdlbmVyYXRvcihkZXNjcmlwdG9yLCBvcHRpb25zKSwKKyAgICAgIGRlcGVuZGVudF9maWVsZF8ob3B0aW9ucy5wcm90b19oKSB7CisgIFNldENvbW1vbk9uZW9mRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18pOworfQorCitTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjp+U3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUlubGluZUFjY2Vzc29yRGVmaW5pdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19pbmxpbmUpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIHZhcmlhYmxlc1siaW5saW5lIl0gPSBpc19pbmxpbmUgPyAiaW5saW5lIiA6ICIiOworICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiRpbmxpbmUkIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgaWYgKGhhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICByZXR1cm4gJG9uZW9mX3ByZWZpeCQkbmFtZSRfLkdldCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuICokZGVmYXVsdF92YXJpYWJsZSQ7XG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHtcbiIKKyAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlNldCgkZGVmYXVsdF92YXJpYWJsZSQsIHZhbHVlLFxuIgorICAgICAgIiAgICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgorICAgICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uU2V0KCRkZWZhdWx0X3ZhcmlhYmxlJCxcbiIKKyAgICAgICIgICAgICAkc3RyaW5nX3BpZWNlJCh2YWx1ZSksIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCAiCisgICAgICAidm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsXG4iCisgICAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZSkge1xuIgorICAgICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uU2V0KCRkZWZhdWx0X3ZhcmlhYmxlJCwgJHN0cmluZ19waWVjZSQoXG4iCisgICAgICAiICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSxcbiIKKyAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICByZXR1cm4gJG9uZW9mX3ByZWZpeCQkbmFtZSRfLk11dGFibGUoJGRlZmF1bHRfdmFyaWFibGUkLFxuIgorICAgICAgIiAgICAgIEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjokcmVsZWFzZV9uYW1lJCgpIHtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgaWYgKGhhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICBjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHJldHVybiAkb25lb2ZfcHJlZml4JCRuYW1lJF8uUmVsZWFzZSgkZGVmYXVsdF92YXJpYWJsZSQsXG4iCisgICAgICAiICAgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBOVUxMO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3JlbGVhc2VfJG5hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3Vuc2FmZV9hcmVuYV9yZWxlYXNlOiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpO1xuIgorICAgICAgIiAgaWYgKGhhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICBjbGVhcl9oYXNfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHJldHVybiAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlQXJlbmFSZWxlYXNlKFxuIgorICAgICAgIiAgICAgICAgJGRlZmF1bHRfdmFyaWFibGUkLCBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICIgIH0gZWxzZSB7XG4iCisgICAgICAiICAgIHJldHVybiBOVUxMO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfYWxsb2NhdGVkXyRuYW1lJCg6OnN0ZDo6c3RyaW5nKiAkbmFtZSQpIHtcbiIKKyAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQgIT0gTlVMTCkge1xuIgorICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uU2V0QWxsb2NhdGVkKCRkZWZhdWx0X3ZhcmlhYmxlJCwgJG5hbWUkLFxuIgorICAgICAgIiAgICAgICAgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6dW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWRfJG5hbWUkKCIKKyAgICAgICI6OnN0ZDo6c3RyaW5nKiAkbmFtZSQpIHtcbiIKKyAgICAgICIgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSAhPSBOVUxMKTtcbiIKKyAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICBjbGVhcl8kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgIGlmICgkbmFtZSQpIHtcbiIKKyAgICAgICIgICAgc2V0X2hhc18kbmFtZSQoKTtcbiIKKyAgICAgICIgICAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkKCRkZWZhdWx0X3ZhcmlhYmxlJCwgIgorICAgICAgIiRuYW1lJCwgR2V0QXJlbmFOb1ZpcnR1YWwoKSk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfdW5zYWZlX2FyZW5hX3NldF9hbGxvY2F0ZWQ6IgorICAgICAgIiRmdWxsX25hbWUkKVxuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIC8vIE5vLWFyZW5hIGNhc2UuCisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiRpbmxpbmUkIGNvbnN0IDo6c3RkOjpzdHJpbmcmICRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgaWYgKGhhc18kbmFtZSQoKSkge1xuIgorICAgICAgIiAgICByZXR1cm4gJG9uZW9mX3ByZWZpeCQkbmFtZSRfLkdldE5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiAqJGRlZmF1bHRfdmFyaWFibGUkO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0OiRmdWxsX25hbWUkKVxuIgorICAgICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uU2V0Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQsIHZhbHVlKTtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoY29uc3QgY2hhciogdmFsdWUpIHtcbiIKKyAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlNldE5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkLFxuIgorICAgICAgIiAgICAgICRzdHJpbmdfcGllY2UkKHZhbHVlKSk7XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkICIKKyAgICAgICJ2b2lkICRjbGFzc25hbWUkOjpzZXRfJG5hbWUkKGNvbnN0ICRwb2ludGVyX3R5cGUkKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHtcbiIKKyAgICAgICIgIGlmICghaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgICBzZXRfaGFzXyRuYW1lJCgpO1xuIgorICAgICAgIiAgICAkb25lb2ZfcHJlZml4JCRuYW1lJF8uVW5zYWZlU2V0RGVmYXVsdCgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlNldE5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkLCAkc3RyaW5nX3BpZWNlJChcbiIKKyAgICAgICIgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTtcbiIKKyAgICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6Om11dGFibGVfJG5hbWUkKCkge1xuIgorICAgICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgY2xlYXJfJG9uZW9mX25hbWUkKCk7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5VbnNhZmVTZXREZWZhdWx0KCRkZWZhdWx0X3ZhcmlhYmxlJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKKyAgICAgICIgIHJldHVybiAkb25lb2ZfcHJlZml4JCRuYW1lJF8uTXV0YWJsZU5vQXJlbmEoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiJGlubGluZSQgOjpzdGQ6OnN0cmluZyogJGNsYXNzbmFtZSQ6OiRyZWxlYXNlX25hbWUkKCkge1xuIgorICAgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6JGZ1bGxfbmFtZSQpXG4iCisgICAgICAiICBpZiAoaGFzXyRuYW1lJCgpKSB7XG4iCisgICAgICAiICAgIGNsZWFyX2hhc18kb25lb2ZfbmFtZSQoKTtcbiIKKyAgICAgICIgICAgcmV0dXJuICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5SZWxlYXNlTm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAgICIgICAgcmV0dXJuIE5VTEw7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF9hbGxvY2F0ZWRfJG5hbWUkKDo6c3RkOjpzdHJpbmcqICRuYW1lJCkge1xuIgorICAgICAgIiAgaWYgKCFoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICAgJG9uZW9mX3ByZWZpeCQkbmFtZSRfLlVuc2FmZVNldERlZmF1bHQoJGRlZmF1bHRfdmFyaWFibGUkKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIGNsZWFyXyRvbmVvZl9uYW1lJCgpO1xuIgorICAgICAgIiAgaWYgKCRuYW1lJCAhPSBOVUxMKSB7XG4iCisgICAgICAiICAgIHNldF9oYXNfJG5hbWUkKCk7XG4iCisgICAgICAiICAgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCRkZWZhdWx0X3ZhcmlhYmxlJCxcbiIKKyAgICAgICIgICAgICAgICRuYW1lJCk7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDokZnVsbF9uYW1lJClcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorfQorCit2b2lkIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXModmFyaWFibGVzXyk7CisgIGlmIChkZXBlbmRlbnRfZmllbGRfKSB7CisgICAgdmFyaWFibGVzWyJ0aGlzX21lc3NhZ2UiXSA9IERlcGVuZGVudEJhc2VEb3duQ2FzdCgpOworICAgIC8vIFRoaXMgY2xlYXJpbmcgY29kZSBtYXkgYmUgaW4gdGhlIGRlcGVuZGVudCBiYXNlIGNsYXNzLiBJZiB0aGUgZGVmYXVsdAorICAgIC8vIHZhbHVlIGlzIGFuIGVtcHR5IHN0cmluZywgdGhlbiB0aGUgJGRlZmF1bHRfdmFyaWFibGUkIGlzIGEgZ2xvYmFsCisgICAgLy8gc2luZ2xldG9uLiBJZiB0aGUgZGVmYXVsdCBpcyBub3QgZW1wdHksIHdlIG5lZWQgdG8gZG93bi1jYXN0IHRvIGdldCB0aGUKKyAgICAvLyBkZWZhdWx0IHZhbHVlJ3MgZ2xvYmFsIHNpbmdsZXRvbiBpbnN0YW5jZS4gU2VlIFNldFN0cmluZ1ZhcmlhYmxlcygpIGZvcgorICAgIC8vIHBvc3NpYmxlIHZhbHVlcyBvZiBkZWZhdWx0X3ZhcmlhYmxlLgorICAgIGlmICghZGVzY3JpcHRvcl8tPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkuZW1wdHkoKSkgeworICAgICAgdmFyaWFibGVzWyJkZWZhdWx0X3ZhcmlhYmxlIl0gPQorICAgICAgICAgIERlcGVuZGVudEJhc2VEb3duQ2FzdCgpICsgdmFyaWFibGVzWyJkZWZhdWx0X3ZhcmlhYmxlIl07CisgICAgfQorICB9IGVsc2UgeworICAgIHZhcmlhYmxlc1sidGhpc19tZXNzYWdlIl0gPSAiIjsKKyAgfQorICBpZiAoU3VwcG9ydHNBcmVuYXMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiR0aGlzX21lc3NhZ2UkJG9uZW9mX3ByZWZpeCQkbmFtZSRfLkRlc3Ryb3koJGRlZmF1bHRfdmFyaWFibGUkLFxuIgorICAgICAgIiAgICAkdGhpc19tZXNzYWdlJEdldEFyZW5hTm9WaXJ0dWFsKCkpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgIiR0aGlzX21lc3NhZ2UkJG9uZW9mX3ByZWZpeCQkbmFtZSRfLiIKKyAgICAgICJEZXN0cm95Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7CisgIH0KK30KKwordm9pZCBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIC8vIERvbid0IHByaW50IGFueSBzd2FwcGluZyBjb2RlLiBTd2FwcGluZyB0aGUgdW5pb24gd2lsbCBzd2FwIHRoaXMgZmllbGQuCit9CisKK3ZvaWQgU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIgICRjbGFzc25hbWUkX2RlZmF1bHRfb25lb2ZfaW5zdGFuY2VfLT4kbmFtZSRfLlVuc2FmZVNldERlZmF1bHQoIgorICAgICIkZGVmYXVsdF92YXJpYWJsZSQpO1xuIik7Cit9CisKK3ZvaWQgU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0c0FyZW5hcyhkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5EZXN0cm95KCRkZWZhdWx0X3ZhcmlhYmxlJCxcbiIKKyAgICAgICIgICAgICBHZXRBcmVuYU5vVmlydHVhbCgpKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChoYXNfJG5hbWUkKCkpIHtcbiIKKyAgICAgICIgICRvbmVvZl9wcmVmaXgkJG5hbWUkXy5EZXN0cm95Tm9BcmVuYSgkZGVmYXVsdF92YXJpYWJsZSQpO1xuIgorICAgICAgIn1cbiIpOworICB9Cit9CisKK3ZvaWQgU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWQkZGVjbGFyZWRfdHlwZSQoXG4iCisgICAgICAiICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfJG5hbWUkKCkpKTtcbiIpOworCisgIGlmIChkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICBHZW5lcmF0ZVV0ZjhDaGVja0NvZGVGb3JTdHJpbmcoCisgICAgICAgIGRlc2NyaXB0b3JfLCBvcHRpb25zXywgdHJ1ZSwgdmFyaWFibGVzXywKKyAgICAgICAgInRoaXMtPiRuYW1lJCgpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKCkubGVuZ3RoKCksXG4iLCBwcmludGVyKTsKKyAgfQorfQorCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6UmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpCisgICAgOiBGaWVsZEdlbmVyYXRvcihvcHRpb25zKSwgZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworICBTZXRTdHJpbmdWYXJpYWJsZXMoZGVzY3JpcHRvciwgJnZhcmlhYmxlc18sIG9wdGlvbnMpOwogfQogCiBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9CkBAIC0yODksNyArNjkwLDEwIEBACiB2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVBY2Nlc3NvckRlY2xhcmF0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICAvLyBTZWUgY29tbWVudCBhYm92ZSBhYm91dCB1bmtub3duIGN0eXBlcy4KLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPSBGaWVsZE9wdGlvbnM6OlNUUklORykgeworICBib29sIHVua25vd25fY3R5cGUgPQorICAgICAgZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5jdHlwZSgpICE9IEVmZmVjdGl2ZVN0cmluZ0NUeXBlKGRlc2NyaXB0b3JfKTsKKworICBpZiAodW5rbm93bl9jdHlwZSkgewogICAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgICBwcmludGVyLT5QcmludCgKICAgICAgICIgcHJpdmF0ZTpcbiIKQEAgLTI5OCwyNiArNzAyLDI2IEBACiAgIH0KIAogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgJG5hbWUkKGludCBpbmRleCkgY29uc3QkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSRkZXByZWNhdGlvbiQ7XG4iCi0gICAgImlubGluZSB2b2lkIHNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgdm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpJGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lICIKLSAgICAidm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkiCi0gICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgOjpzdGQ6OnN0cmluZyogYWRkXyRuYW1lJCgpJGRlcHJlY2F0aW9uJDtcbiIKLSAgICAiaW5saW5lIHZvaWQgYWRkXyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgdm9pZCBhZGRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKSRkZXByZWNhdGlvbiQ7XG4iCi0gICAgImlubGluZSB2b2lkIGFkZF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkiCi0gICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kO1xuIik7CisgICAgIiRkZXByZWNhdGVkX2F0dHIkY29uc3QgOjpzdGQ6OnN0cmluZyYgJG5hbWUkKGludCBpbmRleCkgY29uc3Q7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkOjpzdGQ6OnN0cmluZyogbXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KTtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIHNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfJG5hbWUkKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpO1xuIgorICAgICIiCisgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBzZXRfJG5hbWUkKCIKKyAgICAgICAgICAgICAgICAgImludCBpbmRleCwgY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkOjpzdGQ6OnN0cmluZyogYWRkXyRuYW1lJCgpO1xuIgorICAgICIkZGVwcmVjYXRlZF9hdHRyJHZvaWQgYWRkXyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7XG4iCisgICAgIiRkZXByZWNhdGVkX2F0dHIkdm9pZCBhZGRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKTtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciR2b2lkIGFkZF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkiCisgICAgICAgICAgICAgICAgICI7XG4iKTsKIAogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgJG5hbWUkKCkgY29uc3QiCi0gICAgICAgICAgICAgICAgICIkZGVwcmVjYXRpb24kO1xuIgotICAgICJpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiogbXV0YWJsZV8kbmFtZSQoKSIKLSAgICAgICAgICAgICAgICAgIiRkZXByZWNhdGlvbiQ7XG4iKTsKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciRjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiAkbmFtZSQoKSAiCisgICAgICAgICAgICAgICAgICJjb25zdDtcbiIKKyAgICAiJGRlcHJlY2F0ZWRfYXR0ciQ6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlXyRuYW1lJCgpIgorICAgICAgICAgICAgICAgICAiO1xuIik7CiAKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkuY3R5cGUoKSAhPSBGaWVsZE9wdGlvbnM6OlNUUklORykgeworICBpZiAodW5rbm93bl9jdHlwZSkgewogICAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgICBwcmludGVyLT5QcmludCgiIHB1YmxpYzpcbiIpOwogICAgIHByaW50ZXItPkluZGVudCgpOwpAQCAtMzI1LDQ2ICs3MjksNjAgQEAKIH0KIAogdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgJGNsYXNzbmFtZSQ6OiRuYW1lJChpbnQgaW5kZXgpIGNvbnN0IHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5HZXQoaW5kZXgpO1xuIgorR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfaW5saW5lKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzKHZhcmlhYmxlc18pOworICB2YXJpYWJsZXNbImlubGluZSJdID0gaXNfaW5saW5lID8gImlubGluZSIgOiAiIjsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICIkaW5saW5lJCBjb25zdCA6OnN0ZDo6c3RyaW5nJiAkY2xhc3NuYW1lJDo6JG5hbWUkKGludCBpbmRleCkgY29uc3Qge1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6JGZ1bGxfbmFtZSQpXG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uJGNwcGdldCQoaW5kZXgpO1xuIgogICAgICJ9XG4iCi0gICAgImlubGluZSA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6bXV0YWJsZV8kbmFtZSQoaW50IGluZGV4KSB7XG4iCisgICAgIiRpbmxpbmUkIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTokZnVsbF9uYW1lJClcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXy5NdXRhYmxlKGluZGV4KTtcbiIKICAgICAifVxuIgotICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7XG4iCisgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkge1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIiAgJG5hbWUkXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTtcbiIKICAgICAifVxuIgotICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6c2V0XyRuYW1lJChpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7XG4iCisgICAgIiRpbmxpbmUkIHZvaWQgJGNsYXNzbmFtZSQ6OnNldF8kbmFtZSQoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgogICAgICIgICRuYW1lJF8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOiRmdWxsX25hbWUkKVxuIgogICAgICJ9XG4iCi0gICAgImlubGluZSB2b2lkICIKKyAgICAiJGlubGluZSQgdm9pZCAiCiAgICAgIiRjbGFzc25hbWUkOjpzZXRfJG5hbWUkIgogICAgICIoaW50IGluZGV4LCBjb25zdCAkcG9pbnRlcl90eXBlJCogdmFsdWUsIHNpemVfdCBzaXplKSB7XG4iCiAgICAgIiAgJG5hbWUkXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKFxuIgogICAgICIgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIn1cbiIKLSAgICAiaW5saW5lIDo6c3RkOjpzdHJpbmcqICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKCkge1xuIgorICAgICIkaW5saW5lJCA6OnN0ZDo6c3RyaW5nKiAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJCgpIHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF8uQWRkKCk7XG4iCiAgICAgIn1cbiIKLSAgICAiaW5saW5lIHZvaWQgJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHtcbiIKKyAgICAiJGlubGluZSQgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkge1xuIgogICAgICIgICRuYW1lJF8uQWRkKCktPmFzc2lnbih2YWx1ZSk7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDokZnVsbF9uYW1lJClcbiIKICAgICAifVxuIgotICAgICJpbmxpbmUgdm9pZCAkY2xhc3NuYW1lJDo6YWRkXyRuYW1lJChjb25zdCBjaGFyKiB2YWx1ZSkge1xuIgorICAgICIkaW5saW5lJCB2b2lkICRjbGFzc25hbWUkOjphZGRfJG5hbWUkKGNvbnN0IGNoYXIqIHZhbHVlKSB7XG4iCiAgICAgIiAgJG5hbWUkXy5BZGQoKS0+YXNzaWduKHZhbHVlKTtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIn1cbiIKLSAgICAiaW5saW5lIHZvaWQgIgorICAgICIkaW5saW5lJCB2b2lkICIKICAgICAiJGNsYXNzbmFtZSQ6OmFkZF8kbmFtZSQoY29uc3QgJHBvaW50ZXJfdHlwZSQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkge1xuIgogICAgICIgICRuYW1lJF8uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpO1xuIgorICAgICIgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjokZnVsbF9uYW1lJClcbiIKICAgICAifVxuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JlxuIgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXMsCisgICAgIiRpbmxpbmUkIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mXG4iCiAgICAgIiRjbGFzc25hbWUkOjokbmFtZSQoKSBjb25zdCB7XG4iCisgICAgIiAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6JGZ1bGxfbmFtZSQpXG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCiAgICAgIn1cbiIKLSAgICAiaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qXG4iCisgICAgIiRpbmxpbmUkIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qXG4iCiAgICAgIiRjbGFzc25hbWUkOjptdXRhYmxlXyRuYW1lJCgpIHtcbiIKKyAgICAiICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0OiRmdWxsX25hbWUkKVxuIgogICAgICIgIHJldHVybiAmJG5hbWUkXztcbiIKICAgICAifVxuIik7CiB9CkBAIC0zODEsNyArNzk5LDcgQEAKIAogdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfLlN3YXAoJm90aGVyLT4kbmFtZSRfKTtcbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJG5hbWUkXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT4kbmFtZSRfKTtcbiIpOwogfQogCiB2b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgpAQCAtMzk0LDEzICs4MTIsMTIgQEAKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkJGRlY2xhcmVkX3R5cGUkKFxuIgogICAgICIgICAgICBpbnB1dCwgdGhpcy0+YWRkXyRuYW1lJCgpKSk7XG4iKTsKLSAgaWYgKEhhc1V0ZjhWZXJpZmljYXRpb24oZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKLSAgICAgIGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhcbiIKLSAgICAgICIgIHRoaXMtPiRuYW1lJCh0aGlzLT4kbmFtZSRfc2l6ZSgpIC0gMSkuZGF0YSgpLFxuIgotICAgICAgIiAgdGhpcy0+JG5hbWUkKHRoaXMtPiRuYW1lJF9zaXplKCkgLSAxKS5sZW5ndGgoKSxcbiIKLSAgICAgICIgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTtcbiIpOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKAorICAgICAgICBkZXNjcmlwdG9yXywgb3B0aW9uc18sIHRydWUsIHZhcmlhYmxlc18sCisgICAgICAgICJ0aGlzLT4kbmFtZSQodGhpcy0+JG5hbWUkX3NpemUoKSAtIDEpLmRhdGEoKSxcbiIKKyAgICAgICAgInRoaXMtPiRuYW1lJCh0aGlzLT4kbmFtZSRfc2l6ZSgpIC0gMSkubGVuZ3RoKCksXG4iLAorICAgICAgICBwcmludGVyKTsKICAgfQogfQogCkBAIC00MDgsMTMgKzgyNSwxMyBAQAogR2VuZXJhdGVTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT4kbmFtZSRfc2l6ZSgpOyBpKyspIHtcbiIpOwotICBpZiAoSGFzVXRmOFZlcmlmaWNhdGlvbihkZXNjcmlwdG9yXy0+ZmlsZSgpKSAmJgotICAgICAgZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICI6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKFxuIgotICAgICAgIiAgdGhpcy0+JG5hbWUkKGkpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKGkpLmxlbmd0aCgpLFxuIgotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORykgeworICAgIEdlbmVyYXRlVXRmOENoZWNrQ29kZUZvclN0cmluZygKKyAgICAgICAgZGVzY3JpcHRvcl8sIG9wdGlvbnNfLCBmYWxzZSwgdmFyaWFibGVzXywKKyAgICAgICAgInRoaXMtPiRuYW1lJChpKS5kYXRhKCksIHRoaXMtPiRuYW1lJChpKS5sZW5ndGgoKSxcbiIsIHByaW50ZXIpOwogICB9CisgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGUkZGVjbGFyZWRfdHlwZSQoXG4iCiAgICAgIiAgICAkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKGkpLCBvdXRwdXQpO1xuIgpAQCAtNDI1LDEzICs4NDIsMTMgQEAKIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPiRuYW1lJF9zaXplKCk7IGkrKykge1xuIik7Ci0gIGlmIChIYXNVdGY4VmVyaWZpY2F0aW9uKGRlc2NyaXB0b3JfLT5maWxlKCkpICYmCi0gICAgICBkZXNjcmlwdG9yXy0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhcbiIKLSAgICAgICIgICAgdGhpcy0+JG5hbWUkKGkpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKGkpLmxlbmd0aCgpLFxuIgotICAgICAgIiAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpO1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBpZiAoZGVzY3JpcHRvcl8tPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7CisgICAgR2VuZXJhdGVVdGY4Q2hlY2tDb2RlRm9yU3RyaW5nKAorICAgICAgICBkZXNjcmlwdG9yXywgb3B0aW9uc18sIGZhbHNlLCB2YXJpYWJsZXNfLAorICAgICAgICAidGhpcy0+JG5hbWUkKGkpLmRhdGEoKSwgdGhpcy0+JG5hbWUkKGkpLmxlbmd0aCgpLFxuIiwgcHJpbnRlcik7CiAgIH0KKyAgcHJpbnRlci0+T3V0ZGVudCgpOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpcbiIKICAgICAiICAgIFdyaXRlJGRlY2xhcmVkX3R5cGUkVG9BcnJheSgkbnVtYmVyJCwgdGhpcy0+JG5hbWUkKGkpLCB0YXJnZXQpO1xuIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfc3RyaW5nX2ZpZWxkLmgKaW5kZXggN2Y0NTEwNy4uY2I0ZTg3NyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF9zdHJpbmdfZmllbGQuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3N0cmluZ19maWVsZC5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00Niw0MCArNDYsNjggQEAKIAogY2xhc3MgU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKICAgflN0cmluZ0ZpZWxkR2VuZXJhdG9yKCk7CiAKICAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgdm9pZCBHZW5lcmF0ZVByaXZhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVN0YXRpY01lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVOb25JbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUNsZWFyaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTd2FwcGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQ29uc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZURlc3RydWN0b3JDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZURlZmF1bHRJbnN0YW5jZUFsbG9jYXRvcihpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTaHV0ZG93bkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQnl0ZVNpemUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogCi0gcHJpdmF0ZToKKyBwcm90ZWN0ZWQ6CiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKIAorIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdGaWVsZEdlbmVyYXRvcik7CiB9OwogCitjbGFzcyBTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIFN0cmluZ0ZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIFN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9wdGlvbnMmIG9wdGlvbnMpOworICB+U3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUNvbnN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVEZXN0cnVjdG9yQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBib29sIGRlcGVuZGVudF9maWVsZF87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKTsKK307CisKIGNsYXNzIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKICAgflJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoKTsKIAogICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICB2b2lkIEdlbmVyYXRlUHJpdmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQWNjZXNzb3JEZWNsYXJhdGlvbnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwotICB2b2lkIEdlbmVyYXRlSW5saW5lQWNjZXNzb3JEZWZpbml0aW9ucyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVJbmxpbmVBY2Nlc3NvckRlZmluaXRpb25zKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX2lubGluZSkgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVDbGVhcmluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlU3dhcHBpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnByb3RvCmluZGV4IDU0ZDgzMGYuLjRlMjViMmUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9iYWRfaWRlbnRpZmllcnMucHJvdG8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF90ZXN0X2JhZF9pZGVudGlmaWVycy5wcm90bwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsNiArMzUsNyBAQAogLy8gVGhpcyBmaWxlIHRlc3RzIHRoYXQgdmFyaW91cyBpZGVudGlmaWVycyB3b3JrIGFzIGZpZWxkIGFuZCB0eXBlIG5hbWVzIGV2ZW4KIC8vIHRob3VnaCB0aGUgc2FtZSBpZGVudGlmaWVycyBhcmUgdXNlZCBpbnRlcm5hbGx5IGJ5IHRoZSBDKysgY29kZSBnZW5lcmF0b3IuCiAKK3N5bnRheCA9ICJwcm90bzIiOwogCiAvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCiAvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdApAQCAtNTgsNyArNTksNyBAQAogICBvcHRpb25hbCBpbnQzMiB0b3RhbF9zaXplID0gNjsKICAgb3B0aW9uYWwgaW50MzIgdGFnID0gNzsKIAotICBlbnVtIFRlc3RFbnVtIHsgRk9PID0gMTsgfQorICBlbnVtIFRlc3RFbnVtIHsgRk9PID0gMDsgfQogICBtZXNzYWdlIERhdGExIHsgcmVwZWF0ZWQgaW50MzIgZGF0YSA9IDE7IH0KICAgbWVzc2FnZSBEYXRhMiB7IHJlcGVhdGVkIFRlc3RFbnVtIGRhdGEgPSAxOyB9CiAgIG1lc3NhZ2UgRGF0YTMgeyByZXBlYXRlZCBzdHJpbmcgZGF0YSA9IDE7IH0KQEAgLTk4LDE0ICs5OSw1NiBAQAogICAvLyBTb21lIGtleXdvcmRzLgogICBvcHRpb25hbCB1aW50MzIgaW50ID0gMzA7CiAgIG9wdGlvbmFsIHVpbnQzMiBmcmllbmQgPSAzMTsKKyAgb3B0aW9uYWwgdWludDMyIGNsYXNzID0gMzc7CisgIG9wdGlvbmFsIHVpbnQzMiB0eXBlZGVjbCA9IDM5OworICBvcHRpb25hbCB1aW50MzIgYXV0byA9IDQwOwogCiAgIC8vIFRoZSBnZW5lcmF0b3IgdXNlZCB0byAjZGVmaW5lIGEgbWFjcm8gY2FsbGVkICJETyIgaW5zaWRlIHRoZSAuY2MgZmlsZS4KICAgbWVzc2FnZSBETyB7fQogICBvcHRpb25hbCBETyBkbyA9IDMyOwogCi0gIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisgIC8vIFNvbWUgdGVtcGxhdGUgcGFyYW1ldGVyIG5hbWVzIGZvciBleHRlbnNpb25zLgorICBvcHRpb25hbCBpbnQzMiBmaWVsZF90eXBlID0gMzM7CisgIG9wdGlvbmFsIGJvb2wgaXNfcGFja2VkID0gMzQ7CisKKyAgLy8gdGVzdCBjb25mbGljdGluZyByZWxlYXNlXyRuYW1lJC4gImxlbmd0aCIgYW5kICJkbyIgZmllbGQgaW4gdGhpcyBtZXNzYWdlCisgIC8vIG11c3QgcmVtYWluIHN0cmluZyBvciBtZXNzYWdlIGZpZWxkcyB0byBtYWtlIHRoZSB0ZXN0IHZhbGlkLgorICBvcHRpb25hbCBzdHJpbmcgcmVsZWFzZV9sZW5ndGggPSAzNTsKKyAgLy8gQSBtb3JlIGV4dHJlbWUgY2FzZSwgdGhlIGZpZWxkIG5hbWUgImRvIiBoZXJlIGlzIGEga2V5d29yZCwgd2hpY2ggd2lsbCBiZQorICAvLyBlc2NhcGVkIHRvICJkb18iIGFscmVhZHkuIFRlc3QgdGhlcmUgaXMgbm8gY29uZmxpY3QgZXZlbiB3aXRoIGVzY2FwZWQgZmllbGQKKyAgLy8gbmFtZXMuCisgIG9wdGlvbmFsIERPIHJlbGVhc2VfZG8gPSAzNjsKKworICAvLyBGb3IgY2xhc2hpbmcgbG9jYWwgdmFyaWFibGVzIGluIFNlcmlhbGl6ZSBhbmQgQnl0ZVNpemUgY2FsY3VsYXRpb24uCisgIG9wdGlvbmFsIHN0cmluZyB0YXJnZXQgPSAzODsKKworICBleHRlbnNpb25zIDEwMDAgdG8gbWF4OyAgLy8gTk9fUFJPVE8zCiB9CiAKK21lc3NhZ2UgVGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXNFeHRlbnNpb24geyAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgIGV4dGVuZCBUZXN0Q29uZmxpY3RpbmdTeW1ib2xOYW1lcyB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMworICAgIHJlcGVhdGVkIGludDMyIHJlcGVhdGVkX2ludDMyX2V4dCA9IDIwNDIzNjM4IFtwYWNrZWQ9dHJ1ZV07ICAvLyBOT19QUk9UTzMKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMworCittZXNzYWdlIFRlc3RDb25mbGljdGluZ0VudW1OYW1lcyB7ICAvLyBOT19QUk9UTzMKKyAgZW51bSBOZXN0ZWRDb25mbGljdGluZ0VudW0geyAgICAgIC8vIE5PX1BST1RPMworICAgIGFuZCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgICAgY2xhc3MgPSAyOyAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKKyAgICBpbnQgPSAzOyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMworICAgIHR5cGVkZWYgPSA0OyAgICAgICAgICAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgICAgWE9SID0gNTsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzMKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5PX1BST1RPMworCisgIG9wdGlvbmFsIE5lc3RlZENvbmZsaWN0aW5nRW51bSBjb25mbGljdGluZ19lbnVtID0gMTsgIC8vIE5PX1BST1RPMworfSAgLy8gTk9fUFJPVE8zCisKK2VudW0gQ29uZmxpY3RpbmdFbnVtIHsgIC8vIE5PX1BST1RPMworICBOT1RfRVEgPSAxOyAgICAgICAgICAgLy8gTk9fUFJPVE8zCisgIHZvbGF0aWxlID0gMjsgICAgICAgICAvLyBOT19QUk9UTzMKKyAgcmV0dXJuID0gMzsgICAgICAgICAgIC8vIE5PX1BST1RPMworfSAgLy8gTk9fUFJPVE8zCisKIG1lc3NhZ2UgRHVtbXlNZXNzYWdlIHt9CiAKIHNlcnZpY2UgVGVzdENvbmZsaWN0aW5nTWV0aG9kTmFtZXMgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdGVzdF9sYXJnZV9lbnVtX3ZhbHVlLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfbGFyZ2VfZW51bV92YWx1ZS5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuY2MKaW5kZXggMzAxYTdjZS4uNWQ4Mjk0NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3BwL2NwcF91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00NCwxMyArNDQsMjUgQEAKIC8vIGNvcnJlY3RseSBhbmQgcHJvZHVjZXMgdGhlIGludGVyZmFjZXMgd2UgZXhwZWN0LCB3aGljaCBpcyB3aHkgdGhpcyB0ZXN0CiAvLyBpcyB3cml0dGVuIHRoaXMgd2F5LgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuaD4KKworI2luY2x1ZGUgPG1lbW9yeT4KKyNpZm5kZWYgX1NIQVJFRF9QVFJfSAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+CisjZW5kaWYKICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wYi5oPgorI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9DTUFLRV9CVUlMRCkgJiYgIWRlZmluZWQoX01TQ19WRVIpCisvLyBXZSBleGNsdWRlIHRoaXMgbGFyZ2UgcHJvdG8gZnJvbSBjbWFrZSBidWlsZCBiZWNhdXNlIGl0J3MgdG9vIGxhcmdlIGZvcgorLy8gdmlzdWFsIHN0dWRpbyB0byBjb21waWxlIChyZXBvcnQgaW50ZXJuYWwgZXJyb3JzKS4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wYi5oPgorI2VuZGlmCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfaGVscGVycy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3Rlc3RfYmFkX2lkZW50aWZpZXJzLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgpAQCAtNTksMTIgKzcxLDE0IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmg+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CkBAIC03NCw2ICs4OCw4IEBACiAvLyBDYW4ndCB1c2UgYW4gYW5vbnltb3VzIG5hbWVzcGFjZSBoZXJlIGR1ZSB0byBicm9rZW5uZXNzIG9mIFRydTY0IGNvbXBpbGVyLgogbmFtZXNwYWNlIGNwcF91bml0dGVzdCB7CiAKK25hbWVzcGFjZSBwcm90b2J1Zl91bml0dGVzdCA9IDo6cHJvdG9idWZfdW5pdHRlc3Q7CisKIAogY2xhc3MgTW9ja0Vycm9yQ29sbGVjdG9yIDogcHVibGljIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yIHsKICBwdWJsaWM6CkBAIC0xMjEsNiArMTM3LDE5IEBACiAgICAgICAgICAgICBnZW5lcmF0ZWRfZGVjc3JpcHRvcl9wcm90by5EZWJ1Z1N0cmluZygpKTsKIH0KIAorI2lmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9DTUFLRV9CVUlMRCkgJiYgIWRlZmluZWQoX01TQ19WRVIpCisvLyBUZXN0IHRoYXQgZ2VuZXJhdGVkIGNvZGUgaGFzIHByb3BlciBkZXNjcmlwdG9yczoKKy8vIFRvdWNoIGEgZGVzY3JpcHRvciBnZW5lcmF0ZWQgZnJvbSBhbiBlbm9ybW91cyBtZXNzYWdlIHRvIHZhbGlkYXRlIHNwZWNpYWwKKy8vIGhhbmRsaW5nIGZvciBkZXNjcmlwdG9ycyBleGNlZWRpbmcgdGhlIEMrKyBzdGFuZGFyZCdzIHJlY29tbWVuZGVkIG1pbmltdW0KKy8vIGxpbWl0IGZvciBzdHJpbmcgbGl0ZXJhbCBzaXplCitURVNUKEdlbmVyYXRlZERlc2NyaXB0b3JUZXN0LCBFbm9ybW91c0Rlc2NyaXB0b3IpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZ2VuZXJhdGVkX2Rlc2NyaXB0b3IgPQorICAgIFRlc3RFbm9ybW91c0Rlc2NyaXB0b3I6OmRlc2NyaXB0b3IoKTsKKworICBFWFBFQ1RfVFJVRShnZW5lcmF0ZWRfZGVzY3JpcHRvciAhPSBOVUxMKTsKK30KKyNlbmRpZgorCiAjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KQEAgLTE0NCw2ICsxNzMsMjEgQEAKICAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlKCkpOwogfQogCisjaWZuZGVmIFBST1RPQlVGX1VTRV9ETExTCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBJbnQzMlN0cmluZ0NvbnZlcnNpb24pIHsKKyAgRVhQRUNUX0VRKCI5NzEiLCBJbnQzMlRvU3RyaW5nKDk3MSkpOworICBFWFBFQ1RfRVEoIih+MHg3ZmZmZmZmZikiLCBJbnQzMlRvU3RyaW5nKGtpbnQzMm1pbikpOworICBFWFBFQ1RfRVEoIjIxNDc0ODM2NDciLCBJbnQzMlRvU3RyaW5nKGtpbnQzMm1heCkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBJbnQ2NFN0cmluZ0NvbnZlcnNpb24pIHsKKyAgRVhQRUNUX0VRKCJHT09HTEVfTE9OR0xPTkcoOTcxKSIsIEludDY0VG9TdHJpbmcoOTcxKSk7CisgIEVYUEVDVF9FUSgiR09PR0xFX0xPTkdMT05HKC0yMTQ3NDgzNjQ4KSIsIEludDY0VG9TdHJpbmcoa2ludDMybWluKSk7CisgIEVYUEVDVF9FUSgiR09PR0xFX0xPTkdMT05HKH4weDdmZmZmZmZmZmZmZmZmZmYpIiwgSW50NjRUb1N0cmluZyhraW50NjRtaW4pKTsKKyAgRVhQRUNUX0VRKCJHT09HTEVfTE9OR0xPTkcoOTIyMzM3MjAzNjg1NDc3NTgwNykiLCBJbnQ2NFRvU3RyaW5nKGtpbnQ2NG1heCkpOworfQorI2VuZGlmICAvLyAhUFJPVE9CVUZfVVNFX0RMTFMKKwogVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgRmxvYXRpbmdQb2ludERlZmF1bHRzKSB7CiAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0RXh0cmVtZURlZmF1bHRWYWx1ZXMmIGV4dHJlbWVfZGVmYXVsdCA9CiAgICAgICB1bml0dGVzdDo6VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzOjpkZWZhdWx0X2luc3RhbmNlKCk7CkBAIC0xNzQsNiArMjE4LDE1IEBACiAgIEVYUEVDVF9FUSgiPyA/ID8/ID8/ID8/PyA/XD8vID9cPy0iLCBleHRyZW1lX2RlZmF1bHQuY3BwX3RyaWdyYXBoKCkpOwogfQogCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBFeHRyZW1lU21hbGxJbnRlZ2VyRGVmYXVsdCkgeworICBjb25zdCB1bml0dGVzdDo6VGVzdEV4dHJlbWVEZWZhdWx0VmFsdWVzJiBleHRyZW1lX2RlZmF1bHQgPQorICAgICAgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlczo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICBFWFBFQ1RfRVEofjB4N2ZmZmZmZmYsIGtpbnQzMm1pbik7CisgIEVYUEVDVF9FUShHT09HTEVfTE9OR0xPTkcofjB4N2ZmZmZmZmZmZmZmZmZmZiksIGtpbnQ2NG1pbik7CisgIEVYUEVDVF9FUShraW50MzJtaW4sIGV4dHJlbWVfZGVmYXVsdC5yZWFsbHlfc21hbGxfaW50MzIoKSk7CisgIEVYUEVDVF9FUShraW50NjRtaW4sIGV4dHJlbWVfZGVmYXVsdC5yZWFsbHlfc21hbGxfaW50NjQoKSk7Cit9CisKIFRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIEFjY2Vzc29ycykgewogICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUgdGhlbiBnbyBiYWNrIGFuZCBjaGVjayBhbGwgdGhvc2UKICAgLy8gdmFsdWVzLgpAQCAtMjAyLDYgKzI1NSwxMyBAQAogICBFWFBFQ1RfRVEoImhlbGxvIiwgKm1lc3NhZ2UubXV0YWJsZV9kZWZhdWx0X3N0cmluZygpKTsKIH0KIAorVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU3RyaW5nRGVmYXVsdHMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RFeHRyZW1lRGVmYXVsdFZhbHVlcyBtZXNzYWdlOworICAvLyBDaGVjayBpZiAnXDAwMCcgY2FuIGJlIHVzZWQgaW4gZGVmYXVsdCBzdHJpbmcgdmFsdWUuCisgIEVYUEVDVF9FUShzdHJpbmcoImhlbFwwMDBsbyIsIDYpLCBtZXNzYWdlLnN0cmluZ193aXRoX3plcm8oKSk7CisgIEVYUEVDVF9FUShzdHJpbmcoIndvclwwMDBsZCIsIDYpLCBtZXNzYWdlLmJ5dGVzX3dpdGhfemVybygpKTsKK30KKwogVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgUmVsZWFzZVN0cmluZykgewogICAvLyBDaGVjayB0aGF0IHJlbGVhc2VfZm9vKCkgc3RhcnRzIG91dCBOVUxMLCBhbmQgZ2l2ZXMgdXMgYSB2YWx1ZQogICAvLyB0aGF0IHdlIGNhbiBkZWxldGUgYWZ0ZXIgaXQncyBiZWVuIHNldC4KQEAgLTIxMywxMSArMjczLDEwIEBACiAKICAgbWVzc2FnZS5zZXRfZGVmYXVsdF9zdHJpbmcoImJsYWgiKTsKICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7Ci0gIHN0cmluZyogc3RyID0gbWVzc2FnZS5yZWxlYXNlX2RlZmF1bHRfc3RyaW5nKCk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8c3RyaW5nPiBzdHIobWVzc2FnZS5yZWxlYXNlX2RlZmF1bHRfc3RyaW5nKCkpOwogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZGVmYXVsdF9zdHJpbmcoKSk7CiAgIEFTU0VSVF9UUlVFKHN0ciAhPSBOVUxMKTsKICAgRVhQRUNUX0VRKCJibGFoIiwgKnN0cik7Ci0gIGRlbGV0ZSBzdHI7CiAKICAgRVhQRUNUX0VRKE5VTEwsIG1lc3NhZ2UucmVsZWFzZV9kZWZhdWx0X3N0cmluZygpKTsKICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2RlZmF1bHRfc3RyaW5nKCkpOwpAQCAtMjMzLDE3ICsyOTIsNTkgQEAKICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOwogCiAgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMSk7Ci0gIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3QgPQotICAgICAgbWVzc2FnZS5yZWxlYXNlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZT4gbmVzdCgKKyAgICAgIG1lc3NhZ2UucmVsZWFzZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOwogICBBU1NFUlRfVFJVRShuZXN0ICE9IE5VTEwpOwogICBFWFBFQ1RfRVEoMSwgbmVzdC0+YmIoKSk7Ci0gIGRlbGV0ZSBuZXN0OwogCiAgIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2Vfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UoKSk7CiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKIH0KIAorVEVTVChHZW5lcmF0ZWRNZXNzYWdlVGVzdCwgU2V0QWxsb2NhdGVkU3RyaW5nKSB7CisgIC8vIENoZWNrIHRoYXQgc2V0X2FsbG9jYXRlZF9mb28oKSB3b3JrcyBmb3Igc3RyaW5ncy4KKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7CisgIGNvbnN0IHN0cmluZyBrSGVsbG8oImhlbGxvIik7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3N0cmluZyhrSGVsbG8pOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfYWxsb2NhdGVkX29wdGlvbmFsX3N0cmluZyhOVUxMKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCIiLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZygpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfc3RyaW5nKG5ldyBzdHJpbmcoa0hlbGxvKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKGtIZWxsbywgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFNldEFsbG9jYXRlZE1lc3NhZ2UpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXRfYWxsb2NhdGVkX2ZvbygpIGNhbiBiZSBjYWxsZWQgaW4gYWxsIGNhc2VzLgorICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworCisgIG1lc3NhZ2Uuc2V0X2FsbG9jYXRlZF9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZShOVUxMKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoJnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoMSk7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UqIG5lc3QgPQorICAgICAgbWVzc2FnZS5yZWxlYXNlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIEFTU0VSVF9UUlVFKG5lc3QgIT0gTlVMTCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UobmVzdCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpLmJiKCkpOworfQorCiBURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBDbGVhcikgewogICAvLyBTZXQgZXZlcnkgZmllbGQgdG8gYSB1bmlxdWUgdmFsdWUsIGNsZWFyIHRoZSBtZXNzYWdlLCB0aGVuIGNoZWNrIHRoYXQKICAgLy8gaXQgaXMgY2xlYXJlZC4KQEAgLTQzMCw2ICs1MzEsOCBAQAogICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKIH0KIAorI2lmICFkZWZpbmVkKFBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMpIHx8IFwKKyAgICAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfTk9fUlRUSSkKIFRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFVwY2FzdENvcHlGcm9tKSB7CiAgIC8vIFRlc3QgdGhlIENvcHlGcm9tIG1ldGhvZCB0aGF0IHRha2VzIGluIHRoZSBnZW5lcmljIGNvbnN0IE1lc3NhZ2UmCiAgIC8vIHBhcmFtZXRlci4KQEAgLTQ0Miw2ICs1NDUsNyBAQAogCiAgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTIpOwogfQorI2VuZGlmCiAKICNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwogCkBAIC00NTIsNyArNTU2LDcgQEAKIAogICAvLyBDb25zdHJ1Y3QgYSBuZXcgdmVyc2lvbiBvZiB0aGUgZHluYW1pYyBtZXNzYWdlIHZpYSB0aGUgZmFjdG9yeS4KICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7Ci0gIHNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZTE7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZTE7CiAgIG1lc3NhZ2UxLnJlc2V0KGZhY3RvcnkuR2V0UHJvdG90eXBlKAogICAgICAgICAgICAgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKS0+TmV3KCkpOwogCkBAIC00OTMsMTYgKzU5NywxOSBAQAogICBUZXN0VXRpbDo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UxKTsKIH0KIAotI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUCisjaWYgIWRlZmluZWQoUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUykgfHwgXAorICAgICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJKQorI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCiAKIFRFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIE1lcmdlRnJvbVNlbGYpIHsKICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwotICBFWFBFQ1RfREVBVEgobWVzc2FnZS5NZXJnZUZyb20obWVzc2FnZSksICImZnJvbSIpOworICBFWFBFQ1RfREVBVEgobWVzc2FnZS5NZXJnZUZyb20obWVzc2FnZSksICJDaGVjayBmYWlsZWQ6LipwYlsuXWNjIik7CiAgIEVYUEVDVF9ERUFUSChtZXNzYWdlLk1lcmdlRnJvbShpbXBsaWNpdF9jYXN0PGNvbnN0IE1lc3NhZ2UmPihtZXNzYWdlKSksCi0gICAgICAgICAgICAgICAiJmZyb20iKTsKKyAgICAgICAgICAgICAgICJDaGVjayBmYWlsZWQ6LipwYlsuXWNjIik7CiB9CiAKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMgfHwgIUdPT0dMRV9QUk9UT0JVRl9OT19SVFRJCiAKIC8vIFRlc3QgdGhlIGdlbmVyYXRlZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KCksCiBURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBTZXJpYWxpemF0aW9uVG9BcnJheSkgewpAQCAtNjk1LDYgKzgwMiwzMSBAQAogCiAgIG1lc3NhZ2Uuc2V0X2ZyaWVuZF8oNSk7CiAgIEVYUEVDVF9FUSg1LCBtZXNzYWdlLmZyaWVuZF8oKSk7CisKKyAgbWVzc2FnZS5zZXRfY2xhc3NfKDYpOworICBFWFBFQ1RfRVEoNiwgbWVzc2FnZS5jbGFzc18oKSk7CisKKyAgLy8gSW5zdGFudGlhdGUgZXh0ZW5zaW9uIHRlbXBsYXRlIGZ1bmN0aW9ucyB0byB0ZXN0IGNvbmZsaWN0aW5nIHRlbXBsYXRlCisgIC8vIHBhcmFtZXRlciBuYW1lcy4KKyAgdHlwZWRlZiBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nU3ltYm9sTmFtZXNFeHRlbnNpb24gRXh0ZW5zaW9uTWVzc2FnZTsKKyAgbWVzc2FnZS5BZGRFeHRlbnNpb24oRXh0ZW5zaW9uTWVzc2FnZTo6cmVwZWF0ZWRfaW50MzJfZXh0LCAxMjMpOworICBFWFBFQ1RfRVEoMTIzLAorICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24oRXh0ZW5zaW9uTWVzc2FnZTo6cmVwZWF0ZWRfaW50MzJfZXh0LCAwKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFRlc3RDb25mbGljdGluZ0VudW1OYW1lcykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdENvbmZsaWN0aW5nRW51bU5hbWVzIG1lc3NhZ2U7CisgIG1lc3NhZ2Uuc2V0X2NvbmZsaWN0aW5nX2VudW0ocHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RDb25mbGljdGluZ0VudW1OYW1lc19OZXN0ZWRDb25mbGljdGluZ0VudW1fYW5kXyk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLmNvbmZsaWN0aW5nX2VudW0oKSk7CisgIG1lc3NhZ2Uuc2V0X2NvbmZsaWN0aW5nX2VudW0ocHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RDb25mbGljdGluZ0VudW1OYW1lc19OZXN0ZWRDb25mbGljdGluZ0VudW1fWE9SKTsKKyAgRVhQRUNUX0VRKDUsIG1lc3NhZ2UuY29uZmxpY3RpbmdfZW51bSgpKTsKKworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpDb25mbGljdGluZ0VudW0gY29uZmxpY3RpbmdfZW51bTsKKyAgY29uZmxpY3RpbmdfZW51bSA9IHByb3RvYnVmX3VuaXR0ZXN0OjpOT1RfRVE7CisgIEVYUEVDVF9FUSgxLCBjb25mbGljdGluZ19lbnVtKTsKKyAgY29uZmxpY3RpbmdfZW51bSA9IHByb3RvYnVmX3VuaXR0ZXN0OjpyZXR1cm5fOworICBFWFBFQ1RfRVEoMywgY29uZmxpY3RpbmdfZW51bSk7CiB9CiAKICNpZm5kZWYgUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwpAQCAtNzY2LDYgKzg5OCw0MCBAQAogICAgICAgICAgICAgbWVzc2FnZTEuU3BhY2VVc2VkKCkpOwogfQogCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VUZXN0LCBUZXN0T25lb2ZTcGFjZVVzZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTE7CisgIEVYUEVDVF9MRShzaXplb2YodW5pdHRlc3Q6OlRlc3RPbmVvZjIpLCBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7CisKKyAgY29uc3QgaW50IGVtcHR5X21lc3NhZ2Vfc2l6ZSA9IG1lc3NhZ2UxLlNwYWNlVXNlZCgpOworICAvLyBTZXR0aW5nIHByaW1pdGl2ZSB0eXBlcyBzaG91bGRuJ3QgYWZmZWN0IHRoZSBzcGFjZSB1c2VkLgorICBtZXNzYWdlMS5zZXRfZm9vX2ludCgxMjMpOworICBtZXNzYWdlMS5zZXRfYmFyX2ludCgxMjM0NSk7CisgIEVYUEVDVF9FUShlbXB0eV9tZXNzYWdlX3NpemUsIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKKworICAvLyBTZXR0aW5nIGEgc3RyaW5nIGluIG9uZW9mIHRvIGEgc21hbGwgdmFsdWUgc2hvdWxkIG9ubHkgaW5jcmVhc2UgU3BhY2VVc2VkKCkKKyAgLy8gYnkgdGhlIHNpemUgb2YgYSBzdHJpbmcgb2JqZWN0LgorICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZygiYWJjIik7CisgIEVYUEVDVF9MRShlbXB0eV9tZXNzYWdlX3NpemUgKyBzaXplb2Yoc3RyaW5nKSwgbWVzc2FnZTEuU3BhY2VVc2VkKCkpOworCisgIC8vIFNldHRpbmcgYSBzdHJpbmcgaW4gb25lb2YgdG8gYSB2YWx1ZSBsYXJnZXIgdGhhbiB0aGUgc3RyaW5nIG9iamVjdCBpdHNlbGYKKyAgLy8gc2hvdWxkIGluY3JlYXNlIFNwYWNlVXNlZCgpLCBiZWNhdXNlIGl0IGNhbm5vdCBzdG9yZSB0aGUgdmFsdWUgaW50ZXJuYWxseS4KKyAgbWVzc2FnZTEuc2V0X2Zvb19zdHJpbmcoc3RyaW5nKHNpemVvZihzdHJpbmcpICsgMSwgJ3gnKSk7CisgIGludCBtaW5fZXhwZWN0ZWRfaW5jcmVhc2UgPSBtZXNzYWdlMS5mb29fc3RyaW5nKCkuY2FwYWNpdHkoKSArCisgICAgICBzaXplb2Yoc3RyaW5nKTsKKyAgRVhQRUNUX0xFKGVtcHR5X21lc3NhZ2Vfc2l6ZSArIG1pbl9leHBlY3RlZF9pbmNyZWFzZSwKKyAgICAgICAgICAgIG1lc3NhZ2UxLlNwYWNlVXNlZCgpKTsKKworICAvLyBTZXR0aW5nIGEgbWVzc2FnZSBpbiBvbmVvZiBzaG91bGQgZGVsZXRlIHRoZSBvdGhlciBmaWVsZHMgYW5kIGluY3JlYXNlIHRoZQorICAvLyBzaXplIGJ5IHRoZSBzaXplIG9mIHRoZSBuZXN0ZWQgbWVzc2FnZSB0eXBlLiBOZXN0ZWRNZXNzYWdlIGlzIHNpbXBsZSBlbm91Z2gKKyAgLy8gdGhhdCBpdCBpcyBlcXVhbCB0byBzaXplb2YoTmVzdGVkTWVzc2FnZSkKKyAgbWVzc2FnZTEubXV0YWJsZV9mb29fbWVzc2FnZSgpOworICBBU1NFUlRfRVEoc2l6ZW9mKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpOZXN0ZWRNZXNzYWdlKSwKKyAgICAgICAgICAgIG1lc3NhZ2UxLmZvb19tZXNzYWdlKCkuU3BhY2VVc2VkKCkpOworICBFWFBFQ1RfRVEoZW1wdHlfbWVzc2FnZV9zaXplICsKKyAgICAgICAgICAgIHNpemVvZih1bml0dGVzdDo6VGVzdE9uZW9mMjo6TmVzdGVkTWVzc2FnZSksCisgICAgICAgICAgICBtZXNzYWdlMS5TcGFjZVVzZWQoKSk7Cit9CisKICNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKIAogCkBAIC03OTUsNiArOTYxLDIyIEBACiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6a1JlcGVhdGVkTmVzdGVkRW51bUV4dGVuc2lvbkZpZWxkTnVtYmVyLCA1MSk7CiB9CiAKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVRlc3QsIFBhcnNlRnJvbVRydW5jYXRlZCkgeworICBjb25zdCBzdHJpbmcgbG9uZ19zdHJpbmcgPSBzdHJpbmcoMTI4LCAncScpOworICBGaWxlRGVzY3JpcHRvclByb3RvIHA7CisgIHAuYWRkX2V4dGVuc2lvbigpLT5zZXRfbmFtZShsb25nX3N0cmluZyk7CisgIGNvbnN0IHN0cmluZyBtc2cgPSBwLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgIGludCBzdWNjZXNzZnVsX2NvdW50ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPD0gbXNnLnNpemUoKTsgaSsrKSB7CisgICAgaWYgKHAuUGFyc2VGcm9tQXJyYXkobXNnLmNfc3RyKCksIGkpKSB7CisgICAgICArK3N1Y2Nlc3NmdWxfY291bnQ7CisgICAgfQorICB9CisgIC8vIFdlIGRvbid0IHJlYWxseSBjYXJlIGFib3V0IGhvdyBvZnRlbiB3ZSBzdWNjZWVkZWQuCisgIC8vIEFzIGxvbmcgYXMgd2UgZGlkbid0IGNyYXNoLCB3ZSdyZSBoYXBweS4KKyAgRVhQRUNUX0dFKHN1Y2Nlc3NmdWxfY291bnQsIDEpOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIFRFU1QoR2VuZXJhdGVkRW51bVRlc3QsIEVudW1WYWx1ZXNBc1N3aXRjaENhc2VzKSB7CkBAIC04MTMsNiArOTk1LDkgQEAKICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWjoKICAgICAgIGkgPSAzOwogICAgICAgYnJlYWs7CisgICAgY2FzZSB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpORUc6CisgICAgICBpID0gLTE7CisgICAgICBicmVhazsKICAgICAvLyBubyBkZWZhdWx0IGNhc2U6ICBXZSB3YW50IHRvIG1ha2Ugc3VyZSB0aGUgY29tcGlsZXIgcmVjb2duaXplcyB0aGF0CiAgICAgLy8gICBhbGwgY2FzZXMgYXJlIGNvdmVyZWQuICAoR0NDIHdhcm5zIGlmIHlvdSBkbyBub3QgY292ZXIgYWxsIGNhc2VzIG9mCiAgICAgLy8gICBhbiBlbnVtIGluIGEgc3dpdGNoLikKQEAgLTg0MSw3ICsxMDI2LDcgQEAKIH0KIAogVEVTVChHZW5lcmF0ZWRFbnVtVGVzdCwgTWluQW5kTWF4KSB7Ci0gIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sCisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpORUcsCiAgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTik7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosCiAgICAgICAgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01BWCk7CkBAIC04NjksMTEgKzEwNTQsMTAgQEAKICAgRVhQRUNUX05FKG51bGxfcG9pbnRlciwgJnVuaXR0ZXN0OjpGb3JlaWduRW51bV9NQVgpOwogICBFWFBFQ1RfTkUobnVsbF9wb2ludGVyLCAmdW5pdHRlc3Q6OkZvcmVpZ25FbnVtX0FSUkFZU0laRSk7CiAKLSAgLy8gTWFrZSBzdXJlIHdlIGNhbiB1c2UgX01JTiwgX01BWCBhbmQgX0FSUkFZU0laRSBhcyBzd2l0Y2ggY2FzZXMuCisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gdXNlIF9NSU4gYW5kIF9NQVggYXMgc3dpdGNoIGNhc2VzLgogICBzd2l0Y2ggKHVuaXR0ZXN0OjpTUEFSU0VfQSkgewogICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RTcGFyc2VFbnVtX01JTjoKICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bV9NQVg6Ci0gICAgY2FzZSB1bml0dGVzdDo6VGVzdFNwYXJzZUVudW1fQVJSQVlTSVpFOgogICAgICAgYnJlYWs7CiAgICAgZGVmYXVsdDoKICAgICAgIGJyZWFrOwpAQCAtOTE2LDYgKzExMDAsMjAgQEAKICAgICAgICAgICAgIEdldEVudW1EZXNjcmlwdG9yPHVuaXR0ZXN0OjpUZXN0U3BhcnNlRW51bT4oKSk7CiB9CiAKK2VudW0gTm9uUHJvdG9FbnVtIHsKKyAga0ZvbyA9IDEsCit9OworCitURVNUKEdlbmVyYXRlZEVudW1UZXN0LCBJc1Byb3RvRW51bVR5cGVUcmFpdCkgeworICBFWFBFQ1RfVFJVRShpc19wcm90b19lbnVtPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW0+Ojp2YWx1ZSk7CisgIEVYUEVDVF9UUlVFKGlzX3Byb3RvX2VudW08dW5pdHRlc3Q6OkZvcmVpZ25FbnVtPjo6dmFsdWUpOworICBFWFBFQ1RfVFJVRShpc19wcm90b19lbnVtPHVuaXR0ZXN0OjpUZXN0RW51bVdpdGhEdXBWYWx1ZT46OnZhbHVlKTsKKyAgRVhQRUNUX1RSVUUoaXNfcHJvdG9fZW51bTx1bml0dGVzdDo6VGVzdFNwYXJzZUVudW0+Ojp2YWx1ZSk7CisKKyAgRVhQRUNUX0ZBTFNFKGlzX3Byb3RvX2VudW08aW50Pjo6dmFsdWUpOworICBFWFBFQ1RfRkFMU0UoaXNfcHJvdG9fZW51bTxOb25Qcm90b0VudW0+Ojp2YWx1ZSk7Cit9CisKICNlbmRpZiAgLy8gUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC0xMDU0LDcgKzEyNTIsNyBAQAogICAgICAgZm9vXyhkZXNjcmlwdG9yXy0+RmluZE1ldGhvZEJ5TmFtZSgiRm9vIikpLAogICAgICAgYmFyXyhkZXNjcmlwdG9yXy0+RmluZE1ldGhvZEJ5TmFtZSgiQmFyIikpLAogICAgICAgc3R1Yl8oJm1vY2tfY2hhbm5lbF8pLAotICAgICAgZG9uZV8oTmV3UGVybWFuZW50Q2FsbGJhY2soJkRvTm90aGluZykpIHt9CisgICAgICBkb25lXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpOZXdQZXJtYW5lbnRDYWxsYmFjaygmRG9Ob3RoaW5nKSkge30KIAogICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CiAgICAgQVNTRVJUX1RSVUUoZm9vXyAhPSBOVUxMKTsKQEAgLTEwNzYsNyArMTI3NCw3IEBACiAgIHVuaXR0ZXN0OjpGb29SZXNwb25zZSBmb29fcmVzcG9uc2VfOwogICB1bml0dGVzdDo6QmFyUmVxdWVzdCBiYXJfcmVxdWVzdF87CiAgIHVuaXR0ZXN0OjpCYXJSZXNwb25zZSBiYXJfcmVzcG9uc2VfOwotICBzY29wZWRfcHRyPENsb3N1cmU+IGRvbmVfOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPENsb3N1cmU+IGRvbmVfOwogfTsKIAogVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBHZXREZXNjcmlwdG9yKSB7CkBAIC0xMTMwLDcgKzEzMjgsNyBAQAogVEVTVF9GKEdlbmVyYXRlZFNlcnZpY2VUZXN0LCBDYWxsTWV0aG9kVHlwZUZhaWx1cmUpIHsKICAgLy8gVmVyaWZ5IGRlYXRoIGlmIHdlIGNhbGwgRm9vKCkgd2l0aCBCYXIncyBtZXNzYWdlIHR5cGVzLgogCi0jaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CiAgIEVYUEVDVF9ERUJVR19ERUFUSCgKICAgICBtb2NrX3NlcnZpY2VfLkNhbGxNZXRob2QoZm9vXywgJm1vY2tfY29udHJvbGxlcl8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZmb29fcmVxdWVzdF8sICZiYXJfcmVzcG9uc2VfLCBkb25lXy5nZXQoKSksCkBAIC0xMTQxLDcgKzEzMzksNyBAQAogICAgIG1vY2tfc2VydmljZV8uQ2FsbE1ldGhvZChmb29fLCAmbW9ja19jb250cm9sbGVyXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmJhcl9yZXF1ZXN0XywgJmZvb19yZXNwb25zZV8sIGRvbmVfLmdldCgpKSwKICAgICAiZHluYW1pY19jYXN0Iik7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCiB9CiAKIFRFU1RfRihHZW5lcmF0ZWRTZXJ2aWNlVGVzdCwgR2V0UHJvdG90eXBlcykgewpAQCAtMTIxNSw2ICsxNDEzLDY2NiBAQAogICBFWFBFQ1RfVFJVRShjb250cm9sbGVyLmNhbGxlZF8pOwogfQogCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK2NsYXNzIE9uZW9mVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKKyBwcm90ZWN0ZWQ6CisgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKKyAgfQorCisgIHZvaWQgRXhwZWN0RW51bUNhc2VzV29yayhjb25zdCB1bml0dGVzdDo6VGVzdE9uZW9mMiAmbWVzc2FnZSkgeworICAgIHN3aXRjaCAobWVzc2FnZS5mb29fY2FzZSgpKSB7CisgICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjprRm9vSW50OgorICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29faW50KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmtGb29TdHJpbmc6CisgICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6a0Zvb0NvcmQ6CisgICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19jb3JkKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmtGb29TdHJpbmdQaWVjZToKKyAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZ19waWVjZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjprRm9vQnl0ZXM6CisgICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19ieXRlcygpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjprRm9vRW51bToKKyAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2VudW0oKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6a0Zvb01lc3NhZ2U6CisgICAgICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmtGb29ncm91cDoKKyAgICAgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vZ3JvdXAoKSk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6a0Zvb0xhenlNZXNzYWdlOgorICAgICAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbGF6eV9tZXNzYWdlKCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPT19OT1RfU0VUOgorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK307CisKK1RFU1RfRihPbmVvZlRlc3QsIFNldHRpbmdPbmVGaWVsZENsZWFyc090aGVycykgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIG1lc3NhZ2Uuc2V0X2Zvb19pbnQoMTIzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKKworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJmb28iKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKKworCisgIG1lc3NhZ2Uuc2V0X2Zvb19ieXRlcygicXV4Iik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19ieXRlcygpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKKworICBtZXNzYWdlLnNldF9mb29fZW51bSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2VudW0oKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YobWVzc2FnZSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDIzNCk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOworCisgIG1lc3NhZ2UubXV0YWJsZV9mb29ncm91cCgpLT5zZXRfYSgzNDUpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29ncm91cCgpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKKworCisgIC8vIHdlIHJlcGVhdCB0aGlzIGJlY2F1c2Ugd2UgZGlkbid0IHRlc3QgaWYgdGhpcyBwcm9wZXJseSBjbGVhcnMgb3RoZXIgZmllbGRzCisgIC8vIGF0IHRoZSBiZWdpbm5pbmcuCisgIG1lc3NhZ2Uuc2V0X2Zvb19pbnQoMTIzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgRW51bUNhc2VzKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5zZXRfZm9vX2ludCgxMjMpOworICBFeHBlY3RFbnVtQ2FzZXNXb3JrKG1lc3NhZ2UpOworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJmb28iKTsKKyAgRXhwZWN0RW51bUNhc2VzV29yayhtZXNzYWdlKTsKKyAgbWVzc2FnZS5zZXRfZm9vX2J5dGVzKCJxdXgiKTsKKyAgRXhwZWN0RW51bUNhc2VzV29yayhtZXNzYWdlKTsKKyAgbWVzc2FnZS5zZXRfZm9vX2VudW0odW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTyk7CisgIEV4cGVjdEVudW1DYXNlc1dvcmsobWVzc2FnZSk7CisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcXV4X2ludCgyMzQpOworICBFeHBlY3RFbnVtQ2FzZXNXb3JrKG1lc3NhZ2UpOworICBtZXNzYWdlLm11dGFibGVfZm9vZ3JvdXAoKS0+c2V0X2EoMzQ1KTsKKyAgRXhwZWN0RW51bUNhc2VzV29yayhtZXNzYWdlKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgUHJpbWl0aXZlVHlwZSkgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOworICAvLyBVbnNldCBmaWVsZCByZXR1cm5zIGRlZmF1bHQgdmFsdWUKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX2ludCgpLCAwKTsKKworICBtZXNzYWdlLnNldF9mb29faW50KDEyMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19pbnQoKSwgMTIzKTsKKyAgbWVzc2FnZS5jbGVhcl9mb29faW50KCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29faW50KCkpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBFbnVtVHlwZSkgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOworICAvLyBVbnNldCBmaWVsZCByZXR1cm5zIGRlZmF1bHQgdmFsdWUKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX2VudW0oKSwgMSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX2VudW0odW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19lbnVtKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fZW51bSgpLCB1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PKTsKKyAgbWVzc2FnZS5jbGVhcl9mb29fZW51bSgpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2VudW0oKSk7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIFNldFN0cmluZykgeworICAvLyBDaGVjayB0aGF0IHNldHRpbmcgYSBzdHJpbmcgZmllbGQgaW4gdmFyaW91cyB3YXlzIHdvcmtzCisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgLy8gVW5zZXQgZmllbGQgcmV0dXJucyBkZWZhdWx0IHZhbHVlCisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19zdHJpbmcoKSwgIiIpOworCisgIG1lc3NhZ2Uuc2V0X2Zvb19zdHJpbmcoImZvbyIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fc3RyaW5nKCksICJmb28iKTsKKyAgbWVzc2FnZS5jbGVhcl9mb29fc3RyaW5nKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworCisgIG1lc3NhZ2Uuc2V0X2Zvb19zdHJpbmcoc3RyaW5nKCJiYXIiKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19zdHJpbmcoKSwgImJhciIpOworICBtZXNzYWdlLmNsZWFyX2Zvb19zdHJpbmcoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKCJxdXgiLCAzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAicXV4Iik7CisgIG1lc3NhZ2UuY2xlYXJfZm9vX3N0cmluZygpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKworICBtZXNzYWdlLm11dGFibGVfZm9vX3N0cmluZygpLT5hc3NpZ24oInF1dXgiKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAicXV1eCIpOworICBtZXNzYWdlLmNsZWFyX2Zvb19zdHJpbmcoKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiY29yZ2UiKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiY29yZ2UiKTsKKyAgbWVzc2FnZS5jbGVhcl9mb29fc3RyaW5nKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBSZWxlYXNlU3RyaW5nKSB7CisgIC8vIENoZWNrIHRoYXQgcmVsZWFzZV9mb28oKSBzdGFydHMgb3V0IE5VTEwsIGFuZCBnaXZlcyB1cyBhIHZhbHVlCisgIC8vIHRoYXQgd2UgY2FuIGRlbGV0ZSBhZnRlciBpdCdzIGJlZW4gc2V0LgorICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIEVYUEVDVF9FUShOVUxMLCBtZXNzYWdlLnJlbGVhc2VfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiYmxhaCIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPHN0cmluZz4gc3RyKG1lc3NhZ2UucmVsZWFzZV9mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgQVNTRVJUX1RSVUUoc3RyICE9IE5VTEwpOworICBFWFBFQ1RfRVEoImJsYWgiLCAqc3RyKTsKKworICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBTZXRBbGxvY2F0ZWRTdHJpbmcpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXRfYWxsb2NhdGVkX2ZvbygpIHdvcmtzIGZvciBzdHJpbmdzLgorICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBjb25zdCBzdHJpbmcga0hlbGxvKCJoZWxsbyIpOworICBtZXNzYWdlLnNldF9mb29fc3RyaW5nKGtIZWxsbyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisKKyAgbWVzc2FnZS5zZXRfYWxsb2NhdGVkX2Zvb19zdHJpbmcoTlVMTCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoIiIsIG1lc3NhZ2UuZm9vX3N0cmluZygpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfZm9vX3N0cmluZyhuZXcgc3RyaW5nKGtIZWxsbykpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoa0hlbGxvLCBtZXNzYWdlLmZvb19zdHJpbmcoKSk7Cit9CisKKworVEVTVF9GKE9uZW9mVGVzdCwgU2V0TWVzc2FnZSkgeworICAvLyBDaGVjayB0aGF0IHNldHRpbmcgYSBtZXNzYWdlIGZpZWxkIHdvcmtzCisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgLy8gVW5zZXQgZmllbGQgcmV0dXJucyBkZWZhdWx0IGluc3RhbmNlCisgIEVYUEVDVF9FUSgmbWVzc2FnZS5mb29fbWVzc2FnZSgpLAorICAgICAgICAgICAgJnVuaXR0ZXN0OjpUZXN0T25lb2YyX05lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19tZXNzYWdlKCkucXV4X2ludCgpLCAwKTsKKworICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X3F1eF9pbnQoMjM0KTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19tZXNzYWdlKCkucXV4X2ludCgpLCAyMzQpOworICBtZXNzYWdlLmNsZWFyX2Zvb19tZXNzYWdlKCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgUmVsZWFzZU1lc3NhZ2UpIHsKKyAgLy8gQ2hlY2sgdGhhdCByZWxlYXNlX2ZvbygpIHN0YXJ0cyBvdXQgTlVMTCwgYW5kIGdpdmVzIHVzIGEgdmFsdWUKKyAgLy8gdGhhdCB3ZSBjYW4gZGVsZXRlIGFmdGVyIGl0J3MgYmVlbiBzZXQuCisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgRVhQRUNUX0VRKE5VTEwsIG1lc3NhZ2UucmVsZWFzZV9mb29fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcXV4X2ludCgxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8dW5pdHRlc3Q6OlRlc3RPbmVvZjJfTmVzdGVkTWVzc2FnZT4gbWVzKAorICAgICAgbWVzc2FnZS5yZWxlYXNlX2Zvb19tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEFTU0VSVF9UUlVFKG1lcyAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKDEsIG1lcy0+cXV4X2ludCgpKTsKKworICBFWFBFQ1RfRVEoTlVMTCwgbWVzc2FnZS5yZWxlYXNlX2Zvb19tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIFNldEFsbG9jYXRlZE1lc3NhZ2UpIHsKKyAgLy8gQ2hlY2sgdGhhdCBzZXRfYWxsb2NhdGVkX2ZvbygpIHdvcmtzIGZvciBtZXNzYWdlcy4KKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDEpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfZm9vX21lc3NhZ2UoTlVMTCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0VRKCZtZXNzYWdlLmZvb19tZXNzYWdlKCksCisgICAgICAgICAgICAmdW5pdHRlc3Q6OlRlc3RPbmVvZjJfTmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKworICBtZXNzYWdlLm11dGFibGVfZm9vX21lc3NhZ2UoKS0+c2V0X3F1eF9pbnQoMSk7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyX05lc3RlZE1lc3NhZ2UqIG1lcyA9IG1lc3NhZ2UucmVsZWFzZV9mb29fbWVzc2FnZSgpOworICBBU1NFUlRfVFJVRShtZXMgIT0gTlVMTCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbWVzc2FnZSgpKTsKKworICBtZXNzYWdlLnNldF9hbGxvY2F0ZWRfZm9vX21lc3NhZ2UobWVzKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLmZvb19tZXNzYWdlKCkucXV4X2ludCgpKTsKK30KKworCitURVNUX0YoT25lb2ZUZXN0LCBDbGVhcikgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOworCisgIG1lc3NhZ2Uuc2V0X2Zvb19pbnQoMSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSk7CisgIG1lc3NhZ2UuY2xlYXJfZm9vX2ludCgpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgRGVmYXVsdHMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX2ludCgpLCAwKTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX3N0cmluZygpLCAiIik7CisKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2J5dGVzKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fYnl0ZXMoKSwgIiIpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fZW51bSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuZm9vX2VudW0oKSwgMSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29fbWVzc2FnZSgpLnF1eF9pbnQoKSwgMCk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb2dyb3VwKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5mb29ncm91cCgpLmEoKSwgMCk7CisKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX2ludCgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuYmFyX2ludCgpLCA1KTsKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuYmFyX3N0cmluZygpLCAiU1RSSU5HIik7CisKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX2J5dGVzKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5iYXJfYnl0ZXMoKSwgIkJZVEVTIik7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Jhcl9lbnVtKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZS5iYXJfZW51bSgpLCAyKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgU3dhcFdpdGhFbXB0eSkgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgIG1lc3NhZ2UxLnNldF9mb29fc3RyaW5nKCJGT08iKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX2Zvb19zdHJpbmcoKSk7CisgIG1lc3NhZ2UxLlN3YXAoJm1lc3NhZ2UyKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19zdHJpbmcoKSwgIkZPTyIpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBTd2FwV2l0aFNlbGYpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfZm9vX3N0cmluZygiRk9PIik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIG1lc3NhZ2UuU3dhcCgmbWVzc2FnZSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlLmZvb19zdHJpbmcoKSwgIkZPTyIpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBTd2FwQm90aEhhc0ZpZWxkcykgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgbWVzc2FnZTEuc2V0X2Zvb19zdHJpbmcoIkZPTyIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMS5oYXNfZm9vX3N0cmluZygpKTsKKyAgbWVzc2FnZTIubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcXV4X2ludCgxKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19tZXNzYWdlKCkpOworCisgIG1lc3NhZ2UxLlN3YXAoJm1lc3NhZ2UyKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZTIuaGFzX2Zvb19tZXNzYWdlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMS5oYXNfZm9vX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMS5mb29fbWVzc2FnZSgpLnF1eF9pbnQoKSwgMSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29fc3RyaW5nKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX3N0cmluZygpLCAiRk9PIik7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIENvcHlDb25zdHJ1Y3RvcikgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMTsKKyAgbWVzc2FnZTEuc2V0X2Zvb19ieXRlcygiRk9PIik7CisKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTIobWVzc2FnZTEpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vX2J5dGVzKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2J5dGVzKCksICJGT08iKTsKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgQ29weUZyb20pIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBtZXNzYWdlMS5zZXRfZm9vX2VudW0odW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkJBUik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLmhhc19mb29fZW51bSgpKTsKKworICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29fZW51bSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19lbnVtKCksIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVIpOworCisgIC8vIENvcHlpbmcgZnJvbSBzZWxmIHNob3VsZCBiZSBhIG5vLW9wLgorICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19mb29fZW51bSgpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19lbnVtKCksIHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVIpOworfQorCitURVNUX0YoT25lb2ZUZXN0LCBDb3B5QXNzaWdubWVudE9wZXJhdG9yKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxOworICBtZXNzYWdlMS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDEyMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLmhhc19mb29fbWVzc2FnZSgpKTsKKworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMjsKKyAgbWVzc2FnZTIgPSBtZXNzYWdlMTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19tZXNzYWdlKCkucXV4X2ludCgpLCAxMjMpOworCisgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlbGYtYXNzaWdubWVudCBkb2VzIHNvbWV0aGluZyBzYW5lLgorICBtZXNzYWdlMiA9IG1lc3NhZ2UyOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCksIDEyMyk7Cit9CisKK1RFU1RfRihPbmVvZlRlc3QsIFVwY2FzdENvcHlGcm9tKSB7CisgIC8vIFRlc3QgdGhlIENvcHlGcm9tIG1ldGhvZCB0aGF0IHRha2VzIGluIHRoZSBnZW5lcmljIGNvbnN0IE1lc3NhZ2UmCisgIC8vIHBhcmFtZXRlci4KKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBtZXNzYWdlMS5tdXRhYmxlX2Zvb2dyb3VwKCktPnNldF9hKDEyMyk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UxLmhhc19mb29ncm91cCgpKTsKKworICBjb25zdCBNZXNzYWdlKiBzb3VyY2UgPSBpbXBsaWNpdF9jYXN0PGNvbnN0IE1lc3NhZ2UqPigmbWVzc2FnZTEpOworICBtZXNzYWdlMi5Db3B5RnJvbSgqc291cmNlKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5oYXNfZm9vZ3JvdXAoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29ncm91cCgpLmEoKSwgMTIzKTsKK30KKworLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoKSwKKy8vIFRoaXMgaW5kaXJlY3RseSB0ZXN0cyBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oKQorLy8gV2UgaGF2ZSB0byB0ZXN0IGVhY2ggZmllbGQgdHlwZSBzZXBhcmF0ZWx5IGJlY2F1c2Ugd2UgY2Fubm90IHNldCB0aGVtIGF0IHRoZQorLy8gc2FtZSB0aW1lCitURVNUX0YoT25lb2ZUZXN0LCBTZXJpYWxpemF0aW9uVG9BcnJheSkgeworICAvLyBQcmltaXRpdmUgdHlwZQorICB7CisgICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICAgIHN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLnNldF9mb29faW50KDEyMyk7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICAgIGRhdGEucmVzaXplKHNpemUpOworICAgIHVpbnQ4KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKKyAgICB1aW50OCogZW5kID0gbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CisgICAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHN0YXJ0KTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29faW50KCksIDEyMyk7CisgIH0KKworICAvLyBTdHJpbmcKKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdHJpbmcgZGF0YTsKKyAgICBtZXNzYWdlMS5zZXRfZm9vX3N0cmluZygiZm9vIik7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICAgIGRhdGEucmVzaXplKHNpemUpOworICAgIHVpbnQ4KiBzdGFydCA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKKyAgICB1aW50OCogZW5kID0gbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CisgICAgRVhQRUNUX0VRKHNpemUsIGVuZCAtIHN0YXJ0KTsKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fc3RyaW5nKCksICJmb28iKTsKKyAgfQorCisKKyAgLy8gQnl0ZXMKKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdHJpbmcgZGF0YTsKKyAgICBtZXNzYWdlMS5zZXRfZm9vX2J5dGVzKCJxdXgiKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICAgIHVpbnQ4KiBlbmQgPSBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19ieXRlcygpLCAicXV4Iik7CisgIH0KKworICAvLyBFbnVtCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RyaW5nIGRhdGE7CisgICAgbWVzc2FnZTEuc2V0X2Zvb19lbnVtKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08pOworICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKKyAgICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgICB1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7CisgICAgdWludDgqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2VudW0oKSwgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTyk7CisgIH0KKworICAvLyBNZXNzYWdlCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RyaW5nIGRhdGE7CisgICAgbWVzc2FnZTEubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcXV4X2ludCgyMzQpOworICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKKyAgICBkYXRhLnJlc2l6ZShzaXplKTsKKyAgICB1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSk7CisgICAgdWludDgqIGVuZCA9IG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoc3RhcnQpOworICAgIEVYUEVDVF9FUShzaXplLCBlbmQgLSBzdGFydCk7CisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCksIDIzNCk7CisgIH0KKworICAvLyBHcm91cAorICB7CisgICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICAgIHN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLm11dGFibGVfZm9vZ3JvdXAoKS0+c2V0X2EoMzQ1KTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheSgmZGF0YSkpOworICAgIHVpbnQ4KiBlbmQgPSBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb2dyb3VwKCkuYSgpLCAzNDUpOworICB9CisKK30KKworLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpIGJ5IGZvcmNpbmcgdGhlIGJ1ZmZlciB0byB3cml0ZQorLy8gb25lIGJ5dGUgYXQgYSB0aW1lLgorLy8gVGhpcyBpbmRpcmVjdGx5IHRlc3RzIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpCisvLyBXZSBoYXZlIHRvIHRlc3QgZWFjaCBmaWVsZCB0eXBlIHNlcGFyYXRlbHkgYmVjYXVzZSB3ZSBjYW5ub3Qgc2V0IHRoZW0gYXQgdGhlCisvLyBzYW1lIHRpbWUKK1RFU1RfRihPbmVvZlRlc3QsIFNlcmlhbGl6YXRpb25Ub1N0cmVhbSkgeworICAvLyBQcmltaXRpdmUgdHlwZQorICB7CisgICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICAgIHN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLnNldF9mb29faW50KDEyMyk7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgICAgRVhQRUNUX0VRKHNpemUsIG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCkpOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19pbnQoKSwgMTIzKTsKKyAgfQorCisgIC8vIFN0cmluZworICB7CisgICAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICAgIHN0cmluZyBkYXRhOworICAgIG1lc3NhZ2UxLnNldF9mb29fc3RyaW5nKCJmb28iKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisKKyAgICB7CisgICAgICAvLyBBbGxvdyB0aGUgb3V0cHV0IHN0cmVhbSB0byBidWZmZXIgb25seSBvbmUgYnl0ZSBhdCBhIHRpbWUuCisgICAgICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gYXJyYXlfc3RyZWFtKHN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgICAgfQorCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX3N0cmluZygpLCAiZm9vIik7CisgIH0KKworCisgIC8vIEJ5dGVzCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RyaW5nIGRhdGE7CisgICAgbWVzc2FnZTEuc2V0X2Zvb19ieXRlcygicXV4Iik7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgICAgRVhQRUNUX0VRKHNpemUsIG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCkpOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19ieXRlcygpLCAicXV4Iik7CisgIH0KKworICAvLyBFbnVtCisgIHsKKyAgICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RyaW5nIGRhdGE7CisgICAgbWVzc2FnZTEuc2V0X2Zvb19lbnVtKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08pOworICAgIGludCBzaXplID0gbWVzc2FnZTEuQnl0ZVNpemUoKTsKKyAgICBkYXRhLnJlc2l6ZShzaXplKTsKKworICAgIHsKKyAgICAgIC8vIEFsbG93IHRoZSBvdXRwdXQgc3RyZWFtIHRvIGJ1ZmZlciBvbmx5IG9uZSBieXRlIGF0IGEgdGltZS4KKyAgICAgIGlvOjpBcnJheU91dHB1dFN0cmVhbSBhcnJheV9zdHJlYW0oc3RyaW5nX2FzX2FycmF5KCZkYXRhKSwgc2l6ZSwgMSk7CisgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmYXJyYXlfc3RyZWFtKTsKKyAgICAgIG1lc3NhZ2UxLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0X3N0cmVhbSk7CisgICAgICBFWFBFQ1RfRkFMU0Uob3V0cHV0X3N0cmVhbS5IYWRFcnJvcigpKTsKKyAgICAgIEVYUEVDVF9FUShzaXplLCBvdXRwdXRfc3RyZWFtLkJ5dGVDb3VudCgpKTsKKyAgICB9CisKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fZW51bSgpLCB1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PKTsKKyAgfQorCisgIC8vIE1lc3NhZ2UKKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdHJpbmcgZGF0YTsKKyAgICBtZXNzYWdlMS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9xdXhfaW50KDIzNCk7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgICAgRVhQRUNUX0VRKHNpemUsIG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCkpOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19tZXNzYWdlKCkucXV4X2ludCgpLCAyMzQpOworICB9CisKKyAgLy8gR3JvdXAKKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgICBzdHJpbmcgZGF0YTsKKyAgICBtZXNzYWdlMS5tdXRhYmxlX2Zvb2dyb3VwKCktPnNldF9hKDM0NSk7CisgICAgaW50IHNpemUgPSBtZXNzYWdlMS5CeXRlU2l6ZSgpOworICAgIGRhdGEucmVzaXplKHNpemUpOworCisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbShzdHJpbmdfYXNfYXJyYXkoJmRhdGEpLCBzaXplLCAxKTsKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZhcnJheV9zdHJlYW0pOworICAgICAgbWVzc2FnZTEuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgIEVYUEVDVF9GQUxTRShvdXRwdXRfc3RyZWFtLkhhZEVycm9yKCkpOworICAgICAgRVhQRUNUX0VRKHNpemUsIG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCkpOworICAgIH0KKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb2dyb3VwKCkuYSgpLCAzNDUpOworICB9CisKK30KKworVEVTVF9GKE9uZW9mVGVzdCwgTWVyZ2VGcm9tKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICBtZXNzYWdlMS5zZXRfZm9vX2ludCgxMjMpOworICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19pbnQoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29faW50KCksIDEyMyk7CisKKyAgbWVzc2FnZTEuc2V0X2Zvb19zdHJpbmcoImZvbyIpOworICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9FUShtZXNzYWdlMi5mb29fc3RyaW5nKCksICJmb28iKTsKKworCisgIG1lc3NhZ2UxLnNldF9mb29fYnl0ZXMoInF1eCIpOworICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19ieXRlcygpKTsKKyAgRVhQRUNUX0VRKG1lc3NhZ2UyLmZvb19ieXRlcygpLCAicXV4Iik7CisKKyAgbWVzc2FnZTEuc2V0X2Zvb19lbnVtKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpGT08pOworICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19lbnVtKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX2VudW0oKSwgdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTyk7CisKKyAgbWVzc2FnZTEubXV0YWJsZV9mb29fbWVzc2FnZSgpLT5zZXRfcXV4X2ludCgyMzQpOworICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb19tZXNzYWdlKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vX21lc3NhZ2UoKS5xdXhfaW50KCksIDIzNCk7CisKKyAgbWVzc2FnZTEubXV0YWJsZV9mb29ncm91cCgpLT5zZXRfYSgzNDUpOworICBtZXNzYWdlMi5NZXJnZUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UyKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuaGFzX2Zvb2dyb3VwKCkpOworICBFWFBFQ1RfRVEobWVzc2FnZTIuZm9vZ3JvdXAoKS5hKCksIDM0NSk7CisKK30KKwogfSAgLy8gbmFtZXNwYWNlIGNwcF91bml0dGVzdAogfSAgLy8gbmFtZXNwYWNlIGNwcAogfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvY3BwX3VuaXR0ZXN0LmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfdW5pdHRlc3QuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXRhZGF0YV90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9tZXRhZGF0YV90ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jcHAvbWV0YWRhdGFfdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9kb2NfY29tbWVudC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2RvY19jb21tZW50LmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZG9jX2NvbW1lbnQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2VudW0uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bV9maWVsZC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9lbnVtX2ZpZWxkLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZW51bV9maWVsZC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZmllbGRfYmFzZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2ZpZWxkX2Jhc2UuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3IuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9nZW5lcmF0b3JfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfaGVscGVycy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2hlbHBlcnMuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWFwX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tYXBfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21hcF9maWVsZC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbWVzc2FnZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2UuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX21lc3NhZ2VfZmllbGQuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9tZXNzYWdlX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfbmFtZXMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9uYW1lcy5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfb3B0aW9ucy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9vcHRpb25zLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfb3B0aW9ucy5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9wcmltaXRpdmVfZmllbGQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3ByaW1pdGl2ZV9maWVsZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcHJpbWl0aXZlX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZWZsZWN0aW9uX2NsYXNzLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVmbGVjdGlvbl9jbGFzcy5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfZW51bV9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX2VudW1fZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX21lc3NhZ2VfZmllbGQuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9tZXNzYWdlX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3JlcGVhdGVkX3ByaW1pdGl2ZV9maWVsZC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfcmVwZWF0ZWRfcHJpbWl0aXZlX2ZpZWxkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9yZXBlYXRlZF9wcmltaXRpdmVfZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfc291cmNlX2dlbmVyYXRvcl9iYXNlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY3NoYXJwL2NzaGFycF9zb3VyY2VfZ2VuZXJhdG9yX2Jhc2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3NvdXJjZV9nZW5lcmF0b3JfYmFzZS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NzaGFycC9jc2hhcnBfd3JhcHBlcl9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX3dyYXBwZXJfZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYwppbmRleCA0MjJmNzU5Li4wZDkwOTNjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDMsNiArNDMsMTAgQEAKICNpbmNsdWRlIDxlcnJuby5oPgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpZm5kZWYgX1NIQVJFRF9QVFJfSAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oPgogCkBAIC0xMjEsMTAgKzEyNSwxMSBAQAogCiBib29sIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2U6OkZpbmRGaWxlQnlOYW1lKAogICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgewotICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBpbnB1dChzb3VyY2VfdHJlZV8tPk9wZW4oZmlsZW5hbWUpKTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gaW5wdXQoc291cmNlX3RyZWVfLT5PcGVuKGZpbGVuYW1lKSk7CiAgIGlmIChpbnB1dCA9PSBOVUxMKSB7CiAgICAgaWYgKGVycm9yX2NvbGxlY3Rvcl8gIT0gTlVMTCkgewotICAgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkRXJyb3IoZmlsZW5hbWUsIC0xLCAwLCAiRmlsZSBub3QgZm91bmQuIik7CisgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihmaWxlbmFtZSwgLTEsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzb3VyY2VfdHJlZV8tPkdldExhc3RFcnJvck1lc3NhZ2UoKSk7CiAgICAgfQogICAgIHJldHVybiBmYWxzZTsKICAgfQpAQCAtMTgwLDEyICsxODUsMjYgQEAKICAgb3duZXJfLT5lcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihmaWxlbmFtZSwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKIH0KIAordm9pZCBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlOjpWYWxpZGF0aW9uRXJyb3JDb2xsZWN0b3I6OkFkZFdhcm5pbmcoCisgICAgY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sCisgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgIGlmIChvd25lcl8tPmVycm9yX2NvbGxlY3Rvcl8gPT0gTlVMTCkgcmV0dXJuOworCisgIGludCBsaW5lLCBjb2x1bW47CisgIG93bmVyXy0+c291cmNlX2xvY2F0aW9uc18uRmluZChkZXNjcmlwdG9yLCBsb2NhdGlvbiwgJmxpbmUsICZjb2x1bW4pOworICBvd25lcl8tPmVycm9yX2NvbGxlY3Rvcl8tPkFkZFdhcm5pbmcoZmlsZW5hbWUsIGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogSW1wb3J0ZXI6OkltcG9ydGVyKFNvdXJjZVRyZWUqIHNvdXJjZV90cmVlLAogICAgICAgICAgICAgICAgICAgIE11bHRpRmlsZUVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCiAgIDogZGF0YWJhc2VfKHNvdXJjZV90cmVlKSwKICAgICBwb29sXygmZGF0YWJhc2VfLCBkYXRhYmFzZV8uR2V0VmFsaWRhdGlvbkVycm9yQ29sbGVjdG9yKCkpIHsKKyAgcG9vbF8uRW5mb3JjZVdlYWtEZXBlbmRlbmNpZXModHJ1ZSk7CiAgIGRhdGFiYXNlXy5SZWNvcmRFcnJvcnNUbyhlcnJvcl9jb2xsZWN0b3IpOwogfQogCkBAIC0xOTUsMTAgKzIxNCwyMiBAQAogICByZXR1cm4gcG9vbF8uRmluZEZpbGVCeU5hbWUoZmlsZW5hbWUpOwogfQogCit2b2lkIEltcG9ydGVyOjpBZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlX25hbWUpIHsKKyAgcG9vbF8uQWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKGZpbGVfbmFtZSk7Cit9CisKK3ZvaWQgSW1wb3J0ZXI6OkNsZWFyVW51c2VkSW1wb3J0VHJhY2tGaWxlcygpIHsKKyAgcG9vbF8uQ2xlYXJVbnVzZWRJbXBvcnRUcmFja0ZpbGVzKCk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogU291cmNlVHJlZTo6flNvdXJjZVRyZWUoKSB7fQogCitzdHJpbmcgU291cmNlVHJlZTo6R2V0TGFzdEVycm9yTWVzc2FnZSgpIHsKKyAgcmV0dXJuICJGaWxlIG5vdCBmb3VuZC4iOworfQorCiBEaXNrU291cmNlVHJlZTo6RGlza1NvdXJjZVRyZWUoKSB7fQogCiBEaXNrU291cmNlVHJlZTo6fkRpc2tTb3VyY2VUcmVlKCkge30KQEAgLTIzOSw5ICsyNzAsOSBAQAogICB9CiAjZW5kaWYKIAotICB2ZWN0b3I8c3RyaW5nPiBwYXJ0czsKICAgdmVjdG9yPHN0cmluZz4gY2Fub25pY2FsX3BhcnRzOwotICBTcGxpdFN0cmluZ1VzaW5nKHBhdGgsICIvIiwgJnBhcnRzKTsgIC8vIE5vdGU6ICBSZW1vdmVzIGVtcHR5IHBhcnRzLgorICB2ZWN0b3I8c3RyaW5nPiBwYXJ0cyA9IFNwbGl0KAorICAgICAgcGF0aCwgIi8iLCB0cnVlKTsgIC8vIE5vdGU6ICBSZW1vdmVzIGVtcHR5IHBhcnRzLgogICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnRzLnNpemUoKTsgaSsrKSB7CiAgICAgaWYgKHBhcnRzW2ldID09ICIuIikgewogICAgICAgLy8gSWdub3JlLgpAQCAtMjQ5LDcgKzI4MCw3IEBACiAgICAgICBjYW5vbmljYWxfcGFydHMucHVzaF9iYWNrKHBhcnRzW2ldKTsKICAgICB9CiAgIH0KLSAgc3RyaW5nIHJlc3VsdCA9IEpvaW5TdHJpbmdzKGNhbm9uaWNhbF9wYXJ0cywgIi8iKTsKKyAgc3RyaW5nIHJlc3VsdCA9IEpvaW4oY2Fub25pY2FsX3BhcnRzLCAiLyIpOwogICBpZiAoIXBhdGguZW1wdHkoKSAmJiBwYXRoWzBdID09ICcvJykgewogICAgIC8vIFJlc3RvcmUgbGVhZGluZyBzbGFzaC4KICAgICByZXN1bHQgPSAnLycgKyByZXN1bHQ7CkBAIC0zODUsNyArNDE2LDcgQEAKICAgLy8gVmVyaWZ5IHRoYXQgd2UgY2FuIG9wZW4gdGhlIGZpbGUuICBOb3RlIHRoYXQgdGhpcyBhbHNvIGhhcyB0aGUgc2lkZS1lZmZlY3QKICAgLy8gb2YgdmVyaWZ5aW5nIHRoYXQgd2UgYXJlIG5vdCBjYW5vbmljYWxpemluZyBhd2F5IGFueSBub24tZXhpc3RlbnQKICAgLy8gZGlyZWN0b3JpZXMuCi0gIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IHN0cmVhbShPcGVuRGlza0ZpbGUoZGlza19maWxlKSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IHN0cmVhbShPcGVuRGlza0ZpbGUoZGlza19maWxlKSk7CiAgIGlmIChzdHJlYW0gPT0gTlVMTCkgewogICAgIHJldHVybiBDQU5OT1RfT1BFTjsKICAgfQpAQCAtMzk1LDggKzQyNiw4IEBACiAKIGJvb2wgRGlza1NvdXJjZVRyZWU6OlZpcnR1YWxGaWxlVG9EaXNrRmlsZShjb25zdCBzdHJpbmcmIHZpcnR1YWxfZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGRpc2tfZmlsZSkgewotICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBzdHJlYW0oT3BlblZpcnR1YWxGaWxlKHZpcnR1YWxfZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNrX2ZpbGUpKTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gc3RyZWFtKAorICAgICAgT3BlblZpcnR1YWxGaWxlKHZpcnR1YWxfZmlsZSwgZGlza19maWxlKSk7CiAgIHJldHVybiBzdHJlYW0gIT0gTlVMTDsKIH0KIApAQCAtNDA0LDYgKzQzNSwxMCBAQAogICByZXR1cm4gT3BlblZpcnR1YWxGaWxlKGZpbGVuYW1lLCBOVUxMKTsKIH0KIAorc3RyaW5nIERpc2tTb3VyY2VUcmVlOjpHZXRMYXN0RXJyb3JNZXNzYWdlKCkgeworICByZXR1cm4gbGFzdF9lcnJvcl9tZXNzYWdlXzsKK30KKwogaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIERpc2tTb3VyY2VUcmVlOjpPcGVuVmlydHVhbEZpbGUoCiAgICAgY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX2ZpbGUsCiAgICAgc3RyaW5nKiBkaXNrX2ZpbGUpIHsKQEAgLTQxMiw2ICs0NDcsOCBAQAogICAgIC8vIFdlIGRvIG5vdCBhbGxvdyBpbXBvcnRpbmcgb2YgcGF0aHMgY29udGFpbmluZyB0aGluZ3MgbGlrZSAiLi4iIG9yCiAgICAgLy8gY29uc2VjdXRpdmUgc2xhc2hlcyBzaW5jZSB0aGUgY29tcGlsZXIgZXhwZWN0cyBmaWxlcyB0byBiZSB1bmlxdWVseQogICAgIC8vIGlkZW50aWZpZWQgYnkgZmlsZSBuYW1lLgorICAgIGxhc3RfZXJyb3JfbWVzc2FnZV8gPSAiQmFja3NsYXNoZXMsIGNvbnNlY3V0aXZlIHNsYXNoZXMsIFwiLlwiLCBvciBcIi4uXCIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJlIG5vdCBhbGxvd2VkIGluIHRoZSB2aXJ0dWFsIHBhdGgiOwogICAgIHJldHVybiBOVUxMOwogICB9CiAKQEAgLTQyOSwxMyArNDY2LDEzIEBACiAKICAgICAgIGlmIChlcnJubyA9PSBFQUNDRVMpIHsKICAgICAgICAgLy8gVGhlIGZpbGUgZXhpc3RzIGJ1dCBpcyBub3QgcmVhZGFibGUuCi0gICAgICAgIC8vIFRPRE8oa2VudG9uKTogIEZpbmQgYSB3YXkgdG8gcmVwb3J0IHRoaXMgbW9yZSBuaWNlbHkuCi0gICAgICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIlJlYWQgYWNjZXNzIGlzIGRlbmllZCBmb3IgZmlsZTogIiA8PCB0ZW1wX2Rpc2tfZmlsZTsKKyAgICAgICAgbGFzdF9lcnJvcl9tZXNzYWdlXyA9ICJSZWFkIGFjY2VzcyBpcyBkZW5pZWQgZm9yIGZpbGU6ICIgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVtcF9kaXNrX2ZpbGU7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgICAgfQogICAgIH0KICAgfQotCisgIGxhc3RfZXJyb3JfbWVzc2FnZV8gPSAiRmlsZSBub3QgZm91bmQuIjsKICAgcmV0dXJuIE5VTEw7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlci5oCmluZGV4IDdhMmVmYzIuLmNjOGZjYzMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2ltcG9ydGVyLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMTIxLDYgKzEyMSwxMiBAQAogICAgICAgICAgICAgICAgICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSk7CiAKKyAgICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpOworCiAgICBwcml2YXRlOgogICAgIFNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UqIG93bmVyXzsKICAgfTsKQEAgLTE2Niw2ICsxNzIsOSBAQAogICAgIHJldHVybiAmcG9vbF87CiAgIH0KIAorICB2b2lkIEFkZFVudXNlZEltcG9ydFRyYWNrRmlsZShjb25zdCBzdHJpbmcmIGZpbGVfbmFtZSk7CisgIHZvaWQgQ2xlYXJVbnVzZWRJbXBvcnRUcmFja0ZpbGVzKCk7CisKICBwcml2YXRlOgogICBTb3VyY2VUcmVlRGVzY3JpcHRvckRhdGFiYXNlIGRhdGFiYXNlXzsKICAgRGVzY3JpcHRvclBvb2wgcG9vbF87CkBAIC0xODUsNiArMTk0LDkgQEAKICAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGludCBsaW5lLCBpbnQgY29sdW1uLAogICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSA9IDA7CiAKKyAgdmlydHVhbCB2b2lkIEFkZFdhcm5pbmcoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgaW50IGxpbmUsIGludCBjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkge30KKwogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNdWx0aUZpbGVFcnJvckNvbGxlY3Rvcik7CiB9OwpAQCAtMjA0LDYgKzIxNiwxMyBAQAogICAvLyBjb250YWluICIuIiBvciAiLi4iIGNvbXBvbmVudHMuCiAgIHZpcnR1YWwgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgPSAwOwogCisgIC8vIElmIE9wZW4oKSByZXR1cm5zIE5VTEwsIGNhbGxpbmcgdGhpcyBtZXRob2QgaW1tZWRpYXRlbHkgd2lsbCByZXR1cm4gYW4KKyAgLy8gZGVzY3JpcHRpb24gb2YgdGhlIGVycm9yLgorICAvLyBTdWJjbGFzc2VzIHNob3VsZCBpbXBsZW1lbnQgdGhpcyBtZXRob2QgYW5kIHJldHVybiBhIG1lYW5pbmdmdWwgdmFsdWUgZm9yCisgIC8vIGJldHRlciBlcnJvciByZXBvcnRpbmcuCisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBjaGFuZ2UgdGhpcyB0byBhIHB1cmUgdmlydHVhbCBmdW5jdGlvbi4KKyAgdmlydHVhbCBzdHJpbmcgR2V0TGFzdEVycm9yTWVzc2FnZSgpOworCiAgcHJpdmF0ZToKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNvdXJjZVRyZWUpOwogfTsKQEAgLTI3MywxNyArMjkyLDIxIEBACiAgIGJvb2wgVmlydHVhbEZpbGVUb0Rpc2tGaWxlKGNvbnN0IHN0cmluZyYgdmlydHVhbF9maWxlLCBzdHJpbmcqIGRpc2tfZmlsZSk7CiAKICAgLy8gaW1wbGVtZW50cyBTb3VyY2VUcmVlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisgIHZpcnR1YWwgaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIE9wZW4oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CisKKyAgdmlydHVhbCBzdHJpbmcgR2V0TGFzdEVycm9yTWVzc2FnZSgpOwogCiAgcHJpdmF0ZToKICAgc3RydWN0IE1hcHBpbmcgewogICAgIHN0cmluZyB2aXJ0dWFsX3BhdGg7CiAgICAgc3RyaW5nIGRpc2tfcGF0aDsKIAotICAgIGlubGluZSBNYXBwaW5nKGNvbnN0IHN0cmluZyYgdmlydHVhbF9wYXRoLCBjb25zdCBzdHJpbmcmIGRpc2tfcGF0aCkKLSAgICAgIDogdmlydHVhbF9wYXRoKHZpcnR1YWxfcGF0aCksIGRpc2tfcGF0aChkaXNrX3BhdGgpIHt9CisgICAgaW5saW5lIE1hcHBpbmcoY29uc3Qgc3RyaW5nJiB2aXJ0dWFsX3BhdGhfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBkaXNrX3BhdGhfcGFyYW0pCisgICAgICA6IHZpcnR1YWxfcGF0aCh2aXJ0dWFsX3BhdGhfcGFyYW0pLCBkaXNrX3BhdGgoZGlza19wYXRoX3BhcmFtKSB7fQogICB9OwogICB2ZWN0b3I8TWFwcGluZz4gbWFwcGluZ3NfOworICBzdHJpbmcgbGFzdF9lcnJvcl9tZXNzYWdlXzsKIAogICAvLyBMaWtlIE9wZW4oKSwgYnV0IHJldHVybnMgdGhlIG9uLWRpc2sgcGF0aCBpbiBkaXNrX2ZpbGUgaWYgZGlza19maWxlIGlzCiAgIC8vIG5vbi1OVUxMIGFuZCB0aGUgZmlsZSBjb3VsZCBiZSBzdWNjZXNzZnVsbHkgb3BlbmVkLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYwppbmRleCA1NmZhZDU2Li4xYjZlOTcwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9pbXBvcnRlcl91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsMTkgKzMyLDI2IEBACiAvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+Ci0KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CkBAIC01Miw2ICs1OSwxMCBAQAogCiBuYW1lc3BhY2UgewogCitib29sIEZpbGVFeGlzdHMoY29uc3Qgc3RyaW5nJiBwYXRoKSB7CisgIHJldHVybiBGaWxlOjpFeGlzdHMocGF0aCk7Cit9CisKICNkZWZpbmUgRVhQRUNUX1NVQlNUUklORyhuZWVkbGUsIGhheXN0YWNrKSBcCiAgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsIChuZWVkbGUpLCAoaGF5c3RhY2spKQogCkBAIC02MSw2ICs3Miw3IEBACiAgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQogCiAgIHN0cmluZyB0ZXh0XzsKKyAgc3RyaW5nIHdhcm5pbmdfdGV4dF87CiAKICAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKQEAgLTY4LDYgKzgwLDEyIEBACiAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmdGV4dF8sICIkMDokMTokMjogJDNcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKICAgfQorCisgIHZvaWQgQWRkV2FybmluZyhjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBpbnQgbGluZSwgaW50IGNvbHVtbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJndhcm5pbmdfdGV4dF8sICIkMDokMTokMjogJDNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlbmFtZSwgbGluZSwgY29sdW1uLCBtZXNzYWdlKTsKKyAgfQogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtOTIsNiArMTEwLDEwIEBACiAgICAgfQogICB9CiAKKyAgc3RyaW5nIEdldExhc3RFcnJvck1lc3NhZ2UoKSB7CisgICAgcmV0dXJuICJGaWxlIG5vdCBmb3VuZC4iOworICB9CisKICBwcml2YXRlOgogICBoYXNoX21hcDxzdHJpbmcsIGNvbnN0IGNoYXIqPiBmaWxlc187CiB9OwpAQCAtMTA5LDYgKzEzMSw3IEBACiAKICAgLy8gUmV0dXJuIHRoZSBjb2xsZWN0ZWQgZXJyb3IgdGV4dAogICBzdHJpbmcgZXJyb3IoKSBjb25zdCB7IHJldHVybiBlcnJvcl9jb2xsZWN0b3JfLnRleHRfOyB9CisgIHN0cmluZyB3YXJuaW5nKCkgY29uc3QgeyByZXR1cm4gZXJyb3JfY29sbGVjdG9yXy53YXJuaW5nX3RleHRfOyB9CiAKICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3Rvcl87CiAgIE1vY2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKQEAgLTIxMCwxMTkgKzIzMyw2IEBACiAgICAgZXJyb3JfY29sbGVjdG9yXy50ZXh0Xyk7CiB9CiAKLS8vIFRPRE8oc2FuamF5KTogVGhlIE1hcEZpZWxkIHRlc3RzIGJlbG93IG1vcmUgcHJvcGVybHkgYmVsb25nIGluCi0vLyBkZXNjcmlwdG9yX3VuaXR0ZXN0LCBidXQgYXJlIG1vcmUgY29udmVuaWVudCB0byB0ZXN0IGhlcmUuCi1URVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZFZhbGlkKSB7Ci0gIEFkZEZpbGUoCi0gICAgICAibWFwLnByb3RvIiwKLSAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICAgIm1lc3NhZ2UgSXRlbSB7XG4iCi0gICAgICAiICByZXF1aXJlZCBzdHJpbmcga2V5ID0gMTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAibWVzc2FnZSBNYXAge1xuIgotICAgICAgIiAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5ID0gXCJrZXlcIl07XG4iCi0gICAgICAifVxuIgotICAgICAgKTsKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBpbXBvcnRlcl8uSW1wb3J0KCJtYXAucHJvdG8iKTsKLSAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKSA8PCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfOwotICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOwotCi0gIC8vIENoZWNrIHRoYXQgTWFwOjppdGVtcyBwb2ludHMgdG8gSXRlbTo6a2V5Ci0gIGNvbnN0IERlc2NyaXB0b3IqIGl0ZW1fdHlwZSA9IGZpbGUtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiSXRlbSIpOwotICBBU1NFUlRfVFJVRShpdGVtX3R5cGUgIT0gTlVMTCk7Ci0gIGNvbnN0IERlc2NyaXB0b3IqIG1hcF90eXBlID0gZmlsZS0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJNYXAiKTsKLSAgQVNTRVJUX1RSVUUobWFwX3R5cGUgIT0gTlVMTCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5X2ZpZWxkID0gaXRlbV90eXBlLT5GaW5kRmllbGRCeU5hbWUoImtleSIpOwotICBBU1NFUlRfVFJVRShrZXlfZmllbGQgIT0gTlVMTCk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaXRlbXNfZmllbGQgPSBtYXBfdHlwZS0+RmluZEZpZWxkQnlOYW1lKCJpdGVtcyIpOwotICBBU1NFUlRfVFJVRShpdGVtc19maWVsZCAhPSBOVUxMKTsKLSAgRVhQRUNUX0VRKGl0ZW1zX2ZpZWxkLT5leHBlcmltZW50YWxfbWFwX2tleSgpLCBrZXlfZmllbGQpOwotfQotCi1URVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZE5vdFJlcGVhdGVkKSB7Ci0gIEFkZEZpbGUoCi0gICAgICAibWFwLnByb3RvIiwKLSAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICAgIm1lc3NhZ2UgSXRlbSB7XG4iCi0gICAgICAiICByZXF1aXJlZCBzdHJpbmcga2V5ID0gMTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAibWVzc2FnZSBNYXAge1xuIgotICAgICAgIiAgcmVxdWlyZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5ID0gXCJrZXlcIl07XG4iCi0gICAgICAifVxuIgotICAgICAgKTsKLSAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9TVUJTVFJJTkcoIm9ubHkgYWxsb3dlZCBmb3IgcmVwZWF0ZWQgZmllbGRzIiwgZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihJbXBvcnRlclRlc3QsIE1hcEZpZWxkTm90TWVzc2FnZVR5cGUpIHsKLSAgQWRkRmlsZSgKLSAgICAgICJtYXAucHJvdG8iLAotICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAibWVzc2FnZSBNYXAge1xuIgotICAgICAgIiAgcmVwZWF0ZWQgaW50MzIgaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwia2V5XCJdO1xuIgotICAgICAgIn1cbiIKLSAgICAgICk7Ci0gIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoIm1hcC5wcm90byIpID09IE5VTEwpOwotICBFWFBFQ1RfU1VCU1RSSU5HKCJvbmx5IGFsbG93ZWQgZm9yIGZpZWxkcyB3aXRoIGEgbWVzc2FnZSB0eXBlIiwgZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihJbXBvcnRlclRlc3QsIE1hcEZpZWxkVHlwZU5vdEZvdW5kKSB7Ci0gIEFkZEZpbGUoCi0gICAgICAibWFwLnByb3RvIiwKLSAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICAgIm1lc3NhZ2UgTWFwIHtcbiIKLSAgICAgICIgIHJlcGVhdGVkIFVua25vd24gaXRlbXMgPSAxIFtleHBlcmltZW50YWxfbWFwX2tleSA9IFwia2V5XCJdO1xuIgotICAgICAgIn1cbiIKLSAgICAgICk7Ci0gIEVYUEVDVF9UUlVFKGltcG9ydGVyXy5JbXBvcnQoIm1hcC5wcm90byIpID09IE5VTEwpOwotICBFWFBFQ1RfU1VCU1RSSU5HKCJub3QgZGVmaW5lZCIsIGVycm9yKCkpOwotfQotCi1URVNUX0YoSW1wb3J0ZXJUZXN0LCBNYXBGaWVsZEtleU5vdEZvdW5kKSB7Ci0gIEFkZEZpbGUoCi0gICAgICAibWFwLnByb3RvIiwKLSAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICAgIm1lc3NhZ2UgSXRlbSB7XG4iCi0gICAgICAiICByZXF1aXJlZCBzdHJpbmcga2V5ID0gMTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAibWVzc2FnZSBNYXAge1xuIgotICAgICAgIiAgcmVwZWF0ZWQgSXRlbSBpdGVtcyA9IDEgW2V4cGVyaW1lbnRhbF9tYXBfa2V5ID0gXCJiYWRrZXlcIl07XG4iCi0gICAgICAifVxuIgotICAgICAgKTsKLSAgRVhQRUNUX1RSVUUoaW1wb3J0ZXJfLkltcG9ydCgibWFwLnByb3RvIikgPT0gTlVMTCk7Ci0gIEVYUEVDVF9TVUJTVFJJTkcoIkNvdWxkIG5vdCBmaW5kIGZpZWxkIiwgZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihJbXBvcnRlclRlc3QsIE1hcEZpZWxkS2V5UmVwZWF0ZWQpIHsKLSAgQWRkRmlsZSgKLSAgICAgICJtYXAucHJvdG8iLAotICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAibWVzc2FnZSBJdGVtIHtcbiIKLSAgICAgICIgIHJlcGVhdGVkIHN0cmluZyBrZXkgPSAxO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJtZXNzYWdlIE1hcCB7XG4iCi0gICAgICAiICByZXBlYXRlZCBJdGVtIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXkgPSBcImtleVwiXTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICApOwotICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJtYXAucHJvdG8iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1NVQlNUUklORygibXVzdCBub3QgbmFtZSBhIHJlcGVhdGVkIGZpZWxkIiwgZXJyb3IoKSk7Ci19Ci0KLVRFU1RfRihJbXBvcnRlclRlc3QsIE1hcEZpZWxkS2V5Tm90U2NhbGFyKSB7Ci0gIEFkZEZpbGUoCi0gICAgICAibWFwLnByb3RvIiwKLSAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICAgIm1lc3NhZ2UgSXRlbUtleSB7IH1cbiIKLSAgICAgICJtZXNzYWdlIEl0ZW0ge1xuIgotICAgICAgIiAgcmVxdWlyZWQgSXRlbUtleSBrZXkgPSAxO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJtZXNzYWdlIE1hcCB7XG4iCi0gICAgICAiICByZXBlYXRlZCBJdGVtIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXkgPSBcImtleVwiXTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICApOwotICBFWFBFQ1RfVFJVRShpbXBvcnRlcl8uSW1wb3J0KCJtYXAucHJvdG8iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1NVQlNUUklORygibXVzdCBuYW1lIGEgc2NhbGFyIG9yIHN0cmluZyIsIGVycm9yKCkpOwotfQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTMzMywzMCArMjQzLDMyIEBACiAgICAgZGlybmFtZXNfLnB1c2hfYmFjayhUZXN0VGVtcERpcigpICsgIi90ZXN0X3Byb3RvMl9pbXBvcnRfcGF0aF8yIik7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGRpcm5hbWVzXy5zaXplKCk7IGkrKykgewotICAgICAgaWYgKEZpbGU6OkV4aXN0cyhkaXJuYW1lc19baV0pKSB7CisgICAgICBpZiAoRmlsZUV4aXN0cyhkaXJuYW1lc19baV0pKSB7CiAgICAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGRpcm5hbWVzX1tpXSwgTlVMTCwgTlVMTCk7CiAgICAgICB9Ci0gICAgICBHT09HTEVfQ0hFQ0soRmlsZTo6Q3JlYXRlRGlyKGRpcm5hbWVzX1tpXS5jX3N0cigpLCBERUZBVUxUX0ZJTEVfTU9ERSkpOworICAgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkNyZWF0ZURpcihkaXJuYW1lc19baV0sIDA3NzcpKTsKICAgICB9CiAgIH0KIAogICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkaXJuYW1lc18uc2l6ZSgpOyBpKyspIHsKLSAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGRpcm5hbWVzX1tpXSwgTlVMTCwgTlVMTCk7CisgICAgICBpZiAoRmlsZUV4aXN0cyhkaXJuYW1lc19baV0pKSB7CisgICAgICAgIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGRpcm5hbWVzX1tpXSwgTlVMTCwgTlVMTCk7CisgICAgICB9CiAgICAgfQogICB9CiAKICAgdm9pZCBBZGRGaWxlKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IGNoYXIqIGNvbnRlbnRzKSB7Ci0gICAgRmlsZTo6V3JpdGVTdHJpbmdUb0ZpbGVPckRpZShjb250ZW50cywgZmlsZW5hbWUpOworICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpTZXRDb250ZW50cyhmaWxlbmFtZSwgY29udGVudHMsIHRydWUpKTsKICAgfQogCiAgIHZvaWQgQWRkU3ViZGlyKGNvbnN0IHN0cmluZyYgZGlybmFtZSkgewotICAgIEdPT0dMRV9DSEVDSyhGaWxlOjpDcmVhdGVEaXIoZGlybmFtZS5jX3N0cigpLCBERUZBVUxUX0ZJTEVfTU9ERSkpOworICAgIEdPT0dMRV9DSEVDS19PSyhGaWxlOjpDcmVhdGVEaXIoZGlybmFtZSwgMDc3NykpOwogICB9CiAKICAgdm9pZCBFeHBlY3RGaWxlQ29udGVudHMoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfY29udGVudHMpIHsKLSAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBpbnB1dChzb3VyY2VfdHJlZV8uT3BlbihmaWxlbmFtZSkpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IGlucHV0KHNvdXJjZV90cmVlXy5PcGVuKGZpbGVuYW1lKSk7CiAKICAgICBBU1NFUlRfRkFMU0UoaW5wdXQgPT0gTlVMTCk7CiAKQEAgLTM3MSw5ICsyODMsMTEgQEAKICAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfY29udGVudHMsIGZpbGVfY29udGVudHMpOwogICB9CiAKLSAgdm9pZCBFeHBlY3RGaWxlTm90Rm91bmQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgewotICAgIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5SW5wdXRTdHJlYW0+IGlucHV0KHNvdXJjZV90cmVlXy5PcGVuKGZpbGVuYW1lKSk7CisgIHZvaWQgRXhwZWN0Q2Fubm90T3BlbkZpbGUoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGVycm9yX21lc3NhZ2UpIHsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiBpbnB1dChzb3VyY2VfdHJlZV8uT3BlbihmaWxlbmFtZSkpOwogICAgIEVYUEVDVF9UUlVFKGlucHV0ID09IE5VTEwpOworICAgIEVYUEVDVF9FUShlcnJvcl9tZXNzYWdlLCBzb3VyY2VfdHJlZV8uR2V0TGFzdEVycm9yTWVzc2FnZSgpKTsKICAgfQogCiAgIERpc2tTb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKQEAgLTM4OSw3ICszMDMsNyBAQAogICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdKTsKIAogICBFeHBlY3RGaWxlQ29udGVudHMoImZvbyIsICJIZWxsbyBXb3JsZCEiKTsKLSAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXIiKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhciIsICJGaWxlIG5vdCBmb3VuZC4iKTsKIH0KIAogVEVTVF9GKERpc2tTb3VyY2VUcmVlVGVzdCwgTWFwRGlyZWN0b3J5KSB7CkBAIC00MDAsMTUgKzMxNCwyMSBAQAogICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiYmF6IiwgZGlybmFtZXNfWzBdKTsKIAogICBFeHBlY3RGaWxlQ29udGVudHMoImJhei9mb28iLCAiSGVsbG8gV29ybGQhIik7Ci0gIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmF6L2JhciIpOwotICBFeHBlY3RGaWxlTm90Rm91bmQoImZvbyIpOwotICBFeHBlY3RGaWxlTm90Rm91bmQoImJhciIpOworICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmF6L2JhciIsICJGaWxlIG5vdCBmb3VuZC4iKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImZvbyIsICJGaWxlIG5vdCBmb3VuZC4iKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhciIsICJGaWxlIG5vdCBmb3VuZC4iKTsKIAogICAvLyBOb24tY2Fub25pY2FsIGZpbGUgbmFtZXMgc2hvdWxkIG5vdCB3b3JrLgotICBFeHBlY3RGaWxlTm90Rm91bmQoImJhei8vZm9vIik7Ci0gIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmF6Ly4uL2Jhei9mb28iKTsKLSAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXovLi9mb28iKTsKLSAgRXhwZWN0RmlsZU5vdEZvdW5kKCJiYXovZm9vLyIpOworICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmF6Ly9mb28iLAorICAgICAgICAgICAgICAgICAgICAgICAiQmFja3NsYXNoZXMsIGNvbnNlY3V0aXZlIHNsYXNoZXMsIFwiLlwiLCBvciBcIi4uXCIgYXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGxvd2VkIGluIHRoZSB2aXJ0dWFsIHBhdGgiKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhei8uLi9iYXovZm9vIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIkJhY2tzbGFzaGVzLCBjb25zZWN1dGl2ZSBzbGFzaGVzLCBcIi5cIiwgb3IgXCIuLlwiIGFyZSAiCisgICAgICAgICAgICAgICAgICAgICAgICJub3QgYWxsb3dlZCBpbiB0aGUgdmlydHVhbCBwYXRoIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXovLi9mb28iLAorICAgICAgICAgICAgICAgICAgICAgICAiQmFja3NsYXNoZXMsIGNvbnNlY3V0aXZlIHNsYXNoZXMsIFwiLlwiLCBvciBcIi4uXCIgYXJlICIKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vdCBhbGxvd2VkIGluIHRoZSB2aXJ0dWFsIHBhdGgiKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoImJhei9mb28vIiwgIkZpbGUgbm90IGZvdW5kLiIpOwogfQogCiBURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBOb1BhcmVudCkgewpAQCAtNDIwLDggKzM0MCwxMiBAQAogICBzb3VyY2VfdHJlZV8uTWFwUGF0aCgiIiwgZGlybmFtZXNfWzBdICsgIi9iYXIiKTsKIAogICBFeHBlY3RGaWxlQ29udGVudHMoImJheiIsICJCbGFoLiIpOwotICBFeHBlY3RGaWxlTm90Rm91bmQoIi4uL2ZvbyIpOwotICBFeHBlY3RGaWxlTm90Rm91bmQoIi4uL2Jhci9iYXoiKTsKKyAgRXhwZWN0Q2Fubm90T3BlbkZpbGUoIi4uL2ZvbyIsCisgICAgICAgICAgICAgICAgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCIpOworICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiLi4vYmFyL2JheiIsCisgICAgICAgICAgICAgICAgICAgICAgICJCYWNrc2xhc2hlcywgY29uc2VjdXRpdmUgc2xhc2hlcywgXCIuXCIsIG9yIFwiLi5cIiBhcmUgIgorICAgICAgICAgICAgICAgICAgICAgICAibm90IGFsbG93ZWQgaW4gdGhlIHZpcnR1YWwgcGF0aCIpOwogfQogCiBURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBNYXBGaWxlKSB7CkBAIC00MzEsNyArMzU1LDcgQEAKICAgc291cmNlX3RyZWVfLk1hcFBhdGgoImZvbyIsIGRpcm5hbWVzX1swXSArICIvZm9vIik7CiAKICAgRXhwZWN0RmlsZUNvbnRlbnRzKCJmb28iLCAiSGVsbG8gV29ybGQhIik7Ci0gIEV4cGVjdEZpbGVOb3RGb3VuZCgiYmFyIik7CisgIEV4cGVjdENhbm5vdE9wZW5GaWxlKCJiYXIiLCAiRmlsZSBub3QgZm91bmQuIik7CiB9CiAKIFRFU1RfRihEaXNrU291cmNlVHJlZVRlc3QsIFNlYXJjaE11bHRpcGxlRGlyZWN0b3JpZXMpIHsKQEAgLTQ0NSw3ICszNjksNyBAQAogCiAgIEV4cGVjdEZpbGVDb250ZW50cygiZm9vIiwgIkhlbGxvIFdvcmxkISIpOwogICBFeHBlY3RGaWxlQ29udGVudHMoImJhciIsICJHb29kYnllIFdvcmxkISIpOwotICBFeHBlY3RGaWxlTm90Rm91bmQoImJheiIpOworICBFeHBlY3RDYW5ub3RPcGVuRmlsZSgiYmF6IiwgIkZpbGUgbm90IGZvdW5kLiIpOwogfQogCiBURVNUX0YoRGlza1NvdXJjZVRyZWVUZXN0LCBPcmRlcmluZ1RydW1wc1NwZWNpZmljaXR5KSB7CkBAIC00NTMsOCArMzc3LDcgQEAKICAgLy8gZGlyZWN0b3J5IGlzIG1vcmUtc3BlY2lmaWMgdGhhbiBhIGZvcm1lciBvbmUuCiAKICAgLy8gQ3JlYXRlIHRoZSAiYmFyIiBkaXJlY3Rvcnkgc28gd2UgY2FuIHB1dCBhIGZpbGUgaW4gaXQuCi0gIEFTU0VSVF9UUlVFKEZpbGU6OkNyZWF0ZURpcigoZGlybmFtZXNfWzBdICsgIi9iYXIiKS5jX3N0cigpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgREVGQVVMVF9GSUxFX01PREUpKTsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkNyZWF0ZURpcihkaXJuYW1lc19bMF0gKyAiL2JhciIsIDA3NzcpKTsKIAogICAvLyBBZGQgZmlsZXMgYW5kIG1hcCBwYXRocy4KICAgQWRkRmlsZShkaXJuYW1lc19bMF0gKyAiL2Jhci9mb28iLCAiSGVsbG8gV29ybGQhIik7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfY29udGV4dC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0LmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0LmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50LmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZG9jX2NvbW1lbnRfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudF91bml0dGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYwppbmRleCA5ZDdiY2FiLi45NDdiODBlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsOCArMzUsMTEgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgpAQCAtNDYsOCArNDksMjMgQEAKIG5hbWVzcGFjZSBjb21waWxlciB7CiBuYW1lc3BhY2UgamF2YSB7CiAKLUVudW1HZW5lcmF0b3I6OkVudW1HZW5lcmF0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvcikgeworbmFtZXNwYWNlIHsKK2Jvb2wgRW51bUhhc0N1c3RvbU9wdGlvbnMoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgaWYgKGRlc2NyaXB0b3ItPm9wdGlvbnMoKS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT52YWx1ZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGRlc2NyaXB0b3ItPnZhbHVlKGkpOworICAgIGlmICh2YWx1ZS0+b3B0aW9ucygpLnVua25vd25fZmllbGRzKCkuZmllbGRfY291bnQoKSA+IDApIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KK30gIC8vIG5hbWVzcGFjZQorCitFbnVtR2VuZXJhdG9yOjpFbnVtR2VuZXJhdG9yKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIGltbXV0YWJsZV9hcGlfKGltbXV0YWJsZV9hcGkpLAorICAgIGNvbnRleHRfKGNvbnRleHQpLAorICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSAgewogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT52YWx1ZV9jb3VudCgpOyBpKyspIHsKICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKTsKICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBjYW5vbmljYWxfdmFsdWUgPQpAQCAtNjcsMjYgKzg1LDQ3IEBACiBFbnVtR2VuZXJhdG9yOjp+RW51bUdlbmVyYXRvcigpIHt9CiAKIHZvaWQgRW51bUdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInB1YmxpYyBlbnVtICRjbGFzc25hbWUkXG4iCi0gICAgICAiICAgIGltcGxlbWVudHMgY29tLmdvb2dsZS5wcm90b2J1Zi5Qcm90b2NvbE1lc3NhZ2VFbnVtIHtcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gIH0gZWxzZSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAicHVibGljIGVudW0gJGNsYXNzbmFtZSRcbiIKLSAgICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlIHtcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gIH0KKyAgV3JpdGVFbnVtRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KAorICAgICJwdWJsaWMgZW51bSAkY2xhc3NuYW1lJFxuIgorICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlByb3RvY29sTWVzc2FnZUVudW0ge1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CiAgIHByaW50ZXItPkluZGVudCgpOwogCisgIGJvb2wgb3JkaW5hbF9pc19pbmRleCA9IHRydWU7CisgIHN0cmluZyBpbmRleF90ZXh0ID0gIm9yZGluYWwoKSI7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgY2Fub25pY2FsX3ZhbHVlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBpZiAoY2Fub25pY2FsX3ZhbHVlc19baV0tPmluZGV4KCkgIT0gaSkgeworICAgICAgb3JkaW5hbF9pc19pbmRleCA9IGZhbHNlOworICAgICAgaW5kZXhfdGV4dCA9ICJpbmRleCI7CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKwogICBmb3IgKGludCBpID0gMDsgaSA8IGNhbm9uaWNhbF92YWx1ZXNfLnNpemUoKTsgaSsrKSB7CiAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwogICAgIHZhcnNbIm5hbWUiXSA9IGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5uYW1lKCk7CiAgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoY2Fub25pY2FsX3ZhbHVlc19baV0tPmluZGV4KCkpOwogICAgIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShjYW5vbmljYWxfdmFsdWVzX1tpXS0+bnVtYmVyKCkpOwotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiJG5hbWUkKCRpbmRleCQsICRudW1iZXIkKSxcbiIpOworICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBjYW5vbmljYWxfdmFsdWVzX1tpXSk7CisgICAgaWYgKGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5vcHRpb25zKCkuZGVwcmVjYXRlZCgpKSB7CisgICAgICBwcmludGVyLT5QcmludCgiQGphdmEubGFuZy5EZXByZWNhdGVkXG4iKTsKKyAgICB9CisgICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICIkbmFtZSQoJG51bWJlciQpLFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAgICIkbmFtZSQoJGluZGV4JCwgJG51bWJlciQpLFxuIik7CisgICAgfQorICB9CisKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJVTlJFQ09HTklaRUQoLTEpLFxuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJVTlJFQ09HTklaRUQoLTEsIC0xKSxcbiIpOworICAgIH0KICAgfQogCiAgIHByaW50ZXItPlByaW50KApAQCAtMTAwLDYgKzEzOSw3IEBACiAgICAgdmFyc1siY2xhc3NuYW1lIl0gPSBkZXNjcmlwdG9yXy0+bmFtZSgpOwogICAgIHZhcnNbIm5hbWUiXSA9IGFsaWFzZXNfW2ldLnZhbHVlLT5uYW1lKCk7CiAgICAgdmFyc1siY2Fub25pY2FsX25hbWUiXSA9IGFsaWFzZXNfW2ldLmNhbm9uaWNhbF92YWx1ZS0+bmFtZSgpOworICAgIFdyaXRlRW51bVZhbHVlRG9jQ29tbWVudChwcmludGVyLCBhbGlhc2VzX1tpXS52YWx1ZSk7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsICRjbGFzc25hbWUkICRuYW1lJCA9ICRjYW5vbmljYWxfbmFtZSQ7XG4iKTsKICAgfQpAQCAtMTA4LDYgKzE0OCw3IEBACiAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwogICAgIHZhcnNbIm5hbWUiXSA9IGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpOwogICAgIHZhcnNbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+dmFsdWUoaSktPm51bWJlcigpKTsKKyAgICBXcml0ZUVudW1WYWx1ZURvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8tPnZhbHVlKGkpKTsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRuYW1lJF9WQUxVRSA9ICRudW1iZXIkO1xuIik7CiAgIH0KQEAgLTExNyw5ICsxNTgsMzUgQEAKIAogICBwcmludGVyLT5QcmludCgKICAgICAiXG4iCi0gICAgInB1YmxpYyBmaW5hbCBpbnQgZ2V0TnVtYmVyKCkgeyByZXR1cm4gdmFsdWU7IH1cbiIKKyAgICAicHVibGljIGZpbmFsIGludCBnZXROdW1iZXIoKSB7XG4iKTsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgaWYgKG9yZGluYWxfaXNfaW5kZXgpIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICBpZiAodGhpcyA9PSBVTlJFQ09HTklaRUQpIHtcbiIKKyAgICAgICAgIiAgICB0aHJvdyBuZXcgamF2YS5sYW5nLklsbGVnYWxBcmd1bWVudEV4Y2VwdGlvbihcbiIKKyAgICAgICAgIiAgICAgICAgXCJDYW4ndCBnZXQgdGhlIG51bWJlciBvZiBhbiB1bmtub3duIGVudW0gdmFsdWUuXCIpO1xuIgorICAgICAgICAiICB9XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIGlmIChpbmRleCA9PSAtMSkge1xuIgorICAgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgorICAgICAgICAiICAgICAgICBcIkNhbid0IGdldCB0aGUgbnVtYmVyIG9mIGFuIHVua25vd24gZW51bSB2YWx1ZS5cIik7XG4iCisgICAgICAgICIgIH1cbiIpOworICAgIH0KKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAiICByZXR1cm4gdmFsdWU7XG4iCisgICAgIn1cbiIKICAgICAiXG4iCisgICAgIi8qKlxuIgorICAgICIgKiBAZGVwcmVjYXRlZCBVc2Uge0BsaW5rICNmb3JOdW1iZXIoaW50KX0gaW5zdGVhZC5cbiIKKyAgICAiICovXG4iCisgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgogICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHZhbHVlT2YoaW50IHZhbHVlKSB7XG4iCisgICAgIiAgcmV0dXJuIGZvck51bWJlcih2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZm9yTnVtYmVyKGludCB2YWx1ZSkge1xuIgogICAgICIgIHN3aXRjaCAodmFsdWUpIHtcbiIsCiAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwogICBwcmludGVyLT5JbmRlbnQoKTsKQEAgLTE0MywxMSArMjEwLDExIEBACiAgICAgIiAgICBpbnRlcm5hbEdldFZhbHVlTWFwKCkge1xuIgogICAgICIgIHJldHVybiBpbnRlcm5hbFZhbHVlTWFwO1xuIgogICAgICJ9XG4iCi0gICAgInByaXZhdGUgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8JGNsYXNzbmFtZSQ+XG4iCi0gICAgIiAgICBpbnRlcm5hbFZhbHVlTWFwID1cbiIKKyAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5FbnVtTGl0ZU1hcDxcbiIKKyAgICAiICAgICRjbGFzc25hbWUkPiBpbnRlcm5hbFZhbHVlTWFwID1cbiIKICAgICAiICAgICAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuRW51bUxpdGVNYXA8JGNsYXNzbmFtZSQ+KCkge1xuIgogICAgICIgICAgICAgIHB1YmxpYyAkY2xhc3NuYW1lJCBmaW5kVmFsdWVCeU51bWJlcihpbnQgbnVtYmVyKSB7XG4iCi0gICAgIiAgICAgICAgICByZXR1cm4gJGNsYXNzbmFtZSQudmFsdWVPZihudW1iZXIpO1xuIgorICAgICIgICAgICAgICAgcmV0dXJuICRjbGFzc25hbWUkLmZvck51bWJlcihudW1iZXIpO1xuIgogICAgICIgICAgICAgIH1cbiIKICAgICAiICAgICAgfTtcbiIKICAgICAiXG4iLApAQCAtMTU2LDcyICsyMjMsMTQ1IEBACiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIFJlZmxlY3Rpb24KIAotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvclxuIgogICAgICAgIiAgICBnZXRWYWx1ZURlc2NyaXB0b3IoKSB7XG4iCi0gICAgICAiICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpLmdldChpbmRleCk7XG4iCisgICAgICAiICByZXR1cm4gZ2V0RGVzY3JpcHRvcigpLmdldFZhbHVlcygpLmdldCgkaW5kZXhfdGV4dCQpO1xuIgogICAgICAgIn1cbiIKICAgICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvclxuIgogICAgICAgIiAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHtcbiIKICAgICAgICIgIHJldHVybiBnZXREZXNjcmlwdG9yKCk7XG4iCiAgICAgICAifVxuIgogICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5FbnVtRGVzY3JpcHRvclxuIgotICAgICAgIiAgICBnZXREZXNjcmlwdG9yKCkge1xuIik7CisgICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iLAorICAgICAgImluZGV4X3RleHQiLCBpbmRleF90ZXh0KTsKIAogICAgIC8vIFRPRE8oa2VudG9uKTogIENhY2hlIHN0YXRpY2FsbHk/ICBOb3RlIHRoYXQgd2UgY2FuJ3QgYWNjZXNzIGRlc2NyaXB0b3JzCiAgICAgLy8gICBhdCBtb2R1bGUgaW5pdCB0aW1lIGJlY2F1c2UgaXQgd291bGRuJ3Qgd29yayB3aXRoIGRlc2NyaXB0b3IucHJvdG8sIGJ1dAogICAgIC8vICAgd2UgY2FuIGNhY2hlIHRoZSB2YWx1ZSB0aGUgZmlyc3QgdGltZSBnZXREZXNjcmlwdG9yKCkgaXMgY2FsbGVkLgogICAgIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIgIHJldHVybiAkZmlsZSQuZ2V0RGVzY3JpcHRvcigpLmdldEVudW1UeXBlcygpLmdldCgkaW5kZXgkKTtcbiIsCi0gICAgICAgICJmaWxlIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAotICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgICAgICBpZiAoIU11bHRpcGxlSmF2YUZpbGVzKGRlc2NyaXB0b3JfLT5maWxlKCksIGltbXV0YWJsZV9hcGlfKSkgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiICByZXR1cm4gJGZpbGUkLmdldERlc2NyaXB0b3IoKS5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAorICAgICAgICAgICJmaWxlIiwgbmFtZV9yZXNvbHZlcl8tPkdldENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW11dGFibGVfYXBpXyksCisgICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICAgIGlmIChFbnVtSGFzQ3VzdG9tT3B0aW9ucyhkZXNjcmlwdG9yXykpIHsKKyAgICAgICAgICAvLyBXZSBuZWVkIHRvIGxvYWQgdGhlIGltbXV0YWJsZSBjbGFzc2VzIGluIG9yZGVyIHRvIHBhcnNlIGN1c3RvbQorICAgICAgICAgIC8vIG9wdGlvbnMuIEhvd2V2ZXIsIHNpbmNlIGZpbGUgbGV2ZWwgZW51bXMgKG5vIG91dGVyIGNsYXNzKSBhcmUKKyAgICAgICAgICAvLyBzaGFyZWQgYnkgaW1tdXRhYmxlIGNvZGUgYW5kIG11dGFibGUgY29kZSwgdGhlIGltbXV0YWJsZSBjbGFzc2VzCisgICAgICAgICAgLy8gbWF5IG5vdCBleGlzdC4gU28gd2UgdHJ5IHRvIHVzZSBKYXZhIHJlZmxlY3Rpb24gdG8gcmV0cmlldmUgdGhlCisgICAgICAgICAgLy8gZGVzY3JpcHRvciBmcm9tIGltbXV0YWJsZSBjbGFzc2VzLgorICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgInRyeSB7XG4iCisgICAgICAgICAgICAiICBqYXZhLmxhbmcuQ2xhc3MgaW1tdXRhYmxlRmlsZUNsYXNzID1cbiIKKyAgICAgICAgICAgICIgICAgICBqYXZhLmxhbmcuQ2xhc3MuZm9yTmFtZShcIiRpbW11dGFibGVfZmlsZV9jbGFzc19uYW1lJFwiKTtcbiIKKyAgICAgICAgICAgICIgIEBqYXZhLmxhbmcuU3VwcHJlc3NXYXJuaW5ncyhcInVuY2hlY2tlZFwiKVxuIgorICAgICAgICAgICAgIiAgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kIG0gPVxuIgorICAgICAgICAgICAgIiAgICAgIGltbXV0YWJsZUZpbGVDbGFzcy5nZXRNZXRob2QoXCJnZXREZXNjcmlwdG9yXCIpO1xuIgorICAgICAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciBmaWxlID1cbiIKKyAgICAgICAgICAgICIgICAgICAoY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcilcbiIKKyAgICAgICAgICAgICIgICAgICAgICAgbS5pbnZva2UoaW1tdXRhYmxlRmlsZUNsYXNzKTtcbiIKKyAgICAgICAgICAgICIgIHJldHVybiBmaWxlLmdldEVudW1UeXBlcygpLmdldCgkaW5kZXgkKTtcbiIKKyAgICAgICAgICAgICJ9IGNhdGNoIChqYXZhLmxhbmcuRXhjZXB0aW9uIGUpIHtcbiIKKyAgICAgICAgICAgIC8vIEltbXV0YWJsZSBjbGFzc2VzIGNhbm5vdCBiZSBmb3VuZC4gUHJvY2VlZCBhcyBpZiBjdXN0b20gb3B0aW9ucworICAgICAgICAgICAgLy8gZG9uJ3QgZXhpc3QuCisgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICJpbW11dGFibGVfZmlsZV9jbGFzc19uYW1lIiwKKyAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgICAgICAgIH0KKyAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgInJldHVybiAkaW1tdXRhYmxlX3BhY2thZ2UkLiRkZXNjcmlwdG9yX2NsYXNzJC4kZGVzY3JpcHRvciRcbiIKKyAgICAgICAgICAiICAgIC5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAorICAgICAgICAgICJpbW11dGFibGVfcGFja2FnZSIsIEZpbGVKYXZhUGFja2FnZShkZXNjcmlwdG9yXy0+ZmlsZSgpLCB0cnVlKSwKKyAgICAgICAgICAiZGVzY3JpcHRvcl9jbGFzcyIsCisgICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldERlc2NyaXB0b3JDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgICAgICAgImRlc2NyaXB0b3IiLCAiZ2V0RGVzY3JpcHRvcigpIiwKKyAgICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIgIHJldHVybiAkcGFyZW50JC5nZXREZXNjcmlwdG9yKCkuZ2V0RW51bVR5cGVzKCkuZ2V0KCRpbmRleCQpO1xuIiwKLSAgICAgICAgInBhcmVudCIsIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpLAotICAgICAgICAiaW5kZXgiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKSk7CisgICAgICAgICAgIiAgcmV0dXJuICRwYXJlbnQkLiRkZXNjcmlwdG9yJC5nZXRFbnVtVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iLAorICAgICAgICAgICJwYXJlbnQiLCBuYW1lX3Jlc29sdmVyXy0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbW11dGFibGVfYXBpXyksCisgICAgICAgICAgImRlc2NyaXB0b3IiLCBkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgICAgLm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKQorICAgICAgICAgICAgICAgICAgICAgICAgPyAiZ2V0RGVmYXVsdEluc3RhbmNlKCkuZ2V0RGVzY3JpcHRvckZvclR5cGUoKSIKKyAgICAgICAgICAgICAgICAgICAgICAgIDogImdldERlc2NyaXB0b3IoKSIsCisgICAgICAgICAgImluZGV4IiwgU2ltcGxlSXRvYShkZXNjcmlwdG9yXy0+aW5kZXgoKSkpOwogICAgIH0KIAogICAgIHByaW50ZXItPlByaW50KAogICAgICAgIn1cbiIKICAgICAgICJcbiIKLSAgICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJFtdIFZBTFVFUyA9IHtcbiIKLSAgICAgICIgICIsCisgICAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgJGNsYXNzbmFtZSRbXSBWQUxVRVMgPSAiLAogICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwogCi0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgiJG5hbWUkLCAiLAotICAgICAgICAibmFtZSIsIGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpKTsKKyAgICBpZiAoQ2FuVXNlRW51bVZhbHVlcygpKSB7CisgICAgICAvLyBJZiB0aGUgY29uc3RhbnRzIHdlIGFyZSBnb2luZyB0byBvdXRwdXQgYXJlIGV4YWN0bHkgdGhlIG9uZXMgd2UKKyAgICAgIC8vIGhhdmUgZGVjbGFyZWQgaW4gdGhlIEphdmEgZW51bSBpbiB0aGUgc2FtZSBvcmRlciwgdGhlbiB3ZSBjYW4gdXNlCisgICAgICAvLyB0aGUgdmFsdWVzKCkgbWV0aG9kIHRoYXQgdGhlIEphdmEgY29tcGlsZXIgYXV0b21hdGljYWxseSBnZW5lcmF0ZXMKKyAgICAgIC8vIGZvciBldmVyeSBlbnVtLgorICAgICAgcHJpbnRlci0+UHJpbnQoInZhbHVlcygpO1xuIik7CisgICAgfSBlbHNlIHsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAie1xuIgorICAgICAgICAiICAiKTsKKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCk7IGkrKykgeworICAgICAgICBwcmludGVyLT5QcmludCgiJG5hbWUkLCAiLAorICAgICAgICAgICJuYW1lIiwgZGVzY3JpcHRvcl8tPnZhbHVlKGkpLT5uYW1lKCkpOworICAgICAgfQorICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIlxuIgorICAgICAgICAgICJ9O1xuIik7CiAgICAgfQogCiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiXG4iCi0gICAgICAifTtcbiIKLSAgICAgICJcbiIKICAgICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHZhbHVlT2YoXG4iCiAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRW51bVZhbHVlRGVzY3JpcHRvciBkZXNjKSB7XG4iCiAgICAgICAiICBpZiAoZGVzYy5nZXRUeXBlKCkgIT0gZ2V0RGVzY3JpcHRvcigpKSB7XG4iCiAgICAgICAiICAgIHRocm93IG5ldyBqYXZhLmxhbmcuSWxsZWdhbEFyZ3VtZW50RXhjZXB0aW9uKFxuIgogICAgICAgIiAgICAgIFwiRW51bVZhbHVlRGVzY3JpcHRvciBpcyBub3QgZm9yIHRoaXMgdHlwZS5cIik7XG4iCi0gICAgICAiICB9XG4iCisgICAgICAiICB9XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworICAgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICIgIGlmIChkZXNjLmdldEluZGV4KCkgPT0gLTEpIHtcbiIKKyAgICAgICAgIiAgICByZXR1cm4gVU5SRUNPR05JWkVEO1xuIgorICAgICAgICAiICB9XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiICByZXR1cm4gVkFMVUVTW2Rlc2MuZ2V0SW5kZXgoKV07XG4iCiAgICAgICAifVxuIgotICAgICAgIlxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgICAgICJcbiIpOwogCi0gICAgLy8gaW5kZXggaXMgb25seSB1c2VkIGZvciByZWZsZWN0aW9uOyBsaXRlIGltcGxlbWVudGF0aW9uIGRvZXMgbm90IG5lZWQgaXQKLSAgICBwcmludGVyLT5QcmludCgicHJpdmF0ZSBmaW5hbCBpbnQgaW5kZXg7XG4iKTsKKyAgICBpZiAoIW9yZGluYWxfaXNfaW5kZXgpIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJwcml2YXRlIGZpbmFsIGludCBpbmRleDtcbiIpOworICAgIH0KICAgfQogCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgInByaXZhdGUgZmluYWwgaW50IHZhbHVlO1xuXG4iCi0gICAgInByaXZhdGUgJGNsYXNzbmFtZSQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHtcbiIsCi0gICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgInByaXZhdGUgZmluYWwgaW50IHZhbHVlO1xuXG4iKTsKKworICBpZiAob3JkaW5hbF9pc19pbmRleCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInByaXZhdGUgJGNsYXNzbmFtZSQoaW50IHZhbHVlKSB7XG4iLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInByaXZhdGUgJGNsYXNzbmFtZSQoaW50IGluZGV4LCBpbnQgdmFsdWUpIHtcbiIsCisgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIH0KKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfLCBjb250ZXh0Xy0+RW5mb3JjZUxpdGUoKSkgJiYKKyAgICAgICFvcmRpbmFsX2lzX2luZGV4KSB7CiAgICAgcHJpbnRlci0+UHJpbnQoIiAgdGhpcy5pbmRleCA9IGluZGV4O1xuIik7CiAgIH0KICAgcHJpbnRlci0+UHJpbnQoCkBAIC0yMzcsNiArMzc3LDE4IEBACiAgIHByaW50ZXItPlByaW50KCJ9XG5cbiIpOwogfQogCitib29sIEVudW1HZW5lcmF0b3I6OkNhblVzZUVudW1WYWx1ZXMoKSB7CisgIGlmIChjYW5vbmljYWxfdmFsdWVzXy5zaXplKCkgIT0gZGVzY3JpcHRvcl8tPnZhbHVlX2NvdW50KCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+dmFsdWVfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3JfLT52YWx1ZShpKS0+bmFtZSgpICE9IGNhbm9uaWNhbF92YWx1ZXNfW2ldLT5uYW1lKCkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCiB9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmgKaW5kZXggMDVlY2UxZi4uYTBkOTFmNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW0uaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00MSw2ICs0MSwxMiBAQAogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgbmFtZXNwYWNlIGphdmEgeworICAgICAgY2xhc3MgQ29udGV4dDsgICAgICAgICAgIC8vIGNvbnRleHQuaAorICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7IC8vIG5hbWVfcmVzb2x2ZXIuaAorICAgIH0KKyAgfQogICBuYW1lc3BhY2UgaW8gewogICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAogICB9CkBAIC01Miw3ICs1OCw5IEBACiAKIGNsYXNzIEVudW1HZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgRW51bUdlbmVyYXRvcihjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisgIGV4cGxpY2l0IEVudW1HZW5lcmF0b3IoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbW11dGFibGVfYXBpLAorICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOwogICB+RW51bUdlbmVyYXRvcigpOwogCiAgIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOwpAQCAtNzMsNiArODEsMTMgQEAKICAgfTsKICAgdmVjdG9yPEFsaWFzPiBhbGlhc2VzXzsKIAorICBib29sIGltbXV0YWJsZV9hcGlfOworCisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisKKyAgYm9vbCBDYW5Vc2VFbnVtVmFsdWVzKCk7CisKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1HZW5lcmF0b3IpOwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYwppbmRleCA3MmNhYTEwLi4zZTU0YmUzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsOSArMzUsMTMgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KQEAgLTQ5LDIwICs1MywyMSBAQAogCiBuYW1lc3BhY2UgewogCi0vLyBUT0RPKGtlbnRvbik6ICBGYWN0b3Igb3V0IGEgIlNldENvbW1vbkZpZWxkVmFyaWFibGVzKCkiIHRvIGdldCByaWQgb2YKLS8vICAgcmVwZWF0IGNvZGUgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIgZmllbGQgdHlwZXMuCiB2b2lkIFNldEVudW1WYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7Ci0gICgqdmFyaWFibGVzKVsibmFtZSJdID0KLSAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9Ci0gICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7Ci0gICgqdmFyaWFibGVzKVsidHlwZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpKTsKLSAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcik7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sIHZhcmlhYmxlcyk7CisKKyAgKCp2YXJpYWJsZXMpWyJ0eXBlIl0gPQorICAgICAgbmFtZV9yZXNvbHZlci0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJtdXRhYmxlX3R5cGUiXSA9CisgICAgICBuYW1lX3Jlc29sdmVyLT5HZXRNdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmVudW1fdHlwZSgpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcik7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9udW1iZXIiXSA9IFNpbXBsZUl0b2EoCisgICAgICBkZXNjcmlwdG9yLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpOwogICAoKnZhcmlhYmxlcylbInRhZyJdID0gU2ltcGxlSXRvYShpbnRlcm5hbDo6V2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7CiAgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCiAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yLT5udW1iZXIoKSwgR2V0VHlwZShkZXNjcmlwdG9yKSkpOwpAQCAtNzAsMjM3ICs3NSw1ODAgQEAKICAgLy8gYnkgdGhlIHByb3RvIGNvbXBpbGVyCiAgICgqdmFyaWFibGVzKVsiZGVwcmVjYXRpb24iXSA9IGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5kZXByZWNhdGVkKCkKICAgICAgID8gIkBqYXZhLmxhbmcuRGVwcmVjYXRlZCAiIDogIiI7Ci0gICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0KLSAgICAgIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKSA/ICJvbkNoYW5nZWQoKTsiIDogIiI7CisgICgqdmFyaWFibGVzKVsib25fY2hhbmdlZCJdID0gIm9uQ2hhbmdlZCgpOyI7CiAKLSAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2VzIGFuZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB0aGUgaGFzRmllbGQgYml0LgotICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yLT5maWxlKCkpKSB7CisgICAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2VzIGFuZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB0aGUgaGFzRmllbGQgYml0LgorICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CiAKLSAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7Ci0gICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPQotICAgICAgR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOworICAgIC8vIE5vdGUgdGhhdCB0aGVzZSBoYXZlIGEgdHJhaWxpbmcgIjsiLgorICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0KKyAgICAgICAgR2VuZXJhdGVTZXRCaXQobWVzc2FnZUJpdEluZGV4KSArICI7IjsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7CisgICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9CisgICAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICB9IGVsc2UgeworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gIiI7CisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKKyAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0KKyAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXyAhPSAiICsKKyAgICAgICAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gKyAiLmdldE51bWJlcigpIjsKKyAgfQogCiAgIC8vIEZvciByZXBhdGVkIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZS4KICAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKICAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CiAKKyAgLy8gRm9yIHJlcGVhdGVkIGZpZWxkcywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUKKyAgLy8gaW4gdGhlIHBhcnNpbmcgY29uc3RydWN0b3IuCisgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X3BhcnNlciJdID0KKyAgICAgIEdlbmVyYXRlR2V0Qml0TXV0YWJsZUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X3BhcnNlciJdID0KKyAgICAgIEdlbmVyYXRlU2V0Qml0TXV0YWJsZUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CisKICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsIl0gPQogICAgICAgR2VuZXJhdGVHZXRCaXRGcm9tTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCJdID0KICAgICAgIEdlbmVyYXRlU2V0Qml0VG9Mb2NhbChtZXNzYWdlQml0SW5kZXgpOworCisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yLT5maWxlKCkpKSB7CisgICAgKCp2YXJpYWJsZXMpWyJ1bmtub3duIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXSArICIuVU5SRUNPR05JWkVEIjsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInVua25vd24iXSA9ICgqdmFyaWFibGVzKVsiZGVmYXVsdCJdOworICB9CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLUVudW1GaWVsZEdlbmVyYXRvcjo6Ci1FbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCkKK0ltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CitJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQogICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCi0gICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKLSAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgJnZhcmlhYmxlc18pOworICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSwKKyAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOwogfQogCi1FbnVtRmllbGRHZW5lcmF0b3I6On5FbnVtRmllbGRHZW5lcmF0b3IoKSB7fQorSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjp+SW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKCkge30KIAotaW50IEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CitpbnQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKICAgcmV0dXJuIDE7CiB9CiAKLWludCBFbnVtRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworaW50IEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CiAgIHJldHVybiAxOwogfQogCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKKyAgfQorICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCk7XG4iKTsKKyAgfQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIgogICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CiB9CiAKLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlICR0eXBlJCAkbmFtZSRfO1xuIgotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCi0gICAgIn1cbiIKKyAgICAicHJpdmF0ZSBpbnQgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICAgIn1cbiIpOworICB9CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfO1xuIgorICAgICIgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuZm9yTnVtYmVyKCRuYW1lJF8pO1xuIgorICAgICIgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKICAgICAifVxuIik7CiB9CiAKLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSAkdHlwZSQgJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgotICAgICJ9XG4iCisgICAgInByaXZhdGUgaW50ICRuYW1lJF8gPSAkZGVmYXVsdF9udW1iZXIkO1xuIik7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICAgIn1cbiIpOworICB9CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCisgICAgICAifVxuIik7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCB2YWx1ZSkge1xuIgorICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIgorICAgICIgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuZm9yTnVtYmVyKCRuYW1lJF8pO1xuIgorICAgICIgIHJldHVybiByZXN1bHQgPT0gbnVsbCA/ICR1bmtub3duJCA6IHJlc3VsdDtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKICAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgogICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCiAgICAgIiAgfVxuIgotICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCisgICAgIiAgJG5hbWUkXyA9IHZhbHVlLmdldE51bWJlcigpO1xuIgogICAgICIgICRvbl9jaGFuZ2VkJFxuIgogICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKLSAgICAiICAkbmFtZSRfID0gJGRlZmF1bHQkO1xuIgorICAgICIgICRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCisgICAgIiAgJG5hbWUkXyA9ICRkZWZhdWx0X251bWJlciQ7XG4iCiAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCiAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCiAgICAgIn1cbiIpOwogfQogCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKICAgLy8gbm9vcCBmb3IgZW51bXMKIH0KIAotdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdF9udW1iZXIkO1xuIik7CiB9CiAKLXZvaWQgRW51bUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iCi0gICAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iKTsKKyAgICAiJG5hbWUkXyA9ICRkZWZhdWx0X251bWJlciQ7XG4iCisgICAgIiRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iKTsKIH0KIAotdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKLSAgICAiICBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgotICAgICJ9XG4iKTsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKKyAgICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgICAifVxuIik7CisgIH0gZWxzZSBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChvdGhlci4kbmFtZSRfICE9ICRkZWZhdWx0X251bWJlciQpIHtcbiIKKyAgICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCkpO1xuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCByZWFjaCBoZXJlLiI7CisgIH0KIH0KIAotdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwkO1xuIgorICAgICAgIn1cbiIpOworICB9CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCQpIHtcbiIKLSAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwkO1xuIgotICAgICJ9XG4iCiAgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOwogfQogCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7XG4iCi0gICAgIiR0eXBlJCB2YWx1ZSA9ICR0eXBlJC52YWx1ZU9mKHJhd1ZhbHVlKTtcbiIpOwotICBpZiAoSGFzVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIKLSAgICAgICIgIHVua25vd25GaWVsZHMubWVyZ2VWYXJpbnRGaWVsZCgkbnVtYmVyJCwgcmF3VmFsdWUpO1xuIgotICAgICAgIn0gZWxzZSB7XG4iKTsKKyAgICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgorICAgICAgIiRuYW1lJF8gPSByYXdWYWx1ZTtcbiIpOwogICB9IGVsc2UgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiaWYgKHZhbHVlICE9IG51bGwpIHtcbiIpOworICAgICAgImludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7XG4iCisgICAgICAiJHR5cGUkIHZhbHVlID0gJHR5cGUkLmZvck51bWJlcihyYXdWYWx1ZSk7XG4iCisgICAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIpOworICAgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgIiAgdW5rbm93bkZpZWxkcy5tZXJnZVZhcmludEZpZWxkKCRudW1iZXIkLCByYXdWYWx1ZSk7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkXG4iCisgICAgICAiICAkbmFtZSRfID0gcmF3VmFsdWU7XG4iCisgICAgICAifVxuIik7CiAgIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgotICAgICJ9XG4iKTsKIH0KIAotdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgZW51bXMKK30KKwordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgb3V0cHV0LndyaXRlRW51bSgkbnVtYmVyJCwgJG5hbWUkXy5nZXROdW1iZXIoKSk7XG4iCisgICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgorICAgICIgIG91dHB1dC53cml0ZUVudW0oJG51bWJlciQsICRuYW1lJF8pO1xuIgogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJCkge1xuIgorICAgICJpZiAoJGlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSQpIHtcbiIKICAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKLSAgICAiICAgIC5jb21wdXRlRW51bVNpemUoJG51bWJlciQsICRuYW1lJF8uZ2V0TnVtYmVyKCkpO1xuIgorICAgICIgICAgLmNvbXB1dGVFbnVtU2l6ZSgkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCiAgICAgIn1cbiIpOwogfQogCi12b2lkIEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicmVzdWx0ID0gcmVzdWx0ICYmXG4iCi0gICAgIiAgICAoZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkgPT0gb3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgICAgInJlc3VsdCA9IHJlc3VsdCAmJiAkbmFtZSRfID09IG90aGVyLiRuYW1lJF87XG4iKTsKIH0KIAotdm9pZCBFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCi0gICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGhhc2hFbnVtKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICAgICJoYXNoID0gKDUzICogaGFzaCkgKyAkbmFtZSRfO1xuIik7CiB9CiAKLXN0cmluZyBFbnVtRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCkpOworc3RyaW5nIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgeworICByZXR1cm4gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCkpOwogfQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKLVJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCi0gICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKLSAgU2V0RW51bVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgJnZhcmlhYmxlc18pOworSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgorSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgIGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KSB7CisgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbyA9CisgICAgICBjb250ZXh0LT5HZXRPbmVvZkdlbmVyYXRvckluZm8oZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgJnZhcmlhYmxlc18pOwogfQogCi1SZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCkge30KK0ltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK35JbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpIHt9CiAKLWludCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7Cit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSgpIHtcbiIKKyAgICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAgICIgICAgcmV0dXJuIChqYXZhLmxhbmcuSW50ZWdlcikgJG9uZW9mX25hbWUkXztcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgIHJldHVybiAkZGVmYXVsdF9udW1iZXIkO1xuIgorICAgICAgIn1cbiIpOworICB9CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgICR0eXBlJCByZXN1bHQgPSAkdHlwZSQuZm9yTnVtYmVyKChqYXZhLmxhbmcuSW50ZWdlcikgJG9uZW9mX25hbWUkXyk7XG4iCisgICAgIiAgICByZXR1cm4gcmVzdWx0ID09IG51bGwgPyAkdW5rbm93biQgOiByZXN1bHQ7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiAkZGVmYXVsdCQ7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAifVxuIik7CisgIH0KKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKSB7XG4iCisgICAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgICAiICAgIHJldHVybiAoKGphdmEubGFuZy5JbnRlZ2VyKSAkb25lb2ZfbmFtZSRfKS5pbnRWYWx1ZSgpO1xuIgorICAgICAgIiAgfVxuIgorICAgICAgIiAgcmV0dXJuICRkZWZhdWx0X251bWJlciQ7XG4iCisgICAgICAifVxuIik7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCB2YWx1ZSkge1xuIgorICAgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLmZvck51bWJlcigoamF2YS5sYW5nLkludGVnZXIpICRvbmVvZl9uYW1lJF8pO1xuIgorICAgICIgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gJHVua25vd24kIDogcmVzdWx0O1xuIgorICAgICIgIH1cbiIKKyAgICAiICByZXR1cm4gJGRlZmF1bHQkO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgorICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCisgICAgIiAgICB0aHJvdyBuZXcgTnVsbFBvaW50ZXJFeGNlcHRpb24oKTtcbiIKKyAgICAiICB9XG4iCisgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZS5nZXROdW1iZXIoKTtcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgICRjbGVhcl9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICIgICAgJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iCisgICAgIiAgICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICB9XG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICByZXN1bHQuJG9uZW9mX25hbWUkXyA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJzZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZSgpKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAic2V0JGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworICB9Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImludCByYXdWYWx1ZSA9IGlucHV0LnJlYWRFbnVtKCk7XG4iCisgICAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgIiRvbmVvZl9uYW1lJF8gPSByYXdWYWx1ZTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTtcbiIKKyAgICAgICIkdHlwZSQgdmFsdWUgPSAkdHlwZSQuZm9yTnVtYmVyKHJhd1ZhbHVlKTtcbiIKKyAgICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIik7CisgICAgaWYgKFByZXNlcnZlVW5rbm93bkZpZWxkcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgICAiICB1bmtub3duRmllbGRzLm1lcmdlVmFyaW50RmllbGQoJG51bWJlciQsIHJhd1ZhbHVlKTtcbiIpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAiICAkb25lb2ZfbmFtZSRfID0gcmF3VmFsdWU7XG4iCisgICAgICAifVxuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBvdXRwdXQud3JpdGVFbnVtKCRudW1iZXIkLCAoKGphdmEubGFuZy5JbnRlZ2VyKSAkb25lb2ZfbmFtZSRfKSk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlRW51bVNpemUoJG51bWJlciQsICgoamF2YS5sYW5nLkludGVnZXIpICRvbmVvZl9uYW1lJF8pKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKClcbiIKKyAgICAgICIgICAgPT0gb3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoKTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpXG4iCisgICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgIH0KK30KKwordm9pZCBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaGFzaCA9ICgzNyAqIGhhc2gpICsgJGNvbnN0YW50X25hbWUkO1xuIgorICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKCk7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKKyAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5nZXROdW1iZXIoKTtcbiIpOworICB9Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgorUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpLCBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRFbnVtVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6flJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKICAgcmV0dXJuIDA7CiB9CiAKLWludCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CitpbnQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgewogICByZXR1cm4gMTsKIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKTtcbiIKLSAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIgorICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8JHR5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCk7XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCk7XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7CisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj5cbiIKKyAgICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZUxpc3QoKTtcbiIpOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoaW50IGluZGV4KTtcbiIpOworICB9CiB9CiAKLXZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICRuYW1lJF87XG4iCisgICAgInByaXZhdGUgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+ICRuYW1lJF87XG4iCisgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuTGlzdEFkYXB0ZXIuQ29udmVydGVyPFxuIgorICAgICIgICAgamF2YS5sYW5nLkludGVnZXIsICR0eXBlJD4gJG5hbWUkX2NvbnZlcnRlcl8gPVxuIgorICAgICIgICAgICAgIG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkxpc3RBZGFwdGVyLkNvbnZlcnRlcjxcbiIKKyAgICAiICAgICAgICAgICAgamF2YS5sYW5nLkludGVnZXIsICR0eXBlJD4oKSB7XG4iCisgICAgIiAgICAgICAgICBwdWJsaWMgJHR5cGUkIGNvbnZlcnQoamF2YS5sYW5nLkludGVnZXIgZnJvbSkge1xuIgorICAgICIgICAgICAgICAgICAkdHlwZSQgcmVzdWx0ID0gJHR5cGUkLmZvck51bWJlcihmcm9tKTtcbiIKKyAgICAiICAgICAgICAgICAgcmV0dXJuIHJlc3VsdCA9PSBudWxsID8gJHVua25vd24kIDogcmVzdWx0O1xuIgorICAgICIgICAgICAgICAgfVxuIgorICAgICIgICAgICAgIH07XG4iKTsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKLSAgICAifVxuIgorICAgICIgIHJldHVybiBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5MaXN0QWRhcHRlcjxcbiIKKyAgICAiICAgICAgamF2YS5sYW5nLkludGVnZXIsICR0eXBlJD4oJG5hbWUkXywgJG5hbWUkX2NvbnZlcnRlcl8pO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkge1xuIgotICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCiAgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkX2NvbnZlcnRlcl8uY29udmVydCgkbmFtZSRfLmdldChpbmRleCkpO1xuIgorICAgICJ9XG4iKTsKKyAgaWYgKFN1cHBvcnRVbmtub3duRW51bVZhbHVlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuSW50ZWdlcj5cbiIKKyAgICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZUxpc3QoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShpbnQgaW5kZXgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCisgICAgICAifVxuIik7CisgIH0KIAotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJgotICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkgJiYKKyAgICAgIGNvbnRleHRfLT5IYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgInByaXZhdGUgaW50ICRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemU7XG4iKTsKICAgfQogfQogCi12b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgIC8vIE9uZSBmaWVsZCBpcyB0aGUgbGlzdCBhbmQgdGhlIG90aGVyIGZpZWxkIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlCkBAIC0zMTIsODEgKzY2MCwxNDAgQEAKICAgICAvLyBtZW1vcnkgYWxsb2NhdGlvbnMuIE5vdGUsIGltbXV0YWJsZSBpcyBhIHN0cm9uZyBndWFyYW50ZWUgaGVyZSAtLSBub3QKICAgICAvLyBqdXN0IHRoYXQgdGhlIGxpc3QgY2Fubm90IGJlIG1vZGlmaWVkIHZpYSB0aGUgcmVmZXJlbmNlIGJ1dCB0aGF0IHRoZQogICAgIC8vIGxpc3QgY2FuIG5ldmVyIGJlIG1vZGlmaWVkLgotICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXyA9XG4iCisgICAgInByaXZhdGUgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+ICRuYW1lJF8gPVxuIgogICAgICIgIGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKIAogICAgICJwcml2YXRlIHZvaWQgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCkge1xuIgogICAgICIgIGlmICghJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgotICAgICIgICAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PCR0eXBlJD4oJG5hbWUkXyk7XG4iCisgICAgIiAgICAkbmFtZSRfID0gbmV3IGphdmEudXRpbC5BcnJheUxpc3Q8amF2YS5sYW5nLkludGVnZXI+KCRuYW1lJF8pO1xuIgogICAgICIgICAgJHNldF9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKICAgICAiICB9XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CiAKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgIC8vIE5vdGU6ICBXZSByZXR1cm4gYW4gdW5tb2RpZmlhYmxlIGxpc3QgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGNhbGxlcgogICAgIC8vICAgY291bGQgaG9sZCBvbiB0byB0aGUgcmV0dXJuZWQgbGlzdCBhbmQgbW9kaWZ5IGl0IGFmdGVyIHRoZSBtZXNzYWdlCiAgICAgLy8gICBoYXMgYmVlbiBidWlsdCwgdGh1cyBtdXRhdGluZyB0aGUgbWVzc2FnZSB3aGljaCBpcyBzdXBwb3NlZCB0byBiZQogICAgIC8vICAgaW1tdXRhYmxlLgogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKLSAgICAiICByZXR1cm4gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCi0gICAgIn1cbiIKKyAgICAiICByZXR1cm4gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuTGlzdEFkYXB0ZXI8XG4iCisgICAgIiAgICAgIGphdmEubGFuZy5JbnRlZ2VyLCAkdHlwZSQ+KCRuYW1lJF8sICRuYW1lJF9jb252ZXJ0ZXJfKTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSB7XG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF8uc2l6ZSgpO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgotICAgICJ9XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF9jb252ZXJ0ZXJfLmNvbnZlcnQoJG5hbWUkXy5nZXQoaW5kZXgpKTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCiAgICAgIiAgaWYgKHZhbHVlID09IG51bGwpIHtcbiIKICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgogICAgICIgIH1cbiIKICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKLSAgICAiICAkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgorICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZS5nZXROdW1iZXIoKSk7XG4iCiAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCiAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIHtcbiIKICAgICAiICBpZiAodmFsdWUgPT0gbnVsbCkge1xuIgogICAgICIgICAgdGhyb3cgbmV3IE51bGxQb2ludGVyRXhjZXB0aW9uKCk7XG4iCiAgICAgIiAgfVxuIgogICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKyAgICAiICAkbmFtZSRfLmFkZCh2YWx1ZS5nZXROdW1iZXIoKSk7XG4iCiAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCiAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZEFsbCRjYXBpdGFsaXplZF9uYW1lJChcbiIKICAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTw/IGV4dGVuZHMgJHR5cGUkPiB2YWx1ZXMpIHtcbiIKICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKLSAgICAiICBzdXBlci5hZGRBbGwodmFsdWVzLCAkbmFtZSRfKTtcbiIKKyAgICAiICBmb3IgKCR0eXBlJCB2YWx1ZSA6IHZhbHVlcykge1xuIgorICAgICIgICAgJG5hbWUkXy5hZGQodmFsdWUuZ2V0TnVtYmVyKCkpO1xuIgorICAgICIgIH1cbiIKICAgICAiICAkb25fY2hhbmdlZCRcbiIKICAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCiAgICAgIiAgJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy5lbXB0eUxpc3QoKTtcbiIKICAgICAiICAkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iCiAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCiAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCiAgICAgIn1cbiIpOworCisgIGlmIChTdXBwb3J0VW5rbm93bkVudW1WYWx1ZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8amF2YS5sYW5nLkludGVnZXI+XG4iCisgICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWVMaXN0KCkge1xuIgorICAgICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgorICAgICAgIn1cbiIpOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJFZhbHVlKGludCBpbmRleCkge1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkVmFsdWUoXG4iCisgICAgICAiICAgIGludCBpbmRleCwgaW50IHZhbHVlKSB7XG4iCisgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICIgICRuYW1lJF8uc2V0KGluZGV4LCB2YWx1ZSk7XG4iCisgICAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICAgIn1cbiIpOworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRWYWx1ZShpbnQgdmFsdWUpIHtcbiIKKyAgICAgICIgIGVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgorICAgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAgICJ9XG4iKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkVmFsdWUoXG4iCisgICAgICAiICAgIGphdmEubGFuZy5JdGVyYWJsZTxqYXZhLmxhbmcuSW50ZWdlcj4gdmFsdWVzKSB7XG4iCisgICAgICAiICBlbnN1cmUkY2FwaXRhbGl6ZWRfbmFtZSRJc011dGFibGUoKTtcbiIKKyAgICAgICIgIGZvciAoaW50IHZhbHVlIDogdmFsdWVzKSB7XG4iCisgICAgICAiICAgICRuYW1lJF8uYWRkKHZhbHVlKTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgICAifVxuIik7CisgIH0KIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgewogICAvLyBub29wIGZvciBlbnVtcwogfQogCi12b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIgogICAgICIkY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciQ7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgLy8gVGhlIGNvZGUgYmVsb3cgZG9lcyB0d28gb3B0aW1pemF0aW9uczoKICAgLy8gICAxLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBlbXB0eSwgdGhlcmUncyBub3RoaW5nIHRvIGRvLiBUaGlzIGVuc3VyZXMgd2UKQEAgLTQwNiw3ICs4MTMsNyBAQAogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCiAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KQEAgLTQxOCwyNyArODI1LDM4IEBACiAgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOwogfQogCi12b2lkIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICAvLyBSZWFkIGFuZCBzdG9yZSB0aGUgZW51bQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgotICAgICIkdHlwZSQgdmFsdWUgPSAkdHlwZSQudmFsdWVPZihyYXdWYWx1ZSk7XG4iKTsKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICBpZiAoU3VwcG9ydFVua25vd25FbnVtVmFsdWUoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCi0gICAgICAiICB1bmtub3duRmllbGRzLm1lcmdlVmFyaW50RmllbGQoJG51bWJlciQsIHJhd1ZhbHVlKTtcbiIKLSAgICAgICJ9IGVsc2Uge1xuIik7CisgICAgICAiaW50IHJhd1ZhbHVlID0gaW5wdXQucmVhZEVudW0oKTtcbiIKKyAgICAgICJpZiAoISRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgorICAgICAgIiAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5JbnRlZ2VyPigpO1xuIgorICAgICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgorICAgICAgIn1cbiIKKyAgICAgICIkbmFtZSRfLmFkZChyYXdWYWx1ZSk7XG4iKTsKICAgfSBlbHNlIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICh2YWx1ZSAhPSBudWxsKSB7XG4iKTsKKyAgICAgICJpbnQgcmF3VmFsdWUgPSBpbnB1dC5yZWFkRW51bSgpO1xuIgorICAgICAgIiR0eXBlJCB2YWx1ZSA9ICR0eXBlJC5mb3JOdW1iZXIocmF3VmFsdWUpO1xuIgorICAgICAgICAiaWYgKHZhbHVlID09IG51bGwpIHtcbiIpOworICAgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgIiAgdW5rbm93bkZpZWxkcy5tZXJnZVZhcmludEZpZWxkKCRudW1iZXIkLCByYXdWYWx1ZSk7XG4iKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJ9IGVsc2Uge1xuIgorICAgICAgIiAgaWYgKCEkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKKyAgICAgICIgICAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PGphdmEubGFuZy5JbnRlZ2VyPigpO1xuIgorICAgICAgIiAgICAkc2V0X211dGFibGVfYml0X3BhcnNlciQ7XG4iCisgICAgICAiICB9XG4iCisgICAgICAiICAkbmFtZSRfLmFkZChyYXdWYWx1ZSk7XG4iCisgICAgICAifVxuIik7CiAgIH0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiICBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQodmFsdWUpO1xuIgotICAgICJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIC8vIFdyYXAgR2VuZXJhdGVQYXJzaW5nQ29kZSdzIGNvbnRlbnRzIHdpdGggYSB3aGlsZSBsb29wLgogCkBAIC00NTYsMjYgKzg3NCwzNCBAQAogICAgICJpbnB1dC5wb3BMaW1pdChvbGRMaW1pdCk7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiaWYgKGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCkgPiAwKSB7XG4iCiAgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkdGFnJCk7XG4iCiAgICAgICAiICBvdXRwdXQud3JpdGVSYXdWYXJpbnQzMigkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplKTtcbiIKICAgICAgICJ9XG4iCiAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCi0gICAgICAiICBvdXRwdXQud3JpdGVFbnVtTm9UYWcoJG5hbWUkXy5nZXQoaSkuZ2V0TnVtYmVyKCkpO1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlRW51bU5vVGFnKCRuYW1lJF8uZ2V0KGkpKTtcbiIKICAgICAgICJ9XG4iKTsKICAgfSBlbHNlIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgotICAgICAgIiAgb3V0cHV0LndyaXRlRW51bSgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkuZ2V0TnVtYmVyKCkpO1xuIgorICAgICAgIiAgb3V0cHV0LndyaXRlRW51bSgkbnVtYmVyJCwgJG5hbWUkXy5nZXQoaSkpO1xuIgogICAgICAgIn1cbiIpOwogICB9CiB9CiAKLXZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJ7XG4iCkBAIC00ODUsMTEgKzkxMSwxMSBAQAogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKICAgICAiICBkYXRhU2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCi0gICAgIiAgICAuY29tcHV0ZUVudW1TaXplTm9UYWcoJG5hbWUkXy5nZXQoaSkuZ2V0TnVtYmVyKCkpO1xuIgorICAgICIgICAgLmNvbXB1dGVFbnVtU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0KGkpKTtcbiIKICAgICAifVxuIik7CiAgIHByaW50ZXItPlByaW50KAogICAgICJzaXplICs9IGRhdGFTaXplO1xuIik7Ci0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImlmICghZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmlzRW1wdHkoKSkgeyIKICAgICAgICIgIHNpemUgKz0gJHRhZ19zaXplJDtcbiIKQEAgLTUwMiw3ICs5MjgsNyBAQAogICB9CiAKICAgLy8gY2FjaGUgdGhlIGRhdGEgc2l6ZSBmb3IgcGFja2VkIGZpZWxkcy4KLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgaWYgKGRlc2NyaXB0b3JfLT5pc19wYWNrZWQoKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgICAiJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IGRhdGFTaXplO1xuIik7CiAgIH0KQEAgLTUxMSwyNCArOTM3LDIzIEBACiAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCi0gICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iKTsKKyAgICAicmVzdWx0ID0gcmVzdWx0ICYmICRuYW1lJF8uZXF1YWxzKG90aGVyLiRuYW1lJF8pO1xuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgogICAgICIgIGhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIKLSAgICAiICBoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoRW51bUxpc3QoZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpKTtcbiIKKyAgICAiICBoYXNoID0gKDUzICogaGFzaCkgKyAkbmFtZSRfLmhhc2hDb2RlKCk7XG4iCiAgICAgIn1cbiIpOwogfQogCi1zdHJpbmcgUmVwZWF0ZWRFbnVtRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZW51bV90eXBlKCkpOworc3RyaW5nIFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5lbnVtX3R5cGUoKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaAppbmRleCAwY2FkNmJlLi5iOGZmNzM0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQxLDE2ICs0MSwyNiBAQAogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgbmFtZXNwYWNlIGphdmEgeworICAgICAgY2xhc3MgQ29udGV4dDsgICAgICAgICAgICAvLyBjb250ZXh0LmgKKyAgICAgIGNsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgLy8gbmFtZV9yZXNvbHZlci5oCisgICAgfQorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CiBuYW1lc3BhY2UgY29tcGlsZXIgewogbmFtZXNwYWNlIGphdmEgewogCi1jbGFzcyBFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworY2xhc3MgSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKLSAgfkVudW1GaWVsZEdlbmVyYXRvcigpOworICBleHBsaWNpdCBJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigpOwogCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OwogICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtNjEsNiArNzEsNyBAQAogICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKQEAgLTY5LDIyICs4MCw0NyBAQAogCiAgIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdDsKIAotIHByaXZhdGU6CisgcHJvdGVjdGVkOgogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CiAgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwogICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKIAotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRW51bUZpZWxkR2VuZXJhdG9yKTsKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKTsKIH07CiAKLWNsYXNzIFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKK2NsYXNzIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvciB7CiAgcHVibGljOgotICBleHBsaWNpdCBSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKLSAgflJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKCk7CisgIEltbXV0YWJsZUVudW1PbmVvZkZpZWxkR2VuZXJhdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigpOwogCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRW51bU9uZW9mRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgflJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkR2VuZXJhdG9yKCk7CisKKyAgLy8gaW1wbGVtZW50cyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Q7CiAgIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CkBAIC05Niw2ICsxMzIsNyBAQAogICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CkBAIC0xMDksOCArMTQ2LDEwIEBACiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKICAgY29uc3QgaW50IG1lc3NhZ2VCaXRJbmRleF87CiAgIGNvbnN0IGludCBidWlsZGVyQml0SW5kZXhfOworICBDb250ZXh0KiBjb250ZXh0XzsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXJfOwogCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEVudW1GaWVsZEdlbmVyYXRvcik7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcik7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgamF2YQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZF9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGRfbGl0ZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZF9saXRlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZF9saXRlLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkX2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkX2xpdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZF9saXRlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2ZpZWxkX2xpdGUuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fbGl0ZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9saXRlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9saXRlLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2xpdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9saXRlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2xpdGUuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uY2MKaW5kZXggOWIxNDdjNy4uNDZiNWZhYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMyw3MyArMzMsNTAgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2RvY19jb21tZW50Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBjb21waWxlciB7CiBuYW1lc3BhY2UgamF2YSB7CiAKLW5hbWVzcGFjZSB7Ci0KLWNvbnN0IGNoYXIqIFR5cGVOYW1lKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSBmaWVsZF90eXBlKSB7Ci0gIHN3aXRjaCAoZmllbGRfdHlwZSkgewotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gIklOVDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzIgIDogcmV0dXJuICJVSU5UMzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMiAgOiByZXR1cm4gIlNJTlQzMiI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMiA6IHJldHVybiAiRklYRUQzMiI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiAiU0ZJWEVEMzIiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0ICAgOiByZXR1cm4gIklOVDY0IjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQgIDogcmV0dXJuICJVSU5UNjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NCAgOiByZXR1cm4gIlNJTlQ2NCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQ2NCA6IHJldHVybiAiRklYRUQ2NCI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiAiU0ZJWEVENjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gIkZMT0FUIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuICJET1VCTEUiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0wgICAgOiByZXR1cm4gIkJPT0wiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gIlNUUklORyI7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgICA6IHJldHVybiAiQllURVMiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU0gICAgOiByZXR1cm4gIkVOVU0iOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gIkdST1VQIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIDogcmV0dXJuICJNRVNTQUdFIjsKLQotICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3Ci0gICAgLy8gdHlwZXMgYXJlIGFkZGVkLgotICB9Ci0KLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gIHJldHVybiBOVUxMOwotfQotCi19Ci0KLUV4dGVuc2lvbkdlbmVyYXRvcjo6RXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcikKLSAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7CitJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6OkltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIGNvbnRleHRfKGNvbnRleHQpLAorICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CiAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgIT0gTlVMTCkgewotICAgIHNjb3BlXyA9IENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkpOworICAgIHNjb3BlXyA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoCisgICAgICAgIGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSk7CiAgIH0gZWxzZSB7Ci0gICAgc2NvcGVfID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpOworICAgIHNjb3BlXyA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSk7CiAgIH0KIH0KIAotRXh0ZW5zaW9uR2VuZXJhdG9yOjp+RXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KK0ltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcjo6fkltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvcigpIHt9CiAKIC8vIEluaXRpYWxpemVzIHRoZSB2YXJzIHJlZmVyZW5jZWQgaW4gdGhlIGdlbmVyYXRlZCBjb2RlIHRlbXBsYXRlcy4KLXZvaWQgSW5pdFRlbXBsYXRlVmFycyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzY29wZSwKLSAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJzX3BvaW50ZXIpIHsKK3ZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpJbml0VGVtcGxhdGVWYXJzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgc2NvcGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyc19wb2ludGVyKSB7CiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gJnZhcnMgPSAqdmFyc19wb2ludGVyOwogICB2YXJzWyJzY29wZSJdID0gc2NvcGU7CiAgIHZhcnNbIm5hbWUiXSA9IFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcik7Ci0gIHZhcnNbImNvbnRhaW5pbmdfdHlwZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpKTsKKyAgdmFyc1siY29udGFpbmluZ190eXBlIl0gPQorICAgICAgbmFtZV9yZXNvbHZlci0+R2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfdHlwZSgpLCBpbW11dGFibGUpOwogICB2YXJzWyJudW1iZXIiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOwogICB2YXJzWyJjb25zdGFudF9uYW1lIl0gPSBGaWVsZENvbnN0YW50TmFtZShkZXNjcmlwdG9yKTsKICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+aW5kZXgoKSk7Ci0gIHZhcnNbImRlZmF1bHQiXSA9Ci0gICAgICBkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpID8gIiIgOiBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcik7Ci0gIHZhcnNbInR5cGVfY29uc3RhbnQiXSA9IFR5cGVOYW1lKEdldFR5cGUoZGVzY3JpcHRvcikpOworICB2YXJzWyJkZWZhdWx0Il0gPSBkZXNjcmlwdG9yLT5pc19yZXBlYXRlZCgpID8KKyAgICAgICIiIDogRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IsIGltbXV0YWJsZSwgbmFtZV9yZXNvbHZlcik7CisgIHZhcnNbInR5cGVfY29uc3RhbnQiXSA9IEZpZWxkVHlwZU5hbWUoR2V0VHlwZShkZXNjcmlwdG9yKSk7CiAgIHZhcnNbInBhY2tlZCJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLnBhY2tlZCgpID8gInRydWUiIDogImZhbHNlIjsKICAgdmFyc1siZW51bV9tYXAiXSA9ICJudWxsIjsKICAgdmFyc1sicHJvdG90eXBlIl0gPSAibnVsbCI7CkBAIC0xMDgsMTMgKzg1LDIxIEBACiAgIHN0cmluZyBzaW5ndWxhcl90eXBlOwogICBzd2l0Y2ggKGphdmFfdHlwZSkgewogICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKLSAgICAgIHNpbmd1bGFyX3R5cGUgPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAgICAgc2luZ3VsYXJfdHlwZSA9IG5hbWVfcmVzb2x2ZXItPkdldENsYXNzTmFtZShkZXNjcmlwdG9yLT5tZXNzYWdlX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbXV0YWJsZSk7CiAgICAgICB2YXJzWyJwcm90b3R5cGUiXSA9IHNpbmd1bGFyX3R5cGUgKyAiLmdldERlZmF1bHRJbnN0YW5jZSgpIjsKICAgICAgIGJyZWFrOwogICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKLSAgICAgIHNpbmd1bGFyX3R5cGUgPSBDbGFzc05hbWUoZGVzY3JpcHRvci0+ZW51bV90eXBlKCkpOworICAgICAgc2luZ3VsYXJfdHlwZSA9IG5hbWVfcmVzb2x2ZXItPkdldENsYXNzTmFtZShkZXNjcmlwdG9yLT5lbnVtX3R5cGUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGltbXV0YWJsZSk7CiAgICAgICB2YXJzWyJlbnVtX21hcCJdID0gc2luZ3VsYXJfdHlwZSArICIuaW50ZXJuYWxHZXRWYWx1ZU1hcCgpIjsKICAgICAgIGJyZWFrOworICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgICAgc2luZ3VsYXJfdHlwZSA9ICJqYXZhLmxhbmcuU3RyaW5nIjsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgSkFWQVRZUEVfQllURVM6CisgICAgICBzaW5ndWxhcl90eXBlID0gaW1tdXRhYmxlID8gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyIgOiAiYnl0ZVtdIjsKKyAgICAgIGJyZWFrOwogICAgIGRlZmF1bHQ6CiAgICAgICBzaW5ndWxhcl90eXBlID0gQm94ZWRQcmltaXRpdmVUeXBlTmFtZShqYXZhX3R5cGUpOwogICAgICAgYnJlYWs7CkBAIC0xMjQsOTAgKzEwOSw2MyBAQAogICB2YXJzWyJzaW5ndWxhcl90eXBlIl0gPSBzaW5ndWxhcl90eXBlOwogfQogCi12b2lkIEV4dGVuc2lvbkdlbmVyYXRvcjo6R2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKK3ZvaWQgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7Ci0gIEluaXRUZW1wbGF0ZVZhcnMoZGVzY3JpcHRvcl8sIHNjb3BlXywgJnZhcnMpOworICBjb25zdCBib29sIGtVc2VJbW11dGFibGVOYW1lcyA9IHRydWU7CisgIEluaXRUZW1wbGF0ZVZhcnMoZGVzY3JpcHRvcl8sIHNjb3BlXywga1VzZUltbXV0YWJsZU5hbWVzLCBuYW1lX3Jlc29sdmVyXywKKyAgICAgICAgICAgICAgICAgICAmdmFycyk7CiAgIHByaW50ZXItPlByaW50KHZhcnMsCiAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBpbnQgJGNvbnN0YW50X25hbWUkID0gJG51bWJlciQ7XG4iKTsKIAotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAvLyBOb24tbGl0ZSBleHRlbnNpb25zCi0gICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7Ci0gICAgICAvLyBOb24tbmVzdGVkCi0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICB2YXJzLAotICAgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCi0gICAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKLSAgICAgICAgICAiICAgICRjb250YWluaW5nX3R5cGUkLFxuIgotICAgICAgICAgICIgICAgJHR5cGUkPiAkbmFtZSQgPSBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKLSAgICAgICAgICAiICAgICAgICAubmV3RmlsZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbihcbiIKLSAgICAgICAgICAiICAgICAgJHNpbmd1bGFyX3R5cGUkLmNsYXNzLFxuIgotICAgICAgICAgICIgICAgICAkcHJvdG90eXBlJCk7XG4iKTsKLSAgICB9IGVsc2UgewotICAgICAgLy8gTmVzdGVkCi0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICB2YXJzLAotICAgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCi0gICAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkdlbmVyYXRlZEV4dGVuc2lvbjxcbiIKLSAgICAgICAgICAiICAgICRjb250YWluaW5nX3R5cGUkLFxuIgotICAgICAgICAgICIgICAgJHR5cGUkPiAkbmFtZSQgPSBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKLSAgICAgICAgICAiICAgICAgICAubmV3TWVzc2FnZVNjb3BlZEdlbmVyYXRlZEV4dGVuc2lvbihcbiIKLSAgICAgICAgICAiICAgICAgJHNjb3BlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSxcbiIKLSAgICAgICAgICAiICAgICAgJGluZGV4JCxcbiIKLSAgICAgICAgICAiICAgICAgJHNpbmd1bGFyX3R5cGUkLmNsYXNzLFxuIgotICAgICAgICAgICIgICAgICAkcHJvdG90eXBlJCk7XG4iKTsKLSAgICB9CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7CisgICAgLy8gTm9uLW5lc3RlZAorICAgIHByaW50ZXItPlByaW50KAorICAgICAgICB2YXJzLAorICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbFxuIgorICAgICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuR2VuZXJhdGVkRXh0ZW5zaW9uPFxuIgorICAgICAgICAiICAgICRjb250YWluaW5nX3R5cGUkLFxuIgorICAgICAgICAiICAgICR0eXBlJD4gJG5hbWUkID0gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlXG4iCisgICAgICAgICIgICAgICAgIC5uZXdGaWxlU2NvcGVkR2VuZXJhdGVkRXh0ZW5zaW9uKFxuIgorICAgICAgICAiICAgICAgJHNpbmd1bGFyX3R5cGUkLmNsYXNzLFxuIgorICAgICAgICAiICAgICAgJHByb3RvdHlwZSQpO1xuIik7CiAgIH0gZWxzZSB7Ci0gICAgLy8gTGl0ZSBleHRlbnNpb25zCi0gICAgaWYgKGRlc2NyaXB0b3JfLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICB2YXJzLAotICAgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCi0gICAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCi0gICAgICAgICAgIiAgICAkY29udGFpbmluZ190eXBlJCxcbiIKLSAgICAgICAgICAiICAgICR0eXBlJD4gJG5hbWUkID0gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZVxuIgotICAgICAgICAgICIgICAgICAgIC5uZXdSZXBlYXRlZEdlbmVyYXRlZEV4dGVuc2lvbihcbiIKLSAgICAgICAgICAiICAgICAgJGNvbnRhaW5pbmdfdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCksXG4iCi0gICAgICAgICAgIiAgICAgICRwcm90b3R5cGUkLFxuIgotICAgICAgICAgICIgICAgICAkZW51bV9tYXAkLFxuIgotICAgICAgICAgICIgICAgICAkbnVtYmVyJCxcbiIKLSAgICAgICAgICAiICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5XaXJlRm9ybWF0LkZpZWxkVHlwZS4kdHlwZV9jb25zdGFudCQsXG4iCi0gICAgICAgICAgIiAgICAgICRwYWNrZWQkKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICB2YXJzLAotICAgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCi0gICAgICAgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCi0gICAgICAgICAgIiAgICAkY29udGFpbmluZ190eXBlJCxcbiIKLSAgICAgICAgICAiICAgICR0eXBlJD4gJG5hbWUkID0gY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZVxuIgotICAgICAgICAgICIgICAgICAgIC5uZXdTaW5ndWxhckdlbmVyYXRlZEV4dGVuc2lvbihcbiIKLSAgICAgICAgICAiICAgICAgJGNvbnRhaW5pbmdfdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCksXG4iCi0gICAgICAgICAgIiAgICAgICRkZWZhdWx0JCxcbiIKLSAgICAgICAgICAiICAgICAgJHByb3RvdHlwZSQsXG4iCi0gICAgICAgICAgIiAgICAgICRlbnVtX21hcCQsXG4iCi0gICAgICAgICAgIiAgICAgICRudW1iZXIkLFxuIgotICAgICAgICAgICIgICAgICBjb20uZ29vZ2xlLnByb3RvYnVmLldpcmVGb3JtYXQuRmllbGRUeXBlLiR0eXBlX2NvbnN0YW50JCk7XG4iKTsKLSAgICB9CisgICAgLy8gTmVzdGVkCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgIHZhcnMsCisgICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsXG4iCisgICAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5HZW5lcmF0ZWRFeHRlbnNpb248XG4iCisgICAgICAgICIgICAgJGNvbnRhaW5pbmdfdHlwZSQsXG4iCisgICAgICAgICIgICAgJHR5cGUkPiAkbmFtZSQgPSBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKKyAgICAgICAgIiAgICAgICAgLm5ld01lc3NhZ2VTY29wZWRHZW5lcmF0ZWRFeHRlbnNpb24oXG4iCisgICAgICAgICIgICAgICAkc2NvcGUkLmdldERlZmF1bHRJbnN0YW5jZSgpLFxuIgorICAgICAgICAiICAgICAgJGluZGV4JCxcbiIKKyAgICAgICAgIiAgICAgICRzaW5ndWxhcl90eXBlJC5jbGFzcyxcbiIKKyAgICAgICAgIiAgICAgICRwcm90b3R5cGUkKTtcbiIpOwogICB9CiB9CiAKLXZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZSgKK2ludCBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKAogICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gTlVMTCAmJgotICAgICAgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKLSAgICAvLyBPbmx5IGFwcGxpZXMgdG8gbm9uLW5lc3RlZCwgbm9uLWxpdGUgZXh0ZW5zaW9ucy4KKyAgaW50IGJ5dGVjb2RlX2VzdGltYXRlID0gMDsKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7CisgICAgLy8gT25seSBhcHBsaWVzIHRvIG5vbi1uZXN0ZWQgZXh0ZW5zaW9ucy4KICAgICBwcmludGVyLT5QcmludCgKICAgICAgICAgIiRuYW1lJC5pbnRlcm5hbEluaXQoZGVzY3JpcHRvci5nZXRFeHRlbnNpb25zKCkuZ2V0KCRpbmRleCQpKTtcbiIsCiAgICAgICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yXyksCiAgICAgICAgICJpbmRleCIsIFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpKTsKKyAgICBieXRlY29kZV9lc3RpbWF0ZSArPSAyMTsKICAgfQorICByZXR1cm4gYnl0ZWNvZGVfZXN0aW1hdGU7CiB9CiAKLXZvaWQgRXh0ZW5zaW9uR2VuZXJhdG9yOjpHZW5lcmF0ZVJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKK2ludCBJbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3I6OkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZSgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBwcmludGVyLT5QcmludCgKICAgICAicmVnaXN0cnkuYWRkKCRzY29wZSQuJG5hbWUkKTtcbiIsCiAgICAgInNjb3BlIiwgc2NvcGVfLAogICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShkZXNjcmlwdG9yXykpOworICByZXR1cm4gNzsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGphdmEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb24uaAppbmRleCAwMDllZDlmLi5iZGQ0MjI2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNSw2ICszNSw3IEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX0pBVkFfRVhURU5TSU9OX0hfXwogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KQEAgLTQyLDYgKzQzLDEyIEBACiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAgIGNsYXNzIEZpZWxkRGVzY3JpcHRvcjsgICAgICAgLy8gZGVzY3JpcHRvci5oCisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgbmFtZXNwYWNlIGphdmEgeworICAgICAgY2xhc3MgQ29udGV4dDsgICAgICAgICAgIC8vIGNvbnRleHQuaAorICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7IC8vIG5hbWVfcmVzb2x2ZXIuaAorICAgIH0KKyAgfQogICBuYW1lc3BhY2UgaW8gewogICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAogICB9CkBAIC01NiwyMiArNjMsNTEgQEAKIC8vIHNpbmNlIGV4dGVuc2lvbnMgYXJlIGp1c3Qgc2ltcGxlIGlkZW50aWZpZXJzIHdpdGggaW50ZXJlc3RpbmcgdHlwZXMuCiBjbGFzcyBFeHRlbnNpb25HZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgRXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0gIH5FeHRlbnNpb25HZW5lcmF0b3IoKTsKKyAgZXhwbGljaXQgRXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KKyAgdmlydHVhbCB+RXh0ZW5zaW9uR2VuZXJhdG9yKCkge30KIAotICB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7Ci0gIHZvaWQgR2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisKKyAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcmludGVkIGNvZGUgd2lsbCBjb21waWxlIHRvCisgIHZpcnR1YWwgaW50IEdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CisKKyAgLy8gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiB0aGUgbnVtYmVyIG9mIGJ5dGVzIHRoZSBwcmludGVkIGNvZGUgd2lsbCBjb21waWxlIHRvCisgIHZpcnR1YWwgaW50IEdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgPSAwOworCisgcHJvdGVjdGVkOgorICBzdGF0aWMgdm9pZCBJbml0VGVtcGxhdGVWYXJzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHNjb3BlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaW1tdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcnNfcG9pbnRlcik7CiAKICBwcml2YXRlOgotICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwotICBzdHJpbmcgc2NvcGVfOwogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXh0ZW5zaW9uR2VuZXJhdG9yKTsKIH07CiAKK2NsYXNzIEltbXV0YWJsZUV4dGVuc2lvbkdlbmVyYXRvciA6IHB1YmxpYyBFeHRlbnNpb25HZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB2aXJ0dWFsIH5JbW11dGFibGVFeHRlbnNpb25HZW5lcmF0b3IoKTsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2aXJ0dWFsIGludCBHZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZpcnR1YWwgaW50IEdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisgIHN0cmluZyBzY29wZV87CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKTsKK307CisKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCiB9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX01FU1NBR0VfSF9fCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0VYVEVOU0lPTl9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb25fbGl0ZS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb25fbGl0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbl9saXRlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9leHRlbnNpb25fbGl0ZS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuY2MKaW5kZXggYzdkNDMzYy4uM2M3YmM1YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzMsMTA0ICszMywyOTkgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bV9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2NvbnRleHQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2VudW1fZmllbGRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CisKIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGNvbXBpbGVyIHsKIG5hbWVzcGFjZSBqYXZhIHsKIAotRmllbGRHZW5lcmF0b3I6On5GaWVsZEdlbmVyYXRvcigpIHt9CituYW1lc3BhY2UgewogCi12b2lkIEZpZWxkR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IqIE1ha2VJbW11dGFibGVHZW5lcmF0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICBDb250ZXh0KiBjb250ZXh0KSB7CisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgeworICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7CisgICAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIChJc01hcEVudHJ5KGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkpIHsKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU1hcEZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlTGF6eU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVFbnVtRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUxhenlNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVFbnVtT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUxhenlNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgICB9CisgICAgICAgIGNhc2UgSkFWQVRZUEVfRU5VTToKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUVudW1GaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IqIE1ha2VJbW11dGFibGVMaXRlR2VuZXJhdG9yKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgQ29udGV4dCogY29udGV4dCkgeworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBzd2l0Y2ggKEdldEphdmFUeXBlKGZpZWxkKSkgeworICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoSXNNYXBFbnRyeShmaWVsZC0+bWVzc2FnZV90eXBlKCkpKSB7CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVNYXBGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgaWYgKElzTGF6eShmaWVsZCwgY29udGV4dC0+RW5mb3JjZUxpdGUoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRJbW11dGFibGVMYXp5TWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKKyAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICBkZWZhdWx0OgorICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7CisgICAgICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKKyAgICAgICAgICBpZiAoSXNMYXp5KGZpZWxkLCBjb250ZXh0LT5FbmZvcmNlTGl0ZSgpKSkgeworICAgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVMYXp5TWVzc2FnZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgICAgfQorICAgICAgICBjYXNlIEpBVkFUWVBFX0VOVU06CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVFbnVtT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9NRVNTQUdFOgorICAgICAgICAgIGlmIChJc0xhenkoZmllbGQsIGNvbnRleHQtPkVuZm9yY2VMaXRlKCkpKSB7CisgICAgICAgICAgICByZXR1cm4gbmV3IEltbXV0YWJsZUxhenlNZXNzYWdlRmllbGRMaXRlR2VuZXJhdG9yKAorICAgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlTWVzc2FnZUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgorICAgICAgICAgIHJldHVybiBuZXcgSW1tdXRhYmxlRW51bUZpZWxkTGl0ZUdlbmVyYXRvcigKKyAgICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KTsKKyAgICAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVTdHJpbmdGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgcmV0dXJuIG5ldyBJbW11dGFibGVQcmltaXRpdmVGaWVsZExpdGVHZW5lcmF0b3IoCisgICAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKKworc3RhdGljIGlubGluZSB2b2lkIFJlcG9ydFVuZXhwZWN0ZWRQYWNrZWRGaWVsZHNDYWxsKGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIC8vIFJlYWNoaW5nIGhlcmUgaW5kaWNhdGVzIGEgYnVnLiBDYXNlcyBhcmU6Ci0gIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIHNob3VsZCBzdXBwb3J0IHBhY2tpbmcsIGJ1dCB0aGlzIG1ldGhvZCBzaG91bGQgYmUKLSAgLy8gICAgIG92ZXJyaWRkZW4uCi0gIC8vICAgLSBUaGlzIEZpZWxkR2VuZXJhdG9yIGRvZXNuJ3Qgc3VwcG9ydCBwYWNraW5nLCBhbmQgdGhpcyBtZXRob2Qgc2hvdWxkCi0gIC8vICAgICBuZXZlciBoYXZlIGJlZW4gY2FsbGVkLgorICAvLyAgIC0gVGhpcyBGaWVsZEdlbmVyYXRvciBzaG91bGQgc3VwcG9ydCBwYWNraW5nLAorICAvLyAgICAgYnV0IHRoaXMgbWV0aG9kIHNob3VsZCBiZSBvdmVycmlkZGVuLgorICAvLyAgIC0gVGhpcyBGaWVsZEdlbmVyYXRvciBkb2Vzbid0IHN1cHBvcnQgcGFja2luZywgYW5kIHRoaXMgbWV0aG9kCisgIC8vICAgICBzaG91bGQgbmV2ZXIgaGF2ZSBiZWVuIGNhbGxlZC4KICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKCkgIgogICAgICAgICAgICAgIDw8ICJjYWxsZWQgb24gZmllbGQgZ2VuZXJhdG9yIHRoYXQgZG9lcyBub3Qgc3VwcG9ydCBwYWNraW5nLiI7CiB9CiAKLUZpZWxkR2VuZXJhdG9yTWFwOjpGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAotICAgIGZpZWxkX2dlbmVyYXRvcnNfKAotICAgICAgbmV3IHNjb3BlZF9wdHI8RmllbGRHZW5lcmF0b3I+W2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCldKSwKLSAgICBleHRlbnNpb25fZ2VuZXJhdG9yc18oCi0gICAgICBuZXcgc2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj5bZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCldKSB7Cit9ICAvLyBuYW1lc3BhY2UKKworSW1tdXRhYmxlRmllbGRHZW5lcmF0b3I6On5JbW11dGFibGVGaWVsZEdlbmVyYXRvcigpIHt9CisKK3ZvaWQgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgUmVwb3J0VW5leHBlY3RlZFBhY2tlZEZpZWxkc0NhbGwocHJpbnRlcik7Cit9CisKK0ltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcjo6fkltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcigpIHt9CisKK3ZvaWQgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIFJlcG9ydFVuZXhwZWN0ZWRQYWNrZWRGaWVsZHNDYWxsKHByaW50ZXIpOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK3RlbXBsYXRlIDw+CitGaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZEdlbmVyYXRvcj46OkZpZWxkR2VuZXJhdG9yTWFwKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwKKyAgICAgIGZpZWxkX2dlbmVyYXRvcnNfKG5ldyBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPAorICAgICAgICAgIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yPltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXSkgewogCiAgIC8vIENvbnN0cnVjdCBhbGwgdGhlIEZpZWxkR2VuZXJhdG9ycyBhbmQgYXNzaWduIHRoZW0gYml0IGluZGljZXMgZm9yIHRoZWlyCiAgIC8vIGJpdCBmaWVsZHMuCiAgIGludCBtZXNzYWdlQml0SW5kZXggPSAwOwogICBpbnQgYnVpbGRlckJpdEluZGV4ID0gMDsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBGaWVsZEdlbmVyYXRvciogZ2VuZXJhdG9yID0gTWFrZUdlbmVyYXRvcihkZXNjcmlwdG9yLT5maWVsZChpKSwKLSAgICAgICAgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOworICAgIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBNYWtlSW1tdXRhYmxlR2VuZXJhdG9yKAorICAgICAgICBkZXNjcmlwdG9yLT5maWVsZChpKSwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOwogICAgIGZpZWxkX2dlbmVyYXRvcnNfW2ldLnJlc2V0KGdlbmVyYXRvcik7CiAgICAgbWVzc2FnZUJpdEluZGV4ICs9IGdlbmVyYXRvci0+R2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKICAgICBidWlsZGVyQml0SW5kZXggKz0gZ2VuZXJhdG9yLT5HZXROdW1CaXRzRm9yQnVpbGRlcigpOwogICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIEZpZWxkR2VuZXJhdG9yKiBnZW5lcmF0b3IgPSBNYWtlR2VuZXJhdG9yKGRlc2NyaXB0b3ItPmV4dGVuc2lvbihpKSwKLSAgICAgICAgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOwotICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS5yZXNldChnZW5lcmF0b3IpOworfQorCit0ZW1wbGF0ZTw+CitGaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZEdlbmVyYXRvcj46On5GaWVsZEdlbmVyYXRvck1hcCgpIHt9CisKK3RlbXBsYXRlIDw+CitGaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3I+OjpGaWVsZEdlbmVyYXRvck1hcCgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBDb250ZXh0KiBjb250ZXh0KQorICAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksCisgICAgICBmaWVsZF9nZW5lcmF0b3JzXyhuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjwKKyAgICAgICAgICBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3I+W2Rlc2NyaXB0b3ItPmZpZWxkX2NvdW50KCldKSB7CisgIC8vIENvbnN0cnVjdCBhbGwgdGhlIEZpZWxkR2VuZXJhdG9ycyBhbmQgYXNzaWduIHRoZW0gYml0IGluZGljZXMgZm9yIHRoZWlyCisgIC8vIGJpdCBmaWVsZHMuCisgIGludCBtZXNzYWdlQml0SW5kZXggPSAwOworICBpbnQgYnVpbGRlckJpdEluZGV4ID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3IqIGdlbmVyYXRvciA9IE1ha2VJbW11dGFibGVMaXRlR2VuZXJhdG9yKAorICAgICAgICBkZXNjcmlwdG9yLT5maWVsZChpKSwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpOworICAgIGZpZWxkX2dlbmVyYXRvcnNfW2ldLnJlc2V0KGdlbmVyYXRvcik7CiAgICAgbWVzc2FnZUJpdEluZGV4ICs9IGdlbmVyYXRvci0+R2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKICAgICBidWlsZGVyQml0SW5kZXggKz0gZ2VuZXJhdG9yLT5HZXROdW1CaXRzRm9yQnVpbGRlcigpOwogICB9CiB9CiAKLUZpZWxkR2VuZXJhdG9yKiBGaWVsZEdlbmVyYXRvck1hcDo6TWFrZUdlbmVyYXRvcigKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KSB7Ci0gIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgIHN3aXRjaCAoR2V0SmF2YVR5cGUoZmllbGQpKSB7Ci0gICAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6Ci0gICAgICAgIHJldHVybiBuZXcgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOwotICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgotICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkRW51bUZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKLSAgICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgotICAgICAgICByZXR1cm4gbmV3IFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOwotICAgICAgZGVmYXVsdDoKLSAgICAgICAgcmV0dXJuIG5ldyBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKLSAgICB9Ci0gIH0gZWxzZSB7Ci0gICAgc3dpdGNoIChHZXRKYXZhVHlwZShmaWVsZCkpIHsKLSAgICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIG5ldyBNZXNzYWdlRmllbGRHZW5lcmF0b3IoCi0gICAgICAgICAgICBmaWVsZCwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgpOwotICAgICAgY2FzZSBKQVZBVFlQRV9FTlVNOgotICAgICAgICByZXR1cm4gbmV3IEVudW1GaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7Ci0gICAgICBjYXNlIEpBVkFUWVBFX1NUUklORzoKLSAgICAgICAgcmV0dXJuIG5ldyBTdHJpbmdGaWVsZEdlbmVyYXRvcigKLSAgICAgICAgICAgIGZpZWxkLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCk7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICByZXR1cm4gbmV3IFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAotICAgICAgICAgICAgZmllbGQsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4KTsKLSAgICB9Cit0ZW1wbGF0ZTw+CitGaWVsZEdlbmVyYXRvck1hcDxJbW11dGFibGVGaWVsZExpdGVHZW5lcmF0b3I+Ojp+RmllbGRHZW5lcmF0b3JNYXAoKSB7fQorCisKK3ZvaWQgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgeworICAoKnZhcmlhYmxlcylbImZpZWxkX25hbWUiXSA9IGRlc2NyaXB0b3ItPm5hbWUoKTsKKyAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPSBpbmZvLT5uYW1lOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9IGluZm8tPmNhcGl0YWxpemVkX25hbWU7CisgICgqdmFyaWFibGVzKVsiZGlzYW1iaWd1YXRlZF9yZWFzb24iXSA9IGluZm8tPmRpc2FtYmlndWF0ZWRfcmVhc29uOworICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOworICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7Cit9CisKK3ZvaWQgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcykgeworICAoKnZhcmlhYmxlcylbIm9uZW9mX25hbWUiXSA9IGluZm8tPm5hbWU7CisgICgqdmFyaWFibGVzKVsib25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSJdID0gaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZTsKKyAgKCp2YXJpYWJsZXMpWyJvbmVvZl9pbmRleCJdID0KKyAgICAgIFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpKTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfb25lb2ZfY2FzZV9tZXNzYWdlIl0gPSBpbmZvLT5uYW1lICsKKyAgICAgICJDYXNlXyA9ICIgKyBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgKCp2YXJpYWJsZXMpWyJjbGVhcl9vbmVvZl9jYXNlX21lc3NhZ2UiXSA9IGluZm8tPm5hbWUgKworICAgICAgIkNhc2VfID0gMCI7CisgICgqdmFyaWFibGVzKVsiaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSJdID0gaW5mby0+bmFtZSArCisgICAgICAiQ2FzZV8gPT0gIiArIFNpbXBsZUl0b2EoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworfQorCit2b2lkIFByaW50RXh0cmFGaWVsZEluZm8oY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFyaWFibGVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGNvbnN0IG1hcDxzdHJpbmcsIHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIHZhcmlhYmxlcy5maW5kKCJkaXNhbWJpZ3VhdGVkX3JlYXNvbiIpOworICBpZiAoaXQgIT0gdmFyaWFibGVzLmVuZCgpICYmICFpdC0+c2Vjb25kLmVtcHR5KCkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgdmFyaWFibGVzLAorICAgICAgICAiLy8gQW4gYWx0ZXJuYXRpdmUgbmFtZSBpcyB1c2VkIGZvciBmaWVsZCBcIiRmaWVsZF9uYW1lJFwiIGJlY2F1c2U6XG4iCisgICAgICAgICIvLyAgICAgJGRpc2FtYmlndWF0ZWRfcmVhc29uJFxuIik7CiAgIH0KIH0KIAotRmllbGRHZW5lcmF0b3JNYXA6On5GaWVsZEdlbmVyYXRvck1hcCgpIHt9Ci0KLWNvbnN0IEZpZWxkR2VuZXJhdG9yJiBGaWVsZEdlbmVyYXRvck1hcDo6Z2V0KAotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvcl8pOwotICByZXR1cm4gKmZpZWxkX2dlbmVyYXRvcnNfW2ZpZWxkLT5pbmRleCgpXTsKLX0KLQotY29uc3QgRmllbGRHZW5lcmF0b3ImIEZpZWxkR2VuZXJhdG9yTWFwOjpnZXRfZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3QgewotICByZXR1cm4gKmV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpbmRleF07Ci19Ci0KIH0gIC8vIG5hbWVzcGFjZSBqYXZhCiB9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaAppbmRleCA2MDk3ZjM1Li40ZGQ0ZjU3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmllbGQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsMTQgKzM1LDI3IEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9KQVZBX0ZJRUxEX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUVMRF9IX18KIAorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3RyaW5nPgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgY29tcGlsZXIgeworICAgIG5hbWVzcGFjZSBqYXZhIHsKKyAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAgICAgIC8vIGNvbnRleHQuaAorICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7ICAgICAgLy8gbmFtZV9yZXNvbHZlci5oCisgICAgfQorICB9CiAgIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgLy8gcHJpbnRlci5oCisgICAgY2xhc3MgUHJpbnRlcjsgICAgICAgICAgICAgICAgICAvLyBwcmludGVyLmgKICAgfQogfQogCkBAIC01MCwxMCArNjMsMTAgQEAKIG5hbWVzcGFjZSBjb21waWxlciB7CiBuYW1lc3BhY2UgamF2YSB7CiAKLWNsYXNzIEZpZWxkR2VuZXJhdG9yIHsKK2NsYXNzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKICBwdWJsaWM6Ci0gIEZpZWxkR2VuZXJhdG9yKCkge30KLSAgdmlydHVhbCB+RmllbGRHZW5lcmF0b3IoKTsKKyAgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IoKSB7fQorICB2aXJ0dWFsIH5JbW11dGFibGVGaWVsZEdlbmVyYXRvcigpOwogCiAgIHZpcnR1YWwgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0ID0gMDsKQEAgLTY2LDYgKzc5LDcgQEAKICAgdmlydHVhbCB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CiAgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlRnJvbVBhY2tlZChpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwogICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOwogICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKICAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKQpAQCAtNzcsMjkgKzkxLDEwNCBAQAogICB2aXJ0dWFsIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdCA9IDA7CiAKICBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmllbGRHZW5lcmF0b3IpOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IpOwogfTsKIAorY2xhc3MgSW1tdXRhYmxlRmllbGRMaXRlR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcigpIHt9CisgIHZpcnR1YWwgfkltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcigpOworCisgIHZpcnR1YWwgaW50IEdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgPSAwOworICB2aXJ0dWFsIGludCBHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVWaXNpdENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRHluYW1pY01ldGhvZE1ha2VJbW11dGFibGVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKQorICAgICAgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgPSAwOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikKKyAgICAgIGNvbnN0ID0gMDsKKworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCA9IDA7CisKKyAgdmlydHVhbCBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3QgPSAwOworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZUZpZWxkTGl0ZUdlbmVyYXRvcik7Cit9OworCisKIC8vIENvbnZlbmllbmNlIGNsYXNzIHdoaWNoIGNvbnN0cnVjdHMgRmllbGRHZW5lcmF0b3JzIGZvciBhIERlc2NyaXB0b3IuCit0ZW1wbGF0ZTx0eXBlbmFtZSBGaWVsZEdlbmVyYXRvclR5cGU+CiBjbGFzcyBGaWVsZEdlbmVyYXRvck1hcCB7CiAgcHVibGljOgotICBleHBsaWNpdCBGaWVsZEdlbmVyYXRvck1hcChjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKyAgZXhwbGljaXQgRmllbGRHZW5lcmF0b3JNYXAoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCk7CiAgIH5GaWVsZEdlbmVyYXRvck1hcCgpOwogCi0gIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBnZXQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGNvbnN0IEZpZWxkR2VuZXJhdG9yJiBnZXRfZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7CisgIGNvbnN0IEZpZWxkR2VuZXJhdG9yVHlwZSYgZ2V0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwogCiAgcHJpdmF0ZToKICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87Ci0gIHNjb3BlZF9hcnJheTxzY29wZWRfcHRyPEZpZWxkR2VuZXJhdG9yPiA+IGZpZWxkX2dlbmVyYXRvcnNfOwotICBzY29wZWRfYXJyYXk8c2NvcGVkX3B0cjxGaWVsZEdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187Ci0KLSAgc3RhdGljIEZpZWxkR2VuZXJhdG9yKiBNYWtlR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RmllbGRHZW5lcmF0b3JUeXBlPiA+IGZpZWxkX2dlbmVyYXRvcnNfOwogCiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWVsZEdlbmVyYXRvck1hcCk7CiB9OwogCit0ZW1wbGF0ZTx0eXBlbmFtZSBGaWVsZEdlbmVyYXRvclR5cGU+CitpbmxpbmUgY29uc3QgRmllbGRHZW5lcmF0b3JUeXBlJgorRmllbGRHZW5lcmF0b3JNYXA8RmllbGRHZW5lcmF0b3JUeXBlPjo6Z2V0KGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSwgZGVzY3JpcHRvcl8pOworICByZXR1cm4gKmZpZWxkX2dlbmVyYXRvcnNfW2ZpZWxkLT5pbmRleCgpXTsKK30KKworLy8gSW5zdGFudGlhdGUgdGVtcGxhdGUgZm9yIG11dGFibGUgYW5kIGltbXV0YWJsZSBtYXBzLgordGVtcGxhdGU8PgorRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRHZW5lcmF0b3I+OjoKK0ZpZWxkR2VuZXJhdG9yTWFwKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KTsKKwordGVtcGxhdGU8PgorRmllbGRHZW5lcmF0b3JNYXA8SW1tdXRhYmxlRmllbGRHZW5lcmF0b3I+Ojp+RmllbGRHZW5lcmF0b3JNYXAoKTsKKworCisvLyBGaWVsZCBpbmZvcm1hdGlvbiB1c2VkIGluIEZpZWxkR2VuZWFydG9ycy4KK3N0cnVjdCBGaWVsZEdlbmVyYXRvckluZm8geworICBzdHJpbmcgbmFtZTsKKyAgc3RyaW5nIGNhcGl0YWxpemVkX25hbWU7CisgIHN0cmluZyBkaXNhbWJpZ3VhdGVkX3JlYXNvbjsKK307CisKKy8vIE9uZW9mIGluZm9ybWF0aW9uIHVzZWQgaW4gT25lb2ZGaWVsZEdlbmVhcnRvcnMuCitzdHJ1Y3QgT25lb2ZHZW5lcmF0b3JJbmZvIHsKKyAgc3RyaW5nIG5hbWU7CisgIHN0cmluZyBjYXBpdGFsaXplZF9uYW1lOworfTsKKworLy8gU2V0IHNvbWUgY29tbW9uIHZhcmlhYmxlcyB1c2VkIGluIHZhcmlhYmxlIEZpZWxkR2VuZXJhdG9ycy4KK3ZvaWQgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcyk7CisKKy8vIFNldCBzb21lIGNvbW1vbiBvbmVvZiB2YXJpYWJsZXMgdXNlZCBpbiBPbmVvZkZpZWxkR2VuZXJhdG9ycy4KK3ZvaWQgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hcDxzdHJpbmcsIHN0cmluZz4qIHZhcmlhYmxlcyk7CisKKy8vIFByaW50IHVzZWZ1bCBjb21tZW50cyBiZWZvcmUgYSBmaWVsZCdzIGFjY2Vzc29ycy4KK3ZvaWQgUHJpbnRFeHRyYUZpZWxkSW5mbyhjb25zdCBtYXA8c3RyaW5nLCBzdHJpbmc+JiB2YXJpYWJsZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIpOworCiB9ICAvLyBuYW1lc3BhY2UgamF2YQogfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKaW5kZXggODk2ODA2OS4uYzUzYWFlNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMzLDE1ICszMywyOCBAQAogLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9lbnVtX2xpdGUuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2V4dGVuc2lvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKQEAgLTUxLDE4ICs2NCwzNyBAQAogCiBuYW1lc3BhY2UgewogCi0vLyBSZWN1cnNpdmVseSBzZWFyY2hlcyB0aGUgZ2l2ZW4gbWVzc2FnZSB0byBzZWUgaWYgaXQgY29udGFpbnMgYW55IGV4dGVuc2lvbnMuCi1ib29sIFVzZXNFeHRlbnNpb25zKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKK3N0cnVjdCBGaWVsZERlc2NyaXB0b3JDb21wYXJlIHsKKyAgYm9vbCBvcGVyYXRvciAoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGYxLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGYyKSB7CisgICAgaWYoZjEgPT0gTlVMTCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZihmMiA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgcmV0dXJuIGYxLT5mdWxsX25hbWUoKSA8IGYyLT5mdWxsX25hbWUoKTsKKyAgfQorfTsKKwordHlwZWRlZiBzdGQ6OnNldDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLCBGaWVsZERlc2NyaXB0b3JDb21wYXJlPiBGaWVsZERlc2NyaXB0b3JTZXQ7CisKKy8vIFJlY3Vyc2l2ZWx5IHNlYXJjaGVzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIGNvbGxlY3QgZXh0ZW5zaW9ucy4KKy8vIFJldHVybnMgdHJ1ZSBpZiBhbGwgdGhlIGV4dGVuc2lvbnMgY2FuIGJlIHJlY29nbml6ZWQuIFRoZSBleHRlbnNpb25zIHdpbGwgYmUKKy8vIGFwcGVuZGVkIGluIHRvIHRoZSBleHRlbnNpb25zIHBhcmFtZXRlci4KKy8vIFJldHVybnMgZmFsc2Ugd2hlbiB0aGVyZSBhcmUgdW5rbm93biBmaWVsZHMsIGluIHdoaWNoIGNhc2UgdGhlIGRhdGEgaW4gdGhlCisvLyBleHRlbnNpb25zIG91dHB1dCBwYXJhbWV0ZXIgaXMgbm90IHJlbGlhYmxlIGFuZCBzaG91bGQgYmUgZGlzY2FyZGVkLgorYm9vbCBDb2xsZWN0RXh0ZW5zaW9ucyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JTZXQqIGV4dGVuc2lvbnMpIHsKICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOwogCi0gIC8vIFdlIGNvbnNlcnZhdGl2ZWx5IGFzc3VtZSB0aGF0IHVua25vd24gZmllbGRzIGFyZSBleHRlbnNpb25zLgotICBpZiAocmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKS5maWVsZF9jb3VudCgpID4gMCkgcmV0dXJuIHRydWU7CisgIC8vIFRoZXJlIGFyZSB1bmtub3duIGZpZWxkcyB0aGF0IGNvdWxkIGJlIGV4dGVuc2lvbnMsIHRodXMgdGhpcyBjYWxsIGZhaWxzLgorICBpZiAocmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKS5maWVsZF9jb3VudCgpID4gMCkgcmV0dXJuIGZhbHNlOwogCiAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CiAgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoZmllbGRzW2ldLT5pc19leHRlbnNpb24oKSkgcmV0dXJuIHRydWU7CisgICAgaWYgKGZpZWxkc1tpXS0+aXNfZXh0ZW5zaW9uKCkpIGV4dGVuc2lvbnMtPmluc2VydChmaWVsZHNbaV0pOwogCiAgICAgaWYgKEdldEphdmFUeXBlKGZpZWxkc1tpXSkgPT0gSkFWQVRZUEVfTUVTU0FHRSkgewogICAgICAgaWYgKGZpZWxkc1tpXS0+aXNfcmVwZWF0ZWQoKSkgewpAQCAtNzAsMjUgKzEwMiwxMjAgQEAKICAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9CiAgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGRzW2ldLCBqKTsKLSAgICAgICAgICBpZiAoVXNlc0V4dGVuc2lvbnMoc3ViX21lc3NhZ2UpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBpZiAoIUNvbGxlY3RFeHRlbnNpb25zKHN1Yl9tZXNzYWdlLCBleHRlbnNpb25zKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewogICAgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGRzW2ldKTsKLSAgICAgICAgaWYgKFVzZXNFeHRlbnNpb25zKHN1Yl9tZXNzYWdlKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmICghQ29sbGVjdEV4dGVuc2lvbnMoc3ViX21lc3NhZ2UsIGV4dGVuc2lvbnMpKSByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAgICAgfQogICB9CiAKLSAgcmV0dXJuIGZhbHNlOworICByZXR1cm4gdHJ1ZTsKK30KKworLy8gRmluZHMgYWxsIGV4dGVuc2lvbnMgaW4gdGhlIGdpdmVuIG1lc3NhZ2UgYW5kIGl0cyBzdWItbWVzc2FnZXMuICBJZiB0aGUKKy8vIG1lc3NhZ2UgY29udGFpbnMgdW5rbm93biBmaWVsZHMgKHdoaWNoIGNvdWxkIGJlIGV4dGVuc2lvbnMpLCB0aGVuIHRob3NlCisvLyBleHRlbnNpb25zIGFyZSBkZWZpbmVkIGluIGFsdGVybmF0ZV9wb29sLgorLy8gVGhlIG1lc3NhZ2Ugd2lsbCBiZSBjb252ZXJ0ZWQgdG8gYSBEeW5hbWljTWVzc2FnZSBiYWNrZWQgYnkgYWx0ZXJuYXRlX3Bvb2wKKy8vIGluIG9yZGVyIHRvIGhhbmRsZSB0aGlzIGNhc2UuCit2b2lkIENvbGxlY3RFeHRlbnNpb25zKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGVfcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQb29sJiBhbHRlcm5hdGVfcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yU2V0KiBleHRlbnNpb25zLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGVfZGF0YSkgeworICBpZiAoIUNvbGxlY3RFeHRlbnNpb25zKGZpbGVfcHJvdG8sIGV4dGVuc2lvbnMpKSB7CisgICAgLy8gVGhlcmUgYXJlIHVua25vd24gZmllbGRzIGluIHRoZSBmaWxlX3Byb3RvLCB3aGljaCBhcmUgcHJvYmFibHkKKyAgICAvLyBleHRlbnNpb25zLiBXZSBuZWVkIHRvIHBhcnNlIHRoZSBkYXRhIGludG8gYSBkeW5hbWljIG1lc3NhZ2UgYmFzZWQgb24gdGhlCisgICAgLy8gYnVpbGRlci1wb29sIHRvIGZpbmQgb3V0IGFsbCBleHRlbnNpb25zLgorICAgIGNvbnN0IERlc2NyaXB0b3IqIGZpbGVfcHJvdG9fZGVzYyA9IGFsdGVybmF0ZV9wb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICAgZmlsZV9wcm90by5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKTsKKyAgICBHT09HTEVfQ0hFQ0soZmlsZV9wcm90b19kZXNjKQorICAgICAgICA8PCAiRmluZCB1bmtub3duIGZpZWxkcyBpbiBGaWxlRGVzY3JpcHRvclByb3RvIHdoZW4gYnVpbGRpbmcgIgorICAgICAgICA8PCBmaWxlX3Byb3RvLm5hbWUoKQorICAgICAgICA8PCAiLiBJdCdzIGxpa2VseSB0aGF0IHRob3NlIGZpZWxkcyBhcmUgY3VzdG9tIG9wdGlvbnMsIGhvd2V2ZXIsICIKKyAgICAgICAgICAgImRlc2NyaXB0b3IucHJvdG8gaXMgbm90IGluIHRoZSB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcy4gIgorICAgICAgICAgICAiVGhpcyBub3JtYWxseSBzaG91bGQgbm90IGhhcHBlbi4gUGxlYXNlIHJlcG9ydCBhIGJ1Zy4iOworICAgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gZHluYW1pY19maWxlX3Byb3RvKAorICAgICAgICBmYWN0b3J5LkdldFByb3RvdHlwZShmaWxlX3Byb3RvX2Rlc2MpLT5OZXcoKSk7CisgICAgR09PR0xFX0NIRUNLKGR5bmFtaWNfZmlsZV9wcm90by5nZXQoKSAhPSBOVUxMKTsKKyAgICBHT09HTEVfQ0hFQ0soZHluYW1pY19maWxlX3Byb3RvLT5QYXJzZUZyb21TdHJpbmcoZmlsZV9kYXRhKSk7CisKKyAgICAvLyBDb2xsZWN0IHRoZSBleHRlbnNpb25zIGFnYWluIGZyb20gdGhlIGR5bmFtaWMgbWVzc2FnZS4gVGhlcmUgc2hvdWxkIGJlIG5vCisgICAgLy8gbW9yZSB1bmtub3duIGZpZWxkcyB0aGlzIHRpbWUsIGkuZS4gYWxsIHRoZSBjdXN0b20gb3B0aW9ucyBzaG91bGQgYmUKKyAgICAvLyBwYXJzZWQgYXMgZXh0ZW5zaW9ucyBub3cuCisgICAgZXh0ZW5zaW9ucy0+Y2xlYXIoKTsKKyAgICBHT09HTEVfQ0hFQ0soQ29sbGVjdEV4dGVuc2lvbnMoKmR5bmFtaWNfZmlsZV9wcm90bywgZXh0ZW5zaW9ucykpCisgICAgICAgIDw8ICJGaW5kIHVua25vd24gZmllbGRzIGluIEZpbGVEZXNjcmlwdG9yUHJvdG8gd2hlbiBidWlsZGluZyAiCisgICAgICAgIDw8IGZpbGVfcHJvdG8ubmFtZSgpCisgICAgICAgIDw8ICIuIEl0J3MgbGlrZWx5IHRoYXQgdGhvc2UgZmllbGRzIGFyZSBjdXN0b20gb3B0aW9ucywgaG93ZXZlciwgIgorICAgICAgICAgICAidGhvc2Ugb3B0aW9ucyBjYW5ub3QgYmUgcmVjb2duaXplZCBpbiB0aGUgYnVpbGRlciBwb29sLiAiCisgICAgICAgICAgICJUaGlzIG5vcm1hbGx5IHNob3VsZCBub3QgaGFwcGVuLiBQbGVhc2UgcmVwb3J0IGEgYnVnLiI7CisgIH0KK30KKworLy8gQ29tcGFyZSB0d28gZmllbGQgZGVzY3JpcHRvcnMsIHJldHVybmluZyB0cnVlIGlmIHRoZSBmaXJzdCBzaG91bGQgY29tZQorLy8gYmVmb3JlIHRoZSBzZWNvbmQuCitib29sIENvbXBhcmVGaWVsZHNCeU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICphLCBjb25zdCBGaWVsZERlc2NyaXB0b3IgKmIpIHsKKyAgcmV0dXJuIGEtPmZ1bGxfbmFtZSgpIDwgYi0+ZnVsbF9uYW1lKCk7Cit9CisKKy8vIE91ciBzdGF0aWMgaW5pdGlhbGl6YXRpb24gbWV0aG9kcyBjYW4gYmVjb21lIHZlcnksIHZlcnkgbGFyZ2UuCisvLyBTbyBsYXJnZSB0aGF0IGlmIHdlIGFyZW4ndCBjYXJlZnVsIHdlIGVuZCB1cCBibG93aW5nIHRoZSBKVk0ncworLy8gNjRLIGJ5dGVzIG9mIGJ5dGVjb2RlL21ldGhvZC4gRm9ydHVuYXRlbHksIHNpbmNlIHRoZXNlIHN0YXRpYworLy8gbWV0aG9kcyBhcmUgZXhlY3V0ZWQgb25seSBvbmNlIG5lYXIgdGhlIGJlZ2lubmluZyBvZiBhIHByb2dyYW0sCisvLyB0aGVyZSdzIHVzdWFsbHkgcGxlbnR5IG9mIHN0YWNrIHNwYWNlIGF2YWlsYWJsZSBhbmQgd2UgY2FuCisvLyBleHRlbmQgb3VyIG1ldGhvZHMgYnkgc2ltcGx5IGNoYWluaW5nIHRoZW0gdG8gYW5vdGhlciBtZXRob2QKKy8vIHdpdGggYSB0YWlsIGNhbGwuIFRoaXMgaW5zZXJ0cyB0aGUgc2VxdWVuY2UgY2FsbC1uZXh0LW1ldGhvZCwKKy8vIGVuZCB0aGlzIG9uZSwgYmVnaW4tbmV4dC1tZXRob2QgYXMgbmVlZGVkLgordm9pZCBNYXliZVJlc3RhcnRKYXZhTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqYnl0ZWNvZGVfZXN0aW1hdGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICptZXRob2RfbnVtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKmNoYWluX3N0YXRlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICptZXRob2RfZGVjbCkgeworICAvLyBUaGUgZ29hbCBoZXJlIGlzIHRvIHN0YXkgdW5kZXIgNjRLIGJ5dGVzIG9mIGp2bSBieXRlY29kZS9tZXRob2QsCisgIC8vIHNpbmNlIG90aGVyd2lzZSB3ZSBoaXQgYSBoYXJkY29kZWQgbGltaXQgaW4gdGhlIGp2bSBhbmQgamF2YWMgd2lsbAorICAvLyB0aGVuIGZhaWwgd2l0aCB0aGUgZXJyb3IgImNvZGUgdG9vIGxhcmdlIi4gVGhpcyBsaW1pdCBsZXRzIG91cgorICAvLyBlc3RpbWF0ZXMgYmUgb2ZmIGJ5IGEgZmFjdG9yIG9mIHR3byBhbmQgc3RpbGwgd2UncmUgb2theS4KKyAgc3RhdGljIGNvbnN0IGludCBieXRlc1Blck1ldGhvZCA9IGtNYXhTdGF0aWNTaXplOworCisgIGlmICgoKmJ5dGVjb2RlX2VzdGltYXRlKSA+IGJ5dGVzUGVyTWV0aG9kKSB7CisgICAgKysoKm1ldGhvZF9udW0pOworICAgIHByaW50ZXItPlByaW50KGNoYWluX3N0YXRlbWVudCwgIm1ldGhvZF9udW0iLCBTaW1wbGVJdG9hKCptZXRob2RfbnVtKSk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludChtZXRob2RfZGVjbCwgIm1ldGhvZF9udW0iLCBTaW1wbGVJdG9hKCptZXRob2RfbnVtKSk7CisgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgKmJ5dGVjb2RlX2VzdGltYXRlID0gMDsKKyAgfQogfQogCiAKIH0gIC8vIG5hbWVzcGFjZQogCi1GaWxlR2VuZXJhdG9yOjpGaWxlR2VuZXJhdG9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKQotICA6IGZpbGVfKGZpbGUpLAotICAgIGphdmFfcGFja2FnZV8oRmlsZUphdmFQYWNrYWdlKGZpbGUpKSwKLSAgICBjbGFzc25hbWVfKEZpbGVDbGFzc05hbWUoZmlsZSkpIHsKK0ZpbGVHZW5lcmF0b3I6OkZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW1tdXRhYmxlX2FwaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmZvcmNlX2xpdGUpCisgICAgOiBmaWxlXyhmaWxlKSwKKyAgICAgIGphdmFfcGFja2FnZV8oRmlsZUphdmFQYWNrYWdlKGZpbGUsIGltbXV0YWJsZV9hcGkpKSwKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc18oCisgICAgICAgICAgbmV3IGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZUdlbmVyYXRvcj5bZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCldKSwKKyAgICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzXygKKyAgICAgICAgICBuZXcgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+W2ZpbGUtPmV4dGVuc2lvbl9jb3VudCgpXSksCisgICAgICBjb250ZXh0XyhuZXcgQ29udGV4dChmaWxlKSksCisgICAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0Xy0+R2V0TmFtZVJlc29sdmVyKCkpLAorICAgICAgaW1tdXRhYmxlX2FwaV8oaW1tdXRhYmxlX2FwaSkgeworICBjbGFzc25hbWVfID0gbmFtZV9yZXNvbHZlcl8tPkdldEZpbGVDbGFzc05hbWUoZmlsZSwgaW1tdXRhYmxlX2FwaSk7CisgIGNvbnRleHRfLT5TZXRFbmZvcmNlTGl0ZShlbmZvcmNlX2xpdGUpOworICBnZW5lcmF0b3JfZmFjdG9yeV8ucmVzZXQoCisgICAgICBuZXcgSW1tdXRhYmxlR2VuZXJhdG9yRmFjdG9yeShjb250ZXh0Xy5nZXQoKSkpOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5yZXNldCgKKyAgICAgICAgZ2VuZXJhdG9yX2ZhY3RvcnlfLT5OZXdNZXNzYWdlR2VuZXJhdG9yKGZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLnJlc2V0KAorICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld0V4dGVuc2lvbkdlbmVyYXRvcihmaWxlXy0+ZXh0ZW5zaW9uKGkpKSk7CisgIH0KIH0KIAogRmlsZUdlbmVyYXRvcjo6fkZpbGVHZW5lcmF0b3IoKSB7fQpAQCAtOTgsMjUgKzIyNSw3IEBACiAgIC8vIHByb2JsZW0gdGhhdCBsZWFkcyB0byBKYXZhIGNvbXBpbGUgZXJyb3JzIHRoYXQgY2FuIGJlIGhhcmQgdG8gdW5kZXJzdGFuZC4KICAgLy8gSXQncyBlc3BlY2lhbGx5IGJhZCB3aGVuIHVzaW5nIHRoZSBqYXZhX211bHRpcGxlX2ZpbGVzLCBzaW5jZSB3ZSB3b3VsZAogICAvLyBlbmQgdXAgb3ZlcndyaXRpbmcgdGhlIG91dGVyIGNsYXNzIHdpdGggb25lIG9mIHRoZSBpbm5lciBvbmVzLgotCi0gIGJvb2wgZm91bmRfY29uZmxpY3QgPSBmYWxzZTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCkgJiYgIWZvdW5kX2NvbmZsaWN0OyBpKyspIHsKLSAgICBpZiAoZmlsZV8tPmVudW1fdHlwZShpKS0+bmFtZSgpID09IGNsYXNzbmFtZV8pIHsKLSAgICAgIGZvdW5kX2NvbmZsaWN0ID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkgJiYgIWZvdW5kX2NvbmZsaWN0OyBpKyspIHsKLSAgICBpZiAoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKS0+bmFtZSgpID09IGNsYXNzbmFtZV8pIHsKLSAgICAgIGZvdW5kX2NvbmZsaWN0ID0gdHJ1ZTsKLSAgICB9Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpICYmICFmb3VuZF9jb25mbGljdDsgaSsrKSB7Ci0gICAgaWYgKGZpbGVfLT5zZXJ2aWNlKGkpLT5uYW1lKCkgPT0gY2xhc3NuYW1lXykgewotICAgICAgZm91bmRfY29uZmxpY3QgPSB0cnVlOwotICAgIH0KLSAgfQotCi0gIGlmIChmb3VuZF9jb25mbGljdCkgeworICBpZiAobmFtZV9yZXNvbHZlcl8tPkhhc0NvbmZsaWN0aW5nQ2xhc3NOYW1lKGZpbGVfLCBjbGFzc25hbWVfKSkgewogICAgIGVycm9yLT5hc3NpZ24oZmlsZV8tPm5hbWUoKSk7CiAgICAgZXJyb3ItPmFwcGVuZCgKICAgICAgICI6IENhbm5vdCBnZW5lcmF0ZSBKYXZhIG91dHB1dCBiZWNhdXNlIHRoZSBmaWxlJ3Mgb3V0ZXIgY2xhc3MgbmFtZSwgXCIiKTsKQEAgLTEyNyw3ICsyMzYsNiBAQAogICAgICAgIm9wdGlvbiB0byBzcGVjaWZ5IGEgZGlmZmVyZW50IG91dGVyIGNsYXNzIG5hbWUgZm9yIHRoZSAucHJvdG8gZmlsZS4iKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KLQogICByZXR1cm4gdHJ1ZTsKIH0KIApAQCAtMTU2LDE3ICsyNjQsMTcgQEAKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgInB1YmxpYyBzdGF0aWMgdm9pZCByZWdpc3RlckFsbEV4dGVuc2lvbnMoXG4iCiAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5JGxpdGUkIHJlZ2lzdHJ5KSB7XG4iLAotICAgICJsaXRlIiwgSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8pID8gIiIgOiAiTGl0ZSIpOworICAgICJsaXRlIiwKKyAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpID8gIiIgOiAiTGl0ZSIpOwogCiAgIHByaW50ZXItPkluZGVudCgpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBFeHRlbnNpb25HZW5lcmF0b3IoZmlsZV8tPmV4dGVuc2lvbihpKSkuR2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOworICAgIGV4dGVuc2lvbl9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIE1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkKLSAgICAgIC5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVFeHRlbnNpb25SZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOwogICB9CiAKICAgcHJpbnRlci0+T3V0ZGVudCgpOwpAQCAtMTc1LDE4ICsyODMsMjUgQEAKIAogICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0gIGlmICghZmlsZV8tPm9wdGlvbnMoKS5qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKKyAgaWYgKCFNdWx0aXBsZUphdmFGaWxlcyhmaWxlXywgaW1tdXRhYmxlX2FwaV8pKSB7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgICAgRW51bUdlbmVyYXRvcihmaWxlXy0+ZW51bV90eXBlKGkpKS5HZW5lcmF0ZShwcmludGVyKTsKKyAgICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpKSB7CisgICAgICAgIEVudW1HZW5lcmF0b3IoZmlsZV8tPmVudW1fdHlwZShpKSwgaW1tdXRhYmxlX2FwaV8sIGNvbnRleHRfLmdldCgpKQorICAgICAgICAgICAgLkdlbmVyYXRlKHByaW50ZXIpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgRW51bUxpdGVHZW5lcmF0b3IoZmlsZV8tPmVudW1fdHlwZShpKSwgaW1tdXRhYmxlX2FwaV8sIGNvbnRleHRfLmdldCgpKQorICAgICAgICAgICAgLkdlbmVyYXRlKHByaW50ZXIpOworICAgICAgfQogICAgIH0KICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICBNZXNzYWdlR2VuZXJhdG9yIG1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7Ci0gICAgICBtZXNzYWdlR2VuZXJhdG9yLkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOwotICAgICAgbWVzc2FnZUdlbmVyYXRvci5HZW5lcmF0ZShwcmludGVyKTsKKyAgICAgIG1lc3NhZ2VfZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOworICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGUocHJpbnRlcik7CiAgICAgfQotICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8pKSB7CisgICAgaWYgKEhhc0dlbmVyaWNTZXJ2aWNlcyhmaWxlXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpKSB7CiAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5zZXJ2aWNlX2NvdW50KCk7IGkrKykgewotICAgICAgICBTZXJ2aWNlR2VuZXJhdG9yKGZpbGVfLT5zZXJ2aWNlKGkpKS5HZW5lcmF0ZShwcmludGVyKTsKKyAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxTZXJ2aWNlR2VuZXJhdG9yPiBnZW5lcmF0b3IoCisgICAgICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld1NlcnZpY2VHZW5lcmF0b3IoZmlsZV8tPnNlcnZpY2UoaSkpKTsKKyAgICAgICAgZ2VuZXJhdG9yLT5HZW5lcmF0ZShwcmludGVyKTsKICAgICAgIH0KICAgICB9CiAgIH0KQEAgLTE5NCwyOCArMzA5LDQwIEBACiAgIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBnZW5lcmF0ZWQgaW4gdGhlIG91dGVyIGNsYXNzIHNpbmNlIHRoZXkgYXJlIHZhbHVlcywKICAgLy8gbm90IGNsYXNzZXMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBFeHRlbnNpb25HZW5lcmF0b3IoZmlsZV8tPmV4dGVuc2lvbihpKSkuR2VuZXJhdGUocHJpbnRlcik7CisgICAgZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZShwcmludGVyKTsKICAgfQogCi0gIC8vIFN0YXRpYyB2YXJpYWJsZXMuCisgIC8vIFN0YXRpYyB2YXJpYWJsZXMuIFdlJ2QgbGlrZSB0aGVtIHRvIGJlIGZpbmFsIGlmIHBvc3NpYmxlLCBidXQgZHVlIHRvCisgIC8vIHRoZSBKVk0ncyA2NGsgc2l6ZSBsaW1pdCBvbiBzdGF0aWMgYmxvY2tzLCB3ZSBoYXZlIHRvIGluaXRpYWxpemUgc29tZQorICAvLyBvZiB0aGVtIGluIG1ldGhvZHM7IHRodXMgdGhleSBjYW5ub3QgYmUgZmluYWwuCisgIGludCBzdGF0aWNfYmxvY2tfYnl0ZWNvZGVfZXN0aW1hdGUgPSAwOwogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPwotICAgIE1lc3NhZ2VHZW5lcmF0b3IoZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSkuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMocHJpbnRlcik7CisgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoCisgICAgICAgIHByaW50ZXIsICZzdGF0aWNfYmxvY2tfYnl0ZWNvZGVfZXN0aW1hdGUpOwogICB9CiAKICAgcHJpbnRlci0+UHJpbnQoIlxuIik7CiAKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGZpbGVfKSkgewotICAgIEdlbmVyYXRlRW1iZWRkZWREZXNjcmlwdG9yKHByaW50ZXIpOworICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZV8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgeworICAgIGlmIChpbW11dGFibGVfYXBpXykgeworICAgICAgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9ySW1tdXRhYmxlKHByaW50ZXIpOworICAgIH0gZWxzZSB7CisgICAgICBHZW5lcmF0ZURlc2NyaXB0b3JJbml0aWFsaXphdGlvbkNvZGVGb3JNdXRhYmxlKHByaW50ZXIpOworICAgIH0KICAgfSBlbHNlIHsKICAgICBwcmludGVyLT5QcmludCgKICAgICAgICJzdGF0aWMge1xuIik7CiAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgaW50IGJ5dGVjb2RlX2VzdGltYXRlID0gMDsKKyAgICBpbnQgbWV0aG9kX251bSA9IDA7CiAKICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBNZXNzYWdlR2VuZXJhdG9yIG9iamVjdHM/Ci0gICAgICBNZXNzYWdlR2VuZXJhdG9yKGZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpCi0gICAgICAgIC5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOworICAgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0gbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgICAgIE1heWJlUmVzdGFydEphdmFNZXRob2QoCisgICAgICAgIHByaW50ZXIsCisgICAgICAgICZieXRlY29kZV9lc3RpbWF0ZSwgJm1ldGhvZF9udW0sCisgICAgICAgICJfY2xpbml0X2F1dG9zcGxpdF8kbWV0aG9kX251bSQoKTtcbiIsCisgICAgICAgICJwcml2YXRlIHN0YXRpYyB2b2lkIF9jbGluaXRfYXV0b3NwbGl0XyRtZXRob2RfbnVtJCgpIHtcbiIpOwogICAgIH0KIAogICAgIHByaW50ZXItPk91dGRlbnQoKTsKQEAgLTIzMSwxMjggKzM1OCwxNjUgQEAKICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQogCi12b2lkIEZpbGVHZW5lcmF0b3I6OkdlbmVyYXRlRW1iZWRkZWREZXNjcmlwdG9yKGlvOjpQcmludGVyKiBwcmludGVyKSB7Ci0gIC8vIEVtYmVkIHRoZSBkZXNjcmlwdG9yLiAgV2Ugc2ltcGx5IHNlcmlhbGl6ZSB0aGUgZW50aXJlIEZpbGVEZXNjcmlwdG9yUHJvdG8KLSAgLy8gYW5kIGVtYmVkIGl0IGFzIGEgc3RyaW5nIGxpdGVyYWwsIHdoaWNoIGlzIHBhcnNlZCBhbmQgYnVpbHQgaW50byByZWFsCi0gIC8vIGRlc2NyaXB0b3JzIGF0IGluaXRpYWxpemF0aW9uIHRpbWUuICBXZSB1bmZvcnR1bmF0ZWx5IGhhdmUgdG8gcHV0IGl0IGluCi0gIC8vIGEgc3RyaW5nIGxpdGVyYWwsIG5vdCBhIGJ5dGUgYXJyYXksIGJlY2F1c2UgYXBwYXJlbnRseSB1c2luZyBhIGxpdGVyYWwKLSAgLy8gYnl0ZSBhcnJheSBjYXVzZXMgdGhlIEphdmEgY29tcGlsZXIgdG8gZ2VuZXJhdGUgKmluc3RydWN0aW9ucyogdG8KLSAgLy8gaW5pdGlhbGl6ZSBlYWNoIGFuZCBldmVyeSBieXRlIG9mIHRoZSBhcnJheSwgZS5nLiBhcyBpZiB5b3UgdHlwZWQ6Ci0gIC8vICAgYlswXSA9IDEyMzsgYlsxXSA9IDQ1NjsgYlsyXSA9IDc4OTsKLSAgLy8gVGhpcyBtYWtlcyBodWdlIGJ5dGVjb2RlIGZpbGVzIGFuZCBjYW4gZWFzaWx5IGhpdCB0aGUgY29tcGlsZXIncyBpbnRlcm5hbAotICAvLyBjb2RlIHNpemUgbGltaXRzIChlcnJvciAiY29kZSB0byBsYXJnZSIpLiAgU3RyaW5nIGxpdGVyYWxzIGFyZSBhcHBhcmVudGx5Ci0gIC8vIGVtYmVkZGVkIHJhdywgd2hpY2ggaXMgd2hhdCB3ZSB3YW50LgotICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIGZpbGVfLT5Db3B5VG8oJmZpbGVfcHJvdG8pOwotCi0gIHN0cmluZyBmaWxlX2RhdGE7Ci0gIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7Ci0KK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9ySW1tdXRhYmxlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIHByaW50ZXItPlByaW50KAogICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCiAgICAgIiAgcmV0dXJuIGRlc2NyaXB0b3I7XG4iCiAgICAgIn1cbiIKLSAgICAicHJpdmF0ZSBzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgorICAgICJwcml2YXRlIHN0YXRpYyAkZmluYWwkIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKICAgICAiICAgIGRlc2NyaXB0b3I7XG4iCi0gICAgInN0YXRpYyB7XG4iCi0gICAgIiAgamF2YS5sYW5nLlN0cmluZ1tdIGRlc2NyaXB0b3JEYXRhID0ge1xuIik7Ci0gIHByaW50ZXItPkluZGVudCgpOworICAgICJzdGF0aWMge1xuIiwKKyAgICAvLyBUT0RPKGR3ZWlzKTogTWFyayB0aGlzIGFzIGZpbmFsLgorICAgICJmaW5hbCIsICIiKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKLSAgLy8gT25seSB3cml0ZSA0MCBieXRlcyBwZXIgbGluZS4KLSAgc3RhdGljIGNvbnN0IGludCBrQnl0ZXNQZXJMaW5lID0gNDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9kYXRhLnNpemUoKTsgaSArPSBrQnl0ZXNQZXJMaW5lKSB7Ci0gICAgaWYgKGkgPiAwKSB7Ci0gICAgICAvLyBFdmVyeSA0MDAgbGluZXMsIHN0YXJ0IGEgbmV3IHN0cmluZyBsaXRlcmFsLCBpbiBvcmRlciB0byBhdm9pZCB0aGUKLSAgICAgIC8vIDY0ayBsZW5ndGggbGltaXQuCi0gICAgICBpZiAoaSAlIDQwMCA9PSAwKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCIsXG4iKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KCIgK1xuIik7Ci0gICAgICB9Ci0gICAgfQotICAgIHByaW50ZXItPlByaW50KCJcIiRkYXRhJFwiIiwKLSAgICAgICJkYXRhIiwgQ0VzY2FwZShmaWxlX2RhdGEuc3Vic3RyKGksIGtCeXRlc1BlckxpbmUpKSk7Ci0gIH0KKyAgU2hhcmVkQ29kZUdlbmVyYXRvciBzaGFyZWRfY29kZV9nZW5lcmF0b3IoZmlsZV8pOworICBzaGFyZWRfY29kZV9nZW5lcmF0b3IuR2VuZXJhdGVEZXNjcmlwdG9ycyhwcmludGVyKTsKIAotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KCJcbn07XG4iKTsKLQotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBDcmVhdGUgdGhlIEludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyLgotCi0gIHByaW50ZXItPlByaW50KAotICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yLiIKLSAgICAgICJJbnRlcm5hbERlc2NyaXB0b3JBc3NpZ25lciBhc3NpZ25lciA9XG4iCi0gICAgIiAgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3IuIgotICAgICAgIkludGVybmFsRGVzY3JpcHRvckFzc2lnbmVyKCkge1xuIgotICAgICIgICAgcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkgYXNzaWduRGVzY3JpcHRvcnMoXG4iCi0gICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvciByb290KSB7XG4iCi0gICAgIiAgICAgIGRlc2NyaXB0b3IgPSByb290O1xuIik7Ci0KLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIHByaW50ZXItPkluZGVudCgpOwotICBwcmludGVyLT5JbmRlbnQoKTsKKyAgaW50IGJ5dGVjb2RlX2VzdGltYXRlID0gMDsKKyAgaW50IG1ldGhvZF9udW0gPSAwOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBNZXNzYWdlR2VuZXJhdG9yIG9iamVjdHM/Ci0gICAgTWVzc2FnZUdlbmVyYXRvcihmaWxlXy0+bWVzc2FnZV90eXBlKGkpKQotICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMocHJpbnRlcik7CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0gbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS0+R2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgICBNYXliZVJlc3RhcnRKYXZhTWV0aG9kKAorICAgICAgcHJpbnRlciwKKyAgICAgICZieXRlY29kZV9lc3RpbWF0ZSwgJm1ldGhvZF9udW0sCisgICAgICAiX2NsaW5pdF9hdXRvc3BsaXRfZGluaXRfJG1ldGhvZF9udW0kKCk7XG4iLAorICAgICAgInByaXZhdGUgc3RhdGljIHZvaWQgX2NsaW5pdF9hdXRvc3BsaXRfZGluaXRfJG1ldGhvZF9udW0kKCkge1xuIik7CiAgIH0KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewotICAgIC8vIFRPRE8oa2VudG9uKTogIFJldXNlIEV4dGVuc2lvbkdlbmVyYXRvciBvYmplY3RzPwotICAgIEV4dGVuc2lvbkdlbmVyYXRvcihmaWxlXy0+ZXh0ZW5zaW9uKGkpKQotICAgICAgICAuR2VuZXJhdGVOb25OZXN0ZWRJbml0aWFsaXphdGlvbkNvZGUocHJpbnRlcik7CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0gZXh0ZW5zaW9uX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZU5vbk5lc3RlZEluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgICBNYXliZVJlc3RhcnRKYXZhTWV0aG9kKAorICAgICAgcHJpbnRlciwKKyAgICAgICZieXRlY29kZV9lc3RpbWF0ZSwgJm1ldGhvZF9udW0sCisgICAgICAiX2NsaW5pdF9hdXRvc3BsaXRfZGluaXRfJG1ldGhvZF9udW0kKCk7XG4iLAorICAgICAgInByaXZhdGUgc3RhdGljIHZvaWQgX2NsaW5pdF9hdXRvc3BsaXRfZGluaXRfJG1ldGhvZF9udW0kKCkge1xuIik7CiAgIH0KIAotICBpZiAoVXNlc0V4dGVuc2lvbnMoZmlsZV9wcm90bykpIHsKLSAgICAvLyBNdXN0IGNvbnN0cnVjdCBhbiBFeHRlbnNpb25SZWdpc3RyeSBjb250YWluaW5nIGFsbCBwb3NzaWJsZSBleHRlbnNpb25zCi0gICAgLy8gYW5kIHJldHVybiBpdC4KKyAgLy8gUHJvdG8gY29tcGlsZXIgYnVpbGRzIGEgRGVzY3JpcHRvclBvb2wsIHdoaWNoIGhvbGRzIGFsbCB0aGUgZGVzY3JpcHRvcnMgdG8KKyAgLy8gZ2VuZXJhdGUsIHdoZW4gcHJvY2Vzc2luZyB0aGUgIi5wcm90byIgZmlsZXMuIFdlIGNhbGwgdGhpcyBEZXNjcmlwdG9yUG9vbAorICAvLyB0aGUgcGFyc2VkIHBvb2wgKGEuay5hLiBmaWxlXy0+cG9vbCgpKS4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHdoZW4gdXNlcnMgdHJ5IHRvIGV4dGVuZCB0aGUgKC4qKURlc2NyaXB0b3JQcm90byBpbiB0aGVpcgorICAvLyAiLnByb3RvIiBmaWxlcywgaXQgZG9lcyBub3QgYWZmZWN0IHRoZSBwcmUtYnVpbHQgRmlsZURlc2NyaXB0b3JQcm90byBjbGFzcworICAvLyBpbiBwcm90byBjb21waWxlci4gV2hlbiB3ZSBwdXQgdGhlIGRlc2NyaXB0b3IgZGF0YSBpbiB0aGUgZmlsZV9wcm90bywgdGhvc2UKKyAgLy8gZXh0ZW5zaW9ucyBiZWNvbWUgdW5rbm93biBmaWVsZHMuCisgIC8vCisgIC8vIE5vdyB3ZSBuZWVkIHRvIGZpbmQgb3V0IGFsbCB0aGUgZXh0ZW5zaW9uIHZhbHVlIHRvIHRoZSAoLiopRGVzY3JpcHRvclByb3RvCisgIC8vIGluIHRoZSBmaWxlX3Byb3RvIG1lc3NhZ2UsIGFuZCBwcmVwYXJlIGFuIEV4dGVuc2lvblJlZ2lzdHJ5IHRvIHJldHVybi4KKyAgLy8KKyAgLy8gVG8gZmluZCB0aG9zZSBleHRlbnNpb25zLCB3ZSBuZWVkIHRvIHBhcnNlIHRoZSBkYXRhIGludG8gYSBkeW5hbWljIG1lc3NhZ2UKKyAgLy8gb2YgdGhlIEZpbGVEZXNjcmlwdG9yIGJhc2VkIG9uIHRoZSBidWlsZGVyLXBvb2wsIHRoZW4gd2UgY2FuIHVzZQorICAvLyByZWZsZWN0aW9ucyB0byBmaW5kIGFsbCBleHRlbnNpb24gZmllbGRzCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgZmlsZV8tPkNvcHlUbygmZmlsZV9wcm90byk7CisgIHN0cmluZyBmaWxlX2RhdGE7CisgIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7CisgIEZpZWxkRGVzY3JpcHRvclNldCBleHRlbnNpb25zOworICBDb2xsZWN0RXh0ZW5zaW9ucyhmaWxlX3Byb3RvLCAqZmlsZV8tPnBvb2woKSwgJmV4dGVuc2lvbnMsIGZpbGVfZGF0YSk7CisKKyAgaWYgKGV4dGVuc2lvbnMuc2l6ZSgpID4gMCkgeworICAgIC8vIE11c3QgY29uc3RydWN0IGFuIEV4dGVuc2lvblJlZ2lzdHJ5IGNvbnRhaW5pbmcgYWxsIGV4aXN0aW5nIGV4dGVuc2lvbnMKKyAgICAvLyBhbmQgdXNlIGl0IHRvIHBhcnNlIHRoZSBkZXNjcmlwdG9yIGRhdGEgYWdhaW4gdG8gcmVjb2duaXplIGV4dGVuc2lvbnMuCiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSA9XG4iCi0gICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5Lm5ld0luc3RhbmNlKCk7XG4iCi0gICAgICAicmVnaXN0ZXJBbGxFeHRlbnNpb25zKHJlZ2lzdHJ5KTtcbiIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgICBpZiAoU2hvdWxkSW5jbHVkZURlcGVuZGVuY3koZmlsZV8tPmRlcGVuZGVuY3koaSkpKSB7Ci0gICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICAgIiRkZXBlbmRlbmN5JC5yZWdpc3RlckFsbEV4dGVuc2lvbnMocmVnaXN0cnkpO1xuIiwKLSAgICAgICAgICAgICJkZXBlbmRlbmN5IiwgQ2xhc3NOYW1lKGZpbGVfLT5kZXBlbmRlbmN5KGkpKSk7Ci0gICAgICB9CisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnkubmV3SW5zdGFuY2UoKTtcbiIpOworICAgIEZpZWxkRGVzY3JpcHRvclNldDo6aXRlcmF0b3IgaXQ7CisgICAgZm9yIChpdCA9IGV4dGVuc2lvbnMuYmVnaW4oKTsgaXQgIT0gZXh0ZW5zaW9ucy5lbmQoKTsgaXQrKykgeworICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxFeHRlbnNpb25HZW5lcmF0b3I+IGdlbmVyYXRvcigKKyAgICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld0V4dGVuc2lvbkdlbmVyYXRvcigqaXQpKTsKKyAgICAgIGJ5dGVjb2RlX2VzdGltYXRlICs9IGdlbmVyYXRvci0+R2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOworICAgICAgTWF5YmVSZXN0YXJ0SmF2YU1ldGhvZCgKKyAgICAgICAgcHJpbnRlciwKKyAgICAgICAgJmJ5dGVjb2RlX2VzdGltYXRlLCAmbWV0aG9kX251bSwKKyAgICAgICAgIl9jbGluaXRfYXV0b3NwbGl0X2Rpbml0XyRtZXRob2RfbnVtJChyZWdpc3RyeSk7XG4iLAorICAgICAgICAicHJpdmF0ZSBzdGF0aWMgdm9pZCBfY2xpbml0X2F1dG9zcGxpdF9kaW5pdF8kbWV0aG9kX251bSQoXG4iCisgICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeSByZWdpc3RyeSkge1xuIik7CiAgICAgfQogICAgIHByaW50ZXItPlByaW50KAotICAgICAgInJldHVybiByZWdpc3RyeTtcbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInJldHVybiBudWxsO1xuIik7CisgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgorICAgICAgIiAgICAuaW50ZXJuYWxVcGRhdGVGaWxlRGVzY3JpcHRvcihkZXNjcmlwdG9yLCByZWdpc3RyeSk7XG4iKTsKICAgfQogCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgICB9XG4iCi0gICAgIiAgfTtcbiIpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIC8vIEludm9rZSBpbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oKSB0byBidWlsZCB0aGUgZmlsZS4KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvclxuIgotICAgICIgIC5pbnRlcm5hbEJ1aWxkR2VuZXJhdGVkRmlsZUZyb20oZGVzY3JpcHRvckRhdGEsXG4iCi0gICAgIiAgICBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5GaWxlRGVzY3JpcHRvcltdIHtcbiIpOwotCisgIC8vIEZvcmNlIGRlc2NyaXB0b3IgaW5pdGlhbGl6YXRpb24gb2YgYWxsIGRlcGVuZGVuY2llcy4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKLSAgICBpZiAoU2hvdWxkSW5jbHVkZURlcGVuZGVuY3koZmlsZV8tPmRlcGVuZGVuY3koaSkpKSB7CisgICAgaWYgKFNob3VsZEluY2x1ZGVEZXBlbmRlbmN5KGZpbGVfLT5kZXBlbmRlbmN5KGkpLCB0cnVlKSkgeworICAgICAgc3RyaW5nIGRlcGVuZGVuY3kgPQorICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZmlsZV8tPmRlcGVuZGVuY3koaSkpOwogICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIgICAgICAkZGVwZW5kZW5jeSQuZ2V0RGVzY3JpcHRvcigpLFxuIiwKLSAgICAgICAgImRlcGVuZGVuY3kiLCBDbGFzc05hbWUoZmlsZV8tPmRlcGVuZGVuY3koaSkpKTsKKyAgICAgICAgIiRkZXBlbmRlbmN5JC5nZXREZXNjcmlwdG9yKCk7XG4iLAorICAgICAgICAiZGVwZW5kZW5jeSIsIGRlcGVuZGVuY3kpOwogICAgIH0KICAgfQogCisgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgICB9LCBhc3NpZ25lcik7XG4iKTsKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgRmlsZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9yTXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkZpbGVEZXNjcmlwdG9yXG4iCisgICAgIiAgICBnZXREZXNjcmlwdG9yKCkge1xuIgorICAgICIgIHJldHVybiBkZXNjcmlwdG9yO1xuIgorICAgICJ9XG4iCisgICAgInByaXZhdGUgc3RhdGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRmlsZURlc2NyaXB0b3JcbiIKKyAgICAiICAgIGRlc2NyaXB0b3I7XG4iCisgICAgInN0YXRpYyB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImRlc2NyaXB0b3IgPSAkaW1tdXRhYmxlX3BhY2thZ2UkLiRkZXNjcmlwdG9yX2NsYXNzbmFtZSQuZGVzY3JpcHRvcjtcbiIsCisgICAgImltbXV0YWJsZV9wYWNrYWdlIiwgRmlsZUphdmFQYWNrYWdlKGZpbGVfLCB0cnVlKSwKKyAgICAiZGVzY3JpcHRvcl9jbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0RGVzY3JpcHRvckNsYXNzTmFtZShmaWxlXykpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKKyAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLT5HZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKHByaW50ZXIpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb25fZ2VuZXJhdG9yc19baV0tPkdlbmVyYXRlTm9uTmVzdGVkSW5pdGlhbGl6YXRpb25Db2RlKHByaW50ZXIpOworICB9CisKKyAgLy8gQ2hlY2sgaWYgY3VzdG9tIG9wdGlvbnMgZXhpc3QuIElmIGFueSwgdHJ5IHRvIGxvYWQgaW1tdXRhYmxlIGNsYXNzZXMgc2luY2UKKyAgLy8gY3VzdG9tIG9wdGlvbnMgYXJlIG9ubHkgcmVwcmVzZW50ZWQgd2l0aCBpbW11dGFibGUgbWVzc2FnZXMuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgZmlsZV8tPkNvcHlUbygmZmlsZV9wcm90byk7CisgIHN0cmluZyBmaWxlX2RhdGE7CisgIGZpbGVfcHJvdG8uU2VyaWFsaXplVG9TdHJpbmcoJmZpbGVfZGF0YSk7CisgIEZpZWxkRGVzY3JpcHRvclNldCBleHRlbnNpb25zOworICBDb2xsZWN0RXh0ZW5zaW9ucyhmaWxlX3Byb3RvLCAqZmlsZV8tPnBvb2woKSwgJmV4dGVuc2lvbnMsIGZpbGVfZGF0YSk7CisKKyAgaWYgKGV4dGVuc2lvbnMuc2l6ZSgpID4gMCkgeworICAgIC8vIFRyeSB0byBsb2FkIGltbXV0YWJsZSBtZXNzYWdlcycgb3V0ZXIgY2xhc3MuIEl0cyBpbml0aWFsaXphdGlvbiBjb2RlCisgICAgLy8gd2lsbCB0YWtlIGNhcmUgb2YgaW50ZXJwcmV0aW5nIGN1c3RvbSBvcHRpb25zLgorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInRyeSB7XG4iCisgICAgICAvLyBOb3RlIHRoYXQgd2UgaGF2ZSB0byBsb2FkIHRoZSBpbW11dGFibGUgY2xhc3MgZHluYW1pY2FsbHkgaGVyZSBhcworICAgICAgLy8gd2Ugd2FudCB0aGUgbXV0YWJsZSBjb2RlIHRvIGJlIGluZGVwZW5kZW50IGZyb20gdGhlIGltbXV0YWJsZSBjb2RlCisgICAgICAvLyBhdCBjb21waWxlIHRpbWUuIEl0IGlzIHJlcXVpcmVkIHRvIGltcGxlbWVudCBkdWFsLWNvbXBpbGUgZm9yCisgICAgICAvLyBtdXRhYmxlIGFuZCBpbW11dGFibGUgQVBJIGluIGJsYXplLgorICAgICAgIiAgamF2YS5sYW5nLkNsYXNzIGltbXV0YWJsZUNsYXNzID0gamF2YS5sYW5nLkNsYXNzLmZvck5hbWUoXG4iCisgICAgICAiICAgICAgXCIkaW1tdXRhYmxlX2NsYXNzbmFtZSRcIik7XG4iCisgICAgICAifSBjYXRjaCAoamF2YS5sYW5nLkNsYXNzTm90Rm91bmRFeGNlcHRpb24gZSkge1xuIgorICAgICAgLy8gVGhlIGltbXV0YWJsZSBjbGFzcyBjYW4gbm90IGJlIGZvdW5kLiBDdXN0b20gb3B0aW9ucyBhcmUgbGVmdAorICAgICAgLy8gYXMgdW5rbm93biBmaWVsZHMuCisgICAgICAvLyBUT0RPKHhpYW9mZW5nKTogaW5mb3JtIHRoZSB1c2VyIHdpdGggYSB3YXJuaW5nPworICAgICAgIn1cbiIsCisgICAgICAiaW1tdXRhYmxlX2NsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZmlsZV8pKTsKKyAgfQorCisgIC8vIEZvcmNlIGRlc2NyaXB0b3IgaW5pdGlhbGl6YXRpb24gb2YgYWxsIGRlcGVuZGVuY2llcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoU2hvdWxkSW5jbHVkZURlcGVuZGVuY3koZmlsZV8tPmRlcGVuZGVuY3koaSksIGZhbHNlKSkgeworICAgICAgc3RyaW5nIGRlcGVuZGVuY3kgPSBuYW1lX3Jlc29sdmVyXy0+R2V0TXV0YWJsZUNsYXNzTmFtZSgKKyAgICAgICAgICBmaWxlXy0+ZGVwZW5kZW5jeShpKSk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiRkZXBlbmRlbmN5JC5nZXREZXNjcmlwdG9yKCk7XG4iLAorICAgICAgICAiZGVwZW5kZW5jeSIsIGRlcGVuZGVuY3kpOworICAgIH0KKyAgfQogCiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoCkBAIC0zNjYsMTYgKzUzMCwxOSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIGZpbGVfbGlzdCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWVfc3VmZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNsYXNzKiBnZW5lcmF0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoR2VuZXJhdG9yQ2xhc3M6OipwZm4pKGlvOjpQcmludGVyKiBwcmludGVyKSkgewogICBzdHJpbmcgZmlsZW5hbWUgPSBwYWNrYWdlX2RpciArIGRlc2NyaXB0b3ItPm5hbWUoKSArIG5hbWVfc3VmZml4ICsgIi5qYXZhIjsKICAgZmlsZV9saXN0LT5wdXNoX2JhY2soZmlsZW5hbWUpOwogCi0gIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoY29udGV4dC0+T3BlbihmaWxlbmFtZSkpOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KGNvbnRleHQtPk9wZW4oZmlsZW5hbWUpKTsKICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CiAKICAgcHJpbnRlci5QcmludCgKICAgICAiLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKLSAgICAiXG4iKTsKKyAgICAiLy8gc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgIlxuIiwKKyAgICAiZmlsZW5hbWUiLCBkZXNjcmlwdG9yLT5maWxlKCktPm5hbWUoKSk7CiAgIGlmICghamF2YV9wYWNrYWdlLmVtcHR5KCkpIHsKICAgICBwcmludGVyLlByaW50KAogICAgICAgInBhY2thZ2UgJHBhY2thZ2UkO1xuIgpAQCAtMzgzLDQyICs1NTAsNjMgQEAKICAgICAgICJwYWNrYWdlIiwgamF2YV9wYWNrYWdlKTsKICAgfQogCi0gIEdlbmVyYXRvckNsYXNzIGdlbmVyYXRvcihkZXNjcmlwdG9yKTsKLSAgKGdlbmVyYXRvci4qcGZuKSgmcHJpbnRlcik7CisgIChnZW5lcmF0b3ItPipwZm4pKCZwcmludGVyKTsKIH0KIAogdm9pZCBGaWxlR2VuZXJhdG9yOjpHZW5lcmF0ZVNpYmxpbmdzKGNvbnN0IHN0cmluZyYgcGFja2FnZV9kaXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR2VuZXJhdG9yQ29udGV4dCogY29udGV4dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZmlsZV9saXN0KSB7Ci0gIGlmIChmaWxlXy0+b3B0aW9ucygpLmphdmFfbXVsdGlwbGVfZmlsZXMoKSkgeworICBpZiAoTXVsdGlwbGVKYXZhRmlsZXMoZmlsZV8sIGltbXV0YWJsZV9hcGlfKSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIEdlbmVyYXRlU2libGluZzxFbnVtR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+ZW51bV90eXBlKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVudW1HZW5lcmF0b3I6OkdlbmVyYXRlKTsKKyAgICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhmaWxlXywgY29udGV4dF8tPkVuZm9yY2VMaXRlKCkpKSB7CisgICAgICAgIEVudW1HZW5lcmF0b3IgZ2VuZXJhdG9yKGZpbGVfLT5lbnVtX3R5cGUoaSksIGltbXV0YWJsZV9hcGlfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Xy5nZXQoKSk7CisgICAgICAgIEdlbmVyYXRlU2libGluZzxFbnVtR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGVfLT5lbnVtX3R5cGUoaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBmaWxlX2xpc3QsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmdlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZFbnVtR2VuZXJhdG9yOjpHZW5lcmF0ZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBFbnVtTGl0ZUdlbmVyYXRvciBnZW5lcmF0b3IoZmlsZV8tPmVudW1fdHlwZShpKSwgaW1tdXRhYmxlX2FwaV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0Xy5nZXQoKSk7CisgICAgICAgIEdlbmVyYXRlU2libGluZzxFbnVtTGl0ZUdlbmVyYXRvcj4ocGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV8tPmVudW1fdHlwZShpKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBmaWxlX2xpc3QsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZnZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkVudW1MaXRlR2VuZXJhdG9yOjpHZW5lcmF0ZSk7CisgICAgICB9CiAgICAgfQogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIk9yQnVpbGRlciIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKTsKKyAgICAgIGlmIChpbW11dGFibGVfYXBpXykgeworICAgICAgICBHZW5lcmF0ZVNpYmxpbmc8TWVzc2FnZUdlbmVyYXRvcj4ocGFja2FnZV9kaXIsIGphdmFfcGFja2FnZV8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGV4dCwgZmlsZV9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIk9yQnVpbGRlciIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2dlbmVyYXRvcnNfW2ldLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJk1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSW50ZXJmYWNlKTsKKyAgICAgIH0KICAgICAgIEdlbmVyYXRlU2libGluZzxNZXNzYWdlR2VuZXJhdG9yPihwYWNrYWdlX2RpciwgamF2YV9wYWNrYWdlXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWxlXy0+bWVzc2FnZV90eXBlKGkpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQsIGZpbGVfbGlzdCwgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZV9nZW5lcmF0b3JzX1tpXS5nZXQoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGUpOwogICAgIH0KLSAgICBpZiAoSGFzR2VuZXJpY1NlcnZpY2VzKGZpbGVfKSkgeworICAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZV8sIGNvbnRleHRfLT5FbmZvcmNlTGl0ZSgpKSkgewogICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+c2VydmljZV9jb3VudCgpOyBpKyspIHsKKyAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxTZXJ2aWNlR2VuZXJhdG9yPiBnZW5lcmF0b3IoCisgICAgICAgICAgICBnZW5lcmF0b3JfZmFjdG9yeV8tPk5ld1NlcnZpY2VHZW5lcmF0b3IoZmlsZV8tPnNlcnZpY2UoaSkpKTsKICAgICAgICAgR2VuZXJhdGVTaWJsaW5nPFNlcnZpY2VHZW5lcmF0b3I+KHBhY2thZ2VfZGlyLCBqYXZhX3BhY2thZ2VfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZV8tPnNlcnZpY2UoaSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LCBmaWxlX2xpc3QsICIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2VuZXJhdG9yLmdldCgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJlNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlKTsKICAgICAgIH0KICAgICB9CiAgIH0KIH0KIAotYm9vbCBGaWxlR2VuZXJhdG9yOjpTaG91bGRJbmNsdWRlRGVwZW5kZW5jeShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworYm9vbCBGaWxlR2VuZXJhdG9yOjpTaG91bGRJbmNsdWRlRGVwZW5kZW5jeSgKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBpbW11dGFibGVfYXBpKSB7CiAgIHJldHVybiB0cnVlOwogfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaAppbmRleCA1OTkxMTQ2Li43ZGJlYjk0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZmlsZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWxlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDE4ICszNSwyOSBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUxFX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9GSUxFX0hfXwogCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0gIGNsYXNzIEZpbGVEZXNjcmlwdG9yOyAgICAgICAgLy8gZGVzY3JpcHRvci5oCisgIGNsYXNzIEZpbGVEZXNjcmlwdG9yOyAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKICAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAvLyBwcmludGVyLmgKKyAgICBjbGFzcyBQcmludGVyOyAgICAgICAgICAgICAgIC8vIHByaW50ZXIuaAogICB9CiAgIG5hbWVzcGFjZSBjb21waWxlciB7Ci0gICAgY2xhc3MgR2VuZXJhdG9yQ29udGV4dDsgICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKKyAgICBjbGFzcyBHZW5lcmF0b3JDb250ZXh0OyAgICAgIC8vIGNvZGVfZ2VuZXJhdG9yLmgKKyAgICBuYW1lc3BhY2UgamF2YSB7CisgICAgICBjbGFzcyBDb250ZXh0OyAgICAgICAgICAgICAvLyBjb250ZXh0LmgKKyAgICAgIGNsYXNzIE1lc3NhZ2VHZW5lcmF0b3I7ICAgIC8vIG1lc3NhZ2UuaAorICAgICAgY2xhc3MgR2VuZXJhdG9yRmFjdG9yeTsgICAgLy8gZ2VuZXJhdG9yX2ZhY3RvcnkuaAorICAgICAgY2xhc3MgRXh0ZW5zaW9uR2VuZXJhdG9yOyAgLy8gZXh0ZW5zaW9uLmgKKyAgICAgIGNsYXNzIENsYXNzTmFtZVJlc29sdmVyOyAgIC8vIG5hbWVfcmVzb2x2ZXIuaAorICAgIH0KICAgfQogfQogCkBAIC01Niw3ICs2Nyw4IEBACiAKIGNsYXNzIEZpbGVHZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgRmlsZUdlbmVyYXRvcihjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisgIEZpbGVHZW5lcmF0b3IoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW1tdXRhYmxlX2FwaSA9IHRydWUsCisgICAgICAgICAgICAgICAgYm9vbCBlbmZvcmNlX2xpdGUgPSBmYWxzZSk7CiAgIH5GaWxlR2VuZXJhdG9yKCk7CiAKICAgLy8gQ2hlY2tzIGZvciBwcm9ibGVtcyB0aGF0IHdvdWxkIG90aGVyd2lzZSBsZWFkIHRvIGNyeXB0aWMgY29tcGlsZSBlcnJvcnMuCkBAIC03OCwxNyArOTAsMjMgQEAKIAogCiAgcHJpdmF0ZToKLSAgLy8gUmV0dXJucyB3aGV0aGVyIHRoZSBkZXBlbmRlbmN5IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0IGZpbGUuCi0gIC8vIEFsd2F5cyByZXR1cm5zIHRydWUgZm9yIG9wZW5zb3VyY2UsIGJ1dCB1c2VkIGludGVybmFsbHkgYXQgR29vZ2xlIHRvIGhlbHAKLSAgLy8gaW1wcm92ZSBjb21wYXRpYmlsaXR5IHdpdGggdmVyc2lvbiAxIG9mIHByb3RvY29sIGJ1ZmZlcnMuCi0gIGJvb2wgU2hvdWxkSW5jbHVkZURlcGVuZGVuY3koY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvckluaXRpYWxpemF0aW9uQ29kZUZvckltbXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVEZXNjcmlwdG9ySW5pdGlhbGl6YXRpb25Db2RlRm9yTXV0YWJsZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyAgYm9vbCBTaG91bGRJbmNsdWRlRGVwZW5kZW5jeShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGltbXV0YWJsZV9hcGlfKTsKIAogICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CiAgIHN0cmluZyBqYXZhX3BhY2thZ2VfOwogICBzdHJpbmcgY2xhc3NuYW1lXzsKIAorICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfYXJyYXk8Z29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlR2VuZXJhdG9yPiA+IG1lc3NhZ2VfZ2VuZXJhdG9yc187CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPEV4dGVuc2lvbkdlbmVyYXRvcj4gPiBleHRlbnNpb25fZ2VuZXJhdG9yc187CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8R2VuZXJhdG9yRmFjdG9yeT4gZ2VuZXJhdG9yX2ZhY3RvcnlfOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPENvbnRleHQ+IGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisgIGJvb2wgaW1tdXRhYmxlX2FwaV87CiAKLSAgdm9pZCBHZW5lcmF0ZUVtYmVkZGVkRGVzY3JpcHRvcihpbzo6UHJpbnRlciogcHJpbnRlcik7CiAKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpbGVHZW5lcmF0b3IpOwogfTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmNjCmluZGV4IGU2Yzc5YWIuLmE0NmM3ZmMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzMsOCArMzMsMTYgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmg+CisKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvcl9mYWN0b3J5Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zaGFyZWRfY29kZV9nZW5lcmF0b3IuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KQEAgLTY0LDU1ICs3Miw5NiBAQAogICB2ZWN0b3I8cGFpcjxzdHJpbmcsIHN0cmluZz4gPiBvcHRpb25zOwogICBQYXJzZUdlbmVyYXRvclBhcmFtZXRlcihwYXJhbWV0ZXIsICZvcHRpb25zKTsKIAorICBib29sIGdlbmVyYXRlX2ltbXV0YWJsZV9jb2RlID0gZmFsc2U7CisgIGJvb2wgZ2VuZXJhdGVfbXV0YWJsZV9jb2RlID0gZmFsc2U7CisgIGJvb2wgZ2VuZXJhdGVfc2hhcmVkX2NvZGUgPSBmYWxzZTsKKyAgYm9vbCBlbmZvcmNlX2xpdGUgPSBmYWxzZTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnNpemUoKTsgaSsrKSB7CiAgICAgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gIm91dHB1dF9saXN0X2ZpbGUiKSB7CiAgICAgICBvdXRwdXRfbGlzdF9maWxlID0gb3B0aW9uc1tpXS5zZWNvbmQ7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJpbW11dGFibGUiKSB7CisgICAgICBnZW5lcmF0ZV9pbW11dGFibGVfY29kZSA9IHRydWU7CisgICAgfSBlbHNlIGlmIChvcHRpb25zW2ldLmZpcnN0ID09ICJtdXRhYmxlIikgeworICAgICAgZ2VuZXJhdGVfbXV0YWJsZV9jb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gInNoYXJlZCIpIHsKKyAgICAgIGdlbmVyYXRlX3NoYXJlZF9jb2RlID0gdHJ1ZTsKKyAgICB9IGVsc2UgaWYgKG9wdGlvbnNbaV0uZmlyc3QgPT0gImxpdGUiKSB7CisgICAgICAvLyBXaGVuIHNldCwgdGhlIHByb3RvYyB3aWxsIGdlbmVyYXRlIHRoZSBjdXJyZW50IGZpbGVzIGFuZCBhbGwgdGhlCisgICAgICAvLyB0cmFuc2l0aXZlIGRlcGVuZGVuY2llcyBhcyBsaXRlIHJ1bnRpbWUuCisgICAgICBlbmZvcmNlX2xpdGUgPSB0cnVlOwogICAgIH0gZWxzZSB7CiAgICAgICAqZXJyb3IgPSAiVW5rbm93biBnZW5lcmF0b3Igb3B0aW9uOiAiICsgb3B0aW9uc1tpXS5maXJzdDsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAgIH0KIAorICBpZiAoZW5mb3JjZV9saXRlICYmIGdlbmVyYXRlX211dGFibGVfY29kZSkgeworICAgICplcnJvciA9ICJsaXRlIHJ1bnRpbWUgZ2VuZXJhdG9yIG9wdGlvbiBjYW5ub3QgYmUgdXNlZCB3aXRoIG11dGFibGUgQVBJLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQnkgZGVmYXVsdCB3ZSBnZW5lcmF0ZSBpbW11dGFibGUgY29kZSBhbmQgc2hhcmVkIGNvZGUgZm9yIGltbXV0YWJsZSBBUEkuCisgIGlmICghZ2VuZXJhdGVfaW1tdXRhYmxlX2NvZGUgJiYgIWdlbmVyYXRlX211dGFibGVfY29kZSAmJgorICAgICAgIWdlbmVyYXRlX3NoYXJlZF9jb2RlKSB7CisgICAgZ2VuZXJhdGVfaW1tdXRhYmxlX2NvZGUgPSB0cnVlOworICAgIGdlbmVyYXRlX3NoYXJlZF9jb2RlID0gdHJ1ZTsKKyAgfQorCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAotICBpZiAoZmlsZS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpID09IEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUUgJiYKLSAgICAgIGZpbGUtPm9wdGlvbnMoKS5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpKSB7Ci0gICAgKmVycm9yID0gIlRoZSBcImphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXCIgb3B0aW9uIGlzIGluY29tcGF0aWJsZSAiCi0gICAgICAgICAgICAgIndpdGggXCJvcHRpbWl6ZV9mb3IgPSBMSVRFX1JVTlRJTUVcIi4gIFlvdSBtdXN0IG9wdGltaXplIGZvciAiCi0gICAgICAgICAgICAgIlNQRUVEIG9yIENPREVfU0laRSBpZiB5b3Ugd2FudCB0byB1c2UgdGhpcyBvcHRpb24uIjsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLQotICBGaWxlR2VuZXJhdG9yIGZpbGVfZ2VuZXJhdG9yKGZpbGUpOwotICBpZiAoIWZpbGVfZ2VuZXJhdG9yLlZhbGlkYXRlKGVycm9yKSkgewotICAgIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIHN0cmluZyBwYWNrYWdlX2RpciA9IEphdmFQYWNrYWdlVG9EaXIoZmlsZV9nZW5lcmF0b3IuamF2YV9wYWNrYWdlKCkpOwotCiAgIHZlY3RvcjxzdHJpbmc+IGFsbF9maWxlczsKIAotICBzdHJpbmcgamF2YV9maWxlbmFtZSA9IHBhY2thZ2VfZGlyOwotICBqYXZhX2ZpbGVuYW1lICs9IGZpbGVfZ2VuZXJhdG9yLmNsYXNzbmFtZSgpOwotICBqYXZhX2ZpbGVuYW1lICs9ICIuamF2YSI7Ci0gIGFsbF9maWxlcy5wdXNoX2JhY2soamF2YV9maWxlbmFtZSk7CiAKLSAgLy8gR2VuZXJhdGUgbWFpbiBqYXZhIGZpbGUuCi0gIHNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCi0gICAgY29udGV4dC0+T3BlbihqYXZhX2ZpbGVuYW1lKSk7Ci0gIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOwotICBmaWxlX2dlbmVyYXRvci5HZW5lcmF0ZSgmcHJpbnRlcik7CisgIHZlY3RvcjxGaWxlR2VuZXJhdG9yKj4gZmlsZV9nZW5lcmF0b3JzOworICBpZiAoZ2VuZXJhdGVfaW1tdXRhYmxlX2NvZGUpIHsKKyAgICBmaWxlX2dlbmVyYXRvcnMucHVzaF9iYWNrKAorICAgICAgICBuZXcgRmlsZUdlbmVyYXRvcihmaWxlLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlLCBlbmZvcmNlX2xpdGUpKTsKKyAgfQorICBpZiAoZ2VuZXJhdGVfbXV0YWJsZV9jb2RlKSB7CisgICAgZmlsZV9nZW5lcmF0b3JzLnB1c2hfYmFjaygKKyAgICAgICAgbmV3IEZpbGVHZW5lcmF0b3IoZmlsZSwgLyogbXV0YWJsZSA9ICovIGZhbHNlLCBlbmZvcmNlX2xpdGUpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfZ2VuZXJhdG9ycy5zaXplKCk7ICsraSkgeworICAgIGlmICghZmlsZV9nZW5lcmF0b3JzW2ldLT5WYWxpZGF0ZShlcnJvcikpIHsKKyAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgZmlsZV9nZW5lcmF0b3JzLnNpemUoKTsgKytqKSB7CisgICAgICAgIGRlbGV0ZSBmaWxlX2dlbmVyYXRvcnNbal07CisgICAgICB9CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICB9CiAKLSAgLy8gR2VuZXJhdGUgc2libGluZyBmaWxlcy4KLSAgZmlsZV9nZW5lcmF0b3IuR2VuZXJhdGVTaWJsaW5ncyhwYWNrYWdlX2RpciwgY29udGV4dCwgJmFsbF9maWxlcyk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9nZW5lcmF0b3JzLnNpemUoKTsgKytpKSB7CisgICAgRmlsZUdlbmVyYXRvciogZmlsZV9nZW5lcmF0b3IgPSBmaWxlX2dlbmVyYXRvcnNbaV07CisKKyAgICBzdHJpbmcgcGFja2FnZV9kaXIgPSBKYXZhUGFja2FnZVRvRGlyKGZpbGVfZ2VuZXJhdG9yLT5qYXZhX3BhY2thZ2UoKSk7CisKKyAgICBzdHJpbmcgamF2YV9maWxlbmFtZSA9IHBhY2thZ2VfZGlyOworICAgIGphdmFfZmlsZW5hbWUgKz0gZmlsZV9nZW5lcmF0b3ItPmNsYXNzbmFtZSgpOworICAgIGphdmFfZmlsZW5hbWUgKz0gIi5qYXZhIjsKKyAgICBhbGxfZmlsZXMucHVzaF9iYWNrKGphdmFfZmlsZW5hbWUpOworCisgICAgLy8gR2VuZXJhdGUgbWFpbiBqYXZhIGZpbGUuCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgY29udGV4dC0+T3BlbihqYXZhX2ZpbGVuYW1lKSk7CisgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CisgICAgZmlsZV9nZW5lcmF0b3ItPkdlbmVyYXRlKCZwcmludGVyKTsKKworICAgIC8vIEdlbmVyYXRlIHNpYmxpbmcgZmlsZXMuCisgICAgZmlsZV9nZW5lcmF0b3ItPkdlbmVyYXRlU2libGluZ3MocGFja2FnZV9kaXIsIGNvbnRleHQsICZhbGxfZmlsZXMpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlX2dlbmVyYXRvcnMuc2l6ZSgpOyArK2kpIHsKKyAgICBkZWxldGUgZmlsZV9nZW5lcmF0b3JzW2ldOworICB9CisgIGZpbGVfZ2VuZXJhdG9ycy5jbGVhcigpOwogCiAgIC8vIEdlbmVyYXRlIG91dHB1dCBsaXN0IGlmIHJlcXVlc3RlZC4KICAgaWYgKCFvdXRwdXRfbGlzdF9maWxlLmVtcHR5KCkpIHsKICAgICAvLyBHZW5lcmF0ZSBvdXRwdXQgbGlzdC4gIFRoaXMgaXMganVzdCBhIHNpbXBsZSB0ZXh0IGZpbGUgcGxhY2VkIGluIGEKICAgICAvLyBkZXRlcm1pbmlzdGljIGxvY2F0aW9uIHdoaWNoIGxpc3RzIHRoZSAuamF2YSBmaWxlcyBiZWluZyBnZW5lcmF0ZWQuCi0gICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IHNyY2xpc3RfcmF3X291dHB1dCgKLSAgICAgIGNvbnRleHQtPk9wZW4ob3V0cHV0X2xpc3RfZmlsZSkpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBzcmNsaXN0X3Jhd19vdXRwdXQoCisgICAgICAgIGNvbnRleHQtPk9wZW4ob3V0cHV0X2xpc3RfZmlsZSkpOwogICAgIGlvOjpQcmludGVyIHNyY2xpc3RfcHJpbnRlcihzcmNsaXN0X3Jhd19vdXRwdXQuZ2V0KCksICckJyk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbGxfZmlsZXMuc2l6ZSgpOyBpKyspIHsKICAgICAgIHNyY2xpc3RfcHJpbnRlci5QcmludCgiJGZpbGVuYW1lJFxuIiwgImZpbGVuYW1lIiwgYWxsX2ZpbGVzW2ldKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaAppbmRleCA4ODhiOGQ4Li40N2Y3NmJlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2dlbmVyYXRvci5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZ2VuZXJhdG9yX2ZhY3RvcnkuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYwppbmRleCAxYjZmMTY1Li5lMjQ4OTRiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsMTEgKzMyLDE1IEBACiAvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KIApAQCAtNDUsNiArNDksOSBAQAogbmFtZXNwYWNlIGNvbXBpbGVyIHsKIG5hbWVzcGFjZSBqYXZhIHsKIAordXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXQ7Cit1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU7CisKIGNvbnN0IGNoYXIga1RoaWNrU2VwYXJhdG9yW10gPQogICAiLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PVxuIjsKIGNvbnN0IGNoYXIga1RoaW5TZXBhcmF0b3JbXSA9CkBAIC01NCwxOCArNjEsNDcgQEAKIAogY29uc3QgY2hhcioga0RlZmF1bHRQYWNrYWdlID0gIiI7CiAKLWNvbnN0IHN0cmluZyYgRmllbGROYW1lKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKy8vIE5hbWVzIHRoYXQgc2hvdWxkIGJlIGF2b2lkZWQgYXMgZmllbGQgbmFtZXMuCisvLyBVc2luZyB0aGVtIHdpbGwgY2F1c2UgdGhlIGNvbXBpbGVyIHRvIGdlbmVyYXRlIGFjY2Vzc29ycyB3aG9zZSBuYW1lcyBhcmUKKy8vIGNvbGxpZGluZyB3aXRoIG1ldGhvZHMgZGVmaW5lZCBpbiBiYXNlIGNsYXNzZXMuCitjb25zdCBjaGFyKiBrRm9yYmlkZGVuV29yZExpc3RbXSA9IHsKKyAgLy8gbWVzc2FnZSBiYXNlIGNsYXNzOgorICAiY2FjaGVkX3NpemUiLCAic2VyaWFsaXplZF9zaXplIiwKKyAgLy8gamF2YS5sYW5nLk9iamVjdDoKKyAgImNsYXNzIiwKK307CisKK2Jvb2wgSXNGb3JiaWRkZW4oY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgR09PR0xFX0FSUkFZU0laRShrRm9yYmlkZGVuV29yZExpc3QpOyArK2kpIHsKKyAgICBpZiAoZmllbGRfbmFtZSA9PSBrRm9yYmlkZGVuV29yZExpc3RbaV0pIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK3N0cmluZyBGaWVsZE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBzdHJpbmcgZmllbGRfbmFtZTsKICAgLy8gR3JvdXBzIGFyZSBoYWNreTogIFRoZSBuYW1lIG9mIHRoZSBmaWVsZCBpcyBqdXN0IHRoZSBsb3dlci1jYXNlZCBuYW1lCiAgIC8vIG9mIHRoZSBncm91cCB0eXBlLiAgSW4gSmF2YSwgdGhvdWdoLCB3ZSB3b3VsZCBsaWtlIHRvIHJldGFpbiB0aGUgb3JpZ2luYWwKICAgLy8gY2FwaXRhbGl6YXRpb24gb2YgdGhlIHR5cGUgbmFtZS4KICAgaWYgKEdldFR5cGUoZmllbGQpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCkgewotICAgIHJldHVybiBmaWVsZC0+bWVzc2FnZV90eXBlKCktPm5hbWUoKTsKKyAgICBmaWVsZF9uYW1lID0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCk7CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGZpZWxkLT5uYW1lKCk7CisgICAgZmllbGRfbmFtZSA9IGZpZWxkLT5uYW1lKCk7CiAgIH0KKyAgaWYgKElzRm9yYmlkZGVuKGZpZWxkX25hbWUpKSB7CisgICAgLy8gQXBwZW5kIGEgdHJhaWxpbmcgIiMiIHRvIGluZGljYXRlIHRoYXQgdGhlIG5hbWUgc2hvdWxkIGJlIGRlY29yYXRlZCB0bworICAgIC8vIGF2b2lkIGNvbGxpc2lvbiB3aXRoIG90aGVyIG5hbWVzLgorICAgIGZpZWxkX25hbWUgKz0gIiMiOworICB9CisgIHJldHVybiBmaWVsZF9uYW1lOwogfQogCi1zdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwoY29uc3Qgc3RyaW5nJiBpbnB1dCwgYm9vbCBjYXBfbmV4dF9sZXR0ZXIpIHsKKworfSAgLy8gbmFtZXNwYWNlCisKK3N0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgY2FwX25leHRfbGV0dGVyKSB7CiAgIHN0cmluZyByZXN1bHQ7CiAgIC8vIE5vdGU6ICBJIGRpc3RydXN0IGN0eXBlLmggZHVlIHRvIGxvY2FsZXMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgaW5wdXQuc2l6ZSgpOyBpKyspIHsKQEAgLTkzLDIxICsxMjksMjcgQEAKICAgICAgIGNhcF9uZXh0X2xldHRlciA9IHRydWU7CiAgICAgfQogICB9CisgIC8vIEFkZCBhIHRyYWlsaW5nICJfIiBpZiB0aGUgbmFtZSBzaG91bGQgYmUgYWx0ZXJlZC4KKyAgaWYgKGlucHV0W2lucHV0LnNpemUoKSAtIDFdID09ICcjJykgeworICAgIHJlc3VsdCArPSAnXyc7CisgIH0KICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotfSAgLy8gbmFtZXNwYWNlCi0KIHN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgcmV0dXJuIFVuZGVyc2NvcmVzVG9DYW1lbENhc2VJbXBsKEZpZWxkTmFtZShmaWVsZCksIGZhbHNlKTsKKyAgcmV0dXJuIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoRmllbGROYW1lKGZpZWxkKSwgZmFsc2UpOwogfQogCiBzdHJpbmcgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgcmV0dXJuIFVuZGVyc2NvcmVzVG9DYW1lbENhc2VJbXBsKEZpZWxkTmFtZShmaWVsZCksIHRydWUpOworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShGaWVsZE5hbWUoZmllbGQpLCB0cnVlKTsKIH0KIAogc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3QgTWV0aG9kRGVzY3JpcHRvciogbWV0aG9kKSB7Ci0gIHJldHVybiBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlSW1wbChtZXRob2QtPm5hbWUoKSwgZmFsc2UpOworICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QtPm5hbWUoKSwgZmFsc2UpOworfQorCitzdHJpbmcgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiAic3RhdGljXyIgKyBTdHJpbmdSZXBsYWNlKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCAiLiIsICJfIiwgdHJ1ZSk7CiB9CiAKIHN0cmluZyBTdHJpcFByb3RvKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIHsKQEAgLTExOCwyMiArMTYwLDEyIEBACiAgIH0KIH0KIAotc3RyaW5nIEZpbGVDbGFzc05hbWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKLSAgaWYgKGZpbGUtPm9wdGlvbnMoKS5oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgewotICAgIHJldHVybiBmaWxlLT5vcHRpb25zKCkuamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgfSBlbHNlIHsKLSAgICBzdHJpbmcgYmFzZW5hbWU7Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgbGFzdF9zbGFzaCA9IGZpbGUtPm5hbWUoKS5maW5kX2xhc3Rfb2YoJy8nKTsKLSAgICBpZiAobGFzdF9zbGFzaCA9PSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGJhc2VuYW1lID0gZmlsZS0+bmFtZSgpOwotICAgIH0gZWxzZSB7Ci0gICAgICBiYXNlbmFtZSA9IGZpbGUtPm5hbWUoKS5zdWJzdHIobGFzdF9zbGFzaCArIDEpOwotICAgIH0KLSAgICByZXR1cm4gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZUltcGwoU3RyaXBQcm90byhiYXNlbmFtZSksIHRydWUpOwotICB9CitzdHJpbmcgRmlsZUNsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSwgYm9vbCBpbW11dGFibGUpIHsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIgbmFtZV9yZXNvbHZlcjsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXIuR2V0RmlsZUNsYXNzTmFtZShmaWxlLCBpbW11dGFibGUpOwogfQogCi1zdHJpbmcgRmlsZUphdmFQYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CitzdHJpbmcgRmlsZUphdmFQYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSkgewogICBzdHJpbmcgcmVzdWx0OwogCiAgIGlmIChmaWxlLT5vcHRpb25zKCkuaGFzX2phdmFfcGFja2FnZSgpKSB7CkBAIC0xNDYsNyArMTc4LDYgQEAKICAgICB9CiAgIH0KIAotCiAgIHJldHVybiByZXN1bHQ7CiB9CiAKQEAgLTE1Nyw3ICsxODgsMTAgQEAKICAgcmV0dXJuIHBhY2thZ2VfZGlyOwogfQogCi1zdHJpbmcgVG9KYXZhTmFtZShjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpIHsKKy8vIFRPRE8oeGlhb2ZlbmcpOiBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkga2VwdCBmb3IgaXQncyBwdWJsaWNseSByZWZlcmVuY2VkLgorLy8gSXQgc2hvdWxkIGJlIHJlbW92ZWQgYWZ0ZXIgbXV0YWJsZSBBUEkgdXAtaW50ZWdyYXRpb24uCitzdHJpbmcgVG9KYXZhTmFtZShjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CiAgIHN0cmluZyByZXN1bHQ7CiAgIGlmIChmaWxlLT5vcHRpb25zKCkuamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CiAgICAgcmVzdWx0ID0gRmlsZUphdmFQYWNrYWdlKGZpbGUpOwpAQCAtMTc3LDExICsyMTEsNDMgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorc3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIENsYXNzTmFtZVJlc29sdmVyIG5hbWVfcmVzb2x2ZXI7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyLkdldENsYXNzTmFtZShkZXNjcmlwdG9yLCB0cnVlKTsKK30KKworc3RyaW5nIENsYXNzTmFtZShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICBDbGFzc05hbWVSZXNvbHZlciBuYW1lX3Jlc29sdmVyOworICByZXR1cm4gbmFtZV9yZXNvbHZlci5HZXRDbGFzc05hbWUoZGVzY3JpcHRvciwgdHJ1ZSk7Cit9CisKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgQ2xhc3NOYW1lUmVzb2x2ZXIgbmFtZV9yZXNvbHZlcjsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXIuR2V0Q2xhc3NOYW1lKGRlc2NyaXB0b3IsIHRydWUpOworfQorCiBzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHN0cmluZyByZXN1bHQgPSBGaWxlSmF2YVBhY2thZ2UoZGVzY3JpcHRvcik7Ci0gIGlmICghcmVzdWx0LmVtcHR5KCkpIHJlc3VsdCArPSAnLic7Ci0gIHJlc3VsdCArPSBGaWxlQ2xhc3NOYW1lKGRlc2NyaXB0b3IpOwotICByZXR1cm4gcmVzdWx0OworICBDbGFzc05hbWVSZXNvbHZlciBuYW1lX3Jlc29sdmVyOworICByZXR1cm4gbmFtZV9yZXNvbHZlci5HZXRDbGFzc05hbWUoZGVzY3JpcHRvciwgdHJ1ZSk7Cit9CisKK3N0cmluZyBFeHRyYU1lc3NhZ2VJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RyaW5nIGludGVyZmFjZXMgPSAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfaW1wbGVtZW50czoiCisgICAgICArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIikiOworICByZXR1cm4gaW50ZXJmYWNlczsKK30KKworCitzdHJpbmcgRXh0cmFCdWlsZGVySW50ZXJmYWNlcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHN0cmluZyBpbnRlcmZhY2VzID0gIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChidWlsZGVyX2ltcGxlbWVudHM6IgorICAgICAgKyBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICIpIjsKKyAgcmV0dXJuIGludGVyZmFjZXM7Cit9CisKK3N0cmluZyBFeHRyYU1lc3NhZ2VPckJ1aWxkZXJJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgc3RyaW5nIGludGVyZmFjZXMgPSAiLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGludGVyZmFjZV9leHRlbmRzOiIKKyAgICAgICsgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKyAiKSI7CisgIHJldHVybiBpbnRlcmZhY2VzOwogfQogCiBzdHJpbmcgRmllbGRDb25zdGFudE5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yICpmaWVsZCkgewpAQCAtMjQwLDYgKzMwNiwyNiBAQAogICByZXR1cm4gSkFWQVRZUEVfSU5UOwogfQogCitjb25zdCBjaGFyKiBQcmltaXRpdmVUeXBlTmFtZShKYXZhVHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgSkFWQVRZUEVfSU5UICAgIDogcmV0dXJuICJpbnQiOworICAgIGNhc2UgSkFWQVRZUEVfTE9ORyAgIDogcmV0dXJuICJsb25nIjsKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUICA6IHJldHVybiAiZmxvYXQiOworICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFIDogcmV0dXJuICJkb3VibGUiOworICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjogcmV0dXJuICJib29sZWFuIjsKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORyA6IHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7CisgICAgY2FzZSBKQVZBVFlQRV9CWVRFUyAgOiByZXR1cm4gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyI7CisgICAgY2FzZSBKQVZBVFlQRV9FTlVNICAgOiByZXR1cm4gTlVMTDsKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6IHJldHVybiBOVUxMOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyBKYXZhVHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBOVUxMOworfQorCiBjb25zdCBjaGFyKiBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEphdmFUeXBlIHR5cGUpIHsKICAgc3dpdGNoICh0eXBlKSB7CiAgICAgY2FzZSBKQVZBVFlQRV9JTlQgICAgOiByZXR1cm4gImphdmEubGFuZy5JbnRlZ2VyIjsKQEAgLTI2MCw2ICszNDYsMzUgQEAKICAgcmV0dXJuIE5VTEw7CiB9CiAKK2NvbnN0IGNoYXIqIEZpZWxkVHlwZU5hbWUoRmllbGREZXNjcmlwdG9yOjpUeXBlIGZpZWxkX3R5cGUpIHsKKyAgc3dpdGNoIChmaWVsZF90eXBlKSB7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAiSU5UMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMiAgOiByZXR1cm4gIlVJTlQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyICA6IHJldHVybiAiU0lOVDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDMyIDogcmV0dXJuICJGSVhFRDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjogcmV0dXJuICJTRklYRUQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQgICA6IHJldHVybiAiSU5UNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NCAgOiByZXR1cm4gIlVJTlQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDY0ICA6IHJldHVybiAiU0lOVDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuICJGSVhFRDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuICJTRklYRUQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiAiRkxPQVQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0RPVUJMRSAgOiByZXR1cm4gIkRPVUJMRSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiAiQk9PTCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICA6IHJldHVybiAiU1RSSU5HIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuICJCWVRFUyI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRU5VTSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICA6IHJldHVybiAiR1JPVVAiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gIk1FU1NBR0UiOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKIGJvb2wgQWxsQXNjaWkoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGV4dC5zaXplKCk7IGkrKykgewogICAgIGlmICgodGV4dFtpXSAmIDB4ODApICE9IDApIHsKQEAgLTI2OSw3ICszODQsOCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotc3RyaW5nIERlZmF1bHRWYWx1ZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CitzdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgaW1tdXRhYmxlLAorICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcikgewogICAvLyBTd2l0Y2ggb24gQ3BwVHlwZSBzaW5jZSB3ZSBuZWVkIHRvIGtub3cgd2hpY2ggZGVmYXVsdF92YWx1ZV8qIG1ldGhvZAogICAvLyBvZiBGaWVsZERlc2NyaXB0b3IgdG8gY2FsbC4KICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewpAQCAtMzI2LDE3ICs0NDIsMTggQEAKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvLyBTZWUgY29tbWVudHMgaW4gSW50ZXJuYWwuamF2YSBmb3IgZ29yeSBkZXRhaWxzLgogICAgICAgICAgIHJldHVybiBzdHJpbmdzOjpTdWJzdGl0dXRlKAotICAgICAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuc3RyaW5nRGVmYXVsdFZhbHVlKFwiJDBcIikiLAotICAgICAgICAgICAgQ0VzY2FwZShmaWVsZC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkpOworICAgICAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5zdHJpbmdEZWZhdWx0VmFsdWUoXCIkMFwiKSIsCisgICAgICAgICAgICAgIENFc2NhcGUoZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpKTsKICAgICAgICAgfQogICAgICAgfQogCiAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKLSAgICAgIHJldHVybiBDbGFzc05hbWUoZmllbGQtPmVudW1fdHlwZSgpKSArICIuIiArCi0gICAgICAgICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5uYW1lKCk7CisgICAgICByZXR1cm4gbmFtZV9yZXNvbHZlci0+R2V0Q2xhc3NOYW1lKGZpZWxkLT5lbnVtX3R5cGUoKSwgaW1tdXRhYmxlKSArICIuIiArCisgICAgICAgICAgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5uYW1lKCk7CiAKICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgcmV0dXJuIENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpICsgIi5nZXREZWZhdWx0SW5zdGFuY2UoKSI7CisgICAgICByZXR1cm4gbmFtZV9yZXNvbHZlci0+R2V0Q2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgaW1tdXRhYmxlKSArCisgICAgICAgICAgIi5nZXREZWZhdWx0SW5zdGFuY2UoKSI7CiAKICAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwogICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KQEAgLTQyNyw4ICs1NDQsMTAgQEAKICAgcmV0dXJuIEdldEJpdEZpZWxkTmFtZShiaXRJbmRleCAvIDMyKTsKIH0KIAotc3RyaW5nIEdlbmVyYXRlR2V0Qml0KGludCBiaXRJbmRleCkgewotICBzdHJpbmcgdmFyTmFtZSA9IEdldEJpdEZpZWxkTmFtZUZvckJpdChiaXRJbmRleCk7CituYW1lc3BhY2UgeworCitzdHJpbmcgR2VuZXJhdGVHZXRCaXRJbnRlcm5hbChjb25zdCBzdHJpbmcmIHByZWZpeCwgaW50IGJpdEluZGV4KSB7CisgIHN0cmluZyB2YXJOYW1lID0gcHJlZml4ICsgR2V0Qml0RmllbGROYW1lRm9yQml0KGJpdEluZGV4KTsKICAgaW50IGJpdEluVmFySW5kZXggPSBiaXRJbmRleCAlIDMyOwogCiAgIHN0cmluZyBtYXNrID0gYml0X21hc2tzW2JpdEluVmFySW5kZXhdOwpAQCAtNDM2LDggKzU1NSw4IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLXN0cmluZyBHZW5lcmF0ZVNldEJpdChpbnQgYml0SW5kZXgpIHsKLSAgc3RyaW5nIHZhck5hbWUgPSBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoYml0SW5kZXgpOworc3RyaW5nIEdlbmVyYXRlU2V0Qml0SW50ZXJuYWwoY29uc3Qgc3RyaW5nJiBwcmVmaXgsIGludCBiaXRJbmRleCkgeworICBzdHJpbmcgdmFyTmFtZSA9IHByZWZpeCArIEdldEJpdEZpZWxkTmFtZUZvckJpdChiaXRJbmRleCk7CiAgIGludCBiaXRJblZhckluZGV4ID0gYml0SW5kZXggJSAzMjsKIAogICBzdHJpbmcgbWFzayA9IGJpdF9tYXNrc1tiaXRJblZhckluZGV4XTsKQEAgLTQ0NSw2ICs1NjQsMTYgQEAKICAgcmV0dXJuIHJlc3VsdDsKIH0KIAorfSAgLy8gbmFtZXNwYWNlCisKK3N0cmluZyBHZW5lcmF0ZUdldEJpdChpbnQgYml0SW5kZXgpIHsKKyAgcmV0dXJuIEdlbmVyYXRlR2V0Qml0SW50ZXJuYWwoIiIsIGJpdEluZGV4KTsKK30KKworc3RyaW5nIEdlbmVyYXRlU2V0Qml0KGludCBiaXRJbmRleCkgeworICByZXR1cm4gR2VuZXJhdGVTZXRCaXRJbnRlcm5hbCgiIiwgYml0SW5kZXgpOworfQorCiBzdHJpbmcgR2VuZXJhdGVDbGVhckJpdChpbnQgYml0SW5kZXgpIHsKICAgc3RyaW5nIHZhck5hbWUgPSBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoYml0SW5kZXgpOwogICBpbnQgYml0SW5WYXJJbmRleCA9IGJpdEluZGV4ICUgMzI7CkBAIC00NTUsMjEgKzU4NCwxNzEgQEAKIH0KIAogc3RyaW5nIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGludCBiaXRJbmRleCkgewotICBzdHJpbmcgdmFyTmFtZSA9ICJmcm9tXyIgKyBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoYml0SW5kZXgpOwotICBpbnQgYml0SW5WYXJJbmRleCA9IGJpdEluZGV4ICUgMzI7Ci0KLSAgc3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07Ci0gIHN0cmluZyByZXN1bHQgPSAiKCgiICsgdmFyTmFtZSArICIgJiAiICsgbWFzayArICIpID09ICIgKyBtYXNrICsgIikiOwotICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gR2VuZXJhdGVHZXRCaXRJbnRlcm5hbCgiZnJvbV8iLCBiaXRJbmRleCk7CiB9CiAKIHN0cmluZyBHZW5lcmF0ZVNldEJpdFRvTG9jYWwoaW50IGJpdEluZGV4KSB7Ci0gIHN0cmluZyB2YXJOYW1lID0gInRvXyIgKyBHZXRCaXRGaWVsZE5hbWVGb3JCaXQoYml0SW5kZXgpOwotICBpbnQgYml0SW5WYXJJbmRleCA9IGJpdEluZGV4ICUgMzI7CisgIHJldHVybiBHZW5lcmF0ZVNldEJpdEludGVybmFsKCJ0b18iLCBiaXRJbmRleCk7Cit9CiAKLSAgc3RyaW5nIG1hc2sgPSBiaXRfbWFza3NbYml0SW5WYXJJbmRleF07Ci0gIHN0cmluZyByZXN1bHQgPSB2YXJOYW1lICsgIiB8PSAiICsgbWFzazsKLSAgcmV0dXJuIHJlc3VsdDsKK3N0cmluZyBHZW5lcmF0ZUdldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpIHsKKyAgcmV0dXJuIEdlbmVyYXRlR2V0Qml0SW50ZXJuYWwoIm11dGFibGVfIiwgYml0SW5kZXgpOworfQorCitzdHJpbmcgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoaW50IGJpdEluZGV4KSB7CisgIHJldHVybiBHZW5lcmF0ZVNldEJpdEludGVybmFsKCJtdXRhYmxlXyIsIGJpdEluZGV4KTsKK30KKworYm9vbCBJc1JlZmVyZW5jZVR5cGUoSmF2YVR5cGUgdHlwZSkgeworICBzd2l0Y2ggKHR5cGUpIHsKKyAgICBjYXNlIEpBVkFUWVBFX0lOVCAgICA6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEpBVkFUWVBFX0xPTkcgICA6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUICA6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRSA6IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46IHJldHVybiBmYWxzZTsKKyAgICBjYXNlIEpBVkFUWVBFX1NUUklORyA6IHJldHVybiB0cnVlOworICAgIGNhc2UgSkFWQVRZUEVfQllURVMgIDogcmV0dXJuIHRydWU7CisgICAgY2FzZSBKQVZBVFlQRV9FTlVNICAgOiByZXR1cm4gdHJ1ZTsKKyAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6IHJldHVybiB0cnVlOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyBKYXZhVHlwZXMgYXJlIGFkZGVkLgorICB9CisKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7CisgIHJldHVybiBmYWxzZTsKK30KKworY29uc3QgY2hhciogR2V0Q2FwaXRhbGl6ZWRUeXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGJvb2wgaW1tdXRhYmxlKSB7CisgIHN3aXRjaCAoR2V0VHlwZShmaWVsZCkpIHsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMiAgIDogcmV0dXJuICJJbnQzMiI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDMyICA6IHJldHVybiAiVUludDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuICJTSW50MzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gIkZpeGVkMzIiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gIlNGaXhlZDMyIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuICJJbnQ2NCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAiVUludDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuICJTSW50NjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gIkZpeGVkNjQiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OiByZXR1cm4gIlNGaXhlZDY0IjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GTE9BVCAgIDogcmV0dXJuICJGbG9hdCI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiAiRG91YmxlIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuICJCb29sIjsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgIDogcmV0dXJuICJTdHJpbmciOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTICAgOiB7CisgICAgICByZXR1cm4gIkJ5dGVzIjsKKyAgICB9CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRW51bSI7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVAgICA6IHJldHVybiAiR3JvdXAiOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gIk1lc3NhZ2UiOworCisgICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKKyAgICAvLyB0eXBlcyBhcmUgYWRkZWQuCisgIH0KKworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIE5VTEw7Cit9CisKKy8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKKy8vIHJldHVybnMgLTEuCitpbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgIHN3aXRjaCAodHlwZSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyICAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UNjQgICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UMzIgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQ2NCAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0lOVDMyICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVEMzIgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGaXhlZDMyU2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRml4ZWQ2NFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVEMzI6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a1NGaXhlZDMyU2l6ZTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQ2NDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkNjRTaXplOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGbG9hdFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0RvdWJsZVNpemU7CisKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MICAgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprQm9vbFNpemU7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAtMTsKKworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gLTE7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMgICA6IHJldHVybiAtMTsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAgIDogcmV0dXJuIC0xOworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UgOiByZXR1cm4gLTE7CisKKyAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldworICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIC0xOworfQorCisvLyBTb3J0IHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIERlc2NyaXB0b3IgYnkgbnVtYmVyIGludG8gYSBuZXdbXSdkIGFycmF5CisvLyBhbmQgcmV0dXJuIGl0LiBUaGUgY2FsbGVyIHNob3VsZCBkZWxldGUgdGhlIHJldHVybmVkIGFycmF5LgorY29uc3QgRmllbGREZXNjcmlwdG9yKiogU29ydEZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzID0KKyAgICBuZXcgY29uc3QgRmllbGREZXNjcmlwdG9yKltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKKyAgfQorICBzdGQ6OnNvcnQoZmllbGRzLCBmaWVsZHMgKyBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpLAorICAgICAgICAgICAgRmllbGRPcmRlcmluZ0J5TnVtYmVyKCkpOworICByZXR1cm4gZmllbGRzOworfQorCisvLyBSZXR1cm5zIHRydWUgaWYgdGhlIG1lc3NhZ2UgdHlwZSBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcy4gIElmIGl0IGRvZXNuJ3QsCisvLyB3ZSBjYW4gb3B0aW1pemUgb3V0IGNhbGxzIHRvIGl0cyBpc0luaXRpYWxpemVkKCkgbWV0aG9kLgorLy8KKy8vIGFscmVhZHlfc2VlbiBpcyB1c2VkIHRvIGF2b2lkIGNoZWNraW5nIHRoZSBzYW1lIHR5cGUgbXVsdGlwbGUgdGltZXMKKy8vIChhbmQgYWxzbyB0byBwcm90ZWN0IGFnYWluc3QgcmVjdXJzaW9uKS4KK2Jvb2wgSGFzUmVxdWlyZWRGaWVsZHMoCisgICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSwKKyAgICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbikgeworICBpZiAoYWxyZWFkeV9zZWVuLT5jb3VudCh0eXBlKSA+IDApIHsKKyAgICAvLyBUaGUgdHlwZSBpcyBhbHJlYWR5IGluIGNhY2hlLiAgVGhpcyBtZWFucyB0aGF0IGVpdGhlcjoKKyAgICAvLyBhLiBUaGUgdHlwZSBoYXMgbm8gcmVxdWlyZWQgZmllbGRzLgorICAgIC8vIGIuIFdlIGFyZSBpbiB0aGUgbWlkc3Qgb2YgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcywKKyAgICAvLyAgICBzb21ld2hlcmUgdXAgdGhlIHN0YWNrLiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHRoYXQgaWYgdGhlIHR5cGUKKyAgICAvLyAgICBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcywgdGhleSdsbCBiZSBmb3VuZCB3aGVuIHdlIHJldHVybiB0byBpdCwKKyAgICAvLyAgICBhbmQgdGhlIHdob2xlIGNhbGwgdG8gSGFzUmVxdWlyZWRGaWVsZHMoKSB3aWxsIHJldHVybiB0cnVlLgorICAgIC8vICAgIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpZiB0aGlzIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcworICAgIC8vICAgIGhlcmUuCisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGFscmVhZHlfc2Vlbi0+aW5zZXJ0KHR5cGUpOworCisgIC8vIElmIHRoZSB0eXBlIGhhcyBleHRlbnNpb25zLCBhbiBleHRlbnNpb24gd2l0aCBtZXNzYWdlIHR5cGUgY291bGQgY29udGFpbgorICAvLyByZXF1aXJlZCBmaWVsZHMsIHNvIHdlIGhhdmUgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgc3VjaCBhbgorICAvLyBleHRlbnNpb24gZXhpc3RzLgorICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5maWVsZChpKTsKKyAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmIChIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCksIGFscmVhZHlfc2VlbikpIHsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisKKyAgcmV0dXJuIGZhbHNlOworfQorCitib29sIEhhc1JlcXVpcmVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpIHsKKyAgaGFzaF9zZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGFscmVhZHlfc2VlbjsKKyAgcmV0dXJuIEhhc1JlcXVpcmVkRmllbGRzKHR5cGUsICZhbHJlYWR5X3NlZW4pOworfQorCitib29sIEhhc1JlcGVhdGVkRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgamF2YQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9oZWxwZXJzLmgKaW5kZXggODhlZmQ0NS4uYzg1MDQyMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2hlbHBlcnMuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00OSw2ICs0OSw5IEBACiBleHRlcm4gY29uc3QgY2hhciBrVGhpY2tTZXBhcmF0b3JbXTsKIGV4dGVybiBjb25zdCBjaGFyIGtUaGluU2VwYXJhdG9yW107CiAKKy8vIENvbnZlcnRzIGEgbmFtZSB0byBjYW1lbC1jYXNlLiBJZiBjYXBfZmlyc3RfbGV0dGVyIGlzIHRydWUsIGNhcGl0YWxpemUgdGhlCisvLyBmaXJzdCBsZXR0ZXIuCitzdHJpbmcgVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShjb25zdCBzdHJpbmcmIG5hbWUsIGJvb2wgY2FwX2ZpcnN0X2xldHRlcik7CiAvLyBDb252ZXJ0cyB0aGUgZmllbGQncyBuYW1lIHRvIGNhbWVsLWNhc2UsIGUuZy4gImZvb19iYXJfYmF6IiBiZWNvbWVzCiAvLyAiZm9vQmFyQmF6IiBvciAiRm9vQmFyQmF6IiwgcmVzcGVjdGl2ZWx5Lgogc3RyaW5nIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CkBAIC01OCwxNSArNjEsMjIgQEAKIC8vIG9mIGxvd2VyLWNhc2luZyB0aGUgZmlyc3QgbGV0dGVyIG9mIHRoZSBuYW1lLikKIHN0cmluZyBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCk7CiAKKy8vIEdldCBhbiBpZGVudGlmaWVyIHRoYXQgdW5pcXVlbHkgaWRlbnRpZmllcyB0aGlzIHR5cGUgd2l0aGluIHRoZSBmaWxlLgorLy8gVGhpcyBpcyB1c2VkIHRvIGRlY2xhcmUgc3RhdGljIHZhcmlhYmxlcyByZWxhdGVkIHRvIHRoaXMgdHlwZSBhdCB0aGUKKy8vIG91dGVybW9zdCBmaWxlIHNjb3BlLgorc3RyaW5nIFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKIC8vIFN0cmlwcyAiLnByb3RvIiBvciAiLnByb3RvZGV2ZWwiIGZyb20gdGhlIGVuZCBvZiBhIGZpbGVuYW1lLgogc3RyaW5nIFN0cmlwUHJvdG8oY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSk7CiAKLS8vIEdldHMgdGhlIHVucXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIHRoZSBmaWxlLiAgRWFjaCAucHJvdG8gZmlsZSBiZWNvbWVzIGEKLS8vIHNpbmdsZSBKYXZhIGNsYXNzLCB3aXRoIGFsbCBpdHMgY29udGVudHMgbmVzdGVkIGluIHRoYXQgY2xhc3MuCi1zdHJpbmcgRmlsZUNsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisvLyBHZXRzIHRoZSB1bnF1YWxpZmllZCBjbGFzcyBuYW1lIGZvciB0aGUgZmlsZS4gIEZvciBlYWNoIC5wcm90byBmaWxlLCB0aGVyZQorLy8gd2lsbCBiZSBvbmUgSmF2YSBjbGFzcyBjb250YWluaW5nIGFsbCB0aGUgaW1tdXRhYmxlIG1lc3NhZ2VzIGFuZCBhbm90aGVyCisvLyBKYXZhIGNsYXNzIGNvbnRhaW5pbmcgYWxsIHRoZSBtdXRhYmxlIG1lc3NhZ2VzLgorLy8gVE9ETyh4aWFvZmVuZyk6IHJlbW92ZSB0aGUgZGVmYXVsdCB2YWx1ZSBhZnRlciB1cGRhdGluZyBjbGllbnQgY29kZS4KK3N0cmluZyBGaWxlQ2xhc3NOYW1lKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBib29sIGltbXV0YWJsZSA9IHRydWUpOwogCiAvLyBSZXR1cm5zIHRoZSBmaWxlJ3MgSmF2YSBwYWNrYWdlIG5hbWUuCi1zdHJpbmcgRmlsZUphdmFQYWNrYWdlKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKTsKK3N0cmluZyBGaWxlSmF2YVBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGJvb2wgaW1tdXRhYmxlID0gdHJ1ZSk7CiAKIC8vIFJldHVybnMgb3V0cHV0IGRpcmVjdG9yeSBmb3IgdGhlIGdpdmVuIHBhY2thZ2UgbmFtZS4KIHN0cmluZyBKYXZhUGFja2FnZVRvRGlyKHN0cmluZyBwYWNrYWdlX25hbWUpOwpAQCAtNzQsMzEgKzg0LDU1IEBACiAvLyBDb252ZXJ0cyB0aGUgZ2l2ZW4gZnVsbHktcXVhbGlmaWVkIG5hbWUgaW4gdGhlIHByb3RvIG5hbWVzcGFjZSB0byBpdHMKIC8vIGZ1bGx5LXF1YWxpZmllZCBuYW1lIGluIHRoZSBKYXZhIG5hbWVzcGFjZSwgZ2l2ZW4gdGhhdCBpdCBpcyBpbiB0aGUgZ2l2ZW4KIC8vIGZpbGUuCi1zdHJpbmcgVG9KYXZhTmFtZShjb25zdCBzdHJpbmcmIGZ1bGxfbmFtZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUpOworLy8gVE9ETyh4aWFvZmVuZyk6IHRoaXMgbWV0aG9kIGlzIGRlcHJlY2F0ZWQgYW5kIHNob3VsZCBiZSByZW1vdmVkIGluIHRoZQorLy8gZnV0dXJlLgorc3RyaW5nIFRvSmF2YU5hbWUoY29uc3Qgc3RyaW5nJiBmdWxsX25hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CiAKLS8vIFRoZXNlIHJldHVybiB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgY29ycmVzcG9uZGluZyB0byB0aGUgZ2l2ZW4KLS8vIGRlc2NyaXB0b3IuCi1pbmxpbmUgc3RyaW5nIENsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBUb0phdmFOYW1lKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCBkZXNjcmlwdG9yLT5maWxlKCkpOwotfQotaW5saW5lIHN0cmluZyBDbGFzc05hbWUoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIFRvSmF2YU5hbWUoZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCksIGRlc2NyaXB0b3ItPmZpbGUoKSk7Ci19Ci1pbmxpbmUgc3RyaW5nIENsYXNzTmFtZShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gVG9KYXZhTmFtZShkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSwgZGVzY3JpcHRvci0+ZmlsZSgpKTsKLX0KLWlubGluZSBzdHJpbmcgRXh0ZW5zaW9uSWRlbnRpZmllck5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiBUb0phdmFOYW1lKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCBkZXNjcmlwdG9yLT5maWxlKCkpOwotfQorLy8gVE9ETyh4aWFvZmVuZyk6IHRoZSBmb2xsb3dpbmcgbWV0aG9kcyBhcmUga2VwdCBmb3IgdGhleSBhcmUgZXhwb3NlZAorLy8gcHVibGljbHkgaW4gLy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9uYW1lcy5oLiBUaGV5IHJldHVybgorLy8gaW1tdXRhYmxlIG5hbWVzIG9ubHkgYW5kIHNob3VsZCBiZSByZW1vdmVkIGFmdGVyIG11dGFibGUgQVBJIGlzCisvLyBpbnRlZ3JhdGVkIGludG8gZ29vZ2xlMy4KK3N0cmluZyBDbGFzc05hbWUoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CitzdHJpbmcgQ2xhc3NOYW1lKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKK3N0cmluZyBDbGFzc05hbWUoY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOwogc3RyaW5nIENsYXNzTmFtZShjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CiAKKy8vIENvbW1hLXNlcGFyYXRlIGxpc3Qgb2Ygb3B0aW9uLXNwZWNpZmllZCBpbnRlcmZhY2VzIGltcGxlbWVudGVkIGJ5IHRoZQorLy8gTWVzc2FnZSwgdG8gZm9sbG93IHRoZSAiaW1wbGVtZW50cyIgZGVjbGFyYXRpb24gb2YgdGhlIE1lc3NhZ2UgZGVmaW5pdGlvbi4KK3N0cmluZyBFeHRyYU1lc3NhZ2VJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworLy8gQ29tbWEtc2VwYXJhdGUgbGlzdCBvZiBvcHRpb24tc3BlY2lmaWVkIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlCisvLyBNdXRhYmxlTWVzc2FnZSwgdG8gZm9sbG93IHRoZSAiaW1wbGVtZW50cyIgZGVjbGFyYXRpb24gb2YgdGhlIE11dGFibGVNZXNzYWdlCisvLyBkZWZpbml0aW9uLgorc3RyaW5nIEV4dHJhTXV0YWJsZU1lc3NhZ2VJbnRlcmZhY2VzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworLy8gQ29tbWEtc2VwYXJhdGUgbGlzdCBvZiBvcHRpb24tc3BlY2lmaWVkIGludGVyZmFjZXMgaW1wbGVtZW50ZWQgYnkgdGhlCisvLyBCdWlsZGVyLCB0byBmb2xsb3cgdGhlICJpbXBsZW1lbnRzIiBkZWNsYXJhdGlvbiBvZiB0aGUgQnVpbGRlciBkZWZpbml0aW9uLgorc3RyaW5nIEV4dHJhQnVpbGRlckludGVyZmFjZXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisvLyBDb21tYS1zZXBhcmF0ZSBsaXN0IG9mIG9wdGlvbi1zcGVjaWZpZWQgaW50ZXJmYWNlcyBleHRlbmRlZCBieSB0aGUKKy8vIE1lc3NhZ2VPckJ1aWxkZXIsIHRvIGZvbGxvdyB0aGUgImV4dGVuZHMiIGRlY2xhcmF0aW9uIG9mIHRoZQorLy8gTWVzc2FnZU9yQnVpbGRlciBkZWZpbml0aW9uLgorc3RyaW5nIEV4dHJhTWVzc2FnZU9yQnVpbGRlckludGVyZmFjZXMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7CisKKy8vIEdldCB0aGUgdW5xdWFsaWZpZWQgSmF2YSBjbGFzcyBuYW1lIGZvciBtdXRhYmxlIG1lc3NhZ2VzLiBpLmUuIHdpdGhvdXQKKy8vIHBhY2thZ2Ugb3Igb3V0ZXIgY2xhc3NuYW1lcy4KK2lubGluZSBzdHJpbmcgU2hvcnRNdXRhYmxlSmF2YUNsYXNzTmFtZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5uYW1lKCk7Cit9CisKKworLy8gV2hldGhlciB3ZSBzaG91bGQgZ2VuZXJhdGUgbXVsdGlwbGUgamF2YSBmaWxlcyBmb3IgbWVzc2FnZXMuCitpbmxpbmUgYm9vbCBNdWx0aXBsZUphdmFGaWxlcygKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciwgYm9vbCBpbW11dGFibGUpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5qYXZhX211bHRpcGxlX2ZpbGVzKCk7Cit9CisKIC8vIEdldCB0aGUgdW5xdWFsaWZpZWQgbmFtZSB0aGF0IHNob3VsZCBiZSB1c2VkIGZvciBhIGZpZWxkJ3MgZmllbGQKIC8vIG51bWJlciBjb25zdGFudC4KIHN0cmluZyBGaWVsZENvbnN0YW50TmFtZShjb25zdCBGaWVsZERlc2NyaXB0b3IgKmZpZWxkKTsKIAogLy8gUmV0dXJucyB0aGUgdHlwZSBvZiB0aGUgRmllbGREZXNjcmlwdG9yLgogLy8gVGhpcyBkb2VzIG5vdGhpbmcgaW50ZXJlc3RpbmcgZm9yIHRoZSBvcGVuIHNvdXJjZSByZWxlYXNlLCBidXQgaXMgdXNlZCBmb3IKLS8vIGhhY2tzIHRoYXQgaW1wcm92ZSBjb21wYXRhYmlsaXR5IHdpdGggdmVyc2lvbiAxIHByb3RvY29sIGJ1ZmZlcnMgYXQgR29vZ2xlLgorLy8gaGFja3MgdGhhdCBpbXByb3ZlIGNvbXBhdGliaWxpdHkgd2l0aCB2ZXJzaW9uIDEgcHJvdG9jb2wgYnVmZmVycyBhdCBHb29nbGUuCiBGaWVsZERlc2NyaXB0b3I6OlR5cGUgR2V0VHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKIAogZW51bSBKYXZhVHlwZSB7CkBAIC0xMTUsNjAgKzE0OSw2NiBAQAogCiBKYXZhVHlwZSBHZXRKYXZhVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKIAorY29uc3QgY2hhciogUHJpbWl0aXZlVHlwZU5hbWUoSmF2YVR5cGUgdHlwZSk7CisKIC8vIEdldCB0aGUgZnVsbHktcXVhbGlmaWVkIGNsYXNzIG5hbWUgZm9yIGEgYm94ZWQgcHJpbWl0aXZlIHR5cGUsIGUuZy4KIC8vICJqYXZhLmxhbmcuSW50ZWdlciIgZm9yIEpBVkFUWVBFX0lOVC4gIFJldHVybnMgTlVMTCBmb3IgZW51bSBhbmQgbWVzc2FnZQogLy8gdHlwZXMuCiBjb25zdCBjaGFyKiBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEphdmFUeXBlIHR5cGUpOwogCi1zdHJpbmcgRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworLy8gR2V0IHRoZSBuYW1lIG9mIHRoZSBqYXZhIGVudW0gY29uc3RhbnQgcmVwcmVzZW50aW5nIHRoaXMgdHlwZS4gRS5nLiwKKy8vICJJTlQzMiIgZm9yIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMi4gVGhlIGVudW0gY29uc3RhbnQncyBmdWxsCisvLyBuYW1lIGlzICJjb20uZ29vZ2xlLnByb3RvYnVmLldpcmVGb3JtYXQuRmllbGRUeXBlLklOVDMyIi4KK2NvbnN0IGNoYXIqIEZpZWxkVHlwZU5hbWUoY29uc3QgRmllbGREZXNjcmlwdG9yOjpUeXBlIGZpZWxkX3R5cGUpOworCitjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsKK3N0cmluZyBEZWZhdWx0VmFsdWUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgYm9vbCBpbW11dGFibGUsCisgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyKTsKK2lubGluZSBzdHJpbmcgSW1tdXRhYmxlRGVmYXVsdFZhbHVlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcikgeworICByZXR1cm4gRGVmYXVsdFZhbHVlKGZpZWxkLCB0cnVlLCBuYW1lX3Jlc29sdmVyKTsKK30KIGJvb2wgSXNEZWZhdWx0VmFsdWVKYXZhRGVmYXVsdChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKIAotLy8gRG9lcyB0aGlzIG1lc3NhZ2UgY2xhc3Mga2VlcCB0cmFjayBvZiB1bmtub3duIGZpZWxkcz8KLWlubGluZSBib29sIEhhc1Vua25vd25GaWVsZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KLSAgICAgICAgICAgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSB8fAotICAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkucmV0YWluX3Vua25vd25fZmllbGRzKCk7Ci19Ci0KLS8vIERvZXMgdGhpcyBtZXNzYWdlIGNsYXNzIGhhdmUgZ2VuZXJhdGVkIHBhcnNpbmcsIHNlcmlhbGl6YXRpb24sIGFuZCBvdGhlcgotLy8gc3RhbmRhcmQgbWV0aG9kcyBmb3Igd2hpY2ggcmVmbGVjdGlvbi1iYXNlZCBmYWxsYmFjayBpbXBsZW1lbnRhdGlvbnMgZXhpc3Q/Ci1pbmxpbmUgYm9vbCBIYXNHZW5lcmF0ZWRNZXRob2RzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9Ci0gICAgICAgICAgIEZpbGVPcHRpb25zOjpDT0RFX1NJWkU7Ci19Ci0KIC8vIERvZXMgdGhpcyBtZXNzYWdlIGhhdmUgc3BlY2lhbGl6ZWQgZXF1YWxzKCkgYW5kIGhhc2hDb2RlKCkgbWV0aG9kcz8KIGlubGluZSBib29sIEhhc0VxdWFsc0FuZEhhc2hDb2RlKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKICAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7CiB9CiAKIC8vIERvZXMgdGhpcyBtZXNzYWdlIGNsYXNzIGhhdmUgZGVzY3JpcHRvciBhbmQgcmVmbGVjdGlvbiBtZXRob2RzPwotaW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KLSAgICAgICAgICAgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK2lubGluZSBib29sIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVuZm9yY2VfbGl0ZSkgeworICByZXR1cm4gIWVuZm9yY2VfbGl0ZSAmJgorICAgICAgICAgZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KKyAgICAgICAgICAgICBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOwogfQotaW5saW5lIGJvb2wgSGFzRGVzY3JpcHRvck1ldGhvZHMoY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9Ci0gICAgICAgICAgIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7CitpbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZW5mb3JjZV9saXRlKSB7CisgIHJldHVybiAhZW5mb3JjZV9saXRlICYmCisgICAgICAgICBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPQorICAgICAgICAgICAgIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7CiB9Ci1pbmxpbmUgYm9vbCBIYXNEZXNjcmlwdG9yTWV0aG9kcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+b3B0aW9ucygpLm9wdGltaXplX2ZvcigpICE9Ci0gICAgICAgICAgIEZpbGVPcHRpb25zOjpMSVRFX1JVTlRJTUU7Ci19Ci0KLWlubGluZSBib29sIEhhc05lc3RlZEJ1aWxkZXJzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgLy8gVGhlIHByb3RvLWxpdGUgdmVyc2lvbiBkb2Vzbid0IHN1cHBvcnQgbmVzdGVkIGJ1aWxkZXJzLgotICByZXR1cm4gZGVzY3JpcHRvci0+ZmlsZSgpLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0KLSAgICAgICAgICAgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKK2lubGluZSBib29sIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlbmZvcmNlX2xpdGUpIHsKKyAgcmV0dXJuICFlbmZvcmNlX2xpdGUgJiYKKyAgICAgICAgIGRlc2NyaXB0b3ItPm9wdGlvbnMoKS5vcHRpbWl6ZV9mb3IoKSAhPSBGaWxlT3B0aW9uczo6TElURV9SVU5USU1FOwogfQogCiAvLyBTaG91bGQgd2UgZ2VuZXJhdGUgZ2VuZXJpYyBzZXJ2aWNlcyBmb3IgdGhpcyBmaWxlPwotaW5saW5lIGJvb2wgSGFzR2VuZXJpY1NlcnZpY2VzKGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlKSB7CitpbmxpbmUgYm9vbCBIYXNHZW5lcmljU2VydmljZXMoY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGUsIGJvb2wgZW5mb3JjZV9saXRlKSB7CiAgIHJldHVybiBmaWxlLT5zZXJ2aWNlX2NvdW50KCkgPiAwICYmCi0gICAgICAgICBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgIT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRSAmJgorICAgICAgICAgSGFzRGVzY3JpcHRvck1ldGhvZHMoZmlsZSwgZW5mb3JjZV9saXRlKSAmJgogICAgICAgICAgZmlsZS0+b3B0aW9ucygpLmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpOwogfQogCitpbmxpbmUgYm9vbCBJc0xhenkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBib29sIGVuZm9yY2VfbGl0ZSkgeworICAvLyBDdXJyZW50bHksIHRoZSBwcm90by1saXRlIHZlcnNpb24gc3Vwb3J0cyBsYXp5IGZpZWxkLgorICAvLyBUT0RPKG5pd2FzYWtpKTogU3VwcG9ydCBsYXp5IGZpZWxkcyBhbHNvIGZvciBvdGhlciBwcm90byBydW50aW1lcy4KKyAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmZpbGUoKSwgZW5mb3JjZV9saXRlKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gZGVzY3JpcHRvci0+b3B0aW9ucygpLmxhenkoKTsKK30KIAogLy8gTWV0aG9kcyBmb3Igc2hhcmVkIGJpdGZpZWxkcy4KIApAQCAtMjA2LDYgKzI0NiwxMDQgQEAKIC8vIEV4YW1wbGU6ICJ0b19iaXRGaWVsZDFfID0gKHRvX2JpdEZpZWxkMV8gfCAweDA0KSIKIHN0cmluZyBHZW5lcmF0ZVNldEJpdFRvTG9jYWwoaW50IGJpdEluZGV4KTsKIAorLy8gRG9lcyB0aGUgc2FtZSBhcyBHZW5lcmF0ZUdldEJpdCBidXQgb3BlcmF0ZXMgb24gdGhlIGJpdCBmaWVsZCBvbiBhIGxvY2FsCisvLyB2YXJpYWJsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBwYXJzaW5nIGNvbnN0cnVjdG9yIHRvIHJlY29yZCBpZiBhIHJlcGVhdGVkCisvLyBmaWVsZCBpcyBtdXRhYmxlLgorLy8gRXhhbXBsZTogIigobXV0YWJsZV9iaXRGaWVsZDFfICYgMHgwNCkgPT0gMHgwNCkiCitzdHJpbmcgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoaW50IGJpdEluZGV4KTsKKworLy8gRG9lcyB0aGUgc2FtZSBhcyBHZW5lcmF0ZVNldEJpdCBidXQgb3BlcmF0ZXMgb24gdGhlIGJpdCBmaWVsZCBvbiBhIGxvY2FsCisvLyB2YXJpYWJsZS4gVGhpcyBpcyB1c2VkIGJ5IHRoZSBwYXJzaW5nIGNvbnN0cnVjdG9yIHRvIHJlY29yZCBpZiBhIHJlcGVhdGVkCisvLyBmaWVsZCBpcyBtdXRhYmxlLgorLy8gRXhhbXBsZTogIm11dGFibGVfYml0RmllbGQxXyA9IChtdXRhYmxlX2JpdEZpZWxkMV8gfCAweDA0KSIKK3N0cmluZyBHZW5lcmF0ZVNldEJpdE11dGFibGVMb2NhbChpbnQgYml0SW5kZXgpOworCisvLyBSZXR1cm5zIHdoZXRoZXIgdGhlIEphdmFUeXBlIGlzIGEgcmVmZXJlbmNlIHR5cGUuCitib29sIElzUmVmZXJlbmNlVHlwZShKYXZhVHlwZSB0eXBlKTsKKworLy8gUmV0dXJucyB0aGUgY2FwaXRhbGl6ZWQgbmFtZSBmb3IgY2FsbGluZyByZWxhdGl2ZSBmdW5jdGlvbnMgaW4KKy8vIENvZGVkSW5wdXRTdHJlYW0KK2NvbnN0IGNoYXIqIEdldENhcGl0YWxpemVkVHlwZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIGltbXV0YWJsZSk7CisKKy8vIEZvciBlbmNvZGluZ3Mgd2l0aCBmaXhlZCBzaXplcywgcmV0dXJucyB0aGF0IHNpemUgaW4gYnl0ZXMuICBPdGhlcndpc2UKKy8vIHJldHVybnMgLTEuCitpbnQgRml4ZWRTaXplKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKTsKKworLy8gQ29tcGFyYXRvcnMgdXNlZCB0byBzb3J0IGZpZWxkcyBpbiBNZXNzYWdlR2VuZXJhdG9yCitzdHJ1Y3QgRmllbGRPcmRlcmluZ0J5TnVtYmVyIHsKKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiKSBjb25zdCB7CisgICAgcmV0dXJuIGEtPm51bWJlcigpIDwgYi0+bnVtYmVyKCk7CisgIH0KK307CisKK3N0cnVjdCBFeHRlbnNpb25SYW5nZU9yZGVyaW5nIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiBhLAorICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGIpIGNvbnN0IHsKKyAgICByZXR1cm4gYS0+c3RhcnQgPCBiLT5zdGFydDsKKyAgfQorfTsKKworLy8gU29ydCB0aGUgZmllbGRzIG9mIHRoZSBnaXZlbiBEZXNjcmlwdG9yIGJ5IG51bWJlciBpbnRvIGEgbmV3W10nZCBhcnJheQorLy8gYW5kIHJldHVybiBpdC4gVGhlIGNhbGxlciBzaG91bGQgZGVsZXRlIHRoZSByZXR1cm5lZCBhcnJheS4KK2NvbnN0IEZpZWxkRGVzY3JpcHRvcioqIFNvcnRGaWVsZHNCeU51bWJlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworLy8gRG9lcyB0aGlzIG1lc3NhZ2UgY2xhc3MgaGF2ZSBhbnkgcGFja2VkIGZpZWxkcz8KK2lubGluZSBib29sIEhhc1BhY2tlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgaWYgKGRlc2NyaXB0b3ItPmZpZWxkKGkpLT5pc19wYWNrZWQoKSkgeworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworLy8gQ2hlY2sgYSBtZXNzYWdlIHR5cGUgYW5kIGl0cyBzdWItbWVzc2FnZSB0eXBlcyByZWN1cnNpdmVseSB0byBzZWUgaWYgYW55IG9mCisvLyB0aGVtIGhhcyBhIHJlcXVpcmVkIGZpZWxkLiBSZXR1cm4gdHJ1ZSBpZiBhIHJlcXVpcmVkIGZpZWxkIGlzIGZvdW5kLgorYm9vbCBIYXNSZXF1aXJlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworLy8gV2hldGhlciBhIC5wcm90byBmaWxlIHN1cHBvcnRzIGZpZWxkIHByZXNlbmNlIHRlc3QgZm9yIG5vbi1tZXNzYWdlIHR5cGVzLgoraW5saW5lIGJvb2wgU3VwcG9ydEZpZWxkUHJlc2VuY2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPnN5bnRheCgpICE9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOworfQorCisvLyBXaGV0aGVyIGdlbmVyYXRlIGNsYXNzZXMgZXhwb3NlIHB1YmxpYyBQQVJTRVIgaW5zdGFuY2VzLgoraW5saW5lIGJvb2wgRXhwb3NlUHVibGljUGFyc2VyKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIC8vIFRPRE8obGl1amlzaSk6IE1hcmsgdGhlIFBBUlNFUiBwcml2YXRlIGluIDMuMS54IHJlbGVhc2VzLgorICByZXR1cm4gZGVzY3JpcHRvci0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzI7Cit9CisKKy8vIFdoZXRoZXIgdW5rbm93biBlbnVtIHZhbHVlcyBhcmUga2VwdCAoaS5lLiwgbm90IHN0b3JlZCBpbiBVbmtub3duRmllbGRTZXQKKy8vIGJ1dCBpbiB0aGUgbWVzc2FnZSBhbmQgY2FuIGJlIHF1ZXJpZWQgdXNpbmcgYWRkaXRpb25hbCBnZXR0ZXJzIHRoYXQgcmV0dXJuCisvLyBpbnRzLgoraW5saW5lIGJvb2wgU3VwcG9ydFVua25vd25FbnVtVmFsdWUoY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOworfQorCisvLyBDaGVjayB3aGV0aGVyIGEgbWVzYXNnZSBoYXMgcmVwZWF0ZWQgZmllbGRzLgorYm9vbCBIYXNSZXBlYXRlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKKworaW5saW5lIGJvb2wgSXNNYXBFbnRyeShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5vcHRpb25zKCkubWFwX2VudHJ5KCk7Cit9CisKK2lubGluZSBib29sIElzTWFwRmllbGQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5pc19tYXAoKTsKK30KKworaW5saW5lIGJvb2wgUHJlc2VydmVVbmtub3duRmllbGRzKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+c3ludGF4KCkgIT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Cit9CisKK2lubGluZSBib29sIElzQW55TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSA9PSAiZ29vZ2xlLnByb3RvYnVmLkFueSI7Cit9CisKK2lubGluZSBib29sIENoZWNrVXRmOChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgcmV0dXJuIGRlc2NyaXB0b3ItPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMgfHwKKyAgICAgIGRlc2NyaXB0b3ItPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIGphdmEKIH0gIC8vIG5hbWVzcGFjZSBjb21waWxlcgogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGQuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGQuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX2xhenlfbWVzc2FnZV9maWVsZC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkX2xpdGUuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkX2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9sYXp5X21lc3NhZ2VfZmllbGRfbGl0ZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbGF6eV9tZXNzYWdlX2ZpZWxkX2xpdGUuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tYXBfZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZF9saXRlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWFwX2ZpZWxkX2xpdGUuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21hcF9maWVsZF9saXRlLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MKaW5kZXggNGMwODdkYi4uNGM0NzRhNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDE3ICszMiwzMiBAQAogLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaD4KKwogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oPgorI2luY2x1ZGUgPG1hcD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisjaW5jbHVkZSA8dmVjdG9yPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZW51bS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfZXh0ZW5zaW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3JfZmFjdG9yeS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNTMsMjM5ICs2OCwyMjEgQEAKIHVzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTsKIAogbmFtZXNwYWNlIHsKLQotdm9pZCBQcmludEZpZWxkQ29tbWVudChpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICAvLyBQcmludCB0aGUgZmllbGQncyBwcm90by1zeW50YXggZGVmaW5pdGlvbiBhcyBhIGNvbW1lbnQuICBXZSBkb24ndCB3YW50IHRvCi0gIC8vIHByaW50IGdyb3VwIGJvZGllcyBzbyB3ZSBjdXQgb2ZmIGFmdGVyIHRoZSBmaXJzdCBsaW5lLgotICBzdHJpbmcgZGVmID0gZmllbGQtPkRlYnVnU3RyaW5nKCk7Ci0gIHByaW50ZXItPlByaW50KCIvLyAkZGVmJFxuIiwKLSAgICAiZGVmIiwgZGVmLnN1YnN0cigwLCBkZWYuZmluZF9maXJzdF9vZignXG4nKSkpOworYm9vbCBHZW5lcmF0ZUhhc0JpdHMoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICByZXR1cm4gU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvci0+ZmlsZSgpKSB8fAorICAgICAgSGFzUmVwZWF0ZWRGaWVsZHMoZGVzY3JpcHRvcik7CiB9CiAKLXN0cnVjdCBGaWVsZE9yZGVyaW5nQnlOdW1iZXIgewotICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGIpIGNvbnN0IHsKLSAgICByZXR1cm4gYS0+bnVtYmVyKCkgPCBiLT5udW1iZXIoKTsKLSAgfQotfTsKLQotc3RydWN0IEV4dGVuc2lvblJhbmdlT3JkZXJpbmcgewotICBib29sIG9wZXJhdG9yKCkoY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGEsCi0gICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogYikgY29uc3QgewotICAgIHJldHVybiBhLT5zdGFydCA8IGItPnN0YXJ0OwotICB9Ci19OwotCi0vLyBTb3J0IHRoZSBmaWVsZHMgb2YgdGhlIGdpdmVuIERlc2NyaXB0b3IgYnkgbnVtYmVyIGludG8gYSBuZXdbXSdkIGFycmF5Ci0vLyBhbmQgcmV0dXJuIGl0LgotY29uc3QgRmllbGREZXNjcmlwdG9yKiogU29ydEZpZWxkc0J5TnVtYmVyKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzID0KLSAgICBuZXcgY29uc3QgRmllbGREZXNjcmlwdG9yKltkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpXTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBmaWVsZHNbaV0gPSBkZXNjcmlwdG9yLT5maWVsZChpKTsKLSAgfQotICBzb3J0KGZpZWxkcywgZmllbGRzICsgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSwKLSAgICAgICBGaWVsZE9yZGVyaW5nQnlOdW1iZXIoKSk7Ci0gIHJldHVybiBmaWVsZHM7CitzdHJpbmcgTWFwVmFsdWVJbW11dGFibGVDbGFzc2ROYW1lKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyKSB7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWVfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoInZhbHVlIik7CisgIEdPT0dMRV9DSEVDS19FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSwgdmFsdWVfZmllbGQtPnR5cGUoKSk7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUodmFsdWVfZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKIH0KLQotLy8gR2V0IGFuIGlkZW50aWZpZXIgdGhhdCB1bmlxdWVseSBpZGVudGlmaWVzIHRoaXMgdHlwZSB3aXRoaW4gdGhlIGZpbGUuCi0vLyBUaGlzIGlzIHVzZWQgdG8gZGVjbGFyZSBzdGF0aWMgdmFyaWFibGVzIHJlbGF0ZWQgdG8gdGhpcyB0eXBlIGF0IHRoZQotLy8gb3V0ZXJtb3N0IGZpbGUgc2NvcGUuCi1zdHJpbmcgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7Ci0gIHJldHVybiAic3RhdGljXyIgKyBTdHJpbmdSZXBsYWNlKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpLCAiLiIsICJfIiwgdHJ1ZSk7Ci19Ci0KLS8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWVzc2FnZSB0eXBlIGhhcyBhbnkgcmVxdWlyZWQgZmllbGRzLiAgSWYgaXQgZG9lc24ndCwKLS8vIHdlIGNhbiBvcHRpbWl6ZSBvdXQgY2FsbHMgdG8gaXRzIGlzSW5pdGlhbGl6ZWQoKSBtZXRob2QuCi0vLwotLy8gYWxyZWFkeV9zZWVuIGlzIHVzZWQgdG8gYXZvaWQgY2hlY2tpbmcgdGhlIHNhbWUgdHlwZSBtdWx0aXBsZSB0aW1lcwotLy8gKGFuZCBhbHNvIHRvIHByb3RlY3QgYWdhaW5zdCByZWN1cnNpb24pLgotc3RhdGljIGJvb2wgSGFzUmVxdWlyZWRGaWVsZHMoCi0gICAgY29uc3QgRGVzY3JpcHRvciogdHlwZSwKLSAgICBoYXNoX3NldDxjb25zdCBEZXNjcmlwdG9yKj4qIGFscmVhZHlfc2VlbikgewotICBpZiAoYWxyZWFkeV9zZWVuLT5jb3VudCh0eXBlKSA+IDApIHsKLSAgICAvLyBUaGUgdHlwZSBpcyBhbHJlYWR5IGluIGNhY2hlLiAgVGhpcyBtZWFucyB0aGF0IGVpdGhlcjoKLSAgICAvLyBhLiBUaGUgdHlwZSBoYXMgbm8gcmVxdWlyZWQgZmllbGRzLgotICAgIC8vIGIuIFdlIGFyZSBpbiB0aGUgbWlkc3Qgb2YgY2hlY2tpbmcgaWYgdGhlIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcywKLSAgICAvLyAgICBzb21ld2hlcmUgdXAgdGhlIHN0YWNrLiAgSW4gdGhpcyBjYXNlLCB3ZSBrbm93IHRoYXQgaWYgdGhlIHR5cGUKLSAgICAvLyAgICBoYXMgYW55IHJlcXVpcmVkIGZpZWxkcywgdGhleSdsbCBiZSBmb3VuZCB3aGVuIHdlIHJldHVybiB0byBpdCwKLSAgICAvLyAgICBhbmQgdGhlIHdob2xlIGNhbGwgdG8gSGFzUmVxdWlyZWRGaWVsZHMoKSB3aWxsIHJldHVybiB0cnVlLgotICAgIC8vICAgIFRoZXJlZm9yZSwgd2UgZG9uJ3QgaGF2ZSB0byBjaGVjayBpZiB0aGlzIHR5cGUgaGFzIHJlcXVpcmVkIGZpZWxkcwotICAgIC8vICAgIGhlcmUuCi0gICAgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGFscmVhZHlfc2Vlbi0+aW5zZXJ0KHR5cGUpOwotCi0gIC8vIElmIHRoZSB0eXBlIGhhcyBleHRlbnNpb25zLCBhbiBleHRlbnNpb24gd2l0aCBtZXNzYWdlIHR5cGUgY291bGQgY29udGFpbgotICAvLyByZXF1aXJlZCBmaWVsZHMsIHNvIHdlIGhhdmUgdG8gYmUgY29uc2VydmF0aXZlIGFuZCBhc3N1bWUgc3VjaCBhbgotICAvLyBleHRlbnNpb24gZXhpc3RzLgotICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSByZXR1cm4gdHJ1ZTsKLQotICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5maWVsZChpKTsKLSAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKLSAgICAgIHJldHVybiB0cnVlOwotICAgIH0KLSAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UpIHsKLSAgICAgIGlmIChIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCksIGFscmVhZHlfc2VlbikpIHsKLSAgICAgICAgcmV0dXJuIHRydWU7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIGZhbHNlOwotfQotCi1zdGF0aWMgYm9vbCBIYXNSZXF1aXJlZEZpZWxkcyhjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSB7Ci0gIGhhc2hfc2V0PGNvbnN0IERlc2NyaXB0b3IqPiBhbHJlYWR5X3NlZW47Ci0gIHJldHVybiBIYXNSZXF1aXJlZEZpZWxkcyh0eXBlLCAmYWxyZWFkeV9zZWVuKTsKLX0KLQogfSAgLy8gbmFtZXNwYWNlCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogTWVzc2FnZUdlbmVyYXRvcjo6TWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLAotICAgIGZpZWxkX2dlbmVyYXRvcnNfKGRlc2NyaXB0b3IpIHsKLX0KKyAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSB7fQogCiBNZXNzYWdlR2VuZXJhdG9yOjp+TWVzc2FnZUdlbmVyYXRvcigpIHt9CiAKLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgIC8vIEJlY2F1c2UgZGVzY3JpcHRvci5wcm90byAoY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9zKSBpcwotICAgIC8vIHVzZWQgaW4gdGhlIGNvbnN0cnVjdGlvbiBvZiBkZXNjcmlwdG9ycywgd2UgaGF2ZSBhIHRyaWNreSBib290c3RyYXBwaW5nCi0gICAgLy8gcHJvYmxlbS4gIFRvIGhlbHAgY29udHJvbCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb3JkZXIsIHdlIG1ha2Ugc3VyZSBhbGwKLSAgICAvLyBkZXNjcmlwdG9ycyBhbmQgb3RoZXIgc3RhdGljIGRhdGEgdGhhdCBkZXBlbmRzIG9uIHRoZW0gYXJlIG1lbWJlcnMgb2YKLSAgICAvLyB0aGUgb3V0ZXJtb3N0IGNsYXNzIGluIHRoZSBmaWxlLiAgVGhpcyB3YXksIHRoZXkgd2lsbCBiZSBpbml0aWFsaXplZCBpbgotICAgIC8vIGEgZGV0ZXJtaW5pc3RpYyBvcmRlci4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0ltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwgQ29udGV4dCogY29udGV4dCkKKyAgOiBNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3IpLCBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSksCisgICAgZmllbGRfZ2VuZXJhdG9yc18oZGVzY3JpcHRvciwgY29udGV4dF8pIHsKKyAgR09PR0xFX0NIRUNLKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3ItPmZpbGUoKSwgY29udGV4dC0+RW5mb3JjZUxpdGUoKSkpCisgICAgICA8PCAiR2VuZXJhdG9yIGZhY3RvcnkgZXJyb3I6IEEgbm9uLWxpdGUgbWVzc2FnZSBnZW5lcmF0b3IgaXMgdXNlZCB0byAiCisgICAgICAgICAiZ2VuZXJhdGUgbGl0ZSBtZXNzYWdlcy4iOworfQogCi0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbImlkZW50aWZpZXIiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pOwotICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKTsKLSAgICB2YXJzWyJjbGFzc25hbWUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yXyk7Ci0gICAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7Ci0gICAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoCi0gICAgICAgICAgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKLSAgICB9Ci0gICAgaWYgKGRlc2NyaXB0b3JfLT5maWxlKCktPm9wdGlvbnMoKS5qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKLSAgICAgIC8vIFdlIGNhbiBvbmx5IG1ha2UgdGhlc2UgcGFja2FnZS1wcml2YXRlIHNpbmNlIHRoZSBjbGFzc2VzIHRoYXQgdXNlIHRoZW0KLSAgICAgIC8vIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcy4KLSAgICAgIHZhcnNbInByaXZhdGUiXSA9ICIiOwotICAgIH0gZWxzZSB7Ci0gICAgICB2YXJzWyJwcml2YXRlIl0gPSAicHJpdmF0ZSAiOwotICAgIH0KK0ltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6On5JbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yKCkge30KIAotICAgIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIHR5cGUuCi0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICIkcHJpdmF0ZSRzdGF0aWMgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yXG4iCi0gICAgICAiICBpbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvcjtcbiIpOwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcygKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgaW50KiBieXRlY29kZV9lc3RpbWF0ZSkgeworICAvLyBCZWNhdXNlIGRlc2NyaXB0b3IucHJvdG8gKGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvcykgaXMKKyAgLy8gdXNlZCBpbiB0aGUgY29uc3RydWN0aW9uIG9mIGRlc2NyaXB0b3JzLCB3ZSBoYXZlIGEgdHJpY2t5IGJvb3RzdHJhcHBpbmcKKyAgLy8gcHJvYmxlbS4gIFRvIGhlbHAgY29udHJvbCBzdGF0aWMgaW5pdGlhbGl6YXRpb24gb3JkZXIsIHdlIG1ha2Ugc3VyZSBhbGwKKyAgLy8gZGVzY3JpcHRvcnMgYW5kIG90aGVyIHN0YXRpYyBkYXRhIHRoYXQgZGVwZW5kcyBvbiB0aGVtIGFyZSBtZW1iZXJzIG9mCisgIC8vIHRoZSBvdXRlcm1vc3QgY2xhc3MgaW4gdGhlIGZpbGUuICBUaGlzIHdheSwgdGhleSB3aWxsIGJlIGluaXRpYWxpemVkIGluCisgIC8vIGEgZGV0ZXJtaW5pc3RpYyBvcmRlci4KIAotICAgIC8vIEFuZCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlLgotICAgIHByaW50ZXItPlByaW50KHZhcnMsCi0gICAgICAiJHByaXZhdGUkc3RhdGljXG4iCi0gICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlXG4iCi0gICAgICAiICAgIGludGVybmFsXyRpZGVudGlmaWVyJF9maWVsZEFjY2Vzc29yVGFibGU7XG4iKTsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJpZGVudGlmaWVyIl0gPSBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKTsKKyAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpOworICB2YXJzWyJjbGFzc25hbWUiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoCisgICAgICAgIGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSk7CiAgIH0KKyAgaWYgKE11bHRpcGxlSmF2YUZpbGVzKGRlc2NyaXB0b3JfLT5maWxlKCksIC8qIGltbXV0YWJsZSA9ICovIHRydWUpKSB7CisgICAgLy8gV2UgY2FuIG9ubHkgbWFrZSB0aGVzZSBwYWNrYWdlLXByaXZhdGUgc2luY2UgdGhlIGNsYXNzZXMgdGhhdCB1c2UgdGhlbQorICAgIC8vIGFyZSBpbiBzZXBhcmF0ZSBmaWxlcy4KKyAgICB2YXJzWyJwcml2YXRlIl0gPSAiIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJwcml2YXRlIl0gPSAicHJpdmF0ZSAiOworICB9CisgIGlmICgqYnl0ZWNvZGVfZXN0aW1hdGUgPD0ga01heFN0YXRpY1NpemUpIHsKKyAgICB2YXJzWyJmaW5hbCJdID0gImZpbmFsICI7CisgIH0gZWxzZSB7CisgICAgdmFyc1siZmluYWwiXSA9ICIiOworICB9CisKKyAgLy8gVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgdHlwZS4KKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAvLyBUT0RPKHRlYm9yaW5nKTogZmluYWwgbmVlZHMgdG8gYmUgYWRkZWQgYmFjay4gVGhlIHdheSB0byBmaXggaXQgaXMgdG8KKyAgICAvLyBnZW5lcmF0ZSBtZXRob2RzIHRoYXQgY2FuIGNvbnN0cnVjdCB0aGUgdHlwZXMsIGFuZCB0aGVuIHN0aWxsIGRlY2xhcmUgdGhlCisgICAgLy8gdHlwZXMsIGFuZCB0aGVuIGluaXQgdGhlbSBpbiBjbGluaXQgd2l0aCB0aGUgbmV3IG1ldGhvZCBjYWxscy4KKyAgICAiJHByaXZhdGUkc3RhdGljICRmaW5hbCRjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3JcbiIKKyAgICAiICBpbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvcjtcbiIpOworICAqYnl0ZWNvZGVfZXN0aW1hdGUgKz0gMzA7CisKKyAgLy8gQW5kIHRoZSBGaWVsZEFjY2Vzc29yVGFibGUuCisgIEdlbmVyYXRlRmllbGRBY2Nlc3NvclRhYmxlKHByaW50ZXIsIGJ5dGVjb2RlX2VzdGltYXRlKTsKIAogICAvLyBHZW5lcmF0ZSBzdGF0aWMgbWVtYmVycyBmb3IgYWxsIG5lc3RlZCB0eXBlcy4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CiAgICAgLy8gVE9ETyhrZW50b24pOiAgUmV1c2UgTWVzc2FnZUdlbmVyYXRvciBvYmplY3RzPwotICAgIE1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKQotICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKHByaW50ZXIpOworICAgIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlU3RhdGljVmFyaWFibGVzKHByaW50ZXIsIGJ5dGVjb2RlX2VzdGltYXRlKTsKICAgfQogfQogCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlU3RhdGljVmFyaWFibGVJbml0aWFsaXplcnMoCitpbnQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycygKICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwotICAgIHZhcnNbImlkZW50aWZpZXIiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pOwotICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5pbmRleCgpKTsKLSAgICB2YXJzWyJjbGFzc25hbWUiXSA9IENsYXNzTmFtZShkZXNjcmlwdG9yXyk7Ci0gICAgaWYgKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSAhPSBOVUxMKSB7Ci0gICAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoCi0gICAgICAgICAgZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKTsKLSAgICB9Ci0KLSAgICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyB0eXBlLgotICAgIGlmIChkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkgPT0gTlVMTCkgewotICAgICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yID1cbiIKLSAgICAgICAgIiAgZ2V0RGVzY3JpcHRvcigpLmdldE1lc3NhZ2VUeXBlcygpLmdldCgkaW5kZXgkKTtcbiIpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCh2YXJzLAotICAgICAgICAiaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3IgPVxuIgotICAgICAgICAiICBpbnRlcm5hbF8kcGFyZW50JF9kZXNjcmlwdG9yLmdldE5lc3RlZFR5cGVzKCkuZ2V0KCRpbmRleCQpO1xuIik7Ci0gICAgfQotCi0gICAgLy8gQW5kIHRoZSBGaWVsZEFjY2Vzc29yVGFibGUuCi0gICAgcHJpbnRlci0+UHJpbnQodmFycywKLSAgICAgICJpbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlID0gbmV3XG4iCi0gICAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlKFxuIgotICAgICAgIiAgICBpbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvcixcbiIKLSAgICAgICIgICAgbmV3IGphdmEubGFuZy5TdHJpbmdbXSB7ICIpOwotICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJcIiRmaWVsZF9uYW1lJFwiLCAiLAotICAgICAgICAiZmllbGRfbmFtZSIsCi0gICAgICAgICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3JfLT5maWVsZChpKSkpOwotICAgIH0KLSAgICBwcmludGVyLT5QcmludCgifSxcbiIKLSAgICAgICIgICAgJGNsYXNzbmFtZSQuY2xhc3MsXG4iCi0gICAgICAiICAgICRjbGFzc25hbWUkLkJ1aWxkZXIuY2xhc3MpO1xuIiwKLSAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgaW50IGJ5dGVjb2RlX2VzdGltYXRlID0gMDsKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICB2YXJzWyJpZGVudGlmaWVyIl0gPSBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKTsKKyAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpOworICB2YXJzWyJjbGFzc25hbWUiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pOworICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpICE9IE5VTEwpIHsKKyAgICB2YXJzWyJwYXJlbnQiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoCisgICAgICAgIGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSk7CiAgIH0KIAorICAvLyBUaGUgZGVzY3JpcHRvciBmb3IgdGhpcyB0eXBlLgorICBpZiAoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpID09IE5VTEwpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yID1cbiIKKyAgICAgICIgIGdldERlc2NyaXB0b3IoKS5nZXRNZXNzYWdlVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iKTsKKyAgICBieXRlY29kZV9lc3RpbWF0ZSArPSAzMDsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9kZXNjcmlwdG9yID1cbiIKKyAgICAgICIgIGludGVybmFsXyRwYXJlbnQkX2Rlc2NyaXB0b3IuZ2V0TmVzdGVkVHlwZXMoKS5nZXQoJGluZGV4JCk7XG4iKTsKKyAgICBieXRlY29kZV9lc3RpbWF0ZSArPSAzMDsKKyAgfQorCisgIC8vIEFuZCB0aGUgRmllbGRBY2Nlc3NvclRhYmxlLgorICBieXRlY29kZV9lc3RpbWF0ZSArPSBHZW5lcmF0ZUZpZWxkQWNjZXNzb3JUYWJsZUluaXRpYWxpemVyKHByaW50ZXIpOworCiAgIC8vIEdlbmVyYXRlIHN0YXRpYyBtZW1iZXIgaW5pdGlhbGl6ZXJzIGZvciBhbGwgbmVzdGVkIHR5cGVzLgogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKICAgICAvLyBUT0RPKGtlbnRvbik6ICBSZXVzZSBNZXNzYWdlR2VuZXJhdG9yIG9iamVjdHM/Ci0gICAgTWVzc2FnZUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSkpCi0gICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgICBieXRlY29kZV9lc3RpbWF0ZSArPQorICAgICAgICBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSwgY29udGV4dF8pCisgICAgICAgICAgICAuR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhwcmludGVyKTsKICAgfQorICByZXR1cm4gYnl0ZWNvZGVfZXN0aW1hdGU7Cit9CisKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6CitHZW5lcmF0ZUZpZWxkQWNjZXNzb3JUYWJsZShpbzo6UHJpbnRlciogcHJpbnRlciwgaW50KiBieXRlY29kZV9lc3RpbWF0ZSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbImlkZW50aWZpZXIiXSA9IFVuaXF1ZUZpbGVTY29wZUlkZW50aWZpZXIoZGVzY3JpcHRvcl8pOworICBpZiAoTXVsdGlwbGVKYXZhRmlsZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSwgLyogaW1tdXRhYmxlID0gKi8gdHJ1ZSkpIHsKKyAgICAvLyBXZSBjYW4gb25seSBtYWtlIHRoZXNlIHBhY2thZ2UtcHJpdmF0ZSBzaW5jZSB0aGUgY2xhc3NlcyB0aGF0IHVzZSB0aGVtCisgICAgLy8gYXJlIGluIHNlcGFyYXRlIGZpbGVzLgorICAgIHZhcnNbInByaXZhdGUiXSA9ICIiOworICB9IGVsc2UgeworICAgIHZhcnNbInByaXZhdGUiXSA9ICJwcml2YXRlICI7CisgIH0KKyAgaWYgKCpieXRlY29kZV9lc3RpbWF0ZSA8PSBrTWF4U3RhdGljU2l6ZSkgeworICAgIHZhcnNbImZpbmFsIl0gPSAiZmluYWwgIjsKKyAgfSBlbHNlIHsKKyAgICB2YXJzWyJmaW5hbCJdID0gIiI7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFycywKKyAgICAiJHByaXZhdGUkc3RhdGljICRmaW5hbCRcbiIKKyAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlXG4iCisgICAgIiAgICBpbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlO1xuIik7CisKKyAgLy8gNiBieXRlcyBwZXIgZmllbGQgYW5kIG9uZW9mCisgICpieXRlY29kZV9lc3RpbWF0ZSArPSAxMCArIDYgKiBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKQorICAgICAgKyA2ICogZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsKK30KKworaW50IEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGVJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpbnQgYnl0ZWNvZGVfZXN0aW1hdGUgPSAxMDsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgImludGVybmFsXyRpZGVudGlmaWVyJF9maWVsZEFjY2Vzc29yVGFibGUgPSBuZXdcbiIKKyAgICAiICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuRmllbGRBY2Nlc3NvclRhYmxlKFxuIgorICAgICIgICAgaW50ZXJuYWxfJGlkZW50aWZpZXIkX2Rlc2NyaXB0b3IsXG4iCisgICAgIiAgICBuZXcgamF2YS5sYW5nLlN0cmluZ1tdIHsgIiwKKyAgICAiaWRlbnRpZmllciIsCisgICAgVW5pcXVlRmlsZVNjb3BlSWRlbnRpZmllcihkZXNjcmlwdG9yXykpOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbyA9IGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpOworICAgIGJ5dGVjb2RlX2VzdGltYXRlICs9IDY7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiXCIkZmllbGRfbmFtZSRcIiwgIiwKKyAgICAgICJmaWVsZF9uYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSk7CisgICAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZik7CisgICAgYnl0ZWNvZGVfZXN0aW1hdGUgKz0gNjsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJcIiRvbmVvZl9uYW1lJFwiLCAiLAorICAgICAgIm9uZW9mX25hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgfQorICBwcmludGVyLT5QcmludCgifSk7XG4iKTsKKyAgcmV0dXJuIGJ5dGVjb2RlX2VzdGltYXRlOwogfQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLQordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlciBleHRlbmRzXG4iCi0gICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLlxuIgotICAgICAgICAiICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZU9yQnVpbGRlcjwkY2xhc3NuYW1lJD4ge1xuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInB1YmxpYyBpbnRlcmZhY2UgJGNsYXNzbmFtZSRPckJ1aWxkZXIgZXh0ZW5kcyBcbiIKLSAgICAgICAgIiAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5cbiIKLSAgICAgICAgIiAgICAgICAgICBFeHRlbmRhYmxlTWVzc2FnZU9yQnVpbGRlcjwkY2xhc3NuYW1lJD4ge1xuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwotICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJwdWJsaWMgaW50ZXJmYWNlICRjbGFzc25hbWUkT3JCdWlsZGVyIGV4dGVuZHNcbiIKKyAgICAgICIgICAgJGV4dHJhX2ludGVyZmFjZXMkXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5cbiIKKyAgICAgICIgICAgICAgIEV4dGVuZGFibGVNZXNzYWdlT3JCdWlsZGVyPCRjbGFzc25hbWUkPiB7XG4iLAorICAgICAgImV4dHJhX2ludGVyZmFjZXMiLCBFeHRyYU1lc3NhZ2VPckJ1aWxkZXJJbnRlcmZhY2VzKGRlc2NyaXB0b3JfKSwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKICAgfSBlbHNlIHsKLSAgICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInB1YmxpYyBpbnRlcmZhY2UgJGNsYXNzbmFtZSRPckJ1aWxkZXJcbiIKLSAgICAgICAgIiAgICBleHRlbmRzIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9yQnVpbGRlciB7XG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gICAgfSBlbHNlIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAicHVibGljIGludGVyZmFjZSAkY2xhc3NuYW1lJE9yQnVpbGRlclxuIgotICAgICAgICAiICAgIGV4dGVuZHMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlTGl0ZU9yQnVpbGRlciB7XG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBpbnRlcmZhY2UgJGNsYXNzbmFtZSRPckJ1aWxkZXIgZXh0ZW5kc1xuIgorICAgICAgIiAgICAkZXh0cmFfaW50ZXJmYWNlcyRcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3JCdWlsZGVyIHtcbiIsCisgICAgICAiZXh0cmFfaW50ZXJmYWNlcyIsIEV4dHJhTWVzc2FnZU9yQnVpbGRlckludGVyZmFjZXMoZGVzY3JpcHRvcl8pLAorICAgICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCkpOwogICB9CiAKICAgcHJpbnRlci0+SW5kZW50KCk7CiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKLSAgICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLT5maWVsZChpKSk7CiAgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQogICAgICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKHByaW50ZXIpOwogICAgIH0KKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgIlxuIgorICAgICAgICAgICJwdWJsaWMgJGNsYXNzbmFtZSQuJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSAiCisgICAgICAgICAgImdldCRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UoKTtcbiIsCisgICAgICAgICAgIm9uZW9mX2NhcGl0YWxpemVkX25hbWUiLAorICAgICAgICAgIGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8oCisgICAgICAgICAgICAgIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpKS0+Y2FwaXRhbGl6ZWRfbmFtZSwKKyAgICAgICAgICAiY2xhc3NuYW1lIiwKKyAgICAgICAgICBjb250ZXh0Xy0+R2V0TmFtZVJlc29sdmVyKCktPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKKyAgICAgICAgICAgICAgZGVzY3JpcHRvcl8pKTsKKyAgICB9CiAgIHByaW50ZXItPk91dGRlbnQoKTsKIAogICBwcmludGVyLT5QcmludCgifVxuIik7CkBAIC0yOTMsOTMgKzI5MCwxOTEgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIGJvb2wgaXNfb3duX2ZpbGUgPQogICAgIGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSA9PSBOVUxMICYmCi0gICAgZGVzY3JpcHRvcl8tPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfbXVsdGlwbGVfZmlsZXMoKTsKKyAgICBNdWx0aXBsZUphdmFGaWxlcyhkZXNjcmlwdG9yXy0+ZmlsZSgpLCAvKiBpbW11dGFibGUgPSAqLyB0cnVlKTsKIAorICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlczsKKyAgdmFyaWFibGVzWyJzdGF0aWMiXSA9IGlzX293bl9maWxlID8gIiAiIDogIiBzdGF0aWMgIjsKKyAgdmFyaWFibGVzWyJjbGFzc25hbWUiXSA9IGRlc2NyaXB0b3JfLT5uYW1lKCk7CisgIHZhcmlhYmxlc1siZXh0cmFfaW50ZXJmYWNlcyJdID0gRXh0cmFNZXNzYWdlSW50ZXJmYWNlcyhkZXNjcmlwdG9yXyk7CisKKyAgV3JpdGVNZXNzYWdlRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisKKyAgLy8gVGhlIGJ1aWxkZXJfdHlwZSBzdG9yZXMgdGhlIHN1cGVyIHR5cGUgbmFtZSBvZiB0aGUgbmVzdGVkIEJ1aWxkZXIgY2xhc3MuCisgIHN0cmluZyBidWlsZGVyX3R5cGU7CiAgIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJwdWJsaWMgJHN0YXRpYyQgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgotICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlTWVzc2FnZTxcbiIKLSAgICAgICAgIiAgICAgICRjbGFzc25hbWUkPiBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCi0gICAgICAgICJzdGF0aWMiLCBpc19vd25fZmlsZSA/ICIiIDogInN0YXRpYyIsCi0gICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJwdWJsaWMgJHN0YXRpYyQgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgotICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuRXh0ZW5kYWJsZU1lc3NhZ2U8XG4iCi0gICAgICAgICIgICAgICAkY2xhc3NuYW1lJD4gaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAotICAgICAgICAic3RhdGljIiwgaXNfb3duX2ZpbGUgPyAiIiA6ICJzdGF0aWMiLAotICAgICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7Ci0gICAgfQorICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlcywKKyAgICAgICJwdWJsaWMgJHN0YXRpYyRmaW5hbCBjbGFzcyAkY2xhc3NuYW1lJCBleHRlbmRzXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlTWVzc2FnZTxcbiIKKyAgICAgICIgICAgICAkY2xhc3NuYW1lJD4gaW1wbGVtZW50c1xuIgorICAgICAgIiAgICAkZXh0cmFfaW50ZXJmYWNlcyRcbiIKKyAgICAgICIgICAgJGNsYXNzbmFtZSRPckJ1aWxkZXIge1xuIik7CisgICAgYnVpbGRlcl90eXBlID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLkV4dGVuZGFibGVCdWlsZGVyPCQwLCA/PiIsCisgICAgICAgICAgICAgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOwogICB9IGVsc2UgewotICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAicHVibGljICRzdGF0aWMkIGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKLSAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKLSAgICAgICAgIiAgICBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCi0gICAgICAgICJzdGF0aWMiLCBpc19vd25fZmlsZSA/ICIiIDogInN0YXRpYyIsCi0gICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJwdWJsaWMgJHN0YXRpYyQgZmluYWwgY2xhc3MgJGNsYXNzbmFtZSQgZXh0ZW5kc1xuIgotICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGVcbiIKLSAgICAgICAgIiAgICBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCi0gICAgICAgICJzdGF0aWMiLCBpc19vd25fZmlsZSA/ICIiIDogInN0YXRpYyIsCi0gICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKLSAgICB9CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzLAorICAgICAgInB1YmxpYyAkc3RhdGljJGZpbmFsIGNsYXNzICRjbGFzc25hbWUkIGV4dGVuZHNcbiIKKyAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlIGltcGxlbWVudHNcbiIKKyAgICAgICIgICAgJGV4dHJhX2ludGVyZmFjZXMkXG4iCisgICAgICAiICAgICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIpOworICAgIGJ1aWxkZXJfdHlwZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlcjw/PiI7CiAgIH0KICAgcHJpbnRlci0+SW5kZW50KCk7CisgIC8vIFVzaW5nIGJ1aWxkZXJfdHlwZSwgaW5zdGVhZCBvZiBCdWlsZGVyLCBwcmV2ZW50cyB0aGUgQnVpbGRlciBjbGFzcyBmcm9tCisgIC8vIGJlaW5nIGxvYWRlZCBpbnRvIFBlcm1HZW4gc3BhY2Ugd2hlbiB0aGUgZGVmYXVsdCBpbnN0YW5jZSBpcyBjcmVhdGVkLgorICAvLyBUaGlzIG9wdGltaXplcyB0aGUgUGVybUdlbiBzcGFjZSB1c2FnZSBmb3IgY2xpZW50cyB0aGF0IGRvIG5vdCBtb2RpZnkKKyAgLy8gbWVzc2FnZXMuCiAgIHByaW50ZXItPlByaW50KAogICAgICIvLyBVc2UgJGNsYXNzbmFtZSQubmV3QnVpbGRlcigpIHRvIGNvbnN0cnVjdC5cbiIKLSAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJChCdWlsZGVyIGJ1aWxkZXIpIHtcbiIKKyAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJCgkYnVpbGRlcnR5cGUkIGJ1aWxkZXIpIHtcbiIKICAgICAiICBzdXBlcihidWlsZGVyKTtcbiIKLSAgICAifVxuIgotICAgIC8vIFVzZWQgd2hlbiBjb25zdHJ1Y3RpbmcgdGhlIGRlZmF1bHQgaW5zdGFuY2UsIHdoaWNoIGNhbm5vdCBiZSBpbml0aWFsaXplZAotICAgIC8vIGltbWVkaWF0ZWx5IGJlY2F1c2UgaXQgbWF5IGN5Y2xpY2FsbHkgcmVmZXIgdG8gb3RoZXIgZGVmYXVsdCBpbnN0YW5jZXMuCi0gICAgInByaXZhdGUgJGNsYXNzbmFtZSQoYm9vbGVhbiBub0luaXQpIHt9XG4iCi0gICAgIlxuIgotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJCBkZWZhdWx0SW5zdGFuY2U7XG4iCi0gICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlKCkge1xuIgotICAgICIgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iCi0gICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgotICAgICIgIHJldHVybiBkZWZhdWx0SW5zdGFuY2U7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iLAorICAgICJ9XG4iLAorICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpLAorICAgICJidWlsZGVydHlwZSIsIGJ1aWxkZXJfdHlwZSk7CisgIHByaW50ZXItPlByaW50KAorICAgICJwcml2YXRlICRjbGFzc25hbWUkKCkge1xuIiwKICAgICAiY2xhc3NuYW1lIiwgZGVzY3JpcHRvcl8tPm5hbWUoKSk7CisgIHByaW50ZXItPkluZGVudCgpOworICBHZW5lcmF0ZUluaXRpYWxpemVycyhwcmludGVyKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIgorICAgICJcbiIpOworCisgIHByaW50ZXItPlByaW50KAorICAgICJAamF2YS5sYW5nLk92ZXJyaWRlXG4iCisgICAgInB1YmxpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLlVua25vd25GaWVsZFNldFxuIgorICAgICJnZXRVbmtub3duRmllbGRzKCkge1xuIik7CisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICByZXR1cm4gdGhpcy51bmtub3duRmllbGRzO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICByZXR1cm4gY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAifVxuIik7CisKKyAgaWYgKGNvbnRleHRfLT5IYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIEdlbmVyYXRlUGFyc2luZ0NvbnN0cnVjdG9yKHByaW50ZXIpOworICB9CiAKICAgR2VuZXJhdGVEZXNjcmlwdG9yTWV0aG9kcyhwcmludGVyKTsKIAogICAvLyBOZXN0ZWQgdHlwZXMKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIEVudW1HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmVudW1fdHlwZShpKSkuR2VuZXJhdGUocHJpbnRlcik7CisgICAgRW51bUdlbmVyYXRvcihkZXNjcmlwdG9yXy0+ZW51bV90eXBlKGkpLCB0cnVlLCBjb250ZXh0XykKKyAgICAgICAgLkdlbmVyYXRlKHByaW50ZXIpOwogICB9CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7Ci0gICAgTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSk7CisgICAgLy8gRG9uJ3QgZ2VuZXJhdGUgSmF2YSBjbGFzc2VzIGZvciBtYXAgZW50cnkgbWVzc2FnZXMuCisgICAgaWYgKElzTWFwRW50cnkoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpKSkgY29udGludWU7CisgICAgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvciBtZXNzYWdlR2VuZXJhdG9yKAorICAgICAgICBkZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoaSksIGNvbnRleHRfKTsKICAgICBtZXNzYWdlR2VuZXJhdG9yLkdlbmVyYXRlSW50ZXJmYWNlKHByaW50ZXIpOwogICAgIG1lc3NhZ2VHZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7CiAgIH0KIAotICAvLyBJbnRlZ2VycyBmb3IgYml0IGZpZWxkcy4KLSAgaW50IHRvdGFsQml0cyA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIHRvdGFsQml0cyArPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQotICAgICAgICAuR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKKyAgaWYgKEdlbmVyYXRlSGFzQml0cyhkZXNjcmlwdG9yXykpIHsKKyAgICAvLyBJbnRlZ2VycyBmb3IgYml0IGZpZWxkcy4KKyAgICBpbnQgdG90YWxCaXRzID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICAgIHRvdGFsQml0cyArPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgIC5HZXROdW1CaXRzRm9yTWVzc2FnZSgpOworICAgIH0KKyAgICBpbnQgdG90YWxJbnRzID0gKHRvdGFsQml0cyArIDMxKSAvIDMyOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdG90YWxJbnRzOyBpKyspIHsKKyAgICAgIHByaW50ZXItPlByaW50KCJwcml2YXRlIGludCAkYml0X2ZpZWxkX25hbWUkO1xuIiwKKyAgICAgICAgImJpdF9maWVsZF9uYW1lIiwgR2V0Qml0RmllbGROYW1lKGkpKTsKKyAgICB9CiAgIH0KLSAgaW50IHRvdGFsSW50cyA9ICh0b3RhbEJpdHMgKyAzMSkgLyAzMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbEludHM7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KCJwcml2YXRlIGludCAkYml0X2ZpZWxkX25hbWUkO1xuIiwKLSAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7CisKKyAgLy8gb25lb2YKKyAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsX2NvdW50KCk7IGkrKykgeworICAgIHZhcnNbIm9uZW9mX25hbWUiXSA9IGNvbnRleHRfLT5HZXRPbmVvZkdlbmVyYXRvckluZm8oCisgICAgICAgIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpKS0+bmFtZTsKKyAgICB2YXJzWyJvbmVvZl9jYXBpdGFsaXplZF9uYW1lIl0gPSBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKAorICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKSktPmNhcGl0YWxpemVkX25hbWU7CisgICAgdmFyc1sib25lb2ZfaW5kZXgiXSA9IFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmluZGV4KCkpOworICAgIC8vIG9uZW9mQ2FzZV8gYW5kIG9uZW9mXworICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAicHJpdmF0ZSBpbnQgJG9uZW9mX25hbWUkQ2FzZV8gPSAwO1xuIgorICAgICAgInByaXZhdGUgamF2YS5sYW5nLk9iamVjdCAkb25lb2ZfbmFtZSRfO1xuIik7CisgICAgLy8gT25lb2ZDYXNlIGVudW0KKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInB1YmxpYyBlbnVtICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2VcbiIKKyAgICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLkVudW1MaXRlIHtcbiIpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiJGZpZWxkX25hbWUkKCRmaWVsZF9udW1iZXIkKSxcbiIsCisgICAgICAgICJmaWVsZF9uYW1lIiwKKyAgICAgICAgVG9VcHBlcihmaWVsZC0+bmFtZSgpKSwKKyAgICAgICAgImZpZWxkX251bWJlciIsCisgICAgICAgIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSk7CisgICAgfQorICAgIHByaW50ZXItPlByaW50KAorICAgICAgIiRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVCgwKTtcbiIsCisgICAgICAiY2FwX29uZW9mX25hbWUiLAorICAgICAgVG9VcHBlcih2YXJzWyJvbmVvZl9uYW1lIl0pKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgInByaXZhdGUgZmluYWwgaW50IHZhbHVlO1xuIgorICAgICAgInByaXZhdGUgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZShpbnQgdmFsdWUpIHtcbiIKKyAgICAgICIgIHRoaXMudmFsdWUgPSB2YWx1ZTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJzLAorICAgICAgIi8qKlxuIgorICAgICAgIiAqIEBkZXByZWNhdGVkIFVzZSB7QGxpbmsgI2Zvck51bWJlcihpbnQpfSBpbnN0ZWFkLlxuIgorICAgICAgIiAqL1xuIgorICAgICAgIkBqYXZhLmxhbmcuRGVwcmVjYXRlZFxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSB2YWx1ZU9mKGludCB2YWx1ZSkge1xuIgorICAgICAgIiAgcmV0dXJuIGZvck51bWJlcih2YWx1ZSk7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIgorICAgICAgInB1YmxpYyBzdGF0aWMgJG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSBmb3JOdW1iZXIoaW50IHZhbHVlKSB7XG4iCisgICAgICAiICBzd2l0Y2ggKHZhbHVlKSB7XG4iKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKS0+ZmllbGQoaik7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIiAgICBjYXNlICRmaWVsZF9udW1iZXIkOiByZXR1cm4gJGZpZWxkX25hbWUkO1xuIiwKKyAgICAgICAgImZpZWxkX251bWJlciIsCisgICAgICAgIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSwKKyAgICAgICAgImZpZWxkX25hbWUiLAorICAgICAgICBUb1VwcGVyKGZpZWxkLT5uYW1lKCkpKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICAgIGNhc2UgMDogcmV0dXJuICRjYXBfb25lb2ZfbmFtZSRfTk9UX1NFVDtcbiIKKyAgICAgICIgICAgZGVmYXVsdDogcmV0dXJuIG51bGw7XG4iCisgICAgICAiICB9XG4iCisgICAgICAifVxuIgorICAgICAgInB1YmxpYyBpbnQgZ2V0TnVtYmVyKCkge1xuIgorICAgICAgIiAgcmV0dXJuIHRoaXMudmFsdWU7XG4iCisgICAgICAifVxuIiwKKyAgICAgICJjYXBfb25lb2ZfbmFtZSIsIFRvVXBwZXIodmFyc1sib25lb2ZfbmFtZSJdKSk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KCJ9O1xuXG4iKTsKKyAgICAvLyBvbmVvZkNhc2UoKQorICAgIHByaW50ZXItPlByaW50KHZhcnMsCisgICAgICAicHVibGljICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2VcbiIKKyAgICAgICJnZXQkb25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSRDYXNlKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRvbmVvZl9jYXBpdGFsaXplZF9uYW1lJENhc2UuZm9yTnVtYmVyKFxuIgorICAgICAgIiAgICAgICRvbmVvZl9uYW1lJENhc2VfKTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iKTsKKyAgfQorCisgIGlmIChJc0FueU1lc3NhZ2UoZGVzY3JpcHRvcl8pKSB7CisgICAgR2VuZXJhdGVBbnlNZXRob2RzKHByaW50ZXIpOwogICB9CiAKICAgLy8gRmllbGRzCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLT5maWVsZChpKSk7CiAgICAgcHJpbnRlci0+UHJpbnQoInB1YmxpYyBzdGF0aWMgZmluYWwgaW50ICRjb25zdGFudF9uYW1lJCA9ICRudW1iZXIkO1xuIiwKICAgICAgICJjb25zdGFudF9uYW1lIiwgRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKSwKICAgICAgICJudW1iZXIiLCBTaW1wbGVJdG9hKGRlc2NyaXB0b3JfLT5maWVsZChpKS0+bnVtYmVyKCkpKTsKQEAgLTM4NywxOSArNDgyLDggQEAKICAgICBwcmludGVyLT5QcmludCgiXG4iKTsKICAgfQogCi0gIC8vIENhbGxlZCBieSB0aGUgY29uc3RydWN0b3IsIGV4Y2VwdCBpbiB0aGUgY2FzZSBvZiB0aGUgZGVmYXVsdCBpbnN0YW5jZSwKLSAgLy8gaW4gd2hpY2ggY2FzZSB0aGlzIGlzIGNhbGxlZCBieSBzdGF0aWMgaW5pdCBjb2RlIGxhdGVyIG9uLgotICBwcmludGVyLT5QcmludCgicHJpdmF0ZSB2b2lkIGluaXRGaWVsZHMoKSB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCi0gICAgICAgICAgICAgICAgICAgICAuR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUocHJpbnRlcik7Ci0gIH0KLSAgcHJpbnRlci0+T3V0ZGVudCgpOwotICBwcmludGVyLT5QcmludCgifVxuIik7Ci0KLSAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgR2VuZXJhdGVJc0luaXRpYWxpemVkKHByaW50ZXIsIE1FTU9JWkUpOworICBpZiAoY29udGV4dF8tPkhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgR2VuZXJhdGVJc0luaXRpYWxpemVkKHByaW50ZXIpOwogICAgIEdlbmVyYXRlTWVzc2FnZVNlcmlhbGl6YXRpb25NZXRob2RzKHByaW50ZXIpOwogICB9CiAKQEAgLTQwNywyNyArNDkxLDUwIEBACiAgICAgR2VuZXJhdGVFcXVhbHNBbmRIYXNoQ29kZShwcmludGVyKTsKICAgfQogCisKICAgR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKHByaW50ZXIpOwogICBHZW5lcmF0ZUJ1aWxkZXIocHJpbnRlcik7CiAKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCisKICAgLy8gQ2FyZWZ1bGx5IGluaXRpYWxpemUgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaW4gc3VjaCBhIHdheSB0aGF0IGl0IGRvZXNuJ3QKICAgLy8gY29uZmxpY3Qgd2l0aCBvdGhlciBpbml0aWFsaXphdGlvbi4KICAgcHJpbnRlci0+UHJpbnQoCi0gICAgIlxuIgorICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCAkY2xhc3NuYW1lJCBERUZBVUxUX0lOU1RBTkNFO1xuIiwKKyAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICBwcmludGVyLT5QcmludCgKICAgICAic3RhdGljIHtcbiIKLSAgICAiICBkZWZhdWx0SW5zdGFuY2UgPSBuZXcgJGNsYXNzbmFtZSQodHJ1ZSk7XG4iCi0gICAgIiAgZGVmYXVsdEluc3RhbmNlLmluaXRGaWVsZHMoKTtcbiIKKyAgICAiICBERUZBVUxUX0lOU1RBTkNFID0gbmV3ICRjbGFzc25hbWUkKCk7XG4iCiAgICAgIn1cbiIKLSAgICAiXG4iCi0gICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTokZnVsbF9uYW1lJClcbiIsCi0gICAgImNsYXNzbmFtZSIsIGRlc2NyaXB0b3JfLT5uYW1lKCksCi0gICAgImZ1bGxfbmFtZSIsIGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKSk7CisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOwogCi0gIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBkZWNsYXJlZCBhZnRlciB0aGUgZGVmYXVsdEluc3RhbmNlIGlzIGluaXRpYWxpemVkCi0gIC8vIGJlY2F1c2UgdGhlIGRlZmF1bHRJbnN0YW5jZSBpcyB1c2VkIGJ5IHRoZSBleHRlbnNpb24gdG8gbGF6aWx5IHJldHJpZXZlCisgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgZ2V0RGVmYXVsdEluc3RhbmNlKCkge1xuIgorICAgICAgIiAgcmV0dXJuIERFRkFVTFRfSU5TVEFOQ0U7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisKKyAgR2VuZXJhdGVQYXJzZXIocHJpbnRlcik7CisKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgorICAgICIgIHJldHVybiBERUZBVUxUX0lOU1RBTkNFO1xuIgorICAgICJ9XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOworCisgIC8vIEV4dGVuc2lvbnMgbXVzdCBiZSBkZWNsYXJlZCBhZnRlciB0aGUgREVGQVVMVF9JTlNUQU5DRSBpcyBpbml0aWFsaXplZAorICAvLyBiZWNhdXNlIHRoZSBERUZBVUxUX0lOU1RBTkNFIGlzIHVzZWQgYnkgdGhlIGV4dGVuc2lvbiB0byBsYXppbHkgcmV0cmlldmUKICAgLy8gdGhlIG91dGVyIGNsYXNzJ3MgRmlsZURlc2NyaXB0b3IuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKLSAgICBFeHRlbnNpb25HZW5lcmF0b3IoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbihpKSkuR2VuZXJhdGUocHJpbnRlcik7CisgICAgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5leHRlbnNpb24oaSksIGNvbnRleHRfKQorICAgICAgICAuR2VuZXJhdGUocHJpbnRlcik7CiAgIH0KIAogICBwcmludGVyLT5PdXRkZW50KCk7CkBAIC00MzcsNDYgKzU0NCw0NiBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OgogR2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKLSAgc2NvcGVkX2FycmF5PGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IHNvcnRlZF9maWVsZHMoCi0gICAgU29ydEZpZWxkc0J5TnVtYmVyKGRlc2NyaXB0b3JfKSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IgKiA+IHNvcnRlZF9maWVsZHMoCisgICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKIAogICB2ZWN0b3I8Y29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqPiBzb3J0ZWRfZXh0ZW5zaW9uczsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCk7ICsraSkgewogICAgIHNvcnRlZF9leHRlbnNpb25zLnB1c2hfYmFjayhkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlKGkpKTsKICAgfQotICBzb3J0KHNvcnRlZF9leHRlbnNpb25zLmJlZ2luKCksIHNvcnRlZF9leHRlbnNpb25zLmVuZCgpLAotICAgICAgIEV4dGVuc2lvblJhbmdlT3JkZXJpbmcoKSk7CisgIHN0ZDo6c29ydChzb3J0ZWRfZXh0ZW5zaW9ucy5iZWdpbigpLCBzb3J0ZWRfZXh0ZW5zaW9ucy5lbmQoKSwKKyAgICAgICAgICAgIEV4dGVuc2lvblJhbmdlT3JkZXJpbmcoKSk7CiAKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgInB1YmxpYyB2b2lkIHdyaXRlVG8oY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpXG4iCiAgICAgIiAgICAgICAgICAgICAgICAgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIik7CiAgIHByaW50ZXItPkluZGVudCgpOwotICAvLyB3cml0ZVRvKENvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCkgbWlnaHQgYmUgaW52b2tlZCB3aXRob3V0Ci0gIC8vIGdldFNlcmlhbGl6ZWRTaXplKCkgZXZlciBiZWluZyBjYWxsZWQsIGJ1dCB3ZSBuZWVkIHRoZSBtZW1vaXplZAotICAvLyBzaXplcyBpbiBjYXNlIHRoaXMgbWVzc2FnZSBoYXMgcGFja2VkIGZpZWxkcy4gUmF0aGVyIHRoYW4gZW1pdCBjaGVja3MgZm9yCi0gIC8vIGVhY2ggcGFja2VkIGZpZWxkLCBqdXN0IGNhbGwgZ2V0U2VyaWFsaXplZFNpemUoKSB1cCBmcm9udCBmb3IgYWxsIG1lc3NhZ2VzLgotICAvLyBJbiBtb3N0IGNhc2VzLCBnZXRTZXJpYWxpemVkU2l6ZSgpIHdpbGwgaGF2ZSBhbHJlYWR5IGJlZW4gY2FsbGVkIGFueXdheSBieQotICAvLyBvbmUgb2YgdGhlIHdyYXBwZXIgd3JpdGVUbygpIG1ldGhvZHMsIG1ha2luZyB0aGlzIGNhbGwgY2hlYXAuCi0gIHByaW50ZXItPlByaW50KAotICAgICJnZXRTZXJpYWxpemVkU2l6ZSgpO1xuIik7CisgIGlmIChIYXNQYWNrZWRGaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgLy8gd3JpdGVUbyhDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQpIG1pZ2h0IGJlIGludm9rZWQgd2l0aG91dAorICAgIC8vIGdldFNlcmlhbGl6ZWRTaXplKCkgZXZlciBiZWluZyBjYWxsZWQsIGJ1dCB3ZSBuZWVkIHRoZSBtZW1vaXplZAorICAgIC8vIHNpemVzIGluIGNhc2UgdGhpcyBtZXNzYWdlIGhhcyBwYWNrZWQgZmllbGRzLiBSYXRoZXIgdGhhbiBlbWl0IGNoZWNrcyBmb3IKKyAgICAvLyBlYWNoIHBhY2tlZCBmaWVsZCwganVzdCBjYWxsIGdldFNlcmlhbGl6ZWRTaXplKCkgdXAgZnJvbnQuCisgICAgLy8gSW4gbW9zdCBjYXNlcywgZ2V0U2VyaWFsaXplZFNpemUoKSB3aWxsIGhhdmUgYWxyZWFkeSBiZWVuIGNhbGxlZCBhbnl3YXkKKyAgICAvLyBieSBvbmUgb2YgdGhlIHdyYXBwZXIgd3JpdGVUbygpIG1ldGhvZHMsIG1ha2luZyB0aGlzIGNhbGwgY2hlYXAuCisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZ2V0U2VyaWFsaXplZFNpemUoKTtcbiIpOworICB9CiAKICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKICAgICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CiAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZSRsaXRlJFxuIgotICAgICAgICAiICAuRXh0ZW5kYWJsZU1lc3NhZ2U8JGNsYXNzbmFtZSQ+LkV4dGVuc2lvbldyaXRlciBleHRlbnNpb25Xcml0ZXIgPVxuIgotICAgICAgICAiICAgIG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKTtcbiIsCi0gICAgICAgICJsaXRlIiwgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pID8gIiIgOiAiTGl0ZSIsCi0gICAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgorICAgICAgICAiICAuRXh0ZW5kYWJsZU1lc3NhZ2U8JGNsYXNzbmFtZSQ+LkV4dGVuc2lvbldyaXRlclxuIgorICAgICAgICAiICAgIGV4dGVuc2lvbldyaXRlciA9IG5ld01lc3NhZ2VTZXRFeHRlbnNpb25Xcml0ZXIoKTtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CiAgICAgfSBlbHNlIHsKICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlJGxpdGUkXG4iCi0gICAgICAgICIgIC5FeHRlbmRhYmxlTWVzc2FnZTwkY2xhc3NuYW1lJD4uRXh0ZW5zaW9uV3JpdGVyIGV4dGVuc2lvbldyaXRlciA9XG4iCi0gICAgICAgICIgICAgbmV3RXh0ZW5zaW9uV3JpdGVyKCk7XG4iLAotICAgICAgICAibGl0ZSIsIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSA/ICIiIDogIkxpdGUiLAotICAgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CisgICAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKKyAgICAgICAgIiAgLkV4dGVuZGFibGVNZXNzYWdlPCRjbGFzc25hbWUkPi5FeHRlbnNpb25Xcml0ZXJcbiIKKyAgICAgICAgIiAgICBleHRlbnNpb25Xcml0ZXIgPSBuZXdFeHRlbnNpb25Xcml0ZXIoKTtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CiAgICAgfQogICB9CiAKQEAgLTQ5NSwxMyArNjAyLDEzIEBACiAgICAgfQogICB9CiAKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CiAgICAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewogICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJnZXRVbmtub3duRmllbGRzKCkud3JpdGVBc01lc3NhZ2VTZXRUbyhvdXRwdXQpO1xuIik7CisgICAgICAgICJ1bmtub3duRmllbGRzLndyaXRlQXNNZXNzYWdlU2V0VG8ob3V0cHV0KTtcbiIpOwogICAgIH0gZWxzZSB7CiAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImdldFVua25vd25GaWVsZHMoKS53cml0ZVRvKG91dHB1dCk7XG4iKTsKKyAgICAgICAgInVua25vd25GaWVsZHMud3JpdGVUbyhvdXRwdXQpO1xuIik7CiAgICAgfQogICB9CiAKQEAgLTUwOSw5ICs2MTYsOCBAQAogICBwcmludGVyLT5QcmludCgKICAgICAifVxuIgogICAgICJcbiIKLSAgICAicHJpdmF0ZSBpbnQgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IC0xO1xuIgogICAgICJwdWJsaWMgaW50IGdldFNlcmlhbGl6ZWRTaXplKCkge1xuIgotICAgICIgIGludCBzaXplID0gbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZTtcbiIKKyAgICAiICBpbnQgc2l6ZSA9IG1lbW9pemVkU2l6ZTtcbiIKICAgICAiICBpZiAoc2l6ZSAhPSAtMSkgcmV0dXJuIHNpemU7XG4iCiAgICAgIlxuIgogICAgICIgIHNpemUgPSAwO1xuIik7CkBAIC01MzEsMzQgKzYzNywyOCBAQAogICAgIH0KICAgfQogCi0gIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewogICAgIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAic2l6ZSArPSBnZXRVbmtub3duRmllbGRzKCkuZ2V0U2VyaWFsaXplZFNpemVBc01lc3NhZ2VTZXQoKTtcbiIpOworICAgICAgICAic2l6ZSArPSB1bmtub3duRmllbGRzLmdldFNlcmlhbGl6ZWRTaXplQXNNZXNzYWdlU2V0KCk7XG4iKTsKICAgICB9IGVsc2UgewogICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJzaXplICs9IGdldFVua25vd25GaWVsZHMoKS5nZXRTZXJpYWxpemVkU2l6ZSgpO1xuIik7CisgICAgICAgICJzaXplICs9IHVua25vd25GaWVsZHMuZ2V0U2VyaWFsaXplZFNpemUoKTtcbiIpOwogICAgIH0KICAgfQogCiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgbWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSA9IHNpemU7XG4iCisgICAgIiAgbWVtb2l6ZWRTaXplID0gc2l6ZTtcbiIKICAgICAiICByZXR1cm4gc2l6ZTtcbiIKICAgICAifVxuIgogICAgICJcbiIpOwogCiAgIHByaW50ZXItPlByaW50KAotICAgICJwcml2YXRlIHN0YXRpYyBmaW5hbCBsb25nIHNlcmlhbFZlcnNpb25VSUQgPSAwTDtcbiIKLSAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgotICAgICJwcm90ZWN0ZWQgamF2YS5sYW5nLk9iamVjdCB3cml0ZVJlcGxhY2UoKVxuIgotICAgICIgICAgdGhyb3dzIGphdmEuaW8uT2JqZWN0U3RyZWFtRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gc3VwZXIud3JpdGVSZXBsYWNlKCk7XG4iCi0gICAgIn1cbiIKLSAgICAiXG4iKTsKKyAgICAicHJpdmF0ZSBzdGF0aWMgZmluYWwgbG9uZyBzZXJpYWxWZXJzaW9uVUlEID0gMEw7XG4iKTsKIH0KIAotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6CiBHZW5lcmF0ZVBhcnNlRnJvbU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKICAgLy8gTm90ZTogIFRoZXNlIGFyZSBzZXBhcmF0ZSBmcm9tIEdlbmVyYXRlTWVzc2FnZVNlcmlhbGl6YXRpb25NZXRob2RzKCkKICAgLy8gICBiZWNhdXNlIHRoZXkgbmVlZCB0byBiZSBnZW5lcmF0ZWQgZXZlbiBmb3IgbWVzc2FnZXMgdGhhdCBhcmUgb3B0aW1pemVkCkBAIC01NjcsNzkgKzY2Nyw3MSBAQAogICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRnJvbShcbiIKICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBkYXRhKVxuIgogICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhKS5idWlsZFBhcnNlZCgpO1xuIgorICAgICIgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGRhdGEpO1xuIgogICAgICJ9XG4iCiAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGRhdGEsXG4iCiAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKICAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCi0gICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCi0gICAgIiAgICAgICAgICAgLmJ1aWxkUGFyc2VkKCk7XG4iCisgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgogICAgICJ9XG4iCiAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKGJ5dGVbXSBkYXRhKVxuIgogICAgICIgICAgdGhyb3dzIGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uIHtcbiIKLSAgICAiICByZXR1cm4gbmV3QnVpbGRlcigpLm1lcmdlRnJvbShkYXRhKS5idWlsZFBhcnNlZCgpO1xuIgorICAgICIgIHJldHVybiBQQVJTRVIucGFyc2VGcm9tKGRhdGEpO1xuIgogICAgICJ9XG4iCiAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgogICAgICIgICAgYnl0ZVtdIGRhdGEsXG4iCiAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkV4dGVuc2lvblJlZ2lzdHJ5TGl0ZSBleHRlbnNpb25SZWdpc3RyeSlcbiIKICAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCi0gICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCi0gICAgIiAgICAgICAgICAgLmJ1aWxkUGFyc2VkKCk7XG4iCisgICAgIiAgcmV0dXJuIFBBUlNFUi5wYXJzZUZyb20oZGF0YSwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgogICAgICJ9XG4iCiAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKGphdmEuaW8uSW5wdXRTdHJlYW0gaW5wdXQpXG4iCiAgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCi0gICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQpLmJ1aWxkUGFyc2VkKCk7XG4iCisgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgorICAgICIgICAgICAucGFyc2VXaXRoSU9FeGNlcHRpb24oUEFSU0VSLCBpbnB1dCk7XG4iCiAgICAgIn1cbiIKICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZUZyb20oXG4iCiAgICAgIiAgICBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0LFxuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCiAgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCi0gICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgotICAgICIgICAgICAgICAgIC5idWlsZFBhcnNlZCgpO1xuIgorICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKKyAgICAiICAgICAgLnBhcnNlV2l0aElPRXhjZXB0aW9uKFBBUlNFUiwgaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKICAgICAifVxuIgogICAgICJwdWJsaWMgc3RhdGljICRjbGFzc25hbWUkIHBhcnNlRGVsaW1pdGVkRnJvbShqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0KVxuIgogICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgotICAgICIgIEJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTtcbiIKLSAgICAiICBpZiAoYnVpbGRlci5tZXJnZURlbGltaXRlZEZyb20oaW5wdXQpKSB7XG4iCi0gICAgIiAgICByZXR1cm4gYnVpbGRlci5idWlsZFBhcnNlZCgpO1xuIgotICAgICIgIH0gZWxzZSB7XG4iCi0gICAgIiAgICByZXR1cm4gbnVsbDtcbiIKLSAgICAiICB9XG4iCisgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgorICAgICIgICAgICAucGFyc2VEZWxpbWl0ZWRXaXRoSU9FeGNlcHRpb24oUEFSU0VSLCBpbnB1dCk7XG4iCiAgICAgIn1cbiIKICAgICAicHVibGljIHN0YXRpYyAkY2xhc3NuYW1lJCBwYXJzZURlbGltaXRlZEZyb20oXG4iCiAgICAgIiAgICBqYXZhLmlvLklucHV0U3RyZWFtIGlucHV0LFxuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCiAgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCi0gICAgIiAgQnVpbGRlciBidWlsZGVyID0gbmV3QnVpbGRlcigpO1xuIgotICAgICIgIGlmIChidWlsZGVyLm1lcmdlRGVsaW1pdGVkRnJvbShpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpKSB7XG4iCi0gICAgIiAgICByZXR1cm4gYnVpbGRlci5idWlsZFBhcnNlZCgpO1xuIgotICAgICIgIH0gZWxzZSB7XG4iCi0gICAgIiAgICByZXR1cm4gbnVsbDtcbiIKLSAgICAiICB9XG4iCisgICAgIiAgcmV0dXJuIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZVxuIgorICAgICIgICAgICAucGFyc2VEZWxpbWl0ZWRXaXRoSU9FeGNlcHRpb24oUEFSU0VSLCBpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIgogICAgICJ9XG4iCiAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0KVxuIgogICAgICIgICAgdGhyb3dzIGphdmEuaW8uSU9FeGNlcHRpb24ge1xuIgotICAgICIgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKGlucHV0KS5idWlsZFBhcnNlZCgpO1xuIgorICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKKyAgICAiICAgICAgLnBhcnNlV2l0aElPRXhjZXB0aW9uKFBBUlNFUiwgaW5wdXQpO1xuIgogICAgICJ9XG4iCiAgICAgInB1YmxpYyBzdGF0aWMgJGNsYXNzbmFtZSQgcGFyc2VGcm9tKFxuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0LFxuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCiAgICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iCi0gICAgIiAgcmV0dXJuIG5ld0J1aWxkZXIoKS5tZXJnZUZyb20oaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgotICAgICIgICAgICAgICAgIC5idWlsZFBhcnNlZCgpO1xuIgorICAgICIgIHJldHVybiBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2VcbiIKKyAgICAiICAgICAgLnBhcnNlV2l0aElPRXhjZXB0aW9uKFBBUlNFUiwgaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIKICAgICAifVxuIgogICAgICJcbiIsCi0gICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOworICAgICJjbGFzc25hbWUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7CiB9CiAKLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZCgKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVGaWVsZCgKICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewogICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUocHJpbnRlcik7CiB9CiAKLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVTZXJpYWxpemVPbmVFeHRlbnNpb25SYW5nZSgKICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlKSB7CiAgIHByaW50ZXItPlByaW50KAogICAgICJleHRlbnNpb25Xcml0ZXIud3JpdGVVbnRpbCgkZW5kJCwgb3V0cHV0KTtcbiIsCkBAIC02NDgsMzQ2ICs3NDAsNDY1IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVCdWlsZGVyKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIExJVEVfUlVOVElNRSBpbXBsZW1lbnRzIHRoaXMgYXQgdGhlIEdlbmVyYXRlZE1lc3NhZ2VMaXRlIGxldmVsLgogICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7IHJldHVybiBCdWlsZGVyLmNyZWF0ZSgpOyB9XG4iCi0gICAgInB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3QnVpbGRlcigpOyB9XG4iCi0gICAgInB1YmxpYyBzdGF0aWMgQnVpbGRlciBuZXdCdWlsZGVyKCRjbGFzc25hbWUkIHByb3RvdHlwZSkge1xuIgotICAgICIgIHJldHVybiBuZXdCdWlsZGVyKCkubWVyZ2VGcm9tKHByb3RvdHlwZSk7XG4iCisgICAgInB1YmxpYyBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKCkgeyByZXR1cm4gbmV3QnVpbGRlcigpOyB9XG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAicHVibGljIHN0YXRpYyBCdWlsZGVyIG5ld0J1aWxkZXIoKSB7XG4iCisgICAgIiAgcmV0dXJuIERFRkFVTFRfSU5TVEFOQ0UudG9CdWlsZGVyKCk7XG4iCiAgICAgIn1cbiIKLSAgICAicHVibGljIEJ1aWxkZXIgdG9CdWlsZGVyKCkgeyByZXR1cm4gbmV3QnVpbGRlcih0aGlzKTsgfVxuIgorICAgICJwdWJsaWMgc3RhdGljIEJ1aWxkZXIgbmV3QnVpbGRlcigkY2xhc3NuYW1lJCBwcm90b3R5cGUpIHtcbiIKKyAgICAiICByZXR1cm4gREVGQVVMVF9JTlNUQU5DRS50b0J1aWxkZXIoKS5tZXJnZUZyb20ocHJvdG90eXBlKTtcbiIKKyAgICAifVxuIgorICAgICJwdWJsaWMgQnVpbGRlciB0b0J1aWxkZXIoKSB7XG4iCisgICAgIiAgcmV0dXJuIHRoaXMgPT0gREVGQVVMVF9JTlNUQU5DRVxuIgorICAgICIgICAgICA/IG5ldyBCdWlsZGVyKCkgOiBuZXcgQnVpbGRlcigpLm1lcmdlRnJvbSh0aGlzKTtcbiIKKyAgICAifVxuIgogICAgICJcbiIsCi0gICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotCi0gIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXykpIHsKLSAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgotICAgICAgInByb3RlY3RlZCBCdWlsZGVyIG5ld0J1aWxkZXJGb3JUeXBlKFxuIgotICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlclBhcmVudCBwYXJlbnQpIHtcbiIKLSAgICAgICIgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKHBhcmVudCk7XG4iCi0gICAgICAiICByZXR1cm4gYnVpbGRlcjtcbiIKLSAgICAgICJ9XG4iKTsKLSAgfQotCi0gIGlmIChkZXNjcmlwdG9yXy0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7Ci0gICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kc1xuIgotICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5FeHRlbmRhYmxlQnVpbGRlcjxcbiIKLSAgICAgICAgIiAgICAgICRjbGFzc25hbWUkLCBCdWlsZGVyPiBpbXBsZW1lbnRzICRjbGFzc25hbWUkT3JCdWlsZGVyIHtcbiIsCi0gICAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKLSAgICB9IGVsc2UgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJwdWJsaWMgc3RhdGljIGZpbmFsIGNsYXNzIEJ1aWxkZXIgZXh0ZW5kc1xuIgotICAgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZUxpdGUuRXh0ZW5kYWJsZUJ1aWxkZXI8XG4iCi0gICAgICAgICIgICAgICAkY2xhc3NuYW1lJCwgQnVpbGRlcj4gaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0gICAgfQotICB9IGVsc2UgewotICAgIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBCdWlsZGVyIGV4dGVuZHNcbiIKLSAgICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2UuQnVpbGRlcjxCdWlsZGVyPlxuIgotICAgICAgICAgIiAgIGltcGxlbWVudHMgJGNsYXNzbmFtZSRPckJ1aWxkZXIge1xuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotICAgIH0gZWxzZSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInB1YmxpYyBzdGF0aWMgZmluYWwgY2xhc3MgQnVpbGRlciBleHRlbmRzXG4iCi0gICAgICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlTGl0ZS5CdWlsZGVyPFxuIgotICAgICAgICAiICAgICAgJGNsYXNzbmFtZSQsIEJ1aWxkZXI+XG4iCi0gICAgICAgICIgICAgaW1wbGVtZW50cyAkY2xhc3NuYW1lJE9yQnVpbGRlciB7XG4iLAotICAgICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0gICAgfQotICB9Ci0gIHByaW50ZXItPkluZGVudCgpOwotCi0gIEdlbmVyYXRlRGVzY3JpcHRvck1ldGhvZHMocHJpbnRlcik7Ci0gIEdlbmVyYXRlQ29tbW9uQnVpbGRlck1ldGhvZHMocHJpbnRlcik7Ci0KLSAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgR2VuZXJhdGVJc0luaXRpYWxpemVkKHByaW50ZXIsIERPTlRfTUVNT0laRSk7Ci0gICAgR2VuZXJhdGVCdWlsZGVyUGFyc2luZ01ldGhvZHMocHJpbnRlcik7Ci0gIH0KLQotICAvLyBJbnRlZ2VycyBmb3IgYml0IGZpZWxkcy4KLSAgaW50IHRvdGFsQml0cyA9IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIHRvdGFsQml0cyArPSBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQotICAgICAgICAuR2V0TnVtQml0c0ZvckJ1aWxkZXIoKTsKLSAgfQotICBpbnQgdG90YWxJbnRzID0gKHRvdGFsQml0cyArIDMxKSAvIDMyOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsSW50czsgaSsrKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoInByaXZhdGUgaW50ICRiaXRfZmllbGRfbmFtZSQ7XG4iLAotICAgICAgImJpdF9maWVsZF9uYW1lIiwgR2V0Qml0RmllbGROYW1lKGkpKTsKLSAgfQotCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KCJcbiIpOwotICAgIFByaW50RmllbGRDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfLT5maWVsZChpKSk7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkKLSAgICAgICAgICAgICAgICAgICAgIC5HZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKHByaW50ZXIpOwotICB9CisgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKIAogICBwcmludGVyLT5QcmludCgKLSAgICAiXG4iCi0gICAgIi8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChidWlsZGVyX3Njb3BlOiRmdWxsX25hbWUkKVxuIiwKLSAgICAiZnVsbF9uYW1lIiwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpKTsKKyAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICJwcm90ZWN0ZWQgQnVpbGRlciBuZXdCdWlsZGVyRm9yVHlwZShcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5CdWlsZGVyUGFyZW50IHBhcmVudCkge1xuIgorICAgICIgIEJ1aWxkZXIgYnVpbGRlciA9IG5ldyBCdWlsZGVyKHBhcmVudCk7XG4iCisgICAgIiAgcmV0dXJuIGJ1aWxkZXI7XG4iCisgICAgIn1cbiIpOwogCi0gIHByaW50ZXItPk91dGRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICBNZXNzYWdlQnVpbGRlckdlbmVyYXRvciBidWlsZGVyR2VuZXJhdG9yKGRlc2NyaXB0b3JfLCBjb250ZXh0Xyk7CisgIGJ1aWxkZXJHZW5lcmF0b3IuR2VuZXJhdGUocHJpbnRlcik7CiB9CiAKLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVEZXNjcmlwdG9yTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OgorR2VuZXJhdGVEZXNjcmlwdG9yTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBpZiAoIWRlc2NyaXB0b3JfLT5vcHRpb25zKCkubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjb20uZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JzLkRlc2NyaXB0b3JcbiIKICAgICAgICIgICAgZ2V0RGVzY3JpcHRvcigpIHtcbiIKICAgICAgICIgIHJldHVybiAkZmlsZWNsYXNzJC5pbnRlcm5hbF8kaWRlbnRpZmllciRfZGVzY3JpcHRvcjtcbiIKICAgICAgICJ9XG4iCi0gICAgICAiXG4iCi0gICAgICAicHJvdGVjdGVkIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5GaWVsZEFjY2Vzc29yVGFibGVcbiIKLSAgICAgICIgICAgaW50ZXJuYWxHZXRGaWVsZEFjY2Vzc29yVGFibGUoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJGZpbGVjbGFzcyQuaW50ZXJuYWxfJGlkZW50aWZpZXIkX2ZpZWxkQWNjZXNzb3JUYWJsZTtcbiIKLSAgICAgICJ9XG4iCiAgICAgICAiXG4iLAotICAgICAgImZpbGVjbGFzcyIsIENsYXNzTmFtZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSwKKyAgICAgICJmaWxlY2xhc3MiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAogICAgICAgImlkZW50aWZpZXIiLCBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKSk7CiAgIH0KKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG1hcF9maWVsZHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICAgIElzTWFwRW50cnkoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgbWFwX2ZpZWxkcy5wdXNoX2JhY2soZmllbGQpOworICAgIH0KKyAgfQorICBpZiAoIW1hcF9maWVsZHMuZW1wdHkoKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgIkBTdXBwcmVzc1dhcm5pbmdzKHtcInJhd3R5cGVzXCJ9KVxuIgorICAgICAgInByb3RlY3RlZCBjb20uZ29vZ2xlLnByb3RvYnVmLk1hcEZpZWxkIGludGVybmFsR2V0TWFwRmllbGQoXG4iCisgICAgICAiICAgIGludCBudW1iZXIpIHtcbiIKKyAgICAgICIgIHN3aXRjaCAobnVtYmVyKSB7XG4iKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1hcF9maWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBtYXBfZmllbGRzW2ldOworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7CisgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImNhc2UgJG51bWJlciQ6XG4iCisgICAgICAgICIgIHJldHVybiBpbnRlcm5hbEdldCRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIiwKKyAgICAgICAgIm51bWJlciIsIFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSwKKyAgICAgICAgImNhcGl0YWxpemVkX25hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJkZWZhdWx0OlxuIgorICAgICAgICAiICB0aHJvdyBuZXcgUnVudGltZUV4Y2VwdGlvbihcbiIKKyAgICAgICAgIiAgICAgIFwiSW52YWxpZCBtYXAgZmllbGQgbnVtYmVyOiBcIiArIG51bWJlcik7XG4iKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICB9XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCgKKyAgICAicHJvdGVjdGVkIGNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5GaWVsZEFjY2Vzc29yVGFibGVcbiIKKyAgICAiICAgIGludGVybmFsR2V0RmllbGRBY2Nlc3NvclRhYmxlKCkge1xuIgorICAgICIgIHJldHVybiAkZmlsZWNsYXNzJC5pbnRlcm5hbF8kaWRlbnRpZmllciRfZmllbGRBY2Nlc3NvclRhYmxlXG4iCisgICAgIiAgICAgIC5lbnN1cmVGaWVsZEFjY2Vzc29yc0luaXRpYWxpemVkKFxuIgorICAgICIgICAgICAgICAgJGNsYXNzbmFtZSQuY2xhc3MsICRjbGFzc25hbWUkLkJ1aWxkZXIuY2xhc3MpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIiwKKyAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXyksCisgICAgImZpbGVjbGFzcyIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgImlkZW50aWZpZXIiLCBVbmlxdWVGaWxlU2NvcGVJZGVudGlmaWVyKGRlc2NyaXB0b3JfKSk7CiB9CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUNvbW1vbkJ1aWxkZXJNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKSB7Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlSXNJbml0aWFsaXplZCgKKyAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgeworICAvLyBNZW1vaXplcyB3aGV0aGVyIHRoZSBwcm90b2NvbCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgKGhhcyBhbGwKKyAgLy8gcmVxdWlyZWQgZmllbGRzKS4gLTEgbWVhbnMgbm90IHlldCBjb21wdXRlZC4gMCBtZWFucyBmYWxzZSBhbmQgMSBtZWFucworICAvLyB0cnVlLgogICBwcmludGVyLT5QcmludCgKLSAgICAiLy8gQ29uc3RydWN0IHVzaW5nICRjbGFzc25hbWUkLm5ld0J1aWxkZXIoKVxuIgotICAgICJwcml2YXRlIEJ1aWxkZXIoKSB7XG4iCi0gICAgIiAgbWF5YmVGb3JjZUJ1aWxkZXJJbml0aWFsaXphdGlvbigpO1xuIgotICAgICJ9XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInByaXZhdGUgQnVpbGRlcihCdWlsZGVyUGFyZW50IHBhcmVudCkge1xuIgotICAgICAgIiAgc3VwZXIocGFyZW50KTtcbiIKLSAgICAgICIgIG1heWJlRm9yY2VCdWlsZGVySW5pdGlhbGl6YXRpb24oKTtcbiIKLSAgICAgICJ9XG4iLAotICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotICB9Ci0KLQotICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAicHJpdmF0ZSB2b2lkIG1heWJlRm9yY2VCdWlsZGVySW5pdGlhbGl6YXRpb24oKSB7XG4iCi0gICAgICAiICBpZiAoY29tLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRNZXNzYWdlLmFsd2F5c1VzZUZpZWxkQnVpbGRlcnMpIHtcbiIpOwotCi0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQotICAgICAgICAgIC5HZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKLSAgICB9Ci0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgIHByaW50ZXItPk91dGRlbnQoKTsKLQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgIiAgfVxuIgotICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInByaXZhdGUgdm9pZCBtYXliZUZvcmNlQnVpbGRlckluaXRpYWxpemF0aW9uKCkge1xuIgotICAgICAgIn1cbiIpOwotICB9Ci0KKyAgICAicHJpdmF0ZSBieXRlIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IC0xO1xuIik7CiAgIHByaW50ZXItPlByaW50KAotICAgICJwcml2YXRlIHN0YXRpYyBCdWlsZGVyIGNyZWF0ZSgpIHtcbiIKLSAgICAiICByZXR1cm4gbmV3IEJ1aWxkZXIoKTtcbiIKLSAgICAifVxuIgotICAgICJcbiIKLSAgICAicHVibGljIEJ1aWxkZXIgY2xlYXIoKSB7XG4iCi0gICAgIiAgc3VwZXIuY2xlYXIoKTtcbiIsCi0gICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotCisgICAgInB1YmxpYyBmaW5hbCBib29sZWFuIGlzSW5pdGlhbGl6ZWQoKSB7XG4iKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKKyAgLy8gRG9uJ3QgZGlyZWN0bHkgY29tcGFyZSB0byAtMSB0byBhdm9pZCBhbiBBbmRyb2lkIHg4NiBKSVQgYnVnLgorICBwcmludGVyLT5QcmludCgKKyAgICAiYnl0ZSBpc0luaXRpYWxpemVkID0gbWVtb2l6ZWRJc0luaXRpYWxpemVkO1xuIgorICAgICJpZiAoaXNJbml0aWFsaXplZCA9PSAxKSByZXR1cm4gdHJ1ZTtcbiIKKyAgICAiaWYgKGlzSW5pdGlhbGl6ZWQgPT0gMCkgcmV0dXJuIGZhbHNlO1xuIgorICAgICJcbiIpOworCisgIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4KKyAgLy8gVE9ETyhrZW50b24pOiAgV2UgY2FuIG9wdGltaXplIHRoaXMgd2hlbiB3ZSBzd2l0Y2ggdG8gcHV0dGluZyBhbGwgdGhlCisgIC8vICAgImhhcyIgZmllbGRzIGludG8gYSBzaW5nbGUgYml0ZmllbGQuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpCi0gICAgICAgIC5HZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUocHJpbnRlcik7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKKworICAgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICJpZiAoIWhhcyRuYW1lJCgpKSB7XG4iCisgICAgICAgICIgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7XG4iCisgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgIn1cbiIsCisgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgfQorICB9CisKKyAgLy8gTm93IGNoZWNrIHRoYXQgYWxsIGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBpbml0aWFsaXplZC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKKyAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8gPSBjb250ZXh0Xy0+R2V0RmllbGRHZW5lcmF0b3JJbmZvKGZpZWxkKTsKKyAgICBpZiAoR2V0SmF2YVR5cGUoZmllbGQpID09IEpBVkFUWVBFX01FU1NBR0UgJiYKKyAgICAgICAgSGFzUmVxdWlyZWRGaWVsZHMoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgc3dpdGNoIChmaWVsZC0+bGFiZWwoKSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVRVUlSRUQ6CisgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAiaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgICAgICAiICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgorICAgICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICJ0eXBlIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKKyAgICAgICAgICAgICAgICBmaWVsZC0+bWVzc2FnZV90eXBlKCkpLAorICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMOgorICAgICAgICAgIGlmICghU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkgJiYKKyAgICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAhPSBOVUxMKSB7CisgICAgICAgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKTsKKyAgICAgICAgICAgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogb25lb2ZfaW5mbyA9CisgICAgICAgICAgICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhvbmVvZik7CisgICAgICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAgICAgImlmICgkb25lb2ZfbmFtZSRDYXNlXyA9PSAkZmllbGRfbnVtYmVyJCkge1xuIiwKKyAgICAgICAgICAgICAgIm9uZW9mX25hbWUiLCBvbmVvZl9pbmZvLT5uYW1lLAorICAgICAgICAgICAgICAiZmllbGRfbnVtYmVyIiwgU2ltcGxlSXRvYShmaWVsZC0+bnVtYmVyKCkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAgICJpZiAoaGFzJG5hbWUkKCkpIHtcbiIsCisgICAgICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgICAgfQorICAgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICAgIiAgaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgICAgICIgICAgbWVtb2l6ZWRJc0luaXRpYWxpemVkID0gMDtcbiIKKyAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgIn1cbiIsCisgICAgICAgICAgICAibmFtZSIsIGluZm8tPmNhcGl0YWxpemVkX25hbWUpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQ6CisgICAgICAgICAgaWYgKElzTWFwRW50cnkoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSkgeworICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAgICJmb3IgKCR0eXBlJCBpdGVtIDogZ2V0JG5hbWUkKCkudmFsdWVzKCkpIHtcbiIKKyAgICAgICAgICAgICAgIiAgaWYgKCFpdGVtLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgorICAgICAgICAgICAgICAiICAgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7XG4iCisgICAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgICAgICAgICAiICB9XG4iCisgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAidHlwZSIsIE1hcFZhbHVlSW1tdXRhYmxlQ2xhc3NkTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfKSwKKyAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAgICAgICAgICJmb3IgKGludCBpID0gMDsgaSA8IGdldCRuYW1lJENvdW50KCk7IGkrKykge1xuIgorICAgICAgICAgICAgICAiICBpZiAoIWdldCRuYW1lJChpKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKKyAgICAgICAgICAgICAgIiAgICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgorICAgICAgICAgICAgICAiICAgIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICAgICAgICAgIiAgfVxuIgorICAgICAgICAgICAgICAifVxuIiwKKyAgICAgICAgICAgICAgInR5cGUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKAorICAgICAgICAgICAgICAgICAgZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSwKKyAgICAgICAgICAgICAgIm5hbWUiLCBpbmZvLT5jYXBpdGFsaXplZF9uYW1lKTsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJpZiAoIWV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpKSB7XG4iCisgICAgICAiICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwO1xuIgorICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgorICAgICAgIn1cbiIpOwogICB9CiAKICAgcHJpbnRlci0+T3V0ZGVudCgpOwogCiAgIHByaW50ZXItPlByaW50KAotICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICIgIG1lbW9pemVkSXNJbml0aWFsaXplZCA9IDE7XG4iKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiICByZXR1cm4gdHJ1ZTtcbiIKICAgICAifVxuIgotICAgICJcbiIKLSAgICAicHVibGljIEJ1aWxkZXIgY2xvbmUoKSB7XG4iCi0gICAgIiAgcmV0dXJuIGNyZWF0ZSgpLm1lcmdlRnJvbShidWlsZFBhcnRpYWwoKSk7XG4iCisgICAgIlxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworbmFtZXNwYWNlIHsKK2Jvb2wgQ2hlY2tIYXNCaXRzRm9yRXF1YWxzQW5kSGFzaENvZGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGZpZWxkLT5maWxlKCkpKSB7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIEdldEphdmFUeXBlKGZpZWxkKSA9PSBKQVZBVFlQRV9NRVNTQUdFICYmCisgICAgICBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEw7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXF1YWxzQW5kSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKKyAgICAicHVibGljIGJvb2xlYW4gZXF1YWxzKGZpbmFsIGphdmEubGFuZy5PYmplY3Qgb2JqKSB7XG4iKTsKKyAgcHJpbnRlci0+SW5kZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJpZiAob2JqID09IHRoaXMpIHtcbiIKKyAgICAiIHJldHVybiB0cnVlO1xuIgogICAgICJ9XG4iCisgICAgImlmICghKG9iaiBpbnN0YW5jZW9mICRjbGFzc25hbWUkKSkge1xuIgorICAgICIgIHJldHVybiBzdXBlci5lcXVhbHMob2JqKTtcbiIKKyAgICAifVxuIgorICAgICIkY2xhc3NuYW1lJCBvdGhlciA9ICgkY2xhc3NuYW1lJCkgb2JqO1xuIgogICAgICJcbiIsCi0gICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotICBpZiAoSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7CisgICAgImNsYXNzbmFtZSIsIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5QcmludCgiYm9vbGVhbiByZXN1bHQgPSB0cnVlO1xuIik7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgPT0gTlVMTCkgeworICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvID0gY29udGV4dF8tPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhmaWVsZCk7CisgICAgICBib29sIGNoZWNrX2hhc19iaXRzID0gQ2hlY2tIYXNCaXRzRm9yRXF1YWxzQW5kSGFzaENvZGUoZmllbGQpOworICAgICAgaWYgKGNoZWNrX2hhc19iaXRzKSB7CisgICAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgKGhhcyRuYW1lJCgpID09IG90aGVyLmhhcyRuYW1lJCgpKTtcbiIKKyAgICAgICAgICAiaWYgKGhhcyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUVxdWFsc0NvZGUocHJpbnRlcik7CisgICAgICBpZiAoY2hlY2tfaGFzX2JpdHMpIHsKKyAgICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAifVxuIik7CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gQ29tcGFyZSBvbmVvZnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAicHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvcnMuRGVzY3JpcHRvclxuIgotICAgICAgIiAgICBnZXREZXNjcmlwdG9yRm9yVHlwZSgpIHtcbiIKLSAgICAgICIgIHJldHVybiAkY2xhc3NuYW1lJC5nZXREZXNjcmlwdG9yKCk7XG4iCi0gICAgICAifVxuIgotICAgICAgIlxuIiwKLSAgICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpLmVxdWFscyhcbiIKKyAgICAgICIgICAgb3RoZXIuZ2V0JG9uZW9mX2NhcGl0YWxpemVkX25hbWUkQ2FzZSgpKTtcbiIsCisgICAgICAib25lb2ZfY2FwaXRhbGl6ZWRfbmFtZSIsCisgICAgICBjb250ZXh0Xy0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKAorICAgICAgICAgIGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpKS0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiaWYgKCFyZXN1bHQpIHJldHVybiBmYWxzZTtcbiIKKyAgICAgICJzd2l0Y2ggKCRvbmVvZl9uYW1lJENhc2VfKSB7XG4iLAorICAgICAgIm9uZW9mX25hbWUiLAorICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbygKKyAgICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKSktPm5hbWUpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiY2FzZSAkZmllbGRfbnVtYmVyJDpcbiIsCisgICAgICAgICJmaWVsZF9udW1iZXIiLAorICAgICAgICBTaW1wbGVJdG9hKGZpZWxkLT5udW1iZXIoKSkpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlRXF1YWxzQ29kZShwcmludGVyKTsKKyAgICAgIHByaW50ZXItPlByaW50KCJicmVhaztcbiIpOworICAgICAgcHJpbnRlci0+T3V0ZGVudCgpOworICAgIH0KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJjYXNlIDA6XG4iCisgICAgICAiZGVmYXVsdDpcbiIpOworICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgifVxuIik7CisgIH0KKworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgIC8vIEFsd2F5cyBjb25zaWRlciB1bmtub3duIGZpZWxkcyBmb3IgZXF1YWxpdHkuIFRoaXMgd2lsbCBzb21ldGltZXMgcmV0dXJuCisgICAgLy8gZmFsc2UgZm9yIG5vbi1jYW5vbmljYWwgb3JkZXJpbmcgd2hlbiBydW5uaW5nIGluIExJVEVfUlVOVElNRSBidXQgaXQncworICAgIC8vIHRoZSBiZXN0IHdlIGNhbiBkby4KKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgdW5rbm93bkZpZWxkcy5lcXVhbHMob3RoZXIudW5rbm93bkZpZWxkcyk7XG4iKTsKKyAgfQorICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJlxuIgorICAgICAgIiAgICBnZXRFeHRlbnNpb25GaWVsZHMoKS5lcXVhbHMob3RoZXIuZ2V0RXh0ZW5zaW9uRmllbGRzKCkpO1xuIik7CiAgIH0KICAgcHJpbnRlci0+UHJpbnQoCi0gICAgInB1YmxpYyAkY2xhc3NuYW1lJCBnZXREZWZhdWx0SW5zdGFuY2VGb3JUeXBlKCkge1xuIgotICAgICIgIHJldHVybiAkY2xhc3NuYW1lJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKKyAgICAicmV0dXJuIHJlc3VsdDtcbiIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAogICAgICJ9XG4iCi0gICAgIlxuIiwKLSAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0KLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAiXG4iKTsKIAogICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljICRjbGFzc25hbWUkIGJ1aWxkKCkge1xuIgotICAgICIgICRjbGFzc25hbWUkIHJlc3VsdCA9IGJ1aWxkUGFydGlhbCgpO1xuIgotICAgICIgIGlmICghcmVzdWx0LmlzSW5pdGlhbGl6ZWQoKSkge1xuIgotICAgICIgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24ocmVzdWx0KTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuIHJlc3VsdDtcbiIKKyAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICJwdWJsaWMgaW50IGhhc2hDb2RlKCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAiaWYgKG1lbW9pemVkSGFzaENvZGUgIT0gMCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAicmV0dXJuIG1lbW9pemVkSGFzaENvZGU7XG4iKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKICAgICAifVxuIgotICAgICJcbiIKLSAgICAicHJpdmF0ZSAkY2xhc3NuYW1lJCBidWlsZFBhcnNlZCgpXG4iCi0gICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIgotICAgICIgICRjbGFzc25hbWUkIHJlc3VsdCA9IGJ1aWxkUGFydGlhbCgpO1xuIgotICAgICIgIGlmICghcmVzdWx0LmlzSW5pdGlhbGl6ZWQoKSkge1xuIgotICAgICIgICAgdGhyb3cgbmV3VW5pbml0aWFsaXplZE1lc3NhZ2VFeGNlcHRpb24oXG4iCi0gICAgIiAgICAgIHJlc3VsdCkuYXNJbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24oKTtcbiIKLSAgICAiICB9XG4iCi0gICAgIiAgcmV0dXJuIHJlc3VsdDtcbiIKLSAgICAifVxuIgotICAgICJcbiIKLSAgICAicHVibGljICRjbGFzc25hbWUkIGJ1aWxkUGFydGlhbCgpIHtcbiIKLSAgICAiICAkY2xhc3NuYW1lJCByZXN1bHQgPSBuZXcgJGNsYXNzbmFtZSQodGhpcyk7XG4iLAotICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICAiaW50IGhhc2ggPSA0MTtcbiIpOwogCisgIHByaW50ZXItPlByaW50KCJoYXNoID0gKDE5ICogaGFzaCkgKyBnZXREZXNjcmlwdG9yRm9yVHlwZSgpLmhhc2hDb2RlKCk7XG4iKTsKKworICAvLyBoYXNoQ29kZSBub24tb25lb2ZzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOworICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwpIHsKKyAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbyA9IGNvbnRleHRfLT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZmllbGQpOworICAgICAgYm9vbCBjaGVja19oYXNfYml0cyA9IENoZWNrSGFzQml0c0ZvckVxdWFsc0FuZEhhc2hDb2RlKGZpZWxkKTsKKyAgICAgIGlmIChjaGVja19oYXNfYml0cykgeworICAgICAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgICAiaWYgKGhhcyRuYW1lJCgpKSB7XG4iLAorICAgICAgICAgICJuYW1lIiwgaW5mby0+Y2FwaXRhbGl6ZWRfbmFtZSk7CisgICAgICAgIHByaW50ZXItPkluZGVudCgpOworICAgICAgfQorICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGZpZWxkKS5HZW5lcmF0ZUhhc2hDb2RlKHByaW50ZXIpOworICAgICAgaWYgKGNoZWNrX2hhc19iaXRzKSB7CisgICAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICAgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIC8vIGhhc2hDb2RlIG9uZW9mcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJzd2l0Y2ggKCRvbmVvZl9uYW1lJENhc2VfKSB7XG4iLAorICAgICAgIm9uZW9mX25hbWUiLAorICAgICAgY29udGV4dF8tPkdldE9uZW9mR2VuZXJhdG9ySW5mbygKKyAgICAgICAgICBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKSktPm5hbWUpOworICAgIHByaW50ZXItPkluZGVudCgpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiY2FzZSAkZmllbGRfbnVtYmVyJDpcbiIsCisgICAgICAgICJmaWVsZF9udW1iZXIiLAorICAgICAgICBTaW1wbGVJdG9hKGZpZWxkLT5udW1iZXIoKSkpOworICAgICAgcHJpbnRlci0+SW5kZW50KCk7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZmllbGQpLkdlbmVyYXRlSGFzaENvZGUocHJpbnRlcik7CisgICAgICBwcmludGVyLT5QcmludCgiYnJlYWs7XG4iKTsKKyAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgICB9CisgICAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiY2FzZSAwOlxuIgorICAgICAgImRlZmF1bHQ6XG4iKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOworICB9CisKKyAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICJoYXNoID0gaGFzaEZpZWxkcyhoYXNoLCBnZXRFeHRlbnNpb25GaWVsZHMoKSk7XG4iKTsKKyAgfQorCisgIHByaW50ZXItPlByaW50KAorICAgICJoYXNoID0gKDI5ICogaGFzaCkgKyB1bmtub3duRmllbGRzLmhhc2hDb2RlKCk7XG4iKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIm1lbW9pemVkSGFzaENvZGUgPSBoYXNoO1xuIgorICAgICJyZXR1cm4gaGFzaDtcbiIpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KAorICAgICJ9XG4iCisgICAgIlxuIik7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgSW1tdXRhYmxlRXh0ZW5zaW9uR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5leHRlbnNpb24oaSksIGNvbnRleHRfKQorICAgICAgLkdlbmVyYXRlUmVnaXN0cmF0aW9uQ29kZShwcmludGVyKTsKKyAgfQorCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlX2NvdW50KCk7IGkrKykgeworICAgIEltbXV0YWJsZU1lc3NhZ2VHZW5lcmF0b3IoZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKGkpLCBjb250ZXh0XykKKyAgICAgIC5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7CisgIH0KK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvbnN0cnVjdG9yKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9hcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IgKiA+IHNvcnRlZF9maWVsZHMoCisgICAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAgICJwcml2YXRlICRjbGFzc25hbWUkKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKLSAgLy8gTG9jYWwgdmFycyBmb3IgZnJvbSBhbmQgdG8gYml0IGZpZWxkcyB0byBhdm9pZCBhY2Nlc3NpbmcgdGhlIGJ1aWxkZXIgYW5kCi0gIC8vIG1lc3NhZ2Ugb3ZlciBhbmQgb3ZlciBmb3IgdGhlc2UgZmllbGRzLiBTZWVtcyB0byBwcm92aWRlIGEgc2xpZ2h0Ci0gIC8vIHBlcmZvcmFtYW5jZSBpbXByb3ZlbWVudCBpbiBtaWNybyBiZW5jaG1hcmsgYW5kIHRoaXMgaXMgYWxzbyB3aGF0IHByb3RvMQotICAvLyBjb2RlIGRvZXMuCisgIC8vIEluaXRpYWxpemUgYWxsIGZpZWxkcyB0byBkZWZhdWx0LgorICBwcmludGVyLT5QcmludCgKKyAgICAgICJ0aGlzKCk7XG4iKTsKKworICAvLyBVc2UgYnVpbGRlciBiaXRzIHRvIHRyYWNrIG11dGFibGUgcmVwZWF0ZWQgZmllbGRzLgogICBpbnQgdG90YWxCdWlsZGVyQml0cyA9IDA7Ci0gIGludCB0b3RhbE1lc3NhZ2VCaXRzID0gMDsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGRHZW5lcmF0b3ImIGZpZWxkID0gZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSk7CisgICAgY29uc3QgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3ImIGZpZWxkID0KKyAgICAgICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSk7CiAgICAgdG90YWxCdWlsZGVyQml0cyArPSBmaWVsZC5HZXROdW1CaXRzRm9yQnVpbGRlcigpOwotICAgIHRvdGFsTWVzc2FnZUJpdHMgKz0gZmllbGQuR2V0TnVtQml0c0Zvck1lc3NhZ2UoKTsKICAgfQogICBpbnQgdG90YWxCdWlsZGVySW50cyA9ICh0b3RhbEJ1aWxkZXJCaXRzICsgMzEpIC8gMzI7Ci0gIGludCB0b3RhbE1lc3NhZ2VJbnRzID0gKHRvdGFsTWVzc2FnZUJpdHMgKyAzMSkgLyAzMjsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbEJ1aWxkZXJJbnRzOyBpKyspIHsKLSAgICBwcmludGVyLT5QcmludCgiaW50IGZyb21fJGJpdF9maWVsZF9uYW1lJCA9ICRiaXRfZmllbGRfbmFtZSQ7XG4iLAotICAgICAgImJpdF9maWVsZF9uYW1lIiwgR2V0Qml0RmllbGROYW1lKGkpKTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IHRvdGFsTWVzc2FnZUludHM7IGkrKykgewotICAgIHByaW50ZXItPlByaW50KCJpbnQgdG9fJGJpdF9maWVsZF9uYW1lJCA9IDA7XG4iLAorICAgIHByaW50ZXItPlByaW50KCJpbnQgbXV0YWJsZV8kYml0X2ZpZWxkX25hbWUkID0gMDtcbiIsCiAgICAgICAiYml0X2ZpZWxkX25hbWUiLCBHZXRCaXRGaWVsZE5hbWUoaSkpOwogICB9CiAKLSAgLy8gT3V0cHV0IGdlbmVyYXRpb24gY29kZSBmb3IgZWFjaCBmaWVsZC4KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgZmllbGRfZ2VuZXJhdG9yc18uZ2V0KGRlc2NyaXB0b3JfLT5maWVsZChpKSkuR2VuZXJhdGVCdWlsZGluZ0NvZGUocHJpbnRlcik7Ci0gIH0KLQotICAvLyBDb3B5IHRoZSBiaXQgZmllbGQgcmVzdWx0cyB0byB0aGUgZ2VuZXJhdGVkIG1lc3NhZ2UKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0b3RhbE1lc3NhZ2VJbnRzOyBpKyspIHsKLSAgICBwcmludGVyLT5QcmludCgicmVzdWx0LiRiaXRfZmllbGRfbmFtZSQgPSB0b18kYml0X2ZpZWxkX25hbWUkO1xuIiwKLSAgICAgICJiaXRfZmllbGRfbmFtZSIsIEdldEJpdEZpZWxkTmFtZShpKSk7Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICIgIG9uQnVpbHQoKTtcbiIpOwotICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgcmV0dXJuIHJlc3VsdDtcbiIKLSAgICAifVxuIgotICAgICJcbiIsCi0gICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotCi0gIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0KLSAgaWYgKEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8pKSB7Ci0gICAgLy8gTWVyZ2VGcm9tKE1lc3NhZ2Ugb3RoZXIpIHJlcXVpcmVzIHRoZSBhYmlsaXR5IHRvIGRpc3Rpbmd1aXNoIHRoZSBvdGhlcgotICAgIC8vIG1lc3NhZ2VzIHR5cGUgYnkgaXRzIGRlc2NyaXB0b3IuCi0gICAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJwdWJsaWMgQnVpbGRlciBtZXJnZUZyb20oY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIG90aGVyKSB7XG4iCi0gICAgICAgICIgIGlmIChvdGhlciBpbnN0YW5jZW9mICRjbGFzc25hbWUkKSB7XG4iCi0gICAgICAgICIgICAgcmV0dXJuIG1lcmdlRnJvbSgoJGNsYXNzbmFtZSQpb3RoZXIpO1xuIgotICAgICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgICAiICAgIHN1cGVyLm1lcmdlRnJvbShvdGhlcik7XG4iCi0gICAgICAgICIgICAgcmV0dXJuIHRoaXM7XG4iCi0gICAgICAgICIgIH1cbiIKLSAgICAgICAgIn1cbiIKLSAgICAgICAgIlxuIiwKLSAgICAgICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotICAgIH0KLQotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInB1YmxpYyBCdWlsZGVyIG1lcmdlRnJvbSgkY2xhc3NuYW1lJCBvdGhlcikge1xuIgotICAgICAgLy8gT3B0aW1pemF0aW9uOiAgSWYgb3RoZXIgaXMgdGhlIGRlZmF1bHQgaW5zdGFuY2UsIHdlIGtub3cgbm9uZSBvZiBpdHMKLSAgICAgIC8vICAgZmllbGRzIGFyZSBzZXQgc28gd2UgY2FuIHNraXAgdGhlIG1lcmdlLgotICAgICAgIiAgaWYgKG90aGVyID09ICRjbGFzc25hbWUkLmdldERlZmF1bHRJbnN0YW5jZSgpKSByZXR1cm4gdGhpcztcbiIsCi0gICAgICAiY2xhc3NuYW1lIiwgQ2xhc3NOYW1lKGRlc2NyaXB0b3JfKSk7Ci0gICAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChkZXNjcmlwdG9yXy0+ZmllbGQoaSkpLkdlbmVyYXRlTWVyZ2luZ0NvZGUocHJpbnRlcik7Ci0gICAgfQotCi0gICAgcHJpbnRlci0+T3V0ZGVudCgpOwotCi0gICAgLy8gaWYgbWVzc2FnZSB0eXBlIGhhcyBleHRlbnNpb25zCi0gICAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiICB0aGlzLm1lcmdlRXh0ZW5zaW9uRmllbGRzKG90aGVyKTtcbiIpOwotICAgIH0KLQotICAgIGlmIChIYXNVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICIgIHRoaXMubWVyZ2VVbmtub3duRmllbGRzKG90aGVyLmdldFVua25vd25GaWVsZHMoKSk7XG4iKTsKLSAgICB9Ci0KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICAgIn1cbiIKLSAgICAgICJcbiIpOwotICB9Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUJ1aWxkZXJQYXJzaW5nTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBzY29wZWRfYXJyYXk8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gc29ydGVkX2ZpZWxkcygKLSAgICBTb3J0RmllbGRzQnlOdW1iZXIoZGVzY3JpcHRvcl8pKTsKLQotICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIEJ1aWxkZXIgbWVyZ2VGcm9tKFxuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZElucHV0U3RyZWFtIGlucHV0LFxuIgotICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5FeHRlbnNpb25SZWdpc3RyeUxpdGUgZXh0ZW5zaW9uUmVnaXN0cnkpXG4iCi0gICAgIiAgICB0aHJvd3MgamF2YS5pby5JT0V4Y2VwdGlvbiB7XG4iKTsKLSAgcHJpbnRlci0+SW5kZW50KCk7Ci0KLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgIGlmIChQcmVzZXJ2ZVVua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CiAgICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5Vbmtub3duRmllbGRTZXQuQnVpbGRlciB1bmtub3duRmllbGRzID1cbiIKLSAgICAgICIgIGNvbS5nb29nbGUucHJvdG9idWYuVW5rbm93bkZpZWxkU2V0Lm5ld0J1aWxkZXIoXG4iCi0gICAgICAiICAgIHRoaXMuZ2V0VW5rbm93bkZpZWxkcygpKTtcbiIpOworICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLlVua25vd25GaWVsZFNldC5uZXdCdWlsZGVyKCk7XG4iKTsKICAgfQogCiAgIHByaW50ZXItPlByaW50KAotICAgICJ3aGlsZSAodHJ1ZSkge1xuIik7CisgICAgICAidHJ5IHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBwcmludGVyLT5QcmludCgKKyAgICAiYm9vbGVhbiBkb25lID0gZmFsc2U7XG4iCisgICAgIndoaWxlICghZG9uZSkge1xuIik7CiAgIHByaW50ZXItPkluZGVudCgpOwogCiAgIHByaW50ZXItPlByaW50KApAQCAtOTk1LDM1ICsxMjA2LDI5IEBACiAgICAgInN3aXRjaCAodGFnKSB7XG4iKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAKLSAgaWYgKEhhc1Vua25vd25GaWVsZHMoZGVzY3JpcHRvcl8pKSB7CisgIHByaW50ZXItPlByaW50KAorICAgICJjYXNlIDA6XG4iICAgICAgICAgIC8vIHplcm8gc2lnbmFscyBFT0YgLyBsaW1pdCByZWFjaGVkCisgICAgIiAgZG9uZSA9IHRydWU7XG4iCisgICAgIiAgYnJlYWs7XG4iKTsKKworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgewogICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNhc2UgMDpcbiIgICAgICAgICAgLy8gemVybyBzaWduYWxzIEVPRiAvIGxpbWl0IHJlYWNoZWQKLSAgICAgICIgIHRoaXMuc2V0VW5rbm93bkZpZWxkcyh1bmtub3duRmllbGRzLmJ1aWxkKCkpO1xuIgotICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgICAiICByZXR1cm4gdGhpcztcbiIKICAgICAgICJkZWZhdWx0OiB7XG4iCiAgICAgICAiICBpZiAoIXBhcnNlVW5rbm93bkZpZWxkKGlucHV0LCB1bmtub3duRmllbGRzLFxuIgogICAgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25SZWdpc3RyeSwgdGFnKSkge1xuIgotICAgICAgIiAgICB0aGlzLnNldFVua25vd25GaWVsZHModW5rbm93bkZpZWxkcy5idWlsZCgpKTtcbiIKLSAgICAgICIgICAgJG9uX2NoYW5nZWQkXG4iCi0gICAgICAiICAgIHJldHVybiB0aGlzO1xuIiAgIC8vIGl0J3MgYW4gZW5kZ3JvdXAgdGFnCisgICAgICAiICAgIGRvbmUgPSB0cnVlO1xuIiAgLy8gaXQncyBhbiBlbmRncm91cCB0YWcKICAgICAgICIgIH1cbiIKICAgICAgICIgIGJyZWFrO1xuIgotICAgICAgIn1cbiIsCi0gICAgICAib25fY2hhbmdlZCIsIEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSA/ICJvbkNoYW5nZWQoKTsiIDogIiIpOworICAgICAgIn1cbiIpOwogICB9IGVsc2UgewogICAgIHByaW50ZXItPlByaW50KAotICAgICAgImNhc2UgMDpcbiIgICAgICAgICAgLy8gemVybyBzaWduYWxzIEVPRiAvIGxpbWl0IHJlYWNoZWQKLSAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgotICAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCiAgICAgICAiZGVmYXVsdDoge1xuIgotICAgICAgIiAgaWYgKCFwYXJzZVVua25vd25GaWVsZChpbnB1dCwgZXh0ZW5zaW9uUmVnaXN0cnksIHRhZykpIHtcbiIKLSAgICAgICIgICAgJG9uX2NoYW5nZWQkXG4iCi0gICAgICAiICAgIHJldHVybiB0aGlzO1xuIiAgIC8vIGl0J3MgYW4gZW5kZ3JvdXAgdGFnCi0gICAgICAiICB9XG4iCisgICAgICAiICBpZiAoIWlucHV0LnNraXBGaWVsZCh0YWcpKSB7XG4iCisgICAgICAiICAgIGRvbmUgPSB0cnVlO1xuIiAgLy8gaXQncyBhbiBlbmRncm91cCB0YWcKKyAgICAgICIgIH1cbiIpOworICAgIHByaW50ZXItPlByaW50KAogICAgICAgIiAgYnJlYWs7XG4iCi0gICAgICAifVxuIiwKLSAgICAgICJvbl9jaGFuZ2VkIiwgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvcl8pID8gIm9uQ2hhbmdlZCgpOyIgOiAiIik7CisgICAgICAifVxuIik7CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKQEAgLTEwNjQsMjIxICsxMjY5LDE3OSBAQAogCiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgKKyAgICAgICIgIH1cbiIgICAgIC8vIHN3aXRjaCAodGFnKQorICAgICAgIn1cbiIpOyAgICAgLy8gd2hpbGUgKCFkb25lKQorCiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgIiAgICB9XG4iICAgICAvLyBzd2l0Y2ggKHRhZykKLSAgICAiICB9XG4iICAgICAgIC8vIHdoaWxlICh0cnVlKQotICAgICJ9XG4iCisgICAgICAifSBjYXRjaCAoY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24gZSkge1xuIgorICAgICAgIiAgdGhyb3cgZS5zZXRVbmZpbmlzaGVkTWVzc2FnZSh0aGlzKTtcbiIKKyAgICAgICJ9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHtcbiIKKyAgICAgICIgIHRocm93IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihcbiIKKyAgICAgICIgICAgICBlKS5zZXRVbmZpbmlzaGVkTWVzc2FnZSh0aGlzKTtcbiIKKyAgICAgICJ9IGZpbmFsbHkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOwogCi0gICAgIlxuIik7CisgIC8vIE1ha2UgcmVwZWF0ZWQgZmllbGQgbGlzdCBpbW11dGFibGUuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBzb3J0ZWRfZmllbGRzW2ldOworICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUocHJpbnRlcik7CisgIH0KKworICBpZiAoUHJlc2VydmVVbmtub3duRmllbGRzKGRlc2NyaXB0b3JfKSkgeworICAgIC8vIE1ha2UgdW5rbm93biBmaWVsZHMgaW1tdXRhYmxlLgorICAgIHByaW50ZXItPlByaW50KCJ0aGlzLnVua25vd25GaWVsZHMgPSB1bmtub3duRmllbGRzLmJ1aWxkKCk7XG4iKTsKKyAgfQorCisgIC8vIE1ha2UgZXh0ZW5zaW9ucyBpbW11dGFibGUuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIm1ha2VFeHRlbnNpb25zSW1tdXRhYmxlKCk7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiICB9XG4iICAgICAvLyBmaW5hbGx5CisgICAgICAifVxuIik7CiB9CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQotdm9pZCBNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoCi0gICAgaW86OlByaW50ZXIqIHByaW50ZXIsIFVzZU1lbW9pemF0aW9uIHVzZU1lbW9pemF0aW9uKSB7Ci0gIGJvb2wgbWVtb2l6YXRpb24gPSB1c2VNZW1vaXphdGlvbiA9PSBNRU1PSVpFOwotICBpZiAobWVtb2l6YXRpb24pIHsKLSAgICAvLyBNZW1vaXplcyB3aGV0aGVyIHRoZSBwcm90b2NvbCBidWZmZXIgaXMgZnVsbHkgaW5pdGlhbGl6ZWQgKGhhcyBhbGwKLSAgICAvLyByZXF1aXJlZCBmaWVsZHMpLiAtMSBtZWFucyBub3QgeWV0IGNvbXB1dGVkLiAwIG1lYW5zIGZhbHNlIGFuZCAxIG1lYW5zCi0gICAgLy8gdHJ1ZS4KLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJwcml2YXRlIGJ5dGUgbWVtb2l6ZWRJc0luaXRpYWxpemVkID0gLTE7XG4iKTsKLSAgfQordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZVBhcnNlcihpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBwcmludGVyLT5QcmludCgKLSAgICAicHVibGljIGZpbmFsIGJvb2xlYW4gaXNJbml0aWFsaXplZCgpIHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLQotICBpZiAobWVtb2l6YXRpb24pIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJieXRlIGlzSW5pdGlhbGl6ZWQgPSBtZW1vaXplZElzSW5pdGlhbGl6ZWQ7XG4iCi0gICAgICAiaWYgKGlzSW5pdGlhbGl6ZWQgIT0gLTEpIHJldHVybiBpc0luaXRpYWxpemVkID09IDE7XG4iCi0gICAgICAiXG4iKTsKLSAgfQotCi0gIC8vIENoZWNrIHRoYXQgYWxsIHJlcXVpcmVkIGZpZWxkcyBpbiB0aGlzIG1lc3NhZ2UgYXJlIHNldC4KLSAgLy8gVE9ETyhrZW50b24pOiAgV2UgY2FuIG9wdGltaXplIHRoaXMgd2hlbiB3ZSBzd2l0Y2ggdG8gcHV0dGluZyBhbGwgdGhlCi0gIC8vICAgImhhcyIgZmllbGRzIGludG8gYSBzaW5nbGUgYml0ZmllbGQuCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBkZXNjcmlwdG9yXy0+ZmllbGQoaSk7Ci0KLSAgICBpZiAoZmllbGQtPmlzX3JlcXVpcmVkKCkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaWYgKCFoYXMkbmFtZSQoKSkge1xuIgotICAgICAgICAiICAkbWVtb2l6ZSRcbiIKLSAgICAgICAgIiAgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgICAifVxuIiwKLSAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpLAotICAgICAgICAibWVtb2l6ZSIsIG1lbW9pemF0aW9uID8gIm1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7IiA6ICIiKTsKLSAgICB9Ci0gIH0KLQotICAvLyBOb3cgY2hlY2sgdGhhdCBhbGwgZW1iZWRkZWQgbWVzc2FnZXMgYXJlIGluaXRpYWxpemVkLgotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgIGlmIChHZXRKYXZhVHlwZShmaWVsZCkgPT0gSkFWQVRZUEVfTUVTU0FHRSAmJgotICAgICAgICBIYXNSZXF1aXJlZEZpZWxkcyhmaWVsZC0+bWVzc2FnZV90eXBlKCkpKSB7Ci0gICAgICBzd2l0Y2ggKGZpZWxkLT5sYWJlbCgpKSB7Ci0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVFVSVJFRDoKLSAgICAgICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgICAgICJpZiAoIWdldCRuYW1lJCgpLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgotICAgICAgICAgICAgICIgICRtZW1vaXplJFxuIgotICAgICAgICAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgICAgICAifVxuIiwKLSAgICAgICAgICAgICJ0eXBlIiwgQ2xhc3NOYW1lKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSksCi0gICAgICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShmaWVsZCksCi0gICAgICAgICAgICAibWVtb2l6ZSIsIG1lbW9pemF0aW9uID8gIm1lbW9pemVkSXNJbml0aWFsaXplZCA9IDA7IiA6ICIiKTsKLSAgICAgICAgICBicmVhazsKLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMOgotICAgICAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAgICAgImlmIChoYXMkbmFtZSQoKSkge1xuIgotICAgICAgICAgICAgIiAgaWYgKCFnZXQkbmFtZSQoKS5pc0luaXRpYWxpemVkKCkpIHtcbiIKLSAgICAgICAgICAgICIgICAgJG1lbW9pemUkXG4iCi0gICAgICAgICAgICAiICAgIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICAgICAgICIgIH1cbiIKLSAgICAgICAgICAgICJ9XG4iLAotICAgICAgICAgICAgInR5cGUiLCBDbGFzc05hbWUoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSwKLSAgICAgICAgICAgICJuYW1lIiwgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGZpZWxkKSwKLSAgICAgICAgICAgICJtZW1vaXplIiwgbWVtb2l6YXRpb24gPyAibWVtb2l6ZWRJc0luaXRpYWxpemVkID0gMDsiIDogIiIpOwotICAgICAgICAgIGJyZWFrOwotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQ6Ci0gICAgICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCBnZXQkbmFtZSRDb3VudCgpOyBpKyspIHtcbiIKLSAgICAgICAgICAgICIgIGlmICghZ2V0JG5hbWUkKGkpLmlzSW5pdGlhbGl6ZWQoKSkge1xuIgotICAgICAgICAgICAgIiAgICAkbWVtb2l6ZSRcbiIKLSAgICAgICAgICAgICIgICAgcmV0dXJuIGZhbHNlO1xuIgotICAgICAgICAgICAgIiAgfVxuIgotICAgICAgICAgICAgIn1cbiIsCi0gICAgICAgICAgICAidHlwZSIsIENsYXNzTmFtZShmaWVsZC0+bWVzc2FnZV90eXBlKCkpLAotICAgICAgICAgICAgIm5hbWUiLCBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZmllbGQpLAotICAgICAgICAgICAgIm1lbW9pemUiLCBtZW1vaXphdGlvbiA/ICJtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwOyIgOiAiIik7Ci0gICAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0gICAgfQotICB9Ci0KLSAgaWYgKGRlc2NyaXB0b3JfLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKSA+IDApIHsKLSAgICBwcmludGVyLT5QcmludCgKLSAgICAgICJpZiAoIWV4dGVuc2lvbnNBcmVJbml0aWFsaXplZCgpKSB7XG4iCi0gICAgICAiICAkbWVtb2l6ZSRcbiIKLSAgICAgICIgIHJldHVybiBmYWxzZTtcbiIKLSAgICAgICJ9XG4iLAotICAgICAgIm1lbW9pemUiLCBtZW1vaXphdGlvbiA/ICJtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAwOyIgOiAiIik7Ci0gIH0KLQotICBwcmludGVyLT5PdXRkZW50KCk7Ci0KLSAgaWYgKG1lbW9pemF0aW9uKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAiICBtZW1vaXplZElzSW5pdGlhbGl6ZWQgPSAxO1xuIik7Ci0gIH0KLQotICBwcmludGVyLT5QcmludCgKLSAgICAiICByZXR1cm4gdHJ1ZTtcbiIKLSAgICAifVxuIgotICAgICJcbiIpOwotfQotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLXZvaWQgTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVFcXVhbHNBbmRIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBwcmludGVyLT5QcmludCgKLSAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgotICAgICJwdWJsaWMgYm9vbGVhbiBlcXVhbHMoZmluYWwgamF2YS5sYW5nLk9iamVjdCBvYmopIHtcbiIpOworICAgICAgIiR2aXNpYmlsaXR5JCBzdGF0aWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5QYXJzZXI8JGNsYXNzbmFtZSQ+XG4iCisgICAgICAiICAgIFBBUlNFUiA9IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkFic3RyYWN0UGFyc2VyPCRjbGFzc25hbWUkPigpIHtcbiIsCisgICAgICAidmlzaWJpbGl0eSIsCisgICAgICBFeHBvc2VQdWJsaWNQYXJzZXIoZGVzY3JpcHRvcl8tPmZpbGUoKSkgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkIHB1YmxpYyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6ICJwcml2YXRlIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKICAgcHJpbnRlci0+SW5kZW50KCk7CiAgIHByaW50ZXItPlByaW50KAotICAgICJpZiAob2JqID09IHRoaXMpIHtcbiIKLSAgICAiIHJldHVybiB0cnVlO1xuIgotICAgICJ9XG4iCi0gICAgImlmICghKG9iaiBpbnN0YW5jZW9mICRjbGFzc25hbWUkKSkge1xuIgotICAgICIgIHJldHVybiBzdXBlci5lcXVhbHMob2JqKTtcbiIKLSAgICAifVxuIgotICAgICIkY2xhc3NuYW1lJCBvdGhlciA9ICgkY2xhc3NuYW1lJCkgb2JqO1xuIgotICAgICJcbiIsCi0gICAgImNsYXNzbmFtZSIsIENsYXNzTmFtZShkZXNjcmlwdG9yXykpOwotCi0gIHByaW50ZXItPlByaW50KCJib29sZWFuIHJlc3VsdCA9IHRydWU7XG4iKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKLSAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiAoaGFzJG5hbWUkKCkgPT0gb3RoZXIuaGFzJG5hbWUkKCkpO1xuIgotICAgICAgICAiaWYgKGhhcyRuYW1lJCgpKSB7XG4iLAotICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShmaWVsZCkpOwotICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgfQotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVFcXVhbHNDb2RlKHByaW50ZXIpOwotICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgIHByaW50ZXItPlByaW50KAorICAgICAgInB1YmxpYyAkY2xhc3NuYW1lJCBwYXJzZVBhcnRpYWxGcm9tKFxuIgorICAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQsXG4iCisgICAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuRXh0ZW5zaW9uUmVnaXN0cnlMaXRlIGV4dGVuc2lvblJlZ2lzdHJ5KVxuIgorICAgICAgIiAgICB0aHJvd3MgY29tLmdvb2dsZS5wcm90b2J1Zi5JbnZhbGlkUHJvdG9jb2xCdWZmZXJFeGNlcHRpb24ge1xuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgaWYgKGNvbnRleHRfLT5IYXNHZW5lcmF0ZWRNZXRob2RzKGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KAorICAgICAgICAiICAgIHJldHVybiBuZXcgJGNsYXNzbmFtZSQoaW5wdXQsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIsCisgICAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBXaGVuIHBhcnNpbmcgY29uc3RydWN0b3IgaXNuJ3QgZ2VuZXJhdGVkLCB1c2UgYnVpbGRlciB0byBwYXJzZQorICAgIC8vIG1lc3NhZ2VzLiBOb3RlLCB3aWxsIGZhbGxiYWNrIHRvIHVzZSByZWZsZWN0aW9uIGJhc2VkIG1lcmdlRmllbGRGcm9tKCkKKyAgICAvLyBpbiBBYnN0cmFjdE1lc3NhZ2UuQnVpbGRlci4KKyAgICBwcmludGVyLT5JbmRlbnQoKTsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgIkJ1aWxkZXIgYnVpbGRlciA9IG5ld0J1aWxkZXIoKTtcbiIKKyAgICAgICAgInRyeSB7XG4iCisgICAgICAgICIgIGJ1aWxkZXIubWVyZ2VGcm9tKGlucHV0LCBleHRlbnNpb25SZWdpc3RyeSk7XG4iCisgICAgICAgICJ9IGNhdGNoIChjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiBlKSB7XG4iCisgICAgICAgICIgIHRocm93IGUuc2V0VW5maW5pc2hlZE1lc3NhZ2UoYnVpbGRlci5idWlsZFBhcnRpYWwoKSk7XG4iCisgICAgICAgICJ9IGNhdGNoIChqYXZhLmlvLklPRXhjZXB0aW9uIGUpIHtcbiIKKyAgICAgICAgIiAgdGhyb3cgbmV3IGNvbS5nb29nbGUucHJvdG9idWYuSW52YWxpZFByb3RvY29sQnVmZmVyRXhjZXB0aW9uKFxuIgorICAgICAgICAiICAgICAgZS5nZXRNZXNzYWdlKCkpLnNldFVuZmluaXNoZWRNZXNzYWdlKFxuIgorICAgICAgICAiICAgICAgICAgIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpO1xuIgorICAgICAgICAifVxuIgorICAgICAgICAicmV0dXJuIGJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7XG4iKTsKKyAgICBwcmludGVyLT5PdXRkZW50KCk7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAgICJ9XG4iKTsKLSAgICB9Ci0gIH0KLSAgaWYgKEhhc0Rlc2NyaXB0b3JNZXRob2RzKGRlc2NyaXB0b3JfKSkgewotICAgIHByaW50ZXItPlByaW50KAotICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJlxuIgotICAgICAgIiAgICBnZXRVbmtub3duRmllbGRzKCkuZXF1YWxzKG90aGVyLmdldFVua25vd25GaWVsZHMoKSk7XG4iKTsKLSAgICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJyZXN1bHQgPSByZXN1bHQgJiZcbiIKLSAgICAgICAgIiAgICBnZXRFeHRlbnNpb25GaWVsZHMoKS5lcXVhbHMob3RoZXIuZ2V0RXh0ZW5zaW9uRmllbGRzKCkpO1xuIik7Ci0gICAgfQotICB9Ci0gIHByaW50ZXItPlByaW50KAotICAgICJyZXR1cm4gcmVzdWx0O1xuIik7CiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgIn1cbiIKLSAgICAiXG4iKTsKKyAgICAgICJ9O1xuIgorICAgICAgIlxuIik7CiAKICAgcHJpbnRlci0+UHJpbnQoCi0gICAgIkBqYXZhLmxhbmcuT3ZlcnJpZGVcbiIKLSAgICAicHVibGljIGludCBoYXNoQ29kZSgpIHtcbiIpOwotICBwcmludGVyLT5JbmRlbnQoKTsKLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImludCBoYXNoID0gNDE7XG4iCi0gICAgImhhc2ggPSAoMTkgKiBoYXNoKSArIGdldERlc2NyaXB0b3JGb3JUeXBlKCkuaGFzaENvZGUoKTtcbiIpOwotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIHByaW50ZXItPlByaW50KAotICAgICAgICAiaWYgKGhhcyRuYW1lJCgpKSB7XG4iLAotICAgICAgICAibmFtZSIsIFVuZGVyc2NvcmVzVG9DYXBpdGFsaXplZENhbWVsQ2FzZShmaWVsZCkpOwotICAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgfQotICAgIGZpZWxkX2dlbmVyYXRvcnNfLmdldChmaWVsZCkuR2VuZXJhdGVIYXNoQ29kZShwcmludGVyKTsKLSAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgICBwcmludGVyLT5QcmludCgifVxuIik7Ci0gICAgfQotICB9Ci0gIGlmIChIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yXykpIHsKLSAgICBpZiAoZGVzY3JpcHRvcl8tPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgewotICAgICAgcHJpbnRlci0+UHJpbnQoCi0gICAgICAgICJoYXNoID0gaGFzaEZpZWxkcyhoYXNoLCBnZXRFeHRlbnNpb25GaWVsZHMoKSk7XG4iKTsKLSAgICB9Ci0gIH0KLSAgcHJpbnRlci0+UHJpbnQoCi0gICAgImhhc2ggPSAoMjkgKiBoYXNoKSArIGdldFVua25vd25GaWVsZHMoKS5oYXNoQ29kZSgpO1xuIgotICAgICJyZXR1cm4gaGFzaDtcbiIpOwotICBwcmludGVyLT5PdXRkZW50KCk7Ci0gIHByaW50ZXItPlByaW50KAotICAgICJ9XG4iCi0gICAgIlxuIik7CisgICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gcGFyc2VyKCkge1xuIgorICAgICAgIiAgcmV0dXJuIFBBUlNFUjtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiQGphdmEubGFuZy5PdmVycmlkZVxuIgorICAgICAgInB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLlBhcnNlcjwkY2xhc3NuYW1lJD4gZ2V0UGFyc2VyRm9yVHlwZSgpIHtcbiIKKyAgICAgICIgIHJldHVybiBQQVJTRVI7XG4iCisgICAgICAifVxuIgorICAgICAgIlxuIiwKKyAgICAgICJjbGFzc25hbWUiLCBkZXNjcmlwdG9yXy0+bmFtZSgpKTsKIH0KIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi12b2lkIE1lc3NhZ2VHZW5lcmF0b3I6OkdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7Ci0gICAgRXh0ZW5zaW9uR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5leHRlbnNpb24oaSkpCi0gICAgICAuR2VuZXJhdGVSZWdpc3RyYXRpb25Db2RlKHByaW50ZXIpOwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUluaXRpYWxpemVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgeworICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAoIWRlc2NyaXB0b3JfLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBmaWVsZF9nZW5lcmF0b3JzXy5nZXQoZGVzY3JpcHRvcl8tPmZpZWxkKGkpKQorICAgICAgICAgIC5HZW5lcmF0ZUluaXRpYWxpemF0aW9uQ29kZShwcmludGVyKTsKKyAgICB9CiAgIH0KK30KIAotICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBNZXNzYWdlR2VuZXJhdG9yKGRlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZShpKSkKLSAgICAgIC5HZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUocHJpbnRlcik7Ci0gIH0KKwordm9pZCBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yOjpHZW5lcmF0ZUFueU1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKKyAgcHJpbnRlci0+UHJpbnQoCisgICAgInByaXZhdGUgc3RhdGljIFN0cmluZyBnZXRUeXBlVXJsKFxuIgorICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB0eXBlVXJsUHJlZml4LFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5EZXNjcmlwdG9yIGRlc2NyaXB0b3IpIHtcbiIKKyAgICAiICByZXR1cm4gdHlwZVVybFByZWZpeC5lbmRzV2l0aChcIi9cIilcbiIKKyAgICAiICAgICAgPyB0eXBlVXJsUHJlZml4ICsgZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpXG4iCisgICAgIiAgICAgIDogdHlwZVVybFByZWZpeCArIFwiL1wiICsgZGVzY3JpcHRvci5nZXRGdWxsTmFtZSgpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJwcml2YXRlIHN0YXRpYyBTdHJpbmcgZ2V0VHlwZU5hbWVGcm9tVHlwZVVybChcbiIKKyAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgdHlwZVVybCkge1xuIgorICAgICIgIGludCBwb3MgPSB0eXBlVXJsLmxhc3RJbmRleE9mKCcvJyk7XG4iCisgICAgIiAgcmV0dXJuIHBvcyA9PSAtMSA/IFwiXCIgOiB0eXBlVXJsLnN1YnN0cmluZyhwb3MgKyAxKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAicHVibGljIHN0YXRpYyA8VCBleHRlbmRzIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZT4gQW55IHBhY2soXG4iCisgICAgIiAgICBUIG1lc3NhZ2UpIHtcbiIKKyAgICAiICByZXR1cm4gQW55Lm5ld0J1aWxkZXIoKVxuIgorICAgICIgICAgICAuc2V0VHlwZVVybChnZXRUeXBlVXJsKFwidHlwZS5nb29nbGVhcGlzLmNvbVwiLFxuIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2UuZ2V0RGVzY3JpcHRvckZvclR5cGUoKSkpXG4iCisgICAgIiAgICAgIC5zZXRWYWx1ZShtZXNzYWdlLnRvQnl0ZVN0cmluZygpKVxuIgorICAgICIgICAgICAuYnVpbGQoKTtcbiIKKyAgICAifVxuIgorICAgICJcbiIKKyAgICAiLyoqXG4iCisgICAgIiAqIFBhY2tzIGEgbWVzc2FnZSB1aXNuZyB0aGUgZ2l2ZW4gdHlwZSBVUkwgcHJlZml4LiBUaGUgdHlwZSBVUkwgd2lsbFxuIgorICAgICIgKiBiZSBjb25zdHJ1Y3RlZCBieSBjb25jYXRlbmF0aW5nIHRoZSBtZXNzYWdlIHR5cGUncyBmdWxsIG5hbWUgdG8gdGhlXG4iCisgICAgIiAqIHByZWZpeCB3aXRoIGFuIG9wdGlvbmFsIFwiL1wiIHNlcGFyYXRvciBpZiB0aGUgcHJlZml4IGRvZXNuJ3QgZW5kXG4iCisgICAgIiAqIHdpdGggXCIvXCIgYWxyZWFkeS5cbiIKKyAgICAiICovXG4iCisgICAgInB1YmxpYyBzdGF0aWMgPFQgZXh0ZW5kcyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2U+IEFueSBwYWNrKFxuIgorICAgICIgICAgVCBtZXNzYWdlLCBqYXZhLmxhbmcuU3RyaW5nIHR5cGVVcmxQcmVmaXgpIHtcbiIKKyAgICAiICByZXR1cm4gQW55Lm5ld0J1aWxkZXIoKVxuIgorICAgICIgICAgICAuc2V0VHlwZVVybChnZXRUeXBlVXJsKHR5cGVVcmxQcmVmaXgsXG4iCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS5nZXREZXNjcmlwdG9yRm9yVHlwZSgpKSlcbiIKKyAgICAiICAgICAgLnNldFZhbHVlKG1lc3NhZ2UudG9CeXRlU3RyaW5nKCkpXG4iCisgICAgIiAgICAgIC5idWlsZCgpO1xuIgorICAgICJ9XG4iCisgICAgIlxuIgorICAgICJwdWJsaWMgPFQgZXh0ZW5kcyBjb20uZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2U+IGJvb2xlYW4gaXMoXG4iCisgICAgIiAgICBqYXZhLmxhbmcuQ2xhc3M8VD4gY2xhenopIHtcbiIKKyAgICAiICBUIGRlZmF1bHRJbnN0YW5jZSA9XG4iCisgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuZ2V0RGVmYXVsdEluc3RhbmNlKGNsYXp6KTtcbiIKKyAgICAiICByZXR1cm4gZ2V0VHlwZU5hbWVGcm9tVHlwZVVybChnZXRUeXBlVXJsKCkpLmVxdWFscyhcbiIKKyAgICAiICAgICAgZGVmYXVsdEluc3RhbmNlLmdldERlc2NyaXB0b3JGb3JUeXBlKCkuZ2V0RnVsbE5hbWUoKSk7XG4iCisgICAgIn1cbiIKKyAgICAiXG4iCisgICAgInByaXZhdGUgdm9sYXRpbGUgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlIGNhY2hlZFVucGFja1ZhbHVlO1xuIgorICAgICJcbiIKKyAgICAicHVibGljIDxUIGV4dGVuZHMgY29tLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlPiBUIHVucGFjayhcbiIKKyAgICAiICAgIGphdmEubGFuZy5DbGFzczxUPiBjbGF6eilcbiIKKyAgICAiICAgIHRocm93cyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbiB7XG4iCisgICAgIiAgaWYgKCFpcyhjbGF6eikpIHtcbiIKKyAgICAiICAgIHRocm93IG5ldyBjb20uZ29vZ2xlLnByb3RvYnVmLkludmFsaWRQcm90b2NvbEJ1ZmZlckV4Y2VwdGlvbihcbiIKKyAgICAiICAgICAgICBcIlR5cGUgb2YgdGhlIEFueSBtZXNzYWdlIGRvZXMgbm90IG1hdGNoIHRoZSBnaXZlbiBjbGFzcy5cIik7XG4iCisgICAgIiAgfVxuIgorICAgICIgIGlmIChjYWNoZWRVbnBhY2tWYWx1ZSAhPSBudWxsKSB7XG4iCisgICAgIiAgICByZXR1cm4gKFQpIGNhY2hlZFVucGFja1ZhbHVlO1xuIgorICAgICIgIH1cbiIKKyAgICAiICBUIGRlZmF1bHRJbnN0YW5jZSA9XG4iCisgICAgIiAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuSW50ZXJuYWwuZ2V0RGVmYXVsdEluc3RhbmNlKGNsYXp6KTtcbiIKKyAgICAiICBUIHJlc3VsdCA9IChUKSBkZWZhdWx0SW5zdGFuY2UuZ2V0UGFyc2VyRm9yVHlwZSgpXG4iCisgICAgIiAgICAgIC5wYXJzZUZyb20oZ2V0VmFsdWUoKSk7XG4iCisgICAgIiAgY2FjaGVkVW5wYWNrVmFsdWUgPSByZXN1bHQ7XG4iCisgICAgIiAgcmV0dXJuIHJlc3VsdDtcbiIKKyAgICAifVxuIik7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2UuaAppbmRleCA0YzZmYmJlLi5lOWZjNTdjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM2LDExICszNiwxNyBAQAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NUElMRVJfSkFWQV9NRVNTQUdFX0hfXwogCiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9maWVsZC5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgbmFtZXNwYWNlIGphdmEgeworICAgICAgY2xhc3MgQ29udGV4dDsgICAgICAgICAgIC8vIGNvbnRleHQuaAorICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7IC8vIG5hbWVfcmVzb2x2ZXIuaAorICAgIH0KKyAgfQogICBuYW1lc3BhY2UgaW8gewogICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAogICB9CkBAIC01MCwzNSArNTYsNjEgQEAKIG5hbWVzcGFjZSBjb21waWxlciB7CiBuYW1lc3BhY2UgamF2YSB7CiAKK3N0YXRpYyBjb25zdCBpbnQga01heFN0YXRpY1NpemUgPSAxIDw8IDE1OyAgLy8gYWthIDMyaworCiBjbGFzcyBNZXNzYWdlR2VuZXJhdG9yIHsKICBwdWJsaWM6CiAgIGV4cGxpY2l0IE1lc3NhZ2VHZW5lcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcik7Ci0gIH5NZXNzYWdlR2VuZXJhdG9yKCk7CisgIHZpcnR1YWwgfk1lc3NhZ2VHZW5lcmF0b3IoKTsKIAogICAvLyBBbGwgc3RhdGljIHZhcmlhYmxlcyBoYXZlIHRvIGJlIGRlY2xhcmVkIGF0IHRoZSB0b3AtbGV2ZWwgb2YgdGhlIGZpbGUKICAgLy8gc28gdGhhdCB3ZSBjYW4gY29udHJvbCBpbml0aWFsaXphdGlvbiBvcmRlciwgd2hpY2ggaXMgaW1wb3J0YW50IGZvcgogICAvLyBEZXNjcmlwdG9yUHJvdG8gYm9vdHN0cmFwcGluZyB0byB3b3JrLgotICB2b2lkIEdlbmVyYXRlU3RhdGljVmFyaWFibGVzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlU3RhdGljVmFyaWFibGVzKAorICAgICAgaW86OlByaW50ZXIqIHByaW50ZXIsIGludCogYnl0ZWNvZGVfZXN0aW1hdGUpID0gMDsKIAogICAvLyBPdXRwdXQgY29kZSB3aGljaCBpbml0aWFsaXplcyB0aGUgc3RhdGljIHZhcmlhYmxlcyBnZW5lcmF0ZWQgYnkKLSAgLy8gR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoKS4KLSAgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgLy8gR2VuZXJhdGVTdGF0aWNWYXJpYWJsZXMoKS4gUmV0dXJucyBhbiBlc3RpbWF0ZSBvZiBieXRlY29kZSBzaXplLgorICB2aXJ0dWFsIGludCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlSW5pdGlhbGl6ZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSA9IDA7CiAKICAgLy8gR2VuZXJhdGUgdGhlIGNsYXNzIGl0c2VsZi4KLSAgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgPSAwOwogCiAgIC8vIEdlbmVyYXRlcyB0aGUgYmFzZSBpbnRlcmZhY2UgdGhhdCBib3RoIHRoZSBjbGFzcyBhbmQgaXRzIGJ1aWxkZXIgaW1wbGVtZW50Ci0gIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2UoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKIAogICAvLyBHZW5lcmF0ZSBjb2RlIHRvIHJlZ2lzdGVyIGFsbCBjb250YWluZWQgZXh0ZW5zaW9ucyB3aXRoIGFuCiAgIC8vIEV4dGVuc2lvblJlZ2lzdHJ5LgotICB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZUV4dGVuc2lvblJlZ2lzdHJhdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKworIHByb3RlY3RlZDoKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CiAKICBwcml2YXRlOgotICBlbnVtIFVzZU1lbW9pemF0aW9uIHsKLSAgICBNRU1PSVpFLAotICAgIERPTlRfTUVNT0laRQotICB9OworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUdlbmVyYXRvcik7Cit9OworCitjbGFzcyBJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yIDogcHVibGljIE1lc3NhZ2VHZW5lcmF0b3IgeworIHB1YmxpYzoKKyAgZXhwbGljaXQgSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB2aXJ0dWFsIH5JbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yKCk7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlSW50ZXJmYWNlKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlRXh0ZW5zaW9uUmVnaXN0cmF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZpcnR1YWwgdm9pZCBHZW5lcmF0ZVN0YXRpY1ZhcmlhYmxlcygKKyAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBpbnQqIGJ5dGVjb2RlX2VzdGltYXRlKTsKKworICAvLyBSZXR1cm5zIGFuIGVzdGltYXRlIG9mIHRoZSBudW1iZXIgb2YgYnl0ZXMgdGhlIHByaW50ZWQgY29kZSB3aWxsIGNvbXBpbGUgdG8KKyAgdmlydHVhbCBpbnQgR2VuZXJhdGVTdGF0aWNWYXJpYWJsZUluaXRpYWxpemVycyhpbzo6UHJpbnRlciogcHJpbnRlcik7CisKKyBwcml2YXRlOgorCisgIHZvaWQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGUoaW86OlByaW50ZXIqIHByaW50ZXIsIGludCogYnl0ZWNvZGVfZXN0aW1hdGUpOworCisgIC8vIFJldHVybnMgYW4gZXN0aW1hdGUgb2YgdGhlIG51bWJlciBvZiBieXRlcyB0aGUgcHJpbnRlZCBjb2RlIHdpbGwgY29tcGlsZSB0bworICBpbnQgR2VuZXJhdGVGaWVsZEFjY2Vzc29yVGFibGVJbml0aWFsaXplcihpbzo6UHJpbnRlciogcHJpbnRlcik7CiAKICAgdm9pZCBHZW5lcmF0ZU1lc3NhZ2VTZXJpYWxpemF0aW9uTWV0aG9kcyhpbzo6UHJpbnRlciogcHJpbnRlcik7CiAgIHZvaWQgR2VuZXJhdGVQYXJzZUZyb21NZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKQEAgLTg4LDE3ICsxMjAsMTkgQEAKICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyLCBjb25zdCBEZXNjcmlwdG9yOjpFeHRlbnNpb25SYW5nZSogcmFuZ2UpOwogCiAgIHZvaWQgR2VuZXJhdGVCdWlsZGVyKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZUNvbW1vbkJ1aWxkZXJNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIpOwogICB2b2lkIEdlbmVyYXRlRGVzY3JpcHRvck1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpOwotICB2b2lkIEdlbmVyYXRlQnVpbGRlclBhcnNpbmdNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKLSAgdm9pZCBHZW5lcmF0ZUlzSW5pdGlhbGl6ZWQoaW86OlByaW50ZXIqIHByaW50ZXIsCi0gICAgICBVc2VNZW1vaXphdGlvbiB1c2VNZW1vaXphdGlvbik7CisgIHZvaWQgR2VuZXJhdGVJbml0aWFsaXplcnMoaW86OlByaW50ZXIqIHByaW50ZXIpOwogICB2b2lkIEdlbmVyYXRlRXF1YWxzQW5kSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2b2lkIEdlbmVyYXRlUGFyc2VyKGlvOjpQcmludGVyKiBwcmludGVyKTsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb25zdHJ1Y3Rvcihpbzo6UHJpbnRlciogcHJpbnRlcik7CisgIHZvaWQgR2VuZXJhdGVBbnlNZXRob2RzKGlvOjpQcmludGVyKiBwcmludGVyKTsKIAotICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLSAgRmllbGRHZW5lcmF0b3JNYXAgZmllbGRfZ2VuZXJhdG9yc187CisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisgIEZpZWxkR2VuZXJhdG9yTWFwPEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yPiBmaWVsZF9nZW5lcmF0b3JzXzsKIAotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUdlbmVyYXRvcik7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVNZXNzYWdlR2VuZXJhdG9yKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXIuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfYnVpbGRlci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2J1aWxkZXJfbGl0ZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9idWlsZGVyX2xpdGUuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYwppbmRleCAyNTE5NDVhLi40NTU1MTZmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsOCArMzUsMTEgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KQEAgLTQ4LDE5ICs1MSwxOCBAQAogCiBuYW1lc3BhY2UgewogCi0vLyBUT0RPKGtlbnRvbik6ICBGYWN0b3Igb3V0IGEgIlNldENvbW1vbkZpZWxkVmFyaWFibGVzKCkiIHRvIGdldCByaWQgb2YKLS8vICAgcmVwZWF0IGNvZGUgYmV0d2VlbiB0aGlzIGFuZCB0aGUgb3RoZXIgZmllbGQgdHlwZXMuCiB2b2lkIFNldE1lc3NhZ2VWYXJpYWJsZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZEdlbmVyYXRvckluZm8qIGluZm8sCisgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7Ci0gICgqdmFyaWFibGVzKVsibmFtZSJdID0KLSAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9Ci0gICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7Ci0gICgqdmFyaWFibGVzKVsidHlwZSJdID0gQ2xhc3NOYW1lKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKKworICAoKnZhcmlhYmxlcylbInR5cGUiXSA9CisgICAgICBuYW1lX3Jlc29sdmVyLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOworICAoKnZhcmlhYmxlcylbIm11dGFibGVfdHlwZSJdID0KKyAgICAgIG5hbWVfcmVzb2x2ZXItPkdldE11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpOwogICAoKnZhcmlhYmxlcylbImdyb3VwX29yX21lc3NhZ2UiXSA9CiAgICAgKEdldFR5cGUoZGVzY3JpcHRvcikgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSA/CiAgICAgIkdyb3VwIiA6ICJNZXNzYWdlIjsKQEAgLTY4LDIyICs3MCw0MyBAQAogICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKICAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQogICAgICAgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKLSAgKCp2YXJpYWJsZXMpWyJvbl9jaGFuZ2VkIl0gPQotICAgICAgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkpID8gIm9uQ2hhbmdlZCgpOyIgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJvbl9jaGFuZ2VkIl0gPSAib25DaGFuZ2VkKCk7IjsKIAotICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCi0gICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3ItPmZpbGUoKSkpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKIAotICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7Ci0gICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9Ci0gICAgICBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KKyAgICAgICAgR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKKyAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KKyAgICAgICAgR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpICsgIjsiOworCisgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisgIH0gZWxzZSB7CisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSAiIjsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSAiIjsKKworICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAoKnZhcmlhYmxlcylbIm5hbWUiXSArICJfICE9IG51bGwiOworICB9CiAKICAgLy8gRm9yIHJlcGF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgogICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwogICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOwogICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKIAorICAvLyBGb3IgcmVwZWF0ZWQgZmllbGRzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZQorICAvLyBpbiB0aGUgcGFyc2luZyBjb25zdHJ1Y3Rvci4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKwogICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CiAgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOwogICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQpAQCAtOTQsODEgKzExNywxMTEgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1NZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotTWVzc2FnZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKK0ltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCkKKyAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCiAgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKLSAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgewotICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZXNfKTsKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCksIGNvbnRleHRfKGNvbnRleHQpLAorICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CisgICAgU2V0TWVzc2FnZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7CiB9CiAKLU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6fk1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CitJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6On5JbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQogCi1pbnQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKK2ludCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgewogICByZXR1cm4gMTsKIH0KIAotaW50IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CitpbnQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKICAgcmV0dXJuIDE7CiB9CiAKLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICAvLyBUT0RPKGpvbnApOiBJbiB0aGUgZnV0dXJlLCBjb25zaWRlciBoYXZpbmcgYSBtZXRob2Qgc3BlY2lmaWMgdG8gdGhlCiAgIC8vIGludGVyZmFjZSBzbyB0aGF0IGJ1aWxkZXJzIGNhbiBjaG9vc2UgZHluYW1pY2FsbHkgdG8gZWl0aGVyIHJldHVybiBhCiAgIC8vIG1lc3NhZ2Ugb3IgYSBuZXN0ZWQgYnVpbGRlciwgc28gdGhhdCBhc2tpbmcgZm9yIHRoZSBpbnRlcmZhY2UgZG9lc24ndAogICAvLyBjYXVzZSBhIG1lc3NhZ2UgdG8gZXZlciBiZSBidWlsdC4KKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpIHx8CisgICAgICBkZXNjcmlwdG9yXy0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICB9CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCiAgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKIAotICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKTtcbiIpOwotICB9CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKTtcbiIpOwogfQogCi12b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSAkdHlwZSQgJG5hbWUkXztcbiIKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkO1xuIgotICAgICJ9XG4iCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIik7CisgICAgInByaXZhdGUgJHR5cGUkICRuYW1lJF87XG4iKTsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKIAotICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXyA9PSBudWxsID8gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iKTsKKworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyICIKKyAgICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXyA9PSBudWxsID8gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRuYW1lJF8gIT0gbnVsbDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkXyA9PSBudWxsID8gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogJG5hbWUkXztcbiIKKyAgICAgICJ9XG4iKTsKKworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyICIKKyAgICAgICJnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCisgICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCiAgICAgICAifVxuIik7CiAgIH0KIH0KIAotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbigKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oCiAgICAgaW86OlByaW50ZXIqIHByaW50ZXIsCiAgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLAogICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0IHsKLSAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKLSAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgImlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iKTsKLSAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7Ci0gICAgIHByaW50ZXItPk91dGRlbnQoKTsKLSAgICAgcHJpbnRlci0+UHJpbnQoIn0gZWxzZSB7XG4iKTsKLSAgICAgcHJpbnRlci0+SW5kZW50KCk7Ci0gICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIG5lc3RlZF9idWlsZGVyX2Nhc2UpOwotICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKLSAgIH0gZWxzZSB7Ci0gICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sIHJlZ3VsYXJfY2FzZSk7Ci0gICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCByZWd1bGFyX2Nhc2UpOworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9IGVsc2Uge1xuIik7CisgIHByaW50ZXItPkluZGVudCgpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBuZXN0ZWRfYnVpbGRlcl9jYXNlKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifVxuIik7CiB9CiAKLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKICAgICBpbzo6UHJpbnRlciogcHJpbnRlciwKICAgICBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLAogICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKQEAgLTE4NSw0NSArMjM4LDUxIEBACiAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKIH0KIAotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICAvLyBXaGVuIHVzaW5nIG5lc3RlZC1idWlsZGVycywgdGhlIGNvZGUgaW5pdGlhbGx5IHdvcmtzIGp1c3QgbGlrZSB0aGUKICAgLy8gbm9uLW5lc3RlZCBidWlsZGVyIGNhc2UuIEl0IG9ubHkgY3JlYXRlcyBhIG5lc3RlZCBidWlsZGVyIGxhemlseSBvbgogICAvLyBkZW1hbmQgYW5kIHRoZW4gZm9yZXZlciBkZWxlZ2F0ZXMgdG8gaXQgYWZ0ZXIgY3JlYXRpb24uCiAKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAvLyBVc2VkIHdoZW4gdGhlIGJ1aWxkZXIgaXMgbnVsbC4KLSAgICAicHJpdmF0ZSAkdHlwZSQgJG5hbWUkXyA9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIpOworICBib29sIHN1cHBvcnRfZmllbGRfcHJlc2VuY2UgPSBTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKTsKIAotICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInByaXZhdGUgJHR5cGUkICRuYW1lJF8gPSBudWxsO1xuIik7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgIC8vIElmIHRoaXMgYnVpbGRlciBpcyBub24tbnVsbCwgaXQgaXMgdXNlZCBhbmQgdGhlIG90aGVyIGZpZWxkcyBhcmUKICAgICAgIC8vIGlnbm9yZWQuCiAgICAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlNpbmdsZUZpZWxkQnVpbGRlcjxcbiIKICAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXzsiCiAgICAgICAiXG4iKTsKLSAgfQogCiAgIC8vIFRoZSBjb21tZW50cyBhYm92ZSB0aGUgbWV0aG9kcyBiZWxvdyBhcmUgYmFzZWQgb24gYSBoeXBvdGhldGljYWwKICAgLy8gZmllbGQgb2YgdHlwZSAiRmllbGQiIGNhbGxlZCAiRmllbGQiLgogCiAgIC8vIGJvb2xlYW4gaGFzRmllbGQoKQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIGlmIChzdXBwb3J0X2ZpZWxkX3ByZXNlbmNlKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCB8fCAkbmFtZSRfICE9IG51bGw7XG4iCisgICAgICAifVxuIik7CisgIH0KIAogICAvLyBGaWVsZCBnZXRGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkiLAotCi0gICAgInJldHVybiAkbmFtZSRfO1xuIiwKLQorICAgICJyZXR1cm4gJG5hbWUkXyA9PSBudWxsID8gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpIDogJG5hbWUkXztcbiIsCiAgICAgInJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlKCk7XG4iLAotCiAgICAgTlVMTCk7CiAKICAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZCB2YWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkiLAogCkBAIC0yMzUsMTAgKzI5NCwxMSBAQAogCiAgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UodmFsdWUpO1xuIiwKIAotICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgogICAgICJyZXR1cm4gdGhpcztcbiIpOwogCiAgIC8vIEZpZWxkLkJ1aWxkZXIgc2V0RmllbGQoRmllbGQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKICAgICAiICAgICR0eXBlJC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkiLApAQCAtMjQ4LDkxICszMDgsMTE3IEBACiAKICAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZShidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAogCi0gICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCiAgICAgInJldHVybiB0aGlzO1xuIik7CiAKICAgLy8gRmllbGQuQnVpbGRlciBtZXJnZUZpZWxkKEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBtZXJnZSRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIiwKIAotICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkICYmXG4iCi0gICAgIiAgICAkbmFtZSRfICE9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSkge1xuIgotICAgICIgICRuYW1lJF8gPVxuIgotICAgICIgICAgJHR5cGUkLm5ld0J1aWxkZXIoJG5hbWUkXykubWVyZ2VGcm9tKHZhbHVlKS5idWlsZFBhcnRpYWwoKTtcbiIKLSAgICAifSBlbHNlIHtcbiIKLSAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCi0gICAgIn1cbiIKLSAgICAiJG9uX2NoYW5nZWQkXG4iLAorICAgIHN1cHBvcnRfZmllbGRfcHJlc2VuY2UKKyAgICAgICAgPyAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJCAmJlxuIgorICAgICAgICAgICIgICAgJG5hbWUkXyAhPSBudWxsICYmXG4iCisgICAgICAgICAgIiAgICAkbmFtZSRfICE9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSkge1xuIgorICAgICAgICAgICIgICRuYW1lJF8gPVxuIgorICAgICAgICAgICIgICAgJHR5cGUkLm5ld0J1aWxkZXIoJG5hbWUkXykubWVyZ2VGcm9tKHZhbHVlKS5idWlsZFBhcnRpYWwoKTtcbiIKKyAgICAgICAgICAifSBlbHNlIHtcbiIKKyAgICAgICAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCisgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAiJG9uX2NoYW5nZWQkXG4iCisgICAgICAgIDogImlmICgkbmFtZSRfICE9IG51bGwpIHtcbiIKKyAgICAgICAgICAiICAkbmFtZSRfID1cbiIKKyAgICAgICAgICAiICAgICR0eXBlJC5uZXdCdWlsZGVyKCRuYW1lJF8pLm1lcmdlRnJvbSh2YWx1ZSkuYnVpbGRQYXJ0aWFsKCk7XG4iCisgICAgICAgICAgIn0gZWxzZSB7XG4iCisgICAgICAgICAgIiAgJG5hbWUkXyA9IHZhbHVlO1xuIgorICAgICAgICAgICJ9XG4iCisgICAgICAgICAgIiRvbl9jaGFuZ2VkJFxuIiwKIAogICAgICIkbmFtZSRCdWlsZGVyXy5tZXJnZUZyb20odmFsdWUpO1xuIiwKIAotICAgICIkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgogICAgICJyZXR1cm4gdGhpcztcbiIpOwogCiAgIC8vIEZpZWxkLkJ1aWxkZXIgY2xlYXJGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGNsZWFyJGNhcGl0YWxpemVkX25hbWUkKCkiLAogCi0gICAgIiRuYW1lJF8gPSAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iCisgICAgIiRuYW1lJF8gPSBudWxsO1xuIgogICAgICIkb25fY2hhbmdlZCRcbiIsCiAKLSAgICAiJG5hbWUkQnVpbGRlcl8uY2xlYXIoKTtcbiIsCisgICAgc3VwcG9ydF9maWVsZF9wcmVzZW5jZQorICAgICAgICA/ICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIgorICAgICAgICA6ICIkbmFtZSRfID0gbnVsbDtcbiIKKyAgICAgICAgICAiJG5hbWUkQnVpbGRlcl8gPSBudWxsO1xuIiwKIAotICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKICAgICAicmV0dXJuIHRoaXM7XG4iKTsKIAotICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkLkJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlcigpIHtcbiIKKyAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKKyAgICAiICAkb25fY2hhbmdlZCRcbiIKKyAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcigpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCisgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfICE9IG51bGwpIHtcbiIKKyAgICAiICAgIHJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlT3JCdWlsZGVyKCk7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIHJldHVybiAkbmFtZSRfID09IG51bGwgP1xuIgorICAgICIgICAgICAgICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKSA6ICRuYW1lJF87XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgorICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgorICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXI8XG4iCisgICAgIiAgICAgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPihcbiIKKyAgICAiICAgICAgICAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCksXG4iCisgICAgIiAgICAgICAgICAgIGdldFBhcmVudEZvckNoaWxkcmVuKCksXG4iCisgICAgIiAgICAgICAgICAgIGlzQ2xlYW4oKSk7XG4iCisgICAgIiAgICAkbmFtZSRfID0gbnVsbDtcbiIKKyAgICAiICB9XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKCkge1xuIgotICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgotICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCi0gICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcigpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoKSB7XG4iCi0gICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCkge1xuIgotICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlcigpO1xuIgotICAgICAgIiAgfSBlbHNlIHtcbiIKLSAgICAgICIgICAgcmV0dXJuICRuYW1lJF87XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAifVxuIgotICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5TaW5nbGVGaWVsZEJ1aWxkZXI8XG4iCi0gICAgICAiICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4gXG4iCi0gICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKLSAgICAgICIgIGlmICgkbmFtZSRCdWlsZGVyXyA9PSBudWxsKSB7XG4iCi0gICAgICAiICAgICRuYW1lJEJ1aWxkZXJfID0gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgotICAgICAgIiAgICAgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPihcbiIKLSAgICAgICIgICAgICAgICAgICAkbmFtZSRfLFxuIgotICAgICAgIiAgICAgICAgICAgIGdldFBhcmVudEZvckNoaWxkcmVuKCksXG4iCi0gICAgICAiICAgICAgICAgICAgaXNDbGVhbigpKTtcbiIKLSAgICAgICIgICAgJG5hbWUkXyA9IG51bGw7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl87XG4iCi0gICAgICAifVxuIik7CisgICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCk7XG4iKTsKICAgfQogfQogCi12b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Ci1HZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCk7XG4iKTsKLX0KIAordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHt9CiAKLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIik7Ci19Ci0KLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKLSAgICAiJG5hbWUkXyA9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIsCisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAorICAgICAgIiRuYW1lJF8gPSBudWxsO1xuIiwKIAotICAgICIkbmFtZSRCdWlsZGVyXy5jbGVhcigpO1xuIik7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworICAgICAgIiRuYW1lJEJ1aWxkZXJfLmNsZWFyKCk7XG4iKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOworICB9IGVsc2UgeworICAgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAorICAgICAgIiRuYW1lJF8gPSBudWxsO1xuIiwKKworICAgICAgIiRuYW1lJF8gPSBudWxsO1xuIgorICAgICAgIiRuYW1lJEJ1aWxkZXJfID0gbnVsbDtcbiIpOworICB9CiB9CiAKLXZvaWQgTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiaWYgKG90aGVyLmhhcyRjYXBpdGFsaXplZF9uYW1lJCgpKSB7XG4iCkBAIC0zNDAsMTMgKzQyNiwxNCBAQAogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLQotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCQpIHtcbiIKLSAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCQ7XG4iCi0gICAgICAifVxuIik7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCisgICAgICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF90b19sb2NhbCQ7XG4iCisgICAgICAgICJ9XG4iKTsKKyAgfQogCiAgIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihwcmludGVyLAogICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iLApAQCAtMzU0LDEyMCArNDQxLDQxNSBAQAogICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJEJ1aWxkZXJfLmJ1aWxkKCk7XG4iKTsKIH0KIAotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkdHlwZSQuQnVpbGRlciBzdWJCdWlsZGVyID0gJHR5cGUkLm5ld0J1aWxkZXIoKTtcbiIKLSAgICAiaWYgKGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpKSB7XG4iCi0gICAgIiAgc3ViQnVpbGRlci5tZXJnZUZyb20oZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgorICAgICIkdHlwZSQuQnVpbGRlciBzdWJCdWlsZGVyID0gbnVsbDtcbiIKKyAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCisgICAgIiAgc3ViQnVpbGRlciA9ICRuYW1lJF8udG9CdWlsZGVyKCk7XG4iCiAgICAgIn1cbiIpOwogCiAgIGlmIChHZXRUeXBlKGRlc2NyaXB0b3JfKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlucHV0LnJlYWRHcm91cCgkbnVtYmVyJCwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7CisgICAgICAiJG5hbWUkXyA9IGlucHV0LnJlYWRHcm91cCgkbnVtYmVyJCwgJHR5cGUkLnBhcnNlcigpLFxuIgorICAgICAgIiAgICBleHRlbnNpb25SZWdpc3RyeSk7XG4iKTsKICAgfSBlbHNlIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIpOworICAgICAgIiRuYW1lJF8gPSBpbnB1dC5yZWFkTWVzc2FnZSgkdHlwZSQucGFyc2VyKCksIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIpOwogICB9CiAKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAic2V0JGNhcGl0YWxpemVkX25hbWUkKHN1YkJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpO1xuIik7CisgICAgImlmIChzdWJCdWlsZGVyICE9IG51bGwpIHtcbiIKKyAgICAiICBzdWJCdWlsZGVyLm1lcmdlRnJvbSgkbmFtZSRfKTtcbiIKKyAgICAiICAkbmFtZSRfID0gc3ViQnVpbGRlci5idWlsZFBhcnRpYWwoKTtcbiIKKyAgICAifVxuIgorICAgICIkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIpOwogfQogCi12b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBub29wIGZvciBtZXNzYWdlcy4KK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkKSB7XG4iCi0gICAgIiAgb3V0cHV0LndyaXRlJGdyb3VwX29yX21lc3NhZ2UkKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKKyAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCisgICAgIiAgb3V0cHV0LndyaXRlJGdyb3VwX29yX21lc3NhZ2UkKCRudW1iZXIkLCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCiAgICAgIn1cbiIpOwogfQogCi12b2lkIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkKSB7XG4iCisgICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgogICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgotICAgICIgICAgLmNvbXB1dGUkZ3JvdXBfb3JfbWVzc2FnZSRTaXplKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKKyAgICAiICAgIC5jb21wdXRlJGdyb3VwX29yX21lc3NhZ2UkU2l6ZSgkbnVtYmVyJCwgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKVxuIgogICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iKTsKIH0KIAotdm9pZCBNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iCiAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmhhc2hDb2RlKCk7XG4iKTsKIH0KIAotc3RyaW5nIE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgewotICByZXR1cm4gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSk7CitzdHJpbmcgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CisgIHJldHVybiBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSk7CiB9CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgotUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKLSAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgewotICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZXNfKTsKK0ltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0ltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKKyAgICAgICAgICBkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwgY29udGV4dCkgeworICBjb25zdCBPbmVvZkdlbmVyYXRvckluZm8qIGluZm8gPQorICAgICAgY29udGV4dC0+R2V0T25lb2ZHZW5lcmF0b3JJbmZvKGRlc2NyaXB0b3ItPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgIFNldENvbW1vbk9uZW9mVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sICZ2YXJpYWJsZXNfKTsKIH0KIAotUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpIHt9CitJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6Cit+SW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQogCi1pbnQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Qgewordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAifVxuIik7CisgIH0KKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICIgICAgIHJldHVybiAoJHR5cGUkKSAkb25lb2ZfbmFtZSRfO1xuIgorICAgICIgIH1cbiIKKyAgICAiICByZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIgorICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkT3JCdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlcigpIHtcbiIKKyAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgICAgcmV0dXJuICgkdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCisgIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KKyAgLy8gZGVtYW5kIGFuZCB0aGVuIGZvcmV2ZXIgZGVsZWdhdGVzIHRvIGl0IGFmdGVyIGNyZWF0aW9uLgorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgIC8vIElmIHRoaXMgYnVpbGRlciBpcyBub24tbnVsbCwgaXQgaXMgdXNlZCBhbmQgdGhlIG90aGVyIGZpZWxkcyBhcmUKKyAgICAvLyBpZ25vcmVkLgorICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgorICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXzsiCisgICAgIlxuIik7CisKKyAgLy8gVGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBtZXRob2RzIGJlbG93IGFyZSBiYXNlZCBvbiBhIGh5cG90aGV0aWNhbAorICAvLyBmaWVsZCBvZiB0eXBlICJGaWVsZCIgY2FsbGVkICJGaWVsZCIuCisKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gYm9vbGVhbiBoYXNGaWVsZCgpCisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAifVxuIik7CisgIH0KKworICAvLyBGaWVsZCBnZXRGaWVsZCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkiLAorCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICByZXR1cm4gKCR0eXBlJCkgJG9uZW9mX25hbWUkXztcbiIKKyAgICAifVxuIgorICAgICJyZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIiwKKworICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2UoKTtcbiIKKyAgICAifVxuIgorICAgICJyZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIiwKKworICAgIE5VTEwpOworCisgIC8vIEZpZWxkLkJ1aWxkZXIgc2V0RmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIiwKKworICAgICJpZiAodmFsdWUgPT0gbnVsbCkge1xuIgorICAgICIgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgorICAgICJ9XG4iCisgICAgIiRvbmVvZl9uYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iLAorCisgICAgIiRuYW1lJEJ1aWxkZXJfLnNldE1lc3NhZ2UodmFsdWUpO1xuIiwKKworICAgICIkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgLy8gRmllbGQuQnVpbGRlciBzZXRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgorICAgICIgICAgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCisKKyAgICAiJG9uZW9mX25hbWUkXyA9IGJ1aWxkZXJGb3JWYWx1ZS5idWlsZCgpO1xuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZShidWlsZGVyRm9yVmFsdWUuYnVpbGQoKSk7XG4iLAorCisgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIG1lcmdlRmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIG1lcmdlJGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkiLAorCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQgJiZcbiIKKyAgICAiICAgICRvbmVvZl9uYW1lJF8gIT0gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpKSB7XG4iCisgICAgIiAgJG9uZW9mX25hbWUkXyA9ICR0eXBlJC5uZXdCdWlsZGVyKCgkdHlwZSQpICRvbmVvZl9uYW1lJF8pXG4iCisgICAgIiAgICAgIC5tZXJnZUZyb20odmFsdWUpLmJ1aWxkUGFydGlhbCgpO1xuIgorICAgICJ9IGVsc2Uge1xuIgorICAgICIgICRvbmVvZl9uYW1lJF8gPSB2YWx1ZTtcbiIKKyAgICAifVxuIgorICAgICIkb25fY2hhbmdlZCRcbiIsCisKKyAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICIgICRuYW1lJEJ1aWxkZXJfLm1lcmdlRnJvbSh2YWx1ZSk7XG4iCisgICAgIn1cbiIKKyAgICAiJG5hbWUkQnVpbGRlcl8uc2V0TWVzc2FnZSh2YWx1ZSk7XG4iLAorCisgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAicmV0dXJuIHRoaXM7XG4iKTsKKworICAvLyBGaWVsZC5CdWlsZGVyIGNsZWFyRmllbGQoKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIiwKKworICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgIiAgJG9uZW9mX25hbWUkXyA9IG51bGw7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIn1cbiIsCisKKyAgICAiaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICIgICRjbGVhcl9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICIgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICJ9XG4iCisgICAgIiRuYW1lJEJ1aWxkZXJfLmNsZWFyKCk7XG4iLAorCisgICAgInJldHVybiB0aGlzO1xuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJC5CdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXIoKSB7XG4iCisgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmdldEJ1aWxkZXIoKTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKCkge1xuIgorICAgICIgIGlmICgoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSAmJiAoJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCkpIHtcbiIKKyAgICAiICAgIHJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlT3JCdWlsZGVyKCk7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgICAgcmV0dXJuICgkdHlwZSQpICRvbmVvZl9uYW1lJF87XG4iCisgICAgIiAgICB9XG4iCisgICAgIiAgICByZXR1cm4gJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlNpbmdsZUZpZWxkQnVpbGRlcjxcbiIKKyAgICAiICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4gXG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKSB7XG4iCisgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIKKyAgICAiICAgIGlmICghKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkpIHtcbiIKKyAgICAiICAgICAgJG9uZW9mX25hbWUkXyA9ICR0eXBlJC5nZXREZWZhdWx0SW5zdGFuY2UoKTtcbiIKKyAgICAiICAgIH1cbiIKKyAgICAiICAgICRuYW1lJEJ1aWxkZXJfID0gbmV3IGNvbS5nb29nbGUucHJvdG9idWYuU2luZ2xlRmllbGRCdWlsZGVyPFxuIgorICAgICIgICAgICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4oXG4iCisgICAgIiAgICAgICAgICAgICgkdHlwZSQpICRvbmVvZl9uYW1lJF8sXG4iCisgICAgIiAgICAgICAgICAgIGdldFBhcmVudEZvckNoaWxkcmVuKCksXG4iCisgICAgIiAgICAgICAgICAgIGlzQ2xlYW4oKSk7XG4iCisgICAgIiAgICAkb25lb2ZfbmFtZSRfID0gbnVsbDtcbiIKKyAgICAiICB9XG4iCisgICAgIiAgJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJDtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICAgICAgICAgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKworICBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24ocHJpbnRlciwKKyAgICAicmVzdWx0LiRvbmVvZl9uYW1lJF8gPSAkb25lb2ZfbmFtZSRfO1xuIiwKKworICAgICJyZXN1bHQuJG9uZW9mX25hbWUkXyA9ICRuYW1lJEJ1aWxkZXJfLmJ1aWxkKCk7XG4iKTsKKworICBwcmludGVyLT5PdXRkZW50KCk7CisgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIm1lcmdlJGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZU1lc3NhZ2VPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJHR5cGUkLkJ1aWxkZXIgc3ViQnVpbGRlciA9IG51bGw7XG4iCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzdWJCdWlsZGVyID0gKCgkdHlwZSQpICRvbmVvZl9uYW1lJF8pLnRvQnVpbGRlcigpO1xuIgorICAgICJ9XG4iKTsKKworICBpZiAoR2V0VHlwZShkZXNjcmlwdG9yXykgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkb25lb2ZfbmFtZSRfID0gaW5wdXQucmVhZEdyb3VwKCRudW1iZXIkLCAkdHlwZSQucGFyc2VyKCksXG4iCisgICAgICAiICAgIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJG9uZW9mX25hbWUkXyA9XG4iCisgICAgICAiICAgIGlucHV0LnJlYWRNZXNzYWdlKCR0eXBlJC5wYXJzZXIoKSwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7CisgIH0KKworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoc3ViQnVpbGRlciAhPSBudWxsKSB7XG4iCisgICAgIiAgc3ViQnVpbGRlci5tZXJnZUZyb20oKCR0eXBlJCkgJG9uZW9mX25hbWUkXyk7XG4iCisgICAgIiAgJG9uZW9mX25hbWUkXyA9IHN1YkJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCk7XG4iCisgICAgIn1cbiIpOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBvdXRwdXQud3JpdGUkZ3JvdXBfb3JfbWVzc2FnZSQoJG51bWJlciQsICgkdHlwZSQpICRvbmVvZl9uYW1lJF8pO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgc2l6ZSArPSBjb20uZ29vZ2xlLnByb3RvYnVmLkNvZGVkT3V0cHV0U3RyZWFtXG4iCisgICAgIiAgICAuY29tcHV0ZSRncm91cF9vcl9tZXNzYWdlJFNpemUoJG51bWJlciQsICgkdHlwZSQpICRvbmVvZl9uYW1lJF8pO1xuIgorICAgICJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpCisgIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCksIGNvbnRleHRfKGNvbnRleHQpLAorICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSAgeworICBTZXRNZXNzYWdlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit+UmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoKSB7fQorCitpbnQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgewogICByZXR1cm4gMDsKIH0KIAotaW50IFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKK2ludCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CiAgIHJldHVybiAxOwogfQogCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIC8vIFRPRE8oam9ucCk6IEluIHRoZSBmdXR1cmUsIGNvbnNpZGVyIGhhdmluZyBtZXRob2RzIHNwZWNpZmljIHRvIHRoZQogICAvLyBpbnRlcmZhY2Ugc28gdGhhdCBidWlsZGVycyBjYW4gY2hvb3NlIGR5bmFtaWNhbGx5IHRvIGVpdGhlciByZXR1cm4gYQogICAvLyBtZXNzYWdlIG9yIGEgbmVzdGVkIGJ1aWxkZXIsIHNvIHRoYXQgYXNraW5nIGZvciB0aGUgaW50ZXJmYWNlIGRvZXNuJ3QKICAgLy8gY2F1c2UgYSBtZXNzYWdlIHRvIGV2ZXIgYmUgYnVpbHQuCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PCR0eXBlJD4gXG4iCi0gICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCk7XG4iCi0gICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCk7XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7Ci0gIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzICR0eXBlJE9yQnVpbGRlcj4gXG4iCi0gICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlckxpc3QoKTtcbiIKLSAgICAgICIkZGVwcmVjYXRpb24kJHR5cGUkT3JCdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlcihcbiIKLSAgICAgICIgICAgaW50IGluZGV4KTtcbiIpOwotICB9CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzICR0eXBlJE9yQnVpbGRlcj4gXG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXJMaXN0KCk7XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kJHR5cGUkT3JCdWlsZGVyIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlcihcbiIKKyAgICAiICAgIGludCBpbmRleCk7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gJG5hbWUkXztcbiIKKyAgICAicHJpdmF0ZSBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+ICRuYW1lJF87XG4iKTsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PD8gZXh0ZW5kcyAkdHlwZSRPckJ1aWxkZXI+IFxuIgogICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyTGlzdCgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkge1xuIgogICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSRPckJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyKFxuIgogICAgICIgICAgaW50IGluZGV4KSB7XG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKQEAgLTQ3NSwyNiArODU3LDIyIEBACiAKIH0KIAotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKAordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6UHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKAogICAgIGlvOjpQcmludGVyKiBwcmludGVyLAogICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKICAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlKSBjb25zdCB7Ci0gIGlmIChIYXNOZXN0ZWRCdWlsZGVycyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7Ci0gICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICJpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIik7Ci0gICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCByZWd1bGFyX2Nhc2UpOwotICAgICBwcmludGVyLT5PdXRkZW50KCk7Ci0gICAgIHByaW50ZXItPlByaW50KCJ9IGVsc2Uge1xuIik7Ci0gICAgIHByaW50ZXItPkluZGVudCgpOwotICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCBuZXN0ZWRfYnVpbGRlcl9jYXNlKTsKLSAgICAgcHJpbnRlci0+T3V0ZGVudCgpOwotICAgICBwcmludGVyLT5QcmludCgifVxuIik7Ci0gICB9IGVsc2UgewotICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCByZWd1bGFyX2Nhc2UpOwotICAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLCAiaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgcmVndWxhcl9jYXNlKTsKKyAgcHJpbnRlci0+T3V0ZGVudCgpOworICBwcmludGVyLT5QcmludCgifSBlbHNlIHtcbiIpOworICBwcmludGVyLT5JbmRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgbmVzdGVkX2J1aWxkZXJfY2FzZSk7CisgIHByaW50ZXItPk91dGRlbnQoKTsKKyAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQogCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjpQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbigKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OlByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKAogICAgIGlvOjpQcmludGVyKiBwcmludGVyLAogICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsCiAgICAgY29uc3QgY2hhciogcmVndWxhcl9jYXNlLApAQCAtNTExLDcgKzg4OSw3IEBACiAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgLy8gV2hlbiB1c2luZyBuZXN0ZWQtYnVpbGRlcnMsIHRoZSBjb2RlIGluaXRpYWxseSB3b3JrcyBqdXN0IGxpa2UgdGhlCiAgIC8vIG5vbi1uZXN0ZWQgYnVpbGRlciBjYXNlLiBJdCBvbmx5IGNyZWF0ZXMgYSBuZXN0ZWQgYnVpbGRlciBsYXppbHkgb24KQEAgLTUzOSwxOSArOTE3LDE4IEBACiAgICAgIn1cbiIKICAgICAiXG4iKTsKIAotICBpZiAoSGFzTmVzdGVkQnVpbGRlcnMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAvLyBJZiB0aGlzIGJ1aWxkZXIgaXMgbm9uLW51bGwsIGl0IGlzIHVzZWQgYW5kIHRoZSBvdGhlciBmaWVsZHMgYXJlCi0gICAgICAvLyBpZ25vcmVkLgotICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKLSAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiAkbmFtZSRCdWlsZGVyXztcbiIKLSAgICAgICJcbiIpOwotICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgLy8gSWYgdGhpcyBidWlsZGVyIGlzIG5vbi1udWxsLCBpdCBpcyB1c2VkIGFuZCB0aGUgb3RoZXIgZmllbGRzIGFyZQorICAgIC8vIGlnbm9yZWQuCisgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKKyAgICAiICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4gJG5hbWUkQnVpbGRlcl87XG4iCisgICAgIlxuIik7CiAKICAgLy8gVGhlIGNvbW1lbnRzIGFib3ZlIHRoZSBtZXRob2RzIGJlbG93IGFyZSBiYXNlZCBvbiBhIGh5cG90aGV0aWNhbAogICAvLyByZXBlYXRlZCBmaWVsZCBvZiB0eXBlICJGaWVsZCIgY2FsbGVkICJSZXBlYXRlZEZpZWxkIi4KIAogICAvLyBMaXN0PEZpZWxkPiBnZXRSZXBlYXRlZEZpZWxkTGlzdCgpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQ+IGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSIsCiAKQEAgLTU2MSw2ICs5MzgsNyBAQAogICAgIE5VTEwpOwogCiAgIC8vIGludCBnZXRSZXBlYXRlZEZpZWxkQ291bnQoKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkiLAogCkBAIC01NzAsNiArOTQ4LDcgQEAKICAgICBOVUxMKTsKIAogICAvLyBGaWVsZCBnZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSIsCiAKQEAgLTU4MCw2ICs5NTksNyBAQAogICAgIE5VTEwpOwogCiAgIC8vIEJ1aWxkZXIgc2V0UmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCiAgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkiLApAQCAtNTkzLDYgKzk3Myw3IEBACiAgICAgInJldHVybiB0aGlzO1xuIik7CiAKICAgLy8gQnVpbGRlciBzZXRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCkBAIC02MDYsNiArOTg3LDcgQEAKICAgICAicmV0dXJuIHRoaXM7XG4iKTsKIAogICAvLyBCdWlsZGVyIGFkZFJlcGVhdGVkRmllbGQoRmllbGQgdmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJCgkdHlwZSQgdmFsdWUpIiwKIApAQCAtNjIyLDYgKzEwMDQsNyBAQAogICAgICJyZXR1cm4gdGhpcztcbiIpOwogCiAgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChpbnQgaW5kZXgsIEZpZWxkIHZhbHVlKQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCiAgICAgIiAgICBpbnQgaW5kZXgsICR0eXBlJCB2YWx1ZSkiLApAQCAtNjM4LDYgKzEwMjEsNyBAQAogICAgICJyZXR1cm4gdGhpcztcbiIpOwogCiAgIC8vIEJ1aWxkZXIgYWRkUmVwZWF0ZWRGaWVsZChGaWVsZC5CdWlsZGVyIGJ1aWxkZXJGb3JWYWx1ZSkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKFxuIgogICAgICIgICAgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCkBAIC02NTEsNiArMTAzNSw3IEBACiAgICAgInJldHVybiB0aGlzO1xuIik7CiAKICAgLy8gQnVpbGRlciBhZGRSZXBlYXRlZEZpZWxkKGludCBpbmRleCwgRmllbGQuQnVpbGRlciBidWlsZGVyRm9yVmFsdWUpCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgUHJpbnROZXN0ZWRCdWlsZGVyRnVuY3Rpb24ocHJpbnRlciwKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIGFkZCRjYXBpdGFsaXplZF9uYW1lJChcbiIKICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkLkJ1aWxkZXIgYnVpbGRlckZvclZhbHVlKSIsCkBAIC02NjQsMTIgKzEwNDksMTQgQEAKICAgICAicmV0dXJuIHRoaXM7XG4iKTsKIAogICAvLyBCdWlsZGVyIGFkZEFsbFJlcGVhdGVkRmllbGQoSXRlcmFibGU8RmllbGQ+IHZhbHVlcykKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkQWxsJGNhcGl0YWxpemVkX25hbWUkKFxuIgogICAgICIgICAgamF2YS5sYW5nLkl0ZXJhYmxlPD8gZXh0ZW5kcyAkdHlwZSQ+IHZhbHVlcykiLAogCiAgICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICJzdXBlci5hZGRBbGwodmFsdWVzLCAkbmFtZSRfKTtcbiIKKyAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuYWRkQWxsKFxuIgorICAgICIgICAgdmFsdWVzLCAkbmFtZSRfKTtcbiIKICAgICAiJG9uX2NoYW5nZWQkXG4iLAogCiAgICAgIiRuYW1lJEJ1aWxkZXJfLmFkZEFsbE1lc3NhZ2VzKHZhbHVlcyk7XG4iLApAQCAtNjc3LDYgKzEwNjQsNyBAQAogICAgICJyZXR1cm4gdGhpcztcbiIpOwogCiAgIC8vIEJ1aWxkZXIgY2xlYXJBbGxSZXBlYXRlZEZpZWxkKCkKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBQcmludE5lc3RlZEJ1aWxkZXJGdW5jdGlvbihwcmludGVyLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSIsCiAKQEAgLTY4OSw2ICsxMDc3LDcgQEAKICAgICAicmV0dXJuIHRoaXM7XG4iKTsKIAogICAvLyBCdWlsZGVyIHJlbW92ZVJlcGVhdGVkRmllbGQoaW50IGluZGV4KQorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIFByaW50TmVzdGVkQnVpbGRlckZ1bmN0aW9uKHByaW50ZXIsCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciByZW1vdmUkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSIsCiAKQEAgLTcwMCw3MyArMTA4OSw4MiBAQAogCiAgICAgInJldHVybiB0aGlzO1xuIik7CiAKLSAgaWYgKEhhc05lc3RlZEJ1aWxkZXJzKGRlc2NyaXB0b3JfLT5jb250YWluaW5nX3R5cGUoKSkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkLkJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlcihcbiIKLSAgICAgICIgICAgaW50IGluZGV4KSB7XG4iCi0gICAgICAiICByZXR1cm4gZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkuZ2V0QnVpbGRlcihpbmRleCk7XG4iCi0gICAgICAifVxuIgorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkLkJ1aWxkZXIgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlcihcbiIKKyAgICAiICAgIGludCBpbmRleCkge1xuIgorICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5nZXRCdWlsZGVyKGluZGV4KTtcbiIKKyAgICAifVxuIik7CiAKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoXG4iCi0gICAgICAiICAgIGludCBpbmRleCkge1xuIgotICAgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIKLSAgICAgICIgICAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTsiCi0gICAgICAiICB9IGVsc2Uge1xuIgotICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlcihpbmRleCk7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAifVxuIgorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJE9yQnVpbGRlciBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRPckJ1aWxkZXIoXG4iCisgICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgorICAgICIgICAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTsiCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIHJldHVybiAkbmFtZSRCdWlsZGVyXy5nZXRNZXNzYWdlT3JCdWlsZGVyKGluZGV4KTtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOwogCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDw/IGV4dGVuZHMgJHR5cGUkT3JCdWlsZGVyPiBcbiIKLSAgICAgICIgICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJE9yQnVpbGRlckxpc3QoKSB7XG4iCi0gICAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCkge1xuIgotICAgICAgIiAgICByZXR1cm4gJG5hbWUkQnVpbGRlcl8uZ2V0TWVzc2FnZU9yQnVpbGRlckxpc3QoKTtcbiIKLSAgICAgICIgIH0gZWxzZSB7XG4iCi0gICAgICAiICAgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKLSAgICAgICIgIH1cbiIKLSAgICAgICJ9XG4iCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS51dGlsLkxpc3Q8PyBleHRlbmRzICR0eXBlJE9yQnVpbGRlcj4gXG4iCisgICAgIiAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkT3JCdWlsZGVyTGlzdCgpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gIT0gbnVsbCkge1xuIgorICAgICIgICAgcmV0dXJuICRuYW1lJEJ1aWxkZXJfLmdldE1lc3NhZ2VPckJ1aWxkZXJMaXN0KCk7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOwogCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKCkge1xuIgotICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmFkZEJ1aWxkZXIoXG4iCi0gICAgICAiICAgICAgJHR5cGUkLmdldERlZmF1bHRJbnN0YW5jZSgpKTtcbiIKLSAgICAgICJ9XG4iCi0gICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKFxuIgotICAgICAgIiAgICBpbnQgaW5kZXgpIHtcbiIKLSAgICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5hZGRCdWlsZGVyKFxuIgotICAgICAgIiAgICAgIGluZGV4LCAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIgotICAgICAgIn1cbiIKLSAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PCR0eXBlJC5CdWlsZGVyPiBcbiIKLSAgICAgICIgICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ1aWxkZXJMaXN0KCkge1xuIgotICAgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmdldEJ1aWxkZXJMaXN0KCk7XG4iCi0gICAgICAifVxuIgotICAgICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKLSAgICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKLSAgICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCkge1xuIgotICAgICAgIiAgaWYgKCRuYW1lJEJ1aWxkZXJfID09IG51bGwpIHtcbiIKLSAgICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKLSAgICAgICIgICAgICAgICR0eXBlJCwgJHR5cGUkLkJ1aWxkZXIsICR0eXBlJE9yQnVpbGRlcj4oXG4iCi0gICAgICAiICAgICAgICAgICAgJG5hbWUkXyxcbiIKLSAgICAgICIgICAgICAgICAgICAkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkLFxuIgotICAgICAgIiAgICAgICAgICAgIGdldFBhcmVudEZvckNoaWxkcmVuKCksXG4iCi0gICAgICAiICAgICAgICAgICAgaXNDbGVhbigpKTtcbiIKLSAgICAgICIgICAgJG5hbWUkXyA9IG51bGw7XG4iCi0gICAgICAiICB9XG4iCi0gICAgICAiICByZXR1cm4gJG5hbWUkQnVpbGRlcl87XG4iCi0gICAgICAifVxuIik7Ci0gIH0KKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKCkge1xuIgorICAgICIgIHJldHVybiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRGaWVsZEJ1aWxkZXIoKS5hZGRCdWlsZGVyKFxuIgorICAgICIgICAgICAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQuQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCdWlsZGVyKFxuIgorICAgICIgICAgaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmFkZEJ1aWxkZXIoXG4iCisgICAgIiAgICAgIGluZGV4LCAkdHlwZSQuZ2V0RGVmYXVsdEluc3RhbmNlKCkpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkdHlwZSQuQnVpbGRlcj4gXG4iCisgICAgIiAgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnVpbGRlckxpc3QoKSB7XG4iCisgICAgIiAgcmV0dXJuIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpLmdldEJ1aWxkZXJMaXN0KCk7XG4iCisgICAgIn1cbiIKKyAgICAicHJpdmF0ZSBjb20uZ29vZ2xlLnByb3RvYnVmLlJlcGVhdGVkRmllbGRCdWlsZGVyPFxuIgorICAgICIgICAgJHR5cGUkLCAkdHlwZSQuQnVpbGRlciwgJHR5cGUkT3JCdWlsZGVyPiBcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEZpZWxkQnVpbGRlcigpIHtcbiIKKyAgICAiICBpZiAoJG5hbWUkQnVpbGRlcl8gPT0gbnVsbCkge1xuIgorICAgICIgICAgJG5hbWUkQnVpbGRlcl8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5SZXBlYXRlZEZpZWxkQnVpbGRlcjxcbiIKKyAgICAiICAgICAgICAkdHlwZSQsICR0eXBlJC5CdWlsZGVyLCAkdHlwZSRPckJ1aWxkZXI+KFxuIgorICAgICIgICAgICAgICAgICAkbmFtZSRfLFxuIgorICAgICIgICAgICAgICAgICAkZ2V0X211dGFibGVfYml0X2J1aWxkZXIkLFxuIgorICAgICIgICAgICAgICAgICBnZXRQYXJlbnRGb3JDaGlsZHJlbigpLFxuIgorICAgICIgICAgICAgICAgICBpc0NsZWFuKCkpO1xuIgorICAgICIgICAgJG5hbWUkXyA9IG51bGw7XG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiAkbmFtZSRCdWlsZGVyXztcbiIKKyAgICAifVxuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiZ2V0JGNhcGl0YWxpemVkX25hbWUkRmllbGRCdWlsZGVyKCk7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLmVtcHR5TGlzdCgpO1xuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgUHJpbnROZXN0ZWRCdWlsZGVyQ29uZGl0aW9uKHByaW50ZXIsCiAgICAgIiRuYW1lJF8gPSBqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCk7XG4iCkBAIC03NzUsNyArMTE3Myw3IEBACiAgICAgIiRuYW1lJEJ1aWxkZXJfLmNsZWFyKCk7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgLy8gVGhlIGNvZGUgYmVsb3cgZG9lcyB0d28gb3B0aW1pemF0aW9ucyAobm9uLW5lc3RlZCBidWlsZGVyIGNhc2UpOgogICAvLyAgIDEuIElmIHRoZSBvdGhlciBsaXN0IGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIFRoaXMgZW5zdXJlcyB3ZQpAQCAtODA5LDcgKzEyMDcsNyBAQAogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIC8vIFRoZSBjb2RlIGJlbG93IChub24tbmVzdGVkIGJ1aWxkZXIgY2FzZSkgZW5zdXJlcyB0aGF0IHRoZSByZXN1bHQgaGFzIGFuCiAgIC8vIGltbXV0YWJsZSBsaXN0LiBJZiBvdXIgbGlzdCBpcyBpbW11dGFibGUsIHdlIGNhbiBqdXN0IHJldXNlIGl0LiBJZiBub3QsCkBAIC04MjQsMjQgKzEyMjIsMzMgQEAKICAgICAicmVzdWx0LiRuYW1lJF8gPSAkbmFtZSRCdWlsZGVyXy5idWlsZCgpO1xuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiR0eXBlJC5CdWlsZGVyIHN1YkJ1aWxkZXIgPSAkdHlwZSQubmV3QnVpbGRlcigpO1xuIik7CisgICAgImlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PCR0eXBlJD4oKTtcbiIKKyAgICAiICAkc2V0X211dGFibGVfYml0X3BhcnNlciQ7XG4iCisgICAgIn1cbiIpOwogCiAgIGlmIChHZXRUeXBlKGRlc2NyaXB0b3JfKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlucHV0LnJlYWRHcm91cCgkbnVtYmVyJCwgc3ViQnVpbGRlciwgZXh0ZW5zaW9uUmVnaXN0cnkpO1xuIik7CisgICAgICAiJG5hbWUkXy5hZGQoaW5wdXQucmVhZEdyb3VwKCRudW1iZXIkLCAkdHlwZSQucGFyc2VyKCksXG4iCisgICAgICAiICAgIGV4dGVuc2lvblJlZ2lzdHJ5KSk7XG4iKTsKICAgfSBlbHNlIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlucHV0LnJlYWRNZXNzYWdlKHN1YkJ1aWxkZXIsIGV4dGVuc2lvblJlZ2lzdHJ5KTtcbiIpOworICAgICAgIiRuYW1lJF8uYWRkKGlucHV0LnJlYWRNZXNzYWdlKCR0eXBlJC5wYXJzZXIoKSwgZXh0ZW5zaW9uUmVnaXN0cnkpKTtcbiIpOwogICB9Ci0KLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiYWRkJGNhcGl0YWxpemVkX25hbWUkKHN1YkJ1aWxkZXIuYnVpbGRQYXJ0aWFsKCkpO1xuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgpAQCAtODQ5LDcgKzEyNTYsNyBAQAogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgpAQCAtODU4LDE0ICsxMjY1LDE0IEBACiAgICAgIn1cbiIpOwogfQogCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVFcXVhbHNDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KClcbiIKICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpKTtcbiIpOwogfQogCi12b2lkIFJlcGVhdGVkTWVzc2FnZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSA+IDApIHtcbiIKQEAgLTg3NCw4ICsxMjgxLDggQEAKICAgICAifVxuIik7CiB9CiAKLXN0cmluZyBSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3QgewotICByZXR1cm4gQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5tZXNzYWdlX3R5cGUoKSk7CitzdHJpbmcgUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoZGVzY3JpcHRvcl8tPm1lc3NhZ2VfdHlwZSgpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGphdmEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZC5oCmluZGV4IDJlZmJjZDkuLmVhODIyNWEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDEsMTYgKzQxLDI2IEBACiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgbmFtZXNwYWNlIGNvbXBpbGVyIHsKKyAgICBuYW1lc3BhY2UgamF2YSB7CisgICAgICBjbGFzcyBDb250ZXh0OyAgICAgICAgICAgLy8gY29udGV4dC5oCisgICAgICBjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgLy8gbmFtZV9yZXNvbHZlci5oCisgICAgfQorICB9Cit9CisKK25hbWVzcGFjZSBwcm90b2J1ZiB7CiBuYW1lc3BhY2UgY29tcGlsZXIgewogbmFtZXNwYWNlIGphdmEgewogCi1jbGFzcyBNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworY2xhc3MgSW1tdXRhYmxlTWVzc2FnZUZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKICBwdWJsaWM6Ci0gIGV4cGxpY2l0IE1lc3NhZ2VGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKLSAgfk1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOworICBleHBsaWNpdCBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgfkltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOwogCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OwogICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtNjEsNiArNzEsNyBAQAogICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKQEAgLTY5LDEzICs4MCwxMyBAQAogCiAgIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdDsKIAotIHByaXZhdGU6CisgcHJvdGVjdGVkOgogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CiAgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwogICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWVzc2FnZUZpZWxkR2VuZXJhdG9yKTsKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKIAogICB2b2lkIFByaW50TmVzdGVkQnVpbGRlckNvbmRpdGlvbihpbzo6UHJpbnRlciogcHJpbnRlciwKICAgICAgIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwgY29uc3QgY2hhciogbmVzdGVkX2J1aWxkZXJfY2FzZSkgY29uc3Q7CkBAIC04MywxNSArOTQsMzkgQEAKICAgICAgIGNvbnN0IGNoYXIqIG1ldGhvZF9wcm90b3R5cGUsIGNvbnN0IGNoYXIqIHJlZ3VsYXJfY2FzZSwKICAgICAgIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UsCiAgICAgICBjb25zdCBjaGFyKiB0cmFpbGluZ19jb2RlKSBjb25zdDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IpOwogfTsKIAotY2xhc3MgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworY2xhc3MgSW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgUmVwZWF0ZWRNZXNzYWdlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7Ci0gIH5SZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcigpOworICBJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlTWVzc2FnZU9uZW9mRmllbGRHZW5lcmF0b3IoKTsKIAotICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVNZXNzYWdlT25lb2ZGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBJbW11dGFibGVGaWVsZEdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBSZXBlYXRlZEltbXV0YWJsZU1lc3NhZ2VGaWVsZEdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOworICB+UmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKICAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKQEAgLTEwMiw2ICsxMzcsNyBAQAogICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKQEAgLTExMCwxMyArMTQ2LDEzIEBACiAKICAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OwogCi0gcHJpdmF0ZToKKyBwcm90ZWN0ZWQ6CiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyaWFibGVzXzsKICAgY29uc3QgaW50IG1lc3NhZ2VCaXRJbmRleF87CiAgIGNvbnN0IGludCBidWlsZGVyQml0SW5kZXhfOwotCi0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZE1lc3NhZ2VGaWVsZEdlbmVyYXRvcik7CisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CiAKICAgdm9pZCBQcmludE5lc3RlZEJ1aWxkZXJDb25kaXRpb24oaW86OlByaW50ZXIqIHByaW50ZXIsCiAgICAgICBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsIGNvbnN0IGNoYXIqIG5lc3RlZF9idWlsZGVyX2Nhc2UpIGNvbnN0OwpAQCAtMTI0LDYgKzE2MCw5IEBACiAgICAgICBjb25zdCBjaGFyKiBtZXRob2RfcHJvdG90eXBlLCBjb25zdCBjaGFyKiByZWd1bGFyX2Nhc2UsCiAgICAgICBjb25zdCBjaGFyKiBuZXN0ZWRfYnVpbGRlcl9jYXNlLAogICAgICAgY29uc3QgY2hhciogdHJhaWxpbmdfY29kZSkgY29uc3Q7CisKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRJbW11dGFibGVNZXNzYWdlRmllbGRHZW5lcmF0b3IpOwogfTsKIAogfSAgLy8gbmFtZXNwYWNlIGphdmEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2ZpZWxkX2xpdGUuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfZmllbGRfbGl0ZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9maWVsZF9saXRlLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9tZXNzYWdlX2xpdGUuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9saXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX21lc3NhZ2VfbGl0ZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbWVzc2FnZV9saXRlLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lX3Jlc29sdmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX25hbWVfcmVzb2x2ZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZXMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9uYW1lcy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZXMuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wbHVnaW5fdW5pdHRlc3QuY2MKaW5kZXggY2NjOTRjOS4uM2U0OTEwYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3BsdWdpbl91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcGx1Z2luX3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCwxNCArMzQsMjAgQEAKIC8vICAgSXQgc2VlbWVkIGxpa2UgcGFyYW1ldGVyaXppbmcgaXQgd291bGQgYWRkIG1vcmUgY29tcGxleGl0eSB0aGFuIGl0IGlzCiAvLyAgIHdvcnRoLgogCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29tbWFuZF9saW5lX2ludGVyZmFjZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CkBAIC03MCw4ICs3Niw4IEBACiAKICAgdm9pZCBUcnlJbnNlcnQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBpbnNlcnRpb25fcG9pbnQsCiAgICAgICAgICAgICAgICAgIEdlbmVyYXRvckNvbnRleHQqIGNvbnRleHQpIGNvbnN0IHsKLSAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKKyAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydChmaWxlbmFtZSwgaW5zZXJ0aW9uX3BvaW50KSk7CiAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CiAgICAgcHJpbnRlci5QcmludCgiLy8gaW5zZXJ0ZWQgJG5hbWUkXG4iLCAibmFtZSIsIGluc2VydGlvbl9wb2ludCk7CiAgIH0KQEAgLTgxLDE2ICs4NywxNiBAQAogLy8gbm90IHZlcmlmeSB0aGF0IHRoZXkgYXJlIGNvcnJlY3RseS1wbGFjZWQ7IHRoYXQgd291bGQgcmVxdWlyZSBhY3R1YWxseQogLy8gY29tcGlsaW5nIHRoZSBvdXRwdXQgd2hpY2ggaXMgYSBiaXQgbW9yZSB0aGFuIEkgY2FyZSB0byBkbyBmb3IgdGhpcyB0ZXN0LgogVEVTVChKYXZhUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgewotICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKAotICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAicGFja2FnZSBmb287XG4iCi0gICAgICAib3B0aW9uIGphdmFfcGFja2FnZSA9IFwiXCI7XG4iCi0gICAgICAib3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gXCJUZXN0XCI7XG4iCi0gICAgICAibWVzc2FnZSBCYXIge1xuIgotICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKLSAgICAgICJ9XG4iCi0gICAgICAiZW51bSBRdXggeyBCTEFIID0gMTsgfVxuIiwKLSAgICAgIFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3QucHJvdG8iKTsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OlNldENvbnRlbnRzKFRlc3RUZW1wRGlyKCkgKyAiL3Rlc3QucHJvdG8iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBhY2thZ2UgZm9vO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3B0aW9uIGphdmFfcGFja2FnZSA9IFwiXCI7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvcHRpb24gamF2YV9vdXRlcl9jbGFzc25hbWUgPSBcIlRlc3RcIjtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm1lc3NhZ2UgQmFyIHtcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIn1cbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImVudW0gUXV4IHsgQkxBSCA9IDE7IH1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpKTsKIAogICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29tbWFuZExpbmVJbnRlcmZhY2UgY2xpOwogICBjbGkuU2V0SW5wdXRzQXJlUHJvdG9QYXRoUmVsYXRpdmUodHJ1ZSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5jYwppbmRleCA3MTJlMDQ3Li5lNDJlYzI4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDkgKzM1LDEzIEBACiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgpAQCAtNTIsMTI3ICs1NiwyNSBAQAogCiBuYW1lc3BhY2UgewogCi1jb25zdCBjaGFyKiBQcmltaXRpdmVUeXBlTmFtZShKYXZhVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgSkFWQVRZUEVfSU5UICAgIDogcmV0dXJuICJpbnQiOwotICAgIGNhc2UgSkFWQVRZUEVfTE9ORyAgIDogcmV0dXJuICJsb25nIjsKLSAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUICA6IHJldHVybiAiZmxvYXQiOwotICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFIDogcmV0dXJuICJkb3VibGUiOwotICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjogcmV0dXJuICJib29sZWFuIjsKLSAgICBjYXNlIEpBVkFUWVBFX1NUUklORyA6IHJldHVybiAiamF2YS5sYW5nLlN0cmluZyI7Ci0gICAgY2FzZSBKQVZBVFlQRV9CWVRFUyAgOiByZXR1cm4gImNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyI7Ci0gICAgY2FzZSBKQVZBVFlQRV9FTlVNICAgOiByZXR1cm4gTlVMTDsKLSAgICBjYXNlIEpBVkFUWVBFX01FU1NBR0U6IHJldHVybiBOVUxMOwotCi0gICAgLy8gTm8gZGVmYXVsdCBiZWNhdXNlIHdlIHdhbnQgdGhlIGNvbXBpbGVyIHRvIGNvbXBsYWluIGlmIGFueSBuZXcKLSAgICAvLyBKYXZhVHlwZXMgYXJlIGFkZGVkLgotICB9Ci0KLSAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkNhbid0IGdldCBoZXJlLiI7Ci0gIHJldHVybiBOVUxMOwotfQotCi1ib29sIElzUmVmZXJlbmNlVHlwZShKYXZhVHlwZSB0eXBlKSB7Ci0gIHN3aXRjaCAodHlwZSkgewotICAgIGNhc2UgSkFWQVRZUEVfSU5UICAgIDogcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSkFWQVRZUEVfTE9ORyAgIDogcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSkFWQVRZUEVfRkxPQVQgIDogcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSkFWQVRZUEVfRE9VQkxFIDogcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSkFWQVRZUEVfQk9PTEVBTjogcmV0dXJuIGZhbHNlOwotICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HIDogcmV0dXJuIHRydWU7Ci0gICAgY2FzZSBKQVZBVFlQRV9CWVRFUyAgOiByZXR1cm4gdHJ1ZTsKLSAgICBjYXNlIEpBVkFUWVBFX0VOVU0gICA6IHJldHVybiB0cnVlOwotICAgIGNhc2UgSkFWQVRZUEVfTUVTU0FHRTogcmV0dXJuIHRydWU7Ci0KLSAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwotICAgIC8vIEphdmFUeXBlcyBhcmUgYWRkZWQuCi0gIH0KLQotICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgcmV0dXJuIGZhbHNlOwotfQotCi1jb25zdCBjaGFyKiBHZXRDYXBpdGFsaXplZFR5cGUoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewotICBzd2l0Y2ggKEdldFR5cGUoZmllbGQpKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAiSW50MzIiICAgOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMiAgOiByZXR1cm4gIlVJbnQzMiIgIDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuICJTSW50MzIiICA7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMiA6IHJldHVybiAiRml4ZWQzMiIgOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOiByZXR1cm4gIlNGaXhlZDMyIjsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuICJJbnQ2NCIgICA7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAiVUludDY0IiAgOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NCAgOiByZXR1cm4gIlNJbnQ2NCIgIDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0IDogcmV0dXJuICJGaXhlZDY0IiA7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU0ZJWEVENjQ6IHJldHVybiAiU0ZpeGVkNjQiOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZMT0FUICAgOiByZXR1cm4gIkZsb2F0IiAgIDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuICJEb3VibGUiICA7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQk9PTCAgICA6IHJldHVybiAiQm9vbCIgICAgOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAgOiByZXR1cm4gIlN0cmluZyIgIDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuICJCeXRlcyIgICA7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSAgICA6IHJldHVybiAiRW51bSIgICAgOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gIkdyb3VwIiAgIDsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFIDogcmV0dXJuICJNZXNzYWdlIiA7Ci0KLSAgICAvLyBObyBkZWZhdWx0IGJlY2F1c2Ugd2Ugd2FudCB0aGUgY29tcGlsZXIgdG8gY29tcGxhaW4gaWYgYW55IG5ldwotICAgIC8vIHR5cGVzIGFyZSBhZGRlZC4KLSAgfQotCi0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICByZXR1cm4gTlVMTDsKLX0KLQotLy8gRm9yIGVuY29kaW5ncyB3aXRoIGZpeGVkIHNpemVzLCByZXR1cm5zIHRoYXQgc2l6ZSBpbiBieXRlcy4gIE90aGVyd2lzZQotLy8gcmV0dXJucyAtMS4KLWludCBGaXhlZFNpemUoRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKLSAgc3dpdGNoICh0eXBlKSB7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfSU5UMzIgICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQ2NCAgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMiAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfVUlOVDY0ICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UMzIgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQ2NCAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMiA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0ZpeGVkMzJTaXplOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0ZJWEVENjQgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtGaXhlZDY0U2l6ZTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TRklYRUQzMjogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprU0ZpeGVkMzJTaXplOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtTRml4ZWQ2NFNpemU7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQgICA6IHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6a0Zsb2F0U2l6ZTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9ET1VCTEUgIDogcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjprRG91YmxlU2l6ZTsKLQotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0JPT0wgICAgOiByZXR1cm4gV2lyZUZvcm1hdExpdGU6OmtCb29sU2l6ZTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNICAgIDogcmV0dXJuIC0xOwotCi0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HICA6IHJldHVybiAtMTsKLSAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CWVRFUyAgIDogcmV0dXJuIC0xOwotICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQICAgOiByZXR1cm4gLTE7Ci0gICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSA6IHJldHVybiAtMTsKLQotICAgIC8vIE5vIGRlZmF1bHQgYmVjYXVzZSB3ZSB3YW50IHRoZSBjb21waWxlciB0byBjb21wbGFpbiBpZiBhbnkgbmV3Ci0gICAgLy8gdHlwZXMgYXJlIGFkZGVkLgotICB9Ci0gIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICByZXR1cm4gLTE7Ci19Ci0KIHZvaWQgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGRHZW5lcmF0b3JJbmZvKiBpbmZvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgQ2xhc3NOYW1lUmVzb2x2ZXIqIG5hbWVfcmVzb2x2ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+KiB2YXJpYWJsZXMpIHsKLSAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gPQotICAgIFVuZGVyc2NvcmVzVG9DYW1lbENhc2UoZGVzY3JpcHRvcik7Ci0gICgqdmFyaWFibGVzKVsiY2FwaXRhbGl6ZWRfbmFtZSJdID0KLSAgICBVbmRlcnNjb3Jlc1RvQ2FwaXRhbGl6ZWRDYW1lbENhc2UoZGVzY3JpcHRvcik7Ci0gICgqdmFyaWFibGVzKVsiY29uc3RhbnRfbmFtZSJdID0gRmllbGRDb25zdGFudE5hbWUoZGVzY3JpcHRvcik7Ci0gICgqdmFyaWFibGVzKVsibnVtYmVyIl0gPSBTaW1wbGVJdG9hKGRlc2NyaXB0b3ItPm51bWJlcigpKTsKKyAgU2V0Q29tbW9uRmllbGRWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgdmFyaWFibGVzKTsKKwogICAoKnZhcmlhYmxlcylbInR5cGUiXSA9IFByaW1pdGl2ZVR5cGVOYW1lKEdldEphdmFUeXBlKGRlc2NyaXB0b3IpKTsKICAgKCp2YXJpYWJsZXMpWyJib3hlZF90eXBlIl0gPSBCb3hlZFByaW1pdGl2ZVR5cGVOYW1lKEdldEphdmFUeXBlKGRlc2NyaXB0b3IpKTsKICAgKCp2YXJpYWJsZXMpWyJmaWVsZF90eXBlIl0gPSAoKnZhcmlhYmxlcylbInR5cGUiXTsKICAgKCp2YXJpYWJsZXMpWyJmaWVsZF9saXN0X3R5cGUiXSA9ICJqYXZhLnV0aWwuTGlzdDwiICsKICAgICAgICgqdmFyaWFibGVzKVsiYm94ZWRfdHlwZSJdICsgIj4iOwogICAoKnZhcmlhYmxlcylbImVtcHR5X2xpc3QiXSA9ICJqYXZhLnV0aWwuQ29sbGVjdGlvbnMuZW1wdHlMaXN0KCkiOwotICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcik7CiAgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9pbml0Il0gPSBJc0RlZmF1bHRWYWx1ZUphdmFEZWZhdWx0KGRlc2NyaXB0b3IpID8KLSAgICAgICIiIDogKCI9ICIgKyBEZWZhdWx0VmFsdWUoZGVzY3JpcHRvcikpOwotICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX3R5cGUiXSA9IEdldENhcGl0YWxpemVkVHlwZShkZXNjcmlwdG9yKTsKKyAgICAgICIiIDogKCI9ICIgKyBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcikpOworICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX3R5cGUiXSA9CisgICAgICBHZXRDYXBpdGFsaXplZFR5cGUoZGVzY3JpcHRvciwgLyogaW1tdXRhYmxlID0gKi8gdHJ1ZSk7CiAgICgqdmFyaWFibGVzKVsidGFnIl0gPSBTaW1wbGVJdG9hKFdpcmVGb3JtYXQ6Ok1ha2VUYWcoZGVzY3JpcHRvcikpOwogICAoKnZhcmlhYmxlcylbInRhZ19zaXplIl0gPSBTaW1wbGVJdG9hKAogICAgICAgV2lyZUZvcm1hdDo6VGFnU2l6ZShkZXNjcmlwdG9yLT5udW1iZXIoKSwgR2V0VHlwZShkZXNjcmlwdG9yKSkpOwpAQCAtMTkyLDIyICs5NCw0OCBAQAogICBpZiAoZml4ZWRfc2l6ZSAhPSAtMSkgewogICAgICgqdmFyaWFibGVzKVsiZml4ZWRfc2l6ZSJdID0gU2ltcGxlSXRvYShmaXhlZF9zaXplKTsKICAgfQotICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9Ci0gICAgICBIYXNEZXNjcmlwdG9yTWV0aG9kcyhkZXNjcmlwdG9yLT5jb250YWluaW5nX3R5cGUoKSkgPyAib25DaGFuZ2VkKCk7IiA6ICIiOworICAoKnZhcmlhYmxlcylbIm9uX2NoYW5nZWQiXSA9ICJvbkNoYW5nZWQoKTsiOwogCi0gIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KLSAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvci0+ZmlsZSgpKSkgeworICAgIC8vIEZvciBzaW5ndWxhciBtZXNzYWdlcyBhbmQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3IgdGhlIGhhc0ZpZWxkIGJpdC4KKyAgICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9IEdlbmVyYXRlR2V0Qml0KG1lc3NhZ2VCaXRJbmRleCk7CisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwogCi0gICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOwotICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KLSAgICAgIEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKKyAgICAvLyBOb3RlIHRoYXQgdGhlc2UgaGF2ZSBhIHRyYWlsaW5nICI7Ii4KKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9CisgICAgICAgIEdlbmVyYXRlU2V0Qml0KG1lc3NhZ2VCaXRJbmRleCkgKyAiOyI7CisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsiY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyIl0gPQorICAgICAgICBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCkgKyAiOyI7CisKKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7CisgICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9ICIiOworCisgICAgaWYgKGRlc2NyaXB0b3ItPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpIHsKKyAgICAgICgqdmFyaWFibGVzKVsiaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlIl0gPQorICAgICAgICAgICIhIiArICgqdmFyaWFibGVzKVsibmFtZSJdICsgIl8uaXNFbXB0eSgpIjsKKyAgICB9IGVsc2UgeworICAgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9CisgICAgICAgICAgKCp2YXJpYWJsZXMpWyJuYW1lIl0gKyAiXyAhPSAiICsgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il07CisgICAgfQorICB9CiAKICAgLy8gRm9yIHJlcGF0ZWQgYnVpbGRlcnMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlLgogICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZUdldEJpdChidWlsZGVyQml0SW5kZXgpOwogICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9idWlsZGVyIl0gPSBHZW5lcmF0ZVNldEJpdChidWlsZGVyQml0SW5kZXgpOwogICAoKnZhcmlhYmxlcylbImNsZWFyX211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlQ2xlYXJCaXQoYnVpbGRlckJpdEluZGV4KTsKIAorICAvLyBGb3IgcmVwZWF0ZWQgZmllbGRzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZQorICAvLyBpbiB0aGUgcGFyc2luZyBjb25zdHJ1Y3Rvci4KKyAgKCp2YXJpYWJsZXMpWyJnZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVHZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKyAgKCp2YXJpYWJsZXMpWyJzZXRfbXV0YWJsZV9iaXRfcGFyc2VyIl0gPQorICAgICAgR2VuZXJhdGVTZXRCaXRNdXRhYmxlTG9jYWwoYnVpbGRlckJpdEluZGV4KTsKKwogICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwiXSA9CiAgICAgICBHZW5lcmF0ZUdldEJpdEZyb21Mb2NhbChidWlsZGVyQml0SW5kZXgpOwogICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsIl0gPQpAQCAtMjE4LDcwICsxNDYsOTQgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1QcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Ci1QcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCkKK0ltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0ltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKICAgOiBkZXNjcmlwdG9yXyhkZXNjcmlwdG9yKSwgbWVzc2FnZUJpdEluZGV4XyhtZXNzYWdlQml0SW5kZXgpLAotICAgIGJ1aWxkZXJCaXRJbmRleF8oYnVpbGRlckJpdEluZGV4KSB7CisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpLCBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgewogICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7CisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOwogfQogCi1QcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6flByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KK0ltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjp+SW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKSB7fQogCi1pbnQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworaW50IEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0IHsKICAgcmV0dXJuIDE7CiB9CiAKLWludCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CitpbnQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgewogICByZXR1cm4gMTsKIH0KIAotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIpOworICB9CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJGRlcHJlY2F0aW9uJGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCk7XG4iCiAgICAgIiRkZXByZWNhdGlvbiQkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKIH0KIAotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlICRmaWVsZF90eXBlJCAkbmFtZSRfO1xuIgotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCi0gICAgIn1cbiIpOworICAgICJwcml2YXRlICRmaWVsZF90eXBlJCAkbmFtZSRfO1xuIik7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkO1xuIgorICAgICAgIn1cbiIpOworICB9CiAKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iCiAgICAgIn1cbiIpOwogfQogCi12b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlICRmaWVsZF90eXBlJCAkbmFtZSRfICRkZWZhdWx0X2luaXQkO1xuIgotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIn1cbiIpOworICAgICJwcml2YXRlICRmaWVsZF90eXBlJCAkbmFtZSRfICRkZWZhdWx0X2luaXQkO1xuIik7CiAKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCisgICAgICAifVxuIik7CisgIH0KKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgJHR5cGUkIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXztcbiIKICAgICAifVxuIik7CiAKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgogICAgICIkbnVsbF9jaGVjayQiCi0gICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgogICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKICAgICAiICAkb25fY2hhbmdlZCRcbiIKICAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKLSAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworICAgICIgICRjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iKTsKICAgSmF2YVR5cGUgdHlwZSA9IEdldEphdmFUeXBlKGRlc2NyaXB0b3JfKTsKICAgaWYgKHR5cGUgPT0gSkFWQVRZUEVfU1RSSU5HIHx8IHR5cGUgPT0gSkFWQVRZUEVfQllURVMpIHsKICAgICAvLyBUaGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYSBzaW1wbGUgbGl0ZXJhbCBzbyB3ZSB3YW50IHRvIGF2b2lkIGV4ZWN1dGluZwpAQCAtMjk4LDY1ICsyNTAsODAgQEAKICAgICAifVxuIik7CiB9CiAKLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKICAgLy8gbm9vcCBmb3IgcHJpbWl0aXZlcwogfQogCi12b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZGVmYXVsdCQ7XG4iKTsKIH0KIAotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRlckNsZWFyQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIgotICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIpOworICAgICIkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7CiB9CiAKLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgotICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCi0gICAgIn1cbiIpOworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgorICAgICAgIiAgc2V0JGNhcGl0YWxpemVkX25hbWUkKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSAhPSAkZGVmYXVsdCQpIHtcbiIKKyAgICAgICIgIHNldCRjYXBpdGFsaXplZF9uYW1lJChvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSk7XG4iCisgICAgICAifVxuIik7CisgIH0KIH0KIAotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIgorICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCi0gICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKLSAgICAifVxuIgogICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKIH0KIAotdm9pZCBQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIKICAgICAiJG5hbWUkXyA9IGlucHV0LnJlYWQkY2FwaXRhbGl6ZWRfdHlwZSQoKTtcbiIpOwogfQogCi12b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3IgcHJpbWl0aXZlcy4KK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKKyAgICAiaWYgKCRpc19maWVsZF9wcmVzZW50X21lc3NhZ2UkKSB7XG4iCiAgICAgIiAgb3V0cHV0LndyaXRlJGNhcGl0YWxpemVkX3R5cGUkKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKICAgICAifVxuIik7CiB9CiAKLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X21lc3NhZ2UkKSB7XG4iCisgICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgogICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgogICAgICIgICAgLmNvbXB1dGUkY2FwaXRhbGl6ZWRfdHlwZSRTaXplKCRudW1iZXIkLCAkbmFtZSRfKTtcbiIKICAgICAifVxuIik7CiB9CiAKLXZvaWQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgc3dpdGNoIChHZXRKYXZhVHlwZShkZXNjcmlwdG9yXykpIHsKICAgICBjYXNlIEpBVkFUWVBFX0lOVDoKQEAgLTM2OSwxNCArMzM2LDE4IEBACiAKICAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgogICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiAoRmxvYXQuZmxvYXRUb0ludEJpdHMoZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpIgotICAgICAgICAiICAgID09IEZsb2F0LmZsb2F0VG9JbnRCaXRzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSk7XG4iKTsKKyAgICAgICAgInJlc3VsdCA9IHJlc3VsdCAmJiAoXG4iCisgICAgICAgICIgICAgamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKVxuIgorICAgICAgICAiICAgID09IGphdmEubGFuZy5GbG9hdC5mbG9hdFRvSW50Qml0cyhcbiIKKyAgICAgICAgIiAgICAgICAgb3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpKTtcbiIpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRToKICAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgKERvdWJsZS5kb3VibGVUb0xvbmdCaXRzKGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSIKLSAgICAgICAgIiAgICA9PSBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpO1xuIik7CisgICAgICAgICJyZXN1bHQgPSByZXN1bHQgJiYgKFxuIgorICAgICAgICAiICAgIGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSlcbiIKKyAgICAgICAgIiAgICA9PSBqYXZhLmxhbmcuRG91YmxlLmRvdWJsZVRvTG9uZ0JpdHMoXG4iCisgICAgICAgICIgICAgICAgIG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJCgpKSk7XG4iKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBKQVZBVFlQRV9TVFJJTkc6CkBAIC0zOTQsNyArMzY1LDcgQEAKICAgfQogfQogCi12b2lkIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJoYXNoID0gKDM3ICogaGFzaCkgKyAkY29uc3RhbnRfbmFtZSQ7XG4iKTsKQEAgLTQwNiwyNCArMzc3LDI2IEBACiAKICAgICBjYXNlIEpBVkFUWVBFX0xPTkc6CiAgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgaGFzaExvbmcoZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmhhc2hMb25nKFxuIgorICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEpBVkFUWVBFX0JPT0xFQU46CiAgICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgaGFzaEJvb2xlYW4oZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CisgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmhhc2hCb29sZWFuKFxuIgorICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEpBVkFUWVBFX0ZMT0FUOgogICAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIEZsb2F0LmZsb2F0VG9JbnRCaXRzKFxuIgorICAgICAgICAiaGFzaCA9ICg1MyAqIGhhc2gpICsgamF2YS5sYW5nLkZsb2F0LmZsb2F0VG9JbnRCaXRzKFxuIgogICAgICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpKTtcbiIpOwogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEpBVkFUWVBFX0RPVUJMRToKICAgICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBoYXNoTG9uZyhcbiIKLSAgICAgICAgIiAgICBEb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpO1xuIik7CisgICAgICAgICJoYXNoID0gKDUzICogaGFzaCkgKyBjb20uZ29vZ2xlLnByb3RvYnVmLkludGVybmFsLmhhc2hMb25nKFxuIgorICAgICAgICAiICAgIGphdmEubGFuZy5Eb3VibGUuZG91YmxlVG9Mb25nQml0cyhnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSkpO1xuIik7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgSkFWQVRZUEVfU1RSSU5HOgpAQCAtNDQwLDY0ICs0MTMsMjAwIEBACiAgIH0KIH0KIAotc3RyaW5nIFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CitzdHJpbmcgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKICAgcmV0dXJuIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pKTsKIH0KIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKLVJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQotICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCi0gICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKLSAgU2V0UHJpbWl0aXZlVmFyaWFibGVzKGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LAotICAgICAgICAgICAgICAgICAgICAgICAgJnZhcmlhYmxlc18pOworSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGV4dCogY29udGV4dCkKKyAgICA6IEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKAorICAgICAgICAgIGRlc2NyaXB0b3IsIG1lc3NhZ2VCaXRJbmRleCwgYnVpbGRlckJpdEluZGV4LCBjb250ZXh0KSB7CisgIGNvbnN0IE9uZW9mR2VuZXJhdG9ySW5mbyogaW5mbyA9CisgICAgICBjb250ZXh0LT5HZXRPbmVvZkdlbmVyYXRvckluZm8oZGVzY3JpcHRvci0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgU2V0Q29tbW9uT25lb2ZWYXJpYWJsZXMoZGVzY3JpcHRvciwgaW5mbywgJnZhcmlhYmxlc18pOwogfQogCi1SZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjp+UmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpIHt9CitJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK35JbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yKCkge30KIAotaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3Qgewordm9pZCBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgIHJldHVybiAoJGJveGVkX3R5cGUkKSAkb25lb2ZfbmFtZSRfO1xuIgorICAgICIgIH1cbiIKKyAgICAiICByZXR1cm4gJGRlZmF1bHQkO1xuIgorICAgICJ9XG4iKTsKK30KKworCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQorCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgIHJldHVybiAoJGJveGVkX3R5cGUkKSAkb25lb2ZfbmFtZSRfO1xuIgorICAgICIgIH1cbiIKKyAgICAiICByZXR1cm4gJGRlZmF1bHQkO1xuIgorICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoJHR5cGUkIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAiICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgICAkY2xlYXJfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAiICAgICRvbmVvZl9uYW1lJF8gPSBudWxsO1xuIgorICAgICIgICAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgfVxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICByZXN1bHQuJG9uZW9mX25hbWUkXyA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAiJG9uZW9mX25hbWUkXyA9IGlucHV0LnJlYWQkY2FwaXRhbGl6ZWRfdHlwZSQoKTtcbiIpOworfQorCit2b2lkIEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgb3V0cHV0LndyaXRlJGNhcGl0YWxpemVkX3R5cGUkKFxuIgorICAgICIgICAgICAkbnVtYmVyJCwgKCR0eXBlJCkoKCRib3hlZF90eXBlJCkgJG9uZW9mX25hbWUkXykpO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKKyAgICAiICAgIC5jb21wdXRlJGNhcGl0YWxpemVkX3R5cGUkU2l6ZShcbiIKKyAgICAiICAgICAgICAkbnVtYmVyJCwgKCR0eXBlJCkoKCRib3hlZF90eXBlJCkgJG9uZW9mX25hbWUkXykpO1xuIgorICAgICJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK1JlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpLCBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK35SZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgewogICByZXR1cm4gMDsKIH0KIAotaW50IFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworaW50IFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgewogICByZXR1cm4gMTsKIH0KIAotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kamF2YS51dGlsLkxpc3Q8JGJveGVkX3R5cGUkPiBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCk7XG4iCi0gICAgIiRkZXByZWNhdGlvbiRpbnQgZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKTtcbiIKKyAgICAiJGRlcHJlY2F0aW9uJGphdmEudXRpbC5MaXN0PCRib3hlZF90eXBlJD4gZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJCR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KTtcbiIpOwogfQogCiAKLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgJGZpZWxkX2xpc3RfdHlwZSQgJG5hbWUkXztcbiIKKyAgICAicHJpdmF0ZSAkZmllbGRfbGlzdF90eXBlJCAkbmFtZSRfO1xuIik7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkYm94ZWRfdHlwZSQ+XG4iCiAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgogICAgICIgIHJldHVybiAkbmFtZSRfO1xuIiAgIC8vIG5vdGU6ICB1bm1vZGlmaWFibGUgbGlzdAotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkge1xuIgogICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljICR0eXBlJCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoaW50IGluZGV4KSB7XG4iCiAgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0KGluZGV4KTtcbiIKICAgICAifVxuIik7CiAKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkgJiYKLSAgICAgIEhhc0dlbmVyYXRlZE1ldGhvZHMoZGVzY3JpcHRvcl8tPmNvbnRhaW5pbmdfdHlwZSgpKSkgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpICYmCisgICAgICBjb250ZXh0Xy0+SGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7XG4iKTsKICAgfQogfQogCi12b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRlck1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgLy8gT25lIGZpZWxkIGlzIHRoZSBsaXN0IGFuZCB0aGUgYml0IGZpZWxkIGtlZXBzIHRyYWNrIG9mIHdoZXRoZXIgdGhlCiAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLiBJZiBpdCdzIGltbXV0YWJsZSwgdGhlIGludmFyaWFudCBpcyB0aGF0IGl0IG11c3QKQEAgLTUyMywxNyArNjMyLDI0IEBACiAgICAgLy8gICBjb3VsZCBob2xkIG9uIHRvIHRoZSByZXR1cm5lZCBsaXN0IGFuZCBtb2RpZnkgaXQgYWZ0ZXIgdGhlIG1lc3NhZ2UKICAgICAvLyAgIGhhcyBiZWVuIGJ1aWx0LCB0aHVzIG11dGF0aW5nIHRoZSBtZXNzYWdlIHdoaWNoIGlzIHN1cHBvc2VkIHRvIGJlCiAgICAgLy8gICBpbW11dGFibGUuCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDwkYm94ZWRfdHlwZSQ+XG4iCiAgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkge1xuIgogICAgICIgIHJldHVybiBqYXZhLnV0aWwuQ29sbGVjdGlvbnMudW5tb2RpZmlhYmxlTGlzdCgkbmFtZSRfKTtcbiIKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyAkdHlwZSQgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCkge1xuIgogICAgICIgIHJldHVybiAkbmFtZSRfLmdldChpbmRleCk7XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKICAgICAiICAgIGludCBpbmRleCwgJHR5cGUkIHZhbHVlKSB7XG4iCiAgICAgIiRudWxsX2NoZWNrJCIKQEAgLTU0MSwyMSArNjU3LDI4IEBACiAgICAgIiAgJG5hbWUkXy5zZXQoaW5kZXgsIHZhbHVlKTtcbiIKICAgICAiICAkb25fY2hhbmdlZCRcbiIKICAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgYWRkJGNhcGl0YWxpemVkX25hbWUkKCR0eXBlJCB2YWx1ZSkge1xuIgogICAgICIkbnVsbF9jaGVjayQiCiAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCiAgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgogICAgICIgICRvbl9jaGFuZ2VkJFxuIgogICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCiAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8PyBleHRlbmRzICRib3hlZF90eXBlJD4gdmFsdWVzKSB7XG4iCiAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgc3VwZXIuYWRkQWxsKHZhbHVlcywgJG5hbWUkXyk7XG4iCisgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuYWRkQWxsKFxuIgorICAgICIgICAgICB2YWx1ZXMsICRuYW1lJF8pO1xuIgogICAgICIgICRvbl9jaGFuZ2VkJFxuIgogICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKICAgICAiICAkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIgogICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKQEAgLTU2NCwyNCArNjg3LDI0IEBACiAgICAgIn1cbiIpOwogfQogCi12b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSAgY29uc3QgewogICAvLyBub29wIGZvciBwcmltaXRpdmVzCiB9CiAKLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJG5hbWUkXyA9ICRlbXB0eV9saXN0JDtcbiIKICAgICAiJGNsZWFyX211dGFibGVfYml0X2J1aWxkZXIkO1xuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICAvLyBUaGUgY29kZSBiZWxvdyBkb2VzIHR3byBvcHRpbWl6YXRpb25zOgogICAvLyAgIDEuIElmIHRoZSBvdGhlciBsaXN0IGlzIGVtcHR5LCB0aGVyZSdzIG5vdGhpbmcgdG8gZG8uIFRoaXMgZW5zdXJlcyB3ZQpAQCAtNjAxLDcgKzcyNCw3IEBACiAgICAgIn1cbiIpOwogfQogCi12b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCiAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KQEAgLTYxMywyNyArNzM2LDQ1IEBACiAgICAgInJlc3VsdC4kbmFtZSRfID0gJG5hbWUkXztcbiIpOwogfQogCi12b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCisgICAgImlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkKSB7XG4iCisgICAgIiAgJG5hbWUkXyA9IG5ldyBqYXZhLnV0aWwuQXJyYXlMaXN0PCRib3hlZF90eXBlJD4oKTtcbiIKKyAgICAiICAkc2V0X211dGFibGVfYml0X3BhcnNlciQ7XG4iCisgICAgIn1cbiIKICAgICAiJG5hbWUkXy5hZGQoaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpKTtcbiIpOwogfQogCi12b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgImludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTtcbiIKICAgICAiaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7XG4iCisgICAgImlmICghJGdldF9tdXRhYmxlX2JpdF9wYXJzZXIkICYmIGlucHV0LmdldEJ5dGVzVW50aWxMaW1pdCgpID4gMCkge1xuIgorICAgICIgICRuYW1lJF8gPSBuZXcgamF2YS51dGlsLkFycmF5TGlzdDwkYm94ZWRfdHlwZSQ+KCk7XG4iCisgICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgorICAgICJ9XG4iCiAgICAgIndoaWxlIChpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHtcbiIKLSAgICAiICBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpKTtcbiIKKyAgICAiICAkbmFtZSRfLmFkZChpbnB1dC5yZWFkJGNhcGl0YWxpemVkX3R5cGUkKCkpO1xuIgogICAgICJ9XG4iCiAgICAgImlucHV0LnBvcExpbWl0KGxpbWl0KTtcbiIpOwogfQogCi12b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gamF2YS51dGlsLkNvbGxlY3Rpb25zLnVubW9kaWZpYWJsZUxpc3QoJG5hbWUkXyk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CisgICAgLy8gV2UgaW52b2tlIGdldFNlcmlhbGl6ZWRTaXplIGluIHdyaXRlVG8gZm9yIG1lc3NhZ2VzIHRoYXQgaGF2ZSBwYWNrZWQKKyAgICAvLyBmaWVsZHMgaW4gSW1tdXRhYmxlTWVzc2FnZUdlbmVyYXRvcjo6R2VuZXJhdGVNZXNzYWdlU2VyaWFsaXphdGlvbk1ldGhvZHMuCisgICAgLy8gVGhhdCBtYWtlcyBpdCBzYWZlIHRvIHJlbHkgb24gdGhlIG1lbW9pemVkIHNpemUgaGVyZS4KICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpID4gMCkge1xuIgogICAgICAgIiAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoJHRhZyQpO1xuIgpAQCAtNjUwLDcgKzc5MSw3IEBACiAgIH0KIH0KIAotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJ7XG4iCkBAIC02NzEsNyArODEyLDcgQEAKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAic2l6ZSArPSBkYXRhU2l6ZTtcbiIpOwogCi0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChkZXNjcmlwdG9yXy0+aXNfcGFja2VkKCkpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICAgImlmICghZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLmlzRW1wdHkoKSkge1xuIgogICAgICAgIiAgc2l6ZSArPSAkdGFnX3NpemUkO1xuIgpAQCAtNjg0LDcgKzgyNSw3IEBACiAgIH0KIAogICAvLyBjYWNoZSB0aGUgZGF0YSBzaXplIGZvciBwYWNrZWQgZmllbGRzLgotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSkgeworICBpZiAoZGVzY3JpcHRvcl8tPmlzX3BhY2tlZCgpKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAgICIkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gZGF0YVNpemU7XG4iKTsKICAgfQpAQCAtNjkzLDE0ICs4MzQsMTQgQEAKICAgcHJpbnRlci0+UHJpbnQoIn1cbiIpOwogfQogCi12b2lkIFJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpXG4iCiAgICAgIiAgICAuZXF1YWxzKG90aGVyLmdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSk7XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpID4gMCkge1xuIgpAQCAtNzA5LDcgKzg1MCw3IEBACiAgICAgIn1cbiIpOwogfQogCi1zdHJpbmcgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcjo6R2V0Qm94ZWRUeXBlKCkgY29uc3Qgeworc3RyaW5nIFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKICAgcmV0dXJuIEJveGVkUHJpbWl0aXZlVHlwZU5hbWUoR2V0SmF2YVR5cGUoZGVzY3JpcHRvcl8pKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3ByaW1pdGl2ZV9maWVsZC5oCmluZGV4IDc5MDBmYWMuLmQwY2QxMmQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGQuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQxLDE2ICs0MSwyNiBAQAogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgbmFtZXNwYWNlIGphdmEgeworICAgICAgY2xhc3MgQ29udGV4dDsgICAgICAgICAgIC8vIGNvbnRleHQuaAorICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7IC8vIG5hbWVfcmVzb2x2ZXIuaAorICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGNvbXBpbGVyIHsKIG5hbWVzcGFjZSBqYXZhIHsKIAotY2xhc3MgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworY2xhc3MgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7Ci0gIH5QcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOworICBleHBsaWNpdCBJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKIAotICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKICAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKQEAgLTYxLDYgKzcxLDcgQEAKICAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CkBAIC02OSwyMiArODAsNDcgQEAKIAogICBzdHJpbmcgR2V0Qm94ZWRUeXBlKCkgY29uc3Q7CiAKLSBwcml2YXRlOgorIHByb3RlY3RlZDoKICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOwogICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKICAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CiAKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IpOwogfTsKIAotY2xhc3MgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvciA6IHB1YmxpYyBGaWVsZEdlbmVyYXRvciB7CitjbGFzcyBJbW11dGFibGVQcmltaXRpdmVPbmVvZkZpZWxkR2VuZXJhdG9yCisgICAgOiBwdWJsaWMgSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LCBpbnQgYnVpbGRlckJpdEluZGV4KTsKLSAgflJlcGVhdGVkUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoKTsKKyAgSW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlUHJpbWl0aXZlT25lb2ZGaWVsZEdlbmVyYXRvcigpOwogCi0gIC8vIGltcGxlbWVudHMgRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZvaWQgR2VuZXJhdGVNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEltbXV0YWJsZVByaW1pdGl2ZU9uZW9mRmllbGRHZW5lcmF0b3IpOworfTsKKworY2xhc3MgUmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcgorICAgIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJlcGVhdGVkSW1tdXRhYmxlUHJpbWl0aXZlRmllbGRHZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgdmlydHVhbCB+UmVwZWF0ZWRJbW11dGFibGVQcmltaXRpdmVGaWVsZEdlbmVyYXRvcigpOworCisgIC8vIGltcGxlbWVudHMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIGludCBHZXROdW1CaXRzRm9yTWVzc2FnZSgpIGNvbnN0OwogICBpbnQgR2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUludGVyZmFjZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtOTYsNiArMTMyLDcgQEAKICAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwpAQCAtMTA5LDggKzE0NiwxMCBAQAogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CiAgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwogICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKIAotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRQcmltaXRpdmVGaWVsZEdlbmVyYXRvcik7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZEltbXV0YWJsZVByaW1pdGl2ZUZpZWxkR2VuZXJhdG9yKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGRfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGRfbGl0ZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkX2xpdGUuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGRfbGl0ZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkX2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGRfbGl0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9wcmltaXRpdmVfZmllbGRfbGl0ZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfcHJpbWl0aXZlX2ZpZWxkX2xpdGUuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYwppbmRleCAxYWU0ZjQ2Li4xMWJmYzEyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzMsOSArMzMsMTIgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKQEAgLTQ4LDggKzUxLDE4IEBACiAKIFNlcnZpY2VHZW5lcmF0b3I6On5TZXJ2aWNlR2VuZXJhdG9yKCkge30KIAotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZShpbzo6UHJpbnRlciogcHJpbnRlcikgewotICBib29sIGlzX293bl9maWxlID0gZGVzY3JpcHRvcl8tPmZpbGUoKS0+b3B0aW9ucygpLmphdmFfbXVsdGlwbGVfZmlsZXMoKTsKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0ltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoCisgICAgY29uc3QgU2VydmljZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIENvbnRleHQqIGNvbnRleHQpCisgICAgOiBTZXJ2aWNlR2VuZXJhdG9yKGRlc2NyaXB0b3IpLCBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkge30KKworSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6fkltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IoKSB7fQorCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIGJvb2wgaXNfb3duX2ZpbGUgPQorICAgIE11bHRpcGxlSmF2YUZpbGVzKGRlc2NyaXB0b3JfLT5maWxlKCksIC8qIGltbXV0YWJsZSA9ICovIHRydWUpOworICBXcml0ZVNlcnZpY2VEb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgInB1YmxpYyAkc3RhdGljJCBhYnN0cmFjdCBjbGFzcyAkY2xhc3NuYW1lJFxuIgogICAgICIgICAgaW1wbGVtZW50cyBjb20uZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2Uge1xuIiwKQEAgLTc1LDcgKzg4LDcgQEAKICAgICAiICAgIGdldERlc2NyaXB0b3IoKSB7XG4iCiAgICAgIiAgcmV0dXJuICRmaWxlJC5nZXREZXNjcmlwdG9yKCkuZ2V0U2VydmljZXMoKS5nZXQoJGluZGV4JCk7XG4iCiAgICAgIn1cbiIsCi0gICAgImZpbGUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8tPmZpbGUoKSksCisgICAgImZpbGUiLCBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKGRlc2NyaXB0b3JfLT5maWxlKCkpLAogICAgICJpbmRleCIsIFNpbXBsZUl0b2EoZGVzY3JpcHRvcl8tPmluZGV4KCkpKTsKICAgR2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShwcmludGVyKTsKIApAQCAtODYsMTEgKzk5LDE4IEBACiAgIEdlbmVyYXRlU3R1YihwcmludGVyKTsKICAgR2VuZXJhdGVCbG9ja2luZ1N0dWIocHJpbnRlcik7CiAKKyAgLy8gQWRkIGFuIGluc2VydGlvbiBwb2ludC4KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgIlxuIgorICAgICIvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICJmdWxsX25hbWUiLCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkpOworCiAgIHByaW50ZXItPk91dGRlbnQoKTsKICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CiB9CiAKLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVHZXREZXNjcmlwdG9yRm9yVHlwZShpbzo6UHJpbnRlciogcHJpbnRlcikgewordm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUdldERlc2NyaXB0b3JGb3JUeXBlKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIHByaW50ZXItPlByaW50KAogICAgICJwdWJsaWMgZmluYWwgY29tLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9ycy5TZXJ2aWNlRGVzY3JpcHRvclxuIgogICAgICIgICAgZ2V0RGVzY3JpcHRvckZvclR5cGUoKSB7XG4iCkBAIC05OCw3ICsxMTgsNyBAQAogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcikgewordm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUludGVyZmFjZShpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBwcmludGVyLT5QcmludCgicHVibGljIGludGVyZmFjZSBJbnRlcmZhY2Uge1xuIik7CiAgIHByaW50ZXItPkluZGVudCgpOwogICBHZW5lcmF0ZUFic3RyYWN0TWV0aG9kcyhwcmludGVyKTsKQEAgLTEwNiw3ICsxMjYsNyBAQAogICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKIH0KIAotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU5ld1JlZmxlY3RpdmVTZXJ2aWNlTWV0aG9kKAordm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU5ld1JlZmxlY3RpdmVTZXJ2aWNlTWV0aG9kKAogICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIHByaW50ZXItPlByaW50KAogICAgICJwdWJsaWMgc3RhdGljIGNvbS5nb29nbGUucHJvdG9idWYuU2VydmljZSBuZXdSZWZsZWN0aXZlU2VydmljZShcbiIKQEAgLTEzMyw3ICsxNTMsNyBAQAogICBwcmludGVyLT5QcmludCgifVxuXG4iKTsKIH0KIAotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZU5ld1JlZmxlY3RpdmVCbG9ja2luZ1NlcnZpY2VNZXRob2QoCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTmV3UmVmbGVjdGl2ZUJsb2NraW5nU2VydmljZU1ldGhvZCgKICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBwcmludGVyLT5QcmludCgKICAgICAicHVibGljIHN0YXRpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nU2VydmljZVxuIgpAQCAtMTU0LDE1ICsxNzQsMTYgQEAKICAgcHJpbnRlci0+UHJpbnQoIn1cblxuIik7CiB9CiAKLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVBYnN0cmFjdE1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKK3ZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVBYnN0cmFjdE1ldGhvZHMoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+bWV0aG9kX2NvdW50KCk7IGkrKykgewogICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3JfLT5tZXRob2QoaSk7CisgICAgV3JpdGVNZXRob2REb2NDb21tZW50KHByaW50ZXIsIG1ldGhvZCk7CiAgICAgR2VuZXJhdGVNZXRob2RTaWduYXR1cmUocHJpbnRlciwgbWV0aG9kLCBJU19BQlNUUkFDVCk7CiAgICAgcHJpbnRlci0+UHJpbnQoIjtcblxuIik7CiAgIH0KIH0KIAotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUNhbGxNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKK3ZvaWQgSW1tdXRhYmxlU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVDYWxsTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIHByaW50ZXItPlByaW50KAogICAgICJcbiIKICAgICAicHVibGljIGZpbmFsIHZvaWQgY2FsbE1ldGhvZChcbiIKQEAgLTE4NSw4ICsyMDYsMTAgQEAKICAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CiAgICAgdmFyc1siaW5kZXgiXSA9IFNpbXBsZUl0b2EoaSk7CiAgICAgdmFyc1sibWV0aG9kIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCk7Ci0gICAgdmFyc1siaW5wdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7Ci0gICAgdmFyc1sib3V0cHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKKyAgICB2YXJzWyJpbnB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKKyAgICAgICAgbWV0aG9kLT5pbnB1dF90eXBlKCkpOworICAgIHZhcnNbIm91dHB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKKyAgICAgICAgbWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgImNhc2UgJGluZGV4JDpcbiIKICAgICAgICIgIHRoaXMuJG1ldGhvZCQoY29udHJvbGxlciwgKCRpbnB1dCQpcmVxdWVzdCxcbiIKQEAgLTIwOCw3ICsyMzEsOCBAQAogICAgICJcbiIpOwogfQogCi12b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2FsbEJsb2NraW5nTWV0aG9kKGlvOjpQcmludGVyKiBwcmludGVyKSB7Cit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlQ2FsbEJsb2NraW5nTWV0aG9kKAorICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CiAgIHByaW50ZXItPlByaW50KAogICAgICJcbiIKICAgICAicHVibGljIGZpbmFsIGNvbS5nb29nbGUucHJvdG9idWYuTWVzc2FnZSBjYWxsQmxvY2tpbmdNZXRob2QoXG4iCkBAIC0yMzAsOCArMjU0LDEwIEBACiAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwogICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOwogICAgIHZhcnNbIm1ldGhvZCJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpOwotICAgIHZhcnNbImlucHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOwotICAgIHZhcnNbIm91dHB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgICAgdmFyc1siaW5wdXQiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoCisgICAgICAgIG1ldGhvZC0+aW5wdXRfdHlwZSgpKTsKKyAgICB2YXJzWyJvdXRwdXQiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUoCisgICAgICAgIG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CiAgICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAgICJjYXNlICRpbmRleCQ6XG4iCiAgICAgICAiICByZXR1cm4gaW1wbC4kbWV0aG9kJChjb250cm9sbGVyLCAoJGlucHV0JClyZXF1ZXN0KTtcbiIpOwpAQCAtMjUwLDcgKzI3Niw3IEBACiAgICAgIlxuIik7CiB9CiAKLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlR2V0UHJvdG90eXBlKFJlcXVlc3RPclJlc3BvbnNlIHdoaWNoLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6UHJpbnRlciogcHJpbnRlcikgewogICAvKgogICAgKiBUT0RPKGNwb3ZpcmspOiBUaGUgZXhjZXB0aW9uIG1lc3NhZ2Ugc2F5cyAiU2VydmljZS5mb28iIHdoZW4gaXQgbWF5IGJlCkBAIC0yNzQsNyArMzAwLDcgQEAKICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QgPSBkZXNjcmlwdG9yXy0+bWV0aG9kKGkpOwogICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKICAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKLSAgICB2YXJzWyJ0eXBlIl0gPSBDbGFzc05hbWUoCisgICAgdmFyc1sidHlwZSJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKICAgICAgICh3aGljaCA9PSBSRVFVRVNUKSA/IG1ldGhvZC0+aW5wdXRfdHlwZSgpIDogbWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgImNhc2UgJGluZGV4JDpcbiIKQEAgLTI5NCw3ICszMjAsNyBAQAogICAgICJcbiIpOwogfQogCi12b2lkIFNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcikgewordm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZVN0dWIoaW86OlByaW50ZXIqIHByaW50ZXIpIHsKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgInB1YmxpYyBzdGF0aWMgU3R1YiBuZXdTdHViKFxuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDaGFubmVsIGNoYW5uZWwpIHtcbiIKQEAgLTMwMyw3ICszMjksNyBAQAogICAgICJcbiIKICAgICAicHVibGljIHN0YXRpYyBmaW5hbCBjbGFzcyBTdHViIGV4dGVuZHMgJGNsYXNzbmFtZSQgaW1wbGVtZW50cyBJbnRlcmZhY2UgeyIKICAgICAiXG4iLAotICAgICJjbGFzc25hbWUiLCBDbGFzc05hbWUoZGVzY3JpcHRvcl8pKTsKKyAgICAiY2xhc3NuYW1lIiwgbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShkZXNjcmlwdG9yXykpOwogICBwcmludGVyLT5JbmRlbnQoKTsKIAogICBwcmludGVyLT5QcmludCgKQEAgLTMyNiw3ICszNTIsOCBAQAogCiAgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwogICAgIHZhcnNbImluZGV4Il0gPSBTaW1wbGVJdG9hKGkpOwotICAgIHZhcnNbIm91dHB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+b3V0cHV0X3R5cGUoKSk7CisgICAgdmFyc1sib3V0cHV0Il0gPSBuYW1lX3Jlc29sdmVyXy0+R2V0SW1tdXRhYmxlQ2xhc3NOYW1lKAorICAgICAgICBtZXRob2QtPm91dHB1dF90eXBlKCkpOwogICAgIHByaW50ZXItPlByaW50KHZhcnMsCiAgICAgICAiY2hhbm5lbC5jYWxsTWV0aG9kKFxuIgogICAgICAgIiAgZ2V0RGVzY3JpcHRvcigpLmdldE1ldGhvZHMoKS5nZXQoJGluZGV4JCksXG4iCkBAIC0zNDgsNyArMzc1LDcgQEAKICAgICAiXG4iKTsKIH0KIAotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUJsb2NraW5nU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcikgewordm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUJsb2NraW5nU3R1Yihpbzo6UHJpbnRlciogcHJpbnRlcikgewogICBwcmludGVyLT5QcmludCgKICAgICAicHVibGljIHN0YXRpYyBCbG9ja2luZ0ludGVyZmFjZSBuZXdCbG9ja2luZ1N0dWIoXG4iCiAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJsb2NraW5nUnBjQ2hhbm5lbCBjaGFubmVsKSB7XG4iCkBAIC0zOTAsNyArNDE3LDggQEAKIAogICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKICAgICB2YXJzWyJpbmRleCJdID0gU2ltcGxlSXRvYShpKTsKLSAgICB2YXJzWyJvdXRwdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworICAgIHZhcnNbIm91dHB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZSgKKyAgICAgICAgbWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKICAgICBwcmludGVyLT5QcmludCh2YXJzLAogICAgICAgInJldHVybiAoJG91dHB1dCQpIGNoYW5uZWwuY2FsbEJsb2NraW5nTWV0aG9kKFxuIgogICAgICAgIiAgZ2V0RGVzY3JpcHRvcigpLmdldE1ldGhvZHMoKS5nZXQoJGluZGV4JCksXG4iCkBAIC00MDgsMTMgKzQzNiwxMyBAQAogICBwcmludGVyLT5QcmludCgifVxuIik7CiB9CiAKLXZvaWQgU2VydmljZUdlbmVyYXRvcjo6R2VuZXJhdGVNZXRob2RTaWduYXR1cmUoaW86OlByaW50ZXIqIHByaW50ZXIsCit2b2lkIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3I6OkdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlKGlvOjpQcmludGVyKiBwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElzQWJzdHJhY3QgaXNfYWJzdHJhY3QpIHsKICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOwogICB2YXJzWyJuYW1lIl0gPSBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKG1ldGhvZCk7Ci0gIHZhcnNbImlucHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOwotICB2YXJzWyJvdXRwdXQiXSA9IENsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOworICB2YXJzWyJpbnB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPmlucHV0X3R5cGUoKSk7CisgIHZhcnNbIm91dHB1dCJdID0gbmFtZV9yZXNvbHZlcl8tPkdldEltbXV0YWJsZUNsYXNzTmFtZShtZXRob2QtPm91dHB1dF90eXBlKCkpOwogICB2YXJzWyJhYnN0cmFjdCJdID0gKGlzX2Fic3RyYWN0ID09IElTX0FCU1RSQUNUKSA/ICJhYnN0cmFjdCIgOiAiIjsKICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAicHVibGljICRhYnN0cmFjdCQgdm9pZCAkbmFtZSQoXG4iCkBAIC00MjMsMTMgKzQ1MSwxMyBAQAogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5ScGNDYWxsYmFjazwkb3V0cHV0JD4gZG9uZSkiKTsKIH0KIAotdm9pZCBTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUJsb2NraW5nTWV0aG9kU2lnbmF0dXJlKAordm9pZCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yOjpHZW5lcmF0ZUJsb2NraW5nTWV0aG9kU2lnbmF0dXJlKAogICAgIGlvOjpQcmludGVyKiBwcmludGVyLAogICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCkgewogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CiAgIHZhcnNbIm1ldGhvZCJdID0gVW5kZXJzY29yZXNUb0NhbWVsQ2FzZShtZXRob2QpOwotICB2YXJzWyJpbnB1dCJdID0gQ2xhc3NOYW1lKG1ldGhvZC0+aW5wdXRfdHlwZSgpKTsKLSAgdmFyc1sib3V0cHV0Il0gPSBDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKKyAgdmFyc1siaW5wdXQiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUobWV0aG9kLT5pbnB1dF90eXBlKCkpOworICB2YXJzWyJvdXRwdXQiXSA9IG5hbWVfcmVzb2x2ZXJfLT5HZXRJbW11dGFibGVDbGFzc05hbWUobWV0aG9kLT5vdXRwdXRfdHlwZSgpKTsKICAgcHJpbnRlci0+UHJpbnQodmFycywKICAgICAiXG4iCiAgICAgInB1YmxpYyAkb3V0cHV0JCAkbWV0aG9kJChcbiIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2VydmljZS5oCmluZGV4IGUwN2VlYmYuLjY3MDdlODIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zZXJ2aWNlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NlcnZpY2UuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDAsOCArNDAsMTQgQEAKIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgeworICBuYW1lc3BhY2UgY29tcGlsZXIgeworICAgIG5hbWVzcGFjZSBqYXZhIHsKKyAgICAgIGNsYXNzIENvbnRleHQ7ICAgICAgICAgICAgLy8gY29udGV4dC5oCisgICAgICBjbGFzcyBDbGFzc05hbWVSZXNvbHZlcjsgIC8vIG5hbWVfcmVzb2x2ZXIuaAorICAgIH0KKyAgfQogICBuYW1lc3BhY2UgaW8gewotICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgIC8vIHByaW50ZXIuaAorICAgIGNsYXNzIFByaW50ZXI7ICAgICAgICAgICAgICAvLyBwcmludGVyLmgKICAgfQogfQogCkBAIC01Miw5ICs1OCwyNyBAQAogY2xhc3MgU2VydmljZUdlbmVyYXRvciB7CiAgcHVibGljOgogICBleHBsaWNpdCBTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKTsKLSAgflNlcnZpY2VHZW5lcmF0b3IoKTsKKyAgdmlydHVhbCB+U2VydmljZUdlbmVyYXRvcigpOwogCi0gIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpOworICB2aXJ0dWFsIHZvaWQgR2VuZXJhdGUoaW86OlByaW50ZXIqIHByaW50ZXIpID0gMDsKKworICBlbnVtIFJlcXVlc3RPclJlc3BvbnNlIHsgUkVRVUVTVCwgUkVTUE9OU0UgfTsKKyAgZW51bSBJc0Fic3RyYWN0IHsgSVNfQUJTVFJBQ1QsIElTX0NPTkNSRVRFIH07CisKKyBwcm90ZWN0ZWQ6CisgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKKworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTZXJ2aWNlR2VuZXJhdG9yKTsKK307CisKK2NsYXNzIEltbXV0YWJsZVNlcnZpY2VHZW5lcmF0b3IgOiBwdWJsaWMgU2VydmljZUdlbmVyYXRvciB7CisgcHVibGljOgorICBleHBsaWNpdCBJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnRleHQqIGNvbnRleHQpOworICB2aXJ0dWFsIH5JbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yKCk7CisKKyAgdmlydHVhbCB2b2lkIEdlbmVyYXRlKGlvOjpQcmludGVyKiBwcmludGVyKTsKIAogIHByaXZhdGU6CiAKQEAgLTgwLDcgKzEwNCw2IEBACiAgIHZvaWQgR2VuZXJhdGVDYWxsQmxvY2tpbmdNZXRob2QoaW86OlByaW50ZXIqIHByaW50ZXIpOwogCiAgIC8vIEdlbmVyYXRlIHRoZSBpbXBsZW1lbnRhdGlvbnMgb2YgU2VydmljZS5nZXR7UmVxdWVzdCxSZXNwb25zZX1Qcm90b3R5cGUoKS4KLSAgZW51bSBSZXF1ZXN0T3JSZXNwb25zZSB7IFJFUVVFU1QsIFJFU1BPTlNFIH07CiAgIHZvaWQgR2VuZXJhdGVHZXRQcm90b3R5cGUoUmVxdWVzdE9yUmVzcG9uc2Ugd2hpY2gsIGlvOjpQcmludGVyKiBwcmludGVyKTsKIAogICAvLyBHZW5lcmF0ZSBhIHN0dWIgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNlcnZpY2UuCkBAIC04OCw3ICsxMTEsNiBAQAogCiAgIC8vIEdlbmVyYXRlIGEgbWV0aG9kIHNpZ25hdHVyZSwgcG9zc2libHkgYWJzdHJhY3QsIHdpdGhvdXQgYm9keSBvciB0cmFpbGluZwogICAvLyBzZW1pY29sb24uCi0gIGVudW0gSXNBYnN0cmFjdCB7IElTX0FCU1RSQUNULCBJU19DT05DUkVURSB9OwogICB2b2lkIEdlbmVyYXRlTWV0aG9kU2lnbmF0dXJlKGlvOjpQcmludGVyKiBwcmludGVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJc0Fic3RyYWN0IGlzX2Fic3RyYWN0KTsKQEAgLTEwMCw5ICsxMjIsOSBAQAogICB2b2lkIEdlbmVyYXRlQmxvY2tpbmdNZXRob2RTaWduYXR1cmUoaW86OlByaW50ZXIqIHByaW50ZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yKiBtZXRob2QpOwogCi0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBkZXNjcmlwdG9yXzsKLQotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU2VydmljZUdlbmVyYXRvcik7CisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVTZXJ2aWNlR2VuZXJhdG9yKTsKIH07CiAKIH0gIC8vIG5hbWVzcGFjZSBqYXZhCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zaGFyZWRfY29kZV9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc2hhcmVkX2NvZGVfZ2VuZXJhdG9yLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zaGFyZWRfY29kZV9nZW5lcmF0b3IuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zaGFyZWRfY29kZV9nZW5lcmF0b3IuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zaGFyZWRfY29kZV9nZW5lcmF0b3IuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3NoYXJlZF9jb2RlX2dlbmVyYXRvci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5jYwppbmRleCAyMjIyODViLi5iNjdlZWI1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM2LDkgKzM2LDEzIEBACiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHN0cmluZz4KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9jb250ZXh0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9kb2NfY29tbWVudC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfaGVscGVycy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfbmFtZV9yZXNvbHZlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgpAQCAtNTYsMTcgKzYwLDE2IEBACiB2b2lkIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkR2VuZXJhdG9ySW5mbyogaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFwPHN0cmluZywgc3RyaW5nPiogdmFyaWFibGVzKSB7Ci0gICgqdmFyaWFibGVzKVsibmFtZSJdID0KLSAgICBVbmRlcnNjb3Jlc1RvQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImNhcGl0YWxpemVkX25hbWUiXSA9Ci0gICAgVW5kZXJzY29yZXNUb0NhcGl0YWxpemVkQ2FtZWxDYXNlKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbImNvbnN0YW50X25hbWUiXSA9IEZpZWxkQ29uc3RhbnROYW1lKGRlc2NyaXB0b3IpOwotICAoKnZhcmlhYmxlcylbIm51bWJlciJdID0gU2ltcGxlSXRvYShkZXNjcmlwdG9yLT5udW1iZXIoKSk7CisgIFNldENvbW1vbkZpZWxkVmFyaWFibGVzKGRlc2NyaXB0b3IsIGluZm8sIHZhcmlhYmxlcyk7CisKICAgKCp2YXJpYWJsZXMpWyJlbXB0eV9saXN0Il0gPSAiY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nQXJyYXlMaXN0LkVNUFRZIjsKIAotICAoKnZhcmlhYmxlcylbImRlZmF1bHQiXSA9IERlZmF1bHRWYWx1ZShkZXNjcmlwdG9yKTsKLSAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0X2luaXQiXSA9ICgiPSAiICsgRGVmYXVsdFZhbHVlKGRlc2NyaXB0b3IpKTsKKyAgKCp2YXJpYWJsZXMpWyJkZWZhdWx0Il0gPSBJbW11dGFibGVEZWZhdWx0VmFsdWUoZGVzY3JpcHRvciwgbmFtZV9yZXNvbHZlcik7CisgICgqdmFyaWFibGVzKVsiZGVmYXVsdF9pbml0Il0gPQorICAgICAgIj0gIiArIEltbXV0YWJsZURlZmF1bHRWYWx1ZShkZXNjcmlwdG9yLCBuYW1lX3Jlc29sdmVyKTsKICAgKCp2YXJpYWJsZXMpWyJjYXBpdGFsaXplZF90eXBlIl0gPSAiU3RyaW5nIjsKICAgKCp2YXJpYWJsZXMpWyJ0YWciXSA9IFNpbXBsZUl0b2EoV2lyZUZvcm1hdDo6TWFrZVRhZyhkZXNjcmlwdG9yKSk7CiAgICgqdmFyaWFibGVzKVsidGFnX3NpemUiXSA9IFNpbXBsZUl0b2EoCkBAIC03NSwyNyArNzgsNTIgQEAKICAgICAgICIgIGlmICh2YWx1ZSA9PSBudWxsKSB7XG4iCiAgICAgICAiICAgIHRocm93IG5ldyBOdWxsUG9pbnRlckV4Y2VwdGlvbigpO1xuIgogICAgICAgIiAgfVxuIjsKKyAgKCp2YXJpYWJsZXMpWyJ3cml0ZVN0cmluZyJdID0KKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZE1lc3NhZ2Uud3JpdGVTdHJpbmciOworICAoKnZhcmlhYmxlcylbImNvbXB1dGVTdHJpbmdTaXplIl0gPQorICAgICAgImNvbS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkTWVzc2FnZS5jb21wdXRlU3RyaW5nU2l6ZSI7CiAKICAgLy8gVE9ETyhiaXJkbyk6IEFkZCBAZGVwcmVjYXRlZCBqYXZhZG9jIHdoZW4gZ2VuZXJhdGluZyBqYXZhZG9jIGlzIHN1cHBvcnRlZAogICAvLyBieSB0aGUgcHJvdG8gY29tcGlsZXIKICAgKCp2YXJpYWJsZXMpWyJkZXByZWNhdGlvbiJdID0gZGVzY3JpcHRvci0+b3B0aW9ucygpLmRlcHJlY2F0ZWQoKQogICAgICAgPyAiQGphdmEubGFuZy5EZXByZWNhdGVkICIgOiAiIjsKLSAgKCp2YXJpYWJsZXMpWyJvbl9jaGFuZ2VkIl0gPQotICAgICAgSGFzRGVzY3JpcHRvck1ldGhvZHMoZGVzY3JpcHRvci0+Y29udGFpbmluZ190eXBlKCkpID8gIm9uQ2hhbmdlZCgpOyIgOiAiIjsKKyAgKCp2YXJpYWJsZXMpWyJvbl9jaGFuZ2VkIl0gPSAib25DaGFuZ2VkKCk7IjsKIAotICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCi0gICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3ItPmZpbGUoKSkpIHsKKyAgICAvLyBGb3Igc2luZ3VsYXIgbWVzc2FnZXMgYW5kIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHRoZSBoYXNGaWVsZCBiaXQuCisgICAgKCp2YXJpYWJsZXMpWyJnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPSBHZW5lcmF0ZUdldEJpdChtZXNzYWdlQml0SW5kZXgpOworICAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVHZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKIAotICAoKnZhcmlhYmxlcylbImdldF9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7Ci0gICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KTsKLSAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9Ci0gICAgICBHZW5lcmF0ZUNsZWFyQml0KGJ1aWxkZXJCaXRJbmRleCk7CisgICAgLy8gTm90ZSB0aGF0IHRoZXNlIGhhdmUgYSB0cmFpbGluZyAiOyIuCisgICAgKCp2YXJpYWJsZXMpWyJzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlIl0gPQorICAgICAgICBHZW5lcmF0ZVNldEJpdChtZXNzYWdlQml0SW5kZXgpICsgIjsiOworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KKyAgICAgICAgR2VuZXJhdGVTZXRCaXQoYnVpbGRlckJpdEluZGV4KSArICI7IjsKKyAgICAoKnZhcmlhYmxlcylbImNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0KKyAgICAgICAgR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpICsgIjsiOwogCi0gIC8vIEZvciByZXBhdGVkIGJ1aWxkZXJzLCBvbmUgYml0IGlzIHVzZWQgZm9yIHdoZXRoZXIgdGhlIGFycmF5IGlzIGltbXV0YWJsZS4KKyAgICAoKnZhcmlhYmxlcylbImlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSJdID0gR2VuZXJhdGVHZXRCaXQobWVzc2FnZUJpdEluZGV4KTsKKyAgfSBlbHNlIHsKKyAgICAoKnZhcmlhYmxlcylbInNldF9oYXNfZmllbGRfYml0X21lc3NhZ2UiXSA9ICIiOworICAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciJdID0gIiI7CisgICAgKCp2YXJpYWJsZXMpWyJjbGVhcl9oYXNfZmllbGRfYml0X2J1aWxkZXIiXSA9ICIiOworCisgICAgKCp2YXJpYWJsZXMpWyJpc19maWVsZF9wcmVzZW50X21lc3NhZ2UiXSA9CisgICAgICAgICIhZ2V0IiArICgqdmFyaWFibGVzKVsiY2FwaXRhbGl6ZWRfbmFtZSJdICsgIkJ5dGVzKCkuaXNFbXB0eSgpIjsKKyAgfQorCisgIC8vIEZvciByZXBlYXRlZCBidWlsZGVycywgb25lIGJpdCBpcyB1c2VkIGZvciB3aGV0aGVyIHRoZSBhcnJheSBpcyBpbW11dGFibGUuCiAgICgqdmFyaWFibGVzKVsiZ2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlR2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CiAgICgqdmFyaWFibGVzKVsic2V0X211dGFibGVfYml0X2J1aWxkZXIiXSA9IEdlbmVyYXRlU2V0Qml0KGJ1aWxkZXJCaXRJbmRleCk7CiAgICgqdmFyaWFibGVzKVsiY2xlYXJfbXV0YWJsZV9iaXRfYnVpbGRlciJdID0gR2VuZXJhdGVDbGVhckJpdChidWlsZGVyQml0SW5kZXgpOwogCisgIC8vIEZvciByZXBlYXRlZCBmaWVsZHMsIG9uZSBiaXQgaXMgdXNlZCBmb3Igd2hldGhlciB0aGUgYXJyYXkgaXMgaW1tdXRhYmxlCisgIC8vIGluIHRoZSBwYXJzaW5nIGNvbnN0cnVjdG9yLgorICAoKnZhcmlhYmxlcylbImdldF9tdXRhYmxlX2JpdF9wYXJzZXIiXSA9CisgICAgICBHZW5lcmF0ZUdldEJpdE11dGFibGVMb2NhbChidWlsZGVyQml0SW5kZXgpOworICAoKnZhcmlhYmxlcylbInNldF9tdXRhYmxlX2JpdF9wYXJzZXIiXSA9CisgICAgICBHZW5lcmF0ZVNldEJpdE11dGFibGVMb2NhbChidWlsZGVyQml0SW5kZXgpOworCiAgICgqdmFyaWFibGVzKVsiZ2V0X2hhc19maWVsZF9iaXRfZnJvbV9sb2NhbCJdID0KICAgICAgIEdlbmVyYXRlR2V0Qml0RnJvbUxvY2FsKGJ1aWxkZXJCaXRJbmRleCk7CiAgICgqdmFyaWFibGVzKVsic2V0X2hhc19maWVsZF9iaXRfdG9fbG9jYWwiXSA9CkBAIC0xMDYsMjMgKzEzNCwyNiBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLVN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4KQorSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQogICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCi0gICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpIHsKKyAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCksIGNvbnRleHRfKGNvbnRleHQpLAorICAgIG5hbWVfcmVzb2x2ZXJfKGNvbnRleHQtPkdldE5hbWVSZXNvbHZlcigpKSB7CiAgIFNldFByaW1pdGl2ZVZhcmlhYmxlcyhkZXNjcmlwdG9yLCBtZXNzYWdlQml0SW5kZXgsIGJ1aWxkZXJCaXRJbmRleCwKLSAgICAgICAgICAgICAgICAgICAgICAgICZ2YXJpYWJsZXNfKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRleHQtPkdldEZpZWxkR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVfcmVzb2x2ZXJfLCAmdmFyaWFibGVzXyk7CiB9CiAKLVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjp+U3RyaW5nRmllbGRHZW5lcmF0b3IoKSB7fQorSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6On5JbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigpIHt9CiAKLWludCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7CitpbnQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgewogICByZXR1cm4gMTsKIH0KIAotaW50IFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXROdW1CaXRzRm9yQnVpbGRlcigpIGNvbnN0IHsKK2ludCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7CiAgIHJldHVybiAxOwogfQogCkBAIC0xNTgsMjEgKzE4OSwzNyBAQAogLy8gRm9yIHNpbmdsZSBmaWVsZHMsIHRoZSBsb2dpYyBmb3IgdGhpcyBpcyBkb25lIGluc2lkZSB0aGUgZ2VuZXJhdGVkIGNvZGUuIEZvcgogLy8gcmVwZWF0ZWQgZmllbGRzLCB0aGUgbG9naWMgaXMgZG9uZSBpbiBMYXp5U3RyaW5nQXJyYXlMaXN0IGFuZAogLy8gVW5tb2RpZmlhYmxlTGF6eVN0cmluZ0xpc3QuCi12b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpO1xuIik7CisgIH0KKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKTtcbiIKICAgICAiJGRlcHJlY2F0aW9uJGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCk7XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcygpO1xuIik7CiB9CiAKLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAicHJpdmF0ZSBqYXZhLmxhbmcuT2JqZWN0ICRuYW1lJF87XG4iCi0gICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJDtcbiIKLSAgICAifVxuIik7CisgICAgInByaXZhdGUgdm9sYXRpbGUgamF2YS5sYW5nLk9iamVjdCAkbmFtZSRfO1xuIik7CisgIFByaW50RXh0cmFGaWVsZEluZm8odmFyaWFibGVzXywgcHJpbnRlcik7CiAKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBib29sZWFuIGhhcyRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKKyAgICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQ7XG4iCisgICAgICAifVxuIik7CisgIH0KKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgamF2YS5sYW5nLlN0cmluZyBnZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCiAgICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgPSAkbmFtZSRfO1xuIgpAQCAtMTgxLDE0ICsyMjgsMjQgQEAKICAgICAiICB9IGVsc2Uge1xuIgogICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGJzID0gXG4iCiAgICAgIiAgICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgotICAgICIgICAgamF2YS5sYW5nLlN0cmluZyBzID0gYnMudG9TdHJpbmdVdGY4KCk7XG4iCi0gICAgIiAgICBpZiAoY29tLmdvb2dsZS5wcm90b2J1Zi5JbnRlcm5hbC5pc1ZhbGlkVXRmOChicykpIHtcbiIKLSAgICAiICAgICAgJG5hbWUkXyA9IHM7XG4iCi0gICAgIiAgICB9XG4iCisgICAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIik7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgICAgJG5hbWUkXyA9IHM7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSkge1xuIgorICAgICAgIiAgICAgICRuYW1lJF8gPSBzO1xuIgorICAgICAgIiAgICB9XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIgICAgcmV0dXJuIHM7XG4iCiAgICAgIiAgfVxuIgotICAgICJ9XG4iCi0gICAgInByaXZhdGUgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKCkge1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSB7XG4iCiAgICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgPSAkbmFtZSRfO1xuIgogICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSB7XG4iCiAgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYiA9IFxuIgpAQCAtMjAyLDM4ICsyNTksNzIgQEAKICAgICAifVxuIik7CiB9CiAKLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInByaXZhdGUgamF2YS5sYW5nLk9iamVjdCAkbmFtZSRfICRkZWZhdWx0X2luaXQkO1xuIgotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgotICAgICIgIHJldHVybiAkZ2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iCi0gICAgIn1cbiIpOworICAgICJwcml2YXRlIGphdmEubGFuZy5PYmplY3QgJG5hbWUkXyAkZGVmYXVsdF9pbml0JDtcbiIpOworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICAgIiAgcmV0dXJuICRnZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQogCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKICAgICAiICBqYXZhLmxhbmcuT2JqZWN0IHJlZiA9ICRuYW1lJF87XG4iCiAgICAgIiAgaWYgKCEocmVmIGluc3RhbmNlb2YgamF2YS5sYW5nLlN0cmluZykpIHtcbiIKLSAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9ICgoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSByZWYpXG4iCi0gICAgIiAgICAgICAgLnRvU3RyaW5nVXRmOCgpO1xuIgotICAgICIgICAgJG5hbWUkXyA9IHM7XG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPVxuIgorICAgICIgICAgICAgIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKKyAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIik7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgICAgJG5hbWUkXyA9IHM7XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSkge1xuIgorICAgICAgIiAgICAgICRuYW1lJF8gPSBzO1xuIgorICAgICAgIiAgICB9XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIgICAgcmV0dXJuIHM7XG4iCiAgICAgIiAgfSBlbHNlIHtcbiIKICAgICAiICAgIHJldHVybiAoamF2YS5sYW5nLlN0cmluZykgcmVmO1xuIgogICAgICIgIH1cbiIKICAgICAifVxuIik7CiAKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSB7XG4iCisgICAgIiAgamF2YS5sYW5nLk9iamVjdCByZWYgPSAkbmFtZSRfO1xuIgorICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBiID0gXG4iCisgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChcbiIKKyAgICAiICAgICAgICAgICAgKGphdmEubGFuZy5TdHJpbmcpIHJlZik7XG4iCisgICAgIiAgICAkbmFtZSRfID0gYjtcbiIKKyAgICAiICAgIHJldHVybiBiO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkKFxuIgogICAgICIgICAgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgogICAgICIkbnVsbF9jaGVjayQiCi0gICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgorICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIgogICAgICIgICRuYW1lJF8gPSB2YWx1ZTtcbiIKICAgICAiICAkb25fY2hhbmdlZCRcbiIKICAgICAiICByZXR1cm4gdGhpcztcbiIKLSAgICAifVxuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCi0gICAgIiAgJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iKTsKKyAgICAiICAkY2xlYXJfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJFxuIik7CiAgIC8vIFRoZSBkZWZhdWx0IHZhbHVlIGlzIG5vdCBhIHNpbXBsZSBsaXRlcmFsIHNvIHdlIHdhbnQgdG8gYXZvaWQgZXhlY3V0aW5nCiAgIC8vIGl0IG11bHRpcGxlIHRpbWVzLiAgSW5zdGVhZCwgZ2V0IHRoZSBkZWZhdWx0IG91dCBvZiB0aGUgZGVmYXVsdCBpbnN0YW5jZS4KICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKQEAgLTI0Myw4MCArMzM0LDExNiBAQAogICAgICIgIHJldHVybiB0aGlzO1xuIgogICAgICJ9XG4iKTsKIAorICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgInZvaWQgc2V0JGNhcGl0YWxpemVkX25hbWUkKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyB2YWx1ZSkge1xuIgotICAgICIgICRzZXRfaGFzX2ZpZWxkX2JpdF9idWlsZGVyJDtcbiIKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKFxuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIpOworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICBjaGVja0J5dGVTdHJpbmdJc1V0ZjgodmFsdWUpO1xuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiICAkc2V0X2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIKICAgICAiICAkbmFtZSRfID0gdmFsdWU7XG4iCiAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCiAgICAgIn1cbiIpOwogfQogCi12b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpICBjb25zdCB7CiAgIC8vIG5vb3AgZm9yIHByaW1pdGl2ZXMKIH0KIAotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGRlZmF1bHQkO1xuIik7CiB9CiAKLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUJ1aWxkZXJDbGVhckNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJG5hbWUkXyA9ICRkZWZhdWx0JDtcbiIKLSAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciQ7XG4iKTsKKyAgICAiJGNsZWFyX2hhc19maWVsZF9iaXRfYnVpbGRlciRcbiIpOwogfQogCi12b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewotICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAob3RoZXIuaGFzJGNhcGl0YWxpemVkX25hbWUkKCkpIHtcbiIKLSAgICAiICBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIgotICAgICJ9XG4iKTsKKyAgaWYgKFN1cHBvcnRGaWVsZFByZXNlbmNlKGRlc2NyaXB0b3JfLT5maWxlKCkpKSB7CisgICAgLy8gQWxsb3cgYSBzbGlnaHQgYnJlYWNoIG9mIGFic3RyYWN0aW9uIGhlcmUgaW4gb3JkZXIgdG8gYXZvaWQgZm9yY2luZworICAgIC8vIGFsbCBzdHJpbmcgZmllbGRzIHRvIFN0cmluZ3Mgd2hlbiBjb3B5aW5nIGZpZWxkcyBmcm9tIGEgTWVzc2FnZS4KKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImlmIChvdGhlci5oYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSkge1xuIgorICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkXG4iCisgICAgICAiICAkbmFtZSRfID0gb3RoZXIuJG5hbWUkXztcbiIKKyAgICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICAgIn1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKCFvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSQoKS5pc0VtcHR5KCkpIHtcbiIKKyAgICAgICIgICRuYW1lJF8gPSBvdGhlci4kbmFtZSRfO1xuIgorICAgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgICAifVxuIik7CisgIH0KIH0KIAotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9mcm9tX2xvY2FsJCkge1xuIgorICAgICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKKyAgICAgICJ9XG4iKTsKKyAgfQogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJpZiAoJGdldF9oYXNfZmllbGRfYml0X2Zyb21fbG9jYWwkKSB7XG4iCi0gICAgIiAgJHNldF9oYXNfZmllbGRfYml0X3RvX2xvY2FsJDtcbiIKLSAgICAifVxuIgogICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKIH0KIAotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiJHNldF9oYXNfZmllbGRfYml0X2J1aWxkZXIkO1xuIgotICAgICIkbmFtZSRfID0gaW5wdXQucmVhZEJ5dGVzKCk7XG4iKTsKKyAgaWYgKENoZWNrVXRmOChkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgImphdmEubGFuZy5TdHJpbmcgcyA9IGlucHV0LnJlYWRTdHJpbmdSZXF1aXJlVXRmOCgpO1xuIgorICAgICAgIiRzZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJFxuIgorICAgICAgIiRuYW1lJF8gPSBzO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPSBpbnB1dC5yZWFkQnl0ZXMoKTtcbiIKKyAgICAgICIkc2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSRcbiIKKyAgICAgICIkbmFtZSRfID0gYnM7XG4iKTsKKyAgfQogfQogCi12b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nRG9uZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgLy8gbm9vcCBmb3Igc3RyaW5ncy4KK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImlmICgkZ2V0X2hhc19maWVsZF9iaXRfbWVzc2FnZSQpIHtcbiIKLSAgICAiICBvdXRwdXQud3JpdGVCeXRlcygkbnVtYmVyJCwgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoKSk7XG4iCisgICAgImlmICgkaXNfZmllbGRfcHJlc2VudF9tZXNzYWdlJCkge1xuIgorICAgICIgICR3cml0ZVN0cmluZyQob3V0cHV0LCAkbnVtYmVyJCwgJG5hbWUkXyk7XG4iCiAgICAgIn1cbiIpOwogfQogCi12b2lkIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAiaWYgKCRnZXRfaGFzX2ZpZWxkX2JpdF9tZXNzYWdlJCkge1xuIgotICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgotICAgICIgICAgLmNvbXB1dGVCeXRlc1NpemUoJG51bWJlciQsIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKCkpO1xuIgorICAgICJpZiAoJGlzX2ZpZWxkX3ByZXNlbnRfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9ICRjb21wdXRlU3RyaW5nU2l6ZSQoJG51bWJlciQsICRuYW1lJF8pO1xuIgogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJyZXN1bHQgPSByZXN1bHQgJiYgZ2V0JGNhcGl0YWxpemVkX25hbWUkKClcbiIKICAgICAiICAgIC5lcXVhbHMob3RoZXIuZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkpO1xuIik7CiB9CiAKLXZvaWQgU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUhhc2hDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgImhhc2ggPSAoMzcgKiBoYXNoKSArICRjb25zdGFudF9uYW1lJDtcbiIpOwpAQCAtMzI0LDY2ICs0NTEsMzEyIEBACiAgICAgImhhc2ggPSAoNTMgKiBoYXNoKSArIGdldCRjYXBpdGFsaXplZF9uYW1lJCgpLmhhc2hDb2RlKCk7XG4iKTsKIH0KIAotc3RyaW5nIFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CitzdHJpbmcgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKICAgcmV0dXJuICJqYXZhLmxhbmcuU3RyaW5nIjsKIH0KIAotCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLVJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBidWlsZGVyQml0SW5kZXgpCi0gIDogZGVzY3JpcHRvcl8oZGVzY3JpcHRvciksIG1lc3NhZ2VCaXRJbmRleF8obWVzc2FnZUJpdEluZGV4KSwKLSAgICBidWlsZGVyQml0SW5kZXhfKGJ1aWxkZXJCaXRJbmRleCkgewotICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAmdmFyaWFibGVzXyk7CitJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0ltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQorICAgIDogSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoCisgICAgICAgICAgZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsIGNvbnRleHQpIHsKKyAgY29uc3QgT25lb2ZHZW5lcmF0b3JJbmZvKiBpbmZvID0KKyAgICAgIGNvbnRleHQtPkdldE9uZW9mR2VuZXJhdG9ySW5mbyhkZXNjcmlwdG9yLT5jb250YWluaW5nX29uZW9mKCkpOworICBTZXRDb21tb25PbmVvZlZhcmlhYmxlcyhkZXNjcmlwdG9yLCBpbmZvLCAmdmFyaWFibGVzXyk7CiB9CiAKLVJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6On5SZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KK0ltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgorfkltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IoKSB7fQogCi1pbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdCB7Ci0gIHJldHVybiAwOwotfQotCi1pbnQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6R2V0TnVtQml0c0ZvckJ1aWxkZXIoKSBjb25zdCB7Ci0gIHJldHVybiAxOwotfQotCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OgotR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgIiRkZXByZWNhdGlvbiRqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPlxuIgotICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIgotICAgICIkZGVwcmVjYXRpb24kaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCk7XG4iCi0gICAgIiRkZXByZWNhdGlvbiRqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpO1xuIik7Ci19Ci0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZU1lbWJlcnMoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKKyAgUHJpbnRFeHRyYUZpZWxkSW5mbyh2YXJpYWJsZXNfLCBwcmludGVyKTsKKworICBpZiAoU3VwcG9ydEZpZWxkUHJlc2VuY2UoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0xpc3QgJG5hbWUkXztcbiIKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLnV0aWwuTGlzdDxqYXZhLmxhbmcuU3RyaW5nPlxuIgotICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXztcbiIgICAvLyBub3RlOiAgdW5tb2RpZmlhYmxlIGxpc3QKLSAgICAifVxuIgotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIKLSAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKLSAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGJvb2xlYW4gaGFzJGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIHJldHVybiAkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgIn1cbiIpOworICB9CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmICRkZWZhdWx0X2luaXQkO1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgIHJlZiA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgIiAgfVxuIgorICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSB7XG4iCisgICAgIiAgICByZXR1cm4gKGphdmEubGFuZy5TdHJpbmcpIHJlZjtcbiIKKyAgICAiICB9IGVsc2Uge1xuIgorICAgICIgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGJzID0gXG4iCisgICAgIiAgICAgICAgKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICIgICAgamF2YS5sYW5nLlN0cmluZyBzID0gYnMudG9TdHJpbmdVdGY4KCk7XG4iKTsKKyAgaWYgKENoZWNrVXRmOChkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIgICAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICIgICAgICAkb25lb2ZfbmFtZSRfID0gcztcbiIKKyAgICAiICAgIH1cbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgICBpZiAoYnMuaXNWYWxpZFV0ZjgoKSAmJiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSkge1xuIgorICAgICIgICAgICAkb25lb2ZfbmFtZSRfID0gcztcbiIKKyAgICAiICAgIH1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgICByZXR1cm4gcztcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmICRkZWZhdWx0X2luaXQkO1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgIHJlZiA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgIiAgfVxuIgorICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBqYXZhLmxhbmcuU3RyaW5nKSB7XG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYiA9IFxuIgorICAgICIgICAgICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZy5jb3B5RnJvbVV0ZjgoXG4iCisgICAgIiAgICAgICAgICAgIChqYXZhLmxhbmcuU3RyaW5nKSByZWYpO1xuIgorICAgICIgICAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICIgICAgICAkb25lb2ZfbmFtZSRfID0gYjtcbiIKKyAgICAiICAgIH1cbiIKKyAgICAiICAgIHJldHVybiBiO1xuIgorICAgICIgIH0gZWxzZSB7XG4iCisgICAgIiAgICByZXR1cm4gKGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZykgcmVmO1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZUJ1aWxkZXJNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIGlmIChTdXBwb3J0RmllbGRQcmVzZW5jZShkZXNjcmlwdG9yXy0+ZmlsZSgpKSkgeworICAgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgYm9vbGVhbiBoYXMkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgICAiICByZXR1cm4gJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgIn1cbiIpOworICB9CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmICRkZWZhdWx0X2luaXQkO1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgIHJlZiA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgIiAgfVxuIgorICAgICIgIGlmICghKHJlZiBpbnN0YW5jZW9mIGphdmEubGFuZy5TdHJpbmcpKSB7XG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPVxuIgorICAgICIgICAgICAgIChjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcpIHJlZjtcbiIKKyAgICAiICAgIGphdmEubGFuZy5TdHJpbmcgcyA9IGJzLnRvU3RyaW5nVXRmOCgpO1xuIgorICAgICIgICAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIik7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIgICAgICAkb25lb2ZfbmFtZSRfID0gcztcbiIpOworICB9IGVsc2UgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiICAgICAgaWYgKGJzLmlzVmFsaWRVdGY4KCkpIHtcbiIKKyAgICAgICIgICAgICAgICRvbmVvZl9uYW1lJF8gPSBzO1xuIgorICAgICAgIiAgICAgIH1cbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiAgICB9XG4iCisgICAgIiAgICByZXR1cm4gcztcbiIKKyAgICAiICB9IGVsc2Uge1xuIgorICAgICIgICAgcmV0dXJuIChqYXZhLmxhbmcuU3RyaW5nKSByZWY7XG4iCisgICAgIiAgfVxuIgogICAgICJ9XG4iKTsKIAotICBpZiAoZGVzY3JpcHRvcl8tPm9wdGlvbnMoKS5wYWNrZWQoKSAmJgotICAgICAgSGFzR2VuZXJhdGVkTWV0aG9kcyhkZXNjcmlwdG9yXy0+Y29udGFpbmluZ190eXBlKCkpKSB7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmdcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJEJ5dGVzKCkge1xuIgorICAgICIgIGphdmEubGFuZy5PYmplY3QgcmVmICRkZWZhdWx0X2luaXQkO1xuIgorICAgICIgIGlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAgIHJlZiA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgIiAgfVxuIgorICAgICIgIGlmIChyZWYgaW5zdGFuY2VvZiBTdHJpbmcpIHtcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyBiID0gXG4iCisgICAgIiAgICAgICAgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nLmNvcHlGcm9tVXRmOChcbiIKKyAgICAiICAgICAgICAgICAgKGphdmEubGFuZy5TdHJpbmcpIHJlZik7XG4iCisgICAgIiAgICBpZiAoJGhhc19vbmVvZl9jYXNlX21lc3NhZ2UkKSB7XG4iCisgICAgIiAgICAgICRvbmVvZl9uYW1lJF8gPSBiO1xuIgorICAgICIgICAgfVxuIgorICAgICIgICAgcmV0dXJuIGI7XG4iCisgICAgIiAgfSBlbHNlIHtcbiIKKyAgICAiICAgIHJldHVybiAoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nKSByZWY7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iKTsKKworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBzZXQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCisgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiRudWxsX2NoZWNrJCIKKyAgICAiICAkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgIiAgJG9uZW9mX25hbWUkXyA9IHZhbHVlO1xuIgorICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgY2xlYXIkY2FwaXRhbGl6ZWRfbmFtZSQoKSB7XG4iCisgICAgIiAgaWYgKCRoYXNfb25lb2ZfY2FzZV9tZXNzYWdlJCkge1xuIgorICAgICIgICAgJGNsZWFyX29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgIiAgICAkb25lb2ZfbmFtZSRfID0gbnVsbDtcbiIKKyAgICAiICAgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIH1cbiIKKyAgICAiICByZXR1cm4gdGhpcztcbiIKKyAgICAifVxuIik7CisKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIEJ1aWxkZXIgc2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoXG4iCisgICAgIiAgICBjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgdmFsdWUpIHtcbiIKKyAgICAiJG51bGxfY2hlY2skIik7CisgIGlmIChDaGVja1V0ZjgoZGVzY3JpcHRvcl8pKSB7CiAgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJwcml2YXRlIGludCAkbmFtZSRNZW1vaXplZFNlcmlhbGl6ZWRTaXplID0gLTE7XG4iKTsKKyAgICAgICIgIGNoZWNrQnl0ZVN0cmluZ0lzVXRmOCh2YWx1ZSk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIgICRzZXRfb25lb2ZfY2FzZV9tZXNzYWdlJDtcbiIKKyAgICAiICAkb25lb2ZfbmFtZSRfID0gdmFsdWU7XG4iCisgICAgIiAgJG9uX2NoYW5nZWQkXG4iCisgICAgIiAgcmV0dXJuIHRoaXM7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICAvLyBBbGxvdyBhIHNsaWdodCBicmVhY2ggb2YgYWJzdHJhY3Rpb24gaGVyZSBpbiBvcmRlciB0byBhdm9pZCBmb3JjaW5nCisgIC8vIGFsbCBzdHJpbmcgZmllbGRzIHRvIFN0cmluZ3Mgd2hlbiBjb3B5aW5nIGZpZWxkcyBmcm9tIGEgTWVzc2FnZS4KKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICIkb25lb2ZfbmFtZSRfID0gb3RoZXIuJG9uZW9mX25hbWUkXztcbiIKKyAgICAiJG9uX2NoYW5nZWQkXG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICByZXN1bHQuJG9uZW9mX25hbWUkXyA9ICRvbmVvZl9uYW1lJF87XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBpZiAoQ2hlY2tVdGY4KGRlc2NyaXB0b3JfKSkgeworICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgICAiamF2YS5sYW5nLlN0cmluZyBzID0gaW5wdXQucmVhZFN0cmluZ1JlcXVpcmVVdGY4KCk7XG4iCisgICAgICAiJHNldF9vbmVvZl9jYXNlX21lc3NhZ2UkO1xuIgorICAgICAgIiRvbmVvZl9uYW1lJF8gPSBzO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICJjb20uZ29vZ2xlLnByb3RvYnVmLkJ5dGVTdHJpbmcgYnMgPSBpbnB1dC5yZWFkQnl0ZXMoKTtcbiIKKyAgICAgICIkc2V0X29uZW9mX2Nhc2VfbWVzc2FnZSQ7XG4iCisgICAgICAiJG9uZW9mX25hbWUkXyA9IGJzO1xuIik7CiAgIH0KIH0KIAotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcjo6CitHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICAkd3JpdGVTdHJpbmckKG91dHB1dCwgJG51bWJlciQsICRvbmVvZl9uYW1lJF8pO1xuIgorICAgICJ9XG4iKTsKK30KKwordm9pZCBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkaGFzX29uZW9mX2Nhc2VfbWVzc2FnZSQpIHtcbiIKKyAgICAiICBzaXplICs9ICRjb21wdXRlU3RyaW5nU2l6ZSQoJG51bWJlciQsICRvbmVvZl9uYW1lJF8pO1xuIgorICAgICJ9XG4iKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK1JlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDb250ZXh0KiBjb250ZXh0KQorICA6IGRlc2NyaXB0b3JfKGRlc2NyaXB0b3IpLCBtZXNzYWdlQml0SW5kZXhfKG1lc3NhZ2VCaXRJbmRleCksCisgICAgYnVpbGRlckJpdEluZGV4XyhidWlsZGVyQml0SW5kZXgpLCBjb250ZXh0Xyhjb250ZXh0KSwKKyAgICBuYW1lX3Jlc29sdmVyXyhjb250ZXh0LT5HZXROYW1lUmVzb2x2ZXIoKSkgeworICBTZXRQcmltaXRpdmVWYXJpYWJsZXMoZGVzY3JpcHRvciwgbWVzc2FnZUJpdEluZGV4LCBidWlsZGVyQml0SW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBjb250ZXh0LT5HZXRGaWVsZEdlbmVyYXRvckluZm8oZGVzY3JpcHRvciksCisgICAgICAgICAgICAgICAgICAgICAgICBuYW1lX3Jlc29sdmVyXywgJnZhcmlhYmxlc18pOworfQorCitSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK35SZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yKCkge30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JNZXNzYWdlKCkgY29uc3QgeworICByZXR1cm4gMDsKK30KKworaW50IFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3QgeworICByZXR1cm4gMTsKK30KKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlSW50ZXJmYWNlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRjb20uZ29vZ2xlLnByb3RvYnVmLlByb3RvY29sU3RyaW5nTGlzdFxuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpO1xuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJGphdmEubGFuZy5TdHJpbmcgZ2V0JGNhcGl0YWxpemVkX25hbWUkKGludCBpbmRleCk7XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhpbnQgaW5kZXgpO1xuIik7Cit9CisKKwordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJwcml2YXRlIGNvbS5nb29nbGUucHJvdG9idWYuTGF6eVN0cmluZ0xpc3QgJG5hbWUkXztcbiIpOworICBQcmludEV4dHJhRmllbGRJbmZvKHZhcmlhYmxlc18sIHByaW50ZXIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Qcm90b2NvbFN0cmluZ0xpc3RcbiIKKyAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF87XG4iICAgLy8gbm90ZTogIHVubW9kaWZpYWJsZSBsaXN0CisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgaW50IGdldCRjYXBpdGFsaXplZF9uYW1lJENvdW50KCkge1xuIgorICAgICIgIHJldHVybiAkbmFtZSRfLnNpemUoKTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICIkZGVwcmVjYXRpb24kcHVibGljIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZ1xuIgorICAgICIgICAgZ2V0JGNhcGl0YWxpemVkX25hbWUkQnl0ZXMoaW50IGluZGV4KSB7XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0Qnl0ZVN0cmluZyhpbmRleCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICAvLyBPbmUgZmllbGQgaXMgdGhlIGxpc3QgYW5kIHRoZSBiaXQgZmllbGQga2VlcHMgdHJhY2sgb2Ygd2hldGhlciB0aGUKICAgLy8gbGlzdCBpcyBpbW11dGFibGUuIElmIGl0J3MgaW1tdXRhYmxlLCB0aGUgaW52YXJpYW50IGlzIHRoYXQgaXQgbXVzdApAQCAtNDA5LDE3ICs3ODIsMzAgQEAKICAgICAvLyAgIGNvdWxkIGhvbGQgb24gdG8gdGhlIHJldHVybmVkIGxpc3QgYW5kIG1vZGlmeSBpdCBhZnRlciB0aGUgbWVzc2FnZQogICAgIC8vICAgaGFzIGJlZW4gYnVpbHQsIHRodXMgbXV0YXRpbmcgdGhlIG1lc3NhZ2Ugd2hpY2ggaXMgc3VwcG9zZWQgdG8gYmUKICAgICAvLyAgIGltbXV0YWJsZS4KKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOwogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICIkZGVwcmVjYXRpb24kcHVibGljIGphdmEudXRpbC5MaXN0PGphdmEubGFuZy5TdHJpbmc+XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5Qcm90b2NvbFN0cmluZ0xpc3RcbiIKICAgICAiICAgIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKSB7XG4iCi0gICAgIiAgcmV0dXJuIGphdmEudXRpbC5Db2xsZWN0aW9ucy51bm1vZGlmaWFibGVMaXN0KCRuYW1lJF8pO1xuIgotICAgICJ9XG4iCisgICAgIiAgcmV0dXJuICRuYW1lJF8uZ2V0VW5tb2RpZmlhYmxlVmlldygpO1xuIgorICAgICJ9XG4iKTsKKyAgV3JpdGVGaWVsZERvY0NvbW1lbnQocHJpbnRlciwgZGVzY3JpcHRvcl8pOworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICIkZGVwcmVjYXRpb24kcHVibGljIGludCBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRDb3VudCgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXy5zaXplKCk7XG4iCi0gICAgIn1cbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBqYXZhLmxhbmcuU3RyaW5nIGdldCRjYXBpdGFsaXplZF9uYW1lJChpbnQgaW5kZXgpIHtcbiIKICAgICAiICByZXR1cm4gJG5hbWUkXy5nZXQoaW5kZXgpO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nXG4iCisgICAgIiAgICBnZXQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhpbnQgaW5kZXgpIHtcbiIKKyAgICAiICByZXR1cm4gJG5hbWUkXy5nZXRCeXRlU3RyaW5nKGluZGV4KTtcbiIKKyAgICAifVxuIik7CisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKKyAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAiJGRlcHJlY2F0aW9uJHB1YmxpYyBCdWlsZGVyIHNldCRjYXBpdGFsaXplZF9uYW1lJChcbiIKICAgICAiICAgIGludCBpbmRleCwgamF2YS5sYW5nLlN0cmluZyB2YWx1ZSkge1xuIgogICAgICIkbnVsbF9jaGVjayQiCkBAIC00MjcsNyArODEzLDkgQEAKICAgICAiICAkbmFtZSRfLnNldChpbmRleCwgdmFsdWUpO1xuIgogICAgICIgICRvbl9jaGFuZ2VkJFxuIgogICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCiAgICAgIiAgICBqYXZhLmxhbmcuU3RyaW5nIHZhbHVlKSB7XG4iCiAgICAgIiRudWxsX2NoZWNrJCIKQEAgLTQzNSwxNCArODIzLDE5IEBACiAgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgogICAgICIgICRvbl9jaGFuZ2VkJFxuIgogICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGRBbGwkY2FwaXRhbGl6ZWRfbmFtZSQoXG4iCiAgICAgIiAgICBqYXZhLmxhbmcuSXRlcmFibGU8amF2YS5sYW5nLlN0cmluZz4gdmFsdWVzKSB7XG4iCiAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCi0gICAgIiAgc3VwZXIuYWRkQWxsKHZhbHVlcywgJG5hbWUkXyk7XG4iCisgICAgIiAgY29tLmdvb2dsZS5wcm90b2J1Zi5BYnN0cmFjdE1lc3NhZ2VMaXRlLkJ1aWxkZXIuYWRkQWxsKFxuIgorICAgICIgICAgICB2YWx1ZXMsICRuYW1lJF8pO1xuIgogICAgICIgICRvbl9jaGFuZ2VkJFxuIgogICAgICIgIHJldHVybiB0aGlzO1xuIgotICAgICJ9XG4iCisgICAgIn1cbiIpOworICBXcml0ZUZpZWxkRG9jQ29tbWVudChwcmludGVyLCBkZXNjcmlwdG9yXyk7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBjbGVhciRjYXBpdGFsaXplZF9uYW1lJCgpIHtcbiIKICAgICAiICAkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIgogICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKQEAgLTQ1MCwzMiArODQzLDQxIEBACiAgICAgIiAgcmV0dXJuIHRoaXM7XG4iCiAgICAgIn1cbiIpOwogCisgIFdyaXRlRmllbGREb2NDb21tZW50KHByaW50ZXIsIGRlc2NyaXB0b3JfKTsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAidm9pZCBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIHZhbHVlKSB7XG4iCisgICAgIiRkZXByZWNhdGlvbiRwdWJsaWMgQnVpbGRlciBhZGQkY2FwaXRhbGl6ZWRfbmFtZSRCeXRlcyhcbiIKKyAgICAiICAgIGNvbS5nb29nbGUucHJvdG9idWYuQnl0ZVN0cmluZyB2YWx1ZSkge1xuIgorICAgICIkbnVsbF9jaGVjayQiKTsKKyAgaWYgKENoZWNrVXRmOChkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiAgY2hlY2tCeXRlU3RyaW5nSXNVdGY4KHZhbHVlKTtcbiIpOworICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiAgZW5zdXJlJGNhcGl0YWxpemVkX25hbWUkSXNNdXRhYmxlKCk7XG4iCiAgICAgIiAgJG5hbWUkXy5hZGQodmFsdWUpO1xuIgogICAgICIgICRvbl9jaGFuZ2VkJFxuIgorICAgICIgIHJldHVybiB0aGlzO1xuIgogICAgICJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUZpZWxkQnVpbGRlckluaXRpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgIGNvbnN0IHsKICAgLy8gbm9vcCBmb3IgcHJpbWl0aXZlcwogfQogCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlSW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sICIkbmFtZSRfID0gJGVtcHR5X2xpc3QkO1xuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVCdWlsZGVyQ2xlYXJDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgIiRuYW1lJF8gPSAkZW1wdHlfbGlzdCQ7XG4iCiAgICAgIiRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIpOwogfQogCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgLy8gVGhlIGNvZGUgYmVsb3cgZG9lcyB0d28gb3B0aW1pemF0aW9uczoKICAgLy8gICAxLiBJZiB0aGUgb3RoZXIgbGlzdCBpcyBlbXB0eSwgdGhlcmUncyBub3RoaW5nIHRvIGRvLiBUaGlzIGVuc3VyZXMgd2UKQEAgLTQ5NSw1OCArODk3LDU5IEBACiAgICAgIn1cbiIpOwogfQogCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CiAgIC8vIFRoZSBjb2RlIGJlbG93IGVuc3VyZXMgdGhhdCB0aGUgcmVzdWx0IGhhcyBhbiBpbW11dGFibGUgbGlzdC4gSWYgb3VyCiAgIC8vIGxpc3QgaXMgaW1tdXRhYmxlLCB3ZSBjYW4ganVzdCByZXVzZSBpdC4gSWYgbm90LCB3ZSBtYWtlIGl0IGltbXV0YWJsZS4KIAogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJpZiAoJGdldF9tdXRhYmxlX2JpdF9idWlsZGVyJCkge1xuIgotICAgICIgICRuYW1lJF8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5Vbm1vZGlmaWFibGVMYXp5U3RyaW5nTGlzdChcbiIKLSAgICAiICAgICAgJG5hbWUkXyk7XG4iCisgICAgIiAgJG5hbWUkXyA9ICRuYW1lJF8uZ2V0VW5tb2RpZmlhYmxlVmlldygpO1xuIgogICAgICIgICRjbGVhcl9tdXRhYmxlX2JpdF9idWlsZGVyJDtcbiIKICAgICAifVxuIgogICAgICJyZXN1bHQuJG5hbWUkXyA9ICRuYW1lJF87XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImVuc3VyZSRjYXBpdGFsaXplZF9uYW1lJElzTXV0YWJsZSgpO1xuIgotICAgICIkbmFtZSRfLmFkZChpbnB1dC5yZWFkQnl0ZXMoKSk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlUGFyc2luZ0NvZGVGcm9tUGFja2VkKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7Ci0gIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgImludCBsZW5ndGggPSBpbnB1dC5yZWFkUmF3VmFyaW50MzIoKTtcbiIKLSAgICAiaW50IGxpbWl0ID0gaW5wdXQucHVzaExpbWl0KGxlbmd0aCk7XG4iCi0gICAgIndoaWxlIChpbnB1dC5nZXRCeXRlc1VudGlsTGltaXQoKSA+IDApIHtcbiIKLSAgICAiICBhZGQkY2FwaXRhbGl6ZWRfbmFtZSQoaW5wdXQucmVhZCRjYXBpdGFsaXplZF90eXBlJCgpKTtcbiIKLSAgICAifVxuIgotICAgICJpbnB1dC5wb3BMaW1pdChsaW1pdCk7XG4iKTsKLX0KLQotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKLUdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKKyAgaWYgKENoZWNrVXRmOChkZXNjcmlwdG9yXykpIHsKICAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgImlmIChnZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkuc2l6ZSgpID4gMCkge1xuIgotICAgICAgIiAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoJHRhZyQpO1xuIgotICAgICAgIiAgb3V0cHV0LndyaXRlUmF3VmFyaW50MzIoJG5hbWUkTWVtb2l6ZWRTZXJpYWxpemVkU2l6ZSk7XG4iCi0gICAgICAifVxuIgotICAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgotICAgICAgIiAgb3V0cHV0LndyaXRlJGNhcGl0YWxpemVkX3R5cGUkTm9UYWcoJG5hbWUkXy5nZXQoaSkpO1xuIgotICAgICAgIn1cbiIpOworICAgICJqYXZhLmxhbmcuU3RyaW5nIHMgPSBpbnB1dC5yZWFkU3RyaW5nUmVxdWlyZVV0ZjgoKTtcbiIpOwogICB9IGVsc2UgewogICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAiZm9yIChpbnQgaSA9IDA7IGkgPCAkbmFtZSRfLnNpemUoKTsgaSsrKSB7XG4iCi0gICAgICAiICBvdXRwdXQud3JpdGVCeXRlcygkbnVtYmVyJCwgJG5hbWUkXy5nZXRCeXRlU3RyaW5nKGkpKTtcbiIKLSAgICAgICJ9XG4iKTsKKyAgICAiY29tLmdvb2dsZS5wcm90b2J1Zi5CeXRlU3RyaW5nIGJzID0gaW5wdXQucmVhZEJ5dGVzKCk7XG4iKTsKKyAgfQorICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJpZiAoISRnZXRfbXV0YWJsZV9iaXRfcGFyc2VyJCkge1xuIgorICAgICIgICRuYW1lJF8gPSBuZXcgY29tLmdvb2dsZS5wcm90b2J1Zi5MYXp5U3RyaW5nQXJyYXlMaXN0KCk7XG4iCisgICAgIiAgJHNldF9tdXRhYmxlX2JpdF9wYXJzZXIkO1xuIgorICAgICJ9XG4iKTsKKyAgaWYgKENoZWNrVXRmOChkZXNjcmlwdG9yXykpIHsKKyAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICAgIiRuYW1lJF8uYWRkKHMpO1xuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKKyAgICAgICIkbmFtZSRfLmFkZChicyk7XG4iKTsKICAgfQogfQogCi12b2lkIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6Ogordm9pZCBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK0dlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdCB7CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgImlmICgkZ2V0X211dGFibGVfYml0X3BhcnNlciQpIHtcbiIKKyAgICAiICAkbmFtZSRfID0gJG5hbWUkXy5nZXRVbm1vZGlmaWFibGVWaWV3KCk7XG4iCisgICAgIn1cbiIpOworfQorCit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgorR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgeworICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAorICAgICJmb3IgKGludCBpID0gMDsgaSA8ICRuYW1lJF8uc2l6ZSgpOyBpKyspIHtcbiIKKyAgICAiICAkd3JpdGVTdHJpbmckKG91dHB1dCwgJG51bWJlciQsICRuYW1lJF8uZ2V0UmF3KGkpKTtcbiIKKyAgICAifVxuIik7Cit9CisKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJ7XG4iCkBAIC01NTUsNDMgKzk1OCwyNyBAQAogCiAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCiAgICAgImZvciAoaW50IGkgPSAwOyBpIDwgJG5hbWUkXy5zaXplKCk7IGkrKykge1xuIgotICAgICIgIGRhdGFTaXplICs9IGNvbS5nb29nbGUucHJvdG9idWYuQ29kZWRPdXRwdXRTdHJlYW1cbiIKLSAgICAiICAgIC5jb21wdXRlQnl0ZXNTaXplTm9UYWcoJG5hbWUkXy5nZXRCeXRlU3RyaW5nKGkpKTtcbiIKKyAgICAiICBkYXRhU2l6ZSArPSBjb21wdXRlU3RyaW5nU2l6ZU5vVGFnKCRuYW1lJF8uZ2V0UmF3KGkpKTtcbiIKICAgICAifVxuIik7CiAKICAgcHJpbnRlci0+UHJpbnQoCiAgICAgICAic2l6ZSArPSBkYXRhU2l6ZTtcbiIpOwogCi0gIGlmIChkZXNjcmlwdG9yXy0+b3B0aW9ucygpLnBhY2tlZCgpKSB7Ci0gICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKLSAgICAgICJpZiAoIWdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5pc0VtcHR5KCkpIHtcbiIKLSAgICAgICIgIHNpemUgKz0gJHRhZ19zaXplJDtcbiIKLSAgICAgICIgIHNpemUgKz0gY29tLmdvb2dsZS5wcm90b2J1Zi5Db2RlZE91dHB1dFN0cmVhbVxuIgotICAgICAgIiAgICAgIC5jb21wdXRlSW50MzJTaXplTm9UYWcoZGF0YVNpemUpO1xuIgotICAgICAgIn1cbiIpOwotICB9IGVsc2UgewotICAgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCi0gICAgICAic2l6ZSArPSAkdGFnX3NpemUkICogZ2V0JGNhcGl0YWxpemVkX25hbWUkTGlzdCgpLnNpemUoKTtcbiIpOwotICB9Ci0KLSAgLy8gY2FjaGUgdGhlIGRhdGEgc2l6ZSBmb3IgcGFja2VkIGZpZWxkcy4KLSAgaWYgKGRlc2NyaXB0b3JfLT5vcHRpb25zKCkucGFja2VkKCkpIHsKLSAgICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAotICAgICAgIiRuYW1lJE1lbW9pemVkU2VyaWFsaXplZFNpemUgPSBkYXRhU2l6ZTtcbiIpOwotICB9CisgIHByaW50ZXItPlByaW50KHZhcmlhYmxlc18sCisgICAgInNpemUgKz0gJHRhZ19zaXplJCAqIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKS5zaXplKCk7XG4iKTsKIAogICBwcmludGVyLT5PdXRkZW50KCk7CiAgIHByaW50ZXItPlByaW50KCJ9XG4iKTsKIH0KIAotdm9pZCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yOjoKK3ZvaWQgUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcjo6CiBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0IHsKICAgcHJpbnRlci0+UHJpbnQodmFyaWFibGVzXywKICAgICAicmVzdWx0ID0gcmVzdWx0ICYmIGdldCRjYXBpdGFsaXplZF9uYW1lJExpc3QoKVxuIgogICAgICIgICAgLmVxdWFscyhvdGhlci5nZXQkY2FwaXRhbGl6ZWRfbmFtZSRMaXN0KCkpO1xuIik7CiB9CiAKLXZvaWQgUmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcjo6Cit2b2lkIFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3I6OgogR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3QgewogICBwcmludGVyLT5QcmludCh2YXJpYWJsZXNfLAogICAgICJpZiAoZ2V0JGNhcGl0YWxpemVkX25hbWUkQ291bnQoKSA+IDApIHtcbiIKQEAgLTYwMCw3ICs5ODcsNyBAQAogICAgICJ9XG4iKTsKIH0KIAotc3RyaW5nIFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3I6OkdldEJveGVkVHlwZSgpIGNvbnN0IHsKK3N0cmluZyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yOjpHZXRCb3hlZFR5cGUoKSBjb25zdCB7CiAgIHJldHVybiAiU3RyaW5nIjsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZC5oCmluZGV4IDhjYjQxNDYuLmEzYjU3MzUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9zdHJpbmdfZmllbGQuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQyLDE2ICs0MiwyNiBAQAogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisgIG5hbWVzcGFjZSBjb21waWxlciB7CisgICAgbmFtZXNwYWNlIGphdmEgeworICAgICAgY2xhc3MgQ29udGV4dDsgICAgICAgICAgIC8vIGNvbnRleHQuaAorICAgICAgY2xhc3MgQ2xhc3NOYW1lUmVzb2x2ZXI7IC8vIG5hbWVfcmVzb2x2ZXIuaAorICAgIH0KKyAgfQorfQorCituYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGNvbXBpbGVyIHsKIG5hbWVzcGFjZSBqYXZhIHsKIAotY2xhc3MgU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgRmllbGRHZW5lcmF0b3IgeworY2xhc3MgSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IgOiBwdWJsaWMgSW1tdXRhYmxlRmllbGRHZW5lcmF0b3IgewogIHB1YmxpYzoKLSAgZXhwbGljaXQgU3RyaW5nRmllbGRHZW5lcmF0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgaW50IG1lc3NhZ2VCaXRJbmRleCwgaW50IGJ1aWxkZXJCaXRJbmRleCk7Ci0gIH5TdHJpbmdGaWVsZEdlbmVyYXRvcigpOworICBleHBsaWNpdCBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcigKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IG1lc3NhZ2VCaXRJbmRleCwKKyAgICAgIGludCBidWlsZGVyQml0SW5kZXgsIENvbnRleHQqIGNvbnRleHQpOworICB+SW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoKTsKIAotICAvLyBpbXBsZW1lbnRzIEZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKICAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKQEAgLTYyLDI5ICs3Miw1NSBAQAogICB2b2lkIEdlbmVyYXRlTWVyZ2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlQnVpbGRpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKyAgdm9pZCBHZW5lcmF0ZVBhcnNpbmdEb25lQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemF0aW9uQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVTZXJpYWxpemVkU2l6ZUNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlRmllbGRCdWlsZGVySW5pdGlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUVxdWFsc0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlSGFzaENvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworCiAgIHN0cmluZyBHZXRCb3hlZFR5cGUoKSBjb25zdDsKIAotIHByaXZhdGU6CisgcHJvdGVjdGVkOgogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3JfOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcmlhYmxlc187CiAgIGNvbnN0IGludCBtZXNzYWdlQml0SW5kZXhfOwogICBjb25zdCBpbnQgYnVpbGRlckJpdEluZGV4XzsKKyAgQ29udGV4dCogY29udGV4dF87CisgIENsYXNzTmFtZVJlc29sdmVyKiBuYW1lX3Jlc29sdmVyXzsKIAotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoU3RyaW5nRmllbGRHZW5lcmF0b3IpOworIHByaXZhdGU6CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcik7CiB9OwogCi1jbGFzcyBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yIDogcHVibGljIEZpZWxkR2VuZXJhdG9yIHsKK2NsYXNzIEltbXV0YWJsZVN0cmluZ09uZW9mRmllbGRHZW5lcmF0b3IKKyAgICA6IHB1YmxpYyBJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvciB7CiAgcHVibGljOgotICBleHBsaWNpdCBSZXBlYXRlZFN0cmluZ0ZpZWxkR2VuZXJhdG9yKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgIGludCBtZXNzYWdlQml0SW5kZXgsIGludCBidWlsZGVyQml0SW5kZXgpOwotICB+UmVwZWF0ZWRTdHJpbmdGaWVsZEdlbmVyYXRvcigpOworICBJbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLCBpbnQgbWVzc2FnZUJpdEluZGV4LAorICAgICAgaW50IGJ1aWxkZXJCaXRJbmRleCwgQ29udGV4dCogY29udGV4dCk7CisgIH5JbW11dGFibGVTdHJpbmdPbmVvZkZpZWxkR2VuZXJhdG9yKCk7CiAKLSAgLy8gaW1wbGVtZW50cyBGaWVsZEdlbmVyYXRvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyBwcml2YXRlOgorICB2b2lkIEdlbmVyYXRlTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGVyTWVtYmVycyhpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVNZXJnaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisgIHZvaWQgR2VuZXJhdGVCdWlsZGluZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0NvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlU2VyaWFsaXplZFNpemVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKKworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoSW1tdXRhYmxlU3RyaW5nT25lb2ZGaWVsZEdlbmVyYXRvcik7Cit9OworCitjbGFzcyBSZXBlYXRlZEltbXV0YWJsZVN0cmluZ0ZpZWxkR2VuZXJhdG9yIDogcHVibGljIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCBtZXNzYWdlQml0SW5kZXgsCisgICAgICBpbnQgYnVpbGRlckJpdEluZGV4LCBDb250ZXh0KiBjb250ZXh0KTsKKyAgflJlcGVhdGVkSW1tdXRhYmxlU3RyaW5nRmllbGRHZW5lcmF0b3IoKTsKKworICAvLyBpbXBsZW1lbnRzIEltbXV0YWJsZUZpZWxkR2VuZXJhdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICBpbnQgR2V0TnVtQml0c0Zvck1lc3NhZ2UoKSBjb25zdDsKICAgaW50IEdldE51bUJpdHNGb3JCdWlsZGVyKCkgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVJbnRlcmZhY2VNZW1iZXJzKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKQEAgLTk1LDEyICsxMzEsMTMgQEAKICAgdm9pZCBHZW5lcmF0ZU1lcmdpbmdDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZUJ1aWxkaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7Ci0gIHZvaWQgR2VuZXJhdGVQYXJzaW5nQ29kZUZyb21QYWNrZWQoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OworICB2b2lkIEdlbmVyYXRlUGFyc2luZ0RvbmVDb2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6YXRpb25Db2RlKGlvOjpQcmludGVyKiBwcmludGVyKSBjb25zdDsKICAgdm9pZCBHZW5lcmF0ZVNlcmlhbGl6ZWRTaXplQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVGaWVsZEJ1aWxkZXJJbml0aWFsaXphdGlvbkNvZGUoaW86OlByaW50ZXIqIHByaW50ZXIpIGNvbnN0OwogICB2b2lkIEdlbmVyYXRlRXF1YWxzQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CiAgIHZvaWQgR2VuZXJhdGVIYXNoQ29kZShpbzo6UHJpbnRlciogcHJpbnRlcikgY29uc3Q7CisKICAgc3RyaW5nIEdldEJveGVkVHlwZSgpIGNvbnN0OwogCiAgcHJpdmF0ZToKQEAgLTEwOCw4ICsxNDUsMTAgQEAKICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJpYWJsZXNfOwogICBjb25zdCBpbnQgbWVzc2FnZUJpdEluZGV4XzsKICAgY29uc3QgaW50IGJ1aWxkZXJCaXRJbmRleF87CisgIENvbnRleHQqIGNvbnRleHRfOworICBDbGFzc05hbWVSZXNvbHZlciogbmFtZV9yZXNvbHZlcl87CiAKLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlcGVhdGVkU3RyaW5nRmllbGRHZW5lcmF0b3IpOworICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRJbW11dGFibGVTdHJpbmdGaWVsZEdlbmVyYXRvcik7CiB9OwogCiB9ICAvLyBuYW1lc3BhY2UgamF2YQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkX2xpdGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkX2xpdGUuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkX2xpdGUuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkX2xpdGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhL2phdmFfc3RyaW5nX2ZpZWxkX2xpdGUuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YS9qYXZhX3N0cmluZ19maWVsZF9saXRlLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2VudW0uY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2VudW1fZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtX2ZpZWxkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZW51bV9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19lbnVtX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2V4dGVuc2lvbi5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2V4dGVuc2lvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZXh0ZW5zaW9uLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2V4dGVuc2lvbi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmllbGQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpZWxkLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19maWVsZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpZWxkLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2ZpbGUuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19maWxlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19maWxlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZmlsZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19maWxlLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2dlbmVyYXRvci5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fZ2VuZXJhdG9yLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2dlbmVyYXRvci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2hlbHBlcnMuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19oZWxwZXJzLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2hlbHBlcnMuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2hlbHBlcnMuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX2hlbHBlcnMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9faGVscGVycy5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21hcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21hcF9maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tYXBfZmllbGQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21hcF9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tYXBfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21hcF9maWVsZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21hcF9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tYXBfZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2UuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fbWVzc2FnZV9maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlX2ZpZWxkLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2VfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2VfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19tZXNzYWdlX2ZpZWxkLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX21lc3NhZ2VfZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wYXJhbXMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX3BhcmFtcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmFuYW5vL2phdmFuYW5vX3BhcmFtcy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wYXJhbXMuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wcmltaXRpdmVfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wcmltaXRpdmVfZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcHJpbWl0aXZlX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wcmltaXRpdmVfZmllbGQuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcHJpbWl0aXZlX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wcmltaXRpdmVfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19wcmltaXRpdmVfZmllbGQuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvamF2YW5hbm8vamF2YW5hbm9fcHJpbWl0aXZlX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2pzL2pzX2dlbmVyYXRvci5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2pzL2pzX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvanMvanNfZ2VuZXJhdG9yLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2pzL2pzX2dlbmVyYXRvci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbWFpbi5jYwppbmRleCBkOWIwYzNmLi42NmFkMTNiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tYWluLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21haW4uY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM0LDcgKzM0LDExIEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NwcC9jcHBfZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2phdmEvamF2YV9nZW5lcmF0b3IuaD4KLQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9qYXZhbmFuby9qYXZhbmFub19nZW5lcmF0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jc2hhcnAvY3NoYXJwX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2pzL2pzX2dlbmVyYXRvci5oPgogCiBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKSB7CiAKQEAgLTQzLDcgKzQ3LDcgQEAKIAogICAvLyBQcm90bzIgQysrCiAgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpjcHA6OkNwcEdlbmVyYXRvciBjcHBfZ2VuZXJhdG9yOwotICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tY3BwX291dCIsICZjcHBfZ2VuZXJhdG9yLAorICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tY3BwX291dCIsICItLWNwcF9vcHQiLCAmY3BwX2dlbmVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBDKysgaGVhZGVyIGFuZCBzb3VyY2UuIik7CiAKICAgLy8gUHJvdG8yIEphdmEKQEAgLTU3LDUgKzYxLDMwIEBACiAgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1weXRob25fb3V0IiwgJnB5X2dlbmVyYXRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBQeXRob24gc291cmNlIGZpbGUuIik7CiAKKyAgLy8gSmF2YSBOYW5vCisgIGdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpqYXZhbmFubzo6SmF2YU5hbm9HZW5lcmF0b3IgamF2YW5hbm9fZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tamF2YW5hbm9fb3V0IiwgJmphdmFuYW5vX2dlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBKYXZhIE5hbm8gc291cmNlIGZpbGUuIik7CisKKyAgLy8gUnVieQorICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6cnVieTo6R2VuZXJhdG9yIHJiX2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLXJ1Ynlfb3V0IiwgJnJiX2dlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBSdWJ5IHNvdXJjZSBmaWxlLiIpOworCisgIC8vIENTaGFycAorICBnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Y3NoYXJwOjpHZW5lcmF0b3IgY3NoYXJwX2dlbmVyYXRvcjsKKyAgY2xpLlJlZ2lzdGVyR2VuZXJhdG9yKCItLWNzaGFycF9vdXQiLCAiLS1jc2hhcnBfb3B0IiwgJmNzaGFycF9nZW5lcmF0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAiR2VuZXJhdGUgQyMgc291cmNlIGZpbGUuIik7CisKKyAgLy8gT2JqZWN0aXZlIEMKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6Om9iamVjdGl2ZWM6Ok9iamVjdGl2ZUNHZW5lcmF0b3Igb2JqY19nZW5lcmF0b3I7CisgIGNsaS5SZWdpc3RlckdlbmVyYXRvcigiLS1vYmpjX291dCIsICItLW9iamNfb3B0IiwgJm9iamNfZ2VuZXJhdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgIkdlbmVyYXRlIE9iamVjdGl2ZSBDIGhlYWRlciBhbmQgc291cmNlLiIpOworCisgIC8vIEphdmFTY3JpcHQKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OmpzOjpHZW5lcmF0b3IganNfZ2VuZXJhdG9yOworICBjbGkuUmVnaXN0ZXJHZW5lcmF0b3IoIi0tanNfb3V0IiwgJmpzX2dlbmVyYXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICJHZW5lcmF0ZSBKYXZhU2NyaXB0IHNvdXJjZS4iKTsKKwogICByZXR1cm4gY2xpLlJ1bihhcmdjLCBhcmd2KTsKIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmNjCmluZGV4IDViNzZhZjIuLjgyYmIzNDIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsMTQgKzMyLDI2IEBACiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oPgogCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNTIsNyArNjQsNyBAQAogICBmb3IgKGludCBpID0gMDsgaSA8IGFsbF9maWxlcy5zaXplKCk7IGkrKykgewogICAgIG5hbWVzLnB1c2hfYmFjayhhbGxfZmlsZXNbaV0tPm5hbWUoKSk7CiAgIH0KLSAgcmV0dXJuIEpvaW5TdHJpbmdzKG5hbWVzLCAiLCIpOworICByZXR1cm4gSm9pbihuYW1lcywgIiwiKTsKIH0KIAogc3RhdGljIGNvbnN0IGNoYXIqIGtGaXJzdEluc2VydGlvblBvaW50TmFtZSA9ICJmaXJzdF9tb2NrX2luc2VydGlvbl9wb2ludCI7CkBAIC03NiwxMSArODgsMTEgQEAKICAgICBjb25zdCBzdHJpbmcmIGZpcnN0X3BhcnNlZF9maWxlX25hbWUsCiAgICAgY29uc3Qgc3RyaW5nJiBvdXRwdXRfZGlyZWN0b3J5KSB7CiAgIHN0cmluZyBjb250ZW50OwotICBBU1NFUlRfVFJVRShGaWxlOjpSZWFkRmlsZVRvU3RyaW5nKAotICAgICAgb3V0cHV0X2RpcmVjdG9yeSArICIvIiArIEdldE91dHB1dEZpbGVOYW1lKG5hbWUsIGZpbGUpLCAmY29udGVudCkpOworICBHT09HTEVfQ0hFQ0tfT0soCisgICAgICBGaWxlOjpHZXRDb250ZW50cyhvdXRwdXRfZGlyZWN0b3J5ICsgIi8iICsgR2V0T3V0cHV0RmlsZU5hbWUobmFtZSwgZmlsZSksCisgICAgICAgICAgICAgICAgICAgICAgICAmY29udGVudCwgdHJ1ZSkpOwogCi0gIHZlY3RvcjxzdHJpbmc+IGxpbmVzOwotICBTcGxpdFN0cmluZ1VzaW5nKGNvbnRlbnQsICJcbiIsICZsaW5lcyk7CisgIHZlY3RvcjxzdHJpbmc+IGxpbmVzID0gU3BsaXQoY29udGVudCwgIlxuIiwgdHJ1ZSk7CiAKICAgd2hpbGUgKCFsaW5lcy5lbXB0eSgpICYmIGxpbmVzLmJhY2soKS5lbXB0eSgpKSB7CiAgICAgbGluZXMucG9wX2JhY2soKTsKQEAgLTk0LDcgKzEwNiw3IEBACiAgICAgU3BsaXRTdHJpbmdVc2luZyhpbnNlcnRpb25zLCAiLCIsICZpbnNlcnRpb25fbGlzdCk7CiAgIH0KIAotICBBU1NFUlRfRVEobGluZXMuc2l6ZSgpLCAzICsgaW5zZXJ0aW9uX2xpc3Quc2l6ZSgpICogMik7CisgIEVYUEVDVF9FUShsaW5lcy5zaXplKCksIDMgKyBpbnNlcnRpb25fbGlzdC5zaXplKCkgKiAyKTsKICAgRVhQRUNUX0VRKEdldE91dHB1dEZpbGVDb250ZW50KG5hbWUsIHBhcmFtZXRlciwgZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpcnN0X3BhcnNlZF9maWxlX25hbWUsIGZpcnN0X21lc3NhZ2VfbmFtZSksCiAgICAgICAgICAgICBsaW5lc1swXSk7CkBAIC0xMjcsMTAgKzEzOSwyNSBAQAogICAgICAgICAqZXJyb3IgPSAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FcnJvci4iOwogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkV4aXQiKSB7Ci0gICAgICAgIGNlcnIgPDwgIlNhdyBtZXNzYWdlIHR5cGUgTW9ja0NvZGVHZW5lcmF0b3JfRXhpdC4iIDw8IGVuZGw7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9FeGl0LiIgPDwgc3RkOjplbmRsOwogICAgICAgICBleGl0KDEyMyk7CiAgICAgICB9IGVsc2UgaWYgKGNvbW1hbmQgPT0gIkFib3J0IikgewotICAgICAgICBjZXJyIDw8ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0LiIgPDwgZW5kbDsKKyAgICAgICAgc3RkOjpjZXJyIDw8ICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0Fib3J0LiIgPDwgc3RkOjplbmRsOworICAgICAgICBhYm9ydCgpOworICAgICAgfSBlbHNlIGlmIChjb21tYW5kID09ICJIYXNTb3VyY2VDb2RlSW5mbyIpIHsKKyAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX2Rlc2NyaXB0b3JfcHJvdG87CisgICAgICAgIGZpbGUtPkNvcHlTb3VyY2VDb2RlSW5mb1RvKCZmaWxlX2Rlc2NyaXB0b3JfcHJvdG8pOworICAgICAgICBib29sIGhhc19zb3VyY2VfY29kZV9pbmZvID0KKyAgICAgICAgICAgIGZpbGVfZGVzY3JpcHRvcl9wcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpICYmCisgICAgICAgICAgICBmaWxlX2Rlc2NyaXB0b3JfcHJvdG8uc291cmNlX2NvZGVfaW5mbygpLmxvY2F0aW9uX3NpemUoKSA+IDA7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiU2F3IG1lc3NhZ2UgdHlwZSBNb2NrQ29kZUdlbmVyYXRvcl9IYXNTb3VyY2VDb2RlSW5mbzogIgorICAgICAgICAgICAgICAgICAgPDwgaGFzX3NvdXJjZV9jb2RlX2luZm8gPDwgIi4iIDw8IHN0ZDo6ZW5kbDsKKyAgICAgICAgYWJvcnQoKTsKKyAgICAgIH0gZWxzZSBpZiAoY29tbWFuZCA9PSAiSGFzSnNvbk5hbWUiKSB7CisgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkX2Rlc2NyaXB0b3JfcHJvdG87CisgICAgICAgIGZpbGUtPm1lc3NhZ2VfdHlwZShpKS0+ZmllbGQoMCktPkNvcHlUbygmZmllbGRfZGVzY3JpcHRvcl9wcm90byk7CisgICAgICAgIHN0ZDo6Y2VyciA8PCAiU2F3IGpzb25fbmFtZTogIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGRfZGVzY3JpcHRvcl9wcm90by5oYXNfanNvbl9uYW1lKCkgPDwgc3RkOjplbmRsOwogICAgICAgICBhYm9ydCgpOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVua25vd24gTW9ja0NvZGVHZW5lcmF0b3IgY29tbWFuZDogIiA8PCBjb21tYW5kOwpAQCAtMTQ1LDEwICsxNzIsOCBAQAogCiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpbnNlcnRfaW50by5zaXplKCk7IGkrKykgewogICAgICAgewotICAgICAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydCgKLSAgICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLAotICAgICAgICAgICAgICBrRmlyc3RJbnNlcnRpb25Qb2ludE5hbWUpKTsKKyAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KAorICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLCBrRmlyc3RJbnNlcnRpb25Qb2ludE5hbWUpKTsKICAgICAgICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CiAgICAgICAgIHByaW50ZXIuUHJpbnRSYXcoR2V0T3V0cHV0RmlsZUNvbnRlbnQobmFtZV8sICJmaXJzdF9pbnNlcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGNvbnRleHQpKTsKQEAgLTE1OSwxMCArMTg0LDkgQEAKICAgICAgIH0KIAogICAgICAgewotICAgICAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAotICAgICAgICAgICAgY29udGV4dC0+T3BlbkZvckluc2VydCgKLSAgICAgICAgICAgICAgR2V0T3V0cHV0RmlsZU5hbWUoaW5zZXJ0X2ludG9baV0sIGZpbGUpLAotICAgICAgICAgICAgICBrU2Vjb25kSW5zZXJ0aW9uUG9pbnROYW1lKSk7CisgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgICAgICBjb250ZXh0LT5PcGVuRm9ySW5zZXJ0KEdldE91dHB1dEZpbGVOYW1lKGluc2VydF9pbnRvW2ldLCBmaWxlKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1NlY29uZEluc2VydGlvblBvaW50TmFtZSkpOwogICAgICAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKICAgICAgICAgcHJpbnRlci5QcmludFJhdyhHZXRPdXRwdXRGaWxlQ29udGVudChuYW1lXywgInNlY29uZF9pbnNlcnQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUsIGNvbnRleHQpKTsKQEAgLTE3Myw3ICsxOTcsNyBAQAogICAgICAgfQogICAgIH0KICAgfSBlbHNlIHsKLSAgICBzY29wZWRfcHRyPGlvOjpaZXJvQ29weU91dHB1dFN0cmVhbT4gb3V0cHV0KAorICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCiAgICAgICAgIGNvbnRleHQtPk9wZW4oR2V0T3V0cHV0RmlsZU5hbWUobmFtZV8sIGZpbGUpKSk7CiAKICAgICBpbzo6UHJpbnRlciBwcmludGVyKG91dHB1dC5nZXQoKSwgJyQnKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL21vY2tfY29kZV9nZW5lcmF0b3IuaAppbmRleCA1Yzc5NDJiLi5lMTY2NWY4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9tb2NrX2NvZGVfZ2VuZXJhdG9yLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvbW9ja19jb2RlX2dlbmVyYXRvci5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCwxMCArMzQsMTUgQEAKICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTVBJTEVSX01PQ0tfQ09ERV9HRU5FUkFUT1JfSF9fCiAKICNpbmNsdWRlIDxzdHJpbmc+CisKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvY29kZV9nZW5lcmF0b3IuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgeworY2xhc3MgRmlsZURlc2NyaXB0b3I7Cit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKKworbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBjb21waWxlciB7CiAKIC8vIEEgbW9jayBDb2RlR2VuZXJhdG9yLCB1c2VkIGJ5IGNvbW1hbmRfbGluZV9pbnRlcmZhY2VfdW5pdHRlc3QuICBUaGlzIGlzIGluCkBAIC01OSw2ICs2NCwxMCBAQAogLy8gICAgIE1vY2tDb2RlR2VuZXJhdG9yX0V4aXQuIiB0byBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgZXhpdCgxMjMpLgogLy8gICBNb2NrQ29kZUdlbmVyYXRvcl9BYm9ydDogIEdlbmVyYXRlKCkgcHJpbnRzICJTYXcgbWVzc2FnZSB0eXBlCiAvLyAgICAgTW9ja0NvZGVHZW5lcmF0b3JfQWJvcnQuIiB0byBzdGRlcnIgYW5kIHRoZW4gY2FsbHMgYWJvcnQoKS4KKy8vICAgTW9ja0NvZGVHZW5lcmF0b3JfSGFzU291cmNlQ29kZUluZm86ICBDYXVzZXMgR2VuZXJhdGUoKSB0byBhYm9ydCBhZnRlcgorLy8gICAgIHByaW50aW5nICJTYXcgbWVzc2FnZSB0eXBlIE1vY2tDb2RlR2VuZXJhdG9yX0hhc1NvdXJjZUNvZGVJbmZvOiBGT08uIiB0bworLy8gICAgIHN0ZGVyciwgd2hlcmUgRk9PIGlzICIxIiBpZiB0aGUgc3VwcGxpZWQgRmlsZURlc2NyaXB0b3JQcm90byBoYXMgc291cmNlCisvLyAgICAgY29kZSBpbmZvLCBhbmQgIjAiIG90aGVyd2lzZS4KIGNsYXNzIE1vY2tDb2RlR2VuZXJhdG9yIDogcHVibGljIENvZGVHZW5lcmF0b3IgewogIHB1YmxpYzoKICAgTW9ja0NvZGVHZW5lcmF0b3IoY29uc3Qgc3RyaW5nJiBuYW1lKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW0uaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19lbnVtX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2VudW1fZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZW51bV9maWVsZC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZXh0ZW5zaW9uLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2V4dGVuc2lvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2V4dGVuc2lvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19leHRlbnNpb24uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2V4dGVuc2lvbi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19maWxlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2ZpbGUuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZmlsZS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfZ2VuZXJhdG9yLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19nZW5lcmF0b3IuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2dlbmVyYXRvci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnMuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVycy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19oZWxwZXJzLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfaGVscGVyc191bml0dGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX2hlbHBlcnNfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21hcF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tYXBfZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21hcF9maWVsZC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21hcF9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21hcF9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWFwX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2UuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19tZXNzYWdlX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX21lc3NhZ2VfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfbWVzc2FnZV9maWVsZC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19vbmVvZi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfb25lb2YuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvb2JqZWN0aXZlYy9vYmplY3RpdmVjX3ByaW1pdGl2ZV9maWVsZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9vYmplY3RpdmVjL29iamVjdGl2ZWNfcHJpbWl0aXZlX2ZpZWxkLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL29iamVjdGl2ZWMvb2JqZWN0aXZlY19wcmltaXRpdmVfZmllbGQuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFja2FnZV9pbmZvLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaAppbmRleCBiODk3MTI2Li5mYjZiNDczIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYWNrYWdlX2luZm8uaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmNjCmluZGV4IDM0MzE3YjEuLjkwZGVkNGQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXIuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQ0LDkgKzQ0LDEwIEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtODQsNiArODUsMzIgQEAKIAogY29uc3QgVHlwZU5hbWVNYXAga1R5cGVOYW1lcyA9IE1ha2VUeXBlTmFtZVRhYmxlKCk7CiAKKy8vIENhbWVsLWNhc2UgdGhlIGZpZWxkIG5hbWUgYW5kIGFwcGVuZCAiRW50cnkiIGZvciBnZW5lcmF0ZWQgbWFwIGVudHJ5IG5hbWUuCisvLyBlLmcuIG1hcDxLZXlUeXBlLCBWYWx1ZVR5cGU+IGZvb19tYXAgPT4gRm9vTWFwRW50cnkKK3N0cmluZyBNYXBFbnRyeU5hbWUoY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lKSB7CisgIHN0cmluZyByZXN1bHQ7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtTdWZmaXhbXSA9ICJFbnRyeSI7CisgIHJlc3VsdC5yZXNlcnZlKGZpZWxkX25hbWUuc2l6ZSgpICsgc2l6ZW9mKGtTdWZmaXgpKTsKKyAgYm9vbCBjYXBfbmV4dCA9IHRydWU7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfbmFtZS5zaXplKCk7ICsraSkgeworICAgIGlmIChmaWVsZF9uYW1lW2ldID09ICdfJykgeworICAgICAgY2FwX25leHQgPSB0cnVlOworICAgIH0gZWxzZSBpZiAoY2FwX25leHQpIHsKKyAgICAgIC8vIE5vdGU6IERvIG5vdCB1c2UgY3R5cGUuaCBkdWUgdG8gbG9jYWxlcy4KKyAgICAgIGlmICgnYScgPD0gZmllbGRfbmFtZVtpXSAmJiBmaWVsZF9uYW1lW2ldIDw9ICd6JykgeworICAgICAgICByZXN1bHQucHVzaF9iYWNrKGZpZWxkX25hbWVbaV0gLSAnYScgKyAnQScpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhmaWVsZF9uYW1lW2ldKTsKKyAgICAgIH0KKyAgICAgIGNhcF9uZXh0ID0gZmFsc2U7CisgICAgfSBlbHNlIHsKKyAgICAgIHJlc3VsdC5wdXNoX2JhY2soZmllbGRfbmFtZVtpXSk7CisgICAgfQorICB9CisgIHJlc3VsdC5hcHBlbmQoa1N1ZmZpeCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKIH0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKIAogLy8gTWFrZXMgY29kZSBzbGlnaHRseSBtb3JlIHJlYWRhYmxlLiAgVGhlIG1lYW5pbmcgb2YgIkRPKGZvbykiIGlzCkBAIC0xNzQsNiArMjAxLDIwIEBACiAgIH0KIH0KIAorYm9vbCBQYXJzZXI6OkNvbnN1bWVTaWduZWRJbnRlZ2VyKGludCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcikgeworICBib29sIGlzX25lZ2F0aXZlID0gZmFsc2U7CisgIHVpbnQ2NCBtYXhfdmFsdWUgPSBraW50MzJtYXg7CisgIGlmIChUcnlDb25zdW1lKCItIikpIHsKKyAgICBpc19uZWdhdGl2ZSA9IHRydWU7CisgICAgbWF4X3ZhbHVlICs9IDE7CisgIH0KKyAgdWludDY0IHZhbHVlID0gMDsKKyAgRE8oQ29uc3VtZUludGVnZXI2NChtYXhfdmFsdWUsICZ2YWx1ZSwgZXJyb3IpKTsKKyAgaWYgKGlzX25lZ2F0aXZlKSB2YWx1ZSAqPSAtMTsKKyAgKm91dHB1dCA9IHZhbHVlOworICByZXR1cm4gdHJ1ZTsKK30KKwogYm9vbCBQYXJzZXI6OkNvbnN1bWVJbnRlZ2VyNjQodWludDY0IG1heF92YWx1ZSwgdWludDY0KiBvdXRwdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBlcnJvcikgewogICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVIpKSB7CkBAIC0yMzcsNiArMjc4LDQ3IEBACiAgIH0KIH0KIAorYm9vbCBQYXJzZXI6OlRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKAorICAgIGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKSB7CisgIGlmIChMb29raW5nQXQodGV4dCkpIHsKKyAgICBzdHJpbmcgbGVhZGluZywgdHJhaWxpbmc7CisgICAgdmVjdG9yPHN0cmluZz4gZGV0YWNoZWQ7CisgICAgaW5wdXRfLT5OZXh0V2l0aENvbW1lbnRzKCZ0cmFpbGluZywgJmRldGFjaGVkLCAmbGVhZGluZyk7CisKKyAgICAvLyBTYXZlIHRoZSBsZWFkaW5nIGNvbW1lbnRzIGZvciBuZXh0IHRpbWUsIGFuZCByZWNhbGwgdGhlIGxlYWRpbmcgY29tbWVudHMKKyAgICAvLyBmcm9tIGxhc3QgdGltZS4KKyAgICBsZWFkaW5nLnN3YXAodXBjb21pbmdfZG9jX2NvbW1lbnRzXyk7CisKKyAgICBpZiAobG9jYXRpb24gIT0gTlVMTCkgeworICAgICAgdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLnN3YXAoZGV0YWNoZWQpOworICAgICAgbG9jYXRpb24tPkF0dGFjaENvbW1lbnRzKCZsZWFkaW5nLCAmdHJhaWxpbmcsICZkZXRhY2hlZCk7CisgICAgfSBlbHNlIGlmIChzdHJjbXAodGV4dCwgIn0iKSA9PSAwKSB7CisgICAgICAvLyBJZiB0aGUgY3VycmVudCBsb2NhdGlvbiBpcyBudWxsIGFuZCB3ZSBhcmUgZmluaXNoaW5nIHRoZSBjdXJyZW50IHNjb3BlLAorICAgICAgLy8gZHJvcCBwZW5kaW5nIHVwY29taW5nIGRldGFjaGVkIGNvbW1lbnRzLgorICAgICAgdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLnN3YXAoZGV0YWNoZWQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPdGhlcndpc2UsIGFwcGVuZCB0aGUgbmV3IGRldGFjaGVkIGNvbW1lbnRzIHRvIHRoZSBleGlzdGluZyB1cGNvbWluZworICAgICAgLy8gZGV0YWNoZWQgY29tbWVudHMuCisgICAgICB1cGNvbWluZ19kZXRhY2hlZF9jb21tZW50c18uaW5zZXJ0KHVwY29taW5nX2RldGFjaGVkX2NvbW1lbnRzXy5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV0YWNoZWQuYmVnaW4oKSwgZGV0YWNoZWQuZW5kKCkpOworICAgIH0KKworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorfQorCitib29sIFBhcnNlcjo6Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oCisgICAgY29uc3QgY2hhciogdGV4dCwgY29uc3QgTG9jYXRpb25SZWNvcmRlciogbG9jYXRpb24pIHsKKyAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKHRleHQsIGxvY2F0aW9uKSkgeworICAgIHJldHVybiB0cnVlOworICB9IGVsc2UgeworICAgIEFkZEVycm9yKCJFeHBlY3RlZCBcIiIgKyBzdHJpbmcodGV4dCkgKyAiXCIuIik7CisgICAgcmV0dXJuIGZhbHNlOworICB9Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogdm9pZCBQYXJzZXI6OkFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIGVycm9yKSB7CkBAIC0zMDAsNiArMzgyLDExIEBACiAgIGxvY2F0aW9uXy0+c2V0X3NwYW4oMSwgdG9rZW4uY29sdW1uKTsKIH0KIAordm9pZCBQYXJzZXI6OkxvY2F0aW9uUmVjb3JkZXI6OlN0YXJ0QXQoY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb3RoZXIpIHsKKyAgbG9jYXRpb25fLT5zZXRfc3BhbigwLCBvdGhlci5sb2NhdGlvbl8tPnNwYW4oMCkpOworICBsb2NhdGlvbl8tPnNldF9zcGFuKDEsIG90aGVyLmxvY2F0aW9uXy0+c3BhbigxKSk7Cit9CisKIHZvaWQgUGFyc2VyOjpMb2NhdGlvblJlY29yZGVyOjpFbmRBdChjb25zdCBpbzo6VG9rZW5pemVyOjpUb2tlbiYgdG9rZW4pIHsKICAgaWYgKHRva2VuLmxpbmUgIT0gbG9jYXRpb25fLT5zcGFuKDApKSB7CiAgICAgbG9jYXRpb25fLT5hZGRfc3Bhbih0b2tlbi5saW5lKTsKQEAgLTMxNSw2ICs0MDIsMjUgQEAKICAgfQogfQogCit2b2lkIFBhcnNlcjo6TG9jYXRpb25SZWNvcmRlcjo6QXR0YWNoQ29tbWVudHMoCisgICAgc3RyaW5nKiBsZWFkaW5nLCBzdHJpbmcqIHRyYWlsaW5nLAorICAgIHZlY3RvcjxzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cykgY29uc3QgeworICBHT09HTEVfQ0hFQ0soIWxvY2F0aW9uXy0+aGFzX2xlYWRpbmdfY29tbWVudHMoKSk7CisgIEdPT0dMRV9DSEVDSyghbG9jYXRpb25fLT5oYXNfdHJhaWxpbmdfY29tbWVudHMoKSk7CisKKyAgaWYgKCFsZWFkaW5nLT5lbXB0eSgpKSB7CisgICAgbG9jYXRpb25fLT5tdXRhYmxlX2xlYWRpbmdfY29tbWVudHMoKS0+c3dhcCgqbGVhZGluZyk7CisgIH0KKyAgaWYgKCF0cmFpbGluZy0+ZW1wdHkoKSkgeworICAgIGxvY2F0aW9uXy0+bXV0YWJsZV90cmFpbGluZ19jb21tZW50cygpLT5zd2FwKCp0cmFpbGluZyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXRhY2hlZF9jb21tZW50cy0+c2l6ZSgpOyArK2kpIHsKKyAgICBsb2NhdGlvbl8tPmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCktPnN3YXAoCisgICAgICAgICgqZGV0YWNoZWRfY29tbWVudHMpW2ldKTsKKyAgfQorICBkZXRhY2hlZF9jb21tZW50cy0+Y2xlYXIoKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkIFBhcnNlcjo6U2tpcFN0YXRlbWVudCgpIHsKQEAgLTMyMiw3ICs0MjgsNyBAQAogICAgIGlmIChBdEVuZCgpKSB7CiAgICAgICByZXR1cm47CiAgICAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfU1lNQk9MKSkgewotICAgICAgaWYgKFRyeUNvbnN1bWUoIjsiKSkgeworICAgICAgaWYgKFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgTlVMTCkpIHsKICAgICAgICAgcmV0dXJuOwogICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCJ7IikpIHsKICAgICAgICAgU2tpcFJlc3RPZkJsb2NrKCk7CkBAIC0zNDAsNyArNDQ2LDcgQEAKICAgICBpZiAoQXRFbmQoKSkgewogICAgICAgcmV0dXJuOwogICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NZTUJPTCkpIHsKLSAgICAgIGlmIChUcnlDb25zdW1lKCJ9IikpIHsKKyAgICAgIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKSB7CiAgICAgICAgIHJldHVybjsKICAgICAgIH0gZWxzZSBpZiAoVHJ5Q29uc3VtZSgieyIpKSB7CiAgICAgICAgIFNraXBSZXN0T2ZCbG9jaygpOwpAQCAtMzUyLDYgKzQ1OCw2MSBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKK2Jvb2wgUGFyc2VyOjpWYWxpZGF0ZUVudW0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byogcHJvdG8pIHsKKyAgYm9vbCBoYXNfYWxsb3dfYWxpYXMgPSBmYWxzZTsKKyAgYm9vbCBhbGxvd19hbGlhcyA9IGZhbHNlOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8tPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24gb3B0aW9uID0gcHJvdG8tPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbihpKTsKKyAgICBpZiAob3B0aW9uLm5hbWVfc2l6ZSgpID4gMSkgeworICAgICAgY29udGludWU7CisgICAgfQorICAgIGlmICghb3B0aW9uLm5hbWUoMCkuaXNfZXh0ZW5zaW9uKCkgJiYKKyAgICAgICAgb3B0aW9uLm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gImFsbG93X2FsaWFzIikgeworICAgICAgaGFzX2FsbG93X2FsaWFzID0gdHJ1ZTsKKyAgICAgIGlmIChvcHRpb24uaWRlbnRpZmllcl92YWx1ZSgpID09ICJ0cnVlIikgeworICAgICAgICBhbGxvd19hbGlhcyA9IHRydWU7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICBpZiAoaGFzX2FsbG93X2FsaWFzICYmICFhbGxvd19hbGlhcykgeworICAgIHN0cmluZyBlcnJvciA9CisgICAgICAgICJcIiIgKyBwcm90by0+bmFtZSgpICsKKyAgICAgICAgIlwiIGRlY2xhcmVzICdvcHRpb24gYWxsb3dfYWxpYXMgPSBmYWxzZTsnIHdoaWNoIGhhcyBubyBlZmZlY3QuICIKKyAgICAgICAgIlBsZWFzZSByZW1vdmUgdGhlIGRlY2xhcmF0aW9uLiI7CisgICAgLy8gVGhpcyBuZWVkbGVzc2x5IGNsdXR0ZXJzIGRlY2xhcmF0aW9ucyB3aXRoIG5vcHMuCisgICAgQWRkRXJyb3IoZXJyb3IpOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHNldDxpbnQ+IHVzZWRfdmFsdWVzOworICBib29sIGhhc19kdXBsaWNhdGVzID0gZmFsc2U7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8tPnZhbHVlX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIGVudW1fdmFsdWUgPSBwcm90by0+dmFsdWUoaSk7CisgICAgaWYgKHVzZWRfdmFsdWVzLmZpbmQoZW51bV92YWx1ZS5udW1iZXIoKSkgIT0gdXNlZF92YWx1ZXMuZW5kKCkpIHsKKyAgICAgIGhhc19kdXBsaWNhdGVzID0gdHJ1ZTsKKyAgICAgIGJyZWFrOworICAgIH0gZWxzZSB7CisgICAgICB1c2VkX3ZhbHVlcy5pbnNlcnQoZW51bV92YWx1ZS5udW1iZXIoKSk7CisgICAgfQorICB9CisgIGlmIChhbGxvd19hbGlhcyAmJiAhaGFzX2R1cGxpY2F0ZXMpIHsKKyAgICBzdHJpbmcgZXJyb3IgPQorICAgICAgICAiXCIiICsgcHJvdG8tPm5hbWUoKSArCisgICAgICAgICJcIiBkZWNsYXJlcyBzdXBwb3J0IGZvciBlbnVtIGFsaWFzZXMgYnV0IG5vIGVudW0gdmFsdWVzIHNoYXJlIGZpZWxkICIKKyAgICAgICAgIm51bWJlcnMuIFBsZWFzZSByZW1vdmUgdGhlIHVubmVjZXNzYXJ5ICdvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOycgIgorICAgICAgICAiZGVjbGFyYXRpb24uIjsKKyAgICAvLyBHZW5lcmF0ZSBhbiBlcnJvciBpZiBhbiBlbnVtIGRlY2xhcmVzIHN1cHBvcnQgZm9yIGR1cGxpY2F0ZSBlbnVtIHZhbHVlcworICAgIC8vIGFuZCBkb2VzIG5vdCB1c2UgaXQgcHJvdGVjdCBmdXR1cmUgYXV0aG9ycy4KKyAgICBBZGRFcnJvcihlcnJvcik7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgcmV0dXJuIHRydWU7Cit9CisKIGJvb2wgUGFyc2VyOjpQYXJzZShpbzo6VG9rZW5pemVyKiBpbnB1dCwgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSkgewogICBpbnB1dF8gPSBpbnB1dDsKICAgaGFkX2Vycm9yc18gPSBmYWxzZTsKQEAgLTM2NCwyMSArNTI1LDI5IEBACiAgIFNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm87CiAgIHNvdXJjZV9jb2RlX2luZm9fID0gJnNvdXJjZV9jb2RlX2luZm87CiAKKyAgdmVjdG9yPHN0cmluZz4gdG9wX2RvY19jb21tZW50czsKICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVEFSVCkpIHsKICAgICAvLyBBZHZhbmNlIHRvIGZpcnN0IHRva2VuLgotICAgIGlucHV0Xy0+TmV4dCgpOworICAgIGlucHV0Xy0+TmV4dFdpdGhDb21tZW50cyhOVUxMLCAmdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBjb21pbmdfZG9jX2NvbW1lbnRzXyk7CiAgIH0KIAogICB7CiAgICAgTG9jYXRpb25SZWNvcmRlciByb290X2xvY2F0aW9uKHRoaXMpOwogCiAgICAgaWYgKHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfIHx8IExvb2tpbmdBdCgic3ludGF4IikpIHsKLSAgICAgIGlmICghUGFyc2VTeW50YXhJZGVudGlmaWVyKCkpIHsKKyAgICAgIGlmICghUGFyc2VTeW50YXhJZGVudGlmaWVyKHJvb3RfbG9jYXRpb24pKSB7CiAgICAgICAgIC8vIERvbid0IGF0dGVtcHQgdG8gcGFyc2UgdGhlIGZpbGUgaWYgd2UgZGlkbid0IHJlY29nbml6ZSB0aGUgc3ludGF4CiAgICAgICAgIC8vIGlkZW50aWZpZXIuCiAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgIH0KKyAgICAgIC8vIFN0b3JlIHRoZSBzeW50YXggaW50byB0aGUgZmlsZS4KKyAgICAgIGlmIChmaWxlICE9IE5VTEwpIGZpbGUtPnNldF9zeW50YXgoc3ludGF4X2lkZW50aWZpZXJfKTsKICAgICB9IGVsc2UgaWYgKCFzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXykgeworICAgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCAiTm8gc3ludGF4IHNwZWNpZmllZCBmb3IgdGhlIHByb3RvIGZpbGU6ICIKKyAgICAgICAgICAgICAgICAgICA8PCBmaWxlLT5uYW1lKCkgPDwgIi4gUGxlYXNlIHVzZSAnc3ludGF4ID0gXCJwcm90bzJcIjsnICIKKyAgICAgICAgICAgICAgICAgICA8PCAib3IgJ3N5bnRheCA9IFwicHJvdG8zXCI7JyB0byBzcGVjaWZ5IGEgc3ludGF4ICIKKyAgICAgICAgICAgICAgICAgICA8PCAidmVyc2lvbi4gKERlZmF1bHRlZCB0byBwcm90bzIgc3ludGF4LikiOwogICAgICAgc3ludGF4X2lkZW50aWZpZXJfID0gInByb3RvMiI7CiAgICAgfQogCkBAIC0zOTMsNyArNTYyLDggQEAKIAogICAgICAgICBpZiAoTG9va2luZ0F0KCJ9IikpIHsKICAgICAgICAgICBBZGRFcnJvcigiVW5tYXRjaGVkIFwifVwiLiIpOwotICAgICAgICAgIGlucHV0Xy0+TmV4dCgpOworICAgICAgICAgIGlucHV0Xy0+TmV4dFdpdGhDb21tZW50cyhOVUxMLCAmdXBjb21pbmdfZGV0YWNoZWRfY29tbWVudHNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdXBjb21pbmdfZG9jX2NvbW1lbnRzXyk7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC00MDUsMjAgKzU3NSwyNSBAQAogICByZXR1cm4gIWhhZF9lcnJvcnNfOwogfQogCi1ib29sIFBhcnNlcjo6UGFyc2VTeW50YXhJZGVudGlmaWVyKCkgewotICBETyhDb25zdW1lKCJzeW50YXgiLCAiRmlsZSBtdXN0IGJlZ2luIHdpdGggJ3N5bnRheCA9IFwicHJvdG8yXCI7Jy4iKSk7Citib29sIFBhcnNlcjo6UGFyc2VTeW50YXhJZGVudGlmaWVyKGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudCkgeworICBMb2NhdGlvblJlY29yZGVyIHN5bnRheF9sb2NhdGlvbihwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTeW50YXhGaWVsZE51bWJlcik7CisgIERPKENvbnN1bWUoCisgICAgICAic3ludGF4IiwKKyAgICAgICJGaWxlIG11c3QgYmVnaW4gd2l0aCBhIHN5bnRheCBzdGF0ZW1lbnQsIGUuZy4gJ3N5bnRheCA9IFwicHJvdG8yXCI7Jy4iKSk7CiAgIERPKENvbnN1bWUoIj0iKSk7CiAgIGlvOjpUb2tlbml6ZXI6OlRva2VuIHN5bnRheF90b2tlbiA9IGlucHV0Xy0+Y3VycmVudCgpOwogICBzdHJpbmcgc3ludGF4OwogICBETyhDb25zdW1lU3RyaW5nKCZzeW50YXgsICJFeHBlY3RlZCBzeW50YXggaWRlbnRpZmllci4iKSk7Ci0gIERPKENvbnN1bWUoIjsiKSk7CisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJnN5bnRheF9sb2NhdGlvbikpOwogCiAgIHN5bnRheF9pZGVudGlmaWVyXyA9IHN5bnRheDsKIAotICBpZiAoc3ludGF4ICE9ICJwcm90bzIiICYmICFzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXykgeworICBpZiAoc3ludGF4ICE9ICJwcm90bzIiICYmIHN5bnRheCAhPSAicHJvdG8zIiAmJgorICAgICAgIXN0b3BfYWZ0ZXJfc3ludGF4X2lkZW50aWZpZXJfKSB7CiAgICAgQWRkRXJyb3Ioc3ludGF4X3Rva2VuLmxpbmUsIHN5bnRheF90b2tlbi5jb2x1bW4sCiAgICAgICAiVW5yZWNvZ25pemVkIHN5bnRheCBpZGVudGlmaWVyIFwiIiArIHN5bnRheCArICJcIi4gIFRoaXMgcGFyc2VyICIKLSAgICAgICJvbmx5IHJlY29nbml6ZXMgXCJwcm90bzJcIi4iKTsKKyAgICAgICJvbmx5IHJlY29nbml6ZXMgXCJwcm90bzJcIiBhbmQgXCJwcm90bzNcIi4iKTsKICAgICByZXR1cm4gZmFsc2U7CiAgIH0KIApAQCAtNDI3LDIxICs2MDIsMjEgQEAKIAogYm9vbCBQYXJzZXI6OlBhcnNlVG9wTGV2ZWxTdGF0ZW1lbnQoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24pIHsKLSAgaWYgKFRyeUNvbnN1bWUoIjsiKSkgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgewogICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCiAgICAgcmV0dXJuIHRydWU7CiAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJtZXNzYWdlIikpIHsKICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCiAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlciwgZmlsZS0+bWVzc2FnZV90eXBlX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlTWVzc2FnZURlZmluaXRpb24oZmlsZS0+YWRkX21lc3NhZ2VfdHlwZSgpLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlTWVzc2FnZURlZmluaXRpb24oZmlsZS0+YWRkX21lc3NhZ2VfdHlwZSgpLCBsb2NhdGlvbiwgZmlsZSk7CiAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJlbnVtIikpIHsKICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCiAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprRW51bVR5cGVGaWVsZE51bWJlciwgZmlsZS0+ZW51bV90eXBlX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlRW51bURlZmluaXRpb24oZmlsZS0+YWRkX2VudW1fdHlwZSgpLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlRW51bURlZmluaXRpb24oZmlsZS0+YWRkX2VudW1fdHlwZSgpLCBsb2NhdGlvbiwgZmlsZSk7CiAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJzZXJ2aWNlIikpIHsKICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHJvb3RfbG9jYXRpb24sCiAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprU2VydmljZUZpZWxkTnVtYmVyLCBmaWxlLT5zZXJ2aWNlX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlU2VydmljZURlZmluaXRpb24oZmlsZS0+YWRkX3NlcnZpY2UoKSwgbG9jYXRpb24pOworICAgIHJldHVybiBQYXJzZVNlcnZpY2VEZWZpbml0aW9uKGZpbGUtPmFkZF9zZXJ2aWNlKCksIGxvY2F0aW9uLCBmaWxlKTsKICAgfSBlbHNlIGlmIChMb29raW5nQXQoImV4dGVuZCIpKSB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAogICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOwpAQCAtNDQ5LDE2ICs2MjQsMTkgQEAKICAgICAgICAgICAgICAgICAgICAgICAgZmlsZS0+bXV0YWJsZV9tZXNzYWdlX3R5cGUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgcm9vdF9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGZpbGUpOwogICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiaW1wb3J0IikpIHsKLSAgICBpbnQgaW5kZXggPSBmaWxlLT5kZXBlbmRlbmN5X3NpemUoKTsKLSAgICByZXR1cm4gUGFyc2VJbXBvcnQoZmlsZS0+YWRkX2RlcGVuZGVuY3koKSwgcm9vdF9sb2NhdGlvbiwgaW5kZXgpOworICAgIHJldHVybiBQYXJzZUltcG9ydChmaWxlLT5tdXRhYmxlX2RlcGVuZGVuY3koKSwKKyAgICAgICAgICAgICAgICAgICAgICAgZmlsZS0+bXV0YWJsZV9wdWJsaWNfZGVwZW5kZW5jeSgpLAorICAgICAgICAgICAgICAgICAgICAgICBmaWxlLT5tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpLAorICAgICAgICAgICAgICAgICAgICAgICByb290X2xvY2F0aW9uLCBmaWxlKTsKICAgfSBlbHNlIGlmIChMb29raW5nQXQoInBhY2thZ2UiKSkgewotICAgIHJldHVybiBQYXJzZVBhY2thZ2UoZmlsZSwgcm9vdF9sb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlUGFja2FnZShmaWxlLCByb290X2xvY2F0aW9uLCBmaWxlKTsKICAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihyb290X2xvY2F0aW9uLAogICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKLSAgICByZXR1cm4gUGFyc2VPcHRpb24oZmlsZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uKTsKKyAgICByZXR1cm4gUGFyc2VPcHRpb24oZmlsZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uLCBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICBPUFRJT05fU1RBVEVNRU5UKTsKICAgfSBlbHNlIHsKICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgdG9wLWxldmVsIHN0YXRlbWVudCAoZS5nLiBcIm1lc3NhZ2VcIikuIik7CiAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNDY4LDggKzY0NiwxMCBAQAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTWVzc2FnZXMKIAotYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZURlZmluaXRpb24oRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbikgeworYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZURlZmluaXRpb24oCisgICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CiAgIERPKENvbnN1bWUoIm1lc3NhZ2UiKSk7CiAgIHsKICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCkBAIC00NzgsNDkgKzY1OCw5MiBAQAogICAgICAgICBtZXNzYWdlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUpOwogICAgIERPKENvbnN1bWVJZGVudGlmaWVyKG1lc3NhZ2UtPm11dGFibGVfbmFtZSgpLCAiRXhwZWN0ZWQgbWVzc2FnZSBuYW1lLiIpKTsKICAgfQotICBETyhQYXJzZU1lc3NhZ2VCbG9jayhtZXNzYWdlLCBtZXNzYWdlX2xvY2F0aW9uKSk7CisgIERPKFBhcnNlTWVzc2FnZUJsb2NrKG1lc3NhZ2UsIG1lc3NhZ2VfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBQYXJzZXI6OlBhcnNlTWVzc2FnZUJsb2NrKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uKSB7Ci0gIERPKENvbnN1bWUoInsiKSk7CituYW1lc3BhY2UgewogCi0gIHdoaWxlICghVHJ5Q29uc3VtZSgifSIpKSB7Citjb25zdCBpbnQga01heEV4dGVuc2lvblJhbmdlU2VudGluZWwgPSAtMTsKKworYm9vbCBJc01lc3NhZ2VTZXRXaXJlRm9ybWF0TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2UpIHsKKyAgY29uc3QgTWVzc2FnZU9wdGlvbnMmIG9wdGlvbnMgPSBtZXNzYWdlLm9wdGlvbnMoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBvcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZCA9IG9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24oaSk7CisgICAgaWYgKHVuaW50ZXJwcmV0ZWQubmFtZV9zaXplKCkgPT0gMSAmJgorICAgICAgICB1bmludGVycHJldGVkLm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gIm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0IiAmJgorICAgICAgICB1bmludGVycHJldGVkLmlkZW50aWZpZXJfdmFsdWUoKSA9PSAidHJ1ZSIpIHsKKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKKy8vIE1vZGlmaWVzIGFueSBleHRlbnNpb24gcmFuZ2VzIHRoYXQgc3BlY2lmaWVkICdtYXgnIGFzIHRoZSBlbmQgb2YgdGhlCisvLyBleHRlbnNpb24gcmFuZ2UsIGFuZCBzZXRzIHRoZW0gdG8gdGhlIHR5cGUtc3BlY2lmaWMgbWF4aW11bS4gVGhlIGFjdHVhbCBtYXgKKy8vIHRhZyBudW1iZXIgY2FuIG9ubHkgYmUgZGV0ZXJtaW5lZCBhZnRlciBhbGwgb3B0aW9ucyBoYXZlIGJlZW4gcGFyc2VkLgordm9pZCBBZGp1c3RFeHRlbnNpb25SYW5nZXNXaXRoTWF4RW5kTnVtYmVyKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSkgeworICBjb25zdCBib29sIGlzX21lc3NhZ2Vfc2V0ID0gSXNNZXNzYWdlU2V0V2lyZUZvcm1hdE1lc3NhZ2UoKm1lc3NhZ2UpOworICBjb25zdCBpbnQgbWF4X2V4dGVuc2lvbl9udW1iZXIgPSBpc19tZXNzYWdlX3NldCA/CisgICAgICBraW50MzJtYXggOgorICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyICsgMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2Vfc2l6ZSgpOyArK2kpIHsKKyAgICBpZiAobWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlKGkpLmVuZCgpID09IGtNYXhFeHRlbnNpb25SYW5nZVNlbnRpbmVsKSB7CisgICAgICBtZXNzYWdlLT5tdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpKS0+c2V0X2VuZChtYXhfZXh0ZW5zaW9uX251bWJlcik7CisgICAgfQorICB9Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlQmxvY2soRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJm1lc3NhZ2VfbG9jYXRpb24pKTsKKworICB3aGlsZSAoIVRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgTlVMTCkpIHsKICAgICBpZiAoQXRFbmQoKSkgewogICAgICAgQWRkRXJyb3IoIlJlYWNoZWQgZW5kIG9mIGlucHV0IGluIG1lc3NhZ2UgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLiIpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghUGFyc2VNZXNzYWdlU3RhdGVtZW50KG1lc3NhZ2UsIG1lc3NhZ2VfbG9jYXRpb24pKSB7CisgICAgaWYgKCFQYXJzZU1lc3NhZ2VTdGF0ZW1lbnQobWVzc2FnZSwgbWVzc2FnZV9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSkgewogICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQogICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KICAgICAgIFNraXBTdGF0ZW1lbnQoKTsKICAgICB9CiAgIH0KIAorICBpZiAobWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSA+IDApIHsKKyAgICBBZGp1c3RFeHRlbnNpb25SYW5nZXNXaXRoTWF4RW5kTnVtYmVyKG1lc3NhZ2UpOworICB9CiAgIHJldHVybiB0cnVlOwogfQogCiBib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlU3RhdGVtZW50KERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbikgewotICBpZiAoVHJ5Q29uc3VtZSgiOyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgewogICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCiAgICAgcmV0dXJuIHRydWU7CiAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJtZXNzYWdlIikpIHsKICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9zaXplKCkpOwotICAgIHJldHVybiBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKG1lc3NhZ2UtPmFkZF9uZXN0ZWRfdHlwZSgpLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlTWVzc2FnZURlZmluaXRpb24obWVzc2FnZS0+YWRkX25lc3RlZF90eXBlKCksIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSk7CiAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJlbnVtIikpIHsKICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+ZW51bV90eXBlX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlRW51bURlZmluaXRpb24obWVzc2FnZS0+YWRkX2VudW1fdHlwZSgpLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlRW51bURlZmluaXRpb24obWVzc2FnZS0+YWRkX2VudW1fdHlwZSgpLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpOwogICB9IGVsc2UgaWYgKExvb2tpbmdBdCgiZXh0ZW5zaW9ucyIpKSB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlRXh0ZW5zaW9ucyhtZXNzYWdlLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlRXh0ZW5zaW9ucyhtZXNzYWdlLCBsb2NhdGlvbiwgY29udGFpbmluZ19maWxlKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoInJlc2VydmVkIikpIHsKKyAgICByZXR1cm4gUGFyc2VSZXNlcnZlZChtZXNzYWdlLCBtZXNzYWdlX2xvY2F0aW9uKTsKICAgfSBlbHNlIGlmIChMb29raW5nQXQoImV4dGVuZCIpKSB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOwpAQCAtNTI4LDExICs3NTEsMjEgQEAKICAgICAgICAgICAgICAgICAgICAgICAgbWVzc2FnZS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSk7CiAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvcHRpb24iKSkgewogICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24obWVzc2FnZV9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlT3B0aW9uKG1lc3NhZ2UtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlT3B0aW9uKG1lc3NhZ2UtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlLCBPUFRJT05fU1RBVEVNRU5UKTsKKyAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9uZW9mIikpIHsKKyAgICBpbnQgb25lb2ZfaW5kZXggPSBtZXNzYWdlLT5vbmVvZl9kZWNsX3NpemUoKTsKKyAgICBMb2NhdGlvblJlY29yZGVyIG9uZW9mX2xvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtPbmVvZkRlY2xGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZW9mX2luZGV4KTsKKworICAgIHJldHVybiBQYXJzZU9uZW9mKG1lc3NhZ2UtPmFkZF9vbmVvZl9kZWNsKCksIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgb25lb2ZfaW5kZXgsIG9uZW9mX2xvY2F0aW9uLCBtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSk7CiAgIH0gZWxzZSB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprRmllbGRGaWVsZE51bWJlciwKQEAgLTU0MSw3ICs3NzQsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5tdXRhYmxlX25lc3RlZF90eXBlKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a05lc3RlZFR5cGVGaWVsZE51bWJlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKTsKICAgfQogfQogCkBAIC01NDksMzAgKzc4MywxMDYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbikgewotICAvLyBQYXJzZSBsYWJlbCBhbmQgdHlwZS4KLSAgaW86OlRva2VuaXplcjo6VG9rZW4gbGFiZWxfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKICAgewogICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0xhYmVsRmllbGROdW1iZXIpOwogICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMYWJlbCBsYWJlbDsKLSAgICBETyhQYXJzZUxhYmVsKCZsYWJlbCkpOwotICAgIGZpZWxkLT5zZXRfbGFiZWwobGFiZWwpOworICAgIGlmIChQYXJzZUxhYmVsKCZsYWJlbCwgY29udGFpbmluZ19maWxlKSkgeworICAgICAgZmllbGQtPnNldF9sYWJlbChsYWJlbCk7CisgICAgICBpZiAobGFiZWwgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMICYmCisgICAgICAgICAgc3ludGF4X2lkZW50aWZpZXJfID09ICJwcm90bzMiKSB7CisgICAgICAgIEFkZEVycm9yKAorICAgICAgICAgICAgIkV4cGxpY2l0ICdvcHRpb25hbCcgbGFiZWxzIGFyZSBkaXNhbGxvd2VkIGluIHRoZSBQcm90bzMgc3ludGF4LiAiCisgICAgICAgICAgICAiVG8gZGVmaW5lICdvcHRpb25hbCcgZmllbGRzIGluIFByb3RvMywgc2ltcGx5IHJlbW92ZSB0aGUgIgorICAgICAgICAgICAgIidvcHRpb25hbCcgbGFiZWwsIGFzIGZpZWxkcyBhcmUgJ29wdGlvbmFsJyBieSBkZWZhdWx0LiIpOworICAgICAgfQorICAgIH0KICAgfQogCisgIHJldHVybiBQYXJzZU1lc3NhZ2VGaWVsZE5vTGFiZWwoZmllbGQsIG1lc3NhZ2VzLCBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUpOworfQorCitib29sIFBhcnNlcjo6UGFyc2VNZXNzYWdlRmllbGROb0xhYmVsKAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzLAorICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKKyAgICBpbnQgbG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSwKKyAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKKyAgTWFwRmllbGQgbWFwX2ZpZWxkOworICAvLyBQYXJzZSB0eXBlLgogICB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihmaWVsZF9sb2NhdGlvbik7ICAvLyBhZGQgcGF0aCBsYXRlcgogICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKGZpZWxkLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUpOwogCisgICAgYm9vbCB0eXBlX3BhcnNlZCA9IGZhbHNlOwogICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlIHR5cGUgPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMjsKICAgICBzdHJpbmcgdHlwZV9uYW1lOwotICAgIERPKFBhcnNlVHlwZSgmdHlwZSwgJnR5cGVfbmFtZSkpOwotICAgIGlmICh0eXBlX25hbWUuZW1wdHkoKSkgewotICAgICAgbG9jYXRpb24uQWRkUGF0aChGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVGaWVsZE51bWJlcik7Ci0gICAgICBmaWVsZC0+c2V0X3R5cGUodHlwZSk7Ci0gICAgfSBlbHNlIHsKKworICAgIC8vIFNwZWNpYWwgY2FzZSBtYXAgZmllbGQuIFdlIG9ubHkgdHJlYXQgdGhlIGZpZWxkIGFzIGEgbWFwIGZpZWxkIGlmIHRoZQorICAgIC8vIGZpZWxkIHR5cGUgbmFtZSBzdGFydHMgd2l0aCB0aGUgd29yZCAibWFwIiB3aXRoIGEgZm9sbG93aW5nICI8Ii4KKyAgICBpZiAoVHJ5Q29uc3VtZSgibWFwIikpIHsKKyAgICAgIGlmIChMb29raW5nQXQoIjwiKSkgeworICAgICAgICBtYXBfZmllbGQuaXNfbWFwX2ZpZWxkID0gdHJ1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEZhbHNlIHBvc2l0aXZlCisgICAgICAgIHR5cGVfcGFyc2VkID0gdHJ1ZTsKKyAgICAgICAgdHlwZV9uYW1lID0gIm1hcCI7CisgICAgICB9CisgICAgfQorICAgIGlmIChtYXBfZmllbGQuaXNfbWFwX2ZpZWxkKSB7CisgICAgICBpZiAoZmllbGQtPmhhc19vbmVvZl9pbmRleCgpKSB7CisgICAgICAgIEFkZEVycm9yKCJNYXAgZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBvbmVvZnMuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlmIChmaWVsZC0+aGFzX2xhYmVsKCkpIHsKKyAgICAgICAgQWRkRXJyb3IoCisgICAgICAgICAgICAiRmllbGQgbGFiZWxzIChyZXF1aXJlZC9vcHRpb25hbC9yZXBlYXRlZCkgYXJlIG5vdCBhbGxvd2VkIG9uICIKKyAgICAgICAgICAgICJtYXAgZmllbGRzLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBpZiAoZmllbGQtPmhhc19leHRlbmRlZSgpKSB7CisgICAgICAgIEFkZEVycm9yKCJNYXAgZmllbGRzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBleHRlbnNpb25zLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICBmaWVsZC0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVBFQVRFRCk7CisgICAgICBETyhDb25zdW1lKCI8IikpOworICAgICAgRE8oUGFyc2VUeXBlKCZtYXBfZmllbGQua2V5X3R5cGUsICZtYXBfZmllbGQua2V5X3R5cGVfbmFtZSkpOworICAgICAgRE8oQ29uc3VtZSgiLCIpKTsKKyAgICAgIERPKFBhcnNlVHlwZSgmbWFwX2ZpZWxkLnZhbHVlX3R5cGUsICZtYXBfZmllbGQudmFsdWVfdHlwZV9uYW1lKSk7CisgICAgICBETyhDb25zdW1lKCI+IikpOworICAgICAgLy8gRGVmZXIgc2V0dGluZyBvZiB0aGUgdHlwZSBuYW1lIG9mIHRoZSBtYXAgZmllbGQgdW50aWwgdGhlCisgICAgICAvLyBmaWVsZCBuYW1lIGlzIHBhcnNlZC4gQWRkIHRoZSBzb3VyY2UgbG9jYXRpb24gdGhvdWdoLgogICAgICAgbG9jYXRpb24uQWRkUGF0aChGaWVsZERlc2NyaXB0b3JQcm90bzo6a1R5cGVOYW1lRmllbGROdW1iZXIpOwotICAgICAgZmllbGQtPnNldF90eXBlX25hbWUodHlwZV9uYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIG5vIGV4cGxpY2l0IGxhYmVsIGlzIGdpdmVuIGZvciBhIG5vbi1tYXAgZmllbGQuCisgICAgICBpZiAoIWZpZWxkLT5oYXNfbGFiZWwoKSAmJiBEZWZhdWx0VG9PcHRpb25hbEZpZWxkcygpKSB7CisgICAgICAgIGZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgICAgIH0KKyAgICAgIGlmICghZmllbGQtPmhhc19sYWJlbCgpKSB7CisgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBcInJlcXVpcmVkXCIsIFwib3B0aW9uYWxcIiwgb3IgXCJyZXBlYXRlZFwiLiIpOworICAgICAgICAvLyBXZSBjYW4gYWN0dWFsbHkgcmVhc29uYWJseSByZWNvdmVyIGhlcmUgYnkganVzdCBhc3N1bWluZyB0aGUgdXNlcgorICAgICAgICAvLyBmb3Jnb3QgdGhlIGxhYmVsIGFsdG9nZXRoZXIuCisgICAgICAgIGZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgICAgIH0KKworICAgICAgLy8gSGFuZGxlIHRoZSBjYXNlIHdoZXJlIHRoZSBhY3R1YWwgdHlwZSBpcyBhIG1lc3NhZ2Ugb3IgZW51bSBuYW1lZCAibWFwIiwKKyAgICAgIC8vIHdoaWNoIHdlIGFscmVhZHkgY29uc3VtZWQgaW4gdGhlIGNvZGUgYWJvdmUuCisgICAgICBpZiAoIXR5cGVfcGFyc2VkKSB7CisgICAgICAgIERPKFBhcnNlVHlwZSgmdHlwZSwgJnR5cGVfbmFtZSkpOworICAgICAgfQorICAgICAgaWYgKHR5cGVfbmFtZS5lbXB0eSgpKSB7CisgICAgICAgIGxvY2F0aW9uLkFkZFBhdGgoRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlRmllbGROdW1iZXIpOworICAgICAgICBmaWVsZC0+c2V0X3R5cGUodHlwZSk7CisgICAgICB9IGVsc2UgeworICAgICAgICBsb2NhdGlvbi5BZGRQYXRoKEZpZWxkRGVzY3JpcHRvclByb3RvOjprVHlwZU5hbWVGaWVsZE51bWJlcik7CisgICAgICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKHR5cGVfbmFtZSk7CisgICAgICB9CiAgICAgfQogICB9CiAKQEAgLTU5OCwxNCArOTA4LDE0IEBACiAgIH0KIAogICAvLyBQYXJzZSBvcHRpb25zLgotICBETyhQYXJzZUZpZWxkT3B0aW9ucyhmaWVsZCwgZmllbGRfbG9jYXRpb24pKTsKKyAgRE8oUGFyc2VGaWVsZE9wdGlvbnMoZmllbGQsIGZpZWxkX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKIAogICAvLyBEZWFsIHdpdGggZ3JvdXBzLgogICBpZiAoZmllbGQtPmhhc190eXBlKCkgJiYgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9HUk9VUCkgewogICAgIC8vIEF3a3dhcmQ6ICBTaW5jZSBhIGdyb3VwIGRlY2xhcmVzIGJvdGggYSBtZXNzYWdlIHR5cGUgYW5kIGEgZmllbGQsIHdlCiAgICAgLy8gICBoYXZlIHRvIGNyZWF0ZSBvdmVybGFwcGluZyBsb2NhdGlvbnMuCiAgICAgTG9jYXRpb25SZWNvcmRlciBncm91cF9sb2NhdGlvbihwYXJlbnRfbG9jYXRpb24pOwotICAgIGdyb3VwX2xvY2F0aW9uLlN0YXJ0QXQobGFiZWxfdG9rZW4pOworICAgIGdyb3VwX2xvY2F0aW9uLlN0YXJ0QXQoZmllbGRfbG9jYXRpb24pOwogICAgIGdyb3VwX2xvY2F0aW9uLkFkZFBhdGgobG9jYXRpb25fZmllbGRfbnVtYmVyX2Zvcl9uZXN0ZWRfdHlwZSk7CiAgICAgZ3JvdXBfbG9jYXRpb24uQWRkUGF0aChtZXNzYWdlcy0+c2l6ZSgpKTsKIApAQCAtNjQxLDIwICs5NTEsOTAgQEAKIAogICAgIGZpZWxkLT5zZXRfdHlwZV9uYW1lKGdyb3VwLT5uYW1lKCkpOwogICAgIGlmIChMb29raW5nQXQoInsiKSkgewotICAgICAgRE8oUGFyc2VNZXNzYWdlQmxvY2soZ3JvdXAsIGdyb3VwX2xvY2F0aW9uKSk7CisgICAgICBETyhQYXJzZU1lc3NhZ2VCbG9jayhncm91cCwgZ3JvdXBfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpOwogICAgIH0gZWxzZSB7CiAgICAgICBBZGRFcnJvcigiTWlzc2luZyBncm91cCBib2R5LiIpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KICAgfSBlbHNlIHsKLSAgICBETyhDb25zdW1lKCI7IikpOworICAgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmZpZWxkX2xvY2F0aW9uKSk7CisgIH0KKworICAvLyBDcmVhdGUgYSBtYXAgZW50cnkgdHlwZSBpZiB0aGlzIGlzIGEgbWFwIGZpZWxkLgorICBpZiAobWFwX2ZpZWxkLmlzX21hcF9maWVsZCkgeworICAgIEdlbmVyYXRlTWFwRW50cnkobWFwX2ZpZWxkLCBmaWVsZCwgbWVzc2FnZXMpOwogICB9CiAKICAgcmV0dXJuIHRydWU7CiB9CiAKK3ZvaWQgUGFyc2VyOjpHZW5lcmF0ZU1hcEVudHJ5KGNvbnN0IE1hcEZpZWxkJiBtYXBfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzKSB7CisgIERlc2NyaXB0b3JQcm90byogZW50cnkgPSBtZXNzYWdlcy0+QWRkKCk7CisgIHN0cmluZyBlbnRyeV9uYW1lID0gTWFwRW50cnlOYW1lKGZpZWxkLT5uYW1lKCkpOworICBmaWVsZC0+c2V0X3R5cGVfbmFtZShlbnRyeV9uYW1lKTsKKyAgZW50cnktPnNldF9uYW1lKGVudHJ5X25hbWUpOworICBlbnRyeS0+bXV0YWJsZV9vcHRpb25zKCktPnNldF9tYXBfZW50cnkodHJ1ZSk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXlfZmllbGQgPSBlbnRyeS0+YWRkX2ZpZWxkKCk7CisgIGtleV9maWVsZC0+c2V0X25hbWUoImtleSIpOworICBrZXlfZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwpOworICBrZXlfZmllbGQtPnNldF9udW1iZXIoMSk7CisgIGlmIChtYXBfZmllbGQua2V5X3R5cGVfbmFtZS5lbXB0eSgpKSB7CisgICAga2V5X2ZpZWxkLT5zZXRfdHlwZShtYXBfZmllbGQua2V5X3R5cGUpOworICB9IGVsc2UgeworICAgIGtleV9maWVsZC0+c2V0X3R5cGVfbmFtZShtYXBfZmllbGQua2V5X3R5cGVfbmFtZSk7CisgIH0KKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHZhbHVlX2ZpZWxkID0gZW50cnktPmFkZF9maWVsZCgpOworICB2YWx1ZV9maWVsZC0+c2V0X25hbWUoInZhbHVlIik7CisgIHZhbHVlX2ZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgdmFsdWVfZmllbGQtPnNldF9udW1iZXIoMik7CisgIGlmIChtYXBfZmllbGQudmFsdWVfdHlwZV9uYW1lLmVtcHR5KCkpIHsKKyAgICB2YWx1ZV9maWVsZC0+c2V0X3R5cGUobWFwX2ZpZWxkLnZhbHVlX3R5cGUpOworICB9IGVsc2UgeworICAgIHZhbHVlX2ZpZWxkLT5zZXRfdHlwZV9uYW1lKG1hcF9maWVsZC52YWx1ZV90eXBlX25hbWUpOworICB9CisgIC8vIFByb3BhZ2F0ZSB0aGUgImVuZm9yY2VfdXRmOCIgb3B0aW9uIHRvIGtleSBhbmQgdmFsdWUgZmllbGRzIGlmIHRoZXkKKyAgLy8gYXJlIHN0cmluZ3MuIFRoaXMgaGVscHMgc2ltcGxpZnkgdGhlIGltcGxlbWVudGF0aW9uIG9mIGNvZGUgZ2VuZXJhdG9ycworICAvLyBhbmQgYWxzbyByZWZsZWN0aW9uLWJhc2VkIHBhcnNpbmcgY29kZS4KKyAgLy8KKyAgLy8gVGhlIGZvbGxvd2luZyBkZWZpbml0aW9uOgorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFsdWUgPSAxIFtlbmZvcmNlX3V0ZjggPSBmYWxzZV07CisgIC8vICAgfQorICAvLyB3aWxsIGJlIGludGVycHJldGVkIGFzOgorICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG1lc3NhZ2UgVmFsdWVFbnRyeSB7CisgIC8vICAgICAgIG9wdGlvbiBtYXBfZW50cnkgPSB0cnVlOworICAvLyAgICAgICBzdHJpbmcga2V5ID0gMSBbZW5mb3JjZV91dGY4ID0gZmFsc2VdOworICAvLyAgICAgICBzdHJpbmcgdmFsdWUgPSAyIFtlbmZvcmNlX3V0ZjggPSBmYWxzZV07CisgIC8vICAgICB9CisgIC8vICAgICByZXBlYXRlZCBWYWx1ZUVudHJ5IHZhbHVlID0gMSBbZW5mb3JjZV91dGY4ID0gZmFsc2VdOworICAvLyAgfQorICAvLworICAvLyBUT0RPKHhpYW9mZW5nKTogUmVtb3ZlIHRoaXMgd2hlbiB0aGUgImVuZm9yY2VfdXRmOCIgb3B0aW9uIGlzIHJlbW92ZWQKKyAgLy8gZnJvbSBwcm90b2NvbCBjb21waWxlci4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZC0+b3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgKytpKSB7CisgICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uID0KKyAgICAgICAgZmllbGQtPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbihpKTsKKyAgICBpZiAob3B0aW9uLm5hbWVfc2l6ZSgpID09IDEgJiYKKyAgICAgICAgb3B0aW9uLm5hbWUoMCkubmFtZV9wYXJ0KCkgPT0gImVuZm9yY2VfdXRmOCIgJiYKKyAgICAgICAgIW9wdGlvbi5uYW1lKDApLmlzX2V4dGVuc2lvbigpKSB7CisgICAgICBpZiAoa2V5X2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKSB7CisgICAgICAgIGtleV9maWVsZC0+bXV0YWJsZV9vcHRpb25zKCktPmFkZF91bmludGVycHJldGVkX29wdGlvbigpCisgICAgICAgICAgICAtPkNvcHlGcm9tKG9wdGlvbik7CisgICAgICB9CisgICAgICBpZiAodmFsdWVfZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgdmFsdWVfZmllbGQtPm11dGFibGVfb3B0aW9ucygpLT5hZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKQorICAgICAgICAgICAgLT5Db3B5RnJvbShvcHRpb24pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCiBib29sIFBhcnNlcjo6UGFyc2VGaWVsZE9wdGlvbnMoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CiAgIGlmICghTG9va2luZ0F0KCJbIikpIHJldHVybiB0cnVlOwogCiAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCkBAIC02NjcsOSArMTA0NywxMyBAQAogICAgIGlmIChMb29raW5nQXQoImRlZmF1bHQiKSkgewogICAgICAgLy8gV2UgaW50ZW50aW9uYWxseSBwYXNzIGZpZWxkX2xvY2F0aW9uIHJhdGhlciB0aGFuIGxvY2F0aW9uIGhlcmUsIHNpbmNlCiAgICAgICAvLyB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBub3QgYWN0dWFsbHkgYW4gb3B0aW9uLgotICAgICAgRE8oUGFyc2VEZWZhdWx0QXNzaWdubWVudChmaWVsZCwgZmllbGRfbG9jYXRpb24pKTsKKyAgICAgIERPKFBhcnNlRGVmYXVsdEFzc2lnbm1lbnQoZmllbGQsIGZpZWxkX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKKyAgICB9IGVsc2UgaWYgKExvb2tpbmdBdCgianNvbl9uYW1lIikpIHsKKyAgICAgIC8vIExpa2UgZGVmYXVsdCB2YWx1ZSwgdGhpcyAianNvbl9uYW1lIiBpcyBub3QgYW4gYWN0dWFsIG9wdGlvbi4KKyAgICAgIERPKFBhcnNlSnNvbk5hbWUoZmllbGQsIGZpZWxkX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKTsKICAgICB9IGVsc2UgewotICAgICAgRE8oUGFyc2VPcHRpb25Bc3NpZ25tZW50KGZpZWxkLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24pKTsKKyAgICAgIERPKFBhcnNlT3B0aW9uKGZpZWxkLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUsIE9QVElPTl9BU1NJR05NRU5UKSk7CiAgICAgfQogICB9IHdoaWxlIChUcnlDb25zdW1lKCIsIikpOwogCkBAIC02NzcsOCArMTA2MSwxMCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBQYXJzZXI6OlBhcnNlRGVmYXVsdEFzc2lnbm1lbnQoRmllbGREZXNjcmlwdG9yUHJvdG8qIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24pIHsKK2Jvb2wgUGFyc2VyOjpQYXJzZURlZmF1bHRBc3NpZ25tZW50KAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CiAgICAgQWRkRXJyb3IoIkFscmVhZHkgc2V0IG9wdGlvbiBcImRlZmF1bHRcIi4iKTsKICAgICBmaWVsZC0+Y2xlYXJfZGVmYXVsdF92YWx1ZSgpOwpAQCAtNjk1LDggKzEwODEsMTYgQEAKIAogICBpZiAoIWZpZWxkLT5oYXNfdHlwZSgpKSB7CiAgICAgLy8gVGhlIGZpZWxkIGhhcyBhIHR5cGUgbmFtZSwgYnV0IHdlIGRvbid0IGtub3cgaWYgaXQgaXMgYSBtZXNzYWdlIG9yIGFuCi0gICAgLy8gZW51bSB5ZXQuICBBc3N1bWUgYW4gZW51bSBmb3Igbm93LgotICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICAvLyBlbnVtIHlldC4gKElmIGl0IHdlcmUgYSBwcmltaXRpdmUgdHlwZSwgfGZpZWxkfCB3b3VsZCBoYXZlIGEgdHlwZSBzZXQKKyAgICAvLyBhbHJlYWR5LikgSW4gdGhpcyBjYXNlLCBzaW1wbHkgdGFrZSB0aGUgY3VycmVudCBzdHJpbmcgYXMgdGhlIGRlZmF1bHQKKyAgICAvLyB2YWx1ZTsgd2Ugd2lsbCBjYXRjaCB0aGUgZXJyb3IgbGF0ZXIgaWYgaXQgaXMgbm90IGEgdmFsaWQgZW51bSB2YWx1ZS4KKyAgICAvLyAoTi5CLiB0aGF0IHdlIGRvIG5vdCBjaGVjayB3aGV0aGVyIHRoZSBjdXJyZW50IHRva2VuIGlzIGFuIGlkZW50aWZpZXI6CisgICAgLy8gZG9pbmcgc28gdGhyb3dzIHN0cmFuZ2UgZXJyb3JzIHdoZW4gdGhlIHVzZXIgbWlzdHlwZXMgYSBwcmltaXRpdmUKKyAgICAvLyB0eXBlbmFtZSBhbmQgd2UgYXNzdW1lIGl0J3MgYW4gZW51bS4gRS5nLjogIm9wdGlvbmFsIGludCBmb28gPSAxIFtkZWZhdWx0CisgICAgLy8gPSA0Ml0iLiBJbiBzdWNoIGEgY2FzZSB0aGUgZnVuZGFtZW50YWwgZXJyb3IgaXMgcmVhbGx5IHRoYXQgImludCIgaXMgbm90CisgICAgLy8gYSB0eXBlLCBub3QgdGhhdCAiNDIiIGlzIG5vdCBhbiBpZGVudGlmaWVyLiBTZWUgYi8xMjUzMzU4Mi4pCisgICAgKmRlZmF1bHRfdmFsdWUgPSBpbnB1dF8tPmN1cnJlbnQoKS50ZXh0OworICAgIGlucHV0Xy0+TmV4dCgpOwogICAgIHJldHVybiB0cnVlOwogICB9CiAKQEAgLTcyMiw3ICsxMTE2LDggQEAKICAgICAgIH0KICAgICAgIC8vIFBhcnNlIHRoZSBpbnRlZ2VyIHRvIHZlcmlmeSB0aGF0IGl0IGlzIG5vdCBvdXQtb2YtcmFuZ2UuCiAgICAgICB1aW50NjQgdmFsdWU7Ci0gICAgICBETyhDb25zdW1lSW50ZWdlcjY0KG1heF92YWx1ZSwgJnZhbHVlLCAiRXhwZWN0ZWQgaW50ZWdlci4iKSk7CisgICAgICBETyhDb25zdW1lSW50ZWdlcjY0KG1heF92YWx1ZSwgJnZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiRXhwZWN0ZWQgaW50ZWdlciBmb3IgZmllbGQgZGVmYXVsdCB2YWx1ZS4iKSk7CiAgICAgICAvLyBBbmQgc3RyaW5naWZ5IGl0IGFnYWluLgogICAgICAgZGVmYXVsdF92YWx1ZS0+YXBwZW5kKFNpbXBsZUl0b2EodmFsdWUpKTsKICAgICAgIGJyZWFrOwpAQCAtNzQ0LDcgKzExMzksOCBAQAogICAgICAgfQogICAgICAgLy8gUGFyc2UgdGhlIGludGVnZXIgdG8gdmVyaWZ5IHRoYXQgaXQgaXMgbm90IG91dC1vZi1yYW5nZS4KICAgICAgIHVpbnQ2NCB2YWx1ZTsKLSAgICAgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICAgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBpbnRlZ2VyIGZvciBmaWVsZCBkZWZhdWx0IHZhbHVlLiIpKTsKICAgICAgIC8vIEFuZCBzdHJpbmdpZnkgaXQgYWdhaW4uCiAgICAgICBkZWZhdWx0X3ZhbHVlLT5hcHBlbmQoU2ltcGxlSXRvYSh2YWx1ZSkpOwogICAgICAgYnJlYWs7CkBAIC03NzYsNyArMTE3MiwxMSBAQAogICAgICAgYnJlYWs7CiAKICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORzoKLSAgICAgIERPKENvbnN1bWVTdHJpbmcoZGVmYXVsdF92YWx1ZSwgIkV4cGVjdGVkIHN0cmluZy4iKSk7CisgICAgICAvLyBOb3RlOiBXaGVuIGZpbGUgb3B0b24gamF2YV9zdHJpbmdfY2hlY2tfdXRmOCBpcyB0cnVlLCBpZiBhCisgICAgICAvLyBub24tc3RyaW5nIHJlcHJlc2VudGF0aW9uIChlZyBieXRlW10pIGlzIGxhdGVyIHN1cHBvcnRlZCwgaXQgbXVzdAorICAgICAgLy8gYmUgY2hlY2tlZCBmb3IgVVRGLTgtbmVzcy4KKyAgICAgIERPKENvbnN1bWVTdHJpbmcoZGVmYXVsdF92YWx1ZSwgIkV4cGVjdGVkIHN0cmluZyBmb3IgZmllbGQgZGVmYXVsdCAiCisgICAgICAgICAgICAgICAgICAgICAgICJ2YWx1ZS4iKSk7CiAgICAgICBicmVhazsKIAogICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfQllURVM6CkBAIC03ODUsNyArMTE4NSw4IEBACiAgICAgICBicmVhazsKIAogICAgIGNhc2UgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRU5VTToKLSAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBpZGVudGlmaWVyLiIpKTsKKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGRlZmF1bHRfdmFsdWUsICJFeHBlY3RlZCBlbnVtIGlkZW50aWZpZXIgZm9yIGZpZWxkICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJkZWZhdWx0IHZhbHVlLiIpKTsKICAgICAgIGJyZWFrOwogCiAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFOgpAQCAtNzk3LDggKzExOTgsMzEgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgUGFyc2VyOjpQYXJzZUpzb25OYW1lKAorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKKyAgaWYgKGZpZWxkLT5oYXNfanNvbl9uYW1lKCkpIHsKKyAgICBBZGRFcnJvcigiQWxyZWFkeSBzZXQgb3B0aW9uIFwianNvbl9uYW1lXCIuIik7CisgICAgZmllbGQtPmNsZWFyX2pzb25fbmFtZSgpOworICB9CisKKyAgRE8oQ29uc3VtZSgianNvbl9uYW1lIikpOworICBETyhDb25zdW1lKCI9IikpOworCisgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OmtKc29uTmFtZUZpZWxkTnVtYmVyKTsKKyAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICBmaWVsZCwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fVkFMVUUpOworICBETyhDb25zdW1lU3RyaW5nKGZpZWxkLT5tdXRhYmxlX2pzb25fbmFtZSgpLAorICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBzdHJpbmcgZm9yIEpTT04gbmFtZS4iKSk7CisgIHJldHVybiB0cnVlOworfQorCisKIGJvb2wgUGFyc2VyOjpQYXJzZU9wdGlvbk5hbWVQYXJ0KFVuaW50ZXJwcmV0ZWRPcHRpb24qIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFydF9sb2NhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcGFydF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewogICBVbmludGVycHJldGVkT3B0aW9uOjpOYW1lUGFydCogbmFtZSA9IHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5hZGRfbmFtZSgpOwogICBzdHJpbmcgaWRlbnRpZmllcjsgIC8vIFdlIHBhcnNlIGlkZW50aWZpZXJzIGludG8gdGhpcyBzdHJpbmcuCiAgIGlmIChMb29raW5nQXQoIigiKSkgeyAgLy8gVGhpcyBpcyBhbiBleHRlbnNpb24uCkBAIC04MzUsNiArMTI1OSw4IEBACiAKIGJvb2wgUGFyc2VyOjpQYXJzZVVuaW50ZXJwcmV0ZWRCbG9jayhzdHJpbmcqIHZhbHVlKSB7CiAgIC8vIE5vdGUgdGhhdCBlbmNsb3NpbmcgYnJhY2VzIGFyZSBub3QgYWRkZWQgdG8gKnZhbHVlLgorICAvLyBXZSBkbyBOT1QgdXNlIENvbnN1bWVFbmRPZlN0YXRlbWVudCBmb3IgdGhpcyBicmFjZSBiZWNhdXNlIGl0J3MgZGVsaW1pdGluZworICAvLyBhbiBleHByZXNzaW9uLCBub3QgYSBibG9jayBvZiBzdGF0ZW1lbnRzLgogICBETyhDb25zdW1lKCJ7IikpOwogICBpbnQgYnJhY2VfZGVwdGggPSAxOwogICB3aGlsZSAoIUF0RW5kKCkpIHsKQEAgLTg1OCw4ICsxMjg0LDEwIEBACiAKIC8vIFdlIGRvbid0IGludGVycHJldCB0aGUgb3B0aW9uIGhlcmUuIEluc3RlYWQgd2Ugc3RvcmUgaXQgaW4gYW4KIC8vIFVuaW50ZXJwcmV0ZWRPcHRpb24sIHRvIGJlIGludGVycHJldGVkIGxhdGVyLgotYm9vbCBQYXJzZXI6OlBhcnNlT3B0aW9uQXNzaWdubWVudChNZXNzYWdlKiBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvcHRpb25zX2xvY2F0aW9uKSB7Citib29sIFBhcnNlcjo6UGFyc2VPcHRpb24oTWVzc2FnZSogb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvcHRpb25zX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPcHRpb25TdHlsZSBzdHlsZSkgewogICAvLyBDcmVhdGUgYW4gZW50cnkgaW4gdGhlIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIGZpZWxkLgogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkID0gb3B0aW9ucy0+R2V0RGVzY3JpcHRvcigpLT4KICAgICAgIEZpbmRGaWVsZEJ5TmFtZSgidW5pbnRlcnByZXRlZF9vcHRpb24iKTsKQEAgLTg3Miw2ICsxMzAwLDEwIEBACiAgICAgICBvcHRpb25zX2xvY2F0aW9uLCB1bmludGVycHJldGVkX29wdGlvbl9maWVsZC0+bnVtYmVyKCksCiAgICAgICByZWZsZWN0aW9uLT5GaWVsZFNpemUoKm9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uX2ZpZWxkKSk7CiAKKyAgaWYgKHN0eWxlID09IE9QVElPTl9TVEFURU1FTlQpIHsKKyAgICBETyhDb25zdW1lKCJvcHRpb24iKSk7CisgIH0KKwogICBVbmludGVycHJldGVkT3B0aW9uKiB1bmludGVycHJldGVkX29wdGlvbiA9IGRvd25fY2FzdDxVbmludGVycHJldGVkT3B0aW9uKj4oCiAgICAgICBvcHRpb25zLT5HZXRSZWZsZWN0aW9uKCktPkFkZE1lc3NhZ2Uob3B0aW9ucywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbl9maWVsZCkpOwpAQCAtODg2LDEwMiArMTMxOCwxMTQgQEAKICAgICB7CiAgICAgICBMb2NhdGlvblJlY29yZGVyIHBhcnRfbG9jYXRpb24obmFtZV9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bmFtZV9zaXplKCkpOwotICAgICAgRE8oUGFyc2VPcHRpb25OYW1lUGFydCh1bmludGVycHJldGVkX29wdGlvbiwgcGFydF9sb2NhdGlvbikpOworICAgICAgRE8oUGFyc2VPcHRpb25OYW1lUGFydCh1bmludGVycHJldGVkX29wdGlvbiwgcGFydF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKSk7CiAgICAgfQogCiAgICAgd2hpbGUgKExvb2tpbmdBdCgiLiIpKSB7CiAgICAgICBETyhDb25zdW1lKCIuIikpOwogICAgICAgTG9jYXRpb25SZWNvcmRlciBwYXJ0X2xvY2F0aW9uKG5hbWVfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPm5hbWVfc2l6ZSgpKTsKLSAgICAgIERPKFBhcnNlT3B0aW9uTmFtZVBhcnQodW5pbnRlcnByZXRlZF9vcHRpb24sIHBhcnRfbG9jYXRpb24pKTsKKyAgICAgIERPKFBhcnNlT3B0aW9uTmFtZVBhcnQodW5pbnRlcnByZXRlZF9vcHRpb24sIHBhcnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSkpOwogICAgIH0KICAgfQogCiAgIERPKENvbnN1bWUoIj0iKSk7CiAKLSAgTG9jYXRpb25SZWNvcmRlciB2YWx1ZV9sb2NhdGlvbihsb2NhdGlvbik7Ci0gIHZhbHVlX2xvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAotICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1BUSU9OX1ZBTFVFKTsKKyAgeworICAgIExvY2F0aW9uUmVjb3JkZXIgdmFsdWVfbG9jYXRpb24obG9jYXRpb24pOworICAgIHZhbHVlX2xvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAorICAgICAgICB1bmludGVycHJldGVkX29wdGlvbiwgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPUFRJT05fVkFMVUUpOwogCi0gIC8vIEFsbCB2YWx1ZXMgYXJlIGEgc2luZ2xlIHRva2VuLCBleGNlcHQgZm9yIG5lZ2F0aXZlIG51bWJlcnMsIHdoaWNoIGNvbnNpc3QKLSAgLy8gb2YgYSBzaW5nbGUgJy0nIHN5bWJvbCwgZm9sbG93ZWQgYnkgYSBwb3NpdGl2ZSBudW1iZXIuCi0gIGJvb2wgaXNfbmVnYXRpdmUgPSBUcnlDb25zdW1lKCItIik7CisgICAgLy8gQWxsIHZhbHVlcyBhcmUgYSBzaW5nbGUgdG9rZW4sIGV4Y2VwdCBmb3IgbmVnYXRpdmUgbnVtYmVycywgd2hpY2ggY29uc2lzdAorICAgIC8vIG9mIGEgc2luZ2xlICctJyBzeW1ib2wsIGZvbGxvd2VkIGJ5IGEgcG9zaXRpdmUgbnVtYmVyLgorICAgIGJvb2wgaXNfbmVnYXRpdmUgPSBUcnlDb25zdW1lKCItIik7CiAKLSAgc3dpdGNoIChpbnB1dF8tPmN1cnJlbnQoKS50eXBlKSB7Ci0gICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NUQVJUOgotICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byByZWFkIHZhbHVlIGJlZm9yZSBhbnkgdG9rZW5zIGhhdmUgYmVlbiByZWFkLiI7Ci0gICAgICByZXR1cm4gZmFsc2U7Ci0KLSAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EOgotICAgICAgQWRkRXJyb3IoIlVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSBwYXJzaW5nIG9wdGlvbiB2YWx1ZS4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKLQotICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSOiB7Ci0gICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKFVuaW50ZXJwcmV0ZWRPcHRpb246OmtJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlcik7Ci0gICAgICBpZiAoaXNfbmVnYXRpdmUpIHsKLSAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgJy0nIHN5bWJvbCBiZWZvcmUgaWRlbnRpZmllci4iKTsKKyAgICBzd2l0Y2ggKGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpIHsKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9TVEFSVDoKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRyeWluZyB0byByZWFkIHZhbHVlIGJlZm9yZSBhbnkgdG9rZW5zIGhhdmUgYmVlbiByZWFkLiI7CiAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgIH0KLSAgICAgIHN0cmluZyB2YWx1ZTsKLSAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZ2YWx1ZSwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOwotICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9pZGVudGlmaWVyX3ZhbHVlKHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KIAotICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSOiB7Ci0gICAgICB1aW50NjQgdmFsdWU7Ci0gICAgICB1aW50NjQgbWF4X3ZhbHVlID0KLSAgICAgICAgICBpc19uZWdhdGl2ZSA/IHN0YXRpY19jYXN0PHVpbnQ2ND4oa2ludDY0bWF4KSArIDEgOiBrdWludDY0bWF4OwotICAgICAgRE8oQ29uc3VtZUludGVnZXI2NChtYXhfdmFsdWUsICZ2YWx1ZSwgIkV4cGVjdGVkIGludGVnZXIuIikpOwotICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7CisgICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5EOgorICAgICAgICBBZGRFcnJvcigiVW5leHBlY3RlZCBlbmQgb2Ygc3RyZWFtIHdoaWxlIHBhcnNpbmcgb3B0aW9uIHZhbHVlLiIpOworICAgICAgICByZXR1cm4gZmFsc2U7CisKKyAgICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSOiB7CiAgICAgICAgIHZhbHVlX2xvY2F0aW9uLkFkZFBhdGgoCi0gICAgICAgICAgICBVbmludGVycHJldGVkT3B0aW9uOjprTmVnYXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyKTsKLSAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoLXN0YXRpY19jYXN0PGludDY0Pih2YWx1ZSkpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKLSAgICAgICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmtQb3NpdGl2ZUludFZhbHVlRmllbGROdW1iZXIpOwotICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X3Bvc2l0aXZlX2ludF92YWx1ZSh2YWx1ZSk7CisgICAgICAgICAgICBVbmludGVycHJldGVkT3B0aW9uOjprSWRlbnRpZmllclZhbHVlRmllbGROdW1iZXIpOworICAgICAgICBpZiAoaXNfbmVnYXRpdmUpIHsKKyAgICAgICAgICBBZGRFcnJvcigiSW52YWxpZCAnLScgc3ltYm9sIGJlZm9yZSBpZGVudGlmaWVyLiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZ2YWx1ZSwgIkV4cGVjdGVkIGlkZW50aWZpZXIuIikpOworICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2lkZW50aWZpZXJfdmFsdWUodmFsdWUpOworICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIGJyZWFrOwotICAgIH0KIAotICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVDogewotICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aChVbmludGVycHJldGVkT3B0aW9uOjprRG91YmxlVmFsdWVGaWVsZE51bWJlcik7Ci0gICAgICBkb3VibGUgdmFsdWU7Ci0gICAgICBETyhDb25zdW1lTnVtYmVyKCZ2YWx1ZSwgIkV4cGVjdGVkIG51bWJlci4iKSk7Ci0gICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2RvdWJsZV92YWx1ZShpc19uZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLQotICAgIGNhc2UgaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkc6IHsKLSAgICAgIHZhbHVlX2xvY2F0aW9uLkFkZFBhdGgoVW5pbnRlcnByZXRlZE9wdGlvbjo6a1N0cmluZ1ZhbHVlRmllbGROdW1iZXIpOwotICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7Ci0gICAgICAgIEFkZEVycm9yKCJJbnZhbGlkICctJyBzeW1ib2wgYmVmb3JlIHN0cmluZy4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX0lOVEVHRVI6IHsKKyAgICAgICAgdWludDY0IHZhbHVlOworICAgICAgICB1aW50NjQgbWF4X3ZhbHVlID0KKyAgICAgICAgICAgIGlzX25lZ2F0aXZlID8gc3RhdGljX2Nhc3Q8dWludDY0PihraW50NjRtYXgpICsgMSA6IGt1aW50NjRtYXg7CisgICAgICAgIERPKENvbnN1bWVJbnRlZ2VyNjQobWF4X3ZhbHVlLCAmdmFsdWUsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7CisgICAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKKyAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a05lZ2F0aXZlSW50VmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoCisgICAgICAgICAgICAgIC1zdGF0aWNfY2FzdDxpbnQ2ND4odmFsdWUpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKAorICAgICAgICAgICAgICBVbmludGVycHJldGVkT3B0aW9uOjprUG9zaXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X3Bvc2l0aXZlX2ludF92YWx1ZSh2YWx1ZSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBzdHJpbmcgdmFsdWU7Ci0gICAgICBETyhDb25zdW1lU3RyaW5nKCZ2YWx1ZSwgIkV4cGVjdGVkIHN0cmluZy4iKSk7Ci0gICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X3N0cmluZ192YWx1ZSh2YWx1ZSk7Ci0gICAgICBicmVhazsKLSAgICB9CiAKLSAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfU1lNQk9MOgotICAgICAgaWYgKExvb2tpbmdBdCgieyIpKSB7Ci0gICAgICAgIHZhbHVlX2xvY2F0aW9uLkFkZFBhdGgoVW5pbnRlcnByZXRlZE9wdGlvbjo6a0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXIpOwotICAgICAgICBETyhQYXJzZVVuaW50ZXJwcmV0ZWRCbG9jaygKLSAgICAgICAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uLT5tdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpKSk7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBBZGRFcnJvcigiRXhwZWN0ZWQgb3B0aW9uIHZhbHVlLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICBjYXNlIGlvOjpUb2tlbml6ZXI6OlRZUEVfRkxPQVQ6IHsKKyAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aChVbmludGVycHJldGVkT3B0aW9uOjprRG91YmxlVmFsdWVGaWVsZE51bWJlcik7CisgICAgICAgIGRvdWJsZSB2YWx1ZTsKKyAgICAgICAgRE8oQ29uc3VtZU51bWJlcigmdmFsdWUsICJFeHBlY3RlZCBudW1iZXIuIikpOworICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+c2V0X2RvdWJsZV92YWx1ZShpc19uZWdhdGl2ZSA/IC12YWx1ZSA6IHZhbHVlKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICBicmVhazsKKworICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORzogeworICAgICAgICB2YWx1ZV9sb2NhdGlvbi5BZGRQYXRoKFVuaW50ZXJwcmV0ZWRPcHRpb246OmtTdHJpbmdWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgICAgICAgaWYgKGlzX25lZ2F0aXZlKSB7CisgICAgICAgICAgQWRkRXJyb3IoIkludmFsaWQgJy0nIHN5bWJvbCBiZWZvcmUgc3RyaW5nLiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBzdHJpbmcgdmFsdWU7CisgICAgICAgIERPKENvbnN1bWVTdHJpbmcoJnZhbHVlLCAiRXhwZWN0ZWQgc3RyaW5nLiIpKTsKKyAgICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24tPnNldF9zdHJpbmdfdmFsdWUodmFsdWUpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBpbzo6VG9rZW5pemVyOjpUWVBFX1NZTUJPTDoKKyAgICAgICAgaWYgKExvb2tpbmdBdCgieyIpKSB7CisgICAgICAgICAgdmFsdWVfbG9jYXRpb24uQWRkUGF0aCgKKyAgICAgICAgICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbjo6a0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXIpOworICAgICAgICAgIERPKFBhcnNlVW5pbnRlcnByZXRlZEJsb2NrKAorICAgICAgICAgICAgICB1bmludGVycHJldGVkX29wdGlvbi0+bXV0YWJsZV9hZ2dyZWdhdGVfdmFsdWUoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBvcHRpb24gdmFsdWUuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorCisgIGlmIChzdHlsZSA9PSBPUFRJT05fU1RBVEVNRU5UKSB7CisgICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbG9jYXRpb24pKTsKICAgfQogCiAgIHJldHVybiB0cnVlOwogfQogCiBib29sIFBhcnNlcjo6UGFyc2VFeHRlbnNpb25zKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5zaW9uc19sb2NhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBleHRlbnNpb25zX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKICAgLy8gUGFyc2UgdGhlIGRlY2xhcmF0aW9uLgogICBETyhDb25zdW1lKCJleHRlbnNpb25zIikpOwogCkBAIC0xMDA4LDcgKzE0NTIsMTAgQEAKICAgICAgIExvY2F0aW9uUmVjb3JkZXIgZW5kX2xvY2F0aW9uKAogICAgICAgICAgIGxvY2F0aW9uLCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlOjprRW5kRmllbGROdW1iZXIpOwogICAgICAgaWYgKFRyeUNvbnN1bWUoIm1heCIpKSB7Ci0gICAgICAgIGVuZCA9IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlcjsKKyAgICAgICAgLy8gU2V0IHRvIHRoZSBzZW50aW5lbCB2YWx1ZSAtIDEgc2luY2Ugd2UgaW5jcmVtZW50IHRoZSB2YWx1ZSBiZWxvdy4KKyAgICAgICAgLy8gVGhlIGFjdHVhbCB2YWx1ZSBvZiB0aGUgZW5kIG9mIHRoZSByYW5nZSBzaG91bGQgYmUgc2V0IHdpdGgKKyAgICAgICAgLy8gQWRqdXN0RXh0ZW5zaW9uUmFuZ2VzV2l0aE1heEVuZE51bWJlci4KKyAgICAgICAgZW5kID0ga01heEV4dGVuc2lvblJhbmdlU2VudGluZWwgLSAxOwogICAgICAgfSBlbHNlIHsKICAgICAgICAgRE8oQ29uc3VtZUludGVnZXIoJmVuZCwgIkV4cGVjdGVkIGludGVnZXIuIikpOwogICAgICAgfQpAQCAtMTAyOCw3ICsxNDc1LDc4IEBACiAgICAgcmFuZ2UtPnNldF9lbmQoZW5kKTsKICAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKIAotICBETyhDb25zdW1lKCI7IikpOworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZleHRlbnNpb25zX2xvY2F0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQorCisvLyBUaGlzIGlzIHNpbWlsYXIgdG8gZXh0ZW5zaW9uIHJhbmdlIHBhcnNpbmcsIGV4Y2VwdCB0aGF0ICJtYXgiIGlzIG5vdAorLy8gc3VwcG9ydGVkLCBhbmQgYWNjZXB0cyBmaWVsZCBuYW1lIGxpdGVyYWxzLgorYm9vbCBQYXJzZXI6OlBhcnNlUmVzZXJ2ZWQoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbikgeworICAvLyBQYXJzZSB0aGUgZGVjbGFyYXRpb24uCisgIERPKENvbnN1bWUoInJlc2VydmVkIikpOworICBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKG1lc3NhZ2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtSZXNlcnZlZE5hbWVGaWVsZE51bWJlcik7CisgICAgcmV0dXJuIFBhcnNlUmVzZXJ2ZWROYW1lcyhtZXNzYWdlLCBsb2NhdGlvbik7CisgIH0gZWxzZSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXNzYWdlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvOjprUmVzZXJ2ZWRSYW5nZUZpZWxkTnVtYmVyKTsKKyAgICByZXR1cm4gUGFyc2VSZXNlcnZlZE51bWJlcnMobWVzc2FnZSwgbG9jYXRpb24pOworICB9Cit9CisKKworYm9vbCBQYXJzZXI6OlBhcnNlUmVzZXJ2ZWROYW1lcyhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbikgeworICBkbyB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihwYXJlbnRfbG9jYXRpb24sIG1lc3NhZ2UtPnJlc2VydmVkX25hbWVfc2l6ZSgpKTsKKyAgICBETyhDb25zdW1lU3RyaW5nKG1lc3NhZ2UtPmFkZF9yZXNlcnZlZF9uYW1lKCksICJFeHBlY3RlZCBmaWVsZCBuYW1lLiIpKTsKKyAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKKyAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmcGFyZW50X2xvY2F0aW9uKSk7CisgIHJldHVybiB0cnVlOworfQorCitib29sIFBhcnNlcjo6UGFyc2VSZXNlcnZlZE51bWJlcnMoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbikgeworICBib29sIGZpcnN0ID0gdHJ1ZTsKKyAgZG8geworICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocGFyZW50X2xvY2F0aW9uLCBtZXNzYWdlLT5yZXNlcnZlZF9yYW5nZV9zaXplKCkpOworCisgICAgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlKiByYW5nZSA9IG1lc3NhZ2UtPmFkZF9yZXNlcnZlZF9yYW5nZSgpOworICAgIGludCBzdGFydCwgZW5kOworICAgIGlvOjpUb2tlbml6ZXI6OlRva2VuIHN0YXJ0X3Rva2VuOworICAgIHsKKyAgICAgIExvY2F0aW9uUmVjb3JkZXIgc3RhcnRfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZTo6a1N0YXJ0RmllbGROdW1iZXIpOworICAgICAgc3RhcnRfdG9rZW4gPSBpbnB1dF8tPmN1cnJlbnQoKTsKKyAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZzdGFydCwgKGZpcnN0ID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmaWVsZCBuYW1lIG9yIG51bWJlciByYW5nZS4iIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFeHBlY3RlZCBmaWVsZCBudW1iZXIgcmFuZ2UuIikpKTsKKyAgICB9CisKKyAgICBpZiAoVHJ5Q29uc3VtZSgidG8iKSkgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBlbmRfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKKyAgICAgIERPKENvbnN1bWVJbnRlZ2VyKCZlbmQsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKKyAgICB9IGVsc2UgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBlbmRfbG9jYXRpb24oCisgICAgICAgICAgbG9jYXRpb24sIERlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZTo6a0VuZEZpZWxkTnVtYmVyKTsKKyAgICAgIGVuZF9sb2NhdGlvbi5TdGFydEF0KHN0YXJ0X3Rva2VuKTsKKyAgICAgIGVuZF9sb2NhdGlvbi5FbmRBdChzdGFydF90b2tlbik7CisgICAgICBlbmQgPSBzdGFydDsKKyAgICB9CisKKyAgICAvLyBVc2VycyBsaWtlIHRvIHNwZWNpZnkgaW5jbHVzaXZlIHJhbmdlcywgYnV0IGluIGNvZGUgd2UgbGlrZSB0aGUgZW5kCisgICAgLy8gbnVtYmVyIHRvIGJlIGV4Y2x1c2l2ZS4KKyAgICArK2VuZDsKKworICAgIHJhbmdlLT5zZXRfc3RhcnQoc3RhcnQpOworICAgIHJhbmdlLT5zZXRfZW5kKGVuZCk7CisgICAgZmlyc3QgPSBmYWxzZTsKKyAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKKworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZwYXJlbnRfbG9jYXRpb24pKTsKICAgcmV0dXJuIHRydWU7CiB9CiAKQEAgLTEwMzYsNyArMTU1NCw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5kX2xvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5kX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewogICBETyhDb25zdW1lKCJleHRlbmQiKSk7CiAKICAgLy8gUGFyc2UgdGhlIGV4dGVuZGVlIHR5cGUuCkBAIC0xMDQ2LDcgKzE1NjUsNyBAQAogICBpbzo6VG9rZW5pemVyOjpUb2tlbiBleHRlbmRlZV9lbmQgPSBpbnB1dF8tPnByZXZpb3VzKCk7CiAKICAgLy8gUGFyc2UgdGhlIGJsb2NrLgotICBETyhDb25zdW1lKCJ7IikpOworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZleHRlbmRfbG9jYXRpb24pKTsKIAogICBib29sIGlzX2ZpcnN0ID0gdHJ1ZTsKIApAQCAtMTA3OCwxMiArMTU5Nyw3MCBAQAogCiAgICAgaWYgKCFQYXJzZU1lc3NhZ2VGaWVsZChmaWVsZCwgbWVzc2FnZXMsIHBhcmVudF9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NhdGlvbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKSkgewogICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQogICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KICAgICAgIFNraXBTdGF0ZW1lbnQoKTsKICAgICB9Ci0gIH0gd2hpbGUoIVRyeUNvbnN1bWUoIn0iKSk7CisgIH0gd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKTsKKworICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBQYXJzZXI6OlBhcnNlT25lb2YoT25lb2ZEZXNjcmlwdG9yUHJvdG8qIG9uZW9mX2RlY2wsCisgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBvbmVvZl9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9uZW9mX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgY29udGFpbmluZ190eXBlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIERPKENvbnN1bWUoIm9uZW9mIikpOworCisgIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIG5hbWVfbG9jYXRpb24ob25lb2ZfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZW9mRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyKTsKKyAgICBETyhDb25zdW1lSWRlbnRpZmllcihvbmVvZl9kZWNsLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIG9uZW9mIG5hbWUuIikpOworICB9CisKKyAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oInsiLCAmb25lb2ZfbG9jYXRpb24pKTsKKworICBkbyB7CisgICAgaWYgKEF0RW5kKCkpIHsKKyAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBvbmVvZiBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gUHJpbnQgYSBuaWNlIGVycm9yIGlmIHRoZSB1c2VyIGFjY2lkZW50YWxseSB0cmllcyB0byBwbGFjZSBhIGxhYmVsCisgICAgLy8gb24gYW4gaW5kaXZpZHVhbCBtZW1iZXIgb2YgYSBvbmVvZi4KKyAgICBpZiAoTG9va2luZ0F0KCJyZXF1aXJlZCIpIHx8CisgICAgICAgIExvb2tpbmdBdCgib3B0aW9uYWwiKSB8fAorICAgICAgICBMb29raW5nQXQoInJlcGVhdGVkIikpIHsKKyAgICAgIEFkZEVycm9yKCJGaWVsZHMgaW4gb25lb2ZzIG11c3Qgbm90IGhhdmUgbGFiZWxzIChyZXF1aXJlZCAvIG9wdGlvbmFsICIKKyAgICAgICAgICAgICAgICIvIHJlcGVhdGVkKS4iKTsKKyAgICAgIC8vIFdlIGNhbiBjb250aW51ZSBwYXJzaW5nIGhlcmUgYmVjYXVzZSB3ZSB1bmRlcnN0YW5kIHdoYXQgdGhlIHVzZXIKKyAgICAgIC8vIG1lYW50LiAgVGhlIGVycm9yIHJlcG9ydCB3aWxsIHN0aWxsIG1ha2UgcGFyc2luZyBmYWlsIG92ZXJhbGwuCisgICAgICBpbnB1dF8tPk5leHQoKTsKKyAgICB9CisKKyAgICBMb2NhdGlvblJlY29yZGVyIGZpZWxkX2xvY2F0aW9uKGNvbnRhaW5pbmdfdHlwZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQcm90bzo6a0ZpZWxkRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX3R5cGUtPmZpZWxkX3NpemUoKSk7CisKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQgPSBjb250YWluaW5nX3R5cGUtPmFkZF9maWVsZCgpOworICAgIGZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgICBmaWVsZC0+c2V0X29uZW9mX2luZGV4KG9uZW9mX2luZGV4KTsKKworICAgIGlmICghUGFyc2VNZXNzYWdlRmllbGROb0xhYmVsKGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUHJvdG86OmtOZXN0ZWRUeXBlRmllbGROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlKSkgeworICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQorICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KKyAgICAgIFNraXBTdGF0ZW1lbnQoKTsKKyAgICB9CisgIH0gd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KQEAgLTEwOTIsNyArMTY2OSw4IEBACiAvLyBFbnVtcwogCiBib29sIFBhcnNlcjo6UGFyc2VFbnVtRGVmaW5pdGlvbihFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CiAgIERPKENvbnN1bWUoImVudW0iKSk7CiAKICAgewpAQCAtMTEwMywyMSArMTY4MSwyNSBAQAogICAgIERPKENvbnN1bWVJZGVudGlmaWVyKGVudW1fdHlwZS0+bXV0YWJsZV9uYW1lKCksICJFeHBlY3RlZCBlbnVtIG5hbWUuIikpOwogICB9CiAKLSAgRE8oUGFyc2VFbnVtQmxvY2soZW51bV90eXBlLCBlbnVtX2xvY2F0aW9uKSk7CisgIERPKFBhcnNlRW51bUJsb2NrKGVudW1fdHlwZSwgZW51bV9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSk7CisKKyAgRE8oVmFsaWRhdGVFbnVtKGVudW1fdHlwZSkpOworCiAgIHJldHVybiB0cnVlOwogfQogCiBib29sIFBhcnNlcjo6UGFyc2VFbnVtQmxvY2soRW51bURlc2NyaXB0b3JQcm90byogZW51bV90eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24pIHsKLSAgRE8oQ29uc3VtZSgieyIpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigieyIsICZlbnVtX2xvY2F0aW9uKSk7CiAKLSAgd2hpbGUgKCFUcnlDb25zdW1lKCJ9IikpIHsKKyAgd2hpbGUgKCFUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigifSIsIE5VTEwpKSB7CiAgICAgaWYgKEF0RW5kKCkpIHsKICAgICAgIEFkZEVycm9yKCJSZWFjaGVkIGVuZCBvZiBpbnB1dCBpbiBlbnVtIGRlZmluaXRpb24gKG1pc3NpbmcgJ30nKS4iKTsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CiAKLSAgICBpZiAoIVBhcnNlRW51bVN0YXRlbWVudChlbnVtX3R5cGUsIGVudW1fbG9jYXRpb24pKSB7CisgICAgaWYgKCFQYXJzZUVudW1TdGF0ZW1lbnQoZW51bV90eXBlLCBlbnVtX2xvY2F0aW9uLCBjb250YWluaW5nX2ZpbGUpKSB7CiAgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvIHBhcnNlCiAgICAgICAvLyBvdGhlciBzdGF0ZW1lbnRzLgogICAgICAgU2tpcFN0YXRlbWVudCgpOwpAQCAtMTEyOCwyMyArMTcxMCwyNiBAQAogfQogCiBib29sIFBhcnNlcjo6UGFyc2VFbnVtU3RhdGVtZW50KEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbikgewotICBpZiAoVHJ5Q29uc3VtZSgiOyIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgeworICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgewogICAgIC8vIGVtcHR5IHN0YXRlbWVudDsgaWdub3JlCiAgICAgcmV0dXJuIHRydWU7CiAgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJvcHRpb24iKSkgewogICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZW51bV9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXIpOwotICAgIHJldHVybiBQYXJzZU9wdGlvbihlbnVtX3R5cGUtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlT3B0aW9uKGVudW1fdHlwZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICBjb250YWluaW5nX2ZpbGUsIE9QVElPTl9TVEFURU1FTlQpOwogICB9IGVsc2UgewogICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24oZW51bV9sb2NhdGlvbiwKICAgICAgICAgRW51bURlc2NyaXB0b3JQcm90bzo6a1ZhbHVlRmllbGROdW1iZXIsIGVudW1fdHlwZS0+dmFsdWVfc2l6ZSgpKTsKLSAgICByZXR1cm4gUGFyc2VFbnVtQ29uc3RhbnQoZW51bV90eXBlLT5hZGRfdmFsdWUoKSwgbG9jYXRpb24pOworICAgIHJldHVybiBQYXJzZUVudW1Db25zdGFudChlbnVtX3R5cGUtPmFkZF92YWx1ZSgpLCBsb2NhdGlvbiwgY29udGFpbmluZ19maWxlKTsKICAgfQogfQogCiBib29sIFBhcnNlcjo6UGFyc2VFbnVtQ29uc3RhbnQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBlbnVtX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewogICAvLyBQYXJzZSBuYW1lLgogICB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihlbnVtX3ZhbHVlX2xvY2F0aW9uLApAQCAtMTE2NCwyMyArMTc0OSwyMyBAQAogICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKAogICAgICAgICBlbnVtX3ZhbHVlLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUik7CiAKLSAgICBib29sIGlzX25lZ2F0aXZlID0gVHJ5Q29uc3VtZSgiLSIpOwogICAgIGludCBudW1iZXI7Ci0gICAgRE8oQ29uc3VtZUludGVnZXIoJm51bWJlciwgIkV4cGVjdGVkIGludGVnZXIuIikpOwotICAgIGlmIChpc19uZWdhdGl2ZSkgbnVtYmVyICo9IC0xOworICAgIERPKENvbnN1bWVTaWduZWRJbnRlZ2VyKCZudW1iZXIsICJFeHBlY3RlZCBpbnRlZ2VyLiIpKTsKICAgICBlbnVtX3ZhbHVlLT5zZXRfbnVtYmVyKG51bWJlcik7CiAgIH0KIAotICBETyhQYXJzZUVudW1Db25zdGFudE9wdGlvbnMoZW51bV92YWx1ZSwgZW51bV92YWx1ZV9sb2NhdGlvbikpOworICBETyhQYXJzZUVudW1Db25zdGFudE9wdGlvbnMoZW51bV92YWx1ZSwgZW51bV92YWx1ZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSkpOwogCi0gIERPKENvbnN1bWUoIjsiKSk7CisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmVudW1fdmFsdWVfbG9jYXRpb24pKTsKIAogICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBQYXJzZXI6OlBhcnNlRW51bUNvbnN0YW50T3B0aW9ucygKICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHZhbHVlLAotICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fdmFsdWVfbG9jYXRpb24pIHsKKyAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uLAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewogICBpZiAoIUxvb2tpbmdBdCgiWyIpKSByZXR1cm4gdHJ1ZTsKIAogICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKApAQCAtMTE4OSw3ICsxNzc0LDggQEAKICAgRE8oQ29uc3VtZSgiWyIpKTsKIAogICBkbyB7Ci0gICAgRE8oUGFyc2VPcHRpb25Bc3NpZ25tZW50KHZhbHVlLT5tdXRhYmxlX29wdGlvbnMoKSwgbG9jYXRpb24pKTsKKyAgICBETyhQYXJzZU9wdGlvbih2YWx1ZS0+bXV0YWJsZV9vcHRpb25zKCksIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSwgT1BUSU9OX0FTU0lHTk1FTlQpKTsKICAgfSB3aGlsZSAoVHJ5Q29uc3VtZSgiLCIpKTsKIAogICBETyhDb25zdW1lKCJdIikpOwpAQCAtMTE5OSw4ICsxNzg1LDEwIEBACiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBTZXJ2aWNlcwogCi1ib29sIFBhcnNlcjo6UGFyc2VTZXJ2aWNlRGVmaW5pdGlvbihTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbikgeworYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZURlZmluaXRpb24oCisgICAgU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKKyAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uLAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewogICBETyhDb25zdW1lKCJzZXJ2aWNlIikpOwogCiAgIHsKQEAgLTEyMTEsMjEgKzE3OTksMjIgQEAKICAgICBETyhDb25zdW1lSWRlbnRpZmllcihzZXJ2aWNlLT5tdXRhYmxlX25hbWUoKSwgIkV4cGVjdGVkIHNlcnZpY2UgbmFtZS4iKSk7CiAgIH0KIAotICBETyhQYXJzZVNlcnZpY2VCbG9jayhzZXJ2aWNlLCBzZXJ2aWNlX2xvY2F0aW9uKSk7CisgIERPKFBhcnNlU2VydmljZUJsb2NrKHNlcnZpY2UsIHNlcnZpY2VfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSkpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAogYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZUJsb2NrKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNlcnZpY2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbikgewotICBETyhDb25zdW1lKCJ7IikpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJnNlcnZpY2VfbG9jYXRpb24pKTsKIAotICB3aGlsZSAoIVRyeUNvbnN1bWUoIn0iKSkgeworICB3aGlsZSAoIVRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ9IiwgTlVMTCkpIHsKICAgICBpZiAoQXRFbmQoKSkgewogICAgICAgQWRkRXJyb3IoIlJlYWNoZWQgZW5kIG9mIGlucHV0IGluIHNlcnZpY2UgZGVmaW5pdGlvbiAobWlzc2luZyAnfScpLiIpOwogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIGlmICghUGFyc2VTZXJ2aWNlU3RhdGVtZW50KHNlcnZpY2UsIHNlcnZpY2VfbG9jYXRpb24pKSB7CisgICAgaWYgKCFQYXJzZVNlcnZpY2VTdGF0ZW1lbnQoc2VydmljZSwgc2VydmljZV9sb2NhdGlvbiwgY29udGFpbmluZ19maWxlKSkgewogICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0byBwYXJzZQogICAgICAgLy8gb3RoZXIgc3RhdGVtZW50cy4KICAgICAgIFNraXBTdGF0ZW1lbnQoKTsKQEAgLTEyMzYsMjMgKzE4MjUsMjYgQEAKIH0KIAogYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZVN0YXRlbWVudChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBzZXJ2aWNlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uKSB7Ci0gIGlmIChUcnlDb25zdW1lKCI7IikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CisgIGlmIChUcnlDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsIE5VTEwpKSB7CiAgICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKICAgICByZXR1cm4gdHJ1ZTsKICAgfSBlbHNlIGlmIChMb29raW5nQXQoIm9wdGlvbiIpKSB7CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKICAgICAgICAgc2VydmljZV9sb2NhdGlvbiwgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcik7Ci0gICAgcmV0dXJuIFBhcnNlT3B0aW9uKHNlcnZpY2UtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbik7CisgICAgcmV0dXJuIFBhcnNlT3B0aW9uKHNlcnZpY2UtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbmluZ19maWxlLCBPUFRJT05fU1RBVEVNRU5UKTsKICAgfSBlbHNlIHsKICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKHNlcnZpY2VfbG9jYXRpb24sCiAgICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmtNZXRob2RGaWVsZE51bWJlciwgc2VydmljZS0+bWV0aG9kX3NpemUoKSk7Ci0gICAgcmV0dXJuIFBhcnNlU2VydmljZU1ldGhvZChzZXJ2aWNlLT5hZGRfbWV0aG9kKCksIGxvY2F0aW9uKTsKKyAgICByZXR1cm4gUGFyc2VTZXJ2aWNlTWV0aG9kKHNlcnZpY2UtPmFkZF9tZXRob2QoKSwgbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSk7CiAgIH0KIH0KIAogYm9vbCBQYXJzZXI6OlBhcnNlU2VydmljZU1ldGhvZChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWV0aG9kX2xvY2F0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1ldGhvZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKSB7CiAgIERPKENvbnN1bWUoInJwYyIpKTsKIAogICB7CkBAIC0xMjY2LDYgKzE4NTgsMTUgQEAKICAgLy8gUGFyc2UgaW5wdXQgdHlwZS4KICAgRE8oQ29uc3VtZSgiKCIpKTsKICAgeworICAgIGlmIChMb29raW5nQXQoInN0cmVhbSIpKSB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICAgIG1ldGhvZF9sb2NhdGlvbiwgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprQ2xpZW50U3RyZWFtaW5nRmllbGROdW1iZXIpOworICAgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgICAgbWV0aG9kLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSKTsKKyAgICAgIG1ldGhvZC0+c2V0X2NsaWVudF9zdHJlYW1pbmcodHJ1ZSk7CisgICAgICBETyhDb25zdW1lKCJzdHJlYW0iKSk7CisKKyAgICB9CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXRob2RfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtJbnB1dFR5cGVGaWVsZE51bWJlcik7CiAgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCkBAIC0xMjc4LDYgKzE4NzksMTUgQEAKICAgRE8oQ29uc3VtZSgicmV0dXJucyIpKTsKICAgRE8oQ29uc3VtZSgiKCIpKTsKICAgeworICAgIGlmIChMb29raW5nQXQoInN0cmVhbSIpKSB7CisgICAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICAgIG1ldGhvZF9sb2NhdGlvbiwgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprU2VydmVyU3RyZWFtaW5nRmllbGROdW1iZXIpOworICAgICAgbG9jYXRpb24uUmVjb3JkTGVnYWN5TG9jYXRpb24oCisgICAgICAgICAgbWV0aG9kLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSKTsKKyAgICAgIERPKENvbnN1bWUoInN0cmVhbSIpKTsKKyAgICAgIG1ldGhvZC0+c2V0X3NlcnZlcl9zdHJlYW1pbmcodHJ1ZSk7CisKKyAgICB9CiAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXRob2RfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtPdXRwdXRUeXBlRmllbGROdW1iZXIpOwogICAgIGxvY2F0aW9uLlJlY29yZExlZ2FjeUxvY2F0aW9uKApAQCAtMTI4NiwyOCArMTg5Niw0MyBAQAogICB9CiAgIERPKENvbnN1bWUoIikiKSk7CiAKLSAgaWYgKFRyeUNvbnN1bWUoInsiKSkgeworICBpZiAoTG9va2luZ0F0KCJ7IikpIHsKICAgICAvLyBPcHRpb25zIQotICAgIHdoaWxlICghVHJ5Q29uc3VtZSgifSIpKSB7Ci0gICAgICBpZiAoQXRFbmQoKSkgewotICAgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWV0aG9kIG9wdGlvbnMgKG1pc3NpbmcgJ30nKS4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQorICAgIERPKFBhcnNlTWV0aG9kT3B0aW9ucyhtZXRob2RfbG9jYXRpb24sIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBtZXRob2QtPm11dGFibGVfb3B0aW9ucygpKSk7CisgIH0gZWxzZSB7CisgICAgRE8oQ29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCAmbWV0aG9kX2xvY2F0aW9uKSk7CisgIH0KIAotICAgICAgaWYgKFRyeUNvbnN1bWUoIjsiKSkgewotICAgICAgICAvLyBlbXB0eSBzdGF0ZW1lbnQ7IGlnbm9yZQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihtZXRob2RfbG9jYXRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyKTsKLSAgICAgICAgaWYgKCFQYXJzZU9wdGlvbihtZXRob2QtPm11dGFibGVfb3B0aW9ucygpLCBsb2NhdGlvbikpIHsKLSAgICAgICAgICAvLyBUaGlzIHN0YXRlbWVudCBmYWlsZWQgdG8gcGFyc2UuICBTa2lwIGl0LCBidXQga2VlcCBsb29waW5nIHRvCi0gICAgICAgICAgLy8gcGFyc2Ugb3RoZXIgc3RhdGVtZW50cy4KLSAgICAgICAgICBTa2lwU3RhdGVtZW50KCk7Ci0gICAgICAgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKKworYm9vbCBQYXJzZXI6OlBhcnNlTWV0aG9kT3B0aW9ucyhjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXV0YWJsZV9vcHRpb25zKSB7CisgIC8vIE9wdGlvbnMhCisgIENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCJ7IiwgJnBhcmVudF9sb2NhdGlvbik7CisgIHdoaWxlICghVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIn0iLCBOVUxMKSkgeworICAgIGlmIChBdEVuZCgpKSB7CisgICAgICBBZGRFcnJvcigiUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gbWV0aG9kIG9wdGlvbnMgKG1pc3NpbmcgJ30nKS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oIjsiLCBOVUxMKSkgeworICAgICAgLy8gZW1wdHkgc3RhdGVtZW50OyBpZ25vcmUKKyAgICB9IGVsc2UgeworICAgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbihwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNGaWVsZE51bWJlcik7CisgICAgICBpZiAoIVBhcnNlT3B0aW9uKG11dGFibGVfb3B0aW9ucywgbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfZmlsZSwgT1BUSU9OX1NUQVRFTUVOVCkpIHsKKyAgICAgICAgLy8gVGhpcyBzdGF0ZW1lbnQgZmFpbGVkIHRvIHBhcnNlLiAgU2tpcCBpdCwgYnV0IGtlZXAgbG9vcGluZyB0bworICAgICAgICAvLyBwYXJzZSBvdGhlciBzdGF0ZW1lbnRzLgorICAgICAgICBTa2lwU3RhdGVtZW50KCk7CiAgICAgICB9CiAgICAgfQotICB9IGVsc2UgewotICAgIERPKENvbnN1bWUoIjsiKSk7CiAgIH0KIAogICByZXR1cm4gdHJ1ZTsKQEAgLTEzMTUsNyArMTk0MCw4IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAotYm9vbCBQYXJzZXI6OlBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCkgeworYm9vbCBQYXJzZXI6OlBhcnNlTGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsKiBsYWJlbCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewogICBpZiAoVHJ5Q29uc3VtZSgib3B0aW9uYWwiKSkgewogICAgICpsYWJlbCA9IEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTDsKICAgICByZXR1cm4gdHJ1ZTsKQEAgLTEzMjUsMTMgKzE5NTEsOCBAQAogICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoInJlcXVpcmVkIikpIHsKICAgICAqbGFiZWwgPSBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQ7CiAgICAgcmV0dXJuIHRydWU7Ci0gIH0gZWxzZSB7Ci0gICAgQWRkRXJyb3IoIkV4cGVjdGVkIFwicmVxdWlyZWRcIiwgXCJvcHRpb25hbFwiLCBvciBcInJlcGVhdGVkXCIuIik7Ci0gICAgLy8gV2UgY2FuIGFjdHVhbGx5IHJlYXNvbmFibHkgcmVjb3ZlciBoZXJlIGJ5IGp1c3QgYXNzdW1pbmcgdGhlIHVzZXIKLSAgICAvLyBmb3Jnb3QgdGhlIGxhYmVsIGFsdG9nZXRoZXIuCi0gICAgKmxhYmVsID0gRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMOwotICAgIHJldHVybiB0cnVlOwogICB9CisgIHJldHVybiBmYWxzZTsKIH0KIAogYm9vbCBQYXJzZXI6OlBhcnNlVHlwZShGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZSogdHlwZSwKQEAgLTEzODQsNyArMjAwNSw4IEBACiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGJvb2wgUGFyc2VyOjpQYXJzZVBhY2thZ2UoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgcm9vdF9sb2NhdGlvbikgeworICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpIHsKICAgaWYgKGZpbGUtPmhhc19wYWNrYWdlKCkpIHsKICAgICBBZGRFcnJvcigiTXVsdGlwbGUgcGFja2FnZSBkZWZpbml0aW9ucy4iKTsKICAgICAvLyBEb24ndCBhcHBlbmQgdGhlIG5ldyBwYWNrYWdlIHRvIHRoZSBvbGQgb25lLiAgSnVzdCByZXBsYWNlIGl0LiAgTm90CkBAIC0xNDA2LDMyICsyMDI4LDQ1IEBACiAgICAgICBpZiAoIVRyeUNvbnN1bWUoIi4iKSkgYnJlYWs7CiAgICAgICBmaWxlLT5tdXRhYmxlX3BhY2thZ2UoKS0+YXBwZW5kKCIuIik7CiAgICAgfQorCisgICAgbG9jYXRpb24uRW5kQXQoaW5wdXRfLT5wcmV2aW91cygpKTsKKworICAgIERPKENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCI7IiwgJmxvY2F0aW9uKSk7CiAgIH0KIAotICBETyhDb25zdW1lKCI7IikpOwogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBQYXJzZXI6OlBhcnNlSW1wb3J0KHN0cmluZyogaW1wb3J0X2ZpbGVuYW1lLAorYm9vbCBQYXJzZXI6OlBhcnNlSW1wb3J0KFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogZGVwZW5kZW5jeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludDMyPiogcHVibGljX2RlcGVuZGVuY3ksCisgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMj4qIHdlYWtfZGVwZW5kZW5jeSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSkgewogICBETyhDb25zdW1lKCJpbXBvcnQiKSk7CisgIGlmIChMb29raW5nQXQoInB1YmxpYyIpKSB7CisgICAgTG9jYXRpb25SZWNvcmRlciBsb2NhdGlvbigKKyAgICAgICAgcm9vdF9sb2NhdGlvbiwgRmlsZURlc2NyaXB0b3JQcm90bzo6a1B1YmxpY0RlcGVuZGVuY3lGaWVsZE51bWJlciwKKyAgICAgICAgcHVibGljX2RlcGVuZGVuY3ktPnNpemUoKSk7CisgICAgRE8oQ29uc3VtZSgicHVibGljIikpOworICAgICpwdWJsaWNfZGVwZW5kZW5jeS0+QWRkKCkgPSBkZXBlbmRlbmN5LT5zaXplKCk7CisgIH0gZWxzZSBpZiAoTG9va2luZ0F0KCJ3ZWFrIikpIHsKKyAgICBMb2NhdGlvblJlY29yZGVyIGxvY2F0aW9uKAorICAgICAgICByb290X2xvY2F0aW9uLCBGaWxlRGVzY3JpcHRvclByb3RvOjprV2Vha0RlcGVuZGVuY3lGaWVsZE51bWJlciwKKyAgICAgICAgd2Vha19kZXBlbmRlbmN5LT5zaXplKCkpOworICAgIERPKENvbnN1bWUoIndlYWsiKSk7CisgICAgKndlYWtfZGVwZW5kZW5jeS0+QWRkKCkgPSBkZXBlbmRlbmN5LT5zaXplKCk7CisgIH0KICAgewogICAgIExvY2F0aW9uUmVjb3JkZXIgbG9jYXRpb24ocm9vdF9sb2NhdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmtEZXBlbmRlbmN5RmllbGROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbmRleCk7Ci0gICAgRE8oQ29uc3VtZVN0cmluZyhpbXBvcnRfZmlsZW5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5LT5zaXplKCkpOworICAgIERPKENvbnN1bWVTdHJpbmcoZGVwZW5kZW5jeS0+QWRkKCksCiAgICAgICAiRXhwZWN0ZWQgYSBzdHJpbmcgbmFtaW5nIHRoZSBmaWxlIHRvIGltcG9ydC4iKSk7Ci0gIH0KLSAgRE8oQ29uc3VtZSgiOyIpKTsKLSAgcmV0dXJuIHRydWU7Ci19CiAKLWJvb2wgUGFyc2VyOjpQYXJzZU9wdGlvbihNZXNzYWdlKiBvcHRpb25zLAotICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9wdGlvbnNfbG9jYXRpb24pIHsKLSAgRE8oQ29uc3VtZSgib3B0aW9uIikpOwotICBETyhQYXJzZU9wdGlvbkFzc2lnbm1lbnQob3B0aW9ucywgb3B0aW9uc19sb2NhdGlvbikpOwotICBETyhDb25zdW1lKCI7IikpOworICAgIGxvY2F0aW9uLkVuZEF0KGlucHV0Xy0+cHJldmlvdXMoKSk7CisKKyAgICBETyhDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigiOyIsICZsb2NhdGlvbikpOworICB9CiAgIHJldHVybiB0cnVlOwogfQogCkBAIC0xNDQ1LDcgKzIwODAsNyBAQAogICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKICAgICBpbnQqIGxpbmUsIGludCogY29sdW1uKSBjb25zdCB7CiAgIGNvbnN0IHBhaXI8aW50LCBpbnQ+KiByZXN1bHQgPQotICAgIEZpbmRPck51bGwobG9jYXRpb25fbWFwXywgbWFrZV9wYWlyKGRlc2NyaXB0b3IsIGxvY2F0aW9uKSk7CisgICAgICBGaW5kT3JOdWxsKGxvY2F0aW9uX21hcF8sIHN0ZDo6bWFrZV9wYWlyKGRlc2NyaXB0b3IsIGxvY2F0aW9uKSk7CiAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICpsaW5lICAgPSAtMTsKICAgICAqY29sdW1uID0gMDsKQEAgLTE0NjEsNyArMjA5Niw4IEBACiAgICAgY29uc3QgTWVzc2FnZSogZGVzY3JpcHRvciwKICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24sCiAgICAgaW50IGxpbmUsIGludCBjb2x1bW4pIHsKLSAgbG9jYXRpb25fbWFwX1ttYWtlX3BhaXIoZGVzY3JpcHRvciwgbG9jYXRpb24pXSA9IG1ha2VfcGFpcihsaW5lLCBjb2x1bW4pOworICBsb2NhdGlvbl9tYXBfW3N0ZDo6bWFrZV9wYWlyKGRlc2NyaXB0b3IsIGxvY2F0aW9uKV0gPQorICAgICAgc3RkOjptYWtlX3BhaXIobGluZSwgY29sdW1uKTsKIH0KIAogdm9pZCBTb3VyY2VMb2NhdGlvblRhYmxlOjpDbGVhcigpIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmgKaW5kZXggNGNjOTBhMi4uMmM1NjFjMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQwLDcgKzQwLDYgQEAKICNpbmNsdWRlIDxtYXA+CiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KQEAgLTExNiw2ICsxMTUsOCBAQAogICB9CiAKICBwcml2YXRlOgorICBjbGFzcyBMb2NhdGlvblJlY29yZGVyOworCiAgIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAgIC8vIEVycm9yIHJlY292ZXJ5IGhlbHBlcnMKIApAQCAtMTY0LDYgKzE2NSw4IEBACiAgIGJvb2wgQ29uc3VtZUlkZW50aWZpZXIoc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKICAgLy8gQ29uc3VtZSBhbiBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuCiAgIGJvb2wgQ29uc3VtZUludGVnZXIoaW50KiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgLy8gQ29uc3VtZSBhIHNpZ25lZCBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuCisgIGJvb2wgQ29uc3VtZVNpZ25lZEludGVnZXIoaW50KiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKICAgLy8gQ29uc3VtZSBhIDY0LWJpdCBpbnRlZ2VyIGFuZCBzdG9yZSBpdHMgdmFsdWUgaW4gIm91dHB1dCIuICBJZiB0aGUgdmFsdWUKICAgLy8gaXMgZ3JlYXRlciB0aGFuIG1heF92YWx1ZSwgYW4gZXJyb3Igd2lsbCBiZSByZXBvcnRlZC4KICAgYm9vbCBDb25zdW1lSW50ZWdlcjY0KHVpbnQ2NCBtYXhfdmFsdWUsIHVpbnQ2NCogb3V0cHV0LCBjb25zdCBjaGFyKiBlcnJvcik7CkBAIC0xNzMsNiArMTc2LDIzIEBACiAgIC8vIENvbnN1bWUgYSBzdHJpbmcgbGl0ZXJhbCBhbmQgc3RvcmUgaXRzICh1bmVzY2FwZWQpIHZhbHVlIGluICJvdXRwdXQiLgogICBib29sIENvbnN1bWVTdHJpbmcoc3RyaW5nKiBvdXRwdXQsIGNvbnN0IGNoYXIqIGVycm9yKTsKIAorICAvLyBDb25zdW1lIGEgdG9rZW4gcmVwcmVzZW50aW5nIHRoZSBlbmQgb2YgdGhlIHN0YXRlbWVudC4gIENvbW1lbnRzIGJldHdlZW4KKyAgLy8gdGhpcyB0b2tlbiBhbmQgdGhlIG5leHQgd2lsbCBiZSBoYXJ2ZXN0ZWQgZm9yIGRvY3VtZW50YXRpb24uICBUaGUgZ2l2ZW4KKyAgLy8gTG9jYXRpb25SZWNvcmRlciBzaG91bGQgcmVmZXIgdG8gdGhlIGRlY2xhcmF0aW9uIHRoYXQgd2FzIGp1c3QgcGFyc2VkOworICAvLyBpdCB3aWxsIGJlIHBvcHVsYXRlZCB3aXRoIHRoZXNlIGNvbW1lbnRzLgorICAvLworICAvLyBUT0RPKGtlbnRvbik6ICBUaGUgTG9jYXRpb25SZWNvcmRlciBpcyBjb25zdCBiZWNhdXNlIGhpc3RvcmljYWxseSBsb2NhdGlvbnMKKyAgLy8gICBoYXZlIGJlZW4gcGFzc2VkIGFyb3VuZCBieSBjb25zdCByZWZlcmVuY2UsIGZvciBubyBwYXJ0aWN1bGFybHkgZ29vZAorICAvLyAgIHJlYXNvbi4gIFdlIHNob3VsZCBwcm9iYWJseSBnbyB0aHJvdWdoIGFuZCBjaGFuZ2UgdGhlbSBhbGwgdG8gbXV0YWJsZQorICAvLyAgIHBvaW50ZXIgdG8gbWFrZSB0aGlzIG1vcmUgaW50dWl0aXZlLgorICBib29sIFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKAorICAgICAgY29uc3QgY2hhciogdGV4dCwgY29uc3QgTG9jYXRpb25SZWNvcmRlciogbG9jYXRpb24pOworICBib29sIFRyeUNvbnN1bWVFbmRPZkRlY2xhcmF0aW9uRmluaXNoU2NvcGUoCisgICAgICBjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBMb2NhdGlvblJlY29yZGVyKiBsb2NhdGlvbik7CisKKyAgYm9vbCBDb25zdW1lRW5kT2ZEZWNsYXJhdGlvbigKKyAgICAgIGNvbnN0IGNoYXIqIHRleHQsIGNvbnN0IExvY2F0aW9uUmVjb3JkZXIqIGxvY2F0aW9uKTsKKwogICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBFcnJvciBsb2dnaW5nIGhlbHBlcnMKIApAQCAtMjE1LDYgKzIzNSw5IEBACiAgICAgLy8gbG9jYXRpb24gdG8gdGhlIGdpdmVuIHRva2VuIGluc3RlYWQuCiAgICAgdm9pZCBTdGFydEF0KGNvbnN0IGlvOjpUb2tlbml6ZXI6OlRva2VuJiB0b2tlbik7CiAKKyAgICAvLyBTdGFydCBhdCB0aGUgc2FtZSBsb2NhdGlvbiBhcyBzb21lIG90aGVyIExvY2F0aW9uUmVjb3JkZXIuCisgICAgdm9pZCBTdGFydEF0KGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG90aGVyKTsKKwogICAgIC8vIEJ5IGRlZmF1bHQgdGhlIGxvY2F0aW9uIGlzIGNvbnNpZGVyZWQgdG8gZW5kIGF0IHRoZSBwcmV2aW91cyB0b2tlbiBhdAogICAgIC8vIHRoZSB0aW1lIHRoZSBMb2NhdGlvblJlY29yZGVyIGlzIGRlc3Ryb3llZC4gIEVuZEF0KCkgc2V0cyB0aGUgZW5kCiAgICAgLy8gbG9jYXRpb24gdG8gdGhlIGdpdmVuIHRva2VuIGluc3RlYWQuCkBAIC0yMjcsNyArMjUwLDE5IEBACiAgICAgdm9pZCBSZWNvcmRMZWdhY3lMb2NhdGlvbihjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAogICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkVycm9yTG9jYXRpb24gbG9jYXRpb24pOwogCisgICAgLy8gQXR0YWNoZXMgbGVhZGluZyBhbmQgdHJhaWxpbmcgY29tbWVudHMgdG8gdGhlIGxvY2F0aW9uLiAgVGhlIHR3byBzdHJpbmdzCisgICAgLy8gd2lsbCBiZSBzd2FwcGVkIGludG8gcGxhY2UsIHNvIGFmdGVyIHRoaXMgaXMgY2FsbGVkICpsZWFkaW5nIGFuZAorICAgIC8vICp0cmFpbGluZyB3aWxsIGJlIGVtcHR5LgorICAgIC8vCisgICAgLy8gVE9ETyhrZW50b24pOiAgU2VlIGNvbW1lbnQgb24gVHJ5Q29uc3VtZUVuZE9mRGVjbGFyYXRpb24oKSwgYWJvdmUsIGZvcgorICAgIC8vICAgd2h5IHRoaXMgaXMgY29uc3QuCisgICAgdm9pZCBBdHRhY2hDb21tZW50cyhzdHJpbmcqIGxlYWRpbmcsIHN0cmluZyogdHJhaWxpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMpIGNvbnN0OworCiAgICBwcml2YXRlOgorICAgIC8vIEluZGV4ZXMgb2YgcGFyZW50IGFuZCBjdXJyZW50IGxvY2F0aW9uIGluIHRoZSBwYXJlbnQKKyAgICAvLyBTb3VyY2VDb2RlSW5mby5sb2NhdGlvbiByZXBlYXRlZCBmaWVsZC4gRm9yIHRvcC1sZXZlbCBlbGVtZW50cywKKyAgICAvLyBwYXJlbnRfaW5kZXhfIGlzIC0xLgogICAgIFBhcnNlciogcGFyc2VyXzsKICAgICBTb3VyY2VDb2RlSW5mbzo6TG9jYXRpb24qIGxvY2F0aW9uXzsKIApAQCAtMjQwLDcgKzI3NSw3IEBACiAgIC8vIFBhcnNlcyB0aGUgInN5bnRheCA9IFwicHJvdG8yXCI7IiBsaW5lIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUuICBSZXR1cm5zCiAgIC8vIGZhbHNlIGlmIGl0IGZhaWxlZCB0byBwYXJzZSBvciBpZiB0aGUgc3ludGF4IGlkZW50aWZpZXIgd2FzIG5vdAogICAvLyByZWNvZ25pemVkLgotICBib29sIFBhcnNlU3ludGF4SWRlbnRpZmllcigpOworICBib29sIFBhcnNlU3ludGF4SWRlbnRpZmllcihjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnQpOwogCiAgIC8vIFRoZXNlIG1ldGhvZHMgcGFyc2UgdmFyaW91cyBpbmRpdmlkdWFsIGJpdHMgb2YgY29kZS4gIFRoZXkgcmV0dXJuCiAgIC8vIGZhbHNlIGlmIHRoZXkgY29tcGxldGVseSBmYWlsIHRvIHBhcnNlIHRoZSBjb25zdHJ1Y3QuICBJbiB0aGlzIGNhc2UsCkBAIC0yNTgsMzcgKzI5Myw0NyBAQAogCiAgIC8vIFBhcnNlIHZhcmlvdXMgbGFuZ3VhZ2UgaGlnaC1sZXZlbCBsYW5ndWFnZSBjb25zdHJ1cmN0cy4KICAgYm9vbCBQYXJzZU1lc3NhZ2VEZWZpbml0aW9uKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG1lc3NhZ2VfbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CiAgIGJvb2wgUGFyc2VFbnVtRGVmaW5pdGlvbihFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwogICBib29sIFBhcnNlU2VydmljZURlZmluaXRpb24oU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgc2VydmljZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CiAgIGJvb2wgUGFyc2VQYWNrYWdlKEZpbGVEZXNjcmlwdG9yUHJvdG8qIGZpbGUsCi0gICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHJvb3RfbG9jYXRpb24pOwotICBib29sIFBhcnNlSW1wb3J0KHN0cmluZyogaW1wb3J0X2ZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworICBib29sIFBhcnNlSW1wb3J0KFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogZGVwZW5kZW5jeSwKKyAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludDMyPiogcHVibGljX2RlcGVuZGVuY3ksCisgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMj4qIHdlYWtfZGVwZW5kZW5jeSwKICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiByb290X2xvY2F0aW9uLAotICAgICAgICAgICAgICAgICAgIGludCBpbmRleCk7Ci0gIGJvb2wgUGFyc2VPcHRpb24oTWVzc2FnZSogb3B0aW9ucywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvcHRpb25zX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwogCiAgIC8vIFRoZXNlIG1ldGhvZHMgcGFyc2UgdGhlIGNvbnRlbnRzIG9mIGEgbWVzc2FnZSwgZW51bSwgb3Igc2VydmljZSB0eXBlIGFuZAogICAvLyBhZGQgdGhlbSB0byB0aGUgZ2l2ZW4gb2JqZWN0LiAgVGhleSBjb25zdW1lIHRoZSBlbnRpcmUgYmxvY2sgaW5jbHVkaW5nCiAgIC8vIHRoZSBiZWdpbm5pbmcgYW5kIGVuZGluZyBicmFjZS4KICAgYm9vbCBQYXJzZU1lc3NhZ2VCbG9jayhEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwogICBib29sIFBhcnNlRW51bUJsb2NrKEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CiAgIGJvb2wgUGFyc2VTZXJ2aWNlQmxvY2soU2VydmljZURlc2NyaXB0b3JQcm90byogc2VydmljZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CiAKLSAgLy8gUGFyc2Ugb25lIHN0YXRlbWVudCB3aXRoaW4gYSBtZXNzYWdlLCBlbnVtLCBvciBzZXJ2aWNlIGJsb2NrLCBpbmNsdW5kaW5nCisgIC8vIFBhcnNlIG9uZSBzdGF0ZW1lbnQgd2l0aGluIGEgbWVzc2FnZSwgZW51bSwgb3Igc2VydmljZSBibG9jaywgaW5jbHVkaW5nCiAgIC8vIGZpbmFsIHNlbWljb2xvbi4KICAgYm9vbCBQYXJzZU1lc3NhZ2VTdGF0ZW1lbnQoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWVzc2FnZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKICAgYm9vbCBQYXJzZUVudW1TdGF0ZW1lbnQoRW51bURlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV9sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGVudW1fbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CiAgIGJvb2wgUGFyc2VTZXJ2aWNlU3RhdGVtZW50KFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHNlcnZpY2VfbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBzZXJ2aWNlX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwogCiAgIC8vIFBhcnNlIGEgZmllbGQgb2YgYSBtZXNzYWdlLiAgSWYgdGhlIGZpZWxkIGlzIGEgZ3JvdXAsIGl0cyB0eXBlIHdpbGwgYmUKICAgLy8gYWRkZWQgdG8gIm1lc3NhZ2VzIi4KQEAgLTMwMiwxMSArMzQ3LDMwIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24pOworICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisKKyAgLy8gTGlrZSBQYXJzZU1lc3NhZ2VGaWVsZCgpIGJ1dCBleHBlY3RzIHRoZSBsYWJlbCBoYXMgYWxyZWFkeSBiZWVuIGZpbGxlZCBpbgorICAvLyBieSB0aGUgY2FsbGVyLgorICBib29sIFBhcnNlTWVzc2FnZUZpZWxkTm9MYWJlbChGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkUHRyRmllbGQ8RGVzY3JpcHRvclByb3RvPiogbWVzc2FnZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcmVudF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwogCiAgIC8vIFBhcnNlIGFuICJleHRlbnNpb25zIiBkZWNsYXJhdGlvbi4KICAgYm9vbCBQYXJzZUV4dGVuc2lvbnMoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBleHRlbnNpb25zX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5zaW9uc19sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICAvLyBQYXJzZSBhICJyZXNlcnZlZCIgZGVjbGFyYXRpb24uCisgIGJvb2wgUGFyc2VSZXNlcnZlZChEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBtZXNzYWdlX2xvY2F0aW9uKTsKKyAgYm9vbCBQYXJzZVJlc2VydmVkTmFtZXMoRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24pOworICBib29sIFBhcnNlUmVzZXJ2ZWROdW1iZXJzKERlc2NyaXB0b3JQcm90byogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24pOwogCiAgIC8vIFBhcnNlIGFuICJleHRlbmQiIGRlY2xhcmF0aW9uLiAgKFNlZSBhbHNvIGNvbW1lbnRzIGZvcgogICAvLyBQYXJzZU1lc3NhZ2VGaWVsZCgpLikKQEAgLTMxNCwyNCArMzc4LDQ2IEBACiAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxEZXNjcmlwdG9yUHJvdG8+KiBtZXNzYWdlcywKICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCiAgICAgICAgICAgICAgICAgICAgaW50IGxvY2F0aW9uX2ZpZWxkX251bWJlcl9mb3JfbmVzdGVkX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZXh0ZW5kX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBleHRlbmRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICAvLyBQYXJzZSBhICJvbmVvZiIgZGVjbGFyYXRpb24uICBUaGUgY2FsbGVyIGlzIHJlc3BvbnNpYmxlIGZvciBzZXR0aW5nCisgIC8vIG9uZW9mX2RlY2wtPmxhYmVsKCkgc2luY2UgaXQgd2lsbCBoYXZlIGhhZCB0byBwYXJzZSB0aGUgbGFiZWwgYmVmb3JlIGl0CisgIC8vIGtuZXcgaXQgd2FzIHBhcnNpbmcgYSBvbmVvZi4KKyAgYm9vbCBQYXJzZU9uZW9mKE9uZW9mRGVzY3JpcHRvclByb3RvKiBvbmVvZl9kZWNsLAorICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICBpbnQgb25lb2ZfaW5kZXgsCisgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBvbmVvZl9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGNvbnRhaW5pbmdfdHlwZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CiAKICAgLy8gUGFyc2UgYSBzaW5nbGUgZW51bSB2YWx1ZSB3aXRoaW4gYW4gZW51bSBibG9jay4KICAgYm9vbCBQYXJzZUVudW1Db25zdGFudChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIGVudW1fdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV92YWx1ZV9sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV92YWx1ZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwogCiAgIC8vIFBhcnNlIGVudW0gY29uc3RhbnQgb3B0aW9ucywgaS5lLiB0aGUgbGlzdCBpbiBzcXVhcmUgYnJhY2tldHMgYXQgdGhlIGVuZAogICAvLyBvZiB0aGUgZW51bSBjb25zdGFudCB2YWx1ZSBkZWZpbml0aW9uLgogICBib29sIFBhcnNlRW51bUNvbnN0YW50T3B0aW9ucyhFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBlbnVtX3ZhbHVlX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZW51bV92YWx1ZV9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKIAogICAvLyBQYXJzZSBhIHNpbmdsZSBtZXRob2Qgd2l0aGluIGEgc2VydmljZSBkZWZpbml0aW9uLgogICBib29sIFBhcnNlU2VydmljZU1ldGhvZChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG1ldGhvZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWV0aG9kX2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgbWV0aG9kX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOworCisKKyAgLy8gUGFyc2Ugb3B0aW9ucyBvZiBhIHNpbmdsZSBtZXRob2Qgb3Igc3RyZWFtLgorICBib29sIFBhcnNlTWV0aG9kT3B0aW9ucyhjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJlbnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgaW50IG9wdGlvbnNGaWVsZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbXV0YWJsZV9vcHRpb25zKTsKIAogICAvLyBQYXJzZSAicmVxdWlyZWQiLCAib3B0aW9uYWwiLCBvciAicmVwZWF0ZWQiIGFuZCBmaWxsIGluICJsYWJlbCIKLSAgLy8gd2l0aCB0aGUgdmFsdWUuCi0gIGJvb2wgUGFyc2VMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWwqIGxhYmVsKTsKKyAgLy8gd2l0aCB0aGUgdmFsdWUuIFJldHVybnMgdHJ1ZSBpZiBzdWNoIGEgbGFiZWwgaXMgY29uc3VtZWQuCisgIGJvb2wgUGFyc2VMYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWwqIGxhYmVsLAorICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKIAogICAvLyBQYXJzZSBhIHR5cGUgbmFtZSBhbmQgZmlsbCBpbiAidHlwZSIgKGlmIGl0IGlzIGEgcHJpbWl0aXZlKSBvcgogICAvLyAidHlwZV9uYW1lIiAoaWYgaXQgaXMgbm90KSB3aXRoIHRoZSB0eXBlIHBhcnNlZC4KQEAgLTM0NCwyNSArNDMwLDM5IEBACiAgIC8vIFBhcnNlcyBmaWVsZCBvcHRpb25zLCBpLmUuIHRoZSBzdHVmZiBpbiBzcXVhcmUgYnJhY2tldHMgYXQgdGhlIGVuZAogICAvLyBvZiBhIGZpZWxkIGRlZmluaXRpb24uICBBbHNvIHBhcnNlcyBkZWZhdWx0IHZhbHVlLgogICBib29sIFBhcnNlRmllbGRPcHRpb25zKEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgZmllbGRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKIAogICAvLyBQYXJzZSB0aGUgImRlZmF1bHQiIG9wdGlvbi4gIFRoaXMgbmVlZHMgc3BlY2lhbCBoYW5kbGluZyBiZWNhdXNlIGl0cwogICAvLyB0eXBlIGlzIHRoZSBmaWVsZCdzIHR5cGUuCiAgIGJvb2wgUGFyc2VEZWZhdWx0QXNzaWdubWVudChGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBmaWVsZF9sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIGNvbnRhaW5pbmdfZmlsZSk7CisKKyAgYm9vbCBQYXJzZUpzb25OYW1lKEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIGZpZWxkX2xvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogY29udGFpbmluZ19maWxlKTsKKworICBlbnVtIE9wdGlvblN0eWxlIHsKKyAgICBPUFRJT05fQVNTSUdOTUVOVCwgIC8vIGp1c3QgIm5hbWUgPSB2YWx1ZSIKKyAgICBPUFRJT05fU1RBVEVNRU5UICAgIC8vICJvcHRpb24gbmFtZSA9IHZhbHVlOyIKKyAgfTsKIAogICAvLyBQYXJzZSBhIHNpbmdsZSBvcHRpb24gbmFtZS92YWx1ZSBwYWlyLCBlLmcuICJjdHlwZSA9IENPUkQiLiAgVGhlIG5hbWUKICAgLy8gaWRlbnRpZmllcyBhIGZpZWxkIG9mIHRoZSBnaXZlbiBNZXNzYWdlLCBhbmQgdGhlIHZhbHVlIG9mIHRoYXQgZmllbGQKICAgLy8gaXMgc2V0IHRvIHRoZSBwYXJzZWQgdmFsdWUuCi0gIGJvb2wgUGFyc2VPcHRpb25Bc3NpZ25tZW50KE1lc3NhZ2UqIG9wdGlvbnMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIG9wdGlvbnNfbG9jYXRpb24pOworICBib29sIFBhcnNlT3B0aW9uKE1lc3NhZ2UqIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgTG9jYXRpb25SZWNvcmRlciYgb3B0aW9uc19sb2NhdGlvbiwKKyAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUsCisgICAgICAgICAgICAgICAgICAgT3B0aW9uU3R5bGUgc3R5bGUpOwogCiAgIC8vIFBhcnNlcyBhIHNpbmdsZSBwYXJ0IG9mIGEgbXVsdGlwYXJ0IG9wdGlvbiBuYW1lLiBBIG11bHRpcGFydCBuYW1lIGNvbnNpc3RzCiAgIC8vIG9mIG5hbWVzIHNlcGFyYXRlZCBieSBkb3RzLiBFYWNoIG5hbWUgaXMgZWl0aGVyIGFuIGlkZW50aWZpZXIgb3IgYSBzZXJpZXMKICAgLy8gb2YgaWRlbnRpZmllcnMgc2VwYXJhdGVkIGJ5IGRvdHMgYW5kIGVuY2xvc2VkIGluIHBhcmVudGhlc2VzLiBFLmcuLAogICAvLyAiZm9vLihiYXIuYmF6KS5xdXgiLgogICBib29sIFBhcnNlT3B0aW9uTmFtZVBhcnQoVW5pbnRlcnByZXRlZE9wdGlvbiogdW5pbnRlcnByZXRlZF9vcHRpb24sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBMb2NhdGlvblJlY29yZGVyJiBwYXJ0X2xvY2F0aW9uKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IExvY2F0aW9uUmVjb3JkZXImIHBhcnRfbG9jYXRpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKiBjb250YWluaW5nX2ZpbGUpOwogCiAgIC8vIFBhcnNlcyBhIHN0cmluZyBzdXJyb3VuZGVkIGJ5IGJhbGFuY2VkIGJyYWNlcy4gIFN0cmlwcyBvZmYgdGhlIG91dGVyCiAgIC8vIGJyYWNlcyBhbmQgc3RvcmVzIHRoZSBlbmNsb3NlZCBzdHJpbmcgaW4gKnZhbHVlLgpAQCAtMzc2LDYgKzQ3NiwzMCBAQAogICAvLyB0aGUgZW5kaW5nIGJyYWNlLgogICBib29sIFBhcnNlVW5pbnRlcnByZXRlZEJsb2NrKHN0cmluZyogdmFsdWUpOwogCisgIHN0cnVjdCBNYXBGaWVsZCB7CisgICAgLy8gV2hldGhlciB0aGUgZmllbGQgaXMgYSBtYXAgZmllbGQuCisgICAgYm9vbCBpc19tYXBfZmllbGQ7CisgICAgLy8gVGhlIHR5cGVzIG9mIHRoZSBrZXkgYW5kIHZhbHVlIGlmIHRoZXkgYXJlIHByaW1pdGl2ZSB0eXBlcy4KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZSBrZXlfdHlwZTsKKyAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VHlwZSB2YWx1ZV90eXBlOworICAgIC8vIE9yIHRoZSB0eXBlIG5hbWVzIHN0cmluZyBpZiB0aGUgdHlwZXMgYXJlIGN1c3RvbWl6ZWQgdHlwZXMuCisgICAgc3RyaW5nIGtleV90eXBlX25hbWU7CisgICAgc3RyaW5nIHZhbHVlX3R5cGVfbmFtZTsKKworICAgIE1hcEZpZWxkKCkgOiBpc19tYXBfZmllbGQoZmFsc2UpIHt9CisgIH07CisgIC8vIERlc3VnYXIgdGhlIG1hcCBzeW50YXggdG8gZ2VuZXJhdGUgYSBuZXN0ZWQgbWFwIGVudHJ5IG1lc3NhZ2UuCisgIHZvaWQgR2VuZXJhdGVNYXBFbnRyeShjb25zdCBNYXBGaWVsZCYgbWFwX2ZpZWxkLCBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZFB0ckZpZWxkPERlc2NyaXB0b3JQcm90bz4qIG1lc3NhZ2VzKTsKKworICAvLyBXaGV0aGVyIGZpZWxkcyB3aXRob3V0IGxhYmVsIGRlZmF1bHQgdG8gb3B0aW9uYWwgZmllbGRzLgorICBib29sIERlZmF1bHRUb09wdGlvbmFsRmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBzeW50YXhfaWRlbnRpZmllcl8gPT0gInByb3RvMyI7CisgIH0KKworCisgIGJvb2wgVmFsaWRhdGVFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8qIHByb3RvKTsKKwogICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAgIGlvOjpUb2tlbml6ZXIqIGlucHV0XzsKQEAgLTM4Nyw2ICs1MTEsMTcgQEAKICAgYm9vbCBzdG9wX2FmdGVyX3N5bnRheF9pZGVudGlmaWVyXzsKICAgc3RyaW5nIHN5bnRheF9pZGVudGlmaWVyXzsKIAorICAvLyBMZWFkaW5nIGRvYyBjb21tZW50cyBmb3IgdGhlIG5leHQgZGVjbGFyYXRpb24uICBUaGVzZSBhcmUgbm90IGNvbXBsZXRlCisgIC8vIHlldDsgdXNlIENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCkgdG8gZ2V0IHRoZSBjb21wbGV0ZSBjb21tZW50cy4KKyAgc3RyaW5nIHVwY29taW5nX2RvY19jb21tZW50c187CisKKyAgLy8gRGV0YWNoZWQgY29tbWVudHMgYXJlIG5vdCBjb25uZWN0ZWQgdG8gYW55IHN5bnRheCBlbnRpdGllcy4gRWxlbWVudHMgaW4KKyAgLy8gdGhpcyB2ZWN0b3IgYXJlIHBhcmFncmFwaHMgb2YgY29tbWVudHMgc2VwYXJhdGVkIGJ5IGVtcHR5IGxpbmVzLiBUaGUKKyAgLy8gZGV0YWNoZWQgY29tbWVudHMgd2lsbCBiZSBwdXQgaW50byB0aGUgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyBmaWVsZCBmb3IKKyAgLy8gdGhlIG5leHQgZWxlbWVudCAoU2VlIFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGluIGRlc2NyaXB0b3IucHJvdG8pLCB3aGVuCisgIC8vIENvbnN1bWVFbmRPZkRlY2xhcmF0aW9uKCkgaXMgY2FsbGVkLgorICB2ZWN0b3I8c3RyaW5nPiB1cGNvbWluZ19kZXRhY2hlZF9jb21tZW50c187CisKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFBhcnNlcik7CiB9OwogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wYXJzZXJfdW5pdHRlc3QuY2MKaW5kZXggMTU2YzBkYy4uMWQ2MjNkZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGFyc2VyX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BhcnNlcl91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsNiArMzIsMTAgQEAKIC8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQogLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgogCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8bWFwPgpAQCAtNDQsOSArNDgsMTAgQEAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KQEAgLTE3Myw5ICsxNzgsOSBAQAogICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yXzsKICAgRGVzY3JpcHRvclBvb2wgcG9vbF87CiAKLSAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbT4gcmF3X2lucHV0XzsKLSAgc2NvcGVkX3B0cjxpbzo6VG9rZW5pemVyPiBpbnB1dF87Ci0gIHNjb3BlZF9wdHI8UGFyc2VyPiBwYXJzZXJfOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpaZXJvQ29weUlucHV0U3RyZWFtPiByYXdfaW5wdXRfOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGlvOjpUb2tlbml6ZXI+IGlucHV0XzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxQYXJzZXI+IHBhcnNlcl87CiAgIGJvb2wgcmVxdWlyZV9zeW50YXhfaWRlbnRpZmllcl87CiB9OwogCkBAIC0yMTEsMTAgKzIxNiw0NSBAQAogICBFWFBFQ1RfRVEoIjE6OTogRXhwZWN0ZWQgc3ludGF4IGlkZW50aWZpZXIuXG4iLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKIH0KIAorVEVTVF9GKFBhcnNlclRlc3QsIFdhcm5JZlN5bnRheElkZW50aWZpZXJPbW1pdHRlZCkgeworICBTZXR1cFBhcnNlcigibWVzc2FnZSBBIHt9Iik7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZTsKKyAgQ2FwdHVyZVRlc3RTdGRlcnIoKTsKKyAgRVhQRUNUX1RSVUUocGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmZmlsZSkpOworICBFWFBFQ1RfVFJVRSgKKyAgICAgIEdldENhcHR1cmVkVGVzdFN0ZGVycigpLmZpbmQoIk5vIHN5bnRheCBzcGVjaWZpZWQiKSAhPSBzdHJpbmc6Om5wb3MpOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHR5cGVkZWYgUGFyc2VyVGVzdCBQYXJzZU1lc3NhZ2VUZXN0OwogCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgSWdub3JlQk9NKSB7CisgIGNoYXIgaW5wdXRbXSA9ICIgICBtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAgICIgIHJlcXVpcmVkIGludDMyIGZvbyA9IDE7XG4iCisgICAgICAifVxuIjsKKyAgLy8gU2V0IFVURi04IEJPTS4KKyAgaW5wdXRbMF0gPSAoY2hhcikweEVGOworICBpbnB1dFsxXSA9IChjaGFyKTB4QkI7CisgIGlucHV0WzJdID0gKGNoYXIpMHhCRjsKKyAgRXhwZWN0UGFyc2VzVG8oaW5wdXQsCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgQk9NRXJyb3IpIHsKKyAgY2hhciBpbnB1dFtdID0gIiAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTtcbiIKKyAgICAgICJ9XG4iOworICBpbnB1dFswXSA9IChjaGFyKTB4RUY7CisgIEV4cGVjdEhhc0Vycm9ycyhpbnB1dCwKKyAgICAgICAgICAgICAgICAgICIwOjE6IFByb3RvIGZpbGUgc3RhcnRzIHdpdGggMHhFRiBidXQgbm90IFVURi04IEJPTS4gIgorICAgICAgICAgICAgICAgICAgIk9ubHkgVVRGLTggaXMgYWNjZXB0ZWQgZm9yIHByb3RvIGZpbGUuXG4iCisgICAgICAgICAgICAgICAgICAiMDowOiBFeHBlY3RlZCB0b3AtbGV2ZWwgc3RhdGVtZW50IChlLmcuIFwibWVzc2FnZVwiKS5cbiIpOworfQorCiBURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgU2ltcGxlTWVzc2FnZSkgewogICBFeHBlY3RQYXJzZXNUbygKICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCkBAIC0yNDgsNiArMjg4LDcgQEAKICAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgogICAgICJ9XG4iLAogCisgICAgInN5bnRheDogJ3Byb3RvMicgIgogICAgICJtZXNzYWdlX3R5cGUgeyIKICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCiAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCkBAIC0yNjMsNiArMzA0LDcgQEAKICAgICAiICByZXF1aXJlZCBpbnQzMiBmb28gPSAxO1xuIgogICAgICJ9XG4iLAogCisgICAgInN5bnRheDogJ3Byb3RvMicgIgogICAgICJtZXNzYWdlX3R5cGUgeyIKICAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCiAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCkBAIC0zNjMsMzkgKzQwNSw2NyBAQAogI2RlZmluZSBFVEMgIm5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9SRVFVSVJFRCBudW1iZXI6MSIKICAgICAibWVzc2FnZV90eXBlIHsiCiAgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDMyICAgZGVmYXVsdF92YWx1ZTpcIjFcIiAgICAgICAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiLTJcIiAgICAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQ2NCAgIGRlZmF1bHRfdmFsdWU6XCIzXCIgICAgICAgICAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIi00XCIgICAgICAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfVUlOVDMyICBkZWZhdWx0X3ZhbHVlOlwiNVwiICAgICAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9VSU5UNjQgIGRlZmF1bHRfdmFsdWU6XCI2XCIgICAgICAgICAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0ZMT0FUICAgZGVmYXVsdF92YWx1ZTpcIjcuNVwiICAgICAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRkxPQVQgICBkZWZhdWx0X3ZhbHVlOlwiLTguNVwiICAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9GTE9BVCAgIGRlZmF1bHRfdmFsdWU6XCI5XCIgICAgICAgICAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIjEwLjVcIiAgICAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiLTExLjVcIiAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCIxMlwiICAgICAgICAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcImluZlwiICAgICAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiLWluZlwiICAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCJuYW5cIiAgICAgICAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1NUUklORyAgZGVmYXVsdF92YWx1ZTpcIjEzXFwwMDFcIiAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfU1RSSU5HICBkZWZhdWx0X3ZhbHVlOlwiYWJjXCIgICAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9CWVRFUyAgIGRlZmF1bHRfdmFsdWU6XCIxNFxcXFwwMDJcIiAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0JZVEVTICAgZGVmYXVsdF92YWx1ZTpcImFiY1wiICAgICAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfQk9PTCAgICBkZWZhdWx0X3ZhbHVlOlwidHJ1ZVwiICAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGVfbmFtZTpcIkZvb1wiIGRlZmF1bHRfdmFsdWU6XCJGT09cIiAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDMyICAgZGVmYXVsdF92YWx1ZTpcIjFcIiAgICAgICAgICIgRVRDICIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCItMlwiICAgICAgICAiIEVUQyAiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiM1wiICAgICAgICAgIiBFVEMgIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIi00XCIgICAgICAgICIgRVRDICIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9VSU5UMzIgIGRlZmF1bHRfdmFsdWU6XCI1XCIgICAgICAgICAiIEVUQyAiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfVUlOVDY0ICBkZWZhdWx0X3ZhbHVlOlwiNlwiICAgICAgICAgIiBFVEMgIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0ZMT0FUICAgZGVmYXVsdF92YWx1ZTpcIjcuNVwiICAgICAgICIgRVRDICIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9GTE9BVCAgIGRlZmF1bHRfdmFsdWU6XCItOC41XCIgICAgICAiIEVUQyAiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRkxPQVQgICBkZWZhdWx0X3ZhbHVlOlwiOVwiICAgICAgICAgIiBFVEMgIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcIjEwLjVcIiAgICAgICIgRVRDICIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCItMTEuNVwiICAgICAiIEVUQyAiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiMTJcIiAgICAgICAgIiBFVEMgIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0RPVUJMRSAgZGVmYXVsdF92YWx1ZTpcImluZlwiICAgICAgICIgRVRDICIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9ET1VCTEUgIGRlZmF1bHRfdmFsdWU6XCItaW5mXCIgICAgICAiIEVUQyAiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwibmFuXCIgICAgICAgIiBFVEMgIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX1NUUklORyAgZGVmYXVsdF92YWx1ZTpcIjEzXFwwMDFcIiAgICIgRVRDICIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9TVFJJTkcgIGRlZmF1bHRfdmFsdWU6XCJhYmNcIiAgICAgICAiIEVUQyAiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfQllURVMgICBkZWZhdWx0X3ZhbHVlOlwiMTRcXFxcMDAyXCIgIiBFVEMgIiB9IgorICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0JZVEVTICAgZGVmYXVsdF92YWx1ZTpcImFiY1wiICAgICAgICIgRVRDICIgfSIKKyAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9CT09MICAgIGRlZmF1bHRfdmFsdWU6XCJ0cnVlXCIgICAgICAiIEVUQyAiIH0iCisgICAgIiAgZmllbGQgeyB0eXBlX25hbWU6XCJGb29cIiBkZWZhdWx0X3ZhbHVlOlwiRk9PXCIgICAgICAgIiBFVEMgIiB9IgogCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiMjE0NzQ4MzY0N1wiICAgICAgICAgICAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDMyICAgZGVmYXVsdF92YWx1ZTpcIi0yMTQ3NDgzNjQ4XCIgICAgICAgICAgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9VSU5UMzIgIGRlZmF1bHRfdmFsdWU6XCI0Mjk0OTY3Mjk1XCIgICAgICAgICAgICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiOTIyMzM3MjAzNjg1NDc3NTgwN1wiICAiRVRDIiB9IgotICAgICIgIGZpZWxkIHsgdHlwZTpUWVBFX0lOVDY0ICAgZGVmYXVsdF92YWx1ZTpcIi05MjIzMzcyMDM2ODU0Nzc1ODA4XCIgIkVUQyIgfSIKLSAgICAiICBmaWVsZCB7IHR5cGU6VFlQRV9VSU5UNjQgIGRlZmF1bHRfdmFsdWU6XCIxODQ0Njc0NDA3MzcwOTU1MTYxNVwiICJFVEMiIH0iCi0gICAgIiAgZmllbGQgeyB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiNDM5ODFcIiAgICAgICAgICAgICAgICAiRVRDIiB9IgorICAgICIgIGZpZWxkIHsiCisgICAgIiAgICB0eXBlOlRZUEVfSU5UMzIgICBkZWZhdWx0X3ZhbHVlOlwiMjE0NzQ4MzY0N1wiICAgICAgICAgICAiIEVUQworICAgICIgIH0iCisgICAgIiAgZmllbGQgeyIKKyAgICAiICAgIHR5cGU6VFlQRV9JTlQzMiAgIGRlZmF1bHRfdmFsdWU6XCItMjE0NzQ4MzY0OFwiICAgICAgICAgICIgRVRDCisgICAgIiAgfSIKKyAgICAiICBmaWVsZCB7IgorICAgICIgICAgdHlwZTpUWVBFX1VJTlQzMiAgZGVmYXVsdF92YWx1ZTpcIjQyOTQ5NjcyOTVcIiAgICAgICAgICAgIiBFVEMKKyAgICAiICB9IgorICAgICIgIGZpZWxkIHsiCisgICAgIiAgICB0eXBlOlRZUEVfSU5UNjQgICBkZWZhdWx0X3ZhbHVlOlwiOTIyMzM3MjAzNjg1NDc3NTgwN1wiICAiIEVUQworICAgICIgIH0iCisgICAgIiAgZmllbGQgeyIKKyAgICAiICAgIHR5cGU6VFlQRV9JTlQ2NCAgIGRlZmF1bHRfdmFsdWU6XCItOTIyMzM3MjAzNjg1NDc3NTgwOFwiICIgRVRDCisgICAgIiAgfSIKKyAgICAiICBmaWVsZCB7IgorICAgICIgICAgdHlwZTpUWVBFX1VJTlQ2NCAgZGVmYXVsdF92YWx1ZTpcIjE4NDQ2NzQ0MDczNzA5NTUxNjE1XCIgIiBFVEMKKyAgICAiICB9IgorICAgICIgIGZpZWxkIHsiCisgICAgIiAgICB0eXBlOlRZUEVfRE9VQkxFICBkZWZhdWx0X3ZhbHVlOlwiNDM5ODFcIiAgICAgICAgICAgICAgICAiIEVUQworICAgICIgIH0iCiAgICAgIn0iKTsKICN1bmRlZiBFVEMKIH0KIAorVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEZpZWxkSnNvbk5hbWUpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtqc29uX25hbWUgPSBcIkB0eXBlXCJdO1xuIgorICAgICJ9XG4iLAorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQge1xuIgorICAgICIgICAgbmFtZTogXCJmb29cIiBsYWJlbDogTEFCRUxfT1BUSU9OQUwgdHlwZTogVFlQRV9TVFJJTkcgbnVtYmVyOiAxIgorICAgICIgICAganNvbl9uYW1lOiBcIkB0eXBlXCJcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIpOworfQorCiBURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgRmllbGRPcHRpb25zKSB7CiAgIEV4cGVjdFBhcnNlc1RvKAogICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKQEAgLTQzNSw2ICs1MDUsMTE3IEBACiAgICAgIn0iKTsKIH0KIAorVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIE9uZW9mKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvbmVvZiBmb28ge1xuIgorICAgICIgICAgaW50MzIgYSA9IDE7XG4iCisgICAgIiAgICBzdHJpbmcgYiA9IDI7XG4iCisgICAgIiAgICBUZXN0TWVzc2FnZSBjID0gMztcbiIKKyAgICAiICAgIGdyb3VwIEQgPSA0IHsgb3B0aW9uYWwgaW50MzIgaSA9IDU7IH1cbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImFcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgIgorICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MCB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImJcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfU1RSSU5HIG51bWJlcjoyICIKKyAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OjAgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJjXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiAiCisgICAgIiAgICAgICAgICBudW1iZXI6MyBvbmVvZl9pbmRleDowIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZFwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9HUk9VUCAiCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJEXCIgbnVtYmVyOjQgb25lb2ZfaW5kZXg6MCB9IgorICAgICIgIG9uZW9mX2RlY2wgeyIKKyAgICAiICAgIG5hbWU6IFwiZm9vXCIiCisgICAgIiAgfSIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IgorICAgICIgICAgbmFtZTogXCJEXCIiCisgICAgIiAgICBmaWVsZCB7IG5hbWU6XCJpXCIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjo1IH0iCisgICAgIiAgfSIKKyAgICAifSIpOworfQorCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTXVsdGlwbGVPbmVvZnMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9uZW9mIGZvbyB7XG4iCisgICAgIiAgICBpbnQzMiBhID0gMTtcbiIKKyAgICAiICAgIHN0cmluZyBiID0gMjtcbiIKKyAgICAiICB9XG4iCisgICAgIiAgb25lb2YgYmFyIHtcbiIKKyAgICAiICAgIGludDMyIGMgPSAzO1xuIgorICAgICIgICAgc3RyaW5nIGQgPSA0O1xuIgorICAgICIgIH1cbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiYVwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiBudW1iZXI6MSAiCisgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDowIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwiYlwiIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9TVFJJTkcgbnVtYmVyOjIgIgorICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MCB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImNcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjMgIgorICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MSB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImRcIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfU1RSSU5HIG51bWJlcjo0ICIKKyAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OjEgfSIKKyAgICAiICBvbmVvZl9kZWNsIHsiCisgICAgIiAgICBuYW1lOiBcImZvb1wiIgorICAgICIgIH0iCisgICAgIiAgb25lb2ZfZGVjbCB7IgorICAgICIgICAgbmFtZTogXCJiYXJcIiIKKyAgICAiICB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBNYXBzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBtYXA8aW50MzIsIHN0cmluZz4gcHJpbWl0aXZlX3R5cGVfbWFwID0gMTtcbiIKKyAgICAiICBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBjb21wb3NpdGVfdHlwZV9tYXAgPSAyO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IgorICAgICIgICAgbmFtZTogXCJQcmltaXRpdmVUeXBlTWFwRW50cnlcIiIKKyAgICAiICAgIGZpZWxkIHsgIgorICAgICIgICAgICAgbmFtZTogXCJrZXlcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCisgICAgIiAgICAgICB0eXBlOlRZUEVfSU5UMzIiCisgICAgIiAgICB9IgorICAgICIgICAgZmllbGQgeyAiCisgICAgIiAgICAgICBuYW1lOiBcInZhbHVlXCIgbnVtYmVyOiAyIGxhYmVsOkxBQkVMX09QVElPTkFMIgorICAgICIgICAgICAgdHlwZTpUWVBFX1NUUklORyIKKyAgICAiICAgIH0iCisgICAgIiAgICBvcHRpb25zIHsgbWFwX2VudHJ5OiB0cnVlIH0iCisgICAgIiAgfSIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IgorICAgICIgICAgbmFtZTogXCJDb21wb3NpdGVUeXBlTWFwRW50cnlcIiIKKyAgICAiICAgIGZpZWxkIHsgIgorICAgICIgICAgICAgbmFtZTogXCJrZXlcIiBudW1iZXI6IDEgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCisgICAgIiAgICAgICB0eXBlX25hbWU6IFwiS2V5VHlwZVwiIgorICAgICIgICAgfSIKKyAgICAiICAgIGZpZWxkIHsgIgorICAgICIgICAgICAgbmFtZTogXCJ2YWx1ZVwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCIKKyAgICAiICAgICAgIHR5cGVfbmFtZTogXCJWYWx1ZVR5cGVcIiIKKyAgICAiICAgIH0iCisgICAgIiAgICBvcHRpb25zIHsgbWFwX2VudHJ5OiB0cnVlIH0iCisgICAgIiAgfSIKKyAgICAiICBmaWVsZCB7IgorICAgICIgICAgbmFtZTogXCJwcmltaXRpdmVfdHlwZV9tYXBcIiIKKyAgICAiICAgIGxhYmVsOiBMQUJFTF9SRVBFQVRFRCIKKyAgICAiICAgIHR5cGVfbmFtZTogXCJQcmltaXRpdmVUeXBlTWFwRW50cnlcIiIKKyAgICAiICAgIG51bWJlcjogMSIKKyAgICAiICB9IgorICAgICIgIGZpZWxkIHsiCisgICAgIiAgICBuYW1lOiBcImNvbXBvc2l0ZV90eXBlX21hcFwiIgorICAgICIgICAgbGFiZWw6IExBQkVMX1JFUEVBVEVEIgorICAgICIgICAgdHlwZV9uYW1lOiBcIkNvbXBvc2l0ZVR5cGVNYXBFbnRyeVwiIgorICAgICIgICAgbnVtYmVyOiAyIgorICAgICIgIH0iCisgICAgIn0iKTsKK30KKwogVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEdyb3VwKSB7CiAgIEV4cGVjdFBhcnNlc1RvKAogICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKQEAgLTQ3OSw2ICs2NjAsMzYgQEAKICAgICAifSIpOwogfQogCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgUmVzZXJ2ZWRSYW5nZSkgeworICBFeHBlY3RQYXJzZXNUbygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgcmVxdWlyZWQgaW50MzIgZm9vID0gMTtcbiIKKyAgICAiICByZXNlcnZlZCAyLCAxNSwgOSB0byAxMSwgMztcbiIKKyAgICAifVxuIiwKKworICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIlRlc3RNZXNzYWdlXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbGFiZWw6TEFCRUxfUkVRVUlSRUQgdHlwZTpUWVBFX0lOVDMyIG51bWJlcjoxIH0iCisgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDoyICAgZW5kOjMgICAgICAgICB9IgorICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6MTUgIGVuZDoxNiAgICAgICAgfSIKKyAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OjkgICBlbmQ6MTIgICAgICAgIH0iCisgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDozICAgZW5kOjQgICAgICAgICB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBSZXNlcnZlZE5hbWVzKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICByZXNlcnZlZCBcImZvb1wiLCBcImJhclwiO1xuIgorICAgICJ9XG4iLAorCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICByZXNlcnZlZF9uYW1lOiBcImZvb1wiIgorICAgICIgIHJlc2VydmVkX25hbWU6IFwiYmFyXCIiCisgICAgIn0iKTsKK30KKwogVEVTVF9GKFBhcnNlTWVzc2FnZVRlc3QsIEV4dGVuc2lvblJhbmdlKSB7CiAgIEV4cGVjdFBhcnNlc1RvKAogICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKQEAgLTUwOSw2ICs3MjAsMzEgQEAKICAgICAifSIpOwogfQogCitURVNUX0YoUGFyc2VNZXNzYWdlVGVzdCwgTGFyZ2VyTWF4Rm9yTWVzc2FnZVNldFdpcmVGb3JtYXRNZXNzYWdlcykgeworICAvLyBNZXNzYWdlcyB1c2luZyB0aGUgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgb3B0aW9uIGNhbiBhY2NlcHQgbGFyZ2VyCisgIC8vIGV4dGVuc2lvbiBudW1iZXJzLCBhcyB0aGUgbnVtYmVycyBhcmUgbm90IGVuY29kZWQgYXMgaW50MzIgZmllbGQgdmFsdWVzCisgIC8vIHJhdGhlciB0aGFuIHRhZ3MuCisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBleHRlbnNpb25zIDQgdG8gbWF4O1xuIgorICAgICIgIG9wdGlvbiBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IHRydWU7XG4iCisgICAgIn1cbiIsCisKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJUZXN0TWVzc2FnZVwiIgorICAgICIgICAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6NCBlbmQ6IDB4N2ZmZmZmZmYgfSIKKyAgICAiICBvcHRpb25zIHtcbiIKKyAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgXG4iCisgICAgIiAgICAgIG5hbWUge1xuIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJtZXNzYWdlX3NldF93aXJlX2Zvcm1hdFwiXG4iCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZVxuIgorICAgICIgICAgICB9XG4iCisgICAgIiAgICAgIGlkZW50aWZpZXJfdmFsdWU6IFwidHJ1ZVwiXG4iCisgICAgIiAgICB9XG4iCisgICAgIiAgfVxuIgorICAgICJ9Iik7Cit9CisKIFRFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBFeHRlbnNpb25zKSB7CiAgIEV4cGVjdFBhcnNlc1RvKAogICAgICJleHRlbmQgRXh0ZW5kZWUxIHsgb3B0aW9uYWwgaW50MzIgZm9vID0gMTI7IH1cbiIKQEAgLTU0OSw2ICs3ODUsMTkgQEAKICAgICAiICAgICAgICAgICAgdHlwZV9uYW1lOlwiVGVzdE1lc3NhZ2VcIiBleHRlbmRlZTogXCJFeHRlbmRlZTFcIiB9Iik7CiB9CiAKK1RFU1RfRihQYXJzZU1lc3NhZ2VUZXN0LCBPcHRpb25hbExhYmVsUHJvdG8zKSB7CisgIEV4cGVjdFBhcnNlc1RvKAorICAgICJzeW50YXggPSBcInByb3RvM1wiO1xuIgorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBpbnQzMiBmb28gPSAxO1xuIgorICAgICJ9XG4iLAorCisgICAgInN5bnRheDogXCJwcm90bzNcIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiVGVzdE1lc3NhZ2VcIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgbnVtYmVyOjEgfSB9Iik7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogdHlwZWRlZiBQYXJzZXJUZXN0IFBhcnNlRW51bVRlc3Q7CkBAIC01NzEsNiArODIwLDEwIEBACiAgICAgIiAgRk9PID0gMTM7XG4iCiAgICAgIiAgQkFSID0gLTEwO1xuIgogICAgICIgIEJBWiA9IDUwMDtcbiIKKyAgICAiICBIRVhfTUFYID0gMHg3RkZGRkZGRjtcbiIKKyAgICAiICBIRVhfTUlOID0gLTB4ODAwMDAwMDA7XG4iCisgICAgIiAgSU5UX01BWCA9IDIxNDc0ODM2NDc7XG4iCisgICAgIiAgSU5UX01JTiA9IC0yMTQ3NDgzNjQ4O1xuIgogICAgICJ9XG4iLAogCiAgICAgImVudW1fdHlwZSB7IgpAQCAtNTc4LDYgKzgzMSwxMCBAQAogICAgICIgIHZhbHVlIHsgbmFtZTpcIkZPT1wiIG51bWJlcjoxMyB9IgogICAgICIgIHZhbHVlIHsgbmFtZTpcIkJBUlwiIG51bWJlcjotMTAgfSIKICAgICAiICB2YWx1ZSB7IG5hbWU6XCJCQVpcIiBudW1iZXI6NTAwIH0iCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiSEVYX01BWFwiIG51bWJlcjoyMTQ3NDgzNjQ3IH0iCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiSEVYX01JTlwiIG51bWJlcjotMjE0NzQ4MzY0OCB9IgorICAgICIgIHZhbHVlIHsgbmFtZTpcIklOVF9NQVhcIiBudW1iZXI6MjE0NzQ4MzY0NyB9IgorICAgICIgIHZhbHVlIHsgbmFtZTpcIklOVF9NSU5cIiBudW1iZXI6LTIxNDc0ODM2NDggfSIKICAgICAifSIpOwogfQogCkBAIC02MzEsNyArODg4LDcgQEAKICAgICAifSIpOwogfQogCi1URVNUX0YoUGFyc2VTZXJ2aWNlVGVzdCwgTWV0aG9kcykgeworVEVTVF9GKFBhcnNlU2VydmljZVRlc3QsIE1ldGhvZHNBbmRTdHJlYW1zKSB7CiAgIEV4cGVjdFBhcnNlc1RvKAogICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKICAgICAiICBycGMgRm9vKEluMSkgcmV0dXJucyAoT3V0MSk7XG4iCkBAIC02NDcsNiArOTA0LDggQEAKICAgICAifSIpOwogfQogCisKKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gaW1wb3J0cyBhbmQgcGFja2FnZXMKIApAQCAtNjY4LDYgKzkyNywyMCBAQAogICAgICJkZXBlbmRlbmN5OiBcImJhei5wcm90b1wiIik7CiB9CiAKK1RFU1RfRihQYXJzZU1pc2NUZXN0LCBQYXJzZVB1YmxpY0ltcG9ydHMpIHsKKyAgRXhwZWN0UGFyc2VzVG8oCisgICAgImltcG9ydCBcImZvby5wcm90b1wiO1xuIgorICAgICJpbXBvcnQgcHVibGljIFwiYmFyLnByb3RvXCI7XG4iCisgICAgImltcG9ydCBcImJhei5wcm90b1wiO1xuIgorICAgICJpbXBvcnQgcHVibGljIFwicXV4LnByb3RvXCI7XG4iLAorICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhci5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcImJhei5wcm90b1wiIgorICAgICJkZXBlbmRlbmN5OiBcInF1eC5wcm90b1wiIgorICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMSAiCisgICAgInB1YmxpY19kZXBlbmRlbmN5OiAzICIpOworfQorCiBURVNUX0YoUGFyc2VNaXNjVGVzdCwgUGFyc2VQYWNrYWdlKSB7CiAgIEV4cGVjdFBhcnNlc1RvKAogICAgICJwYWNrYWdlIGZvby5iYXIuYmF6O1xuIiwKQEAgLTcxMyw5ICs5ODYsOSBAQAogCiBURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1pc3NpbmdTeW50YXhJZGVudGlmaWVyKSB7CiAgIHJlcXVpcmVfc3ludGF4X2lkZW50aWZpZXJfID0gdHJ1ZTsKLSAgRXhwZWN0SGFzRWFybHlFeGl0RXJyb3JzKAotICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHt9IiwKLSAgICAiMDowOiBGaWxlIG11c3QgYmVnaW4gd2l0aCAnc3ludGF4ID0gXCJwcm90bzJcIjsnLlxuIik7CisgIEV4cGVjdEhhc0Vhcmx5RXhpdEVycm9ycygibWVzc2FnZSBUZXN0TWVzc2FnZSB7fSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiMDowOiBGaWxlIG11c3QgYmVnaW4gd2l0aCBhIHN5bnRheCBzdGF0ZW1lbnQsIGUuZy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIidzeW50YXggPSBcInByb3RvMlwiOycuXG4iKTsKICAgRVhQRUNUX0VRKCIiLCBwYXJzZXJfLT5HZXRTeW50YXhJZGVudGlmaWVyKCkpOwogfQogCkBAIC03MjMsNyArOTk2LDcgQEAKICAgRXhwZWN0SGFzRWFybHlFeGl0RXJyb3JzKAogICAgICJzeW50YXggPSBcIm5vX3N1Y2hfc3ludGF4XCI7IiwKICAgICAiMDo5OiBVbnJlY29nbml6ZWQgc3ludGF4IGlkZW50aWZpZXIgXCJub19zdWNoX3N5bnRheFwiLiAgVGhpcyBwYXJzZXIgIgotICAgICAgIm9ubHkgcmVjb2duaXplcyBcInByb3RvMlwiLlxuIik7CisgICAgICAib25seSByZWNvZ25pemVzIFwicHJvdG8yXCIgYW5kIFwicHJvdG8zXCIuXG4iKTsKICAgRVhQRUNUX0VRKCJub19zdWNoX3N5bnRheCIsIHBhcnNlcl8tPkdldFN5bnRheElkZW50aWZpZXIoKSk7CiB9CiAKQEAgLTgyMiw3ICsxMDk1LDcgQEAKICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCiAgICAgIiAgb3B0aW9uYWwgdWludDMyIGZvbyA9IDEgW2RlZmF1bHQ9dHJ1ZV07XG4iCiAgICAgIn1cbiIsCi0gICAgIjE6MzU6IEV4cGVjdGVkIGludGVnZXIuXG4iKTsKKyAgICAiMTozNTogRXhwZWN0ZWQgaW50ZWdlciBmb3IgZmllbGQgZGVmYXVsdCB2YWx1ZS5cbiIpOwogfQogCiBURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU5vdEJvb2xlYW4pIHsKQEAgLTgzOCw3ICsxMTExLDcgQEAKICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCiAgICAgIiAgb3B0aW9uYWwgc3RyaW5nIGZvbyA9IDEgW2RlZmF1bHQ9MV07XG4iCiAgICAgIn1cbiIsCi0gICAgIjE6MzU6IEV4cGVjdGVkIHN0cmluZy5cbiIpOworICAgICIxOjM1OiBFeHBlY3RlZCBzdHJpbmcgZm9yIGZpZWxkIGRlZmF1bHQgdmFsdWUuXG4iKTsKIH0KIAogVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVVbnNpZ25lZE5lZ2F0aXZlKSB7CkBAIC04NjcsMTIgKzExNDAsNjUgQEAKICAgICAiNjozNjogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iKTsKIH0KIAorVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBKc29uTmFtZU5vdFN0cmluZykgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIHN0cmluZyBmb28gPSAxIFtqc29uX25hbWU9MV07XG4iCisgICAgIn1cbiIsCisgICAgIjE6Mzc6IEV4cGVjdGVkIHN0cmluZyBmb3IgSlNPTiBuYW1lLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRHVwbGljYXRlSnNvbk5hbWUpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbanNvbl9uYW1lPVwiYVwiLGpzb25fbmFtZT1cImJcIl07XG4iCisgICAgIn1cbiIsCisgICAgIjE6NDE6IEFscmVhZHkgc2V0IG9wdGlvbiBcImpzb25fbmFtZVwiLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgRW51bVZhbHVlT3V0T2ZSYW5nZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgImVudW0gVGVzdEVudW0ge1xuIgorICAgICIgIEhFWF9UT09fQklHICAgPSAgMHg4MDAwMDAwMDtcbiIKKyAgICAiICBIRVhfVE9PX1NNQUxMID0gLTB4ODAwMDAwMDE7XG4iCisgICAgIiAgSU5UX1RPT19CSUcgICA9ICAyMTQ3NDgzNjQ4O1xuIgorICAgICIgIElOVF9UT09fU01BTEwgPSAtMjE0NzQ4MzY0OTtcbiIKKyAgICAifVxuIiwKKyAgICAiMToxOTogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iCisgICAgIjI6MTk6IEludGVnZXIgb3V0IG9mIHJhbmdlLlxuIgorICAgICIzOjE5OiBJbnRlZ2VyIG91dCBvZiByYW5nZS5cbiIKKyAgICAiNDoxOTogSW50ZWdlciBvdXQgb2YgcmFuZ2UuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFbnVtQWxsb3dBbGlhc0ZhbHNlKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAiZW51bSBGb28ge1xuIgorICAgICIgIG9wdGlvbiBhbGxvd19hbGlhcyA9IGZhbHNlO1xuIgorICAgICIgIEJBUiA9IDE7XG4iCisgICAgIiAgQkFaID0gMjtcbiIKKyAgICAifVxuIiwKKyAgICAiNTowOiBcIkZvb1wiIGRlY2xhcmVzICdvcHRpb24gYWxsb3dfYWxpYXMgPSBmYWxzZTsnIHdoaWNoIGhhcyBubyBlZmZlY3QuICIKKyAgICAiUGxlYXNlIHJlbW92ZSB0aGUgZGVjbGFyYXRpb24uXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBVbm5lY2Vzc2FyeUVudW1BbGxvd0FsaWFzKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAiZW51bSBGb28ge1xuIgorICAgICIgIG9wdGlvbiBhbGxvd19hbGlhcyA9IHRydWU7XG4iCisgICAgIiAgQkFSID0gMTtcbiIKKyAgICAiICBCQVogPSAyO1xuIgorICAgICJ9XG4iLAorICAgICI1OjA6IFwiRm9vXCIgZGVjbGFyZXMgc3VwcG9ydCBmb3IgZW51bSBhbGlhc2VzIGJ1dCBubyBlbnVtIHZhbHVlcyBzaGFyZSAiCisgICAgImZpZWxkIG51bWJlcnMuIFBsZWFzZSByZW1vdmUgdGhlIHVubmVjZXNzYXJ5ICdvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOycgIgorICAgICJkZWNsYXJhdGlvbi5cbiIpOworfQorCiBURVNUX0YoUGFyc2VFcnJvclRlc3QsIERlZmF1bHRWYWx1ZU1pc3NpbmcpIHsKICAgRXhwZWN0SGFzRXJyb3JzKAogICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKICAgICAiICBvcHRpb25hbCB1aW50MzIgZm9vID0gMSBbZGVmYXVsdD1dO1xuIgogICAgICJ9XG4iLAotICAgICIxOjM1OiBFeHBlY3RlZCBpbnRlZ2VyLlxuIik7CisgICAgIjE6MzU6IEV4cGVjdGVkIGludGVnZXIgZm9yIGZpZWxkIGRlZmF1bHQgdmFsdWUuXG4iKTsKIH0KIAogVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBEZWZhdWx0VmFsdWVGb3JHcm91cCkgewpAQCAtODkxLDYgKzEyMTcsNzYgQEAKICAgICAiMTozNzogQWxyZWFkeSBzZXQgb3B0aW9uIFwiZGVmYXVsdFwiLlxuIik7CiB9CiAKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgTWlzc2luZ09uZW9mTmFtZSkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9uZW9mIHtcbiIKKyAgICAiICAgIGludDMyIGJhciA9IDE7XG4iCisgICAgIiAgfVxuIgorICAgICJ9XG4iLAorICAgICIxOjg6IEV4cGVjdGVkIG9uZW9mIG5hbWUuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBMYWJlbEluT25lb2YpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBvbmVvZiBmb28ge1xuIgorICAgICIgICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMTtcbiIKKyAgICAiICB9XG4iCisgICAgIn1cbiIsCisgICAgIjI6NDogRmllbGRzIGluIG9uZW9mcyBtdXN0IG5vdCBoYXZlIGxhYmVscyAocmVxdWlyZWQgLyBvcHRpb25hbCAiCisgICAgICAiLyByZXBlYXRlZCkuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBNYXBJbk9uZW9mKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgIiAgb25lb2YgZm9vIHtcbiIKKyAgICAiICAgIG1hcDxpbnQzMiwgaW50MzI+IGZvb19tYXAgPSAxO1xuIgorICAgICIgICAgbWFwIG1lc3NhZ2VfZmllbGQgPSAyO1xuIiAgLy8gYSBub3JtYWwgbWVzc2FnZSBmaWVsZCBpcyBPSworICAgICIgIH1cbiIKKyAgICAifVxuIiwKKyAgICAiMjo3OiBNYXAgZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBvbmVvZnMuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBMYWJlbEZvck1hcCkgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgorICAgICIgIG9wdGlvbmFsIG1hcDxpbnQzMiwgaW50MzI+IGludF9tYXAgPSAxO1xuIgorICAgICIgIHJlcXVpcmVkIG1hcDxpbnQzMiwgaW50MzI+IGludF9tYXAyID0gMjtcbiIKKyAgICAiICByZXBlYXRlZCBtYXA8aW50MzIsIGludDMyPiBpbnRfbWFwMyA9IDM7XG4iCisgICAgIiAgb3B0aW9uYWwgbWFwIG1hcF9tZXNzYWdlID0gNDtcbiIgIC8vIGEgbm9ybWFsIG1lc3NhZ2UgZmllbGQgaXMgT0sKKyAgICAifVxuIiwKKyAgICAiMToxNDogRmllbGQgbGFiZWxzIChyZXF1aXJlZC9vcHRpb25hbC9yZXBlYXRlZCkgYXJlIG5vdCBhbGxvd2VkIG9uIG1hcCAiCisgICAgImZpZWxkcy5cbiIKKyAgICAiMjoxNDogRmllbGQgbGFiZWxzIChyZXF1aXJlZC9vcHRpb25hbC9yZXBlYXRlZCkgYXJlIG5vdCBhbGxvd2VkIG9uIG1hcCAiCisgICAgImZpZWxkcy5cbiIKKyAgICAiMzoxNDogRmllbGQgbGFiZWxzIChyZXF1aXJlZC9vcHRpb25hbC9yZXBlYXRlZCkgYXJlIG5vdCBhbGxvd2VkIG9uIG1hcCAiCisgICAgImZpZWxkcy5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIE1hbGZvcm1lZE1hcHMpIHsKKyAgRXhwZWN0SGFzRXJyb3JzKAorICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlIHtcbiIKKyAgICAiICBtYXAgbWFwX21lc3NhZ2UgPSAxO1xuIiAgIC8vIGEgbm9ybWFsIG1lc3NhZ2UgZmllbGQgbGFja2luZyBsYWJlbAorICAgICIgIG1hcDxzdHJpbmc+IHN0cl9tYXAgPSAyO1xuIgorICAgICIgIG1hcDxzdHJpbmcsPiBzdHJfbWFwMiA9IDM7XG4iCisgICAgIiAgbWFwPCxzdHJpbmc+IHN0cl9tYXAzID0gNDtcbiIKKyAgICAiICBtYXA8PiBlbXB0eV9tYXAgPSA1O1xuIgorICAgICIgIG1hcDxzdHJpbmcsc3RyaW5nIHN0cl9tYXA2ID0gNjtcbiIKKyAgICAifSIKKyAgICAiZXh0ZW5kIFNvbWVNZXNzYWdlIHtcbiIKKyAgICAiICBtYXA8aW50MzIsIGludDMyPiBpbnRfbWFwID0gMTtcbiIKKyAgICAifSIsCisgICAgIjE6NjogRXhwZWN0ZWQgXCJyZXF1aXJlZFwiLCBcIm9wdGlvbmFsXCIsIG9yIFwicmVwZWF0ZWRcIi5cbiIKKyAgICAiMjoxMjogRXhwZWN0ZWQgXCIsXCIuXG4iCisgICAgIjM6MTM6IEV4cGVjdGVkIHR5cGUgbmFtZS5cbiIKKyAgICAiNDo2OiBFeHBlY3RlZCB0eXBlIG5hbWUuXG4iCisgICAgIjU6NjogRXhwZWN0ZWQgdHlwZSBuYW1lLlxuIgorICAgICI2OjIwOiBFeHBlY3RlZCBcIj5cIi5cbiIKKyAgICAiODo1OiBNYXAgZmllbGRzIGFyZSBub3QgYWxsb3dlZCB0byBiZSBleHRlbnNpb25zLlxuIik7Cit9CisKIFRFU1RfRihQYXJzZUVycm9yVGVzdCwgR3JvdXBOb3RDYXBpdGFsaXplZCkgewogICBFeHBlY3RIYXNFcnJvcnMoCiAgICAgIm1lc3NhZ2UgVGVzdE1lc3NhZ2Uge1xuIgpAQCAtOTQxLDYgKzEzMzcsMTggQEAKICAgICAgICIxOjA6IFVuZXhwZWN0ZWQgZW5kIG9mIHN0cmVhbSB3aGlsZSBwYXJzaW5nIGFnZ3JlZ2F0ZSB2YWx1ZS5cbiIpOwogfQogCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIEV4cGxpY2l0T3B0aW9uYWxMYWJlbFByb3RvMykgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgICAic3ludGF4ID0gJ3Byb3RvMyc7XG4iCisgICAgICAibWVzc2FnZSBUZXN0TWVzc2FnZSB7XG4iCisgICAgICAiICBvcHRpb25hbCBpbnQzMiBmb28gPSAxO1xuIgorICAgICAgIn1cbiIsCisgICAgICAiMjoxMTogRXhwbGljaXQgJ29wdGlvbmFsJyBsYWJlbHMgYXJlIGRpc2FsbG93ZWQgaW4gdGhlIFByb3RvMyBzeW50YXguICIKKyAgICAgICJUbyBkZWZpbmUgJ29wdGlvbmFsJyBmaWVsZHMgaW4gUHJvdG8zLCBzaW1wbHkgcmVtb3ZlIHRoZSAnb3B0aW9uYWwnICIKKyAgICAgICJsYWJlbCwgYXMgZmllbGRzIGFyZSAnb3B0aW9uYWwnIGJ5IGRlZmF1bHQuXG4iKTsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFbnVtIGVycm9ycwogCkBAIC05NTksNiArMTM2NywzMyBAQAogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSZXNlcnZlZCBmaWVsZCBudW1iZXIgZXJyb3JzCisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgUmVzZXJ2ZWRNYXhOb3RBbGxvd2VkKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIHJlc2VydmVkIDEwIHRvIG1heDtcbiIKKyAgICAifVxuIiwKKyAgICAiMToxNzogRXhwZWN0ZWQgaW50ZWdlci5cbiIpOworfQorCitURVNUX0YoUGFyc2VFcnJvclRlc3QsIFJlc2VydmVkTWl4TmFtZUFuZE51bWJlcikgeworICBFeHBlY3RIYXNFcnJvcnMoCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICByZXNlcnZlZCAxMCwgXCJmb29cIjtcbiIKKyAgICAifVxuIiwKKyAgICAiMToxNTogRXhwZWN0ZWQgZmllbGQgbnVtYmVyIHJhbmdlLlxuIik7Cit9CisKK1RFU1RfRihQYXJzZUVycm9yVGVzdCwgUmVzZXJ2ZWRNaXNzaW5nUXVvdGVzKSB7CisgIEV4cGVjdEhhc0Vycm9ycygKKyAgICAibWVzc2FnZSBGb28ge1xuIgorICAgICIgIHJlc2VydmVkIGZvbztcbiIKKyAgICAifVxuIiwKKyAgICAiMToxMTogRXhwZWN0ZWQgZmllbGQgbmFtZSBvciBudW1iZXIgcmFuZ2UuXG4iKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gU2VydmljZSBlcnJvcnMKIAogVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJblNlcnZpY2UpIHsKQEAgLTk3Niw2ICsxNDExLDcgQEAKICAgICAiMToyNjogRXhwZWN0ZWQgbWVzc2FnZSB0eXBlLlxuIik7CiB9CiAKKwogVEVTVF9GKFBhcnNlRXJyb3JUZXN0LCBFb2ZJbk1ldGhvZE9wdGlvbnMpIHsKICAgRXhwZWN0SGFzRXJyb3JzKAogICAgICJzZXJ2aWNlIFRlc3RTZXJ2aWNlIHtcbiIKQEAgLTk4NCw2ICsxNDIwLDcgQEAKICAgICAiMToyOTogUmVhY2hlZCBlbmQgb2YgaW5wdXQgaW4gc2VydmljZSBkZWZpbml0aW9uIChtaXNzaW5nICd9JykuXG4iKTsKIH0KIAorCiBURVNUX0YoUGFyc2VFcnJvclRlc3QsIFByaW1pdGl2ZU1ldGhvZElucHV0KSB7CiAgIEV4cGVjdEhhc0Vycm9ycygKICAgICAic2VydmljZSBUZXN0U2VydmljZSB7XG4iCkBAIC05OTIsNiArMTQyOSw3IEBACiAgICAgIjE6MTA6IEV4cGVjdGVkIG1lc3NhZ2UgdHlwZS5cbiIpOwogfQogCisKIFRFU1RfRihQYXJzZUVycm9yVGVzdCwgTWV0aG9kT3B0aW9uVHlwZUVycm9yKSB7CiAgIC8vIFRoaXMgdXNlZCB0byBjYXVzZSBhbiBpbmZpbml0ZSBsb29wLgogICBFeHBlY3RIYXNFcnJvcnMoCkBAIC0xMDAyLDYgKzE0NDAsNyBAQAogICAgICIyOjQ1OiBFeHBlY3RlZCBcIj1cIi5cbiIpOwogfQogCisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEltcG9ydCBhbmQgcGFja2FnZSBlcnJvcnMKIApAQCAtMTE1Nyw2ICsxNTk2LDcgQEAKICAgICAiMzo2OiBcIkJhclwiIGlzIGFscmVhZHkgZGVmaW5lZCBpbiBcIkZvb1wiLlxuIik7CiB9CiAKKwogVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIE1ldGhvZElucHV0VHlwZUVycm9yKSB7CiAgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCiAgICAgIm1lc3NhZ2UgQmF6IHt9XG4iCkBAIC0xMTY2LDYgKzE2MDYsNyBAQAogICAgICIyOjEwOiBcIlF1eFwiIGlzIG5vdCBkZWZpbmVkLlxuIik7CiB9CiAKKwogVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIE1ldGhvZE91dHB1dFR5cGVFcnJvcikgewogICBFeHBlY3RIYXNWYWxpZGF0aW9uRXJyb3JzKAogICAgICJtZXNzYWdlIEJheiB7fVxuIgpAQCAtMTE3NSwxNyArMTYxNiw5NCBAQAogICAgICIyOjIzOiBcIlF1eFwiIGlzIG5vdCBkZWZpbmVkLlxuIik7CiB9CiAKKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFJlc292bGVkVW5kZWZpbmVkRXJyb3IpIHsKKyAgLy8gQ3JlYXRlIGFub3RoZXIgZmlsZSB3aGljaCBkZWZpbmVzIHN5bWJvbCAiLmJhc2UuYmFyIi4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBvdGhlcl9maWxlOworICBvdGhlcl9maWxlLnNldF9uYW1lKCJiYXNlLnByb3RvIik7CisgIG90aGVyX2ZpbGUuc2V0X3BhY2thZ2UoImJhc2UiKTsKKyAgb3RoZXJfZmlsZS5hZGRfbWVzc2FnZV90eXBlKCktPnNldF9uYW1lKCJiYXIiKTsKKyAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKG90aGVyX2ZpbGUpICE9IE5VTEwpOworCisgIC8vIERlZmluZSAiZm9vLmJhc2UiIGFuZCB0cnkgImJhc2UuYmFyIi4KKyAgLy8gImJhc2UuYmFyIiBpcyByZXNvbHZlZCB0byAiZm9vLmJhc2UuYmFyIiB3aGljaCBpcyBub3QgZGVmaW5lZC4KKyAgRXhwZWN0SGFzVmFsaWRhdGlvbkVycm9ycygKKyAgICAicGFja2FnZSBmb28uYmFzZTtcbiIKKyAgICAiaW1wb3J0IFwiYmFzZS5wcm90b1wiO1xuIgorICAgICJtZXNzYWdlIHF1eCB7XG4iCisgICAgIiAgb3B0aW9uYWwgYmFzZS5iYXIgYmF6ID0gMTtcbiIKKyAgICAiICBvcHRpb25hbCAuYmFzZS5iYXIgcXV6ID0gMjtcbiIKKyAgICAifVxuIiwKKyAgICAiMzoxMTogXCJiYXNlLmJhclwiIGlzIHJlc29sdmVkIHRvIFwiZm9vLmJhc2UuYmFyXCIsIgorICAgICIgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgIgorICAgICJpbiBuYW1lIHJlc29sdXRpb24uIENvbnNpZGVyIHVzaW5nIGEgbGVhZGluZyAnLicoaS5lLiwgXCIuYmFzZS5iYXJcIikiCisgICAgIiB0byBzdGFydCBmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuXG4iKTsKK30KKworVEVTVF9GKFBhcnNlclZhbGlkYXRpb25FcnJvclRlc3QsIFJlc292bGVkVW5kZWZpbmVkT3B0aW9uRXJyb3IpIHsKKyAgLy8gQnVpbGQgZGVzY3JpcHRvciBtZXNzYWdlIGluIHRlc3QgcG9vbAorICBGaWxlRGVzY3JpcHRvclByb3RvIGRlc2NyaXB0b3JfcHJvdG87CisgIERlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZGVzY3JpcHRvcl9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShkZXNjcmlwdG9yX3Byb3RvKSAhPSBOVUxMKTsKKworICAvLyBiYXNlMi5wcm90bzoKKyAgLy8gICBwYWNrYWdlIGJhegorICAvLyAgIGltcG9ydCBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bworICAvLyAgIG1lc3NhZ2UgQmFyIHsgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgfQorICAvLyAgIGV4dGVuZCBGaWxlT3B0aW9ucyB7IG9wdGlvbmFsIEJhciBiYXIgPSA3NjcyNzU3OyB9CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXJfZmlsZTsKKyAgb3RoZXJfZmlsZS5zZXRfbmFtZSgiYmFzZTIucHJvdG8iKTsKKyAgb3RoZXJfZmlsZS5zZXRfcGFja2FnZSgiYmF6Iik7CisgIG90aGVyX2ZpbGUuYWRkX2RlcGVuZGVuY3koKTsKKyAgb3RoZXJfZmlsZS5zZXRfZGVwZW5kZW5jeSgwLCBkZXNjcmlwdG9yX3Byb3RvLm5hbWUoKSk7CisKKyAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlKG90aGVyX2ZpbGUuYWRkX21lc3NhZ2VfdHlwZSgpKTsKKyAgbWVzc2FnZS0+c2V0X25hbWUoIkJhciIpOworICBGaWVsZERlc2NyaXB0b3JQcm90byogZmllbGQobWVzc2FnZS0+YWRkX2ZpZWxkKCkpOworICBmaWVsZC0+c2V0X25hbWUoImZvbyIpOworICBmaWVsZC0+c2V0X251bWJlcigxKTsKKyAgZmllbGQtPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTCk7CisgIGZpZWxkLT5zZXRfdHlwZShGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzIpOworCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBleHRlbnNpb24ob3RoZXJfZmlsZS5hZGRfZXh0ZW5zaW9uKCkpOworICBleHRlbnNpb24tPnNldF9uYW1lKCJiYXIiKTsKKyAgZXh0ZW5zaW9uLT5zZXRfbnVtYmVyKDc2NzI3NTcpOworICBleHRlbnNpb24tPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTCk7CisgIGV4dGVuc2lvbi0+c2V0X3R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0UpOworICBleHRlbnNpb24tPnNldF90eXBlX25hbWUoIkJhciIpOworICBleHRlbnNpb24tPnNldF9leHRlbmRlZSgiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIik7CisKKyAgRVhQRUNUX1RSVUUocG9vbF8uQnVpbGRGaWxlKG90aGVyX2ZpbGUpICE9IE5VTEwpOworCisgIC8vIHF1eC5wcm90bzoKKyAgLy8gICBwYWNrYWdlIHF1eC5iYXoKKyAgLy8gICBvcHRpb24gKGJhei5iYXIpLmZvbyA9IDE7CisgIC8vCisgIC8vIEFsdGhvdWdoICJiYXouYmFyIiBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZSBsb29rdXAgY29kZSB3aWxsIHRyeQorICAvLyAicXV4LmJhei5iYXIiLCBzaW5jZSBpdCdzIHRoZSBtYXRjaCBmcm9tIHRoZSBpbm5lcm1vc3Qgc2NvcGUsCisgIC8vIHdoaWNoIHdpbGwgY2F1c2UgYSBzeW1ib2wgbm90IGRlZmluZWQgZXJyb3IuCisgIEV4cGVjdEhhc1ZhbGlkYXRpb25FcnJvcnMoCisgICAgICAicGFja2FnZSBxdXguYmF6O1xuIgorICAgICAgImltcG9ydCBcImJhc2UyLnByb3RvXCI7XG4iCisgICAgICAib3B0aW9uIChiYXouYmFyKS5mb28gPSAxO1xuIiwKKyAgICAgICIyOjc6IE9wdGlvbiBcIihiYXouYmFyKVwiIGlzIHJlc29sdmVkIHRvIFwiKHF1eC5iYXouYmFyKVwiLCIKKyAgICAgICIgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgIgorICAgICAgImluIG5hbWUgcmVzb2x1dGlvbi4gQ29uc2lkZXIgdXNpbmcgYSBsZWFkaW5nICcuJyhpLmUuLCBcIiguYmF6LmJhcilcIikiCisgICAgICAiIHRvIHN0YXJ0IGZyb20gdGhlIG91dGVybW9zdCBzY29wZS5cbiIpOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBUZXN0IHRoYXQgdGhlIG91dHB1dCBmcm9tIEZpbGVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIChhbmQgYWxsIG90aGVyCiAvLyBkZXNjcmlwdG9yIHR5cGVzKSBpcyBwYXJzZWFibGUsIGFuZCByZXN1bHRzIGluIHRoZSBzYW1lIERlc2NyaXB0b3IKLS8vIGRlZmluaXRpb25zIGFnYWluIGFmb3RlciBwYXJzaW5nIChub3QsIGhvd2V2ZXIsIHRoYXQgdGhlIG9yZGVyIG9mIG1lc3NhZ2VzCisvLyBkZWZpbml0aW9ucyBhZ2FpbiBhZm90ZXIgcGFyc2luZyAobm90ZSwgaG93ZXZlciwgdGhhdCB0aGUgb3JkZXIgb2YgbWVzc2FnZXMKIC8vIGNhbm5vdCBiZSBndWFyYW50ZWVkIHRvIGJlIHRoZSBzYW1lKQogCi10eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VEZWNyaXB0b3JEZWJ1Z1Rlc3Q7Cit0eXBlZGVmIFBhcnNlclRlc3QgUGFyc2VEZXNjcmlwdG9yRGVidWdUZXN0OwogCiBjbGFzcyBDb21wYXJlRGVzY3JpcHRvck5hbWVzIHsKICBwdWJsaWM6Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBEZXNjcmlwdG9yUHJvdG8qIGxlZnQsIGNvbnN0IERlc2NyaXB0b3JQcm90byogcmlnaHQpIHsKKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IERlc2NyaXB0b3JQcm90byogbGVmdCwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byogcmlnaHQpIGNvbnN0IHsKICAgICByZXR1cm4gbGVmdC0+bmFtZSgpIDwgcmlnaHQtPm5hbWUoKTsKICAgfQogfTsKQEAgLTExOTksNyArMTcxNyw3IEBACiAgIH0KICAgRGVzY3JpcHRvclByb3RvICoqZGF0YSA9CiAgICAgZGVzY3JpcHRvcl9wcm90by0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLT5tdXRhYmxlX2RhdGEoKTsKLSAgc29ydChkYXRhLCBkYXRhICsgc2l6ZSwgQ29tcGFyZURlc2NyaXB0b3JOYW1lcygpKTsKKyAgc3RkOjpzb3J0KGRhdGEsIGRhdGEgKyBzaXplLCBDb21wYXJlRGVzY3JpcHRvck5hbWVzKCkpOwogfQogCiAvLyBTb3J0cyBEZXNjcmlwdG9yUHJvdG9zIGJlbG9uZ2luZyB0byBhIEZpbGVEZXNjcmlwdG9yUHJvdG8sIGJ5IG5hbWUuCkBAIC0xMjExLDEwICsxNzI5LDMxIEBACiAgIH0KICAgRGVzY3JpcHRvclByb3RvICoqZGF0YSA9CiAgICAgZmlsZV9kZXNjcmlwdG9yX3Byb3RvLT5tdXRhYmxlX21lc3NhZ2VfdHlwZSgpLT5tdXRhYmxlX2RhdGEoKTsKLSAgc29ydChkYXRhLCBkYXRhICsgc2l6ZSwgQ29tcGFyZURlc2NyaXB0b3JOYW1lcygpKTsKKyAgc3RkOjpzb3J0KGRhdGEsIGRhdGEgKyBzaXplLCBDb21wYXJlRGVzY3JpcHRvck5hbWVzKCkpOwogfQogCi1URVNUX0YoUGFyc2VEZWNyaXB0b3JEZWJ1Z1Rlc3QsIFRlc3RBbGxEZXNjcmlwdG9yVHlwZXMpIHsKKy8vIFN0cmlwcyB0aGUgbWVzc2FnZSBhbmQgZW51bSBmaWVsZCB0eXBlIG5hbWVzIGZvciBjb21wYXJpc29uIHB1cnBvc2Ugb25seS4KK3ZvaWQgU3RyaXBGaWVsZFR5cGVOYW1lKERlc2NyaXB0b3JQcm90byogcHJvdG8pIHsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90by0+ZmllbGRfc2l6ZSgpOyArK2kpIHsKKyAgICBzdHJpbmcgdHlwZV9uYW1lID0gcHJvdG8tPmZpZWxkKGkpLnR5cGVfbmFtZSgpOworICAgIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IHR5cGVfbmFtZS5maW5kX2xhc3Rfb2YoIi4iKTsKKyAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgeworICAgICAgcHJvdG8tPm11dGFibGVfZmllbGQoaSktPm11dGFibGVfdHlwZV9uYW1lKCktPmFzc2lnbigKKyAgICAgICAgICB0eXBlX25hbWUuYmVnaW4oKSArIHBvcyArIDEsIHR5cGVfbmFtZS5lbmQoKSk7CisgICAgfQorICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8tPm5lc3RlZF90eXBlX3NpemUoKTsgKytpKSB7CisgICAgU3RyaXBGaWVsZFR5cGVOYW1lKHByb3RvLT5tdXRhYmxlX25lc3RlZF90eXBlKGkpKTsKKyAgfQorfQorCit2b2lkIFN0cmlwRmllbGRUeXBlTmFtZShGaWxlRGVzY3JpcHRvclByb3RvKiBmaWxlX3Byb3RvKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV9wcm90by0+bWVzc2FnZV90eXBlX3NpemUoKTsgKytpKSB7CisgICAgU3RyaXBGaWVsZFR5cGVOYW1lKGZpbGVfcHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKGkpKTsKKyAgfQorfQorCitURVNUX0YoUGFyc2VEZXNjcmlwdG9yRGVidWdUZXN0LCBUZXN0QWxsRGVzY3JpcHRvclR5cGVzKSB7CiAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBvcmlnaW5hbF9maWxlID0KICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT5maWxlKCk7CiAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZXhwZWN0ZWQ7CkBAIC0xMjI5LDEzICsxNzY4LDE5IEBACiAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcGFyc2VkOwogICBwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZwYXJzZWQpOwogICBFWFBFQ1RfRVEoaW86OlRva2VuaXplcjo6VFlQRV9FTkQsIGlucHV0Xy0+Y3VycmVudCgpLnR5cGUpOwotICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pOworICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pCisgICAgICA8PCAiRmFpbGVkIHRvIHBhcnNlOlxuIiA8PCBkZWJ1Z19zdHJpbmc7CiAKICAgLy8gV2Ugbm93IGhhdmUgYSBGaWxlRGVzY3JpcHRvclByb3RvLCBidXQgdG8gY29tcGFyZSB3aXRoIHRoZSBleHBlY3RlZCB3ZQogICAvLyBuZWVkIHRvIGxpbmsgdG8gYSBGaWxlRGVjcmlwdG9yLCB0aGVuIG91dHB1dCBiYWNrIHRvIGEgcHJvdG8uIFdlJ2xsCiAgIC8vIGFsc28gbmVlZCB0byBnaXZlIGl0IHRoZSBzYW1lIG5hbWUgYXMgdGhlIG9yaWdpbmFsLgogICBwYXJzZWQuc2V0X25hbWUoImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wcm90byIpOwogICAvLyBXZSBuZWVkIHRoZSBpbXBvcnRlZCBkZXBlbmRlbmN5IGJlZm9yZSB3ZSBjYW4gYnVpbGQgb3VyIHBhcnNlZCBwcm90bworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHVibGljX2ltcG9ydCA9CisgICAgICBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ6OlB1YmxpY0ltcG9ydE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIHB1YmxpY19pbXBvcnRfcHJvdG87CisgIHB1YmxpY19pbXBvcnQtPkNvcHlUbygmcHVibGljX2ltcG9ydF9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShwdWJsaWNfaW1wb3J0X3Byb3RvKSAhPSBOVUxMKTsKICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGltcG9ydCA9CiAgICAgICAgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OjpJbXBvcnRNZXNzYWdlOjpkZXNjcmlwdG9yKCktPmZpbGUoKTsKICAgRmlsZURlc2NyaXB0b3JQcm90byBpbXBvcnRfcHJvdG87CkBAIC0xMjQzLDYgKzE3ODgsOCBAQAogICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUoaW1wb3J0X3Byb3RvKSAhPSBOVUxMKTsKICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGFjdHVhbCA9IHBvb2xfLkJ1aWxkRmlsZShwYXJzZWQpOwogICBwYXJzZWQuQ2xlYXIoKTsKKyAgQVNTRVJUX1RSVUUoYWN0dWFsICE9IE5VTEwpCisgICAgICA8PCAiRmFpbGVkIHRvIHZhbGlkYXRlOlxuIiA8PCBkZWJ1Z19zdHJpbmc7CiAgIGFjdHVhbC0+Q29weVRvKCZwYXJzZWQpOwogICBBU1NFUlRfVFJVRShhY3R1YWwgIT0gTlVMTCk7CiAKQEAgLTEyNTgsNiArMTgwNSwxOTkgQEAKICAgRVhQRUNUX0VRKGV4cGVjdGVkLkRlYnVnU3RyaW5nKCksIHBhcnNlZC5EZWJ1Z1N0cmluZygpKTsKIH0KIAorVEVTVF9GKFBhcnNlRGVzY3JpcHRvckRlYnVnVGVzdCwgVGVzdEN1c3RvbU9wdGlvbnMpIHsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIG9yaWdpbmFsX2ZpbGUgPQorICAgICBwcm90b2J1Zl91bml0dGVzdDo6QWdncmVnYXRlTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5maWxlKCk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZXhwZWN0ZWQ7CisgIG9yaWdpbmFsX2ZpbGUtPkNvcHlUbygmZXhwZWN0ZWQpOworCisgIHN0cmluZyBkZWJ1Z19zdHJpbmcgPSBvcmlnaW5hbF9maWxlLT5EZWJ1Z1N0cmluZygpOworCisgIC8vIFBhcnNlIHRoZSBkZWJ1ZyBzdHJpbmcKKyAgU2V0dXBQYXJzZXIoZGVidWdfc3RyaW5nLmNfc3RyKCkpOworICBGaWxlRGVzY3JpcHRvclByb3RvIHBhcnNlZDsKKyAgcGFyc2VyXy0+UGFyc2UoaW5wdXRfLmdldCgpLCAmcGFyc2VkKTsKKyAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgQVNTRVJUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKworICAvLyBXZSBub3cgaGF2ZSBhIEZpbGVEZXNjcmlwdG9yUHJvdG8sIGJ1dCB0byBjb21wYXJlIHdpdGggdGhlIGV4cGVjdGVkIHdlCisgIC8vIG5lZWQgdG8gbGluayB0byBhIEZpbGVEZWNyaXB0b3IsIHRoZW4gb3V0cHV0IGJhY2sgdG8gYSBwcm90by4gV2UnbGwKKyAgLy8gYWxzbyBuZWVkIHRvIGdpdmUgaXQgdGhlIHNhbWUgbmFtZSBhcyB0aGUgb3JpZ2luYWwuCisgIHBhcnNlZC5zZXRfbmFtZShvcmlnaW5hbF9maWxlLT5uYW1lKCkpOworCisgIC8vIHVuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvIGRlcGVuZHMgb24gZGVzY3JpcHRvci5wcm90by4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGltcG9ydCA9IEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpOworICBGaWxlRGVzY3JpcHRvclByb3RvIGltcG9ydF9wcm90bzsKKyAgaW1wb3J0LT5Db3B5VG8oJmltcG9ydF9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2xfLkJ1aWxkRmlsZShpbXBvcnRfcHJvdG8pICE9IE5VTEwpOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogYWN0dWFsID0gcG9vbF8uQnVpbGRGaWxlKHBhcnNlZCk7CisgIEFTU0VSVF9UUlVFKGFjdHVhbCAhPSBOVUxMKTsKKyAgcGFyc2VkLkNsZWFyKCk7CisgIGFjdHVhbC0+Q29weVRvKCZwYXJzZWQpOworCisgIC8vIFRoZSBtZXNzYWdlcyBtaWdodCBiZSBpbiBkaWZmZXJlbnQgb3JkZXJzLCBtYWtpbmcgdGhlbSBoYXJkIHRvIGNvbXBhcmUuCisgIC8vIFNvLCBzb3J0IHRoZSBtZXNzYWdlcyBpbiB0aGUgZGVzY3JpcHRvciBwcm90b3MgKGluY2x1ZGluZyBuZXN0ZWQgbWVzc2FnZXMsCisgIC8vIHJlY3Vyc2l2ZWx5KS4KKyAgU29ydE1lc3NhZ2VzKCZleHBlY3RlZCk7CisgIFNvcnRNZXNzYWdlcygmcGFyc2VkKTsKKworICBFWFBFQ1RfRVEoZXhwZWN0ZWQuRGVidWdTdHJpbmcoKSwgcGFyc2VkLkRlYnVnU3RyaW5nKCkpOworfQorCisvLyBFbnN1cmUgdGhhdCBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCksIHdpdGggfGluY2x1ZGVfY29tbWVudHN8IHNldCB0byB0cnVlLAorLy8gaW5jbHVkZXMgY29tbWVudHMgZnJvbSB0aGUgb3JpZ2luYWwgcGFyc2VyIGlucHV0IGluIGFsbCBvZiB0aGUgYXBwcm9wcmlhdGUKKy8vIHBsYWNlcy4KK1RFU1RfRihQYXJzZURlc2NyaXB0b3JEZWJ1Z1Rlc3QsIFRlc3RDb21tZW50c0luRGVidWdTdHJpbmcpIHsKKyAgU2V0dXBQYXJzZXIoCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgc3ludGF4LlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIFN5bnRheCBjb21tZW50LlxuIgorICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgcGFja2FnZS5cbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBQYWNrYWdlIGNvbW1lbnQuXG4iCisgICAgICAicGFja2FnZSBjb21tZW50X3Rlc3Q7XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgVGVzdE1lc3NhZ2UxLlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIE1lc3NhZ2UgY29tbWVudC5cbiIKKyAgICAgICIvL1xuIgorICAgICAgIi8vIE1vcmUgZGV0YWlsIGluIG1lc3NhZ2UgY29tbWVudC5cbiIKKyAgICAgICJtZXNzYWdlIFRlc3RNZXNzYWdlMSB7XG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBmb28uXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBGaWVsZCBjb21tZW50LlxuIgorICAgICAgIiAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTtcbiIKKyAgICAgICJcbiIKKyAgICAgICIgIC8vIERldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE5lc3RlZE1lc3NhZ2UuXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBOZXN0ZWQtbWVzc2FnZSBjb21tZW50LlxuIgorICAgICAgIiAgbWVzc2FnZSBOZXN0ZWRNZXNzYWdlIHtcbiIKKyAgICAgICIgICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMTtcbiIKKyAgICAgICIgIH1cbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgTXlFbnVtVHlwZS5cbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBFbnVtIGNvbW1lbnQuXG4iCisgICAgICAiZW51bSBNeUVudW1UeXBlIHtcbiIKKyAgICAgICJcbiIKKyAgICAgICIgIC8vIERldGFjaGVkIGNvbW1lbnQgYmVmb3JlIEFTREYuXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBFbnVtLXZhbHVlIGNvbW1lbnQuXG4iCisgICAgICAiICBBU0RGID0gMTtcbiIKKyAgICAgICJ9XG4iCisgICAgICAiXG4iCisgICAgICAiLy8gRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgTXlTZXJ2aWNlLlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIFNlcnZpY2UgY29tbWVudC5cbiIKKyAgICAgICJzZXJ2aWNlIE15U2VydmljZSB7XG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeVJQQ0NhbGwuXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBSUEMgY29tbWVudC5cbiIKKyAgICAgICIgIHJwYyBNeVJQQ0NhbGwoVGVzdE1lc3NhZ2UxKSByZXR1cm5zIChUZXN0TWVzc2FnZTEpIHsgfVxuIgorICAgICAgIn1cbiIpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcGFyc2VkX2Rlc2M7CisgIHBhcnNlZF9kZXNjLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgU291cmNlTG9jYXRpb25UYWJsZSBzb3VyY2VfbG9jYXRpb25zOworICBwYXJzZXJfLT5SZWNvcmRTb3VyY2VMb2NhdGlvbnNUbygmc291cmNlX2xvY2F0aW9ucyk7CisgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZF9kZXNjKTsKKyAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgQVNTRVJUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3JfLnRleHRfKTsKKworICAvLyBXZSBuZWVkIHRvIGltcG9ydCB0aGUgRmlsZURlc2NyaXB0b3JQcm90byB0byBnZXQgYSBGaWxlRGVzY3JpcHRvci4KKyAgTW9ja1ZhbGlkYXRpb25FcnJvckNvbGxlY3RvciBjb2xsZWN0b3Ioc291cmNlX2xvY2F0aW9ucywgJmVycm9yX2NvbGxlY3Rvcl8pOworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZGVzY3JpcHRvciA9CisgICAgICBwb29sXy5CdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKHBhcnNlZF9kZXNjLCAmY29sbGVjdG9yKTsKKyAgQVNTRVJUX1RSVUUoZGVzY3JpcHRvciAhPSBOVUxMKTsKKworICAvLyBFbnN1cmUgdGhhdCBlYWNoIG9mIHRoZSBjb21tZW50cyBhcHBlYXJzIHNvbWV3aGVyZSBpbiB0aGUgRGVidWdTdHJpbmcoKS4KKyAgLy8gV2UgZG9uJ3QgdGVzdCB0aGUgZXhhY3QgY29tbWVudCBwbGFjZW1lbnQgb3IgZm9ybWF0dGluZywgYmVjYXVzZSB3ZSBkbyBub3QKKyAgLy8gd2FudCB0byBiZSB0b28gZnJhZ2lsZSBoZXJlLgorICBjb25zdCBjaGFyKiBleHBlY3RlZF9jb21tZW50c1tdID0geworICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBzeW50YXguIiwKKyAgICAiU3ludGF4IGNvbW1lbnQuIiwKKyAgICAiRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgcGFja2FnZS4iLAorICAgICJQYWNrYWdlIGNvbW1lbnQuIiwKKyAgICAiRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgVGVzdE1lc3NhZ2UxLiIsCisgICAgIk1lc3NhZ2UgY29tbWVudC4iLAorICAgICJNb3JlIGRldGFpbCBpbiBtZXNzYWdlIGNvbW1lbnQuIiwKKyAgICAiRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgZm9vLiIsCisgICAgIkZpZWxkIGNvbW1lbnQiLAorICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBOZXN0ZWRNZXNzYWdlLiIsCisgICAgIk5lc3RlZC1tZXNzYWdlIGNvbW1lbnQiLAorICAgICJEZXRhY2hlZCBjb21tZW50IGJlZm9yZSBNeUVudW1UeXBlLiIsCisgICAgIkVudW0gY29tbWVudCIsCisgICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIEFTREYuIiwKKyAgICAiRW51bS12YWx1ZSBjb21tZW50IiwKKyAgICAiRGV0YWNoZWQgY29tbWVudCBiZWZvcmUgTXlTZXJ2aWNlLiIsCisgICAgIlNlcnZpY2UgY29tbWVudCIsCisgICAgIkRldGFjaGVkIGNvbW1lbnQgYmVmb3JlIE15UlBDQ2FsbC4iLAorICAgICJSUEMgY29tbWVudCIsCisgIH07CisKKyAgRGVidWdTdHJpbmdPcHRpb25zIGRlYnVnX3N0cmluZ19vcHRpb25zOworICBkZWJ1Z19zdHJpbmdfb3B0aW9ucy5pbmNsdWRlX2NvbW1lbnRzID0gdHJ1ZTsKKworICB7CisgICAgY29uc3Qgc3RyaW5nIGRlYnVnX3N0cmluZyA9CisgICAgICAgIGRlc2NyaXB0b3ItPkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoZGVidWdfc3RyaW5nX29wdGlvbnMpOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGV4cGVjdGVkX2NvbW1lbnRzKTsgKytpKSB7CisgICAgICBzdHJpbmc6OnNpemVfdHlwZSBmb3VuZF9wb3MgPSBkZWJ1Z19zdHJpbmcuZmluZChleHBlY3RlZF9jb21tZW50c1tpXSk7CisgICAgICBFWFBFQ1RfVFJVRShmb3VuZF9wb3MgIT0gc3RyaW5nOjpucG9zKQorICAgICAgICAgIDw8ICJcIiIgPDwgZXhwZWN0ZWRfY29tbWVudHNbaV0gPDwgIlwiIG5vdCBmb3VuZC4iOworICAgIH0KKworICAgIC8vIFJlc3VsdCBvZiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zIHNob3VsZCBiZSBwYXJzZWFibGUuCisgICAgU2V0dXBQYXJzZXIoZGVidWdfc3RyaW5nLmNfc3RyKCkpOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcGFyc2VkOworICAgIHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJnBhcnNlZCk7CisgICAgRVhQRUNUX0VRKGlvOjpUb2tlbml6ZXI6OlRZUEVfRU5ELCBpbnB1dF8tPmN1cnJlbnQoKS50eXBlKTsKKyAgICBBU1NFUlRfRVEoIiIsIGVycm9yX2NvbGxlY3Rvcl8udGV4dF8pCisgICAgICAgIDw8ICJGYWlsZWQgdG8gcGFyc2U6XG4iIDw8IGRlYnVnX3N0cmluZzsKKyAgfQorCit9CisKK1RFU1RfRihQYXJzZURlc2NyaXB0b3JEZWJ1Z1Rlc3QsIFRlc3RNYXBzKSB7CisgIFNldHVwUGFyc2VyKAorICAgICAgInN5bnRheCA9IFwicHJvdG8zXCI7ICIKKyAgICAgICJtZXNzYWdlIEZvbyB7ICIKKyAgICAgICIgIG1lc3NhZ2UgQmFyIHsgfSAiCisgICAgICAiICBtYXA8aW50MzIsIEJhcj4gZW51bV9tZXNzYWdlX21hcCA9IDE7ICIKKyAgICAgICIgIG1hcDxzdHJpbmcsIGZsb2F0PiBwcmltaXRpdmVfbWFwID0gMjsgIgorICAgICAgIn0gIik7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3JpZ2luYWw7CisgIEVYUEVDVF9UUlVFKHBhcnNlcl8tPlBhcnNlKGlucHV0Xy5nZXQoKSwgJm9yaWdpbmFsKSk7CisgIG9yaWdpbmFsLnNldF9uYW1lKCJmb28ucHJvdG8iKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sXy5CdWlsZEZpbGUob3JpZ2luYWwpOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworCisgIC8vIE1ha2Ugc3VyZSB0aGUgZGVidWcgc3RyaW5nIHVzZXMgbWFwIHN5bnRheCBhbmQgZG9lcyBub3QgaGF2ZSB0aGUgYXV0bworICAvLyBnZW5lcmF0ZWQgZW50cnkuCisgIHN0cmluZyBkZWJ1Z19zdHJpbmcgPSBmaWxlLT5EZWJ1Z1N0cmluZygpOworICBFWFBFQ1RfVFJVRShkZWJ1Z19zdHJpbmcuZmluZCgibWFwPCIpICE9IHN0cmluZzo6bnBvcyk7CisgIEVYUEVDVF9UUlVFKGRlYnVnX3N0cmluZy5maW5kKCJvcHRpb24gbWFwX2VudHJ5IikgPT0gc3RyaW5nOjpucG9zKTsKKyAgRVhQRUNUX1RSVUUoZGVidWdfc3RyaW5nLmZpbmQoIk1hcEVudHJ5IikgPT0gc3RyaW5nOjpucG9zKTsKKworICAvLyBNYWtlIHN1cmUgdGhlIGRlc2NyaXB0b3IgZGVidWcgc3RyaW5nIGlzIHBhcnNhYmxlLgorICBGaWxlRGVzY3JpcHRvclByb3RvIHBhcnNlZDsKKyAgU2V0dXBQYXJzZXIoZGVidWdfc3RyaW5nLmNfc3RyKCkpOworICBwYXJzZWQuc2V0X25hbWUoImZvby5wcm90byIpOworICBBU1NFUlRfVFJVRShwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZwYXJzZWQpKTsKKworICBvcmlnaW5hbC5jbGVhcl9zb3VyY2VfY29kZV9pbmZvKCk7CisgIHBhcnNlZC5jbGVhcl9zb3VyY2VfY29kZV9pbmZvKCk7CisgIFN0cmlwRmllbGRUeXBlTmFtZSgmb3JpZ2luYWwpOworICBTdHJpcEZpZWxkVHlwZU5hbWUoJnBhcnNlZCk7CisgIEVYUEVDVF9FUShvcmlnaW5hbC5EZWJ1Z1N0cmluZygpLCBwYXJzZWQuRGVidWdTdHJpbmcoKSk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIFNvdXJjZUNvZGVJbmZvIHRlc3RzLgogCkBAIC0xMzUzLDY3ICsyMDkzLDYgQEAKICAgfQogfQogCi0vLyBTcGxpdCBzb21lIHRleHQgb24gbGluZSBicmVha3MuICBUaGUgbGluZSBicmVha3MgYXJlIHJldGFpbmVkIGluIHRoZSBvdXRwdXQsCi0vLyBzbyBlYWNoIGxpbmUgKGV4Y2VwdCB0aGUgbGFzdCkgZW5kcyB3aXRoIGEgJ1xuJywgYW5kIHRoZSBsaW5lcyBjYW4gYmUKLS8vIGNvbmNhdGVuYXRlZCB0byBwcm9kdWNlIHRoZSBvcmlnaW5hbCB0ZXh0LgotLy8KLS8vIEkgY291bGRuJ3QgZmluZCB0aGUgcHJvcGVyIHN0cmluZyB1dGlsaXR5IGZ1bmN0aW9uIGZvciB0aGlzLiAgT3VyCi0vLyBzcGxpdC1vbi1kZWxpbWl0ZXIgZnVuY3Rpb25zIGRvbid0IGluY2x1ZGUgdGhlIGRlbGltaXRlciBpbiB0aGUgb3V0cHV0Lgotdm9pZCBTcGxpdExpbmVzKGNvbnN0IHN0cmluZyYgdGV4dCwgdmVjdG9yPHN0cmluZz4qIGxpbmVzKSB7Ci0gIHN0cmluZzo6c2l6ZV90eXBlIHBvcyA9IDA7Ci0KLSAgd2hpbGUgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICBzdHJpbmc6OnNpemVfdHlwZSBsYXN0X3BvcyA9IHBvczsKLSAgICBwb3MgPSB0ZXh0LmZpbmRfZmlyc3Rfb2YoJ1xuJywgcG9zKTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgKytwb3M7Ci0gICAgbGluZXMtPnB1c2hfYmFjayh0ZXh0LnN1YnN0cihsYXN0X3BvcywgcG9zIC0gbGFzdF9wb3MpKTsKLSAgfQotfQotCi0vLyBMb29rIGZvciB0aGUgZ2l2ZW4gdGFncyBpbiB0aGUgZ2l2ZW4gdGV4dCBhbmQgY29uc3RydWN0IGEgc3BhbiAoYXMgZGVmaW5lZAotLy8gYnkgU291cmNlQ29kZUluZm8uTG9jYXRpb24uc3BhbikgZnJvbSB0aGVtLiAgRS5nLiBmb3IgdGV4dCBsaWtlOgotLy8gICAvKmEqL21lc3NhZ2UgLypiKi9Gb28vKmMqLyB7fS8qZCovCi0vLyBUaGVyZSBhcmUgZm91ciB0YWdzOiAgImEiLCAiYiIsICJjIiwgYW5kICJkIi4gIFRoZSBjb25zdHJ1Y3RlZCBzcGFuIHN0YXJ0cwotLy8gaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHN0YXJ0IHRhZydzIHRyYWlsaW5nICcvJyBhbmQgZW5kcyBpbW1lZGlhdGVseSBiZWZvcmUKLS8vIHRoZSBlbmQgdGFncyBsZWFkaW5nICcvJy4KLXZvaWQgTWFrZUV4cGVjdGVkU3Bhbihjb25zdCB2ZWN0b3I8c3RyaW5nPiYgbGluZXMsCi0gICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBzdGFydF90YWcsIGNvbnN0IHN0cmluZyYgZW5kX3RhZywKLSAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIG91dHB1dCkgewotICBzdHJpbmcgc3RhcnRfY29tbWVudCA9ICIvKiIgKyBzdGFydF90YWcgKyAiKi8iOwotICBzdHJpbmcgZW5kX2NvbW1lbnQgPSAiLyoiICsgZW5kX3RhZyArICIqLyI7Ci0KLSAgaW50IHN0YXJ0X2xpbmUgPSAtMTsKLSAgaW50IHN0YXJ0X2NvbHVtbiA9IC0xOwotICBmb3IgKGludCBpID0gMDsgaSA8IGxpbmVzLnNpemUoKTsgaSsrKSB7Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbGluZXNbaV0uZmluZChzdGFydF9jb21tZW50KTsKLSAgICBpZiAocG9zICE9IHN0cmluZzo6bnBvcykgewotICAgICAgc3RhcnRfbGluZSA9IGk7Ci0gICAgICBzdGFydF9jb2x1bW4gPSBwb3MgKyBzdGFydF9jb21tZW50LnNpemUoKTsKLSAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICBBU1NFUlRfTkUoc3RhcnRfbGluZSwgLTEpCi0gICAgICA8PCAiVGFnIFwiIiA8PCBzdGFydF9jb21tZW50IDw8ICJcIiBub3QgZm91bmQgaW4gdGV4dC4iOwotCi0gIGludCBlbmRfbGluZSA9IC0xOwotICBpbnQgZW5kX2NvbHVtbiA9IC0xOwotICBmb3IgKGludCBpID0gc3RhcnRfbGluZTsgaSA8IGxpbmVzLnNpemUoKTsgaSsrKSB7Ci0gICAgc3RyaW5nOjpzaXplX3R5cGUgcG9zID0gbGluZXNbaV0uZmluZChlbmRfY29tbWVudCk7Ci0gICAgaWYgKHBvcyAhPSBzdHJpbmc6Om5wb3MpIHsKLSAgICAgIGVuZF9saW5lID0gaTsKLSAgICAgIGVuZF9jb2x1bW4gPSBwb3M7Ci0gICAgICBicmVhazsKLSAgICB9Ci0gIH0KLSAgQVNTRVJUX05FKGVuZF9saW5lLCAtMSkKLSAgICAgIDw8ICJUYWcgXCIiIDw8IGVuZF9jb21tZW50IDw8ICJcIiBub3QgZm91bmQgaW4gdGV4dC4iOwotCi0gIG91dHB1dC0+QWRkKHN0YXJ0X2xpbmUpOwotICBvdXRwdXQtPkFkZChzdGFydF9jb2x1bW4pOwotICBpZiAoZW5kX2xpbmUgIT0gc3RhcnRfbGluZSkgb3V0cHV0LT5BZGQoZW5kX2xpbmUpOwotICBvdXRwdXQtPkFkZChlbmRfY29sdW1uKTsKLX0KLQogLy8gQ2hlY2sgaWYgdHdvIHNwYW5zIGFyZSBlcXVhbC4KIGJvb2wgQ29tcGFyZVNwYW5zKGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50PiYgc3BhbjEsCiAgICAgICAgICAgICAgICAgICBjb25zdCBSZXBlYXRlZEZpZWxkPGludD4mIHNwYW4yKSB7CkBAIC0xNDM0LDggKzIxMTMsOCBAQAogICAvLyBQYXJzZSB0aGUgZ2l2ZW4gdGV4dCBhcyBhIC5wcm90byBmaWxlIGFuZCBwb3B1bGF0ZSB0aGUgc3BhbnNfIG1hcCB3aXRoCiAgIC8vIGFsbCB0aGUgc291cmNlIGxvY2F0aW9uIHNwYW5zIGluIGl0cyBTb3VyY2VDb2RlSW5mbyB0YWJsZS4KICAgYm9vbCBQYXJzZShjb25zdCBjaGFyKiB0ZXh0KSB7Ci0gICAgU2V0dXBQYXJzZXIodGV4dCk7Ci0gICAgU3BsaXRMaW5lcyh0ZXh0LCAmbGluZXNfKTsKKyAgICBFeHRyYWN0TWFya2Vycyh0ZXh0KTsKKyAgICBTZXR1cFBhcnNlcih0ZXh0X3dpdGhvdXRfbWFya2Vyc18uY19zdHIoKSk7CiAgICAgaWYgKCFwYXJzZXJfLT5QYXJzZShpbnB1dF8uZ2V0KCksICZmaWxlXykpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9CkBAIC0xNDUxLDggKzIxMzAsOCBAQAogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9CiAKLSAgICAgIHNwYW5zXy5pbnNlcnQobWFrZV9wYWlyKFNwYW5LZXkoKmRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkLCBpbmRleCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbG9jYXRpb24pKTsKKyAgICAgIHNwYW5zXy5pbnNlcnQoCisgICAgICAgICAgc3RkOjptYWtlX3BhaXIoU3BhbktleSgqZGVzY3JpcHRvcl9wcm90bywgZmllbGQsIGluZGV4KSwgJmxvY2F0aW9uKSk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0xNDcwLDE5ICsyMTQ5LDQxIEBACiAgIC8vIHBhcnQgb2YgdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uICAoSWYgdW5jbGVhciwgbG9vayBhdCB0aGUgYWN0dWFsIHRlc3RzOwogICAvLyBpdCBzaG91bGQgcXVpY2tseSBiZWNvbWUgb2J2aW91cy4pCiAKLSAgYm9vbCBIYXNTcGFuKGNvbnN0IGNoYXIqIHN0YXJ0X3RhZywgY29uc3QgY2hhciogZW5kX3RhZywKKyAgYm9vbCBIYXNTcGFuKGNoYXIgc3RhcnRfbWFya2VyLCBjaGFyIGVuZF9tYXJrZXIsCiAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvKSB7Ci0gICAgcmV0dXJuIEhhc1NwYW4oc3RhcnRfdGFnLCBlbmRfdGFnLCBkZXNjcmlwdG9yX3Byb3RvLCBOVUxMLCAtMSk7CisgICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudCgKKyAgICAgICAgc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLCBOVUxMLCAtMSwgTlVMTCwgTlVMTCwgTlVMTCk7CiAgIH0KIAotICBib29sIEhhc1NwYW4oY29uc3QgY2hhciogc3RhcnRfdGFnLCBjb25zdCBjaGFyKiBlbmRfdGFnLAorICBib29sIEhhc1NwYW5XaXRoQ29tbWVudChjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZXhwZWN0ZWRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykgeworICAgIHJldHVybiBIYXNTcGFuV2l0aENvbW1lbnQoCisgICAgICAgIHN0YXJ0X21hcmtlciwgZW5kX21hcmtlciwgZGVzY3JpcHRvcl9wcm90bywgTlVMTCwgLTEsCisgICAgICAgIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsIGV4cGVjdGVkX3RyYWlsaW5nX2NvbW1lbnRzLAorICAgICAgICBleHBlY3RlZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKTsKKyAgfQorCisgIGJvb2wgSGFzU3BhbihjaGFyIHN0YXJ0X21hcmtlciwgY2hhciBlbmRfbWFya2VyLAogICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lKSB7Ci0gICAgcmV0dXJuIEhhc1NwYW4oc3RhcnRfdGFnLCBlbmRfdGFnLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZF9uYW1lLCAtMSk7CisgICAgcmV0dXJuIEhhc1NwYW4oc3RhcnRfbWFya2VyLCBlbmRfbWFya2VyLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZF9uYW1lLCAtMSk7CiAgIH0KIAotICBib29sIEhhc1NwYW4oY29uc3QgY2hhciogc3RhcnRfdGFnLCBjb25zdCBjaGFyKiBlbmRfdGFnLAorICBib29sIEhhc1NwYW4oY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwKICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSwKICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICAgIHJldHVybiBIYXNTcGFuKHN0YXJ0X21hcmtlciwgZW5kX21hcmtlciwgZGVzY3JpcHRvcl9wcm90bywKKyAgICAgICAgICAgICAgICAgICBmaWVsZF9uYW1lLCBpbmRleCwgTlVMTCwgTlVMTCwgTlVMTCk7CisgIH0KKworICBib29sIEhhc1NwYW4oY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwKKyAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sCisgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUsIGludCBpbmRleCwKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpIHsKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0KICAgICAgICAgZGVzY3JpcHRvcl9wcm90by5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZShmaWVsZF9uYW1lKTsKICAgICBpZiAoZmllbGQgPT0gTlVMTCkgewpAQCAtMTQ5MSwyOSArMjE5MiwzNiBAQAogICAgICAgcmV0dXJuIGZhbHNlOwogICAgIH0KIAotICAgIHJldHVybiBIYXNTcGFuKHN0YXJ0X3RhZywgZW5kX3RhZywgZGVzY3JpcHRvcl9wcm90bywgZmllbGQsIGluZGV4KTsKKyAgICByZXR1cm4gSGFzU3BhbldpdGhDb21tZW50KAorICAgICAgICBzdGFydF9tYXJrZXIsIGVuZF9tYXJrZXIsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkLCBpbmRleCwKKyAgICAgICAgZXhwZWN0ZWRfbGVhZGluZ19jb21tZW50cywgZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpOwogICB9CiAKICAgYm9vbCBIYXNTcGFuKGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8pIHsKLSAgICByZXR1cm4gSGFzU3BhbihOVUxMLCBOVUxMLCBkZXNjcmlwdG9yX3Byb3RvLCBOVUxMLCAtMSk7CisgICAgcmV0dXJuIEhhc1NwYW5XaXRoQ29tbWVudCgKKyAgICAgICAgJ1wwJywgJ1wwJywgZGVzY3JpcHRvcl9wcm90bywgTlVMTCwgLTEsIE5VTEwsIE5VTEwsIE5VTEwpOwogICB9CiAKICAgYm9vbCBIYXNTcGFuKGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3JfcHJvdG8sIGNvbnN0IHN0cmluZyYgZmllbGRfbmFtZSkgewotICAgIHJldHVybiBIYXNTcGFuKE5VTEwsIE5VTEwsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkX25hbWUsIC0xKTsKKyAgICByZXR1cm4gSGFzU3BhbignXDAnLCAnXDAnLCBkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZF9uYW1lLCAtMSk7CiAgIH0KIAogICBib29sIEhhc1NwYW4oY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywgY29uc3Qgc3RyaW5nJiBmaWVsZF9uYW1lLAogICAgICAgICAgICAgICAgaW50IGluZGV4KSB7Ci0gICAgcmV0dXJuIEhhc1NwYW4oTlVMTCwgTlVMTCwgZGVzY3JpcHRvcl9wcm90bywgZmllbGRfbmFtZSwgaW5kZXgpOworICAgIHJldHVybiBIYXNTcGFuKCdcMCcsICdcMCcsIGRlc2NyaXB0b3JfcHJvdG8sIGZpZWxkX25hbWUsIGluZGV4KTsKICAgfQogCi0gIGJvb2wgSGFzU3Bhbihjb25zdCBjaGFyKiBzdGFydF90YWcsIGNvbnN0IGNoYXIqIGVuZF90YWcsCi0gICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgaW50IGluZGV4KSB7CisgIGJvb2wgSGFzU3BhbldpdGhDb21tZW50KAorICAgICAgY2hhciBzdGFydF9tYXJrZXIsIGNoYXIgZW5kX21hcmtlciwgY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICBjb25zdCBjaGFyKiBleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKKyAgICAgIGNvbnN0IGNoYXIqIGV4cGVjdGVkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpIHsKICAgICBwYWlyPFNwYW5NYXA6Oml0ZXJhdG9yLCBTcGFuTWFwOjppdGVyYXRvcj4gcmFuZ2UgPQogICAgICAgICBzcGFuc18uZXF1YWxfcmFuZ2UoU3BhbktleShkZXNjcmlwdG9yX3Byb3RvLCBmaWVsZCwgaW5kZXgpKTsKIAotICAgIGlmIChzdGFydF90YWcgPT0gTlVMTCkgeworICAgIGlmIChzdGFydF9tYXJrZXIgPT0gJ1wwJykgewogICAgICAgaWYgKHJhbmdlLmZpcnN0ID09IHJhbmdlLnNlY29uZCkgewogICAgICAgICByZXR1cm4gZmFsc2U7CiAgICAgICB9IGVsc2UgewpAQCAtMTUyMSwxMSArMjIyOSw0MSBAQAogICAgICAgICByZXR1cm4gdHJ1ZTsKICAgICAgIH0KICAgICB9IGVsc2UgeworICAgICAgcGFpcjxpbnQsIGludD4gc3RhcnRfcG9zID0gRmluZE9yRGllKG1hcmtlcnNfLCBzdGFydF9tYXJrZXIpOworICAgICAgcGFpcjxpbnQsIGludD4gZW5kX3BvcyA9IEZpbmRPckRpZShtYXJrZXJzXywgZW5kX21hcmtlcik7CisKICAgICAgIFJlcGVhdGVkRmllbGQ8aW50PiBleHBlY3RlZF9zcGFuOwotICAgICAgTWFrZUV4cGVjdGVkU3BhbihsaW5lc18sIHN0YXJ0X3RhZywgZW5kX3RhZywgJmV4cGVjdGVkX3NwYW4pOworICAgICAgZXhwZWN0ZWRfc3Bhbi5BZGQoc3RhcnRfcG9zLmZpcnN0KTsKKyAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKHN0YXJ0X3Bvcy5zZWNvbmQpOworICAgICAgaWYgKGVuZF9wb3MuZmlyc3QgIT0gc3RhcnRfcG9zLmZpcnN0KSB7CisgICAgICAgIGV4cGVjdGVkX3NwYW4uQWRkKGVuZF9wb3MuZmlyc3QpOworICAgICAgfQorICAgICAgZXhwZWN0ZWRfc3Bhbi5BZGQoZW5kX3Bvcy5zZWNvbmQpOwogCiAgICAgICBmb3IgKFNwYW5NYXA6Oml0ZXJhdG9yIGl0ZXIgPSByYW5nZS5maXJzdDsgaXRlciAhPSByYW5nZS5zZWNvbmQ7ICsraXRlcikgewogICAgICAgICBpZiAoQ29tcGFyZVNwYW5zKGV4cGVjdGVkX3NwYW4sIGl0ZXItPnNlY29uZC0+c3BhbigpKSkgeworICAgICAgICAgIGlmIChleHBlY3RlZF9sZWFkaW5nX2NvbW1lbnRzID09IE5VTEwpIHsKKyAgICAgICAgICAgIEVYUEVDVF9GQUxTRShpdGVyLT5zZWNvbmQtPmhhc19sZWFkaW5nX2NvbW1lbnRzKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShpdGVyLT5zZWNvbmQtPmhhc19sZWFkaW5nX2NvbW1lbnRzKCkpOworICAgICAgICAgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2xlYWRpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5sZWFkaW5nX2NvbW1lbnRzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZXhwZWN0ZWRfdHJhaWxpbmdfY29tbWVudHMgPT0gTlVMTCkgeworICAgICAgICAgICAgRVhQRUNUX0ZBTFNFKGl0ZXItPnNlY29uZC0+aGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBFWFBFQ1RfVFJVRShpdGVyLT5zZWNvbmQtPmhhc190cmFpbGluZ19jb21tZW50cygpKTsKKyAgICAgICAgICAgIEVYUEVDVF9FUShleHBlY3RlZF90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICBpdGVyLT5zZWNvbmQtPnRyYWlsaW5nX2NvbW1lbnRzKCkpOworICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoZXhwZWN0ZWRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9PSBOVUxMKSB7CisgICAgICAgICAgICBFWFBFQ1RfRVEoMCwgaXRlci0+c2Vjb25kLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUSgKKyAgICAgICAgICAgICAgICBleHBlY3RlZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgIEpvaW4oaXRlci0+c2Vjb25kLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCksICJcbiIpKTsKKyAgICAgICAgICB9CisKICAgICAgICAgICBzcGFuc18uZXJhc2UoaXRlcik7CiAgICAgICAgICAgcmV0dXJuIHRydWU7CiAgICAgICAgIH0KQEAgLTE1NDIsMTAgKzIyODAsMTEgQEAKICAgICBpbnQgaW5kZXg7CiAKICAgICBpbmxpbmUgU3BhbktleSgpIHt9Ci0gICAgaW5saW5lIFNwYW5LZXkoY29uc3QgTWVzc2FnZSYgZGVzY3JpcHRvcl9wcm90bywKLSAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkKLSAgICAgICAgOiBkZXNjcmlwdG9yX3Byb3RvKCZkZXNjcmlwdG9yX3Byb3RvKSwgZmllbGQoZmllbGQpLCBpbmRleChpbmRleCkge30KKyAgICBpbmxpbmUgU3BhbktleShjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yX3Byb3RvX3BhcmFtLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfcGFyYW0sCisgICAgICAgICAgICAgICAgICAgaW50IGluZGV4X3BhcmFtKQorICAgICAgICA6IGRlc2NyaXB0b3JfcHJvdG8oJmRlc2NyaXB0b3JfcHJvdG9fcGFyYW0pLCBmaWVsZChmaWVsZF9wYXJhbSksCisgICAgICAgICAgaW5kZXgoaW5kZXhfcGFyYW0pIHt9CiAKICAgICBpbmxpbmUgYm9vbCBvcGVyYXRvcjwoY29uc3QgU3BhbktleSYgb3RoZXIpIGNvbnN0IHsKICAgICAgIGlmIChkZXNjcmlwdG9yX3Byb3RvIDwgb3RoZXIuZGVzY3JpcHRvcl9wcm90bykgcmV0dXJuIHRydWU7CkBAIC0xNTU4LDMyICsyMjk3LDY0IEBACiAKICAgdHlwZWRlZiBtdWx0aW1hcDxTcGFuS2V5LCBjb25zdCBTb3VyY2VDb2RlSW5mbzo6TG9jYXRpb24qPiBTcGFuTWFwOwogICBTcGFuTWFwIHNwYW5zXzsKLSAgdmVjdG9yPHN0cmluZz4gbGluZXNfOworICBtYXA8Y2hhciwgcGFpcjxpbnQsIGludD4gPiBtYXJrZXJzXzsKKyAgc3RyaW5nIHRleHRfd2l0aG91dF9tYXJrZXJzXzsKKworICB2b2lkIEV4dHJhY3RNYXJrZXJzKGNvbnN0IGNoYXIqIHRleHQpIHsKKyAgICBtYXJrZXJzXy5jbGVhcigpOworICAgIHRleHRfd2l0aG91dF9tYXJrZXJzXy5jbGVhcigpOworICAgIGludCBsaW5lID0gMDsKKyAgICBpbnQgY29sdW1uID0gMDsKKyAgICB3aGlsZSAoKnRleHQgIT0gJ1wwJykgeworICAgICAgaWYgKCp0ZXh0ID09ICckJykgeworICAgICAgICArK3RleHQ7CisgICAgICAgIEdPT0dMRV9DSEVDS19ORSgnXDAnLCAqdGV4dCk7CisgICAgICAgIGlmICgqdGV4dCA9PSAnJCcpIHsKKyAgICAgICAgICB0ZXh0X3dpdGhvdXRfbWFya2Vyc18gKz0gJyQnOworICAgICAgICAgICsrY29sdW1uOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIG1hcmtlcnNfWyp0ZXh0XSA9IHN0ZDo6bWFrZV9wYWlyKGxpbmUsIGNvbHVtbik7CisgICAgICAgICAgKyt0ZXh0OworICAgICAgICAgIEdPT0dMRV9DSEVDS19FUSgnJCcsICp0ZXh0KTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmICgqdGV4dCA9PSAnXG4nKSB7CisgICAgICAgICsrbGluZTsKKyAgICAgICAgY29sdW1uID0gMDsKKyAgICAgICAgdGV4dF93aXRob3V0X21hcmtlcnNfICs9ICp0ZXh0OworICAgICAgfSBlbHNlIHsKKyAgICAgICAgdGV4dF93aXRob3V0X21hcmtlcnNfICs9ICp0ZXh0OworICAgICAgICArK2NvbHVtbjsKKyAgICAgIH0KKyAgICAgICsrdGV4dDsKKyAgICB9CisgIH0KIH07CiAKIFRFU1RfRihTb3VyY2VJbmZvVGVzdCwgQmFzaWNGaWxlRGVjbHMpIHsKICAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAiLyphKi9zeW50YXggPSBcInByb3RvMlwiO1xuIgotICAgICAgInBhY2thZ2UgLypiKi9mb28uYmFyLypjKi87XG4iCi0gICAgICAiaW1wb3J0IC8qZCovXCJiYXoucHJvdG9cIi8qZSovO1xuIgotICAgICAgImltcG9ydCAvKmYqL1wicXV4LnByb3RvXCIvKmcqLzsvKmgqL1xuIgorICAgICAgIiRhJHN5bnRheCA9IFwicHJvdG8yXCI7JGkkXG4iCisgICAgICAicGFja2FnZSAkYiRmb28uYmFyJGMkO1xuIgorICAgICAgImltcG9ydCAkZCRcImJhei5wcm90b1wiJGUkO1xuIgorICAgICAgImltcG9ydCAkZiRcInF1eC5wcm90b1wiJGckOyRoJFxuIgorICAgICAgIlxuIgogICAgICAgIi8vIGNvbW1lbnQgaWdub3JlZFxuIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaCIsIGZpbGVfKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIGZpbGVfLCAicGFja2FnZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJlIiwgZmlsZV8sICJkZXBlbmRlbmN5IiwgMCkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJmIiwgImciLCBmaWxlXywgImRlcGVuZGVuY3kiLCAxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaCcsIGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpbGVfLCAicGFja2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgZmlsZV8sICJkZXBlbmRlbmN5IiwgMCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBmaWxlXywgImRlcGVuZGVuY3kiLCAxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaScsIGZpbGVfLCAic3ludGF4IikpOwogfQogCiBURVNUX0YoU291cmNlSW5mb1Rlc3QsIE1lc3NhZ2VzKSB7CiAgIEVYUEVDVF9UUlVFKFBhcnNlKAotICAgICAgIi8qYSovbWVzc2FnZSAvKmIqL0Zvby8qYyovIHt9LypkKi9cbiIKLSAgICAgICIvKmUqL21lc3NhZ2UgLypmKi9CYXIvKmcqLyB7fS8qaCovXG4iKSk7CisgICAgICAiJGEkbWVzc2FnZSAkYiRGb28kYyQge30kZCRcbiIKKyAgICAgICIkZSRtZXNzYWdlICRmJEJhciRnJCB7fSRoJFxuIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiZCIsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJlIiwgImgiLCBmaWxlXy5tZXNzYWdlX3R5cGUoMSkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgZmlsZV8ubWVzc2FnZV90eXBlKDEpLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdkJywgZmlsZV8ubWVzc2FnZV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnaCcsIGZpbGVfLm1lc3NhZ2VfdHlwZSgxKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMSksICJuYW1lIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTU5MiwyNCArMjM2MywyNCBAQAogVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBGaWVsZHMpIHsKICAgRVhQRUNUX1RSVUUoUGFyc2UoCiAgICAgICAibWVzc2FnZSBGb28ge1xuIgotICAgICAgIiAgLyphKi9vcHRpb25hbC8qYiovIC8qYyovaW50MzIvKmQqLyAvKmUqL2Jhci8qZiovID0gLypnKi8xLypoKi87LyppKi9cbiIKLSAgICAgICIgIC8qaiovcmVwZWF0ZWQvKmsqLyAvKmwqL1guWS8qbSovIC8qbiovYmF6LypvKi8gPSAvKnAqLzIvKnEqLzsvKnIqL1xuIgorICAgICAgIiAgJGEkb3B0aW9uYWwkYiQgJGMkaW50MzIkZCQgJGUkYmFyJGYkID0gJGckMSRoJDskaSRcbiIKKyAgICAgICIgICRqJHJlcGVhdGVkJGskICRsJFguWSRtJCAkbiRiYXokbyQgPSAkcCQyJHEkOyRyJFxuIgogICAgICAgIn1cbiIpKTsKIAogICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOwogICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDEpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaSIsIGZpZWxkMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImIiLCBmaWVsZDEsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYyIsICJkIiwgZmllbGQxLCAidHlwZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJmIiwgZmllbGQxLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZyIsICJoIiwgZmllbGQxLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2knLCBmaWVsZDEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdiJywgZmllbGQxLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2MnLCAnZCcsIGZpZWxkMSwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGZpZWxkMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpZWxkMSwgIm51bWJlciIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJqIiwgInIiLCBmaWVsZDIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaiIsICJrIiwgZmllbGQyLCAibGFiZWwiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImwiLCAibSIsIGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigibiIsICJvIiwgZmllbGQyLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigicCIsICJxIiwgZmllbGQyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ3InLCBmaWVsZDIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaicsICdrJywgZmllbGQyLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2wnLCAnbScsIGZpZWxkMiwgInR5cGVfbmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbicsICdvJywgZmllbGQyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigncCcsICdxJywgZmllbGQyLCAibnVtYmVyIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTYxOSwzMSArMjM5MCwzMSBAQAogCiBURVNUX0YoU291cmNlSW5mb1Rlc3QsIEV4dGVuc2lvbnMpIHsKICAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAiLyphKi9leHRlbmQgLypiKi9Gb28vKmMqLyB7XG4iCi0gICAgICAiICAvKmQqL29wdGlvbmFsLyplKi8gaW50MzIgYmFyID0gMTsvKmYqL1xuIgotICAgICAgIiAgLypnKi9yZXBlYXRlZC8qaCovIFguWSBiYXogPSAyOy8qaSovXG4iCi0gICAgICAifS8qaiovXG4iCi0gICAgICAiLyprKi9leHRlbmQgLypsKi9CYXIvKm0qLyB7XG4iCi0gICAgICAiICAvKm4qL29wdGlvbmFsIGludDMyIHF1eCA9IDE7LypvKi9cbiIKLSAgICAgICJ9LypwKi9cbiIpKTsKKyAgICAgICIkYSRleHRlbmQgJGIkRm9vJGMkIHtcbiIKKyAgICAgICIgICRkJG9wdGlvbmFsJGUkIGludDMyIGJhciA9IDE7JGYkXG4iCisgICAgICAiICAkZyRyZXBlYXRlZCRoJCBYLlkgYmF6ID0gMjskaSRcbiIKKyAgICAgICJ9JGokXG4iCisgICAgICAiJGskZXh0ZW5kICRsJEJhciRtJCB7XG4iCisgICAgICAiICAkbiRvcHRpb25hbCBpbnQzMiBxdXggPSAxOyRvJFxuIgorICAgICAgIn0kcCRcbiIpKTsKIAogICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8uZXh0ZW5zaW9uKDApOwogICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQyID0gZmlsZV8uZXh0ZW5zaW9uKDEpOwogICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQzID0gZmlsZV8uZXh0ZW5zaW9uKDIpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaiIsIGZpbGVfLCAiZXh0ZW5zaW9uIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJrIiwgInAiLCBmaWxlXywgImV4dGVuc2lvbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdqJywgZmlsZV8sICJleHRlbnNpb24iKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2snLCAncCcsIGZpbGVfLCAiZXh0ZW5zaW9uIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImQiLCAiZiIsIGZpZWxkMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJkIiwgImUiLCBmaWVsZDEsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgZmllbGQxLCAiZXh0ZW5kZWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZicsIGZpZWxkMSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBmaWVsZDEsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmllbGQxLCAiZXh0ZW5kZWUiKSk7CiAKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZyIsICJpIiwgZmllbGQyKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImciLCAiaCIsIGZpZWxkMiwgImxhYmVsIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWVsZDIsICJleHRlbmRlZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZycsICdpJywgZmllbGQyKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpZWxkMiwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBmaWVsZDIsICJleHRlbmRlZSIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJuIiwgIm8iLCBmaWVsZDMpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigibCIsICJtIiwgZmllbGQzLCAiZXh0ZW5kZWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ24nLCAnbycsIGZpZWxkMykpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBmaWVsZDMsICJleHRlbmRlZSIpKTsKIAogICAvLyBJZ25vcmUgdGhlc2UuCiAgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKQEAgLTE2NjIsMzIgKzI0MzMsMzIgQEAKIFRFU1RfRihTb3VyY2VJbmZvVGVzdCwgTmVzdGVkRXh0ZW5zaW9ucykgewogICBFWFBFQ1RfVFJVRShQYXJzZSgKICAgICAgICJtZXNzYWdlIE1lc3NhZ2Uge1xuIgotICAgICAgIiAgLyphKi9leHRlbmQgLypiKi9Gb28vKmMqLyB7XG4iCi0gICAgICAiICAgIC8qZCovb3B0aW9uYWwvKmUqLyBpbnQzMiBiYXIgPSAxOy8qZiovXG4iCi0gICAgICAiICAgIC8qZyovcmVwZWF0ZWQvKmgqLyBYLlkgYmF6ID0gMjsvKmkqL1xuIgotICAgICAgIiAgfS8qaiovXG4iCi0gICAgICAiICAvKmsqL2V4dGVuZCAvKmwqL0Jhci8qbSovIHtcbiIKLSAgICAgICIgICAgLypuKi9vcHRpb25hbCBpbnQzMiBxdXggPSAxOy8qbyovXG4iCi0gICAgICAiICB9LypwKi9cbiIKKyAgICAgICIgICRhJGV4dGVuZCAkYiRGb28kYyQge1xuIgorICAgICAgIiAgICAkZCRvcHRpb25hbCRlJCBpbnQzMiBiYXIgPSAxOyRmJFxuIgorICAgICAgIiAgICAkZyRyZXBlYXRlZCRoJCBYLlkgYmF6ID0gMjskaSRcbiIKKyAgICAgICIgIH0kaiRcbiIKKyAgICAgICIgICRrJGV4dGVuZCAkbCRCYXIkbSQge1xuIgorICAgICAgIiAgICAkbiRvcHRpb25hbCBpbnQzMiBxdXggPSAxOyRvJFxuIgorICAgICAgIiAgfSRwJFxuIgogICAgICAgIn1cbiIpKTsKIAogICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQxID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmV4dGVuc2lvbigwKTsKICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkMiA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5leHRlbnNpb24oMSk7CiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZDMgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uKDIpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaiIsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbiIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiayIsICJwIiwgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2onLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJleHRlbnNpb24iKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2snLCAncCcsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbiIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJkIiwgImYiLCBmaWVsZDEpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJlIiwgZmllbGQxLCAibGFiZWwiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIGZpZWxkMSwgImV4dGVuZGVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2YnLCBmaWVsZDEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdlJywgZmllbGQxLCAibGFiZWwiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpZWxkMSwgImV4dGVuZGVlIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImciLCAiaSIsIGZpZWxkMikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJnIiwgImgiLCBmaWVsZDIsICJsYWJlbCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgZmllbGQyLCAiZXh0ZW5kZWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaScsIGZpZWxkMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWVsZDIsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmllbGQyLCAiZXh0ZW5kZWUiKSk7CiAKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigibiIsICJvIiwgZmllbGQzKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImwiLCAibSIsIGZpZWxkMywgImV4dGVuZGVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCduJywgJ28nLCBmaWVsZDMpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbCcsICdtJywgZmllbGQzLCAiZXh0ZW5kZWUiKSk7CiAKICAgLy8gSWdub3JlIHRoZXNlLgogICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CkBAIC0xNzA4LDggKzI0NzksOCBAQAogVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFeHRlbnNpb25SYW5nZXMpIHsKICAgRVhQRUNUX1RSVUUoUGFyc2UoCiAgICAgICAibWVzc2FnZSBNZXNzYWdlIHtcbiIKLSAgICAgICIgIC8qYSovZXh0ZW5zaW9ucyAvKmIqLzEvKmMqLyB0byAvKmQqLzQvKmUqLywgLypmKi82LypnKi87LypoKi9cbiIKLSAgICAgICIgIC8qaSovZXh0ZW5zaW9ucyAvKmoqLzgvKmsqLyB0byAvKmwqL21heC8qbSovOy8qbiovXG4iCisgICAgICAiICAkYSRleHRlbnNpb25zICRiJDEkYyQgdG8gJGQkNCRlJCwgJGYkNiRnJDskaCRcbiIKKyAgICAgICIgICRpJGV4dGVuc2lvbnMgJGokOCRrJCB0byAkbCRtYXgkbSQ7JG4kXG4iCiAgICAgICAifVxuIikpOwogCiAgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHJhbmdlMSA9CkBAIC0xNzE5LDIwICsyNDkwLDQ1IEBACiAgIGNvbnN0IERlc2NyaXB0b3JQcm90bzo6RXh0ZW5zaW9uUmFuZ2UmIHJhbmdlMyA9CiAgICAgICBmaWxlXy5tZXNzYWdlX3R5cGUoMCkuZXh0ZW5zaW9uX3JhbmdlKDIpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaCIsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbl9yYW5nZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaSIsICJuIiwgZmlsZV8ubWVzc2FnZV90eXBlKDApLCAiZXh0ZW5zaW9uX3JhbmdlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2gnLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJleHRlbnNpb25fcmFuZ2UiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnbicsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKSwgImV4dGVuc2lvbl9yYW5nZSIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImUiLCByYW5nZTEpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgcmFuZ2UxLCAic3RhcnQiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImQiLCAiZSIsIHJhbmdlMSwgImVuZCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdlJywgcmFuZ2UxKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIHJhbmdlMSwgInN0YXJ0IikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCByYW5nZTEsICJlbmQiKSk7CiAKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgcmFuZ2UyKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImYiLCAiZyIsIHJhbmdlMiwgInN0YXJ0IikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJmIiwgImciLCByYW5nZTIsICJlbmQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIHJhbmdlMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCByYW5nZTIsICJzdGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgcmFuZ2UyLCAiZW5kIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImoiLCAibSIsIHJhbmdlMykpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJqIiwgImsiLCByYW5nZTMsICJzdGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigibCIsICJtIiwgcmFuZ2UzLCAiZW5kIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ20nLCByYW5nZTMpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaicsICdrJywgcmFuZ2UzLCAic3RhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2wnLCAnbScsIHJhbmdlMywgImVuZCIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5tZXNzYWdlX3R5cGUoMCksICJuYW1lIikpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIE9uZW9mcykgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICJtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICAkYSRvbmVvZiAkYyRmb28kZCQge1xuIgorICAgICAgIiAgICAkZSRpbnQzMiRmJCAkZyRhJGgkID0gJGkkMSRqJDskayRcbiIKKyAgICAgICIgIH0kciRcbiIKKyAgICAgICJ9XG4iKSk7CisKKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIG9uZW9mX2RlY2wgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkub25lb2ZfZGVjbCgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZpZWxkID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmZpZWxkKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAncicsIG9uZW9mX2RlY2wpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgb25lb2ZfZGVjbCwgIm5hbWUiKSk7CisKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdrJywgZmllbGQpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgZmllbGQsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWVsZCwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnaicsIGZpZWxkLCAibnVtYmVyIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTc0MywyMiArMjUzOSwyMiBAQAogVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBOZXN0ZWRNZXNzYWdlcykgewogICBFWFBFQ1RfVFJVRShQYXJzZSgKICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgICAiICAvKmEqL21lc3NhZ2UgLypiKi9CYXIvKmMqLyB7XG4iCi0gICAgICAiICAgIC8qZCovbWVzc2FnZSAvKmUqL0Jhei8qZiovIHt9LypnKi9cbiIKLSAgICAgICIgIH0vKmgqL1xuIgotICAgICAgIiAgLyppKi9tZXNzYWdlIC8qaiovUXV4LyprKi8ge30vKmwqL1xuIgorICAgICAgIiAgJGEkbWVzc2FnZSAkYiRCYXIkYyQge1xuIgorICAgICAgIiAgICAkZCRtZXNzYWdlICRlJEJheiRmJCB7fSRnJFxuIgorICAgICAgIiAgfSRoJFxuIgorICAgICAgIiAgJGkkbWVzc2FnZSAkaiRRdXgkayQge30kbCRcbiIKICAgICAgICJ9XG4iKSk7CiAKICAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCkubmVzdGVkX3R5cGUoMCk7CiAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgYmF6ID0gYmFyLm5lc3RlZF90eXBlKDApOwogICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHF1eCA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgxKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImgiLCBiYXIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgYmFyLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJnIiwgYmF6KSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImUiLCAiZiIsIGJheiwgIm5hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImkiLCAibCIsIHF1eCkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJqIiwgImsiLCBxdXgsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2gnLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZCcsICdnJywgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnbCcsIHF1eCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCBxdXgsICJuYW1lIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTc3MCw5ICsyNTY2LDkgQEAKICAgRVhQRUNUX1RSVUUoUGFyc2UoCiAgICAgICAibWVzc2FnZSBGb28ge1xuIgogICAgICAgIiAgbWVzc2FnZSBCYXIge31cbiIKLSAgICAgICIgIC8qYSovb3B0aW9uYWwvKmIqLyAvKmMqL2dyb3VwLypkKi8gLyplKi9CYXovKmYqLyA9IC8qZyovMS8qaCovIHtcbiIKLSAgICAgICIgICAgLyppKi9tZXNzYWdlIFF1eCB7fS8qaiovXG4iCi0gICAgICAiICB9LyprKi9cbiIKKyAgICAgICIgICRhJG9wdGlvbmFsJGIkICRjJGdyb3VwJGQkICRlJEJheiRmJCA9ICRnJDEkaCQge1xuIgorICAgICAgIiAgICAkaSRtZXNzYWdlIFF1eCB7fSRqJFxuIgorICAgICAgIiAgfSRrJFxuIgogICAgICAgIn1cbiIpKTsKIAogICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5uZXN0ZWRfdHlwZSgwKTsKQEAgLTE3ODAsMTYgKzI1NzYsMTYgQEAKICAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBxdXggPSBiYXoubmVzdGVkX3R5cGUoMCk7CiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZCA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5maWVsZCgwKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImsiLCBmaWVsZCkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImIiLCBmaWVsZCwgImxhYmVsIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJjIiwgImQiLCBmaWVsZCwgInR5cGUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImUiLCAiZiIsIGZpZWxkLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJmIiwgZmllbGQsICJ0eXBlX25hbWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImciLCAiaCIsIGZpZWxkLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2snLCBmaWVsZCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2InLCBmaWVsZCwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBmaWVsZCwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGZpZWxkLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZScsICdmJywgZmllbGQsICJ0eXBlX25hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2cnLCAnaCcsIGZpZWxkLCAibnVtYmVyIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiayIsIGJheikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJlIiwgImYiLCBiYXosICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJpIiwgImoiLCBxdXgpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdrJywgYmF6KSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnZicsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAnaicsIHF1eCkpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTgwMiwxMyArMjU5OCwxMyBAQAogCiBURVNUX0YoU291cmNlSW5mb1Rlc3QsIEVudW1zKSB7CiAgIEVYUEVDVF9UUlVFKFBhcnNlKAotICAgICAgIi8qYSovZW51bSAvKmIqL0Zvby8qYyovIHt9LypkKi9cbiIKLSAgICAgICIvKmUqL2VudW0gLypmKi9CYXIvKmcqLyB7fS8qaCovXG4iKSk7CisgICAgICAiJGEkZW51bSAkYiRGb28kYyQge30kZCRcbiIKKyAgICAgICIkZSRlbnVtICRmJEJhciRnJCB7fSRoJFxuIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiZCIsIGZpbGVfLmVudW1fdHlwZSgwKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWxlXy5lbnVtX3R5cGUoMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJlIiwgImgiLCBmaWxlXy5lbnVtX3R5cGUoMSkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgZmlsZV8uZW51bV90eXBlKDEpLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdkJywgZmlsZV8uZW51bV90eXBlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpbGVfLmVudW1fdHlwZSgwKSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2UnLCAnaCcsIGZpbGVfLmVudW1fdHlwZSgxKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBmaWxlXy5lbnVtX3R5cGUoMSksICJuYW1lIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTgxNywxOSArMjYxMywxOSBAQAogVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBFbnVtVmFsdWVzKSB7CiAgIEVYUEVDVF9UUlVFKFBhcnNlKAogICAgICAgImVudW0gRm9vIHtcbiIKLSAgICAgICIgIC8qYSovQkFSLypiKi8gPSAvKmMqLzEvKmQqLzsvKmUqL1xuIgotICAgICAgIiAgLypmKi9CQVovKmcqLyA9IC8qaCovMi8qaSovOy8qaiovXG4iCisgICAgICAiICAkYSRCQVIkYiQgPSAkYyQxJGQkOyRlJFxuIgorICAgICAgIiAgJGYkQkFaJGckID0gJGgkMiRpJDskaiRcbiIKICAgICAgICJ9IikpOwogCiAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8uZW51bV90eXBlKDApLnZhbHVlKDApOwogICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGJheiA9IGZpbGVfLmVudW1fdHlwZSgwKS52YWx1ZSgxKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImUiLCBiYXIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYSIsICJiIiwgYmFyLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYyIsICJkIiwgYmFyLCAibnVtYmVyIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJmIiwgImoiLCBiYXopKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgYmF6LCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaCIsICJpIiwgYmF6LCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2UnLCBiYXIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdiJywgYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgYmFyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2onLCBiYXopKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgYmF6LCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignaCcsICdpJywgYmF6LCAibnVtYmVyIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTg0MCwxNyArMjYzNiwxNyBAQAogVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBOZXN0ZWRFbnVtcykgewogICBFWFBFQ1RfVFJVRShQYXJzZSgKICAgICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgICAiICAvKmEqL2VudW0gLypiKi9CYXIvKmMqLyB7fS8qZCovXG4iCi0gICAgICAiICAvKmUqL2VudW0gLypmKi9CYXovKmcqLyB7fS8qaCovXG4iCisgICAgICAiICAkYSRlbnVtICRiJEJhciRjJCB7fSRkJFxuIgorICAgICAgIiAgJGUkZW51bSAkZiRCYXokZyQge30kaCRcbiIKICAgICAgICJ9XG4iKSk7CiAKICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmFyID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgwKTsKICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgYmF6ID0gZmlsZV8ubWVzc2FnZV90eXBlKDApLmVudW1fdHlwZSgxKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImQiLCBiYXIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgYmFyLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJoIiwgYmF6KSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImYiLCAiZyIsIGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZCcsIGJhcikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBiYXIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2gnLCBiYXopKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignZicsICdnJywgYmF6LCAibmFtZSIpKTsKIAogICAvLyBJZ25vcmUgdGhlc2UuCiAgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKQEAgLTE4NjAsMzcgKzI2NTYsMzcgQEAKIAogVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBTZXJ2aWNlcykgewogICBFWFBFQ1RfVFJVRShQYXJzZSgKLSAgICAgICIvKmEqL3NlcnZpY2UgLypiKi9Gb28vKmMqLyB7fS8qZCovXG4iCi0gICAgICAiLyplKi9zZXJ2aWNlIC8qZiovQmFyLypnKi8ge30vKmgqL1xuIikpOworICAgICAgIiRhJHNlcnZpY2UgJGIkRm9vJGMkIHt9JGQkXG4iCisgICAgICAiJGUkc2VydmljZSAkZiRCYXIkZyQge30kaCRcbiIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImQiLCBmaWxlXy5zZXJ2aWNlKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIGZpbGVfLnNlcnZpY2UoMCksICJuYW1lIikpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJlIiwgImgiLCBmaWxlXy5zZXJ2aWNlKDEpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImYiLCAiZyIsIGZpbGVfLnNlcnZpY2UoMSksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2QnLCBmaWxlXy5zZXJ2aWNlKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIGZpbGVfLnNlcnZpY2UoMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2gnLCBmaWxlXy5zZXJ2aWNlKDEpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIGZpbGVfLnNlcnZpY2UoMSksICJuYW1lIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwogfQogCi1URVNUX0YoU291cmNlSW5mb1Rlc3QsIE1ldGhvZHMpIHsKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgTWV0aG9kc0FuZFN0cmVhbXMpIHsKICAgRVhQRUNUX1RSVUUoUGFyc2UoCiAgICAgICAic2VydmljZSBGb28ge1xuIgotICAgICAgIiAgLyphKi9ycGMgLypiKi9CYXIvKmMqLygvKmQqL1gvKmUqLykgcmV0dXJucygvKmYqL1kvKmcqLyk7LypoKi8iCi0gICAgICAiICAvKmkqL3JwYyAvKmoqL0Jhei8qayovKC8qbCovWi8qbSovKSByZXR1cm5zKC8qbiovVy8qbyovKTsvKnAqLyIKKyAgICAgICIgICRhJHJwYyAkYiRCYXIkYyQoJGQkWCRlJCkgcmV0dXJucygkZiRZJGckKTskaCQiCisgICAgICAiICAkaSRycGMgJGokQmF6JGskKCRsJFokbSQpIHJldHVybnMoJG4kVyRvJCk7JHAkIgogICAgICAgIn0iKSk7CiAKICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKTsKICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBiYXogPSBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImgiLCBiYXIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgYmFyLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJlIiwgYmFyLCAiaW5wdXRfdHlwZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgYmFyLCAib3V0cHV0X3R5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaCcsIGJhcikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBiYXIsICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBiYXIsICJpbnB1dF90eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdmJywgJ2cnLCBiYXIsICJvdXRwdXRfdHlwZSIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJpIiwgInAiLCBiYXopKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaiIsICJrIiwgYmF6LCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigibCIsICJtIiwgYmF6LCAiaW5wdXRfdHlwZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigibiIsICJvIiwgYmF6LCAib3V0cHV0X3R5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2knLCAncCcsIGJheikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdqJywgJ2snLCBiYXosICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBiYXosICJpbnB1dF90eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCduJywgJ28nLCBiYXosICJvdXRwdXRfdHlwZSIpKTsKIAogICAvLyBJZ25vcmUgdGhlc2UuCiAgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKQEAgLTE4OTgsMTUgKzI2OTQsMTYgQEAKICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLCAibmFtZSIpKTsKIH0KIAorCiBURVNUX0YoU291cmNlSW5mb1Rlc3QsIE9wdGlvbnMpIHsKICAgRVhQRUNUX1RSVUUoUGFyc2UoCi0gICAgICAiLyphKi9vcHRpb24gLypiKi9mb28vKmMqLy4vKmQqLygvKmUqL2Jhci5iYXovKmYqLykvKmcqLyA9ICIKLSAgICAgICAgICAiLypoKi8xMjMvKmkqLzsvKmoqL1xuIgotICAgICAgIi8qayovb3B0aW9uIHF1eCA9IC8qbCovLTEyMy8qbSovOy8qbiovXG4iCi0gICAgICAiLypvKi9vcHRpb24gY29yZ2UgPSAvKnAqL2FiYy8qcSovOy8qciovXG4iCi0gICAgICAiLypzKi9vcHRpb24gZ3JhdWx0ID0gLyp0Ki8nYmxhaCcvKnUqLzsvKnYqL1xuIgotICAgICAgIi8qdyovb3B0aW9uIGdhcnBseSA9IC8qeCoveyB5YWRkYSB5YWRkYSB9Lyp5Ki87Lyp6Ki9cbiIKLSAgICAgICIvKjAqL29wdGlvbiB3YWxkbyA9IC8qMSovMTIzLjAvKjIqLzsvKjMqL1xuIgorICAgICAgIiRhJG9wdGlvbiAkYiRmb28kYyQuJGQkKCRlJGJhci5iYXokZiQpJGckID0gIgorICAgICAgICAgICIkaCQxMjMkaSQ7JGokXG4iCisgICAgICAiJGskb3B0aW9uIHF1eCA9ICRsJC0xMjMkbSQ7JG4kXG4iCisgICAgICAiJG8kb3B0aW9uIGNvcmdlID0gJHAkYWJjJHEkOyRyJFxuIgorICAgICAgIiRzJG9wdGlvbiBncmF1bHQgPSAkdCQnYmxhaCckdSQ7JHYkXG4iCisgICAgICAiJHckb3B0aW9uIGdhcnBseSA9ICR4JHsgeWFkZGEgeWFkZGEgfSR5JDskeiRcbiIKKyAgICAgICIkMCRvcHRpb24gd2FsZG8gPSAkMSQxMjMuMCQyJDskMyRcbiIKICAgKSk7CiAKICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMSA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKTsKQEAgLTE5MTYsMjkgKzI3MTMsMjkgQEAKICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNSA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbig0KTsKICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uNiA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbig1KTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImoiLCBmaWxlXy5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJpIiwgb3B0aW9uMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImciLCBvcHRpb24xLCAibmFtZSIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgb3B0aW9uMS5uYW1lKDApKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImIiLCAiYyIsIG9wdGlvbjEubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZCIsICJnIiwgb3B0aW9uMS5uYW1lKDEpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImUiLCAiZiIsIG9wdGlvbjEubmFtZSgxKSwgIm5hbWVfcGFydCIpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiaCIsICJpIiwgb3B0aW9uMSwgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYScsICdqJywgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnaicsIG9wdGlvbjEpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdnJywgb3B0aW9uMSwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2InLCAnYycsIG9wdGlvbjEubmFtZSgwKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBvcHRpb24xLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZycsIG9wdGlvbjEubmFtZSgxKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBvcHRpb24xLm5hbWUoMSksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2gnLCAnaScsIG9wdGlvbjEsICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7CiAKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiayIsICJuIiwgZmlsZV8ub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImwiLCAibSIsIG9wdGlvbjIsICJuZWdhdGl2ZV9pbnRfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2snLCAnbicsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdsJywgJ20nLCBvcHRpb24yLCAibmVnYXRpdmVfaW50X3ZhbHVlIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oIm8iLCAiciIsIGZpbGVfLm9wdGlvbnMoKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJwIiwgInEiLCBvcHRpb24zLCAiaWRlbnRpZmllcl92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignbycsICdyJywgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3AnLCAncScsIG9wdGlvbjMsICJpZGVudGlmaWVyX3ZhbHVlIikpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oInMiLCAidiIsIGZpbGVfLm9wdGlvbnMoKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJ0IiwgInUiLCBvcHRpb240LCAic3RyaW5nX3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdzJywgJ3YnLCBmaWxlXy5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigndCcsICd1Jywgb3B0aW9uNCwgInN0cmluZ192YWx1ZSIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJ3IiwgInoiLCBmaWxlXy5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigieCIsICJ5Iiwgb3B0aW9uNSwgImFnZ3JlZ2F0ZV92YWx1ZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigndycsICd6JywgZmlsZV8ub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ3gnLCAneScsIG9wdGlvbjUsICJhZ2dyZWdhdGVfdmFsdWUiKSk7CiAKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiMCIsICIzIiwgZmlsZV8ub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oIjEiLCAiMiIsIG9wdGlvbjYsICJkb3VibGVfdmFsdWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJzAnLCAnMycsIGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCcxJywgJzInLCBvcHRpb242LCAiZG91YmxlX3ZhbHVlIikpOwogCiAgIC8vIElnbm9yZSB0aGVzZS4KICAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOwpAQCAtMTk2NywyMiArMjc2NCwyNSBAQAogVEVTVF9GKFNvdXJjZUluZm9UZXN0LCBTY29wZWRPcHRpb25zKSB7CiAgIEVYUEVDVF9UUlVFKFBhcnNlKAogICAgICJtZXNzYWdlIEZvbyB7XG4iCi0gICAgIiAgLyphKi9vcHRpb24gbW9wdCA9IDE7LypiKi9cbiIKKyAgICAiICAkYSRvcHRpb24gbW9wdCA9IDE7JGIkXG4iCiAgICAgIn1cbiIKICAgICAiZW51bSBCYXIge1xuIgotICAgICIgIC8qYyovb3B0aW9uIGVvcHQgPSAxOy8qZCovXG4iCisgICAgIiAgJGMkb3B0aW9uIGVvcHQgPSAxOyRkJFxuIgogICAgICJ9XG4iCiAgICAgInNlcnZpY2UgQmF6IHtcbiIKLSAgICAiICAvKmUqL29wdGlvbiBzb3B0ID0gMTsvKmYqL1xuIgorICAgICIgICRlJG9wdGlvbiBzb3B0ID0gMTskZiRcbiIKICAgICAiICBycGMgTShYKSByZXR1cm5zKFkpIHtcbiIKLSAgICAiICAgIC8qZyovb3B0aW9uIG1vcHQgPSAxOy8qaCovXG4iCisgICAgIiAgICAkZyRvcHRpb24gbW9wdCA9IDE7JGgkXG4iCisgICAgIiAgfVxuIgorICAgICIgIHJwYyBNUzQoJDEkc3RyZWFtJDIkIFgpIHJldHVybnMoJDMkc3RyZWFtJDQkIFkpIHtcbiIKKyAgICAiICAgICRrJG9wdGlvbiBtb3B0ID0gMTskbCRcbiIKICAgICAiICB9XG4iCiAgICAgIn1cbiIpKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImIiLCBmaWxlXy5tZXNzYWdlX3R5cGUoMCkub3B0aW9ucygpKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImMiLCAiZCIsIGZpbGVfLmVudW1fdHlwZSgwKS5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZSIsICJmIiwgZmlsZV8uc2VydmljZSgwKS5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZyIsICJoIiwgZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMCkub3B0aW9ucygpKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpbGVfLm1lc3NhZ2VfdHlwZSgwKS5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYycsICdkJywgZmlsZV8uZW51bV90eXBlKDApLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdlJywgJ2YnLCBmaWxlXy5zZXJ2aWNlKDApLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdnJywgJ2gnLCBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgwKS5vcHRpb25zKCkpKTsKIAogICAvLyBJZ25vcmUgdGhlc2UuCiAgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKQEAgLTIwMzYsNiArMjgzNiwyNiBAQAogICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApLCAibmFtZV9wYXJ0IikpOwogICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDApLm9wdGlvbnMoKQogICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKSwgInBvc2l0aXZlX2ludF92YWx1ZSIpKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdrJywgJ2wnLCBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKS5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKSwgImlucHV0X3R5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSksICJvdXRwdXRfdHlwZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKS5vcHRpb25zKCkKKyAgICAgICAgICAgICAgICAgICAgICAudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLnNlcnZpY2UoMCkubWV0aG9kKDEpLm9wdGlvbnMoKQorICAgICAgICAgICAgICAgICAgICAgIC51bmludGVycHJldGVkX29wdGlvbigwKS5uYW1lKDApKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCksICJuYW1lX3BhcnQiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSkub3B0aW9ucygpCisgICAgICAgICAgICAgICAgICAgICAgLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAicG9zaXRpdmVfaW50X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCcxJywgJzInLCBmaWxlXy5zZXJ2aWNlKDApLm1ldGhvZCgxKSwKKyAgICAgICAgICAgICAgICAgICAgICAiY2xpZW50X3N0cmVhbWluZyIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignMycsICc0JywgZmlsZV8uc2VydmljZSgwKS5tZXRob2QoMSksCisgICAgICAgICAgICAgICAgICAgICAgInNlcnZlcl9zdHJlYW1pbmciKSk7CiB9CiAKIFRFU1RfRihTb3VyY2VJbmZvVGVzdCwgRmllbGRPcHRpb25zKSB7CkBAIC0yMDQ1LDggKzI4NjUsOCBAQAogICBFWFBFQ1RfVFJVRShQYXJzZSgKICAgICAgICJtZXNzYWdlIEZvbyB7IgogICAgICAgIiAgb3B0aW9uYWwgaW50MzIgYmFyID0gMSAiCi0gICAgICAgICAgIi8qYSovW2RlZmF1bHQ9LypiKi8xMjMvKmMqLywvKmQqL29wdDE9MTIzLyplKi8sIgotICAgICAgICAgICIvKmYqL29wdDI9J2hpJy8qZyovXS8qaCovOyIKKyAgICAgICAgICAiJGEkW2RlZmF1bHQ9JGIkMTIzJGMkLCRkJG9wdDE9MTIzJGUkLCIKKyAgICAgICAgICAiJGYkb3B0Mj0naGknJGckXSRoJDsiCiAgICAgICAifVxuIgogICApKTsKIApAQCAtMjA1NCwxMCArMjg3NCwxMCBAQAogICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24xID0gZmllbGQub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApOwogICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24yID0gZmllbGQub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDEpOwogCi0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImEiLCAiaCIsIGZpZWxkLm9wdGlvbnMoKSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJiIiwgImMiLCBmaWVsZCwgImRlZmF1bHRfdmFsdWUiKSk7Ci0gIEVYUEVDVF9UUlVFKEhhc1NwYW4oImQiLCAiZSIsIG9wdGlvbjEpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiZiIsICJnIiwgb3B0aW9uMikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdhJywgJ2gnLCBmaWVsZC5vcHRpb25zKCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbignYicsICdjJywgZmllbGQsICJkZWZhdWx0X3ZhbHVlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdkJywgJ2UnLCBvcHRpb24xKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2YnLCAnZycsIG9wdGlvbjIpKTsKIAogICAvLyBJZ25vcmUgdGhlc2UuCiAgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKQEAgLTIwODQsNyArMjkwNCw3IEBACiAgIC8vIHN5bnRheCB1c2VkIGZvciBlbnVtIG9wdGlvbnMgaXMgdW5kZXJzdG9vZC4KICAgRVhQRUNUX1RSVUUoUGFyc2UoCiAgICAgICAiZW51bSBGb28geyIKLSAgICAgICIgIEJBUiA9IDEgLyphKi9bLypiKi9vcHQxPTEyMy8qYyovLC8qZCovb3B0Mj0naGknLyplKi9dLypmKi87IgorICAgICAgIiAgQkFSID0gMSAkYSRbJGIkb3B0MT0xMjMkYyQsJGQkb3B0Mj0naGknJGUkXSRmJDsiCiAgICAgICAifVxuIgogICApKTsKIApAQCAtMjA5Miw5ICsyOTEyLDkgQEAKICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMSA9IHZhbHVlLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKTsKICAgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgb3B0aW9uMiA9IHZhbHVlLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigxKTsKIAotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJhIiwgImYiLCB2YWx1ZS5vcHRpb25zKCkpKTsKLSAgRVhQRUNUX1RSVUUoSGFzU3BhbigiYiIsICJjIiwgb3B0aW9uMSkpOwotICBFWFBFQ1RfVFJVRShIYXNTcGFuKCJkIiwgImUiLCBvcHRpb24yKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnZicsIHZhbHVlLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdiJywgJ2MnLCBvcHRpb24xKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2QnLCAnZScsIG9wdGlvbjIpKTsKIAogICAvLyBJZ25vcmUgdGhlc2UuCiAgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKQEAgLTIxMTMsNiArMjkzMywyMjEgQEAKICAgRVhQRUNUX1RSVUUoSGFzU3BhbihvcHRpb24yLCAic3RyaW5nX3ZhbHVlIikpOwogfQogCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIi8vIEZvbyBsZWFkaW5nXG4iCisgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAiJGEkbWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgLy8gRm9vIHRyYWlsaW5nXG4iCisgICAgICAiICAvLyBsaW5lIDJcbiIKKyAgICAgICJcbiIKKyAgICAgICIgIC8vIGRldGFjaGVkXG4iCisgICAgICAiXG4iCisgICAgICAiICAvLyBiYXIgbGVhZGluZ1xuIgorICAgICAgIiAgJGIkb3B0aW9uYWwgaW50MzIgYmFyID0gMTskYyRcbiIKKyAgICAgICIgIC8vIGJhciB0cmFpbGluZ1xuIgorICAgICAgIn0kZCRcbiIKKyAgICAgICIvLyBpZ25vcmVkXG4iCisgICkpOworCisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgZm9vID0gZmlsZV8ubWVzc2FnZV90eXBlKDApOworICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgYmFyID0gZm9vLmZpZWxkKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnYScsICdkJywgZm9vLAorICAgICAgIiBGb28gbGVhZGluZ1xuIGxpbmUgMlxuIiwKKyAgICAgICIgRm9vIHRyYWlsaW5nXG4gbGluZSAyXG4iLAorICAgICAgTlVMTCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2InLCAnYycsIGJhciwKKyAgICAgICIgYmFyIGxlYWRpbmdcbiIsCisgICAgICAiIGJhciB0cmFpbGluZ1xuIiwKKyAgICAgICIgZGV0YWNoZWRcbiIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28sICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJudW1iZXIiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRG9jQ29tbWVudHMyKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIi8vIGRldGFjaGVkIGJlZm9yZSBtZXNzYWdlLlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIEZvbyBsZWFkaW5nXG4iCisgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAiJGEkbWVzc2FnZSBGb28ge1xuIgorICAgICAgIiAgLyogRm9vIHRyYWlsaW5nXG4iCisgICAgICAiICAgKiBsaW5lIDIgKi9cbiIKKyAgICAgICIgIC8vIGRldGFjaGVkXG4iCisgICAgICAiICAvKiBiYXIgbGVhZGluZ1xuIgorICAgICAgIiAgICovIgorICAgICAgIiAgJGIkb3B0aW9uYWwgaW50MzIgYmFyID0gMTskYyQgIC8vIGJhciB0cmFpbGluZ1xuIgorICAgICAgIiAgLy8gaWdub3JlZCBkZXRhY2hlZFxuIgorICAgICAgIn0kZCRcbiIKKyAgICAgICIvLyBpZ25vcmVkXG4iCisgICAgICAiXG4iCisgICAgICAiLy8gZGV0YWNoZWQgYmVmb3JlIG9wdGlvblxuIgorICAgICAgIlxuIgorICAgICAgIi8vIG9wdGlvbiBsZWFkaW5nXG4iCisgICAgICAiJGUkb3B0aW9uIGJheiA9IDEyMzskZiRcbiIKKyAgICAgICIvLyBvcHRpb24gdHJhaWxpbmdcbiIKKyAgKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBmb28gPSBmaWxlXy5tZXNzYWdlX3R5cGUoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBiYXIgPSBmb28uZmllbGQoMCk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24mIGJheiA9IGZpbGVfLm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbigwKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2EnLCAnZCcsIGZvbywKKyAgICAgICIgRm9vIGxlYWRpbmdcbiBsaW5lIDJcbiIsCisgICAgICAiIEZvbyB0cmFpbGluZ1xuIGxpbmUgMiAiLAorICAgICAgIiBkZXRhY2hlZCBiZWZvcmUgbWVzc2FnZS5cbiIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbldpdGhDb21tZW50KCdiJywgJ2MnLCBiYXIsCisgICAgICAiIGJhciBsZWFkaW5nXG4iLAorICAgICAgIiBiYXIgdHJhaWxpbmdcbiIsCisgICAgICAiIGRldGFjaGVkXG4iKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnZScsICdmJywgYmF6LAorICAgICAgIiBvcHRpb24gbGVhZGluZ1xuIiwKKyAgICAgICIgb3B0aW9uIHRyYWlsaW5nXG4iLAorICAgICAgIiBkZXRhY2hlZCBiZWZvcmUgb3B0aW9uXG4iKSk7CisKKyAgLy8gSWdub3JlIHRoZXNlLgorICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZm9vLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJsYWJlbCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJ0eXBlIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibnVtYmVyIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGZpbGVfLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJheiwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmF6Lm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXoubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXosICJwb3NpdGl2ZV9pbnRfdmFsdWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRG9jQ29tbWVudHMzKSB7CisgIEVYUEVDVF9UUlVFKFBhcnNlKAorICAgICAgIiRhJG1lc3NhZ2UgRm9vIHtcbiIKKyAgICAgICIgIC8vIGJhciBsZWFkaW5nXG4iCisgICAgICAiICAkYiRvcHRpb25hbCBpbnQzMiBiYXIgPSAxIFsoYmF6LnF1eCkgPSB7fV07JGMkXG4iCisgICAgICAiICAvLyBiYXIgdHJhaWxpbmdcbiIKKyAgICAgICJ9JGQkXG4iCisgICAgICAiLy8gaWdub3JlZFxuIgorICApKTsKKworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZvbyA9IGZpbGVfLm1lc3NhZ2VfdHlwZSgwKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGJhciA9IGZvby5maWVsZCgwKTsKKworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2InLCAnYycsIGJhciwKKyAgICAgICIgYmFyIGxlYWRpbmdcbiIsCisgICAgICAiIGJhciB0cmFpbGluZ1xuIiwKKyAgICAgIE5VTEwpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28sICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgImxhYmVsIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIsICJudW1iZXIiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyLm9wdGlvbnMoKSkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhci5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLCAibmFtZSIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihiYXIub3B0aW9ucygpLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKDApLm5hbWUoMCkpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigKKyAgICAgIGJhci5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCkubmFtZSgwKSwgIm5hbWVfcGFydCIpKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3BhbigKKyAgICAgIGJhci5vcHRpb25zKCkudW5pbnRlcnByZXRlZF9vcHRpb24oMCksICJhZ2dyZWdhdGVfdmFsdWUiKSk7Cit9CisKK1RFU1RfRihTb3VyY2VJbmZvVGVzdCwgRG9jQ29tbWVudHNUb3BMZXZlbCkgeworICBFWFBFQ1RfVFJVRShQYXJzZSgKKyAgICAgICIvLyBkZXRhY2hlZCBiZWZvcmUgc3ludGF4IHBhcmFncmFwaCAxXG4iCisgICAgICAiXG4iCisgICAgICAiLy8gZGV0YWNoZWQgYmVmb3JlIHN5bnRheCBwYXJhZ3JhcGggMlxuIgorICAgICAgIlxuIgorICAgICAgIi8vIHN5bnRheCBsZWFkaW5nXG4iCisgICAgICAiJGEkc3ludGF4ID0gXCJwcm90bzJcIjskYiRcbiIKKyAgICAgICIvLyBzeW50YXggdHJhaWxpbmdcbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBzeW50YXgtcGFja2FnZSBkZXRhY2hlZCBjb21tZW50c1xuIgorICAgICAgIlxuIgorICAgICAgIjtcbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBkZXRhY2hlZCBhZnRlciBlbXB0eSBiZWZvcmUgcGFja2FnZVxuIgorICAgICAgIlxuIgorICAgICAgIi8vIHBhY2thZ2UgbGVhZGluZ1xuIgorICAgICAgInBhY2thZ2UgJGMkZm9vJGQkO1xuIgorICAgICAgIi8vIHBhY2thZ2UgdHJhaWxpbmdcbiIKKyAgICAgICJcbiIKKyAgICAgICIvLyBpZ25vcmVkIGRldGFjaFxuIgorICAgICAgIlxuIikpOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oJ2EnLCAnYicsIGZpbGVfLCAic3ludGF4IiwgLTEsCisgICAgICAiIHN5bnRheCBsZWFkaW5nXG4iLAorICAgICAgIiBzeW50YXggdHJhaWxpbmdcbiIsCisgICAgICAiIGRldGFjaGVkIGJlZm9yZSBzeW50YXggcGFyYWdyYXBoIDFcbiIKKyAgICAgICJcbiIKKyAgICAgICIgZGV0YWNoZWQgYmVmb3JlIHN5bnRheCBwYXJhZ3JhcGggMlxuIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKCdjJywgJ2QnLCBmaWxlXywgInBhY2thZ2UiLCAtMSwKKyAgICAgICIgcGFja2FnZSBsZWFkaW5nXG4iLAorICAgICAgIiBwYWNrYWdlIHRyYWlsaW5nXG4iLAorICAgICAgIiBzeW50YXgtcGFja2FnZSBkZXRhY2hlZCBjb21tZW50c1xuIgorICAgICAgIlxuIgorICAgICAgIiBkZXRhY2hlZCBhZnRlciBlbXB0eSBiZWZvcmUgcGFja2FnZVxuIikpOworCisgIC8vIGlnbm9yZSB0aGVzZS4KKyAgRVhQRUNUX1RSVUUoSGFzU3BhbihmaWxlXykpOworfQorCitURVNUX0YoU291cmNlSW5mb1Rlc3QsIERvY0NvbW1lbnRzT25lb2YpIHsKKyAgRVhQRUNUX1RSVUUoUGFyc2UoCisgICAgICAiLy8gRm9vIGxlYWRpbmdcbiIKKyAgICAgICIkYSRtZXNzYWdlIEZvbyB7XG4iCisgICAgICAiICAvKiBGb28gdHJhaWxpbmdcbiIKKyAgICAgICIgICAqL1xuIgorICAgICAgIiAgLy8gZGV0YWNoZWQgYmVmb3JlIG9uZW9mXG4iCisgICAgICAiICAvKiBiYXIgbGVhZGluZ1xuIgorICAgICAgIiAgICogbGluZSAyICovXG4iCisgICAgICAiICAkYiRvbmVvZiBiYXIge1xuIgorICAgICAgIiAgLyogYmFyIHRyYWlsaW5nXG4iCisgICAgICAiICAgKiBsaW5lIDIgKi9cbiIKKyAgICAgICIgIC8vIGRldGFjaGVkIGJlZm9yZSBiYXJfaW50XG4iCisgICAgICAiICAvKiBiYXJfaW50IGxlYWRpbmdcbiIKKyAgICAgICIgICAqL1xuIgorICAgICAgIiAgJGMkaW50MzIgYmFyX2ludCA9IDE7JGQkICAvLyBiYXJfaW50IHRyYWlsaW5nXG4iCisgICAgICAiICAvLyBkZXRhY2ggY29tbWVudCBpZ25vcmVkXG4iCisgICAgICAiICB9JGUkXG4iCisgICAgICAifSRmJFxuIikpOworCisgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgZm9vID0gZmlsZV8ubWVzc2FnZV90eXBlKDApOworICBjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgYmFyID0gZm9vLm9uZW9mX2RlY2woMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBiYXJfaW50ID0gZm9vLmZpZWxkKDApOworCisgIEVYUEVDVF9UUlVFKEhhc1NwYW5XaXRoQ29tbWVudCgnYScsICdmJywgZm9vLAorICAgICAgIiBGb28gbGVhZGluZ1xuIiwKKyAgICAgICIgRm9vIHRyYWlsaW5nXG4iLAorICAgICAgTlVMTCkpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2InLCAnZScsIGJhciwKKyAgICAgICIgYmFyIGxlYWRpbmdcbiBsaW5lIDIgIiwKKyAgICAgICIgYmFyIHRyYWlsaW5nXG4gbGluZSAyICIsCisgICAgICAiIGRldGFjaGVkIGJlZm9yZSBvbmVvZlxuIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuV2l0aENvbW1lbnQoJ2MnLCAnZCcsIGJhcl9pbnQsCisgICAgICAiIGJhcl9pbnQgbGVhZGluZ1xuIiwKKyAgICAgICIgYmFyX2ludCB0cmFpbGluZ1xuIiwKKyAgICAgICIgZGV0YWNoZWQgYmVmb3JlIGJhcl9pbnRcbiIpKTsKKworICAvLyBJZ25vcmUgdGhlc2UuCisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oZmlsZV8pKTsKKyAgRVhQRUNUX1RSVUUoSGFzU3Bhbihmb28sICJuYW1lIikpOworICBFWFBFQ1RfVFJVRShIYXNTcGFuKGJhciwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyX2ludCwgInR5cGUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyX2ludCwgIm5hbWUiKSk7CisgIEVYUEVDVF9UUlVFKEhhc1NwYW4oYmFyX2ludCwgIm51bWJlciIpKTsKK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uY2MKaW5kZXggNzI3Zjk0Mi4uMmZmNTBmNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDgsNiArNDgsNyBAQAogI2luY2x1ZGUgPHVuaXN0ZC5oPgogI2VuZGlmCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvZGVfZ2VuZXJhdG9yLmg+CkBAIC05MiwxMCArOTMsNjkgQEAKICAgY29uc3QgdmVjdG9yPGNvbnN0IEZpbGVEZXNjcmlwdG9yKj4mIHBhcnNlZF9maWxlc187CiB9OwogCitib29sIEdlbmVyYXRlQ29kZShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgcmVxdWVzdCwKKyAgICBjb25zdCBDb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2UsCisgICAgc3RyaW5nKiBlcnJvcl9tc2cpIHsKKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0LnByb3RvX2ZpbGVfc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKHJlcXVlc3QucHJvdG9fZmlsZShpKSk7CisgICAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgICAgLy8gQnVpbGRGaWxlKCkgYWxyZWFkeSB3cm90ZSBhbiBlcnJvciBtZXNzYWdlLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKKyAgICBwYXJzZWRfZmlsZXMucHVzaF9iYWNrKHBvb2wuRmluZEZpbGVCeU5hbWUocmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKGkpKSk7CisgICAgaWYgKHBhcnNlZF9maWxlcy5iYWNrKCkgPT0gTlVMTCkgeworICAgICAgKmVycm9yX21zZyA9ICJwcm90b2MgYXNrZWQgcGx1Z2luIHRvIGdlbmVyYXRlIGEgZmlsZSBidXQgIgorICAgICAgICAgICAgICAgICAgICJkaWQgbm90IHByb3ZpZGUgYSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZTogIiArCisgICAgICAgICAgICAgICAgICAgcmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKGkpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorCisgIEdlbmVyYXRvclJlc3BvbnNlQ29udGV4dCBjb250ZXh0KHJlc3BvbnNlLCBwYXJzZWRfZmlsZXMpOworCisgIGlmIChnZW5lcmF0b3IuSGFzR2VuZXJhdGVBbGwoKSkgeworICAgIHN0cmluZyBlcnJvcjsKKyAgICBib29sIHN1Y2NlZWRlZCA9IGdlbmVyYXRvci5HZW5lcmF0ZUFsbCgKKyAgICAgICAgcGFyc2VkX2ZpbGVzLCByZXF1ZXN0LnBhcmFtZXRlcigpLCAmY29udGV4dCwgJmVycm9yKTsKKworICAgIGlmICghc3VjY2VlZGVkICYmIGVycm9yLmVtcHR5KCkpIHsKKyAgICAgIGVycm9yID0gIkNvZGUgZ2VuZXJhdG9yIHJldHVybmVkIGZhbHNlIGJ1dCBwcm92aWRlZCBubyBlcnJvciAiCisgICAgICAgICAgICAgICJkZXNjcmlwdGlvbi4iOworICAgIH0KKyAgICBpZiAoIWVycm9yLmVtcHR5KCkpIHsKKyAgICAgIHJlc3BvbnNlLT5zZXRfZXJyb3IoZXJyb3IpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHBhcnNlZF9maWxlcy5zaXplKCk7IGkrKykgeworICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwYXJzZWRfZmlsZXNbaV07CisKKyAgICAgIHN0cmluZyBlcnJvcjsKKyAgICAgIGJvb2wgc3VjY2VlZGVkID0gZ2VuZXJhdG9yLkdlbmVyYXRlKAorICAgICAgICAgIGZpbGUsIHJlcXVlc3QucGFyYW1ldGVyKCksICZjb250ZXh0LCAmZXJyb3IpOworCisgICAgICBpZiAoIXN1Y2NlZWRlZCAmJiBlcnJvci5lbXB0eSgpKSB7CisgICAgICAgIGVycm9yID0gIkNvZGUgZ2VuZXJhdG9yIHJldHVybmVkIGZhbHNlIGJ1dCBwcm92aWRlZCBubyBlcnJvciAiCisgICAgICAgICAgICAgICAgImRlc2NyaXB0aW9uLiI7CisgICAgICB9CisgICAgICBpZiAoIWVycm9yLmVtcHR5KCkpIHsKKyAgICAgICAgcmVzcG9uc2UtPnNldF9lcnJvcihmaWxlLT5uYW1lKCkgKyAiOiAiICsgZXJyb3IpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICByZXR1cm4gdHJ1ZTsKK30KKwogaW50IFBsdWdpbk1haW4oaW50IGFyZ2MsIGNoYXIqIGFyZ3ZbXSwgY29uc3QgQ29kZUdlbmVyYXRvciogZ2VuZXJhdG9yKSB7CiAKICAgaWYgKGFyZ2MgPiAxKSB7Ci0gICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IFVua25vd24gb3B0aW9uOiAiIDw8IGFyZ3ZbMV0gPDwgZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiBVbmtub3duIG9wdGlvbjogIiA8PCBhcmd2WzFdIDw8IHN0ZDo6ZW5kbDsKICAgICByZXR1cm4gMTsKICAgfQogCkBAIC0xMDYsNTIgKzE2NiwyMyBAQAogCiAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHJlcXVlc3Q7CiAgIGlmICghcmVxdWVzdC5QYXJzZUZyb21GaWxlRGVzY3JpcHRvcihTVERJTl9GSUxFTk8pKSB7Ci0gICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IHByb3RvYyBzZW50IHVucGFyc2VhYmxlIHJlcXVlc3QgdG8gcGx1Z2luLiIgPDwgZW5kbDsKKyAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiBwcm90b2Mgc2VudCB1bnBhcnNlYWJsZSByZXF1ZXN0IHRvIHBsdWdpbi4iCisgICAgICAgICAgICAgIDw8IHN0ZDo6ZW5kbDsKICAgICByZXR1cm4gMTsKICAgfQogCi0gIERlc2NyaXB0b3JQb29sIHBvb2w7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgcmVxdWVzdC5wcm90b19maWxlX3NpemUoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShyZXF1ZXN0LnByb3RvX2ZpbGUoaSkpOwotICAgIGlmIChmaWxlID09IE5VTEwpIHsKLSAgICAgIC8vIEJ1aWxkRmlsZSgpIGFscmVhZHkgd3JvdGUgYW4gZXJyb3IgbWVzc2FnZS4KLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCi0gIHZlY3Rvcjxjb25zdCBGaWxlRGVzY3JpcHRvcio+IHBhcnNlZF9maWxlczsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKLSAgICBwYXJzZWRfZmlsZXMucHVzaF9iYWNrKHBvb2wuRmluZEZpbGVCeU5hbWUocmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKGkpKSk7Ci0gICAgaWYgKHBhcnNlZF9maWxlcy5iYWNrKCkgPT0gTlVMTCkgewotICAgICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IHByb3RvYyBhc2tlZCBwbHVnaW4gdG8gZ2VuZXJhdGUgYSBmaWxlIGJ1dCAiCi0gICAgICAgICAgICAgICJkaWQgbm90IHByb3ZpZGUgYSBkZXNjcmlwdG9yIGZvciB0aGUgZmlsZTogIgotICAgICAgICAgICA8PCByZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUoaSkgPDwgZW5kbDsKLSAgICAgIHJldHVybiAxOwotICAgIH0KLSAgfQotCisgIHN0cmluZyBlcnJvcl9tc2c7CiAgIENvZGVHZW5lcmF0b3JSZXNwb25zZSByZXNwb25zZTsKLSAgR2VuZXJhdG9yUmVzcG9uc2VDb250ZXh0IGNvbnRleHQoJnJlc3BvbnNlLCBwYXJzZWRfZmlsZXMpOwogCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgcGFyc2VkX2ZpbGVzLnNpemUoKTsgaSsrKSB7Ci0gICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwYXJzZWRfZmlsZXNbaV07Ci0KLSAgICBzdHJpbmcgZXJyb3I7Ci0gICAgYm9vbCBzdWNjZWVkZWQgPSBnZW5lcmF0b3ItPkdlbmVyYXRlKAotICAgICAgICBmaWxlLCByZXF1ZXN0LnBhcmFtZXRlcigpLCAmY29udGV4dCwgJmVycm9yKTsKLQotICAgIGlmICghc3VjY2VlZGVkICYmIGVycm9yLmVtcHR5KCkpIHsKLSAgICAgIGVycm9yID0gIkNvZGUgZ2VuZXJhdG9yIHJldHVybmVkIGZhbHNlIGJ1dCBwcm92aWRlZCBubyBlcnJvciAiCi0gICAgICAgICAgICAgICJkZXNjcmlwdGlvbi4iOworICBpZiAoR2VuZXJhdGVDb2RlKHJlcXVlc3QsICpnZW5lcmF0b3IsICZyZXNwb25zZSwgJmVycm9yX21zZykpIHsKKyAgICBpZiAoIXJlc3BvbnNlLlNlcmlhbGl6ZVRvRmlsZURlc2NyaXB0b3IoU1RET1VUX0ZJTEVOTykpIHsKKyAgICAgIHN0ZDo6Y2VyciA8PCBhcmd2WzBdIDw8ICI6IEVycm9yIHdyaXRpbmcgdG8gc3Rkb3V0LiIgPDwgc3RkOjplbmRsOworICAgICAgcmV0dXJuIDE7CiAgICAgfQotICAgIGlmICghZXJyb3IuZW1wdHkoKSkgewotICAgICAgcmVzcG9uc2Uuc2V0X2Vycm9yKGZpbGUtPm5hbWUoKSArICI6ICIgKyBlcnJvcik7Ci0gICAgICBicmVhazsKKyAgfSBlbHNlIHsKKyAgICBpZiAoIWVycm9yX21zZy5lbXB0eSgpKSB7CisgICAgICBzdGQ6OmNlcnIgPDwgYXJndlswXSA8PCAiOiAiIDw8IGVycm9yX21zZyA8PCBzdGQ6OmVuZGw7CiAgICAgfQotICB9Ci0KLSAgaWYgKCFyZXNwb25zZS5TZXJpYWxpemVUb0ZpbGVEZXNjcmlwdG9yKFNURE9VVF9GSUxFTk8pKSB7Ci0gICAgY2VyciA8PCBhcmd2WzBdIDw8ICI6IEVycm9yIHdyaXRpbmcgdG8gc3Rkb3V0LiIgPDwgZW5kbDsKICAgICByZXR1cm4gMTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oCmluZGV4IDdjNDAzMzMuLmQyNzkzYTkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00MCw2ICs0MCwxMyBAQAogLy8gICB9CiAvLyBZb3UgbXVzdCBsaW5rIHlvdXIgcGx1Z2luIGFnYWluc3QgbGlicHJvdG9idWYgYW5kIGxpYnByb3RvYy4KIC8vCisvLyBUaGUgY29yZSBwYXJ0IG9mIFBsdWdpbk1haW4gaXMgdG8gaW52b2tlIHRoZSBnaXZlbiBDb2RlR2VuZXJhdG9yIG9uIGEKKy8vIENvZGVHZW5lcmF0b3JSZXF1ZXN0IHRvIGdlbmVyYXRlIGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlLiBUaGlzIHBhcnQgaXMKKy8vIGFic3RyYWN0ZWQgb3V0IGFuZCBtYWRlIGludG8gZnVuY3Rpb24gR2VuZXJhdGVDb2RlIHNvIHRoYXQgaXQgY2FuIGJlIHJldXNlZCwKKy8vIGZvciBleGFtcGxlLCB0byBpbXBsZW1lbnQgYSB2YXJpYW50IG9mIFBsdWdpbk1haW4gdGhhdCBkb2VzIHNvbWUKKy8vIHByZXByb2Nlc3Npbmcgb24gdGhlIGlucHV0IENvZGVHZW5lcmF0b3JSZXF1ZXN0IGJlZm9yZSBmZWVkaW5nIHRoZSByZXF1ZXN0CisvLyB0byB0aGUgZ2l2ZW4gY29kZSBnZW5lcmF0b3IuCisvLwogLy8gVG8gZ2V0IHByb3RvYyB0byB1c2UgdGhlIHBsdWdpbiwgZG8gb25lIG9mIHRoZSBmb2xsb3dpbmc6CiAvLyAqIFBsYWNlIHRoZSBwbHVnaW4gYmluYXJ5IHNvbWV3aGVyZSBpbiB0aGUgUEFUSCBhbmQgZ2l2ZSBpdCB0aGUgbmFtZQogLy8gICAicHJvdG9jLWdlbi1OQU1FIiAocmVwbGFjaW5nICJOQU1FIiB3aXRoIHRoZSBuYW1lIG9mIHlvdXIgcGx1Z2luKS4gIElmIHlvdQpAQCAtNTUsMTcgKzYyLDI3IEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QTFVHSU5fSF9fCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9DT01QSUxFUl9QTFVHSU5fSF9fCiAKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8c3RyaW5nPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGNvbXBpbGVyIHsKIAogY2xhc3MgQ29kZUdlbmVyYXRvcjsgICAgLy8gY29kZV9nZW5lcmF0b3IuaAorY2xhc3MgQ29kZUdlbmVyYXRvclJlcXVlc3Q7CitjbGFzcyBDb2RlR2VuZXJhdG9yUmVzcG9uc2U7CiAKIC8vIEltcGxlbWVudHMgbWFpbigpIGZvciBhIHByb3RvYyBwbHVnaW4gZXhwb3NpbmcgdGhlIGdpdmVuIGNvZGUgZ2VuZXJhdG9yLgogTElCUFJPVE9DX0VYUE9SVCBpbnQgUGx1Z2luTWFpbihpbnQgYXJnYywgY2hhciogYXJndltdLCBjb25zdCBDb2RlR2VuZXJhdG9yKiBnZW5lcmF0b3IpOwogCisvLyBHZW5lcmF0ZXMgY29kZSB1c2luZyB0aGUgZ2l2ZW4gY29kZSBnZW5lcmF0b3IuIFJldHVybnMgdHJ1ZSBpZiB0aGUgY29kZQorLy8gZ2VuZXJhdGlvbiBpcyBzdWNjZXNzZnVsLiBJZiB0aGUgY29kZSBnZW5lYXJ0aW9uIGZhaWxzLCBlcnJvcl9tc2cgbWF5IGJlCisvLyBwb3B1bGF0ZWQgdG8gZGVzY3JpYmUgdGhlIGZhaWx1cmUgY2F1c2UuCitib29sIEdlbmVyYXRlQ29kZShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgcmVxdWVzdCwKKyAgICBjb25zdCBDb2RlR2VuZXJhdG9yJiBnZW5lcmF0b3IsIENvZGVHZW5lcmF0b3JSZXNwb25zZSogcmVzcG9uc2UsCisgICAgc3RyaW5nKiBlcnJvcl9tc2cpOworCiB9ICAvLyBuYW1lc3BhY2UgY29tcGlsZXIKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuY2MKaW5kZXggYzk1NjE4OC4uZTlkNTBhMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5jYwpAQCAtMSwxNCArMSwxOCBAQAogLy8gR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCEKKy8vIHNvdXJjZTogZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bwogCiAjZGVmaW5lIElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OCi0jaW5jbHVkZSAiZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wYi5oIgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaD4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbmNsdWRlcykKQEAgLTQ1LDMyICs0OSwzMiBAQAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlcXVlc3QsIHByb3RvX2ZpbGVfKSwKICAgfTsKICAgQ29kZUdlbmVyYXRvclJlcXVlc3RfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBDb2RlR2VuZXJhdG9yUmVxdWVzdF9kZXNjcmlwdG9yXywKICAgICAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXywKICAgICAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0X29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVxdWVzdCwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXF1ZXN0LCBfdW5rbm93bl9maWVsZHNfKSwKICAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoQ29kZUdlbmVyYXRvclJlcXVlc3QpKTsKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKENvZGVHZW5lcmF0b3JSZXF1ZXN0KSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlcXVlc3QsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOwogICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMSk7CiAgIHN0YXRpYyBjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX29mZnNldHNfWzJdID0gewogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlLCBlcnJvcl8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlLCBmaWxlXyksCiAgIH07CiAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKICAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXywKICAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2Vfb2Zmc2V0c18sCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZSwgX3Vua25vd25fZmllbGRzXyksCiAgICAgICAtMSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKENvZGVHZW5lcmF0b3JSZXNwb25zZSkpOworICAgICAgLTEsCisgICAgICBzaXplb2YoQ29kZUdlbmVyYXRvclJlc3BvbnNlKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgICAgIC0xKTsKICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl8gPSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKDApOwogICBzdGF0aWMgY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX29mZnNldHNfWzNdID0gewogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIG5hbWVfKSwKQEAgLTc4LDE2ICs4MiwxNiBAQAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIGNvbnRlbnRfKSwKICAgfTsKICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZV9kZXNjcmlwdG9yXywKICAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXywKICAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlLCBfdW5rbm93bl9maWVsZHNfKSwKICAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUpKTsKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOwogfQogCiBuYW1lc3BhY2UgewpAQCAtMTAxLDExICsxMDUsMTEgQEAKIHZvaWQgcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyhjb25zdCA6OnN0ZDo6c3RyaW5nJikgewogICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgQ29kZUdlbmVyYXRvclJlcXVlc3RfZGVzY3JpcHRvcl8sICZDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0X2Rlc2NyaXB0b3JfLCAmQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXywgJkNvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9kZXNjcmlwdG9yXywgJkNvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGVfZGVzY3JpcHRvcl8sICZDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlX2Rlc2NyaXB0b3JfLCAmQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZQpAQCAtMTI0LDYgKzEyOCw3IEBACiAgIGlmIChhbHJlYWR5X2hlcmUpIHJldHVybjsKICAgYWxyZWFkeV9oZXJlID0gdHJ1ZTsKICAgR09PR0xFX1BST1RPQlVGX1ZFUklGWV9WRVJTSU9OOworCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6cHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCiAgICAgIlxuJWdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG9cMDIyIgpAQCAtMTM1LDcgKzE0MCw5IEBACiAgICAgImF0b3JSZXNwb25zZVwwMjJcclxuXDAwNWVycm9yXDAzMFwwMDEgXDAwMShcdFwwMjJCXG5cMDA0ZmlsZVwwMzBcMDE3IFwwMDMoIgogICAgICJcMDEzMjQuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0IgogICAgICJvclJlc3BvbnNlLkZpbGVcMDMyPlxuXDAwNEZpbGVcMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMjdcbiIKLSAgICAiXDAxN2luc2VydGlvbl9wb2ludFwwMzBcMDAyIFwwMDEoXHRcMDIyXDAxN1xuXDAwN2NvbnRlbnRcMDMwXDAxNyBcMDAxKFx0IiwgMzk5KTsKKyAgICAiXDAxN2luc2VydGlvbl9wb2ludFwwMzBcMDAyIFwwMDEoXHRcMDIyXDAxN1xuXDAwN2NvbnRlbnRcMDMwXDAxNyBcMDAxKFx0QiIKKyAgICAiN1xuXDAzNGNvbS5nb29nbGUucHJvdG9idWYuY29tcGlsZXJCXDAxNFBsdWdpblAiCisgICAgInJvdG9zWlx0cGx1Z2luX2dvIiwgNDU2KTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZEZpbGUoCiAgICAgImdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8iLCAmcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyk7CiAgIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBDb2RlR2VuZXJhdG9yUmVxdWVzdCgpOwpAQCAtMTU0LDQyICsxNjEsNTUgQEAKICAgfQogfSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fOwogCituYW1lc3BhY2UgeworCitzdGF0aWMgdm9pZCBNZXJnZUZyb21GYWlsKGludCBsaW5lKSBHT09HTEVfQVRUUklCVVRFX0NPTEQ7CitzdGF0aWMgdm9pZCBNZXJnZUZyb21GYWlsKGludCBsaW5lKSB7CisgIEdPT0dMRV9DSEVDSyhmYWxzZSkgPDwgX19GSUxFX18gPDwgIjoiIDw8IGxpbmU7Cit9CisKK30gIC8vIG5hbWVzcGFjZQorCisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmtGaWxlVG9HZW5lcmF0ZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXF1ZXN0OjprUGFyYW1ldGVyRmllbGROdW1iZXI7CiBjb25zdCBpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmtQcm90b0ZpbGVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpDb2RlR2VuZXJhdG9yUmVxdWVzdCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpDb2RlR2VuZXJhdG9yUmVxdWVzdChjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBwYXJhbWV0ZXJfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBwYXJhbWV0ZXJfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogQ29kZUdlbmVyYXRvclJlcXVlc3Q6On5Db2RlR2VuZXJhdG9yUmVxdWVzdCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChwYXJhbWV0ZXJfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgcGFyYW1ldGVyXzsKLSAgfQorICBwYXJhbWV0ZXJfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CiAgIH0KIH0KQEAgLTIxMSwxODIgKzIzMSwyMDUgQEAKIAogQ29kZUdlbmVyYXRvclJlcXVlc3QqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLUNvZGVHZW5lcmF0b3JSZXF1ZXN0KiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IENvZGVHZW5lcmF0b3JSZXF1ZXN0OworQ29kZUdlbmVyYXRvclJlcXVlc3QqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgQ29kZUdlbmVyYXRvclJlcXVlc3QqIG4gPSBuZXcgQ29kZUdlbmVyYXRvclJlcXVlc3Q7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7Ci0gICAgaWYgKGhhc19wYXJhbWV0ZXIoKSkgewotICAgICAgaWYgKHBhcmFtZXRlcl8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBwYXJhbWV0ZXJfLT5jbGVhcigpOwotICAgICAgfQotICAgIH0KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgaWYgKGhhc19wYXJhbWV0ZXIoKSkgeworICAgIHBhcmFtZXRlcl8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICB9CiAgIGZpbGVfdG9fZ2VuZXJhdGVfLkNsZWFyKCk7CiAgIHByb3RvX2ZpbGVfLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CiAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDEwKSB7CiAgICAgICAgICBwYXJzZV9maWxlX3RvX2dlbmVyYXRlOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICAgICAgICB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpIC0gMSkuZGF0YSgpLAogICAgICAgICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZSh0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKSAtIDEpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2ZpbGVfdG9fZ2VuZXJhdGU7CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9wYXJhbWV0ZXI7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOwogICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxOCkgewogICAgICAgICAgcGFyc2VfcGFyYW1ldGVyOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXJhbWV0ZXIoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICAgICAgICB0aGlzLT5wYXJhbWV0ZXIoKS5kYXRhKCksIHRoaXMtPnBhcmFtZXRlcigpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlciIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX3Byb3RvX2ZpbGU7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7CiAgICAgICBjYXNlIDE1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMjIpIHsKICAgICAgICAgIHBhcnNlX3Byb3RvX2ZpbGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF9wcm90b19maWxlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfcHJvdG9fZmlsZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyMikpIGdvdG8gcGFyc2VfcHJvdG9fZmlsZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTIyKSkgZ290byBwYXJzZV9sb29wX3Byb3RvX2ZpbGU7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCiAgIC8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsgaSsrKSB7Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCi0gICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKS5kYXRhKCksIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkubGVuZ3RoKCksCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkuZGF0YSgpLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlIik7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAogICAgICAgMSwgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKICAgaWYgKGhhc19wYXJhbWV0ZXIoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5wYXJhbWV0ZXIoKS5kYXRhKCksIHRoaXMtPnBhcmFtZXRlcigpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlciIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKICAgICAgIDIsIHRoaXMtPnBhcmFtZXRlcigpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19maWxlID0gMTU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnByb3RvX2ZpbGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDE1LCB0aGlzLT5wcm90b19maWxlKGkpLCBvdXRwdXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QpCiAgIC8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlX3NpemUoKTsgaSsrKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGUoaSkuZGF0YSgpLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSIpOwogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlU3RyaW5nVG9BcnJheSgxLCB0aGlzLT5maWxlX3RvX2dlbmVyYXRlKGkpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOwogICBpZiAoaGFzX3BhcmFtZXRlcigpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPnBhcmFtZXRlcigpLmRhdGEoKSwgdGhpcy0+cGFyYW1ldGVyKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIiKTsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKICAgICAgICAgMiwgdGhpcy0+cGFyYW1ldGVyKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wcm90b19maWxlX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAogICAgICAgICAxNSwgdGhpcy0+cHJvdG9fZmlsZShpKSwgdGFyZ2V0KTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKICAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMSAvIDMyXSAmICgweGZmdSA8PCAoMSAlIDMyKSkpIHsKLSAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKLSAgICBpZiAoaGFzX3BhcmFtZXRlcigpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKwotICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKLSAgICAgICAgICB0aGlzLT5wYXJhbWV0ZXIoKSk7Ci0gICAgfQotICAgIAorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBwYXJhbWV0ZXIgPSAyOworICBpZiAoaGFzX3BhcmFtZXRlcigpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5wYXJhbWV0ZXIoKSk7CiAgIH0KKwogICAvLyByZXBlYXRlZCBzdHJpbmcgZmlsZV90b19nZW5lcmF0ZSA9IDE7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpOyBpKyspIHsKICAgICB0b3RhbF9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgdGhpcy0+ZmlsZV90b19nZW5lcmF0ZShpKSk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHJvdG9fZmlsZV9zaXplKCk7IGkrKykgewpAQCAtMzk0LDEwICs0MzcsMTAgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+cHJvdG9fZmlsZShpKSk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTQwNyw1OCArNDUwLDY3IEBACiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCo+KAotICAgICAgJmZyb20pOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0PigKKyAgICAgICAgICAmZnJvbSk7CiAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgZmlsZV90b19nZW5lcmF0ZV8uTWVyZ2VGcm9tKGZyb20uZmlsZV90b19nZW5lcmF0ZV8pOwogICBwcm90b19maWxlXy5NZXJnZUZyb20oZnJvbS5wcm90b19maWxlXyk7CiAgIGlmIChmcm9tLl9oYXNfYml0c19bMSAvIDMyXSAmICgweGZmdSA8PCAoMSAlIDMyKSkpIHsKICAgICBpZiAoZnJvbS5oYXNfcGFyYW1ldGVyKCkpIHsKLSAgICAgIHNldF9wYXJhbWV0ZXIoZnJvbS5wYXJhbWV0ZXIoKSk7CisgICAgICBzZXRfaGFzX3BhcmFtZXRlcigpOworICAgICAgcGFyYW1ldGVyXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ucGFyYW1ldGVyXyk7CiAgICAgfQogICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0KQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OkNvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiBib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBwcm90b19maWxlX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT5wcm90b19maWxlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9CisKKyAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT5wcm90b19maWxlKCkpKSByZXR1cm4gZmFsc2U7CiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpTd2FwKENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIGZpbGVfdG9fZ2VuZXJhdGVfLlN3YXAoJm90aGVyLT5maWxlX3RvX2dlbmVyYXRlXyk7Ci0gICAgc3RkOjpzd2FwKHBhcmFtZXRlcl8sIG90aGVyLT5wYXJhbWV0ZXJfKTsKLSAgICBwcm90b19maWxlXy5Td2FwKCZvdGhlci0+cHJvdG9fZmlsZV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6SW50ZXJuYWxTd2FwKENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBvdGhlcikgeworICBmaWxlX3RvX2dlbmVyYXRlXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5maWxlX3RvX2dlbmVyYXRlXyk7CisgIHBhcmFtZXRlcl8uU3dhcCgmb3RoZXItPnBhcmFtZXRlcl8pOworICBwcm90b19maWxlXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5wcm90b19maWxlXyk7CisgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTQ2OSw1MSArNTIxLDE5MyBAQAogICByZXR1cm4gbWV0YWRhdGE7CiB9CiAKKyNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIENvZGVHZW5lcmF0b3JSZXF1ZXN0CisKKy8vIHJlcGVhdGVkIHN0cmluZyBmaWxlX3RvX2dlbmVyYXRlID0gMTsKK2ludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZmlsZV90b19nZW5lcmF0ZV8uc2l6ZSgpOworfQordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfZmlsZV90b19nZW5lcmF0ZSgpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uQ2xlYXIoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKKyAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkdldChpbmRleCk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCisgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KTsKK30KKyB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCisgIGZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKK30KKyB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKKyAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpOworfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQorfQorIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCitDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCisgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXzsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKKyAgcmV0dXJuICZmaWxlX3RvX2dlbmVyYXRlXzsKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIHBhcmFtZXRlciA9IDI7Citib29sIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpoYXNfcGFyYW1ldGVyKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK3ZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9oYXNfcGFyYW1ldGVyKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfaGFzX3BhcmFtZXRlcigpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpjbGVhcl9wYXJhbWV0ZXIoKSB7CisgIHBhcmFtZXRlcl8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnBhcmFtZXRlcigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQorICByZXR1cm4gcGFyYW1ldGVyXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X3BhcmFtZXRlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX3BhcmFtZXRlcigpOworICBwYXJhbWV0ZXJfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKK30KKyB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfcGFyYW1ldGVyKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfcGFyYW1ldGVyKCk7CisgIHBhcmFtZXRlcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X3BhcmFtZXRlcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKKyAgcGFyYW1ldGVyXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQorfQorIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX3BhcmFtZXRlcigpIHsKKyAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKKyAgcmV0dXJuIHBhcmFtZXRlcl8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6cmVsZWFzZV9wYXJhbWV0ZXIoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCisgIGNsZWFyX2hhc19wYXJhbWV0ZXIoKTsKKyAgcmV0dXJuIHBhcmFtZXRlcl8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfYWxsb2NhdGVkX3BhcmFtZXRlcig6OnN0ZDo6c3RyaW5nKiBwYXJhbWV0ZXIpIHsKKyAgaWYgKHBhcmFtZXRlciAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7CisgIH0KKyAgcGFyYW1ldGVyXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgcGFyYW1ldGVyKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKK2ludCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6cHJvdG9fZmlsZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gcHJvdG9fZmlsZV8uc2l6ZSgpOworfQordm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfcHJvdG9fZmlsZSgpIHsKKyAgcHJvdG9fZmlsZV8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCisgIHJldHVybiBwcm90b19maWxlXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wcm90b19maWxlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucHJvdG9fZmlsZSkKKyAgcmV0dXJuIHByb3RvX2ZpbGVfLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX3Byb3RvX2ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCisgIHJldHVybiBwcm90b19maWxlXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4qCitDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wcm90b19maWxlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQorICByZXR1cm4gJnByb3RvX2ZpbGVfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiYKK0NvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpwcm90b19maWxlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucHJvdG9fZmlsZSkKKyAgcmV0dXJuIHByb3RvX2ZpbGVfOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjprTmFtZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjprSW5zZXJ0aW9uUG9pbnRGaWVsZE51bWJlcjsKIGNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6a0NvbnRlbnRGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgaW5zZXJ0aW9uX3BvaW50XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgY29udGVudF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIG5hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgaW5zZXJ0aW9uX3BvaW50Xy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNvbnRlbnRfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6On5Db2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIG5hbWVfOwotICB9Ci0gIGlmIChpbnNlcnRpb25fcG9pbnRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgaW5zZXJ0aW9uX3BvaW50XzsKLSAgfQotICBpZiAoY29udGVudF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBjb250ZW50XzsKLSAgfQorICBuYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBpbnNlcnRpb25fcG9pbnRfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNvbnRlbnRfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CiAgIH0KIH0KQEAgLTUzNSwyMDYgKzcyOSwyMjkgQEAKIAogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLUNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOworQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIG4gPSBuZXcgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA3dSkgewogICAgIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9CiAgICAgaWYgKGhhc19pbnNlcnRpb25fcG9pbnQoKSkgewotICAgICAgaWYgKGluc2VydGlvbl9wb2ludF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBpbnNlcnRpb25fcG9pbnRfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgaW5zZXJ0aW9uX3BvaW50Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICAgIGlmIChoYXNfY29udGVudCgpKSB7Ci0gICAgICBpZiAoY29udGVudF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBjb250ZW50Xy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIGNvbnRlbnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9CiAgIH0KICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9pbnNlcnRpb25fcG9pbnQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOwogICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxOCkgewogICAgICAgICAgcGFyc2VfaW5zZXJ0aW9uX3BvaW50OgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pbnNlcnRpb25fcG9pbnQoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICAgICAgICB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5kYXRhKCksIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMjIpKSBnb3RvIHBhcnNlX2NvbnRlbnQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CiAgICAgICBjYXNlIDE1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMjIpIHsKICAgICAgICAgIHBhcnNlX2NvbnRlbnQ6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2NvbnRlbnQoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICAgICAgICB0aGlzLT5jb250ZW50KCkuZGF0YSgpLCB0aGlzLT5jb250ZW50KCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CiAgIGlmIChoYXNfaW5zZXJ0aW9uX3BvaW50KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkuZGF0YSgpLCB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAyLCB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgY29udGVudCA9IDE1OwogICBpZiAoaGFzX2NvbnRlbnQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5jb250ZW50KCkuZGF0YSgpLCB0aGlzLT5jb250ZW50KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKICAgICAgIDE1LCB0aGlzLT5jb250ZW50KCksIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUpCiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lIik7CiAgICAgdGFyZ2V0ID0KICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCiAgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgaW5zZXJ0aW9uX3BvaW50ID0gMjsKICAgaWYgKGhhc19pbnNlcnRpb25fcG9pbnQoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5pbnNlcnRpb25fcG9pbnQoKS5kYXRhKCksIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50Iik7CiAgICAgdGFyZ2V0ID0KICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCiAgICAgICAgIDIsIHRoaXMtPmluc2VydGlvbl9wb2ludCgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CiAgIGlmIChoYXNfY29udGVudCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPmNvbnRlbnQoKS5kYXRhKCksIHRoaXMtPmNvbnRlbnQoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQiKTsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKICAgICAgICAgMTUsIHRoaXMtPmNvbnRlbnQoKSwgdGFyZ2V0KTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKICAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgN3UpIHsKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CiAgICAgaWYgKGhhc19uYW1lKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgICAgIHRoaXMtPm5hbWUoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CiAgICAgaWYgKGhhc19pbnNlcnRpb25fcG9pbnQoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+aW5zZXJ0aW9uX3BvaW50KCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CiAgICAgaWYgKGhhc19jb250ZW50KCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgICAgIHRoaXMtPmNvbnRlbnQoKSk7CiAgICAgfQotICAgIAorCiAgIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTc0NCw1OSArOTYxLDcyIEBACiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSo+KAotICAgICAgJmZyb20pOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlPigKKyAgICAgICAgICAmZnJvbSk7CiAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpNZXJnZUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKLSAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICAgIHNldF9oYXNfbmFtZSgpOworICAgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX2luc2VydGlvbl9wb2ludCgpKSB7Ci0gICAgICBzZXRfaW5zZXJ0aW9uX3BvaW50KGZyb20uaW5zZXJ0aW9uX3BvaW50KCkpOworICAgICAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKKyAgICAgIGluc2VydGlvbl9wb2ludF8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmluc2VydGlvbl9wb2ludF8pOwogICAgIH0KICAgICBpZiAoZnJvbS5oYXNfY29udGVudCgpKSB7Ci0gICAgICBzZXRfY29udGVudChmcm9tLmNvbnRlbnQoKSk7CisgICAgICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgICAgIGNvbnRlbnRfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5jb250ZW50Xyk7CiAgICAgfQogICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OkNvcHlGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiBib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKKwogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6U3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAobmFtZV8sIG90aGVyLT5uYW1lXyk7Ci0gICAgc3RkOjpzd2FwKGluc2VydGlvbl9wb2ludF8sIG90aGVyLT5pbnNlcnRpb25fcG9pbnRfKTsKLSAgICBzdGQ6OnN3YXAoY29udGVudF8sIG90aGVyLT5jb250ZW50Xyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpJbnRlcm5hbFN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIG90aGVyKSB7CisgIG5hbWVfLlN3YXAoJm90aGVyLT5uYW1lXyk7CisgIGluc2VydGlvbl9wb2ludF8uU3dhcCgmb3RoZXItPmluc2VydGlvbl9wb2ludF8pOworICBjb250ZW50Xy5Td2FwKCZvdGhlci0+Y29udGVudF8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC04MTAsMzkgKzEwNDAsNDIgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmtFcnJvckZpZWxkTnVtYmVyOwogY29uc3QgaW50IENvZGVHZW5lcmF0b3JSZXNwb25zZTo6a0ZpbGVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Q29kZUdlbmVyYXRvclJlc3BvbnNlKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewogICBTaGFyZWRDdG9yKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewogfQogCiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNvZGVHZW5lcmF0b3JSZXNwb25zZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAorICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewogICBTaGFyZWRDdG9yKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBlcnJvcl8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIGVycm9yXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CiB9CiAKIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6fkNvZGVHZW5lcmF0b3JSZXNwb25zZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKICAgU2hhcmVkRHRvcigpOwogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIGVycm9yXzsKLSAgfQorICBlcnJvcl8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKICAgfQogfQpAQCAtODY0LDEzNiArMTA5NywxNTcgQEAKIAogQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBDb2RlR2VuZXJhdG9yUmVzcG9uc2U7CitDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIENvZGVHZW5lcmF0b3JSZXNwb25zZSogbiA9IG5ldyBDb2RlR2VuZXJhdG9yUmVzcG9uc2U7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIGlmIChoYXNfZXJyb3IoKSkgewotICAgICAgaWYgKGVycm9yXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgICAgIGVycm9yXy0+Y2xlYXIoKTsKLSAgICAgIH0KLSAgICB9CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQorICBpZiAoaGFzX2Vycm9yKCkpIHsKKyAgICBlcnJvcl8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICB9CiAgIGZpbGVfLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7CiAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDEwKSB7CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2Vycm9yKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+ZXJyb3IoKS5kYXRhKCksIHRoaXMtPmVycm9yKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyMikpIGdvdG8gcGFyc2VfZmlsZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CiAgICAgICBjYXNlIDE1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMjIpIHsKICAgICAgICAgIHBhcnNlX2ZpbGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF9maWxlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZmlsZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEyMikpIGdvdG8gcGFyc2VfZmlsZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTIyKSkgZ290byBwYXJzZV9sb29wX2ZpbGU7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCiAgIHJldHVybiB0cnVlOworZmFpbHVyZToKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQogICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOwogICBpZiAoaGFzX2Vycm9yKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+ZXJyb3IoKS5kYXRhKCksIHRoaXMtPmVycm9yKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAogICAgICAgMSwgdGhpcy0+ZXJyb3IoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZmlsZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgMTUsIHRoaXMtPmZpbGUoaSksIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKICAgaWYgKGhhc19lcnJvcigpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPmVycm9yKCkuZGF0YSgpLCB0aGlzLT5lcnJvcigpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yIik7CiAgICAgdGFyZ2V0ID0KICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCiAgICAgICAgIDEsIHRoaXMtPmVycm9yKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmZpbGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgMTUsIHRoaXMtPmZpbGUoaSksIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCiAgIHJldHVybiB0YXJnZXQ7CiB9CiAKIGludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCiAgIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKLSAgICBpZiAoaGFzX2Vycm9yKCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPmVycm9yKCkpOwotICAgIH0KLSAgICAKKworICAvLyBvcHRpb25hbCBzdHJpbmcgZXJyb3IgPSAxOworICBpZiAoaGFzX2Vycm9yKCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgIHRoaXMtPmVycm9yKCkpOwogICB9CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmZpbGVfc2l6ZSgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfc2l6ZSgpOyBpKyspIHsKQEAgLTEwMDEsMTAgKzEyNTUsMTAgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+ZmlsZShpKSk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTEwMTQsNTMgKzEyNjgsNjQgQEAKIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlKj4oCi0gICAgICAmZnJvbSk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U+KAorICAgICAgICAgICZmcm9tKTsKICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlKQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6Ok1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIGZpbGVfLk1lcmdlRnJvbShmcm9tLmZpbGVfKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19lcnJvcigpKSB7Ci0gICAgICBzZXRfZXJyb3IoZnJvbS5lcnJvcigpKTsKKyAgICAgIHNldF9oYXNfZXJyb3IoKTsKKyAgICAgIGVycm9yXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uZXJyb3JfKTsKICAgICB9CiAgIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZSkKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Q29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAorCiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6U3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKGVycm9yXywgb3RoZXItPmVycm9yXyk7Ci0gICAgZmlsZV8uU3dhcCgmb3RoZXItPmZpbGVfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpJbnRlcm5hbFN3YXAoQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBvdGhlcikgeworICBlcnJvcl8uU3dhcCgmb3RoZXItPmVycm9yXyk7CisgIGZpbGVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmZpbGVfKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTEwNzEsNiArMTMzNiwyNjAgQEAKICAgcmV0dXJuIG1ldGFkYXRhOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZQorCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Citib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9uYW1lKCkgeworICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19uYW1lKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCisgIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKK30KKyB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQorfQorIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKKyAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCisgIGNsZWFyX2hhc19uYW1lKCk7CisgIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOworYm9vbCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6aGFzX2luc2VydGlvbl9wb2ludCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfaW5zZXJ0aW9uX3BvaW50KCkgeworICBpbnNlcnRpb25fcG9pbnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjppbnNlcnRpb25fcG9pbnQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCkKKyAgcmV0dXJuIGluc2VydGlvbl9wb2ludF8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKKyAgaW5zZXJ0aW9uX3BvaW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2luc2VydGlvbl9wb2ludChjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOworICBpbnNlcnRpb25fcG9pbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQorfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIGluc2VydGlvbl9wb2ludF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCkKK30KKyA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9pbnNlcnRpb25fcG9pbnQoKSB7CisgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCisgIHJldHVybiBpbnNlcnRpb25fcG9pbnRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfaW5zZXJ0aW9uX3BvaW50KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQorICBjbGVhcl9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIHJldHVybiBpbnNlcnRpb25fcG9pbnRfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2FsbG9jYXRlZF9pbnNlcnRpb25fcG9pbnQoOjpzdGQ6OnN0cmluZyogaW5zZXJ0aW9uX3BvaW50KSB7CisgIGlmIChpbnNlcnRpb25fcG9pbnQgIT0gTlVMTCkgeworICAgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOworICB9CisgIGluc2VydGlvbl9wb2ludF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGluc2VydGlvbl9wb2ludCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7Citib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpoYXNfY29udGVudCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaGFzX2NvbnRlbnQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9oYXNfY29udGVudCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9jb250ZW50KCkgeworICBjb250ZW50Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19jb250ZW50KCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OmNvbnRlbnQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCisgIHJldHVybiBjb250ZW50Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2NvbnRlbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19jb250ZW50KCk7CisgIGNvbnRlbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2NvbnRlbnQoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19jb250ZW50KCk7CisgIGNvbnRlbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKK30KKyB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfY29udGVudChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19jb250ZW50KCk7CisgIGNvbnRlbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQorfQorIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX2NvbnRlbnQoKSB7CisgIHNldF9oYXNfY29udGVudCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKKyAgcmV0dXJuIGNvbnRlbnRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfY29udGVudCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCisgIGNsZWFyX2hhc19jb250ZW50KCk7CisgIHJldHVybiBjb250ZW50Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9hbGxvY2F0ZWRfY29udGVudCg6OnN0ZDo6c3RyaW5nKiBjb250ZW50KSB7CisgIGlmIChjb250ZW50ICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2NvbnRlbnQoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfY29udGVudCgpOworICB9CisgIGNvbnRlbnRfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBjb250ZW50KTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gQ29kZUdlbmVyYXRvclJlc3BvbnNlCisKKy8vIG9wdGlvbmFsIHN0cmluZyBlcnJvciA9IDE7Citib29sIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6aGFzX2Vycm9yKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfaGFzX2Vycm9yKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmNsZWFyX2hhc19lcnJvcigpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9Cit2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfZXJyb3IoKSB7CisgIGVycm9yXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19lcnJvcigpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZXJyb3IoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKKyAgcmV0dXJuIGVycm9yXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnNldF9lcnJvcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2Vycm9yKCk7CisgIGVycm9yXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZXJyb3IpCit9Cisgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OnNldF9lcnJvcihjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2Vycm9yKCk7CisgIGVycm9yXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKK30KKyB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2Vycm9yKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2Vycm9yKCk7CisgIGVycm9yXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorfQorIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9lcnJvcigpIHsKKyAgc2V0X2hhc19lcnJvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorICByZXR1cm4gZXJyb3JfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpyZWxlYXNlX2Vycm9yKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorICBjbGVhcl9oYXNfZXJyb3IoKTsKKyAgcmV0dXJuIGVycm9yXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfYWxsb2NhdGVkX2Vycm9yKDo6c3RkOjpzdHJpbmcqIGVycm9yKSB7CisgIGlmIChlcnJvciAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19lcnJvcigpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19lcnJvcigpOworICB9CisgIGVycm9yXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZXJyb3IpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKK2ludCBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLnNpemUoKTsKK30KK3ZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpjbGVhcl9maWxlKCkgeworICBmaWxlXy5DbGVhcigpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZmlsZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCisgIHJldHVybiBmaWxlXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9maWxlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCisgIHJldHVybiBmaWxlXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmFkZF9maWxlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKKyAgcmV0dXJuIGZpbGVfLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+KgorQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlKQorICByZXR1cm4gJmZpbGVfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+JgorQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpmaWxlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmZpbGUpCisgIHJldHVybiBmaWxlXzsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnBiLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaAppbmRleCA2NDI0NmZjLi41MTAyMDJmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucGIuaApAQCAtOCwyMyArOCwyNiBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogCi0jaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAyMDA0MDAwCisjaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAzMDAwMDAwCiAjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcwogI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UgdXBkYXRlCiAjZXJyb3IgeW91ciBoZWFkZXJzLgogI2VuZGlmCi0jaWYgMjAwNDAwMiA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KKyNpZiAzMDAwMDAwIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgogI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCiAjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZQogI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KICNlbmRpZgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KLSNpbmNsdWRlICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCiAKIG5hbWVzcGFjZSBnb29nbGUgewpAQCAtNDYsMzcgKzQ5LDM5IEBACiAgcHVibGljOgogICBDb2RlR2VuZXJhdG9yUmVxdWVzdCgpOwogICB2aXJ0dWFsIH5Db2RlR2VuZXJhdG9yUmVxdWVzdCgpOwotICAKKwogICBDb2RlR2VuZXJhdG9yUmVxdWVzdChjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgb3BlcmF0b3I9KGNvbnN0IENvZGVHZW5lcmF0b3JSZXF1ZXN0JiBmcm9tKSB7CiAgICAgQ29weUZyb20oZnJvbSk7CiAgICAgcmV0dXJuICp0aGlzOwogICB9Ci0gIAorCiAgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CiAgIHN0YXRpYyBjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoQ29kZUdlbmVyYXRvclJlcXVlc3QqIG90aGVyKTsKLSAgCisKICAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBOZXcoKSBjb25zdDsKKworICBpbmxpbmUgQ29kZUdlbmVyYXRvclJlcXVlc3QqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwogICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgQ29kZUdlbmVyYXRvclJlcXVlc3QmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVxdWVzdCYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTg4LDcxICs5Myw3NyBAQAogICB2b2lkIFNoYXJlZEN0b3IoKTsKICAgdm9pZCBTaGFyZWREdG9yKCk7CiAgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKENvZGVHZW5lcmF0b3JSZXF1ZXN0KiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOwotICBpbmxpbmUgaW50IGZpbGVfdG9fZ2VuZXJhdGVfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9maWxlX3RvX2dlbmVyYXRlKCk7CisgIGludCBmaWxlX3RvX2dlbmVyYXRlX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9maWxlX3RvX2dlbmVyYXRlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVUb0dlbmVyYXRlRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCk7Ci0gIGlubGluZSB2b2lkIHNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKTsKLSAgaW5saW5lIHZvaWQgYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBhZGRfZmlsZV90b19nZW5lcmF0ZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiBmaWxlX3RvX2dlbmVyYXRlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCk7CisgIHZvaWQgc2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X2ZpbGVfdG9fZ2VuZXJhdGUoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBhZGRfZmlsZV90b19nZW5lcmF0ZSgpOworICB2b2lkIGFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBhZGRfZmlsZV90b19nZW5lcmF0ZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgYWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgZmlsZV90b19nZW5lcmF0ZSgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2ZpbGVfdG9fZ2VuZXJhdGUoKTsKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgcGFyYW1ldGVyID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX3BhcmFtZXRlcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9wYXJhbWV0ZXIoKTsKKyAgYm9vbCBoYXNfcGFyYW1ldGVyKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfcGFyYW1ldGVyKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga1BhcmFtZXRlckZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHBhcmFtZXRlcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfcGFyYW1ldGVyKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3BhcmFtZXRlcihjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfcGFyYW1ldGVyKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3BhcmFtZXRlcigpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgcGFyYW1ldGVyKCkgY29uc3Q7CisgIHZvaWQgc2V0X3BhcmFtZXRlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X3BhcmFtZXRlcihjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X3BhcmFtZXRlcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3BhcmFtZXRlcigpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3BhcmFtZXRlcigpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfcGFyYW1ldGVyKDo6c3RkOjpzdHJpbmcqIHBhcmFtZXRlcik7CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIHByb3RvX2ZpbGUgPSAxNTsKLSAgaW5saW5lIGludCBwcm90b19maWxlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcHJvdG9fZmlsZSgpOworICBpbnQgcHJvdG9fZmlsZV9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfcHJvdG9fZmlsZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtQcm90b0ZpbGVGaWVsZE51bWJlciA9IDE1OwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90b19maWxlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfcHJvdG9fZmlsZShpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBhZGRfcHJvdG9fZmlsZSgpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiYKLSAgICAgIHByb3RvX2ZpbGUoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4qCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG9fZmlsZShpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfcHJvdG9fZmlsZShpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIGFkZF9wcm90b19maWxlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4qCiAgICAgICBtdXRhYmxlX3Byb3RvX2ZpbGUoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4mCisgICAgICBwcm90b19maWxlKCkgY29uc3Q7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdCkKICBwcml2YXRlOgogICBpbmxpbmUgdm9pZCBzZXRfaGFzX3BhcmFtZXRlcigpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiBmaWxlX3RvX2dlbmVyYXRlXzsKLSAgOjpzdGQ6OnN0cmluZyogcGFyYW1ldGVyXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiBwcm90b19maWxlXzsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwogICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiBmaWxlX3RvX2dlbmVyYXRlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgcGFyYW1ldGVyXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiBwcm90b19maWxlXzsKICAgZnJpZW5kIHZvaWQgTElCUFJPVE9DX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZjb21waWxlcl8yZnBsdWdpbl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBDb2RlR2VuZXJhdG9yUmVxdWVzdCogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtMTYyLDM3ICsxNzMsMzkgQEAKICBwdWJsaWM6CiAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCk7CiAgIHZpcnR1YWwgfkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKCk7Ci0gIAorCiAgIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKTsKLSAgCisKICAgaW5saW5lIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBvcGVyYXRvcj0oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAorCiAgIHZvaWQgU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIE5ldygpIGNvbnN0OworCisgIGlubGluZSBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9CisKKyAgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmcm9tKTsKICAgdm9pZCBDbGVhcigpOwogICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCisKICAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CiAgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwpAQCAtMjA0LDQ3ICsyMTcsNTggQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfbmFtZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOworCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnNlcnRpb25fcG9pbnQgPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfaW5zZXJ0aW9uX3BvaW50KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2luc2VydGlvbl9wb2ludCgpOworICBib29sIGhhc19pbnNlcnRpb25fcG9pbnQoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9pbnNlcnRpb25fcG9pbnQoKTsKICAgc3RhdGljIGNvbnN0IGludCBrSW5zZXJ0aW9uUG9pbnRGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpbnNlcnRpb25fcG9pbnQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2luc2VydGlvbl9wb2ludChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2luc2VydGlvbl9wb2ludCgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGluc2VydGlvbl9wb2ludCgpIGNvbnN0OworICB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9pbnNlcnRpb25fcG9pbnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9pbnNlcnRpb25fcG9pbnQoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2luc2VydGlvbl9wb2ludCg6OnN0ZDo6c3RyaW5nKiBpbnNlcnRpb25fcG9pbnQpOworCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7Ci0gIGlubGluZSBib29sIGhhc19jb250ZW50KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2NvbnRlbnQoKTsKKyAgYm9vbCBoYXNfY29udGVudCgpIGNvbnN0OworICB2b2lkIGNsZWFyX2NvbnRlbnQoKTsKICAgc3RhdGljIGNvbnN0IGludCBrQ29udGVudEZpZWxkTnVtYmVyID0gMTU7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBjb250ZW50KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9jb250ZW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2NvbnRlbnQoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfY29udGVudChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9jb250ZW50KCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2NvbnRlbnQoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGNvbnRlbnQoKSBjb25zdDsKKyAgdm9pZCBzZXRfY29udGVudChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2NvbnRlbnQoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfY29udGVudCgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2NvbnRlbnQoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2NvbnRlbnQoOjpzdGQ6OnN0cmluZyogY29udGVudCk7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSkKICBwcml2YXRlOgogICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKQEAgLTI1MywyMCArMjc3LDE3IEBACiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19jb250ZW50KCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19jb250ZW50KCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpzdGQ6OnN0cmluZyogbmFtZV87Ci0gIDo6c3RkOjpzdHJpbmcqIGluc2VydGlvbl9wb2ludF87Ci0gIDo6c3RkOjpzdHJpbmcqIGNvbnRlbnRfOwotICAKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CiAgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDMgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgaW5zZXJ0aW9uX3BvaW50XzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgY29udGVudF87CiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTI3NiwzNyArMjk3LDM5IEBACiAgcHVibGljOgogICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UoKTsKICAgdmlydHVhbCB+Q29kZUdlbmVyYXRvclJlc3BvbnNlKCk7Ci0gIAorCiAgIENvZGVHZW5lcmF0b3JSZXNwb25zZShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pOwotICAKKwogICBpbmxpbmUgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBvcGVyYXRvcj0oY29uc3QgQ29kZUdlbmVyYXRvclJlc3BvbnNlJiBmcm9tKSB7CiAgICAgQ29weUZyb20oZnJvbSk7CiAgICAgcmV0dXJuICp0aGlzOwogICB9Ci0gIAorCiAgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CiAgIHN0YXRpYyBjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCisKICAgdm9pZCBTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZSogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBOZXcoKSBjb25zdDsKKworICBpbmxpbmUgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBDb2RlR2VuZXJhdG9yUmVzcG9uc2UqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBDb2RlR2VuZXJhdG9yUmVzcG9uc2UmIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC0zMTgsNTYgKzM0MSw2MiBAQAogICB2b2lkIFNoYXJlZEN0b3IoKTsKICAgdm9pZCBTaGFyZWREdG9yKCk7CiAgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKENvZGVHZW5lcmF0b3JSZXNwb25zZSogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIHR5cGVkZWYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgRmlsZTsKLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGVycm9yID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX2Vycm9yKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2Vycm9yKCk7CisgIGJvb2wgaGFzX2Vycm9yKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZXJyb3IoKTsKICAgc3RhdGljIGNvbnN0IGludCBrRXJyb3JGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBlcnJvcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXJyb3IoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXJyb3IoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGVycm9yKCkgY29uc3Q7CisgIHZvaWQgc2V0X2Vycm9yKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9lcnJvcihjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2Vycm9yKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXJyb3IoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2Vycm9yKDo6c3RkOjpzdHJpbmcqIGVycm9yKTsKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlIGZpbGUgPSAxNTsKLSAgaW5saW5lIGludCBmaWxlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZmlsZSgpOworICBpbnQgZmlsZV9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZmlsZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtGaWxlRmllbGROdW1iZXIgPSAxNTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBmaWxlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogbXV0YWJsZV9maWxlKGludCBpbmRleCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogYWRkX2ZpbGUoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiYKLSAgICAgIGZpbGUoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUmIGZpbGUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUqIG11dGFibGVfZmlsZShpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogYWRkX2ZpbGUoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSA+KgogICAgICAgbXV0YWJsZV9maWxlKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4mCisgICAgICBmaWxlKCkgY29uc3Q7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UpCiAgcHJpdmF0ZToKICAgaW5saW5lIHZvaWQgc2V0X2hhc19lcnJvcigpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZXJyb3IoKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIAotICA6OnN0ZDo6c3RyaW5nKiBlcnJvcl87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiBmaWxlXzsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwogICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygyICsgMzEpIC8gMzJdOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZXJyb3JfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4gZmlsZV87CiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQ19FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmY29tcGlsZXJfMmZwbHVnaW5fMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgQ29kZUdlbmVyYXRvclJlc3BvbnNlKiBkZWZhdWx0X2luc3RhbmNlXzsKIH07CkBAIC0zNzYsNiArNDA1LDcgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisjaWYgIVBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogLy8gQ29kZUdlbmVyYXRvclJlcXVlc3QKIAogLy8gcmVwZWF0ZWQgc3RyaW5nIGZpbGVfdG9fZ2VuZXJhdGUgPSAxOwpAQCAtMzg2LDM5ICs0MTYsNTAgQEAKICAgZmlsZV90b19nZW5lcmF0ZV8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKICAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCiAgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCiAgIGZpbGVfdG9fZ2VuZXJhdGVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOwogfQogaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9maWxlX3RvX2dlbmVyYXRlKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKICAgZmlsZV90b19nZW5lcmF0ZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfZmlsZV90b19nZW5lcmF0ZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBmaWxlX3RvX2dlbmVyYXRlXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAogICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKICAgcmV0dXJuIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpOwogfQogaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQogfQogaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OmFkZF9maWxlX3RvX2dlbmVyYXRlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX2ZpbGVfdG9fZ2VuZXJhdGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIGZpbGVfdG9fZ2VuZXJhdGVfLkFkZCgpLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5maWxlX3RvX2dlbmVyYXRlKQogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6ZmlsZV90b19nZW5lcmF0ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LmZpbGVfdG9fZ2VuZXJhdGUpCiAgIHJldHVybiBmaWxlX3RvX2dlbmVyYXRlXzsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KgogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfZmlsZV90b19nZW5lcmF0ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QuZmlsZV90b19nZW5lcmF0ZSkKICAgcmV0dXJuICZmaWxlX3RvX2dlbmVyYXRlXzsKIH0KIApAQCAtNDMzLDUxICs0NzQsNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6Y2xlYXJfcGFyYW1ldGVyKCkgewotICBpZiAocGFyYW1ldGVyXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcGFyYW1ldGVyXy0+Y2xlYXIoKTsKLSAgfQorICBwYXJhbWV0ZXJfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2xlYXJfaGFzX3BhcmFtZXRlcigpOwogfQogaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpwYXJhbWV0ZXIoKSBjb25zdCB7Ci0gIHJldHVybiAqcGFyYW1ldGVyXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQorICByZXR1cm4gcGFyYW1ldGVyXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6c2V0X3BhcmFtZXRlcihjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX3BhcmFtZXRlcigpOwotICBpZiAocGFyYW1ldGVyXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcGFyYW1ldGVyXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHBhcmFtZXRlcl8tPmFzc2lnbih2YWx1ZSk7CisgIHBhcmFtZXRlcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQogfQogaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKLSAgaWYgKHBhcmFtZXRlcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHBhcmFtZXRlcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBwYXJhbWV0ZXJfLT5hc3NpZ24odmFsdWUpOworICBwYXJhbWV0ZXJfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQogfQogaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnNldF9wYXJhbWV0ZXIoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIGlmIChwYXJhbWV0ZXJfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBwYXJhbWV0ZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcGFyYW1ldGVyXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIHBhcmFtZXRlcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnBhcmFtZXRlcikKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6bXV0YWJsZV9wYXJhbWV0ZXIoKSB7CiAgIHNldF9oYXNfcGFyYW1ldGVyKCk7Ci0gIGlmIChwYXJhbWV0ZXJfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBwYXJhbWV0ZXJfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIHBhcmFtZXRlcl87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wYXJhbWV0ZXIpCisgIHJldHVybiBwYXJhbWV0ZXJfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnJlbGVhc2VfcGFyYW1ldGVyKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQogICBjbGVhcl9oYXNfcGFyYW1ldGVyKCk7Ci0gIGlmIChwYXJhbWV0ZXJfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHBhcmFtZXRlcl8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjpzZXRfYWxsb2NhdGVkX3BhcmFtZXRlcig6OnN0ZDo6c3RyaW5nKiBwYXJhbWV0ZXIpIHsKKyAgaWYgKHBhcmFtZXRlciAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19wYXJhbWV0ZXIoKTsKICAgfSBlbHNlIHsKLSAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gcGFyYW1ldGVyXzsKLSAgICBwYXJhbWV0ZXJfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19wYXJhbWV0ZXIoKTsKICAgfQorICBwYXJhbWV0ZXJfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBwYXJhbWV0ZXIpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucGFyYW1ldGVyKQogfQogCiAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fZmlsZSA9IDE1OwpAQCAtNDg4LDIyICs1MjUsMjcgQEAKICAgcHJvdG9fZmlsZV8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIENvZGVHZW5lcmF0b3JSZXF1ZXN0Ojpwcm90b19maWxlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQogICByZXR1cm4gcHJvdG9fZmlsZV8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIENvZGVHZW5lcmF0b3JSZXF1ZXN0OjptdXRhYmxlX3Byb3RvX2ZpbGUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQogICByZXR1cm4gcHJvdG9fZmlsZV8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBDb2RlR2VuZXJhdG9yUmVxdWVzdDo6YWRkX3Byb3RvX2ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXF1ZXN0LnByb3RvX2ZpbGUpCiAgIHJldHVybiBwcm90b19maWxlXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgotQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGUoKSBjb25zdCB7Ci0gIHJldHVybiBwcm90b19maWxlXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgogQ29kZUdlbmVyYXRvclJlcXVlc3Q6Om11dGFibGVfcHJvdG9fZmlsZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlcXVlc3QucHJvdG9fZmlsZSkKICAgcmV0dXJuICZwcm90b19maWxlXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorQ29kZUdlbmVyYXRvclJlcXVlc3Q6OnByb3RvX2ZpbGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVxdWVzdC5wcm90b19maWxlKQorICByZXR1cm4gcHJvdG9fZmlsZV87Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtNTIwLDUxICs1NjIsNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y2xlYXJfbmFtZSgpIHsKLSAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgfQorICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc19uYW1lKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAqbmFtZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCisgIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24odmFsdWUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6bXV0YWJsZV9uYW1lKCkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBuYW1lXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5uYW1lKQogICBjbGVhcl9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOwotICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19uYW1lKCk7CiAgIH0KKyAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUubmFtZSkKIH0KIAogLy8gb3B0aW9uYWwgc3RyaW5nIGluc2VydGlvbl9wb2ludCA9IDI7CkBAIC01NzgsNTEgKzYxNiw0NyBAQAogICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9pbnNlcnRpb25fcG9pbnQoKSB7Ci0gIGlmIChpbnNlcnRpb25fcG9pbnRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBpbnNlcnRpb25fcG9pbnRfLT5jbGVhcigpOwotICB9CisgIGluc2VydGlvbl9wb2ludF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6Omluc2VydGlvbl9wb2ludCgpIGNvbnN0IHsKLSAgcmV0dXJuICppbnNlcnRpb25fcG9pbnRfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCisgIHJldHVybiBpbnNlcnRpb25fcG9pbnRfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfaW5zZXJ0aW9uX3BvaW50KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfaW5zZXJ0aW9uX3BvaW50KCk7Ci0gIGlmIChpbnNlcnRpb25fcG9pbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBpbnNlcnRpb25fcG9pbnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgaW5zZXJ0aW9uX3BvaW50Xy0+YXNzaWduKHZhbHVlKTsKKyAgaW5zZXJ0aW9uX3BvaW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2luc2VydGlvbl9wb2ludChjb25zdCBjaGFyKiB2YWx1ZSkgewogICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOwotICBpZiAoaW5zZXJ0aW9uX3BvaW50XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgaW5zZXJ0aW9uX3BvaW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGluc2VydGlvbl9wb2ludF8tPmFzc2lnbih2YWx1ZSk7CisgIGluc2VydGlvbl9wb2ludF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCiB9CiBpbmxpbmUgdm9pZCBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6c2V0X2luc2VydGlvbl9wb2ludChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKICAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLSAgaWYgKGluc2VydGlvbl9wb2ludF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGluc2VydGlvbl9wb2ludF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBpbnNlcnRpb25fcG9pbnRfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgaW5zZXJ0aW9uX3BvaW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuaW5zZXJ0aW9uX3BvaW50KQogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX2luc2VydGlvbl9wb2ludCgpIHsKICAgc2V0X2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLSAgaWYgKGluc2VydGlvbl9wb2ludF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGluc2VydGlvbl9wb2ludF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gaW5zZXJ0aW9uX3BvaW50XzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmluc2VydGlvbl9wb2ludCkKKyAgcmV0dXJuIGluc2VydGlvbl9wb2ludF8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6cmVsZWFzZV9pbnNlcnRpb25fcG9pbnQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCiAgIGNsZWFyX2hhc19pbnNlcnRpb25fcG9pbnQoKTsKLSAgaWYgKGluc2VydGlvbl9wb2ludF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gaW5zZXJ0aW9uX3BvaW50Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9hbGxvY2F0ZWRfaW5zZXJ0aW9uX3BvaW50KDo6c3RkOjpzdHJpbmcqIGluc2VydGlvbl9wb2ludCkgeworICBpZiAoaW5zZXJ0aW9uX3BvaW50ICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2luc2VydGlvbl9wb2ludCgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBpbnNlcnRpb25fcG9pbnRfOwotICAgIGluc2VydGlvbl9wb2ludF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gICAgcmV0dXJuIHRlbXA7CisgICAgY2xlYXJfaGFzX2luc2VydGlvbl9wb2ludCgpOwogICB9CisgIGluc2VydGlvbl9wb2ludF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGluc2VydGlvbl9wb2ludCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5pbnNlcnRpb25fcG9pbnQpCiB9CiAKIC8vIG9wdGlvbmFsIHN0cmluZyBjb250ZW50ID0gMTU7CkBAIC02MzYsNTEgKzY3MCw0NyBAQAogICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpjbGVhcl9jb250ZW50KCkgewotICBpZiAoY29udGVudF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGNvbnRlbnRfLT5jbGVhcigpOwotICB9CisgIGNvbnRlbnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2xlYXJfaGFzX2NvbnRlbnQoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZTo6Y29udGVudCgpIGNvbnN0IHsKLSAgcmV0dXJuICpjb250ZW50XzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKKyAgcmV0dXJuIGNvbnRlbnRfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfY29udGVudChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX2NvbnRlbnQoKTsKLSAgaWYgKGNvbnRlbnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBjb250ZW50XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGNvbnRlbnRfLT5hc3NpZ24odmFsdWUpOworICBjb250ZW50Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQogfQogaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9jb250ZW50KGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfY29udGVudCgpOwotICBpZiAoY29udGVudF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGNvbnRlbnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgY29udGVudF8tPmFzc2lnbih2YWx1ZSk7CisgIGNvbnRlbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjpzZXRfY29udGVudChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKICAgc2V0X2hhc19jb250ZW50KCk7Ci0gIGlmIChjb250ZW50XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgY29udGVudF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBjb250ZW50Xy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIGNvbnRlbnRfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlOjptdXRhYmxlX2NvbnRlbnQoKSB7CiAgIHNldF9oYXNfY29udGVudCgpOwotICBpZiAoY29udGVudF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGNvbnRlbnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIGNvbnRlbnRfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLkZpbGUuY29udGVudCkKKyAgcmV0dXJuIGNvbnRlbnRfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnJlbGVhc2VfY29udGVudCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5GaWxlLmNvbnRlbnQpCiAgIGNsZWFyX2hhc19jb250ZW50KCk7Ci0gIGlmIChjb250ZW50XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBjb250ZW50Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGU6OnNldF9hbGxvY2F0ZWRfY29udGVudCg6OnN0ZDo6c3RyaW5nKiBjb250ZW50KSB7CisgIGlmIChjb250ZW50ICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2NvbnRlbnQoKTsKICAgfSBlbHNlIHsKLSAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gY29udGVudF87Ci0gICAgY29udGVudF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gICAgcmV0dXJuIHRlbXA7CisgICAgY2xlYXJfaGFzX2NvbnRlbnQoKTsKICAgfQorICBjb250ZW50Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgY29udGVudCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZS5jb250ZW50KQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC02OTgsNTEgKzcyOCw0NyBAQAogICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6Y2xlYXJfZXJyb3IoKSB7Ci0gIGlmIChlcnJvcl8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGVycm9yXy0+Y2xlYXIoKTsKLSAgfQorICBlcnJvcl8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfZXJyb3IoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmVycm9yKCkgY29uc3QgewotICByZXR1cm4gKmVycm9yXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorICByZXR1cm4gZXJyb3JfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2Vycm9yKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfZXJyb3IoKTsKLSAgaWYgKGVycm9yXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZXJyb3JfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgZXJyb3JfLT5hc3NpZ24odmFsdWUpOworICBlcnJvcl8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQogfQogaW5saW5lIHZvaWQgQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpzZXRfZXJyb3IoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19lcnJvcigpOwotICBpZiAoZXJyb3JfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBlcnJvcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBlcnJvcl8tPmFzc2lnbih2YWx1ZSk7CisgIGVycm9yXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKIH0KIGlubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2Vycm9yKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX2Vycm9yKCk7Ci0gIGlmIChlcnJvcl8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGVycm9yXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGVycm9yXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIGVycm9yXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9lcnJvcigpIHsKICAgc2V0X2hhc19lcnJvcigpOwotICBpZiAoZXJyb3JfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBlcnJvcl8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gZXJyb3JfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQorICByZXR1cm4gZXJyb3JfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjpyZWxlYXNlX2Vycm9yKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuY29tcGlsZXIuQ29kZUdlbmVyYXRvclJlc3BvbnNlLmVycm9yKQogICBjbGVhcl9oYXNfZXJyb3IoKTsKLSAgaWYgKGVycm9yXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBlcnJvcl8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6c2V0X2FsbG9jYXRlZF9lcnJvcig6OnN0ZDo6c3RyaW5nKiBlcnJvcikgeworICBpZiAoZXJyb3IgIT0gTlVMTCkgeworICAgIHNldF9oYXNfZXJyb3IoKTsKICAgfSBlbHNlIHsKLSAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gZXJyb3JfOwotICAgIGVycm9yXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfZXJyb3IoKTsKICAgfQorICBlcnJvcl8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGVycm9yKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5lcnJvcikKIH0KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuRmlsZSBmaWxlID0gMTU7CkBAIC03NTMsMjIgKzc3OSwzMiBAQAogICBmaWxlXy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlJiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLmNvbXBpbGVyLkNvZGVHZW5lcmF0b3JSZXNwb25zZS5maWxlKQogICByZXR1cm4gZmlsZV8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmNvbXBpbGVyOjpDb2RlR2VuZXJhdG9yUmVzcG9uc2VfRmlsZSogQ29kZUdlbmVyYXRvclJlc3BvbnNlOjptdXRhYmxlX2ZpbGUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKICAgcmV0dXJuIGZpbGVfLk11dGFibGUoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlKiBDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmFkZF9maWxlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKICAgcmV0dXJuIGZpbGVfLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPiYKLUNvZGVHZW5lcmF0b3JSZXNwb25zZTo6ZmlsZSgpIGNvbnN0IHsKLSAgcmV0dXJuIGZpbGVfOwotfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpjb21waWxlcjo6Q29kZUdlbmVyYXRvclJlc3BvbnNlX0ZpbGUgPioKIENvZGVHZW5lcmF0b3JSZXNwb25zZTo6bXV0YWJsZV9maWxlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKICAgcmV0dXJuICZmaWxlXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvZGVHZW5lcmF0b3JSZXNwb25zZV9GaWxlID4mCitDb2RlR2VuZXJhdG9yUmVzcG9uc2U6OmZpbGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5jb21waWxlci5Db2RlR2VuZXJhdG9yUmVzcG9uc2UuZmlsZSkKKyAgcmV0dXJuIGZpbGVfOworfQorCisjZW5kaWYgIC8vICFQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAKIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChuYW1lc3BhY2Vfc2NvcGUpCkBAIC03NzcsMTUgKzgxMyw2IEBACiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKIAotI2lmbmRlZiBTV0lHCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLQotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCi0jZW5kaWYgIC8vIFNXSUcKLQogLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKIAogI2VuZGlmICAvLyBQUk9UT0JVRl9nb29nbGVfMmZwcm90b2J1Zl8yZmNvbXBpbGVyXzJmcGx1Z2luXzJlcHJvdG9fX0lOQ0xVREVECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9wbHVnaW4ucHJvdG8KaW5kZXggNjUxZWQxMC4uYWNhZWUxZiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcGx1Z2luLnByb3RvCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3BsdWdpbi5wcm90bwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDQsNyArNDQsMTIgQEAKIC8vIHBsdWdpbiBzaG91bGQgYmUgbmFtZWQgInByb3RvYy1nZW4tJE5BTUUiLCBhbmQgd2lsbCB0aGVuIGJlIHVzZWQgd2hlbiB0aGUKIC8vIGZsYWcgIi0tJHtOQU1FfV9vdXQiIGlzIHBhc3NlZCB0byBwcm90b2MuCiAKK3N5bnRheCA9ICJwcm90bzIiOwogcGFja2FnZSBnb29nbGUucHJvdG9idWYuY29tcGlsZXI7CitvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYuY29tcGlsZXIiOworb3B0aW9uIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gIlBsdWdpblByb3RvcyI7CisKK29wdGlvbiBnb19wYWNrYWdlID0gInBsdWdpbl9nbyI7CiAKIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iOwogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCmluZGV4IDliMTA5MzcuLjA1NTNkZDAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0yOCw2ICsyOCw4IEBACiAvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKIC8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKKy8vI1BZMjUgY29tcGF0aWJsZSBnZW5lcmF0ZWQgY29kZSBmb3IgR0FFLgorLy8gQ29weXJpZ2h0IDIwMDcgR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vIEF1dGhvcjogcm9iaW5zb25AZ29vZ2xlLmNvbSAoV2lsbCBSb2JpbnNvbikKIC8vCiAvLyBUaGlzIG1vZHVsZSBvdXRwdXRzIHB1cmUtUHl0aG9uIHByb3RvY29sIG1lc3NhZ2UgY2xhc3NlcyB0aGF0IHdpbGwKQEAgLTQyLDE2ICs0NCwyMyBAQAogLy8gcGVyZm9ybWFuY2UtbWluZGVkIFB5dGhvbiBjb2RlIGxldmVyYWdlIHRoZSBmYXN0IEMrKyBpbXBsZW1lbnRhdGlvbgogLy8gZGlyZWN0bHkuCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgogI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxtYXA+Ci0jaW5jbHVkZSA8dXRpbGl0eT4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KQEAgLTg0LDYgKzkzLDM3IEBACiB9CiAKIAorLy8gUmV0dXJucyB0aGUgYWxpYXMgd2UgYXNzaWduIHRvIHRoZSBtb2R1bGUgb2YgdGhlIGdpdmVuIC5wcm90byBmaWxlbmFtZQorLy8gd2hlbiBpbXBvcnRpbmcuIFNlZSB0ZXN0UGFja2FnZUluaXRpYWxpemF0aW9uSW1wb3J0IGluCisvLyBnb29nbGUvcHJvdG9idWYvcHl0aG9uL3JlZmxlY3Rpb25fdGVzdC5weQorLy8gdG8gc2VlIHdoeSB3ZSBuZWVkIHRoZSBhbGlhcy4KK3N0cmluZyBNb2R1bGVBbGlhcyhjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZW5hbWUpOworICAvLyBXZSBjYW4ndCBoYXZlIGRvdHMgaW4gdGhlIG1vZHVsZSBuYW1lLCBzbyB3ZSByZXBsYWNlIGVhY2ggd2l0aCBfZG90Xy4KKyAgLy8gQnV0IHRoYXQgY291bGQgbGVhZCB0byBhIGNvbGxpc2lvbiBiZXR3ZWVuIGEuYiBhbmQgYV9kb3RfYiwgc28gd2UgYWxzbworICAvLyBkdXBsaWNhdGUgZWFjaCB1bmRlcnNjb3JlLgorICBHbG9iYWxSZXBsYWNlU3Vic3RyaW5nKCJfIiwgIl9fIiwgJm1vZHVsZV9uYW1lKTsKKyAgR2xvYmFsUmVwbGFjZVN1YnN0cmluZygiLiIsICJfZG90XyIsICZtb2R1bGVfbmFtZSk7CisgIHJldHVybiBtb2R1bGVfbmFtZTsKK30KKworCisvLyBSZXR1cm5zIGFuIGltcG9ydCBzdGF0ZW1lbnQgb2YgZm9ybSAiZnJvbSBYLlkuWiBpbXBvcnQgVCIgZm9yIHRoZSBnaXZlbgorLy8gLnByb3RvIGZpbGVuYW1lLgorc3RyaW5nIE1vZHVsZUltcG9ydFN0YXRlbWVudChjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgIHN0cmluZyBtb2R1bGVfbmFtZSA9IE1vZHVsZU5hbWUoZmlsZW5hbWUpOworICBpbnQgbGFzdF9kb3RfcG9zID0gbW9kdWxlX25hbWUucmZpbmQoJy4nKTsKKyAgaWYgKGxhc3RfZG90X3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAvLyBOT1RFKHBldHlhKTogdGhpcyBpcyBub3QgdGVzdGVkIGFzIGl0IHdvdWxkIHJlcXVpcmUgYSBwcm90b2NvbCBidWZmZXIKKyAgICAvLyBvdXRzaWRlIG9mIGFueSBwYWNrYWdlLCBhbmQgSSBkb24ndCB0aGluayB0aGF0IGlzIGVhc2lseSBhY2hpZXZhYmxlLgorICAgIHJldHVybiAiaW1wb3J0ICIgKyBtb2R1bGVfbmFtZTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gImZyb20gIiArIG1vZHVsZV9uYW1lLnN1YnN0cigwLCBsYXN0X2RvdF9wb3MpICsgIiBpbXBvcnQgIiArCisgICAgICAgIG1vZHVsZV9uYW1lLnN1YnN0cihsYXN0X2RvdF9wb3MgKyAxKTsKKyAgfQorfQorCisKIC8vIFJldHVybnMgdGhlIG5hbWUgb2YgYWxsIGNvbnRhaW5pbmcgdHlwZXMgZm9yIGRlc2NyaXB0b3IsCiAvLyBpbiBvcmRlciBmcm9tIG91dGVybW9zdCB0byBpbm5lcm1vc3QsIGZvbGxvd2VkIGJ5IGRlc2NyaXB0b3IncwogLy8gb3duIG5hbWUuICBFYWNoIG5hbWUgaXMgc2VwYXJhdGVkIGJ5IHxzZXBhcmF0b3J8LgpAQCAtMTA2LDYgKzE0NiwxMiBAQAogY29uc3QgY2hhciBrRGVzY3JpcHRvcktleVtdID0gIkRFU0NSSVBUT1IiOwogCiAKKy8vIERvZXMgdGhlIGZpbGUgaGF2ZSB0b3AtbGV2ZWwgZW51bXM/CitpbmxpbmUgYm9vbCBIYXNUb3BMZXZlbEVudW1zKGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlKSB7CisgIHJldHVybiBmaWxlLT5lbnVtX3R5cGVfY291bnQoKSA+IDA7Cit9CisKKwogLy8gU2hvdWxkIHdlIGdlbmVyYXRlIGdlbmVyaWMgc2VydmljZXMgZm9yIHRoaXMgZmlsZT8KIGlubGluZSBib29sIEhhc0dlbmVyaWNTZXJ2aWNlcyhjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZSkgewogICByZXR1cm4gZmlsZS0+c2VydmljZV9jb3VudCgpID4gMCAmJgpAQCAtMTIwLDEzICsxNjYsMjMgQEAKICAgLy8gVE9ETyhyb2JpbnNvbik6IEFsbG93IHBhcmFtZXRlcml6YXRpb24gb2YgUHl0aG9uIHZlcnNpb24/CiAgIHByaW50ZXItPlByaW50KAogICAgICAgIiMgR2VuZXJhdGVkIGJ5IHRoZSBwcm90b2NvbCBidWZmZXIgY29tcGlsZXIuICBETyBOT1QgRURJVCFcbiIKLSAgICAgICJcbiIKLSAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvclxuIgotICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBtZXNzYWdlXG4iCi0gICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHJlZmxlY3Rpb25cbiIpOworICAgICAgIiMgc291cmNlOiAkZmlsZW5hbWUkXG4iCisgICAgICAiXG5pbXBvcnQgc3lzXG5fYj1zeXMudmVyc2lvbl9pbmZvWzBdPDMgYW5kIChsYW1iZGEgeDp4KSBvciAobGFtYmRhIHg6eC5lbmNvZGUoJ2xhdGluMScpKSIgIC8vIyNQWTI1CisgICAgICAiXG4iLAorICAgICAgImZpbGVuYW1lIiwgZmlsZS0+bmFtZSgpKTsKKyAgaWYgKEhhc1RvcExldmVsRW51bXMoZmlsZSkpIHsKKyAgICBwcmludGVyLT5QcmludCgKKyAgICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmLmludGVybmFsIGltcG9ydCBlbnVtX3R5cGVfd3JhcHBlclxuIik7CisgIH0KKyAgcHJpbnRlci0+UHJpbnQoCisgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IGRlc2NyaXB0b3IgYXMgX2Rlc2NyaXB0b3JcbiIKKyAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgbWVzc2FnZSBhcyBfbWVzc2FnZVxuIgorICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCByZWZsZWN0aW9uIGFzIF9yZWZsZWN0aW9uXG4iCisgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHN5bWJvbF9kYXRhYmFzZSBhcyAiCisgICAgICAiX3N5bWJvbF9kYXRhYmFzZVxuIik7CiAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZSkpIHsKICAgICBwcmludGVyLT5QcmludCgKLSAgICAgICAgImZyb20gZ29vZ2xlLnByb3RvYnVmIGltcG9ydCBzZXJ2aWNlXG4iCisgICAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgc2VydmljZSBhcyBfc2VydmljZVxuIgogICAgICAgICAiZnJvbSBnb29nbGUucHJvdG9idWYgaW1wb3J0IHNlcnZpY2VfcmVmbGVjdGlvblxuIik7CiAgIH0KIApAQCAtMTM2LDcgKzE5Miw4IEBACiAgICAgICAgICJmcm9tIGdvb2dsZS5wcm90b2J1ZiBpbXBvcnQgZGVzY3JpcHRvcl9wYjJcbiIpOwogICB9CiAgIHByaW50ZXItPlByaW50KAotICAgICIjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChpbXBvcnRzKVxuIik7CisgICAgICAiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW1wb3J0cylcblxuIgorICAgICAgIl9zeW1fZGIgPSBfc3ltYm9sX2RhdGFiYXNlLkRlZmF1bHQoKVxuIik7CiAgIHByaW50ZXItPlByaW50KCJcblxuIik7CiB9CiAKQEAgLTE3OCw3ICsyMzUsNyBAQAogICAgICAgICAvLyBpbmZpbml0eSAqIDAgPSBuYW4KICAgICAgICAgcmV0dXJuICIoMWUxMDAwMCAqIDApIjsKICAgICAgIH0gZWxzZSB7Ci0gICAgICAgIHJldHVybiBTaW1wbGVEdG9hKHZhbHVlKTsKKyAgICAgICAgcmV0dXJuICJmbG9hdCgiICsgU2ltcGxlRHRvYSh2YWx1ZSkgKyAiKSI7CiAgICAgICB9CiAgICAgfQogICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CkBAIC0xOTQsNyArMjUxLDcgQEAKICAgICAgICAgLy8gaW5maW5pdHkgLSBpbmZpbml0eSA9IG5hbgogICAgICAgICByZXR1cm4gIigxZTEwMDAwICogMCkiOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgcmV0dXJuIFNpbXBsZUZ0b2EodmFsdWUpOworICAgICAgICByZXR1cm4gImZsb2F0KCIgKyBTaW1wbGVGdG9hKHZhbHVlKSArICIpIjsKICAgICAgIH0KICAgICB9CiAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKQEAgLTIwMiwxMiArMjU5LDEyIEBACiAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKICAgICAgIHJldHVybiBTaW1wbGVJdG9hKGZpZWxkLmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7CiAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HKSB7Ci0gICAgICAgIHJldHVybiAidW5pY29kZShcIiIgKyBDRXNjYXBlKGZpZWxkLmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpICsKLSAgICAgICAgICAgICJcIiwgXCJ1dGYtOFwiKSI7Ci0gICAgICB9IGVsc2UgewotICAgICAgICByZXR1cm4gIlwiIiArIENFc2NhcGUoZmllbGQuZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkgKyAiXCIiOwotICAgICAgfQorLy8jIyFQWTI1ICAgICAgcmV0dXJuICJiXCIiICsgQ0VzY2FwZShmaWVsZC5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSArCisvLyMjIVBZMjUgICAgICAgICAgICAgKGZpZWxkLnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HID8gIlwiIiA6CisvLyMjIVBZMjUgICAgICAgICAgICAgICAiXCIuZGVjb2RlKCd1dGYtOCcpIik7CisgICAgICByZXR1cm4gIl9iKFwiIiArIENFc2NhcGUoZmllbGQuZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSkgKyAgLy8jI1BZMjUKKyAgICAgICAgICAgICAoZmllbGQudHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgPyAiXCIpIiA6ICAvLyMjUFkyNQorICAgICAgICAgICAgICAgIlwiKS5kZWNvZGUoJ3V0Zi04JykiKTsgIC8vIyNQWTI1CiAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKICAgICAgIHJldHVybiAiTm9uZSI7CiAgIH0KQEAgLTIxNyw2ICsyNzQsMTkgQEAKICAgcmV0dXJuICIiOwogfQogCitzdHJpbmcgU3RyaW5naWZ5U3ludGF4KEZpbGVEZXNjcmlwdG9yOjpTeW50YXggc3ludGF4KSB7CisgIHN3aXRjaCAoc3ludGF4KSB7CisgICAgY2FzZSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMjoKKyAgICAgIHJldHVybiAicHJvdG8yIjsKKyAgICBjYXNlIEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zOgorICAgICAgcmV0dXJuICJwcm90bzMiOworICAgIGNhc2UgRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9VTktOT1dOOgorICAgIGRlZmF1bHQ6CisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5zdXBwb3J0ZWQgc3ludGF4OyB0aGlzIGdlbmVyYXRvciBvbmx5IHN1cHBvcnRzIHByb3RvMiAiCisgICAgICAgICAgICAgICAgICAgICJhbmQgcHJvdG8zIHN5bnRheC4iOworICAgICAgcmV0dXJuICIiOworICB9Cit9CiAKIAogfSAgLy8gbmFtZXNwYWNlCkBAIC0yNTIsNyArMzIyLDcgQEAKICAgZmRwLlNlcmlhbGl6ZVRvU3RyaW5nKCZmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8pOwogCiAKLSAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dChjb250ZXh0LT5PcGVuKGZpbGVuYW1lKSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoY29udGV4dC0+T3BlbihmaWxlbmFtZSkpOwogICBHT09HTEVfQ0hFQ0sob3V0cHV0LmdldCgpKTsKICAgaW86OlByaW50ZXIgcHJpbnRlcihvdXRwdXQuZ2V0KCksICckJyk7CiAgIHByaW50ZXJfID0gJnByaW50ZXI7CkBAIC0yNzAsNiArMzQwLDExIEBACiAgIC8vIHNpbmNlIHRoZXkgbmVlZCB0byBjYWxsIHN0YXRpYyBSZWdpc3RlckV4dGVuc2lvbigpIG1ldGhvZHMgb24gdGhlc2UKICAgLy8gY2xhc3Nlcy4KICAgRml4Rm9yZWlnbkZpZWxkc0luRXh0ZW5zaW9ucygpOworICAvLyBEZXNjcmlwdG9yIG9wdGlvbnMgbWF5IGhhdmUgY3VzdG9tIGV4dGVuc2lvbnMuIFRoZXNlIGN1c3RvbSBvcHRpb25zCisgIC8vIGNhbiBvbmx5IGJlIHN1Y2Nlc3NmdWxseSBwYXJzZWQgYWZ0ZXIgd2UgcmVnaXN0ZXIgY29ycmVzcG9uZGluZworICAvLyBleHRlbnNpb25zLiBUaGVyZWZvcmUgd2UgcGFyc2UgYWxsIG9wdGlvbnMgYWdhaW4gaGVyZSB0byByZWNvZ25pemUKKyAgLy8gY3VzdG9tIG9wdGlvbnMgdGhhdCBtYXkgYmUgdW5rbm93biB3aGVuIHdlIGRlZmluZSB0aGUgZGVzY3JpcHRvcnMuCisgIEZpeEFsbERlc2NyaXB0b3JPcHRpb25zKCk7CiAgIGlmIChIYXNHZW5lcmljU2VydmljZXMoZmlsZSkpIHsKICAgICBQcmludFNlcnZpY2VzKCk7CiAgIH0KQEAgLTI4Myw5ICszNTgsMTkgQEAKIC8vIFByaW50cyBQeXRob24gaW1wb3J0cyBmb3IgYWxsIG1vZHVsZXMgaW1wb3J0ZWQgYnkgfGZpbGV8Lgogdm9pZCBHZW5lcmF0b3I6OlByaW50SW1wb3J0cygpIGNvbnN0IHsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyArK2kpIHsKLSAgICBzdHJpbmcgbW9kdWxlX25hbWUgPSBNb2R1bGVOYW1lKGZpbGVfLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCkpOwotICAgIHByaW50ZXJfLT5QcmludCgiaW1wb3J0ICRtb2R1bGUkXG4iLCAibW9kdWxlIiwKLSAgICAgICAgICAgICAgICAgICAgbW9kdWxlX25hbWUpOworICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUgPSBmaWxlXy0+ZGVwZW5kZW5jeShpKS0+bmFtZSgpOworICAgIHN0cmluZyBpbXBvcnRfc3RhdGVtZW50ID0gTW9kdWxlSW1wb3J0U3RhdGVtZW50KGZpbGVuYW1lKTsKKyAgICBzdHJpbmcgbW9kdWxlX2FsaWFzID0gTW9kdWxlQWxpYXMoZmlsZW5hbWUpOworICAgIHByaW50ZXJfLT5QcmludCgiJHN0YXRlbWVudCQgYXMgJGFsaWFzJFxuIiwgInN0YXRlbWVudCIsCisgICAgICAgICAgICAgICAgICAgIGltcG9ydF9zdGF0ZW1lbnQsICJhbGlhcyIsIG1vZHVsZV9hbGlhcyk7CisgICAgQ29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMobW9kdWxlX2FsaWFzLCBmaWxlXy0+ZGVwZW5kZW5jeShpKSk7CisgIH0KKyAgcHJpbnRlcl8tPlByaW50KCJcbiIpOworCisgIC8vIFByaW50IHB1YmxpYyBpbXBvcnRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyArK2kpIHsKKyAgICBzdHJpbmcgbW9kdWxlX25hbWUgPSBNb2R1bGVOYW1lKGZpbGVfLT5wdWJsaWNfZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgICBwcmludGVyXy0+UHJpbnQoImZyb20gJG1vZHVsZSQgaW1wb3J0ICpcbiIsICJtb2R1bGUiLCBtb2R1bGVfbmFtZSk7CiAgIH0KICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwogfQpAQCAtMjk2LDIxICszODEsMzUgQEAKICAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKICAgbVsibmFtZSJdID0gZmlsZV8tPm5hbWUoKTsKICAgbVsicGFja2FnZSJdID0gZmlsZV8tPnBhY2thZ2UoKTsKKyAgbVsic3ludGF4Il0gPSBTdHJpbmdpZnlTeW50YXgoZmlsZV8tPnN5bnRheCgpKTsKICAgY29uc3QgY2hhciBmaWxlX2Rlc2NyaXB0b3JfdGVtcGxhdGVbXSA9Ci0gICAgICAiJGRlc2NyaXB0b3JfbmFtZSQgPSBkZXNjcmlwdG9yLkZpbGVEZXNjcmlwdG9yKFxuIgorICAgICAgIiRkZXNjcmlwdG9yX25hbWUkID0gX2Rlc2NyaXB0b3IuRmlsZURlc2NyaXB0b3IoXG4iCiAgICAgICAiICBuYW1lPSckbmFtZSQnLFxuIgotICAgICAgIiAgcGFja2FnZT0nJHBhY2thZ2UkJyxcbiI7CisgICAgICAiICBwYWNrYWdlPSckcGFja2FnZSQnLFxuIgorICAgICAgIiAgc3ludGF4PSckc3ludGF4JCcsXG4iOwogICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKICAgcHJpbnRlcl8tPkluZGVudCgpOwogICBwcmludGVyXy0+UHJpbnQoCi0gICAgICAic2VyaWFsaXplZF9wYj0nJHZhbHVlJCciLAorLy8jIyFQWTI1ICAgICAgInNlcmlhbGl6ZWRfcGI9YickdmFsdWUkJ1xuIiwKKyAgICAgICJzZXJpYWxpemVkX3BiPV9iKCckdmFsdWUkJylcbiIsICAvLyMjUFkyNQogICAgICAgInZhbHVlIiwgc3RyaW5nczo6Q0hleEVzY2FwZShmaWxlX2Rlc2NyaXB0b3Jfc2VyaWFsaXplZF8pKTsKKyAgaWYgKGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkgIT0gMCkgeworICAgIHByaW50ZXJfLT5QcmludCgiLFxuZGVwZW5kZW5jaWVzPVsiKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCk7ICsraSkgeworICAgICAgc3RyaW5nIG1vZHVsZV9hbGlhcyA9IE1vZHVsZUFsaWFzKGZpbGVfLT5kZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgICAgcHJpbnRlcl8tPlByaW50KCIkbW9kdWxlX2FsaWFzJC5ERVNDUklQVE9SLCIsICJtb2R1bGVfYWxpYXMiLAorICAgICAgICAgICAgICAgICAgICAgIG1vZHVsZV9hbGlhcyk7CisgICAgfQorICAgIHByaW50ZXJfLT5QcmludCgiXSIpOworICB9CiAKICAgLy8gVE9ETyhmYWxrKTogQWxzbyBwcmludCBvcHRpb25zIGFuZCBmaXggdGhlIG1lc3NhZ2VfdHlwZSwgZW51bV90eXBlLAogICAvLyAgICAgICAgICAgICBzZXJ2aWNlIGFuZCBleHRlbnNpb24gbGF0ZXIgaW4gdGhlIGdlbmVyYXRpb24uCiAKICAgcHJpbnRlcl8tPk91dGRlbnQoKTsKICAgcHJpbnRlcl8tPlByaW50KCIpXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCJfc3ltX2RiLlJlZ2lzdGVyRmlsZURlc2NyaXB0b3IoJG5hbWUkKVxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAga0Rlc2NyaXB0b3JLZXkpOwogICBwcmludGVyXy0+UHJpbnQoIlxuIik7CiB9CiAKQEAgLTMyMSwxMiArNDIwLDE3IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpOyArK2kpIHsKICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yID0gKmZpbGVfLT5lbnVtX3R5cGUoaSk7CiAgICAgUHJpbnRFbnVtKGVudW1fZGVzY3JpcHRvcik7CisgICAgcHJpbnRlcl8tPlByaW50KCIkbmFtZSQgPSAiCisgICAgICAgICAgICAgICAgICAgICJlbnVtX3R5cGVfd3JhcHBlci5FbnVtVHlwZVdyYXBwZXIoJGRlc2NyaXB0b3JfbmFtZSQpIiwKKyAgICAgICAgICAgICAgICAgICAgIm5hbWUiLCBlbnVtX2Rlc2NyaXB0b3IubmFtZSgpLAorICAgICAgICAgICAgICAgICAgICAiZGVzY3JpcHRvcl9uYW1lIiwKKyAgICAgICAgICAgICAgICAgICAgTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShlbnVtX2Rlc2NyaXB0b3IpKTsKICAgICBwcmludGVyXy0+UHJpbnQoIlxuIik7CiAKICAgICBmb3IgKGludCBqID0gMDsgaiA8IGVudW1fZGVzY3JpcHRvci52YWx1ZV9jb3VudCgpOyArK2opIHsKICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIHZhbHVlX2Rlc2NyaXB0b3IgPSAqZW51bV9kZXNjcmlwdG9yLnZhbHVlKGopOwogICAgICAgdG9wX2xldmVsX2VudW1fdmFsdWVzLnB1c2hfYmFjaygKLSAgICAgICAgICBtYWtlX3BhaXIodmFsdWVfZGVzY3JpcHRvci5uYW1lKCksIHZhbHVlX2Rlc2NyaXB0b3IubnVtYmVyKCkpKTsKKyAgICAgICAgICBzdGQ6Om1ha2VfcGFpcih2YWx1ZV9kZXNjcmlwdG9yLm5hbWUoKSwgdmFsdWVfZGVzY3JpcHRvci5udW1iZXIoKSkpOwogICAgIH0KICAgfQogCkBAIC0zNTAsMTIgKzQ1NCwxNCBAQAogLy8gZW51bV9kZXNjcmlwdG9yLgogdm9pZCBHZW5lcmF0b3I6OlByaW50RW51bShjb25zdCBFbnVtRGVzY3JpcHRvciYgZW51bV9kZXNjcmlwdG9yKSBjb25zdCB7CiAgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKLSAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGVudW1fZGVzY3JpcHRvcik7CisgIHN0cmluZyBtb2R1bGVfbGV2ZWxfZGVzY3JpcHRvcl9uYW1lID0KKyAgICAgIE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZW51bV9kZXNjcmlwdG9yKTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBtb2R1bGVfbGV2ZWxfZGVzY3JpcHRvcl9uYW1lOwogICBtWyJuYW1lIl0gPSBlbnVtX2Rlc2NyaXB0b3IubmFtZSgpOwogICBtWyJmdWxsX25hbWUiXSA9IGVudW1fZGVzY3JpcHRvci5mdWxsX25hbWUoKTsKICAgbVsiZmlsZSJdID0ga0Rlc2NyaXB0b3JLZXk7CiAgIGNvbnN0IGNoYXIgZW51bV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQotICAgICAgIiRkZXNjcmlwdG9yX25hbWUkID0gZGVzY3JpcHRvci5FbnVtRGVzY3JpcHRvcihcbiIKKyAgICAgICIkZGVzY3JpcHRvcl9uYW1lJCA9IF9kZXNjcmlwdG9yLkVudW1EZXNjcmlwdG9yKFxuIgogICAgICAgIiAgbmFtZT0nJG5hbWUkJyxcbiIKICAgICAgICIgIGZ1bGxfbmFtZT0nJGZ1bGxfbmFtZSQnLFxuIgogICAgICAgIiAgZmlsZW5hbWU9Tm9uZSxcbiIKQEAgLTM4MCw2ICs0ODYsOCBAQAogICBQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKGVudW1fZGVzY3JpcHRvciwgZWRwKTsKICAgcHJpbnRlcl8tPk91dGRlbnQoKTsKICAgcHJpbnRlcl8tPlByaW50KCIpXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCJfc3ltX2RiLlJlZ2lzdGVyRW51bURlc2NyaXB0b3IoJG5hbWUkKVxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgbW9kdWxlX2xldmVsX2Rlc2NyaXB0b3JfbmFtZSk7CiAgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKIH0KIApAQCAtNDM2LDcgKzU0NCw3IEBACiAgIGRlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7CiAKICAgcHJpbnRlcl8tPlByaW50KAotICAgICAgIiRzZXJ2aWNlX25hbWUkID0gZGVzY3JpcHRvci5TZXJ2aWNlRGVzY3JpcHRvcihcbiIsCisgICAgICAiJHNlcnZpY2VfbmFtZSQgPSBfZGVzY3JpcHRvci5TZXJ2aWNlRGVzY3JpcHRvcihcbiIsCiAgICAgICAic2VydmljZV9uYW1lIiwgc2VydmljZV9uYW1lKTsKICAgcHJpbnRlcl8tPkluZGVudCgpOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CkBAIC00NTksNyArNTY3LDYgQEAKICAgcHJpbnRlcl8tPlByaW50KCJtZXRob2RzPVtcbiIpOwogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubWV0aG9kX2NvdW50KCk7ICsraSkgewogICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCA9IGRlc2NyaXB0b3IubWV0aG9kKGkpOwotICAgIHN0cmluZyBvcHRpb25zX3N0cmluZzsKICAgICBtZXRob2QtPm9wdGlvbnMoKS5TZXJpYWxpemVUb1N0cmluZygmb3B0aW9uc19zdHJpbmcpOwogCiAgICAgbS5jbGVhcigpOwpAQCAtNDcwLDcgKzU3Nyw3IEBACiAgICAgbVsiaW5wdXRfdHlwZSJdID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZSgqKG1ldGhvZC0+aW5wdXRfdHlwZSgpKSk7CiAgICAgbVsib3V0cHV0X3R5cGUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoKihtZXRob2QtPm91dHB1dF90eXBlKCkpKTsKICAgICBtWyJvcHRpb25zX3ZhbHVlIl0gPSBPcHRpb25zVmFsdWUoIk1ldGhvZE9wdGlvbnMiLCBvcHRpb25zX3N0cmluZyk7Ci0gICAgcHJpbnRlcl8tPlByaW50KCJkZXNjcmlwdG9yLk1ldGhvZERlc2NyaXB0b3IoXG4iKTsKKyAgICBwcmludGVyXy0+UHJpbnQoIl9kZXNjcmlwdG9yLk1ldGhvZERlc2NyaXB0b3IoXG4iKTsKICAgICBwcmludGVyXy0+SW5kZW50KCk7CiAgICAgcHJpbnRlcl8tPlByaW50KAogICAgICAgICBtLApAQCAtNDg5LDI5ICs1OTYsMzggQEAKICAgcHJpbnRlcl8tPlByaW50KCJdKVxuXG4iKTsKIH0KIAotdm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZUNsYXNzKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7Ci0gIC8vIFByaW50IHRoZSBzZXJ2aWNlLgotICBwcmludGVyXy0+UHJpbnQoImNsYXNzICRjbGFzc19uYW1lJChzZXJ2aWNlLlNlcnZpY2UpOlxuIiwKLSAgICAgICAgICAgICAgICAgICJjbGFzc19uYW1lIiwgZGVzY3JpcHRvci5uYW1lKCkpOwotICBwcmludGVyXy0+SW5kZW50KCk7CisKK3ZvaWQgR2VuZXJhdG9yOjpQcmludERlc2NyaXB0b3JLZXlBbmRNb2R1bGVOYW1lKAorICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CiAgIHByaW50ZXJfLT5QcmludCgKLSAgICAgICJfX21ldGFjbGFzc19fID0gc2VydmljZV9yZWZsZWN0aW9uLkdlbmVyYXRlZFNlcnZpY2VUeXBlXG4iCi0gICAgICAiJGRlc2NyaXB0b3Jfa2V5JCA9ICRkZXNjcmlwdG9yX25hbWUkXG4iLAorICAgICAgIiRkZXNjcmlwdG9yX2tleSQgPSAkZGVzY3JpcHRvcl9uYW1lJCxcbiIsCiAgICAgICAiZGVzY3JpcHRvcl9rZXkiLCBrRGVzY3JpcHRvcktleSwKICAgICAgICJkZXNjcmlwdG9yX25hbWUiLCBNb2R1bGVMZXZlbFNlcnZpY2VEZXNjcmlwdG9yTmFtZShkZXNjcmlwdG9yKSk7CisgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICJfX21vZHVsZV9fID0gJyRtb2R1bGVfbmFtZSQnXG4iLAorICAgICAgIm1vZHVsZV9uYW1lIiwgTW9kdWxlTmFtZShmaWxlXy0+bmFtZSgpKSk7Cit9CisKK3ZvaWQgR2VuZXJhdG9yOjpQcmludFNlcnZpY2VDbGFzcyhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgeworICAvLyBQcmludCB0aGUgc2VydmljZS4KKyAgcHJpbnRlcl8tPlByaW50KCIkY2xhc3NfbmFtZSQgPSBzZXJ2aWNlX3JlZmxlY3Rpb24uR2VuZXJhdGVkU2VydmljZVR5cGUoIgorICAgICAgICAgICAgICAgICAgIickY2xhc3NfbmFtZSQnLCAoX3NlcnZpY2UuU2VydmljZSwpLCBkaWN0KFxuIiwKKyAgICAgICAgICAgICAgICAgICJjbGFzc19uYW1lIiwgZGVzY3JpcHRvci5uYW1lKCkpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIEdlbmVyYXRvcjo6UHJpbnREZXNjcmlwdG9yS2V5QW5kTW9kdWxlTmFtZShkZXNjcmlwdG9yKTsKKyAgcHJpbnRlcl8tPlByaW50KCIpKVxuXG4iKTsKICAgcHJpbnRlcl8tPk91dGRlbnQoKTsKIH0KIAogdm9pZCBHZW5lcmF0b3I6OlByaW50U2VydmljZVN0dWIoY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKICAgLy8gUHJpbnQgdGhlIHNlcnZpY2Ugc3R1Yi4KLSAgcHJpbnRlcl8tPlByaW50KCJjbGFzcyAkY2xhc3NfbmFtZSRfU3R1YigkY2xhc3NfbmFtZSQpOlxuIiwKKyAgcHJpbnRlcl8tPlByaW50KCIkY2xhc3NfbmFtZSRfU3R1YiA9ICIKKyAgICAgICAgICAgICAgICAgICJzZXJ2aWNlX3JlZmxlY3Rpb24uR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlKCIKKyAgICAgICAgICAgICAgICAgICInJGNsYXNzX25hbWUkX1N0dWInLCAoJGNsYXNzX25hbWUkLCksIGRpY3QoXG4iLAogICAgICAgICAgICAgICAgICAgImNsYXNzX25hbWUiLCBkZXNjcmlwdG9yLm5hbWUoKSk7CiAgIHByaW50ZXJfLT5JbmRlbnQoKTsKLSAgcHJpbnRlcl8tPlByaW50KAotICAgICAgIl9fbWV0YWNsYXNzX18gPSBzZXJ2aWNlX3JlZmxlY3Rpb24uR2VuZXJhdGVkU2VydmljZVN0dWJUeXBlXG4iCi0gICAgICAiJGRlc2NyaXB0b3Jfa2V5JCA9ICRkZXNjcmlwdG9yX25hbWUkXG4iLAotICAgICAgImRlc2NyaXB0b3Jfa2V5Iiwga0Rlc2NyaXB0b3JLZXksCi0gICAgICAiZGVzY3JpcHRvcl9uYW1lIiwgTW9kdWxlTGV2ZWxTZXJ2aWNlRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcikpOworICBHZW5lcmF0b3I6OlByaW50RGVzY3JpcHRvcktleUFuZE1vZHVsZU5hbWUoZGVzY3JpcHRvcik7CisgIHByaW50ZXJfLT5QcmludCgiKSlcblxuIik7CiAgIHByaW50ZXJfLT5PdXRkZW50KCk7CiB9CiAKQEAgLTUyMyw3ICs2MzksNyBAQAogICBQcmludE5lc3RlZERlc2NyaXB0b3JzKG1lc3NhZ2VfZGVzY3JpcHRvcik7CiAKICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotICBwcmludGVyXy0+UHJpbnQoIiRkZXNjcmlwdG9yX25hbWUkID0gZGVzY3JpcHRvci5EZXNjcmlwdG9yKFxuIiwKKyAgcHJpbnRlcl8tPlByaW50KCIkZGVzY3JpcHRvcl9uYW1lJCA9IF9kZXNjcmlwdG9yLkRlc2NyaXB0b3IoXG4iLAogICAgICAgICAgICAgICAgICAgImRlc2NyaXB0b3JfbmFtZSIsCiAgICAgICAgICAgICAgICAgICBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKG1lc3NhZ2VfZGVzY3JpcHRvcikpOwogICBwcmludGVyXy0+SW5kZW50KCk7CkBAIC01NjUsMTAgKzY4MSwxMiBAQAogICBtZXNzYWdlX2Rlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZVRvU3RyaW5nKCZvcHRpb25zX3N0cmluZyk7CiAgIHByaW50ZXJfLT5QcmludCgKICAgICAgICJvcHRpb25zPSRvcHRpb25zX3ZhbHVlJCxcbiIKLSAgICAgICJpc19leHRlbmRhYmxlPSRleHRlbmRhYmxlJCIsCisgICAgICAiaXNfZXh0ZW5kYWJsZT0kZXh0ZW5kYWJsZSQsXG4iCisgICAgICAic3ludGF4PSckc3ludGF4JCciLAogICAgICAgIm9wdGlvbnNfdmFsdWUiLCBPcHRpb25zVmFsdWUoIk1lc3NhZ2VPcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpLAogICAgICAgImV4dGVuZGFibGUiLCBtZXNzYWdlX2Rlc2NyaXB0b3IuZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwID8KLSAgICAgICAgICAgICAgICAgICAgICAiVHJ1ZSIgOiAiRmFsc2UiKTsKKyAgICAgICAgICAgICAgICAgICAgICAiVHJ1ZSIgOiAiRmFsc2UiLAorICAgICAgInN5bnRheCIsIFN0cmluZ2lmeVN5bnRheChtZXNzYWdlX2Rlc2NyaXB0b3IuZmlsZSgpLT5zeW50YXgoKSkpOwogICBwcmludGVyXy0+UHJpbnQoIixcbiIpOwogCiAgIC8vIEV4dGVuc2lvbiByYW5nZXMKQEAgLTU4MSw3ICs2OTksMjIgQEAKICAgICAgICAgICAgICAgICAgICAgImVuZCIsIFNpbXBsZUl0b2EocmFuZ2UtPmVuZCkpOwogICB9CiAgIHByaW50ZXJfLT5QcmludCgiXSxcbiIpOwotCisgIHByaW50ZXJfLT5QcmludCgib25lb2ZzPVtcbiIpOworICBwcmludGVyXy0+SW5kZW50KCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV9kZXNjcmlwdG9yLm9uZW9mX2RlY2xfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBkZXNjID0gbWVzc2FnZV9kZXNjcmlwdG9yLm9uZW9mX2RlY2woaSk7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiBtOworICAgIG1bIm5hbWUiXSA9IGRlc2MtPm5hbWUoKTsKKyAgICBtWyJmdWxsX25hbWUiXSA9IGRlc2MtPmZ1bGxfbmFtZSgpOworICAgIG1bImluZGV4Il0gPSBTaW1wbGVJdG9hKGRlc2MtPmluZGV4KCkpOworICAgIHByaW50ZXJfLT5QcmludCgKKyAgICAgICAgbSwKKyAgICAgICAgIl9kZXNjcmlwdG9yLk9uZW9mRGVzY3JpcHRvcihcbiIKKyAgICAgICAgIiAgbmFtZT0nJG5hbWUkJywgZnVsbF9uYW1lPSckZnVsbF9uYW1lJCcsXG4iCisgICAgICAgICIgIGluZGV4PSRpbmRleCQsIGNvbnRhaW5pbmdfdHlwZT1Ob25lLCBmaWVsZHM9W10pLFxuIik7CisgIH0KKyAgcHJpbnRlcl8tPk91dGRlbnQoKTsKKyAgcHJpbnRlcl8tPlByaW50KCJdLFxuIik7CiAgIC8vIFNlcmlhbGl6YXRpb24gb2YgcHJvdG8KICAgRGVzY3JpcHRvclByb3RvIGVkcDsKICAgUHJpbnRTZXJpYWxpemVkUGJJbnRlcnZhbChtZXNzYWdlX2Rlc2NyaXB0b3IsIGVkcCk7CkBAIC02MDQsNyArNzM3LDEyIEBACiAvLyBQcmludHMgYWxsIG1lc3NhZ2VzIGluIHxmaWxlfC4KIHZvaWQgR2VuZXJhdG9yOjpQcmludE1lc3NhZ2VzKCkgY29uc3QgewogICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKTsgKytpKSB7Ci0gICAgUHJpbnRNZXNzYWdlKCpmaWxlXy0+bWVzc2FnZV90eXBlKGkpKTsKKyAgICB2ZWN0b3I8c3RyaW5nPiB0b19yZWdpc3RlcjsKKyAgICBQcmludE1lc3NhZ2UoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSksICIiLCAmdG9fcmVnaXN0ZXIpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgdG9fcmVnaXN0ZXIuc2l6ZSgpOyArK2opIHsKKyAgICAgIHByaW50ZXJfLT5QcmludCgiX3N5bV9kYi5SZWdpc3Rlck1lc3NhZ2UoJG5hbWUkKVxuIiwgIm5hbWUiLAorICAgICAgICAgICAgICAgICAgICAgIHRvX3JlZ2lzdGVyW2pdKTsKKyAgICB9CiAgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwogICB9CiB9CkBAIC02MTYsMzMgKzc1NCw0MCBAQAogLy8gcmVmbGVjdGlvbi5weSB3aWxsIHVzZSB0byBjb25zdHJ1Y3QgdGhlIG1lYXQgb2YgdGhlIGNsYXNzIGl0c2VsZi4KIC8vCiAvLyBNdXR1YWxseSByZWN1cnNpdmUgd2l0aCBQcmludE5lc3RlZE1lc3NhZ2VzKCkuCi12b2lkIEdlbmVyYXRvcjo6UHJpbnRNZXNzYWdlKAotICAgIGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvcikgY29uc3QgewotICBwcmludGVyXy0+UHJpbnQoImNsYXNzICRuYW1lJChtZXNzYWdlLk1lc3NhZ2UpOlxuIiwgIm5hbWUiLAotICAgICAgICAgICAgICAgICAgbWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKSk7CisvLyBDb2xsZWN0IG5lc3RlZCBtZXNzYWdlIG5hbWVzIHRvX3JlZ2lzdGVyIGZvciB0aGUgc3ltYm9sX2RhdGFiYXNlLgordm9pZCBHZW5lcmF0b3I6OlByaW50TWVzc2FnZShjb25zdCBEZXNjcmlwdG9yJiBtZXNzYWdlX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogdG9fcmVnaXN0ZXIpIGNvbnN0IHsKKyAgc3RyaW5nIHF1YWxpZmllZF9uYW1lKHByZWZpeCArIG1lc3NhZ2VfZGVzY3JpcHRvci5uYW1lKCkpOworICB0b19yZWdpc3Rlci0+cHVzaF9iYWNrKHF1YWxpZmllZF9uYW1lKTsKKyAgcHJpbnRlcl8tPlByaW50KAorICAgICAgIiRuYW1lJCA9IF9yZWZsZWN0aW9uLkdlbmVyYXRlZFByb3RvY29sTWVzc2FnZVR5cGUoJyRuYW1lJCcsICIKKyAgICAgICIoX21lc3NhZ2UuTWVzc2FnZSwpLCBkaWN0KFxuIiwKKyAgICAgICJuYW1lIiwgbWVzc2FnZV9kZXNjcmlwdG9yLm5hbWUoKSk7CiAgIHByaW50ZXJfLT5JbmRlbnQoKTsKLSAgcHJpbnRlcl8tPlByaW50KCJfX21ldGFjbGFzc19fID0gcmVmbGVjdGlvbi5HZW5lcmF0ZWRQcm90b2NvbE1lc3NhZ2VUeXBlXG4iKTsKLSAgUHJpbnROZXN0ZWRNZXNzYWdlcyhtZXNzYWdlX2Rlc2NyaXB0b3IpOworCisgIFByaW50TmVzdGVkTWVzc2FnZXMobWVzc2FnZV9kZXNjcmlwdG9yLCBxdWFsaWZpZWRfbmFtZSArICIuIiwgdG9fcmVnaXN0ZXIpOwogICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CiAgIG1bImRlc2NyaXB0b3Jfa2V5Il0gPSBrRGVzY3JpcHRvcktleTsKICAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKG1lc3NhZ2VfZGVzY3JpcHRvcik7Ci0gIHByaW50ZXJfLT5QcmludChtLCAiJGRlc2NyaXB0b3Jfa2V5JCA9ICRkZXNjcmlwdG9yX25hbWUkXG4iKTsKLQotICBwcmludGVyXy0+UHJpbnQoCi0gICAgIlxuIgotICAgICIjIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTokZnVsbF9uYW1lJClcbiIsCi0gICAgImZ1bGxfbmFtZSIsIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUoKSk7Ci0KKyAgcHJpbnRlcl8tPlByaW50KG0sICIkZGVzY3JpcHRvcl9rZXkkID0gJGRlc2NyaXB0b3JfbmFtZSQsXG4iKTsKKyAgcHJpbnRlcl8tPlByaW50KCJfX21vZHVsZV9fID0gJyRtb2R1bGVfbmFtZSQnXG4iLAorICAgICAgICAgICAgICAgICAgIm1vZHVsZV9uYW1lIiwgTW9kdWxlTmFtZShmaWxlXy0+bmFtZSgpKSk7CisgIHByaW50ZXJfLT5QcmludCgiIyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6JGZ1bGxfbmFtZSQpXG4iLAorICAgICAgICAgICAgICAgICAgImZ1bGxfbmFtZSIsIG1lc3NhZ2VfZGVzY3JpcHRvci5mdWxsX25hbWUoKSk7CisgIHByaW50ZXJfLT5QcmludCgiKSlcbiIpOwogICBwcmludGVyXy0+T3V0ZGVudCgpOwogfQogCiAvLyBQcmludHMgYWxsIG5lc3RlZCBtZXNzYWdlcyB3aXRoaW4gfGNvbnRhaW5pbmdfZGVzY3JpcHRvcnwuCiAvLyBNdXR1YWxseSByZWN1cnNpdmUgd2l0aCBQcmludE1lc3NhZ2UoKS4KLXZvaWQgR2VuZXJhdG9yOjpQcmludE5lc3RlZE1lc3NhZ2VzKAotICAgIGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3Qgewordm9pZCBHZW5lcmF0b3I6OlByaW50TmVzdGVkTWVzc2FnZXMoY29uc3QgRGVzY3JpcHRvciYgY29udGFpbmluZ19kZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogdG9fcmVnaXN0ZXIpIGNvbnN0IHsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBjb250YWluaW5nX2Rlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CiAgICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwotICAgIFByaW50TWVzc2FnZSgqY29udGFpbmluZ19kZXNjcmlwdG9yLm5lc3RlZF90eXBlKGkpKTsKKyAgICBQcmludE1lc3NhZ2UoKmNvbnRhaW5pbmdfZGVzY3JpcHRvci5uZXN0ZWRfdHlwZShpKSwgcHJlZml4LCB0b19yZWdpc3Rlcik7CisgICAgcHJpbnRlcl8tPlByaW50KCIsXG4iKTsKICAgfQogfQogCkBAIC02NzAsNiArODE1LDIzIEBACiAgICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpkZXNjcmlwdG9yLmVudW1fdHlwZShpKTsKICAgICBGaXhDb250YWluaW5nVHlwZUluRGVzY3JpcHRvcihlbnVtX2Rlc2NyaXB0b3IsICZkZXNjcmlwdG9yKTsKICAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3Iub25lb2ZfZGVjbF9jb3VudCgpOyArK2kpIHsKKyAgICBtYXA8c3RyaW5nLCBzdHJpbmc+IG07CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZiA9IGRlc2NyaXB0b3Iub25lb2ZfZGVjbChpKTsKKyAgICBtWyJkZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgICAgbVsib25lb2ZfbmFtZSJdID0gb25lb2YtPm5hbWUoKTsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IG9uZW9mLT5maWVsZF9jb3VudCgpOyArK2opIHsKKyAgICAgIG1bImZpZWxkX25hbWUiXSA9IG9uZW9mLT5maWVsZChqKS0+bmFtZSgpOworICAgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAgIG0sCisgICAgICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLm9uZW9mc19ieV9uYW1lWyckb25lb2ZfbmFtZSQnXS5maWVsZHMuYXBwZW5kKFxuIgorICAgICAgICAgICIgICRkZXNjcmlwdG9yX25hbWUkLmZpZWxkc19ieV9uYW1lWyckZmllbGRfbmFtZSQnXSlcbiIpOworICAgICAgcHJpbnRlcl8tPlByaW50KAorICAgICAgICAgIG0sCisgICAgICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLmZpZWxkc19ieV9uYW1lWyckZmllbGRfbmFtZSQnXS5jb250YWluaW5nX29uZW9mID0gIgorICAgICAgICAgICIkZGVzY3JpcHRvcl9uYW1lJC5vbmVvZnNfYnlfbmFtZVsnJG9uZW9mX25hbWUkJ11cbiIpOworICAgIH0KKyAgfQogfQogCiB2b2lkIEdlbmVyYXRvcjo6QWRkTWVzc2FnZVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgewpAQCAtNjgzLDYgKzg0NSwyOSBAQAogICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKIH0KIAordm9pZCBHZW5lcmF0b3I6OkFkZEVudW1Ub0ZpbGVEZXNjcmlwdG9yKAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgbVsiZW51bV9uYW1lIl0gPSBkZXNjcmlwdG9yLm5hbWUoKTsKKyAgbVsiZW51bV9kZXNjcmlwdG9yX25hbWUiXSA9IE1vZHVsZUxldmVsRGVzY3JpcHRvck5hbWUoZGVzY3JpcHRvcik7CisgIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQorICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLmVudW1fdHlwZXNfYnlfbmFtZVsnJGVudW1fbmFtZSQnXSA9ICIKKyAgICAgICIkZW51bV9kZXNjcmlwdG9yX25hbWUkXG4iOworICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKK30KKwordm9pZCBHZW5lcmF0b3I6OkFkZEV4dGVuc2lvblRvRmlsZURlc2NyaXB0b3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdCB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gbTsKKyAgbVsiZGVzY3JpcHRvcl9uYW1lIl0gPSBrRGVzY3JpcHRvcktleTsKKyAgbVsiZmllbGRfbmFtZSJdID0gZGVzY3JpcHRvci5uYW1lKCk7CisgIGNvbnN0IGNoYXIgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlW10gPQorICAgICAgIiRkZXNjcmlwdG9yX25hbWUkLmV4dGVuc2lvbnNfYnlfbmFtZVsnJGZpZWxkX25hbWUkJ10gPSAiCisgICAgICAiJGZpZWxkX25hbWUkXG4iOworICBwcmludGVyXy0+UHJpbnQobSwgZmlsZV9kZXNjcmlwdG9yX3RlbXBsYXRlKTsKK30KKwogLy8gU2V0cyBhbnkgbmVjZXNzYXJ5IG1lc3NhZ2VfdHlwZSBhbmQgZW51bV90eXBlIGF0dHJpYnV0ZXMKIC8vIGZvciB0aGUgUHl0aG9uIHZlcnNpb24gb2YgfGZpZWxkfC4KIC8vCkBAIC03NDcsNyArOTMyLDcgQEAKICAgICBjb25zdCBzdHJpbmcgcGFyZW50X25hbWUgPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKAogICAgICAgICAqY29udGFpbmluZ19kZXNjcmlwdG9yKTsKICAgICBwcmludGVyXy0+UHJpbnQoCi0gICAgICAgICIkbmVzdGVkX25hbWUkLmNvbnRhaW5pbmdfdHlwZSA9ICRwYXJlbnRfbmFtZSQ7XG4iLAorICAgICAgICAiJG5lc3RlZF9uYW1lJC5jb250YWluaW5nX3R5cGUgPSAkcGFyZW50X25hbWUkXG4iLAogICAgICAgICAibmVzdGVkX25hbWUiLCBuZXN0ZWRfbmFtZSwKICAgICAgICAgInBhcmVudF9uYW1lIiwgcGFyZW50X25hbWUpOwogICB9CkBAIC03NjQsNiArOTQ5LDEyIEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKICAgICBBZGRNZXNzYWdlVG9GaWxlRGVzY3JpcHRvcigqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CiAgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEFkZEVudW1Ub0ZpbGVEZXNjcmlwdG9yKCpmaWxlXy0+ZW51bV90eXBlKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5leHRlbnNpb25fY291bnQoKTsgKytpKSB7CisgICAgQWRkRXh0ZW5zaW9uVG9GaWxlRGVzY3JpcHRvcigqZmlsZV8tPmV4dGVuc2lvbihpKSk7CisgIH0KICAgcHJpbnRlcl8tPlByaW50KCJcbiIpOwogfQogCkBAIC03NzksNiArOTcwLDcgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCk7ICsraSkgewogICAgIEZpeEZvcmVpZ25GaWVsZHNJbk5lc3RlZEV4dGVuc2lvbnMoKmZpbGVfLT5tZXNzYWdlX3R5cGUoaSkpOwogICB9CisgIHByaW50ZXJfLT5QcmludCgiXG4iKTsKIH0KIAogdm9pZCBHZW5lcmF0b3I6OkZpeEZvcmVpZ25GaWVsZHNJbkV4dGVuc2lvbigKQEAgLTgyOSw3ICsxMDIxLDcgQEAKICAgbVsib3B0aW9ucyJdID0gT3B0aW9uc1ZhbHVlKCJFbnVtVmFsdWVPcHRpb25zIiwgb3B0aW9uc19zdHJpbmcpOwogICBwcmludGVyXy0+UHJpbnQoCiAgICAgICBtLAotICAgICAgImRlc2NyaXB0b3IuRW51bVZhbHVlRGVzY3JpcHRvcihcbiIKKyAgICAgICJfZGVzY3JpcHRvci5FbnVtVmFsdWVEZXNjcmlwdG9yKFxuIgogICAgICAgIiAgbmFtZT0nJG5hbWUkJywgaW5kZXg9JGluZGV4JCwgbnVtYmVyPSRudW1iZXIkLFxuIgogICAgICAgIiAgb3B0aW9ucz0kb3B0aW9ucyQsXG4iCiAgICAgICAiICB0eXBlPU5vbmUpIik7CkBAIC04NDMsOCArMTAzNSwxMCBAQAogICAgIHJldHVybiAiTm9uZSI7CiAgIH0gZWxzZSB7CiAgICAgc3RyaW5nIGZ1bGxfY2xhc3NfbmFtZSA9ICJkZXNjcmlwdG9yX3BiMi4iICsgY2xhc3NfbmFtZTsKLSAgICByZXR1cm4gImRlc2NyaXB0b3IuX1BhcnNlT3B0aW9ucygiICsgZnVsbF9jbGFzc19uYW1lICsgIigpLCAnIgotICAgICAgICArIENFc2NhcGUoc2VyaWFsaXplZF9vcHRpb25zKSsgIicpIjsKKy8vIyMhUFkyNSAgICByZXR1cm4gIl9kZXNjcmlwdG9yLl9QYXJzZU9wdGlvbnMoIiArIGZ1bGxfY2xhc3NfbmFtZSArICIoKSwgYiciCisvLyMjIVBZMjUgICAgICAgICsgQ0VzY2FwZShzZXJpYWxpemVkX29wdGlvbnMpKyAiJykiOworICAgIHJldHVybiAiX2Rlc2NyaXB0b3IuX1BhcnNlT3B0aW9ucygiICsgZnVsbF9jbGFzc19uYW1lICsgIigpLCBfYignIiAgLy8jI1BZMjUKKyAgICAgICAgKyBDRXNjYXBlKHNlcmlhbGl6ZWRfb3B0aW9ucykrICInKSkiOyAgLy8jI1BZMjUKICAgfQogfQogCkBAIC04NjksNyArMTA2Myw3IEBACiAgIC8vIHRoZXNlIGZpZWxkcyBpbiBjb3JyZWN0bHkgYWZ0ZXIgYWxsIHJlZmVyZW5jZWQgZGVzY3JpcHRvcnMgaGF2ZSBiZWVuCiAgIC8vIGRlZmluZWQgYW5kL29yIGltcG9ydGVkIChzZWUgRml4Rm9yZWlnbkZpZWxkc0luRGVzY3JpcHRvcnMoKSkuCiAgIGNvbnN0IGNoYXIgZmllbGRfZGVzY3JpcHRvcl9kZWNsW10gPQotICAgICJkZXNjcmlwdG9yLkZpZWxkRGVzY3JpcHRvcihcbiIKKyAgICAiX2Rlc2NyaXB0b3IuRmllbGREZXNjcmlwdG9yKFxuIgogICAgICIgIG5hbWU9JyRuYW1lJCcsIGZ1bGxfbmFtZT0nJGZ1bGxfbmFtZSQnLCBpbmRleD0kaW5kZXgkLFxuIgogICAgICIgIG51bWJlcj0kbnVtYmVyJCwgdHlwZT0kdHlwZSQsIGNwcF90eXBlPSRjcHBfdHlwZSQsIGxhYmVsPSRsYWJlbCQsXG4iCiAgICAgIiAgaGFzX2RlZmF1bHRfdmFsdWU9JGhhc19kZWZhdWx0X3ZhbHVlJCwgZGVmYXVsdF92YWx1ZT0kZGVmYXVsdF92YWx1ZSQsXG4iCkBAIC05NDcsNyArMTE0MSw3IEBACiAgIC8vIFdlIG5vdyBoYXZlIHRoZSBuYW1lIHJlbGF0aXZlIHRvIGl0cyBvd24gbW9kdWxlLiAgQWxzbyBxdWFsaWZ5IHdpdGgKICAgLy8gdGhlIG1vZHVsZSBuYW1lIGlmZiB0aGlzIGRlc2NyaXB0b3IgaXMgZnJvbSBhIGRpZmZlcmVudCAucHJvdG8gZmlsZS4KICAgaWYgKGRlc2NyaXB0b3IuZmlsZSgpICE9IGZpbGVfKSB7Ci0gICAgbmFtZSA9IE1vZHVsZU5hbWUoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOworICAgIG5hbWUgPSBNb2R1bGVBbGlhcyhkZXNjcmlwdG9yLmZpbGUoKS0+bmFtZSgpKSArICIuIiArIG5hbWU7CiAgIH0KICAgcmV0dXJuIG5hbWU7CiB9CkBAIC05NTksNyArMTE1Myw3IEBACiBzdHJpbmcgR2VuZXJhdG9yOjpNb2R1bGVMZXZlbE1lc3NhZ2VOYW1lKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKICAgc3RyaW5nIG5hbWUgPSBOYW1lUHJlZml4ZWRXaXRoTmVzdGVkVHlwZXMoZGVzY3JpcHRvciwgIi4iKTsKICAgaWYgKGRlc2NyaXB0b3IuZmlsZSgpICE9IGZpbGVfKSB7Ci0gICAgbmFtZSA9IE1vZHVsZU5hbWUoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOworICAgIG5hbWUgPSBNb2R1bGVBbGlhcyhkZXNjcmlwdG9yLmZpbGUoKS0+bmFtZSgpKSArICIuIiArIG5hbWU7CiAgIH0KICAgcmV0dXJuIG5hbWU7CiB9CkBAIC05NzIsNyArMTE2Niw3IEBACiAgIFVwcGVyU3RyaW5nKCZuYW1lKTsKICAgbmFtZSA9ICJfIiArIG5hbWU7CiAgIGlmIChkZXNjcmlwdG9yLmZpbGUoKSAhPSBmaWxlXykgewotICAgIG5hbWUgPSBNb2R1bGVOYW1lKGRlc2NyaXB0b3IuZmlsZSgpLT5uYW1lKCkpICsgIi4iICsgbmFtZTsKKyAgICBuYW1lID0gTW9kdWxlQWxpYXMoZGVzY3JpcHRvci5maWxlKCktPm5hbWUoKSkgKyAiLiIgKyBuYW1lOwogICB9CiAgIHJldHVybiBuYW1lOwogfQpAQCAtMTAwMCw2ICsxMTk0LDEzNyBAQAogICAgICAgICAgICAgICAgICAgInNlcmlhbGl6ZWRfZW5kIiwgU2ltcGxlSXRvYShvZmZzZXQgKyBzcC5zaXplKCkpKTsKIH0KIAorbmFtZXNwYWNlIHsKK3ZvaWQgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoY29uc3Qgc3RyaW5nJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG9wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpQcmludGVyKiBwcmludGVyKSB7CisgIC8vIFRPRE8oeGlhb2ZlbmcpOiBJIGhhdmUgYWRkZWQgYSBtZXRob2QgX1NldE9wdGlvbnMoKSB0byBEZXNjcmlwdG9yQmFzZQorICAvLyBpbiBwcm90bzIgcHl0aG9uIHJ1bnRpbWUgYnV0IGl0IGNvdWxkbid0IGJlIHVzZWQgaGVyZSBiZWNhdXNlIGFwcGVuZ2luZQorICAvLyB1c2VzIGEgc25hcHNob3QgdmVyc2lvbiBvZiB0aGUgbGlicmFyeSBpbiB3aGljaCB0aGUgbmV3IG1ldGhvZCBpcyBub3QKKyAgLy8geWV0IHByZXNlbnQuIEFmdGVyIGFwcGVuZ2luZSBoYXMgc3luY2VkIHRoZWlyIHJ1bnRpbWUgbGlicmFyeSwgdGhlIGNvZGUKKyAgLy8gYmVsb3cgc2hvdWxkIGJlIGNsZWFuZWQgdXAgdG8gdXNlIF9TZXRPcHRpb25zKCkuCisgIHByaW50ZXItPlByaW50KAorICAgICAgIiRkZXNjcmlwdG9yJC5oYXNfb3B0aW9ucyA9IFRydWVcbiIKKyAgICAgICIkZGVzY3JpcHRvciQuX29wdGlvbnMgPSAkb3B0aW9ucyRcbiIsCisgICAgICAiZGVzY3JpcHRvciIsIGRlc2NyaXB0b3IsICJvcHRpb25zIiwgb3B0aW9ucyk7Cit9Cit9ICAvLyBuYW1lc3BhY2UKKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZpZWxkIG9mIGFsbCBkZXNjcmlwdG9ycy4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhBbGxEZXNjcmlwdG9yT3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gUHJpbnRzIGFuIGV4cHJlc3Npb24gdGhhdCBzZXRzIHRoZSBmaWxlIGRlc2NyaXB0b3IncyBvcHRpb25zLgorICBzdHJpbmcgZmlsZV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAorICAgICAgIkZpbGVPcHRpb25zIiwgZmlsZV8tPm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgaWYgKGZpbGVfb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShrRGVzY3JpcHRvcktleSwgZmlsZV9vcHRpb25zLCBwcmludGVyXyk7CisgIH0KKyAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGVudW1zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvciA9ICpmaWxlXy0+ZW51bV90eXBlKGkpOworICAgIEZpeE9wdGlvbnNGb3JFbnVtKGVudW1fZGVzY3JpcHRvcik7CisgIH0KKyAgLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbGwgdG9wIGxldmVsIGV4dGVuc2lvbnMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmZpbGVfLT5leHRlbnNpb24oaSk7CisgICAgRml4T3B0aW9uc0ZvckZpZWxkKGZpZWxkKTsKKyAgfQorICAvLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGFsbCBtZXNzYWdlcywgbmVzdGVkIGVudW1zLAorICAvLyBuZXN0ZWQgZXh0ZW5zaW9ucyBhbmQgbWVzc2FnZSBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBGaXhPcHRpb25zRm9yTWVzc2FnZSgqZmlsZV8tPm1lc3NhZ2VfdHlwZShpKSk7CisgIH0KK30KKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBhbiBlbnVtIGRlc2NyaXB0b3IgYW5kIGl0cworLy8gdmFsdWUgZGVzY3JpcHRvcnMuCit2b2lkIEdlbmVyYXRvcjo6Rml4T3B0aW9uc0ZvckVudW0oY29uc3QgRW51bURlc2NyaXB0b3ImIGVudW1fZGVzY3JpcHRvcikgY29uc3QgeworICBzdHJpbmcgZGVzY3JpcHRvcl9uYW1lID0gTW9kdWxlTGV2ZWxEZXNjcmlwdG9yTmFtZShlbnVtX2Rlc2NyaXB0b3IpOworICBzdHJpbmcgZW51bV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAorICAgICAgIkVudW1PcHRpb25zIiwgZW51bV9kZXNjcmlwdG9yLm9wdGlvbnMoKS5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgaWYgKGVudW1fb3B0aW9ucyAhPSAiTm9uZSIpIHsKKyAgICBQcmludERlc2NyaXB0b3JPcHRpb25zRml4aW5nQ29kZShkZXNjcmlwdG9yX25hbWUsIGVudW1fb3B0aW9ucywgcHJpbnRlcl8pOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV9kZXNjcmlwdG9yLnZhbHVlX2NvdW50KCk7ICsraSkgeworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIHZhbHVlX2Rlc2NyaXB0b3IgPSAqZW51bV9kZXNjcmlwdG9yLnZhbHVlKGkpOworICAgIHN0cmluZyB2YWx1ZV9vcHRpb25zID0gT3B0aW9uc1ZhbHVlKAorICAgICAgICAiRW51bVZhbHVlT3B0aW9ucyIsIHZhbHVlX2Rlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICAgIGlmICh2YWx1ZV9vcHRpb25zICE9ICJOb25lIikgeworICAgICAgUHJpbnREZXNjcmlwdG9yT3B0aW9uc0ZpeGluZ0NvZGUoCisgICAgICAgICAgU3RyaW5nUHJpbnRmKCIlcy52YWx1ZXNfYnlfbmFtZVtcIiVzXCJdIiwgZGVzY3JpcHRvcl9uYW1lLmNfc3RyKCksCisgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlX2Rlc2NyaXB0b3IubmFtZSgpLmNfc3RyKCkpLAorICAgICAgICAgIHZhbHVlX29wdGlvbnMsIHByaW50ZXJfKTsKKyAgICB9CisgIH0KK30KKworLy8gUHJpbnRzIGV4cHJlc3Npb25zIHRoYXQgc2V0IHRoZSBvcHRpb25zIGZvciBmaWVsZCBkZXNjcmlwdG9ycyAoaW5jbHVkaW5nCisvLyBleHRlbnNpb25zKS4KK3ZvaWQgR2VuZXJhdG9yOjpGaXhPcHRpb25zRm9yRmllbGQoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCkgY29uc3QgeworICBzdHJpbmcgZmllbGRfb3B0aW9ucyA9IE9wdGlvbnNWYWx1ZSgKKyAgICAgICJGaWVsZE9wdGlvbnMiLCBmaWVsZC5vcHRpb25zKCkuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIGlmIChmaWVsZF9vcHRpb25zICE9ICJOb25lIikgeworICAgIHN0cmluZyBmaWVsZF9uYW1lOworICAgIGlmIChmaWVsZC5pc19leHRlbnNpb24oKSkgeworICAgICAgaWYgKGZpZWxkLmV4dGVuc2lvbl9zY29wZSgpID09IE5VTEwpIHsKKyAgICAgICAgLy8gVG9wIGxldmVsIGV4dGVuc2lvbnMuCisgICAgICAgIGZpZWxkX25hbWUgPSBmaWVsZC5uYW1lKCk7CisgICAgICB9IGVsc2UgeworICAgICAgICBmaWVsZF9uYW1lID0gRmllbGRSZWZlcmVuY2luZ0V4cHJlc3Npb24oCisgICAgICAgICAgICBmaWVsZC5leHRlbnNpb25fc2NvcGUoKSwgZmllbGQsICJleHRlbnNpb25zX2J5X25hbWUiKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgZmllbGRfbmFtZSA9IEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKAorICAgICAgICAgIGZpZWxkLmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZCwgImZpZWxkc19ieV9uYW1lIik7CisgICAgfQorICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGZpZWxkX25hbWUsIGZpZWxkX29wdGlvbnMsIHByaW50ZXJfKTsKKyAgfQorfQorCisvLyBQcmludHMgZXhwcmVzc2lvbnMgdGhhdCBzZXQgdGhlIG9wdGlvbnMgZm9yIGEgbWVzc2FnZSBhbmQgYWxsIGl0cyBpbm5lcgorLy8gdHlwZXMgKG5lc3RlZCBtZXNzYWdlcywgbmVzdGVkIGVudW1zLCBleHRlbnNpb25zLCBmaWVsZHMpLgordm9pZCBHZW5lcmF0b3I6OkZpeE9wdGlvbnNGb3JNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0IHsKKyAgLy8gTmVzdGVkIG1lc3NhZ2VzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IubmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgRml4T3B0aW9uc0Zvck1lc3NhZ2UoKmRlc2NyaXB0b3IubmVzdGVkX3R5cGUoaSkpOworICB9CisgIC8vIEVudW1zLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIEZpeE9wdGlvbnNGb3JFbnVtKCpkZXNjcmlwdG9yLmVudW1fdHlwZShpKSk7CisgIH0KKyAgLy8gRmllbGRzLgorICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3IuZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yJiBmaWVsZCA9ICpkZXNjcmlwdG9yLmZpZWxkKGkpOworICAgIEZpeE9wdGlvbnNGb3JGaWVsZChmaWVsZCk7CisgIH0KKyAgLy8gRXh0ZW5zaW9ucy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkID0gKmRlc2NyaXB0b3IuZXh0ZW5zaW9uKGkpOworICAgIEZpeE9wdGlvbnNGb3JGaWVsZChmaWVsZCk7CisgIH0KKyAgLy8gTWVzc2FnZSBvcHRpb24gZm9yIHRoaXMgbWVzc2FnZS4KKyAgc3RyaW5nIG1lc3NhZ2Vfb3B0aW9ucyA9IE9wdGlvbnNWYWx1ZSgKKyAgICAgICJNZXNzYWdlT3B0aW9ucyIsIGRlc2NyaXB0b3Iub3B0aW9ucygpLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworICBpZiAobWVzc2FnZV9vcHRpb25zICE9ICJOb25lIikgeworICAgIHN0cmluZyBkZXNjcmlwdG9yX25hbWUgPSBNb2R1bGVMZXZlbERlc2NyaXB0b3JOYW1lKGRlc2NyaXB0b3IpOworICAgIFByaW50RGVzY3JpcHRvck9wdGlvbnNGaXhpbmdDb2RlKGRlc2NyaXB0b3JfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRlcl8pOworICB9Cit9CisKKy8vIElmIGEgZGVwZW5kZW5jeSBmb3J3YXJkcyBvdGhlciBmaWxlcyB0aHJvdWdoIHB1YmxpYyBkZXBlbmRlbmNpZXMsIGxldCdzCisvLyBjb3B5IG92ZXIgdGhlIGNvcnJlc3BvbmRpbmcgbW9kdWxlIGFsaWFzZXMuCit2b2lkIEdlbmVyYXRvcjo6Q29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMoCisgICAgY29uc3Qgc3RyaW5nJiBjb3B5X2Zyb20sIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+cHVibGljX2RlcGVuZGVuY3lfY291bnQoKTsgKytpKSB7CisgICAgc3RyaW5nIG1vZHVsZV9hbGlhcyA9IE1vZHVsZUFsaWFzKGZpbGUtPnB1YmxpY19kZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgIHByaW50ZXJfLT5QcmludCgiJGFsaWFzJCA9ICRjb3B5X2Zyb20kLiRhbGlhcyRcbiIsICJhbGlhcyIsIG1vZHVsZV9hbGlhcywKKyAgICAgICAgICAgICAgICAgICAgImNvcHlfZnJvbSIsIGNvcHlfZnJvbSk7CisgICAgQ29weVB1YmxpY0RlcGVuZGVuY2llc0FsaWFzZXMoY29weV9mcm9tLCBmaWxlLT5wdWJsaWNfZGVwZW5kZW5jeShpKSk7CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIHB5dGhvbgogfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX2dlbmVyYXRvci5oCmluZGV4IDg0ZWFmOGEuLmFhMGY1ZmMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcHl0aG9uL3B5dGhvbl9nZW5lcmF0b3IuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzgsNiArMzgsNyBAQAogI2luY2x1ZGUgPHN0cmluZz4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9jb2RlX2dlbmVyYXRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CkBAIC05NCw4ICs5NSwxMSBAQAogICB2b2lkIFByaW50TmVzdGVkRGVzY3JpcHRvcnMoY29uc3QgRGVzY3JpcHRvciYgY29udGFpbmluZ19kZXNjcmlwdG9yKSBjb25zdDsKIAogICB2b2lkIFByaW50TWVzc2FnZXMoKSBjb25zdDsKLSAgdm9pZCBQcmludE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciYgbWVzc2FnZV9kZXNjcmlwdG9yKSBjb25zdDsKLSAgdm9pZCBQcmludE5lc3RlZE1lc3NhZ2VzKGNvbnN0IERlc2NyaXB0b3ImIGNvbnRhaW5pbmdfZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgUHJpbnRNZXNzYWdlKGNvbnN0IERlc2NyaXB0b3ImIG1lc3NhZ2VfZGVzY3JpcHRvciwgY29uc3Qgc3RyaW5nJiBwcmVmaXgsCisgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiB0b19yZWdpc3RlcikgY29uc3Q7CisgIHZvaWQgUHJpbnROZXN0ZWRNZXNzYWdlcyhjb25zdCBEZXNjcmlwdG9yJiBjb250YWluaW5nX2Rlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiB0b19yZWdpc3RlcikgY29uc3Q7CiAKICAgdm9pZCBGaXhGb3JlaWduRmllbGRzSW5EZXNjcmlwdG9ycygpIGNvbnN0OwogICB2b2lkIEZpeEZvcmVpZ25GaWVsZHNJbkRlc2NyaXB0b3IoCkBAIC0xMDUsNiArMTA5LDggQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3ImIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHl0aG9uX2RpY3RfbmFtZSkgY29uc3Q7CiAgIHZvaWQgQWRkTWVzc2FnZVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CisgIHZvaWQgQWRkRW51bVRvRmlsZURlc2NyaXB0b3IoY29uc3QgRW51bURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIEFkZEV4dGVuc2lvblRvRmlsZURlc2NyaXB0b3IoY29uc3QgRmllbGREZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKICAgc3RyaW5nIEZpZWxkUmVmZXJlbmNpbmdFeHByZXNzaW9uKGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHB5dGhvbl9kaWN0X25hbWUpIGNvbnN0OwpAQCAtMTIyLDYgKzEyOCw4IEBACiAgIHZvaWQgUHJpbnRTZXJ2aWNlRGVzY3JpcHRvcihjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3Q7CiAgIHZvaWQgUHJpbnRTZXJ2aWNlQ2xhc3MoY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OwogICB2b2lkIFByaW50U2VydmljZVN0dWIoY29uc3QgU2VydmljZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OworICB2b2lkIFByaW50RGVzY3JpcHRvcktleUFuZE1vZHVsZU5hbWUoCisgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciYgZGVzY3JpcHRvcikgY29uc3QgOwogCiAgIHZvaWQgUHJpbnRFbnVtVmFsdWVEZXNjcmlwdG9yKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3ImIGRlc2NyaXB0b3IpIGNvbnN0OwogICBzdHJpbmcgT3B0aW9uc1ZhbHVlKGNvbnN0IHN0cmluZyYgY2xhc3NfbmFtZSwKQEAgLTEzOCw2ICsxNDYsMTQgQEAKICAgdm9pZCBQcmludFNlcmlhbGl6ZWRQYkludGVydmFsKAogICAgICAgY29uc3QgRGVzY3JpcHRvclQmIGRlc2NyaXB0b3IsIERlc2NyaXB0b3JQcm90b1QmIHByb3RvKSBjb25zdDsKIAorICB2b2lkIEZpeEFsbERlc2NyaXB0b3JPcHRpb25zKCkgY29uc3Q7CisgIHZvaWQgRml4T3B0aW9uc0ZvckZpZWxkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciYgZmllbGQpIGNvbnN0OworICB2b2lkIEZpeE9wdGlvbnNGb3JFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBGaXhPcHRpb25zRm9yTWVzc2FnZShjb25zdCBEZXNjcmlwdG9yJiBkZXNjcmlwdG9yKSBjb25zdDsKKworICB2b2lkIENvcHlQdWJsaWNEZXBlbmRlbmNpZXNBbGlhc2VzKAorICAgICAgY29uc3Qgc3RyaW5nJiBjb3B5X2Zyb20sIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSBjb25zdDsKKwogICAvLyBWZXJ5IGNvYXJzZS1ncmFpbmVkIGxvY2sgdG8gZW5zdXJlIHRoYXQgR2VuZXJhdGUoKSBpcyByZWVudHJhbnQuCiAgIC8vIEd1YXJkcyBmaWxlXywgcHJpbnRlcl8gYW5kIGZpbGVfZGVzY3JpcHRvcl9zZXJpYWxpemVkXy4KICAgbXV0YWJsZSBNdXRleCBtdXRleF87CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9weXRob24vcHl0aG9uX3BsdWdpbl91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjCmluZGV4IGRhNjE5YWQuLjIzZjI0NDkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fcGx1Z2luX3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCwxNCArMzQsMjAgQEAKIC8vICAgSXQgc2VlbWVkIGxpa2UgcGFyYW1ldGVyaXppbmcgaXQgd291bGQgYWRkIG1vcmUgY29tcGxleGl0eSB0aGFuIGl0IGlzCiAvLyAgIHdvcnRoLgogCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3B5dGhvbi9weXRob25fZ2VuZXJhdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL2NvbW1hbmRfbGluZV9pbnRlcmZhY2UuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmg+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNjcsOCArNzMsOCBAQAogCiAgIHZvaWQgVHJ5SW5zZXJ0KGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsIGNvbnN0IHN0cmluZyYgaW5zZXJ0aW9uX3BvaW50LAogICAgICAgICAgICAgICAgICBHZW5lcmF0b3JDb250ZXh0KiBjb250ZXh0KSBjb25zdCB7Ci0gICAgc2NvcGVkX3B0cjxpbzo6WmVyb0NvcHlPdXRwdXRTdHJlYW0+IG91dHB1dCgKLSAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCkpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8aW86Olplcm9Db3B5T3V0cHV0U3RyZWFtPiBvdXRwdXQoCisgICAgICAgIGNvbnRleHQtPk9wZW5Gb3JJbnNlcnQoZmlsZW5hbWUsIGluc2VydGlvbl9wb2ludCkpOwogICAgIGlvOjpQcmludGVyIHByaW50ZXIob3V0cHV0LmdldCgpLCAnJCcpOwogICAgIHByaW50ZXIuUHJpbnQoIi8vIGluc2VydGVkICRuYW1lJFxuIiwgIm5hbWUiLCBpbnNlcnRpb25fcG9pbnQpOwogICB9CkBAIC03OCwxMyArODQsMTMgQEAKIC8vIG5vdCB2ZXJpZnkgdGhhdCB0aGV5IGFyZSBjb3JyZWN0bHktcGxhY2VkOyB0aGF0IHdvdWxkIHJlcXVpcmUgYWN0dWFsbHkKIC8vIGNvbXBpbGluZyB0aGUgb3V0cHV0IHdoaWNoIGlzIGEgYml0IG1vcmUgdGhhbiBJIGNhcmUgdG8gZG8gZm9yIHRoaXMgdGVzdC4KIFRFU1QoUHl0aG9uUGx1Z2luVGVzdCwgUGx1Z2luVGVzdCkgewotICBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKAotICAgICAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCi0gICAgICAicGFja2FnZSBmb287XG4iCi0gICAgICAibWVzc2FnZSBCYXIge1xuIgotICAgICAgIiAgbWVzc2FnZSBCYXoge31cbiIKLSAgICAgICJ9XG4iLAotICAgICAgVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIpOworICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6U2V0Q29udGVudHMoVGVzdFRlbXBEaXIoKSArICIvdGVzdC5wcm90byIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicGFja2FnZSBmb287XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtZXNzYWdlIEJhciB7XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgIG1lc3NhZ2UgQmF6IHt9XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ9XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKSk7CiAKICAgZ29vZ2xlOjpwcm90b2J1Zjo6Y29tcGlsZXI6OkNvbW1hbmRMaW5lSW50ZXJmYWNlIGNsaTsKICAgY2xpLlNldElucHV0c0FyZVByb3RvUGF0aFJlbGF0aXZlKHRydWUpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGUucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdGVkX2NvZGUucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlLnJiIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlLnJiCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0ZWRfY29kZS5yYgpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRlZF9jb2RlLnJiCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3IuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvcnVieS9ydWJ5X2dlbmVyYXRvci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9ydWJ5L3J1YnlfZ2VuZXJhdG9yX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3J1YnkvcnVieV9nZW5lcmF0b3JfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmNjCmluZGV4IDVmYjVkNWMuLjZlMjU4NjYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CiAKICNpZm5kZWYgX1dJTjMyCiAjaW5jbHVkZSA8ZXJybm8uaD4KQEAgLTQxLDEwICs0MiwxMiBAQAogI2luY2x1ZGUgPHNpZ25hbC5oPgogI2VuZGlmCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CiAKKwogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGNvbXBpbGVyIHsKQEAgLTE3MCw3ICsxNzMsNyBAQAogICAgIERXT1JEIHdhaXRfcmVzdWx0ID0KICAgICAgICAgV2FpdEZvck11bHRpcGxlT2JqZWN0cyhoYW5kbGVfY291bnQsIGhhbmRsZXMsIEZBTFNFLCBJTkZJTklURSk7CiAKLSAgICBIQU5ETEUgc2lnbmFsZWRfaGFuZGxlOworICAgIEhBTkRMRSBzaWduYWxlZF9oYW5kbGUgPSBOVUxMOwogICAgIGlmICh3YWl0X3Jlc3VsdCA+PSBXQUlUX09CSkVDVF8wICYmCiAgICAgICAgIHdhaXRfcmVzdWx0IDwgV0FJVF9PQkpFQ1RfMCArIGhhbmRsZV9jb3VudCkgewogICAgICAgc2lnbmFsZWRfaGFuZGxlID0gaGFuZGxlc1t3YWl0X3Jlc3VsdCAtIFdBSVRfT0JKRUNUXzBdOwpAQCAtMjk0LDggKzI5Nyw4IEBACiAgIGludCBzdGRpbl9waXBlWzJdOwogICBpbnQgc3Rkb3V0X3BpcGVbMl07CiAKLSAgcGlwZShzdGRpbl9waXBlKTsKLSAgcGlwZShzdGRvdXRfcGlwZSk7CisgIEdPT0dMRV9DSEVDSyhwaXBlKHN0ZGluX3BpcGUpICE9IC0xKTsKKyAgR09PR0xFX0NIRUNLKHBpcGUoc3Rkb3V0X3BpcGUpICE9IC0xKTsKIAogICBjaGFyKiBhcmd2WzJdID0geyBzdHJkdXAocHJvZ3JhbS5jX3N0cigpKSwgTlVMTCB9OwogCkBAIC0zMjMsOSArMzI2LDExIEBACiAKICAgICAvLyBXcml0ZSBkaXJlY3RseSB0byBTVERFUlJfRklMRU5PIHRvIGF2b2lkIHN0ZGlvIGNvZGUgcGF0aHMgdGhhdCBtYXkgZG8KICAgICAvLyBzdHVmZiB0aGF0IGlzIHVuc2FmZSBoZXJlLgotICAgIHdyaXRlKFNUREVSUl9GSUxFTk8sIGFyZ3ZbMF0sIHN0cmxlbihhcmd2WzBdKSk7CisgICAgaW50IGlnbm9yZWQ7CisgICAgaWdub3JlZCA9IHdyaXRlKFNUREVSUl9GSUxFTk8sIGFyZ3ZbMF0sIHN0cmxlbihhcmd2WzBdKSk7CiAgICAgY29uc3QgY2hhciogbWVzc2FnZSA9ICI6IHByb2dyYW0gbm90IGZvdW5kIG9yIGlzIG5vdCBleGVjdXRhYmxlXG4iOwotICAgIHdyaXRlKFNUREVSUl9GSUxFTk8sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7CisgICAgaWdub3JlZCA9IHdyaXRlKFNUREVSUl9GSUxFTk8sIG1lc3NhZ2UsIHN0cmxlbihtZXNzYWdlKSk7CisgICAgKHZvaWQpIGlnbm9yZWQ7CiAKICAgICAvLyBNdXN0IHVzZSBfZXhpdCgpIHJhdGhlciB0aGFuIGV4aXQoKSB0byBhdm9pZCBmbHVzaGluZyBvdXRwdXQgYnVmZmVycwogICAgIC8vIHRoYXQgd2lsbCBhbHNvIGJlIGZsdXNoZWQgYnkgdGhlIHBhcmVudC4KQEAgLTM1Niw3ICszNjEsNyBAQAogICBzdHJpbmcgb3V0cHV0X2RhdGE7CiAKICAgaW50IGlucHV0X3BvcyA9IDA7Ci0gIGludCBtYXhfZmQgPSBtYXgoY2hpbGRfc3RkaW5fLCBjaGlsZF9zdGRvdXRfKTsKKyAgaW50IG1heF9mZCA9IHN0ZDo6bWF4KGNoaWxkX3N0ZGluXywgY2hpbGRfc3Rkb3V0Xyk7CiAKICAgd2hpbGUgKGNoaWxkX3N0ZG91dF8gIT0gLTEpIHsKICAgICBmZF9zZXQgcmVhZF9mZHM7CkBAIC00NDYsNyArNDUxLDcgQEAKICAgfQogCiAgIGlmICghb3V0cHV0LT5QYXJzZUZyb21TdHJpbmcob3V0cHV0X2RhdGEpKSB7Ci0gICAgKmVycm9yID0gIlBsdWdpbiBvdXRwdXQgaXMgdW5wYXJzZWFibGUuIjsKKyAgICAqZXJyb3IgPSAiUGx1Z2luIG91dHB1dCBpcyB1bnBhcnNlYWJsZTogIiArIENFc2NhcGUob3V0cHV0X2RhdGEpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci9zdWJwcm9jZXNzLmgKaW5kZXggMDA1NjQ5Ni4uMjUxMzg2MyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvc3VicHJvY2Vzcy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3N1YnByb2Nlc3MuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvdGVzdF9wbHVnaW4uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYwppbmRleCA1Y2JiZjNkLi40ODMwZmQ3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci90ZXN0X3BsdWdpbi5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF9vdXRwdXRfdW5pdHRlc3Quc2gKaW5kZXggM2EwMjQzNi4uNmZjNzEzNiAxMDA3NTUKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX291dHB1dF91bml0dGVzdC5zaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfb3V0cHV0X3VuaXR0ZXN0LnNoCkBAIC0yLDcgKzIsNyBAQAogIwogIyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKICMgQ29weXJpZ2h0IDIwMDkgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0jIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKyMgaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KICMKICMgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAjIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmNjCmluZGV4IDY1ZDczNTIuLjQ1OGNjZWQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzAsNyArMzAsNyBAQAogCiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2NvbXBpbGVyL3ppcF93cml0ZXIuaAppbmRleCBiZTczOTcyLi42MDJlNTA4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9jb21waWxlci96aXBfd3JpdGVyLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvY29tcGlsZXIvemlwX3dyaXRlci5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMCw3ICszMCw3IEBACiAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuY2MKaW5kZXggNWJkZDU2NS4uNTZlMTFmYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCw3ICszNCwxMiBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHNldD4KKyNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxsaW1pdHM+CkBAIC00MywxOCArNDgsMjMgQEAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKICN1bmRlZiBQQUNLQUdFICAvLyBhdXRvaGVhZGVyICNkZWZpbmVzIHRoaXMuICA6KAogCkBAIC0xMDgsNiArMTE4LDIxIEBACiAgICJzaW50NjQiLCAgICAvLyBUWVBFX1NJTlQ2NAogfTsKIAorY29uc3QgY2hhciAqIGNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6a0NwcFR5cGVUb05hbWVbTUFYX0NQUFRZUEUgKyAxXSA9IHsKKyAgIkVSUk9SIiwgICAgIC8vIDAgaXMgcmVzZXJ2ZWQgZm9yIGVycm9ycworCisgICJpbnQzMiIsICAgICAvLyBDUFBUWVBFX0lOVDMyCisgICJpbnQ2NCIsICAgICAvLyBDUFBUWVBFX0lOVDY0CisgICJ1aW50MzIiLCAgICAvLyBDUFBUWVBFX1VJTlQzMgorICAidWludDY0IiwgICAgLy8gQ1BQVFlQRV9VSU5UNjQKKyAgImRvdWJsZSIsICAgIC8vIENQUFRZUEVfRE9VQkxFCisgICJmbG9hdCIsICAgICAvLyBDUFBUWVBFX0ZMT0FUCisgICJib29sIiwgICAgICAvLyBDUFBUWVBFX0JPT0wKKyAgImVudW0iLCAgICAgIC8vIENQUFRZUEVfRU5VTQorICAic3RyaW5nIiwgICAgLy8gQ1BQVFlQRV9TVFJJTkcKKyAgIm1lc3NhZ2UiLCAgIC8vIENQUFRZUEVfTUVTU0FHRQorfTsKKwogY29uc3QgY2hhciAqIGNvbnN0IEZpZWxkRGVzY3JpcHRvcjo6a0xhYmVsVG9OYW1lW01BWF9MQUJFTCArIDFdID0gewogICAiRVJST1IiLCAgICAgLy8gMCBpcyByZXNlcnZlZCBmb3IgZXJyb3JzCiAKQEAgLTExNiw3ICsxNDEsMjIgQEAKICAgInJlcGVhdGVkIiwgIC8vIExBQkVMX1JFUEVBVEVECiB9OwogCi0jaWZuZGVmIF9NU0NfVkVSICAvLyBNU1ZDIGRvZXNuJ3QgbmVlZCB0aGVzZSBhbmQgd29uJ3QgZXZlbiBhY2NlcHQgdGhlbS4KK2NvbnN0IGNoYXIqIEZpbGVEZXNjcmlwdG9yOjpTeW50YXhOYW1lKEZpbGVEZXNjcmlwdG9yOjpTeW50YXggc3ludGF4KSB7CisgIHN3aXRjaCAoc3ludGF4KSB7CisgICAgY2FzZSBTWU5UQVhfUFJPVE8yOgorICAgICAgcmV0dXJuICJwcm90bzIiOworICAgIGNhc2UgU1lOVEFYX1BST1RPMzoKKyAgICAgIHJldHVybiAicHJvdG8zIjsKKyAgICBjYXNlIFNZTlRBWF9VTktOT1dOOgorICAgICAgcmV0dXJuICJ1bmtub3duIjsKKyAgfQorICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiY2FuJ3QgcmVhY2ggaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrTm9uTGlua2VkV2Vha01lc3NhZ2VSZXBsYWNlbWVudE5hbWUgPSAiZ29vZ2xlLnByb3RvYnVmLkVtcHR5IjsKKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyOwogY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvcjo6a0ZpcnN0UmVzZXJ2ZWROdW1iZXI7CiBjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yOjprTGFzdFJlc2VydmVkTnVtYmVyOwpAQCAtMTI0LDEwICsxNjQsOCBAQAogCiBuYW1lc3BhY2UgewogCi1jb25zdCBzdHJpbmcga0VtcHR5U3RyaW5nOwotCi1zdHJpbmcgVG9DYW1lbENhc2UoY29uc3Qgc3RyaW5nJiBpbnB1dCkgewotICBib29sIGNhcGl0YWxpemVfbmV4dCA9IGZhbHNlOworc3RyaW5nIFRvQ2FtZWxDYXNlKGNvbnN0IHN0cmluZyYgaW5wdXQsIGJvb2wgbG93ZXJfZmlyc3QpIHsKKyAgYm9vbCBjYXBpdGFsaXplX25leHQgPSAhbG93ZXJfZmlyc3Q7CiAgIHN0cmluZyByZXN1bHQ7CiAgIHJlc3VsdC5yZXNlcnZlKGlucHV0LnNpemUoKSk7CiAKQEAgLTE0OCw4ICsxODYsOCBAQAogICB9CiAKICAgLy8gTG93ZXItY2FzZSB0aGUgZmlyc3QgbGV0dGVyLgotICBpZiAoIXJlc3VsdC5lbXB0eSgpICYmICdBJyA8PSByZXN1bHRbMF0gJiYgcmVzdWx0WzBdIDw9ICdaJykgewotICAgIHJlc3VsdFswXSA9IHJlc3VsdFswXSAtICdBJyArICdhJzsKKyAgaWYgKGxvd2VyX2ZpcnN0ICYmICFyZXN1bHQuZW1wdHkoKSAmJiAnQScgPD0gcmVzdWx0WzBdICYmIHJlc3VsdFswXSA8PSAnWicpIHsKKyAgICAgIHJlc3VsdFswXSA9IHJlc3VsdFswXSAtICdBJyArICdhJzsKICAgfQogCiAgIHJldHVybiByZXN1bHQ7CkBAIC0xODYsOSArMjI0LDExIEBACiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KHAuZmlyc3QpICogKCgxIDw8IDE2KSAtIDEpICsgcC5zZWNvbmQ7CiAgIH0KIAorI2lmZGVmIF9NU0NfVkVSCiAgIC8vIFVzZWQgb25seSBieSBNU1ZDIGFuZCBwbGF0Zm9ybXMgd2hlcmUgaGFzaF9tYXAgaXMgbm90IGF2YWlsYWJsZS4KICAgc3RhdGljIGNvbnN0IHNpemVfdCBidWNrZXRfc2l6ZSA9IDQ7CiAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWluX2J1Y2tldHMgPSA4OworI2VuZGlmCiAgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3QgUGFpclR5cGUmIGEsIGNvbnN0IFBhaXJUeXBlJiBiKSBjb25zdCB7CiAgICAgcmV0dXJuIGEuZmlyc3QgPCBiLmZpcnN0IHx8CiAgICAgICAgICAgKGEuZmlyc3QgPT0gYi5maXJzdCAmJiBhLnNlY29uZCA8IGIuc2Vjb25kKTsKQEAgLTIwNyw5ICsyNDcsMTEgQEAKICAgICAgICAgICAgY3N0cmluZ19oYXNoKHAuc2Vjb25kKTsKICAgfQogCisjaWZkZWYgX01TQ19WRVIKICAgLy8gVXNlZCBvbmx5IGJ5IE1TVkMgYW5kIHBsYXRmb3JtcyB3aGVyZSBoYXNoX21hcCBpcyBub3QgYXZhaWxhYmxlLgogICBzdGF0aWMgY29uc3Qgc2l6ZV90IGJ1Y2tldF9zaXplID0gNDsKICAgc3RhdGljIGNvbnN0IHNpemVfdCBtaW5fYnVja2V0cyA9IDg7CisjZW5kaWYKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBQb2ludGVyU3RyaW5nUGFpciYgYSwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBQb2ludGVyU3RyaW5nUGFpciYgYikgY29uc3QgewogICAgIGlmIChhLmZpcnN0IDwgYi5maXJzdCkgcmV0dXJuIHRydWU7CkBAIC0yMjEsMTIgKzI2MywxNCBAQAogCiBzdHJ1Y3QgU3ltYm9sIHsKICAgZW51bSBUeXBlIHsKLSAgICBOVUxMX1NZTUJPTCwgTUVTU0FHRSwgRklFTEQsIEVOVU0sIEVOVU1fVkFMVUUsIFNFUlZJQ0UsIE1FVEhPRCwgUEFDS0FHRQorICAgIE5VTExfU1lNQk9MLCBNRVNTQUdFLCBGSUVMRCwgT05FT0YsIEVOVU0sIEVOVU1fVkFMVUUsIFNFUlZJQ0UsIE1FVEhPRCwKKyAgICBQQUNLQUdFCiAgIH07CiAgIFR5cGUgdHlwZTsKICAgdW5pb24gewogICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZF9kZXNjcmlwdG9yOworICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcjsKICAgICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV9kZXNjcmlwdG9yOwogICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWVfZGVzY3JpcHRvcjsKICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZV9kZXNjcmlwdG9yOwpAQCAtMjUyLDYgKzI5Niw3IEBACiAKICAgQ09OU1RSVUNUT1IoRGVzY3JpcHRvciAgICAgICAgICwgTUVTU0FHRSAgICwgZGVzY3JpcHRvciAgICAgICAgICAgICApCiAgIENPTlNUUlVDVE9SKEZpZWxkRGVzY3JpcHRvciAgICAsIEZJRUxEICAgICAsIGZpZWxkX2Rlc2NyaXB0b3IgICAgICAgKQorICBDT05TVFJVQ1RPUihPbmVvZkRlc2NyaXB0b3IgICAgLCBPTkVPRiAgICAgLCBvbmVvZl9kZXNjcmlwdG9yICAgICAgICkKICAgQ09OU1RSVUNUT1IoRW51bURlc2NyaXB0b3IgICAgICwgRU5VTSAgICAgICwgZW51bV9kZXNjcmlwdG9yICAgICAgICApCiAgIENPTlNUUlVDVE9SKEVudW1WYWx1ZURlc2NyaXB0b3IsIEVOVU1fVkFMVUUsIGVudW1fdmFsdWVfZGVzY3JpcHRvciAgKQogICBDT05TVFJVQ1RPUihTZXJ2aWNlRGVzY3JpcHRvciAgLCBTRVJWSUNFICAgLCBzZXJ2aWNlX2Rlc2NyaXB0b3IgICAgICkKQEAgLTI2NCw2ICszMDksNyBAQAogICAgICAgY2FzZSBOVUxMX1NZTUJPTDogcmV0dXJuIE5VTEw7CiAgICAgICBjYXNlIE1FU1NBR0UgICAgOiByZXR1cm4gZGVzY3JpcHRvciAgICAgICAgICAgLT5maWxlKCk7CiAgICAgICBjYXNlIEZJRUxEICAgICAgOiByZXR1cm4gZmllbGRfZGVzY3JpcHRvciAgICAgLT5maWxlKCk7CisgICAgICBjYXNlIE9ORU9GICAgICAgOiByZXR1cm4gb25lb2ZfZGVzY3JpcHRvciAgICAgLT5jb250YWluaW5nX3R5cGUoKS0+ZmlsZSgpOwogICAgICAgY2FzZSBFTlVNICAgICAgIDogcmV0dXJuIGVudW1fZGVzY3JpcHRvciAgICAgIC0+ZmlsZSgpOwogICAgICAgY2FzZSBFTlVNX1ZBTFVFIDogcmV0dXJuIGVudW1fdmFsdWVfZGVzY3JpcHRvci0+dHlwZSgpLT5maWxlKCk7CiAgICAgICBjYXNlIFNFUlZJQ0UgICAgOiByZXR1cm4gc2VydmljZV9kZXNjcmlwdG9yICAgLT5maWxlKCk7CkBAIC0zMDAsNiArMzQ2LDQzIEBACiAvLyBmb3IgdGhhdC4KIHR5cGVkZWYgbWFwPERlc2NyaXB0b3JJbnRQYWlyLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqPgogICBFeHRlbnNpb25zR3JvdXBlZEJ5RGVzY3JpcHRvck1hcDsKK3R5cGVkZWYgaGFzaF9tYXA8c3RyaW5nLCBjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbio+IExvY2F0aW9uc0J5UGF0aE1hcDsKKworc2V0PHN0cmluZz4qIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc18gPSBOVUxMOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShhbGxvd2VkX3Byb3RvM19leHRlbmRlZXNfaW5pdF8pOworCit2b2lkIERlbGV0ZUFsbG93ZWRQcm90bzNFeHRlbmRlZSgpIHsKKyAgZGVsZXRlIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc187Cit9CisKK3ZvaWQgSW5pdEFsbG93ZWRQcm90bzNFeHRlbmRlZSgpIHsKKyAgYWxsb3dlZF9wcm90bzNfZXh0ZW5kZWVzXyA9IG5ldyBzZXQ8c3RyaW5nPjsKKyAgY29uc3QgY2hhcioga09wdGlvbk5hbWVzW10gPSB7CisgICAgICAiRmlsZU9wdGlvbnMiLCAgICAgICJNZXNzYWdlT3B0aW9ucyIsICJGaWVsZE9wdGlvbnMiLCAiRW51bU9wdGlvbnMiLAorICAgICAgIkVudW1WYWx1ZU9wdGlvbnMiLCAiU2VydmljZU9wdGlvbnMiLCAiTWV0aG9kT3B0aW9ucyJ9OworICBmb3IgKGludCBpID0gMDsgaSA8IEdPT0dMRV9BUlJBWVNJWkUoa09wdGlvbk5hbWVzKTsgKytpKSB7CisgICAgLy8gZGVzY3JpcHRvci5wcm90byBoYXMgYSBkaWZmZXJlbnQgcGFja2FnZSBuYW1lIGluIG9wZW5zb3VyY2UuIFdlIGFsbG93CisgICAgLy8gYm90aCBzbyB0aGUgb3BlbnNvdXJjZSBwcm90b2NvbCBjb21waWxlciBjYW4gYWxzbyBjb21waWxlIGludGVybmFsCisgICAgLy8gcHJvdG8zIGZpbGVzIHdpdGggY3VzdG9tIG9wdGlvbnMuIFNlZTogYi8yNzU2NzkxMgorICAgIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc18tPmluc2VydChzdHJpbmcoImdvb2dsZS5wcm90b2J1Zi4iKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGtPcHRpb25OYW1lc1tpXSk7CisgICAgLy8gU3BsaXQgdGhlIHdvcmQgdG8gdHJpY2sgdGhlIG9wZW5zb3VyY2UgcHJvY2Vzc2luZyBzY3JpcHRzIHNvIHRoZXkKKyAgICAvLyB3aWxsIGtlZXAgdGhlIG9yaWdpYWwgcGFja2FnZSBuYW1lLgorICAgIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc18tPmluc2VydChzdHJpbmcoInByb3RvIikgKyAiMi4iICsga09wdGlvbk5hbWVzW2ldKTsKKyAgfQorCisgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpPblNodXRkb3duKCZEZWxldGVBbGxvd2VkUHJvdG8zRXh0ZW5kZWUpOworfQorCisvLyBDaGVja3Mgd2hldGhlciB0aGUgZXh0ZW5kZWUgdHlwZSBpcyBhbGxvd2VkIGluIHByb3RvMy4KKy8vIE9ubHkgZXh0ZW5zaW9ucyB0byBkZXNjcmlwdG9yIG9wdGlvbnMgYXJlIGFsbG93ZWQuIFdlIHVzZSBuYW1lIGNvbXBhcmlzb24KKy8vIGluc3RlYWQgb2YgY29tcGFyaW5nIHRoZSBkZXNjcmlwdG9yIGRpcmVjdGx5IGJlY2F1c2UgdGhlIGV4dGVuc2lvbnMgbWF5IGJlCisvLyBkZWZpbmVkIGluIGEgZGlmZmVyZW50IHBvb2wuCitib29sIEFsbG93ZWRFeHRlbmRlZUluUHJvdG8zKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZhbGxvd2VkX3Byb3RvM19leHRlbmRlZXNfaW5pdF8sICZJbml0QWxsb3dlZFByb3RvM0V4dGVuZGVlKTsKKyAgcmV0dXJuIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc18tPmZpbmQobmFtZSkgIT0KKyAgICAgICAgIGFsbG93ZWRfcHJvdG8zX2V4dGVuZGVlc18tPmVuZCgpOworfQogCiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiAKQEAgLTMxMSwxNyArMzk0LDQyIEBACiAgIFRhYmxlcygpOwogICB+VGFibGVzKCk7CiAKLSAgLy8gQ2hlY2twb2ludCB0aGUgc3RhdGUgb2YgdGhlIHRhYmxlcy4gIEZ1dHVyZSBjYWxscyB0byBSb2xsYmFjaygpIHdpbGwKLSAgLy8gcmV0dXJuIHRoZSBUYWJsZXMgdG8gdGhpcyBzdGF0ZS4gIFRoaXMgaXMgdXNlZCB3aGVuIGJ1aWxkaW5nIGZpbGVzLCBzaW5jZQotICAvLyBzb21lIGtpbmRzIG9mIHZhbGlkYXRpb24gZXJyb3JzIGNhbm5vdCBiZSBkZXRlY3RlZCB1bnRpbCB0aGUgZmlsZSdzCi0gIC8vIGRlc2NyaXB0b3JzIGhhdmUgYWxyZWFkeSBiZWVuIGFkZGVkIHRvIHRoZSB0YWJsZXMuICBCdWlsZEZpbGUoKSBjYWxscwotICAvLyBDaGVja3BvaW50KCkgYmVmb3JlIGl0IHN0YXJ0cyBidWlsZGluZyBhbmQgUm9sbGJhY2soKSBpZiBpdCBlbmNvdW50ZXJzCi0gIC8vIGFuIGVycm9yLgotICB2b2lkIENoZWNrcG9pbnQoKTsKKyAgLy8gUmVjb3JkIHRoZSBjdXJyZW50IHN0YXRlIG9mIHRoZSB0YWJsZXMgdG8gdGhlIHN0YWNrIG9mIGNoZWNrcG9pbnRzLgorICAvLyBFYWNoIGNhbGwgdG8gQWRkQ2hlY2twb2ludCgpIG11c3QgYmUgcGFpcmVkIHdpdGggZXhhY3RseSBvbmUgY2FsbCB0byBlaXRoZXIKKyAgLy8gQ2xlYXJMYXN0Q2hlY2twb2ludCgpIG9yIFJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpLgorICAvLworICAvLyBUaGlzIGlzIHVzZWQgd2hlbiBidWlsZGluZyBmaWxlcywgc2luY2Ugc29tZSBraW5kcyBvZiB2YWxpZGF0aW9uIGVycm9ycworICAvLyBjYW5ub3QgYmUgZGV0ZWN0ZWQgdW50aWwgdGhlIGZpbGUncyBkZXNjcmlwdG9ycyBoYXZlIGFscmVhZHkgYmVlbiBhZGRlZCB0bworICAvLyB0aGUgdGFibGVzLgorICAvLworICAvLyBUaGlzIHN1cHBvcnRzIHJlY3Vyc2l2ZSBjaGVja3BvaW50cywgc2luY2UgYnVpbGRpbmcgYSBmaWxlIG1heSB0cmlnZ2VyCisgIC8vIHJlY3Vyc2l2ZSBidWlsZGluZyBvZiBvdGhlciBmaWxlcy4gTm90ZSB0aGF0IHJlY3Vyc2l2ZSBjaGVja3BvaW50cyBhcmUgbm90CisgIC8vIG5vcm1hbGx5IG5lY2Vzc2FyeTsgZXhwbGljaXQgZGVwZW5kZW5jaWVzIGFyZSBidWlsdCBwcmlvciB0byBjaGVja3BvaW50aW5nLgorICAvLyBTbyBhbHRob3VnaCB3ZSByZWN1cnNpdmVseSBidWlsZCB0cmFuc2l0aXZlIGltcG9ydHMsIHRoZXJlIGlzIGF0IG1vc3Qgb25lCisgIC8vIGNoZWNrcG9pbnQgaW4gdGhlIHN0YWNrIGR1cmluZyBkZXBlbmRlbmN5IGJ1aWxkaW5nLgorICAvLworICAvLyBSZWN1cnNpdmUgY2hlY2twb2ludHMgb25seSBhcmlzZSBkdXJpbmcgY3Jvc3MtbGlua2luZyBvZiB0aGUgZGVzY3JpcHRvcnMuCisgIC8vIFN5bWJvbCByZWZlcmVuY2VzIG11c3QgYmUgcmVzb2x2ZWQsIHZpYSBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbCBhbmQKKyAgLy8gZnJpZW5kcy4gSWYgdGhlIHBlbmRpbmcgZmlsZSByZWZlcmVuY2VzIGFuIHVua25vd24gc3ltYm9sCisgIC8vIChlLmcuLCBpdCBpcyBub3QgZGVmaW5lZCBpbiB0aGUgcGVuZGluZyBmaWxlJ3MgZXhwbGljaXQgZGVwZW5kZW5jaWVzKSwgYW5kCisgIC8vIHRoZSBwb29sIGlzIHVzaW5nIGEgZmFsbGJhY2sgZGF0YWJhc2UsIGFuZCB0aGF0IGRhdGFiYXNlIGNvbnRhaW5zIGEgZmlsZQorICAvLyBkZWZpbmluZyB0aGF0IHN5bWJvbCwgYW5kIHRoYXQgZmlsZSBoYXMgbm90IHlldCBiZWVuIGJ1aWx0IGJ5IHRoZSBwb29sLAorICAvLyB0aGUgcG9vbCBidWlsZHMgdGhlIGZpbGUgZHVyaW5nIGNyb3NzLWxpbmtpbmcsIGxlYWRpbmcgdG8gYW5vdGhlcgorICAvLyBjaGVja3BvaW50LgorICB2b2lkIEFkZENoZWNrcG9pbnQoKTsKIAotICAvLyBSb2xsIGJhY2sgdGhlIFRhYmxlcyB0byB0aGUgc3RhdGUgb2YgdGhlIGxhc3QgQ2hlY2twb2ludCgpLCByZW1vdmluZwotICAvLyBldmVyeXRoaW5nIHRoYXQgd2FzIGFkZGVkIGFmdGVyIHRoYXQgcG9pbnQuCi0gIHZvaWQgUm9sbGJhY2soKTsKKyAgLy8gTWFyayB0aGUgbGFzdCBjaGVja3BvaW50IGFzIGhhdmluZyBjbGVhcmVkIHN1Y2Nlc3NmdWxseSwgcmVtb3ZpbmcgaXQgZnJvbQorICAvLyB0aGUgc3RhY2suIElmIHRoZSBzdGFjayBpcyBlbXB0eSwgYWxsIHBlbmRpbmcgc3ltYm9scyB3aWxsIGJlIGNvbW1pdHRlZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRoaXMgZG9lcyBub3QgZ3VhcmFudGVlIHRoYXQgdGhlIHN5bWJvbHMgYWRkZWQgc2luY2UgdGhlIGxhc3QKKyAgLy8gY2hlY2twb2ludCB3b24ndCBiZSByb2xsZWQgYmFjazogaWYgYSBjaGVja3BvaW50IGdldHMgcm9sbGVkIGJhY2ssCisgIC8vIGV2ZXJ5dGhpbmcgcGFzdCB0aGF0IHBvaW50IGdldHMgcm9sbGVkIGJhY2ssIGluY2x1ZGluZyBzeW1ib2xzIGFkZGVkIGFmdGVyCisgIC8vIGNoZWNrcG9pbnRzIHRoYXQgd2VyZSBwdXNoZWQgb250byB0aGUgc3RhY2sgYWZ0ZXIgaXQgYW5kIG1hcmtlZCBhcyBjbGVhcmVkLgorICB2b2lkIENsZWFyTGFzdENoZWNrcG9pbnQoKTsKKworICAvLyBSb2xsIGJhY2sgdGhlIFRhYmxlcyB0byB0aGUgc3RhdGUgb2YgdGhlIGNoZWNrcG9pbnQgYXQgdGhlIHRvcCBvZiB0aGUKKyAgLy8gc3RhY2ssIHJlbW92aW5nIGV2ZXJ5dGhpbmcgdGhhdCB3YXMgYWRkZWQgYWZ0ZXIgdGhhdCBwb2ludC4KKyAgdm9pZCBSb2xsYmFja1RvTGFzdENoZWNrcG9pbnQoKTsKIAogICAvLyBUaGUgc3RhY2sgb2YgZmlsZXMgd2hpY2ggYXJlIGN1cnJlbnRseSBiZWluZyBidWlsdC4gIFVzZWQgdG8gZGV0ZWN0CiAgIC8vIGN5Y2xpYyBkZXBlbmRlbmNpZXMgd2hlbiBsb2FkaW5nIGZpbGVzIGZyb20gYSBEZXNjcmlwdG9yRGF0YWJhc2UuICBOb3QKQEAgLTMyOSwxMCArNDM3LDE4IEBACiAgIHZlY3RvcjxzdHJpbmc+IHBlbmRpbmdfZmlsZXNfOwogCiAgIC8vIEEgc2V0IG9mIGZpbGVzIHdoaWNoIHdlIGhhdmUgdHJpZWQgdG8gbG9hZCBmcm9tIHRoZSBmYWxsYmFjayBkYXRhYmFzZQotICAvLyBhbmQgZW5jb3VudGVyZWQgZXJyb3JzLiAgV2Ugd2lsbCBub3QgYXR0ZW1wdCB0byBsb2FkIHRoZW0gYWdhaW4uCisgIC8vIGFuZCBlbmNvdW50ZXJlZCBlcnJvcnMuICBXZSB3aWxsIG5vdCBhdHRlbXB0IHRvIGxvYWQgdGhlbSBhZ2FpbiBkdXJpbmcKKyAgLy8gZXhlY3V0aW9uIG9mIHRoZSBjdXJyZW50IHB1YmxpYyBBUEkgY2FsbCwgYnV0IGZvciBjb21wYXRpYmlsaXR5IHdpdGgKKyAgLy8gbGVnYWN5IGNsaWVudHMsIHRoaXMgaXMgY2xlYXJlZCBhdCB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggcHVibGljIEFQSSBjYWxsLgogICAvLyBOb3QgdXNlZCB3aGVuIGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMLgogICBoYXNoX3NldDxzdHJpbmc+IGtub3duX2JhZF9maWxlc187CiAKKyAgLy8gQSBzZXQgb2Ygc3ltYm9scyB3aGljaCB3ZSBoYXZlIHRyaWVkIHRvIGxvYWQgZnJvbSB0aGUgZmFsbGJhY2sgZGF0YWJhc2UKKyAgLy8gYW5kIGVuY291bnRlcmVkIGVycm9ycy4gV2Ugd2lsbCBub3QgYXR0ZW1wdCB0byBsb2FkIHRoZW0gYWdhaW4gZHVyaW5nCisgIC8vIGV4ZWN1dGlvbiBvZiB0aGUgY3VycmVudCBwdWJsaWMgQVBJIGNhbGwsIGJ1dCBmb3IgY29tcGF0aWJpbGl0eSB3aXRoCisgIC8vIGxlZ2FjeSBjbGllbnRzLCB0aGlzIGlzIGNsZWFyZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIHB1YmxpYyBBUEkgY2FsbC4KKyAgaGFzaF9zZXQ8c3RyaW5nPiBrbm93bl9iYWRfc3ltYm9sc187CisKICAgLy8gVGhlIHNldCBvZiBkZXNjcmlwdG9ycyBmb3Igd2hpY2ggd2UndmUgYWxyZWFkeSBsb2FkZWQgdGhlIGZ1bGwKICAgLy8gc2V0IG9mIGV4dGVuc2lvbnMgbnVtYmVycyBmcm9tIGZhbGxiYWNrX2RhdGFiYXNlXy4KICAgaGFzaF9zZXQ8Y29uc3QgRGVzY3JpcHRvcio+IGV4dGVuc2lvbnNfbG9hZGVkX2Zyb21fZGJfOwpAQCAtMzQ5LDcgKzQ2NSw3IEBACiAgIC8vIGRlY2xhcmluZyBTeW1ib2wgaW4gZGVzY3JpcHRvci5oLCB3aGljaCB3b3VsZCBkcmFnIGFsbCBraW5kcyBvZiBvdGhlcgogICAvLyBzdHVmZiBpbnRvIHRoZSBoZWFkZXIuICBZYXkgQysrLgogICBTeW1ib2wgRmluZEJ5TmFtZUhlbHBlcigKLSAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgY29uc3Qgc3RyaW5nJiBuYW1lKTsKIAogICAvLyBUaGVzZSByZXR1cm4gTlVMTCBpZiBub3QgZm91bmQuCiAgIGlubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRmluZEZpbGUoY29uc3Qgc3RyaW5nJiBrZXkpIGNvbnN0OwpAQCAtNDA1LDEwICs1MjEsMjggQEAKICAgRmlsZXNCeU5hbWVNYXAgICAgICAgIGZpbGVzX2J5X25hbWVfOwogICBFeHRlbnNpb25zR3JvdXBlZEJ5RGVzY3JpcHRvck1hcCBleHRlbnNpb25zXzsKIAotICBpbnQgc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludF87Ci0gIGludCBtZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludF87Ci0gIGludCBmaWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludF87Ci0gIGludCBhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludF87CisgIHN0cnVjdCBDaGVja1BvaW50IHsKKyAgICBleHBsaWNpdCBDaGVja1BvaW50KGNvbnN0IFRhYmxlcyogdGFibGVzKQorICAgICAgOiBzdHJpbmdzX2JlZm9yZV9jaGVja3BvaW50KHRhYmxlcy0+c3RyaW5nc18uc2l6ZSgpKSwKKyAgICAgICAgbWVzc2FnZXNfYmVmb3JlX2NoZWNrcG9pbnQodGFibGVzLT5tZXNzYWdlc18uc2l6ZSgpKSwKKyAgICAgICAgZmlsZV90YWJsZXNfYmVmb3JlX2NoZWNrcG9pbnQodGFibGVzLT5maWxlX3RhYmxlc18uc2l6ZSgpKSwKKyAgICAgICAgYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnQodGFibGVzLT5hbGxvY2F0aW9uc18uc2l6ZSgpKSwKKyAgICAgICAgcGVuZGluZ19zeW1ib2xzX2JlZm9yZV9jaGVja3BvaW50KAorICAgICAgICAgICAgdGFibGVzLT5zeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKSksCisgICAgICAgIHBlbmRpbmdfZmlsZXNfYmVmb3JlX2NoZWNrcG9pbnQoCisgICAgICAgICAgICB0YWJsZXMtPmZpbGVzX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKSksCisgICAgICAgIHBlbmRpbmdfZXh0ZW5zaW9uc19iZWZvcmVfY2hlY2twb2ludCgKKyAgICAgICAgICAgIHRhYmxlcy0+ZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCkpIHsKKyAgICB9CisgICAgaW50IHN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgaW50IG1lc3NhZ2VzX2JlZm9yZV9jaGVja3BvaW50OworICAgIGludCBmaWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICBpbnQgYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgaW50IHBlbmRpbmdfc3ltYm9sc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICBpbnQgcGVuZGluZ19maWxlc19iZWZvcmVfY2hlY2twb2ludDsKKyAgICBpbnQgcGVuZGluZ19leHRlbnNpb25zX2JlZm9yZV9jaGVja3BvaW50OworICB9OworICB2ZWN0b3I8Q2hlY2tQb2ludD4gY2hlY2twb2ludHNfOwogICB2ZWN0b3I8Y29uc3QgY2hhciogICAgICA+IHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF87CiAgIHZlY3Rvcjxjb25zdCBjaGFyKiAgICAgID4gZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF87CiAgIHZlY3RvcjxEZXNjcmlwdG9ySW50UGFpcj4gZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50XzsKQEAgLTQzMyw3ICs1NjcsNyBAQAogICB+RmlsZURlc2NyaXB0b3JUYWJsZXMoKTsKIAogICAvLyBFbXB0eSB0YWJsZSwgdXNlZCB3aXRoIHBsYWNlaG9sZGVyIGZpbGVzLgotICBzdGF0aWMgY29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMga0VtcHR5OworICBpbmxpbmUgc3RhdGljIGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzJiBHZXRFbXB0eUluc3RhbmNlKCk7CiAKICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gRmluZGluZyBpdGVtcy4KQEAgLTQ1NSw2ICs1ODksOSBAQAogICAgIGNvbnN0IHZvaWQqIHBhcmVudCwgY29uc3Qgc3RyaW5nJiBjYW1lbGNhc2VfbmFtZSkgY29uc3Q7CiAgIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOdW1iZXIoCiAgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIHBhcmVudCwgaW50IG51bWJlcikgY29uc3Q7CisgIC8vIFRoaXMgY3JlYXRlcyBhIG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yIGlmIG5vdCBmb3VuZCwgaW4gYSB0aHJlYWQtc2FmZSB3YXkuCisgIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaW5kRW51bVZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bigKKyAgICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0OwogCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIEFkZGluZyBpdGVtcy4KQEAgLTQ3MiwyMCArNjA5LDQ3IEBACiAgIC8vIGZhaWxzIGJlY2F1c2Ugd2UgYWxsb3cgZHVwbGljYXRlczsgdGhlIGZpcnN0IGZpZWxkIGJ5IHRoZSBuYW1lIHdpbnMuCiAgIHZvaWQgQWRkRmllbGRCeVN0eWxpemVkTmFtZXMoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CiAKKyAgLy8gUG9wdWxhdGVzIHAtPmZpcnN0LT5sb2NhdGlvbnNfYnlfcGF0aF8gZnJvbSBwLT5zZWNvbmQuCisgIC8vIFVudXN1YWwgc2lnbmF0dXJlIGRpY3RhdGVkIGJ5IEdvb2dsZU9uY2VEeW5hbWljLgorICBzdGF0aWMgdm9pZCBCdWlsZExvY2F0aW9uc0J5UGF0aCgKKyAgICAgIHBhaXI8Y29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqLCBjb25zdCBTb3VyY2VDb2RlSW5mbyo+KiBwKTsKKworICAvLyBSZXR1cm5zIHRoZSBsb2NhdGlvbiBkZW5vdGVkIGJ5IHRoZSBzcGVjaWZpZWQgcGF0aCB0aHJvdWdoIGluZm8sCisgIC8vIG9yIE5VTEwgaWYgbm90IGZvdW5kLgorICAvLyBUaGUgdmFsdWUgb2YgaW5mbyBtdXN0IGJlIHRoYXQgb2YgdGhlIGNvcnJlc3BvbmRpbmcgRmlsZURlc2NyaXB0b3IuCisgIC8vIChDb25jZXB0dWFsbHkgYSBwdXJlIGZ1bmN0aW9uLCBidXQgc3RhdGVmdWwgYXMgYW4gb3B0aW1pc2F0aW9uLikKKyAgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIEdldFNvdXJjZUxvY2F0aW9uKAorICAgICAgY29uc3QgdmVjdG9yPGludD4mIHBhdGgsIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBpbmZvKSBjb25zdDsKKwogIHByaXZhdGU6CiAgIFN5bWJvbHNCeVBhcmVudE1hcCAgICBzeW1ib2xzX2J5X3BhcmVudF87CiAgIEZpZWxkc0J5TmFtZU1hcCAgICAgICBmaWVsZHNfYnlfbG93ZXJjYXNlX25hbWVfOwogICBGaWVsZHNCeU5hbWVNYXAgICAgICAgZmllbGRzX2J5X2NhbWVsY2FzZV9uYW1lXzsKICAgRmllbGRzQnlOdW1iZXJNYXAgICAgIGZpZWxkc19ieV9udW1iZXJfOyAgICAgICAvLyBOb3QgaW5jbHVkaW5nIGV4dGVuc2lvbnMuCiAgIEVudW1WYWx1ZXNCeU51bWJlck1hcCBlbnVtX3ZhbHVlc19ieV9udW1iZXJfOworICBtdXRhYmxlIEVudW1WYWx1ZXNCeU51bWJlck1hcCB1bmtub3duX2VudW1fdmFsdWVzX2J5X251bWJlcl8KKyAgICAgIEdPT0dMRV9HVUFSREVEX0JZKHVua25vd25fZW51bV92YWx1ZXNfbXVfKTsKKworICAvLyBQb3B1bGF0ZWQgb24gZmlyc3QgcmVxdWVzdCB0byBzYXZlIHNwYWNlLCBoZW5jZSBjb25zdG5lc3MgZ2FtZXMuCisgIG11dGFibGUgR29vZ2xlT25jZUR5bmFtaWMgbG9jYXRpb25zX2J5X3BhdGhfb25jZV87CisgIG11dGFibGUgTG9jYXRpb25zQnlQYXRoTWFwIGxvY2F0aW9uc19ieV9wYXRoXzsKKworICAvLyBNdXRleCB0byBwcm90ZWN0IHRoZSB1bmtub3duLWVudW0tdmFsdWUgbWFwIGR1ZSB0byBkeW5hbWljCisgIC8vIEVudW1WYWx1ZURlc2NyaXB0b3IgY3JlYXRpb24gb24gdW5rbm93biB2YWx1ZXMuCisgIG11dGFibGUgTXV0ZXggdW5rbm93bl9lbnVtX3ZhbHVlc19tdV87CiB9OwogCiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpUYWJsZXMoKQotICA6IHN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnRfKDApLAotICAgIG1lc3NhZ2VzX2JlZm9yZV9jaGVja3BvaW50XygwKSwKLSAgICBhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludF8oMCkge30KKyAgICAvLyBTdGFydCBzb21lIGhhc2hfbWFwIGFuZCBoYXNoX3NldCBvYmplY3RzIHdpdGggYSBzbWFsbCAjIG9mIGJ1Y2tldHMKKyAgICA6IGtub3duX2JhZF9maWxlc18oMyksCisgICAgICBrbm93bl9iYWRfc3ltYm9sc18oMyksCisgICAgICBleHRlbnNpb25zX2xvYWRlZF9mcm9tX2RiXygzKSwKKyAgICAgIHN5bWJvbHNfYnlfbmFtZV8oMyksCisgICAgICBmaWxlc19ieV9uYW1lXygzKSB7fQorCiAKIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6On5UYWJsZXMoKSB7CisgIEdPT0dMRV9EQ0hFQ0soY2hlY2twb2ludHNfLmVtcHR5KCkpOwogICAvLyBOb3RlIHRoYXQgdGhlIGRlbGV0aW9uIG9yZGVyIGlzIGltcG9ydGFudCwgc2luY2UgdGhlIGRlc3RydWN0b3JzIG9mIHNvbWUKICAgLy8gbWVzc2FnZXMgbWF5IHJlZmVyIHRvIG9iamVjdHMgaW4gYWxsb2NhdGlvbnNfLgogICBTVExEZWxldGVFbGVtZW50cygmbWVzc2FnZXNfKTsKQEAgLTQ5Niw1MSArNjYwLDEwNiBAQAogICBTVExEZWxldGVFbGVtZW50cygmZmlsZV90YWJsZXNfKTsKIH0KIAotRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbGVEZXNjcmlwdG9yVGFibGVzKCkge30KLUZpbGVEZXNjcmlwdG9yVGFibGVzOjp+RmlsZURlc2NyaXB0b3JUYWJsZXMoKSB7fQotCi1jb25zdCBGaWxlRGVzY3JpcHRvclRhYmxlcyBGaWxlRGVzY3JpcHRvclRhYmxlczo6a0VtcHR5OwotCi12b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkNoZWNrcG9pbnQoKSB7Ci0gIHN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnRfID0gc3RyaW5nc18uc2l6ZSgpOwotICBtZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludF8gPSBtZXNzYWdlc18uc2l6ZSgpOwotICBmaWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludF8gPSBmaWxlX3RhYmxlc18uc2l6ZSgpOwotICBhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludF8gPSBhbGxvY2F0aW9uc18uc2l6ZSgpOwotCi0gIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKLSAgZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKLSAgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOworRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbGVEZXNjcmlwdG9yVGFibGVzKCkKKyAgICAvLyBJbml0aWFsaXplIGFsbCB0aGUgaGFzaCB0YWJsZXMgdG8gc3RhcnQgb3V0IHdpdGggYSBzbWFsbCAjIG9mIGJ1Y2tldHMKKyAgICA6IHN5bWJvbHNfYnlfcGFyZW50XygzKSwKKyAgICAgIGZpZWxkc19ieV9sb3dlcmNhc2VfbmFtZV8oMyksCisgICAgICBmaWVsZHNfYnlfY2FtZWxjYXNlX25hbWVfKDMpLAorICAgICAgZmllbGRzX2J5X251bWJlcl8oMyksCisgICAgICBlbnVtX3ZhbHVlc19ieV9udW1iZXJfKDMpLAorICAgICAgdW5rbm93bl9lbnVtX3ZhbHVlc19ieV9udW1iZXJfKDMpIHsKIH0KIAotdm9pZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpSb2xsYmFjaygpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzeW1ib2xzX2FmdGVyX2NoZWNrcG9pbnRfLnNpemUoKTsgaSsrKSB7CitGaWxlRGVzY3JpcHRvclRhYmxlczo6fkZpbGVEZXNjcmlwdG9yVGFibGVzKCkge30KKworbmFtZXNwYWNlIHsKKworRmlsZURlc2NyaXB0b3JUYWJsZXMqIGZpbGVfZGVzY3JpcHRvcl90YWJsZXNfID0gTlVMTDsKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UoZmlsZV9kZXNjcmlwdG9yX3RhYmxlc19vbmNlX2luaXRfKTsKKwordm9pZCBEZWxldGVGaWxlRGVzY3JpcHRvclRhYmxlcygpIHsKKyAgZGVsZXRlIGZpbGVfZGVzY3JpcHRvcl90YWJsZXNfOworICBmaWxlX2Rlc2NyaXB0b3JfdGFibGVzXyA9IE5VTEw7Cit9CisKK3ZvaWQgSW5pdEZpbGVEZXNjcmlwdG9yVGFibGVzKCkgeworICBmaWxlX2Rlc2NyaXB0b3JfdGFibGVzXyA9IG5ldyBGaWxlRGVzY3JpcHRvclRhYmxlcygpOworICBpbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlRmlsZURlc2NyaXB0b3JUYWJsZXMpOworfQorCitpbmxpbmUgdm9pZCBJbml0RmlsZURlc2NyaXB0b3JUYWJsZXNPbmNlKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KAorICAgICAgJmZpbGVfZGVzY3JpcHRvcl90YWJsZXNfb25jZV9pbml0XywgJkluaXRGaWxlRGVzY3JpcHRvclRhYmxlcyk7Cit9CisKK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKworaW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzJiBGaWxlRGVzY3JpcHRvclRhYmxlczo6R2V0RW1wdHlJbnN0YW5jZSgpIHsKKyAgSW5pdEZpbGVEZXNjcmlwdG9yVGFibGVzT25jZSgpOworICByZXR1cm4gKmZpbGVfZGVzY3JpcHRvcl90YWJsZXNfOworfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFkZENoZWNrcG9pbnQoKSB7CisgIGNoZWNrcG9pbnRzXy5wdXNoX2JhY2soQ2hlY2tQb2ludCh0aGlzKSk7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6Q2xlYXJMYXN0Q2hlY2twb2ludCgpIHsKKyAgR09PR0xFX0RDSEVDSyghY2hlY2twb2ludHNfLmVtcHR5KCkpOworICBjaGVja3BvaW50c18ucG9wX2JhY2soKTsKKyAgaWYgKGNoZWNrcG9pbnRzXy5lbXB0eSgpKSB7CisgICAgLy8gQWxsIGNoZWNrcG9pbnRzIGhhdmUgYmVlbiBjbGVhcmVkOiB3ZSBjYW4gbm93IGNvbW1pdCBhbGwgb2YgdGhlIHBlbmRpbmcKKyAgICAvLyBkYXRhLgorICAgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKKyAgICBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOworICAgIGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8uY2xlYXIoKTsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OlJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpIHsKKyAgR09PR0xFX0RDSEVDSyghY2hlY2twb2ludHNfLmVtcHR5KCkpOworICBjb25zdCBDaGVja1BvaW50JiBjaGVja3BvaW50ID0gY2hlY2twb2ludHNfLmJhY2soKTsKKworICBmb3IgKGludCBpID0gY2hlY2twb2ludC5wZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgICAgaSA8IHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOworICAgICAgIGkrKykgewogICAgIHN5bWJvbHNfYnlfbmFtZV8uZXJhc2Uoc3ltYm9sc19hZnRlcl9jaGVja3BvaW50X1tpXSk7CiAgIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCk7IGkrKykgeworICBmb3IgKGludCBpID0gY2hlY2twb2ludC5wZW5kaW5nX2ZpbGVzX2JlZm9yZV9jaGVja3BvaW50OworICAgICAgIGkgPCBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCk7CisgICAgICAgaSsrKSB7CiAgICAgZmlsZXNfYnlfbmFtZV8uZXJhc2UoZmlsZXNfYWZ0ZXJfY2hlY2twb2ludF9baV0pOwogICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5zaXplKCk7IGkrKykgeworICBmb3IgKGludCBpID0gY2hlY2twb2ludC5wZW5kaW5nX2V4dGVuc2lvbnNfYmVmb3JlX2NoZWNrcG9pbnQ7CisgICAgICAgaSA8IGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF8uc2l6ZSgpOworICAgICAgIGkrKykgewogICAgIGV4dGVuc2lvbnNfLmVyYXNlKGV4dGVuc2lvbnNfYWZ0ZXJfY2hlY2twb2ludF9baV0pOwogICB9CiAKLSAgc3ltYm9sc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOwotICBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5jbGVhcigpOwotICBleHRlbnNpb25zX2FmdGVyX2NoZWNrcG9pbnRfLmNsZWFyKCk7CisgIHN5bWJvbHNfYWZ0ZXJfY2hlY2twb2ludF8ucmVzaXplKAorICAgICAgY2hlY2twb2ludC5wZW5kaW5nX3N5bWJvbHNfYmVmb3JlX2NoZWNrcG9pbnQpOworICBmaWxlc19hZnRlcl9jaGVja3BvaW50Xy5yZXNpemUoY2hlY2twb2ludC5wZW5kaW5nX2ZpbGVzX2JlZm9yZV9jaGVja3BvaW50KTsKKyAgZXh0ZW5zaW9uc19hZnRlcl9jaGVja3BvaW50Xy5yZXNpemUoCisgICAgICBjaGVja3BvaW50LnBlbmRpbmdfZXh0ZW5zaW9uc19iZWZvcmVfY2hlY2twb2ludCk7CiAKICAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoCi0gICAgc3RyaW5nc18uYmVnaW4oKSArIHN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnRfLCBzdHJpbmdzXy5lbmQoKSk7CisgICAgICBzdHJpbmdzXy5iZWdpbigpICsgY2hlY2twb2ludC5zdHJpbmdzX2JlZm9yZV9jaGVja3BvaW50LCBzdHJpbmdzXy5lbmQoKSk7CiAgIFNUTERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKAotICAgIG1lc3NhZ2VzXy5iZWdpbigpICsgbWVzc2FnZXNfYmVmb3JlX2NoZWNrcG9pbnRfLCBtZXNzYWdlc18uZW5kKCkpOworICAgICAgbWVzc2FnZXNfLmJlZ2luKCkgKyBjaGVja3BvaW50Lm1lc3NhZ2VzX2JlZm9yZV9jaGVja3BvaW50LAorICAgICAgbWVzc2FnZXNfLmVuZCgpKTsKICAgU1RMRGVsZXRlQ29udGFpbmVyUG9pbnRlcnMoCi0gICAgZmlsZV90YWJsZXNfLmJlZ2luKCkgKyBmaWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludF8sIGZpbGVfdGFibGVzXy5lbmQoKSk7Ci0gIGZvciAoaW50IGkgPSBhbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludF87IGkgPCBhbGxvY2F0aW9uc18uc2l6ZSgpOyBpKyspIHsKKyAgICAgIGZpbGVfdGFibGVzXy5iZWdpbigpICsgY2hlY2twb2ludC5maWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludCwKKyAgICAgIGZpbGVfdGFibGVzXy5lbmQoKSk7CisgIGZvciAoaW50IGkgPSBjaGVja3BvaW50LmFsbG9jYXRpb25zX2JlZm9yZV9jaGVja3BvaW50OworICAgICAgIGkgPCBhbGxvY2F0aW9uc18uc2l6ZSgpOworICAgICAgIGkrKykgewogICAgIG9wZXJhdG9yIGRlbGV0ZShhbGxvY2F0aW9uc19baV0pOwogICB9CiAKLSAgc3RyaW5nc18ucmVzaXplKHN0cmluZ3NfYmVmb3JlX2NoZWNrcG9pbnRfKTsKLSAgbWVzc2FnZXNfLnJlc2l6ZShtZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludF8pOwotICBmaWxlX3RhYmxlc18ucmVzaXplKGZpbGVfdGFibGVzX2JlZm9yZV9jaGVja3BvaW50Xyk7Ci0gIGFsbG9jYXRpb25zXy5yZXNpemUoYWxsb2NhdGlvbnNfYmVmb3JlX2NoZWNrcG9pbnRfKTsKKyAgc3RyaW5nc18ucmVzaXplKGNoZWNrcG9pbnQuc3RyaW5nc19iZWZvcmVfY2hlY2twb2ludCk7CisgIG1lc3NhZ2VzXy5yZXNpemUoY2hlY2twb2ludC5tZXNzYWdlc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGZpbGVfdGFibGVzXy5yZXNpemUoY2hlY2twb2ludC5maWxlX3RhYmxlc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGFsbG9jYXRpb25zXy5yZXNpemUoY2hlY2twb2ludC5hbGxvY2F0aW9uc19iZWZvcmVfY2hlY2twb2ludCk7CisgIGNoZWNrcG9pbnRzXy5wb3BfYmFjaygpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01NzMsOCArNzkyLDEwIEBACiB9CiAKIFN5bWJvbCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kQnlOYW1lSGVscGVyKAotICAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sLCBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CiAgIE11dGV4TG9ja01heWJlIGxvY2socG9vbC0+bXV0ZXhfKTsKKyAga25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7CisgIGtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKICAgU3ltYm9sIHJlc3VsdCA9IEZpbmRTeW1ib2wobmFtZSk7CiAKICAgaWYgKHJlc3VsdC5Jc051bGwoKSAmJiBwb29sLT51bmRlcmxheV8gIT0gTlVMTCkgewpAQCAtNjAwLDcgKzgyMSw3IEBACiAKIGlubGluZSBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpGaW5kRmllbGRCeU51bWJlcigKICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0IHsKLSAgcmV0dXJuIEZpbmRQdHJPck51bGwoZmllbGRzX2J5X251bWJlcl8sIG1ha2VfcGFpcihwYXJlbnQsIG51bWJlcikpOworICByZXR1cm4gRmluZFB0ck9yTnVsbChmaWVsZHNfYnlfbnVtYmVyXywgc3RkOjptYWtlX3BhaXIocGFyZW50LCBudW1iZXIpKTsKIH0KIAogaW5saW5lIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZSgKQEAgLTYxNywxOCArODM4LDcxIEBACiAKIGlubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6RmluZEVudW1WYWx1ZUJ5TnVtYmVyKAogICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0IHsKLSAgcmV0dXJuIEZpbmRQdHJPck51bGwoZW51bV92YWx1ZXNfYnlfbnVtYmVyXywgbWFrZV9wYWlyKHBhcmVudCwgbnVtYmVyKSk7CisgIHJldHVybiBGaW5kUHRyT3JOdWxsKGVudW1fdmFsdWVzX2J5X251bWJlcl8sIHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgbnVtYmVyKSk7CiB9CiAKK2lubGluZSBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKgorRmlsZURlc2NyaXB0b3JUYWJsZXM6OkZpbmRFbnVtVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKAorICAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBwYXJlbnQsIGludCBudW1iZXIpIGNvbnN0IHsKKyAgLy8gRmlyc3QgdHJ5LCB3aXRoIG1hcCBvZiBjb21waWxlZC1pbiB2YWx1ZXMuCisgIHsKKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkZXNjID0KKyAgICAgICAgRmluZFB0ck9yTnVsbChlbnVtX3ZhbHVlc19ieV9udW1iZXJfLCBzdGQ6Om1ha2VfcGFpcihwYXJlbnQsIG51bWJlcikpOworICAgIGlmIChkZXNjICE9IE5VTEwpIHsKKyAgICAgIHJldHVybiBkZXNjOworICAgIH0KKyAgfQorICAvLyBTZWNvbmQgdHJ5LCB3aXRoIHJlYWRlciBsb2NrIGhlbGQgb24gdW5rbm93biBlbnVtIHZhbHVlczogY29tbW9uIGNhc2UuCisgIHsKKyAgICBSZWFkZXJNdXRleExvY2sgbCgmdW5rbm93bl9lbnVtX3ZhbHVlc19tdV8pOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2MgPSBGaW5kUHRyT3JOdWxsKAorICAgICAgICB1bmtub3duX2VudW1fdmFsdWVzX2J5X251bWJlcl8sIHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgbnVtYmVyKSk7CisgICAgaWYgKGRlc2MgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIGRlc2M7CisgICAgfQorICB9CisgIC8vIElmIG5vdCBmb3VuZCwgdHJ5IGFnYWluIHdpdGggd3JpdGVyIGxvY2sgaGVsZCwgYW5kIGNyZWF0ZSBuZXcgZGVzY3JpcHRvciBpZgorICAvLyBuZWNlc3NhcnkuCisgIHsKKyAgICBXcml0ZXJNdXRleExvY2sgbCgmdW5rbm93bl9lbnVtX3ZhbHVlc19tdV8pOworICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGRlc2MgPSBGaW5kUHRyT3JOdWxsKAorICAgICAgICB1bmtub3duX2VudW1fdmFsdWVzX2J5X251bWJlcl8sIHN0ZDo6bWFrZV9wYWlyKHBhcmVudCwgbnVtYmVyKSk7CisgICAgaWYgKGRlc2MgIT0gTlVMTCkgeworICAgICAgcmV0dXJuIGRlc2M7CisgICAgfQorCisgICAgLy8gQ3JlYXRlIGFuIEVudW1WYWx1ZURlc2NyaXB0b3IgZHluYW1pY2FsbHkuIFdlIGRvbid0IGluc2VydCBpdCBpbnRvIHRoZQorICAgIC8vIEVudW1EZXNjcmlwdG9yIChpdCdzIG5vdCBhIHBhcnQgb2YgdGhlIGVudW0gYXMgb3JpZ2luYWxseSBkZWZpbmVkKSwgYnV0CisgICAgLy8gd2UgZG8gaW5zZXJ0IGl0IGludG8gdGhlIHRhYmxlIHNvIHRoYXQgd2UgY2FuIHJldHVybiB0aGUgc2FtZSBwb2ludGVyCisgICAgLy8gbGF0ZXIuCisgICAgc3RyaW5nIGVudW1fdmFsdWVfbmFtZSA9IFN0cmluZ1ByaW50ZigKKyAgICAgICAgIlVOS05PV05fRU5VTV9WQUxVRV8lc18lZCIsIHBhcmVudC0+bmFtZSgpLmNfc3RyKCksIG51bWJlcik7CisgICAgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyogdGFibGVzID0KKyAgICAgICAgY29uc3RfY2FzdDxEZXNjcmlwdG9yUG9vbDo6VGFibGVzKj4oRGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCktPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YWJsZXNfLmdldCgpKTsKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXMtPkFsbG9jYXRlPEVudW1WYWx1ZURlc2NyaXB0b3I+KCk7CisgICAgcmVzdWx0LT5uYW1lXyA9IHRhYmxlcy0+QWxsb2NhdGVTdHJpbmcoZW51bV92YWx1ZV9uYW1lKTsKKyAgICByZXN1bHQtPmZ1bGxfbmFtZV8gPSB0YWJsZXMtPkFsbG9jYXRlU3RyaW5nKHBhcmVudC0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi4iICsgZW51bV92YWx1ZV9uYW1lKTsKKyAgICByZXN1bHQtPm51bWJlcl8gPSBudW1iZXI7CisgICAgcmVzdWx0LT50eXBlXyA9IHBhcmVudDsKKyAgICByZXN1bHQtPm9wdGlvbnNfID0gJkVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgICBJbnNlcnRJZk5vdFByZXNlbnQoJnVua25vd25fZW51bV92YWx1ZXNfYnlfbnVtYmVyXywKKyAgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYWtlX3BhaXIocGFyZW50LCBudW1iZXIpLCByZXN1bHQpOworICAgIHJldHVybiByZXN1bHQ7CisgIH0KK30KKworCiBpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kRXh0ZW5zaW9uKAogICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCBpbnQgbnVtYmVyKSB7Ci0gIHJldHVybiBGaW5kUHRyT3JOdWxsKGV4dGVuc2lvbnNfLCBtYWtlX3BhaXIoZXh0ZW5kZWUsIG51bWJlcikpOworICByZXR1cm4gRmluZFB0ck9yTnVsbChleHRlbnNpb25zXywgc3RkOjptYWtlX3BhaXIoZXh0ZW5kZWUsIG51bWJlcikpOwogfQogCiBpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUG9vbDo6VGFibGVzOjpGaW5kQWxsRXh0ZW5zaW9ucygKICAgICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSwgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0IHsKICAgRXh0ZW5zaW9uc0dyb3VwZWRCeURlc2NyaXB0b3JNYXA6OmNvbnN0X2l0ZXJhdG9yIGl0ID0KLSAgICAgIGV4dGVuc2lvbnNfLmxvd2VyX2JvdW5kKG1ha2VfcGFpcihleHRlbmRlZSwgMCkpOworICAgICAgZXh0ZW5zaW9uc18ubG93ZXJfYm91bmQoc3RkOjptYWtlX3BhaXIoZXh0ZW5kZWUsIDApKTsKICAgZm9yICg7IGl0ICE9IGV4dGVuc2lvbnNfLmVuZCgpICYmIGl0LT5maXJzdC5maXJzdCA9PSBleHRlbmRlZTsgKytpdCkgewogICAgIG91dC0+cHVzaF9iYWNrKGl0LT5zZWNvbmQpOwogICB9CkBAIC03MjEsNyArOTk1LDcgQEAKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4KLVR5cGUqIERlc2NyaXB0b3JQb29sOjpUYWJsZXM6OkFsbG9jYXRlTWVzc2FnZShUeXBlKiBkdW1teSkgeworVHlwZSogRGVzY3JpcHRvclBvb2w6OlRhYmxlczo6QWxsb2NhdGVNZXNzYWdlKFR5cGUqIC8qIGR1bW15ICovKSB7CiAgIFR5cGUqIHJlc3VsdCA9IG5ldyBUeXBlOwogICBtZXNzYWdlc18ucHVzaF9iYWNrKHJlc3VsdCk7CiAgIHJldHVybiByZXN1bHQ7CkBAIC03NDUsNiArMTAxOSwyMiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCit2b2lkIEZpbGVEZXNjcmlwdG9yVGFibGVzOjpCdWlsZExvY2F0aW9uc0J5UGF0aCgKKyAgICBwYWlyPGNvbnN0IEZpbGVEZXNjcmlwdG9yVGFibGVzKiwgY29uc3QgU291cmNlQ29kZUluZm8qPiogcCkgeworICBmb3IgKGludCBpID0gMCwgbGVuID0gcC0+c2Vjb25kLT5sb2NhdGlvbl9zaXplKCk7IGkgPCBsZW47ICsraSkgeworICAgIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBsb2MgPSAmcC0+c2Vjb25kLT5sb2NhdGlvbigpLkdldChpKTsKKyAgICBwLT5maXJzdC0+bG9jYXRpb25zX2J5X3BhdGhfW0pvaW4obG9jLT5wYXRoKCksICIsIildID0gbG9jOworICB9Cit9CisKK2NvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBGaWxlRGVzY3JpcHRvclRhYmxlczo6R2V0U291cmNlTG9jYXRpb24oCisgICAgY29uc3QgdmVjdG9yPGludD4mIHBhdGgsIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBpbmZvKSBjb25zdCB7CisgIHBhaXI8Y29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqLCBjb25zdCBTb3VyY2VDb2RlSW5mbyo+IHAoCisgICAgICBzdGQ6Om1ha2VfcGFpcih0aGlzLCBpbmZvKSk7CisgIGxvY2F0aW9uc19ieV9wYXRoX29uY2VfLkluaXQoJkZpbGVEZXNjcmlwdG9yVGFibGVzOjpCdWlsZExvY2F0aW9uc0J5UGF0aCwgJnApOworICByZXR1cm4gRmluZFB0ck9yTnVsbChsb2NhdGlvbnNfYnlfcGF0aF8sIEpvaW4ocGF0aCwgIiwiKSk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIERlc2NyaXB0b3JQb29sCiAKQEAgLTc1Nyw3ICsxMDQ3LDggQEAKICAgICB1bmRlcmxheV8oTlVMTCksCiAgICAgdGFibGVzXyhuZXcgVGFibGVzKSwKICAgICBlbmZvcmNlX2RlcGVuZGVuY2llc18odHJ1ZSksCi0gICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpIHt9CisgICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpLAorICAgIGVuZm9yY2Vfd2Vha18oZmFsc2UpIHt9CiAKIERlc2NyaXB0b3JQb29sOjpEZXNjcmlwdG9yUG9vbChEZXNjcmlwdG9yRGF0YWJhc2UqIGZhbGxiYWNrX2RhdGFiYXNlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IpCkBAIC03NjcsNyArMTA1OCw4IEBACiAgICAgdW5kZXJsYXlfKE5VTEwpLAogICAgIHRhYmxlc18obmV3IFRhYmxlcyksCiAgICAgZW5mb3JjZV9kZXBlbmRlbmNpZXNfKHRydWUpLAotICAgIGFsbG93X3Vua25vd25fKGZhbHNlKSB7CisgICAgYWxsb3dfdW5rbm93bl8oZmFsc2UpLAorICAgIGVuZm9yY2Vfd2Vha18oZmFsc2UpIHsKIH0KIAogRGVzY3JpcHRvclBvb2w6OkRlc2NyaXB0b3JQb29sKGNvbnN0IERlc2NyaXB0b3JQb29sKiB1bmRlcmxheSkKQEAgLTc3Nyw3ICsxMDY5LDggQEAKICAgICB1bmRlcmxheV8odW5kZXJsYXkpLAogICAgIHRhYmxlc18obmV3IFRhYmxlcyksCiAgICAgZW5mb3JjZV9kZXBlbmRlbmNpZXNfKHRydWUpLAotICAgIGFsbG93X3Vua25vd25fKGZhbHNlKSB7fQorICAgIGFsbG93X3Vua25vd25fKGZhbHNlKSwKKyAgICBlbmZvcmNlX3dlYWtfKGZhbHNlKSB7fQogCiBEZXNjcmlwdG9yUG9vbDo6fkRlc2NyaXB0b3JQb29sKCkgewogICBpZiAobXV0ZXhfICE9IE5VTEwpIGRlbGV0ZSBtdXRleF87CkBAIC03OTAsNiArMTA4MywxNCBAQAogICBlbmZvcmNlX2RlcGVuZGVuY2llc18gPSBmYWxzZTsKIH0KIAordm9pZCBEZXNjcmlwdG9yUG9vbDo6QWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKGNvbnN0IHN0cmluZyYgZmlsZV9uYW1lKSB7CisgIHVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLmluc2VydChmaWxlX25hbWUpOworfQorCit2b2lkIERlc2NyaXB0b3JQb29sOjpDbGVhclVudXNlZEltcG9ydFRyYWNrRmlsZXMoKSB7CisgIHVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLmNsZWFyKCk7Cit9CisKIGJvb2wgRGVzY3JpcHRvclBvb2w6OkludGVybmFsSXNGaWxlTG9hZGVkKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUpIGNvbnN0IHsKICAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOwogICByZXR1cm4gdGFibGVzXy0+RmluZEZpbGUoZmlsZW5hbWUpICE9IE5VTEw7CkBAIC04MTEsNyArMTExMiw3IEBACiAgIGdlbmVyYXRlZF9wb29sXyA9IE5VTEw7CiB9CiAKLXZvaWQgSW5pdEdlbmVyYXRlZFBvb2woKSB7CitzdGF0aWMgdm9pZCBJbml0R2VuZXJhdGVkUG9vbCgpIHsKICAgZ2VuZXJhdGVkX2RhdGFiYXNlXyA9IG5ldyBFbmNvZGVkRGVzY3JpcHRvckRhdGFiYXNlOwogICBnZW5lcmF0ZWRfcG9vbF8gPSBuZXcgRGVzY3JpcHRvclBvb2woZ2VuZXJhdGVkX2RhdGFiYXNlXyk7CiAKQEAgLTgyOSw2ICsxMTMwLDcgQEAKICAgcmV0dXJuIGdlbmVyYXRlZF9wb29sXzsKIH0KIAorCiBEZXNjcmlwdG9yUG9vbCogRGVzY3JpcHRvclBvb2w6OmludGVybmFsX2dlbmVyYXRlZF9wb29sKCkgewogICBJbml0R2VuZXJhdGVkUG9vbE9uY2UoKTsKICAgcmV0dXJuIGdlbmVyYXRlZF9wb29sXzsKQEAgLTg3MSwxNCArMTE3MywxNiBAQAogCiBjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRGaWxlQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgewogICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisgIHRhYmxlc18tPmtub3duX2JhZF9zeW1ib2xzXy5jbGVhcigpOworICB0YWJsZXNfLT5rbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7CiAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRmlsZShuYW1lKTsKICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OwogICBpZiAodW5kZXJsYXlfICE9IE5VTEwpIHsKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0ID0gdW5kZXJsYXlfLT5GaW5kRmlsZUJ5TmFtZShuYW1lKTsKKyAgICByZXN1bHQgPSB1bmRlcmxheV8tPkZpbmRGaWxlQnlOYW1lKG5hbWUpOwogICAgIGlmIChyZXN1bHQgIT0gTlVMTCkgcmV0dXJuIHJlc3VsdDsKICAgfQogICBpZiAoVHJ5RmluZEZpbGVJbkZhbGxiYWNrRGF0YWJhc2UobmFtZSkpIHsKLSAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0ID0gdGFibGVzXy0+RmluZEZpbGUobmFtZSk7CisgICAgcmVzdWx0ID0gdGFibGVzXy0+RmluZEZpbGUobmFtZSk7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OwogICB9CiAgIHJldHVybiBOVUxMOwpAQCAtODg3LDE1ICsxMTkxLDE3IEBACiBjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbCgKICAgICBjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lKSBjb25zdCB7CiAgIE11dGV4TG9ja01heWJlIGxvY2sobXV0ZXhfKTsKKyAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7CisgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKICAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRTeW1ib2woc3ltYm9sX25hbWUpOwogICBpZiAoIXJlc3VsdC5Jc051bGwoKSkgcmV0dXJuIHJlc3VsdC5HZXRGaWxlKCk7CiAgIGlmICh1bmRlcmxheV8gIT0gTlVMTCkgewotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiByZXN1bHQgPQorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX3Jlc3VsdCA9CiAgICAgICB1bmRlcmxheV8tPkZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChzeW1ib2xfbmFtZSk7Ci0gICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OworICAgIGlmIChmaWxlX3Jlc3VsdCAhPSBOVUxMKSByZXR1cm4gZmlsZV9yZXN1bHQ7CiAgIH0KICAgaWYgKFRyeUZpbmRTeW1ib2xJbkZhbGxiYWNrRGF0YWJhc2Uoc3ltYm9sX25hbWUpKSB7Ci0gICAgU3ltYm9sIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRTeW1ib2woc3ltYm9sX25hbWUpOworICAgIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRTeW1ib2woc3ltYm9sX25hbWUpOwogICAgIGlmICghcmVzdWx0LklzTnVsbCgpKSByZXR1cm4gcmVzdWx0LkdldEZpbGUoKTsKICAgfQogICByZXR1cm4gTlVMTDsKQEAgLTkyOSw2ICsxMjM1LDEyIEBACiAgIH0KIH0KIAorY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6RmluZE9uZW9mQnlOYW1lKAorICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0gdGFibGVzXy0+RmluZEJ5TmFtZUhlbHBlcih0aGlzLCBuYW1lKTsKKyAgcmV0dXJuIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6Ok9ORU9GKSA/IHJlc3VsdC5vbmVvZl9kZXNjcmlwdG9yIDogTlVMTDsKK30KKwogY29uc3QgRW51bURlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRW51bVR5cGVCeU5hbWUoCiAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CiAgIFN5bWJvbCByZXN1bHQgPSB0YWJsZXNfLT5GaW5kQnlOYW1lSGVscGVyKHRoaXMsIG5hbWUpOwpAQCAtOTU3LDE3ICsxMjY5LDE4IEBACiBjb25zdCBGaWVsZERlc2NyaXB0b3IqIERlc2NyaXB0b3JQb29sOjpGaW5kRXh0ZW5zaW9uQnlOdW1iZXIoCiAgICAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsIGludCBudW1iZXIpIGNvbnN0IHsKICAgTXV0ZXhMb2NrTWF5YmUgbG9jayhtdXRleF8pOworICB0YWJsZXNfLT5rbm93bl9iYWRfc3ltYm9sc18uY2xlYXIoKTsKKyAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5jbGVhcigpOwogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRFeHRlbnNpb24oZXh0ZW5kZWUsIG51bWJlcik7CiAgIGlmIChyZXN1bHQgIT0gTlVMTCkgewogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KICAgaWYgKHVuZGVybGF5XyAhPSBOVUxMKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPQotICAgICAgdW5kZXJsYXlfLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5kZWUsIG51bWJlcik7CisgICAgcmVzdWx0ID0gdW5kZXJsYXlfLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZXh0ZW5kZWUsIG51bWJlcik7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSByZXR1cm4gcmVzdWx0OwogICB9CiAgIGlmIChUcnlGaW5kRXh0ZW5zaW9uSW5GYWxsYmFja0RhdGFiYXNlKGV4dGVuZGVlLCBudW1iZXIpKSB7Ci0gICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5GaW5kRXh0ZW5zaW9uKGV4dGVuZGVlLCBudW1iZXIpOworICAgIHJlc3VsdCA9IHRhYmxlc18tPkZpbmRFeHRlbnNpb24oZXh0ZW5kZWUsIG51bWJlcik7CiAgICAgaWYgKHJlc3VsdCAhPSBOVUxMKSB7CiAgICAgICByZXR1cm4gcmVzdWx0OwogICAgIH0KQEAgLTk3OCw2ICsxMjkxLDggQEAKIHZvaWQgRGVzY3JpcHRvclBvb2w6OkZpbmRBbGxFeHRlbnNpb25zKAogICAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuZGVlLCB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dCkgY29uc3QgewogICBNdXRleExvY2tNYXliZSBsb2NrKG11dGV4Xyk7CisgIHRhYmxlc18tPmtub3duX2JhZF9zeW1ib2xzXy5jbGVhcigpOworICB0YWJsZXNfLT5rbm93bl9iYWRfZmlsZXNfLmNsZWFyKCk7CiAKICAgLy8gSW5pdGlhbGl6ZSB0YWJsZXNfLT5leHRlbnNpb25zXyBmcm9tIHRoZSBmYWxsYmFjayBkYXRhYmFzZSBmaXJzdAogICAvLyAoYnV0IGRvIHRoaXMgb25seSBvbmNlIHBlciBkZXNjcmlwdG9yKS4KQEAgLTEwMDIsNiArMTMxNyw3IEBACiAgIH0KIH0KIAorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioKQEAgLTEwNDgsNiArMTM2NCwxNyBAQAogICB9CiB9CiAKK2NvbnN0IE9uZW9mRGVzY3JpcHRvcioKK0Rlc2NyaXB0b3I6OkZpbmRPbmVvZkJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgeworICBTeW1ib2wgcmVzdWx0ID0KKyAgICBmaWxlKCktPnRhYmxlc18tPkZpbmROZXN0ZWRTeW1ib2xPZlR5cGUodGhpcywga2V5LCBTeW1ib2w6Ok9ORU9GKTsKKyAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICByZXR1cm4gcmVzdWx0Lm9uZW9mX2Rlc2NyaXB0b3I7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KK30KKwogY29uc3QgRmllbGREZXNjcmlwdG9yKgogRGVzY3JpcHRvcjo6RmluZEV4dGVuc2lvbkJ5TmFtZShjb25zdCBzdHJpbmcmIGtleSkgY29uc3QgewogICBTeW1ib2wgcmVzdWx0ID0KQEAgLTExMzAsNiArMTQ1NywxMSBAQAogICByZXR1cm4gZmlsZSgpLT50YWJsZXNfLT5GaW5kRW51bVZhbHVlQnlOdW1iZXIodGhpcywga2V5KTsKIH0KIAorY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcioKK0VudW1EZXNjcmlwdG9yOjpGaW5kVmFsdWVCeU51bWJlckNyZWF0aW5nSWZVbmtub3duKGludCBrZXkpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGUoKS0+dGFibGVzXy0+RmluZEVudW1WYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24odGhpcywga2V5KTsKK30KKwogY29uc3QgTWV0aG9kRGVzY3JpcHRvcioKIFNlcnZpY2VEZXNjcmlwdG9yOjpGaW5kTWV0aG9kQnlOYW1lKGNvbnN0IHN0cmluZyYga2V5KSBjb25zdCB7CiAgIFN5bWJvbCByZXN1bHQgPQpAQCAtMTIxMiwxNiArMTU0NCwyOSBAQAogICB9CiB9CiAKLWJvb2wgRGVzY3JpcHRvcjo6SXNFeHRlbnNpb25OdW1iZXIoaW50IG51bWJlcikgY29uc3QgeworY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqCitEZXNjcmlwdG9yOjpGaW5kRXh0ZW5zaW9uUmFuZ2VDb250YWluaW5nTnVtYmVyKGludCBudW1iZXIpIGNvbnN0IHsKICAgLy8gTGluZWFyIHNlYXJjaCBzaG91bGQgYmUgZmluZSBiZWNhdXNlIHdlIGRvbid0IGV4cGVjdCBhIG1lc3NhZ2UgdG8gaGF2ZQogICAvLyBtb3JlIHRoYW4gYSBjb3VwbGUgZXh0ZW5zaW9uIHJhbmdlcy4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaSsrKSB7CiAgICAgaWYgKG51bWJlciA+PSBleHRlbnNpb25fcmFuZ2UoaSktPnN0YXJ0ICYmCiAgICAgICAgIG51bWJlciA8ICBleHRlbnNpb25fcmFuZ2UoaSktPmVuZCkgewotICAgICAgcmV0dXJuIHRydWU7CisgICAgICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlKGkpOwogICAgIH0KICAgfQotICByZXR1cm4gZmFsc2U7CisgIHJldHVybiBOVUxMOworfQorCitjb25zdCBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKgorRGVzY3JpcHRvcjo6RmluZFJlc2VydmVkUmFuZ2VDb250YWluaW5nTnVtYmVyKGludCBudW1iZXIpIGNvbnN0IHsKKyAgLy8gVE9ETyhjaHJpc24pOiBDb25zaWRlciBhIG5vbi1saW5lYXIgc2VhcmNoLgorICBmb3IgKGludCBpID0gMDsgaSA8IHJlc2VydmVkX3JhbmdlX2NvdW50KCk7IGkrKykgeworICAgIGlmIChudW1iZXIgPj0gcmVzZXJ2ZWRfcmFuZ2UoaSktPnN0YXJ0ICYmCisgICAgICAgIG51bWJlciA8ICByZXNlcnZlZF9yYW5nZShpKS0+ZW5kKSB7CisgICAgICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgfQorICB9CisgIHJldHVybiBOVUxMOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xMjM3LDI2ICsxNTgyLDY2IEBACiAgICAgdGFibGVzXy0+a25vd25fYmFkX2ZpbGVzXy5pbnNlcnQobmFtZSk7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9Ci0KICAgcmV0dXJuIHRydWU7CiB9CiAKK2Jvb2wgRGVzY3JpcHRvclBvb2w6OklzU3ViU3ltYm9sT2ZCdWlsdFR5cGUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIHN0cmluZyBwcmVmaXggPSBuYW1lOworICBmb3IgKDs7KSB7CisgICAgc3RyaW5nOjpzaXplX3R5cGUgZG90X3BvcyA9IHByZWZpeC5maW5kX2xhc3Rfb2YoJy4nKTsKKyAgICBpZiAoZG90X3BvcyA9PSBzdHJpbmc6Om5wb3MpIHsKKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBwcmVmaXggPSBwcmVmaXguc3Vic3RyKDAsIGRvdF9wb3MpOworICAgIFN5bWJvbCBzeW1ib2wgPSB0YWJsZXNfLT5GaW5kU3ltYm9sKHByZWZpeCk7CisgICAgLy8gSWYgdGhlIHN5bWJvbCB0eXBlIGlzIGFueXRoaW5nIG90aGVyIHRoYW4gUEFDS0FHRSwgdGhlbiBpdHMgY29tcGxldGUKKyAgICAvLyBkZWZpbml0aW9uIGlzIGFscmVhZHkga25vd24uCisgICAgaWYgKCFzeW1ib2wuSXNOdWxsKCkgJiYgc3ltYm9sLnR5cGUgIT0gU3ltYm9sOjpQQUNLQUdFKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgaWYgKHVuZGVybGF5XyAhPSBOVUxMKSB7CisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGFueSBwcmVmaXggb2YgdGhpcyBzeW1ib2wgZXhpc3RzIGluIHRoZSB1bmRlcmxheS4KKyAgICByZXR1cm4gdW5kZXJsYXlfLT5Jc1N1YlN5bWJvbE9mQnVpbHRUeXBlKG5hbWUpOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKwogYm9vbCBEZXNjcmlwdG9yUG9vbDo6VHJ5RmluZFN5bWJvbEluRmFsbGJhY2tEYXRhYmFzZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKICAgaWYgKGZhbGxiYWNrX2RhdGFiYXNlXyA9PSBOVUxMKSByZXR1cm4gZmFsc2U7CiAKKyAgaWYgKHRhYmxlc18tPmtub3duX2JhZF9zeW1ib2xzXy5jb3VudChuYW1lKSA+IDApIHJldHVybiBmYWxzZTsKKwogICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87Ci0gIGlmICghZmFsbGJhY2tfZGF0YWJhc2VfLT5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2wobmFtZSwgJmZpbGVfcHJvdG8pKSB7Ci0gICAgcmV0dXJuIGZhbHNlOwotICB9CisgIGlmICgvLyBXZSBza2lwIGxvb2tpbmcgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIGlmIHRoZSBuYW1lIGlzIGEgc3ViLXN5bWJvbAorICAgICAgLy8gb2YgYW55IGRlc2NyaXB0b3IgdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGVzY3JpcHRvciBwb29sIChleGNlcHQKKyAgICAgIC8vIGZvciBwYWNrYWdlIGRlc2NyaXB0b3JzKS4gIFRoaXMgaXMgdmFsaWQgYmVjYXVzZSBhbGwgc3ltYm9scyBleGNlcHQKKyAgICAgIC8vIGZvciBwYWNrYWdlcyBhcmUgZGVmaW5lZCBpbiBhIHNpbmdsZSBmaWxlLCBzbyBpZiB0aGUgc3ltYm9sIGV4aXN0cworICAgICAgLy8gdGhlbiB3ZSBzaG91bGQgYWxyZWFkeSBoYXZlIGl0cyBkZWZpbml0aW9uLgorICAgICAgLy8KKyAgICAgIC8vIFRoZSBvdGhlciByZWFzb24gdG8gZG8gdGhpcyBpcyB0byBzdXBwb3J0ICJvdmVycmlkaW5nIiB0eXBlCisgICAgICAvLyBkZWZpbml0aW9ucyBieSBtZXJnaW5nIHR3byBkYXRhYmFzZXMgdGhhdCBkZWZpbmUgdGhlIHNhbWUgdHlwZS4gIChZZXMsCisgICAgICAvLyBwZW9wbGUgZG8gdGhpcy4pICBUaGUgbWFpbiBkaWZmaWN1bHR5IHdpdGggbWFraW5nIHRoaXMgd29yayBpcyB0aGF0CisgICAgICAvLyBGaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woKSBpcyBhbGxvd2VkIHRvIHJldHVybiBib3RoIGZhbHNlIHBvc2l0aXZlcworICAgICAgLy8gKGUuZy4sIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSwgVXBncmFkZWREZXNjcmlwdG9yRGF0YWJhc2UpIGFuZCBmYWxzZQorICAgICAgLy8gbmVnYXRpdmVzIChlLmcuIFByb3RvRmlsZVBhcnNlciwgU291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSkuCisgICAgICAvLyBXaGVuIHR3byBzdWNoIGRhdGFiYXNlcyBhcmUgbWVyZ2VkLCBsb29raW5nIHVwIGEgbm9uLWV4aXN0ZW50CisgICAgICAvLyBzdWItc3ltYm9sIG9mIGEgdHlwZSB0aGF0IGFscmVhZHkgZXhpc3RzIGluIHRoZSBkZXNjcmlwdG9yIHBvb2wgY2FuCisgICAgICAvLyByZXN1bHQgaW4gYW4gYXR0ZW1wdCB0byBsb2FkIG11bHRpcGxlIGRlZmluaXRpb25zIG9mIHRoZSBzYW1lIHR5cGUuCisgICAgICAvLyBUaGUgY2hlY2sgYmVsb3cgYXZvaWRzIHRoaXMuCisgICAgICBJc1N1YlN5bWJvbE9mQnVpbHRUeXBlKG5hbWUpCiAKLSAgaWYgKHRhYmxlc18tPkZpbmRGaWxlKGZpbGVfcHJvdG8ubmFtZSgpKSAhPSBOVUxMKSB7Ci0gICAgLy8gV2UndmUgYWxyZWFkeSBsb2FkZWQgdGhpcyBmaWxlLCBhbmQgaXQgYXBwYXJlbnRseSBkb2Vzbid0IGNvbnRhaW4gdGhlCi0gICAgLy8gc3ltYm9sIHdlJ3JlIGxvb2tpbmcgZm9yLiAgU29tZSBEZXNjcmlwdG9yRGF0YWJhc2VzIHJldHVybiBmYWxzZQotICAgIC8vIHBvc2l0aXZlcy4KLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KKyAgICAgIC8vIExvb2sgdXAgZmlsZSBjb250YWluaW5nIHRoaXMgc3ltYm9sIGluIGZhbGxiYWNrIGRhdGFiYXNlLgorICAgICAgfHwgIWZhbGxiYWNrX2RhdGFiYXNlXy0+RmluZEZpbGVDb250YWluaW5nU3ltYm9sKG5hbWUsICZmaWxlX3Byb3RvKQogCi0gIGlmIChCdWlsZEZpbGVGcm9tRGF0YWJhc2UoZmlsZV9wcm90bykgPT0gTlVMTCkgeworICAgICAgLy8gQ2hlY2sgaWYgd2UndmUgYWxyZWFkeSBidWlsdCB0aGlzIGZpbGUuIElmIHNvLCBpdCBhcHBhcmVudGx5IGRvZXNuJ3QKKyAgICAgIC8vIGNvbnRhaW4gdGhlIHN5bWJvbCB3ZSdyZSBsb29raW5nIGZvci4gIFNvbWUgRGVzY3JpcHRvckRhdGFiYXNlcworICAgICAgLy8gcmV0dXJuIGZhbHNlIHBvc2l0aXZlcy4KKyAgICAgIHx8IHRhYmxlc18tPkZpbmRGaWxlKGZpbGVfcHJvdG8ubmFtZSgpKSAhPSBOVUxMCisKKyAgICAgIC8vIEJ1aWxkIHRoZSBmaWxlLgorICAgICAgfHwgQnVpbGRGaWxlRnJvbURhdGFiYXNlKGZpbGVfcHJvdG8pID09IE5VTEwpIHsKKyAgICB0YWJsZXNfLT5rbm93bl9iYWRfc3ltYm9sc18uaW5zZXJ0KG5hbWUpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogCkBAIC0xMjg5LDYgKzE2NzQsMTAgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitib29sIEZpZWxkRGVzY3JpcHRvcjo6aXNfbWFwKCkgY29uc3QgeworICByZXR1cm4gdHlwZSgpID09IFRZUEVfTUVTU0FHRSAmJiBtZXNzYWdlX3R5cGUoKS0+b3B0aW9ucygpLm1hcF9lbnRyeSgpOworfQorCiBzdHJpbmcgRmllbGREZXNjcmlwdG9yOjpEZWZhdWx0VmFsdWVBc1N0cmluZyhib29sIHF1b3RlX3N0cmluZ190eXBlKSBjb25zdCB7CiAgIEdPT0dMRV9DSEVDSyhoYXNfZGVmYXVsdF92YWx1ZSgpKSA8PCAiTm8gZGVmYXVsdCB2YWx1ZSI7CiAgIHN3aXRjaCAoY3BwX3R5cGUoKSkgewpAQCAtMTM0MCwxMSArMTcyOSwyMSBAQAogdm9pZCBGaWxlRGVzY3JpcHRvcjo6Q29weVRvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CiAgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwogICBpZiAoIXBhY2thZ2UoKS5lbXB0eSgpKSBwcm90by0+c2V0X3BhY2thZ2UocGFja2FnZSgpKTsKKyAgLy8gVE9ETyhsaXVqaXNpKTogQWxzbyBwb3B1bGF0ZSB3aGVuIHN5bnRheD0icHJvdG8yIi4KKyAgaWYgKHN5bnRheCgpID09IFNZTlRBWF9QUk9UTzMpIHByb3RvLT5zZXRfc3ludGF4KFN5bnRheE5hbWUoc3ludGF4KCkpKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CiAgICAgcHJvdG8tPmFkZF9kZXBlbmRlbmN5KGRlcGVuZGVuY3koaSktPm5hbWUoKSk7CiAgIH0KIAorICBmb3IgKGludCBpID0gMDsgaSA8IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCk7IGkrKykgeworICAgIHByb3RvLT5hZGRfcHVibGljX2RlcGVuZGVuY3kocHVibGljX2RlcGVuZGVuY2llc19baV0pOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB3ZWFrX2RlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgcHJvdG8tPmFkZF93ZWFrX2RlcGVuZGVuY3kod2Vha19kZXBlbmRlbmNpZXNfW2ldKTsKKyAgfQorCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgewogICAgIG1lc3NhZ2VfdHlwZShpKS0+Q29weVRvKHByb3RvLT5hZGRfbWVzc2FnZV90eXBlKCkpOwogICB9CkBAIC0xMzYzLDEyICsxNzYyLDM2IEBACiAgIH0KIH0KIAordm9pZCBGaWxlRGVzY3JpcHRvcjo6Q29weUpzb25OYW1lVG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgaWYgKG1lc3NhZ2VfdHlwZV9jb3VudCgpICE9IHByb3RvLT5tZXNzYWdlX3R5cGVfc2l6ZSgpIHx8CisgICAgICBleHRlbnNpb25fY291bnQoKSAhPSBwcm90by0+ZXh0ZW5zaW9uX3NpemUoKSkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJDYW5ub3QgY29weSBqc29uX25hbWUgdG8gYSBwcm90byBvZiBhIGRpZmZlcmVudCBzaXplLiI7CisgICAgcmV0dXJuOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZV90eXBlX2NvdW50KCk7IGkrKykgeworICAgIG1lc3NhZ2VfdHlwZShpKS0+Q29weUpzb25OYW1lVG8ocHJvdG8tPm11dGFibGVfbWVzc2FnZV90eXBlKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb24oaSktPkNvcHlKc29uTmFtZVRvKHByb3RvLT5tdXRhYmxlX2V4dGVuc2lvbihpKSk7CisgIH0KK30KKwordm9pZCBGaWxlRGVzY3JpcHRvcjo6Q29weVNvdXJjZUNvZGVJbmZvVG8oRmlsZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgaWYgKHNvdXJjZV9jb2RlX2luZm9fICYmCisgICAgICBzb3VyY2VfY29kZV9pbmZvXyAhPSAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSkgeworICAgIHByb3RvLT5tdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKS0+Q29weUZyb20oKnNvdXJjZV9jb2RlX2luZm9fKTsKKyAgfQorfQorCiB2b2lkIERlc2NyaXB0b3I6OkNvcHlUbyhEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CiAgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgZmllbGQoaSktPkNvcHlUbyhwcm90by0+YWRkX2ZpZWxkKCkpOwogICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgb25lb2ZfZGVjbF9jb3VudCgpOyBpKyspIHsKKyAgICBvbmVvZl9kZWNsKGkpLT5Db3B5VG8ocHJvdG8tPmFkZF9vbmVvZl9kZWNsKCkpOworICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CiAgICAgbmVzdGVkX3R5cGUoaSktPkNvcHlUbyhwcm90by0+YWRkX25lc3RlZF90eXBlKCkpOwogICB9CkBAIC0xMzgzLDE1ICsxODA2LDQ0IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewogICAgIGV4dGVuc2lvbihpKS0+Q29weVRvKHByb3RvLT5hZGRfZXh0ZW5zaW9uKCkpOwogICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKTsgaSsrKSB7CisgICAgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlKiByYW5nZSA9IHByb3RvLT5hZGRfcmVzZXJ2ZWRfcmFuZ2UoKTsKKyAgICByYW5nZS0+c2V0X3N0YXJ0KHJlc2VydmVkX3JhbmdlKGkpLT5zdGFydCk7CisgICAgcmFuZ2UtPnNldF9lbmQocmVzZXJ2ZWRfcmFuZ2UoaSktPmVuZCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9uYW1lX2NvdW50KCk7IGkrKykgeworICAgIHByb3RvLT5hZGRfcmVzZXJ2ZWRfbmFtZShyZXNlcnZlZF9uYW1lKGkpKTsKKyAgfQogCiAgIGlmICgmb3B0aW9ucygpICE9ICZNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CiAgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOwogICB9CiB9CiAKK3ZvaWQgRGVzY3JpcHRvcjo6Q29weUpzb25OYW1lVG8oRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBpZiAoZmllbGRfY291bnQoKSAhPSBwcm90by0+ZmllbGRfc2l6ZSgpIHx8CisgICAgICBuZXN0ZWRfdHlwZV9jb3VudCgpICE9IHByb3RvLT5uZXN0ZWRfdHlwZV9zaXplKCkgfHwKKyAgICAgIGV4dGVuc2lvbl9jb3VudCgpICE9IHByb3RvLT5leHRlbnNpb25fc2l6ZSgpKSB7CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkNhbm5vdCBjb3B5IGpzb25fbmFtZSB0byBhIHByb3RvIG9mIGEgZGlmZmVyZW50IHNpemUuIjsKKyAgICByZXR1cm47CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZChpKS0+Q29weUpzb25OYW1lVG8ocHJvdG8tPm11dGFibGVfZmllbGQoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkX3R5cGVfY291bnQoKTsgaSsrKSB7CisgICAgbmVzdGVkX3R5cGUoaSktPkNvcHlKc29uTmFtZVRvKHByb3RvLT5tdXRhYmxlX25lc3RlZF90eXBlKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9jb3VudCgpOyBpKyspIHsKKyAgICBleHRlbnNpb24oaSktPkNvcHlKc29uTmFtZVRvKHByb3RvLT5tdXRhYmxlX2V4dGVuc2lvbihpKSk7CisgIH0KK30KKwogdm9pZCBGaWVsZERlc2NyaXB0b3I6OkNvcHlUbyhGaWVsZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKICAgcHJvdG8tPnNldF9uYW1lKG5hbWUoKSk7CiAgIHByb3RvLT5zZXRfbnVtYmVyKG51bWJlcigpKTsKKyAgaWYgKGhhc19qc29uX25hbWVfKSB7CisgICAgcHJvdG8tPnNldF9qc29uX25hbWUoanNvbl9uYW1lKCkpOworICB9CiAKICAgLy8gU29tZSBjb21waWxlcnMgZG8gbm90IGFsbG93IHN0YXRpY19jYXN0IGRpcmVjdGx5IGJldHdlZW4gdHdvIGVudW0gdHlwZXMsCiAgIC8vIHNvIHdlIG11c3QgY2FzdCB0byBpbnQgZmlyc3QuCkBAIC0xNDI5LDExICsxODgxLDIzIEBACiAgICAgcHJvdG8tPnNldF9kZWZhdWx0X3ZhbHVlKERlZmF1bHRWYWx1ZUFzU3RyaW5nKGZhbHNlKSk7CiAgIH0KIAorICBpZiAoY29udGFpbmluZ19vbmVvZigpICE9IE5VTEwgJiYgIWlzX2V4dGVuc2lvbigpKSB7CisgICAgcHJvdG8tPnNldF9vbmVvZl9pbmRleChjb250YWluaW5nX29uZW9mKCktPmluZGV4KCkpOworICB9CisKICAgaWYgKCZvcHRpb25zKCkgIT0gJkZpZWxkT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKSB7CiAgICAgcHJvdG8tPm11dGFibGVfb3B0aW9ucygpLT5Db3B5RnJvbShvcHRpb25zKCkpOwogICB9CiB9CiAKK3ZvaWQgRmllbGREZXNjcmlwdG9yOjpDb3B5SnNvbk5hbWVUbyhGaWVsZERlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0IHsKKyAgcHJvdG8tPnNldF9qc29uX25hbWUoanNvbl9uYW1lKCkpOworfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvcjo6Q29weVRvKE9uZW9mRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3QgeworICBwcm90by0+c2V0X25hbWUobmFtZSgpKTsKK30KKwogdm9pZCBFbnVtRGVzY3JpcHRvcjo6Q29weVRvKEVudW1EZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdCB7CiAgIHByb3RvLT5zZXRfbmFtZShuYW1lKCkpOwogCkBAIC0xNDgzLDYgKzE5NDcsMTMgQEAKICAgaWYgKCZvcHRpb25zKCkgIT0gJk1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSkgewogICAgIHByb3RvLT5tdXRhYmxlX29wdGlvbnMoKS0+Q29weUZyb20ob3B0aW9ucygpKTsKICAgfQorCisgIGlmIChjbGllbnRfc3RyZWFtaW5nXykgeworICAgIHByb3RvLT5zZXRfY2xpZW50X3N0cmVhbWluZyh0cnVlKTsKKyAgfQorICBpZiAoc2VydmVyX3N0cmVhbWluZ18pIHsKKyAgICBwcm90by0+c2V0X3NlcnZlcl9zdHJlYW1pbmcodHJ1ZSk7CisgIH0KIH0KIAogLy8gRGVidWdTdHJpbmcgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTQ5MCwxNiArMTk2MSwxNCBAQAogbmFtZXNwYWNlIHsKIAogLy8gVXNlZCBieSBlYWNoIG9mIHRoZSBvcHRpb24gZm9ybWF0dGVycy4KLWJvb2wgUmV0cmlldmVPcHRpb25zKGNvbnN0IE1lc3NhZ2UgJm9wdGlvbnMsIHZlY3RvcjxzdHJpbmc+ICpvcHRpb25fZW50cmllcykgeworYm9vbCBSZXRyaWV2ZU9wdGlvbnMoaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSAmb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+ICpvcHRpb25fZW50cmllcykgewogICBvcHRpb25fZW50cmllcy0+Y2xlYXIoKTsKICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG9wdGlvbnMuR2V0UmVmbGVjdGlvbigpOwogICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOwogICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG9wdGlvbnMsICZmaWVsZHMpOwogICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewotICAgIC8vIERvZXNuJ3QgbWFrZSBzZW5zZSB0byBoYXZlIG1lc3NhZ2UgdHlwZSBmaWVsZHMgaGVyZQotICAgIGlmIChmaWVsZHNbaV0tPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICAgIGNvbnRpbnVlOwotICAgIH0KICAgICBpbnQgY291bnQgPSAxOwogICAgIGJvb2wgcmVwZWF0ZWQgPSBmYWxzZTsKICAgICBpZiAoZmllbGRzW2ldLT5pc19yZXBlYXRlZCgpKSB7CkBAIC0xNTA4LDkgKzE5NzcsMjcgQEAKICAgICB9CiAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgaisrKSB7CiAgICAgICBzdHJpbmcgZmllbGR2YWw7Ci0gICAgICBUZXh0Rm9ybWF0OjpQcmludEZpZWxkVmFsdWVUb1N0cmluZyhvcHRpb25zLCBmaWVsZHNbaV0sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBlYXRlZCA/IGNvdW50IDogLTEsICZmaWVsZHZhbCk7Ci0gICAgICBvcHRpb25fZW50cmllcy0+cHVzaF9iYWNrKGZpZWxkc1tpXS0+bmFtZSgpICsgIiA9ICIgKyBmaWVsZHZhbCk7CisgICAgICBpZiAoZmllbGRzW2ldLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAgIHN0cmluZyB0bXA7CisgICAgICAgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgICAgICAgcHJpbnRlci5TZXRJbml0aWFsSW5kZW50TGV2ZWwoZGVwdGggKyAxKTsKKyAgICAgICAgcHJpbnRlci5QcmludEZpZWxkVmFsdWVUb1N0cmluZyhvcHRpb25zLCBmaWVsZHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwZWF0ZWQgPyBqIDogLTEsICZ0bXApOworICAgICAgICBmaWVsZHZhbC5hcHBlbmQoIntcbiIpOworICAgICAgICBmaWVsZHZhbC5hcHBlbmQodG1wKTsKKyAgICAgICAgZmllbGR2YWwuYXBwZW5kKGRlcHRoICogMiwgJyAnKTsKKyAgICAgICAgZmllbGR2YWwuYXBwZW5kKCJ9Iik7CisgICAgICB9IGVsc2UgeworICAgICAgICBUZXh0Rm9ybWF0OjpQcmludEZpZWxkVmFsdWVUb1N0cmluZyhvcHRpb25zLCBmaWVsZHNbaV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcGVhdGVkID8gaiA6IC0xLCAmZmllbGR2YWwpOworICAgICAgfQorICAgICAgc3RyaW5nIG5hbWU7CisgICAgICBpZiAoZmllbGRzW2ldLT5pc19leHRlbnNpb24oKSkgeworICAgICAgICBuYW1lID0gIiguIiArIGZpZWxkc1tpXS0+ZnVsbF9uYW1lKCkgKyAiKSI7CisgICAgICB9IGVsc2UgeworICAgICAgICBuYW1lID0gZmllbGRzW2ldLT5uYW1lKCk7CisgICAgICB9CisgICAgICBvcHRpb25fZW50cmllcy0+cHVzaF9iYWNrKG5hbWUgKyAiID0gIiArIGZpZWxkdmFsKTsKICAgICB9CiAgIH0KICAgcmV0dXJuICFvcHRpb25fZW50cmllcy0+ZW1wdHkoKTsKQEAgLTE1MTgsMTAgKzIwMDUsMTAgQEAKIAogLy8gRm9ybWF0cyBvcHRpb25zIHRoYXQgYWxsIGFwcGVhciB0b2dldGhlciBpbiBicmFja2V0cy4gRG9lcyBub3QgaW5jbHVkZQogLy8gYnJhY2tldHMuCi1ib29sIEZvcm1hdEJyYWNrZXRlZE9wdGlvbnMoY29uc3QgTWVzc2FnZSAmb3B0aW9ucywgc3RyaW5nICpvdXRwdXQpIHsKK2Jvb2wgRm9ybWF0QnJhY2tldGVkT3B0aW9ucyhpbnQgZGVwdGgsIGNvbnN0IE1lc3NhZ2UgJm9wdGlvbnMsIHN0cmluZyAqb3V0cHV0KSB7CiAgIHZlY3RvcjxzdHJpbmc+IGFsbF9vcHRpb25zOwotICBpZiAoUmV0cmlldmVPcHRpb25zKG9wdGlvbnMsICZhbGxfb3B0aW9ucykpIHsKLSAgICBvdXRwdXQtPmFwcGVuZChKb2luU3RyaW5ncyhhbGxfb3B0aW9ucywgIiwgIikpOworICBpZiAoUmV0cmlldmVPcHRpb25zKGRlcHRoLCBvcHRpb25zLCAmYWxsX29wdGlvbnMpKSB7CisgICAgb3V0cHV0LT5hcHBlbmQoSm9pbihhbGxfb3B0aW9ucywgIiwgIikpOwogICB9CiAgIHJldHVybiAhYWxsX29wdGlvbnMuZW1wdHkoKTsKIH0KQEAgLTE1MzAsNyArMjAxNyw3IEBACiBib29sIEZvcm1hdExpbmVPcHRpb25zKGludCBkZXB0aCwgY29uc3QgTWVzc2FnZSAmb3B0aW9ucywgc3RyaW5nICpvdXRwdXQpIHsKICAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CiAgIHZlY3RvcjxzdHJpbmc+IGFsbF9vcHRpb25zOwotICBpZiAoUmV0cmlldmVPcHRpb25zKG9wdGlvbnMsICZhbGxfb3B0aW9ucykpIHsKKyAgaWYgKFJldHJpZXZlT3B0aW9ucyhkZXB0aCwgb3B0aW9ucywgJmFsbF9vcHRpb25zKSkgewogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsX29wdGlvbnMuc2l6ZSgpOyBpKyspIHsKICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQob3V0cHV0LCAiJDBvcHRpb24gJDE7XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIGFsbF9vcHRpb25zW2ldKTsKQEAgLTE1MzksMTggKzIwMjYsMTIyIEBACiAgIHJldHVybiAhYWxsX29wdGlvbnMuZW1wdHkoKTsKIH0KIAorY2xhc3MgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlciB7CisgcHVibGljOgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBEZXNjVHlwZT4KKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcihjb25zdCBEZXNjVHlwZSogZGVzYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHByZWZpeCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpCisgICAgICA6IG9wdGlvbnNfKG9wdGlvbnMpLCBwcmVmaXhfKHByZWZpeCkgeworICAgIC8vIFBlcmZvcm0gdGhlIFNvdXJjZUxvY2F0aW9uIGxvb2t1cCBvbmx5IGlmIHdlJ3JlIGluY2x1ZGluZyB1c2VyIGNvbW1lbnRzLAorICAgIC8vIGJlY2F1c2UgdGhlIGxvb2t1cCBpcyBmYWlybHkgZXhwZW5zaXZlLgorICAgIGhhdmVfc291cmNlX2xvY18gPSBvcHRpb25zLmluY2x1ZGVfY29tbWVudHMgJiYKKyAgICAgICAgZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJnNvdXJjZV9sb2NfKTsKKyAgfQorICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3RvcjxpbnQ+JiBwYXRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcHJlZml4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykKKyAgICAgIDogb3B0aW9uc18ob3B0aW9ucyksIHByZWZpeF8ocHJlZml4KSB7CisgICAgLy8gUGVyZm9ybSB0aGUgU291cmNlTG9jYXRpb24gbG9va3VwIG9ubHkgaWYgd2UncmUgaW5jbHVkaW5nIHVzZXIgY29tbWVudHMsCisgICAgLy8gYmVjYXVzZSB0aGUgbG9va3VwIGlzIGZhaXJseSBleHBlbnNpdmUuCisgICAgaGF2ZV9zb3VyY2VfbG9jXyA9IG9wdGlvbnMuaW5jbHVkZV9jb21tZW50cyAmJgorICAgICAgICBmaWxlLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCAmc291cmNlX2xvY18pOworICB9CisgIHZvaWQgQWRkUHJlQ29tbWVudChzdHJpbmcqIG91dHB1dCkgeworICAgIGlmIChoYXZlX3NvdXJjZV9sb2NfKSB7CisgICAgICAvLyBEZXRhY2hlZCBsZWFkaW5nIGNvbW1lbnRzLgorICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgc291cmNlX2xvY18ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cy5zaXplKCk7ICsraSkgeworICAgICAgICAqb3V0cHV0ICs9IEZvcm1hdENvbW1lbnQoc291cmNlX2xvY18ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50c1tpXSk7CisgICAgICAgICpvdXRwdXQgKz0gIlxuIjsKKyAgICAgIH0KKyAgICAgIC8vIEF0dGFjaGVkIGxlYWRpbmcgY29tbWVudHMuCisgICAgICBpZiAoIXNvdXJjZV9sb2NfLmxlYWRpbmdfY29tbWVudHMuZW1wdHkoKSkgeworICAgICAgICAqb3V0cHV0ICs9IEZvcm1hdENvbW1lbnQoc291cmNlX2xvY18ubGVhZGluZ19jb21tZW50cyk7CisgICAgICB9CisgICAgfQorICB9CisgIHZvaWQgQWRkUG9zdENvbW1lbnQoc3RyaW5nKiBvdXRwdXQpIHsKKyAgICBpZiAoaGF2ZV9zb3VyY2VfbG9jXyAmJiBzb3VyY2VfbG9jXy50cmFpbGluZ19jb21tZW50cy5zaXplKCkgPiAwKSB7CisgICAgICAqb3V0cHV0ICs9IEZvcm1hdENvbW1lbnQoc291cmNlX2xvY18udHJhaWxpbmdfY29tbWVudHMpOworICAgIH0KKyAgfQorCisgIC8vIEZvcm1hdCBjb21tZW50IHN1Y2ggdGhhdCBlYWNoIGxpbmUgYmVjb21lcyBhIGZ1bGwtbGluZSBDKystc3R5bGUgY29tbWVudCBpbgorICAvLyB0aGUgRGVidWdTdHJpbmcoKSBvdXRwdXQuCisgIHN0cmluZyBGb3JtYXRDb21tZW50KGNvbnN0IHN0cmluZyYgY29tbWVudF90ZXh0KSB7CisgICAgc3RyaW5nIHN0cmlwcGVkX2NvbW1lbnQgPSBjb21tZW50X3RleHQ7CisgICAgU3RyaXBXaGl0ZXNwYWNlKCZzdHJpcHBlZF9jb21tZW50KTsKKyAgICB2ZWN0b3I8c3RyaW5nPiBsaW5lcyA9IFNwbGl0KHN0cmlwcGVkX2NvbW1lbnQsICJcbiIpOworICAgIHN0cmluZyBvdXRwdXQ7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBsaW5lcy5zaXplKCk7ICsraSkgeworICAgICAgY29uc3Qgc3RyaW5nJiBsaW5lID0gbGluZXNbaV07CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZvdXRwdXQsICIkMC8vICQxXG4iLCBwcmVmaXhfLCBsaW5lKTsKKyAgICB9CisgICAgcmV0dXJuIG91dHB1dDsKKyAgfQorCisgcHJpdmF0ZToKKworICBib29sIGhhdmVfc291cmNlX2xvY187CisgIFNvdXJjZUxvY2F0aW9uIHNvdXJjZV9sb2NfOworICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uc187CisgIHN0cmluZyBwcmVmaXhfOworfTsKKwogfSAgLy8gYW5vbnltb3VzIG5hbWVzcGFjZQogCiBzdHJpbmcgRmlsZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgewotICBzdHJpbmcgY29udGVudHMgPSAic3ludGF4ID0gXCJwcm90bzJcIjtcblxuIjsKKyAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnM7ICAvLyBkZWZhdWx0IG9wdGlvbnMKKyAgcmV0dXJuIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7Cit9CisKK3N0cmluZyBGaWxlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIGRlYnVnX3N0cmluZ19vcHRpb25zKSBjb25zdCB7CisgIHN0cmluZyBjb250ZW50czsKKyAgeworICAgIHZlY3RvcjxpbnQ+IHBhdGg7CisgICAgcGF0aC5wdXNoX2JhY2soRmlsZURlc2NyaXB0b3JQcm90bzo6a1N5bnRheEZpZWxkTnVtYmVyKTsKKyAgICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyIHN5bnRheF9jb21tZW50KAorICAgICAgICB0aGlzLCBwYXRoLCAiIiwgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICAgIHN5bnRheF9jb21tZW50LkFkZFByZUNvbW1lbnQoJmNvbnRlbnRzKTsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgInN5bnRheCA9IFwiJDBcIjtcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN5bnRheE5hbWUoc3ludGF4KCkpKTsKKyAgICBzeW50YXhfY29tbWVudC5BZGRQb3N0Q29tbWVudCgmY29udGVudHMpOworICB9CisKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgorICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsICIiLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KCZjb250ZW50cyk7CisKKyAgc2V0PGludD4gcHVibGljX2RlcGVuZGVuY2llczsKKyAgc2V0PGludD4gd2Vha19kZXBlbmRlbmNpZXM7CisgIHB1YmxpY19kZXBlbmRlbmNpZXMuaW5zZXJ0KHB1YmxpY19kZXBlbmRlbmNpZXNfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdWJsaWNfZGVwZW5kZW5jaWVzXyArIHB1YmxpY19kZXBlbmRlbmN5X2NvdW50Xyk7CisgIHdlYWtfZGVwZW5kZW5jaWVzLmluc2VydCh3ZWFrX2RlcGVuZGVuY2llc18sCisgICAgICAgICAgICAgICAgICAgICAgICAgICB3ZWFrX2RlcGVuZGVuY2llc18gKyB3ZWFrX2RlcGVuZGVuY3lfY291bnRfKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgXCIkMFwiO1xuIiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlcGVuZGVuY3koaSktPm5hbWUoKSk7CisgICAgaWYgKHB1YmxpY19kZXBlbmRlbmNpZXMuY291bnQoaSkgPiAwKSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgImltcG9ydCBwdWJsaWMgXCIkMFwiO1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVwZW5kZW5jeShpKS0+bmFtZSgpKTsKKyAgICB9IGVsc2UgaWYgKHdlYWtfZGVwZW5kZW5jaWVzLmNvdW50KGkpID4gMCkgeworICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJpbXBvcnQgd2VhayBcIiQwXCI7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgIH0gZWxzZSB7CisgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKCZjb250ZW50cywgImltcG9ydCBcIiQwXCI7XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXBlbmRlbmN5KGkpLT5uYW1lKCkpOworICAgIH0KICAgfQogCiAgIGlmICghcGFja2FnZSgpLmVtcHR5KCkpIHsKKyAgICB2ZWN0b3I8aW50PiBwYXRoOworICAgIHBhdGgucHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQYWNrYWdlRmllbGROdW1iZXIpOworICAgIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIgcGFja2FnZV9jb21tZW50KAorICAgICAgICB0aGlzLCBwYXRoLCAiIiwgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICAgIHBhY2thZ2VfY29tbWVudC5BZGRQcmVDb21tZW50KCZjb250ZW50cyk7CiAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJwYWNrYWdlICQwO1xuXG4iLCBwYWNrYWdlKCkpOworICAgIHBhY2thZ2VfY29tbWVudC5BZGRQb3N0Q29tbWVudCgmY29udGVudHMpOwogICB9CiAKICAgaWYgKEZvcm1hdExpbmVPcHRpb25zKDAsIG9wdGlvbnMoKSwgJmNvbnRlbnRzKSkgewpAQCAtMTU1OCw3ICsyMTQ5LDcgQEAKICAgfQogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX2NvdW50KCk7IGkrKykgewotICAgIGVudW1fdHlwZShpKS0+RGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgICBlbnVtX3R5cGUoaSktPkRlYnVnU3RyaW5nKDAsICZjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMpOwogICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsKICAgfQogCkBAIC0xNTczLDE1ICsyMTY0LDE0IEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlX3R5cGVfY291bnQoKTsgaSsrKSB7CiAgICAgaWYgKGdyb3Vwcy5jb3VudChtZXNzYWdlX3R5cGUoaSkpID09IDApIHsKLSAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoJmNvbnRlbnRzLCAibWVzc2FnZSAkMCIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfdHlwZShpKS0+bmFtZSgpKTsKLSAgICAgIG1lc3NhZ2VfdHlwZShpKS0+RGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgICAgIG1lc3NhZ2VfdHlwZShpKS0+RGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jbHVkZV9vcGVuaW5nX2NsYXVzZSAqLyB0cnVlKTsKICAgICAgIGNvbnRlbnRzLmFwcGVuZCgiXG4iKTsKICAgICB9CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IHNlcnZpY2VfY291bnQoKTsgaSsrKSB7Ci0gICAgc2VydmljZShpKS0+RGVidWdTdHJpbmcoJmNvbnRlbnRzKTsKKyAgICBzZXJ2aWNlKGkpLT5EZWJ1Z1N0cmluZygmY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKICAgICBjb250ZW50cy5hcHBlbmQoIlxuIik7CiAgIH0KIApAQCAtMTU5MywyMyArMjE4Myw0NiBAQAogICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJleHRlbmQgLiQwIHtcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZS0+ZnVsbF9uYW1lKCkpOwogICAgIH0KLSAgICBleHRlbnNpb24oaSktPkRlYnVnU3RyaW5nKDEsICZjb250ZW50cyk7CisgICAgZXh0ZW5zaW9uKGkpLT5EZWJ1Z1N0cmluZygxLCBGaWVsZERlc2NyaXB0b3I6OlBSSU5UX0xBQkVMLCAmY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CiAgIH0KICAgaWYgKGV4dGVuc2lvbl9jb3VudCgpID4gMCkgY29udGVudHMuYXBwZW5kKCJ9XG5cbiIpOwogCisgIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudCgmY29udGVudHMpOworCiAgIHJldHVybiBjb250ZW50czsKIH0KIAogc3RyaW5nIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgb3B0aW9ucworICByZXR1cm4gRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhvcHRpb25zKTsKK30KKworc3RyaW5nIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCisgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdCB7CiAgIHN0cmluZyBjb250ZW50czsKLSAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgmY29udGVudHMsICJtZXNzYWdlICQwIiwgbmFtZSgpKTsKLSAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBvcHRpb25zLCAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIHRydWUpOwogICByZXR1cm4gY29udGVudHM7CiB9CiAKLXZvaWQgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdCB7Cit2b2lkIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpbmNsdWRlX29wZW5pbmdfY2xhdXNlKSBjb25zdCB7CisgIGlmIChvcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAvLyBEbyBub3QgZ2VuZXJhdGUgZGVidWcgc3RyaW5nIGZvciBhdXRvLWdlbmVyYXRlZCBtYXAtZW50cnkgdHlwZS4KKyAgICByZXR1cm47CisgIH0KICAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CiAgICsrZGVwdGg7CisKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgorICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7CisKKyAgaWYgKGluY2x1ZGVfb3BlbmluZ19jbGF1c2UpIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDBtZXNzYWdlICQxIiwgcHJlZml4LCBuYW1lKCkpOworICB9CiAgIGNvbnRlbnRzLT5hcHBlbmQoIiB7XG4iKTsKIAogICBGb3JtYXRMaW5lT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCBjb250ZW50cyk7CkBAIC0xNjMxLDE2ICsyMjQ0LDIyIEBACiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZXN0ZWRfdHlwZV9jb3VudCgpOyBpKyspIHsKICAgICBpZiAoZ3JvdXBzLmNvdW50KG5lc3RlZF90eXBlKGkpKSA9PSAwKSB7Ci0gICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIG1lc3NhZ2UgJDEiLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIG5lc3RlZF90eXBlKGkpLT5uYW1lKCkpOwotICAgICAgbmVzdGVkX3R5cGUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cyk7CisgICAgICBuZXN0ZWRfdHlwZShpKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBpbmNsdWRlX29wZW5pbmdfY2xhdXNlICovIHRydWUpOwogICAgIH0KICAgfQogICBmb3IgKGludCBpID0gMDsgaSA8IGVudW1fdHlwZV9jb3VudCgpOyBpKyspIHsKLSAgICBlbnVtX3R5cGUoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cyk7CisgICAgZW51bV90eXBlKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKICAgfQogICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGZpZWxkKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMpOworICAgIGlmIChmaWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwpIHsKKyAgICAgIGZpZWxkKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgRmllbGREZXNjcmlwdG9yOjpQUklOVF9MQUJFTCwgY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICAgIH0gZWxzZSBpZiAoZmllbGQoaSktPmNvbnRhaW5pbmdfb25lb2YoKS0+ZmllbGQoMCkgPT0gZmllbGQoaSkpIHsKKyAgICAgIC8vIFRoaXMgaXMgdGhlIGZpcnN0IGZpZWxkIGluIHRoaXMgb25lb2YsIHNvIHByaW50IHRoZSB3aG9sZSBvbmVvZi4KKyAgICAgIGZpZWxkKGkpLT5jb250YWluaW5nX29uZW9mKCktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKyAgICB9CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBpKyspIHsKQEAgLTE2NTksMTUgKzIyNzgsNDcgQEAKICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgZXh0ZW5kIC4kMSB7XG4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIGNvbnRhaW5pbmdfdHlwZS0+ZnVsbF9uYW1lKCkpOwogICAgIH0KLSAgICBleHRlbnNpb24oaSktPkRlYnVnU3RyaW5nKGRlcHRoICsgMSwgY29udGVudHMpOworICAgIGV4dGVuc2lvbihpKS0+RGVidWdTdHJpbmcoCisgICAgICAgIGRlcHRoICsgMSwgRmllbGREZXNjcmlwdG9yOjpQUklOVF9MQUJFTCwgY29udGVudHMsCisgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKICAgfQogICBpZiAoZXh0ZW5zaW9uX2NvdW50KCkgPiAwKQogICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCAgfVxuIiwgcHJlZml4KTsKIAorICBpZiAocmVzZXJ2ZWRfcmFuZ2VfY291bnQoKSA+IDApIHsKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDAgIHJlc2VydmVkICIsIHByZWZpeCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9yYW5nZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqIHJhbmdlID0gcmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgICBpZiAocmFuZ2UtPmVuZCA9PSByYW5nZS0+c3RhcnQgKyAxKSB7CisgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCwgIiwgcmFuZ2UtPnN0YXJ0KTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCB0byAkMSwgIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZS0+c3RhcnQsIHJhbmdlLT5lbmQgLSAxKTsKKyAgICAgIH0KKyAgICB9CisgICAgY29udGVudHMtPnJlcGxhY2UoY29udGVudHMtPnNpemUoKSAtIDIsIDIsICI7XG4iKTsKKyAgfQorCisgIGlmIChyZXNlcnZlZF9uYW1lX2NvdW50KCkgPiAwKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwICByZXNlcnZlZCAiLCBwcmVmaXgpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpOyBpKyspIHsKKyAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICJcIiQwXCIsICIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENFc2NhcGUocmVzZXJ2ZWRfbmFtZShpKSkpOworICAgIH0KKyAgICBjb250ZW50cy0+cmVwbGFjZShjb250ZW50cy0+c2l6ZSgpIC0gMiwgMiwgIjtcbiIpOworICB9CisKICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKKyAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKIH0KIAogc3RyaW5nIEZpZWxkRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCBvcHRpb25zCisgIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOworfQorCitzdHJpbmcgRmllbGREZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAorICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKICAgc3RyaW5nIGNvbnRlbnRzOwogICBpbnQgZGVwdGggPSAwOwogICBpZiAoaXNfZXh0ZW5zaW9uKCkpIHsKQEAgLTE2NzUsMzAgKzIzMjYsNTYgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSk7CiAgICAgZGVwdGggPSAxOwogICB9Ci0gIERlYnVnU3RyaW5nKGRlcHRoLCAmY29udGVudHMpOworICBEZWJ1Z1N0cmluZyhkZXB0aCwgUFJJTlRfTEFCRUwsICZjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMpOwogICBpZiAoaXNfZXh0ZW5zaW9uKCkpIHsKLSAgICAgY29udGVudHMuYXBwZW5kKCJ9XG4iKTsKKyAgICBjb250ZW50cy5hcHBlbmQoIn1cbiIpOwogICB9CiAgIHJldHVybiBjb250ZW50czsKIH0KIAotdm9pZCBGaWVsZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cykgY29uc3QgeworLy8gVGhlIGZpZWxkIHR5cGUgc3RyaW5nIHVzZWQgaW4gRmllbGREZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpCitzdHJpbmcgRmllbGREZXNjcmlwdG9yOjpGaWVsZFR5cGVOYW1lRGVidWdTdHJpbmcoKSBjb25zdCB7CisgIHN3aXRjaCh0eXBlKCkpIHsKKyAgICBjYXNlIFRZUEVfTUVTU0FHRToKKyAgICAgIHJldHVybiAiLiIgKyBtZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCk7CisgICAgY2FzZSBUWVBFX0VOVU06CisgICAgICByZXR1cm4gIi4iICsgZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4ga1R5cGVUb05hbWVbdHlwZSgpXTsKKyAgfQorfQorCit2b2lkIEZpZWxkRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFByaW50TGFiZWxGbGFnIHByaW50X2xhYmVsX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nICpjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKICAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CiAgIHN0cmluZyBmaWVsZF90eXBlOwotICBzd2l0Y2ggKHR5cGUoKSkgewotICAgIGNhc2UgVFlQRV9NRVNTQUdFOgotICAgICAgZmllbGRfdHlwZSA9ICIuIiArIG1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKTsKLSAgICAgIGJyZWFrOwotICAgIGNhc2UgVFlQRV9FTlVNOgotICAgICAgZmllbGRfdHlwZSA9ICIuIiArIGVudW1fdHlwZSgpLT5mdWxsX25hbWUoKTsKLSAgICAgIGJyZWFrOwotICAgIGRlZmF1bHQ6Ci0gICAgICBmaWVsZF90eXBlID0ga1R5cGVUb05hbWVbdHlwZSgpXTsKKworICAvLyBTcGVjaWFsIGNhc2UgbWFwIGZpZWxkcy4KKyAgaWYgKGlzX21hcCgpKSB7CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgKKyAgICAgICAgJmZpZWxkX3R5cGUsICJtYXA8JDAsICQxPiIsCisgICAgICAgIG1lc3NhZ2VfdHlwZSgpLT5maWVsZCgwKS0+RmllbGRUeXBlTmFtZURlYnVnU3RyaW5nKCksCisgICAgICAgIG1lc3NhZ2VfdHlwZSgpLT5maWVsZCgxKS0+RmllbGRUeXBlTmFtZURlYnVnU3RyaW5nKCkpOworICB9IGVsc2UgeworICAgIGZpZWxkX3R5cGUgPSBGaWVsZFR5cGVOYW1lRGVidWdTdHJpbmcoKTsKICAgfQogCi0gIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMCQxICQyICQzID0gJDQiLAorICBzdHJpbmcgbGFiZWw7CisgIGlmIChwcmludF9sYWJlbF9mbGFnID09IFBSSU5UX0xBQkVMICYmICFpc19tYXAoKSkgeworICAgIGxhYmVsID0ga0xhYmVsVG9OYW1lW3RoaXMtPmxhYmVsKCldOworICAgIGxhYmVsLnB1c2hfYmFjaygnICcpOworICB9CisKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgorICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7CisKKyAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwJDEkMiAkMyA9ICQ0IiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0xhYmVsVG9OYW1lW2xhYmVsKCldLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhYmVsLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkX3R5cGUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSgpID09IFRZUEVfR1JPVVAgPyBtZXNzYWdlX3R5cGUoKS0+bmFtZSgpIDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUoKSwKQEAgLTE3MTIsNyArMjM4OSw3IEBACiAgIH0KIAogICBzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7Ci0gIGlmIChGb3JtYXRCcmFja2V0ZWRPcHRpb25zKG9wdGlvbnMoKSwgJmZvcm1hdHRlZF9vcHRpb25zKSkgeworICBpZiAoRm9ybWF0QnJhY2tldGVkT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCAmZm9ybWF0dGVkX29wdGlvbnMpKSB7CiAgICAgY29udGVudHMtPmFwcGVuZChicmFja2V0ZWQgPyAiLCAiIDogIiBbIik7CiAgICAgYnJhY2tldGVkID0gdHJ1ZTsKICAgICBjb250ZW50cy0+YXBwZW5kKGZvcm1hdHRlZF9vcHRpb25zKTsKQEAgLTE3MjMsODEgKzI0MDAsMTgxIEBACiAgIH0KIAogICBpZiAodHlwZSgpID09IFRZUEVfR1JPVVApIHsKLSAgICBtZXNzYWdlX3R5cGUoKS0+RGVidWdTdHJpbmcoZGVwdGgsIGNvbnRlbnRzKTsKKyAgICBpZiAoZGVidWdfc3RyaW5nX29wdGlvbnMuZWxpZGVfZ3JvdXBfYm9keSkgeworICAgICAgY29udGVudHMtPmFwcGVuZCgiIHsgLi4uIH07XG4iKTsKKyAgICB9IGVsc2UgeworICAgICAgbWVzc2FnZV90eXBlKCktPkRlYnVnU3RyaW5nKGRlcHRoLCBjb250ZW50cywgZGVidWdfc3RyaW5nX29wdGlvbnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogaW5jbHVkZV9vcGVuaW5nX2NsYXVzZSAqLyBmYWxzZSk7CisgICAgfQogICB9IGVsc2UgewogICAgIGNvbnRlbnRzLT5hcHBlbmQoIjtcbiIpOwogICB9CisKKyAgY29tbWVudF9wcmludGVyLkFkZFBvc3RDb21tZW50KGNvbnRlbnRzKTsKIH0KIAotc3RyaW5nIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKK3N0cmluZyBPbmVvZkRlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgdmFsdWVzCisgIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOworfQorCitzdHJpbmcgT25lb2ZEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKAorICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3QgewogICBzdHJpbmcgY29udGVudHM7Ci0gIERlYnVnU3RyaW5nKDAsICZjb250ZW50cyk7CisgIERlYnVnU3RyaW5nKDAsICZjb250ZW50cywgb3B0aW9ucyk7CiAgIHJldHVybiBjb250ZW50czsKIH0KIAotdm9pZCBFbnVtRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdCB7Cit2b2lkIE9uZW9mRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcqIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucykgY29uc3QgewogICBzdHJpbmcgcHJlZml4KGRlcHRoICogMiwgJyAnKTsKICAgKytkZXB0aDsKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgorICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7CisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoCisgICAgICBjb250ZW50cywgIiQwIG9uZW9mICQxIHsiLCBwcmVmaXgsIG5hbWUoKSk7CisgIGlmIChkZWJ1Z19zdHJpbmdfb3B0aW9ucy5lbGlkZV9vbmVvZl9ib2R5KSB7CisgICAgY29udGVudHMtPmFwcGVuZCgiIC4uLiB9XG4iKTsKKyAgfSBlbHNlIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkX2NvdW50KCk7IGkrKykgeworICAgICAgZmllbGQoaSktPkRlYnVnU3RyaW5nKGRlcHRoLCBGaWVsZERlc2NyaXB0b3I6Ok9NSVRfTEFCRUwsIGNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKyAgICB9CisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwfVxuIiwgcHJlZml4KTsKKyAgfQorICBjb21tZW50X3ByaW50ZXIuQWRkUG9zdENvbW1lbnQoY29udGVudHMpOworfQorCitzdHJpbmcgRW51bURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkgY29uc3QgeworICBEZWJ1Z1N0cmluZ09wdGlvbnMgb3B0aW9uczsgIC8vIGRlZmF1bHQgdmFsdWVzCisgIHJldHVybiBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKG9wdGlvbnMpOworfQorCitzdHJpbmcgRW51bURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCisgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdCB7CisgIHN0cmluZyBjb250ZW50czsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBvcHRpb25zKTsKKyAgcmV0dXJuIGNvbnRlbnRzOworfQorCit2b2lkIEVudW1EZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucykgY29uc3QgeworICBzdHJpbmcgcHJlZml4KGRlcHRoICogMiwgJyAnKTsKKyAgKytkZXB0aDsKKworICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyCisgICAgICBjb21tZW50X3ByaW50ZXIodGhpcywgcHJlZml4LCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KGNvbnRlbnRzKTsKKwogICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDBlbnVtICQxIHtcbiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBuYW1lKCkpOwogCiAgIEZvcm1hdExpbmVPcHRpb25zKGRlcHRoLCBvcHRpb25zKCksIGNvbnRlbnRzKTsKIAogICBmb3IgKGludCBpID0gMDsgaSA8IHZhbHVlX2NvdW50KCk7IGkrKykgewotICAgIHZhbHVlKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMpOworICAgIHZhbHVlKGkpLT5EZWJ1Z1N0cmluZyhkZXB0aCwgY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKICAgfQogICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAiJDB9XG4iLCBwcmVmaXgpOworCisgIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudChjb250ZW50cyk7CiB9CiAKIHN0cmluZyBFbnVtVmFsdWVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnM7ICAvLyBkZWZhdWx0IHZhbHVlcworICByZXR1cm4gRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhvcHRpb25zKTsKK30KKworc3RyaW5nIEVudW1WYWx1ZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCisgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdCB7CiAgIHN0cmluZyBjb250ZW50czsKLSAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBvcHRpb25zKTsKICAgcmV0dXJuIGNvbnRlbnRzOwogfQogCi12b2lkIEVudW1WYWx1ZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cykgY29uc3Qgewordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKICAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CisKKyAgU291cmNlTG9jYXRpb25Db21tZW50UHJpbnRlcgorICAgICAgY29tbWVudF9wcmludGVyKHRoaXMsIHByZWZpeCwgZGVidWdfc3RyaW5nX29wdGlvbnMpOworICBjb21tZW50X3ByaW50ZXIuQWRkUHJlQ29tbWVudChjb250ZW50cyk7CisKICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiQwJDEgPSAkMiIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJlZml4LCBuYW1lKCksIG51bWJlcigpKTsKIAogICBzdHJpbmcgZm9ybWF0dGVkX29wdGlvbnM7Ci0gIGlmIChGb3JtYXRCcmFja2V0ZWRPcHRpb25zKG9wdGlvbnMoKSwgJmZvcm1hdHRlZF9vcHRpb25zKSkgeworICBpZiAoRm9ybWF0QnJhY2tldGVkT3B0aW9ucyhkZXB0aCwgb3B0aW9ucygpLCAmZm9ybWF0dGVkX29wdGlvbnMpKSB7CiAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZChjb250ZW50cywgIiBbJDBdIiwgZm9ybWF0dGVkX29wdGlvbnMpOwogICB9CiAgIGNvbnRlbnRzLT5hcHBlbmQoIjtcbiIpOworCisgIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudChjb250ZW50cyk7CiB9CiAKIHN0cmluZyBTZXJ2aWNlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKSBjb25zdCB7CisgIERlYnVnU3RyaW5nT3B0aW9ucyBvcHRpb25zOyAgLy8gZGVmYXVsdCB2YWx1ZXMKKyAgcmV0dXJuIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMob3B0aW9ucyk7Cit9CisKK3N0cmluZyBTZXJ2aWNlRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygKKyAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0IHsKICAgc3RyaW5nIGNvbnRlbnRzOwotICBEZWJ1Z1N0cmluZygmY29udGVudHMpOworICBEZWJ1Z1N0cmluZygmY29udGVudHMsIG9wdGlvbnMpOwogICByZXR1cm4gY29udGVudHM7CiB9CiAKLXZvaWQgU2VydmljZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKHN0cmluZyAqY29udGVudHMpIGNvbnN0IHsKK3ZvaWQgU2VydmljZURlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKHN0cmluZyAqY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWJ1Z19zdHJpbmdfb3B0aW9ucykgY29uc3QgeworICBTb3VyY2VMb2NhdGlvbkNvbW1lbnRQcmludGVyCisgICAgICBjb21tZW50X3ByaW50ZXIodGhpcywgLyogcHJlZml4ICovICIiLCBkZWJ1Z19zdHJpbmdfb3B0aW9ucyk7CisgIGNvbW1lbnRfcHJpbnRlci5BZGRQcmVDb21tZW50KGNvbnRlbnRzKTsKKwogICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKGNvbnRlbnRzLCAic2VydmljZSAkMCB7XG4iLCBuYW1lKCkpOwogCiAgIEZvcm1hdExpbmVPcHRpb25zKDEsIG9wdGlvbnMoKSwgY29udGVudHMpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWV0aG9kX2NvdW50KCk7IGkrKykgewotICAgIG1ldGhvZChpKS0+RGVidWdTdHJpbmcoMSwgY29udGVudHMpOworICAgIG1ldGhvZChpKS0+RGVidWdTdHJpbmcoMSwgY29udGVudHMsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKICAgfQogCiAgIGNvbnRlbnRzLT5hcHBlbmQoIn1cbiIpOworCisgIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudChjb250ZW50cyk7CiB9CiAKIHN0cmluZyBNZXRob2REZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKKyAgRGVidWdTdHJpbmdPcHRpb25zIG9wdGlvbnM7ICAvLyBkZWZhdWx0IHZhbHVlcworICByZXR1cm4gRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhvcHRpb25zKTsKK30KKworc3RyaW5nIE1ldGhvZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoCisgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdCB7CiAgIHN0cmluZyBjb250ZW50czsKLSAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzKTsKKyAgRGVidWdTdHJpbmcoMCwgJmNvbnRlbnRzLCBvcHRpb25zKTsKICAgcmV0dXJuIGNvbnRlbnRzOwogfQogCi12b2lkIE1ldGhvZERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cykgY29uc3Qgewordm9pZCBNZXRob2REZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVidWdfc3RyaW5nX29wdGlvbnMpIGNvbnN0IHsKICAgc3RyaW5nIHByZWZpeChkZXB0aCAqIDIsICcgJyk7CiAgICsrZGVwdGg7Ci0gIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMHJwYyAkMSguJDIpIHJldHVybnMgKC4kMykiLAorCisgIFNvdXJjZUxvY2F0aW9uQ29tbWVudFByaW50ZXIKKyAgICAgIGNvbW1lbnRfcHJpbnRlcih0aGlzLCBwcmVmaXgsIGRlYnVnX3N0cmluZ19vcHRpb25zKTsKKyAgY29tbWVudF9wcmludGVyLkFkZFByZUNvbW1lbnQoY29udGVudHMpOworCisgIHN0cmluZ3M6OlN1YnN0aXR1dGVBbmRBcHBlbmQoY29udGVudHMsICIkMHJwYyAkMSgkNC4kMikgcmV0dXJucyAoJDUuJDMpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmVmaXgsIG5hbWUoKSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dF90eXBlKCktPmZ1bGxfbmFtZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dF90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXRfdHlwZSgpLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbGllbnRfc3RyZWFtaW5nKCkgPyAic3RyZWFtICIgOiAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXJ2ZXJfc3RyZWFtaW5nKCkgPyAic3RyZWFtICIgOiAiIik7CiAKICAgc3RyaW5nIGZvcm1hdHRlZF9vcHRpb25zOwogICBpZiAoRm9ybWF0TGluZU9wdGlvbnMoZGVwdGgsIG9wdGlvbnMoKSwgJmZvcm1hdHRlZF9vcHRpb25zKSkgewpAQCAtMTgwNiwxMyArMjU4MywxNjMgQEAKICAgfSBlbHNlIHsKICAgICBjb250ZW50cy0+YXBwZW5kKCI7XG4iKTsKICAgfQorCisgIGNvbW1lbnRfcHJpbnRlci5BZGRQb3N0Q29tbWVudChjb250ZW50cyk7CiB9CisKKworLy8gTG9jYXRpb24gbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitib29sIEZpbGVEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihjb25zdCB2ZWN0b3I8aW50PiYgcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgR09PR0xFX0NIRUNLX05PVE5VTEwob3V0X2xvY2F0aW9uKTsKKyAgaWYgKHNvdXJjZV9jb2RlX2luZm9fKSB7CisgICAgaWYgKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBsb2MgPQorICAgICAgICB0YWJsZXNfLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBzb3VyY2VfY29kZV9pbmZvXykpIHsKKyAgICAgIGNvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzI+JiBzcGFuID0gbG9jLT5zcGFuKCk7CisgICAgICBpZiAoc3Bhbi5zaXplKCkgPT0gMyB8fCBzcGFuLnNpemUoKSA9PSA0KSB7CisgICAgICAgIG91dF9sb2NhdGlvbi0+c3RhcnRfbGluZSAgID0gc3Bhbi5HZXQoMCk7CisgICAgICAgIG91dF9sb2NhdGlvbi0+c3RhcnRfY29sdW1uID0gc3Bhbi5HZXQoMSk7CisgICAgICAgIG91dF9sb2NhdGlvbi0+ZW5kX2xpbmUgICAgID0gc3Bhbi5HZXQoc3Bhbi5zaXplKCkgPT0gMyA/IDAgOiAyKTsKKyAgICAgICAgb3V0X2xvY2F0aW9uLT5lbmRfY29sdW1uICAgPSBzcGFuLkdldChzcGFuLnNpemUoKSAtIDEpOworCisgICAgICAgIG91dF9sb2NhdGlvbi0+bGVhZGluZ19jb21tZW50cyA9IGxvYy0+bGVhZGluZ19jb21tZW50cygpOworICAgICAgICBvdXRfbG9jYXRpb24tPnRyYWlsaW5nX2NvbW1lbnRzID0gbG9jLT50cmFpbGluZ19jb21tZW50cygpOworICAgICAgICBvdXRfbG9jYXRpb24tPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMuYXNzaWduKAorICAgICAgICAgICAgbG9jLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkuYmVnaW4oKSwKKyAgICAgICAgICAgIGxvYy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpLmVuZCgpKTsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiBmYWxzZTsKK30KKworYm9vbCBGaWxlRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3QgeworICB2ZWN0b3I8aW50PiBwYXRoOyAgLy8gZW1wdHkgcGF0aCBmb3Igcm9vdCBGaWxlRGVzY3JpcHRvcgorICByZXR1cm4gR2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBGaWVsZERlc2NyaXB0b3I6OmlzX3BhY2tlZCgpIGNvbnN0IHsKKyAgaWYgKCFpc19wYWNrYWJsZSgpKSByZXR1cm4gZmFsc2U7CisgIGlmIChmaWxlXy0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzIpIHsKKyAgICByZXR1cm4gKG9wdGlvbnNfICE9IE5VTEwpICYmIG9wdGlvbnNfLT5wYWNrZWQoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gb3B0aW9uc18gPT0gTlVMTCB8fCAhb3B0aW9uc18tPmhhc19wYWNrZWQoKSB8fCBvcHRpb25zXy0+cGFja2VkKCk7CisgIH0KK30KKworYm9vbCBEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHZlY3RvcjxpbnQ+IHBhdGg7CisgIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgIHJldHVybiBmaWxlKCktPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIG91dF9sb2NhdGlvbik7Cit9CisKK2Jvb2wgRmllbGREZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHZlY3RvcjxpbnQ+IHBhdGg7CisgIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgIHJldHVybiBmaWxlKCktPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIG91dF9sb2NhdGlvbik7Cit9CisKK2Jvb2wgT25lb2ZEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHZlY3RvcjxpbnQ+IHBhdGg7CisgIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgIHJldHVybiBjb250YWluaW5nX3R5cGUoKS0+ZmlsZSgpLT5HZXRTb3VyY2VMb2NhdGlvbihwYXRoLCBvdXRfbG9jYXRpb24pOworfQorCitib29sIEVudW1EZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHZlY3RvcjxpbnQ+IHBhdGg7CisgIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgIHJldHVybiBmaWxlKCktPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIG91dF9sb2NhdGlvbik7Cit9CisKK2Jvb2wgTWV0aG9kRGVzY3JpcHRvcjo6R2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3QgeworICB2ZWN0b3I8aW50PiBwYXRoOworICBHZXRMb2NhdGlvblBhdGgoJnBhdGgpOworICByZXR1cm4gc2VydmljZSgpLT5maWxlKCktPkdldFNvdXJjZUxvY2F0aW9uKHBhdGgsIG91dF9sb2NhdGlvbik7Cit9CisKK2Jvb2wgU2VydmljZURlc2NyaXB0b3I6OkdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0IHsKKyAgdmVjdG9yPGludD4gcGF0aDsKKyAgR2V0TG9jYXRpb25QYXRoKCZwYXRoKTsKKyAgcmV0dXJuIGZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKworYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yOjpHZXRTb3VyY2VMb2NhdGlvbigKKyAgICBTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdCB7CisgIHZlY3RvcjxpbnQ+IHBhdGg7CisgIEdldExvY2F0aW9uUGF0aCgmcGF0aCk7CisgIHJldHVybiB0eXBlKCktPmZpbGUoKS0+R2V0U291cmNlTG9jYXRpb24ocGF0aCwgb3V0X2xvY2F0aW9uKTsKK30KKwordm9pZCBEZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3QgeworICBpZiAoY29udGFpbmluZ190eXBlKCkpIHsKKyAgICBjb250YWluaW5nX3R5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soRGVzY3JpcHRvclByb3RvOjprTmVzdGVkVHlwZUZpZWxkTnVtYmVyKTsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKKyAgfSBlbHNlIHsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhGaWxlRGVzY3JpcHRvclByb3RvOjprTWVzc2FnZVR5cGVGaWVsZE51bWJlcik7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgIH0KK30KKwordm9pZCBGaWVsZERlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIGlmIChpc19leHRlbnNpb24oKSkgeworICAgIGlmIChleHRlbnNpb25fc2NvcGUoKSA9PSBOVUxMKSB7CisgICAgICBvdXRwdXQtPnB1c2hfYmFjayhGaWxlRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXIpOworICAgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuc2lvbl9zY29wZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKKyAgICAgIG91dHB1dC0+cHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvbkZpZWxkTnVtYmVyKTsKKyAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBjb250YWluaW5nX3R5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soRGVzY3JpcHRvclByb3RvOjprRmllbGRGaWVsZE51bWJlcik7CisgICAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7CisgIH0KK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIGNvbnRhaW5pbmdfdHlwZSgpLT5HZXRMb2NhdGlvblBhdGgob3V0cHV0KTsKKyAgb3V0cHV0LT5wdXNoX2JhY2soRGVzY3JpcHRvclByb3RvOjprT25lb2ZEZWNsRmllbGROdW1iZXIpOworICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKK30KKwordm9pZCBFbnVtRGVzY3JpcHRvcjo6R2V0TG9jYXRpb25QYXRoKHZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0IHsKKyAgaWYgKGNvbnRhaW5pbmdfdHlwZSgpKSB7CisgICAgY29udGFpbmluZ190eXBlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKERlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXIpOworICAgIG91dHB1dC0+cHVzaF9iYWNrKGluZGV4KCkpOworICB9IGVsc2UgeworICAgIG91dHB1dC0+cHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyKTsKKyAgICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKKyAgfQorfQorCit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIHR5cGUoKS0+R2V0TG9jYXRpb25QYXRoKG91dHB1dCk7CisgIG91dHB1dC0+cHVzaF9iYWNrKEVudW1EZXNjcmlwdG9yUHJvdG86OmtWYWx1ZUZpZWxkTnVtYmVyKTsKKyAgb3V0cHV0LT5wdXNoX2JhY2soaW5kZXgoKSk7Cit9CisKK3ZvaWQgU2VydmljZURlc2NyaXB0b3I6OkdldExvY2F0aW9uUGF0aCh2ZWN0b3I8aW50Piogb3V0cHV0KSBjb25zdCB7CisgIG91dHB1dC0+cHVzaF9iYWNrKEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTZXJ2aWNlRmllbGROdW1iZXIpOworICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKK30KKwordm9pZCBNZXRob2REZXNjcmlwdG9yOjpHZXRMb2NhdGlvblBhdGgodmVjdG9yPGludD4qIG91dHB1dCkgY29uc3QgeworICBzZXJ2aWNlKCktPkdldExvY2F0aW9uUGF0aChvdXRwdXQpOworICBvdXRwdXQtPnB1c2hfYmFjayhTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTWV0aG9kRmllbGROdW1iZXIpOworICBvdXRwdXQtPnB1c2hfYmFjayhpbmRleCgpKTsKK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBuYW1lc3BhY2UgewogCiAvLyBSZXByZXNlbnRzIGFuIG9wdGlvbnMgbWVzc2FnZSB0byBpbnRlcnByZXQuIEV4dGVuc2lvbiBuYW1lcyBpbiB0aGUgb3B0aW9uCi0vLyBuYW1lIGFyZSByZXNwb2x2ZWQgcmVsYXRpdmUgdG8gbmFtZV9zY29wZS4gZWxlbWVudF9uYW1lIGFuZCBvcmlnX29wdCBhcmUKKy8vIG5hbWUgYXJlIHJlc29sdmVkIHJlbGF0aXZlIHRvIG5hbWVfc2NvcGUuIGVsZW1lbnRfbmFtZSBhbmQgb3JpZ19vcHQgYXJlCiAvLyB1c2VkIG9ubHkgZm9yIGVycm9yIHJlcG9ydGluZyAoc2luY2UgdGhlIHBhcnNlciByZWNvcmRzIGxvY2F0aW9ucyBhZ2FpbnN0CiAvLyBwb2ludGVycyBpbiB0aGUgb3JpZ2luYWwgb3B0aW9ucywgbm90IHRoZSBtdXRhYmxlIGNvcHkpLiBUaGUgTWVzc2FnZSBtdXN0IGJlCiAvLyBvbmUgb2YgdGhlIE9wdGlvbnMgbWVzc2FnZXMgaW4gZGVzY3JpcHRvci5wcm90by4KQEAgLTE4NDYsNiArMjc3Myw5IEBACiAgcHJpdmF0ZToKICAgZnJpZW5kIGNsYXNzIE9wdGlvbkludGVycHJldGVyOwogCisgIC8vIE5vbi1yZWN1cnNpdmUgcGFydCBvZiBCdWlsZEZpbGUgZnVuY3Rpb25hbGl0eS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIEJ1aWxkRmlsZUltcGwoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworCiAgIGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sXzsKICAgRGVzY3JpcHRvclBvb2w6OlRhYmxlcyogdGFibGVzXzsgIC8vIGZvciBjb252ZW5pZW5jZQogICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CkBAIC0xODU5LDYgKzI3ODksMTEgQEAKICAgc3RyaW5nIGZpbGVuYW1lXzsKICAgRmlsZURlc2NyaXB0b3IqIGZpbGVfOwogICBGaWxlRGVzY3JpcHRvclRhYmxlcyogZmlsZV90YWJsZXNfOworICBzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiBkZXBlbmRlbmNpZXNfOworCisgIC8vIHVudXNlZF9kZXBlbmRlbmN5XyBpcyB1c2VkIHRvIHJlY29yZCB0aGUgdW51c2VkIGltcG9ydGVkIGZpbGVzLgorICAvLyBOb3RlOiBwdWJsaWMgaW1wb3J0IGlzIG5vdCBjb25zaWRlcmVkLgorICBzZXQ8Y29uc3QgRmlsZURlc2NyaXB0b3IqPiB1bnVzZWRfZGVwZW5kZW5jeV87CiAKICAgLy8gSWYgTG9va3VwU3ltYm9sKCkgZmluZHMgYSBzeW1ib2wgdGhhdCBpcyBpbiBhIGZpbGUgd2hpY2ggaXMgbm90IGEgZGVjbGFyZWQKICAgLy8gZGVwZW5kZW5jeSBvZiB0aGlzIGZpbGUsIGl0IHdpbGwgZmFpbCwgYnV0IHdpbGwgc2V0CkBAIC0xODcwLDEwICsyODA1LDIyIEBACiAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfOwogICBzdHJpbmcgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5X25hbWVfOwogCisgIC8vIElmIExvb2t1cFN5bWJvbCgpIGNvdWxkIHJlc29sdmUgYSBzeW1ib2wgd2hpY2ggaXMgbm90IGRlZmluZWQsCisgIC8vIHJlY29yZCB0aGUgcmVzb2x2ZWQgbmFtZS4gIFRoaXMgaXMgb25seSB1c2VkIGJ5IEFkZE5vdERlZmluZWRFcnJvcigpCisgIC8vIHRvIHJlcG9ydCBhIG1vcmUgdXNlZnVsIGVycm9yIG1lc3NhZ2UuCisgIHN0cmluZyB1bmRlZmluZV9yZXNvbHZlZF9uYW1lXzsKKwogICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAogICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAogICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZXJyb3IpOworICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIGVycm9yKTsKKyAgdm9pZCBBZGRSZWN1cnNpdmVJbXBvcnRFcnJvcihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywgaW50IGZyb21faGVyZSk7CisgIHZvaWQgQWRkVHdpY2VMaXN0ZWRFcnJvcihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywgaW50IGluZGV4KTsKKyAgdm9pZCBBZGRJbXBvcnRFcnJvcihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywgaW50IGluZGV4KTsKIAogICAvLyBBZGRzIGFuIGVycm9yIGluZGljYXRpbmcgdGhhdCB1bmRlZmluZWRfc3ltYm9sIHdhcyBub3QgZGVmaW5lZC4gIE11c3QKICAgLy8gb25seSBiZSBjYWxsZWQgYWZ0ZXIgTG9va3VwU3ltYm9sKCkgZmFpbHMuCkBAIC0xODgzLDExICsyODMwLDE5IEBACiAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAogICAgIGNvbnN0IHN0cmluZyYgdW5kZWZpbmVkX3N5bWJvbCk7CiAKKyAgdm9pZCBBZGRXYXJuaW5nKGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLCBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBlcnJvcik7CisKICAgLy8gU2lsbHkgaGVscGVyIHdoaWNoIGRldGVybWluZXMgaWYgdGhlIGdpdmVuIGZpbGUgaXMgaW4gdGhlIGdpdmVuIHBhY2thZ2UuCiAgIC8vIEkuZS4sIGVpdGhlciBmaWxlLT5wYWNrYWdlKCkgPT0gcGFja2FnZV9uYW1lIG9yIGZpbGUtPnBhY2thZ2UoKSBpcyBhCiAgIC8vIG5lc3RlZCBwYWNrYWdlIHdpdGhpbiBwYWNrYWdlX25hbWUuCiAgIGJvb2wgSXNJblBhY2thZ2UoY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUsIGNvbnN0IHN0cmluZyYgcGFja2FnZV9uYW1lKTsKIAorICAvLyBIZWxwZXIgZnVuY3Rpb24gd2hpY2ggZmluZHMgYWxsIHB1YmxpYyBkZXBlbmRlbmNpZXMgb2YgdGhlIGdpdmVuIGZpbGUsIGFuZAorICAvLyBzdG9yZXMgdGhlIHRoZW0gaW4gdGhlIGRlcGVuZGVuY2llc18gc2V0IGluIHRoZSBidWlsZGVyLgorICB2b2lkIFJlY29yZFB1YmxpY0RlcGVuZGVuY2llcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSk7CisKICAgLy8gTGlrZSB0YWJsZXNfLT5GaW5kU3ltYm9sKCksIGJ1dCBhZGRpdGlvbmFsbHk6CiAgIC8vIC0gU2VhcmNoIHRoZSBwb29sJ3MgdW5kZXJsYXkgaWYgbm90IGZvdW5kIGluIHRhYmxlc18uCiAgIC8vIC0gSW5zdXJlIHRoYXQgdGhlIHJlc3VsdGluZyBTeW1ib2wgaXMgZnJvbSBvbmUgb2YgdGhlIGZpbGUncyBkZWNsYXJlZApAQCAtMTg5OCw2ICsyODUzLDEwIEBACiAgIC8vIGZpbGUncyBkZWNsYXJlZCBkZXBlbmRlbmNpZXMuCiAgIFN5bWJvbCBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcyhjb25zdCBzdHJpbmcmIG5hbWUpOwogCisgIC8vIFRoaXMgaW1wbGVtZW50cyB0aGUgYm9keSBvZiBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygpLgorICBTeW1ib2wgRmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHNIZWxwZXIoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUpOworCiAgIC8vIExpa2UgRmluZFN5bWJvbCgpLCBidXQgbG9va3MgdXAgdGhlIG5hbWUgcmVsYXRpdmUgdG8gc29tZSBvdGhlciBzeW1ib2wKICAgLy8gbmFtZS4gIFRoaXMgZmlyc3Qgc2VhcmNoZXMgc2libGluZ3Mgb2YgcmVsYXRpdmVfdG8sIHRoZW4gc2libGluZ3Mgb2YgaXRzCiAgIC8vIHBhcmVudHMsIGV0Yy4gIEZvciBleGFtcGxlLCBMb29rdXBTeW1ib2woImZvby5iYXIiLCAiYmF6LnF1eC5jb3JnZSIpIG1ha2VzCkBAIC0xOTM2LDcgKzI4OTUsNyBAQAogCiAgIC8vIENyZWF0ZXMgYSBwbGFjZWhvbGRlciBmaWxlLiAgTmV2ZXIgcmV0dXJucyBOVUxMLiAgVGhpcyBpcyB1c2VkIHdoZW4gYW4KICAgLy8gaW1wb3J0IGlzIG5vdCBmb3VuZCBhbmQgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzKCkgaXMgZW5hYmxlZC4KLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIE5ld1BsYWNlaG9sZGVyRmlsZShjb25zdCBzdHJpbmcmIG5hbWUpOworICBGaWxlRGVzY3JpcHRvciogTmV3UGxhY2Vob2xkZXJGaWxlKGNvbnN0IHN0cmluZyYgbmFtZSk7CiAKICAgLy8gQ2FsbHMgdGFibGVzXy0+QWRkU3ltYm9sKCkgYW5kIHJlY29yZHMgYW4gZXJyb3IgaWYgaXQgZmFpbHMuICBSZXR1cm5zCiAgIC8vIHRydWUgaWYgc3VjY2Vzc2Z1bCBvciBmYWxzZSBpZiBmYWlsZWQsIHRob3VnaCBtb3N0IGNhbGxlcnMgY2FuIGlnbm9yZQpAQCAtMjAwOSw2ICsyOTY4LDEyIEBACiAgIHZvaWQgQnVpbGRFeHRlbnNpb25SYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG86OkV4dGVuc2lvblJhbmdlJiBwcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByZXN1bHQpOworICB2b2lkIEJ1aWxkUmVzZXJ2ZWRSYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG86OlJlc2VydmVkUmFuZ2UmIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvciogcGFyZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSogcmVzdWx0KTsKKyAgdm9pZCBCdWlsZE9uZW9mKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgIE9uZW9mRGVzY3JpcHRvciogcmVzdWx0KTsKICAgdm9pZCBCdWlsZEVudW0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8sCiAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKICAgICAgICAgICAgICAgICAgRW51bURlc2NyaXB0b3IqIHJlc3VsdCk7CkBAIC0yMDIyLDYgKzI5ODcsOSBAQAogICAgICAgICAgICAgICAgICAgIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yKiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgTWV0aG9kRGVzY3JpcHRvciogcmVzdWx0KTsKIAorICB2b2lkIExvZ1VudXNlZERlcGVuZGVuY3koY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0KTsKKwogICAvLyBNdXN0IGJlIHJ1biBvbmx5IGFmdGVyIGJ1aWxkaW5nLgogICAvLwogICAvLyBOT1RFOiBPcHRpb25zIHdpbGwgbm90IGJlIGF2YWlsYWJsZSBkdXJpbmcgY3Jvc3MtbGlua2luZywgYXMgdGhleQpAQCAtMjE1Nyw2ICszMTI1LDkgQEAKICAgc3RhdGljIGlubGluZSBib29sIGdldF9hbGxvd191bmtub3duKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CiAgICAgcmV0dXJuIHBvb2wtPmFsbG93X3Vua25vd25fOwogICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBnZXRfZW5mb3JjZV93ZWFrKGNvbnN0IERlc2NyaXB0b3JQb29sKiBwb29sKSB7CisgICAgcmV0dXJuIHBvb2wtPmVuZm9yY2Vfd2Vha187CisgIH0KICAgc3RhdGljIGlubGluZSBib29sIGdldF9pc19wbGFjZWhvbGRlcihjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CiAgICAgcmV0dXJuIGRlc2NyaXB0b3ItPmlzX3BsYWNlaG9sZGVyXzsKICAgfQpAQCAtMjE4Niw5ICszMTU3LDI1IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBwcm90byk7CiAgIHZvaWQgVmFsaWRhdGVNZXRob2RPcHRpb25zKE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIHZvaWQgVmFsaWRhdGVQcm90bzMoRmlsZURlc2NyaXB0b3IqIGZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlUHJvdG8zTWVzc2FnZShEZXNjcmlwdG9yKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKyAgdm9pZCBWYWxpZGF0ZVByb3RvM0ZpZWxkKEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworICB2b2lkIFZhbGlkYXRlUHJvdG8zRW51bShFbnVtRGVzY3JpcHRvciogZW5tLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90byk7CiAKLSAgdm9pZCBWYWxpZGF0ZU1hcEtleShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAotICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90byk7CisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbWFwIGVudHJ5IG1lc3NhZ2UgaXMgY29tcGF0aWJsZSB3aXRoIHRoZQorICAvLyBhdXRvLWdlbmVyYXRlZCBlbnRyeSBtZXNzYWdlIGZyb20gbWFwIGZpZWxkcyBzeW50YXguCisgIGJvb2wgVmFsaWRhdGVNYXBFbnRyeShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIHByb3RvKTsKKworICAvLyBSZWN1cnNpdmVseSBkZXRlY3RzIG5hbWluZyBjb25mbGljdHMgd2l0aCBtYXAgZW50cnkgdHlwZXMgZm9yIGEKKyAgLy8gYmV0dGVyIGVycm9yIG1lc3NhZ2UuCisgIHZvaWQgRGV0ZWN0TWFwQ29uZmxpY3RzKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90byYgcHJvdG8pOworCiB9OwogCiBjb25zdCBGaWxlRGVzY3JpcHRvciogRGVzY3JpcHRvclBvb2w6OkJ1aWxkRmlsZSgKQEAgLTIxOTgsNiArMzE4NSw4IEBACiAgICAgICAgIkRlc2NyaXB0b3JEYXRhYmFzZS4gIFlvdSBtdXN0IGluc3RlYWQgZmluZCBhIHdheSB0byBnZXQgeW91ciBmaWxlICIKICAgICAgICAiaW50byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4iOwogICBHT09HTEVfQ0hFQ0sobXV0ZXhfID09IE5VTEwpOyAgIC8vIEltcGxpZWQgYnkgdGhlIGFib3ZlIEdPT0dMRV9DSEVDSy4KKyAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7CisgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKICAgcmV0dXJuIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksIE5VTEwpLkJ1aWxkRmlsZShwcm90byk7CiB9CiAKQEAgLTIyMDksNiArMzE5OCw4IEBACiAgICAgICAgIkRlc2NyaXB0b3JEYXRhYmFzZS4gIFlvdSBtdXN0IGluc3RlYWQgZmluZCBhIHdheSB0byBnZXQgeW91ciBmaWxlICIKICAgICAgICAiaW50byB0aGUgdW5kZXJseWluZyBkYXRhYmFzZS4iOwogICBHT09HTEVfQ0hFQ0sobXV0ZXhfID09IE5VTEwpOyAgIC8vIEltcGxpZWQgYnkgdGhlIGFib3ZlIEdPT0dMRV9DSEVDSy4KKyAgdGFibGVzXy0+a25vd25fYmFkX3N5bWJvbHNfLmNsZWFyKCk7CisgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY2xlYXIoKTsKICAgcmV0dXJuIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2xsZWN0b3IpLkJ1aWxkRmlsZShwcm90byk7CiB9CkBAIC0yMjE2LDggKzMyMDcsMTYgQEAKIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUG9vbDo6QnVpbGRGaWxlRnJvbURhdGFiYXNlKAogICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSBjb25zdCB7CiAgIG11dGV4Xy0+QXNzZXJ0SGVsZCgpOwotICByZXR1cm4gRGVzY3JpcHRvckJ1aWxkZXIodGhpcywgdGFibGVzXy5nZXQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRfZXJyb3JfY29sbGVjdG9yXykuQnVpbGRGaWxlKHByb3RvKTsKKyAgaWYgKHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uY291bnQocHJvdG8ubmFtZSgpKSA+IDApIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0ID0KKyAgICAgIERlc2NyaXB0b3JCdWlsZGVyKHRoaXMsIHRhYmxlc18uZ2V0KCksCisgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2Vycm9yX2NvbGxlY3Rvcl8pLkJ1aWxkRmlsZShwcm90byk7CisgIGlmIChyZXN1bHQgPT0gTlVMTCkgeworICAgIHRhYmxlc18tPmtub3duX2JhZF9maWxlc18uaW5zZXJ0KHByb3RvLm5hbWUoKSk7CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKIH0KIAogRGVzY3JpcHRvckJ1aWxkZXI6OkRlc2NyaXB0b3JCdWlsZGVyKApAQCAtMjIyOCw3ICszMjI3LDggQEAKICAgICB0YWJsZXNfKHRhYmxlcyksCiAgICAgZXJyb3JfY29sbGVjdG9yXyhlcnJvcl9jb2xsZWN0b3IpLAogICAgIGhhZF9lcnJvcnNfKGZhbHNlKSwKLSAgICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfKE5VTEwpIHt9CisgICAgcG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyhOVUxMKSwKKyAgICB1bmRlZmluZV9yZXNvbHZlZF9uYW1lXygiIikge30KIAogRGVzY3JpcHRvckJ1aWxkZXI6On5EZXNjcmlwdG9yQnVpbGRlcigpIHt9CiAKQEAgLTIyNTAsMjEgKzMyNTAsNTMgQEAKICAgaGFkX2Vycm9yc18gPSB0cnVlOwogfQogCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRFcnJvcigKKyAgICBjb25zdCBzdHJpbmcmIGVsZW1lbnRfbmFtZSwKKyAgICBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICBjb25zdCBjaGFyKiBlcnJvcikgeworICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLCBzdHJpbmcoZXJyb3IpKTsKK30KKwogdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkTm90RGVmaW5lZEVycm9yKAogICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLAogICAgIGNvbnN0IE1lc3NhZ2UmIGRlc2NyaXB0b3IsCiAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAogICAgIGNvbnN0IHN0cmluZyYgdW5kZWZpbmVkX3N5bWJvbCkgewotICBpZiAocG9zc2libGVfdW5kZWNsYXJlZF9kZXBlbmRlbmN5XyA9PSBOVUxMKSB7CisgIGlmIChwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfID09IE5VTEwgJiYKKyAgICAgIHVuZGVmaW5lX3Jlc29sdmVkX25hbWVfLmVtcHR5KCkpIHsKICAgICBBZGRFcnJvcihlbGVtZW50X25hbWUsIGRlc2NyaXB0b3IsIGxvY2F0aW9uLAogICAgICAgICAgICAgICJcIiIgKyB1bmRlZmluZWRfc3ltYm9sICsgIlwiIGlzIG5vdCBkZWZpbmVkLiIpOwogICB9IGVsc2UgewotICAgIEFkZEVycm9yKGVsZW1lbnRfbmFtZSwgZGVzY3JpcHRvciwgbG9jYXRpb24sCi0gICAgICAgICAgICAgIlwiIiArIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV9uYW1lXyArCi0gICAgICAgICAgICAgIlwiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gXCIiICsKLSAgICAgICAgICAgICBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfLT5uYW1lKCkgKyAiXCIsIHdoaWNoIGlzIG5vdCAiCi0gICAgICAgICAgICAgImltcG9ydGVkIGJ5IFwiIiArIGZpbGVuYW1lXyArICJcIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgIgotICAgICAgICAgICAgICJhZGQgdGhlIG5lY2Vzc2FyeSBpbXBvcnQuIik7CisgICAgaWYgKHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gIT0gTlVMTCkgeworICAgICAgQWRkRXJyb3IoZWxlbWVudF9uYW1lLCBkZXNjcmlwdG9yLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICJcIiIgKyBwb3NzaWJsZV91bmRlY2xhcmVkX2RlcGVuZGVuY3lfbmFtZV8gKworICAgICAgICAgICAgICAgIlwiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gXCIiICsKKyAgICAgICAgICAgICAgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8tPm5hbWUoKSArICJcIiwgd2hpY2ggaXMgbm90ICIKKyAgICAgICAgICAgICAgICJpbXBvcnRlZCBieSBcIiIgKyBmaWxlbmFtZV8gKyAiXCIuICBUbyB1c2UgaXQgaGVyZSwgcGxlYXNlICIKKyAgICAgICAgICAgICAgICJhZGQgdGhlIG5lY2Vzc2FyeSBpbXBvcnQuIik7CisgICAgfQorICAgIGlmICghdW5kZWZpbmVfcmVzb2x2ZWRfbmFtZV8uZW1wdHkoKSkgeworICAgICAgQWRkRXJyb3IoZWxlbWVudF9uYW1lLCBkZXNjcmlwdG9yLCBsb2NhdGlvbiwKKyAgICAgICAgICAgICAgICJcIiIgKyB1bmRlZmluZWRfc3ltYm9sICsgIlwiIGlzIHJlc29sdmVkIHRvIFwiIiArCisgICAgICAgICAgICAgICB1bmRlZmluZV9yZXNvbHZlZF9uYW1lXyArICJcIiwgd2hpY2ggaXMgbm90IGRlZmluZWQuICIKKyAgICAgICAgICAgICAgICJUaGUgaW5uZXJtb3N0IHNjb3BlIGlzIHNlYXJjaGVkIGZpcnN0IGluIG5hbWUgcmVzb2x1dGlvbi4gIgorICAgICAgICAgICAgICAgIkNvbnNpZGVyIHVzaW5nIGEgbGVhZGluZyAnLicoaS5lLiwgXCIuIgorICAgICAgICAgICAgICAgKyB1bmRlZmluZWRfc3ltYm9sICsKKyAgICAgICAgICAgICAgICJcIikgdG8gc3RhcnQgZnJvbSB0aGUgb3V0ZXJtb3N0IHNjb3BlLiIpOworICAgIH0KKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRXYXJuaW5nKAorICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLCBjb25zdCBNZXNzYWdlJiBkZXNjcmlwdG9yLAorICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6RXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICBjb25zdCBzdHJpbmcmIGVycm9yKSB7CisgIGlmIChlcnJvcl9jb2xsZWN0b3JfID09IE5VTEwpIHsKKyAgICBHT09HTEVfTE9HKFdBUk5JTkcpIDw8IGZpbGVuYW1lXyA8PCAiICIgPDwgZWxlbWVudF9uYW1lIDw8ICI6ICIgPDwgZXJyb3I7CisgIH0gZWxzZSB7CisgICAgZXJyb3JfY29sbGVjdG9yXy0+QWRkV2FybmluZyhmaWxlbmFtZV8sIGVsZW1lbnRfbmFtZSwgJmRlc2NyaXB0b3IsIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3IpOwogICB9CiB9CiAKQEAgLTIyNzUsMzEgKzMzMDcsNDggQEAKICAgICAgICAgICAgIGZpbGUtPnBhY2thZ2UoKVtwYWNrYWdlX25hbWUuc2l6ZSgpXSA9PSAnLicpOwogfQogCi1TeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKGNvbnN0IHN0cmluZyYgbmFtZSkgewotICBTeW1ib2wgcmVzdWx0Owordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6UmVjb3JkUHVibGljRGVwZW5kZW5jaWVzKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CisgIGlmIChmaWxlID09IE5VTEwgfHwgIWRlcGVuZGVuY2llc18uaW5zZXJ0KGZpbGUpLnNlY29uZCkgcmV0dXJuOworICBmb3IgKGludCBpID0gMDsgZmlsZSAhPSBOVUxMICYmIGkgPCBmaWxlLT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBSZWNvcmRQdWJsaWNEZXBlbmRlbmNpZXMoZmlsZS0+cHVibGljX2RlcGVuZGVuY3koaSkpOworICB9Cit9CiAKLSAgLy8gV2UgbmVlZCB0byBzZWFyY2ggb3VyIHBvb2wgYW5kIGFsbCBpdHMgdW5kZXJsYXlzLgotICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCA9IHBvb2xfOwotICB3aGlsZSAodHJ1ZSkgewotICAgIC8vIElmIHdlIGFyZSBsb29raW5nIGF0IGFuIHVuZGVybGF5LCB3ZSBtdXN0IGxvY2sgaXRzIG11dGV4Xywgc2luY2Ugd2UgYXJlCi0gICAgLy8gYWNjZXNzaW5nIHRoZSB1bmRlcmxheSdzIHRhYmxlc18gZGlyY2V0bHkuCi0gICAgTXV0ZXhMb2NrTWF5YmUgbG9jaygocG9vbCA9PSBwb29sXykgPyBOVUxMIDogcG9vbC0+bXV0ZXhfKTsKK1N5bWJvbCBEZXNjcmlwdG9yQnVpbGRlcjo6RmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHNIZWxwZXIoCisgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICAvLyBJZiB3ZSBhcmUgbG9va2luZyBhdCBhbiB1bmRlcmxheSwgd2UgbXVzdCBsb2NrIGl0cyBtdXRleF8sIHNpbmNlIHdlIGFyZQorICAvLyBhY2Nlc3NpbmcgdGhlIHVuZGVybGF5J3MgdGFibGVzXyBkaXJlY3RseS4KKyAgTXV0ZXhMb2NrTWF5YmUgbG9jaygocG9vbCA9PSBwb29sXykgPyBOVUxMIDogcG9vbC0+bXV0ZXhfKTsKIAotICAgIC8vIE5vdGUgdGhhdCB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZhbGxiYWNrX2RhdGFiYXNlXyBoZXJlIGJlY2F1c2UgdGhlCi0gICAgLy8gc3ltYm9sIGhhcyB0byBiZSBpbiBvbmUgb2YgaXRzIGZpbGUncyBkaXJlY3QgZGVwZW5kZW5jaWVzLCBhbmQgd2UgaGF2ZQotICAgIC8vIGFscmVhZHkgbG9hZGVkIHRob3NlIGJ5IHRoZSB0aW1lIHdlIGdldCBoZXJlLgotICAgIHJlc3VsdCA9IHBvb2wtPnRhYmxlc18tPkZpbmRTeW1ib2wobmFtZSk7Ci0gICAgaWYgKCFyZXN1bHQuSXNOdWxsKCkpIGJyZWFrOwotICAgIGlmIChwb29sLT51bmRlcmxheV8gPT0gTlVMTCkgcmV0dXJuIGtOdWxsU3ltYm9sOwotICAgIHBvb2wgPSBwb29sLT51bmRlcmxheV87CisgIFN5bWJvbCByZXN1bHQgPSBwb29sLT50YWJsZXNfLT5GaW5kU3ltYm9sKG5hbWUpOworICBpZiAocmVzdWx0LklzTnVsbCgpICYmIHBvb2wtPnVuZGVybGF5XyAhPSBOVUxMKSB7CisgICAgLy8gU3ltYm9sIG5vdCBmb3VuZDsgY2hlY2sgdGhlIHVuZGVybGF5LgorICAgIHJlc3VsdCA9IEZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzSGVscGVyKHBvb2wtPnVuZGVybGF5XywgbmFtZSk7CisgIH0KKworICBpZiAocmVzdWx0LklzTnVsbCgpKSB7CisgICAgLy8gSW4gdGhlb3J5LCB3ZSBzaG91bGRuJ3QgbmVlZCB0byBjaGVjayBmYWxsYmFja19kYXRhYmFzZV8gYmVjYXVzZSB0aGUKKyAgICAvLyBzeW1ib2wgc2hvdWxkIGJlIGluIG9uZSBvZiBpdHMgZmlsZSdzIGRpcmVjdCBkZXBlbmRlbmNpZXMsIGFuZCB3ZSBoYXZlCisgICAgLy8gYWxyZWFkeSBsb2FkZWQgdGhvc2UgYnkgdGhlIHRpbWUgd2UgZ2V0IGhlcmUuICBCdXQgd2UgY2hlY2sgYW55d2F5IHNvCisgICAgLy8gdGhhdCB3ZSBjYW4gZ2VuZXJhdGUgYmV0dGVyIGVycm9yIG1lc3NhZ2Ugd2hlbiBkZXBlbmRlbmNpZXMgYXJlIG1pc3NpbmcKKyAgICAvLyAoaS5lLiwgIm1pc3NpbmcgZGVwZW5kZW5jeSIgcmF0aGVyIHRoYW4gInR5cGUgaXMgbm90IGRlZmluZWQiKS4KKyAgICBpZiAocG9vbC0+VHJ5RmluZFN5bWJvbEluRmFsbGJhY2tEYXRhYmFzZShuYW1lKSkgeworICAgICAgcmVzdWx0ID0gcG9vbC0+dGFibGVzXy0+RmluZFN5bWJvbChuYW1lKTsKKyAgICB9CiAgIH0KIAogICByZXR1cm4gcmVzdWx0OwogfQogCitTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKGNvbnN0IHN0cmluZyYgbmFtZSkgeworICByZXR1cm4gRmluZFN5bWJvbE5vdEVuZm9yY2luZ0RlcHNIZWxwZXIocG9vbF8sIG5hbWUpOworfQorCiBTeW1ib2wgRGVzY3JpcHRvckJ1aWxkZXI6OkZpbmRTeW1ib2woY29uc3Qgc3RyaW5nJiBuYW1lKSB7CiAgIFN5bWJvbCByZXN1bHQgPSBGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcyhuYW1lKTsKIAorICBpZiAocmVzdWx0LklzTnVsbCgpKSByZXR1cm4gcmVzdWx0OworCiAgIGlmICghcG9vbF8tPmVuZm9yY2VfZGVwZW5kZW5jaWVzXykgewogICAgIC8vIEhhY2sgZm9yIENvbXBpbGVyVXBncmFkZXIuCiAgICAgcmV0dXJuIHJlc3VsdDsKQEAgLTIzMDgsOSArMzM1Nyw5IEBACiAgIC8vIE9ubHkgZmluZCBzeW1ib2xzIHdoaWNoIHdlcmUgZGVmaW5lZCBpbiB0aGlzIGZpbGUgb3Igb25lIG9mIGl0cwogICAvLyBkZXBlbmRlbmNpZXMuCiAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcmVzdWx0LkdldEZpbGUoKTsKLSAgaWYgKGZpbGUgPT0gZmlsZV8pIHJldHVybiByZXN1bHQ7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZV8tPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7Ci0gICAgaWYgKGZpbGUgPT0gZmlsZV8tPmRlcGVuZGVuY3koaSkpIHJldHVybiByZXN1bHQ7CisgIGlmIChmaWxlID09IGZpbGVfIHx8IGRlcGVuZGVuY2llc18uY291bnQoZmlsZSkgPiAwKSB7CisgICAgdW51c2VkX2RlcGVuZGVuY3lfLmVyYXNlKGZpbGUpOworICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIAogICBpZiAocmVzdWx0LnR5cGUgPT0gU3ltYm9sOjpQQUNLQUdFKSB7CkBAIC0yMzIyLDEyICszMzcxLDEwIEBACiAgICAgLy8gZGVwZW5kZW5jeSBhbHNvIGRlZmluZXMgdGhlIHNhbWUgcGFja2FnZS4gIFdlIGNhbid0IHJlYWxseSBydWxlIG91dCB0aGlzCiAgICAgLy8gc3ltYm9sIHVubGVzcyBub25lIG9mIHRoZSBkZXBlbmRlbmNpZXMgZGVmaW5lIGl0LgogICAgIGlmIChJc0luUGFja2FnZShmaWxlXywgbmFtZSkpIHJldHVybiByZXN1bHQ7Ci0gICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWxlXy0+ZGVwZW5kZW5jeV9jb3VudCgpOyBpKyspIHsKKyAgICBmb3IgKHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGRlcGVuZGVuY2llc18uYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGRlcGVuZGVuY2llc18uZW5kKCk7ICsraXQpIHsKICAgICAgIC8vIE5vdGU6ICBBIGRlcGVuZGVuY3kgbWF5IGJlIE5VTEwgaWYgaXQgd2FzIG5vdCBmb3VuZCBvciBoYWQgZXJyb3JzLgotICAgICAgaWYgKGZpbGVfLT5kZXBlbmRlbmN5KGkpICE9IE5VTEwgJiYKLSAgICAgICAgICBJc0luUGFja2FnZShmaWxlXy0+ZGVwZW5kZW5jeShpKSwgbmFtZSkpIHsKLSAgICAgICAgcmV0dXJuIHJlc3VsdDsKLSAgICAgIH0KKyAgICAgIGlmICgqaXQgIT0gTlVMTCAmJiBJc0luUGFja2FnZSgqaXQsIG5hbWUpKSByZXR1cm4gcmVzdWx0OwogICAgIH0KICAgfQogCkBAIC0yMzM5LDYgKzMzODYsNyBAQAogU3ltYm9sIERlc2NyaXB0b3JCdWlsZGVyOjpMb29rdXBTeW1ib2xOb1BsYWNlaG9sZGVyKAogICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiByZWxhdGl2ZV90bywgUmVzb2x2ZU1vZGUgcmVzb2x2ZV9tb2RlKSB7CiAgIHBvc3NpYmxlX3VuZGVjbGFyZWRfZGVwZW5kZW5jeV8gPSBOVUxMOworICB1bmRlZmluZV9yZXNvbHZlZF9uYW1lXy5jbGVhcigpOwogCiAgIGlmIChuYW1lLnNpemUoKSA+IDAgJiYgbmFtZVswXSA9PSAnLicpIHsKICAgICAvLyBGdWxseS1xdWFsaWZpZWQgbmFtZS4KQEAgLTIzODcsNyArMzQzNSwxMSBAQAogICAgICAgICBpZiAocmVzdWx0LklzQWdncmVnYXRlKCkpIHsKICAgICAgICAgICBzY29wZV90b190cnkuYXBwZW5kKG5hbWUsIGZpcnN0X3BhcnRfb2ZfbmFtZS5zaXplKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lLnNpemUoKSAtIGZpcnN0X3BhcnRfb2ZfbmFtZS5zaXplKCkpOwotICAgICAgICAgIHJldHVybiBGaW5kU3ltYm9sKHNjb3BlX3RvX3RyeSk7CisgICAgICAgICAgcmVzdWx0ID0gRmluZFN5bWJvbChzY29wZV90b190cnkpOworICAgICAgICAgIGlmIChyZXN1bHQuSXNOdWxsKCkpIHsKKyAgICAgICAgICAgIHVuZGVmaW5lX3Jlc29sdmVkX25hbWVfID0gc2NvcGVfdG9fdHJ5OworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0OwogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8vIFdlIGZvdW5kIGEgc3ltYm9sIGJ1dCBpdCdzIG5vdCBhbiBhZ2dyZWdhdGUuICBDb250aW51ZSB0aGUgbG9vcC4KICAgICAgICAgfQpAQCAtMjQ0MCwyMSArMzQ5MiwxNCBAQAogICAgIHBsYWNlaG9sZGVyX25hbWUgPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZygKICAgICAgIHBsYWNlaG9sZGVyX2Z1bGxfbmFtZS0+c3Vic3RyKGRvdHBvcyArIDEpKTsKICAgfSBlbHNlIHsKLSAgICBwbGFjZWhvbGRlcl9wYWNrYWdlID0gJmtFbXB0eVN0cmluZzsKKyAgICBwbGFjZWhvbGRlcl9wYWNrYWdlID0gJmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICAgIHBsYWNlaG9sZGVyX25hbWUgPSBwbGFjZWhvbGRlcl9mdWxsX25hbWU7CiAgIH0KIAogICAvLyBDcmVhdGUgdGhlIHBsYWNlaG9sZGVycy4KLSAgRmlsZURlc2NyaXB0b3IqIHBsYWNlaG9sZGVyX2ZpbGUgPSB0YWJsZXNfLT5BbGxvY2F0ZTxGaWxlRGVzY3JpcHRvcj4oKTsKLSAgbWVtc2V0KHBsYWNlaG9sZGVyX2ZpbGUsIDAsIHNpemVvZigqcGxhY2Vob2xkZXJfZmlsZSkpOwotCi0gIHBsYWNlaG9sZGVyX2ZpbGUtPm5hbWVfID0KLSAgICB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZygqcGxhY2Vob2xkZXJfZnVsbF9uYW1lICsgIi5wbGFjZWhvbGRlci5wcm90byIpOworICBGaWxlRGVzY3JpcHRvciogcGxhY2Vob2xkZXJfZmlsZSA9IE5ld1BsYWNlaG9sZGVyRmlsZSgKKyAgICAgICpwbGFjZWhvbGRlcl9mdWxsX25hbWUgKyAiLnBsYWNlaG9sZGVyLnByb3RvIik7CiAgIHBsYWNlaG9sZGVyX2ZpbGUtPnBhY2thZ2VfID0gcGxhY2Vob2xkZXJfcGFja2FnZTsKLSAgcGxhY2Vob2xkZXJfZmlsZS0+cG9vbF8gPSBwb29sXzsKLSAgcGxhY2Vob2xkZXJfZmlsZS0+b3B0aW9uc18gPSAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgcGxhY2Vob2xkZXJfZmlsZS0+dGFibGVzXyA9ICZGaWxlRGVzY3JpcHRvclRhYmxlczo6a0VtcHR5OwotICAvLyBBbGwgb3RoZXIgZmllbGRzIGFyZSB6ZXJvIG9yIE5VTEwuCiAKICAgaWYgKHBsYWNlaG9sZGVyX3R5cGUgPT0gUExBQ0VIT0xERVJfRU5VTSkgewogICAgIHBsYWNlaG9sZGVyX2ZpbGUtPmVudW1fdHlwZV9jb3VudF8gPSAxOwpAQCAtMjUxOCwxNiArMzU2MywxOSBAQAogICB9CiB9CiAKLWNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yQnVpbGRlcjo6TmV3UGxhY2Vob2xkZXJGaWxlKAorRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JCdWlsZGVyOjpOZXdQbGFjZWhvbGRlckZpbGUoCiAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSB7CiAgIEZpbGVEZXNjcmlwdG9yKiBwbGFjZWhvbGRlciA9IHRhYmxlc18tPkFsbG9jYXRlPEZpbGVEZXNjcmlwdG9yPigpOwogICBtZW1zZXQocGxhY2Vob2xkZXIsIDAsIHNpemVvZigqcGxhY2Vob2xkZXIpKTsKIAogICBwbGFjZWhvbGRlci0+bmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhuYW1lKTsKLSAgcGxhY2Vob2xkZXItPnBhY2thZ2VfID0gJmtFbXB0eVN0cmluZzsKKyAgcGxhY2Vob2xkZXItPnBhY2thZ2VfID0gJmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICBwbGFjZWhvbGRlci0+cG9vbF8gPSBwb29sXzsKICAgcGxhY2Vob2xkZXItPm9wdGlvbnNfID0gJkZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIHBsYWNlaG9sZGVyLT50YWJsZXNfID0gJkZpbGVEZXNjcmlwdG9yVGFibGVzOjprRW1wdHk7CisgIHBsYWNlaG9sZGVyLT50YWJsZXNfID0gJkZpbGVEZXNjcmlwdG9yVGFibGVzOjpHZXRFbXB0eUluc3RhbmNlKCk7CisgIHBsYWNlaG9sZGVyLT5zb3VyY2VfY29kZV9pbmZvXyA9ICZTb3VyY2VDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpOworICBwbGFjZWhvbGRlci0+aXNfcGxhY2Vob2xkZXJfID0gdHJ1ZTsKKyAgcGxhY2Vob2xkZXItPnN5bnRheF8gPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMjsKICAgLy8gQWxsIG90aGVyIGZpZWxkcyBhcmUgemVybyBvciBOVUxMLgogCiAgIHJldHVybiBwbGFjZWhvbGRlcjsKQEAgLTI2NjgsNyArMzcxNiwxMSBAQAogICAvLyAgICAgICB0YWJsZXNfLT5BbGxvY2F0ZU1lc3NhZ2U8dHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlPigpOwogICB0eXBlbmFtZSBEZXNjcmlwdG9yVDo6T3B0aW9uc1R5cGUqIGNvbnN0IGR1bW15ID0gTlVMTDsKICAgdHlwZW5hbWUgRGVzY3JpcHRvclQ6Ok9wdGlvbnNUeXBlKiBvcHRpb25zID0gdGFibGVzXy0+QWxsb2NhdGVNZXNzYWdlKGR1bW15KTsKLSAgb3B0aW9ucy0+Q29weUZyb20ob3JpZ19vcHRpb25zKTsKKyAgLy8gQXZvaWQgdXNpbmcgTWVyZ2VGcm9tKCkvQ29weUZyb20oKSBpbiB0aGlzIGNsYXNzIHRvIG1ha2UgaXQgLWZuby1ydHRpCisgIC8vIGZyaWVuZGx5LiBXaXRob3V0IFJUVEksIE1lcmdlRnJvbSgpIGFuZCBDb3B5RnJvbSgpIHdpbGwgZmFsbGJhY2sgdG8gdGhlCisgIC8vIHJlZmxlY3Rpb24gYmFzZWQgbWV0aG9kLCB3aGljaCByZXF1aXJlcyB0aGUgRGVzY3JpcHRvci4gSG93ZXZlciwgd2UgYXJlIGluCisgIC8vIHRoZSBtaWRkbGUgb2YgYnVpbGRpbmcgdGhlIGRlc2NyaXB0b3JzLCB0aHVzIHRoZSBkZWFkbG9jay4KKyAgb3B0aW9ucy0+UGFyc2VGcm9tU3RyaW5nKG9yaWdfb3B0aW9ucy5TZXJpYWxpemVBc1N0cmluZygpKTsKICAgZGVzY3JpcHRvci0+b3B0aW9uc18gPSBvcHRpb25zOwogCiAgIC8vIERvbid0IGFkZCB0byBvcHRpb25zX3RvX2ludGVycHJldF8gdW5sZXNzIHRoZXJlIHdlcmUgdW5pbnRlcnByZXRlZApAQCAtMjY5NCw2ICszNzQ2LDUzIEBACiAgICAgTUVUSE9EKElOUFVULk5BTUUoaSksIFBBUkVOVCwgT1VUUFVULT5OQU1FIyNzXyArIGkpOyAgICAgICAgICAgICBcCiAgIH0KIAordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QWRkUmVjdXJzaXZlSW1wb3J0RXJyb3IoCisgICAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgcHJvdG8sIGludCBmcm9tX2hlcmUpIHsKKyAgc3RyaW5nIGVycm9yX21lc3NhZ2UoIkZpbGUgcmVjdXJzaXZlbHkgaW1wb3J0cyBpdHNlbGY6ICIpOworICBmb3IgKGludCBpID0gZnJvbV9oZXJlOyBpIDwgdGFibGVzXy0+cGVuZGluZ19maWxlc18uc2l6ZSgpOyBpKyspIHsKKyAgICBlcnJvcl9tZXNzYWdlLmFwcGVuZCh0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzX1tpXSk7CisgICAgZXJyb3JfbWVzc2FnZS5hcHBlbmQoIiAtPiAiKTsKKyAgfQorICBlcnJvcl9tZXNzYWdlLmFwcGVuZChwcm90by5uYW1lKCkpOworCisgIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgIGVycm9yX21lc3NhZ2UpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRUd2ljZUxpc3RlZEVycm9yKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIHsKKyAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGluZGV4KSArICJcIiB3YXMgbGlzdGVkIHR3aWNlLiIpOworfQorCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpBZGRJbXBvcnRFcnJvcihjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgeworICBzdHJpbmcgbWVzc2FnZTsKKyAgaWYgKHBvb2xfLT5mYWxsYmFja19kYXRhYmFzZV8gPT0gTlVMTCkgeworICAgIG1lc3NhZ2UgPSAiSW1wb3J0IFwiIiArIHByb3RvLmRlcGVuZGVuY3koaW5kZXgpICsKKyAgICAgICAgICAgICAgIlwiIGhhcyBub3QgYmVlbiBsb2FkZWQuIjsKKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlID0gIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGluZGV4KSArCisgICAgICAgICAgICAgICJcIiB3YXMgbm90IGZvdW5kIG9yIGhhZCBlcnJvcnMuIjsKKyAgfQorICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLCBtZXNzYWdlKTsKK30KKworc3RhdGljIGJvb2wgRXhpc3RpbmdGaWxlTWF0Y2hlc1Byb3RvKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBleGlzdGluZ19maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZXhpc3RpbmdfcHJvdG87CisgIGV4aXN0aW5nX2ZpbGUtPkNvcHlUbygmZXhpc3RpbmdfcHJvdG8pOworICAvLyBUT0RPKGxpdWppc2kpOiBSZW1vdmUgaXQgd2hlbiBDb3B5VG8gc3VwcG9ydHMgY29weWluZyBzeW50YXggcGFyYW1zIHdoZW4KKyAgLy8gc3ludGF4PSJwcm90bzIiLgorICBpZiAoZXhpc3RpbmdfZmlsZS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzIgJiYKKyAgICAgIHByb3RvLmhhc19zeW50YXgoKSkgeworICAgIGV4aXN0aW5nX3Byb3RvLnNldF9zeW50YXgoCisgICAgICAgIGV4aXN0aW5nX2ZpbGUtPlN5bnRheE5hbWUoZXhpc3RpbmdfZmlsZS0+c3ludGF4KCkpKTsKKyAgfQorCisgIHJldHVybiBleGlzdGluZ19wcm90by5TZXJpYWxpemVBc1N0cmluZygpID09IHByb3RvLlNlcmlhbGl6ZUFzU3RyaW5nKCk7Cit9CisKIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRGaWxlKAogICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CiAgIGZpbGVuYW1lXyA9IHByb3RvLm5hbWUoKTsKQEAgLTI3MDIsMTMgKzM4MDEsMTEgQEAKICAgLy8gTm90ZTogIFRoaXMgb25seSB3b3JrcyBpZiB0aGUgaW5wdXQgaXMgY2Fub25pY2FsIC0tIHRoYXQgaXMsIGl0CiAgIC8vICAgZnVsbHktcXVhbGlmaWVzIGFsbCB0eXBlIG5hbWVzLCBoYXMgbm8gVW5pbnRlcnByZXRlZE9wdGlvbnMsIGV0Yy4KICAgLy8gICBUaGlzIGlzIGZpbmUsIGJlY2F1c2UgdGhpcyBpZGVtcG90ZW5jeSAiZmVhdHVyZSIgcmVhbGx5IG9ubHkgZXhpc3RzIHRvCi0gIC8vICAgYWNjb21vZGF0ZSBvbmUgaGFjayBpbiB0aGUgcHJvdG8xLT5wcm90bzIgbWlncmF0aW9uIGxheWVyLgorICAvLyAgIGFjY29tbW9kYXRlIG9uZSBoYWNrIGluIHRoZSBwcm90bzEtPnByb3RvMiBtaWdyYXRpb24gbGF5ZXIuCiAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBleGlzdGluZ19maWxlID0gdGFibGVzXy0+RmluZEZpbGUoZmlsZW5hbWVfKTsKICAgaWYgKGV4aXN0aW5nX2ZpbGUgIT0gTlVMTCkgewogICAgIC8vIEZpbGUgYWxyZWFkeSBpbiBwb29sLiAgQ29tcGFyZSB0aGUgZXhpc3Rpbmcgb25lIHRvIHRoZSBpbnB1dC4KLSAgICBGaWxlRGVzY3JpcHRvclByb3RvIGV4aXN0aW5nX3Byb3RvOwotICAgIGV4aXN0aW5nX2ZpbGUtPkNvcHlUbygmZXhpc3RpbmdfcHJvdG8pOwotICAgIGlmIChleGlzdGluZ19wcm90by5TZXJpYWxpemVBc1N0cmluZygpID09IHByb3RvLlNlcmlhbGl6ZUFzU3RyaW5nKCkpIHsKKyAgICBpZiAoRXhpc3RpbmdGaWxlTWF0Y2hlc1Byb3RvKGV4aXN0aW5nX2ZpbGUsIHByb3RvKSkgewogICAgICAgLy8gVGhleSdyZSBpZGVudGljYWwuICBSZXR1cm4gdGhlIGV4aXN0aW5nIGRlc2NyaXB0b3IuCiAgICAgICByZXR1cm4gZXhpc3RpbmdfZmlsZTsKICAgICB9CkBAIC0yNzI3LDE1ICszODI0LDcgQEAKICAgLy8gICBhdCBhbGwuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGFibGVzXy0+cGVuZGluZ19maWxlc18uc2l6ZSgpOyBpKyspIHsKICAgICBpZiAodGFibGVzXy0+cGVuZGluZ19maWxlc19baV0gPT0gcHJvdG8ubmFtZSgpKSB7Ci0gICAgICBzdHJpbmcgZXJyb3JfbWVzc2FnZSgiRmlsZSByZWN1cnNpdmVseSBpbXBvcnRzIGl0c2VsZjogIik7Ci0gICAgICBmb3IgKDsgaSA8IHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfLnNpemUoKTsgaSsrKSB7Ci0gICAgICAgIGVycm9yX21lc3NhZ2UuYXBwZW5kKHRhYmxlc18tPnBlbmRpbmdfZmlsZXNfW2ldKTsKLSAgICAgICAgZXJyb3JfbWVzc2FnZS5hcHBlbmQoIiAtPiAiKTsKLSAgICAgIH0KLSAgICAgIGVycm9yX21lc3NhZ2UuYXBwZW5kKHByb3RvLm5hbWUoKSk7Ci0KLSAgICAgIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICBlcnJvcl9tZXNzYWdlKTsKKyAgICAgIEFkZFJlY3Vyc2l2ZUltcG9ydEVycm9yKHByb3RvLCBpKTsKICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgfQpAQCAtMjc1NSwxMyArMzg0NCwyNiBAQAogICAgIH0KICAgICB0YWJsZXNfLT5wZW5kaW5nX2ZpbGVzXy5wb3BfYmFjaygpOwogICB9CisgIHJldHVybiBCdWlsZEZpbGVJbXBsKHByb3RvKTsKK30KIAorY29uc3QgRmlsZURlc2NyaXB0b3IqIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZEZpbGVJbXBsKAorICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CiAgIC8vIENoZWNrcG9pbnQgdGhlIHRhYmxlcyBzbyB0aGF0IHdlIGNhbiByb2xsIGJhY2sgaWYgc29tZXRoaW5nIGdvZXMgd3JvbmcuCi0gIHRhYmxlc18tPkNoZWNrcG9pbnQoKTsKKyAgdGFibGVzXy0+QWRkQ2hlY2twb2ludCgpOwogCiAgIEZpbGVEZXNjcmlwdG9yKiByZXN1bHQgPSB0YWJsZXNfLT5BbGxvY2F0ZTxGaWxlRGVzY3JpcHRvcj4oKTsKICAgZmlsZV8gPSByZXN1bHQ7CiAKKyAgcmVzdWx0LT5pc19wbGFjZWhvbGRlcl8gPSBmYWxzZTsKKyAgaWYgKHByb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKKyAgICBTb3VyY2VDb2RlSW5mbyAqaW5mbyA9IHRhYmxlc18tPkFsbG9jYXRlTWVzc2FnZTxTb3VyY2VDb2RlSW5mbz4oKTsKKyAgICBpbmZvLT5Db3B5RnJvbShwcm90by5zb3VyY2VfY29kZV9pbmZvKCkpOworICAgIHJlc3VsdC0+c291cmNlX2NvZGVfaW5mb18gPSBpbmZvOworICB9IGVsc2UgeworICAgIHJlc3VsdC0+c291cmNlX2NvZGVfaW5mb18gPSAmU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKTsKKyAgfQorCiAgIGZpbGVfdGFibGVzXyA9IHRhYmxlc18tPkFsbG9jYXRlRmlsZVRhYmxlcygpOwogICBmaWxlXy0+dGFibGVzXyA9IGZpbGVfdGFibGVzXzsKIApAQCAtMjc3MCw2ICszODcyLDE4IEBACiAgICAgICAgICAgICAgIk1pc3NpbmcgZmllbGQ6IEZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZS4iKTsKICAgfQogCisgIC8vIFRPRE8obGl1amlzaSk6IFJlcG9ydCBlcnJvciB3aGVuIHRoZSBzeW50YXggaXMgZW1wdHkgYWZ0ZXIgYWxsIHRoZSBwcm90b3MKKyAgLy8gaGF2ZSBhZGRlZCB0aGUgc3ludGF4IHN0YXRlbWVudC4KKyAgaWYgKHByb3RvLnN5bnRheCgpLmVtcHR5KCkgfHwgcHJvdG8uc3ludGF4KCkgPT0gInByb3RvMiIpIHsKKyAgICBmaWxlXy0+c3ludGF4XyA9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8yOworICB9IGVsc2UgaWYgKHByb3RvLnN5bnRheCgpID09ICJwcm90bzMiKSB7CisgICAgZmlsZV8tPnN5bnRheF8gPSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKKyAgfSBlbHNlIHsKKyAgICBmaWxlXy0+c3ludGF4XyA9IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfVU5LTk9XTjsKKyAgICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICJVbnJlY29nbml6ZWQgc3ludGF4OiAiICsgcHJvdG8uc3ludGF4KCkpOworICB9CisKICAgcmVzdWx0LT5uYW1lXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLm5hbWUoKSk7CiAgIGlmIChwcm90by5oYXNfcGFja2FnZSgpKSB7CiAgICAgcmVzdWx0LT5wYWNrYWdlXyA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLnBhY2thZ2UoKSk7CkBAIC0yNzg4LDcgKzM5MDIsNyBAQAogICAgICAgICAgICAgICJBIGZpbGUgd2l0aCB0aGlzIG5hbWUgaXMgYWxyZWFkeSBpbiB0aGUgcG9vbC4iKTsKICAgICAvLyBCYWlsIG91dCBlYXJseSBzbyB0aGF0IGlmIHRoaXMgaXMgYWN0dWFsbHkgdGhlIGV4YWN0IHNhbWUgZmlsZSwgd2UKICAgICAvLyBkb24ndCBlbmQgdXAgcmVwb3J0aW5nIHRoYXQgZXZlcnkgc2luZ2xlIHN5bWJvbCBpcyBhbHJlYWR5IGRlZmluZWQuCi0gICAgdGFibGVzXy0+Um9sbGJhY2soKTsKKyAgICB0YWJsZXNfLT5Sb2xsYmFja1RvTGFzdENoZWNrcG9pbnQoKTsKICAgICByZXR1cm4gTlVMTDsKICAgfQogICBpZiAoIXJlc3VsdC0+cGFja2FnZSgpLmVtcHR5KCkpIHsKQEAgLTI4MDAsMTEgKzM5MTQsMTQgQEAKICAgcmVzdWx0LT5kZXBlbmRlbmN5X2NvdW50XyA9IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpOwogICByZXN1bHQtPmRlcGVuZGVuY2llc18gPQogICAgIHRhYmxlc18tPkFsbG9jYXRlQXJyYXk8Y29uc3QgRmlsZURlc2NyaXB0b3IqPihwcm90by5kZXBlbmRlbmN5X3NpemUoKSk7CisgIHVudXNlZF9kZXBlbmRlbmN5Xy5jbGVhcigpOworICBzZXQ8aW50PiB3ZWFrX2RlcHM7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ud2Vha19kZXBlbmRlbmN5X3NpemUoKTsgKytpKSB7CisgICAgd2Vha19kZXBzLmluc2VydChwcm90by53ZWFrX2RlcGVuZGVuY3koaSkpOworICB9CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8uZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgewogICAgIGlmICghc2Vlbl9kZXBlbmRlbmNpZXMuaW5zZXJ0KHByb3RvLmRlcGVuZGVuY3koaSkpLnNlY29uZCkgewotICAgICAgQWRkRXJyb3IocHJvdG8ubmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICAiSW1wb3J0IFwiIiArIHByb3RvLmRlcGVuZGVuY3koaSkgKyAiXCIgd2FzIGxpc3RlZCB0d2ljZS4iKTsKKyAgICAgIEFkZFR3aWNlTGlzdGVkRXJyb3IocHJvdG8sIGkpOwogICAgIH0KIAogICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBkZXBlbmRlbmN5ID0gdGFibGVzXy0+RmluZEZpbGUocHJvdG8uZGVwZW5kZW5jeShpKSk7CkBAIC0yODEzLDI2ICszOTMwLDY3IEBACiAgICAgfQogCiAgICAgaWYgKGRlcGVuZGVuY3kgPT0gTlVMTCkgewotICAgICAgaWYgKHBvb2xfLT5hbGxvd191bmtub3duXykgeworICAgICAgaWYgKHBvb2xfLT5hbGxvd191bmtub3duXyB8fAorICAgICAgICAgICghcG9vbF8tPmVuZm9yY2Vfd2Vha18gJiYgd2Vha19kZXBzLmZpbmQoaSkgIT0gd2Vha19kZXBzLmVuZCgpKSkgewogICAgICAgICBkZXBlbmRlbmN5ID0gTmV3UGxhY2Vob2xkZXJGaWxlKHByb3RvLmRlcGVuZGVuY3koaSkpOwogICAgICAgfSBlbHNlIHsKLSAgICAgICAgc3RyaW5nIG1lc3NhZ2U7Ci0gICAgICAgIGlmIChwb29sXy0+ZmFsbGJhY2tfZGF0YWJhc2VfID09IE5VTEwpIHsKLSAgICAgICAgICBtZXNzYWdlID0gIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGkpICsKLSAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBub3QgYmVlbiBsb2FkZWQuIjsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBtZXNzYWdlID0gIkltcG9ydCBcIiIgKyBwcm90by5kZXBlbmRlbmN5KGkpICsKLSAgICAgICAgICAgICAgICAgICAgIlwiIHdhcyBub3QgZm91bmQgb3IgaGFkIGVycm9ycy4iOwotICAgICAgICB9Ci0gICAgICAgIEFkZEVycm9yKHByb3RvLm5hbWUoKSwgcHJvdG8sCi0gICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCi0gICAgICAgICAgICAgICAgIG1lc3NhZ2UpOworICAgICAgICBBZGRJbXBvcnRFcnJvcihwcm90bywgaSk7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIEFkZCB0byB1bnVzZWRfZGVwZW5kZW5jeV8gdG8gdHJhY2sgdW51c2VkIGltcG9ydGVkIGZpbGVzLgorICAgICAgLy8gTm90ZTogZG8gbm90IHRyYWNrIHVudXNlZCBpbXBvcnRlZCBmaWxlcyBmb3IgcHVibGljIGltcG9ydC4KKyAgICAgIGlmIChwb29sXy0+ZW5mb3JjZV9kZXBlbmRlbmNpZXNfICYmCisgICAgICAgICAgKHBvb2xfLT51bnVzZWRfaW1wb3J0X3RyYWNrX2ZpbGVzXy5maW5kKHByb3RvLm5hbWUoKSkgIT0KKyAgICAgICAgICAgcG9vbF8tPnVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLmVuZCgpKSAmJgorICAgICAgICAgIChkZXBlbmRlbmN5LT5wdWJsaWNfZGVwZW5kZW5jeV9jb3VudCgpID09IDApKSB7CisgICAgICAgIHVudXNlZF9kZXBlbmRlbmN5Xy5pbnNlcnQoZGVwZW5kZW5jeSk7CiAgICAgICB9CiAgICAgfQogCiAgICAgcmVzdWx0LT5kZXBlbmRlbmNpZXNfW2ldID0gZGVwZW5kZW5jeTsKICAgfQogCisgIC8vIENoZWNrIHB1YmxpYyBkZXBlbmRlbmNpZXMuCisgIGludCBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudCA9IDA7CisgIHJlc3VsdC0+cHVibGljX2RlcGVuZGVuY2llc18gPSB0YWJsZXNfLT5BbGxvY2F0ZUFycmF5PGludD4oCisgICAgICBwcm90by5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHByb3RvLnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgLy8gT25seSBwdXQgdmFsaWQgcHVibGljIGRlcGVuZGVuY3kgaW5kZXhlcy4KKyAgICBpbnQgaW5kZXggPSBwcm90by5wdWJsaWNfZGVwZW5kZW5jeShpKTsKKyAgICBpZiAoaW5kZXggPj0gMCAmJiBpbmRleCA8IHByb3RvLmRlcGVuZGVuY3lfc2l6ZSgpKSB7CisgICAgICByZXN1bHQtPnB1YmxpY19kZXBlbmRlbmNpZXNfW3B1YmxpY19kZXBlbmRlbmN5X2NvdW50KytdID0gaW5kZXg7CisgICAgICAvLyBEbyBub3QgdHJhY2sgdW51c2VkIGltcG9ydGVkIGZpbGVzIGZvciBwdWJsaWMgaW1wb3J0LgorICAgICAgdW51c2VkX2RlcGVuZGVuY3lfLmVyYXNlKHJlc3VsdC0+ZGVwZW5kZW5jeShpbmRleCkpOworICAgIH0gZWxzZSB7CisgICAgICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHB1YmxpYyBkZXBlbmRlbmN5IGluZGV4LiIpOworICAgIH0KKyAgfQorICByZXN1bHQtPnB1YmxpY19kZXBlbmRlbmN5X2NvdW50XyA9IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50OworCisgIC8vIEJ1aWxkIGRlcGVuZGVuY3kgc2V0CisgIGRlcGVuZGVuY2llc18uY2xlYXIoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQtPmRlcGVuZGVuY3lfY291bnQoKTsgaSsrKSB7CisgICAgUmVjb3JkUHVibGljRGVwZW5kZW5jaWVzKHJlc3VsdC0+ZGVwZW5kZW5jeShpKSk7CisgIH0KKworICAvLyBDaGVjayB3ZWFrIGRlcGVuZGVuY2llcy4KKyAgaW50IHdlYWtfZGVwZW5kZW5jeV9jb3VudCA9IDA7CisgIHJlc3VsdC0+d2Vha19kZXBlbmRlbmNpZXNfID0gdGFibGVzXy0+QWxsb2NhdGVBcnJheTxpbnQ+KAorICAgICAgcHJvdG8ud2Vha19kZXBlbmRlbmN5X3NpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ud2Vha19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgaW50IGluZGV4ID0gcHJvdG8ud2Vha19kZXBlbmRlbmN5KGkpOworICAgIGlmIChpbmRleCA+PSAwICYmIGluZGV4IDwgcHJvdG8uZGVwZW5kZW5jeV9zaXplKCkpIHsKKyAgICAgIHJlc3VsdC0+d2Vha19kZXBlbmRlbmNpZXNfW3dlYWtfZGVwZW5kZW5jeV9jb3VudCsrXSA9IGluZGV4OworICAgIH0gZWxzZSB7CisgICAgICBBZGRFcnJvcihwcm90by5uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgICJJbnZhbGlkIHdlYWsgZGVwZW5kZW5jeSBpbmRleC4iKTsKKyAgICB9CisgIH0KKyAgcmVzdWx0LT53ZWFrX2RlcGVuZGVuY3lfY291bnRfID0gd2Vha19kZXBlbmRlbmN5X2NvdW50OworCiAgIC8vIENvbnZlcnQgY2hpbGRyZW4uCiAgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIG1lc3NhZ2VfdHlwZSwgQnVpbGRNZXNzYWdlICAsIE5VTEwpOwogICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBlbnVtX3R5cGUgICAsIEJ1aWxkRW51bSAgICAgLCBOVUxMKTsKQEAgLTI4NjksMTEgKzQwMjcsMjQgQEAKICAgICBWYWxpZGF0ZUZpbGVPcHRpb25zKHJlc3VsdCwgcHJvdG8pOwogICB9CiAKKyAgLy8gQWRkaXRpb25hbCBuYW1pbmcgY29uZmxpY3QgY2hlY2sgZm9yIG1hcCBlbnRyeSB0eXBlcy4gT25seSBuZWVkIHRvIGNoZWNrCisgIC8vIHRoaXMgaWYgdGhlcmUgYXJlIGFscmVhZHkgZXJyb3JzLgogICBpZiAoaGFkX2Vycm9yc18pIHsKLSAgICB0YWJsZXNfLT5Sb2xsYmFjaygpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ubWVzc2FnZV90eXBlX3NpemUoKTsgKytpKSB7CisgICAgICBEZXRlY3RNYXBDb25mbGljdHMocmVzdWx0LT5tZXNzYWdlX3R5cGUoaSksIHByb3RvLm1lc3NhZ2VfdHlwZShpKSk7CisgICAgfQorICB9CisKKworICBpZiAoIXVudXNlZF9kZXBlbmRlbmN5Xy5lbXB0eSgpKSB7CisgICAgTG9nVW51c2VkRGVwZW5kZW5jeShwcm90bywgcmVzdWx0KTsKKyAgfQorCisgIGlmIChoYWRfZXJyb3JzXykgeworICAgIHRhYmxlc18tPlJvbGxiYWNrVG9MYXN0Q2hlY2twb2ludCgpOwogICAgIHJldHVybiBOVUxMOwogICB9IGVsc2UgewotICAgIHRhYmxlc18tPkNoZWNrcG9pbnQoKTsKKyAgICB0YWJsZXNfLT5DbGVhckxhc3RDaGVja3BvaW50KCk7CiAgICAgcmV0dXJuIHJlc3VsdDsKICAgfQogfQpAQCAtMjg5NiwxMSArNDA2NywyNCBAQAogICByZXN1bHQtPmlzX3BsYWNlaG9sZGVyXyAgPSBmYWxzZTsKICAgcmVzdWx0LT5pc191bnF1YWxpZmllZF9wbGFjZWhvbGRlcl8gPSBmYWxzZTsKIAorICAvLyBCdWlsZCBvbmVvZnMgZmlyc3Qgc28gdGhhdCBmaWVsZHMgYW5kIGV4dGVuc2lvbiByYW5nZXMgY2FuIHJlZmVyIHRvIHRoZW0uCisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIG9uZW9mX2RlY2wgICAgICwgQnVpbGRPbmVvZiAgICAgICAgICwgcmVzdWx0KTsKICAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZmllbGQgICAgICAgICAgLCBCdWlsZEZpZWxkICAgICAgICAgLCByZXN1bHQpOwogICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBuZXN0ZWRfdHlwZSAgICAsIEJ1aWxkTWVzc2FnZSAgICAgICAsIHJlc3VsdCk7CiAgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIGVudW1fdHlwZSAgICAgICwgQnVpbGRFbnVtICAgICAgICAgICwgcmVzdWx0KTsKICAgQlVJTERfQVJSQVkocHJvdG8sIHJlc3VsdCwgZXh0ZW5zaW9uX3JhbmdlLCBCdWlsZEV4dGVuc2lvblJhbmdlLCByZXN1bHQpOwogICBCVUlMRF9BUlJBWShwcm90bywgcmVzdWx0LCBleHRlbnNpb24gICAgICAsIEJ1aWxkRXh0ZW5zaW9uICAgICAsIHJlc3VsdCk7CisgIEJVSUxEX0FSUkFZKHByb3RvLCByZXN1bHQsIHJlc2VydmVkX3JhbmdlICwgQnVpbGRSZXNlcnZlZFJhbmdlICwgcmVzdWx0KTsKKworICAvLyBDb3B5IHJlc2VydmVkIG5hbWVzLgorICBpbnQgcmVzZXJ2ZWRfbmFtZV9jb3VudCA9IHByb3RvLnJlc2VydmVkX25hbWVfc2l6ZSgpOworICByZXN1bHQtPnJlc2VydmVkX25hbWVfY291bnRfID0gcmVzZXJ2ZWRfbmFtZV9jb3VudDsKKyAgcmVzdWx0LT5yZXNlcnZlZF9uYW1lc18gPQorICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxjb25zdCBzdHJpbmcqPihyZXNlcnZlZF9uYW1lX2NvdW50KTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXNlcnZlZF9uYW1lX2NvdW50OyArK2kpIHsKKyAgICByZXN1bHQtPnJlc2VydmVkX25hbWVzX1tpXSA9CisgICAgICAgIHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLnJlc2VydmVkX25hbWUoaSkpOworICB9CiAKICAgLy8gQ29weSBvcHRpb25zLgogICBpZiAoIXByb3RvLmhhc19vcHRpb25zKCkpIHsKQEAgLTI5MTIsNyArNDA5NiwzNCBAQAogICBBZGRTeW1ib2wocmVzdWx0LT5mdWxsX25hbWUoKSwgcGFyZW50LCByZXN1bHQtPm5hbWUoKSwKICAgICAgICAgICAgIHByb3RvLCBTeW1ib2wocmVzdWx0KSk7CiAKLSAgLy8gQ2hlY2sgdGhhdCBubyBmaWVsZHMgaGF2ZSBudW1iZXJzIGluIGV4dGVuc2lvbiByYW5nZXMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyBpKyspIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgcmFuZ2UxID0gcHJvdG8ucmVzZXJ2ZWRfcmFuZ2UoaSk7CisgICAgZm9yIChpbnQgaiA9IGkgKyAxOyBqIDwgcHJvdG8ucmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiByYW5nZTIgPSBwcm90by5yZXNlcnZlZF9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZTEuZW5kKCkgPiByYW5nZTIuc3RhcnQoKSAmJiByYW5nZTIuZW5kKCkgPiByYW5nZTEuc3RhcnQoKSkgeworICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90by5yZXNlcnZlZF9yYW5nZShpKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIlJlc2VydmVkIHJhbmdlICQwIHRvICQxIG92ZXJsYXBzIHdpdGggIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhbHJlYWR5LWRlZmluZWQgcmFuZ2UgJDIgdG8gJDMuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTIuc3RhcnQoKSwgcmFuZ2UyLmVuZCgpIC0gMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByYW5nZTEuc3RhcnQoKSwgcmFuZ2UxLmVuZCgpIC0gMSkpOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGhhc2hfc2V0PHN0cmluZz4gcmVzZXJ2ZWRfbmFtZV9zZXQ7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcHJvdG8ucmVzZXJ2ZWRfbmFtZV9zaXplKCk7IGkrKykgeworICAgIGNvbnN0IHN0cmluZyYgbmFtZSA9IHByb3RvLnJlc2VydmVkX25hbWUoaSk7CisgICAgaWYgKHJlc2VydmVkX25hbWVfc2V0LmZpbmQobmFtZSkgPT0gcmVzZXJ2ZWRfbmFtZV9zZXQuZW5kKCkpIHsKKyAgICAgIHJlc2VydmVkX25hbWVfc2V0Lmluc2VydChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgQWRkRXJyb3IobmFtZSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAgICJGaWVsZCBuYW1lIFwiJDBcIiBpcyByZXNlcnZlZCBtdWx0aXBsZSB0aW1lcy4iLAorICAgICAgICAgICAgICAgICBuYW1lKSk7CisgICAgfQorICB9CisKICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXN1bHQtPmZpZWxkX2NvdW50KCk7IGkrKykgewogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSByZXN1bHQtPmZpZWxkKGkpOwogICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0LT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaisrKSB7CkBAIC0yOTI2LDExICs0MTM3LDM5IEBACiAgICAgICAgICAgICAgICAgICAgZmllbGQtPm5hbWUoKSwgZmllbGQtPm51bWJlcigpKSk7CiAgICAgICB9CiAgICAgfQorICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0LT5yZXNlcnZlZF9yYW5nZV9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqIHJhbmdlID0gcmVzdWx0LT5yZXNlcnZlZF9yYW5nZShqKTsKKyAgICAgIGlmIChyYW5nZS0+c3RhcnQgPD0gZmllbGQtPm51bWJlcigpICYmIGZpZWxkLT5udW1iZXIoKSA8IHJhbmdlLT5lbmQpIHsKKyAgICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90by5yZXNlcnZlZF9yYW5nZShqKSwKKyAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAgICAgIkZpZWxkIFwiJDBcIiB1c2VzIHJlc2VydmVkIG51bWJlciAkMS4iLAorICAgICAgICAgICAgICAgICAgIGZpZWxkLT5uYW1lKCksIGZpZWxkLT5udW1iZXIoKSkpOworICAgICAgfQorICAgIH0KKyAgICBpZiAocmVzZXJ2ZWRfbmFtZV9zZXQuZmluZChmaWVsZC0+bmFtZSgpKSAhPSByZXNlcnZlZF9uYW1lX3NldC5lbmQoKSkgeworICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90by5maWVsZChpKSwKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoCisgICAgICAgICAgICAgICAgICJGaWVsZCBuYW1lIFwiJDBcIiBpcyByZXNlcnZlZC4iLCBmaWVsZC0+bmFtZSgpKSk7CisgICAgfQogICB9CiAKLSAgLy8gQ2hlY2sgdGhhdCBleHRlbnNpb24gcmFuZ2VzIGRvbid0IG92ZXJsYXAuCisgIC8vIENoZWNrIHRoYXQgZXh0ZW5zaW9uIHJhbmdlcyBkb24ndCBvdmVybGFwIGFuZCBkb24ndCBpbmNsdWRlCisgIC8vIHJlc2VydmVkIGZpZWxkIG51bWJlcnMuCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzdWx0LT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgaSsrKSB7CiAgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIHJhbmdlMSA9IHJlc3VsdC0+ZXh0ZW5zaW9uX3JhbmdlKGkpOworICAgIGZvciAoaW50IGogPSAwOyBqIDwgcmVzdWx0LT5yZXNlcnZlZF9yYW5nZV9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3I6OlJlc2VydmVkUmFuZ2UqIHJhbmdlMiA9IHJlc3VsdC0+cmVzZXJ2ZWRfcmFuZ2Uoaik7CisgICAgICBpZiAocmFuZ2UxLT5lbmQgPiByYW5nZTItPnN0YXJ0ICYmIHJhbmdlMi0+ZW5kID4gcmFuZ2UxLT5zdGFydCkgeworICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90by5leHRlbnNpb25fcmFuZ2UoaiksCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAorICAgICAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJFeHRlbnNpb24gcmFuZ2UgJDAgdG8gJDEgb3ZlcmxhcHMgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInJlc2VydmVkIHJhbmdlICQyIHRvICQzLiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmFuZ2UxLT5zdGFydCwgcmFuZ2UxLT5lbmQgLSAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJhbmdlMi0+c3RhcnQsIHJhbmdlMi0+ZW5kIC0gMSkpOworICAgICAgfQorICAgIH0KICAgICBmb3IgKGludCBqID0gaSArIDE7IGogPCByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpOyBqKyspIHsKICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKiByYW5nZTIgPSByZXN1bHQtPmV4dGVuc2lvbl9yYW5nZShqKTsKICAgICAgIGlmIChyYW5nZTEtPmVuZCA+IHJhbmdlMi0+c3RhcnQgJiYgcmFuZ2UyLT5lbmQgPiByYW5nZTEtPnN0YXJ0KSB7CkBAIC0yOTQ1LDYgKzQxODQsNyBAQAogICB9CiB9CiAKKwogdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRGaWVsZE9yRXh0ZW5zaW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBwYXJlbnQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yKiByZXN1bHQsCkBAIC0yOTc3LDcgKzQyMTcsMTcgQEAKICAgLy8gRG9uJ3QgYm90aGVyIHdpdGggdGhlIGFib3ZlIG9wdGltaXphdGlvbiBmb3IgY2FtZWwtY2FzZSBuYW1lcyBzaW5jZQogICAvLyAucHJvdG8gZmlsZXMgdGhhdCBmb2xsb3cgdGhlIGd1aWRlIHNob3VsZG4ndCBiZSB1c2luZyBuYW1lcyBpbiB0aGlzCiAgIC8vIGZvcm1hdCwgc28gdGhlIG9wdGltaXphdGlvbiB3b3VsZG4ndCBoZWxwIG11Y2guCi0gIHJlc3VsdC0+Y2FtZWxjYXNlX25hbWVfID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcoVG9DYW1lbENhc2UocHJvdG8ubmFtZSgpKSk7CisgIHJlc3VsdC0+Y2FtZWxjYXNlX25hbWVfID0KKyAgICAgIHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKFRvQ2FtZWxDYXNlKHByb3RvLm5hbWUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGxvd2VyX2ZpcnN0ID0gKi8gdHJ1ZSkpOworCisgIGlmIChwcm90by5oYXNfanNvbl9uYW1lKCkpIHsKKyAgICByZXN1bHQtPmhhc19qc29uX25hbWVfID0gdHJ1ZTsKKyAgICByZXN1bHQtPmpzb25fbmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5qc29uX25hbWUoKSk7CisgIH0gZWxzZSB7CisgICAgcmVzdWx0LT5oYXNfanNvbl9uYW1lXyA9IGZhbHNlOworICAgIHJlc3VsdC0+anNvbl9uYW1lXyA9IHJlc3VsdC0+Y2FtZWxjYXNlX25hbWVfOworICB9CiAKICAgLy8gU29tZSBjb21waWxlcnMgZG8gbm90IGFsbG93IHN0YXRpY19jYXN0IGRpcmVjdGx5IGJldHdlZW4gdHdvIGVudW0gdHlwZXMsCiAgIC8vIHNvIHdlIG11c3QgY2FzdCB0byBpbnQgZmlyc3QuCkBAIC0yOTg2LDEwICs0MjM2LDIyIEBACiAgIHJlc3VsdC0+bGFiZWxfID0gc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpMYWJlbD4oCiAgICAgICAgICAgICAgICAgICAgICBpbXBsaWNpdF9jYXN0PGludD4ocHJvdG8ubGFiZWwoKSkpOwogCisgIC8vIEFuIGV4dGVuc2lvbiBjYW5ub3QgaGF2ZSBhIHJlcXVpcmVkIGZpZWxkIChiLzEzMzY1ODM2KS4KKyAgaWYgKHJlc3VsdC0+aXNfZXh0ZW5zaW9uXyAmJgorICAgICAgcmVzdWx0LT5sYWJlbF8gPT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVFVSVJFRCkgeworICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgIC8vIEVycm9yIGxvY2F0aW9uIGBUWVBFYDogd2Ugd291bGQgcmVhbGx5IGxpa2UgdG8gaW5kaWNhdGUKKyAgICAgICAgICAgICAvLyBgTEFCRUxgLCBidXQgdGhlIGBFcnJvckxvY2F0aW9uYCBlbnVtIGhhcyBubyBlbnRyeSBmb3IgdGhpcywgYW5kCisgICAgICAgICAgICAgLy8gd2UgZG9uJ3QgbmVjZXNzYXJpbHkga25vdyBhYm91dCBhbGwgaW1wbGVtZW50YXRpb25zIG9mIHRoZQorICAgICAgICAgICAgIC8vIGBFcnJvckNvbGxlY3RvcmAgaW50ZXJmYWNlIHRvIGV4dGVuZCB0aGVtIHRvIGhhbmRsZSB0aGUgbmV3CisgICAgICAgICAgICAgLy8gZXJyb3IgbG9jYXRpb24gdHlwZSBwcm9wZXJseS4KKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgIk1lc3NhZ2UgZXh0ZW5zaW9ucyBjYW5ub3QgaGF2ZSByZXF1aXJlZCBmaWVsZHMuIik7CisgIH0KKwogICAvLyBTb21lIG9mIHRoZXNlIG1heSBiZSBmaWxsZWQgaW4gd2hlbiBjcm9zcy1saW5raW5nLgogICByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZV8gPSBOVUxMOwogICByZXN1bHQtPmV4dGVuc2lvbl9zY29wZV8gPSBOVUxMOwotICByZXN1bHQtPmV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IE5VTEw7CiAgIHJlc3VsdC0+bWVzc2FnZV90eXBlXyA9IE5VTEw7CiAgIHJlc3VsdC0+ZW51bV90eXBlXyA9IE5VTEw7CiAKQEAgLTMwMjgsOCArNDI5MCw4IEBACiAgICAgICAgICAgfSBlbHNlIGlmIChwcm90by5kZWZhdWx0X3ZhbHVlKCkgPT0gIm5hbiIpIHsKICAgICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9mbG9hdF8gPSBudW1lcmljX2xpbWl0czxmbG9hdD46OnF1aWV0X05hTigpOwogICAgICAgICAgIH0gZWxzZSAgewotICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2Zsb2F0XyA9Ci0gICAgICAgICAgICAgIE5vTG9jYWxlU3RydG9kKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5jX3N0cigpLCAmZW5kX3Bvcyk7CisgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZmxvYXRfID0gaW86OlNhZmVEb3VibGVUb0Zsb2F0KAorICAgICAgICAgICAgICAgIGlvOjpOb0xvY2FsZVN0cnRvZChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MpKTsKICAgICAgICAgICB9CiAgICAgICAgICAgYnJlYWs7CiAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKQEAgLTMwNDEsNyArNDMwMyw3IEBACiAgICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZG91YmxlXyA9IG51bWVyaWNfbGltaXRzPGRvdWJsZT46OnF1aWV0X05hTigpOwogICAgICAgICAgIH0gZWxzZSAgewogICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX2RvdWJsZV8gPQotICAgICAgICAgICAgICBOb0xvY2FsZVN0cnRvZChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MpOworICAgICAgICAgICAgICAgIGlvOjpOb0xvY2FsZVN0cnRvZChwcm90by5kZWZhdWx0X3ZhbHVlKCkuY19zdHIoKSwgJmVuZF9wb3MpOwogICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKQEAgLTMwNjUsNyArNDMyNyw3IEBACiAgICAgICAgICAgICAgIFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhwcm90by5kZWZhdWx0X3ZhbHVlKCkpKTsKICAgICAgICAgICB9IGVsc2UgewogICAgICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX3N0cmluZ18gPQotICAgICAgICAgICAgICB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5kZWZhdWx0X3ZhbHVlKCkpOworICAgICAgICAgICAgICAgIHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKHByb3RvLmRlZmF1bHRfdmFsdWUoKSk7CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgpAQCAtMzA4Myw3ICs0MzQ1LDggQEAKICAgICAgICAgaWYgKHByb3RvLmRlZmF1bHRfdmFsdWUoKS5lbXB0eSgpIHx8ICplbmRfcG9zICE9ICdcMCcpIHsKICAgICAgICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywKICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUsCi0gICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUuIik7CisgICAgICAgICAgICAgICAgICAgIkNvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUgXCIiICsgcHJvdG8uZGVmYXVsdF92YWx1ZSgpICsKKyAgICAgICAgICAgICAgICAgICAiXCIuIik7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9IGVsc2UgewpAQCAtMzExNSw3ICs0Mzc4LDcgQEAKICAgICAgICAgICByZXN1bHQtPmRlZmF1bHRfdmFsdWVfZW51bV8gPSBOVUxMOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6Ci0gICAgICAgICAgcmVzdWx0LT5kZWZhdWx0X3ZhbHVlX3N0cmluZ18gPSAma0VtcHR5U3RyaW5nOworICAgICAgICAgIHJlc3VsdC0+ZGVmYXVsdF92YWx1ZV9zdHJpbmdfID0gJmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgogICAgICAgICAgIGJyZWFrOwpAQCAtMzEyNiw3ICs0Mzg5LDE1IEBACiAgIGlmIChyZXN1bHQtPm51bWJlcigpIDw9IDApIHsKICAgICBBZGRFcnJvcihyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCiAgICAgICAgICAgICAgIkZpZWxkIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy4iKTsKLSAgfSBlbHNlIGlmIChyZXN1bHQtPm51bWJlcigpID4gRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSB7CisgIH0gZWxzZSBpZiAoIWlzX2V4dGVuc2lvbiAmJiByZXN1bHQtPm51bWJlcigpID4gRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSB7CisgICAgLy8gT25seSB2YWxpZGF0ZSB0aGF0IHRoZSBudW1iZXIgaXMgd2l0aGluIHRoZSB2YWxpZCBmaWVsZCByYW5nZSBpZiBpdCBpcworICAgIC8vIG5vdCBhbiBleHRlbnNpb24uIFNpbmNlIGV4dGVuc2lvbiBudW1iZXJzIGFyZSB2YWxpZGF0ZWQgd2l0aCB0aGUKKyAgICAvLyBleHRlbmRlZSdzIHZhbGlkIHNldCBvZiBleHRlbnNpb24gbnVtYmVycywgYW5kIHRob3NlIGFyZSBpbiB0dXJuCisgICAgLy8gdmFsaWRhdGVkIGFnYWluc3QgdGhlIG1heCBhbGxvd2VkIG51bWJlciwgdGhlIGNoZWNrIGlzIHVubmVjZXNzYXJ5IGZvcgorICAgIC8vIGV4dGVuc2lvbiBmaWVsZHMuCisgICAgLy8gVGhpcyBhdm9pZHMgY3Jvc3MtbGlua2luZyBpc3N1ZXMgdGhhdCBhcmlzZSB3aGVuIGF0dGVtcHRpbmcgdG8gY2hlY2sgaWYKKyAgICAvLyB0aGUgZXh0ZW5kZWUgaXMgYSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCBtZXNzYWdlLCB3aGljaCBoYXMgYSBoaWdoZXIgbWF4CisgICAgLy8gb24gZXh0ZW5zaW9uIG51bWJlcnMuCiAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAogICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAkMC4iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKSk7CkBAIC0zMTQ4LDYgKzQ0MTksMTYgQEAKICAgICB9CiAKICAgICByZXN1bHQtPmV4dGVuc2lvbl9zY29wZV8gPSBwYXJlbnQ7CisKKyAgICBpZiAocHJvdG8uaGFzX29uZW9mX2luZGV4KCkpIHsKKyAgICAgIEFkZEVycm9yKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgICJGaWVsZERlc2NyaXB0b3JQcm90by5vbmVvZl9pbmRleCBzaG91bGQgbm90IGJlIHNldCBmb3IgIgorICAgICAgICAgICAgICAgImV4dGVuc2lvbnMuIik7CisgICAgfQorCisgICAgLy8gRmlsbCBpbiBsYXRlciAobWF5YmUpLgorICAgIHJlc3VsdC0+Y29udGFpbmluZ19vbmVvZl8gPSBOVUxMOwogICB9IGVsc2UgewogICAgIGlmIChwcm90by5oYXNfZXh0ZW5kZWUoKSkgewogICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCkBAIC0zMTU2LDYgKzQ0MzcsMjMgQEAKICAgICB9CiAKICAgICByZXN1bHQtPmNvbnRhaW5pbmdfdHlwZV8gPSBwYXJlbnQ7CisKKyAgICBpZiAocHJvdG8uaGFzX29uZW9mX2luZGV4KCkpIHsKKyAgICAgIGlmIChwcm90by5vbmVvZl9pbmRleCgpIDwgMCB8fAorICAgICAgICAgIHByb3RvLm9uZW9mX2luZGV4KCkgPj0gcGFyZW50LT5vbmVvZl9kZWNsX2NvdW50KCkpIHsKKyAgICAgICAgQWRkRXJyb3IocmVzdWx0LT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgICAgIHN0cmluZ3M6OlN1YnN0aXR1dGUoIkZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4ICQwIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAib3V0IG9mIHJhbmdlIGZvciB0eXBlIFwiJDFcIi4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvLm9uZW9mX2luZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFyZW50LT5uYW1lKCkpKTsKKyAgICAgICAgcmVzdWx0LT5jb250YWluaW5nX29uZW9mXyA9IE5VTEw7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQtPmNvbnRhaW5pbmdfb25lb2ZfID0gcGFyZW50LT5vbmVvZl9kZWNsKHByb3RvLm9uZW9mX2luZGV4KCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXN1bHQtPmNvbnRhaW5pbmdfb25lb2ZfID0gTlVMTDsKKyAgICB9CiAgIH0KIAogICAvLyBDb3B5IG9wdGlvbnMuCkBAIC0zMTY1LDYgKzQ0NjMsNyBAQAogICAgIEFsbG9jYXRlT3B0aW9ucyhwcm90by5vcHRpb25zKCksIHJlc3VsdCk7CiAgIH0KIAorCiAgIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQsIHJlc3VsdC0+bmFtZSgpLAogICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKIH0KQEAgLTMxODEsMTIgKzQ0ODAsMTAgQEAKICAgICAgICAgICAgICAiRXh0ZW5zaW9uIG51bWJlcnMgbXVzdCBiZSBwb3NpdGl2ZSBpbnRlZ2Vycy4iKTsKICAgfQogCi0gIGlmIChyZXN1bHQtPmVuZCA+IEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciArIDEpIHsKLSAgICBBZGRFcnJvcihwYXJlbnQtPmZ1bGxfbmFtZSgpLCBwcm90bywKLSAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKLSAgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKCJFeHRlbnNpb24gbnVtYmVycyBjYW5ub3QgYmUgZ3JlYXRlciB0aGFuICQwLiIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OmtNYXhOdW1iZXIpKTsKLSAgfQorICAvLyBDaGVja2luZyBvZiB0aGUgdXBwZXIgYm91bmQgb2YgdGhlIGV4dGVuc2lvbiByYW5nZSBpcyBkZWZlcnJlZCB1bnRpbCBhZnRlcgorICAvLyBvcHRpb25zIGludGVycHJldGluZy4gVGhpcyBhbGxvd3MgbWVzc2FnZXMgd2l0aCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCB0bworICAvLyBoYXZlIGV4dGVuc2lvbnMgYmV5b25kIEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciwgc2luY2UgdGhlIGV4dGVuc2lvbgorICAvLyBudW1iZXJzIGFyZSBhY3R1YWxseSB1c2VkIGFzIGludDMycyBpbiB0aGUgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQuCiAKICAgaWYgKHJlc3VsdC0+c3RhcnQgPj0gcmVzdWx0LT5lbmQpIHsKICAgICBBZGRFcnJvcihwYXJlbnQtPmZ1bGxfbmFtZSgpLCBwcm90bywKQEAgLTMxOTUsNiArNDQ5Miw0MSBAQAogICB9CiB9CiAKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkUmVzZXJ2ZWRSYW5nZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yUHJvdG86OlJlc2VydmVkUmFuZ2UmIHByb3RvLAorICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKKyAgICBEZXNjcmlwdG9yOjpSZXNlcnZlZFJhbmdlKiByZXN1bHQpIHsKKyAgcmVzdWx0LT5zdGFydCA9IHByb3RvLnN0YXJ0KCk7CisgIHJlc3VsdC0+ZW5kID0gcHJvdG8uZW5kKCk7CisgIGlmIChyZXN1bHQtPnN0YXJ0IDw9IDApIHsKKyAgICBBZGRFcnJvcihwYXJlbnQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwKKyAgICAgICAgICAgICAiUmVzZXJ2ZWQgbnVtYmVycyBtdXN0IGJlIHBvc2l0aXZlIGludGVnZXJzLiIpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkJ1aWxkT25lb2YoY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yKiBwYXJlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9uZW9mRGVzY3JpcHRvciogcmVzdWx0KSB7CisgIHN0cmluZyogZnVsbF9uYW1lID0gdGFibGVzXy0+QWxsb2NhdGVTdHJpbmcocGFyZW50LT5mdWxsX25hbWUoKSk7CisgIGZ1bGxfbmFtZS0+YXBwZW5kKDEsICcuJyk7CisgIGZ1bGxfbmFtZS0+YXBwZW5kKHByb3RvLm5hbWUoKSk7CisKKyAgVmFsaWRhdGVTeW1ib2xOYW1lKHByb3RvLm5hbWUoKSwgKmZ1bGxfbmFtZSwgcHJvdG8pOworCisgIHJlc3VsdC0+bmFtZV8gPSB0YWJsZXNfLT5BbGxvY2F0ZVN0cmluZyhwcm90by5uYW1lKCkpOworICByZXN1bHQtPmZ1bGxfbmFtZV8gPSBmdWxsX25hbWU7CisKKyAgcmVzdWx0LT5jb250YWluaW5nX3R5cGVfID0gcGFyZW50OworCisgIC8vIFdlIG5lZWQgdG8gZmlsbCB0aGVzZSBpbiBsYXRlci4KKyAgcmVzdWx0LT5maWVsZF9jb3VudF8gPSAwOworICByZXN1bHQtPmZpZWxkc18gPSBOVUxMOworCisgIEFkZFN5bWJvbChyZXN1bHQtPmZ1bGxfbmFtZSgpLCBwYXJlbnQsIHJlc3VsdC0+bmFtZSgpLAorICAgICAgICAgICAgcHJvdG8sIFN5bWJvbChyZXN1bHQpKTsKK30KKwogdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6QnVpbGRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIHByb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3IqIHBhcmVudCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFbnVtRGVzY3JpcHRvciogcmVzdWx0KSB7CkBAIC0zMzAzLDcgKzQ2MzUsNyBAQAogfQogCiB2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpCdWlsZFNlcnZpY2UoY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgcHJvdG8sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZHVtbXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogLyogZHVtbXkgKi8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgU2VydmljZURlc2NyaXB0b3IqIHJlc3VsdCkgewogICBzdHJpbmcqIGZ1bGxfbmFtZSA9IHRhYmxlc18tPkFsbG9jYXRlU3RyaW5nKGZpbGVfLT5wYWNrYWdlKCkpOwogICBpZiAoIWZ1bGxfbmFtZS0+ZW1wdHkoKSkgZnVsbF9uYW1lLT5hcHBlbmQoMSwgJy4nKTsKQEAgLTMzNTIsNiArNDY4NCw5IEBACiAgICAgQWxsb2NhdGVPcHRpb25zKHByb3RvLm9wdGlvbnMoKSwgcmVzdWx0KTsKICAgfQogCisgIHJlc3VsdC0+Y2xpZW50X3N0cmVhbWluZ18gPSBwcm90by5jbGllbnRfc3RyZWFtaW5nKCk7CisgIHJlc3VsdC0+c2VydmVyX3N0cmVhbWluZ18gPSBwcm90by5zZXJ2ZXJfc3RyZWFtaW5nKCk7CisKICAgQWRkU3ltYm9sKHJlc3VsdC0+ZnVsbF9uYW1lKCksIHBhcmVudCwgcmVzdWx0LT5uYW1lKCksCiAgICAgICAgICAgICBwcm90bywgU3ltYm9sKHJlc3VsdCkpOwogfQpAQCAtMzQwNCw2ICs0NzM5LDYzIEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCk7IGkrKykgewogICAgIENyb3NzTGlua0ZpZWxkKCZtZXNzYWdlLT5leHRlbnNpb25zX1tpXSwgcHJvdG8uZXh0ZW5zaW9uKGkpKTsKICAgfQorCisgIC8vIFNldCB1cCBmaWVsZCBhcnJheSBmb3IgZWFjaCBvbmVvZi4KKworICAvLyBGaXJzdCBjb3VudCB0aGUgbnVtYmVyIG9mIGZpZWxkcyBwZXIgb25lb2YuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZWNsID0gbWVzc2FnZS0+ZmllbGQoaSktPmNvbnRhaW5pbmdfb25lb2YoKTsKKyAgICBpZiAob25lb2ZfZGVjbCAhPSBOVUxMKSB7CisgICAgICAvLyBNYWtlIHN1cmUgZmllbGRzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBvbmVvZiBhcmUgZGVmaW5lZCBjb25zZWN1dGl2ZWx5LgorICAgICAgLy8gVGhpcyBlbmFibGVzIG9wdGltaXphdGlvbnMgaW4gY29kZWdlbnMgYW5kIHJlZmxlY3Rpb24gbGlicmFyaWVzIHRvCisgICAgICAvLyBza2lwIGZpZWxkcyBpbiB0aGUgb25lb2YgZ3JvdXAsIGFzIG9ubHkgb25lIG9mIHRoZSBmaWVsZCBjYW4gYmUgc2V0LgorICAgICAgLy8gTm90ZSB0aGF0IGZpZWxkX2NvdW50KCkgcmV0dXJucyBob3cgbWFueSBmaWVsZHMgaW4gdGhpcyBvbmVvZiB3ZSBoYXZlCisgICAgICAvLyBzZWVuIHNvIGZhci4gZmllbGRfY291bnQoKSA+IDAgZ3VhcmFudGVlcyB0aGF0IGkgPiAwLCBzbyBmaWVsZChpLTEpIGlzCisgICAgICAvLyBzYWZlLgorICAgICAgaWYgKG9uZW9mX2RlY2wtPmZpZWxkX2NvdW50KCkgPiAwICYmCisgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSAtIDEpLT5jb250YWluaW5nX29uZW9mKCkgIT0gb25lb2ZfZGVjbCkgeworICAgICAgICBBZGRFcnJvcigKKyAgICAgICAgICAgIG1lc3NhZ2UtPmZ1bGxfbmFtZSgpICsgIi4iICsgbWVzc2FnZS0+ZmllbGQoaSAtIDEpLT5uYW1lKCksCisgICAgICAgICAgICBwcm90by5maWVsZChpIC0gMSksIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICBzdHJpbmdzOjpTdWJzdGl0dXRlKAorICAgICAgICAgICAgICAgICJGaWVsZHMgaW4gdGhlIHNhbWUgb25lb2YgbXVzdCBiZSBkZWZpbmVkIGNvbnNlY3V0aXZlbHkuICIKKyAgICAgICAgICAgICAgICAiXCIkMFwiIGNhbm5vdCBiZSBkZWZpbmVkIGJlZm9yZSB0aGUgY29tcGxldGlvbiBvZiB0aGUgIgorICAgICAgICAgICAgICAgICJcIiQxXCIgb25lb2YgZGVmaW5pdGlvbi4iLAorICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkKGkgLSAxKS0+bmFtZSgpLCBvbmVvZl9kZWNsLT5uYW1lKCkpKTsKKyAgICAgIH0KKyAgICAgIC8vIE11c3QgZ28gdGhyb3VnaCBvbmVvZl9kZWNsc18gYXJyYXkgdG8gZ2V0IGEgbm9uLWNvbnN0IHZlcnNpb24gb2YgdGhlCisgICAgICAvLyBPbmVvZkRlc2NyaXB0b3IuCisgICAgICArK21lc3NhZ2UtPm9uZW9mX2RlY2xzX1tvbmVvZl9kZWNsLT5pbmRleCgpXS5maWVsZF9jb3VudF87CisgICAgfQorICB9CisKKyAgLy8gVGhlbiBhbGxvY2F0ZSB0aGUgYXJyYXlzLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZWNsID0gJm1lc3NhZ2UtPm9uZW9mX2RlY2xzX1tpXTsKKworICAgIGlmIChvbmVvZl9kZWNsLT5maWVsZF9jb3VudCgpID09IDApIHsKKyAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpICsgIi4iICsgb25lb2ZfZGVjbC0+bmFtZSgpLAorICAgICAgICAgICAgICAgcHJvdG8ub25lb2ZfZGVjbChpKSwKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJPbmVvZiBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIGZpZWxkLiIpOworICAgIH0KKworICAgIG9uZW9mX2RlY2wtPmZpZWxkc18gPQorICAgICAgdGFibGVzXy0+QWxsb2NhdGVBcnJheTxjb25zdCBGaWVsZERlc2NyaXB0b3IqPihvbmVvZl9kZWNsLT5maWVsZF9jb3VudF8pOworICAgIG9uZW9mX2RlY2wtPmZpZWxkX2NvdW50XyA9IDA7CisgIH0KKworICAvLyBUaGVuIGZpbGwgdGhlbSBpbi4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2RlY2wgPSBtZXNzYWdlLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpOworICAgIGlmIChvbmVvZl9kZWNsICE9IE5VTEwpIHsKKyAgICAgIE9uZW9mRGVzY3JpcHRvciogbXV0YWJsZV9vbmVvZl9kZWNsID0KKyAgICAgICAgICAmbWVzc2FnZS0+b25lb2ZfZGVjbHNfW29uZW9mX2RlY2wtPmluZGV4KCldOworICAgICAgbWVzc2FnZS0+ZmllbGRzX1tpXS5pbmRleF9pbl9vbmVvZl8gPSBtdXRhYmxlX29uZW9mX2RlY2wtPmZpZWxkX2NvdW50XzsKKyAgICAgIG11dGFibGVfb25lb2ZfZGVjbC0+ZmllbGRzX1ttdXRhYmxlX29uZW9mX2RlY2wtPmZpZWxkX2NvdW50XysrXSA9CisgICAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSk7CisgICAgfQorICB9CiB9CiAKIHZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OkNyb3NzTGlua0ZpZWxkKApAQCAtMzQyOCw3ICs0ODIwLDEwIEBACiAgICAgfQogICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGVfID0gZXh0ZW5kZWUuZGVzY3JpcHRvcjsKIAotICAgIGlmICghZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5Jc0V4dGVuc2lvbk51bWJlcihmaWVsZC0+bnVtYmVyKCkpKSB7CisgICAgY29uc3QgRGVzY3JpcHRvcjo6RXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZSA9IGZpZWxkLT5jb250YWluaW5nX3R5cGUoKQorICAgICAgICAtPkZpbmRFeHRlbnNpb25SYW5nZUNvbnRhaW5pbmdOdW1iZXIoZmllbGQtPm51bWJlcigpKTsKKworICAgIGlmIChleHRlbnNpb25fcmFuZ2UgPT0gTlVMTCkgewogICAgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TlVNQkVSLAogICAgICAgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiXCIkMFwiIGRvZXMgbm90IGRlY2xhcmUgJDEgYXMgYW4gIgpAQCAtMzQzOCw2ICs0ODMzLDE3IEBACiAgICAgfQogICB9CiAKKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgIT0gTlVMTCkgeworICAgIGlmIChmaWVsZC0+bGFiZWwoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMKSB7CisgICAgICAvLyBOb3RlIHRoYXQgdGhpcyBlcnJvciB3aWxsIG5ldmVyIGhhcHBlbiB3aGVuIHBhcnNpbmcgLnByb3RvIGZpbGVzLgorICAgICAgLy8gSXQgY2FuIG9ubHkgaGFwcGVuIGlmIHlvdSBtYW51YWxseSBjb25zdHJ1Y3QgYSBGaWxlRGVzY3JpcHRvclByb3RvCisgICAgICAvLyB0aGF0IGlzIGluY29ycmVjdC4KKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAiRmllbGRzIG9mIG9uZW9mcyBtdXN0IHRoZW1zZWx2ZXMgaGF2ZSBsYWJlbCBMQUJFTF9PUFRJT05BTC4iKTsKKyAgICB9CisgIH0KKwogICBpZiAocHJvdG8uaGFzX3R5cGVfbmFtZSgpKSB7CiAgICAgLy8gQXNzdW1lIHdlIGFyZSBleHBlY3RpbmcgYSBtZXNzYWdlIHR5cGUgdW5sZXNzIHRoZSBwcm90byBjb250YWlucyBzb21lCiAgICAgLy8gZXZpZGVuY2UgdGhhdCBpdCBleHBlY3RzIGFuIGVudW0gdHlwZS4gIFRoaXMgb25seSBtYWtlcyBhIGRpZmZlcmVuY2UgaWYKQEAgLTM0NTAsNiArNDg1NiwxMSBAQAogICAgICAgICAgICAgICAgICAgIGV4cGVjdGluZ19lbnVtID8gUExBQ0VIT0xERVJfRU5VTSA6IFBMQUNFSE9MREVSX01FU1NBR0UsCiAgICAgICAgICAgICAgICAgICAgTE9PS1VQX1RZUEVTKTsKIAorICAgIC8vIElmIHRoZSB0eXBlIGlzIGEgd2VhayB0eXBlLCB3ZSBjaGFuZ2UgdGhlIHR5cGUgdG8gYSBnb29nbGUucHJvdG9idWYuRW1wdHkgZmllbGQuCisgICAgaWYgKHR5cGUuSXNOdWxsKCkgJiYgIXBvb2xfLT5lbmZvcmNlX3dlYWtfICYmIHByb3RvLm9wdGlvbnMoKS53ZWFrKCkpIHsKKyAgICAgIHR5cGUgPSBGaW5kU3ltYm9sKGtOb25MaW5rZWRXZWFrTWVzc2FnZVJlcGxhY2VtZW50TmFtZSk7CisgICAgfQorCiAgICAgaWYgKHR5cGUuSXNOdWxsKCkpIHsKICAgICAgIEFkZE5vdERlZmluZWRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKQEAgLTM1MDEsMjEgKzQ5MTIsMzQgQEAKICAgICAgIH0KIAogICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7Ci0gICAgICAgIC8vIFdlIGNhbid0IGp1c3QgdXNlIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOYW1lKCkgaGVyZQotICAgICAgICAvLyBiZWNhdXNlIHRoYXQgbG9ja3MgdGhlIHBvb2wncyBtdXRleCwgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IGxvY2tlZAotICAgICAgICAvLyBhdCB0aGlzIHBvaW50LgotICAgICAgICBTeW1ib2wgZGVmYXVsdF92YWx1ZSA9Ci0gICAgICAgICAgTG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcihwcm90by5kZWZhdWx0X3ZhbHVlKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKLQotICAgICAgICBpZiAoZGVmYXVsdF92YWx1ZS50eXBlID09IFN5bWJvbDo6RU5VTV9WQUxVRSAmJgotICAgICAgICAgICAgZGVmYXVsdF92YWx1ZS5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3ItPnR5cGUoKSA9PSBmaWVsZC0+ZW51bV90eXBlKCkpIHsKLSAgICAgICAgICBmaWVsZC0+ZGVmYXVsdF92YWx1ZV9lbnVtXyA9IGRlZmF1bHRfdmFsdWUuZW51bV92YWx1ZV9kZXNjcmlwdG9yOwotICAgICAgICB9IGVsc2UgeworICAgICAgICAvLyBFbnN1cmUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyBhbiBpZGVudGlmaWVyLiBQYXJzZXIgY2Fubm90IGFsd2F5cworICAgICAgICAvLyB2ZXJpZnkgdGhpcyBiZWNhdXNlIGl0IGRvZXMgbm90IGhhdmUgY29tcGxldGUgdHlwZSBpbmZvcm1hdGlvbi4KKyAgICAgICAgLy8gTi5CLiB0aGF0IHRoaXMgY2hlY2sgeWllbGRzIGJldHRlciBlcnJvciBtZXNzYWdlcyBidXQgaXMgbm90CisgICAgICAgIC8vIG5lY2Vzc2FyeSBmb3IgY29ycmVjdG5lc3MgKGFuIGVudW0gc3ltYm9sIG11c3QgYmUgYSB2YWxpZCBpZGVudGlmaWVyCisgICAgICAgIC8vIGFueXdheSksIG9ubHkgZm9yIGJldHRlciBlcnJvcnMuCisgICAgICAgIGlmICghaW86OlRva2VuaXplcjo6SXNJZGVudGlmaWVyKHByb3RvLmRlZmF1bHRfdmFsdWUoKSkpIHsKICAgICAgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAogICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6REVGQVVMVF9WQUxVRSwKLSAgICAgICAgICAgICAgICAgICAiRW51bSB0eXBlIFwiIiArIGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgKwotICAgICAgICAgICAgICAgICAgICJcIiBoYXMgbm8gdmFsdWUgbmFtZWQgXCIiICsgcHJvdG8uZGVmYXVsdF92YWx1ZSgpICsgIlwiLiIpOworICAgICAgICAgICAgICAgICAgICJEZWZhdWx0IHZhbHVlIGZvciBhbiBlbnVtIGZpZWxkIG11c3QgYmUgYW4gaWRlbnRpZmllci4iKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAvLyBXZSBjYW4ndCBqdXN0IHVzZSBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TmFtZSgpIGhlcmUKKyAgICAgICAgICAvLyBiZWNhdXNlIHRoYXQgbG9ja3MgdGhlIHBvb2wncyBtdXRleCwgd2hpY2ggd2UgaGF2ZSBhbHJlYWR5IGxvY2tlZAorICAgICAgICAgIC8vIGF0IHRoaXMgcG9pbnQuCisgICAgICAgICAgU3ltYm9sIGRlZmF1bHRfdmFsdWUgPQorICAgICAgICAgICAgTG9va3VwU3ltYm9sTm9QbGFjZWhvbGRlcihwcm90by5kZWZhdWx0X3ZhbHVlKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOworCisgICAgICAgICAgaWYgKGRlZmF1bHRfdmFsdWUudHlwZSA9PSBTeW1ib2w6OkVOVU1fVkFMVUUgJiYKKyAgICAgICAgICAgICAgZGVmYXVsdF92YWx1ZS5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3ItPnR5cGUoKSA9PQorICAgICAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCkpIHsKKyAgICAgICAgICAgIGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW1fID0gZGVmYXVsdF92YWx1ZS5lbnVtX3ZhbHVlX2Rlc2NyaXB0b3I7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OkRFRkFVTFRfVkFMVUUsCisgICAgICAgICAgICAgICAgICAgICAiRW51bSB0eXBlIFwiIiArIGZpZWxkLT5lbnVtX3R5cGUoKS0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyB2YWx1ZSBuYW1lZCBcIiIgKyBwcm90by5kZWZhdWx0X3ZhbHVlKCkgKworICAgICAgICAgICAgICAgICAgICAgIlwiLiIpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgfSBlbHNlIGlmIChmaWVsZC0+ZW51bV90eXBlKCktPnZhbHVlX2NvdW50KCkgPiAwKSB7CiAgICAgICAgIC8vIEFsbCBlbnVtcyBtdXN0IGhhdmUgYXQgbGVhc3Qgb25lIHZhbHVlLCBvciB3ZSB3b3VsZCBoYXZlIHJlcG9ydGVkCkBAIC0zNTU5LDEyICs0OTgzLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbmZsaWN0aW5nX2ZpZWxkLT5uYW1lKCkpKTsKICAgICB9Ci0gIH0KLQotICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgLy8gTm8gbmVlZCBmb3IgZXJyb3IgY2hlY2tpbmc6IGlmIHRoZSBleHRlbnNpb24gbnVtYmVyIGNvbGxpZGVkLAotICAgIC8vIHdlJ3ZlIGFscmVhZHkgYmVlbiBpbmZvcm1lZCBvZiBpdCBieSB0aGUgaWYoKSBhYm92ZS4KLSAgICB0YWJsZXNfLT5BZGRFeHRlbnNpb24oZmllbGQpOworICB9IGVsc2UgeworICAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAgIGlmICghdGFibGVzXy0+QWRkRXh0ZW5zaW9uKGZpZWxkKSkgeworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNvbmZsaWN0aW5nX2ZpZWxkID0KKyAgICAgICAgICAgIHRhYmxlc18tPkZpbmRFeHRlbnNpb24oZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLCBmaWVsZC0+bnVtYmVyKCkpOworICAgICAgICBzdHJpbmcgZXJyb3JfbXNnID0gc3RyaW5nczo6U3Vic3RpdHV0ZSgKKyAgICAgICAgICAgICJFeHRlbnNpb24gbnVtYmVyICQwIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCBpbiBcIiQxXCIgYnkgZXh0ZW5zaW9uICIKKyAgICAgICAgICAgICJcIiQyXCIgZGVmaW5lZCBpbiAkMy4iLAorICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLAorICAgICAgICAgICAgZmllbGQtPmNvbnRhaW5pbmdfdHlwZSgpLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgIGNvbmZsaWN0aW5nX2ZpZWxkLT5mdWxsX25hbWUoKSwKKyAgICAgICAgICAgIGNvbmZsaWN0aW5nX2ZpZWxkLT5maWxlKCktPm5hbWUoKSk7CisgICAgICAgIC8vIENvbmZsaWN0aW5nIGV4dGVuc2lvbiBudW1iZXJzIHNob3VsZCBiZSBhbiBlcnJvci4gSG93ZXZlciwgYmVmb3JlCisgICAgICAgIC8vIHR1cm5pbmcgdGhpcyBpbnRvIGFuIGVycm9yIHdlIG5lZWQgdG8gZml4IGFsbCBleGlzdGluZyBicm9rZW4KKyAgICAgICAgLy8gcHJvdG9zIGZpcnN0LgorICAgICAgICAvLyBUT0RPKHhpYW9mZW5nKTogQ2hhbmdlIHRoaXMgdG8gYW4gZXJyb3IuCisgICAgICAgIEFkZFdhcm5pbmcoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5VTUJFUiwgZXJyb3JfbXNnKTsKKyAgICAgIH0KKyAgICB9CiAgIH0KIAogICAvLyBBZGQgdGhlIGZpZWxkIHRvIHRoZSBsb3dlcmNhc2UtbmFtZSBhbmQgY2FtZWxjYXNlLW5hbWUgdGFibGVzLgpAQCAtMzU4Myw3ICs1MDIxLDggQEAKIH0KIAogdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6Q3Jvc3NMaW5rRW51bVZhbHVlKAotICAgIEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlLAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgLyogcHJvdG8gKi8pIHsKICAgaWYgKGVudW1fdmFsdWUtPm9wdGlvbnNfID09IE5VTEwpIHsKICAgICBlbnVtX3ZhbHVlLT5vcHRpb25zXyA9ICZFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCk7CiAgIH0KQEAgLTM2NDcsNyArNTA4Niw2IEBACiAgIC8vIFRPRE8oa2VudG9uKTogIEkgZG9uJ3QgZXZlbiByZW1lbWJlciBob3cgbWFueSBvZiB0aGVzZSBjb25kaXRpb25zIGFyZQogICAvLyAgIGFjdHVhbGx5IHBvc3NpYmxlLiAgSSdtIGp1c3QgYmVpbmcgc3VwZXItc2FmZS4KICAgcmV0dXJuIGZpbGUgIT0gTlVMTCAmJgotICAgICAgICAgJmZpbGUtPm9wdGlvbnMoKSAhPSBOVUxMICYmCiAgICAgICAgICAmZmlsZS0+b3B0aW9ucygpICE9ICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpICYmCiAgICAgICAgICBmaWxlLT5vcHRpb25zKCkub3B0aW1pemVfZm9yKCkgPT0gRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKIH0KQEAgLTM2NzMsNiArNTExMSwxMzAgQEAKICAgICAgIH0KICAgICB9CiAgIH0KKyAgaWYgKGZpbGUtPnN5bnRheCgpID09IEZpbGVEZXNjcmlwdG9yOjpTWU5UQVhfUFJPVE8zKSB7CisgICAgVmFsaWRhdGVQcm90bzMoZmlsZSwgcHJvdG8pOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlUHJvdG8zKAorICAgIEZpbGVEZXNjcmlwdG9yKiBmaWxlLCBjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPmV4dGVuc2lvbl9jb3VudCgpOyArK2kpIHsKKyAgICBWYWxpZGF0ZVByb3RvM0ZpZWxkKGZpbGUtPmV4dGVuc2lvbnNfICsgaSwgcHJvdG8uZXh0ZW5zaW9uKGkpKTsKKyAgfQorICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBWYWxpZGF0ZVByb3RvM01lc3NhZ2UoZmlsZS0+bWVzc2FnZV90eXBlc18gKyBpLCBwcm90by5tZXNzYWdlX3R5cGUoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgZmlsZS0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFZhbGlkYXRlUHJvdG8zRW51bShmaWxlLT5lbnVtX3R5cGVzXyArIGksIHByb3RvLmVudW1fdHlwZShpKSk7CisgIH0KK30KKworc3RhdGljIHN0cmluZyBUb0xvd2VyY2FzZVdpdGhvdXRVbmRlcnNjb3Jlcyhjb25zdCBzdHJpbmcmIG5hbWUpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBuYW1lLnNpemUoKTsgKytpKSB7CisgICAgaWYgKG5hbWVbaV0gIT0gJ18nKSB7CisgICAgICBpZiAobmFtZVtpXSA+PSAnQScgJiYgbmFtZVtpXSA8PSAnWicpIHsKKyAgICAgICAgcmVzdWx0LnB1c2hfYmFjayhuYW1lW2ldIC0gJ0EnICsgJ2EnKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJlc3VsdC5wdXNoX2JhY2sobmFtZVtpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlUHJvdG8zTWVzc2FnZSgKKyAgICBEZXNjcmlwdG9yKiBtZXNzYWdlLCBjb25zdCBEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgVmFsaWRhdGVQcm90bzNNZXNzYWdlKG1lc3NhZ2UtPm5lc3RlZF90eXBlc18gKyBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG8ubmVzdGVkX3R5cGUoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZW51bV90eXBlX2NvdW50KCk7ICsraSkgeworICAgIFZhbGlkYXRlUHJvdG8zRW51bShtZXNzYWdlLT5lbnVtX3R5cGVzXyArIGksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90by5lbnVtX3R5cGUoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZmllbGRfY291bnQoKTsgKytpKSB7CisgICAgVmFsaWRhdGVQcm90bzNGaWVsZChtZXNzYWdlLT5maWVsZHNfICsgaSwgcHJvdG8uZmllbGQoaSkpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCk7ICsraSkgeworICAgIFZhbGlkYXRlUHJvdG8zRmllbGQobWVzc2FnZS0+ZXh0ZW5zaW9uc18gK2ksIHByb3RvLmV4dGVuc2lvbihpKSk7CisgIH0KKyAgaWYgKG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpID4gMCkgeworICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICJFeHRlbnNpb24gcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuIik7CisgIH0KKyAgaWYgKG1lc3NhZ2UtPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CisgICAgLy8gVXNpbmcgTWVzc2FnZVNldCBkb2Vzbid0IG1ha2Ugc2Vuc2Ugc2luY2Ugd2UgZGlzYWxsb3cgZXh0ZW5zaW9ucy4KKyAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAiTWVzc2FnZVNldCBpcyBub3Qgc3VwcG9ydGVkIGluIHByb3RvMy4iKTsKKyAgfQorCisgIC8vIEluIHByb3RvMywgd2UgcmVqZWN0IGZpZWxkIG5hbWVzIGlmIHRoZXkgY29uZmxpY3QgaW4gY2FtZWxDYXNlLgorICAvLyBOb3RlIHRoYXQgd2UgY3VycmVudGx5IGVuZm9yY2UgYSBzdHJpY3RlciBydWxlOiBGaWVsZCBuYW1lcyBtdXN0IGJlCisgIC8vIHVuaXF1ZSBhZnRlciBiZWluZyBjb252ZXJ0ZWQgdG8gbG93ZXJjYXNlIHdpdGggdW5kZXJzY29yZXMgcmVtb3ZlZC4KKyAgbWFwPHN0cmluZywgY29uc3QgRmllbGREZXNjcmlwdG9yKj4gbmFtZV90b19maWVsZDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBzdHJpbmcgbG93ZXJjYXNlX25hbWUgPSBUb0xvd2VyY2FzZVdpdGhvdXRVbmRlcnNjb3JlcygKKyAgICAgICAgbWVzc2FnZS0+ZmllbGQoaSktPm5hbWUoKSk7CisgICAgaWYgKG5hbWVfdG9fZmllbGQuZmluZChsb3dlcmNhc2VfbmFtZSkgIT0gbmFtZV90b19maWVsZC5lbmQoKSkgeworICAgICAgQWRkRXJyb3IobWVzc2FnZS0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgICJUaGUgSlNPTiBjYW1jZWwtY2FzZSBuYW1lIG9mIGZpZWxkIFwiIiArCisgICAgICAgICAgICAgICBtZXNzYWdlLT5maWVsZChpKS0+bmFtZSgpICsgIlwiIGNvbmZsaWN0cyB3aXRoIGZpZWxkIFwiIiArCisgICAgICAgICAgICAgICBuYW1lX3RvX2ZpZWxkW2xvd2VyY2FzZV9uYW1lXS0+bmFtZSgpICsgIlwiLiBUaGlzIGlzIG5vdCAiICsKKyAgICAgICAgICAgICAgICJhbGxvd2VkIGluIHByb3RvMy4iKTsKKyAgICB9IGVsc2UgeworICAgICAgbmFtZV90b19maWVsZFtsb3dlcmNhc2VfbmFtZV0gPSBtZXNzYWdlLT5maWVsZChpKTsKKyAgICB9CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVQcm90bzNGaWVsZCgKKyAgICBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSAmJgorICAgICAgIUFsbG93ZWRFeHRlbmRlZUluUHJvdG8zKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCkpKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAgICAgICJFeHRlbnNpb25zIGluIHByb3RvMyBhcmUgb25seSBhbGxvd2VkIGZvciBkZWZpbmluZyBvcHRpb25zLiIpOworICB9CisgIGlmIChmaWVsZC0+aXNfcmVxdWlyZWQoKSkgeworICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAiUmVxdWlyZWQgZmllbGRzIGFyZSBub3QgYWxsb3dlZCBpbiBwcm90bzMuIik7CisgIH0KKyAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7CisgICAgQWRkRXJyb3IoCisgICAgICAgIGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICJFeHBsaWNpdCBkZWZhdWx0IHZhbHVlcyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zLiIpOworICB9CisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTSAmJgorICAgICAgZmllbGQtPmVudW1fdHlwZSgpICYmCisgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPmZpbGUoKS0+c3ludGF4KCkgIT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMpIHsKKyAgICAvLyBQcm90bzMgbWVzc2FnZXMgY2FuIG9ubHkgdXNlIFByb3RvMyBlbnVtIHR5cGVzOyBvdGhlcndpc2Ugd2UgY2FuJ3QKKyAgICAvLyBndWFyYW50ZWUgdGhhdCB0aGUgZGVmYXVsdCB2YWx1ZSBpcyB6ZXJvLgorICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAorICAgICAgICAgICAgICJFbnVtIHR5cGUgXCIiICsgZmllbGQtPmVudW1fdHlwZSgpLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgIlwiIGlzIG5vdCBhIHByb3RvMyBlbnVtLCBidXQgaXMgdXNlZCBpbiBcIiIgKworICAgICAgICAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgICJcIiB3aGljaCBpcyBhIHByb3RvMyBtZXNzYWdlIHR5cGUuIik7CisgIH0KKyAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgIkdyb3VwcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMgc3ludGF4LiIpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlUHJvdG8zRW51bSgKKyAgICBFbnVtRGVzY3JpcHRvciogZW5tLCBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBpZiAoZW5tLT52YWx1ZV9jb3VudCgpID4gMCAmJiBlbm0tPnZhbHVlKDApLT5udW1iZXIoKSAhPSAwKSB7CisgICAgQWRkRXJyb3IoCisgICAgICAgIGVubS0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok9USEVSLAorICAgICAgICAiVGhlIGZpcnN0IGVudW0gdmFsdWUgbXVzdCBiZSB6ZXJvIGluIHByb3RvMy4iKTsKKyAgfQogfQogCiB2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZU1lc3NhZ2VPcHRpb25zKERlc2NyaXB0b3IqIG1lc3NhZ2UsCkBAIC0zNjgxLDEyICs1MjQzLDMxIEBACiAgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShtZXNzYWdlLCBuZXN0ZWRfdHlwZSwgTWVzc2FnZSk7CiAgIFZBTElEQVRFX09QVElPTlNfRlJPTV9BUlJBWShtZXNzYWdlLCBlbnVtX3R5cGUsIEVudW0pOwogICBWQUxJREFURV9PUFRJT05TX0ZST01fQVJSQVkobWVzc2FnZSwgZXh0ZW5zaW9uLCBGaWVsZCk7CisKKyAgY29uc3QgaW50NjQgbWF4X2V4dGVuc2lvbl9yYW5nZSA9CisgICAgICBzdGF0aWNfY2FzdDxpbnQ2ND4obWVzc2FnZS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgPworICAgICAgICAgICAgICAgICAgICAgICAgIGtpbnQzMm1heCA6CisgICAgICAgICAgICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yOjprTWF4TnVtYmVyKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5leHRlbnNpb25fcmFuZ2VfY291bnQoKTsgKytpKSB7CisgICAgaWYgKG1lc3NhZ2UtPmV4dGVuc2lvbl9yYW5nZShpKS0+ZW5kID4gbWF4X2V4dGVuc2lvbl9yYW5nZSArIDEpIHsKKyAgICAgIEFkZEVycm9yKAorICAgICAgICAgIG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90by5leHRlbnNpb25fcmFuZ2UoaSksCisgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgc3RyaW5nczo6U3Vic3RpdHV0ZSgiRXh0ZW5zaW9uIG51bWJlcnMgY2Fubm90IGJlIGdyZWF0ZXIgdGhhbiAkMC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWF4X2V4dGVuc2lvbl9yYW5nZSkpOworICAgIH0KKyAgfQogfQogCiB2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZUZpZWxkT3B0aW9ucyhGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBwcm90bykgewotICBpZiAoZmllbGQtPm9wdGlvbnMoKS5oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKSkgewotICAgIFZhbGlkYXRlTWFwS2V5KGZpZWxkLCBwcm90byk7CisgIC8vIE9ubHkgbWVzc2FnZSB0eXBlIGZpZWxkcyBtYXkgYmUgbGF6eS4KKyAgaWYgKGZpZWxkLT5vcHRpb25zKCkubGF6eSgpKSB7CisgICAgaWYgKGZpZWxkLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgICAgICAiW2xhenkgPSB0cnVlXSBjYW4gb25seSBiZSBzcGVjaWZpZWQgZm9yIHN1Ym1lc3NhZ2UgZmllbGRzLiIpOworICAgIH0KICAgfQogCiAgIC8vIE9ubHkgcmVwZWF0ZWQgcHJpbWl0aXZlIGZpZWxkcyBtYXkgYmUgcGFja2VkLgpAQCAtMzcyNywxNSArNTMwOCw1MiBAQAogICAgICAgICAgICAgICJmaWxlcy4gIE5vdGUgdGhhdCB5b3UgY2Fubm90IGV4dGVuZCBhIG5vbi1saXRlIHR5cGUgdG8gY29udGFpbiAiCiAgICAgICAgICAgICAgImEgbGl0ZSB0eXBlLCBidXQgdGhlIHJldmVyc2UgaXMgYWxsb3dlZC4iKTsKICAgfQorCisgIC8vIFZhbGlkYXRlIG1hcCB0eXBlcy4KKyAgaWYgKGZpZWxkLT5pc19tYXAoKSkgeworICAgIGlmICghVmFsaWRhdGVNYXBFbnRyeShmaWVsZCwgcHJvdG8pKSB7CisgICAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpPVEhFUiwKKyAgICAgICAgICAgICAgICJtYXBfZW50cnkgc2hvdWxkIG5vdCBiZSBzZXQgZXhwbGljaXRseS4gVXNlIG1hcDxLZXlUeXBlLCAiCisgICAgICAgICAgICAgICAiVmFsdWVUeXBlPiBpbnN0ZWFkLiIpOworICAgIH0KKyAgfQorCiB9CiAKIHZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlRW51bU9wdGlvbnMoRW51bURlc2NyaXB0b3IqIGVubSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKICAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKGVubSwgdmFsdWUsIEVudW1WYWx1ZSk7CisgIGlmICghZW5tLT5vcHRpb25zKCkuaGFzX2FsbG93X2FsaWFzKCkgfHwgIWVubS0+b3B0aW9ucygpLmFsbG93X2FsaWFzKCkpIHsKKyAgICBtYXA8aW50LCBzdHJpbmc+IHVzZWRfdmFsdWVzOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZW5tLT52YWx1ZV9jb3VudCgpOyArK2kpIHsKKyAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUgPSBlbm0tPnZhbHVlKGkpOworICAgICAgaWYgKHVzZWRfdmFsdWVzLmZpbmQoZW51bV92YWx1ZS0+bnVtYmVyKCkpICE9IHVzZWRfdmFsdWVzLmVuZCgpKSB7CisgICAgICAgIHN0cmluZyBlcnJvciA9CisgICAgICAgICAgICAiXCIiICsgZW51bV92YWx1ZS0+ZnVsbF9uYW1lKCkgKworICAgICAgICAgICAgIlwiIHVzZXMgdGhlIHNhbWUgZW51bSB2YWx1ZSBhcyBcIiIgKworICAgICAgICAgICAgdXNlZF92YWx1ZXNbZW51bV92YWx1ZS0+bnVtYmVyKCldICsgIlwiLiBJZiB0aGlzIGlzIGludGVuZGVkLCBzZXQgIgorICAgICAgICAgICAgIidvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOycgdG8gdGhlIGVudW0gZGVmaW5pdGlvbi4iOworICAgICAgICBpZiAoIWVubS0+b3B0aW9ucygpLmFsbG93X2FsaWFzKCkpIHsKKyAgICAgICAgICAvLyBHZW5lcmF0ZSBlcnJvciBpZiBkdXBsaWNhdGVkIGVudW0gdmFsdWVzIGFyZSBleHBsaWNpdGx5IGRpc2FsbG93ZWQuCisgICAgICAgICAgQWRkRXJyb3IoZW5tLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICAgICAgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpOVU1CRVIsCisgICAgICAgICAgICAgICAgICAgZXJyb3IpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEdlbmVyYXRlIHdhcm5pbmcgaWYgZHVwbGljYXRlZCB2YWx1ZXMgYXJlIGZvdW5kIGJ1dCB0aGUgb3B0aW9uCisgICAgICAgICAgLy8gaXNuJ3Qgc2V0LgorICAgICAgICAgIEdPT0dMRV9MT0coRVJST1IpIDw8IGVycm9yOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICB1c2VkX3ZhbHVlc1tlbnVtX3ZhbHVlLT5udW1iZXIoKV0gPSBlbnVtX3ZhbHVlLT5mdWxsX25hbWUoKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH0KIAogdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVFbnVtVmFsdWVPcHRpb25zKAotICAgIEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fdmFsdWUsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgICBFbnVtVmFsdWVEZXNjcmlwdG9yKiAvKiBlbnVtX3ZhbHVlICovLAorICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgLyogcHJvdG8gKi8pIHsKICAgLy8gTm90aGluZyB0byBkbyBzbyBmYXIuCiB9CiB2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZVNlcnZpY2VPcHRpb25zKFNlcnZpY2VEZXNjcmlwdG9yKiBzZXJ2aWNlLApAQCAtMzc1Myw2NCArNTM3MSwxNDMgQEAKICAgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZKHNlcnZpY2UsIG1ldGhvZCwgTWV0aG9kKTsKIH0KIAotdm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNZXRob2RPcHRpb25zKE1ldGhvZERlc2NyaXB0b3IqIG1ldGhvZCwKLSAgICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7Cit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpWYWxpZGF0ZU1ldGhvZE9wdGlvbnMoTWV0aG9kRGVzY3JpcHRvciogLyogbWV0aG9kICovLAorICAgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgLyogcHJvdG8gKi8pIHsKICAgLy8gTm90aGluZyB0byBkbyBzbyBmYXIuCiB9CiAKLXZvaWQgRGVzY3JpcHRvckJ1aWxkZXI6OlZhbGlkYXRlTWFwS2V5KEZpZWxkRGVzY3JpcHRvciogZmllbGQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKLSAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKLSAgICAgICAgICAgICAibWFwIHR5cGUgaXMgb25seSBhbGxvd2VkIGZvciByZXBlYXRlZCBmaWVsZHMuIik7Ci0gICAgcmV0dXJuOworYm9vbCBEZXNjcmlwdG9yQnVpbGRlcjo6VmFsaWRhdGVNYXBFbnRyeShGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgcHJvdG8pIHsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKKyAgaWYgKC8vIE11c3Qgbm90IGNvbnRhaW4gZXh0ZW5zaW9ucywgZXh0ZW5zaW9uIHJhbmdlIG9yIG5lc3RlZCBtZXNzYWdlIG9yCisgICAgICAvLyBlbnVtcworICAgICAgbWVzc2FnZS0+ZXh0ZW5zaW9uX2NvdW50KCkgIT0gMCB8fAorICAgICAgZmllbGQtPmxhYmVsKCkgIT0gRmllbGREZXNjcmlwdG9yOjpMQUJFTF9SRVBFQVRFRCB8fAorICAgICAgbWVzc2FnZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgIT0gMCB8fAorICAgICAgbWVzc2FnZS0+bmVzdGVkX3R5cGVfY291bnQoKSAhPSAwIHx8IG1lc3NhZ2UtPmVudW1fdHlwZV9jb3VudCgpICE9IDAgfHwKKyAgICAgIC8vIE11c3QgY29udGFpbiBleGFjdGx5IHR3byBmaWVsZHMKKyAgICAgIG1lc3NhZ2UtPmZpZWxkX2NvdW50KCkgIT0gMiB8fAorICAgICAgLy8gRmllbGQgbmFtZSBhbmQgbWVzc2FnZSBuYW1lIG11c3QgbWF0Y2gKKyAgICAgIG1lc3NhZ2UtPm5hbWUoKSAhPSBUb0NhbWVsQ2FzZShmaWVsZC0+bmFtZSgpLCBmYWxzZSkgKyAiRW50cnkiIHx8CisgICAgICAvLyBFbnRyeSBtZXNzYWdlIG11c3QgYmUgaW4gdGhlIHNhbWUgY29udGFpbmluZyB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgICAgIGZpZWxkLT5jb250YWluaW5nX3R5cGUoKSAhPSBtZXNzYWdlLT5jb250YWluaW5nX3R5cGUoKSkgeworICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKLSAgICAgICAgICAgICAibWFwIHR5cGUgaXMgb25seSBhbGxvd2VkIGZvciBmaWVsZHMgd2l0aCBhIG1lc3NhZ2UgdHlwZS4iKTsKLSAgICByZXR1cm47CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioga2V5ID0gbWVzc2FnZS0+ZmllbGQoMCk7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdmFsdWUgPSBtZXNzYWdlLT5maWVsZCgxKTsKKyAgaWYgKGtleS0+bGFiZWwoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMIHx8IGtleS0+bnVtYmVyKCkgIT0gMSB8fAorICAgICAga2V5LT5uYW1lKCkgIT0gImtleSIpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKHZhbHVlLT5sYWJlbCgpICE9IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwgfHwKKyAgICAgIHZhbHVlLT5udW1iZXIoKSAhPSAyIHx8IHZhbHVlLT5uYW1lKCkgIT0gInZhbHVlIikgeworICAgIHJldHVybiBmYWxzZTsKICAgfQogCi0gIGNvbnN0IERlc2NyaXB0b3IqIGl0ZW1fdHlwZSA9IGZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKLSAgaWYgKGl0ZW1fdHlwZSA9PSBOVUxMKSB7Ci0gICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAotICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBmaWVsZCB0eXBlLiIpOwotICAgIHJldHVybjsKKyAgLy8gQ2hlY2sga2V5IHR5cGVzIGFyZSBsZWdhbC4KKyAgc3dpdGNoIChrZXktPnR5cGUoKSkgeworICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0VOVU06CisgICAgICBBZGRFcnJvcigKKyAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgIktleSBpbiBtYXAgZmllbGRzIGNhbm5vdCBiZSBlbnVtIHR5cGVzLiIpOworICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRkxPQVQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRE9VQkxFOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0U6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVA6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVM6CisgICAgICBBZGRFcnJvcigKKyAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgIktleSBpbiBtYXAgZmllbGRzIGNhbm5vdCBiZSBmbG9hdC9kb3VibGUsIGJ5dGVzIG9yIG1lc3NhZ2UgdHlwZXMuIik7CisgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9CT09MOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX0lOVDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1VJTlQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9VSU5UNjQ6CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRklYRUQzMjoKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9GSVhFRDY0OgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDMyOgorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpUWVBFX1NGSVhFRDY0OgorICAgICAgLy8gTGVnYWwgY2FzZXMKKyAgICAgIGJyZWFrOworICAgIC8vIERvIG5vdCBhZGQgYSBkZWZhdWx0LCBzbyB0aGF0IHRoZSBjb21waWxlciB3aWxsIGNvbXBsYWluIHdoZW4gbmV3IHR5cGVzCisgICAgLy8gYXJlIGFkZGVkLgogICB9CiAKLSAgLy8gRmluZCB0aGUgZmllbGQgaW4gaXRlbV90eXBlIG5hbWVkIGJ5ICJleHBlcmltZW50YWxfbWFwX2tleSIKLSAgY29uc3Qgc3RyaW5nJiBrZXlfbmFtZSA9IGZpZWxkLT5vcHRpb25zKCkuZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKLSAgY29uc3QgU3ltYm9sIGtleV9zeW1ib2wgPSBMb29rdXBTeW1ib2woCi0gICAgICBrZXlfbmFtZSwKLSAgICAgIC8vIFdlIGFwcGVuZCAiLmtleV9uYW1lIiB0byB0aGUgY29udGFpbmluZyB0eXBlJ3MgbmFtZSBzaW5jZQotICAgICAgLy8gTG9va3VwU3ltYm9sKCkgc2VhcmNoZXMgZm9yIHBlZXJzIG9mIHRoZSBzdXBwbGllZCBuYW1lLCBub3QKLSAgICAgIC8vIGNoaWxkcmVuIG9mIHRoZSBzdXBwbGllZCBuYW1lLgotICAgICAgaXRlbV90eXBlLT5mdWxsX25hbWUoKSArICIuIiArIGtleV9uYW1lKTsKLQotICBpZiAoa2V5X3N5bWJvbC5Jc051bGwoKSB8fCBrZXlfc3ltYm9sLmZpZWxkX2Rlc2NyaXB0b3ItPmlzX2V4dGVuc2lvbigpKSB7Ci0gICAgQWRkRXJyb3IoZmllbGQtPmZ1bGxfbmFtZSgpLCBwcm90bywgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yOjpUWVBFLAotICAgICAgICAgICAgICJDb3VsZCBub3QgZmluZCBmaWVsZCBuYW1lZCBcIiIgKyBrZXlfbmFtZSArICJcIiBpbiB0eXBlIFwiIiArCi0gICAgICAgICAgICAgaXRlbV90eXBlLT5mdWxsX25hbWUoKSArICJcIi4iKTsKLSAgICByZXR1cm47Ci0gIH0KLSAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBrZXlfZmllbGQgPSBrZXlfc3ltYm9sLmZpZWxkX2Rlc2NyaXB0b3I7Ci0KLSAgaWYgKGtleV9maWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgIEFkZEVycm9yKGZpZWxkLT5mdWxsX25hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6VFlQRSwKLSAgICAgICAgICAgICAibWFwX2tleSBtdXN0IG5vdCBuYW1lIGEgcmVwZWF0ZWQgZmllbGQuIik7Ci0gICAgcmV0dXJuOworICBpZiAodmFsdWUtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfRU5VTSkgeworICAgIGlmICh2YWx1ZS0+ZW51bV90eXBlKCktPnZhbHVlKDApLT5udW1iZXIoKSAhPSAwKSB7CisgICAgICBBZGRFcnJvcigKKyAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCisgICAgICAgICAgIkVudW0gdmFsdWUgaW4gbWFwIG11c3QgZGVmaW5lIDAgYXMgdGhlIGZpcnN0IHZhbHVlLiIpOworICAgIH0KICAgfQogCi0gIGlmIChrZXlfZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKLSAgICBBZGRFcnJvcihmaWVsZC0+ZnVsbF9uYW1lKCksIHByb3RvLCBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6OlRZUEUsCi0gICAgICAgICAgICAgIm1hcCBrZXkgbXVzdCBuYW1lIGEgc2NhbGFyIG9yIHN0cmluZyBmaWVsZC4iKTsKLSAgICByZXR1cm47Ci0gIH0KLQotICBmaWVsZC0+ZXhwZXJpbWVudGFsX21hcF9rZXlfID0ga2V5X2ZpZWxkOworICByZXR1cm4gdHJ1ZTsKIH0KIAordm9pZCBEZXNjcmlwdG9yQnVpbGRlcjo6RGV0ZWN0TWFwQ29uZmxpY3RzKGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclByb3RvJiBwcm90bykgeworICBtYXA8c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj4gc2Vlbl90eXBlczsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5uZXN0ZWRfdHlwZV9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBuZXN0ZWQgPSBtZXNzYWdlLT5uZXN0ZWRfdHlwZShpKTsKKyAgICBwYWlyPG1hcDxzdHJpbmcsIGNvbnN0IERlc2NyaXB0b3IqPjo6aXRlcmF0b3IsIGJvb2w+IHJlc3VsdCA9CisgICAgICAgIHNlZW5fdHlwZXMuaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG5lc3RlZC0+bmFtZSgpLCBuZXN0ZWQpKTsKKyAgICBpZiAoIXJlc3VsdC5zZWNvbmQpIHsKKyAgICAgIGlmIChyZXN1bHQuZmlyc3QtPnNlY29uZC0+b3B0aW9ucygpLm1hcF9lbnRyeSgpIHx8CisgICAgICAgICAgbmVzdGVkLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAgICAgQWRkRXJyb3IobWVzc2FnZS0+ZnVsbF9uYW1lKCksIHByb3RvLAorICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAgICJFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSAiICsgbmVzdGVkLT5uYW1lKCkgKworICAgICAgICAgICAgICAgICAiIGNvbmZsaWN0cyB3aXRoIGFuIGV4aXN0aW5nIG5lc3RlZCBtZXNzYWdlIHR5cGUuIik7CisgICAgICB9CisgICAgfQorICAgIC8vIFJlY3Vyc2l2ZWx5IHRlc3Qgb24gdGhlIG5lc3RlZCB0eXBlcy4KKyAgICBEZXRlY3RNYXBDb25mbGljdHMobWVzc2FnZS0+bmVzdGVkX3R5cGUoaSksIHByb3RvLm5lc3RlZF90eXBlKGkpKTsKKyAgfQorICAvLyBDaGVjayBmb3IgY29uZmxpY3RlZCBmaWVsZCBuYW1lcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5maWVsZF9jb3VudCgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gbWVzc2FnZS0+ZmllbGQoaSk7CisgICAgbWFwPHN0cmluZywgY29uc3QgRGVzY3JpcHRvcio+OjppdGVyYXRvciBpdGVyID0KKyAgICAgICAgc2Vlbl90eXBlcy5maW5kKGZpZWxkLT5uYW1lKCkpOworICAgIGlmIChpdGVyICE9IHNlZW5fdHlwZXMuZW5kKCkgJiYgaXRlci0+c2Vjb25kLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSAiICsgaXRlci0+c2Vjb25kLT5uYW1lKCkgKworICAgICAgICAgICAgICAgIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBmaWVsZC4iKTsKKyAgICB9CisgIH0KKyAgLy8gQ2hlY2sgZm9yIGNvbmZsaWN0ZWQgZW51bSBuYW1lcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXNzYWdlLT5lbnVtX3R5cGVfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fZGVzYyA9IG1lc3NhZ2UtPmVudW1fdHlwZShpKTsKKyAgICBtYXA8c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj46Oml0ZXJhdG9yIGl0ZXIgPQorICAgICAgICBzZWVuX3R5cGVzLmZpbmQoZW51bV9kZXNjLT5uYW1lKCkpOworICAgIGlmIChpdGVyICE9IHNlZW5fdHlwZXMuZW5kKCkgJiYgaXRlci0+c2Vjb25kLT5vcHRpb25zKCkubWFwX2VudHJ5KCkpIHsKKyAgICAgIEFkZEVycm9yKG1lc3NhZ2UtPmZ1bGxfbmFtZSgpLCBwcm90bywKKyAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6TkFNRSwKKyAgICAgICAgICAgICAgICJFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSAiICsgaXRlci0+c2Vjb25kLT5uYW1lKCkgKworICAgICAgICAgICAgICAgIiBjb25mbGljdHMgd2l0aCBhbiBleGlzdGluZyBlbnVtIHR5cGUuIik7CisgICAgfQorICB9CisgIC8vIENoZWNrIGZvciBjb25mbGljdGVkIG9uZW9mIG5hbWVzLgorICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2UtPm9uZW9mX2RlY2xfY291bnQoKTsgKytpKSB7CisgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjID0gbWVzc2FnZS0+b25lb2ZfZGVjbChpKTsKKyAgICBtYXA8c3RyaW5nLCBjb25zdCBEZXNjcmlwdG9yKj46Oml0ZXJhdG9yIGl0ZXIgPQorICAgICAgICBzZWVuX3R5cGVzLmZpbmQob25lb2ZfZGVzYy0+bmFtZSgpKTsKKyAgICBpZiAoaXRlciAhPSBzZWVuX3R5cGVzLmVuZCgpICYmIGl0ZXItPnNlY29uZC0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKSB7CisgICAgICBBZGRFcnJvcihtZXNzYWdlLT5mdWxsX25hbWUoKSwgcHJvdG8sCisgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6RXJyb3JDb2xsZWN0b3I6Ok5BTUUsCisgICAgICAgICAgICAgICAiRXhwYW5kZWQgbWFwIGVudHJ5IHR5cGUgIiArIGl0ZXItPnNlY29uZC0+bmFtZSgpICsKKyAgICAgICAgICAgICAgICIgY29uZmxpY3RzIHdpdGggYW4gZXhpc3Rpbmcgb25lb2YgdHlwZS4iKTsKKyAgICB9CisgIH0KK30KKworCiAjdW5kZWYgVkFMSURBVEVfT1BUSU9OU19GUk9NX0FSUkFZCiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM4NzQsMTEgKzU1NzEsMTkgQEAKICAgICAvLyBVbmtub3duRmllbGRTZXQgYW5kIHdhaXQgdGhlcmUgdW50aWwgdGhlIG1lc3NhZ2UgaXMgcGFyc2VkIGJ5IHNvbWV0aGluZwogICAgIC8vIHRoYXQgZG9lcyBrbm93IGFib3V0IHRoZSBvcHRpb25zLgogICAgIHN0cmluZyBidWY7Ci0gICAgb3B0aW9ucy0+QXBwZW5kVG9TdHJpbmcoJmJ1Zik7Ci0gICAgR09PR0xFX0NIRUNLKG9wdGlvbnMtPlBhcnNlRnJvbVN0cmluZyhidWYpKQorICAgIEdPT0dMRV9DSEVDSyhvcHRpb25zLT5BcHBlbmRQYXJ0aWFsVG9TdHJpbmcoJmJ1ZikpCisgICAgICAgIDw8ICJQcm90b2NvbCBtZXNzYWdlIGNvdWxkIG5vdCBiZSBzZXJpYWxpemVkLiI7CisgICAgR09PR0xFX0NIRUNLKG9wdGlvbnMtPlBhcnNlUGFydGlhbEZyb21TdHJpbmcoYnVmKSkKICAgICAgICAgPDwgIlByb3RvY29sIG1lc3NhZ2Ugc2VyaWFsaXplZCBpdHNlbGYgaW4gaW52YWxpZCBmYXNoaW9uLiI7CisgICAgaWYgKCFvcHRpb25zLT5Jc0luaXRpYWxpemVkKCkpIHsKKyAgICAgIGJ1aWxkZXJfLT5BZGRXYXJuaW5nKAorICAgICAgICAgIG9wdGlvbnNfdG9faW50ZXJwcmV0LT5lbGVtZW50X25hbWUsICpvcmlnaW5hbF9vcHRpb25zLAorICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgIk9wdGlvbnMgY291bGQgbm90IGJlIGZ1bGx5IHBhcnNlZCB1c2luZyB0aGUgcHJvdG8gZGVzY3JpcHRvcnMgIgorICAgICAgICAgICJjb21waWxlZCBpbnRvIHRoaXMgYmluYXJ5LiBNaXNzaW5nIHJlcXVpcmVkIGZpZWxkczogIiArCisgICAgICAgICAgb3B0aW9ucy0+SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpKTsKKyAgICB9CiAgIH0KLQogICByZXR1cm4gIWZhaWxlZDsKIH0KIApAQCAtMzkwMSw5ICs1NjA2LDExIEBACiAgIC8vIGZpbGUgd2UncmUgY3VycmVudGx5IGJ1aWxkaW5nLiBUaGUgZGVzY3JpcHRvciBzaG91bGQgYmUgdGhlcmUgYXMgbG9uZyBhcwogICAvLyB0aGUgZmlsZSB3ZSdyZSBidWlsZGluZyBpbXBvcnRlZCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JzLnByb3RvIi4KIAotICAvLyBOb3RlIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sKCksIG5vdAorICAvLyBOb3RlIHRoYXQgd2UgdXNlIERlc2NyaXB0b3JCdWlsZGVyOjpGaW5kU3ltYm9sTm90RW5mb3JjaW5nRGVwcygpLCBub3QKICAgLy8gRGVzY3JpcHRvclBvb2w6OkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZQotICAvLyBwb29sJ3MgbXV0ZXgsIGFuZCB0aGUgbGF0dGVyIG1ldGhvZCBsb2NrcyBpdCBhZ2Fpbi4KKyAgLy8gcG9vbCdzIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uICBXZSBkb24ndCB1c2UKKyAgLy8gRmluZFN5bWJvbCgpIGJlY2F1c2UgZmlsZXMgdGhhdCB1c2UgY3VzdG9tIG9wdGlvbnMgb25seSBuZWVkIHRvIGRlcGVuZCBvbgorICAvLyB0aGUgZmlsZSB0aGF0IGRlZmluZXMgdGhlIG9wdGlvbiwgbm90IGRlc2NyaXB0b3IucHJvdG8gaXRzZWxmLgogICBTeW1ib2wgc3ltYm9sID0gYnVpbGRlcl8tPkZpbmRTeW1ib2xOb3RFbmZvcmNpbmdEZXBzKAogICAgIG9wdGlvbnMtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkpOwogICBpZiAoIXN5bWJvbC5Jc051bGwoKSAmJiBzeW1ib2wudHlwZSA9PSBTeW1ib2w6Ok1FU1NBR0UpIHsKQEAgLTM5MzksOCArNTY0Niw4IEBACiAgICAgICAvLyBEZXNjcmlwdG9yUG9vbDo6RmluZEV4dGVuc2lvbkJ5TmFtZSgpLCBmb3IgdHdvIHJlYXNvbnM6IDEpIEl0IGFsbG93cwogICAgICAgLy8gcmVsYXRpdmUgbG9va3VwcywgYW5kIDIpIGJlY2F1c2Ugd2UncmUgYWxyZWFkeSBob2xkaW5nIHRoZSBwb29sJ3MKICAgICAgIC8vIG11dGV4LCBhbmQgdGhlIGxhdHRlciBtZXRob2QgbG9ja3MgaXQgYWdhaW4uCi0gICAgICBTeW1ib2wgc3ltYm9sID0gYnVpbGRlcl8tPkxvb2t1cFN5bWJvbChuYW1lX3BhcnQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvcHRpb25zX3RvX2ludGVycHJldF8tPm5hbWVfc2NvcGUpOworICAgICAgc3ltYm9sID0gYnVpbGRlcl8tPkxvb2t1cFN5bWJvbChuYW1lX3BhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9wdGlvbnNfdG9faW50ZXJwcmV0Xy0+bmFtZV9zY29wZSk7CiAgICAgICBpZiAoIXN5bWJvbC5Jc051bGwoKSAmJiBzeW1ib2wudHlwZSA9PSBTeW1ib2w6OkZJRUxEKSB7CiAgICAgICAgIGZpZWxkID0gc3ltYm9sLmZpZWxkX2Rlc2NyaXB0b3I7CiAgICAgICB9CkBAIC0zOTYwLDYgKzU2NjcsMTUgQEAKICAgICAgICAgLy8gc28gd2Ugd2lsbCBqdXN0IGxlYXZlIGl0IGFzIHVuaW50ZXJwcmV0ZWQuCiAgICAgICAgIEFkZFdpdGhvdXRJbnRlcnByZXRpbmcoKnVuaW50ZXJwcmV0ZWRfb3B0aW9uXywgb3B0aW9ucyk7CiAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfSBlbHNlIGlmICghKGJ1aWxkZXJfLT51bmRlZmluZV9yZXNvbHZlZF9uYW1lXykuZW1wdHkoKSkgeworICAgICAgICAvLyBPcHRpb24gaXMgcmVzb2x2ZWQgdG8gYSBuYW1lIHdoaWNoIGlzIG5vdCBkZWZpbmVkLgorICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKAorICAgICAgICAgICAgIk9wdGlvbiBcIiIgKyBkZWJ1Z19tc2dfbmFtZSArICJcIiBpcyByZXNvbHZlZCB0byBcIigiICsKKyAgICAgICAgICAgIGJ1aWxkZXJfLT51bmRlZmluZV9yZXNvbHZlZF9uYW1lXyArCisgICAgICAgICAgICAiKVwiLCB3aGljaCBpcyBub3QgZGVmaW5lZC4gVGhlIGlubmVybW9zdCBzY29wZSBpcyBzZWFyY2hlZCBmaXJzdCAiCisgICAgICAgICAgICAiaW4gbmFtZSByZXNvbHV0aW9uLiBDb25zaWRlciB1c2luZyBhIGxlYWRpbmcgJy4nKGkuZS4sIFwiKC4iICsKKyAgICAgICAgICAgIGRlYnVnX21zZ19uYW1lLnN1YnN0cigxKSArCisgICAgICAgICAgICAiXCIpIHRvIHN0YXJ0IGZyb20gdGhlIG91dGVybW9zdCBzY29wZS4iKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBcIiIgKyBkZWJ1Z19tc2dfbmFtZSArICJcIiB1bmtub3duLiIpOwogICAgICAgfQpAQCAtMzk4MCwxNCArNTY5NiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcIiBpcyBub3QgYSBmaWVsZCBvciBleHRlbnNpb24gb2YgbWVzc2FnZSBcIiIgKwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPm5hbWUoKSArICJcIi4iKTsKICAgICAgIH0KLSAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gZmllbGQgXCIiICsgZGVidWdfbXNnX25hbWUgKwotICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgcmVwZWF0ZWQuIFJlcGVhdGVkIG9wdGlvbnMgYXJlIG5vdCAiCi0gICAgICAgICAgICAgICAgICAgICAgICAgICJzdXBwb3J0ZWQuIik7CiAgICAgfSBlbHNlIGlmIChpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fLT5uYW1lX3NpemUoKSAtIDEpIHsKICAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewogICAgICAgICByZXR1cm4gQWRkTmFtZUVycm9yKCJPcHRpb24gXCIiICsgIGRlYnVnX21zZ19uYW1lICsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaXMgYW4gYXRvbWljIHR5cGUsIG5vdCBhIG1lc3NhZ2UuIik7CisgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgIHJldHVybiBBZGROYW1lRXJyb3IoIk9wdGlvbiBmaWVsZCBcIiIgKyBkZWJ1Z19tc2dfbmFtZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlwiIGlzIGEgcmVwZWF0ZWQgbWVzc2FnZS4gUmVwZWF0ZWQgbWVzc2FnZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9wdGlvbnMgbXVzdCBiZSBpbml0aWFsaXplZCB1c2luZyBhbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFnZ3JlZ2F0ZSB2YWx1ZS4iKTsKICAgICAgIH0gZWxzZSB7CiAgICAgICAgIC8vIERyaWxsIGRvd24gaW50byB0aGUgc3VibWVzc2FnZS4KICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkcy5wdXNoX2JhY2soZmllbGQpOwpAQCAtNDAwNCw3ICs1NzIxLDcgQEAKICAgLy8ga25vd24gd2lsbCBwb3B1bGF0ZSB0aGVtIGNvcnJlY3RseS4KIAogICAvLyBGaXJzdCBzZWUgaWYgdGhlIG9wdGlvbiBpcyBhbHJlYWR5IHNldC4KLSAgaWYgKCFFeGFtaW5lSWZPcHRpb25Jc1NldCgKKyAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiAhRXhhbWluZUlmT3B0aW9uSXNTZXQoCiAgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkcy5iZWdpbigpLAogICAgICAgICAgIGludGVybWVkaWF0ZV9maWVsZHMuZW5kKCksCiAgICAgICAgICAgZmllbGQsIGRlYnVnX21zZ19uYW1lLApAQCAtNDAxNSw3ICs1NzMyLDcgQEAKIAogICAvLyBGaXJzdCBzZXQgdGhlIHZhbHVlIG9uIHRoZSBVbmtub3duRmllbGRTZXQgY29ycmVzcG9uZGluZyB0byB0aGUKICAgLy8gaW5uZXJtb3N0IG1lc3NhZ2UuCi0gIHNjb3BlZF9wdHI8VW5rbm93bkZpZWxkU2V0PiB1bmtub3duX2ZpZWxkcyhuZXcgVW5rbm93bkZpZWxkU2V0KCkpOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPFVua25vd25GaWVsZFNldD4gdW5rbm93bl9maWVsZHMobmV3IFVua25vd25GaWVsZFNldCgpKTsKICAgaWYgKCFTZXRPcHRpb25WYWx1ZShmaWVsZCwgdW5rbm93bl9maWVsZHMuZ2V0KCkpKSB7CiAgICAgcmV0dXJuIGZhbHNlOyAgLy8gU2V0T3B0aW9uVmFsdWUoKSBhbHJlYWR5IGFkZGVkIHRoZSBlcnJvci4KICAgfQpAQCAtNDAyNSwxMyArNTc0MiwxNCBAQAogICBmb3IgKHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPjo6cmV2ZXJzZV9pdGVyYXRvciBpdGVyID0KICAgICAgICAgICAgaW50ZXJtZWRpYXRlX2ZpZWxkcy5yYmVnaW4oKTsKICAgICAgICBpdGVyICE9IGludGVybWVkaWF0ZV9maWVsZHMucmVuZCgpOyArK2l0ZXIpIHsKLSAgICBzY29wZWRfcHRyPFVua25vd25GaWVsZFNldD4gcGFyZW50X3Vua25vd25fZmllbGRzKG5ldyBVbmtub3duRmllbGRTZXQoKSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxVbmtub3duRmllbGRTZXQ+IHBhcmVudF91bmtub3duX2ZpZWxkcygKKyAgICAgICAgbmV3IFVua25vd25GaWVsZFNldCgpKTsKICAgICBzd2l0Y2ggKCgqaXRlciktPnR5cGUoKSkgewogICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRTogewogICAgICAgICBpbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHN0cigKICAgICAgICAgICAgIHBhcmVudF91bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKCgqaXRlciktPm51bWJlcigpKSk7CiAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXQoJm91dHN0cik7Ci0gICAgICAgIGludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygqdW5rbm93bl9maWVsZHMsICZvdXQpOworICAgICAgICBpbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygqdW5rbm93bl9maWVsZHMsICZvdXQpOwogICAgICAgICBHT09HTEVfQ0hFQ0soIW91dC5IYWRFcnJvcigpKQogICAgICAgICAgICAgPDwgIlVuZXhwZWN0ZWQgZmFpbHVyZSB3aGlsZSBzZXJpYWxpemluZyBvcHRpb24gc3VibWVzc2FnZSAiCiAgICAgICAgICAgICA8PCBkZWJ1Z19tc2dfbmFtZSA8PCAiXCIuIjsKQEAgLTQzNDQsMTQgKzYwNjIsMzIgQEAKICAgdmlydHVhbCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb24oCiAgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKICAgICBhc3NlcnRfbXV0ZXhfaGVsZChidWlsZGVyXy0+cG9vbF8pOworICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CiAgICAgU3ltYm9sIHJlc3VsdCA9IGJ1aWxkZXJfLT5Mb29rdXBTeW1ib2xOb1BsYWNlaG9sZGVyKAotICAgICAgICBuYW1lLCBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpKTsKKyAgICAgICAgbmFtZSwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkpOwogICAgIGlmIChyZXN1bHQudHlwZSA9PSBTeW1ib2w6OkZJRUxEICYmCiAgICAgICAgIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yLT5pc19leHRlbnNpb24oKSkgewogICAgICAgcmV0dXJuIHJlc3VsdC5maWVsZF9kZXNjcmlwdG9yOwotICAgIH0gZWxzZSB7Ci0gICAgICByZXR1cm4gTlVMTDsKKyAgICB9IGVsc2UgaWYgKHJlc3VsdC50eXBlID09IFN5bWJvbDo6TUVTU0FHRSAmJgorICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkpIHsKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fdHlwZSA9IHJlc3VsdC5kZXNjcmlwdG9yOworICAgICAgLy8gVGhlIHRleHQgZm9ybWF0IGFsbG93cyBNZXNzYWdlU2V0IGl0ZW1zIHRvIGJlIHNwZWNpZmllZCB1c2luZworICAgICAgLy8gdGhlIHR5cGUgbmFtZSwgcmF0aGVyIHRoYW4gdGhlIGV4dGVuc2lvbiBpZGVudGlmaWVyLiBJZiB0aGUgc3ltYm9sCisgICAgICAvLyBsb29rdXAgcmV0dXJuZWQgYSBNZXNzYWdlLCBhbmQgdGhlIGVuY2xvc2luZyBNZXNzYWdlIGhhcworICAgICAgLy8gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSB0cnVlLCB0aGVuIHJldHVybiB0aGUgbWVzc2FnZSBzZXQKKyAgICAgIC8vIGV4dGVuc2lvbiwgaWYgb25lIGV4aXN0cy4KKyAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZm9yZWlnbl90eXBlLT5leHRlbnNpb25fY291bnQoKTsgaSsrKSB7CisgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXh0ZW5zaW9uID0gZm9yZWlnbl90eXBlLT5leHRlbnNpb24oaSk7CisgICAgICAgIGlmIChleHRlbnNpb24tPmNvbnRhaW5pbmdfdHlwZSgpID09IGRlc2NyaXB0b3IgJiYKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFICYmCisgICAgICAgICAgICBleHRlbnNpb24tPmlzX29wdGlvbmFsKCkgJiYKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV90eXBlKCkgPT0gZm9yZWlnbl90eXBlKSB7CisgICAgICAgICAgLy8gRm91bmQgaXQuCisgICAgICAgICAgcmV0dXJuIGV4dGVuc2lvbjsKKyAgICAgICAgfQorICAgICAgfQogICAgIH0KKyAgICByZXR1cm4gTlVMTDsKICAgfQogfTsKIApAQCAtNDM2MSwxNCArNjA5NywxNiBAQAogIHB1YmxpYzoKICAgc3RyaW5nIGVycm9yXzsKIAotICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoaW50IGxpbmUsIGludCBjb2x1bW4sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoaW50IC8qIGxpbmUgKi8sIGludCAvKiBjb2x1bW4gKi8sCisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKICAgICBpZiAoIWVycm9yXy5lbXB0eSgpKSB7CiAgICAgICBlcnJvcl8gKz0gIjsgIjsKICAgICB9CiAgICAgZXJyb3JfICs9IG1lc3NhZ2U7CiAgIH0KIAotICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgIHZpcnR1YWwgdm9pZCBBZGRXYXJuaW5nKGludCAvKiBsaW5lICovLCBpbnQgLyogY29sdW1uICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIC8qIG1lc3NhZ2UgKi8pIHsKICAgICAvLyBJZ25vcmUgd2FybmluZ3MKICAgfQogfTsKQEAgLTQzOTEsNyArNjEyOSw3IEBACiAgIH0KIAogICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlID0gb3B0aW9uX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKTsKLSAgc2NvcGVkX3B0cjxNZXNzYWdlPiBkeW5hbWljKGR5bmFtaWNfZmFjdG9yeV8uR2V0UHJvdG90eXBlKHR5cGUpLT5OZXcoKSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gZHluYW1pYyhkeW5hbWljX2ZhY3RvcnlfLkdldFByb3RvdHlwZSh0eXBlKS0+TmV3KCkpOwogICBHT09HTEVfQ0hFQ0soZHluYW1pYy5nZXQoKSAhPSBOVUxMKQogICAgICAgPDwgIkNvdWxkIG5vdCBjcmVhdGUgYW4gaW5zdGFuY2Ugb2YgIiA8PCBvcHRpb25fZmllbGQtPkRlYnVnU3RyaW5nKCk7CiAKQEAgLTQ0MDksNyArNjE0NywxMyBAQAogICB9IGVsc2UgewogICAgIHN0cmluZyBzZXJpYWw7CiAgICAgZHluYW1pYy0+U2VyaWFsaXplVG9TdHJpbmcoJnNlcmlhbCk7ICAvLyBOZXZlciBmYWlscwotICAgIHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwgc2VyaWFsKTsKKyAgICBpZiAob3B0aW9uX2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSwgc2VyaWFsKTsKKyAgICB9IGVsc2UgeworICAgICAgR09PR0xFX0NIRUNLX0VRKG9wdGlvbl9maWVsZC0+dHlwZSgpLCAgRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKTsKKyAgICAgIFVua25vd25GaWVsZFNldCogZ3JvdXAgPSB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAob3B0aW9uX2ZpZWxkLT5udW1iZXIoKSk7CisgICAgICBncm91cC0+UGFyc2VGcm9tU3RyaW5nKHNlcmlhbCk7CisgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9CiB9CkBAIC00NDkzLDUgKzYyMzcsNDAgQEAKICAgfQogfQogCit2b2lkIERlc2NyaXB0b3JCdWlsZGVyOjpMb2dVbnVzZWREZXBlbmRlbmN5KGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogcmVzdWx0KSB7CisKKyAgaWYgKCF1bnVzZWRfZGVwZW5kZW5jeV8uZW1wdHkoKSkgeworICAgIHN0ZDo6c2V0PHN0cmluZz4gYW5ub3RhdGlvbl9leHRlbnNpb25zOworICAgIGFubm90YXRpb25fZXh0ZW5zaW9ucy5pbnNlcnQoImdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyIpOworICAgIGFubm90YXRpb25fZXh0ZW5zaW9ucy5pbnNlcnQoImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyIpOworICAgIGFubm90YXRpb25fZXh0ZW5zaW9ucy5pbnNlcnQoImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMiKTsKKyAgICBhbm5vdGF0aW9uX2V4dGVuc2lvbnMuaW5zZXJ0KCJnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMiKTsKKyAgICBhbm5vdGF0aW9uX2V4dGVuc2lvbnMuaW5zZXJ0KCJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyIpOworICAgIGFubm90YXRpb25fZXh0ZW5zaW9ucy5pbnNlcnQoImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucyIpOworICAgIGFubm90YXRpb25fZXh0ZW5zaW9ucy5pbnNlcnQoImdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIik7CisgICAgYW5ub3RhdGlvbl9leHRlbnNpb25zLmluc2VydCgiZ29vZ2xlLnByb3RvYnVmLlN0cmVhbU9wdGlvbnMiKTsKKyAgICBmb3IgKHNldDxjb25zdCBGaWxlRGVzY3JpcHRvcio+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgIGl0ID0gdW51c2VkX2RlcGVuZGVuY3lfLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSB1bnVzZWRfZGVwZW5kZW5jeV8uZW5kKCk7ICsraXQpIHsKKyAgICAgIC8vIERvIG5vdCBsb2cgd2FybmluZ3MgZm9yIHByb3RvIGZpbGVzIHdoaWNoIGV4dGVuZCBhbm5vdGF0aW9ucy4KKyAgICAgIGludCBpOworICAgICAgZm9yIChpID0gMCA7IGkgPCAoKml0KS0+ZXh0ZW5zaW9uX2NvdW50KCk7ICsraSkgeworICAgICAgICBpZiAoYW5ub3RhdGlvbl9leHRlbnNpb25zLmZpbmQoCisgICAgICAgICAgICAgICAgKCppdCktPmV4dGVuc2lvbihpKS0+Y29udGFpbmluZ190eXBlKCktPmZ1bGxfbmFtZSgpKQorICAgICAgICAgICAgIT0gYW5ub3RhdGlvbl9leHRlbnNpb25zLmVuZCgpKSB7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIC8vIExvZyB3YXJuaW5ncyBmb3IgdW51c2VkIGltcG9ydGVkIGZpbGVzLgorICAgICAgaWYgKGkgPT0gKCppdCktPmV4dGVuc2lvbl9jb3VudCgpKSB7CisgICAgICAgIHN0cmluZyBlcnJvcl9tZXNzYWdlID0gIkltcG9ydCAiICsgKCppdCktPm5hbWUoKSArICIgYnV0IG5vdCB1c2VkLiI7CisgICAgICAgIEFkZFdhcm5pbmcoKCppdCktPm5hbWUoKSwgcHJvdG8sIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3Rvcjo6T1RIRVIsCisgICAgICAgICAgICAgICAgICAgZXJyb3JfbWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oCmluZGV4IDdmODdkZDguLjNlY2MwYTkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTU0LDEwICs1NCwyMCBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfREVTQ1JJUFRPUl9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0RFU0NSSVBUT1JfSF9fCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCisjaW5jbHVkZSA8c2V0PgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zY29wZWRfcHRyLmg+CiAKKy8vIFRZUEVfQk9PTCBpcyBkZWZpbmVkIGluIHRoZSBNYWNPUydzIENvbmRpdGlvbmFsTWFjcm9zLmguCisjaWZkZWYgVFlQRV9CT09MCisjdW5kZWYgVFlQRV9CT09MCisjZW5kaWYgIC8vIFRZUEVfQk9PTAogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CkBAIC02NSw2ICs3NSw3IEBACiAvLyBEZWZpbmVkIGluIHRoaXMgZmlsZS4KIGNsYXNzIERlc2NyaXB0b3I7CiBjbGFzcyBGaWVsZERlc2NyaXB0b3I7CitjbGFzcyBPbmVvZkRlc2NyaXB0b3I7CiBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7CiBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKQEAgLTc2LDYgKzg3LDcgQEAKIC8vIERlZmluZWQgaW4gZGVzY3JpcHRvci5wcm90bwogY2xhc3MgRGVzY3JpcHRvclByb3RvOwogY2xhc3MgRmllbGREZXNjcmlwdG9yUHJvdG87CitjbGFzcyBPbmVvZkRlc2NyaXB0b3JQcm90bzsKIGNsYXNzIEVudW1EZXNjcmlwdG9yUHJvdG87CiBjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG87CiBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOwpAQCAtODksNiArMTAxLDcgQEAKIGNsYXNzIE1ldGhvZE9wdGlvbnM7CiBjbGFzcyBGaWxlT3B0aW9uczsKIGNsYXNzIFVuaW50ZXJwcmV0ZWRPcHRpb247CitjbGFzcyBTb3VyY2VDb2RlSW5mbzsKIAogLy8gRGVmaW5lZCBpbiBtZXNzYWdlLmgKIGNsYXNzIE1lc3NhZ2U7CkBAIC0xMDAsNiArMTEzLDU3IEBACiAvLyBEZWZpbmVkIGluIHVua25vd25fZmllbGRfc2V0LmguCiBjbGFzcyBVbmtub3duRmllbGQ7CiAKKy8vIERlZmluZWQgaW4gZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oLgorbmFtZXNwYWNlIGludGVybmFsIHsKK2NsYXNzIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIERlZmluZWQgaW4gY29tbWFuZF9saW5lX2ludGVyZmFjZS5jYworbmFtZXNwYWNlIGNvbXBpbGVyIHsKK2NsYXNzIENvbW1hbmRMaW5lSW50ZXJmYWNlOworfSAgLy8gbmFtZXNwYWNlIGNvbXBpbGVyCisKK25hbWVzcGFjZSBkZXNjcmlwdG9yX3VuaXR0ZXN0IHsKK2NsYXNzIERlc2NyaXB0b3JUZXN0OworfSAgLy8gbmFtZXNwYWNlIGRlc2NyaXB0b3JfdW5pdHRlc3QKKworLy8gRGVmaW5lZCBpbiBwcmludGVyLmgKK25hbWVzcGFjZSBpbyB7CitjbGFzcyBQcmludGVyOworfSAgLy8gbmFtZXNwYWNlIGlvCisKKy8vIE5CLCBhbGwgaW5kaWNlcyBhcmUgemVyby1iYXNlZC4KK3N0cnVjdCBTb3VyY2VMb2NhdGlvbiB7CisgIGludCBzdGFydF9saW5lOworICBpbnQgZW5kX2xpbmU7CisgIGludCBzdGFydF9jb2x1bW47CisgIGludCBlbmRfY29sdW1uOworCisgIC8vIERvYyBjb21tZW50cyBmb3VuZCBhdCB0aGUgc291cmNlIGxvY2F0aW9uLgorICAvLyBTZWUgdGhlIGNvbW1lbnRzIGluIFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIChkZXNjcmlwdG9yLnByb3RvKSBmb3IgZGV0YWlscy4KKyAgc3RyaW5nIGxlYWRpbmdfY29tbWVudHM7CisgIHN0cmluZyB0cmFpbGluZ19jb21tZW50czsKKyAgdmVjdG9yPHN0cmluZz4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50czsKK307CisKKy8vIE9wdGlvbnMgd2hlbiBnZW5lcmF0aW5nIG1hY2hpbmUtcGFyc2FibGUgb3V0cHV0IGZyb20gYSBkZXNjcmlwdG9yIHdpdGgKKy8vIERlYnVnU3RyaW5nKCkuCitzdHJ1Y3QgRGVidWdTdHJpbmdPcHRpb25zIHsKKyAgLy8gaW5jbHVkZSBvcmlnaW5hbCB1c2VyIGNvbW1lbnRzIGFzIHJlY29yZGVkIGluIFNvdXJjZUxvY2F0aW9uIGVudHJpZXMuIE4uQi4KKyAgLy8gdGhhdCB0aGlzIG11c3QgYmUgfGZhbHNlfCBieSBkZWZhdWx0OiBzZXZlcmFsIG90aGVyIHBpZWNlcyBvZiBjb2RlIChmb3IKKyAgLy8gZXhhbXBsZSwgdGhlIEMrKyBjb2RlIGdlbmVyYXRpb24gZm9yIGZpZWxkcyBpbiB0aGUgcHJvdG8gY29tcGlsZXIpIHJlbHkgb24KKyAgLy8gRGVidWdTdHJpbmcoKSBvdXRwdXQgYmVpbmcgdW5vYnN0cnVjdGVkIGJ5IHVzZXIgY29tbWVudHMuCisgIGJvb2wgaW5jbHVkZV9jb21tZW50czsKKyAgLy8gSWYgdHJ1ZSwgZWxpZGUgdGhlIGJyYWNlZCBib2R5IGluIHRoZSBkZWJ1ZyBzdHJpbmcuCisgIGJvb2wgZWxpZGVfZ3JvdXBfYm9keTsKKyAgYm9vbCBlbGlkZV9vbmVvZl9ib2R5OworCisgIERlYnVnU3RyaW5nT3B0aW9ucygpCisgICAgICA6IGluY2x1ZGVfY29tbWVudHMoZmFsc2UpLAorICAgICAgICBlbGlkZV9ncm91cF9ib2R5KGZhbHNlKSwKKyAgICAgICAgZWxpZGVfb25lb2ZfYm9keShmYWxzZSkge30KK307CisKIC8vIERlc2NyaWJlcyBhIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSwgb3IgYSBwYXJ0aWN1bGFyIGdyb3VwIHdpdGhpbiBhCiAvLyBtZXNzYWdlLiAgVG8gb2J0YWluIHRoZSBEZXNjcmlwdG9yIGZvciBhIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LCBjYWxsCiAvLyBNZXNzYWdlOjpHZXREZXNjcmlwdG9yKCkuICBHZW5lcmF0ZWQgbWVzc2FnZSBjbGFzc2VzIGFsc28gaGF2ZSBhCkBAIC0xNDQsNiArMjA4LDE1IEBACiAgIC8vIHdpbGwgYmUgc3VpdGFibGUgZm9yIHJlLXBhcnNpbmcuCiAgIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwogCisgIC8vIFNpbWlsYXIgdG8gRGVidWdTdHJpbmcoKSwgYnV0IGFkZGl0aW9uYWxseSB0YWtlcyBvcHRpb25zIChlLmcuLAorICAvLyBpbmNsdWRlIG9yaWdpbmFsIHVzZXIgY29tbWVudHMgaW4gb3V0cHV0KS4KKyAgc3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIHR5cGUuIFRoaXMgd2lsbAorICAvLyBvbmx5IGJlIHRoZSBjYXNlIGlmIHRoaXMgZGVzY3JpcHRvciBjb21lcyBmcm9tIGEgRGVzY3JpcHRvclBvb2wKKyAgLy8gd2l0aCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBzZXQuCisgIGJvb2wgaXNfcGxhY2Vob2xkZXIoKSBjb25zdDsKKwogICAvLyBGaWVsZCBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIC8vIFRoZSBudW1iZXIgb2YgZmllbGRzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgpAQCAtMTcxLDYgKzI0NCwxNSBAQAogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRGaWVsZEJ5Q2FtZWxjYXNlTmFtZSgKICAgICAgIGNvbnN0IHN0cmluZyYgY2FtZWxjYXNlX25hbWUpIGNvbnN0OwogCisgIC8vIFRoZSBudW1iZXIgb2Ygb25lb2ZzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgorICBpbnQgb25lb2ZfZGVjbF9jb3VudCgpIGNvbnN0OworICAvLyBHZXQgYSBvbmVvZiBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8IG9uZW9mX2RlY2xfY291bnQoKS4KKyAgLy8gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZCBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVjbChpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIExvb2tzIHVwIGEgb25lb2YgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBubyBzdWNoIG9uZW9mIGV4aXN0cy4KKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBGaW5kT25lb2ZCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKKwogICAvLyBOZXN0ZWQgdHlwZSBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAgIC8vIFRoZSBudW1iZXIgb2YgbmVzdGVkIHR5cGVzIGluIHRoaXMgbWVzc2FnZSB0eXBlLgpAQCAtMjE3LDYgKzI5OSw5IEBACiAgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgbnVtYmVyIGlzIGluIG9uZSBvZiB0aGUgZXh0ZW5zaW9uIHJhbmdlcy4KICAgYm9vbCBJc0V4dGVuc2lvbk51bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKIAorICAvLyBSZXR1cm5zIE5VTEwgaWYgbm8gZXh0ZW5zaW9uIHJhbmdlIGNvbnRhaW5zIHRoZSBnaXZlbiBudW1iZXIuCisgIGNvbnN0IEV4dGVuc2lvblJhbmdlKiBGaW5kRXh0ZW5zaW9uUmFuZ2VDb250YWluaW5nTnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworCiAgIC8vIFRoZSBudW1iZXIgb2YgZXh0ZW5zaW9ucyAtLSBleHRlbmRpbmcgKm90aGVyKiBtZXNzYWdlcyAtLSB0aGF0IHdlcmUKICAgLy8gZGVmaW5lZCBuZXN0ZWQgd2l0aGluIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgc2NvcGUuCiAgIGludCBleHRlbnNpb25fY291bnQoKSBjb25zdDsKQEAgLTIzNiwxMiArMzIxLDY2IEBACiAgIC8vIHRoaXMgbWVzc2FnZSB0eXBlJ3Mgc2NvcGUuCiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEV4dGVuc2lvbkJ5Q2FtZWxjYXNlTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwogCisgIC8vIFJlc2VydmVkIGZpZWxkcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gQSByYW5nZSBvZiByZXNlcnZlZCBmaWVsZCBudW1iZXJzLgorICBzdHJ1Y3QgUmVzZXJ2ZWRSYW5nZSB7CisgICAgaW50IHN0YXJ0OyAgLy8gaW5jbHVzaXZlCisgICAgaW50IGVuZDsgICAgLy8gZXhjbHVzaXZlCisgIH07CisKKyAgLy8gVGhlIG51bWJlciBvZiByZXNlcnZlZCByYW5nZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCByZXNlcnZlZF9yYW5nZV9jb3VudCgpIGNvbnN0OworICAvLyBHZXRzIGFuIHJlc2VydmVkIHJhbmdlIGJ5IGluZGV4LCB3aGVyZSAwIDw9IGluZGV4IDwKKyAgLy8gcmVzZXJ2ZWRfcmFuZ2VfY291bnQoKS4gVGhlc2UgYXJlIHJldHVybmVkIGluIHRoZSBvcmRlciB0aGV5IHdlcmUgZGVmaW5lZAorICAvLyBpbiB0aGUgLnByb3RvIGZpbGUuCisgIGNvbnN0IFJlc2VydmVkUmFuZ2UqIHJlc2VydmVkX3JhbmdlKGludCBpbmRleCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBudW1iZXIgaXMgaW4gb25lIG9mIHRoZSByZXNlcnZlZCByYW5nZXMuCisgIGJvb2wgSXNSZXNlcnZlZE51bWJlcihpbnQgbnVtYmVyKSBjb25zdDsKKworICAvLyBSZXR1cm5zIE5VTEwgaWYgbm8gcmVzZXJ2ZWQgcmFuZ2UgY29udGFpbnMgdGhlIGdpdmVuIG51bWJlci4KKyAgY29uc3QgUmVzZXJ2ZWRSYW5nZSogRmluZFJlc2VydmVkUmFuZ2VDb250YWluaW5nTnVtYmVyKGludCBudW1iZXIpIGNvbnN0OworCisgIC8vIFRoZSBudW1iZXIgb2YgcmVzZXJ2ZWQgZmllbGQgbmFtZXMgaW4gdGhpcyBtZXNzYWdlIHR5cGUuCisgIGludCByZXNlcnZlZF9uYW1lX2NvdW50KCkgY29uc3Q7CisKKyAgLy8gR2V0cyBhIHJlc2VydmVkIG5hbWUgYnkgaW5kZXgsIHdoZXJlIDAgPD0gaW5kZXggPCByZXNlcnZlZF9uYW1lX2NvdW50KCkuCisgIGNvbnN0IHN0cmluZyYgcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0OworCisgIC8vIFJldHVybnMgdHJ1ZSBpZiB0aGUgZmllbGQgbmFtZSBpcyByZXNlcnZlZC4KKyAgYm9vbCBJc1Jlc2VydmVkTmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworCisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhpcyBtZXNzYWdlIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCiAgcHJpdmF0ZToKICAgdHlwZWRlZiBNZXNzYWdlT3B0aW9ucyBPcHRpb25zVHlwZTsKIAorICAvLyBBbGxvd3MgdGVzdHMgdG8gdGVzdCBDb3B5VG8ocHJvdG8sIHRydWUpLgorICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjpkZXNjcmlwdG9yX3VuaXR0ZXN0OjpEZXNjcmlwdG9yVGVzdDsKKworICAvLyBBbGxvd3MgYWNjZXNzIHRvIEdldExvY2F0aW9uUGF0aCBmb3IgYW5ub3RhdGlvbnMuCisgIGZyaWVuZCBjbGFzcyA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpQcmludGVyOworCisgIC8vIEZpbGwgdGhlIGpzb25fbmFtZSBmaWVsZCBvZiBGaWVsZERlc2NyaXB0b3JQcm90by4KKyAgdm9pZCBDb3B5SnNvbk5hbWVUbyhEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKwogICAvLyBJbnRlcm5hbCB2ZXJzaW9uIG9mIERlYnVnU3RyaW5nOyBjb250cm9scyB0aGUgbGV2ZWwgb2YgaW5kZW50aW5nIGZvcgotICAvLyBjb3JyZWN0IGRlcHRoCi0gIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKyAgLy8gY29ycmVjdCBkZXB0aC4gVGFrZXMgfG9wdGlvbnN8IHRvIGNvbnRyb2wgZGVidWctc3RyaW5nIG9wdGlvbnMsIGFuZAorICAvLyB8aW5jbHVkZV9vcGVuaW5nX2NsYXVzZXwgdG8gaW5kaWNhdGUgd2hldGhlciB0aGUgIm1lc3NhZ2UgLi4uICIgcGFydCBvZiB0aGUKKyAgLy8gY2xhdXNlIGhhcyBhbHJlYWR5IGJlZW4gZ2VuZXJhdGVkICh0aGlzIHZhcmllcyBkZXBlbmRpbmcgb24gY29udGV4dCkuCisgIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucywKKyAgICAgICAgICAgICAgICAgICBib29sIGluY2x1ZGVfb3BlbmluZ19jbGF1c2UpIGNvbnN0OworCisgIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCisgIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCisgIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CiAKICAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKICAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOwpAQCAtMjU2LDYgKzM5NSw4IEBACiAKICAgaW50IGZpZWxkX2NvdW50XzsKICAgRmllbGREZXNjcmlwdG9yKiBmaWVsZHNfOworICBpbnQgb25lb2ZfZGVjbF9jb3VudF87CisgIE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVjbHNfOwogICBpbnQgbmVzdGVkX3R5cGVfY291bnRfOwogICBEZXNjcmlwdG9yKiBuZXN0ZWRfdHlwZXNfOwogICBpbnQgZW51bV90eXBlX2NvdW50XzsKQEAgLTI2NCw2ICs0MDUsMTAgQEAKICAgRXh0ZW5zaW9uUmFuZ2UqIGV4dGVuc2lvbl9yYW5nZXNfOwogICBpbnQgZXh0ZW5zaW9uX2NvdW50XzsKICAgRmllbGREZXNjcmlwdG9yKiBleHRlbnNpb25zXzsKKyAgaW50IHJlc2VydmVkX3JhbmdlX2NvdW50XzsKKyAgUmVzZXJ2ZWRSYW5nZSogcmVzZXJ2ZWRfcmFuZ2VzXzsKKyAgaW50IHJlc2VydmVkX25hbWVfY291bnRfOworICBjb25zdCBzdHJpbmcqKiByZXNlcnZlZF9uYW1lc187CiAgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKICAgLy8gb2YgQWxsb2NhdGU8RGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxEZXNjcmlwdG9yPigpIGluIGRlc2NyaXB0b3IuY2MKICAgLy8gYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgpAQCAtMjczLDYgKzQxOCw3IEBACiAgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKICAgZnJpZW5kIGNsYXNzIEVudW1EZXNjcmlwdG9yOwogICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgT25lb2ZEZXNjcmlwdG9yOwogICBmcmllbmQgY2xhc3MgTWV0aG9kRGVzY3JpcHRvcjsKICAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yOwogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRGVzY3JpcHRvcik7CkBAIC0zNjUsNiArNTExLDcgQEAKIAogICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdDsgICAgICAgIC8vIE5hbWUgb2YgdGhpcyBmaWVsZCB3aXRoaW4gdGhlIG1lc3NhZ2UuCiAgIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lKCkgY29uc3Q7ICAgLy8gRnVsbHktcXVhbGlmaWVkIG5hbWUgb2YgdGhlIGZpZWxkLgorICBjb25zdCBzdHJpbmcmIGpzb25fbmFtZSgpIGNvbnN0OyAgIC8vIEpTT04gbmFtZSBvZiB0aGlzIGZpZWxkLgogICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSgpIGNvbnN0Oy8vIEZpbGUgaW4gd2hpY2ggdGhpcyBmaWVsZCB3YXMgZGVmaW5lZC4KICAgYm9vbCBpc19leHRlbnNpb24oKSBjb25zdDsgICAgICAgICAvLyBJcyB0aGlzIGFuIGV4dGVuc2lvbiBmaWVsZD8KICAgaW50IG51bWJlcigpIGNvbnN0OyAgICAgICAgICAgICAgICAvLyBEZWNsYXJlZCB0YWcgbnVtYmVyLgpAQCAtMzg4LDE1ICs1MzUsMjEgQEAKICAgLy8gd2hlbiBwYXJzaW5nIGZvcm1hdHMgd2hpY2ggcHJlZmVyIHRvIHVzZSBjYW1lbC1jYXNlIG5hbWluZyBzdHlsZS4KICAgY29uc3Qgc3RyaW5nJiBjYW1lbGNhc2VfbmFtZSgpIGNvbnN0OwogCi0gIFR5cGUgdHlwZSgpIGNvbnN0OyAgICAgICAgICAgICAgICAgLy8gRGVjbGFyZWQgdHlwZSBvZiB0aGlzIGZpZWxkLgotICBDcHBUeXBlIGNwcF90eXBlKCkgY29uc3Q7ICAgICAgICAgIC8vIEMrKyB0eXBlIG9mIHRoaXMgZmllbGQuCi0gIExhYmVsIGxhYmVsKCkgY29uc3Q7ICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwvcmVxdWlyZWQvcmVwZWF0ZWQKKyAgVHlwZSB0eXBlKCkgY29uc3Q7ICAgICAgICAgICAgICAgICAgLy8gRGVjbGFyZWQgdHlwZSBvZiB0aGlzIGZpZWxkLgorICBjb25zdCBjaGFyKiB0eXBlX25hbWUoKSBjb25zdDsgICAgICAvLyBOYW1lIG9mIHRoZSBkZWNsYXJlZCB0eXBlLgorICBDcHBUeXBlIGNwcF90eXBlKCkgY29uc3Q7ICAgICAgICAgICAvLyBDKysgdHlwZSBvZiB0aGlzIGZpZWxkLgorICBjb25zdCBjaGFyKiBjcHBfdHlwZV9uYW1lKCkgY29uc3Q7ICAvLyBOYW1lIG9mIHRoZSBDKysgdHlwZS4KKyAgTGFiZWwgbGFiZWwoKSBjb25zdDsgICAgICAgICAgICAgICAgLy8gb3B0aW9uYWwvcmVxdWlyZWQvcmVwZWF0ZWQKIAogICBib29sIGlzX3JlcXVpcmVkKCkgY29uc3Q7ICAgICAgLy8gc2hvcnRoYW5kIGZvciBsYWJlbCgpID09IExBQkVMX1JFUVVJUkVECiAgIGJvb2wgaXNfb3B0aW9uYWwoKSBjb25zdDsgICAgICAvLyBzaG9ydGhhbmQgZm9yIGxhYmVsKCkgPT0gTEFCRUxfT1BUSU9OQUwKICAgYm9vbCBpc19yZXBlYXRlZCgpIGNvbnN0OyAgICAgIC8vIHNob3J0aGFuZCBmb3IgbGFiZWwoKSA9PSBMQUJFTF9SRVBFQVRFRAogICBib29sIGlzX3BhY2thYmxlKCkgY29uc3Q7ICAgICAgLy8gc2hvcnRoYW5kIGZvciBpc19yZXBlYXRlZCgpICYmCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgIElzVHlwZVBhY2thYmxlKHR5cGUoKSkKKyAgYm9vbCBpc19wYWNrZWQoKSBjb25zdDsgICAgICAgIC8vIHNob3J0aGFuZCBmb3IgaXNfcGFja2FibGUoKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgICAgICAgICBvcHRpb25zKCkucGFja2VkKCkKKyAgYm9vbCBpc19tYXAoKSBjb25zdDsgICAgICAgICAgIC8vIHNob3J0aGFuZCBmb3IgdHlwZSgpID09IFRZUEVfTUVTU0FHRSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVzc2FnZV90eXBlKCktPm9wdGlvbnMoKS5tYXBfZW50cnkoKQogCiAgIC8vIEluZGV4IG9mIHRoaXMgZmllbGQgd2l0aGluIHRoZSBtZXNzYWdlJ3MgZmllbGQgYXJyYXksIG9yIHRoZSBmaWxlIG9yCiAgIC8vIGV4dGVuc2lvbiBzY29wZSdzIGV4dGVuc2lvbnMgYXJyYXkuCkBAIC00MzksNiArNTkyLDEzIEBACiAgIC8vIHRoaXMgaXMgdGhlIGV4dGVuZGVkIHR5cGUuICBOZXZlciBOVUxMLgogICBjb25zdCBEZXNjcmlwdG9yKiBjb250YWluaW5nX3R5cGUoKSBjb25zdDsKIAorICAvLyBJZiB0aGUgZmllbGQgaXMgYSBtZW1iZXIgb2YgYSBvbmVvZiwgdGhpcyBpcyB0aGUgb25lLCBvdGhlcndpc2UgdGhpcyBpcworICAvLyBOVUxMLgorICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIGNvbnRhaW5pbmdfb25lb2YoKSBjb25zdDsKKworICAvLyBJZiB0aGUgZmllbGQgaXMgYSBtZW1iZXIgb2YgYSBvbmVvZiwgcmV0dXJucyB0aGUgaW5kZXggaW4gdGhhdCBvbmVvZi4KKyAgaW50IGluZGV4X2luX29uZW9mKCkgY29uc3Q7CisKICAgLy8gQW4gZXh0ZW5zaW9uIG1heSBiZSBkZWNsYXJlZCB3aXRoaW4gdGhlIHNjb3BlIG9mIGFub3RoZXIgbWVzc2FnZS4gIElmIHRoaXMKICAgLy8gZmllbGQgaXMgYW4gZXh0ZW5zaW9uIChpc19leHRlbnNpb24oKSBpcyB0cnVlKSwgdGhlbiBleHRlbnNpb25fc2NvcGUoKQogICAvLyByZXR1cm5zIHRoYXQgbWVzc2FnZSwgb3IgTlVMTCBpZiB0aGUgZXh0ZW5zaW9uIHdhcyBkZWNsYXJlZCBhdCBnbG9iYWwKQEAgLTQ0NywxOCArNjA3LDEyIEBACiAgIGNvbnN0IERlc2NyaXB0b3IqIGV4dGVuc2lvbl9zY29wZSgpIGNvbnN0OwogCiAgIC8vIElmIHR5cGUgaXMgVFlQRV9NRVNTQUdFIG9yIFRZUEVfR1JPVVAsIHJldHVybnMgYSBkZXNjcmlwdG9yIGZvciB0aGUKLSAgLy8gbWVzc2FnZSBvciB0aGUgZ3JvdXAgdHlwZS4gIE90aGVyd2lzZSwgdW5kZWZpbmVkLgorICAvLyBtZXNzYWdlIG9yIHRoZSBncm91cCB0eXBlLiAgT3RoZXJ3aXNlLCByZXR1cm5zIG51bGwuCiAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSgpIGNvbnN0OwogICAvLyBJZiB0eXBlIGlzIFRZUEVfRU5VTSwgcmV0dXJucyBhIGRlc2NyaXB0b3IgZm9yIHRoZSBlbnVtLiAgT3RoZXJ3aXNlLAotICAvLyB1bmRlZmluZWQuCisgIC8vIHJldHVybnMgbnVsbC4KICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZSgpIGNvbnN0OwogCi0gIC8vIEVYUEVSSU1FTlRBTDsgRE8gTk9UIFVTRS4KLSAgLy8gSWYgdGhpcyBmaWVsZCBpcyBhIG1hcCBmaWVsZCwgZXhwZXJpbWVudGFsX21hcF9rZXkoKSBpcyB0aGUgZmllbGQKLSAgLy8gdGhhdCBpcyB0aGUga2V5IGZvciB0aGlzIG1hcC4KLSAgLy8gZXhwZXJpbWVudGFsX21hcF9rZXkoKS0+Y29udGFpbmluZ190eXBlKCkgaXMgdGhlIHNhbWUgYXMgbWVzc2FnZV90eXBlKCkuCi0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXhwZXJpbWVudGFsX21hcF9rZXkoKSBjb25zdDsKLQogICAvLyBHZXQgdGhlIEZpZWxkT3B0aW9ucyBmb3IgdGhpcyBmaWVsZC4gIFRoaXMgaW5jbHVkZXMgdGhpbmdzIGxpc3RlZCBpbgogICAvLyBzcXVhcmUgYnJhY2tldHMgYWZ0ZXIgdGhlIGZpZWxkIGRlZmluaXRpb24uICBFLmcuLCB0aGUgZmllbGQ6CiAgIC8vICAgb3B0aW9uYWwgc3RyaW5nIHRleHQgPSAxIFtjdHlwZT1DT1JEXTsKQEAgLTQ3MywzNyArNjI3LDc1IEBACiAgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgogICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKIAorICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygpLgorICBzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCiAgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBDcHBUeXBlIGZvciBhIHBhcnRpY3VsYXIgVHlwZS4KICAgc3RhdGljIENwcFR5cGUgVHlwZVRvQ3BwVHlwZShUeXBlIHR5cGUpOwogCisgIC8vIEhlbHBlciBtZXRob2QgdG8gZ2V0IHRoZSBuYW1lIG9mIGEgVHlwZS4KKyAgc3RhdGljIGNvbnN0IGNoYXIqIFR5cGVOYW1lKFR5cGUgdHlwZSk7CisKKyAgLy8gSGVscGVyIG1ldGhvZCB0byBnZXQgdGhlIG5hbWUgb2YgYSBDcHBUeXBlLgorICBzdGF0aWMgY29uc3QgY2hhciogQ3BwVHlwZU5hbWUoQ3BwVHlwZSBjcHBfdHlwZSk7CisKICAgLy8gUmV0dXJuIHRydWUgaWZmIFtwYWNrZWQgPSB0cnVlXSBpcyB2YWxpZCBmb3IgZmllbGRzIG9mIHRoaXMgdHlwZS4KICAgc3RhdGljIGlubGluZSBib29sIElzVHlwZVBhY2thYmxlKFR5cGUgZmllbGRfdHlwZSk7CiAKKyAgLy8gU291cmNlIExvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFVwZGF0ZXMgfCpvdXRfbG9jYXRpb258IHRvIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGNvbXBsZXRlCisgIC8vIGV4dGVudCBvZiB0aGlzIGZpZWxkIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCiAgcHJpdmF0ZToKICAgdHlwZWRlZiBGaWVsZE9wdGlvbnMgT3B0aW9uc1R5cGU7CiAKKyAgLy8gQWxsb3dzIGFjY2VzcyB0byBHZXRMb2NhdGlvblBhdGggZm9yIGFubm90YXRpb25zLgorICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6UHJpbnRlcjsKKworICAvLyBGaWxsIHRoZSBqc29uX25hbWUgZmllbGQgb2YgRmllbGREZXNjcmlwdG9yUHJvdG8uCisgIHZvaWQgQ29weUpzb25OYW1lVG8oRmllbGREZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKwogICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KLSAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0OworICBlbnVtIFByaW50TGFiZWxGbGFnIHsgUFJJTlRfTEFCRUwsIE9NSVRfTEFCRUwgfTsKKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIFByaW50TGFiZWxGbGFnIHByaW50X2xhYmVsX2ZsYWcsCisgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBjb250ZW50cywgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKIAogICAvLyBmb3JtYXRzIHRoZSBkZWZhdWx0IHZhbHVlIGFwcHJvcHJpYXRlbHkgYW5kIHJldHVybnMgaXQgYXMgYSBzdHJpbmcuCiAgIC8vIE11c3QgaGF2ZSBhIGRlZmF1bHQgdmFsdWUgdG8gY2FsbCB0aGlzLiBJZiBxdW90ZV9zdHJpbmdfdHlwZSBpcyB0cnVlLCB0aGVuCiAgIC8vIHR5cGVzIG9mIENQUFRZUEVfU1RSSU5HIHdoaWxsIGJlIHN1cnJvdW5kZWQgYnkgcXVvdGVzIGFuZCBDRXNjYXBlZC4KICAgc3RyaW5nIERlZmF1bHRWYWx1ZUFzU3RyaW5nKGJvb2wgcXVvdGVfc3RyaW5nX3R5cGUpIGNvbnN0OwogCisgIC8vIEhlbHBlciBmdW5jdGlvbiB0aGF0IHJldHVybnMgdGhlIGZpZWxkIHR5cGUgbmFtZSBmb3IgRGVidWdTdHJpbmcuCisgIHN0cmluZyBGaWVsZFR5cGVOYW1lRGVidWdTdHJpbmcoKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OworCiAgIGNvbnN0IHN0cmluZyogbmFtZV87CiAgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKICAgY29uc3Qgc3RyaW5nKiBsb3dlcmNhc2VfbmFtZV87CiAgIGNvbnN0IHN0cmluZyogY2FtZWxjYXNlX25hbWVfOworICAvLyBXaGV0aGVyIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdGhlIGpzb25fbmFtZSBmaWVsZCBvcHRpb24gaW4gdGhlIC5wcm90bworICAvLyBmaWxlLgorICBib29sIGhhc19qc29uX25hbWVfOworICAvLyBJZiBoYXNfanNvbl9uYW1lXyBpcyB0cnVlLCBpdCdzIHRoZSB2YWx1ZSBzcGVjaWZpZWQgYnkgdGhlIHVzZXIuCisgIC8vIE90aGVyd2lzZSwgaXQgaGFzIHRoZSBzYW1lIHZhbHVlIGFzIGxvd2VyY2FzZV9uYW1lXy4KKyAgY29uc3Qgc3RyaW5nKiBqc29uX25hbWVfOwogICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV87CiAgIGludCBudW1iZXJfOwogICBUeXBlIHR5cGVfOwogICBMYWJlbCBsYWJlbF87CiAgIGJvb2wgaXNfZXh0ZW5zaW9uXzsKKyAgaW50IGluZGV4X2luX29uZW9mXzsKICAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBjb250YWluaW5nX29uZW9mXzsKICAgY29uc3QgRGVzY3JpcHRvciogZXh0ZW5zaW9uX3Njb3BlXzsKICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlXzsKICAgY29uc3QgRW51bURlc2NyaXB0b3IqIGVudW1fdHlwZV87Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZXhwZXJpbWVudGFsX21hcF9rZXlfOwogICBjb25zdCBGaWVsZE9wdGlvbnMqIG9wdGlvbnNfOwogICAvLyBJTVBPUlRBTlQ6ICBJZiB5b3UgYWRkIGEgbmV3IGZpZWxkLCBtYWtlIHN1cmUgdG8gc2VhcmNoIGZvciBhbGwgaW5zdGFuY2VzCiAgIC8vIG9mIEFsbG9jYXRlPEZpZWxkRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxGaWVsZERlc2NyaXB0b3I+KCkgaW4KQEAgLTUyNyw2ICs3MTksOCBAQAogCiAgIHN0YXRpYyBjb25zdCBjaGFyICogY29uc3Qga1R5cGVUb05hbWVbTUFYX1RZUEUgKyAxXTsKIAorICBzdGF0aWMgY29uc3QgY2hhciAqIGNvbnN0IGtDcHBUeXBlVG9OYW1lW01BWF9DUFBUWVBFICsgMV07CisKICAgc3RhdGljIGNvbnN0IGNoYXIgKiBjb25zdCBrTGFiZWxUb05hbWVbTUFYX0xBQkVMICsgMV07CiAKICAgLy8gTXVzdCBiZSBjb25zdHJ1Y3RlZCB1c2luZyBEZXNjcmlwdG9yUG9vbC4KQEAgLTUzNCw5ICs3MjgsNzMgQEAKICAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOwogICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CiAgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOworICBmcmllbmQgY2xhc3MgT25lb2ZEZXNjcmlwdG9yOwogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRmllbGREZXNjcmlwdG9yKTsKIH07CiAKKy8vIERlc2NyaWJlcyBhIG9uZW9mIGRlZmluZWQgaW4gYSBtZXNzYWdlIHR5cGUuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgT25lb2ZEZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIGNvbnN0IHN0cmluZyYgbmFtZSgpIGNvbnN0OyAgICAgICAvLyBOYW1lIG9mIHRoaXMgb25lb2YuCisgIGNvbnN0IHN0cmluZyYgZnVsbF9uYW1lKCkgY29uc3Q7ICAvLyBGdWxseS1xdWFsaWZpZWQgbmFtZSBvZiB0aGUgb25lb2YuCisKKyAgLy8gSW5kZXggb2YgdGhpcyBvbmVvZiB3aXRoaW4gdGhlIG1lc3NhZ2UncyBvbmVvZiBhcnJheS4KKyAgaW50IGluZGV4KCkgY29uc3Q7CisKKyAgLy8gVGhlIERlc2NyaXB0b3IgZm9yIHRoZSBtZXNzYWdlIGNvbnRhaW5pbmcgdGhpcyBvbmVvZi4KKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlKCkgY29uc3Q7CisKKyAgLy8gVGhlIG51bWJlciBvZiAobm9uLWV4dGVuc2lvbikgZmllbGRzIHdoaWNoIGFyZSBtZW1iZXJzIG9mIHRoaXMgb25lb2YuCisgIGludCBmaWVsZF9jb3VudCgpIGNvbnN0OworICAvLyBHZXQgYSBtZW1iZXIgb2YgdGhpcyBvbmVvZiwgaW4gdGhlIG9yZGVyIGluIHdoaWNoIHRoZXkgd2VyZSBkZWNsYXJlZCBpbiB0aGUKKyAgLy8gLnByb3RvIGZpbGUuICBEb2VzIG5vdCBpbmNsdWRlIGV4dGVuc2lvbnMuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQoaW50IGluZGV4KSBjb25zdDsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgIHZvaWQgQ29weVRvKE9uZW9mRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCisgIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OworCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCisgIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7CisKKyAgLy8gU291cmNlIExvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFVwZGF0ZXMgfCpvdXRfbG9jYXRpb258IHRvIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGNvbXBsZXRlCisgIC8vIGV4dGVudCBvZiB0aGlzIG9uZW9mIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gQWxsb3dzIGFjY2VzcyB0byBHZXRMb2NhdGlvblBhdGggZm9yIGFubm90YXRpb25zLgorICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6UHJpbnRlcjsKKworICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyogY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OworCisgIGNvbnN0IHN0cmluZyogbmFtZV87CisgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKKyAgY29uc3QgRGVzY3JpcHRvciogY29udGFpbmluZ190eXBlXzsKKyAgYm9vbCBpc19leHRlbmRhYmxlXzsKKyAgaW50IGZpZWxkX2NvdW50XzsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogZmllbGRzXzsKKyAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcworICAvLyBvZiBBbGxvY2F0ZTxPbmVvZkRlc2NyaXB0b3I+KCkgYW5kIEFsbG9jYXRlQXJyYXk8T25lb2ZEZXNjcmlwdG9yPigpCisgIC8vIGluIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgorCisgIC8vIE11c3QgYmUgY29uc3RydWN0ZWQgdXNpbmcgRGVzY3JpcHRvclBvb2wuCisgIE9uZW9mRGVzY3JpcHRvcigpIHt9CisgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKKyAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3I7CisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhPbmVvZkRlc2NyaXB0b3IpOworfTsKKwogLy8gRGVzY3JpYmVzIGFuIGVudW0gdHlwZSBkZWZpbmVkIGluIGEgLnByb3RvIGZpbGUuICBUbyBnZXQgdGhlIEVudW1EZXNjcmlwdG9yCiAvLyBmb3IgYSBnZW5lcmF0ZWQgZW51bSB0eXBlLCBjYWxsIFR5cGVOYW1lX2Rlc2NyaXB0b3IoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbAogLy8gdG8gY29uc3RydWN0IHlvdXIgb3duIGRlc2NyaXB0b3JzLgpAQCAtNTgzLDExICs4NDEsNDcgQEAKICAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCiAgIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwogCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCisgIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7CisKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIGVudW0uIFRoaXMgd2lsbAorICAvLyBvbmx5IGJlIHRoZSBjYXNlIGlmIHRoaXMgZGVzY3JpcHRvciBjb21lcyBmcm9tIGEgRGVzY3JpcHRvclBvb2wKKyAgLy8gd2l0aCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBzZXQuCisgIGJvb2wgaXNfcGxhY2Vob2xkZXIoKSBjb25zdDsKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgZW51bSBkZWNsYXJhdGlvbi4gIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcworICAvLyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbiBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4KKyAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKKwogIHByaXZhdGU6CiAgIHR5cGVkZWYgRW51bU9wdGlvbnMgT3B0aW9uc1R5cGU7CiAKKyAgLy8gQWxsb3dzIGFjY2VzcyB0byBHZXRMb2NhdGlvblBhdGggZm9yIGFubm90YXRpb25zLgorICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6UHJpbnRlcjsKKworICAvLyBMb29rcyB1cCBhIHZhbHVlIGJ5IG51bWJlci4gIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBleGlzdCwgZHluYW1pY2FsbHkKKyAgLy8gY3JlYXRlcyBhIG5ldyBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciB0aGF0IHZhbHVlLCBhc3N1bWluZyB0aGF0IGl0IHdhcworICAvLyB1bmtub3duLiBJZiBhIG5ldyBkZXNjcmlwdG9yIGlzIGNyZWF0ZWQsIHRoaXMgaXMgZG9uZSBpbiBhIHRocmVhZC1zYWZlIHdheSwKKyAgLy8gYW5kIGZ1dHVyZSBjYWxscyB3aWxsIHJldHVybiB0aGUgc2FtZSB2YWx1ZSBkZXNjcmlwdG9yIHBvaW50ZXIuCisgIC8vCisgIC8vIFRoaXMgaXMgcHJpdmF0ZSBidXQgaXMgdXNlZCBieSBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbiAod2hpY2ggaXMKKyAgLy8gZnJpZW5kZWQgYmVsb3cpIHRvIHJldHVybiBhIHZhbGlkIEVudW1WYWx1ZURlc2NyaXB0b3IgZnJvbSBHZXRFbnVtKCkgd2hlbgorICAvLyB0aGlzIGZlYXR1cmUgaXMgZW5hYmxlZC4KKyAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvcioKKyAgICAgIEZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24oaW50IG51bWJlcikgY29uc3Q7CisKKwogICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KLSAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMpIGNvbnN0OworICB2b2lkIERlYnVnU3RyaW5nKGludCBkZXB0aCwgc3RyaW5nICpjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisgIC8vIFdhbGtzIHVwIHRoZSBkZXNjcmlwdG9yIHRyZWUgdG8gZ2VuZXJhdGUgdGhlIHNvdXJjZSBsb2NhdGlvbiBwYXRoCisgIC8vIHRvIHRoaXMgZGVzY3JpcHRvciBmcm9tIHRoZSBmaWxlIHJvb3QuCisgIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3Q7CiAKICAgY29uc3Qgc3RyaW5nKiBuYW1lXzsKICAgY29uc3Qgc3RyaW5nKiBmdWxsX25hbWVfOwpAQCAtNjEzLDYgKzkwNyw3IEBACiAgIGZyaWVuZCBjbGFzcyBGaWVsZERlc2NyaXB0b3I7CiAgIGZyaWVuZCBjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yOwogICBmcmllbmQgY2xhc3MgRmlsZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBpbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb247CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFbnVtRGVzY3JpcHRvcik7CiB9OwogCkBAIC02NTAsMTEgKzk0NSwzMCBAQAogICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KICAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CiAKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KKyAgc3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworCisgIC8vIFNvdXJjZSBMb2NhdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhpcyBlbnVtIHZhbHVlIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCiAgcHJpdmF0ZToKICAgdHlwZWRlZiBFbnVtVmFsdWVPcHRpb25zIE9wdGlvbnNUeXBlOwogCisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KKyAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OlByaW50ZXI7CisKICAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OwogCiAgIGNvbnN0IHN0cmluZyogbmFtZV87CiAgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKQEAgLTY2OSw2ICs5ODMsNyBAQAogICBFbnVtVmFsdWVEZXNjcmlwdG9yKCkge30KICAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3JCdWlsZGVyOwogICBmcmllbmQgY2xhc3MgRW51bURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvclRhYmxlczsKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEVudW1WYWx1ZURlc2NyaXB0b3IpOwogfTsKIApAQCAtNzAzLDE4ICsxMDE4LDM1IEBACiAKICAgLy8gTG9vayB1cCBhIE1ldGhvZERlc2NyaXB0b3IgYnkgbmFtZS4KICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciogRmluZE1ldGhvZEJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwotCiAgIC8vIFNlZSBEZXNjcmlwdG9yOjpDb3B5VG8oKS4KICAgdm9pZCBDb3B5VG8oU2VydmljZURlc2NyaXB0b3JQcm90byogcHJvdG8pIGNvbnN0OwogCiAgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZygpLgogICBzdHJpbmcgRGVidWdTdHJpbmcoKSBjb25zdDsKIAorICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmdXaXRoT3B0aW9ucygpLgorICBzdHJpbmcgRGVidWdTdHJpbmdXaXRoT3B0aW9ucyhjb25zdCBEZWJ1Z1N0cmluZ09wdGlvbnMmIG9wdGlvbnMpIGNvbnN0OworCisKKyAgLy8gU291cmNlIExvY2F0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIFVwZGF0ZXMgfCpvdXRfbG9jYXRpb258IHRvIHRoZSBzb3VyY2UgbG9jYXRpb24gb2YgdGhlIGNvbXBsZXRlCisgIC8vIGV4dGVudCBvZiB0aGlzIHNlcnZpY2UgZGVjbGFyYXRpb24uICBSZXR1cm5zIGZhbHNlIGFuZCBsZWF2ZXMKKyAgLy8gfCpvdXRfbG9jYXRpb258IHVuY2hhbmdlZCBpZmYgbG9jYXRpb24gaW5mb3JtYXRpb24gd2FzIG5vdCBhdmFpbGFibGUuCisgIGJvb2wgR2V0U291cmNlTG9jYXRpb24oU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7CisKICBwcml2YXRlOgogICB0eXBlZGVmIFNlcnZpY2VPcHRpb25zIE9wdGlvbnNUeXBlOwogCisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KKyAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OlByaW50ZXI7CisKICAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHZvaWQgRGVidWdTdHJpbmcoc3RyaW5nICpjb250ZW50cykgY29uc3Q7CisgIHZvaWQgRGVidWdTdHJpbmcoc3RyaW5nICpjb250ZW50cywgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OwogCiAgIGNvbnN0IHN0cmluZyogbmFtZV87CiAgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKQEAgLTc1NSw2ICsxMDg3LDExIEBACiAgIC8vIEdldHMgdGhlIHR5cGUgb2YgcHJvdG9jb2wgbWVzc2FnZSB3aGljaCB0aGlzIG1lc3NhZ2UgcHJvZHVjZXMgYXMgb3V0cHV0LgogICBjb25zdCBEZXNjcmlwdG9yKiBvdXRwdXRfdHlwZSgpIGNvbnN0OwogCisgIC8vIEdldHMgd2hldGhlciB0aGUgY2xpZW50IHN0cmVhbXMgbXVsdGlwbGUgcmVxdWVzdHMuCisgIGJvb2wgY2xpZW50X3N0cmVhbWluZygpIGNvbnN0OworICAvLyBHZXRzIHdoZXRoZXIgdGhlIHNlcnZlciBzdHJlYW1zIG11bHRpcGxlIHJlc3BvbnNlcy4KKyAgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3Q7CisKICAgLy8gR2V0IG9wdGlvbnMgZm9yIHRoaXMgbWV0aG9kLiAgVGhlc2UgYXJlIHNwZWNpZmllZCBpbiB0aGUgLnByb3RvIGZpbGUgYnkKICAgLy8gcGxhY2luZyBsaW5lcyBsaWtlICJvcHRpb24gZm9vID0gMTIzNDsiIGluIGN1cmx5LWJyYWNlcyBhZnRlciBhIG1ldGhvZAogICAvLyBkZWNsYXJhdGlvbi4gIEFsbG93ZWQgb3B0aW9ucyBhcmUgZGVmaW5lZCBieSBNZXRob2RPcHRpb25zIGluCkBAIC03NjgsMTEgKzExMDUsMzAgQEAKICAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCiAgIHN0cmluZyBEZWJ1Z1N0cmluZygpIGNvbnN0OwogCisgIC8vIFNlZSBEZXNjcmlwdG9yOjpEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKCkuCisgIHN0cmluZyBEZWJ1Z1N0cmluZ1dpdGhPcHRpb25zKGNvbnN0IERlYnVnU3RyaW5nT3B0aW9ucyYgb3B0aW9ucykgY29uc3Q7CisKKworICAvLyBTb3VyY2UgTG9jYXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gVXBkYXRlcyB8Km91dF9sb2NhdGlvbnwgdG8gdGhlIHNvdXJjZSBsb2NhdGlvbiBvZiB0aGUgY29tcGxldGUKKyAgLy8gZXh0ZW50IG9mIHRoaXMgbWV0aG9kIGRlY2xhcmF0aW9uLiAgUmV0dXJucyBmYWxzZSBhbmQgbGVhdmVzCisgIC8vIHwqb3V0X2xvY2F0aW9ufCB1bmNoYW5nZWQgaWZmIGxvY2F0aW9uIGluZm9ybWF0aW9uIHdhcyBub3QgYXZhaWxhYmxlLgorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKFNvdXJjZUxvY2F0aW9uKiBvdXRfbG9jYXRpb24pIGNvbnN0OworCiAgcHJpdmF0ZToKICAgdHlwZWRlZiBNZXRob2RPcHRpb25zIE9wdGlvbnNUeXBlOwogCisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoIGZvciBhbm5vdGF0aW9ucy4KKyAgZnJpZW5kIGNsYXNzIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OlByaW50ZXI7CisKICAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nKCkuCi0gIHZvaWQgRGVidWdTdHJpbmcoaW50IGRlcHRoLCBzdHJpbmcgKmNvbnRlbnRzKSBjb25zdDsKKyAgdm9pZCBEZWJ1Z1N0cmluZyhpbnQgZGVwdGgsIHN0cmluZyAqY29udGVudHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBXYWxrcyB1cCB0aGUgZGVzY3JpcHRvciB0cmVlIHRvIGdlbmVyYXRlIHRoZSBzb3VyY2UgbG9jYXRpb24gcGF0aAorICAvLyB0byB0aGlzIGRlc2NyaXB0b3IgZnJvbSB0aGUgZmlsZSByb290LgorICB2b2lkIEdldExvY2F0aW9uUGF0aChzdGQ6OnZlY3RvcjxpbnQ+KiBvdXRwdXQpIGNvbnN0OwogCiAgIGNvbnN0IHN0cmluZyogbmFtZV87CiAgIGNvbnN0IHN0cmluZyogZnVsbF9uYW1lXzsKQEAgLTc4MCw2ICsxMTM2LDggQEAKICAgY29uc3QgRGVzY3JpcHRvciogaW5wdXRfdHlwZV87CiAgIGNvbnN0IERlc2NyaXB0b3IqIG91dHB1dF90eXBlXzsKICAgY29uc3QgTWV0aG9kT3B0aW9ucyogb3B0aW9uc187CisgIGJvb2wgY2xpZW50X3N0cmVhbWluZ187CisgIGJvb2wgc2VydmVyX3N0cmVhbWluZ187CiAgIC8vIElNUE9SVEFOVDogIElmIHlvdSBhZGQgYSBuZXcgZmllbGQsIG1ha2Ugc3VyZSB0byBzZWFyY2ggZm9yIGFsbCBpbnN0YW5jZXMKICAgLy8gb2YgQWxsb2NhdGU8TWV0aG9kRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxNZXRob2REZXNjcmlwdG9yPigpIGluCiAgIC8vIGRlc2NyaXB0b3IuY2MgYW5kIHVwZGF0ZSB0aGVtIHRvIGluaXRpYWxpemUgdGhlIGZpZWxkLgpAQCAtNzkxLDYgKzExNDksNyBAQAogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTWV0aG9kRGVzY3JpcHRvcik7CiB9OwogCisKIC8vIERlc2NyaWJlcyBhIHdob2xlIC5wcm90byBmaWxlLiAgVG8gZ2V0IHRoZSBGaWxlRGVzY3JpcHRvciBmb3IgYSBjb21waWxlZC1pbgogLy8gZmlsZSwgZ2V0IHRoZSBkZXNjcmlwdG9yIGZvciBzb21ldGhpbmcgZGVmaW5lZCBpbiB0aGF0IGZpbGUgYW5kIGNhbGwKIC8vIGRlc2NyaXB0b3ItPmZpbGUoKS4gIFVzZSBEZXNjcmlwdG9yUG9vbCB0byBjb25zdHJ1Y3QgeW91ciBvd24gZGVzY3JpcHRvcnMuCkBAIC04MTMsNiArMTE3MiwyMiBAQAogICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGRlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKIAorICAvLyBUaGUgbnVtYmVyIG9mIGZpbGVzIHB1YmxpYyBpbXBvcnRlZCBieSB0aGlzIG9uZS4KKyAgLy8gVGhlIHB1YmxpYyBkZXBlbmRlbmN5IGxpc3QgaXMgYSBzdWJzZXQgb2YgdGhlIGRlcGVuZGVuY3kgbGlzdC4KKyAgaW50IHB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCkgY29uc3Q7CisgIC8vIEdldHMgYSBwdWJsaWMgaW1wb3J0ZWQgZmlsZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8CisgIC8vIHB1YmxpY19kZXBlbmRlbmN5X2NvdW50KCkuCisgIC8vIFRoZXNlIGFyZSByZXR1cm5lZCBpbiB0aGUgb3JkZXIgdGhleSB3ZXJlIGRlZmluZWQgaW4gdGhlIC5wcm90byBmaWxlLgorICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKworICAvLyBUaGUgbnVtYmVyIG9mIGZpbGVzIHRoYXQgYXJlIGltcG9ydGVkIGZvciB3ZWFrIGZpZWxkcy4KKyAgLy8gVGhlIHdlYWsgZGVwZW5kZW5jeSBsaXN0IGlzIGEgc3Vic2V0IG9mIHRoZSBkZXBlbmRlbmN5IGxpc3QuCisgIGludCB3ZWFrX2RlcGVuZGVuY3lfY291bnQoKSBjb25zdDsKKyAgLy8gR2V0cyBhIHdlYWsgaW1wb3J0ZWQgZmlsZSBieSBpbmRleCwgd2hlcmUgMCA8PSBpbmRleCA8CisgIC8vIHdlYWtfZGVwZW5kZW5jeV9jb3VudCgpLgorICAvLyBUaGVzZSBhcmUgcmV0dXJuZWQgaW4gdGhlIG9yZGVyIHRoZXkgd2VyZSBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIHdlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OworCiAgIC8vIE51bWJlciBvZiB0b3AtbGV2ZWwgbWVzc2FnZSB0eXBlcyBkZWZpbmVkIGluIHRoaXMgZmlsZS4gIChUaGlzIGRvZXMgbm90CiAgIC8vIGluY2x1ZGUgbmVzdGVkIHR5cGVzLikKICAgaW50IG1lc3NhZ2VfdHlwZV9jb3VudCgpIGNvbnN0OwpAQCAtODQ3LDYgKzEyMjIsMTUgQEAKICAgLy8gbWVzc2FnZS4KICAgY29uc3QgRmlsZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKIAorICAvLyBTeW50YXggb2YgdGhpcyBmaWxlLgorICBlbnVtIFN5bnRheCB7CisgICAgU1lOVEFYX1VOS05PV04gPSAwLAorICAgIFNZTlRBWF9QUk9UTzIgID0gMiwKKyAgICBTWU5UQVhfUFJPVE8zICA9IDMsCisgIH07CisgIFN5bnRheCBzeW50YXgoKSBjb25zdDsKKyAgc3RhdGljIGNvbnN0IGNoYXIqIFN5bnRheE5hbWUoU3ludGF4IHN5bnRheCk7CisKICAgLy8gRmluZCBhIHRvcC1sZXZlbCBtZXNzYWdlIHR5cGUgYnkgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QgZm91bmQuCiAgIGNvbnN0IERlc2NyaXB0b3IqIEZpbmRNZXNzYWdlVHlwZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwogICAvLyBGaW5kIGEgdG9wLWxldmVsIGVudW0gdHlwZSBieSBuYW1lLiAgUmV0dXJucyBOVUxMIGlmIG5vdCBmb3VuZC4KQEAgLTg2NiwxMSArMTI1MCw0MCBAQAogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRFeHRlbnNpb25CeUNhbWVsY2FzZU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKIAogICAvLyBTZWUgRGVzY3JpcHRvcjo6Q29weVRvKCkuCisgIC8vIE5vdGVzOgorICAvLyAtIFRoaXMgbWV0aG9kIGRvZXMgTk9UIGNvcHkgc291cmNlIGNvZGUgaW5mb3JtYXRpb24gc2luY2UgaXQgaXMgcmVsYXRpdmVseQorICAvLyAgIGxhcmdlIGFuZCByYXJlbHkgbmVlZGVkLiAgU2VlIENvcHlTb3VyY2VDb2RlSW5mb1RvKCkgYmVsb3cuCiAgIHZvaWQgQ29weVRvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKKyAgLy8gV3JpdGUgdGhlIHNvdXJjZSBjb2RlIGluZm9ybWF0aW9uIG9mIHRoaXMgRmlsZURlc2NyaXB0b3IgaW50byB0aGUgZ2l2ZW4KKyAgLy8gRmlsZURlc2NyaXB0b3JQcm90by4gIFNlZSBDb3B5VG8oKSBhYm92ZS4KKyAgdm9pZCBDb3B5U291cmNlQ29kZUluZm9UbyhGaWxlRGVzY3JpcHRvclByb3RvKiBwcm90bykgY29uc3Q7CisgIC8vIEZpbGwgdGhlIGpzb25fbmFtZSBmaWVsZCBvZiBGaWVsZERlc2NyaXB0b3JQcm90byBmb3IgYWxsIGZpZWxkcy4gQ2FuIG9ubHkKKyAgLy8gYmUgY2FsbGVkIGFmdGVyIENvcHlUbygpLgorICB2b2lkIENvcHlKc29uTmFtZVRvKEZpbGVEZXNjcmlwdG9yUHJvdG8qIHByb3RvKSBjb25zdDsKIAogICAvLyBTZWUgRGVzY3JpcHRvcjo6RGVidWdTdHJpbmcoKS4KICAgc3RyaW5nIERlYnVnU3RyaW5nKCkgY29uc3Q7CiAKKyAgLy8gU2VlIERlc2NyaXB0b3I6OkRlYnVnU3RyaW5nV2l0aE9wdGlvbnMoKS4KKyAgc3RyaW5nIERlYnVnU3RyaW5nV2l0aE9wdGlvbnMoY29uc3QgRGVidWdTdHJpbmdPcHRpb25zJiBvcHRpb25zKSBjb25zdDsKKworICAvLyBSZXR1cm5zIHRydWUgaWYgdGhpcyBpcyBhIHBsYWNlaG9sZGVyIGZvciBhbiB1bmtub3duIGZpbGUuIFRoaXMgd2lsbAorICAvLyBvbmx5IGJlIHRoZSBjYXNlIGlmIHRoaXMgZGVzY3JpcHRvciBjb21lcyBmcm9tIGEgRGVzY3JpcHRvclBvb2wKKyAgLy8gd2l0aCBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSBzZXQuCisgIGJvb2wgaXNfcGxhY2Vob2xkZXIoKSBjb25zdDsKKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZSBleHRlbnQgb2YKKyAgLy8gdGhpcyBmaWxlIGRlY2xhcmF0aW9uIChuYW1lbHksIHRoZSBlbXB0eSBwYXRoKS4KKyAgYm9vbCBHZXRTb3VyY2VMb2NhdGlvbihTb3VyY2VMb2NhdGlvbiogb3V0X2xvY2F0aW9uKSBjb25zdDsKKworICAvLyBVcGRhdGVzIHwqb3V0X2xvY2F0aW9ufCB0byB0aGUgc291cmNlIGxvY2F0aW9uIG9mIHRoZSBjb21wbGV0ZQorICAvLyBleHRlbnQgb2YgdGhlIGRlY2xhcmF0aW9uIG9yIGRlY2xhcmF0aW9uLXBhcnQgZGVub3RlZCBieSB8cGF0aHwuCisgIC8vIFJldHVybnMgZmFsc2UgYW5kIGxlYXZlcyB8Km91dF9sb2NhdGlvbnwgdW5jaGFuZ2VkIGlmZiBsb2NhdGlvbgorICAvLyBpbmZvcm1hdGlvbiB3YXMgbm90IGF2YWlsYWJsZS4gIChTZWUgU291cmNlQ29kZUluZm8gZm9yCisgIC8vIGRlc2NyaXB0aW9uIG9mIHBhdGggZW5jb2RpbmcuKQorICBib29sIEdldFNvdXJjZUxvY2F0aW9uKGNvbnN0IHN0ZDo6dmVjdG9yPGludD4mIHBhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgU291cmNlTG9jYXRpb24qIG91dF9sb2NhdGlvbikgY29uc3Q7CisKICBwcml2YXRlOgogICB0eXBlZGVmIEZpbGVPcHRpb25zIE9wdGlvbnNUeXBlOwogCkBAIC04NzksNiArMTI5MiwxMCBAQAogICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbF87CiAgIGludCBkZXBlbmRlbmN5X2NvdW50XzsKICAgY29uc3QgRmlsZURlc2NyaXB0b3IqKiBkZXBlbmRlbmNpZXNfOworICBpbnQgcHVibGljX2RlcGVuZGVuY3lfY291bnRfOworICBpbnQqIHB1YmxpY19kZXBlbmRlbmNpZXNfOworICBpbnQgd2Vha19kZXBlbmRlbmN5X2NvdW50XzsKKyAgaW50KiB3ZWFrX2RlcGVuZGVuY2llc187CiAgIGludCBtZXNzYWdlX3R5cGVfY291bnRfOwogICBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGVzXzsKICAgaW50IGVudW1fdHlwZV9jb3VudF87CkBAIC04ODYsMTAgKzEzMDMsMTMgQEAKICAgaW50IHNlcnZpY2VfY291bnRfOwogICBTZXJ2aWNlRGVzY3JpcHRvciogc2VydmljZXNfOwogICBpbnQgZXh0ZW5zaW9uX2NvdW50XzsKKyAgU3ludGF4IHN5bnRheF87CisgIGJvb2wgaXNfcGxhY2Vob2xkZXJfOwogICBGaWVsZERlc2NyaXB0b3IqIGV4dGVuc2lvbnNfOwogICBjb25zdCBGaWxlT3B0aW9ucyogb3B0aW9uc187CiAKICAgY29uc3QgRmlsZURlc2NyaXB0b3JUYWJsZXMqIHRhYmxlc187CisgIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvXzsKICAgLy8gSU1QT1JUQU5UOiAgSWYgeW91IGFkZCBhIG5ldyBmaWVsZCwgbWFrZSBzdXJlIHRvIHNlYXJjaCBmb3IgYWxsIGluc3RhbmNlcwogICAvLyBvZiBBbGxvY2F0ZTxGaWxlRGVzY3JpcHRvcj4oKSBhbmQgQWxsb2NhdGVBcnJheTxGaWxlRGVzY3JpcHRvcj4oKSBpbgogICAvLyBkZXNjcmlwdG9yLmNjIGFuZCB1cGRhdGUgdGhlbSB0byBpbml0aWFsaXplIHRoZSBmaWVsZC4KQEAgLTg5OCw3ICsxMzE4LDEwIEBACiAgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yQnVpbGRlcjsKICAgZnJpZW5kIGNsYXNzIERlc2NyaXB0b3I7CiAgIGZyaWVuZCBjbGFzcyBGaWVsZERlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBPbmVvZkRlc2NyaXB0b3I7CiAgIGZyaWVuZCBjbGFzcyBFbnVtRGVzY3JpcHRvcjsKKyAgZnJpZW5kIGNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3I7CisgIGZyaWVuZCBjbGFzcyBNZXRob2REZXNjcmlwdG9yOwogICBmcmllbmQgY2xhc3MgU2VydmljZURlc2NyaXB0b3I7CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlRGVzY3JpcHRvcik7CiB9OwpAQCAtOTUzLDYgKzEzNzYsMTAgQEAKICAgLy8gICB0byBHT09HTEVfTE9HKEVSUk9SKS4gIFJlbWVtYmVyIHRoYXQgZmlsZXMgYXJlIGJ1aWx0IG9uLWRlbWFuZCwgc28gdGhpcwogICAvLyAgIEVycm9yQ29sbGVjdG9yIG1heSBiZSBjYWxsZWQgZnJvbSBhbnkgdGhyZWFkIHRoYXQgY2FsbHMgb25lIG9mIHRoZQogICAvLyAgIEZpbmQqQnkqKCkgbWV0aG9kcy4KKyAgLy8gLSBUaGUgRGVzY3JpcHRvckRhdGFiYXNlIG11c3Qgbm90IGJlIG11dGF0ZWQgZHVyaW5nIHRoZSBsaWZldGltZSBvZgorICAvLyAgIHRoZSBEZXNjcmlwdG9yUG9vbC4gRXZlbiBpZiB0aGUgY2xpZW50IHRha2VzIGNhcmUgdG8gYXZvaWQgZGF0YSByYWNlcywKKyAgLy8gICBjaGFuZ2VzIHRvIHRoZSBjb250ZW50IG9mIHRoZSBEZXNjcmlwdG9yRGF0YWJhc2UgbWF5IG5vdCBiZSByZWZsZWN0ZWQKKyAgLy8gICBpbiBzdWJzZXF1ZW50IGxvb2t1cHMgaW4gdGhlIERlc2NyaXB0b3JQb29sLgogICBjbGFzcyBFcnJvckNvbGxlY3RvcjsKICAgZXhwbGljaXQgRGVzY3JpcHRvclBvb2woRGVzY3JpcHRvckRhdGFiYXNlKiBmYWxsYmFja19kYXRhYmFzZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgRXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3RvciA9IE5VTEwpOwpAQCAtOTY0LDYgKzEzOTEsNyBAQAogICAvLyB0aGlzIHBvb2wuICBEbyBub3QgYWRkIHlvdXIgb3duIGRlc2NyaXB0b3JzIHRvIHRoaXMgcG9vbC4KICAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQb29sKiBnZW5lcmF0ZWRfcG9vbCgpOwogCisKICAgLy8gRmluZCBhIEZpbGVEZXNjcmlwdG9yIGluIHRoZSBwb29sIGJ5IGZpbGUgbmFtZS4gIFJldHVybnMgTlVMTCBpZiBub3QKICAgLy8gZm91bmQuCiAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwpAQCAtOTgzLDYgKzE0MTEsNyBAQAogICBjb25zdCBEZXNjcmlwdG9yKiBGaW5kTWVzc2FnZVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRmllbGRCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBGaW5kRXh0ZW5zaW9uQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogRmluZE9uZW9mQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CiAgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBGaW5kRW51bVR5cGVCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogRmluZEVudW1WYWx1ZUJ5TmFtZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OwogICBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciogRmluZFNlcnZpY2VCeU5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdDsKQEAgLTk5OSw3ICsxNDI4LDcgQEAKICAgLy8gZm91bmQ6IGV4dGVuc2lvbnMgZGVmaW5lZCBpbiB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgbWlnaHQgbm90IGJlIGZvdW5kCiAgIC8vIGRlcGVuZGluZyBvbiB0aGUgZGF0YWJhc2UgaW1wbGVtZW50YXRpb24uCiAgIHZvaWQgRmluZEFsbEV4dGVuc2lvbnMoY29uc3QgRGVzY3JpcHRvciogZXh0ZW5kZWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6dmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXQpIGNvbnN0OwogCiAgIC8vIEJ1aWxkaW5nIGRlc2NyaXB0b3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTEwMjcsNyArMTQ1Niw4IEBACiAgICAgICBPVEhFUiAgICAgICAgICAgICAgLy8gc29tZSBvdGhlciBwcm9ibGVtCiAgICAgfTsKIAotICAgIC8vIFJlcG9ydHMgYW4gZXJyb3IgaW4gdGhlIEZpbGVEZXNjcmlwdG9yUHJvdG8uCisgICAgLy8gUmVwb3J0cyBhbiBlcnJvciBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4gVXNlIHRoaXMgZnVuY3Rpb24gaWYgdGhlCisgICAgLy8gcHJvYmxlbSBvY2N1cnJlZCBzaG91bGQgaW50ZXJydXB0IGJ1aWxkaW5nIHRoZSBGaWxlRGVzY3JpcHRvclByb3RvLgogICAgIHZpcnR1YWwgdm9pZCBBZGRFcnJvcigKICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsICAgICAgLy8gRmlsZSBuYW1lIGluIHdoaWNoIHRoZSBlcnJvciBvY2N1cnJlZC4KICAgICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLCAgLy8gRnVsbCBuYW1lIG9mIHRoZSBlcnJvbmVvdXMgZWxlbWVudC4KQEAgLTEwMzYsNiArMTQ2NiwxNiBAQAogICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlICAgICAgICAvLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgogICAgICAgKSA9IDA7CiAKKyAgICAvLyBSZXBvcnRzIGEgd2FybmluZyBpbiB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4gVXNlIHRoaXMgZnVuY3Rpb24gaWYgdGhlCisgICAgLy8gcHJvYmxlbSBvY2N1cnJlZCBzaG91bGQgTk9UIGludGVycnVwdCBidWlsZGluZyB0aGUgRmlsZURlc2NyaXB0b3JQcm90by4KKyAgICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZygKKyAgICAgIGNvbnN0IHN0cmluZyYgLypmaWxlbmFtZSovLCAgICAgIC8vIEZpbGUgbmFtZSBpbiB3aGljaCB0aGUgZXJyb3Igb2NjdXJyZWQuCisgICAgICBjb25zdCBzdHJpbmcmIC8qZWxlbWVudF9uYW1lKi8sICAvLyBGdWxsIG5hbWUgb2YgdGhlIGVycm9uZW91cyBlbGVtZW50LgorICAgICAgY29uc3QgTWVzc2FnZSogLypkZXNjcmlwdG9yKi8sICAgLy8gRGVzY3JpcHRvciBvZiB0aGUgZXJyb25lb3VzIGVsZW1lbnQuCisgICAgICBFcnJvckxvY2F0aW9uIC8qbG9jYXRpb24qLywgICAgICAvLyBPbmUgb2YgdGhlIGxvY2F0aW9uIGNvbnN0YW50cywgYWJvdmUuCisgICAgICBjb25zdCBzdHJpbmcmIC8qbWVzc2FnZSovICAgICAgICAvLyBIdW1hbi1yZWFkYWJsZSBlcnJvciBtZXNzYWdlLgorICAgICAgKSB7fQorCiAgICBwcml2YXRlOgogICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhFcnJvckNvbGxlY3Rvcik7CiAgIH07CkBAIC0xMDU2LDcgKzE0OTYsOCBAQAogICAvLyB0byB0eXBlcyBvciBvdGhlciBmaWxlcyB0aGF0IGFyZSBub3QgZm91bmQgaW4gdGhlIERlc2NyaXB0b3JQb29sIChvciBpdHMKICAgLy8gYmFja2luZyBEZXNjcmlwdG9yRGF0YWJhc2UsIGlmIGFueSkuICBJZiB5b3UgY2FsbAogICAvLyBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKSwgaG93ZXZlciwgdGhlbiB1bmtub3duIHR5cGVzIGFuZCBmaWxlcwotICAvLyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHBsYWNlaG9sZGVyIGRlc2NyaXB0b3JzLiAgVGhpcyBjYW4gYWxsb3cgeW91IHRvCisgIC8vIHdpbGwgYmUgcmVwbGFjZWQgYnkgcGxhY2Vob2xkZXIgZGVzY3JpcHRvcnMgKHdoaWNoIGNhbiBiZSBpZGVudGlmaWVkIGJ5CisgIC8vIHRoZSBpc19wbGFjZWhvbGRlcigpIG1ldGhvZCkuICBUaGlzIGNhbiBhbGxvdyB5b3UgdG8KICAgLy8gcGVyZm9ybSBzb21lIHVzZWZ1bCBvcGVyYXRpb25zIHdpdGggYSAucHJvdG8gZmlsZSBldmVuIGlmIHlvdSBkbyBub3QKICAgLy8gaGF2ZSBhY2Nlc3MgdG8gb3RoZXIgLnByb3RvIGZpbGVzIG9uIHdoaWNoIGl0IGRlcGVuZHMuICBIb3dldmVyLCBzb21lCiAgIC8vIGhldXJpc3RpY3MgbXVzdCBiZSB1c2VkIHRvIGZpbGwgaW4gdGhlIGdhcHMgaW4gaW5mb3JtYXRpb24sIGFuZCB0aGVzZQpAQCAtMTA2NSwxMCArMTUwNiwxNSBAQAogICAvLyBvciBhbiBlbnVtLCBhcyB3ZWxsIGFzIHdoYXQgcGFja2FnZSBpdCByZXNpZGVzIGluLiAgRnVydGhlcm1vcmUsCiAgIC8vIHBsYWNlaG9sZGVyIHR5cGVzIHdpbGwgbm90IGJlIGRpc2NvdmVyYWJsZSB2aWEgRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCkKICAgLy8gYW5kIHNpbWlsYXIgbWV0aG9kcywgd2hpY2ggY291bGQgY29uZnVzZSBzb21lIGRlc2NyaXB0b3ItYmFzZWQgYWxnb3JpdGhtcy4KLSAgLy8gR2VuZXJhbGx5LCB0aGUgcmVzdWx0cyBvZiB0aGlzIG9wdGlvbiBzaG91bGQgb25seSBiZSByZWxpZWQgdXBvbiBmb3IKLSAgLy8gZGVidWdnaW5nIHB1cnBvc2VzLgorICAvLyBHZW5lcmFsbHksIHRoZSByZXN1bHRzIG9mIHRoaXMgb3B0aW9uIHNob3VsZCBiZSBoYW5kbGVkIHdpdGggZXh0cmVtZSBjYXJlLgogICB2b2lkIEFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpIHsgYWxsb3dfdW5rbm93bl8gPSB0cnVlOyB9CiAKKyAgLy8gQnkgZGVmYXVsdCwgd2VhayBpbXBvcnRzIGFyZSBhbGxvd2VkIHRvIGJlIG1pc3NpbmcsIGluIHdoaWNoIGNhc2Ugd2Ugd2lsbAorICAvLyB1c2UgYSBwbGFjZWhvbGRlciBmb3IgdGhlIGRlcGVuZGVuY3kgYW5kIGNvbnZlcnQgdGhlIGZpZWxkIHRvIGJlIGFuIEVtcHR5CisgIC8vIG1lc3NhZ2UgZmllbGQuIElmIHlvdSBjYWxsIEVuZm9yY2VXZWFrRGVwZW5kZW5jaWVzKHRydWUpLCBob3dldmVyLCB0aGUKKyAgLy8gRGVzY3JpcHRvclBvb2wgd2lsbCByZXBvcnQgYSBpbXBvcnQgbm90IGZvdW5kIGVycm9yLgorICB2b2lkIEVuZm9yY2VXZWFrRGVwZW5kZW5jaWVzKGJvb2wgZW5mb3JjZSkgeyBlbmZvcmNlX3dlYWtfID0gZW5mb3JjZTsgfQorCiAgIC8vIEludGVybmFsIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIFRoZXNlIG1ldGhvZHMgTVVTVCBOT1QgYmUgY2FsbGVkIGZyb20gb3V0c2lkZSB0aGUgcHJvdG8yIGxpYnJhcnkuCiAgIC8vIFRoZXNlIG1ldGhvZHMgbWF5IGNvbnRhaW4gaGlkZGVuIHBpdGZhbGxzIGFuZCBtYXkgYmUgcmVtb3ZlZCBpbiBhCkBAIC0xMTA2LDcgKzE1NTIsNyBAQAogICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBHZXRzIGEgbm9uLWNvbnN0IHBvaW50ZXIgdG8gdGhlIGdlbmVyYXRlZCBwb29sLgogICAvLyBUaGlzIGlzIGNhbGxlZCBhdCBzdGF0aWMtaW5pdGlhbGl6YXRpb24gdGltZSBvbmx5LCBzbyB0aHJlYWQtc2FmZXR5IGlzCiAgIC8vIG5vdCBhIGNvbmNlcm4uICBJZiBib3RoIGFuIHVuZGVybGF5IGFuZCBhIGZhbGxiYWNrIGRhdGFiYXNlIGFyZSBwcmVzZW50LAotICAvLyB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgdGFrZXMgcHJlY2VkZW5jZS4KKyAgLy8gdGhlIHVuZGVybGF5IHRha2VzIHByZWNlZGVuY2UuCiAgIHN0YXRpYyBEZXNjcmlwdG9yUG9vbCogaW50ZXJuYWxfZ2VuZXJhdGVkX3Bvb2woKTsKIAogICAvLyBGb3IgaW50ZXJuYWwgdXNlIG9ubHk6ICBDaGFuZ2VzIHRoZSBiZWhhdmlvciBvZiBCdWlsZEZpbGUoKSBzdWNoIHRoYXQgaXQKQEAgLTExMjQsNiArMTU3MCwxMiBAQAogICAvLyBsYXp5IGRlc2NyaXB0b3IgaW5pdGlhbGl6YXRpb24gYmVoYXZpb3IuCiAgIGJvb2wgSW50ZXJuYWxJc0ZpbGVMb2FkZWQoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSkgY29uc3Q7CiAKKworICAvLyBBZGQgYSBmaWxlIHRvIHVudXNlZF9pbXBvcnRfdHJhY2tfZmlsZXNfLiBEZXNjcmlwdG9yQnVpbGRlciB3aWxsIGxvZworICAvLyB3YXJuaW5ncyBmb3IgdGhvc2UgZmlsZXMgaWYgdGhlcmUgaXMgYW55IHVudXNlZCBpbXBvcnQuCisgIHZvaWQgQWRkVW51c2VkSW1wb3J0VHJhY2tGaWxlKGNvbnN0IHN0cmluZyYgZmlsZV9uYW1lKTsKKyAgdm9pZCBDbGVhclVudXNlZEltcG9ydFRyYWNrRmlsZXMoKTsKKwogIHByaXZhdGU6CiAgIGZyaWVuZCBjbGFzcyBEZXNjcmlwdG9yOwogICBmcmllbmQgY2xhc3MgRmllbGREZXNjcmlwdG9yOwpAQCAtMTEzMSw2ICsxNTgzLDEyIEBACiAgIGZyaWVuZCBjbGFzcyBTZXJ2aWNlRGVzY3JpcHRvcjsKICAgZnJpZW5kIGNsYXNzIEZpbGVEZXNjcmlwdG9yOwogICBmcmllbmQgY2xhc3MgRGVzY3JpcHRvckJ1aWxkZXI7CisgIGZyaWVuZCBjbGFzcyBGaWxlRGVzY3JpcHRvclRhYmxlczsKKworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZ2l2ZW4gbmFtZSBpcyBhIHN1Yi1zeW1ib2wgb2YgYW55IG5vbi1wYWNrYWdlCisgIC8vIGRlc2NyaXB0b3IgdGhhdCBhbHJlYWR5IGV4aXN0cyBpbiB0aGUgZGVzY3JpcHRvciBwb29sLiAgKFRoZSBmdWxsCisgIC8vIGRlZmluaXRpb24gb2Ygc3VjaCB0eXBlcyBpcyBhbHJlYWR5IGtub3duLikKKyAgYm9vbCBJc1N1YlN5bWJvbE9mQnVpbHRUeXBlKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CiAKICAgLy8gVHJpZXMgdG8gZmluZCBzb21ldGhpbmcgaW4gdGhlIGZhbGxiYWNrIGRhdGFiYXNlIGFuZCBsaW5rIGluIHRoZQogICAvLyBjb3JyZXNwb25kaW5nIHByb3RvIGZpbGUuICBSZXR1cm5zIHRydWUgaWYgc3VjY2Vzc2Z1bCwgaW4gd2hpY2ggY2FzZQpAQCAtMTE1OSwxMCArMTYxNywxMiBAQAogICAvLyBUaGlzIGNsYXNzIGNvbnRhaW5zIGEgbG90IG9mIGhhc2ggbWFwcyB3aXRoIGNvbXBsaWNhdGVkIHR5cGVzIHRoYXQKICAgLy8gd2UnZCBsaWtlIHRvIGtlZXAgb3V0IG9mIHRoZSBoZWFkZXIuCiAgIGNsYXNzIFRhYmxlczsKLSAgc2NvcGVkX3B0cjxUYWJsZXM+IHRhYmxlc187CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8VGFibGVzPiB0YWJsZXNfOwogCiAgIGJvb2wgZW5mb3JjZV9kZXBlbmRlbmNpZXNfOwogICBib29sIGFsbG93X3Vua25vd25fOworICBib29sIGVuZm9yY2Vfd2Vha187CisgIHN0ZDo6c2V0PHN0cmluZz4gdW51c2VkX2ltcG9ydF90cmFja19maWxlc187CiAKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKERlc2NyaXB0b3JQb29sKTsKIH07CkBAIC0xMTkwLDEwICsxNjUwLDEyIEBACiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKIAogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIGZpZWxkX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgb25lb2ZfZGVjbF9jb3VudCwgaW50KQogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIG5lc3RlZF90eXBlX2NvdW50LCBpbnQpCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgZW51bV90eXBlX2NvdW50LCBpbnQpCiAKIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBmaWVsZCwgY29uc3QgRmllbGREZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBvbmVvZl9kZWNsLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqKQogUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKERlc2NyaXB0b3IsIG5lc3RlZF90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBlbnVtX3R5cGUsIGNvbnN0IEVudW1EZXNjcmlwdG9yKikKIApAQCAtMTIwMywxMCArMTY2NSwxOCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IERlc2NyaXB0b3I6OkV4dGVuc2lvblJhbmdlKikKIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBleHRlbnNpb24sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKERlc2NyaXB0b3IsIE1lc3NhZ2VPcHRpb25zKTsKKworUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKERlc2NyaXB0b3IsIHJlc2VydmVkX3JhbmdlX2NvdW50LCBpbnQpCitQUk9UT0JVRl9ERUZJTkVfQVJSQVlfQUNDRVNTT1IoRGVzY3JpcHRvciwgcmVzZXJ2ZWRfcmFuZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvcjo6UmVzZXJ2ZWRSYW5nZSopCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRGVzY3JpcHRvciwgcmVzZXJ2ZWRfbmFtZV9jb3VudCwgaW50KQorCitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihEZXNjcmlwdG9yLCBNZXNzYWdlT3B0aW9ucykKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihEZXNjcmlwdG9yLCBpc19wbGFjZWhvbGRlciwgYm9vbCkKIAogUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIG5hbWUpCiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZnVsbF9uYW1lKQorUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGpzb25fbmFtZSkKIFBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBsb3dlcmNhc2VfbmFtZSkKIFBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBjYW1lbGNhc2VfbmFtZSkKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGZpbGUsIGNvbnN0IEZpbGVEZXNjcmlwdG9yKikKQEAgLTEyMTUsMTIgKzE2ODUsMTMgQEAKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIHR5cGUsIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSkKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGxhYmVsLCBGaWVsZERlc2NyaXB0b3I6OkxhYmVsKQogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgY29udGFpbmluZ190eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGNvbnRhaW5pbmdfb25lb2YsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKikKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGluZGV4X2luX29uZW9mLCBpbnQpCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBleHRlbnNpb25fc2NvcGUsIGNvbnN0IERlc2NyaXB0b3IqKQogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgbWVzc2FnZV90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGVudW1fdHlwZSwgY29uc3QgRW51bURlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZXhwZXJpbWVudGFsX21hcF9rZXksCi0gICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgRmllbGRPcHRpb25zKTsKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgRmllbGRPcHRpb25zKQogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgaGFzX2RlZmF1bHRfdmFsdWUsIGJvb2wpCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmllbGREZXNjcmlwdG9yLCBkZWZhdWx0X3ZhbHVlX2ludDMyICwgaW50MzIgKQogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpZWxkRGVzY3JpcHRvciwgZGVmYXVsdF92YWx1ZV9pbnQ2NCAsIGludDY0ICkKQEAgLTEyMzMsNiArMTcwNCwxMSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqKQogUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWVsZERlc2NyaXB0b3IsIGRlZmF1bHRfdmFsdWVfc3RyaW5nKQogCitQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKE9uZW9mRGVzY3JpcHRvciwgbmFtZSkKK1BST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoT25lb2ZEZXNjcmlwdG9yLCBmdWxsX25hbWUpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoT25lb2ZEZXNjcmlwdG9yLCBjb250YWluaW5nX3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE9uZW9mRGVzY3JpcHRvciwgZmllbGRfY291bnQsIGludCkKKwogUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgbmFtZSkKIFBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGZ1bGxfbmFtZSkKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgZmlsZSwgY29uc3QgRmlsZURlc2NyaXB0b3IqKQpAQCAtMTI0MCwxMyArMTcxNiwxNCBAQAogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCB2YWx1ZV9jb3VudCwgaW50KQogUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKikKLVBST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKEVudW1EZXNjcmlwdG9yLCBFbnVtT3B0aW9ucyk7CitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihFbnVtRGVzY3JpcHRvciwgRW51bU9wdGlvbnMpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRW51bURlc2NyaXB0b3IsIGlzX3BsYWNlaG9sZGVyLCBib29sKQogCiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIG5hbWUpCiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIGZ1bGxfbmFtZSkKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBudW1iZXIsIGludCkKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCB0eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihFbnVtVmFsdWVEZXNjcmlwdG9yLCBFbnVtVmFsdWVPcHRpb25zKTsKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKEVudW1WYWx1ZURlc2NyaXB0b3IsIEVudW1WYWx1ZU9wdGlvbnMpCiAKIFBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIG5hbWUpCiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBmdWxsX25hbWUpCkBAIC0xMjU0LDI0ICsxNzMxLDI5IEBACiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIG1ldGhvZF9jb3VudCwgaW50KQogUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SKFNlcnZpY2VEZXNjcmlwdG9yLCBtZXRob2QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWV0aG9kRGVzY3JpcHRvciopCi1QUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihTZXJ2aWNlRGVzY3JpcHRvciwgU2VydmljZU9wdGlvbnMpOworUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoU2VydmljZURlc2NyaXB0b3IsIFNlcnZpY2VPcHRpb25zKQogCiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIG5hbWUpCiBQUk9UT0JVRl9ERUZJTkVfU1RSSU5HX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIGZ1bGxfbmFtZSkKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBzZXJ2aWNlLCBjb25zdCBTZXJ2aWNlRGVzY3JpcHRvciopCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgaW5wdXRfdHlwZSwgY29uc3QgRGVzY3JpcHRvciopCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgb3V0cHV0X3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqKQotUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgTWV0aG9kT3B0aW9ucyk7CitQUk9UT0JVRl9ERUZJTkVfT1BUSU9OU19BQ0NFU1NPUihNZXRob2REZXNjcmlwdG9yLCBNZXRob2RPcHRpb25zKQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKE1ldGhvZERlc2NyaXB0b3IsIGNsaWVudF9zdHJlYW1pbmcsIGJvb2wpCitQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoTWV0aG9kRGVzY3JpcHRvciwgc2VydmVyX3N0cmVhbWluZywgYm9vbCkKIAogUFJPVE9CVUZfREVGSU5FX1NUUklOR19BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgbmFtZSkKIFBST1RPQlVGX0RFRklORV9TVFJJTkdfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHBhY2thZ2UpCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIHBvb2wsIGNvbnN0IERlc2NyaXB0b3JQb29sKikKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZGVwZW5kZW5jeV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBwdWJsaWNfZGVwZW5kZW5jeV9jb3VudCwgaW50KQorUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCB3ZWFrX2RlcGVuZGVuY3lfY291bnQsIGludCkKIFBST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgbWVzc2FnZV90eXBlX2NvdW50LCBpbnQpCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGVudW1fdHlwZV9jb3VudCwgaW50KQogUFJPVE9CVUZfREVGSU5FX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBzZXJ2aWNlX2NvdW50LCBpbnQpCiBQUk9UT0JVRl9ERUZJTkVfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIGV4dGVuc2lvbl9jb3VudCwgaW50KQotUFJPVE9CVUZfREVGSU5FX09QVElPTlNfQUNDRVNTT1IoRmlsZURlc2NyaXB0b3IsIEZpbGVPcHRpb25zKTsKK1BST1RPQlVGX0RFRklORV9PUFRJT05TX0FDQ0VTU09SKEZpbGVEZXNjcmlwdG9yLCBGaWxlT3B0aW9ucykKK1BST1RPQlVGX0RFRklORV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgaXNfcGxhY2Vob2xkZXIsIGJvb2wpCiAKIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgbWVzc2FnZV90eXBlLCBjb25zdCBEZXNjcmlwdG9yKikKIFBST1RPQlVGX0RFRklORV9BUlJBWV9BQ0NFU1NPUihGaWxlRGVzY3JpcHRvciwgZW51bV90eXBlLCBjb25zdCBFbnVtRGVzY3JpcHRvciopCkBAIC0xMjg2LDYgKzE3NjgsMjkgQEAKIAogLy8gQSBmZXcgYWNjZXNzb3JzIGRpZmZlciBmcm9tIHRoZSBtYWNyb3MuLi4KIAoraW5saW5lIGJvb2wgRGVzY3JpcHRvcjo6SXNFeHRlbnNpb25OdW1iZXIoaW50IG51bWJlcikgY29uc3QgeworICByZXR1cm4gRmluZEV4dGVuc2lvblJhbmdlQ29udGFpbmluZ051bWJlcihudW1iZXIpICE9IE5VTEw7Cit9CisKK2lubGluZSBib29sIERlc2NyaXB0b3I6OklzUmVzZXJ2ZWROdW1iZXIoaW50IG51bWJlcikgY29uc3QgeworICByZXR1cm4gRmluZFJlc2VydmVkUmFuZ2VDb250YWluaW5nTnVtYmVyKG51bWJlcikgIT0gTlVMTDsKK30KKworaW5saW5lIGJvb2wgRGVzY3JpcHRvcjo6SXNSZXNlcnZlZE5hbWUoY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcmVzZXJ2ZWRfbmFtZV9jb3VudCgpOyBpKyspIHsKKyAgICBpZiAobmFtZSA9PSByZXNlcnZlZF9uYW1lKGkpKSB7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCisvLyBDYW4ndCB1c2UgUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SIGJlY2F1c2UgcmVzZXJ2ZWRfbmFtZXNfIGlzIGFjdHVhbGx5CisvLyBhbiBhcnJheSBvZiBwb2ludGVycyByYXRoZXIgdGhhbiB0aGUgdXN1YWwgYXJyYXkgb2Ygb2JqZWN0cy4KK2lubGluZSBjb25zdCBzdHJpbmcmIERlc2NyaXB0b3I6OnJlc2VydmVkX25hbWUoaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiAqcmVzZXJ2ZWRfbmFtZXNfW2luZGV4XTsKK30KKwogaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjppc19yZXF1aXJlZCgpIGNvbnN0IHsKICAgcmV0dXJuIGxhYmVsKCkgPT0gTEFCRUxfUkVRVUlSRUQ7CiB9CkBAIC0xMzA2LDUwICsxODExLDcwIEBACiAvLyBpbiB0aGUgcGFyZW50J3MgYXJyYXkgb2YgY2hpbGRyZW4uCiBpbmxpbmUgaW50IEZpZWxkRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CiAgIGlmICghaXNfZXh0ZW5zaW9uXykgewotICAgIHJldHVybiB0aGlzIC0gY29udGFpbmluZ190eXBlXy0+ZmllbGRzXzsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gY29udGFpbmluZ190eXBlXy0+ZmllbGRzXyk7CiAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uX3Njb3BlXyAhPSBOVUxMKSB7Ci0gICAgcmV0dXJuIHRoaXMgLSBleHRlbnNpb25fc2NvcGVfLT5leHRlbnNpb25zXzsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gZXh0ZW5zaW9uX3Njb3BlXy0+ZXh0ZW5zaW9uc18pOwogICB9IGVsc2UgewotICAgIHJldHVybiB0aGlzIC0gZmlsZV8tPmV4dGVuc2lvbnNfOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMgLSBmaWxlXy0+ZXh0ZW5zaW9uc18pOwogICB9CiB9CiAKIGlubGluZSBpbnQgRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7CiAgIGlmIChjb250YWluaW5nX3R5cGVfID09IE5VTEwpIHsKLSAgICByZXR1cm4gdGhpcyAtIGZpbGVfLT5tZXNzYWdlX3R5cGVzXzsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gZmlsZV8tPm1lc3NhZ2VfdHlwZXNfKTsKICAgfSBlbHNlIHsKLSAgICByZXR1cm4gdGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPm5lc3RlZF90eXBlc187CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPm5lc3RlZF90eXBlc18pOwogICB9CiB9CiAKK2lubGluZSBpbnQgT25lb2ZEZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGNvbnRhaW5pbmdfdHlwZV8tPm9uZW9mX2RlY2xzXyk7Cit9CisKIGlubGluZSBpbnQgRW51bURlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgewogICBpZiAoY29udGFpbmluZ190eXBlXyA9PSBOVUxMKSB7Ci0gICAgcmV0dXJuIHRoaXMgLSBmaWxlXy0+ZW51bV90eXBlc187CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4odGhpcyAtIGZpbGVfLT5lbnVtX3R5cGVzXyk7CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIHRoaXMgLSBjb250YWluaW5nX3R5cGVfLT5lbnVtX3R5cGVzXzsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pih0aGlzIC0gY29udGFpbmluZ190eXBlXy0+ZW51bV90eXBlc18pOwogICB9CiB9CiAKIGlubGluZSBpbnQgRW51bVZhbHVlRGVzY3JpcHRvcjo6aW5kZXgoKSBjb25zdCB7Ci0gIHJldHVybiB0aGlzIC0gdHlwZV8tPnZhbHVlc187CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMgLSB0eXBlXy0+dmFsdWVzXyk7CiB9CiAKIGlubGluZSBpbnQgU2VydmljZURlc2NyaXB0b3I6OmluZGV4KCkgY29uc3QgewotICByZXR1cm4gdGhpcyAtIGZpbGVfLT5zZXJ2aWNlc187CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMgLSBmaWxlXy0+c2VydmljZXNfKTsKIH0KIAogaW5saW5lIGludCBNZXRob2REZXNjcmlwdG9yOjppbmRleCgpIGNvbnN0IHsKLSAgcmV0dXJuIHRoaXMgLSBzZXJ2aWNlXy0+bWV0aG9kc187CisgIHJldHVybiBzdGF0aWNfY2FzdDxpbnQ+KHRoaXMgLSBzZXJ2aWNlXy0+bWV0aG9kc18pOworfQorCitpbmxpbmUgY29uc3QgY2hhciogRmllbGREZXNjcmlwdG9yOjp0eXBlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiBrVHlwZVRvTmFtZVt0eXBlX107CiB9CiAKIGlubGluZSBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgRmllbGREZXNjcmlwdG9yOjpjcHBfdHlwZSgpIGNvbnN0IHsKICAgcmV0dXJuIGtUeXBlVG9DcHBUeXBlTWFwW3R5cGVfXTsKIH0KIAoraW5saW5lIGNvbnN0IGNoYXIqIEZpZWxkRGVzY3JpcHRvcjo6Y3BwX3R5cGVfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGtDcHBUeXBlVG9OYW1lW2tUeXBlVG9DcHBUeXBlTWFwW3R5cGVfXV07Cit9CisKIGlubGluZSBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgRmllbGREZXNjcmlwdG9yOjpUeXBlVG9DcHBUeXBlKFR5cGUgdHlwZSkgewogICByZXR1cm4ga1R5cGVUb0NwcFR5cGVNYXBbdHlwZV07CiB9CiAKK2lubGluZSBjb25zdCBjaGFyKiBGaWVsZERlc2NyaXB0b3I6OlR5cGVOYW1lKFR5cGUgdHlwZSkgeworICByZXR1cm4ga1R5cGVUb05hbWVbdHlwZV07Cit9CisKK2lubGluZSBjb25zdCBjaGFyKiBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGVOYW1lKENwcFR5cGUgY3BwX3R5cGUpIHsKKyAgcmV0dXJuIGtDcHBUeXBlVG9OYW1lW2NwcF90eXBlXTsKK30KKwogaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yOjpJc1R5cGVQYWNrYWJsZShUeXBlIGZpZWxkX3R5cGUpIHsKICAgcmV0dXJuIChmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcgJiYKICAgICAgICAgICBmaWVsZF90eXBlICE9IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUCAmJgpAQCAtMTM2MSw2ICsxODg2LDI2IEBACiAgIHJldHVybiBkZXBlbmRlbmNpZXNfW2luZGV4XTsKIH0KIAoraW5saW5lIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBGaWxlRGVzY3JpcHRvcjo6cHVibGljX2RlcGVuZGVuY3koCisgICAgaW50IGluZGV4KSBjb25zdCB7CisgIHJldHVybiBkZXBlbmRlbmNpZXNfW3B1YmxpY19kZXBlbmRlbmNpZXNfW2luZGV4XV07Cit9CisKK2lubGluZSBjb25zdCBGaWxlRGVzY3JpcHRvciogRmlsZURlc2NyaXB0b3I6OndlYWtfZGVwZW5kZW5jeSgKKyAgICBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgcmV0dXJuIGRlcGVuZGVuY2llc19bd2Vha19kZXBlbmRlbmNpZXNfW2luZGV4XV07Cit9CisKK2lubGluZSBGaWxlRGVzY3JpcHRvcjo6U3ludGF4IEZpbGVEZXNjcmlwdG9yOjpzeW50YXgoKSBjb25zdCB7CisgIHJldHVybiBzeW50YXhfOworfQorCisvLyBDYW4ndCB1c2UgUFJPVE9CVUZfREVGSU5FX0FSUkFZX0FDQ0VTU09SIGJlY2F1c2UgZmllbGRzXyBpcyBhY3R1YWxseSBhbiBhcnJheQorLy8gb2YgcG9pbnRlcnMgcmF0aGVyIHRoYW4gdGhlIHVzdWFsIGFycmF5IG9mIG9iamVjdHMuCitpbmxpbmUgY29uc3QgRmllbGREZXNjcmlwdG9yKiBPbmVvZkRlc2NyaXB0b3I6OmZpZWxkKGludCBpbmRleCkgY29uc3QgeworICByZXR1cm4gZmllbGRzX1tpbmRleF07Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5jYwppbmRleCA3ZDE2MDgwLi40ZDVjNGQ5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuY2MKQEAgLTEsMTQgKzEsMTggQEAKIC8vIEdlbmVyYXRlZCBieSB0aGUgcHJvdG9jb2wgYnVmZmVyIGNvbXBpbGVyLiAgRE8gTk9UIEVESVQhCisvLyBzb3VyY2U6IGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCiAKICNkZWZpbmUgSU5URVJOQUxfU1VQUFJFU1NfUFJPVE9CVUZfRklFTERfREVQUkVDQVRJT04KLSNpbmNsdWRlICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oIgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CiAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoaW5jbHVkZXMpCkBAIC0zMCwxMSArMzQsMTcgQEAKIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfID0gTlVMTDsKIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgogICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2VfcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfcmVmbGVjdGlvbl8gPSBOVUxMOwogY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IE5VTEw7CiBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKICAgRmllbGREZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOwogY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yXyA9IE5VTEw7CiBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE9uZW9mRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBPbmVvZkRlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXyA9IE5VTEw7CiBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1EZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBOVUxMOwogY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCiAgIEVudW1EZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPSBOVUxMOwpAQCAtNTgsNiArNjgsNyBAQAogY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qCiAgIEZpZWxkT3B0aW9uc19yZWZsZWN0aW9uXyA9IE5VTEw7CiBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yXyA9IE5VTEw7CiBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEVudW1PcHRpb25zX2Rlc2NyaXB0b3JfID0gTlVMTDsKIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgogICBFbnVtT3B0aW9uc19yZWZsZWN0aW9uXyA9IE5VTEw7CkBAIC04Miw2ICs5MywxMiBAQAogY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9kZXNjcmlwdG9yXyA9IE5VTEw7CiBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKICAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBHZW5lcmF0ZWRDb2RlSW5mb19kZXNjcmlwdG9yXyA9IE5VTEw7Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbioKKyAgR2VuZXJhdGVkQ29kZUluZm9fcmVmbGVjdGlvbl8gPSBOVUxMOworY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2Rlc2NyaXB0b3JfID0gTlVMTDsKK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX3JlZmxlY3Rpb25fID0gTlVMTDsKIAogfSAgLy8gbmFtZXNwYWNlCiAKQEAgLTk3LDc4ICsxMTQsMTAwIEBACiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclNldCwgZmlsZV8pLAogICB9OwogICBGaWxlRGVzY3JpcHRvclNldF9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKICAgICAgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfLAogICAgICAgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgRmlsZURlc2NyaXB0b3JTZXRfb2Zmc2V0c18sCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yU2V0LCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JTZXQsIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihGaWxlRGVzY3JpcHRvclNldCkpOworICAgICAgLTEsCisgICAgICBzaXplb2YoRmlsZURlc2NyaXB0b3JTZXQpLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclNldCwgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CiAgIEZpbGVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMSk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90b19vZmZzZXRzX1s5XSA9IHsKKyAgc3RhdGljIGNvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzEyXSA9IHsKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHBhY2thZ2VfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIGRlcGVuZGVuY3lfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHB1YmxpY19kZXBlbmRlbmN5XyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCB3ZWFrX2RlcGVuZGVuY3lfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG1lc3NhZ2VfdHlwZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgZW51bV90eXBlXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBzZXJ2aWNlXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlRGVzY3JpcHRvclByb3RvLCBleHRlbnNpb25fKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHNvdXJjZV9jb2RlX2luZm9fKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIHN5bnRheF8pLAogICB9OwogICBGaWxlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAogICAgICAgRmlsZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgRmlsZURlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVEZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihGaWxlRGVzY3JpcHRvclByb3RvKSk7CisgICAgICAtMSwKKyAgICAgIHNpemVvZihGaWxlRGVzY3JpcHRvclByb3RvKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZURlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CiAgIERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgyKTsKLSAgc3RhdGljIGNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bN10gPSB7CisgIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzEwXSA9IHsKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgbmFtZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBmaWVsZF8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBleHRlbnNpb25fKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgbmVzdGVkX3R5cGVfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgZW51bV90eXBlXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIGV4dGVuc2lvbl9yYW5nZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvLCBvbmVvZl9kZWNsXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgcmVzZXJ2ZWRfcmFuZ2VfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgcmVzZXJ2ZWRfbmFtZV8pLAogICB9OwogICBEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCiAgICAgICBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihEZXNjcmlwdG9yUHJvdG8pKTsKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKERlc2NyaXB0b3JQcm90byksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CiAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9kZXNjcmlwdG9yXyA9IERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMCk7CiAgIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX29mZnNldHNfWzJdID0gewogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBzdGFydF8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBlbmRfKSwKICAgfTsKICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAogICAgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfLAogICAgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXywKICAgICAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZV9vZmZzZXRzXywKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBfdW5rbm93bl9maWVsZHNfKSwKICAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKSk7CisgICAgICAtMSwKKyAgICAgIHNpemVvZihEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UpLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOworICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9kZXNjcmlwdG9yXyA9IERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+bmVzdGVkX3R5cGUoMSk7CisgIHN0YXRpYyBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2Vfb2Zmc2V0c19bMl0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgc3RhcnRfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlLCBlbmRfKSwKKyAgfTsKKyAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfcmVmbGVjdGlvbl8gPQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICAgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlX2Rlc2NyaXB0b3JfLAorICAgICAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfLAorICAgICAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2Vfb2Zmc2V0c18sCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIC0xLAorICAgICAgLTEsCisgICAgICBzaXplb2YoRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UpLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSwgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CiAgIEZpZWxkRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDMpOwotICBzdGF0aWMgY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzhdID0geworICBzdGF0aWMgY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvX29mZnNldHNfWzEwXSA9IHsKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgbnVtYmVyXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgbGFiZWxfKSwKQEAgLTE3NiwyMTMgKzIxNSwyNDcgQEAKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCB0eXBlX25hbWVfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBleHRlbmRlZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIGRlZmF1bHRfdmFsdWVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBvbmVvZl9pbmRleF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIGpzb25fbmFtZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIG9wdGlvbnNfKSwKICAgfTsKICAgRmllbGREZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZERlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkRGVzY3JpcHRvclByb3RvLCBfdW5rbm93bl9maWVsZHNfKSwKICAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoRmllbGREZXNjcmlwdG9yUHJvdG8pKTsKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKEZpZWxkRGVzY3JpcHRvclByb3RvKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGREZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOwogICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX2Rlc2NyaXB0b3JfID0gRmllbGREZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKICAgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcl8gPSBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXy0+ZW51bV90eXBlKDEpOwotICBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDQpOworICBPbmVvZkRlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg0KTsKKyAgc3RhdGljIGNvbnN0IGludCBPbmVvZkRlc2NyaXB0b3JQcm90b19vZmZzZXRzX1sxXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE9uZW9mRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCisgIH07CisgIE9uZW9mRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBPbmVvZkRlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKKyAgICAgIE9uZW9mRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIE9uZW9mRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChPbmVvZkRlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCisgICAgICAtMSwKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKE9uZW9mRGVzY3JpcHRvclByb3RvKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoT25lb2ZEZXNjcmlwdG9yUHJvdG8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOworICBFbnVtRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDUpOwogICBzdGF0aWMgY29uc3QgaW50IEVudW1EZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bM10gPSB7CiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBuYW1lXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCB2YWx1ZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAogICB9OwogICBFbnVtRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAogICAgICAgRW51bURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKICAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgRW51bURlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bURlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1EZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihFbnVtRGVzY3JpcHRvclByb3RvKSk7Ci0gIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg1KTsKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKEVudW1EZXNjcmlwdG9yUHJvdG8pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtRGVzY3JpcHRvclByb3RvLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgICAgIC0xKTsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDYpOwogICBzdGF0aWMgY29uc3QgaW50IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90b19vZmZzZXRzX1szXSA9IHsKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgbmFtZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLCBudW1iZXJfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAogICB9OwogICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCiAgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pKTsKLSAgU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg2KTsKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CisgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoNyk7CiAgIHN0YXRpYyBjb25zdCBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90b19vZmZzZXRzX1szXSA9IHsKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIG1ldGhvZF8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgb3B0aW9uc18pLAogICB9OwogICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAogICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywKICAgICAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgU2VydmljZURlc2NyaXB0b3JQcm90b19vZmZzZXRzXywKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihTZXJ2aWNlRGVzY3JpcHRvclByb3RvKSk7Ci0gIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg3KTsKLSAgc3RhdGljIGNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bNF0gPSB7CisgICAgICAtMSwKKyAgICAgIHNpemVvZihTZXJ2aWNlRGVzY3JpcHRvclByb3RvKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZURlc2NyaXB0b3JQcm90bywgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSg4KTsKKyAgc3RhdGljIGNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG9fb2Zmc2V0c19bNl0gPSB7CiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIG5hbWVfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgaW5wdXRfdHlwZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBvdXRwdXRfdHlwZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBvcHRpb25zXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIGNsaWVudF9zdHJlYW1pbmdfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZERlc2NyaXB0b3JQcm90bywgc2VydmVyX3N0cmVhbWluZ18pLAogICB9OwogICBNZXRob2REZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sCiAgICAgICBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgTWV0aG9kRGVzY3JpcHRvclByb3RvX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2REZXNjcmlwdG9yUHJvdG8sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihNZXRob2REZXNjcmlwdG9yUHJvdG8pKTsKLSAgRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoOCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRmlsZU9wdGlvbnNfb2Zmc2V0c19bMTBdID0geworICAgICAgLTEsCisgICAgICBzaXplb2YoTWV0aG9kRGVzY3JpcHRvclByb3RvKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kRGVzY3JpcHRvclByb3RvLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgICAgIC0xKTsKKyAgRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoOSk7CisgIHN0YXRpYyBjb25zdCBpbnQgRmlsZU9wdGlvbnNfb2Zmc2V0c19bMTVdID0gewogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfcGFja2FnZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfb3V0ZXJfY2xhc3NuYW1lXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgamF2YV9tdWx0aXBsZV9maWxlc18pLAotICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIHJldGFpbl91bmtub3duX2ZpZWxkc18pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIG9wdGltaXplX2Zvcl8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGdvX3BhY2thZ2VfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBjY19nZW5lcmljX3NlcnZpY2VzXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgamF2YV9nZW5lcmljX3NlcnZpY2VzXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgcHlfZ2VuZXJpY19zZXJ2aWNlc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmlsZU9wdGlvbnMsIGRlcHJlY2F0ZWRfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBjY19lbmFibGVfYXJlbmFzXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgb2JqY19jbGFzc19wcmVmaXhfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBjc2hhcnBfbmFtZXNwYWNlXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKICAgfTsKICAgRmlsZU9wdGlvbnNfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBGaWxlT3B0aW9uc19kZXNjcmlwdG9yXywKICAgICAgIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKICAgICAgIEZpbGVPcHRpb25zX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpbGVPcHRpb25zLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKEZpbGVPcHRpb25zKSk7CisgICAgICBzaXplb2YoRmlsZU9wdGlvbnMpLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWxlT3B0aW9ucywgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CiAgIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9kZXNjcmlwdG9yXyA9IEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfLT5lbnVtX3R5cGUoMCk7Ci0gIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDkpOwotICBzdGF0aWMgY29uc3QgaW50IE1lc3NhZ2VPcHRpb25zX29mZnNldHNfWzNdID0geworICBNZXNzYWdlT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMCk7CisgIHN0YXRpYyBjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnNfb2Zmc2V0c19bNV0gPSB7CiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgZGVwcmVjYXRlZF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIG1hcF9lbnRyeV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCiAgIH07CiAgIE1lc3NhZ2VPcHRpb25zX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAogICAgICAgTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl8sCiAgICAgICBNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICBNZXNzYWdlT3B0aW9uc19vZmZzZXRzXywKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXNzYWdlT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWVzc2FnZU9wdGlvbnMsIF9leHRlbnNpb25zXyksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihNZXNzYWdlT3B0aW9ucykpOwotICBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTApOwotICBzdGF0aWMgY29uc3QgaW50IEZpZWxkT3B0aW9uc19vZmZzZXRzX1s1XSA9IHsKKyAgICAgIHNpemVvZihNZXNzYWdlT3B0aW9ucyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1lc3NhZ2VPcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgICAgIC0xKTsKKyAgRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDExKTsKKyAgc3RhdGljIGNvbnN0IGludCBGaWVsZE9wdGlvbnNfb2Zmc2V0c19bN10gPSB7CiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIGN0eXBlXyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIHBhY2tlZF8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBqc3R5cGVfKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgbGF6eV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBkZXByZWNhdGVkXyksCi0gICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIHdlYWtfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEZpZWxkT3B0aW9ucywgdW5pbnRlcnByZXRlZF9vcHRpb25fKSwKICAgfTsKICAgRmllbGRPcHRpb25zX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAogICAgICAgRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfLAogICAgICAgRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXywKICAgICAgIEZpZWxkT3B0aW9uc19vZmZzZXRzXywKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRmllbGRPcHRpb25zLCBfdW5rbm93bl9maWVsZHNfKSwKKyAgICAgIC0xLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIF9leHRlbnNpb25zXyksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihGaWVsZE9wdGlvbnMpKTsKKyAgICAgIHNpemVvZihGaWVsZE9wdGlvbnMpLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChGaWVsZE9wdGlvbnMsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOwogICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcl8gPSBGaWVsZE9wdGlvbnNfZGVzY3JpcHRvcl8tPmVudW1fdHlwZSgwKTsKLSAgRW51bU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTEpOwotICBzdGF0aWMgY29uc3QgaW50IEVudW1PcHRpb25zX29mZnNldHNfWzFdID0geworICBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3JfID0gRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfLT5lbnVtX3R5cGUoMSk7CisgIEVudW1PcHRpb25zX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDEyKTsKKyAgc3RhdGljIGNvbnN0IGludCBFbnVtT3B0aW9uc19vZmZzZXRzX1szXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBhbGxvd19hbGlhc18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bU9wdGlvbnMsIGRlcHJlY2F0ZWRfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAogICB9OwogICBFbnVtT3B0aW9uc19yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKICAgICAgIEVudW1PcHRpb25zX2Rlc2NyaXB0b3JfLAogICAgICAgRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgRW51bU9wdGlvbnNfb2Zmc2V0c18sCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bU9wdGlvbnMsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBfZXh0ZW5zaW9uc18pLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoRW51bU9wdGlvbnMpKTsKLSAgRW51bVZhbHVlT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMik7Ci0gIHN0YXRpYyBjb25zdCBpbnQgRW51bVZhbHVlT3B0aW9uc19vZmZzZXRzX1sxXSA9IHsKKyAgICAgIHNpemVvZihFbnVtT3B0aW9ucyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1PcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgICAgIC0xKTsKKyAgRW51bVZhbHVlT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxMyk7CisgIHN0YXRpYyBjb25zdCBpbnQgRW51bVZhbHVlT3B0aW9uc19vZmZzZXRzX1syXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIGRlcHJlY2F0ZWRfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEVudW1WYWx1ZU9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCiAgIH07CiAgIEVudW1WYWx1ZU9wdGlvbnNfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfLAogICAgICAgRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICBFbnVtVmFsdWVPcHRpb25zX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoRW51bVZhbHVlT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKEVudW1WYWx1ZU9wdGlvbnMpKTsKLSAgU2VydmljZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTMpOwotICBzdGF0aWMgY29uc3QgaW50IFNlcnZpY2VPcHRpb25zX29mZnNldHNfWzFdID0geworICAgICAgc2l6ZW9mKEVudW1WYWx1ZU9wdGlvbnMpLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChFbnVtVmFsdWVPcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgICAgIC0xKTsKKyAgU2VydmljZU9wdGlvbnNfZGVzY3JpcHRvcl8gPSBmaWxlLT5tZXNzYWdlX3R5cGUoMTQpOworICBzdGF0aWMgY29uc3QgaW50IFNlcnZpY2VPcHRpb25zX29mZnNldHNfWzJdID0geworICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZU9wdGlvbnMsIGRlcHJlY2F0ZWRfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VPcHRpb25zLCB1bmludGVycHJldGVkX29wdGlvbl8pLAogICB9OwogICBTZXJ2aWNlT3B0aW9uc19yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKICAgICAgIFNlcnZpY2VPcHRpb25zX2Rlc2NyaXB0b3JfLAogICAgICAgU2VydmljZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgU2VydmljZU9wdGlvbnNfb2Zmc2V0c18sCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU2VydmljZU9wdGlvbnMsIF91bmtub3duX2ZpZWxkc18pLAorICAgICAgLTEsCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VPcHRpb25zLCBfZXh0ZW5zaW9uc18pLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoU2VydmljZU9wdGlvbnMpKTsKLSAgTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQgTWV0aG9kT3B0aW9uc19vZmZzZXRzX1sxXSA9IHsKKyAgICAgIHNpemVvZihTZXJ2aWNlT3B0aW9ucyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNlcnZpY2VPcHRpb25zLCBfaW50ZXJuYWxfbWV0YWRhdGFfKSwKKyAgICAgIC0xKTsKKyAgTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNSk7CisgIHN0YXRpYyBjb25zdCBpbnQgTWV0aG9kT3B0aW9uc19vZmZzZXRzX1syXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZE9wdGlvbnMsIGRlcHJlY2F0ZWRfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZE9wdGlvbnMsIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXyksCiAgIH07CiAgIE1ldGhvZE9wdGlvbnNfcmVmbGVjdGlvbl8gPQotICAgIG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCiAgICAgICBNZXRob2RPcHRpb25zX2Rlc2NyaXB0b3JfLAogICAgICAgTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICBNZXRob2RPcHRpb25zX29mZnNldHNfLAogICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChNZXRob2RPcHRpb25zLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kT3B0aW9ucywgX3Vua25vd25fZmllbGRzXyksCisgICAgICAtMSwKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoTWV0aG9kT3B0aW9ucywgX2V4dGVuc2lvbnNfKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclBvb2w6OmdlbmVyYXRlZF9wb29sKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAotICAgICAgc2l6ZW9mKE1ldGhvZE9wdGlvbnMpKTsKLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNSk7CisgICAgICBzaXplb2YoTWV0aG9kT3B0aW9ucyksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKE1ldGhvZE9wdGlvbnMsIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOworICBVbmludGVycHJldGVkT3B0aW9uX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDE2KTsKICAgc3RhdGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uX29mZnNldHNfWzddID0gewogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgbmFtZV8pLAogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgaWRlbnRpZmllcl92YWx1ZV8pLApAQCAtMzkzLDYzICs0NjYsOTkgQEAKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIGFnZ3JlZ2F0ZV92YWx1ZV8pLAogICB9OwogICBVbmludGVycHJldGVkT3B0aW9uX3JlZmxlY3Rpb25fID0KLSAgICBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAogICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXywKICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9vZmZzZXRzXywKICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgX2hhc19iaXRzX1swXSksCi0gICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb24sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihVbmludGVycHJldGVkT3B0aW9uKSk7CisgICAgICAtMSwKKyAgICAgIHNpemVvZihVbmludGVycHJldGVkT3B0aW9uKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbiwgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CiAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl8gPSBVbmludGVycHJldGVkT3B0aW9uX2Rlc2NyaXB0b3JfLT5uZXN0ZWRfdHlwZSgwKTsKICAgc3RhdGljIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X29mZnNldHNfWzJdID0gewogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgbmFtZV9wYXJ0XyksCiAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBpc19leHRlbnNpb25fKSwKICAgfTsKICAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydF9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfZGVzY3JpcHRvcl8sCiAgICAgICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXywKICAgICAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnRfb2Zmc2V0c18sCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQsIF9oYXNfYml0c19bMF0pLAotICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0LCBfdW5rbm93bl9maWVsZHNfKSwKICAgICAgIC0xLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OmdlbmVyYXRlZF9mYWN0b3J5KCksCi0gICAgICBzaXplb2YoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCkpOwotICBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgxNik7CisgICAgICAtMSwKKyAgICAgIHNpemVvZihVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCwgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CisgIFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDE3KTsKICAgc3RhdGljIGNvbnN0IGludCBTb3VyY2VDb2RlSW5mb19vZmZzZXRzX1sxXSA9IHsKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvLCBsb2NhdGlvbl8pLAogICB9OwogICBTb3VyY2VDb2RlSW5mb19yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKICAgICAgIFNvdXJjZUNvZGVJbmZvX2Rlc2NyaXB0b3JfLAogICAgICAgU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgU291cmNlQ29kZUluZm9fb2Zmc2V0c18sCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm8sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihTb3VyY2VDb2RlSW5mbykpOworICAgICAgLTEsCisgICAgICBzaXplb2YoU291cmNlQ29kZUluZm8pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mbywgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CiAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfID0gU291cmNlQ29kZUluZm9fZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKDApOwotICBzdGF0aWMgY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX29mZnNldHNfWzJdID0geworICBzdGF0aWMgY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX29mZnNldHNfWzVdID0gewogICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIHBhdGhfKSwKICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCBzcGFuXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgbGVhZGluZ19jb21tZW50c18pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIHRyYWlsaW5nX2NvbW1lbnRzXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18pLAogICB9OwogICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbl9yZWZsZWN0aW9uXyA9Ci0gICAgbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpOZXdHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbigKICAgICAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfLAogICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgU291cmNlQ29kZUluZm9fTG9jYXRpb25fb2Zmc2V0c18sCiAgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uLCBfaGFzX2JpdHNfWzBdKSwKLSAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoU291cmNlQ29kZUluZm9fTG9jYXRpb24sIF91bmtub3duX2ZpZWxkc18pLAogICAgICAgLTEsCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKLSAgICAgIHNpemVvZihTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbikpOworICAgICAgLTEsCisgICAgICBzaXplb2YoU291cmNlQ29kZUluZm9fTG9jYXRpb24pLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiwgX2ludGVybmFsX21ldGFkYXRhXyksCisgICAgICAtMSk7CisgIEdlbmVyYXRlZENvZGVJbmZvX2Rlc2NyaXB0b3JfID0gZmlsZS0+bWVzc2FnZV90eXBlKDE4KTsKKyAgc3RhdGljIGNvbnN0IGludCBHZW5lcmF0ZWRDb2RlSW5mb19vZmZzZXRzX1sxXSA9IHsKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEdlbmVyYXRlZENvZGVJbmZvLCBhbm5vdGF0aW9uXyksCisgIH07CisgIEdlbmVyYXRlZENvZGVJbmZvX3JlZmxlY3Rpb25fID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBHZW5lcmF0ZWRDb2RlSW5mb19kZXNjcmlwdG9yXywKKyAgICAgIEdlbmVyYXRlZENvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXywKKyAgICAgIEdlbmVyYXRlZENvZGVJbmZvX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mbywgX2hhc19iaXRzX1swXSksCisgICAgICAtMSwKKyAgICAgIC0xLAorICAgICAgc2l6ZW9mKEdlbmVyYXRlZENvZGVJbmZvKSwKKyAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoR2VuZXJhdGVkQ29kZUluZm8sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOworICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2Rlc2NyaXB0b3JfID0gR2VuZXJhdGVkQ29kZUluZm9fZGVzY3JpcHRvcl8tPm5lc3RlZF90eXBlKDApOworICBzdGF0aWMgY29uc3QgaW50IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fb2Zmc2V0c19bNF0gPSB7CisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBwYXRoXyksCisgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBzb3VyY2VfZmlsZV8pLAorICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiwgYmVnaW5fKSwKKyAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24sIGVuZF8pLAorICB9OworICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX3JlZmxlY3Rpb25fID0KKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TmV3R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2Rlc2NyaXB0b3JfLAorICAgICAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8sCisgICAgICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX29mZnNldHNfLAorICAgICAgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uLCBfaGFzX2JpdHNfWzBdKSwKKyAgICAgIC0xLAorICAgICAgLTEsCisgICAgICBzaXplb2YoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiksCisgICAgICBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24sIF9pbnRlcm5hbF9tZXRhZGF0YV8pLAorICAgICAgLTEpOwogfQogCiBuYW1lc3BhY2UgewpAQCAtNDYzLDQ1ICs1NzIsNTMgQEAKIHZvaWQgcHJvdG9idWZfUmVnaXN0ZXJUeXBlcyhjb25zdCA6OnN0ZDo6c3RyaW5nJikgewogICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgRmlsZURlc2NyaXB0b3JTZXRfZGVzY3JpcHRvcl8sICZGaWxlRGVzY3JpcHRvclNldDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIEZpbGVEZXNjcmlwdG9yU2V0X2Rlc2NyaXB0b3JfLCAmRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIEZpbGVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZGaWxlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICAgICAgRmlsZURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkRlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkRlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfLCAmRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICAgICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX2Rlc2NyaXB0b3JfLCAmRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlKCkpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICAgICAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZGVzY3JpcHRvcl8sICZEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgRW51bURlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgICAgICBGaWVsZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJkZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgICAgICBPbmVvZkRlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJk9uZW9mRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmU2VydmljZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIEVudW1EZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZFbnVtRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlKCkpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBNZXRob2REZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgICAgICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9fZGVzY3JpcHRvcl8sICZFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIEZpbGVPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRmlsZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgICAgICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfLCAmU2VydmljZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgTWVzc2FnZU9wdGlvbnNfZGVzY3JpcHRvcl8sICZNZXNzYWdlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIE1ldGhvZERlc2NyaXB0b3JQcm90b19kZXNjcmlwdG9yXywgJk1ldGhvZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICAgICAgRmlsZU9wdGlvbnNfZGVzY3JpcHRvcl8sICZGaWxlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgRW51bU9wdGlvbnNfZGVzY3JpcHRvcl8sICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIE1lc3NhZ2VPcHRpb25zX2Rlc2NyaXB0b3JfLCAmTWVzc2FnZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIEVudW1WYWx1ZU9wdGlvbnNfZGVzY3JpcHRvcl8sICZFbnVtVmFsdWVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICAgICAgRmllbGRPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRmllbGRPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXywgJlNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICAgICAgRW51bU9wdGlvbnNfZGVzY3JpcHRvcl8sICZFbnVtT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgTWV0aG9kT3B0aW9uc19kZXNjcmlwdG9yXywgJk1ldGhvZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgICAgICBFbnVtVmFsdWVPcHRpb25zX2Rlc2NyaXB0b3JfLCAmRW51bVZhbHVlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCi0gICAgVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXywgJlVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgICAgICBTZXJ2aWNlT3B0aW9uc19kZXNjcmlwdG9yXywgJlNlcnZpY2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2Rlc2NyaXB0b3JfLCAmVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgICAgIE1ldGhvZE9wdGlvbnNfZGVzY3JpcHRvcl8sICZNZXRob2RPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlKCkpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKLSAgICBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXywgJlNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICAgICAgVW5pbnRlcnByZXRlZE9wdGlvbl9kZXNjcmlwdG9yXywgJlVuaW50ZXJwcmV0ZWRPcHRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAotICAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfLCAmU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgICAgICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0X2Rlc2NyaXB0b3JfLCAmVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgICBTb3VyY2VDb2RlSW5mb19kZXNjcmlwdG9yXywgJlNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlKCkpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpJbnRlcm5hbFJlZ2lzdGVyR2VuZXJhdGVkTWVzc2FnZSgKKyAgICAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uX2Rlc2NyaXB0b3JfLCAmU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRNZXNzYWdlKAorICAgICAgR2VuZXJhdGVkQ29kZUluZm9fZGVzY3JpcHRvcl8sICZHZW5lcmF0ZWRDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlRmFjdG9yeTo6SW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoCisgICAgICBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2Rlc2NyaXB0b3JfLCAmR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZSgpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC01MTUsOCArNjMyLDEyIEBACiAgIGRlbGV0ZSBEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CiAgIGRlbGV0ZSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfOwogICBkZWxldGUgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlX3JlZmxlY3Rpb25fOworICBkZWxldGUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfcmVmbGVjdGlvbl87CiAgIGRlbGV0ZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87CiAgIGRlbGV0ZSBGaWVsZERlc2NyaXB0b3JQcm90b19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIE9uZW9mRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKKyAgZGVsZXRlIE9uZW9mRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOwogICBkZWxldGUgRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV87CiAgIGRlbGV0ZSBFbnVtRGVzY3JpcHRvclByb3RvX3JlZmxlY3Rpb25fOwogICBkZWxldGUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXzsKQEAgLTU0Nyw2ICs2NjgsMTAgQEAKICAgZGVsZXRlIFNvdXJjZUNvZGVJbmZvX3JlZmxlY3Rpb25fOwogICBkZWxldGUgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmRlZmF1bHRfaW5zdGFuY2VfOwogICBkZWxldGUgU291cmNlQ29kZUluZm9fTG9jYXRpb25fcmVmbGVjdGlvbl87CisgIGRlbGV0ZSBHZW5lcmF0ZWRDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV87CisgIGRlbGV0ZSBHZW5lcmF0ZWRDb2RlSW5mb19yZWZsZWN0aW9uXzsKKyAgZGVsZXRlIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmRlZmF1bHRfaW5zdGFuY2VfOworICBkZWxldGUgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9yZWZsZWN0aW9uXzsKIH0KIAogdm9pZCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCkgewpAQCAtNTU0LDExNCArNjc5LDE0NiBAQAogICBpZiAoYWxyZWFkeV9oZXJlKSByZXR1cm47CiAgIGFscmVhZHlfaGVyZSA9IHRydWU7CiAgIEdPT0dMRV9QUk9UT0JVRl9WRVJJRllfVkVSU0lPTjsKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQb29sOjpJbnRlcm5hbEFkZEdlbmVyYXRlZEZpbGUoCiAgICAgIlxuIGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXDAyMlwwMTdnb29nIgogICAgICJsZS5wcm90b2J1ZlwiR1xuXDAyMUZpbGVEZXNjcmlwdG9yU2V0XDAyMjJcblwwMDRmaWxlIgogICAgICJcMDMwXDAwMSBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQIgotICAgICJyb3RvXCJcMjI3XDAwM1xuXDAyM0ZpbGVEZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxIgorICAgICJyb3RvXCJcMzMzXDAwM1xuXDAyM0ZpbGVEZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxIgogICAgICIoXHRcMDIyXDAxN1xuXDAwN3BhY2thZ2VcMDMwXDAwMiBcMDAxKFx0XDAyMlwwMjJcblxuZGVwZW5kZW5jeVwwMzBcMDAzIFwwMDMoXHRcMDIyIgotICAgICI2XG5cMDE0bWVzc2FnZV90eXBlXDAzMFwwMDQgXDAwMyhcMDEzMiAuZ29vZ2xlLnByb3RvYnVmLiIKLSAgICAiRGVzY3JpcHRvclByb3RvXDAyMjdcblx0ZW51bV90eXBlXDAzMFwwMDUgXDAwMyhcMDEzMiQuZ29vIgotICAgICJnbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1wwMjI4XG5cMDA3c2VydiIKLSAgICAiaWNlXDAzMFwwMDYgXDAwMyhcMDEzMlwnLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3IiCi0gICAgImlwdG9yUHJvdG9cMDIyOFxuXHRleHRlbnNpb25cMDMwXDAwNyBcMDAzKFwwMTMyJS5nb29nbGUucCIKLSAgICAicm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90b1wwMjItXG5cMDA3b3B0aW9uc1wwMzAiCi0gICAgIlwwMTAgXDAwMShcMDEzMlwwMzQuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXDAyMjlcblwwMjBzIgotICAgICJvdXJjZV9jb2RlX2luZm9cMDMwXHQgXDAwMShcMDEzMlwwMzcuZ29vZ2xlLnByb3RvYnVmLiIKLSAgICAiU291cmNlQ29kZUluZm9cIlwyNTFcMDAzXG5cMDE3RGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDRuYSIKLSAgICAibWVcMDMwXDAwMSBcMDAxKFx0XDAyMjRcblwwMDVmaWVsZFwwMzBcMDAyIFwwMDMoXDAxMzIlLmdvb2dsZS5wcm90b2J1IgotICAgICJmLkZpZWxkRGVzY3JpcHRvclByb3RvXDAyMjhcblx0ZXh0ZW5zaW9uXDAzMFwwMDYgXDAwMygiCisgICAgIlwwMzFcblwwMjFwdWJsaWNfZGVwZW5kZW5jeVwwMzBcbiBcMDAzKFwwMDVcMDIyXDAyN1xuXDAxN3dlYWtfZGVwZW4iCisgICAgImRlbmN5XDAzMFwwMTMgXDAwMyhcMDA1XDAyMjZcblwwMTRtZXNzYWdlX3R5cGVcMDMwXDAwNCBcMDAzKFwwMTMyIC5nb29nIgorICAgICJsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG9cMDIyN1xuXHRlbnVtX3R5cGUiCisgICAgIlwwMzBcMDA1IFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclAiCisgICAgInJvdG9cMDIyOFxuXDAwN3NlcnZpY2VcMDMwXDAwNiBcMDAzKFwwMTMyXCcuZ29vZ2xlLnByb3RvYnVmLiIKKyAgICAiU2VydmljZURlc2NyaXB0b3JQcm90b1wwMjI4XG5cdGV4dGVuc2lvblwwMzBcMDA3IFwwMDMoIgogICAgICJcMDEzMiUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIgotICAgICJcMDIyNVxuXDAxM25lc3RlZF90eXBlXDAzMFwwMDMgXDAwMyhcMDEzMiAuZ29vZ2xlLnByb3RvYnVmLiIKLSAgICAiRGVzY3JpcHRvclByb3RvXDAyMjdcblx0ZW51bV90eXBlXDAzMFwwMDQgXDAwMyhcMDEzMiQuZ29vIgotICAgICJnbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90b1wwMjJIXG5cMDE3ZXh0ZSIKLSAgICAibnNpb25fcmFuZ2VcMDMwXDAwNSBcMDAzKFwwMTMyLy5nb29nbGUucHJvdG9idWYuRGVzYyIKLSAgICAicmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2VcMDIyMFxuXDAwN29wdGlvbnNcMDMwXDAwNyAiCi0gICAgIlwwMDEoXDAxMzJcMDM3Lmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9uc1wwMzIsXG5cMDE2IgotICAgICJFeHRlbnNpb25SYW5nZVwwMjJcclxuXDAwNXN0YXJ0XDAzMFwwMDEgXDAwMShcMDA1XDAyMlwwMTNcblwwMDNlbmRcMDMwXDAwMiBcMDAxIgotICAgICIoXDAwNVwiXDIyNFwwMDVcblwwMjRGaWVsZERlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoIgotICAgICJcdFwwMjJcMDE2XG5cMDA2bnVtYmVyXDAzMFwwMDMgXDAwMShcMDA1XDAyMjpcblwwMDVsYWJlbFwwMzBcMDA0IFwwMDEoXDAxNjIrLmdvb2dsIgotICAgICJlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsXDAyMjhcbiIKLSAgICAiXDAwNHR5cGVcMDMwXDAwNSBcMDAxKFwwMTYyKi5nb29nbGUucHJvdG9idWYuRmllbGREZXNjciIKLSAgICAiaXB0b3JQcm90by5UeXBlXDAyMlwwMjFcblx0dHlwZV9uYW1lXDAzMFwwMDYgXDAwMShcdFwwMjJcMDIwXG5cMDEwZXgiCi0gICAgInRlbmRlZVwwMzBcMDAyIFwwMDEoXHRcMDIyXDAyNVxuXHJkZWZhdWx0X3ZhbHVlXDAzMFwwMDcgXDAwMShcdFwwMjIuXG5cMDA3byIKLSAgICAicHRpb25zXDAzMFwwMTAgXDAwMShcMDEzMlwwMzUuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aSIKLSAgICAib25zXCJcMjY2XDAwMlxuXDAwNFR5cGVcMDIyXDAxN1xuXDAxM1RZUEVfRE9VQkxFXDAyMFwwMDFcMDIyXDAxNlxuXG5UWVBFX0ZMIgotICAgICJPQVRcMDIwXDAwMlwwMjJcMDE2XG5cblRZUEVfSU5UNjRcMDIwXDAwM1wwMjJcMDE3XG5cMDEzVFlQRV9VSU5UNjRcMDIwXDAwNFwwMjJcMDE2IgotICAgICJcblxuVFlQRV9JTlQzMlwwMjBcMDA1XDAyMlwwMjBcblwwMTRUWVBFX0ZJWEVENjRcMDIwXDAwNlwwMjJcMDIwXG5cMDE0VFlQRSIKLSAgICAiX0ZJWEVEMzJcMDIwXDAwN1wwMjJcclxuXHRUWVBFX0JPT0xcMDIwXDAxMFwwMjJcMDE3XG5cMDEzVFlQRV9TVFJJTkciCi0gICAgIlwwMjBcdFwwMjJcMDE2XG5cblRZUEVfR1JPVVBcMDIwXG5cMDIyXDAyMFxuXDAxNFRZUEVfTUVTU0FHRVwwMjBcMDEzXDAyMlwwMTZcblxuIgotICAgICJUWVBFX0JZVEVTXDAyMFwwMTRcMDIyXDAxN1xuXDAxM1RZUEVfVUlOVDMyXDAyMFxyXDAyMlxyXG5cdFRZUEVfRU4iCi0gICAgIlVNXDAyMFwwMTZcMDIyXDAyMVxuXHJUWVBFX1NGSVhFRDMyXDAyMFwwMTdcMDIyXDAyMVxuXHJUWVBFX1NGSVhFRDY0IgotICAgICJcMDIwXDAyMFwwMjJcMDE3XG5cMDEzVFlQRV9TSU5UMzJcMDIwXDAyMVwwMjJcMDE3XG5cMDEzVFlQRV9TSU5UNjRcMDIwXDAyMlwiQ1xuXDAwNSIKLSAgICAiTGFiZWxcMDIyXDAyMlxuXDAxNkxBQkVMX09QVElPTkFMXDAyMFwwMDFcMDIyXDAyMlxuXDAxNkxBQkVMX1JFUVVJIgotICAgICJSRURcMDIwXDAwMlwwMjJcMDIyXG5cMDE2TEFCRUxfUkVQRUFURURcMDIwXDAwM1wiXDIxNFwwMDFcblwwMjNFbnVtRGVzY3JpIgotICAgICJwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNG5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMjhcblwwMDV2YWx1ZVwwMzBcMDAyIFwwMDMoXDAxMzIpIgotICAgICIuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90IgotICAgICJvXDAyMi1cblwwMDdvcHRpb25zXDAzMFwwMDMgXDAwMShcMDEzMlwwMzQuZ29vZ2xlLnByb3RvYnVmLkVudSIKLSAgICAibU9wdGlvbnNcImxcblwwMzBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNCIKLSAgICAibmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyXDAxNlxuXDAwNm51bWJlclwwMzBcMDAyIFwwMDEoXDAwNVwwMjIyXG5cMDA3b3B0aW9uc1wwMzBcMDAzICIKLSAgICAiXDAwMShcMDEzMiEuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnNcIlwyMjAiCi0gICAgIlwwMDFcblwwMjZTZXJ2aWNlRGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjIiCi0gICAgIjZcblwwMDZtZXRob2RcMDMwXDAwMiBcMDAzKFwwMTMyJi5nb29nbGUucHJvdG9idWYuTWV0aG9kIgotICAgICJEZXNjcmlwdG9yUHJvdG9cMDIyMFxuXDAwN29wdGlvbnNcMDMwXDAwMyBcMDAxKFwwMTMyXDAzNy5nb29nbCIKLSAgICAiZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9uc1wiXDE3N1xuXDAyNU1ldGhvZERlc2NyIgotICAgICJpcHRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDIyXG5cbmlucHV0X3R5cGVcMDMwXDAwMiIKLSAgICAiIFwwMDEoXHRcMDIyXDAyM1xuXDAxM291dHB1dF90eXBlXDAzMFwwMDMgXDAwMShcdFwwMjIvXG5cMDA3b3B0aW9uc1wwMzBcMDA0IFwwMDEiCi0gICAgIihcMDEzMlwwMzYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnNcIlwzNzNcMDAzXG5cMDEzRiIKLSAgICAiaWxlT3B0aW9uc1wwMjJcMDI0XG5cMDE0amF2YV9wYWNrYWdlXDAzMFwwMDEgXDAwMShcdFwwMjJcMDM0XG5cMDI0amF2YSIKLSAgICAiX291dGVyX2NsYXNzbmFtZVwwMzBcMDEwIFwwMDEoXHRcMDIyXCJcblwwMjNqYXZhX211bHRpcGxlXyIKLSAgICAiZmlsZXNcMDMwXG4gXDAwMShcMDEwOlwwMDVmYWxzZVwwMjIkXG5cMDI1cmV0YWluX3Vua25vd25fZmllIgotICAgICJsZHNcMDMwXDAxMyBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMixcblwwMzVqYXZhX2dlbmVyYXRlX2VxdWFscyIKLSAgICAiX2FuZF9oYXNoXDAzMFwwMjQgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJGXG5cMDE0b3B0aW1pemVfZm9yXDAzMFx0IgotICAgICIgXDAwMShcMDE2MikuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLk9wdGltIgotICAgICJpemVNb2RlOlwwMDVTUEVFRFwwMjJcIlxuXDAyM2NjX2dlbmVyaWNfc2VydmljZXNcMDMwXDAyMCAiCi0gICAgIlwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyJFxuXDAyNWphdmFfZ2VuZXJpY19zZXJ2aWNlc1wwMzBcMDIxIFwwMDEoIgotICAgICJcMDEwOlwwMDVmYWxzZVwwMjJcIlxuXDAyM3B5X2dlbmVyaWNfc2VydmljZXNcMDMwXDAyMiBcMDAxKFwwMTA6XDAwNWYiCisgICAgIlwwMjItXG5cMDA3b3B0aW9uc1wwMzBcMDEwIFwwMDEoXDAxMzJcMDM0Lmdvb2dsZS5wcm90b2J1Zi5GaWxlIgorICAgICJPcHRpb25zXDAyMjlcblwwMjBzb3VyY2VfY29kZV9pbmZvXDAzMFx0IFwwMDEoXDAxMzJcMDM3Lmdvb2ciCisgICAgImxlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvXDAyMlwwMTZcblwwMDZzeW50YXhcMDMwXDAxNCBcMDAxIgorICAgICIoXHRcIlwzNjBcMDA0XG5cMDE3RGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjI0XG5cMDA1IgorICAgICJmaWVsZFwwMzBcMDAyIFwwMDMoXDAxMzIlLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyIgorICAgICJpcHRvclByb3RvXDAyMjhcblx0ZXh0ZW5zaW9uXDAzMFwwMDYgXDAwMyhcMDEzMiUuZ29vZ2xlLnAiCisgICAgInJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG9cMDIyNVxuXDAxM25lc3RlZF90IgorICAgICJ5cGVcMDMwXDAwMyBcMDAzKFwwMTMyIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByIgorICAgICJvdG9cMDIyN1xuXHRlbnVtX3R5cGVcMDMwXDAwNCBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYiCisgICAgIi5FbnVtRGVzY3JpcHRvclByb3RvXDAyMkhcblwwMTdleHRlbnNpb25fcmFuZ2VcMDMwIgorICAgICJcMDA1IFwwMDMoXDAxMzIvLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uIgorICAgICJFeHRlbnNpb25SYW5nZVwwMjI5XG5cbm9uZW9mX2RlY2xcMDMwXDAxMCBcMDAzKFwwMTMyJS5nb28iCisgICAgImdsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90b1wwMjIwXG5cMDA3b3B0IgorICAgICJpb25zXDAzMFwwMDcgXDAwMShcMDEzMlwwMzcuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpIgorICAgICJvbnNcMDIyRlxuXDAxNnJlc2VydmVkX3JhbmdlXDAzMFx0IFwwMDMoXDAxMzIuLmdvb2dsZS5wcm8iCisgICAgInRvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlXDAyMlwwMjVcblxyciIKKyAgICAiZXNlcnZlZF9uYW1lXDAzMFxuIFwwMDMoXHRcMDMyLFxuXDAxNkV4dGVuc2lvblJhbmdlXDAyMlxyXG5cMDA1IgorICAgICJzdGFydFwwMzBcMDAxIFwwMDEoXDAwNVwwMjJcMDEzXG5cMDAzZW5kXDAzMFwwMDIgXDAwMShcMDA1XDAzMitcblxyUmVzZXJ2ZWRSYW5nIgorICAgICJlXDAyMlxyXG5cMDA1c3RhcnRcMDMwXDAwMSBcMDAxKFwwMDVcMDIyXDAxM1xuXDAwM2VuZFwwMzBcMDAyIFwwMDEoXDAwNVwiXDI3NFwwMDVcblwwMjRGaWVsZEQiCisgICAgImVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDE2XG5cMDA2bnVtYmVyXDAzMFwwMDMiCisgICAgIiBcMDAxKFwwMDVcMDIyOlxuXDAwNWxhYmVsXDAzMFwwMDQgXDAwMShcMDE2MisuZ29vZ2xlLnByb3RvYnVmLkZpIgorICAgICJlbGREZXNjcmlwdG9yUHJvdG8uTGFiZWxcMDIyOFxuXDAwNHR5cGVcMDMwXDAwNSBcMDAxKFwwMTYyKiIKKyAgICAiLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeSIKKyAgICAicGVcMDIyXDAyMVxuXHR0eXBlX25hbWVcMDMwXDAwNiBcMDAxKFx0XDAyMlwwMjBcblwwMTBleHRlbmRlZVwwMzBcMDAyIFwwMDEoXHRcMDIyIgorICAgICJcMDI1XG5ccmRlZmF1bHRfdmFsdWVcMDMwXDAwNyBcMDAxKFx0XDAyMlwwMjNcblwwMTNvbmVvZl9pbmRleFwwMzBcdCAiCisgICAgIlwwMDEoXDAwNVwwMjJcMDIxXG5cdGpzb25fbmFtZVwwMzBcbiBcMDAxKFx0XDAyMi5cblwwMDdvcHRpb25zXDAzMFwwMTAgXDAwMShcMDEzMiIKKyAgICAiXDAzNS5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zXCJcMjY2XDAwMlxuXDAwNFR5cGVcMDIyIgorICAgICJcMDE3XG5cMDEzVFlQRV9ET1VCTEVcMDIwXDAwMVwwMjJcMDE2XG5cblRZUEVfRkxPQVRcMDIwXDAwMlwwMjJcMDE2XG5cblRZUEUiCisgICAgIl9JTlQ2NFwwMjBcMDAzXDAyMlwwMTdcblwwMTNUWVBFX1VJTlQ2NFwwMjBcMDA0XDAyMlwwMTZcblxuVFlQRV9JTlQzMlwwMjAiCisgICAgIlwwMDVcMDIyXDAyMFxuXDAxNFRZUEVfRklYRUQ2NFwwMjBcMDA2XDAyMlwwMjBcblwwMTRUWVBFX0ZJWEVEMzJcMDIwXDAwN1wwMjJcclxuIgorICAgICJcdFRZUEVfQk9PTFwwMjBcMDEwXDAyMlwwMTdcblwwMTNUWVBFX1NUUklOR1wwMjBcdFwwMjJcMDE2XG5cblRZUEVfR1IiCisgICAgIk9VUFwwMjBcblwwMjJcMDIwXG5cMDE0VFlQRV9NRVNTQUdFXDAyMFwwMTNcMDIyXDAxNlxuXG5UWVBFX0JZVEVTXDAyMFwwMTRcMDIyIgorICAgICJcMDE3XG5cMDEzVFlQRV9VSU5UMzJcMDIwXHJcMDIyXHJcblx0VFlQRV9FTlVNXDAyMFwwMTZcMDIyXDAyMVxuXHJUWVBFXyIKKyAgICAiU0ZJWEVEMzJcMDIwXDAxN1wwMjJcMDIxXG5cclRZUEVfU0ZJWEVENjRcMDIwXDAyMFwwMjJcMDE3XG5cMDEzVFlQRV9TSSIKKyAgICAiTlQzMlwwMjBcMDIxXDAyMlwwMTdcblwwMTNUWVBFX1NJTlQ2NFwwMjBcMDIyXCJDXG5cMDA1TGFiZWxcMDIyXDAyMlxuXDAxNkxBQkUiCisgICAgIkxfT1BUSU9OQUxcMDIwXDAwMVwwMjJcMDIyXG5cMDE2TEFCRUxfUkVRVUlSRURcMDIwXDAwMlwwMjJcMDIyXG5cMDE2TEFCRSIKKyAgICAiTF9SRVBFQVRFRFwwMjBcMDAzXCIkXG5cMDI0T25lb2ZEZXNjcmlwdG9yUHJvdG9cMDIyXDAxNFxuXDAwNCIKKyAgICAibmFtZVwwMzBcMDAxIFwwMDEoXHRcIlwyMTRcMDAxXG5cMDIzRW51bURlc2NyaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmEiCisgICAgIm1lXDAzMFwwMDEgXDAwMShcdFwwMjI4XG5cMDA1dmFsdWVcMDMwXDAwMiBcMDAzKFwwMTMyKS5nb29nbGUucHJvdG9idSIKKyAgICAiZi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG9cMDIyLVxuXDAwN29wdGlvbnNcMDMwXDAwMyAiCisgICAgIlwwMDEoXDAxMzJcMDM0Lmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9uc1wibFxuXDAzMEVudSIKKyAgICAibVZhbHVlRGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDRuYW1lXDAzMFwwMDEgXDAwMShcdFwwMjJcMDE2XG5cMDA2biIKKyAgICAidW1iZXJcMDMwXDAwMiBcMDAxKFwwMDVcMDIyMlxuXDAwN29wdGlvbnNcMDMwXDAwMyBcMDAxKFwwMTMyIS5nb29nbGUucHIiCisgICAgIm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zXCJcMjIwXDAwMVxuXDAyNlNlcnZpY2VEZXNjciIKKyAgICAiaXB0b3JQcm90b1wwMjJcMDE0XG5cMDA0bmFtZVwwMzBcMDAxIFwwMDEoXHRcMDIyNlxuXDAwNm1ldGhvZFwwMzBcMDAyIFwwMDMoXDAxMyIKKyAgICAiMiYuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90byIKKyAgICAiXDAyMjBcblwwMDdvcHRpb25zXDAzMFwwMDMgXDAwMShcMDEzMlwwMzcuZ29vZ2xlLnByb3RvYnVmLlNlcnYiCisgICAgImljZU9wdGlvbnNcIlwzMDFcMDAxXG5cMDI1TWV0aG9kRGVzY3JpcHRvclByb3RvXDAyMlwwMTRcblwwMDQiCisgICAgIm5hbWVcMDMwXDAwMSBcMDAxKFx0XDAyMlwwMjJcblxuaW5wdXRfdHlwZVwwMzBcMDAyIFwwMDEoXHRcMDIyXDAyM1xuXDAxM291dHB1dCIKKyAgICAiX3R5cGVcMDMwXDAwMyBcMDAxKFx0XDAyMi9cblwwMDdvcHRpb25zXDAzMFwwMDQgXDAwMShcMDEzMlwwMzYuZ29vZ2xlLnByIgorICAgICJvdG9idWYuTWV0aG9kT3B0aW9uc1wwMjJcMDM3XG5cMDIwY2xpZW50X3N0cmVhbWluZyIKKyAgICAiXDAzMFwwMDUgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJcMDM3XG5cMDIwc2VydmVyX3N0cmVhbWluZ1wwMzBcMDA2IFwwMDEoXDAxMDoiCisgICAgIlwwMDVmYWxzZVwiXDIwN1wwMDVcblwwMTNGaWxlT3B0aW9uc1wwMjJcMDI0XG5cMDE0amF2YV9wYWNrYWdlXDAzMFwwMDEiCisgICAgIiBcMDAxKFx0XDAyMlwwMzRcblwwMjRqYXZhX291dGVyX2NsYXNzbmFtZVwwMzBcMDEwIFwwMDEoXHRcMDIyXCJcblwwMjNqYSIKKyAgICAidmFfbXVsdGlwbGVfZmlsZXNcMDMwXG4gXDAwMShcMDEwOlwwMDVmYWxzZVwwMjIsXG5cMDM1amF2YV9nIgorICAgICJlbmVyYXRlX2VxdWFsc19hbmRfaGFzaFwwMzBcMDI0IFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyJVxuXDAyNiIKKyAgICAiamF2YV9zdHJpbmdfY2hlY2tfdXRmOFwwMzBcMDMzIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyRlxuXDAxNG8iCisgICAgInB0aW1pemVfZm9yXDAzMFx0IFwwMDEoXDAxNjIpLmdvb2dsZS5wcm90b2J1Zi5GaWxlIgorICAgICJPcHRpb25zLk9wdGltaXplTW9kZTpcMDA1U1BFRURcMDIyXDAyMlxuXG5nb19wYWNrYWciCisgICAgImVcMDMwXDAxMyBcMDAxKFx0XDAyMlwiXG5cMDIzY2NfZ2VuZXJpY19zZXJ2aWNlc1wwMzBcMDIwIFwwMDEoXDAxMDpcMDA1ZmEiCisgICAgImxzZVwwMjIkXG5cMDI1amF2YV9nZW5lcmljX3NlcnZpY2VzXDAzMFwwMjEgXDAwMShcMDEwOlwwMDVmYWxzIgorICAgICJlXDAyMlwiXG5cMDIzcHlfZ2VuZXJpY19zZXJ2aWNlc1wwMzBcMDIyIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXDAzMVxuIgorICAgICJcbmRlcHJlY2F0ZWRcMDMwXDAyNyBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMzdcblwwMjBjY19lbmFibGVfYXIiCisgICAgImVuYXNcMDMwXDAzNyBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMzFcblwwMjFvYmpjX2NsYXNzX3ByZWZpeFwwMzAkIgorICAgICIgXDAwMShcdFwwMjJcMDMwXG5cMDIwY3NoYXJwX25hbWVzcGFjZVwwMzAlIFwwMDEoXHRcMDIyQ1xuXDAyNHVuaW50ZSIKKyAgICAicnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLiIKKyAgICAiVW5pbnRlcnByZXRlZE9wdGlvblwiOlxuXDAxNE9wdGltaXplTW9kZVwwMjJcdFxuXDAwNVMiCisgICAgIlBFRURcMDIwXDAwMVwwMjJcclxuXHRDT0RFX1NJWkVcMDIwXDAwMlwwMjJcMDIwXG5cMDE0TElURV9SVU5USU1FXDAyMFwwMDMqIgorICAgICJcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMkpcMDA0XDAxMCZcMDIwXCdcIlwzNDZcMDAxXG5cMDE2TWVzc2FnZU9wdGlvbnNcMDIyJlxuXDAyN20iCisgICAgImVzc2FnZV9zZXRfd2lyZV9mb3JtYXRcMDMwXDAwMSBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMi5cblwwMzduIgorICAgICJvX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JcMDMwXDAwMiBcMDAxKFwwMTA6XDAwNWZhIgorICAgICJsc2VcMDIyXDAzMVxuXG5kZXByZWNhdGVkXDAzMFwwMDMgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJcMDIxXG5cdG1hcF9lbiIKKyAgICAidHJ5XDAzMFwwMDcgXDAwMShcMDEwXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMiCisgICAgIjIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0IgorICAgICJcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcIlwyMzBcMDAzXG5cMDE0RmllbGRPcHRpb25zXDAyMjpcblwwMDVjdHlwZVwwMzBcMDAxIFwwMDEoIgorICAgICJcMDE2MiMuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZTpcMDA2IgorICAgICJTVFJJTkdcMDIyXDAxNlxuXDAwNnBhY2tlZFwwMzBcMDAyIFwwMDEoXDAxMFwwMjJcP1xuXDAwNmpzdHlwZVwwMzBcMDA2IFwwMDEoXDAxNjIkIgorICAgICIuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGU6XHRKUyIKKyAgICAiX05PUk1BTFwwMjJcMDIzXG5cMDA0bGF6eVwwMzBcMDA1IFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyXDAzMVxuXG5kZXByZWNhdCIKKyAgICAiZWRcMDMwXDAwMyBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMlwwMjNcblwwMDR3ZWFrXDAzMFxuIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyQ1xuXDAyNCIKKyAgICAidW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnBybyIKKyAgICAidG9idWYuVW5pbnRlcnByZXRlZE9wdGlvblwiL1xuXDAwNUNUeXBlXDAyMlxuXG5cMDA2U1QiCisgICAgIlJJTkdcMDIwXDAwMFwwMjJcMDEwXG5cMDA0Q09SRFwwMjBcMDAxXDAyMlwwMjBcblwwMTRTVFJJTkdfUElFQ0VcMDIwXDAwMlwiNVxuXDAwNkpTIgorICAgICJUeXBlXDAyMlxyXG5cdEpTX05PUk1BTFwwMjBcMDAwXDAyMlxyXG5cdEpTX1NUUklOR1wwMjBcMDAxXDAyMlxyXG5cdEpTIgorICAgICJfTlVNQkVSXDAyMFwwMDIqXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcIlwyMTVcMDAxXG5cMDEzRW51bU9wdGlvbnNcMDIyXDAyM1xuXDAxMyIKKyAgICAiYWxsb3dfYWxpYXNcMDMwXDAwMiBcMDAxKFwwMTBcMDIyXDAzMVxuXG5kZXByZWNhdGVkXDAzMFwwMDMgXDAwMShcMDEwOlwwMDVmIgogICAgICJhbHNlXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nbyIKLSAgICAib2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCI6XG5cMDE0T3B0IgotICAgICJpbWl6ZU1vZGVcMDIyXHRcblwwMDVTUEVFRFwwMjBcMDAxXDAyMlxyXG5cdENPREVfU0laRVwwMjBcMDAyXDAyMlwwMjBcblwwMTRMIgotICAgICJJVEVfUlVOVElNRVwwMjBcMDAzKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJcMjcwXDAwMVxuXDAxNk1lc3NhZ2VPcHRpIgotICAgICJvbnNcMDIyJlxuXDAyN21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XDAzMFwwMDEgXDAwMShcMDEwOlwwMDVmYSIKLSAgICAibHNlXDAyMi5cblwwMzdub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXDAzMFwwMDIiCisgICAgIm9nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwIgorICAgICJcMjAwXDIwMFwyMDBcMDAyXCJ9XG5cMDIwRW51bVZhbHVlT3B0aW9uc1wwMjJcMDMxXG5cbmRlcHJlY2F0ZWRcMDMwXDAwMSIKICAgICAiIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0ZWRfb3B0aW9uXDAzMFwzNDdcMDA3IFwwMDMiCiAgICAgIihcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24iCi0gICAgIipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwiXDIyNFwwMDJcblwwMTRGaWVsZE9wdGlvbnNcMDIyOlxuXDAwNWN0eXBlXDAzMFwwMDEgIgotICAgICJcMDAxKFwwMTYyIy5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIgotICAgICI6XDAwNlNUUklOR1wwMjJcMDE2XG5cMDA2cGFja2VkXDAzMFwwMDIgXDAwMShcMDEwXDAyMlwwMzFcblxuZGVwcmVjYXRlZFwwMzBcMDAzIgotICAgICIgXDAwMShcMDEwOlwwMDVmYWxzZVwwMjJcMDM0XG5cMDI0ZXhwZXJpbWVudGFsX21hcF9rZXlcMDMwXHQgXDAwMSgiCi0gICAgIlx0XDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbCIKLSAgICAiZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uXCIvXG5cMDA1Q1R5cGVcMDIyIgotICAgICJcblxuXDAwNlNUUklOR1wwMjBcMDAwXDAyMlwwMTBcblwwMDRDT1JEXDAyMFwwMDFcMDIyXDAyMFxuXDAxNFNUUklOR19QSUVDRVwwMjBcMDAyKiIKLSAgICAiXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcIl1cblwwMTNFbnVtT3B0aW9uc1wwMjJDXG5cMDI0dW5pbnRlcnByZXQiCi0gICAgImVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYuVW5pbnQiCi0gICAgImVycHJldGVkT3B0aW9uKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJiXG5cMDIwRW51bVZhbHVlT3AiCi0gICAgInRpb25zXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nIgotICAgICJvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKlx0XDAxMFwzNTBcMDA3XDAyMCIKLSAgICAiXDIwMFwyMDBcMjAwXDIwMFwwMDJcImBcblwwMTZTZXJ2aWNlT3B0aW9uc1wwMjJDXG5cMDI0dW5pbnRlcnByZXRlZCIKLSAgICAiX29wdGlvblwwMzBcMzQ3XDAwNyBcMDAzKFwwMTMyJC5nb29nbGUucHJvdG9idWYuVW5pbnRlciIKLSAgICAicHJldGVkT3B0aW9uKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJfXG5cck1ldGhvZE9wdGlvbnMiCi0gICAgIlwwMjJDXG5cMDI0dW5pbnRlcnByZXRlZF9vcHRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlIgotICAgICIucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMiIKLSAgICAiXCJcMjM2XDAwMlxuXDAyM1VuaW50ZXJwcmV0ZWRPcHRpb25cMDIyO1xuXDAwNG5hbWVcMDMwXDAwMiBcMDAzKFwwMTMyLSIKLSAgICAiLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbSIKLSAgICAiZVBhcnRcMDIyXDAzMFxuXDAyMGlkZW50aWZpZXJfdmFsdWVcMDMwXDAwMyBcMDAxKFx0XDAyMlwwMzJcblwwMjJwb3NpdCIKLSAgICAiaXZlX2ludF92YWx1ZVwwMzBcMDA0IFwwMDEoXDAwNFwwMjJcMDMyXG5cMDIybmVnYXRpdmVfaW50X3ZhbHUiCi0gICAgImVcMDMwXDAwNSBcMDAxKFwwMDNcMDIyXDAyNFxuXDAxNGRvdWJsZV92YWx1ZVwwMzBcMDA2IFwwMDEoXDAwMVwwMjJcMDI0XG5cMDE0c3RyaW5nXyIKLSAgICAidmFsdWVcMDMwXDAwNyBcMDAxKFwwMTRcMDIyXDAyN1xuXDAxN2FnZ3JlZ2F0ZV92YWx1ZVwwMzBcMDEwIFwwMDEoXHRcMDMyM1xuXDAxMCIKLSAgICAiTmFtZVBhcnRcMDIyXDAyMVxuXHRuYW1lX3BhcnRcMDMwXDAwMSBcMDAyKFx0XDAyMlwwMjRcblwwMTRpc19leHRlbnMiCi0gICAgImlvblwwMzBcMDAyIFwwMDIoXDAxMFwifFxuXDAxNlNvdXJjZUNvZGVJbmZvXDAyMjpcblwwMTBsb2NhdGlvblwwMzAiCi0gICAgIlwwMDEgXDAwMyhcMDEzMiguZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkwiCi0gICAgIm9jYXRpb25cMDMyLlxuXDAxMExvY2F0aW9uXDAyMlwwMjBcblwwMDRwYXRoXDAzMFwwMDEgXDAwMyhcMDA1QlwwMDJcMDIwXDAwMVwwMjJcMDIwXG4iCi0gICAgIlwwMDRzcGFuXDAzMFwwMDIgXDAwMyhcMDA1QlwwMDJcMDIwXDAwMUIpXG5cMDIzY29tLmdvb2dsZS5wcm90b2J1ZkJcMDIwIgotICAgICJEZXNjcmlwdG9yUHJvdG9zSFwwMDEiLCAzOTc4KTsKKyAgICAiKlx0XDAxMFwzNTBcMDA3XDAyMFwyMDBcMjAwXDIwMFwyMDBcMDAyXCJ7XG5cMDE2U2VydmljZU9wdGlvbnNcMDIyXDAzMVxuXG5kZXByZWNhIgorICAgICJ0ZWRcMDMwISBcMDAxKFwwMTA6XDAwNWZhbHNlXDAyMkNcblwwMjR1bmludGVycHJldGVkX29wdGlvbiIKKyAgICAiXDAzMFwzNDdcMDA3IFwwMDMoXDAxMzIkLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkTyIKKyAgICAicHRpb24qXHRcMDEwXDM1MFwwMDdcMDIwXDIwMFwyMDBcMjAwXDIwMFwwMDJcInpcblxyTWV0aG9kT3B0aW9uc1wwMjJcMDMxXG5cbmRlcCIKKyAgICAicmVjYXRlZFwwMzAhIFwwMDEoXDAxMDpcMDA1ZmFsc2VcMDIyQ1xuXDAyNHVuaW50ZXJwcmV0ZWRfb3AiCisgICAgInRpb25cMDMwXDM0N1wwMDcgXDAwMyhcMDEzMiQuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmUiCisgICAgInRlZE9wdGlvbipcdFwwMTBcMzUwXDAwN1wwMjBcMjAwXDIwMFwyMDBcMjAwXDAwMlwiXDIzNlwwMDJcblwwMjNVbmludGVycHJldGVkT3AiCisgICAgInRpb25cMDIyO1xuXDAwNG5hbWVcMDMwXDAwMiBcMDAzKFwwMTMyLS5nb29nbGUucHJvdG9idWYuVW5pIgorICAgICJudGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0XDAyMlwwMzBcblwwMjBpZGVudGlmaWVyXyIKKyAgICAidmFsdWVcMDMwXDAwMyBcMDAxKFx0XDAyMlwwMzJcblwwMjJwb3NpdGl2ZV9pbnRfdmFsdWVcMDMwXDAwNCBcMDAxKFwwMDRcMDIyIgorICAgICJcMDMyXG5cMDIybmVnYXRpdmVfaW50X3ZhbHVlXDAzMFwwMDUgXDAwMShcMDAzXDAyMlwwMjRcblwwMTRkb3VibGVfdmEiCisgICAgImx1ZVwwMzBcMDA2IFwwMDEoXDAwMVwwMjJcMDI0XG5cMDE0c3RyaW5nX3ZhbHVlXDAzMFwwMDcgXDAwMShcMDE0XDAyMlwwMjdcblwwMTdhZ2dyZSIKKyAgICAiZ2F0ZV92YWx1ZVwwMzBcMDEwIFwwMDEoXHRcMDMyM1xuXDAxME5hbWVQYXJ0XDAyMlwwMjFcblx0bmFtZV9wYXIiCisgICAgInRcMDMwXDAwMSBcMDAyKFx0XDAyMlwwMjRcblwwMTRpc19leHRlbnNpb25cMDMwXDAwMiBcMDAyKFwwMTBcIlwzMjVcMDAxXG5cMDE2U291cmNlIgorICAgICJDb2RlSW5mb1wwMjI6XG5cMDEwbG9jYXRpb25cMDMwXDAwMSBcMDAzKFwwMTMyKC5nb29nbGUucHJvdCIKKyAgICAib2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvblwwMzJcMjA2XDAwMVxuXDAxMExvY2F0aW8iCisgICAgIm5cMDIyXDAyMFxuXDAwNHBhdGhcMDMwXDAwMSBcMDAzKFwwMDVCXDAwMlwwMjBcMDAxXDAyMlwwMjBcblwwMDRzcGFuXDAzMFwwMDIgXDAwMyhcMDA1QlwwMDJcMDIwXDAwMVwwMjJcMDMwXG4iCisgICAgIlwwMjBsZWFkaW5nX2NvbW1lbnRzXDAzMFwwMDMgXDAwMShcdFwwMjJcMDMxXG5cMDIxdHJhaWxpbmdfY29tbSIKKyAgICAiZW50c1wwMzBcMDA0IFwwMDEoXHRcMDIyIVxuXDAzMWxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNcMDMwIgorICAgICJcMDA2IFwwMDMoXHRcIlwyNDdcMDAxXG5cMDIxR2VuZXJhdGVkQ29kZUluZm9cMDIyQVxuXG5hbm5vdGF0aW8iCisgICAgIm5cMDMwXDAwMSBcMDAzKFwwMTMyLS5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUkiCisgICAgIm5mby5Bbm5vdGF0aW9uXDAzMk9cblxuQW5ub3RhdGlvblwwMjJcMDIwXG5cMDA0cGF0aFwwMzBcMDAxIFwwMDMiCisgICAgIihcMDA1QlwwMDJcMDIwXDAwMVwwMjJcMDIzXG5cMDEzc291cmNlX2ZpbGVcMDMwXDAwMiBcMDAxKFx0XDAyMlxyXG5cMDA1YmVnaW5cMDMwXDAwMyBcMDAxIgorICAgICIoXDAwNVwwMjJcMDEzXG5cMDAzZW5kXDAzMFwwMDQgXDAwMShcMDA1QlhcblwwMjNjb20uZ29vZ2xlLnByb3RvYnVmQlwwMjAiCisgICAgIkRlc2NyaXB0b3JQcm90b3NIXDAwMVpcbmRlc2NyaXB0b3JcMjQyXDAwMlwwMDNHUEJcMjUyXDAwMlwwMzJHIgorICAgICJvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uIiwgNTE0NSk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUZhY3Rvcnk6OkludGVybmFsUmVnaXN0ZXJHZW5lcmF0ZWRGaWxlKAogICAgICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIsICZwcm90b2J1Zl9SZWdpc3RlclR5cGVzKTsKICAgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEZpbGVEZXNjcmlwdG9yU2V0KCk7CiAgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG8oKTsKICAgRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBEZXNjcmlwdG9yUHJvdG8oKTsKICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKTsKKyAgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCk7CiAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBGaWVsZERlc2NyaXB0b3JQcm90bygpOworICBPbmVvZkRlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgT25lb2ZEZXNjcmlwdG9yUHJvdG8oKTsKICAgRW51bURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgRW51bURlc2NyaXB0b3JQcm90bygpOwogICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpOwogICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKCk7CkBAIC02NzcsMTEgKzgzNCwxNSBAQAogICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCk7CiAgIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXyA9IG5ldyBTb3VyY2VDb2RlSW5mbygpOwogICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBuZXcgU291cmNlQ29kZUluZm9fTG9jYXRpb24oKTsKKyAgR2VuZXJhdGVkQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEdlbmVyYXRlZENvZGVJbmZvKCk7CisgIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gbmV3IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24oKTsKICAgRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8tPkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIE9uZW9mRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKQEAgLTY5Nyw2ICs4NTgsOCBAQAogICBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIFNvdXJjZUNvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEdlbmVyYXRlZENvZGVJbmZvOjpkZWZhdWx0X2luc3RhbmNlXy0+SW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmRlZmF1bHRfaW5zdGFuY2VfLT5Jbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6T25TaHV0ZG93bigmcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKTsKIH0KIApAQCAtNzA3LDI0ICs4NzAsMzcgQEAKICAgfQogfSBzdGF0aWNfZGVzY3JpcHRvcl9pbml0aWFsaXplcl9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90b187CiAKK25hbWVzcGFjZSB7CisKK3N0YXRpYyB2b2lkIE1lcmdlRnJvbUZhaWwoaW50IGxpbmUpIEdPT0dMRV9BVFRSSUJVVEVfQ09MRDsKK3N0YXRpYyB2b2lkIE1lcmdlRnJvbUZhaWwoaW50IGxpbmUpIHsKKyAgR09PR0xFX0NIRUNLKGZhbHNlKSA8PCBfX0ZJTEVfXyA8PCAiOiIgPDwgbGluZTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IGludCBGaWxlRGVzY3JpcHRvclNldDo6a0ZpbGVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIEZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVzY3JpcHRvclNldCgpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQogfQogCiB2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIEZpbGVEZXNjcmlwdG9yU2V0OjpGaWxlRGVzY3JpcHRvclNldChjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNoYXJlZEN0b3IoKSB7CkBAIC03MzMsNiArOTA5LDcgQEAKIH0KIAogRmlsZURlc2NyaXB0b3JTZXQ6On5GaWxlRGVzY3JpcHRvclNldCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQogICBTaGFyZWREdG9yKCk7CiB9CiAKQEAgLTc1OCw4NSArOTM1LDEwOSBAQAogCiBGaWxlRGVzY3JpcHRvclNldCogRmlsZURlc2NyaXB0b3JTZXQ6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotRmlsZURlc2NyaXB0b3JTZXQqIEZpbGVEZXNjcmlwdG9yU2V0OjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgRmlsZURlc2NyaXB0b3JTZXQ7CitGaWxlRGVzY3JpcHRvclNldCogRmlsZURlc2NyaXB0b3JTZXQ6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBGaWxlRGVzY3JpcHRvclNldCogbiA9IG5ldyBGaWxlRGVzY3JpcHRvclNldDsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKICAgZmlsZV8uQ2xlYXIoKTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBGaWxlRGVzY3JpcHRvclNldDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9maWxlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF9maWxlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZmlsZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEwKSkgZ290byBwYXJzZV9maWxlOwotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxMCkpIGdvdG8gcGFyc2VfbG9vcF9maWxlOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZ290byBzdWNjZXNzOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCiAgIHJldHVybiB0cnVlOworZmFpbHVyZToKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQorICByZXR1cm4gZmFsc2U7CiAjdW5kZWYgRE9fCiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZSA9IDE7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmlsZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmZpbGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDEsIHRoaXMtPmZpbGUoaSksIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpbGVEZXNjcmlwdG9yU2V0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmZpbGVfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5maWxlX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDEsIHRoaXMtPmZpbGUoaSksIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKICAgcmV0dXJuIHRhcmdldDsKIH0KIAogaW50IEZpbGVEZXNjcmlwdG9yU2V0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCiAgIGludCB0b3RhbF9zaXplID0gMDsKLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOwogICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5maWxlX3NpemUoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5maWxlX3NpemUoKTsgaSsrKSB7CkBAIC04NDQsMTAgKzEwNDUsMTAgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+ZmlsZShpKSk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTg1Nyw1MCArMTA1OCw1OCBAQAogfQogCiB2b2lkIEZpbGVEZXNjcmlwdG9yU2V0OjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0KiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRmlsZURlc2NyaXB0b3JTZXQqPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3JTZXQqIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBGaWxlRGVzY3JpcHRvclNldD4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldCkKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6TWVyZ2VGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIGZpbGVfLk1lcmdlRnJvbShmcm9tLmZpbGVfKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBGaWxlRGVzY3JpcHRvclNldDo6Q29weUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgRmlsZURlc2NyaXB0b3JTZXQ6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIXRoaXMtPmZpbGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KKworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPmZpbGUoKSkpIHJldHVybiBmYWxzZTsKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OlN3YXAoRmlsZURlc2NyaXB0b3JTZXQqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgZmlsZV8uU3dhcCgmb3RoZXItPmZpbGVfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OkludGVybmFsU3dhcChGaWxlRGVzY3JpcHRvclNldCogb3RoZXIpIHsKKyAgZmlsZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZmlsZV8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWxlRGVzY3JpcHRvclNldDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC05MTEsMjQgKzExMjAsNjIgQEAKICAgcmV0dXJuIG1ldGFkYXRhOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBGaWxlRGVzY3JpcHRvclNldAorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZSA9IDE7CitpbnQgRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbGVfLnNpemUoKTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JTZXQ6OmNsZWFyX2ZpbGUoKSB7CisgIGZpbGVfLkNsZWFyKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yU2V0OjpmaWxlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQorICByZXR1cm4gZmlsZV8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JTZXQ6Om11dGFibGVfZmlsZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCisgIHJldHVybiBmaWxlXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JTZXQ6OmFkZF9maWxlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQorICByZXR1cm4gZmlsZV8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgorRmlsZURlc2NyaXB0b3JTZXQ6Om11dGFibGVfZmlsZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZSkKKyAgcmV0dXJuICZmaWxlXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvID4mCitGaWxlRGVzY3JpcHRvclNldDo6ZmlsZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCisgIHJldHVybiBmaWxlXzsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtQYWNrYWdlRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a0RlcGVuZGVuY3lGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlRGVzY3JpcHRvclByb3RvOjprUHVibGljRGVwZW5kZW5jeUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtXZWFrRGVwZW5kZW5jeUZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtNZXNzYWdlVHlwZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtFbnVtVHlwZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTZXJ2aWNlRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a0V4dGVuc2lvbkZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6a1NvdXJjZUNvZGVJbmZvRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgorY29uc3QgaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmtTeW50YXhGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogRmlsZURlc2NyaXB0b3JQcm90bzo6RmlsZURlc2NyaXB0b3JQcm90bygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewpAQCAtOTM3LDMxICsxMTg0LDMzIEBACiB9CiAKIEZpbGVEZXNjcmlwdG9yUHJvdG86OkZpbGVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKIH0KIAogdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gIHBhY2thZ2VfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBuYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHBhY2thZ2VfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgb3B0aW9uc18gPSBOVUxMOwogICBzb3VyY2VfY29kZV9pbmZvXyA9IE5VTEw7CisgIHN5bnRheF8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwogfQogCiBGaWxlRGVzY3JpcHRvclByb3RvOjp+RmlsZURlc2NyaXB0b3JQcm90bygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCiAgIFNoYXJlZER0b3IoKTsKIH0KIAogdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgewotICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBuYW1lXzsKLSAgfQotICBpZiAocGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBwYWNrYWdlXzsKLSAgfQorICBuYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBwYWNrYWdlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBzeW50YXhfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CiAgICAgZGVsZXRlIG9wdGlvbnNfOwogICAgIGRlbGV0ZSBzb3VyY2VfY29kZV9pbmZvXzsKQEAgLTk4NSwzODYgKzEyMzQsNTI2IEBACiAKIEZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotRmlsZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEZpbGVEZXNjcmlwdG9yUHJvdG87CitGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byogbiA9IG5ldyBGaWxlRGVzY3JpcHRvclByb3RvOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDN1KSB7CiAgICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgICAgIG5hbWVfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICAgIH0KICAgICBpZiAoaGFzX3BhY2thZ2UoKSkgewotICAgICAgaWYgKHBhY2thZ2VfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICAgICAgcGFja2FnZV8tPmNsZWFyKCk7Ci0gICAgICB9CisgICAgICBwYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQorICB9CisgIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAzNTg0dSkgewogICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CiAgICAgICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OkNsZWFyKCk7CiAgICAgfQotICB9Ci0gIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7CiAgICAgaWYgKGhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKICAgICAgIGlmIChzb3VyY2VfY29kZV9pbmZvXyAhPSBOVUxMKSBzb3VyY2VfY29kZV9pbmZvXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbzo6Q2xlYXIoKTsKICAgICB9CisgICAgaWYgKGhhc19zeW50YXgoKSkgeworICAgICAgc3ludGF4Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgICAgfQogICB9CiAgIGRlcGVuZGVuY3lfLkNsZWFyKCk7CisgIHB1YmxpY19kZXBlbmRlbmN5Xy5DbGVhcigpOworICB3ZWFrX2RlcGVuZGVuY3lfLkNsZWFyKCk7CiAgIG1lc3NhZ2VfdHlwZV8uQ2xlYXIoKTsKICAgZW51bV90eXBlXy5DbGVhcigpOwogICBzZXJ2aWNlXy5DbGVhcigpOwogICBleHRlbnNpb25fLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKKyAgICB0YWcgPSBwLmZpcnN0OworICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMCkgewogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfcGFja2FnZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAyOwogICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxOCkgewogICAgICAgICAgcGFyc2VfcGFja2FnZToKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfcGFja2FnZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPnBhY2thZ2UoKS5kYXRhKCksIHRoaXMtPnBhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX2RlcGVuZGVuY3k7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKICAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMjYpIHsKICAgICAgICAgIHBhcnNlX2RlcGVuZGVuY3k6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5hZGRfZGVwZW5kZW5jeSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPmRlcGVuZGVuY3kodGhpcy0+ZGVwZW5kZW5jeV9zaXplKCkgLSAxKS5kYXRhKCksCiAgICAgICAgICAgICB0aGlzLT5kZXBlbmRlbmN5KHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpIC0gMSkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5Iik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9kZXBlbmRlbmN5OwogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfbWVzc2FnZV90eXBlOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OwogICAgICAgY2FzZSA0OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAzNCkgewogICAgICAgICAgcGFyc2VfbWVzc2FnZV90eXBlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfbWVzc2FnZV90eXBlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbWVzc2FnZV90eXBlKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX21lc3NhZ2VfdHlwZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2VudW1fdHlwZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX2xvb3BfbWVzc2FnZV90eXBlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MikpIGdvdG8gcGFyc2VfbG9vcF9lbnVtX3R5cGU7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKICAgICAgIGNhc2UgNTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9lbnVtX3R5cGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgaWYgKHRhZyA9PSA0MikgeworICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX2VudW1fdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2VudW1fdHlwZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9lbnVtX3R5cGU7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9zZXJ2aWNlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MikpIGdvdG8gcGFyc2VfbG9vcF9lbnVtX3R5cGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9sb29wX3NlcnZpY2U7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7CiAgICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2Vfc2VydmljZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICBpZiAodGFnID09IDUwKSB7CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3Bfc2VydmljZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3NlcnZpY2UoKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg1MCkpIGdvdG8gcGFyc2Vfc2VydmljZTsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2V4dGVuc2lvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xvb3Bfc2VydmljZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OwogICAgICAgY2FzZSA3OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2V4dGVuc2lvbjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICBpZiAodGFnID09IDU4KSB7CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZXh0ZW5zaW9uKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2V4dGVuc2lvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CiAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDY2KSB7CiAgICAgICAgICBwYXJzZV9vcHRpb25zOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCiAgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzQpKSBnb3RvIHBhcnNlX3NvdXJjZV9jb2RlX2luZm87CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CiAgICAgICBjYXNlIDk6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDc0KSB7CiAgICAgICAgICBwYXJzZV9zb3VyY2VfY29kZV9pbmZvOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCiAgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODApKSBnb3RvIHBhcnNlX3B1YmxpY19kZXBlbmRlbmN5OwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAotICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworCisgICAgICAvLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOworICAgICAgY2FzZSAxMDogeworICAgICAgICBpZiAodGFnID09IDgwKSB7CisgICAgICAgICBwYXJzZV9wdWJsaWNfZGVwZW5kZW5jeToKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICAxLCA4MCwgaW5wdXQsIHRoaXMtPm11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSkpKTsKKyAgICAgICAgfSBlbHNlIGlmICh0YWcgPT0gODIpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wdWJsaWNfZGVwZW5kZW5jeSgpKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDgwKSkgZ290byBwYXJzZV9wdWJsaWNfZGVwZW5kZW5jeTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODgpKSBnb3RvIHBhcnNlX3dlYWtfZGVwZW5kZW5jeTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOworICAgICAgY2FzZSAxMTogeworICAgICAgICBpZiAodGFnID09IDg4KSB7CisgICAgICAgICBwYXJzZV93ZWFrX2RlcGVuZGVuY3k6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgMSwgODgsIGlucHV0LCB0aGlzLT5tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpKSkpOworICAgICAgICB9IGVsc2UgaWYgKHRhZyA9PSA5MCkgeworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODgpKSBnb3RvIHBhcnNlX3dlYWtfZGVwZW5kZW5jeTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoOTgpKSBnb3RvIHBhcnNlX3N5bnRheDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBzeW50YXggPSAxMjsKKyAgICAgIGNhc2UgMTI6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA5OCkgeworICAgICAgICAgcGFyc2Vfc3ludGF4OgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zeW50YXgoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgICAgICAgdGhpcy0+c3ludGF4KCkuZGF0YSgpLCB0aGlzLT5zeW50YXgoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIGdvdG8gc3VjY2VzczsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CiAgIGlmIChoYXNfcGFja2FnZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPnBhY2thZ2UoKS5kYXRhKCksIHRoaXMtPnBhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAyLCB0aGlzLT5wYWNrYWdlKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwogICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICB0aGlzLT5kZXBlbmRlbmN5KGkpLmRhdGEoKSwgdGhpcy0+ZGVwZW5kZW5jeShpKS5sZW5ndGgoKSwKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+ZGVwZW5kZW5jeShpKS5kYXRhKCksIHRoaXMtPmRlcGVuZGVuY3koaSkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSIpOwogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKICAgICAgIDMsIHRoaXMtPmRlcGVuZGVuY3koaSksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5tZXNzYWdlX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDQsIHRoaXMtPm1lc3NhZ2VfdHlwZShpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDUsIHRoaXMtPmVudW1fdHlwZShpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+c2VydmljZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDYsIHRoaXMtPnNlcnZpY2UoaSksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgNywgdGhpcy0+ZXh0ZW5zaW9uKGkpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgb3B0aW9ucyA9IDg7CiAgIGlmIChoYXNfb3B0aW9ucygpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDgsIHRoaXMtPm9wdGlvbnMoKSwgb3V0cHV0KTsKKyAgICAgIDgsICp0aGlzLT5vcHRpb25zXywgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OwogICBpZiAoaGFzX3NvdXJjZV9jb2RlX2luZm8oKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA5LCB0aGlzLT5zb3VyY2VfY29kZV9pbmZvKCksIG91dHB1dCk7CisgICAgICA5LCAqdGhpcy0+c291cmNlX2NvZGVfaW5mb18sIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKAorICAgICAgMTAsIHRoaXMtPnB1YmxpY19kZXBlbmRlbmN5KGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgd2Vha19kZXBlbmRlbmN5ID0gMTE7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+d2Vha19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoCisgICAgICAxMSwgdGhpcy0+d2Vha19kZXBlbmRlbmN5KGkpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOworICBpZiAoaGFzX3N5bnRheCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5zeW50YXgoKS5kYXRhKCksIHRoaXMtPnN5bnRheCgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgIDEyLCB0aGlzLT5zeW50YXgoKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpbGVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8pCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lIik7CiAgICAgdGFyZ2V0ID0KICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCiAgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CiAgIGlmIChoYXNfcGFja2FnZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPnBhY2thZ2UoKS5kYXRhKCksIHRoaXMtPnBhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICAyLCB0aGlzLT5wYWNrYWdlKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwogICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+ZGVwZW5kZW5jeShpKS5kYXRhKCksIHRoaXMtPmRlcGVuZGVuY3koaSkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kiKTsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZVN0cmluZ1RvQXJyYXkoMywgdGhpcy0+ZGVwZW5kZW5jeShpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPm1lc3NhZ2VfdHlwZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAogICAgICAgICA0LCB0aGlzLT5tZXNzYWdlX3R5cGUoaSksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZW51bV90eXBlX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDUsIHRoaXMtPmVudW1fdHlwZShpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+c2VydmljZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgNiwgdGhpcy0+c2VydmljZShpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDc7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDcsIHRoaXMtPmV4dGVuc2lvbihpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDgsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgICAgICAgOCwgKnRoaXMtPm9wdGlvbnNfLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CiAgIGlmIChoYXNfc291cmNlX2NvZGVfaW5mbygpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgOSwgdGhpcy0+c291cmNlX2NvZGVfaW5mbygpLCB0YXJnZXQpOworICAgICAgICA5LCAqdGhpcy0+c291cmNlX2NvZGVfaW5mb18sIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIC8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZUludDMyVG9BcnJheSgxMCwgdGhpcy0+cHVibGljX2RlcGVuZGVuY3koaSksIHRhcmdldCk7CisgIH0KKworICAvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT53ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZUludDMyVG9BcnJheSgxMSwgdGhpcy0+d2Vha19kZXBlbmRlbmN5KGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOworICBpZiAoaGFzX3N5bnRheCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5zeW50YXgoKS5kYXRhKCksIHRoaXMtPnN5bnRheCgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCIpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxMiwgdGhpcy0+c3ludGF4KCksIHRhcmdldCk7CisgIH0KKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKICAgcmV0dXJuIHRhcmdldDsKIH0KIAogaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAzdSkgewogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgICBpZiAoaGFzX25hbWUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+bmFtZSgpKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CiAgICAgaWYgKGhhc19wYWNrYWdlKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgICAgIHRoaXMtPnBhY2thZ2UoKSk7CiAgICAgfQotICAgIAorCisgIH0KKyAgaWYgKF9oYXNfYml0c19bOSAvIDMyXSAmIDM1ODR1KSB7CiAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKICAgICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgICAgICAgKnRoaXMtPm9wdGlvbnNfKTsKICAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKF9oYXNfYml0c19bOCAvIDMyXSAmICgweGZmdSA8PCAoOCAlIDMyKSkpIHsKKwogICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7CiAgICAgaWYgKGhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICB0aGlzLT5zb3VyY2VfY29kZV9pbmZvKCkpOworICAgICAgICAgICp0aGlzLT5zb3VyY2VfY29kZV9pbmZvXyk7CiAgICAgfQotICAgIAorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHN5bnRheCA9IDEyOworICAgIGlmIChoYXNfc3ludGF4KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPnN5bnRheCgpKTsKKyAgICB9CisKICAgfQogICAvLyByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmRlcGVuZGVuY3lfc2l6ZSgpOwpAQCAtMTM3Miw3ICsxNzYxLDI3IEBACiAgICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKICAgICAgIHRoaXMtPmRlcGVuZGVuY3koaSkpOwogICB9Ci0gIAorCisgIC8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CisgIHsKKyAgICBpbnQgZGF0YV9zaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnQzMlNpemUodGhpcy0+cHVibGljX2RlcGVuZGVuY3koaSkpOworICAgIH0KKyAgICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5wdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkgKyBkYXRhX3NpemU7CisgIH0KKworICAvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKKyAgeworICAgIGludCBkYXRhX3NpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+d2Vha19kZXBlbmRlbmN5X3NpemUoKTsgaSsrKSB7CisgICAgICBkYXRhX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgICBJbnQzMlNpemUodGhpcy0+d2Vha19kZXBlbmRlbmN5KGkpKTsKKyAgICB9CisgICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+d2Vha19kZXBlbmRlbmN5X3NpemUoKSArIGRhdGFfc2l6ZTsKKyAgfQorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPm1lc3NhZ2VfdHlwZV9zaXplKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bWVzc2FnZV90eXBlX3NpemUoKTsgaSsrKSB7CkBAIC0xMzgwLDcgKzE3ODksNyBAQAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAogICAgICAgICB0aGlzLT5tZXNzYWdlX3R5cGUoaSkpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OwogICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgewpAQCAtMTM4OCw3ICsxNzk3LDcgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+ZW51bV90eXBlKGkpKTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnNlcnZpY2Vfc2l6ZSgpOyBpKyspIHsKQEAgLTEzOTYsNyArMTgwNSw3IEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPnNlcnZpY2UoaSkpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5leHRlbnNpb25fc2l6ZSgpOyBpKyspIHsKQEAgLTE0MDQsMTAgKzE4MTMsMTAgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+ZXh0ZW5zaW9uKGkpKTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtMTQxNyw5MCArMTgyNiwxMDMgQEAKIH0KIAogdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvKj4oCi0gICAgICAmZnJvbSk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8+KAorICAgICAgICAgICZmcm9tKTsKICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgZGVwZW5kZW5jeV8uTWVyZ2VGcm9tKGZyb20uZGVwZW5kZW5jeV8pOworICBwdWJsaWNfZGVwZW5kZW5jeV8uTWVyZ2VGcm9tKGZyb20ucHVibGljX2RlcGVuZGVuY3lfKTsKKyAgd2Vha19kZXBlbmRlbmN5Xy5NZXJnZUZyb20oZnJvbS53ZWFrX2RlcGVuZGVuY3lfKTsKICAgbWVzc2FnZV90eXBlXy5NZXJnZUZyb20oZnJvbS5tZXNzYWdlX3R5cGVfKTsKICAgZW51bV90eXBlXy5NZXJnZUZyb20oZnJvbS5lbnVtX3R5cGVfKTsKICAgc2VydmljZV8uTWVyZ2VGcm9tKGZyb20uc2VydmljZV8pOwogICBleHRlbnNpb25fLk1lcmdlRnJvbShmcm9tLmV4dGVuc2lvbl8pOwogICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CiAgICAgaWYgKGZyb20uaGFzX25hbWUoKSkgewotICAgICAgc2V0X25hbWUoZnJvbS5uYW1lKCkpOworICAgICAgc2V0X2hhc19uYW1lKCk7CisgICAgICBuYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV8pOwogICAgIH0KICAgICBpZiAoZnJvbS5oYXNfcGFja2FnZSgpKSB7Ci0gICAgICBzZXRfcGFja2FnZShmcm9tLnBhY2thZ2UoKSk7CisgICAgICBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgICAgIHBhY2thZ2VfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5wYWNrYWdlXyk7CiAgICAgfQorICB9CisgIGlmIChmcm9tLl9oYXNfYml0c19bOSAvIDMyXSAmICgweGZmdSA8PCAoOSAlIDMyKSkpIHsKICAgICBpZiAoZnJvbS5oYXNfb3B0aW9ucygpKSB7CiAgICAgICBtdXRhYmxlX29wdGlvbnMoKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKICAgICB9Ci0gIH0KLSAgaWYgKGZyb20uX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpIHsKICAgICAgIG11dGFibGVfc291cmNlX2NvZGVfaW5mbygpLT46Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvOjpNZXJnZUZyb20oZnJvbS5zb3VyY2VfY29kZV9pbmZvKCkpOwogICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfc3ludGF4KCkpIHsKKyAgICAgIHNldF9oYXNfc3ludGF4KCk7CisgICAgICBzeW50YXhfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5zeW50YXhfKTsKKyAgICB9CiAgIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICBmb3IgKGludCBpID0gMDsgaSA8IG1lc3NhZ2VfdHlwZV9zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+bWVzc2FnZV90eXBlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT5lbnVtX3R5cGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBzZXJ2aWNlX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT5zZXJ2aWNlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT5leHRlbnNpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KKworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPm1lc3NhZ2VfdHlwZSgpKSkgcmV0dXJuIGZhbHNlOworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPmVudW1fdHlwZSgpKSkgcmV0dXJuIGZhbHNlOworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnNlcnZpY2UoKSkpIHJldHVybiBmYWxzZTsKKyAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT5leHRlbnNpb24oKSkpIHJldHVybiBmYWxzZTsKICAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpTd2FwKEZpbGVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOwotICAgIHN0ZDo6c3dhcChwYWNrYWdlXywgb3RoZXItPnBhY2thZ2VfKTsKLSAgICBkZXBlbmRlbmN5Xy5Td2FwKCZvdGhlci0+ZGVwZW5kZW5jeV8pOwotICAgIG1lc3NhZ2VfdHlwZV8uU3dhcCgmb3RoZXItPm1lc3NhZ2VfdHlwZV8pOwotICAgIGVudW1fdHlwZV8uU3dhcCgmb3RoZXItPmVudW1fdHlwZV8pOwotICAgIHNlcnZpY2VfLlN3YXAoJm90aGVyLT5zZXJ2aWNlXyk7Ci0gICAgZXh0ZW5zaW9uXy5Td2FwKCZvdGhlci0+ZXh0ZW5zaW9uXyk7Ci0gICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOwotICAgIHN0ZDo6c3dhcChzb3VyY2VfY29kZV9pbmZvXywgb3RoZXItPnNvdXJjZV9jb2RlX2luZm9fKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKEZpbGVEZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIG5hbWVfLlN3YXAoJm90aGVyLT5uYW1lXyk7CisgIHBhY2thZ2VfLlN3YXAoJm90aGVyLT5wYWNrYWdlXyk7CisgIGRlcGVuZGVuY3lfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmRlcGVuZGVuY3lfKTsKKyAgcHVibGljX2RlcGVuZGVuY3lfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnB1YmxpY19kZXBlbmRlbmN5Xyk7CisgIHdlYWtfZGVwZW5kZW5jeV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+d2Vha19kZXBlbmRlbmN5Xyk7CisgIG1lc3NhZ2VfdHlwZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+bWVzc2FnZV90eXBlXyk7CisgIGVudW1fdHlwZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZW51bV90eXBlXyk7CisgIHNlcnZpY2VfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnNlcnZpY2VfKTsKKyAgZXh0ZW5zaW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5leHRlbnNpb25fKTsKKyAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICBzdGQ6OnN3YXAoc291cmNlX2NvZGVfaW5mb18sIG90aGVyLT5zb3VyY2VfY29kZV9pbmZvXyk7CisgIHN5bnRheF8uU3dhcCgmb3RoZXItPnN5bnRheF8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWxlRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTE1MTEsMjYgKzE5MzMsNTE4IEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gRmlsZURlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Citib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9Cit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgY2xlYXJfaGFzX25hbWUoKTsKKyAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX25hbWUoKTsKKyAgfQorICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBwYWNrYWdlID0gMjsKK2Jvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX3BhY2thZ2UoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3BhY2thZ2UoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9Cit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcGFja2FnZSgpIHsKKyAgcGFja2FnZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfcGFja2FnZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVEZXNjcmlwdG9yUHJvdG86OnBhY2thZ2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKKyAgcmV0dXJuIHBhY2thZ2VfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9wYWNrYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfcGFja2FnZSgpOworICBwYWNrYWdlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19wYWNrYWdlKCk7CisgIHBhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCit9CisgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9wYWNrYWdlKCkgeworICBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKKyAgcmV0dXJuIHBhY2thZ2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9wYWNrYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQorICBjbGVhcl9oYXNfcGFja2FnZSgpOworICByZXR1cm4gcGFja2FnZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfcGFja2FnZSg6OnN0ZDo6c3RyaW5nKiBwYWNrYWdlKSB7CisgIGlmIChwYWNrYWdlICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX3BhY2thZ2UoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfcGFja2FnZSgpOworICB9CisgIHBhY2thZ2VfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBwYWNrYWdlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKK30KKworLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOworaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGRlcGVuZGVuY3lfLnNpemUoKTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZGVwZW5kZW5jeSgpIHsKKyAgZGVwZW5kZW5jeV8uQ2xlYXIoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCisgIHJldHVybiBkZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOworfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVwZW5kZW5jeShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKKyAgcmV0dXJuIGRlcGVuZGVuY3lfLk11dGFibGUoaW5kZXgpOworfQorIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCisgIGRlcGVuZGVuY3lfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworfQorIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKAorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKKyAgcmV0dXJuIGRlcGVuZGVuY3lfLkFkZCgpOworfQorIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2RlcGVuZGVuY3koY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgZGVwZW5kZW5jeV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKK30KKyB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGRlcGVuZGVuY3lfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKK30KKyB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBkZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorfQorIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mCitGaWxlRGVzY3JpcHRvclByb3RvOjpkZXBlbmRlbmN5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorICByZXR1cm4gZGVwZW5kZW5jeV87Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVwZW5kZW5jeSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQorICByZXR1cm4gJmRlcGVuZGVuY3lfOworfQorCisvLyByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOworaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7CisgIHJldHVybiBwdWJsaWNfZGVwZW5kZW5jeV8uc2l6ZSgpOworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9wdWJsaWNfZGVwZW5kZW5jeSgpIHsKKyAgcHVibGljX2RlcGVuZGVuY3lfLkNsZWFyKCk7Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWxlRGVzY3JpcHRvclByb3RvOjpwdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOworfQorIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3B1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwdWJsaWNfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfcHVibGljX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwdWJsaWNfZGVwZW5kZW5jeV8uQWRkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKK30KKyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5XzsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCisgIHJldHVybiAmcHVibGljX2RlcGVuZGVuY3lfOworfQorCisvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKK2ludCBGaWxlRGVzY3JpcHRvclByb3RvOjp3ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHdlYWtfZGVwZW5kZW5jeV8uc2l6ZSgpOworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl93ZWFrX2RlcGVuZGVuY3koKSB7CisgIHdlYWtfZGVwZW5kZW5jeV8uQ2xlYXIoKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEZpbGVEZXNjcmlwdG9yUHJvdG86OndlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCisgIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfLkdldChpbmRleCk7Cit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfd2Vha19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICB3ZWFrX2RlcGVuZGVuY3lfLlNldChpbmRleCwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLndlYWtfZGVwZW5kZW5jeSkKK30KKyB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF93ZWFrX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICB3ZWFrX2RlcGVuZGVuY3lfLkFkZCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQorfQorIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCisgIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQorICByZXR1cm4gJndlYWtfZGVwZW5kZW5jeV87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG1lc3NhZ2VfdHlwZSA9IDQ7CitpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBtZXNzYWdlX3R5cGVfLnNpemUoKTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbWVzc2FnZV90eXBlKCkgeworICBtZXNzYWdlX3R5cGVfLkNsZWFyKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSkKKyAgcmV0dXJuIG1lc3NhZ2VfdHlwZV8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQorICByZXR1cm4gbWVzc2FnZV90eXBlXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfbWVzc2FnZV90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm1lc3NhZ2VfdHlwZSkKKyAgcmV0dXJuIG1lc3NhZ2VfdHlwZV8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUpCisgIHJldHVybiAmbWVzc2FnZV90eXBlXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om1lc3NhZ2VfdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQorICByZXR1cm4gbWVzc2FnZV90eXBlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDU7CitpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBlbnVtX3R5cGVfLnNpemUoKTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZW51bV90eXBlKCkgeworICBlbnVtX3R5cGVfLkNsZWFyKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBlbnVtX3R5cGVfLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZW51bV90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKKyAgcmV0dXJuIGVudW1fdHlwZV8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgorRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gJmVudW1fdHlwZV87Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBlbnVtX3R5cGVfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7CitpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2VydmljZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gc2VydmljZV8uc2l6ZSgpOworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zZXJ2aWNlKCkgeworICBzZXJ2aWNlXy5DbGVhcigpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXJ2aWNlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCisgIHJldHVybiBzZXJ2aWNlXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3NlcnZpY2UoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCisgIHJldHVybiBzZXJ2aWNlXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3NlcnZpY2UoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc2VydmljZSkKKyAgcmV0dXJuIHNlcnZpY2VfLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc2VydmljZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlKQorICByZXR1cm4gJnNlcnZpY2VfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OnNlcnZpY2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCisgIHJldHVybiBzZXJ2aWNlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OworaW50IEZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uXy5zaXplKCk7Cit9Cit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2V4dGVuc2lvbigpIHsKKyAgZXh0ZW5zaW9uXy5DbGVhcigpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRmlsZURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKKyAgcmV0dXJuIGV4dGVuc2lvbl8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBleHRlbnNpb25fLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBleHRlbnNpb25fLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiAmZXh0ZW5zaW9uXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBleHRlbnNpb25fOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OworYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDIwMHUpICE9IDA7Cit9Cit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAyMDB1OworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zJiBGaWxlRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgc2V0X2hhc19vcHRpb25zKCk7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7CisgICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gb3B0aW9uc187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OworYm9vbCBGaWxlRGVzY3JpcHRvclByb3RvOjpoYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDQwMHUpICE9IDA7Cit9Cit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwNDAwdTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3NvdXJjZV9jb2RlX2luZm8oKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA0MDB1OworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zb3VyY2VfY29kZV9pbmZvKCkgeworICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7CisgIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzb3VyY2VfY29kZV9pbmZvKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCisgIHJldHVybiBzb3VyY2VfY29kZV9pbmZvXyAhPSBOVUxMID8gKnNvdXJjZV9jb2RlX2luZm9fIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5zb3VyY2VfY29kZV9pbmZvXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc291cmNlX2NvZGVfaW5mbygpIHsKKyAgc2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCk7CisgIGlmIChzb3VyY2VfY29kZV9pbmZvXyA9PSBOVUxMKSB7CisgICAgc291cmNlX2NvZGVfaW5mb18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbzsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQorICByZXR1cm4gc291cmNlX2NvZGVfaW5mb187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBGaWxlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3NvdXJjZV9jb2RlX2luZm8oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCisgIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHRlbXAgPSBzb3VyY2VfY29kZV9pbmZvXzsKKyAgc291cmNlX2NvZGVfaW5mb18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9zb3VyY2VfY29kZV9pbmZvKDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm8pIHsKKyAgZGVsZXRlIHNvdXJjZV9jb2RlX2luZm9fOworICBzb3VyY2VfY29kZV9pbmZvXyA9IHNvdXJjZV9jb2RlX2luZm87CisgIGlmIChzb3VyY2VfY29kZV9pbmZvKSB7CisgICAgc2V0X2hhc19zb3VyY2VfY29kZV9pbmZvKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7Citib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19zeW50YXgoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDA4MDB1KSAhPSAwOworfQordm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3N5bnRheCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwODAwdTsKK30KK3ZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3N5bnRheCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDgwMHU7Cit9Cit2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3N5bnRheCgpIHsKKyAgc3ludGF4Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19zeW50YXgoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzeW50YXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQorICByZXR1cm4gc3ludGF4Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfc3ludGF4KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfc3ludGF4KCk7CisgIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCit9Cisgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfc3ludGF4KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfc3ludGF4KCk7CisgIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKK30KKyB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9zeW50YXgoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfc3ludGF4KCk7CisgIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQorfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc3ludGF4KCkgeworICBzZXRfaGFzX3N5bnRheCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCisgIHJldHVybiBzeW50YXhfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9zeW50YXgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKKyAgY2xlYXJfaGFzX3N5bnRheCgpOworICByZXR1cm4gc3ludGF4Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9zeW50YXgoOjpzdGQ6OnN0cmluZyogc3ludGF4KSB7CisgIGlmIChzeW50YXggIT0gTlVMTCkgeworICAgIHNldF9oYXNfc3ludGF4KCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX3N5bnRheCgpOworICB9CisgIHN5bnRheF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHN5bnRheCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmtTdGFydEZpZWxkTnVtYmVyOwogY29uc3QgaW50IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6a0VuZEZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCiB9CiAKIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQogfQogCiB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6U2hhcmVkQ3RvcigpIHsKQEAgLTE1NDEsNiArMjQ1NSw3IEBACiB9CiAKIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6fkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKICAgU2hhcmVkRHRvcigpOwogfQogCkBAIC0xNTY2LDEzMCArMjQ4MSwxNjggQEAKIAogRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U7CitEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogbiA9IG5ldyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIHN0YXJ0XyA9IDA7Ci0gICAgZW5kXyA9IDA7Ci0gIH0KKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAorICBfX2J1aWx0aW5fb2Zmc2V0b2YoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlLCBmKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcG9wIikKKyNlbHNlCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oXAorICAmcmVpbnRlcnByZXRfY2FzdDxEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqPigxNiktPmYpCisjZW5kaWYKKworI2RlZmluZSBaUl8oZmlyc3QsIGxhc3QpIGRvIHtcCisgIDo6bWVtc2V0KCZmaXJzdCwgMCxcCisgICAgICAgICAgIFpSX0hFTFBFUl8obGFzdCkgLSBaUl9IRUxQRVJfKGZpcnN0KSArIHNpemVvZihsYXN0KSk7XAorfSB3aGlsZSAoMCkKKworICBaUl8oc3RhcnRfLCBlbmRfKTsKKworI3VuZGVmIFpSX0hFTFBFUl8KKyN1bmRlZiBaUl8KKwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQogfQogCiBib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CiAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gOCkgewogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAogICAgICAgICAgICAgICAgICBpbnB1dCwgJnN0YXJ0XykpKTsKICAgICAgICAgICBzZXRfaGFzX3N0YXJ0KCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9lbmQ7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTYpIHsKICAgICAgICAgIHBhcnNlX2VuZDoKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKICAgICAgICAgICAgICAgICAgaW5wdXQsICZlbmRfKSkpOwogICAgICAgICAgIHNldF9oYXNfZW5kKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQogICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQorICByZXR1cm4gZmFsc2U7CiAjdW5kZWYgRE9fCiB9CiAKIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCiAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKICAgaWYgKGhhc19zdGFydCgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMSwgdGhpcy0+c3RhcnQoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOwogICBpZiAoaGFzX2VuZCgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMiwgdGhpcy0+ZW5kKCksIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKICAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOwogICBpZiAoaGFzX3N0YXJ0KCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMSwgdGhpcy0+c3RhcnQoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOwogICBpZiAoaGFzX2VuZCgpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPmVuZCgpLCB0YXJnZXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAzdSkgewogICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKICAgICBpZiAoaGFzX3N0YXJ0KCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCiAgICAgICAgICAgdGhpcy0+c3RhcnQoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKICAgICBpZiAoaGFzX2VuZCgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAogICAgICAgICAgIHRoaXMtPmVuZCgpKTsKICAgICB9Ci0gICAgCisKICAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtMTY5OSwxOSArMjY1MiwyMyBAQAogfQogCiB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZT4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CiAgIH0gZWxzZSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6TWVyZ2VGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZSkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19zdGFydCgpKSB7CiAgICAgICBzZXRfc3RhcnQoZnJvbS5zdGFydCgpKTsKQEAgLTE3MjAsMzQgKzI2NzcsNDAgQEAKICAgICAgIHNldF9lbmQoZnJvbS5lbmQoKSk7CiAgICAgfQogICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKKwogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OlN3YXAoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChzdGFydF8sIG90aGVyLT5zdGFydF8pOwotICAgIHN0ZDo6c3dhcChlbmRfLCBvdGhlci0+ZW5kXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6SW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogb3RoZXIpIHsKKyAgc3RkOjpzd2FwKHN0YXJ0Xywgb3RoZXItPnN0YXJ0Xyk7CisgIHN0ZDo6c3dhcChlbmRfLCBvdGhlci0+ZW5kXyk7CisgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC0xNzYxLDE5ICsyNzI0LDMyMiBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorY29uc3QgaW50IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjprU3RhcnRGaWVsZE51bWJlcjsKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6a0VuZEZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorCitEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UoKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKKyAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK0Rlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6U2hhcmVkQ3RvcigpIHsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIHN0YXJ0XyA9IDA7CisgIGVuZF8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6fkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6U2hhcmVkRHRvcigpIHsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdCB7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSBzaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmRlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6ZGVmYXVsdF9pbnN0YW5jZSgpIHsKKyAgaWYgKGRlZmF1bHRfaW5zdGFuY2VfID09IE5VTEwpIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgcmV0dXJuICpkZWZhdWx0X2luc3RhbmNlXzsKK30KKworRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CisKK0Rlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBuID0gbmV3IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2ludmFsaWQtb2Zmc2V0b2ZcIiIpIFwKKyAgX19idWlsdGluX29mZnNldG9mKERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlLCBmKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcG9wIikKKyNlbHNlCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oXAorICAmcmVpbnRlcnByZXRfY2FzdDxEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSo+KDE2KS0+ZikKKyNlbmRpZgorCisjZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKKyAgOjptZW1zZXQoJmZpcnN0LCAwLFwKKyAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCit9IHdoaWxlICgwKQorCisgIFpSXyhzdGFydF8sIGVuZF8pOworCisjdW5kZWYgWlJfSEVMUEVSXworI3VuZGVmIFpSXworCisgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQorfQorCitib29sIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA4KSB7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmc3RhcnRfKSkpOworICAgICAgICAgIHNldF9oYXNfc3RhcnQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9lbmQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICh0YWcgPT0gMTYpIHsKKyAgICAgICAgIHBhcnNlX2VuZDoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZlbmRfKSkpOworICAgICAgICAgIHNldF9oYXNfZW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgZ290byBzdWNjZXNzOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIHJldHVybiBmYWxzZTsKKyN1bmRlZiBET18KK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgaWYgKGhhc19zdGFydCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMSwgdGhpcy0+c3RhcnQoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CisgIGlmIChoYXNfZW5kKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigyLCB0aGlzLT5lbmQoKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorfQorCis6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgaWYgKGhhc19zdGFydCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDEsIHRoaXMtPnN0YXJ0KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSAyOworICBpZiAoaGFzX2VuZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDIsIHRoaXMtPmVuZCgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAzdSkgeworICAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKKyAgICBpZiAoaGFzX3N0YXJ0KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCisgICAgICAgICAgdGhpcy0+c3RhcnQoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKKyAgICBpZiAoaGFzX2VuZCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAorICAgICAgICAgIHRoaXMtPmVuZCgpKTsKKyAgICB9CisKKyAgfQorICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZT4oCisgICAgICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSkKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6TWVyZ2VGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfc3RhcnQoKSkgeworICAgICAgc2V0X3N0YXJ0KGZyb20uc3RhcnQoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19lbmQoKSkgeworICAgICAgc2V0X2VuZChmcm9tLmVuZCgpKTsKKyAgICB9CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UpCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Q29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OlN3YXAoRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIG90aGVyKSB7CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpJbnRlcm5hbFN3YXAoRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIG90aGVyKSB7CisgIHN0ZDo6c3dhcChzdGFydF8sIG90aGVyLT5zdGFydF8pOworICBzdGQ6OnN3YXAoZW5kXywgb3RoZXItPmVuZF8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIG1ldGFkYXRhOworICBtZXRhZGF0YS5kZXNjcmlwdG9yID0gRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2VfZGVzY3JpcHRvcl87CisgIG1ldGFkYXRhLnJlZmxlY3Rpb24gPSBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZV9yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a0ZpZWxkRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprTmVzdGVkVHlwZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a0VudW1UeXBlRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRGVzY3JpcHRvclByb3RvOjprRXh0ZW5zaW9uUmFuZ2VGaWVsZE51bWJlcjsKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtPbmVvZkRlY2xGaWVsZE51bWJlcjsKIGNvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgorY29uc3QgaW50IERlc2NyaXB0b3JQcm90bzo6a1Jlc2VydmVkUmFuZ2VGaWVsZE51bWJlcjsKK2NvbnN0IGludCBEZXNjcmlwdG9yUHJvdG86OmtSZXNlcnZlZE5hbWVGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogRGVzY3JpcHRvclByb3RvOjpEZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCiB9CiAKIHZvaWQgRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CkBAIC0xNzgxLDI2ICszMDQ3LDI4IEBACiB9CiAKIERlc2NyaXB0b3JQcm90bzo6RGVzY3JpcHRvclByb3RvKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogfQogCiB2b2lkIERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKICAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBuYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIG9wdGlvbnNfID0gTlVMTDsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogRGVzY3JpcHRvclByb3RvOjp+RGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgewotICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBuYW1lXzsKLSAgfQorICBuYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewogICAgIGRlbGV0ZSBvcHRpb25zXzsKICAgfQpAQCAtMTgyMywxNiArMzA5MSwxOSBAQAogCiBEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwogCi1EZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IERlc2NyaXB0b3JQcm90bzsKK0Rlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IERlc2NyaXB0b3JQcm90bzsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIERlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgMTI5dSkgewogICAgIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9CiAgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKICAgICAgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9uczo6Q2xlYXIoKTsKQEAgLTE4NDMsMjY4ICszMTE0LDM5NCBAQAogICBuZXN0ZWRfdHlwZV8uQ2xlYXIoKTsKICAgZW51bV90eXBlXy5DbGVhcigpOwogICBleHRlbnNpb25fcmFuZ2VfLkNsZWFyKCk7CisgIG9uZW9mX2RlY2xfLkNsZWFyKCk7CisgIHJlc2VydmVkX3JhbmdlXy5DbGVhcigpOworICByZXNlcnZlZF9uYW1lXy5DbGVhcigpOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQogfQogCiBib29sIERlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CiAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDEwKSB7CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2ZpZWxkOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKICAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTgpIHsKICAgICAgICAgIHBhcnNlX2ZpZWxkOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfZmllbGQ6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCiAgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9maWVsZCgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9maWVsZDsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX25lc3RlZF90eXBlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfbG9vcF9maWVsZDsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjYpKSBnb3RvIHBhcnNlX2xvb3BfbmVzdGVkX3R5cGU7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CiAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfbmVzdGVkX3R5cGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgaWYgKHRhZyA9PSAyNikgeworICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX25lc3RlZF90eXBlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfbmVzdGVkX3R5cGUoKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfbmVzdGVkX3R5cGU7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDM0KSkgZ290byBwYXJzZV9lbnVtX3R5cGU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9sb29wX25lc3RlZF90eXBlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfbG9vcF9lbnVtX3R5cGU7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKICAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9lbnVtX3R5cGU6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgaWYgKHRhZyA9PSAzNCkgeworICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX2VudW1fdHlwZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2VudW1fdHlwZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDM0KSkgZ290byBwYXJzZV9lbnVtX3R5cGU7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9leHRlbnNpb25fcmFuZ2U7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDM0KSkgZ290byBwYXJzZV9sb29wX2VudW1fdHlwZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDIpKSBnb3RvIHBhcnNlX2xvb3BfZXh0ZW5zaW9uX3JhbmdlOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKICAgICAgIGNhc2UgNTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9leHRlbnNpb25fcmFuZ2U6Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgaWYgKHRhZyA9PSA0MikgeworICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX2V4dGVuc2lvbl9yYW5nZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2V4dGVuc2lvbl9yYW5nZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9leHRlbnNpb25fcmFuZ2U7Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDUwKSkgZ290byBwYXJzZV9leHRlbnNpb247CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDQyKSkgZ290byBwYXJzZV9sb29wX2V4dGVuc2lvbl9yYW5nZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OwogICAgICAgY2FzZSA2OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2V4dGVuc2lvbjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICBpZiAodGFnID09IDUwKSB7CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfZXh0ZW5zaW9uKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2V4dGVuc2lvbjsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xvb3BfZXh0ZW5zaW9uOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTgpKSBnb3RvIHBhcnNlX29wdGlvbnM7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CiAgICAgICBjYXNlIDc6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDU4KSB7CiAgICAgICAgICBwYXJzZV9vcHRpb25zOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCiAgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX29uZW9mX2RlY2w7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCi0gICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7CisgICAgICBjYXNlIDg6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA2NikgeworICAgICAgICAgcGFyc2Vfb25lb2ZfZGVjbDoKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF9vbmVvZl9kZWNsOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfb25lb2ZfZGVjbCgpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX2xvb3Bfb25lb2ZfZGVjbDsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzQpKSBnb3RvIHBhcnNlX2xvb3BfcmVzZXJ2ZWRfcmFuZ2U7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CisgICAgICBjYXNlIDk6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA3NCkgeworICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX3Jlc2VydmVkX3JhbmdlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAorICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfcmVzZXJ2ZWRfcmFuZ2UoKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzQpKSBnb3RvIHBhcnNlX2xvb3BfcmVzZXJ2ZWRfcmFuZ2U7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MikpIGdvdG8gcGFyc2VfcmVzZXJ2ZWRfbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIHJlcGVhdGVkIHN0cmluZyByZXNlcnZlZF9uYW1lID0gMTA7CisgICAgICBjYXNlIDEwOiB7CisgICAgICAgIGlmICh0YWcgPT0gODIpIHsKKyAgICAgICAgIHBhcnNlX3Jlc2VydmVkX25hbWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5hZGRfcmVzZXJ2ZWRfbmFtZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICAgICAgICB0aGlzLT5yZXNlcnZlZF9uYW1lKHRoaXMtPnJlc2VydmVkX25hbWVfc2l6ZSgpIC0gMSkuZGF0YSgpLAorICAgICAgICAgICAgdGhpcy0+cmVzZXJ2ZWRfbmFtZSh0aGlzLT5yZXNlcnZlZF9uYW1lX3NpemUoKSAtIDEpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MikpIGdvdG8gcGFyc2VfcmVzZXJ2ZWRfbmFtZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgICAgIGdvdG8gc3VjY2VzczsKKyAgICAgICAgfQorICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmllbGRfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5maWVsZF9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgMiwgdGhpcy0+ZmllbGQoaSksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbmVzdGVkX3R5cGUgPSAzOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm5lc3RlZF90eXBlX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDMsIHRoaXMtPm5lc3RlZF90eXBlKGkpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmVudW1fdHlwZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgNCwgdGhpcy0+ZW51bV90eXBlKGkpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCiAgICAgICA1LCB0aGlzLT5leHRlbnNpb25fcmFuZ2UoaSksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgNiwgdGhpcy0+ZXh0ZW5zaW9uKGkpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CiAgIGlmIChoYXNfb3B0aW9ucygpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKLSAgICAgIDcsIHRoaXMtPm9wdGlvbnMoKSwgb3V0cHV0KTsKKyAgICAgIDcsICp0aGlzLT5vcHRpb25zXywgb3V0cHV0KTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvIG9uZW9mX2RlY2wgPSA4OworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPm9uZW9mX2RlY2xfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDgsIHRoaXMtPm9uZW9mX2RlY2woaSksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlIHJlc2VydmVkX3JhbmdlID0gOTsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5yZXNlcnZlZF9yYW5nZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgOSwgdGhpcy0+cmVzZXJ2ZWRfcmFuZ2UoaSksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCBzdHJpbmcgcmVzZXJ2ZWRfbmFtZSA9IDEwOworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnJlc2VydmVkX25hbWVfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPnJlc2VydmVkX25hbWUoaSkuZGF0YSgpLCB0aGlzLT5yZXNlcnZlZF9uYW1lKGkpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDEwLCB0aGlzLT5yZXNlcnZlZF9uYW1lKGkpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICAxLCB0aGlzLT5uYW1lKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZmllbGRfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5maWVsZF9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAogICAgICAgICAyLCB0aGlzLT5maWVsZChpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5uZXN0ZWRfdHlwZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAogICAgICAgICAzLCB0aGlzLT5uZXN0ZWRfdHlwZShpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5lbnVtX3R5cGVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgNCwgdGhpcy0+ZW51bV90eXBlKGkpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDUsIHRoaXMtPmV4dGVuc2lvbl9yYW5nZShpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDYsIHRoaXMtPmV4dGVuc2lvbihpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDcsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgICAgICAgNywgKnRoaXMtPm9wdGlvbnNfLCB0YXJnZXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvIG9uZW9mX2RlY2wgPSA4OworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPm9uZW9mX2RlY2xfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICAgICAgOCwgdGhpcy0+b25lb2ZfZGVjbChpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA5OworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnJlc2VydmVkX3JhbmdlX3NpemUoKTsgaSA8IG47IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCisgICAgICAgIDksIHRoaXMtPnJlc2VydmVkX3JhbmdlKGkpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5yZXNlcnZlZF9uYW1lX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5yZXNlcnZlZF9uYW1lKGkpLmRhdGEoKSwgdGhpcy0+cmVzZXJ2ZWRfbmFtZShpKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUiKTsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZVN0cmluZ1RvQXJyYXkoMTAsIHRoaXMtPnJlc2VydmVkX25hbWUoaSksIHRhcmdldCk7CisgIH0KKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAxMjl1KSB7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICAgIGlmIChoYXNfbmFtZSgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKICAgICAgICAgICB0aGlzLT5uYW1lKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CiAgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICB0aGlzLT5vcHRpb25zKCkpOworICAgICAgICAgICp0aGlzLT5vcHRpb25zXyk7CiAgICAgfQotICAgIAorCiAgIH0KICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBmaWVsZCA9IDI7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmZpZWxkX3NpemUoKTsKQEAgLTIxMTMsNyArMzUxMCw3IEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPmZpZWxkKGkpKTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmV4dGVuc2lvbl9zaXplKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3NpemUoKTsgaSsrKSB7CkBAIC0yMTIxLDcgKzM1MTgsNyBAQAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAogICAgICAgICB0aGlzLT5leHRlbnNpb24oaSkpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKICAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+bmVzdGVkX3R5cGVfc2l6ZSgpOwogICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPm5lc3RlZF90eXBlX3NpemUoKTsgaSsrKSB7CkBAIC0yMTI5LDcgKzM1MjYsNyBAQAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAogICAgICAgICB0aGlzLT5uZXN0ZWRfdHlwZShpKSk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmVudW1fdHlwZV9zaXplKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZW51bV90eXBlX3NpemUoKTsgaSsrKSB7CkBAIC0yMTM3LDcgKzM1MzQsNyBAQAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAogICAgICAgICB0aGlzLT5lbnVtX3R5cGUoaSkpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmV4dGVuc2lvbl9yYW5nZV9zaXplKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKTsgaSsrKSB7CkBAIC0yMTQ1LDEwICszNTQyLDMzIEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPmV4dGVuc2lvbl9yYW5nZShpKSk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+b25lb2ZfZGVjbF9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+b25lb2ZfZGVjbF9zaXplKCk7IGkrKykgewogICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCisgICAgICAgIHRoaXMtPm9uZW9mX2RlY2woaSkpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CisgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPnJlc2VydmVkX3JhbmdlX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5yZXNlcnZlZF9yYW5nZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+cmVzZXJ2ZWRfcmFuZ2UoaSkpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+cmVzZXJ2ZWRfbmFtZV9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cmVzZXJ2ZWRfbmFtZV9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICB0aGlzLT5yZXNlcnZlZF9uYW1lKGkpKTsKKyAgfQorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTIxNTgsODAgKzM1NzgsODkgQEAKIH0KIAogdm9pZCBEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRGVzY3JpcHRvclByb3RvKj4oCi0gICAgICAmZnJvbSk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBEZXNjcmlwdG9yUHJvdG8+KAorICAgICAgICAgICZmcm9tKTsKICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIGZpZWxkXy5NZXJnZUZyb20oZnJvbS5maWVsZF8pOwogICBleHRlbnNpb25fLk1lcmdlRnJvbShmcm9tLmV4dGVuc2lvbl8pOwogICBuZXN0ZWRfdHlwZV8uTWVyZ2VGcm9tKGZyb20ubmVzdGVkX3R5cGVfKTsKICAgZW51bV90eXBlXy5NZXJnZUZyb20oZnJvbS5lbnVtX3R5cGVfKTsKICAgZXh0ZW5zaW9uX3JhbmdlXy5NZXJnZUZyb20oZnJvbS5leHRlbnNpb25fcmFuZ2VfKTsKKyAgb25lb2ZfZGVjbF8uTWVyZ2VGcm9tKGZyb20ub25lb2ZfZGVjbF8pOworICByZXNlcnZlZF9yYW5nZV8uTWVyZ2VGcm9tKGZyb20ucmVzZXJ2ZWRfcmFuZ2VfKTsKKyAgcmVzZXJ2ZWRfbmFtZV8uTWVyZ2VGcm9tKGZyb20ucmVzZXJ2ZWRfbmFtZV8pOwogICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CiAgICAgaWYgKGZyb20uaGFzX25hbWUoKSkgewotICAgICAgc2V0X25hbWUoZnJvbS5uYW1lKCkpOworICAgICAgc2V0X2hhc19uYW1lKCk7CisgICAgICBuYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV8pOwogICAgIH0KICAgICBpZiAoZnJvbS5oYXNfb3B0aW9ucygpKSB7CiAgICAgICBtdXRhYmxlX29wdGlvbnMoKS0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKICAgICB9CiAgIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90bykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBEZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT5maWVsZChpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQotICBmb3IgKGludCBpID0gMDsgaSA8IGV4dGVuc2lvbl9zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+ZXh0ZW5zaW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgbmVzdGVkX3R5cGVfc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIXRoaXMtPm5lc3RlZF90eXBlKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgZW51bV90eXBlX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT5lbnVtX3R5cGUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KKworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPmZpZWxkKCkpKSByZXR1cm4gZmFsc2U7CisgIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+ZXh0ZW5zaW9uKCkpKSByZXR1cm4gZmFsc2U7CisgIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+bmVzdGVkX3R5cGUoKSkpIHJldHVybiBmYWxzZTsKKyAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT5lbnVtX3R5cGUoKSkpIHJldHVybiBmYWxzZTsKICAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBEZXNjcmlwdG9yUHJvdG86OlN3YXAoRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKLSAgICBmaWVsZF8uU3dhcCgmb3RoZXItPmZpZWxkXyk7Ci0gICAgZXh0ZW5zaW9uXy5Td2FwKCZvdGhlci0+ZXh0ZW5zaW9uXyk7Ci0gICAgbmVzdGVkX3R5cGVfLlN3YXAoJm90aGVyLT5uZXN0ZWRfdHlwZV8pOwotICAgIGVudW1fdHlwZV8uU3dhcCgmb3RoZXItPmVudW1fdHlwZV8pOwotICAgIGV4dGVuc2lvbl9yYW5nZV8uU3dhcCgmb3RoZXItPmV4dGVuc2lvbl9yYW5nZV8pOwotICAgIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOworICBmaWVsZF8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZmllbGRfKTsKKyAgZXh0ZW5zaW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5leHRlbnNpb25fKTsKKyAgbmVzdGVkX3R5cGVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPm5lc3RlZF90eXBlXyk7CisgIGVudW1fdHlwZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZW51bV90eXBlXyk7CisgIGV4dGVuc2lvbl9yYW5nZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+ZXh0ZW5zaW9uX3JhbmdlXyk7CisgIG9uZW9mX2RlY2xfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPm9uZW9mX2RlY2xfKTsKKyAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICByZXNlcnZlZF9yYW5nZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+cmVzZXJ2ZWRfcmFuZ2VfKTsKKyAgcmVzZXJ2ZWRfbmFtZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+cmVzZXJ2ZWRfbmFtZV8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgewpAQCAtMjI0Miw2ICszNjcxLDQ3NyBAQAogICByZXR1cm4gbWV0YWRhdGE7CiB9CiAKKyNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZQorCisvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7Citib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6aGFzX3N0YXJ0KCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzZXRfaGFzX3N0YXJ0KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U6OmNsZWFyX2hhc19zdGFydCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfc3RhcnQoKSB7CisgIHN0YXJ0XyA9IDA7CisgIGNsZWFyX2hhc19zdGFydCgpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzdGFydCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLnN0YXJ0KQorICByZXR1cm4gc3RhcnRfOworfQorIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzZXRfc3RhcnQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX3N0YXJ0KCk7CisgIHN0YXJ0XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2Uuc3RhcnQpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7Citib29sIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6aGFzX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X2hhc19lbmQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfaGFzX2VuZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6Y2xlYXJfZW5kKCkgeworICBlbmRfID0gMDsKKyAgY2xlYXJfaGFzX2VuZCgpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjplbmQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5FeHRlbnNpb25SYW5nZS5lbmQpCisgIHJldHVybiBlbmRfOworfQorIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc2V0X2hhc19lbmQoKTsKKyAgZW5kXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UuZW5kKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlCisKKy8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKK2Jvb2wgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6Omhhc19zdGFydCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzZXRfaGFzX3N0YXJ0KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Y2xlYXJfaGFzX3N0YXJ0KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmNsZWFyX3N0YXJ0KCkgeworICBzdGFydF8gPSAwOworICBjbGVhcl9oYXNfc3RhcnQoKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzdGFydCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2Uuc3RhcnQpCisgIHJldHVybiBzdGFydF87Cit9Cisgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6c2V0X3N0YXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc2V0X2hhc19zdGFydCgpOworICBzdGFydF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2Uuc3RhcnQpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7Citib29sIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpoYXNfZW5kKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnNldF9oYXNfZW5kKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQordm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Y2xlYXJfaGFzX2VuZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpjbGVhcl9lbmQoKSB7CisgIGVuZF8gPSAwOworICBjbGVhcl9oYXNfZW5kKCk7Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6ZW5kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5lbmQpCisgIHJldHVybiBlbmRfOworfQorIHZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX2VuZCgpOworICBlbmRfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlLmVuZCkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworYm9vbCBEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCit9Cisgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgY2xlYXJfaGFzX25hbWUoKTsKKyAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKK2ludCBEZXNjcmlwdG9yUHJvdG86OmZpZWxkX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBmaWVsZF8uc2l6ZSgpOworfQordm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2ZpZWxkKCkgeworICBmaWVsZF8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6ZmllbGQoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5maWVsZCkKKyAgcmV0dXJuIGZpZWxkXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2ZpZWxkKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQorICByZXR1cm4gZmllbGRfLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfZmllbGQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5maWVsZCkKKyAgcmV0dXJuIGZpZWxkXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2ZpZWxkKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCisgIHJldHVybiAmZmllbGRfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCitEZXNjcmlwdG9yUHJvdG86OmZpZWxkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQorICByZXR1cm4gZmllbGRfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGV4dGVuc2lvbiA9IDY7CitpbnQgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGV4dGVuc2lvbl8uc2l6ZSgpOworfQordm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2V4dGVuc2lvbigpIHsKKyAgZXh0ZW5zaW9uXy5DbGVhcigpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBleHRlbnNpb25fLkdldChpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKKyAgcmV0dXJuIGV4dGVuc2lvbl8uTXV0YWJsZShpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9leHRlbnNpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBleHRlbnNpb25fLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCitEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gJmV4dGVuc2lvbl87Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKKyAgcmV0dXJuIGV4dGVuc2lvbl87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKK2ludCBEZXNjcmlwdG9yUHJvdG86Om5lc3RlZF90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBuZXN0ZWRfdHlwZV8uc2l6ZSgpOworfQordm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25lc3RlZF90eXBlKCkgeworICBuZXN0ZWRfdHlwZV8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86Om5lc3RlZF90eXBlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCisgIHJldHVybiBuZXN0ZWRfdHlwZV8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmVzdGVkX3R5cGUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCisgIHJldHVybiBuZXN0ZWRfdHlwZV8uTXV0YWJsZShpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfbmVzdGVkX3R5cGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKKyAgcmV0dXJuIG5lc3RlZF90eXBlXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uZXN0ZWRfdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5lc3RlZF90eXBlKQorICByZXR1cm4gJm5lc3RlZF90eXBlXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCisgIHJldHVybiBuZXN0ZWRfdHlwZV87Cit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA0OworaW50IERlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBlbnVtX3R5cGVfLnNpemUoKTsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9lbnVtX3R5cGUoKSB7CisgIGVudW1fdHlwZV8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCisgIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gZW51bV90eXBlXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfZW51bV90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gZW51bV90eXBlXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCitEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gJmVudW1fdHlwZV87Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgorRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gZW51bV90eXBlXzsKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UgZXh0ZW5zaW9uX3JhbmdlID0gNTsKK2ludCBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXy5zaXplKCk7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5zaW9uX3JhbmdlKCkgeworICBleHRlbnNpb25fcmFuZ2VfLkNsZWFyKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCisgIHJldHVybiBleHRlbnNpb25fcmFuZ2VfLkdldChpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCisgIHJldHVybiBleHRlbnNpb25fcmFuZ2VfLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbl9yYW5nZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZSkKKyAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4qCitEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQorICByZXR1cm4gJmV4dGVuc2lvbl9yYW5nZV87Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4mCitEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCisgIHJldHVybiBleHRlbnNpb25fcmFuZ2VfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvIG9uZW9mX2RlY2wgPSA4OworaW50IERlc2NyaXB0b3JQcm90bzo6b25lb2ZfZGVjbF9zaXplKCkgY29uc3QgeworICByZXR1cm4gb25lb2ZfZGVjbF8uc2l6ZSgpOworfQordm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX29uZW9mX2RlY2woKSB7CisgIG9uZW9mX2RlY2xfLkNsZWFyKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86Om9uZW9mX2RlY2woaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQorICByZXR1cm4gb25lb2ZfZGVjbF8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vbmVvZl9kZWNsKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCisgIHJldHVybiBvbmVvZl9kZWNsXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX29uZW9mX2RlY2woKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQorICByZXR1cm4gb25lb2ZfZGVjbF8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vbmVvZl9kZWNsKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKKyAgcmV0dXJuICZvbmVvZl9kZWNsXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+JgorRGVzY3JpcHRvclByb3RvOjpvbmVvZl9kZWNsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCisgIHJldHVybiBvbmVvZl9kZWNsXzsKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucyBvcHRpb25zID0gNzsKK2Jvb2wgRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Cit9Cit2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OworfQordm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zJiBEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgc2V0X2hhc19vcHRpb25zKCk7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7CisgICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBvcHRpb25zXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogb3B0aW9ucykgeworICBkZWxldGUgb3B0aW9uc187CisgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb3B0aW9ucygpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CitpbnQgRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9yYW5nZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gcmVzZXJ2ZWRfcmFuZ2VfLnNpemUoKTsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9yZXNlcnZlZF9yYW5nZSgpIHsKKyAgcmVzZXJ2ZWRfcmFuZ2VfLkNsZWFyKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX3JhbmdlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiByZXNlcnZlZF9yYW5nZV8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9yYW5nZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKKyAgcmV0dXJuIHJlc2VydmVkX3JhbmdlXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX3JhbmdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiByZXNlcnZlZF9yYW5nZV8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9yYW5nZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQorICByZXR1cm4gJnJlc2VydmVkX3JhbmdlXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSA+JgorRGVzY3JpcHRvclByb3RvOjpyZXNlcnZlZF9yYW5nZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKKyAgcmV0dXJuIHJlc2VydmVkX3JhbmdlXzsKK30KKworLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKK2ludCBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX25hbWVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlc2VydmVkX25hbWVfLnNpemUoKTsKK30KK3ZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9yZXNlcnZlZF9uYW1lKCkgeworICByZXNlcnZlZF9uYW1lXy5DbGVhcigpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIERlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiByZXNlcnZlZF9uYW1lXy5HZXQoaW5kZXgpOworfQorIDo6c3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9uYW1lKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiByZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KTsKK30KKyB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Cit9Cisgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgcmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9Cisgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHJlc2VydmVkX25hbWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV8uQWRkKCk7Cit9Cisgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHJlc2VydmVkX25hbWVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KKyB2b2lkIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgcmVzZXJ2ZWRfbmFtZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9Cisgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICByZXNlcnZlZF9uYW1lXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CisgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYKK0Rlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfbmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV87Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmV0dXJuICZyZXNlcnZlZF9uYW1lXzsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC0yMjc1LDcgKzQxNzUsNyBAQAogICB9CiB9CiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEU7CiBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZMT0FUOwogY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQ2NDsKQEAgLTIyOTcsNyArNDE5Nyw3IEBACiBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlX01JTjsKIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OlR5cGVfTUFYOwogY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjpUeXBlX0FSUkFZU0laRTsKLSNlbmRpZiAgLy8gX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKSB7CiAgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOwogICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfZGVzY3JpcHRvcl87CkBAIC0yMzEzLDE1ICs0MjEzLDE1IEBACiAgIH0KIH0KIAotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUw7CiBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQ7CiBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVQRUFURUQ7CiBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfTUlOOwogY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG86OkxhYmVsX01BWDsKIGNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TGFiZWxfQVJSQVlTSVpFOwotI2VuZGlmICAvLyBfTVNDX1ZFUgotI2lmbmRlZiBfTVNDX1ZFUgorI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtOdW1iZXJGaWVsZE51bWJlcjsKIGNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0xhYmVsRmllbGROdW1iZXI7CkBAIC0yMzI5LDEyICs0MjI5LDE1IEBACiBjb25zdCBpbnQgRmllbGREZXNjcmlwdG9yUHJvdG86OmtUeXBlTmFtZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprRXh0ZW5kZWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a0RlZmF1bHRWYWx1ZUZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprT25lb2ZJbmRleEZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpZWxkRGVzY3JpcHRvclByb3RvOjprSnNvbk5hbWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIEZpZWxkRGVzY3JpcHRvclByb3RvOjpGaWVsZERlc2NyaXB0b3JQcm90bygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQogfQogCiB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CkBAIC0yMzQyLDQxICs0MjQ1LDQwIEBACiB9CiAKIEZpZWxkRGVzY3JpcHRvclByb3RvOjpGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCiB9CiAKIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgbmFtZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBudW1iZXJfID0gMDsKICAgbGFiZWxfID0gMTsKICAgdHlwZV8gPSAxOwotICB0eXBlX25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICBleHRlbmRlZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gIGRlZmF1bHRfdmFsdWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICB0eXBlX25hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgZXh0ZW5kZWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgZGVmYXVsdF92YWx1ZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBvbmVvZl9pbmRleF8gPSAwOworICBqc29uX25hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgb3B0aW9uc18gPSBOVUxMOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwogfQogCiBGaWVsZERlc2NyaXB0b3JQcm90bzo6fkZpZWxkRGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCiAgIFNoYXJlZER0b3IoKTsKIH0KIAogdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgbmFtZV87Ci0gIH0KLSAgaWYgKHR5cGVfbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSB0eXBlX25hbWVfOwotICB9Ci0gIGlmIChleHRlbmRlZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBleHRlbmRlZV87Ci0gIH0KLSAgaWYgKGRlZmF1bHRfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgZGVmYXVsdF92YWx1ZV87Ci0gIH0KKyAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgdHlwZV9uYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBleHRlbmRlZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgZGVmYXVsdF92YWx1ZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAganNvbl9uYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewogICAgIGRlbGV0ZSBvcHRpb25zXzsKICAgfQpAQCAtMjM5OSwxMDIgKzQzMDEsMTA5IEBACiAKIEZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwogCi1GaWVsZERlc2NyaXB0b3JQcm90byogRmllbGREZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBGaWVsZERlc2NyaXB0b3JQcm90bzsKK0ZpZWxkRGVzY3JpcHRvclByb3RvKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IEZpZWxkRGVzY3JpcHRvclByb3RvOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgMjU1dSkgewogICAgIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9CiAgICAgbnVtYmVyXyA9IDA7CiAgICAgbGFiZWxfID0gMTsKICAgICB0eXBlXyA9IDE7CiAgICAgaWYgKGhhc190eXBlX25hbWUoKSkgewotICAgICAgaWYgKHR5cGVfbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICB0eXBlX25hbWVfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgdHlwZV9uYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICAgIGlmIChoYXNfZXh0ZW5kZWUoKSkgewotICAgICAgaWYgKGV4dGVuZGVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgICAgIGV4dGVuZGVlXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIGV4dGVuZGVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICAgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7Ci0gICAgICBpZiAoZGVmYXVsdF92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBkZWZhdWx0X3ZhbHVlXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIGRlZmF1bHRfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgICB9CisgICAgb25lb2ZfaW5kZXhfID0gMDsKKyAgfQorICBpZiAoX2hhc19iaXRzX1s4IC8gMzJdICYgNzY4dSkgeworICAgIGlmIChoYXNfanNvbl9uYW1lKCkpIHsKKyAgICAgIGpzb25fbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICAgIH0KICAgICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczo6Q2xlYXIoKTsKICAgICB9CiAgIH0KICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9leHRlbmRlZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKICAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTgpIHsKICAgICAgICAgIHBhcnNlX2V4dGVuZGVlOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9leHRlbmRlZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPmV4dGVuZGVlKCkuZGF0YSgpLCB0aGlzLT5leHRlbmRlZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9udW1iZXI7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CiAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMjQpIHsKICAgICAgICAgIHBhcnNlX251bWJlcjoKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKICAgICAgICAgICAgICAgICAgaW5wdXQsICZudW1iZXJfKSkpOwogICAgICAgICAgIHNldF9oYXNfbnVtYmVyKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDMyKSkgZ290byBwYXJzZV9sYWJlbDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7CiAgICAgICBjYXNlIDQ6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMzIpIHsKICAgICAgICAgIHBhcnNlX2xhYmVsOgogICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPApAQCAtMjUwNiwxNiArNDQxNSwxNSBAQAogICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoNCwgdmFsdWUpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDApKSBnb3RvIHBhcnNlX3R5cGU7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKICAgICAgIGNhc2UgNTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSA0MCkgewogICAgICAgICAgcGFyc2VfdHlwZToKICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKQEAgLTI1MjcsMjc3ICs0NDM1LDM3NSBAQAogICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoNSwgdmFsdWUpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX3R5cGVfbmFtZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7CiAgICAgICBjYXNlIDY6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDUwKSB7CiAgICAgICAgICBwYXJzZV90eXBlX25hbWU6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX3R5cGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPnR5cGVfbmFtZSgpLmRhdGEoKSwgdGhpcy0+dHlwZV9uYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9kZWZhdWx0X3ZhbHVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CiAgICAgICBjYXNlIDc6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDU4KSB7CiAgICAgICAgICBwYXJzZV9kZWZhdWx0X3ZhbHVlOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX29wdGlvbnM7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwogICAgICAgY2FzZSA4OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSA2NikgewogICAgICAgICAgcGFyc2Vfb3B0aW9uczoKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAogICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfb3B0aW9ucygpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDcyKSkgZ290byBwYXJzZV9vbmVvZl9pbmRleDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OworICAgICAgY2FzZSA5OiB7CisgICAgICAgIGlmICh0YWcgPT0gNzIpIHsKKyAgICAgICAgIHBhcnNlX29uZW9mX2luZGV4OgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJm9uZW9mX2luZGV4XykpKTsKKyAgICAgICAgICBzZXRfaGFzX29uZW9mX2luZGV4KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODIpKSBnb3RvIHBhcnNlX2pzb25fbmFtZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgICAgIGNhc2UgMTA6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA4MikgeworICAgICAgICAgcGFyc2VfanNvbl9uYW1lOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9qc29uX25hbWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgICAgICAgdGhpcy0+anNvbl9uYW1lKCkuZGF0YSgpLCB0aGlzLT5qc29uX25hbWUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOwogICBpZiAoaGFzX2V4dGVuZGVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+ZXh0ZW5kZWUoKS5kYXRhKCksIHRoaXMtPmV4dGVuZGVlKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAyLCB0aGlzLT5leHRlbmRlZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CiAgIGlmIChoYXNfbnVtYmVyKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMigzLCB0aGlzLT5udW1iZXIoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKICAgaWYgKGhhc19sYWJlbCgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKICAgICAgIDQsIHRoaXMtPmxhYmVsKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OwogICBpZiAoaGFzX3R5cGUoKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW0oCiAgICAgICA1LCB0aGlzLT50eXBlKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7CiAgIGlmIChoYXNfdHlwZV9uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+dHlwZV9uYW1lKCkuZGF0YSgpLCB0aGlzLT50eXBlX25hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICA2LCB0aGlzLT50eXBlX25hbWUoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7CiAgIGlmIChoYXNfZGVmYXVsdF92YWx1ZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPmRlZmF1bHRfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmRlZmF1bHRfdmFsdWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAogICAgICAgNywgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICA4LCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgICAgICA4LCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgLy8gb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OworICBpZiAoaGFzX29uZW9mX2luZGV4KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMig5LCB0aGlzLT5vbmVvZl9pbmRleCgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGpzb25fbmFtZSA9IDEwOworICBpZiAoaGFzX2pzb25fbmFtZSgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5qc29uX25hbWUoKS5kYXRhKCksIHRoaXMtPmpzb25fbmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAxMCwgdGhpcy0+anNvbl9uYW1lKCksIG91dHB1dCk7CisgIH0KKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRmllbGREZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQogICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CiAgIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKICAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBleHRlbmRlZSA9IDI7CiAgIGlmIChoYXNfZXh0ZW5kZWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5leHRlbmRlZSgpLmRhdGEoKSwgdGhpcy0+ZXh0ZW5kZWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlIik7CiAgICAgdGFyZ2V0ID0KICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCiAgICAgICAgIDIsIHRoaXMtPmV4dGVuZGVlKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMzsKICAgaWYgKGhhc19udW1iZXIoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyVG9BcnJheSgzLCB0aGlzLT5udW1iZXIoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKICAgaWYgKGhhc19sYWJlbCgpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCiAgICAgICA0LCB0aGlzLT5sYWJlbCgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKICAgaWYgKGhhc190eXBlKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKICAgICAgIDUsIHRoaXMtPnR5cGUoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKICAgaWYgKGhhc190eXBlX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT50eXBlX25hbWUoKS5kYXRhKCksIHRoaXMtPnR5cGVfbmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lIik7CiAgICAgdGFyZ2V0ID0KICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCiAgICAgICAgIDYsIHRoaXMtPnR5cGVfbmFtZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKICAgaWYgKGhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICA3LCB0aGlzLT5kZWZhdWx0X3ZhbHVlKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7CiAgIGlmIChoYXNfb3B0aW9ucygpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgOCwgdGhpcy0+b3B0aW9ucygpLCB0YXJnZXQpOworICAgICAgICA4LCAqdGhpcy0+b3B0aW9uc18sIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIC8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKKyAgaWYgKGhhc19vbmVvZl9pbmRleCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDksIHRoaXMtPm9uZW9mX2luZGV4KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7CisgIGlmIChoYXNfanNvbl9uYW1lKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmpzb25fbmFtZSgpLmRhdGEoKSwgdGhpcy0+anNvbl9uYW1lKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSIpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxMCwgdGhpcy0+anNvbl9uYW1lKCksIHRhcmdldCk7CisgIH0KKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCiAgIHJldHVybiB0YXJnZXQ7CiB9CiAKIGludCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAyNTV1KSB7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICAgIGlmIChoYXNfbmFtZSgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKICAgICAgICAgICB0aGlzLT5uYW1lKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CiAgICAgaWYgKGhhc19udW1iZXIoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKICAgICAgICAgICB0aGlzLT5udW1iZXIoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5MYWJlbCBsYWJlbCA9IDQ7CiAgICAgaWYgKGhhc19sYWJlbCgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+bGFiZWwoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5UeXBlIHR5cGUgPSA1OwogICAgIGlmIChoYXNfdHlwZSgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+dHlwZSgpKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKICAgICBpZiAoaGFzX3R5cGVfbmFtZSgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKICAgICAgICAgICB0aGlzLT50eXBlX25hbWUoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKICAgICBpZiAoaGFzX2V4dGVuZGVlKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgICAgIHRoaXMtPmV4dGVuZGVlKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKICAgICBpZiAoaGFzX2RlZmF1bHRfdmFsdWUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+ZGVmYXVsdF92YWx1ZSgpKTsKICAgICB9Ci0gICAgCisKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBvbmVvZl9pbmRleCA9IDk7CisgICAgaWYgKGhhc19vbmVvZl9pbmRleCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKAorICAgICAgICAgIHRoaXMtPm9uZW9mX2luZGV4KCkpOworICAgIH0KKworICB9CisgIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiA3Njh1KSB7CisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGpzb25fbmFtZSA9IDEwOworICAgIGlmIChoYXNfanNvbl9uYW1lKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmpzb25fbmFtZSgpKTsKKyAgICB9CisKICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyBvcHRpb25zID0gODsKICAgICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgICAgICAgKnRoaXMtPm9wdGlvbnNfKTsKICAgICB9Ci0gICAgCisKICAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtMjgwNywyMiArNDgxMywyNyBAQAogfQogCiB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8qPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90bz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90bykKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKICAgICBpZiAoZnJvbS5oYXNfbmFtZSgpKSB7Ci0gICAgICBzZXRfbmFtZShmcm9tLm5hbWUoKSk7CisgICAgICBzZXRfaGFzX25hbWUoKTsKKyAgICAgIG5hbWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5uYW1lXyk7CiAgICAgfQogICAgIGlmIChmcm9tLmhhc19udW1iZXIoKSkgewogICAgICAgc2V0X251bWJlcihmcm9tLm51bWJlcigpKTsKQEAgLTI4MzQsNTUgKzQ4NDUsNzUgQEAKICAgICAgIHNldF90eXBlKGZyb20udHlwZSgpKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX3R5cGVfbmFtZSgpKSB7Ci0gICAgICBzZXRfdHlwZV9uYW1lKGZyb20udHlwZV9uYW1lKCkpOworICAgICAgc2V0X2hhc190eXBlX25hbWUoKTsKKyAgICAgIHR5cGVfbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLnR5cGVfbmFtZV8pOwogICAgIH0KICAgICBpZiAoZnJvbS5oYXNfZXh0ZW5kZWUoKSkgewotICAgICAgc2V0X2V4dGVuZGVlKGZyb20uZXh0ZW5kZWUoKSk7CisgICAgICBzZXRfaGFzX2V4dGVuZGVlKCk7CisgICAgICBleHRlbmRlZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmV4dGVuZGVlXyk7CiAgICAgfQogICAgIGlmIChmcm9tLmhhc19kZWZhdWx0X3ZhbHVlKCkpIHsKLSAgICAgIHNldF9kZWZhdWx0X3ZhbHVlKGZyb20uZGVmYXVsdF92YWx1ZSgpKTsKKyAgICAgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICAgICAgZGVmYXVsdF92YWx1ZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmRlZmF1bHRfdmFsdWVfKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX29uZW9mX2luZGV4KCkpIHsKKyAgICAgIHNldF9vbmVvZl9pbmRleChmcm9tLm9uZW9mX2luZGV4KCkpOworICAgIH0KKyAgfQorICBpZiAoZnJvbS5faGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2pzb25fbmFtZSgpKSB7CisgICAgICBzZXRfaGFzX2pzb25fbmFtZSgpOworICAgICAganNvbl9uYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uanNvbl9uYW1lXyk7CiAgICAgfQogICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKICAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKICAgICB9CiAgIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAorCiAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgaWYgKCF0aGlzLT5vcHRpb25zKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF0aGlzLT5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OlN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKG5hbWVfLCBvdGhlci0+bmFtZV8pOwotICAgIHN0ZDo6c3dhcChudW1iZXJfLCBvdGhlci0+bnVtYmVyXyk7Ci0gICAgc3RkOjpzd2FwKGxhYmVsXywgb3RoZXItPmxhYmVsXyk7Ci0gICAgc3RkOjpzd2FwKHR5cGVfLCBvdGhlci0+dHlwZV8pOwotICAgIHN0ZDo6c3dhcCh0eXBlX25hbWVfLCBvdGhlci0+dHlwZV9uYW1lXyk7Ci0gICAgc3RkOjpzd2FwKGV4dGVuZGVlXywgb3RoZXItPmV4dGVuZGVlXyk7Ci0gICAgc3RkOjpzd2FwKGRlZmF1bHRfdmFsdWVfLCBvdGhlci0+ZGVmYXVsdF92YWx1ZV8pOwotICAgIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChGaWVsZERlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgbmFtZV8uU3dhcCgmb3RoZXItPm5hbWVfKTsKKyAgc3RkOjpzd2FwKG51bWJlcl8sIG90aGVyLT5udW1iZXJfKTsKKyAgc3RkOjpzd2FwKGxhYmVsXywgb3RoZXItPmxhYmVsXyk7CisgIHN0ZDo6c3dhcCh0eXBlXywgb3RoZXItPnR5cGVfKTsKKyAgdHlwZV9uYW1lXy5Td2FwKCZvdGhlci0+dHlwZV9uYW1lXyk7CisgIGV4dGVuZGVlXy5Td2FwKCZvdGhlci0+ZXh0ZW5kZWVfKTsKKyAgZGVmYXVsdF92YWx1ZV8uU3dhcCgmb3RoZXItPmRlZmF1bHRfdmFsdWVfKTsKKyAgc3RkOjpzd2FwKG9uZW9mX2luZGV4Xywgb3RoZXItPm9uZW9mX2luZGV4Xyk7CisgIGpzb25fbmFtZV8uU3dhcCgmb3RoZXItPmpzb25fbmFtZV8pOworICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7CisgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEZpZWxkRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTI4OTMsMTggKzQ5MjQsNzUwIEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gRmllbGREZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfbmFtZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCit9Cisgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorICBjbGVhcl9oYXNfbmFtZSgpOworICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX25hbWUoKTsKKyAgfQorICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAzOworYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX251bWJlcigpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX251bWJlcigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19udW1iZXIoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbnVtYmVyKCkgeworICBudW1iZXJfID0gMDsKKyAgY2xlYXJfaGFzX251bWJlcigpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRmllbGREZXNjcmlwdG9yUHJvdG86Om51bWJlcigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQorICByZXR1cm4gbnVtYmVyXzsKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbnVtYmVyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc2V0X2hhc19udW1iZXIoKTsKKyAgbnVtYmVyXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5udW1iZXIpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OworYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2xhYmVsKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbGFiZWwoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbGFiZWwoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbGFiZWwoKSB7CisgIGxhYmVsXyA9IDE7CisgIGNsZWFyX2hhc19sYWJlbCgpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgRmllbGREZXNjcmlwdG9yUHJvdG86OmxhYmVsKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5sYWJlbCkKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsID4obGFiZWxfKTsKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfbGFiZWwoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCB2YWx1ZSkgeworICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfbGFiZWwoKTsKKyAgbGFiZWxfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmxhYmVsKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7Citib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl90eXBlKCkgeworICB0eXBlXyA9IDE7CisgIGNsZWFyX2hhc190eXBlKCk7Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIEZpZWxkRGVzY3JpcHRvclByb3RvOjp0eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlKQorICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSA+KHR5cGVfKTsKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdmFsdWUpIHsKKyAgYXNzZXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfdHlwZSgpOworICB0eXBlXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgdHlwZV9uYW1lID0gNjsKK2Jvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc190eXBlX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc190eXBlX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAxMHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfdHlwZV9uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX3R5cGVfbmFtZSgpIHsKKyAgdHlwZV9uYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc190eXBlX25hbWUoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6dHlwZV9uYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCisgIHJldHVybiB0eXBlX25hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfdHlwZV9uYW1lKCk7CisgIHR5cGVfbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQorfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlX25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc190eXBlX25hbWUoKTsKKyAgdHlwZV9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3R5cGVfbmFtZSgpOworICB0eXBlX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCit9CisgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdHlwZV9uYW1lKCkgeworICBzZXRfaGFzX3R5cGVfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQorICByZXR1cm4gdHlwZV9uYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3R5cGVfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKKyAgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOworICByZXR1cm4gdHlwZV9uYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfdHlwZV9uYW1lKDo6c3RkOjpzdHJpbmcqIHR5cGVfbmFtZSkgeworICBpZiAodHlwZV9uYW1lICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX3R5cGVfbmFtZSgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc190eXBlX25hbWUoKTsKKyAgfQorICB0eXBlX25hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB0eXBlX25hbWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgZXh0ZW5kZWUgPSAyOworYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2V4dGVuZGVlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfZXh0ZW5kZWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAyMHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfZXh0ZW5kZWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5kZWUoKSB7CisgIGV4dGVuZGVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19leHRlbmRlZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpleHRlbmRlZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCisgIHJldHVybiBleHRlbmRlZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9leHRlbmRlZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2V4dGVuZGVlKCk7CisgIGV4dGVuZGVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19leHRlbmRlZSgpOworICBleHRlbmRlZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfZXh0ZW5kZWUoKTsKKyAgZXh0ZW5kZWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbmRlZSgpIHsKKyAgc2V0X2hhc19leHRlbmRlZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCisgIHJldHVybiBleHRlbmRlZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9leHRlbmRlZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlKQorICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKKyAgcmV0dXJuIGV4dGVuZGVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfZXh0ZW5kZWUoOjpzdGQ6OnN0cmluZyogZXh0ZW5kZWUpIHsKKyAgaWYgKGV4dGVuZGVlICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2V4dGVuZGVlKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2V4dGVuZGVlKCk7CisgIH0KKyAgZXh0ZW5kZWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBleHRlbmRlZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OworYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2RlZmF1bHRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19kZWZhdWx0X3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwNDB1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZGVmYXVsdF92YWx1ZSgpIHsKKyAgZGVmYXVsdF92YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X3ZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQorICByZXR1cm4gZGVmYXVsdF92YWx1ZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBkZWZhdWx0X3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQorfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBkZWZhdWx0X3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCit9Cisgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBkZWZhdWx0X3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9kZWZhdWx0X3ZhbHVlKCkgeworICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCisgIHJldHVybiBkZWZhdWx0X3ZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX2RlZmF1bHRfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQorICBjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpOworICByZXR1cm4gZGVmYXVsdF92YWx1ZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2RlZmF1bHRfdmFsdWUoOjpzdGQ6OnN0cmluZyogZGVmYXVsdF92YWx1ZSkgeworICBpZiAoZGVmYXVsdF92YWx1ZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19kZWZhdWx0X3ZhbHVlKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKKyAgfQorICBkZWZhdWx0X3ZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZGVmYXVsdF92YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBvbmVvZl9pbmRleCA9IDk7Citib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfb25lb2ZfaW5kZXgoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwODB1KSAhPSAwOworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vbmVvZl9pbmRleCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDgwdTsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vbmVvZl9pbmRleCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vbmVvZl9pbmRleCgpIHsKKyAgb25lb2ZfaW5kZXhfID0gMDsKKyAgY2xlYXJfaGFzX29uZW9mX2luZGV4KCk7Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWVsZERlc2NyaXB0b3JQcm90bzo6b25lb2ZfaW5kZXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4KQorICByZXR1cm4gb25lb2ZfaW5kZXhfOworfQorIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9vbmVvZl9pbmRleCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHNldF9oYXNfb25lb2ZfaW5kZXgoKTsKKyAgb25lb2ZfaW5kZXhfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4KQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7Citib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfanNvbl9uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMTAwdSkgIT0gMDsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfanNvbl9uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAxMDB1OworfQordm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2pzb25fbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDEwMHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9qc29uX25hbWUoKSB7CisgIGpzb25fbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfanNvbl9uYW1lKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGREZXNjcmlwdG9yUHJvdG86Ompzb25fbmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQorICByZXR1cm4ganNvbl9uYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2pzb25fbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2pzb25fbmFtZSgpOworICBqc29uX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfanNvbl9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfanNvbl9uYW1lKCk7CisgIGpzb25fbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCit9Cisgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19qc29uX25hbWUoKTsKKyAganNvbl9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQorfQorIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2pzb25fbmFtZSgpIHsKKyAgc2V0X2hhc19qc29uX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKKyAgcmV0dXJuIGpzb25fbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9qc29uX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCisgIGNsZWFyX2hhc19qc29uX25hbWUoKTsKKyAgcmV0dXJuIGpzb25fbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2pzb25fbmFtZSg6OnN0ZDo6c3RyaW5nKiBqc29uX25hbWUpIHsKKyAgaWYgKGpzb25fbmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19qc29uX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfanNvbl9uYW1lKCk7CisgIH0KKyAganNvbl9uYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwganNvbl9uYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7Citib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDIwMHUpICE9IDA7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDIwMHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDIwMHU7Cit9Cit2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgc2V0X2hhc19vcHRpb25zKCk7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7CisgICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnM7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBvcHRpb25zXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK3ZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogb3B0aW9ucykgeworICBkZWxldGUgb3B0aW9uc187CisgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb3B0aW9ucygpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorY29uc3QgaW50IE9uZW9mRGVzY3JpcHRvclByb3RvOjprTmFtZUZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorCitPbmVvZkRlc2NyaXB0b3JQcm90bzo6T25lb2ZEZXNjcmlwdG9yUHJvdG8oKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKKyAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7Cit9CisKK09uZW9mRGVzY3JpcHRvclByb3RvOjpPbmVvZkRlc2NyaXB0b3JQcm90byhjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgZnJvbSkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKKyAgU2hhcmVkQ3RvcigpOworICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIG5hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworT25lb2ZEZXNjcmlwdG9yUHJvdG86On5PbmVvZkRlc2NyaXB0b3JQcm90bygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7CisgIG5hbWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIE9uZW9mRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIE9uZW9mRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgT25lb2ZEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK09uZW9mRGVzY3JpcHRvclByb3RvKiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitPbmVvZkRlc2NyaXB0b3JQcm90byogT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBPbmVvZkRlc2NyaXB0b3JQcm90byogbiA9IG5ldyBPbmVvZkRlc2NyaXB0b3JQcm90bzsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOworfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgaWYgKGhhc19uYW1lKCkpIHsKKyAgICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIH0KKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9Cit9CisKK2Jvb2wgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAodGFnID09IDEwKSB7CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX25hbWUoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgcmV0dXJuIGZhbHNlOworI3VuZGVmIERPXworfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoaGFzX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIE9uZW9mRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworICBpZiAoaGFzX25hbWUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDEsIHRoaXMtPm5hbWUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IE9uZW9mRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgIGludCB0b3RhbF9zaXplID0gMDsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGlmIChoYXNfbmFtZSgpKSB7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5uYW1lKCkpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPSAKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8+KAorICAgICAgICAgICZmcm9tKTsKKyAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CisgIH0gZWxzZSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX25hbWUoKSkgeworICAgICAgc2V0X2hhc19uYW1lKCk7CisgICAgICBuYW1lXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV8pOworICAgIH0KKyAgfQorICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIH0KK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90bykKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCit2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKworYm9vbCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKKworICByZXR1cm4gdHJ1ZTsKK30KKwordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6U3dhcChPbmVvZkRlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChPbmVvZkRlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgbmFtZV8uU3dhcCgmb3RoZXItPm5hbWVfKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgT25lb2ZEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IE9uZW9mRGVzY3JpcHRvclByb3RvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gT25lb2ZEZXNjcmlwdG9yUHJvdG9fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gT25lb2ZEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworYm9vbCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfbmFtZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE9uZW9mRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCit9Cisgdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIE9uZW9mRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorICBjbGVhcl9oYXNfbmFtZSgpOworICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX25hbWUoKTsKKyAgfQorICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IEVudW1EZXNjcmlwdG9yUHJvdG86OmtOYW1lRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6a1ZhbHVlRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIEVudW1EZXNjcmlwdG9yUHJvdG86OkVudW1EZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQogfQogCiB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKQEAgLTI5MTIsMjYgKzU2NzUsMjggQEAKIH0KIAogRW51bURlc2NyaXB0b3JQcm90bzo6RW51bURlc2NyaXB0b3JQcm90byhjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOwogICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQogfQogCiB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgbmFtZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBvcHRpb25zXyA9IE5VTEw7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CiB9CiAKIEVudW1EZXNjcmlwdG9yUHJvdG86On5FbnVtRGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKICAgU2hhcmVkRHRvcigpOwogfQogCiB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIG5hbWVfOwotICB9CisgIG5hbWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CiAgICAgZGVsZXRlIG9wdGlvbnNfOwogICB9CkBAIC0yOTU0LDE2ICs1NzE5LDE5IEBACiAKIEVudW1EZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotRW51bURlc2NyaXB0b3JQcm90byogRW51bURlc2NyaXB0b3JQcm90bzo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEVudW1EZXNjcmlwdG9yUHJvdG87CitFbnVtRGVzY3JpcHRvclByb3RvKiBFbnVtRGVzY3JpcHRvclByb3RvOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgRW51bURlc2NyaXB0b3JQcm90byogbiA9IG5ldyBFbnVtRGVzY3JpcHRvclByb3RvOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDV1KSB7CiAgICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgICAgIG5hbWVfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICAgIH0KICAgICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOjpDbGVhcigpOwpAQCAtMjk3MSwxNTUgKzU3MzksMTc2IEBACiAgIH0KICAgdmFsdWVfLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgRW51bURlc2NyaXB0b3JQcm90bzo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKKyAgICB0YWcgPSBwLmZpcnN0OworICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMCkgewogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfdmFsdWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKICAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTgpIHsKICAgICAgICAgIHBhcnNlX3ZhbHVlOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfdmFsdWU6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCiAgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF92YWx1ZSgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV92YWx1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2xvb3BfdmFsdWU7CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2Vfb3B0aW9uczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKICAgICAgIGNhc2UgMzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMjYpIHsKICAgICAgICAgIHBhcnNlX29wdGlvbnM6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKICAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorICByZXR1cm4gZmFsc2U7CiAjdW5kZWYgRE9fCiB9CiAKIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAogICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52YWx1ZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnZhbHVlX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCiAgICAgICAyLCB0aGlzLT52YWx1ZShpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICAzLCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgICAgICAzLCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKICAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvIHZhbHVlID0gMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT52YWx1ZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnZhbHVlX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDIsIHRoaXMtPnZhbHVlKGkpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CiAgIGlmIChoYXNfb3B0aW9ucygpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKLSAgICAgICAgMywgdGhpcy0+b3B0aW9ucygpLCB0YXJnZXQpOworICAgICAgICAzLCAqdGhpcy0+b3B0aW9uc18sIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCiAgIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDV1KSB7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICAgIGlmIChoYXNfbmFtZSgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKICAgICAgICAgICB0aGlzLT5uYW1lKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CiAgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKLSAgICAgICAgICB0aGlzLT5vcHRpb25zKCkpOworICAgICAgICAgICp0aGlzLT5vcHRpb25zXyk7CiAgICAgfQotICAgIAorCiAgIH0KICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOwogICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT52YWx1ZV9zaXplKCk7CkBAIC0zMTI4LDEwICs1OTE3LDEwIEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPnZhbHVlKGkpKTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtMzE0MSw2MyArNTkzMCw3MiBAQAogfQogCiB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8qPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvKiBzb3VyY2UgPSAKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRW51bURlc2NyaXB0b3JQcm90bz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCiAgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwogICB9CiB9CiAKIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwogICB2YWx1ZV8uTWVyZ2VGcm9tKGZyb20udmFsdWVfKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKLSAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICAgIHNldF9oYXNfbmFtZSgpOworICAgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgewogICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CiAgICAgfQogICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90bykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB2YWx1ZV9zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+dmFsdWUoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KKworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnZhbHVlKCkpKSByZXR1cm4gZmFsc2U7CiAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgaWYgKCF0aGlzLT5vcHRpb25zKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF0aGlzLT5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6U3dhcChFbnVtRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKLSAgICB2YWx1ZV8uU3dhcCgmb3RoZXItPnZhbHVlXyk7Ci0gICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpJbnRlcm5hbFN3YXAoRW51bURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgbmFtZV8uU3dhcCgmb3RoZXItPm5hbWVfKTsKKyAgdmFsdWVfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPnZhbHVlXyk7CisgIHN0ZDo6c3dhcChvcHRpb25zXywgb3RoZXItPm9wdGlvbnNfKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgRW51bURlc2NyaXB0b3JQcm90bzo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC0zMjA4LDE4ICs2MDA2LDE1MSBAQAogICByZXR1cm4gbWV0YWRhdGE7CiB9CiAKKyNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIEVudW1EZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpoYXNfbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgeworICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19uYW1lKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgRW51bURlc2NyaXB0b3JQcm90bzo6bmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CisgIHNldF9oYXNfbmFtZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIGNsZWFyX2hhc19uYW1lKCk7CisgIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfbmFtZSgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19uYW1lKCk7CisgIH0KKyAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byB2YWx1ZSA9IDI7CitpbnQgRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHZhbHVlXy5zaXplKCk7Cit9Cit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OmNsZWFyX3ZhbHVlKCkgeworICB2YWx1ZV8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBFbnVtRGVzY3JpcHRvclByb3RvOjp2YWx1ZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKKyAgcmV0dXJuIHZhbHVlXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdmFsdWUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQorICByZXR1cm4gdmFsdWVfLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86OmFkZF92YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKKyAgcmV0dXJuIHZhbHVlXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPioKK0VudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUpCisgIHJldHVybiAmdmFsdWVfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byA+JgorRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQorICByZXR1cm4gdmFsdWVfOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zIG9wdGlvbnMgPSAzOworYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9Cit2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQordm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zJiBFbnVtRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIEVudW1EZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgc2V0X2hhc19vcHRpb25zKCk7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7CisgICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gb3B0aW9uc187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK3ZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtOdW1iZXJGaWVsZE51bWJlcjsKIGNvbnN0IGludCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmtPcHRpb25zRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgorI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogCiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKIH0KIAogdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKQEAgLTMyMjcsMjcgKzYxNTgsMjkgQEAKIH0KIAogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOwogICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCiB9CiAKIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTaGFyZWRDdG9yKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbmFtZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIG5hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgbnVtYmVyXyA9IDA7CiAgIG9wdGlvbnNfID0gTlVMTDsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjp+RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTaGFyZWREdG9yKCkgewotICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBuYW1lXzsKLSAgfQorICBuYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBpZiAodGhpcyAhPSBkZWZhdWx0X2luc3RhbmNlXykgewogICAgIGRlbGV0ZSBvcHRpb25zXzsKICAgfQpAQCAtMzI3MCwxNiArNjIwMywxOSBAQAogCiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwogCi1FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzsKK0VudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBuID0gbmV3IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgN3UpIHsKICAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICAgICAgbmFtZV8tPmNsZWFyKCk7Ci0gICAgICB9CisgICAgICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICAgIG51bWJlcl8gPSAwOwogICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CkBAIC0zMjg3LDE2NCArNjIyMywxODIgQEAKICAgICB9CiAgIH0KICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKKyAgICB0YWcgPSBwLmZpcnN0OworICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMCkgewogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9uYW1lKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lIik7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2KSkgZ290byBwYXJzZV9udW1iZXI7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTYpIHsKICAgICAgICAgIHBhcnNlX251bWJlcjoKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKICAgICAgICAgICAgICAgICAgaW5wdXQsICZudW1iZXJfKSkpOwogICAgICAgICAgIHNldF9oYXNfbnVtYmVyKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9vcHRpb25zOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMgb3B0aW9ucyA9IDM7CiAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDI2KSB7CiAgICAgICAgICBwYXJzZV9vcHRpb25zOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCiAgICAgICAgICAgICAgICBpbnB1dCwgbXV0YWJsZV9vcHRpb25zKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZ290byBzdWNjZXNzOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKICAgaWYgKGhhc19udW1iZXIoKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDMyKDIsIHRoaXMtPm51bWJlcigpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKICAgaWYgKGhhc19vcHRpb25zKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgMywgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICAgICAgMywgKnRoaXMtPm9wdGlvbnNfLCBvdXRwdXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKICAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CiAgIGlmIChoYXNfbnVtYmVyKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMlRvQXJyYXkoMiwgdGhpcy0+bnVtYmVyKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDMsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgICAgICAgMywgKnRoaXMtPm9wdGlvbnNfLCB0YXJnZXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA3dSkgewogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgICBpZiAoaGFzX25hbWUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+bmFtZSgpKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOwogICAgIGlmIChoYXNfbnVtYmVyKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCiAgICAgICAgICAgdGhpcy0+bnVtYmVyKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucyBvcHRpb25zID0gMzsKICAgICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAotICAgICAgICAgIHRoaXMtPm9wdGlvbnMoKSk7CisgICAgICAgICAgKnRoaXMtPm9wdGlvbnNfKTsKICAgICB9Ci0gICAgCisKICAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtMzQ1NCwyMiArNjQwOCwyNyBAQAogfQogCiB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CiAgIH0gZWxzZSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKLSAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICAgIHNldF9oYXNfbmFtZSgpOworICAgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX251bWJlcigpKSB7CiAgICAgICBzZXRfbnVtYmVyKGZyb20ubnVtYmVyKCkpOwpAQCAtMzQ3OCwzOCArNjQzNyw0NCBAQAogICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczo6TWVyZ2VGcm9tKGZyb20ub3B0aW9ucygpKTsKICAgICB9CiAgIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90bykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Q29weUZyb20oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAorCiAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgaWYgKCF0aGlzLT5vcHRpb25zKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF0aGlzLT5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpTd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAobmFtZV8sIG90aGVyLT5uYW1lXyk7Ci0gICAgc3RkOjpzd2FwKG51bWJlcl8sIG90aGVyLT5udW1iZXJfKTsKLSAgICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6SW50ZXJuYWxTd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogb3RoZXIpIHsKKyAgbmFtZV8uU3dhcCgmb3RoZXItPm5hbWVfKTsKKyAgc3RkOjpzd2FwKG51bWJlcl8sIG90aGVyLT5udW1iZXJfKTsKKyAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgewpAQCAtMzUyMCwxOCArNjQ4NSwxNDUgQEAKICAgcmV0dXJuIG1ldGFkYXRhOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9Cit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9Cisgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgY2xlYXJfaGFzX25hbWUoKTsKKyAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBudW1iZXIgPSAyOworYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Omhhc19udW1iZXIoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbnVtYmVyKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19udW1iZXIoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX251bWJlcigpIHsKKyAgbnVtYmVyXyA9IDA7CisgIGNsZWFyX2hhc19udW1iZXIoKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQorICByZXR1cm4gbnVtYmVyXzsKK30KKyB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X251bWJlcig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHNldF9oYXNfbnVtYmVyKCk7CisgIG51bWJlcl8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm51bWJlcikKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOworYm9vbCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK3ZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9Cit2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX29wdGlvbnMoKSB7CisgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zOjpDbGVhcigpOworICBjbGVhcl9oYXNfb3B0aW9ucygpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgeworICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKKyAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnM7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gb3B0aW9uc187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOworICBvcHRpb25zXyA9IE5VTEw7CisgIHJldHVybiB0ZW1wOworfQordm9pZCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjprTWV0aG9kRmllbGROdW1iZXI7CiBjb25zdCBpbnQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6a09wdGlvbnNGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQogfQogCiB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKQEAgLTM1MzksMjYgKzY2MzEsMjggQEAKIH0KIAogU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2VydmljZURlc2NyaXB0b3JQcm90byhjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOwogICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQogfQogCiB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgbmFtZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBvcHRpb25zXyA9IE5VTEw7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CiB9CiAKIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86On5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKICAgU2hhcmVkRHRvcigpOwogfQogCiB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIG5hbWVfOwotICB9CisgIG5hbWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CiAgICAgZGVsZXRlIG9wdGlvbnNfOwogICB9CkBAIC0zNTgxLDE2ICs2Njc1LDE5IEBACiAKIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotU2VydmljZURlc2NyaXB0b3JQcm90byogU2VydmljZURlc2NyaXB0b3JQcm90bzo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87CitTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgU2VydmljZURlc2NyaXB0b3JQcm90byogbiA9IG5ldyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Q2xlYXIoKSB7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDV1KSB7CiAgICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICAgIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgICAgIG5hbWVfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICAgIH0KICAgICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zOjpDbGVhcigpOwpAQCAtMzU5OCwxNTUgKzY2OTUsMTc2IEBACiAgIH0KICAgbWV0aG9kXy5DbGVhcigpOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQogfQogCiBib29sIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX21ldGhvZDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKICAgICAgIGNhc2UgMjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTgpIHsKICAgICAgICAgIHBhcnNlX21ldGhvZDoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX21ldGhvZDoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX21ldGhvZCgpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9tZXRob2Q7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9sb29wX21ldGhvZDsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9vcHRpb25zOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOwogICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAyNikgewogICAgICAgICAgcGFyc2Vfb3B0aW9uczoKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAogICAgICAgICAgICAgICAgaW5wdXQsIG11dGFibGVfb3B0aW9ucygpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQogICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCiAgIHJldHVybiB0cnVlOworZmFpbHVyZToKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQogICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CiAgIGlmIChoYXNfbmFtZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAxLCB0aGlzLT5uYW1lKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5tZXRob2Rfc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT5tZXRob2Rfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDIsIHRoaXMtPm1ldGhvZChpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCi0gICAgICAzLCB0aGlzLT5vcHRpb25zKCksIG91dHB1dCk7CisgICAgICAzLCAqdGhpcy0+b3B0aW9uc18sIG91dHB1dCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VydmljZURlc2NyaXB0b3JQcm90bzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUiKTsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKICAgICAgICAgMSwgdGhpcy0+bmFtZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bWV0aG9kX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bWV0aG9kX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDIsIHRoaXMtPm1ldGhvZChpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDMsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgICAgICAgMywgKnRoaXMtPm9wdGlvbnNfLCB0YXJnZXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKICAgcmV0dXJuIHRhcmdldDsKIH0KIAogaW50IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA1dSkgewogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgICBpZiAoaGFzX25hbWUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+bmFtZSgpKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOwogICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgICAgdGhpcy0+b3B0aW9ucygpKTsKKyAgICAgICAgICAqdGhpcy0+b3B0aW9uc18pOwogICAgIH0KLSAgICAKKwogICB9CiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPm1ldGhvZF9zaXplKCk7CkBAIC0zNzU1LDEwICs2ODczLDEwIEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPm1ldGhvZChpKSk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTM3NjgsNjMgKzY4ODYsNzIgQEAKIH0KIAogdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKj4oCi0gICAgICAmZnJvbSk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8+KAorICAgICAgICAgICZmcm9tKTsKICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Ok1lcmdlRnJvbShjb25zdCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgbWV0aG9kXy5NZXJnZUZyb20oZnJvbS5tZXRob2RfKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKLSAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICAgIHNldF9oYXNfbmFtZSgpOworICAgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX29wdGlvbnMoKSkgewogICAgICAgbXV0YWJsZV9vcHRpb25zKCktPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CiAgICAgfQogICB9Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90bykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBtZXRob2Rfc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIXRoaXMtPm1ldGhvZChpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQorCisgIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+bWV0aG9kKCkpKSByZXR1cm4gZmFsc2U7CiAgIGlmIChoYXNfb3B0aW9ucygpKSB7Ci0gICAgaWYgKCF0aGlzLT5vcHRpb25zKCkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgaWYgKCF0aGlzLT5vcHRpb25zXy0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CiAgIH0KICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6U3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKLSAgICBtZXRob2RfLlN3YXAoJm90aGVyLT5tZXRob2RfKTsKLSAgICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBvdGhlcikgeworICBuYW1lXy5Td2FwKCZvdGhlci0+bmFtZV8pOworICBtZXRob2RfLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPm1ldGhvZF8pOworICBzdGQ6OnN3YXAob3B0aW9uc18sIG90aGVyLT5vcHRpb25zXyk7CisgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OkdldE1ldGFkYXRhKCkgY29uc3QgewpAQCAtMzgzNSwxOSArNjk2MiwxNTQgQEAKICAgcmV0dXJuIG1ldGFkYXRhOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBTZXJ2aWNlRGVzY3JpcHRvclByb3RvCisKKy8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK2Jvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9Cit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19uYW1lKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfbmFtZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9Cisgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9Cisgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CisgOjpzdGQ6OnN0cmluZyogU2VydmljZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogU2VydmljZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQorICBjbGVhcl9oYXNfbmFtZSgpOworICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKK2ludCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2Rfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG1ldGhvZF8uc2l6ZSgpOworfQordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9tZXRob2QoKSB7CisgIG1ldGhvZF8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2QoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQorICByZXR1cm4gbWV0aG9kXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWV0aG9kKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5tZXRob2QpCisgIHJldHVybiBtZXRob2RfLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OmFkZF9tZXRob2QoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQorICByZXR1cm4gbWV0aG9kXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPioKK1NlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbWV0aG9kKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm1ldGhvZCkKKyAgcmV0dXJuICZtZXRob2RfOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+JgorU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5tZXRob2QpCisgIHJldHVybiBtZXRob2RfOworfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOworYm9vbCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9Cit2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQordm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vcHRpb25zKCkgeworICBpZiAob3B0aW9uc18gIT0gTlVMTCkgb3B0aW9uc18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKKyAgc2V0X2hhc19vcHRpb25zKCk7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7CisgICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorICByZXR1cm4gb3B0aW9uc187Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBOVUxMOworICByZXR1cm4gdGVtcDsKK30KK3ZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6a05hbWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtJbnB1dFR5cGVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtPdXRwdXRUeXBlRmllbGROdW1iZXI7CiBjb25zdCBpbnQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjprT3B0aW9uc0ZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKK2NvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtDbGllbnRTdHJlYW1pbmdGaWVsZE51bWJlcjsKK2NvbnN0IGludCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmtTZXJ2ZXJTdHJlYW1pbmdGaWVsZE51bWJlcjsKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXRob2REZXNjcmlwdG9yUHJvdG8oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCiB9CiAKIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CkBAIC0zODU1LDM0ICs3MTE3LDM0IEBACiB9CiAKIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6TWV0aG9kRGVzY3JpcHRvclByb3RvKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQogfQogCiB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6U2hhcmVkQ3RvcigpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKICAgX2NhY2hlZF9zaXplXyA9IDA7Ci0gIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICBpbnB1dF90eXBlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgb3V0cHV0X3R5cGVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBuYW1lXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGlucHV0X3R5cGVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgb3V0cHV0X3R5cGVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgb3B0aW9uc18gPSBOVUxMOworICBjbGllbnRfc3RyZWFtaW5nXyA9IGZhbHNlOworICBzZXJ2ZXJfc3RyZWFtaW5nXyA9IGZhbHNlOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwogfQogCiBNZXRob2REZXNjcmlwdG9yUHJvdG86On5NZXRob2REZXNjcmlwdG9yUHJvdG8oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCiAgIFNoYXJlZER0b3IoKTsKIH0KIAogdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNoYXJlZER0b3IoKSB7Ci0gIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIG5hbWVfOwotICB9Ci0gIGlmIChpbnB1dF90eXBlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIGlucHV0X3R5cGVfOwotICB9Ci0gIGlmIChvdXRwdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBvdXRwdXRfdHlwZV87Ci0gIH0KKyAgbmFtZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgaW5wdXRfdHlwZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgb3V0cHV0X3R5cGVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CiAgICAgZGVsZXRlIG9wdGlvbnNfOwogICB9CkBAIC0zOTA1LDI0MyArNzE2NywzNDYgQEAKIAogTWV0aG9kRGVzY3JpcHRvclByb3RvKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotTWV0aG9kRGVzY3JpcHRvclByb3RvKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBNZXRob2REZXNjcmlwdG9yUHJvdG87CitNZXRob2REZXNjcmlwdG9yUHJvdG8qIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIE1ldGhvZERlc2NyaXB0b3JQcm90byogbiA9IG5ldyBNZXRob2REZXNjcmlwdG9yUHJvdG87CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcHVzaCIpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCisgIF9fYnVpbHRpbl9vZmZzZXRvZihNZXRob2REZXNjcmlwdG9yUHJvdG8sIGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwb3AiKQorI2Vsc2UKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcCisgICZyZWludGVycHJldF9jYXN0PE1ldGhvZERlc2NyaXB0b3JQcm90byo+KDE2KS0+ZikKKyNlbmRpZgorCisjZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKKyAgOjptZW1zZXQoJmZpcnN0LCAwLFwKKyAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCit9IHdoaWxlICgwKQorCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA2M3UpIHsKKyAgICBaUl8oY2xpZW50X3N0cmVhbWluZ18sIHNlcnZlcl9zdHJlYW1pbmdfKTsKICAgICBpZiAoaGFzX25hbWUoKSkgewotICAgICAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICAgICAgbmFtZV8tPmNsZWFyKCk7Ci0gICAgICB9CisgICAgICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICAgIGlmIChoYXNfaW5wdXRfdHlwZSgpKSB7Ci0gICAgICBpZiAoaW5wdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBpbnB1dF90eXBlXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIGlucHV0X3R5cGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9CiAgICAgaWYgKGhhc19vdXRwdXRfdHlwZSgpKSB7Ci0gICAgICBpZiAob3V0cHV0X3R5cGVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICAgICAgb3V0cHV0X3R5cGVfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgb3V0cHV0X3R5cGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9CiAgICAgaWYgKGhhc19vcHRpb25zKCkpIHsKICAgICAgIGlmIChvcHRpb25zXyAhPSBOVUxMKSBvcHRpb25zXy0+Ojpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOjpDbGVhcigpOwogICAgIH0KICAgfQorCisjdW5kZWYgWlJfSEVMUEVSXworI3VuZGVmIFpSXworCiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPm5hbWUoKS5kYXRhKCksIHRoaXMtPm5hbWUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfaW5wdXRfdHlwZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOwogICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxOCkgewogICAgICAgICAgcGFyc2VfaW5wdXRfdHlwZToKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfaW5wdXRfdHlwZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPmlucHV0X3R5cGUoKS5kYXRhKCksIHRoaXMtPmlucHV0X3R5cGUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2Vfb3V0cHV0X3R5cGU7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CiAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDI2KSB7CiAgICAgICAgICBwYXJzZV9vdXRwdXRfdHlwZToKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfb3V0cHV0X3R5cGUoKSkpOwotICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICAgICAgICB0aGlzLT5vdXRwdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+b3V0cHV0X3R5cGUoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMzQpKSBnb3RvIHBhcnNlX29wdGlvbnM7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKICAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMzQpIHsKICAgICAgICAgIHBhcnNlX29wdGlvbnM6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKICAgICAgICAgICAgICAgIGlucHV0LCBtdXRhYmxlX29wdGlvbnMoKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MCkpIGdvdG8gcGFyc2VfY2xpZW50X3N0cmVhbWluZzsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBjbGllbnRfc3RyZWFtaW5nID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgNTogeworICAgICAgICBpZiAodGFnID09IDQwKSB7CisgICAgICAgICBwYXJzZV9jbGllbnRfc3RyZWFtaW5nOgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmY2xpZW50X3N0cmVhbWluZ18pKSk7CisgICAgICAgICAgc2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDgpKSBnb3RvIHBhcnNlX3NlcnZlcl9zdHJlYW1pbmc7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIHNlcnZlcl9zdHJlYW1pbmcgPSA2IFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSA2OiB7CisgICAgICAgIGlmICh0YWcgPT0gNDgpIHsKKyAgICAgICAgIHBhcnNlX3NlcnZlcl9zdHJlYW1pbmc6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZzZXJ2ZXJfc3RyZWFtaW5nXykpKTsKKyAgICAgICAgICBzZXRfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQorICByZXR1cm4gZmFsc2U7CiAjdW5kZWYgRE9fCiB9CiAKIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKICAgaWYgKGhhc19uYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+bmFtZSgpLmRhdGEoKSwgdGhpcy0+bmFtZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAogICAgICAgMSwgdGhpcy0+bmFtZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKICAgaWYgKGhhc19pbnB1dF90eXBlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+aW5wdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+aW5wdXRfdHlwZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAogICAgICAgMiwgdGhpcy0+aW5wdXRfdHlwZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CiAgIGlmIChoYXNfb3V0cHV0X3R5cGUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5vdXRwdXRfdHlwZSgpLmRhdGEoKSwgdGhpcy0+b3V0cHV0X3R5cGUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAzLCB0aGlzLT5vdXRwdXRfdHlwZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucyBvcHRpb25zID0gNDsKICAgaWYgKGhhc19vcHRpb25zKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgNCwgdGhpcy0+b3B0aW9ucygpLCBvdXRwdXQpOworICAgICAgNCwgKnRoaXMtPm9wdGlvbnNfLCBvdXRwdXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorCisgIC8vIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfY2xpZW50X3N0cmVhbWluZygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCg1LCB0aGlzLT5jbGllbnRfc3RyZWFtaW5nKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIHNlcnZlcl9zdHJlYW1pbmcgPSA2IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woNiwgdGhpcy0+c2VydmVyX3N0cmVhbWluZygpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBNZXRob2REZXNjcmlwdG9yUHJvdG86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICBpZiAoaGFzX25hbWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5uYW1lKCkuZGF0YSgpLCB0aGlzLT5uYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICAxLCB0aGlzLT5uYW1lKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGlucHV0X3R5cGUgPSAyOwogICBpZiAoaGFzX2lucHV0X3R5cGUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5pbnB1dF90eXBlKCkuZGF0YSgpLCB0aGlzLT5pbnB1dF90eXBlKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICAyLCB0aGlzLT5pbnB1dF90eXBlKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKICAgaWYgKGhhc19vdXRwdXRfdHlwZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPm91dHB1dF90eXBlKCkuZGF0YSgpLCB0aGlzLT5vdXRwdXRfdHlwZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlIik7CiAgICAgdGFyZ2V0ID0KICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCiAgICAgICAgIDMsIHRoaXMtPm91dHB1dF90eXBlKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OwogICBpZiAoaGFzX29wdGlvbnMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCi0gICAgICAgIDQsIHRoaXMtPm9wdGlvbnMoKSwgdGFyZ2V0KTsKKyAgICAgICAgNCwgKnRoaXMtPm9wdGlvbnNfLCB0YXJnZXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICAvLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2NsaWVudF9zdHJlYW1pbmcoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDUsIHRoaXMtPmNsaWVudF9zdHJlYW1pbmcoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfc2VydmVyX3N0cmVhbWluZygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNiwgdGhpcy0+c2VydmVyX3N0cmVhbWluZygpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKICAgcmV0dXJuIHRhcmdldDsKIH0KIAogaW50IE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKICAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgNjN1KSB7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwogICAgIGlmIChoYXNfbmFtZSgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKICAgICAgICAgICB0aGlzLT5uYW1lKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBpbnB1dF90eXBlID0gMjsKICAgICBpZiAoaGFzX2lucHV0X3R5cGUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+aW5wdXRfdHlwZSgpKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgb3V0cHV0X3R5cGUgPSAzOwogICAgIGlmIChoYXNfb3V0cHV0X3R5cGUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+b3V0cHV0X3R5cGUoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OwogICAgIGlmIChoYXNfb3B0aW9ucygpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCi0gICAgICAgICAgdGhpcy0+b3B0aW9ucygpKTsKKyAgICAgICAgICAqdGhpcy0+b3B0aW9uc18pOwogICAgIH0KLSAgICAKKworICAgIC8vIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19jbGllbnRfc3RyZWFtaW5nKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nID0gNiBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKICAgfQotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtNDE1MSw2NiArNzUxNiw4NyBAQAogfQogCiB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8qIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8qPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90bz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CiAgIH0gZWxzZSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6TWVyZ2VGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19uYW1lKCkpIHsKLSAgICAgIHNldF9uYW1lKGZyb20ubmFtZSgpKTsKKyAgICAgIHNldF9oYXNfbmFtZSgpOworICAgICAgbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm5hbWVfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX2lucHV0X3R5cGUoKSkgewotICAgICAgc2V0X2lucHV0X3R5cGUoZnJvbS5pbnB1dF90eXBlKCkpOworICAgICAgc2V0X2hhc19pbnB1dF90eXBlKCk7CisgICAgICBpbnB1dF90eXBlXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20uaW5wdXRfdHlwZV8pOwogICAgIH0KICAgICBpZiAoZnJvbS5oYXNfb3V0cHV0X3R5cGUoKSkgewotICAgICAgc2V0X291dHB1dF90eXBlKGZyb20ub3V0cHV0X3R5cGUoKSk7CisgICAgICBzZXRfaGFzX291dHB1dF90eXBlKCk7CisgICAgICBvdXRwdXRfdHlwZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm91dHB1dF90eXBlXyk7CiAgICAgfQogICAgIGlmIChmcm9tLmhhc19vcHRpb25zKCkpIHsKICAgICAgIG11dGFibGVfb3B0aW9ucygpLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnM6Ok1lcmdlRnJvbShmcm9tLm9wdGlvbnMoKSk7CiAgICAgfQorICAgIGlmIChmcm9tLmhhc19jbGllbnRfc3RyZWFtaW5nKCkpIHsKKyAgICAgIHNldF9jbGllbnRfc3RyZWFtaW5nKGZyb20uY2xpZW50X3N0cmVhbWluZygpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSkgeworICAgICAgc2V0X3NlcnZlcl9zdHJlYW1pbmcoZnJvbS5zZXJ2ZXJfc3RyZWFtaW5nKCkpOworICAgIH0KICAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIH0KIH0KIAogdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpDb3B5RnJvbShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90bykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiBib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCisKICAgaWYgKGhhc19vcHRpb25zKCkpIHsKLSAgICBpZiAoIXRoaXMtPm9wdGlvbnMoKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIXRoaXMtPm9wdGlvbnNfLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OlN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChuYW1lXywgb3RoZXItPm5hbWVfKTsKLSAgICBzdGQ6OnN3YXAoaW5wdXRfdHlwZV8sIG90aGVyLT5pbnB1dF90eXBlXyk7Ci0gICAgc3RkOjpzd2FwKG91dHB1dF90eXBlXywgb3RoZXItPm91dHB1dF90eXBlXyk7Ci0gICAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OkludGVybmFsU3dhcChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG90aGVyKSB7CisgIG5hbWVfLlN3YXAoJm90aGVyLT5uYW1lXyk7CisgIGlucHV0X3R5cGVfLlN3YXAoJm90aGVyLT5pbnB1dF90eXBlXyk7CisgIG91dHB1dF90eXBlXy5Td2FwKCZvdGhlci0+b3V0cHV0X3R5cGVfKTsKKyAgc3RkOjpzd2FwKG9wdGlvbnNfLCBvdGhlci0+b3B0aW9uc18pOworICBzdGQ6OnN3YXAoY2xpZW50X3N0cmVhbWluZ18sIG90aGVyLT5jbGllbnRfc3RyZWFtaW5nXyk7CisgIHN0ZDo6c3dhcChzZXJ2ZXJfc3RyZWFtaW5nXywgb3RoZXItPnNlcnZlcl9zdHJlYW1pbmdfKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTQyMjEsNiArNzYwNywyNjQgQEAKICAgcmV0dXJuIG1ldGFkYXRhOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBNZXRob2REZXNjcmlwdG9yUHJvdG8KKworLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOworYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19uYW1lKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9Cit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX25hbWUoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCit9Cisgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQorfQorIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKKyAgc2V0X2hhc19uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgY2xlYXJfaGFzX25hbWUoKTsKKyAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKSB7CisgIGlmIChuYW1lICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOworICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7Citib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX2lucHV0X3R5cGUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfaW5wdXRfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfaW5wdXRfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaW5wdXRfdHlwZSgpIHsKKyAgaW5wdXRfdHlwZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfaW5wdXRfdHlwZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aW5wdXRfdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCisgIHJldHVybiBpbnB1dF90eXBlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9pbnB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfaW5wdXRfdHlwZSgpOworICBpbnB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKK30KKyB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19pbnB1dF90eXBlKCk7CisgIGlucHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCit9Cisgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9pbnB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKKyAgaW5wdXRfdHlwZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQorfQorIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9pbnB1dF90eXBlKCkgeworICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQorICByZXR1cm4gaW5wdXRfdHlwZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfaW5wdXRfdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQorICBjbGVhcl9oYXNfaW5wdXRfdHlwZSgpOworICByZXR1cm4gaW5wdXRfdHlwZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9pbnB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIGlucHV0X3R5cGUpIHsKKyAgaWYgKGlucHV0X3R5cGUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfaW5wdXRfdHlwZSgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7CisgIH0KKyAgaW5wdXRfdHlwZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGlucHV0X3R5cGUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7Citib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX291dHB1dF90eXBlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX291dHB1dF90eXBlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworfQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vdXRwdXRfdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9Cit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3V0cHV0X3R5cGUoKSB7CisgIG91dHB1dF90eXBlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6b3V0cHV0X3R5cGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSkKKyAgcmV0dXJuIG91dHB1dF90eXBlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX291dHB1dF90eXBlKCk7CisgIG91dHB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCit9Cisgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX291dHB1dF90eXBlKCk7CisgIG91dHB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vdXRwdXRfdHlwZSkKK30KKyB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X291dHB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX291dHB1dF90eXBlKCk7CisgIG91dHB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQorfQorIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vdXRwdXRfdHlwZSgpIHsKKyAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQorICByZXR1cm4gb3V0cHV0X3R5cGVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX291dHB1dF90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQorICBjbGVhcl9oYXNfb3V0cHV0X3R5cGUoKTsKKyAgcmV0dXJuIG91dHB1dF90eXBlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX291dHB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIG91dHB1dF90eXBlKSB7CisgIGlmIChvdXRwdXRfdHlwZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOworICB9CisgIG91dHB1dF90eXBlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgb3V0cHV0X3R5cGUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7Citib29sIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworfQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9Cit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKKyAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnM6OkNsZWFyKCk7CisgIGNsZWFyX2hhc19vcHRpb25zKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CisgIHNldF9oYXNfb3B0aW9ucygpOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgeworICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCisgIHJldHVybiBvcHRpb25zXzsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKKyAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187CisgIG9wdGlvbnNfID0gTlVMTDsKKyAgcmV0dXJuIHRlbXA7Cit9Cit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogb3B0aW9ucykgeworICBkZWxldGUgb3B0aW9uc187CisgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb3B0aW9ucygpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gb3B0aW9uYWwgYm9vbCBjbGllbnRfc3RyZWFtaW5nID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfY2xpZW50X3N0cmVhbWluZygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Cit9Cit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworfQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19jbGllbnRfc3RyZWFtaW5nKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9jbGllbnRfc3RyZWFtaW5nKCkgeworICBjbGllbnRfc3RyZWFtaW5nXyA9IGZhbHNlOworICBjbGVhcl9oYXNfY2xpZW50X3N0cmVhbWluZygpOworfQorIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGllbnRfc3RyZWFtaW5nKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uY2xpZW50X3N0cmVhbWluZykKKyAgcmV0dXJuIGNsaWVudF9zdHJlYW1pbmdfOworfQorIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfY2xpZW50X3N0cmVhbWluZyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfY2xpZW50X3N0cmVhbWluZygpOworICBjbGllbnRfc3RyZWFtaW5nXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uY2xpZW50X3N0cmVhbWluZykKK30KKworLy8gb3B0aW9uYWwgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nID0gNiBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfc2VydmVyX3N0cmVhbWluZygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7Cit9Cit2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworfQordm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19zZXJ2ZXJfc3RyZWFtaW5nKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDIwdTsKK30KK3ZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zZXJ2ZXJfc3RyZWFtaW5nKCkgeworICBzZXJ2ZXJfc3RyZWFtaW5nXyA9IGZhbHNlOworICBjbGVhcl9oYXNfc2VydmVyX3N0cmVhbWluZygpOworfQorIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uc2VydmVyX3N0cmVhbWluZykKKyAgcmV0dXJuIHNlcnZlcl9zdHJlYW1pbmdfOworfQorIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfc2VydmVyX3N0cmVhbWluZyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfc2VydmVyX3N0cmVhbWluZygpOworICBzZXJ2ZXJfc3RyZWFtaW5nXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uc2VydmVyX3N0cmVhbWluZykKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCkBAIC00MjM5LDY2ICs3ODgzLDgwIEBACiAgIH0KIH0KIAotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6OlNQRUVEOwogY29uc3QgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIEZpbGVPcHRpb25zOjpDT0RFX1NJWkU7CiBjb25zdCBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6OkxJVEVfUlVOVElNRTsKIGNvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6T3B0aW1pemVNb2RlX01JTjsKIGNvbnN0IEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6T3B0aW1pemVNb2RlX01BWDsKIGNvbnN0IGludCBGaWxlT3B0aW9uczo6T3B0aW1pemVNb2RlX0FSUkFZU0laRTsKLSNlbmRpZiAgLy8gX01TQ19WRVIKLSNpZm5kZWYgX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YVBhY2thZ2VGaWVsZE51bWJlcjsKIGNvbnN0IGludCBGaWxlT3B0aW9uczo6a0phdmFPdXRlckNsYXNzbmFtZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpbGVPcHRpb25zOjprSmF2YU11bHRpcGxlRmlsZXNGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWxlT3B0aW9uczo6a1JldGFpblVua25vd25GaWVsZHNGaWVsZE51bWJlcjsKIGNvbnN0IGludCBGaWxlT3B0aW9uczo6a0phdmFHZW5lcmF0ZUVxdWFsc0FuZEhhc2hGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a0phdmFTdHJpbmdDaGVja1V0ZjhGaWVsZE51bWJlcjsKIGNvbnN0IGludCBGaWxlT3B0aW9uczo6a09wdGltaXplRm9yRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtHb1BhY2thZ2VGaWVsZE51bWJlcjsKIGNvbnN0IGludCBGaWxlT3B0aW9uczo6a0NjR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtKYXZhR2VuZXJpY1NlcnZpY2VzRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtQeUdlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprRGVwcmVjYXRlZEZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprQ2NFbmFibGVBcmVuYXNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWxlT3B0aW9uczo6a09iamNDbGFzc1ByZWZpeEZpZWxkTnVtYmVyOworY29uc3QgaW50IEZpbGVPcHRpb25zOjprQ3NoYXJwTmFtZXNwYWNlRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmlsZU9wdGlvbnM6OmtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgorI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogCiBGaWxlT3B0aW9uczo6RmlsZU9wdGlvbnMoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKIH0KIAogdm9pZCBGaWxlT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewogfQogCiBGaWxlT3B0aW9uczo6RmlsZU9wdGlvbnMoY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAorICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewogICBTaGFyZWRDdG9yKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQogfQogCiB2b2lkIEZpbGVPcHRpb25zOjpTaGFyZWRDdG9yKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICBfY2FjaGVkX3NpemVfID0gMDsKLSAgamF2YV9wYWNrYWdlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOworICBqYXZhX3BhY2thZ2VfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgamF2YV9tdWx0aXBsZV9maWxlc18gPSBmYWxzZTsKLSAgcmV0YWluX3Vua25vd25fZmllbGRzXyA9IGZhbHNlOwogICBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSBmYWxzZTsKKyAgamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8gPSBmYWxzZTsKICAgb3B0aW1pemVfZm9yXyA9IDE7CisgIGdvX3BhY2thZ2VfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKICAgamF2YV9nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOwogICBweV9nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjY19lbmFibGVfYXJlbmFzXyA9IGZhbHNlOworICBvYmpjX2NsYXNzX3ByZWZpeF8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjc2hhcnBfbmFtZXNwYWNlXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CiB9CiAKIEZpbGVPcHRpb25zOjp+RmlsZU9wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKICAgU2hhcmVkRHRvcigpOwogfQogCiB2b2lkIEZpbGVPcHRpb25zOjpTaGFyZWREdG9yKCkgewotICBpZiAoamF2YV9wYWNrYWdlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIGphdmFfcGFja2FnZV87Ci0gIH0KLSAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVsZXRlIGphdmFfb3V0ZXJfY2xhc3NuYW1lXzsKLSAgfQorICBqYXZhX3BhY2thZ2VfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBnb19wYWNrYWdlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBvYmpjX2NsYXNzX3ByZWZpeF8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY3NoYXJwX25hbWVzcGFjZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKICAgfQogfQpAQCAtNDMyMCw4MSArNzk3OCwxMTIgQEAKIAogRmlsZU9wdGlvbnMqIEZpbGVPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLUZpbGVPcHRpb25zKiBGaWxlT3B0aW9uczo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEZpbGVPcHRpb25zOworRmlsZU9wdGlvbnMqIEZpbGVPcHRpb25zOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgRmlsZU9wdGlvbnMqIG4gPSBuZXcgRmlsZU9wdGlvbnM7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBGaWxlT3B0aW9uczo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCiAgIF9leHRlbnNpb25zXy5DbGVhcigpOwotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2ludmFsaWQtb2Zmc2V0b2ZcIiIpIFwKKyAgX19idWlsdGluX29mZnNldG9mKEZpbGVPcHRpb25zLCBmKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcG9wIikKKyNlbHNlCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oXAorICAmcmVpbnRlcnByZXRfY2FzdDxGaWxlT3B0aW9ucyo+KDE2KS0+ZikKKyNlbmRpZgorCisjZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKKyAgOjptZW1zZXQoJmZpcnN0LCAwLFwKKyAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCit9IHdoaWxlICgwKQorCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAyNTV1KSB7CisgICAgWlJfKGphdmFfbXVsdGlwbGVfZmlsZXNfLCBjY19nZW5lcmljX3NlcnZpY2VzXyk7CiAgICAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgewotICAgICAgaWYgKGphdmFfcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBqYXZhX3BhY2thZ2VfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgamF2YV9wYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICAgIGlmIChoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgewotICAgICAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQotICAgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gZmFsc2U7Ci0gICAgcmV0YWluX3Vua25vd25fZmllbGRzXyA9IGZhbHNlOwotICAgIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyA9IGZhbHNlOwogICAgIG9wdGltaXplX2Zvcl8gPSAxOwotICAgIGNjX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7Ci0gICAgamF2YV9nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICAgIGlmIChoYXNfZ29fcGFja2FnZSgpKSB7CisgICAgICBnb19wYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgICAgfQogICB9Ci0gIGlmIChfaGFzX2JpdHNfWzggLyAzMl0gJiAoMHhmZnUgPDwgKDggJSAzMikpKSB7Ci0gICAgcHlfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKKyAgaWYgKF9oYXNfYml0c19bOCAvIDMyXSAmIDE2MTI4dSkgeworICAgIFpSXyhqYXZhX2dlbmVyaWNfc2VydmljZXNfLCBjY19lbmFibGVfYXJlbmFzXyk7CisgICAgaWYgKGhhc19vYmpjX2NsYXNzX3ByZWZpeCgpKSB7CisgICAgICBvYmpjX2NsYXNzX3ByZWZpeF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICAgIH0KKyAgICBpZiAoaGFzX2NzaGFycF9uYW1lc3BhY2UoKSkgeworICAgICAgY3NoYXJwX25hbWVzcGFjZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICAgIH0KICAgfQorCisjdW5kZWYgWlJfSEVMUEVSXworI3VuZGVmIFpSXworCiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQogfQogCiBib29sIEZpbGVPcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9wYWNrYWdlID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfamF2YV9wYWNrYWdlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+amF2YV9wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5qYXZhX3BhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OwogICAgICAgY2FzZSA4OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSA2NikgewogICAgICAgICAgcGFyc2VfamF2YV9vdXRlcl9jbGFzc25hbWU6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5kYXRhKCksIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzIpKSBnb3RvIHBhcnNlX29wdGltaXplX2ZvcjsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKICAgICAgIGNhc2UgOTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSA3MikgewogICAgICAgICAgcGFyc2Vfb3B0aW1pemVfZm9yOgogICAgICAgICAgIGludCB2YWx1ZTsKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPApAQCAtNDQwNiwzNDcgKzgwOTUsNTU0IEBACiAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCg5LCB2YWx1ZSk7CiAgICAgICAgICAgfQogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg4MCkpIGdvdG8gcGFyc2VfamF2YV9tdWx0aXBsZV9maWxlczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgICBjYXNlIDEwOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICBpZiAodGFnID09IDgwKSB7CiAgICAgICAgICBwYXJzZV9qYXZhX211bHRpcGxlX2ZpbGVzOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmamF2YV9tdWx0aXBsZV9maWxlc18pKSk7CiAgICAgICAgICAgc2V0X2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDg4KSkgZ290byBwYXJzZV9yZXRhaW5fdW5rbm93bl9maWVsZHM7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDkwKSkgZ290byBwYXJzZV9nb19wYWNrYWdlOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAotICAgICAgLy8gb3B0aW9uYWwgYm9vbCByZXRhaW5fdW5rbm93bl9maWVsZHMgPSAxMSBbZGVmYXVsdCA9IGZhbHNlXTsKKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKICAgICAgIGNhc2UgMTE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7Ci0gICAgICAgICBwYXJzZV9yZXRhaW5fdW5rbm93bl9maWVsZHM6Ci0gICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKLSAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKLSAgICAgICAgICAgICAgICAgaW5wdXQsICZyZXRhaW5fdW5rbm93bl9maWVsZHNfKSkpOwotICAgICAgICAgIHNldF9oYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCk7CisgICAgICAgIGlmICh0YWcgPT0gOTApIHsKKyAgICAgICAgIHBhcnNlX2dvX3BhY2thZ2U6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2dvX3BhY2thZ2UoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgICAgICAgdGhpcy0+Z29fcGFja2FnZSgpLmRhdGEoKSwgdGhpcy0+Z29fcGFja2FnZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTI4KSkgZ290byBwYXJzZV9jY19nZW5lcmljX3NlcnZpY2VzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBib29sIGNjX2dlbmVyaWNfc2VydmljZXMgPSAxNiBbZGVmYXVsdCA9IGZhbHNlXTsKICAgICAgIGNhc2UgMTY6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTI4KSB7CiAgICAgICAgICBwYXJzZV9jY19nZW5lcmljX3NlcnZpY2VzOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmY2NfZ2VuZXJpY19zZXJ2aWNlc18pKSk7CiAgICAgICAgICAgc2V0X2hhc19jY19nZW5lcmljX3NlcnZpY2VzKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEzNikpIGdvdG8gcGFyc2VfamF2YV9nZW5lcmljX3NlcnZpY2VzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOwogICAgICAgY2FzZSAxNzogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMzYpIHsKICAgICAgICAgIHBhcnNlX2phdmFfZ2VuZXJpY19zZXJ2aWNlczoKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAogICAgICAgICAgICAgICAgICBpbnB1dCwgJmphdmFfZ2VuZXJpY19zZXJ2aWNlc18pKSk7CiAgICAgICAgICAgc2V0X2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTQ0KSkgZ290byBwYXJzZV9weV9nZW5lcmljX3NlcnZpY2VzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKICAgICAgIGNhc2UgMTg6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTQ0KSB7CiAgICAgICAgICBwYXJzZV9weV9nZW5lcmljX3NlcnZpY2VzOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmcHlfZ2VuZXJpY19zZXJ2aWNlc18pKSk7CiAgICAgICAgICAgc2V0X2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE2MCkpIGdvdG8gcGFyc2VfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2g7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdCA9IGZhbHNlXTsKICAgICAgIGNhc2UgMjA6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTYwKSB7CiAgICAgICAgICBwYXJzZV9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaDoKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAogICAgICAgICAgICAgICAgICBpbnB1dCwgJmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXykpKTsKICAgICAgICAgICBzZXRfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4NCkpIGdvdG8gcGFyc2VfZGVwcmVjYXRlZDsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAyMzogeworICAgICAgICBpZiAodGFnID09IDE4NCkgeworICAgICAgICAgcGFyc2VfZGVwcmVjYXRlZDoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmRlcHJlY2F0ZWRfKSkpOworICAgICAgICAgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjE2KSkgZ290byBwYXJzZV9qYXZhX3N0cmluZ19jaGVja191dGY4OworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX3N0cmluZ19jaGVja191dGY4ID0gMjcgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDI3OiB7CisgICAgICAgIGlmICh0YWcgPT0gMjE2KSB7CisgICAgICAgICBwYXJzZV9qYXZhX3N0cmluZ19jaGVja191dGY4OgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8pKSk7CisgICAgICAgICAgc2V0X2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNDgpKSBnb3RvIHBhcnNlX2NjX2VuYWJsZV9hcmVuYXM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMzE6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAyNDgpIHsKKyAgICAgICAgIHBhcnNlX2NjX2VuYWJsZV9hcmVuYXM6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZjY19lbmFibGVfYXJlbmFzXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI5MCkpIGdvdG8gcGFyc2Vfb2JqY19jbGFzc19wcmVmaXg7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKKyAgICAgIGNhc2UgMzY6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAyOTApIHsKKyAgICAgICAgIHBhcnNlX29iamNfY2xhc3NfcHJlZml4OgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9vYmpjX2NsYXNzX3ByZWZpeCgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICAgICAgICB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpLmRhdGEoKSwgdGhpcy0+b2JqY19jbGFzc19wcmVmaXgoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjk4KSkgZ290byBwYXJzZV9jc2hhcnBfbmFtZXNwYWNlOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGNzaGFycF9uYW1lc3BhY2UgPSAzNzsKKyAgICAgIGNhc2UgMzc6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAyOTgpIHsKKyAgICAgICAgIHBhcnNlX2NzaGFycF9uYW1lc3BhY2U6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2NzaGFycF9uYW1lc3BhY2UoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgICAgICAgdGhpcy0+Y3NoYXJwX25hbWVzcGFjZSgpLmRhdGEoKSwgdGhpcy0+Y3NoYXJwX25hbWVzcGFjZSgpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAgICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gNzk5NCkgewogICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX2xvb3BfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIH0KICAgICAgICAgaWYgKCg4MDAwdSA8PSB0YWcpKSB7CiAgICAgICAgICAgRE9fKF9leHRlbnNpb25zXy5QYXJzZUZpZWxkKHRhZywgaW5wdXQsIGRlZmF1bHRfaW5zdGFuY2VfLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgfQotICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIEZpbGVPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CiAgIGlmIChoYXNfamF2YV9wYWNrYWdlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+amF2YV9wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5qYXZhX3BhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAxLCB0aGlzLT5qYXZhX3BhY2thZ2UoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OwogICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5kYXRhKCksIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICA4LCB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CiAgIGlmIChoYXNfb3B0aW1pemVfZm9yKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAogICAgICAgOSwgdGhpcy0+b3B0aW1pemVfZm9yKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CiAgIGlmIChoYXNfamF2YV9tdWx0aXBsZV9maWxlcygpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxMCwgdGhpcy0+amF2YV9tdWx0aXBsZV9maWxlcygpLCBvdXRwdXQpOwogICB9Ci0gIAotICAvLyBvcHRpb25hbCBib29sIHJldGFpbl91bmtub3duX2ZpZWxkcyA9IDExIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpZiAoaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxMSwgdGhpcy0+cmV0YWluX3Vua25vd25fZmllbGRzKCksIG91dHB1dCk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKyAgaWYgKGhhc19nb19wYWNrYWdlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmdvX3BhY2thZ2UoKS5kYXRhKCksIHRoaXMtPmdvX3BhY2thZ2UoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgIDExLCB0aGlzLT5nb19wYWNrYWdlKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CiAgIGlmIChoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxNiwgdGhpcy0+Y2NfZ2VuZXJpY19zZXJ2aWNlcygpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07CiAgIGlmIChoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDE3LCB0aGlzLT5qYXZhX2dlbmVyaWNfc2VydmljZXMoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKICAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDE4LCB0aGlzLT5weV9nZW5lcmljX3NlcnZpY2VzKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOwogICBpZiAoaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIwLCB0aGlzLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpLCBvdXRwdXQpOwogICB9Ci0gIAorCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMjMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMjcsIHRoaXMtPmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZW5hYmxlX2FyZW5hcyA9IDMxIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMzEsIHRoaXMtPmNjX2VuYWJsZV9hcmVuYXMoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBvYmpjX2NsYXNzX3ByZWZpeCA9IDM2OworICBpZiAoaGFzX29iamNfY2xhc3NfcHJlZml4KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPm9iamNfY2xhc3NfcHJlZml4KCkuZGF0YSgpLCB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgIDM2LCB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpLCBvdXRwdXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGNzaGFycF9uYW1lc3BhY2UgPSAzNzsKKyAgaWYgKGhhc19jc2hhcnBfbmFtZXNwYWNlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmNzaGFycF9uYW1lc3BhY2UoKS5kYXRhKCksIHRoaXMtPmNzaGFycF9uYW1lc3BhY2UoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgIDM3LCB0aGlzLT5jc2hhcnBfbmFtZXNwYWNlKCksIG91dHB1dCk7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEZpbGVPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CiAgIGlmIChoYXNfamF2YV9wYWNrYWdlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+amF2YV9wYWNrYWdlKCkuZGF0YSgpLCB0aGlzLT5qYXZhX3BhY2thZ2UoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICAxLCB0aGlzLT5qYXZhX3BhY2thZ2UoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgamF2YV9vdXRlcl9jbGFzc25hbWUgPSA4OwogICBpZiAoaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgdGhpcy0+amF2YV9vdXRlcl9jbGFzc25hbWUoKS5kYXRhKCksIHRoaXMtPmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICA4LCB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07CiAgIGlmIChoYXNfb3B0aW1pemVfZm9yKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtVG9BcnJheSgKICAgICAgIDksIHRoaXMtPm9wdGltaXplX2ZvcigpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOwogICBpZiAoaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEwLCB0aGlzLT5qYXZhX211bHRpcGxlX2ZpbGVzKCksIHRhcmdldCk7CiAgIH0KLSAgCi0gIC8vIG9wdGlvbmFsIGJvb2wgcmV0YWluX3Vua25vd25fZmllbGRzID0gMTEgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlmIChoYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxMSwgdGhpcy0+cmV0YWluX3Vua25vd25fZmllbGRzKCksIHRhcmdldCk7CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKKyAgaWYgKGhhc19nb19wYWNrYWdlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmdvX3BhY2thZ2UoKS5kYXRhKCksIHRoaXMtPmdvX3BhY2thZ2UoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSIpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAxMSwgdGhpcy0+Z29fcGFja2FnZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOwogICBpZiAoaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDE2LCB0aGlzLT5jY19nZW5lcmljX3NlcnZpY2VzKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKICAgaWYgKGhhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDE3LCB0aGlzLT5qYXZhX2dlbmVyaWNfc2VydmljZXMoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKICAgaWYgKGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxOCwgdGhpcy0+cHlfZ2VuZXJpY19zZXJ2aWNlcygpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdCA9IGZhbHNlXTsKICAgaWYgKGhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMjAsIHRoaXMtPmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCksIHRhcmdldCk7CiAgIH0KLSAgCisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMjMgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMjMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCA9IDI3IFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDI3LCB0aGlzLT5qYXZhX3N0cmluZ19jaGVja191dGY4KCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19jY19lbmFibGVfYXJlbmFzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzMSwgdGhpcy0+Y2NfZW5hYmxlX2FyZW5hcygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIG9iamNfY2xhc3NfcHJlZml4ID0gMzY7CisgIGlmIChoYXNfb2JqY19jbGFzc19wcmVmaXgoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+b2JqY19jbGFzc19wcmVmaXgoKS5kYXRhKCksIHRoaXMtPm9iamNfY2xhc3NfcHJlZml4KCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4Iik7CisgICAgdGFyZ2V0ID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ1RvQXJyYXkoCisgICAgICAgIDM2LCB0aGlzLT5vYmpjX2NsYXNzX3ByZWZpeCgpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgc3RyaW5nIGNzaGFycF9uYW1lc3BhY2UgPSAzNzsKKyAgaWYgKGhhc19jc2hhcnBfbmFtZXNwYWNlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmNzaGFycF9uYW1lc3BhY2UoKS5kYXRhKCksIHRoaXMtPmNzaGFycF9uYW1lc3BhY2UoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSIpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAzNywgdGhpcy0+Y3NoYXJwX25hbWVzcGFjZSgpLCB0YXJnZXQpOworICB9CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCiAgIHJldHVybiB0YXJnZXQ7CiB9CiAKIGludCBGaWxlT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAyNTV1KSB7CiAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7CiAgICAgaWYgKGhhc19qYXZhX3BhY2thZ2UoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCiAgICAgICAgICAgdGhpcy0+amF2YV9wYWNrYWdlKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7CiAgICAgaWYgKGhhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKICAgICAgICAgICB0aGlzLT5qYXZhX291dGVyX2NsYXNzbmFtZSgpKTsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKICAgICBpZiAoaGFzX2phdmFfbXVsdGlwbGVfZmlsZXMoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKICAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgYm9vbCByZXRhaW5fdW5rbm93bl9maWVsZHMgPSAxMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgICBpZiAoaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgICB0b3RhbF9zaXplICs9IDEgKyAxOwotICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdCA9IGZhbHNlXTsKICAgICBpZiAoaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CiAgICAgfQotICAgIAorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX3N0cmluZ19jaGVja191dGY4ID0gMjcgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgICAgfQorCiAgICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKICAgICBpZiAoaGFzX29wdGltaXplX2ZvcigpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+b3B0aW1pemVfZm9yKCkpOwogICAgIH0KLSAgICAKKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBnb19wYWNrYWdlID0gMTE7CisgICAgaWYgKGhhc19nb19wYWNrYWdlKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmdvX3BhY2thZ2UoKSk7CisgICAgfQorCiAgICAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgaWYgKGhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CiAgICAgfQotICAgIAorCisgIH0KKyAgaWYgKF9oYXNfYml0c19bOCAvIDMyXSAmIDE2MTI4dSkgewogICAgIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgaWYgKGhhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAyICsgMTsKICAgICB9Ci0gICAgCi0gIH0KLSAgaWYgKF9oYXNfYml0c19bOCAvIDMyXSAmICgweGZmdSA8PCAoOCAlIDMyKSkpIHsKKwogICAgIC8vIG9wdGlvbmFsIGJvb2wgcHlfZ2VuZXJpY19zZXJ2aWNlcyA9IDE4IFtkZWZhdWx0ID0gZmFsc2VdOwogICAgIGlmIChoYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOwogICAgIH0KLSAgICAKKworICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZW5hYmxlX2FyZW5hcyA9IDMxIFtkZWZhdWx0ID0gZmFsc2VdOworICAgIGlmIChoYXNfY2NfZW5hYmxlX2FyZW5hcygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDIgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIHN0cmluZyBvYmpjX2NsYXNzX3ByZWZpeCA9IDM2OworICAgIGlmIChoYXNfb2JqY19jbGFzc19wcmVmaXgoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+b2JqY19jbGFzc19wcmVmaXgoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGNzaGFycF9uYW1lc3BhY2UgPSAzNzsKKyAgICBpZiAoaGFzX2NzaGFycF9uYW1lc3BhY2UoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAyICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+Y3NoYXJwX25hbWVzcGFjZSgpKTsKKyAgICB9CisKICAgfQogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKQEAgLTQ3NTUsMTIgKzg2NTEsMTIgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOwogICB9Ci0gIAorCiAgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewogICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCiAgICAgICAgIHVua25vd25fZmllbGRzKCkpOwogICB9CiAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CkBAIC00NzcwLDkzICs4NjY2LDEyNiBAQAogfQogCiB2b2lkIEZpbGVPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IEZpbGVPcHRpb25zKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgRmlsZU9wdGlvbnMqPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgRmlsZU9wdGlvbnMqIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBGaWxlT3B0aW9ucz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBGaWxlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOwogICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CiAgICAgaWYgKGZyb20uaGFzX2phdmFfcGFja2FnZSgpKSB7Ci0gICAgICBzZXRfamF2YV9wYWNrYWdlKGZyb20uamF2YV9wYWNrYWdlKCkpOworICAgICAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKKyAgICAgIGphdmFfcGFja2FnZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmphdmFfcGFja2FnZV8pOwogICAgIH0KICAgICBpZiAoZnJvbS5oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSkgewotICAgICAgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGZyb20uamF2YV9vdXRlcl9jbGFzc25hbWUoKSk7CisgICAgICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgICAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmphdmFfb3V0ZXJfY2xhc3NuYW1lXyk7CiAgICAgfQogICAgIGlmIChmcm9tLmhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkpIHsKICAgICAgIHNldF9qYXZhX211bHRpcGxlX2ZpbGVzKGZyb20uamF2YV9tdWx0aXBsZV9maWxlcygpKTsKICAgICB9Ci0gICAgaWYgKGZyb20uaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpKSB7Ci0gICAgICBzZXRfcmV0YWluX3Vua25vd25fZmllbGRzKGZyb20ucmV0YWluX3Vua25vd25fZmllbGRzKCkpOwotICAgIH0KICAgICBpZiAoZnJvbS5oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSkgewogICAgICAgc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGZyb20uamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSk7CiAgICAgfQorICAgIGlmIChmcm9tLmhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkpIHsKKyAgICAgIHNldF9qYXZhX3N0cmluZ19jaGVja191dGY4KGZyb20uamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpKTsKKyAgICB9CiAgICAgaWYgKGZyb20uaGFzX29wdGltaXplX2ZvcigpKSB7CiAgICAgICBzZXRfb3B0aW1pemVfZm9yKGZyb20ub3B0aW1pemVfZm9yKCkpOwogICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfZ29fcGFja2FnZSgpKSB7CisgICAgICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgICAgIGdvX3BhY2thZ2VfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5nb19wYWNrYWdlXyk7CisgICAgfQogICAgIGlmIChmcm9tLmhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkpIHsKICAgICAgIHNldF9jY19nZW5lcmljX3NlcnZpY2VzKGZyb20uY2NfZ2VuZXJpY19zZXJ2aWNlcygpKTsKICAgICB9CisgIH0KKyAgaWYgKGZyb20uX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSkgewogICAgICAgc2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhmcm9tLmphdmFfZ2VuZXJpY19zZXJ2aWNlcygpKTsKICAgICB9Ci0gIH0KLSAgaWYgKGZyb20uX2hhc19iaXRzX1s4IC8gMzJdICYgKDB4ZmZ1IDw8ICg4ICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkpIHsKICAgICAgIHNldF9weV9nZW5lcmljX3NlcnZpY2VzKGZyb20ucHlfZ2VuZXJpY19zZXJ2aWNlcygpKTsKICAgICB9CisgICAgaWYgKGZyb20uaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgICAgc2V0X2RlcHJlY2F0ZWQoZnJvbS5kZXByZWNhdGVkKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfY2NfZW5hYmxlX2FyZW5hcygpKSB7CisgICAgICBzZXRfY2NfZW5hYmxlX2FyZW5hcyhmcm9tLmNjX2VuYWJsZV9hcmVuYXMoKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19vYmpjX2NsYXNzX3ByZWZpeCgpKSB7CisgICAgICBzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7CisgICAgICBvYmpjX2NsYXNzX3ByZWZpeF8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLm9iamNfY2xhc3NfcHJlZml4Xyk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19jc2hhcnBfbmFtZXNwYWNlKCkpIHsKKyAgICAgIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOworICAgICAgY3NoYXJwX25hbWVzcGFjZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmNzaGFycF9uYW1lc3BhY2VfKTsKKyAgICB9CiAgIH0KICAgX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShmcm9tLl9leHRlbnNpb25zXyk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIEZpbGVPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIHZvaWQgRmlsZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiBib29sIEZpbGVPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCisKKyAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT51bmludGVycHJldGVkX29wdGlvbigpKSkgcmV0dXJuIGZhbHNlOworCiAgIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmlsZU9wdGlvbnM6OlN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgc3RkOjpzd2FwKGphdmFfcGFja2FnZV8sIG90aGVyLT5qYXZhX3BhY2thZ2VfKTsKLSAgICBzdGQ6OnN3YXAoamF2YV9vdXRlcl9jbGFzc25hbWVfLCBvdGhlci0+amF2YV9vdXRlcl9jbGFzc25hbWVfKTsKLSAgICBzdGQ6OnN3YXAoamF2YV9tdWx0aXBsZV9maWxlc18sIG90aGVyLT5qYXZhX211bHRpcGxlX2ZpbGVzXyk7Ci0gICAgc3RkOjpzd2FwKHJldGFpbl91bmtub3duX2ZpZWxkc18sIG90aGVyLT5yZXRhaW5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfLCBvdGhlci0+amF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfKTsKLSAgICBzdGQ6OnN3YXAob3B0aW1pemVfZm9yXywgb3RoZXItPm9wdGltaXplX2Zvcl8pOwotICAgIHN0ZDo6c3dhcChjY19nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPmNjX2dlbmVyaWNfc2VydmljZXNfKTsKLSAgICBzdGQ6OnN3YXAoamF2YV9nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPmphdmFfZ2VuZXJpY19zZXJ2aWNlc18pOwotICAgIHN0ZDo6c3dhcChweV9nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPnB5X2dlbmVyaWNfc2VydmljZXNfKTsKLSAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBGaWxlT3B0aW9uczo6SW50ZXJuYWxTd2FwKEZpbGVPcHRpb25zKiBvdGhlcikgeworICBqYXZhX3BhY2thZ2VfLlN3YXAoJm90aGVyLT5qYXZhX3BhY2thZ2VfKTsKKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlN3YXAoJm90aGVyLT5qYXZhX291dGVyX2NsYXNzbmFtZV8pOworICBzdGQ6OnN3YXAoamF2YV9tdWx0aXBsZV9maWxlc18sIG90aGVyLT5qYXZhX211bHRpcGxlX2ZpbGVzXyk7CisgIHN0ZDo6c3dhcChqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8sIG90aGVyLT5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8pOworICBzdGQ6OnN3YXAoamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8sIG90aGVyLT5qYXZhX3N0cmluZ19jaGVja191dGY4Xyk7CisgIHN0ZDo6c3dhcChvcHRpbWl6ZV9mb3JfLCBvdGhlci0+b3B0aW1pemVfZm9yXyk7CisgIGdvX3BhY2thZ2VfLlN3YXAoJm90aGVyLT5nb19wYWNrYWdlXyk7CisgIHN0ZDo6c3dhcChjY19nZW5lcmljX3NlcnZpY2VzXywgb3RoZXItPmNjX2dlbmVyaWNfc2VydmljZXNfKTsKKyAgc3RkOjpzd2FwKGphdmFfZ2VuZXJpY19zZXJ2aWNlc18sIG90aGVyLT5qYXZhX2dlbmVyaWNfc2VydmljZXNfKTsKKyAgc3RkOjpzd2FwKHB5X2dlbmVyaWNfc2VydmljZXNfLCBvdGhlci0+cHlfZ2VuZXJpY19zZXJ2aWNlc18pOworICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7CisgIHN0ZDo6c3dhcChjY19lbmFibGVfYXJlbmFzXywgb3RoZXItPmNjX2VuYWJsZV9hcmVuYXNfKTsKKyAgb2JqY19jbGFzc19wcmVmaXhfLlN3YXAoJm90aGVyLT5vYmpjX2NsYXNzX3ByZWZpeF8pOworICBjc2hhcnBfbmFtZXNwYWNlXy5Td2FwKCZvdGhlci0+Y3NoYXJwX25hbWVzcGFjZV8pOworICB1bmludGVycHJldGVkX29wdGlvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWxlT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC00ODY3LDM3ICs4Nzk2LDU2NiBAQAogICByZXR1cm4gbWV0YWRhdGE7CiB9CiAKKyNpZiBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKy8vIEZpbGVPcHRpb25zCisKKy8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX3BhY2thZ2UgPSAxOworYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfcGFja2FnZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX3BhY2thZ2UoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9wYWNrYWdlKCkgeworICBqYXZhX3BhY2thZ2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVPcHRpb25zOjpqYXZhX3BhY2thZ2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKKyAgcmV0dXJuIGphdmFfcGFja2FnZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKKyAgamF2YV9wYWNrYWdlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2phdmFfcGFja2FnZSgpOworICBqYXZhX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQorfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CisgIGphdmFfcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKK30KKyA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9qYXZhX3BhY2thZ2UoKSB7CisgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCisgIHJldHVybiBqYXZhX3BhY2thZ2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfamF2YV9wYWNrYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQorICBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7CisgIHJldHVybiBqYXZhX3BhY2thZ2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9qYXZhX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogamF2YV9wYWNrYWdlKSB7CisgIGlmIChqYXZhX3BhY2thZ2UgIT0gTlVMTCkgeworICAgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOworICB9CisgIGphdmFfcGFja2FnZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGphdmFfcGFja2FnZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBqYXZhX291dGVyX2NsYXNzbmFtZSA9IDg7Citib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmphdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKKyAgcmV0dXJuIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQorfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQorfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQorfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICBzZXRfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKKyAgcmV0dXJuIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCisgIGNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICByZXR1cm4gamF2YV9vdXRlcl9jbGFzc25hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9qYXZhX291dGVyX2NsYXNzbmFtZSg6OnN0ZDo6c3RyaW5nKiBqYXZhX291dGVyX2NsYXNzbmFtZSkgeworICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKKyAgfQorICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGphdmFfb3V0ZXJfY2xhc3NuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQorfQorCisvLyBvcHRpb25hbCBib29sIGphdmFfbXVsdGlwbGVfZmlsZXMgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfbXVsdGlwbGVfZmlsZXMoKSB7CisgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gZmFsc2U7CisgIGNsZWFyX2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7Cit9CisgYm9vbCBGaWxlT3B0aW9uczo6amF2YV9tdWx0aXBsZV9maWxlcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9tdWx0aXBsZV9maWxlcykKKyAgcmV0dXJuIGphdmFfbXVsdGlwbGVfZmlsZXNfOworfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX211bHRpcGxlX2ZpbGVzKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX211bHRpcGxlX2ZpbGVzKCk7CisgIGphdmFfbXVsdGlwbGVfZmlsZXNfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfbXVsdGlwbGVfZmlsZXMpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2ggPSAyMCBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQordm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgeworICBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7Cit9CisgYm9vbCBGaWxlT3B0aW9uczo6amF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKQorICByZXR1cm4gamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfOworfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKKyAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKQorfQorCisvLyBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgRmlsZU9wdGlvbnM6Omhhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSB7CisgIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfID0gZmFsc2U7CisgIGNsZWFyX2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCk7Cit9CisgYm9vbCBGaWxlT3B0aW9uczo6amF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9zdHJpbmdfY2hlY2tfdXRmOCkKKyAgcmV0dXJuIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfOworfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3N0cmluZ19jaGVja191dGY4KGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19qYXZhX3N0cmluZ19jaGVja191dGY4KCk7CisgIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjhfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfc3RyaW5nX2NoZWNrX3V0ZjgpCit9CisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07Citib29sIEZpbGVPcHRpb25zOjpoYXNfb3B0aW1pemVfZm9yKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDIwdSkgIT0gMDsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfb3B0aW1pemVfZm9yKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMjB1OworfQordm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX29wdGltaXplX2ZvcigpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9vcHRpbWl6ZV9mb3IoKSB7CisgIG9wdGltaXplX2Zvcl8gPSAxOworICBjbGVhcl9oYXNfb3B0aW1pemVfZm9yKCk7Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgRmlsZU9wdGlvbnM6Om9wdGltaXplX2ZvcigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub3B0aW1pemVfZm9yKQorICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlID4ob3B0aW1pemVfZm9yXyk7Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X29wdGltaXplX2Zvcig6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSB2YWx1ZSkgeworICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSkpOworICBzZXRfaGFzX29wdGltaXplX2ZvcigpOworICBvcHRpbWl6ZV9mb3JfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9wdGltaXplX2ZvcikKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKK2Jvb2wgRmlsZU9wdGlvbnM6Omhhc19nb19wYWNrYWdlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfZ29fcGFja2FnZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19nb19wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2dvX3BhY2thZ2UoKSB7CisgIGdvX3BhY2thZ2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX2dvX3BhY2thZ2UoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6Z29fcGFja2FnZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKKyAgcmV0dXJuIGdvX3BhY2thZ2VfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKK30KKyB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQorfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9nb19wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgZ29fcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCit9CisgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfZ29fcGFja2FnZSgpIHsKKyAgc2V0X2hhc19nb19wYWNrYWdlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQorICByZXR1cm4gZ29fcGFja2FnZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9nb19wYWNrYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKKyAgY2xlYXJfaGFzX2dvX3BhY2thZ2UoKTsKKyAgcmV0dXJuIGdvX3BhY2thZ2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9nb19wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGdvX3BhY2thZ2UpIHsKKyAgaWYgKGdvX3BhY2thZ2UgIT0gTlVMTCkgeworICAgIHNldF9oYXNfZ29fcGFja2FnZSgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7CisgIH0KKyAgZ29fcGFja2FnZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGdvX3BhY2thZ2UpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07Citib29sIEZpbGVPcHRpb25zOjpoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jY19nZW5lcmljX3NlcnZpY2VzKCkgeworICBjY19nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOworICBjbGVhcl9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOworfQorIGJvb2wgRmlsZU9wdGlvbnM6OmNjX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2dlbmVyaWNfc2VydmljZXMpCisgIHJldHVybiBjY19nZW5lcmljX3NlcnZpY2VzXzsKK30KKyB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY2NfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpOworICBjY19nZW5lcmljX3NlcnZpY2VzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19nZW5lcmljX3NlcnZpY2VzKQorfQorCisvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJpY19zZXJ2aWNlcyA9IDE3IFtkZWZhdWx0ID0gZmFsc2VdOworYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDEwMHUpICE9IDA7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAxMDB1OworfQordm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgeworICBqYXZhX2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIGNsZWFyX2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKK30KKyBib29sIEZpbGVPcHRpb25zOjpqYXZhX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJpY19zZXJ2aWNlcykKKyAgcmV0dXJuIGphdmFfZ2VuZXJpY19zZXJ2aWNlc187Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIGphdmFfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9nZW5lcmljX3NlcnZpY2VzKQorfQorCisvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgRmlsZU9wdGlvbnM6Omhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMjAwdSkgIT0gMDsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMjAwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMjAwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX3B5X2dlbmVyaWNfc2VydmljZXMoKSB7CisgIHB5X2dlbmVyaWNfc2VydmljZXNfID0gZmFsc2U7CisgIGNsZWFyX2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7Cit9CisgYm9vbCBGaWxlT3B0aW9uczo6cHlfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMucHlfZ2VuZXJpY19zZXJ2aWNlcykKKyAgcmV0dXJuIHB5X2dlbmVyaWNfc2VydmljZXNfOworfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9weV9nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19weV9nZW5lcmljX3NlcnZpY2VzKCk7CisgIHB5X2dlbmVyaWNfc2VydmljZXNfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnB5X2dlbmVyaWNfc2VydmljZXMpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDIzIFtkZWZhdWx0ID0gZmFsc2VdOworYm9vbCBGaWxlT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDA0MDB1KSAhPSAwOworfQordm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDA0MDB1OworfQordm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDA0MDB1OworfQordm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKK30KKyBib29sIEZpbGVPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gZGVwcmVjYXRlZF87Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZGVwcmVjYXRlZCkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQgPSBmYWxzZV07Citib29sIEZpbGVPcHRpb25zOjpoYXNfY2NfZW5hYmxlX2FyZW5hcygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDgwMHUpICE9IDA7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDgwMHU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY2NfZW5hYmxlX2FyZW5hcygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDgwMHU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jY19lbmFibGVfYXJlbmFzKCkgeworICBjY19lbmFibGVfYXJlbmFzXyA9IGZhbHNlOworICBjbGVhcl9oYXNfY2NfZW5hYmxlX2FyZW5hcygpOworfQorIGJvb2wgRmlsZU9wdGlvbnM6OmNjX2VuYWJsZV9hcmVuYXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2VuYWJsZV9hcmVuYXMpCisgIHJldHVybiBjY19lbmFibGVfYXJlbmFzXzsKK30KKyB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY2NfZW5hYmxlX2FyZW5hcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfY2NfZW5hYmxlX2FyZW5hcygpOworICBjY19lbmFibGVfYXJlbmFzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19lbmFibGVfYXJlbmFzKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKK2Jvb2wgRmlsZU9wdGlvbnM6Omhhc19vYmpjX2NsYXNzX3ByZWZpeCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMTAwMHUpICE9IDA7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDEwMDB1OworfQordm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAxMDAwdTsKK30KK3ZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX29iamNfY2xhc3NfcHJlZml4KCkgeworICBvYmpjX2NsYXNzX3ByZWZpeF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6b2JqY19jbGFzc19wcmVmaXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXhfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpbGVPcHRpb25zOjpzZXRfb2JqY19jbGFzc19wcmVmaXgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOworICBvYmpjX2NsYXNzX3ByZWZpeF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgb2JqY19jbGFzc19wcmVmaXhfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7CisgIG9iamNfY2xhc3NfcHJlZml4Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCit9CisgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfb2JqY19jbGFzc19wcmVmaXgoKSB7CisgIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXhfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2Vfb2JqY19jbGFzc19wcmVmaXgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCkKKyAgY2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7CisgIHJldHVybiBvYmpjX2NsYXNzX3ByZWZpeF8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEZpbGVPcHRpb25zOjpzZXRfYWxsb2NhdGVkX29iamNfY2xhc3NfcHJlZml4KDo6c3RkOjpzdHJpbmcqIG9iamNfY2xhc3NfcHJlZml4KSB7CisgIGlmIChvYmpjX2NsYXNzX3ByZWZpeCAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOworICB9CisgIG9iamNfY2xhc3NfcHJlZml4Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgb2JqY19jbGFzc19wcmVmaXgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7Citib29sIEZpbGVPcHRpb25zOjpoYXNfY3NoYXJwX25hbWVzcGFjZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMjAwMHUpICE9IDA7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMjAwMHU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMjAwMHU7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jc2hhcnBfbmFtZXNwYWNlKCkgeworICBjc2hhcnBfbmFtZXNwYWNlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmNzaGFycF9uYW1lc3BhY2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCisgIHJldHVybiBjc2hhcnBfbmFtZXNwYWNlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisgIGNzaGFycF9uYW1lc3BhY2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCit9Cisgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisgIGNzaGFycF9uYW1lc3BhY2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKK30KKyB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY3NoYXJwX25hbWVzcGFjZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisgIGNzaGFycF9uYW1lc3BhY2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQorfQorIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2NzaGFycF9uYW1lc3BhY2UoKSB7CisgIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKKyAgcmV0dXJuIGNzaGFycF9uYW1lc3BhY2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfY3NoYXJwX25hbWVzcGFjZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCisgIGNsZWFyX2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisgIHJldHVybiBjc2hhcnBfbmFtZXNwYWNlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfY3NoYXJwX25hbWVzcGFjZSg6OnN0ZDo6c3RyaW5nKiBjc2hhcnBfbmFtZXNwYWNlKSB7CisgIGlmIChjc2hhcnBfbmFtZXNwYWNlICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOworICB9CisgIGNzaGFycF9uYW1lc3BhY2VfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBjc2hhcnBfbmFtZXNwYWNlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2ludCBGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9Cit2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmlsZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmlsZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorRmlsZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IGludCBNZXNzYWdlT3B0aW9uczo6a01lc3NhZ2VTZXRXaXJlRm9ybWF0RmllbGROdW1iZXI7CiBjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtOb1N0YW5kYXJkRGVzY3JpcHRvckFjY2Vzc29yRmllbGROdW1iZXI7Citjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtEZXByZWNhdGVkRmllbGROdW1iZXI7Citjb25zdCBpbnQgTWVzc2FnZU9wdGlvbnM6OmtNYXBFbnRyeUZpZWxkTnVtYmVyOwogY29uc3QgaW50IE1lc3NhZ2VPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogTWVzc2FnZU9wdGlvbnM6Ok1lc3NhZ2VPcHRpb25zKCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewogICBTaGFyZWRDdG9yKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCiB9CiAKIHZvaWQgTWVzc2FnZU9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKIH0KIAogTWVzc2FnZU9wdGlvbnM6Ok1lc3NhZ2VPcHRpb25zKGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOwogICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKIH0KIAogdm9pZCBNZXNzYWdlT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKICAgX2NhY2hlZF9zaXplXyA9IDA7CiAgIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZhbHNlOwogICBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXyA9IGZhbHNlOworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBtYXBfZW50cnlfID0gZmFsc2U7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CiB9CiAKIE1lc3NhZ2VPcHRpb25zOjp+TWVzc2FnZU9wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKICAgU2hhcmVkRHRvcigpOwogfQogCkBAIC00OTIzLDE2NSArOTM4MSwyNjUgQEAKIAogTWVzc2FnZU9wdGlvbnMqIE1lc3NhZ2VPcHRpb25zOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLU1lc3NhZ2VPcHRpb25zKiBNZXNzYWdlT3B0aW9uczo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IE1lc3NhZ2VPcHRpb25zOworTWVzc2FnZU9wdGlvbnMqIE1lc3NhZ2VPcHRpb25zOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgTWVzc2FnZU9wdGlvbnMqIG4gPSBuZXcgTWVzc2FnZU9wdGlvbnM7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBNZXNzYWdlT3B0aW9uczo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCiAgIF9leHRlbnNpb25zXy5DbGVhcigpOwotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewotICAgIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IGZhbHNlOwotICAgIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfID0gZmFsc2U7Ci0gIH0KKyNpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgcHVzaCIpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBpZ25vcmVkIFwiLVdpbnZhbGlkLW9mZnNldG9mXCIiKSBcCisgIF9fYnVpbHRpbl9vZmZzZXRvZihNZXNzYWdlT3B0aW9ucywgZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCisjZWxzZQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKKyAgJnJlaW50ZXJwcmV0X2Nhc3Q8TWVzc2FnZU9wdGlvbnMqPigxNiktPmYpCisjZW5kaWYKKworI2RlZmluZSBaUl8oZmlyc3QsIGxhc3QpIGRvIHtcCisgIDo6bWVtc2V0KCZmaXJzdCwgMCxcCisgICAgICAgICAgIFpSX0hFTFBFUl8obGFzdCkgLSBaUl9IRUxQRVJfKGZpcnN0KSArIHNpemVvZihsYXN0KSk7XAorfSB3aGlsZSAoMCkKKworICBaUl8obWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfLCBtYXBfZW50cnlfKTsKKworI3VuZGVmIFpSX0hFTFBFUl8KKyN1bmRlZiBaUl8KKwogICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBNZXNzYWdlT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDE2MzgzKTsKKyAgICB0YWcgPSBwLmZpcnN0OworICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewogICAgICAgLy8gb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgICBjYXNlIDE6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gOCkgewogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKSkpOwogICAgICAgICAgIHNldF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3I7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTYpIHsKICAgICAgICAgIHBhcnNlX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3I6CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKICAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKICAgICAgICAgICAgICAgICAgaW5wdXQsICZub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXykpKTsKICAgICAgICAgICBzZXRfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMjQpKSBnb3RvIHBhcnNlX2RlcHJlY2F0ZWQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICh0YWcgPT0gMjQpIHsKKyAgICAgICAgIHBhcnNlX2RlcHJlY2F0ZWQ6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZkZXByZWNhdGVkXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU2KSkgZ290byBwYXJzZV9tYXBfZW50cnk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CisgICAgICBjYXNlIDc6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA1NikgeworICAgICAgICAgcGFyc2VfbWFwX2VudHJ5OgorICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmbWFwX2VudHJ5XykpKTsKKyAgICAgICAgICBzZXRfaGFzX21hcF9lbnRyeSgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKICAgICAgIGNhc2UgOTk5OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSA3OTk0KSB7CiAgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQogICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICAgICAgfQogICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKICAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCiAgIHJldHVybiB0cnVlOworZmFpbHVyZToKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX2ZhaWx1cmU6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQorICByZXR1cm4gZmFsc2U7CiAjdW5kZWYgRE9fCiB9CiAKIHZvaWQgTWVzc2FnZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQogICAvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKICAgaWYgKGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxLCB0aGlzLT5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CiAgIGlmIChoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgyLCB0aGlzLT5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCksIG91dHB1dCk7CiAgIH0KLSAgCisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGJvb2wgbWFwX2VudHJ5ID0gNzsKKyAgaWYgKGhhc19tYXBfZW50cnkoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woNywgdGhpcy0+bWFwX2VudHJ5KCksIG91dHB1dCk7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIE1lc3NhZ2VPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKICAgLy8gb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CiAgIGlmIChoYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDEsIHRoaXMtPm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKICAgaWYgKGhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCksIHRhcmdldCk7CiAgIH0KLSAgCisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzLCB0aGlzLT5kZXByZWNhdGVkKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CisgIGlmIChoYXNfbWFwX2VudHJ5KCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSg3LCB0aGlzLT5tYXBfZW50cnkoKSwgdGFyZ2V0KTsKKyAgfQorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlTWVzc2FnZU5vVmlydHVhbFRvQXJyYXkoCiAgICAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCiAgIHRhcmdldCA9IF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgICAgMTAwMCwgNTM2ODcwOTEyLCB0YXJnZXQpOwotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgTWVzc2FnZU9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKICAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKworICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgMTV1KSB7CiAgICAgLy8gb3B0aW9uYWwgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgaWYgKGhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvciA9IDIgW2RlZmF1bHQgPSBmYWxzZV07CiAgICAgaWYgKGhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CiAgICAgfQotICAgIAorCisgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CisgICAgaWYgKGhhc19tYXBfZW50cnkoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKyAgICB9CisKICAgfQogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKQEAgLTUwOTAsMTIgKzk2NDgsMTIgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOwogICB9Ci0gIAorCiAgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewogICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCiAgICAgICAgIHVua25vd25fZmllbGRzKCkpOwogICB9CiAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CkBAIC01MTA1LDE5ICs5NjYzLDIzIEBACiB9CiAKIHZvaWQgTWVzc2FnZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgTWVzc2FnZU9wdGlvbnMqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBNZXNzYWdlT3B0aW9ucyo+KAotICAgICAgJmZyb20pOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBNZXNzYWdlT3B0aW9ucyogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IE1lc3NhZ2VPcHRpb25zPigKKyAgICAgICAgICAmZnJvbSk7CiAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIE1lc3NhZ2VPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CiAgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKICAgICBpZiAoZnJvbS5oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewpAQCAtNTEyNiw0MiArOTY4OCw1NCBAQAogICAgIGlmIChmcm9tLmhhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkpIHsKICAgICAgIHNldF9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKGZyb20ubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpKTsKICAgICB9CisgICAgaWYgKGZyb20uaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgICAgc2V0X2RlcHJlY2F0ZWQoZnJvbS5kZXByZWNhdGVkKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfbWFwX2VudHJ5KCkpIHsKKyAgICAgIHNldF9tYXBfZW50cnkoZnJvbS5tYXBfZW50cnkoKSk7CisgICAgfQogICB9CiAgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIH0KIH0KIAogdm9pZCBNZXNzYWdlT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIE1lc3NhZ2VPcHRpb25zOjpDb3B5RnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBNZXNzYWdlT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAorCisgIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oKSkpIHJldHVybiBmYWxzZTsKKwogICBpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIE1lc3NhZ2VPcHRpb25zOjpTd2FwKE1lc3NhZ2VPcHRpb25zKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHN0ZDo6c3dhcChtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8sIG90aGVyLT5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8pOwotICAgIHN0ZDo6c3dhcChub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yXywgb3RoZXItPm5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfKTsKLSAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBNZXNzYWdlT3B0aW9uczo6SW50ZXJuYWxTd2FwKE1lc3NhZ2VPcHRpb25zKiBvdGhlcikgeworICBzdGQ6OnN3YXAobWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfLCBvdGhlci0+bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfKTsKKyAgc3RkOjpzd2FwKG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3JfLCBvdGhlci0+bm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8pOworICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7CisgIHN0ZDo6c3dhcChtYXBfZW50cnlfLCBvdGhlci0+bWFwX2VudHJ5Xyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIE1lc3NhZ2VPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTUxNzIsNiArOTc0NiwxMzYgQEAKICAgcmV0dXJuIG1ldGFkYXRhOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBNZXNzYWdlT3B0aW9ucworCisvLyBvcHRpb25hbCBib29sIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgeworICBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7Cit9CisgYm9vbCBNZXNzYWdlT3B0aW9uczo6bWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQorICByZXR1cm4gbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfOworfQorIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKKyAgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXRfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KQorfQorCisvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOworYm9vbCBNZXNzYWdlT3B0aW9uczo6aGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQordm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQordm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIHsKKyAgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKK30KKyBib29sIE1lc3NhZ2VPcHRpb25zOjpub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKQorICByZXR1cm4gbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl87Cit9Cisgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKKyAgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcikKK30KKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19kZXByZWNhdGVkKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX2RlcHJlY2F0ZWQoKSB7CisgIGRlcHJlY2F0ZWRfID0gZmFsc2U7CisgIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7Cit9CisgYm9vbCBNZXNzYWdlT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMuZGVwcmVjYXRlZCkKKyAgcmV0dXJuIGRlcHJlY2F0ZWRfOworfQorIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19kZXByZWNhdGVkKCk7CisgIGRlcHJlY2F0ZWRfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLmRlcHJlY2F0ZWQpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgbWFwX2VudHJ5ID0gNzsKK2Jvb2wgTWVzc2FnZU9wdGlvbnM6Omhhc19tYXBfZW50cnkoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworfQordm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19tYXBfZW50cnkoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7Cit9Cit2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9oYXNfbWFwX2VudHJ5KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX21hcF9lbnRyeSgpIHsKKyAgbWFwX2VudHJ5XyA9IGZhbHNlOworICBjbGVhcl9oYXNfbWFwX2VudHJ5KCk7Cit9CisgYm9vbCBNZXNzYWdlT3B0aW9uczo6bWFwX2VudHJ5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5tYXBfZW50cnkpCisgIHJldHVybiBtYXBfZW50cnlfOworfQorIHZvaWQgTWVzc2FnZU9wdGlvbnM6OnNldF9tYXBfZW50cnkoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX21hcF9lbnRyeSgpOworICBtYXBfZW50cnlfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeSkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW50IE1lc3NhZ2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK3ZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBNZXNzYWdlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBNZXNzYWdlT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCitNZXNzYWdlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK01lc3NhZ2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKQEAgLTUxOTAsNTMgKzk4OTQsODEgQEAKICAgfQogfQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OlNUUklORzsKIGNvbnN0IEZpZWxkT3B0aW9uc19DVHlwZSBGaWVsZE9wdGlvbnM6OkNPUkQ7CiBjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpTVFJJTkdfUElFQ0U7CiBjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpDVHlwZV9NSU47CiBjb25zdCBGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpDVHlwZV9NQVg7CiBjb25zdCBpbnQgRmllbGRPcHRpb25zOjpDVHlwZV9BUlJBWVNJWkU7Ci0jZW5kaWYgIC8vIF9NU0NfVkVSCi0jaWZuZGVmIF9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCitjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yKiBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3IoKSB7CisgIHByb3RvYnVmX0Fzc2lnbkRlc2NyaXB0b3JzT25jZSgpOworICByZXR1cm4gRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yXzsKK30KK2Jvb2wgRmllbGRPcHRpb25zX0pTVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgeworICBzd2l0Y2godmFsdWUpIHsKKyAgICBjYXNlIDA6CisgICAgY2FzZSAxOgorICAgIGNhc2UgMjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGRlZmF1bHQ6CisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KK30KKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCitjb25zdCBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6SlNfTk9STUFMOworY29uc3QgRmllbGRPcHRpb25zX0pTVHlwZSBGaWVsZE9wdGlvbnM6OkpTX1NUUklORzsKK2NvbnN0IEZpZWxkT3B0aW9uc19KU1R5cGUgRmllbGRPcHRpb25zOjpKU19OVU1CRVI7Citjb25zdCBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6SlNUeXBlX01JTjsKK2NvbnN0IEZpZWxkT3B0aW9uc19KU1R5cGUgRmllbGRPcHRpb25zOjpKU1R5cGVfTUFYOworY29uc3QgaW50IEZpZWxkT3B0aW9uczo6SlNUeXBlX0FSUkFZU0laRTsKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IEZpZWxkT3B0aW9uczo6a0N0eXBlRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmllbGRPcHRpb25zOjprUGFja2VkRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGRPcHRpb25zOjprSnN0eXBlRmllbGROdW1iZXI7Citjb25zdCBpbnQgRmllbGRPcHRpb25zOjprTGF6eUZpZWxkTnVtYmVyOwogY29uc3QgaW50IEZpZWxkT3B0aW9uczo6a0RlcHJlY2F0ZWRGaWVsZE51bWJlcjsKLWNvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtFeHBlcmltZW50YWxNYXBLZXlGaWVsZE51bWJlcjsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnM6OmtXZWFrRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRmllbGRPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogRmllbGRPcHRpb25zOjpGaWVsZE9wdGlvbnMoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCiB9CiAKIHZvaWQgRmllbGRPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIEZpZWxkT3B0aW9uczo6RmllbGRPcHRpb25zKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQogfQogCiB2b2lkIEZpZWxkT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKICAgX2NhY2hlZF9zaXplXyA9IDA7CiAgIGN0eXBlXyA9IDA7CiAgIHBhY2tlZF8gPSBmYWxzZTsKKyAganN0eXBlXyA9IDA7CisgIGxhenlfID0gZmFsc2U7CiAgIGRlcHJlY2F0ZWRfID0gZmFsc2U7Ci0gIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgd2Vha18gPSBmYWxzZTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogRmllbGRPcHRpb25zOjp+RmllbGRPcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgRmllbGRPcHRpb25zOjpTaGFyZWREdG9yKCkgewotICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgZXhwZXJpbWVudGFsX21hcF9rZXlfOwotICB9CiAgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CiAgIH0KIH0KQEAgLTUyNTgsMzcgKzk5OTAsNjEgQEAKIAogRmllbGRPcHRpb25zKiBGaWVsZE9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotRmllbGRPcHRpb25zKiBGaWVsZE9wdGlvbnM6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBGaWVsZE9wdGlvbnM7CitGaWVsZE9wdGlvbnMqIEZpZWxkT3B0aW9uczo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIEZpZWxkT3B0aW9ucyogbiA9IG5ldyBGaWVsZE9wdGlvbnM7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBGaWVsZE9wdGlvbnM6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKICAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7Ci0gIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7Ci0gICAgY3R5cGVfID0gMDsKLSAgICBwYWNrZWRfID0gZmFsc2U7Ci0gICAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKLSAgICBpZiAoaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKLSAgICAgIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBleHBlcmltZW50YWxfbWFwX2tleV8tPmNsZWFyKCk7Ci0gICAgICB9Ci0gICAgfQorI2lmIGRlZmluZWQoX19jbGFuZ19fKQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwdXNoIikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIGlnbm9yZWQgXCItV2ludmFsaWQtb2Zmc2V0b2ZcIiIpIFwKKyAgX19idWlsdGluX29mZnNldG9mKEZpZWxkT3B0aW9ucywgZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCisjZWxzZQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKKyAgJnJlaW50ZXJwcmV0X2Nhc3Q8RmllbGRPcHRpb25zKj4oMTYpLT5mKQorI2VuZGlmCisKKyNkZWZpbmUgWlJfKGZpcnN0LCBsYXN0KSBkbyB7XAorICA6Om1lbXNldCgmZmlyc3QsIDAsXAorICAgICAgICAgICBaUl9IRUxQRVJfKGxhc3QpIC0gWlJfSEVMUEVSXyhmaXJzdCkgKyBzaXplb2YobGFzdCkpO1wKK30gd2hpbGUgKDApCisKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDYzdSkgeworICAgIFpSXyhjdHlwZV8sIGpzdHlwZV8pOworICAgIFpSXyhwYWNrZWRfLCB3ZWFrXyk7CiAgIH0KKworI3VuZGVmIFpSX0hFTFBFUl8KKyN1bmRlZiBaUl8KKwogICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBGaWVsZE9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOwogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICBpZiAodGFnID09IDgpIHsKICAgICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKICAgICAgICAgICAgICAgICAgICBpbnQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0+KApAQCAtNTI5OSwyMTIgKzEwMDU1LDI3OSBAQAogICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5BZGRWYXJpbnQoMSwgdmFsdWUpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTYpKSBnb3RvIHBhcnNlX3BhY2tlZDsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOwogICAgICAgY2FzZSAyOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICBpZiAodGFnID09IDE2KSB7CiAgICAgICAgICBwYXJzZV9wYWNrZWQ6CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKICAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKICAgICAgICAgICAgICAgICAgaW5wdXQsICZwYWNrZWRfKSkpOwogICAgICAgICAgIHNldF9oYXNfcGFja2VkKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9kZXByZWNhdGVkOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOwogICAgICAgY2FzZSAzOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICBpZiAodGFnID09IDI0KSB7CiAgICAgICAgICBwYXJzZV9kZXByZWNhdGVkOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmZGVwcmVjYXRlZF8pKSk7CiAgICAgICAgICAgc2V0X2hhc19kZXByZWNhdGVkKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc0KSkgZ290byBwYXJzZV9leHBlcmltZW50YWxfbWFwX2tleTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDApKSBnb3RvIHBhcnNlX2xhenk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCi0gICAgICAvLyBvcHRpb25hbCBzdHJpbmcgZXhwZXJpbWVudGFsX21hcF9rZXkgPSA5OwotICAgICAgY2FzZSA5OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX2V4cGVyaW1lbnRhbF9tYXBfa2V5OgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKLSAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9leHBlcmltZW50YWxfbWFwX2tleSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKLSAgICAgICAgICAgIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkuZGF0YSgpLCB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworCisgICAgICAvLyBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSA1OiB7CisgICAgICAgIGlmICh0YWcgPT0gNDApIHsKKyAgICAgICAgIHBhcnNlX2xhenk6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZsYXp5XykpKTsKKyAgICAgICAgICBzZXRfaGFzX2xhenkoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNDgpKSBnb3RvIHBhcnNlX2pzdHlwZTsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKKyAgICAgIGNhc2UgNjogeworICAgICAgICBpZiAodGFnID09IDQ4KSB7CisgICAgICAgICBwYXJzZV9qc3R5cGU6CisgICAgICAgICAgaW50IHZhbHVlOworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgaW50LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpKTsKKyAgICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQodmFsdWUpKSB7CisgICAgICAgICAgICBzZXRfanN0eXBlKHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19KU1R5cGUgPih2YWx1ZSkpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkFkZFZhcmludCg2LCB2YWx1ZSk7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoODApKSBnb3RvIHBhcnNlX3dlYWs7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMTA6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA4MCkgeworICAgICAgICAgcGFyc2Vfd2VhazoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJndlYWtfKSkpOworICAgICAgICAgIHNldF9oYXNfd2VhaygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKICAgICAgIGNhc2UgOTk5OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSA3OTk0KSB7CiAgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICAgIERPXyhpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7CisgICAgICAgICBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAogICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQogICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICAgICAgfQogICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKICAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBGaWVsZE9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKICAgaWYgKGhhc19jdHlwZSgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bSgKICAgICAgIDEsIHRoaXMtPmN0eXBlKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOwogICBpZiAoaGFzX3BhY2tlZCgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgyLCB0aGlzLT5wYWNrZWQoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOwogICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCBvdXRwdXQpOwogICB9Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgZXhwZXJpbWVudGFsX21hcF9rZXkgPSA5OwotICBpZiAoaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKS5kYXRhKCksIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKLSAgICAgIDksIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCksIG91dHB1dCk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19sYXp5KCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDUsIHRoaXMtPmxhenkoKSwgb3V0cHV0KTsKICAgfQotICAKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07CisgIGlmIChoYXNfanN0eXBlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVFbnVtKAorICAgICAgNiwgdGhpcy0+anN0eXBlKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc193ZWFrKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDEwLCB0aGlzLT53ZWFrKCksIG91dHB1dCk7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBGaWVsZE9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuQ1R5cGUgY3R5cGUgPSAxIFtkZWZhdWx0ID0gU1RSSU5HXTsKICAgaWYgKGhhc19jdHlwZSgpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRW51bVRvQXJyYXkoCiAgICAgICAxLCB0aGlzLT5jdHlwZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKICAgaWYgKGhhc19wYWNrZWQoKSkgewogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xUb0FycmF5KDIsIHRoaXMtPnBhY2tlZCgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CiAgIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOwogICB9Ci0gIAotICAvLyBvcHRpb25hbCBzdHJpbmcgZXhwZXJpbWVudGFsX21hcF9rZXkgPSA5OwotICBpZiAoaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAotICAgICAgdGhpcy0+ZXhwZXJpbWVudGFsX21hcF9rZXkoKS5kYXRhKCksIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIHRhcmdldCA9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAotICAgICAgICA5LCB0aGlzLT5leHBlcmltZW50YWxfbWFwX2tleSgpLCB0YXJnZXQpOworCisgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfbGF6eSgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbFRvQXJyYXkoNSwgdGhpcy0+bGF6eSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCisgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKKyAgaWYgKGhhc19qc3R5cGUoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ub0FycmF5KAorICAgICAgNiwgdGhpcy0+anN0eXBlKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIHdlYWsgPSAxMCBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc193ZWFrKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxMCwgdGhpcy0+d2VhaygpLCB0YXJnZXQpOworICB9CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgRmllbGRPcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiA2M3UpIHsKICAgICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOwogICAgIGlmIChoYXNfY3R5cGUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkVudW1TaXplKHRoaXMtPmN0eXBlKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKICAgICBpZiAoaGFzX3BhY2tlZCgpKSB7CiAgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOwogICAgIH0KLSAgICAKKworICAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkpTVHlwZSBqc3R5cGUgPSA2IFtkZWZhdWx0ID0gSlNfTk9STUFMXTsKKyAgICBpZiAoaGFzX2pzdHlwZSgpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6RW51bVNpemUodGhpcy0+anN0eXBlKCkpOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgbGF6eSA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19sYXp5KCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorCiAgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKICAgICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKICAgICB9Ci0gICAgCi0gICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKLSAgICBpZiAoaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKLSAgICAgIHRvdGFsX3NpemUgKz0gMSArCi0gICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAotICAgICAgICAgIHRoaXMtPmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkpOworCisgICAgLy8gb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc193ZWFrKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CiAgICAgfQotICAgIAorCiAgIH0KICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwogICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CkBAIC01NTEzLDEyICsxMDMzNiwxMiBAQAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6Ok1lc3NhZ2VTaXplTm9WaXJ0dWFsKAogICAgICAgICB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSk7CiAgIH0KLSAgCisKICAgdG90YWxfc2l6ZSArPSBfZXh0ZW5zaW9uc18uQnl0ZVNpemUoKTsKLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTU1MjgsMTkgKzEwMzUxLDIzIEBACiB9CiAKIHZvaWQgRmllbGRPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IEZpZWxkT3B0aW9ucyogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEZpZWxkT3B0aW9ucyo+KAotICAgICAgJmZyb20pOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgRmllbGRPcHRpb25zKiBzb3VyY2UgPSAKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRmllbGRPcHRpb25zPigKKyAgICAgICAgICAmZnJvbSk7CiAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCiAgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwogICB9CiB9CiAKIHZvaWQgRmllbGRPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgRmllbGRPcHRpb25zJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwogICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19jdHlwZSgpKSB7CkBAIC01NTQ5LDUwICsxMDM3Niw2MiBAQAogICAgIGlmIChmcm9tLmhhc19wYWNrZWQoKSkgewogICAgICAgc2V0X3BhY2tlZChmcm9tLnBhY2tlZCgpKTsKICAgICB9CisgICAgaWYgKGZyb20uaGFzX2pzdHlwZSgpKSB7CisgICAgICBzZXRfanN0eXBlKGZyb20uanN0eXBlKCkpOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfbGF6eSgpKSB7CisgICAgICBzZXRfbGF6eShmcm9tLmxhenkoKSk7CisgICAgfQogICAgIGlmIChmcm9tLmhhc19kZXByZWNhdGVkKCkpIHsKICAgICAgIHNldF9kZXByZWNhdGVkKGZyb20uZGVwcmVjYXRlZCgpKTsKICAgICB9Ci0gICAgaWYgKGZyb20uaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkpIHsKLSAgICAgIHNldF9leHBlcmltZW50YWxfbWFwX2tleShmcm9tLmV4cGVyaW1lbnRhbF9tYXBfa2V5KCkpOworICAgIGlmIChmcm9tLmhhc193ZWFrKCkpIHsKKyAgICAgIHNldF93ZWFrKGZyb20ud2VhaygpKTsKICAgICB9CiAgIH0KICAgX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShmcm9tLl9leHRlbnNpb25zXyk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIEZpZWxkT3B0aW9uczo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBGaWVsZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgRmllbGRPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCisKKyAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT51bmludGVycHJldGVkX29wdGlvbigpKSkgcmV0dXJuIGZhbHNlOworCiAgIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgRmllbGRPcHRpb25zOjpTd2FwKEZpZWxkT3B0aW9ucyogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAoY3R5cGVfLCBvdGhlci0+Y3R5cGVfKTsKLSAgICBzdGQ6OnN3YXAocGFja2VkXywgb3RoZXItPnBhY2tlZF8pOwotICAgIHN0ZDo6c3dhcChkZXByZWNhdGVkXywgb3RoZXItPmRlcHJlY2F0ZWRfKTsKLSAgICBzdGQ6OnN3YXAoZXhwZXJpbWVudGFsX21hcF9rZXlfLCBvdGhlci0+ZXhwZXJpbWVudGFsX21hcF9rZXlfKTsKLSAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBGaWVsZE9wdGlvbnM6OkludGVybmFsU3dhcChGaWVsZE9wdGlvbnMqIG90aGVyKSB7CisgIHN0ZDo6c3dhcChjdHlwZV8sIG90aGVyLT5jdHlwZV8pOworICBzdGQ6OnN3YXAocGFja2VkXywgb3RoZXItPnBhY2tlZF8pOworICBzdGQ6OnN3YXAoanN0eXBlXywgb3RoZXItPmpzdHlwZV8pOworICBzdGQ6OnN3YXAobGF6eV8sIG90aGVyLT5sYXp5Xyk7CisgIHN0ZDo6c3dhcChkZXByZWNhdGVkXywgb3RoZXItPmRlcHJlY2F0ZWRfKTsKKyAgc3RkOjpzd2FwKHdlYWtfLCBvdGhlci0+d2Vha18pOworICB1bmludGVycHJldGVkX29wdGlvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBGaWVsZE9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgewpAQCAtNTYwMywzMyArMTA0NDIsMjIxIEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gRmllbGRPcHRpb25zCisKKy8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLkNUeXBlIGN0eXBlID0gMSBbZGVmYXVsdCA9IFNUUklOR107Citib29sIEZpZWxkT3B0aW9uczo6aGFzX2N0eXBlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK3ZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX2N0eXBlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19jdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9Cit2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfY3R5cGUoKSB7CisgIGN0eXBlXyA9IDA7CisgIGNsZWFyX2hhc19jdHlwZSgpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIEZpZWxkT3B0aW9uczo6Y3R5cGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5jdHlwZSkKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSA+KGN0eXBlXyk7Cit9Cisgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9jdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSkgeworICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZCh2YWx1ZSkpOworICBzZXRfaGFzX2N0eXBlKCk7CisgIGN0eXBlXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGUpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKK2Jvb2wgRmllbGRPcHRpb25zOjpoYXNfcGFja2VkKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK3ZvaWQgRmllbGRPcHRpb25zOjpzZXRfaGFzX3BhY2tlZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9oYXNfcGFja2VkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK3ZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9wYWNrZWQoKSB7CisgIHBhY2tlZF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX3BhY2tlZCgpOworfQorIGJvb2wgRmllbGRPcHRpb25zOjpwYWNrZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5wYWNrZWQpCisgIHJldHVybiBwYWNrZWRfOworfQorIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfcGFja2VkKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19wYWNrZWQoKTsKKyAgcGFja2VkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkKQorfQorCisvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07Citib29sIEZpZWxkT3B0aW9uczo6aGFzX2pzdHlwZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9Cit2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19qc3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9Cit2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2pzdHlwZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9Cit2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfanN0eXBlKCkgeworICBqc3R5cGVfID0gMDsKKyAgY2xlYXJfaGFzX2pzdHlwZSgpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSBGaWVsZE9wdGlvbnM6OmpzdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmpzdHlwZSkKKyAgcmV0dXJuIHN0YXRpY19jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19KU1R5cGUgPihqc3R5cGVfKTsKK30KKyB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2pzdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19KU1R5cGUgdmFsdWUpIHsKKyAgYXNzZXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIHNldF9oYXNfanN0eXBlKCk7CisgIGpzdHlwZV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmpzdHlwZSkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgRmllbGRPcHRpb25zOjpoYXNfbGF6eSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9Cit2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19sYXp5KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQordm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19sYXp5KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK3ZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9sYXp5KCkgeworICBsYXp5XyA9IGZhbHNlOworICBjbGVhcl9oYXNfbGF6eSgpOworfQorIGJvb2wgRmllbGRPcHRpb25zOjpsYXp5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKKyAgcmV0dXJuIGxhenlfOworfQorIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfbGF6eShib29sIHZhbHVlKSB7CisgIHNldF9oYXNfbGF6eSgpOworICBsYXp5XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgRmllbGRPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Cit9Cit2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworfQordm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK3ZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQorIGJvb2wgRmllbGRPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuZGVwcmVjYXRlZCkKKyAgcmV0dXJuIGRlcHJlY2F0ZWRfOworfQorIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuZGVwcmVjYXRlZCkKK30KKworLy8gb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07Citib29sIEZpZWxkT3B0aW9uczo6aGFzX3dlYWsoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworfQordm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfd2VhaygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKK30KK3ZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9oYXNfd2VhaygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Cit9Cit2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfd2VhaygpIHsKKyAgd2Vha18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX3dlYWsoKTsKK30KKyBib29sIEZpZWxkT3B0aW9uczo6d2VhaygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLndlYWspCisgIHJldHVybiB3ZWFrXzsKK30KKyB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X3dlYWsoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX3dlYWsoKTsKKyAgd2Vha18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLndlYWspCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2ludCBGaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOworfQordm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRmllbGRPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRmllbGRPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCitGaWVsZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorRmllbGRPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKK2NvbnN0IGludCBFbnVtT3B0aW9uczo6a0FsbG93QWxpYXNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBFbnVtT3B0aW9uczo6a0RlcHJlY2F0ZWRGaWVsZE51bWJlcjsKIGNvbnN0IGludCBFbnVtT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIEVudW1PcHRpb25zOjpFbnVtT3B0aW9ucygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQogfQogCiB2b2lkIEVudW1PcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIEVudW1PcHRpb25zOjpFbnVtT3B0aW9ucyhjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCiB9CiAKIHZvaWQgRW51bU9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBhbGxvd19hbGlhc18gPSBmYWxzZTsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogRW51bU9wdGlvbnM6On5FbnVtT3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQogICBTaGFyZWREdG9yKCk7CiB9CiAKQEAgLTU2NTUsOTkgKzEwNjgyLDIwNiBAQAogCiBFbnVtT3B0aW9ucyogRW51bU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotRW51bU9wdGlvbnMqIEVudW1PcHRpb25zOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgRW51bU9wdGlvbnM7CitFbnVtT3B0aW9ucyogRW51bU9wdGlvbnM6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBFbnVtT3B0aW9ucyogbiA9IG5ldyBFbnVtT3B0aW9uczsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIEVudW1PcHRpb25zOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKICAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAorICBfX2J1aWx0aW5fb2Zmc2V0b2YoRW51bU9wdGlvbnMsIGYpIFwKKyAgX1ByYWdtYSgiY2xhbmcgZGlhZ25vc3RpYyBwb3AiKQorI2Vsc2UKKyNkZWZpbmUgWlJfSEVMUEVSXyhmKSByZWludGVycHJldF9jYXN0PGNoYXIqPihcCisgICZyZWludGVycHJldF9jYXN0PEVudW1PcHRpb25zKj4oMTYpLT5mKQorI2VuZGlmCisKKyNkZWZpbmUgWlJfKGZpcnN0LCBsYXN0KSBkbyB7XAorICA6Om1lbXNldCgmZmlyc3QsIDAsXAorICAgICAgICAgICBaUl9IRUxQRVJfKGxhc3QpIC0gWlJfSEVMUEVSXyhmaXJzdCkgKyBzaXplb2YobGFzdCkpO1wKK30gd2hpbGUgKDApCisKKyAgWlJfKGFsbG93X2FsaWFzXywgZGVwcmVjYXRlZF8pOworCisjdW5kZWYgWlJfSEVMUEVSXworI3VuZGVmIFpSXworCiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQogfQogCiBib29sIEVudW1PcHRpb25zOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7CisgICAgICBjYXNlIDI6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAxNikgeworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgYm9vbCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfQk9PTD4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmYWxsb3dfYWxpYXNfKSkpOworICAgICAgICAgIHNldF9oYXNfYWxsb3dfYWxpYXMoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI0KSkgZ290byBwYXJzZV9kZXByZWNhdGVkOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCisgICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICh0YWcgPT0gMjQpIHsKKyAgICAgICAgIHBhcnNlX2RlcHJlY2F0ZWQ6CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZkZXByZWNhdGVkXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA3OTk0KSB7CisgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX2xvb3BfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZ290byBzdWNjZXNzOwogICAgICAgICB9CiAgICAgICAgIGlmICgoODAwMHUgPD0gdGFnKSkgewogICAgICAgICAgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBFbnVtT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyOworICBpZiAoaGFzX2FsbG93X2FsaWFzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIsIHRoaXMtPmFsbG93X2FsaWFzKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCBvdXRwdXQpOworICB9CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDk5OSwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gRXh0ZW5zaW9uIHJhbmdlIFsxMDAwLCA1MzY4NzA5MTIpCiAgIF9leHRlbnNpb25zXy5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgICAxMDAwLCA1MzY4NzA5MTIsIG91dHB1dCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBFbnVtT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIC8vIG9wdGlvbmFsIGJvb2wgYWxsb3dfYWxpYXMgPSAyOworICBpZiAoaGFzX2FsbG93X2FsaWFzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5hbGxvd19hbGlhcygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzLCB0aGlzLT5kZXByZWNhdGVkKCksIHRhcmdldCk7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAogICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQogICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucykKICAgcmV0dXJuIHRhcmdldDsKIH0KIAogaW50IEVudW1PcHRpb25zOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCiAgIGludCB0b3RhbF9zaXplID0gMDsKLSAgCisKKyAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmIDN1KSB7CisgICAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7CisgICAgaWYgKGhhc19hbGxvd19hbGlhcygpKSB7CisgICAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICAgIH0KKworICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgICAgfQorCisgIH0KICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwogICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKQEAgLTU3NTUsMTIgKzEwODg5LDEyIEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKICAgfQotICAKKwogICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOwotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtNTc3MCw1MyArMTA5MDQsNzEgQEAKIH0KIAogdm9pZCBFbnVtT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBFbnVtT3B0aW9ucyogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IEVudW1PcHRpb25zKj4oCi0gICAgICAmZnJvbSk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGNvbnN0IEVudW1PcHRpb25zKiBzb3VyY2UgPSAKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgRW51bU9wdGlvbnM+KAorICAgICAgICAgICZmcm9tKTsKICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CiAgIH0gZWxzZSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCiAgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwogICB9CiB9CiAKIHZvaWQgRW51bU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwogICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19hbGxvd19hbGlhcygpKSB7CisgICAgICBzZXRfYWxsb3dfYWxpYXMoZnJvbS5hbGxvd19hbGlhcygpKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgICAgc2V0X2RlcHJlY2F0ZWQoZnJvbS5kZXByZWNhdGVkKCkpOworICAgIH0KKyAgfQogICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgRW51bU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBFbnVtT3B0aW9uczo6Q29weUZyb20oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgRW51bU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICBmb3IgKGludCBpID0gMDsgaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQotICAKKworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKSByZXR1cm4gZmFsc2U7CisKICAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBFbnVtT3B0aW9uczo6U3dhcChFbnVtT3B0aW9ucyogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBFbnVtT3B0aW9uczo6SW50ZXJuYWxTd2FwKEVudW1PcHRpb25zKiBvdGhlcikgeworICBzdGQ6OnN3YXAoYWxsb3dfYWxpYXNfLCBvdGhlci0+YWxsb3dfYWxpYXNfKTsKKyAgc3RkOjpzd2FwKGRlcHJlY2F0ZWRfLCBvdGhlci0+ZGVwcmVjYXRlZF8pOworICB1bmludGVycHJldGVkX29wdGlvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBFbnVtT3B0aW9uczo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC01ODI3LDMzICsxMDk3OSwxMjEgQEAKICAgcmV0dXJuIG1ldGFkYXRhOwogfQogCisjaWYgUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCisvLyBFbnVtT3B0aW9ucworCisvLyBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMjsKK2Jvb2wgRW51bU9wdGlvbnM6Omhhc19hbGxvd19hbGlhcygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIEVudW1PcHRpb25zOjpzZXRfaGFzX2FsbG93X2FsaWFzKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfaGFzX2FsbG93X2FsaWFzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK3ZvaWQgRW51bU9wdGlvbnM6OmNsZWFyX2FsbG93X2FsaWFzKCkgeworICBhbGxvd19hbGlhc18gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2FsbG93X2FsaWFzKCk7Cit9CisgYm9vbCBFbnVtT3B0aW9uczo6YWxsb3dfYWxpYXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmFsbG93X2FsaWFzKQorICByZXR1cm4gYWxsb3dfYWxpYXNfOworfQorIHZvaWQgRW51bU9wdGlvbnM6OnNldF9hbGxvd19hbGlhcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfYWxsb3dfYWxpYXMoKTsKKyAgYWxsb3dfYWxpYXNfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmFsbG93X2FsaWFzKQorfQorCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworYm9vbCBFbnVtT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBFbnVtT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQordm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OworfQordm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKK30KKyBib29sIEVudW1PcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gZGVwcmVjYXRlZF87Cit9Cisgdm9pZCBFbnVtT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMuZGVwcmVjYXRlZCkKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworaW50IEVudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK3ZvaWQgRW51bU9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgRW51bU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCitFbnVtT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK0VudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorY29uc3QgaW50IEVudW1WYWx1ZU9wdGlvbnM6OmtEZXByZWNhdGVkRmllbGROdW1iZXI7CiBjb25zdCBpbnQgRW51bVZhbHVlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIEVudW1WYWx1ZU9wdGlvbnM6OkVudW1WYWx1ZU9wdGlvbnMoKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQogfQogCiB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKIH0KIAogRW51bVZhbHVlT3B0aW9uczo6RW51bVZhbHVlT3B0aW9ucyhjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOwogICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQogfQogCiB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBkZXByZWNhdGVkXyA9IGZhbHNlOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwogfQogCiBFbnVtVmFsdWVPcHRpb25zOjp+RW51bVZhbHVlT3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCiAgIFNoYXJlZER0b3IoKTsKIH0KIApAQCAtNTg3OSw5OSArMTExMTksMTU0IEBACiAKIEVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZU9wdGlvbnM6OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotRW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlT3B0aW9uczo6TmV3KCkgY29uc3QgewotICByZXR1cm4gbmV3IEVudW1WYWx1ZU9wdGlvbnM7CitFbnVtVmFsdWVPcHRpb25zKiBFbnVtVmFsdWVPcHRpb25zOjpOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgRW51bVZhbHVlT3B0aW9ucyogbiA9IG5ldyBFbnVtVmFsdWVPcHRpb25zOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6Q2xlYXIoKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9jbGVhcl9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKICAgX2V4dGVuc2lvbnNfLkNsZWFyKCk7CisgIGRlcHJlY2F0ZWRfID0gZmFsc2U7CiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQogfQogCiBib29sIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDE2MzgzKTsKKyAgICB0YWcgPSBwLmZpcnN0OworICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewotICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICAgICAgY2FzZSA5OTk6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246Ci0gICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbCgKLSAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKKyAgICAgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA4KSB7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZkZXByZWNhdGVkXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OiB7CisgICAgICAgIGlmICh0YWcgPT0gNzk5NCkgeworICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQogICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICAgICAgfQogICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKICAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDEgW2RlZmF1bHQgPSBmYWxzZV07CisgIGlmIChoYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQm9vbCgxLCB0aGlzLT5kZXByZWNhdGVkKCksIG91dHB1dCk7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICAgIDEwMDAsIDUzNjg3MDkxMiwgb3V0cHV0KTsKLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogRW51bVZhbHVlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgxLCB0aGlzLT5kZXByZWNhdGVkKCksIHRhcmdldCk7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKKyAgZm9yICh1bnNpZ25lZCBpbnQgaSA9IDAsIG4gPSB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAogICAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQogICB0YXJnZXQgPSBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICAgIDEwMDAsIDUzNjg3MDkxMiwgdGFyZ2V0KTsKLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgRW51bVZhbHVlT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCiAgIGludCB0b3RhbF9zaXplID0gMDsKLSAgCisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICB0b3RhbF9zaXplICs9IDEgKyAxOworICB9CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwogICB0b3RhbF9zaXplICs9IDIgKiB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKQEAgLTU5NzksMTIgKzExMjc0LDEyIEBACiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemVOb1ZpcnR1YWwoCiAgICAgICAgIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpKTsKICAgfQotICAKKwogICB0b3RhbF9zaXplICs9IF9leHRlbnNpb25zXy5CeXRlU2l6ZSgpOwotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKICAgICB0b3RhbF9zaXplICs9Ci0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKICAgfQogICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOwpAQCAtNTk5NCw1MyArMTEyODksNjcgQEAKIH0KIAogdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IEVudW1WYWx1ZU9wdGlvbnMqIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBFbnVtVmFsdWVPcHRpb25zKj4oCi0gICAgICAmZnJvbSk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgRW51bVZhbHVlT3B0aW9ucyogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IEVudW1WYWx1ZU9wdGlvbnM+KAorICAgICAgICAgICZmcm9tKTsKICAgaWYgKHNvdXJjZSA9PSBOVUxMKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3RfZmFpbDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLk1lcmdlRnJvbShmcm9tLnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfZGVwcmVjYXRlZCgpKSB7CisgICAgICBzZXRfZGVwcmVjYXRlZChmcm9tLmRlcHJlY2F0ZWQoKSk7CisgICAgfQorICB9CiAgIF9leHRlbnNpb25zXy5NZXJnZUZyb20oZnJvbS5fZXh0ZW5zaW9uc18pOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIH0KIH0KIAogdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpDb3B5RnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgRW51bVZhbHVlT3B0aW9uczo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpKyspIHsKLSAgICBpZiAoIXRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOwotICB9Ci0gIAorCisgIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oKSkpIHJldHVybiBmYWxzZTsKKwogICBpZiAoIV9leHRlbnNpb25zXy5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OlN3YXAoRW51bVZhbHVlT3B0aW9ucyogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBFbnVtVmFsdWVPcHRpb25zOjpJbnRlcm5hbFN3YXAoRW51bVZhbHVlT3B0aW9ucyogb3RoZXIpIHsKKyAgc3RkOjpzd2FwKGRlcHJlY2F0ZWRfLCBvdGhlci0+ZGVwcmVjYXRlZF8pOworICB1bmludGVycHJldGVkX29wdGlvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CisgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBFbnVtVmFsdWVPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTYwNTEsMzMgKzExMzYwLDk3IEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gRW51bVZhbHVlT3B0aW9ucworCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworYm9vbCBFbnVtVmFsdWVPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIEVudW1WYWx1ZU9wdGlvbnM6OnNldF9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQordm9pZCBFbnVtVmFsdWVPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQorIGJvb2wgRW51bVZhbHVlT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gZGVwcmVjYXRlZF87Cit9Cisgdm9pZCBFbnVtVmFsdWVPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLmRlcHJlY2F0ZWQpCit9CisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKK2ludCBFbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKK30KK3ZvaWQgRW51bVZhbHVlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtVmFsdWVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bVZhbHVlT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK0VudW1WYWx1ZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK0VudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKK2NvbnN0IGludCBTZXJ2aWNlT3B0aW9uczo6a0RlcHJlY2F0ZWRGaWVsZE51bWJlcjsKIGNvbnN0IGludCBTZXJ2aWNlT3B0aW9uczo6a1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIFNlcnZpY2VPcHRpb25zOjpTZXJ2aWNlT3B0aW9ucygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQogfQogCiB2b2lkIFNlcnZpY2VPcHRpb25zOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIFNlcnZpY2VPcHRpb25zOjpTZXJ2aWNlT3B0aW9ucyhjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCiB9CiAKIHZvaWQgU2VydmljZU9wdGlvbnM6OlNoYXJlZEN0b3IoKSB7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBkZXByZWNhdGVkXyA9IGZhbHNlOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwogfQogCiBTZXJ2aWNlT3B0aW9uczo6flNlcnZpY2VPcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCiAgIFNoYXJlZER0b3IoKTsKIH0KIApAQCAtNjEwMyw5OSArMTE0NzYsMTU0IEBACiAKIFNlcnZpY2VPcHRpb25zKiBTZXJ2aWNlT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwogCi1TZXJ2aWNlT3B0aW9ucyogU2VydmljZU9wdGlvbnM6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBTZXJ2aWNlT3B0aW9uczsKK1NlcnZpY2VPcHRpb25zKiBTZXJ2aWNlT3B0aW9uczo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIFNlcnZpY2VPcHRpb25zKiBuID0gbmV3IFNlcnZpY2VPcHRpb25zOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgU2VydmljZU9wdGlvbnM6OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQogICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgU2VydmljZU9wdGlvbnM6Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxNjM4Myk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKLSAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgICAgIGNhc2UgOTk5OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgICAgIHBhcnNlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOgotICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWwoCi0gICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgICAgIGNhc2UgMzM6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAyNjQpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgJmRlcHJlY2F0ZWRfKSkpOworICAgICAgICAgIHNldF9oYXNfZGVwcmVjYXRlZCgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKworICAgICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OworICAgICAgY2FzZSA5OTk6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA3OTk0KSB7CisgICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpOworICAgICAgICAgcGFyc2VfbG9vcF91bmludGVycHJldGVkX29wdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDc5OTQpKSBnb3RvIHBhcnNlX2xvb3BfdW5pbnRlcnByZXRlZF9vcHRpb247CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZ290byBzdWNjZXNzOwogICAgICAgICB9CiAgICAgICAgIGlmICgoODAwMHUgPD0gdGFnKSkgewogICAgICAgICAgIERPXyhfZXh0ZW5zaW9uc18uUGFyc2VGaWVsZCh0YWcsIGlucHV0LCBkZWZhdWx0X2luc3RhbmNlXywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgICAgY29udGludWU7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBTZXJ2aWNlT3B0aW9uczo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMzMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKKyAgfQorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCiAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQogICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOwotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VydmljZU9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQorICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOworICB9CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCiAgIHJldHVybiB0YXJnZXQ7CiB9CiAKIGludCBTZXJ2aWNlT3B0aW9uczo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAorCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgewpAQCAtNjIwMywxMiArMTE2MzEsMTIgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOwogICB9Ci0gIAorCiAgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewogICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCiAgICAgICAgIHVua25vd25fZmllbGRzKCkpOwogICB9CiAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CkBAIC02MjE4LDUzICsxMTY0Niw2NyBAQAogfQogCiB2b2lkIFNlcnZpY2VPcHRpb25zOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFNlcnZpY2VPcHRpb25zKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgU2VydmljZU9wdGlvbnMqPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgU2VydmljZU9wdGlvbnMqIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBTZXJ2aWNlT3B0aW9ucz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucykKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBTZXJ2aWNlT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NZXJnZUZyb20oZnJvbS51bmludGVycHJldGVkX29wdGlvbl8pOworICBpZiAoZnJvbS5faGFzX2JpdHNfWzAgLyAzMl0gJiAoMHhmZnUgPDwgKDAgJSAzMikpKSB7CisgICAgaWYgKGZyb20uaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgICAgc2V0X2RlcHJlY2F0ZWQoZnJvbS5kZXByZWNhdGVkKCkpOworICAgIH0KKyAgfQogICBfZXh0ZW5zaW9uc18uTWVyZ2VGcm9tKGZyb20uX2V4dGVuc2lvbnNfKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgU2VydmljZU9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBTZXJ2aWNlT3B0aW9uczo6Q29weUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgU2VydmljZU9wdGlvbnM6OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAotICBmb3IgKGludCBpID0gMDsgaSA8IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7Ci0gICAgaWYgKCF0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQotICAKKworICBpZiAoITo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFsbEFyZUluaXRpYWxpemVkKHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkpKSByZXR1cm4gZmFsc2U7CisKICAgaWYgKCFfZXh0ZW5zaW9uc18uSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7ICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBTZXJ2aWNlT3B0aW9uczo6U3dhcChTZXJ2aWNlT3B0aW9ucyogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICB1bmludGVycHJldGVkX29wdGlvbl8uU3dhcCgmb3RoZXItPnVuaW50ZXJwcmV0ZWRfb3B0aW9uXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICAgIF9leHRlbnNpb25zXy5Td2FwKCZvdGhlci0+X2V4dGVuc2lvbnNfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBTZXJ2aWNlT3B0aW9uczo6SW50ZXJuYWxTd2FwKFNlcnZpY2VPcHRpb25zKiBvdGhlcikgeworICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFNlcnZpY2VPcHRpb25zOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTYyNzUsMzMgKzExNzE3LDk3IEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gU2VydmljZU9wdGlvbnMKKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07Citib29sIFNlcnZpY2VPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIFNlcnZpY2VPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9Cit2b2lkIFNlcnZpY2VPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9Cit2b2lkIFNlcnZpY2VPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQorIGJvb2wgU2VydmljZU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLmRlcHJlY2F0ZWQpCisgIHJldHVybiBkZXByZWNhdGVkXzsKK30KKyB2b2lkIFNlcnZpY2VPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbnQgU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOworfQordm9pZCBTZXJ2aWNlT3B0aW9uczo6Y2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBTZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIFNlcnZpY2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIFNlcnZpY2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKK1NlcnZpY2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCitjb25zdCBpbnQgTWV0aG9kT3B0aW9uczo6a0RlcHJlY2F0ZWRGaWVsZE51bWJlcjsKIGNvbnN0IGludCBNZXRob2RPcHRpb25zOjprVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyOwotI2VuZGlmICAvLyAhX01TQ19WRVIKKyNlbmRpZiAgLy8gIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIAogTWV0aG9kT3B0aW9uczo6TWV0aG9kT3B0aW9ucygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCiB9CiAKIHZvaWQgTWV0aG9kT3B0aW9uczo6SW5pdEFzRGVmYXVsdEluc3RhbmNlKCkgewogfQogCiBNZXRob2RPcHRpb25zOjpNZXRob2RPcHRpb25zKGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAorICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewogICBTaGFyZWRDdG9yKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCiB9CiAKIHZvaWQgTWV0aG9kT3B0aW9uczo6U2hhcmVkQ3RvcigpIHsKICAgX2NhY2hlZF9zaXplXyA9IDA7CisgIGRlcHJlY2F0ZWRfID0gZmFsc2U7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CiB9CiAKIE1ldGhvZE9wdGlvbnM6On5NZXRob2RPcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZGVzdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKICAgU2hhcmVkRHRvcigpOwogfQogCkBAIC02MzI3LDk5ICsxMTgzMywxNTQgQEAKIAogTWV0aG9kT3B0aW9ucyogTWV0aG9kT3B0aW9uczo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwogCi1NZXRob2RPcHRpb25zKiBNZXRob2RPcHRpb25zOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgTWV0aG9kT3B0aW9uczsKK01ldGhvZE9wdGlvbnMqIE1ldGhvZE9wdGlvbnM6Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBNZXRob2RPcHRpb25zKiBuID0gbmV3IE1ldGhvZE9wdGlvbnM7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihuKTsKKyAgfQorICByZXR1cm4gbjsKIH0KIAogdm9pZCBNZXRob2RPcHRpb25zOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQogICBfZXh0ZW5zaW9uc18uQ2xlYXIoKTsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgTWV0aG9kT3B0aW9uczo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7Ci0jZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIShFWFBSRVNTSU9OKSkgcmV0dXJuIGZhbHNlCisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQogICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7Ci0gIHdoaWxlICgodGFnID0gaW5wdXQtPlJlYWRUYWcoKSkgIT0gMCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTYzODMpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7Ci0gICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gICAgICBjYXNlIDk5OTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV91bmludGVycHJldGVkX29wdGlvbjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAotICAgICAgICAgICAgICAgIGlucHV0LCBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSkpOworICAgICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CisgICAgICBjYXNlIDMzOiB7CisgICAgICAgIGlmICh0YWcgPT0gMjY0KSB7CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICBib29sLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CT09MPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZkZXByZWNhdGVkXykpKTsKKyAgICAgICAgICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNzk5NCkpIGdvdG8gcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb247Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgcmV0dXJuIHRydWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKKyAgICAgIGNhc2UgOTk5OiB7CisgICAgICAgIGlmICh0YWcgPT0gNzk5NCkgeworICAgICAgICAgcGFyc2VfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfdW5pbnRlcnByZXRlZF9vcHRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCisgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF91bmludGVycHJldGVkX29wdGlvbigpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg3OTk0KSkgZ290byBwYXJzZV9sb29wX3VuaW50ZXJwcmV0ZWRfb3B0aW9uOworICAgICAgICBpbnB1dC0+VW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICBoYW5kbGVfdW5pbnRlcnByZXRlZDoKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICBoYW5kbGVfdW51c3VhbDoKKyAgICAgICAgaWYgKHRhZyA9PSAwIHx8CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQogICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgewotICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIGdvdG8gc3VjY2VzczsKICAgICAgICAgfQogICAgICAgICBpZiAoKDgwMDB1IDw9IHRhZykpIHsKICAgICAgICAgICBET18oX2V4dGVuc2lvbnNfLlBhcnNlRmllbGQodGFnLCBpbnB1dCwgZGVmYXVsdF9pbnN0YW5jZV8sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICAgIGNvbnRpbnVlOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIE1ldGhvZE9wdGlvbnM6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2woMzMsIHRoaXMtPmRlcHJlY2F0ZWQoKSwgb3V0cHV0KTsKKyAgfQorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSA8IG47IGkrKykgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VNYXliZVRvQXJyYXkoCiAgICAgICA5OTksIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGkpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIEV4dGVuc2lvbiByYW5nZSBbMTAwMCwgNTM2ODcwOTEyKQogICBfZXh0ZW5zaW9uc18uU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgICAgMTAwMCwgNTM2ODcwOTEyLCBvdXRwdXQpOwotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBNZXRob2RPcHRpb25zOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgaWYgKGhhc19kZXByZWNhdGVkKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgzMywgdGhpcy0+ZGVwcmVjYXRlZCgpLCB0YXJnZXQpOworICB9CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgOTk5LCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbihpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBFeHRlbnNpb24gcmFuZ2UgWzEwMDAsIDUzNjg3MDkxMikKICAgdGFyZ2V0ID0gX2V4dGVuc2lvbnNfLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgICAxMDAwLCA1MzY4NzA5MTIsIHRhcmdldCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKICAgcmV0dXJuIHRhcmdldDsKIH0KIAogaW50IE1ldGhvZE9wdGlvbnM6OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAorCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworICBpZiAoaGFzX2RlcHJlY2F0ZWQoKSkgeworICAgIHRvdGFsX3NpemUgKz0gMiArIDE7CisgIH0KKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAgIHRvdGFsX3NpemUgKz0gMiAqIHRoaXMtPnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT51bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgewpAQCAtNjQyNywxMiArMTE5ODgsMTIgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkpOwogICB9Ci0gIAorCiAgIHRvdGFsX3NpemUgKz0gX2V4dGVuc2lvbnNfLkJ5dGVTaXplKCk7Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewogICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCiAgICAgICAgIHVua25vd25fZmllbGRzKCkpOwogICB9CiAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CkBAIC02NDQyLDUzICsxMjAwMyw2NyBAQAogfQogCiB2b2lkIE1ldGhvZE9wdGlvbnM6Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgTWV0aG9kT3B0aW9ucyogc291cmNlID0KLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpkeW5hbWljX2Nhc3RfaWZfYXZhaWxhYmxlPGNvbnN0IE1ldGhvZE9wdGlvbnMqPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBNZXRob2RPcHRpb25zKiBzb3VyY2UgPSAKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgTWV0aG9kT3B0aW9ucz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCiAgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOwogICB9CiB9CiAKIHZvaWQgTWV0aG9kT3B0aW9uczo6TWVyZ2VGcm9tKGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOwogICB1bmludGVycHJldGVkX29wdGlvbl8uTWVyZ2VGcm9tKGZyb20udW5pbnRlcnByZXRlZF9vcHRpb25fKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19kZXByZWNhdGVkKCkpIHsKKyAgICAgIHNldF9kZXByZWNhdGVkKGZyb20uZGVwcmVjYXRlZCgpKTsKKyAgICB9CisgIH0KICAgX2V4dGVuc2lvbnNfLk1lcmdlRnJvbShmcm9tLl9leHRlbnNpb25zXyk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGlmIChmcm9tLl9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgfQogfQogCiB2b2lkIE1ldGhvZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIE1ldGhvZE9wdGlvbnM6OkNvcHlGcm9tKGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBNZXRob2RPcHRpb25zOjpJc0luaXRpYWxpemVkKCkgY29uc3QgewotICAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+dW5pbnRlcnByZXRlZF9vcHRpb24oaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgCisKKyAgaWYgKCE6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBbGxBcmVJbml0aWFsaXplZCh0aGlzLT51bmludGVycHJldGVkX29wdGlvbigpKSkgcmV0dXJuIGZhbHNlOworCiAgIGlmICghX2V4dGVuc2lvbnNfLklzSW5pdGlhbGl6ZWQoKSkgcmV0dXJuIGZhbHNlOyAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgTWV0aG9kT3B0aW9uczo6U3dhcChNZXRob2RPcHRpb25zKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5Td2FwKCZvdGhlci0+dW5pbnRlcnByZXRlZF9vcHRpb25fKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gICAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIE1ldGhvZE9wdGlvbnM6OkludGVybmFsU3dhcChNZXRob2RPcHRpb25zKiBvdGhlcikgeworICBzdGQ6OnN3YXAoZGVwcmVjYXRlZF8sIG90aGVyLT5kZXByZWNhdGVkXyk7CisgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT51bmludGVycHJldGVkX29wdGlvbl8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKKyAgX2V4dGVuc2lvbnNfLlN3YXAoJm90aGVyLT5fZXh0ZW5zaW9uc18pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIE1ldGhvZE9wdGlvbnM6OkdldE1ldGFkYXRhKCkgY29uc3QgewpAQCAtNjQ5OSw0MyArMTIwNzQsMTA0IEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gTWV0aG9kT3B0aW9ucworCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2Jvb2wgTWV0aG9kT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQordm9pZCBNZXRob2RPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9Cit2b2lkIE1ldGhvZE9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK3ZvaWQgTWV0aG9kT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKK30KKyBib29sIE1ldGhvZE9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMuZGVwcmVjYXRlZCkKKyAgcmV0dXJuIGRlcHJlY2F0ZWRfOworfQorIHZvaWQgTWV0aG9kT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CitpbnQgTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7Cit9Cit2b2lkIE1ldGhvZE9wdGlvbnM6OmNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWV0aG9kT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1ldGhvZE9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCitNZXRob2RPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitNZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSU5MSU5FX05PVF9JTl9IRUFERVJTCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAotI2lmbmRlZiBfTVNDX1ZFUgorI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiBjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6a05hbWVQYXJ0RmllbGROdW1iZXI7CiBjb25zdCBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6a0lzRXh0ZW5zaW9uRmllbGROdW1iZXI7Ci0jZW5kaWYgIC8vICFfTVNDX1ZFUgorI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogCiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgewogICBTaGFyZWRDdG9yKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKIH0KIAogdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKIH0KIAogdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpTaGFyZWRDdG9yKCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOwogICBfY2FjaGVkX3NpemVfID0gMDsKLSAgbmFtZV9wYXJ0XyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgbmFtZV9wYXJ0Xy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGlzX2V4dGVuc2lvbl8gPSBmYWxzZTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6flVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKG5hbWVfcGFydF8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBuYW1lX3BhcnRfOwotICB9CisgIG5hbWVfcGFydF8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKICAgfQogfQpAQCAtNjU1NywxNDIgKzEyMTkzLDE4MCBAQAogCiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLVVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OworVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIG4gPSBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgKDB4ZmZ1IDw8ICgwICUgMzIpKSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAzdSkgewogICAgIGlmIChoYXNfbmFtZV9wYXJ0KCkpIHsKLSAgICAgIGlmIChuYW1lX3BhcnRfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICAgICAgbmFtZV9wYXJ0Xy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIG5hbWVfcGFydF8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICAgIH0KICAgICBpc19leHRlbnNpb25fID0gZmFsc2U7CiAgIH0KICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTApIHsKICAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfbmFtZV9wYXJ0KCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkuZGF0YSgpLCB0aGlzLT5uYW1lX3BhcnQoKS5sZW5ndGgoKSwKLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFKTsKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxNikpIGdvdG8gcGFyc2VfaXNfZXh0ZW5zaW9uOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIGlmICh0YWcgPT0gMTYpIHsKICAgICAgICAgIHBhcnNlX2lzX2V4dGVuc2lvbjoKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIGJvb2wsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAogICAgICAgICAgICAgICAgICBpbnB1dCwgJmlzX2V4dGVuc2lvbl8pKSk7CiAgICAgICAgICAgc2V0X2hhc19pc19leHRlbnNpb24oKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZ290byBzdWNjZXNzOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCiAgIC8vIHJlcXVpcmVkIHN0cmluZyBuYW1lX3BhcnQgPSAxOwogICBpZiAoaGFzX25hbWVfcGFydCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPm5hbWVfcGFydCgpLmRhdGEoKSwgdGhpcy0+bmFtZV9wYXJ0KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAxLCB0aGlzLT5uYW1lX3BhcnQoKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CiAgIGlmIChoYXNfaXNfZXh0ZW5zaW9uKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sKDIsIHRoaXMtPmlzX2V4dGVuc2lvbigpLCBvdXRwdXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCiAgIC8vIHJlcXVpcmVkIHN0cmluZyBuYW1lX3BhcnQgPSAxOwogICBpZiAoaGFzX25hbWVfcGFydCgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPm5hbWVfcGFydCgpLmRhdGEoKSwgdGhpcy0+bmFtZV9wYXJ0KCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOworICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICAxLCB0aGlzLT5uYW1lX3BhcnQoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CiAgIGlmIChoYXNfaXNfZXh0ZW5zaW9uKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sVG9BcnJheSgyLCB0aGlzLT5pc19leHRlbnNpb24oKSwgdGFyZ2V0KTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCiAgIHJldHVybiB0YXJnZXQ7CiB9CiAKLWludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKK2ludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpSZXF1aXJlZEZpZWxkc0J5dGVTaXplRmFsbGJhY2soKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocmVxdWlyZWRfZmllbGRzX2J5dGVfc2l6ZV9mYWxsYmFja19zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKICAgaW50IHRvdGFsX3NpemUgPSAwOwotICAKLSAgaWYgKF9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKKworICBpZiAoaGFzX25hbWVfcGFydCgpKSB7CiAgICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7Ci0gICAgaWYgKGhhc19uYW1lX3BhcnQoKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsKLSAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCi0gICAgICAgICAgdGhpcy0+bmFtZV9wYXJ0KCkpOwotICAgIH0KLSAgICAKLSAgICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7Ci0gICAgaWYgKGhhc19pc19leHRlbnNpb24oKSkgewotICAgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKLSAgICB9Ci0gICAgCisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5uYW1lX3BhcnQoKSk7CiAgIH0KLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKKworICBpZiAoaGFzX2lzX2V4dGVuc2lvbigpKSB7CisgICAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOworICAgIHRvdGFsX3NpemUgKz0gMSArIDE7CisgIH0KKworICByZXR1cm4gdG90YWxfc2l6ZTsKK30KK2ludCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmICgoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAzKSBeIDB4MDAwMDAwMDMpID09IDApIHsgIC8vIEFsbCByZXF1aXJlZCBmaWVsZHMgYXJlIHByZXNlbnQuCisgICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7CisgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICB0aGlzLT5uYW1lX3BhcnQoKSk7CisKKyAgICAvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7CisgICAgdG90YWxfc2l6ZSArPSAxICsgMTsKKworICB9IGVsc2UgeworICAgIHRvdGFsX3NpemUgKz0gUmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCk7CisgIH0KKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTY3MDIsMzcgKzEyMzc2LDQ2IEBACiB9CiAKIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCo+KAotICAgICAgJmZyb20pOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0PigKKyAgICAgICAgICAmZnJvbSk7CiAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CiAgIH0gZWxzZSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQpCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIGlmIChmcm9tLl9oYXNfYml0c19bMCAvIDMyXSAmICgweGZmdSA8PCAoMCAlIDMyKSkpIHsKICAgICBpZiAoZnJvbS5oYXNfbmFtZV9wYXJ0KCkpIHsKLSAgICAgIHNldF9uYW1lX3BhcnQoZnJvbS5uYW1lX3BhcnQoKSk7CisgICAgICBzZXRfaGFzX25hbWVfcGFydCgpOworICAgICAgbmFtZV9wYXJ0Xy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20ubmFtZV9wYXJ0Xyk7CiAgICAgfQogICAgIGlmIChmcm9tLmhhc19pc19leHRlbnNpb24oKSkgewogICAgICAgc2V0X2lzX2V4dGVuc2lvbihmcm9tLmlzX2V4dGVuc2lvbigpKTsKICAgICB9CiAgIH0KLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5NZXJnZUZyb20oZnJvbS51bmtub3duX2ZpZWxkcygpKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0KQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Q29weUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwpAQCAtNjc0MCwxOCArMTI0MjMsMjAgQEAKIAogYm9vbCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpJc0luaXRpYWxpemVkKCkgY29uc3QgewogICBpZiAoKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAzKSAhPSAweDAwMDAwMDAzKSByZXR1cm4gZmFsc2U7Ci0gIAorCiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OlN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogb3RoZXIpIHsKLSAgaWYgKG90aGVyICE9IHRoaXMpIHsKLSAgICBzdGQ6OnN3YXAobmFtZV9wYXJ0Xywgb3RoZXItPm5hbWVfcGFydF8pOwotICAgIHN0ZDo6c3dhcChpc19leHRlbnNpb25fLCBvdGhlci0+aXNfZXh0ZW5zaW9uXyk7Ci0gICAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKLSAgICBfdW5rbm93bl9maWVsZHNfLlN3YXAoJm90aGVyLT5fdW5rbm93bl9maWVsZHNfKTsKLSAgICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwotICB9CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OkludGVybmFsU3dhcChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBvdGhlcikgeworICBuYW1lX3BhcnRfLlN3YXAoJm90aGVyLT5uYW1lX3BhcnRfKTsKKyAgc3RkOjpzd2FwKGlzX2V4dGVuc2lvbl8sIG90aGVyLT5pc19leHRlbnNpb25fKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC02NzY1LDcgKzEyNDUwLDcgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprTmFtZUZpZWxkTnVtYmVyOwogY29uc3QgaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246OmtJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprUG9zaXRpdmVJbnRWYWx1ZUZpZWxkTnVtYmVyOwpAQCAtNjc3Myw0NyArMTI0NTgsNDYgQEAKIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprRG91YmxlVmFsdWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprU3RyaW5nVmFsdWVGaWVsZE51bWJlcjsKIGNvbnN0IGludCBVbmludGVycHJldGVkT3B0aW9uOjprQWdncmVnYXRlVmFsdWVGaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIFVuaW50ZXJwcmV0ZWRPcHRpb246OlVuaW50ZXJwcmV0ZWRPcHRpb24oKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQogfQogCiB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKIH0KIAogVW5pbnRlcnByZXRlZE9wdGlvbjo6VW5pbnRlcnByZXRlZE9wdGlvbihjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKQotICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpIHsKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwKKyAgICBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOwogICBNZXJnZUZyb20oZnJvbSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb3B5X2NvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQogfQogCiB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOwotICBpZGVudGlmaWVyX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKKyAgaWRlbnRpZmllcl92YWx1ZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBwb3NpdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX1VMT05HTE9ORygwKTsKICAgbmVnYXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKICAgZG91YmxlX3ZhbHVlXyA9IDA7Ci0gIHN0cmluZ192YWx1ZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7CisgIHN0cmluZ192YWx1ZV8uVW5zYWZlU2V0RGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBhZ2dyZWdhdGVfdmFsdWVfLlVuc2FmZVNldERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKIH0KIAogVW5pbnRlcnByZXRlZE9wdGlvbjo6flVuaW50ZXJwcmV0ZWRPcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQogICBTaGFyZWREdG9yKCk7CiB9CiAKIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6U2hhcmVkRHRvcigpIHsKLSAgaWYgKGlkZW50aWZpZXJfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgaWRlbnRpZmllcl92YWx1ZV87Ci0gIH0KLSAgaWYgKHN0cmluZ192YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlbGV0ZSBzdHJpbmdfdmFsdWVfOwotICB9Ci0gIGlmIChhZ2dyZWdhdGVfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWxldGUgYWdncmVnYXRlX3ZhbHVlXzsKLSAgfQorICBpZGVudGlmaWVyX3ZhbHVlXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBzdHJpbmdfdmFsdWVfLkRlc3Ryb3lOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGFnZ3JlZ2F0ZV92YWx1ZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKICAgfQogfQpAQCAtNjgzNSwzMjMgKzEyNTE5LDM1OSBAQAogCiBVbmludGVycHJldGVkT3B0aW9uKiBVbmludGVycHJldGVkT3B0aW9uOjpkZWZhdWx0X2luc3RhbmNlXyA9IE5VTEw7CiAKLVVuaW50ZXJwcmV0ZWRPcHRpb24qIFVuaW50ZXJwcmV0ZWRPcHRpb246Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBVbmludGVycHJldGVkT3B0aW9uOworVW5pbnRlcnByZXRlZE9wdGlvbiogVW5pbnRlcnByZXRlZE9wdGlvbjo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIFVuaW50ZXJwcmV0ZWRPcHRpb24qIG4gPSBuZXcgVW5pbnRlcnByZXRlZE9wdGlvbjsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OkNsZWFyKCkgewotICBpZiAoX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAorICBfX2J1aWx0aW5fb2Zmc2V0b2YoVW5pbnRlcnByZXRlZE9wdGlvbiwgZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCisjZWxzZQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKKyAgJnJlaW50ZXJwcmV0X2Nhc3Q8VW5pbnRlcnByZXRlZE9wdGlvbio+KDE2KS0+ZikKKyNlbmRpZgorCisjZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKKyAgOjptZW1zZXQoJmZpcnN0LCAwLFwKKyAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCit9IHdoaWxlICgwKQorCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAxMjZ1KSB7CisgICAgWlJfKHBvc2l0aXZlX2ludF92YWx1ZV8sIGRvdWJsZV92YWx1ZV8pOwogICAgIGlmIChoYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7Ci0gICAgICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBpZGVudGlmaWVyX3ZhbHVlXy0+Y2xlYXIoKTsKLSAgICAgIH0KKyAgICAgIGlkZW50aWZpZXJfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9Ci0gICAgcG9zaXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9VTE9OR0xPTkcoMCk7Ci0gICAgbmVnYXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9MT05HTE9ORygwKTsKLSAgICBkb3VibGVfdmFsdWVfID0gMDsKICAgICBpZiAoaGFzX3N0cmluZ192YWx1ZSgpKSB7Ci0gICAgICBpZiAoc3RyaW5nX3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgICAgIHN0cmluZ192YWx1ZV8tPmNsZWFyKCk7Ci0gICAgICB9CisgICAgICBzdHJpbmdfdmFsdWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgICB9CiAgICAgaWYgKGhhc19hZ2dyZWdhdGVfdmFsdWUoKSkgewotICAgICAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgICAgICBhZ2dyZWdhdGVfdmFsdWVfLT5jbGVhcigpOwotICAgICAgfQorICAgICAgYWdncmVnYXRlX3ZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgICAgfQogICB9CisKKyN1bmRlZiBaUl9IRUxQRVJfCisjdW5kZWYgWlJfCisKICAgbmFtZV8uQ2xlYXIoKTsKICAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKLSAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIH0KIH0KIAogYm9vbCBVbmludGVycHJldGVkT3B0aW9uOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgICAgcGFyc2VfbmFtZToKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICBpZiAodGFnID09IDE4KSB7CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfbmFtZToKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKICAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX25hbWUoKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2VfbmFtZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTgpKSBnb3RvIHBhcnNlX2xvb3BfbmFtZTsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDI2KSkgZ290byBwYXJzZV9pZGVudGlmaWVyX3ZhbHVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CiAgICAgICBjYXNlIDM6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDI2KSB7CiAgICAgICAgICBwYXJzZV9pZGVudGlmaWVyX3ZhbHVlOgogICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9pZGVudGlmaWVyX3ZhbHVlKCkpKTsKLSAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nKAorICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAogICAgICAgICAgICAgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+aWRlbnRpZmllcl92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UpOworICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSIpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzMikpIGdvdG8gcGFyc2VfcG9zaXRpdmVfaW50X3ZhbHVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCB1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlID0gNDsKICAgICAgIGNhc2UgNDogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAzMikgewogICAgICAgICAgcGFyc2VfcG9zaXRpdmVfaW50X3ZhbHVlOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX1VJTlQ2ND4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmcG9zaXRpdmVfaW50X3ZhbHVlXykpKTsKICAgICAgICAgICBzZXRfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0MCkpIGdvdG8gcGFyc2VfbmVnYXRpdmVfaW50X3ZhbHVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBpbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUgPSA1OwogICAgICAgY2FzZSA1OiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkgeworICAgICAgICBpZiAodGFnID09IDQwKSB7CiAgICAgICAgICBwYXJzZV9uZWdhdGl2ZV9pbnRfdmFsdWU6CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQ2ND4oCiAgICAgICAgICAgICAgICAgIGlucHV0LCAmbmVnYXRpdmVfaW50X3ZhbHVlXykpKTsKICAgICAgICAgICBzZXRfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQogICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZyg0OSkpIGdvdG8gcGFyc2VfZG91YmxlX3ZhbHVlOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKICAgICAgIGNhc2UgNjogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0KSB7CisgICAgICAgIGlmICh0YWcgPT0gNDkpIHsKICAgICAgICAgIHBhcnNlX2RvdWJsZV92YWx1ZToKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAogICAgICAgICAgICAgICAgICAgIGRvdWJsZSwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfRE9VQkxFPigKICAgICAgICAgICAgICAgICAgaW5wdXQsICZkb3VibGVfdmFsdWVfKSkpOwogICAgICAgICAgIHNldF9oYXNfZG91YmxlX3ZhbHVlKCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDU4KSkgZ290byBwYXJzZV9zdHJpbmdfdmFsdWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CiAgICAgICBjYXNlIDc6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDU4KSB7CiAgICAgICAgICBwYXJzZV9zdHJpbmdfdmFsdWU6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoCiAgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPm11dGFibGVfc3RyaW5nX3ZhbHVlKCkpKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KICAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNjYpKSBnb3RvIHBhcnNlX2FnZ3JlZ2F0ZV92YWx1ZTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7CiAgICAgICBjYXNlIDg6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDY2KSB7CiAgICAgICAgICBwYXJzZV9hZ2dyZWdhdGVfdmFsdWU6CiAgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAogICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpKSk7Ci0gICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgICAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSk7CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUiKTsKICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnb3RvIGhhbmRsZV91bmludGVycHJldGVkOworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgICAgIH0KLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQotICAgICAgCisKICAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CiAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7Ci0gICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgICAgZ290byBzdWNjZXNzOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcEZpZWxkKAorICAgICAgICAgICAgICBpbnB1dCwgdGFnLCBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQogICB9CitzdWNjZXNzOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCBuYW1lID0gMjsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5uYW1lX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bmFtZV9zaXplKCk7IGkgPCBuOyBpKyspIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAogICAgICAgMiwgdGhpcy0+bmFtZShpKSwgb3V0cHV0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CiAgIGlmIChoYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICAzLCB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CiAgIGlmIChoYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjQoNCwgdGhpcy0+cG9zaXRpdmVfaW50X3ZhbHVlKCksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKICAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgewogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0KDUsIHRoaXMtPm5lZ2F0aXZlX2ludF92YWx1ZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OwogICBpZiAoaGFzX2RvdWJsZV92YWx1ZSgpKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlRG91YmxlKDYsIHRoaXMtPmRvdWJsZV92YWx1ZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CiAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlcygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCeXRlc01heWJlQWxpYXNlZCgKICAgICAgIDcsIHRoaXMtPnN0cmluZ192YWx1ZSgpLCBvdXRwdXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OwogICBpZiAoaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmRhdGEoKSwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCkubGVuZ3RoKCksCi0gICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUpOwotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCiAgICAgICA4LCB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKSwgb3V0cHV0KTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBVbmludGVycHJldGVkT3B0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bmFtZV9zaXplKCk7IGkrKykgeworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPm5hbWVfc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgMiwgdGhpcy0+bmFtZShpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CiAgIGlmIChoYXNfaWRlbnRpZmllcl92YWx1ZSgpKSB7Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZygKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKICAgICAgIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKS5sZW5ndGgoKSwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSk7CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSIpOwogICAgIHRhcmdldCA9CiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgICAgICAzLCB0aGlzLT5pZGVudGlmaWVyX3ZhbHVlKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CiAgIGlmIChoYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50NjRUb0FycmF5KDQsIHRoaXMtPnBvc2l0aXZlX2ludF92YWx1ZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CiAgIGlmIChoYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQ2NFRvQXJyYXkoNSwgdGhpcy0+bmVnYXRpdmVfaW50X3ZhbHVlKCksIHRhcmdldCk7CiAgIH0KLSAgCisKICAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CiAgIGlmIChoYXNfZG91YmxlX3ZhbHVlKCkpIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVEb3VibGVUb0FycmF5KDYsIHRoaXMtPmRvdWJsZV92YWx1ZSgpLCB0YXJnZXQpOwogICB9Ci0gIAorCiAgIC8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7CiAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXNUb0FycmF5KAogICAgICAgICA3LCB0aGlzLT5zdHJpbmdfdmFsdWUoKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKICAgaWYgKGhhc19hZ2dyZWdhdGVfdmFsdWUoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCiAgICAgICB0aGlzLT5hZ2dyZWdhdGVfdmFsdWUoKS5kYXRhKCksIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpLmxlbmd0aCgpLAotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUiKTsKICAgICB0YXJnZXQgPQogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKICAgICAgICAgOCwgdGhpcy0+YWdncmVnYXRlX3ZhbHVlKCksIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQogICByZXR1cm4gdGFyZ2V0OwogfQogCiBpbnQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCiAgIGludCB0b3RhbF9zaXplID0gMDsKLSAgCi0gIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiAoMHhmZnUgPDwgKDEgJSAzMikpKSB7CisKKyAgaWYgKF9oYXNfYml0c19bMSAvIDMyXSAmIDEyNnUpIHsKICAgICAvLyBvcHRpb25hbCBzdHJpbmcgaWRlbnRpZmllcl92YWx1ZSA9IDM7CiAgICAgaWYgKGhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgICAgIHRoaXMtPmlkZW50aWZpZXJfdmFsdWUoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7CiAgICAgaWYgKGhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlVJbnQ2NFNpemUoCiAgICAgICAgICAgdGhpcy0+cG9zaXRpdmVfaW50X3ZhbHVlKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CiAgICAgaWYgKGhhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsKICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDY0U2l6ZSgKICAgICAgICAgICB0aGlzLT5uZWdhdGl2ZV9pbnRfdmFsdWUoKSk7CiAgICAgfQotICAgIAorCiAgICAgLy8gb3B0aW9uYWwgZG91YmxlIGRvdWJsZV92YWx1ZSA9IDY7CiAgICAgaWYgKGhhc19kb3VibGVfdmFsdWUoKSkgewogICAgICAgdG90YWxfc2l6ZSArPSAxICsgODsKICAgICB9Ci0gICAgCisKICAgICAvLyBvcHRpb25hbCBieXRlcyBzdHJpbmdfdmFsdWUgPSA3OwogICAgIGlmIChoYXNfc3RyaW5nX3ZhbHVlKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoCiAgICAgICAgICAgdGhpcy0+c3RyaW5nX3ZhbHVlKCkpOwogICAgIH0KLSAgICAKKwogICAgIC8vIG9wdGlvbmFsIHN0cmluZyBhZ2dyZWdhdGVfdmFsdWUgPSA4OwogICAgIGlmIChoYXNfYWdncmVnYXRlX3ZhbHVlKCkpIHsKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAogICAgICAgICAgIHRoaXMtPmFnZ3JlZ2F0ZV92YWx1ZSgpKTsKICAgICB9Ci0gICAgCisKICAgfQogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPm5hbWVfc2l6ZSgpOwpAQCAtNzE2MCwxMCArMTI4ODAsMTAgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+bmFtZShpKSk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTcxNzMsMjMgKzEyODkzLDI4IEBACiB9CiAKIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOwotICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbio+KAotICAgICAgJmZyb20pOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGNvbnN0IFVuaW50ZXJwcmV0ZWRPcHRpb24qIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBVbmludGVycHJldGVkT3B0aW9uPigKKyAgICAgICAgICAmZnJvbSk7CiAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CiAgIH0gZWxzZSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX2Nhc3Rfc3VjY2Vzczpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbikKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkgewotICBHT09HTEVfQ0hFQ0tfTkUoJmZyb20sIHRoaXMpOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIG5hbWVfLk1lcmdlRnJvbShmcm9tLm5hbWVfKTsKICAgaWYgKGZyb20uX2hhc19iaXRzX1sxIC8gMzJdICYgKDB4ZmZ1IDw8ICgxICUgMzIpKSkgewogICAgIGlmIChmcm9tLmhhc19pZGVudGlmaWVyX3ZhbHVlKCkpIHsKLSAgICAgIHNldF9pZGVudGlmaWVyX3ZhbHVlKGZyb20uaWRlbnRpZmllcl92YWx1ZSgpKTsKKyAgICAgIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICAgICAgaWRlbnRpZmllcl92YWx1ZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmlkZW50aWZpZXJfdmFsdWVfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpKSB7CiAgICAgICBzZXRfcG9zaXRpdmVfaW50X3ZhbHVlKGZyb20ucG9zaXRpdmVfaW50X3ZhbHVlKCkpOwpAQCAtNzIwMSw0OCArMTI5MjYsNTQgQEAKICAgICAgIHNldF9kb3VibGVfdmFsdWUoZnJvbS5kb3VibGVfdmFsdWUoKSk7CiAgICAgfQogICAgIGlmIChmcm9tLmhhc19zdHJpbmdfdmFsdWUoKSkgewotICAgICAgc2V0X3N0cmluZ192YWx1ZShmcm9tLnN0cmluZ192YWx1ZSgpKTsKKyAgICAgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgICAgICBzdHJpbmdfdmFsdWVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5zdHJpbmdfdmFsdWVfKTsKICAgICB9CiAgICAgaWYgKGZyb20uaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpKSB7Ci0gICAgICBzZXRfYWdncmVnYXRlX3ZhbHVlKGZyb20uYWdncmVnYXRlX3ZhbHVlKCkpOworICAgICAgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgICAgIGFnZ3JlZ2F0ZV92YWx1ZV8uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmFnZ3JlZ2F0ZV92YWx1ZV8pOwogICAgIH0KICAgfQotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIH0KIH0KIAogdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCi0gIGZvciAoaW50IGkgPSAwOyBpIDwgbmFtZV9zaXplKCk7IGkrKykgewotICAgIGlmICghdGhpcy0+bmFtZShpKS5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKLSAgfQorCisgIGlmICghOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QWxsQXJlSW5pdGlhbGl6ZWQodGhpcy0+bmFtZSgpKSkgcmV0dXJuIGZhbHNlOwogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpTd2FwKFVuaW50ZXJwcmV0ZWRPcHRpb24qIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgbmFtZV8uU3dhcCgmb3RoZXItPm5hbWVfKTsKLSAgICBzdGQ6OnN3YXAoaWRlbnRpZmllcl92YWx1ZV8sIG90aGVyLT5pZGVudGlmaWVyX3ZhbHVlXyk7Ci0gICAgc3RkOjpzd2FwKHBvc2l0aXZlX2ludF92YWx1ZV8sIG90aGVyLT5wb3NpdGl2ZV9pbnRfdmFsdWVfKTsKLSAgICBzdGQ6OnN3YXAobmVnYXRpdmVfaW50X3ZhbHVlXywgb3RoZXItPm5lZ2F0aXZlX2ludF92YWx1ZV8pOwotICAgIHN0ZDo6c3dhcChkb3VibGVfdmFsdWVfLCBvdGhlci0+ZG91YmxlX3ZhbHVlXyk7Ci0gICAgc3RkOjpzd2FwKHN0cmluZ192YWx1ZV8sIG90aGVyLT5zdHJpbmdfdmFsdWVfKTsKLSAgICBzdGQ6OnN3YXAoYWdncmVnYXRlX3ZhbHVlXywgb3RoZXItPmFnZ3JlZ2F0ZV92YWx1ZV8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpJbnRlcm5hbFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiogb3RoZXIpIHsKKyAgbmFtZV8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+bmFtZV8pOworICBpZGVudGlmaWVyX3ZhbHVlXy5Td2FwKCZvdGhlci0+aWRlbnRpZmllcl92YWx1ZV8pOworICBzdGQ6OnN3YXAocG9zaXRpdmVfaW50X3ZhbHVlXywgb3RoZXItPnBvc2l0aXZlX2ludF92YWx1ZV8pOworICBzdGQ6OnN3YXAobmVnYXRpdmVfaW50X3ZhbHVlXywgb3RoZXItPm5lZ2F0aXZlX2ludF92YWx1ZV8pOworICBzdGQ6OnN3YXAoZG91YmxlX3ZhbHVlXywgb3RoZXItPmRvdWJsZV92YWx1ZV8pOworICBzdHJpbmdfdmFsdWVfLlN3YXAoJm90aGVyLT5zdHJpbmdfdmFsdWVfKTsKKyAgYWdncmVnYXRlX3ZhbHVlXy5Td2FwKCZvdGhlci0+YWdncmVnYXRlX3ZhbHVlXyk7CisgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7CisgIF9pbnRlcm5hbF9tZXRhZGF0YV8uU3dhcCgmb3RoZXItPl9pbnRlcm5hbF9tZXRhZGF0YV8pOworICBzdGQ6OnN3YXAoX2NhY2hlZF9zaXplXywgb3RoZXItPl9jYWNoZWRfc2l6ZV8pOwogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIFVuaW50ZXJwcmV0ZWRPcHRpb246OkdldE1ldGFkYXRhKCkgY29uc3QgewpAQCAtNzI1MywzOCArMTI5ODQsNDAwIEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydAorCisvLyByZXF1aXJlZCBzdHJpbmcgbmFtZV9wYXJ0ID0gMTsKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6aGFzX25hbWVfcGFydCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9oYXNfbmFtZV9wYXJ0KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpjbGVhcl9oYXNfbmFtZV9wYXJ0KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfbmFtZV9wYXJ0KCkgeworICBuYW1lX3BhcnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX25hbWVfcGFydCgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Om5hbWVfcGFydCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCisgIHJldHVybiBuYW1lX3BhcnRfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9uYW1lX3BhcnQoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lX3BhcnQoKTsKKyAgbmFtZV9wYXJ0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9uYW1lX3BhcnQoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19uYW1lX3BhcnQoKTsKKyAgbmFtZV9wYXJ0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQorfQorIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19uYW1lX3BhcnQoKTsKKyAgbmFtZV9wYXJ0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCit9CisgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6bXV0YWJsZV9uYW1lX3BhcnQoKSB7CisgIHNldF9oYXNfbmFtZV9wYXJ0KCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKKyAgcmV0dXJuIG5hbWVfcGFydF8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyA6OnN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpyZWxlYXNlX25hbWVfcGFydCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQorICBjbGVhcl9oYXNfbmFtZV9wYXJ0KCk7CisgIHJldHVybiBuYW1lX3BhcnRfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfYWxsb2NhdGVkX25hbWVfcGFydCg6OnN0ZDo6c3RyaW5nKiBuYW1lX3BhcnQpIHsKKyAgaWYgKG5hbWVfcGFydCAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lX3BhcnQoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbmFtZV9wYXJ0KCk7CisgIH0KKyAgbmFtZV9wYXJ0Xy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZV9wYXJ0KTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQorfQorCisvLyByZXF1aXJlZCBib29sIGlzX2V4dGVuc2lvbiA9IDI7Citib29sIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Omhhc19pc19leHRlbnNpb24oKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfaGFzX2lzX2V4dGVuc2lvbigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfaGFzX2lzX2V4dGVuc2lvbigpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OmNsZWFyX2lzX2V4dGVuc2lvbigpIHsKKyAgaXNfZXh0ZW5zaW9uXyA9IGZhbHNlOworICBjbGVhcl9oYXNfaXNfZXh0ZW5zaW9uKCk7Cit9CisgYm9vbCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0Ojppc19leHRlbnNpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQuaXNfZXh0ZW5zaW9uKQorICByZXR1cm4gaXNfZXh0ZW5zaW9uXzsKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9pc19leHRlbnNpb24oYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2lzX2V4dGVuc2lvbigpOworICBpc19leHRlbnNpb25fID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQuaXNfZXh0ZW5zaW9uKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFVuaW50ZXJwcmV0ZWRPcHRpb24KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0IG5hbWUgPSAyOworaW50IFVuaW50ZXJwcmV0ZWRPcHRpb246Om5hbWVfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG5hbWVfLnNpemUoKTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfbmFtZSgpIHsKKyAgbmFtZV8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgVW5pbnRlcnByZXRlZE9wdGlvbjo6bmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0KGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQorICByZXR1cm4gbmFtZV8uTXV0YWJsZShpbmRleCk7Cit9Cis6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIFVuaW50ZXJwcmV0ZWRPcHRpb246OmFkZF9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCisgIHJldHVybiBuYW1lXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4qCitVbmludGVycHJldGVkT3B0aW9uOjptdXRhYmxlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmFtZSkKKyAgcmV0dXJuICZuYW1lXzsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4mCitVbmludGVycHJldGVkT3B0aW9uOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQorICByZXR1cm4gbmFtZV87Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX2lkZW50aWZpZXJfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMnU7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2hhc19pZGVudGlmaWVyX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaWRlbnRpZmllcl92YWx1ZSgpIHsKKyAgaWRlbnRpZmllcl92YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb246OmlkZW50aWZpZXJfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSkKKyAgcmV0dXJuIGlkZW50aWZpZXJfdmFsdWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICBpZGVudGlmaWVyX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCit9Cisgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgaWRlbnRpZmllcl92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCit9Cisgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7CisgIGlkZW50aWZpZXJfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCit9CisgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9pZGVudGlmaWVyX3ZhbHVlKCkgeworICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSkKKyAgcmV0dXJuIGlkZW50aWZpZXJfdmFsdWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9pZGVudGlmaWVyX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQorICBjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICByZXR1cm4gaWRlbnRpZmllcl92YWx1ZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hbGxvY2F0ZWRfaWRlbnRpZmllcl92YWx1ZSg6OnN0ZDo6c3RyaW5nKiBpZGVudGlmaWVyX3ZhbHVlKSB7CisgIGlmIChpZGVudGlmaWVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOworICB9CisgIGlkZW50aWZpZXJfdmFsdWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBpZGVudGlmaWVyX3ZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSkKK30KKworLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7Citib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX3Bvc2l0aXZlX2ludF92YWx1ZSgpIHsKKyAgcG9zaXRpdmVfaW50X3ZhbHVlXyA9IEdPT0dMRV9VTE9OR0xPTkcoMCk7CisgIGNsZWFyX2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCBVbmludGVycHJldGVkT3B0aW9uOjpwb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ucG9zaXRpdmVfaW50X3ZhbHVlKQorICByZXR1cm4gcG9zaXRpdmVfaW50X3ZhbHVlXzsKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9wb3NpdGl2ZV9pbnRfdmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgdmFsdWUpIHsKKyAgc2V0X2hhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKTsKKyAgcG9zaXRpdmVfaW50X3ZhbHVlXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnBvc2l0aXZlX2ludF92YWx1ZSkKK30KKworLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfbmVnYXRpdmVfaW50X3ZhbHVlKCkgeworICBuZWdhdGl2ZV9pbnRfdmFsdWVfID0gR09PR0xFX0xPTkdMT05HKDApOworICBjbGVhcl9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBVbmludGVycHJldGVkT3B0aW9uOjpuZWdhdGl2ZV9pbnRfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmVnYXRpdmVfaW50X3ZhbHVlKQorICByZXR1cm4gbmVnYXRpdmVfaW50X3ZhbHVlXzsKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9uZWdhdGl2ZV9pbnRfdmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCB2YWx1ZSkgeworICBzZXRfaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpOworICBuZWdhdGl2ZV9pbnRfdmFsdWVfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24ubmVnYXRpdmVfaW50X3ZhbHVlKQorfQorCisvLyBvcHRpb25hbCBkb3VibGUgZG91YmxlX3ZhbHVlID0gNjsKK2Jvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX2RvdWJsZV92YWx1ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAxMHUpICE9IDA7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9oYXNfZG91YmxlX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9oYXNfZG91YmxlX3ZhbHVlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDEwdTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfZG91YmxlX3ZhbHVlKCkgeworICBkb3VibGVfdmFsdWVfID0gMDsKKyAgY2xlYXJfaGFzX2RvdWJsZV92YWx1ZSgpOworfQorIGRvdWJsZSBVbmludGVycHJldGVkT3B0aW9uOjpkb3VibGVfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uZG91YmxlX3ZhbHVlKQorICByZXR1cm4gZG91YmxlX3ZhbHVlXzsKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9kb3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKSB7CisgIHNldF9oYXNfZG91YmxlX3ZhbHVlKCk7CisgIGRvdWJsZV92YWx1ZV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5kb3VibGVfdmFsdWUpCit9CisKKy8vIG9wdGlvbmFsIGJ5dGVzIHN0cmluZ192YWx1ZSA9IDc7Citib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19zdHJpbmdfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMjB1KSAhPSAwOworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX3N0cmluZ192YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX3N0cmluZ192YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX3N0cmluZ192YWx1ZSgpIHsKKyAgc3RyaW5nX3ZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjpzdHJpbmdfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQorICByZXR1cm4gc3RyaW5nX3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIHN0cmluZ192YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCit9Cisgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIHN0cmluZ192YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9zdHJpbmdfdmFsdWUoY29uc3Qgdm9pZCogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIHN0cmluZ192YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQorfQorIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfc3RyaW5nX3ZhbHVlKCkgeworICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCisgIHJldHVybiBzdHJpbmdfdmFsdWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9zdHJpbmdfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKKyAgY2xlYXJfaGFzX3N0cmluZ192YWx1ZSgpOworICByZXR1cm4gc3RyaW5nX3ZhbHVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9zdHJpbmdfdmFsdWUoOjpzdGQ6OnN0cmluZyogc3RyaW5nX3ZhbHVlKSB7CisgIGlmIChzdHJpbmdfdmFsdWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX3N0cmluZ192YWx1ZSgpOworICB9CisgIHN0cmluZ192YWx1ZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHN0cmluZ192YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGFnZ3JlZ2F0ZV92YWx1ZSA9IDg7Citib29sIFVuaW50ZXJwcmV0ZWRPcHRpb246Omhhc19hZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwNDB1KSAhPSAwOworfQordm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKK30KK3ZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7Cit9Cit2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OmNsZWFyX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKKyAgYWdncmVnYXRlX3ZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKK30KKyBjb25zdCA6OnN0ZDo6c3RyaW5nJiBVbmludGVycHJldGVkT3B0aW9uOjphZ2dyZWdhdGVfdmFsdWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQorICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCit9Cisgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKK30KKyB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQorfQorIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246Om11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCkgeworICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCisgIHJldHVybiBhZ2dyZWdhdGVfdmFsdWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9hZ2dyZWdhdGVfdmFsdWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKKyAgY2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9hZ2dyZWdhdGVfdmFsdWUoOjpzdGQ6OnN0cmluZyogYWdncmVnYXRlX3ZhbHVlKSB7CisgIGlmIChhZ2dyZWdhdGVfdmFsdWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOworICB9CisgIGFnZ3JlZ2F0ZV92YWx1ZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGFnZ3JlZ2F0ZV92YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi0jaWZuZGVmIF9NU0NfVkVSCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKIGNvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a1BhdGhGaWVsZE51bWJlcjsKIGNvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a1NwYW5GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCitjb25zdCBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmtMZWFkaW5nQ29tbWVudHNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a1RyYWlsaW5nQ29tbWVudHNGaWVsZE51bWJlcjsKK2NvbnN0IGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6a0xlYWRpbmdEZXRhY2hlZENvbW1lbnRzRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbigpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbihjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCiB9CiAKIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OlNoYXJlZEN0b3IoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nKCk7CiAgIF9jYWNoZWRfc2l6ZV8gPSAwOworICBsZWFkaW5nX2NvbW1lbnRzXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIHRyYWlsaW5nX2NvbW1lbnRzXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7CiB9CiAKIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjp+U291cmNlQ29kZUluZm9fTG9jYXRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChkZXN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKICAgU2hhcmVkRHRvcigpOwogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTaGFyZWREdG9yKCkgeworICBsZWFkaW5nX2NvbW1lbnRzXy5EZXN0cm95Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICB0cmFpbGluZ19jb21tZW50c18uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKICAgfQogfQpAQCAtNzMwNiw4MSArMTMzOTksMTU2IEBACiAKIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOwogCi1Tb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok5ldygpIGNvbnN0IHsKLSAgcmV0dXJuIG5ldyBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjsKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBuID0gbmV3IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOworICBpZiAoYXJlbmEgIT0gTlVMTCkgeworICAgIGFyZW5hLT5Pd24obik7CisgIH0KKyAgcmV0dXJuIG47CiB9CiAKIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQorICBpZiAoX2hhc19iaXRzX1swIC8gMzJdICYgMTJ1KSB7CisgICAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICAgIGxlYWRpbmdfY29tbWVudHNfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgICB9CisgICAgaWYgKGhhc190cmFpbGluZ19jb21tZW50cygpKSB7CisgICAgICB0cmFpbGluZ19jb21tZW50c18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICAgIH0KKyAgfQogICBwYXRoXy5DbGVhcigpOwogICBzcGFuXy5DbGVhcigpOworICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5DbGVhcigpOwogICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPkNsZWFyKCk7CisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgfQogfQogCiBib29sIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghKEVYUFJFU1NJT04pKSByZXR1cm4gZmFsc2UKKyNkZWZpbmUgRE9fKEVYUFJFU1NJT04pIGlmICghR09PR0xFX1BSRURJQ1RfVFJVRShFWFBSRVNTSU9OKSkgZ290byBmYWlsdXJlCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIHRhZzsKLSAgd2hpbGUgKCh0YWcgPSBpbnB1dC0+UmVhZFRhZygpKSAhPSAwKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCisgIGZvciAoOzspIHsKKyAgICA6OnN0ZDo6cGFpcjwgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIsIGJvb2w+IHAgPSBpbnB1dC0+UmVhZFRhZ1dpdGhDdXRvZmYoMTI3KTsKKyAgICB0YWcgPSBwLmZpcnN0OworICAgIGlmICghcC5zZWNvbmQpIGdvdG8gaGFuZGxlX3VudXN1YWw7CiAgICAgc3dpdGNoICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSkgewogICAgICAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOwogICAgICAgY2FzZSAxOiB7Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMCkgewogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAogICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXRoKCkpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykKLSAgICAgICAgICAgICAgICAgICA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICAgICAgICAgICAgICAgICAgV0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDgpIHsKICAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZTwKICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCiAgICAgICAgICAgICAgICAgIDEsIDEwLCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXRoKCkpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9CiAgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDE4KSkgZ290byBwYXJzZV9zcGFuOwogICAgICAgICBicmVhazsKICAgICAgIH0KLSAgICAgIAorCiAgICAgICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CiAgICAgICBjYXNlIDI6IHsKLSAgICAgICAgaWYgKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09Ci0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgICBpZiAodGFnID09IDE4KSB7CiAgICAgICAgICBwYXJzZV9zcGFuOgogICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmU8CiAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAogICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zcGFuKCkpKSk7Ci0gICAgICAgIH0gZWxzZSBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykKLSAgICAgICAgICAgICAgICAgICA9PSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6Ci0gICAgICAgICAgICAgICAgICAgICAgV0lSRVRZUEVfVkFSSU5UKSB7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDE2KSB7CiAgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFJlcGVhdGVkUHJpbWl0aXZlTm9JbmxpbmU8CiAgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAogICAgICAgICAgICAgICAgICAxLCAxOCwgaW5wdXQsIHRoaXMtPm11dGFibGVfc3BhbigpKSkpOwogICAgICAgICB9IGVsc2UgewotICAgICAgICAgIGdvdG8gaGFuZGxlX3VuaW50ZXJwcmV0ZWQ7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICAgICAgfQotICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIHJldHVybiB0cnVlOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNikpIGdvdG8gcGFyc2VfbGVhZGluZ19jb21tZW50czsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKLSAgICAgIGRlZmF1bHQ6IHsKLSAgICAgIGhhbmRsZV91bmludGVycHJldGVkOgotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKworICAgICAgLy8gb3B0aW9uYWwgc3RyaW5nIGxlYWRpbmdfY29tbWVudHMgPSAzOworICAgICAgY2FzZSAzOiB7CisgICAgICAgIGlmICh0YWcgPT0gMjYpIHsKKyAgICAgICAgIHBhcnNlX2xlYWRpbmdfY29tbWVudHM6CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKAorICAgICAgICAgICAgICAgIGlucHV0LCB0aGlzLT5tdXRhYmxlX2xlYWRpbmdfY29tbWVudHMoKSkpOworICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgICAgICAgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+bGVhZGluZ19jb21tZW50cygpLmxlbmd0aCgpLAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6UEFSU0UsCisgICAgICAgICAgICAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygzNCkpIGdvdG8gcGFyc2VfdHJhaWxpbmdfY29tbWVudHM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICAgICAgY2FzZSA0OiB7CisgICAgICAgIGlmICh0YWcgPT0gMzQpIHsKKyAgICAgICAgIHBhcnNlX3RyYWlsaW5nX2NvbW1lbnRzOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV90cmFpbGluZ19jb21tZW50cygpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICAgICAgICB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLmRhdGEoKSwgdGhpcy0+dHJhaWxpbmdfY29tbWVudHMoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7CisgICAgICBjYXNlIDY6IHsKKyAgICAgICAgaWYgKHRhZyA9PSA1MCkgeworICAgICAgICAgcGFyc2VfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50czoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoCisgICAgICAgICAgICAgICAgaW5wdXQsIHRoaXMtPmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkpKTsKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgICAgICAgIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHModGhpcy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50c19zaXplKCkgLSAxKS5kYXRhKCksCisgICAgICAgICAgICB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIC0gMSkubGVuZ3RoKCksCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpQQVJTRSwKKyAgICAgICAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoNTApKSBnb3RvIHBhcnNlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHM7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KICAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQogICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKKyAgcmV0dXJuIGZhbHNlOwogI3VuZGVmIERPXwogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKICAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOwogICBpZiAodGhpcy0+cGF0aF9zaXplKCkgPiAwKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKDEsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOwpAQCAtNzM5MCw3ICsxMzU1OCw3IEBACiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZygKICAgICAgIHRoaXMtPnBhdGgoaSksIG91dHB1dCk7CiAgIH0KLSAgCisKICAgLy8gcmVwZWF0ZWQgaW50MzIgc3BhbiA9IDIgW3BhY2tlZCA9IHRydWVdOwogICBpZiAodGhpcy0+c3Bhbl9zaXplKCkgPiAwKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKDIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOwpAQCAtNzQwMCwxNSArMTM1NjgsNDcgQEAKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMk5vVGFnKAogICAgICAgdGhpcy0+c3BhbihpKSwgb3V0cHV0KTsKICAgfQotICAKLSAgaWYgKCF1bmtub3duX2ZpZWxkcygpLmVtcHR5KCkpIHsKLSAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKworICAvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CisgIGlmIChoYXNfbGVhZGluZ19jb21tZW50cygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCkuZGF0YSgpLCB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgICAzLCB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICBpZiAoaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCkuZGF0YSgpLCB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cyIpOworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVN0cmluZ01heWJlQWxpYXNlZCgKKyAgICAgIDQsIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCksIG91dHB1dCk7CisgIH0KKworICAvLyByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50c19zaXplKCk7IGkrKykgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpKS5kYXRhKCksIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaSkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMiKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmcoCisgICAgICA2LCB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGkpLCBvdXRwdXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgb3V0cHV0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX2VuZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIHRhcmdldCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKICAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOwogICBpZiAodGhpcy0+cGF0aF9zaXplKCkgPiAwKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnVG9BcnJheSgKQEAgLTc0MjIsNyArMTM2MjIsNyBAQAogICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKICAgICAgIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkodGhpcy0+cGF0aChpKSwgdGFyZ2V0KTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CiAgIGlmICh0aGlzLT5zcGFuX3NpemUoKSA+IDApIHsKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KApAQCAtNzQzNiwxNyArMTM2MzYsNjcgQEAKICAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CiAgICAgICBXcml0ZUludDMyTm9UYWdUb0FycmF5KHRoaXMtPnNwYW4oaSksIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKS5kYXRhKCksIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKS5sZW5ndGgoKSwKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNFUklBTElaRSwKKyAgICAgICJnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cyIpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICAzLCB0aGlzLT5sZWFkaW5nX2NvbW1lbnRzKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworICBpZiAoaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCkuZGF0YSgpLCB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cyIpOworICAgIHRhcmdldCA9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdUb0FycmF5KAorICAgICAgICA0LCB0aGlzLT50cmFpbGluZ19jb21tZW50cygpLCB0YXJnZXQpOworICB9CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgPSA2OworICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpOyBpKyspIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaSkuZGF0YSgpLCB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGkpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzIik7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgorICAgICAgV3JpdGVTdHJpbmdUb0FycmF5KDYsIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaSksIHRhcmdldCk7CisgIH0KKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSwgdGFyZ2V0KTsKICAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3RvX2FycmF5X2VuZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCiAgIHJldHVybiB0YXJnZXQ7CiB9CiAKIGludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Qnl0ZVNpemUoKSBjb25zdCB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobWVzc2FnZV9ieXRlX3NpemVfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQogICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0gIAorCisgIGlmIChfaGFzX2JpdHNfWzIgLyAzMl0gJiAxMnUpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CisgICAgaWYgKGhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPmxlYWRpbmdfY29tbWVudHMoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKKyAgICBpZiAoaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKAorICAgICAgICAgIHRoaXMtPnRyYWlsaW5nX2NvbW1lbnRzKCkpOworICAgIH0KKworICB9CiAgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKICAgewogICAgIGludCBkYXRhX3NpemUgPSAwOwpAQCAtNzQ1OCwxMCArMTM3MDgsMTIgQEAKICAgICAgIHRvdGFsX3NpemUgKz0gMSArCiAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoZGF0YV9zaXplKTsKICAgICB9CisgICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKICAgICBfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXyA9IGRhdGFfc2l6ZTsKKyAgICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKICAgICB0b3RhbF9zaXplICs9IGRhdGFfc2l6ZTsKICAgfQotICAKKwogICAvLyByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkID0gdHJ1ZV07CiAgIHsKICAgICBpbnQgZGF0YV9zaXplID0gMDsKQEAgLTc0NzMsMTMgKzEzNzI1LDIyIEBACiAgICAgICB0b3RhbF9zaXplICs9IDEgKwogICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6SW50MzJTaXplKGRhdGFfc2l6ZSk7CiAgICAgfQorICAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CiAgICAgX3NwYW5fY2FjaGVkX2J5dGVfc2l6ZV8gPSBkYXRhX3NpemU7CisgICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CiAgICAgdG90YWxfc2l6ZSArPSBkYXRhX3NpemU7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMgPSA2OworICB0b3RhbF9zaXplICs9IDEgKiB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzX3NpemUoKTsgaSsrKSB7CisgICAgdG90YWxfc2l6ZSArPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6U3RyaW5nU2l6ZSgKKyAgICAgIHRoaXMtPmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaSkpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CiAgICAgdG90YWxfc2l6ZSArPQotICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgICAgdW5rbm93bl9maWVsZHMoKSk7CiAgIH0KICAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKQEAgLTc0ODksNDkgKzEzNzUwLDczIEBACiB9CiAKIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKLSAgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIHNvdXJjZSA9Ci0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZTxjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbio+KAotICAgICAgJmZyb20pOworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogc291cmNlID0gCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uPigKKyAgICAgICAgICAmZnJvbSk7CiAgIGlmIChzb3VyY2UgPT0gTlVMTCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X2ZhaWw6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOwogICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQogICAgIE1lcmdlRnJvbSgqc291cmNlKTsKICAgfQogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpNZXJnZUZyb20oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pIHsKLSAgR09PR0xFX0NIRUNLX05FKCZmcm9tLCB0aGlzKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbikKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKICAgcGF0aF8uTWVyZ2VGcm9tKGZyb20ucGF0aF8pOwogICBzcGFuXy5NZXJnZUZyb20oZnJvbS5zcGFuXyk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk1lcmdlRnJvbShmcm9tLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfKTsKKyAgaWYgKGZyb20uX2hhc19iaXRzX1syIC8gMzJdICYgKDB4ZmZ1IDw8ICgyICUgMzIpKSkgeworICAgIGlmIChmcm9tLmhhc19sZWFkaW5nX2NvbW1lbnRzKCkpIHsKKyAgICAgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOworICAgICAgbGVhZGluZ19jb21tZW50c18uQXNzaWduV2l0aERlZmF1bHQoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBmcm9tLmxlYWRpbmdfY29tbWVudHNfKTsKKyAgICB9CisgICAgaWYgKGZyb20uaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkpIHsKKyAgICAgIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgICAgIHRyYWlsaW5nX2NvbW1lbnRzXy5Bc3NpZ25XaXRoRGVmYXVsdCgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGZyb20udHJhaWxpbmdfY29tbWVudHNfKTsKKyAgICB9CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9CiB9CiAKIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Q29weUZyb20oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQogICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOwogICBDbGVhcigpOwogICBNZXJnZUZyb20oZnJvbSk7CiB9CiAKIGJvb2wgU291cmNlQ29kZUluZm9fTG9jYXRpb246OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7Ci0gIAorCiAgIHJldHVybiB0cnVlOwogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpTd2FwKFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBvdGhlcikgewotICBpZiAob3RoZXIgIT0gdGhpcykgewotICAgIHBhdGhfLlN3YXAoJm90aGVyLT5wYXRoXyk7Ci0gICAgc3Bhbl8uU3dhcCgmb3RoZXItPnNwYW5fKTsKLSAgICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOwotICAgIF91bmtub3duX2ZpZWxkc18uU3dhcCgmb3RoZXItPl91bmtub3duX2ZpZWxkc18pOwotICAgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Ci0gIH0KKyAgaWYgKG90aGVyID09IHRoaXMpIHJldHVybjsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKK30KK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OkludGVybmFsU3dhcChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogb3RoZXIpIHsKKyAgcGF0aF8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+cGF0aF8pOworICBzcGFuXy5VbnNhZmVBcmVuYVN3YXAoJm90aGVyLT5zcGFuXyk7CisgIGxlYWRpbmdfY29tbWVudHNfLlN3YXAoJm90aGVyLT5sZWFkaW5nX2NvbW1lbnRzXyk7CisgIHRyYWlsaW5nX2NvbW1lbnRzXy5Td2FwKCZvdGhlci0+dHJhaWxpbmdfY29tbWVudHNfKTsKKyAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+bGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKIH0KIAogOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6R2V0TWV0YWRhdGEoKSBjb25zdCB7CkBAIC03NTQ1LDIyICsxMzgzMCwyNSBAQAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLSNpZm5kZWYgX01TQ19WRVIKKyNpZiAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAogY29uc3QgaW50IFNvdXJjZUNvZGVJbmZvOjprTG9jYXRpb25GaWVsZE51bWJlcjsKLSNlbmRpZiAgLy8gIV9NU0NfVkVSCisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCiAKIFNvdXJjZUNvZGVJbmZvOjpTb3VyY2VDb2RlSW5mbygpCi0gIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCkgeworICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLCBfaW50ZXJuYWxfbWV0YWRhdGFfKE5VTEwpIHsKICAgU2hhcmVkQ3RvcigpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvOjpJbml0QXNEZWZhdWx0SW5zdGFuY2UoKSB7CiB9CiAKIFNvdXJjZUNvZGVJbmZvOjpTb3VyY2VDb2RlSW5mbyhjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkKLSAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSB7CisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksCisgICAgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CiAgIFNoYXJlZEN0b3IoKTsKICAgTWVyZ2VGcm9tKGZyb20pOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY29weV9jb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCiB9CiAKIHZvaWQgU291cmNlQ29kZUluZm86OlNoYXJlZEN0b3IoKSB7CkBAIC03NTY5LDYgKzEzODU3LDcgQEAKIH0KIAogU291cmNlQ29kZUluZm86On5Tb3VyY2VDb2RlSW5mbygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQogICBTaGFyZWREdG9yKCk7CiB9CiAKQEAgLTc1OTQsODUgKzEzODgzLDEwOSBAQAogCiBTb3VyY2VDb2RlSW5mbyogU291cmNlQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKIAotU291cmNlQ29kZUluZm8qIFNvdXJjZUNvZGVJbmZvOjpOZXcoKSBjb25zdCB7Ci0gIHJldHVybiBuZXcgU291cmNlQ29kZUluZm87CitTb3VyY2VDb2RlSW5mbyogU291cmNlQ29kZUluZm86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBTb3VyY2VDb2RlSW5mbyogbiA9IG5ldyBTb3VyY2VDb2RlSW5mbzsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOwogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKICAgbG9jYXRpb25fLkNsZWFyKCk7CiAgIDo6bWVtc2V0KF9oYXNfYml0c18sIDAsIHNpemVvZihfaGFzX2JpdHNfKSk7Ci0gIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+Q2xlYXIoKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9CiB9CiAKIGJvb2wgU291cmNlQ29kZUluZm86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgewotI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCEoRVhQUkVTU0lPTikpIHJldHVybiBmYWxzZQorI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOwotICB3aGlsZSAoKHRhZyA9IGlucHV0LT5SZWFkVGFnKCkpICE9IDApIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKICAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CiAgICAgICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uIGxvY2F0aW9uID0gMTsKICAgICAgIGNhc2UgMTogewotICAgICAgICBpZiAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KLSAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7Ci0gICAgICAgICBwYXJzZV9sb2NhdGlvbjoKLSAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAorICAgICAgICBpZiAodGFnID09IDEwKSB7CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfbG9jYXRpb246CisgICAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoCiAgICAgICAgICAgICAgICAgaW5wdXQsIGFkZF9sb2NhdGlvbigpKSk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ290byBoYW5kbGVfdW5pbnRlcnByZXRlZDsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOwogICAgICAgICB9Ci0gICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDEwKSkgZ290byBwYXJzZV9sb2NhdGlvbjsKLSAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RBdEVuZCgpKSByZXR1cm4gdHJ1ZTsKKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2xvb3BfbG9jYXRpb247CisgICAgICAgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKICAgICAgICAgYnJlYWs7CiAgICAgICB9Ci0gICAgICAKKwogICAgICAgZGVmYXVsdDogewotICAgICAgaGFuZGxlX3VuaW50ZXJwcmV0ZWQ6Ci0gICAgICAgIGlmICg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSA9PQorICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKLSAgICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CiAgICAgICAgIH0KLSAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOwogICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CiAgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKICAgcmV0dXJuIHRydWU7CitmYWlsdXJlOgorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2VfZmFpbHVyZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCisgIHJldHVybiBmYWxzZTsKICN1bmRlZiBET18KIH0KIAogdm9pZCBTb3VyY2VDb2RlSW5mbzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmxvY2F0aW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bG9jYXRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKICAgICAgIDEsIHRoaXMtPmxvY2F0aW9uKGkpLCBvdXRwdXQpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgewotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCiAgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CiAgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQogfQogCiA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTb3VyY2VDb2RlSW5mbzo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSgKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiB0YXJnZXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOwotICBmb3IgKGludCBpID0gMDsgaSA8IHRoaXMtPmxvY2F0aW9uX3NpemUoKTsgaSsrKSB7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+bG9jYXRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CiAgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OgogICAgICAgV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKICAgICAgICAgMSwgdGhpcy0+bG9jYXRpb24oaSksIHRhcmdldCk7CiAgIH0KLSAgCi0gIGlmICghdW5rbm93bl9maWVsZHMoKS5lbXB0eSgpKSB7Ci0gICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAogICAgICAgICB1bmtub3duX2ZpZWxkcygpLCB0YXJnZXQpOwogICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfZW5kOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKICAgcmV0dXJuIHRhcmdldDsKIH0KIAogaW50IFNvdXJjZUNvZGVJbmZvOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCiAgIGludCB0b3RhbF9zaXplID0gMDsKLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7CiAgIHRvdGFsX3NpemUgKz0gMSAqIHRoaXMtPmxvY2F0aW9uX3NpemUoKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5sb2NhdGlvbl9zaXplKCk7IGkrKykgewpAQCAtNzY4MCwxMCArMTM5OTMsMTAgQEAKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICAgICAgdGhpcy0+bG9jYXRpb24oaSkpOwogICB9Ci0gIAotICBpZiAoIXVua25vd25fZmllbGRzKCkuZW1wdHkoKSkgeworCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgewogICAgIHRvdGFsX3NpemUgKz0KLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCiAgICAgICAgIHVua25vd25fZmllbGRzKCkpOwogICB9CiAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CkBAIC03NjkzLDQ3ICsxNDAwNiw1NyBAQAogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvOjpNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7Ci0gIGNvbnN0IFNvdXJjZUNvZGVJbmZvKiBzb3VyY2UgPQotICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmR5bmFtaWNfY2FzdF9pZl9hdmFpbGFibGU8Y29uc3QgU291cmNlQ29kZUluZm8qPigKLSAgICAgICZmcm9tKTsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgU291cmNlQ29kZUluZm8qIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBTb3VyY2VDb2RlSW5mbz4oCisgICAgICAgICAgJmZyb20pOwogICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKICAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKICAgICBNZXJnZUZyb20oKnNvdXJjZSk7CiAgIH0KIH0KIAogdm9pZCBTb3VyY2VDb2RlSW5mbzo6TWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKSB7Ci0gIEdPT0dMRV9DSEVDS19ORSgmZnJvbSwgdGhpcyk7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CiAgIGxvY2F0aW9uXy5NZXJnZUZyb20oZnJvbS5sb2NhdGlvbl8pOwotICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICBpZiAoZnJvbS5faW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIG11dGFibGVfdW5rbm93bl9maWVsZHMoKS0+TWVyZ2VGcm9tKGZyb20udW5rbm93bl9maWVsZHMoKSk7CisgIH0KIH0KIAogdm9pZCBTb3VyY2VDb2RlSW5mbzo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mbykKICAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKGZyb20pOwogfQogCiB2b2lkIFNvdXJjZUNvZGVJbmZvOjpDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8pCiAgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CiAgIENsZWFyKCk7CiAgIE1lcmdlRnJvbShmcm9tKTsKIH0KIAogYm9vbCBTb3VyY2VDb2RlSW5mbzo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKLSAgCisKICAgcmV0dXJuIHRydWU7CiB9CiAKIHZvaWQgU291cmNlQ29kZUluZm86OlN3YXAoU291cmNlQ29kZUluZm8qIG90aGVyKSB7Ci0gIGlmIChvdGhlciAhPSB0aGlzKSB7Ci0gICAgbG9jYXRpb25fLlN3YXAoJm90aGVyLT5sb2NhdGlvbl8pOwotICAgIHN0ZDo6c3dhcChfaGFzX2JpdHNfWzBdLCBvdGhlci0+X2hhc19iaXRzX1swXSk7Ci0gICAgX3Vua25vd25fZmllbGRzXy5Td2FwKCZvdGhlci0+X3Vua25vd25fZmllbGRzXyk7Ci0gICAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKLSAgfQorICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBTb3VyY2VDb2RlSW5mbzo6SW50ZXJuYWxTd2FwKFNvdXJjZUNvZGVJbmZvKiBvdGhlcikgeworICBsb2NhdGlvbl8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+bG9jYXRpb25fKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7CiB9CiAKIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgU291cmNlQ29kZUluZm86OkdldE1ldGFkYXRhKCkgY29uc3QgewpAQCAtNzc0NCw2ICsxNDA2NywxMDk4IEBACiAgIHJldHVybiBtZXRhZGF0YTsKIH0KIAorI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gU291cmNlQ29kZUluZm9fTG9jYXRpb24KKworLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworaW50IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpwYXRoX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBwYXRoXy5zaXplKCk7Cit9Cit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9wYXRoKCkgeworICBwYXRoXy5DbGVhcigpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnBhdGgoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgpCisgIHJldHVybiBwYXRoXy5HZXQoaW5kZXgpOworfQorIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9wYXRoKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwYXRoXy5TZXQoaW5kZXgsIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKK30KKyB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfcGF0aCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHBhdGhfLkFkZCh2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgpCit9CisgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cGF0aCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgpCisgIHJldHVybiBwYXRoXzsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX3BhdGgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGgpCisgIHJldHVybiAmcGF0aF87Cit9CisKKy8vIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKK2ludCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c3Bhbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gc3Bhbl8uc2l6ZSgpOworfQordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfc3BhbigpIHsKKyAgc3Bhbl8uQ2xlYXIoKTsKK30KKyA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQorICByZXR1cm4gc3Bhbl8uR2V0KGluZGV4KTsKK30KKyB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfc3BhbihpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc3Bhbl8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCit9Cisgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX3NwYW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzcGFuXy5BZGQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQorfQorIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW4oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQorICByZXR1cm4gc3Bhbl87Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9zcGFuKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQorICByZXR1cm4gJnNwYW5fOworfQorCisvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7Citib29sIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpoYXNfbGVhZGluZ19jb21tZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9Cit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9Cit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9Cit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9sZWFkaW5nX2NvbW1lbnRzKCkgeworICBsZWFkaW5nX2NvbW1lbnRzXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmxlYWRpbmdfY29tbWVudHMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCisgIHJldHVybiBsZWFkaW5nX2NvbW1lbnRzXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGxlYWRpbmdfY29tbWVudHNfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCit9Cisgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGxlYWRpbmdfY29tbWVudHNfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKK30KKyB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGxlYWRpbmdfY29tbWVudHNfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQorfQorIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX2xlYWRpbmdfY29tbWVudHMoKSB7CisgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKKyAgcmV0dXJuIGxlYWRpbmdfY29tbWVudHNfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CisgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246OnJlbGVhc2VfbGVhZGluZ19jb21tZW50cygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCisgIGNsZWFyX2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIHJldHVybiBsZWFkaW5nX2NvbW1lbnRzXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9hbGxvY2F0ZWRfbGVhZGluZ19jb21tZW50cyg6OnN0ZDo6c3RyaW5nKiBsZWFkaW5nX2NvbW1lbnRzKSB7CisgIGlmIChsZWFkaW5nX2NvbW1lbnRzICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpOworICB9CisgIGxlYWRpbmdfY29tbWVudHNfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBsZWFkaW5nX2NvbW1lbnRzKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyB0cmFpbGluZ19jb21tZW50cyA9IDQ7Citib29sIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpoYXNfdHJhaWxpbmdfY29tbWVudHMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOworfQordm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2hhc190cmFpbGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX2hhc190cmFpbGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9Cit2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl90cmFpbGluZ19jb21tZW50cygpIHsKKyAgdHJhaWxpbmdfY29tbWVudHNfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnRyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKKyAgcmV0dXJuIHRyYWlsaW5nX2NvbW1lbnRzXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgdHJhaWxpbmdfY29tbWVudHNfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQorfQorIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF90cmFpbGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIHRyYWlsaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQorfQorIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF90cmFpbGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOworICB0cmFpbGluZ19jb21tZW50c18uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQorfQorIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX3RyYWlsaW5nX2NvbW1lbnRzKCkgeworICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKKyAgcmV0dXJuIHRyYWlsaW5nX2NvbW1lbnRzXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpyZWxlYXNlX3RyYWlsaW5nX2NvbW1lbnRzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCisgIGNsZWFyX2hhc190cmFpbGluZ19jb21tZW50cygpOworICByZXR1cm4gdHJhaWxpbmdfY29tbWVudHNfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9Cisgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2FsbG9jYXRlZF90cmFpbGluZ19jb21tZW50cyg6OnN0ZDo6c3RyaW5nKiB0cmFpbGluZ19jb21tZW50cykgeworICBpZiAodHJhaWxpbmdfY29tbWVudHMgIT0gTlVMTCkgeworICAgIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgfQorICB0cmFpbGluZ19jb21tZW50c18uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHRyYWlsaW5nX2NvbW1lbnRzKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQorfQorCisvLyByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7CitpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLnNpemUoKTsKK30KK3ZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKSB7CisgIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLkNsZWFyKCk7Cit9CisgY29uc3QgOjpzdGQ6OnN0cmluZyYgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCisgIHJldHVybiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5HZXQoaW5kZXgpOworfQorIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorICByZXR1cm4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTXV0YWJsZShpbmRleCk7Cit9Cisgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKK30KKyB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9Cisgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTXV0YWJsZShpbmRleCktPmFzc2lnbigKKyAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9CisgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCisgIHJldHVybiBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5BZGQoKTsKK30KKyB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKK30KKyB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSkgeworICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorfQorIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKK30KKyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgorU291cmNlQ29kZUluZm9fTG9jYXRpb246OmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorICByZXR1cm4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c187Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjptdXRhYmxlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCisgIHJldHVybiAmbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c187Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gU291cmNlQ29kZUluZm8KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbiBsb2NhdGlvbiA9IDE7CitpbnQgU291cmNlQ29kZUluZm86OmxvY2F0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBsb2NhdGlvbl8uc2l6ZSgpOworfQordm9pZCBTb3VyY2VDb2RlSW5mbzo6Y2xlYXJfbG9jYXRpb24oKSB7CisgIGxvY2F0aW9uXy5DbGVhcigpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgU291cmNlQ29kZUluZm86OmxvY2F0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKKyAgcmV0dXJuIGxvY2F0aW9uXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm86Om11dGFibGVfbG9jYXRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKKyAgcmV0dXJuIGxvY2F0aW9uXy5NdXRhYmxlKGluZGV4KTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIFNvdXJjZUNvZGVJbmZvOjphZGRfbG9jYXRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQorICByZXR1cm4gbG9jYXRpb25fLkFkZCgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4qCitTb3VyY2VDb2RlSW5mbzo6bXV0YWJsZV9sb2NhdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8ubG9jYXRpb24pCisgIHJldHVybiAmbG9jYXRpb25fOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4mCitTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKKyAgcmV0dXJuIGxvY2F0aW9uXzsKK30KKworI2VuZGlmICAvLyBQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaWYgIWRlZmluZWQoX01TQ19WRVIpIHx8IF9NU0NfVkVSID49IDE5MDAKK2NvbnN0IGludCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjprUGF0aEZpZWxkTnVtYmVyOworY29uc3QgaW50IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmtTb3VyY2VGaWxlRmllbGROdW1iZXI7Citjb25zdCBpbnQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6a0JlZ2luRmllbGROdW1iZXI7Citjb25zdCBpbnQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6a0VuZEZpZWxkTnVtYmVyOworI2VuZGlmICAvLyAhZGVmaW5lZChfTVNDX1ZFUikgfHwgX01TQ19WRVIgPj0gMTkwMAorCitHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKCkKKyAgOiA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UoKSwgX2ludGVybmFsX21ldGFkYXRhXyhOVUxMKSB7CisgIFNoYXJlZEN0b3IoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvbnN0cnVjdG9yOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbihjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAorICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6U2hhcmVkQ3RvcigpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmcoKTsKKyAgX2NhY2hlZF9zaXplXyA9IDA7CisgIHNvdXJjZV9maWxlXy5VbnNhZmVTZXREZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGJlZ2luXyA9IDA7CisgIGVuZF8gPSAwOworICA6Om1lbXNldChfaGFzX2JpdHNfLCAwLCBzaXplb2YoX2hhc19iaXRzXykpOworfQorCitHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjp+R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisgIFNoYXJlZER0b3IoKTsKK30KKwordm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpTaGFyZWREdG9yKCkgeworICBzb3VyY2VfZmlsZV8uRGVzdHJveU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgaWYgKHRoaXMgIT0gZGVmYXVsdF9pbnN0YW5jZV8pIHsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OlNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0IHsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfQkVHSU4oKTsKKyAgX2NhY2hlZF9zaXplXyA9IHNpemU7CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb25fZGVzY3JpcHRvcl87Cit9CisKK2NvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0dlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmRlZmF1bHRfaW5zdGFuY2VfID0gTlVMTDsKKworR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIG4gPSBuZXcgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OkNsZWFyKCkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfY2xlYXJfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisjZGVmaW5lIFpSX0hFTFBFUl8oZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgXAorICBfX2J1aWx0aW5fb2Zmc2V0b2YoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiwgZikgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCisjZWxzZQorI2RlZmluZSBaUl9IRUxQRVJfKGYpIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KFwKKyAgJnJlaW50ZXJwcmV0X2Nhc3Q8R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbio+KDE2KS0+ZikKKyNlbmRpZgorCisjZGVmaW5lIFpSXyhmaXJzdCwgbGFzdCkgZG8ge1wKKyAgOjptZW1zZXQoJmZpcnN0LCAwLFwKKyAgICAgICAgICAgWlJfSEVMUEVSXyhsYXN0KSAtIFpSX0hFTFBFUl8oZmlyc3QpICsgc2l6ZW9mKGxhc3QpKTtcCit9IHdoaWxlICgwKQorCisgIGlmIChfaGFzX2JpdHNfWzAgLyAzMl0gJiAxNHUpIHsKKyAgICBaUl8oYmVnaW5fLCBlbmRfKTsKKyAgICBpZiAoaGFzX3NvdXJjZV9maWxlKCkpIHsKKyAgICAgIHNvdXJjZV9maWxlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgICAgfQorICB9CisKKyN1bmRlZiBaUl9IRUxQRVJfCisjdW5kZWYgWlJfCisKKyAgcGF0aF8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9Cit9CisKK2Jvb2wgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisjZGVmaW5lIERPXyhFWFBSRVNTSU9OKSBpZiAoIUdPT0dMRV9QUkVESUNUX1RSVUUoRVhQUkVTU0lPTikpIGdvdG8gZmFpbHVyZQorICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiB0YWc7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyAgZm9yICg7OykgeworICAgIDo6c3RkOjpwYWlyPCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiwgYm9vbD4gcCA9IGlucHV0LT5SZWFkVGFnV2l0aEN1dG9mZigxMjcpOworICAgIHRhZyA9IHAuZmlyc3Q7CisgICAgaWYgKCFwLnNlY29uZCkgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICBzd2l0Y2ggKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpKSB7CisgICAgICAvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CisgICAgICBjYXNlIDE6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAxMCkgeworICAgICAgICAgIERPXygoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmU8CisgICAgICAgICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiwgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlRZUEVfSU5UMzI+KAorICAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXRoKCkpKSk7CisgICAgICAgIH0gZWxzZSBpZiAodGFnID09IDgpIHsKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUmVwZWF0ZWRQcmltaXRpdmVOb0lubGluZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIDEsIDEwLCBpbnB1dCwgdGhpcy0+bXV0YWJsZV9wYXRoKCkpKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygxOCkpIGdvdG8gcGFyc2Vfc291cmNlX2ZpbGU7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOworICAgICAgY2FzZSAyOiB7CisgICAgICAgIGlmICh0YWcgPT0gMTgpIHsKKyAgICAgICAgIHBhcnNlX3NvdXJjZV9maWxlOgorICAgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZygKKyAgICAgICAgICAgICAgICBpbnB1dCwgdGhpcy0+bXV0YWJsZV9zb3VyY2VfZmlsZSgpKSk7CisgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgICAgICAgICB0aGlzLT5zb3VyY2VfZmlsZSgpLmRhdGEoKSwgdGhpcy0+c291cmNlX2ZpbGUoKS5sZW5ndGgoKSwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlBBUlNFLAorICAgICAgICAgICAgImdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdFRhZygyNCkpIGdvdG8gcGFyc2VfYmVnaW47CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBiZWdpbiA9IDM7CisgICAgICBjYXNlIDM6IHsKKyAgICAgICAgaWYgKHRhZyA9PSAyNCkgeworICAgICAgICAgcGFyc2VfYmVnaW46CisgICAgICAgICAgRE9fKCg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyLCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6VFlQRV9JTlQzMj4oCisgICAgICAgICAgICAgICAgIGlucHV0LCAmYmVnaW5fKSkpOworICAgICAgICAgIHNldF9oYXNfYmVnaW4oKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgICAgICB9CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0VGFnKDMyKSkgZ290byBwYXJzZV9lbmQ7CisgICAgICAgIGJyZWFrOworICAgICAgfQorCisgICAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSA0OworICAgICAgY2FzZSA0OiB7CisgICAgICAgIGlmICh0YWcgPT0gMzIpIHsKKyAgICAgICAgIHBhcnNlX2VuZDoKKyAgICAgICAgICBET18oKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPAorICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpUWVBFX0lOVDMyPigKKyAgICAgICAgICAgICAgICAgaW5wdXQsICZlbmRfKSkpOworICAgICAgICAgIHNldF9oYXNfZW5kKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZ290byBoYW5kbGVfdW51c3VhbDsKKyAgICAgICAgfQorICAgICAgICBpZiAoaW5wdXQtPkV4cGVjdEF0RW5kKCkpIGdvdG8gc3VjY2VzczsKKyAgICAgICAgYnJlYWs7CisgICAgICB9CisKKyAgICAgIGRlZmF1bHQ6IHsKKyAgICAgIGhhbmRsZV91bnVzdWFsOgorICAgICAgICBpZiAodGFnID09IDAgfHwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpID09CisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSB7CisgICAgICAgICAgZ290byBzdWNjZXNzOworICAgICAgICB9CisgICAgICAgIERPXyg6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTa2lwRmllbGQoCisgICAgICAgICAgICAgIGlucHV0LCB0YWcsIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSkpOworICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisgIH0KK3N1Y2Nlc3M6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICByZXR1cm4gZmFsc2U7CisjdW5kZWYgRE9fCit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICBpZiAodGhpcy0+cGF0aF9zaXplKCkgPiAwKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKDEsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihfcGF0aF9jYWNoZWRfYnl0ZV9zaXplXyk7CisgIH0KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB0aGlzLT5wYXRoX3NpemUoKTsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJOb1RhZygKKyAgICAgIHRoaXMtPnBhdGgoaSksIG91dHB1dCk7CisgIH0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOworICBpZiAoaGFzX3NvdXJjZV9maWxlKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nTmFtZWRGaWVsZCgKKyAgICAgIHRoaXMtPnNvdXJjZV9maWxlKCkuZGF0YSgpLCB0aGlzLT5zb3VyY2VfZmlsZSgpLmxlbmd0aCgpLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U0VSSUFMSVpFLAorICAgICAgImdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlIik7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgMiwgdGhpcy0+c291cmNlX2ZpbGUoKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIGJlZ2luID0gMzsKKyAgaWYgKGhhc19iZWdpbigpKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoMywgdGhpcy0+YmVnaW4oKSwgb3V0cHV0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7CisgIGlmIChoYXNfZW5kKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVJbnQzMig0LCB0aGlzLT5lbmQoKSwgb3V0cHV0KTsKKyAgfQorCisgIGlmIChfaW50ZXJuYWxfbWV0YWRhdGFfLmhhdmVfdW5rbm93bl9maWVsZHMoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIG91dHB1dCk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgaWYgKHRoaXMtPnBhdGhfc2l6ZSgpID4gMCkgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoCisgICAgICAxLAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsCisgICAgICB0YXJnZXQpOworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKKyAgICAgIF9wYXRoX2NhY2hlZF9ieXRlX3NpemVfLCB0YXJnZXQpOworICB9CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cGF0aF9zaXplKCk7IGkrKykgeworICAgIHRhcmdldCA9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkodGhpcy0+cGF0aChpKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7CisgIGlmIChoYXNfc291cmNlX2ZpbGUoKSkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKAorICAgICAgdGhpcy0+c291cmNlX2ZpbGUoKS5kYXRhKCksIHRoaXMtPnNvdXJjZV9maWxlKCkubGVuZ3RoKCksCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTRVJJQUxJWkUsCisgICAgICAiZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUiKTsKKyAgICB0YXJnZXQgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nVG9BcnJheSgKKyAgICAgICAgMiwgdGhpcy0+c291cmNlX2ZpbGUoKSwgdGFyZ2V0KTsKKyAgfQorCisgIC8vIG9wdGlvbmFsIGludDMyIGJlZ2luID0gMzsKKyAgaWYgKGhhc19iZWdpbigpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDMsIHRoaXMtPmJlZ2luKCksIHRhcmdldCk7CisgIH0KKworICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSA0OworICBpZiAoaGFzX2VuZCgpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzJUb0FycmF5KDQsIHRoaXMtPmVuZCgpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisgIHJldHVybiB0YXJnZXQ7Cit9CisKK2ludCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpCeXRlU2l6ZSgpIGNvbnN0IHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2J5dGVfc2l6ZV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIGlmIChfaGFzX2JpdHNfWzEgLyAzMl0gJiAxNHUpIHsKKyAgICAvLyBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOworICAgIGlmIChoYXNfc291cmNlX2ZpbGUoKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlN0cmluZ1NpemUoCisgICAgICAgICAgdGhpcy0+c291cmNlX2ZpbGUoKSk7CisgICAgfQorCisgICAgLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOworICAgIGlmIChoYXNfYmVnaW4oKSkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZSgKKyAgICAgICAgICB0aGlzLT5iZWdpbigpKTsKKyAgICB9CisKKyAgICAvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSA0OworICAgIGlmIChoYXNfZW5kKCkpIHsKKyAgICAgIHRvdGFsX3NpemUgKz0gMSArCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpJbnQzMlNpemUoCisgICAgICAgICAgdGhpcy0+ZW5kKCkpOworICAgIH0KKworICB9CisgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKKyAgeworICAgIGludCBkYXRhX3NpemUgPSAwOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+cGF0aF9zaXplKCk7IGkrKykgeworICAgICAgZGF0YV9zaXplICs9IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjoKKyAgICAgICAgSW50MzJTaXplKHRoaXMtPnBhdGgoaSkpOworICAgIH0KKyAgICBpZiAoZGF0YV9zaXplID4gMCkgeworICAgICAgdG90YWxfc2l6ZSArPSAxICsKKyAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkludDMyU2l6ZShkYXRhX3NpemUpOworICAgIH0KKyAgICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICAgIF9wYXRoX2NhY2hlZF9ieXRlX3NpemVfID0gZGF0YV9zaXplOworICAgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpOworICAgIHRvdGFsX3NpemUgKz0gZGF0YV9zaXplOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdG90YWxfc2l6ZSArPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpKTsKKyAgfQorICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gdG90YWxfc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CisgIHJldHVybiB0b3RhbF9zaXplOworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBzb3VyY2UgPSAKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8Y29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbj4oCisgICAgICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlJlZmxlY3Rpb25PcHM6Ok1lcmdlKGZyb20sIHRoaXMpOworICB9IGVsc2UgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfbWVyZ2VfZnJvbV9jYXN0X3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24pCisgICAgTWVyZ2VGcm9tKCpzb3VyY2UpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6TWVyZ2VGcm9tKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICBpZiAoR09PR0xFX1BSRURJQ1RfRkFMU0UoJmZyb20gPT0gdGhpcykpIE1lcmdlRnJvbUZhaWwoX19MSU5FX18pOworICBwYXRoXy5NZXJnZUZyb20oZnJvbS5wYXRoXyk7CisgIGlmIChmcm9tLl9oYXNfYml0c19bMSAvIDMyXSAmICgweGZmdSA8PCAoMSAlIDMyKSkpIHsKKyAgICBpZiAoZnJvbS5oYXNfc291cmNlX2ZpbGUoKSkgeworICAgICAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOworICAgICAgc291cmNlX2ZpbGVfLkFzc2lnbldpdGhEZWZhdWx0KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZnJvbS5zb3VyY2VfZmlsZV8pOworICAgIH0KKyAgICBpZiAoZnJvbS5oYXNfYmVnaW4oKSkgeworICAgICAgc2V0X2JlZ2luKGZyb20uYmVnaW4oKSk7CisgICAgfQorICAgIGlmIChmcm9tLmhhc19lbmQoKSkgeworICAgICAgc2V0X2VuZChmcm9tLmVuZCgpKTsKKyAgICB9CisgIH0KKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Q29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZ2VuZXJhbGl6ZWRfY29weV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Q29weUZyb20oY29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3NwZWNpZmljX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyAgaWYgKCZmcm9tID09IHRoaXMpIHJldHVybjsKKyAgQ2xlYXIoKTsKKyAgTWVyZ2VGcm9tKGZyb20pOworfQorCitib29sIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6U3dhcChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBvdGhlcikgeworICBpZiAob3RoZXIgPT0gdGhpcykgcmV0dXJuOworICBJbnRlcm5hbFN3YXAob3RoZXIpOworfQordm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpJbnRlcm5hbFN3YXAoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogb3RoZXIpIHsKKyAgcGF0aF8uVW5zYWZlQXJlbmFTd2FwKCZvdGhlci0+cGF0aF8pOworICBzb3VyY2VfZmlsZV8uU3dhcCgmb3RoZXItPnNvdXJjZV9maWxlXyk7CisgIHN0ZDo6c3dhcChiZWdpbl8sIG90aGVyLT5iZWdpbl8pOworICBzdGQ6OnN3YXAoZW5kXywgb3RoZXItPmVuZF8pOworICBzdGQ6OnN3YXAoX2hhc19iaXRzX1swXSwgb3RoZXItPl9oYXNfYml0c19bMF0pOworICBfaW50ZXJuYWxfbWV0YWRhdGFfLlN3YXAoJm90aGVyLT5faW50ZXJuYWxfbWV0YWRhdGFfKTsKKyAgc3RkOjpzd2FwKF9jYWNoZWRfc2l6ZV8sIG90aGVyLT5fY2FjaGVkX3NpemVfKTsKK30KKworOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKKyAgcHJvdG9idWZfQXNzaWduRGVzY3JpcHRvcnNPbmNlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgbWV0YWRhdGE7CisgIG1ldGFkYXRhLmRlc2NyaXB0b3IgPSBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbl9yZWZsZWN0aW9uXzsKKyAgcmV0dXJuIG1ldGFkYXRhOworfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCitjb25zdCBpbnQgR2VuZXJhdGVkQ29kZUluZm86OmtBbm5vdGF0aW9uRmllbGROdW1iZXI7CisjZW5kaWYgIC8vICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCisKK0dlbmVyYXRlZENvZGVJbmZvOjpHZW5lcmF0ZWRDb2RlSW5mbygpCisgIDogOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlKCksIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjb25zdHJ1Y3Rvcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm86OkluaXRBc0RlZmF1bHRJbnN0YW5jZSgpIHsKK30KKworR2VuZXJhdGVkQ29kZUluZm86OkdlbmVyYXRlZENvZGVJbmZvKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBmcm9tKQorICA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSgpLAorICAgIF9pbnRlcm5hbF9tZXRhZGF0YV8oTlVMTCkgeworICBTaGFyZWRDdG9yKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNvcHlfY29uc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpTaGFyZWRDdG9yKCkgeworICBfY2FjaGVkX3NpemVfID0gMDsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKK30KKworR2VuZXJhdGVkQ29kZUluZm86On5HZW5lcmF0ZWRDb2RlSW5mbygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGRlc3RydWN0b3I6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorICBTaGFyZWREdG9yKCk7Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm86OlNoYXJlZER0b3IoKSB7CisgIGlmICh0aGlzICE9IGRlZmF1bHRfaW5zdGFuY2VfKSB7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3QgeworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpOworICBfY2FjaGVkX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7Cit9Citjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIEdlbmVyYXRlZENvZGVJbmZvOjpkZXNjcmlwdG9yKCkgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgcmV0dXJuIEdlbmVyYXRlZENvZGVJbmZvX2Rlc2NyaXB0b3JfOworfQorCitjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgR2VuZXJhdGVkQ29kZUluZm86OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIGlmIChkZWZhdWx0X2luc3RhbmNlXyA9PSBOVUxMKSBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIHJldHVybiAqZGVmYXVsdF9pbnN0YW5jZV87Cit9CisKK0dlbmVyYXRlZENvZGVJbmZvKiBHZW5lcmF0ZWRDb2RlSW5mbzo6ZGVmYXVsdF9pbnN0YW5jZV8gPSBOVUxMOworCitHZW5lcmF0ZWRDb2RlSW5mbyogR2VuZXJhdGVkQ29kZUluZm86Ok5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3QgeworICBHZW5lcmF0ZWRDb2RlSW5mbyogbiA9IG5ldyBHZW5lcmF0ZWRDb2RlSW5mbzsKKyAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICBhcmVuYS0+T3duKG4pOworICB9CisgIHJldHVybiBuOworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpDbGVhcigpIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChtZXNzYWdlX2NsZWFyX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgYW5ub3RhdGlvbl8uQ2xlYXIoKTsKKyAgOjptZW1zZXQoX2hhc19iaXRzXywgMCwgc2l6ZW9mKF9oYXNfYml0c18pKTsKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5DbGVhcigpOworICB9Cit9CisKK2Jvb2wgR2VuZXJhdGVkQ29kZUluZm86Ok1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworI2RlZmluZSBET18oRVhQUkVTU0lPTikgaWYgKCFHT09HTEVfUFJFRElDVF9UUlVFKEVYUFJFU1NJT04pKSBnb3RvIGZhaWx1cmUKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgdGFnOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQocGFyc2Vfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorICBmb3IgKDs7KSB7CisgICAgOjpzdGQ6OnBhaXI8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyLCBib29sPiBwID0gaW5wdXQtPlJlYWRUYWdXaXRoQ3V0b2ZmKDEyNyk7CisgICAgdGFnID0gcC5maXJzdDsKKyAgICBpZiAoIXAuc2Vjb25kKSBnb3RvIGhhbmRsZV91bnVzdWFsOworICAgIHN3aXRjaCAoOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZykpIHsKKyAgICAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKKyAgICAgIGNhc2UgMTogeworICAgICAgICBpZiAodGFnID09IDEwKSB7CisgICAgICAgICAgRE9fKGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKTsKKyAgICAgICAgIHBhcnNlX2xvb3BfYW5ub3RhdGlvbjoKKyAgICAgICAgICBET18oOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKKyAgICAgICAgICAgICAgICBpbnB1dCwgYWRkX2Fubm90YXRpb24oKSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIGdvdG8gaGFuZGxlX3VudXN1YWw7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGlucHV0LT5FeHBlY3RUYWcoMTApKSBnb3RvIHBhcnNlX2xvb3BfYW5ub3RhdGlvbjsKKyAgICAgICAgaW5wdXQtPlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgICAgICAgIGlmIChpbnB1dC0+RXhwZWN0QXRFbmQoKSkgZ290byBzdWNjZXNzOworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgZGVmYXVsdDogeworICAgICAgaGFuZGxlX3VudXN1YWw6CisgICAgICAgIGlmICh0YWcgPT0gMCB8fAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZykgPT0KKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgICAgICBnb3RvIHN1Y2Nlc3M7CisgICAgICAgIH0KKyAgICAgICAgRE9fKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXQ6OlNraXBGaWVsZCgKKyAgICAgICAgICAgICAgaW5wdXQsIHRhZywgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpKSk7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQorc3VjY2VzczoKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHBhcnNlX3N1Y2Nlc3M6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorICByZXR1cm4gdHJ1ZTsKK2ZhaWx1cmU6CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChwYXJzZV9mYWlsdXJlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgcmV0dXJuIGZhbHNlOworI3VuZGVmIERPXworfQorCit2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoc2VyaWFsaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uIGFubm90YXRpb24gPSAxOworICBmb3IgKHVuc2lnbmVkIGludCBpID0gMCwgbiA9IHRoaXMtPmFubm90YXRpb25fc2l6ZSgpOyBpIDwgbjsgaSsrKSB7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZU1heWJlVG9BcnJheSgKKyAgICAgIDEsIHRoaXMtPmFubm90YXRpb24oaSksIG91dHB1dCk7CisgIH0KKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpTZXJpYWxpemVVbmtub3duRmllbGRzKAorICAgICAgICB1bmtub3duX2ZpZWxkcygpLCBvdXRwdXQpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfZW5kOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKK30KKworOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogR2VuZXJhdGVkQ29kZUluZm86OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoCisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChzZXJpYWxpemVfdG9fYXJyYXlfc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CisgIGZvciAodW5zaWduZWQgaW50IGkgPSAwLCBuID0gdGhpcy0+YW5ub3RhdGlvbl9zaXplKCk7IGkgPCBuOyBpKyspIHsKKyAgICB0YXJnZXQgPSA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6CisgICAgICBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAorICAgICAgICAxLCB0aGlzLT5hbm5vdGF0aW9uKGkpLCB0YXJnZXQpOworICB9CisKKyAgaWYgKF9pbnRlcm5hbF9tZXRhZGF0YV8uaGF2ZV91bmtub3duX2ZpZWxkcygpKSB7CisgICAgdGFyZ2V0ID0gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkc1RvQXJyYXkoCisgICAgICAgIHVua25vd25fZmllbGRzKCksIHRhcmdldCk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KHNlcmlhbGl6ZV90b19hcnJheV9lbmQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorICByZXR1cm4gdGFyZ2V0OworfQorCitpbnQgR2VuZXJhdGVkQ29kZUluZm86OkJ5dGVTaXplKCkgY29uc3QgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG1lc3NhZ2VfYnl0ZV9zaXplX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgaW50IHRvdGFsX3NpemUgPSAwOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKKyAgdG90YWxfc2l6ZSArPSAxICogdGhpcy0+YW5ub3RhdGlvbl9zaXplKCk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdGhpcy0+YW5ub3RhdGlvbl9zaXplKCk7IGkrKykgeworICAgIHRvdGFsX3NpemUgKz0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKKyAgICAgICAgdGhpcy0+YW5ub3RhdGlvbihpKSk7CisgIH0KKworICBpZiAoX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICB0b3RhbF9zaXplICs9CisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0OjpDb21wdXRlVW5rbm93bkZpZWxkc1NpemUoCisgICAgICAgIHVua25vd25fZmllbGRzKCkpOworICB9CisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CisgIF9jYWNoZWRfc2l6ZV8gPSB0b3RhbF9zaXplOworICBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQoKTsKKyAgcmV0dXJuIHRvdGFsX3NpemU7Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm86Ok1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChnZW5lcmFsaXplZF9tZXJnZV9mcm9tX3N0YXJ0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKCZmcm9tID09IHRoaXMpKSBNZXJnZUZyb21GYWlsKF9fTElORV9fKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm8qIHNvdXJjZSA9IAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbz4oCisgICAgICAgICAgJmZyb20pOworICBpZiAoc291cmNlID09IE5VTEwpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9mYWlsOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpSZWZsZWN0aW9uT3BzOjpNZXJnZShmcm9tLCB0aGlzKTsKKyAgfSBlbHNlIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX21lcmdlX2Zyb21fY2FzdF9zdWNjZXNzOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mbykKKyAgICBNZXJnZUZyb20oKnNvdXJjZSk7CisgIH0KK30KKwordm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6TWVyZ2VGcm9tKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBmcm9tKSB7CisvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc3BlY2lmaWNfbWVyZ2VfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCisgIGlmIChHT09HTEVfUFJFRElDVF9GQUxTRSgmZnJvbSA9PSB0aGlzKSkgTWVyZ2VGcm9tRmFpbChfX0xJTkVfXyk7CisgIGFubm90YXRpb25fLk1lcmdlRnJvbShmcm9tLmFubm90YXRpb25fKTsKKyAgaWYgKGZyb20uX2ludGVybmFsX21ldGFkYXRhXy5oYXZlX3Vua25vd25fZmllbGRzKCkpIHsKKyAgICBtdXRhYmxlX3Vua25vd25fZmllbGRzKCktPk1lcmdlRnJvbShmcm9tLnVua25vd25fZmllbGRzKCkpOworICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm86OkNvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSkgeworLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdlbmVyYWxpemVkX2NvcHlfZnJvbV9zdGFydDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8pCisgIGlmICgmZnJvbSA9PSB0aGlzKSByZXR1cm47CisgIENsZWFyKCk7CisgIE1lcmdlRnJvbShmcm9tKTsKK30KKwordm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6Q29weUZyb20oY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGZyb20pIHsKKy8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zcGVjaWZpY19jb3B5X2Zyb21fc3RhcnQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorICBpZiAoJmZyb20gPT0gdGhpcykgcmV0dXJuOworICBDbGVhcigpOworICBNZXJnZUZyb20oZnJvbSk7Cit9CisKK2Jvb2wgR2VuZXJhdGVkQ29kZUluZm86OklzSW5pdGlhbGl6ZWQoKSBjb25zdCB7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm86OlN3YXAoR2VuZXJhdGVkQ29kZUluZm8qIG90aGVyKSB7CisgIGlmIChvdGhlciA9PSB0aGlzKSByZXR1cm47CisgIEludGVybmFsU3dhcChvdGhlcik7Cit9Cit2b2lkIEdlbmVyYXRlZENvZGVJbmZvOjpJbnRlcm5hbFN3YXAoR2VuZXJhdGVkQ29kZUluZm8qIG90aGVyKSB7CisgIGFubm90YXRpb25fLlVuc2FmZUFyZW5hU3dhcCgmb3RoZXItPmFubm90YXRpb25fKTsKKyAgc3RkOjpzd2FwKF9oYXNfYml0c19bMF0sIG90aGVyLT5faGFzX2JpdHNfWzBdKTsKKyAgX2ludGVybmFsX21ldGFkYXRhXy5Td2FwKCZvdGhlci0+X2ludGVybmFsX21ldGFkYXRhXyk7CisgIHN0ZDo6c3dhcChfY2FjaGVkX3NpemVfLCBvdGhlci0+X2NhY2hlZF9zaXplXyk7Cit9CisKKzo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2VuZXJhdGVkQ29kZUluZm86OkdldE1ldGFkYXRhKCkgY29uc3QgeworICBwcm90b2J1Zl9Bc3NpZ25EZXNjcmlwdG9yc09uY2UoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBtZXRhZGF0YTsKKyAgbWV0YWRhdGEuZGVzY3JpcHRvciA9IEdlbmVyYXRlZENvZGVJbmZvX2Rlc2NyaXB0b3JfOworICBtZXRhZGF0YS5yZWZsZWN0aW9uID0gR2VuZXJhdGVkQ29kZUluZm9fcmVmbGVjdGlvbl87CisgIHJldHVybiBtZXRhZGF0YTsKK30KKworI2lmIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbgorCisvLyByZXBlYXRlZCBpbnQzMiBwYXRoID0gMSBbcGFja2VkID0gdHJ1ZV07CitpbnQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cGF0aF9zaXplKCkgY29uc3QgeworICByZXR1cm4gcGF0aF8uc2l6ZSgpOworfQordm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9wYXRoKCkgeworICBwYXRoXy5DbGVhcigpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQorICByZXR1cm4gcGF0aF8uR2V0KGluZGV4KTsKK30KKyB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9wYXRoKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwYXRoXy5TZXQoaW5kZXgsIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQorfQorIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6YWRkX3BhdGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwYXRoXy5BZGQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCit9CisgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCitHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpwYXRoKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQorICByZXR1cm4gcGF0aF87Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCitHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjptdXRhYmxlX3BhdGgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCkKKyAgcmV0dXJuICZwYXRoXzsKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIHNvdXJjZV9maWxlID0gMjsKK2Jvb2wgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6aGFzX3NvdXJjZV9maWxlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2hhc19zb3VyY2VfZmlsZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfaGFzX3NvdXJjZV9maWxlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfc291cmNlX2ZpbGUoKSB7CisgIHNvdXJjZV9maWxlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19zb3VyY2VfZmlsZSgpOworfQorIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNvdXJjZV9maWxlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQorICByZXR1cm4gc291cmNlX2ZpbGVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KKyB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9zb3VyY2VfZmlsZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7CisgIHNvdXJjZV9maWxlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQorfQorIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X3NvdXJjZV9maWxlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfc291cmNlX2ZpbGUoKTsKKyAgc291cmNlX2ZpbGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKK30KKyB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9zb3VyY2VfZmlsZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOworICBzb3VyY2VfZmlsZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCit9CisgOjpzdGQ6OnN0cmluZyogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6bXV0YWJsZV9zb3VyY2VfZmlsZSgpIHsKKyAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKKyAgcmV0dXJuIHNvdXJjZV9maWxlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIDo6c3RkOjpzdHJpbmcqIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnJlbGVhc2Vfc291cmNlX2ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQorICBjbGVhcl9oYXNfc291cmNlX2ZpbGUoKTsKKyAgcmV0dXJuIHNvdXJjZV9maWxlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQorIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2FsbG9jYXRlZF9zb3VyY2VfZmlsZSg6OnN0ZDo6c3RyaW5nKiBzb3VyY2VfZmlsZSkgeworICBpZiAoc291cmNlX2ZpbGUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfc291cmNlX2ZpbGUoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfc291cmNlX2ZpbGUoKTsKKyAgfQorICBzb3VyY2VfZmlsZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHNvdXJjZV9maWxlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIGJlZ2luID0gMzsKK2Jvb2wgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6aGFzX2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2hhc19iZWdpbigpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfaGFzX2JlZ2luKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfYmVnaW4oKSB7CisgIGJlZ2luXyA9IDA7CisgIGNsZWFyX2hhc19iZWdpbigpOworfQorIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6YmVnaW4oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uYmVnaW4pCisgIHJldHVybiBiZWdpbl87Cit9Cisgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfYmVnaW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX2JlZ2luKCk7CisgIGJlZ2luXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLmJlZ2luKQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSA0OworYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpoYXNfZW5kKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKK30KK3ZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2hhc19lbmQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7Cit9Cit2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX2hhc19lbmQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQordm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9lbmQoKSB7CisgIGVuZF8gPSAwOworICBjbGVhcl9oYXNfZW5kKCk7Cit9CisgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjplbmQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uZW5kKQorICByZXR1cm4gZW5kXzsKK30KKyB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX2VuZCgpOworICBlbmRfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uZW5kKQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEdlbmVyYXRlZENvZGVJbmZvCisKKy8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbiBhbm5vdGF0aW9uID0gMTsKK2ludCBHZW5lcmF0ZWRDb2RlSW5mbzo6YW5ub3RhdGlvbl9zaXplKCkgY29uc3QgeworICByZXR1cm4gYW5ub3RhdGlvbl8uc2l6ZSgpOworfQordm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6Y2xlYXJfYW5ub3RhdGlvbigpIHsKKyAgYW5ub3RhdGlvbl8uQ2xlYXIoKTsKK30KK2NvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgR2VuZXJhdGVkQ29kZUluZm86OmFubm90YXRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24pCisgIHJldHVybiBhbm5vdGF0aW9uXy5HZXQoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBHZW5lcmF0ZWRDb2RlSW5mbzo6bXV0YWJsZV9hbm5vdGF0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKKyAgcmV0dXJuIGFubm90YXRpb25fLk11dGFibGUoaW5kZXgpOworfQorOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBHZW5lcmF0ZWRDb2RlSW5mbzo6YWRkX2Fubm90YXRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24pCisgIHJldHVybiBhbm5vdGF0aW9uXy5BZGQoKTsKK30KKzo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uID4qCitHZW5lcmF0ZWRDb2RlSW5mbzo6bXV0YWJsZV9hbm5vdGF0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQorICByZXR1cm4gJmFubm90YXRpb25fOworfQorY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPiYKK0dlbmVyYXRlZENvZGVJbmZvOjphbm5vdGF0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKKyAgcmV0dXJuIGFubm90YXRpb25fOworfQorCisjZW5kaWYgIC8vIFBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUwogCiAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQobmFtZXNwYWNlX3Njb3BlKQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmgKaW5kZXggMWY5MWQ3OS4uOTJhMGEzYSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaApAQCAtOCwyMiArOCwyNiBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogCi0jaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAyMDA0MDAwCisjaWYgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gPCAzMDAwMDAwCiAjZXJyb3IgVGhpcyBmaWxlIHdhcyBnZW5lcmF0ZWQgYnkgYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYyB3aGljaCBpcwogI2Vycm9yIGluY29tcGF0aWJsZSB3aXRoIHlvdXIgUHJvdG9jb2wgQnVmZmVyIGhlYWRlcnMuICBQbGVhc2UgdXBkYXRlCiAjZXJyb3IgeW91ciBoZWFkZXJzLgogI2VuZGlmCi0jaWYgMjAwNDAwMiA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fUFJPVE9DX1ZFUlNJT04KKyNpZiAzMDAwMDAwIDwgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTgogI2Vycm9yIFRoaXMgZmlsZSB3YXMgZ2VuZXJhdGVkIGJ5IGFuIG9sZGVyIHZlcnNpb24gb2YgcHJvdG9jIHdoaWNoIGlzCiAjZXJyb3IgaW5jb21wYXRpYmxlIHdpdGggeW91ciBQcm90b2NvbCBCdWZmZXIgaGVhZGVycy4gIFBsZWFzZQogI2Vycm9yIHJlZ2VuZXJhdGUgdGhpcyBmaWxlIHdpdGggYSBuZXdlciB2ZXJzaW9uIG9mIHByb3RvYy4KICNlbmRpZgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgogLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGluY2x1ZGVzKQogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKQEAgLTM0LDI2ICszOCwzMCBAQAogdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogCi1jbGFzcyBGaWxlRGVzY3JpcHRvclNldDsKLWNsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG87CiBjbGFzcyBEZXNjcmlwdG9yUHJvdG87CiBjbGFzcyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2U7Ci1jbGFzcyBGaWVsZERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOwogY2xhc3MgRW51bURlc2NyaXB0b3JQcm90bzsKLWNsYXNzIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzsKLWNsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87Ci1jbGFzcyBNZXRob2REZXNjcmlwdG9yUHJvdG87Ci1jbGFzcyBGaWxlT3B0aW9uczsKLWNsYXNzIE1lc3NhZ2VPcHRpb25zOwotY2xhc3MgRmllbGRPcHRpb25zOwogY2xhc3MgRW51bU9wdGlvbnM7CitjbGFzcyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG87CiBjbGFzcyBFbnVtVmFsdWVPcHRpb25zOwotY2xhc3MgU2VydmljZU9wdGlvbnM7CitjbGFzcyBGaWVsZERlc2NyaXB0b3JQcm90bzsKK2NsYXNzIEZpZWxkT3B0aW9uczsKK2NsYXNzIEZpbGVEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBGaWxlRGVzY3JpcHRvclNldDsKK2NsYXNzIEZpbGVPcHRpb25zOworY2xhc3MgR2VuZXJhdGVkQ29kZUluZm87CitjbGFzcyBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOworY2xhc3MgTWVzc2FnZU9wdGlvbnM7CitjbGFzcyBNZXRob2REZXNjcmlwdG9yUHJvdG87CiBjbGFzcyBNZXRob2RPcHRpb25zOwotY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbjsKLWNsYXNzIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ7CitjbGFzcyBPbmVvZkRlc2NyaXB0b3JQcm90bzsKK2NsYXNzIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG87CitjbGFzcyBTZXJ2aWNlT3B0aW9uczsKIGNsYXNzIFNvdXJjZUNvZGVJbmZvOwogY2xhc3MgU291cmNlQ29kZUluZm9fTG9jYXRpb247CitjbGFzcyBVbmludGVycHJldGVkT3B0aW9uOworY2xhc3MgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDsKIAogZW51bSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlIHsKICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0RPVUJMRSA9IDEsCkBAIC0xNTAsNDMgKzE1OCw2NSBAQAogICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6UGFyc2VOYW1lZEVudW08RmllbGRPcHRpb25zX0NUeXBlPigKICAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7CiB9CitlbnVtIEZpZWxkT3B0aW9uc19KU1R5cGUgeworICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05PUk1BTCA9IDAsCisgIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfU1RSSU5HID0gMSwKKyAgRmllbGRPcHRpb25zX0pTVHlwZV9KU19OVU1CRVIgPSAyCit9OworTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgRmllbGRPcHRpb25zX0pTVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSk7Citjb25zdCBGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX01JTiA9IEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfTk9STUFMOworY29uc3QgRmllbGRPcHRpb25zX0pTVHlwZSBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9NQVggPSBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05VTUJFUjsKK2NvbnN0IGludCBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9BUlJBWVNJWkUgPSBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9NQVggKyAxOworCitMSUJQUk9UT0JVRl9FWFBPUlQgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvciogRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yKCk7CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmllbGRPcHRpb25zX0pTVHlwZV9OYW1lKEZpZWxkT3B0aW9uc19KU1R5cGUgdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6Ok5hbWVPZkVudW0oCisgICAgRmllbGRPcHRpb25zX0pTVHlwZV9kZXNjcmlwdG9yKCksIHZhbHVlKTsKK30KK2lubGluZSBib29sIEZpZWxkT3B0aW9uc19KU1R5cGVfUGFyc2UoCisgICAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwgRmllbGRPcHRpb25zX0pTVHlwZSogdmFsdWUpIHsKKyAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OlBhcnNlTmFtZWRFbnVtPEZpZWxkT3B0aW9uc19KU1R5cGU+KAorICAgIEZpZWxkT3B0aW9uc19KU1R5cGVfZGVzY3JpcHRvcigpLCBuYW1lLCB2YWx1ZSk7Cit9CiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGaWxlRGVzY3JpcHRvclNldCA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgewogIHB1YmxpYzoKICAgRmlsZURlc2NyaXB0b3JTZXQoKTsKICAgdmlydHVhbCB+RmlsZURlc2NyaXB0b3JTZXQoKTsKLSAgCisKICAgRmlsZURlc2NyaXB0b3JTZXQoY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pOwotICAKKwogICBpbmxpbmUgRmlsZURlc2NyaXB0b3JTZXQmIG9wZXJhdG9yPShjb25zdCBGaWxlRGVzY3JpcHRvclNldCYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwogICBzdGF0aWMgY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCisKICAgdm9pZCBTd2FwKEZpbGVEZXNjcmlwdG9yU2V0KiBvdGhlcik7Ci0gIAorCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBGaWxlRGVzY3JpcHRvclNldCogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIEZpbGVEZXNjcmlwdG9yU2V0KiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBGaWxlRGVzY3JpcHRvclNldCogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpbGVEZXNjcmlwdG9yU2V0JiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JTZXQmIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC0xOTgsNDAgKzIyOCw0NSBAQAogICB2b2lkIFNoYXJlZEN0b3IoKTsKICAgdm9pZCBTaGFyZWREdG9yKCk7CiAgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEZpbGVEZXNjcmlwdG9yU2V0KiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvIGZpbGUgPSAxOwotICBpbmxpbmUgaW50IGZpbGVfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9maWxlKCk7CisgIGludCBmaWxlX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9maWxlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0ZpbGVGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIGZpbGUoaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWxlKGludCBpbmRleCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIGFkZF9maWxlKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgotICAgICAgZmlsZSgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvJiBmaWxlKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWxlKGludCBpbmRleCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byogYWRkX2ZpbGUoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPioKICAgICAgIG11dGFibGVfZmlsZSgpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGZpbGUoKSBjb25zdDsKKwogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0KQogIHByaXZhdGU6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiBmaWxlXzsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwogICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygxICsgMzEpIC8gMzJdOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8gPiBmaWxlXzsKICAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgCisKICAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgc3RhdGljIEZpbGVEZXNjcmlwdG9yU2V0KiBkZWZhdWx0X2luc3RhbmNlXzsKIH07CkBAIC0yNDEsMzcgKzI3NiwzOSBAQAogIHB1YmxpYzoKICAgRmlsZURlc2NyaXB0b3JQcm90bygpOwogICB2aXJ0dWFsIH5GaWxlRGVzY3JpcHRvclByb3RvKCk7Ci0gIAorCiAgIEZpbGVEZXNjcmlwdG9yUHJvdG8oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBGaWxlRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwogICBzdGF0aWMgY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoRmlsZURlc2NyaXB0b3JQcm90byogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgRmlsZURlc2NyaXB0b3JQcm90byogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIEZpbGVEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBGaWxlRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTI4MywxMTYgKzMyMCwxNjQgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChGaWxlRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSk7CisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIHBhY2thZ2UgPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfcGFja2FnZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9wYWNrYWdlKCk7CisgIGJvb2wgaGFzX3BhY2thZ2UoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9wYWNrYWdlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga1BhY2thZ2VGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBwYWNrYWdlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9wYWNrYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9wYWNrYWdlKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3BhY2thZ2UoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHBhY2thZ2UoKSBjb25zdDsKKyAgdm9pZCBzZXRfcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfcGFja2FnZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3BhY2thZ2UoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogcGFja2FnZSk7CisKICAgLy8gcmVwZWF0ZWQgc3RyaW5nIGRlcGVuZGVuY3kgPSAzOwotICBpbmxpbmUgaW50IGRlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9kZXBlbmRlbmN5KCk7CisgIGludCBkZXBlbmRlbmN5X3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9kZXBlbmRlbmN5KCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0RlcGVuZGVuY3lGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBkZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2RlcGVuZGVuY3koaW50IGluZGV4KTsKLSAgaW5saW5lIHZvaWQgc2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBhZGRfZGVwZW5kZW5jeSgpOwotICBpbmxpbmUgdm9pZCBhZGRfZGVwZW5kZW5jeShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4mIGRlcGVuZGVuY3koKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qIG11dGFibGVfZGVwZW5kZW5jeSgpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0OworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2RlcGVuZGVuY3koaW50IGluZGV4KTsKKyAgdm9pZCBzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfZGVwZW5kZW5jeShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIGFkZF9kZXBlbmRlbmN5KCk7CisgIHZvaWQgYWRkX2RlcGVuZGVuY3koY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIGFkZF9kZXBlbmRlbmN5KGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBhZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiBkZXBlbmRlbmN5KCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qIG11dGFibGVfZGVwZW5kZW5jeSgpOworCisgIC8vIHJlcGVhdGVkIGludDMyIHB1YmxpY19kZXBlbmRlbmN5ID0gMTA7CisgIGludCBwdWJsaWNfZGVwZW5kZW5jeV9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfcHVibGljX2RlcGVuZGVuY3koKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUHVibGljRGVwZW5kZW5jeUZpZWxkTnVtYmVyID0gMTA7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgcHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4KSBjb25zdDsKKyAgdm9pZCBzZXRfcHVibGljX2RlcGVuZGVuY3koaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKyAgdm9pZCBhZGRfcHVibGljX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorICAgICAgcHVibGljX2RlcGVuZGVuY3koKSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCisgICAgICBtdXRhYmxlX3B1YmxpY19kZXBlbmRlbmN5KCk7CisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgd2Vha19kZXBlbmRlbmN5ID0gMTE7CisgIGludCB3ZWFrX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3dlYWtfZGVwZW5kZW5jeSgpOworICBzdGF0aWMgY29uc3QgaW50IGtXZWFrRGVwZW5kZW5jeUZpZWxkTnVtYmVyID0gMTE7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgd2Vha19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3Q7CisgIHZvaWQgc2V0X3dlYWtfZGVwZW5kZW5jeShpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworICB2b2lkIGFkZF93ZWFrX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorICAgICAgd2Vha19kZXBlbmRlbmN5KCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorICAgICAgbXV0YWJsZV93ZWFrX2RlcGVuZGVuY3koKTsKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBtZXNzYWdlX3R5cGUgPSA0OwotICBpbmxpbmUgaW50IG1lc3NhZ2VfdHlwZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX21lc3NhZ2VfdHlwZSgpOworICBpbnQgbWVzc2FnZV90eXBlX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9tZXNzYWdlX3R5cGUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrTWVzc2FnZVR5cGVGaWVsZE51bWJlciA9IDQ7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byYgbWVzc2FnZV90eXBlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogbXV0YWJsZV9tZXNzYWdlX3R5cGUoaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBhZGRfbWVzc2FnZV90eXBlKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4mCi0gICAgICBtZXNzYWdlX3R5cGUoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIG1lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogbXV0YWJsZV9tZXNzYWdlX3R5cGUoaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXNzYWdlX3R5cGUoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+KgogICAgICAgbXV0YWJsZV9tZXNzYWdlX3R5cGUoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG1lc3NhZ2VfdHlwZSgpIGNvbnN0OworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90byBlbnVtX3R5cGUgPSA1OwotICBpbmxpbmUgaW50IGVudW1fdHlwZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2VudW1fdHlwZSgpOworICBpbnQgZW51bV90eXBlX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9lbnVtX3R5cGUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrRW51bVR5cGVGaWVsZE51bWJlciA9IDU7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBhZGRfZW51bV90eXBlKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgotICAgICAgZW51bV90eXBlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIGVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZW51bV90eXBlKGludCBpbmRleCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogYWRkX2VudW1fdHlwZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgogICAgICAgbXV0YWJsZV9lbnVtX3R5cGUoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCisgICAgICBlbnVtX3R5cGUoKSBjb25zdDsKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gc2VydmljZSA9IDY7Ci0gIGlubGluZSBpbnQgc2VydmljZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3NlcnZpY2UoKTsKKyAgaW50IHNlcnZpY2Vfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3NlcnZpY2UoKTsKICAgc3RhdGljIGNvbnN0IGludCBrU2VydmljZUZpZWxkTnVtYmVyID0gNjsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byYgc2VydmljZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX3NlcnZpY2UoaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byogYWRkX3NlcnZpY2UoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBzZXJ2aWNlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIHNlcnZpY2UoaW50IGluZGV4KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX3NlcnZpY2UoaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBhZGRfc2VydmljZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+KgogICAgICAgbXV0YWJsZV9zZXJ2aWNlKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+JgorICAgICAgc2VydmljZSgpIGNvbnN0OworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8gZXh0ZW5zaW9uID0gNzsKLSAgaW5saW5lIGludCBleHRlbnNpb25fc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9leHRlbnNpb24oKTsKKyAgaW50IGV4dGVuc2lvbl9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZXh0ZW5zaW9uKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0V4dGVuc2lvbkZpZWxkTnVtYmVyID0gNzsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8mIGV4dGVuc2lvbihpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9leHRlbnNpb24oaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIGFkZF9leHRlbnNpb24oKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgotICAgICAgZXh0ZW5zaW9uKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIGFkZF9leHRlbnNpb24oKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCiAgICAgICBtdXRhYmxlX2V4dGVuc2lvbigpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCisgICAgICBleHRlbnNpb24oKSBjb25zdDsKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zIG9wdGlvbnMgPSA4OwotICBpbmxpbmUgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDg7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnMpOworCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8gc291cmNlX2NvZGVfaW5mbyA9IDk7Ci0gIGlubGluZSBib29sIGhhc19zb3VyY2VfY29kZV9pbmZvKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgYm9vbCBoYXNfc291cmNlX2NvZGVfaW5mbygpIGNvbnN0OworICB2b2lkIGNsZWFyX3NvdXJjZV9jb2RlX2luZm8oKTsKICAgc3RhdGljIGNvbnN0IGludCBrU291cmNlQ29kZUluZm9GaWVsZE51bWJlciA9IDk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvJiBzb3VyY2VfY29kZV9pbmZvKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBtdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHJlbGVhc2Vfc291cmNlX2NvZGVfaW5mbygpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyYgc291cmNlX2NvZGVfaW5mbygpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBtdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogcmVsZWFzZV9zb3VyY2VfY29kZV9pbmZvKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9zb3VyY2VfY29kZV9pbmZvKDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm8qIHNvdXJjZV9jb2RlX2luZm8pOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBzeW50YXggPSAxMjsKKyAgYm9vbCBoYXNfc3ludGF4KCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfc3ludGF4KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1N5bnRheEZpZWxkTnVtYmVyID0gMTI7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHN5bnRheCgpIGNvbnN0OworICB2b2lkIHNldF9zeW50YXgoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9zeW50YXgoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9zeW50YXgoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9zeW50YXgoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9zeW50YXgoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3N5bnRheCg6OnN0ZDo6c3RyaW5nKiBzeW50YXgpOworCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90bykKICBwcml2YXRlOgogICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWUoKTsKQEAgLTQwMywyNiArNDg4LDI4IEBACiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCi0gIDo6c3RkOjpzdHJpbmcqIG5hbWVfOwotICA6OnN0ZDo6c3RyaW5nKiBwYWNrYWdlXzsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19zeW50YXgoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3N5bnRheCgpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHBhY2thZ2VfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IGRlcGVuZGVuY3lfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiBwdWJsaWNfZGVwZW5kZW5jeV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+IHdlYWtfZGVwZW5kZW5jeV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiBtZXNzYWdlX3R5cGVfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+IGVudW1fdHlwZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvID4gc2VydmljZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+IGV4dGVuc2lvbl87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnNfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiBzb3VyY2VfY29kZV9pbmZvXzsKLSAgCi0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDkgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBzeW50YXhfOwogICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgRmlsZURlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtNDMyLDM3ICs1MTksMzkgQEAKICBwdWJsaWM6CiAgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSgpOwogICB2aXJ0dWFsIH5EZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UoKTsKLSAgCisKICAgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBvdGhlcik7Ci0gIAorCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIE5ldygpIGNvbnN0OworCisgIGlubGluZSBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTQ3NCw4NyArNTYzLDE5MyBAQAogICB2b2lkIFNoYXJlZEN0b3IoKTsKICAgdm9pZCBTaGFyZWREdG9yKCk7CiAgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX3N0YXJ0KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3N0YXJ0KCk7CisgIGJvb2wgaGFzX3N0YXJ0KCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfc3RhcnQoKTsKICAgc3RhdGljIGNvbnN0IGludCBrU3RhcnRGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHN0YXJ0KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9zdGFydCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKLSAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc3RhcnQoKSBjb25zdDsKKyAgdm9pZCBzZXRfc3RhcnQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX2VuZCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9lbmQoKTsKKyAgYm9vbCBoYXNfZW5kKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZW5kKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0VuZEZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZW5kKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVuZCgpIGNvbnN0OworICB2b2lkIHNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UpCiAgcHJpdmF0ZToKICAgaW5saW5lIHZvaWQgc2V0X2hhc19zdGFydCgpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfc3RhcnQoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19lbmQoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2VuZCgpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHN0YXJ0XzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBlbmRfOwotICAKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMiArIDMxKSAvIDMyXTsKLSAgCiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSgpOworICB2aXJ0dWFsIH5EZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSgpOworCisgIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBmcm9tKTsKKworICBpbmxpbmUgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogb3RoZXIpOworCisgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgaW5saW5lIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gb3B0aW9uYWwgaW50MzIgc3RhcnQgPSAxOworICBib29sIGhhc19zdGFydCgpIGNvbnN0OworICB2b2lkIGNsZWFyX3N0YXJ0KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1N0YXJ0RmllbGROdW1iZXIgPSAxOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHN0YXJ0KCkgY29uc3Q7CisgIHZvaWQgc2V0X3N0YXJ0KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CisgIGJvb2wgaGFzX2VuZCgpIGNvbnN0OworICB2b2lkIGNsZWFyX2VuZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtFbmRGaWVsZE51bWJlciA9IDI7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZW5kKCkgY29uc3Q7CisgIHZvaWQgc2V0X2VuZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfc3RhcnQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3N0YXJ0KCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZW5kKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19lbmQoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc3RhcnRfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIGVuZF87CisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKICBwdWJsaWM6CiAgIERlc2NyaXB0b3JQcm90bygpOwogICB2aXJ0dWFsIH5EZXNjcmlwdG9yUHJvdG8oKTsKLSAgCisKICAgRGVzY3JpcHRvclByb3RvKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IERlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoRGVzY3JpcHRvclByb3RvKiBvdGhlcik7Ci0gIAorCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworCisgIGlubGluZSBEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIERlc2NyaXB0b3JQcm90byogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IERlc2NyaXB0b3JQcm90byYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTU2NiwxMTkgKzc2MSwxNzAgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7CisgIH0KKyAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOworICB9CiAgIHB1YmxpYzoKLSAgCisKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKKwogICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICB0eXBlZGVmIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSBFeHRlbnNpb25SYW5nZTsKLSAgCisgIHR5cGVkZWYgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgUmVzZXJ2ZWRSYW5nZTsKKwogICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX25hbWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKLSAgaW5saW5lIGludCBmaWVsZF9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2ZpZWxkKCk7CisgIGludCBmaWVsZF9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZmllbGQoKTsKICAgc3RhdGljIGNvbnN0IGludCBrRmllbGRGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBmaWVsZChpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWVsZChpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogYWRkX2ZpZWxkKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKLSAgICAgIGZpZWxkKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgZmllbGQoaW50IGluZGV4KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9maWVsZChpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBhZGRfZmllbGQoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCiAgICAgICBtdXRhYmxlX2ZpZWxkKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGZpZWxkKCkgY29uc3Q7CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OwotICBpbmxpbmUgaW50IGV4dGVuc2lvbl9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2V4dGVuc2lvbigpOworICBpbnQgZXh0ZW5zaW9uX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9leHRlbnNpb24oKTsKICAgc3RhdGljIGNvbnN0IGludCBrRXh0ZW5zaW9uRmllbGROdW1iZXIgPSA2OwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgZXh0ZW5zaW9uKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvKiBtdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogYWRkX2V4dGVuc2lvbigpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBleHRlbnNpb24oKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBleHRlbnNpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9leHRlbnNpb24oaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogYWRkX2V4dGVuc2lvbigpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPioKICAgICAgIG11dGFibGVfZXh0ZW5zaW9uKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGV4dGVuc2lvbigpIGNvbnN0OworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvIG5lc3RlZF90eXBlID0gMzsKLSAgaW5saW5lIGludCBuZXN0ZWRfdHlwZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX25lc3RlZF90eXBlKCk7CisgIGludCBuZXN0ZWRfdHlwZV9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfbmVzdGVkX3R5cGUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrTmVzdGVkVHlwZUZpZWxkTnVtYmVyID0gMzsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBuZXN0ZWRfdHlwZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfbmVzdGVkX3R5cGUoaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBhZGRfbmVzdGVkX3R5cGUoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKLSAgICAgIG5lc3RlZF90eXBlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBuZXN0ZWRfdHlwZShpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogbXV0YWJsZV9uZXN0ZWRfdHlwZShpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogYWRkX25lc3RlZF90eXBlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPioKICAgICAgIG11dGFibGVfbmVzdGVkX3R5cGUoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG5lc3RlZF90eXBlKCkgY29uc3Q7CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7Ci0gIGlubGluZSBpbnQgZW51bV90eXBlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZW51bV90eXBlKCk7CisgIGludCBlbnVtX3R5cGVfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2VudW1fdHlwZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtFbnVtVHlwZUZpZWxkTnVtYmVyID0gNDsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfZW51bV90eXBlKGludCBpbmRleCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIGFkZF9lbnVtX3R5cGUoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBlbnVtX3R5cGUoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byYgZW51bV90eXBlKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogbXV0YWJsZV9lbnVtX3R5cGUoaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBhZGRfZW51bV90eXBlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCiAgICAgICBtdXRhYmxlX2VudW1fdHlwZSgpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIGVudW1fdHlwZSgpIGNvbnN0OworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7Ci0gIGlubGluZSBpbnQgZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZXh0ZW5zaW9uX3JhbmdlKCk7CisgIGludCBleHRlbnNpb25fcmFuZ2Vfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2V4dGVuc2lvbl9yYW5nZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtFeHRlbnNpb25SYW5nZUZpZWxkTnVtYmVyID0gNTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlJiBleHRlbnNpb25fcmFuZ2UoaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBtdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIGFkZF9leHRlbnNpb25fcmFuZ2UoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPiYKLSAgICAgIGV4dGVuc2lvbl9yYW5nZSgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSYgZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBtdXRhYmxlX2V4dGVuc2lvbl9yYW5nZShpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSogYWRkX2V4dGVuc2lvbl9yYW5nZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4qCiAgICAgICBtdXRhYmxlX2V4dGVuc2lvbl9yYW5nZSgpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgorICAgICAgZXh0ZW5zaW9uX3JhbmdlKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90byBvbmVvZl9kZWNsID0gODsKKyAgaW50IG9uZW9mX2RlY2xfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX29uZW9mX2RlY2woKTsKKyAgc3RhdGljIGNvbnN0IGludCBrT25lb2ZEZWNsRmllbGROdW1iZXIgPSA4OworICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvJiBvbmVvZl9kZWNsKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfb25lb2ZfZGVjbChpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvKiBhZGRfb25lb2ZfZGVjbCgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPioKKyAgICAgIG11dGFibGVfb25lb2ZfZGVjbCgpOworICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG9uZW9mX2RlY2woKSBjb25zdDsKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIG9wdGlvbnMgPSA3OwotICBpbmxpbmUgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDc7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMqIG9wdGlvbnMpOworCisgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLlJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA5OworICBpbnQgcmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3Jlc2VydmVkX3JhbmdlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1Jlc2VydmVkUmFuZ2VGaWVsZE51bWJlciA9IDk7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UmIHJlc2VydmVkX3JhbmdlKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UqIG11dGFibGVfcmVzZXJ2ZWRfcmFuZ2UoaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogYWRkX3Jlc2VydmVkX3JhbmdlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSA+KgorICAgICAgbXV0YWJsZV9yZXNlcnZlZF9yYW5nZSgpOworICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPiYKKyAgICAgIHJlc2VydmVkX3JhbmdlKCkgY29uc3Q7CisKKyAgLy8gcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKKyAgaW50IHJlc2VydmVkX25hbWVfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3Jlc2VydmVkX25hbWUoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrUmVzZXJ2ZWROYW1lRmllbGROdW1iZXIgPSAxMDsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0OworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3Jlc2VydmVkX25hbWUoaW50IGluZGV4KTsKKyAgdm9pZCBzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfcmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgsIGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIGFkZF9yZXNlcnZlZF9uYW1lKCk7CisgIHZvaWQgYWRkX3Jlc2VydmVkX25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIGFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBhZGRfcmVzZXJ2ZWRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JiByZXNlcnZlZF9uYW1lKCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qIG11dGFibGVfcmVzZXJ2ZWRfbmFtZSgpOworCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvKQogIHByaXZhdGU6CiAgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOwogICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIAotICA6OnN0ZDo6c3RyaW5nKiBuYW1lXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiBmaWVsZF87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+IGV4dGVuc2lvbl87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiBuZXN0ZWRfdHlwZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4gZW51bV90eXBlXzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+IGV4dGVuc2lvbl9yYW5nZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byA+IG9uZW9mX2RlY2xfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBvcHRpb25zXzsKLSAgCi0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDcgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPiByZXNlcnZlZF9yYW5nZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4gcmVzZXJ2ZWRfbmFtZV87CiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBEZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTY4OCwzNyArOTM0LDM5IEBACiAgcHVibGljOgogICBGaWVsZERlc2NyaXB0b3JQcm90bygpOwogICB2aXJ0dWFsIH5GaWVsZERlc2NyaXB0b3JQcm90bygpOwotICAKKwogICBGaWVsZERlc2NyaXB0b3JQcm90byhjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBGaWVsZERlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IEZpZWxkRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CiAgICAgQ29weUZyb20oZnJvbSk7CiAgICAgcmV0dXJuICp0aGlzOwogICB9Ci0gIAorCiAgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CiAgIHN0YXRpYyBjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgCisKICAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIEZpZWxkRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKworICBpbmxpbmUgRmllbGREZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwogICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgRmllbGREZXNjcmlwdG9yUHJvdG8mIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBGaWVsZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTczMCwzMSArOTc4LDU3IEBACiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRmllbGREZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7CisgIH0KKyAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOworICB9CiAgIHB1YmxpYzoKLSAgCisKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKKwogICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgVHlwZTsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9ET1VCTEUgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRE9VQkxFOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZMT0FUID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUOwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0lOVDY0ID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0lOVDY0OwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1VJTlQ2NCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UNjQ7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfSU5UMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzI7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRklYRUQ2NCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9GSVhFRDY0OwotICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0ZJWEVEMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfRklYRUQzMjsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9CT09MID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JPT0w7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU1RSSU5HID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NUUklORzsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9HUk9VUCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9HUk9VUDsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9NRVNTQUdFID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0U7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfQllURVMgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfQllURVM7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfVUlOVDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1VJTlQzMjsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9FTlVNID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0VOVU07Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0ZJWEVEMzIgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVEMzI7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0ZJWEVENjQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0ZJWEVENjQ7Ci0gIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0lOVDMyID0gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQzMjsKLSAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9TSU5UNjQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU0lOVDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0RPVUJMRSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0RPVUJMRTsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9GTE9BVCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZMT0FUOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0lOVDY0ID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UNjQ7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfVUlOVDY0ID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfVUlOVDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0lOVDMyID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfSU5UMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRklYRUQ2NCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVENjQ7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRklYRUQzMiA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0ZJWEVEMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfQk9PTCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0JPT0w7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU1RSSU5HID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfU1RSSU5HOworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX0dST1VQID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlX1RZUEVfR1JPVVA7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfTUVTU0FHRSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX01FU1NBR0U7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfQllURVMgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9CWVRFUzsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9VSU5UMzIgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9VSU5UMzI7CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfRU5VTSA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX0VOVU07CisgIHN0YXRpYyBjb25zdCBUeXBlIFRZUEVfU0ZJWEVEMzIgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TRklYRUQzMjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9TRklYRUQ2NCA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NGSVhFRDY0OworICBzdGF0aWMgY29uc3QgVHlwZSBUWVBFX1NJTlQzMiA9CisgICAgRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9UWVBFX1NJTlQzMjsKKyAgc3RhdGljIGNvbnN0IFR5cGUgVFlQRV9TSU5UNjQgPQorICAgIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfVFlQRV9TSU5UNjQ7CiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBUeXBlX0lzVmFsaWQoaW50IHZhbHVlKSB7CiAgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZCh2YWx1ZSk7CiAgIH0KQEAgLTc3NSwxMSArMTA0OSwxNCBAQAogICAgICAgVHlwZSogdmFsdWUpIHsKICAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9QYXJzZShuYW1lLCB2YWx1ZSk7CiAgIH0KLSAgCisKICAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBMYWJlbDsKLSAgc3RhdGljIGNvbnN0IExhYmVsIExBQkVMX09QVElPTkFMID0gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfTEFCRUxfT1BUSU9OQUw7Ci0gIHN0YXRpYyBjb25zdCBMYWJlbCBMQUJFTF9SRVFVSVJFRCA9IEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0xBQkVMX1JFUVVJUkVEOwotICBzdGF0aWMgY29uc3QgTGFiZWwgTEFCRUxfUkVQRUFURUQgPSBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRFRDsKKyAgc3RhdGljIGNvbnN0IExhYmVsIExBQkVMX09QVElPTkFMID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9PUFRJT05BTDsKKyAgc3RhdGljIGNvbnN0IExhYmVsIExBQkVMX1JFUVVJUkVEID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVFVSVJFRDsKKyAgc3RhdGljIGNvbnN0IExhYmVsIExBQkVMX1JFUEVBVEVEID0KKyAgICBGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9MQUJFTF9SRVBFQVRFRDsKICAgc3RhdGljIGlubGluZSBib29sIExhYmVsX0lzVmFsaWQoaW50IHZhbHVlKSB7CiAgICAgcmV0dXJuIEZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQodmFsdWUpOwogICB9CkBAIC04MDAsODIgKzEwNzcsMTA2IEBACiAgICAgICBMYWJlbCogdmFsdWUpIHsKICAgICByZXR1cm4gRmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWxfUGFyc2UobmFtZSwgdmFsdWUpOwogICB9Ci0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfbmFtZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOworCiAgIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7Ci0gIGlubGluZSBib29sIGhhc19udW1iZXIoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbnVtYmVyKCk7CisgIGJvb2wgaGFzX251bWJlcigpIGNvbnN0OworICB2b2lkIGNsZWFyX251bWJlcigpOwogICBzdGF0aWMgY29uc3QgaW50IGtOdW1iZXJGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfbnVtYmVyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBudW1iZXIoKSBjb25zdDsKKyAgdm9pZCBzZXRfbnVtYmVyKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uTGFiZWwgbGFiZWwgPSA0OwotICBpbmxpbmUgYm9vbCBoYXNfbGFiZWwoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbGFiZWwoKTsKKyAgYm9vbCBoYXNfbGFiZWwoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9sYWJlbCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtMYWJlbEZpZWxkTnVtYmVyID0gNDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgbGFiZWwoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2xhYmVsKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgdmFsdWUpOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBsYWJlbCgpIGNvbnN0OworICB2b2lkIHNldF9sYWJlbCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIHZhbHVlKTsKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLlR5cGUgdHlwZSA9IDU7Ci0gIGlubGluZSBib29sIGhhc190eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3R5cGUoKTsKKyAgYm9vbCBoYXNfdHlwZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3R5cGUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrVHlwZUZpZWxkTnVtYmVyID0gNTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB0eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF90eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB2YWx1ZSk7Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgdHlwZSgpIGNvbnN0OworICB2b2lkIHNldF90eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7Ci0gIGlubGluZSBib29sIGhhc190eXBlX25hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdHlwZV9uYW1lKCk7CisgIGJvb2wgaGFzX3R5cGVfbmFtZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3R5cGVfbmFtZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtUeXBlTmFtZUZpZWxkTnVtYmVyID0gNjsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHR5cGVfbmFtZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfdHlwZV9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF90eXBlX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdHlwZV9uYW1lKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3R5cGVfbmFtZSgpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgdHlwZV9uYW1lKCkgY29uc3Q7CisgIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X3R5cGVfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3R5cGVfbmFtZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX3R5cGVfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfdHlwZV9uYW1lKDo6c3RkOjpzdHJpbmcqIHR5cGVfbmFtZSk7CisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX2V4dGVuZGVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2V4dGVuZGVlKCk7CisgIGJvb2wgaGFzX2V4dGVuZGVlKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZXh0ZW5kZWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrRXh0ZW5kZWVGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBleHRlbmRlZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZXh0ZW5kZWUoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXh0ZW5kZWUoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGV4dGVuZGVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2V4dGVuZGVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9leHRlbmRlZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2V4dGVuZGVlKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfZXh0ZW5kZWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2V4dGVuZGVlKDo6c3RkOjpzdHJpbmcqIGV4dGVuZGVlKTsKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF92YWx1ZSA9IDc7Ci0gIGlubGluZSBib29sIGhhc19kZWZhdWx0X3ZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2RlZmF1bHRfdmFsdWUoKTsKKyAgYm9vbCBoYXNfZGVmYXVsdF92YWx1ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2RlZmF1bHRfdmFsdWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFZhbHVlRmllbGROdW1iZXIgPSA3OwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgZGVmYXVsdF92YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfZGVmYXVsdF92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZGVmYXVsdF92YWx1ZSgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBkZWZhdWx0X3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfZGVmYXVsdF92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2RlZmF1bHRfdmFsdWUoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9kZWZhdWx0X3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKKyAgYm9vbCBoYXNfb25lb2ZfaW5kZXgoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9vbmVvZl9pbmRleCgpOworICBzdGF0aWMgY29uc3QgaW50IGtPbmVvZkluZGV4RmllbGROdW1iZXIgPSA5OworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG9uZW9mX2luZGV4KCkgY29uc3Q7CisgIHZvaWQgc2V0X29uZW9mX2luZGV4KDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKyAgYm9vbCBoYXNfanNvbl9uYW1lKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfanNvbl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0pzb25OYW1lRmllbGROdW1iZXIgPSAxMDsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYganNvbl9uYW1lKCkgY29uc3Q7CisgIHZvaWQgc2V0X2pzb25fbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2pzb25fbmFtZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2pzb25fbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfanNvbl9uYW1lKDo6c3RkOjpzdHJpbmcqIGpzb25fbmFtZSk7CisKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7Ci0gIGlubGluZSBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICB2b2lkIGNsZWFyX29wdGlvbnMoKTsKICAgc3RhdGljIGNvbnN0IGludCBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gODsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIG9wdGlvbnMpOworCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8pCiAgcHJpdmF0ZToKICAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CkBAIC04OTIsNjcgKzExOTMsNzIgQEAKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2V4dGVuZGVlKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX29uZW9mX2luZGV4KCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vbmVvZl9pbmRleCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2pzb25fbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfanNvbl9uYW1lKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCi0gIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgbnVtYmVyXzsKICAgaW50IGxhYmVsXzsKLSAgOjpzdGQ6OnN0cmluZyogdHlwZV9uYW1lXzsKLSAgOjpzdGQ6OnN0cmluZyogZXh0ZW5kZWVfOwotICA6OnN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIG9wdGlvbnNfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciB0eXBlX25hbWVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBleHRlbmRlZV87CiAgIGludCB0eXBlXzsKLSAgCi0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDggKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG9uZW9mX2luZGV4XzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgZGVmYXVsdF92YWx1ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIGpzb25fbmFtZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBvcHRpb25zXzsKICAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgCisKICAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgc3RhdGljIEZpZWxkRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKIH07CiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFbnVtRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgT25lb2ZEZXNjcmlwdG9yUHJvdG8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKICBwdWJsaWM6Ci0gIEVudW1EZXNjcmlwdG9yUHJvdG8oKTsKLSAgdmlydHVhbCB+RW51bURlc2NyaXB0b3JQcm90bygpOwotICAKLSAgRW51bURlc2NyaXB0b3JQcm90byhjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKLSAgCi0gIGlubGluZSBFbnVtRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICBPbmVvZkRlc2NyaXB0b3JQcm90bygpOworICB2aXJ0dWFsIH5PbmVvZkRlc2NyaXB0b3JQcm90bygpOworCisgIE9uZW9mRGVzY3JpcHRvclByb3RvKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKworICBpbmxpbmUgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwotICBzdGF0aWMgY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKLSAgdm9pZCBTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgCisgIHN0YXRpYyBjb25zdCBPbmVvZkRlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChPbmVvZkRlc2NyaXB0b3JQcm90byogb3RoZXIpOworCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBFbnVtRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKworICBpbmxpbmUgT25lb2ZEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIE9uZW9mRGVzY3JpcHRvclByb3RvKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwogICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7Ci0gIHZvaWQgQ29weUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IE9uZW9mRGVzY3JpcHRvclByb3RvJiBmcm9tKTsKKyAgdm9pZCBNZXJnZUZyb20oY29uc3QgT25lb2ZEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC05NjQsNjUgKzEyNzAsMTY2IEBACiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoT25lb2ZEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7CisgIH0KKyAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOworICB9CiAgIHB1YmxpYzoKLSAgCisKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKKwogICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX25hbWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvKQorIHByaXZhdGU6CisgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CisgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisKKyAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKKyAgc3RhdGljIE9uZW9mRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKK307CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBFbnVtRGVzY3JpcHRvclByb3RvIDogcHVibGljIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSB7CisgcHVibGljOgorICBFbnVtRGVzY3JpcHRvclByb3RvKCk7CisgIHZpcnR1YWwgfkVudW1EZXNjcmlwdG9yUHJvdG8oKTsKKworICBFbnVtRGVzY3JpcHRvclByb3RvKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pOworCisgIGlubGluZSBFbnVtRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSkgeworICAgIENvcHlGcm9tKGZyb20pOworICAgIHJldHVybiAqdGhpczsKKyAgfQorCisgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKKyAgfQorCisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisgIH0KKworICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CisgIHN0YXRpYyBjb25zdCBFbnVtRGVzY3JpcHRvclByb3RvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKEVudW1EZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKworICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIGlubGluZSBFbnVtRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBFbnVtRGVzY3JpcHRvclByb3RvKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgRW51bURlc2NyaXB0b3JQcm90byYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEVudW1EZXNjcmlwdG9yUHJvdG8mIGZyb20pOworICB2b2lkIENsZWFyKCk7CisgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OworCisgIGludCBCeXRlU2l6ZSgpIGNvbnN0OworICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdm9pZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBvdXRwdXQpIGNvbnN0OworICBpbnQgR2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsgcmV0dXJuIF9jYWNoZWRfc2l6ZV87IH0KKyAgcHJpdmF0ZToKKyAgdm9pZCBTaGFyZWRDdG9yKCk7CisgIHZvaWQgU2hhcmVkRHRvcigpOworICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChFbnVtRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQorICBwdWJsaWM6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSk7CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOwotICBpbmxpbmUgaW50IHZhbHVlX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdmFsdWUoKTsKKyAgaW50IHZhbHVlX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl92YWx1ZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtWYWx1ZUZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiB2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIG11dGFibGVfdmFsdWUoaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBhZGRfdmFsdWUoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPiYKLSAgICAgIHZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4qCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiB2YWx1ZShpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogbXV0YWJsZV92YWx1ZShpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogYWRkX3ZhbHVlKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPioKICAgICAgIG11dGFibGVfdmFsdWUoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIHZhbHVlKCkgY29uc3Q7CisKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucyBvcHRpb25zID0gMzsKLSAgaW5saW5lIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW9ucygpOworICBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfb3B0aW9ucygpOwogICBzdGF0aWMgY29uc3QgaW50IGtPcHRpb25zRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBvcHRpb25zKTsKKwogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8pCiAgcHJpdmF0ZToKICAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19uYW1lKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfb3B0aW9ucygpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW9ucygpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCi0gIDo6c3RkOjpzdHJpbmcqIG5hbWVfOworCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKKyAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gPiB2YWx1ZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIG9wdGlvbnNfOwotICAKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMyArIDMxKSAvIDMyXTsKLSAgCiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBFbnVtRGVzY3JpcHRvclByb3RvKiBkZWZhdWx0X2luc3RhbmNlXzsKIH07CkBAIC0xMDMyLDM3ICsxNDM5LDM5IEBACiAgcHVibGljOgogICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8oKTsKICAgdmlydHVhbCB+RW51bVZhbHVlRGVzY3JpcHRvclByb3RvKCk7Ci0gIAorCiAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byhjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICAKKwogICBpbmxpbmUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBvcGVyYXRvcj0oY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvJiBmcm9tKSB7CiAgICAgQ29weUZyb20oZnJvbSk7CiAgICAgcmV0dXJuICp0aGlzOwogICB9Ci0gIAorCiAgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CiAgIHN0YXRpYyBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCisKICAgdm9pZCBTd2FwKEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdDsKKworICBpbmxpbmUgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC0xMDc0LDQwICsxNDgzLDUwIEBACiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIG5hbWUgPSAxOwotICBpbmxpbmUgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9uYW1lKCk7CisgIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9uYW1lKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga05hbWVGaWVsZE51bWJlciA9IDE7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSk7CisKICAgLy8gb3B0aW9uYWwgaW50MzIgbnVtYmVyID0gMjsKLSAgaW5saW5lIGJvb2wgaGFzX251bWJlcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9udW1iZXIoKTsKKyAgYm9vbCBoYXNfbnVtYmVyKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfbnVtYmVyKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga051bWJlckZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgbnVtYmVyKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIG51bWJlcigpIGNvbnN0OworICB2b2lkIHNldF9udW1iZXIoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOwotICBpbmxpbmUgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9vcHRpb25zKCk7CisgIGJvb2wgaGFzX29wdGlvbnMoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9vcHRpb25zKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga09wdGlvbnNGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIHJlbGVhc2Vfb3B0aW9ucygpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogbXV0YWJsZV9vcHRpb25zKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogb3B0aW9ucyk7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8pCiAgcHJpdmF0ZToKICAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CkBAIC0xMTE2LDIwICsxNTM1LDE3IEBACiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19udW1iZXIoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19vcHRpb25zKCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vcHRpb25zKCk7Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpzdGQ6OnN0cmluZyogbmFtZV87CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiBvcHRpb25zXzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBudW1iZXJfOwotICAKLSAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMyArIDMxKSAvIDMyXTsKLSAgCiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTExMzksMzcgKzE1NTUsMzkgQEAKICBwdWJsaWM6CiAgIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8oKTsKICAgdmlydHVhbCB+U2VydmljZURlc2NyaXB0b3JQcm90bygpOwotICAKKwogICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwotICAKKwogICBpbmxpbmUgU2VydmljZURlc2NyaXB0b3JQcm90byYgb3BlcmF0b3I9KGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCisKICAgdm9pZCBTd2FwKFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKLSAgCisKICAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworCisgIGlubGluZSBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwogICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgU2VydmljZURlc2NyaXB0b3JQcm90byYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8mIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC0xMTgxLDY1ICsxNTk5LDcyIEBACiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoU2VydmljZURlc2NyaXB0b3JQcm90byogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKLSAgaW5saW5lIGJvb2wgaGFzX25hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZSgpOworICBib29sIGhhc19uYW1lKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfbmFtZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtOYW1lRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZSgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBuYW1lKCkgY29uc3Q7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9uYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpOworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvIG1ldGhvZCA9IDI7Ci0gIGlubGluZSBpbnQgbWV0aG9kX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbWV0aG9kKCk7CisgIGludCBtZXRob2Rfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX21ldGhvZCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtNZXRob2RGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byYgbWV0aG9kKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9tZXRob2QoaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBhZGRfbWV0aG9kKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4mCi0gICAgICBtZXRob2QoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8mIG1ldGhvZChpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogbXV0YWJsZV9tZXRob2QoaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8qIGFkZF9tZXRob2QoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+KgogICAgICAgbXV0YWJsZV9tZXRob2QoKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiYKKyAgICAgIG1ldGhvZCgpIGNvbnN0OworCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMgb3B0aW9ucyA9IDM7Ci0gIGlubGluZSBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICB2b2lkIGNsZWFyX29wdGlvbnMoKTsKICAgc3RhdGljIGNvbnN0IGludCBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gMzsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zJiBvcHRpb25zKCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnMqIG11dGFibGVfb3B0aW9ucygpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogb3B0aW9ucyk7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvKQogIHByaXZhdGU6CiAgIGlubGluZSB2b2lkIHNldF9oYXNfbmFtZSgpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZSgpOwogICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIAotICA6OnN0ZDo6c3RyaW5nKiBuYW1lXzsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CisgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG5hbWVfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvID4gbWV0aG9kXzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogb3B0aW9uc187Ci0gIAotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOwotICAKICAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgCisKICAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgc3RhdGljIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG8qIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTEyNDksMzcgKzE2NzQsMzkgQEAKICBwdWJsaWM6CiAgIE1ldGhvZERlc2NyaXB0b3JQcm90bygpOwogICB2aXJ0dWFsIH5NZXRob2REZXNjcmlwdG9yUHJvdG8oKTsKLSAgCisKICAgTWV0aG9kRGVzY3JpcHRvclByb3RvKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBNZXRob2REZXNjcmlwdG9yUHJvdG8mIG9wZXJhdG9yPShjb25zdCBNZXRob2REZXNjcmlwdG9yUHJvdG8mIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoTWV0aG9kRGVzY3JpcHRvclByb3RvKiBvdGhlcik7Ci0gIAorCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBNZXRob2REZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0OworCisgIGlubGluZSBNZXRob2REZXNjcmlwdG9yUHJvdG8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIE1ldGhvZERlc2NyaXB0b3JQcm90byogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1ldGhvZERlc2NyaXB0b3JQcm90byYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTEyOTEsNTUgKzE3MTgsODEgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChNZXRob2REZXNjcmlwdG9yUHJvdG8qIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7CisgIH0KKyAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOworICB9CiAgIHB1YmxpYzoKLSAgCisKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKKwogICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19uYW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgYm9vbCBoYXNfbmFtZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX25hbWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWUoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSgpIGNvbnN0OworICB2b2lkIHNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9uYW1lKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfbmFtZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZSg6OnN0ZDo6c3RyaW5nKiBuYW1lKTsKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7Ci0gIGlubGluZSBib29sIGhhc19pbnB1dF90eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2lucHV0X3R5cGUoKTsKKyAgYm9vbCBoYXNfaW5wdXRfdHlwZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2lucHV0X3R5cGUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrSW5wdXRUeXBlRmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgaW5wdXRfdHlwZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfaW5wdXRfdHlwZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9pbnB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfaW5wdXRfdHlwZSgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9pbnB1dF90eXBlKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpbnB1dF90eXBlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2lucHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9pbnB1dF90eXBlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfaW5wdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2lucHV0X3R5cGUoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9pbnB1dF90eXBlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9pbnB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIGlucHV0X3R5cGUpOworCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7Ci0gIGlubGluZSBib29sIGhhc19vdXRwdXRfdHlwZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9vdXRwdXRfdHlwZSgpOworICBib29sIGhhc19vdXRwdXRfdHlwZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX291dHB1dF90eXBlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga091dHB1dFR5cGVGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBvdXRwdXRfdHlwZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfb3V0cHV0X3R5cGUoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfb3V0cHV0X3R5cGUoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG91dHB1dF90eXBlKCkgY29uc3Q7CisgIHZvaWQgc2V0X291dHB1dF90eXBlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9vdXRwdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX291dHB1dF90eXBlKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfb3V0cHV0X3R5cGUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX291dHB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIG91dHB1dF90eXBlKTsKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7Ci0gIGlubGluZSBib29sIGhhc19vcHRpb25zKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX29wdGlvbnMoKTsKKyAgYm9vbCBoYXNfb3B0aW9ucygpIGNvbnN0OworICB2b2lkIGNsZWFyX29wdGlvbnMoKTsKICAgc3RhdGljIGNvbnN0IGludCBrT3B0aW9uc0ZpZWxkTnVtYmVyID0gNDsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyYgb3B0aW9ucygpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogcmVsZWFzZV9vcHRpb25zKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMmIG9wdGlvbnMoKSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBtdXRhYmxlX29wdGlvbnMoKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiByZWxlYXNlX29wdGlvbnMoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBvcHRpb25zKTsKKworICAvLyBvcHRpb25hbCBib29sIGNsaWVudF9zdHJlYW1pbmcgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19jbGllbnRfc3RyZWFtaW5nKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfY2xpZW50X3N0cmVhbWluZygpOworICBzdGF0aWMgY29uc3QgaW50IGtDbGllbnRTdHJlYW1pbmdGaWVsZE51bWJlciA9IDU7CisgIGJvb2wgY2xpZW50X3N0cmVhbWluZygpIGNvbnN0OworICB2b2lkIHNldF9jbGllbnRfc3RyZWFtaW5nKGJvb2wgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGJvb2wgc2VydmVyX3N0cmVhbWluZyA9IDYgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9zZXJ2ZXJfc3RyZWFtaW5nKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1NlcnZlclN0cmVhbWluZ0ZpZWxkTnVtYmVyID0gNjsKKyAgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3Q7CisgIHZvaWQgc2V0X3NlcnZlcl9zdHJlYW1pbmcoYm9vbCB2YWx1ZSk7CisKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8pCiAgcHJpdmF0ZToKICAgaW5saW5lIHZvaWQgc2V0X2hhc19uYW1lKCk7CkBAIC0xMzUwLDIxICsxODAzLDI0IEBACiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOwogICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGlvbnMoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX29wdGlvbnMoKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIAotICA6OnN0ZDo6c3RyaW5nKiBuYW1lXzsKLSAgOjpzdGQ6OnN0cmluZyogaW5wdXRfdHlwZV87Ci0gIDo6c3RkOjpzdHJpbmcqIG91dHB1dF90eXBlXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBvcHRpb25zXzsKLSAgCisgIGlubGluZSB2b2lkIHNldF9oYXNfY2xpZW50X3N0cmVhbWluZygpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfY2xpZW50X3N0cmVhbWluZygpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKTsKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CiAgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDQgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBuYW1lXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgaW5wdXRfdHlwZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIG91dHB1dF90eXBlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBvcHRpb25zXzsKKyAgYm9vbCBjbGllbnRfc3RyZWFtaW5nXzsKKyAgYm9vbCBzZXJ2ZXJfc3RyZWFtaW5nXzsKICAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgCisKICAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgc3RhdGljIE1ldGhvZERlc2NyaXB0b3JQcm90byogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtMTM3NCwzNyArMTgzMCwzOSBAQAogIHB1YmxpYzoKICAgRmlsZU9wdGlvbnMoKTsKICAgdmlydHVhbCB+RmlsZU9wdGlvbnMoKTsKLSAgCisKICAgRmlsZU9wdGlvbnMoY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pOwotICAKKwogICBpbmxpbmUgRmlsZU9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBGaWxlT3B0aW9ucyYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwogICBzdGF0aWMgY29uc3QgRmlsZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCisKICAgdm9pZCBTd2FwKEZpbGVPcHRpb25zKiBvdGhlcik7Ci0gIAorCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBGaWxlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIEZpbGVPcHRpb25zKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBGaWxlT3B0aW9ucyogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpbGVPcHRpb25zJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgRmlsZU9wdGlvbnMmIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC0xNDE2LDE2ICsxODc0LDI3IEBACiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoRmlsZU9wdGlvbnMqIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7CisgIH0KKyAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOworICB9CiAgIHB1YmxpYzoKLSAgCisKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKKwogICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICB0eXBlZGVmIEZpbGVPcHRpb25zX09wdGltaXplTW9kZSBPcHRpbWl6ZU1vZGU7Ci0gIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgU1BFRUQgPSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfU1BFRUQ7Ci0gIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgQ09ERV9TSVpFID0gRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0NPREVfU0laRTsKLSAgc3RhdGljIGNvbnN0IE9wdGltaXplTW9kZSBMSVRFX1JVTlRJTUUgPSBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfTElURV9SVU5USU1FOworICBzdGF0aWMgY29uc3QgT3B0aW1pemVNb2RlIFNQRUVEID0KKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfU1BFRUQ7CisgIHN0YXRpYyBjb25zdCBPcHRpbWl6ZU1vZGUgQ09ERV9TSVpFID0KKyAgICBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfQ09ERV9TSVpFOworICBzdGF0aWMgY29uc3QgT3B0aW1pemVNb2RlIExJVEVfUlVOVElNRSA9CisgICAgRmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlX0xJVEVfUlVOVElNRTsKICAgc3RhdGljIGlubGluZSBib29sIE9wdGltaXplTW9kZV9Jc1ZhbGlkKGludCB2YWx1ZSkgewogICAgIHJldHVybiBGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSk7CiAgIH0KQEAgLTE0NDYsOTIgKzE5MTUsMTQ0IEBACiAgICAgICBPcHRpbWl6ZU1vZGUqIHZhbHVlKSB7CiAgICAgcmV0dXJuIEZpbGVPcHRpb25zX09wdGltaXplTW9kZV9QYXJzZShuYW1lLCB2YWx1ZSk7CiAgIH0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfcGFja2FnZSA9IDE7Ci0gIGlubGluZSBib29sIGhhc19qYXZhX3BhY2thZ2UoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9wYWNrYWdlKCk7CisgIGJvb2wgaGFzX2phdmFfcGFja2FnZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2phdmFfcGFja2FnZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtKYXZhUGFja2FnZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGphdmFfcGFja2FnZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfamF2YV9wYWNrYWdlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9qYXZhX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfamF2YV9wYWNrYWdlKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2phdmFfcGFja2FnZSgpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgamF2YV9wYWNrYWdlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2phdmFfcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X2phdmFfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2phdmFfcGFja2FnZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2phdmFfcGFja2FnZSgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfamF2YV9wYWNrYWdlKDo6c3RkOjpzdHJpbmcqIGphdmFfcGFja2FnZSk7CisKICAgLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKLSAgaW5saW5lIGJvb2wgaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIGJvb2wgaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrSmF2YU91dGVyQ2xhc3NuYW1lRmllbGROdW1iZXIgPSA4OwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgamF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBqYXZhX291dGVyX2NsYXNzbmFtZSgpIGNvbnN0OworICB2b2lkIHNldF9qYXZhX291dGVyX2NsYXNzbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9qYXZhX291dGVyX2NsYXNzbmFtZSg6OnN0ZDo6c3RyaW5nKiBqYXZhX291dGVyX2NsYXNzbmFtZSk7CisKICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlubGluZSBib29sIGhhc19qYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKKyAgYm9vbCBoYXNfamF2YV9tdWx0aXBsZV9maWxlcygpIGNvbnN0OworICB2b2lkIGNsZWFyX2phdmFfbXVsdGlwbGVfZmlsZXMoKTsKICAgc3RhdGljIGNvbnN0IGludCBrSmF2YU11bHRpcGxlRmlsZXNGaWVsZE51bWJlciA9IDEwOwotICBpbmxpbmUgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9qYXZhX211bHRpcGxlX2ZpbGVzKGJvb2wgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgYm9vbCByZXRhaW5fdW5rbm93bl9maWVsZHMgPSAxMSBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaW5saW5lIGJvb2wgaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9yZXRhaW5fdW5rbm93bl9maWVsZHMoKTsKLSAgc3RhdGljIGNvbnN0IGludCBrUmV0YWluVW5rbm93bkZpZWxkc0ZpZWxkTnVtYmVyID0gMTE7Ci0gIGlubGluZSBib29sIHJldGFpbl91bmtub3duX2ZpZWxkcygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfcmV0YWluX3Vua25vd25fZmllbGRzKGJvb2wgdmFsdWUpOwotICAKKyAgYm9vbCBqYXZhX211bHRpcGxlX2ZpbGVzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2phdmFfbXVsdGlwbGVfZmlsZXMoYm9vbCB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCA9IDIwIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpbmxpbmUgYm9vbCBoYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKKyAgYm9vbCBoYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtKYXZhR2VuZXJhdGVFcXVhbHNBbmRIYXNoRmllbGROdW1iZXIgPSAyMDsKLSAgaW5saW5lIGJvb2wgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKGJvb2wgdmFsdWUpOwotICAKKyAgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIGNvbnN0OworICB2b2lkIHNldF9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaChib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIGNvbnN0OworICB2b2lkIGNsZWFyX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrSmF2YVN0cmluZ0NoZWNrVXRmOEZpZWxkTnVtYmVyID0gMjc7CisgIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIGNvbnN0OworICB2b2lkIHNldF9qYXZhX3N0cmluZ19jaGVja191dGY4KGJvb2wgdmFsdWUpOworCiAgIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvciA9IDkgW2RlZmF1bHQgPSBTUEVFRF07Ci0gIGlubGluZSBib29sIGhhc19vcHRpbWl6ZV9mb3IoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfb3B0aW1pemVfZm9yKCk7CisgIGJvb2wgaGFzX29wdGltaXplX2ZvcigpIGNvbnN0OworICB2b2lkIGNsZWFyX29wdGltaXplX2ZvcigpOwogICBzdGF0aWMgY29uc3QgaW50IGtPcHRpbWl6ZUZvckZpZWxkTnVtYmVyID0gOTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfb3B0aW1pemVfZm9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKTsKLSAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIG9wdGltaXplX2ZvcigpIGNvbnN0OworICB2b2lkIHNldF9vcHRpbWl6ZV9mb3IoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBnb19wYWNrYWdlID0gMTE7CisgIGJvb2wgaGFzX2dvX3BhY2thZ2UoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9nb19wYWNrYWdlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0dvUGFja2FnZUZpZWxkTnVtYmVyID0gMTE7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGdvX3BhY2thZ2UoKSBjb25zdDsKKyAgdm9pZCBzZXRfZ29fcGFja2FnZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2dvX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9nb19wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfZ29fcGFja2FnZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2dvX3BhY2thZ2UoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2dvX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogZ29fcGFja2FnZSk7CisKICAgLy8gb3B0aW9uYWwgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzID0gMTYgW2RlZmF1bHQgPSBmYWxzZV07Ci0gIGlubGluZSBib29sIGhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgYm9vbCBoYXNfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OworICB2b2lkIGNsZWFyX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKICAgc3RhdGljIGNvbnN0IGludCBrQ2NHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE2OwotICBpbmxpbmUgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9jY19nZW5lcmljX3NlcnZpY2VzKGJvb2wgdmFsdWUpOwotICAKKyAgYm9vbCBjY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaW5saW5lIGJvb2wgaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKKyAgYm9vbCBoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0phdmFHZW5lcmljU2VydmljZXNGaWVsZE51bWJlciA9IDE3OwotICBpbmxpbmUgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKTsKLSAgCisgIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2phdmFfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKTsKKwogICAvLyBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaW5saW5lIGJvb2wgaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOworICBib29sIGhhc19weV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOwogICBzdGF0aWMgY29uc3QgaW50IGtQeUdlbmVyaWNTZXJ2aWNlc0ZpZWxkTnVtYmVyID0gMTg7Ci0gIGlubGluZSBib29sIHB5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3B5X2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSk7Ci0gIAorICBib29sIHB5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdDsKKyAgdm9pZCBzZXRfcHlfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAyMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIGNsZWFyX2RlcHJlY2F0ZWQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMjM7CisgIGJvb2wgZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIHNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIGJvb2wgY2NfZW5hYmxlX2FyZW5hcyA9IDMxIFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19jY19lbmFibGVfYXJlbmFzKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfY2NfZW5hYmxlX2FyZW5hcygpOworICBzdGF0aWMgY29uc3QgaW50IGtDY0VuYWJsZUFyZW5hc0ZpZWxkTnVtYmVyID0gMzE7CisgIGJvb2wgY2NfZW5hYmxlX2FyZW5hcygpIGNvbnN0OworICB2b2lkIHNldF9jY19lbmFibGVfYXJlbmFzKGJvb2wgdmFsdWUpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyBvYmpjX2NsYXNzX3ByZWZpeCA9IDM2OworICBib29sIGhhc19vYmpjX2NsYXNzX3ByZWZpeCgpIGNvbnN0OworICB2b2lkIGNsZWFyX29iamNfY2xhc3NfcHJlZml4KCk7CisgIHN0YXRpYyBjb25zdCBpbnQga09iamNDbGFzc1ByZWZpeEZpZWxkTnVtYmVyID0gMzY7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG9iamNfY2xhc3NfcHJlZml4KCkgY29uc3Q7CisgIHZvaWQgc2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfb2JqY19jbGFzc19wcmVmaXgoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9vYmpjX2NsYXNzX3ByZWZpeChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX29iamNfY2xhc3NfcHJlZml4KCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX29iamNfY2xhc3NfcHJlZml4KDo6c3RkOjpzdHJpbmcqIG9iamNfY2xhc3NfcHJlZml4KTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OworICBib29sIGhhc19jc2hhcnBfbmFtZXNwYWNlKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfY3NoYXJwX25hbWVzcGFjZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtDc2hhcnBOYW1lc3BhY2VGaWVsZE51bWJlciA9IDM3OworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBjc2hhcnBfbmFtZXNwYWNlKCkgY29uc3Q7CisgIHZvaWQgc2V0X2NzaGFycF9uYW1lc3BhY2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9jc2hhcnBfbmFtZXNwYWNlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfY3NoYXJwX25hbWVzcGFjZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9jc2hhcnBfbmFtZXNwYWNlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9jc2hhcnBfbmFtZXNwYWNlKDo6c3RkOjpzdHJpbmcqIGNzaGFycF9uYW1lc3BhY2UpOworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgaW5saW5lIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKICAgc3RhdGljIGNvbnN0IGludCBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLSAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgogICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisKICAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoRmlsZU9wdGlvbnMpCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMpCiAgcHJpdmF0ZToKQEAgLTE1NDEsNDEgKzIwNjIsNTMgQEAKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfb3V0ZXJfY2xhc3NuYW1lKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOwotICBpbmxpbmUgdm9pZCBzZXRfaGFzX3JldGFpbl91bmtub3duX2ZpZWxkcygpOwotICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpOwogICBpbmxpbmUgdm9pZCBzZXRfaGFzX29wdGltaXplX2ZvcigpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb3B0aW1pemVfZm9yKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfZ29fcGFja2FnZSgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZ29fcGFja2FnZSgpOwogICBpbmxpbmUgdm9pZCBzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOwogICBpbmxpbmUgdm9pZCBzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKTsKLSAgCisgIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2NjX2VuYWJsZV9hcmVuYXMoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisKICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uU2V0IF9leHRlbnNpb25zXzsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIAotICA6OnN0ZDo6c3RyaW5nKiBqYXZhX3BhY2thZ2VfOwotICA6OnN0ZDo6c3RyaW5nKiBqYXZhX291dGVyX2NsYXNzbmFtZV87CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBqYXZhX3BhY2thZ2VfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBqYXZhX291dGVyX2NsYXNzbmFtZV87CiAgIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlc187Ci0gIGJvb2wgcmV0YWluX3Vua25vd25fZmllbGRzXzsKICAgYm9vbCBqYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaF87CisgIGJvb2wgamF2YV9zdHJpbmdfY2hlY2tfdXRmOF87CiAgIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlc187CiAgIGludCBvcHRpbWl6ZV9mb3JfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBnb19wYWNrYWdlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgb2JqY19jbGFzc19wcmVmaXhfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBjc2hhcnBfbmFtZXNwYWNlXzsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87CiAgIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzXzsKICAgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzXzsKLSAgCi0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEwICsgMzEpIC8gMzJdOwotICAKKyAgYm9vbCBkZXByZWNhdGVkXzsKKyAgYm9vbCBjY19lbmFibGVfYXJlbmFzXzsKICAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgCisKICAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgc3RhdGljIEZpbGVPcHRpb25zKiBkZWZhdWx0X2luc3RhbmNlXzsKIH07CkBAIC0xNTg1LDM3ICsyMTE4LDM5IEBACiAgcHVibGljOgogICBNZXNzYWdlT3B0aW9ucygpOwogICB2aXJ0dWFsIH5NZXNzYWdlT3B0aW9ucygpOwotICAKKwogICBNZXNzYWdlT3B0aW9ucyhjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBNZXNzYWdlT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBmcm9tKSB7CiAgICAgQ29weUZyb20oZnJvbSk7CiAgICAgcmV0dXJuICp0aGlzOwogICB9Ci0gIAorCiAgIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gICAgcmV0dXJuIF91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8udW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7Ci0gICAgcmV0dXJuICZfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKICAgfQotICAKKwogICBzdGF0aWMgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKCk7CiAgIHN0YXRpYyBjb25zdCBNZXNzYWdlT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoTWVzc2FnZU9wdGlvbnMqIG90aGVyKTsKLSAgCisKICAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIE1lc3NhZ2VPcHRpb25zKiBOZXcoKSBjb25zdDsKKworICBpbmxpbmUgTWVzc2FnZU9wdGlvbnMqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIE1lc3NhZ2VPcHRpb25zKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwogICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgTWVzc2FnZU9wdGlvbnMmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBNZXNzYWdlT3B0aW9ucyYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTE2MjcsNDAgKzIxNjIsNjIgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChNZXNzYWdlT3B0aW9ucyogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIG9wdGlvbmFsIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpbmxpbmUgYm9vbCBoYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKTsKKyAgYm9vbCBoYXNfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtNZXNzYWdlU2V0V2lyZUZvcm1hdEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGJvb2wgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KGJvb2wgdmFsdWUpOwotICAKKyAgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpIGNvbnN0OworICB2b2lkIHNldF9tZXNzYWdlX3NldF93aXJlX2Zvcm1hdChib29sIHZhbHVlKTsKKwogICAvLyBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0ID0gZmFsc2VdOwotICBpbmxpbmUgYm9vbCBoYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7CisgIGJvb2wgaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga05vU3RhbmRhcmREZXNjcmlwdG9yQWNjZXNzb3JGaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoYm9vbCB2YWx1ZSk7Ci0gIAorICBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKSBjb25zdDsKKyAgdm9pZCBzZXRfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcihib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzOworICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CisgIGJvb2wgaGFzX21hcF9lbnRyeSgpIGNvbnN0OworICB2b2lkIGNsZWFyX21hcF9lbnRyeSgpOworICBzdGF0aWMgY29uc3QgaW50IGtNYXBFbnRyeUZpZWxkTnVtYmVyID0gNzsKKyAgYm9vbCBtYXBfZW50cnkoKSBjb25zdDsKKyAgdm9pZCBzZXRfbWFwX2VudHJ5KGJvb2wgdmFsdWUpOworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgaW5saW5lIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKICAgc3RhdGljIGNvbnN0IGludCBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLSAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgogICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisKICAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoTWVzc2FnZU9wdGlvbnMpCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMpCiAgcHJpdmF0ZToKQEAgLTE2NjgsMjIgKzIyMjUsMjUgQEAKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcigpOwotICAKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19kZXByZWNhdGVkKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfbWFwX2VudHJ5KCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19tYXBfZW50cnkoKTsKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKICAgYm9vbCBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdF87CiAgIGJvb2wgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl87Ci0gIAotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygzICsgMzEpIC8gMzJdOwotICAKKyAgYm9vbCBkZXByZWNhdGVkXzsKKyAgYm9vbCBtYXBfZW50cnlfOwogICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgTWVzc2FnZU9wdGlvbnMqIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTE2OTMsMzcgKzIyNTMsMzkgQEAKICBwdWJsaWM6CiAgIEZpZWxkT3B0aW9ucygpOwogICB2aXJ0dWFsIH5GaWVsZE9wdGlvbnMoKTsKLSAgCisKICAgRmllbGRPcHRpb25zKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBGaWVsZE9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBGaWVsZE9wdGlvbnMmIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IEZpZWxkT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoRmllbGRPcHRpb25zKiBvdGhlcik7Ci0gIAorCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBGaWVsZE9wdGlvbnMqIE5ldygpIGNvbnN0OworCisgIGlubGluZSBGaWVsZE9wdGlvbnMqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIEZpZWxkT3B0aW9ucyogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEZpZWxkT3B0aW9ucyYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTE3MzUsMTYgKzIyOTcsMjcgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChGaWVsZE9wdGlvbnMqIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7CisgIH0KKyAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOworICB9CiAgIHB1YmxpYzoKLSAgCisKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKKwogICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICB0eXBlZGVmIEZpZWxkT3B0aW9uc19DVHlwZSBDVHlwZTsKLSAgc3RhdGljIGNvbnN0IENUeXBlIFNUUklORyA9IEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkc7Ci0gIHN0YXRpYyBjb25zdCBDVHlwZSBDT1JEID0gRmllbGRPcHRpb25zX0NUeXBlX0NPUkQ7Ci0gIHN0YXRpYyBjb25zdCBDVHlwZSBTVFJJTkdfUElFQ0UgPSBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HX1BJRUNFOworICBzdGF0aWMgY29uc3QgQ1R5cGUgU1RSSU5HID0KKyAgICBGaWVsZE9wdGlvbnNfQ1R5cGVfU1RSSU5HOworICBzdGF0aWMgY29uc3QgQ1R5cGUgQ09SRCA9CisgICAgRmllbGRPcHRpb25zX0NUeXBlX0NPUkQ7CisgIHN0YXRpYyBjb25zdCBDVHlwZSBTVFJJTkdfUElFQ0UgPQorICAgIEZpZWxkT3B0aW9uc19DVHlwZV9TVFJJTkdfUElFQ0U7CiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBDVHlwZV9Jc1ZhbGlkKGludCB2YWx1ZSkgewogICAgIHJldHVybiBGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZCh2YWx1ZSk7CiAgIH0KQEAgLTE3NjUsNTMgKzIzMzgsOTEgQEAKICAgICAgIENUeXBlKiB2YWx1ZSkgewogICAgIHJldHVybiBGaWVsZE9wdGlvbnNfQ1R5cGVfUGFyc2UobmFtZSwgdmFsdWUpOwogICB9Ci0gIAorCisgIHR5cGVkZWYgRmllbGRPcHRpb25zX0pTVHlwZSBKU1R5cGU7CisgIHN0YXRpYyBjb25zdCBKU1R5cGUgSlNfTk9STUFMID0KKyAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTX05PUk1BTDsKKyAgc3RhdGljIGNvbnN0IEpTVHlwZSBKU19TVFJJTkcgPQorICAgIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNfU1RSSU5HOworICBzdGF0aWMgY29uc3QgSlNUeXBlIEpTX05VTUJFUiA9CisgICAgRmllbGRPcHRpb25zX0pTVHlwZV9KU19OVU1CRVI7CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBKU1R5cGVfSXNWYWxpZChpbnQgdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0pTVHlwZV9Jc1ZhbGlkKHZhbHVlKTsKKyAgfQorICBzdGF0aWMgY29uc3QgSlNUeXBlIEpTVHlwZV9NSU4gPQorICAgIEZpZWxkT3B0aW9uc19KU1R5cGVfSlNUeXBlX01JTjsKKyAgc3RhdGljIGNvbnN0IEpTVHlwZSBKU1R5cGVfTUFYID0KKyAgICBGaWVsZE9wdGlvbnNfSlNUeXBlX0pTVHlwZV9NQVg7CisgIHN0YXRpYyBjb25zdCBpbnQgSlNUeXBlX0FSUkFZU0laRSA9CisgICAgRmllbGRPcHRpb25zX0pTVHlwZV9KU1R5cGVfQVJSQVlTSVpFOworICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3IqCisgIEpTVHlwZV9kZXNjcmlwdG9yKCkgeworICAgIHJldHVybiBGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3IoKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEpTVHlwZV9OYW1lKEpTVHlwZSB2YWx1ZSkgeworICAgIHJldHVybiBGaWVsZE9wdGlvbnNfSlNUeXBlX05hbWUodmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBKU1R5cGVfUGFyc2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZSwKKyAgICAgIEpTVHlwZSogdmFsdWUpIHsKKyAgICByZXR1cm4gRmllbGRPcHRpb25zX0pTVHlwZV9QYXJzZShuYW1lLCB2YWx1ZSk7CisgIH0KKwogICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5DVHlwZSBjdHlwZSA9IDEgW2RlZmF1bHQgPSBTVFJJTkddOwotICBpbmxpbmUgYm9vbCBoYXNfY3R5cGUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfY3R5cGUoKTsKKyAgYm9vbCBoYXNfY3R5cGUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9jdHlwZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtDdHlwZUZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIGN0eXBlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9jdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSk7Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSBjdHlwZSgpIGNvbnN0OworICB2b2lkIHNldF9jdHlwZSg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZSB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgYm9vbCBwYWNrZWQgPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfcGFja2VkKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3BhY2tlZCgpOworICBib29sIGhhc19wYWNrZWQoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9wYWNrZWQoKTsKICAgc3RhdGljIGNvbnN0IGludCBrUGFja2VkRmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgYm9vbCBwYWNrZWQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgc2V0X3BhY2tlZChib29sIHZhbHVlKTsKLSAgCisgIGJvb2wgcGFja2VkKCkgY29uc3Q7CisgIHZvaWQgc2V0X3BhY2tlZChib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy5KU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07CisgIGJvb2wgaGFzX2pzdHlwZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2pzdHlwZSgpOworICBzdGF0aWMgY29uc3QgaW50IGtKc3R5cGVGaWVsZE51bWJlciA9IDY7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSBqc3R5cGUoKSBjb25zdDsKKyAgdm9pZCBzZXRfanN0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfbGF6eSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2xhenkoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTGF6eUZpZWxkTnVtYmVyID0gNTsKKyAgYm9vbCBsYXp5KCkgY29uc3Q7CisgIHZvaWQgc2V0X2xhenkoYm9vbCB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKLSAgaW5saW5lIGJvb2wgaGFzX2RlcHJlY2F0ZWQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzOwotICBpbmxpbmUgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOwotICAKLSAgLy8gb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKLSAgaW5saW5lIGJvb2wgaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7Ci0gIHN0YXRpYyBjb25zdCBpbnQga0V4cGVyaW1lbnRhbE1hcEtleUZpZWxkTnVtYmVyID0gOTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGV4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9leHBlcmltZW50YWxfbWFwX2tleSgpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9leHBlcmltZW50YWxfbWFwX2tleSgpOwotICAKKyAgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQgPSBmYWxzZV07CisgIGJvb2wgaGFzX3dlYWsoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl93ZWFrKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1dlYWtGaWVsZE51bWJlciA9IDEwOworICBib29sIHdlYWsoKSBjb25zdDsKKyAgdm9pZCBzZXRfd2Vhayhib29sIHZhbHVlKTsKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi0gICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKICAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworCiAgIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKEZpZWxkT3B0aW9ucykKICAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGNsYXNzX3Njb3BlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMpCiAgcHJpdmF0ZToKQEAgLTE4MTksMjggKzI0MzAsMzEgQEAKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2N0eXBlKCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfcGFja2VkKCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19wYWNrZWQoKTsKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19qc3R5cGUoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2pzdHlwZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2xhenkoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2xhenkoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19kZXByZWNhdGVkKCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19kZXByZWNhdGVkKCk7Ci0gIGlubGluZSB2b2lkIHNldF9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7Ci0gIAorICBpbmxpbmUgdm9pZCBzZXRfaGFzX3dlYWsoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3dlYWsoKTsKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCi0gIGludCBjdHlwZV87Ci0gIGJvb2wgcGFja2VkXzsKLSAgYm9vbCBkZXByZWNhdGVkXzsKLSAgOjpzdGQ6OnN0cmluZyogZXhwZXJpbWVudGFsX21hcF9rZXlfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwogICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg1ICsgMzEpIC8gMzJdOwotICAKKyAgaW50IGN0eXBlXzsKKyAgaW50IGpzdHlwZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIHBhY2tlZF87CisgIGJvb2wgbGF6eV87CisgIGJvb2wgZGVwcmVjYXRlZF87CisgIGJvb2wgd2Vha187CiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBGaWVsZE9wdGlvbnMqIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTE4NTAsMzcgKzI0NjQsMzkgQEAKICBwdWJsaWM6CiAgIEVudW1PcHRpb25zKCk7CiAgIHZpcnR1YWwgfkVudW1PcHRpb25zKCk7Ci0gIAorCiAgIEVudW1PcHRpb25zKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKTsKLSAgCisKICAgaW5saW5lIEVudW1PcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRW51bU9wdGlvbnMmIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IEVudW1PcHRpb25zJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAorCiAgIHZvaWQgU3dhcChFbnVtT3B0aW9ucyogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgRW51bU9wdGlvbnMqIE5ldygpIGNvbnN0OworCisgIGlubGluZSBFbnVtT3B0aW9ucyogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9CisKKyAgRW51bU9wdGlvbnMqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtT3B0aW9ucyYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEVudW1PcHRpb25zJiBmcm9tKTsKICAgdm9pZCBDbGVhcigpOwogICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCisKICAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CiAgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwpAQCAtMTg5Miw0MyArMjUwOCw2OCBAQAogICB2b2lkIFNoYXJlZEN0b3IoKTsKICAgdm9pZCBTaGFyZWREdG9yKCk7CiAgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEVudW1PcHRpb25zKiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKKyAgLy8gb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7CisgIGJvb2wgaGFzX2FsbG93X2FsaWFzKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfYWxsb3dfYWxpYXMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrQWxsb3dBbGlhc0ZpZWxkTnVtYmVyID0gMjsKKyAgYm9vbCBhbGxvd19hbGlhcygpIGNvbnN0OworICB2b2lkIHNldF9hbGxvd19hbGlhcyhib29sIHZhbHVlKTsKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzOworICBib29sIGRlcHJlY2F0ZWQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKTsKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7Ci0gIGlubGluZSBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOworICBpbnQgdW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga1VuaW50ZXJwcmV0ZWRPcHRpb25GaWVsZE51bWJlciA9IDk5OTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi0gICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBhZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKICAgICAgIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCisgICAgICB1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0OworCiAgIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKEVudW1PcHRpb25zKQogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zKQogIHByaXZhdGU6Ci0gIAorICBpbmxpbmUgdm9pZCBzZXRfaGFzX2FsbG93X2FsaWFzKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19hbGxvd19hbGlhcygpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25TZXQgX2V4dGVuc2lvbnNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotICAKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CiAgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+IHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKKyAgYm9vbCBhbGxvd19hbGlhc187CisgIGJvb2wgZGVwcmVjYXRlZF87CiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBFbnVtT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtMTkzOCwzNyArMjU3OSwzOSBAQAogIHB1YmxpYzoKICAgRW51bVZhbHVlT3B0aW9ucygpOwogICB2aXJ0dWFsIH5FbnVtVmFsdWVPcHRpb25zKCk7Ci0gIAorCiAgIEVudW1WYWx1ZU9wdGlvbnMoY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBFbnVtVmFsdWVPcHRpb25zJiBvcGVyYXRvcj0oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwogICBzdGF0aWMgY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoRW51bVZhbHVlT3B0aW9ucyogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgRW51bVZhbHVlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIEVudW1WYWx1ZU9wdGlvbnMqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIEVudW1WYWx1ZU9wdGlvbnMqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBFbnVtVmFsdWVPcHRpb25zJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgRW51bVZhbHVlT3B0aW9ucyYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTE5ODAsNDMgKzI2MjMsNTggQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChFbnVtVmFsdWVPcHRpb25zKiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKKyAgLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIGNsZWFyX2RlcHJlY2F0ZWQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMTsKKyAgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBpbmxpbmUgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOwogICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCiAgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKwogICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhFbnVtVmFsdWVPcHRpb25zKQogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMpCiAgcHJpdmF0ZToKLSAgCisgIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87Ci0gIAorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKICAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKLSAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIGRlcHJlY2F0ZWRfOwogICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgRW51bVZhbHVlT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtMjAyNiwzNyArMjY4NCwzOSBAQAogIHB1YmxpYzoKICAgU2VydmljZU9wdGlvbnMoKTsKICAgdmlydHVhbCB+U2VydmljZU9wdGlvbnMoKTsKLSAgCisKICAgU2VydmljZU9wdGlvbnMoY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pOwotICAKKwogICBpbmxpbmUgU2VydmljZU9wdGlvbnMmIG9wZXJhdG9yPShjb25zdCBTZXJ2aWNlT3B0aW9ucyYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwogICBzdGF0aWMgY29uc3QgU2VydmljZU9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCisKICAgdm9pZCBTd2FwKFNlcnZpY2VPcHRpb25zKiBvdGhlcik7Ci0gIAorCiAgIC8vIGltcGxlbWVudHMgTWVzc2FnZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAotICBTZXJ2aWNlT3B0aW9ucyogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIFNlcnZpY2VPcHRpb25zKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBTZXJ2aWNlT3B0aW9ucyogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKICAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOwogICB2b2lkIENvcHlGcm9tKGNvbnN0IFNlcnZpY2VPcHRpb25zJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgU2VydmljZU9wdGlvbnMmIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC0yMDY4LDQzICsyNzI4LDU4IEBACiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoU2VydmljZU9wdGlvbnMqIG90aGVyKTsKKyAgcHJpdmF0ZToKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLmFyZW5hKCk7CisgIH0KKyAgaW5saW5lIHZvaWQqIE1heWJlQXJlbmFQdHIoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ucmF3X2FyZW5hX3B0cigpOworICB9CiAgIHB1YmxpYzoKLSAgCisKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OwotICAKKwogICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKworICAvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzMyBbZGVmYXVsdCA9IGZhbHNlXTsKKyAgYm9vbCBoYXNfZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIGNsZWFyX2RlcHJlY2F0ZWQoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrRGVwcmVjYXRlZEZpZWxkTnVtYmVyID0gMzM7CisgIGJvb2wgZGVwcmVjYXRlZCgpIGNvbnN0OworICB2b2lkIHNldF9kZXByZWNhdGVkKGJvb2wgdmFsdWUpOworCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKLSAgaW5saW5lIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIGludCB1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKICAgc3RhdGljIGNvbnN0IGludCBrVW5pbnRlcnByZXRlZE9wdGlvbkZpZWxkTnVtYmVyID0gOTk5OwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiB1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLSAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIGFkZF91bmludGVycHJldGVkX29wdGlvbigpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgogICAgICAgbXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpOwotICAKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKKyAgICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3Q7CisKICAgR09PR0xFX1BST1RPQlVGX0VYVEVOU0lPTl9BQ0NFU1NPUlMoU2VydmljZU9wdGlvbnMpCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMpCiAgcHJpdmF0ZToKLSAgCisgIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87Ci0gIAorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKICAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKLSAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIGRlcHJlY2F0ZWRfOwogICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgU2VydmljZU9wdGlvbnMqIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTIxMTQsMzcgKzI3ODksMzkgQEAKICBwdWJsaWM6CiAgIE1ldGhvZE9wdGlvbnMoKTsKICAgdmlydHVhbCB+TWV0aG9kT3B0aW9ucygpOwotICAKKwogICBNZXRob2RPcHRpb25zKGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pOwotICAKKwogICBpbmxpbmUgTWV0aG9kT3B0aW9ucyYgb3BlcmF0b3I9KGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IE1ldGhvZE9wdGlvbnMmIGRlZmF1bHRfaW5zdGFuY2UoKTsKLSAgCisKICAgdm9pZCBTd2FwKE1ldGhvZE9wdGlvbnMqIG90aGVyKTsKLSAgCisKICAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCi0gIE1ldGhvZE9wdGlvbnMqIE5ldygpIGNvbnN0OworCisgIGlubGluZSBNZXRob2RPcHRpb25zKiBOZXcoKSBjb25zdCB7IHJldHVybiBOZXcoTlVMTCk7IH0KKworICBNZXRob2RPcHRpb25zKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OwogICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgTWV0aG9kT3B0aW9ucyYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1ldGhvZE9wdGlvbnMmIGZyb20pOwogICB2b2lkIENsZWFyKCk7CiAgIGJvb2wgSXNJbml0aWFsaXplZCgpIGNvbnN0OwotICAKKwogICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKICAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCiAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CkBAIC0yMTU2LDQzICsyODMzLDU4IEBACiAgIHZvaWQgU2hhcmVkQ3RvcigpOwogICB2b2lkIFNoYXJlZER0b3IoKTsKICAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoTWV0aG9kT3B0aW9ucyogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCisgIC8vIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0ID0gZmFsc2VdOworICBib29sIGhhc19kZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZGVwcmVjYXRlZCgpOworICBzdGF0aWMgY29uc3QgaW50IGtEZXByZWNhdGVkRmllbGROdW1iZXIgPSAzMzsKKyAgYm9vbCBkZXByZWNhdGVkKCkgY29uc3Q7CisgIHZvaWQgc2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSk7CisKICAgLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwotICBpbmxpbmUgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfdW5pbnRlcnByZXRlZF9vcHRpb24oKTsKKyAgaW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl91bmludGVycHJldGVkX29wdGlvbigpOwogICBzdGF0aWMgY29uc3QgaW50IGtVbmludGVycHJldGVkT3B0aW9uRmllbGROdW1iZXIgPSA5OTk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIHVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIG11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogYWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCiAgICAgICBtdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorICAgICAgdW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdDsKKwogICBHT09HTEVfUFJPVE9CVUZfRVhURU5TSU9OX0FDQ0VTU09SUyhNZXRob2RPcHRpb25zKQogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMpCiAgcHJpdmF0ZToKLSAgCisgIGlubGluZSB2b2lkIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvblNldCBfZXh0ZW5zaW9uc187Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiB1bmludGVycHJldGVkX29wdGlvbl87Ci0gIAorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgX2ludGVybmFsX21ldGFkYXRhXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1sxXTsKICAgbXV0YWJsZSBpbnQgX2NhY2hlZF9zaXplXzsKLSAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50MzIgX2hhc19iaXRzX1soMSArIDMxKSAvIDMyXTsKLSAgCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworICBib29sIGRlcHJlY2F0ZWRfOwogICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgTWV0aG9kT3B0aW9ucyogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtMjIwMiwzNyArMjg5NCwzOSBAQAogIHB1YmxpYzoKICAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCgpOwogICB2aXJ0dWFsIH5VbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KCk7Ci0gIAorCiAgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQoY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBvcGVyYXRvcj0oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwogICBzdGF0aWMgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQqIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTIyNDQsNTEgKzI5MzgsNjAgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgLy8gcmVxdWlyZWQgc3RyaW5nIG5hbWVfcGFydCA9IDE7Ci0gIGlubGluZSBib29sIGhhc19uYW1lX3BhcnQoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbmFtZV9wYXJ0KCk7CisgIGJvb2wgaGFzX25hbWVfcGFydCgpIGNvbnN0OworICB2b2lkIGNsZWFyX25hbWVfcGFydCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtOYW1lUGFydEZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIG5hbWVfcGFydCgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfbmFtZV9wYXJ0KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIHNldF9uYW1lX3BhcnQoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfbmFtZV9wYXJ0KCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWVfcGFydCgpOwotICAKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgbmFtZV9wYXJ0KCkgY29uc3Q7CisgIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX25hbWVfcGFydCgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX25hbWVfcGFydCgpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfbmFtZV9wYXJ0KDo6c3RkOjpzdHJpbmcqIG5hbWVfcGFydCk7CisKICAgLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwotICBpbmxpbmUgYm9vbCBoYXNfaXNfZXh0ZW5zaW9uKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2lzX2V4dGVuc2lvbigpOworICBib29sIGhhc19pc19leHRlbnNpb24oKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9pc19leHRlbnNpb24oKTsKICAgc3RhdGljIGNvbnN0IGludCBrSXNFeHRlbnNpb25GaWVsZE51bWJlciA9IDI7Ci0gIGlubGluZSBib29sIGlzX2V4dGVuc2lvbigpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfaXNfZXh0ZW5zaW9uKGJvb2wgdmFsdWUpOwotICAKKyAgYm9vbCBpc19leHRlbnNpb24oKSBjb25zdDsKKyAgdm9pZCBzZXRfaXNfZXh0ZW5zaW9uKGJvb2wgdmFsdWUpOworCiAgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydCkKICBwcml2YXRlOgogICBpbmxpbmUgdm9pZCBzZXRfaGFzX25hbWVfcGFydCgpOwogICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfbmFtZV9wYXJ0KCk7CiAgIGlubGluZSB2b2lkIHNldF9oYXNfaXNfZXh0ZW5zaW9uKCk7CiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19pc19leHRlbnNpb24oKTsKLSAgCi0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0IF91bmtub3duX2ZpZWxkc187Ci0gIAotICA6OnN0ZDo6c3RyaW5nKiBuYW1lX3BhcnRfOwotICBib29sIGlzX2V4dGVuc2lvbl87Ci0gIAorCisgIC8vIGhlbHBlciBmb3IgQnl0ZVNpemUoKQorICBpbnQgUmVxdWlyZWRGaWVsZHNCeXRlU2l6ZUZhbGxiYWNrKCkgY29uc3Q7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOwogICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWygyICsgMzEpIC8gMzJdOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgbmFtZV9wYXJ0XzsKKyAgYm9vbCBpc19leHRlbnNpb25fOwogICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogZGVmYXVsdF9pbnN0YW5jZV87CiB9OwpAQCAtMjI5OCwzNyArMzAwMSwzOSBAQAogIHB1YmxpYzoKICAgVW5pbnRlcnByZXRlZE9wdGlvbigpOwogICB2aXJ0dWFsIH5VbmludGVycHJldGVkT3B0aW9uKCk7Ci0gIAorCiAgIFVuaW50ZXJwcmV0ZWRPcHRpb24oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSk7Ci0gIAorCiAgIGlubGluZSBVbmludGVycHJldGVkT3B0aW9uJiBvcGVyYXRvcj0oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSkgewogICAgIENvcHlGcm9tKGZyb20pOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICAKKwogICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgewotICAgIHJldHVybiBfdW5rbm93bl9maWVsZHNfOworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgewotICAgIHJldHVybiAmX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CiAgIH0KLSAgCisKICAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOwogICBzdGF0aWMgY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZGVmYXVsdF9pbnN0YW5jZSgpOwotICAKKwogICB2b2lkIFN3YXAoVW5pbnRlcnByZXRlZE9wdGlvbiogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgVW5pbnRlcnByZXRlZE9wdGlvbiogTmV3KCkgY29uc3Q7CisKKyAgaW5saW5lIFVuaW50ZXJwcmV0ZWRPcHRpb24qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIFVuaW50ZXJwcmV0ZWRPcHRpb24qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgVW5pbnRlcnByZXRlZE9wdGlvbiYgZnJvbSk7CiAgIHZvaWQgQ2xlYXIoKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7Ci0gIAorCiAgIGludCBCeXRlU2l6ZSgpIGNvbnN0OwogICBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgKICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKQEAgLTIzNDAsODIgKzMwNDUsOTMgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChVbmludGVycHJldGVkT3B0aW9uKiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQogICBwdWJsaWM6Ci0gIAorCiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKLSAgCisKICAgLy8gbmVzdGVkIHR5cGVzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgCisKICAgdHlwZWRlZiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0IE5hbWVQYXJ0OwotICAKKwogICAvLyBhY2Nlc3NvcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKKwogICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQgbmFtZSA9IDI7Ci0gIGlubGluZSBpbnQgbmFtZV9zaXplKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX25hbWUoKTsKKyAgaW50IG5hbWVfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX25hbWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrTmFtZUZpZWxkTnVtYmVyID0gMjsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCYgbmFtZShpbnQgaW5kZXgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBtdXRhYmxlX25hbWUoaW50IGluZGV4KTsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogYWRkX25hbWUoKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0ID4mCi0gICAgICBuYW1lKCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQmIG5hbWUoaW50IGluZGV4KSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBtdXRhYmxlX25hbWUoaW50IGluZGV4KTsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBhZGRfbmFtZSgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgogICAgICAgbXV0YWJsZV9uYW1lKCk7Ci0gIAorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+JgorICAgICAgbmFtZSgpIGNvbnN0OworCiAgIC8vIG9wdGlvbmFsIHN0cmluZyBpZGVudGlmaWVyX3ZhbHVlID0gMzsKLSAgaW5saW5lIGJvb2wgaGFzX2lkZW50aWZpZXJfdmFsdWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfaWRlbnRpZmllcl92YWx1ZSgpOworICBib29sIGhhc19pZGVudGlmaWVyX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfaWRlbnRpZmllcl92YWx1ZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtJZGVudGlmaWVyVmFsdWVGaWVsZE51bWJlciA9IDM7Ci0gIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBpZGVudGlmaWVyX3ZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIGlubGluZSA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgCisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGlkZW50aWZpZXJfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9pZGVudGlmaWVyX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfaWRlbnRpZmllcl92YWx1ZSgpOworICA6OnN0ZDo6c3RyaW5nKiByZWxlYXNlX2lkZW50aWZpZXJfdmFsdWUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX2lkZW50aWZpZXJfdmFsdWUoOjpzdGQ6OnN0cmluZyogaWRlbnRpZmllcl92YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgdWludDY0IHBvc2l0aXZlX2ludF92YWx1ZSA9IDQ7Ci0gIGlubGluZSBib29sIGhhc19wb3NpdGl2ZV9pbnRfdmFsdWUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcG9zaXRpdmVfaW50X3ZhbHVlKCk7CisgIGJvb2wgaGFzX3Bvc2l0aXZlX2ludF92YWx1ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3Bvc2l0aXZlX2ludF92YWx1ZSgpOwogICBzdGF0aWMgY29uc3QgaW50IGtQb3NpdGl2ZUludFZhbHVlRmllbGROdW1iZXIgPSA0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9wb3NpdGl2ZV9pbnRfdmFsdWUoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgdmFsdWUpOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgcG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgc2V0X3Bvc2l0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ2NCB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgaW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlID0gNTsKLSAgaW5saW5lIGJvb2wgaGFzX25lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKKyAgYm9vbCBoYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfbmVnYXRpdmVfaW50X3ZhbHVlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga05lZ2F0aXZlSW50VmFsdWVGaWVsZE51bWJlciA9IDU7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBzZXRfbmVnYXRpdmVfaW50X3ZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQ2NCBuZWdhdGl2ZV9pbnRfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfbmVnYXRpdmVfaW50X3ZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgdmFsdWUpOworCiAgIC8vIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OwotICBpbmxpbmUgYm9vbCBoYXNfZG91YmxlX3ZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIGNsZWFyX2RvdWJsZV92YWx1ZSgpOworICBib29sIGhhc19kb3VibGVfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9kb3VibGVfdmFsdWUoKTsKICAgc3RhdGljIGNvbnN0IGludCBrRG91YmxlVmFsdWVGaWVsZE51bWJlciA9IDY7Ci0gIGlubGluZSBkb3VibGUgZG91YmxlX3ZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9kb3VibGVfdmFsdWUoZG91YmxlIHZhbHVlKTsKLSAgCisgIGRvdWJsZSBkb3VibGVfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfZG91YmxlX3ZhbHVlKGRvdWJsZSB2YWx1ZSk7CisKICAgLy8gb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKLSAgaW5saW5lIGJvb2wgaGFzX3N0cmluZ192YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9zdHJpbmdfdmFsdWUoKTsKKyAgYm9vbCBoYXNfc3RyaW5nX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfc3RyaW5nX3ZhbHVlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga1N0cmluZ1ZhbHVlRmllbGROdW1iZXIgPSA3OwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgc3RyaW5nX3ZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9zdHJpbmdfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X3N0cmluZ192YWx1ZShjb25zdCB2b2lkKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9zdHJpbmdfdmFsdWUoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfc3RyaW5nX3ZhbHVlKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBzdHJpbmdfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfc3RyaW5nX3ZhbHVlKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfc3RyaW5nX3ZhbHVlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9zdHJpbmdfdmFsdWUoOjpzdGQ6OnN0cmluZyogc3RyaW5nX3ZhbHVlKTsKKwogICAvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKLSAgaW5saW5lIGJvb2wgaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpIGNvbnN0OwotICBpbmxpbmUgdm9pZCBjbGVhcl9hZ2dyZWdhdGVfdmFsdWUoKTsKKyAgYm9vbCBoYXNfYWdncmVnYXRlX3ZhbHVlKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfYWdncmVnYXRlX3ZhbHVlKCk7CiAgIHN0YXRpYyBjb25zdCBpbnQga0FnZ3JlZ2F0ZVZhbHVlRmllbGROdW1iZXIgPSA4OwotICBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgYWdncmVnYXRlX3ZhbHVlKCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOwotICBpbmxpbmUgdm9pZCBzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKLSAgaW5saW5lIHZvaWQgc2V0X2FnZ3JlZ2F0ZV92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOwotICBpbmxpbmUgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgaW5saW5lIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfYWdncmVnYXRlX3ZhbHVlKCk7Ci0gIAorICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBhZ2dyZWdhdGVfdmFsdWUoKSBjb25zdDsKKyAgdm9pZCBzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfYWdncmVnYXRlX3ZhbHVlKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2VfYWdncmVnYXRlX3ZhbHVlKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9hZ2dyZWdhdGVfdmFsdWUoOjpzdGQ6OnN0cmluZyogYWdncmVnYXRlX3ZhbHVlKTsKKwogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24pCiAgcHJpdmF0ZToKICAgaW5saW5lIHZvaWQgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7CkBAIC0yNDMwLDI0ICszMTQ2LDIxIEBACiAgIGlubGluZSB2b2lkIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKICAgaW5saW5lIHZvaWQgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKICAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQgX3Vua25vd25fZmllbGRzXzsKLSAgCisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+IG5hbWVfOwotICA6OnN0ZDo6c3RyaW5nKiBpZGVudGlmaWVyX3ZhbHVlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgaWRlbnRpZmllcl92YWx1ZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IHBvc2l0aXZlX2ludF92YWx1ZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50NjQgbmVnYXRpdmVfaW50X3ZhbHVlXzsKICAgZG91YmxlIGRvdWJsZV92YWx1ZV87Ci0gIDo6c3RkOjpzdHJpbmcqIHN0cmluZ192YWx1ZV87Ci0gIDo6c3RkOjpzdHJpbmcqIGFnZ3JlZ2F0ZV92YWx1ZV87Ci0gIAotICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwotICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWyg3ICsgMzEpIC8gMzJdOwotICAKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgc3RyaW5nX3ZhbHVlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgYWdncmVnYXRlX3ZhbHVlXzsKICAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKLSAgCisKICAgdm9pZCBJbml0QXNEZWZhdWx0SW5zdGFuY2UoKTsKICAgc3RhdGljIFVuaW50ZXJwcmV0ZWRPcHRpb24qIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTI0NTcsMzcgKzMxNzAsMzkgQEAKICBwdWJsaWM6CiAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCk7CiAgIHZpcnR1YWwgflNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKCk7Ci0gIAorCiAgIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKTsKLSAgCisKICAgaW5saW5lIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBvcGVyYXRvcj0oY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAorCiAgIHZvaWQgU3dhcChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIE5ldygpIGNvbnN0OworCisgIGlubGluZSBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9CisKKyAgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBmcm9tKTsKICAgdm9pZCBDbGVhcigpOwogICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCisKICAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CiAgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwpAQCAtMjQ5OSw1NSArMzIxNCwxMDcgQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKLSAgaW5saW5lIGludCBwYXRoX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfcGF0aCgpOworICBpbnQgcGF0aF9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfcGF0aCgpOwogICBzdGF0aWMgY29uc3QgaW50IGtQYXRoRmllbGROdW1iZXIgPSAxOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBwYXRoKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9wYXRoKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9wYXRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgcGF0aChpbnQgaW5kZXgpIGNvbnN0OworICB2b2lkIHNldF9wYXRoKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIHZvaWQgYWRkX3BhdGgoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgogICAgICAgcGF0aCgpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgogICAgICAgbXV0YWJsZV9wYXRoKCk7Ci0gIAorCiAgIC8vIHJlcGVhdGVkIGludDMyIHNwYW4gPSAyIFtwYWNrZWQgPSB0cnVlXTsKLSAgaW5saW5lIGludCBzcGFuX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfc3BhbigpOworICBpbnQgc3Bhbl9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfc3BhbigpOwogICBzdGF0aWMgY29uc3QgaW50IGtTcGFuRmllbGROdW1iZXIgPSAyOwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBzcGFuKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSB2b2lkIHNldF9zcGFuKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7Ci0gIGlubGluZSB2b2lkIGFkZF9zcGFuKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOwotICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgc3BhbihpbnQgaW5kZXgpIGNvbnN0OworICB2b2lkIHNldF9zcGFuKGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIHZvaWQgYWRkX3NwYW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgogICAgICAgc3BhbigpIGNvbnN0OwotICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgogICAgICAgbXV0YWJsZV9zcGFuKCk7Ci0gIAorCisgIC8vIG9wdGlvbmFsIHN0cmluZyBsZWFkaW5nX2NvbW1lbnRzID0gMzsKKyAgYm9vbCBoYXNfbGVhZGluZ19jb21tZW50cygpIGNvbnN0OworICB2b2lkIGNsZWFyX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTGVhZGluZ0NvbW1lbnRzRmllbGROdW1iZXIgPSAzOworICBjb25zdCA6OnN0ZDo6c3RyaW5nJiBsZWFkaW5nX2NvbW1lbnRzKCkgY29uc3Q7CisgIHZvaWQgc2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKTsKKyAgdm9pZCBzZXRfbGVhZGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV9sZWFkaW5nX2NvbW1lbnRzKCk7CisgIHZvaWQgc2V0X2FsbG9jYXRlZF9sZWFkaW5nX2NvbW1lbnRzKDo6c3RkOjpzdHJpbmcqIGxlYWRpbmdfY29tbWVudHMpOworCisgIC8vIG9wdGlvbmFsIHN0cmluZyB0cmFpbGluZ19jb21tZW50cyA9IDQ7CisgIGJvb2wgaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVHJhaWxpbmdDb21tZW50c0ZpZWxkTnVtYmVyID0gNDsKKyAgY29uc3QgOjpzdGQ6OnN0cmluZyYgdHJhaWxpbmdfY29tbWVudHMoKSBjb25zdDsKKyAgdm9pZCBzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpOworICB2b2lkIHNldF90cmFpbGluZ19jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSk7CisgIDo6c3RkOjpzdHJpbmcqIG11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgOjpzdGQ6OnN0cmluZyogcmVsZWFzZV90cmFpbGluZ19jb21tZW50cygpOworICB2b2lkIHNldF9hbGxvY2F0ZWRfdHJhaWxpbmdfY29tbWVudHMoOjpzdGQ6OnN0cmluZyogdHJhaWxpbmdfY29tbWVudHMpOworCisgIC8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKKyAgaW50IGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKTsKKyAgc3RhdGljIGNvbnN0IGludCBrTGVhZGluZ0RldGFjaGVkQ29tbWVudHNGaWVsZE51bWJlciA9IDY7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4KSBjb25zdDsKKyAgOjpzdGQ6OnN0cmluZyogbXV0YWJsZV9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCk7CisgIHZvaWQgc2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSk7CisgIHZvaWQgc2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgc2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBhZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpOworICB2b2lkIGFkZF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBhZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSk7CisgIHZvaWQgYWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKTsKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+KiBtdXRhYmxlX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoKTsKKwogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uKQogIHByaXZhdGU6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKKyAgaW5saW5lIHZvaWQgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIGlubGluZSB2b2lkIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgaW5saW5lIHZvaWQgY2xlYXJfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiBwYXRoXzsKICAgbXV0YWJsZSBpbnQgX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV87CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+IHNwYW5fOwogICBtdXRhYmxlIGludCBfc3Bhbl9jYWNoZWRfYnl0ZV9zaXplXzsKLSAgCi0gIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDIgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpBcmVuYVN0cmluZ1B0ciBsZWFkaW5nX2NvbW1lbnRzXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6QXJlbmFTdHJpbmdQdHIgdHJhaWxpbmdfY29tbWVudHNfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+IGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfOwogICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwogICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOwotICAKKwogICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOwogICBzdGF0aWMgU291cmNlQ29kZUluZm9fTG9jYXRpb24qIGRlZmF1bHRfaW5zdGFuY2VfOwogfTsKQEAgLTI1NTcsMzcgKzMzMjQsMzkgQEAKICBwdWJsaWM6CiAgIFNvdXJjZUNvZGVJbmZvKCk7CiAgIHZpcnR1YWwgflNvdXJjZUNvZGVJbmZvKCk7Ci0gIAorCiAgIFNvdXJjZUNvZGVJbmZvKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKTsKLSAgCisKICAgaW5saW5lIFNvdXJjZUNvZGVJbmZvJiBvcGVyYXRvcj0oY29uc3QgU291cmNlQ29kZUluZm8mIGZyb20pIHsKICAgICBDb3B5RnJvbShmcm9tKTsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgCisKICAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKLSAgICByZXR1cm4gX3Vua25vd25fZmllbGRzXzsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCogbXV0YWJsZV91bmtub3duX2ZpZWxkcygpIHsKLSAgICByZXR1cm4gJl91bmtub3duX2ZpZWxkc187CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOwogICB9Ci0gIAorCiAgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKICAgc3RhdGljIGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBkZWZhdWx0X2luc3RhbmNlKCk7Ci0gIAorCiAgIHZvaWQgU3dhcChTb3VyY2VDb2RlSW5mbyogb3RoZXIpOwotICAKKwogICAvLyBpbXBsZW1lbnRzIE1lc3NhZ2UgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAKLSAgU291cmNlQ29kZUluZm8qIE5ldygpIGNvbnN0OworCisgIGlubGluZSBTb3VyY2VDb2RlSW5mbyogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9CisKKyAgU291cmNlQ29kZUluZm8qIE5ldyg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgY29uc3Q7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBNZXJnZUZyb20oY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlJiBmcm9tKTsKICAgdm9pZCBDb3B5RnJvbShjb25zdCBTb3VyY2VDb2RlSW5mbyYgZnJvbSk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IFNvdXJjZUNvZGVJbmZvJiBmcm9tKTsKICAgdm9pZCBDbGVhcigpOwogICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKLSAgCisKICAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CiAgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAogICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwpAQCAtMjU5OSw1MCArMzM2OCwyNzggQEAKICAgdm9pZCBTaGFyZWRDdG9yKCk7CiAgIHZvaWQgU2hhcmVkRHRvcigpOwogICB2b2lkIFNldENhY2hlZFNpemUoaW50IHNpemUpIGNvbnN0OworICB2b2lkIEludGVybmFsU3dhcChTb3VyY2VDb2RlSW5mbyogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KICAgcHVibGljOgotICAKKwogICA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGFkYXRhIEdldE1ldGFkYXRhKCkgY29uc3Q7Ci0gIAorCiAgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIHR5cGVkZWYgU291cmNlQ29kZUluZm9fTG9jYXRpb24gTG9jYXRpb247Ci0gIAorCiAgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0gIAorCiAgIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24gbG9jYXRpb24gPSAxOwotICBpbmxpbmUgaW50IGxvY2F0aW9uX3NpemUoKSBjb25zdDsKLSAgaW5saW5lIHZvaWQgY2xlYXJfbG9jYXRpb24oKTsKKyAgaW50IGxvY2F0aW9uX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9sb2NhdGlvbigpOwogICBzdGF0aWMgY29uc3QgaW50IGtMb2NhdGlvbkZpZWxkTnVtYmVyID0gMTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24mIGxvY2F0aW9uKGludCBpbmRleCkgY29uc3Q7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBtdXRhYmxlX2xvY2F0aW9uKGludCBpbmRleCk7Ci0gIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBhZGRfbG9jYXRpb24oKTsKLSAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+JgotICAgICAgbG9jYXRpb24oKSBjb25zdDsKLSAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+KgorICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBsb2NhdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBtdXRhYmxlX2xvY2F0aW9uKGludCBpbmRleCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24qIGFkZF9sb2NhdGlvbigpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPioKICAgICAgIG11dGFibGVfbG9jYXRpb24oKTsKLSAgCisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiA+JgorICAgICAgbG9jYXRpb24oKSBjb25zdDsKKwogICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvKQogIHByaXZhdGU6Ci0gIAotICA6Omdvb2dsZTo6cHJvdG9idWY6OlVua25vd25GaWVsZFNldCBfdW5rbm93bl9maWVsZHNfOwotICAKLSAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4gbG9jYXRpb25fOwotICAKKworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hIF9pbnRlcm5hbF9tZXRhZGF0YV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bMV07CiAgIG11dGFibGUgaW50IF9jYWNoZWRfc2l6ZV87Ci0gIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDMyIF9oYXNfYml0c19bKDEgKyAzMSkgLyAzMl07Ci0gIAorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiBsb2NhdGlvbl87CiAgIGZyaWVuZCB2b2lkIExJQlBST1RPQlVGX0VYUE9SVCBwcm90b2J1Zl9BZGREZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CiAgIGZyaWVuZCB2b2lkIHByb3RvYnVmX0Fzc2lnbkRlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKICAgZnJpZW5kIHZvaWQgcHJvdG9idWZfU2h1dGRvd25GaWxlX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7Ci0gIAorCiAgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CiAgIHN0YXRpYyBTb3VyY2VDb2RlSW5mbyogZGVmYXVsdF9pbnN0YW5jZV87CiB9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA6IHB1YmxpYyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UgeworIHB1YmxpYzoKKyAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbigpOworICB2aXJ0dWFsIH5HZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKCk7CisKKyAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbihjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKTsKKworICBpbmxpbmUgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgb3BlcmF0b3I9KGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pIHsKKyAgICBDb3B5RnJvbShmcm9tKTsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKworICBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnVua25vd25fZmllbGRzKCk7CisgIH0KKworICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmtub3duRmllbGRTZXQqIG11dGFibGVfdW5rbm93bl9maWVsZHMoKSB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpOworICB9CisKKyAgc3RhdGljIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvciogZGVzY3JpcHRvcigpOworICBzdGF0aWMgY29uc3QgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgZGVmYXVsdF9pbnN0YW5jZSgpOworCisgIHZvaWQgU3dhcChHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpbmxpbmUgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogTmV3KCkgY29uc3QgeyByZXR1cm4gTmV3KE5VTEwpOyB9CisKKyAgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKKyAgdm9pZCBDb3B5RnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UmIGZyb20pOworICB2b2lkIENvcHlGcm9tKGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uJiBmcm9tKTsKKyAgdm9pZCBDbGVhcigpOworICBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdDsKKworICBpbnQgQnl0ZVNpemUoKSBjb25zdDsKKyAgYm9vbCBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZvaWQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogb3V0cHV0KSBjb25zdDsKKyAgaW50IEdldENhY2hlZFNpemUoKSBjb25zdCB7IHJldHVybiBfY2FjaGVkX3NpemVfOyB9CisgIHByaXZhdGU6CisgIHZvaWQgU2hhcmVkQ3RvcigpOworICB2b2lkIFNoYXJlZER0b3IoKTsKKyAgdm9pZCBTZXRDYWNoZWRTaXplKGludCBzaXplKSBjb25zdDsKKyAgdm9pZCBJbnRlcm5hbFN3YXAoR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogb3RoZXIpOworICBwcml2YXRlOgorICBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmFOb1ZpcnR1YWwoKSBjb25zdCB7CisgICAgcmV0dXJuIF9pbnRlcm5hbF9tZXRhZGF0YV8uYXJlbmEoKTsKKyAgfQorICBpbmxpbmUgdm9pZCogTWF5YmVBcmVuYVB0cigpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5yYXdfYXJlbmFfcHRyKCk7CisgIH0KKyAgcHVibGljOgorCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKKworICAvLyBuZXN0ZWQgdHlwZXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIGFjY2Vzc29ycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgLy8gcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZCA9IHRydWVdOworICBpbnQgcGF0aF9zaXplKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfcGF0aCgpOworICBzdGF0aWMgY29uc3QgaW50IGtQYXRoRmllbGROdW1iZXIgPSAxOworICA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHBhdGgoaW50IGluZGV4KSBjb25zdDsKKyAgdm9pZCBzZXRfcGF0aChpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworICB2b2lkIGFkZF9wYXRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKKyAgICAgIHBhdGgoKSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCisgICAgICBtdXRhYmxlX3BhdGgoKTsKKworICAvLyBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOworICBib29sIGhhc19zb3VyY2VfZmlsZSgpIGNvbnN0OworICB2b2lkIGNsZWFyX3NvdXJjZV9maWxlKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga1NvdXJjZUZpbGVGaWVsZE51bWJlciA9IDI7CisgIGNvbnN0IDo6c3RkOjpzdHJpbmcmIHNvdXJjZV9maWxlKCkgY29uc3Q7CisgIHZvaWQgc2V0X3NvdXJjZV9maWxlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKTsKKyAgdm9pZCBzZXRfc291cmNlX2ZpbGUoY29uc3QgY2hhciogdmFsdWUpOworICB2b2lkIHNldF9zb3VyY2VfZmlsZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpOworICA6OnN0ZDo6c3RyaW5nKiBtdXRhYmxlX3NvdXJjZV9maWxlKCk7CisgIDo6c3RkOjpzdHJpbmcqIHJlbGVhc2Vfc291cmNlX2ZpbGUoKTsKKyAgdm9pZCBzZXRfYWxsb2NhdGVkX3NvdXJjZV9maWxlKDo6c3RkOjpzdHJpbmcqIHNvdXJjZV9maWxlKTsKKworICAvLyBvcHRpb25hbCBpbnQzMiBiZWdpbiA9IDM7CisgIGJvb2wgaGFzX2JlZ2luKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfYmVnaW4oKTsKKyAgc3RhdGljIGNvbnN0IGludCBrQmVnaW5GaWVsZE51bWJlciA9IDM7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgYmVnaW4oKSBjb25zdDsKKyAgdm9pZCBzZXRfYmVnaW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSk7CisKKyAgLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gNDsKKyAgYm9vbCBoYXNfZW5kKCkgY29uc3Q7CisgIHZvaWQgY2xlYXJfZW5kKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0VuZEZpZWxkTnVtYmVyID0gNDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBlbmQoKSBjb25zdDsKKyAgdm9pZCBzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpOworCisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChjbGFzc19zY29wZTpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbikKKyBwcml2YXRlOgorICBpbmxpbmUgdm9pZCBzZXRfaGFzX3NvdXJjZV9maWxlKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19zb3VyY2VfZmlsZSgpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2JlZ2luKCk7CisgIGlubGluZSB2b2lkIGNsZWFyX2hhc19iZWdpbigpOworICBpbmxpbmUgdm9pZCBzZXRfaGFzX2VuZCgpOworICBpbmxpbmUgdm9pZCBjbGVhcl9oYXNfZW5kKCk7CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiBwYXRoXzsKKyAgbXV0YWJsZSBpbnQgX3BhdGhfY2FjaGVkX2J5dGVfc2l6ZV87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkFyZW5hU3RyaW5nUHRyIHNvdXJjZV9maWxlXzsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBiZWdpbl87CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgZW5kXzsKKyAgZnJpZW5kIHZvaWQgTElCUFJPVE9CVUZfRVhQT1JUIHByb3RvYnVmX0FkZERlc2NfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKyAgZnJpZW5kIHZvaWQgcHJvdG9idWZfQXNzaWduRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9TaHV0ZG93bkZpbGVfZ29vZ2xlXzJmcHJvdG9idWZfMmZkZXNjcmlwdG9yXzJlcHJvdG8oKTsKKworICB2b2lkIEluaXRBc0RlZmF1bHRJbnN0YW5jZSgpOworICBzdGF0aWMgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiogZGVmYXVsdF9pbnN0YW5jZV87Cit9OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgR2VuZXJhdGVkQ29kZUluZm8gOiBwdWJsaWMgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIHsKKyBwdWJsaWM6CisgIEdlbmVyYXRlZENvZGVJbmZvKCk7CisgIHZpcnR1YWwgfkdlbmVyYXRlZENvZGVJbmZvKCk7CisKKyAgR2VuZXJhdGVkQ29kZUluZm8oY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGZyb20pOworCisgIGlubGluZSBHZW5lcmF0ZWRDb2RlSW5mbyYgb3BlcmF0b3I9KGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBmcm9tKSB7CisgICAgQ29weUZyb20oZnJvbSk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcygpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy51bmtub3duX2ZpZWxkcygpOworICB9CisKKyAgaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX3Vua25vd25fZmllbGRzKCkgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLm11dGFibGVfdW5rbm93bl9maWVsZHMoKTsKKyAgfQorCisgIHN0YXRpYyBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKTsKKyAgc3RhdGljIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvJiBkZWZhdWx0X2luc3RhbmNlKCk7CisKKyAgdm9pZCBTd2FwKEdlbmVyYXRlZENvZGVJbmZvKiBvdGhlcik7CisKKyAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICBpbmxpbmUgR2VuZXJhdGVkQ29kZUluZm8qIE5ldygpIGNvbnN0IHsgcmV0dXJuIE5ldyhOVUxMKTsgfQorCisgIEdlbmVyYXRlZENvZGVJbmZvKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OworICB2b2lkIENvcHlGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSYgZnJvbSk7CisgIHZvaWQgQ29weUZyb20oY29uc3QgR2VuZXJhdGVkQ29kZUluZm8mIGZyb20pOworICB2b2lkIE1lcmdlRnJvbShjb25zdCBHZW5lcmF0ZWRDb2RlSW5mbyYgZnJvbSk7CisgIHZvaWQgQ2xlYXIoKTsKKyAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CisKKyAgaW50IEJ5dGVTaXplKCkgY29uc3Q7CisgIGJvb2wgTWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKAorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2b2lkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDgqIG91dHB1dCkgY29uc3Q7CisgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3QgeyByZXR1cm4gX2NhY2hlZF9zaXplXzsgfQorICBwcml2YXRlOgorICB2b2lkIFNoYXJlZEN0b3IoKTsKKyAgdm9pZCBTaGFyZWREdG9yKCk7CisgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CisgIHZvaWQgSW50ZXJuYWxTd2FwKEdlbmVyYXRlZENvZGVJbmZvKiBvdGhlcik7CisgIHByaXZhdGU6CisgIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gX2ludGVybmFsX21ldGFkYXRhXy5hcmVuYSgpOworICB9CisgIGlubGluZSB2b2lkKiBNYXliZUFyZW5hUHRyKCkgY29uc3QgeworICAgIHJldHVybiBfaW50ZXJuYWxfbWV0YWRhdGFfLnJhd19hcmVuYV9wdHIoKTsKKyAgfQorICBwdWJsaWM6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRhZGF0YSBHZXRNZXRhZGF0YSgpIGNvbnN0OworCisgIC8vIG5lc3RlZCB0eXBlcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgdHlwZWRlZiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uIEFubm90YXRpb247CisKKyAgLy8gYWNjZXNzb3JzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CisgIGludCBhbm5vdGF0aW9uX3NpemUoKSBjb25zdDsKKyAgdm9pZCBjbGVhcl9hbm5vdGF0aW9uKCk7CisgIHN0YXRpYyBjb25zdCBpbnQga0Fubm90YXRpb25GaWVsZE51bWJlciA9IDE7CisgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiYgYW5ub3RhdGlvbihpbnQgaW5kZXgpIGNvbnN0OworICA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIG11dGFibGVfYW5ub3RhdGlvbihpbnQgaW5kZXgpOworICA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIGFkZF9hbm5vdGF0aW9uKCk7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uID4qCisgICAgICBtdXRhYmxlX2Fubm90YXRpb24oKTsKKyAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24gPiYKKyAgICAgIGFubm90YXRpb24oKSBjb25zdDsKKworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoY2xhc3Nfc2NvcGU6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvKQorIHByaXZhdGU6CisKKyAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSBfaW50ZXJuYWxfbWV0YWRhdGFfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQzMiBfaGFzX2JpdHNfWzFdOworICBtdXRhYmxlIGludCBfY2FjaGVkX3NpemVfOworICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA+IGFubm90YXRpb25fOworICBmcmllbmQgdm9pZCBMSUJQUk9UT0JVRl9FWFBPUlQgcHJvdG9idWZfQWRkRGVzY19nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworICBmcmllbmQgdm9pZCBwcm90b2J1Zl9Bc3NpZ25EZXNjX2dvb2dsZV8yZnByb3RvYnVmXzJmZGVzY3JpcHRvcl8yZXByb3RvKCk7CisgIGZyaWVuZCB2b2lkIHByb3RvYnVmX1NodXRkb3duRmlsZV9nb29nbGVfMmZwcm90b2J1Zl8yZmRlc2NyaXB0b3JfMmVwcm90bygpOworCisgIHZvaWQgSW5pdEFzRGVmYXVsdEluc3RhbmNlKCk7CisgIHN0YXRpYyBHZW5lcmF0ZWRDb2RlSW5mbyogZGVmYXVsdF9pbnN0YW5jZV87Cit9OwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorI2lmICFQUk9UT0JVRl9JTkxJTkVfTk9UX0lOX0hFQURFUlMKIC8vIEZpbGVEZXNjcmlwdG9yU2V0CiAKIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90byBmaWxlID0gMTsKQEAgLTI2NTMsMjIgKzM2NTAsMjcgQEAKICAgZmlsZV8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yU2V0OjpmaWxlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQogICByZXR1cm4gZmlsZV8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVEZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yU2V0OjptdXRhYmxlX2ZpbGUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQogICByZXR1cm4gZmlsZV8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclNldDo6YWRkX2ZpbGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yU2V0LmZpbGUpCiAgIHJldHVybiBmaWxlXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgotRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGUoKSBjb25zdCB7Ci0gIHJldHVybiBmaWxlXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+KgogRmlsZURlc2NyaXB0b3JTZXQ6Om11dGFibGVfZmlsZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JTZXQuZmlsZSkKICAgcmV0dXJuICZmaWxlXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZURlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JTZXQ6OmZpbGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclNldC5maWxlKQorICByZXR1cm4gZmlsZV87Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMjY4NSw1MSArMzY4Nyw0NyBAQAogICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8tPmNsZWFyKCk7Ci0gIH0KKyAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfbmFtZSgpOwogfQogaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpbGVEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAqbmFtZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQogfQogaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKICAgc2V0X2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gbmFtZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOwotICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19uYW1lKCk7CiAgIH0KKyAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5uYW1lKQogfQogCiAvLyBvcHRpb25hbCBzdHJpbmcgcGFja2FnZSA9IDI7CkBAIC0yNzQzLDUxICszNzQxLDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwogfQogaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfcGFja2FnZSgpIHsKLSAgaWYgKHBhY2thZ2VfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBwYWNrYWdlXy0+Y2xlYXIoKTsKLSAgfQorICBwYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc19wYWNrYWdlKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6cGFja2FnZSgpIGNvbnN0IHsKLSAgcmV0dXJuICpwYWNrYWdlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQorICByZXR1cm4gcGFja2FnZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc19wYWNrYWdlKCk7Ci0gIGlmIChwYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBwYWNrYWdlXy0+YXNzaWduKHZhbHVlKTsKKyAgcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQogfQogaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19wYWNrYWdlKCk7Ci0gIGlmIChwYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBwYWNrYWdlXy0+YXNzaWduKHZhbHVlKTsKKyAgcGFja2FnZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCiB9CiBpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKICAgc2V0X2hhc19wYWNrYWdlKCk7Ci0gIGlmIChwYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBwYWNrYWdlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIHBhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9wYWNrYWdlKCkgewogICBzZXRfaGFzX3BhY2thZ2UoKTsKLSAgaWYgKHBhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBwYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBwYWNrYWdlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucGFja2FnZSkKKyAgcmV0dXJuIHBhY2thZ2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9wYWNrYWdlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wYWNrYWdlKQogICBjbGVhcl9oYXNfcGFja2FnZSgpOwotICBpZiAocGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gcGFja2FnZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfcGFja2FnZSg6OnN0ZDo6c3RyaW5nKiBwYWNrYWdlKSB7CisgIGlmIChwYWNrYWdlICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX3BhY2thZ2UoKTsKICAgfSBlbHNlIHsKLSAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gcGFja2FnZV87Ci0gICAgcGFja2FnZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gICAgcmV0dXJuIHRlbXA7CisgICAgY2xlYXJfaGFzX3BhY2thZ2UoKTsKICAgfQorICBwYWNrYWdlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgcGFja2FnZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnBhY2thZ2UpCiB9CiAKIC8vIHJlcGVhdGVkIHN0cmluZyBkZXBlbmRlbmN5ID0gMzsKQEAgLTI3OTgsNDIgKzM3OTIsMTEzIEBACiAgIGRlcGVuZGVuY3lfLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQogICByZXR1cm4gZGVwZW5kZW5jeV8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlcGVuZGVuY3koaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCiAgIHJldHVybiBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQogICBkZXBlbmRlbmN5Xy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9kZXBlbmRlbmN5KGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKICAgZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5kZXBlbmRlbmN5KQogfQogaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2RlcGVuZGVuY3koaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKICAgZGVwZW5kZW5jeV8uTXV0YWJsZShpbmRleCktPmFzc2lnbigKICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCiAgIHJldHVybiBkZXBlbmRlbmN5Xy5BZGQoKTsKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9kZXBlbmRlbmN5KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIGRlcGVuZGVuY3lfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCiB9CiBpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSkgewogICBkZXBlbmRlbmN5Xy5BZGQoKS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLmRlcGVuZGVuY3kpCiB9CiBpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfZGVwZW5kZW5jeShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKICAgZGVwZW5kZW5jeV8uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+JgogRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVwZW5kZW5jeSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKICAgcmV0dXJuIGRlcGVuZGVuY3lfOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2RlcGVuZGVuY3koKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZGVwZW5kZW5jeSkKICAgcmV0dXJuICZkZXBlbmRlbmN5XzsKIH0KIAorLy8gcmVwZWF0ZWQgaW50MzIgcHVibGljX2RlcGVuZGVuY3kgPSAxMDsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6cHVibGljX2RlcGVuZGVuY3lfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5Xy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9wdWJsaWNfZGVwZW5kZW5jeSgpIHsKKyAgcHVibGljX2RlcGVuZGVuY3lfLkNsZWFyKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWxlRGVzY3JpcHRvclByb3RvOjpwdWJsaWNfZGVwZW5kZW5jeShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5Xy5HZXQoaW5kZXgpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X3B1YmxpY19kZXBlbmRlbmN5KGludCBpbmRleCwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwdWJsaWNfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfcHVibGljX2RlcGVuZGVuY3koOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBwdWJsaWNfZGVwZW5kZW5jeV8uQWRkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OnB1YmxpY19kZXBlbmRlbmN5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5wdWJsaWNfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIHB1YmxpY19kZXBlbmRlbmN5XzsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPioKK0ZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcHVibGljX2RlcGVuZGVuY3koKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ucHVibGljX2RlcGVuZGVuY3kpCisgIHJldHVybiAmcHVibGljX2RlcGVuZGVuY3lfOworfQorCisvLyByZXBlYXRlZCBpbnQzMiB3ZWFrX2RlcGVuZGVuY3kgPSAxMTsKK2lubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5X3NpemUoKSBjb25zdCB7CisgIHJldHVybiB3ZWFrX2RlcGVuZGVuY3lfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3dlYWtfZGVwZW5kZW5jeSgpIHsKKyAgd2Vha19kZXBlbmRlbmN5Xy5DbGVhcigpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRmlsZURlc2NyaXB0b3JQcm90bzo6d2Vha19kZXBlbmRlbmN5KGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLndlYWtfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIHdlYWtfZGVwZW5kZW5jeV8uR2V0KGluZGV4KTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF93ZWFrX2RlcGVuZGVuY3koaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHdlYWtfZGVwZW5kZW5jeV8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ud2Vha19kZXBlbmRlbmN5KQorfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX3dlYWtfZGVwZW5kZW5jeSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHdlYWtfZGVwZW5kZW5jeV8uQWRkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4mCitGaWxlRGVzY3JpcHRvclByb3RvOjp3ZWFrX2RlcGVuZGVuY3koKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLndlYWtfZGVwZW5kZW5jeSkKKyAgcmV0dXJuIHdlYWtfZGVwZW5kZW5jeV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCitGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3dlYWtfZGVwZW5kZW5jeSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by53ZWFrX2RlcGVuZGVuY3kpCisgIHJldHVybiAmd2Vha19kZXBlbmRlbmN5XzsKK30KKwogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKIGlubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlX3NpemUoKSBjb25zdCB7CiAgIHJldHVybiBtZXNzYWdlX3R5cGVfLnNpemUoKTsKQEAgLTI4NDIsMjIgKzM5MDcsMjcgQEAKICAgbWVzc2FnZV90eXBlXy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjptZXNzYWdlX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQogICByZXR1cm4gbWVzc2FnZV90eXBlXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21lc3NhZ2VfdHlwZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQogICByZXR1cm4gbWVzc2FnZV90eXBlXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6YWRkX21lc3NhZ2VfdHlwZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUpCiAgIHJldHVybiBtZXNzYWdlX3R5cGVfLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86Om1lc3NhZ2VfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG1lc3NhZ2VfdHlwZV87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+KgogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9tZXNzYWdlX3R5cGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ubWVzc2FnZV90eXBlKQogICByZXR1cm4gJm1lc3NhZ2VfdHlwZV87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgorRmlsZURlc2NyaXB0b3JQcm90bzo6bWVzc2FnZV90eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5tZXNzYWdlX3R5cGUpCisgIHJldHVybiBtZXNzYWdlX3R5cGVfOworfQogCiAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8gZW51bV90eXBlID0gNTsKIGlubGluZSBpbnQgRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7CkBAIC0yODY3LDIyICszOTM3LDI3IEBACiAgIGVudW1fdHlwZV8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIEZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCiAgIHJldHVybiBlbnVtX3R5cGVfLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQogICByZXR1cm4gZW51bV90eXBlXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9lbnVtX3R5cGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQogICByZXR1cm4gZW51bV90eXBlXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgotRmlsZURlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgewotICByZXR1cm4gZW51bV90eXBlXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+KgogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9lbnVtX3R5cGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQogICByZXR1cm4gJmVudW1fdHlwZV87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OmVudW1fdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQorICByZXR1cm4gZW51bV90eXBlXzsKK30KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvIHNlcnZpY2UgPSA2OwogaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXJ2aWNlX3NpemUoKSBjb25zdCB7CkBAIC0yODkyLDIyICszOTY3LDI3IEBACiAgIHNlcnZpY2VfLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXJ2aWNlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCiAgIHJldHVybiBzZXJ2aWNlXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9zZXJ2aWNlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlKQogICByZXR1cm4gc2VydmljZV8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlRGVzY3JpcHRvclByb3RvKiBGaWxlRGVzY3JpcHRvclByb3RvOjphZGRfc2VydmljZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zZXJ2aWNlKQogICByZXR1cm4gc2VydmljZV8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86OnNlcnZpY2UoKSBjb25zdCB7Ci0gIHJldHVybiBzZXJ2aWNlXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZURlc2NyaXB0b3JQcm90byA+KgogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9zZXJ2aWNlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCiAgIHJldHVybiAmc2VydmljZV87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OnNlcnZpY2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNlcnZpY2UpCisgIHJldHVybiBzZXJ2aWNlXzsKK30KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA3OwogaW5saW5lIGludCBGaWxlRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fc2l6ZSgpIGNvbnN0IHsKQEAgLTI5MTcsODAgKzM5OTcsMTY5IEBACiAgIGV4dGVuc2lvbl8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvJiBGaWxlRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQogICByZXR1cm4gZXh0ZW5zaW9uXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCiAgIHJldHVybiBleHRlbnNpb25fLk11dGFibGUoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIEZpbGVEZXNjcmlwdG9yUHJvdG86OmFkZF9leHRlbnNpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQogICByZXR1cm4gZXh0ZW5zaW9uXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKLUZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKLSAgcmV0dXJuIGV4dGVuc2lvbl87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCiBGaWxlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCiAgIHJldHVybiAmZXh0ZW5zaW9uXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8gPiYKK0ZpbGVEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQorICByZXR1cm4gZXh0ZW5zaW9uXzsKK30KIAogLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucyBvcHRpb25zID0gODsKIGlubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDIwMHUpICE9IDA7CiB9CiBpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDIwMHU7CiB9CiBpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAyMDB1OwogfQogaW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zOjpDbGVhcigpOwogICBjbGVhcl9oYXNfb3B0aW9ucygpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMmIEZpbGVEZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKICAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgeworICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnM7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgcmV0dXJuIG9wdGlvbnNfOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIEZpbGVEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3B0aW9ucygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOwogICBvcHRpb25zXyA9IE5VTEw7CiAgIHJldHVybiB0ZW1wOwogfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9vcHRpb25zKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQogCiAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvIHNvdXJjZV9jb2RlX2luZm8gPSA5OwogaW5saW5lIGJvb2wgRmlsZURlc2NyaXB0b3JQcm90bzo6aGFzX3NvdXJjZV9jb2RlX2luZm8oKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAxMDB1KSAhPSAwOworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwNDAwdSkgIT0gMDsKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfc291cmNlX2NvZGVfaW5mbygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMTAwdTsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwNDAwdTsKIH0KIGlubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMTAwdTsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDQwMHU7CiB9CiBpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zb3VyY2VfY29kZV9pbmZvKCkgewogICBpZiAoc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCkgc291cmNlX2NvZGVfaW5mb18tPjo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm86OkNsZWFyKCk7CiAgIGNsZWFyX2hhc19zb3VyY2VfY29kZV9pbmZvKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyYgRmlsZURlc2NyaXB0b3JQcm90bzo6c291cmNlX2NvZGVfaW5mbygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQogICByZXR1cm4gc291cmNlX2NvZGVfaW5mb18gIT0gTlVMTCA/ICpzb3VyY2VfY29kZV9pbmZvXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+c291cmNlX2NvZGVfaW5mb187CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogRmlsZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9zb3VyY2VfY29kZV9pbmZvKCkgewogICBzZXRfaGFzX3NvdXJjZV9jb2RlX2luZm8oKTsKLSAgaWYgKHNvdXJjZV9jb2RlX2luZm9fID09IE5VTEwpIHNvdXJjZV9jb2RlX2luZm9fID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm87CisgIGlmIChzb3VyY2VfY29kZV9pbmZvXyA9PSBOVUxMKSB7CisgICAgc291cmNlX2NvZGVfaW5mb18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbzsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQogICByZXR1cm4gc291cmNlX2NvZGVfaW5mb187CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9zb3VyY2VfY29kZV9pbmZvKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zb3VyY2VfY29kZV9pbmZvKQogICBjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvKiB0ZW1wID0gc291cmNlX2NvZGVfaW5mb187CiAgIHNvdXJjZV9jb2RlX2luZm9fID0gTlVMTDsKICAgcmV0dXJuIHRlbXA7CiB9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX3NvdXJjZV9jb2RlX2luZm8oOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mbyogc291cmNlX2NvZGVfaW5mbykgeworICBkZWxldGUgc291cmNlX2NvZGVfaW5mb187CisgIHNvdXJjZV9jb2RlX2luZm9fID0gc291cmNlX2NvZGVfaW5mbzsKKyAgaWYgKHNvdXJjZV9jb2RlX2luZm8pIHsKKyAgICBzZXRfaGFzX3NvdXJjZV9jb2RlX2luZm8oKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfc291cmNlX2NvZGVfaW5mbygpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnNvdXJjZV9jb2RlX2luZm8pCit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBzeW50YXggPSAxMjsKK2lubGluZSBib29sIEZpbGVEZXNjcmlwdG9yUHJvdG86Omhhc19zeW50YXgoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDA4MDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19zeW50YXgoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDgwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfc3ludGF4KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwODAwdTsKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3N5bnRheCgpIHsKKyAgc3ludGF4Xy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19zeW50YXgoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlRGVzY3JpcHRvclByb3RvOjpzeW50YXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQorICByZXR1cm4gc3ludGF4Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfc3ludGF4KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfc3ludGF4KCk7CisgIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCit9CitpbmxpbmUgdm9pZCBGaWxlRGVzY3JpcHRvclByb3RvOjpzZXRfc3ludGF4KGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfc3ludGF4KCk7CisgIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKK30KK2lubGluZSB2b2lkIEZpbGVEZXNjcmlwdG9yUHJvdG86OnNldF9zeW50YXgoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfc3ludGF4KCk7CisgIHN5bnRheF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVEZXNjcmlwdG9yUHJvdG8uc3ludGF4KQorfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfc3ludGF4KCkgeworICBzZXRfaGFzX3N5bnRheCgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZURlc2NyaXB0b3JQcm90by5zeW50YXgpCisgIHJldHVybiBzeW50YXhfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9zeW50YXgoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKKyAgY2xlYXJfaGFzX3N5bnRheCgpOworICByZXR1cm4gc3ludGF4Xy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgRmlsZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9zeW50YXgoOjpzdGQ6OnN0cmluZyogc3ludGF4KSB7CisgIGlmIChzeW50YXggIT0gTlVMTCkgeworICAgIHNldF9oYXNfc3ludGF4KCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX3N5bnRheCgpOworICB9CisgIHN5bnRheF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHN5bnRheCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWxlRGVzY3JpcHRvclByb3RvLnN5bnRheCkKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMDExLDExICs0MTgwLDEzIEBACiAgIGNsZWFyX2hhc19zdGFydCgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzdGFydCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLnN0YXJ0KQogICByZXR1cm4gc3RhcnRfOwogfQogaW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlOjpzZXRfc3RhcnQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewogICBzZXRfaGFzX3N0YXJ0KCk7CiAgIHN0YXJ0XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2Uuc3RhcnQpCiB9CiAKIC8vIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7CkBAIC0zMDMzLDExICs0MjA0LDY1IEBACiAgIGNsZWFyX2hhc19lbmQoKTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6ZW5kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uRXh0ZW5zaW9uUmFuZ2UuZW5kKQogICByZXR1cm4gZW5kXzsKIH0KIGlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZTo6c2V0X2VuZCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CiAgIHNldF9oYXNfZW5kKCk7CiAgIGVuZF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlLmVuZCkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZQorCisvLyBvcHRpb25hbCBpbnQzMiBzdGFydCA9IDE7CitpbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6aGFzX3N0YXJ0KCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAxdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzZXRfaGFzX3N0YXJ0KCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OmNsZWFyX2hhc19zdGFydCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6Y2xlYXJfc3RhcnQoKSB7CisgIHN0YXJ0XyA9IDA7CisgIGNsZWFyX2hhc19zdGFydCgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnN0YXJ0KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5zdGFydCkKKyAgcmV0dXJuIHN0YXJ0XzsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzZXRfc3RhcnQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX3N0YXJ0KCk7CisgIHN0YXJ0XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5zdGFydCkKK30KKworLy8gb3B0aW9uYWwgaW50MzIgZW5kID0gMjsKK2lubGluZSBib29sIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpoYXNfZW5kKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDAydSkgIT0gMDsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpzZXRfaGFzX2VuZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpjbGVhcl9oYXNfZW5kKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlOjpjbGVhcl9lbmQoKSB7CisgIGVuZF8gPSAwOworICBjbGVhcl9oYXNfZW5kKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZTo6ZW5kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZS5lbmQpCisgIHJldHVybiBlbmRfOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2U6OnNldF9lbmQoOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX2VuZCgpOworICBlbmRfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5SZXNlcnZlZFJhbmdlLmVuZCkKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzA1NSw1MSArNDI4MCw0NyBAQAogICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKIH0KIGlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgfQorICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc19uYW1lKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gKm5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBuYW1lXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQogICBjbGVhcl9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfbmFtZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKLSAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOwogICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uYW1lKQogfQogCiAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvIGZpZWxkID0gMjsKQEAgLTMxMTAsMjIgKzQzMzEsMjcgQEAKICAgZmllbGRfLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpmaWVsZChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQogICByZXR1cm4gZmllbGRfLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2ZpZWxkKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmZpZWxkKQogICByZXR1cm4gZmllbGRfLk11dGFibGUoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2ZpZWxkKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCiAgIHJldHVybiBmaWVsZF8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCi1EZXNjcmlwdG9yUHJvdG86OmZpZWxkKCkgY29uc3QgewotICByZXR1cm4gZmllbGRfOwotfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+KgogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2ZpZWxkKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZmllbGQpCiAgIHJldHVybiAmZmllbGRfOwogfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byA+JgorRGVzY3JpcHRvclByb3RvOjpmaWVsZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5maWVsZCkKKyAgcmV0dXJuIGZpZWxkXzsKK30KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90byBleHRlbnNpb24gPSA2OwogaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9zaXplKCkgY29uc3QgewpAQCAtMzEzNSwyMiArNDM2MSwyNyBAQAogICBleHRlbnNpb25fLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byYgRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCiAgIHJldHVybiBleHRlbnNpb25fLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2V4dGVuc2lvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCiAgIHJldHVybiBleHRlbnNpb25fLk11dGFibGUoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbikKICAgcmV0dXJuIGV4dGVuc2lvbl8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCi1EZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKLSAgcmV0dXJuIGV4dGVuc2lvbl87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4qCiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uKQogICByZXR1cm4gJmV4dGVuc2lvbl87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvID4mCitEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb24pCisgIHJldHVybiBleHRlbnNpb25fOworfQogCiAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90byBuZXN0ZWRfdHlwZSA9IDM7CiBpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGVfc2l6ZSgpIGNvbnN0IHsKQEAgLTMxNjAsMjIgKzQzOTEsMjcgQEAKICAgbmVzdGVkX3R5cGVfLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6bmVzdGVkX3R5cGUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKICAgcmV0dXJuIG5lc3RlZF90eXBlXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmVzdGVkX3R5cGUoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCiAgIHJldHVybiBuZXN0ZWRfdHlwZV8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG8qIERlc2NyaXB0b3JQcm90bzo6YWRkX25lc3RlZF90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ubmVzdGVkX3R5cGUpCiAgIHJldHVybiBuZXN0ZWRfdHlwZV8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgotRGVzY3JpcHRvclByb3RvOjpuZXN0ZWRfdHlwZSgpIGNvbnN0IHsKLSAgcmV0dXJuIG5lc3RlZF90eXBlXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvID4qCiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmVzdGVkX3R5cGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKICAgcmV0dXJuICZuZXN0ZWRfdHlwZV87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90byA+JgorRGVzY3JpcHRvclByb3RvOjpuZXN0ZWRfdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5uZXN0ZWRfdHlwZSkKKyAgcmV0dXJuIG5lc3RlZF90eXBlXzsKK30KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvIGVudW1fdHlwZSA9IDQ7CiBpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlX3NpemUoKSBjb25zdCB7CkBAIC0zMTg1LDIyICs0NDIxLDI3IEBACiAgIGVudW1fdHlwZV8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8mIERlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQogICByZXR1cm4gZW51bV90eXBlXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2VudW1fdHlwZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5lbnVtX3R5cGUpCiAgIHJldHVybiBlbnVtX3R5cGVfLk11dGFibGUoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfZW51bV90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQogICByZXR1cm4gZW51bV90eXBlXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bURlc2NyaXB0b3JQcm90byA+JgotRGVzY3JpcHRvclByb3RvOjplbnVtX3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiBlbnVtX3R5cGVfOwotfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtRGVzY3JpcHRvclByb3RvID4qCiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZW51bV90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZW51bV90eXBlKQogICByZXR1cm4gJmVudW1fdHlwZV87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1EZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6ZW51bV90eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmVudW1fdHlwZSkKKyAgcmV0dXJuIGVudW1fdHlwZV87Cit9CiAKIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLkV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CiBpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3JhbmdlX3NpemUoKSBjb25zdCB7CkBAIC0zMjEwLDUxICs0NDUxLDE4NiBAQAogICBleHRlbnNpb25fcmFuZ2VfLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UmIERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uZXh0ZW5zaW9uX3JhbmdlKQogICByZXR1cm4gZXh0ZW5zaW9uX3JhbmdlXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZXh0ZW5zaW9uX3JhbmdlKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZSkKICAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UqIERlc2NyaXB0b3JQcm90bzo6YWRkX2V4dGVuc2lvbl9yYW5nZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLmV4dGVuc2lvbl9yYW5nZSkKICAgcmV0dXJuIGV4dGVuc2lvbl9yYW5nZV8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19FeHRlbnNpb25SYW5nZSA+JgotRGVzY3JpcHRvclByb3RvOjpleHRlbnNpb25fcmFuZ2UoKSBjb25zdCB7Ci0gIHJldHVybiBleHRlbnNpb25fcmFuZ2VfOwotfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fRXh0ZW5zaW9uUmFuZ2UgPioKIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbnNpb25fcmFuZ2UoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCiAgIHJldHVybiAmZXh0ZW5zaW9uX3JhbmdlXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX0V4dGVuc2lvblJhbmdlID4mCitEZXNjcmlwdG9yUHJvdG86OmV4dGVuc2lvbl9yYW5nZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5leHRlbnNpb25fcmFuZ2UpCisgIHJldHVybiBleHRlbnNpb25fcmFuZ2VfOworfQorCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvIG9uZW9mX2RlY2wgPSA4OworaW5saW5lIGludCBEZXNjcmlwdG9yUHJvdG86Om9uZW9mX2RlY2xfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIG9uZW9mX2RlY2xfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb25lb2ZfZGVjbCgpIHsKKyAgb25lb2ZfZGVjbF8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvJiBEZXNjcmlwdG9yUHJvdG86Om9uZW9mX2RlY2woaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQorICByZXR1cm4gb25lb2ZfZGVjbF8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok9uZW9mRGVzY3JpcHRvclByb3RvKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb25lb2ZfZGVjbChpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQorICByZXR1cm4gb25lb2ZfZGVjbF8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpPbmVvZkRlc2NyaXB0b3JQcm90byogRGVzY3JpcHRvclByb3RvOjphZGRfb25lb2ZfZGVjbCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9uZW9mX2RlY2wpCisgIHJldHVybiBvbmVvZl9kZWNsXy5BZGQoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vbmVvZl9kZWNsKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub25lb2ZfZGVjbCkKKyAgcmV0dXJuICZvbmVvZl9kZWNsXzsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6T25lb2ZEZXNjcmlwdG9yUHJvdG8gPiYKK0Rlc2NyaXB0b3JQcm90bzo6b25lb2ZfZGVjbCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vbmVvZl9kZWNsKQorICByZXR1cm4gb25lb2ZfZGVjbF87Cit9CiAKIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CiBpbmxpbmUgYm9vbCBEZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7CiB9CiBpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb3B0aW9ucygpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDQwdTsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDgwdTsKIH0KIGlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29wdGlvbnMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKIH0KIGlubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOjpDbGVhcigpOwogICBjbGVhcl9oYXNfb3B0aW9ucygpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnMmIERlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCiAgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKICAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VPcHRpb25zOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgeworICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZU9wdGlvbnM7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5vcHRpb25zKQogICByZXR1cm4gb3B0aW9uc187CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOwogICBvcHRpb25zXyA9IE5VTEw7CiAgIHJldHVybiB0ZW1wOwogfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlT3B0aW9ucyogb3B0aW9ucykgeworICBkZWxldGUgb3B0aW9uc187CisgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb3B0aW9ucygpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8uUmVzZXJ2ZWRSYW5nZSByZXNlcnZlZF9yYW5nZSA9IDk7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfcmFuZ2Vfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIHJlc2VydmVkX3JhbmdlXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmNsZWFyX3Jlc2VydmVkX3JhbmdlKCkgeworICByZXNlcnZlZF9yYW5nZV8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlJiBEZXNjcmlwdG9yUHJvdG86OnJlc2VydmVkX3JhbmdlKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiByZXNlcnZlZF9yYW5nZV8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3JQcm90b19SZXNlcnZlZFJhbmdlKiBEZXNjcmlwdG9yUHJvdG86Om11dGFibGVfcmVzZXJ2ZWRfcmFuZ2UoaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiByZXNlcnZlZF9yYW5nZV8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yUHJvdG9fUmVzZXJ2ZWRSYW5nZSogRGVzY3JpcHRvclByb3RvOjphZGRfcmVzZXJ2ZWRfcmFuZ2UoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9yYW5nZSkKKyAgcmV0dXJuIHJlc2VydmVkX3JhbmdlXy5BZGQoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9yYW5nZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX3JhbmdlKQorICByZXR1cm4gJnJlc2VydmVkX3JhbmdlXzsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RGVzY3JpcHRvclByb3RvX1Jlc2VydmVkUmFuZ2UgPiYKK0Rlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfcmFuZ2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfcmFuZ2UpCisgIHJldHVybiByZXNlcnZlZF9yYW5nZV87Cit9CisKKy8vIHJlcGVhdGVkIHN0cmluZyByZXNlcnZlZF9uYW1lID0gMTA7CitpbmxpbmUgaW50IERlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfbmFtZV9zaXplKCkgY29uc3QgeworICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgRGVzY3JpcHRvclByb3RvOjpjbGVhcl9yZXNlcnZlZF9uYW1lKCkgeworICByZXNlcnZlZF9uYW1lXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIERlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfbmFtZShpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiByZXNlcnZlZF9uYW1lXy5HZXQoaW5kZXgpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9uYW1lKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCisgIHJldHVybiByZXNlcnZlZF9uYW1lXy5NdXRhYmxlKGluZGV4KTsKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6c2V0X3Jlc2VydmVkX25hbWUoaW50IGluZGV4LCBjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUpIHsKKyAgcmVzZXJ2ZWRfbmFtZV8uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OnNldF9yZXNlcnZlZF9uYW1lKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHJlc2VydmVkX25hbWVfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV8uQWRkKCk7Cit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHJlc2VydmVkX25hbWVfLkFkZCgpLT5hc3NpZ24odmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKK30KK2lubGluZSB2b2lkIERlc2NyaXB0b3JQcm90bzo6YWRkX3Jlc2VydmVkX25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgcmVzZXJ2ZWRfbmFtZV8uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfY2hhcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgdm9pZCBEZXNjcmlwdG9yUHJvdG86OmFkZF9yZXNlcnZlZF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICByZXNlcnZlZF9uYW1lXy5BZGQoKS0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRGVzY3JpcHRvclByb3RvLnJlc2VydmVkX25hbWUpCit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYKK0Rlc2NyaXB0b3JQcm90bzo6cmVzZXJ2ZWRfbmFtZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkRlc2NyaXB0b3JQcm90by5yZXNlcnZlZF9uYW1lKQorICByZXR1cm4gcmVzZXJ2ZWRfbmFtZV87Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPioKK0Rlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9yZXNlcnZlZF9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5EZXNjcmlwdG9yUHJvdG8ucmVzZXJ2ZWRfbmFtZSkKKyAgcmV0dXJuICZyZXNlcnZlZF9uYW1lXzsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zMjcxLDUxICs0NjQ3LDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX25hbWUoKSB7Ci0gIGlmIChuYW1lXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8tPmNsZWFyKCk7Ci0gIH0KKyAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfbmFtZSgpOwogfQogaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gKm5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfbmFtZSgpIHsKICAgc2V0X2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gbmFtZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubmFtZSkKICAgY2xlYXJfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIG5hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfbmFtZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKLSAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOwogICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiAKIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDM7CkBAIC0zMzMzLDExICs0NzA1LDEzIEBACiAgIGNsZWFyX2hhc19udW1iZXIoKTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEZpZWxkRGVzY3JpcHRvclByb3RvOjpudW1iZXIoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm51bWJlcikKICAgcmV0dXJuIG51bWJlcl87CiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X251bWJlcig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CiAgIHNldF9oYXNfbnVtYmVyKCk7CiAgIG51bWJlcl8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQogfQogCiAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLkxhYmVsIGxhYmVsID0gNDsKQEAgLTMzNTUsMTIgKzQ3MjksMTQgQEAKICAgY2xlYXJfaGFzX2xhYmVsKCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6bGFiZWwoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmxhYmVsKQogICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fTGFiZWwgPihsYWJlbF8pOwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9sYWJlbCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbF9Jc1ZhbGlkKHZhbHVlKSk7CisgIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX0lzVmFsaWQodmFsdWUpKTsKICAgc2V0X2hhc19sYWJlbCgpOwogICBsYWJlbF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ubGFiZWwpCiB9CiAKIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uVHlwZSB0eXBlID0gNTsKQEAgLTMzNzgsMTIgKzQ3NTQsMTQgQEAKICAgY2xlYXJfaGFzX3R5cGUoKTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGUgRmllbGREZXNjcmlwdG9yUHJvdG86OnR5cGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGUpCiAgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlID4odHlwZV8pOwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZSB2YWx1ZSkgewotICBHT09HTEVfRENIRUNLKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9Jc1ZhbGlkKHZhbHVlKSk7CisgIGFzc2VydCg6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX1R5cGVfSXNWYWxpZCh2YWx1ZSkpOwogICBzZXRfaGFzX3R5cGUoKTsKICAgdHlwZV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZSkKIH0KIAogLy8gb3B0aW9uYWwgc3RyaW5nIHR5cGVfbmFtZSA9IDY7CkBAIC0zMzk3LDUxICs0Nzc1LDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX3R5cGVfbmFtZSgpIHsKLSAgaWYgKHR5cGVfbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHR5cGVfbmFtZV8tPmNsZWFyKCk7Ci0gIH0KKyAgdHlwZV9uYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc190eXBlX25hbWUoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6dHlwZV9uYW1lKCkgY29uc3QgewotICByZXR1cm4gKnR5cGVfbmFtZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKKyAgcmV0dXJuIHR5cGVfbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF90eXBlX25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc190eXBlX25hbWUoKTsKLSAgaWYgKHR5cGVfbmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHR5cGVfbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICB0eXBlX25hbWVfLT5hc3NpZ24odmFsdWUpOworICB0eXBlX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKIH0KIGlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfdHlwZV9uYW1lKCk7Ci0gIGlmICh0eXBlX25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICB0eXBlX25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgdHlwZV9uYW1lXy0+YXNzaWduKHZhbHVlKTsKKyAgdHlwZV9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKIH0KIGlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfdHlwZV9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX3R5cGVfbmFtZSgpOwotICBpZiAodHlwZV9uYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgdHlwZV9uYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHR5cGVfbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICB0eXBlX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by50eXBlX25hbWUpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfdHlwZV9uYW1lKCkgewogICBzZXRfaGFzX3R5cGVfbmFtZSgpOwotICBpZiAodHlwZV9uYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgdHlwZV9uYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiB0eXBlX25hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8udHlwZV9uYW1lKQorICByZXR1cm4gdHlwZV9uYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpZWxkRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX3R5cGVfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKICAgY2xlYXJfaGFzX3R5cGVfbmFtZSgpOwotICBpZiAodHlwZV9uYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiB0eXBlX25hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF90eXBlX25hbWUoOjpzdGQ6OnN0cmluZyogdHlwZV9uYW1lKSB7CisgIGlmICh0eXBlX25hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfdHlwZV9uYW1lKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IHR5cGVfbmFtZV87Ci0gICAgdHlwZV9uYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfdHlwZV9uYW1lKCk7CiAgIH0KKyAgdHlwZV9uYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdHlwZV9uYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLnR5cGVfbmFtZSkKIH0KIAogLy8gb3B0aW9uYWwgc3RyaW5nIGV4dGVuZGVlID0gMjsKQEAgLTM0NTUsNTEgKzQ4MjksNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7CiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfZXh0ZW5kZWUoKSB7Ci0gIGlmIChleHRlbmRlZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGV4dGVuZGVlXy0+Y2xlYXIoKTsKLSAgfQorICBleHRlbmRlZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWVsZERlc2NyaXB0b3JQcm90bzo6ZXh0ZW5kZWUoKSBjb25zdCB7Ci0gIHJldHVybiAqZXh0ZW5kZWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKKyAgcmV0dXJuIGV4dGVuZGVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2V4dGVuZGVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfZXh0ZW5kZWUoKTsKLSAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZXh0ZW5kZWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgZXh0ZW5kZWVfLT5hc3NpZ24odmFsdWUpOworICBleHRlbmRlZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2V4dGVuZGVlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfZXh0ZW5kZWUoKTsKLSAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZXh0ZW5kZWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgZXh0ZW5kZWVfLT5hc3NpZ24odmFsdWUpOworICBleHRlbmRlZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKIH0KIGlubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfZXh0ZW5kZWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfZXh0ZW5kZWUoKTsKLSAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZXh0ZW5kZWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgZXh0ZW5kZWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgZXh0ZW5kZWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5leHRlbmRlZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9leHRlbmRlZSgpIHsKICAgc2V0X2hhc19leHRlbmRlZSgpOwotICBpZiAoZXh0ZW5kZWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBleHRlbmRlZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gZXh0ZW5kZWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCisgIHJldHVybiBleHRlbmRlZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9leHRlbmRlZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmV4dGVuZGVlKQogICBjbGVhcl9oYXNfZXh0ZW5kZWUoKTsKLSAgaWYgKGV4dGVuZGVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBleHRlbmRlZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2V4dGVuZGVlKDo6c3RkOjpzdHJpbmcqIGV4dGVuZGVlKSB7CisgIGlmIChleHRlbmRlZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19leHRlbmRlZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBleHRlbmRlZV87Ci0gICAgZXh0ZW5kZWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19leHRlbmRlZSgpOwogICB9CisgIGV4dGVuZGVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgZXh0ZW5kZWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZXh0ZW5kZWUpCiB9CiAKIC8vIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3ZhbHVlID0gNzsKQEAgLTM1MTMsODEgKzQ4ODMsMjI4IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwNDB1OwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2RlZmF1bHRfdmFsdWUoKSB7Ci0gIGlmIChkZWZhdWx0X3ZhbHVlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVmYXVsdF92YWx1ZV8tPmNsZWFyKCk7Ci0gIH0KKyAgZGVmYXVsdF92YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpOwogfQogaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpkZWZhdWx0X3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKmRlZmF1bHRfdmFsdWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQorICByZXR1cm4gZGVmYXVsdF92YWx1ZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOwotICBpZiAoZGVmYXVsdF92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGRlZmF1bHRfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgZGVmYXVsdF92YWx1ZV8tPmFzc2lnbih2YWx1ZSk7CisgIGRlZmF1bHRfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2RlZmF1bHRfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIGlmIChkZWZhdWx0X3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVmYXVsdF92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBkZWZhdWx0X3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKKyAgZGVmYXVsdF92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9kZWZhdWx0X3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgaWYgKGRlZmF1bHRfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBkZWZhdWx0X3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGRlZmF1bHRfdmFsdWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgZGVmYXVsdF92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfZGVmYXVsdF92YWx1ZSgpIHsKICAgc2V0X2hhc19kZWZhdWx0X3ZhbHVlKCk7Ci0gIGlmIChkZWZhdWx0X3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZGVmYXVsdF92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gZGVmYXVsdF92YWx1ZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5kZWZhdWx0X3ZhbHVlKQorICByZXR1cm4gZGVmYXVsdF92YWx1ZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9kZWZhdWx0X3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uZGVmYXVsdF92YWx1ZSkKICAgY2xlYXJfaGFzX2RlZmF1bHRfdmFsdWUoKTsKLSAgaWYgKGRlZmF1bHRfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIGRlZmF1bHRfdmFsdWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9kZWZhdWx0X3ZhbHVlKDo6c3RkOjpzdHJpbmcqIGRlZmF1bHRfdmFsdWUpIHsKKyAgaWYgKGRlZmF1bHRfdmFsdWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfZGVmYXVsdF92YWx1ZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBkZWZhdWx0X3ZhbHVlXzsKLSAgICBkZWZhdWx0X3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfZGVmYXVsdF92YWx1ZSgpOwogICB9CisgIGRlZmF1bHRfdmFsdWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBkZWZhdWx0X3ZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmRlZmF1bHRfdmFsdWUpCit9CisKKy8vIG9wdGlvbmFsIGludDMyIG9uZW9mX2luZGV4ID0gOTsKK2lubGluZSBib29sIEZpZWxkRGVzY3JpcHRvclByb3RvOjpoYXNfb25lb2ZfaW5kZXgoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwODB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfb25lb2ZfaW5kZXgoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX29uZW9mX2luZGV4KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKK30KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vbmVvZl9pbmRleCgpIHsKKyAgb25lb2ZfaW5kZXhfID0gMDsKKyAgY2xlYXJfaGFzX29uZW9mX2luZGV4KCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBGaWVsZERlc2NyaXB0b3JQcm90bzo6b25lb2ZfaW5kZXgoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4KQorICByZXR1cm4gb25lb2ZfaW5kZXhfOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9vbmVvZl9pbmRleCg6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CisgIHNldF9oYXNfb25lb2ZfaW5kZXgoKTsKKyAgb25lb2ZfaW5kZXhfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4KQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcganNvbl9uYW1lID0gMTA7CitpbmxpbmUgYm9vbCBGaWVsZERlc2NyaXB0b3JQcm90bzo6aGFzX2pzb25fbmFtZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDEwMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19qc29uX25hbWUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX2pzb25fbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDEwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfanNvbl9uYW1lKCkgeworICBqc29uX25hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX2pzb25fbmFtZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkRGVzY3JpcHRvclByb3RvOjpqc29uX25hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKKyAgcmV0dXJuIGpzb25fbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9qc29uX25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19qc29uX25hbWUoKTsKKyAganNvbl9uYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2pzb25fbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2pzb25fbmFtZSgpOworICBqc29uX25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQorfQoraW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OnNldF9qc29uX25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfanNvbl9uYW1lKCk7CisgIGpzb25fbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLmpzb25fbmFtZSkKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9qc29uX25hbWUoKSB7CisgIHNldF9oYXNfanNvbl9uYW1lKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCisgIHJldHVybiBqc29uX25hbWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGREZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfanNvbl9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8uanNvbl9uYW1lKQorICBjbGVhcl9oYXNfanNvbl9uYW1lKCk7CisgIHJldHVybiBqc29uX25hbWVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9qc29uX25hbWUoOjpzdGQ6OnN0cmluZyoganNvbl9uYW1lKSB7CisgIGlmIChqc29uX25hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfanNvbl9uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2pzb25fbmFtZSgpOworICB9CisgIGpzb25fbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGpzb25fbmFtZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZERlc2NyaXB0b3JQcm90by5qc29uX25hbWUpCiB9CiAKIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIG9wdGlvbnMgPSA4OwogaW5saW5lIGJvb2wgRmllbGREZXNjcmlwdG9yUHJvdG86Omhhc19vcHRpb25zKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDIwMHUpICE9IDA7CiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAyMDB1OwogfQogaW5saW5lIHZvaWQgRmllbGREZXNjcmlwdG9yUHJvdG86OmNsZWFyX2hhc19vcHRpb25zKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDgwdTsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDIwMHU7CiB9CiBpbmxpbmUgdm9pZCBGaWVsZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfb3B0aW9ucygpIHsKICAgaWYgKG9wdGlvbnNfICE9IE5VTEwpIG9wdGlvbnNfLT46Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczo6Q2xlYXIoKTsKICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyYgRmllbGREZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpZWxkRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCiAgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9ucyogRmllbGREZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKICAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKKyAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgcmV0dXJuIG9wdGlvbnNfOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zKiBGaWVsZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKICAgb3B0aW9uc18gPSBOVUxMOwogICByZXR1cm4gdGVtcDsKIH0KK2lubGluZSB2b2lkIEZpZWxkRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmllbGREZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBPbmVvZkRlc2NyaXB0b3JQcm90bworCisvLyBvcHRpb25hbCBzdHJpbmcgbmFtZSA9IDE7CitpbmxpbmUgYm9vbCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6aGFzX25hbWUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfbmFtZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKKyAgbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfbmFtZSgpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE9uZW9mRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQoraW5saW5lIHZvaWQgT25lb2ZEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCit9CitpbmxpbmUgdm9pZCBPbmVvZkRlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbmFtZSgpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuT25lb2ZEZXNjcmlwdG9yUHJvdG8ubmFtZSkKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBPbmVvZkRlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgeworICBzZXRfaGFzX25hbWUoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk9uZW9mRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIE9uZW9mRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorICBjbGVhcl9oYXNfbmFtZSgpOworICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIE9uZW9mRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX25hbWUoKTsKKyAgfQorICBuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbmFtZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5PbmVvZkRlc2NyaXB0b3JQcm90by5uYW1lKQorfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM2MDQsNTEgKzUxMjEsNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CiB9CiBpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgewotICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfLT5jbGVhcigpOwotICB9CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2xlYXJfaGFzX25hbWUoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBFbnVtRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gKm5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24odmFsdWUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBFbnVtRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24odmFsdWUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIGlubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIG5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm5hbWUpCiAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgRW51bURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfbmFtZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKLSAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOwogICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8gdmFsdWUgPSAyOwpAQCAtMzY1OSwyMiArNTE3MiwyNyBAQAogICB2YWx1ZV8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byYgRW51bURlc2NyaXB0b3JQcm90bzo6dmFsdWUoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUpCiAgIHJldHVybiB2YWx1ZV8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogRW51bURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV92YWx1ZShpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUpCiAgIHJldHVybiB2YWx1ZV8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEVudW1EZXNjcmlwdG9yUHJvdG86OmFkZF92YWx1ZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bURlc2NyaXB0b3JQcm90by52YWx1ZSkKICAgcmV0dXJuIHZhbHVlXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4mCi1FbnVtRGVzY3JpcHRvclByb3RvOjp2YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuIHZhbHVlXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4qCiBFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLnZhbHVlKQogICByZXR1cm4gJnZhbHVlXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlRGVzY3JpcHRvclByb3RvID4mCitFbnVtRGVzY3JpcHRvclByb3RvOjp2YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8udmFsdWUpCisgIHJldHVybiB2YWx1ZV87Cit9CiAKIC8vIG9wdGlvbmFsIC5nb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMgb3B0aW9ucyA9IDM7CiBpbmxpbmUgYm9vbCBFbnVtRGVzY3JpcHRvclByb3RvOjpoYXNfb3B0aW9ucygpIGNvbnN0IHsKQEAgLTM2OTEsMTkgKzUyMDksMzQgQEAKICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zJiBFbnVtRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCiAgIHJldHVybiBvcHRpb25zXyAhPSBOVUxMID8gKm9wdGlvbnNfIDogKmRlZmF1bHRfaW5zdGFuY2VfLT5vcHRpb25zXzsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBFbnVtRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CiAgIHNldF9oYXNfb3B0aW9ucygpOwotICBpZiAob3B0aW9uc18gPT0gTlVMTCkgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtT3B0aW9uczsKKyAgaWYgKG9wdGlvbnNfID09IE5VTEwpIHsKKyAgICBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCiAgIHJldHVybiBvcHRpb25zXzsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBFbnVtRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5FbnVtRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCiAgIGNsZWFyX2hhc19vcHRpb25zKCk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bU9wdGlvbnMqIHRlbXAgPSBvcHRpb25zXzsKICAgb3B0aW9uc18gPSBOVUxMOwogICByZXR1cm4gdGVtcDsKIH0KK2lubGluZSB2b2lkIEVudW1EZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1PcHRpb25zKiBvcHRpb25zKSB7CisgIGRlbGV0ZSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBvcHRpb25zOworICBpZiAob3B0aW9ucykgeworICAgIHNldF9oYXNfb3B0aW9ucygpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW1EZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC0zNzIwLDUxICs1MjUzLDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwogfQogaW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgewotICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfLT5jbGVhcigpOwotICB9CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2xlYXJfaGFzX25hbWUoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG86Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAqbmFtZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24odmFsdWUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIGlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIGlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIG5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCiAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX25hbWUoOjpzdGQ6OnN0cmluZyogbmFtZSkgeworICBpZiAobmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19uYW1lKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IG5hbWVfOwotICAgIG5hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19uYW1lKCk7CiAgIH0KKyAgbmFtZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiAKIC8vIG9wdGlvbmFsIGludDMyIG51bWJlciA9IDI7CkBAIC0zNzgyLDExICs1MzExLDEzIEBACiAgIGNsZWFyX2hhc19udW1iZXIoKTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6bnVtYmVyKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ubnVtYmVyKQogICByZXR1cm4gbnVtYmVyXzsKIH0KIGlubGluZSB2b2lkIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6c2V0X251bWJlcig6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CiAgIHNldF9oYXNfbnVtYmVyKCk7CiAgIG51bWJlcl8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm51bWJlcikKIH0KIAogLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zIG9wdGlvbnMgPSAzOwpAQCAtMzgwNCwxOSArNTMzNSwzNCBAQAogICBjbGVhcl9oYXNfb3B0aW9ucygpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyYgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpvcHRpb25zKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgcmV0dXJuIG9wdGlvbnNfICE9IE5VTEwgPyAqb3B0aW9uc18gOiAqZGVmYXVsdF9pbnN0YW5jZV8tPm9wdGlvbnNfOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX29wdGlvbnMoKSB7CiAgIHNldF9oYXNfb3B0aW9ucygpOwotICBpZiAob3B0aW9uc18gPT0gTlVMTCkgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zOworICBpZiAob3B0aW9uc18gPT0gTlVMTCkgeworICAgIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCiAgIHJldHVybiBvcHRpb25zXzsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkVudW1WYWx1ZU9wdGlvbnMqIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCiAgIGNsZWFyX2hhc19vcHRpb25zKCk7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RW51bVZhbHVlT3B0aW9ucyogdGVtcCA9IG9wdGlvbnNfOwogICBvcHRpb25zXyA9IE5VTEw7CiAgIHJldHVybiB0ZW1wOwogfQoraW5saW5lIHZvaWQgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpFbnVtVmFsdWVPcHRpb25zKiBvcHRpb25zKSB7CisgIGRlbGV0ZSBvcHRpb25zXzsKKyAgb3B0aW9uc18gPSBvcHRpb25zOworICBpZiAob3B0aW9ucykgeworICAgIHNldF9oYXNfb3B0aW9ucygpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19vcHRpb25zKCk7CisgIH0KKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQorfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTM4MzMsNTEgKzUzNzksNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7CiB9CiBpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpjbGVhcl9uYW1lKCkgewotICBpZiAobmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfLT5jbGVhcigpOwotICB9CisgIG5hbWVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2xlYXJfaGFzX25hbWUoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gKm5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCisgIHJldHVybiBuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24odmFsdWUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfbmFtZShjb25zdCBjaGFyKiB2YWx1ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24odmFsdWUpOworICBuYW1lXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIGlubGluZSB2b2lkIFNlcnZpY2VEZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX25hbWUoKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIG5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX25hbWUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm5hbWUpCiAgIGNsZWFyX2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBuYW1lXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgU2VydmljZURlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfbmFtZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKLSAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOwogICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubmFtZSkKIH0KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8gbWV0aG9kID0gMjsKQEAgLTM4ODgsMjIgKzU0MzAsMjcgQEAKICAgbWV0aG9kXy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvJiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptZXRob2QoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQogICByZXR1cm4gbWV0aG9kXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kRGVzY3JpcHRvclByb3RvKiBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX21ldGhvZChpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQogICByZXR1cm4gbWV0aG9kXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byogU2VydmljZURlc2NyaXB0b3JQcm90bzo6YWRkX21ldGhvZCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5tZXRob2QpCiAgIHJldHVybiBtZXRob2RfLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2REZXNjcmlwdG9yUHJvdG8gPiYKLVNlcnZpY2VEZXNjcmlwdG9yUHJvdG86Om1ldGhvZCgpIGNvbnN0IHsKLSAgcmV0dXJuIG1ldGhvZF87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+KgogU2VydmljZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9tZXRob2QoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VEZXNjcmlwdG9yUHJvdG8ubWV0aG9kKQogICByZXR1cm4gJm1ldGhvZF87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZERlc2NyaXB0b3JQcm90byA+JgorU2VydmljZURlc2NyaXB0b3JQcm90bzo6bWV0aG9kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5tZXRob2QpCisgIHJldHVybiBtZXRob2RfOworfQogCiAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zIG9wdGlvbnMgPSAzOwogaW5saW5lIGJvb2wgU2VydmljZURlc2NyaXB0b3JQcm90bzo6aGFzX29wdGlvbnMoKSBjb25zdCB7CkBAIC0zOTIwLDE5ICs1NDY3LDM0IEBACiAgIGNsZWFyX2hhc19vcHRpb25zKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyYgU2VydmljZURlc2NyaXB0b3JQcm90bzo6b3B0aW9ucygpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQogICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogU2VydmljZURlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9vcHRpb25zKCkgewogICBzZXRfaGFzX29wdGlvbnMoKTsKLSAgaWYgKG9wdGlvbnNfID09IE5VTEwpIG9wdGlvbnNfID0gbmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U2VydmljZU9wdGlvbnM7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7CisgICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9uczsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQogICByZXR1cm4gb3B0aW9uc187CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogU2VydmljZURlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9vcHRpb25zKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuU2VydmljZURlc2NyaXB0b3JQcm90by5vcHRpb25zKQogICBjbGVhcl9oYXNfb3B0aW9ucygpOwogICA6Omdvb2dsZTo6cHJvdG9idWY6OlNlcnZpY2VPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187CiAgIG9wdGlvbnNfID0gTlVMTDsKICAgcmV0dXJuIHRlbXA7CiB9CitpbmxpbmUgdm9pZCBTZXJ2aWNlRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX29wdGlvbnMoOjpnb29nbGU6OnByb3RvYnVmOjpTZXJ2aWNlT3B0aW9ucyogb3B0aW9ucykgeworICBkZWxldGUgb3B0aW9uc187CisgIG9wdGlvbnNfID0gb3B0aW9uczsKKyAgaWYgKG9wdGlvbnMpIHsKKyAgICBzZXRfaGFzX29wdGlvbnMoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb3B0aW9ucygpOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIApAQCAtMzk0OSw1MSArNTUxMSw0NyBAQAogICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKIH0KIGlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfbmFtZSgpIHsKLSAgaWYgKG5hbWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXy0+Y2xlYXIoKTsKLSAgfQorICBuYW1lXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc19uYW1lKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpuYW1lKCkgY29uc3QgewotICByZXR1cm4gKm5hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ubmFtZSkKKyAgcmV0dXJuIG5hbWVfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X25hbWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc19uYW1lKCk7Ci0gIGlmIChuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lXy0+YXNzaWduKHZhbHVlKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV8tPmFzc2lnbih2YWx1ZSk7CisgIG5hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm5hbWUpCiB9CiBpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9uYW1lKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6bXV0YWJsZV9uYW1lKCkgewogICBzZXRfaGFzX25hbWUoKTsKLSAgaWYgKG5hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBuYW1lXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQorICByZXR1cm4gbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2VfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQogICBjbGVhcl9oYXNfbmFtZSgpOwotICBpZiAobmFtZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2FsbG9jYXRlZF9uYW1lKDo6c3RkOjpzdHJpbmcqIG5hbWUpIHsKKyAgaWYgKG5hbWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfbmFtZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lXzsKLSAgICBuYW1lXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfbmFtZSgpOwogICB9CisgIG5hbWVfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBuYW1lKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5uYW1lKQogfQogCiAvLyBvcHRpb25hbCBzdHJpbmcgaW5wdXRfdHlwZSA9IDI7CkBAIC00MDA3LDUxICs1NTY1LDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwogfQogaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9pbnB1dF90eXBlKCkgewotICBpZiAoaW5wdXRfdHlwZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGlucHV0X3R5cGVfLT5jbGVhcigpOwotICB9CisgIGlucHV0X3R5cGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2xlYXJfaGFzX2lucHV0X3R5cGUoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBNZXRob2REZXNjcmlwdG9yUHJvdG86OmlucHV0X3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAqaW5wdXRfdHlwZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5pbnB1dF90eXBlKQorICByZXR1cm4gaW5wdXRfdHlwZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfaW5wdXRfdHlwZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX2lucHV0X3R5cGUoKTsKLSAgaWYgKGlucHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBpbnB1dF90eXBlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGlucHV0X3R5cGVfLT5hc3NpZ24odmFsdWUpOworICBpbnB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKIH0KIGlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19pbnB1dF90eXBlKCk7Ci0gIGlmIChpbnB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgaW5wdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBpbnB1dF90eXBlXy0+YXNzaWduKHZhbHVlKTsKKyAgaW5wdXRfdHlwZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uaW5wdXRfdHlwZSkKIH0KIGlubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2lucHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfaW5wdXRfdHlwZSgpOwotICBpZiAoaW5wdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGlucHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgaW5wdXRfdHlwZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICBpbnB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX2lucHV0X3R5cGUoKSB7CiAgIHNldF9oYXNfaW5wdXRfdHlwZSgpOwotICBpZiAoaW5wdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGlucHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIGlucHV0X3R5cGVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCisgIHJldHVybiBpbnB1dF90eXBlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6cmVsZWFzZV9pbnB1dF90eXBlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCiAgIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7Ci0gIGlmIChpbnB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBpbnB1dF90eXBlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX2lucHV0X3R5cGUoOjpzdGQ6OnN0cmluZyogaW5wdXRfdHlwZSkgeworICBpZiAoaW5wdXRfdHlwZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19pbnB1dF90eXBlKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGlucHV0X3R5cGVfOwotICAgIGlucHV0X3R5cGVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19pbnB1dF90eXBlKCk7CiAgIH0KKyAgaW5wdXRfdHlwZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGlucHV0X3R5cGUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLmlucHV0X3R5cGUpCiB9CiAKIC8vIG9wdGlvbmFsIHN0cmluZyBvdXRwdXRfdHlwZSA9IDM7CkBAIC00MDY1LDUxICs1NjE5LDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OwogfQogaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9vdXRwdXRfdHlwZSgpIHsKLSAgaWYgKG91dHB1dF90eXBlXyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgb3V0cHV0X3R5cGVfLT5jbGVhcigpOwotICB9CisgIG91dHB1dF90eXBlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOwogfQogaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6b3V0cHV0X3R5cGUoKSBjb25zdCB7Ci0gIHJldHVybiAqb3V0cHV0X3R5cGVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCisgIHJldHVybiBvdXRwdXRfdHlwZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfb3V0cHV0X3R5cGUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOwotICBpZiAob3V0cHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBvdXRwdXRfdHlwZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBvdXRwdXRfdHlwZV8tPmFzc2lnbih2YWx1ZSk7CisgIG91dHB1dF90eXBlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCiB9CiBpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9vdXRwdXRfdHlwZShjb25zdCBjaGFyKiB2YWx1ZSkgewogICBzZXRfaGFzX291dHB1dF90eXBlKCk7Ci0gIGlmIChvdXRwdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG91dHB1dF90eXBlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG91dHB1dF90eXBlXy0+YXNzaWduKHZhbHVlKTsKKyAgb3V0cHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQogfQogaW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfb3V0cHV0X3R5cGUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfb3V0cHV0X3R5cGUoKTsKLSAgaWYgKG91dHB1dF90eXBlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgb3V0cHV0X3R5cGVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgb3V0cHV0X3R5cGVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgb3V0cHV0X3R5cGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjptdXRhYmxlX291dHB1dF90eXBlKCkgewogICBzZXRfaGFzX291dHB1dF90eXBlKCk7Ci0gIGlmIChvdXRwdXRfdHlwZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG91dHB1dF90eXBlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBvdXRwdXRfdHlwZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCisgIHJldHVybiBvdXRwdXRfdHlwZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBNZXRob2REZXNjcmlwdG9yUHJvdG86OnJlbGVhc2Vfb3V0cHV0X3R5cGUoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3V0cHV0X3R5cGUpCiAgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOwotICBpZiAob3V0cHV0X3R5cGVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIG91dHB1dF90eXBlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfYWxsb2NhdGVkX291dHB1dF90eXBlKDo6c3RkOjpzdHJpbmcqIG91dHB1dF90eXBlKSB7CisgIGlmIChvdXRwdXRfdHlwZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19vdXRwdXRfdHlwZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBvdXRwdXRfdHlwZV87Ci0gICAgb3V0cHV0X3R5cGVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19vdXRwdXRfdHlwZSgpOwogICB9CisgIG91dHB1dF90eXBlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgb3V0cHV0X3R5cGUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm91dHB1dF90eXBlKQogfQogCiAvLyBvcHRpb25hbCAuZ29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMgb3B0aW9ucyA9IDQ7CkBAIC00MTI3LDE5ICs1Njc3LDgyIEBACiAgIGNsZWFyX2hhc19vcHRpb25zKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zJiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om9wdGlvbnMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5vcHRpb25zKQogICByZXR1cm4gb3B0aW9uc18gIT0gTlVMTCA/ICpvcHRpb25zXyA6ICpkZWZhdWx0X2luc3RhbmNlXy0+b3B0aW9uc187CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiBNZXRob2REZXNjcmlwdG9yUHJvdG86Om11dGFibGVfb3B0aW9ucygpIHsKICAgc2V0X2hhc19vcHRpb25zKCk7Ci0gIGlmIChvcHRpb25zXyA9PSBOVUxMKSBvcHRpb25zXyA9IG5ldyA6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnM7CisgIGlmIChvcHRpb25zXyA9PSBOVUxMKSB7CisgICAgb3B0aW9uc18gPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zOworICB9CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgcmV0dXJuIG9wdGlvbnNfOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWV0aG9kT3B0aW9ucyogTWV0aG9kRGVzY3JpcHRvclByb3RvOjpyZWxlYXNlX29wdGlvbnMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8ub3B0aW9ucykKICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKICAgOjpnb29nbGU6OnByb3RvYnVmOjpNZXRob2RPcHRpb25zKiB0ZW1wID0gb3B0aW9uc187CiAgIG9wdGlvbnNfID0gTlVMTDsKICAgcmV0dXJuIHRlbXA7CiB9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9hbGxvY2F0ZWRfb3B0aW9ucyg6Omdvb2dsZTo6cHJvdG9idWY6Ok1ldGhvZE9wdGlvbnMqIG9wdGlvbnMpIHsKKyAgZGVsZXRlIG9wdGlvbnNfOworICBvcHRpb25zXyA9IG9wdGlvbnM7CisgIGlmIChvcHRpb25zKSB7CisgICAgc2V0X2hhc19vcHRpb25zKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX29wdGlvbnMoKTsKKyAgfQorICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuTWV0aG9kRGVzY3JpcHRvclByb3RvLm9wdGlvbnMpCit9CisKKy8vIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86Omhhc19jbGllbnRfc3RyZWFtaW5nKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6c2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9oYXNfY2xpZW50X3N0cmVhbWluZygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsZWFyX2NsaWVudF9zdHJlYW1pbmcoKSB7CisgIGNsaWVudF9zdHJlYW1pbmdfID0gZmFsc2U7CisgIGNsZWFyX2hhc19jbGllbnRfc3RyZWFtaW5nKCk7Cit9CitpbmxpbmUgYm9vbCBNZXRob2REZXNjcmlwdG9yUHJvdG86OmNsaWVudF9zdHJlYW1pbmcoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5jbGllbnRfc3RyZWFtaW5nKQorICByZXR1cm4gY2xpZW50X3N0cmVhbWluZ187Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9jbGllbnRfc3RyZWFtaW5nKGJvb2wgdmFsdWUpIHsKKyAgc2V0X2hhc19jbGllbnRfc3RyZWFtaW5nKCk7CisgIGNsaWVudF9zdHJlYW1pbmdfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZERlc2NyaXB0b3JQcm90by5jbGllbnRfc3RyZWFtaW5nKQorfQorCisvLyBvcHRpb25hbCBib29sIHNlcnZlcl9zdHJlYW1pbmcgPSA2IFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpoYXNfc2VydmVyX3N0cmVhbWluZygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXRob2REZXNjcmlwdG9yUHJvdG86OnNldF9oYXNfc2VydmVyX3N0cmVhbWluZygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKK30KK2lubGluZSB2b2lkIE1ldGhvZERlc2NyaXB0b3JQcm90bzo6Y2xlYXJfaGFzX3NlcnZlcl9zdHJlYW1pbmcoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpjbGVhcl9zZXJ2ZXJfc3RyZWFtaW5nKCkgeworICBzZXJ2ZXJfc3RyZWFtaW5nXyA9IGZhbHNlOworICBjbGVhcl9oYXNfc2VydmVyX3N0cmVhbWluZygpOworfQoraW5saW5lIGJvb2wgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXJ2ZXJfc3RyZWFtaW5nKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uc2VydmVyX3N0cmVhbWluZykKKyAgcmV0dXJuIHNlcnZlcl9zdHJlYW1pbmdfOworfQoraW5saW5lIHZvaWQgTWV0aG9kRGVzY3JpcHRvclByb3RvOjpzZXRfc2VydmVyX3N0cmVhbWluZyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfc2VydmVyX3N0cmVhbWluZygpOworICBzZXJ2ZXJfc3RyZWFtaW5nXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2REZXNjcmlwdG9yUHJvdG8uc2VydmVyX3N0cmVhbWluZykKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00MTU2LDUxICs1NzY5LDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwogfQogaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfcGFja2FnZSgpIHsKLSAgaWYgKGphdmFfcGFja2FnZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGphdmFfcGFja2FnZV8tPmNsZWFyKCk7Ci0gIH0KKyAgamF2YV9wYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc19qYXZhX3BhY2thZ2UoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6amF2YV9wYWNrYWdlKCkgY29uc3QgewotICByZXR1cm4gKmphdmFfcGFja2FnZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKKyAgcmV0dXJuIGphdmFfcGFja2FnZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc19qYXZhX3BhY2thZ2UoKTsKLSAgaWYgKGphdmFfcGFja2FnZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGphdmFfcGFja2FnZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBqYXZhX3BhY2thZ2VfLT5hc3NpZ24odmFsdWUpOworICBqYXZhX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7Ci0gIGlmIChqYXZhX3BhY2thZ2VfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBqYXZhX3BhY2thZ2VfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgamF2YV9wYWNrYWdlXy0+YXNzaWduKHZhbHVlKTsKKyAgamF2YV9wYWNrYWdlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9wYWNrYWdlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX2phdmFfcGFja2FnZSgpOwotICBpZiAoamF2YV9wYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgamF2YV9wYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGphdmFfcGFja2FnZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICBqYXZhX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3BhY2thZ2UpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfamF2YV9wYWNrYWdlKCkgewogICBzZXRfaGFzX2phdmFfcGFja2FnZSgpOwotICBpZiAoamF2YV9wYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgamF2YV9wYWNrYWdlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBqYXZhX3BhY2thZ2VfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9wYWNrYWdlKQorICByZXR1cm4gamF2YV9wYWNrYWdlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX2phdmFfcGFja2FnZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKICAgY2xlYXJfaGFzX2phdmFfcGFja2FnZSgpOwotICBpZiAoamF2YV9wYWNrYWdlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBqYXZhX3BhY2thZ2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9qYXZhX3BhY2thZ2UoOjpzdGQ6OnN0cmluZyogamF2YV9wYWNrYWdlKSB7CisgIGlmIChqYXZhX3BhY2thZ2UgIT0gTlVMTCkgeworICAgIHNldF9oYXNfamF2YV9wYWNrYWdlKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGphdmFfcGFja2FnZV87Ci0gICAgamF2YV9wYWNrYWdlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfamF2YV9wYWNrYWdlKCk7CiAgIH0KKyAgamF2YV9wYWNrYWdlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgamF2YV9wYWNrYWdlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfcGFja2FnZSkKIH0KIAogLy8gb3B0aW9uYWwgc3RyaW5nIGphdmFfb3V0ZXJfY2xhc3NuYW1lID0gODsKQEAgLTQyMTQsNTEgKzU4MjMsNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9vdXRlcl9jbGFzc25hbWUoKSB7Ci0gIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZV8gIT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy0+Y2xlYXIoKTsKLSAgfQorICBqYXZhX291dGVyX2NsYXNzbmFtZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKIH0KIGlubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6amF2YV9vdXRlcl9jbGFzc25hbWUoKSBjb25zdCB7Ci0gIHJldHVybiAqamF2YV9vdXRlcl9jbGFzc25hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKKyAgcmV0dXJuIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLT5hc3NpZ24odmFsdWUpOworICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfb3V0ZXJfY2xhc3NuYW1lKGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLT5hc3NpZ24odmFsdWUpOworICBqYXZhX291dGVyX2NsYXNzbmFtZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9vdXRlcl9jbGFzc25hbWUoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CiAgIHNldF9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgamF2YV9vdXRlcl9jbGFzc25hbWVfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgamF2YV9vdXRlcl9jbGFzc25hbWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX291dGVyX2NsYXNzbmFtZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6bXV0YWJsZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKICAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwotICBpZiAoamF2YV9vdXRlcl9jbGFzc25hbWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBqYXZhX291dGVyX2NsYXNzbmFtZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gamF2YV9vdXRlcl9jbGFzc25hbWVfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCisgIHJldHVybiBqYXZhX291dGVyX2NsYXNzbmFtZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9qYXZhX291dGVyX2NsYXNzbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfb3V0ZXJfY2xhc3NuYW1lKQogICBjbGVhcl9oYXNfamF2YV9vdXRlcl9jbGFzc25hbWUoKTsKLSAgaWYgKGphdmFfb3V0ZXJfY2xhc3NuYW1lXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7CisgIHJldHVybiBqYXZhX291dGVyX2NsYXNzbmFtZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfYWxsb2NhdGVkX2phdmFfb3V0ZXJfY2xhc3NuYW1lKDo6c3RkOjpzdHJpbmcqIGphdmFfb3V0ZXJfY2xhc3NuYW1lKSB7CisgIGlmIChqYXZhX291dGVyX2NsYXNzbmFtZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBqYXZhX291dGVyX2NsYXNzbmFtZV87Ci0gICAgamF2YV9vdXRlcl9jbGFzc25hbWVfID0gY29uc3RfY2FzdDwgOjpzdGQ6OnN0cmluZyo+KCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpOwotICAgIHJldHVybiB0ZW1wOworICAgIGNsZWFyX2hhc19qYXZhX291dGVyX2NsYXNzbmFtZSgpOwogICB9CisgIGphdmFfb3V0ZXJfY2xhc3NuYW1lXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgamF2YV9vdXRlcl9jbGFzc25hbWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9vdXRlcl9jbGFzc25hbWUpCiB9CiAKIC8vIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOwpAQCAtNDI3Niw1NSArNTg4MSw2MSBAQAogICBjbGVhcl9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOwogfQogaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfbXVsdGlwbGVfZmlsZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfbXVsdGlwbGVfZmlsZXMpCiAgIHJldHVybiBqYXZhX211bHRpcGxlX2ZpbGVzXzsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9tdWx0aXBsZV9maWxlcyhib29sIHZhbHVlKSB7CiAgIHNldF9oYXNfamF2YV9tdWx0aXBsZV9maWxlcygpOwogICBqYXZhX211bHRpcGxlX2ZpbGVzXyA9IHZhbHVlOwotfQotCi0vLyBvcHRpb25hbCBib29sIHJldGFpbl91bmtub3duX2ZpZWxkcyA9IDExIFtkZWZhdWx0ID0gZmFsc2VdOwotaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19yZXRhaW5fdW5rbm93bl9maWVsZHMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDh1KSAhPSAwOwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19yZXRhaW5fdW5rbm93bl9maWVsZHMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OwotfQotaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX3JldGFpbl91bmtub3duX2ZpZWxkcygpIHsKLSAgcmV0YWluX3Vua25vd25fZmllbGRzXyA9IGZhbHNlOwotICBjbGVhcl9oYXNfcmV0YWluX3Vua25vd25fZmllbGRzKCk7Ci19Ci1pbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6cmV0YWluX3Vua25vd25fZmllbGRzKCkgY29uc3QgewotICByZXR1cm4gcmV0YWluX3Vua25vd25fZmllbGRzXzsKLX0KLWlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfcmV0YWluX3Vua25vd25fZmllbGRzKGJvb2wgdmFsdWUpIHsKLSAgc2V0X2hhc19yZXRhaW5fdW5rbm93bl9maWVsZHMoKTsKLSAgcmV0YWluX3Vua25vd25fZmllbGRzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX211bHRpcGxlX2ZpbGVzKQogfQogCiAvLyBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQgPSBmYWxzZV07CiBpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIHsKLSAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpIHsKICAgamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2hfID0gZmFsc2U7CiAgIGNsZWFyX2hhc19qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCgpOwogfQogaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCkKICAgcmV0dXJuIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXzsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfamF2YV9nZW5lcmF0ZV9lcXVhbHNfYW5kX2hhc2goYm9vbCB2YWx1ZSkgewogICBzZXRfaGFzX2phdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoKCk7CiAgIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX2dlbmVyYXRlX2VxdWFsc19hbmRfaGFzaCkKK30KKworLy8gb3B0aW9uYWwgYm9vbCBqYXZhX3N0cmluZ19jaGVja191dGY4ID0gMjcgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMTB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDEwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9oYXNfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAxMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfamF2YV9zdHJpbmdfY2hlY2tfdXRmOCgpIHsKKyAgamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKTsKK30KK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpqYXZhX3N0cmluZ19jaGVja191dGY4KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX3N0cmluZ19jaGVja191dGY4KQorICByZXR1cm4gamF2YV9zdHJpbmdfY2hlY2tfdXRmOF87Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2phdmFfc3RyaW5nX2NoZWNrX3V0ZjgoKTsKKyAgamF2YV9zdHJpbmdfY2hlY2tfdXRmOF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuamF2YV9zdHJpbmdfY2hlY2tfdXRmOCkKIH0KIAogLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5PcHRpbWl6ZU1vZGUgb3B0aW1pemVfZm9yID0gOSBbZGVmYXVsdCA9IFNQRUVEXTsKQEAgLTQzNDIsNzggKzU5NTMsMjk2IEBACiAgIGNsZWFyX2hhc19vcHRpbWl6ZV9mb3IoKTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZSBGaWxlT3B0aW9uczo6b3B0aW1pemVfZm9yKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vcHRpbWl6ZV9mb3IpCiAgIHJldHVybiBzdGF0aWNfY2FzdDwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGUgPihvcHRpbWl6ZV9mb3JfKTsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfb3B0aW1pemVfZm9yKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmlsZU9wdGlvbnNfT3B0aW1pemVNb2RlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSkpOworICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfSXNWYWxpZCh2YWx1ZSkpOwogICBzZXRfaGFzX29wdGltaXplX2ZvcigpOwogICBvcHRpbWl6ZV9mb3JfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9wdGltaXplX2ZvcikKK30KKworLy8gb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfZ29fcGFja2FnZSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA0MHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19nb19wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwNDB1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19nb19wYWNrYWdlKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9nb19wYWNrYWdlKCkgeworICBnb19wYWNrYWdlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CisgIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6OmdvX3BhY2thZ2UoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCisgIHJldHVybiBnb19wYWNrYWdlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2dvX3BhY2thZ2UoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc19nb19wYWNrYWdlKCk7CisgIGdvX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2dvX3BhY2thZ2UoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19nb19wYWNrYWdlKCk7CisgIGdvX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZ29fcGFja2FnZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19nb19wYWNrYWdlKCk7CisgIGdvX3BhY2thZ2VfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5nb19wYWNrYWdlKQorfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX2dvX3BhY2thZ2UoKSB7CisgIHNldF9oYXNfZ29fcGFja2FnZSgpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuZ29fcGFja2FnZSkKKyAgcmV0dXJuIGdvX3BhY2thZ2VfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6OnJlbGVhc2VfZ29fcGFja2FnZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCisgIGNsZWFyX2hhc19nb19wYWNrYWdlKCk7CisgIHJldHVybiBnb19wYWNrYWdlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9hbGxvY2F0ZWRfZ29fcGFja2FnZSg6OnN0ZDo6c3RyaW5nKiBnb19wYWNrYWdlKSB7CisgIGlmIChnb19wYWNrYWdlICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2dvX3BhY2thZ2UoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfZ29fcGFja2FnZSgpOworICB9CisgIGdvX3BhY2thZ2VfLlNldEFsbG9jYXRlZE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCBnb19wYWNrYWdlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmdvX3BhY2thZ2UpCiB9CiAKIC8vIG9wdGlvbmFsIGJvb2wgY2NfZ2VuZXJpY19zZXJ2aWNlcyA9IDE2IFtkZWZhdWx0ID0gZmFsc2VdOwogaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19jY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDQwdSkgIT0gMDsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDA4MHUpICE9IDA7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19jY19nZW5lcmljX3NlcnZpY2VzKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwNDB1OworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwODB1OwogfQogaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19jY19nZW5lcmljX3NlcnZpY2VzKCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDQwdTsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfY2NfZ2VuZXJpY19zZXJ2aWNlcygpIHsKICAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSBmYWxzZTsKICAgY2xlYXJfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKIH0KIGlubGluZSBib29sIEZpbGVPcHRpb25zOjpjY19nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19nZW5lcmljX3NlcnZpY2VzKQogICByZXR1cm4gY2NfZ2VuZXJpY19zZXJ2aWNlc187CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2NjX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgewogICBzZXRfaGFzX2NjX2dlbmVyaWNfc2VydmljZXMoKTsKICAgY2NfZ2VuZXJpY19zZXJ2aWNlc18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY2NfZ2VuZXJpY19zZXJ2aWNlcykKIH0KIAogLy8gb3B0aW9uYWwgYm9vbCBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSAxNyBbZGVmYXVsdCA9IGZhbHNlXTsKIGlubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDgwdSkgIT0gMDsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDEwMHUpICE9IDA7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19qYXZhX2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDA4MHU7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA4MHU7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAxMDB1OwogfQogaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpIHsKICAgamF2YV9nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOwogICBjbGVhcl9oYXNfamF2YV9nZW5lcmljX3NlcnZpY2VzKCk7CiB9CiBpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6amF2YV9nZW5lcmljX3NlcnZpY2VzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5qYXZhX2dlbmVyaWNfc2VydmljZXMpCiAgIHJldHVybiBqYXZhX2dlbmVyaWNfc2VydmljZXNfOwogfQogaW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9qYXZhX2dlbmVyaWNfc2VydmljZXMoYm9vbCB2YWx1ZSkgewogICBzZXRfaGFzX2phdmFfZ2VuZXJpY19zZXJ2aWNlcygpOwogICBqYXZhX2dlbmVyaWNfc2VydmljZXNfID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmphdmFfZ2VuZXJpY19zZXJ2aWNlcykKIH0KIAogLy8gb3B0aW9uYWwgYm9vbCBweV9nZW5lcmljX3NlcnZpY2VzID0gMTggW2RlZmF1bHQgPSBmYWxzZV07CiBpbmxpbmUgYm9vbCBGaWxlT3B0aW9uczo6aGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAxMDB1KSAhPSAwOworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMjAwdSkgIT0gMDsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDEwMHU7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDIwMHU7CiB9CiBpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX3B5X2dlbmVyaWNfc2VydmljZXMoKSB7Ci0gIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAxMDB1OworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMjAwdTsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9weV9nZW5lcmljX3NlcnZpY2VzKCkgewogICBweV9nZW5lcmljX3NlcnZpY2VzXyA9IGZhbHNlOwogICBjbGVhcl9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOwogfQogaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OnB5X2dlbmVyaWNfc2VydmljZXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLnB5X2dlbmVyaWNfc2VydmljZXMpCiAgIHJldHVybiBweV9nZW5lcmljX3NlcnZpY2VzXzsKIH0KIGlubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfcHlfZ2VuZXJpY19zZXJ2aWNlcyhib29sIHZhbHVlKSB7CiAgIHNldF9oYXNfcHlfZ2VuZXJpY19zZXJ2aWNlcygpOwogICBweV9nZW5lcmljX3NlcnZpY2VzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5weV9nZW5lcmljX3NlcnZpY2VzKQorfQorCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAyMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDQwMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDA0MDB1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwNDAwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmRlcHJlY2F0ZWQpCisgIHJldHVybiBkZXByZWNhdGVkXzsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCisvLyBvcHRpb25hbCBib29sIGNjX2VuYWJsZV9hcmVuYXMgPSAzMSBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfY2NfZW5hYmxlX2FyZW5hcygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDgwMHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2hhc19jY19lbmFibGVfYXJlbmFzKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDA4MDB1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2hhc19jY19lbmFibGVfYXJlbmFzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwODAwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9jY19lbmFibGVfYXJlbmFzKCkgeworICBjY19lbmFibGVfYXJlbmFzXyA9IGZhbHNlOworICBjbGVhcl9oYXNfY2NfZW5hYmxlX2FyZW5hcygpOworfQoraW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6OmNjX2VuYWJsZV9hcmVuYXMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNjX2VuYWJsZV9hcmVuYXMpCisgIHJldHVybiBjY19lbmFibGVfYXJlbmFzXzsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY2NfZW5hYmxlX2FyZW5hcyhib29sIHZhbHVlKSB7CisgIHNldF9oYXNfY2NfZW5hYmxlX2FyZW5hcygpOworICBjY19lbmFibGVfYXJlbmFzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jY19lbmFibGVfYXJlbmFzKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgb2JqY19jbGFzc19wcmVmaXggPSAzNjsKK2lubGluZSBib29sIEZpbGVPcHRpb25zOjpoYXNfb2JqY19jbGFzc19wcmVmaXgoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDEwMDB1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMTAwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAxMDAwdTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpjbGVhcl9vYmpjX2NsYXNzX3ByZWZpeCgpIHsKKyAgb2JqY19jbGFzc19wcmVmaXhfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgRmlsZU9wdGlvbnM6Om9iamNfY2xhc3NfcHJlZml4KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCkKKyAgcmV0dXJuIG9iamNfY2xhc3NfcHJlZml4Xy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X29iamNfY2xhc3NfcHJlZml4KGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgb2JqY19jbGFzc19wcmVmaXhfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9vYmpjX2NsYXNzX3ByZWZpeChjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7CisgIG9iamNfY2xhc3NfcHJlZml4Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9vYmpjX2NsYXNzX3ByZWZpeChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgc2V0X2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOworICBvYmpjX2NsYXNzX3ByZWZpeF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjptdXRhYmxlX29iamNfY2xhc3NfcHJlZml4KCkgeworICBzZXRfaGFzX29iamNfY2xhc3NfcHJlZml4KCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5vYmpjX2NsYXNzX3ByZWZpeCkKKyAgcmV0dXJuIG9iamNfY2xhc3NfcHJlZml4Xy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIEZpbGVPcHRpb25zOjpyZWxlYXNlX29iamNfY2xhc3NfcHJlZml4KCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMub2JqY19jbGFzc19wcmVmaXgpCisgIGNsZWFyX2hhc19vYmpjX2NsYXNzX3ByZWZpeCgpOworICByZXR1cm4gb2JqY19jbGFzc19wcmVmaXhfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9vYmpjX2NsYXNzX3ByZWZpeCg6OnN0ZDo6c3RyaW5nKiBvYmpjX2NsYXNzX3ByZWZpeCkgeworICBpZiAob2JqY19jbGFzc19wcmVmaXggIT0gTlVMTCkgeworICAgIHNldF9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgfSBlbHNlIHsKKyAgICBjbGVhcl9oYXNfb2JqY19jbGFzc19wcmVmaXgoKTsKKyAgfQorICBvYmpjX2NsYXNzX3ByZWZpeF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG9iamNfY2xhc3NfcHJlZml4KTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLm9iamNfY2xhc3NfcHJlZml4KQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgY3NoYXJwX25hbWVzcGFjZSA9IDM3OworaW5saW5lIGJvb2wgRmlsZU9wdGlvbnM6Omhhc19jc2hhcnBfbmFtZXNwYWNlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAyMDAwdSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMjAwMHU7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6Y2xlYXJfaGFzX2NzaGFycF9uYW1lc3BhY2UoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDIwMDB1OworfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OmNsZWFyX2NzaGFycF9uYW1lc3BhY2UoKSB7CisgIGNzaGFycF9uYW1lc3BhY2VfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBGaWxlT3B0aW9uczo6Y3NoYXJwX25hbWVzcGFjZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKKyAgcmV0dXJuIGNzaGFycF9uYW1lc3BhY2VfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY3NoYXJwX25hbWVzcGFjZShjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgeworICBzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgY3NoYXJwX25hbWVzcGFjZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKK30KK2lubGluZSB2b2lkIEZpbGVPcHRpb25zOjpzZXRfY3NoYXJwX25hbWVzcGFjZShjb25zdCBjaGFyKiB2YWx1ZSkgeworICBzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgY3NoYXJwX25hbWVzcGFjZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQorfQoraW5saW5lIHZvaWQgRmlsZU9wdGlvbnM6OnNldF9jc2hhcnBfbmFtZXNwYWNlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgY3NoYXJwX25hbWVzcGFjZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksCisgICAgICA6OnN0ZDo6c3RyaW5nKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zLmNzaGFycF9uYW1lc3BhY2UpCit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogRmlsZU9wdGlvbnM6Om11dGFibGVfY3NoYXJwX25hbWVzcGFjZSgpIHsKKyAgc2V0X2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy5jc2hhcnBfbmFtZXNwYWNlKQorICByZXR1cm4gY3NoYXJwX25hbWVzcGFjZV8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBGaWxlT3B0aW9uczo6cmVsZWFzZV9jc2hhcnBfbmFtZXNwYWNlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKKyAgY2xlYXJfaGFzX2NzaGFycF9uYW1lc3BhY2UoKTsKKyAgcmV0dXJuIGNzaGFycF9uYW1lc3BhY2VfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBGaWxlT3B0aW9uczo6c2V0X2FsbG9jYXRlZF9jc2hhcnBfbmFtZXNwYWNlKDo6c3RkOjpzdHJpbmcqIGNzaGFycF9uYW1lc3BhY2UpIHsKKyAgaWYgKGNzaGFycF9uYW1lc3BhY2UgIT0gTlVMTCkgeworICAgIHNldF9oYXNfY3NoYXJwX25hbWVzcGFjZSgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19jc2hhcnBfbmFtZXNwYWNlKCk7CisgIH0KKyAgY3NoYXJwX25hbWVzcGFjZV8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIGNzaGFycF9uYW1lc3BhY2UpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMuY3NoYXJwX25hbWVzcGFjZSkKIH0KIAogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwpAQCAtNDQyNCwyMiArNjI1MywyNyBAQAogICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEZpbGVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpbGVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBGaWxlT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotRmlsZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgewotICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOwotfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4qCiBGaWxlT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOwogfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitGaWxlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00NDYwLDExICs2Mjk0LDEzIEBACiAgIGNsZWFyX2hhc19tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpOwogfQogaW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6Om1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKICAgcmV0dXJuIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XzsKIH0KIGlubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoYm9vbCB2YWx1ZSkgewogICBzZXRfaGFzX21lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCk7CiAgIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCkKIH0KIAogLy8gb3B0aW9uYWwgYm9vbCBub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yID0gMiBbZGVmYXVsdCA9IGZhbHNlXTsKQEAgLTQ0ODIsMTEgKzYzMTgsNjEgQEAKICAgY2xlYXJfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKIH0KIGlubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5ub19zdGFuZGFyZF9kZXNjcmlwdG9yX2FjY2Vzc29yKQogICByZXR1cm4gbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl87CiB9CiBpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoYm9vbCB2YWx1ZSkgewogICBzZXRfaGFzX25vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IoKTsKICAgbm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3Nvcl8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubm9fc3RhbmRhcmRfZGVzY3JpcHRvcl9hY2Nlc3NvcikKK30KKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwNHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgTWVzc2FnZU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIGJvb2wgTWVzc2FnZU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLmRlcHJlY2F0ZWQpCisgIHJldHVybiBkZXByZWNhdGVkXzsKK30KK2lubGluZSB2b2lkIE1lc3NhZ2VPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCisvLyBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CitpbmxpbmUgYm9vbCBNZXNzYWdlT3B0aW9uczo6aGFzX21hcF9lbnRyeSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X2hhc19tYXBfZW50cnkoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfaGFzX21hcF9lbnRyeSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwOHU7Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6Y2xlYXJfbWFwX2VudHJ5KCkgeworICBtYXBfZW50cnlfID0gZmFsc2U7CisgIGNsZWFyX2hhc19tYXBfZW50cnkoKTsKK30KK2lubGluZSBib29sIE1lc3NhZ2VPcHRpb25zOjptYXBfZW50cnkoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLm1hcF9lbnRyeSkKKyAgcmV0dXJuIG1hcF9lbnRyeV87Cit9CitpbmxpbmUgdm9pZCBNZXNzYWdlT3B0aW9uczo6c2V0X21hcF9lbnRyeShib29sIHZhbHVlKSB7CisgIHNldF9oYXNfbWFwX2VudHJ5KCk7CisgIG1hcF9lbnRyeV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuTWVzc2FnZU9wdGlvbnMubWFwX2VudHJ5KQogfQogCiAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CkBAIC00NDk3LDIyICs2MzgzLDI3IEBACiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgTWVzc2FnZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWVzc2FnZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1lc3NhZ2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1NZXNzYWdlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKIE1lc3NhZ2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5NZXNzYWdlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK01lc3NhZ2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTQ1MzMsMTIgKzY0MjQsMTQgQEAKICAgY2xlYXJfaGFzX2N0eXBlKCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGUgRmllbGRPcHRpb25zOjpjdHlwZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLmN0eXBlKQogICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlID4oY3R5cGVfKTsKIH0KIGlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2N0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZCh2YWx1ZSkpOworICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfQ1R5cGVfSXNWYWxpZCh2YWx1ZSkpOwogICBzZXRfaGFzX2N0eXBlKCk7CiAgIGN0eXBlXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuY3R5cGUpCiB9CiAKIC8vIG9wdGlvbmFsIGJvb2wgcGFja2VkID0gMjsKQEAgLTQ1NTYsOTEgKzY0NDksMTEwIEBACiAgIGNsZWFyX2hhc19wYWNrZWQoKTsKIH0KIGlubGluZSBib29sIEZpZWxkT3B0aW9uczo6cGFja2VkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMucGFja2VkKQogICByZXR1cm4gcGFja2VkXzsKIH0KIGlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X3BhY2tlZChib29sIHZhbHVlKSB7CiAgIHNldF9oYXNfcGFja2VkKCk7CiAgIHBhY2tlZF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnBhY2tlZCkKK30KKworLy8gb3B0aW9uYWwgLmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuSlNUeXBlIGpzdHlwZSA9IDYgW2RlZmF1bHQgPSBKU19OT1JNQUxdOworaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfanN0eXBlKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19qc3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OmNsZWFyX2hhc19qc3R5cGUoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9qc3R5cGUoKSB7CisgIGpzdHlwZV8gPSAwOworICBjbGVhcl9oYXNfanN0eXBlKCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlIEZpZWxkT3B0aW9uczo6anN0eXBlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlKQorICByZXR1cm4gc3RhdGljX2Nhc3Q8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSA+KGpzdHlwZV8pOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfanN0eXBlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0pTVHlwZSB2YWx1ZSkgeworICBhc3NlcnQoOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlX0lzVmFsaWQodmFsdWUpKTsKKyAgc2V0X2hhc19qc3R5cGUoKTsKKyAganN0eXBlXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuanN0eXBlKQorfQorCisvLyBvcHRpb25hbCBib29sIGxhenkgPSA1IFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfbGF6eSgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfbGF6eSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2xhenkoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9sYXp5KCkgeworICBsYXp5XyA9IGZhbHNlOworICBjbGVhcl9oYXNfbGF6eSgpOworfQoraW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpsYXp5KCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKKyAgcmV0dXJuIGxhenlfOworfQoraW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfbGF6eShib29sIHZhbHVlKSB7CisgIHNldF9oYXNfbGF6eSgpOworICBsYXp5XyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMubGF6eSkKIH0KIAogLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKIGlubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7Ci0gIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDEwdSkgIT0gMDsKIH0KIGlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgewotICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDR1OworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMTB1OwogfQogaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKLSAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMTB1OwogfQogaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgewogICBkZXByZWNhdGVkXyA9IGZhbHNlOwogICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOwogfQogaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuZGVwcmVjYXRlZCkKICAgcmV0dXJuIGRlcHJlY2F0ZWRfOwogfQogaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CiAgIHNldF9oYXNfZGVwcmVjYXRlZCgpOwogICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMuZGVwcmVjYXRlZCkKIH0KIAotLy8gb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKLWlubGluZSBib29sIEZpZWxkT3B0aW9uczo6aGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgY29uc3QgewotICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA4dSkgIT0gMDsKKy8vIG9wdGlvbmFsIGJvb2wgd2VhayA9IDEwIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjpoYXNfd2VhaygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAyMHUpICE9IDA7CiB9Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKSB7Ci0gIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwOHU7CitpbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9oYXNfd2VhaygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDIwdTsKIH0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgewotICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDA4dTsKK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6Y2xlYXJfaGFzX3dlYWsoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMjB1OwogfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl9leHBlcmltZW50YWxfbWFwX2tleSgpIHsKLSAgaWYgKGV4cGVyaW1lbnRhbF9tYXBfa2V5XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgZXhwZXJpbWVudGFsX21hcF9rZXlfLT5jbGVhcigpOwotICB9Ci0gIGNsZWFyX2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOworaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpjbGVhcl93ZWFrKCkgeworICB3ZWFrXyA9IGZhbHNlOworICBjbGVhcl9oYXNfd2VhaygpOwogfQotaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEZpZWxkT3B0aW9uczo6ZXhwZXJpbWVudGFsX21hcF9rZXkoKSBjb25zdCB7Ci0gIHJldHVybiAqZXhwZXJpbWVudGFsX21hcF9rZXlfOworaW5saW5lIGJvb2wgRmllbGRPcHRpb25zOjp3ZWFrKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMud2VhaykKKyAgcmV0dXJuIHdlYWtfOwogfQotaW5saW5lIHZvaWQgRmllbGRPcHRpb25zOjpzZXRfZXhwZXJpbWVudGFsX21hcF9rZXkoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKLSAgc2V0X2hhc19leHBlcmltZW50YWxfbWFwX2tleSgpOwotICBpZiAoZXhwZXJpbWVudGFsX21hcF9rZXlfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBleHBlcmltZW50YWxfbWFwX2tleV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBleHBlcmltZW50YWxfbWFwX2tleV8tPmFzc2lnbih2YWx1ZSk7Ci19Ci1pbmxpbmUgdm9pZCBGaWVsZE9wdGlvbnM6OnNldF9leHBlcmltZW50YWxfbWFwX2tleShjb25zdCBjaGFyKiB2YWx1ZSkgewotICBzZXRfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7Ci0gIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGV4cGVyaW1lbnRhbF9tYXBfa2V5Xy0+YXNzaWduKHZhbHVlKTsKLX0KLWlubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X2V4cGVyaW1lbnRhbF9tYXBfa2V5KGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewotICBzZXRfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7Ci0gIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGV4cGVyaW1lbnRhbF9tYXBfa2V5Xy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGRPcHRpb25zOjptdXRhYmxlX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgewotICBzZXRfaGFzX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCk7Ci0gIGlmIChleHBlcmltZW50YWxfbWFwX2tleV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBleHBlcmltZW50YWxfbWFwX2tleV87Ci19Ci1pbmxpbmUgOjpzdGQ6OnN0cmluZyogRmllbGRPcHRpb25zOjpyZWxlYXNlX2V4cGVyaW1lbnRhbF9tYXBfa2V5KCkgewotICBjbGVhcl9oYXNfZXhwZXJpbWVudGFsX21hcF9rZXkoKTsKLSAgaWYgKGV4cGVyaW1lbnRhbF9tYXBfa2V5XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgcmV0dXJuIE5VTEw7Ci0gIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGV4cGVyaW1lbnRhbF9tYXBfa2V5XzsKLSAgICBleHBlcmltZW50YWxfbWFwX2tleV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gICAgcmV0dXJuIHRlbXA7Ci0gIH0KK2lubGluZSB2b2lkIEZpZWxkT3B0aW9uczo6c2V0X3dlYWsoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX3dlYWsoKTsKKyAgd2Vha18gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLndlYWspCiB9CiAKIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKQEAgLTQ2NTEsMjcgKzY1NjMsODAgQEAKICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBGaWVsZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEZpZWxkT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLUZpZWxkT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKIEZpZWxkT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorRmllbGRPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiAvLyBFbnVtT3B0aW9ucwogCisvLyBvcHRpb25hbCBib29sIGFsbG93X2FsaWFzID0gMjsKK2lubGluZSBib29sIEVudW1PcHRpb25zOjpoYXNfYWxsb3dfYWxpYXMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRW51bU9wdGlvbnM6OnNldF9oYXNfYWxsb3dfYWxpYXMoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6Y2xlYXJfaGFzX2FsbG93X2FsaWFzKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpjbGVhcl9hbGxvd19hbGlhcygpIHsKKyAgYWxsb3dfYWxpYXNfID0gZmFsc2U7CisgIGNsZWFyX2hhc19hbGxvd19hbGlhcygpOworfQoraW5saW5lIGJvb2wgRW51bU9wdGlvbnM6OmFsbG93X2FsaWFzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5hbGxvd19hbGlhcykKKyAgcmV0dXJuIGFsbG93X2FsaWFzXzsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpzZXRfYWxsb3dfYWxpYXMoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2FsbG93X2FsaWFzKCk7CisgIGFsbG93X2FsaWFzXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5hbGxvd19hbGlhcykKK30KKworLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdCA9IGZhbHNlXTsKK2lubGluZSBib29sIEVudW1PcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMnUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBFbnVtT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDJ1OworfQoraW5saW5lIHZvaWQgRW51bU9wdGlvbnM6OmNsZWFyX2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdICY9IH4weDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIGJvb2wgRW51bU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLmRlcHJlY2F0ZWQpCisgIHJldHVybiBkZXByZWNhdGVkXzsKK30KK2lubGluZSB2b2lkIEVudW1PcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCiAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiBpbmxpbmUgaW50IEVudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbl9zaXplKCkgY29uc3QgewogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLnNpemUoKTsKQEAgLTQ2ODAsMjcgKzY2NDUsNTYgQEAKICAgdW5pbnRlcnByZXRlZF9vcHRpb25fLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uJiBFbnVtT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbihpbnQgaW5kZXgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogRW51bU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKLUVudW1PcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgogRW51bU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1PcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gJnVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKIH0KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgorRW51bU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuRW51bU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gRW51bVZhbHVlT3B0aW9ucwogCisvLyBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAxIFtkZWZhdWx0ID0gZmFsc2VdOworaW5saW5lIGJvb2wgRW51bVZhbHVlT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6c2V0X2hhc19kZXByZWNhdGVkKCkgeworICBfaGFzX2JpdHNfWzBdIHw9IDB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6Y2xlYXJfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKK30KK2lubGluZSBib29sIEVudW1WYWx1ZU9wdGlvbnM6OmRlcHJlY2F0ZWQoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMuZGVwcmVjYXRlZCkKKyAgcmV0dXJuIGRlcHJlY2F0ZWRfOworfQoraW5saW5lIHZvaWQgRW51bVZhbHVlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy5kZXByZWNhdGVkKQorfQorCiAvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiBpbmxpbmUgaW50IEVudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uX3NpemUoKSBjb25zdCB7CiAgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uc2l6ZSgpOwpAQCAtNDcwOSwyNyArNjcwMyw1NiBAQAogICB1bmludGVycHJldGVkX29wdGlvbl8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24mIEVudW1WYWx1ZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5FbnVtVmFsdWVPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uKiBFbnVtVmFsdWVPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIEVudW1WYWx1ZU9wdGlvbnM6OmFkZF91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuRW51bVZhbHVlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+JgotRW51bVZhbHVlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKIEVudW1WYWx1ZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiAmdW5pbnRlcnByZXRlZF9vcHRpb25fOwogfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCitFbnVtVmFsdWVPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkVudW1WYWx1ZU9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCisgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogLy8gU2VydmljZU9wdGlvbnMKIAorLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBTZXJ2aWNlT3B0aW9uczo6aGFzX2RlcHJlY2F0ZWQoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDF1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU2VydmljZU9wdGlvbnM6OnNldF9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAxdTsKK30KK2lubGluZSB2b2lkIFNlcnZpY2VPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlT3B0aW9uczo6Y2xlYXJfZGVwcmVjYXRlZCgpIHsKKyAgZGVwcmVjYXRlZF8gPSBmYWxzZTsKKyAgY2xlYXJfaGFzX2RlcHJlY2F0ZWQoKTsKK30KK2lubGluZSBib29sIFNlcnZpY2VPcHRpb25zOjpkZXByZWNhdGVkKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gZGVwcmVjYXRlZF87Cit9CitpbmxpbmUgdm9pZCBTZXJ2aWNlT3B0aW9uczo6c2V0X2RlcHJlY2F0ZWQoYm9vbCB2YWx1ZSkgeworICBzZXRfaGFzX2RlcHJlY2F0ZWQoKTsKKyAgZGVwcmVjYXRlZF8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU2VydmljZU9wdGlvbnMuZGVwcmVjYXRlZCkKK30KKwogLy8gcmVwZWF0ZWQgLmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwogaW5saW5lIGludCBTZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7CkBAIC00NzM4LDI3ICs2NzYxLDU2IEBACiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgU2VydmljZU9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogU2VydmljZU9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIFNlcnZpY2VPcHRpb25zOjphZGRfdW5pbnRlcnByZXRlZF9vcHRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1TZXJ2aWNlT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oKSBjb25zdCB7Ci0gIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl87Ci19CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPioKIFNlcnZpY2VPcHRpb25zOjptdXRhYmxlX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5TZXJ2aWNlT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK1NlcnZpY2VPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLlNlcnZpY2VPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQorICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fOworfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIE1ldGhvZE9wdGlvbnMKIAorLy8gb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQgPSBmYWxzZV07CitpbmxpbmUgYm9vbCBNZXRob2RPcHRpb25zOjpoYXNfZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwMXUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpzZXRfaGFzX2RlcHJlY2F0ZWQoKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl9oYXNfZGVwcmVjYXRlZCgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMXU7Cit9CitpbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpjbGVhcl9kZXByZWNhdGVkKCkgeworICBkZXByZWNhdGVkXyA9IGZhbHNlOworICBjbGVhcl9oYXNfZGVwcmVjYXRlZCgpOworfQoraW5saW5lIGJvb2wgTWV0aG9kT3B0aW9uczo6ZGVwcmVjYXRlZCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy5kZXByZWNhdGVkKQorICByZXR1cm4gZGVwcmVjYXRlZF87Cit9CitpbmxpbmUgdm9pZCBNZXRob2RPcHRpb25zOjpzZXRfZGVwcmVjYXRlZChib29sIHZhbHVlKSB7CisgIHNldF9oYXNfZGVwcmVjYXRlZCgpOworICBkZXByZWNhdGVkXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLmRlcHJlY2F0ZWQpCit9CisKIC8vIHJlcGVhdGVkIC5nb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKIGlubGluZSBpbnQgTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb25fc2l6ZSgpIGNvbnN0IHsKICAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5zaXplKCk7CkBAIC00NzY3LDIyICs2ODE5LDI3IEBACiAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXy5DbGVhcigpOwogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiYgTWV0aG9kT3B0aW9uczo6dW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLk1ldGhvZE9wdGlvbnMudW5pbnRlcnByZXRlZF9vcHRpb24pCiAgIHJldHVybiB1bmludGVycHJldGVkX29wdGlvbl8uR2V0KGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24qIE1ldGhvZE9wdGlvbnM6Om11dGFibGVfdW5pbnRlcnByZXRlZF9vcHRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLk11dGFibGUoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiogTWV0aG9kT3B0aW9uczo6YWRkX3VuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5NZXRob2RPcHRpb25zLnVuaW50ZXJwcmV0ZWRfb3B0aW9uKQogICByZXR1cm4gdW5pbnRlcnByZXRlZF9vcHRpb25fLkFkZCgpOwogfQotaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uID4mCi1NZXRob2RPcHRpb25zOjp1bmludGVycHJldGVkX29wdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbiA+KgogTWV0aG9kT3B0aW9uczo6bXV0YWJsZV91bmludGVycHJldGVkX29wdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKICAgcmV0dXJuICZ1bmludGVycHJldGVkX29wdGlvbl87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb24gPiYKK01ldGhvZE9wdGlvbnM6OnVuaW50ZXJwcmV0ZWRfb3B0aW9uKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuTWV0aG9kT3B0aW9ucy51bmludGVycHJldGVkX29wdGlvbikKKyAgcmV0dXJuIHVuaW50ZXJwcmV0ZWRfb3B0aW9uXzsKK30KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCkBAIC00Nzk5LDUxICs2ODU2LDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDF1OwogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6Y2xlYXJfbmFtZV9wYXJ0KCkgewotICBpZiAobmFtZV9wYXJ0XyAhPSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV9wYXJ0Xy0+Y2xlYXIoKTsKLSAgfQorICBuYW1lX3BhcnRfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKICAgY2xlYXJfaGFzX25hbWVfcGFydCgpOwogfQogaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6Om5hbWVfcGFydCgpIGNvbnN0IHsKLSAgcmV0dXJuICpuYW1lX3BhcnRfOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKKyAgcmV0dXJuIG5hbWVfcGFydF8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X25hbWVfcGFydChjb25zdCA6OnN0ZDo6c3RyaW5nJiB2YWx1ZSkgewogICBzZXRfaGFzX25hbWVfcGFydCgpOwotICBpZiAobmFtZV9wYXJ0XyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgbmFtZV9wYXJ0XyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIG5hbWVfcGFydF8tPmFzc2lnbih2YWx1ZSk7CisgIG5hbWVfcGFydF8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpzZXRfbmFtZV9wYXJ0KGNvbnN0IGNoYXIqIHZhbHVlKSB7CiAgIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIGlmIChuYW1lX3BhcnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lX3BhcnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgbmFtZV9wYXJ0Xy0+YXNzaWduKHZhbHVlKTsKKyAgbmFtZV9wYXJ0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6c2V0X25hbWVfcGFydChjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKICAgc2V0X2hhc19uYW1lX3BhcnQoKTsKLSAgaWYgKG5hbWVfcGFydF8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIG5hbWVfcGFydF8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBuYW1lX3BhcnRfLT5hc3NpZ24ocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgbmFtZV9wYXJ0Xy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5OYW1lUGFydC5uYW1lX3BhcnQpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydDo6bXV0YWJsZV9uYW1lX3BhcnQoKSB7CiAgIHNldF9oYXNfbmFtZV9wYXJ0KCk7Ci0gIGlmIChuYW1lX3BhcnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBuYW1lX3BhcnRfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgcmV0dXJuIG5hbWVfcGFydF87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKKyAgcmV0dXJuIG5hbWVfcGFydF8uTXV0YWJsZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0OjpyZWxlYXNlX25hbWVfcGFydCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQubmFtZV9wYXJ0KQogICBjbGVhcl9oYXNfbmFtZV9wYXJ0KCk7Ci0gIGlmIChuYW1lX3BhcnRfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIG5hbWVfcGFydF8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9hbGxvY2F0ZWRfbmFtZV9wYXJ0KDo6c3RkOjpzdHJpbmcqIG5hbWVfcGFydCkgeworICBpZiAobmFtZV9wYXJ0ICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX25hbWVfcGFydCgpOwogICB9IGVsc2UgewotICAgIDo6c3RkOjpzdHJpbmcqIHRlbXAgPSBuYW1lX3BhcnRfOwotICAgIG5hbWVfcGFydF8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gICAgcmV0dXJuIHRlbXA7CisgICAgY2xlYXJfaGFzX25hbWVfcGFydCgpOwogICB9CisgIG5hbWVfcGFydF8uU2V0QWxsb2NhdGVkTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIG5hbWVfcGFydCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLk5hbWVQYXJ0Lm5hbWVfcGFydCkKIH0KIAogLy8gcmVxdWlyZWQgYm9vbCBpc19leHRlbnNpb24gPSAyOwpAQCAtNDg2MSwxMSArNjkxNCwxMyBAQAogICBjbGVhcl9oYXNfaXNfZXh0ZW5zaW9uKCk7CiB9CiBpbmxpbmUgYm9vbCBVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0Ojppc19leHRlbnNpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQuaXNfZXh0ZW5zaW9uKQogICByZXR1cm4gaXNfZXh0ZW5zaW9uXzsKIH0KIGlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQ6OnNldF9pc19leHRlbnNpb24oYm9vbCB2YWx1ZSkgewogICBzZXRfaGFzX2lzX2V4dGVuc2lvbigpOwogICBpc19leHRlbnNpb25fID0gdmFsdWU7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uTmFtZVBhcnQuaXNfZXh0ZW5zaW9uKQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00ODgwLDIyICs2OTM1LDI3IEBACiAgIG5hbWVfLkNsZWFyKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0JiBVbmludGVycHJldGVkT3B0aW9uOjpuYW1lKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCiAgIHJldHVybiBuYW1lXy5HZXQoaW5kZXgpOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQogICByZXR1cm4gbmFtZV8uTXV0YWJsZShpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpVbmludGVycHJldGVkT3B0aW9uX05hbWVQYXJ0KiBVbmludGVycHJldGVkT3B0aW9uOjphZGRfbmFtZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uYW1lKQogICByZXR1cm4gbmFtZV8uQWRkKCk7CiB9Ci1pbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPiYKLVVuaW50ZXJwcmV0ZWRPcHRpb246Om5hbWUoKSBjb25zdCB7Ci0gIHJldHVybiBuYW1lXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6VW5pbnRlcnByZXRlZE9wdGlvbl9OYW1lUGFydCA+KgogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9uYW1lKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCiAgIHJldHVybiAmbmFtZV87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlVuaW50ZXJwcmV0ZWRPcHRpb25fTmFtZVBhcnQgPiYKK1VuaW50ZXJwcmV0ZWRPcHRpb246Om5hbWUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLm5hbWUpCisgIHJldHVybiBuYW1lXzsKK30KIAogLy8gb3B0aW9uYWwgc3RyaW5nIGlkZW50aWZpZXJfdmFsdWUgPSAzOwogaW5saW5lIGJvb2wgVW5pbnRlcnByZXRlZE9wdGlvbjo6aGFzX2lkZW50aWZpZXJfdmFsdWUoKSBjb25zdCB7CkBAIC00OTA4LDUxICs2OTY4LDQ3IEBACiAgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDJ1OwogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6Y2xlYXJfaWRlbnRpZmllcl92YWx1ZSgpIHsKLSAgaWYgKGlkZW50aWZpZXJfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBpZGVudGlmaWVyX3ZhbHVlXy0+Y2xlYXIoKTsKLSAgfQorICBpZGVudGlmaWVyX3ZhbHVlXy5DbGVhclRvRW1wdHlOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiAgIGNsZWFyX2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6aWRlbnRpZmllcl92YWx1ZSgpIGNvbnN0IHsKLSAgcmV0dXJuICppZGVudGlmaWVyX3ZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQorICByZXR1cm4gaWRlbnRpZmllcl92YWx1ZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKICAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIGlmIChpZGVudGlmaWVyX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgaWRlbnRpZmllcl92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBpZGVudGlmaWVyX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKKyAgaWRlbnRpZmllcl92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2lkZW50aWZpZXJfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIGlmIChpZGVudGlmaWVyX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgaWRlbnRpZmllcl92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBpZGVudGlmaWVyX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKKyAgaWRlbnRpZmllcl92YWx1ZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfaWRlbnRpZmllcl92YWx1ZShjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKICAgc2V0X2hhc19pZGVudGlmaWVyX3ZhbHVlKCk7Ci0gIGlmIChpZGVudGlmaWVyX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgaWRlbnRpZmllcl92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBpZGVudGlmaWVyX3ZhbHVlXy0+YXNzaWduKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHZhbHVlKSwgc2l6ZSk7CisgIGlkZW50aWZpZXJfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6bXV0YWJsZV9pZGVudGlmaWVyX3ZhbHVlKCkgewogICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKLSAgaWYgKGlkZW50aWZpZXJfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBpZGVudGlmaWVyX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHJldHVybiBpZGVudGlmaWVyX3ZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uaWRlbnRpZmllcl92YWx1ZSkKKyAgcmV0dXJuIGlkZW50aWZpZXJfdmFsdWVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgOjpzdGQ6OnN0cmluZyogVW5pbnRlcnByZXRlZE9wdGlvbjo6cmVsZWFzZV9pZGVudGlmaWVyX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5pZGVudGlmaWVyX3ZhbHVlKQogICBjbGVhcl9oYXNfaWRlbnRpZmllcl92YWx1ZSgpOwotICBpZiAoaWRlbnRpZmllcl92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gaWRlbnRpZmllcl92YWx1ZV8uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hbGxvY2F0ZWRfaWRlbnRpZmllcl92YWx1ZSg6OnN0ZDo6c3RyaW5nKiBpZGVudGlmaWVyX3ZhbHVlKSB7CisgIGlmIChpZGVudGlmaWVyX3ZhbHVlICE9IE5VTEwpIHsKKyAgICBzZXRfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKICAgfSBlbHNlIHsKLSAgICA6OnN0ZDo6c3RyaW5nKiB0ZW1wID0gaWRlbnRpZmllcl92YWx1ZV87Ci0gICAgaWRlbnRpZmllcl92YWx1ZV8gPSBjb25zdF9jYXN0PCA6OnN0ZDo6c3RyaW5nKj4oJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZyk7Ci0gICAgcmV0dXJuIHRlbXA7CisgICAgY2xlYXJfaGFzX2lkZW50aWZpZXJfdmFsdWUoKTsKICAgfQorICBpZGVudGlmaWVyX3ZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgaWRlbnRpZmllcl92YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmlkZW50aWZpZXJfdmFsdWUpCiB9CiAKIC8vIG9wdGlvbmFsIHVpbnQ2NCBwb3NpdGl2ZV9pbnRfdmFsdWUgPSA0OwpAQCAtNDk3MCwxMSArNzAyNiwxMyBAQAogICBjbGVhcl9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50NjQgVW5pbnRlcnByZXRlZE9wdGlvbjo6cG9zaXRpdmVfaW50X3ZhbHVlKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnBvc2l0aXZlX2ludF92YWx1ZSkKICAgcmV0dXJuIHBvc2l0aXZlX2ludF92YWx1ZV87CiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfcG9zaXRpdmVfaW50X3ZhbHVlKDo6Z29vZ2xlOjpwcm90b2J1Zjo6dWludDY0IHZhbHVlKSB7CiAgIHNldF9oYXNfcG9zaXRpdmVfaW50X3ZhbHVlKCk7CiAgIHBvc2l0aXZlX2ludF92YWx1ZV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5wb3NpdGl2ZV9pbnRfdmFsdWUpCiB9CiAKIC8vIG9wdGlvbmFsIGludDY0IG5lZ2F0aXZlX2ludF92YWx1ZSA9IDU7CkBAIC00OTkyLDExICs3MDUwLDEzIEBACiAgIGNsZWFyX2hhc19uZWdhdGl2ZV9pbnRfdmFsdWUoKTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IFVuaW50ZXJwcmV0ZWRPcHRpb246Om5lZ2F0aXZlX2ludF92YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uZWdhdGl2ZV9pbnRfdmFsdWUpCiAgIHJldHVybiBuZWdhdGl2ZV9pbnRfdmFsdWVfOwogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X25lZ2F0aXZlX2ludF92YWx1ZSg6Omdvb2dsZTo6cHJvdG9idWY6OmludDY0IHZhbHVlKSB7CiAgIHNldF9oYXNfbmVnYXRpdmVfaW50X3ZhbHVlKCk7CiAgIG5lZ2F0aXZlX2ludF92YWx1ZV8gPSB2YWx1ZTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5uZWdhdGl2ZV9pbnRfdmFsdWUpCiB9CiAKIC8vIG9wdGlvbmFsIGRvdWJsZSBkb3VibGVfdmFsdWUgPSA2OwpAQCAtNTAxNCwxMSArNzA3NCwxMyBAQAogICBjbGVhcl9oYXNfZG91YmxlX3ZhbHVlKCk7CiB9CiBpbmxpbmUgZG91YmxlIFVuaW50ZXJwcmV0ZWRPcHRpb246OmRvdWJsZV92YWx1ZSgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5kb3VibGVfdmFsdWUpCiAgIHJldHVybiBkb3VibGVfdmFsdWVfOwogfQogaW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2RvdWJsZV92YWx1ZShkb3VibGUgdmFsdWUpIHsKICAgc2V0X2hhc19kb3VibGVfdmFsdWUoKTsKICAgZG91YmxlX3ZhbHVlXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmRvdWJsZV92YWx1ZSkKIH0KIAogLy8gb3B0aW9uYWwgYnl0ZXMgc3RyaW5nX3ZhbHVlID0gNzsKQEAgLTUwMzIsNTEgKzcwOTQsNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAyMHU7CiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9zdHJpbmdfdmFsdWUoKSB7Ci0gIGlmIChzdHJpbmdfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBzdHJpbmdfdmFsdWVfLT5jbGVhcigpOwotICB9CisgIHN0cmluZ192YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6c3RyaW5nX3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKnN0cmluZ192YWx1ZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQorICByZXR1cm4gc3RyaW5nX3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7Ci0gIGlmIChzdHJpbmdfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBzdHJpbmdfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgc3RyaW5nX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKKyAgc3RyaW5nX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKIH0KIGlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9zdHJpbmdfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgaWYgKHN0cmluZ192YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHN0cmluZ192YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBzdHJpbmdfdmFsdWVfLT5hc3NpZ24odmFsdWUpOworICBzdHJpbmdfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfc3RyaW5nX3ZhbHVlKGNvbnN0IHZvaWQqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX3N0cmluZ192YWx1ZSgpOwotICBpZiAoc3RyaW5nX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgc3RyaW5nX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIHN0cmluZ192YWx1ZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICBzdHJpbmdfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLnN0cmluZ192YWx1ZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uOjptdXRhYmxlX3N0cmluZ192YWx1ZSgpIHsKICAgc2V0X2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgaWYgKHN0cmluZ192YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHN0cmluZ192YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gc3RyaW5nX3ZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQorICByZXR1cm4gc3RyaW5nX3ZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246OnJlbGVhc2Vfc3RyaW5nX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5zdHJpbmdfdmFsdWUpCiAgIGNsZWFyX2hhc19zdHJpbmdfdmFsdWUoKTsKLSAgaWYgKHN0cmluZ192YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gc3RyaW5nX3ZhbHVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9zdHJpbmdfdmFsdWUoOjpzdGQ6OnN0cmluZyogc3RyaW5nX3ZhbHVlKSB7CisgIGlmIChzdHJpbmdfdmFsdWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfc3RyaW5nX3ZhbHVlKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IHN0cmluZ192YWx1ZV87Ci0gICAgc3RyaW5nX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfc3RyaW5nX3ZhbHVlKCk7CiAgIH0KKyAgc3RyaW5nX3ZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgc3RyaW5nX3ZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uc3RyaW5nX3ZhbHVlKQogfQogCiAvLyBvcHRpb25hbCBzdHJpbmcgYWdncmVnYXRlX3ZhbHVlID0gODsKQEAgLTUwOTAsNTEgKzcxNDgsNDcgQEAKICAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDA0MHU7CiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpjbGVhcl9hZ2dyZWdhdGVfdmFsdWUoKSB7Ci0gIGlmIChhZ2dyZWdhdGVfdmFsdWVfICE9ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBhZ2dyZWdhdGVfdmFsdWVfLT5jbGVhcigpOwotICB9CisgIGFnZ3JlZ2F0ZV92YWx1ZV8uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogICBjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CiB9CiBpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgVW5pbnRlcnByZXRlZE9wdGlvbjo6YWdncmVnYXRlX3ZhbHVlKCkgY29uc3QgewotICByZXR1cm4gKmFnZ3JlZ2F0ZV92YWx1ZV87CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQorICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5HZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7CiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CiAgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7Ci0gIGlmIChhZ2dyZWdhdGVfdmFsdWVfID09ICY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjprRW1wdHlTdHJpbmcpIHsKLSAgICBhZ2dyZWdhdGVfdmFsdWVfID0gbmV3IDo6c3RkOjpzdHJpbmc7Ci0gIH0KLSAgYWdncmVnYXRlX3ZhbHVlXy0+YXNzaWduKHZhbHVlKTsKKyAgYWdncmVnYXRlX3ZhbHVlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKIH0KIGlubGluZSB2b2lkIFVuaW50ZXJwcmV0ZWRPcHRpb246OnNldF9hZ2dyZWdhdGVfdmFsdWUoY29uc3QgY2hhciogdmFsdWUpIHsKICAgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGFnZ3JlZ2F0ZV92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICBhZ2dyZWdhdGVfdmFsdWVfLT5hc3NpZ24odmFsdWUpOworICBhZ2dyZWdhdGVfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCiB9CiBpbmxpbmUgdm9pZCBVbmludGVycHJldGVkT3B0aW9uOjpzZXRfYWdncmVnYXRlX3ZhbHVlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgewogICBzZXRfaGFzX2FnZ3JlZ2F0ZV92YWx1ZSgpOwotICBpZiAoYWdncmVnYXRlX3ZhbHVlXyA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKSB7Ci0gICAgYWdncmVnYXRlX3ZhbHVlXyA9IG5ldyA6OnN0ZDo6c3RyaW5nOwotICB9Ci0gIGFnZ3JlZ2F0ZV92YWx1ZV8tPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICBhZ2dyZWdhdGVfdmFsdWVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLAorICAgICAgOjpzdGQ6OnN0cmluZyhyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5VbmludGVycHJldGVkT3B0aW9uLmFnZ3JlZ2F0ZV92YWx1ZSkKIH0KIGlubGluZSA6OnN0ZDo6c3RyaW5nKiBVbmludGVycHJldGVkT3B0aW9uOjptdXRhYmxlX2FnZ3JlZ2F0ZV92YWx1ZSgpIHsKICAgc2V0X2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIGFnZ3JlZ2F0ZV92YWx1ZV8gPSBuZXcgOjpzdGQ6OnN0cmluZzsKLSAgfQotICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXzsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQorICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOwogfQogaW5saW5lIDo6c3RkOjpzdHJpbmcqIFVuaW50ZXJwcmV0ZWRPcHRpb246OnJlbGVhc2VfYWdncmVnYXRlX3ZhbHVlKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfcmVsZWFzZTpnb29nbGUucHJvdG9idWYuVW5pbnRlcnByZXRlZE9wdGlvbi5hZ2dyZWdhdGVfdmFsdWUpCiAgIGNsZWFyX2hhc19hZ2dyZWdhdGVfdmFsdWUoKTsKLSAgaWYgKGFnZ3JlZ2F0ZV92YWx1ZV8gPT0gJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmtFbXB0eVN0cmluZykgewotICAgIHJldHVybiBOVUxMOworICByZXR1cm4gYWdncmVnYXRlX3ZhbHVlXy5SZWxlYXNlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgVW5pbnRlcnByZXRlZE9wdGlvbjo6c2V0X2FsbG9jYXRlZF9hZ2dyZWdhdGVfdmFsdWUoOjpzdGQ6OnN0cmluZyogYWdncmVnYXRlX3ZhbHVlKSB7CisgIGlmIChhZ2dyZWdhdGVfdmFsdWUgIT0gTlVMTCkgeworICAgIHNldF9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CiAgIH0gZWxzZSB7Ci0gICAgOjpzdGQ6OnN0cmluZyogdGVtcCA9IGFnZ3JlZ2F0ZV92YWx1ZV87Ci0gICAgYWdncmVnYXRlX3ZhbHVlXyA9IGNvbnN0X2Nhc3Q8IDo6c3RkOjpzdHJpbmcqPigmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a0VtcHR5U3RyaW5nKTsKLSAgICByZXR1cm4gdGVtcDsKKyAgICBjbGVhcl9oYXNfYWdncmVnYXRlX3ZhbHVlKCk7CiAgIH0KKyAgYWdncmVnYXRlX3ZhbHVlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgYWdncmVnYXRlX3ZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9hbGxvY2F0ZWQ6Z29vZ2xlLnByb3RvYnVmLlVuaW50ZXJwcmV0ZWRPcHRpb24uYWdncmVnYXRlX3ZhbHVlKQogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MTQ5LDIwICs3MjAzLDI1IEBACiAgIHBhdGhfLkNsZWFyKCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6cGF0aChpbnQgaW5kZXgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2dldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKICAgcmV0dXJuIHBhdGhfLkdldChpbmRleCk7CiB9CiBpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3BhdGgoaW50IGluZGV4LCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIHZhbHVlKSB7CiAgIHBhdGhfLlNldChpbmRleCwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5wYXRoKQogfQogaW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmFkZF9wYXRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKICAgcGF0aF8uQWRkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgPiYKIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpwYXRoKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKICAgcmV0dXJuIHBhdGhfOwogfQogaW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfcGF0aCgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ucGF0aCkKICAgcmV0dXJuICZwYXRoXzsKIH0KIApAQCAtNTE3NCwyMyArNzIzMywxOTEgQEAKICAgc3Bhbl8uQ2xlYXIoKTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzcGFuKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQogICByZXR1cm4gc3Bhbl8uR2V0KGluZGV4KTsKIH0KIGlubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfc3BhbihpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKICAgc3Bhbl8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnNwYW4pCiB9CiBpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX3NwYW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgewogICBzcGFuXy5BZGQodmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQogfQogaW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgogU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNwYW4oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQogICByZXR1cm4gc3Bhbl87CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyID4qCiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9zcGFuKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5zcGFuKQogICByZXR1cm4gJnNwYW5fOwogfQogCisvLyBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CitpbmxpbmUgYm9vbCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6aGFzX2xlYWRpbmdfY29tbWVudHMoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDR1KSAhPSAwOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA0dTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6Y2xlYXJfbGVhZGluZ19jb21tZW50cygpIHsKKyAgbGVhZGluZ19jb21tZW50c18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2NvbW1lbnRzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQorICByZXR1cm4gbGVhZGluZ19jb21tZW50c18uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOworICBsZWFkaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdmFsdWUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQorfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOworICBsZWFkaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgOjpzdGQ6OnN0cmluZyh2YWx1ZSkpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2NoYXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIHNldF9oYXNfbGVhZGluZ19jb21tZW50cygpOworICBsZWFkaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19jb21tZW50cykKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9sZWFkaW5nX2NvbW1lbnRzKCkgeworICBzZXRfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfY29tbWVudHMpCisgIHJldHVybiBsZWFkaW5nX2NvbW1lbnRzXy5NdXRhYmxlTm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpyZWxlYXNlX2xlYWRpbmdfY29tbWVudHMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQorICBjbGVhcl9oYXNfbGVhZGluZ19jb21tZW50cygpOworICByZXR1cm4gbGVhZGluZ19jb21tZW50c18uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfYWxsb2NhdGVkX2xlYWRpbmdfY29tbWVudHMoOjpzdGQ6OnN0cmluZyogbGVhZGluZ19jb21tZW50cykgeworICBpZiAobGVhZGluZ19jb21tZW50cyAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19sZWFkaW5nX2NvbW1lbnRzKCk7CisgIH0gZWxzZSB7CisgICAgY2xlYXJfaGFzX2xlYWRpbmdfY29tbWVudHMoKTsKKyAgfQorICBsZWFkaW5nX2NvbW1lbnRzXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgbGVhZGluZ19jb21tZW50cyk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfYWxsb2NhdGVkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2NvbW1lbnRzKQorfQorCisvLyBvcHRpb25hbCBzdHJpbmcgdHJhaWxpbmdfY29tbWVudHMgPSA0OworaW5saW5lIGJvb2wgU291cmNlQ29kZUluZm9fTG9jYXRpb246Omhhc190cmFpbGluZ19jb21tZW50cygpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2hhc190cmFpbGluZ19jb21tZW50cygpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmNsZWFyX3RyYWlsaW5nX2NvbW1lbnRzKCkgeworICB0cmFpbGluZ19jb21tZW50c18uQ2xlYXJUb0VtcHR5Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworICBjbGVhcl9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKK30KK2lubGluZSBjb25zdCA6OnN0ZDo6c3RyaW5nJiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6dHJhaWxpbmdfY29tbWVudHMoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQorICByZXR1cm4gdHJhaWxpbmdfY29tbWVudHNfLkdldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfdHJhaWxpbmdfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOworICB0cmFpbGluZ19jb21tZW50c18uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlKSB7CisgIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgdHJhaWxpbmdfY29tbWVudHNfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCA6OnN0ZDo6c3RyaW5nKHZhbHVlKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X3RyYWlsaW5nX2NvbW1lbnRzKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIHRyYWlsaW5nX2NvbW1lbnRzXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246Om11dGFibGVfdHJhaWxpbmdfY29tbWVudHMoKSB7CisgIHNldF9oYXNfdHJhaWxpbmdfY29tbWVudHMoKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGU6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnRyYWlsaW5nX2NvbW1lbnRzKQorICByZXR1cm4gdHJhaWxpbmdfY29tbWVudHNfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogU291cmNlQ29kZUluZm9fTG9jYXRpb246OnJlbGVhc2VfdHJhaWxpbmdfY29tbWVudHMoKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9yZWxlYXNlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi50cmFpbGluZ19jb21tZW50cykKKyAgY2xlYXJfaGFzX3RyYWlsaW5nX2NvbW1lbnRzKCk7CisgIHJldHVybiB0cmFpbGluZ19jb21tZW50c18uUmVsZWFzZU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpzZXRfYWxsb2NhdGVkX3RyYWlsaW5nX2NvbW1lbnRzKDo6c3RkOjpzdHJpbmcqIHRyYWlsaW5nX2NvbW1lbnRzKSB7CisgIGlmICh0cmFpbGluZ19jb21tZW50cyAhPSBOVUxMKSB7CisgICAgc2V0X2hhc190cmFpbGluZ19jb21tZW50cygpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc190cmFpbGluZ19jb21tZW50cygpOworICB9CisgIHRyYWlsaW5nX2NvbW1lbnRzXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgdHJhaWxpbmdfY29tbWVudHMpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24udHJhaWxpbmdfY29tbWVudHMpCit9CisKKy8vIHJlcGVhdGVkIHN0cmluZyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzID0gNjsKK2lubGluZSBpbnQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfc2l6ZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLnNpemUoKTsKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpjbGVhcl9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkgeworICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5DbGVhcigpOworfQoraW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorICByZXR1cm4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uR2V0KGluZGV4KTsKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZTpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKKyAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpOworfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKKyAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uTXV0YWJsZShpbmRleCktPmFzc2lnbih2YWx1ZSk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6c2V0X2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoaW50IGluZGV4LCBjb25zdCBjaGFyKiB2YWx1ZSkgeworICBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzXy5NdXRhYmxlKGluZGV4KS0+YXNzaWduKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorfQoraW5saW5lIHZvaWQgU291cmNlQ29kZUluZm9fTG9jYXRpb246OnNldF9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKGludCBpbmRleCwgY29uc3QgY2hhciogdmFsdWUsIHNpemVfdCBzaXplKSB7CisgIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfLk11dGFibGUoaW5kZXgpLT5hc3NpZ24oCisgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9wb2ludGVyOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorfQoraW5saW5lIDo6c3RkOjpzdHJpbmcqIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cygpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorICByZXR1cm4gbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCk7Cit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgOjpzdGQ6OnN0cmluZyYgdmFsdWUpIHsKKyAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9CitpbmxpbmUgdm9pZCBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6YWRkX2xlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCktPmFzc2lnbih2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGRfY2hhcjpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKK30KK2lubGluZSB2b2lkIFNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjphZGRfbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyhjb25zdCBjaGFyKiB2YWx1ZSwgc2l6ZV90IHNpemUpIHsKKyAgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50c18uQWRkKCktPmFzc2lnbihyZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPih2YWx1ZSksIHNpemUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkX3BvaW50ZXI6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHMpCit9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPiYKK1NvdXJjZUNvZGVJbmZvX0xvY2F0aW9uOjpsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbGlzdDpnb29nbGUucHJvdG9idWYuU291cmNlQ29kZUluZm8uTG9jYXRpb24ubGVhZGluZ19kZXRhY2hlZF9jb21tZW50cykKKyAgcmV0dXJuIGxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4qCitTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbjo6bXV0YWJsZV9sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5Mb2NhdGlvbi5sZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzKQorICByZXR1cm4gJmxlYWRpbmdfZGV0YWNoZWRfY29tbWVudHNfOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIC8vIFNvdXJjZUNvZGVJbmZvCkBAIC01MjAzLDIyICs3NDMwLDI0NCBAQAogICBsb2NhdGlvbl8uQ2xlYXIoKTsKIH0KIGlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uJiBTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb24oaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLlNvdXJjZUNvZGVJbmZvLmxvY2F0aW9uKQogICByZXR1cm4gbG9jYXRpb25fLkdldChpbmRleCk7CiB9CiBpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiogU291cmNlQ29kZUluZm86Om11dGFibGVfbG9jYXRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKICAgcmV0dXJuIGxvY2F0aW9uXy5NdXRhYmxlKGluZGV4KTsKIH0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uKiBTb3VyY2VDb2RlSW5mbzo6YWRkX2xvY2F0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfYWRkOmdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKICAgcmV0dXJuIGxvY2F0aW9uXy5BZGQoKTsKIH0KLWlubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPiYKLVNvdXJjZUNvZGVJbmZvOjpsb2NhdGlvbigpIGNvbnN0IHsKLSAgcmV0dXJuIGxvY2F0aW9uXzsKLX0KIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6U291cmNlQ29kZUluZm9fTG9jYXRpb24gPioKIFNvdXJjZUNvZGVJbmZvOjptdXRhYmxlX2xvY2F0aW9uKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKICAgcmV0dXJuICZsb2NhdGlvbl87CiB9CitpbmxpbmUgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZFB0ckZpZWxkPCA6Omdvb2dsZTo6cHJvdG9idWY6OlNvdXJjZUNvZGVJbmZvX0xvY2F0aW9uID4mCitTb3VyY2VDb2RlSW5mbzo6bG9jYXRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5Tb3VyY2VDb2RlSW5mby5sb2NhdGlvbikKKyAgcmV0dXJuIGxvY2F0aW9uXzsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uCisKKy8vIHJlcGVhdGVkIGludDMyIHBhdGggPSAxIFtwYWNrZWQgPSB0cnVlXTsKK2lubGluZSBpbnQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cGF0aF9zaXplKCkgY29uc3QgeworICByZXR1cm4gcGF0aF8uc2l6ZSgpOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfcGF0aCgpIHsKKyAgcGF0aF8uQ2xlYXIoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OmludDMyIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnBhdGgoaW50IGluZGV4KSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCkKKyAgcmV0dXJuIHBhdGhfLkdldChpbmRleCk7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfcGF0aChpbnQgaW5kZXgsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgcGF0aF8uU2V0KGluZGV4LCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCkKK30KK2lubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmFkZF9wYXRoKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgcGF0aF8uQWRkKHZhbHVlKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2FkZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5wYXRoKQorfQoraW5saW5lIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+JgorR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cGF0aCgpIGNvbnN0IHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX2xpc3Q6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24ucGF0aCkKKyAgcmV0dXJuIHBhdGhfOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6UmVwZWF0ZWRGaWVsZDwgOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiA+KgorR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6bXV0YWJsZV9wYXRoKCkgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfbXV0YWJsZV9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnBhdGgpCisgIHJldHVybiAmcGF0aF87Cit9CisKKy8vIG9wdGlvbmFsIHN0cmluZyBzb3VyY2VfZmlsZSA9IDI7CitpbmxpbmUgYm9vbCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpoYXNfc291cmNlX2ZpbGUoKSBjb25zdCB7CisgIHJldHVybiAoX2hhc19iaXRzX1swXSAmIDB4MDAwMDAwMDJ1KSAhPSAwOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X2hhc19zb3VyY2VfZmlsZSgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDAydTsKK30KK2lubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX2hhc19zb3VyY2VfZmlsZSgpIHsKKyAgX2hhc19iaXRzX1swXSAmPSB+MHgwMDAwMDAwMnU7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9zb3VyY2VfZmlsZSgpIHsKKyAgc291cmNlX2ZpbGVfLkNsZWFyVG9FbXB0eU5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpKTsKKyAgY2xlYXJfaGFzX3NvdXJjZV9maWxlKCk7Cit9CitpbmxpbmUgY29uc3QgOjpzdGQ6OnN0cmluZyYgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c291cmNlX2ZpbGUoKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCisgIHJldHVybiBzb3VyY2VfZmlsZV8uR2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpOworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X3NvdXJjZV9maWxlKGNvbnN0IDo6c3RkOjpzdHJpbmcmIHZhbHVlKSB7CisgIHNldF9oYXNfc291cmNlX2ZpbGUoKTsKKyAgc291cmNlX2ZpbGVfLlNldE5vQXJlbmEoJjo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpLCB2YWx1ZSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfc291cmNlX2ZpbGUoY29uc3QgY2hhciogdmFsdWUpIHsKKyAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOworICBzb3VyY2VfZmlsZV8uU2V0Tm9BcmVuYSgmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCksIDo6c3RkOjpzdHJpbmcodmFsdWUpKTsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3NldF9jaGFyOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQorfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6c2V0X3NvdXJjZV9maWxlKGNvbnN0IGNoYXIqIHZhbHVlLCBzaXplX3Qgc2l6ZSkgeworICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7CisgIHNvdXJjZV9maWxlXy5TZXROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwKKyAgICAgIDo6c3RkOjpzdHJpbmcocmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4odmFsdWUpLCBzaXplKSk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9zZXRfcG9pbnRlcjpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKK30KK2lubGluZSA6OnN0ZDo6c3RyaW5nKiBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjptdXRhYmxlX3NvdXJjZV9maWxlKCkgeworICBzZXRfaGFzX3NvdXJjZV9maWxlKCk7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLnNvdXJjZV9maWxlKQorICByZXR1cm4gc291cmNlX2ZpbGVfLk11dGFibGVOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgOjpzdGQ6OnN0cmluZyogR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6cmVsZWFzZV9zb3VyY2VfZmlsZSgpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX3JlbGVhc2U6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uc291cmNlX2ZpbGUpCisgIGNsZWFyX2hhc19zb3VyY2VfZmlsZSgpOworICByZXR1cm4gc291cmNlX2ZpbGVfLlJlbGVhc2VOb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSk7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfYWxsb2NhdGVkX3NvdXJjZV9maWxlKDo6c3RkOjpzdHJpbmcqIHNvdXJjZV9maWxlKSB7CisgIGlmIChzb3VyY2VfZmlsZSAhPSBOVUxMKSB7CisgICAgc2V0X2hhc19zb3VyY2VfZmlsZSgpOworICB9IGVsc2UgeworICAgIGNsZWFyX2hhc19zb3VyY2VfZmlsZSgpOworICB9CisgIHNvdXJjZV9maWxlXy5TZXRBbGxvY2F0ZWROb0FyZW5hKCY6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKSwgc291cmNlX2ZpbGUpOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0X2FsbG9jYXRlZDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uQW5ub3RhdGlvbi5zb3VyY2VfZmlsZSkKK30KKworLy8gb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOworaW5saW5lIGJvb2wgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6aGFzX2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gKF9oYXNfYml0c19bMF0gJiAweDAwMDAwMDA0dSkgIT0gMDsKK30KK2lubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OnNldF9oYXNfYmVnaW4oKSB7CisgIF9oYXNfYml0c19bMF0gfD0gMHgwMDAwMDAwNHU7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpjbGVhcl9oYXNfYmVnaW4oKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDR1OworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfYmVnaW4oKSB7CisgIGJlZ2luXyA9IDA7CisgIGNsZWFyX2hhc19iZWdpbigpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6YmVnaW4oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9nZXQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24uYmVnaW4pCisgIHJldHVybiBiZWdpbl87Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfYmVnaW4oOjpnb29nbGU6OnByb3RvYnVmOjppbnQzMiB2YWx1ZSkgeworICBzZXRfaGFzX2JlZ2luKCk7CisgIGJlZ2luXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLmJlZ2luKQorfQorCisvLyBvcHRpb25hbCBpbnQzMiBlbmQgPSA0OworaW5saW5lIGJvb2wgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6aGFzX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIChfaGFzX2JpdHNfWzBdICYgMHgwMDAwMDAwOHUpICE9IDA7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfaGFzX2VuZCgpIHsKKyAgX2hhc19iaXRzX1swXSB8PSAweDAwMDAwMDA4dTsKK30KK2lubGluZSB2b2lkIEdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb246OmNsZWFyX2hhc19lbmQoKSB7CisgIF9oYXNfYml0c19bMF0gJj0gfjB4MDAwMDAwMDh1OworfQoraW5saW5lIHZvaWQgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6Y2xlYXJfZW5kKCkgeworICBlbmRfID0gMDsKKyAgY2xlYXJfaGFzX2VuZCgpOworfQoraW5saW5lIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgR2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbjo6ZW5kKCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLmVuZCkKKyAgcmV0dXJuIGVuZF87Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uOjpzZXRfZW5kKDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50MzIgdmFsdWUpIHsKKyAgc2V0X2hhc19lbmQoKTsKKyAgZW5kXyA9IHZhbHVlOworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfc2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5Bbm5vdGF0aW9uLmVuZCkKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBHZW5lcmF0ZWRDb2RlSW5mbworCisvLyByZXBlYXRlZCAuZ29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLkFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CitpbmxpbmUgaW50IEdlbmVyYXRlZENvZGVJbmZvOjphbm5vdGF0aW9uX3NpemUoKSBjb25zdCB7CisgIHJldHVybiBhbm5vdGF0aW9uXy5zaXplKCk7Cit9CitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRDb2RlSW5mbzo6Y2xlYXJfYW5ub3RhdGlvbigpIHsKKyAgYW5ub3RhdGlvbl8uQ2xlYXIoKTsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24mIEdlbmVyYXRlZENvZGVJbmZvOjphbm5vdGF0aW9uKGludCBpbmRleCkgY29uc3QgeworICAvLyBAQHByb3RvY19pbnNlcnRpb25fcG9pbnQoZmllbGRfZ2V0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQorICByZXR1cm4gYW5ub3RhdGlvbl8uR2V0KGluZGV4KTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkdlbmVyYXRlZENvZGVJbmZvX0Fubm90YXRpb24qIEdlbmVyYXRlZENvZGVJbmZvOjptdXRhYmxlX2Fubm90YXRpb24oaW50IGluZGV4KSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9tdXRhYmxlOmdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQorICByZXR1cm4gYW5ub3RhdGlvbl8uTXV0YWJsZShpbmRleCk7Cit9CitpbmxpbmUgOjpnb29nbGU6OnByb3RvYnVmOjpHZW5lcmF0ZWRDb2RlSW5mb19Bbm5vdGF0aW9uKiBHZW5lcmF0ZWRDb2RlSW5mbzo6YWRkX2Fubm90YXRpb24oKSB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9hZGQ6Z29vZ2xlLnByb3RvYnVmLkdlbmVyYXRlZENvZGVJbmZvLmFubm90YXRpb24pCisgIHJldHVybiBhbm5vdGF0aW9uXy5BZGQoKTsKK30KK2lubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA+KgorR2VuZXJhdGVkQ29kZUluZm86Om11dGFibGVfYW5ub3RhdGlvbigpIHsKKyAgLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGZpZWxkX211dGFibGVfbGlzdDpnb29nbGUucHJvdG9idWYuR2VuZXJhdGVkQ29kZUluZm8uYW5ub3RhdGlvbikKKyAgcmV0dXJuICZhbm5vdGF0aW9uXzsKK30KK2lubGluZSBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6R2VuZXJhdGVkQ29kZUluZm9fQW5ub3RhdGlvbiA+JgorR2VuZXJhdGVkQ29kZUluZm86OmFubm90YXRpb24oKSBjb25zdCB7CisgIC8vIEBAcHJvdG9jX2luc2VydGlvbl9wb2ludChmaWVsZF9saXN0Omdvb2dsZS5wcm90b2J1Zi5HZW5lcmF0ZWRDb2RlSW5mby5hbm5vdGF0aW9uKQorICByZXR1cm4gYW5ub3RhdGlvbl87Cit9CisKKyNlbmRpZiAgLy8gIVBST1RPQlVGX0lOTElORV9OT1RfSU5fSEVBREVSUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIAogLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KG5hbWVzcGFjZV9zY29wZSkKQEAgLTUyMzAsMjUgKzc2NzksMzQgQEAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIAordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZT4gOiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUge307CiB0ZW1wbGF0ZSA8PgogaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19UeXBlPigpIHsKICAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGREZXNjcmlwdG9yUHJvdG9fVHlwZV9kZXNjcmlwdG9yKCk7CiB9Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbD4gOiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUge307CiB0ZW1wbGF0ZSA8PgogaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZERlc2NyaXB0b3JQcm90b19MYWJlbD4oKSB7CiAgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkRGVzY3JpcHRvclByb3RvX0xhYmVsX2Rlc2NyaXB0b3IoKTsKIH0KK3RlbXBsYXRlIDw+IHN0cnVjdCBpc19wcm90b19lbnVtPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpbGVPcHRpb25zX09wdGltaXplTW9kZT4gOiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUge307CiB0ZW1wbGF0ZSA8PgogaW5saW5lIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvcjwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGU+KCkgewogICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpGaWxlT3B0aW9uc19PcHRpbWl6ZU1vZGVfZGVzY3JpcHRvcigpOwogfQordGVtcGxhdGUgPD4gc3RydWN0IGlzX3Byb3RvX2VudW08IDo6Z29vZ2xlOjpwcm90b2J1Zjo6RmllbGRPcHRpb25zX0NUeXBlPiA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSB7fTsKIHRlbXBsYXRlIDw+CiBpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZT4oKSB7CiAgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19DVHlwZV9kZXNjcmlwdG9yKCk7CiB9Cit0ZW1wbGF0ZSA8PiBzdHJ1Y3QgaXNfcHJvdG9fZW51bTwgOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlPiA6IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSB7fTsKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgRW51bURlc2NyaXB0b3IqIEdldEVudW1EZXNjcmlwdG9yPCA6Omdvb2dsZTo6cHJvdG9idWY6OkZpZWxkT3B0aW9uc19KU1R5cGU+KCkgeworICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpGaWVsZE9wdGlvbnNfSlNUeXBlX2Rlc2NyaXB0b3IoKTsKK30KIAotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCiAjZW5kaWYgIC8vIFNXSUcKIAogLy8gQEBwcm90b2NfaW5zZXJ0aW9uX3BvaW50KGdsb2JhbF9zY29wZSkKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvCmluZGV4IGJkM2NiOTYuLjA4YjE1NTUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzcsMTAgKzM3LDE0IEBACiAvLyB3aXRob3V0IGFueSBvdGhlciBpbmZvcm1hdGlvbiAoZS5nLiB3aXRob3V0IHJlYWRpbmcgaXRzIGltcG9ydHMpLgogCiAKK3N5bnRheCA9ICJwcm90bzIiOwogCiBwYWNrYWdlIGdvb2dsZS5wcm90b2J1ZjsKK29wdGlvbiBnb19wYWNrYWdlID0gImRlc2NyaXB0b3IiOwogb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKIG9wdGlvbiBqYXZhX291dGVyX2NsYXNzbmFtZSA9ICJEZXNjcmlwdG9yUHJvdG9zIjsKK29wdGlvbiBjc2hhcnBfbmFtZXNwYWNlID0gIkdvb2dsZS5Qcm90b2J1Zi5SZWZsZWN0aW9uIjsKK29wdGlvbiBvYmpjX2NsYXNzX3ByZWZpeCA9ICJHUEIiOwogCiAvLyBkZXNjcmlwdG9yLnByb3RvIG11c3QgYmUgb3B0aW1pemVkIGZvciBzcGVlZCBiZWNhdXNlIHJlZmxlY3Rpb24tYmFzZWQKIC8vIGFsZ29yaXRobXMgZG9uJ3Qgd29yayBkdXJpbmcgYm9vdHN0cmFwcGluZy4KQEAgLTU5LDYgKzYzLDExIEBACiAKICAgLy8gTmFtZXMgb2YgZmlsZXMgaW1wb3J0ZWQgYnkgdGhpcyBmaWxlLgogICByZXBlYXRlZCBzdHJpbmcgZGVwZW5kZW5jeSA9IDM7CisgIC8vIEluZGV4ZXMgb2YgdGhlIHB1YmxpYyBpbXBvcnRlZCBmaWxlcyBpbiB0aGUgZGVwZW5kZW5jeSBsaXN0IGFib3ZlLgorICByZXBlYXRlZCBpbnQzMiBwdWJsaWNfZGVwZW5kZW5jeSA9IDEwOworICAvLyBJbmRleGVzIG9mIHRoZSB3ZWFrIGltcG9ydGVkIGZpbGVzIGluIHRoZSBkZXBlbmRlbmN5IGxpc3QuCisgIC8vIEZvciBHb29nbGUtaW50ZXJuYWwgbWlncmF0aW9uIG9ubHkuIERvIG5vdCB1c2UuCisgIHJlcGVhdGVkIGludDMyIHdlYWtfZGVwZW5kZW5jeSA9IDExOwogCiAgIC8vIEFsbCB0b3AtbGV2ZWwgZGVmaW5pdGlvbnMgaW4gdGhpcyBmaWxlLgogICByZXBlYXRlZCBEZXNjcmlwdG9yUHJvdG8gbWVzc2FnZV90eXBlID0gNDsKQEAgLTY5LDEwICs3OCwxNCBAQAogICBvcHRpb25hbCBGaWxlT3B0aW9ucyBvcHRpb25zID0gODsKIAogICAvLyBUaGlzIGZpZWxkIGNvbnRhaW5zIG9wdGlvbmFsIGluZm9ybWF0aW9uIGFib3V0IHRoZSBvcmlnaW5hbCBzb3VyY2UgY29kZS4KLSAgLy8gWW91IG1heSBzYWZlbHkgcmVtb3ZlIHRoaXMgZW50aXJlIGZpZWxkIHdoaXRob3V0IGhhcm1pbmcgcnVudGltZQorICAvLyBZb3UgbWF5IHNhZmVseSByZW1vdmUgdGhpcyBlbnRpcmUgZmllbGQgd2l0aG91dCBoYXJtaW5nIHJ1bnRpbWUKICAgLy8gZnVuY3Rpb25hbGl0eSBvZiB0aGUgZGVzY3JpcHRvcnMgLS0gdGhlIGluZm9ybWF0aW9uIGlzIG5lZWRlZCBvbmx5IGJ5CiAgIC8vIGRldmVsb3BtZW50IHRvb2xzLgogICBvcHRpb25hbCBTb3VyY2VDb2RlSW5mbyBzb3VyY2VfY29kZV9pbmZvID0gOTsKKworICAvLyBUaGUgc3ludGF4IG9mIHRoZSBwcm90byBmaWxlLgorICAvLyBUaGUgc3VwcG9ydGVkIHZhbHVlcyBhcmUgInByb3RvMiIgYW5kICJwcm90bzMiLgorICBvcHRpb25hbCBzdHJpbmcgc3ludGF4ID0gMTI7CiB9CiAKIC8vIERlc2NyaWJlcyBhIG1lc3NhZ2UgdHlwZS4KQEAgLTkxLDcgKzEwNCwyMSBAQAogICB9CiAgIHJlcGVhdGVkIEV4dGVuc2lvblJhbmdlIGV4dGVuc2lvbl9yYW5nZSA9IDU7CiAKKyAgcmVwZWF0ZWQgT25lb2ZEZXNjcmlwdG9yUHJvdG8gb25lb2ZfZGVjbCA9IDg7CisKICAgb3B0aW9uYWwgTWVzc2FnZU9wdGlvbnMgb3B0aW9ucyA9IDc7CisKKyAgLy8gUmFuZ2Ugb2YgcmVzZXJ2ZWQgdGFnIG51bWJlcnMuIFJlc2VydmVkIHRhZyBudW1iZXJzIG1heSBub3QgYmUgdXNlZCBieQorICAvLyBmaWVsZHMgb3IgZXh0ZW5zaW9uIHJhbmdlcyBpbiB0aGUgc2FtZSBtZXNzYWdlLiBSZXNlcnZlZCByYW5nZXMgbWF5CisgIC8vIG5vdCBvdmVybGFwLgorICBtZXNzYWdlIFJlc2VydmVkUmFuZ2UgeworICAgIG9wdGlvbmFsIGludDMyIHN0YXJ0ID0gMTsgLy8gSW5jbHVzaXZlLgorICAgIG9wdGlvbmFsIGludDMyIGVuZCA9IDI7ICAgLy8gRXhjbHVzaXZlLgorICB9CisgIHJlcGVhdGVkIFJlc2VydmVkUmFuZ2UgcmVzZXJ2ZWRfcmFuZ2UgPSA5OworICAvLyBSZXNlcnZlZCBmaWVsZCBuYW1lcywgd2hpY2ggbWF5IG5vdCBiZSB1c2VkIGJ5IGZpZWxkcyBpbiB0aGUgc2FtZSBtZXNzYWdlLgorICAvLyBBIGdpdmVuIG5hbWUgbWF5IG9ubHkgYmUgcmVzZXJ2ZWQgb25jZS4KKyAgcmVwZWF0ZWQgc3RyaW5nIHJlc2VydmVkX25hbWUgPSAxMDsKIH0KIAogLy8gRGVzY3JpYmVzIGEgZmllbGQgd2l0aGluIGEgbWVzc2FnZS4KQEAgLTEwMSwxMyArMTI4LDEzIEBACiAgICAgLy8gT3JkZXIgaXMgd2VpcmQgZm9yIGhpc3RvcmljYWwgcmVhc29ucy4KICAgICBUWVBFX0RPVUJMRSAgICAgICAgID0gMTsKICAgICBUWVBFX0ZMT0FUICAgICAgICAgID0gMjsKLSAgICBUWVBFX0lOVDY0ICAgICAgICAgID0gMzsgICAvLyBOb3QgWmlnWmFnIGVuY29kZWQuICBOZWdhdGl2ZSBudW1iZXJzCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQ2NCBpZiBuZWdhdGl2ZQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZhbHVlcyBhcmUgbGlrZWx5LgorICAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMgdGFrZSAxMCBieXRlcy4gIFVzZSBUWVBFX1NJTlQ2NCBpZgorICAgIC8vIG5lZ2F0aXZlIHZhbHVlcyBhcmUgbGlrZWx5LgorICAgIFRZUEVfSU5UNjQgICAgICAgICAgPSAzOwogICAgIFRZUEVfVUlOVDY0ICAgICAgICAgPSA0OwotICAgIFRZUEVfSU5UMzIgICAgICAgICAgPSA1OyAgIC8vIE5vdCBaaWdaYWcgZW5jb2RlZC4gIE5lZ2F0aXZlIG51bWJlcnMKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDMyIGlmIG5lZ2F0aXZlCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgLy8gTm90IFppZ1phZyBlbmNvZGVkLiAgTmVnYXRpdmUgbnVtYmVycyB0YWtlIDEwIGJ5dGVzLiAgVXNlIFRZUEVfU0lOVDMyIGlmCisgICAgLy8gbmVnYXRpdmUgdmFsdWVzIGFyZSBsaWtlbHkuCisgICAgVFlQRV9JTlQzMiAgICAgICAgICA9IDU7CiAgICAgVFlQRV9GSVhFRDY0ICAgICAgICA9IDY7CiAgICAgVFlQRV9GSVhFRDMyICAgICAgICA9IDc7CiAgICAgVFlQRV9CT09MICAgICAgICAgICA9IDg7CkBAIC0xMzgsNyArMTY1LDcgQEAKICAgb3B0aW9uYWwgTGFiZWwgbGFiZWwgPSA0OwogCiAgIC8vIElmIHR5cGVfbmFtZSBpcyBzZXQsIHRoaXMgbmVlZCBub3QgYmUgc2V0LiAgSWYgYm90aCB0aGlzIGFuZCB0eXBlX25hbWUKLSAgLy8gYXJlIHNldCwgdGhpcyBtdXN0IGJlIGVpdGhlciBUWVBFX0VOVU0gb3IgVFlQRV9NRVNTQUdFLgorICAvLyBhcmUgc2V0LCB0aGlzIG11c3QgYmUgb25lIG9mIFRZUEVfRU5VTSwgVFlQRV9NRVNTQUdFIG9yIFRZUEVfR1JPVVAuCiAgIG9wdGlvbmFsIFR5cGUgdHlwZSA9IDU7CiAKICAgLy8gRm9yIG1lc3NhZ2UgYW5kIGVudW0gdHlwZXMsIHRoaXMgaXMgdGhlIG5hbWUgb2YgdGhlIHR5cGUuICBJZiB0aGUgbmFtZQpAQCAtMTU5LDkgKzE4NiwyNCBAQAogICAvLyBUT0RPKGtlbnRvbik6ICBCYXNlLTY0IGVuY29kZT8KICAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfdmFsdWUgPSA3OwogCisgIC8vIElmIHNldCwgZ2l2ZXMgdGhlIGluZGV4IG9mIGEgb25lb2YgaW4gdGhlIGNvbnRhaW5pbmcgdHlwZSdzIG9uZW9mX2RlY2wKKyAgLy8gbGlzdC4gIFRoaXMgZmllbGQgaXMgYSBtZW1iZXIgb2YgdGhhdCBvbmVvZi4KKyAgb3B0aW9uYWwgaW50MzIgb25lb2ZfaW5kZXggPSA5OworCisgIC8vIEpTT04gbmFtZSBvZiB0aGlzIGZpZWxkLiBUaGUgdmFsdWUgaXMgc2V0IGJ5IHByb3RvY29sIGNvbXBpbGVyLiBJZiB0aGUKKyAgLy8gdXNlciBoYXMgc2V0IGEgImpzb25fbmFtZSIgb3B0aW9uIG9uIHRoaXMgZmllbGQsIHRoYXQgb3B0aW9uJ3MgdmFsdWUKKyAgLy8gd2lsbCBiZSB1c2VkLiBPdGhlcndpc2UsIGl0J3MgZGVkdWNlZCBmcm9tIHRoZSBmaWVsZCdzIG5hbWUgYnkgY29udmVydGluZworICAvLyBpdCB0byBjYW1lbENhc2UuCisgIG9wdGlvbmFsIHN0cmluZyBqc29uX25hbWUgPSAxMDsKKwogICBvcHRpb25hbCBGaWVsZE9wdGlvbnMgb3B0aW9ucyA9IDg7CiB9CiAKKy8vIERlc2NyaWJlcyBhIG9uZW9mLgorbWVzc2FnZSBPbmVvZkRlc2NyaXB0b3JQcm90byB7CisgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKK30KKwogLy8gRGVzY3JpYmVzIGFuIGVudW0gdHlwZS4KIG1lc3NhZ2UgRW51bURlc2NyaXB0b3JQcm90byB7CiAgIG9wdGlvbmFsIHN0cmluZyBuYW1lID0gMTsKQEAgLTE5Nyw4ICsyMzksMTQgQEAKICAgb3B0aW9uYWwgc3RyaW5nIG91dHB1dF90eXBlID0gMzsKIAogICBvcHRpb25hbCBNZXRob2RPcHRpb25zIG9wdGlvbnMgPSA0OworCisgIC8vIElkZW50aWZpZXMgaWYgY2xpZW50IHN0cmVhbXMgbXVsdGlwbGUgY2xpZW50IG1lc3NhZ2VzCisgIG9wdGlvbmFsIGJvb2wgY2xpZW50X3N0cmVhbWluZyA9IDUgW2RlZmF1bHQ9ZmFsc2VdOworICAvLyBJZGVudGlmaWVzIGlmIHNlcnZlciBzdHJlYW1zIG11bHRpcGxlIHNlcnZlciBtZXNzYWdlcworICBvcHRpb25hbCBib29sIHNlcnZlcl9zdHJlYW1pbmcgPSA2IFtkZWZhdWx0PWZhbHNlXTsKIH0KIAorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBPcHRpb25zCiAKQEAgLTIyMiwxMiArMjcwLDEyIEBACiAvLyAqIEZvciBvcHRpb25zIHdoaWNoIHdpbGwgYmUgcHVibGlzaGVkIGFuZCB1c2VkIHB1YmxpY2x5IGJ5IG11bHRpcGxlCiAvLyAgIGluZGVwZW5kZW50IGVudGl0aWVzLCBlLW1haWwgcHJvdG9idWYtZ2xvYmFsLWV4dGVuc2lvbi1yZWdpc3RyeUBnb29nbGUuY29tCiAvLyAgIHRvIHJlc2VydmUgZXh0ZW5zaW9uIG51bWJlcnMuIFNpbXBseSBwcm92aWRlIHlvdXIgcHJvamVjdCBuYW1lIChlLmcuCi0vLyAgIE9iamVjdC1DIHBsdWdpbikgYW5kIHlvdXIgcG9yamVjdCB3ZWJzaXRlIChpZiBhdmFpbGFibGUpIC0tIHRoZXJlJ3Mgbm8gbmVlZAotLy8gICB0byBleHBsYWluIGhvdyB5b3UgaW50ZW5kIHRvIHVzZSB0aGVtLiBVc3VhbGx5IHlvdSBvbmx5IG5lZWQgb25lIGV4dGVuc2lvbgotLy8gICBudW1iZXIuIFlvdSBjYW4gZGVjbGFyZSBtdWx0aXBsZSBvcHRpb25zIHdpdGggb25seSBvbmUgZXh0ZW5zaW9uIG51bWJlciBieQotLy8gICBwdXR0aW5nIHRoZW0gaW4gYSBzdWItbWVzc2FnZS4gU2VlIHRoZSBDdXN0b20gT3B0aW9ucyBzZWN0aW9uIG9mIHRoZSBkb2NzCi0vLyAgIGZvciBleGFtcGxlczoKLS8vICAgaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9hcGlzL3Byb3RvY29sYnVmZmVycy9kb2NzL3Byb3RvLmh0bWwjb3B0aW9ucworLy8gICBPYmplY3RpdmUtQyBwbHVnaW4pIGFuZCB5b3VyIHByb2plY3Qgd2Vic2l0ZSAoaWYgYXZhaWxhYmxlKSAtLSB0aGVyZSdzIG5vCisvLyAgIG5lZWQgdG8gZXhwbGFpbiBob3cgeW91IGludGVuZCB0byB1c2UgdGhlbS4gVXN1YWxseSB5b3Ugb25seSBuZWVkIG9uZQorLy8gICBleHRlbnNpb24gbnVtYmVyLiBZb3UgY2FuIGRlY2xhcmUgbXVsdGlwbGUgb3B0aW9ucyB3aXRoIG9ubHkgb25lIGV4dGVuc2lvbgorLy8gICBudW1iZXIgYnkgcHV0dGluZyB0aGVtIGluIGEgc3ViLW1lc3NhZ2UuIFNlZSB0aGUgQ3VzdG9tIE9wdGlvbnMgc2VjdGlvbiBvZgorLy8gICB0aGUgZG9jcyBmb3IgZXhhbXBsZXM6CisvLyAgIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvZG9jcy9wcm90byNvcHRpb25zCiAvLyAgIElmIHRoaXMgdHVybnMgb3V0IHRvIGJlIHBvcHVsYXIsIGEgd2ViIHNlcnZpY2Ugd2lsbCBiZSBzZXQgdXAKIC8vICAgdG8gYXV0b21hdGljYWxseSBhc3NpZ24gb3B0aW9uIG51bWJlcnMuCiAKQEAgLTI1NiwxOCArMzA0LDI5IEBACiAgIC8vIHRvcC1sZXZlbCBleHRlbnNpb25zIGRlZmluZWQgaW4gdGhlIGZpbGUuCiAgIG9wdGlvbmFsIGJvb2wgamF2YV9tdWx0aXBsZV9maWxlcyA9IDEwIFtkZWZhdWx0PWZhbHNlXTsKIAotICAvLyBJZiBzZXQgdHJ1ZSwgdGhlbiBjb2RlIGdlbmVyYXRvcnMgd2lsbCBzdG9yZSB1bmtub3duIGZpZWxkcyBzbyB0aGF0Ci0gIC8vIHJlc2VyaWFsaXppbmcgYSBtZXNzYWdlIHdpbGwgcmV0YWluIHRoZW0uIFRoaXMgaXMgdGhlIGRlZmF1bHQgYmVoYXZpb3VyCi0gIC8vIHVubGVzcyBMSVRFX1JVTlRJTUUgaXMgc3BlY2lmaWVkLiBUaGVyZWZvcmUsIHRoaXMgb3B0aW9uIG9ubHkgbWFrZXMgc2Vuc2UKLSAgLy8gd2hlbiBMSVRFX1JVTlRJTUUgaXMgaW4gdXNlLgotICBvcHRpb25hbCBib29sIHJldGFpbl91bmtub3duX2ZpZWxkcyA9IDExIFtkZWZhdWx0PWZhbHNlXTsKLQogICAvLyBJZiBzZXQgdHJ1ZSwgdGhlbiB0aGUgSmF2YSBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGVxdWFscygpIGFuZAotICAvLyBoYXNoQ29kZSgpIG1ldGhvZHMgZm9yIGFsbCBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4gVGhpcyBpcwotICAvLyBwdXJlbHkgYSBzcGVlZCBvcHRpbWl6YXRpb24sIGFzIHRoZSBBYnN0cmFjdE1lc3NhZ2UgYmFzZSBjbGFzcyBpbmNsdWRlcwotICAvLyByZWZsZWN0aW9uLWJhc2VkIGltcGxlbWVudGF0aW9ucyBvZiB0aGVzZSBtZXRob2RzLgorICAvLyBoYXNoQ29kZSgpIG1ldGhvZHMgZm9yIGFsbCBtZXNzYWdlcyBkZWZpbmVkIGluIHRoZSAucHJvdG8gZmlsZS4KKyAgLy8gVGhpcyBpbmNyZWFzZXMgZ2VuZXJhdGVkIGNvZGUgc2l6ZSwgcG90ZW50aWFsbHkgc3Vic3RhbnRpYWxseSBmb3IgbGFyZ2UKKyAgLy8gcHJvdG9zLCB3aGljaCBtYXkgaGFybSBhIG1lbW9yeS1jb25zdHJhaW5lZCBhcHBsaWNhdGlvbi4KKyAgLy8gLSBJbiB0aGUgZnVsbCBydW50aW1lIHRoaXMgaXMgYSBzcGVlZCBvcHRpbWl6YXRpb24sIGFzIHRoZQorICAvLyBBYnN0cmFjdE1lc3NhZ2UgYmFzZSBjbGFzcyBpbmNsdWRlcyByZWZsZWN0aW9uLWJhc2VkIGltcGxlbWVudGF0aW9ucyBvZgorICAvLyB0aGVzZSBtZXRob2RzLgorICAvLyAtIEluIHRoZSBsaXRlIHJ1bnRpbWUsIHNldHRpbmcgdGhpcyBvcHRpb24gY2hhbmdlcyB0aGUgc2VtYW50aWNzIG9mCisgIC8vIGVxdWFscygpIGFuZCBoYXNoQ29kZSgpIHRvIG1vcmUgY2xvc2VseSBtYXRjaCB0aG9zZSBvZiB0aGUgZnVsbCBydW50aW1lOworICAvLyB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMgY29tcHV0ZSB0aGVpciByZXN1bHRzIGJhc2VkIG9uIGZpZWxkIHZhbHVlcyByYXRoZXIKKyAgLy8gdGhhbiBvYmplY3QgaWRlbnRpdHkuIChJbXBsZW1lbnRhdGlvbnMgc2hvdWxkIG5vdCBhc3N1bWUgdGhhdCBoYXNoY29kZXMKKyAgLy8gd2lsbCBiZSBjb25zaXN0ZW50IGFjcm9zcyBydW50aW1lcyBvciB2ZXJzaW9ucyBvZiB0aGUgcHJvdG9jb2wgY29tcGlsZXIuKQogICBvcHRpb25hbCBib29sIGphdmFfZ2VuZXJhdGVfZXF1YWxzX2FuZF9oYXNoID0gMjAgW2RlZmF1bHQ9ZmFsc2VdOwogCisgIC8vIElmIHNldCB0cnVlLCB0aGVuIHRoZSBKYXZhMiBjb2RlIGdlbmVyYXRvciB3aWxsIGdlbmVyYXRlIGNvZGUgdGhhdAorICAvLyB0aHJvd3MgYW4gZXhjZXB0aW9uIHdoZW5ldmVyIGFuIGF0dGVtcHQgaXMgbWFkZSB0byBhc3NpZ24gYSBub24tVVRGLTgKKyAgLy8gYnl0ZSBzZXF1ZW5jZSB0byBhIHN0cmluZyBmaWVsZC4KKyAgLy8gTWVzc2FnZSByZWZsZWN0aW9uIHdpbGwgZG8gdGhlIHNhbWUuCisgIC8vIEhvd2V2ZXIsIGFuIGV4dGVuc2lvbiBmaWVsZCBzdGlsbCBhY2NlcHRzIG5vbi1VVEYtOCBieXRlIHNlcXVlbmNlcy4KKyAgLy8gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBvbiB3aGVuIHVzZWQgd2l0aCB0aGUgbGl0ZSBydW50aW1lLgorICBvcHRpb25hbCBib29sIGphdmFfc3RyaW5nX2NoZWNrX3V0ZjggPSAyNyBbZGVmYXVsdD1mYWxzZV07CisKKwogICAvLyBHZW5lcmF0ZWQgY2xhc3NlcyBjYW4gYmUgb3B0aW1pemVkIGZvciBzcGVlZCBvciBjb2RlIHNpemUuCiAgIGVudW0gT3B0aW1pemVNb2RlIHsKICAgICBTUEVFRCA9IDE7ICAgICAgICAvLyBHZW5lcmF0ZSBjb21wbGV0ZSBjb2RlIGZvciBwYXJzaW5nLCBzZXJpYWxpemF0aW9uLApAQCAtMjc3LDYgKzMzNiwxMiBAQAogICB9CiAgIG9wdGlvbmFsIE9wdGltaXplTW9kZSBvcHRpbWl6ZV9mb3IgPSA5IFtkZWZhdWx0PVNQRUVEXTsKIAorICAvLyBTZXRzIHRoZSBHbyBwYWNrYWdlIHdoZXJlIHN0cnVjdHMgZ2VuZXJhdGVkIGZyb20gdGhpcyAucHJvdG8gd2lsbCBiZQorICAvLyBwbGFjZWQuIElmIG9taXR0ZWQsIHRoZSBHbyBwYWNrYWdlIHdpbGwgYmUgZGVyaXZlZCBmcm9tIHRoZSBmb2xsb3dpbmc6CisgIC8vICAgLSBUaGUgYmFzZW5hbWUgb2YgdGhlIHBhY2thZ2UgaW1wb3J0IHBhdGgsIGlmIHByb3ZpZGVkLgorICAvLyAgIC0gT3RoZXJ3aXNlLCB0aGUgcGFja2FnZSBzdGF0ZW1lbnQgaW4gdGhlIC5wcm90byBmaWxlLCBpZiBwcmVzZW50LgorICAvLyAgIC0gT3RoZXJ3aXNlLCB0aGUgYmFzZW5hbWUgb2YgdGhlIC5wcm90byBmaWxlLCB3aXRob3V0IGV4dGVuc2lvbi4KKyAgb3B0aW9uYWwgc3RyaW5nIGdvX3BhY2thZ2UgPSAxMTsKIAogCiAKQEAgLTI4NCw3ICszNDksNyBAQAogICAvLyBhcmUgbm90IHNwZWNpZmljIHRvIGFueSBwYXJ0aWN1bGFyIFJQQyBzeXN0ZW0uICBUaGV5IGFyZSBnZW5lcmF0ZWQgYnkgdGhlCiAgIC8vIG1haW4gY29kZSBnZW5lcmF0b3JzIGluIGVhY2ggbGFuZ3VhZ2UgKHdpdGhvdXQgYWRkaXRpb25hbCBwbHVnaW5zKS4KICAgLy8gR2VuZXJpYyBzZXJ2aWNlcyB3ZXJlIHRoZSBvbmx5IGtpbmQgb2Ygc2VydmljZSBnZW5lcmF0aW9uIHN1cHBvcnRlZCBieQotICAvLyBlYXJseSB2ZXJzaW9ucyBvZiBwcm90bzIuCisgIC8vIGVhcmx5IHZlcnNpb25zIG9mIGdvb2dsZS5wcm90b2J1Zi4KICAgLy8KICAgLy8gR2VuZXJpYyBzZXJ2aWNlcyBhcmUgbm93IGNvbnNpZGVyZWQgZGVwcmVjYXRlZCBpbiBmYXZvciBvZiB1c2luZyBwbHVnaW5zCiAgIC8vIHRoYXQgZ2VuZXJhdGUgY29kZSBzcGVjaWZpYyB0byB5b3VyIHBhcnRpY3VsYXIgUlBDIHN5c3RlbS4gIFRoZXJlZm9yZSwKQEAgLTI5NCwxMSArMzU5LDMxIEBACiAgIG9wdGlvbmFsIGJvb2wgamF2YV9nZW5lcmljX3NlcnZpY2VzID0gMTcgW2RlZmF1bHQ9ZmFsc2VdOwogICBvcHRpb25hbCBib29sIHB5X2dlbmVyaWNfc2VydmljZXMgPSAxOCBbZGVmYXVsdD1mYWxzZV07CiAKKyAgLy8gSXMgdGhpcyBmaWxlIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIGV2ZXJ5dGhpbmcgaW4gdGhlIGZpbGUsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeQorICAvLyBsZWFzdCwgdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpbGVzLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAyMyBbZGVmYXVsdD1mYWxzZV07CisKKyAgLy8gRW5hYmxlcyB0aGUgdXNlIG9mIGFyZW5hcyBmb3IgdGhlIHByb3RvIG1lc3NhZ2VzIGluIHRoaXMgZmlsZS4gVGhpcyBhcHBsaWVzCisgIC8vIG9ubHkgdG8gZ2VuZXJhdGVkIGNsYXNzZXMgZm9yIEMrKy4KKyAgb3B0aW9uYWwgYm9vbCBjY19lbmFibGVfYXJlbmFzID0gMzEgW2RlZmF1bHQ9ZmFsc2VdOworCisKKyAgLy8gU2V0cyB0aGUgb2JqZWN0aXZlIGMgY2xhc3MgcHJlZml4IHdoaWNoIGlzIHByZXBlbmRlZCB0byBhbGwgb2JqZWN0aXZlIGMKKyAgLy8gZ2VuZXJhdGVkIGNsYXNzZXMgZnJvbSB0aGlzIC5wcm90by4gVGhlcmUgaXMgbm8gZGVmYXVsdC4KKyAgb3B0aW9uYWwgc3RyaW5nIG9iamNfY2xhc3NfcHJlZml4ID0gMzY7CisKKyAgLy8gTmFtZXNwYWNlIGZvciBnZW5lcmF0ZWQgY2xhc3NlczsgZGVmYXVsdHMgdG8gdGhlIHBhY2thZ2UuCisgIG9wdGlvbmFsIHN0cmluZyBjc2hhcnBfbmFtZXNwYWNlID0gMzc7CisKICAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCiAgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAKICAgLy8gQ2xpZW50cyBjYW4gZGVmaW5lIGN1c3RvbSBvcHRpb25zIGluIGV4dGVuc2lvbnMgb2YgdGhpcyBtZXNzYWdlLiBTZWUgYWJvdmUuCiAgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7CisKKyAgcmVzZXJ2ZWQgMzg7CiB9CiAKIG1lc3NhZ2UgTWVzc2FnZU9wdGlvbnMgewpAQCAtMzI3LDYgKzQxMiwzNSBAQAogICAvLyBmcm9tIHByb3RvMSBlYXNpZXI7IG5ldyBjb2RlIHNob3VsZCBhdm9pZCBmaWVsZHMgbmFtZWQgImRlc2NyaXB0b3IiLgogICBvcHRpb25hbCBib29sIG5vX3N0YW5kYXJkX2Rlc2NyaXB0b3JfYWNjZXNzb3IgPSAyIFtkZWZhdWx0PWZhbHNlXTsKIAorICAvLyBJcyB0aGlzIG1lc3NhZ2UgZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgdGhlIG1lc3NhZ2UsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwKKyAgLy8gdGhpcyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIG1lc3NhZ2VzLgorICBvcHRpb25hbCBib29sIGRlcHJlY2F0ZWQgPSAzIFtkZWZhdWx0PWZhbHNlXTsKKworICAvLyBXaGV0aGVyIHRoZSBtZXNzYWdlIGlzIGFuIGF1dG9tYXRpY2FsbHkgZ2VuZXJhdGVkIG1hcCBlbnRyeSB0eXBlIGZvciB0aGUKKyAgLy8gbWFwcyBmaWVsZC4KKyAgLy8KKyAgLy8gRm9yIG1hcHMgZmllbGRzOgorICAvLyAgICAgbWFwPEtleVR5cGUsIFZhbHVlVHlwZT4gbWFwX2ZpZWxkID0gMTsKKyAgLy8gVGhlIHBhcnNlZCBkZXNjcmlwdG9yIGxvb2tzIGxpa2U6CisgIC8vICAgICBtZXNzYWdlIE1hcEZpZWxkRW50cnkgeworICAvLyAgICAgICAgIG9wdGlvbiBtYXBfZW50cnkgPSB0cnVlOworICAvLyAgICAgICAgIG9wdGlvbmFsIEtleVR5cGUga2V5ID0gMTsKKyAgLy8gICAgICAgICBvcHRpb25hbCBWYWx1ZVR5cGUgdmFsdWUgPSAyOworICAvLyAgICAgfQorICAvLyAgICAgcmVwZWF0ZWQgTWFwRmllbGRFbnRyeSBtYXBfZmllbGQgPSAxOworICAvLworICAvLyBJbXBsZW1lbnRhdGlvbnMgbWF5IGNob29zZSBub3QgdG8gZ2VuZXJhdGUgdGhlIG1hcF9lbnRyeT10cnVlIG1lc3NhZ2UsIGJ1dAorICAvLyB1c2UgYSBuYXRpdmUgbWFwIGluIHRoZSB0YXJnZXQgbGFuZ3VhZ2UgdG8gaG9sZCB0aGUga2V5cyBhbmQgdmFsdWVzLgorICAvLyBUaGUgcmVmbGVjdGlvbiBBUElzIGluIHN1Y2ggaW1wbGVtZW50aW9ucyBzdGlsbCBuZWVkIHRvIHdvcmsgYXMKKyAgLy8gaWYgdGhlIGZpZWxkIGlzIGEgcmVwZWF0ZWQgbWVzc2FnZSBmaWVsZC4KKyAgLy8KKyAgLy8gTk9URTogRG8gbm90IHNldCB0aGUgb3B0aW9uIGluIC5wcm90byBmaWxlcy4gQWx3YXlzIHVzZSB0aGUgbWFwcyBzeW50YXgKKyAgLy8gaW5zdGVhZC4gVGhlIG9wdGlvbiBzaG91bGQgb25seSBiZSBpbXBsaWNpdGx5IHNldCBieSB0aGUgcHJvdG8gY29tcGlsZXIKKyAgLy8gcGFyc2VyLgorICBvcHRpb25hbCBib29sIG1hcF9lbnRyeSA9IDc7CisKICAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCiAgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAKQEAgLTM1MSwyOSArNDY1LDcxIEBACiAgIC8vIFRoZSBwYWNrZWQgb3B0aW9uIGNhbiBiZSBlbmFibGVkIGZvciByZXBlYXRlZCBwcmltaXRpdmUgZmllbGRzIHRvIGVuYWJsZQogICAvLyBhIG1vcmUgZWZmaWNpZW50IHJlcHJlc2VudGF0aW9uIG9uIHRoZSB3aXJlLiBSYXRoZXIgdGhhbiByZXBlYXRlZGx5CiAgIC8vIHdyaXRpbmcgdGhlIHRhZyBhbmQgdHlwZSBmb3IgZWFjaCBlbGVtZW50LCB0aGUgZW50aXJlIGFycmF5IGlzIGVuY29kZWQgYXMKLSAgLy8gYSBzaW5nbGUgbGVuZ3RoLWRlbGltaXRlZCBibG9iLgorICAvLyBhIHNpbmdsZSBsZW5ndGgtZGVsaW1pdGVkIGJsb2IuIEluIHByb3RvMywgb25seSBleHBsaWNpdCBzZXR0aW5nIGl0IHRvCisgIC8vIGZhbHNlIHdpbGwgYXZvaWQgdXNpbmcgcGFja2VkIGVuY29kaW5nLgogICBvcHRpb25hbCBib29sIHBhY2tlZCA9IDI7CiAKIAorICAvLyBUaGUganN0eXBlIG9wdGlvbiBkZXRlcm1pbmVzIHRoZSBKYXZhU2NyaXB0IHR5cGUgdXNlZCBmb3IgdmFsdWVzIG9mIHRoZQorICAvLyBmaWVsZC4gIFRoZSBvcHRpb24gaXMgcGVybWl0dGVkIG9ubHkgZm9yIDY0IGJpdCBpbnRlZ3JhbCBhbmQgZml4ZWQgdHlwZXMKKyAgLy8gKGludDY0LCB1aW50NjQsIHNpbnQ2NCwgZml4ZWQ2NCwgc2ZpeGVkNjQpLiAgQnkgZGVmYXVsdCB0aGVzZSB0eXBlcyBhcmUKKyAgLy8gcmVwcmVzZW50ZWQgYXMgSmF2YVNjcmlwdCBzdHJpbmdzLiAgVGhpcyBhdm9pZHMgbG9zcyBvZiBwcmVjaXNpb24gdGhhdCBjYW4KKyAgLy8gaGFwcGVuIHdoZW4gYSBsYXJnZSB2YWx1ZSBpcyBjb252ZXJ0ZWQgdG8gYSBmbG9hdGluZyBwb2ludCBKYXZhU2NyaXB0CisgIC8vIG51bWJlcnMuICBTcGVjaWZ5aW5nIEpTX05VTUJFUiBmb3IgdGhlIGpzdHlwZSBjYXVzZXMgdGhlIGdlbmVyYXRlZAorICAvLyBKYXZhU2NyaXB0IGNvZGUgdG8gdXNlIHRoZSBKYXZhU2NyaXB0ICJudW1iZXIiIHR5cGUgaW5zdGVhZCBvZiBzdHJpbmdzLgorICAvLyBUaGlzIG9wdGlvbiBpcyBhbiBlbnVtIHRvIHBlcm1pdCBhZGRpdGlvbmFsIHR5cGVzIHRvIGJlIGFkZGVkLAorICAvLyBlLmcuIGdvb2cubWF0aC5JbnRlZ2VyLgorICBvcHRpb25hbCBKU1R5cGUganN0eXBlID0gNiBbZGVmYXVsdCA9IEpTX05PUk1BTF07CisgIGVudW0gSlNUeXBlIHsKKyAgICAvLyBVc2UgdGhlIGRlZmF1bHQgdHlwZS4KKyAgICBKU19OT1JNQUwgPSAwOworCisgICAgLy8gVXNlIEphdmFTY3JpcHQgc3RyaW5ncy4KKyAgICBKU19TVFJJTkcgPSAxOworCisgICAgLy8gVXNlIEphdmFTY3JpcHQgbnVtYmVycy4KKyAgICBKU19OVU1CRVIgPSAyOworICB9CisKKyAgLy8gU2hvdWxkIHRoaXMgZmllbGQgYmUgcGFyc2VkIGxhemlseT8gIExhenkgYXBwbGllcyBvbmx5IHRvIG1lc3NhZ2UtdHlwZQorICAvLyBmaWVsZHMuICBJdCBtZWFucyB0aGF0IHdoZW4gdGhlIG91dGVyIG1lc3NhZ2UgaXMgaW5pdGlhbGx5IHBhcnNlZCwgdGhlCisgIC8vIGlubmVyIG1lc3NhZ2UncyBjb250ZW50cyB3aWxsIG5vdCBiZSBwYXJzZWQgYnV0IGluc3RlYWQgc3RvcmVkIGluIGVuY29kZWQKKyAgLy8gZm9ybS4gIFRoZSBpbm5lciBtZXNzYWdlIHdpbGwgYWN0dWFsbHkgYmUgcGFyc2VkIHdoZW4gaXQgaXMgZmlyc3QgYWNjZXNzZWQuCisgIC8vCisgIC8vIFRoaXMgaXMgb25seSBhIGhpbnQuICBJbXBsZW1lbnRhdGlvbnMgYXJlIGZyZWUgdG8gY2hvb3NlIHdoZXRoZXIgdG8gdXNlCisgIC8vIGVhZ2VyIG9yIGxhenkgcGFyc2luZyByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGlzIG9wdGlvbi4gIEhvd2V2ZXIsCisgIC8vIHNldHRpbmcgdGhpcyBvcHRpb24gdHJ1ZSBzdWdnZXN0cyB0aGF0IHRoZSBwcm90b2NvbCBhdXRob3IgYmVsaWV2ZXMgdGhhdAorICAvLyB1c2luZyBsYXp5IHBhcnNpbmcgb24gdGhpcyBmaWVsZCBpcyB3b3J0aCB0aGUgYWRkaXRpb25hbCBib29ra2VlcGluZworICAvLyBvdmVyaGVhZCB0eXBpY2FsbHkgbmVlZGVkIHRvIGltcGxlbWVudCBpdC4KKyAgLy8KKyAgLy8gVGhpcyBvcHRpb24gZG9lcyBub3QgYWZmZWN0IHRoZSBwdWJsaWMgaW50ZXJmYWNlIG9mIGFueSBnZW5lcmF0ZWQgY29kZTsKKyAgLy8gYWxsIG1ldGhvZCBzaWduYXR1cmVzIHJlbWFpbiB0aGUgc2FtZS4gIEZ1cnRoZXJtb3JlLCB0aHJlYWQtc2FmZXR5IG9mIHRoZQorICAvLyBpbnRlcmZhY2UgaXMgbm90IGFmZmVjdGVkIGJ5IHRoaXMgb3B0aW9uOyBjb25zdCBtZXRob2RzIHJlbWFpbiBzYWZlIHRvCisgIC8vIGNhbGwgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIGNvbmN1cnJlbnRseSwgd2hpbGUgbm9uLWNvbnN0IG1ldGhvZHMgY29udGludWUKKyAgLy8gdG8gcmVxdWlyZSBleGNsdXNpdmUgYWNjZXNzLgorICAvLworICAvLworICAvLyBOb3RlIHRoYXQgaW1wbGVtZW50YXRpb25zIG1heSBjaG9vc2Ugbm90IHRvIGNoZWNrIHJlcXVpcmVkIGZpZWxkcyB3aXRoaW4KKyAgLy8gYSBsYXp5IHN1Yi1tZXNzYWdlLiAgVGhhdCBpcywgY2FsbGluZyBJc0luaXRpYWxpemVkKCkgb24gdGhlIG91dGhlciBtZXNzYWdlCisgIC8vIG1heSByZXR1cm4gdHJ1ZSBldmVuIGlmIHRoZSBpbm5lciBtZXNzYWdlIGhhcyBtaXNzaW5nIHJlcXVpcmVkIGZpZWxkcy4KKyAgLy8gVGhpcyBpcyBuZWNlc3NhcnkgYmVjYXVzZSBvdGhlcndpc2UgdGhlIGlubmVyIG1lc3NhZ2Ugd291bGQgaGF2ZSB0byBiZQorICAvLyBwYXJzZWQgaW4gb3JkZXIgdG8gcGVyZm9ybSB0aGUgY2hlY2ssIGRlZmVhdGluZyB0aGUgcHVycG9zZSBvZiBsYXp5CisgIC8vIHBhcnNpbmcuICBBbiBpbXBsZW1lbnRhdGlvbiB3aGljaCBjaG9vc2VzIG5vdCB0byBjaGVjayByZXF1aXJlZCBmaWVsZHMKKyAgLy8gbXVzdCBiZSBjb25zaXN0ZW50IGFib3V0IGl0LiAgVGhhdCBpcywgZm9yIGFueSBwYXJ0aWN1bGFyIHN1Yi1tZXNzYWdlLCB0aGUKKyAgLy8gaW1wbGVtZW50YXRpb24gbXVzdCBlaXRoZXIgKmFsd2F5cyogY2hlY2sgaXRzIHJlcXVpcmVkIGZpZWxkcywgb3IgKm5ldmVyKgorICAvLyBjaGVjayBpdHMgcmVxdWlyZWQgZmllbGRzLCByZWdhcmRsZXNzIG9mIHdoZXRoZXIgb3Igbm90IHRoZSBtZXNzYWdlIGhhcworICAvLyBiZWVuIHBhcnNlZC4KKyAgb3B0aW9uYWwgYm9vbCBsYXp5ID0gNSBbZGVmYXVsdD1mYWxzZV07CisKICAgLy8gSXMgdGhpcyBmaWVsZCBkZXByZWNhdGVkPwogICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCiAgIC8vIGZvciBhY2Nlc3NvcnMsIG9yIGl0IHdpbGwgYmUgY29tcGxldGVseSBpZ25vcmVkOyBpbiB0aGUgdmVyeSBsZWFzdCwgdGhpcwogICAvLyBpcyBhIGZvcm1hbGl6YXRpb24gZm9yIGRlcHJlY2F0aW5nIGZpZWxkcy4KICAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdD1mYWxzZV07CiAKLSAgLy8gRVhQRVJJTUVOVEFMLiAgRE8gTk9UIFVTRS4KLSAgLy8gRm9yICJtYXAiIGZpZWxkcywgdGhlIG5hbWUgb2YgdGhlIGZpZWxkIGluIHRoZSBlbmNsb3NlZCB0eXBlIHRoYXQKLSAgLy8gaXMgdGhlIGtleSBmb3IgdGhpcyBtYXAuICBGb3IgZXhhbXBsZSwgc3VwcG9zZSB3ZSBoYXZlOgotICAvLyAgIG1lc3NhZ2UgSXRlbSB7Ci0gIC8vICAgICByZXF1aXJlZCBzdHJpbmcgbmFtZSA9IDE7Ci0gIC8vICAgICByZXF1aXJlZCBzdHJpbmcgdmFsdWUgPSAyOwotICAvLyAgIH0KLSAgLy8gICBtZXNzYWdlIENvbmZpZyB7Ci0gIC8vICAgICByZXBlYXRlZCBJdGVtIGl0ZW1zID0gMSBbZXhwZXJpbWVudGFsX21hcF9rZXk9Im5hbWUiXTsKLSAgLy8gICB9Ci0gIC8vIEluIHRoaXMgc2l0dWF0aW9uLCB0aGUgbWFwIGtleSBmb3IgSXRlbSB3aWxsIGJlIHNldCB0byAibmFtZSIuCi0gIC8vIFRPRE86IEZ1bGx5LWltcGxlbWVudCB0aGlzLCB0aGVuIHJlbW92ZSB0aGUgImV4cGVyaW1lbnRhbF8iIHByZWZpeC4KLSAgb3B0aW9uYWwgc3RyaW5nIGV4cGVyaW1lbnRhbF9tYXBfa2V5ID0gOTsKKyAgLy8gRm9yIEdvb2dsZS1pbnRlcm5hbCBtaWdyYXRpb24gb25seS4gRG8gbm90IHVzZS4KKyAgb3B0aW9uYWwgYm9vbCB3ZWFrID0gMTAgW2RlZmF1bHQ9ZmFsc2VdOworCiAKICAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCiAgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CkBAIC0zODQsNiArNTQwLDE2IEBACiAKIG1lc3NhZ2UgRW51bU9wdGlvbnMgewogCisgIC8vIFNldCB0aGlzIG9wdGlvbiB0byB0cnVlIHRvIGFsbG93IG1hcHBpbmcgZGlmZmVyZW50IHRhZyBuYW1lcyB0byB0aGUgc2FtZQorICAvLyB2YWx1ZS4KKyAgb3B0aW9uYWwgYm9vbCBhbGxvd19hbGlhcyA9IDI7CisKKyAgLy8gSXMgdGhpcyBlbnVtIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIHRoZSBlbnVtLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsIHRoaXMKKyAgLy8gaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBlbnVtcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMyBbZGVmYXVsdD1mYWxzZV07CisKICAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCiAgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAKQEAgLTM5Miw2ICs1NTgsMTIgQEAKIH0KIAogbWVzc2FnZSBFbnVtVmFsdWVPcHRpb25zIHsKKyAgLy8gSXMgdGhpcyBlbnVtIHZhbHVlIGRlcHJlY2F0ZWQ/CisgIC8vIERlcGVuZGluZyBvbiB0aGUgdGFyZ2V0IHBsYXRmb3JtLCB0aGlzIGNhbiBlbWl0IERlcHJlY2F0ZWQgYW5ub3RhdGlvbnMKKyAgLy8gZm9yIHRoZSBlbnVtIHZhbHVlLCBvciBpdCB3aWxsIGJlIGNvbXBsZXRlbHkgaWdub3JlZDsgaW4gdGhlIHZlcnkgbGVhc3QsCisgIC8vIHRoaXMgaXMgYSBmb3JtYWxpemF0aW9uIGZvciBkZXByZWNhdGluZyBlbnVtIHZhbHVlcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMSBbZGVmYXVsdD1mYWxzZV07CisKICAgLy8gVGhlIHBhcnNlciBzdG9yZXMgb3B0aW9ucyBpdCBkb2Vzbid0IHJlY29nbml6ZSBoZXJlLiBTZWUgYWJvdmUuCiAgIHJlcGVhdGVkIFVuaW50ZXJwcmV0ZWRPcHRpb24gdW5pbnRlcnByZXRlZF9vcHRpb24gPSA5OTk7CiAKQEAgLTQwNiw2ICs1NzgsMTIgQEAKICAgLy8gICB3ZSB3ZXJlIGFscmVhZHkgdXNpbmcgdGhlbSBsb25nIGJlZm9yZSB3ZSBkZWNpZGVkIHRvIHJlbGVhc2UgUHJvdG9jb2wKICAgLy8gICBCdWZmZXJzLgogCisgIC8vIElzIHRoaXMgc2VydmljZSBkZXByZWNhdGVkPworICAvLyBEZXBlbmRpbmcgb24gdGhlIHRhcmdldCBwbGF0Zm9ybSwgdGhpcyBjYW4gZW1pdCBEZXByZWNhdGVkIGFubm90YXRpb25zCisgIC8vIGZvciB0aGUgc2VydmljZSwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LAorICAvLyB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgc2VydmljZXMuCisgIG9wdGlvbmFsIGJvb2wgZGVwcmVjYXRlZCA9IDMzIFtkZWZhdWx0PWZhbHNlXTsKKwogICAvLyBUaGUgcGFyc2VyIHN0b3JlcyBvcHRpb25zIGl0IGRvZXNuJ3QgcmVjb2duaXplIGhlcmUuIFNlZSBhYm92ZS4KICAgcmVwZWF0ZWQgVW5pbnRlcnByZXRlZE9wdGlvbiB1bmludGVycHJldGVkX29wdGlvbiA9IDk5OTsKIApAQCAtNDIwLDYgKzU5OCwxMiBAQAogICAvLyAgIHdlIHdlcmUgYWxyZWFkeSB1c2luZyB0aGVtIGxvbmcgYmVmb3JlIHdlIGRlY2lkZWQgdG8gcmVsZWFzZSBQcm90b2NvbAogICAvLyAgIEJ1ZmZlcnMuCiAKKyAgLy8gSXMgdGhpcyBtZXRob2QgZGVwcmVjYXRlZD8KKyAgLy8gRGVwZW5kaW5nIG9uIHRoZSB0YXJnZXQgcGxhdGZvcm0sIHRoaXMgY2FuIGVtaXQgRGVwcmVjYXRlZCBhbm5vdGF0aW9ucworICAvLyBmb3IgdGhlIG1ldGhvZCwgb3IgaXQgd2lsbCBiZSBjb21wbGV0ZWx5IGlnbm9yZWQ7IGluIHRoZSB2ZXJ5IGxlYXN0LAorICAvLyB0aGlzIGlzIGEgZm9ybWFsaXphdGlvbiBmb3IgZGVwcmVjYXRpbmcgbWV0aG9kcy4KKyAgb3B0aW9uYWwgYm9vbCBkZXByZWNhdGVkID0gMzMgW2RlZmF1bHQ9ZmFsc2VdOworCiAgIC8vIFRoZSBwYXJzZXIgc3RvcmVzIG9wdGlvbnMgaXQgZG9lc24ndCByZWNvZ25pemUgaGVyZS4gU2VlIGFib3ZlLgogICByZXBlYXRlZCBVbmludGVycHJldGVkT3B0aW9uIHVuaW50ZXJwcmV0ZWRfb3B0aW9uID0gOTk5OwogCkBAIC00MjcsNiArNjExLDcgQEAKICAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKIH0KIAorCiAvLyBBIG1lc3NhZ2UgcmVwcmVzZW50aW5nIGEgb3B0aW9uIHRoZSBwYXJzZXIgZG9lcyBub3QgcmVjb2duaXplLiBUaGlzIG9ubHkKIC8vIGFwcGVhcnMgaW4gb3B0aW9ucyBwcm90b3MgY3JlYXRlZCBieSB0aGUgY29tcGlsZXI6OlBhcnNlciBjbGFzcy4KIC8vIERlc2NyaXB0b3JQb29sIHJlc29sdmVzIHRoZXNlIHdoZW4gYnVpbGRpbmcgRGVzY3JpcHRvciBvYmplY3RzLiBUaGVyZWZvcmUsCkBAIC01MzgsNyArNzIzLDgxIEBACiAgICAgLy8gMSB0byBlYWNoIGJlZm9yZSBkaXNwbGF5aW5nIHRvIGEgdXNlci4KICAgICByZXBlYXRlZCBpbnQzMiBzcGFuID0gMiBbcGFja2VkPXRydWVdOwogCi0gICAgLy8gVE9ETyhrZW50b24pOiAgUmVjb3JkIGNvbW1lbnRzIGFwcGVhcmluZyBiZWZvcmUgYW5kIGFmdGVyIHRoZQotICAgIC8vIGRlY2xhcmF0aW9uLgorICAgIC8vIElmIHRoaXMgU291cmNlQ29kZUluZm8gcmVwcmVzZW50cyBhIGNvbXBsZXRlIGRlY2xhcmF0aW9uLCB0aGVzZSBhcmUgYW55CisgICAgLy8gY29tbWVudHMgYXBwZWFyaW5nIGJlZm9yZSBhbmQgYWZ0ZXIgdGhlIGRlY2xhcmF0aW9uIHdoaWNoIGFwcGVhciB0byBiZQorICAgIC8vIGF0dGFjaGVkIHRvIHRoZSBkZWNsYXJhdGlvbi4KKyAgICAvLworICAgIC8vIEEgc2VyaWVzIG9mIGxpbmUgY29tbWVudHMgYXBwZWFyaW5nIG9uIGNvbnNlY3V0aXZlIGxpbmVzLCB3aXRoIG5vIG90aGVyCisgICAgLy8gdG9rZW5zIGFwcGVhcmluZyBvbiB0aG9zZSBsaW5lcywgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIGNvbW1lbnQuCisgICAgLy8KKyAgICAvLyBsZWFkaW5nX2RldGFjaGVkX2NvbW1lbnRzIHdpbGwga2VlcCBwYXJhZ3JhcGhzIG9mIGNvbW1lbnRzIHRoYXQgYXBwZWFyCisgICAgLy8gYmVmb3JlIChidXQgbm90IGNvbm5lY3RlZCB0bykgdGhlIGN1cnJlbnQgZWxlbWVudC4gRWFjaCBwYXJhZ3JhcGgsCisgICAgLy8gc2VwYXJhdGVkIGJ5IGVtcHR5IGxpbmVzLCB3aWxsIGJlIG9uZSBjb21tZW50IGVsZW1lbnQgaW4gdGhlIHJlcGVhdGVkCisgICAgLy8gZmllbGQuCisgICAgLy8KKyAgICAvLyBPbmx5IHRoZSBjb21tZW50IGNvbnRlbnQgaXMgcHJvdmlkZWQ7IGNvbW1lbnQgbWFya2VycyAoZS5nLiAvLykgYXJlCisgICAgLy8gc3RyaXBwZWQgb3V0LiAgRm9yIGJsb2NrIGNvbW1lbnRzLCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFuIGFzdGVyaXNrCisgICAgLy8gd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgZWFjaCBsaW5lIG90aGVyIHRoYW4gdGhlIGZpcnN0LgorICAgIC8vIE5ld2xpbmVzIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorICAgIC8vCisgICAgLy8gRXhhbXBsZXM6CisgICAgLy8KKyAgICAvLyAgIG9wdGlvbmFsIGludDMyIGZvbyA9IDE7ICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGZvby4KKyAgICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gYmFyLgorICAgIC8vICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKKyAgICAvLworICAgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGJheiA9IDM7CisgICAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KKyAgICAvLyAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBiYXouCisgICAgLy8KKyAgICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gcXV4LgorICAgIC8vICAgLy8KKyAgICAvLyAgIC8vIEFub3RoZXIgbGluZSBhdHRhY2hlZCB0byBxdXguCisgICAgLy8gICBvcHRpb25hbCBkb3VibGUgcXV4ID0gNDsKKyAgICAvLworICAgIC8vICAgLy8gRGV0YWNoZWQgY29tbWVudCBmb3IgY29yZ2UuIFRoaXMgaXMgbm90IGxlYWRpbmcgb3IgdHJhaWxpbmcgY29tbWVudHMKKyAgICAvLyAgIC8vIHRvIHF1eCBvciBjb3JnZSBiZWNhdXNlIHRoZXJlIGFyZSBibGFuayBsaW5lcyBzZXBhcmF0aW5nIGl0IGZyb20KKyAgICAvLyAgIC8vIGJvdGguCisgICAgLy8KKyAgICAvLyAgIC8vIERldGFjaGVkIGNvbW1lbnQgZm9yIGNvcmdlIHBhcmFncmFwaCAyLgorICAgIC8vCisgICAgLy8gICBvcHRpb25hbCBzdHJpbmcgY29yZ2UgPSA1OworICAgIC8vICAgLyogQmxvY2sgY29tbWVudCBhdHRhY2hlZAorICAgIC8vICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcworICAgIC8vICAgICogd2lsbCBiZSByZW1vdmVkLiAqLworICAgIC8vICAgLyogQmxvY2sgY29tbWVudCBhdHRhY2hlZCB0bworICAgIC8vICAgICogZ3JhdWx0LiAqLworICAgIC8vICAgb3B0aW9uYWwgaW50MzIgZ3JhdWx0ID0gNjsKKyAgICAvLworICAgIC8vICAgLy8gaWdub3JlZCBkZXRhY2hlZCBjb21tZW50cy4KKyAgICBvcHRpb25hbCBzdHJpbmcgbGVhZGluZ19jb21tZW50cyA9IDM7CisgICAgb3B0aW9uYWwgc3RyaW5nIHRyYWlsaW5nX2NvbW1lbnRzID0gNDsKKyAgICByZXBlYXRlZCBzdHJpbmcgbGVhZGluZ19kZXRhY2hlZF9jb21tZW50cyA9IDY7CisgIH0KK30KKworLy8gRGVzY3JpYmVzIHRoZSByZWxhdGlvbnNoaXAgYmV0d2VlbiBnZW5lcmF0ZWQgY29kZSBhbmQgaXRzIG9yaWdpbmFsIHNvdXJjZQorLy8gZmlsZS4gQSBHZW5lcmF0ZWRDb2RlSW5mbyBtZXNzYWdlIGlzIGFzc29jaWF0ZWQgd2l0aCBvbmx5IG9uZSBnZW5lcmF0ZWQKKy8vIHNvdXJjZSBmaWxlLCBidXQgbWF5IGNvbnRhaW4gcmVmZXJlbmNlcyB0byBkaWZmZXJlbnQgc291cmNlIC5wcm90byBmaWxlcy4KK21lc3NhZ2UgR2VuZXJhdGVkQ29kZUluZm8geworICAvLyBBbiBBbm5vdGF0aW9uIGNvbm5lY3RzIHNvbWUgc3BhbiBvZiB0ZXh0IGluIGdlbmVyYXRlZCBjb2RlIHRvIGFuIGVsZW1lbnQKKyAgLy8gb2YgaXRzIGdlbmVyYXRpbmcgLnByb3RvIGZpbGUuCisgIHJlcGVhdGVkIEFubm90YXRpb24gYW5ub3RhdGlvbiA9IDE7CisgIG1lc3NhZ2UgQW5ub3RhdGlvbiB7CisgICAgLy8gSWRlbnRpZmllcyB0aGUgZWxlbWVudCBpbiB0aGUgb3JpZ2luYWwgc291cmNlIC5wcm90byBmaWxlLiBUaGlzIGZpZWxkCisgICAgLy8gaXMgZm9ybWF0dGVkIHRoZSBzYW1lIGFzIFNvdXJjZUNvZGVJbmZvLkxvY2F0aW9uLnBhdGguCisgICAgcmVwZWF0ZWQgaW50MzIgcGF0aCA9IDEgW3BhY2tlZD10cnVlXTsKKworICAgIC8vIElkZW50aWZpZXMgdGhlIGZpbGVzeXN0ZW0gcGF0aCB0byB0aGUgb3JpZ2luYWwgc291cmNlIC5wcm90by4KKyAgICBvcHRpb25hbCBzdHJpbmcgc291cmNlX2ZpbGUgPSAyOworCisgICAgLy8gSWRlbnRpZmllcyB0aGUgc3RhcnRpbmcgb2Zmc2V0IGluIGJ5dGVzIGluIHRoZSBnZW5lcmF0ZWQgY29kZQorICAgIC8vIHRoYXQgcmVsYXRlcyB0byB0aGUgaWRlbnRpZmllZCBvYmplY3QuCisgICAgb3B0aW9uYWwgaW50MzIgYmVnaW4gPSAzOworCisgICAgLy8gSWRlbnRpZmllcyB0aGUgZW5kaW5nIG9mZnNldCBpbiBieXRlcyBpbiB0aGUgZ2VuZXJhdGVkIGNvZGUgdGhhdAorICAgIC8vIHJlbGF0ZXMgdG8gdGhlIGlkZW50aWZpZWQgb2Zmc2V0LiBUaGUgZW5kIG9mZnNldCBzaG91bGQgYmUgb25lIHBhc3QKKyAgICAvLyB0aGUgbGFzdCByZWxldmFudCBieXRlIChzbyB0aGUgbGVuZ3RoIG9mIHRoZSB0ZXh0ID0gZW5kIC0gYmVnaW4pLgorICAgIG9wdGlvbmFsIGludDMyIGVuZCA9IDQ7CiAgIH0KIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmNjCmluZGV4IDIzZTQ4YTYuLjIxMTdjMDIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzksOCArMzksOCBAQAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTE1MywxMCArMTUzLDEwIEBACiAgIGlmICghZmllbGQuZXh0ZW5kZWUoKS5lbXB0eSgpICYmIGZpZWxkLmV4dGVuZGVlKClbMF0gPT0gJy4nKSB7CiAgICAgLy8gVGhlIGV4dGVuc2lvbiBpcyBmdWxseS1xdWFsaWZpZWQuICBXZSBjYW4gdXNlIGl0IGFzIGEgbG9va3VwIGtleSBpbgogICAgIC8vIHRoZSBieV9zeW1ib2xfIHRhYmxlLgotICAgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KCZieV9leHRlbnNpb25fLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1ha2VfcGFpcihmaWVsZC5leHRlbmRlZSgpLnN1YnN0cigxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQubnVtYmVyKCkpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlKSkgeworICAgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KAorICAgICAgICAgICAgJmJ5X2V4dGVuc2lvbl8sCisgICAgICAgICAgICBzdGQ6Om1ha2VfcGFpcihmaWVsZC5leHRlbmRlZSgpLnN1YnN0cigxKSwgZmllbGQubnVtYmVyKCkpLAorICAgICAgICAgICAgdmFsdWUpKSB7CiAgICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXh0ZW5zaW9uIGNvbmZsaWN0cyB3aXRoIGV4dGVuc2lvbiBhbHJlYWR5IGluIGRhdGFiYXNlOiAiCiAgICAgICAgICAgICAgICAgICAgICJleHRlbmQgIiA8PCBmaWVsZC5leHRlbmRlZSgpIDw8ICIgeyAiCiAgICAgICAgICAgICAgICAgIDw8IGZpZWxkLm5hbWUoKSA8PCAiID0gIiA8PCBmaWVsZC5udW1iZXIoKSA8PCAiIH0iOwpAQCAtMTg5LDE3ICsxODksMTYgQEAKIFZhbHVlIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZTo6RGVzY3JpcHRvckluZGV4PFZhbHVlPjo6RmluZEV4dGVuc2lvbigKICAgICBjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKICAgICBpbnQgZmllbGRfbnVtYmVyKSB7Ci0gIHJldHVybiBGaW5kV2l0aERlZmF1bHQoYnlfZXh0ZW5zaW9uXywKLSAgICAgICAgICAgICAgICAgICAgICAgICBtYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCBmaWVsZF9udW1iZXIpLAotICAgICAgICAgICAgICAgICAgICAgICAgIFZhbHVlKCkpOworICByZXR1cm4gRmluZFdpdGhEZWZhdWx0KAorICAgICAgYnlfZXh0ZW5zaW9uXywgc3RkOjptYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCBmaWVsZF9udW1iZXIpLCBWYWx1ZSgpKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFZhbHVlPgogYm9vbCBTaW1wbGVEZXNjcmlwdG9yRGF0YWJhc2U6OkRlc2NyaXB0b3JJbmRleDxWYWx1ZT46OkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKAogICAgIGNvbnN0IHN0cmluZyYgY29udGFpbmluZ190eXBlLAogICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpIHsKLSAgdHlwZW5hbWUgbWFwPHBhaXI8c3RyaW5nLCBpbnQ+LCBWYWx1ZSA+Ojpjb25zdF9pdGVyYXRvciBpdCA9Ci0gICAgICBieV9leHRlbnNpb25fLmxvd2VyX2JvdW5kKG1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIDApKTsKKyAgdHlwZW5hbWUgbWFwPHBhaXI8c3RyaW5nLCBpbnQ+LCBWYWx1ZT46OmNvbnN0X2l0ZXJhdG9yIGl0ID0KKyAgICAgIGJ5X2V4dGVuc2lvbl8ubG93ZXJfYm91bmQoc3RkOjptYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCAwKSk7CiAgIGJvb2wgc3VjY2VzcyA9IGZhbHNlOwogCiAgIGZvciAoOyBpdCAhPSBieV9leHRlbnNpb25fLmVuZCgpICYmIGl0LT5maXJzdC5maXJzdCA9PSBjb250YWluaW5nX3R5cGU7CkBAIC0yODksNiArMjg4LDcgQEAKICAgcmV0dXJuIGluZGV4Xy5GaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhleHRlbmRlZV90eXBlLCBvdXRwdXQpOwogfQogCisKIGJvb2wgU2ltcGxlRGVzY3JpcHRvckRhdGFiYXNlOjpNYXliZUNvcHkoY29uc3QgRmlsZURlc2NyaXB0b3JQcm90byogZmlsZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CiAgIGlmIChmaWxlID09IE5VTEwpIHJldHVybiBmYWxzZTsKQEAgLTMwOSw3ICszMDksNyBAQAogICAgIGNvbnN0IHZvaWQqIGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBpbnQgc2l6ZSkgewogICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGU7CiAgIGlmIChmaWxlLlBhcnNlRnJvbUFycmF5KGVuY29kZWRfZmlsZV9kZXNjcmlwdG9yLCBzaXplKSkgewotICAgIHJldHVybiBpbmRleF8uQWRkRmlsZShmaWxlLCBtYWtlX3BhaXIoZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIHNpemUpKTsKKyAgICByZXR1cm4gaW5kZXhfLkFkZEZpbGUoZmlsZSwgc3RkOjptYWtlX3BhaXIoZW5jb2RlZF9maWxlX2Rlc2NyaXB0b3IsIHNpemUpKTsKICAgfSBlbHNlIHsKICAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiSW52YWxpZCBmaWxlIGRlc2NyaXB0b3IgZGF0YSBwYXNzZWQgdG8gIgogICAgICAgICAgICAgICAgICAgIkVuY29kZWREZXNjcmlwdG9yRGF0YWJhc2U6OkFkZCgpLiI7CkBAIC01MjQsMTggKzUyNCwyMCBAQAogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgc291cmNlc18uc2l6ZSgpOyBpKyspIHsKICAgICBpZiAoc291cmNlc19baV0tPkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKGV4dGVuZGVlX3R5cGUsICZyZXN1bHRzKSkgewotICAgICAgY29weShyZXN1bHRzLmJlZ2luKCksIHJlc3VsdHMuZW5kKCksCi0gICAgICAgICAgIGluc2VydF9pdGVyYXRvcjxzZXQ8aW50PiA+KG1lcmdlZF9yZXN1bHRzLCBtZXJnZWRfcmVzdWx0cy5iZWdpbigpKSk7CisgICAgICBzdGQ6OmNvcHkoCisgICAgICAgICAgcmVzdWx0cy5iZWdpbigpLCByZXN1bHRzLmVuZCgpLAorICAgICAgICAgIGluc2VydF9pdGVyYXRvcjxzZXQ8aW50PiA+KG1lcmdlZF9yZXN1bHRzLCBtZXJnZWRfcmVzdWx0cy5iZWdpbigpKSk7CiAgICAgICBzdWNjZXNzID0gdHJ1ZTsKICAgICB9CiAgICAgcmVzdWx0cy5jbGVhcigpOwogICB9CiAKLSAgY29weShtZXJnZWRfcmVzdWx0cy5iZWdpbigpLCBtZXJnZWRfcmVzdWx0cy5lbmQoKSwKLSAgICAgICBpbnNlcnRfaXRlcmF0b3I8dmVjdG9yPGludD4gPigqb3V0cHV0LCBvdXRwdXQtPmVuZCgpKSk7CisgIHN0ZDo6Y29weShtZXJnZWRfcmVzdWx0cy5iZWdpbigpLCBtZXJnZWRfcmVzdWx0cy5lbmQoKSwKKyAgICAgICAgICAgIGluc2VydF9pdGVyYXRvcjx2ZWN0b3I8aW50PiA+KCpvdXRwdXQsIG91dHB1dC0+ZW5kKCkpKTsKIAogICByZXR1cm4gc3VjY2VzczsKIH0KIAorCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2UuaAppbmRleCBmMzJiMWRiLi44NjAwMmQ1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZS5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00MSw2ICs0MSw3IEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHV0aWxpdHk+CiAjaW5jbHVkZSA8dmVjdG9yPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKQEAgLTk1LDExICs5NiwxMiBAQAogICAvLwogICAvLyBUaGlzIG1ldGhvZCBoYXMgYSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIHRoYXQgYWx3YXlzIHJldHVybnMKICAgLy8gZmFsc2UuCi0gIHZpcnR1YWwgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIGV4dGVuZGVlX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50Piogb3V0cHV0KSB7CisgIHZpcnR1YWwgYm9vbCBGaW5kQWxsRXh0ZW5zaW9uTnVtYmVycyhjb25zdCBzdHJpbmcmIC8qIGV4dGVuZGVlX3R5cGUgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8aW50PiogLyogb3V0cHV0ICovKSB7CiAgICAgcmV0dXJuIGZhbHNlOwogICB9CiAKKwogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEZXNjcmlwdG9yRGF0YWJhc2UpOwogfTsKQEAgLTMxMCw3ICszMTIsNyBAQAogLy8gQSBEZXNjcmlwdG9yRGF0YWJhc2UgdGhhdCBmZXRjaGVzIGZpbGVzIGZyb20gYSBnaXZlbiBwb29sLgogY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIERlc2NyaXB0b3JQb29sRGF0YWJhc2UgOiBwdWJsaWMgRGVzY3JpcHRvckRhdGFiYXNlIHsKICBwdWJsaWM6Ci0gIERlc2NyaXB0b3JQb29sRGF0YWJhc2UoY29uc3QgRGVzY3JpcHRvclBvb2wmIHBvb2wpOworICBleHBsaWNpdCBEZXNjcmlwdG9yUG9vbERhdGFiYXNlKGNvbnN0IERlc2NyaXB0b3JQb29sJiBwb29sKTsKICAgfkRlc2NyaXB0b3JQb29sRGF0YWJhc2UoKTsKIAogICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzM5LDcgKzM0MSw3IEBACiAgIC8vIE1lcmdlIG1vcmUgdGhhbiB0d28gZGF0YWJhc2VzLiAgVGhlIHNvdXJjZXMgcmVtYWluIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIuCiAgIC8vIFRoZSB2ZWN0b3IgbWF5IGJlIGRlbGV0ZWQgYWZ0ZXIgdGhlIGNvbnN0cnVjdG9yIHJldHVybnMgYnV0IHRoZQogICAvLyBEZXNjcmlwdG9yRGF0YWJhc2VzIG5lZWQgdG8gc3RpY2sgYXJvdW5kLgotICBNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoY29uc3QgdmVjdG9yPERlc2NyaXB0b3JEYXRhYmFzZSo+JiBzb3VyY2VzKTsKKyAgZXhwbGljaXQgTWVyZ2VkRGVzY3JpcHRvckRhdGFiYXNlKGNvbnN0IHZlY3RvcjxEZXNjcmlwdG9yRGF0YWJhc2UqPiYgc291cmNlcyk7CiAgIH5NZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UoKTsKIAogICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzU1LDYgKzM1Nyw3IEBACiAgIGJvb2wgRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoY29uc3Qgc3RyaW5nJiBleHRlbmRlZV90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxpbnQ+KiBvdXRwdXQpOwogCisKICBwcml2YXRlOgogICB2ZWN0b3I8RGVzY3JpcHRvckRhdGFiYXNlKj4gc291cmNlc187CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXJnZWREZXNjcmlwdG9yRGF0YWJhc2UpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfZGF0YWJhc2VfdW5pdHRlc3QuY2MKaW5kZXggYWM3MmRkYy4uMWZjMzgxNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl9kYXRhYmFzZV91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlX3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNSw2ICszNSwxMCBAQAogLy8gVGhpcyBmaWxlIG1ha2VzIGV4dGVuc2l2ZSB1c2Ugb2YgUkZDIDMwOTIuICA6KQogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNpZm5kZWYgX1NIQVJFRF9QVFJfSAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+CisjZW5kaWYKIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KQEAgLTQyLDcgKzQ2LDkgQEAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KIApAQCAtMTc1LDcgKzE4MSw3IEBACiAgICAgRVhQRUNUX0ZBTFNFKHRlc3RfY2FzZV8tPkFkZFRvRGF0YWJhc2UoZmlsZV9wcm90bykpOwogICB9CiAKLSAgc2NvcGVkX3B0cjxEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZT4gdGVzdF9jYXNlXzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxEZXNjcmlwdG9yRGF0YWJhc2VUZXN0Q2FzZT4gdGVzdF9jYXNlXzsKICAgRGVzY3JpcHRvckRhdGFiYXNlKiBkYXRhYmFzZV87CiB9OwogCkBAIC00MDgsNyArNDE0LDcgQEAKICAgICB2ZWN0b3I8aW50PiBudW1iZXJzOwogICAgIEVYUEVDVF9UUlVFKGRhdGFiYXNlXy0+RmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkZvbyIsICZudW1iZXJzKSk7CiAgICAgQVNTRVJUX0VRKDIsIG51bWJlcnMuc2l6ZSgpKTsKLSAgICBzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CisgICAgc3RkOjpzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CiAgICAgRVhQRUNUX0VRKDUsIG51bWJlcnNbMF0pOwogICAgIEVYUEVDVF9FUSgzMiwgbnVtYmVyc1sxXSk7CiAgIH0KQEAgLTcyMiw3ICs3MjgsNyBAQAogICAgIHZlY3RvcjxpbnQ+IG51bWJlcnM7CiAgICAgRVhQRUNUX1RSVUUoZm9yd2FyZF9tZXJnZWRfLkZpbmRBbGxFeHRlbnNpb25OdW1iZXJzKCJCYXoiLCAmbnVtYmVycykpOwogICAgIEFTU0VSVF9FUSgyLCBudW1iZXJzLnNpemUoKSk7Ci0gICAgc29ydChudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCkpOworICAgIHN0ZDo6c29ydChudW1iZXJzLmJlZ2luKCksIG51bWJlcnMuZW5kKCkpOwogICAgIEVYUEVDVF9FUSgxMiwgbnVtYmVyc1swXSk7CiAgICAgRVhQRUNUX0VRKDEzLCBudW1iZXJzWzFdKTsKICAgfQpAQCAtNzMxLDcgKzczNyw3IEBACiAgICAgdmVjdG9yPGludD4gbnVtYmVyczsKICAgICBFWFBFQ1RfVFJVRShyZXZlcnNlX21lcmdlZF8uRmluZEFsbEV4dGVuc2lvbk51bWJlcnMoIkJheiIsICZudW1iZXJzKSk7CiAgICAgQVNTRVJUX0VRKDIsIG51bWJlcnMuc2l6ZSgpKTsKLSAgICBzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CisgICAgc3RkOjpzb3J0KG51bWJlcnMuYmVnaW4oKSwgbnVtYmVycy5lbmQoKSk7CiAgICAgRVhQRUNUX0VRKDEyLCBudW1iZXJzWzBdKTsKICAgICBFWFBFQ1RfRVEoMTMsIG51bWJlcnNbMV0pOwogICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvcl91bml0dGVzdC5jYwppbmRleCA1NWFlYmZkLi5mOTM3YjllIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3JfdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM0LDE5ICszNCwyOCBAQAogLy8KIC8vIFRoaXMgZmlsZSBtYWtlcyBleHRlbnNpdmUgdXNlIG9mIFJGQyAzMDkyLiAgOikKIAorI2luY2x1ZGUgPG1lbW9yeT4KKyNpZm5kZWYgX1NIQVJFRF9QVFJfSAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmg+CisjZW5kaWYKICNpbmNsdWRlIDx2ZWN0b3I+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvY29tcGlsZXIvaW1wb3J0ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yX2RhdGFiYXNlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2NvcGVkX3B0ci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCkBAIC0xMzcsNiArMTQ2LDE0IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKK0Rlc2NyaXB0b3JQcm90bzo6UmVzZXJ2ZWRSYW5nZSogQWRkUmVzZXJ2ZWRSYW5nZShEZXNjcmlwdG9yUHJvdG8qIHBhcmVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc3RhcnQsIGludCBlbmQpIHsKKyAgRGVzY3JpcHRvclByb3RvOjpSZXNlcnZlZFJhbmdlKiByZXN1bHQgPSBwYXJlbnQtPmFkZF9yZXNlcnZlZF9yYW5nZSgpOworICByZXN1bHQtPnNldF9zdGFydChzdGFydCk7CisgIHJlc3VsdC0+c2V0X2VuZChlbmQpOworICByZXR1cm4gcmVzdWx0OworfQorCiBFbnVtVmFsdWVEZXNjcmlwdG9yUHJvdG8qIEFkZEVudW1WYWx1ZShFbnVtRGVzY3JpcHRvclByb3RvKiBlbnVtX3Byb3RvLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBpbnQgbnVtYmVyKSB7CiAgIEVudW1WYWx1ZURlc2NyaXB0b3JQcm90byogcmVzdWx0ID0gZW51bV9wcm90by0+YWRkX3ZhbHVlKCk7CkBAIC0xNjIsNiArMTc5LDYxIEBACiAgIEFkZEVudW1WYWx1ZShBZGRFbnVtKGZpbGUsIG5hbWUpLCBuYW1lICsgIl9EVU1NWSIsIDEpOwogfQogCitjbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9CisgIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQorCisgIHN0cmluZyB0ZXh0XzsKKyAgc3RyaW5nIHdhcm5pbmdfdGV4dF87CisKKyAgLy8gaW1wbGVtZW50cyBFcnJvckNvbGxlY3RvciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgdm9pZCBBZGRFcnJvcihjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZWxlbWVudF9uYW1lLCBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgIEVycm9yTG9jYXRpb24gbG9jYXRpb24sIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworICAgIGNvbnN0IGNoYXIqIGxvY2F0aW9uX25hbWUgPSBOVUxMOworICAgIHN3aXRjaCAobG9jYXRpb24pIHsKKyAgICAgIGNhc2UgTkFNRSAgICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJOQU1FIiAgICAgICAgIDsgYnJlYWs7CisgICAgICBjYXNlIE5VTUJFUiAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiTlVNQkVSIiAgICAgICA7IGJyZWFrOworICAgICAgY2FzZSBUWVBFICAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIlRZUEUiICAgICAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgRVhURU5ERUUgICAgIDogbG9jYXRpb25fbmFtZSA9ICJFWFRFTkRFRSIgICAgIDsgYnJlYWs7CisgICAgICBjYXNlIERFRkFVTFRfVkFMVUU6IGxvY2F0aW9uX25hbWUgPSAiREVGQVVMVF9WQUxVRSI7IGJyZWFrOworICAgICAgY2FzZSBPUFRJT05fTkFNRSAgOiBsb2NhdGlvbl9uYW1lID0gIk9QVElPTl9OQU1FIiAgOyBicmVhazsKKyAgICAgIGNhc2UgT1BUSU9OX1ZBTFVFIDogbG9jYXRpb25fbmFtZSA9ICJPUFRJT05fVkFMVUUiIDsgYnJlYWs7CisgICAgICBjYXNlIElOUFVUX1RZUEUgICA6IGxvY2F0aW9uX25hbWUgPSAiSU5QVVRfVFlQRSIgICA7IGJyZWFrOworICAgICAgY2FzZSBPVVRQVVRfVFlQRSAgOiBsb2NhdGlvbl9uYW1lID0gIk9VVFBVVF9UWVBFIiAgOyBicmVhazsKKyAgICAgIGNhc2UgT1RIRVIgICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJPVEhFUiIgICAgICAgIDsgYnJlYWs7CisgICAgfQorCisgICAgc3RyaW5nczo6U3Vic3RpdHV0ZUFuZEFwcGVuZCgKKyAgICAgICZ0ZXh0XywgIiQwOiAkMTogJDI6ICQzXG4iLAorICAgICAgZmlsZW5hbWUsIGVsZW1lbnRfbmFtZSwgbG9jYXRpb25fbmFtZSwgbWVzc2FnZSk7CisgIH0KKworICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2b2lkIEFkZFdhcm5pbmcoY29uc3Qgc3RyaW5nJiBmaWxlbmFtZSwgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsCisgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBkZXNjcmlwdG9yLCBFcnJvckxvY2F0aW9uIGxvY2F0aW9uLAorICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CisgICAgY29uc3QgY2hhciogbG9jYXRpb25fbmFtZSA9IE5VTEw7CisgICAgc3dpdGNoIChsb2NhdGlvbikgeworICAgICAgY2FzZSBOQU1FICAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk5BTUUiICAgICAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgTlVNQkVSICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJOVU1CRVIiICAgICAgIDsgYnJlYWs7CisgICAgICBjYXNlIFRZUEUgICAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiVFlQRSIgICAgICAgICA7IGJyZWFrOworICAgICAgY2FzZSBFWFRFTkRFRSAgICAgOiBsb2NhdGlvbl9uYW1lID0gIkVYVEVOREVFIiAgICAgOyBicmVhazsKKyAgICAgIGNhc2UgREVGQVVMVF9WQUxVRTogbG9jYXRpb25fbmFtZSA9ICJERUZBVUxUX1ZBTFVFIjsgYnJlYWs7CisgICAgICBjYXNlIE9QVElPTl9OQU1FICA6IGxvY2F0aW9uX25hbWUgPSAiT1BUSU9OX05BTUUiICA7IGJyZWFrOworICAgICAgY2FzZSBPUFRJT05fVkFMVUUgOiBsb2NhdGlvbl9uYW1lID0gIk9QVElPTl9WQUxVRSIgOyBicmVhazsKKyAgICAgIGNhc2UgSU5QVVRfVFlQRSAgIDogbG9jYXRpb25fbmFtZSA9ICJJTlBVVF9UWVBFIiAgIDsgYnJlYWs7CisgICAgICBjYXNlIE9VVFBVVF9UWVBFICA6IGxvY2F0aW9uX25hbWUgPSAiT1VUUFVUX1RZUEUiICA7IGJyZWFrOworICAgICAgY2FzZSBPVEhFUiAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk9USEVSIiAgICAgICAgOyBicmVhazsKKyAgICB9CisKKyAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKAorICAgICAgJndhcm5pbmdfdGV4dF8sICIkMDogJDE6ICQyOiAkM1xuIiwKKyAgICAgIGZpbGVuYW1lLCBlbGVtZW50X25hbWUsIGxvY2F0aW9uX25hbWUsIG1lc3NhZ2UpOworICB9Cit9OworCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIC8vIFRlc3Qgc2ltcGxlIGZpbGVzLgpAQCAtMzU4LDYgKzQzMCw2NSBAQAogICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGUoZmlsZSkgPT0gTlVMTCk7CiB9CiAKK1RFU1RfRihGaWxlRGVzY3JpcHRvclRlc3QsIEJ1aWxkQWdhaW5XaXRoU3ludGF4KSB7CisgIC8vIFRlc3QgdGhhdCBpZiB0ZSBjYWxsIEJ1aWxkRmlsZSBhZ2FpbiBvbiB0aGUgc2FtZSBpbnB1dCB3ZSBnZXQgdGhlIHNhbWUKKyAgLy8gRmlsZURlc2NyaXB0b3IgYmFjayBldmVuIGlmIHN5bnRheCBwYXJhbSBpcyBzcGVjaWZpZWQuCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG9fc3ludGF4MjsKKyAgcHJvdG9fc3ludGF4Mi5zZXRfbmFtZSgiZm9vX3N5bnRheDIiKTsKKyAgcHJvdG9fc3ludGF4Mi5zZXRfc3ludGF4KCJwcm90bzIiKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogcHJvdG8yX2Rlc2NyaXB0b3IgPSBwb29sXy5CdWlsZEZpbGUocHJvdG9fc3ludGF4Mik7CisgIEVYUEVDVF9UUlVFKHByb3RvMl9kZXNjcmlwdG9yICE9IE5VTEwpOworICBFWFBFQ1RfRVEocHJvdG8yX2Rlc2NyaXB0b3IsIHBvb2xfLkJ1aWxkRmlsZShwcm90b19zeW50YXgyKSk7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBpbXBsaWNpdF9wcm90bzI7CisgIGltcGxpY2l0X3Byb3RvMi5zZXRfbmFtZSgiZm9vX2ltcGxpY2l0X3N5bnRheDIiKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogaW1wbGljaXRfcHJvdG8yX2Rlc2NyaXB0b3IgPQorICAgICAgcG9vbF8uQnVpbGRGaWxlKGltcGxpY2l0X3Byb3RvMik7CisgIEVYUEVDVF9UUlVFKGltcGxpY2l0X3Byb3RvMl9kZXNjcmlwdG9yICE9IE5VTEwpOworICAvLyBXZSBnZXQgdGhlIHNhbWUgRmlsZURlc2NyaXB0b3IgYmFjayBpZiBzeW50YXggcGFyYW0gaXMgZXhwbGljaXRseQorICAvLyBzcGVjaWZpZWQuCisgIGltcGxpY2l0X3Byb3RvMi5zZXRfc3ludGF4KCJwcm90bzIiKTsKKyAgRVhQRUNUX0VRKGltcGxpY2l0X3Byb3RvMl9kZXNjcmlwdG9yLCBwb29sXy5CdWlsZEZpbGUoaW1wbGljaXRfcHJvdG8yKSk7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBwcm90b19zeW50YXgzOworICBwcm90b19zeW50YXgzLnNldF9uYW1lKCJmb29fc3ludGF4MyIpOworICBwcm90b19zeW50YXgzLnNldF9zeW50YXgoInByb3RvMyIpOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBwcm90bzNfZGVzY3JpcHRvciA9IHBvb2xfLkJ1aWxkRmlsZShwcm90b19zeW50YXgzKTsKKyAgRVhQRUNUX1RSVUUocHJvdG8zX2Rlc2NyaXB0b3IgIT0gTlVMTCk7CisgIEVYUEVDVF9FUShwcm90bzNfZGVzY3JpcHRvciwgcG9vbF8uQnVpbGRGaWxlKHByb3RvX3N5bnRheDMpKTsKK30KKworVEVTVF9GKEZpbGVEZXNjcmlwdG9yVGVzdCwgU3ludGF4KSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgIHByb3RvLnNldF9uYW1lKCJmb28iKTsKKyAgLy8gRW5hYmxlIHRoZSB0ZXN0IHdoZW4gd2UgYWxzbyBwb3B1bGF0ZSB0aGUgc3ludGF4IGZvciBwcm90bzIuCisjaWYgMAorICB7CisgICAgcHJvdG8uc2V0X3N5bnRheCgicHJvdG8yIik7CisgICAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKHByb3RvKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOworICAgIEVYUEVDVF9FUShGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMiwgZmlsZS0+c3ludGF4KCkpOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXI7CisgICAgZmlsZS0+Q29weVRvKCZvdGhlcik7CisgICAgRVhQRUNUX0VRKCJwcm90bzIiLCBvdGhlci5zeW50YXgoKSk7CisgIH0KKyNlbmRpZgorICB7CisgICAgcHJvdG8uc2V0X3N5bnRheCgicHJvdG8zIik7CisgICAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKHByb3RvKTsKKyAgICBFWFBFQ1RfVFJVRShmaWxlICE9IE5VTEwpOworICAgIEVYUEVDVF9FUShGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMywgZmlsZS0+c3ludGF4KCkpOworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gb3RoZXI7CisgICAgZmlsZS0+Q29weVRvKCZvdGhlcik7CisgICAgRVhQRUNUX0VRKCJwcm90bzMiLCBvdGhlci5zeW50YXgoKSk7CisgIH0KK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiAvLyBUZXN0IHNpbXBsZSBmbGF0IG1lc3NhZ2VzIGFuZCBmaWVsZHMuCkBAIC0zODUsNiArNTE2LDIxIEBACiAgICAgLy8gICAgIHJlcXVpcmVkIHN0cmluZyBxdXV4ID0gNjsKICAgICAvLyAgIH0KICAgICAvLworICAgIC8vICAgLy8gaW4gIm1hcC5wcm90byIKKyAgICAvLyAgIG1lc3NhZ2UgVGVzdE1lc3NhZ2UzIHsKKyAgICAvLyAgICAgbWFwPGludDMyLCBpbnQzMj4gbWFwX2ludDMyX2ludDMyID0gMTsKKyAgICAvLyAgIH0KKyAgICAvLworICAgIC8vICAgLy8gaW4gImpzb24ucHJvdG8iCisgICAgLy8gICBtZXNzYWdlIFRlc3RNZXNzYWdlNCB7CisgICAgLy8gICAgIG9wdGlvbmFsIGludDMyIGZpZWxkX25hbWUxID0gMTsKKyAgICAvLyAgICAgb3B0aW9uYWwgaW50MzIgZmllbGROYW1lMiA9IDI7CisgICAgLy8gICAgIG9wdGlvbmFsIGludDMyIEZpZWxkTmFtZTMgPSAzOworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBfZmllbGRfbmFtZTQgPSA0OworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBGSUVMRF9OQU1FNSA9IDU7CisgICAgLy8gICAgIG9wdGlvbmFsIGludDMyIGZpZWxkX25hbWU2ID0gNiBbanNvbl9uYW1lID0gIkB0eXBlIl07CisgICAgLy8gICB9CisgICAgLy8KICAgICAvLyBXZSBjaGVhdCBhbmQgdXNlIFRlc3RGb3JlaWduIGFzIHRoZSB0eXBlIGZvciBxdXggcmF0aGVyIHRoYW4gY3JlYXRlCiAgICAgLy8gYW4gYWN0dWFsIG5lc3RlZCB0eXBlLgogICAgIC8vCkBAIC00MzIsNiArNTc4LDQ4IEBACiAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUVVJUkVELAogICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX1NUUklORyk7CiAKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIG1hcF9maWxlOworICAgIG1hcF9maWxlLnNldF9uYW1lKCJtYXAucHJvdG8iKTsKKyAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UzID0gQWRkTWVzc2FnZSgmbWFwX2ZpbGUsICJUZXN0TWVzc2FnZTMiKTsKKworICAgIERlc2NyaXB0b3JQcm90byogZW50cnkgPSBBZGROZXN0ZWRNZXNzYWdlKG1lc3NhZ2UzLCAiTWFwSW50MzJJbnQzMkVudHJ5Iik7CisgICAgQWRkRmllbGQoZW50cnksICJrZXkiLCAxLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQoZW50cnksICJ2YWx1ZSIsIDIsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBlbnRyeS0+bXV0YWJsZV9vcHRpb25zKCktPnNldF9tYXBfZW50cnkodHJ1ZSk7CisKKyAgICBBZGRGaWVsZChtZXNzYWdlMywgIm1hcF9pbnQzMl9pbnQzMiIsIDEsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX1JFUEVBVEVELAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0UpCisgICAgICAgIC0+c2V0X3R5cGVfbmFtZSgiTWFwSW50MzJJbnQzMkVudHJ5Iik7CisKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIGpzb25fZmlsZTsKKyAgICBqc29uX2ZpbGUuc2V0X25hbWUoImpzb24ucHJvdG8iKTsKKyAgICBqc29uX2ZpbGUuc2V0X3N5bnRheCgicHJvdG8zIik7CisgICAgRGVzY3JpcHRvclByb3RvKiBtZXNzYWdlNCA9IEFkZE1lc3NhZ2UoJmpzb25fZmlsZSwgIlRlc3RNZXNzYWdlNCIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2U0LCAiZmllbGRfbmFtZTEiLCAxLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgICAgQWRkRmllbGQobWVzc2FnZTQsICJmaWVsZE5hbWUyIiwgMiwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2U0LCAiRmllbGROYW1lMyIsIDMsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlNCwgIl9maWVsZF9uYW1lNCIsIDQsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0lOVDMyKTsKKyAgICBBZGRGaWVsZChtZXNzYWdlNCwgIkZJRUxEX05BTUU1IiwgNSwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG1lc3NhZ2U0LCAiZmllbGRfbmFtZTYiLCA2LAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMikKKyAgICAgICAgLT5zZXRfanNvbl9uYW1lKCJAdHlwZSIpOworCiAgICAgLy8gQnVpbGQgdGhlIGRlc2NyaXB0b3JzIGFuZCBnZXQgdGhlIHBvaW50ZXJzLgogICAgIGZvb19maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShmb29fZmlsZSk7CiAgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOwpAQCAtNDM5LDYgKzYyNywxMiBAQAogICAgIGJhcl9maWxlXyA9IHBvb2xfLkJ1aWxkRmlsZShiYXJfZmlsZSk7CiAgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOwogCisgICAgbWFwX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKG1hcF9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShtYXBfZmlsZV8gIT0gTlVMTCk7CisKKyAgICBqc29uX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGpzb25fZmlsZSk7CisgICAgQVNTRVJUX1RSVUUoanNvbl9maWxlXyAhPSBOVUxMKTsKKwogICAgIEFTU0VSVF9FUSgxLCBmb29fZmlsZV8tPmVudW1fdHlwZV9jb3VudCgpKTsKICAgICBlbnVtXyA9IGZvb19maWxlXy0+ZW51bV90eXBlKDApOwogCkBAIC00NTksMTUgKzY1MywzMyBAQAogICAgIGZvbzJfICA9IG1lc3NhZ2UyXy0+ZmllbGQoMCk7CiAgICAgYmFyMl8gID0gbWVzc2FnZTJfLT5maWVsZCgxKTsKICAgICBxdXV4Ml8gPSBtZXNzYWdlMl8tPmZpZWxkKDIpOworCisgICAgQVNTRVJUX0VRKDEsIG1hcF9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICAgIG1lc3NhZ2UzXyA9IG1hcF9maWxlXy0+bWVzc2FnZV90eXBlKDApOworCisgICAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UzXy0+ZmllbGRfY291bnQoKSk7CisgICAgbWFwXyAgPSBtZXNzYWdlM18tPmZpZWxkKDApOworCisgICAgQVNTRVJUX0VRKDEsIGpzb25fZmlsZV8tPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKyAgICBtZXNzYWdlNF8gPSBqc29uX2ZpbGVfLT5tZXNzYWdlX3R5cGUoMCk7CisgIH0KKworICB2b2lkIENvcHlXaXRoSnNvbk5hbWUoY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZSwgRGVzY3JpcHRvclByb3RvKiBwcm90bykgeworICAgIG1lc3NhZ2UtPkNvcHlUbyhwcm90byk7CisgICAgbWVzc2FnZS0+Q29weUpzb25OYW1lVG8ocHJvdG8pOwogICB9CiAKICAgRGVzY3JpcHRvclBvb2wgcG9vbF87CiAKICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhcl9maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIG1hcF9maWxlXzsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGpzb25fZmlsZV87CiAKICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV87CiAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2UyXzsKKyAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZTNfOworICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlNF87CiAgIGNvbnN0IERlc2NyaXB0b3IqIGZvcmVpZ25fOwogICBjb25zdCBFbnVtRGVzY3JpcHRvciogZW51bV87CiAKQEAgLTQ3OSw2ICs2OTEsOCBAQAogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZvbzJfOwogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJhcjJfOwogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHF1dXgyXzsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG1hcF87CiB9OwogCiBURVNUX0YoRGVzY3JpcHRvclRlc3QsIE5hbWUpIHsKQEAgLTU1Nyw2ICs3NzEsMzUgQEAKICAgRVhQRUNUX0VRKCJjb3JnZS5ncmF1bHQuVGVzdE1lc3NhZ2UyLnF1dXgiLCBxdXV4Ml8tPmZ1bGxfbmFtZSgpKTsKIH0KIAorVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEpzb25OYW1lKSB7CisgIEVYUEVDVF9FUSgiZmllbGROYW1lMSIsIG1lc3NhZ2U0Xy0+ZmllbGQoMCktPmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmaWVsZE5hbWUyIiwgbWVzc2FnZTRfLT5maWVsZCgxKS0+anNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoImZpZWxkTmFtZTMiLCBtZXNzYWdlNF8tPmZpZWxkKDIpLT5qc29uX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZmllbGROYW1lNCIsIG1lc3NhZ2U0Xy0+ZmllbGQoMyktPmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmSUVMRE5BTUU1IiwgbWVzc2FnZTRfLT5maWVsZCg0KS0+anNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkB0eXBlIiwgbWVzc2FnZTRfLT5maWVsZCg1KS0+anNvbl9uYW1lKCkpOworCisgIERlc2NyaXB0b3JQcm90byBwcm90bzsKKyAgbWVzc2FnZTRfLT5Db3B5VG8oJnByb3RvKTsKKyAgQVNTRVJUX0VRKDYsIHByb3RvLmZpZWxkX3NpemUoKSk7CisgIEVYUEVDVF9GQUxTRShwcm90by5maWVsZCgwKS5oYXNfanNvbl9uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UocHJvdG8uZmllbGQoMSkuaGFzX2pzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKHByb3RvLmZpZWxkKDIpLmhhc19qc29uX25hbWUoKSk7CisgIEVYUEVDVF9GQUxTRShwcm90by5maWVsZCgzKS5oYXNfanNvbl9uYW1lKCkpOworICBFWFBFQ1RfRkFMU0UocHJvdG8uZmllbGQoNCkuaGFzX2pzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJAdHlwZSIsIHByb3RvLmZpZWxkKDUpLmpzb25fbmFtZSgpKTsKKworICBwcm90by5DbGVhcigpOworICBDb3B5V2l0aEpzb25OYW1lKG1lc3NhZ2U0XywgJnByb3RvKTsKKyAgQVNTRVJUX0VRKDYsIHByb3RvLmZpZWxkX3NpemUoKSk7CisgIEVYUEVDVF9FUSgiZmllbGROYW1lMSIsIHByb3RvLmZpZWxkKDApLmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmaWVsZE5hbWUyIiwgcHJvdG8uZmllbGQoMSkuanNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoImZpZWxkTmFtZTMiLCBwcm90by5maWVsZCgyKS5qc29uX25hbWUoKSk7CisgIEVYUEVDVF9FUSgiZmllbGROYW1lNCIsIHByb3RvLmZpZWxkKDMpLmpzb25fbmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJmSUVMRE5BTUU1IiwgcHJvdG8uZmllbGQoNCkuanNvbl9uYW1lKCkpOworICBFWFBFQ1RfRVEoIkB0eXBlIiwgcHJvdG8uZmllbGQoNSkuanNvbl9uYW1lKCkpOworfQorCiBURVNUX0YoRGVzY3JpcHRvclRlc3QsIEZpZWxkRmlsZSkgewogICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBmb29fLT5maWxlKCkpOwogICBFWFBFQ1RfRVEoZm9vX2ZpbGVfLCBiYXJfLT5maWxlKCkpOwpAQCAtNjA4LDYgKzg1MSwxMiBAQAogICBFWFBFQ1RfVFJVRSAoYmF6Xy0+aXNfcmVwZWF0ZWQoKSk7CiB9CiAKK1RFU1RfRihEZXNjcmlwdG9yVGVzdCwgSXNNYXApIHsKKyAgRVhQRUNUX1RSVUUobWFwXy0+aXNfbWFwKCkpOworICBFWFBFQ1RfRkFMU0UoYmF6Xy0+aXNfbWFwKCkpOworICBFWFBFQ1RfVFJVRShtYXBfLT5tZXNzYWdlX3R5cGUoKS0+b3B0aW9ucygpLm1hcF9lbnRyeSgpKTsKK30KKwogVEVTVF9GKERlc2NyaXB0b3JUZXN0LCBGaWVsZEhhc0RlZmF1bHQpIHsKICAgRVhQRUNUX0ZBTFNFKGZvb18tPmhhc19kZWZhdWx0X3ZhbHVlKCkpOwogICBFWFBFQ1RfRkFMU0UoYmFyXy0+aGFzX2RlZmF1bHRfdmFsdWUoKSk7CkBAIC02NDQsNiArODkzLDEwNCBAQAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKKy8vIFRlc3Qgc2ltcGxlIGZsYXQgbWVzc2FnZXMgYW5kIGZpZWxkcy4KK2NsYXNzIE9uZW9mRGVzY3JpcHRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CisgICAgLy8KKyAgICAvLyAgIHBhY2thZ2UgZ2FycGx5OworICAgIC8vICAgbWVzc2FnZSBUZXN0T25lb2YgeworICAgIC8vICAgICBvcHRpb25hbCBpbnQzMiBhID0gMTsKKyAgICAvLyAgICAgb25lb2YgZm9vIHsKKyAgICAvLyAgICAgICBzdHJpbmcgYiA9IDI7CisgICAgLy8gICAgICAgVGVzdE9uZW9mIGMgPSAzOworICAgIC8vICAgICB9CisgICAgLy8gICAgIG9uZW9mIGJhciB7CisgICAgLy8gICAgICAgZmxvYXQgZCA9IDQ7CisgICAgLy8gICAgIH0KKyAgICAvLyAgIH0KKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gYmF6X2ZpbGU7CisgICAgYmF6X2ZpbGUuc2V0X25hbWUoImJhei5wcm90byIpOworICAgIGJhel9maWxlLnNldF9wYWNrYWdlKCJnYXJwbHkiKTsKKworICAgIERlc2NyaXB0b3JQcm90byogb25lb2ZfbWVzc2FnZSA9IEFkZE1lc3NhZ2UoJmJhel9maWxlLCAiVGVzdE9uZW9mIik7CisgICAgb25lb2ZfbWVzc2FnZS0+YWRkX29uZW9mX2RlY2woKS0+c2V0X25hbWUoImZvbyIpOworICAgIG9uZW9mX21lc3NhZ2UtPmFkZF9vbmVvZl9kZWNsKCktPnNldF9uYW1lKCJiYXIiKTsKKworICAgIEFkZEZpZWxkKG9uZW9mX21lc3NhZ2UsICJhIiwgMSwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAgIEFkZEZpZWxkKG9uZW9mX21lc3NhZ2UsICJiIiwgMiwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfU1RSSU5HKTsKKyAgICBvbmVvZl9tZXNzYWdlLT5tdXRhYmxlX2ZpZWxkKDEpLT5zZXRfb25lb2ZfaW5kZXgoMCk7CisgICAgQWRkRmllbGQob25lb2ZfbWVzc2FnZSwgImMiLCAzLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCwKKyAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9NRVNTQUdFKTsKKyAgICBvbmVvZl9tZXNzYWdlLT5tdXRhYmxlX2ZpZWxkKDIpLT5zZXRfb25lb2ZfaW5kZXgoMCk7CisgICAgb25lb2ZfbWVzc2FnZS0+bXV0YWJsZV9maWVsZCgyKS0+c2V0X3R5cGVfbmFtZSgiVGVzdE9uZW9mIik7CisKKyAgICBBZGRGaWVsZChvbmVvZl9tZXNzYWdlLCAiZCIsIDQsCisgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0ZMT0FUKTsKKyAgICBvbmVvZl9tZXNzYWdlLT5tdXRhYmxlX2ZpZWxkKDMpLT5zZXRfb25lb2ZfaW5kZXgoMSk7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgYmF6X2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGJhel9maWxlKTsKKyAgICBBU1NFUlRfVFJVRShiYXpfZmlsZV8gIT0gTlVMTCk7CisKKyAgICBBU1NFUlRfRVEoMSwgYmF6X2ZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgICAgb25lb2ZfbWVzc2FnZV8gPSBiYXpfZmlsZV8tPm1lc3NhZ2VfdHlwZSgwKTsKKworICAgIEFTU0VSVF9FUSgyLCBvbmVvZl9tZXNzYWdlXy0+b25lb2ZfZGVjbF9jb3VudCgpKTsKKyAgICBvbmVvZl8gPSBvbmVvZl9tZXNzYWdlXy0+b25lb2ZfZGVjbCgwKTsKKyAgICBvbmVvZjJfID0gb25lb2ZfbWVzc2FnZV8tPm9uZW9mX2RlY2woMSk7CisKKyAgICBBU1NFUlRfRVEoNCwgb25lb2ZfbWVzc2FnZV8tPmZpZWxkX2NvdW50KCkpOworICAgIGFfID0gb25lb2ZfbWVzc2FnZV8tPmZpZWxkKDApOworICAgIGJfID0gb25lb2ZfbWVzc2FnZV8tPmZpZWxkKDEpOworICAgIGNfID0gb25lb2ZfbWVzc2FnZV8tPmZpZWxkKDIpOworICAgIGRfID0gb25lb2ZfbWVzc2FnZV8tPmZpZWxkKDMpOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhel9maWxlXzsKKworICBjb25zdCBEZXNjcmlwdG9yKiBvbmVvZl9tZXNzYWdlXzsKKworICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mXzsKKyAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZjJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGFfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGJfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGNfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGVfOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZfOworfTsKKworVEVTVF9GKE9uZW9mRGVzY3JpcHRvclRlc3QsIE5vcm1hbCkgeworICBFWFBFQ1RfRVEoImZvbyIsIG9uZW9mXy0+bmFtZSgpKTsKKyAgRVhQRUNUX0VRKCJnYXJwbHkuVGVzdE9uZW9mLmZvbyIsIG9uZW9mXy0+ZnVsbF9uYW1lKCkpOworICBFWFBFQ1RfRVEoMCwgb25lb2ZfLT5pbmRleCgpKTsKKyAgQVNTRVJUX0VRKDIsIG9uZW9mXy0+ZmllbGRfY291bnQoKSk7CisgIEVYUEVDVF9FUShiXywgb25lb2ZfLT5maWVsZCgwKSk7CisgIEVYUEVDVF9FUShjXywgb25lb2ZfLT5maWVsZCgxKSk7CisgIEVYUEVDVF9UUlVFKGFfLT5jb250YWluaW5nX29uZW9mKCkgPT0gTlVMTCk7CisgIEVYUEVDVF9FUShvbmVvZl8sIGJfLT5jb250YWluaW5nX29uZW9mKCkpOworICBFWFBFQ1RfRVEob25lb2ZfLCBjXy0+Y29udGFpbmluZ19vbmVvZigpKTsKK30KKworVEVTVF9GKE9uZW9mRGVzY3JpcHRvclRlc3QsIEZpbmRCeU5hbWUpIHsKKyAgRVhQRUNUX0VRKG9uZW9mXywgb25lb2ZfbWVzc2FnZV8tPkZpbmRPbmVvZkJ5TmFtZSgiZm9vIikpOworICBFWFBFQ1RfRVEob25lb2YyXywgb25lb2ZfbWVzc2FnZV8tPkZpbmRPbmVvZkJ5TmFtZSgiYmFyIikpOworICBFWFBFQ1RfVFJVRShvbmVvZl9tZXNzYWdlXy0+RmluZE9uZW9mQnlOYW1lKCJub19zdWNoX29uZW9mIikgPT0gTlVMTCk7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogY2xhc3MgU3R5bGl6ZWRGaWVsZE5hbWVzVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICBwcm90ZWN0ZWQ6CiAgIHZvaWQgU2V0VXAoKSB7CkBAIC0xNTE0LDEzICsxODYxLDEyNCBAQAogICBFWFBFQ1RfRVEoMzksIGV4dGVuc2lvbnNbM10tPm51bWJlcigpKTsKIH0KIAorVEVTVF9GKEV4dGVuc2lvbkRlc2NyaXB0b3JUZXN0LCBEdXBsaWNhdGVGaWVsZE51bWJlcikgeworICBEZXNjcmlwdG9yUG9vbCBwb29sOworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIC8vIEFkZCAiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iLgorICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7CisgIC8vIEFkZCAiZm9vLnByb3RvIjoKKyAgLy8gICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIjsKKyAgLy8gICBleHRlbmQgZ29vZ2xlLnByb3RvYnVmLkZpZWxkT3B0aW9ucyB7CisgIC8vICAgICBvcHRpb25hbCBpbnQzMiBvcHRpb24xID0gMTAwMDsKKyAgLy8gICB9CisgIGZpbGVfcHJvdG8uQ2xlYXIoKTsKKyAgZmlsZV9wcm90by5zZXRfbmFtZSgiZm9vLnByb3RvIik7CisgIGZpbGVfcHJvdG8uYWRkX2RlcGVuZGVuY3koImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIik7CisgIEFkZEV4dGVuc2lvbigmZmlsZV9wcm90bywgImdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMiLCAib3B0aW9uMSIsIDEwMDAsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfT1BUSU9OQUwsCisgICAgICAgICAgICAgICBGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9JTlQzMik7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworICAvLyBBZGQgImJhci5wcm90byI6CisgIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisgIC8vICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgeworICAvLyAgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uMiA9IDEwMDA7CisgIC8vICAgfQorICBmaWxlX3Byb3RvLkNsZWFyKCk7CisgIGZpbGVfcHJvdG8uc2V0X25hbWUoImJhci5wcm90byIpOworICBmaWxlX3Byb3RvLmFkZF9kZXBlbmRlbmN5KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOworICBBZGRFeHRlbnNpb24oJmZpbGVfcHJvdG8sICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIiwgIm9wdGlvbjIiLCAxMDAwLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICAvLyBDdXJyZW50bHkgd2Ugb25seSBnZW5lcmF0ZSBhIHdhcm5pbmcgZm9yIGNvbmZsaWN0aW5nIGV4dGVuc2lvbiBudW1iZXJzLgorICAvLyBUT0RPKHhpYW9mZW5nKTogQ2hhbmdlIGl0IHRvIGFuIGVycm9yLgorICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisvLyBUZXN0IHJlc2VydmVkIGZpZWxkcy4KK2NsYXNzIFJlc2VydmVkRGVzY3JpcHRvclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgICAgLy8gQnVpbGQgZGVzY3JpcHRvcnMgZm9yIHRoZSBmb2xsb3dpbmcgZGVmaW5pdGlvbnM6CisgICAgLy8KKyAgICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgICAvLyAgICAgcmVzZXJ2ZWQgMiwgOSB0byAxMSwgMTU7CisgICAgLy8gICAgIHJlc2VydmVkICJmb28iLCAiYmFyIjsKKyAgICAvLyAgIH0KKworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZm9vX2ZpbGU7CisgICAgZm9vX2ZpbGUuc2V0X25hbWUoImZvby5wcm90byIpOworCisgICAgRGVzY3JpcHRvclByb3RvKiBmb28gPSBBZGRNZXNzYWdlKCZmb29fZmlsZSwgIkZvbyIpOworICAgIEFkZFJlc2VydmVkUmFuZ2UoZm9vLCAyLCAzKTsKKyAgICBBZGRSZXNlcnZlZFJhbmdlKGZvbywgOSwgMTIpOworICAgIEFkZFJlc2VydmVkUmFuZ2UoZm9vLCAxNSwgMTYpOworCisgICAgZm9vLT5hZGRfcmVzZXJ2ZWRfbmFtZSgiZm9vIik7CisgICAgZm9vLT5hZGRfcmVzZXJ2ZWRfbmFtZSgiYmFyIik7CisKKyAgICAvLyBCdWlsZCB0aGUgZGVzY3JpcHRvcnMgYW5kIGdldCB0aGUgcG9pbnRlcnMuCisgICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19maWxlKTsKKyAgICBBU1NFUlRfVFJVRShmb29fZmlsZV8gIT0gTlVMTCk7CisKKyAgICBBU1NFUlRfRVEoMSwgZm9vX2ZpbGVfLT5tZXNzYWdlX3R5cGVfY291bnQoKSk7CisgICAgZm9vXyA9IGZvb19maWxlXy0+bWVzc2FnZV90eXBlKDApOworICB9CisKKyAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmb29fZmlsZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIGZvb187Cit9OworCitURVNUX0YoUmVzZXJ2ZWREZXNjcmlwdG9yVGVzdCwgUmVzZXJ2ZWRSYW5nZXMpIHsKKyAgQVNTRVJUX0VRKDMsIGZvb18tPnJlc2VydmVkX3JhbmdlX2NvdW50KCkpOworCisgIEVYUEVDVF9FUSgyLCBmb29fLT5yZXNlcnZlZF9yYW5nZSgwKS0+c3RhcnQpOworICBFWFBFQ1RfRVEoMywgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMCktPmVuZCk7CisKKyAgRVhQRUNUX0VRKDksIGZvb18tPnJlc2VydmVkX3JhbmdlKDEpLT5zdGFydCk7CisgIEVYUEVDVF9FUSgxMiwgZm9vXy0+cmVzZXJ2ZWRfcmFuZ2UoMSktPmVuZCk7CisKKyAgRVhQRUNUX0VRKDE1LCBmb29fLT5yZXNlcnZlZF9yYW5nZSgyKS0+c3RhcnQpOworICBFWFBFQ1RfRVEoMTYsIGZvb18tPnJlc2VydmVkX3JhbmdlKDIpLT5lbmQpOworfTsKKworVEVTVF9GKFJlc2VydmVkRGVzY3JpcHRvclRlc3QsIElzUmVzZXJ2ZWROdW1iZXIpIHsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoMSkpOworICBFWFBFQ1RfVFJVRSAoZm9vXy0+SXNSZXNlcnZlZE51bWJlcigyKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDMpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROdW1iZXIoOCkpOworICBFWFBFQ1RfVFJVRSAoZm9vXy0+SXNSZXNlcnZlZE51bWJlcig5KSk7CisgIEVYUEVDVF9UUlVFIChmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDEwKSk7CisgIEVYUEVDVF9UUlVFIChmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDExKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDEyKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDEzKSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDE0KSk7CisgIEVYUEVDVF9UUlVFIChmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDE1KSk7CisgIEVYUEVDVF9GQUxTRShmb29fLT5Jc1Jlc2VydmVkTnVtYmVyKDE2KSk7Cit9OworCitURVNUX0YoUmVzZXJ2ZWREZXNjcmlwdG9yVGVzdCwgUmVzZXJ2ZWROYW1lcykgeworICBBU1NFUlRfRVEoMiwgZm9vXy0+cmVzZXJ2ZWRfbmFtZV9jb3VudCgpKTsKKworICBFWFBFQ1RfRVEoImZvbyIsIGZvb18tPnJlc2VydmVkX25hbWUoMCkpOworICBFWFBFQ1RfRVEoImJhciIsIGZvb18tPnJlc2VydmVkX25hbWUoMSkpOworfTsKKworVEVTVF9GKFJlc2VydmVkRGVzY3JpcHRvclRlc3QsIElzUmVzZXJ2ZWROYW1lKSB7CisgIEVYUEVDVF9UUlVFIChmb29fLT5Jc1Jlc2VydmVkTmFtZSgiZm9vIikpOworICBFWFBFQ1RfVFJVRSAoZm9vXy0+SXNSZXNlcnZlZE5hbWUoImJhciIpKTsKKyAgRVhQRUNUX0ZBTFNFKGZvb18tPklzUmVzZXJ2ZWROYW1lKCJiYXoiKSk7Cit9OworCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGNsYXNzIE1pc2NUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHByb3RlY3RlZDoKLSAgLy8gRnVuY3Rpb24gd2hpY2ggbWFrZXMgYSBmaWVsZCBvZiB0aGUgZ2l2ZW4gdHlwZSBqdXN0IHRvIGZpbmQgb3V0IHdoYXQgaXRzCi0gIC8vIGNwcF90eXBlIGlzLgotICBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAvLyBGdW5jdGlvbiB3aGljaCBtYWtlcyBhIGZpZWxkIGRlc2NyaXB0b3Igb2YgdGhlIGdpdmVuIHR5cGUuCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CiAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwogICAgIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOwogICAgIEFkZEVtcHR5RW51bSgmZmlsZV9wcm90bywgIkR1bW15RW51bSIpOwpAQCAtMTUzOCwxOSArMTk5Niw5OSBAQAogICAgIH0KIAogICAgIC8vIEJ1aWxkIHRoZSBkZXNjcmlwdG9ycyBhbmQgZ2V0IHRoZSBwb2ludGVycy4KLSAgICBEZXNjcmlwdG9yUG9vbCBwb29sOwotICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90byk7CisgICAgcG9vbF8ucmVzZXQobmV3IERlc2NyaXB0b3JQb29sKCkpOworICAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8tPkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKIAogICAgIGlmIChmaWxlICE9IE5VTEwgJiYKICAgICAgICAgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkgPT0gMSAmJgogICAgICAgICBmaWxlLT5tZXNzYWdlX3R5cGUoMCktPmZpZWxkX2NvdW50KCkgPT0gMSkgewotICAgICAgcmV0dXJuIGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+ZmllbGQoMCktPmNwcF90eXBlKCk7CisgICAgICByZXR1cm4gZmlsZS0+bWVzc2FnZV90eXBlKDApLT5maWVsZCgwKTsKICAgICB9IGVsc2UgewotICAgICAgcmV0dXJuIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZT4oMCk7CisgICAgICByZXR1cm4gTlVMTDsKICAgICB9CiAgIH0KKworICBjb25zdCBjaGFyKiBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBHZXRGaWVsZERlc2NyaXB0b3JPZlR5cGUodHlwZSk7CisgICAgcmV0dXJuIGZpZWxkICE9IE5VTEwgPyBmaWVsZC0+dHlwZV9uYW1lKCkgOiAiIjsKKyAgfQorCisgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBHZXRDcHBUeXBlRm9yRmllbGRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IEdldEZpZWxkRGVzY3JpcHRvck9mVHlwZSh0eXBlKTsKKyAgICByZXR1cm4gZmllbGQgIT0gTlVMTCA/IGZpZWxkLT5jcHBfdHlwZSgpIDoKKyAgICAgICAgc3RhdGljX2Nhc3Q8RmllbGREZXNjcmlwdG9yOjpDcHBUeXBlPigwKTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIEdldENwcFR5cGVOYW1lRm9yRmllbGRUeXBlKEZpZWxkRGVzY3JpcHRvcjo6VHlwZSB0eXBlKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IEdldEZpZWxkRGVzY3JpcHRvck9mVHlwZSh0eXBlKTsKKyAgICByZXR1cm4gZmllbGQgIT0gTlVMTCA/IGZpZWxkLT5jcHBfdHlwZV9uYW1lKCkgOiAiIjsKKyAgfQorCisgIGNvbnN0IERlc2NyaXB0b3IqIEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKAorICAgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gR2V0RmllbGREZXNjcmlwdG9yT2ZUeXBlKHR5cGUpOworICAgIHJldHVybiBmaWVsZCAhPSBOVUxMID8gZmllbGQtPm1lc3NhZ2VfdHlwZSgpIDogTlVMTDsKKyAgfQorCisgIGNvbnN0IEVudW1EZXNjcmlwdG9yKiBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZSgKKyAgICBGaWVsZERlc2NyaXB0b3I6OlR5cGUgdHlwZSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBHZXRGaWVsZERlc2NyaXB0b3JPZlR5cGUodHlwZSk7CisgICAgcmV0dXJuIGZpZWxkICE9IE5VTEwgPyBmaWVsZC0+ZW51bV90eXBlKCkgOiBOVUxMOworICB9CisKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxEZXNjcmlwdG9yUG9vbD4gcG9vbF87CiB9OwogCitURVNUX0YoTWlzY1Rlc3QsIFR5cGVOYW1lcykgeworICAvLyBUZXN0IHRoYXQgY29ycmVjdCB0eXBlIG5hbWVzIGFyZSByZXR1cm5lZC4KKworICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIHVnbHkgbGluZSB3cmFwcGluZworCisgIEVYUEVDVF9TVFJFUSgiZG91YmxlIiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUgICkpOworICBFWFBFQ1RfU1RSRVEoImZsb2F0IiAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJpbnQ2NCIgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDY0ICAgKSk7CisgIEVYUEVDVF9TVFJFUSgidWludDY0IiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UNjQgICkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJmaXhlZDY0IiAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZJWEVENjQgKSk7CisgIEVYUEVDVF9TVFJFUSgiZml4ZWQzMiIgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDMyICkpOworICBFWFBFQ1RfU1RSRVEoImJvb2wiICAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQk9PTCAgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJzdHJpbmciICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NUUklORyAgKSk7CisgIEVYUEVDVF9TVFJFUSgiZ3JvdXAiICAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9HUk9VUCAgICkpOworICBFWFBFQ1RfU1RSRVEoIm1lc3NhZ2UiICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSApKTsKKyAgRVhQRUNUX1NUUkVRKCJieXRlcyIgICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JZVEVTICAgKSk7CisgIEVYUEVDVF9TVFJFUSgidWludDMyIiAgLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UMzIgICkpOworICBFWFBFQ1RfU1RSRVEoImVudW0iICAgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRU5VTSAgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJzZml4ZWQzMiIsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDMyKSk7CisgIEVYUEVDVF9TVFJFUSgic2ZpeGVkNjQiLCBHZXRUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQ2NCkpOworICBFWFBFQ1RfU1RSRVEoInNpbnQzMiIgICwgR2V0VHlwZU5hbWVGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyICApKTsKKyAgRVhQRUNUX1NUUkVRKCJzaW50NjQiICAsIEdldFR5cGVOYW1lRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQ2NCAgKSk7Cit9CisKK1RFU1RfRihNaXNjVGVzdCwgU3RhdGljVHlwZU5hbWVzKSB7CisgIC8vIFRlc3QgdGhhdCBjb3JyZWN0IHR5cGUgbmFtZXMgYXJlIHJldHVybmVkLgorCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX1NUUkVRKCJkb3VibGUiICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9ET1VCTEUgICkpOworICBFWFBFQ1RfU1RSRVEoImZsb2F0IiAgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0ZMT0FUICAgKSk7CisgIEVYUEVDVF9TVFJFUSgiaW50NjQiICAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfSU5UNjQgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50NjQiICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9VSU5UNjQgICkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiAgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0lOVDMyICAgKSk7CisgIEVYUEVDVF9TVFJFUSgiZml4ZWQ2NCIgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfRklYRUQ2NCApKTsKKyAgRVhQRUNUX1NUUkVRKCJmaXhlZDMyIiAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9GSVhFRDMyICkpOworICBFWFBFQ1RfU1RSRVEoImJvb2wiICAgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0JPT0wgICAgKSk7CisgIEVYUEVDVF9TVFJFUSgic3RyaW5nIiAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfU1RSSU5HICApKTsKKyAgRVhQRUNUX1NUUkVRKCJncm91cCIgICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9HUk9VUCAgICkpOworICBFWFBFQ1RfU1RSRVEoIm1lc3NhZ2UiICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX01FU1NBR0UgKSk7CisgIEVYUEVDVF9TVFJFUSgiYnl0ZXMiICAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfQllURVMgICApKTsKKyAgRVhQRUNUX1NUUkVRKCJ1aW50MzIiICAsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9VSU5UMzIgICkpOworICBFWFBFQ1RfU1RSRVEoImVudW0iICAgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX0VOVU0gICAgKSk7CisgIEVYUEVDVF9TVFJFUSgic2ZpeGVkMzIiLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfU0ZJWEVEMzIpKTsKKyAgRVhQRUNUX1NUUkVRKCJzZml4ZWQ2NCIsIEZEOjpUeXBlTmFtZShGRDo6VFlQRV9TRklYRUQ2NCkpOworICBFWFBFQ1RfU1RSRVEoInNpbnQzMiIgICwgRkQ6OlR5cGVOYW1lKEZEOjpUWVBFX1NJTlQzMiAgKSk7CisgIEVYUEVDVF9TVFJFUSgic2ludDY0IiAgLCBGRDo6VHlwZU5hbWUoRkQ6OlRZUEVfU0lOVDY0ICApKTsKK30KKwogVEVTVF9GKE1pc2NUZXN0LCBDcHBUeXBlcykgewogICAvLyBUZXN0IHRoYXQgQ1BQIHR5cGVzIGFyZSBhc3NpZ25lZCBjb3JyZWN0bHkuCiAKQEAgLTE1NzYsNiArMjExNCw5OSBAQAogICBFWFBFQ1RfRVEoRkQ6OkNQUFRZUEVfSU5UNjQgICwgR2V0Q3BwVHlwZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TSU5UNjQgICkpOwogfQogCitURVNUX0YoTWlzY1Rlc3QsIENwcFR5cGVOYW1lcykgeworICAvLyBUZXN0IHRoYXQgY29ycmVjdCBDUFAgdHlwZSBuYW1lcyBhcmUgcmV0dXJuZWQuCisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3IgRkQ7ICAvLyBhdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKKworICBFWFBFQ1RfU1RSRVEoImRvdWJsZSIgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUgICkpOworICBFWFBFQ1RfU1RSRVEoImZsb2F0IiAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GTE9BVCAgICkpOworICBFWFBFQ1RfU1RSRVEoImludDY0IiAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQ2NCAgICkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQ2NCIgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UNjQgICkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQzMiAgICkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQ2NCIgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDY0ICkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQzMiIgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDMyICkpOworICBFWFBFQ1RfU1RSRVEoImJvb2wiICAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9CT09MICAgICkpOworICBFWFBFQ1RfU1RSRVEoInN0cmluZyIgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TVFJJTkcgICkpOworICBFWFBFQ1RfU1RSRVEoIm1lc3NhZ2UiLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9HUk9VUCAgICkpOworICBFWFBFQ1RfU1RSRVEoIm1lc3NhZ2UiLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9NRVNTQUdFICkpOworICBFWFBFQ1RfU1RSRVEoInN0cmluZyIgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9CWVRFUyAgICkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQzMiIgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UMzIgICkpOworICBFWFBFQ1RfU1RSRVEoImVudW0iICAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9FTlVNICAgICkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQzMikpOworICBFWFBFQ1RfU1RSRVEoImludDY0IiAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQ2NCkpOworICBFWFBFQ1RfU1RSRVEoImludDMyIiAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TSU5UMzIgICkpOworICBFWFBFQ1RfU1RSRVEoImludDY0IiAgLCBHZXRDcHBUeXBlTmFtZUZvckZpZWxkVHlwZShGRDo6VFlQRV9TSU5UNjQgICkpOworfQorCitURVNUX0YoTWlzY1Rlc3QsIFN0YXRpY0NwcFR5cGVOYW1lcykgeworICAvLyBUZXN0IHRoYXQgY29ycmVjdCBDUFAgdHlwZSBuYW1lcyBhcmUgcmV0dXJuZWQuCisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3IgRkQ7ICAvLyBhdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKKworICBFWFBFQ1RfU1RSRVEoImludDMyIiAgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfSU5UMzIgICkpOworICBFWFBFQ1RfU1RSRVEoImludDY0IiAgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfSU5UNjQgICkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQzMiIgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfVUlOVDMyICkpOworICBFWFBFQ1RfU1RSRVEoInVpbnQ2NCIgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfVUlOVDY0ICkpOworICBFWFBFQ1RfU1RSRVEoImRvdWJsZSIgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfRE9VQkxFICkpOworICBFWFBFQ1RfU1RSRVEoImZsb2F0IiAgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfRkxPQVQgICkpOworICBFWFBFQ1RfU1RSRVEoImJvb2wiICAgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfQk9PTCAgICkpOworICBFWFBFQ1RfU1RSRVEoImVudW0iICAgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfRU5VTSAgICkpOworICBFWFBFQ1RfU1RSRVEoInN0cmluZyIgLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfU1RSSU5HICkpOworICBFWFBFQ1RfU1RSRVEoIm1lc3NhZ2UiLCBGRDo6Q3BwVHlwZU5hbWUoRkQ6OkNQUFRZUEVfTUVTU0FHRSkpOworfQorCitURVNUX0YoTWlzY1Rlc3QsIE1lc3NhZ2VUeXBlKSB7CisgIC8vIFRlc3QgdGhhdCBtZXNzYWdlX3R5cGUoKSBpcyBOVUxMIGZvciBub24tYWdncmVnYXRlIGZpZWxkcworCisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgdWdseSBsaW5lIHdyYXBwaW5nCisKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9ET1VCTEUgICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZMT0FUICAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UNjQgICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UNjQgICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0lOVDMyICAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRklYRUQ2NCApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDMyICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0JPT0wgICAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU1RSSU5HICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCAhPSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9HUk9VUCAgICkpOworICBFWFBFQ1RfVFJVRShOVUxMICE9IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX01FU1NBR0UgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQllURVMgICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9VSU5UMzIgICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0VOVU0gICAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0ZJWEVEMzIpKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRNZXNzYWdlRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQ2NCkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldE1lc3NhZ2VEZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NJTlQzMiAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0TWVzc2FnZURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDY0ICApKTsKK30KKworVEVTVF9GKE1pc2NUZXN0LCBFbnVtVHlwZSkgeworICAvLyBUZXN0IHRoYXQgZW51bV90eXBlKCkgaXMgTlVMTCBmb3Igbm9uLWVudW0gZmllbGRzCisKKyAgdHlwZWRlZiBGaWVsZERlc2NyaXB0b3IgRkQ7ICAvLyBhdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKKworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0RPVUJMRSAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRkxPQVQgICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9JTlQ2NCAgICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQ2NCAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfSU5UMzIgICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9GSVhFRDY0ICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0ZJWEVEMzIgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfQk9PTCAgICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TVFJJTkcgICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX0dST1VQICAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfTUVTU0FHRSApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9CWVRFUyAgICkpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1VJTlQzMiAgKSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgIT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfRU5VTSAgICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TRklYRUQzMikpOworICBFWFBFQ1RfVFJVRShOVUxMID09IEdldEVudW1EZXNjcmlwdG9yRm9yRmllbGRUeXBlKEZEOjpUWVBFX1NGSVhFRDY0KSk7CisgIEVYUEVDVF9UUlVFKE5VTEwgPT0gR2V0RW51bURlc2NyaXB0b3JGb3JGaWVsZFR5cGUoRkQ6OlRZUEVfU0lOVDMyICApKTsKKyAgRVhQRUNUX1RSVUUoTlVMTCA9PSBHZXRFbnVtRGVzY3JpcHRvckZvckZpZWxkVHlwZShGRDo6VFlQRV9TSU5UNjQgICkpOworfQorCisKIFRFU1RfRihNaXNjVGVzdCwgRGVmYXVsdFZhbHVlcykgewogICAvLyBUZXN0IHRoYXQgc2V0dGluZyBkZWZhdWx0IHZhbHVlcyB3b3Jrcy4KICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwpAQCAtMTY3MCw3ICsyMzAxLDcgQEAKICAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkKDMpLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKICAgRVhQRUNUX0VRKDQuNSAgICAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDQpLT5kZWZhdWx0X3ZhbHVlX2Zsb2F0ICgpKTsKICAgRVhQRUNUX0VRKDEwZTEwMCAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDUpLT5kZWZhdWx0X3ZhbHVlX2RvdWJsZSgpKTsKLSAgRVhQRUNUX0VRKHRydWUgICAgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDYpLT5kZWZhdWx0X3ZhbHVlX2Jvb2wgICgpKTsKKyAgRVhQRUNUX1RSVUUoICAgICAgICAgICAgICAgIG1lc3NhZ2UtPmZpZWxkKDYpLT5kZWZhdWx0X3ZhbHVlX2Jvb2wgICgpKTsKICAgRVhQRUNUX0VRKCJoZWxsbyIgICAgICAgICAsIG1lc3NhZ2UtPmZpZWxkKDcpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKICAgRVhQRUNUX0VRKCJcMDAxXDAwMlwwMDMiICAsIG1lc3NhZ2UtPmZpZWxkKDgpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKICAgRVhQRUNUX0VRKGVudW1fdmFsdWVfYiAgICAsIG1lc3NhZ2UtPmZpZWxkKDkpLT5kZWZhdWx0X3ZhbHVlX2VudW0gICgpKTsKQEAgLTE2OTMsNyArMjMyNCw3IEBACiAgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS0+ZmllbGQoMTQpLT5kZWZhdWx0X3ZhbHVlX3VpbnQ2NCgpKTsKICAgRVhQRUNUX0VRKDAuMGYgLCBtZXNzYWdlLT5maWVsZCgxNSktPmRlZmF1bHRfdmFsdWVfZmxvYXQgKCkpOwogICBFWFBFQ1RfRVEoMC4wICAsIG1lc3NhZ2UtPmZpZWxkKDE2KS0+ZGVmYXVsdF92YWx1ZV9kb3VibGUoKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS0+ZmllbGQoMTcpLT5kZWZhdWx0X3ZhbHVlX2Jvb2wgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLT5maWVsZCgxNyktPmRlZmF1bHRfdmFsdWVfYm9vbCAgKCkpOwogICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2UtPmZpZWxkKDE4KS0+ZGVmYXVsdF92YWx1ZV9zdHJpbmcoKSk7CiAgIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS0+ZmllbGQoMTkpLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKICAgRVhQRUNUX0VRKGVudW1fdmFsdWVfYSwgbWVzc2FnZS0+ZmllbGQoMjApLT5kZWZhdWx0X3ZhbHVlX2VudW0oKSk7CkBAIC0xNzM5LDEzICsyMzcwLDMxIEBACiB9CiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK2VudW0gRGVzY3JpcHRvclBvb2xNb2RlIHsKKyAgTk9fREFUQUJBU0UsCisgIEZBTExCQUNLX0RBVEFCQVNFCit9OwogCi1jbGFzcyBBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgeworY2xhc3MgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdAorICAgIDogcHVibGljIHRlc3Rpbmc6OlRlc3RXaXRoUGFyYW08RGVzY3JpcHRvclBvb2xNb2RlPiB7CiAgcHJvdGVjdGVkOgorICBEZXNjcmlwdG9yUG9vbE1vZGUgbW9kZSgpIHsKKyAgICByZXR1cm4gR2V0UGFyYW0oKTsKKyAgIH0KKwogICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CiAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmb29fcHJvdG8sIGJhcl9wcm90bzsKIAotICAgIHBvb2xfLkFsbG93VW5rbm93bkRlcGVuZGVuY2llcygpOworICAgIHN3aXRjaCAobW9kZSgpKSB7CisgICAgICBjYXNlIE5PX0RBVEFCQVNFOgorICAgICAgICBwb29sXy5yZXNldChuZXcgRGVzY3JpcHRvclBvb2wpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgRkFMTEJBQ0tfREFUQUJBU0U6CisgICAgICAgIHBvb2xfLnJlc2V0KG5ldyBEZXNjcmlwdG9yUG9vbCgmZGJfKSk7CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIHBvb2xfLT5BbGxvd1Vua25vd25EZXBlbmRlbmNpZXMoKTsKIAogICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKICAgICAgICJuYW1lOiAnZm9vLnByb3RvJyIKQEAgLTE3NzYsMTMgKzI0MjUsMTMgQEAKICAgICAgICZiYXJfcHJvdG8pKTsKIAogICAgIC8vIENvbGxlY3QgcG9pbnRlcnMgdG8gc3R1ZmYuCi0gICAgYmFyX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGJhcl9wcm90byk7CisgICAgYmFyX2ZpbGVfID0gQnVpbGRGaWxlKGJhcl9wcm90byk7CiAgICAgQVNTRVJUX1RSVUUoYmFyX2ZpbGVfICE9IE5VTEwpOwogCiAgICAgQVNTRVJUX0VRKDEsIGJhcl9maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwogICAgIGJhcl90eXBlXyA9IGJhcl9maWxlXy0+bWVzc2FnZV90eXBlKDApOwogCi0gICAgZm9vX2ZpbGVfID0gcG9vbF8uQnVpbGRGaWxlKGZvb19wcm90byk7CisgICAgZm9vX2ZpbGVfID0gQnVpbGRGaWxlKGZvb19wcm90byk7CiAgICAgQVNTRVJUX1RSVUUoZm9vX2ZpbGVfICE9IE5VTEwpOwogCiAgICAgQVNTRVJUX0VRKDEsIGZvb19maWxlXy0+bWVzc2FnZV90eXBlX2NvdW50KCkpOwpAQCAtMTc5NCw2ICsyNDQzLDIwIEBACiAgICAgcXV4X2ZpZWxkXyA9IGZvb190eXBlXy0+ZmllbGQoMik7CiAgIH0KIAorICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IEZpbGVEZXNjcmlwdG9yUHJvdG8mIHByb3RvKSB7CisgICAgc3dpdGNoIChtb2RlKCkpIHsKKyAgICAgIGNhc2UgTk9fREFUQUJBU0U6CisgICAgICAgIHJldHVybiBwb29sXy0+QnVpbGRGaWxlKHByb3RvKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZBTExCQUNLX0RBVEFCQVNFOiB7CisgICAgICAgIEVYUEVDVF9UUlVFKGRiXy5BZGQocHJvdG8pKTsKKyAgICAgICAgcmV0dXJuIHBvb2xfLT5GaW5kRmlsZUJ5TmFtZShwcm90by5uYW1lKCkpOworICAgICAgfQorICAgIH0KKyAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCiAgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYXJfZmlsZV87CiAgIGNvbnN0IERlc2NyaXB0b3IqIGJhcl90eXBlXzsKICAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZvb19maWxlXzsKQEAgLTE4MDIsNDYgKzI0NjUsNTYgQEAKICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBiYXpfZmllbGRfOwogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHF1eF9maWVsZF87CiAKLSAgRGVzY3JpcHRvclBvb2wgcG9vbF87CisgIFNpbXBsZURlc2NyaXB0b3JEYXRhYmFzZSBkYl87ICAgICAgICAvLyB1c2VkIGlmIGluIEZBTExCQUNLX0RBVEFCQVNFIG1vZGUuCisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8RGVzY3JpcHRvclBvb2w+IHBvb2xfOwogfTsKIAotVEVTVF9GKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFBsYWNlaG9sZGVyRmlsZSkgeworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFBsYWNlaG9sZGVyRmlsZSkgewogICBBU1NFUlRfRVEoMiwgZm9vX2ZpbGVfLT5kZXBlbmRlbmN5X2NvdW50KCkpOwogICBFWFBFQ1RfRVEoYmFyX2ZpbGVfLCBmb29fZmlsZV8tPmRlcGVuZGVuY3koMCkpOworICBFWFBFQ1RfRkFMU0UoYmFyX2ZpbGVfLT5pc19wbGFjZWhvbGRlcigpKTsKIAogICBjb25zdCBGaWxlRGVzY3JpcHRvciogYmF6X2ZpbGUgPSBmb29fZmlsZV8tPmRlcGVuZGVuY3koMSk7CiAgIEVYUEVDVF9FUSgiYmF6LnByb3RvIiwgYmF6X2ZpbGUtPm5hbWUoKSk7CiAgIEVYUEVDVF9FUSgwLCBiYXpfZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBFWFBFQ1RfVFJVRShiYXpfZmlsZS0+aXNfcGxhY2Vob2xkZXIoKSk7CiAKICAgLy8gUGxhY2Vob2xkZXIgZmlsZXMgc2hvdWxkIG5vdCBiZSBmaW5kYWJsZS4KLSAgRVhQRUNUX0VRKGJhcl9maWxlXywgcG9vbF8uRmluZEZpbGVCeU5hbWUoYmFyX2ZpbGVfLT5uYW1lKCkpKTsKLSAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEZpbGVCeU5hbWUoYmF6X2ZpbGUtPm5hbWUoKSkgPT0gTlVMTCk7CisgIEVYUEVDVF9FUShiYXJfZmlsZV8sIHBvb2xfLT5GaW5kRmlsZUJ5TmFtZShiYXJfZmlsZV8tPm5hbWUoKSkpOworICBFWFBFQ1RfVFJVRShwb29sXy0+RmluZEZpbGVCeU5hbWUoYmF6X2ZpbGUtPm5hbWUoKSkgPT0gTlVMTCk7CisKKyAgLy8gQ29weSpUbyBzaG91bGQgbm90IGNyYXNoIGZvciBwbGFjZWhvbGRlciBmaWxlcy4KKyAgRmlsZURlc2NyaXB0b3JQcm90byBiYXpfZmlsZV9wcm90bzsKKyAgYmF6X2ZpbGUtPkNvcHlUbygmYmF6X2ZpbGVfcHJvdG8pOworICBiYXpfZmlsZS0+Q29weVNvdXJjZUNvZGVJbmZvVG8oJmJhel9maWxlX3Byb3RvKTsKKyAgRVhQRUNUX0ZBTFNFKGJhel9maWxlX3Byb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOwogfQogCi1URVNUX0YoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgUGxhY2Vob2xkZXJUeXBlcykgeworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIFBsYWNlaG9sZGVyVHlwZXMpIHsKICAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFLCBiYXJfZmllbGRfLT50eXBlKCkpOwogICBFWFBFQ1RfRVEoYmFyX3R5cGVfLCBiYXJfZmllbGRfLT5tZXNzYWdlX3R5cGUoKSk7CisgIEVYUEVDVF9GQUxTRShiYXJfdHlwZV8tPmlzX3BsYWNlaG9sZGVyKCkpOwogCiAgIEFTU0VSVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSwgYmF6X2ZpZWxkXy0+dHlwZSgpKTsKICAgY29uc3QgRGVzY3JpcHRvciogYmF6X3R5cGUgPSBiYXpfZmllbGRfLT5tZXNzYWdlX3R5cGUoKTsKICAgRVhQRUNUX0VRKCJCYXoiLCBiYXpfdHlwZS0+bmFtZSgpKTsKICAgRVhQRUNUX0VRKCJCYXoiLCBiYXpfdHlwZS0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoIkJhei5wbGFjZWhvbGRlci5wcm90byIsIGJhel90eXBlLT5maWxlKCktPm5hbWUoKSk7CiAgIEVYUEVDVF9FUSgwLCBiYXpfdHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkpOworICBFWFBFQ1RfVFJVRShiYXpfdHlwZS0+aXNfcGxhY2Vob2xkZXIoKSk7CiAKICAgQVNTRVJUX0VRKEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9FTlVNLCBxdXhfZmllbGRfLT50eXBlKCkpOwogICBjb25zdCBFbnVtRGVzY3JpcHRvciogcXV4X3R5cGUgPSBxdXhfZmllbGRfLT5lbnVtX3R5cGUoKTsKICAgRVhQRUNUX0VRKCJRdXgiLCBxdXhfdHlwZS0+bmFtZSgpKTsKICAgRVhQRUNUX0VRKCJjb3JnZS5RdXgiLCBxdXhfdHlwZS0+ZnVsbF9uYW1lKCkpOwotICBFWFBFQ1RfRVEoImNvcmdlLlF1eC5wbGFjZWhvbGRlci5wcm90byIsIHF1eF90eXBlLT5maWxlKCktPm5hbWUoKSk7CisgIEVYUEVDVF9UUlVFKHF1eF90eXBlLT5pc19wbGFjZWhvbGRlcigpKTsKIAogICAvLyBQbGFjZWhvbGRlciB0eXBlcyBzaG91bGQgbm90IGJlIGZpbmRhYmxlLgotICBFWFBFQ1RfRVEoYmFyX3R5cGVfLCBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoYmFyX3R5cGVfLT5mdWxsX25hbWUoKSkpOwotICBFWFBFQ1RfVFJVRShwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoYmF6X3R5cGUtPmZ1bGxfbmFtZSgpKSA9PSBOVUxMKTsKLSAgRVhQRUNUX1RSVUUocG9vbF8uRmluZEVudW1UeXBlQnlOYW1lKHF1eF90eXBlLT5mdWxsX25hbWUoKSkgPT0gTlVMTCk7CisgIEVYUEVDVF9FUShiYXJfdHlwZV8sIHBvb2xfLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoYmFyX3R5cGVfLT5mdWxsX25hbWUoKSkpOworICBFWFBFQ1RfVFJVRShwb29sXy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKGJhel90eXBlLT5mdWxsX25hbWUoKSkgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2xfLT5GaW5kRW51bVR5cGVCeU5hbWUocXV4X3R5cGUtPmZ1bGxfbmFtZSgpKSA9PSBOVUxMKTsKIH0KIAotVEVTVF9GKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIENvcHlUbykgeworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIENvcHlUbykgewogICAvLyBGaWVsZERlc2NyaXB0b3I6OkNvcHlUbygpIHNob3VsZCB3cml0ZSBub24tZnVsbHktcXVhbGlmaWVkIHR5cGUgbmFtZXMKICAgLy8gZm9yIHBsYWNlaG9sZGVyIHR5cGVzIHdoaWNoIHdlcmUgbm90IG9yaWdpbmFsbHkgZnVsbHktcXVhbGlmaWVkLgogICBGaWVsZERlc2NyaXB0b3JQcm90byBwcm90bzsKQEAgLTE4NjQsNyArMjUzNyw3IEBACiAgIEVYUEVDVF9FUShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9FTlVNLCBwcm90by50eXBlKCkpOwogfQogCi1URVNUX0YoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwgQ3VzdG9tT3B0aW9ucykgeworVEVTVF9QKEFsbG93VW5rbm93bkRlcGVuZGVuY2llc1Rlc3QsIEN1c3RvbU9wdGlvbnMpIHsKICAgLy8gUXV4IHNob3VsZCBzdGlsbCBoYXZlIHRoZSB1bmludGVycHJldGVkIG9wdGlvbiBhdHRhY2hlZC4KICAgQVNTRVJUX0VRKDEsIHF1eF9maWVsZF8tPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbl9zaXplKCkpOwogICBjb25zdCBVbmludGVycHJldGVkT3B0aW9uJiBvcHRpb24gPQpAQCAtMTg3Myw3ICsyNTQ2LDcgQEAKICAgRVhQRUNUX0VRKCJncmF1bHQiLCBvcHRpb24ubmFtZSgwKS5uYW1lX3BhcnQoKSk7CiB9CiAKLVRFU1RfRihBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBVbmtub3duRXh0ZW5kZWUpIHsKK1RFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBVbmtub3duRXh0ZW5kZWUpIHsKICAgLy8gVGVzdCB0aGF0IHdlIGNhbiBleHRlbmQgYW4gdW5rbm93biB0eXBlLiAgVGhpcyBpcyBzbGlnaHRseSB0cmlja3kgYmVjYXVzZQogICAvLyBpdCBtZWFucyB0aGF0IHRoZSBwbGFjZWhvbGRlciB0eXBlIG11c3QgaGF2ZSBhbiBleHRlbnNpb24gcmFuZ2UuCiAKQEAgLTE4ODQsMTkgKzI1NTcsMjAgQEAKICAgICAiZXh0ZW5zaW9uIHsgZXh0ZW5kZWU6ICdVbmtub3duVHlwZScgbmFtZTonc29tZV9leHRlbnNpb24nIG51bWJlcjoxMjMiCiAgICAgIiAgICAgICAgICAgIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IiwKICAgICAmZXh0ZW5zaW9uX3Byb3RvKSk7Ci0gIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gcG9vbF8uQnVpbGRGaWxlKGV4dGVuc2lvbl9wcm90byk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlID0gQnVpbGRGaWxlKGV4dGVuc2lvbl9wcm90byk7CiAKICAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKIAogICBBU1NFUlRfRVEoMSwgZmlsZS0+ZXh0ZW5zaW9uX2NvdW50KCkpOwogICBjb25zdCBEZXNjcmlwdG9yKiBleHRlbmRlZSA9IGZpbGUtPmV4dGVuc2lvbigwKS0+Y29udGFpbmluZ190eXBlKCk7CiAgIEVYUEVDVF9FUSgiVW5rbm93blR5cGUiLCBleHRlbmRlZS0+bmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUoZXh0ZW5kZWUtPmlzX3BsYWNlaG9sZGVyKCkpOwogICBBU1NFUlRfRVEoMSwgZXh0ZW5kZWUtPmV4dGVuc2lvbl9yYW5nZV9jb3VudCgpKTsKICAgRVhQRUNUX0VRKDEsIGV4dGVuZGVlLT5leHRlbnNpb25fcmFuZ2UoMCktPnN0YXJ0KTsKICAgRVhQRUNUX0VRKEZpZWxkRGVzY3JpcHRvcjo6a01heE51bWJlciArIDEsIGV4dGVuZGVlLT5leHRlbnNpb25fcmFuZ2UoMCktPmVuZCk7CiB9CiAKLVRFU1RfRihBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBDdXN0b21PcHRpb24pIHsKK1RFU1RfUChBbGxvd1Vua25vd25EZXBlbmRlbmNpZXNUZXN0LCBDdXN0b21PcHRpb24pIHsKICAgLy8gVGVzdCB0aGF0IHdlIGNhbiB1c2UgYSBjdXN0b20gb3B0aW9uIHdpdGhvdXQgaGF2aW5nIHBhcnNlZAogICAvLyBkZXNjcmlwdG9yLnByb3RvLgogCkBAIC0xOTM3LDcgKzI2MTEsNyBAQAogICAgICJ9IiwKICAgICAmb3B0aW9uX3Byb3RvKSk7CiAKLSAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sXy5CdWlsZEZpbGUob3B0aW9uX3Byb3RvKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBCdWlsZEZpbGUob3B0aW9uX3Byb3RvKTsKICAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKIAogICAvLyBWZXJpZnkgdGhhdCBubyBleHRlbnNpb24gb3B0aW9ucyB3ZXJlIHNldCwgYnV0IHRoZXkgd2VyZSBsZWZ0IGFzCkBAIC0xOTQ5LDYgKzI2MjMsODEgQEAKICAgRVhQRUNUX0VRKDIsIGZpbGUtPm9wdGlvbnMoKS51bmludGVycHJldGVkX29wdGlvbl9zaXplKCkpOwogfQogCitURVNUX1AoQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwKKyAgICAgICBVbmRlY2xhcmVkRGVwZW5kZW5jeVRyaWdnZXJzQnVpbGRPZkRlcGVuZGVuY3kpIHsKKyAgLy8gQ3JhenkgY2FzZTogc3VwcG9zZSBmb28ucHJvdG8gcmVmZXJzIHRvIGEgc3ltYm9sIHdpdGhvdXQgZGVjbGFyaW5nIHRoZQorICAvLyBkZXBlbmRlbmN5IHRoYXQgZmluZHMgaXQuIEluIHRoZSBldmVudCB0aGF0IHRoZSBwb29sIGlzIGJhY2tlZCBieSBhCisgIC8vIERlc2NyaXB0b3JEYXRhYmFzZSwgdGhlIHBvb2wgd2lsbCBhdHRlbXB0IHRvIGZpbmQgdGhlIHN5bWJvbCBpbiB0aGUKKyAgLy8gZGF0YWJhc2UuIElmIHN1Y2Nlc3NmdWwsIGl0IHdpbGwgYnVpbGQgdGhlIHVuZGVjbGFyZWQgZGVwZW5kZW5jeSB0byB2ZXJpZnkKKyAgLy8gdGhhdCB0aGUgZmlsZSBkb2VzIGluZGVlZCBjb250YWluIHRoZSBzeW1ib2wuIElmIHRoYXQgZmlsZSBmYWlscyB0byBidWlsZCwKKyAgLy8gdGhlbiBpdHMgZGVzY3JpcHRvcnMgbXVzdCBiZSByb2xsZWQgYmFjay4gSG93ZXZlciwgd2Ugc3RpbGwgd2FudCBmb28ucHJvdG8KKyAgLy8gdG8gYnVpbGQgc3VjY2Vzc2Z1bGx5LCBzaW5jZSB3ZSBhcmUgYWxsb3dpbmcgdW5rbm93biBkZXBlbmRlbmNpZXMuCisKKyAgRmlsZURlc2NyaXB0b3JQcm90byB1bmRlY2xhcmVkX2RlcF9wcm90bzsKKyAgLy8gV2UgbWFrZSB0aGlzIGZpbGUgZmFpbCB0byBidWlsZCBieSBnaXZpbmcgaXQgdHdvIGZpZWxkcyB3aXRoIHRhZyAxLgorICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgIm5hbWU6IFwiaW52YWxpZF9maWxlX2FzX3VuZGVjbGFyZWRfZGVwLnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcInVuZGVjbGFyZWRcIiAiCisgICAgIm1lc3NhZ2VfdHlwZTogeyAgIgorICAgICIgIG5hbWU6IFwiUXV1eFwiICAiCisgICAgIiAgZmllbGQgeyAiCisgICAgIiAgICBuYW1lOidxdXgnIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfSU5UMzIgIgorICAgICIgIH0iCisgICAgIiAgZmllbGQgeyAiCisgICAgIiAgICBuYW1lOidxdXV4JyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDY0ICIKKyAgICAiICB9IgorICAgICJ9IiwKKyAgICAmdW5kZWNsYXJlZF9kZXBfcHJvdG8pKTsKKyAgLy8gV2UgY2FuJ3QgdXNlIHRoZSBCdWlsZEZpbGUoKSBoZWxwZXIgYmVjYXVzZSB3ZSBkb24ndCBhY3R1YWxseSB3YW50IHRvIGJ1aWxkCisgIC8vIGl0IGludG8gdGhlIGRlc2NyaXB0b3IgcG9vbCBpbiB0aGUgZmFsbGJhY2sgZGF0YWJhc2UgY2FzZTogaXQganVzdCBuZWVkcyB0bworICAvLyBiZSBzaXR0aW5nIGluIHRoZSBkYXRhYmFzZSBzbyB0aGF0IGl0IGdldHMgYnVpbHQgZHVyaW5nIHRoZSBidWlsZGluZyBvZgorICAvLyB0ZXN0LnByb3RvIGJlbG93LgorICBzd2l0Y2ggKG1vZGUoKSkgeworICAgIGNhc2UgTk9fREFUQUJBU0U6IHsKKyAgICAgIEFTU0VSVF9UUlVFKHBvb2xfLT5CdWlsZEZpbGUodW5kZWNsYXJlZF9kZXBfcHJvdG8pID09IE5VTEwpOworICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgRkFMTEJBQ0tfREFUQUJBU0U6IHsKKyAgICAgIEFTU0VSVF9UUlVFKGRiXy5BZGQodW5kZWNsYXJlZF9kZXBfcHJvdG8pKTsKKyAgICB9CisgIH0KKworICBGaWxlRGVzY3JpcHRvclByb3RvIHRlc3RfcHJvdG87CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAibmFtZTogXCJ0ZXN0LnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGU6IHsgIgorICAgICIgIG5hbWU6IFwiQ29yZ2VcIiAiCisgICAgIiAgZmllbGQgeyAiCisgICAgIiAgICBuYW1lOidxdXV4JyBudW1iZXI6MSBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgdHlwZV9uYW1lOid1bmRlY2xhcmVkLlF1dXgnIHR5cGU6IFRZUEVfTUVTU0FHRSAiCisgICAgIiAgfSIKKyAgICAifSIsCisgICAgJnRlc3RfcHJvdG8pKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IEJ1aWxkRmlsZSh0ZXN0X3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKyAgR09PR0xFX0xPRyhJTkZPKSA8PCBmaWxlLT5EZWJ1Z1N0cmluZygpOworCisgIEVYUEVDVF9FUSgwLCBmaWxlLT5kZXBlbmRlbmN5X2NvdW50KCkpOworICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworICBjb25zdCBEZXNjcmlwdG9yKiBjb3JnZV9kZXNjID0gZmlsZS0+bWVzc2FnZV90eXBlKDApOworICBBU1NFUlRfRVEoIkNvcmdlIiwgY29yZ2VfZGVzYy0+bmFtZSgpKTsKKyAgQVNTRVJUX0VRKDEsIGNvcmdlX2Rlc2MtPmZpZWxkX2NvdW50KCkpOworICBFWFBFQ1RfRkFMU0UoY29yZ2VfZGVzYy0+aXNfcGxhY2Vob2xkZXIoKSk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBxdXV4X2ZpZWxkID0gY29yZ2VfZGVzYy0+ZmllbGQoMCk7CisgIEFTU0VSVF9FUShGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRSwgcXV1eF9maWVsZC0+dHlwZSgpKTsKKyAgQVNTRVJUX0VRKCJRdXV4IiwgcXV1eF9maWVsZC0+bWVzc2FnZV90eXBlKCktPm5hbWUoKSk7CisgIEFTU0VSVF9FUSgidW5kZWNsYXJlZC5RdXV4IiwgcXV1eF9maWVsZC0+bWVzc2FnZV90eXBlKCktPmZ1bGxfbmFtZSgpKTsKKyAgRVhQRUNUX1RSVUUocXV1eF9maWVsZC0+bWVzc2FnZV90eXBlKCktPmlzX3BsYWNlaG9sZGVyKCkpOworICAvLyBUaGUgcGxhY2UgaG9sZGVyIHR5cGUgc2hvdWxkIG5vdCBiZSBmaW5kYWJsZS4KKyAgQVNTRVJUX1RSVUUocG9vbF8tPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgidW5kZWNsYXJlZC5RdXV4IikgPT0gTlVMTCk7Cit9CisKK0lOU1RBTlRJQVRFX1RFU1RfQ0FTRV9QKERhdGFiYXNlU291cmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgQWxsb3dVbmtub3duRGVwZW5kZW5jaWVzVGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlc3Rpbmc6OlZhbHVlcyhOT19EQVRBQkFTRSwgRkFMTEJBQ0tfREFUQUJBU0UpKTsKKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCiBURVNUKEN1c3RvbU9wdGlvbnMsIE9wdGlvbkxvY2F0aW9ucykgewpAQCAtMjIxMiw2ICsyOTYxLDE3MCBAQAogICBFWFBFQ1RfRVEoMTIzNCwgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuZm9vKCkpOwogfQogCitURVNUKEN1c3RvbU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25SZXBlYXRlZExlYWZGaWVsZFNldCkgeworICAvLyBUaGlzIHRlc3QgdmVyaWZpZXMgdGhhdCByZXBlYXRlZCBmaWVsZHMgaW4gY3VzdG9tIG9wdGlvbnMgY2FuIGJlCisgIC8vIGdpdmVuIG11bHRpcGxlIHZhbHVlcyBieSByZXBlYXRpbmcgdGhlIG9wdGlvbiB3aXRoIGEgZGlmZmVyZW50IHZhbHVlLgorICAvLyBUaGlzIHRlc3QgY2hlY2tzIHJlcGVhdGVkIGxlYWYgdmFsdWVzLiBFYWNoIHJlcGVhdGVkIGN1c3RvbSB2YWx1ZQorICAvLyBhcHBlYXJzIGluIGEgZGlmZmVyZW50IHVuaW50ZXJwcmV0ZWRfb3B0aW9uLCB3aGljaCB3aWxsIGJlIGNvbmNhdGVuYXRlZAorICAvLyB3aGVuIHRoZXkgYXJlIG1lcmdlZCBpbnRvIHRoZSBmaW5hbCBvcHRpb24gdmFsdWUuCisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxlRGVzY3JpcHRvclByb3RvOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7CisKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlV2l0aEN1c3RvbU9wdGlvbnM6OmRlc2NyaXB0b3IoKQorICAgIC0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKworICAvLyBUaGUgZm9sbG93aW5nIHJlcHJlc2VudHMgdGhlIGRlZmluaXRpb246CisgIC8vCisgIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iCisgIC8vICAgcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKKyAgLy8gICBtZXNzYWdlIEZvbyB7CisgIC8vICAgICBvcHRpb24gKGNvbXBsZXhfb3B0MSkuZm9vNCA9IDEyOworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDEpLmZvbzQgPSAzNDsKKyAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQxKS5mb280ID0gNTY7CisgIC8vICAgfQorICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgIm5hbWU6IFwiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcInByb3RvYnVmX3VuaXR0ZXN0XCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICIgIG5hbWU6IFwiRm9vXCIgIgorICAgICIgIG9wdGlvbnMgeyAiCisgICAgIiAgICB1bmludGVycHJldGVkX29wdGlvbiB7ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiY29tcGxleF9vcHQxXCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJmb280XCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxMiAiCisgICAgIiAgICB9ICIKKyAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDFcIiAiCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImZvbzRcIiAiCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSAiCisgICAgIiAgICAgIH0gIgorICAgICIgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDM0ICIKKyAgICAiICAgIH0gIgorICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MVwiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiZm9vNFwiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogNTYgIgorICAgICIgICAgfSAiCisgICAgIiAgfSAiCisgICAgIn0iLAorICAgICZmaWxlX3Byb3RvKSk7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGZpbGUgPSBwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKTsKKyAgQVNTRVJUX1RSVUUoZmlsZSAhPSBOVUxMKTsKKyAgQVNTRVJUX0VRKDEsIGZpbGUtPm1lc3NhZ2VfdHlwZV9jb3VudCgpKTsKKworICBjb25zdCBNZXNzYWdlT3B0aW9ucyYgb3B0aW9ucyA9IGZpbGUtPm1lc3NhZ2VfdHlwZSgwKS0+b3B0aW9ucygpOworICBFWFBFQ1RfRVEoMywgb3B0aW9ucy5HZXRFeHRlbnNpb24ocHJvdG9idWZfdW5pdHRlc3Q6OmNvbXBsZXhfb3B0MSkuZm9vNF9zaXplKCkpOworICBFWFBFQ1RfRVEoMTIsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbzQoMCkpOworICBFWFBFQ1RfRVEoMzQsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbzQoMSkpOworICBFWFBFQ1RfRVEoNTYsIG9wdGlvbnMuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDEpLmZvbzQoMikpOworfQorCitURVNUKEN1c3RvbU9wdGlvbnMsIE1lc3NhZ2VPcHRpb25SZXBlYXRlZE1zZ0ZpZWxkU2V0KSB7CisgIC8vIFRoaXMgdGVzdCB2ZXJpZmllcyB0aGF0IHJlcGVhdGVkIGZpZWxkcyBpbiBjdXN0b20gb3B0aW9ucyBjYW4gYmUKKyAgLy8gZ2l2ZW4gbXVsdGlwbGUgdmFsdWVzIGJ5IHJlcGVhdGluZyB0aGUgb3B0aW9uIHdpdGggYSBkaWZmZXJlbnQgdmFsdWUuCisgIC8vIFRoaXMgdGVzdCBjaGVja3MgcmVwZWF0ZWQgbWVzc2FnZSB2YWx1ZXMuIEVhY2ggcmVwZWF0ZWQgY3VzdG9tIHZhbHVlCisgIC8vIGFwcGVhcnMgaW4gYSBkaWZmZXJlbnQgdW5pbnRlcnByZXRlZF9vcHRpb24sIHdoaWNoIHdpbGwgYmUgY29uY2F0ZW5hdGVkCisgIC8vIHdoZW4gdGhleSBhcmUgbWVyZ2VkIGludG8gdGhlIGZpbmFsIG9wdGlvbiB2YWx1ZS4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGVEZXNjcmlwdG9yUHJvdG86OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoQ3VzdG9tT3B0aW9uczo6ZGVzY3JpcHRvcigpCisgICAgLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworCisgIC8vIFRoZSBmb2xsb3dpbmcgcmVwcmVzZW50cyB0aGUgZGVmaW5pdGlvbjoKKyAgLy8KKyAgLy8gICBpbXBvcnQgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90byIKKyAgLy8gICBwYWNrYWdlIHByb3RvYnVmX3VuaXR0ZXN0OworICAvLyAgIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICAgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXJuZXkgPSB7d2FsZG86IDF9OworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhcm5leSA9IHt3YWxkbzogMTB9OworICAvLyAgICAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhcm5leSA9IHt3YWxkbzogMTAwfTsKKyAgLy8gICB9CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAibmFtZTogXCJjdXN0b21fb3B0aW9uc19pbXBvcnQucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgIiAgbmFtZTogXCJGb29cIiAiCisgICAgIiAgb3B0aW9ucyB7ICIKKyAgICAiICAgIHVuaW50ZXJwcmV0ZWRfb3B0aW9uIHsgIgorICAgICIgICAgICBuYW1lIHsgIgorICAgICIgICAgICAgIG5hbWVfcGFydDogXCJjb21wbGV4X29wdDJcIiAiCisgICAgIiAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImJhcm5leVwiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IGZhbHNlICIKKyAgICAiICAgICAgfSAiCisgICAgIiAgICAgIGFnZ3JlZ2F0ZV92YWx1ZTogXCJ3YWxkbzogMVwiICIKKyAgICAiICAgIH0gIgorICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MlwiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiYmFybmV5XCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgYWdncmVnYXRlX3ZhbHVlOiBcIndhbGRvOiAxMFwiICIKKyAgICAiICAgIH0gIgorICAgICIgICAgdW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgIiAgICAgIG5hbWUgeyAiCisgICAgIiAgICAgICAgbmFtZV9wYXJ0OiBcImNvbXBsZXhfb3B0MlwiICIKKyAgICAiICAgICAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgbmFtZSB7ICIKKyAgICAiICAgICAgICBuYW1lX3BhcnQ6IFwiYmFybmV5XCIgIgorICAgICIgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgIgorICAgICIgICAgICB9ICIKKyAgICAiICAgICAgYWdncmVnYXRlX3ZhbHVlOiBcIndhbGRvOiAxMDBcIiAiCisgICAgIiAgICB9ICIKKyAgICAiICB9ICIKKyAgICAifSIsCisgICAgJmZpbGVfcHJvdG8pKTsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShmaWxlICE9IE5VTEwpOworICBBU1NFUlRfRVEoMSwgZmlsZS0+bWVzc2FnZV90eXBlX2NvdW50KCkpOworCisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zID0gZmlsZS0+bWVzc2FnZV90eXBlKDApLT5vcHRpb25zKCk7CisgIEVYUEVDVF9FUSgzLCBvcHRpb25zLkdldEV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcm5leV9zaXplKCkpOworICBFWFBFQ1RfRVEoMSxvcHRpb25zLkdldEV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcm5leSgwKS53YWxkbygpKTsKKyAgRVhQRUNUX0VRKDEwLCBvcHRpb25zLkdldEV4dGVuc2lvbigKKyAgICAgIHByb3RvYnVmX3VuaXR0ZXN0Ojpjb21wbGV4X29wdDIpLmJhcm5leSgxKS53YWxkbygpKTsKKyAgRVhQRUNUX0VRKDEwMCwgb3B0aW9ucy5HZXRFeHRlbnNpb24oCisgICAgICBwcm90b2J1Zl91bml0dGVzdDo6Y29tcGxleF9vcHQyKS5iYXJuZXkoMikud2FsZG8oKSk7Cit9CisKIC8vIENoZWNrIHRoYXQgYWdncmVnYXRlIG9wdGlvbnMgd2VyZSBwYXJzZWQgYW5kIHNhdmVkIGNvcnJlY3RseSBpbgogLy8gdGhlIGFwcHJvcHJpYXRlIGRlc2NyaXB0b3JzLgogVEVTVChDdXN0b21PcHRpb25zLCBBZ2dyZWdhdGVPcHRpb25zKSB7CkBAIC0yMjUyLDUyICszMTY1LDExNSBAQAogICAgICAgICAgICAgbWV0aG9kLT5vcHRpb25zKCkuR2V0RXh0ZW5zaW9uKHByb3RvYnVmX3VuaXR0ZXN0OjptZXRob2RvcHQpLnMoKSk7CiB9CiAKK1RFU1QoQ3VzdG9tT3B0aW9ucywgVW51c2VkSW1wb3J0V2FybmluZykgeworICBEZXNjcmlwdG9yUG9vbCBwb29sOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworCisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVdpdGhDdXN0b21PcHRpb25zOjpkZXNjcmlwdG9yKCkKKyAgICAgIC0+ZmlsZSgpLT5Db3B5VG8oJmZpbGVfcHJvdG8pOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKworICBwb29sLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiY3VzdG9tX29wdGlvbnNfaW1wb3J0LnByb3RvIik7CisgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZygKKyAgICAibmFtZTogXCJjdXN0b21fb3B0aW9uc19pbXBvcnQucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwicHJvdG9idWZfdW5pdHRlc3RcIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2N1c3RvbV9vcHRpb25zLnByb3RvXCIgIiwKKyAgICAmZmlsZV9wcm90bykpOworCisgIE1vY2tFcnJvckNvbGxlY3RvciBlcnJvcl9jb2xsZWN0b3I7CisgIEVYUEVDVF9UUlVFKHBvb2wuQnVpbGRGaWxlQ29sbGVjdGluZ0Vycm9ycyhmaWxlX3Byb3RvLCAmZXJyb3JfY29sbGVjdG9yKSk7CisgIEVYUEVDVF9FUSgiIiwgZXJyb3JfY29sbGVjdG9yLndhcm5pbmdfdGV4dF8pOworfQorCisvLyBWZXJpZmllcyB0aGF0IHByb3RvIGZpbGVzIGNhbiBjb3JyZWN0bHkgYmUgcGFyc2VkLCBldmVuIGlmIHRoZQorLy8gY3VzdG9tIG9wdGlvbnMgZGVmaW5lZCBpbiB0aGUgZmlsZSBhcmUgaW5jb21wYXRpYmxlIHdpdGggdGhvc2UKKy8vIGNvbXBpbGVkIGluIHRoZSBiaW5hcnkuIFNlZSBodHRwOi8vYi8xOTI3NjI1MC4KK1RFU1QoQ3VzdG9tT3B0aW9ucywgT3B0aW9uc1dpdGhSZXF1aXJlZEVudW1zKSB7CisgIERlc2NyaXB0b3JQb29sIHBvb2w7CisKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBNZXNzYWdlT3B0aW9uczo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworCisgIC8vIENyZWF0ZSBhIG5ldyBmaWxlIGRlc2NyaXB0b3IgcHJvdG8gY29udGFpbmluZyBhIHN1YnNldCBvZiB0aGUKKyAgLy8gbWVzc2FnZXMgZGVmaW5lZCBpbiBnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8uCisgIGZpbGVfcHJvdG8uQ2xlYXIoKTsKKyAgZmlsZV9wcm90by5zZXRfbmFtZSgidW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8iKTsKKyAgZmlsZV9wcm90by5zZXRfcGFja2FnZSgicHJvdG9idWZfdW5pdHRlc3QiKTsKKyAgZmlsZV9wcm90by5hZGRfZGVwZW5kZW5jeSgiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG8iKTsKKworICAvLyBBZGQgdGhlICJyZXF1aXJlZF9lbnVtX29wdCIgZXh0ZW5zaW9uLgorICBGaWVsZERlc2NyaXB0b3JQcm90byogZXh0ZW5zaW9uID0gZmlsZV9wcm90by5hZGRfZXh0ZW5zaW9uKCk7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbGRPcHRpb25UeXBlOjpkZXNjcmlwdG9yKCktPmZpbGUoKQorICAgICAgLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJyZXF1aXJlZF9lbnVtX29wdCIpLT5Db3B5VG8oZXh0ZW5zaW9uKTsKKworICAvLyBBZGQgYSB0ZXN0IG1lc3NhZ2UgdGhhdCB1c2VzIHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIG9wdGlvbi4KKyAgRGVzY3JpcHRvclByb3RvKiB0ZXN0X21lc3NhZ2VfdHlwZSA9IGZpbGVfcHJvdG8uYWRkX21lc3NhZ2VfdHlwZSgpOworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VXaXRoUmVxdWlyZWRFbnVtT3B0aW9uOjpkZXNjcmlwdG9yKCkKKyAgICAgIC0+Q29weVRvKHRlc3RfbWVzc2FnZV90eXBlKTsKKworICAvLyBJbnN0cnVjdCB0aGUgZXh0ZW5zaW9uIHRvIHVzZSBOZXdPcHRpb25UeXBlIGluc3RlYWQgb2YKKyAgLy8gT2xkT3B0aW9uVHlwZSwgYW5kIGFkZCB0aGUgZGVzY3JpcHRvciBvZiBOZXdPcHRpb25UeXBlLgorICBleHRlbnNpb24tPnNldF90eXBlX25hbWUoIi5wcm90b2J1Zl91bml0dGVzdC5OZXdPcHRpb25UeXBlIik7CisgIERlc2NyaXB0b3JQcm90byogbmV3X29wdGlvbl90eXBlID0gZmlsZV9wcm90by5hZGRfbWVzc2FnZV90eXBlKCk7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpOZXdPcHRpb25UeXBlOjpkZXNjcmlwdG9yKCkKKyAgICAgIC0+Q29weVRvKG5ld19vcHRpb25fdHlwZSk7CisKKyAgLy8gUmVwbGFjZSB0aGUgdmFsdWUgb2YgdGhlICJyZXF1aXJlZF9lbnVtX29wdCIgb3B0aW9uIHVzZWQgaW4gdGhlCisgIC8vIHRlc3QgbWVzc2FnZSB3aXRoIGFuIGVudW0gdmFsdWUgdGhhdCBvbmx5IGV4aXN0cyBpbiBOZXdPcHRpb25UeXBlLgorICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgICAidW5pbnRlcnByZXRlZF9vcHRpb24geyAiCisgICAgICAiICBuYW1lIHsgIgorICAgICAgIiAgICBuYW1lX3BhcnQ6ICdyZXF1aXJlZF9lbnVtX29wdCcgIgorICAgICAgIiAgICBpc19leHRlbnNpb246IHRydWUgIgorICAgICAgIiAgfSAiCisgICAgICAiICBhZ2dyZWdhdGVfdmFsdWU6ICd2YWx1ZTogTkVXX1ZBTFVFJyAiCisgICAgICAifSIsCisgICAgICB0ZXN0X21lc3NhZ2VfdHlwZS0+bXV0YWJsZV9vcHRpb25zKCkpKTsKKworICAvLyBBZGQgdGhlIGZpbGUgZGVzY3JpcHRvciB0byB0aGUgcG9vbC4KKyAgQVNTRVJUX1RSVUUocG9vbC5CdWlsZEZpbGUoZmlsZV9wcm90bykgIT0gTlVMTCk7CisKKyAgLy8gRmluZCB0aGUgdGVzdCBtZXNzYWdlLgorICBjb25zdCBEZXNjcmlwdG9yKiB0ZXN0X21lc3NhZ2UgPSBwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgKKyAgICAgICJwcm90b2J1Zl91bml0dGVzdC5UZXN0TWVzc2FnZVdpdGhSZXF1aXJlZEVudW1PcHRpb24iKTsKKyAgQVNTRVJUX1RSVUUodGVzdF9tZXNzYWdlICE9IE5VTEwpOworCisgIGNvbnN0IE1lc3NhZ2VPcHRpb25zJiBvcHRpb25zID0gdGVzdF9tZXNzYWdlLT5vcHRpb25zKCk7CisgIC8vIEV4dHJhY3QgdGhlICJyZXF1aXJlZF9lbnVtX29wdCIgb3B0aW9uLiBTaW5jZSB0aGUgYmluYXJ5IGRvZXMgbm90CisgIC8vIGtub3cgdGhhdCB0aGUgZXh0ZW5zaW9uIHdhcyB1cGRhdGVkLCB0aGlzIHdpbGwgc3RpbGwgcmV0dXJuIGFuCisgIC8vIE9sZE9wdGlvblR5cGUgbWVzc2FnZS4KKyAgQVNTRVJUX1RSVUUoCisgICAgICBvcHRpb25zLkhhc0V4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6cmVxdWlyZWRfZW51bV9vcHQpKTsKKyAgY29uc3QgcHJvdG9idWZfdW5pdHRlc3Q6Ok9sZE9wdGlvblR5cGUmIG9sZF9lbnVtX29wdCA9CisgICAgICBvcHRpb25zLkdldEV4dGVuc2lvbihwcm90b2J1Zl91bml0dGVzdDo6cmVxdWlyZWRfZW51bV9vcHQpOworCisgIC8vIENvbmZpcm0gdGhhdCB0aGUgcmVxdWlyZWQgZW51bSBmaWVsZCBpcyBtaXNzaW5nLgorICBFWFBFQ1RfRkFMU0Uob2xkX2VudW1fb3B0LklzSW5pdGlhbGl6ZWQoKSk7CisgIEVYUEVDVF9GQUxTRShvbGRfZW51bV9vcHQuaGFzX3ZhbHVlKCkpOworCisgIHN0cmluZyBidWY7CisgIC8vIFZlcmlmeSB0aGF0IHRoZSByZXF1aXJlZCBlbnVtIGZpZWxkIGRvZXMgc2hvdyB1cCB3aGVuIHRoZSBvcHRpb24KKyAgLy8gaXMgcmUtcGFyc2VkIGFzIGEgTmV3T3B0aW9uVHlwZSBtZXNzYWdlOworICBwcm90b2J1Zl91bml0dGVzdDo6TmV3T3B0aW9uVHlwZSBuZXdfZW51bV9vcHQ7CisgIEVYUEVDVF9UUlVFKG9sZF9lbnVtX29wdC5BcHBlbmRQYXJ0aWFsVG9TdHJpbmcoJmJ1ZikpOworICBFWFBFQ1RfVFJVRShuZXdfZW51bV9vcHQuUGFyc2VGcm9tU3RyaW5nKGJ1ZikpOworICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6Ok5ld09wdGlvblR5cGU6Ok5FV19WQUxVRSwgbmV3X2VudW1fb3B0LnZhbHVlKCkpOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKLS8vIFRoZSB0ZXN0cyBiZWxvdyB0cmlnZ2VyIGV2ZXJ5IHVuaXF1ZSBjYWxsIHRvIEFkZEVycm9yKCkgaW4gZGVzY3JpcHRvci5jYywKLS8vIGluIHRoZSBvcmRlciBpbiB3aGljaCB0aGV5IGFwcGVhciBpbiB0aGF0IGZpbGUuICBJJ20gdXNpbmcgVGV4dEZvcm1hdCBoZXJlCi0vLyB0byBzcGVjaWZ5IHRoZSBpbnB1dCBkZXNjcmlwdG9ycyBiZWNhdXNlIGJ1aWxkaW5nIHRoZW0gdXNpbmcgY29kZSB3b3VsZAotLy8gYmUgdG9vIGJ1bGt5LgotCi1jbGFzcyBNb2NrRXJyb3JDb2xsZWN0b3IgOiBwdWJsaWMgRGVzY3JpcHRvclBvb2w6OkVycm9yQ29sbGVjdG9yIHsKLSBwdWJsaWM6Ci0gIE1vY2tFcnJvckNvbGxlY3RvcigpIHt9Ci0gIH5Nb2NrRXJyb3JDb2xsZWN0b3IoKSB7fQotCi0gIHN0cmluZyB0ZXh0XzsKLQotICAvLyBpbXBsZW1lbnRzIEVycm9yQ29sbGVjdG9yIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICB2b2lkIEFkZEVycm9yKGNvbnN0IHN0cmluZyYgZmlsZW5hbWUsCi0gICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBlbGVtZW50X25hbWUsIGNvbnN0IE1lc3NhZ2UqIGRlc2NyaXB0b3IsCi0gICAgICAgICAgICAgICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Ci0gICAgY29uc3QgY2hhciogbG9jYXRpb25fbmFtZSA9IE5VTEw7Ci0gICAgc3dpdGNoIChsb2NhdGlvbikgewotICAgICAgY2FzZSBOQU1FICAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk5BTUUiICAgICAgICAgOyBicmVhazsKLSAgICAgIGNhc2UgTlVNQkVSICAgICAgIDogbG9jYXRpb25fbmFtZSA9ICJOVU1CRVIiICAgICAgIDsgYnJlYWs7Ci0gICAgICBjYXNlIFRZUEUgICAgICAgICA6IGxvY2F0aW9uX25hbWUgPSAiVFlQRSIgICAgICAgICA7IGJyZWFrOwotICAgICAgY2FzZSBFWFRFTkRFRSAgICAgOiBsb2NhdGlvbl9uYW1lID0gIkVYVEVOREVFIiAgICAgOyBicmVhazsKLSAgICAgIGNhc2UgREVGQVVMVF9WQUxVRTogbG9jYXRpb25fbmFtZSA9ICJERUZBVUxUX1ZBTFVFIjsgYnJlYWs7Ci0gICAgICBjYXNlIE9QVElPTl9OQU1FICA6IGxvY2F0aW9uX25hbWUgPSAiT1BUSU9OX05BTUUiICA7IGJyZWFrOwotICAgICAgY2FzZSBPUFRJT05fVkFMVUUgOiBsb2NhdGlvbl9uYW1lID0gIk9QVElPTl9WQUxVRSIgOyBicmVhazsKLSAgICAgIGNhc2UgSU5QVVRfVFlQRSAgIDogbG9jYXRpb25fbmFtZSA9ICJJTlBVVF9UWVBFIiAgIDsgYnJlYWs7Ci0gICAgICBjYXNlIE9VVFBVVF9UWVBFICA6IGxvY2F0aW9uX25hbWUgPSAiT1VUUFVUX1RZUEUiICA7IGJyZWFrOwotICAgICAgY2FzZSBPVEhFUiAgICAgICAgOiBsb2NhdGlvbl9uYW1lID0gIk9USEVSIiAgICAgICAgOyBicmVhazsKLSAgICB9Ci0KLSAgICBzdHJpbmdzOjpTdWJzdGl0dXRlQW5kQXBwZW5kKAotICAgICAgJnRleHRfLCAiJDA6ICQxOiAkMjogJDNcbiIsCi0gICAgICBmaWxlbmFtZSwgZWxlbWVudF9uYW1lLCBsb2NhdGlvbl9uYW1lLCBtZXNzYWdlKTsKLSAgfQotfTsKLQogY2xhc3MgVmFsaWRhdGlvbkVycm9yVGVzdCA6IHB1YmxpYyB0ZXN0aW5nOjpUZXN0IHsKICBwcm90ZWN0ZWQ6CiAgIC8vIFBhcnNlIGZpbGVfdGV4dCBhcyBhIEZpbGVEZXNjcmlwdG9yUHJvdG8gaW4gdGV4dCBmb3JtYXQgYW5kIGFkZCBpdAogICAvLyB0byB0aGUgRGVzY3JpcHRvclBvb2wuICBFeHBlY3Qgbm8gZXJyb3JzLgotICB2b2lkIEJ1aWxkRmlsZShjb25zdCBzdHJpbmcmIGZpbGVfdGV4dCkgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogQnVpbGRGaWxlKGNvbnN0IHN0cmluZyYgZmlsZV90ZXh0KSB7CiAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwotICAgIEFTU0VSVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7Ci0gICAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworICAgIEVYUEVDVF9UUlVFKFRleHRGb3JtYXQ6OlBhcnNlRnJvbVN0cmluZyhmaWxlX3RleHQsICZmaWxlX3Byb3RvKSk7CisgICAgcmV0dXJuIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSk7CiAgIH0KIAogICAvLyBQYXJzZSBmaWxlX3RleHQgYXMgYSBGaWxlRGVzY3JpcHRvclByb3RvIGluIHRleHQgZm9ybWF0IGFuZCBhZGQgaXQKQEAgLTIzMTQsNiArMzI5MCwxOSBAQAogICAgIEVYUEVDVF9FUShleHBlY3RlZF9lcnJvcnMsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7CiAgIH0KIAorICAvLyBQYXJzZSBmaWxlX3RleHQgYXMgYSBGaWxlRGVzY3JpcHRvclByb3RvIGluIHRleHQgZm9ybWF0IGFuZCBhZGQgaXQKKyAgLy8gdG8gdGhlIERlc2NyaXB0b3JQb29sLiAgRXhwZWN0IGVycm9ycyB0byBiZSBwcm9kdWNlZCB3aGljaCBtYXRjaCB0aGUKKyAgLy8gZ2l2ZW4gd2FybmluZyB0ZXh0LgorICB2b2lkIEJ1aWxkRmlsZVdpdGhXYXJuaW5ncyhjb25zdCBzdHJpbmcmIGZpbGVfdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBleHBlY3RlZF93YXJuaW5ncykgeworICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoZmlsZV90ZXh0LCAmZmlsZV9wcm90bykpOworCisgICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKKyAgICBFWFBFQ1RfVFJVRShwb29sXy5CdWlsZEZpbGVDb2xsZWN0aW5nRXJyb3JzKGZpbGVfcHJvdG8sICZlcnJvcl9jb2xsZWN0b3IpKTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfd2FybmluZ3MsIGVycm9yX2NvbGxlY3Rvci53YXJuaW5nX3RleHRfKTsKKyAgfQorCiAgIC8vIEJ1aWxkcyBzb21lIGFscmVhZHktcGFyc2VkIGZpbGUgaW4gb3VyIHRlc3QgcG9vbC4KICAgdm9pZCBCdWlsZEZpbGVJblRlc3RQb29sKGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlKSB7CiAgICAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOwpAQCAtMjQ1MSw2ICszNDQwLDE1IEBACiAgICAgImJhci5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW1wb3J0IFwiZm9vLnByb3RvXCIgaGFzIG5vdCBiZWVuIGxvYWRlZC5cbiIpOwogfQogCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW52YWxpZFB1YmxpY0RlcGVuZGVuY3lJbmRleCkgeworICBCdWlsZEZpbGUoIm5hbWU6IFwiZm9vLnByb3RvXCIiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiZm9vLnByb3RvXCIgIgorICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMSIsCisgICAgImJhci5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW52YWxpZCBwdWJsaWMgZGVwZW5kZW5jeSBpbmRleC5cbiIpOworfQorCiBURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRm9yZWlnblVuaW1wb3J0ZWRQYWNrYWdlTm9DcmFzaCkgewogICAvLyBVc2VkIHRvIGNyYXNoOiAgSWYgd2UgZGVwZW5kIG9uIGEgbm9uLWV4aXN0ZW50IGZpbGUgYW5kIHRoZW4gcmVmZXIgdG8gYQogICAvLyBwYWNrYWdlIGRlZmluZWQgaW4gYSBmaWxlIHRoYXQgd2UgZGlkbid0IGltcG9ydCwgYW5kIHRoYXQgcGFja2FnZSBpcwpAQCAtMjUyNiw2ICszNTI0LDEwMiBAQAogICAgICAgImFscmVhZHktZGVmaW5lZCByYW5nZSAyMCB0byAyOS5cbiIpOwogfQogCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWRGaWVsZEVycm9yKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDE1IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9IgorICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOVU1CRVI6IEZpZWxkIFwiZm9vXCIgdXNlcyByZXNlcnZlZCBudW1iZXIgMTUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkRXh0ZW5zaW9uUmFuZ2VFcnJvcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgorICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDUgZW5kOiAxNSB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvbzogTlVNQkVSOiBFeHRlbnNpb24gcmFuZ2UgMTAgdG8gMTkiCisgICAgIiBvdmVybGFwcyB3aXRoIHJlc2VydmVkIHJhbmdlIDUgdG8gMTQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkRXh0ZW5zaW9uUmFuZ2VBZGphY2VudCkgeworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxMCBlbmQ6IDIwIH0iCisgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogNSBlbmQ6IDEwIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc2VydmVkUmFuZ2VPdmVybGFwKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDEwIGVuZDogMjAgfSIKKyAgICAiICByZXNlcnZlZF9yYW5nZSB7IHN0YXJ0OiA1IGVuZDogMTUgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb286IE5VTUJFUjogUmVzZXJ2ZWQgcmFuZ2UgNSB0byAxNCIKKyAgICAiIG92ZXJsYXBzIHdpdGggYWxyZWFkeS1kZWZpbmVkIHJhbmdlIDEwIHRvIDE5LlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXNlcnZlZE5hbWVFcnJvcikgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxNSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiYmFyXCIgbnVtYmVyOiAxNiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAiICBmaWVsZCB7IG5hbWU6IFwiYmF6XCIgbnVtYmVyOiAxNyBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAiICByZXNlcnZlZF9uYW1lOiBcImZvb1wiIgorICAgICIgIHJlc2VydmVkX25hbWU6IFwiYmFyXCIiCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogTkFNRTogRmllbGQgbmFtZSBcImZvb1wiIGlzIHJlc2VydmVkLlxuIgorICAgICJmb28ucHJvdG86IEZvby5iYXI6IE5BTUU6IEZpZWxkIG5hbWUgXCJiYXJcIiBpcyByZXNlcnZlZC5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWROYW1lUmVkdW5kYW50KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIHJlc2VydmVkX25hbWU6IFwiZm9vXCIiCisgICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJmb29cIiIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBmb286IE5BTUU6IEZpZWxkIG5hbWUgXCJmb29cIiBpcyByZXNlcnZlZCBtdWx0aXBsZSB0aW1lcy5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVzZXJ2ZWRGaWVsZHNEZWJ1Z1N0cmluZykgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSA9IEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgcmVzZXJ2ZWRfbmFtZTogXCJmb29cIiIKKyAgICAiICByZXNlcnZlZF9uYW1lOiBcImJhclwiIgorICAgICIgIHJlc2VydmVkX3JhbmdlIHsgc3RhcnQ6IDUgZW5kOiA2IH0iCisgICAgIiAgcmVzZXJ2ZWRfcmFuZ2UgeyBzdGFydDogMTAgZW5kOiAyMCB9IgorICAgICJ9Iik7CisKKyAgQVNTRVJUX0VRKAorICAgICJzeW50YXggPSBcInByb3RvMlwiO1xuXG4iCisgICAgIm1lc3NhZ2UgRm9vIHtcbiIKKyAgICAiICByZXNlcnZlZCA1LCAxMCB0byAxOTtcbiIKKyAgICAiICByZXNlcnZlZCBcImZvb1wiLCBcImJhclwiO1xuIgorICAgICJ9XG5cbiIsCisgICAgZmlsZS0+RGVidWdTdHJpbmcoKSk7Cit9CisKIFRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnZhbGlkRGVmYXVsdHMpIHsKICAgQnVpbGRGaWxlV2l0aEVycm9ycygKICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCkBAIC0yNTU4LDggKzM2NTIsOCBAQAogICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogXCIxXCIgfSIKICAgICAifSIsCiAKLSAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBERUZBVUxUX1ZBTFVFOiBDb3VsZG4ndCBwYXJzZSBkZWZhdWx0IHZhbHVlLlxuIgotICAgICJmb28ucHJvdG86IEZvby5iYXI6IERFRkFVTFRfVkFMVUU6IENvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUuXG4iCisgICAgImZvby5wcm90bzogRm9vLmZvbzogREVGQVVMVF9WQUxVRTogQ291bGRuJ3QgcGFyc2UgZGVmYXVsdCB2YWx1ZSBcImFiY1wiLlxuIgorICAgICJmb28ucHJvdG86IEZvby5iYXI6IERFRkFVTFRfVkFMVUU6IENvdWxkbid0IHBhcnNlIGRlZmF1bHQgdmFsdWUgXCJcIi5cbiIKICAgICAiZm9vLnByb3RvOiBGb28uYmF6OiBERUZBVUxUX1ZBTFVFOiBCb29sZWFuIGRlZmF1bHQgbXVzdCBiZSB0cnVlIG9yICIKICAgICAgICJmYWxzZS5cbiIKICAgICAiZm9vLnByb3RvOiBGb28ucXV4OiBERUZBVUxUX1ZBTFVFOiBNZXNzYWdlcyBjYW4ndCBoYXZlIGRlZmF1bHQgdmFsdWVzLlxuIgpAQCAtMjY0Miw2ICszNzM2LDk5IEBACiAgICAgICAibm9uLWV4dGVuc2lvbiBmaWVsZC5cbiIpOwogfQogCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGRPbmVvZkluZGV4VG9vTGFyZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAxIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZHVtbXlcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogT1RIRVI6IEZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4IDEgaXMgb3V0IG9mICIKKyAgICAgICJyYW5nZSBmb3IgdHlwZSBcIkZvb1wiLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZE9uZW9mSW5kZXhOZWdhdGl2ZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IC0xIH0iCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZHVtbXlcIiBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6IDAgfSIKKyAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogT1RIRVI6IEZpZWxkRGVzY3JpcHRvclByb3RvLm9uZW9mX2luZGV4IC0xIGlzIG91dCBvZiAiCisgICAgICAicmFuZ2UgZm9yIHR5cGUgXCJGb29cIi5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgT25lb2ZGaWVsZHNDb25zZWN1dGl2ZURlZmluaXRpb24pIHsKKyAgLy8gRmllbGRzIGJlbG9uZ2luZyB0byB0aGUgc2FtZSBvbmVvZiBtdXN0IGJlIGRlZmluZWQgY29uc2VjdXRpdmVseS4KKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb28xXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXJcIiBudW1iZXI6IDIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb28yXCIgbnVtYmVyOiAzIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0iCisgICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImZvb3NcIiB9IgorICAgICAgIn0iLAorCisgICAgICAiZm9vLnByb3RvOiBGb28uYmFyOiBPVEhFUjogRmllbGRzIGluIHRoZSBzYW1lIG9uZW9mIG11c3QgYmUgZGVmaW5lZCAiCisgICAgICAiY29uc2VjdXRpdmVseS4gXCJiYXJcIiBjYW5ub3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGNvbXBsZXRpb24gb2YgdGhlICIKKyAgICAgICJcImZvb3NcIiBvbmVvZiBkZWZpbml0aW9uLlxuIik7CisKKyAgLy8gUHJldmVudCBpbnRlcmxlYXZlZCBmaWVsZHMsIHdoaWNoIGJlbG9uZyB0byBkaWZmZXJlbnQgb25lb2ZzLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6IFwiZm9vMi5wcm90b1wiICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6IFwiRm9vMlwiIgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vMVwiIG51bWJlcjogMSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogMCB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiYmFyMVwiIG51bWJlcjogMiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogMSB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vMlwiIG51bWJlcjogMyBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogMCB9IgorICAgICAgIiAgZmllbGQgeyBuYW1lOlwiYmFyMlwiIG51bWJlcjogNCBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICAgIiAgICAgICAgICBvbmVvZl9pbmRleDogMSB9IgorICAgICAgIiAgb25lb2ZfZGVjbCB7IG5hbWU6XCJmb29zXCIgfSIKKyAgICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiYmFyc1wiIH0iCisgICAgICAifSIsCisgICAgICAiZm9vMi5wcm90bzogRm9vMi5iYXIxOiBPVEhFUjogRmllbGRzIGluIHRoZSBzYW1lIG9uZW9mIG11c3QgYmUgZGVmaW5lZCAiCisgICAgICAiY29uc2VjdXRpdmVseS4gXCJiYXIxXCIgY2Fubm90IGJlIGRlZmluZWQgYmVmb3JlIHRoZSBjb21wbGV0aW9uIG9mIHRoZSAiCisgICAgICAiXCJmb29zXCIgb25lb2YgZGVmaW5pdGlvbi5cbiIKKyAgICAgICJmb28yLnByb3RvOiBGb28yLmZvbzI6IE9USEVSOiBGaWVsZHMgaW4gdGhlIHNhbWUgb25lb2YgbXVzdCBiZSBkZWZpbmVkICIKKyAgICAgICJjb25zZWN1dGl2ZWx5LiBcImZvbzJcIiBjYW5ub3QgYmUgZGVmaW5lZCBiZWZvcmUgdGhlIGNvbXBsZXRpb24gb2YgdGhlICIKKyAgICAgICJcImJhcnNcIiBvbmVvZiBkZWZpbml0aW9uLlxuIik7CisKKyAgLy8gQW5vdGhlciBjYXNlIGZvciBub3JtYWwgZmllbGRzIGFuZCBkaWZmZXJlbnQgb25lb2YgZmllbGRzIGludGVybGVhdmUuCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogXCJmb28zLnByb3RvXCIgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogXCJGb28zXCIiCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb28xXCIgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXIxXCIgbnVtYmVyOiAyIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAxIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJiYXpcIiBudW1iZXI6IDMgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAiICBmaWVsZCB7IG5hbWU6XCJmb28yXCIgbnVtYmVyOiA0IGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgIG9uZW9mX2luZGV4OiAwIH0iCisgICAgICAiICBvbmVvZl9kZWNsIHsgbmFtZTpcImZvb3NcIiB9IgorICAgICAgIiAgb25lb2ZfZGVjbCB7IG5hbWU6XCJiYXJzXCIgfSIKKyAgICAgICJ9IiwKKyAgICAgICJmb28zLnByb3RvOiBGb28zLmJhejogT1RIRVI6IEZpZWxkcyBpbiB0aGUgc2FtZSBvbmVvZiBtdXN0IGJlIGRlZmluZWQgIgorICAgICAgImNvbnNlY3V0aXZlbHkuIFwiYmF6XCIgY2Fubm90IGJlIGRlZmluZWQgYmVmb3JlIHRoZSBjb21wbGV0aW9uIG9mIHRoZSAiCisgICAgICAiXCJmb29zXCIgb25lb2YgZGVmaW5pdGlvbi5cbiIpOworfQorCiBURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRmllbGROdW1iZXJDb25mbGljdCkgewogICBCdWlsZEZpbGVXaXRoRXJyb3JzKAogICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKQEAgLTI4MDIsNiArMzk4OSwyOCBAQAogICAgICAgIm51bWJlci5cbiIpOwogfQogCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUmVxdWlyZWRFeHRlbnNpb24pIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgZXh0ZW5zaW9uX3JhbmdlIHsgc3RhcnQ6IDEwMDAgZW5kOiAxMDAwMCB9IgorICAgICJ9IgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGV4dGVuc2lvbiB7IgorICAgICIgICAgbmFtZTpcImZvb1wiIgorICAgICIgICAgbnVtYmVyOjEwMDAiCisgICAgIiAgICBsYWJlbDpMQUJFTF9SRVFVSVJFRCIKKyAgICAiICAgIHR5cGU6VFlQRV9JTlQzMiIKKyAgICAiICAgIGV4dGVuZGVlOiBcIkJhclwiIgorICAgICIgIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogTWVzc2FnZSBleHRlbnNpb25zIGNhbm5vdCBoYXZlIHJlcXVpcmVkICIKKyAgICAiZmllbGRzLlxuIik7Cit9CisKIFRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWRGaWVsZFR5cGUpIHsKICAgQnVpbGRGaWxlV2l0aEVycm9ycygKICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCkBAIC0yODEzLDYgKzQwMjIsMzYgQEAKICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBUWVBFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIik7CiB9CiAKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmRlZmluZWRGaWVsZFR5cGVXaXRoRGVmYXVsdCkgeworICAvLyBTZWUgYi8xMjUzMzU4Mi4gUHJldmlvdXNseSB0aGlzIGZhaWxlZCBiZWNhdXNlIHRoZSBkZWZhdWx0IHZhbHVlIHdhcyBub3QKKyAgLy8gYWNjZXB0ZWQgYnkgdGhlIHBhcnNlciwgd2hpY2ggYXNzdW1lZCBhbiBlbnVtIHR5cGUsIGxlYWRpbmcgdG8gYW4gdW5jbGVhcgorICAvLyBlcnJvciBtZXNzYWdlLiBXZSB3YW50IHRoaXMgaW5wdXQgdG8geWllbGQgYSB2YWxpZGF0aW9uIGVycm9yIGluc3RlYWQsCisgIC8vIHNpbmNlIHRoZSB1bmtub3duIHR5cGUgaXMgdGhlIHByaW1hcnkgcHJvYmxlbS4KKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiZm9vXCIgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZV9uYW1lOlwiaW50XCIgIgorICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTpcIjFcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiaW50XCIgaXMgbm90IGRlZmluZWQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFVuZGVmaW5lZE5lc3RlZEZpZWxkVHlwZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBuZXN0ZWRfdHlwZSB7IG5hbWU6XCJCYXpcIiB9IgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIgorICAgICIgICAgICAgICAgbGFiZWw6TEFCRUxfT1BUSU9OQUwiCisgICAgIiAgICAgICAgICB0eXBlX25hbWU6XCJGb28uQmF6LkJhclwiIH0iCisgICAgIn0iLAorCisgICAgImZvby5wcm90bzogRm9vLmZvbzogVFlQRTogXCJGb28uQmF6LkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIik7Cit9CisKIFRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBGaWVsZFR5cGVEZWZpbmVkSW5VbmRlY2xhcmVkRGVwZW5kZW5jeSkgewogICBCdWlsZEZpbGUoCiAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgpAQCAtMjgyOSw4ICs0MDY4LDE2NyBAQAogICAgICAgIm5lY2Vzc2FyeSBpbXBvcnQuXG4iKTsKIH0KIAorVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZURlZmluZWRJbkluZGlyZWN0RGVwZW5kZW5jeSkgeworICAvLyBUZXN0IGZvciBoaWRkZW4gZGVwZW5kZW5jaWVzLgorICAvLworICAvLyAvLyBiYXIucHJvdG8KKyAgLy8gbWVzc2FnZSBCYXJ7fQorICAvLworICAvLyAvLyBmb3J3YXJkLnByb3RvCisgIC8vIGltcG9ydCAiYmFyLnByb3RvIgorICAvLworICAvLyAvLyBmb28ucHJvdG8KKyAgLy8gaW1wb3J0ICJmb3J3YXJkLnByb3RvIgorICAvLyBtZXNzYWdlIEZvbyB7CisgIC8vICAgb3B0aW9uYWwgQmFyIGZvbyA9IDE7ICAvLyBFcnJvciwgbmVlZHMgdG8gaW1wb3J0IGJhci5wcm90byBleHBsaWNpdGx5LgorICAvLyB9CisgIC8vCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb3J3YXJkLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iLAorICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcImJhci5wcm90b1wiLCAiCisgICAgICAid2hpY2ggaXMgbm90IGltcG9ydGVkIGJ5IFwiZm9vLnByb3RvXCIuICBUbyB1c2UgaXQgaGVyZSwgcGxlYXNlIGFkZCB0aGUgIgorICAgICAgIm5lY2Vzc2FyeSBpbXBvcnQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZURlZmluZWRJblB1YmxpY0RlcGVuZGVuY3kpIHsKKyAgLy8gVGVzdCBmb3IgcHVibGljIGRlcGVuZGVuY2llcy4KKyAgLy8KKyAgLy8gLy8gYmFyLnByb3RvCisgIC8vIG1lc3NhZ2UgQmFye30KKyAgLy8KKyAgLy8gLy8gZm9yd2FyZC5wcm90bworICAvLyBpbXBvcnQgcHVibGljICJiYXIucHJvdG8iCisgIC8vCisgIC8vIC8vIGZvby5wcm90bworICAvLyBpbXBvcnQgImZvcndhcmQucHJvdG8iCisgIC8vIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICBvcHRpb25hbCBCYXIgZm9vID0gMTsgIC8vIENvcnJlY3QuICJiYXIucHJvdG8iIGlzIHB1YmxpYyBpbXBvcnRlZCBpbnRvCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3J3YXJkLnByb3RvLCBzbyB3aGVuICJmb28ucHJvdG8iIGltcG9ydHMKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgIC8vICJmb3J3YXJkLnByb3RvIiwgaXQgaW1wb3J0cyAiYmFyLnByb3RvIiB0b28uCisgIC8vIH0KKyAgLy8KKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7CisKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvcndhcmQucHJvdG9cIiIKKyAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiAiCisgICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7CisKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEZpZWxkVHlwZURlZmluZWRJblRyYW5zaXRpdmVQdWJsaWNEZXBlbmRlbmN5KSB7CisgIC8vIFRlc3QgZm9yIHB1YmxpYyBkZXBlbmRlbmNpZXMuCisgIC8vCisgIC8vIC8vIGJhci5wcm90bworICAvLyBtZXNzYWdlIEJhcnt9CisgIC8vCisgIC8vIC8vIGZvcndhcmQucHJvdG8KKyAgLy8gaW1wb3J0IHB1YmxpYyAiYmFyLnByb3RvIgorICAvLworICAvLyAvLyBmb3J3YXJkMi5wcm90bworICAvLyBpbXBvcnQgcHVibGljICJmb3J3YXJkLnByb3RvIgorICAvLworICAvLyAvLyBmb28ucHJvdG8KKyAgLy8gaW1wb3J0ICJmb3J3YXJkMi5wcm90byIKKyAgLy8gbWVzc2FnZSBGb28geworICAvLyAgIG9wdGlvbmFsIEJhciBmb28gPSAxOyAgLy8gQ29ycmVjdCwgcHVibGljIGltcG9ydHMgYXJlIHRyYW5zaXRpdmUuCisgIC8vIH0KKyAgLy8KKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXJcIiB9Iik7CisKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvcndhcmQucHJvdG9cIiIKKyAgICAiZGVwZW5kZW5jeTogXCJiYXIucHJvdG9cIiAiCisgICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7CisKKyAgQnVpbGRGaWxlKAorICAgICJuYW1lOiBcImZvcndhcmQyLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiZm9yd2FyZC5wcm90b1wiICIKKyAgICAicHVibGljX2RlcGVuZGVuY3k6IDAiKTsKKworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImZvcndhcmQyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsCisgICAgICAgRmllbGRUeXBlRGVmaW5lZEluUHJpdmF0ZURlcGVuZGVuY3lPZlB1YmxpY0RlcGVuZGVuY3kpIHsKKyAgLy8gVGVzdCBmb3IgcHVibGljIGRlcGVuZGVuY2llcy4KKyAgLy8KKyAgLy8gLy8gYmFyLnByb3RvCisgIC8vIG1lc3NhZ2UgQmFye30KKyAgLy8KKyAgLy8gLy8gZm9yd2FyZC5wcm90bworICAvLyBpbXBvcnQgImJhci5wcm90byIKKyAgLy8KKyAgLy8gLy8gZm9yd2FyZDIucHJvdG8KKyAgLy8gaW1wb3J0IHB1YmxpYyAiZm9yd2FyZC5wcm90byIKKyAgLy8KKyAgLy8gLy8gZm9vLnByb3RvCisgIC8vIGltcG9ydCAiZm9yd2FyZDIucHJvdG8iCisgIC8vIG1lc3NhZ2UgRm9vIHsKKyAgLy8gICBvcHRpb25hbCBCYXIgZm9vID0gMTsgIC8vIEVycm9yLCB0aGUgImJhci5wcm90byIgaXMgbm90IHB1YmxpYyBpbXBvcnRlZAorICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW50byAiZm9yd2FyZC5wcm90byIsIHNvIHdpbGwgbm90IGJlIGltcG9ydGVkCisgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpbnRvIGVpdGhlciAiZm9yd2FyZDIucHJvdG8iIG9yICJmb28ucHJvdG8iLgorICAvLyB9CisgIC8vCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb3J3YXJkLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiKTsKKworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiZm9yd2FyZDIucHJvdG9cIiIKKyAgICAiZGVwZW5kZW5jeTogXCJmb3J3YXJkLnByb3RvXCIgIgorICAgICJwdWJsaWNfZGVwZW5kZW5jeTogMCIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJkZXBlbmRlbmN5OiBcImZvcndhcmQyLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIH0iCisgICAgIn0iLAorICAgICJmb28ucHJvdG86IEZvby5mb286IFRZUEU6IFwiQmFyXCIgc2VlbXMgdG8gYmUgZGVmaW5lZCBpbiBcImJhci5wcm90b1wiLCAiCisgICAgICAid2hpY2ggaXMgbm90IGltcG9ydGVkIGJ5IFwiZm9vLnByb3RvXCIuICBUbyB1c2UgaXQgaGVyZSwgcGxlYXNlIGFkZCB0aGUgIgorICAgICAgIm5lY2Vzc2FyeSBpbXBvcnQuXG4iKTsKK30KKworCiBURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgU2VhcmNoTW9zdExvY2FsRmlyc3QpIHsKLSAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgcHJvZHVjZSBhbiBlcnJvciB0aGF0IEJhci5CYXogaXMgbm90IGRlZmluZWQ6CisgIC8vIFRoZSBmb2xsb3dpbmcgc2hvdWxkIHByb2R1Y2UgYW4gZXJyb3IgdGhhdCBCYXIuQmF6IGlzIHJlc29sdmVkIGJ1dAorICAvLyBub3QgZGVmaW5lZDoKICAgLy8gICBtZXNzYWdlIEJhciB7IG1lc3NhZ2UgQmF6IHt9IH0KICAgLy8gICBtZXNzYWdlIEZvbyB7CiAgIC8vICAgICBtZXNzYWdlIEJhciB7CkBAIC0yODU2LDcgKzQyNTQsMTAgQEAKICAgICAiICAgICAgICAgIHR5cGVfbmFtZTpcIkJhci5CYXpcIiB9IgogICAgICJ9IiwKIAotICAgICJmb28ucHJvdG86IEZvby5iYXo6IFRZUEU6IFwiQmFyLkJhelwiIGlzIG5vdCBkZWZpbmVkLlxuIik7CisgICAgImZvby5wcm90bzogRm9vLmJhejogVFlQRTogXCJCYXIuQmF6XCIgaXMgcmVzb2x2ZWQgdG8gXCJGb28uQmFyLkJhelwiLCIKKyAgICAiIHdoaWNoIGlzIG5vdCBkZWZpbmVkLiBUaGUgaW5uZXJtb3N0IHNjb3BlIGlzIHNlYXJjaGVkIGZpcnN0IGluIG5hbWUgIgorICAgICJyZXNvbHV0aW9uLiBDb25zaWRlciB1c2luZyBhIGxlYWRpbmcgJy4nKGkuZS4sIFwiLkJhci5CYXpcIikgdG8gc3RhcnQgIgorICAgICJmcm9tIHRoZSBvdXRlcm1vc3Qgc2NvcGUuXG4iKTsKIH0KIAogVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFNlYXJjaE1vc3RMb2NhbEZpcnN0MikgewpAQCAtMjk5OCw2ICs0Mzk5LDIwIEBACiAgICAgICAiXCJOT19TVUNIX1ZBTFVFXCIuXG4iKTsKIH0KIAorVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEVudW1EZWZhdWx0VmFsdWVJc0ludGVnZXIpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImVudW1fdHlwZSB7IG5hbWU6IFwiQmFyXCIgdmFsdWUgeyBuYW1lOlwiRFVNTVlcIiBudW1iZXI6MCB9IH0gIgorICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkZvb1wiIgorICAgICIgIGZpZWxkIHsgbmFtZTpcImZvb1wiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhclwiIgorICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTpcIjBcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5mb286IERFRkFVTFRfVkFMVUU6IERlZmF1bHQgdmFsdWUgZm9yIGFuIGVudW0gZmllbGQgbXVzdCAiCisgICAgImJlIGFuIGlkZW50aWZpZXIuXG4iKTsKK30KKwogVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFByaW1pdGl2ZVdpdGhUeXBlTmFtZSkgewogICBCdWlsZEZpbGVXaXRoRXJyb3JzKAogICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKQEAgLTMwMjIsNiArNDQzNywzMSBAQAogICAgICAgInR5cGVfbmFtZS5cbiIpOwogfQogCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgT25lb2ZXaXRoTm9GaWVsZHMpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICIgIG5hbWU6IFwiRm9vXCIiCisgICAgIiAgb25lb2ZfZGVjbCB7IG5hbWU6XCJiYXJcIiB9IgorICAgICJ9IiwKKworICAgICJmb28ucHJvdG86IEZvby5iYXI6IE5BTUU6IE9uZW9mIG11c3QgaGF2ZSBhdCBsZWFzdCBvbmUgZmllbGQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE9uZW9mTGFiZWxNaXNtYXRjaCkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb29cIiIKKyAgICAiICBmaWVsZCB7IG5hbWU6XCJmb29cIiBudW1iZXI6MSBsYWJlbDpMQUJFTF9SRVBFQVRFRCB0eXBlOlRZUEVfSU5UMzIgIgorICAgICIgICAgICAgICAgb25lb2ZfaW5kZXg6MCB9IgorICAgICIgIG9uZW9mX2RlY2wgeyBuYW1lOlwiYmFyXCIgfSIKKyAgICAifSIsCisKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBOQU1FOiBGaWVsZHMgb2Ygb25lb2ZzIG11c3QgdGhlbXNlbHZlcyBoYXZlIGxhYmVsICIKKyAgICAgICJMQUJFTF9PUFRJT05BTC5cbiIpOworfQorCiBURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgSW5wdXRUeXBlTm90RGVmaW5lZCkgewogICBCdWlsZEZpbGVXaXRoRXJyb3JzKAogICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKQEAgLTMwMzEsNyArNDQ3MSw4IEBACiAgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJCYXJcIiBvdXRwdXRfdHlwZTogXCJGb29cIiB9IgogICAgICJ9IiwKIAotICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IElOUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iKTsKKyAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBJTlBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICAgICk7CiB9CiAKIFRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbnB1dFR5cGVOb3RBTWVzc2FnZSkgewpAQCAtMzA0NCw3ICs0NDg1LDggQEAKICAgICAiICBtZXRob2QgeyBuYW1lOiBcIkFcIiBpbnB1dF90eXBlOiBcIkJhclwiIG91dHB1dF90eXBlOiBcIkZvb1wiIH0iCiAgICAgIn0iLAogCi0gICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQTogSU5QVVRfVFlQRTogXCJCYXJcIiBpcyBub3QgYSBtZXNzYWdlIHR5cGUuXG4iKTsKKyAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5BOiBJTlBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS5cbiIKKyAgICApOwogfQogCiBURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgT3V0cHV0VHlwZU5vdERlZmluZWQpIHsKQEAgLTMwNTYsNyArNDQ5OCw4IEBACiAgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJGb29cIiBvdXRwdXRfdHlwZTogXCJCYXJcIiB9IgogICAgICJ9IiwKIAotICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IE9VVFBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBkZWZpbmVkLlxuIik7CisgICAgImZvby5wcm90bzogVGVzdFNlcnZpY2UuQTogT1VUUFVUX1RZUEU6IFwiQmFyXCIgaXMgbm90IGRlZmluZWQuXG4iCisgICAgKTsKIH0KIAogVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE91dHB1dFR5cGVOb3RBTWVzc2FnZSkgewpAQCAtMzA2OSw5ICs0NTEyLDExIEBACiAgICAgIiAgbWV0aG9kIHsgbmFtZTogXCJBXCIgaW5wdXRfdHlwZTogXCJGb29cIiBvdXRwdXRfdHlwZTogXCJCYXJcIiB9IgogICAgICJ9IiwKIAotICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IE9VVFBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS5cbiIpOworICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkE6IE9VVFBVVF9UWVBFOiBcIkJhclwiIGlzIG5vdCBhIG1lc3NhZ2UgdHlwZS5cbiIKKyAgICApOwogfQogCisKIFRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBJbGxlZ2FsUGFja2VkRmllbGQpIHsKICAgQnVpbGRGaWxlV2l0aEVycm9ycygKICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCkBAIC0zMTc4LDIwICs0NjIzLDg1IEBACiAgICAgInJlc2VydmVkIG5hbWUgXCJ1bmludGVycHJldGVkX29wdGlvblwiLlxuIik7CiB9CiAKLVRFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBSZXBlYXRlZE9wdGlvbikgeworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlcGVhdGVkTWVzc2FnZU9wdGlvbikgewogICBCdWlsZERlc2NyaXB0b3JNZXNzYWdlc0luVGVzdFBvb2woKTsKIAogICBCdWlsZEZpbGVXaXRoRXJyb3JzKAogICAgICJuYW1lOiBcImZvby5wcm90b1wiICIKICAgICAiZGVwZW5kZW5jeTogXCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90b1wiICIKLSAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJmb29cIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX1JFUEVBVEVEICIKLSAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9GTE9BVCBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IgotICAgICJvcHRpb25zIHsgdW5pbnRlcnByZXRlZF9vcHRpb24geyBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAibWVzc2FnZV90eXBlOiB7IG5hbWU6IFwiQmFyXCIgZmllbGQ6IHsgIgorICAgICIgIG5hbWU6IFwiZm9vXCIgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyIH0gIgorICAgICJ9ICIKKyAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJiYXJcIiBudW1iZXI6IDc2NzI3NTcgbGFiZWw6IExBQkVMX1JFUEVBVEVEICIKKyAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9NRVNTQUdFIHR5cGVfbmFtZTogXCJCYXJcIiAiCisgICAgIiAgICAgICAgICAgIGV4dGVuZGVlOiBcImdvb2dsZS5wcm90b2J1Zi5GaWxlT3B0aW9uc1wiIH0iCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiYmFyXCIgIgogICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiB0cnVlIH0gIgotICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3VibGVfdmFsdWU6IDEuMiB9IH0iLAorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuYW1lIHsgbmFtZV9wYXJ0OiBcImZvb1wiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogZmFsc2UgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvc2l0aXZlX2ludF92YWx1ZTogMSB9IH0iLAogCi0gICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fTkFNRTogT3B0aW9uIGZpZWxkIFwiKGZvbylcIiBpcyByZXBlYXRlZC4gIgotICAgICJSZXBlYXRlZCBvcHRpb25zIGFyZSBub3Qgc3VwcG9ydGVkLlxuIik7CisgICAgImZvby5wcm90bzogZm9vLnByb3RvOiBPUFRJT05fTkFNRTogT3B0aW9uIGZpZWxkIFwiKGJhcilcIiBpcyBhICIKKyAgICAicmVwZWF0ZWQgbWVzc2FnZS4gUmVwZWF0ZWQgbWVzc2FnZSBvcHRpb25zIG11c3QgYmUgaW5pdGlhbGl6ZWQgIgorICAgICJ1c2luZyBhbiBhZ2dyZWdhdGUgdmFsdWUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFJlc29sdmVVbmRlZmluZWRPcHRpb24pIHsKKyAgLy8gVGhlIGZvbGxvd2luZyBzaG91bGQgcHJvZHVjZSBhbiBlcm9yIHRoYXQgYmF6LmJhciBpcyByZXNvbHZlZCBidXQgbm90CisgIC8vIGRlZmluZWQuCisgIC8vIGZvby5wcm90bzoKKyAgLy8gICBwYWNrYWdlIGJhegorICAvLyAgIGltcG9ydCBnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90bworICAvLyAgIG1lc3NhZ2UgQmFyIHsgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsgfQorICAvLyAgIGV4dGVuZCBGaWxlT3B0aW9ucyB7IG9wdGlvbmFsIEJhciBiYXIgPSA3NjcyNzU3OyB9CisgIC8vCisgIC8vIHF1eC5wcm90bzoKKyAgLy8gICBwYWNrYWdlIHF1eC5iYXoKKyAgLy8gICBvcHRpb24gKGJhei5iYXIpLmZvbyA9IDE7CisgIC8vCisgIC8vIEFsdGhvdWdoICJiYXouYmFyIiBpcyBhbHJlYWR5IGRlZmluZWQsIHRoZSBsb29rdXAgY29kZSB3aWxsIHRyeQorICAvLyAicXV4LmJhei5iYXIiLCBzaW5jZSBpdCdzIHRoZSBtYXRjaCBmcm9tIHRoZSBpbm5lcm1vc3Qgc2NvcGUsIHdoaWNoIHdpbGwKKyAgLy8gY2F1c2UgYSBzeW1ib2wgbm90IGRlZmluZWQgZXJyb3IuCisgIEJ1aWxkRGVzY3JpcHRvck1lc3NhZ2VzSW5UZXN0UG9vbCgpOworCisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgInBhY2thZ2U6IFwiYmF6XCIgIgorICAgICJkZXBlbmRlbmN5OiBcImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvXCIgIgorICAgICJtZXNzYWdlX3R5cGU6IHsgbmFtZTogXCJCYXJcIiBmaWVsZDogeyAiCisgICAgIiAgbmFtZTogXCJmb29cIiBudW1iZXI6IDEgbGFiZWw6IExBQkVMX09QVElPTkFMIHR5cGU6IFRZUEVfSU5UMzIgfSAiCisgICAgIn0gIgorICAgICJleHRlbnNpb24geyBuYW1lOiBcImJhclwiIG51bWJlcjogNzY3Mjc1NyBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICIgICAgICAgICAgICB0eXBlOiBUWVBFX01FU1NBR0UgdHlwZV9uYW1lOiBcIkJhclwiICIKKyAgICAiICAgICAgICAgICAgZXh0ZW5kZWU6IFwiZ29vZ2xlLnByb3RvYnVmLkZpbGVPcHRpb25zXCIgfSIpOworCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwicXV4LnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcInF1eC5iYXpcIiAiCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiYmF6LmJhclwiICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzX2V4dGVuc2lvbjogdHJ1ZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmFtZSB7IG5hbWVfcGFydDogXCJmb29cIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IGZhbHNlIH0gIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwb3NpdGl2ZV9pbnRfdmFsdWU6IDEgfSB9IiwKKworICAgICJxdXgucHJvdG86IHF1eC5wcm90bzogT1BUSU9OX05BTUU6IE9wdGlvbiBcIihiYXouYmFyKVwiIGlzIHJlc29sdmVkIHRvICIKKyAgICAiXCIocXV4LmJhei5iYXIpXCIsIgorICAgICIgd2hpY2ggaXMgbm90IGRlZmluZWQuIFRoZSBpbm5lcm1vc3Qgc2NvcGUgaXMgc2VhcmNoZWQgZmlyc3QgaW4gbmFtZSAiCisgICAgInJlc29sdXRpb24uIENvbnNpZGVyIHVzaW5nIGEgbGVhZGluZyAnLicoaS5lLiwgXCIoLmJhei5iYXIpXCIpIHRvIHN0YXJ0ICIKKyAgICAiZnJvbSB0aGUgb3V0ZXJtb3N0IHNjb3BlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbmtub3duT3B0aW9uKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwicXV4LnByb3RvXCIgIgorICAgICJwYWNrYWdlOiBcInF1eC5iYXpcIiAiCisgICAgIm9wdGlvbnMgeyB1bmludGVycHJldGVkX29wdGlvbiB7IG5hbWUgeyBuYW1lX3BhcnQ6IFwiYmFhei5iYXJcIiAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19leHRlbnNpb246IHRydWUgfSAiCisgICAgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgeyBuYW1lX3BhcnQ6IFwiZm9vXCIgIgorICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZXh0ZW5zaW9uOiBmYWxzZSB9ICIKKyAgICAiICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9zaXRpdmVfaW50X3ZhbHVlOiAxIH0gfSIsCisKKyAgICAicXV4LnByb3RvOiBxdXgucHJvdG86IE9QVElPTl9OQU1FOiBPcHRpb24gXCIoYmFhei5iYXIpXCIgdW5rbm93bi5cbiIpOwogfQogCiBURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgQ3VzdG9tT3B0aW9uQ29uZmxpY3RpbmdGaWVsZE51bWJlcikgewpAQCAtMzQ2NCw2ICs0OTc0LDI1IEBACiAgICAgInN0cmluZyBvcHRpb24gXCJmb29cIi5cbiIpOwogfQogCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgRHVwbGljYXRlRXh0ZW5zaW9uRmllbGROdW1iZXIpIHsKKyAgQnVpbGREZXNjcmlwdG9yTWVzc2FnZXNJblRlc3RQb29sKCk7CisKKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJvcHRpb24xXCIgbnVtYmVyOiAxMDAwIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9Iik7CisKKyAgQnVpbGRGaWxlV2l0aFdhcm5pbmdzKAorICAgICAgIm5hbWU6IFwiYmFyLnByb3RvXCIgIgorICAgICAgImRlcGVuZGVuY3k6IFwiZ29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucHJvdG9cIiAiCisgICAgICAiZXh0ZW5zaW9uIHsgbmFtZTogXCJvcHRpb24yXCIgbnVtYmVyOiAxMDAwIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgICAgICAgICAgdHlwZTogVFlQRV9JTlQzMiBleHRlbmRlZTogXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiB9IiwKKyAgICAgICJiYXIucHJvdG86IG9wdGlvbjI6IE5VTUJFUjogRXh0ZW5zaW9uIG51bWJlciAxMDAwIGhhcyBhbHJlYWR5IGJlZW4gdXNlZCAiCisgICAgICAiaW4gXCJnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnNcIiBieSBleHRlbnNpb24gXCJvcHRpb24xXCIgZGVmaW5lZCBpbiAiCisgICAgICAiZm9vLnByb3RvLlxuIik7Cit9CisKIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdGVzdHMgdGhhdCBjaGVjayBmb3IgYWdncmVnYXRlIHZhbHVlIHBhcnNpbmcKIC8vIGVycm9ycy4gIFRoZSAidmFsdWUiIGFyZ3VtZW50IGlzIGVtYmVkZGVkIGluc2lkZSB0aGUKIC8vICJ1bmludGVycHJldGVkX29wdGlvbiIgcG9ydGlvbiBvZiB0aGUgcmVzdWx0LgpAQCAtMzU5Miw3ICs1MTIxLDggQEAKICAgICAiICB9IgogICAgICJ9IiwKIAotICAgICJmb28ucHJvdG86IFRlc3RTZXJ2aWNlLkJhejogSU5QVVRfVFlQRTogXCJOb1N1Y2hUeXBlXCIgaXMgbm90IGRlZmluZWQuXG4iKTsKKyAgICAiZm9vLnByb3RvOiBUZXN0U2VydmljZS5CYXo6IElOUFVUX1RZUEU6IFwiTm9TdWNoVHlwZVwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICAgICk7CiAKICAgLy8gTWFrZSBzdXJlIHRoYXQgaWYgd2UgYnVpbGQgdGhlIHNhbWUgZmlsZSBhZ2FpbiB3aXRoIHRoZSBlcnJvciBmaXhlZCwKICAgLy8gaXQgd29ya3MuICBJZiB0aGUgYWJvdmUgcm9sbGJhY2sgd2FzIGluY29tcGxldGUsIHRoZW4gc29tZSBzeW1ib2xzIHdpbGwKQEAgLTM2NDEsNiArNTE3MSw2ODQgQEAKICAgRVhQRUNUX0VRKCIgIEZvbzogXCJGb29cIiBpcyBhbHJlYWR5IGRlZmluZWQuIiwgZXJyb3JzWzFdKTsKIH0KIAorVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIERpc2FsbG93RW51bUFsaWFzKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICIgIHZhbHVlIHsgbmFtZTpcIkVOVU1fQVwiIG51bWJlcjowIH0iCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9CXCIgbnVtYmVyOjAgfSIKKyAgICAifSIsCisgICAgImZvby5wcm90bzogQmFyOiBOVU1CRVI6ICIKKyAgICAiXCJFTlVNX0JcIiB1c2VzIHRoZSBzYW1lIGVudW0gdmFsdWUgYXMgXCJFTlVNX0FcIi4gIgorICAgICJJZiB0aGlzIGlzIGludGVuZGVkLCBzZXQgJ29wdGlvbiBhbGxvd19hbGlhcyA9IHRydWU7JyB0byB0aGUgZW51bSAiCisgICAgImRlZmluaXRpb24uXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIEFsbG93RW51bUFsaWFzKSB7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCisgICAgImVudW1fdHlwZSB7IgorICAgICIgIG5hbWU6IFwiQmFyXCIiCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9BXCIgbnVtYmVyOjAgfSIKKyAgICAiICB2YWx1ZSB7IG5hbWU6XCJFTlVNX0JcIiBudW1iZXI6MCB9IgorICAgICIgIG9wdGlvbnMgeyBhbGxvd19hbGlhczogdHJ1ZSB9IgorICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBVbnVzZWRJbXBvcnRXYXJuaW5nKSB7CisgIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiYmFyLnByb3RvIik7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXIucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmFyXCIgfSIpOworCisgIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiYmFzZS5wcm90byIpOworICBCdWlsZEZpbGUoCisgICAgIm5hbWU6IFwiYmFzZS5wcm90b1wiICIKKyAgICAibWVzc2FnZV90eXBlIHsgbmFtZTogXCJCYXNlXCIgfSIpOworCisgIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgiYmF6LnByb3RvIik7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJiYXoucHJvdG9cIiAiCisgICAgIm1lc3NhZ2VfdHlwZSB7IG5hbWU6IFwiQmF6XCIgfSIpOworCisgIHBvb2xfLkFkZFVudXNlZEltcG9ydFRyYWNrRmlsZSgicHVibGljLnByb3RvIik7CisgIEJ1aWxkRmlsZSgKKyAgICAibmFtZTogXCJwdWJsaWMucHJvdG9cIiAiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCisgICAgInB1YmxpY19kZXBlbmRlbmN5OiAwIik7CisKKyAgLy8gLy8gZm9yd2FyZC5wcm90bworICAvLyBpbXBvcnQgImJhc2UucHJvdG8iICAgICAgIC8vIE5vIHdhcm5pbmc6IEJhc2UgbWVzc2FnZSBpcyB1c2VkLgorICAvLyBpbXBvcnQgImJhci5wcm90byIgICAgICAgIC8vIFdpbGwgbG9nIGEgd2FybmluZy4KKyAgLy8gaW1wb3J0IHB1YmxpYyAiYmF6LnByb3RvIiAvLyBObyB3YXJuaW5nOiBEbyBub3QgdHJhY2sgaW1wb3J0IHB1YmxpYy4KKyAgLy8gaW1wb3J0ICJwdWJsaWMucHJvdG8iICAgICAvLyBObyB3YXJuaW5nOiBwdWJsaWMucHJvdG8gaGFzIGltcG9ydCBwdWJsaWMuCisgIC8vIG1lc3NhZ2UgRm9yd2FyZCB7CisgIC8vICAgb3B0aW9uYWwgQmFzZSBiYXNlID0gMTsKKyAgLy8gfQorICAvLworICBwb29sXy5BZGRVbnVzZWRJbXBvcnRUcmFja0ZpbGUoImZvcndhcmQucHJvdG8iKTsKKyAgQnVpbGRGaWxlV2l0aFdhcm5pbmdzKAorICAgICJuYW1lOiBcImZvcndhcmQucHJvdG9cIiIKKyAgICAiZGVwZW5kZW5jeTogXCJiYXNlLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiYmFyLnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwiYmF6LnByb3RvXCIiCisgICAgImRlcGVuZGVuY3k6IFwicHVibGljLnByb3RvXCIiCisgICAgInB1YmxpY19kZXBlbmRlbmN5OiAyICIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogXCJGb3J3YXJkXCIiCisgICAgIiAgZmllbGQgeyBuYW1lOlwiYmFzZVwiIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGVfbmFtZTpcIkJhc2VcIiB9IgorICAgICJ9IiwKKyAgICAiZm9yd2FyZC5wcm90bzogYmFyLnByb3RvOiBPVEhFUjogSW1wb3J0IGJhci5wcm90byBidXQgbm90IHVzZWQuXG4iKTsKK30KKworbmFtZXNwYWNlIHsKK3ZvaWQgRmlsbFZhbGlkTWFwRW50cnkoRmlsZURlc2NyaXB0b3JQcm90byogZmlsZV9wcm90bykgeworICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb28nICIKKyAgICAgICIgIGZpZWxkIHsgIgorICAgICAgIiAgICBuYW1lOiAnZm9vX21hcCcgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX1JFUEVBVEVEICIKKyAgICAgICIgICAgdHlwZV9uYW1lOiAnRm9vTWFwRW50cnknICIKKyAgICAgICIgIH0gIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCisgICAgICAiICAgIG5hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIiAgICBvcHRpb25zIHsgIG1hcF9lbnRyeTogdHJ1ZSB9ICIKKyAgICAgICIgICAgZmllbGQgeyAiCisgICAgICAiICAgICAgbmFtZTogJ2tleScgbnVtYmVyOiAxIHR5cGU6VFlQRV9JTlQzMiBsYWJlbDpMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICAgIH0gIgorICAgICAgIiAgICBmaWVsZCB7ICIKKyAgICAgICIgICAgICBuYW1lOiAndmFsdWUnIG51bWJlcjogMiB0eXBlOlRZUEVfSU5UMzIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgICB9ICIKKyAgICAgICIgIH0gIgorICAgICAgIn0gIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdCYXInICIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAgfSIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvKSk7Cit9CitzdGF0aWMgY29uc3QgY2hhcioga01hcEVudHJ5RXJyb3JNZXNzYWdlID0KKyAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogT1RIRVI6IG1hcF9lbnRyeSBzaG91bGQgbm90IGJlIHNldCBleHBsaWNpdGx5LiAiCisgICAgIlVzZSBtYXA8S2V5VHlwZSwgVmFsdWVUeXBlPiBpbnN0ZWFkLlxuIjsKK3N0YXRpYyBjb25zdCBjaGFyKiBrTWFwRW50cnlLZXlUeXBlRXJyb3JNZXNzYWdlID0KKyAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogS2V5IGluIG1hcCBmaWVsZHMgY2Fubm90IGJlIGZsb2F0L2RvdWJsZSwgIgorICAgICJieXRlcyBvciBtZXNzYWdlIHR5cGVzLlxuIjsKKworfSAgLy8gbmFtZXNwYWNlCisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUJhc2UpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIEJ1aWxkRmlsZShmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlFeHRlbnNpb25SYW5nZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAorICAgICAgImV4dGVuc2lvbl9yYW5nZSB7ICIKKyAgICAgICIgIHN0YXJ0OiAxMCBlbmQ6IDIwICIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUV4dGVuc2lvbikgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAorICAgICAgImV4dGVuc2lvbiB7ICIKKyAgICAgICIgIG5hbWU6ICdmb29fZXh0JyBleHRlbmRlZTogJy5CYXInIG51bWJlcjogNSIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeU5lc3RlZFR5cGUpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKKyAgICAgICJuZXN0ZWRfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdCYXInICIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUVudW1UeXBlcykgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgVGV4dEZvcm1hdDo6TWVyZ2VGcm9tU3RyaW5nKAorICAgICAgImVudW1fdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdCYXJFbnVtJyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdCQVJfQkFSJyBudW1iZXI6MCB9ICIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUV4dHJhRmllbGQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKKyAgICAgICJmaWVsZCB7ICIKKyAgICAgICIgIG5hbWU6ICdvdGhlcl9maWVsZCcgIgorICAgICAgIiAgbGFiZWw6IExBQkVMX09QVElPTkFMICIKKyAgICAgICIgIHR5cGU6IFRZUEVfSU5UMzIgIgorICAgICAgIiAgbnVtYmVyOiAzICIKKyAgICAgICJ9ICIsCisgICAgICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeU1lc3NhZ2VOYW1lKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApLT5tdXRhYmxlX25lc3RlZF90eXBlKDApLT5zZXRfbmFtZSgKKyAgICAgICJPdGhlck1hcEVudHJ5Iik7CisgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfZmllbGQoMCktPnNldF90eXBlX25hbWUoCisgICAgICAiT3RoZXJNYXBFbnRyeSIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5Tm9uZVJlcGVhdGVkTWFwRW50cnkpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCktPm11dGFibGVfZmllbGQoMCktPnNldF9sYWJlbCgKKyAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9PUFRJT05BTCk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlEaWZmZXJlbnRDb250YWluaW5nVHlwZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgLy8gTW92ZSB0aGUgbmVzdGVkIE1hcEVudHJ5IG1lc3NhZ2UgaW50byB0aGUgdG9wIGxldmVsLCB3aGljaCBzaG91bGQgbm90IHBhc3MKKyAgLy8gdGhlIHZhbGlkYXRpb24uCisgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+QWRkQWxsb2NhdGVkKAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKS0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgpLT5SZWxlYXNlTGFzdCgpKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleU5hbWUpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXkgPSBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApCisgICAgICAtPm11dGFibGVfbmVzdGVkX3R5cGUoMCkKKyAgICAgIC0+bXV0YWJsZV9maWVsZCgwKTsKKyAga2V5LT5zZXRfbmFtZSgiS2V5Iik7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlLZXlMYWJlbCkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKKyAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX2ZpZWxkKDApOworICBrZXktPnNldF9sYWJlbChGaWVsZERlc2NyaXB0b3JQcm90bzo6TEFCRUxfUkVRVUlSRUQpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5S2V5TnVtYmVyKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCisgICAgICAtPm11dGFibGVfZmllbGQoMCk7CisgIGtleS0+c2V0X251bWJlcigzKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeVZhbHVlTmFtZSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHZhbHVlID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCisgICAgICAtPm11dGFibGVfZmllbGQoMSk7CisgIHZhbHVlLT5zZXRfbmFtZSgiVmFsdWUiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeVZhbHVlTGFiZWwpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiB2YWx1ZSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKKyAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX2ZpZWxkKDEpOworICB2YWx1ZS0+c2V0X2xhYmVsKEZpZWxkRGVzY3JpcHRvclByb3RvOjpMQUJFTF9SRVFVSVJFRCk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLCBrTWFwRW50cnlFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlWYWx1ZU51bWJlcikgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIHZhbHVlID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCisgICAgICAtPm11dGFibGVfZmllbGQoMSk7CisgIHZhbHVlLT5zZXRfbnVtYmVyKDMpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5RXJyb3JNZXNzYWdlKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5S2V5VHlwZUZsb2F0KSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCisgICAgICAtPm11dGFibGVfZmllbGQoMCk7CisgIGtleS0+c2V0X3R5cGUoRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfRkxPQVQpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5S2V5VHlwZUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVEb3VibGUpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBrZXkgPSBmaWxlX3Byb3RvLm11dGFibGVfbWVzc2FnZV90eXBlKDApCisgICAgICAtPm11dGFibGVfbmVzdGVkX3R5cGUoMCkKKyAgICAgIC0+bXV0YWJsZV9maWVsZCgwKTsKKyAga2V5LT5zZXRfdHlwZShGaWVsZERlc2NyaXB0b3JQcm90bzo6VFlQRV9ET1VCTEUpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwga01hcEVudHJ5S2V5VHlwZUVycm9yTWVzc2FnZSk7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVCeXRlcykgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKKyAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX2ZpZWxkKDApOworICBrZXktPnNldF90eXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX0JZVEVTKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUtleVR5cGVFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlLZXlUeXBlRW51bSkgeworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfcHJvdG87CisgIEZpbGxWYWxpZE1hcEVudHJ5KCZmaWxlX3Byb3RvKTsKKyAgRmllbGREZXNjcmlwdG9yUHJvdG8qIGtleSA9IGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoMCkKKyAgICAgIC0+bXV0YWJsZV9uZXN0ZWRfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX2ZpZWxkKDApOworICBrZXktPmNsZWFyX3R5cGUoKTsKKyAga2V5LT5zZXRfdHlwZV9uYW1lKCJCYXJFbnVtIik7CisgIEVudW1EZXNjcmlwdG9yUHJvdG8qIGVudW1fcHJvdG8gPSBmaWxlX3Byb3RvLmFkZF9lbnVtX3R5cGUoKTsKKyAgZW51bV9wcm90by0+c2V0X25hbWUoIkJhckVudW0iKTsKKyAgRW51bVZhbHVlRGVzY3JpcHRvclByb3RvKiBlbnVtX3ZhbHVlX3Byb3RvID0gZW51bV9wcm90by0+YWRkX3ZhbHVlKCk7CisgIGVudW1fdmFsdWVfcHJvdG8tPnNldF9uYW1lKCJCQVJfVkFMVUUwIik7CisgIGVudW1fdmFsdWVfcHJvdG8tPnNldF9udW1iZXIoMCk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLAorICAgICAgICAgICAgICAgICAgICAgICJmb28ucHJvdG86IEZvby5mb29fbWFwOiBUWVBFOiBLZXkgaW4gbWFwIGZpZWxkcyBjYW5ub3QgIgorICAgICAgICAgICAgICAgICAgICAgICJiZSBlbnVtIHR5cGVzLlxuIik7CisgIC8vIEVudW0ga2V5cyBhcmUgbm90IGFsbG93ZWQgaW4gcHJvdG8zIGFzIHdlbGwuCisgIC8vIEdldCByaWQgb2YgZXh0ZW5zaW9ucyBmb3IgcHJvdG8zIHRvIG1ha2UgaXQgcHJvdG8zIGNvbXBhdGlibGUuCisgIGZpbGVfcHJvdG8ubXV0YWJsZV9tZXNzYWdlX3R5cGUoKS0+UmVtb3ZlTGFzdCgpOworICBmaWxlX3Byb3RvLnNldF9zeW50YXgoInByb3RvMyIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKGZpbGVfcHJvdG8uRGVidWdTdHJpbmcoKSwKKyAgICAgICAgICAgICAgICAgICAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogS2V5IGluIG1hcCBmaWVsZHMgY2Fubm90ICIKKyAgICAgICAgICAgICAgICAgICAgICAiYmUgZW51bSB0eXBlcy5cbiIpOworfQorCisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUtleVR5cGVNZXNzYWdlKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBGaWVsZERlc2NyaXB0b3JQcm90byoga2V5ID0gZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKQorICAgICAgLT5tdXRhYmxlX25lc3RlZF90eXBlKDApCisgICAgICAtPm11dGFibGVfZmllbGQoMCk7CisgIGtleS0+Y2xlYXJfdHlwZSgpOworICBrZXktPnNldF90eXBlX25hbWUoIi5CYXIiKTsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycyhmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksIGtNYXBFbnRyeUtleVR5cGVFcnJvck1lc3NhZ2UpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlDb25mbGljdHNXaXRoRmllbGQpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKKyAgICAgICJmaWVsZCB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIiAgdHlwZTogVFlQRV9JTlQzMiAiCisgICAgICAiICBsYWJlbDogTEFCRUxfT1BUSU9OQUwgIgorICAgICAgIiAgbnVtYmVyOiAxMDAgIgorICAgICAgIn0iLAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiRm9vXCIuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogXCJGb29NYXBFbnRyeVwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICAgICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSBGb29NYXBFbnRyeSBjb25mbGljdHMgIgorICAgICAgIndpdGggYW4gZXhpc3RpbmcgZmllbGQuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5Q29uZmxpY3RzV2l0aE1lc3NhZ2UpIHsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICBGaWxsVmFsaWRNYXBFbnRyeSgmZmlsZV9wcm90byk7CisgIFRleHRGb3JtYXQ6Ok1lcmdlRnJvbVN0cmluZygKKyAgICAgICJuZXN0ZWRfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIn0iLAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiRm9vXCIuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlIEZvb01hcEVudHJ5IGNvbmZsaWN0cyAiCisgICAgICAid2l0aCBhbiBleGlzdGluZyBuZXN0ZWQgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBNYXBFbnRyeUNvbmZsaWN0c1dpdGhFbnVtKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCisgICAgICAiZW51bV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0Zvb01hcEVudHJ5JyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdFTlRSWV9GT08nIG51bWJlcjogMCB9IgorICAgICAgIn0iLAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiRm9vXCIuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb286IE5BTUU6IEV4cGFuZGVkIG1hcCBlbnRyeSB0eXBlIEZvb01hcEVudHJ5IGNvbmZsaWN0cyAiCisgICAgICAid2l0aCBhbiBleGlzdGluZyBlbnVtIHR5cGUuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIE1hcEVudHJ5Q29uZmxpY3RzV2l0aE9uZW9mKSB7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9wcm90bzsKKyAgRmlsbFZhbGlkTWFwRW50cnkoJmZpbGVfcHJvdG8pOworICBUZXh0Rm9ybWF0OjpNZXJnZUZyb21TdHJpbmcoCisgICAgICAib25lb2ZfZGVjbCB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICAgIn0iCisgICAgICAiZmllbGQgeyAiCisgICAgICAiICBuYW1lOiAnaW50X2ZpZWxkJyAiCisgICAgICAiICB0eXBlOiBUWVBFX0lOVDMyICIKKyAgICAgICIgIGxhYmVsOiBMQUJFTF9PUFRJT05BTCAiCisgICAgICAiICBvbmVvZl9pbmRleDogMCAiCisgICAgICAiICBudW1iZXI6IDEwMCAiCisgICAgICAifSAiLAorICAgICAgZmlsZV9wcm90by5tdXRhYmxlX21lc3NhZ2VfdHlwZSgwKSk7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICBmaWxlX3Byb3RvLkRlYnVnU3RyaW5nKCksCisgICAgICAiZm9vLnByb3RvOiBGb28uRm9vTWFwRW50cnk6IE5BTUU6IFwiRm9vTWFwRW50cnlcIiBpcyBhbHJlYWR5IGRlZmluZWQgaW4gIgorICAgICAgIlwiRm9vXCIuXG4iCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogVFlQRTogXCJGb29NYXBFbnRyeVwiIGlzIG5vdCBkZWZpbmVkLlxuIgorICAgICAgImZvby5wcm90bzogRm9vOiBOQU1FOiBFeHBhbmRlZCBtYXAgZW50cnkgdHlwZSBGb29NYXBFbnRyeSBjb25mbGljdHMgIgorICAgICAgIndpdGggYW4gZXhpc3Rpbmcgb25lb2YgdHlwZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgTWFwRW50cnlVc2VzTm9uZVplcm9FbnVtRGVmYXVsdFZhbHVlKSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgIm5hbWU6IFwiZm9vLnByb3RvXCIgIgorICAgICJlbnVtX3R5cGUgeyIKKyAgICAiICBuYW1lOiBcIkJhclwiIgorICAgICIgIHZhbHVlIHsgbmFtZTpcIkVOVU1fQVwiIG51bWJlcjoxIH0iCisgICAgIiAgdmFsdWUgeyBuYW1lOlwiRU5VTV9CXCIgbnVtYmVyOjIgfSIKKyAgICAifSIKKyAgICAibWVzc2FnZV90eXBlIHsiCisgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICIgIGZpZWxkIHsgIgorICAgICIgICAgbmFtZTogJ2Zvb19tYXAnIG51bWJlcjogMSBsYWJlbDpMQUJFTF9SRVBFQVRFRCAiCisgICAgIiAgICB0eXBlX25hbWU6ICdGb29NYXBFbnRyeScgIgorICAgICIgIH0gIgorICAgICIgIG5lc3RlZF90eXBlIHsgIgorICAgICIgICAgbmFtZTogJ0Zvb01hcEVudHJ5JyAiCisgICAgIiAgICBvcHRpb25zIHsgIG1hcF9lbnRyeTogdHJ1ZSB9ICIKKyAgICAiICAgIGZpZWxkIHsgIgorICAgICIgICAgICBuYW1lOiAna2V5JyBudW1iZXI6IDEgdHlwZTpUWVBFX0lOVDMyIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAiICAgIH0gIgorICAgICIgICAgZmllbGQgeyAiCisgICAgIiAgICAgIG5hbWU6ICd2YWx1ZScgbnVtYmVyOiAyIHR5cGVfbmFtZTpcIkJhclwiIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAiICAgIH0gIgorICAgICIgIH0gIgorICAgICJ9IiwKKyAgICAiZm9vLnByb3RvOiBGb28uZm9vX21hcDogIgorICAgICJUWVBFOiBFbnVtIHZhbHVlIGluIG1hcCBtdXN0IGRlZmluZSAwIGFzIHRoZSBmaXJzdCB2YWx1ZS5cbiIpOworfQorCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgUHJvdG8zUmVxdWlyZWRGaWVsZHMpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidmb28nIG51bWJlcjoxIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5mb286IE9USEVSOiBSZXF1aXJlZCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluICIKKyAgICAgICJwcm90bzMuXG4iKTsKKworICAvLyBhcHBsaWVkIHRvIG5lc3RlZCB0eXBlcyBhcyB3ZWxsLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnRm9vJyAiCisgICAgICAiICBuZXN0ZWRfdHlwZSB7ICIKKyAgICAgICIgICAgbmFtZSA6ICdCYXInICIKKyAgICAgICIgICAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX1JFUVVJUkVEIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICIgIH0gIgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogRm9vLkJhci5iYXI6IE9USEVSOiBSZXF1aXJlZCBmaWVsZHMgYXJlIG5vdCBhbGxvd2VkIGluICIKKyAgICAgICJwcm90bzMuXG4iKTsKKworICAvLyBvcHRpb25hbCBhbmQgcmVwZWF0ZWQgZmllbGRzIGFyZSBPSy4KKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnRm9vJyAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2ZvbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0gIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoyIGxhYmVsOkxBQkVMX1JFUEVBVEVEIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICJ9Iik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0RlZmF1bHRWYWx1ZSkgeworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnRm9vJyAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2ZvbycgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyICIKKyAgICAgICIgICAgICAgICAgZGVmYXVsdF92YWx1ZTogJzEnIH0iCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb28uZm9vOiBPVEhFUjogRXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkIGluICIKKyAgICAgICJwcm90bzMuXG4iKTsKKworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnRm9vJyAiCisgICAgICAiICBuZXN0ZWRfdHlwZSB7ICIKKyAgICAgICIgICAgbmFtZSA6ICdCYXInICIKKyAgICAgICIgICAgZmllbGQgeyBuYW1lOidiYXInIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiAiCisgICAgICAiICAgICAgICAgICAgZGVmYXVsdF92YWx1ZTogJzEnIH0iCisgICAgICAiICB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5CYXIuYmFyOiBPVEhFUjogRXhwbGljaXQgZGVmYXVsdCB2YWx1ZXMgYXJlIG5vdCBhbGxvd2VkICIKKyAgICAgICJpbiBwcm90bzMuXG4iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zRXh0ZW5zaW9uUmFuZ2UpIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgZmllbGQgeyBuYW1lOidmb28nIG51bWJlcjoxIGxhYmVsOkxBQkVMX09QVElPTkFMIHR5cGU6VFlQRV9JTlQzMiB9ICIKKyAgICAgICIgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwIGVuZDoxMDAgfSAiCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb286IE9USEVSOiBFeHRlbnNpb24gcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiAiCisgICAgICAicHJvdG8zLlxuIik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCisgICAgICAiICAgIG5hbWUgOiAnQmFyJyAiCisgICAgICAiICAgIGZpZWxkIHsgbmFtZTonYmFyJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiCisgICAgICAiICAgIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OjEwIGVuZDoxMDAgfSAiCisgICAgICAiICB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5CYXI6IE9USEVSOiBFeHRlbnNpb24gcmFuZ2VzIGFyZSBub3QgYWxsb3dlZCBpbiAiCisgICAgICAicHJvdG8zLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM01lc3NhZ2VTZXRXaXJlRm9ybWF0KSB7CisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb28nICIKKyAgICAgICIgIG9wdGlvbnMgeyBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdDogdHJ1ZSB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvbzogT1RIRVI6IE1lc3NhZ2VTZXQgaXMgbm90IHN1cHBvcnRlZCAiCisgICAgICAiaW4gcHJvdG8zLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0VudW0pIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAiZW51bV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19GT08nIG51bWJlcjoxIH0gIgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogRm9vRW51bTogT1RIRVI6IFRoZSBmaXJzdCBlbnVtIHZhbHVlIG11c3QgYmUgIgorICAgICAgInplcm8gaW4gcHJvdG8zLlxuIik7CisKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgZW51bV90eXBlIHsgIgorICAgICAgIiAgICBuYW1lOiAnRm9vRW51bScgIgorICAgICAgIiAgICB2YWx1ZSB7IG5hbWU6ICdGT09fRk9PJyBudW1iZXI6MSB9ICIKKyAgICAgICIgIH0gIgorICAgICAgIn0iLAorICAgICAgImZvby5wcm90bzogRm9vLkZvb0VudW06IE9USEVSOiBUaGUgZmlyc3QgZW51bSB2YWx1ZSBtdXN0IGJlICIKKyAgICAgICJ6ZXJvIGluIHByb3RvMy5cbiIpOworCisgIC8vIHZhbGlkIGNhc2UuCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAiZW51bV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0Zvb0VudW0nICIKKyAgICAgICIgIHZhbHVlIHsgbmFtZTogJ0ZPT19GT08nIG51bWJlcjowIH0gIgorICAgICAgIn0iKTsKK30KKworVEVTVF9GKFZhbGlkYXRpb25FcnJvclRlc3QsIFZhbGlkYXRlUHJvdG8zR3JvdXApIHsKKyAgQnVpbGRGaWxlV2l0aEVycm9ycygKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgbmVzdGVkX3R5cGUgeyAiCisgICAgICAiICAgIG5hbWU6ICdGb29Hcm91cCcgIgorICAgICAgIiAgfSAiCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2Zvb19ncm91cCcgbnVtYmVyOiAxIGxhYmVsOkxBQkVMX09QVElPTkFMICIKKyAgICAgICIgICAgICAgICAgdHlwZTogVFlQRV9HUk9VUCB0eXBlX25hbWU6J0Zvb0dyb3VwJyB9ICIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvby5mb29fZ3JvdXA6IFRZUEU6IEdyb3VwcyBhcmUgbm90IHN1cHBvcnRlZCBpbiBwcm90bzMgIgorICAgICAgInN5bnRheC5cbiIpOworfQorCisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0VudW1Gcm9tUHJvdG8yKSB7CisgIC8vIERlZmluZSBhbiBlbnVtIGluIGEgcHJvdG8yIGZpbGUuCisgIEJ1aWxkRmlsZSgKKyAgICAgICJuYW1lOiAnZm9vLnByb3RvJyAiCisgICAgICAicGFja2FnZTogJ2ZvbycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMicgIgorICAgICAgImVudW1fdHlwZSB7ICIKKyAgICAgICIgIG5hbWU6ICdGb29FbnVtJyAiCisgICAgICAiICB2YWx1ZSB7IG5hbWU6ICdERUZBVUxUX09QVElPTicgbnVtYmVyOjAgfSAiCisgICAgICAifSIpOworCisgIC8vIE5vdyB0cnkgdG8gcmVmZXIgdG8gaXQuIChBbGwgdGVzdHMgaW4gdGhlIGZpeHR1cmUgdXNlIHRoZSBzYW1lIHBvb2wsIHNvIHdlCisgIC8vIGNhbiByZWZlciB0byB0aGUgZW51bSBhYm92ZSBpbiB0aGlzIGRlZmluaXRpb24uKQorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnZm9vLnByb3RvJyAiCisgICAgICAic3ludGF4OiAncHJvdG8zJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgIgorICAgICAgIiAgbmFtZTogJ0ZvbycgIgorICAgICAgIiAgICBmaWVsZCB7IG5hbWU6J2JhcicgbnVtYmVyOjEgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0VOVU0gIgorICAgICAgIiAgICAgICAgICAgIHR5cGVfbmFtZTogJ2Zvby5Gb29FbnVtJyB9IgorICAgICAgIn0iLAorICAgICAgImJhci5wcm90bzogRm9vLmJhcjogVFlQRTogRW51bSB0eXBlIFwiZm9vLkZvb0VudW1cIiBpcyBub3QgYSBwcm90bzMgIgorICAgICAgImVudW0sIGJ1dCBpcyB1c2VkIGluIFwiRm9vXCIgd2hpY2ggaXMgYSBwcm90bzMgbWVzc2FnZSB0eXBlLlxuIik7Cit9CisKK1RFU1RfRihWYWxpZGF0aW9uRXJyb3JUZXN0LCBWYWxpZGF0ZVByb3RvM0V4dGVuc2lvbikgeworICAvLyBWYWxpZCBmb3Igb3B0aW9ucy4KKyAgRGVzY3JpcHRvclBvb2wgcG9vbDsKKyAgRmlsZURlc2NyaXB0b3JQcm90byBmaWxlX3Byb3RvOworICAvLyBBZGQgImdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnByb3RvIi4KKyAgRmlsZURlc2NyaXB0b3JQcm90bzo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygmZmlsZV9wcm90byk7CisgIEFTU0VSVF9UUlVFKHBvb2wuQnVpbGRGaWxlKGZpbGVfcHJvdG8pICE9IE5VTEwpOworICAvLyBBZGQgImZvby5wcm90byI6CisgIC8vICAgaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byI7CisgIC8vICAgZXh0ZW5kIGdvb2dsZS5wcm90b2J1Zi5GaWVsZE9wdGlvbnMgeworICAvLyAgICAgb3B0aW9uYWwgaW50MzIgb3B0aW9uMSA9IDEwMDA7CisgIC8vICAgfQorICBmaWxlX3Byb3RvLkNsZWFyKCk7CisgIGZpbGVfcHJvdG8uc2V0X25hbWUoImZvby5wcm90byIpOworICBmaWxlX3Byb3RvLnNldF9zeW50YXgoInByb3RvMyIpOworICBmaWxlX3Byb3RvLmFkZF9kZXBlbmRlbmN5KCJnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wcm90byIpOworICBBZGRFeHRlbnNpb24oJmZpbGVfcHJvdG8sICJnb29nbGUucHJvdG9idWYuRmllbGRPcHRpb25zIiwgIm9wdGlvbjEiLCAxMDAwLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMLAorICAgICAgICAgICAgICAgRmllbGREZXNjcmlwdG9yUHJvdG86OlRZUEVfSU5UMzIpOworICBBU1NFUlRfVFJVRShwb29sLkJ1aWxkRmlsZShmaWxlX3Byb3RvKSAhPSBOVUxMKTsKKworICAvLyBDb3B5IGFuZCBjaGFuZ2UgdGhlIHBhY2thZ2Ugb2YgdGhlIGRlc2NyaXB0b3IucHJvdG8KKyAgQnVpbGRGaWxlKAorICAgICAgIm5hbWU6ICdnb29nbGUucHJvdG9idWYucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzInICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOiAnQ29udGFpbmVyJyBleHRlbnNpb25fcmFuZ2UgeyBzdGFydDogMSBlbmQ6IDEwMDAgfSAiCisgICAgICAifSIpOworICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJkZXBlbmRlbmN5OiAnZ29vZ2xlLnByb3RvYnVmLnByb3RvJyAiCisgICAgICAiZXh0ZW5zaW9uIHsgIgorICAgICAgIiAgbmFtZTogJ2JhcicgbnVtYmVyOiAxIGxhYmVsOiBMQUJFTF9PUFRJT05BTCB0eXBlOiBUWVBFX0lOVDMyICIKKyAgICAgICIgIGV4dGVuZGVlOiAnQ29udGFpbmVyJyAiCisgICAgICAifSIsCisgICAgICAiYmFyLnByb3RvOiBiYXI6IE9USEVSOiBFeHRlbnNpb25zIGluIHByb3RvMyBhcmUgb25seSBhbGxvd2VkIGZvciAiCisgICAgICAiZGVmaW5pbmcgb3B0aW9ucy5cbiIpOworfQorCisvLyBUZXN0IHRoYXQgZmllbGQgbmFtZXMgdGhhdCBtYXkgY29uZmxpY3QgaW4gSlNPTiBpcyBub3QgYWxsb3dlZCBieSBwcm90b2MuCitURVNUX0YoVmFsaWRhdGlvbkVycm9yVGVzdCwgVmFsaWRhdGVQcm90bzNKc29uTmFtZSkgeworICAvLyBUaGUgY29tcGFyaXNvbiBpcyBjYXNlLWluc2Vuc2l0aXZlLgorICBCdWlsZEZpbGVXaXRoRXJyb3JzKAorICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJzeW50YXg6ICdwcm90bzMnICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyIKKyAgICAgICIgIG5hbWU6ICdGb28nIgorICAgICAgIiAgZmllbGQgeyBuYW1lOiduYW1lJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonTmFtZScgbnVtYmVyOjIgbGFiZWw6TEFCRUxfT1BUSU9OQUwgdHlwZTpUWVBFX0lOVDMyIH0iCisgICAgICAifSIsCisgICAgICAiZm9vLnByb3RvOiBGb286IE9USEVSOiBUaGUgSlNPTiBjYW1jZWwtY2FzZSBuYW1lIG9mIGZpZWxkIFwiTmFtZVwiICIKKyAgICAgICJjb25mbGljdHMgd2l0aCBmaWVsZCBcIm5hbWVcIi4gVGhpcyBpcyBub3QgYWxsb3dlZCBpbiBwcm90bzMuXG4iKTsKKyAgLy8gVW5kZXJzY29yZXMgYXJlIGlnbm9yZWQuCisgIEJ1aWxkRmlsZVdpdGhFcnJvcnMoCisgICAgICAibmFtZTogJ2Zvby5wcm90bycgIgorICAgICAgInN5bnRheDogJ3Byb3RvMycgIgorICAgICAgIm1lc3NhZ2VfdHlwZSB7IgorICAgICAgIiAgbmFtZTogJ0ZvbyciCisgICAgICAiICBmaWVsZCB7IG5hbWU6J2FiJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonX2FfX2JfJyBudW1iZXI6MiBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSIKKyAgICAgICJ9IiwKKyAgICAgICJmb28ucHJvdG86IEZvbzogT1RIRVI6IFRoZSBKU09OIGNhbWNlbC1jYXNlIG5hbWUgb2YgZmllbGQgXCJfYV9fYl9cIiAiCisgICAgICAiY29uZmxpY3RzIHdpdGggZmllbGQgXCJhYlwiLiBUaGlzIGlzIG5vdCBhbGxvd2VkIGluIHByb3RvMy5cbiIpOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBEZXNjcmlwdG9yRGF0YWJhc2UKIApAQCAtMzY1OSwxNiArNTg2NywyMyBAQAogCiAgIHZpcnR1YWwgdm9pZCBTZXRVcCgpIHsKICAgICBBZGRUb0RhdGFiYXNlKCZkYXRhYmFzZV8sCi0gICAgICAibmFtZTogXCJmb28ucHJvdG9cIiAiCi0gICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTpcIkZvb1wiIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCi0gICAgICAiZW51bV90eXBlIHsgbmFtZTpcIlRlc3RFbnVtXCIgdmFsdWUgeyBuYW1lOlwiRFVNTVlcIiBudW1iZXI6MCB9IH0gIgotICAgICAgInNlcnZpY2UgeyBuYW1lOlwiVGVzdFNlcnZpY2VcIiB9ICIpOworICAgICAgIm5hbWU6ICdmb28ucHJvdG8nICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOidGb28nIGV4dGVuc2lvbl9yYW5nZSB7IHN0YXJ0OiAxIGVuZDogMTAwIH0gfSAiCisgICAgICAiZW51bV90eXBlIHsgbmFtZTonVGVzdEVudW0nIHZhbHVlIHsgbmFtZTonRFVNTVknIG51bWJlcjowIH0gfSAiCisgICAgICAic2VydmljZSB7IG5hbWU6J1Rlc3RTZXJ2aWNlJyB9ICIpOwogICAgIEFkZFRvRGF0YWJhc2UoJmRhdGFiYXNlXywKLSAgICAgICJuYW1lOiBcImJhci5wcm90b1wiICIKLSAgICAgICJkZXBlbmRlbmN5OiBcImZvby5wcm90b1wiICIKLSAgICAgICJtZXNzYWdlX3R5cGUgeyBuYW1lOlwiQmFyXCIgfSAiCi0gICAgICAiZXh0ZW5zaW9uIHsgbmFtZTpcImZvb19leHRcIiBleHRlbmRlZTogXCIuRm9vXCIgbnVtYmVyOjUgIgorICAgICAgIm5hbWU6ICdiYXIucHJvdG8nICIKKyAgICAgICJkZXBlbmRlbmN5OiAnZm9vLnByb3RvJyAiCisgICAgICAibWVzc2FnZV90eXBlIHsgbmFtZTonQmFyJyB9ICIKKyAgICAgICJleHRlbnNpb24geyBuYW1lOidmb29fZXh0JyBleHRlbmRlZTogJy5Gb28nIG51bWJlcjo1ICIKICAgICAgICIgICAgICAgICAgICBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlOlRZUEVfSU5UMzIgfSAiKTsKKyAgICAvLyBCYXogaGFzIGFuIHVuZGVjbGFyZWQgZGVwZW5kZW5jeSBvbiBGb28uCisgICAgQWRkVG9EYXRhYmFzZSgmZGF0YWJhc2VfLAorICAgICAgIm5hbWU6ICdiYXoucHJvdG8nICIKKyAgICAgICJtZXNzYWdlX3R5cGUgeyAiCisgICAgICAiICBuYW1lOidCYXonICIKKyAgICAgICIgIGZpZWxkIHsgbmFtZTonZm9vJyBudW1iZXI6MSBsYWJlbDpMQUJFTF9PUFRJT05BTCB0eXBlX25hbWU6J0ZvbycgfSAiCisgICAgICAifSIpOwogICB9CiAKICAgLy8gV2UgY2FuJ3QgaW5qZWN0IGEgZmlsZSBjb250YWluaW5nIGVycm9ycyBpbnRvIGEgRGVzY3JpcHRvclBvb2wsIHNvIHdlCkBAIC0zOTA3LDYgKzYxMjIsMzMgQEAKICAgICBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOwogfQogCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgVW5kZWNsYXJlZERlcGVuZGVuY3lPblVuYnVpbHRUeXBlKSB7CisgIC8vIENoZWNrIHRoYXQgd2UgZmluZCBhbmQgcmVwb3J0IHVuZGVjbGFyZWQgZGVwZW5kZW5jaWVzIG9uIHR5cGVzIHRoYXQgZXhpc3QKKyAgLy8gaW4gdGhlIGRlc2NyaXB0b3IgZGF0YWJhc2UgYnV0IHRoYXQgaGF2ZSBub3Qgbm90IGJlZW4gYnVpbHQgeWV0LgorICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8sICZlcnJvcl9jb2xsZWN0b3IpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQmF6IikgPT0gTlVMTCk7CisgIEVYUEVDVF9FUSgKKyAgICAiYmF6LnByb3RvOiBCYXouZm9vOiBUWVBFOiBcIkZvb1wiIHNlZW1zIHRvIGJlIGRlZmluZWQgaW4gXCJmb28ucHJvdG9cIiwgIgorICAgICJ3aGljaCBpcyBub3QgaW1wb3J0ZWQgYnkgXCJiYXoucHJvdG9cIi4gIFRvIHVzZSBpdCBoZXJlLCBwbGVhc2UgYWRkICIKKyAgICAidGhlIG5lY2Vzc2FyeSBpbXBvcnQuXG4iLAorICAgIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7Cit9CisKK1RFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBSb2xsYmFja0FmdGVyRXJyb3IpIHsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgYWxsIHRyYWNlcyBvZiBiYWQgdHlwZXMgYXJlIHJlbW92ZWQgZnJvbSB0aGUgcG9vbC4gVGhpcyB1c2VkCisgIC8vIHRvIGJlIGIvNDUyOTQzNiwgZHVlIHRvIHRoZSBmYWN0IHRoYXQgYSBzeW1ib2wgcmVzb2x1dGlvbiBmYWlsdXJlIGNvdWxkCisgIC8vIHBvdGVudGlhbGx5IGNhdXNlIGFub3RoZXIgZmlsZSB0byBiZSByZWN1cnNpdmVseSBidWlsdCwgd2hpY2ggd291bGQgdHJpZ2dlcgorICAvLyBhIGNoZWNrcG9pbnQgX3Bhc3RfIHBvc3NpYmx5IGludmFsaWQgc3ltYm9scy4KKyAgLy8gQmF6IGlzIGRlZmluZWQgaW4gdGhlIGRhdGFiYXNlLCBidXQgdGhlIGZpbGUgaXMgaW52YWxpZCBiZWNhdXNlIGl0IGlzCisgIC8vIG1pc3NpbmcgYSBuZWNlc3NhcnkgaW1wb3J0LgorICBEZXNjcmlwdG9yUG9vbCBwb29sKCZkYXRhYmFzZV8pOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQmF6IikgPT0gTlVMTCk7CisgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlYXJjaGluZyBhZ2FpbiBmb3IgdGhlIGZpbGUgb3IgdGhlIHR5cGUgZmFpbHMuCisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpbGVCeU5hbWUoImJhei5wcm90byIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQmF6IikgPT0gTlVMTCk7Cit9CisKIFRFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBVbml0dGVzdFByb3RvKSB7CiAgIC8vIFRyeSB0byBsb2FkIGFsbCBvZiB1bml0dGVzdC5wcm90byBmcm9tIGEgRGVzY3JpcHRvckRhdGFiYXNlLiAgVGhpcyBzaG91bGQKICAgLy8gdGhvcm91Z2hseSB0ZXN0IGFsbCBwYXRocyB0aHJvdWdoIERlc2NyaXB0b3JCdWlsZGVyIHRvIGluc3VyZSB0aGF0IHRoZXJlCkBAIC0zOTI5LDYgKzYxNzEsMTAgQEAKIAogICBFWFBFQ1RfRVEob3JpZ2luYWxfZmlsZV9wcm90by5EZWJ1Z1N0cmluZygpLAogICAgICAgICAgICAgZmlsZV9mcm9tX2RhdGFiYXNlX3Byb3RvLkRlYnVnU3RyaW5nKCkpOworCisgIC8vIEFsc28gdmVyaWZ5IHRoYXQgQ29weVRvKCkgZGlkIG5vdCBvbWl0IGFueSBpbmZvcm1hdGlvbi4KKyAgRVhQRUNUX0VRKG9yaWdpbmFsX2ZpbGUtPkRlYnVnU3RyaW5nKCksCisgICAgICAgICAgICBmaWxlX2Zyb21fZGF0YWJhc2UtPkRlYnVnU3RyaW5nKCkpOwogfQogCiBURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRG9lc250UmV0cnlEYlVubmVjZXNzYXJpbHkpIHsKQEAgLTM5NjMsNiArNjIwOSwxNiBAQAogICBFWFBFQ1RfVFJVRShmaWxlLT5GaW5kRW51bVZhbHVlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7CiAgIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRTZXJ2aWNlQnlOYW1lKCJOT19TVUNIX1ZBTFVFIikgPT0gTlVMTCk7CiAgIEVYUEVDVF9UUlVFKGZpbGUtPkZpbmRFeHRlbnNpb25CeU5hbWUoIm5vX3N1Y2hfZXh0ZW5zaW9uIikgPT0gTlVMTCk7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUNvbnRhaW5pbmdTeW1ib2woIkZvby5uby5zdWNoLmZpZWxkIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpbGVDb250YWluaW5nU3ltYm9sKCJGb28ubm9fc3VjaF9maWVsZCIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiRm9vLk5vU3VjaE1lc3NhZ2VUeXBlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEZpZWxkQnlOYW1lKCJGb28ubm9fc3VjaF9maWVsZCIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFeHRlbnNpb25CeU5hbWUoIkZvby5ub19zdWNoX2V4dGVuc2lvbiIpID09IE5VTEwpOworICBFWFBFQ1RfVFJVRShwb29sLkZpbmRFbnVtVHlwZUJ5TmFtZSgiRm9vLk5vU3VjaEVudW1UeXBlIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZEVudW1WYWx1ZUJ5TmFtZSgiRm9vLk5PX1NVQ0hfVkFMVUUiKSA9PSBOVUxMKTsKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kTWV0aG9kQnlOYW1lKCJUZXN0U2VydmljZS5Ob1N1Y2hNZXRob2QiKSA9PSBOVUxMKTsKKwogICBFWFBFQ1RfRVEoMCwgY2FsbF9jb3VudGVyLmNhbGxfY291bnRfKTsKIH0KIApAQCAtMzk4NywxNSArNjI0Myw5MyBAQAogICBFWFBFQ1RfRVEoIiIsIGVycm9yX2NvbGxlY3Rvci50ZXh0Xyk7CiB9CiAKLVRFU1RfRihEYXRhYmFzZUJhY2tlZFBvb2xUZXN0LCBEb2VzbnRSZWxvYWRLbm93bkJhZEZpbGVzKSB7Ci0gIEVycm9yRGVzY3JpcHRvckRhdGFiYXNlIGVycm9yX2RhdGFiYXNlOwotICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOwotICBEZXNjcmlwdG9yUG9vbCBwb29sKCZlcnJvcl9kYXRhYmFzZSwgJmVycm9yX2NvbGxlY3Rvcik7CisvLyBEZXNjcmlwdG9yRGF0YWJhc2UgdGhhdCBhdHRlbXB0cyB0byBpbmR1Y2UgZXhwb25lbnRpYWxseS1iYWQgcGVyZm9ybWFuY2UKKy8vIGluIERlc2NyaXB0b3JQb29sLiBGb3IgZXZlcnkgcG9zaXRpdmUgTiwgdGhlIGRhdGFiYXNlIGNvbnRhaW5zIGEgZmlsZQorLy8gZmlsZU4ucHJvdG8sIHdoaWNoIGRlZmluZXMgYSBtZXNzYWdlIE1lc3NhZ2VOLCB3aGljaCBjb250YWlucyBmaWVsZHMgb2YKKy8vIHR5cGUgTWVzc2FnZUsgZm9yIGFsbCBLIGluIFswLE4pLiBNZXNzYWdlMCBpcyBub3QgZGVmaW5lZCBhbnl3aGVyZQorLy8gKGZpbGUwLnByb3RvIGV4aXN0cywgYnV0IGlzIGVtcHR5KSwgc28gZXZlcnkgb3RoZXIgZmlsZSBhbmQgbWVzc2FnZSB0eXBlCisvLyB3aWxsIGZhaWwgdG8gYnVpbGQuCisvLworLy8gSWYgdGhlIERlc2NyaXB0b3JQb29sIGlzIG5vdCBjYXJlZnVsIHRvIG1lbW9pemUgZXJyb3JzLCBhbiBhdHRlbXB0IHRvCisvLyBidWlsZCBhIGRlc2NyaXB0b3IgZm9yIE1lc3NhZ2VOIGNhbiByZXF1aXJlIE8oMl5OKSB0aW1lLgorY2xhc3MgRXhwb25lbnRpYWxFcnJvckRhdGFiYXNlIDogcHVibGljIERlc2NyaXB0b3JEYXRhYmFzZSB7CisgcHVibGljOgorICBFeHBvbmVudGlhbEVycm9yRGF0YWJhc2UoKSB7fQorICB+RXhwb25lbnRpYWxFcnJvckRhdGFiYXNlKCkge30KIAotICBFWFBFQ1RfVFJVRShwb29sLkZpbmRGaWxlQnlOYW1lKCJlcnJvci5wcm90byIpID09IE5VTEwpOwotICBlcnJvcl9jb2xsZWN0b3IudGV4dF8uY2xlYXIoKTsKLSAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUJ5TmFtZSgiZXJyb3IucHJvdG8iKSA9PSBOVUxMKTsKLSAgRVhQRUNUX0VRKCIiLCBlcnJvcl9jb2xsZWN0b3IudGV4dF8pOworICAvLyBpbXBsZW1lbnRzIERlc2NyaXB0b3JEYXRhYmFzZSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgYm9vbCBGaW5kRmlsZUJ5TmFtZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgIEZpbGVEZXNjcmlwdG9yUHJvdG8qIG91dHB1dCkgeworICAgIGludCBmaWxlX251bSA9IC0xOworICAgIEZ1bGxNYXRjaChmaWxlbmFtZSwgImZpbGUiLCAiLnByb3RvIiwgJmZpbGVfbnVtKTsKKyAgICBpZiAoZmlsZV9udW0gPiAtMSkgeworICAgICAgcmV0dXJuIFBvcHVsYXRlRmlsZShmaWxlX251bSwgb3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBib29sIEZpbmRGaWxlQ29udGFpbmluZ1N5bWJvbChjb25zdCBzdHJpbmcmIHN5bWJvbF9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvclByb3RvKiBvdXRwdXQpIHsKKyAgICBpbnQgZmlsZV9udW0gPSAtMTsKKyAgICBGdWxsTWF0Y2goc3ltYm9sX25hbWUsICJNZXNzYWdlIiwgIiIsICZmaWxlX251bSk7CisgICAgaWYgKGZpbGVfbnVtID4gMCkgeworICAgICAgcmV0dXJuIFBvcHVsYXRlRmlsZShmaWxlX251bSwgb3V0cHV0KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICBib29sIEZpbmRGaWxlQ29udGFpbmluZ0V4dGVuc2lvbihjb25zdCBzdHJpbmcmIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyBwcml2YXRlOgorICB2b2lkIEZ1bGxNYXRjaChjb25zdCBzdHJpbmcmIG5hbWUsCisgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgYmVnaW5fd2l0aCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBlbmRfd2l0aCwKKyAgICAgICAgICAgICAgICAgaW50KiBmaWxlX251bSkgeworICAgIGludCBiZWdpbl9zaXplID0gYmVnaW5fd2l0aC5zaXplKCk7CisgICAgaW50IGVuZF9zaXplID0gZW5kX3dpdGguc2l6ZSgpOworICAgIGlmIChuYW1lLnN1YnN0cigwLCBiZWdpbl9zaXplKSAhPSBiZWdpbl93aXRoIHx8CisgICAgICAgIG5hbWUuc3Vic3RyKG5hbWUuc2l6ZSgpLSBlbmRfc2l6ZSwgZW5kX3NpemUpICE9IGVuZF93aXRoKSB7CisgICAgICByZXR1cm47CisgICAgfQorICAgIHNhZmVfc3RydG8zMihuYW1lLnN1YnN0cihiZWdpbl9zaXplLCBuYW1lLnNpemUoKSAtIGVuZF9zaXplIC0gYmVnaW5fc2l6ZSksCisgICAgICAgICAgICAgICAgIGZpbGVfbnVtKTsKKyAgfQorCisgIGJvb2wgUG9wdWxhdGVGaWxlKGludCBmaWxlX251bSwgRmlsZURlc2NyaXB0b3JQcm90byogb3V0cHV0KSB7CisgICAgdXNpbmcgc3RyaW5nczo6U3Vic3RpdHV0ZTsKKyAgICBHT09HTEVfQ0hFQ0tfR0UoZmlsZV9udW0sIDApOworICAgIG91dHB1dC0+Q2xlYXIoKTsKKyAgICBvdXRwdXQtPnNldF9uYW1lKFN1YnN0aXR1dGUoImZpbGUkMC5wcm90byIsIGZpbGVfbnVtKSk7CisgICAgLy8gZmlsZTAucHJvdG8gZG9lc24ndCBkZWZpbmUgTWVzc2FnZTAKKyAgICBpZiAoZmlsZV9udW0gPiAwKSB7CisgICAgICBEZXNjcmlwdG9yUHJvdG8qIG1lc3NhZ2UgPSBvdXRwdXQtPmFkZF9tZXNzYWdlX3R5cGUoKTsKKyAgICAgIG1lc3NhZ2UtPnNldF9uYW1lKFN1YnN0aXR1dGUoIk1lc3NhZ2UkMCIsIGZpbGVfbnVtKSk7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpbGVfbnVtOyArK2kpIHsKKyAgICAgICAgb3V0cHV0LT5hZGRfZGVwZW5kZW5jeShTdWJzdGl0dXRlKCJmaWxlJDAucHJvdG8iLCBpKSk7CisgICAgICAgIEZpZWxkRGVzY3JpcHRvclByb3RvKiBmaWVsZCA9IG1lc3NhZ2UtPmFkZF9maWVsZCgpOworICAgICAgICBmaWVsZC0+c2V0X25hbWUoU3Vic3RpdHV0ZSgiZmllbGQkMCIsIGkpKTsKKyAgICAgICAgZmllbGQtPnNldF9udW1iZXIoaSk7CisgICAgICAgIGZpZWxkLT5zZXRfbGFiZWwoRmllbGREZXNjcmlwdG9yUHJvdG86OkxBQkVMX09QVElPTkFMKTsKKyAgICAgICAgZmllbGQtPnNldF90eXBlKEZpZWxkRGVzY3JpcHRvclByb3RvOjpUWVBFX01FU1NBR0UpOworICAgICAgICBmaWVsZC0+c2V0X3R5cGVfbmFtZShTdWJzdGl0dXRlKCJNZXNzYWdlJDAiLCBpKSk7CisgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworICB9Cit9OworCitURVNUX0YoRGF0YWJhc2VCYWNrZWRQb29sVGVzdCwgRG9lc250UmVsb2FkS25vd25CYWRGaWxlcykgeworICBFeHBvbmVudGlhbEVycm9yRGF0YWJhc2UgZXJyb3JfZGF0YWJhc2U7CisgIERlc2NyaXB0b3JQb29sIHBvb2woJmVycm9yX2RhdGFiYXNlKTsKKworICBHT09HTEVfTE9HKElORk8pIDw8ICJBIHRpbWVvdXQgaW4gdGhpcyB0ZXN0IHByb2JhYmx5IGluZGljYXRlcyBhIHJlYWwgYnVnLiI7CisKKyAgRVhQRUNUX1RSVUUocG9vbC5GaW5kRmlsZUJ5TmFtZSgiZmlsZTQwLnByb3RvIikgPT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKHBvb2wuRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJNZXNzYWdlNDAiKSA9PSBOVUxMKTsKIH0KIAogVEVTVF9GKERhdGFiYXNlQmFja2VkUG9vbFRlc3QsIERvZXNudEZhbGxiYWNrT25Xcm9uZ1R5cGUpIHsKQEAgLTQwMjgsNiArNjM2MiwyNTEgQEAKIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitjbGFzcyBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yIDogcHVibGljIERlc2NyaXB0b3JQb29sOjpFcnJvckNvbGxlY3RvciB7CisgcHVibGljOgorICBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yKCkge30KKworICB2aXJ0dWFsIHZvaWQgQWRkRXJyb3IoCisgICAgICBjb25zdCBzdHJpbmcgJmZpbGVuYW1lLAorICAgICAgY29uc3Qgc3RyaW5nICZlbGVtZW50X25hbWUsCisgICAgICBjb25zdCBNZXNzYWdlICptZXNzYWdlLAorICAgICAgRXJyb3JMb2NhdGlvbiBsb2NhdGlvbiwKKyAgICAgIGNvbnN0IHN0cmluZyAmZXJyb3JfbWVzc2FnZSkgeworICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJBZGRFcnJvcigpIGNhbGxlZCB1bmV4cGVjdGVkbHk6ICIgPDwgZmlsZW5hbWUgPDwgIiBbIgorICAgICAgICAgICAgICAgPDwgZWxlbWVudF9uYW1lIDw8ICJdOiAiIDw8IGVycm9yX21lc3NhZ2U7CisgIH0KKyBwcml2YXRlOgorICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoQWJvcnRpbmdFcnJvckNvbGxlY3Rvcik7Cit9OworCisvLyBBIHNvdXJjZSB0cmVlIGNvbnRhaW5pbmcgb25seSBvbmUgZmlsZS4KK2NsYXNzIFNpbmdsZXRvblNvdXJjZVRyZWUgOiBwdWJsaWMgY29tcGlsZXI6OlNvdXJjZVRyZWUgeworIHB1YmxpYzoKKyAgU2luZ2xldG9uU291cmNlVHJlZShjb25zdCBzdHJpbmcmIGZpbGVuYW1lLCBjb25zdCBzdHJpbmcmIGNvbnRlbnRzKQorICAgICAgOiBmaWxlbmFtZV8oZmlsZW5hbWUpLCBjb250ZW50c18oY29udGVudHMpIHt9CisKKyAgdmlydHVhbCBpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogT3Blbihjb25zdCBzdHJpbmcmIGZpbGVuYW1lKSB7CisgICAgcmV0dXJuIGZpbGVuYW1lID09IGZpbGVuYW1lXyA/CisgICAgICAgIG5ldyBpbzo6QXJyYXlJbnB1dFN0cmVhbShjb250ZW50c18uZGF0YSgpLCBjb250ZW50c18uc2l6ZSgpKSA6IE5VTEw7CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IHN0cmluZyBmaWxlbmFtZV87CisgIGNvbnN0IHN0cmluZyBjb250ZW50c187CisKKyAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFNpbmdsZXRvblNvdXJjZVRyZWUpOworfTsKKworY29uc3QgY2hhciAqY29uc3Qga1NvdXJjZUxvY2F0aW9uVGVzdElucHV0ID0KKyAgInN5bnRheCA9IFwicHJvdG8yXCI7XG4iCisgICJtZXNzYWdlIEEge1xuIgorICAiICBvcHRpb25hbCBpbnQzMiBhID0gMTtcbiIKKyAgIiAgbWVzc2FnZSBCIHtcbiIKKyAgIiAgICByZXF1aXJlZCBkb3VibGUgYiA9IDE7XG4iCisgICIgIH1cbiIKKyAgIn1cbiIKKyAgImVudW0gSW5kZWNpc2lvbiB7XG4iCisgICIgIFlFUyAgID0gMTtcbiIKKyAgIiAgTk8gICAgPSAyO1xuIgorICAiICBNQVlCRSA9IDM7XG4iCisgICJ9XG4iCisgICJzZXJ2aWNlIFMge1xuIgorICAiICBycGMgTWV0aG9kKEEpIHJldHVybnMgKEEuQik7XG4iCisgIC8vIFB1dCBhbiBlbXB0eSBsaW5lIGhlcmUgdG8gbWFrZSB0aGUgc291cmNlIGxvY2F0aW9uIHJhbmdlIG1hdGNoLgorICAiXG4iCisgICJ9XG4iCisgICJtZXNzYWdlIE1lc3NhZ2VXaXRoRXh0ZW5zaW9ucyB7XG4iCisgICIgIGV4dGVuc2lvbnMgMTAwMCB0byBtYXg7XG4iCisgICJ9XG4iCisgICJleHRlbmQgTWVzc2FnZVdpdGhFeHRlbnNpb25zIHtcbiIKKyAgIiAgb3B0aW9uYWwgaW50MzIgaW50MzJfZXh0ZW5zaW9uID0gMTAwMTtcbiIKKyAgIn1cbiIKKyAgIm1lc3NhZ2UgQyB7XG4iCisgICIgIGV4dGVuZCBNZXNzYWdlV2l0aEV4dGVuc2lvbnMge1xuIgorICAiICAgIG9wdGlvbmFsIEMgbWVzc2FnZV9leHRlbnNpb24gPSAxMDAyO1xuIgorICAiICB9XG4iCisgICJ9XG4iOworCitjbGFzcyBTb3VyY2VMb2NhdGlvblRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBTb3VyY2VMb2NhdGlvblRlc3QoKQorICAgICAgOiBzb3VyY2VfdHJlZV8oIi90ZXN0L3Rlc3QucHJvdG8iLCBrU291cmNlTG9jYXRpb25UZXN0SW5wdXQpLAorICAgICAgICBkYl8oJnNvdXJjZV90cmVlXyksCisgICAgICAgIHBvb2xfKCZkYl8sICZjb2xsZWN0b3JfKSB7fQorCisgIHN0YXRpYyBzdHJpbmcgUHJpbnRTb3VyY2VMb2NhdGlvbihjb25zdCBTb3VyY2VMb2NhdGlvbiAmbG9jKSB7CisgICAgcmV0dXJuIHN0cmluZ3M6OlN1YnN0aXR1dGUoIiQwOiQxLSQyOiQzIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICsgbG9jLnN0YXJ0X2xpbmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGxvYy5zdGFydF9jb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSArIGxvYy5lbmRfbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxICsgbG9jLmVuZF9jb2x1bW4pOworICB9CisKKyBwcml2YXRlOgorICBBYm9ydGluZ0Vycm9yQ29sbGVjdG9yIGNvbGxlY3Rvcl87CisgIFNpbmdsZXRvblNvdXJjZVRyZWUgc291cmNlX3RyZWVfOworICBjb21waWxlcjo6U291cmNlVHJlZURlc2NyaXB0b3JEYXRhYmFzZSBkYl87CisKKyBwcm90ZWN0ZWQ6CisgIERlc2NyaXB0b3JQb29sIHBvb2xfOworfTsKKworLy8gVE9ETyhhZG9ub3Zhbik6IGltcGxlbWVudCBzdXBwb3J0IGZvciBvcHRpb24gZmllbGRzIGFuZCBmb3IKKy8vIHN1YnBhcnRzIG9mIGRlY2xhcmF0aW9ucy4KKworVEVTVF9GKFNvdXJjZUxvY2F0aW9uVGVzdCwgR2V0U291cmNlTG9jYXRpb24pIHsKKyAgU291cmNlTG9jYXRpb24gbG9jOworCisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yICpmaWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvciAqYV9kZXNjID0gZmlsZV9kZXNjLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkEiKTsKKyAgRVhQRUNUX1RSVUUoYV9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiMjoxLTc6MiIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvciAqYV9iX2Rlc2MgPSBhX2Rlc2MtPkZpbmROZXN0ZWRUeXBlQnlOYW1lKCJCIik7CisgIEVYUEVDVF9UUlVFKGFfYl9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiNDozLTY6NCIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgY29uc3QgRW51bURlc2NyaXB0b3IgKmVfZGVzYyA9IGZpbGVfZGVzYy0+RmluZEVudW1UeXBlQnlOYW1lKCJJbmRlY2lzaW9uIik7CisgIEVYUEVDVF9UUlVFKGVfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworICBFWFBFQ1RfRVEoIjg6MS0xMjoyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yICp5ZXNfZGVzYyA9IGVfZGVzYy0+RmluZFZhbHVlQnlOYW1lKCJZRVMiKTsKKyAgRVhQRUNUX1RSVUUoeWVzX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKKyAgRVhQRUNUX0VRKCI5OjMtOToxMyIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgY29uc3QgU2VydmljZURlc2NyaXB0b3IgKnNfZGVzYyA9IGZpbGVfZGVzYy0+RmluZFNlcnZpY2VCeU5hbWUoIlMiKTsKKyAgRVhQRUNUX1RSVUUoc19kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiMTM6MS0xNjoyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBNZXRob2REZXNjcmlwdG9yICptX2Rlc2MgPSBzX2Rlc2MtPkZpbmRNZXRob2RCeU5hbWUoIk1ldGhvZCIpOworICBFWFBFQ1RfVFJVRShtX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKKyAgRVhQRUNUX0VRKCIxNDozLTE0OjMxIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworfQorCitURVNUX0YoU291cmNlTG9jYXRpb25UZXN0LCBFeHRlbnNpb25Tb3VyY2VMb2NhdGlvbikgeworICBTb3VyY2VMb2NhdGlvbiBsb2M7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IgKmludDMyX2V4dGVuc2lvbl9kZXNjID0KKyAgICAgIGZpbGVfZGVzYy0+RmluZEV4dGVuc2lvbkJ5TmFtZSgiaW50MzJfZXh0ZW5zaW9uIik7CisgIEVYUEVDVF9UUlVFKGludDMyX2V4dGVuc2lvbl9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiMjE6My0yMTo0MSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7CisKKyAgY29uc3QgRGVzY3JpcHRvciAqY19kZXNjID0gZmlsZV9kZXNjLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoIkMiKTsKKyAgRVhQRUNUX1RSVUUoY19kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiMjM6MS0yNzoyIiwgUHJpbnRTb3VyY2VMb2NhdGlvbihsb2MpKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IgKm1lc3NhZ2VfZXh0ZW5zaW9uX2Rlc2MgPQorICAgICAgY19kZXNjLT5GaW5kRXh0ZW5zaW9uQnlOYW1lKCJtZXNzYWdlX2V4dGVuc2lvbiIpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlX2V4dGVuc2lvbl9kZXNjLT5HZXRTb3VyY2VMb2NhdGlvbigmbG9jKSk7CisgIEVYUEVDVF9FUSgiMjU6NS0yNTo0MSIsIFByaW50U291cmNlTG9jYXRpb24obG9jKSk7Cit9CisKKy8vIE1pc3NpbmcgU291cmNlQ29kZUluZm8gZG9lc24ndCBjYXVzZSBjcmFzaDoKK1RFU1RfRihTb3VyY2VMb2NhdGlvblRlc3QsIEdldFNvdXJjZUxvY2F0aW9uX01pc3NpbmdTb3VyY2VDb2RlSW5mbykgeworICBTb3VyY2VMb2NhdGlvbiBsb2M7CisKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IgKmZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChwb29sXy5GaW5kRmlsZUJ5TmFtZSgiL3Rlc3QvdGVzdC5wcm90byIpKTsKKworICBGaWxlRGVzY3JpcHRvclByb3RvIHByb3RvOworICBmaWxlX2Rlc2MtPkNvcHlUbygmcHJvdG8pOyAgLy8gTm90ZSwgdGhpcyBkaXNjYXJkcyB0aGUgU291cmNlQ29kZUluZm8uCisgIEVYUEVDVF9GQUxTRShwcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKKworICBEZXNjcmlwdG9yUG9vbCBiYWQxX3Bvb2woJnBvb2xfKTsKKyAgY29uc3QgRmlsZURlc2NyaXB0b3IqIGJhZDFfZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKGJhZDFfcG9vbC5CdWlsZEZpbGUocHJvdG8pKTsKKyAgY29uc3QgRGVzY3JpcHRvciAqYmFkMV9hX2Rlc2MgPSBiYWQxX2ZpbGVfZGVzYy0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJBIik7CisgIEVYUEVDVF9GQUxTRShiYWQxX2FfZGVzYy0+R2V0U291cmNlTG9jYXRpb24oJmxvYykpOworfQorCisvLyBDb3JydXB0IFNvdXJjZUNvZGVJbmZvIGRvZXNuJ3QgY2F1c2UgY3Jhc2g6CitURVNUX0YoU291cmNlTG9jYXRpb25UZXN0LCBHZXRTb3VyY2VMb2NhdGlvbl9Cb2d1c1NvdXJjZUNvZGVJbmZvKSB7CisgIFNvdXJjZUxvY2F0aW9uIGxvYzsKKworICBjb25zdCBGaWxlRGVzY3JpcHRvciAqZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOworCisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gcHJvdG87CisgIGZpbGVfZGVzYy0+Q29weVRvKCZwcm90byk7ICAvLyBOb3RlLCB0aGlzIGRpc2NhcmRzIHRoZSBTb3VyY2VDb2RlSW5mby4KKyAgRVhQRUNUX0ZBTFNFKHByb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworICBTb3VyY2VDb2RlSW5mb19Mb2NhdGlvbiAqbG9jX21zZyA9CisgICAgICBwcm90by5tdXRhYmxlX3NvdXJjZV9jb2RlX2luZm8oKS0+YWRkX2xvY2F0aW9uKCk7CisgIGxvY19tc2ctPmFkZF9wYXRoKDEpOworICBsb2NfbXNnLT5hZGRfcGF0aCgyKTsKKyAgbG9jX21zZy0+YWRkX3BhdGgoMyk7CisgIGxvY19tc2ctPmFkZF9zcGFuKDQpOworICBsb2NfbXNnLT5hZGRfc3Bhbig1KTsKKyAgbG9jX21zZy0+YWRkX3NwYW4oNik7CisKKyAgRGVzY3JpcHRvclBvb2wgYmFkMl9wb29sKCZwb29sXyk7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBiYWQyX2ZpbGVfZGVzYyA9CisgICAgICBHT09HTEVfQ0hFQ0tfTk9UTlVMTChiYWQyX3Bvb2wuQnVpbGRGaWxlKHByb3RvKSk7CisgIGNvbnN0IERlc2NyaXB0b3IgKmJhZDJfYV9kZXNjID0gYmFkMl9maWxlX2Rlc2MtPkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgiQSIpOworICBFWFBFQ1RfRkFMU0UoYmFkMl9hX2Rlc2MtPkdldFNvdXJjZUxvY2F0aW9uKCZsb2MpKTsKK30KKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitjb25zdCBjaGFyKiBjb25zdCBrQ29weVNvdXJjZUNvZGVJbmZvVG9UZXN0SW5wdXQgPQorICAic3ludGF4ID0gXCJwcm90bzJcIjtcbiIKKyAgIm1lc3NhZ2UgRm9vIHt9XG4iOworCisvLyBSZXF1aXJlZCBzaW5jZSBzb3VyY2UgY29kZSBpbmZvcm1hdGlvbiBpcyBub3QgcHJlc2VydmVkIGJ5CisvLyBGaWxlRGVzY3JpcHRvclRlc3QuCitjbGFzcyBDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CisgcHVibGljOgorICBDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3QoKQorICAgICAgOiBzb3VyY2VfdHJlZV8oIi90ZXN0L3Rlc3QucHJvdG8iLCBrQ29weVNvdXJjZUNvZGVJbmZvVG9UZXN0SW5wdXQpLAorICAgICAgICBkYl8oJnNvdXJjZV90cmVlXyksCisgICAgICAgIHBvb2xfKCZkYl8sICZjb2xsZWN0b3JfKSB7fQorCisgcHJpdmF0ZToKKyAgQWJvcnRpbmdFcnJvckNvbGxlY3RvciBjb2xsZWN0b3JfOworICBTaW5nbGV0b25Tb3VyY2VUcmVlIHNvdXJjZV90cmVlXzsKKyAgY29tcGlsZXI6OlNvdXJjZVRyZWVEZXNjcmlwdG9yRGF0YWJhc2UgZGJfOworCisgcHJvdGVjdGVkOgorICBEZXNjcmlwdG9yUG9vbCBwb29sXzsKK307CisKK1RFU1RfRihDb3B5U291cmNlQ29kZUluZm9Ub1Rlc3QsIENvcHlUb19Eb2VzTm90Q29weVNvdXJjZUNvZGVJbmZvKSB7CisgIGNvbnN0IEZpbGVEZXNjcmlwdG9yKiBmaWxlX2Rlc2MgPQorICAgICAgR09PR0xFX0NIRUNLX05PVE5VTEwocG9vbF8uRmluZEZpbGVCeU5hbWUoIi90ZXN0L3Rlc3QucHJvdG8iKSk7CisgIEZpbGVEZXNjcmlwdG9yUHJvdG8gZmlsZV9kZXNjX3Byb3RvOworICBBU1NFUlRfRkFMU0UoZmlsZV9kZXNjX3Byb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworCisgIGZpbGVfZGVzYy0+Q29weVRvKCZmaWxlX2Rlc2NfcHJvdG8pOworICBFWFBFQ1RfRkFMU0UoZmlsZV9kZXNjX3Byb3RvLmhhc19zb3VyY2VfY29kZV9pbmZvKCkpOworfQorCitURVNUX0YoQ29weVNvdXJjZUNvZGVJbmZvVG9UZXN0LCBDb3B5U291cmNlQ29kZUluZm9UbykgeworICBjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZV9kZXNjID0KKyAgICAgIEdPT0dMRV9DSEVDS19OT1ROVUxMKHBvb2xfLkZpbmRGaWxlQnlOYW1lKCIvdGVzdC90ZXN0LnByb3RvIikpOworICBGaWxlRGVzY3JpcHRvclByb3RvIGZpbGVfZGVzY19wcm90bzsKKyAgQVNTRVJUX0ZBTFNFKGZpbGVfZGVzY19wcm90by5oYXNfc291cmNlX2NvZGVfaW5mbygpKTsKKworICBmaWxlX2Rlc2MtPkNvcHlTb3VyY2VDb2RlSW5mb1RvKCZmaWxlX2Rlc2NfcHJvdG8pOworICBjb25zdCBTb3VyY2VDb2RlSW5mbyYgaW5mbyA9IGZpbGVfZGVzY19wcm90by5zb3VyY2VfY29kZV9pbmZvKCk7CisgIEFTU0VSVF9FUSg0LCBpbmZvLmxvY2F0aW9uX3NpemUoKSk7CisgIC8vIEdldCB0aGUgRm9vIG1lc3NhZ2UgbG9jYXRpb24KKyAgY29uc3QgU291cmNlQ29kZUluZm9fTG9jYXRpb24mIGZvb19sb2NhdGlvbiA9IGluZm8ubG9jYXRpb24oMik7CisgIEFTU0VSVF9FUSgyLCBmb29fbG9jYXRpb24ucGF0aF9zaXplKCkpOworICBFWFBFQ1RfRVEoRmlsZURlc2NyaXB0b3JQcm90bzo6a01lc3NhZ2VUeXBlRmllbGROdW1iZXIsIGZvb19sb2NhdGlvbi5wYXRoKDApKTsKKyAgRVhQRUNUX0VRKDAsIGZvb19sb2NhdGlvbi5wYXRoKDEpKTsgICAgICAvLyBGb28gaXMgdGhlIGZpcnN0IG1lc3NhZ2UgZGVmaW5lZAorICBBU1NFUlRfRVEoMywgZm9vX2xvY2F0aW9uLnNwYW5fc2l6ZSgpKTsgIC8vIEZvbyBzcGFucyBvbmUgbGluZQorICBFWFBFQ1RfRVEoMSwgZm9vX2xvY2F0aW9uLnNwYW4oMCkpOyAgICAgIC8vIEZvbyBpcyBkZWNsYXJlZCBvbiBsaW5lIDEKKyAgRVhQRUNUX0VRKDAsIGZvb19sb2NhdGlvbi5zcGFuKDEpKTsgICAgICAvLyBGb28gc3RhcnRzIGF0IGNvbHVtbiAwCisgIEVYUEVDVF9FUSgxNCwgZm9vX2xvY2F0aW9uLnNwYW4oMikpOyAgICAgLy8gRm9vIGVuZHMgb24gY29sdW1uIDE0Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKwogCiB9ICAvLyBuYW1lc3BhY2UgZGVzY3JpcHRvcl91bml0dGVzdAogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kcm9wX3Vua25vd25fZmllbGRzX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2Ryb3BfdW5rbm93bl9maWVsZHNfdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnBiLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucGIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9kdXJhdGlvbi5wYi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZHVyYXRpb24ucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R1cmF0aW9uLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuY2MKaW5kZXggYzcxMWEyZC4uOWU4M2JkMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNjQsMTggKzY0LDI3IEBACiAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9hcmVuYXN0cmluZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfaW5sLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtODMsMTMgKzkyLDIxIEBACiB1c2luZyBpbnRlcm5hbDo6V2lyZUZvcm1hdDsKIHVzaW5nIGludGVybmFsOjpFeHRlbnNpb25TZXQ7CiB1c2luZyBpbnRlcm5hbDo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb247Cit1c2luZyBpbnRlcm5hbDo6TWFwRmllbGQ7Cit1c2luZyBpbnRlcm5hbDo6RHluYW1pY01hcEZpZWxkOwogCiAKK3VzaW5nIGludGVybmFsOjpBcmVuYVN0cmluZ1B0cjsKKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gU29tZSBoZWxwZXIgdGFibGVzIGFuZCBmdW5jdGlvbnMuLi4KIAogbmFtZXNwYWNlIHsKIAorYm9vbCBJc01hcEZpZWxkSW5BcGkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgeworICByZXR1cm4gZmllbGQtPmlzX21hcCgpOworfQorCiAvLyBDb21wdXRlIHRoZSBieXRlIHNpemUgb2YgdGhlIGluLW1lbW9yeSByZXByZXNlbnRhdGlvbiBvZiB0aGUgZmllbGQuCiBpbnQgRmllbGRTcGFjZVVzZWQoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgewogICB0eXBlZGVmIEZpZWxkRGVzY3JpcHRvciBGRDsgIC8vIGF2b2lkIGxpbmUgd3JhcHBpbmcKQEAgLTEwMyw3ICsxMjAsMTIgQEAKICAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRkxPQVQgIDogcmV0dXJuIHNpemVvZihSZXBlYXRlZEZpZWxkPGZsb2F0ICAgPik7CiAgICAgICBjYXNlIEZEOjpDUFBUWVBFX0JPT0wgICA6IHJldHVybiBzaXplb2YoUmVwZWF0ZWRGaWVsZDxib29sICAgID4pOwogICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9FTlVNICAgOiByZXR1cm4gc2l6ZW9mKFJlcGVhdGVkRmllbGQ8aW50ICAgICA+KTsKLSAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfTUVTU0FHRTogcmV0dXJuIHNpemVvZihSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KTsKKyAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgICAgICByZXR1cm4gc2l6ZW9mKER5bmFtaWNNYXBGaWVsZCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIHNpemVvZihSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KTsKKyAgICAgICAgfQogCiAgICAgICBjYXNlIEZEOjpDUFBUWVBFX1NUUklORzoKICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKQEAgLTEyMywxMyArMTQ1LDE1IEBACiAgICAgICBjYXNlIEZEOjpDUFBUWVBFX0ZMT0FUICA6IHJldHVybiBzaXplb2YoZmxvYXQgICApOwogICAgICAgY2FzZSBGRDo6Q1BQVFlQRV9CT09MICAgOiByZXR1cm4gc2l6ZW9mKGJvb2wgICAgKTsKICAgICAgIGNhc2UgRkQ6OkNQUFRZUEVfRU5VTSAgIDogcmV0dXJuIHNpemVvZihpbnQgICAgICk7Ci0gICAgICBjYXNlIEZEOjpDUFBUWVBFX01FU1NBR0U6IHJldHVybiBzaXplb2YoTWVzc2FnZSopOworCisgICAgICBjYXNlIEZEOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgIHJldHVybiBzaXplb2YoTWVzc2FnZSopOwogCiAgICAgICBjYXNlIEZEOjpDUFBUWVBFX1NUUklORzoKICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKICAgICAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgcmV0dXJuIHNpemVvZihzdHJpbmcqKTsKKyAgICAgICAgICAgIHJldHVybiBzaXplb2YoQXJlbmFTdHJpbmdQdHIpOwogICAgICAgICB9CiAgICAgICAgIGJyZWFrOwogICAgIH0KQEAgLTEzOSwxMSArMTYzLDQyIEBACiAgIHJldHVybiAwOwogfQogCisvLyBDb21wdXRlIHRoZSBieXRlIHNpemUgb2YgaW4tbWVtb3J5IHJlcHJlc2VudGF0aW9uIG9mIHRoZSBvbmVvZiBmaWVsZHMKKy8vIGluIGRlZmF1bHQgb25lb2YgaW5zdGFuY2UuCitpbnQgT25lb2ZGaWVsZFNwYWNlVXNlZChjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHR5cGVkZWYgRmllbGREZXNjcmlwdG9yIEZEOyAgLy8gYXZvaWQgbGluZSB3cmFwcGluZworICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgY2FzZSBGRDo6Q1BQVFlQRV9JTlQzMiAgOiByZXR1cm4gc2l6ZW9mKGludDMyICAgKTsKKyAgICBjYXNlIEZEOjpDUFBUWVBFX0lOVDY0ICA6IHJldHVybiBzaXplb2YoaW50NjQgICApOworICAgIGNhc2UgRkQ6OkNQUFRZUEVfVUlOVDMyIDogcmV0dXJuIHNpemVvZih1aW50MzIgICk7CisgICAgY2FzZSBGRDo6Q1BQVFlQRV9VSU5UNjQgOiByZXR1cm4gc2l6ZW9mKHVpbnQ2NCAgKTsKKyAgICBjYXNlIEZEOjpDUFBUWVBFX0RPVUJMRSA6IHJldHVybiBzaXplb2YoZG91YmxlICApOworICAgIGNhc2UgRkQ6OkNQUFRZUEVfRkxPQVQgIDogcmV0dXJuIHNpemVvZihmbG9hdCAgICk7CisgICAgY2FzZSBGRDo6Q1BQVFlQRV9CT09MICAgOiByZXR1cm4gc2l6ZW9mKGJvb2wgICAgKTsKKyAgICBjYXNlIEZEOjpDUFBUWVBFX0VOVU0gICA6IHJldHVybiBzaXplb2YoaW50ICAgICApOworCisgICAgY2FzZSBGRDo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgcmV0dXJuIHNpemVvZihNZXNzYWdlKik7CisKKyAgICBjYXNlIEZEOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgcmV0dXJuIHNpemVvZihBcmVuYVN0cmluZ1B0cik7CisgICAgICB9CisgICAgICBicmVhazsKKyAgfQorCisgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKKyAgcmV0dXJuIDA7Cit9CisKIGlubGluZSBpbnQgRGl2aWRlUm91bmRpbmdVcChpbnQgaSwgaW50IGopIHsKICAgcmV0dXJuIChpICsgKGogLSAxKSkgLyBqOwogfQogCiBzdGF0aWMgY29uc3QgaW50IGtTYWZlQWxpZ25tZW50ID0gc2l6ZW9mKHVpbnQ2NCk7CitzdGF0aWMgY29uc3QgaW50IGtNYXhPbmVvZlVuaW9uU2l6ZSA9IHNpemVvZih1aW50NjQpOwogCiBpbmxpbmUgaW50IEFsaWduVG8oaW50IG9mZnNldCwgaW50IGFsaWdubWVudCkgewogICByZXR1cm4gRGl2aWRlUm91bmRpbmdVcChvZmZzZXQsIGFsaWdubWVudCkgKiBhbGlnbm1lbnQ7CkBAIC0xNjYsOCArMjIxLDEwIEBACiAgIHN0cnVjdCBUeXBlSW5mbyB7CiAgICAgaW50IHNpemU7CiAgICAgaW50IGhhc19iaXRzX29mZnNldDsKKyAgICBpbnQgb25lb2ZfY2FzZV9vZmZzZXQ7CiAgICAgaW50IHVua25vd25fZmllbGRzX29mZnNldDsKICAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQ7CisgICAgaW50IGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0OwogCiAgICAgLy8gTm90IG93bmVkIGJ5IHRoZSBUeXBlSW5mby4KICAgICBEeW5hbWljTWVzc2FnZUZhY3RvcnkqIGZhY3Rvcnk7ICAvLyBUaGUgZmFjdG9yeSB0aGF0IGNyZWF0ZWQgdGhpcyBvYmplY3QuCkBAIC0xNzYsOSArMjMzLDIxIEBACiAKICAgICAvLyBXYXJuaW5nOiAgVGhlIG9yZGVyIGluIHdoaWNoIHRoZSBmb2xsb3dpbmcgcG9pbnRlcnMgYXJlIGRlZmluZWQgaXMKICAgICAvLyAgIGltcG9ydGFudCAodGhlIHByb3RvdHlwZSBtdXN0IGJlIGRlbGV0ZWQgKmJlZm9yZSogdGhlIG9mZnNldHMpLgotICAgIHNjb3BlZF9hcnJheTxpbnQ+IG9mZnNldHM7Ci0gICAgc2NvcGVkX3B0cjxjb25zdCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbj4gcmVmbGVjdGlvbjsKLSAgICBzY29wZWRfcHRyPGNvbnN0IER5bmFtaWNNZXNzYWdlPiBwcm90b3R5cGU7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGludD4gb2Zmc2V0czsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGNvbnN0IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uPiByZWZsZWN0aW9uOworICAgIC8vIERvbid0IHVzZSBhIHNjb3BlZF9wdHIgdG8gaG9sZCB0aGUgcHJvdG90eXBlOiB0aGUgZGVzdHJ1Y3RvciBmb3IKKyAgICAvLyBEeW5hbWljTWVzc2FnZSBuZWVkcyB0byBrbm93IHdoZXRoZXIgaXQgaXMgdGhlIHByb3RvdHlwZSwgYW5kIGRvZXMgc28gYnkKKyAgICAvLyBsb29raW5nIGJhY2sgYXQgdGhpcyBmaWVsZC4gVGhpcyB3b3VsZCBhc3N1bWUgZGV0YWlscyBhYm91dCB0aGUKKyAgICAvLyBpbXBsZW1lbnRhdGlvbiBvZiBzY29wZWRfcHRyLgorICAgIGNvbnN0IER5bmFtaWNNZXNzYWdlKiBwcm90b3R5cGU7CisgICAgdm9pZCogZGVmYXVsdF9vbmVvZl9pbnN0YW5jZTsKKworICAgIFR5cGVJbmZvKCkgOiBwcm90b3R5cGUoTlVMTCksIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2UoTlVMTCkge30KKworICAgIH5UeXBlSW5mbygpIHsKKyAgICAgIGRlbGV0ZSBwcm90b3R5cGU7CisgICAgICBvcGVyYXRvciBkZWxldGUoZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSk7CisgICAgfQogICB9OwogCiAgIER5bmFtaWNNZXNzYWdlKGNvbnN0IFR5cGVJbmZvKiB0eXBlX2luZm8pOwpAQCAtMTkwLDE0ICsyNTksMjkgQEAKICAgLy8gaW1wbGVtZW50cyBNZXNzYWdlIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICBNZXNzYWdlKiBOZXcoKSBjb25zdDsKKyAgTWVzc2FnZSogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdDsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmEoKSBjb25zdCB7IHJldHVybiBOVUxMOyB9OwogCiAgIGludCBHZXRDYWNoZWRTaXplKCkgY29uc3Q7CiAgIHZvaWQgU2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Q7CiAKICAgTWV0YWRhdGEgR2V0TWV0YWRhdGEoKSBjb25zdDsKIAorICAvLyBXZSBhY3R1YWxseSBhbGxvY2F0ZSBtb3JlIG1lbW9yeSB0aGFuIHNpemVvZigqdGhpcykgd2hlbiB0aGlzCisgIC8vIGNsYXNzJ3MgbWVtb3J5IGlzIGFsbG9jYXRlZCB2aWEgdGhlIGdsb2JhbCBvcGVyYXRvciBuZXcuIFRodXMsIHdlIG5lZWQgdG8KKyAgLy8gbWFudWFsbHkgY2FsbCB0aGUgZ2xvYmFsIG9wZXJhdG9yIGRlbGV0ZS4gQ2FsbGluZyB0aGUgZGVzdHJ1Y3RvciBpcyB0YWtlbgorICAvLyBjYXJlIG9mIGZvciB1cy4gVGhpcyBtYWtlcyBEeW5hbWljTWVzc2FnZSBjb21wYXRpYmxlIHdpdGggLWZzaXplZC1kZWxldGUuCisgIC8vIEl0IGRvZXNuJ3Qgd29yayBmb3IgTVNWQyB0aG91Z2guCisjaWZuZGVmIF9NU0NfVkVSCisgIHN0YXRpYyB2b2lkIG9wZXJhdG9yIGRlbGV0ZSh2b2lkKiBwdHIpIHsKKyAgICA6Om9wZXJhdG9yIGRlbGV0ZShwdHIpOworICB9CisjZW5kaWYgIC8vICFfTVNDX1ZFUgorCiAgcHJpdmF0ZToKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKER5bmFtaWNNZXNzYWdlKTsKKyAgRHluYW1pY01lc3NhZ2UoY29uc3QgVHlwZUluZm8qIHR5cGVfaW5mbywgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpOworICB2b2lkIFNoYXJlZEN0b3IoKTsKIAogICBpbmxpbmUgYm9vbCBpc19wcm90b3R5cGUoKSBjb25zdCB7CiAgICAgcmV0dXJuIHR5cGVfaW5mb18tPnByb3RvdHlwZSA9PSB0aGlzIHx8CkBAIC0yMTQsNyArMjk4LDYgQEAKICAgfQogCiAgIGNvbnN0IFR5cGVJbmZvKiB0eXBlX2luZm9fOwotCiAgIC8vIFRPRE8oa2VudG9uKTogIE1ha2UgdGhpcyBhbiBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KICAgbXV0YWJsZSBpbnQgY2FjaGVkX2J5dGVfc2l6ZV87CiB9OwpAQCAtMjIyLDYgKzMwNSwxNyBAQAogRHluYW1pY01lc3NhZ2U6OkR5bmFtaWNNZXNzYWdlKGNvbnN0IFR5cGVJbmZvKiB0eXBlX2luZm8pCiAgIDogdHlwZV9pbmZvXyh0eXBlX2luZm8pLAogICAgIGNhY2hlZF9ieXRlX3NpemVfKDApIHsKKyAgU2hhcmVkQ3RvcigpOworfQorCitEeW5hbWljTWVzc2FnZTo6RHluYW1pY01lc3NhZ2UoY29uc3QgVHlwZUluZm8qIHR5cGVfaW5mbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkKKyAgOiB0eXBlX2luZm9fKHR5cGVfaW5mbyksCisgICAgY2FjaGVkX2J5dGVfc2l6ZV8oMCkgeworICBTaGFyZWRDdG9yKCk7Cit9CisKK3ZvaWQgRHluYW1pY01lc3NhZ2U6OlNoYXJlZEN0b3IoKSB7CiAgIC8vIFdlIG5lZWQgdG8gY2FsbCBjb25zdHJ1Y3RvcnMgZm9yIHZhcmlvdXMgZmllbGRzIG1hbnVhbGx5IGFuZCBzZXQKICAgLy8gZGVmYXVsdCB2YWx1ZXMgd2hlcmUgYXBwcm9wcmlhdGUuICBXZSB1c2UgcGxhY2VtZW50IG5ldyB0byBjYWxsCiAgIC8vIGNvbnN0cnVjdG9ycy4gIElmIHlvdSBoYXZlbid0IGhlYXJkIG9mIHBsYWNlbWVudCBuZXcsIEkgc3VnZ2VzdCBHb29nbGluZwpAQCAtMjMzLDYgKzMyNywxNyBAQAogCiAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSB0eXBlX2luZm9fLT50eXBlOwogCisgIC8vIEluaXRpYWxpemUgb25lb2YgY2FzZXMuCisgIGZvciAoaW50IGkgPSAwIDsgaSA8IGRlc2NyaXB0b3ItPm9uZW9mX2RlY2xfY291bnQoKTsgKytpKSB7CisgICAgbmV3KE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5vbmVvZl9jYXNlX29mZnNldCArIHNpemVvZih1aW50MzIpICogaSkpCisgICAgICAgIHVpbnQzMigwKTsKKyAgfQorCisgIGlmICh0eXBlX2luZm9fLT5pc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCAhPSAtMSkgeworICAgICpyZWludGVycHJldF9jYXN0PGJvb2wqPigKKyAgICAgICAgT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPmlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0KSkgPSBmYWxzZTsKKyAgfQorCiAgIG5ldyhPZmZzZXRUb1BvaW50ZXIodHlwZV9pbmZvXy0+dW5rbm93bl9maWVsZHNfb2Zmc2V0KSkgVW5rbm93bkZpZWxkU2V0OwogCiAgIGlmICh0eXBlX2luZm9fLT5leHRlbnNpb25zX29mZnNldCAhPSAtMSkgewpAQCAtMjQyLDYgKzM0Nyw5IEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOwogICAgIHZvaWQqIGZpZWxkX3B0ciA9IE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5vZmZzZXRzW2ldKTsKKyAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgY29udGludWU7CisgICAgfQogICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKICNkZWZpbmUgSEFORExFX1RZUEUoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yNzQsMTUgKzM4MiwxNyBAQAogICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgogICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CiAgICAgICAgICAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF92YWx1ZTsKICAgICAgICAgICAgICAgaWYgKGlzX3Byb3RvdHlwZSgpKSB7Ci0gICAgICAgICAgICAgICAgbmV3KGZpZWxkX3B0cikgY29uc3Qgc3RyaW5nKigmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICAgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUgPSAmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCk7CiAgICAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgc3RyaW5nKiBkZWZhdWx0X3ZhbHVlID0KLSAgICAgICAgICAgICAgICAgICpyZWludGVycHJldF9jYXN0PHN0cmluZyogY29uc3QqPigKKyAgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlID0KKyAgICAgICAgICAgICAgICAgICYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBBcmVuYVN0cmluZ1B0cio+KAogICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5wcm90b3R5cGUtPk9mZnNldFRvUG9pbnRlcigKLSAgICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5vZmZzZXRzW2ldKSk7Ci0gICAgICAgICAgICAgICAgbmV3KGZpZWxkX3B0cikgc3RyaW5nKihkZWZhdWx0X3ZhbHVlKTsKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5vZmZzZXRzW2ldKSktPkdldChOVUxMKSk7CiAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgQXJlbmFTdHJpbmdQdHIqIGFzcCA9IG5ldyhmaWVsZF9wdHIpIEFyZW5hU3RyaW5nUHRyKCk7CisgICAgICAgICAgICAgIGFzcC0+VW5zYWZlU2V0RGVmYXVsdChkZWZhdWx0X3ZhbHVlKTsKICAgICAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgICAgIG5ldyhmaWVsZF9wdHIpIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigpOwogICAgICAgICAgICAgfQpAQCAtMjk0LDcgKzQwNCwxMiBAQAogICAgICAgICBpZiAoIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CiAgICAgICAgICAgbmV3KGZpZWxkX3B0cikgTWVzc2FnZSooTlVMTCk7CiAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgbmV3KGZpZWxkX3B0cikgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPigpOworICAgICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICAgICAgICBuZXcgKGZpZWxkX3B0cikgRHluYW1pY01hcEZpZWxkKAorICAgICAgICAgICAgICAgIHR5cGVfaW5mb18tPmZhY3RvcnktPkdldFByb3RvdHlwZU5vTG9jayhmaWVsZC0+bWVzc2FnZV90eXBlKCkpKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbmV3IChmaWVsZF9wdHIpIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oKTsKKyAgICAgICAgICB9CiAgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CkBAIC0zMTQsMTMgKzQyOSw0NCBAQAogICB9CiAKICAgLy8gV2UgbmVlZCB0byBtYW51YWxseSBydW4gdGhlIGRlc3RydWN0b3JzIGZvciByZXBlYXRlZCBmaWVsZHMgYW5kIHN0cmluZ3MsCi0gIC8vIGp1c3QgYXMgd2UgcmFuIHRoZWlyIGNvbnN0cnVjdG9ycyBpbiB0aGUgdGhlIER5bmFtaWNNZXNzYWdlIGNvbnN0cnVjdG9yLgorICAvLyBqdXN0IGFzIHdlIHJhbiB0aGVpciBjb25zdHJ1Y3RvcnMgaW4gdGhlIER5bmFtaWNNZXNzYWdlIGNvbnN0cnVjdG9yLgorICAvLyBXZSBhbHNvIG5lZWQgdG8gbWFudWFsbHkgZGVsZXRlIG9uZW9mIGZpZWxkcyBpZiBpdCBpcyBzZXQgYW5kIGlzIHN0cmluZworICAvLyBvciBtZXNzYWdlLgogICAvLyBBZGRpdGlvbmFsbHksIGlmIGFueSBzaW5ndWxhciBlbWJlZGRlZCBtZXNzYWdlcyBoYXZlIGJlZW4gYWxsb2NhdGVkLCB3ZQogICAvLyBuZWVkIHRvIGRlbGV0ZSB0aGVtLCBVTkxFU1Mgd2UgYXJlIHRoZSBwcm90b3R5cGUgbWVzc2FnZSBvZiB0aGlzIHR5cGUsCiAgIC8vIGluIHdoaWNoIGNhc2UgYW55IGVtYmVkZGVkIG1lc3NhZ2VzIGFyZSBvdGhlciBwcm90b3R5cGVzIGFuZCBzaG91bGRuJ3QKICAgLy8gYmUgdG91Y2hlZC4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvci0+ZmllbGQoaSk7CisgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIHZvaWQqIGZpZWxkX3B0ciA9IE9mZnNldFRvUG9pbnRlcigKKyAgICAgICAgICB0eXBlX2luZm9fLT5vbmVvZl9jYXNlX29mZnNldAorICAgICAgICAgICsgc2l6ZW9mKHVpbnQzMikgKiBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpKTsKKyAgICAgIGlmICgqKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyKj4oZmllbGRfcHRyKSkgPT0KKyAgICAgICAgICBmaWVsZC0+bnVtYmVyKCkpIHsKKyAgICAgICAgZmllbGRfcHRyID0gT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPm9mZnNldHNbCisgICAgICAgICAgICBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpICsgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKV0pOworICAgICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORykgeworICAgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlID0KKyAgICAgICAgICAgICAgICAgICYocmVpbnRlcnByZXRfY2FzdDxjb25zdCBBcmVuYVN0cmluZ1B0cio+KAorICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvXy0+ZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSkKKyAgICAgICAgICAgICAgICAgICAgICArIHR5cGVfaW5mb18tPm9mZnNldHNbaV0pCisgICAgICAgICAgICAgICAgICAgIC0+R2V0KE5VTEwpKTsKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcmVuYVN0cmluZ1B0cio+KGZpZWxkX3B0ciktPkRlc3Ryb3koCisgICAgICAgICAgICAgICAgICBkZWZhdWx0X3ZhbHVlLCBOVUxMKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAgICAgICBkZWxldGUgKnJlaW50ZXJwcmV0X2Nhc3Q8TWVzc2FnZSoqPihmaWVsZF9wdHIpOworICAgICAgICB9CisgICAgICB9CisgICAgICBjb250aW51ZTsKKyAgICB9CiAgICAgdm9pZCogZmllbGRfcHRyID0gT2Zmc2V0VG9Qb2ludGVyKHR5cGVfaW5mb18tPm9mZnNldHNbaV0pOwogCiAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CkBAIC0zNTIsOCArNDk4LDEyIEBACiAgICAgICAgICAgYnJlYWs7CiAKICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICByZWludGVycHJldF9jYXN0PFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qPihmaWVsZF9wdHIpCi0gICAgICAgICAgICAgIC0+flJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4oKTsKKyAgICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxEeW5hbWljTWFwRmllbGQqPihmaWVsZF9wdHIpLT5+RHluYW1pY01hcEZpZWxkKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPio+KGZpZWxkX3B0cikKKyAgICAgICAgICAgICAgICAtPn5SZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KCk7CisgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogCkBAIC0zNjEsMTggKzUxMSwyMSBAQAogICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCiAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6IHsKLSAgICAgICAgICBzdHJpbmcqIHB0ciA9ICpyZWludGVycHJldF9jYXN0PHN0cmluZyoqPihmaWVsZF9wdHIpOwotICAgICAgICAgIGlmIChwdHIgIT0gJmZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKSB7Ci0gICAgICAgICAgICBkZWxldGUgcHRyOwotICAgICAgICAgIH0KKyAgICAgICAgICBjb25zdCA6OnN0ZDo6c3RyaW5nKiBkZWZhdWx0X3ZhbHVlID0KKyAgICAgICAgICAgICAgJihyZWludGVycHJldF9jYXN0PGNvbnN0IEFyZW5hU3RyaW5nUHRyKj4oCisgICAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5wcm90b3R5cGUtPk9mZnNldFRvUG9pbnRlcigKKyAgICAgICAgICAgICAgICAgICAgICB0eXBlX2luZm9fLT5vZmZzZXRzW2ldKSktPkdldChOVUxMKSk7CisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcmVuYVN0cmluZ1B0cio+KGZpZWxkX3B0ciktPkRlc3Ryb3koCisgICAgICAgICAgICAgIGRlZmF1bHRfdmFsdWUsIE5VTEwpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAgICAgICB9Ci0gICAgfSBlbHNlIGlmICgoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpICYmCi0gICAgICAgICAgICAgICAhaXNfcHJvdG90eXBlKCkpIHsKLSAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UgPSAqcmVpbnRlcnByZXRfY2FzdDxNZXNzYWdlKio+KGZpZWxkX3B0cik7Ci0gICAgICBpZiAobWVzc2FnZSAhPSBOVUxMKSB7Ci0gICAgICAgIGRlbGV0ZSBtZXNzYWdlOworICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKKyAgICAgIGlmICghaXNfcHJvdG90eXBlKCkpIHsKKyAgICAgICAgTWVzc2FnZSogbWVzc2FnZSA9ICpyZWludGVycHJldF9jYXN0PE1lc3NhZ2UqKj4oZmllbGRfcHRyKTsKKyAgICAgICAgaWYgKG1lc3NhZ2UgIT0gTlVMTCkgeworICAgICAgICAgIGRlbGV0ZSBtZXNzYWdlOworICAgICAgICB9CiAgICAgICB9CiAgICAgfQogICB9CkBAIC0zODksNiArNTQyLDEwIEBACiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3ItPmZpZWxkKGkpOwogICAgIHZvaWQqIGZpZWxkX3B0ciA9IE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5vZmZzZXRzW2ldKTsKKyAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgZmllbGRfcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KAorICAgICAgICAgIHR5cGVfaW5mb18tPmRlZmF1bHRfb25lb2ZfaW5zdGFuY2UpICsgdHlwZV9pbmZvXy0+b2Zmc2V0c1tpXTsKKyAgICB9CiAKICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UgJiYKICAgICAgICAgIWZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CkBAIC00MDAsMTQgKzU1NywzMiBAQAogICAgICAgICBmYWN0b3J5LT5HZXRQcm90b3R5cGVOb0xvY2soZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKICAgICB9CiAgIH0KKworICAvLyBTZXQgYXMgdGhlIGRlZmF1bHQgaW5zdGFuY2UgLS0gdGhpcyBhZmZlY3RzIGZpZWxkLXByZXNlbmNlIHNlbWFudGljcyBmb3IKKyAgLy8gcHJvdG8zLgorICBpZiAodHlwZV9pbmZvXy0+aXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQgIT0gLTEpIHsKKyAgICB2b2lkKiBpc19kZWZhdWx0X2luc3RhbmNlX3B0ciA9CisgICAgICAgIE9mZnNldFRvUG9pbnRlcih0eXBlX2luZm9fLT5pc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCk7CisgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8Ym9vbCo+KGlzX2RlZmF1bHRfaW5zdGFuY2VfcHRyKSA9IHRydWU7CisgIH0KIH0KIAogTWVzc2FnZSogRHluYW1pY01lc3NhZ2U6Ok5ldygpIGNvbnN0IHsKLSAgdm9pZCogbmV3X2Jhc2UgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4ob3BlcmF0b3IgbmV3KHR5cGVfaW5mb18tPnNpemUpKTsKKyAgdm9pZCogbmV3X2Jhc2UgPSBvcGVyYXRvciBuZXcodHlwZV9pbmZvXy0+c2l6ZSk7CiAgIG1lbXNldChuZXdfYmFzZSwgMCwgdHlwZV9pbmZvXy0+c2l6ZSk7CiAgIHJldHVybiBuZXcobmV3X2Jhc2UpIER5bmFtaWNNZXNzYWdlKHR5cGVfaW5mb18pOwogfQogCitNZXNzYWdlKiBEeW5hbWljTWVzc2FnZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgTWVzc2FnZSogbWVzc2FnZSA9IE5ldygpOworICAgIGFyZW5hLT5Pd24obWVzc2FnZSk7CisgICAgcmV0dXJuIG1lc3NhZ2U7CisgIH0gZWxzZSB7CisgICAgcmV0dXJuIE5ldygpOworICB9Cit9CisKIGludCBEeW5hbWljTWVzc2FnZTo6R2V0Q2FjaGVkU2l6ZSgpIGNvbnN0IHsKICAgcmV0dXJuIGNhY2hlZF9ieXRlX3NpemVfOwogfQpAQCAtNDE2LDcgKzU5MSw5IEBACiAgIC8vIFRoaXMgaXMgdGhlb3JldGljYWxseSBub3QgdGhyZWFkLWNvbXBhdGlibGUsIGJ1dCBpbiBwcmFjdGljZSBpdCB3b3JrcwogICAvLyBiZWNhdXNlIGlmIG11bHRpcGxlIHRocmVhZHMgd3JpdGUgdGhpcyBzaW11bHRhbmVvdXNseSwgdGhleSB3aWxsIGJlCiAgIC8vIHdyaXRpbmcgdGhlIGV4YWN0IHNhbWUgdmFsdWUuCisgIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCk7CiAgIGNhY2hlZF9ieXRlX3NpemVfID0gc2l6ZTsKKyAgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCk7CiB9CiAKIE1ldGFkYXRhIER5bmFtaWNNZXNzYWdlOjpHZXRNZXRhZGF0YSgpIGNvbnN0IHsKQEAgLTQ0Niw2ICs2MjMsOSBAQAogRHluYW1pY01lc3NhZ2VGYWN0b3J5Ojp+RHluYW1pY01lc3NhZ2VGYWN0b3J5KCkgewogICBmb3IgKFByb3RvdHlwZU1hcDo6TWFwOjppdGVyYXRvciBpdGVyID0gcHJvdG90eXBlc18tPm1hcF8uYmVnaW4oKTsKICAgICAgICBpdGVyICE9IHByb3RvdHlwZXNfLT5tYXBfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBEZWxldGVEZWZhdWx0T25lb2ZJbnN0YW5jZShpdGVyLT5zZWNvbmQtPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlci0+c2Vjb25kLT5vZmZzZXRzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0ZXItPnNlY29uZC0+ZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSk7CiAgICAgZGVsZXRlIGl0ZXItPnNlY29uZDsKICAgfQogfQpAQCAtNDY1LDcgKzY0NSw3IEBACiAgIGNvbnN0IER5bmFtaWNNZXNzYWdlOjpUeXBlSW5mbyoqIHRhcmdldCA9ICZwcm90b3R5cGVzXy0+bWFwX1t0eXBlXTsKICAgaWYgKCp0YXJnZXQgIT0gTlVMTCkgewogICAgIC8vIEFscmVhZHkgZXhpc3RzLgotICAgIHJldHVybiAoKnRhcmdldCktPnByb3RvdHlwZS5nZXQoKTsKKyAgICByZXR1cm4gKCp0YXJnZXQpLT5wcm90b3R5cGU7CiAgIH0KIAogICBEeW5hbWljTWVzc2FnZTo6VHlwZUluZm8qIHR5cGVfaW5mbyA9IG5ldyBEeW5hbWljTWVzc2FnZTo6VHlwZUluZm87CkBAIC00ODQsNyArNjY0LDcgQEAKICAgLy8gICBvciBub3QgdGhhdCBmaWVsZCBpcyBzZXQuCiAKICAgLy8gQ29tcHV0ZSBzaXplIGFuZCBvZmZzZXRzLgotICBpbnQqIG9mZnNldHMgPSBuZXcgaW50W3R5cGUtPmZpZWxkX2NvdW50KCldOworICBpbnQqIG9mZnNldHMgPSBuZXcgaW50W3R5cGUtPmZpZWxkX2NvdW50KCkgKyB0eXBlLT5vbmVvZl9kZWNsX2NvdW50KCldOwogICB0eXBlX2luZm8tPm9mZnNldHMucmVzZXQob2Zmc2V0cyk7CiAKICAgLy8gRGVjaWRlIGFsbCBmaWVsZCBvZmZzZXRzIGJ5IHBhY2tpbmcgaW4gb3JkZXIuCkBAIC00OTQsMTEgKzY3NCwzMSBAQAogICBzaXplID0gQWxpZ25PZmZzZXQoc2l6ZSk7CiAKICAgLy8gTmV4dCB0aGUgaGFzX2JpdHMsIHdoaWNoIGlzIGFuIGFycmF5IG9mIHVpbnQzMnMuCi0gIHR5cGVfaW5mby0+aGFzX2JpdHNfb2Zmc2V0ID0gc2l6ZTsKLSAgaW50IGhhc19iaXRzX2FycmF5X3NpemUgPQotICAgIERpdmlkZVJvdW5kaW5nVXAodHlwZS0+ZmllbGRfY291bnQoKSwgYml0c2l6ZW9mKHVpbnQzMikpOwotICBzaXplICs9IGhhc19iaXRzX2FycmF5X3NpemUgKiBzaXplb2YodWludDMyKTsKLSAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOworICBpZiAodHlwZS0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgIHR5cGVfaW5mby0+aGFzX2JpdHNfb2Zmc2V0ID0gLTE7CisgIH0gZWxzZSB7CisgICAgdHlwZV9pbmZvLT5oYXNfYml0c19vZmZzZXQgPSBzaXplOworICAgIGludCBoYXNfYml0c19hcnJheV9zaXplID0KKyAgICAgIERpdmlkZVJvdW5kaW5nVXAodHlwZS0+ZmllbGRfY291bnQoKSwgYml0c2l6ZW9mKHVpbnQzMikpOworICAgIHNpemUgKz0gaGFzX2JpdHNfYXJyYXlfc2l6ZSAqIHNpemVvZih1aW50MzIpOworICAgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKyAgfQorCisgIC8vIFRoZSBpc19kZWZhdWx0X2luc3RhbmNlIG1lbWJlciwgaWYgYW55LgorICBpZiAodHlwZS0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgIHR5cGVfaW5mby0+aXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQgPSBzaXplOworICAgIHNpemUgKz0gc2l6ZW9mKGJvb2wpOworICAgIHNpemUgPSBBbGlnbk9mZnNldChzaXplKTsKKyAgfSBlbHNlIHsKKyAgICB0eXBlX2luZm8tPmlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0ID0gLTE7CisgIH0KKworICAvLyBUaGUgb25lb2ZfY2FzZSwgaWYgYW55LiBJdCBpcyBhbiBhcnJheSBvZiB1aW50MzJzLgorICBpZiAodHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpID4gMCkgeworICAgIHR5cGVfaW5mby0+b25lb2ZfY2FzZV9vZmZzZXQgPSBzaXplOworICAgIHNpemUgKz0gdHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpICogc2l6ZW9mKHVpbnQzMik7CisgICAgc2l6ZSA9IEFsaWduT2Zmc2V0KHNpemUpOworICB9CiAKICAgLy8gVGhlIEV4dGVuc2lvblNldCwgaWYgYW55LgogICBpZiAodHlwZS0+ZXh0ZW5zaW9uX3JhbmdlX2NvdW50KCkgPiAwKSB7CkBAIC01MTMsMTAgKzcxMywyMCBAQAogICAvLyBBbGwgdGhlIGZpZWxkcy4KICAgZm9yIChpbnQgaSA9IDA7IGkgPCB0eXBlLT5maWVsZF9jb3VudCgpOyBpKyspIHsKICAgICAvLyBNYWtlIHN1cmUgZmllbGQgaXMgYWxpZ25lZCB0byBhdm9pZCBidXMgZXJyb3JzLgotICAgIGludCBmaWVsZF9zaXplID0gRmllbGRTcGFjZVVzZWQodHlwZS0+ZmllbGQoaSkpOwotICAgIHNpemUgPSBBbGlnblRvKHNpemUsIG1pbihrU2FmZUFsaWdubWVudCwgZmllbGRfc2l6ZSkpOwotICAgIG9mZnNldHNbaV0gPSBzaXplOwotICAgIHNpemUgKz0gZmllbGRfc2l6ZTsKKyAgICAvLyBPbmVvZiBmaWVsZHMgZG8gbm90IHVzZSBhbnkgc3BhY2UuCisgICAgaWYgKCF0eXBlLT5maWVsZChpKS0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBpbnQgZmllbGRfc2l6ZSA9IEZpZWxkU3BhY2VVc2VkKHR5cGUtPmZpZWxkKGkpKTsKKyAgICAgIHNpemUgPSBBbGlnblRvKHNpemUsIHN0ZDo6bWluKGtTYWZlQWxpZ25tZW50LCBmaWVsZF9zaXplKSk7CisgICAgICBvZmZzZXRzW2ldID0gc2l6ZTsKKyAgICAgIHNpemUgKz0gZmllbGRfc2l6ZTsKKyAgICB9CisgIH0KKworICAvLyBUaGUgb25lb2ZzLgorICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgc2l6ZSA9IEFsaWduVG8oc2l6ZSwga1NhZmVBbGlnbm1lbnQpOworICAgIG9mZnNldHNbdHlwZS0+ZmllbGRfY291bnQoKSArIGldID0gc2l6ZTsKKyAgICBzaXplICs9IGtNYXhPbmVvZlVuaW9uU2l6ZTsKICAgfQogCiAgIC8vIEFkZCB0aGUgVW5rbm93bkZpZWxkU2V0IHRvIHRoZSBlbmQuCkBAIC01MzIsMjcgKzc0MiwxMzMgQEAKICAgLy8gQWxsb2NhdGUgdGhlIHByb3RvdHlwZS4KICAgdm9pZCogYmFzZSA9IG9wZXJhdG9yIG5ldyhzaXplKTsKICAgbWVtc2V0KGJhc2UsIDAsIHNpemUpOworICAvLyBUaGUgcHJvdG90eXBlIGluIHR5cGVfaW5mbyBoYXMgdG8gYmUgc2V0IGJlZm9yZSBjcmVhdGluZyB0aGUgcHJvdG90eXBlCisgIC8vIGluc3RhbmNlIG9uIG1lbW9yeS4gZS5nLiwgbWVzc2FnZSBGb28geyBtYXA8aW50MzIsIEZvbz4gYSA9IDE7IH0uIFdoZW4KKyAgLy8gY3JlYXRpbmcgcHJvdG90eXBlIGZvciBGb28sIHByb3RvdHlwZSBvZiB0aGUgbWFwIGVudHJ5IHdpbGwgYWxzbyBiZQorICAvLyBjcmVhdGVkLCB3aGljaCBuZWVkcyB0aGUgYWRkcmVzcyBvZiB0aGUgcHJvdG90eXBlIG9mIEZvbyAodGhlIHZhbHVlIGluCisgIC8vIG1hcCkuIFRvIGJyZWFrIHRoZSBjeWNsaWMgZGVwZW5kZW5jeSwgd2UgaGF2ZSB0byBhc3NnaW4gdGhlIGFkZHJlc3Mgb2YKKyAgLy8gcHJvdG90eXBlIGludG8gdHlwZV9pbmZvIGZpcnN0LgorICB0eXBlX2luZm8tPnByb3RvdHlwZSA9IHN0YXRpY19jYXN0PER5bmFtaWNNZXNzYWdlKj4oYmFzZSk7CiAgIER5bmFtaWNNZXNzYWdlKiBwcm90b3R5cGUgPSBuZXcoYmFzZSkgRHluYW1pY01lc3NhZ2UodHlwZV9pbmZvKTsKLSAgdHlwZV9pbmZvLT5wcm90b3R5cGUucmVzZXQocHJvdG90eXBlKTsKIAogICAvLyBDb25zdHJ1Y3QgdGhlIHJlZmxlY3Rpb24gb2JqZWN0LgotICB0eXBlX2luZm8tPnJlZmxlY3Rpb24ucmVzZXQoCi0gICAgbmV3IEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAotICAgICAgdHlwZV9pbmZvLT50eXBlLAotICAgICAgdHlwZV9pbmZvLT5wcm90b3R5cGUuZ2V0KCksCi0gICAgICB0eXBlX2luZm8tPm9mZnNldHMuZ2V0KCksCi0gICAgICB0eXBlX2luZm8tPmhhc19iaXRzX29mZnNldCwKLSAgICAgIHR5cGVfaW5mby0+dW5rbm93bl9maWVsZHNfb2Zmc2V0LAotICAgICAgdHlwZV9pbmZvLT5leHRlbnNpb25zX29mZnNldCwKLSAgICAgIHR5cGVfaW5mby0+cG9vbCwKLSAgICAgIHRoaXMsCi0gICAgICB0eXBlX2luZm8tPnNpemUpKTsKLQorICBpZiAodHlwZS0+b25lb2ZfZGVjbF9jb3VudCgpID4gMCkgeworICAgIC8vIENvbXB1dGUgdGhlIHNpemUgb2YgZGVmYXVsdCBvbmVvZiBpbnN0YW5jZSBhbmQgb2Zmc2V0cyBvZiBkZWZhdWx0CisgICAgLy8gb25lb2YgZmllbGRzLgorICAgIGludCBvbmVvZl9zaXplID0gMDsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgICBmb3IgKGludCBqID0gMDsgaiA8IHR5cGUtPm9uZW9mX2RlY2woaSktPmZpZWxkX2NvdW50KCk7IGorKykgeworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gdHlwZS0+b25lb2ZfZGVjbChpKS0+ZmllbGQoaik7CisgICAgICAgIGludCBmaWVsZF9zaXplID0gT25lb2ZGaWVsZFNwYWNlVXNlZChmaWVsZCk7CisgICAgICAgIG9uZW9mX3NpemUgPSBBbGlnblRvKG9uZW9mX3NpemUsIHN0ZDo6bWluKGtTYWZlQWxpZ25tZW50LCBmaWVsZF9zaXplKSk7CisgICAgICAgIG9mZnNldHNbZmllbGQtPmluZGV4KCldID0gb25lb2Zfc2l6ZTsKKyAgICAgICAgb25lb2Zfc2l6ZSArPSBmaWVsZF9zaXplOworICAgICAgfQorICAgIH0KKyAgICAvLyBDb25zdHJ1Y3QgZGVmYXVsdCBvbmVvZiBpbnN0YW5jZS4KKyAgICB0eXBlX2luZm8tPmRlZmF1bHRfb25lb2ZfaW5zdGFuY2UgPSA6Om9wZXJhdG9yIG5ldyhvbmVvZl9zaXplKTsKKyAgICBDb25zdHJ1Y3REZWZhdWx0T25lb2ZJbnN0YW5jZSh0eXBlX2luZm8tPnR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZV9pbmZvLT5vZmZzZXRzLmdldCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfaW5mby0+ZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSk7CisgICAgdHlwZV9pbmZvLT5yZWZsZWN0aW9uLnJlc2V0KAorICAgICAgICBuZXcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICAgICAgICB0eXBlX2luZm8tPnR5cGUsCisgICAgICAgICAgICB0eXBlX2luZm8tPnByb3RvdHlwZSwKKyAgICAgICAgICAgIHR5cGVfaW5mby0+b2Zmc2V0cy5nZXQoKSwKKyAgICAgICAgICAgIHR5cGVfaW5mby0+aGFzX2JpdHNfb2Zmc2V0LAorICAgICAgICAgICAgdHlwZV9pbmZvLT51bmtub3duX2ZpZWxkc19vZmZzZXQsCisgICAgICAgICAgICB0eXBlX2luZm8tPmV4dGVuc2lvbnNfb2Zmc2V0LAorICAgICAgICAgICAgdHlwZV9pbmZvLT5kZWZhdWx0X29uZW9mX2luc3RhbmNlLAorICAgICAgICAgICAgdHlwZV9pbmZvLT5vbmVvZl9jYXNlX29mZnNldCwKKyAgICAgICAgICAgIHR5cGVfaW5mby0+cG9vbCwKKyAgICAgICAgICAgIHRoaXMsCisgICAgICAgICAgICB0eXBlX2luZm8tPnNpemUsCisgICAgICAgICAgICAtMSAvKiBhcmVuYV9vZmZzZXQgKi8sCisgICAgICAgICAgICB0eXBlX2luZm8tPmlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0KSk7CisgIH0gZWxzZSB7CisgICAgdHlwZV9pbmZvLT5yZWZsZWN0aW9uLnJlc2V0KAorICAgICAgICBuZXcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgICAgICAgICB0eXBlX2luZm8tPnR5cGUsCisgICAgICAgICAgICB0eXBlX2luZm8tPnByb3RvdHlwZSwKKyAgICAgICAgICAgIHR5cGVfaW5mby0+b2Zmc2V0cy5nZXQoKSwKKyAgICAgICAgICAgIHR5cGVfaW5mby0+aGFzX2JpdHNfb2Zmc2V0LAorICAgICAgICAgICAgdHlwZV9pbmZvLT51bmtub3duX2ZpZWxkc19vZmZzZXQsCisgICAgICAgICAgICB0eXBlX2luZm8tPmV4dGVuc2lvbnNfb2Zmc2V0LAorICAgICAgICAgICAgdHlwZV9pbmZvLT5wb29sLAorICAgICAgICAgICAgdGhpcywKKyAgICAgICAgICAgIHR5cGVfaW5mby0+c2l6ZSwKKyAgICAgICAgICAgIC0xIC8qIGFyZW5hX29mZnNldCAqLywKKyAgICAgICAgICAgIHR5cGVfaW5mby0+aXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpKTsKKyAgfQogICAvLyBDcm9zcyBsaW5rIHByb3RvdHlwZXMuCiAgIHByb3RvdHlwZS0+Q3Jvc3NMaW5rUHJvdG90eXBlcygpOwogCiAgIHJldHVybiBwcm90b3R5cGU7CiB9CiAKK3ZvaWQgRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpDb25zdHJ1Y3REZWZhdWx0T25lb2ZJbnN0YW5jZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlLAorICAgIGNvbnN0IGludCBvZmZzZXRzW10sCisgICAgdm9pZCogZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgIHZvaWQqIGZpZWxkX3B0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPigKKyAgICAgICAgICBkZWZhdWx0X29uZW9mX2luc3RhbmNlKSArIG9mZnNldHNbZmllbGQtPmluZGV4KCldOworICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIG5ldyhmaWVsZF9wdHIpIFRZUEUoZmllbGQtPmRlZmF1bHRfdmFsdWVfIyNUWVBFKCkpOyAgICAgICAgICAgXAorICAgICAgICAgIGJyZWFrOworCisgICAgICAgIEhBTkRMRV9UWVBFKElOVDMyICwgaW50MzIgKTsKKyAgICAgICAgSEFORExFX1RZUEUoSU5UNjQgLCBpbnQ2NCApOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMik7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoRE9VQkxFLCBkb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRShGTE9BVCAsIGZsb2F0ICk7CisgICAgICAgIEhBTkRMRV9UWVBFKEJPT0wgICwgYm9vbCAgKTsKKyN1bmRlZiBIQU5ETEVfVFlQRQorCisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0VOVU06CisgICAgICAgICAgbmV3KGZpZWxkX3B0cikgaW50KGZpZWxkLT5kZWZhdWx0X3ZhbHVlX2VudW0oKS0+bnVtYmVyKCkpOworICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgICBBcmVuYVN0cmluZ1B0ciogYXNwID0gbmV3IChmaWVsZF9wdHIpIEFyZW5hU3RyaW5nUHRyKCk7CisgICAgICAgICAgICAgIGFzcC0+VW5zYWZlU2V0RGVmYXVsdCgmZmllbGQtPmRlZmF1bHRfdmFsdWVfc3RyaW5nKCkpOworICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAgIG5ldyhmaWVsZF9wdHIpIE1lc3NhZ2UqKE5VTEwpOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRHluYW1pY01lc3NhZ2VGYWN0b3J5OjpEZWxldGVEZWZhdWx0T25lb2ZJbnN0YW5jZSgKKyAgICBjb25zdCBEZXNjcmlwdG9yKiB0eXBlLAorICAgIGNvbnN0IGludCBvZmZzZXRzW10sCisgICAgdm9pZCogZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHR5cGUtPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgZm9yIChpbnQgaiA9IDA7IGogPCB0eXBlLT5vbmVvZl9kZWNsKGkpLT5maWVsZF9jb3VudCgpOyBqKyspIHsKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSB0eXBlLT5vbmVvZl9kZWNsKGkpLT5maWVsZChqKTsKKyAgICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HKSB7CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKwogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCmluZGV4IDgxZGQyYzYuLmY3NGNkN2QgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zOCw4ICszOCwxNCBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfRFlOQU1JQ19NRVNTQUdFX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfRFlOQU1JQ19NRVNTQUdFX0hfXwogCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4Lmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTY4LDcgKzc0LDcgQEAKIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBEeW5hbWljTWVzc2FnZUZhY3RvcnkgOiBwdWJsaWMgTWVzc2FnZUZhY3RvcnkgewogIHB1YmxpYzoKICAgLy8gQ29uc3RydWN0IGEgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHRoYXQgd2lsbCBzZWFyY2ggZm9yIGV4dGVuc2lvbnMgaW4KLSAgLy8gdGhlIERlc2NyaXB0b3JQb29sIGluIHdoaWNoIHRoZSBleGVuZGVlIGlzIGRlZmluZWQuCisgIC8vIHRoZSBEZXNjcmlwdG9yUG9vbCBpbiB3aGljaCB0aGUgZXh0ZW5kZWUgaXMgZGVmaW5lZC4KICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5KCk7CiAKICAgLy8gQ29uc3RydWN0IGEgRHluYW1pY01lc3NhZ2VGYWN0b3J5IHRoYXQgd2lsbCBzZWFyY2ggZm9yIGV4dGVuc2lvbnMgaW4KQEAgLTEwMiw3ICsxMDgsNyBAQAogICAvLyBvYmplY3QuICBUaGUgcmV0dXJuZWQgb2JqZWN0IHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGZhY3RvcnkgYW5kIHdpbGwKICAgLy8gYmUgZGVzdHJveWVkIHdoZW4gdGhlIGZhY3RvcnkgaXMgZGVzdHJveWVkLiAgQWxzbywgYW55IG9iamVjdHMgY3JlYXRlZAogICAvLyBieSBjYWxsaW5nIHRoZSBwcm90b3R5cGUncyBOZXcoKSBtZXRob2Qgc2hhcmUgc29tZSBkYXRhIHdpdGggdGhlCi0gIC8vIHByb3RvdHlwZSwgc28gdGhlc2UgbXVzdCBiZSBkZXN0b3llZCBiZWZvcmUgdGhlIER5bmFtaWNNZXNzYWdlRmFjdG9yeQorICAvLyBwcm90b3R5cGUsIHNvIHRoZXNlIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSB0aGUgRHluYW1pY01lc3NhZ2VGYWN0b3J5CiAgIC8vIGlzIGRlc3Ryb3llZC4KICAgLy8KICAgLy8gVGhlIGdpdmVuIGRlc2NyaXB0b3IgbXVzdCBvdXRsaXZlIHRoZSByZXR1cm5lZCBtZXNzYWdlLCBhbmQgaGVuY2UgbXVzdApAQCAtMTIxLDEyICsxMjcsMjIgQEAKICAgLy8gcHVibGljIGhlYWRlciAoZm9yIGdvb2QgcmVhc29uKSwgYnV0IGR5bmFtaWNfbWVzc2FnZS5oIGlzLCBhbmQgcHVibGljCiAgIC8vIGhlYWRlcnMgbWF5IG9ubHkgI2luY2x1ZGUgb3RoZXIgcHVibGljIGhlYWRlcnMuCiAgIHN0cnVjdCBQcm90b3R5cGVNYXA7Ci0gIHNjb3BlZF9wdHI8UHJvdG90eXBlTWFwPiBwcm90b3R5cGVzXzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxQcm90b3R5cGVNYXA+IHByb3RvdHlwZXNfOwogICBtdXRhYmxlIE11dGV4IHByb3RvdHlwZXNfbXV0ZXhfOwogCiAgIGZyaWVuZCBjbGFzcyBEeW5hbWljTWVzc2FnZTsKICAgY29uc3QgTWVzc2FnZSogR2V0UHJvdG90eXBlTm9Mb2NrKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUpOwogCisgIC8vIENvbnN0cnVjdCBkZWZhdWx0IG9uZW9mIGluc3RhbmNlIGZvciByZWZsZWN0aW9uIHVzYWdlIGlmIG9uZW9mCisgIC8vIGlzIGRlZmluZWQuCisgIHN0YXRpYyB2b2lkIENvbnN0cnVjdERlZmF1bHRPbmVvZkluc3RhbmNlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2UpOworICAvLyBEZWxldGUgZGVmYXVsdCBvbmVvZiBpbnN0YW5jZS4gQ2FsbGVkIGJ5IH5EeW5hbWljTWVzc2FnZUZhY3RvcnkuCisgIHN0YXRpYyB2b2lkIERlbGV0ZURlZmF1bHRPbmVvZkluc3RhbmNlKGNvbnN0IERlc2NyaXB0b3IqIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2UpOworCiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhEeW5hbWljTWVzc2FnZUZhY3RvcnkpOwogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZHluYW1pY19tZXNzYWdlX3VuaXR0ZXN0LmNjCmluZGV4IDQxYjg5YWIuLjcwZTQzN2QgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZV91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2VfdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQwLDEzICs0MCwyMSBAQAogLy8gcmVmbGVjdGlvbl9vcHNfdW5pdHRlc3QsIGNvdmVyIHRoZSByZXN0IG9mIHRoZSBmdW5jdGlvbmFsaXR5IHVzZWQgYnkKIC8vIER5bmFtaWNNZXNzYWdlLgogCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2R5bmFtaWNfbWVzc2FnZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnBiLmg+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogCkBAIC02Myw2ICs3MSwxMCBAQAogICBjb25zdCBNZXNzYWdlKiBleHRlbnNpb25zX3Byb3RvdHlwZV87CiAgIGNvbnN0IERlc2NyaXB0b3IqIHBhY2tlZF9kZXNjcmlwdG9yXzsKICAgY29uc3QgTWVzc2FnZSogcGFja2VkX3Byb3RvdHlwZV87CisgIGNvbnN0IERlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3JfOworICBjb25zdCBNZXNzYWdlKiBvbmVvZl9wcm90b3R5cGVfOworICBjb25zdCBEZXNjcmlwdG9yKiBwcm90bzNfZGVzY3JpcHRvcl87CisgIGNvbnN0IE1lc3NhZ2UqIHByb3RvM19wcm90b3R5cGVfOwogCiAgIER5bmFtaWNNZXNzYWdlVGVzdCgpOiBmYWN0b3J5XygmcG9vbF8pIHt9CiAKQEAgLTczLDEzICs4NSwyMSBAQAogICAgIC8vIHVuaXR0ZXN0X2ltcG9ydC5wcm90by4KICAgICBGaWxlRGVzY3JpcHRvclByb3RvIHVuaXR0ZXN0X2ZpbGU7CiAgICAgRmlsZURlc2NyaXB0b3JQcm90byB1bml0dGVzdF9pbXBvcnRfZmlsZTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfZmlsZTsKKyAgICBGaWxlRGVzY3JpcHRvclByb3RvIHVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlX2ZpbGU7CiAKICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCktPmZpbGUoKS0+Q29weVRvKCZ1bml0dGVzdF9maWxlKTsKICAgICB1bml0dGVzdF9pbXBvcnQ6OkltcG9ydE1lc3NhZ2U6OmRlc2NyaXB0b3IoKS0+ZmlsZSgpLT5Db3B5VG8oCiAgICAgICAmdW5pdHRlc3RfaW1wb3J0X2ZpbGUpOworICAgIHVuaXR0ZXN0X2ltcG9ydDo6UHVibGljSW1wb3J0TWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5maWxlKCktPkNvcHlUbygKKyAgICAgICZ1bml0dGVzdF9pbXBvcnRfcHVibGljX2ZpbGUpOworICAgIHByb3RvMl9ub2ZpZWxkcHJlc2VuY2VfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpLT4KKyAgICAgICAgZmlsZSgpLT5Db3B5VG8oJnVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlX2ZpbGUpOwogCisgICAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKHVuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfZmlsZSkgIT0gTlVMTCk7CiAgICAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKHVuaXR0ZXN0X2ltcG9ydF9maWxlKSAhPSBOVUxMKTsKICAgICBBU1NFUlRfVFJVRShwb29sXy5CdWlsZEZpbGUodW5pdHRlc3RfZmlsZSkgIT0gTlVMTCk7CisgICAgQVNTRVJUX1RSVUUocG9vbF8uQnVpbGRGaWxlKHVuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlX2ZpbGUpICE9IE5VTEwpOwogCiAgICAgZGVzY3JpcHRvcl8gPSBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpOwogICAgIEFTU0VSVF9UUlVFKGRlc2NyaXB0b3JfICE9IE5VTEwpOwpAQCAtOTQsNiArMTE0LDE3IEBACiAgICAgICBwb29sXy5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RQYWNrZWRUeXBlcyIpOwogICAgIEFTU0VSVF9UUlVFKHBhY2tlZF9kZXNjcmlwdG9yXyAhPSBOVUxMKTsKICAgICBwYWNrZWRfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShwYWNrZWRfZGVzY3JpcHRvcl8pOworCisgICAgb25lb2ZfZGVzY3JpcHRvcl8gPQorICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKCJwcm90b2J1Zl91bml0dGVzdC5UZXN0T25lb2YyIik7CisgICAgQVNTRVJUX1RSVUUob25lb2ZfZGVzY3JpcHRvcl8gIT0gTlVMTCk7CisgICAgb25lb2ZfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShvbmVvZl9kZXNjcmlwdG9yXyk7CisKKyAgICBwcm90bzNfZGVzY3JpcHRvcl8gPQorICAgICAgcG9vbF8uRmluZE1lc3NhZ2VUeXBlQnlOYW1lKAorICAgICAgICAgICJwcm90bzJfbm9maWVsZHByZXNlbmNlX3VuaXR0ZXN0LlRlc3RBbGxUeXBlcyIpOworICAgIEFTU0VSVF9UUlVFKHByb3RvM19kZXNjcmlwdG9yXyAhPSBOVUxMKTsKKyAgICBwcm90bzNfcHJvdG90eXBlXyA9IGZhY3RvcnlfLkdldFByb3RvdHlwZShwcm90bzNfZGVzY3JpcHRvcl8pOwogICB9CiB9OwogCkBAIC0xMTgsNyArMTQ5LDcgQEAKICAgLy8gQ2hlY2sgdGhhdCBhbGwgZmllbGRzIGhhdmUgaW5kZXBlbmRlbnQgb2Zmc2V0cyBieSBzZXR0aW5nIGVhY2gKICAgLy8gb25lIHRvIGEgdW5pcXVlIHZhbHVlIHRoZW4gY2hlY2tpbmcgdGhhdCB0aGV5IGFsbCBzdGlsbCBoYXZlIHRob3NlCiAgIC8vIHVuaXF1ZSB2YWx1ZXMgKGkuZS4gdGhleSBkb24ndCBzdG9tcCBlYWNoIG90aGVyKS4KLSAgc2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKHByb3RvdHlwZV8tPk5ldygpKTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKHByb3RvdHlwZV8tPk5ldygpKTsKICAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoZGVzY3JpcHRvcl8pOwogCiAgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7CkBAIC0xMjcsNyArMTU4LDcgQEAKIAogVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgRXh0ZW5zaW9ucykgewogICAvLyBDaGVjayB0aGF0IGV4dGVuc2lvbnMgd29yay4KLSAgc2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKGV4dGVuc2lvbnNfcHJvdG90eXBlXy0+TmV3KCkpOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UoZXh0ZW5zaW9uc19wcm90b3R5cGVfLT5OZXcoKSk7CiAgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGV4dGVuc2lvbnNfZGVzY3JpcHRvcl8pOwogCiAgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24obWVzc2FnZS5nZXQoKSk7CkBAIC0xMzYsMjAgKzE2Nyw3NyBAQAogCiBURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBQYWNrZWRGaWVsZHMpIHsKICAgLy8gQ2hlY2sgdGhhdCBwYWNrZWQgZmllbGRzIHdvcmsgcHJvcGVybHkuCi0gIHNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShwYWNrZWRfcHJvdG90eXBlXy0+TmV3KCkpOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IG1lc3NhZ2UocGFja2VkX3Byb3RvdHlwZV8tPk5ldygpKTsKICAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIocGFja2VkX2Rlc2NyaXB0b3JfKTsKIAogICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKG1lc3NhZ2UuZ2V0KCkpOwogICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RQYWNrZWRGaWVsZHNTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKIH0KIAorVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgT25lb2YpIHsKKyAgLy8gQ2hlY2sgdGhhdCBvbmVvZiBmaWVsZHMgd29yayBwcm9wZXJseS4KKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlPiBtZXNzYWdlKG9uZW9mX3Byb3RvdHlwZV8tPk5ldygpKTsKKworICAvLyBDaGVjayBkZWZhdWx0IHZhbHVlcy4KKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2ludCIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX3N0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmdfcGllY2UiKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19ieXRlcyIpKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rk9PLCByZWZsZWN0aW9uLT5HZXRFbnVtKAorICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2VudW0iKSktPm51bWJlcigpKTsKKyAgY29uc3QgRGVzY3JpcHRvciogbmVzdGVkX2Rlc2NyaXB0b3I7CisgIGNvbnN0IE1lc3NhZ2UqIG5lc3RlZF9wcm90b3R5cGU7CisgIG5lc3RlZF9kZXNjcmlwdG9yID0KKyAgICAgIHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mMi5OZXN0ZWRNZXNzYWdlIik7CisgIG5lc3RlZF9wcm90b3R5cGUgPSBmYWN0b3J5Xy5HZXRQcm90b3R5cGUobmVzdGVkX2Rlc2NyaXB0b3IpOworICBFWFBFQ1RfRVEobmVzdGVkX3Byb3RvdHlwZSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19tZXNzYWdlIikpKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZm9vZ3JvdXBfZGVzY3JpcHRvcjsKKyAgY29uc3QgTWVzc2FnZSogZm9vZ3JvdXBfcHJvdG90eXBlOworICBmb29ncm91cF9kZXNjcmlwdG9yID0KKyAgICAgIHBvb2xfLkZpbmRNZXNzYWdlVHlwZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdE9uZW9mMi5Gb29Hcm91cCIpOworICBmb29ncm91cF9wcm90b3R5cGUgPSBmYWN0b3J5Xy5HZXRQcm90b3R5cGUoZm9vZ3JvdXBfZGVzY3JpcHRvcik7CisgIEVYUEVDVF9FUShmb29ncm91cF9wcm90b3R5cGUsCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29ncm91cCIpKSk7CisgIEVYUEVDVF9ORShmb29ncm91cF9wcm90b3R5cGUsCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpKTsKKyAgRVhQRUNUX0VRKDUsIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2ludCIpKSk7CisgIEVYUEVDVF9FUSgiU1RSSU5HIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX3N0cmluZyIpKSk7CisgIEVYUEVDVF9FUSgiQ09SRCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9jb3JkIikpKTsKKyAgRVhQRUNUX0VRKCJTUElFQ0UiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICAqbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCJCWVRFUyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgICptZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9ieXRlcyIpKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdE9uZW9mMjo6QkFSLCByZWZsZWN0aW9uLT5HZXRFbnVtKAorICAgICAgKm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2VudW0iKSktPm51bWJlcigpKTsKKworICAvLyBDaGVjayBzZXQgZnVuY3Rpb25zLgorICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihvbmVvZl9kZXNjcmlwdG9yXyk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldE9uZW9mVmlhUmVmbGVjdGlvbihtZXNzYWdlLmdldCgpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0T25lb2ZTZXRWaWFSZWZsZWN0aW9uKCptZXNzYWdlKTsKK30KKwogVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgU3BhY2VVc2VkKSB7CiAgIC8vIFRlc3QgdGhhdCBTcGFjZVVzZWQoKSB3b3JrcyBwcm9wZXJseQogCiAgIC8vIFNpbmNlIHdlIHNoYXJlIHRoZSBpbXBsZW1lbnRhdGlvbiB3aXRoIGdlbmVyYXRlZCBtZXNzYWdlcywgd2UgZG9uJ3QgbmVlZAogICAvLyB0byB0ZXN0IHZlcnkgbXVjaCBoZXJlLiAgSnVzdCBtYWtlIHN1cmUgaXQgYXBwZWFycyB0byBiZSB3b3JraW5nLgogCi0gIHNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShwcm90b3R5cGVfLT5OZXcoKSk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gbWVzc2FnZShwcm90b3R5cGVfLT5OZXcoKSk7CiAgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKGRlc2NyaXB0b3JfKTsKIAogICBpbnQgaW5pdGlhbF9zcGFjZV91c2VkID0gbWVzc2FnZS0+U3BhY2VVc2VkKCk7CkBAIC0xNTgsNSArMjQ2LDQ3IEBACiAgIEVYUEVDVF9MVChpbml0aWFsX3NwYWNlX3VzZWQsIG1lc3NhZ2UtPlNwYWNlVXNlZCgpKTsKIH0KIAorVEVTVF9GKER5bmFtaWNNZXNzYWdlVGVzdCwgQXJlbmEpIHsKKyAgQXJlbmEgYXJlbmE7CisgIE1lc3NhZ2UqIG1lc3NhZ2UgPSBwcm90b3R5cGVfLT5OZXcoJmFyZW5hKTsKKyAgKHZvaWQpbWVzc2FnZTsgIC8vIGF2b2lkIHVudXNlZC12YXJpYWJsZSBlcnJvci4KKyAgLy8gUmV0dXJuIHdpdGhvdXQgZnJlZWluZzogc2hvdWxkIG5vdCBsZWFrLgorfQorCitURVNUX0YoRHluYW1pY01lc3NhZ2VUZXN0LCBQcm90bzMpIHsKKyAgTWVzc2FnZSogbWVzc2FnZSA9IHByb3RvM19wcm90b3R5cGVfLT5OZXcoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbCA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzYyA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKworICAvLyBKdXN0IHRlc3QgYSBzaW5nbGUgcHJpbXRpdmUgYW5kIHNpbmdsZSBtZXNzYWdlIGZpZWxkIGhlcmUgdG8gbWFrZSBzdXJlIHdlCisgIC8vIGFyZSBnZXR0aW5nIHRoZSBuby1maWVsZC1wcmVzZW5jZSBzZW1hbnRpY3MgZWxzZXdoZXJlLiBEeW5hbWljTWVzc2FnZSB1c2VzCisgIC8vIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uIHVuZGVyIHRoZSBob29kLCBzbyB0aGUgcmVzdCBzaG91bGQgYmUgZmluZSBhcworICAvLyBsb25nIGFzIEdNUiByZWNvZ25pemVzIHRoYXQgd2UncmUgdXNpbmcgYSBwcm90bzMgbWVzc2FnZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBvcHRpb25hbF9pbnQzMiA9CisgICAgICBkZXNjLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIik7CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogb3B0aW9uYWxfbXNnID0KKyAgICAgIGRlc2MtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UiKTsKKyAgRVhQRUNUX1RSVUUob3B0aW9uYWxfaW50MzIgIT0gTlVMTCk7CisgIEVYUEVDVF9UUlVFKG9wdGlvbmFsX21zZyAhPSBOVUxMKTsKKworICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmwtPkhhc0ZpZWxkKCptZXNzYWdlLCBvcHRpb25hbF9pbnQzMikpOworICByZWZsLT5TZXRJbnQzMihtZXNzYWdlLCBvcHRpb25hbF9pbnQzMiwgNDIpOworICBFWFBFQ1RfRVEodHJ1ZSwgcmVmbC0+SGFzRmllbGQoKm1lc3NhZ2UsIG9wdGlvbmFsX2ludDMyKSk7CisgIHJlZmwtPlNldEludDMyKG1lc3NhZ2UsIG9wdGlvbmFsX2ludDMyLCAwKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCByZWZsLT5IYXNGaWVsZCgqbWVzc2FnZSwgb3B0aW9uYWxfaW50MzIpKTsKKworICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmwtPkhhc0ZpZWxkKCptZXNzYWdlLCBvcHRpb25hbF9tc2cpKTsKKyAgcmVmbC0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgb3B0aW9uYWxfbXNnKTsKKyAgRVhQRUNUX0VRKHRydWUsIHJlZmwtPkhhc0ZpZWxkKCptZXNzYWdlLCBvcHRpb25hbF9tc2cpKTsKKyAgZGVsZXRlIHJlZmwtPlJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIG9wdGlvbmFsX21zZyk7CisgIEVYUEVDVF9FUShmYWxzZSwgcmVmbC0+SGFzRmllbGQoKm1lc3NhZ2UsIG9wdGlvbmFsX21zZykpOworCisgIC8vIEFsc28gZW5zdXJlIHRoYXQgdGhlIGRlZmF1bHQgaW5zdGFuY2UgaGFuZGxlcyBmaWVsZCBwcmVzZW5jZSBwcm9wZXJseS4KKyAgRVhQRUNUX0VRKGZhbHNlLCByZWZsLT5IYXNGaWVsZCgqcHJvdG8zX3Byb3RvdHlwZV8sIG9wdGlvbmFsX21zZykpOworCisgIGRlbGV0ZSBtZXNzYWdlOworfQorCisKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBiLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnBiLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucGIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9lbXB0eS5wYi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZW1wdHkucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2VtcHR5LnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5jYwppbmRleCBkYmIwOTE1Li45YWZiMjM2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM4LDEwICszOCw5IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNTgsNiArNTcsMjQgQEAKICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGVUb0NwcFR5cGUocmVhbF90eXBlKHR5cGUpKTsKIH0KIAoraW5saW5lIGJvb2wgaXNfcGFja2FibGUoV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIHR5cGUpIHsKKyAgc3dpdGNoICh0eXBlKSB7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOgorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ6CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMjoKKyAgICAgIHJldHVybiB0cnVlOworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQOgorICAgICAgcmV0dXJuIGZhbHNlOworCisgICAgLy8gRG8gbm90IGFkZCBhIGRlZmF1bHQgc3RhdGVtZW50LiBMZXQgdGhlIGNvbXBpbGVyIGNvbXBsYWluIHdoZW4gc29tZW9uZQorICAgIC8vIGFkZHMgYSBuZXcgd2lyZSB0eXBlLgorICB9CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJjYW4ndCByZWFjaCBoZXJlLiI7CisgIHJldHVybiBmYWxzZTsKK30KKwogLy8gUmVnaXN0cnkgc3R1ZmYuCiB0eXBlZGVmIGhhc2hfbWFwPHBhaXI8Y29uc3QgTWVzc2FnZUxpdGUqLCBpbnQ+LAogICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvPiBFeHRlbnNpb25SZWdpc3RyeTsKQEAgLTcxLDcgKzg4LDcgQEAKIAogdm9pZCBJbml0UmVnaXN0cnkoKSB7CiAgIHJlZ2lzdHJ5XyA9IG5ldyBFeHRlbnNpb25SZWdpc3RyeTsKLSAgaW50ZXJuYWw6Ok9uU2h1dGRvd24oJkRlbGV0ZVJlZ2lzdHJ5KTsKKyAgT25TaHV0ZG93bigmRGVsZXRlUmVnaXN0cnkpOwogfQogCiAvLyBUaGlzIGZ1bmN0aW9uIGlzIG9ubHkgY2FsbGVkIGF0IHN0YXJ0dXAsIHNvIHRoZXJlIGlzIG5vIG5lZWQgZm9yIHRocmVhZC0KQEAgLTgwLDcgKzk3LDcgQEAKICAgICAgICAgICAgICAgaW50IG51bWJlciwgRXh0ZW5zaW9uSW5mbyBpbmZvKSB7CiAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnJlZ2lzdHJ5X2luaXRfLCAmSW5pdFJlZ2lzdHJ5KTsKIAotICBpZiAoIUluc2VydElmTm90UHJlc2VudChyZWdpc3RyeV8sIG1ha2VfcGFpcihjb250YWluaW5nX3R5cGUsIG51bWJlciksCisgIGlmICghSW5zZXJ0SWZOb3RQcmVzZW50KHJlZ2lzdHJ5Xywgc3RkOjptYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCBudW1iZXIpLAogICAgICAgICAgICAgICAgICAgICAgICAgICBpbmZvKSkgewogICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJNdWx0aXBsZSBleHRlbnNpb24gcmVnaXN0cmF0aW9ucyBmb3IgdHlwZSBcIiIKICAgICAgICAgICAgICAgIDw8IGNvbnRhaW5pbmdfdHlwZS0+R2V0VHlwZU5hbWUoKQpAQCAtOTAsOCArMTA3LDkgQEAKIAogY29uc3QgRXh0ZW5zaW9uSW5mbyogRmluZFJlZ2lzdGVyZWRFeHRlbnNpb24oCiAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwgaW50IG51bWJlcikgewotICByZXR1cm4gKHJlZ2lzdHJ5XyA9PSBOVUxMKSA/IE5VTEwgOgotICAgICAgICAgRmluZE9yTnVsbCgqcmVnaXN0cnlfLCBtYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCBudW1iZXIpKTsKKyAgcmV0dXJuIChyZWdpc3RyeV8gPT0gTlVMTCkKKyAgICAgICAgICAgICA/IE5VTEwKKyAgICAgICAgICAgICA6IEZpbmRPck51bGwoKnJlZ2lzdHJ5Xywgc3RkOjptYWtlX3BhaXIoY29udGFpbmluZ190eXBlLCBudW1iZXIpKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCkBAIC0xNTksMTIgKzE3NywyMSBAQAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gQ29uc3RydWN0b3JzIGFuZCBiYXNpYyBtZXRob2RzLgogCi1FeHRlbnNpb25TZXQ6OkV4dGVuc2lvblNldCgpIHt9CitFeHRlbnNpb25TZXQ6OkV4dGVuc2lvblNldCg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgOiBhcmVuYV8oYXJlbmEpIHsKKyAgaWYgKGFyZW5hXyAhPSBOVUxMKSB7CisgICAgYXJlbmFfLT5Pd25EZXN0cnVjdG9yKCZleHRlbnNpb25zXyk7CisgIH0KK30KKworRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb25TZXQoKSA6IGFyZW5hXyhOVUxMKSB7fQogCiBFeHRlbnNpb25TZXQ6On5FeHRlbnNpb25TZXQoKSB7Ci0gIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7Ci0gICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaXRlci0+c2Vjb25kLkZyZWUoKTsKKyAgLy8gRGVsZXRlcyBhbGwgYWxsb2NhdGVkIGV4dGVuc2lvbnMuCisgIGlmIChhcmVuYV8gPT0gTlVMTCkgeworICAgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICAgIGl0ZXItPnNlY29uZC5GcmVlKCk7CisgICAgfQogICB9CiB9CiAKQEAgLTE4MCw2ICsyMDcsMTcgQEAKICAgcmV0dXJuICFpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZDsKIH0KIAoraW50IEV4dGVuc2lvblNldDo6TnVtRXh0ZW5zaW9ucygpIGNvbnN0IHsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CisgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CisgICAgaWYgKCFpdGVyLT5zZWNvbmQuaXNfY2xlYXJlZCkgeworICAgICAgKytyZXN1bHQ7CisgICAgfQorICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKIGludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvblNpemUoaW50IG51bWJlcikgY29uc3QgewogICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwogICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgcmV0dXJuIGZhbHNlOwpAQCAtMjc1LDcgKzMxMyw4IEBACiAgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRSk7IFwKICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBwYWNrZWQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZSA9IG5ldyBSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4oKTsgIFwKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUgPSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPExPV0VSQ0FTRT4gPihhcmVuYV8pOyAgICAgICAgICAgICAgICAgXAogICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIFVQUEVSQ0FTRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIHBhY2tlZCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0yOTMsNiArMzMyLDkwIEBACiAKICN1bmRlZiBQUklNSVRJVkVfQUNDRVNTT1JTCiAKK2NvbnN0IHZvaWQqIEV4dGVuc2lvblNldDo6R2V0UmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqIGRlZmF1bHRfdmFsdWUpIGNvbnN0IHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgaWYgKGl0ZXIgPT0gZXh0ZW5zaW9uc18uZW5kKCkpIHsKKyAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKKyAgfQorICAvLyBXZSBhc3N1bWUgdGhhdCBhbGwgdGhlIFJlcGVhdGVkRmllbGQ8PiogcG9pbnRlcnMgaGF2ZSB0aGUgc2FtZQorICAvLyBzaXplIGFuZCBhbGlnbm1lbnQgd2l0aGluIHRoZSBhbm9ueW1vdXMgdW5pb24gaW4gRXh0ZW5zaW9uLgorICByZXR1cm4gaXRlci0+c2Vjb25kLnJlcGVhdGVkX2ludDMyX3ZhbHVlOworfQorCit2b2lkKiBFeHRlbnNpb25TZXQ6Ok11dGFibGVSYXdSZXBlYXRlZEZpZWxkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHBhY2tlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjKSB7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworCisgIC8vIFdlIGluc3RhbnRpYXRlIGFuIGVtcHR5IFJlcGVhdGVkeyxQdHJ9RmllbGQgaWYgb25lIGRvZXNuJ3QgZXhpc3QgZm9yIHRoaXMKKyAgLy8gZXh0ZW5zaW9uLgorICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOworICAgIGV4dGVuc2lvbi0+dHlwZSA9IGZpZWxkX3R5cGU7CisgICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBwYWNrZWQ7CisKKyAgICBzd2l0Y2ggKFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGVUb0NwcFR5cGUoCisgICAgICAgIHN0YXRpY19jYXN0PFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGU+KGZpZWxkX3R5cGUpKSkgeworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQzMl92YWx1ZSA9CisgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludDMyPiA+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9JTlQ2NDoKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9pbnQ2NF92YWx1ZSA9CisgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludDY0PiA+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UMzI6CisgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfdWludDMyX3ZhbHVlID0KKyAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8dWludDMyPiA+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9VSU5UNjQ6CisgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfdWludDY0X3ZhbHVlID0KKyAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8dWludDY0PiA+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9ET1VCTEU6CisgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZG91YmxlX3ZhbHVlID0KKyAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkRmllbGQ8ZG91YmxlPiA+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9GTE9BVDoKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9mbG9hdF92YWx1ZSA9CisgICAgICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGZsb2F0PiA+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9CT09MOgorICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2Jvb2xfdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxib29sPiA+KGFyZW5hXyk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9FTlVNOgorICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX2VudW1fdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRGaWVsZDxpbnQ+ID4oYXJlbmFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9zdHJpbmdfdmFsdWUgPQorICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz4gPihhcmVuYV8pOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlID0KKyAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+ID4oYXJlbmFfKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9CisKKyAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIHRoZSBSZXBlYXRlZEZpZWxkPD4qIHBvaW50ZXJzIGhhdmUgdGhlIHNhbWUKKyAgLy8gc2l6ZSBhbmQgYWxpZ25tZW50IHdpdGhpbiB0aGUgYW5vbnltb3VzIHVuaW9uIGluIEV4dGVuc2lvbi4KKyAgcmV0dXJuIGV4dGVuc2lvbi0+cmVwZWF0ZWRfaW50MzJfdmFsdWU7Cit9CisKKy8vIENvbXBhdGlibGUgdmVyc2lvbiB1c2luZyBvbGQgY2FsbCBzaWduYXR1cmUuIERvZXMgbm90IGNyZWF0ZSBleHRlbnNpb25zIHdoZW4KKy8vIHRoZSBkb24ndCBhbHJlYWR5IGV4aXN0OyBpbnN0ZWFkLCBqdXN0IEdPT0dMRV9DSEVDSy1mYWlscy4KK3ZvaWQqIEV4dGVuc2lvblNldDo6TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoaW50IG51bWJlcikgeworICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkV4dGVuc2lvbiBub3QgZm91bmQuIjsKKyAgLy8gV2UgYXNzdW1lIHRoYXQgYWxsIHRoZSBSZXBlYXRlZEZpZWxkPD4qIHBvaW50ZXJzIGhhdmUgdGhlIHNhbWUKKyAgLy8gc2l6ZSBhbmQgYWxpZ25tZW50IHdpdGhpbiB0aGUgYW5vbnltb3VzIHVuaW9uIGluIEV4dGVuc2lvbi4KKyAgcmV0dXJuIGl0ZXItPnNlY29uZC5yZXBlYXRlZF9pbnQzMl92YWx1ZTsKK30KKworCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFbnVtcwogCkBAIC0zNDQsNyArNDY3LDggQEAKICAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX0VOVU0pOwogICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSB0cnVlOwogICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gcGFja2VkOwotICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfZW51bV92YWx1ZSA9IG5ldyBSZXBlYXRlZEZpZWxkPGludD4oKTsKKyAgICBleHRlbnNpb24tPnJlcGVhdGVkX2VudW1fdmFsdWUgPQorICAgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTxSZXBlYXRlZEZpZWxkPGludD4gPihhcmVuYV8pOwogICB9IGVsc2UgewogICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBSRVBFQVRFRCwgRU5VTSk7CiAgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPmlzX3BhY2tlZCwgcGFja2VkKTsKQEAgLTM3NCw3ICs0OTgsNyBAQAogICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CiAgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkcpOwogICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKLSAgICBleHRlbnNpb24tPnN0cmluZ192YWx1ZSA9IG5ldyBzdHJpbmc7CisgICAgZXh0ZW5zaW9uLT5zdHJpbmdfdmFsdWUgPSBBcmVuYTo6Q3JlYXRlPHN0cmluZz4oYXJlbmFfKTsKICAgfSBlbHNlIHsKICAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIFNUUklORyk7CiAgIH0KQEAgLTQwNCw3ICs1MjgsOCBAQAogICAgIEdPT0dMRV9EQ0hFQ0tfRVEoY3BwX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSwgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfU1RSSU5HKTsKICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKICAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IGZhbHNlOwotICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0gbmV3IFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPigpOworICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfc3RyaW5nX3ZhbHVlID0KKyAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+ID4oYXJlbmFfKTsKICAgfSBlbHNlIHsKICAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIFNUUklORyk7CiAgIH0KQEAgLTQyMiw3ICs1NDcsMTEgQEAKICAgICByZXR1cm4gZGVmYXVsdF92YWx1ZTsKICAgfSBlbHNlIHsKICAgICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBPUFRJT05BTCwgTUVTU0FHRSk7Ci0gICAgcmV0dXJuICppdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZTsKKyAgICBpZiAoaXRlci0+c2Vjb25kLmlzX2xhenkpIHsKKyAgICAgIHJldHVybiBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWUtPkdldE1lc3NhZ2UoZGVmYXVsdF92YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7CisgICAgfQogICB9CiB9CiAKQEAgLTQzOSwxMiArNTY4LDE5IEBACiAgICAgZXh0ZW5zaW9uLT50eXBlID0gdHlwZTsKICAgICBHT09HTEVfRENIRUNLX0VRKGNwcF90eXBlKGV4dGVuc2lvbi0+dHlwZSksIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOwogICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKLSAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBwcm90b3R5cGUuTmV3KCk7CisgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gcHJvdG90eXBlLk5ldyhhcmVuYV8pOworICAgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworICAgIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CiAgIH0gZWxzZSB7CiAgICAgR09PR0xFX0RDSEVDS19UWVBFKCpleHRlbnNpb24sIE9QVElPTkFMLCBNRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKKyAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICByZXR1cm4gZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TXV0YWJsZU1lc3NhZ2UocHJvdG90eXBlKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICB9CiAgIH0KLSAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7Ci0gIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CiB9CiAKIC8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KQEAgLTQ1Miw2ICs1ODgsMTM2IEBACiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUsCiAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkKIAordm9pZCBFeHRlbnNpb25TZXQ6OlNldEFsbG9jYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworICBpZiAobWVzc2FnZSA9PSBOVUxMKSB7CisgICAgQ2xlYXJFeHRlbnNpb24obnVtYmVyKTsKKyAgICByZXR1cm47CisgIH0KKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogbWVzc2FnZV9hcmVuYSA9IG1lc3NhZ2UtPkdldEFyZW5hKCk7CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7CisgICAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gYXJlbmFfKSB7CisgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOworICAgIH0gZWxzZSBpZiAobWVzc2FnZV9hcmVuYSA9PSBOVUxMKSB7CisgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOworICAgICAgYXJlbmFfLT5Pd24obWVzc2FnZSk7ICAvLyBub3QgTlVMTCBiZWNhdXNlIG5vdCBlcXVhbCB0byBtZXNzYWdlX2FyZW5hCisgICAgfSBlbHNlIHsKKyAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2UtPk5ldyhhcmVuYV8pOworICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oKm1lc3NhZ2UpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPlNldEFsbG9jYXRlZE1lc3NhZ2UobWVzc2FnZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlOworICAgICAgfQorICAgICAgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gYXJlbmFfKSB7CisgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2U7CisgICAgICB9IGVsc2UgaWYgKG1lc3NhZ2VfYXJlbmEgPT0gTlVMTCkgeworICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOworICAgICAgICBhcmVuYV8tPk93bihtZXNzYWdlKTsgIC8vIG5vdCBOVUxMIGJlY2F1c2Ugbm90IGVxdWFsIHRvIG1lc3NhZ2VfYXJlbmEKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IG1lc3NhZ2UtPk5ldyhhcmVuYV8pOworICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgqbWVzc2FnZSk7CisgICAgICB9CisgICAgfQorICB9CisgIGV4dGVuc2lvbi0+aXNfY2xlYXJlZCA9IGZhbHNlOworfQorCit2b2lkIEV4dGVuc2lvblNldDo6VW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRNZXNzYWdlKAorICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSB0eXBlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKKyAgaWYgKG1lc3NhZ2UgPT0gTlVMTCkgeworICAgIENsZWFyRXh0ZW5zaW9uKG51bWJlcik7CisgICAgcmV0dXJuOworICB9CisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICBpZiAoTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBkZXNjcmlwdG9yLCAmZXh0ZW5zaW9uKSkgeworICAgIGV4dGVuc2lvbi0+dHlwZSA9IHR5cGU7CisgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKKyAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gbWVzc2FnZTsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIGlmIChleHRlbnNpb24tPmlzX2xhenkpIHsKKyAgICAgIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGFyZW5hXyA9PSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CisgICAgICB9CisgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUgPSBtZXNzYWdlOworICAgIH0KKyAgfQorICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKK30KKworCitNZXNzYWdlTGl0ZSogRXh0ZW5zaW9uU2V0OjpSZWxlYXNlTWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSkgeworICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgeworICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIE5VTEwuCisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIE1lc3NhZ2VMaXRlKiByZXQgPSBOVUxMOworICAgIGlmIChpdGVyLT5zZWNvbmQuaXNfbGF6eSkgeworICAgICAgcmV0ID0gaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlLT5SZWxlYXNlTWVzc2FnZShwcm90b3R5cGUpOworICAgICAgaWYgKGFyZW5hXyA9PSBOVUxMKSB7CisgICAgICAgIGRlbGV0ZSBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWU7CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgeworICAgICAgICByZXQgPSBpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFJlbGVhc2VNZXNzYWdlKCkgYWx3YXlzIHJldHVybnMgYSBoZWFwLWFsbG9jYXRlZCBtZXNzYWdlLCBhbmQgd2UgYXJlCisgICAgICAgIC8vIG9uIGFuIGFyZW5hLCBzbyB3ZSBuZWVkIHRvIG1ha2UgYSBjb3B5IG9mIHRoaXMgbWVzc2FnZSB0byByZXR1cm4uCisgICAgICAgIHJldCA9IChpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZSktPk5ldygpOworICAgICAgICByZXQtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWUpOworICAgICAgfQorICAgIH0KKyAgICBleHRlbnNpb25zXy5lcmFzZShudW1iZXIpOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6VW5zYWZlQXJlbmFSZWxlYXNlTWVzc2FnZSgKKyAgICBpbnQgbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKSB7CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIGl0ZXIgPSBleHRlbnNpb25zXy5maW5kKG51bWJlcik7CisgIGlmIChpdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSB7CisgICAgLy8gTm90IHByZXNlbnQuICBSZXR1cm4gTlVMTC4KKyAgICByZXR1cm4gTlVMTDsKKyAgfSBlbHNlIHsKKyAgICBHT09HTEVfRENIRUNLX1RZUEUoaXRlci0+c2Vjb25kLCBPUFRJT05BTCwgTUVTU0FHRSk7CisgICAgTWVzc2FnZUxpdGUqIHJldCA9IE5VTEw7CisgICAgaWYgKGl0ZXItPnNlY29uZC5pc19sYXp5KSB7CisgICAgICByZXQgPQorICAgICAgICBpdGVyLT5zZWNvbmQubGF6eW1lc3NhZ2VfdmFsdWUtPlVuc2FmZUFyZW5hUmVsZWFzZU1lc3NhZ2UocHJvdG90eXBlKTsKKyAgICAgIGlmIChhcmVuYV8gPT0gTlVMTCkgeworICAgICAgICBkZWxldGUgaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICByZXQgPSBpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZTsKKyAgICB9CisgICAgZXh0ZW5zaW9uc18uZXJhc2UobnVtYmVyKTsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKKy8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KKy8vIE1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OlJlbGVhc2VNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKKwogY29uc3QgTWVzc2FnZUxpdGUmIEV4dGVuc2lvblNldDo6R2V0UmVwZWF0ZWRNZXNzYWdlKAogICAgIGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3QgewogICBtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOwpAQCAtNDc2LDcgKzc0Miw3IEBACiAgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFKTsKICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQotICAgICAgbmV3IFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+KCk7CisgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+ID4oYXJlbmFfKTsKICAgfSBlbHNlIHsKICAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIE1FU1NBR0UpOwogICB9CkBAIC00ODQsOSArNzUwLDkgQEAKICAgLy8gUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4gZG9lcyBub3Qga25vdyBob3cgdG8gQWRkKCkgc2luY2UgaXQgY2Fubm90CiAgIC8vIGFsbG9jYXRlIGFuIGFic3RyYWN0IG9iamVjdCwgc28gd2UgaGF2ZSB0byBiZSB0cmlja3kuCiAgIE1lc3NhZ2VMaXRlKiByZXN1bHQgPSBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUKLSAgICAgIC0+QWRkRnJvbUNsZWFyZWQ8aW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4gPigpOworICAgICAgLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+ID4oKTsKICAgaWYgKHJlc3VsdCA9PSBOVUxMKSB7Ci0gICAgcmVzdWx0ID0gcHJvdG90eXBlLk5ldygpOworICAgIHJlc3VsdCA9IHByb3RvdHlwZS5OZXcoYXJlbmFfKTsKICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZChyZXN1bHQpOwogICB9CiAgIHJldHVybiByZXN1bHQ7CkBAIC01NDAsNiArODA2LDE2IEBACiAgIH0KIH0KIAorTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6UmVsZWFzZUxhc3QoaW50IG51bWJlcikgeworICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uZmluZChudW1iZXIpOworICBHT09HTEVfQ0hFQ0soaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKSkgPDwgIkluZGV4IG91dC1vZi1ib3VuZHMgKGZpZWxkIGlzIGVtcHR5KS4iOworCisgIEV4dGVuc2lvbiogZXh0ZW5zaW9uID0gJml0ZXItPnNlY29uZDsKKyAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKyAgR09PR0xFX0RDSEVDSyhjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpID09IFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0UpOworICByZXR1cm4gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5SZWxlYXNlTGFzdCgpOworfQorCiB2b2lkIEV4dGVuc2lvblNldDo6U3dhcEVsZW1lbnRzKGludCBudW1iZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpIHsKICAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKICAgR09PR0xFX0NIRUNLKGl0ZXIgIT0gZXh0ZW5zaW9uc18uZW5kKCkpIDw8ICJJbmRleCBvdXQtb2YtYm91bmRzIChmaWVsZCBpcyBlbXB0eSkuIjsKQEAgLTU5NCw5MyArODcwLDE0MiBAQAogICBmb3IgKG1hcDxpbnQsIEV4dGVuc2lvbj46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPSBvdGhlci5leHRlbnNpb25zXy5iZWdpbigpOwogICAgICAgIGl0ZXIgIT0gb3RoZXIuZXh0ZW5zaW9uc18uZW5kKCk7ICsraXRlcikgewogICAgIGNvbnN0IEV4dGVuc2lvbiYgb3RoZXJfZXh0ZW5zaW9uID0gaXRlci0+c2Vjb25kOworICAgIEludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKGl0ZXItPmZpcnN0LCBvdGhlcl9leHRlbnNpb24pOworICB9Cit9CiAKLSAgICBpZiAob3RoZXJfZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7Ci0gICAgICBFeHRlbnNpb24qIGV4dGVuc2lvbjsKLSAgICAgIGJvb2wgaXNfbmV3ID0gTWF5YmVOZXdFeHRlbnNpb24oaXRlci0+Zmlyc3QsIG90aGVyX2V4dGVuc2lvbi5kZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uKTsKLSAgICAgIGlmIChpc19uZXcpIHsKLSAgICAgICAgLy8gRXh0ZW5zaW9uIGRpZCBub3QgYWxyZWFkeSBleGlzdCBpbiBzZXQuCi0gICAgICAgIGV4dGVuc2lvbi0+dHlwZSA9IG90aGVyX2V4dGVuc2lvbi50eXBlOwotICAgICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT50eXBlLCBvdGhlcl9leHRlbnNpb24udHlwZSk7Ci0gICAgICAgIEdPT0dMRV9EQ0hFQ0soZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCk7Ci0gICAgICB9Ci0KLSAgICAgIHN3aXRjaCAoY3BwX3R5cGUob3RoZXJfZXh0ZW5zaW9uLnR5cGUpKSB7Ci0jZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgTE9XRVJDQVNFLCBSRVBFQVRFRF9UWVBFKSAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgaWYgKGlzX25ldykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUgPSAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgIG5ldyBSRVBFQVRFRF9UWVBFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF8jI0xPV0VSQ0FTRSMjX3ZhbHVlLT5NZXJnZUZyb20oICAgICAgICBcCi0gICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUpOyAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgSEFORExFX1RZUEUoICBJTlQzMiwgICBpbnQzMiwgUmVwZWF0ZWRGaWVsZCAgIDwgIGludDMyPik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQsIFJlcGVhdGVkRmllbGQgICA8ICBpbnQ2ND4pOwotICAgICAgICBIQU5ETEVfVFlQRSggVUlOVDMyLCAgdWludDMyLCBSZXBlYXRlZEZpZWxkICAgPCB1aW50MzI+KTsKLSAgICAgICAgSEFORExFX1RZUEUoIFVJTlQ2NCwgIHVpbnQ2NCwgUmVwZWF0ZWRGaWVsZCAgIDwgdWludDY0Pik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQsIFJlcGVhdGVkRmllbGQgICA8ICBmbG9hdD4pOwotICAgICAgICBIQU5ETEVfVFlQRSggRE9VQkxFLCAgZG91YmxlLCBSZXBlYXRlZEZpZWxkICAgPCBkb3VibGU+KTsKLSAgICAgICAgSEFORExFX1RZUEUoICAgQk9PTCwgICAgYm9vbCwgUmVwZWF0ZWRGaWVsZCAgIDwgICBib29sPik7Ci0gICAgICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0sIFJlcGVhdGVkRmllbGQgICA8ICAgIGludD4pOwotICAgICAgICBIQU5ETEVfVFlQRSggU1RSSU5HLCAgc3RyaW5nLCBSZXBlYXRlZFB0ckZpZWxkPCBzdHJpbmc+KTsKLSN1bmRlZiBIQU5ETEVfVFlQRQotCi0gICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICBpZiAoaXNfbmV3KSB7Ci0gICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUgPQotICAgICAgICAgICAgICBuZXcgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4oKTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgLy8gV2UgY2FuJ3QgY2FsbCBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPjo6TWVyZ2VGcm9tKCkgYmVjYXVzZQotICAgICAgICAgIC8vIGl0IHdvdWxkIGF0dGVtcHQgdG8gYWxsb2NhdGUgbmV3IG9iamVjdHMuCi0gICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4qIG90aGVyX3JlcGVhdGVkX21lc3NhZ2UgPQotICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24ucmVwZWF0ZWRfbWVzc2FnZV92YWx1ZTsKLSAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG90aGVyX3JlcGVhdGVkX21lc3NhZ2UtPnNpemUoKTsgaSsrKSB7Ci0gICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXJfbWVzc2FnZSA9IG90aGVyX3JlcGVhdGVkX21lc3NhZ2UtPkdldChpKTsKLSAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiB0YXJnZXQgPSBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUKLSAgICAgICAgICAgICAgICAgICAgIC0+QWRkRnJvbUNsZWFyZWQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPiA+KCk7Ci0gICAgICAgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpIHsKLSAgICAgICAgICAgICAgdGFyZ2V0ID0gb3RoZXJfbWVzc2FnZS5OZXcoKTsKLSAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5BZGRBbGxvY2F0ZWQodGFyZ2V0KTsKLSAgICAgICAgICAgIH0KLSAgICAgICAgICAgIHRhcmdldC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKG90aGVyX21lc3NhZ2UpOwotICAgICAgICAgIH0KLSAgICAgICAgICBicmVhazsKLSAgICAgIH0KK3ZvaWQgRXh0ZW5zaW9uU2V0OjpJbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbSgKKyAgaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uJiBvdGhlcl9leHRlbnNpb24pIHsKKyAgaWYgKG90aGVyX2V4dGVuc2lvbi5pc19yZXBlYXRlZCkgeworICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgIGJvb2wgaXNfbmV3ID0gTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLCBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZleHRlbnNpb24pOworICAgIGlmIChpc19uZXcpIHsKKyAgICAgIC8vIEV4dGVuc2lvbiBkaWQgbm90IGFscmVhZHkgZXhpc3QgaW4gc2V0LgorICAgICAgZXh0ZW5zaW9uLT50eXBlID0gb3RoZXJfZXh0ZW5zaW9uLnR5cGU7CisgICAgICBleHRlbnNpb24tPmlzX3BhY2tlZCA9IG90aGVyX2V4dGVuc2lvbi5pc19wYWNrZWQ7CisgICAgICBleHRlbnNpb24tPmlzX3JlcGVhdGVkID0gdHJ1ZTsKICAgICB9IGVsc2UgewotICAgICAgaWYgKCFvdGhlcl9leHRlbnNpb24uaXNfY2xlYXJlZCkgewotICAgICAgICBzd2l0Y2ggKGNwcF90eXBlKG90aGVyX2V4dGVuc2lvbi50eXBlKSkgewotI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSwgQ0FNRUxDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIFNldCMjQ0FNRUxDQVNFKGl0ZXItPmZpcnN0LCBvdGhlcl9leHRlbnNpb24udHlwZSwgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLkxPV0VSQ0FTRSMjX3ZhbHVlLCAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJyZWFrOworICAgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPnR5cGUsIG90aGVyX2V4dGVuc2lvbi50eXBlKTsKKyAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsIG90aGVyX2V4dGVuc2lvbi5pc19wYWNrZWQpOworICAgICAgR09PR0xFX0RDSEVDSyhleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKyAgICB9CiAKLSAgICAgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMiwgIEludDMyKTsKLSAgICAgICAgICBIQU5ETEVfVFlQRSggSU5UNjQsICBpbnQ2NCwgIEludDY0KTsKLSAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UMzIsIHVpbnQzMiwgVUludDMyKTsKLSAgICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCwgVUludDY0KTsKLSAgICAgICAgICBIQU5ETEVfVFlQRSggRkxPQVQsICBmbG9hdCwgIEZsb2F0KTsKLSAgICAgICAgICBIQU5ETEVfVFlQRShET1VCTEUsIGRvdWJsZSwgRG91YmxlKTsKLSAgICAgICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCwgICBCb29sKTsKLSAgICAgICAgICBIQU5ETEVfVFlQRSggIEVOVU0sICAgZW51bSwgICBFbnVtKTsKKyAgICBzd2l0Y2ggKGNwcF90eXBlKG90aGVyX2V4dGVuc2lvbi50eXBlKSkgeworI2RlZmluZSBIQU5ETEVfVFlQRShVUFBFUkNBU0UsIExPV0VSQ0FTRSwgUkVQRUFURURfVFlQRSkgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfIyNVUFBFUkNBU0U6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChpc19uZXcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfIyNMT1dFUkNBU0UjI192YWx1ZSA9ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPFJFUEVBVEVEX1RZUEUgPihhcmVuYV8pOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUtPk1lcmdlRnJvbSggICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLnJlcGVhdGVkXyMjTE9XRVJDQVNFIyNfdmFsdWUpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGJyZWFrOworCisgICAgICBIQU5ETEVfVFlQRSggIElOVDMyLCAgIGludDMyLCBSZXBlYXRlZEZpZWxkICAgPCAgaW50MzI+KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgSU5UNjQsICAgaW50NjQsIFJlcGVhdGVkRmllbGQgICA8ICBpbnQ2ND4pOworICAgICAgSEFORExFX1RZUEUoIFVJTlQzMiwgIHVpbnQzMiwgUmVwZWF0ZWRGaWVsZCAgIDwgdWludDMyPik7CisgICAgICBIQU5ETEVfVFlQRSggVUlOVDY0LCAgdWludDY0LCBSZXBlYXRlZEZpZWxkICAgPCB1aW50NjQ+KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgRkxPQVQsICAgZmxvYXQsIFJlcGVhdGVkRmllbGQgICA8ICBmbG9hdD4pOworICAgICAgSEFORExFX1RZUEUoIERPVUJMRSwgIGRvdWJsZSwgUmVwZWF0ZWRGaWVsZCAgIDwgZG91YmxlPik7CisgICAgICBIQU5ETEVfVFlQRSggICBCT09MLCAgICBib29sLCBSZXBlYXRlZEZpZWxkICAgPCAgIGJvb2w+KTsKKyAgICAgIEhBTkRMRV9UWVBFKCAgIEVOVU0sICAgIGVudW0sIFJlcGVhdGVkRmllbGQgICA8ICAgIGludD4pOworICAgICAgSEFORExFX1RZUEUoIFNUUklORywgIHN0cmluZywgUmVwZWF0ZWRQdHJGaWVsZDwgc3RyaW5nPik7CiAjdW5kZWYgSEFORExFX1RZUEUKLSAgICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgICAgIFNldFN0cmluZyhpdGVyLT5maXJzdCwgb3RoZXJfZXh0ZW5zaW9uLnR5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5zdHJpbmdfdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOwotICAgICAgICAgICAgYnJlYWs7Ci0gICAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgICAgTXV0YWJsZU1lc3NhZ2UoaXRlci0+Zmlyc3QsIG90aGVyX2V4dGVuc2lvbi50eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IpCi0gICAgICAgICAgICAgIC0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKCpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7Ci0gICAgICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlID0KKyAgICAgICAgICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8UmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4gPihhcmVuYV8pOworICAgICAgICB9CisgICAgICAgIC8vIFdlIGNhbid0IGNhbGwgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT46Ok1lcmdlRnJvbSgpIGJlY2F1c2UKKyAgICAgICAgLy8gaXQgd291bGQgYXR0ZW1wdCB0byBhbGxvY2F0ZSBuZXcgb2JqZWN0cy4KKyAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlTGl0ZT4qIG90aGVyX3JlcGVhdGVkX21lc3NhZ2UgPQorICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLnJlcGVhdGVkX21lc3NhZ2VfdmFsdWU7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJfcmVwZWF0ZWRfbWVzc2FnZS0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgb3RoZXJfbWVzc2FnZSA9IG90aGVyX3JlcGVhdGVkX21lc3NhZ2UtPkdldChpKTsKKyAgICAgICAgICBNZXNzYWdlTGl0ZSogdGFyZ2V0ID0gZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlCisgICAgICAgICAgICAgICAgICAgLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+ID4oKTsKKyAgICAgICAgICBpZiAodGFyZ2V0ID09IE5VTEwpIHsKKyAgICAgICAgICAgIHRhcmdldCA9IG90aGVyX21lc3NhZ2UuTmV3KGFyZW5hXyk7CisgICAgICAgICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZCh0YXJnZXQpOworICAgICAgICAgIH0KKyAgICAgICAgICB0YXJnZXQtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbShvdGhlcl9tZXNzYWdlKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0gZWxzZSB7CisgICAgaWYgKCFvdGhlcl9leHRlbnNpb24uaXNfY2xlYXJlZCkgeworICAgICAgc3dpdGNoIChjcHBfdHlwZShvdGhlcl9leHRlbnNpb24udHlwZSkpIHsKKyNkZWZpbmUgSEFORExFX1RZUEUoVVBQRVJDQVNFLCBMT1dFUkNBU0UsIENBTUVMQ0FTRSkgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV8jI1VQUEVSQ0FTRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBTZXQjI0NBTUVMQ0FTRShudW1iZXIsIG90aGVyX2V4dGVuc2lvbi50eXBlLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uTE9XRVJDQVNFIyNfdmFsdWUsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBicmVhazsKKworICAgICAgICBIQU5ETEVfVFlQRSggSU5UMzIsICBpbnQzMiwgIEludDMyKTsKKyAgICAgICAgSEFORExFX1RZUEUoIElOVDY0LCAgaW50NjQsICBJbnQ2NCk7CisgICAgICAgIEhBTkRMRV9UWVBFKFVJTlQzMiwgdWludDMyLCBVSW50MzIpOworICAgICAgICBIQU5ETEVfVFlQRShVSU5UNjQsIHVpbnQ2NCwgVUludDY0KTsKKyAgICAgICAgSEFORExFX1RZUEUoIEZMT0FULCAgZmxvYXQsICBGbG9hdCk7CisgICAgICAgIEhBTkRMRV9UWVBFKERPVUJMRSwgZG91YmxlLCBEb3VibGUpOworICAgICAgICBIQU5ETEVfVFlQRSggIEJPT0wsICAgYm9vbCwgICBCb29sKTsKKyAgICAgICAgSEFORExFX1RZUEUoICBFTlVNLCAgIGVudW0sICAgRW51bSk7CisjdW5kZWYgSEFORExFX1RZUEUKKyAgICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgICAgU2V0U3RyaW5nKG51bWJlciwgb3RoZXJfZXh0ZW5zaW9uLnR5cGUsCisgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24uc3RyaW5nX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OkNQUFRZUEVfTUVTU0FHRTogeworICAgICAgICAgIEV4dGVuc2lvbiogZXh0ZW5zaW9uOworICAgICAgICAgIGJvb2wgaXNfbmV3ID0gTWF5YmVOZXdFeHRlbnNpb24obnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXh0ZW5zaW9uKTsKKyAgICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgICBleHRlbnNpb24tPnR5cGUgPSBvdGhlcl9leHRlbnNpb24udHlwZTsKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfcGFja2VkID0gb3RoZXJfZXh0ZW5zaW9uLmlzX3BhY2tlZDsKKyAgICAgICAgICAgIGV4dGVuc2lvbi0+aXNfcmVwZWF0ZWQgPSBmYWxzZTsKKyAgICAgICAgICAgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfbGF6eSkgeworICAgICAgICAgICAgICBleHRlbnNpb24tPmlzX2xhenkgPSB0cnVlOworICAgICAgICAgICAgICBleHRlbnNpb24tPmxhenltZXNzYWdlX3ZhbHVlID0KKyAgICAgICAgICAgICAgICAgIG90aGVyX2V4dGVuc2lvbi5sYXp5bWVzc2FnZV92YWx1ZS0+TmV3KGFyZW5hXyk7CisgICAgICAgICAgICAgIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPk1lcmdlRnJvbSgKKyAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubGF6eW1lc3NhZ2VfdmFsdWUpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7CisgICAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9CisgICAgICAgICAgICAgICAgICBvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZS0+TmV3KGFyZW5hXyk7CisgICAgICAgICAgICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZS0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICAgKm90aGVyX2V4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgR09PR0xFX0RDSEVDS19FUShleHRlbnNpb24tPnR5cGUsIG90aGVyX2V4dGVuc2lvbi50eXBlKTsKKyAgICAgICAgICAgIEdPT0dMRV9EQ0hFQ0tfRVEoZXh0ZW5zaW9uLT5pc19wYWNrZWQsb3RoZXJfZXh0ZW5zaW9uLmlzX3BhY2tlZCk7CisgICAgICAgICAgICBHT09HTEVfRENIRUNLKCFleHRlbnNpb24tPmlzX3JlcGVhdGVkKTsKKyAgICAgICAgICAgIGlmIChvdGhlcl9leHRlbnNpb24uaXNfbGF6eSkgeworICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TWVyZ2VGcm9tKAorICAgICAgICAgICAgICAgICAgICAqb3RoZXJfZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlKTsKKyAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWUtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgICAgICAgICAgKmV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSkpOworICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBpZiAoZXh0ZW5zaW9uLT5pc19sYXp5KSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5sYXp5bWVzc2FnZV92YWx1ZS0+TXV0YWJsZU1lc3NhZ2UoCisgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSktPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgKKyAgICAgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7CisgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oCisgICAgICAgICAgICAgICAgICAgICpvdGhlcl9leHRlbnNpb24ubWVzc2FnZV92YWx1ZSk7CisgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgICAgICAgICAgYnJlYWs7CiAgICAgICAgIH0KICAgICAgIH0KICAgICB9CkBAIC02ODgsNyArMTAxMyw3MyBAQAogfQogCiB2b2lkIEV4dGVuc2lvblNldDo6U3dhcChFeHRlbnNpb25TZXQqIHgpIHsKLSAgZXh0ZW5zaW9uc18uc3dhcCh4LT5leHRlbnNpb25zXyk7CisgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IHgtPkdldEFyZW5hTm9WaXJ0dWFsKCkpIHsKKyAgICBleHRlbnNpb25zXy5zd2FwKHgtPmV4dGVuc2lvbnNfKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBUT0RPKGNmYWxsaW4sIHJvaGFuYW5pbCk6IFdlIG1heWJlIGFibGUgdG8gb3B0aW1pemUgYSBjYXNlIHdoZXJlIHdlIGFyZQorICAgIC8vIHN3YXBwaW5nIGZyb20gaGVhcCB0byBhcmVuYS1hbGxvY2F0ZWQgZXh0ZW5zaW9uIHNldCwgYnkganVzdCBPd24oKSdpbmcKKyAgICAvLyB0aGUgZXh0ZW5zaW9ucy4KKyAgICBFeHRlbnNpb25TZXQgZXh0ZW5zaW9uX3NldDsKKyAgICBleHRlbnNpb25fc2V0Lk1lcmdlRnJvbSgqeCk7CisgICAgeC0+Q2xlYXIoKTsKKyAgICB4LT5NZXJnZUZyb20oKnRoaXMpOworICAgIENsZWFyKCk7CisgICAgTWVyZ2VGcm9tKGV4dGVuc2lvbl9zZXQpOworICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpTd2FwRXh0ZW5zaW9uKEV4dGVuc2lvblNldCogb3RoZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgbnVtYmVyKSB7CisgIGlmICh0aGlzID09IG90aGVyKSByZXR1cm47CisgIG1hcDxpbnQsIEV4dGVuc2lvbj46Oml0ZXJhdG9yIHRoaXNfaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3Igb3RoZXJfaXRlciA9IG90aGVyLT5leHRlbnNpb25zXy5maW5kKG51bWJlcik7CisKKyAgaWYgKHRoaXNfaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSAmJgorICAgICAgb3RoZXJfaXRlciA9PSBvdGhlci0+ZXh0ZW5zaW9uc18uZW5kKCkpIHsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAodGhpc19pdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpICYmCisgICAgICBvdGhlcl9pdGVyICE9IG90aGVyLT5leHRlbnNpb25zXy5lbmQoKSkgeworICAgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKSB7CisgICAgICB1c2luZyBzdGQ6OnN3YXA7CisgICAgICBzd2FwKHRoaXNfaXRlci0+c2Vjb25kLCBvdGhlcl9pdGVyLT5zZWNvbmQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBUT0RPKGNmYWxsaW4sIHJvaGFuYW5pbCk6IFdlIGNvdWxkIGZ1cnRoZXIgb3B0aW1pemUgdGhlc2UgY2FzZXMsCisgICAgICAvLyBlc3BlY2lhbGx5IGF2b2lkIGNyZWF0aW9uIG9mIEV4dGVuc2lvblNldCwgYW5kIG1vdmUgTWVyZ2VGcm9tIGxvZ2ljCisgICAgICAvLyBpbnRvIEV4dGVuc2lvbnMgaXRzZWxmICh3aGljaCB0YWtlcyBhcmVuYSBhcyBhbiBhcmd1bWVudCkuCisgICAgICAvLyBXZSBkbyBpdCB0aGlzIHdheSB0byByZXVzZSB0aGUgY29weS1hY3Jvc3MtYXJlbmFzIGxvZ2ljIGFscmVhZHkKKyAgICAgIC8vIGltcGxlbWVudGVkIGluIEV4dGVuc2lvblNldCdzIE1lcmdlRnJvbS4KKyAgICAgIEV4dGVuc2lvblNldCB0ZW1wOworICAgICAgdGVtcC5JbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShudW1iZXIsIG90aGVyX2l0ZXItPnNlY29uZCk7CisgICAgICBtYXA8aW50LCBFeHRlbnNpb24+OjppdGVyYXRvciB0ZW1wX2l0ZXIgPSB0ZW1wLmV4dGVuc2lvbnNfLmZpbmQobnVtYmVyKTsKKyAgICAgIG90aGVyX2l0ZXItPnNlY29uZC5DbGVhcigpOworICAgICAgb3RoZXItPkludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKG51bWJlciwgdGhpc19pdGVyLT5zZWNvbmQpOworICAgICAgdGhpc19pdGVyLT5zZWNvbmQuQ2xlYXIoKTsKKyAgICAgIEludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKG51bWJlciwgdGVtcF9pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICByZXR1cm47CisgIH0KKworICBpZiAodGhpc19pdGVyID09IGV4dGVuc2lvbnNfLmVuZCgpKSB7CisgICAgaWYgKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gb3RoZXItPkdldEFyZW5hTm9WaXJ0dWFsKCkpIHsKKyAgICAgIGV4dGVuc2lvbnNfLmluc2VydChzdGQ6Om1ha2VfcGFpcihudW1iZXIsIG90aGVyX2l0ZXItPnNlY29uZCkpOworICAgIH0gZWxzZSB7CisgICAgICBJbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShudW1iZXIsIG90aGVyX2l0ZXItPnNlY29uZCk7CisgICAgfQorICAgIG90aGVyLT5leHRlbnNpb25zXy5lcmFzZShudW1iZXIpOworICAgIHJldHVybjsKKyAgfQorCisgIGlmIChvdGhlcl9pdGVyID09IG90aGVyLT5leHRlbnNpb25zXy5lbmQoKSkgeworICAgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpID09IG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKSB7CisgICAgICBvdGhlci0+ZXh0ZW5zaW9uc18uaW5zZXJ0KHN0ZDo6bWFrZV9wYWlyKG51bWJlciwgdGhpc19pdGVyLT5zZWNvbmQpKTsKKyAgICB9IGVsc2UgeworICAgICAgb3RoZXItPkludGVybmFsRXh0ZW5zaW9uTWVyZ2VGcm9tKG51bWJlciwgdGhpc19pdGVyLT5zZWNvbmQpOworICAgIH0KKyAgICBleHRlbnNpb25zXy5lcmFzZShudW1iZXIpOworICAgIHJldHVybjsKKyAgfQogfQogCiBib29sIEV4dGVuc2lvblNldDo6SXNJbml0aWFsaXplZCgpIGNvbnN0IHsKQEAgLTcwNiw3ICsxMDk3LDExIEBACiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CiAgICAgICAgIGlmICghZXh0ZW5zaW9uLmlzX2NsZWFyZWQpIHsKLSAgICAgICAgICBpZiAoIWV4dGVuc2lvbi5tZXNzYWdlX3ZhbHVlLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAoZXh0ZW5zaW9uLmlzX2xhenkpIHsKKyAgICAgICAgICAgIGlmICghZXh0ZW5zaW9uLmxhenltZXNzYWdlX3ZhbHVlLT5Jc0luaXRpYWxpemVkKCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCFleHRlbnNpb24ubWVzc2FnZV92YWx1ZS0+SXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAgICAgfQpAQCAtNzE1LDI3ICsxMTEwLDYwIEBACiAgIHJldHVybiB0cnVlOwogfQogCitib29sIEV4dGVuc2lvblNldDo6RmluZEV4dGVuc2lvbkluZm9Gcm9tVGFnKAorICAgIHVpbnQzMiB0YWcsIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwgaW50KiBmaWVsZF9udW1iZXIsCisgICAgRXh0ZW5zaW9uSW5mbyogZXh0ZW5zaW9uLCBib29sKiB3YXNfcGFja2VkX29uX3dpcmUpIHsKKyAgKmZpZWxkX251bWJlciA9IFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpOworICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisgIHJldHVybiBGaW5kRXh0ZW5zaW9uSW5mb0Zyb21GaWVsZE51bWJlcih3aXJlX3R5cGUsICpmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25fZmluZGVyLCBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3YXNfcGFja2VkX29uX3dpcmUpOworfQorCitib29sIEV4dGVuc2lvblNldDo6RmluZEV4dGVuc2lvbkluZm9Gcm9tRmllbGROdW1iZXIoCisgICAgaW50IHdpcmVfdHlwZSwgaW50IGZpZWxkX251bWJlciwgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAorICAgIEV4dGVuc2lvbkluZm8qIGV4dGVuc2lvbiwgYm9vbCogd2FzX3BhY2tlZF9vbl93aXJlKSB7CisgIGlmICghZXh0ZW5zaW9uX2ZpbmRlci0+RmluZChmaWVsZF9udW1iZXIsIGV4dGVuc2lvbikpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgZXhwZWN0ZWRfd2lyZV90eXBlID0KKyAgICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZUZvckZpZWxkVHlwZShyZWFsX3R5cGUoZXh0ZW5zaW9uLT50eXBlKSk7CisKKyAgLy8gQ2hlY2sgaWYgdGhpcyBpcyBhIHBhY2tlZCBmaWVsZC4KKyAgKndhc19wYWNrZWRfb25fd2lyZSA9IGZhbHNlOworICBpZiAoZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCAmJgorICAgICAgd2lyZV90eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEICYmCisgICAgICBpc19wYWNrYWJsZShleHBlY3RlZF93aXJlX3R5cGUpKSB7CisgICAgKndhc19wYWNrZWRfb25fd2lyZSA9IHRydWU7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgLy8gT3RoZXJ3aXNlIHRoZSB3aXJlIHR5cGUgbXVzdCBtYXRjaC4KKyAgcmV0dXJuIGV4cGVjdGVkX3dpcmVfdHlwZSA9PSB3aXJlX3R5cGU7Cit9CisKIGJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcikgewotICBpbnQgbnVtYmVyID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7Ci0gIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKTsKLQorICBpbnQgbnVtYmVyOworICBib29sIHdhc19wYWNrZWRfb25fd2lyZTsKICAgRXh0ZW5zaW9uSW5mbyBleHRlbnNpb247Ci0gIGJvb2wgaXNfdW5rbm93bjsKLSAgaWYgKCFleHRlbnNpb25fZmluZGVyLT5GaW5kKG51bWJlciwgJmV4dGVuc2lvbikpIHsKLSAgICBpc191bmtub3duID0gdHJ1ZTsKLSAgfSBlbHNlIGlmIChleHRlbnNpb24uaXNfcGFja2VkKSB7Ci0gICAgaXNfdW5rbm93biA9ICh3aXJlX3R5cGUgIT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICBpZiAoIUZpbmRFeHRlbnNpb25JbmZvRnJvbVRhZygKKyAgICAgIHRhZywgZXh0ZW5zaW9uX2ZpbmRlciwgJm51bWJlciwgJmV4dGVuc2lvbiwgJndhc19wYWNrZWRfb25fd2lyZSkpIHsKKyAgICByZXR1cm4gZmllbGRfc2tpcHBlci0+U2tpcEZpZWxkKGlucHV0LCB0YWcpOwogICB9IGVsc2UgewotICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBleHBlY3RlZF93aXJlX3R5cGUgPQotICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGVGb3JGaWVsZFR5cGUocmVhbF90eXBlKGV4dGVuc2lvbi50eXBlKSk7Ci0gICAgaXNfdW5rbm93biA9ICh3aXJlX3R5cGUgIT0gZXhwZWN0ZWRfd2lyZV90eXBlKTsKKyAgICByZXR1cm4gUGFyc2VGaWVsZFdpdGhFeHRlbnNpb25JbmZvKAorICAgICAgICBudW1iZXIsIHdhc19wYWNrZWRfb25fd2lyZSwgZXh0ZW5zaW9uLCBpbnB1dCwgZmllbGRfc2tpcHBlcik7CiAgIH0KK30KIAotICBpZiAoaXNfdW5rbm93bikgewotICAgIGZpZWxkX3NraXBwZXItPlNraXBGaWVsZChpbnB1dCwgdGFnKTsKLSAgfSBlbHNlIGlmIChleHRlbnNpb24uaXNfcGFja2VkKSB7Citib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZFdpdGhFeHRlbnNpb25JbmZvKAorICAgIGludCBudW1iZXIsIGJvb2wgd2FzX3BhY2tlZF9vbl93aXJlLCBjb25zdCBFeHRlbnNpb25JbmZvJiBleHRlbnNpb24sCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcikgeworICAvLyBFeHBsaWNpdGx5IG5vdCByZWFkIGV4dGVuc2lvbi5pc19wYWNrZWQsIGluc3RlYWQgY2hlY2sgd2hldGhlciB0aGUgZmllbGQKKyAgLy8gd2FzIGVuY29kZWQgaW4gcGFja2VkIGZvcm0gb24gdGhlIHdpcmUuCisgIGlmICh3YXNfcGFja2VkX29uX3dpcmUpIHsKICAgICB1aW50MzIgc2l6ZTsKICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnNpemUpKSByZXR1cm4gZmFsc2U7CiAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gaW5wdXQtPlB1c2hMaW1pdChzaXplKTsKQEAgLTc0OSw3ICsxMTc3LDggQEAKICAgICAgICAgICAgICAgICAgIENQUF9MT1dFUkNBU0UsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFPiggICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIEFkZCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSwgdmFsdWUsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKTsgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5pc19wYWNrZWQsIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgIGJyZWFrCiAKQEAgLTc3NSw4ICsxMjA0LDExIEBACiAgICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIGlmIChleHRlbnNpb24uZW51bV92YWxpZGl0eV9jaGVjay5mdW5jKAogICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmVudW1fdmFsaWRpdHlfY2hlY2suYXJnLCB2YWx1ZSkpIHsKLSAgICAgICAgICAgIEFkZEVudW0obnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNLCB0cnVlLCB2YWx1ZSwKLSAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpOworICAgICAgICAgICAgQWRkRW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIGV4dGVuc2lvbi5pc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgIHZhbHVlLCBleHRlbnNpb24uZGVzY3JpcHRvcik7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEludmFsaWQgdmFsdWUuICBUcmVhdCBhcyB1bmtub3duLgorICAgICAgICAgICAgZmllbGRfc2tpcHBlci0+U2tpcFVua25vd25FbnVtKG51bWJlciwgdmFsdWUpOwogICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKQEAgLTc5OCw5ICsxMjMwLDEwIEBACiAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgIENQUF9MT1dFUkNBU0UsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFPiggICAgICAgICAgICAgIFwKICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChleHRlbnNpb24uaXNfcmVwZWF0ZWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgIEFkZCMjQ1BQX0NBTUVMQ0FTRShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFXyMjVVBQRVJDQVNFLCAgICAgICAgIFwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UsIHZhbHVlLCBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbi5pc19wYWNrZWQsIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgU2V0IyNDUFBfQ0FNRUxDQVNFKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfIyNVUFBFUkNBU0UsIHZhbHVlLCAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTgzMiw3ICsxMjY1LDcgQEAKICAgICAgICAgICAvLyBJbnZhbGlkIHZhbHVlLiAgVHJlYXQgYXMgdW5rbm93bi4KICAgICAgICAgICBmaWVsZF9za2lwcGVyLT5Ta2lwVW5rbm93bkVudW0obnVtYmVyLCB2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSBpZiAoZXh0ZW5zaW9uLmlzX3JlcGVhdGVkKSB7Ci0gICAgICAgICAgQWRkRW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIGZhbHNlLCB2YWx1ZSwKKyAgICAgICAgICBBZGRFbnVtKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTSwgZXh0ZW5zaW9uLmlzX3BhY2tlZCwgdmFsdWUsCiAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7CiAgICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgU2V0RW51bShudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0VOVU0sIHZhbHVlLApAQCAtODUyLDggKzEyODUsOCBAQAogCiAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JZVEVTOiAgewogICAgICAgICBzdHJpbmcqIHZhbHVlID0gZXh0ZW5zaW9uLmlzX3JlcGVhdGVkID8KLSAgICAgICAgICBBZGRTdHJpbmcobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9TVFJJTkcsIGV4dGVuc2lvbi5kZXNjcmlwdG9yKSA6Ci0gICAgICAgICAgTXV0YWJsZVN0cmluZyhudW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX1NUUklORywKKyAgICAgICAgICBBZGRTdHJpbmcobnVtYmVyLCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9CWVRFUywgZXh0ZW5zaW9uLmRlc2NyaXB0b3IpIDoKKyAgICAgICAgICBNdXRhYmxlU3RyaW5nKG51bWJlciwgV2lyZUZvcm1hdExpdGU6OlRZUEVfQllURVMsCiAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb24uZGVzY3JpcHRvcik7CiAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRCeXRlcyhpbnB1dCwgdmFsdWUpKSByZXR1cm4gZmFsc2U7CiAgICAgICAgIGJyZWFrOwpAQCAtODg1LDEzMiArMTMxOCwyOSBAQAogfQogCiBib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlKSB7CisgIEZpZWxkU2tpcHBlciBza2lwcGVyOworICBHZW5lcmF0ZWRFeHRlbnNpb25GaW5kZXIgZmluZGVyKGNvbnRhaW5pbmdfdHlwZSk7CisgIHJldHVybiBQYXJzZUZpZWxkKHRhZywgaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKK30KKworYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKLSAgRmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiB1bmtub3duX2ZpZWxkcykgeworICBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlciBza2lwcGVyKHVua25vd25fZmllbGRzKTsKICAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOwogICByZXR1cm4gUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZmluZGVyLCAmc2tpcHBlcik7CiB9CiAKIC8vIERlZmluZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KLS8vIGJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkSGVhdnkodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpCi0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcikgewotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOwotICAgIHN3aXRjaCAodGFnKSB7Ci0gICAgICBjYXNlIDA6Ci0gICAgICAgIHJldHVybiB0cnVlOwotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWc6Ci0gICAgICAgIGlmICghUGFyc2VNZXNzYWdlU2V0SXRlbShpbnB1dCwgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgICBkZWZhdWx0OgotICAgICAgICBpZiAoIVBhcnNlRmllbGQodGFnLCBpbnB1dCwgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7Ci0gICAgfQotICB9Ci19Ci0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7Ci0gIEZpZWxkU2tpcHBlciBza2lwcGVyKHVua25vd25fZmllbGRzKTsKLSAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOwotICByZXR1cm4gUGFyc2VNZXNzYWdlU2V0KGlucHV0LCAmZmluZGVyLCAmc2tpcHBlcik7Ci19CisvLyBib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSogY29udGFpbmluZ190eXBlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykKIAogLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgotLy8gYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlTWVzc2FnZVNldEhlYXZ5KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLS8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7Ci0KLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXRJdGVtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcikgewotICAvLyBUT0RPKGtlbnRvbik6ICBJdCB3b3VsZCBiZSBuaWNlIHRvIHNoYXJlIGNvZGUgYmV0d2VlbiB0aGlzIGFuZAotICAvLyBXaXJlRm9ybWF0TGl0ZTo6UGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRJdGVtKCksIGJ1dCBJIHRoaW5rIHRoZQotICAvLyBkaWZmZXJlbmNlcyB3b3VsZCBiZSBoYXJkIHRvIGZhY3RvciBvdXQuCi0KLSAgLy8gVGhpcyBtZXRob2QgcGFyc2VzIGEgZ3JvdXAgd2hpY2ggc2hvdWxkIGNvbnRhaW4gdHdvIGZpZWxkczoKLSAgLy8gICByZXF1aXJlZCBpbnQzMiB0eXBlX2lkID0gMjsKLSAgLy8gICByZXF1aXJlZCBkYXRhIG1lc3NhZ2UgPSAzOwotCi0gIC8vIE9uY2Ugd2Ugc2VlIGEgdHlwZV9pZCwgd2UnbGwgY29uc3RydWN0IGEgZmFrZSB0YWcgZm9yIHRoaXMgZXh0ZW5zaW9uCi0gIC8vIHdoaWNoIGlzIHRoZSB0YWcgaXQgd291bGQgaGF2ZSBoYWQgdW5kZXIgdGhlIHByb3RvMiBleHRlbnNpb25zIHdpcmUKLSAgLy8gZm9ybWF0LgotICB1aW50MzIgZmFrZV90YWcgPSAwOwotCi0gIC8vIElmIHdlIHNlZSBtZXNzYWdlIGRhdGEgYmVmb3JlIHRoZSB0eXBlX2lkLCB3ZSdsbCBhcHBlbmQgaXQgdG8gdGhpcyBzbwotICAvLyB3ZSBjYW4gcGFyc2UgaXQgbGF0ZXIuICBUaGlzIHdpbGwgcHJvYmFibHkgbmV2ZXIgaGFwcGVuIGluIHByYWN0aWNlLAotICAvLyBhcyBubyBNZXNzYWdlU2V0IGVuY29kZXIgSSBrbm93IG9mIHdyaXRlcyB0aGUgbWVzc2FnZSBiZWZvcmUgdGhlIHR5cGUgSUQuCi0gIC8vIEJ1dCwgaXQncyB0ZWNobmljYWxseSB2YWxpZCBzbyB3ZSBzaG91bGQgYWxsb3cgaXQuCi0gIC8vIFRPRE8oa2VudG9uKTogIFVzZSBhIENvcmQgaW5zdGVhZD8gIERvIEkgY2FyZT8KLSAgc3RyaW5nIG1lc3NhZ2VfZGF0YTsKLQotICB3aGlsZSAodHJ1ZSkgewotICAgIHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOwotICAgIGlmICh0YWcgPT0gMCkgcmV0dXJuIGZhbHNlOwotCi0gICAgc3dpdGNoICh0YWcpIHsKLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnOiB7Ci0gICAgICAgIHVpbnQzMiB0eXBlX2lkOwotICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnR5cGVfaWQpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgIGZha2VfdGFnID0gV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcodHlwZV9pZCwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLQotICAgICAgICBpZiAoIW1lc3NhZ2VfZGF0YS5lbXB0eSgpKSB7Ci0gICAgICAgICAgLy8gV2Ugc2F3IHNvbWUgbWVzc2FnZSBkYXRhIGJlZm9yZSB0aGUgdHlwZV9pZC4gIEhhdmUgdG8gcGFyc2UgaXQKLSAgICAgICAgICAvLyBub3cuCi0gICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gc3ViX2lucHV0KAotICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4obWVzc2FnZV9kYXRhLmRhdGEoKSksCi0gICAgICAgICAgICAgIG1lc3NhZ2VfZGF0YS5zaXplKCkpOwotICAgICAgICAgIGlmICghUGFyc2VGaWVsZChmYWtlX3RhZywgJnN1Yl9pbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKLSAgICAgICAgICAgIHJldHVybiBmYWxzZTsKLSAgICAgICAgICB9Ci0gICAgICAgICAgbWVzc2FnZV9kYXRhLmNsZWFyKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBicmVhazsKLSAgICAgIH0KLQotICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnOiB7Ci0gICAgICAgIGlmIChmYWtlX3RhZyA9PSAwKSB7Ci0gICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzZWVuIGEgdHlwZV9pZCB5ZXQuICBBcHBlbmQgdGhpcyBkYXRhIHRvIG1lc3NhZ2VfZGF0YS4KLSAgICAgICAgICBzdHJpbmcgdGVtcDsKLSAgICAgICAgICB1aW50MzIgbGVuZ3RoOwotICAgICAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICAgIGlmICghaW5wdXQtPlJlYWRTdHJpbmcoJnRlbXAsIGxlbmd0aCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBtZXNzYWdlX2RhdGEuYXBwZW5kKHRlbXApOwotICAgICAgICB9IGVsc2UgewotICAgICAgICAgIC8vIEFscmVhZHkgc2F3IHR5cGVfaWQsIHNvIHdlIGNhbiBwYXJzZSB0aGlzIGRpcmVjdGx5LgotICAgICAgICAgIGlmICghUGFyc2VGaWVsZChmYWtlX3RhZywgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7Ci0gICAgICAgICAgICByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgfQotICAgICAgICB9Ci0KLSAgICAgICAgYnJlYWs7Ci0gICAgICB9Ci0KLSAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZzogewotICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KLQotICAgICAgZGVmYXVsdDogewotICAgICAgICBpZiAoIWZpZWxkX3NraXBwZXItPlNraXBGaWVsZChpbnB1dCwgdGFnKSkgcmV0dXJuIGZhbHNlOwotICAgICAgfQotICAgIH0KLSAgfQotfQorLy8gYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlTWVzc2FnZVNldChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOwogCiB2b2lkIEV4dGVuc2lvblNldDo6U2VyaWFsaXplV2l0aENhY2hlZFNpemVzKAogICAgIGludCBzdGFydF9maWVsZF9udW1iZXIsIGludCBlbmRfZmllbGRfbnVtYmVyLApAQCAtMTAyMywxNCArMTM1Myw2IEBACiAgIH0KIH0KIAotdm9pZCBFeHRlbnNpb25TZXQ6OlNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXMoCi0gICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKLSAgbWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlcjsKLSAgZm9yIChpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7Ci0gICAgaXRlci0+c2Vjb25kLlNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzKGl0ZXItPmZpcnN0LCBvdXRwdXQpOwotICB9Ci19Ci0KIGludCBFeHRlbnNpb25TZXQ6OkJ5dGVTaXplKCkgY29uc3QgewogICBpbnQgdG90YWxfc2l6ZSA9IDA7CiAKQEAgLTEwNDIsMTcgKzEzNjQsNiBAQAogICByZXR1cm4gdG90YWxfc2l6ZTsKIH0KIAotaW50IEV4dGVuc2lvblNldDo6TWVzc2FnZVNldEJ5dGVTaXplKCkgY29uc3QgewotICBpbnQgdG90YWxfc2l6ZSA9IDA7Ci0KLSAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKLSAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKLSAgICB0b3RhbF9zaXplICs9IGl0ZXItPnNlY29uZC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGl0ZXItPmZpcnN0KTsKLSAgfQotCi0gIHJldHVybiB0b3RhbF9zaXplOwotfQotCiAvLyBEZWZpbmVkIGluIGV4dGVuc2lvbl9zZXRfaGVhdnkuY2MuCiAvLyBpbnQgRXh0ZW5zaW9uU2V0OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QKIApAQCAtMTA2MCw3ICsxMzcxLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uKiogcmVzdWx0KSB7CiAgIHBhaXI8bWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IsIGJvb2w+IGluc2VydF9yZXN1bHQgPQotICAgICAgZXh0ZW5zaW9uc18uaW5zZXJ0KG1ha2VfcGFpcihudW1iZXIsIEV4dGVuc2lvbigpKSk7CisgICAgICBleHRlbnNpb25zXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIobnVtYmVyLCBFeHRlbnNpb24oKSkpOwogICAqcmVzdWx0ID0gJmluc2VydF9yZXN1bHQuZmlyc3QtPnNlY29uZDsKICAgKCpyZXN1bHQpLT5kZXNjcmlwdG9yID0gZGVzY3JpcHRvcjsKICAgcmV0dXJuIGluc2VydF9yZXN1bHQuc2Vjb25kOwpAQCAtMTA5Niw3ICsxNDA3LDExIEBACiAgICAgICAgICAgc3RyaW5nX3ZhbHVlLT5jbGVhcigpOwogICAgICAgICAgIGJyZWFrOwogICAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgICAgbWVzc2FnZV92YWx1ZS0+Q2xlYXIoKTsKKyAgICAgICAgICBpZiAoaXNfbGF6eSkgeworICAgICAgICAgICAgbGF6eW1lc3NhZ2VfdmFsdWUtPkNsZWFyKCk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG1lc3NhZ2VfdmFsdWUtPkNsZWFyKCk7CisgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICBkZWZhdWx0OgogICAgICAgICAgIC8vIE5vIG5lZWQgdG8gZG8gYW55dGhpbmcuICBHZXQqKCkgd2lsbCByZXR1cm4gdGhlIGRlZmF1bHQgdmFsdWUKQEAgLTEyMDgsNDAgKzE1MjMsMTggQEAKICAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgICpzdHJpbmdfdmFsdWUpOwogICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICAgZW51bV92YWx1ZSk7CiAgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsICptZXNzYWdlX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgKm1lc3NhZ2VfdmFsdWUpOwogI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0U6CisgICAgICAgIGlmIChpc19sYXp5KSB7CisgICAgICAgICAgbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZShudW1iZXIsIG91dHB1dCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZShudW1iZXIsICptZXNzYWdlX3ZhbHVlLCBvdXRwdXQpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogfQogCi12b2lkIEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpTZXJpYWxpemVNZXNzYWdlU2V0SXRlbVdpdGhDYWNoZWRTaXplcygKLSAgICBpbnQgbnVtYmVyLAotICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSBjb25zdCB7Ci0gIGlmICh0eXBlICE9IFdpcmVGb3JtYXRMaXRlOjpUWVBFX01FU1NBR0UgfHwgaXNfcmVwZWF0ZWQpIHsKLSAgICAvLyBOb3QgYSB2YWxpZCBNZXNzYWdlU2V0IGV4dGVuc2lvbiwgYnV0IHNlcmlhbGl6ZSBpdCB0aGUgbm9ybWFsIHdheS4KLSAgICBTZXJpYWxpemVGaWVsZFdpdGhDYWNoZWRTaXplcyhudW1iZXIsIG91dHB1dCk7Ci0gICAgcmV0dXJuOwotICB9Ci0KLSAgaWYgKGlzX2NsZWFyZWQpIHJldHVybjsKLQotICAvLyBTdGFydCBncm91cC4KLSAgb3V0cHV0LT5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWcpOwotCi0gIC8vIFdyaXRlIHR5cGUgSUQuCi0gIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWROdW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1iZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvdXRwdXQpOwotICAvLyBXcml0ZSBtZXNzYWdlLgotICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAotICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwKLSAgICAgICptZXNzYWdlX3ZhbHVlLAotICAgICAgb3V0cHV0KTsKLQotICAvLyBFbmQgZ3JvdXAuCi0gIG91dHB1dC0+V3JpdGVUYWcoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZyk7Ci19Ci0KIGludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6Qnl0ZVNpemUoaW50IG51bWJlcikgY29uc3QgewogICBpbnQgcmVzdWx0ID0gMDsKIApAQCAtMTM1NSw4ICsxNjQ4LDE2IEBACiAgICAgICBIQU5ETEVfVFlQRSggICBCWVRFUywgICAgQnl0ZXMsICAqc3RyaW5nX3ZhbHVlKTsKICAgICAgIEhBTkRMRV9UWVBFKCAgICBFTlVNLCAgICAgRW51bSwgICAgIGVudW1fdmFsdWUpOwogICAgICAgSEFORExFX1RZUEUoICAgR1JPVVAsICAgIEdyb3VwLCAqbWVzc2FnZV92YWx1ZSk7Ci0gICAgICBIQU5ETEVfVFlQRSggTUVTU0FHRSwgIE1lc3NhZ2UsICptZXNzYWdlX3ZhbHVlKTsKICN1bmRlZiBIQU5ETEVfVFlQRQorICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFOiB7CisgICAgICAgIGlmIChpc19sYXp5KSB7CisgICAgICAgICAgaW50IHNpemUgPSBsYXp5bWVzc2FnZV92YWx1ZS0+Qnl0ZVNpemUoKTsKKyAgICAgICAgICByZXN1bHQgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoc2l6ZSkgKyBzaXplOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJlc3VsdCArPSBXaXJlRm9ybWF0TGl0ZTo6TWVzc2FnZVNpemUoKm1lc3NhZ2VfdmFsdWUpOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgfQogCiAgICAgICAvLyBTdHVmZiB3aXRoIGZpeGVkIHNpemUuCiAjZGVmaW5lIEhBTkRMRV9UWVBFKFVQUEVSQ0FTRSwgQ0FNRUxDQVNFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKQEAgLTEzNzcsMjkgKzE2NzgsNiBAQAogICByZXR1cm4gcmVzdWx0OwogfQogCi1pbnQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246Ok1lc3NhZ2VTZXRJdGVtQnl0ZVNpemUoaW50IG51bWJlcikgY29uc3QgewotICBpZiAodHlwZSAhPSBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9NRVNTQUdFIHx8IGlzX3JlcGVhdGVkKSB7Ci0gICAgLy8gTm90IGEgdmFsaWQgTWVzc2FnZVNldCBleHRlbnNpb24sIGJ1dCBjb21wdXRlIHRoZSBieXRlIHNpemUgZm9yIGl0IHRoZQotICAgIC8vIG5vcm1hbCB3YXkuCi0gICAgcmV0dXJuIEJ5dGVTaXplKG51bWJlcik7Ci0gIH0KLQotICBpZiAoaXNfY2xlYXJlZCkgcmV0dXJuIDA7Ci0KLSAgaW50IG91cl9zaXplID0gV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVRhZ3NTaXplOwotCi0gIC8vIHR5cGVfaWQKLSAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobnVtYmVyKTsKLQotICAvLyBtZXNzYWdlCi0gIGludCBtZXNzYWdlX3NpemUgPSBtZXNzYWdlX3ZhbHVlLT5CeXRlU2l6ZSgpOwotCi0gIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKG1lc3NhZ2Vfc2l6ZSk7Ci0gIG91cl9zaXplICs9IG1lc3NhZ2Vfc2l6ZTsKLQotICByZXR1cm4gb3VyX3NpemU7Ci19Ci0KIGludCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6R2V0U2l6ZSgpIGNvbnN0IHsKICAgR09PR0xFX0RDSEVDSyhpc19yZXBlYXRlZCk7CiAgIHN3aXRjaCAoY3BwX3R5cGUodHlwZSkpIHsKQEAgLTE0MjQsNiArMTcwMiw4IEBACiAgIHJldHVybiAwOwogfQogCisvLyBUaGlzIGZ1bmN0aW9uIGRlbGV0ZXMgYWxsIGFsbG9jYXRlZCBvYmplY3RzLiBUaGlzIGZ1bmN0aW9uIHNob3VsZCBiZSBvbmx5CisvLyBjYWxsZWQgaWYgdGhlIEV4dGVuc2lvbiB3YXMgY3JlYXRlZCB3aXRoIGFuIGFyZW5hLgogdm9pZCBFeHRlbnNpb25TZXQ6OkV4dGVuc2lvbjo6RnJlZSgpIHsKICAgaWYgKGlzX3JlcGVhdGVkKSB7CiAgICAgc3dpdGNoIChjcHBfdHlwZSh0eXBlKSkgewpAQCAtMTQ1MCw3ICsxNzMwLDExIEBACiAgICAgICAgIGRlbGV0ZSBzdHJpbmdfdmFsdWU7CiAgICAgICAgIGJyZWFrOwogICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBkZWxldGUgbWVzc2FnZV92YWx1ZTsKKyAgICAgICAgaWYgKGlzX2xhenkpIHsKKyAgICAgICAgICBkZWxldGUgbGF6eW1lc3NhZ2VfdmFsdWU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgZGVsZXRlIG1lc3NhZ2VfdmFsdWU7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICBkZWZhdWx0OgogICAgICAgICBicmVhazsKQEAgLTE0NjEsNiArMTc0NSw3MSBAQAogLy8gRGVmaW5lZCBpbiBleHRlbnNpb25fc2V0X2hlYXZ5LmNjLgogLy8gaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QKIAorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBEZWZhdWx0IHJlcGVhdGVkIGZpZWxkIGluc3RhbmNlcyBmb3IgaXRlcmF0b3ItY29tcGF0aWJsZSBhY2Nlc3NvcnMKKworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZXBlYXRlZF9wcmltaXRpdmVfZ2VuZXJpY190eXBlX3RyYWl0c19vbmNlX2luaXRfKTsKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UocmVwZWF0ZWRfc3RyaW5nX3R5cGVfdHJhaXRzX29uY2VfaW5pdF8pOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShyZXBlYXRlZF9tZXNzYWdlX2dlbmVyaWNfdHlwZV90cmFpdHNfb25jZV9pbml0Xyk7CisKK3ZvaWQgUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpIHsKKyAgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl8gPSBuZXcgUmVwZWF0ZWRGaWVsZDxpbnQzMj47CisgIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfaW50NjRfID0gbmV3IFJlcGVhdGVkRmllbGQ8aW50NjQ+OworICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX3VpbnQzMl8gPSBuZXcgUmVwZWF0ZWRGaWVsZDx1aW50MzI+OworICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX3VpbnQ2NF8gPSBuZXcgUmVwZWF0ZWRGaWVsZDx1aW50NjQ+OworICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2RvdWJsZV8gPSBuZXcgUmVwZWF0ZWRGaWVsZDxkb3VibGU+OworICBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2Zsb2F0XyA9IG5ldyBSZXBlYXRlZEZpZWxkPGZsb2F0PjsKKyAgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9ib29sXyA9IG5ldyBSZXBlYXRlZEZpZWxkPGJvb2w+OworICBPblNodXRkb3duKCZEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKTsKK30KKwordm9pZCBSZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCkgeworICBkZWxldGUgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl87CisgIGRlbGV0ZSBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2ludDY0XzsKKyAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfdWludDMyXzsKKyAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfdWludDY0XzsKKyAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZG91YmxlXzsKKyAgZGVsZXRlIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZmxvYXRfOworICBkZWxldGUgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9ib29sXzsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHM6OkluaXRpYWxpemVEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKSB7CisgIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfID0gbmV3IFJlcGVhdGVkRmllbGRUeXBlOworICBPblNodXRkb3duKCZEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKTsKK30KKwordm9pZCBSZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHM6OkRlc3Ryb3lEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKSB7CisgIGRlbGV0ZSBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkXzsKK30KKwordm9pZCBSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpIHsKKyAgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF8gPSBuZXcgUmVwZWF0ZWRGaWVsZFR5cGU7CisgIE9uU2h1dGRvd24oJkRlc3Ryb3lEZWZhdWx0UmVwZWF0ZWRGaWVsZHMpOworfQorCit2b2lkIFJlcGVhdGVkTWVzc2FnZUdlbmVyaWNUeXBlVHJhaXRzOjpEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCkgeworICBkZWxldGUgZGVmYXVsdF9yZXBlYXRlZF9maWVsZF87Cit9CisKK2NvbnN0IFJlcGVhdGVkRmllbGQ8aW50MzI+KgorUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6ZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl8gPSBOVUxMOworY29uc3QgUmVwZWF0ZWRGaWVsZDxpbnQ2ND4qCitSZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2ludDY0XyA9IE5VTEw7Citjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMj4qCitSZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX3VpbnQzMl8gPSBOVUxMOworY29uc3QgUmVwZWF0ZWRGaWVsZDx1aW50NjQ+KgorUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6ZGVmYXVsdF9yZXBlYXRlZF9maWVsZF91aW50NjRfID0gTlVMTDsKK2NvbnN0IFJlcGVhdGVkRmllbGQ8ZG91YmxlPioKK1JlcGVhdGVkUHJpbWl0aXZlR2VuZXJpY1R5cGVUcmFpdHM6OmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZG91YmxlXyA9IE5VTEw7Citjb25zdCBSZXBlYXRlZEZpZWxkPGZsb2F0PioKK1JlcGVhdGVkUHJpbWl0aXZlR2VuZXJpY1R5cGVUcmFpdHM6OmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfZmxvYXRfID0gTlVMTDsKK2NvbnN0IFJlcGVhdGVkRmllbGQ8Ym9vbD4qCitSZXBlYXRlZFByaW1pdGl2ZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2Jvb2xfID0gTlVMTDsKK2NvbnN0IFJlcGVhdGVkU3RyaW5nVHlwZVRyYWl0czo6UmVwZWF0ZWRGaWVsZFR5cGUqCitSZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHM6OmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfID0gTlVMTDsKK2NvbnN0IFJlcGVhdGVkTWVzc2FnZUdlbmVyaWNUeXBlVHJhaXRzOjpSZXBlYXRlZEZpZWxkVHlwZSoKK1JlcGVhdGVkTWVzc2FnZUdlbmVyaWNUeXBlVHJhaXRzOjpkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkXyA9IE5VTEw7CisKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0LmgKaW5kZXggNjhjZTQyMy4uYmNhMTc5YiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDUsMTAgKzQ1LDE1IEBACiAKIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiAKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisgIGNsYXNzIEFyZW5hOwogICBjbGFzcyBEZXNjcmlwdG9yOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IuaAogICBjbGFzcyBGaWVsZERlc2NyaXB0b3I7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IuaAogICBjbGFzcyBEZXNjcmlwdG9yUG9vbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IuaApAQCAtNjIsMTAgKzY3LDcgQEAKICAgfQogICBuYW1lc3BhY2UgaW50ZXJuYWwgewogICAgIGNsYXNzIEZpZWxkU2tpcHBlcjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lyZV9mb3JtYXRfbGl0ZS5oCi0gICAgY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZEJhc2U7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXBlYXRlZF9maWVsZC5oCiAgIH0KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+IGNsYXNzIFJlcGVhdGVkRmllbGQ7ICAgICAvLyByZXBlYXRlZF9maWVsZC5oCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PiBjbGFzcyBSZXBlYXRlZFB0ckZpZWxkOyAgLy8gcmVwZWF0ZWRfZmllbGQuaAogfQogCiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtODksOCArOTEsOCBAQAogLy8gSW5mb3JtYXRpb24gYWJvdXQgYSByZWdpc3RlcmVkIGV4dGVuc2lvbi4KIHN0cnVjdCBFeHRlbnNpb25JbmZvIHsKICAgaW5saW5lIEV4dGVuc2lvbkluZm8oKSB7fQotICBpbmxpbmUgRXh0ZW5zaW9uSW5mbyhGaWVsZFR5cGUgdHlwZSwgYm9vbCBpc19yZXBlYXRlZCwgYm9vbCBpc19wYWNrZWQpCi0gICAgICA6IHR5cGUodHlwZSksIGlzX3JlcGVhdGVkKGlzX3JlcGVhdGVkKSwgaXNfcGFja2VkKGlzX3BhY2tlZCksCisgIGlubGluZSBFeHRlbnNpb25JbmZvKEZpZWxkVHlwZSB0eXBlX3BhcmFtLCBib29sIGlzcmVwZWF0ZWQsIGJvb2wgaXNwYWNrZWQpCisgICAgICA6IHR5cGUodHlwZV9wYXJhbSksIGlzX3JlcGVhdGVkKGlzcmVwZWF0ZWQpLCBpc19wYWNrZWQoaXNwYWNrZWQpLAogICAgICAgICBkZXNjcmlwdG9yKE5VTEwpIHt9CiAKICAgRmllbGRUeXBlIHR5cGU7CkBAIC0xMzgsNiArMTQwLDkgQEAKICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZV87CiB9OwogCisvLyBBIEZpZWxkU2tpcHBlciB1c2VkIGZvciBwYXJzaW5nIE1lc3NhZ2VTZXQuCitjbGFzcyBNZXNzYWdlU2V0RmllbGRTa2lwcGVyOworCiAvLyBOb3RlOiAgZXh0ZW5zaW9uX3NldF9oZWF2eS5jYyBkZWZpbmVzIERlc2NyaXB0b3JQb29sRXh0ZW5zaW9uRmluZGVyIGZvcgogLy8gZmluZGluZyBleHRlbnNpb25zIGZyb20gYSBEZXNjcmlwdG9yUG9vbC4KIApAQCAtMTU1LDYgKzE2MCw3IEBACiBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRXh0ZW5zaW9uU2V0IHsKICBwdWJsaWM6CiAgIEV4dGVuc2lvblNldCgpOworICBleHBsaWNpdCBFeHRlbnNpb25TZXQoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpOwogICB+RXh0ZW5zaW9uU2V0KCk7CiAKICAgLy8gVGhlc2UgYXJlIGNhbGxlZCBhdCBzdGFydHVwIGJ5IHByb3RvY29sLWNvbXBpbGVyLWdlbmVyYXRlZCBjb2RlIHRvCkBAIC0xODAsNyArMTg2LDcgQEAKICAgLy8gaXMgdXNlZnVsIHRvIGltcGxlbWVudCBSZWZsZWN0aW9uOjpMaXN0RmllbGRzKCkuCiAgIHZvaWQgQXBwZW5kVG9MaXN0KGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdDsKKyAgICAgICAgICAgICAgICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3Q7CiAKICAgLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KICAgLy8gQWNjZXNzb3JzCkBAIC0xOTAsNyArMTk2LDcgQEAKICAgLy8gZGlyZWN0bHksIHVubGVzcyB5b3UgYXJlIGRvaW5nIGxvdy1sZXZlbCBtZW1vcnkgbWFuYWdlbWVudC4KICAgLy8KICAgLy8gV2hlbiBjYWxsaW5nIGFueSBvZiB0aGVzZSBhY2Nlc3NvcnMsIHRoZSBleHRlbnNpb24gbnVtYmVyIHJlcXVlc3RlZAotICAvLyBNVVNUIGV4aXN0IGluIHRoZSBEZXNjcmlwdG9yUG9vbCBwcm92aWRlZCB0byB0aGUgY29uc3RydWN0b3IuICBPdGhlcml3c2UsCisgIC8vIE1VU1QgZXhpc3QgaW4gdGhlIERlc2NyaXB0b3JQb29sIHByb3ZpZGVkIHRvIHRoZSBjb25zdHJ1Y3Rvci4gIE90aGVyd2lzZSwKICAgLy8gdGhlIG1ldGhvZCB3aWxsIGZhaWwgYW4gYXNzZXJ0LiAgTm9ybWFsbHksIHRob3VnaCwgeW91IHdvdWxkIG5vdCBjYWxsCiAgIC8vIHRoZXNlIGRpcmVjdGx5OyB5b3Ugd291bGQgZWl0aGVyIGNhbGwgdGhlIGdlbmVyYXRlZCBhY2Nlc3NvcnMgb2YgeW91cgogICAvLyBtZXNzYWdlIGNsYXNzIChlLmcuIEdldEV4dGVuc2lvbigpKSBvciB5b3Ugd291bGQgY2FsbCB0aGUgYWNjZXNzb3JzCkBAIC0yMTQsNiArMjIwLDcgQEAKIAogICBib29sIEhhcyhpbnQgbnVtYmVyKSBjb25zdDsKICAgaW50IEV4dGVuc2lvblNpemUoaW50IG51bWJlcikgY29uc3Q7ICAgLy8gU2l6ZSBvZiBhIHJlcGVhdGVkIGV4dGVuc2lvbi4KKyAgaW50IE51bUV4dGVuc2lvbnMoKSBjb25zdDsgIC8vIFRoZSBudW1iZXIgb2YgZXh0ZW5zaW9ucwogICBGaWVsZFR5cGUgRXh0ZW5zaW9uVHlwZShpbnQgbnVtYmVyKSBjb25zdDsKICAgdm9pZCBDbGVhckV4dGVuc2lvbihpbnQgbnVtYmVyKTsKIApAQCAtMjUxLDEwICsyNTgsNDIgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUsIGRlc2MpOwogICBNZXNzYWdlTGl0ZSogTXV0YWJsZU1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZWNzcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpOworICAvLyBBZGRzIHRoZSBnaXZlbiBtZXNzYWdlIHRvIHRoZSBFeHRlbnNpb25TZXQsIHRha2luZyBvd25lcnNoaXAgb2YgdGhlCisgIC8vIG1lc3NhZ2Ugb2JqZWN0LiBFeGlzdGluZyBtZXNzYWdlIHdpdGggdGhlIHNhbWUgbnVtYmVyIHdpbGwgYmUgZGVsZXRlZC4KKyAgLy8gSWYgIm1lc3NhZ2UiIGlzIE5VTEwsIHRoaXMgaXMgZXF1aXZhbGVudCB0byAiQ2xlYXJFeHRlbnNpb24obnVtYmVyKSIuCisgIHZvaWQgU2V0QWxsb2NhdGVkTWVzc2FnZShpbnQgbnVtYmVyLCBGaWVsZFR5cGUgdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKTsKKyAgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2UoaW50IG51bWJlciwgRmllbGRUeXBlIHR5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpOworICBNZXNzYWdlTGl0ZSogUmVsZWFzZU1lc3NhZ2UoaW50IG51bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSk7CisgIE1lc3NhZ2VMaXRlKiBVbnNhZmVBcmVuYVJlbGVhc2VNZXNzYWdlKAorICAgICAgaW50IG51bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSk7CisKKyAgTWVzc2FnZUxpdGUqIFJlbGVhc2VNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKICN1bmRlZiBkZXNjCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeyByZXR1cm4gYXJlbmFfOyB9CiAKICAgLy8gcmVwZWF0ZWQgZmllbGRzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorICAvLyBGZXRjaGVzIGEgUmVwZWF0ZWRGaWVsZCBleHRlbnNpb24gYnkgbnVtYmVyOyByZXR1cm5zIHxkZWZhdWx0X3ZhbHVlfAorICAvLyBpZiBubyBzdWNoIGV4dGVuc2lvbiBleGlzdHMuIFVzZXIgc2hvdWxkIG5vdCB0b3VjaCB0aGlzIGRpcmVjdGx5OyBpdCBpcworICAvLyB1c2VkIGJ5IHRoZSBHZXRSZXBlYXRlZEV4dGVuc2lvbigpIG1ldGhvZC4KKyAgY29uc3Qgdm9pZCogR2V0UmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyLCBjb25zdCB2b2lkKiBkZWZhdWx0X3ZhbHVlKSBjb25zdDsKKyAgLy8gRmV0Y2hlcyBhIG11dGFibGUgdmVyc2lvbiBvZiBhIFJlcGVhdGVkRmllbGQgZXh0ZW5zaW9uIGJ5IG51bWJlciwKKyAgLy8gaW5zdGFudGlhdGluZyBvbmUgaWYgbm9uZSBleGlzdHMuIFNpbWlsYXIgdG8gYWJvdmUsIHVzZXIgc2hvdWxkIG5vdCB1c2UKKyAgLy8gdGhpcyBkaXJlY3RseTsgaXQgdW5kZXJsaWVzIE11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigpLgorICB2b2lkKiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwYWNrZWQsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzYyk7CisKKyAgLy8gVGhpcyBpcyBhbiBvdmVybG9hZCBvZiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCB0byBtYWludGFpbiBjb21wYXRpYmlsaXR5CisgIC8vIHdpdGggb2xkIGNvZGUgdXNpbmcgYSBwcmV2aW91cyBBUEkuIFRoaXMgdmVyc2lvbiBvZgorICAvLyBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgpIHdpbGwgR09PR0xFX0NIRUNLLWZhaWwgb24gYSBtaXNzaW5nIGV4dGVuc2lvbi4KKyAgLy8gKEUuZy46IGJvcmcvY2xpZW50cy9pbnRlcm5hbC9wcm90bzEvcHJvdG8yX3JlZmxlY3Rpb24uY2MuKQorICB2b2lkKiBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChpbnQgbnVtYmVyKTsKKwogICBpbnQzMiAgR2V0UmVwZWF0ZWRJbnQzMiAoaW50IG51bWJlciwgaW50IGluZGV4KSBjb25zdDsKICAgaW50NjQgIEdldFJlcGVhdGVkSW50NjQgKGludCBudW1iZXIsIGludCBpbmRleCkgY29uc3Q7CiAgIHVpbnQzMiBHZXRSZXBlYXRlZFVJbnQzMihpbnQgbnVtYmVyLCBpbnQgaW5kZXgpIGNvbnN0OwpAQCAtMjkzLDkgKzMzMiwxMiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlLCBkZXNjKTsKICAgTWVzc2FnZUxpdGUqIEFkZE1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSk7CisgIHZvaWQgQWRkQWxsb2NhdGVkTWVzc2FnZShjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbmV3X2VudHJ5KTsKICN1bmRlZiBkZXNjCiAKICAgdm9pZCBSZW1vdmVMYXN0KGludCBudW1iZXIpOworICBNZXNzYWdlTGl0ZSogUmVsZWFzZUxhc3QoaW50IG51bWJlcik7CiAgIHZvaWQgU3dhcEVsZW1lbnRzKGludCBudW1iZXIsIGludCBpbmRleDEsIGludCBpbmRleDIpOwogCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMTAsNDEgKzM1Miw0MyBAQAogICB2b2lkIENsZWFyKCk7CiAgIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IEV4dGVuc2lvblNldCYgb3RoZXIpOwogICB2b2lkIFN3YXAoRXh0ZW5zaW9uU2V0KiBvdGhlcik7CisgIHZvaWQgU3dhcEV4dGVuc2lvbihFeHRlbnNpb25TZXQqIG90aGVyLCBpbnQgbnVtYmVyKTsKICAgYm9vbCBJc0luaXRpYWxpemVkKCkgY29uc3Q7CiAKLSAgLy8gUGFyc2VzIGEgc2luZ2xlIGV4dGVuc2lvbiBmcm9tIHRoZSBpbnB1dC4gIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQgb3V0Ci0gIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4gIHxjb250YWluaW5nX3R5cGV8IGlzIHRoZSBkZWZhdWx0Ci0gIC8vIGluc3RhbmNlIGZvciB0aGUgY29udGFpbmluZyBtZXNzYWdlOyBpdCBpcyB1c2VkIG9ubHkgdG8gbG9vayB1cCB0aGUKLSAgLy8gZXh0ZW5zaW9uIGJ5IG51bWJlci4gIFNlZSBSZWdpc3RlckV4dGVuc2lvbigpLCBhYm92ZS4gIFVubGlrZSB0aGUgb3RoZXIKLSAgLy8gbWV0aG9kcyBvZiBFeHRlbnNpb25TZXQsIHRoaXMgb25seSB3b3JrcyBmb3IgZ2VuZXJhdGVkIG1lc3NhZ2UgdHlwZXMgLS0KLSAgLy8gaXQgbG9va3MgdXAgZXh0ZW5zaW9ucyByZWdpc3RlcmVkIHVzaW5nIFJlZ2lzdGVyRXh0ZW5zaW9uKCkuCisgIC8vIFBhcnNlcyBhIHNpbmdsZSBleHRlbnNpb24gZnJvbSB0aGUgaW5wdXQuIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQgb3V0CisgIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4KICAgYm9vbCBQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7CiAKICAgLy8gU3BlY2lmaWMgdmVyc2lvbnMgZm9yIGxpdGUgb3IgZnVsbCBtZXNzYWdlcyAoY29uc3RydWN0cyB0aGUgYXBwcm9wcmlhdGUKLSAgLy8gRmllbGRTa2lwcGVyIGF1dG9tYXRpY2FsbHkpLgorICAvLyBGaWVsZFNraXBwZXIgYXV0b21hdGljYWxseSkuICB8Y29udGFpbmluZ190eXBlfCBpcyB0aGUgZGVmYXVsdAorICAvLyBpbnN0YW5jZSBmb3IgdGhlIGNvbnRhaW5pbmcgbWVzc2FnZTsgaXQgaXMgdXNlZCBvbmx5IHRvIGxvb2sgdXAgdGhlCisgIC8vIGV4dGVuc2lvbiBieSBudW1iZXIuICBTZWUgUmVnaXN0ZXJFeHRlbnNpb24oKSwgYWJvdmUuICBVbmxpa2UgdGhlIG90aGVyCisgIC8vIG1ldGhvZHMgb2YgRXh0ZW5zaW9uU2V0LCB0aGlzIG9ubHkgd29ya3MgZm9yIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGVzIC0tCisgIC8vIGl0IGxvb2tzIHVwIGV4dGVuc2lvbnMgcmVnaXN0ZXJlZCB1c2luZyBSZWdpc3RlckV4dGVuc2lvbigpLgorICBib29sIFBhcnNlRmllbGQodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSk7CisgIGJvb2wgUGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKICAgYm9vbCBQYXJzZUZpZWxkKHVpbnQzMiB0YWcsIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLSAgYm9vbCBQYXJzZUZpZWxkSGVhdnkodWludDMyIHRhZywgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCi0gICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiB1bmtub3duX2ZpZWxkcyk7CiAKICAgLy8gUGFyc2UgYW4gZW50aXJlIG1lc3NhZ2UgaW4gTWVzc2FnZVNldCBmb3JtYXQuICBTdWNoIG1lc3NhZ2VzIGhhdmUgbm8KICAgLy8gZmllbGRzLCBvbmx5IGV4dGVuc2lvbnMuCiAgIGJvb2wgUGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uRmluZGVyKiBleHRlbnNpb25fZmluZGVyLAotICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpOworICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKTsKIAogICAvLyBTcGVjaWZpYyB2ZXJzaW9ucyBmb3IgbGl0ZSBvciBmdWxsIG1lc3NhZ2VzIChjb25zdHJ1Y3RzIHRoZSBhcHByb3ByaWF0ZQogICAvLyBGaWVsZFNraXBwZXIgYXV0b21hdGljYWxseSkuCiAgIGJvb2wgUGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSk7CisgIGJvb2wgUGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAogICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKLSAgYm9vbCBQYXJzZU1lc3NhZ2VTZXRIZWF2eShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOwogCiAgIC8vIFdyaXRlIGFsbCBleHRlbnNpb24gZmllbGRzIHdpdGggZmllbGQgbnVtYmVycyBpbiB0aGUgcmFuZ2UKICAgLy8gICBbc3RhcnRfZmllbGRfbnVtYmVyLCBlbmRfZmllbGRfbnVtYmVyKQpAQCAtMzg0LDE4ICs0MjgsNTIgQEAKIAogIHByaXZhdGU6CiAKKyAgLy8gSW50ZXJmYWNlIG9mIGEgbGF6aWx5IHBhcnNlZCBzaW5ndWxhciBtZXNzYWdlIGV4dGVuc2lvbi4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExhenlNZXNzYWdlRXh0ZW5zaW9uIHsKKyAgIHB1YmxpYzoKKyAgICBMYXp5TWVzc2FnZUV4dGVuc2lvbigpIHt9CisgICAgdmlydHVhbCB+TGF6eU1lc3NhZ2VFeHRlbnNpb24oKSB7fQorCisgICAgdmlydHVhbCBMYXp5TWVzc2FnZUV4dGVuc2lvbiogTmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBjb25zdCBNZXNzYWdlTGl0ZSYgR2V0TWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgTWVzc2FnZUxpdGUqIE11dGFibGVNZXNzYWdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBwcm90b3R5cGUpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgU2V0QWxsb2NhdGVkTWVzc2FnZShNZXNzYWdlTGl0ZSAqbWVzc2FnZSkgPSAwOworICAgIHZpcnR1YWwgdm9pZCBVbnNhZmVBcmVuYVNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZUxpdGUgKm1lc3NhZ2UpID0gMDsKKyAgICB2aXJ0dWFsIE1lc3NhZ2VMaXRlKiBSZWxlYXNlTWVzc2FnZShjb25zdCBNZXNzYWdlTGl0ZSYgcHJvdG90eXBlKSA9IDA7CisgICAgdmlydHVhbCBNZXNzYWdlTGl0ZSogVW5zYWZlQXJlbmFSZWxlYXNlTWVzc2FnZSgKKyAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSkgPSAwOworCisgICAgdmlydHVhbCBib29sIElzSW5pdGlhbGl6ZWQoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgQnl0ZVNpemUoKSBjb25zdCA9IDA7CisgICAgdmlydHVhbCBpbnQgU3BhY2VVc2VkKCkgY29uc3QgPSAwOworCisgICAgdmlydHVhbCB2b2lkIE1lcmdlRnJvbShjb25zdCBMYXp5TWVzc2FnZUV4dGVuc2lvbiYgb3RoZXIpID0gMDsKKyAgICB2aXJ0dWFsIHZvaWQgQ2xlYXIoKSA9IDA7CisKKyAgICB2aXJ0dWFsIGJvb2wgUmVhZE1lc3NhZ2UoY29uc3QgTWVzc2FnZUxpdGUmIHByb3RvdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSA9IDA7CisgICAgdmlydHVhbCB2b2lkIFdyaXRlTWVzc2FnZShpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0ID0gMDsKKyAgICB2aXJ0dWFsIHVpbnQ4KiBXcml0ZU1lc3NhZ2VUb0FycmF5KGludCBudW1iZXIsIHVpbnQ4KiB0YXJnZXQpIGNvbnN0ID0gMDsKKyAgIHByaXZhdGU6CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKExhenlNZXNzYWdlRXh0ZW5zaW9uKTsKKyAgfTsKICAgc3RydWN0IEV4dGVuc2lvbiB7CisgICAgLy8gVGhlIG9yZGVyIG9mIHRoZXNlIGZpZWxkcyBwYWNrcyBFeHRlbnNpb24gaW50byAyNCBieXRlcyB3aGVuIHVzaW5nIDgKKyAgICAvLyBieXRlIGFsaWdubWVudC4gQ29uc2lkZXIgdGhpcyB3aGVuIGFkZGluZyBvciByZW1vdmluZyBmaWVsZHMgaGVyZS4KICAgICB1bmlvbiB7Ci0gICAgICBpbnQzMiAgICAgICAgaW50MzJfdmFsdWU7Ci0gICAgICBpbnQ2NCAgICAgICAgaW50NjRfdmFsdWU7Ci0gICAgICB1aW50MzIgICAgICAgdWludDMyX3ZhbHVlOwotICAgICAgdWludDY0ICAgICAgIHVpbnQ2NF92YWx1ZTsKLSAgICAgIGZsb2F0ICAgICAgICBmbG9hdF92YWx1ZTsKLSAgICAgIGRvdWJsZSAgICAgICBkb3VibGVfdmFsdWU7Ci0gICAgICBib29sICAgICAgICAgYm9vbF92YWx1ZTsKLSAgICAgIGludCAgICAgICAgICBlbnVtX3ZhbHVlOwotICAgICAgc3RyaW5nKiAgICAgIHN0cmluZ192YWx1ZTsKLSAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlX3ZhbHVlOworICAgICAgaW50MzIgICAgICAgICAgICAgICAgIGludDMyX3ZhbHVlOworICAgICAgaW50NjQgICAgICAgICAgICAgICAgIGludDY0X3ZhbHVlOworICAgICAgdWludDMyICAgICAgICAgICAgICAgIHVpbnQzMl92YWx1ZTsKKyAgICAgIHVpbnQ2NCAgICAgICAgICAgICAgICB1aW50NjRfdmFsdWU7CisgICAgICBmbG9hdCAgICAgICAgICAgICAgICAgZmxvYXRfdmFsdWU7CisgICAgICBkb3VibGUgICAgICAgICAgICAgICAgZG91YmxlX3ZhbHVlOworICAgICAgYm9vbCAgICAgICAgICAgICAgICAgIGJvb2xfdmFsdWU7CisgICAgICBpbnQgICAgICAgICAgICAgICAgICAgZW51bV92YWx1ZTsKKyAgICAgIHN0cmluZyogICAgICAgICAgICAgICBzdHJpbmdfdmFsdWU7CisgICAgICBNZXNzYWdlTGl0ZSogICAgICAgICAgbWVzc2FnZV92YWx1ZTsKKyAgICAgIExhenlNZXNzYWdlRXh0ZW5zaW9uKiBsYXp5bWVzc2FnZV92YWx1ZTsKIAogICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxpbnQzMiAgICAgID4qIHJlcGVhdGVkX2ludDMyX3ZhbHVlOwogICAgICAgUmVwZWF0ZWRGaWVsZCAgIDxpbnQ2NCAgICAgID4qIHJlcGVhdGVkX2ludDY0X3ZhbHVlOwpAQCAtNDE4LDIxICs0OTYsMjggQEAKICAgICAvLyByZW1vdmluZyBpdCBmcm9tIHRoZSBtYXAsIHdlIGp1c3Qgc2V0IGlzX2NsZWFyZWQgPSB0cnVlLiAgVGhpcyBoYXMgbm8KICAgICAvLyBtZWFuaW5nIGZvciByZXBlYXRlZCB0eXBlczsgZm9yIHRob3NlLCB0aGUgc2l6ZSBvZiB0aGUgUmVwZWF0ZWRGaWVsZAogICAgIC8vIHNpbXBseSBiZWNvbWVzIHplcm8gd2hlbiBjbGVhcmVkLgotICAgIGJvb2wgaXNfY2xlYXJlZDsKKyAgICBib29sIGlzX2NsZWFyZWQgOiA0OworCisgICAgLy8gRm9yIHNpbmd1bGFyIG1lc3NhZ2UgdHlwZXMsIGluZGljYXRlcyB3aGV0aGVyIGxhenkgcGFyc2luZyBpcyBlbmFibGVkCisgICAgLy8gZm9yIHRoaXMgZXh0ZW5zaW9uLiBUaGlzIGZpZWxkIGlzIG9ubHkgdmFsaWQgd2hlbiB0eXBlID09IFRZUEVfTUVTU0FHRQorICAgIC8vIGFuZCAhaXNfcmVwZWF0ZWQgYmVjYXVzZSB3ZSBvbmx5IHN1cHBvcnQgbGF6eSBwYXJzaW5nIGZvciBzaW5ndWxhcgorICAgIC8vIG1lc3NhZ2UgdHlwZXMgY3VycmVudGx5LiBJZiBpc19sYXp5ID0gdHJ1ZSwgdGhlIGV4dGVuc2lvbiBpcyBzdG9yZWQgaW4KKyAgICAvLyBsYXp5bWVzc2FnZV92YWx1ZS4gT3RoZXJ3aXNlLCB0aGUgZXh0ZW5zaW9uIHdpbGwgYmUgbWVzc2FnZV92YWx1ZS4KKyAgICBib29sIGlzX2xhenkgOiA0OwogCiAgICAgLy8gRm9yIHJlcGVhdGVkIHR5cGVzLCB0aGlzIGluZGljYXRlcyBpZiB0aGUgW3BhY2tlZD10cnVlXSBvcHRpb24gaXMgc2V0LgogICAgIGJvb2wgaXNfcGFja2VkOwogCi0gICAgLy8gVGhlIGRlc2NyaXB0b3IgZm9yIHRoaXMgZXh0ZW5zaW9uLCBpZiBvbmUgZXhpc3RzIGFuZCBpcyBrbm93bi4gIE1heSBiZQotICAgIC8vIE5VTEwuICBNdXN0IG5vdCBiZSBOVUxMIGlmIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgZXh0ZW5zaW9uIGRvZXMgbm90Ci0gICAgLy8gbGl2ZSBpbiB0aGUgc2FtZSBwb29sIGFzIHRoZSBkZXNjcmlwdG9yIGZvciB0aGUgY29udGFpbmluZyB0eXBlLgotICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvcjsKLQogICAgIC8vIEZvciBwYWNrZWQgZmllbGRzLCB0aGUgc2l6ZSBvZiB0aGUgcGFja2VkIGRhdGEgaXMgcmVjb3JkZWQgaGVyZSB3aGVuCiAgICAgLy8gQnl0ZVNpemUoKSBpcyBjYWxsZWQgdGhlbiB1c2VkIGR1cmluZyBzZXJpYWxpemF0aW9uLgogICAgIC8vIFRPRE8oa2VudG9uKTogIFVzZSBhdG9taWM8aW50PiB3aGVuIEMrKyBzdXBwb3J0cyBpdC4KICAgICBtdXRhYmxlIGludCBjYWNoZWRfc2l6ZTsKIAorICAgIC8vIFRoZSBkZXNjcmlwdG9yIGZvciB0aGlzIGV4dGVuc2lvbiwgaWYgb25lIGV4aXN0cyBhbmQgaXMga25vd24uICBNYXkgYmUKKyAgICAvLyBOVUxMLiAgTXVzdCBub3QgYmUgTlVMTCBpZiB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGV4dGVuc2lvbiBkb2VzIG5vdAorICAgIC8vIGxpdmUgaW4gdGhlIHNhbWUgcG9vbCBhcyB0aGUgZGVzY3JpcHRvciBmb3IgdGhlIGNvbnRhaW5pbmcgdHlwZS4KKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3I7CisKICAgICAvLyBTb21lIGhlbHBlciBtZXRob2RzIGZvciBvcGVyYXRpb25zIG9uIGEgc2luZ2xlIEV4dGVuc2lvbi4KICAgICB2b2lkIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKAogICAgICAgICBpbnQgbnVtYmVyLApAQCAtNDU1LDE3ICs1NDAsNTcgQEAKICAgfTsKIAogCisgIC8vIE1lcmdlcyBleGlzdGluZyBFeHRlbnNpb24gZnJvbSBvdGhlcl9leHRlbnNpb24KKyAgdm9pZCBJbnRlcm5hbEV4dGVuc2lvbk1lcmdlRnJvbShpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb24mIG90aGVyX2V4dGVuc2lvbik7CisKKyAgLy8gUmV0dXJucyB0cnVlIGFuZCBmaWxscyBmaWVsZF9udW1iZXIgYW5kIGV4dGVuc2lvbiBpZiBleHRlbnNpb24gaXMgZm91bmQuCisgIC8vIE5vdGUgdG8gc3VwcG9ydCBwYWNrZWQgcmVwZWF0ZWQgZmllbGQgY29tcGF0aWJpbGl0eSwgaXQgYWxzbyBmaWxscyB3aGV0aGVyCisgIC8vIHRoZSB0YWcgb24gd2lyZSBpcyBwYWNrZWQsIHdoaWNoIGNhbiBiZSBkaWZmZXJlbnQgZnJvbQorICAvLyBleHRlbnNpb24tPmlzX3BhY2tlZCAod2hldGhlciBwYWNrZWQ9dHJ1ZSBpcyBzcGVjaWZpZWQpLgorICBib29sIEZpbmRFeHRlbnNpb25JbmZvRnJvbVRhZyh1aW50MzIgdGFnLCBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogZmllbGRfbnVtYmVyLCBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHdhc19wYWNrZWRfb25fd2lyZSk7CisKKyAgLy8gUmV0dXJucyB0cnVlIGFuZCBmaWxscyBleHRlbnNpb24gaWYgZXh0ZW5zaW9uIGlzIGZvdW5kLgorICAvLyBOb3RlIHRvIHN1cHBvcnQgcGFja2VkIHJlcGVhdGVkIGZpZWxkIGNvbXBhdGliaWxpdHksIGl0IGFsc28gZmlsbHMgd2hldGhlcgorICAvLyB0aGUgdGFnIG9uIHdpcmUgaXMgcGFja2VkLCB3aGljaCBjYW4gYmUgZGlmZmVyZW50IGZyb20KKyAgLy8gZXh0ZW5zaW9uLT5pc19wYWNrZWQgKHdoZXRoZXIgcGFja2VkPXRydWUgaXMgc3BlY2lmaWVkKS4KKyAgYm9vbCBGaW5kRXh0ZW5zaW9uSW5mb0Zyb21GaWVsZE51bWJlcihpbnQgd2lyZV90eXBlLCBpbnQgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25JbmZvKiBleHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogd2FzX3BhY2tlZF9vbl93aXJlKTsKKworICAvLyBQYXJzZXMgYSBzaW5nbGUgZXh0ZW5zaW9uIGZyb20gdGhlIGlucHV0LiBUaGUgaW5wdXQgc2hvdWxkIHN0YXJ0IG91dAorICAvLyBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB3aXJlIHRhZy4gVGhpcyBtZXRob2QgaXMgY2FsbGVkIGluCisgIC8vIFBhcnNlRmllbGQoKSBhZnRlciBmaWVsZCBudW1iZXIgYW5kIHdhc19wYWNrZWRfb25fd2lyZSBpcyBleHRyYWN0ZWQgZnJvbQorICAvLyB0aGUgd2lyZSB0YWcgYW5kIEV4dGVuc2lvbkluZm8gaXMgZm91bmQgYnkgdGhlIGZpZWxkIG51bWJlci4KKyAgYm9vbCBQYXJzZUZpZWxkV2l0aEV4dGVuc2lvbkluZm8oaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCB3YXNfcGFja2VkX29uX3dpcmUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEV4dGVuc2lvbkluZm8mIGV4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpOworCisgIC8vIExpa2UgUGFyc2VGaWVsZCgpLCBidXQgdGhpcyBtZXRob2QgbWF5IHBhcnNlIHNpbmd1bGFyIG1lc3NhZ2UgZXh0ZW5zaW9ucworICAvLyBsYXppbHkgZGVwZW5kaW5nIG9uIHRoZSB2YWx1ZSBvZiBGTEFHU19lYWdlcmx5X3BhcnNlX21lc3NhZ2Vfc2V0cy4KKyAgYm9vbCBQYXJzZUZpZWxkTWF5YmVMYXppbHkoaW50IHdpcmVfdHlwZSwgaW50IGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTZXRGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpOworCiAgIC8vIEdldHMgdGhlIGV4dGVuc2lvbiB3aXRoIHRoZSBnaXZlbiBudW1iZXIsIGNyZWF0aW5nIGl0IGlmIGl0IGRvZXMgbm90CiAgIC8vIGFscmVhZHkgZXhpc3QuICBSZXR1cm5zIHRydWUgaWYgdGhlIGV4dGVuc2lvbiBkaWQgbm90IGFscmVhZHkgZXhpc3QuCiAgIGJvb2wgTWF5YmVOZXdFeHRlbnNpb24oaW50IG51bWJlciwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAogICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbioqIHJlc3VsdCk7CiAKKyAgLy8gR2V0cyB0aGUgcmVwZWF0ZWQgZXh0ZW5zaW9uIGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvciwgY3JlYXRpbmcgaXQgaWYKKyAgLy8gaXQgZG9lcyBub3QgZXhpc3QuCisgIEV4dGVuc2lvbiogTWF5YmVOZXdSZXBlYXRlZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpOworCiAgIC8vIFBhcnNlIGEgc2luZ2xlIE1lc3NhZ2VTZXQgaXRlbSAtLSBjYWxsZWQganVzdCBhZnRlciB0aGUgaXRlbSBncm91cCBzdGFydAogICAvLyB0YWcgaGFzIGJlZW4gcmVhZC4KICAgYm9vbCBQYXJzZU1lc3NhZ2VTZXRJdGVtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkU2tpcHBlciogZmllbGRfc2tpcHBlcik7Ci0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTZXRGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpOwogCiAgIC8vIEhhY2s6ICBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkZWNsYXJlcyBFeHRlbnNpb25TZXQgYXMgYSBmcmllbmQuICBUaGlzCiAgIC8vICAgZnJpZW5kc2hpcCBzaG91bGQgYXV0b21hdGljYWxseSBleHRlbmQgdG8gRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24sIGJ1dApAQCAtNDgzLDggKzYwOCw4IEBACiAgIC8vIG9ubHkgY29udGFpbiBhIHNtYWxsIG51bWJlciBvZiBleHRlbnNpb25zIHdoZXJlYXMgaGFzaF9tYXAgaXMgb3B0aW1pemVkCiAgIC8vIGZvciAxMDAgZWxlbWVudHMgb3IgbW9yZS4gIEFsc28sIHdlIHdhbnQgQXBwZW5kVG9MaXN0KCkgdG8gb3JkZXIgZmllbGRzCiAgIC8vIGJ5IGZpZWxkIG51bWJlci4KLSAgbWFwPGludCwgRXh0ZW5zaW9uPiBleHRlbnNpb25zXzsKLQorICBzdGQ6Om1hcDxpbnQsIEV4dGVuc2lvbj4gZXh0ZW5zaW9uc187CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hXzsKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEV4dGVuc2lvblNldCk7CiB9OwogCkBAIC01MTksNiArNjQ0LDE2IEBACiAvLyAgICBwdWJsaWM6CiAvLyAgICAgdHlwZWRlZiA/IENvbnN0VHlwZTsKIC8vICAgICB0eXBlZGVmID8gTXV0YWJsZVR5cGU7CisvLyAgICAgLy8gVHlwZVRyYWl0cyBmb3Igc2luZ3VsYXIgZmllbGRzIGFuZCByZXBlYXRlZCBmaWVsZHMgd2lsbCBkZWZpbmUgdGhlCisvLyAgICAgLy8gc3ltYm9sICJTaW5ndWxhciIgb3IgIlJlcGVhdGVkIiByZXNwZWN0aXZlbHkuIFRoZXNlIHR3byBzeW1ib2xzIHdpbGwKKy8vICAgICAvLyBiZSB1c2VkIGluIGV4dGVuc2lvbiBhY2Nlc3NvcnMgdG8gZGlzdGluZ3Vpc2ggYmV0d2VlbiBzaW5ndWxhcgorLy8gICAgIC8vIGV4dGVuc2lvbnMgYW5kIHJlcGVhdGVkIGV4dGVuc2lvbnMuIElmIHRoZSBUeXBlVHJhaXRzIGZvciB0aGUgcGFzc2VkCisvLyAgICAgLy8gaW4gZXh0ZW5zaW9uIGRvZXNuJ3QgaGF2ZSB0aGUgZXhwZWN0ZWQgc3ltYm9sIGRlZmluZWQsIGl0IG1lYW5zIHRoZQorLy8gICAgIC8vIHVzZXIgaXMgcGFzc2luZyBhIHJlcGVhdGVkIGV4dGVuc2lvbiB0byBhIHNpbmd1bGFyIGFjY2Vzc29yLCBvciB0aGUKKy8vICAgICAvLyBvcHBvc2l0ZS4gSW4gdGhhdCBjYXNlIHRoZSBDKysgY29tcGlsZXIgd2lsbCBnZW5lcmF0ZSBhbiBlcnJvcgorLy8gICAgIC8vIG1lc3NhZ2UgIm5vIG1hdGNoaW5nIG1lbWJlciBmdW5jdGlvbiIgdG8gaW5mb3JtIHRoZSB1c2VyLgorLy8gICAgIHR5cGVkZWYgPyBTaW5ndWxhcgorLy8gICAgIHR5cGVkZWYgPyBSZXBlYXRlZAogLy8KIC8vICAgICBzdGF0aWMgaW5saW5lIENvbnN0VHlwZSBHZXQoaW50IG51bWJlciwgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpOwogLy8gICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBTZXQoaW50IG51bWJlciwgQ29uc3RUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CkBAIC01NTcsNiArNjkyLDggQEAKIGNsYXNzIFByaW1pdGl2ZVR5cGVUcmFpdHMgewogIHB1YmxpYzoKICAgdHlwZWRlZiBUeXBlIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBUeXBlIE11dGFibGVUeXBlOworICB0eXBlZGVmIFByaW1pdGl2ZVR5cGVUcmFpdHM8VHlwZT4gU2luZ3VsYXI7CiAKICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpOwpAQCAtNTY4LDExICs3MDUsMzkgQEAKIGNsYXNzIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0cyB7CiAgcHVibGljOgogICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPFR5cGU+IFJlcGVhdGVkOworCisgIHR5cGVkZWYgUmVwZWF0ZWRGaWVsZDxUeXBlPiBSZXBlYXRlZEZpZWxkVHlwZTsKIAogICBzdGF0aWMgaW5saW5lIFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBpbnQgaW5kZXgpOwogICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0KGludCBudW1iZXIsIGludCBpbmRleCwgVHlwZSB2YWx1ZSwgRXh0ZW5zaW9uU2V0KiBzZXQpOwogICBzdGF0aWMgaW5saW5lIHZvaWQgQWRkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAogICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLCBUeXBlIHZhbHVlLCBFeHRlbnNpb25TZXQqIHNldCk7CisKKyAgc3RhdGljIGlubGluZSBjb25zdCBSZXBlYXRlZEZpZWxkPENvbnN0VHlwZT4mCisgICAgICBHZXRSZXBlYXRlZChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCk7CisgIHN0YXRpYyBpbmxpbmUgUmVwZWF0ZWRGaWVsZDxUeXBlPioKKyAgICAgIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwgRXh0ZW5zaW9uU2V0KiBzZXQpOworCisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSogR2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKTsKK307CisKK0xJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gUHJvdG9idWZPbmNlVHlwZSByZXBlYXRlZF9wcmltaXRpdmVfZ2VuZXJpY190eXBlX3RyYWl0c19vbmNlX2luaXRfOworCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0cyB7CisgcHJpdmF0ZToKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVHlwZT4gZnJpZW5kIGNsYXNzIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0czsKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpOworICBzdGF0aWMgdm9pZCBEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCk7CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGludDMyPiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQzMl87CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGludDY0PiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9pbnQ2NF87CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPHVpbnQzMj4qIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfdWludDMyXzsKKyAgc3RhdGljIGNvbnN0IFJlcGVhdGVkRmllbGQ8dWludDY0PiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF91aW50NjRfOworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZDxkb3VibGU+KiBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2RvdWJsZV87CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGZsb2F0PiogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF9mbG9hdF87CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkPGJvb2w+KiBkZWZhdWx0X3JlcGVhdGVkX2ZpZWxkX2Jvb2xfOwogfTsKIAogI2RlZmluZSBQUk9UT0JVRl9ERUZJTkVfUFJJTUlUSVZFX1RZUEUoVFlQRSwgTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgXApAQCAtNTk3LDYgKzc2MiwyOSBAQAogICAgIGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLCBib29sIGlzX3BhY2tlZCwgICAgICAgICAgICAgICAgICAgICAgXAogICAgIFRZUEUgdmFsdWUsIEV4dGVuc2lvblNldCogc2V0KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICBzZXQtPkFkZCMjTUVUSE9EKG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLCB2YWx1ZSwgTlVMTCk7ICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8PiBpbmxpbmUgY29uc3QgUmVwZWF0ZWRGaWVsZDxUWVBFPiogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJlcGVhdGVkUHJpbWl0aXZlVHlwZVRyYWl0czxUWVBFPjo6R2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKSB7ICAgICAgICAgXAorICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAmcmVwZWF0ZWRfcHJpbWl0aXZlX2dlbmVyaWNfdHlwZV90cmFpdHNfb25jZV9pbml0XywgICAgICAgICAgICAgICAgICBcCisgICAgICAmUmVwZWF0ZWRQcmltaXRpdmVHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcyk7IFwKKyAgcmV0dXJuIFJlcGVhdGVkUHJpbWl0aXZlR2VuZXJpY1R5cGVUcmFpdHM6OiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfIyNUWVBFIyNfOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIGNvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4mICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46OkdldFJlcGVhdGVkKGludCBudW1iZXIsICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uU2V0JiBzZXQpIHsgIFwKKyAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4qPiggICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzZXQuR2V0UmF3UmVwZWF0ZWRGaWVsZCggICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtYmVyLCBHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpKSk7ICAgICAgIFwKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gaW5saW5lIFJlcGVhdGVkRmllbGQ8VFlQRT4qICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBSZXBlYXRlZFByaW1pdGl2ZVR5cGVUcmFpdHM8VFlQRT46Ok11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZpZWxkVHlwZSBmaWVsZF90eXBlLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7ICAgIFwKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUWVBFPio+KCAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHNldC0+TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBmaWVsZF90eXBlLCBpc19wYWNrZWQsIE5VTEwpKTsgIFwKIH0KIAogUFJPVE9CVUZfREVGSU5FX1BSSU1JVElWRV9UWVBFKCBpbnQzMiwgIEludDMyKQpAQCAtNjE3LDYgKzgwNSw3IEBACiAgcHVibGljOgogICB0eXBlZGVmIGNvbnN0IHN0cmluZyYgQ29uc3RUeXBlOwogICB0eXBlZGVmIHN0cmluZyogTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgU3RyaW5nVHlwZVRyYWl0cyBTaW5ndWxhcjsKIAogICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbnN0VHlwZSBkZWZhdWx0X3ZhbHVlKSB7CkBAIC02MzIsMTAgKzgyMSwxNSBAQAogICB9CiB9OwogCitMSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFByb3RvYnVmT25jZVR5cGUgcmVwZWF0ZWRfc3RyaW5nX3R5cGVfdHJhaXRzX29uY2VfaW5pdF87CisKIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBSZXBlYXRlZFN0cmluZ1R5cGVUcmFpdHMgewogIHB1YmxpYzoKICAgdHlwZWRlZiBjb25zdCBzdHJpbmcmIENvbnN0VHlwZTsKICAgdHlwZWRlZiBzdHJpbmcqIE11dGFibGVUeXBlOworICB0eXBlZGVmIFJlcGVhdGVkU3RyaW5nVHlwZVRyYWl0cyBSZXBlYXRlZDsKKworICB0eXBlZGVmIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBSZXBlYXRlZEZpZWxkVHlwZTsKIAogICBzdGF0aWMgaW5saW5lIGNvbnN0IHN0cmluZyYgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCkgewpAQCAtNjU3LDYgKzg1MSwzMCBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CiAgICAgcmV0dXJuIHNldC0+QWRkU3RyaW5nKG51bWJlciwgZmllbGRfdHlwZSwgTlVMTCk7CiAgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4mCisgICAgICBHZXRSZXBlYXRlZChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCkgeworICAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qPigKKyAgICAgICAgc2V0LkdldFJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPioKKyAgICAgIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLCBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICBib29sIGlzX3BhY2tlZCwgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qPigKKyAgICAgICAgc2V0LT5NdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIGZpZWxkX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfcGFja2VkLCBOVUxMKSk7CisgIH0KKworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkgeworICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJnJlcGVhdGVkX3N0cmluZ190eXBlX3RyYWl0c19vbmNlX2luaXRfLAorICAgICAgICAgICAgICAgICAgICZJbml0aWFsaXplRGVmYXVsdFJlcGVhdGVkRmllbGRzKTsKKyAgICByZXR1cm4gZGVmYXVsdF9yZXBlYXRlZF9maWVsZF87CisgIH0KKworIHByaXZhdGU6CisgIHN0YXRpYyB2b2lkIEluaXRpYWxpemVEZWZhdWx0UmVwZWF0ZWRGaWVsZHMoKTsKKyAgc3RhdGljIHZvaWQgRGVzdHJveURlZmF1bHRSZXBlYXRlZEZpZWxkcygpOworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUgKmRlZmF1bHRfcmVwZWF0ZWRfZmllbGRfOwogfTsKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtNjY4LDYgKzg4Niw4IEBACiBjbGFzcyBFbnVtVHlwZVRyYWl0cyB7CiAgcHVibGljOgogICB0eXBlZGVmIFR5cGUgQ29uc3RUeXBlOworICB0eXBlZGVmIFR5cGUgTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgRW51bVR5cGVUcmFpdHM8VHlwZSwgSXNWYWxpZD4gU2luZ3VsYXI7CiAKICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpIHsKQEAgLTY4NCw2ICs5MDQsMTAgQEAKIGNsYXNzIFJlcGVhdGVkRW51bVR5cGVUcmFpdHMgewogIHB1YmxpYzoKICAgdHlwZWRlZiBUeXBlIENvbnN0VHlwZTsKKyAgdHlwZWRlZiBUeXBlIE11dGFibGVUeXBlOworICB0eXBlZGVmIFJlcGVhdGVkRW51bVR5cGVUcmFpdHM8VHlwZSwgSXNWYWxpZD4gUmVwZWF0ZWQ7CisKKyAgdHlwZWRlZiBSZXBlYXRlZEZpZWxkPFR5cGU+IFJlcGVhdGVkRmllbGRUeXBlOwogCiAgIHN0YXRpYyBpbmxpbmUgQ29uc3RUeXBlIEdldChpbnQgbnVtYmVyLCBjb25zdCBFeHRlbnNpb25TZXQmIHNldCwgaW50IGluZGV4KSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHNldC5HZXRSZXBlYXRlZEVudW0obnVtYmVyLCBpbmRleCkpOwpAQCAtNjk4LDYgKzkyMiwzNSBAQAogICAgIEdPT0dMRV9EQ0hFQ0soSXNWYWxpZCh2YWx1ZSkpOwogICAgIHNldC0+QWRkRW51bShudW1iZXIsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgdmFsdWUsIE5VTEwpOwogICB9CisgIHN0YXRpYyBpbmxpbmUgY29uc3QgUmVwZWF0ZWRGaWVsZDxUeXBlPiYgR2V0UmVwZWF0ZWQoaW50IG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFeHRlbnNpb25TZXQmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2V0KSB7CisgICAgLy8gSGFjazogdGhlIGBFeHRlbnNpb25gIHN0cnVjdCBzdG9yZXMgYSBSZXBlYXRlZEZpZWxkPGludD4gZm9yIGVudW1zLgorICAgIC8vIFJlcGVhdGVkRmllbGQ8aW50PiBjYW5ub3QgaW1wbGljaXRseSBjb252ZXJ0IHRvIFJlcGVhdGVkRmllbGQ8RW51bVR5cGU+CisgICAgLy8gc28gd2UgbmVlZCB0byBkbyBzb21lIGNhc3RpbmcgbWFnaWMuIFNlZSBtZXNzYWdlLmggZm9yIHNpbWlsYXIKKyAgICAvLyBjb250b3J0aW9ucyBmb3Igbm9uLWV4dGVuc2lvbiBmaWVsZHMuCisgICAgcmV0dXJuICpyZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGQ8VHlwZT4qPigKKyAgICAgICAgc2V0LkdldFJhd1JlcGVhdGVkRmllbGQobnVtYmVyLCBHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpKSk7CisgIH0KKworICBzdGF0aWMgaW5saW5lIFJlcGVhdGVkRmllbGQ8VHlwZT4qIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRGaWVsZDxUeXBlPio+KAorICAgICAgICBzZXQtPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLCBOVUxMKSk7CisgIH0KKworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkgeworICAgIC8vIEhhY2s6IGFzIG5vdGVkIGFib3ZlLCByZXBlYXRlZCBlbnVtIGZpZWxkcyBhcmUgaW50ZXJuYWxseSBzdG9yZWQgYXMgYQorICAgIC8vIFJlcGVhdGVkRmllbGQ8aW50Pi4gV2UgbmVlZCB0byBiZSBhYmxlIHRvIGluc3RhbnRpYXRlIGdsb2JhbCBzdGF0aWMKKyAgICAvLyBvYmplY3RzIHRvIHJldHVybiBhcyBkZWZhdWx0IChlbXB0eSkgcmVwZWF0ZWQgZmllbGRzIG9uIG5vbi1leGlzdGVudAorICAgIC8vIGV4dGVuc2lvbnMuIFdlIHdvdWxkIG5vdCBiZSBhYmxlIHRvIGtub3cgYS1wcmlvcmkgYWxsIG9mIHRoZSBlbnVtIHR5cGVzCisgICAgLy8gKHZhbHVlcyBvZiB8VHlwZXwpIHRvIGluc3RhbnRpYXRlIGFsbCBvZiB0aGVzZSwgc28gd2UganVzdCByZS11c2UgaW50MzIncworICAgIC8vIGRlZmF1bHQgcmVwZWF0ZWQgZmllbGQgb2JqZWN0LgorICAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGQ8VHlwZT4qPigKKyAgICAgICAgUmVwZWF0ZWRQcmltaXRpdmVUeXBlVHJhaXRzPGludDMyPjo6R2V0RGVmYXVsdFJlcGVhdGVkRmllbGQoKSk7CisgIH0KIH07CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTcxMSw2ICs5NjQsNyBAQAogIHB1YmxpYzoKICAgdHlwZWRlZiBjb25zdCBUeXBlJiBDb25zdFR5cGU7CiAgIHR5cGVkZWYgVHlwZSogTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgTWVzc2FnZVR5cGVUcmFpdHM8VHlwZT4gU2luZ3VsYXI7CiAKICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29uc3RUeXBlIGRlZmF1bHRfdmFsdWUpIHsKQEAgLTcyMiwxMyArOTc2LDI4IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGUqPigKICAgICAgIHNldC0+TXV0YWJsZU1lc3NhZ2UobnVtYmVyLCBmaWVsZF90eXBlLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCksIE5VTEwpKTsKICAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgU2V0QWxsb2NhdGVkKGludCBudW1iZXIsIEZpZWxkVHlwZSBmaWVsZF90eXBlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE11dGFibGVUeXBlIG1lc3NhZ2UsIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgc2V0LT5TZXRBbGxvY2F0ZWRNZXNzYWdlKG51bWJlciwgZmllbGRfdHlwZSwgTlVMTCwgbWVzc2FnZSk7CisgIH0KKyAgc3RhdGljIGlubGluZSBNdXRhYmxlVHlwZSBSZWxlYXNlKGludCBudW1iZXIsIEZpZWxkVHlwZSAvKiBmaWVsZF90eXBlICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgRXh0ZW5zaW9uU2V0KiBzZXQpIHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KHNldC0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICAgIG51bWJlciwgVHlwZTo6ZGVmYXVsdF9pbnN0YW5jZSgpKSk7CisgIH0KIH07CiAKKy8vIGZvcndhcmQgZGVjbGFyYXRpb24KK2NsYXNzIFJlcGVhdGVkTWVzc2FnZUdlbmVyaWNUeXBlVHJhaXRzOworCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KIGNsYXNzIFJlcGVhdGVkTWVzc2FnZVR5cGVUcmFpdHMgewogIHB1YmxpYzoKICAgdHlwZWRlZiBjb25zdCBUeXBlJiBDb25zdFR5cGU7CiAgIHR5cGVkZWYgVHlwZSogTXV0YWJsZVR5cGU7CisgIHR5cGVkZWYgUmVwZWF0ZWRNZXNzYWdlVHlwZVRyYWl0czxUeXBlPiBSZXBlYXRlZDsKKworICB0eXBlZGVmIFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4gUmVwZWF0ZWRGaWVsZFR5cGU7CiAKICAgc3RhdGljIGlubGluZSBDb25zdFR5cGUgR2V0KGludCBudW1iZXIsIGNvbnN0IEV4dGVuc2lvblNldCYgc2V0LCBpbnQgaW5kZXgpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgVHlwZSY+KHNldC5HZXRSZXBlYXRlZE1lc3NhZ2UobnVtYmVyLCBpbmRleCkpOwpAQCAtNzQxLDggKzEwMTAsNTIgQEAKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8VHlwZSo+KAogICAgICAgICBzZXQtPkFkZE1lc3NhZ2UobnVtYmVyLCBmaWVsZF90eXBlLCBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCksIE5VTEwpKTsKICAgfQorICBzdGF0aWMgaW5saW5lIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4mIEdldFJlcGVhdGVkKGludCBudW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRXh0ZW5zaW9uU2V0JgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNldCkgeworICAgIC8vIFNlZSBub3RlcyBhYm92ZSBpbiBSZXBlYXRlZEVudW1UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZCgpOiBzYW1lCisgICAgLy8gY2FzdGluZyBoYWNrIGFwcGxpZXMgaGVyZSwgYmVjYXVzZSBhIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+CisgICAgLy8gY2Fubm90IG5hdHVyYWxseSBiZWNvbWUgYSBSZXBlYXRlZFB0clR5cGU8VHlwZT4gZXZlbiB0aG91Z2ggVHlwZSBpcworICAgIC8vIHByZXN1bWFibHkgYSBtZXNzYWdlLiBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlIGdvZXMgdGhyb3VnaCBzaW1pbGFyIGNvbnRvcnRpb25zCisgICAgLy8gd2l0aCBhIHJlaW50ZXJwcmV0X2Nhc3Q8Pi4KKyAgICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxUeXBlPio+KAorICAgICAgICBzZXQuR2V0UmF3UmVwZWF0ZWRGaWVsZChudW1iZXIsIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCkpKTsKKyAgfQorICBzdGF0aWMgaW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8VHlwZT4qIE11dGFibGVSZXBlYXRlZChpbnQgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaWVsZFR5cGUgZmllbGRfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEV4dGVuc2lvblNldCogc2V0KSB7CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxUeXBlPio+KAorICAgICAgICBzZXQtPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG51bWJlciwgZmllbGRfdHlwZSwgaXNfcGFja2VkLCBOVUxMKSk7CisgIH0KKworICBzdGF0aWMgY29uc3QgUmVwZWF0ZWRGaWVsZFR5cGUqIEdldERlZmF1bHRSZXBlYXRlZEZpZWxkKCk7CiB9OwogCitMSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFByb3RvYnVmT25jZVR5cGUgcmVwZWF0ZWRfbWVzc2FnZV9nZW5lcmljX3R5cGVfdHJhaXRzX29uY2VfaW5pdF87CisKKy8vIFRoaXMgY2xhc3MgZXhpc3RzIG9ubHkgdG8gaG9sZCBhIGdlbmVyaWMgZGVmYXVsdCBlbXB0eSByZXBlYXRlZCBmaWVsZCBmb3IgYWxsCisvLyBtZXNzYWdlLXR5cGUgcmVwZWF0ZWQgZmllbGQgZXh0ZW5zaW9ucy4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0cyB7CisgcHVibGljOgorICB0eXBlZGVmIFJlcGVhdGVkUHRyRmllbGQ8IDo6Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZUxpdGUqPiBSZXBlYXRlZEZpZWxkVHlwZTsKKyBwcml2YXRlOgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBmcmllbmQgY2xhc3MgUmVwZWF0ZWRNZXNzYWdlVHlwZVRyYWl0czsKKyAgc3RhdGljIHZvaWQgSW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcygpOworICBzdGF0aWMgdm9pZCBEZXN0cm95RGVmYXVsdFJlcGVhdGVkRmllbGRzKCk7CisgIHN0YXRpYyBjb25zdCBSZXBlYXRlZEZpZWxkVHlwZSogZGVmYXVsdF9yZXBlYXRlZF9maWVsZF87Cit9OworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlPiBpbmxpbmUKKyAgICBjb25zdCB0eXBlbmFtZSBSZXBlYXRlZE1lc3NhZ2VUeXBlVHJhaXRzPFR5cGU+OjpSZXBlYXRlZEZpZWxkVHlwZSoKKyAgICBSZXBlYXRlZE1lc3NhZ2VUeXBlVHJhaXRzPFR5cGU+OjpHZXREZWZhdWx0UmVwZWF0ZWRGaWVsZCgpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpHb29nbGVPbmNlSW5pdCgKKyAgICAgICZyZXBlYXRlZF9tZXNzYWdlX2dlbmVyaWNfdHlwZV90cmFpdHNfb25jZV9pbml0XywKKyAgICAgICZSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0czo6SW5pdGlhbGl6ZURlZmF1bHRSZXBlYXRlZEZpZWxkcyk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IFJlcGVhdGVkRmllbGRUeXBlKj4oCisgICAgICBSZXBlYXRlZE1lc3NhZ2VHZW5lcmljVHlwZVRyYWl0czo6ZGVmYXVsdF9yZXBlYXRlZF9maWVsZF8pOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBFeHRlbnNpb25JZGVudGlmaWVyCiAKQEAgLTc4OSwxMTQgKzExMDIsMTYxIEBACiAvLyBjYXVzZXMgcHJvYmxlbXMgaWYgdGhlIGNsYXNzIGhhcyBhIG5lc3RlZCBtZXNzYWdlIG9yIGVudW0gdHlwZSB3aXRoIHRoYXQKIC8vIG5hbWUgYW5kICJfVHlwZVRyYWl0cyIgaXMgdGVjaG5pY2FsbHkgcmVzZXJ2ZWQgZm9yIHRoZSBDKysgbGlicmFyeSBzaW5jZQogLy8gaXQgc3RhcnRzIHdpdGggYW4gdW5kZXJzY29yZSBmb2xsb3dlZCBieSBhIGNhcGl0YWwgbGV0dGVyLgorLy8KKy8vIEZvciBzaW1pbGFyIHJlYXNvbiwgd2UgdXNlICJfZmllbGRfdHlwZSIgYW5kICJfaXNfcGFja2VkIiBhcyBwYXJhbWV0ZXIgbmFtZXMKKy8vIGJlbG93LCBzbyB0aGF0ICJmaWVsZF90eXBlIiBhbmQgImlzX3BhY2tlZCIgY2FuIGJlIHVzZWQgYXMgZmllbGQgbmFtZXMuCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9FWFRFTlNJT05fQUNDRVNTT1JTKENMQVNTTkFNRSkgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIC8qIEhhcywgU2l6ZSwgQ2xlYXIgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgaW5saW5lIGJvb2wgSGFzRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsgICBcCiAgICAgcmV0dXJuIF9leHRlbnNpb25zXy5IYXMoaWQubnVtYmVyKCkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgaW5saW5lIHZvaWQgQ2xlYXJFeHRlbnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsgICAgICAgICBcCiAgICAgX2V4dGVuc2lvbnNfLkNsZWFyRXh0ZW5zaW9uKGlkLm51bWJlcigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgaW5saW5lIGludCBFeHRlbnNpb25TaXplKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsgICBcCiAgICAgcmV0dXJuIF9leHRlbnNpb25zXy5FeHRlbnNpb25TaXplKGlkLm51bWJlcigpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIC8qIFNpbmd1bGFyIGFjY2Vzc29ycyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OkNvbnN0VHlwZSBHZXRFeHRlbnNpb24oICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6Q29uc3RUeXBlIEdldEV4dGVuc2lvbiggICAgICAgIFwKICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSBjb25zdCB7ICAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsgICBcCiAgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXQoaWQubnVtYmVyKCksIF9leHRlbnNpb25zXywgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWQuZGVmYXVsdF92YWx1ZSgpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgTXV0YWJsZUV4dGVuc2lvbiggIFwKICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgICBcCi0gICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBmaWVsZF90eXBlLCAmX2V4dGVuc2lvbnNfKTtcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQpIHsgICAgICAgICBcCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfZXh0ZW5zaW9uc18pOyAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgYm9vbCBpc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgaW5saW5lIHZvaWQgU2V0RXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIGZpZWxkX3R5cGUsIGlzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgICBcCi0gICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6Q29uc3RUeXBlIHZhbHVlKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgZmllbGRfdHlwZSwgdmFsdWUsICZfZXh0ZW5zaW9uc18pOyAgICBcCisgICAgICAgIENMQVNTTkFNRSwgX3Byb3RvX1R5cGVUcmFpdHMsIF9maWVsZF90eXBlLCBfaXNfcGFja2VkPiYgaWQsICAgICAgICAgICBcCisgICAgICB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6OkNvbnN0VHlwZSB2YWx1ZSkgeyAgICAgICAgICAgICAgICBcCisgICAgX3Byb3RvX1R5cGVUcmFpdHM6OlNldChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsIHZhbHVlLCAmX2V4dGVuc2lvbnNfKTsgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdm9pZCBTZXRBbGxvY2F0ZWRFeHRlbnNpb24oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY29uc3QgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RXh0ZW5zaW9uSWRlbnRpZmllcjwgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsIF9pc19wYWNrZWQ+JiBpZCwgICAgICAgICAgIFwKKyAgICAgIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpTaW5ndWxhcjo6TXV0YWJsZVR5cGUgdmFsdWUpIHsgICAgICAgICAgICAgIFwKKyAgICBfcHJvdG9fVHlwZVRyYWl0czo6U2V0QWxsb2NhdGVkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLCAmX2V4dGVuc2lvbnNfKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6U2luZ3VsYXI6Ok11dGFibGVUeXBlIFJlbGVhc2VFeHRlbnNpb24oICBcCisgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgXAorICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6UmVsZWFzZShpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX2V4dGVuc2lvbnNfKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAvKiBSZXBlYXRlZCBhY2Nlc3NvcnMgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpDb25zdFR5cGUgR2V0RXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSBHZXRFeHRlbnNpb24oICAgICAgICBcCiAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCwgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAogICAgICAgaW50IGluZGV4KSBjb25zdCB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6R2V0KGlkLm51bWJlcigpLCBfZXh0ZW5zaW9uc18sIGluZGV4KTsgICAgICAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlVHlwZSBNdXRhYmxlRXh0ZW5zaW9uKCAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIE11dGFibGVFeHRlbnNpb24oICBcCiAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCwgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAogICAgICAgaW50IGluZGV4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6TXV0YWJsZShpZC5udW1iZXIoKSwgaW5kZXgsICZfZXh0ZW5zaW9uc18pOyAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGlubGluZSB2b2lkIFNldEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCwgICAgICAgICAgICAgXAotICAgICAgaW50IGluZGV4LCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6Q29uc3RUeXBlIHZhbHVlKSB7ICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAorICAgICAgaW50IGluZGV4LCB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6OkNvbnN0VHlwZSB2YWx1ZSkgeyAgICAgXAogICAgIF9wcm90b19UeXBlVHJhaXRzOjpTZXQoaWQubnVtYmVyKCksIGluZGV4LCB2YWx1ZSwgJl9leHRlbnNpb25zXyk7ICAgICAgICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgaW5saW5lIHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpNdXRhYmxlVHlwZSBBZGRFeHRlbnNpb24oICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIGlubGluZSB0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0czo6UmVwZWF0ZWQ6Ok11dGFibGVUeXBlIEFkZEV4dGVuc2lvbiggICAgICBcCiAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCkgeyAgICAgICAgICAgXAotICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBmaWVsZF90eXBlLCAmX2V4dGVuc2lvbnNfKTsgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgXAorICAgIHJldHVybiBfcHJvdG9fVHlwZVRyYWl0czo6QWRkKGlkLm51bWJlcigpLCBfZmllbGRfdHlwZSwgJl9leHRlbnNpb25zXyk7ICAgXAogICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIGZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICAgIGJvb2wgaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkZpZWxkVHlwZSBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBib29sIF9pc19wYWNrZWQ+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgIGlubGluZSB2b2lkIEFkZEV4dGVuc2lvbiggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCiAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBmaWVsZF90eXBlLCBpc19wYWNrZWQ+JiBpZCwgICAgICAgICAgICAgXAotICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OkNvbnN0VHlwZSB2YWx1ZSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIGZpZWxkX3R5cGUsIGlzX3BhY2tlZCwgICAgICAgICAgICAgICAgXAorICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgX2lzX3BhY2tlZD4mIGlkLCAgICAgICAgICAgXAorICAgICAgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpDb25zdFR5cGUgdmFsdWUpIHsgICAgICAgICAgICAgICAgXAorICAgIF9wcm90b19UeXBlVHJhaXRzOjpBZGQoaWQubnVtYmVyKCksIF9maWVsZF90eXBlLCBfaXNfcGFja2VkLCAgICAgICAgICAgICAgXAogICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsICZfZXh0ZW5zaW9uc18pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RmllbGRUeXBlIF9maWVsZF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGJvb2wgX2lzX3BhY2tlZD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgaW5saW5lIGNvbnN0IHR5cGVuYW1lIF9wcm90b19UeXBlVHJhaXRzOjpSZXBlYXRlZDo6UmVwZWF0ZWRGaWVsZFR5cGUmICAgICAgIFwKKyAgICAgIEdldFJlcGVhdGVkRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICBjb25zdCA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpFeHRlbnNpb25JZGVudGlmaWVyPCAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBDTEFTU05BTUUsIF9wcm90b19UeXBlVHJhaXRzLCBfZmllbGRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBfaXNfcGFja2VkPiYgaWQpIGNvbnN0IHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIF9wcm90b19UeXBlVHJhaXRzOjpHZXRSZXBlYXRlZChpZC5udW1iZXIoKSwgX2V4dGVuc2lvbnNfKTsgICAgICAgICBcCisgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfcHJvdG9fVHlwZVRyYWl0cywgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpGaWVsZFR5cGUgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgYm9vbCBfaXNfcGFja2VkPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBpbmxpbmUgdHlwZW5hbWUgX3Byb3RvX1R5cGVUcmFpdHM6OlJlcGVhdGVkOjpSZXBlYXRlZEZpZWxkVHlwZSogICAgICAgICAgICAgXAorICAgICAgTXV0YWJsZVJlcGVhdGVkRXh0ZW5zaW9uKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkV4dGVuc2lvbklkZW50aWZpZXI8ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgQ0xBU1NOQU1FLCBfcHJvdG9fVHlwZVRyYWl0cywgX2ZpZWxkX3R5cGUsICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgX2lzX3BhY2tlZD4mIGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gX3Byb3RvX1R5cGVUcmFpdHM6Ok11dGFibGVSZXBlYXRlZChpZC5udW1iZXIoKSwgX2ZpZWxkX3R5cGUsICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfaXNfcGFja2VkLCAmX2V4dGVuc2lvbnNfKTsgICAgIFwKICAgfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X2hlYXZ5LmNjCmluZGV4IGUwMGZkNGQuLjgyZTNlMDkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfaGVhdnkuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF9oZWF2eS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsMTcgKzM1LDQzIEBACiAvLyBDb250YWlucyBtZXRob2RzIGRlZmluZWQgaW4gZXh0ZW5zaW9uX3NldC5oIHdoaWNoIGNhbm5vdCBiZSBwYXJ0IG9mIHRoZQogLy8gbGl0ZSBsaWJyYXJ5IGJlY2F1c2UgdGhleSB1c2UgZGVzY3JpcHRvcnMgb3IgcmVmbGVjdGlvbi4KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgeworCiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGludGVybmFsIHsKIAorLy8gQSBGaWVsZFNraXBwZXIgdXNlZCB0byBzdG9yZSB1bmtub3duIE1lc3NhZ2VTZXQgZmllbGRzIGludG8gVW5rbm93bkZpZWxkU2V0LgorY2xhc3MgTWVzc2FnZVNldEZpZWxkU2tpcHBlcgorICAgIDogcHVibGljIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBNZXNzYWdlU2V0RmllbGRTa2lwcGVyKFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpCisgICAgICA6IFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcih1bmtub3duX2ZpZWxkcykge30KKyAgdmlydHVhbCB+TWVzc2FnZVNldEZpZWxkU2tpcHBlcigpIHt9CisKKyAgdmlydHVhbCBib29sIFNraXBNZXNzYWdlU2V0RmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfbnVtYmVyKTsKK307Citib29sIE1lc3NhZ2VTZXRGaWVsZFNraXBwZXI6OlNraXBNZXNzYWdlU2V0RmllbGQoCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBpbnQgZmllbGRfbnVtYmVyKSB7CisgIHVpbnQzMiBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBpZiAodW5rbm93bl9maWVsZHNfID09IE5VTEwpIHsKKyAgICByZXR1cm4gaW5wdXQtPlNraXAobGVuZ3RoKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gaW5wdXQtPlJlYWRTdHJpbmcoCisgICAgICAgIHVua25vd25fZmllbGRzXy0+QWRkTGVuZ3RoRGVsaW1pdGVkKGZpZWxkX251bWJlciksIGxlbmd0aCk7CisgIH0KK30KKworCiAvLyBJbXBsZW1lbnRhdGlvbiBvZiBFeHRlbnNpb25GaW5kZXIgd2hpY2ggZmluZHMgZXh0ZW5zaW9ucyBpbiBhIGdpdmVuCiAvLyBEZXNjcmlwdG9yUG9vbCwgdXNpbmcgdGhlIGdpdmVuIE1lc3NhZ2VGYWN0b3J5IHRvIGNvbnN0cnVjdCBzdWItb2JqZWN0cy4KIC8vIFRoaXMgY2xhc3MgaXMgaW1wbGVtZW50ZWQgaW4gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYy4KQEAgLTY1LDkgKzkxLDEwIEBACiAgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZV87CiB9OwogCi12b2lkIEV4dGVuc2lvblNldDo6QXBwZW5kVG9MaXN0KGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdCB7Cit2b2lkIEV4dGVuc2lvblNldDo6QXBwZW5kVG9MaXN0KAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiogb3V0cHV0KSBjb25zdCB7CiAgIGZvciAobWFwPGludCwgRXh0ZW5zaW9uPjo6Y29uc3RfaXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmJlZ2luKCk7CiAgICAgICAgaXRlciAhPSBleHRlbnNpb25zXy5lbmQoKTsgKytpdGVyKSB7CiAgICAgYm9vbCBoYXMgPSBmYWxzZTsKQEAgLTEwMyw2ICsxMzAsMTEgQEAKICAgICAgIHN0YXRpY19jYXN0PEZpZWxkRGVzY3JpcHRvcjo6VHlwZT4odHlwZSkpOwogfQogCitpbmxpbmUgV2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZSBmaWVsZF90eXBlKEZpZWxkVHlwZSB0eXBlKSB7CisgIEdPT0dMRV9EQ0hFQ0sodHlwZSA+IDAgJiYgdHlwZSA8PSBXaXJlRm9ybWF0TGl0ZTo6TUFYX0ZJRUxEX1RZUEUpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6OkZpZWxkVHlwZT4odHlwZSk7Cit9CisKICNkZWZpbmUgR09PR0xFX0RDSEVDS19UWVBFKEVYVEVOU0lPTiwgTEFCRUwsIENQUFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgR09PR0xFX0RDSEVDS19FUSgoRVhURU5TSU9OKS5pc19yZXBlYXRlZCA/IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfUkVQRUFURUQgICAgIFwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IEZpZWxkRGVzY3JpcHRvcjo6TEFCRUxfT1BUSU9OQUwsICAgICAgXApAQCAtMTE4LDcgKzE1MCwxMiBAQAogICAgIHJldHVybiAqZmFjdG9yeS0+R2V0UHJvdG90eXBlKG1lc3NhZ2VfdHlwZSk7CiAgIH0gZWxzZSB7CiAgICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIE1FU1NBR0UpOwotICAgIHJldHVybiAqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7CisgICAgaWYgKGl0ZXItPnNlY29uZC5pc19sYXp5KSB7CisgICAgICByZXR1cm4gaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlLT5HZXRNZXNzYWdlKAorICAgICAgICAgICpmYWN0b3J5LT5HZXRQcm90b3R5cGUobWVzc2FnZV90eXBlKSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiAqaXRlci0+c2Vjb25kLm1lc3NhZ2VfdmFsdWU7CisgICAgfQogICB9CiB9CiAKQEAgLTEzMiwzMiArMTY5LDcyIEBACiAgICAgZXh0ZW5zaW9uLT5pc19wYWNrZWQgPSBmYWxzZTsKICAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlID0KICAgICAgICAgZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKTsKLSAgICBHT09HTEVfQ0hFQ0socHJvdG90eXBlICE9IE5VTEwpOwotICAgIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZSA9IHByb3RvdHlwZS0+TmV3KCk7CisgICAgZXh0ZW5zaW9uLT5pc19sYXp5ID0gZmFsc2U7CisgICAgZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlID0gcHJvdG90eXBlLT5OZXcoYXJlbmFfKTsKKyAgICBleHRlbnNpb24tPmlzX2NsZWFyZWQgPSBmYWxzZTsKKyAgICByZXR1cm4gZXh0ZW5zaW9uLT5tZXNzYWdlX3ZhbHVlOwogICB9IGVsc2UgewogICAgIEdPT0dMRV9EQ0hFQ0tfVFlQRSgqZXh0ZW5zaW9uLCBPUFRJT05BTCwgTUVTU0FHRSk7CisgICAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7CisgICAgaWYgKGV4dGVuc2lvbi0+aXNfbGF6eSkgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbi0+bGF6eW1lc3NhZ2VfdmFsdWUtPk11dGFibGVNZXNzYWdlKAorICAgICAgICAgICpmYWN0b3J5LT5HZXRQcm90b3R5cGUoZGVzY3JpcHRvci0+bWVzc2FnZV90eXBlKCkpKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIGV4dGVuc2lvbi0+bWVzc2FnZV92YWx1ZTsKKyAgICB9CiAgIH0KLSAgZXh0ZW5zaW9uLT5pc19jbGVhcmVkID0gZmFsc2U7Ci0gIHJldHVybiBleHRlbnNpb24tPm1lc3NhZ2VfdmFsdWU7CiB9CiAKLU1lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OkFkZE1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgeworTWVzc2FnZUxpdGUqIEV4dGVuc2lvblNldDo6UmVsZWFzZU1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIHsKKyAgbWFwPGludCwgRXh0ZW5zaW9uPjo6aXRlcmF0b3IgaXRlciA9IGV4dGVuc2lvbnNfLmZpbmQoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICBpZiAoaXRlciA9PSBleHRlbnNpb25zXy5lbmQoKSkgeworICAgIC8vIE5vdCBwcmVzZW50LiAgUmV0dXJuIE5VTEwuCisgICAgcmV0dXJuIE5VTEw7CisgIH0gZWxzZSB7CisgICAgR09PR0xFX0RDSEVDS19UWVBFKGl0ZXItPnNlY29uZCwgT1BUSU9OQUwsIE1FU1NBR0UpOworICAgIE1lc3NhZ2VMaXRlKiByZXQgPSBOVUxMOworICAgIGlmIChpdGVyLT5zZWNvbmQuaXNfbGF6eSkgeworICAgICAgcmV0ID0gaXRlci0+c2Vjb25kLmxhenltZXNzYWdlX3ZhbHVlLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICAgICAqZmFjdG9yeS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3ItPm1lc3NhZ2VfdHlwZSgpKSk7CisgICAgICBpZiAoYXJlbmFfID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlIGl0ZXItPnNlY29uZC5sYXp5bWVzc2FnZV92YWx1ZTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgaWYgKGFyZW5hXyAhPSBOVUxMKSB7CisgICAgICAgIHJldCA9IChpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZSktPk5ldygpOworICAgICAgICByZXQtPkNoZWNrVHlwZUFuZE1lcmdlRnJvbSgqKGl0ZXItPnNlY29uZC5tZXNzYWdlX3ZhbHVlKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICByZXQgPSBpdGVyLT5zZWNvbmQubWVzc2FnZV92YWx1ZTsKKyAgICAgIH0KKyAgICB9CisgICAgZXh0ZW5zaW9uc18uZXJhc2UoZGVzY3JpcHRvci0+bnVtYmVyKCkpOworICAgIHJldHVybiByZXQ7CisgIH0KK30KKworRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb24qIEV4dGVuc2lvblNldDo6TWF5YmVOZXdSZXBlYXRlZEV4dGVuc2lvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKICAgRXh0ZW5zaW9uKiBleHRlbnNpb247CiAgIGlmIChNYXliZU5ld0V4dGVuc2lvbihkZXNjcmlwdG9yLT5udW1iZXIoKSwgZGVzY3JpcHRvciwgJmV4dGVuc2lvbikpIHsKICAgICBleHRlbnNpb24tPnR5cGUgPSBkZXNjcmlwdG9yLT50eXBlKCk7CiAgICAgR09PR0xFX0RDSEVDS19FUShjcHBfdHlwZShleHRlbnNpb24tPnR5cGUpLCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSk7CiAgICAgZXh0ZW5zaW9uLT5pc19yZXBlYXRlZCA9IHRydWU7CiAgICAgZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlID0KLSAgICAgIG5ldyBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2VMaXRlPigpOworICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVNZXNzYWdlPFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZUxpdGU+ID4oYXJlbmFfKTsKICAgfSBlbHNlIHsKICAgICBHT09HTEVfRENIRUNLX1RZUEUoKmV4dGVuc2lvbiwgUkVQRUFURUQsIE1FU1NBR0UpOwogICB9CisgIHJldHVybiBleHRlbnNpb247Cit9CisKK01lc3NhZ2VMaXRlKiBFeHRlbnNpb25TZXQ6OkFkZE1lc3NhZ2UoY29uc3QgRmllbGREZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgeworICBFeHRlbnNpb24qIGV4dGVuc2lvbiA9IE1heWJlTmV3UmVwZWF0ZWRFeHRlbnNpb24oZGVzY3JpcHRvcik7CiAKICAgLy8gUmVwZWF0ZWRQdHJGaWVsZDxNZXNzYWdlPiBkb2VzIG5vdCBrbm93IGhvdyB0byBBZGQoKSBzaW5jZSBpdCBjYW5ub3QKICAgLy8gYWxsb2NhdGUgYW4gYWJzdHJhY3Qgb2JqZWN0LCBzbyB3ZSBoYXZlIHRvIGJlIHRyaWNreS4KICAgTWVzc2FnZUxpdGUqIHJlc3VsdCA9IGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZQotICAgICAgLT5BZGRGcm9tQ2xlYXJlZDxpbnRlcm5hbDo6R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPiA+KCk7CisgICAgICAtPkFkZEZyb21DbGVhcmVkPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT4gPigpOwogICBpZiAocmVzdWx0ID09IE5VTEwpIHsKICAgICBjb25zdCBNZXNzYWdlTGl0ZSogcHJvdG90eXBlOwogICAgIGlmIChleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPnNpemUoKSA9PSAwKSB7CkBAIC0xNjYsMTIgKzI0MywxOSBAQAogICAgIH0gZWxzZSB7CiAgICAgICBwcm90b3R5cGUgPSAmZXh0ZW5zaW9uLT5yZXBlYXRlZF9tZXNzYWdlX3ZhbHVlLT5HZXQoMCk7CiAgICAgfQotICAgIHJlc3VsdCA9IHByb3RvdHlwZS0+TmV3KCk7CisgICAgcmVzdWx0ID0gcHJvdG90eXBlLT5OZXcoYXJlbmFfKTsKICAgICBleHRlbnNpb24tPnJlcGVhdGVkX21lc3NhZ2VfdmFsdWUtPkFkZEFsbG9jYXRlZChyZXN1bHQpOwogICB9CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpBZGRBbGxvY2F0ZWRNZXNzYWdlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBuZXdfZW50cnkpIHsKKyAgRXh0ZW5zaW9uKiBleHRlbnNpb24gPSBNYXliZU5ld1JlcGVhdGVkRXh0ZW5zaW9uKGRlc2NyaXB0b3IpOworCisgIGV4dGVuc2lvbi0+cmVwZWF0ZWRfbWVzc2FnZV92YWx1ZS0+QWRkQWxsb2NhdGVkKG5ld19lbnRyeSk7Cit9CisKIHN0YXRpYyBib29sIFZhbGlkYXRlRW51bVVzaW5nRGVzY3JpcHRvcihjb25zdCB2b2lkKiBhcmcsIGludCBudW1iZXIpIHsKICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgRW51bURlc2NyaXB0b3IqPihhcmcpCiAgICAgICAtPkZpbmRWYWx1ZUJ5TnVtYmVyKG51bWJlcikgIT0gTlVMTDsKQEAgLTIwMiwxMCArMjg2LDEwIEBACiAgIH0KIH0KIAotYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGRIZWF2eSh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGNvbnRhaW5pbmdfdHlwZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICBGaWVsZFNraXBwZXIgc2tpcHBlcih1bmtub3duX2ZpZWxkcyk7Citib29sIEV4dGVuc2lvblNldDo6UGFyc2VGaWVsZCh1aW50MzIgdGFnLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBNZXNzYWdlKiBjb250YWluaW5nX3R5cGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKSB7CisgIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlciBza2lwcGVyKHVua25vd25fZmllbGRzKTsKICAgaWYgKGlucHV0LT5HZXRFeHRlbnNpb25Qb29sKCkgPT0gTlVMTCkgewogICAgIEdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlciBmaW5kZXIoY29udGFpbmluZ190eXBlKTsKICAgICByZXR1cm4gUGFyc2VGaWVsZCh0YWcsIGlucHV0LCAmZmluZGVyLCAmc2tpcHBlcik7CkBAIC0yMTcsMTAgKzMwMSwxMCBAQAogICB9CiB9CiAKLWJvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXRIZWF2eShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogY29udGFpbmluZ190eXBlLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKLSAgRmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOworYm9vbCBFeHRlbnNpb25TZXQ6OlBhcnNlTWVzc2FnZVNldChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGNvbnRhaW5pbmdfdHlwZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyIHNraXBwZXIodW5rbm93bl9maWVsZHMpOwogICBpZiAoaW5wdXQtPkdldEV4dGVuc2lvblBvb2woKSA9PSBOVUxMKSB7CiAgICAgR2VuZXJhdGVkRXh0ZW5zaW9uRmluZGVyIGZpbmRlcihjb250YWluaW5nX3R5cGUpOwogICAgIHJldHVybiBQYXJzZU1lc3NhZ2VTZXQoaW5wdXQsICZmaW5kZXIsICZza2lwcGVyKTsKQEAgLTI4Niw3ICszNzAsMTEgQEAKICAgICAgICAgICAgICAgICAgICAgICBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCpzdHJpbmdfdmFsdWUpOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIHRvdGFsX3NpemUgKz0gZG93bl9jYXN0PE1lc3NhZ2UqPihtZXNzYWdlX3ZhbHVlKS0+U3BhY2VVc2VkKCk7CisgICAgICAgIGlmIChpc19sYXp5KSB7CisgICAgICAgICAgdG90YWxfc2l6ZSArPSBsYXp5bWVzc2FnZV92YWx1ZS0+U3BhY2VVc2VkKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgdG90YWxfc2l6ZSArPSBkb3duX2Nhc3Q8TWVzc2FnZSo+KG1lc3NhZ2VfdmFsdWUpLT5TcGFjZVVzZWQoKTsKKyAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIGRlZmF1bHQ6CiAgICAgICAgIC8vIE5vIGV4dHJhIHN0b3JhZ2UgY29zdHMgZm9yIHByaW1pdGl2ZSB0eXBlcy4KQEAgLTQxOSw4ICs1MDcsMTUgQEAKICAgICAgIEhBTkRMRV9UWVBFKCAgIEJZVEVTLCAgICBCeXRlcywgICpzdHJpbmdfdmFsdWUpOwogICAgICAgSEFORExFX1RZUEUoICAgIEVOVU0sICAgICBFbnVtLCAgICAgZW51bV92YWx1ZSk7CiAgICAgICBIQU5ETEVfVFlQRSggICBHUk9VUCwgICAgR3JvdXAsICptZXNzYWdlX3ZhbHVlKTsKLSAgICAgIEhBTkRMRV9UWVBFKCBNRVNTQUdFLCAgTWVzc2FnZSwgKm1lc3NhZ2VfdmFsdWUpOwogI3VuZGVmIEhBTkRMRV9UWVBFCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoaXNfbGF6eSkgeworICAgICAgICAgIHRhcmdldCA9IGxhenltZXNzYWdlX3ZhbHVlLT5Xcml0ZU1lc3NhZ2VUb0FycmF5KG51bWJlciwgdGFyZ2V0KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlVG9BcnJheSgKKyAgICAgICAgICAgICAgbnVtYmVyLCAqbWVzc2FnZV92YWx1ZSwgdGFyZ2V0KTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKICAgICB9CiAgIH0KICAgcmV0dXJuIHRhcmdldDsKQEAgLTQ0NCwxNCArNTM5LDIxNiBAQAogICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVVSW50MzJUb0FycmF5KAogICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkTnVtYmVyLCBudW1iZXIsIHRhcmdldCk7CiAgIC8vIFdyaXRlIG1lc3NhZ2UuCi0gIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZU1lc3NhZ2VUb0FycmF5KAotICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwgKm1lc3NhZ2VfdmFsdWUsIHRhcmdldCk7CisgIGlmIChpc19sYXp5KSB7CisgICAgdGFyZ2V0ID0gbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZVRvQXJyYXkoCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsIHRhcmdldCk7CisgIH0gZWxzZSB7CisgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlTWVzc2FnZVRvQXJyYXkoCisgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VOdW1iZXIsICptZXNzYWdlX3ZhbHVlLCB0YXJnZXQpOworICB9CiAgIC8vIEVuZCBncm91cC4KICAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVRhZ1RvQXJyYXkoCiAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnLCB0YXJnZXQpOwogICByZXR1cm4gdGFyZ2V0OwogfQogCisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZUZpZWxkTWF5YmVMYXppbHkoCisgICAgaW50IHdpcmVfdHlwZSwgaW50IGZpZWxkX251bWJlciwgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIEV4dGVuc2lvbkZpbmRlciogZXh0ZW5zaW9uX2ZpbmRlciwKKyAgICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7CisgIHJldHVybiBQYXJzZUZpZWxkKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgZmllbGRfbnVtYmVyLCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGU+KHdpcmVfdHlwZSkpLAorICAgICAgICAgICAgICAgICAgICBpbnB1dCwgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcik7Cit9CisKK2Jvb2wgRXh0ZW5zaW9uU2V0OjpQYXJzZU1lc3NhZ2VTZXQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VTZXRGaWVsZFNraXBwZXIqIGZpZWxkX3NraXBwZXIpIHsKKyAgd2hpbGUgKHRydWUpIHsKKyAgICBjb25zdCB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKKyAgICBzd2l0Y2ggKHRhZykgeworICAgICAgY2FzZSAwOgorICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnOgorICAgICAgICBpZiAoIVBhcnNlTWVzc2FnZVNldEl0ZW0oaW5wdXQsIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgICAgZGVmYXVsdDoKKyAgICAgICAgaWYgKCFQYXJzZUZpZWxkKHRhZywgaW5wdXQsIGV4dGVuc2lvbl9maW5kZXIsIGZpZWxkX3NraXBwZXIpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0KGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZUxpdGUqIGNvbnRhaW5pbmdfdHlwZSkgeworICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyIHNraXBwZXIoTlVMTCk7CisgIEdlbmVyYXRlZEV4dGVuc2lvbkZpbmRlciBmaW5kZXIoY29udGFpbmluZ190eXBlKTsKKyAgcmV0dXJuIFBhcnNlTWVzc2FnZVNldChpbnB1dCwgJmZpbmRlciwgJnNraXBwZXIpOworfQorCitib29sIEV4dGVuc2lvblNldDo6UGFyc2VNZXNzYWdlU2V0SXRlbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBFeHRlbnNpb25GaW5kZXIqIGV4dGVuc2lvbl9maW5kZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlU2V0RmllbGRTa2lwcGVyKiBmaWVsZF9za2lwcGVyKSB7CisgIC8vIFRPRE8oa2VudG9uKTogIEl0IHdvdWxkIGJlIG5pY2UgdG8gc2hhcmUgY29kZSBiZXR3ZWVuIHRoaXMgYW5kCisgIC8vIFdpcmVGb3JtYXRMaXRlOjpQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEl0ZW0oKSwgYnV0IEkgdGhpbmsgdGhlCisgIC8vIGRpZmZlcmVuY2VzIHdvdWxkIGJlIGhhcmQgdG8gZmFjdG9yIG91dC4KKworICAvLyBUaGlzIG1ldGhvZCBwYXJzZXMgYSBncm91cCB3aGljaCBzaG91bGQgY29udGFpbiB0d28gZmllbGRzOgorICAvLyAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOworICAvLyAgIHJlcXVpcmVkIGRhdGEgbWVzc2FnZSA9IDM7CisKKyAgdWludDMyIGxhc3RfdHlwZV9pZCA9IDA7CisKKyAgLy8gSWYgd2Ugc2VlIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQsIHdlJ2xsIGFwcGVuZCBpdCB0byB0aGlzIHNvCisgIC8vIHdlIGNhbiBwYXJzZSBpdCBsYXRlci4KKyAgc3RyaW5nIG1lc3NhZ2VfZGF0YTsKKworICB3aGlsZSAodHJ1ZSkgeworICAgIGNvbnN0IHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOworICAgIGlmICh0YWcgPT0gMCkgcmV0dXJuIGZhbHNlOworCisgICAgc3dpdGNoICh0YWcpIHsKKyAgICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnOiB7CisgICAgICAgIHVpbnQzMiB0eXBlX2lkOworICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJnR5cGVfaWQpKSByZXR1cm4gZmFsc2U7CisgICAgICAgIGxhc3RfdHlwZV9pZCA9IHR5cGVfaWQ7CisKKyAgICAgICAgaWYgKCFtZXNzYWdlX2RhdGEuZW1wdHkoKSkgeworICAgICAgICAgIC8vIFdlIHNhdyBzb21lIG1lc3NhZ2UgZGF0YSBiZWZvcmUgdGhlIHR5cGVfaWQuICBIYXZlIHRvIHBhcnNlIGl0CisgICAgICAgICAgLy8gbm93LgorICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIHN1Yl9pbnB1dCgKKyAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KG1lc3NhZ2VfZGF0YS5kYXRhKCkpLAorICAgICAgICAgICAgICBtZXNzYWdlX2RhdGEuc2l6ZSgpKTsKKyAgICAgICAgICBpZiAoIVBhcnNlRmllbGRNYXliZUxhemlseShXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0X3R5cGVfaWQsICZzdWJfaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgICAgbWVzc2FnZV9kYXRhLmNsZWFyKCk7CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnOiB7CisgICAgICAgIGlmIChsYXN0X3R5cGVfaWQgPT0gMCkgeworICAgICAgICAgIC8vIFdlIGhhdmVuJ3Qgc2VlbiBhIHR5cGVfaWQgeWV0LiAgQXBwZW5kIHRoaXMgZGF0YSB0byBtZXNzYWdlX2RhdGEuCisgICAgICAgICAgc3RyaW5nIHRlbXA7CisgICAgICAgICAgdWludDMyIGxlbmd0aDsKKyAgICAgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgICAgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKCZ0ZW1wLCBsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZtZXNzYWdlX2RhdGEpOworICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBjb2RlZF9vdXRwdXQoJm91dHB1dF9zdHJlYW0pOworICAgICAgICAgIGNvZGVkX291dHB1dC5Xcml0ZVZhcmludDMyKGxlbmd0aCk7CisgICAgICAgICAgY29kZWRfb3V0cHV0LldyaXRlU3RyaW5nKHRlbXApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIEFscmVhZHkgc2F3IHR5cGVfaWQsIHNvIHdlIGNhbiBwYXJzZSB0aGlzIGRpcmVjdGx5LgorICAgICAgICAgIGlmICghUGFyc2VGaWVsZE1heWJlTGF6aWx5KFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxhc3RfdHlwZV9pZCwgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXh0ZW5zaW9uX2ZpbmRlciwgZmllbGRfc2tpcHBlcikpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBicmVhazsKKyAgICAgIH0KKworICAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnOiB7CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgfQorCisgICAgICBkZWZhdWx0OiB7CisgICAgICAgIGlmICghZmllbGRfc2tpcHBlci0+U2tpcEZpZWxkKGlucHV0LCB0YWcpKSByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgRXh0ZW5zaW9uU2V0OjpFeHRlbnNpb246OlNlcmlhbGl6ZU1lc3NhZ2VTZXRJdGVtV2l0aENhY2hlZFNpemVzKAorICAgIGludCBudW1iZXIsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgaWYgKHR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSB8fCBpc19yZXBlYXRlZCkgeworICAgIC8vIE5vdCBhIHZhbGlkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLCBidXQgc2VyaWFsaXplIGl0IHRoZSBub3JtYWwgd2F5LgorICAgIFNlcmlhbGl6ZUZpZWxkV2l0aENhY2hlZFNpemVzKG51bWJlciwgb3V0cHV0KTsKKyAgICByZXR1cm47CisgIH0KKworICBpZiAoaXNfY2xlYXJlZCkgcmV0dXJuOworCisgIC8vIFN0YXJ0IGdyb3VwLgorICBvdXRwdXQtPldyaXRlVGFnKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZyk7CisKKyAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgV2lyZUZvcm1hdExpdGU6OldyaXRlVUludDMyKFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZE51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG91dHB1dCk7CisgIC8vIFdyaXRlIG1lc3NhZ2UuCisgIGlmIChpc19sYXp5KSB7CisgICAgbGF6eW1lc3NhZ2VfdmFsdWUtPldyaXRlTWVzc2FnZSgKKyAgICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZU51bWJlciwgb3V0cHV0KTsKKyAgfSBlbHNlIHsKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVNZXNzYWdlTWF5YmVUb0FycmF5KAorICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLAorICAgICAgICAqbWVzc2FnZV92YWx1ZSwKKyAgICAgICAgb3V0cHV0KTsKKyAgfQorCisgIC8vIEVuZCBncm91cC4KKyAgb3V0cHV0LT5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKK30KKworaW50IEV4dGVuc2lvblNldDo6RXh0ZW5zaW9uOjpNZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGludCBudW1iZXIpIGNvbnN0IHsKKyAgaWYgKHR5cGUgIT0gV2lyZUZvcm1hdExpdGU6OlRZUEVfTUVTU0FHRSB8fCBpc19yZXBlYXRlZCkgeworICAgIC8vIE5vdCBhIHZhbGlkIE1lc3NhZ2VTZXQgZXh0ZW5zaW9uLCBidXQgY29tcHV0ZSB0aGUgYnl0ZSBzaXplIGZvciBpdCB0aGUKKyAgICAvLyBub3JtYWwgd2F5LgorICAgIHJldHVybiBCeXRlU2l6ZShudW1iZXIpOworICB9CisKKyAgaWYgKGlzX2NsZWFyZWQpIHJldHVybiAwOworCisgIGludCBvdXJfc2l6ZSA9IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZTsKKworICAvLyB0eXBlX2lkCisgIG91cl9zaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKG51bWJlcik7CisKKyAgLy8gbWVzc2FnZQorICBpbnQgbWVzc2FnZV9zaXplID0gMDsKKyAgaWYgKGlzX2xhenkpIHsKKyAgICBtZXNzYWdlX3NpemUgPSBsYXp5bWVzc2FnZV92YWx1ZS0+Qnl0ZVNpemUoKTsKKyAgfSBlbHNlIHsKKyAgICBtZXNzYWdlX3NpemUgPSBtZXNzYWdlX3ZhbHVlLT5CeXRlU2l6ZSgpOworICB9CisKKyAgb3VyX3NpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobWVzc2FnZV9zaXplKTsKKyAgb3VyX3NpemUgKz0gbWVzc2FnZV9zaXplOworCisgIHJldHVybiBvdXJfc2l6ZTsKK30KKwordm9pZCBFeHRlbnNpb25TZXQ6OlNlcmlhbGl6ZU1lc3NhZ2VTZXRXaXRoQ2FjaGVkU2l6ZXMoCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICBpdGVyLT5zZWNvbmQuU2VyaWFsaXplTWVzc2FnZVNldEl0ZW1XaXRoQ2FjaGVkU2l6ZXMoaXRlci0+Zmlyc3QsIG91dHB1dCk7CisgIH0KK30KKworaW50IEV4dGVuc2lvblNldDo6TWVzc2FnZVNldEJ5dGVTaXplKCkgY29uc3QgeworICBpbnQgdG90YWxfc2l6ZSA9IDA7CisKKyAgZm9yIChtYXA8aW50LCBFeHRlbnNpb24+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0gZXh0ZW5zaW9uc18uYmVnaW4oKTsKKyAgICAgICBpdGVyICE9IGV4dGVuc2lvbnNfLmVuZCgpOyArK2l0ZXIpIHsKKyAgICB0b3RhbF9zaXplICs9IGl0ZXItPnNlY29uZC5NZXNzYWdlU2V0SXRlbUJ5dGVTaXplKGl0ZXItPmZpcnN0KTsKKyAgfQorCisgIHJldHVybiB0b3RhbF9zaXplOworfQorCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2V4dGVuc2lvbl9zZXRfdW5pdHRlc3QuY2MKaW5kZXggMDAwZjg0Ni4uZjQwZmNiYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldF91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0X3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCwyMSArMzQsMjUgQEAKIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgeworCiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGludGVybmFsIHsKIG5hbWVzcGFjZSB7CkBAIC0xNDAsMjMgKzE0NCw5OCBAQAogICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKIH0KIAorVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTZXRBbGxvY2F0ZWRFeHRlbnNpb24pIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIC8vIEFkZCBhIGV4dGVuc2lvbiB1c2luZyBTZXRBbGxvY2F0ZWRFeHRlbnNpb24KKyAgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKiBmb3JlaWduX21lc3NhZ2UgPSBuZXcgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKCk7CisgIG1lc3NhZ2UuU2V0QWxsb2NhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmb3JlaWduX21lc3NhZ2UpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUShmb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICBtZXNzYWdlLk11dGFibGVFeHRlbnNpb24oCisgICAgICAgICAgICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0VRKGZvcmVpZ25fbWVzc2FnZSwKKyAgICAgICAgICAgICZtZXNzYWdlLkdldEV4dGVuc2lvbigKKyAgICAgICAgICAgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworCisgIC8vIFNldEFsbG9jYXRlZEV4dGVuc2lvbiBzaG91bGQgZGVsZXRlIHRoZSBwcmV2aW91c2x5IGV4aXN0aW5nIGV4dGVuc2lvbi4KKyAgLy8gKFdlIHJlcGx5IG9uIHVuaXR0ZXN0IHRvIGNoZWNrIG1lbW9yeSBsZWFrcyBmb3IgdGhpcyBjYXNlKQorICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmV3IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSgpKTsKKworICAvLyBTZXRBbGxvY2F0ZWRFeHRlbnNpb24gd2l0aCBhIE5VTEwgcGFyYW1ldGVyIGlzIGVxdWl2YWxlbnQgdG8gQ2xlYXJFeHRlbmlvbi4KKyAgbWVzc2FnZS5TZXRBbGxvY2F0ZWRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFJlbGVhc2VFeHRlbnNpb24pIHsKKyAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2U7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikpOworICAvLyBBZGQgYSBleHRlbnNpb24gdXNpbmcgU2V0QWxsb2NhdGVkRXh0ZW5zaW9uCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIGV4dGVuc2lvbiA9CisgICAgICBuZXcgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSgpOworICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiwKKyAgICAgIGV4dGVuc2lvbik7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKSk7CisgIC8vIFJlbGVhc2UgdGhlIGV4dGVuc2lvbiB1c2luZyBSZWxlYXNlRXh0ZW5zaW9uCisgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEqIHJlbGVhc2VkX2V4dGVuc2lvbiA9CisgICAgICBtZXNzYWdlLlJlbGVhc2VFeHRlbnNpb24oCisgICAgICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX0VRKGV4dGVuc2lvbiwgcmVsZWFzZWRfZXh0ZW5zaW9uKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKSk7CisgIC8vIFJlbGVhc2VFeHRlbnNpb24gd2lsbCByZXR1cm4gdGhlIHVuZGVybHlpbmcgb2JqZWN0IGV2ZW4gYWZ0ZXIKKyAgLy8gQ2xlYXJFeHRlbnNpb24gaXMgY2FsbGVkLgorICBtZXNzYWdlLlNldEFsbG9jYXRlZEV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiwKKyAgICAgIGV4dGVuc2lvbik7CisgIG1lc3NhZ2UuQ2xlYXJFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOworICByZWxlYXNlZF9leHRlbnNpb24gPSBtZXNzYWdlLlJlbGVhc2VFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZF9leHRlbnNpb24gIT0gTlVMTCk7CisgIGRlbGV0ZSByZWxlYXNlZF9leHRlbnNpb247Cit9CisKKwogVEVTVChFeHRlbnNpb25TZXRUZXN0LCBDb3B5RnJvbSkgewogICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICBzdHJpbmcgZGF0YTsKIAogICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOwogICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMSk7CiAgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTEpOyAgLy8gZXhlcmNpc2UgY29weSB3aGVuIGZpZWxkcyBhbHJlYWR5IGV4aXN0CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKK30KKworVEVTVChFeHRlbnNpb1NldFRlc3QsIENvcHlGcm9tUGFja2VkKSB7CisgIHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9ucyBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEV4dGVuc2lvbnMoJm1lc3NhZ2UxKTsKKyAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsgIC8vIGV4ZXJjaXNlIGNvcHkgd2hlbiBmaWVsZHMgYWxyZWFkeSBleGlzdAorICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CiB9CiAKIFRFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQ29weUZyb21VcGNhc3RlZCkgewogICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTEsIG1lc3NhZ2UyOwotICBzdHJpbmcgZGF0YTsKICAgY29uc3QgTWVzc2FnZSYgdXBjYXN0ZWRfbWVzc2FnZSA9IG1lc3NhZ2UxOwogCiAgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKCZtZXNzYWdlMSk7CiAgIG1lc3NhZ2UyLkNvcHlGcm9tKHVwY2FzdGVkX21lc3NhZ2UpOwogICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CisgIC8vIGV4ZXJjaXNlIGNvcHkgd2hlbiBmaWVsZHMgYWxyZWFkeSBleGlzdAorICBtZXNzYWdlMi5Db3B5RnJvbSh1cGNhc3RlZF9tZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwogfQogCiBURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBXaXRoRW1wdHkpIHsKQEAgLTE3OSw2ICsyNTgsMTkyIEBACiAgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UpOwogfQogCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBFeHRlbnNpb24pIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UxKTsKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKworICAvLyBTd2FwIGVtcHR5IGZpZWxkcy4KKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKKyAgcmVmbGVjdGlvbi0+U3dhcEZpZWxkcygmbWVzc2FnZTEsICZtZXNzYWdlMiwgZmllbGRzKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UyKTsKKworICAvLyBTd2FwIHR3byBleHRlbnNpb25zLgorICBmaWVsZHMucHVzaF9iYWNrKAorICAgICAgcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoMTIpKTsKKyAgZmllbGRzLnB1c2hfYmFjaygKKyAgICAgIHJlZmxlY3Rpb24tPkZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKDI1KSk7CisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTEuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UxLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZG91YmxlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZTEuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlMi5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24pKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTIuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9jb3JkX2V4dGVuc2lvbikpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBFeHRlbnNpb25XaXRoRW1wdHkpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTI7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMzsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTMpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMy5HZXRSZWZsZWN0aW9uKCk7CisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZTMsICZmaWVsZHMpOworCisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIFN3YXBFeHRlbnNpb25Cb3RoRnVsbCkgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTIpOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZTEsICZmaWVsZHMpOworCisgIHJlZmxlY3Rpb24tPlN3YXBGaWVsZHMoJm1lc3NhZ2UxLCAmbWVzc2FnZTIsIGZpZWxkcyk7CisKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQXJlbmFTZXRBbGxFeHRlbnNpb24pIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSBhcmVuYTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTEgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYTEpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgQXJlbmFDb3B5Q29uc3RydWN0b3IpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSBhcmVuYTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTEgPQorICAgICAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYTEpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMSk7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMigqbWVzc2FnZTEpOworICBhcmVuYTEuUmVzZXQoKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEFyZW5hTWVyZ2VGcm9tKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmExOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UxID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmExKTsKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTI7CisgIG1lc3NhZ2UyLk1lcmdlRnJvbSgqbWVzc2FnZTEpOworICBhcmVuYTEuUmVzZXQoKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworfQorCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZUFuZFJlbGVhc2UpIHsKKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSBhcmVuYTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlID0KKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmEpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS0+SGFzRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKKyAgLy8gQWRkIGEgZXh0ZW5zaW9uIHVzaW5nIFNldEFsbG9jYXRlZEV4dGVuc2lvbgorICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqIGZvcmVpZ25fbWVzc2FnZSA9IG5ldyB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UoKTsKKyAgbWVzc2FnZS0+U2V0QWxsb2NhdGVkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yZWlnbl9tZXNzYWdlKTsKKyAgLy8gZm9yZWlnbl9tZXNzYWdlIGlzIG5vdyBvd25lZCBieSB0aGUgYXJlbmEuCisgIEVYUEVDVF9FUShmb3JlaWduX21lc3NhZ2UsCisgICAgICAgICAgICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgICAgICAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisKKyAgLy8gVW5kZXJseWluZyBtZXNzYWdlIGlzIGNvcGllZCwgYW5kIHJldHVybmVkLgorICB1bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqIHJlbGVhc2VkX21lc3NhZ2UgPSBtZXNzYWdlLT5SZWxlYXNlRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pOworICBkZWxldGUgcmVsZWFzZWRfbWVzc2FnZTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UtPkhhc0V4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcEV4dGVuc2lvbkJvdGhGdWxsV2l0aEFyZW5hKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmExOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hPiBhcmVuYTIobmV3IDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEoKSk7CisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMSA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYTEpOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UyID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oYXJlbmEyLmdldCgpKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UyKTsKKyAgbWVzc2FnZTEtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgbWVzc2FnZTItPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLCAyKTsKKyAgbWVzc2FnZTEtPlN3YXAobWVzc2FnZTIpOworICBFWFBFQ1RfRVEoMiwgbWVzc2FnZTEtPkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMi0+R2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24pKTsKKyAgLy8gUmUtc2V0IHRoZSBvcmlnaW5hbCB2YWx1ZXMgc28gRXhwZWN0QWxsRXh0ZW5zaW9uc1NldCBpcyBoYXBweS4KKyAgbWVzc2FnZTEtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW50MzJfZXh0ZW5zaW9uLCAxMDEpOworICBtZXNzYWdlMi0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbnQzMl9leHRlbnNpb24sIDEwMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMik7CisgIGFyZW5hMi5yZXNldChOVUxMKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoKm1lc3NhZ2UxKTsKKyAgLy8gVGVzdCBjb3JuZXIgY2FzZXMsIHdoZW4gb25lIGlzIGVtcHR5IGFuZCBvdGhlciBpcyBub3QuCisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEgYXJlbmEzLCBhcmVuYTQ7CisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMyA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KCZhcmVuYTMpOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2U0ID0KKyAgICAgIEFyZW5hOjpDcmVhdGVNZXNzYWdlPHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucz4oJmFyZW5hNCk7CisgIFRlc3RVdGlsOjpTZXRBbGxFeHRlbnNpb25zKG1lc3NhZ2UzKTsKKyAgbWVzc2FnZTMtPlN3YXAobWVzc2FnZTQpOworICBhcmVuYTMuUmVzZXQoKTsKKyAgVGVzdFV0aWw6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQoKm1lc3NhZ2U0KTsKK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTd2FwRmllbGRzT2ZFeHRlbnNpb25Cb3RoRnVsbFdpdGhBcmVuYSkgeworICBnb29nbGU6OnByb3RvYnVmOjpBcmVuYSBhcmVuYTE7CisgIGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYTIgPSBuZXcgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSgpOworCisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZTEgPQorICAgICAgQXJlbmE6OkNyZWF0ZU1lc3NhZ2U8dW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zPigmYXJlbmExKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zKiBtZXNzYWdlMiA9CisgICAgICBBcmVuYTo6Q3JlYXRlTWVzc2FnZTx1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnM+KGFyZW5hMik7CisKKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMobWVzc2FnZTEpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucyhtZXNzYWdlMik7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLT5HZXRSZWZsZWN0aW9uKCk7CisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKm1lc3NhZ2UxLCAmZmllbGRzKTsKKyAgcmVmbGVjdGlvbi0+U3dhcEZpZWxkcyhtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkcyk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMik7CisgIGRlbGV0ZSBhcmVuYTI7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KCptZXNzYWdlMSk7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgU3dhcEV4dGVuc2lvbldpdGhTZWxmKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZTEsICZmaWVsZHMpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UxLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UxKTsKK30KKwogVEVTVChFeHRlbnNpb25TZXRUZXN0LCBTZXJpYWxpemF0aW9uVG9BcnJheSkgewogICAvLyBTZXJpYWxpemUgYXMgVGVzdEFsbEV4dGVuc2lvbnMgYW5kIHBhcnNlIGFzIFRlc3RBbGxUeXBlcyB0byBpbnN1cmUgd2lyZQogICAvLyBjb21wYXRpYmlsaXR5IG9mIGV4dGVuc2lvbnMuCkBAIC0yNzYsNiArNTQxLDcgQEAKICAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmc291cmNlKTsKICAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKICAgRVhQRUNUX1RSVUUoZGVzdGluYXRpb24uUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgVGVzdFV0aWw6OlNldE9uZW9mRmllbGRzKCZkZXN0aW5hdGlvbik7CiAgIFRlc3RVdGlsOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKIH0KIApAQCAtMjkxLDYgKzU1Nyw0OCBAQAogICBUZXN0VXRpbDo6RXhwZWN0UGFja2VkRXh0ZW5zaW9uc1NldChkZXN0aW5hdGlvbik7CiB9CiAKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgUGFja2VkVG9VbnBhY2tlZFBhcnNpbmcpIHsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlcyBzb3VyY2U7CisgIHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRFeHRlbnNpb25zIGRlc3RpbmF0aW9uOworICBzdHJpbmcgZGF0YTsKKworICBUZXN0VXRpbDo6U2V0UGFja2VkRmllbGRzKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworICBFWFBFQ1RfVFJVRShkZXN0aW5hdGlvbi5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICBUZXN0VXRpbDo6RXhwZWN0VW5wYWNrZWRFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKKworICAvLyBSZXNlcmlhbGl6ZQorICB1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMgdW5wYWNrZWQ7CisgIFRlc3RVdGlsOjpTZXRVbnBhY2tlZEZpZWxkcygmdW5wYWNrZWQpOworICBFWFBFQ1RfVFJVRSh1bnBhY2tlZC5TZXJpYWxpemVBc1N0cmluZygpID09IGRlc3RpbmF0aW9uLlNlcmlhbGl6ZUFzU3RyaW5nKCkpOworCisgIC8vIE1ha2Ugc3VyZSB3ZSBjYW4gYWRkIGV4dGVuc2lvbnMuCisgIGRlc3RpbmF0aW9uLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpGT1JFSUdOX0JBUik7Cit9CisKK1RFU1QoRXh0ZW5zaW9uU2V0VGVzdCwgVW5wYWNrZWRUb1BhY2tlZFBhcnNpbmcpIHsKKyAgdW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RQYWNrZWRFeHRlbnNpb25zIGRlc3RpbmF0aW9uOworICBzdHJpbmcgZGF0YTsKKworICBUZXN0VXRpbDo6U2V0VW5wYWNrZWRGaWVsZHMoJnNvdXJjZSk7CisgIHNvdXJjZS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgIEVYUEVDVF9UUlVFKGRlc3RpbmF0aW9uLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgIFRlc3RVdGlsOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zU2V0KGRlc3RpbmF0aW9uKTsKKworICAvLyBSZXNlcmlhbGl6ZQorICB1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzIHBhY2tlZDsKKyAgVGVzdFV0aWw6OlNldFBhY2tlZEZpZWxkcygmcGFja2VkKTsKKyAgRVhQRUNUX1RSVUUocGFja2VkLlNlcmlhbGl6ZUFzU3RyaW5nKCkgPT0gZGVzdGluYXRpb24uU2VyaWFsaXplQXNTdHJpbmcoKSk7CisKKyAgLy8gTWFrZSBzdXJlIHdlIGNhbiBhZGQgZXh0ZW5zaW9ucy4KKyAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgZGVzdGluYXRpb24uQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm90b2J1Zl91bml0dGVzdDo6Rk9SRUlHTl9CQVIpOworfQorCiBURVNUKEV4dGVuc2lvblNldFRlc3QsIElzSW5pdGlhbGl6ZWQpIHsKICAgLy8gVGVzdCB0aGF0IElzSW5pdGlhbGl6ZWQoKSByZXR1cm5zIGZhbHNlIGlmIHJlcXVpcmVkIGZpZWxkcyBpbiBuZXN0ZWQKICAgLy8gZXh0ZW5zaW9ucyBhcmUgbWlzc2luZy4KQEAgLTQxOCw3ICs3MjYsOCBAQAogICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7ICsraSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF8jI3R5cGUjI19leHRlbnNpb24sIHZhbHVlKTsgICAgICBcCiAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgIGludCBleHBlY3RlZF9zaXplID0gc2l6ZW9mKGNwcHR5cGUpICogMTYgKyBlbXB0eV9yZXBlYXRlZF9maWVsZF9zaXplOyAgICAgIFwKKyAgICBpbnQgZXhwZWN0ZWRfc2l6ZSA9IHNpemVvZihjcHB0eXBlKSAqICgxNiAtICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUpICsgZW1wdHlfcmVwZWF0ZWRfZmllbGRfc2l6ZTsgICAgICAgICAgXAogICAgIEVYUEVDVF9FUShleHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKSA8PCAjdHlwZTsgICAgICAgICAgICAgICAgICAgIFwKICAgfSB3aGlsZSAoMCkKIApAQCAtNDUwLDcgKzc1OSw4IEBACiAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAxNjsgKytpKSB7CiAgICAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiwgdmFsdWUpOwogICAgIH0KLSAgICBtaW5fZXhwZWN0ZWRfc2l6ZSArPSAoc2l6ZW9mKHZhbHVlKSArIHZhbHVlLnNpemUoKSkgKiAxNjsKKyAgICBtaW5fZXhwZWN0ZWRfc2l6ZSArPSAoc2l6ZW9mKHZhbHVlKSArIHZhbHVlLnNpemUoKSkgKgorICAgICAgICAoMTYgLSBrTWluUmVwZWF0ZWRGaWVsZEFsbG9jYXRpb25TaXplKTsKICAgICBFWFBFQ1RfTEUobWluX2V4cGVjdGVkX3NpemUsIG1lc3NhZ2UuU3BhY2VVc2VkKCkpOwogICB9CiAgIC8vIFJlcGVhdGVkIG1lc3NhZ2VzCkBAIC00NjUsMTIgKzc3NSwyNjMgQEAKICAgICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKS0+CiAgICAgICAgICAgQ29weUZyb20ocHJvdG90eXBlKTsKICAgICB9Ci0gICAgbWluX2V4cGVjdGVkX3NpemUgKz0gMTYgKiBwcm90b3R5cGUuU3BhY2VVc2VkKCk7CisgICAgbWluX2V4cGVjdGVkX3NpemUgKz0KKyAgICAgICAgKDE2IC0ga01pblJlcGVhdGVkRmllbGRBbGxvY2F0aW9uU2l6ZSkgKiBwcm90b3R5cGUuU3BhY2VVc2VkKCk7CiAgICAgRVhQRUNUX0xFKG1pbl9leHBlY3RlZF9zaXplLCBtZXNzYWdlLlNwYWNlVXNlZCgpKTsKICAgfQogfQogCi0jaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKKy8vIE4uQi46IFdlIGRvIG5vdCB0ZXN0IHJhbmdlLWJhc2VkIGZvciBoZXJlIGJlY2F1c2Ugd2UgcmVtYWluIEMrKzAzIGNvbXBhdGlibGUuCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBNLCB0eXBlbmFtZSBJRD4KK2lubGluZSBUIFN1bUFsbEV4dGVuc2lvbnMoY29uc3QgTSYgbWVzc2FnZSwgSUQgZXh0ZW5zaW9uLCBUIHplcm8pIHsKKyAgVCBzdW0gPSB6ZXJvOworICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+Ojpjb25zdF9pdGVyYXRvciBpdGVyID0KKyAgICAgIG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oZXh0ZW5zaW9uKS5iZWdpbigpOworICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+Ojpjb25zdF9pdGVyYXRvciBlbmQgPQorICAgICAgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbihleHRlbnNpb24pLmVuZCgpOworICBmb3IgKDsgaXRlciAhPSBlbmQ7ICsraXRlcikgeworICAgIHN1bSArPSAqaXRlcjsKKyAgfQorICByZXR1cm4gc3VtOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBNLCB0eXBlbmFtZSBJRD4KK2lubGluZSB2b2lkIEluY0FsbEV4dGVuc2lvbnMoTSogbWVzc2FnZSwgSUQgZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICBUIHZhbCkgeworICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+OjppdGVyYXRvciBpdGVyID0KKyAgICAgIG1lc3NhZ2UtPk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbihleHRlbnNpb24pLT5iZWdpbigpOworICB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPFQ+OjppdGVyYXRvciBlbmQgID0KKyAgICAgIG1lc3NhZ2UtPk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbihleHRlbnNpb24pLT5lbmQoKTsKKyAgZm9yICg7IGl0ZXIgIT0gZW5kOyArK2l0ZXIpIHsKKyAgICAqaXRlciArPSB2YWw7CisgIH0KK30KKworVEVTVChFeHRlbnNpb25TZXRUZXN0LCBSZXBlYXRlZEZpZWxkcykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKworICAvLyBUZXN0IGVtcHR5IHJlcGVhdGVkLWZpZWxkIGNhc2UgKGIvMTI5MjYxNjMpCisgIEFTU0VSVF9FUSgwLCBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbikuc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDAsIG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKS5zaXplKCkpOworICBBU1NFUlRfRVEoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKS5zaXplKCkpOworICBBU1NFUlRfRVEoMCwgbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLnNpemUoKSk7CisKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZSBuZXN0ZWRfbWVzc2FnZTsKKyAgbmVzdGVkX21lc3NhZ2Uuc2V0X2JiKDQyKTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkRW51bSBuZXN0ZWRfZW51bSA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRFbnVtX01JTjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAyKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMyk7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDQpOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zaW50MzJfZXh0ZW5zaW9uLCA1KTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgNik7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCA3KTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24sIDgpOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQzMl9leHRlbnNpb24sIDcpOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDgpOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24sIDkuMCk7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDEwLjApOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiwgdHJ1ZSk7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiwgbmVzdGVkX2VudW0pOworICAgIG1lc3NhZ2UuQWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIDo6c3RkOjpzdHJpbmcoInRlc3QiKSk7CisgICAgbWVzc2FnZS5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICA6OnN0ZDo6c3RyaW5nKCJ0ZXN0XHhGRiIpKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbigKKyAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiktPkNvcHlGcm9tKG5lc3RlZF9tZXNzYWdlKTsKKyAgICBtZXNzYWdlLkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZF9lbnVtKTsKKyAgfQorCisgIEFTU0VSVF9FUSgxMCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMj4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uLCAwKSk7CisgIEluY0FsbEV4dGVuc2lvbnM8aW50MzI+KAorICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24sIDEpOworICBBU1NFUlRfRVEoMjAsIFN1bUFsbEV4dGVuc2lvbnM8aW50MzI+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSgyMCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2ND4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uLCAwKSk7CisgIEluY0FsbEV4dGVuc2lvbnM8aW50NjQ+KAorICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24sIDEpOworICBBU1NFUlRfRVEoMzAsIFN1bUFsbEV4dGVuc2lvbnM8aW50NjQ+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDY0X2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSgzMCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50MzI+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQzMl9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczx1aW50MzI+KAorICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50MzJfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDQwLCBTdW1BbGxFeHRlbnNpb25zPHVpbnQzMj4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfdWludDMyX2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSg0MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50NjQ+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX3VpbnQ2NF9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczx1aW50NjQ+KAorICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF91aW50NjRfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDUwLCBTdW1BbGxFeHRlbnNpb25zPHVpbnQ2ND4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfdWludDY0X2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSg1MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMj4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMCkpOworICBJbmNBbGxFeHRlbnNpb25zPGludDMyPigKKyAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMSk7CisgIEFTU0VSVF9FUSg2MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQzMj4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDMyX2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSg2MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2ND4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMCkpOworICBJbmNBbGxFeHRlbnNpb25zPGludDY0PigKKyAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMSk7CisgIEFTU0VSVF9FUSg3MCwgU3VtQWxsRXh0ZW5zaW9uczxpbnQ2ND4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfc2ludDY0X2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSg3MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50MzI+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkMzJfZXh0ZW5zaW9uLCAwKSk7CisgIEluY0FsbEV4dGVuc2lvbnM8dWludDMyPigKKyAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQzMl9leHRlbnNpb24sIDEpOworICBBU1NFUlRfRVEoODAsIFN1bUFsbEV4dGVuc2lvbnM8dWludDMyPigKKyAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDMyX2V4dGVuc2lvbiwgMCkpOworCisgIEFTU0VSVF9FUSg4MCwgU3VtQWxsRXh0ZW5zaW9uczx1aW50NjQ+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEluY0FsbEV4dGVuc2lvbnM8dWludDY0PigKKyAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZml4ZWQ2NF9leHRlbnNpb24sIDEpOworICBBU1NFUlRfRVEoOTAsIFN1bUFsbEV4dGVuc2lvbnM8dWludDY0PigKKyAgICAgIG1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9maXhlZDY0X2V4dGVuc2lvbiwgMCkpOworCisgIC8vIFVzdWFsbHksIGZsb2F0aW5nLXBvaW50IGFyaXRobWV0aWMgY2Fubm90IGJlIHRydXN0ZWQgdG8gYmUgZXhhY3QsIHNvIGl0IGlzCisgIC8vIGEgQmFkIElkZWEgdG8gYXNzZXJ0IGVxdWFsaXR5IGluIGEgdGVzdCBsaWtlIHRoaXMuIEhvd2V2ZXIsIHdlJ3JlIGRlYWxpbmcKKyAgLy8gd2l0aCBpbnRlZ2VycyB3aXRoIGEgc21hbGwgbnVtYmVyIG9mIHNpZ25pZmljYW50IG1hbnRpc3NhIGJpdHMsIHNvIHdlCisgIC8vIHNob3VsZCBhY3R1YWxseSBoYXZlIGV4YWN0IHByZWNpc2lvbiBoZXJlLgorICBBU1NFUlRfRVEoOTAsIFN1bUFsbEV4dGVuc2lvbnM8ZmxvYXQ+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiwgMCkpOworICBJbmNBbGxFeHRlbnNpb25zPGZsb2F0PigKKyAgICAgICZtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDEwMCwgU3VtQWxsRXh0ZW5zaW9uczxmbG9hdD4oCisgICAgICBtZXNzYWdlLCB1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uLCAwKSk7CisKKyAgQVNTRVJUX0VRKDEwMCwgU3VtQWxsRXh0ZW5zaW9uczxkb3VibGU+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDApKTsKKyAgSW5jQWxsRXh0ZW5zaW9uczxkb3VibGU+KAorICAgICAgJm1lc3NhZ2UsIHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uLCAxKTsKKyAgQVNTRVJUX0VRKDExMCwgU3VtQWxsRXh0ZW5zaW9uczxkb3VibGU+KAorICAgICAgbWVzc2FnZSwgdW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24sIDApKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPjo6aXRlcmF0b3Igc3RyaW5nX2l0ZXI7CisgIFJlcGVhdGVkUHRyRmllbGQ8IDo6c3RkOjpzdHJpbmc+OjppdGVyYXRvciBzdHJpbmdfZW5kOworICBmb3IgKHN0cmluZ19pdGVyID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pLT5iZWdpbigpLAorICAgICAgIHN0cmluZ19lbmQgID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKS0+ZW5kKCk7CisgICAgICAgc3RyaW5nX2l0ZXIgIT0gc3RyaW5nX2VuZDsgKytzdHJpbmdfaXRlcikgeworICAgICpzdHJpbmdfaXRlciArPSAidGVzdCI7CisgIH0KKyAgUmVwZWF0ZWRQdHJGaWVsZDwgOjpzdGQ6OnN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIHN0cmluZ19jb25zdF9pdGVyOworICBSZXBlYXRlZFB0ckZpZWxkPCA6OnN0ZDo6c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3Igc3RyaW5nX2NvbnN0X2VuZDsKKyAgZm9yIChzdHJpbmdfY29uc3RfaXRlciA9IG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uKS5iZWdpbigpLAorICAgICAgIHN0cmluZ19jb25zdF9lbmQgID0gbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pLmVuZCgpOworICAgICAgIHN0cmluZ19pdGVyICE9IHN0cmluZ19lbmQ7ICsrc3RyaW5nX2l0ZXIpIHsKKyAgICBBU1NFUlRfVFJVRSgqc3RyaW5nX2l0ZXIgPT0gInRlc3R0ZXN0Iik7CisgIH0KKworICBSZXBlYXRlZEZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkRW51bT46Oml0ZXJhdG9yIGVudW1faXRlcjsKKyAgUmVwZWF0ZWRGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZEVudW0+OjppdGVyYXRvciBlbnVtX2VuZDsKKyAgZm9yIChlbnVtX2l0ZXIgPSBtZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiktPmJlZ2luKCksCisgICAgICAgZW51bV9lbmQgID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24pLT5lbmQoKTsKKyAgICAgICBlbnVtX2l0ZXIgIT0gZW51bV9lbmQ7ICsrZW51bV9pdGVyKSB7CisgICAgKmVudW1faXRlciA9IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fTUFYOworICB9CisgIFJlcGVhdGVkRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgIGVudW1fY29uc3RfaXRlcjsKKyAgUmVwZWF0ZWRGaWVsZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZEVudW0+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgZW51bV9jb25zdF9lbmQ7CisgIGZvciAoZW51bV9jb25zdF9pdGVyID0gbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbikuYmVnaW4oKSwKKyAgICAgICBlbnVtX2NvbnN0X2VuZCAgPSBtZXNzYWdlLkdldFJlcGVhdGVkRXh0ZW5zaW9uKAorICAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uKS5lbmQoKTsKKyAgICAgICBlbnVtX2l0ZXIgIT0gZW51bV9lbmQ7ICsrZW51bV9pdGVyKSB7CisgICAgQVNTRVJUX0VRKCplbnVtX2NvbnN0X2l0ZXIsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZEVudW1fTUFYKTsKKyAgfQorCisgIFJlcGVhdGVkUHRyRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlPjo6aXRlcmF0b3IKKyAgICAgIG1zZ19pdGVyOworICBSZXBlYXRlZFB0ckZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZT46Oml0ZXJhdG9yCisgICAgICBtc2dfZW5kOworICBmb3IgKG1zZ19pdGVyID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLT5iZWdpbigpLAorICAgICAgIG1zZ19lbmQgID0gbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLT5lbmQoKTsKKyAgICAgICBtc2dfaXRlciAhPSBtc2dfZW5kOyArK21zZ19pdGVyKSB7CisgICAgbXNnX2l0ZXItPnNldF9iYigxMjM0KTsKKyAgfQorICBSZXBlYXRlZFB0ckZpZWxkPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNfTmVzdGVkTWVzc2FnZT46OgorICAgICAgY29uc3RfaXRlcmF0b3IgbXNnX2NvbnN0X2l0ZXI7CisgIFJlcGVhdGVkUHRyRmllbGQ8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRNZXNzYWdlPjo6CisgICAgICBjb25zdF9pdGVyYXRvciBtc2dfY29uc3RfZW5kOworICBmb3IgKG1zZ19jb25zdF9pdGVyID0gbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikuYmVnaW4oKSwKKyAgICAgICBtc2dfY29uc3RfZW5kICA9IG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLmVuZCgpOworICAgICAgIG1zZ19jb25zdF9pdGVyICE9IG1zZ19jb25zdF9lbmQ7ICsrbXNnX2NvbnN0X2l0ZXIpIHsKKyAgICBBU1NFUlRfRVEobXNnX2NvbnN0X2l0ZXItPmJiKCksIDEyMzQpOworICB9CisKKyAgLy8gVGVzdCByYW5nZS1iYXNlZCBmb3IgYXMgd2VsbCwgYnV0IG9ubHkgaWYgY29tcGlsZWQgYXMgQysrMTEuCisjaWYgX19jcGx1c3BsdXMgPj0gMjAxMTAzTAorICAvLyBUZXN0IG9uZSBwcmltaXRpdmUgZmllbGQuCisgIGZvciAoYXV0byYgeCA6ICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uKSkgeworICAgIHggPSA0MzIxOworICB9CisgIGZvciAoY29uc3QgYXV0byYgeCA6IG1lc3NhZ2UuR2V0UmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbikpIHsKKyAgICBBU1NFUlRfRVEoeCwgNDMyMSk7CisgIH0KKyAgLy8gVGVzdCBvbmUgc3RyaW5nIGZpZWxkLgorICBmb3IgKGF1dG8mIHggOiAqbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24oCisgICAgICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24pKSB7CisgICAgeCA9ICJ0ZXN0X3JhbmdlX2Jhc2VkX2ZvciI7CisgIH0KKyAgZm9yIChjb25zdCBhdXRvJiB4IDogbWVzc2FnZS5HZXRSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbikpIHsKKyAgICBBU1NFUlRfVFJVRSh4ID09ICJ0ZXN0X3JhbmdlX2Jhc2VkX2ZvciIpOworICB9CisgIC8vIFRlc3Qgb25lIG1lc3NhZ2UgZmllbGQuCisgIGZvciAoYXV0byYgeCA6ICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSkgeworICAgIHguc2V0X2JiKDQzMjEpOworICB9CisgIGZvciAoY29uc3QgYXV0byYgeCA6ICptZXNzYWdlLk11dGFibGVSZXBlYXRlZEV4dGVuc2lvbigKKyAgICAgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKSkgeworICAgIEFTU0VSVF9FUSh4LmJiKCksIDQzMjEpOworICB9CisjZW5kaWYKK30KKworLy8gRnJvbSBiLzEyOTI2MTYzCitURVNUKEV4dGVuc2lvblNldFRlc3QsIEFic2VudEV4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgbWVzc2FnZS5NdXRhYmxlUmVwZWF0ZWRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikKKyAgICAgIC0+QWRkKCktPnNldF9iYigxMjMpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKAorICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoCisgICAgICAxMjMsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKAorICAgICAgICAgIHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24sIDApLmJiKCkpOworfQorCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKIAogVEVTVChFeHRlbnNpb25TZXRUZXN0LCBJbnZhbGlkRW51bURlYXRoKSB7CiAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlOwpAQCAtNDgwLDcgKzEwNDEsNyBAQAogICAgICJJc1ZhbGlkIik7CiB9CiAKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKIAogVEVTVChFeHRlbnNpb25TZXRUZXN0LCBEeW5hbWljRXh0ZW5zaW9ucykgewogICAvLyBUZXN0IGFkZGluZyBhIGR5bmFtaWMgZXh0ZW5zaW9uIHRvIGEgY29tcGlsZWQtaW4gbWVzc2FnZSBvYmplY3QuCkBAIC02MTUsNyArMTE3NiwxMSBAQAogICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0KICAgICAgICAgbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2UobWVzc2FnZSwgbWVzc2FnZV9leHRlbnNpb24pOwogICAgIGNvbnN0IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogdHlwZWRfc3ViX21lc3NhZ2UgPQorI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJCisgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IHVuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSo+KCZzdWJfbWVzc2FnZSk7CisjZWxzZQogICAgICAgICBkeW5hbWljX2Nhc3Q8Y29uc3QgdW5pdHRlc3Q6OkZvcmVpZ25NZXNzYWdlKj4oJnN1Yl9tZXNzYWdlKTsKKyNlbmRpZgogICAgIEFTU0VSVF9UUlVFKHR5cGVkX3N1Yl9tZXNzYWdlICE9IE5VTEwpOwogICAgIEVYUEVDVF9FUSg0NTYsIHR5cGVkX3N1Yl9tZXNzYWdlLT5jKCkpOwogICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnBiLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucGIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZmllbGRfbWFzay5wYi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9maWVsZF9tYXNrLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2ZpZWxkX21hc2sucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX2VudW1fcmVmbGVjdGlvbi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfZW51bV91dGlsLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3V0aWwuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uY2MKaW5kZXggMjI2ZTk1MS4uMjMxMzE4MSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMywxOCArMzMsMzEgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGFsZ29yaXRobT4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZXh0ZW5zaW9uX3NldC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmg+CisjaW5jbHVkZSA8c2V0PgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9leHRlbnNpb25fc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKworCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfT05FT0YKIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGludGVybmFsIHsKIAorbmFtZXNwYWNlIHsKK2Jvb2wgSXNNYXBGaWVsZEluQXBpKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGZpZWxkLT5pc19tYXAoKTsKK30KK30gIC8vIGFub255bW91cyBuYW1lc3BhY2UKKwogYm9vbCBQYXJzZU5hbWVkRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAogICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbHVlKSB7CkBAIC01Niw5ICs2OSwxNSBAQAogCiBjb25zdCBzdHJpbmcmIE5hbWVPZkVudW0oY29uc3QgRW51bURlc2NyaXB0b3IqIGRlc2NyaXB0b3IsIGludCB2YWx1ZSkgewogICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBkID0gZGVzY3JpcHRvci0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICByZXR1cm4gKGQgPT0gTlVMTCA/IGtFbXB0eVN0cmluZyA6IGQtPm5hbWUoKSk7CisgIHJldHVybiAoZCA9PSBOVUxMID8gR2V0RW1wdHlTdHJpbmcoKSA6IGQtPm5hbWUoKSk7CiB9CiAKK25hbWVzcGFjZSB7CitpbmxpbmUgYm9vbCBTdXBwb3J0c0FyZW5hcyhjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yKSB7CisgIHJldHVybiBkZXNjcmlwdG9yLT5maWxlKCktPm9wdGlvbnMoKS5jY19lbmFibGVfYXJlbmFzKCk7Cit9Cit9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIEhlbHBlcnMgZm9yIHJlcG9ydGluZyB1c2FnZSBlcnJvcnMgKGUuZy4gdHJ5aW5nIHRvIHVzZSBHZXRJbnQzMigpIG9uCiAvLyBhIHN0cmluZyBmaWVsZCkuCkBAIC0xNjIsMTMgKzE4MSw0OCBAQAogICAgIGludCBleHRlbnNpb25zX29mZnNldCwKICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogZGVzY3JpcHRvcl9wb29sLAogICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAotICAgIGludCBvYmplY3Rfc2l6ZSkKKyAgICBpbnQgb2JqZWN0X3NpemUsCisgICAgaW50IGFyZW5hX29mZnNldCwKKyAgICBpbnQgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpCiAgIDogZGVzY3JpcHRvcl8gICAgICAgKGRlc2NyaXB0b3IpLAogICAgIGRlZmF1bHRfaW5zdGFuY2VfIChkZWZhdWx0X2luc3RhbmNlKSwKICAgICBvZmZzZXRzXyAgICAgICAgICAob2Zmc2V0cyksCiAgICAgaGFzX2JpdHNfb2Zmc2V0XyAgKGhhc19iaXRzX29mZnNldCksCiAgICAgdW5rbm93bl9maWVsZHNfb2Zmc2V0Xyh1bmtub3duX2ZpZWxkc19vZmZzZXQpLAogICAgIGV4dGVuc2lvbnNfb2Zmc2V0XyhleHRlbnNpb25zX29mZnNldCksCisgICAgYXJlbmFfb2Zmc2V0XyAgICAgKGFyZW5hX29mZnNldCksCisgICAgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXRfKGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0KSwKKyAgICBvYmplY3Rfc2l6ZV8gICAgICAob2JqZWN0X3NpemUpLAorICAgIGRlc2NyaXB0b3JfcG9vbF8gICgoZGVzY3JpcHRvcl9wb29sID09IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvcl9wb29sKSwKKyAgICBtZXNzYWdlX2ZhY3RvcnlfICAoZmFjdG9yeSkgeworfQorCitHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oCisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X2luc3RhbmNlLAorICAgIGNvbnN0IGludCBvZmZzZXRzW10sCisgICAgaW50IGhhc19iaXRzX29mZnNldCwKKyAgICBpbnQgdW5rbm93bl9maWVsZHNfb2Zmc2V0LAorICAgIGludCBleHRlbnNpb25zX29mZnNldCwKKyAgICBjb25zdCB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlLAorICAgIGludCBvbmVvZl9jYXNlX29mZnNldCwKKyAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogZGVzY3JpcHRvcl9wb29sLAorICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5LAorICAgIGludCBvYmplY3Rfc2l6ZSwKKyAgICBpbnQgYXJlbmFfb2Zmc2V0LAorICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCkKKyAgOiBkZXNjcmlwdG9yXyAgICAgICAoZGVzY3JpcHRvciksCisgICAgZGVmYXVsdF9pbnN0YW5jZV8gKGRlZmF1bHRfaW5zdGFuY2UpLAorICAgIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2VfIChkZWZhdWx0X29uZW9mX2luc3RhbmNlKSwKKyAgICBvZmZzZXRzXyAgICAgICAgICAob2Zmc2V0cyksCisgICAgaGFzX2JpdHNfb2Zmc2V0XyAgKGhhc19iaXRzX29mZnNldCksCisgICAgb25lb2ZfY2FzZV9vZmZzZXRfKG9uZW9mX2Nhc2Vfb2Zmc2V0KSwKKyAgICB1bmtub3duX2ZpZWxkc19vZmZzZXRfKHVua25vd25fZmllbGRzX29mZnNldCksCisgICAgZXh0ZW5zaW9uc19vZmZzZXRfKGV4dGVuc2lvbnNfb2Zmc2V0KSwKKyAgICBhcmVuYV9vZmZzZXRfICAgICAoYXJlbmFfb2Zmc2V0KSwKKyAgICBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldF8oaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpLAogICAgIG9iamVjdF9zaXplXyAgICAgIChvYmplY3Rfc2l6ZSksCiAgICAgZGVzY3JpcHRvcl9wb29sXyAgKChkZXNjcmlwdG9yX3Bvb2wgPT0gTlVMTCkgPwogICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpIDoKQEAgLTE3OCwxNCArMjMyLDQ1IEBACiAKIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjp+R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oKSB7fQogCituYW1lc3BhY2UgeworVW5rbm93bkZpZWxkU2V0KiBlbXB0eV91bmtub3duX2ZpZWxkX3NldF8gPSBOVUxMOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShlbXB0eV91bmtub3duX2ZpZWxkX3NldF9vbmNlXyk7CisKK3ZvaWQgRGVsZXRlRW1wdHlVbmtub3duRmllbGRTZXQoKSB7CisgIGRlbGV0ZSBlbXB0eV91bmtub3duX2ZpZWxkX3NldF87CisgIGVtcHR5X3Vua25vd25fZmllbGRfc2V0XyA9IE5VTEw7Cit9CisKK3ZvaWQgSW5pdEVtcHR5VW5rbm93bkZpZWxkU2V0KCkgeworICBlbXB0eV91bmtub3duX2ZpZWxkX3NldF8gPSBuZXcgVW5rbm93bkZpZWxkU2V0OworICBpbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlRW1wdHlVbmtub3duRmllbGRTZXQpOworfQorCitjb25zdCBVbmtub3duRmllbGRTZXQmIEdldEVtcHR5VW5rbm93bkZpZWxkU2V0KCkgeworICA6Omdvb2dsZTo6cHJvdG9idWY6Okdvb2dsZU9uY2VJbml0KCZlbXB0eV91bmtub3duX2ZpZWxkX3NldF9vbmNlXywgJkluaXRFbXB0eVVua25vd25GaWVsZFNldCk7CisgIHJldHVybiAqZW1wdHlfdW5rbm93bl9maWVsZF9zZXRfOworfQorfSAgLy8gbmFtZXNwYWNlCisKIGNvbnN0IFVua25vd25GaWVsZFNldCYgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldFVua25vd25GaWVsZHMoCiAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBpZiAoZGVzY3JpcHRvcl8tPmZpbGUoKS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzMpIHsKKyAgICByZXR1cm4gR2V0RW1wdHlVbmtub3duRmllbGRTZXQoKTsKKyAgfQorICBpZiAodW5rbm93bl9maWVsZHNfb2Zmc2V0XyA9PSBrVW5rbm93bkZpZWxkU2V0SW5NZXRhZGF0YSkgeworICAgIHJldHVybiBHZXRJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKG1lc3NhZ2UpLnVua25vd25fZmllbGRzKCk7CisgIH0KICAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArCiAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRzX29mZnNldF87CiAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBVbmtub3duRmllbGRTZXQqPihwdHIpOwogfQorCiBVbmtub3duRmllbGRTZXQqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNdXRhYmxlVW5rbm93bkZpZWxkcygKICAgICBNZXNzYWdlKiBtZXNzYWdlKSBjb25zdCB7CisgIGlmICh1bmtub3duX2ZpZWxkc19vZmZzZXRfID09IGtVbmtub3duRmllbGRTZXRJbk1ldGFkYXRhKSB7CisgICAgcmV0dXJuIE11dGFibGVJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKG1lc3NhZ2UpLT4KKyAgICAgICAgbXV0YWJsZV91bmtub3duX2ZpZWxkcygpOworICB9CiAgIHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArIHVua25vd25fZmllbGRzX29mZnNldF87CiAgIHJldHVybiByZWludGVycHJldF9jYXN0PFVua25vd25GaWVsZFNldCo+KHB0cik7CiB9CkBAIC0yMzQsMTQgKzMxOSwyMyBAQAogICAgICAgICAgIGJyZWFrOwogCiAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgICAgLy8gV2UgZG9uJ3Qga25vdyB3aGljaCBzdWJjbGFzcyBvZiBSZXBlYXRlZFB0ckZpZWxkQmFzZSB0aGUgdHlwZSBpcywKLSAgICAgICAgICAvLyBzbyB3ZSB1c2UgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgZGlyZWN0bHkuCi0gICAgICAgICAgdG90YWxfc2l6ZSArPQotICAgICAgICAgICAgICBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQotICAgICAgICAgICAgICAgIC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgICAgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgICAgICAgIHRvdGFsX3NpemUgKz0KKyAgICAgICAgICAgICAgICBHZXRSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBXZSBkb24ndCBrbm93IHdoaWNoIHN1YmNsYXNzIG9mIFJlcGVhdGVkUHRyRmllbGRCYXNlIHRoZSB0eXBlIGlzLAorICAgICAgICAgICAgLy8gc28gd2UgdXNlIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRpcmVjdGx5LgorICAgICAgICAgICAgdG90YWxfc2l6ZSArPQorICAgICAgICAgICAgICAgIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgICAgICAuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZjxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICAgIH0KKwogICAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0gZWxzZSB7CisgICAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAmJiAhSGFzT25lb2ZGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgICAgY29udGludWU7CisgICAgICB9CiAgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CiAgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0lOVDMyIDoKICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQgOgpAQCAtMjU4LDEyICszNTIsMTMgQEAKICAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewogICAgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCiAgICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7Ci0gICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogcHRyID0gR2V0RmllbGQ8Y29uc3Qgc3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOwotCiAgICAgICAgICAgICAgIC8vIEluaXRpYWxseSwgdGhlIHN0cmluZyBwb2ludHMgdG8gdGhlIGRlZmF1bHQgdmFsdWUgc3RvcmVkIGluCiAgICAgICAgICAgICAgIC8vIHRoZSBwcm90b3R5cGUuIE9ubHkgY291bnQgdGhlIHN0cmluZyBpZiBpdCBoYXMgYmVlbiBjaGFuZ2VkCiAgICAgICAgICAgICAgIC8vIGZyb20gdGhlIGRlZmF1bHQgdmFsdWUuCi0gICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPSBEZWZhdWx0UmF3PGNvbnN0IHN0cmluZyo+KGZpZWxkKTsKKyAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3B0ciA9CisgICAgICAgICAgICAgICAgICAmRGVmYXVsdFJhdzxBcmVuYVN0cmluZ1B0cj4oZmllbGQpLkdldChOVUxMKTsKKyAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nKiBwdHIgPQorICAgICAgICAgICAgICAgICAgJkdldEZpZWxkPEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlLCBmaWVsZCkuR2V0KGRlZmF1bHRfcHRyKTsKIAogICAgICAgICAgICAgICBpZiAocHRyICE9IGRlZmF1bHRfcHRyKSB7CiAgICAgICAgICAgICAgICAgLy8gc3RyaW5nIGZpZWxkcyBhcmUgcmVwcmVzZW50ZWQgYnkganVzdCBhIHBvaW50ZXIsIHNvIGFsc28KQEAgLTI5NCw2ICszODksMjQ3IEBACiAgIHJldHVybiB0b3RhbF9zaXplOwogfQogCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTd2FwRmllbGQoCisgICAgTWVzc2FnZSogbWVzc2FnZTEsCisgICAgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIFNXQVBfQVJSQVlTKENQUFRZUEUsIFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV8jI0NQUFRZUEU6ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRGaWVsZDxUWVBFPiA+KG1lc3NhZ2UxLCBmaWVsZCktPlN3YXAoICAgICAgICBcCisgICAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkRmllbGQ8VFlQRT4gPihtZXNzYWdlMiwgZmllbGQpKTsgICAgICAgICBcCisgICAgICAgIGJyZWFrOworCisgICAgICBTV0FQX0FSUkFZUyhJTlQzMiAsIGludDMyICk7CisgICAgICBTV0FQX0FSUkFZUyhJTlQ2NCAsIGludDY0ICk7CisgICAgICBTV0FQX0FSUkFZUyhVSU5UMzIsIHVpbnQzMik7CisgICAgICBTV0FQX0FSUkFZUyhVSU5UNjQsIHVpbnQ2NCk7CisgICAgICBTV0FQX0FSUkFZUyhGTE9BVCAsIGZsb2F0ICk7CisgICAgICBTV0FQX0FSUkFZUyhET1VCTEUsIGRvdWJsZSk7CisgICAgICBTV0FQX0FSUkFZUyhCT09MICAsIGJvb2wgICk7CisgICAgICBTV0FQX0FSUkFZUyhFTlVNICAsIGludCAgICk7CisjdW5kZWYgU1dBUF9BUlJBWVMKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgorICAgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlMSwgZmllbGQpLT4KKyAgICAgICAgICAgICAgICBTd2FwPEdlbmVyaWNUeXBlSGFuZGxlcjxzdHJpbmc+ID4oCisgICAgICAgICAgICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UyLCBmaWVsZCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlMSwgZmllbGQpLT4KKyAgICAgICAgICAgIE11dGFibGVSZXBlYXRlZEZpZWxkKCktPgorICAgICAgICAgICAgICBTd2FwPEdlbmVyaWNUeXBlSGFuZGxlcjxnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlPiA+KAorICAgICAgICAgICAgICAgIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlMiwgZmllbGQpLT4KKyAgICAgICAgICAgICAgICAgIE11dGFibGVSZXBlYXRlZEZpZWxkKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UxLCBmaWVsZCktPgorICAgICAgICAgICAgU3dhcDxHZW5lcmljVHlwZUhhbmRsZXI8Z29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZT4gPigKKyAgICAgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZTIsIGZpZWxkKSk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmltcGxlbWVudGVkIHR5cGU6ICIgPDwgZmllbGQtPmNwcF90eXBlKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgU1dBUF9WQUxVRVMoQ1BQVFlQRSwgVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3RkOjpzd2FwKCpNdXRhYmxlUmF3PFRZUEU+KG1lc3NhZ2UxLCBmaWVsZCksICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICpNdXRhYmxlUmF3PFRZUEU+KG1lc3NhZ2UyLCBmaWVsZCkpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIFNXQVBfVkFMVUVTKElOVDMyICwgaW50MzIgKTsKKyAgICAgIFNXQVBfVkFMVUVTKElOVDY0ICwgaW50NjQgKTsKKyAgICAgIFNXQVBfVkFMVUVTKFVJTlQzMiwgdWludDMyKTsKKyAgICAgIFNXQVBfVkFMVUVTKFVJTlQ2NCwgdWludDY0KTsKKyAgICAgIFNXQVBfVkFMVUVTKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgIFNXQVBfVkFMVUVTKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIFNXQVBfVkFMVUVTKEJPT0wgICwgYm9vbCAgKTsKKyAgICAgIFNXQVBfVkFMVUVTKEVOVU0gICwgaW50ICAgKTsKKyN1bmRlZiBTV0FQX1ZBTFVFUworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgaWYgKEdldEFyZW5hKG1lc3NhZ2UxKSA9PSBHZXRBcmVuYShtZXNzYWdlMikpIHsKKyAgICAgICAgICBzdGQ6OnN3YXAoKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UxLCBmaWVsZCksCisgICAgICAgICAgICAgICAgICAgICpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlMiwgZmllbGQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBNZXNzYWdlKiogc3ViX21zZzEgPSBNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlMSwgZmllbGQpOworICAgICAgICAgIE1lc3NhZ2UqKiBzdWJfbXNnMiA9IE11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgICAgICAgaWYgKCpzdWJfbXNnMSA9PSBOVUxMICYmICpzdWJfbXNnMiA9PSBOVUxMKSBicmVhazsKKyAgICAgICAgICBpZiAoKnN1Yl9tc2cxICYmICpzdWJfbXNnMikgeworICAgICAgICAgICAgKCpzdWJfbXNnMSktPkdldFJlZmxlY3Rpb24oKS0+U3dhcCgqc3ViX21zZzEsICpzdWJfbXNnMik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICB9CisgICAgICAgICAgaWYgKCpzdWJfbXNnMSA9PSBOVUxMKSB7CisgICAgICAgICAgICAqc3ViX21zZzEgPSAoKnN1Yl9tc2cyKS0+TmV3KG1lc3NhZ2UxLT5HZXRBcmVuYSgpKTsKKyAgICAgICAgICAgICgqc3ViX21zZzEpLT5Db3B5RnJvbSgqKnN1Yl9tc2cyKTsKKyAgICAgICAgICAgIENsZWFyRmllbGQobWVzc2FnZTIsIGZpZWxkKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnN1Yl9tc2cyID0gKCpzdWJfbXNnMSktPk5ldyhtZXNzYWdlMi0+R2V0QXJlbmEoKSk7CisgICAgICAgICAgICAoKnN1Yl9tc2cyKS0+Q29weUZyb20oKipzdWJfbXNnMSk7CisgICAgICAgICAgICBDbGVhckZpZWxkKG1lc3NhZ2UxLCBmaWVsZCk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hMSA9IEdldEFyZW5hKG1lc3NhZ2UxKTsKKyAgICAgICAgICAgICAgQXJlbmEqIGFyZW5hMiA9IEdldEFyZW5hKG1lc3NhZ2UyKTsKKyAgICAgICAgICAgICAgQXJlbmFTdHJpbmdQdHIqIHN0cmluZzEgPQorICAgICAgICAgICAgICAgICAgTXV0YWJsZVJhdzxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZTEsIGZpZWxkKTsKKyAgICAgICAgICAgICAgQXJlbmFTdHJpbmdQdHIqIHN0cmluZzIgPQorICAgICAgICAgICAgICAgICAgTXV0YWJsZVJhdzxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZTIsIGZpZWxkKTsKKyAgICAgICAgICAgICAgaWYgKGFyZW5hMSA9PSBhcmVuYTIpIHsKKyAgICAgICAgICAgICAgICBzdHJpbmcxLT5Td2FwKHN0cmluZzIpOworICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPQorICAgICAgICAgICAgICAgICAgICAmRGVmYXVsdFJhdzxBcmVuYVN0cmluZ1B0cj4oZmllbGQpLkdldChOVUxMKTsKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcgdGVtcCA9IHN0cmluZzEtPkdldChkZWZhdWx0X3B0cik7CisgICAgICAgICAgICAgICAgc3RyaW5nMS0+U2V0KGRlZmF1bHRfcHRyLCBzdHJpbmcyLT5HZXQoZGVmYXVsdF9wdHIpLCBhcmVuYTEpOworICAgICAgICAgICAgICAgIHN0cmluZzItPlNldChkZWZhdWx0X3B0ciwgdGVtcCwgYXJlbmEyKTsKKyAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmltcGxlbWVudGVkIHR5cGU6ICIgPDwgZmllbGQtPmNwcF90eXBlKCk7CisgICAgfQorICB9Cit9CisKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlN3YXBPbmVvZkZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UxLAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3QgeworICB1aW50MzIgb25lb2ZfY2FzZTEgPSBHZXRPbmVvZkNhc2UoKm1lc3NhZ2UxLCBvbmVvZl9kZXNjcmlwdG9yKTsKKyAgdWludDMyIG9uZW9mX2Nhc2UyID0gR2V0T25lb2ZDYXNlKCptZXNzYWdlMiwgb25lb2ZfZGVzY3JpcHRvcik7CisKKyAgaW50MzIgdGVtcF9pbnQzMjsKKyAgaW50NjQgdGVtcF9pbnQ2NDsKKyAgdWludDMyIHRlbXBfdWludDMyOworICB1aW50NjQgdGVtcF91aW50NjQ7CisgIGZsb2F0IHRlbXBfZmxvYXQ7CisgIGRvdWJsZSB0ZW1wX2RvdWJsZTsKKyAgYm9vbCB0ZW1wX2Jvb2w7CisgIGludCB0ZW1wX2ludDsKKyAgTWVzc2FnZSogdGVtcF9tZXNzYWdlID0gTlVMTDsKKyAgc3RyaW5nIHRlbXBfc3RyaW5nOworCisgIC8vIFN0b3JlcyBtZXNzYWdlMSdzIG9uZW9mIGZpZWxkIHRvIGEgdGVtcCB2YXJpYWJsZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZDEgPSBOVUxMOworICBpZiAob25lb2ZfY2FzZTEgPiAwKSB7CisgICAgZmllbGQxID0gZGVzY3JpcHRvcl8tPkZpbmRGaWVsZEJ5TnVtYmVyKG9uZW9mX2Nhc2UxKTsKKyAgICAvL29uZW9mX2Rlc2NyaXB0b3ItPmZpZWxkKG9uZW9mX2Nhc2UxKTsKKyAgICBzd2l0Y2ggKGZpZWxkMS0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBHRVRfVEVNUF9WQUxVRShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wXyMjVFlQRSA9IEdldEZpZWxkPFRZUEU+KCptZXNzYWdlMSwgZmllbGQxKTsgICAgICAgICAgICAgICAgXAorICAgICAgICBicmVhazsKKworICAgICAgR0VUX1RFTVBfVkFMVUUoSU5UMzIgLCBpbnQzMiApOworICAgICAgR0VUX1RFTVBfVkFMVUUoSU5UNjQgLCBpbnQ2NCApOworICAgICAgR0VUX1RFTVBfVkFMVUUoVUlOVDMyLCB1aW50MzIpOworICAgICAgR0VUX1RFTVBfVkFMVUUoVUlOVDY0LCB1aW50NjQpOworICAgICAgR0VUX1RFTVBfVkFMVUUoRkxPQVQgLCBmbG9hdCApOworICAgICAgR0VUX1RFTVBfVkFMVUUoRE9VQkxFLCBkb3VibGUpOworICAgICAgR0VUX1RFTVBfVkFMVUUoQk9PTCAgLCBib29sICApOworICAgICAgR0VUX1RFTVBfVkFMVUUoRU5VTSAgLCBpbnQgICApOworI3VuZGVmIEdFVF9URU1QX1ZBTFVFCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICB0ZW1wX21lc3NhZ2UgPSBSZWxlYXNlTWVzc2FnZShtZXNzYWdlMSwgZmllbGQxKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgdGVtcF9zdHJpbmcgPSBHZXRTdHJpbmcoKm1lc3NhZ2UxLCBmaWVsZDEpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZDEtPmNwcF90eXBlKCk7CisgICAgfQorICB9CisKKyAgLy8gU2V0cyBtZXNzYWdlMSdzIG9uZW9mIGZpZWxkIGZyb20gdGhlIG1lc3NhZ2UyJ3Mgb25lb2YgZmllbGQuCisgIGlmIChvbmVvZl9jYXNlMiA+IDApIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkMiA9CisgICAgICAgIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU51bWJlcihvbmVvZl9jYXNlMik7CisgICAgc3dpdGNoIChmaWVsZDItPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgU0VUX09ORU9GX1ZBTFVFMShDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU2V0RmllbGQ8VFlQRT4obWVzc2FnZTEsIGZpZWxkMiwgR2V0RmllbGQ8VFlQRT4oKm1lc3NhZ2UyLCBmaWVsZDIpKTsgXAorICAgICAgICBicmVhazsKKworICAgICAgU0VUX09ORU9GX1ZBTFVFMShJTlQzMiAsIGludDMyICk7CisgICAgICBTRVRfT05FT0ZfVkFMVUUxKElOVDY0ICwgaW50NjQgKTsKKyAgICAgIFNFVF9PTkVPRl9WQUxVRTEoVUlOVDMyLCB1aW50MzIpOworICAgICAgU0VUX09ORU9GX1ZBTFVFMShVSU5UNjQsIHVpbnQ2NCk7CisgICAgICBTRVRfT05FT0ZfVkFMVUUxKEZMT0FUICwgZmxvYXQgKTsKKyAgICAgIFNFVF9PTkVPRl9WQUxVRTEoRE9VQkxFLCBkb3VibGUpOworICAgICAgU0VUX09ORU9GX1ZBTFVFMShCT09MICAsIGJvb2wgICk7CisgICAgICBTRVRfT05FT0ZfVkFMVUUxKEVOVU0gICwgaW50ICAgKTsKKyN1bmRlZiBTRVRfT05FT0ZfVkFMVUUxCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgorICAgICAgICBTZXRBbGxvY2F0ZWRNZXNzYWdlKG1lc3NhZ2UxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UyLCBmaWVsZDIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkMik7CisgICAgICAgIGJyZWFrOworCisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CisgICAgICAgIFNldFN0cmluZyhtZXNzYWdlMSwgZmllbGQyLCBHZXRTdHJpbmcoKm1lc3NhZ2UyLCBmaWVsZDIpKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmltcGxlbWVudGVkIHR5cGU6ICIgPDwgZmllbGQyLT5jcHBfdHlwZSgpOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBDbGVhck9uZW9mKG1lc3NhZ2UxLCBvbmVvZl9kZXNjcmlwdG9yKTsKKyAgfQorCisgIC8vIFNldHMgbWVzc2FnZTIncyBvbmVvZiBmaWVsZCBmcm9tIHRoZSB0ZW1wIHZhcmlhYmxlLgorICBpZiAob25lb2ZfY2FzZTEgPiAwKSB7CisgICAgc3dpdGNoIChmaWVsZDEtPmNwcF90eXBlKCkpIHsKKyNkZWZpbmUgU0VUX09ORU9GX1ZBTFVFMihDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgU2V0RmllbGQ8VFlQRT4obWVzc2FnZTIsIGZpZWxkMSwgdGVtcF8jI1RZUEUpOyAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYnJlYWs7CisKKyAgICAgIFNFVF9PTkVPRl9WQUxVRTIoSU5UMzIgLCBpbnQzMiApOworICAgICAgU0VUX09ORU9GX1ZBTFVFMihJTlQ2NCAsIGludDY0ICk7CisgICAgICBTRVRfT05FT0ZfVkFMVUUyKFVJTlQzMiwgdWludDMyKTsKKyAgICAgIFNFVF9PTkVPRl9WQUxVRTIoVUlOVDY0LCB1aW50NjQpOworICAgICAgU0VUX09ORU9GX1ZBTFVFMihGTE9BVCAsIGZsb2F0ICk7CisgICAgICBTRVRfT05FT0ZfVkFMVUUyKERPVUJMRSwgZG91YmxlKTsKKyAgICAgIFNFVF9PTkVPRl9WQUxVRTIoQk9PTCAgLCBib29sICApOworICAgICAgU0VUX09ORU9GX1ZBTFVFMihFTlVNICAsIGludCAgICk7CisjdW5kZWYgU0VUX09ORU9GX1ZBTFVFMgorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlMiwgdGVtcF9tZXNzYWdlLCBmaWVsZDEpOworICAgICAgICBicmVhazsKKworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgorICAgICAgICBTZXRTdHJpbmcobWVzc2FnZTIsIGZpZWxkMSwgdGVtcF9zdHJpbmcpOworICAgICAgICBicmVhazsKKworICAgICAgZGVmYXVsdDoKKyAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZDEtPmNwcF90eXBlKCk7CisgICAgfQorICB9IGVsc2UgeworICAgIENsZWFyT25lb2YobWVzc2FnZTIsIG9uZW9mX2Rlc2NyaXB0b3IpOworICB9Cit9CisKIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlN3YXAoCiAgICAgTWVzc2FnZSogbWVzc2FnZTEsCiAgICAgTWVzc2FnZSogbWVzc2FnZTIpIGNvbnN0IHsKQEAgLTMwOSw4NCArNjQ1LDQ4IEBACiAgICAgICAgImRlc2NyaXB0b3IuIjsKICAgR09PR0xFX0NIRUNLX0VRKG1lc3NhZ2UyLT5HZXRSZWZsZWN0aW9uKCksIHRoaXMpCiAgICAgPDwgIlNlY29uZCBhcmd1bWVudCB0byBTd2FwKCkgKG9mIHR5cGUgXCIiCi0gICAgPDwgbWVzc2FnZTEtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkKKyAgICA8PCBtZXNzYWdlMi0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKQogICAgIDw8ICJcIikgaXMgbm90IGNvbXBhdGlibGUgd2l0aCB0aGlzIHJlZmxlY3Rpb24gb2JqZWN0ICh3aGljaCBpcyBmb3IgdHlwZSBcIiIKICAgICA8PCBkZXNjcmlwdG9yXy0+ZnVsbF9uYW1lKCkKICAgICA8PCAiXCIpLiAgTm90ZSB0aGF0IHRoZSBleGFjdCBzYW1lIGNsYXNzIGlzIHJlcXVpcmVkOyBub3QganVzdCB0aGUgc2FtZSAiCiAgICAgICAgImRlc2NyaXB0b3IuIjsKIAotICB1aW50MzIqIGhhc19iaXRzMSA9IE11dGFibGVIYXNCaXRzKG1lc3NhZ2UxKTsKLSAgdWludDMyKiBoYXNfYml0czIgPSBNdXRhYmxlSGFzQml0cyhtZXNzYWdlMik7Ci0gIGludCBoYXNfYml0c19zaXplID0gKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7CisgIC8vIENoZWNrIHRoYXQgYm90aCBtZXNzYWdlcyBhcmUgaW4gdGhlIHNhbWUgYXJlbmEgKG9yIGJvdGggb24gdGhlIGhlYXApLiBXZQorICAvLyBuZWVkIHRvIGNvcHkgYWxsIGRhdGEgaWYgbm90LCBkdWUgdG8gb3duZXJzaGlwIHNlbWFudGljcy4KKyAgaWYgKEdldEFyZW5hKG1lc3NhZ2UxKSAhPSBHZXRBcmVuYShtZXNzYWdlMikpIHsKKyAgICAvLyBTbG93IGNvcHkgcGF0aC4KKyAgICAvLyBVc2Ugb3VyIGFyZW5hIGFzIHRlbXAgc3BhY2UsIGlmIGF2YWlsYWJsZS4KKyAgICBNZXNzYWdlKiB0ZW1wID0gbWVzc2FnZTEtPk5ldyhHZXRBcmVuYShtZXNzYWdlMSkpOworICAgIHRlbXAtPk1lcmdlRnJvbSgqbWVzc2FnZTEpOworICAgIG1lc3NhZ2UxLT5Db3B5RnJvbSgqbWVzc2FnZTIpOworICAgIG1lc3NhZ2UyLT5Db3B5RnJvbSgqdGVtcCk7CisgICAgaWYgKEdldEFyZW5hKG1lc3NhZ2UxKSA9PSBOVUxMKSB7CisgICAgICBkZWxldGUgdGVtcDsKKyAgICB9CisgICAgcmV0dXJuOworICB9CiAKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBoYXNfYml0c19zaXplOyBpKyspIHsKLSAgICBzdGQ6OnN3YXAoaGFzX2JpdHMxW2ldLCBoYXNfYml0czJbaV0pOworICBpZiAoaGFzX2JpdHNfb2Zmc2V0XyAhPSAtMSkgeworICAgIHVpbnQzMiogaGFzX2JpdHMxID0gTXV0YWJsZUhhc0JpdHMobWVzc2FnZTEpOworICAgIHVpbnQzMiogaGFzX2JpdHMyID0gTXV0YWJsZUhhc0JpdHMobWVzc2FnZTIpOworICAgIGludCBoYXNfYml0c19zaXplID0gKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpICsgMzEpIC8gMzI7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGhhc19iaXRzX3NpemU7IGkrKykgeworICAgICAgc3RkOjpzd2FwKGhhc19iaXRzMVtpXSwgaGFzX2JpdHMyW2ldKTsKKyAgICB9CiAgIH0KIAogICBmb3IgKGludCBpID0gMDsgaSA8IGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpOyBpKyspIHsKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZGVzY3JpcHRvcl8tPmZpZWxkKGkpOwotICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotI2RlZmluZSBTV0FQX0FSUkFZUyhDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkRmllbGQ8VFlQRT4gPihtZXNzYWdlMSwgZmllbGQpLT5Td2FwKCAgICAgICAgICAgXAotICAgICAgICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkRmllbGQ8VFlQRT4gPihtZXNzYWdlMiwgZmllbGQpKTsgICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBTV0FQX0FSUkFZUyhJTlQzMiAsIGludDMyICk7Ci0gICAgICAgICAgU1dBUF9BUlJBWVMoSU5UNjQgLCBpbnQ2NCApOwotICAgICAgICAgIFNXQVBfQVJSQVlTKFVJTlQzMiwgdWludDMyKTsKLSAgICAgICAgICBTV0FQX0FSUkFZUyhVSU5UNjQsIHVpbnQ2NCk7Ci0gICAgICAgICAgU1dBUF9BUlJBWVMoRkxPQVQgLCBmbG9hdCApOwotICAgICAgICAgIFNXQVBfQVJSQVlTKERPVUJMRSwgZG91YmxlKTsKLSAgICAgICAgICBTV0FQX0FSUkFZUyhCT09MICAsIGJvb2wgICk7Ci0gICAgICAgICAgU1dBUF9BUlJBWVMoRU5VTSAgLCBpbnQgICApOwotI3VuZGVmIFNXQVBfQVJSQVlTCi0KLSAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgotICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UxLCBmaWVsZCktPlN3YXAoCi0gICAgICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UyLCBmaWVsZCkpOwotICAgICAgICAgIGJyZWFrOwotCi0gICAgICAgIGRlZmF1bHQ6Ci0gICAgICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgdHlwZTogIiA8PCBmaWVsZC0+Y3BwX3R5cGUoKTsKLSAgICAgIH0KLSAgICB9IGVsc2UgewotICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgewotI2RlZmluZSBTV0FQX1ZBTFVFUyhDUFBUWVBFLCBUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICBzdGQ6OnN3YXAoKk11dGFibGVSYXc8VFlQRT4obWVzc2FnZTEsIGZpZWxkKSwgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgICAgICAgICAgICAgICAqTXV0YWJsZVJhdzxUWVBFPihtZXNzYWdlMiwgZmllbGQpKTsgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgICBTV0FQX1ZBTFVFUyhJTlQzMiAsIGludDMyICk7Ci0gICAgICAgICAgU1dBUF9WQUxVRVMoSU5UNjQgLCBpbnQ2NCApOwotICAgICAgICAgIFNXQVBfVkFMVUVTKFVJTlQzMiwgdWludDMyKTsKLSAgICAgICAgICBTV0FQX1ZBTFVFUyhVSU5UNjQsIHVpbnQ2NCk7Ci0gICAgICAgICAgU1dBUF9WQUxVRVMoRkxPQVQgLCBmbG9hdCApOwotICAgICAgICAgIFNXQVBfVkFMVUVTKERPVUJMRSwgZG91YmxlKTsKLSAgICAgICAgICBTV0FQX1ZBTFVFUyhCT09MICAsIGJvb2wgICk7Ci0gICAgICAgICAgU1dBUF9WQUxVRVMoRU5VTSAgLCBpbnQgICApOwotICAgICAgICAgIFNXQVBfVkFMVUVTKE1FU1NBR0UsIE1lc3NhZ2UqKTsKLSN1bmRlZiBTV0FQX1ZBTFVFUwotCi0gICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKLSAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewotICAgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICAgICAgICBzdGQ6OnN3YXAoKk11dGFibGVSYXc8c3RyaW5nKj4obWVzc2FnZTEsIGZpZWxkKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICpNdXRhYmxlUmF3PHN0cmluZyo+KG1lc3NhZ2UyLCBmaWVsZCkpOwotICAgICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgYnJlYWs7Ci0KLSAgICAgICAgZGVmYXVsdDoKLSAgICAgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCB0eXBlOiAiIDw8IGZpZWxkLT5jcHBfdHlwZSgpOwotICAgICAgfQorICAgIGlmICghZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgU3dhcEZpZWxkKG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOwogICAgIH0KICAgfQogCisgIGZvciAoaW50IGkgPSAwOyBpIDwgZGVzY3JpcHRvcl8tPm9uZW9mX2RlY2xfY291bnQoKTsgaSsrKSB7CisgICAgU3dhcE9uZW9mRmllbGQobWVzc2FnZTEsIG1lc3NhZ2UyLCBkZXNjcmlwdG9yXy0+b25lb2ZfZGVjbChpKSk7CisgIH0KKwogICBpZiAoZXh0ZW5zaW9uc19vZmZzZXRfICE9IC0xKSB7CiAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMSktPlN3YXAoTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMikpOwogICB9CkBAIC0zOTQsNiArNjk0LDU1IEBACiAgIE11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UxKS0+U3dhcChNdXRhYmxlVW5rbm93bkZpZWxkcyhtZXNzYWdlMikpOwogfQogCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTd2FwRmllbGRzKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UxLAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKSBjb25zdCB7CisgIGlmIChtZXNzYWdlMSA9PSBtZXNzYWdlMikgcmV0dXJuOworCisgIC8vIFRPRE8oa2VudG9uKTogIE90aGVyIFJlZmxlY3Rpb24gbWV0aG9kcyBzaG91bGQgcHJvYmFibHkgY2hlY2sgdGhpcyB0b28uCisgIEdPT0dMRV9DSEVDS19FUShtZXNzYWdlMS0+R2V0UmVmbGVjdGlvbigpLCB0aGlzKQorICAgIDw8ICJGaXJzdCBhcmd1bWVudCB0byBTd2FwRmllbGRzKCkgKG9mIHR5cGUgXCIiCisgICAgPDwgbWVzc2FnZTEtPkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCkKKyAgICA8PCAiXCIpIGlzIG5vdCBjb21wYXRpYmxlIHdpdGggdGhpcyByZWZsZWN0aW9uIG9iamVjdCAod2hpY2ggaXMgZm9yIHR5cGUgXCIiCisgICAgPDwgZGVzY3JpcHRvcl8tPmZ1bGxfbmFtZSgpCisgICAgPDwgIlwiKS4gIE5vdGUgdGhhdCB0aGUgZXhhY3Qgc2FtZSBjbGFzcyBpcyByZXF1aXJlZDsgbm90IGp1c3QgdGhlIHNhbWUgIgorICAgICAgICJkZXNjcmlwdG9yLiI7CisgIEdPT0dMRV9DSEVDS19FUShtZXNzYWdlMi0+R2V0UmVmbGVjdGlvbigpLCB0aGlzKQorICAgIDw8ICJTZWNvbmQgYXJndW1lbnQgdG8gU3dhcEZpZWxkcygpIChvZiB0eXBlIFwiIgorICAgIDw8IG1lc3NhZ2UyLT5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCisgICAgPDwgIlwiKSBpcyBub3QgY29tcGF0aWJsZSB3aXRoIHRoaXMgcmVmbGVjdGlvbiBvYmplY3QgKHdoaWNoIGlzIGZvciB0eXBlIFwiIgorICAgIDw8IGRlc2NyaXB0b3JfLT5mdWxsX25hbWUoKQorICAgIDw8ICJcIikuICBOb3RlIHRoYXQgdGhlIGV4YWN0IHNhbWUgY2xhc3MgaXMgcmVxdWlyZWQ7IG5vdCBqdXN0IHRoZSBzYW1lICIKKyAgICAgICAiZGVzY3JpcHRvci4iOworCisgIHN0ZDo6c2V0PGludD4gc3dhcHBlZF9vbmVvZjsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07CisgICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMSktPlN3YXBFeHRlbnNpb24oCisgICAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlMiksCisgICAgICAgICAgZmllbGQtPm51bWJlcigpKTsKKyAgICB9IGVsc2UgeworICAgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgICAgaW50IG9uZW9mX2luZGV4ID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKS0+aW5kZXgoKTsKKyAgICAgICAgLy8gT25seSBzd2FwIHRoZSBvbmVvZiBmaWVsZCBvbmNlLgorICAgICAgICBpZiAoc3dhcHBlZF9vbmVvZi5maW5kKG9uZW9mX2luZGV4KSAhPSBzd2FwcGVkX29uZW9mLmVuZCgpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgc3dhcHBlZF9vbmVvZi5pbnNlcnQob25lb2ZfaW5kZXgpOworICAgICAgICBTd2FwT25lb2ZGaWVsZChtZXNzYWdlMSwgbWVzc2FnZTIsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU3dhcCBoYXMgYml0LgorICAgICAgICBTd2FwQml0KG1lc3NhZ2UxLCBtZXNzYWdlMiwgZmllbGQpOworICAgICAgICAvLyBTd2FwIGZpZWxkLgorICAgICAgICBTd2FwRmllbGQobWVzc2FnZTEsIG1lc3NhZ2UyLCBmaWVsZCk7CisgICAgICB9CisgICAgfQorICB9Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6SGFzRmllbGQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKQEAgLTQwNCw3ICs3NTMsMTEgQEAKICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewogICAgIHJldHVybiBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuSGFzKGZpZWxkLT5udW1iZXIoKSk7CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIEhhc0JpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIHJldHVybiBIYXNPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEhhc0JpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgfQogICB9CiB9CiAKQEAgLTQzMyw3ICs3ODYsMTEgQEAKIAogICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOgogICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLnNpemUoKTsKKyAgICAgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgICAgICByZXR1cm4gR2V0UmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLkdldFJlcGVhdGVkRmllbGQoKS5zaXplKCk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLnNpemUoKTsKKyAgICAgICAgfQogICAgIH0KIAogICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwpAQCAtNDQ4LDYgKzgwNSwxMSBAQAogICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CiAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+Q2xlYXJFeHRlbnNpb24oZmllbGQtPm51bWJlcigpKTsKICAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKKyAgICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgeworICAgICAgQ2xlYXJPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIHJldHVybjsKKyAgICB9CisKICAgICBpZiAoSGFzQml0KCptZXNzYWdlLCBmaWVsZCkpIHsKICAgICAgIENsZWFyQml0KG1lc3NhZ2UsIGZpZWxkKTsKIApAQCAtNDc2LDIzICs4MzgsMjggQEAKICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7CiAgICAgICAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKICAgICAgICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgotICAgICAgICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzoKLSAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3B0ciA9IERlZmF1bHRSYXc8Y29uc3Qgc3RyaW5nKj4oZmllbGQpOwotICAgICAgICAgICAgICBzdHJpbmcqKiB2YWx1ZSA9IE11dGFibGVSYXc8c3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOwotICAgICAgICAgICAgICBpZiAoKnZhbHVlICE9IGRlZmF1bHRfcHRyKSB7Ci0gICAgICAgICAgICAgICAgaWYgKGZpZWxkLT5oYXNfZGVmYXVsdF92YWx1ZSgpKSB7Ci0gICAgICAgICAgICAgICAgICAoKnZhbHVlKS0+YXNzaWduKGZpZWxkLT5kZWZhdWx0X3ZhbHVlX3N0cmluZygpKTsKLSAgICAgICAgICAgICAgICB9IGVsc2UgewotICAgICAgICAgICAgICAgICAgKCp2YWx1ZSktPmNsZWFyKCk7Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPQorICAgICAgICAgICAgICAgICAgJkRlZmF1bHRSYXc8QXJlbmFTdHJpbmdQdHI+KGZpZWxkKS5HZXQoTlVMTCk7CisgICAgICAgICAgICAgIE11dGFibGVSYXc8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKS0+RGVzdHJveShkZWZhdWx0X3B0ciwKKyAgICAgICAgICAgICAgICAgIEdldEFyZW5hKG1lc3NhZ2UpKTsKICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CiAgICAgICAgICAgfQogICAgICAgICAgIGJyZWFrOwogICAgICAgICB9CiAKICAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgICAoKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKSktPkNsZWFyKCk7CisgICAgICAgICAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHsKKyAgICAgICAgICAgIC8vIFByb3RvMyBkb2VzIG5vdCBoYXZlIGhhcy1iaXRzIGFuZCB3ZSBuZWVkIHRvIHNldCBhIG1lc3NhZ2UgZmllbGQKKyAgICAgICAgICAgIC8vIHRvIE5VTEwgaW4gb3JkZXIgdG8gaW5kaWNhdGUgaXRzIHVuLXByZXNlbmNlLgorICAgICAgICAgICAgaWYgKEdldEFyZW5hKG1lc3NhZ2UpID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgZGVsZXRlICpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpID0gTlVMTDsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKCpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCkpLT5DbGVhcigpOworICAgICAgICAgIH0KICAgICAgICAgICBicmVhazsKICAgICAgIH0KICAgICB9CkBAIC01MjQsMTAgKzg5MSwxNiBAQAogICAgICAgfQogCiAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOiB7Ci0gICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hpY2ggc3ViY2xhc3Mgb2YgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgdGhlIHR5cGUgaXMsCi0gICAgICAgIC8vIHNvIHdlIHVzZSBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkaXJlY3RseS4KLSAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCi0gICAgICAgICAgICAtPkNsZWFyPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICAgICAgTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgICAtPk11dGFibGVSZXBlYXRlZEZpZWxkKCkKKyAgICAgICAgICAgICAgLT5DbGVhcjxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIC8vIFdlIGRvbid0IGtub3cgd2hpY2ggc3ViY2xhc3Mgb2YgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgdGhlIHR5cGUgaXMsCisgICAgICAgICAgLy8gc28gd2UgdXNlIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRpcmVjdGx5LgorICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgICAgICAtPkNsZWFyPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAgICAgfQpAQCAtNTY5LDEzICs5NDIsMzkgQEAKICAgICAgICAgYnJlYWs7CiAKICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6Ci0gICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgICAgIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgICAgICAgLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpCisgICAgICAgICAgICAgIC0+UmVtb3ZlTGFzdDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQogICAgICAgICAgICAgLT5SZW1vdmVMYXN0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CiB9CiAKK01lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpSZWxlYXNlTGFzdCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFJlbGVhc2VMYXN0LCBSRVBFQVRFRCwgTUVTU0FHRSk7CisKKyAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgeworICAgIHJldHVybiBzdGF0aWNfY2FzdDxNZXNzYWdlKj4oCisgICAgICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlJlbGVhc2VMYXN0KGZpZWxkLT5udW1iZXIoKSkpOworICB9IGVsc2UgeworICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICByZXR1cm4gTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgIC0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKQorICAgICAgICAgIC0+UmVsZWFzZUxhc3Q8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAtPlJlbGVhc2VMYXN0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KCk7CisgICAgfQorICB9Cit9CisKIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlN3YXBFbGVtZW50cygKICAgICBNZXNzYWdlKiBtZXNzYWdlLAogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCkBAIC02MDYsOCArMTAwNSwxNCBAQAogCiAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6CiAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFOgotICAgICAgICBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCkKKyAgICAgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgICAgICBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgICAgIC0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKQorICAgICAgICAgICAgICAtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCiAgICAgICAgICAgICAtPlN3YXBFbGVtZW50cyhpbmRleDEsIGluZGV4Mik7CisgICAgICAgIH0KICAgICAgICAgYnJlYWs7CiAgICAgfQogICB9CkBAIC02MzEsNiArMTAzNiw3IEBACiAgIC8vIE9wdGltaXphdGlvbjogIFRoZSBkZWZhdWx0IGluc3RhbmNlIG5ldmVyIGhhcyBhbnkgZmllbGRzIHNldC4KICAgaWYgKCZtZXNzYWdlID09IGRlZmF1bHRfaW5zdGFuY2VfKSByZXR1cm47CiAKKyAgb3V0cHV0LT5yZXNlcnZlKGRlc2NyaXB0b3JfLT5maWVsZF9jb3VudCgpKTsKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKTsgaSsrKSB7CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5maWVsZChpKTsKICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKQEAgLTYzOCw3ICsxMDQ0LDExIEBACiAgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKICAgICAgIH0KICAgICB9IGVsc2UgewotICAgICAgaWYgKEhhc0JpdChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICAgIGlmIChIYXNPbmVvZkZpZWxkKG1lc3NhZ2UsIGZpZWxkKSkgeworICAgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKKyAgICAgICAgfQorICAgICAgfSBlbHNlIGlmIChIYXNCaXQobWVzc2FnZSwgZmllbGQpKSB7CiAgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKGZpZWxkKTsKICAgICAgIH0KICAgICB9CkBAIC02NTAsNyArMTA2MCw3IEBACiAgIH0KIAogICAvLyBMaXN0RmllbGRzKCkgbXVzdCBzb3J0IG91dHB1dCBieSBmaWVsZCBudW1iZXIuCi0gIHNvcnQob3V0cHV0LT5iZWdpbigpLCBvdXRwdXQtPmVuZCgpLCBGaWVsZE51bWJlclNvcnRlcigpKTsKKyAgc3RkOjpzb3J0KG91dHB1dC0+YmVnaW4oKSwgb3V0cHV0LT5lbmQoKSwgRmllbGROdW1iZXJTb3J0ZXIoKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTczNywxMiArMTE0NywxNSBAQAogICB9IGVsc2UgewogICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CiAgICAgICBkZWZhdWx0OiAgLy8gVE9ETyhrZW50b24pOiAgU3VwcG9ydCBvdGhlciBzdHJpbmcgcmVwcy4KLSAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6Ci0gICAgICAgIHJldHVybiAqR2V0RmllbGQ8Y29uc3Qgc3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOworICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogeworICAgICAgICBjb25zdCBzdHJpbmcqIGRlZmF1bHRfcHRyID0KKyAgICAgICAgICAgICZEZWZhdWx0UmF3PEFyZW5hU3RyaW5nUHRyPihmaWVsZCkuR2V0KE5VTEwpOworICAgICAgICByZXR1cm4gR2V0RmllbGQ8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKS5HZXQoZGVmYXVsdF9wdHIpOworICAgICAgfQogICAgIH0KIAogICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICAgIHJldHVybiBrRW1wdHlTdHJpbmc7ICAvLyBNYWtlIGNvbXBpbGVyIGhhcHB5LgorICAgIHJldHVybiBHZXRFbXB0eVN0cmluZygpOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KICAgfQogfQogCkBAIC03NTYsMTIgKzExNjksMTUgQEAKICAgfSBlbHNlIHsKICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgewogICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCi0gICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOgotICAgICAgICByZXR1cm4gKkdldEZpZWxkPGNvbnN0IHN0cmluZyo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6IHsKKyAgICAgICAgY29uc3Qgc3RyaW5nKiBkZWZhdWx0X3B0ciA9CisgICAgICAgICAgICAmRGVmYXVsdFJhdzxBcmVuYVN0cmluZ1B0cj4oZmllbGQpLkdldChOVUxMKTsKKyAgICAgICAgcmV0dXJuIEdldEZpZWxkPEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlLCBmaWVsZCkuR2V0KGRlZmF1bHRfcHRyKTsKKyAgICAgIH0KICAgICB9CiAKICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgICByZXR1cm4ga0VtcHR5U3RyaW5nOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KKyAgICByZXR1cm4gR2V0RW1wdHlTdHJpbmcoKTsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCiAgIH0KIH0KIApAQCAtNzc3LDEyICsxMTkzLDE1IEBACiAgICAgc3dpdGNoIChmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCkpIHsKICAgICAgIGRlZmF1bHQ6ICAvLyBUT0RPKGtlbnRvbik6ICBTdXBwb3J0IG90aGVyIHN0cmluZyByZXBzLgogICAgICAgY2FzZSBGaWVsZE9wdGlvbnM6OlNUUklORzogewotICAgICAgICBzdHJpbmcqKiBwdHIgPSBNdXRhYmxlRmllbGQ8c3RyaW5nKj4obWVzc2FnZSwgZmllbGQpOwotICAgICAgICBpZiAoKnB0ciA9PSBEZWZhdWx0UmF3PGNvbnN0IHN0cmluZyo+KGZpZWxkKSkgewotICAgICAgICAgICpwdHIgPSBuZXcgc3RyaW5nKHZhbHVlKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAoKnB0ciktPmFzc2lnbih2YWx1ZSk7CisgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPQorICAgICAgICAgICAgJkRlZmF1bHRSYXc8QXJlbmFTdHJpbmdQdHI+KGZpZWxkKS5HZXQoTlVMTCk7CisgICAgICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpICYmICFIYXNPbmVvZkZpZWxkKCptZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgICAgICBDbGVhck9uZW9mKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpOworICAgICAgICAgIE11dGFibGVGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLT5VbnNhZmVTZXREZWZhdWx0KAorICAgICAgICAgICAgICBkZWZhdWx0X3B0cik7CiAgICAgICAgIH0KKyAgICAgICAgTXV0YWJsZUZpZWxkPEFyZW5hU3RyaW5nUHRyPihtZXNzYWdlLCBmaWVsZCktPlNldChkZWZhdWx0X3B0ciwKKyAgICAgICAgICAgIHZhbHVlLCBHZXRBcmVuYShtZXNzYWdlKSk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQogICAgIH0KQEAgLTgwMyw3ICsxMjIyLDcgQEAKICAgICB9CiAKICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiQ2FuJ3QgZ2V0IGhlcmUuIjsKLSAgICByZXR1cm4ga0VtcHR5U3RyaW5nOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KKyAgICByZXR1cm4gR2V0RW1wdHlTdHJpbmcoKTsgIC8vIE1ha2UgY29tcGlsZXIgaGFwcHkuCiAgIH0KIH0KIApAQCAtODIxLDcgKzEyNDAsNyBAQAogICAgIH0KIAogICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJDYW4ndCBnZXQgaGVyZS4iOwotICAgIHJldHVybiBrRW1wdHlTdHJpbmc7ICAvLyBNYWtlIGNvbXBpbGVyIGhhcHB5LgorICAgIHJldHVybiBHZXRFbXB0eVN0cmluZygpOyAgLy8gTWFrZSBjb21waWxlciBoYXBweS4KICAgfQogfQogCkBAIC04NjQsNDAgKzEyODMsODAgQEAKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCitpbmxpbmUgYm9vbCBDcmVhdGVVbmtub3duRW51bVZhbHVlcyhjb25zdCBGaWxlRGVzY3JpcHRvciogZmlsZSkgeworICByZXR1cm4gZmlsZS0+c3ludGF4KCkgPT0gRmlsZURlc2NyaXB0b3I6OlNZTlRBWF9QUk9UTzM7Cit9CisKIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRFbnVtKAogICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKLSAgVVNBR0VfQ0hFQ0tfQUxMKEdldEVudW0sIFNJTkdVTEFSLCBFTlVNKTsKKyAgLy8gVXNhZ2UgY2hlY2tlZCBieSBHZXRFbnVtVmFsdWUuCisgIGludCB2YWx1ZSA9IEdldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCk7CisgIHJldHVybiBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TnVtYmVyQ3JlYXRpbmdJZlVua25vd24odmFsdWUpOworfQogCi0gIGludCB2YWx1ZTsKK2ludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0RW51bVZhbHVlKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKEdldEVudW1WYWx1ZSwgU0lOR1VMQVIsIEVOVU0pOworCisgIGludDMyIHZhbHVlOwogICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CiAgICAgdmFsdWUgPSBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0RW51bSgKICAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKSk7CiAgIH0gZWxzZSB7CiAgICAgdmFsdWUgPSBHZXRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkKTsKICAgfQotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPQotICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOwotICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gdmFsdWU7CiB9CiAKIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEVudW0oCiAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoU2V0RW51bSwgU0lOR1VMQVIsIEVOVU0pOworICAvLyBVc2FnZSBjaGVja2VkIGJ5IFNldEVudW1WYWx1ZS4KICAgVVNBR0VfQ0hFQ0tfRU5VTV9WQUxVRShTZXRFbnVtKTsKKyAgU2V0RW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlLT5udW1iZXIoKSk7Cit9CiAKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEVudW1WYWx1ZSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGludCB2YWx1ZSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoU2V0RW51bVZhbHVlLCBTSU5HVUxBUiwgRU5VTSk7CisgIGlmICghQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyB2YWxpZCBpZiB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBzdG9yYWdlIG9mCisgICAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjID0KKyAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgaWYgKHZhbHVlX2Rlc2MgPT0gTlVMTCkgeworICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJTZXRFbnVtVmFsdWUgYWNjZXB0cyBvbmx5IHZhbGlkIGludGVnZXIgdmFsdWVzOiB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiIHVuZXhwZWN0ZWQgZm9yIGZpZWxkICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOworICAgICAgLy8gSW4gcHJvZHVjdGlvbiBidWlsZHMsIERGQVRBTCB3aWxsIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIHNvIHdlIGhhdmUKKyAgICAgIC8vIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlOiBqdXN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKTsKKyAgICB9CisgIH0KKyAgU2V0RW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0RW51bVZhbHVlSW50ZXJuYWwoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgdmFsdWUpIGNvbnN0IHsKICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewogICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldEVudW0oZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUtPm51bWJlcigpLCBmaWVsZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YWx1ZSwgZmllbGQpOwogICB9IGVsc2UgewotICAgIFNldEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIHZhbHVlLT5udW1iZXIoKSk7CisgICAgU2V0RmllbGQ8aW50PihtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOwogICB9CiB9CiAKIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZEVudW0oCiAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZEVudW0sIFJFUEVBVEVELCBFTlVNKTsKKyAgLy8gVXNhZ2UgY2hlY2tlZCBieSBHZXRSZXBlYXRlZEVudW1WYWx1ZS4KKyAgaW50IHZhbHVlID0gR2V0UmVwZWF0ZWRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIGluZGV4KTsKKyAgcmV0dXJuIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXJDcmVhdGluZ0lmVW5rbm93bih2YWx1ZSk7Cit9CisKK2ludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRFbnVtVmFsdWUoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChHZXRSZXBlYXRlZEVudW1WYWx1ZSwgUkVQRUFURUQsIEVOVU0pOwogCiAgIGludCB2YWx1ZTsKICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewpAQCAtOTA1LDM5ICsxMzY0LDg5IEBACiAgIH0gZWxzZSB7CiAgICAgdmFsdWUgPSBHZXRSZXBlYXRlZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIGluZGV4KTsKICAgfQotICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiByZXN1bHQgPQotICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICBHT09HTEVfQ0hFQ0socmVzdWx0ICE9IE5VTEwpOwotICByZXR1cm4gcmVzdWx0OworICByZXR1cm4gdmFsdWU7CiB9CiAKIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldFJlcGVhdGVkRW51bSgKICAgICBNZXNzYWdlKiBtZXNzYWdlLAogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgewotICBVU0FHRV9DSEVDS19BTEwoU2V0UmVwZWF0ZWRFbnVtLCBSRVBFQVRFRCwgRU5VTSk7CisgIC8vIFVzYWdlIGNoZWNrZWQgYnkgU2V0UmVwZWF0ZWRFbnVtVmFsdWUuCiAgIFVTQUdFX0NIRUNLX0VOVU1fVkFMVUUoU2V0UmVwZWF0ZWRFbnVtKTsKKyAgU2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgaW5kZXgsIHZhbHVlLT5udW1iZXIoKSk7Cit9CiAKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldFJlcGVhdGVkRW51bVZhbHVlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAorICAgIGludCB2YWx1ZSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoU2V0UmVwZWF0ZWRFbnVtLCBSRVBFQVRFRCwgRU5VTSk7CisgIGlmICghQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyB2YWxpZCBpZiB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBzdG9yYWdlIG9mCisgICAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjID0KKyAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgaWYgKHZhbHVlX2Rlc2MgPT0gTlVMTCkgeworICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJTZXRSZXBlYXRlZEVudW1WYWx1ZSBhY2NlcHRzIG9ubHkgdmFsaWQgaW50ZWdlciB2YWx1ZXM6ICIKKyAgICAgICAgICAgICAgICAgIDw8ICJ2YWx1ZSAiIDw8IHZhbHVlIDw8ICIgdW5leHBlY3RlZCBmb3IgZmllbGQgIgorICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOworICAgICAgLy8gSW4gcHJvZHVjdGlvbiBidWlsZHMsIERGQVRBTCB3aWxsIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIHNvIHdlIGhhdmUKKyAgICAgIC8vIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlOiBqdXN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKTsKKyAgICB9CisgIH0KKyAgU2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgaW5kZXgsIHZhbHVlKTsKK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCwKKyAgICBpbnQgdmFsdWUpIGNvbnN0IHsKICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewogICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPlNldFJlcGVhdGVkRW51bSgKLSAgICAgIGZpZWxkLT5udW1iZXIoKSwgaW5kZXgsIHZhbHVlLT5udW1iZXIoKSk7CisgICAgICBmaWVsZC0+bnVtYmVyKCksIGluZGV4LCB2YWx1ZSk7CiAgIH0gZWxzZSB7Ci0gICAgU2V0UmVwZWF0ZWRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkLCBpbmRleCwgdmFsdWUtPm51bWJlcigpKTsKKyAgICBTZXRSZXBlYXRlZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIGluZGV4LCB2YWx1ZSk7CiAgIH0KIH0KIAogdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkRW51bSgKICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAogICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCB7Ci0gIFVTQUdFX0NIRUNLX0FMTChBZGRFbnVtLCBSRVBFQVRFRCwgRU5VTSk7CisgIC8vIFVzYWdlIGNoZWNrZWQgYnkgQWRkRW51bVZhbHVlLgogICBVU0FHRV9DSEVDS19FTlVNX1ZBTFVFKEFkZEVudW0pOworICBBZGRFbnVtVmFsdWVJbnRlcm5hbChtZXNzYWdlLCBmaWVsZCwgdmFsdWUtPm51bWJlcigpKTsKK30KIAordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkRW51bVZhbHVlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgaW50IHZhbHVlKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX0FMTChBZGRFbnVtLCBSRVBFQVRFRCwgRU5VTSk7CisgIGlmICghQ3JlYXRlVW5rbm93bkVudW1WYWx1ZXMoZGVzY3JpcHRvcl8tPmZpbGUoKSkpIHsKKyAgICAvLyBDaGVjayB0aGF0IHRoZSB2YWx1ZSBpcyB2YWxpZCBpZiB3ZSBkb24ndCBzdXBwb3J0IGRpcmVjdCBzdG9yYWdlIG9mCisgICAgLy8gdW5rbm93biBlbnVtIHZhbHVlcy4KKyAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjID0KKyAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgaWYgKHZhbHVlX2Rlc2MgPT0gTlVMTCkgeworICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJBZGRFbnVtVmFsdWUgYWNjZXB0cyBvbmx5IHZhbGlkIGludGVnZXIgdmFsdWVzOiB2YWx1ZSAiCisgICAgICAgICAgICAgICAgICA8PCB2YWx1ZSA8PCAiIHVuZXhwZWN0ZWQgZm9yIGZpZWxkICIgPDwgZmllbGQtPmZ1bGxfbmFtZSgpOworICAgICAgLy8gSW4gcHJvZHVjdGlvbiBidWlsZHMsIERGQVRBTCB3aWxsIG5vdCB0ZXJtaW5hdGUgdGhlIHByb2dyYW0sIHNvIHdlIGhhdmUKKyAgICAgIC8vIHRvIGRvIHNvbWV0aGluZyByZWFzb25hYmxlOiBqdXN0IHNldCB0aGUgZGVmYXVsdCB2YWx1ZS4KKyAgICAgIHZhbHVlID0gZmllbGQtPmRlZmF1bHRfdmFsdWVfZW51bSgpLT5udW1iZXIoKTsKKyAgICB9CisgIH0KKyAgQWRkRW51bVZhbHVlSW50ZXJuYWwobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKK30KKwordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkRW51bVZhbHVlSW50ZXJuYWwoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBpbnQgdmFsdWUpIGNvbnN0IHsKICAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewogICAgIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPkFkZEVudW0oZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPm9wdGlvbnMoKS5wYWNrZWQoKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhbHVlLT5udW1iZXIoKSwgZmllbGQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFsdWUsIGZpZWxkKTsKICAgfSBlbHNlIHsKLSAgICBBZGRGaWVsZDxpbnQ+KG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZS0+bnVtYmVyKCkpOworICAgIEFkZEZpZWxkPGludD4obWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKICAgfQogfQogCkBAIC05NDgsMTMgKzE0NTcsMTUgQEAKICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgewogICBVU0FHRV9DSEVDS19BTEwoR2V0TWVzc2FnZSwgU0lOR1VMQVIsIE1FU1NBR0UpOwogCisgIGlmIChmYWN0b3J5ID09IE5VTEwpIGZhY3RvcnkgPSBtZXNzYWdlX2ZhY3RvcnlfOworCiAgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgTWVzc2FnZSY+KAogICAgICAgICBHZXRFeHRlbnNpb25TZXQobWVzc2FnZSkuR2V0TWVzc2FnZSgKLSAgICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwKLSAgICAgICAgICBmYWN0b3J5ID09IE5VTEwgPyBtZXNzYWdlX2ZhY3RvcnlfIDogZmFjdG9yeSkpOworICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLCBmYWN0b3J5KSk7CiAgIH0gZWxzZSB7Ci0gICAgY29uc3QgTWVzc2FnZSogcmVzdWx0ID0gR2V0UmF3PGNvbnN0IE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgY29uc3QgTWVzc2FnZSogcmVzdWx0OworICAgIHJlc3VsdCA9IEdldFJhdzxjb25zdCBNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICAgcmVzdWx0ID0gRGVmYXVsdFJhdzxjb25zdCBNZXNzYWdlKj4oZmllbGQpOwogICAgIH0KQEAgLTk2NywyMCArMTQ3OCwxMzcgQEAKICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgewogICBVU0FHRV9DSEVDS19BTEwoTXV0YWJsZU1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKIAorICBpZiAoZmFjdG9yeSA9PSBOVUxMKSBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5XzsKKwogICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKLSAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+TXV0YWJsZU1lc3NhZ2UoZmllbGQsCi0gICAgICAgICAgZmFjdG9yeSA9PSBOVUxMID8gbWVzc2FnZV9mYWN0b3J5XyA6IGZhY3RvcnkpKTsKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+TXV0YWJsZU1lc3NhZ2UoZmllbGQsIGZhY3RvcnkpKTsKICAgfSBlbHNlIHsKLSAgICBNZXNzYWdlKiogcmVzdWx0ID0gTXV0YWJsZUZpZWxkPE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7Ci0gICAgaWYgKCpyZXN1bHQgPT0gTlVMTCkgewotICAgICAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9tZXNzYWdlID0gRGVmYXVsdFJhdzxjb25zdCBNZXNzYWdlKj4oZmllbGQpOwotICAgICAgKnJlc3VsdCA9IGRlZmF1bHRfbWVzc2FnZS0+TmV3KCk7CisgICAgTWVzc2FnZSogcmVzdWx0OworICAgIE1lc3NhZ2UqKiByZXN1bHRfaG9sZGVyID0gTXV0YWJsZVJhdzxNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpOworCisgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIGlmICghSGFzT25lb2ZGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7CisgICAgICAgIENsZWFyT25lb2YobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgICAgICAgIHJlc3VsdF9ob2xkZXIgPSBNdXRhYmxlRmllbGQ8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9tZXNzYWdlID0gRGVmYXVsdFJhdzxjb25zdCBNZXNzYWdlKj4oZmllbGQpOworICAgICAgICAqcmVzdWx0X2hvbGRlciA9IGRlZmF1bHRfbWVzc2FnZS0+TmV3KG1lc3NhZ2UtPkdldEFyZW5hKCkpOworICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICBTZXRCaXQobWVzc2FnZSwgZmllbGQpOwogICAgIH0KLSAgICByZXR1cm4gKnJlc3VsdDsKKworICAgIGlmICgqcmVzdWx0X2hvbGRlciA9PSBOVUxMKSB7CisgICAgICBjb25zdCBNZXNzYWdlKiBkZWZhdWx0X21lc3NhZ2UgPSBEZWZhdWx0UmF3PGNvbnN0IE1lc3NhZ2UqPihmaWVsZCk7CisgICAgICAqcmVzdWx0X2hvbGRlciA9IGRlZmF1bHRfbWVzc2FnZS0+TmV3KG1lc3NhZ2UtPkdldEFyZW5hKCkpOworICAgIH0KKyAgICByZXN1bHQgPSAqcmVzdWx0X2hvbGRlcjsKKyAgICByZXR1cm4gcmVzdWx0OwogICB9CiB9CiAKK3ZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0tfQUxMKFNldEFsbG9jYXRlZE1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+U2V0QWxsb2NhdGVkTWVzc2FnZSgKKyAgICAgICAgZmllbGQtPm51bWJlcigpLCBmaWVsZC0+dHlwZSgpLCBmaWVsZCwgc3ViX21lc3NhZ2UpOworICB9IGVsc2UgeworICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSB7CisgICAgICBpZiAoc3ViX21lc3NhZ2UgPT0gTlVMTCkgeworICAgICAgICBDbGVhck9uZW9mKG1lc3NhZ2UsIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpOworICAgICAgICByZXR1cm47CisgICAgICB9CisgICAgICAgIENsZWFyT25lb2YobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgICAgICAgICpNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCkgPSBzdWJfbWVzc2FnZTsKKyAgICAgIFNldE9uZW9mQ2FzZShtZXNzYWdlLCBmaWVsZCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKHN1Yl9tZXNzYWdlID09IE5VTEwpIHsKKyAgICAgIENsZWFyQml0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9IGVsc2UgeworICAgICAgU2V0Qml0KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisgICAgTWVzc2FnZSoqIHN1Yl9tZXNzYWdlX2hvbGRlciA9IE11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICBpZiAoR2V0QXJlbmEobWVzc2FnZSkgPT0gTlVMTCkgeworICAgICAgZGVsZXRlICpzdWJfbWVzc2FnZV9ob2xkZXI7CisgICAgfQorICAgICpzdWJfbWVzc2FnZV9ob2xkZXIgPSBzdWJfbWVzc2FnZTsKKyAgfQorfQorCit2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpTZXRBbGxvY2F0ZWRNZXNzYWdlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICAvLyBJZiBtZXNzYWdlIGFuZCBzdWItbWVzc2FnZSBhcmUgaW4gZGlmZmVyZW50IG1lbW9yeSBvd25lcnNoaXAgZG9tYWlucworICAvLyAoZGlmZmVyZW50IGFyZW5hcywgb3Igb25lIGlzIG9uIGhlYXAgYW5kIG9uZSBpcyBub3QpLCB0aGVuIHdlIG1heSBuZWVkIHRvCisgIC8vIGRvIGEgY29weS4KKyAgaWYgKHN1Yl9tZXNzYWdlICE9IE5VTEwgJiYKKyAgICAgIHN1Yl9tZXNzYWdlLT5HZXRBcmVuYSgpICE9IG1lc3NhZ2UtPkdldEFyZW5hKCkpIHsKKyAgICBpZiAoc3ViX21lc3NhZ2UtPkdldEFyZW5hKCkgPT0gTlVMTCAmJiBtZXNzYWdlLT5HZXRBcmVuYSgpICE9IE5VTEwpIHsKKyAgICAgIC8vIENhc2UgMTogcGFyZW50IGlzIG9uIGFuIGFyZW5hIGFuZCBjaGlsZCBpcyBoZWFwLWFsbG9jYXRlZC4gV2UgY2FuIGFkZAorICAgICAgLy8gdGhlIGNoaWxkIHRvIHRoZSBhcmVuYSdzIE93bigpIGxpc3QgdG8gZnJlZSBvbiBhcmVuYSBkZXN0cnVjdGlvbiwgdGhlbgorICAgICAgLy8gc2V0IG91ciBwb2ludGVyLgorICAgICAgbWVzc2FnZS0+R2V0QXJlbmEoKS0+T3duKHN1Yl9tZXNzYWdlKTsKKyAgICAgIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBzdWJfbWVzc2FnZSwgZmllbGQpOworICAgIH0gZWxzZSB7CisgICAgICAvLyBDYXNlIDI6IGFsbCBvdGhlciBjYXNlcy4gV2UgbmVlZCB0byBtYWtlIGEgY29weS4gTXV0YWJsZU1lc3NhZ2UoKSB3aWxsCisgICAgICAvLyBlaXRoZXIgZ2V0IHRoZSBleGlzdGluZyBtZXNzYWdlIG9iamVjdCwgb3IgaW5zdGFudGlhdGUgYSBuZXcgb25lIGFzCisgICAgICAvLyBhcHByb3ByaWF0ZSB3LnIudC4gb3VyIGFyZW5hLgorICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2VfY29weSA9IE11dGFibGVNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIHN1Yl9tZXNzYWdlX2NvcHktPkNvcHlGcm9tKCpzdWJfbWVzc2FnZSk7CisgICAgfQorICB9IGVsc2UgeworICAgIC8vIFNhbWUgbWVtb3J5IG93bmVyc2hpcCBkb21haW5zLgorICAgIFVuc2FmZUFyZW5hU2V0QWxsb2NhdGVkTWVzc2FnZShtZXNzYWdlLCBzdWJfbWVzc2FnZSwgZmllbGQpOworICB9Cit9CisKK01lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpVbnNhZmVBcmVuYVJlbGVhc2VNZXNzYWdlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoUmVsZWFzZU1lc3NhZ2UsIFNJTkdVTEFSLCBNRVNTQUdFKTsKKworICBpZiAoZmFjdG9yeSA9PSBOVUxMKSBmYWN0b3J5ID0gbWVzc2FnZV9mYWN0b3J5XzsKKworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKKyAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+UmVsZWFzZU1lc3NhZ2UoZmllbGQsIGZhY3RvcnkpKTsKKyAgfSBlbHNlIHsKKyAgICBDbGVhckJpdChtZXNzYWdlLCBmaWVsZCk7CisgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkpIHsKKyAgICAgIGlmIChIYXNPbmVvZkZpZWxkKCptZXNzYWdlLCBmaWVsZCkpIHsKKyAgICAgICAgKk11dGFibGVPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgPSAwOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgICB9CisgICAgfQorICAgIE1lc3NhZ2UqKiByZXN1bHQgPSBNdXRhYmxlUmF3PE1lc3NhZ2UqPihtZXNzYWdlLCBmaWVsZCk7CisgICAgTWVzc2FnZSogcmV0ID0gKnJlc3VsdDsKKyAgICAqcmVzdWx0ID0gTlVMTDsKKyAgICByZXR1cm4gcmV0OworICB9Cit9CisKK01lc3NhZ2UqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpSZWxlYXNlTWVzc2FnZSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkpIGNvbnN0IHsKKyAgTWVzc2FnZSogcmVsZWFzZWQgPSBVbnNhZmVBcmVuYVJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBmYWN0b3J5KTsKKyAgaWYgKEdldEFyZW5hKG1lc3NhZ2UpICE9IE5VTEwgJiYgcmVsZWFzZWQgIT0gTlVMTCkgeworICAgIE1lc3NhZ2UqIGNvcHlfZnJvbV9hcmVuYSA9IHJlbGVhc2VkLT5OZXcoKTsKKyAgICBjb3B5X2Zyb21fYXJlbmEtPkNvcHlGcm9tKCpyZWxlYXNlZCk7CisgICAgcmVsZWFzZWQgPSBjb3B5X2Zyb21fYXJlbmE7CisgIH0KKyAgcmV0dXJuIHJlbGVhc2VkOworfQorCiBjb25zdCBNZXNzYWdlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRNZXNzYWdlKAogICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgewogICBVU0FHRV9DSEVDS19BTEwoR2V0UmVwZWF0ZWRNZXNzYWdlLCBSRVBFQVRFRCwgTUVTU0FHRSk7CkBAIC05ODksOCArMTYxNywxNCBAQAogICAgIHJldHVybiBzdGF0aWNfY2FzdDxjb25zdCBNZXNzYWdlJj4oCiAgICAgICAgIEdldEV4dGVuc2lvblNldChtZXNzYWdlKS5HZXRSZXBlYXRlZE1lc3NhZ2UoZmllbGQtPm51bWJlcigpLCBpbmRleCkpOwogICB9IGVsc2UgewotICAgIHJldHVybiBHZXRSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQotICAgICAgICAuR2V0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KGluZGV4KTsKKyAgICBpZiAoSXNNYXBGaWVsZEluQXBpKGZpZWxkKSkgeworICAgICAgcmV0dXJuIEdldFJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQorICAgICAgICAgIC5HZXRSZXBlYXRlZEZpZWxkKCkKKyAgICAgICAgICAuR2V0PEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIEdldFJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgLkdldDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihpbmRleCk7CisgICAgfQogICB9CiB9CiAKQEAgLTEwMDMsOCArMTYzNywxNCBAQAogICAgICAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKAogICAgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgaW5kZXgpKTsKICAgfSBlbHNlIHsKLSAgICByZXR1cm4gTXV0YWJsZVJhdzxSZXBlYXRlZFB0ckZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJldHVybiBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpCisgICAgICAgICAgLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpCisgICAgICAgICAgLT5NdXRhYmxlPEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPiA+KGluZGV4KTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKQogICAgICAgICAtPk11dGFibGU8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oaW5kZXgpOworICAgIH0KICAgfQogfQogCkBAIC0xMDE5LDExICsxNjU5LDE4IEBACiAgICAgcmV0dXJuIHN0YXRpY19jYXN0PE1lc3NhZ2UqPigKICAgICAgICAgTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+QWRkTWVzc2FnZShmaWVsZCwgZmFjdG9yeSkpOwogICB9IGVsc2UgeworICAgIE1lc3NhZ2UqIHJlc3VsdCA9IE5VTEw7CisKICAgICAvLyBXZSBjYW4ndCB1c2UgQWRkRmllbGQ8TWVzc2FnZT4oKSBiZWNhdXNlIFJlcGVhdGVkUHRyRmllbGRCYXNlIGRvZXNuJ3QKICAgICAvLyBrbm93IGhvdyB0byBhbGxvY2F0ZSBvbmUuCi0gICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIHJlcGVhdGVkID0KLSAgICAgIE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKTsKLSAgICBNZXNzYWdlKiByZXN1bHQgPSByZXBlYXRlZC0+QWRkRnJvbUNsZWFyZWQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oKTsKKyAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZSogcmVwZWF0ZWQgPSBOVUxMOworICAgIGlmIChJc01hcEZpZWxkSW5BcGkoZmllbGQpKSB7CisgICAgICByZXBlYXRlZCA9CisgICAgICAgICAgTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKS0+TXV0YWJsZVJlcGVhdGVkRmllbGQoKTsKKyAgICB9IGVsc2UgeworICAgICAgcmVwZWF0ZWQgPSBNdXRhYmxlUmF3PFJlcGVhdGVkUHRyRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCk7CisgICAgfQorICAgIHJlc3VsdCA9IHJlcGVhdGVkLT5BZGRGcm9tQ2xlYXJlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPigpOwogICAgIGlmIChyZXN1bHQgPT0gTlVMTCkgewogICAgICAgLy8gV2UgbXVzdCBhbGxvY2F0ZSBhIG5ldyBvYmplY3QuCiAgICAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGU7CkBAIC0xMDMyLDE0ICsxNjc5LDE2OCBAQAogICAgICAgfSBlbHNlIHsKICAgICAgICAgcHJvdG90eXBlID0gJnJlcGVhdGVkLT5HZXQ8R2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+ID4oMCk7CiAgICAgICB9Ci0gICAgICByZXN1bHQgPSBwcm90b3R5cGUtPk5ldygpOwotICAgICAgcmVwZWF0ZWQtPkFkZEFsbG9jYXRlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihyZXN1bHQpOworICAgICAgcmVzdWx0ID0gcHJvdG90eXBlLT5OZXcobWVzc2FnZS0+R2V0QXJlbmEoKSk7CisgICAgICAvLyBXZSBjYW4gZ3VhcmFudGVlIGhlcmUgdGhhdCByZXBlYXRlZCBhbmQgcmVzdWx0IGFyZSBlaXRoZXIgYm90aCBoZWFwCisgICAgICAvLyBhbGxvY2F0ZWQgb3IgYXJlbmEgb3duZWQuIFNvIGl0IGlzIHNhZmUgdG8gY2FsbCB0aGUgdW5zYWZlIHZlcnNpb24KKyAgICAgIC8vIG9mIEFkZEFsbG9jYXRlZC4KKyAgICAgIHJlcGVhdGVkLT5VbnNhZmVBcmVuYUFkZEFsbG9jYXRlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihyZXN1bHQpOwogICAgIH0KKwogICAgIHJldHVybiByZXN1bHQ7CiAgIH0KIH0KIAotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6QWRkQWxsb2NhdGVkTWVzc2FnZSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIE1lc3NhZ2UqIG5ld19lbnRyeSkgY29uc3QgeworICBVU0FHRV9DSEVDS19BTEwoQWRkQWxsb2NhdGVkTWVzc2FnZSwgUkVQRUFURUQsIE1FU1NBR0UpOworCisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICBNdXRhYmxlRXh0ZW5zaW9uU2V0KG1lc3NhZ2UpLT5BZGRBbGxvY2F0ZWRNZXNzYWdlKGZpZWxkLCBuZXdfZW50cnkpOworICB9IGVsc2UgeworICAgIFJlcGVhdGVkUHRyRmllbGRCYXNlKiByZXBlYXRlZCA9IE5VTEw7CisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJlcGVhdGVkID0KKyAgICAgICAgICBNdXRhYmxlUmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpOworICAgIH0gZWxzZSB7CisgICAgICByZXBlYXRlZCA9IE11dGFibGVSYXc8UmVwZWF0ZWRQdHJGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICB9CisgICAgcmVwZWF0ZWQtPkFkZEFsbG9jYXRlZDxHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT4gPihuZXdfZW50cnkpOworICB9Cit9CisKK3ZvaWQqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHB0eXBlLAorICAgIGludCBjdHlwZSwgY29uc3QgRGVzY3JpcHRvciogZGVzYykgY29uc3QgeworICBVU0FHRV9DSEVDS19SRVBFQVRFRCgiTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQiKTsKKyAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IGNwcHR5cGUpCisgICAgUmVwb3J0UmVmbGVjdGlvblVzYWdlVHlwZUVycm9yKGRlc2NyaXB0b3JfLAorICAgICAgICBmaWVsZCwgIk11dGFibGVSYXdSZXBlYXRlZEZpZWxkIiwgY3BwdHlwZSk7CisgIGlmIChjdHlwZSA+PSAwKQorICAgIEdPT0dMRV9DSEVDS19FUShmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCksIGN0eXBlKSA8PCAic3VidHlwZSBtaXNtYXRjaCI7CisgIGlmIChkZXNjICE9IE5VTEwpCisgICAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgZGVzYykgPDwgIndyb25nIHN1Ym1lc3NhZ2UgdHlwZSI7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICByZXR1cm4gTXV0YWJsZUV4dGVuc2lvblNldChtZXNzYWdlKS0+TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoCisgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSwgZmllbGQtPmlzX3BhY2tlZCgpLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgLy8gVHJpZ2dlciB0cmFuc2Zvcm0gZm9yIE1hcEZpZWxkCisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJldHVybiByZWludGVycHJldF9jYXN0PE1hcEZpZWxkQmFzZSo+KHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV0pCisgICAgICAgICAgLT5NdXRhYmxlUmVwZWF0ZWRGaWVsZCgpOworICAgIH0KKyAgICByZXR1cm4gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgb2Zmc2V0c19bZmllbGQtPmluZGV4KCldOworICB9Cit9CisKK2NvbnN0IHZvaWQqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSYXdSZXBlYXRlZEZpZWxkKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcHR5cGUsCisgICAgaW50IGN0eXBlLCBjb25zdCBEZXNjcmlwdG9yKiBkZXNjKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLX1JFUEVBVEVEKCJHZXRSYXdSZXBlYXRlZEZpZWxkIik7CisgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSAhPSBjcHB0eXBlKQorICAgIFJlcG9ydFJlZmxlY3Rpb25Vc2FnZVR5cGVFcnJvcihkZXNjcmlwdG9yXywKKyAgICAgICAgZmllbGQsICJHZXRSYXdSZXBlYXRlZEZpZWxkIiwgY3BwdHlwZSk7CisgIGlmIChjdHlwZSA+PSAwKQorICAgIEdPT0dMRV9DSEVDS19FUShmaWVsZC0+b3B0aW9ucygpLmN0eXBlKCksIGN0eXBlKSA8PCAic3VidHlwZSBtaXNtYXRjaCI7CisgIGlmIChkZXNjICE9IE5VTEwpCisgICAgR09PR0xFX0NIRUNLX0VRKGZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgZGVzYykgPDwgIndyb25nIHN1Ym1lc3NhZ2UgdHlwZSI7CisgIGlmIChmaWVsZC0+aXNfZXh0ZW5zaW9uKCkpIHsKKyAgICAvLyBTaG91bGQgdXNlIGV4dGVuc2lvbl9zZXQ6OkdldFJhd1JlcGVhdGVkRmllbGQuIEhvd2V2ZXIsIHRoZSByZXF1aXJlZAorICAgIC8vIHBhcmFtZXRlciAiZGVmYXVsdCByZXBlYXRlZCB2YWx1ZSIgaXMgbm90IHZlcnkgZWFzeSB0byBnZXQgaGVyZS4KKyAgICAvLyBNYXAgaXMgbm90IHN1cHBvcnRlZCBpbiBleHRlbnNpb25zLCBpdCBpcyBhY2NlcHRhYmxlIHRvIHVzZQorICAgIC8vIGV4dGVuc2lvbl9zZXQ6Ok11dGFibGVSYXdSZXBlYXRlZEZpZWxkIHdoaWNoIGRvZXMgbm90IGNoYW5nZSB0aGUgbWVzc2FnZS4KKyAgICByZXR1cm4gTXV0YWJsZUV4dGVuc2lvblNldChjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSkpCisgICAgICAgIC0+TXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoCisgICAgICAgIGZpZWxkLT5udW1iZXIoKSwgZmllbGQtPnR5cGUoKSwgZmllbGQtPmlzX3BhY2tlZCgpLCBmaWVsZCk7CisgIH0gZWxzZSB7CisgICAgLy8gVHJpZ2dlciB0cmFuc2Zvcm0gZm9yIE1hcEZpZWxkCisgICAgaWYgKElzTWFwRmllbGRJbkFwaShmaWVsZCkpIHsKKyAgICAgIHJldHVybiAmKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgTWFwRmllbGRCYXNlKj4oCisgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArCisgICAgICAgICAgb2Zmc2V0c19bZmllbGQtPmluZGV4KCldKS0+R2V0UmVwZWF0ZWRGaWVsZCgpKTsKKyAgICB9CisgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKyBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV07CisgIH0KK30KKworY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgdWludDMyIGZpZWxkX251bWJlciA9IEdldE9uZW9mQ2FzZShtZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yKTsKKyAgaWYgKGZpZWxkX251bWJlciA9PSAwKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgcmV0dXJuIGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU51bWJlcihmaWVsZF9udW1iZXIpOworfQorCitib29sIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpDb250YWluc01hcEtleSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgY29uc3QgTWFwS2V5JiBrZXkpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0soSXNNYXBGaWVsZEluQXBpKGZpZWxkKSwKKyAgICAgICAgICAgICAgIkxvb2t1cE1hcFZhbHVlIiwKKyAgICAgICAgICAgICAgIkZpZWxkIGlzIG5vdCBhIG1hcCBmaWVsZC4iKTsKKyAgcmV0dXJuIEdldFJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKS5Db250YWluc01hcEtleShrZXkpOworfQorCitib29sIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpJbnNlcnRPckxvb2t1cE1hcFZhbHVlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBNYXBLZXkmIGtleSwKKyAgICBNYXBWYWx1ZVJlZiogdmFsKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksCisgICAgICAgICAgICAgICJJbnNlcnRPckxvb2t1cE1hcFZhbHVlIiwKKyAgICAgICAgICAgICAgIkZpZWxkIGlzIG5vdCBhIG1hcCBmaWVsZC4iKTsKKyAgdmFsLT5TZXRUeXBlKGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+RmluZEZpZWxkQnlOYW1lKCJ2YWx1ZSIpLT5jcHBfdHlwZSgpKTsKKyAgcmV0dXJuIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCktPkluc2VydE9yTG9va3VwTWFwVmFsdWUoCisgICAgICBrZXksIHZhbCk7Cit9CisKK2Jvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkRlbGV0ZU1hcFZhbHVlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICBjb25zdCBNYXBLZXkmIGtleSkgY29uc3QgeworICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLAorICAgICAgICAgICAgICAiRGVsZXRlTWFwVmFsdWUiLAorICAgICAgICAgICAgICAiRmllbGQgaXMgbm90IGEgbWFwIGZpZWxkLiIpOworICByZXR1cm4gTXV0YWJsZVJhdzxNYXBGaWVsZEJhc2U+KG1lc3NhZ2UsIGZpZWxkKS0+RGVsZXRlTWFwVmFsdWUoa2V5KTsKK30KKworTWFwSXRlcmF0b3IgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok1hcEJlZ2luKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLAorICAgICAgICAgICAgICAiTWFwQmVnaW4iLAorICAgICAgICAgICAgICAiRmllbGQgaXMgbm90IGEgbWFwIGZpZWxkLiIpOworICBNYXBJdGVyYXRvciBpdGVyKG1lc3NhZ2UsIGZpZWxkKTsKKyAgR2V0UmF3PE1hcEZpZWxkQmFzZT4oKm1lc3NhZ2UsIGZpZWxkKS5NYXBCZWdpbigmaXRlcik7CisgIHJldHVybiBpdGVyOworfQorCitNYXBJdGVyYXRvciBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TWFwRW5kKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBVU0FHRV9DSEVDSyhJc01hcEZpZWxkSW5BcGkoZmllbGQpLAorICAgICAgICAgICAgICAiTWFwRW5kIiwKKyAgICAgICAgICAgICAgIkZpZWxkIGlzIG5vdCBhIG1hcCBmaWVsZC4iKTsKKyAgTWFwSXRlcmF0b3IgaXRlcihtZXNzYWdlLCBmaWVsZCk7CisgIEdldFJhdzxNYXBGaWVsZEJhc2U+KCptZXNzYWdlLCBmaWVsZCkuTWFwRW5kKCZpdGVyKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKK2ludCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TWFwU2l6ZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgVVNBR0VfQ0hFQ0soSXNNYXBGaWVsZEluQXBpKGZpZWxkKSwKKyAgICAgICAgICAgICAgIk1hcFNpemUiLAorICAgICAgICAgICAgICAiRmllbGQgaXMgbm90IGEgbWFwIGZpZWxkLiIpOworICByZXR1cm4gR2V0UmF3PE1hcEZpZWxkQmFzZT4obWVzc2FnZSwgZmllbGQpLnNpemUoKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogY29uc3QgRmllbGREZXNjcmlwdG9yKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6RmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKAogICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgewpAQCAtMTA3Nyw2ICsxODc4LDEwIEBACiAgIHJldHVybiBkZXNjcmlwdG9yX3Bvb2xfLT5GaW5kRXh0ZW5zaW9uQnlOdW1iZXIoZGVzY3JpcHRvcl8sIG51bWJlcik7CiB9CiAKK2Jvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSBjb25zdCB7CisgIHJldHVybiBDcmVhdGVVbmtub3duRW51bVZhbHVlcyhkZXNjcmlwdG9yXy0+ZmlsZSgpKTsKK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gU29tZSBwcml2YXRlIGhlbHBlcnMuCiAKQEAgLTEwODUsMzcgKzE4OTAsNzAgQEAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgogaW5saW5lIGNvbnN0IFR5cGUmIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpHZXRSYXcoCiAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBpZiAoZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSAmJiAhSGFzT25lb2ZGaWVsZChtZXNzYWdlLCBmaWVsZCkpIHsKKyAgICByZXR1cm4gRGVmYXVsdFJhdzxUeXBlPihmaWVsZCk7CisgIH0KKyAgaW50IGluZGV4ID0gZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSA/CisgICAgICBkZXNjcmlwdG9yXy0+ZmllbGRfY291bnQoKSArIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCktPmluZGV4KCkgOgorICAgICAgZmllbGQtPmluZGV4KCk7CiAgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKwotICAgICAgICAgICAgICAgICAgICBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV07CisgICAgICBvZmZzZXRzX1tpbmRleF07CiAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUeXBlKj4ocHRyKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CiBpbmxpbmUgVHlwZSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVSYXcoCiAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV07CisgIGludCBpbmRleCA9IGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgPworICAgICAgZGVzY3JpcHRvcl8tPmZpZWxkX2NvdW50KCkgKyBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpLT5pbmRleCgpIDoKKyAgICAgIGZpZWxkLT5pbmRleCgpOworICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBvZmZzZXRzX1tpbmRleF07CiAgIHJldHVybiByZWludGVycHJldF9jYXN0PFR5cGUqPihwdHIpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KIGlubGluZSBjb25zdCBUeXBlJiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6RGVmYXVsdFJhdygKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7Ci0gIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkZWZhdWx0X2luc3RhbmNlXykgKwotICAgICAgICAgICAgICAgICAgICBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV07CisgIGNvbnN0IHZvaWQqIHB0ciA9IGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgPworICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRlZmF1bHRfb25lb2ZfaW5zdGFuY2VfKSArCisgICAgICBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV0gOgorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRlZmF1bHRfaW5zdGFuY2VfKSArCisgICAgICBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV07CiAgIHJldHVybiAqcmVpbnRlcnByZXRfY2FzdDxjb25zdCBUeXBlKj4ocHRyKTsKIH0KIAogaW5saW5lIGNvbnN0IHVpbnQzMiogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEhhc0JpdHMoCiAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBpZiAoaGFzX2JpdHNfb2Zmc2V0XyA9PSAtMSkgeyAgLy8gcHJvdG8zIHdpdGggbm8gaGFzLWJpdHMuCisgICAgcmV0dXJuIE5VTEw7CisgIH0KICAgY29uc3Qgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KCZtZXNzYWdlKSArIGhhc19iaXRzX29mZnNldF87CiAgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMio+KHB0cik7CiB9CiBpbmxpbmUgdWludDMyKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TXV0YWJsZUhhc0JpdHMoCiAgICAgTWVzc2FnZSogbWVzc2FnZSkgY29uc3QgeworICBpZiAoaGFzX2JpdHNfb2Zmc2V0XyA9PSAtMSkgeworICAgIHJldHVybiBOVUxMOworICB9CiAgIHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dWludDgqPihtZXNzYWdlKSArIGhhc19iaXRzX29mZnNldF87CiAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQzMio+KHB0cik7CiB9CiAKK2lubGluZSB1aW50MzIgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldE9uZW9mQ2FzZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2ZfZGVzY3JpcHRvcikgY29uc3QgeworICBjb25zdCB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQ4Kj4oJm1lc3NhZ2UpCisgICAgICArIG9uZW9mX2Nhc2Vfb2Zmc2V0XzsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDMyKj4ocHRyKVtvbmVvZl9kZXNjcmlwdG9yLT5pbmRleCgpXTsKK30KKworaW5saW5lIHVpbnQzMiogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVPbmVvZkNhc2UoCisgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgb25lb2ZfY2FzZV9vZmZzZXRfOworICByZXR1cm4gJihyZWludGVycHJldF9jYXN0PHVpbnQzMio+KHB0cilbb25lb2ZfZGVzY3JpcHRvci0+aW5kZXgoKV0pOworfQorCiBpbmxpbmUgY29uc3QgRXh0ZW5zaW9uU2V0JiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0RXh0ZW5zaW9uU2V0KAogICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0IHsKICAgR09PR0xFX0RDSEVDS19ORShleHRlbnNpb25zX29mZnNldF8sIC0xKTsKQEAgLTExMzAsMjMgKzE5NjgsMTk2IEBACiAgIHJldHVybiByZWludGVycHJldF9jYXN0PEV4dGVuc2lvblNldCo+KHB0cik7CiB9CiAKK2lubGluZSBBcmVuYSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldEFyZW5hKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgaWYgKGFyZW5hX29mZnNldF8gPT0ga05vQXJlbmFQb2ludGVyKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKworICBpZiAodW5rbm93bl9maWVsZHNfb2Zmc2V0XyA9PSBrVW5rbm93bkZpZWxkU2V0SW5NZXRhZGF0YSkgeworICAgIC8vIHplcm8tb3ZlcmhlYWQgYXJlbmEgcG9pbnRlciBvdmVybG9hZGluZyBVbmtub3duRmllbGRzCisgICAgcmV0dXJuIEdldEludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEoKm1lc3NhZ2UpLmFyZW5hKCk7CisgIH0KKworICAvLyBCYXNlbGluZSBjYXNlOiBtZXNzYWdlIGNsYXNzIGhhcyBhIGRlZGljYXRlZCBhcmVuYSBwb2ludGVyLgorICB2b2lkKiBwdHIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBhcmVuYV9vZmZzZXRfOworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8QXJlbmEqKj4ocHRyKTsKK30KKworaW5saW5lIGNvbnN0IEludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEmCitHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSBjb25zdCB7CisgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKyBhcmVuYV9vZmZzZXRfOworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgSW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSo+KHB0cik7Cit9CisKK2lubGluZSBJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKgorR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok11dGFibGVJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0IHsKKyAgdm9pZCogcHRyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KG1lc3NhZ2UpICsgYXJlbmFfb2Zmc2V0XzsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSo+KHB0cik7Cit9CisKK2lubGluZSBib29sCitHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6R2V0SXNEZWZhdWx0SW5zdGFuY2UoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgeworICBpZiAoaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXRfID09IGtIYXNOb0RlZmF1bHRJbnN0YW5jZUZpZWxkKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIGNvbnN0IHZvaWQqIHB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPigmbWVzc2FnZSkgKworICAgICAgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXRfOworICByZXR1cm4gKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgYm9vbCo+KHB0cik7Cit9CisKIC8vIFNpbXBsZSBhY2Nlc3NvcnMgZm9yIG1hbmlwdWxhdGluZyBoYXNfYml0c18uCiBpbmxpbmUgYm9vbCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6SGFzQml0KAogICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHsKKyAgICAvLyBwcm90bzM6IG5vIGhhcy1iaXRzLiBBbGwgZmllbGRzIHByZXNlbnQgZXhjZXB0IG1lc3NhZ2VzLCB3aGljaCBhcmUKKyAgICAvLyBwcmVzZW50IG9ubHkgaWYgdGhlaXIgbWVzc2FnZS1maWVsZCBwb2ludGVyIGlzIG5vbi1OVUxMLgorICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworICAgICAgcmV0dXJuICFHZXRJc0RlZmF1bHRJbnN0YW5jZShtZXNzYWdlKSAmJgorICAgICAgICAgIEdldFJhdzxjb25zdCBNZXNzYWdlKj4obWVzc2FnZSwgZmllbGQpICE9IE5VTEw7CisgICAgfSBlbHNlIHsKKyAgICAgIC8vIE5vbi1tZXNzYWdlIGZpZWxkIChhbmQgbm9uLW9uZW9mLCBzaW5jZSB0aGF0IHdhcyBoYW5kbGVkIGluIEhhc0ZpZWxkKCkKKyAgICAgIC8vIGJlZm9yZSBjYWxsaW5nIHVzKSwgYW5kIHNpbmd1bGFyIChhZ2FpbiwgY2hlY2tlZCBpbiBIYXNGaWVsZCkuIFNvLCB0aGlzCisgICAgICAvLyBmaWVsZCBtdXN0IGJlIGEgc2NhbGFyLgorCisgICAgICAvLyBTY2FsYXIgcHJpbWl0aXZlIChudW1lcmljIG9yIHN0cmluZy9ieXRlcykgZmllbGRzIGFyZSBwcmVzZW50IGlmCisgICAgICAvLyB0aGVpciB2YWx1ZSBpcyBub24temVybyAobnVtZXJpYykgb3Igbm9uLWVtcHR5IChzdHJpbmcvYnl0ZXMpLiAgTi5CLjoKKyAgICAgIC8vIHdlIG11c3QgdXNlIHRoaXMgZGVmaW5pdGlvbiBoZXJlLCByYXRoZXIgdGhhbiB0aGUgInNjYWxhciBmaWVsZHMKKyAgICAgIC8vIGFsd2F5cyBwcmVzZW50IiBpbiB0aGUgcHJvdG8zIGRvY3MsIGJlY2F1c2UgTWVyZ2VGcm9tKCkgc2VtYW50aWNzCisgICAgICAvLyByZXF1aXJlIHByZXNlbmNlIGFzICJwcmVzZW50IG9uIHdpcmUiLCBhbmQgcmVmbGVjdGlvbi1iYXNlZCBtZXJnZQorICAgICAgLy8gKHdoaWNoIHVzZXMgSGFzRmllbGQoKSkgbmVlZHMgdG8gYmUgY29uc2lzdGVudCB3aXRoIHRoaXMuCisgICAgICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICBjb25zdCBzdHJpbmcqIGRlZmF1bHRfcHRyID0KKyAgICAgICAgICAgICAgICAgICZEZWZhdWx0UmF3PEFyZW5hU3RyaW5nUHRyPihmaWVsZCkuR2V0KE5VTEwpOworICAgICAgICAgICAgICByZXR1cm4gR2V0RmllbGQ8QXJlbmFTdHJpbmdQdHI+KG1lc3NhZ2UsIGZpZWxkKS5HZXQoCisgICAgICAgICAgICAgICAgICBkZWZhdWx0X3B0cikuc2l6ZSgpID4gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICB9CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9CT09MOgorICAgICAgICAgIHJldHVybiBHZXRSYXc8Ym9vbD4obWVzc2FnZSwgZmllbGQpICE9IGZhbHNlOworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjoKKyAgICAgICAgICByZXR1cm4gR2V0UmF3PGludDMyPihtZXNzYWdlLCBmaWVsZCkgIT0gMDsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6CisgICAgICAgICAgcmV0dXJuIEdldFJhdzxpbnQ2ND4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjoKKyAgICAgICAgICByZXR1cm4gR2V0UmF3PHVpbnQzMj4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDoKKyAgICAgICAgICByZXR1cm4gR2V0UmF3PHVpbnQ2ND4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOgorICAgICAgICAgIHJldHVybiBHZXRSYXc8ZmxvYXQ+KG1lc3NhZ2UsIGZpZWxkKSAhPSAwLjA7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRToKKyAgICAgICAgICByZXR1cm4gR2V0UmF3PGRvdWJsZT4obWVzc2FnZSwgZmllbGQpICE9IDAuMDsKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTToKKyAgICAgICAgICByZXR1cm4gR2V0UmF3PGludD4obWVzc2FnZSwgZmllbGQpICE9IDA7CisgICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0U6CisgICAgICAgICAgLy8gaGFuZGxlZCBhYm92ZTsgYXZvaWQgd2FybmluZworICAgICAgICAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJSZWFjaGVkIGltcG9zc2libGUgY2FzZSBpbiBIYXNCaXQoKS4iOworICAgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKyAgfQogICByZXR1cm4gR2V0SGFzQml0cyhtZXNzYWdlKVtmaWVsZC0+aW5kZXgoKSAvIDMyXSAmCiAgICAgKDEgPDwgKGZpZWxkLT5pbmRleCgpICUgMzIpKTsKIH0KIAogaW5saW5lIHZvaWQgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlNldEJpdCgKICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIGlmIChoYXNfYml0c19vZmZzZXRfID09IC0xKSB7CisgICAgcmV0dXJuOworICB9CiAgIE11dGFibGVIYXNCaXRzKG1lc3NhZ2UpW2ZpZWxkLT5pbmRleCgpIC8gMzJdIHw9ICgxIDw8IChmaWVsZC0+aW5kZXgoKSAlIDMyKSk7CiB9CiAKIGlubGluZSB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpDbGVhckJpdCgKICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIGlmIChoYXNfYml0c19vZmZzZXRfID09IC0xKSB7CisgICAgcmV0dXJuOworICB9CiAgIE11dGFibGVIYXNCaXRzKG1lc3NhZ2UpW2ZpZWxkLT5pbmRleCgpIC8gMzJdICY9IH4oMSA8PCAoZmllbGQtPmluZGV4KCkgJSAzMikpOwogfQogCitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U3dhcEJpdCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlMSwgTWVzc2FnZSogbWVzc2FnZTIsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgaWYgKGhhc19iaXRzX29mZnNldF8gPT0gLTEpIHsKKyAgICByZXR1cm47CisgIH0KKyAgYm9vbCB0ZW1wX2hhc19iaXQgPSBIYXNCaXQoKm1lc3NhZ2UxLCBmaWVsZCk7CisgIGlmIChIYXNCaXQoKm1lc3NhZ2UyLCBmaWVsZCkpIHsKKyAgICBTZXRCaXQobWVzc2FnZTEsIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBDbGVhckJpdChtZXNzYWdlMSwgZmllbGQpOworICB9CisgIGlmICh0ZW1wX2hhc19iaXQpIHsKKyAgICBTZXRCaXQobWVzc2FnZTIsIGZpZWxkKTsKKyAgfSBlbHNlIHsKKyAgICBDbGVhckJpdChtZXNzYWdlMiwgZmllbGQpOworICB9Cit9CisKK2lubGluZSBib29sIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpIYXNPbmVvZigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgcmV0dXJuIChHZXRPbmVvZkNhc2UobWVzc2FnZSwgb25lb2ZfZGVzY3JpcHRvcikgPiAwKTsKK30KKworaW5saW5lIGJvb2wgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Okhhc09uZW9mRmllbGQoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gKEdldE9uZW9mQ2FzZShtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKSA9PSBmaWVsZC0+bnVtYmVyKCkpOworfQorCitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0T25lb2ZDYXNlKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgKk11dGFibGVPbmVvZkNhc2UobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSkgPSBmaWVsZC0+bnVtYmVyKCk7Cit9CisKK2lubGluZSB2b2lkIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpDbGVhck9uZW9mRmllbGQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBpZiAoSGFzT25lb2ZGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7CisgICAgQ2xlYXJPbmVvZihtZXNzYWdlLCBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpKTsKKyAgfQorfQorCitpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6Q2xlYXJPbmVvZigKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0IHsKKyAgLy8gVE9ETyhqaWVsdW8pOiBDb25zaWRlciB0byBjYWNoZSB0aGUgdW51c2VkIG9iamVjdCBpbnN0ZWFkIG9mIGRlbGV0aW5nCisgIC8vIGl0LiBJdCB3aWxsIGJlIG11Y2ggZmFzdGVyIGlmIGFuIGFwbGljYXRpb24gc3dpdGNoZXMgYSBsb3QgZnJvbQorICAvLyBhIGZldyBvbmVvZiBmaWVsZHMuICBUaW1lL3NwYWNlIHRyYWRlb2ZmCisgIHVpbnQzMiBvbmVvZl9jYXNlID0gR2V0T25lb2ZDYXNlKCptZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yKTsKKyAgaWYgKG9uZW9mX2Nhc2UgPiAwKSB7CisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU51bWJlcihvbmVvZl9jYXNlKTsKKyAgICBpZiAoR2V0QXJlbmEobWVzc2FnZSkgPT0gTlVMTCkgeworICAgICAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworICAgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgICAgICBzd2l0Y2ggKGZpZWxkLT5vcHRpb25zKCkuY3R5cGUoKSkgeworICAgICAgICAgICAgZGVmYXVsdDogIC8vIFRPRE8oa2VudG9uKTogIFN1cHBvcnQgb3RoZXIgc3RyaW5nIHJlcHMuCisgICAgICAgICAgICBjYXNlIEZpZWxkT3B0aW9uczo6U1RSSU5HOiB7CisgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyogZGVmYXVsdF9wdHIgPQorICAgICAgICAgICAgICAgICAgJkRlZmF1bHRSYXc8QXJlbmFTdHJpbmdQdHI+KGZpZWxkKS5HZXQoTlVMTCk7CisgICAgICAgICAgICAgIE11dGFibGVGaWVsZDxBcmVuYVN0cmluZ1B0cj4obWVzc2FnZSwgZmllbGQpLT4KKyAgICAgICAgICAgICAgICAgIERlc3Ryb3koZGVmYXVsdF9wdHIsIEdldEFyZW5hKG1lc3NhZ2UpKTsKKyAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgfQorICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgICAgICBkZWxldGUgKk11dGFibGVSYXc8TWVzc2FnZSo+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICBicmVhazsKKyAgICAgIH0KKyAgICB9CisKKyAgICAqTXV0YWJsZU9uZW9mQ2FzZShtZXNzYWdlLCBvbmVvZl9kZXNjcmlwdG9yKSA9IDA7CisgIH0KK30KKwogLy8gVGVtcGxhdGUgaW1wbGVtZW50YXRpb25zIG9mIGJhc2ljIGFjY2Vzc29ycy4gIElubGluZSBiZWNhdXNlIGVhY2gKIC8vIHRlbXBsYXRlIGluc3RhbmNlIGlzIG9ubHkgY2FsbGVkIGZyb20gb25lIGxvY2F0aW9uLiAgVGhlc2UgYXJlCiAvLyB1c2VkIGZvciBhbGwgdHlwZXMgZXhjZXB0IG1lc3NhZ2VzLgpAQCAtMTE1OSwxNCArMjE3MCwxOSBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CiBpbmxpbmUgdm9pZCBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6U2V0RmllbGQoCiAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgY29uc3QgVHlwZSYgdmFsdWUpIGNvbnN0IHsKKyAgaWYgKGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgJiYgIUhhc09uZW9mRmllbGQoKm1lc3NhZ2UsIGZpZWxkKSkgeworICAgIENsZWFyT25lb2YobWVzc2FnZSwgZmllbGQtPmNvbnRhaW5pbmdfb25lb2YoKSk7CisgIH0KICAgKk11dGFibGVSYXc8VHlwZT4obWVzc2FnZSwgZmllbGQpID0gdmFsdWU7Ci0gIFNldEJpdChtZXNzYWdlLCBmaWVsZCk7CisgIGZpZWxkLT5jb250YWluaW5nX29uZW9mKCkgPworICAgICAgU2V0T25lb2ZDYXNlKG1lc3NhZ2UsIGZpZWxkKSA6IFNldEJpdChtZXNzYWdlLCBmaWVsZCk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlPgogaW5saW5lIFR5cGUqIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uOjpNdXRhYmxlRmllbGQoCiAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgewotICBTZXRCaXQobWVzc2FnZSwgZmllbGQpOworICBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID8KKyAgICAgIFNldE9uZW9mQ2FzZShtZXNzYWdlLCBmaWVsZCkgOiBTZXRCaXQobWVzc2FnZSwgZmllbGQpOwogICByZXR1cm4gTXV0YWJsZVJhdzxUeXBlPihtZXNzYWdlLCBmaWVsZCk7CiB9CiAKQEAgLTEyMTEsNiArMjIyNyw5MiBAQAogICByZXR1cm4gcmVwZWF0ZWQtPkFkZCgpOwogfQogCitNZXNzYWdlRmFjdG9yeSogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OkdldE1lc3NhZ2VGYWN0b3J5KCkgY29uc3QgeworICByZXR1cm4gbWVzc2FnZV9mYWN0b3J5XzsKK30KKwordm9pZCogR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246OlJlcGVhdGVkRmllbGREYXRhKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcF90eXBlLAorICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgY29uc3QgeworICBHT09HTEVfQ0hFQ0soZmllbGQtPmlzX3JlcGVhdGVkKCkpOworICBHT09HTEVfQ0hFQ0soZmllbGQtPmNwcF90eXBlKCkgPT0gY3BwX3R5cGUgfHwKKyAgICAgICAgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNICYmCisgICAgICAgICBjcHBfdHlwZSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzIpKQorICAgICAgPDwgIlRoZSB0eXBlIHBhcmFtZXRlciBUIGluIFJlcGVhdGVkRmllbGRSZWY8VD4gQVBJIGRvZXNuJ3QgbWF0Y2ggIgorICAgICAgPDwgInRoZSBhY3R1YWwgZmllbGQgdHlwZSAoZm9yIGVudW1zIFQgc2hvdWxkIGJlIHRoZSBnZW5lcmF0ZWQgZW51bSAiCisgICAgICA8PCAidHlwZSBvciBpbnQzMikuIjsKKyAgaWYgKG1lc3NhZ2VfdHlwZSAhPSBOVUxMKSB7CisgICAgR09PR0xFX0NIRUNLX0VRKG1lc3NhZ2VfdHlwZSwgZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgfQorICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgcmV0dXJuIE11dGFibGVFeHRlbnNpb25TZXQobWVzc2FnZSktPk11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAorICAgICAgICBmaWVsZC0+bnVtYmVyKCksIGZpZWxkLT50eXBlKCksIGZpZWxkLT5pc19wYWNrZWQoKSwgZmllbGQpOworICB9IGVsc2UgeworICAgIHJldHVybiByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4obWVzc2FnZSkgKyBvZmZzZXRzX1tmaWVsZC0+aW5kZXgoKV07CisgIH0KK30KKworTWFwRmllbGRCYXNlKiBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjo6TWFwRGF0YSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIFVTQUdFX0NIRUNLKElzTWFwRmllbGRJbkFwaShmaWVsZCksCisgICAgICAgICAgICAgICJHZXRNYXBEYXRhIiwKKyAgICAgICAgICAgICAgIkZpZWxkIGlzIG5vdCBhIG1hcCBmaWVsZC4iKTsKKyAgcmV0dXJuIE11dGFibGVSYXc8TWFwRmllbGRCYXNlPihtZXNzYWdlLCBmaWVsZCk7Cit9CisKK0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9pbnN0YW5jZSwKKyAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAorICAgIGludCBoYXNfYml0c19vZmZzZXQsCisgICAgaW50IHVua25vd25fZmllbGRzX29mZnNldCwKKyAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQsCisgICAgY29uc3Qgdm9pZCogZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSwKKyAgICBpbnQgb25lb2ZfY2FzZV9vZmZzZXQsCisgICAgaW50IG9iamVjdF9zaXplLAorICAgIGludCBhcmVuYV9vZmZzZXQsCisgICAgaW50IGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0KSB7CisgIHJldHVybiBuZXcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2JpdHNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X29uZW9mX2luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9uZW9mX2Nhc2Vfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9iamVjdF9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZW5hX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCk7Cit9CisKK0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKgorR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb246Ok5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgY29uc3QgTWVzc2FnZSogZGVmYXVsdF9pbnN0YW5jZSwKKyAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAorICAgIGludCBoYXNfYml0c19vZmZzZXQsCisgICAgaW50IHVua25vd25fZmllbGRzX29mZnNldCwKKyAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQsCisgICAgaW50IG9iamVjdF9zaXplLAorICAgIGludCBhcmVuYV9vZmZzZXQsCisgICAgaW50IGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0KSB7CisgIHJldHVybiBuZXcgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oZGVzY3JpcHRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0X2luc3RhbmNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGFzX2JpdHNfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVua25vd25fZmllbGRzX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBleHRlbnNpb25zX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBEZXNjcmlwdG9yUG9vbDo6Z2VuZXJhdGVkX3Bvb2woKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvYmplY3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhcmVuYV9vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXQpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbi5oCmluZGV4IGI1NDVmYTEuLjE1ZmM4MDIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQwLDIxICs0MCwzMiBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisvLyBUT0RPKGphc29uaCk6IFJlbW92ZSB0aGlzIG9uY2UgdGhlIGNvbXBpbGVyIGNoYW5nZSB0byBkaXJlY3RseSBpbmNsdWRlIHRoaXMKKy8vIGlzIHJlbGVhc2VkIHRvIGNvbXBvbmVudHMuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9lbnVtX3JlZmxlY3Rpb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgogCiAKIG5hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHVwYiB7CituYW1lc3BhY2UgZ29vZ2xlX29wZW5zb3VyY2UgeworY2xhc3MgR01SX0hhbmRsZXJzOworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZV9vcGVuc291cmNlCit9ICAvLyBuYW1lc3BhY2UgdXBiCisKIG5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0gIGNsYXNzIERlc2NyaXB0b3JQb29sOwotICAvLyBHZW5lcmF0ZWQgY29kZSBuZWVkcyB0aGVzZSB0byBoYXZlIGJlZW4gZm9yd2FyZC1kZWNsYXJlZC4gIEVhc2llciB0byBkbyBpdAotICAvLyBoZXJlIHRoYW4gdG8gcHJpbnQgdGhlbSBpbnNpZGUgZXZlcnkgLnBiLmggZmlsZS4KLSAgY2xhc3MgRmlsZURlc2NyaXB0b3I7Ci0gIGNsYXNzIEVudW1EZXNjcmlwdG9yOworY2xhc3MgRGVzY3JpcHRvclBvb2w7CitjbGFzcyBNYXBLZXk7CitjbGFzcyBNYXBWYWx1ZVJlZjsKIH0KIAogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBEZWZhdWx0RW1wdHlPbmVvZjsKIAogLy8gRGVmaW5lZCBpbiB0aGlzIGZpbGUuCiBjbGFzcyBHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvbjsKQEAgLTEyNyw5ICsxMzgsNzcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGV4dGVuc2lvbnNfb2Zmc2V0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvYmplY3Rfc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvYmplY3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZW5hX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0ID0gLTEpOworCisgIC8vIFNpbWlsYXIgd2l0aCB0aGUgY29uc3RydWN0aW9uIGFib3ZlLiBDYWxsIHRoaXMgY29uc3RydWN0aW9uIGlmIHRoZQorICAvLyBtZXNzYWdlIGhhcyBvbmVvZiBkZWZpbml0aW9uLgorICAvLyBQYXJhbWV0ZXJzOgorICAvLyAgIG9mZnNldHM6ICAgICAgIEFuIGFycmF5IG9mIGludHMgZ2l2aW5nIHRoZSBieXRlIG9mZnNldHMuCisgIC8vICAgICAgICAgICAgICAgICAgRm9yIGVhY2ggb25lb2YgZmllbGQsIHRoZSBvZmZzZXQgaXMgcmVsYXRpdmUgdG8gdGhlCisgIC8vICAgICAgICAgICAgICAgICAgZGVmYXVsdF9vbmVvZl9pbnN0YW5jZS4gVGhlc2UgY2FuIGJlIGNvbXB1dGVkIGF0IGNvbXBpbGUKKyAgLy8gICAgICAgICAgICAgICAgICB0aW1lIHVzaW5nIHRoZQorICAvLyAgICAgICAgICAgICAgICAgIFBST1RPMl9HRU5FUkFURURfREVGQVVMVF9PTkVPRl9GSUVMRF9PRkZTRVQoKSBtYWNyby4KKyAgLy8gICAgICAgICAgICAgICAgICBGb3IgZWFjaCBub25lIG9uZW9mIGZpZWxkLCB0aGUgb2Zmc2V0IGlzIHJlbGF0ZWQgdG8KKyAgLy8gICAgICAgICAgICAgICAgICB0aGUgc3RhcnQgb2YgdGhlIG1lc3NhZ2Ugb2JqZWN0LiAgVGhlc2UgY2FuIGJlIGNvbXB1dGVkCisgIC8vICAgICAgICAgICAgICAgICAgYXQgY29tcGlsZSB0aW1lIHVzaW5nIHRoZQorICAvLyAgICAgICAgICAgICAgICAgIEdPT0dMRV9QUk9UT0JVRl9HRU5FUkFURURfTUVTU0FHRV9GSUVMRF9PRkZTRVQoKSBtYWNyby4KKyAgLy8gICAgICAgICAgICAgICAgICBCZXNpZGVzIG9mZnNldHMgZm9yIGFsbCBmaWVsZHMsIHRoaXMgYXJyYXkgYWxzbyBjb250YWlucworICAvLyAgICAgICAgICAgICAgICAgIG9mZnNldHMgZm9yIG9uZW9mIHVuaW9ucy4gVGhlIG9mZnNldCBvZiB0aGUgaS10aCBvbmVvZgorICAvLyAgICAgICAgICAgICAgICAgIHVuaW9uIGlzIG9mZnNldHNbZGVzY3JpcHRvci0+ZmllbGRfY291bnQoKSArIGldLgorICAvLyAgIGRlZmF1bHRfb25lb2ZfaW5zdGFuY2U6IFRoZSBkZWZhdWx0IGluc3RhbmNlIG9mIHRoZSBvbmVvZnMuIEl0IGlzIGEKKyAgLy8gICAgICAgICAgICAgICAgICBzdHJ1Y3QgaG9sZGluZyB0aGUgZGVmYXVsdCB2YWx1ZSBvZiBhbGwgb25lb2YgZmllbGRzCisgIC8vICAgICAgICAgICAgICAgICAgZm9yIHRoaXMgbWVzc2FnZS4gSXQgaXMgb25seSB1c2VkIHRvIG9idGFpbiBwb2ludGVycworICAvLyAgICAgICAgICAgICAgICAgIHRvIGRlZmF1bHQgaW5zdGFuY2VzIG9mIG9uZW9mIGZpZWxkcywgd2hpY2ggR2V0CisgIC8vICAgICAgICAgICAgICAgICAgbWV0aG9kcyB3aWxsIHJldHVybiBpZiB0aGUgZmllbGQgaXMgbm90IHNldC4KKyAgLy8gICBvbmVvZl9jYXNlX29mZnNldDogIE9mZnNldCBpbiB0aGUgbWVzc2FnZSBvZiBhbiBhcnJheSBvZiB1aW50MzJzIG9mCisgIC8vICAgICAgICAgICAgICAgICAgc2l6ZSBkZXNjcmlwdG9yLT5vbmVvZl9kZWNsX2NvdW50KCkuICBFYWNoIHVpbnQzMgorICAvLyAgICAgICAgICAgICAgICAgIGluZGljYXRlcyB3aGF0IGZpZWxkIGlzIHNldCBmb3IgZWFjaCBvbmVvZi4KKyAgLy8gICBvdGhlciBwYXJhbWV0ZXJzIGFyZSB0aGUgc2FtZSB3aXRoIHRoZSBjb25zdHJ1Y3Rpb24gYWJvdmUuCisgIEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCBvZmZzZXRzW10sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBoYXNfYml0c19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBleHRlbnNpb25zX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCogZGVmYXVsdF9vbmVvZl9pbnN0YW5jZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IG9uZW9mX2Nhc2Vfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvYmplY3Rfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZW5hX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0ID0gLTEpOwogICB+R2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24oKTsKIAorICAvLyBTaG9ydGVyLXRvLWNhbGwgaGVscGVycyBmb3IgdGhlIGFib3ZlIHR3byBjb25zdHJ1Y3Rpb25zIHRoYXQgd29yayBpZiB0aGUKKyAgLy8gcG9vbCBhbmQgZmFjdG9yeSBhcmUgdGhlIHVzdWFsLCBuYW1lbHksIERlc2NyaXB0b3JQb29sOjpnZW5lcmF0ZWRfcG9vbCgpCisgIC8vIGFuZCBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS4KKworICBzdGF0aWMgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qIE5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UsCisgICAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAorICAgICAgaW50IGhhc19iaXRzX29mZnNldCwKKyAgICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQsCisgICAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQsCisgICAgICBjb25zdCB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlLAorICAgICAgaW50IG9uZW9mX2Nhc2Vfb2Zmc2V0LAorICAgICAgaW50IG9iamVjdF9zaXplLAorICAgICAgaW50IGFyZW5hX29mZnNldCwKKyAgICAgIGludCBpc19kZWZhdWx0X2luc3RhbmNlX29mZnNldCA9IC0xKTsKKworICBzdGF0aWMgR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb24qIE5ld0dlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKAorICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKKyAgICAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2UsCisgICAgICBjb25zdCBpbnQgb2Zmc2V0c1tdLAorICAgICAgaW50IGhhc19iaXRzX29mZnNldCwKKyAgICAgIGludCB1bmtub3duX2ZpZWxkc19vZmZzZXQsCisgICAgICBpbnQgZXh0ZW5zaW9uc19vZmZzZXQsCisgICAgICBpbnQgb2JqZWN0X3NpemUsCisgICAgICBpbnQgYXJlbmFfb2Zmc2V0LAorICAgICAgaW50IGlzX2RlZmF1bHRfaW5zdGFuY2Vfb2Zmc2V0ID0gLTEpOworCiAgIC8vIGltcGxlbWVudHMgUmVmbGVjdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBHZXRVbmtub3duRmllbGRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OwpAQCAtMTQwLDEwICsyMTksMTYgQEAKICAgYm9vbCBIYXNGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKICAgaW50IEZpZWxkU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKICAgdm9pZCBDbGVhckZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBib29sIEhhc09uZW9mKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKKyAgdm9pZCBDbGVhck9uZW9mKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwogICB2b2lkIFJlbW92ZUxhc3QoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIE1lc3NhZ2UqIFJlbGVhc2VMYXN0KE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwogICB2b2lkIFN3YXAoTWVzc2FnZSogbWVzc2FnZTEsIE1lc3NhZ2UqIG1lc3NhZ2UyKSBjb25zdDsKKyAgdm9pZCBTd2FwRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UxLCBNZXNzYWdlKiBtZXNzYWdlMiwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKSBjb25zdDsKICAgdm9pZCBTd2FwRWxlbWVudHMoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgIGludCBpbmRleDEsIGludCBpbmRleDIpIGNvbnN0OworICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSBjb25zdDsKICAgdm9pZCBMaXN0RmllbGRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3Q7CiAKQEAgLTE2OCwxMCArMjUzLDM2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogc2NyYXRjaCkgY29uc3Q7CiAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdldEVudW0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgaW50IEdldEVudW1WYWx1ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwogICBjb25zdCBNZXNzYWdlJiBHZXRNZXNzYWdlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OwogCisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogR2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKKworIHByaXZhdGU6CisgIGJvb2wgQ29udGFpbnNNYXBLZXkoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYga2V5KSBjb25zdDsKKyAgYm9vbCBJbnNlcnRPckxvb2t1cE1hcFZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiBrZXksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNYXBWYWx1ZVJlZiogdmFsKSBjb25zdDsKKyAgYm9vbCBEZWxldGVNYXBWYWx1ZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiBrZXkpIGNvbnN0OworICBNYXBJdGVyYXRvciBNYXBCZWdpbigKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgTWFwSXRlcmF0b3IgTWFwRW5kKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBpbnQgTWFwU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworIHB1YmxpYzoKICAgdm9pZCBTZXRJbnQzMiAoTWVzc2FnZSogbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50MzIgIHZhbHVlKSBjb25zdDsKICAgdm9pZCBTZXRJbnQ2NCAoTWVzc2FnZSogbWVzc2FnZSwKQEAgLTE5MSw4ICszMDIsMTUgQEAKICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3Q7CiAgIHZvaWQgU2V0RW51bSAgKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCiAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBTZXRFbnVtVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKICAgTWVzc2FnZSogTXV0YWJsZU1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdDsKKyAgdm9pZCBTZXRBbGxvY2F0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBzdWJfbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICBNZXNzYWdlKiBSZWxlYXNlTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OwogCiAgIGludDMyICBHZXRSZXBlYXRlZEludDMyIChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdDsKQEAgLTIxNiw2ICszMzQsOSBAQAogICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBHZXRSZXBlYXRlZEVudW0oY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworICBpbnQgR2V0UmVwZWF0ZWRFbnVtVmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OwogICBjb25zdCBNZXNzYWdlJiBHZXRSZXBlYXRlZE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OwpAQCAtMjQwLDYgKzM2MSw4IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSkgY29uc3Q7CiAgIHZvaWQgU2V0UmVwZWF0ZWRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogdmFsdWUpIGNvbnN0OworICB2b2lkIFNldFJlcGVhdGVkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgdmFsdWUpIGNvbnN0OwogICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gYSBmaWVsZCB3aXRoIGEgbWVzc2FnZSB0eXBlLgogICBNZXNzYWdlKiBNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKQEAgLTI2NCwyNCArMzg3LDcyIEBACiAgIHZvaWQgQWRkRW51bShNZXNzYWdlKiBtZXNzYWdlLAogICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdDsKKyAgdm9pZCBBZGRFbnVtVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgaW50IHZhbHVlKSBjb25zdDsKICAgTWVzc2FnZSogQWRkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5ID0gTlVMTCkgY29uc3Q7CisgIHZvaWQgQWRkQWxsb2NhdGVkTWVzc2FnZSgKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICBNZXNzYWdlKiBuZXdfZW50cnkpIGNvbnN0OwogCiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOYW1lKGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3Q7CiAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoaW50IG51bWJlcikgY29uc3Q7CiAKKyAgYm9vbCBTdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCkgY29uc3Q7CisKKyAgLy8gVGhpcyB2YWx1ZSBmb3IgYXJlbmFfb2Zmc2V0XyBpbmRpY2F0ZXMgdGhhdCB0aGVyZSBpcyBubyBhcmVuYSBwb2ludGVyIGluCisgIC8vIHRoaXMgbWVzc2FnZSAoZS5nLiwgb2xkIGdlbmVyYXRlZCBjb2RlKS4KKyAgc3RhdGljIGNvbnN0IGludCBrTm9BcmVuYVBvaW50ZXIgPSAtMTsKKworICAvLyBUaGlzIHZhbHVlIGZvciB1bmtub3duX2ZpZWxkX29mZnNldF8gaW5kaWNhdGVzIHRoYXQgdGhlcmUgaXMgbm8KKyAgLy8gVW5rbm93bkZpZWxkU2V0IGluIHRoaXMgbWVzc2FnZSwgYW5kIHRoYXQgaW5zdGVhZCwgd2UgYXJlIHVzaW5nIHRoZQorICAvLyBaZXJvLU92ZXJoZWFkIEFyZW5hIFBvaW50ZXIgdHJpY2suIFdoZW4gdGhpcyBpcyB0aGUgY2FzZSwgYXJlbmFfb2Zmc2V0XworICAvLyBhY3R1YWxseSBpbmRleGVzIHRvIGFuIEludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEgaW5zdGFuY2UsIHdoaWNoIGNhbiByZXR1cm4KKyAgLy8gZWl0aGVyIGFuIGFyZW5hIHBvaW50ZXIgb3IgYW4gVW5rbm93bkZpZWxkU2V0IG9yIGJvdGguIEl0IGlzIG5ldmVyIHRoZSBjYXNlCisgIC8vIHRoYXQgdW5rbm93bl9maWVsZF9vZmZzZXRfID09IGtVbmtub3duRmllbGRTZXRJbk1ldGFkYXRhICYmIGFyZW5hX29mZnNldF8KKyAgLy8gPT0ga05vQXJlbmFQb2ludGVyLgorICBzdGF0aWMgY29uc3QgaW50IGtVbmtub3duRmllbGRTZXRJbk1ldGFkYXRhID0gLTE7CisKKyBwcm90ZWN0ZWQ6CisgIHZvaWQqIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlLAorICAgICAgaW50IGN0eXBlLCBjb25zdCBEZXNjcmlwdG9yKiBkZXNjKSBjb25zdDsKKworICBjb25zdCB2b2lkKiBHZXRSYXdSZXBlYXRlZEZpZWxkKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSwgaW50IGN0eXBlLAorICAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzYykgY29uc3Q7CisKKyAgdmlydHVhbCBNZXNzYWdlRmFjdG9yeSogR2V0TWVzc2FnZUZhY3RvcnkoKSBjb25zdDsKKworICB2aXJ0dWFsIHZvaWQqIFJlcGVhdGVkRmllbGREYXRhKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSwKKyAgICAgIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgY29uc3Q7CisKICBwcml2YXRlOgogICBmcmllbmQgY2xhc3MgR2VuZXJhdGVkTWVzc2FnZTsKIAorICAvLyBUbyBwYXJzZSBkaXJlY3RseSBpbnRvIGEgcHJvdG8yIGdlbmVyYXRlZCBjbGFzcywgdGhlIGNsYXNzIEdNUl9IYW5kbGVycworICAvLyBuZWVkcyBhY2Nlc3MgdG8gbWVtYmVyIG9mZnNldHMgYW5kIGhhc2JpdHMuCisgIGZyaWVuZCBjbGFzcyB1cGI6Omdvb2dsZV9vcGVuc291cmNlOjpHTVJfSGFuZGxlcnM7CisKICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcl87CiAgIGNvbnN0IE1lc3NhZ2UqIGRlZmF1bHRfaW5zdGFuY2VfOworICBjb25zdCB2b2lkKiBkZWZhdWx0X29uZW9mX2luc3RhbmNlXzsKICAgY29uc3QgaW50KiBvZmZzZXRzXzsKIAogICBpbnQgaGFzX2JpdHNfb2Zmc2V0XzsKKyAgaW50IG9uZW9mX2Nhc2Vfb2Zmc2V0XzsKICAgaW50IHVua25vd25fZmllbGRzX29mZnNldF87CiAgIGludCBleHRlbnNpb25zX29mZnNldF87CisgIGludCBhcmVuYV9vZmZzZXRfOworICBpbnQgaXNfZGVmYXVsdF9pbnN0YW5jZV9vZmZzZXRfOwogICBpbnQgb2JqZWN0X3NpemVfOwogCisgIHN0YXRpYyBjb25zdCBpbnQga0hhc05vRGVmYXVsdEluc3RhbmNlRmllbGQgPSAtMTsKKwogICBjb25zdCBEZXNjcmlwdG9yUG9vbCogZGVzY3JpcHRvcl9wb29sXzsKICAgTWVzc2FnZUZhY3RvcnkqIG1lc3NhZ2VfZmFjdG9yeV87CiAKQEAgLTI5MywxMiArNDY0LDI2IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OwogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KICAgaW5saW5lIGNvbnN0IFR5cGUmIERlZmF1bHRSYXcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7Ci0gIGlubGluZSBjb25zdCBNZXNzYWdlKiBHZXRNZXNzYWdlUHJvdG90eXBlKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZT4KKyAgaW5saW5lIGNvbnN0IFR5cGUmIERlZmF1bHRPbmVvZlJhdyhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKIAogICBpbmxpbmUgY29uc3QgdWludDMyKiBHZXRIYXNCaXRzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OwogICBpbmxpbmUgdWludDMyKiBNdXRhYmxlSGFzQml0cyhNZXNzYWdlKiBtZXNzYWdlKSBjb25zdDsKKyAgaW5saW5lIHVpbnQzMiBHZXRPbmVvZkNhc2UoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKKyAgaW5saW5lIHVpbnQzMiogTXV0YWJsZU9uZW9mQ2FzZSgKKyAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIG9uZW9mX2Rlc2NyaXB0b3IpIGNvbnN0OwogICBpbmxpbmUgY29uc3QgRXh0ZW5zaW9uU2V0JiBHZXRFeHRlbnNpb25TZXQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CiAgIGlubGluZSBFeHRlbnNpb25TZXQqIE11dGFibGVFeHRlbnNpb25TZXQoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7CisgIGlubGluZSBBcmVuYSogR2V0QXJlbmEoTWVzc2FnZSogbWVzc2FnZSkgY29uc3Q7CisgIGlubGluZSBjb25zdCBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSYKKyAgICAgIEdldEludGVybmFsTWV0YWRhdGFXaXRoQXJlbmEoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3Q7CisgIGlubGluZSBpbnRlcm5hbDo6SW50ZXJuYWxNZXRhZGF0YVdpdGhBcmVuYSoKKyAgICAgIE11dGFibGVJbnRlcm5hbE1ldGFkYXRhV2l0aEFyZW5hKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0OworCisgIGlubGluZSBib29sIEdldElzRGVmYXVsdEluc3RhbmNlKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIGNvbnN0OwogCiAgIGlubGluZSBib29sIEhhc0JpdChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CkBAIC0zMDYsNiArNDkxLDI2IEBACiAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKICAgaW5saW5lIHZvaWQgQ2xlYXJCaXQoTWVzc2FnZSogbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFN3YXBCaXQoTWVzc2FnZSogbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gVGhpcyBmdW5jdGlvbiBvbmx5IHN3YXBzIHRoZSBmaWVsZC4gU2hvdWxkIHN3YXAgY29ycmVzcG9uZGluZyBoYXNfYml0CisgIC8vIGJlZm9yZSBvciBhZnRlciB1c2luZyB0aGlzIGZ1bmN0aW9uLgorICB2b2lkIFN3YXBGaWVsZChNZXNzYWdlKiBtZXNzYWdlMSwKKyAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIHZvaWQgU3dhcE9uZW9mRmllbGQoTWVzc2FnZSogbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZTIsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiBvbmVvZl9kZXNjcmlwdG9yKSBjb25zdDsKKworICBpbmxpbmUgYm9vbCBIYXNPbmVvZkZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIFNldE9uZW9mQ2FzZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisgIGlubGluZSB2b2lkIENsZWFyT25lb2ZGaWVsZChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CiAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGU+CiAgIGlubGluZSBjb25zdCBUeXBlJiBHZXRGaWVsZChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLApAQCAtMzQxLDYgKzU0NiwzMSBAQAogCiAgIGludCBHZXRFeHRlbnNpb25OdW1iZXJPckRpZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSBjb25zdDsKIAorICAvLyBJbnRlcm5hbCB2ZXJzaW9ucyBvZiBFbnVtVmFsdWUgQVBJIHBlcmZvcm0gbm8gY2hlY2tpbmcuIENhbGxlZCBhZnRlciBjaGVja3MKKyAgLy8gYnkgcHVibGljIG1ldGhvZHMuCisgIHZvaWQgU2V0RW51bVZhbHVlSW50ZXJuYWwoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgU2V0UmVwZWF0ZWRFbnVtVmFsdWVJbnRlcm5hbChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CisgIHZvaWQgQWRkRW51bVZhbHVlSW50ZXJuYWwoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CisKKworICBNZXNzYWdlKiBVbnNhZmVBcmVuYVJlbGVhc2VNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0OworCisgIHZvaWQgVW5zYWZlQXJlbmFTZXRBbGxvY2F0ZWRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIHN1Yl9tZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICBpbnRlcm5hbDo6TWFwRmllbGRCYXNlKiBNYXBEYXRhKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uKTsKIH07CiAKQEAgLTM1MiwxNiArNTgyLDMxIEBACiAvLyB3aGljaCB0aGUgb2Zmc2V0cyBvZiB0aGUgZGlyZWN0IGZpZWxkcyBvZiBhIGNsYXNzIGFyZSBub24tY29uc3RhbnQuCiAvLyBGaWVsZHMgaW5oZXJpdGVkIGZyb20gc3VwZXJjbGFzc2VzICpjYW4qIGhhdmUgbm9uLWNvbnN0YW50IG9mZnNldHMsCiAvLyBidXQgdGhhdCdzIG5vdCB3aGF0IHRoaXMgbWFjcm8gd2lsbCBiZSB1c2VkIGZvci4KLS8vCisjaWYgZGVmaW5lZChfX2NsYW5nX18pCisvLyBGb3IgQ2xhbmcgd2UgdXNlIF9fYnVpbHRpbl9vZmZzZXRvZigpIGFuZCBzdXBwcmVzcyB0aGUgd2FybmluZywKKy8vIHRvIGF2b2lkIENvbnRyb2wgRmxvdyBJbnRlZ3JpdHkgYW5kIFVCU2FuIHZwdHIgc2FuaXRpemVycyBmcm9tCisvLyBjcmFzaGluZyB3aGlsZSB0cnlpbmcgdG8gdmFsaWRhdGUgdGhlIGludmFsaWQgcmVpbnRlcnBldF9jYXN0cy4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX0ZJRUxEX09GRlNFVChUWVBFLCBGSUVMRCkgICAgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHB1c2giKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIF9QcmFnbWEoImNsYW5nIGRpYWdub3N0aWMgaWdub3JlZCBcIi1XaW52YWxpZC1vZmZzZXRvZlwiIikgIFwKKyAgX19idWlsdGluX29mZnNldG9mKFRZUEUsIEZJRUxEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICBfUHJhZ21hKCJjbGFuZyBkaWFnbm9zdGljIHBvcCIpCisjZWxzZQogLy8gTm90ZSB0aGF0IHdlIGNhbGN1bGF0ZSByZWxhdGl2ZSB0byB0aGUgcG9pbnRlciB2YWx1ZSAxNiBoZXJlIHNpbmNlIGlmIHdlCiAvLyBqdXN0IHVzZSB6ZXJvLCBHQ0MgY29tcGxhaW5zIGFib3V0IGRlcmVmZXJlbmNpbmcgYSBOVUxMIHBvaW50ZXIuICBXZQogLy8gY2hvb3NlIDE2IHJhdGhlciB0aGFuIHNvbWUgb3RoZXIgbnVtYmVyIGp1c3QgaW4gY2FzZSB0aGUgY29tcGlsZXIgd291bGQKIC8vIGJlIGNvbmZ1c2VkIGJ5IGFuIHVuYWxpZ25lZCBwb2ludGVyLgogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfRklFTERfT0ZGU0VUKFRZUEUsIEZJRUxEKSAgICBcCiAgIHN0YXRpY19jYXN0PGludD4oICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPiggICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgJnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KDE2KS0+RklFTEQpIC0gICAgICAgICAgICBcCi0gICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oMTYpKQorICAgICAgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgJnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgVFlQRSo+KDE2KS0+RklFTEQpIC0gICAgICAgIFwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KDE2KSkKKyNlbmRpZgorCisjZGVmaW5lIFBST1RPMl9HRU5FUkFURURfREVGQVVMVF9PTkVPRl9GSUVMRF9PRkZTRVQoT05FT0YsIEZJRUxEKSAgICAgXAorICBzdGF0aWNfY2FzdDxpbnQ+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCYoT05FT0YtPkZJRUxEKSkgICAgICAgICAgICAgICAgICBcCisgICAgICAtIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KE9ORU9GKSkKIAogLy8gVGhlcmUgYXJlIHNvbWUgcGxhY2VzIGluIHByb3RvMiB3aGVyZSBkeW5hbWljX2Nhc3Qgd291bGQgYmUgdXNlZnVsIGFzIGFuCiAvLyBvcHRpbWl6YXRpb24uICBGb3IgZXhhbXBsZSwgdGFrZSBNZXNzYWdlOjpNZXJnZUZyb20oY29uc3QgTWVzc2FnZSYgb3RoZXIpLgpAQCAtMzk1LDI3ICs2NDAsNDEgQEAKICNlbmRpZgogfQogCi0vLyBIZWxwZXIgZm9yIEVudW1UeXBlX1BhcnNlIGZ1bmN0aW9uczogdHJ5IHRvIHBhcnNlIHRoZSBzdHJpbmcgJ25hbWUnIGFzIGFuCi0vLyBlbnVtIG5hbWUgb2YgdGhlIGdpdmVuIHR5cGUsIHJldHVybmluZyB0cnVlIGFuZCBmaWxsaW5nIGluIHZhbHVlIG9uIHN1Y2Nlc3MsCi0vLyBvciByZXR1cm5pbmcgZmFsc2UgYW5kIGxlYXZpbmcgdmFsdWUgdW5jaGFuZ2VkIG9uIGZhaWx1cmUuCi1MSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBQYXJzZU5hbWVkRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLAotICAgICAgICAgICAgICAgICAgICBpbnQqIHZhbHVlKTsKKy8vIFRyaWVzIHRvIGRvd25jYXN0IHRoaXMgbWVzc2FnZSB0byBhIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUuCisvLyBSZXR1cm5zIE5VTEwgaWYgdGhpcyBjbGFzcyBpcyBub3QgYW4gaW5zdGFuY2Ugb2YgVC4KKy8vCisvLyBUaGlzIGlzIGxpa2UgZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZSwgZXhjZXB0IGl0IHdvcmtzIGV2ZW4gd2hlbgorLy8gZHluYW1pY19jYXN0IGlzIG5vdCBhdmFpbGFibGUgYnkgdXNpbmcgUmVmbGVjdGlvbi4gIEhvd2V2ZXIgaXQgb25seSB3b3JrcworLy8gd2l0aCBNZXNzYWdlIG9iamVjdHMuCisvLworLy8gVE9ETyhoYWJlcm1hbik6IGNhbiB3ZSByZW1vdmUgZHluYW1pY19jYXN0X2lmX2F2YWlsYWJsZSBpbiBmYXZvciBvZiB0aGlzPwordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitUKiBEeW5hbWljQ2FzdFRvR2VuZXJhdGVkKGNvbnN0IE1lc3NhZ2UqIGZyb20pIHsKKyAgLy8gQ29tcGlsZS10aW1lIGFzc2VydCB0aGF0IFQgaXMgYSBnZW5lcmF0ZWQgdHlwZSB0aGF0IGhhcyBhCisgIC8vIGRlZmF1bHRfaW5zdGFuY2UoKSBhY2Nlc3NvciwgYnV0IGF2b2lkIGFjdHVhbGx5IGNhbGxpbmcgaXQuCisgIGNvbnN0IFQmKCpnZXRfZGVmYXVsdF9pbnN0YW5jZSkoKSA9ICZUOjpkZWZhdWx0X2luc3RhbmNlOworICAodm9pZClnZXRfZGVmYXVsdF9pbnN0YW5jZTsKIAotdGVtcGxhdGU8dHlwZW5hbWUgRW51bVR5cGU+Ci1ib29sIFBhcnNlTmFtZWRFbnVtKGNvbnN0IEVudW1EZXNjcmlwdG9yKiBkZXNjcmlwdG9yLAotICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIG5hbWUsCi0gICAgICAgICAgICAgICAgICAgIEVudW1UeXBlKiB2YWx1ZSkgewotICBpbnQgdG1wOwotICBpZiAoIVBhcnNlTmFtZWRFbnVtKGRlc2NyaXB0b3IsIG5hbWUsICZ0bXApKSByZXR1cm4gZmFsc2U7Ci0gICp2YWx1ZSA9IHN0YXRpY19jYXN0PEVudW1UeXBlPih0bXApOwotICByZXR1cm4gdHJ1ZTsKKyAgLy8gQ29tcGlsZS10aW1lIGFzc2VydCB0aGF0IFQgaXMgYSBzdWJjbGFzcyBvZiBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlLgorICBjb25zdCBNZXNzYWdlKiB1bnVzZWQgPSBzdGF0aWNfY2FzdDxUKj4oTlVMTCk7CisgICh2b2lkKXVudXNlZDsKKworI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX05PX1JUVEkpIHx8IFwKKyAgKGRlZmluZWQoX01TQ19WRVIpICYmICFkZWZpbmVkKF9DUFBSVFRJKSkKKyAgYm9vbCBvayA9ICZUOjpkZWZhdWx0X2luc3RhbmNlKCkgPT0KKyAgICAgICAgICAgIGZyb20tPkdldFJlZmxlY3Rpb24oKS0+R2V0TWVzc2FnZUZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKAorICAgICAgICAgICAgICAgIGZyb20tPkdldERlc2NyaXB0b3IoKSk7CisgIHJldHVybiBvayA/IGRvd25fY2FzdDxUKj4oZnJvbSkgOiBOVUxMOworI2Vsc2UKKyAgcmV0dXJuIGR5bmFtaWNfY2FzdDxUKj4oZnJvbSk7CisjZW5kaWYKIH0KIAotLy8gSnVzdCBhIHdyYXBwZXIgYXJvdW5kIHByaW50aW5nIHRoZSBuYW1lIG9mIGEgdmFsdWUuIFRoZSBtYWluIHBvaW50IG9mIHRoaXMKLS8vIGZ1bmN0aW9uIGlzIG5vdCB0byBiZSBpbmxpbmVkLCBzbyB0aGF0IHlvdSBjYW4gZG8gdGhpcyB3aXRob3V0IGluY2x1ZGluZwotLy8gZGVzY3JpcHRvci5oLgotTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IHN0cmluZyYgTmFtZU9mRW51bShjb25zdCBFbnVtRGVzY3JpcHRvciogZGVzY3JpcHRvciwgaW50IHZhbHVlKTsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorVCogRHluYW1pY0Nhc3RUb0dlbmVyYXRlZChNZXNzYWdlKiBmcm9tKSB7CisgIGNvbnN0IE1lc3NhZ2UqIG1lc3NhZ2VfY29uc3QgPSBmcm9tOworICByZXR1cm4gY29uc3RfY2FzdDxUKj4oRHluYW1pY0Nhc3RUb0dlbmVyYXRlZDxjb25zdCBUPihtZXNzYWdlX2NvbnN0KSk7Cit9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfcmVmbGVjdGlvbl91bml0dGVzdC5jYwppbmRleCBhMDNiY2RiLi44NWViZGVmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQzLDEwICs0MywxNiBAQAogLy8gcmF0aGVyIHRoYW4gZ2VuZXJhdGVkIGFjY2Vzc29ycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmg+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KQEAgLTIwNyw2ICsyMTMsMTExIEBACiAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMi51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwogfQogCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcEZpZWxkcykgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKyAgbWVzc2FnZTEuc2V0X29wdGlvbmFsX2RvdWJsZSgxMi4zKTsKKyAgbWVzc2FnZTEubXV0YWJsZV9yZXBlYXRlZF9pbnQzMigpLT5BZGQoMTApOworICBtZXNzYWdlMS5tdXRhYmxlX3JlcGVhdGVkX2ludDMyKCktPkFkZCgyMCk7CisKKyAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKKyAgbWVzc2FnZTIubXV0YWJsZV9yZXBlYXRlZF9pbnQ2NCgpLT5BZGQoMzApOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlMS5HZXREZXNjcmlwdG9yKCk7CisgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9kb3VibGUiKSk7CisgIGZpZWxkcy5wdXNoX2JhY2soZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9pbnQzMiIpKTsKKyAgZmllbGRzLnB1c2hfYmFjayhkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX3N0cmluZyIpKTsKKyAgZmllbGRzLnB1c2hfYmFjayhkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX3VpbnQ2NCIpKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlMS5oYXNfb3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZTEucmVwZWF0ZWRfaW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZTEuaGFzX29wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UxLm9wdGlvbmFsX3N0cmluZygpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UxLnJlcGVhdGVkX2ludDY0X3NpemUoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlMS5oYXNfb3B0aW9uYWxfdWludDY0KCkpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLmhhc19vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9FUSgxMi4zLCBtZXNzYWdlMi5vcHRpb25hbF9kb3VibGUoKSk7CisgIEVYUEVDVF9FUSgyLCBtZXNzYWdlMi5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICBFWFBFQ1RfRVEoMTAsIG1lc3NhZ2UyLnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDIwLCBtZXNzYWdlMi5yZXBlYXRlZF9pbnQzMigxKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlMi5oYXNfb3B0aW9uYWxfc3RyaW5nKCkpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTIucmVwZWF0ZWRfaW50NjRfc2l6ZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UyLmhhc19vcHRpb25hbF91aW50NjQoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwRmllbGRzQWxsKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTI7CisKKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZTIpOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZTIsICZmaWVsZHMpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZTIpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU3dhcEZpZWxkc0FsbEV4dGVuc2lvbikgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBtZXNzYWdlMjsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZTEpOworCisgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlMS5HZXRSZWZsZWN0aW9uKCk7CisgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZTEsICZmaWVsZHMpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwT25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlMSk7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UxLkdldFJlZmxlY3Rpb24oKTsKKyAgcmVmbGVjdGlvbi0+U3dhcCgmbWVzc2FnZTEsICZtZXNzYWdlMik7CisKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIobWVzc2FnZTEpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UyKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBPbmVvZkJvdGhTZXQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlMSk7CisgIFRlc3RVdGlsOjpTZXRPbmVvZjIoJm1lc3NhZ2UyKTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5Td2FwKCZtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKKworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQyKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShtZXNzYWdlMik7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTd2FwRmllbGRzT25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlMSk7CisKKyAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IGZpZWxkczsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UxLkdldERlc2NyaXB0b3IoKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBkZXNjcmlwdG9yLT5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBmaWVsZHMucHVzaF9iYWNrKGRlc2NyaXB0b3ItPmZpZWxkKGkpKTsKKyAgfQorICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZTEuR2V0UmVmbGVjdGlvbigpOworICByZWZsZWN0aW9uLT5Td2FwRmllbGRzKCZtZXNzYWdlMSwgJm1lc3NhZ2UyLCBmaWVsZHMpOworCisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZkNsZWFyKG1lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShtZXNzYWdlMik7Cit9CisKIFRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZW1vdmVMYXN0KSB7CiAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKICAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCkBAIC0yMjUsMTEgKzMzNiw1OSBAQAogICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpKTsKIAogICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKICAgcmVmbGVjdGlvbl90ZXN0ZXIuUmVtb3ZlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOwogCiAgIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVtb3ZlZChtZXNzYWdlKTsKIH0KIAorVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbGVhc2VMYXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihkZXNjcmlwdG9yKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKworICByZWZsZWN0aW9uX3Rlc3Rlci5SZWxlYXNlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UsIGZhbHNlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkc1JlbGVhc2VkKG1lc3NhZ2UpOworCisgIC8vIE5vdyB0ZXN0IHRoYXQgd2UgYWN0dWFsbHkgcmVsZWFzZSB0aGUgcmlnaHQgbWVzc2FnZS4KKyAgbWVzc2FnZS5DbGVhcigpOworICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CisgIGNvbnN0IHByb3RvYnVmX3VuaXR0ZXN0OjpGb3JlaWduTWVzc2FnZSogZXhwZWN0ZWQgPQorICAgICAgbWVzc2FnZS5tdXRhYmxlX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxNZXNzYWdlPiByZWxlYXNlZChtZXNzYWdlLkdldFJlZmxlY3Rpb24oKS0+UmVsZWFzZUxhc3QoCisgICAgICAmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRVEoZXhwZWN0ZWQsIHJlbGVhc2VkLmdldCgpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbGVhc2VMYXN0RXh0ZW5zaW9ucykgeworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgbWVzc2FnZTsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcihkZXNjcmlwdG9yKTsKKworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuUmVsZWFzZUxhc3RSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlLCB0cnVlKTsKKworICBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkRXh0ZW5zaW9uc1JlbGVhc2VkKG1lc3NhZ2UpOworCisgIC8vIE5vdyB0ZXN0IHRoYXQgd2UgYWN0dWFsbHkgcmVsZWFzZSB0aGUgcmlnaHQgbWVzc2FnZS4KKyAgbWVzc2FnZS5DbGVhcigpOworICBUZXN0VXRpbDo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUoCisgICAgICB1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOworICBjb25zdCBwcm90b2J1Zl91bml0dGVzdDo6Rm9yZWlnbk1lc3NhZ2UqIGV4cGVjdGVkID0gbWVzc2FnZS5NdXRhYmxlRXh0ZW5zaW9uKAorICAgICAgdW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDEpOworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPE1lc3NhZ2U+IHJlbGVhc2VkKG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpLT5SZWxlYXNlTGFzdCgKKyAgICAgICZtZXNzYWdlLCBkZXNjcmlwdG9yLT5maWxlKCktPkZpbmRFeHRlbnNpb25CeU5hbWUoCisgICAgICAgICAgICAgICAgICAgICJyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uIikpKTsKKyAgRVhQRUNUX0VRKGV4cGVjdGVkLCByZWxlYXNlZC5nZXQoKSk7CisKK30KKwogVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFN3YXBSZXBlYXRlZEVsZW1lbnRzKSB7CiAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKICAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCkBAIC0zMjcsNyArNDg2LDMxNiBAQAogICAgICAgICAgICAgICBGaW5kS25vd25FeHRlbnNpb25CeU5hbWUoZXh0ZW5zaW9uMS0+ZnVsbF9uYW1lKCkpID09IE5VTEwpOwogfQogCi0jaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBTZXRBbGxvY2F0ZWRNZXNzYWdlVGVzdCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIGZyb21fbWVzc2FnZTE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgZnJvbV9tZXNzYWdlMjsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyB0b19tZXNzYWdlOworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3RlciByZWZsZWN0aW9uX3Rlc3RlcigKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpkZXNjcmlwdG9yKCkpOworICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UxKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMik7CisKKyAgLy8gQmVmb3JlIG1vdmluZyBmaWVsZHMsIHdlIGV4cGVjdCB0aGUgbmVzdGVkIG1lc3NhZ2VzIHRvIGJlIE5VTEwuCisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJnRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKKworICAvLyBBZnRlciBmaWVsZHMgYXJlIG1vdmVkIHdlIHNob3VsZCBnZXQgbm9uLU5VTEwgcmVsZWFzZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAmZnJvbV9tZXNzYWdlMSwgJnRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Tk9UX05VTEwpOworCisgIC8vIEFub3RoZXIgbW92ZSB0byBtYWtlIHN1cmUgdGhhdCB3ZSBjYW4gU2V0QWxsb2NhdGVkIHNldmVyYWwgdGltZXMuCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAmZnJvbV9tZXNzYWdlMiwgJnRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Tk9UX05VTEwpOworCisgIC8vIEFmdGVyIFNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTnVsbFZpYVJlZmxlY3Rpb24oKSB3ZSBleHBlY3QgdGhlCisgIC8vIHJlbGVhc2VzIHRvIGJlIE5VTEwgYWdhaW4uCisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTnVsbFZpYVJlZmxlY3Rpb24oCisgICAgICAmdG9fbWVzc2FnZSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJnRvX21lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFNldEFsbG9jYXRlZEV4dGVuc2lvbk1lc3NhZ2VUZXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyBmcm9tX21lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMgZnJvbV9tZXNzYWdlMjsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIHRvX21lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuU2V0QWxsRmllbGRzVmlhUmVmbGVjdGlvbigmZnJvbV9tZXNzYWdlMSk7CisgIHJlZmxlY3Rpb25fdGVzdGVyLlNldEFsbEZpZWxkc1ZpYVJlZmxlY3Rpb24oJmZyb21fbWVzc2FnZTIpOworCisgIC8vIEJlZm9yZSBtb3ZpbmcgZmllbGRzLCB3ZSBleHBlY3QgdGhlIG5lc3RlZCBtZXNzYWdlcyB0byBiZSBOVUxMLgorICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7CisKKyAgLy8gQWZ0ZXIgZmllbGRzIGFyZSBtb3ZlZCB3ZSBzaG91bGQgZ2V0IG5vbi1OVUxMIHJlbGVhc2VzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgJmZyb21fbWVzc2FnZTEsICZ0b19tZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBbm90aGVyIG1vdmUgdG8gbWFrZSBzdXJlIHRoYXQgd2UgY2FuIFNldEFsbG9jYXRlZCBzZXZlcmFsIHRpbWVzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgJmZyb21fbWVzc2FnZTIsICZ0b19tZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmdG9fbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBZnRlciBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKCkgd2UgZXhwZWN0IHRoZQorICAvLyByZWxlYXNlcyB0byBiZSBOVUxMIGFnYWluLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKAorICAgICAgJnRvX21lc3NhZ2UpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZ0b19tZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6SVNfTlVMTCk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBBZGRSZXBlYXRlZE1lc3NhZ2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogbmVzdGVkX3JlZmxlY3Rpb24gPQorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldFJlZmxlY3Rpb24oKTsKKworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG5lc3RlZF9iYiA9CisgICAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlOjpkZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgKKyAgICAgICAgICAiYmIiKTsKKworICBNZXNzYWdlKiBuZXN0ZWQgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKAorICAgICAgJm1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIikpOworICBuZXN0ZWRfcmVmbGVjdGlvbi0+U2V0SW50MzIobmVzdGVkLCBuZXN0ZWRfYmIsIDExKTsKKworICBFWFBFQ1RfRVEoMTEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBNdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIG5lc3RlZF9yZWZsZWN0aW9uID0KKyAgICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2U6OmRlZmF1bHRfaW5zdGFuY2UoKS5HZXRSZWZsZWN0aW9uKCk7CisKKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfYmIgPQorICAgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6TmVzdGVkTWVzc2FnZTo6ZGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICAgImJiIik7CisKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKS0+c2V0X2JiKDEyKTsKKworICBNZXNzYWdlKiBuZXN0ZWQgPSByZWZsZWN0aW9uLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKAorICAgICAgJm1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiksIDApOworICBFWFBFQ1RfRVEoMTIsIG5lc3RlZF9yZWZsZWN0aW9uLT5HZXRJbnQzMigqbmVzdGVkLCBuZXN0ZWRfYmIpKTsKKyAgbmVzdGVkX3JlZmxlY3Rpb24tPlNldEludDMyKG5lc3RlZCwgbmVzdGVkX2JiLCAxMyk7CisgIEVYUEVDVF9FUSgxMywgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgwKS5iYigpKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIEFkZEFsbG9jYXRlZE1lc3NhZ2UpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworCisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlKiBuZXN0ZWQgPQorICAgICAgbmV3IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6Ok5lc3RlZE1lc3NhZ2UoKTsKKyAgbmVzdGVkLT5zZXRfYmIoMTEpOworICByZWZsZWN0aW9uLT5BZGRBbGxvY2F0ZWRNZXNzYWdlKCZtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIpLCBuZXN0ZWQpOworICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplKCkpOworICBFWFBFQ1RfRVEoMTEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBMaXN0RmllbGRzT25lT2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZSk7CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKG1lc3NhZ2UsICZmaWVsZHMpOworICBFWFBFQ1RfRVEoNCwgZmllbGRzLnNpemUoKSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBPbmVvZikgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CisgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKworICAvLyBDaGVjayBkZWZhdWx0IHZhbHVlcy4KKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29faW50IikpKTsKKyAgRVhQRUNUX0VRKCIiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19zdHJpbmciKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIiIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX3N0cmluZ19waWVjZSIpKSk7CisgIEVYUEVDVF9FUSgiIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fYnl0ZXMiKSkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPTywgcmVmbGVjdGlvbi0+R2V0RW51bSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2VudW0iKSktPm51bWJlcigpKTsKKyAgRVhQRUNUX0VRKCZ1bml0dGVzdDo6VGVzdE9uZW9mMjo6TmVzdGVkTWVzc2FnZTo6ZGVmYXVsdF9pbnN0YW5jZSgpLAorICAgICAgICAgICAgJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UoCisgICAgICAgICAgICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9FUSgmdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZvb0dyb3VwOjpkZWZhdWx0X2luc3RhbmNlKCksCisgICAgICAgICAgICAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb2dyb3VwIikpKTsKKyAgRVhQRUNUX05FKCZ1bml0dGVzdDo6VGVzdE9uZW9mMjo6Rm9vR3JvdXA6OmRlZmF1bHRfaW5zdGFuY2UoKSwKKyAgICAgICAgICAgICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKSk7CisgIEVYUEVDVF9FUSg1LCByZWZsZWN0aW9uLT5HZXRJbnQzMigKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2ludCIpKSk7CisgIEVYUEVDVF9FUSgiU1RSSU5HIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfc3RyaW5nIikpKTsKKyAgRVhQRUNUX0VRKCJDT1JEIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpKSk7CisgIEVYUEVDVF9FUSgiU1BJRUNFIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfc3RyaW5nX3BpZWNlIikpKTsKKyAgRVhQRUNUX0VRKCJCWVRFUyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2J5dGVzIikpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVIsIHJlZmxlY3Rpb24tPkdldEVudW0oCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9lbnVtIikpLT5udW1iZXIoKSk7CisKKyAgLy8gQ2hlY2sgU2V0IGZ1bmN0aW9ucy4KKyAgcmVmbGVjdGlvbi0+U2V0SW50MzIoCisgICAgICAmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29faW50IiksIDEyMyk7CisgIEVYUEVDVF9FUSgxMjMsIHJlZmxlY3Rpb24tPkdldEludDMyKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29faW50IikpKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKAorICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX3N0cmluZyIpLCAiYWJjIik7CisgIEVYUEVDVF9FUSgiYWJjIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fc3RyaW5nIikpKTsKKyAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKAorICAgICAgJm1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2J5dGVzIiksICJieXRlcyIpOworICBFWFBFQ1RfRVEoImJ5dGVzIiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fYnl0ZXMiKSkpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcoCisgICAgICAmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpLCAiY2hhbmdlX2NvcmQiKTsKKyAgRVhQRUNUX0VRKCJjaGFuZ2VfY29yZCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSkpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcoCisgICAgICAmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfc3RyaW5nX3BpZWNlIiksCisgICAgICAiY2hhbmdlX3NwaWVjZSIpOworICBFWFBFQ1RfRVEoImNoYW5nZV9zcGllY2UiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhcl9zdHJpbmdfcGllY2UiKSkpOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgU2V0QWxsb2NhdGVkT25lb2ZNZXNzYWdlVGVzdCkgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBmcm9tX21lc3NhZ2UxOworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBmcm9tX21lc3NhZ2UyOworICB1bml0dGVzdDo6VGVzdE9uZW9mMiB0b19tZXNzYWdlOworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gdW5pdHRlc3Q6OlRlc3RPbmVvZjI6OmRlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IHRvX21lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIE1lc3NhZ2UqIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICAmdG9fbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCA9PSBOVUxMKTsKKyAgcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICZ0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCA9PSBOVUxMKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UxKTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdE9uZW9mU2V0VmlhUmVmbGVjdGlvbihmcm9tX21lc3NhZ2UxKTsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6CisgICAgICBTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb01lc3NhZ2VWaWFSZWZsZWN0aW9uKAorICAgICAgICAgICZmcm9tX21lc3NhZ2UxLCAmdG9fbWVzc2FnZSk7CisgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgIHRvX21lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKKyAgcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICZ0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IE5VTEwpOworICBFWFBFQ1RfRVEoJnN1Yl9tZXNzYWdlLCByZWxlYXNlZCk7CisgIGRlbGV0ZSByZWxlYXNlZDsKKworICBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKCZmcm9tX21lc3NhZ2UyKTsKKworICByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgICZmcm9tX21lc3NhZ2UyLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19tZXNzYWdlIikpOworCisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjoKKyAgICAgIFNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAgICAgJmZyb21fbWVzc2FnZTIsICZ0b19tZXNzYWdlKTsKKworICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZTIgPSByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgdG9fbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbWVzc2FnZSIpKTsKKyAgcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICZ0b19tZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCAhPSBOVUxMKTsKKyAgRVhQRUNUX0VRKCZzdWJfbWVzc2FnZTIsIHJlbGVhc2VkKTsKKyAgZGVsZXRlIHJlbGVhc2VkOworfQorCitURVNUKEdlbmVyYXRlZE1lc3NhZ2VSZWZsZWN0aW9uVGVzdCwgUmVsZWFzZU1lc3NhZ2VUZXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXIgcmVmbGVjdGlvbl90ZXN0ZXIoCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6ZGVzY3JpcHRvcigpKTsKKworICAvLyBXaGVuIG5vdGhpbmcgaXMgc2V0LCB3ZSBleHBlY3QgYWxsIHJlbGVhc2VkIG1lc3NhZ2VzIHRvIGJlIE5VTEwuCisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKKworICAvLyBBZnRlciBmaWVsZHMgYXJlIHNldCB3ZSBzaG91bGQgZ2V0IG5vbi1OVUxMIHJlbGVhc2VzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBZnRlciBDbGVhcigpIHdlIG1heSBvciBtYXkgbm90IGdldCBhIG1lc3NhZ2UgZnJvbSBSZWxlYXNlTWVzc2FnZSgpLgorICAvLyBUaGlzIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Q0FOX0JFX05VTEwpOworCisgIC8vIFRlc3QgYSBkaWZmZXJlbnQgY29kZSBwYXRoIGZvciBzZXR0aW5nIGFmdGVyIHJlbGVhc2luZy4KKyAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQobWVzc2FnZSk7Cit9CisKK1RFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBSZWxlYXNlRXh0ZW5zaW9uTWVzc2FnZVRlc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyIHJlZmxlY3Rpb25fdGVzdGVyKAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9uczo6ZGVzY3JpcHRvcigpKTsKKworICAvLyBXaGVuIG5vdGhpbmcgaXMgc2V0LCB3ZSBleHBlY3QgYWxsIHJlbGVhc2VkIG1lc3NhZ2VzIHRvIGJlIE5VTEwuCisgIHJlZmxlY3Rpb25fdGVzdGVyLkV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgJm1lc3NhZ2UsIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpJU19OVUxMKTsKKworICAvLyBBZnRlciBmaWVsZHMgYXJlIHNldCB3ZSBzaG91bGQgZ2V0IG5vbi1OVUxMIHJlbGVhc2VzLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgcmVmbGVjdGlvbl90ZXN0ZXIuRXhwZWN0TWVzc2FnZXNSZWxlYXNlZFZpYVJlZmxlY3Rpb24oCisgICAgICAmbWVzc2FnZSwgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6Ok5PVF9OVUxMKTsKKworICAvLyBBZnRlciBDbGVhcigpIHdlIG1heSBvciBtYXkgbm90IGdldCBhIG1lc3NhZ2UgZnJvbSBSZWxlYXNlTWVzc2FnZSgpLgorICAvLyBUaGlzIGlzIGltcGxlbWVudGF0aW9uIHNwZWNpZmljLgorICByZWZsZWN0aW9uX3Rlc3Rlci5TZXRBbGxGaWVsZHNWaWFSZWZsZWN0aW9uKCZtZXNzYWdlKTsKKyAgbWVzc2FnZS5DbGVhcigpOworICByZWZsZWN0aW9uX3Rlc3Rlci5FeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICAgICZtZXNzYWdlLCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6Q0FOX0JFX05VTEwpOworCisgIC8vIFRlc3QgYSBkaWZmZXJlbnQgY29kZSBwYXRoIGZvciBzZXR0aW5nIGFmdGVyIHJlbGVhc2luZy4KKyAgVGVzdFV0aWw6OlNldEFsbEV4dGVuc2lvbnMoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKK30KKworVEVTVChHZW5lcmF0ZWRNZXNzYWdlUmVmbGVjdGlvblRlc3QsIFJlbGVhc2VPbmVvZk1lc3NhZ2VUZXN0KSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7CisgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpTZXRPbmVvZlZpYVJlZmxlY3Rpb24oJm1lc3NhZ2UpOworCisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSB1bml0dGVzdDo6VGVzdE9uZW9mMjo6ZGVzY3JpcHRvcigpOworICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uID0gbWVzc2FnZS5HZXRSZWZsZWN0aW9uKCk7CisgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKKyAgTWVzc2FnZSogcmVsZWFzZWQgPSByZWZsZWN0aW9uLT5SZWxlYXNlTWVzc2FnZSgKKyAgICAgICZtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSk7CisKKyAgRVhQRUNUX1RSVUUocmVsZWFzZWQgIT0gTlVMTCk7CisgIEVYUEVDVF9FUSgmc3ViX21lc3NhZ2UsIHJlbGVhc2VkKTsKKyAgZGVsZXRlIHJlbGVhc2VkOworCisgIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZU1lc3NhZ2UoCisgICAgICAmbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfVFJVRShyZWxlYXNlZCA9PSBOVUxMKTsKK30KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCiAKIFRFU1QoR2VuZXJhdGVkTWVzc2FnZVJlZmxlY3Rpb25UZXN0LCBVc2FnZUVycm9ycykgewogICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CkBAIC0zNzYsNyArODQ0LDcgQEAKICN1bmRlZiBmCiB9CiAKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKIAogCiB9ICAvLyBuYW1lc3BhY2UKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmNjCmluZGV4IDc2ZTU0N2IuLjMzNDA1MWEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzYsNiArMzYsNyBAQAogCiAjaW5jbHVkZSA8bGltaXRzPgogCisKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CkBAIC00Nyw3ICs0OCwzNSBAQAogICByZXR1cm4gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjpxdWlldF9OYU4oKTsKIH0KIAotY29uc3QgOjpzdGQ6OnN0cmluZyBrRW1wdHlTdHJpbmc7Citjb25zdCA6OnN0ZDo6c3RyaW5nKiBlbXB0eV9zdHJpbmdfOworR09PR0xFX1BST1RPQlVGX0RFQ0xBUkVfT05DRShlbXB0eV9zdHJpbmdfb25jZV9pbml0Xyk7CisKK3ZvaWQgRGVsZXRlRW1wdHlTdHJpbmcoKSB7CisgIGRlbGV0ZSBlbXB0eV9zdHJpbmdfOworfQorCit2b2lkIEluaXRFbXB0eVN0cmluZygpIHsKKyAgZW1wdHlfc3RyaW5nXyA9IG5ldyBzdHJpbmc7CisgIE9uU2h1dGRvd24oJkRlbGV0ZUVtcHR5U3RyaW5nKTsKK30KKworY29uc3QgOjpzdGQ6OnN0cmluZyYgR2V0RW1wdHlTdHJpbmcoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJmVtcHR5X3N0cmluZ19vbmNlX2luaXRfLCAmSW5pdEVtcHR5U3RyaW5nKTsKKyAgcmV0dXJuIEdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpOworfQorCisKK2ludCBTdHJpbmdTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIGNvbnN0IHZvaWQqIHN0YXJ0ID0gJnN0cjsKKyAgY29uc3Qgdm9pZCogZW5kID0gJnN0ciArIDE7CisgIGlmIChzdGFydCA8PSBzdHIuZGF0YSgpICYmIHN0ci5kYXRhKCkgPCBlbmQpIHsKKyAgICAvLyBUaGUgc3RyaW5nJ3MgZGF0YSBpcyBzdG9yZWQgaW5zaWRlIHRoZSBzdHJpbmcgb2JqZWN0IGl0c2VsZi4KKyAgICByZXR1cm4gMDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc3RyLmNhcGFjaXR5KCk7CisgIH0KK30KKwogCiAKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oCmluZGV4IDc3YWUxMDYuLjM2ZjE4ZGEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9nZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM4LDIxICszOCwyMiBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfR0VORVJBVEVEX01FU1NBR0VfVVRJTF9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0dFTkVSQVRFRF9NRVNTQUdFX1VUSUxfSF9fCiAKKyNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdHJpbmc+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KIAotCiBuYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0gIG5hbWVzcGFjZSBpbyB7Ci0gICAgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsgICAgICAvLyBjb2RlZF9zdHJlYW0uaAotICB9Ci19CiAKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisKK2NsYXNzIEFyZW5hOworbmFtZXNwYWNlIGlvIHsgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsgfQorCiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCisKIC8vIEFubm90YXRpb24gZm9yIHRoZSBjb21waWxlciB0byBlbWl0IGEgZGVwcmVjYXRpb24gbWVzc2FnZSBpZiBhIGZpZWxkIG1hcmtlZAogLy8gd2l0aCBvcHRpb24gJ2RlcHJlY2F0ZWQ9dHJ1ZScgaXMgdXNlZCBpbiB0aGUgY29kZSwgb3IgZm9yIG90aGVyIHRoaW5ncyBpbgogLy8gZ2VuZXJhdGVkIGNvZGUgd2hpY2ggYXJlIGRlcHJlY2F0ZWQuCkBAIC02MCwyMCArNjEsNTcgQEAKIC8vIEZvciBpbnRlcm5hbCB1c2UgaW4gdGhlIHBiLmNjIGZpbGVzLCBkZXByZWNhdGlvbiB3YXJuaW5ncyBhcmUgc3VwcHJlc3NlZAogLy8gdGhlcmUuCiAjdW5kZWYgREVQUkVDQVRFRF9QUk9UT0JVRl9GSUVMRAotI2lmICFkZWZpbmVkKElOVEVSTkFMX1NVUFBSRVNTX1BST1RPQlVGX0ZJRUxEX0RFUFJFQ0FUSU9OKQotIyAgZGVmaW5lIFBST1RPQlVGX0RFUFJFQ0FURUQgR09PR0xFX0FUVFJJQlVURV9ERVBSRUNBVEVECi0jZWxzZQotIyAgZGVmaW5lIFBST1RPQlVGX0RFUFJFQ0FURUQKLSNlbmRpZgorI2RlZmluZSBQUk9UT0JVRl9ERVBSRUNBVEVECisKKyNkZWZpbmUgUFJPVE9CVUZfREVQUkVDQVRFRF9BVFRSCiAKIAogLy8gQ29uc3RhbnRzIGZvciBzcGVjaWFsIGZsb2F0aW5nIHBvaW50IHZhbHVlcy4KIExJQlBST1RPQlVGX0VYUE9SVCBkb3VibGUgSW5maW5pdHkoKTsKIExJQlBST1RPQlVGX0VYUE9SVCBkb3VibGUgTmFOKCk7CiAKLS8vIENvbnN0YW50IHVzZWQgZm9yIGVtcHR5IGRlZmF1bHQgc3RyaW5ncy4KLUxJQlBST1RPQlVGX0VYUE9SVCBleHRlcm4gY29uc3QgOjpzdGQ6OnN0cmluZyBrRW1wdHlTdHJpbmc7CisvLyBUT0RPKGppZWx1byk6IENoYW5nZSB0byB0ZW1wbGF0ZS4gV2UgaGF2ZSB0cmllZCB0byB1c2UgdGVtcGxhdGUsCisvLyBidXQgaXQgY2F1c2VzIG5ldC9ycGMvcHl0aG9uOnJwY3V0aWxfdGVzdCBmYWlsICh0aGUgZW1wdHkgc3RyaW5nIHdpbGwKKy8vIGluaXQgdHdpY2UpLiBJdCBtYXkgcmVsYXRlZCB0byBzd2lnLiBDaGFuZ2UgdG8gdGVtcGxhdGUgYWZ0ZXIgd2UKKy8vIGZvdW5kIHRoZSBzb2x1dGlvbi4KIAorLy8gRGVmYXVsdCBlbXB0eSBzdHJpbmcgb2JqZWN0LiBEb24ndCB1c2UgdGhlIHBvaW50ZXIgZGlyZWN0bHkuIEluc3RlYWQsIGNhbGwKKy8vIEdldEVtcHR5U3RyaW5nKCkgdG8gZ2V0IHRoZSByZWZlcmVuY2UuCitMSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIGNvbnN0IDo6c3RkOjpzdHJpbmcqIGVtcHR5X3N0cmluZ187CitMSUJQUk9UT0JVRl9FWFBPUlQgZXh0ZXJuIFByb3RvYnVmT25jZVR5cGUgZW1wdHlfc3RyaW5nX29uY2VfaW5pdF87CitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBJbml0RW1wdHlTdHJpbmcoKTsKKworCitMSUJQUk9UT0JVRl9FWFBPUlQgaW5saW5lIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEdldEVtcHR5U3RyaW5nQWxyZWFkeUluaXRlZCgpIHsKKyAgYXNzZXJ0KGVtcHR5X3N0cmluZ18gIT0gTlVMTCk7CisgIHJldHVybiAqZW1wdHlfc3RyaW5nXzsKK30KKworTElCUFJPVE9CVUZfRVhQT1JUIGNvbnN0IDo6c3RkOjpzdHJpbmcmIEdldEVtcHR5U3RyaW5nKCk7CisKK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZihjb25zdCBzdHJpbmcmIHN0cik7CisKKworLy8gVHJ1ZSBpZiBJc0luaXRpYWxpemVkKCkgaXMgdHJ1ZSBmb3IgYWxsIGVsZW1lbnRzIG9mIHQuICBUeXBlIGlzIGV4cGVjdGVkCisvLyB0byBiZSBhIFJlcGVhdGVkUHRyRmllbGQ8c29tZSBtZXNzYWdlIHR5cGU+LiAgSXQncyB1c2VmdWwgdG8gaGF2ZSB0aGlzCisvLyBoZWxwZXIgaGVyZSB0byBrZWVwIHRoZSBwcm90b2J1ZiBjb21waWxlciBmcm9tIGV2ZXIgaGF2aW5nIHRvIGVtaXQgbG9vcHMgaW4KKy8vIElzSW5pdGlhbGl6ZWQoKSBtZXRob2RzLiAgV2Ugd2FudCB0aGUgQysrIGNvbXBpbGVyIHRvIGlubGluZSB0aGlzIG9yIG5vdAorLy8gYXMgaXQgc2VlcyBmaXQuCit0ZW1wbGF0ZSA8Y2xhc3MgVHlwZT4gYm9vbCBBbGxBcmVJbml0aWFsaXplZChjb25zdCBUeXBlJiB0KSB7CisgIGZvciAoaW50IGkgPSB0LnNpemUoKTsgLS1pID49IDA7ICkgeworICAgIGlmICghdC5HZXQoaSkuSXNJbml0aWFsaXplZCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2NsYXNzIEFyZW5hU3RyaW5nOworCisvLyBSZWFkIGEgbGVuZ3RoICh2YXJpbnQzMiksIGZvbGxvd2VkIGJ5IGEgc3RyaW5nLCBmcm9tICppbnB1dC4gIFJldHVybiBhCisvLyBwb2ludGVyIHRvIGEgY29weSBvZiB0aGUgc3RyaW5nIHRoYXQgcmVzaWRlcyBpbiAqYXJlbmEuICBSZXF1aXJlcyBib3RoCisvLyBhcmdzIHRvIGJlIG5vbi1OVUxMLiAgSWYgc29tZXRoaW5nIGdvZXMgd3Jvbmcgd2hpbGUgcmVhZGluZyB0aGUgZGF0YQorLy8gdGhlbiBOVUxMIGlzIHJldHVybmVkIChlLmcuLCBpbnB1dCBkb2VzIG5vdCBzdGFydCB3aXRoIGEgdmFsaWQgdmFyaW50KS4KK0FyZW5hU3RyaW5nKiBSZWFkQXJlbmFTdHJpbmcoOjpnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKTsKIAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5jYwppbmRleCAyMDNiYWJkLi4zMGUzMTI2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zOCwxMiArMzgsMTcgQEAKIC8vIHdpbGwgbm90IGNyb3NzIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwgc2luY2Ugd2UgY2FuIGF2b2lkIGEgbG90CiAvLyBvZiBicmFuY2hpbmcgaW4gdGhpcyBjYXNlLgogCi0jaW5jbHVkZSA8YWxnb3JpdGhtPgotI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0cmluZ19wb2VtLmgiCisKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oPgorI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx1dGlsaXR5PgorI2luY2x1ZGUgPGxpbWl0cy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgogCiAKIG5hbWVzcGFjZSBnb29nbGUgewpAQCAtNjksNiArNzQsMjMgQEAKIAogLy8gQ29kZWRJbnB1dFN0cmVhbSA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCitDb2RlZElucHV0U3RyZWFtOjp+Q29kZWRJbnB1dFN0cmVhbSgpIHsKKyAgaWYgKGlucHV0XyAhPSBOVUxMKSB7CisgICAgQmFja1VwSW5wdXRUb0N1cnJlbnRQb3NpdGlvbigpOworICB9CisKKyAgaWYgKHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXyA9PSAtMikgeworICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIlRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgcmVhZCB3YXMgIiA8PCB0b3RhbF9ieXRlc19yZWFkXzsKKyAgfQorfQorCisvLyBTdGF0aWMuCitpbnQgQ29kZWRJbnB1dFN0cmVhbTo6ZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfID0gMTAwOworCisKK3ZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OkVuYWJsZUFsaWFzaW5nKGJvb2wgZW5hYmxlZCkgeworICBhbGlhc2luZ19lbmFibGVkXyA9IGVuYWJsZWQgJiYgb3V0cHV0Xy0+QWxsb3dzQWxpYXNpbmcoKTsKK30KIAogdm9pZCBDb2RlZElucHV0U3RyZWFtOjpCYWNrVXBJbnB1dFRvQ3VycmVudFBvc2l0aW9uKCkgewogICBpbnQgYmFja3VwX2J5dGVzID0gQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfICsgb3ZlcmZsb3dfYnl0ZXNfOwpAQCAtODUsNyArMTA3LDcgQEAKIAogaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6UmVjb21wdXRlQnVmZmVyTGltaXRzKCkgewogICBidWZmZXJfZW5kXyArPSBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF87Ci0gIGludCBjbG9zZXN0X2xpbWl0ID0gbWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOworICBpbnQgY2xvc2VzdF9saW1pdCA9IHN0ZDo6bWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOwogICBpZiAoY2xvc2VzdF9saW1pdCA8IHRvdGFsX2J5dGVzX3JlYWRfKSB7CiAgICAgLy8gVGhlIGxpbWl0IHBvc2l0aW9uIGlzIGluIHRoZSBjdXJyZW50IGJ1ZmZlci4gIFdlIG11c3QgYWRqdXN0CiAgICAgLy8gdGhlIGJ1ZmZlciBzaXplIGFjY29yZGluZ2x5LgpAQCAtOTgsOCArMTIwLDcgQEAKIAogQ29kZWRJbnB1dFN0cmVhbTo6TGltaXQgQ29kZWRJbnB1dFN0cmVhbTo6UHVzaExpbWl0KGludCBieXRlX2xpbWl0KSB7CiAgIC8vIEN1cnJlbnQgcG9zaXRpb24gcmVsYXRpdmUgdG8gdGhlIGJlZ2lubmluZyBvZiB0aGUgc3RyZWFtLgotICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2J5dGVzX3JlYWRfIC0KLSAgICAgIChCdWZmZXJTaXplKCkgKyBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8pOworICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IEN1cnJlbnRQb3NpdGlvbigpOwogCiAgIExpbWl0IG9sZF9saW1pdCA9IGN1cnJlbnRfbGltaXRfOwogCkBAIC0xMTYsNyArMTM3LDcgQEAKICAgLy8gV2UgbmVlZCB0byBlbmZvcmNlIGFsbCBsaW1pdHMsIG5vdCBqdXN0IHRoZSBuZXcgb25lLCBzbyBpZiB0aGUgcHJldmlvdXMKICAgLy8gbGltaXQgd2FzIGJlZm9yZSB0aGUgbmV3IHJlcXVlc3RlZCBsaW1pdCwgd2UgY29udGludWUgdG8gZW5mb3JjZSB0aGUKICAgLy8gcHJldmlvdXMgbGltaXQuCi0gIGN1cnJlbnRfbGltaXRfID0gbWluKGN1cnJlbnRfbGltaXRfLCBvbGRfbGltaXQpOworICBjdXJyZW50X2xpbWl0XyA9IHN0ZDo6bWluKGN1cnJlbnRfbGltaXRfLCBvbGRfbGltaXQpOwogCiAgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOwogICByZXR1cm4gb2xkX2xpbWl0OwpAQCAtMTMzLDEwICsxNTQsMzMgQEAKICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gPSBmYWxzZTsKIH0KIAotaW50IENvZGVkSW5wdXRTdHJlYW06OkJ5dGVzVW50aWxMaW1pdCgpIHsKK3N0ZDo6cGFpcjxDb2RlZElucHV0U3RyZWFtOjpMaW1pdCwgaW50PgorQ29kZWRJbnB1dFN0cmVhbTo6SW5jcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQdXNoTGltaXQoaW50IGJ5dGVfbGltaXQpIHsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKFB1c2hMaW1pdChieXRlX2xpbWl0KSwgLS1yZWN1cnNpb25fYnVkZ2V0Xyk7Cit9CisKK0NvZGVkSW5wdXRTdHJlYW06OkxpbWl0IENvZGVkSW5wdXRTdHJlYW06OlJlYWRMZW5ndGhBbmRQdXNoTGltaXQoKSB7CisgIHVpbnQzMiBsZW5ndGg7CisgIHJldHVybiBQdXNoTGltaXQoUmVhZFZhcmludDMyKCZsZW5ndGgpID8gbGVuZ3RoIDogMCk7Cit9CisKK2Jvb2wgQ29kZWRJbnB1dFN0cmVhbTo6RGVjcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQb3BMaW1pdChMaW1pdCBsaW1pdCkgeworICBib29sIHJlc3VsdCA9IENvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworICBQb3BMaW1pdChsaW1pdCk7CisgIEdPT0dMRV9EQ0hFQ0tfTFQocmVjdXJzaW9uX2J1ZGdldF8sIHJlY3Vyc2lvbl9saW1pdF8pOworICArK3JlY3Vyc2lvbl9idWRnZXRfOworICByZXR1cm4gcmVzdWx0OworfQorCitib29sIENvZGVkSW5wdXRTdHJlYW06OkNoZWNrRW50aXJlTWVzc2FnZUNvbnN1bWVkQW5kUG9wTGltaXQoTGltaXQgbGltaXQpIHsKKyAgYm9vbCByZXN1bHQgPSBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKKyAgUG9wTGltaXQobGltaXQpOworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgQ29kZWRJbnB1dFN0cmVhbTo6Qnl0ZXNVbnRpbExpbWl0KCkgY29uc3QgewogICBpZiAoY3VycmVudF9saW1pdF8gPT0gSU5UX01BWCkgcmV0dXJuIC0xOwotICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IHRvdGFsX2J5dGVzX3JlYWRfIC0KLSAgICAgIChCdWZmZXJTaXplKCkgKyBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8pOworICBpbnQgY3VycmVudF9wb3NpdGlvbiA9IEN1cnJlbnRQb3NpdGlvbigpOwogCiAgIHJldHVybiBjdXJyZW50X2xpbWl0XyAtIGN1cnJlbnRfcG9zaXRpb247CiB9CkBAIC0xNDUsMTMgKzE4OSwyMiBAQAogICAgIGludCB0b3RhbF9ieXRlc19saW1pdCwgaW50IHdhcm5pbmdfdGhyZXNob2xkKSB7CiAgIC8vIE1ha2Ugc3VyZSB0aGUgbGltaXQgaXNuJ3QgYWxyZWFkeSBwYXN0LCBzaW5jZSB0aGlzIGNvdWxkIGNvbmZ1c2Ugb3RoZXIKICAgLy8gY29kZS4KLSAgaW50IGN1cnJlbnRfcG9zaXRpb24gPSB0b3RhbF9ieXRlc19yZWFkXyAtCi0gICAgICAoQnVmZmVyU2l6ZSgpICsgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKTsKLSAgdG90YWxfYnl0ZXNfbGltaXRfID0gbWF4KGN1cnJlbnRfcG9zaXRpb24sIHRvdGFsX2J5dGVzX2xpbWl0KTsKLSAgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfID0gd2FybmluZ190aHJlc2hvbGQ7CisgIGludCBjdXJyZW50X3Bvc2l0aW9uID0gQ3VycmVudFBvc2l0aW9uKCk7CisgIHRvdGFsX2J5dGVzX2xpbWl0XyA9IHN0ZDo6bWF4KGN1cnJlbnRfcG9zaXRpb24sIHRvdGFsX2J5dGVzX2xpbWl0KTsKKyAgaWYgKHdhcm5pbmdfdGhyZXNob2xkID49IDApIHsKKyAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8gPSB3YXJuaW5nX3RocmVzaG9sZDsKKyAgfSBlbHNlIHsKKyAgICAvLyB3YXJuaW5nX3RocmVzaG9sZCBpcyBuZWdhdGl2ZQorICAgIHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXyA9IC0xOworICB9CiAgIFJlY29tcHV0ZUJ1ZmZlckxpbWl0cygpOwogfQogCitpbnQgQ29kZWRJbnB1dFN0cmVhbTo6Qnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpIGNvbnN0IHsKKyAgaWYgKHRvdGFsX2J5dGVzX2xpbWl0XyA9PSBJTlRfTUFYKSByZXR1cm4gLTE7CisgIHJldHVybiB0b3RhbF9ieXRlc19saW1pdF8gLSBDdXJyZW50UG9zaXRpb24oKTsKK30KKwogdm9pZCBDb2RlZElucHV0U3RyZWFtOjpQcmludFRvdGFsQnl0ZXNMaW1pdEVycm9yKCkgewogICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiQSBwcm90b2NvbCBtZXNzYWdlIHdhcyByZWplY3RlZCBiZWNhdXNlIGl0IHdhcyB0b28gIgogICAgICAgICAgICAgICAgICJiaWcgKG1vcmUgdGhhbiAiIDw8IHRvdGFsX2J5dGVzX2xpbWl0XwpAQCAtMTgyLDcgKzIzNSw3IEBACiAgIGJ1ZmZlcl9lbmRfID0gYnVmZmVyXzsKIAogICAvLyBNYWtlIHN1cmUgdGhpcyBza2lwIGRvZXNuJ3QgdHJ5IHRvIHNraXAgcGFzdCB0aGUgY3VycmVudCBsaW1pdC4KLSAgaW50IGNsb3Nlc3RfbGltaXQgPSBtaW4oY3VycmVudF9saW1pdF8sIHRvdGFsX2J5dGVzX2xpbWl0Xyk7CisgIGludCBjbG9zZXN0X2xpbWl0ID0gc3RkOjptaW4oY3VycmVudF9saW1pdF8sIHRvdGFsX2J5dGVzX2xpbWl0Xyk7CiAgIGludCBieXRlc191bnRpbF9saW1pdCA9IGNsb3Nlc3RfbGltaXQgLSB0b3RhbF9ieXRlc19yZWFkXzsKICAgaWYgKGJ5dGVzX3VudGlsX2xpbWl0IDwgY291bnQpIHsKICAgICAvLyBXZSBoaXQgdGhlIGxpbWl0LiAgU2tpcCB1cCB0byBpdCB0aGVuIGZhaWwuCkBAIC0yMDYsMjAgKzI1OSw3IEBACiB9CiAKIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFJhdyh2b2lkKiBidWZmZXIsIGludCBzaXplKSB7Ci0gIGludCBjdXJyZW50X2J1ZmZlcl9zaXplOwotICB3aGlsZSAoKGN1cnJlbnRfYnVmZmVyX3NpemUgPSBCdWZmZXJTaXplKCkpIDwgc2l6ZSkgewotICAgIC8vIFJlYWRpbmcgcGFzdCBlbmQgb2YgYnVmZmVyLiAgQ29weSB3aGF0IHdlIGhhdmUsIHRoZW4gcmVmcmVzaC4KLSAgICBtZW1jcHkoYnVmZmVyLCBidWZmZXJfLCBjdXJyZW50X2J1ZmZlcl9zaXplKTsKLSAgICBidWZmZXIgPSByZWludGVycHJldF9jYXN0PHVpbnQ4Kj4oYnVmZmVyKSArIGN1cnJlbnRfYnVmZmVyX3NpemU7Ci0gICAgc2l6ZSAtPSBjdXJyZW50X2J1ZmZlcl9zaXplOwotICAgIEFkdmFuY2UoY3VycmVudF9idWZmZXJfc2l6ZSk7Ci0gICAgaWYgKCFSZWZyZXNoKCkpIHJldHVybiBmYWxzZTsKLSAgfQotCi0gIG1lbWNweShidWZmZXIsIGJ1ZmZlcl8sIHNpemUpOwotICBBZHZhbmNlKHNpemUpOwotCi0gIHJldHVybiB0cnVlOworICByZXR1cm4gSW50ZXJuYWxSZWFkUmF3SW5saW5lKGJ1ZmZlciwgc2l6ZSk7CiB9CiAKIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFN0cmluZyhzdHJpbmcqIGJ1ZmZlciwgaW50IHNpemUpIHsKQEAgLTIzMiw2ICsyNzIsMTQgQEAKICAgICBidWZmZXItPmNsZWFyKCk7CiAgIH0KIAorICBpbnQgY2xvc2VzdF9saW1pdCA9IHN0ZDo6bWluKGN1cnJlbnRfbGltaXRfLCB0b3RhbF9ieXRlc19saW1pdF8pOworICBpZiAoY2xvc2VzdF9saW1pdCAhPSBJTlRfTUFYKSB7CisgICAgaW50IGJ5dGVzX3RvX2xpbWl0ID0gY2xvc2VzdF9saW1pdCAtIEN1cnJlbnRQb3NpdGlvbigpOworICAgIGlmIChieXRlc190b19saW1pdCA+IDAgJiYgc2l6ZSA+IDAgJiYgc2l6ZSA8PSBieXRlc190b19saW1pdCkgeworICAgICAgYnVmZmVyLT5yZXNlcnZlKHNpemUpOworICAgIH0KKyAgfQorCiAgIGludCBjdXJyZW50X2J1ZmZlcl9zaXplOwogICB3aGlsZSAoKGN1cnJlbnRfYnVmZmVyX3NpemUgPSBCdWZmZXJTaXplKCkpIDwgc2l6ZSkgewogICAgIC8vIFNvbWUgU1RMIGltcGxlbWVudGF0aW9ucyAiaGVscGZ1bGx5IiBjcmFzaCBvbiBidWZmZXItPmFwcGVuZChOVUxMLCAwKS4KQEAgLTI4OSwyMCArMzM3LDMxIEBACiAKIG5hbWVzcGFjZSB7CiAKLWlubGluZSBjb25zdCB1aW50OCogUmVhZFZhcmludDMyRnJvbUFycmF5KAotICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsIHVpbnQzMiogdmFsdWUpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKLWlubGluZSBjb25zdCB1aW50OCogUmVhZFZhcmludDMyRnJvbUFycmF5KGNvbnN0IHVpbnQ4KiBidWZmZXIsIHVpbnQzMiogdmFsdWUpIHsKKy8vIFJlYWQgYSB2YXJpbnQgZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLCB3cml0ZSBpdCB0byAqdmFsdWUsIGFuZCByZXR1cm4gYSBwYWlyLgorLy8gVGhlIGZpcnN0IHBhcnQgb2YgdGhlIHBhaXIgaXMgdHJ1ZSBpZmYgdGhlIHJlYWQgd2FzIHN1Y2Nlc3NmdWwuICBUaGUgc2Vjb25kCisvLyBwYXJ0IGlzIGJ1ZmZlciArIChudW1iZXIgb2YgYnl0ZXMgcmVhZCkuICBUaGlzIGZ1bmN0aW9uIGlzIGFsd2F5cyBpbmxpbmVkLAorLy8gc28gcmV0dXJuaW5nIGEgcGFpciBpcyBjb3N0bGVzcy4KK0dPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSA6OnN0ZDo6cGFpcjxib29sLCBjb25zdCB1aW50OCo+IFJlYWRWYXJpbnQzMkZyb21BcnJheSgKKyAgICB1aW50MzIgZmlyc3RfYnl0ZSwgY29uc3QgdWludDgqIGJ1ZmZlciwKKyAgICB1aW50MzIqIHZhbHVlKTsKK2lubGluZSA6OnN0ZDo6cGFpcjxib29sLCBjb25zdCB1aW50OCo+IFJlYWRWYXJpbnQzMkZyb21BcnJheSgKKyAgICB1aW50MzIgZmlyc3RfYnl0ZSwgY29uc3QgdWludDgqIGJ1ZmZlciwgdWludDMyKiB2YWx1ZSkgewogICAvLyBGYXN0IHBhdGg6ICBXZSBoYXZlIGVub3VnaCBieXRlcyBsZWZ0IGluIHRoZSBidWZmZXIgdG8gZ3VhcmFudGVlIHRoYXQKICAgLy8gdGhpcyByZWFkIHdvbid0IGNyb3NzIHRoZSBlbmQsIHNvIHdlIGNhbiBza2lwIHRoZSBjaGVja3MuCisgIEdPT0dMRV9EQ0hFQ0tfRVEoKmJ1ZmZlciwgZmlyc3RfYnl0ZSk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoZmlyc3RfYnl0ZSAmIDB4ODAsIDB4ODApIDw8IGZpcnN0X2J5dGU7CiAgIGNvbnN0IHVpbnQ4KiBwdHIgPSBidWZmZXI7CiAgIHVpbnQzMiBiOwotICB1aW50MzIgcmVzdWx0OwotCi0gIGIgPSAqKHB0cisrKTsgcmVzdWx0ICA9IChiICYgMHg3RikgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICBiID0gKihwdHIrKyk7IHJlc3VsdCB8PSAoYiAmIDB4N0YpIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgYiA9ICoocHRyKyspOyByZXN1bHQgfD0gKGIgJiAweDdGKSA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gIGIgPSAqKHB0cisrKTsgcmVzdWx0IHw9IChiICYgMHg3RikgPDwgMjE7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICBiID0gKihwdHIrKyk7IHJlc3VsdCB8PSAgYiAgICAgICAgIDw8IDI4OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgdWludDMyIHJlc3VsdCA9IGZpcnN0X2J5dGUgLSAweDgwOworICArK3B0cjsgIC8vIFdlIGp1c3QgcHJvY2Vzc2VkIHRoZSBmaXJzdCBieXRlLiAgTW92ZSBvbiB0byB0aGUgc2Vjb25kLgorICBiID0gKihwdHIrKyk7IHJlc3VsdCArPSBiIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgcmVzdWx0IC09IDB4ODAgPDwgNzsKKyAgYiA9ICoocHRyKyspOyByZXN1bHQgKz0gYiA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgIHJlc3VsdCAtPSAweDgwIDw8IDE0OworICBiID0gKihwdHIrKyk7IHJlc3VsdCArPSBiIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgcmVzdWx0IC09IDB4ODAgPDwgMjE7CisgIGIgPSAqKHB0cisrKTsgcmVzdWx0ICs9IGIgPDwgMjg7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAvLyAicmVzdWx0IC09IDB4ODAgPDwgMjgiIGlzIGlycmV2ZWxhbnQuCiAKICAgLy8gSWYgdGhlIGlucHV0IGlzIGxhcmdlciB0aGFuIDMyIGJpdHMsIHdlIHN0aWxsIG5lZWQgdG8gcmVhZCBpdCBhbGwKICAgLy8gYW5kIGRpc2NhcmQgdGhlIGhpZ2gtb3JkZXIgYml0cy4KQEAgLTMxMiwzOCArMzcxLDQyIEBACiAKICAgLy8gV2UgaGF2ZSBvdmVycnVuIHRoZSBtYXhpbXVtIHNpemUgb2YgYSB2YXJpbnQgKDEwIGJ5dGVzKS4gIEFzc3VtZQogICAvLyB0aGUgZGF0YSBpcyBjb3JydXB0LgotICByZXR1cm4gTlVMTDsKKyAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKGZhbHNlLCBwdHIpOwogCiAgZG9uZToKICAgKnZhbHVlID0gcmVzdWx0OwotICByZXR1cm4gcHRyOworICByZXR1cm4gc3RkOjptYWtlX3BhaXIodHJ1ZSwgcHRyKTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlCiAKIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyU2xvdyh1aW50MzIqIHZhbHVlKSB7Ci0gIHVpbnQ2NCByZXN1bHQ7CiAgIC8vIERpcmVjdGx5IGludm9rZSBSZWFkVmFyaW50NjRGYWxsYmFjaywgc2luY2Ugd2UgYWxyZWFkeSB0cmllZCB0byBvcHRpbWl6ZQogICAvLyBmb3Igb25lLWJ5dGUgdmFyaW50cy4KLSAgaWYgKCFSZWFkVmFyaW50NjRGYWxsYmFjaygmcmVzdWx0KSkgcmV0dXJuIGZhbHNlOwotICAqdmFsdWUgPSAodWludDMyKXJlc3VsdDsKLSAgcmV0dXJuIHRydWU7CisgIHN0ZDo6cGFpcjx1aW50NjQsIGJvb2w+IHAgPSBSZWFkVmFyaW50NjRGYWxsYmFjaygpOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHAuZmlyc3QpOworICByZXR1cm4gcC5zZWNvbmQ7CiB9CiAKLWJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyRmFsbGJhY2sodWludDMyKiB2YWx1ZSkgeworaW50NjQgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyRmFsbGJhY2sodWludDMyIGZpcnN0X2J5dGVfb3JfemVybykgewogICBpZiAoQnVmZmVyU2l6ZSgpID49IGtNYXhWYXJpbnRCeXRlcyB8fAotICAgICAgLy8gT3B0aW1pemF0aW9uOiAgSWYgdGhlIHZhcmludCBlbmRzIGF0IGV4YWN0bHkgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLAotICAgICAgLy8gd2UgY2FuIGRldGVjdCB0aGF0IGFuZCBzdGlsbCB1c2UgdGhlIGZhc3QgcGF0aC4KKyAgICAgIC8vIE9wdGltaXphdGlvbjogIFdlJ3JlIGFsc28gc2FmZSBpZiB0aGUgYnVmZmVyIGlzIG5vbi1lbXB0eSBhbmQgaXQgZW5kcworICAgICAgLy8gd2l0aCBhIGJ5dGUgdGhhdCB3b3VsZCB0ZXJtaW5hdGUgYSB2YXJpbnQuCiAgICAgICAoYnVmZmVyX2VuZF8gPiBidWZmZXJfICYmICEoYnVmZmVyX2VuZF9bLTFdICYgMHg4MCkpKSB7Ci0gICAgY29uc3QgdWludDgqIGVuZCA9IFJlYWRWYXJpbnQzMkZyb21BcnJheShidWZmZXJfLCB2YWx1ZSk7Ci0gICAgaWYgKGVuZCA9PSBOVUxMKSByZXR1cm4gZmFsc2U7Ci0gICAgYnVmZmVyXyA9IGVuZDsKLSAgICByZXR1cm4gdHJ1ZTsKKyAgICBHT09HTEVfRENIRUNLX05FKGZpcnN0X2J5dGVfb3JfemVybywgMCkKKyAgICAgICAgPDwgIkNhbGxlciBzaG91bGQgcHJvdmlkZSB1cyB3aXRoICpidWZmZXJfIHdoZW4gYnVmZmVyIGlzIG5vbi1lbXB0eSI7CisgICAgdWludDMyIHRlbXA7CisgICAgOjpzdGQ6OnBhaXI8Ym9vbCwgY29uc3QgdWludDgqPiBwID0KKyAgICAgICAgICBSZWFkVmFyaW50MzJGcm9tQXJyYXkoZmlyc3RfYnl0ZV9vcl96ZXJvLCBidWZmZXJfLCAmdGVtcCk7CisgICAgaWYgKCFwLmZpcnN0KSByZXR1cm4gLTE7CisgICAgYnVmZmVyXyA9IHAuc2Vjb25kOworICAgIHJldHVybiB0ZW1wOwogICB9IGVsc2UgewogICAgIC8vIFJlYWxseSBzbG93IGNhc2U6IHdlIHdpbGwgaW5jdXIgdGhlIGNvc3Qgb2YgYW4gZXh0cmEgZnVuY3Rpb24gY2FsbCBoZXJlLAogICAgIC8vIGJ1dCBtb3ZpbmcgdGhpcyBvdXQgb2YgbGluZSByZWR1Y2VzIHRoZSBzaXplIG9mIHRoaXMgZnVuY3Rpb24sIHdoaWNoCiAgICAgLy8gaW1wcm92ZXMgdGhlIGNvbW1vbiBjYXNlLiBJbiBtaWNybyBiZW5jaG1hcmtzLCB0aGlzIGlzIHdvcnRoIGFib3V0IDEwLTE1JQotICAgIHJldHVybiBSZWFkVmFyaW50MzJTbG93KHZhbHVlKTsKKyAgICB1aW50MzIgdGVtcDsKKyAgICByZXR1cm4gUmVhZFZhcmludDMyU2xvdygmdGVtcCkgPyBzdGF0aWNfY2FzdDxpbnQ2ND4odGVtcCkgOiAtMTsKICAgfQogfQogCkBAIC0zNjgsMjcgKzQzMSwzNiBAQAogCiAgIC8vIEZvciB0aGUgc2xvdyBwYXRoLCBqdXN0IGRvIGEgNjQtYml0IHJlYWQuIFRyeSB0byBvcHRpbWl6ZSBmb3Igb25lLWJ5dGUgdGFncwogICAvLyBhZ2Fpbiwgc2luY2Ugd2UgaGF2ZSBub3cgcmVmcmVzaGVkIHRoZSBidWZmZXIuCi0gIHVpbnQ2NCByZXN1bHQ7CisgIHVpbnQ2NCByZXN1bHQgPSAwOwogICBpZiAoIVJlYWRWYXJpbnQ2NCgmcmVzdWx0KSkgcmV0dXJuIDA7CiAgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MzI+KHJlc3VsdCk7CiB9CiAKLXVpbnQzMiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnRmFsbGJhY2soKSB7Ci0gIGlmIChCdWZmZXJTaXplKCkgPj0ga01heFZhcmludEJ5dGVzIHx8Ci0gICAgICAvLyBPcHRpbWl6YXRpb246ICBJZiB0aGUgdmFyaW50IGVuZHMgYXQgZXhhY3RseSB0aGUgZW5kIG9mIHRoZSBidWZmZXIsCi0gICAgICAvLyB3ZSBjYW4gZGV0ZWN0IHRoYXQgYW5kIHN0aWxsIHVzZSB0aGUgZmFzdCBwYXRoLgotICAgICAgKGJ1ZmZlcl9lbmRfID4gYnVmZmVyXyAmJiAhKGJ1ZmZlcl9lbmRfWy0xXSAmIDB4ODApKSkgewotICAgIHVpbnQzMiB0YWc7Ci0gICAgY29uc3QgdWludDgqIGVuZCA9IFJlYWRWYXJpbnQzMkZyb21BcnJheShidWZmZXJfLCAmdGFnKTsKLSAgICBpZiAoZW5kID09IE5VTEwpIHsKK3VpbnQzMiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVGFnRmFsbGJhY2sodWludDMyIGZpcnN0X2J5dGVfb3JfemVybykgeworICBjb25zdCBpbnQgYnVmX3NpemUgPSBCdWZmZXJTaXplKCk7CisgIGlmIChidWZfc2l6ZSA+PSBrTWF4VmFyaW50Qnl0ZXMgfHwKKyAgICAgIC8vIE9wdGltaXphdGlvbjogIFdlJ3JlIGFsc28gc2FmZSBpZiB0aGUgYnVmZmVyIGlzIG5vbi1lbXB0eSBhbmQgaXQgZW5kcworICAgICAgLy8gd2l0aCBhIGJ5dGUgdGhhdCB3b3VsZCB0ZXJtaW5hdGUgYSB2YXJpbnQuCisgICAgICAoYnVmX3NpemUgPiAwICYmICEoYnVmZmVyX2VuZF9bLTFdICYgMHg4MCkpKSB7CisgICAgR09PR0xFX0RDSEVDS19FUShmaXJzdF9ieXRlX29yX3plcm8sIGJ1ZmZlcl9bMF0pOworICAgIGlmIChmaXJzdF9ieXRlX29yX3plcm8gPT0gMCkgeworICAgICAgKytidWZmZXJfOwogICAgICAgcmV0dXJuIDA7CiAgICAgfQotICAgIGJ1ZmZlcl8gPSBlbmQ7CisgICAgdWludDMyIHRhZzsKKyAgICA6OnN0ZDo6cGFpcjxib29sLCBjb25zdCB1aW50OCo+IHAgPQorICAgICAgICBSZWFkVmFyaW50MzJGcm9tQXJyYXkoZmlyc3RfYnl0ZV9vcl96ZXJvLCBidWZmZXJfLCAmdGFnKTsKKyAgICBpZiAoIXAuZmlyc3QpIHsKKyAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBidWZmZXJfID0gcC5zZWNvbmQ7CiAgICAgcmV0dXJuIHRhZzsKICAgfSBlbHNlIHsKICAgICAvLyBXZSBhcmUgY29tbW9ubHkgYXQgYSBsaW1pdCB3aGVuIGF0dGVtcHRpbmcgdG8gcmVhZCB0YWdzLiBUcnkgdG8gcXVpY2tseQogICAgIC8vIGRldGVjdCB0aGlzIGNhc2Ugd2l0aG91dCBtYWtpbmcgYW5vdGhlciBmdW5jdGlvbiBjYWxsLgotICAgIGlmIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfICYmIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyA+IDAgJiYKKyAgICBpZiAoKGJ1Zl9zaXplID09IDApICYmCisgICAgICAgICgoYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfID4gMCkgfHwKKyAgICAgICAgICh0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykpICYmCiAgICAgICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHRoZSBsaW1pdCB3ZSBoaXQgaXMgbm90IHRvdGFsX2J5dGVzX2xpbWl0Xywgc2luY2UKICAgICAgICAgLy8gaW4gdGhhdCBjYXNlIHdlIHN0aWxsIG5lZWQgdG8gY2FsbCBSZWZyZXNoKCkgc28gdGhhdCBpdCBwcmludHMgYW4KICAgICAgICAgLy8gZXJyb3IuCkBAIC00MjQsMTAgKzQ5NiwxMCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50NjRGYWxsYmFjayh1aW50NjQqIHZhbHVlKSB7CitzdGQ6OnBhaXI8dWludDY0LCBib29sPiBDb2RlZElucHV0U3RyZWFtOjpSZWFkVmFyaW50NjRGYWxsYmFjaygpIHsKICAgaWYgKEJ1ZmZlclNpemUoKSA+PSBrTWF4VmFyaW50Qnl0ZXMgfHwKLSAgICAgIC8vIE9wdGltaXphdGlvbjogIElmIHRoZSB2YXJpbnQgZW5kcyBhdCBleGFjdGx5IHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciwKLSAgICAgIC8vIHdlIGNhbiBkZXRlY3QgdGhhdCBhbmQgc3RpbGwgdXNlIHRoZSBmYXN0IHBhdGguCisgICAgICAvLyBPcHRpbWl6YXRpb246ICBXZSdyZSBhbHNvIHNhZmUgaWYgdGhlIGJ1ZmZlciBpcyBub24tZW1wdHkgYW5kIGl0IGVuZHMKKyAgICAgIC8vIHdpdGggYSBieXRlIHRoYXQgd291bGQgdGVybWluYXRlIGEgdmFyaW50LgogICAgICAgKGJ1ZmZlcl9lbmRfID4gYnVmZmVyXyAmJiAhKGJ1ZmZlcl9lbmRfWy0xXSAmIDB4ODApKSkgewogICAgIC8vIEZhc3QgcGF0aDogIFdlIGhhdmUgZW5vdWdoIGJ5dGVzIGxlZnQgaW4gdGhlIGJ1ZmZlciB0byBndWFyYW50ZWUgdGhhdAogICAgIC8vIHRoaXMgcmVhZCB3b24ndCBjcm9zcyB0aGUgZW5kLCBzbyB3ZSBjYW4gc2tpcCB0aGUgY2hlY2tzLgpAQCAtNDM5LDI5ICs1MTEsNDEgQEAKICAgICAvLyBwcm9jZXNzb3JzLgogICAgIHVpbnQzMiBwYXJ0MCA9IDAsIHBhcnQxID0gMCwgcGFydDIgPSAwOwogCi0gICAgYiA9ICoocHRyKyspOyBwYXJ0MCAgPSAoYiAmIDB4N0YpICAgICAgOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQwIHw9IChiICYgMHg3RikgPDwgIDc7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIGIgPSAqKHB0cisrKTsgcGFydDAgfD0gKGIgJiAweDdGKSA8PCAxNDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gICAgYiA9ICoocHRyKyspOyBwYXJ0MCB8PSAoYiAmIDB4N0YpIDw8IDIxOyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQxICA9IChiICYgMHg3RikgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIGIgPSAqKHB0cisrKTsgcGFydDEgfD0gKGIgJiAweDdGKSA8PCAgNzsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gICAgYiA9ICoocHRyKyspOyBwYXJ0MSB8PSAoYiAmIDB4N0YpIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKLSAgICBiID0gKihwdHIrKyk7IHBhcnQxIHw9IChiICYgMHg3RikgPDwgMjE7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOwotICAgIGIgPSAqKHB0cisrKTsgcGFydDIgID0gKGIgJiAweDdGKSAgICAgIDsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7Ci0gICAgYiA9ICoocHRyKyspOyBwYXJ0MiB8PSAoYiAmIDB4N0YpIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQwICA9IGIgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIHBhcnQwIC09IDB4ODA7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MCArPSBiIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBwYXJ0MCAtPSAweDgwIDw8IDc7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MCArPSBiIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBwYXJ0MCAtPSAweDgwIDw8IDE0OworICAgIGIgPSAqKHB0cisrKTsgcGFydDAgKz0gYiA8PCAyMTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgcGFydDAgLT0gMHg4MCA8PCAyMTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQxICA9IGIgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIHBhcnQxIC09IDB4ODA7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MSArPSBiIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBwYXJ0MSAtPSAweDgwIDw8IDc7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MSArPSBiIDw8IDE0OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICBwYXJ0MSAtPSAweDgwIDw8IDE0OworICAgIGIgPSAqKHB0cisrKTsgcGFydDEgKz0gYiA8PCAyMTsgaWYgKCEoYiAmIDB4ODApKSBnb3RvIGRvbmU7CisgICAgcGFydDEgLT0gMHg4MCA8PCAyMTsKKyAgICBiID0gKihwdHIrKyk7IHBhcnQyICA9IGIgICAgICA7IGlmICghKGIgJiAweDgwKSkgZ290byBkb25lOworICAgIHBhcnQyIC09IDB4ODA7CisgICAgYiA9ICoocHRyKyspOyBwYXJ0MiArPSBiIDw8ICA3OyBpZiAoIShiICYgMHg4MCkpIGdvdG8gZG9uZTsKKyAgICAvLyAicGFydDIgLT0gMHg4MCA8PCA3IiBpcyBpcnJlbGV2YW50IGJlY2F1c2UgKDB4ODAgPDwgNykgPDwgNTYgaXMgMC4KIAogICAgIC8vIFdlIGhhdmUgb3ZlcnJ1biB0aGUgbWF4aW11bSBzaXplIG9mIGEgdmFyaW50ICgxMCBieXRlcykuICBUaGUgZGF0YQogICAgIC8vIG11c3QgYmUgY29ycnVwdC4KLSAgICByZXR1cm4gZmFsc2U7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKDAsIGZhbHNlKTsKIAogICAgZG9uZToKICAgICBBZHZhbmNlKHB0ciAtIGJ1ZmZlcl8pOwotICAgICp2YWx1ZSA9IChzdGF0aWNfY2FzdDx1aW50NjQ+KHBhcnQwKSAgICAgICkgfAotICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjQ+KHBhcnQxKSA8PCAyOCkgfAotICAgICAgICAgICAgIChzdGF0aWNfY2FzdDx1aW50NjQ+KHBhcnQyKSA8PCA1Nik7Ci0gICAgcmV0dXJuIHRydWU7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKChzdGF0aWNfY2FzdDx1aW50NjQ+KHBhcnQwKSkgfAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHN0YXRpY19jYXN0PHVpbnQ2ND4ocGFydDEpIDw8IDI4KSB8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc3RhdGljX2Nhc3Q8dWludDY0PihwYXJ0MikgPDwgNTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0cnVlKTsKICAgfSBlbHNlIHsKLSAgICByZXR1cm4gUmVhZFZhcmludDY0U2xvdyh2YWx1ZSk7CisgICAgdWludDY0IHRlbXA7CisgICAgYm9vbCBzdWNjZXNzID0gUmVhZFZhcmludDY0U2xvdygmdGVtcCk7CisgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRlbXAsIHN1Y2Nlc3MpOwogICB9CiB9CiAKQEAgLTQ5Miw4ICs1NzYsOCBAQAogICAgICAgICAgICAgICAgICAgICAgICJDb2RlZElucHV0U3RyZWFtOjpTZXRUb3RhbEJ5dGVzTGltaXQoKSBpbiAiCiAgICAgICAgICAgICAgICAgICAgICAgImdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaC4iOwogCi0gICAgLy8gRG9uJ3Qgd2FybiBhZ2FpbiBmb3IgdGhpcyBzdHJlYW0uCi0gICAgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfID0gLTE7CisgICAgLy8gRG9uJ3Qgd2FybiBhZ2FpbiBmb3IgdGhpcyBzdHJlYW0sIGFuZCBwcmludCB0b3RhbCBzaXplIGF0IHRoZSBlbmQuCisgICAgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfID0gLTI7CiAgIH0KIAogICBjb25zdCB2b2lkKiB2b2lkX2J1ZmZlcjsKQEAgLTUzNyw3ICs2MjEsOCBAQAogICAgIGJ1ZmZlcl8oTlVMTCksCiAgICAgYnVmZmVyX3NpemVfKDApLAogICAgIHRvdGFsX2J5dGVzXygwKSwKLSAgICBoYWRfZXJyb3JfKGZhbHNlKSB7CisgICAgaGFkX2Vycm9yXyhmYWxzZSksCisgICAgYWxpYXNpbmdfZW5hYmxlZF8oZmFsc2UpIHsKICAgLy8gRWFnZXJseSBSZWZyZXNoKCkgc28gYnVmZmVyIHNwYWNlIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KICAgUmVmcmVzaCgpOwogICAvLyBUaGUgUmVmcmVzaCgpIG1heSBoYXZlIGZhaWxlZC4gSWYgdGhlIGNsaWVudCBkb2Vzbid0IHdyaXRlIGFueSBkYXRhLApAQCAtNTQ2LDkgKzYzMSwzNCBAQAogICBoYWRfZXJyb3JfID0gZmFsc2U7CiB9CiAKK0NvZGVkT3V0cHV0U3RyZWFtOjpDb2RlZE91dHB1dFN0cmVhbShaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgZG9fZWFnZXJfcmVmcmVzaCkKKyAgOiBvdXRwdXRfKG91dHB1dCksCisgICAgYnVmZmVyXyhOVUxMKSwKKyAgICBidWZmZXJfc2l6ZV8oMCksCisgICAgdG90YWxfYnl0ZXNfKDApLAorICAgIGhhZF9lcnJvcl8oZmFsc2UpLAorICAgIGFsaWFzaW5nX2VuYWJsZWRfKGZhbHNlKSB7CisgIGlmIChkb19lYWdlcl9yZWZyZXNoKSB7CisgICAgLy8gRWFnZXJseSBSZWZyZXNoKCkgc28gYnVmZmVyIHNwYWNlIGlzIGltbWVkaWF0ZWx5IGF2YWlsYWJsZS4KKyAgICBSZWZyZXNoKCk7CisgICAgLy8gVGhlIFJlZnJlc2goKSBtYXkgaGF2ZSBmYWlsZWQuIElmIHRoZSBjbGllbnQgZG9lc24ndCB3cml0ZSBhbnkgZGF0YSwKKyAgICAvLyB0aG91Z2gsIGRvbid0IGNvbnNpZGVyIHRoaXMgYW4gZXJyb3IuIElmIHRoZSBjbGllbnQgZG9lcyB3cml0ZSBkYXRhLCB0aGVuCisgICAgLy8gYW5vdGhlciBSZWZyZXNoKCkgd2lsbCBiZSBhdHRlbXB0ZWQgYW5kIGl0IHdpbGwgc2V0IHRoZSBlcnJvciBvbmNlIGFnYWluLgorICAgIGhhZF9lcnJvcl8gPSBmYWxzZTsKKyAgfQorfQorCiBDb2RlZE91dHB1dFN0cmVhbTo6fkNvZGVkT3V0cHV0U3RyZWFtKCkgeworICBUcmltKCk7Cit9CisKK3ZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OlRyaW0oKSB7CiAgIGlmIChidWZmZXJfc2l6ZV8gPiAwKSB7CiAgICAgb3V0cHV0Xy0+QmFja1VwKGJ1ZmZlcl9zaXplXyk7CisgICAgdG90YWxfYnl0ZXNfIC09IGJ1ZmZlcl9zaXplXzsKKyAgICBidWZmZXJfc2l6ZV8gPSAwOworICAgIGJ1ZmZlcl8gPSBOVUxMOwogICB9CiB9CiAKQEAgLTU5MSw2ICs3MDEsMTggQEAKIH0KIAogCit2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKKyAgaWYgKHNpemUgPCBidWZmZXJfc2l6ZV8KKyAgICAgICkgeworICAgIFdyaXRlUmF3KGRhdGEsIHNpemUpOworICB9IGVsc2UgeworICAgIFRyaW0oKTsKKworICAgIHRvdGFsX2J5dGVzXyArPSBzaXplOworICAgIGhhZF9lcnJvcl8gfD0gIW91dHB1dF8tPldyaXRlQWxpYXNlZFJhdyhkYXRhLCBzaXplKTsKKyAgfQorfQorCiB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZUxpdHRsZUVuZGlhbjMyKHVpbnQzMiB2YWx1ZSkgewogICB1aW50OCBieXRlc1tzaXplb2YodmFsdWUpXTsKIApAQCAtNjIxLDYxICs3NDMsMTIgQEAKICAgfQogfQogCi1pbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5SW5saW5lKAotICAgIHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCkgewotICB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgfCAweDgwKTsKLSAgaWYgKHZhbHVlID49ICgxIDw8IDcpKSB7Ci0gICAgdGFyZ2V0WzFdID0gc3RhdGljX2Nhc3Q8dWludDg+KCh2YWx1ZSA+PiAgNykgfCAweDgwKTsKLSAgICBpZiAodmFsdWUgPj0gKDEgPDwgMTQpKSB7Ci0gICAgICB0YXJnZXRbMl0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHZhbHVlID4+IDE0KSB8IDB4ODApOwotICAgICAgaWYgKHZhbHVlID49ICgxIDw8IDIxKSkgewotICAgICAgICB0YXJnZXRbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHZhbHVlID4+IDIxKSB8IDB4ODApOwotICAgICAgICBpZiAodmFsdWUgPj0gKDEgPDwgMjgpKSB7Ci0gICAgICAgICAgdGFyZ2V0WzRdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlID4+IDI4KTsKLSAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgNTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICB0YXJnZXRbM10gJj0gMHg3RjsKLSAgICAgICAgICByZXR1cm4gdGFyZ2V0ICsgNDsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgdGFyZ2V0WzJdICY9IDB4N0Y7Ci0gICAgICAgIHJldHVybiB0YXJnZXQgKyAzOwotICAgICAgfQotICAgIH0gZWxzZSB7Ci0gICAgICB0YXJnZXRbMV0gJj0gMHg3RjsKLSAgICAgIHJldHVybiB0YXJnZXQgKyAyOwotICAgIH0KLSAgfSBlbHNlIHsKLSAgICB0YXJnZXRbMF0gJj0gMHg3RjsKLSAgICByZXR1cm4gdGFyZ2V0ICsgMTsKLSAgfQotfQotCi12b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyKHVpbnQzMiB2YWx1ZSkgewotICBpZiAoYnVmZmVyX3NpemVfID49IGtNYXhWYXJpbnQzMkJ5dGVzKSB7Ci0gICAgLy8gRmFzdCBwYXRoOiAgV2UgaGF2ZSBlbm91Z2ggYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyIHRvIGd1YXJhbnRlZSB0aGF0Ci0gICAgLy8gdGhpcyB3cml0ZSB3b24ndCBjcm9zcyB0aGUgZW5kLCBzbyB3ZSBjYW4gc2tpcCB0aGUgY2hlY2tzLgotICAgIHVpbnQ4KiB0YXJnZXQgPSBidWZmZXJfOwotICAgIHVpbnQ4KiBlbmQgPSBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5SW5saW5lKHZhbHVlLCB0YXJnZXQpOwotICAgIGludCBzaXplID0gZW5kIC0gdGFyZ2V0OwotICAgIEFkdmFuY2Uoc2l6ZSk7Ci0gIH0gZWxzZSB7Ci0gICAgLy8gU2xvdyBwYXRoOiAgVGhpcyB3cml0ZSBtaWdodCBjcm9zcyB0aGUgZW5kIG9mIHRoZSBidWZmZXIsIHNvIHdlCi0gICAgLy8gY29tcG9zZSB0aGUgYnl0ZXMgZmlyc3QgdGhlbiB1c2UgV3JpdGVSYXcoKS4KLSAgICB1aW50OCBieXRlc1trTWF4VmFyaW50MzJCeXRlc107Ci0gICAgaW50IHNpemUgPSAwOwotICAgIHdoaWxlICh2YWx1ZSA+IDB4N0YpIHsKLSAgICAgIGJ5dGVzW3NpemUrK10gPSAoc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlKSAmIDB4N0YpIHwgMHg4MDsKLSAgICAgIHZhbHVlID4+PSA3OwotICAgIH0KLSAgICBieXRlc1tzaXplKytdID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlKSAmIDB4N0Y7Ci0gICAgV3JpdGVSYXcoYnl0ZXMsIHNpemUpOwotICB9Ci19Ci0KLXVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheSgKLSAgICB1aW50MzIgdmFsdWUsIHVpbnQ4KiB0YXJnZXQpIHsKLSAgcmV0dXJuIFdyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXlJbmxpbmUodmFsdWUsIHRhcmdldCk7Cit2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyU2xvd1BhdGgodWludDMyIHZhbHVlKSB7CisgIHVpbnQ4IGJ5dGVzW2tNYXhWYXJpbnQzMkJ5dGVzXTsKKyAgdWludDgqIHRhcmdldCA9ICZieXRlc1swXTsKKyAgdWludDgqIGVuZCA9IFdyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworICBpbnQgc2l6ZSA9IGVuZCAtIHRhcmdldDsKKyAgV3JpdGVSYXcoYnl0ZXMsIHNpemUpOwogfQogCiBpbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDY0VG9BcnJheUlubGluZSgKQEAgLTgzNCw2ICs5MDcsMTMgQEAKICAgfQogfQogCit1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nV2l0aFNpemVUb0FycmF5KGNvbnN0IHN0cmluZyYgc3RyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CisgIEdPT0dMRV9EQ0hFQ0tfTEUoc3RyLnNpemUoKSwga3VpbnQzMm1heCk7CisgIHRhcmdldCA9IFdyaXRlVmFyaW50MzJUb0FycmF5KHN0ci5zaXplKCksIHRhcmdldCk7CisgIHJldHVybiBXcml0ZVN0cmluZ1RvQXJyYXkoc3RyLCB0YXJnZXQpOworfQorCiB9ICAvLyBuYW1lc3BhY2UgaW8KIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaAppbmRleCBkODdhMGE3Li42YWExNThhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDksNyArNDksNyBAQAogLy8gICAvLyB0byBpZGVudGlmeSB0aGUgZmlsZSB0eXBlLCB0aGVuIHdyaXRlIGEgbGVuZ3RoLWRlbGltaXRlZCBzdHJpbmcuICBUaGUKIC8vICAgLy8gc3RyaW5nIGlzIGNvbXBvc2VkIG9mIGEgdmFyaW50IGdpdmluZyB0aGUgbGVuZ3RoIGZvbGxvd2VkIGJ5IHRoZSByYXcKIC8vICAgLy8gYnl0ZXMuCi0vLyAgIGludCBmZCA9IG9wZW4oIm15ZmlsZSIsIE9fV1JPTkxZKTsKKy8vICAgaW50IGZkID0gb3BlbigibXlmaWxlIiwgT19DUkVBVCB8IE9fV1JPTkxZKTsKIC8vICAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHJhd19vdXRwdXQgPSBuZXcgRmlsZU91dHB1dFN0cmVhbShmZCk7CiAvLyAgIENvZGVkT3V0cHV0U3RyZWFtKiBjb2RlZF9vdXRwdXQgPSBuZXcgQ29kZWRPdXRwdXRTdHJlYW0ocmF3X291dHB1dCk7CiAvLwpAQCAtMTA5LDcgKzEwOSwxMCBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fQ09ERURfU1RSRUFNX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fQ09ERURfU1RSRUFNX0hfXwogCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHV0aWxpdHk+CisKICNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKICNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgogI2lmIFNCX0lTKExJVFRMRV9FTkRJQU4pICYmIFwKQEAgLTExOCwxOCArMTIxLDE5IEBACiAjZW5kaWYKICNlbHNlCiAjaWZkZWYgX01TQ19WRVIKLSAgI2lmIGRlZmluZWQoX01fSVg4NikgJiYgXAotICAgICAgIWRlZmluZWQoUFJPVE9CVUZfRElTQUJMRV9MSVRUTEVfRU5ESUFOX09QVF9GT1JfVEVTVCkKKyAgLy8gQXNzdW1pbmcgd2luZG93cyBpcyBhbHdheXMgbGl0dGxlLWVuZGlhbi4KKyAgI2lmICFkZWZpbmVkKFBST1RPQlVGX0RJU0FCTEVfTElUVExFX0VORElBTl9PUFRfRk9SX1RFU1QpCiAgICAgI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKICAgI2VuZGlmCi0gICNpZiBfTVNDX1ZFUiA+PSAxMzAwCisgICNpZiBfTVNDX1ZFUiA+PSAxMzAwICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCiAgICAgLy8gSWYgTVNWQyBoYXMgIi9SVENjIiBzZXQsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgdHJ1bmNhdGluZyBjYXN0cyBhdAogICAgIC8vIHJ1bnRpbWUuICBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBpbnRlbnRpb25hbCB0cnVuY2F0aW5nIGNhc3RzLgogICAgICNwcmFnbWEgcnVudGltZV9jaGVja3MoImMiLCBvZmYpCiAgICNlbmRpZgogI2Vsc2UKICAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPiAgIC8vIF9fQllURV9PUkRFUgotICAjaWYgZGVmaW5lZChfX0JZVEVfT1JERVIpICYmIF9fQllURV9PUkRFUiA9PSBfX0xJVFRMRV9FTkRJQU4gJiYgXAorICAjaWYgKChkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykpIHx8IFwKKyAgICAgICAgIChkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTikpICYmIFwKICAgICAgICFkZWZpbmVkKFBST1RPQlVGX0RJU0FCTEVfTElUVExFX0VORElBTl9PUFRfRk9SX1RFU1QpCiAgICAgI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKICAgI2VuZGlmCkBAIC0xMzcsOSArMTQxLDggQEAKICNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogCi0jaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKLQogbmFtZXNwYWNlIGdvb2dsZSB7CisKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKIGNsYXNzIERlc2NyaXB0b3JQb29sOwpAQCAtMTc5LDYgKzE4Miw5IEBACiAgIC8vIHN1Y2Nlc3NmdWxseSBhbmQgdGhlIHN0cmVhbSdzIGJ5dGUgbGltaXQuCiAgIH5Db2RlZElucHV0U3RyZWFtKCk7CiAKKyAgLy8gUmV0dXJuIHRydWUgaWYgdGhpcyBDb2RlZElucHV0U3RyZWFtIHJlYWRzIGZyb20gYSBmbGF0IGFycmF5IGluc3RlYWQgb2YKKyAgLy8gYSBaZXJvQ29weUlucHV0U3RyZWFtLgorICBpbmxpbmUgYm9vbCBJc0ZsYXQoKSBjb25zdDsKIAogICAvLyBTa2lwcyBhIG51bWJlciBvZiBieXRlcy4gIFJldHVybnMgZmFsc2UgaWYgYW4gdW5kZXJseWluZyByZWFkIGVycm9yCiAgIC8vIG9jY3Vycy4KQEAgLTE5NSwxMiArMjAxLDE2IEBACiAKICAgLy8gTGlrZSBHZXREaXJlY3RCdWZmZXJQb2ludGVyLCBidXQgdGhpcyBtZXRob2QgaXMgaW5saW5lZCwgYW5kIGRvZXMgbm90CiAgIC8vIGF0dGVtcHQgdG8gUmVmcmVzaCgpIGlmIHRoZSBidWZmZXIgaXMgY3VycmVudGx5IGVtcHR5LgotICBpbmxpbmUgdm9pZCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKGNvbnN0IHZvaWQqKiBkYXRhLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCogc2l6ZSkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgdm9pZCBHZXREaXJlY3RCdWZmZXJQb2ludGVySW5saW5lKGNvbnN0IHZvaWQqKiBkYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50KiBzaXplKTsKIAogICAvLyBSZWFkIHJhdyBieXRlcywgY29weWluZyB0aGVtIGludG8gdGhlIGdpdmVuIGJ1ZmZlci4KICAgYm9vbCBSZWFkUmF3KHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOwogCisgIC8vIExpa2UgdGhlIGFib3ZlLCB3aXRoIGlubGluZWQgb3B0aW1pemF0aW9ucy4gVGhpcyBzaG91bGQgb25seSBiZSB1c2VkCisgIC8vIGJ5IHRoZSBwcm90b2J1ZiBpbXBsZW1lbnRhdGlvbi4KKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGJvb2wgSW50ZXJuYWxSZWFkUmF3SW5saW5lKHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOworCiAgIC8vIExpa2UgUmVhZFJhdywgYnV0IHJlYWRzIGludG8gYSBzdHJpbmcuCiAgIC8vCiAgIC8vIEltcGxlbWVudGF0aW9uIE5vdGU6ICBSZWFkU3RyaW5nKCkgZ3Jvd3MgdGhlIHN0cmluZyBncmFkdWFsbHkgYXMgaXQKQEAgLTIxMSw4ICsyMjEsOCBAQAogICBib29sIFJlYWRTdHJpbmcoc3RyaW5nKiBidWZmZXIsIGludCBzaXplKTsKICAgLy8gTGlrZSB0aGUgYWJvdmUsIHdpdGggaW5saW5lZCBvcHRpbWl6YXRpb25zLiBUaGlzIHNob3VsZCBvbmx5IGJlIHVzZWQKICAgLy8gYnkgdGhlIHByb3RvYnVmIGltcGxlbWVudGF0aW9uLgotICBpbmxpbmUgYm9vbCBJbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUoc3RyaW5nKiBidWZmZXIsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBJbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUoc3RyaW5nKiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplKTsKIAogCiAgIC8vIFJlYWQgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgpAQCAtMjM5LDEwICsyNDksMjEgQEAKICAgLy8gUmVhZCBhIHRhZy4gIFRoaXMgY2FsbHMgUmVhZFZhcmludDMyKCkgYW5kIHJldHVybnMgdGhlIHJlc3VsdCwgb3IgcmV0dXJucwogICAvLyB6ZXJvICh3aGljaCBpcyBub3QgYSB2YWxpZCB0YWcpIGlmIFJlYWRWYXJpbnQzMigpIGZhaWxzLiAgQWxzbywgaXQgdXBkYXRlcwogICAvLyB0aGUgbGFzdCB0YWcgdmFsdWUsIHdoaWNoIGNhbiBiZSBjaGVja2VkIHdpdGggTGFzdFRhZ1dhcygpLgotICAvLyBBbHdheXMgaW5saW5lIGJlY2F1c2UgdGhpcyBpcyBvbmx5IGNhbGxlZCBpbiBvbmNlIHBsYWNlIHBlciBwYXJzZSBsb29wCisgIC8vIEFsd2F5cyBpbmxpbmUgYmVjYXVzZSB0aGlzIGlzIG9ubHkgY2FsbGVkIGluIG9uZSBwbGFjZSBwZXIgcGFyc2UgbG9vcAogICAvLyBidXQgaXQgaXMgY2FsbGVkIGZvciBldmVyeSBpdGVyYXRpb24gb2Ygc2FpZCBsb29wLCBzbyBpdCBzaG91bGQgYmUgZmFzdC4KICAgLy8gR0NDIGRvZXNuJ3Qgd2FudCB0byBpbmxpbmUgdGhpcyBieSBkZWZhdWx0LgotICB1aW50MzIgUmVhZFRhZygpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHVpbnQzMiBSZWFkVGFnKCk7CisKKyAgLy8gVGhpcyB1c3VhbGx5IGEgZmFzdGVyIGFsdGVybmF0aXZlIHRvIFJlYWRUYWcoKSB3aGVuIGN1dG9mZiBpcyBhIG1hbmlmZXN0CisgIC8vIGNvbnN0YW50LiAgSXQgZG9lcyBwYXJ0aWN1bGFybHkgd2VsbCBmb3IgY3V0b2ZmID49IDEyNy4gIFRoZSBmaXJzdCBwYXJ0CisgIC8vIG9mIHRoZSByZXR1cm4gdmFsdWUgaXMgdGhlIHRhZyB0aGF0IHdhcyByZWFkLCB0aG91Z2ggaXQgY2FuIGFsc28gYmUgMCBpbgorICAvLyB0aGUgY2FzZXMgd2hlcmUgUmVhZFRhZygpIHdvdWxkIHJldHVybiAwLiAgSWYgdGhlIHNlY29uZCBwYXJ0IGlzIHRydWUKKyAgLy8gdGhlbiB0aGUgdGFnIGlzIGtub3duIHRvIGJlIGluIFswLCBjdXRvZmZdLiAgSWYgbm90LCB0aGUgdGFnIGVpdGhlciBpcworICAvLyBhYm92ZSBjdXRvZmYgb3IgaXMgMC4gIChUaGVyZSdzIGludGVudGlvbmFsIHdpZ2dsZSByb29tIHdoZW4gdGFnIGlzIDAsCisgIC8vIGJlY2F1c2UgdGhhdCBjYW4gYXJpc2UgaW4gc2V2ZXJhbCB3YXlzLCBhbmQgZm9yIGJlc3QgcGVyZm9ybWFuY2Ugd2Ugd2FudAorICAvLyB0byBhdm9pZCBhbiBleHRyYSAiaXMgdGFnID09IDA/IiBjaGVjayBoZXJlLikKKyAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHN0ZDo6cGFpcjx1aW50MzIsIGJvb2w+IFJlYWRUYWdXaXRoQ3V0b2ZmKAorICAgICAgdWludDMyIGN1dG9mZik7CiAKICAgLy8gVXN1YWxseSByZXR1cm5zIHRydWUgaWYgY2FsbGluZyBSZWFkVmFyaW50MzIoKSBub3cgd291bGQgcHJvZHVjZSB0aGUgZ2l2ZW4KICAgLy8gdmFsdWUuICBXaWxsIGFsd2F5cyByZXR1cm4gZmFsc2UgaWYgUmVhZFZhcmludDMyKCkgd291bGQgbm90IHJldHVybiB0aGUKQEAgLTI1MSw3ICsyNzIsNyBAQAogICAvLyBwYXJhbWV0ZXIuCiAgIC8vIEFsd2F5cyBpbmxpbmUgYmVjYXVzZSB0aGlzIGNvbGxhcHNlcyB0byBhIHNtYWxsIG51bWJlciBvZiBpbnN0cnVjdGlvbnMKICAgLy8gd2hlbiBnaXZlbiBhIGNvbnN0YW50IHBhcmFtZXRlciwgYnV0IEdDQyBkb2Vzbid0IHdhbnQgdG8gaW5saW5lIGJ5IGRlZmF1bHQuCi0gIGJvb2wgRXhwZWN0VGFnKHVpbnQzMiBleHBlY3RlZCkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOworICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBFeHBlY3RUYWcodWludDMyIGV4cGVjdGVkKTsKIAogICAvLyBMaWtlIGFib3ZlLCBleGNlcHQgdGhpcyByZWFkcyBmcm9tIHRoZSBzcGVjaWZpZWQgYnVmZmVyLiBUaGUgY2FsbGVyIGlzCiAgIC8vIHJlc3BvbnNpYmxlIGZvciBlbnN1cmluZyB0aGF0IHRoZSBidWZmZXIgaXMgbGFyZ2UgZW5vdWdoIHRvIHJlYWQgYSB2YXJpbnQKQEAgLTI2MCw5ICsyODEsOSBAQAogICAvLwogICAvLyBSZXR1cm5zIGEgcG9pbnRlciBiZXlvbmQgdGhlIGV4cGVjdGVkIHRhZyBpZiBpdCB3YXMgZm91bmQsIG9yIE5VTEwgaWYgaXQKICAgLy8gd2FzIG5vdC4KLSAgc3RhdGljIGNvbnN0IHVpbnQ4KiBFeHBlY3RUYWdGcm9tQXJyYXkoCisgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgY29uc3QgdWludDgqIEV4cGVjdFRhZ0Zyb21BcnJheSgKICAgICAgIGNvbnN0IHVpbnQ4KiBidWZmZXIsCi0gICAgICB1aW50MzIgZXhwZWN0ZWQpIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKKyAgICAgIHVpbnQzMiBleHBlY3RlZCk7CiAKICAgLy8gVXN1YWxseSByZXR1cm5zIHRydWUgaWYgbm8gbW9yZSBieXRlcyBjYW4gYmUgcmVhZC4gIEFsd2F5cyByZXR1cm5zIGZhbHNlCiAgIC8vIGlmIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBJZiBFeHBlY3RBdEVuZCgpIHJldHVybnMgdHJ1ZSwgYSBzdWJzZXF1ZW50CkBAIC0yNzAsOCArMjkxLDggQEAKICAgLy8gemVybywgYW5kIENvbnN1bWVkRW50aXJlTWVzc2FnZSgpIHdpbGwgcmV0dXJuIHRydWUuCiAgIGJvb2wgRXhwZWN0QXRFbmQoKTsKIAotICAvLyBJZiB0aGUgbGFzdCBjYWxsIHRvIFJlYWRUYWcoKSByZXR1cm5lZCB0aGUgZ2l2ZW4gdmFsdWUsIHJldHVybnMgdHJ1ZS4KLSAgLy8gT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlOworICAvLyBJZiB0aGUgbGFzdCBjYWxsIHRvIFJlYWRUYWcoKSBvciBSZWFkVGFnV2l0aEN1dG9mZigpIHJldHVybmVkIHRoZQorICAvLyBnaXZlbiB2YWx1ZSwgcmV0dXJucyB0cnVlLiAgT3RoZXJ3aXNlLCByZXR1cm5zIGZhbHNlOwogICAvLwogICAvLyBUaGlzIGlzIG5lZWRlZCBiZWNhdXNlIHBhcnNlcnMgZm9yIHNvbWUgdHlwZXMgb2YgZW1iZWRkZWQgbWVzc2FnZXMKICAgLy8gKHdpdGggZmllbGQgdHlwZSBUWVBFX0dST1VQKSBkb24ndCBhY3R1YWxseSBrbm93IHRoYXQgdGhleSd2ZSByZWFjaGVkIHRoZQpAQCAtMzIwLDcgKzM0MSwxMCBAQAogCiAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBsZWZ0IHVudGlsIHRoZSBuZWFyZXN0IGxpbWl0IG9uIHRoZQogICAvLyBzdGFjayBpcyBoaXQsIG9yIC0xIGlmIG5vIGxpbWl0cyBhcmUgaW4gcGxhY2UuCi0gIGludCBCeXRlc1VudGlsTGltaXQoKTsKKyAgaW50IEJ5dGVzVW50aWxMaW1pdCgpIGNvbnN0OworCisgIC8vIFJldHVybnMgY3VycmVudCBwb3NpdGlvbiByZWxhdGl2ZSB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBpbnB1dCBzdHJlYW0uCisgIGludCBDdXJyZW50UG9zaXRpb24oKSBjb25zdDsKIAogICAvLyBUb3RhbCBCeXRlcyBMaW1pdCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBUbyBwcmV2ZW50IG1hbGljaW91cyB1c2VycyBmcm9tIHNlbmRpbmcgZXhjZXNzaXZlbHkgbGFyZ2UgbWVzc2FnZXMKQEAgLTMzNiw4ICszNjAsOSBAQAogICAvLyBjYXVzZSBpbnRlZ2VyIG92ZXJmbG93cyBpcyA1MTJNQi4gIFRoZSBkZWZhdWx0IGxpbWl0IGlzIDY0TUIuICBBcHBzCiAgIC8vIHNob3VsZCBzZXQgc2hvcnRlciBsaW1pdHMgaWYgcG9zc2libGUuICBJZiB3YXJuaW5nX3RocmVzaG9sZCBpcyBub3QgLTEsCiAgIC8vIGEgd2FybmluZyB3aWxsIGJlIHByaW50ZWQgdG8gc3RkZXJyIGFmdGVyIHdhcm5pbmdfdGhyZXNob2xkIGJ5dGVzIGFyZQotICAvLyByZWFkLiAgQW4gZXJyb3Igd2lsbCBhbHdheXMgYmUgcHJpbnRlZCB0byBzdGRlcnIgaWYgdGhlIGxpbWl0IGlzCi0gIC8vIHJlYWNoZWQuCisgIC8vIHJlYWQuICBGb3IgYmFja3dhcmRzIGNvbXBhdGliaWxpdHkgYWxsIG5lZ2F0aXZlIHZhbHVlcyBnZXQgc3F1YXNoZWQgdG8gLTEsCisgIC8vIGFzIG90aGVyIG5lZ2F0aXZlIHZhbHVlcyBtaWdodCBoYXZlIHNwZWNpYWwgaW50ZXJuYWwgbWVhbmluZ3MuCisgIC8vIEFuIGVycm9yIHdpbGwgYWx3YXlzIGJlIHByaW50ZWQgdG8gc3RkZXJyIGlmIHRoZSBsaW1pdCBpcyByZWFjaGVkLgogICAvLwogICAvLyBUaGlzIGlzIHVucmVsYXRlZCB0byBQdXNoTGltaXQoKS9Qb3BMaW1pdCgpLgogICAvLwpAQCAtMzU4LDIyICszODMsNTkgQEAKICAgLy8gICBzb21ldGhpbmcgdW51c3VhbC4KICAgdm9pZCBTZXRUb3RhbEJ5dGVzTGltaXQoaW50IHRvdGFsX2J5dGVzX2xpbWl0LCBpbnQgd2FybmluZ190aHJlc2hvbGQpOwogCisgIC8vIFRoZSBUb3RhbCBCeXRlcyBMaW1pdCBtaW51cyB0aGUgQ3VycmVudCBQb3NpdGlvbiwgb3IgLTEgaWYgdGhlcmUKKyAgLy8gaXMgbm8gVG90YWwgQnl0ZXMgTGltaXQuCisgIGludCBCeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkgY29uc3Q7CisKICAgLy8gUmVjdXJzaW9uIExpbWl0IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gVG8gcHJldmVudCBjb3JydXB0IG9yIG1hbGljaW91cyBtZXNzYWdlcyBmcm9tIGNhdXNpbmcgc3RhY2sgb3ZlcmZsb3dzLAogICAvLyB3ZSBtdXN0IGtlZXAgdHJhY2sgb2YgdGhlIGRlcHRoIG9mIHJlY3Vyc2lvbiB3aGVuIHBhcnNpbmcgZW1iZWRkZWQKICAgLy8gbWVzc2FnZXMgYW5kIGdyb3Vwcy4gIENvZGVkSW5wdXRTdHJlYW0ga2VlcHMgdHJhY2sgb2YgdGhpcyBiZWNhdXNlIGl0CiAgIC8vIGlzIHRoZSBvbmx5IG9iamVjdCB0aGF0IGlzIHBhc3NlZCBkb3duIHRoZSBzdGFjayBkdXJpbmcgcGFyc2luZy4KIAotICAvLyBTZXRzIHRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC4gIFRoZSBkZWZhdWx0IGlzIDY0LgorICAvLyBTZXRzIHRoZSBtYXhpbXVtIHJlY3Vyc2lvbiBkZXB0aC4gIFRoZSBkZWZhdWx0IGlzIDEwMC4KICAgdm9pZCBTZXRSZWN1cnNpb25MaW1pdChpbnQgbGltaXQpOwogCisKICAgLy8gSW5jcmVtZW50cyB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGguICBSZXR1cm5zIHRydWUgaWYgdGhlIGRlcHRoIGlzCiAgIC8vIHVuZGVyIHRoZSBsaW1pdCwgZmFsc2UgaWYgaXQgaGFzIGdvbmUgb3Zlci4KICAgYm9vbCBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogCi0gIC8vIERlY3JlbWVudHMgdGhlIHJlY3Vyc2lvbiBkZXB0aC4KKyAgLy8gRGVjcmVtZW50cyB0aGUgcmVjdXJzaW9uIGRlcHRoIGlmIHBvc3NpYmxlLgogICB2b2lkIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CiAKKyAgLy8gRGVjcmVtZW50cyB0aGUgcmVjdXJzaW9uIGRlcHRoIGJsaW5kbHkuICBUaGlzIGlzIGZhc3RlciB0aGFuCisgIC8vIERlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkuICBJdCBzaG91bGQgYmUgdXNlZCBvbmx5IGlmIGFsbCBwcmV2aW91cworICAvLyBpbmNyZW1lbnRzIHRvIHJlY3Vyc2lvbiBkZXB0aCB3ZXJlIHN1Y2Nlc3NmdWwuCisgIHZvaWQgVW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKworICAvLyBTaG9ydGhhbmQgZm9yIG1ha2VfcGFpcihQdXNoTGltaXQoYnl0ZV9saW1pdCksIC0tcmVjdXJzaW9uX2J1ZGdldF8pLgorICAvLyBVc2luZyB0aGlzIGNhbiByZWR1Y2UgY29kZSBzaXplIGFuZCBjb21wbGV4aXR5IGluIHNvbWUgY2FzZXMuICBUaGUgY2FsbGVyCisgIC8vIGlzIGV4cGVjdGVkIHRvIGNoZWNrIHRoYXQgdGhlIHNlY29uZCBwYXJ0IG9mIHRoZSByZXN1bHQgaXMgbm9uLW5lZ2F0aXZlICh0bworICAvLyBiYWlsIG91dCBpZiB0aGUgZGVwdGggb2YgcmVjdXJzaW9uIGlzIHRvbyBoaWdoKSBhbmQsIGlmIGFsbCBpcyB3ZWxsLCB0bworICAvLyBsYXRlciBwYXNzIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSByZXN1bHQgdG8gUG9wTGltaXQoKSBvciBzaW1pbGFyLgorICBzdGQ6OnBhaXI8Q29kZWRJbnB1dFN0cmVhbTo6TGltaXQsIGludD4gSW5jcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQdXNoTGltaXQoCisgICAgICBpbnQgYnl0ZV9saW1pdCk7CisKKyAgLy8gU2hvcnRoYW5kIGZvciBQdXNoTGltaXQoUmVhZFZhcmludDMyKCZsZW5ndGgpID8gbGVuZ3RoIDogMCkuCisgIExpbWl0IFJlYWRMZW5ndGhBbmRQdXNoTGltaXQoKTsKKworICAvLyBIZWxwZXIgdGhhdCBpcyBlcXVpdmFsZW50IHRvOiB7CisgIC8vICBib29sIHJlc3VsdCA9IENvbnN1bWVkRW50aXJlTWVzc2FnZSgpOworICAvLyAgUG9wTGltaXQobGltaXQpOworICAvLyAgVW5zYWZlRGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKKyAgLy8gIHJldHVybiByZXN1bHQ7IH0KKyAgLy8gVXNpbmcgdGhpcyBjYW4gcmVkdWNlIGNvZGUgc2l6ZSBhbmQgY29tcGxleGl0eSBpbiBzb21lIGNhc2VzLgorICAvLyBEbyBub3QgdXNlIHVubGVzcyB0aGUgY3VycmVudCByZWN1cnNpb24gZGVwdGggaXMgZ3JlYXRlciB0aGFuIHplcm8uCisgIGJvb2wgRGVjcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQb3BMaW1pdChMaW1pdCBsaW1pdCk7CisKKyAgLy8gSGVscGVyIHRoYXQgaXMgZXF1aXZhbGVudCB0bzogeworICAvLyAgYm9vbCByZXN1bHQgPSBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKKyAgLy8gIFBvcExpbWl0KGxpbWl0KTsKKyAgLy8gIHJldHVybiByZXN1bHQ7IH0KKyAgLy8gVXNpbmcgdGhpcyBjYW4gcmVkdWNlIGNvZGUgc2l6ZSBhbmQgY29tcGxleGl0eSBpbiBzb21lIGNhc2VzLgorICBib29sIENoZWNrRW50aXJlTWVzc2FnZUNvbnN1bWVkQW5kUG9wTGltaXQoTGltaXQgbGltaXQpOworCiAgIC8vIEV4dGVuc2lvbiBSZWdpc3RyeSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIEFEVkFOQ0VEIFVTQUdFOiAgOTkuOSUgb2YgcGVvcGxlIGNhbiBpZ25vcmUgdGhpcyBzZWN0aW9uLgogICAvLwpAQCAtNDQyLDcgKzUwNCw4IEBACiAgIC8vCiAgIC8vIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgaXMgaWdub3JlZCB3aGVuIHBhcnNpbmcgImxpdGUiIG1lc3NhZ2VzIGFzIHRoZXkgZG8KICAgLy8gbm90IGhhdmUgZGVzY3JpcHRvcnMuCi0gIHZvaWQgU2V0RXh0ZW5zaW9uUmVnaXN0cnkoRGVzY3JpcHRvclBvb2wqIHBvb2wsIE1lc3NhZ2VGYWN0b3J5KiBmYWN0b3J5KTsKKyAgdm9pZCBTZXRFeHRlbnNpb25SZWdpc3RyeShjb25zdCBEZXNjcmlwdG9yUG9vbCogcG9vbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSk7CiAKICAgLy8gR2V0IHRoZSBEZXNjcmlwdG9yUG9vbCBzZXQgdmlhIFNldEV4dGVuc2lvblJlZ2lzdHJ5KCksIG9yIE5VTEwgaWYgbm8gcG9vbAogICAvLyBoYXMgYmVlbiBwcm92aWRlZC4KQEAgLTQ1NSw5ICs1MTgsOSBAQAogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDb2RlZElucHV0U3RyZWFtKTsKIAotICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87CiAgIGNvbnN0IHVpbnQ4KiBidWZmZXJfOwogICBjb25zdCB1aW50OCogYnVmZmVyX2VuZF87ICAgICAvLyBwb2ludGVyIHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlci4KKyAgWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXRfOwogICBpbnQgdG90YWxfYnl0ZXNfcmVhZF87ICAvLyB0b3RhbCBieXRlcyByZWFkIGZyb20gaW5wdXRfLCBpbmNsdWRpbmcKICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIGN1cnJlbnQgYnVmZmVyCiAKQEAgLTQ2Niw3ICs1MjksNyBAQAogICBpbnQgb3ZlcmZsb3dfYnl0ZXNfOwogCiAgIC8vIExhc3RUYWdXYXMoKSBzdHVmZi4KLSAgdWludDMyIGxhc3RfdGFnXzsgICAgICAgICAvLyByZXN1bHQgb2YgbGFzdCBSZWFkVGFnKCkuCisgIHVpbnQzMiBsYXN0X3RhZ187ICAgICAgICAgLy8gcmVzdWx0IG9mIGxhc3QgUmVhZFRhZygpIG9yIFJlYWRUYWdXaXRoQ3V0b2ZmKCkuCiAKICAgLy8gVGhpcyBpcyBzZXQgdHJ1ZSBieSBSZWFkVGFne0ZhbGxiYWNrL1Nsb3d9KCkgaWYgaXQgaXMgY2FsbGVkIHdoZW4gZXhhY3RseQogICAvLyBhdCBFT0YsIG9yIGJ5IEV4cGVjdEF0RW5kKCkgd2hlbiBpdCByZXR1cm5zIHRydWUuICBUaGlzIGhhcHBlbnMgd2hlbiB3ZQpAQCAtNDkxLDExICs1NTQsMTcgQEAKICAgLy8gTWF4aW11bSBudW1iZXIgb2YgYnl0ZXMgdG8gcmVhZCwgcGVyaW9kLiAgVGhpcyBpcyB1bnJlbGF0ZWQgdG8KICAgLy8gY3VycmVudF9saW1pdF8uICBTZXQgdXNpbmcgU2V0VG90YWxCeXRlc0xpbWl0KCkuCiAgIGludCB0b3RhbF9ieXRlc19saW1pdF87CisKKyAgLy8gSWYgcG9zaXRpdmUvMDogTGltaXQgZm9yIGJ5dGVzIHJlYWQgYWZ0ZXIgd2hpY2ggYSB3YXJuaW5nIGR1ZSB0byBzaXplCisgIC8vIHNob3VsZCBiZSBsb2dnZWQuCisgIC8vIElmIC0xOiBQcmludGluZyBvZiB3YXJuaW5nIGRpc2FibGVkLiBDYW4gYmUgc2V0IGJ5IGNsaWVudC4KKyAgLy8gSWYgLTI6IEludGVybmFsOiBMaW1pdCBoYXMgYmVlbiByZWFjaGVkLCBwcmludCBmdWxsIHNpemUgd2hlbiBkZXN0cnVjdGluZy4KICAgaW50IHRvdGFsX2J5dGVzX3dhcm5pbmdfdGhyZXNob2xkXzsKIAotICAvLyBDdXJyZW50IHJlY3Vyc2lvbiBkZXB0aCwgY29udHJvbGxlZCBieSBJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIGFuZAotICAvLyBEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpLgotICBpbnQgcmVjdXJzaW9uX2RlcHRoXzsKKyAgLy8gQ3VycmVudCByZWN1cnNpb24gYnVkZ2V0LCBjb250cm9sbGVkIGJ5IEluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgYW5kCisgIC8vIHNpbWlsYXIuICBTdGFydHMgYXQgcmVjdXJzaW9uX2xpbWl0XyBhbmQgZ29lcyBkb3duOiBpZiB0aGlzIHJlYWNoZXMKKyAgLy8gLTEgd2UgYXJlIG92ZXIgYnVkZ2V0LgorICBpbnQgcmVjdXJzaW9uX2J1ZGdldF87CiAgIC8vIFJlY3Vyc2lvbiBkZXB0aCBsaW1pdCwgc2V0IGJ5IFNldFJlY3Vyc2lvbkxpbWl0KCkuCiAgIGludCByZWN1cnNpb25fbGltaXRfOwogCkBAIC01MjgsOSArNTk3LDEzIEBACiAgIC8vIG9wdGltaXphdGlvbi4gVGhlIFNsb3cgbWV0aG9kIGlzIHlldCBhbm90aGVyIGZhbGxiYWNrIHdoZW4gdGhlIGJ1ZmZlciBpcwogICAvLyBub3QgbGFyZ2UgZW5vdWdoLiBNYWtpbmcgdGhlIHNsb3cgcGF0aCBvdXQtb2YtbGluZSBzcGVlZHMgdXAgdGhlIGNvbW1vbgogICAvLyBjYXNlIGJ5IDEwLTE1JS4gVGhlIHNsb3cgcGF0aCBpcyBmYWlybHkgdW5jb21tb246IGl0IG9ubHkgdHJpZ2dlcnMgd2hlbiBhCi0gIC8vIG1lc3NhZ2UgY3Jvc3NlcyBtdWx0aXBsZSBidWZmZXJzLgotICBib29sIFJlYWRWYXJpbnQzMkZhbGxiYWNrKHVpbnQzMiogdmFsdWUpOwotICBib29sIFJlYWRWYXJpbnQ2NEZhbGxiYWNrKHVpbnQ2NCogdmFsdWUpOworICAvLyBtZXNzYWdlIGNyb3NzZXMgbXVsdGlwbGUgYnVmZmVycy4gIE5vdGU6IFJlYWRWYXJpbnQzMkZhbGxiYWNrKCkgYW5kCisgIC8vIFJlYWRWYXJpbnQ2NEZhbGxiYWNrKCkgYXJlIGNhbGxlZCBmcmVxdWVudGx5IGFuZCBnZW5lcmFsbHkgbm90IGlubGluZWQsIHNvCisgIC8vIHRoZXkgaGF2ZSBiZWVuIG9wdGltaXplZCB0byBhdm9pZCAib3V0IiBwYXJhbWV0ZXJzLiAgVGhlIGZvcm1lciByZXR1cm5zIC0xCisgIC8vIGlmIGl0IGZhaWxzIGFuZCB0aGUgdWludDMyIGl0IHJlYWQgb3RoZXJ3aXNlLiAgVGhlIGxhdHRlciBoYXMgYSBib29sCisgIC8vIGluZGljYXRpbmcgc3VjY2VzcyBvciBmYWlsdXJlIGFzIHBhcnQgb2YgaXRzIHJldHVybiB0eXBlLgorICBpbnQ2NCBSZWFkVmFyaW50MzJGYWxsYmFjayh1aW50MzIgZmlyc3RfYnl0ZV9vcl96ZXJvKTsKKyAgc3RkOjpwYWlyPHVpbnQ2NCwgYm9vbD4gUmVhZFZhcmludDY0RmFsbGJhY2soKTsKICAgYm9vbCBSZWFkVmFyaW50MzJTbG93KHVpbnQzMiogdmFsdWUpOwogICBib29sIFJlYWRWYXJpbnQ2NFNsb3codWludDY0KiB2YWx1ZSk7CiAgIGJvb2wgUmVhZExpdHRsZUVuZGlhbjMyRmFsbGJhY2sodWludDMyKiB2YWx1ZSk7CkBAIC01MzgsNyArNjExLDcgQEAKICAgLy8gRmFsbGJhY2svc2xvdyBtZXRob2RzIGZvciByZWFkaW5nIHRhZ3MuIFRoZXNlIGRvIG5vdCB1cGRhdGUgbGFzdF90YWdfLAogICAvLyBidXQgd2lsbCBzZXQgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gaWYgd2UgYXJlIGF0IHRoZSBlbmQgb2YgdGhlIGlucHV0CiAgIC8vIHN0cmVhbS4KLSAgdWludDMyIFJlYWRUYWdGYWxsYmFjaygpOworICB1aW50MzIgUmVhZFRhZ0ZhbGxiYWNrKHVpbnQzMiBmaXJzdF9ieXRlX29yX3plcm8pOwogICB1aW50MzIgUmVhZFRhZ1Nsb3coKTsKICAgYm9vbCBSZWFkU3RyaW5nRmFsbGJhY2soc3RyaW5nKiBidWZmZXIsIGludCBzaXplKTsKIApAQCAtNTQ4LDcgKzYyMSw4IEBACiAgIHN0YXRpYyBjb25zdCBpbnQga0RlZmF1bHRUb3RhbEJ5dGVzTGltaXQgPSA2NCA8PCAyMDsgIC8vIDY0TUIKIAogICBzdGF0aWMgY29uc3QgaW50IGtEZWZhdWx0VG90YWxCeXRlc1dhcm5pbmdUaHJlc2hvbGQgPSAzMiA8PCAyMDsgIC8vIDMyTUIKLSAgc3RhdGljIGNvbnN0IGludCBrRGVmYXVsdFJlY3Vyc2lvbkxpbWl0ID0gNjQ7CisKKyAgc3RhdGljIGludCBkZWZhdWx0X3JlY3Vyc2lvbl9saW1pdF87ICAvLyAxMDAgYnkgZGVmYXVsdC4KIH07CiAKIC8vIENsYXNzIHdoaWNoIGVuY29kZXMgYW5kIHdyaXRlcyBiaW5hcnkgZGF0YSB3aGljaCBpcyBjb21wb3NlZCBvZiB2YXJpbnQtCkBAIC02MDEsMTEgKzY3NSwxOSBAQAogIHB1YmxpYzoKICAgLy8gQ3JlYXRlIGFuIENvZGVkT3V0cHV0U3RyZWFtIHRoYXQgd3JpdGVzIHRvIHRoZSBnaXZlbiBaZXJvQ29weU91dHB1dFN0cmVhbS4KICAgZXhwbGljaXQgQ29kZWRPdXRwdXRTdHJlYW0oWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisgIENvZGVkT3V0cHV0U3RyZWFtKFplcm9Db3B5T3V0cHV0U3RyZWFtKiBvdXRwdXQsIGJvb2wgZG9fZWFnZXJfcmVmcmVzaCk7CiAKICAgLy8gRGVzdHJveSB0aGUgQ29kZWRPdXRwdXRTdHJlYW0gYW5kIHBvc2l0aW9uIHRoZSB1bmRlcmx5aW5nCiAgIC8vIFplcm9Db3B5T3V0cHV0U3RyZWFtIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSBsYXN0IGJ5dGUgd3JpdHRlbi4KICAgfkNvZGVkT3V0cHV0U3RyZWFtKCk7CiAKKyAgLy8gVHJpbXMgYW55IHVudXNlZCBzcGFjZSBpbiB0aGUgdW5kZXJseWluZyBidWZmZXIgc28gdGhhdCBpdHMgc2l6ZSBtYXRjaGVzCisgIC8vIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiBieSB0aGlzIHN0cmVhbS4gVGhlIHVuZGVybHlpbmcgYnVmZmVyIHdpbGwKKyAgLy8gYXV0b21hdGljYWxseSBiZSB0cmltbWVkIHdoZW4gdGhpcyBzdHJlYW0gaXMgZGVzdHJveWVkOyB0aGlzIGNhbGwgaXMgb25seQorICAvLyBuZWNlc3NhcnkgaWYgdGhlIHVuZGVybHlpbmcgYnVmZmVyIGlzIGFjY2Vzc2VkICpiZWZvcmUqIHRoZSBzdHJlYW0gaXMKKyAgLy8gZGVzdHJveWVkLgorICB2b2lkIFRyaW0oKTsKKwogICAvLyBTa2lwcyBhIG51bWJlciBvZiBieXRlcywgbGVhdmluZyB0aGUgYnl0ZXMgdW5tb2RpZmllZCBpbiB0aGUgdW5kZXJseWluZwogICAvLyBidWZmZXIuICBSZXR1cm5zIGZhbHNlIGlmIGFuIHVuZGVybHlpbmcgd3JpdGUgZXJyb3Igb2NjdXJzLiAgVGhpcyBpcwogICAvLyBtYWlubHkgdXNlZnVsIHdpdGggR2V0RGlyZWN0QnVmZmVyUG9pbnRlcigpLgpAQCAtNjMyLDYgKzcxNCw5IEBACiAKICAgLy8gV3JpdGUgcmF3IGJ5dGVzLCBjb3B5aW5nIHRoZW0gZnJvbSB0aGUgZ2l2ZW4gYnVmZmVyLgogICB2b2lkIFdyaXRlUmF3KGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOworICAvLyBMaWtlIFdyaXRlUmF3KCkgIGJ1dCB3aWxsIHRyeSB0byB3cml0ZSBhbGlhc2VkIGRhdGEgaWYgYWxpYXNpbmcgaXMKKyAgLy8gdHVybmVkIG9uLgorICB2b2lkIFdyaXRlUmF3TWF5YmVBbGlhc2VkKGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplKTsKICAgLy8gTGlrZSBXcml0ZVJhdygpICBidXQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgdGFyZ2V0IGFycmF5LgogICAvLyBUaGlzIGlzIF9ub3RfIGlubGluZWQsIGFzIHRoZSBjb21waWxlciBvZnRlbiBvcHRpbWl6ZXMgbWVtY3B5IGludG8gaW5saW5lCiAgIC8vIGNvcHkgbG9vcHMuIFNpbmNlIHRoaXMgZ2V0cyBjYWxsZWQgYnkgZXZlcnkgZmllbGQgd2l0aCBzdHJpbmcgb3IgYnl0ZXMKQEAgLTY0Myw4ICs3MjgsMjEgQEAKICAgdm9pZCBXcml0ZVN0cmluZyhjb25zdCBzdHJpbmcmIHN0cik7CiAgIC8vIExpa2UgV3JpdGVTdHJpbmcoKSAgYnV0IHdyaXRpbmcgZGlyZWN0bHkgdG8gdGhlIHRhcmdldCBhcnJheS4KICAgc3RhdGljIHVpbnQ4KiBXcml0ZVN0cmluZ1RvQXJyYXkoY29uc3Qgc3RyaW5nJiBzdHIsIHVpbnQ4KiB0YXJnZXQpOworICAvLyBXcml0ZSB0aGUgdmFyaW50LWVuY29kZWQgc2l6ZSBvZiBzdHIgZm9sbG93ZWQgYnkgc3RyLgorICBzdGF0aWMgdWludDgqIFdyaXRlU3RyaW5nV2l0aFNpemVUb0FycmF5KGNvbnN0IHN0cmluZyYgc3RyLCB1aW50OCogdGFyZ2V0KTsKIAogCisgIC8vIEluc3RydWN0cyB0aGUgQ29kZWRPdXRwdXRTdHJlYW0gdG8gYWxsb3cgdGhlIHVuZGVybHlpbmcKKyAgLy8gWmVyb0NvcHlPdXRwdXRTdHJlYW0gdG8gaG9sZCBwb2ludGVycyB0byB0aGUgb3JpZ2luYWwgc3RydWN0dXJlIGluc3RlYWQgb2YKKyAgLy8gY29weWluZywgaWYgaXQgc3VwcG9ydHMgaXQgKGkuZS4gb3V0cHV0LT5BbGxvd3NBbGlhc2luZygpIGlzIHRydWUpLiAgSWYgdGhlCisgIC8vIHVuZGVybHlpbmcgc3RyZWFtIGRvZXMgbm90IHN1cHBvcnQgYWxpYXNpbmcsIHRoZW4gZW5hYmxpbmcgaXQgaGFzIG5vCisgIC8vIGFmZmVjdC4gIEZvciBub3csIHRoaXMgb25seSBhZmZlY3RzIHRoZSBiZWhhdmlvciBvZgorICAvLyBXcml0ZVJhd01heWJlQWxpYXNlZCgpLgorICAvLworICAvLyBOT1RFOiBJdCBpcyBjYWxsZXIncyByZXNwb25zaWJpbGl0eSB0byBlbnN1cmUgdGhhdCB0aGUgY2h1bmsgb2YgbWVtb3J5CisgIC8vIHJlbWFpbnMgbGl2ZSB1bnRpbCBhbGwgb2YgdGhlIGRhdGEgaGFzIGJlZW4gY29uc3VtZWQgZnJvbSB0aGUgc3RyZWFtLgorICB2b2lkIEVuYWJsZUFsaWFzaW5nKGJvb2wgZW5hYmxlZCk7CisKICAgLy8gV3JpdGUgYSAzMi1iaXQgbGl0dGxlLWVuZGlhbiBpbnRlZ2VyLgogICB2b2lkIFdyaXRlTGl0dGxlRW5kaWFuMzIodWludDMyIHZhbHVlKTsKICAgLy8gTGlrZSBXcml0ZUxpdHRsZUVuZGlhbjMyKCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCkBAIC02NzgsOCArNzc2LDggQEAKICAgLy8gYnV0IEdDQyBieSBkZWZhdWx0IGRvZXNuJ3Qgd2FudCB0byBpbmxpbmUgdGhpcy4KICAgdm9pZCBXcml0ZVRhZyh1aW50MzIgdmFsdWUpOwogICAvLyBMaWtlIFdyaXRlVGFnKCkgIGJ1dCB3cml0aW5nIGRpcmVjdGx5IHRvIHRoZSB0YXJnZXQgYXJyYXkuCi0gIHN0YXRpYyB1aW50OCogV3JpdGVUYWdUb0FycmF5KAotICAgICAgdWludDMyIHZhbHVlLCB1aW50OCogdGFyZ2V0KSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CisgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgdWludDgqIFdyaXRlVGFnVG9BcnJheSh1aW50MzIgdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpOwogCiAgIC8vIFJldHVybnMgdGhlIG51bWJlciBvZiBieXRlcyBuZWVkZWQgdG8gZW5jb2RlIHRoZSBnaXZlbiB2YWx1ZSBhcyBhIHZhcmludC4KICAgc3RhdGljIGludCBWYXJpbnRTaXplMzIodWludDMyIHZhbHVlKTsKQEAgLTcxOSw2ICs4MTcsNyBAQAogICBpbnQgYnVmZmVyX3NpemVfOwogICBpbnQgdG90YWxfYnl0ZXNfOyAgLy8gU3VtIG9mIHNpemVzIG9mIGFsbCBidWZmZXJzIHNlZW4gc28gZmFyLgogICBib29sIGhhZF9lcnJvcl87ICAgLy8gV2hldGhlciBhbiBlcnJvciBvY2N1cnJlZCBkdXJpbmcgb3V0cHV0LgorICBib29sIGFsaWFzaW5nX2VuYWJsZWRfOyAgLy8gU2VlIEVuYWJsZUFsaWFzaW5nKCkuCiAKICAgLy8gQWR2YW5jZSB0aGUgYnVmZmVyIGJ5IGEgZ2l2ZW4gbnVtYmVyIG9mIGJ5dGVzLgogICB2b2lkIEFkdmFuY2UoaW50IGFtb3VudCk7CkBAIC03MjcsNyArODI2LDEzIEBACiAgIC8vIEFkdmFuY2UoYnVmZmVyX3NpemVfKS4KICAgYm9vbCBSZWZyZXNoKCk7CiAKLSAgc3RhdGljIHVpbnQ4KiBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5KHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCk7CisgIC8vIExpa2UgV3JpdGVSYXcoKSBidXQgbWF5IGF2b2lkIGNvcHlpbmcgaWYgdGhlIHVuZGVybHlpbmcKKyAgLy8gWmVyb0NvcHlPdXRwdXRTdHJlYW0gc3VwcG9ydHMgaXQuCisgIHZvaWQgV3JpdGVBbGlhc2VkUmF3KGNvbnN0IHZvaWQqIGJ1ZmZlciwgaW50IHNpemUpOworCisgIC8vIElmIHRoaXMgd3JpdGUgbWlnaHQgY3Jvc3MgdGhlIGVuZCBvZiB0aGUgYnVmZmVyLCB3ZSBjb21wb3NlIHRoZSBieXRlcyBmaXJzdAorICAvLyB0aGVuIHVzZSBXcml0ZVJhdygpLgorICB2b2lkIFdyaXRlVmFyaW50MzJTbG93UGF0aCh1aW50MzIgdmFsdWUpOwogCiAgIC8vIEFsd2F5cy1pbmxpbmVkIHZlcnNpb25zIG9mIFdyaXRlVmFyaW50KiBmdW5jdGlvbnMgc28gdGhhdCBjb2RlIGNhbiBiZQogICAvLyByZXVzZWQsIHdoaWxlIHN0aWxsIGNvbnRyb2xsaW5nIHNpemUuIEZvciBpbnN0YW5jZSwgV3JpdGVWYXJpbnQzMlRvQXJyYXkoKQpAQCAtNzM2LDEwICs4NDEsOCBAQAogICAvLyBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5LiAgTWVhbndoaWxlLCBXcml0ZVZhcmludDMyKCkgaXMgYWxyZWFkeQogICAvLyBvdXQtb2YtbGluZSwgc28gaXQgc2hvdWxkIGp1c3QgaW52b2tlIHRoaXMgZGlyZWN0bHkgdG8gYXZvaWQgYW55IGV4dHJhCiAgIC8vIGZ1bmN0aW9uIGNhbGwgb3ZlcmhlYWQuCi0gIHN0YXRpYyB1aW50OCogV3JpdGVWYXJpbnQzMkZhbGxiYWNrVG9BcnJheUlubGluZSgKLSAgICAgIHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCkgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOwotICBzdGF0aWMgdWludDgqIFdyaXRlVmFyaW50NjRUb0FycmF5SW5saW5lKAotICAgICAgdWludDY0IHZhbHVlLCB1aW50OCogdGFyZ2V0KSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CisgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBzdGF0aWMgdWludDgqIFdyaXRlVmFyaW50NjRUb0FycmF5SW5saW5lKAorICAgICAgdWludDY0IHZhbHVlLCB1aW50OCogdGFyZ2V0KTsKIAogICBzdGF0aWMgaW50IFZhcmludFNpemUzMkZhbGxiYWNrKHVpbnQzMiB2YWx1ZSk7CiB9OwpAQCAtNzQ5LDEzICs4NTIsMTggQEAKIC8vIG1ldGhvZHMgb3B0aW1pemUgZm9yIHRoYXQgY2FzZS4KIAogaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDMyKHVpbnQzMiogdmFsdWUpIHsKLSAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiAqYnVmZmVyXyA8IDB4ODApIHsKLSAgICAqdmFsdWUgPSAqYnVmZmVyXzsKLSAgICBBZHZhbmNlKDEpOwotICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBSZWFkVmFyaW50MzJGYWxsYmFjayh2YWx1ZSk7CisgIHVpbnQzMiB2ID0gMDsKKyAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSkgeworICAgIHYgPSAqYnVmZmVyXzsKKyAgICBpZiAodiA8IDB4ODApIHsKKyAgICAgICp2YWx1ZSA9IHY7CisgICAgICBBZHZhbmNlKDEpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQogICB9CisgIGludDY0IHJlc3VsdCA9IFJlYWRWYXJpbnQzMkZhbGxiYWNrKHYpOworICAqdmFsdWUgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHJlc3VsdCk7CisgIHJldHVybiByZXN1bHQgPj0gMDsKIH0KIAogaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFZhcmludDY0KHVpbnQ2NCogdmFsdWUpIHsKQEAgLTc2Myw5ICs4NzEsMTAgQEAKICAgICAqdmFsdWUgPSAqYnVmZmVyXzsKICAgICBBZHZhbmNlKDEpOwogICAgIHJldHVybiB0cnVlOwotICB9IGVsc2UgewotICAgIHJldHVybiBSZWFkVmFyaW50NjRGYWxsYmFjayh2YWx1ZSk7CiAgIH0KKyAgc3RkOjpwYWlyPHVpbnQ2NCwgYm9vbD4gcCA9IFJlYWRWYXJpbnQ2NEZhbGxiYWNrKCk7CisgICp2YWx1ZSA9IHAuZmlyc3Q7CisgIHJldHVybiBwLnNlY29uZDsKIH0KIAogLy8gc3RhdGljCkBAIC03NzMsNyArODgyLDExIEBACiAgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKICAgICB1aW50MzIqIHZhbHVlKSB7CiAjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorI2lmbmRlZiBTVEFSQk9BUkQKICAgbWVtY3B5KHZhbHVlLCBidWZmZXIsIHNpemVvZigqdmFsdWUpKTsKKyNlbHNlCisgIFNiTWVtb3J5Q29weSh2YWx1ZSwgYnVmZmVyLCBzaXplb2YoKnZhbHVlKSk7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAogICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CiAjZWxzZQogICAqdmFsdWUgPSAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMF0pICAgICAgKSB8CkBAIC03ODgsNyArOTAxLDExIEBACiAgICAgY29uc3QgdWludDgqIGJ1ZmZlciwKICAgICB1aW50NjQqIHZhbHVlKSB7CiAjaWYgZGVmaW5lZChQUk9UT0JVRl9MSVRUTEVfRU5ESUFOKQorI2lmbmRlZiBTVEFSQk9BUkQKICAgbWVtY3B5KHZhbHVlLCBidWZmZXIsIHNpemVvZigqdmFsdWUpKTsKKyNlbHNlCisgIFNiTWVtb3J5Q29weSh2YWx1ZSwgYnVmZmVyLCBzaXplb2YoKnZhbHVlKSk7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAogICByZXR1cm4gYnVmZmVyICsgc2l6ZW9mKCp2YWx1ZSk7CiAjZWxzZQogICB1aW50MzIgcGFydDAgPSAoc3RhdGljX2Nhc3Q8dWludDMyPihidWZmZXJbMF0pICAgICAgKSB8CkBAIC04MDgsNyArOTI1LDExIEBACiBpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpSZWFkTGl0dGxlRW5kaWFuMzIodWludDMyKiB2YWx1ZSkgewogI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKICAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoQnVmZmVyU2l6ZSgpID49IHN0YXRpY19jYXN0PGludD4oc2l6ZW9mKCp2YWx1ZSkpKSkgeworI2lmbmRlZiBTVEFSQk9BUkQKICAgICBtZW1jcHkodmFsdWUsIGJ1ZmZlcl8sIHNpemVvZigqdmFsdWUpKTsKKyNlbHNlCisgICAgU2JNZW1vcnlDb3B5KHZhbHVlLCBidWZmZXJfLCBzaXplb2YoKnZhbHVlKSk7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAogICAgIEFkdmFuY2Uoc2l6ZW9mKCp2YWx1ZSkpOwogICAgIHJldHVybiB0cnVlOwogICB9IGVsc2UgewpAQCAtODIyLDcgKzk0MywxMSBAQAogaW5saW5lIGJvb2wgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZExpdHRsZUVuZGlhbjY0KHVpbnQ2NCogdmFsdWUpIHsKICNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCiAgIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKEJ1ZmZlclNpemUoKSA+PSBzdGF0aWNfY2FzdDxpbnQ+KHNpemVvZigqdmFsdWUpKSkpIHsKKyNpZm5kZWYgU1RBUkJPQVJECiAgICAgbWVtY3B5KHZhbHVlLCBidWZmZXJfLCBzaXplb2YoKnZhbHVlKSk7CisjZWxzZQorICAgIFNiTWVtb3J5Q29weSh2YWx1ZSwgYnVmZmVyXywgc2l6ZW9mKCp2YWx1ZSkpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKICAgICBBZHZhbmNlKHNpemVvZigqdmFsdWUpKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfSBlbHNlIHsKQEAgLTgzNCwxNCArOTU5LDU4IEBACiB9CiAKIGlubGluZSB1aW50MzIgQ29kZWRJbnB1dFN0cmVhbTo6UmVhZFRhZygpIHsKLSAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSAmJiBidWZmZXJfWzBdIDwgMHg4MCkgewotICAgIGxhc3RfdGFnXyA9IGJ1ZmZlcl9bMF07Ci0gICAgQWR2YW5jZSgxKTsKLSAgICByZXR1cm4gbGFzdF90YWdfOwotICB9IGVsc2UgewotICAgIGxhc3RfdGFnXyA9IFJlYWRUYWdGYWxsYmFjaygpOwotICAgIHJldHVybiBsYXN0X3RhZ187CisgIHVpbnQzMiB2ID0gMDsKKyAgaWYgKEdPT0dMRV9QUkVESUNUX1RSVUUoYnVmZmVyXyA8IGJ1ZmZlcl9lbmRfKSkgeworICAgIHYgPSAqYnVmZmVyXzsKKyAgICBpZiAodiA8IDB4ODApIHsKKyAgICAgIGxhc3RfdGFnXyA9IHY7CisgICAgICBBZHZhbmNlKDEpOworICAgICAgcmV0dXJuIHY7CisgICAgfQogICB9CisgIGxhc3RfdGFnXyA9IFJlYWRUYWdGYWxsYmFjayh2KTsKKyAgcmV0dXJuIGxhc3RfdGFnXzsKK30KKworaW5saW5lIHN0ZDo6cGFpcjx1aW50MzIsIGJvb2w+IENvZGVkSW5wdXRTdHJlYW06OlJlYWRUYWdXaXRoQ3V0b2ZmKAorICAgIHVpbnQzMiBjdXRvZmYpIHsKKyAgLy8gSW4gcGVyZm9ybWFuY2Utc2Vuc2l0aXZlIGNvZGUgd2UgY2FuIGV4cGVjdCBjdXRvZmYgdG8gYmUgYSBjb21waWxlLXRpbWUKKyAgLy8gY29uc3RhbnQsIGFuZCB0aGluZ3MgbGlrZSAiY3V0b2ZmID49IGtNYXgxQnl0ZVZhcmludCIgdG8gYmUgZXZhbHVhdGVkIGF0CisgIC8vIGNvbXBpbGUgdGltZS4KKyAgdWludDMyIGZpcnN0X2J5dGVfb3JfemVybyA9IDA7CisgIGlmIChHT09HTEVfUFJFRElDVF9UUlVFKGJ1ZmZlcl8gPCBidWZmZXJfZW5kXykpIHsKKyAgICAvLyBIb3QgY2FzZTogYnVmZmVyXyBub25fZW1wdHksIGJ1ZmZlcl9bMF0gaW4gWzEsIDEyOCkuCisgICAgLy8gVE9ETyhncGlrZSk6IElzIGl0IHdvcnRoIHJlYXJyYW5naW5nIHRoaXM/IEUuZy4sIGlmIHRoZSBudW1iZXIgb2YgZmllbGRzCisgICAgLy8gaXMgbGFyZ2UgZW5vdWdoIHRoZW4gaXMgaXQgYmV0dGVyIHRvIGNoZWNrIGZvciB0aGUgdHdvLWJ5dGUgY2FzZSBmaXJzdD8KKyAgICBmaXJzdF9ieXRlX29yX3plcm8gPSBidWZmZXJfWzBdOworICAgIGlmIChzdGF0aWNfY2FzdDxpbnQ4PihidWZmZXJfWzBdKSA+IDApIHsKKyAgICAgIGNvbnN0IHVpbnQzMiBrTWF4MUJ5dGVWYXJpbnQgPSAweDdmOworICAgICAgdWludDMyIHRhZyA9IGxhc3RfdGFnXyA9IGJ1ZmZlcl9bMF07CisgICAgICBBZHZhbmNlKDEpOworICAgICAgcmV0dXJuIHN0ZDo6bWFrZV9wYWlyKHRhZywgY3V0b2ZmID49IGtNYXgxQnl0ZVZhcmludCB8fCB0YWcgPD0gY3V0b2ZmKTsKKyAgICB9CisgICAgLy8gT3RoZXIgaG90IGNhc2U6IGN1dG9mZiA+PSAweDgwLCBidWZmZXJfIGhhcyBhdCBsZWFzdCB0d28gYnl0ZXMgYXZhaWxhYmxlLAorICAgIC8vIGFuZCB0YWcgaXMgdHdvIGJ5dGVzLiAgVGhlIGxhdHRlciBpcyB0ZXN0ZWQgYnkgYml0d2lzZS1hbmQtbm90IG9mIHRoZQorICAgIC8vIGZpcnN0IGJ5dGUgYW5kIHRoZSBzZWNvbmQgYnl0ZS4KKyAgICBpZiAoY3V0b2ZmID49IDB4ODAgJiYKKyAgICAgICAgR09PR0xFX1BSRURJQ1RfVFJVRShidWZmZXJfICsgMSA8IGJ1ZmZlcl9lbmRfKSAmJgorICAgICAgICBHT09HTEVfUFJFRElDVF9UUlVFKChidWZmZXJfWzBdICYgfmJ1ZmZlcl9bMV0pID49IDB4ODApKSB7CisgICAgICBjb25zdCB1aW50MzIga01heDJCeXRlVmFyaW50ID0gKDB4N2YgPDwgNykgKyAweDdmOworICAgICAgdWludDMyIHRhZyA9IGxhc3RfdGFnXyA9ICgxdSA8PCA3KSAqIGJ1ZmZlcl9bMV0gKyAoYnVmZmVyX1swXSAtIDB4ODApOworICAgICAgQWR2YW5jZSgyKTsKKyAgICAgIC8vIEl0IG1pZ2h0IG1ha2Ugc2Vuc2UgdG8gdGVzdCBmb3IgdGFnID09IDAgbm93LCBidXQgaXQgaXMgc28gcmFyZSB0aGF0CisgICAgICAvLyB0aGF0IHdlIGRvbid0IGJvdGhlci4gIEEgdmFyaW50LWVuY29kZWQgMCBzaG91bGQgYmUgb25lIGJ5dGUgdW5sZXNzCisgICAgICAvLyB0aGUgZW5jb2RlciBsb3N0IGl0cyBtaW5kLiAgVGhlIHNlY29uZCBwYXJ0IG9mIHRoZSByZXR1cm4gdmFsdWUgb2YKKyAgICAgIC8vIHRoaXMgZnVuY3Rpb24gaXMgYWxsb3dlZCB0byBiZSBlaXRoZXIgdHJ1ZSBvciBmYWxzZSBpZiB0aGUgdGFnIGlzIDAsCisgICAgICAvLyBzbyB3ZSBkb24ndCBoYXZlIHRvIGNoZWNrIGZvciB0YWcgPT0gMC4gIFdlIG1heSBuZWVkIHRvIGNoZWNrIHdoZXRoZXIKKyAgICAgIC8vIGl0IGV4Y2VlZHMgY3V0b2ZmLgorICAgICAgYm9vbCBhdF9vcl9iZWxvd19jdXRvZmYgPSBjdXRvZmYgPj0ga01heDJCeXRlVmFyaW50IHx8IHRhZyA8PSBjdXRvZmY7CisgICAgICByZXR1cm4gc3RkOjptYWtlX3BhaXIodGFnLCBhdF9vcl9iZWxvd19jdXRvZmYpOworICAgIH0KKyAgfQorICAvLyBTbG93IHBhdGgKKyAgbGFzdF90YWdfID0gUmVhZFRhZ0ZhbGxiYWNrKGZpcnN0X2J5dGVfb3JfemVybyk7CisgIHJldHVybiBzdGQ6Om1ha2VfcGFpcihsYXN0X3RhZ18sIHN0YXRpY19jYXN0PHVpbnQzMj4obGFzdF90YWdfIC0gMSkgPCBjdXRvZmYpOwogfQogCiBpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpMYXN0VGFnV2FzKHVpbnQzMiBleHBlY3RlZCkgewpAQCAtOTAwLDcgKzEwNjksOSBAQAogICAvLyBJZiB3ZSBhcmUgYXQgYSBsaW1pdCB3ZSBrbm93IG5vIG1vcmUgYnl0ZXMgY2FuIGJlIHJlYWQuICBPdGhlcndpc2UsIGl0J3MKICAgLy8gaGFyZCB0byBzYXkgd2l0aG91dCBjYWxsaW5nIFJlZnJlc2goKSwgYW5kIHdlJ2QgcmF0aGVyIG5vdCBkbyB0aGF0LgogCi0gIGlmIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfICYmIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyAhPSAwKSB7CisgIGlmIChidWZmZXJfID09IGJ1ZmZlcl9lbmRfICYmCisgICAgICAoKGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0XyAhPSAwKSB8fAorICAgICAgICh0b3RhbF9ieXRlc19yZWFkXyA9PSBjdXJyZW50X2xpbWl0XykpKSB7CiAgICAgbGFzdF90YWdfID0gMDsgICAgICAgICAgICAgICAgICAgLy8gUHJldGVuZCB3ZSBjYWxsZWQgUmVhZFRhZygpLi4uCiAgICAgbGVnaXRpbWF0ZV9tZXNzYWdlX2VuZF8gPSB0cnVlOyAgLy8gLi4uIGFuZCBpdCBoaXQgRU9GLgogICAgIHJldHVybiB0cnVlOwpAQCAtOTA5LDYgKzEwODAsMTAgQEAKICAgfQogfQogCitpbmxpbmUgaW50IENvZGVkSW5wdXRTdHJlYW06OkN1cnJlbnRQb3NpdGlvbigpIGNvbnN0IHsKKyAgcmV0dXJuIHRvdGFsX2J5dGVzX3JlYWRfIC0gKEJ1ZmZlclNpemUoKSArIGJ1ZmZlcl9zaXplX2FmdGVyX2xpbWl0Xyk7Cit9CisKIGlubGluZSB1aW50OCogQ29kZWRPdXRwdXRTdHJlYW06OkdldERpcmVjdEJ1ZmZlckZvck5CeXRlc0FuZEFkdmFuY2UoaW50IHNpemUpIHsKICAgaWYgKGJ1ZmZlcl9zaXplXyA8IHNpemUpIHsKICAgICByZXR1cm4gTlVMTDsKQEAgLTkyMCwxMyArMTA5NSwxNCBAQAogfQogCiBpbmxpbmUgdWludDgqIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh1aW50MzIgdmFsdWUsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgaWYgKHZhbHVlIDwgMHg4MCkgewotICAgICp0YXJnZXQgPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUpOwotICAgIHJldHVybiB0YXJnZXQgKyAxOwotICB9IGVsc2UgewotICAgIHJldHVybiBXcml0ZVZhcmludDMyRmFsbGJhY2tUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgeworICB3aGlsZSAodmFsdWUgPj0gMHg4MCkgeworICAgICp0YXJnZXQgPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgfCAweDgwKTsKKyAgICB2YWx1ZSA+Pj0gNzsKKyAgICArK3RhcmdldDsKICAgfQorICAqdGFyZ2V0ID0gc3RhdGljX2Nhc3Q8dWludDg+KHZhbHVlKTsKKyAgcmV0dXJuIHRhcmdldCArIDE7CiB9CiAKIGlubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyU2lnbkV4dGVuZGVkKGludDMyIHZhbHVlKSB7CkBAIC05NDksOCArMTEyNSwxMiBAQAogaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW4zMlRvQXJyYXkodWludDMyIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewogI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKKyNpZm5kZWYgU1RBUkJPQVJECiAgIG1lbWNweSh0YXJnZXQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAjZWxzZQorICBTYk1lbW9yeUNvcHkodGFyZ2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyNlbHNlCiAgIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSk7CiAgIHRhcmdldFsxXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSA+PiAgOCk7CiAgIHRhcmdldFsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSA+PiAxNik7CkBAIC05NjIsOCArMTE0MiwxMiBAQAogaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVMaXR0bGVFbmRpYW42NFRvQXJyYXkodWludDY0IHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewogI2lmIGRlZmluZWQoUFJPVE9CVUZfTElUVExFX0VORElBTikKKyNpZm5kZWYgU1RBUkJPQVJECiAgIG1lbWNweSh0YXJnZXQsICZ2YWx1ZSwgc2l6ZW9mKHZhbHVlKSk7CiAjZWxzZQorICBTYk1lbW9yeUNvcHkodGFyZ2V0LCAmdmFsdWUsIHNpemVvZih2YWx1ZSkpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyNlbHNlCiAgIHVpbnQzMiBwYXJ0MCA9IHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUpOwogICB1aW50MzIgcGFydDEgPSBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlID4+IDMyKTsKIApAQCAtOTc5LDIyICsxMTYzLDI2IEBACiAgIHJldHVybiB0YXJnZXQgKyBzaXplb2YodmFsdWUpOwogfQogCitpbmxpbmUgdm9pZCBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMih1aW50MzIgdmFsdWUpIHsKKyAgaWYgKGJ1ZmZlcl9zaXplXyA+PSA1KSB7CisgICAgLy8gRmFzdCBwYXRoOiAgV2UgaGF2ZSBlbm91Z2ggYnl0ZXMgbGVmdCBpbiB0aGUgYnVmZmVyIHRvIGd1YXJhbnRlZSB0aGF0CisgICAgLy8gdGhpcyB3cml0ZSB3b24ndCBjcm9zcyB0aGUgZW5kLCBzbyB3ZSBjYW4gc2tpcCB0aGUgY2hlY2tzLgorICAgIHVpbnQ4KiB0YXJnZXQgPSBidWZmZXJfOworICAgIHVpbnQ4KiBlbmQgPSBXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKKyAgICBpbnQgc2l6ZSA9IHN0YXRpY19jYXN0PGludD4oZW5kIC0gdGFyZ2V0KTsKKyAgICBBZHZhbmNlKHNpemUpOworICB9IGVsc2UgeworICAgIFdyaXRlVmFyaW50MzJTbG93UGF0aCh2YWx1ZSk7CisgIH0KK30KKwogaW5saW5lIHZvaWQgQ29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnKHVpbnQzMiB2YWx1ZSkgewogICBXcml0ZVZhcmludDMyKHZhbHVlKTsKIH0KIAogaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAogICAgIHVpbnQzMiB2YWx1ZSwgdWludDgqIHRhcmdldCkgewotICBpZiAodmFsdWUgPCAoMSA8PCA3KSkgewotICAgIHRhcmdldFswXSA9IHN0YXRpY19jYXN0PHVpbnQ4Pih2YWx1ZSk7Ci0gICAgcmV0dXJuIHRhcmdldCArIDE7Ci0gIH0gZWxzZSBpZiAodmFsdWUgPCAoMSA8PCAxNCkpIHsKLSAgICB0YXJnZXRbMF0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgfCAweDgwKTsKLSAgICB0YXJnZXRbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4odmFsdWUgPj4gNyk7Ci0gICAgcmV0dXJuIHRhcmdldCArIDI7Ci0gIH0gZWxzZSB7Ci0gICAgcmV0dXJuIFdyaXRlVmFyaW50MzJGYWxsYmFja1RvQXJyYXkodmFsdWUsIHRhcmdldCk7Ci0gIH0KKyAgcmV0dXJuIFdyaXRlVmFyaW50MzJUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwogfQogCiBpbmxpbmUgaW50IENvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIodWludDMyIHZhbHVlKSB7CkBAIC0xMDE3LDYgKzEyMDUsMTUgQEAKICAgV3JpdGVSYXcoc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzdHIuc2l6ZSgpKSk7CiB9CiAKK2lubGluZSB2b2lkIENvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVJhd01heWJlQWxpYXNlZCgKKyAgICBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSkgeworICBpZiAoYWxpYXNpbmdfZW5hYmxlZF8pIHsKKyAgICBXcml0ZUFsaWFzZWRSYXcoZGF0YSwgc2l6ZSk7CisgIH0gZWxzZSB7CisgICAgV3JpdGVSYXcoZGF0YSwgc2l6ZSk7CisgIH0KK30KKwogaW5saW5lIHVpbnQ4KiBDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KAogICAgIGNvbnN0IHN0cmluZyYgc3RyLCB1aW50OCogdGFyZ2V0KSB7CiAgIHJldHVybiBXcml0ZVJhd1RvQXJyYXkoc3RyLmRhdGEoKSwgc3RhdGljX2Nhc3Q8aW50PihzdHIuc2l6ZSgpKSwgdGFyZ2V0KTsKQEAgLTEwMzYsMTkgKzEyMzMsMjUgQEAKIH0KIAogaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6U2V0UmVjdXJzaW9uTGltaXQoaW50IGxpbWl0KSB7CisgIHJlY3Vyc2lvbl9idWRnZXRfICs9IGxpbWl0IC0gcmVjdXJzaW9uX2xpbWl0XzsKICAgcmVjdXJzaW9uX2xpbWl0XyA9IGxpbWl0OwogfQogCiBpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpJbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpIHsKLSAgKytyZWN1cnNpb25fZGVwdGhfOwotICByZXR1cm4gcmVjdXJzaW9uX2RlcHRoXyA8PSByZWN1cnNpb25fbGltaXRfOworICAtLXJlY3Vyc2lvbl9idWRnZXRfOworICByZXR1cm4gcmVjdXJzaW9uX2J1ZGdldF8gPj0gMDsKIH0KIAogaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKSB7Ci0gIGlmIChyZWN1cnNpb25fZGVwdGhfID4gMCkgLS1yZWN1cnNpb25fZGVwdGhfOworICBpZiAocmVjdXJzaW9uX2J1ZGdldF8gPCByZWN1cnNpb25fbGltaXRfKSArK3JlY3Vyc2lvbl9idWRnZXRfOwogfQogCi1pbmxpbmUgdm9pZCBDb2RlZElucHV0U3RyZWFtOjpTZXRFeHRlbnNpb25SZWdpc3RyeShEZXNjcmlwdG9yUG9vbCogcG9vbCwKK2lubGluZSB2b2lkIENvZGVkSW5wdXRTdHJlYW06OlVuc2FmZURlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkgeworICBhc3NlcnQocmVjdXJzaW9uX2J1ZGdldF8gPCByZWN1cnNpb25fbGltaXRfKTsKKyAgKytyZWN1cnNpb25fYnVkZ2V0XzsKK30KKworaW5saW5lIHZvaWQgQ29kZWRJbnB1dFN0cmVhbTo6U2V0RXh0ZW5zaW9uUmVnaXN0cnkoY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSkgewogICBleHRlbnNpb25fcG9vbF8gPSBwb29sOwogICBleHRlbnNpb25fZmFjdG9yeV8gPSBmYWN0b3J5OwpAQCAtMTA2Nyw5ICsxMjcwLDkgQEAKIH0KIAogaW5saW5lIENvZGVkSW5wdXRTdHJlYW06OkNvZGVkSW5wdXRTdHJlYW0oWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQpCi0gIDogaW5wdXRfKGlucHV0KSwKLSAgICBidWZmZXJfKE5VTEwpLAorICA6IGJ1ZmZlcl8oTlVMTCksCiAgICAgYnVmZmVyX2VuZF8oTlVMTCksCisgICAgaW5wdXRfKGlucHV0KSwKICAgICB0b3RhbF9ieXRlc19yZWFkXygwKSwKICAgICBvdmVyZmxvd19ieXRlc18oMCksCiAgICAgbGFzdF90YWdfKDApLApAQCAtMTA3OSw4ICsxMjgyLDggQEAKICAgICBidWZmZXJfc2l6ZV9hZnRlcl9saW1pdF8oMCksCiAgICAgdG90YWxfYnl0ZXNfbGltaXRfKGtEZWZhdWx0VG90YWxCeXRlc0xpbWl0KSwKICAgICB0b3RhbF9ieXRlc193YXJuaW5nX3RocmVzaG9sZF8oa0RlZmF1bHRUb3RhbEJ5dGVzV2FybmluZ1RocmVzaG9sZCksCi0gICAgcmVjdXJzaW9uX2RlcHRoXygwKSwKLSAgICByZWN1cnNpb25fbGltaXRfKGtEZWZhdWx0UmVjdXJzaW9uTGltaXQpLAorICAgIHJlY3Vyc2lvbl9idWRnZXRfKGRlZmF1bHRfcmVjdXJzaW9uX2xpbWl0XyksCisgICAgcmVjdXJzaW9uX2xpbWl0XyhkZWZhdWx0X3JlY3Vyc2lvbl9saW1pdF8pLAogICAgIGV4dGVuc2lvbl9wb29sXyhOVUxMKSwKICAgICBleHRlbnNpb25fZmFjdG9yeV8oTlVMTCkgewogICAvLyBFYWdlcmx5IFJlZnJlc2goKSBzbyBidWZmZXIgc3BhY2UgaXMgaW1tZWRpYXRlbHkgYXZhaWxhYmxlLgpAQCAtMTA4OCw5ICsxMjkxLDkgQEAKIH0KIAogaW5saW5lIENvZGVkSW5wdXRTdHJlYW06OkNvZGVkSW5wdXRTdHJlYW0oY29uc3QgdWludDgqIGJ1ZmZlciwgaW50IHNpemUpCi0gIDogaW5wdXRfKE5VTEwpLAotICAgIGJ1ZmZlcl8oYnVmZmVyKSwKKyAgOiBidWZmZXJfKGJ1ZmZlciksCiAgICAgYnVmZmVyX2VuZF8oYnVmZmVyICsgc2l6ZSksCisgICAgaW5wdXRfKE5VTEwpLAogICAgIHRvdGFsX2J5dGVzX3JlYWRfKHNpemUpLAogICAgIG92ZXJmbG93X2J5dGVzXygwKSwKICAgICBsYXN0X3RhZ18oMCksCkBAIC0xMTAwLDI3ICsxMzAzLDI1IEBACiAgICAgYnVmZmVyX3NpemVfYWZ0ZXJfbGltaXRfKDApLAogICAgIHRvdGFsX2J5dGVzX2xpbWl0XyhrRGVmYXVsdFRvdGFsQnl0ZXNMaW1pdCksCiAgICAgdG90YWxfYnl0ZXNfd2FybmluZ190aHJlc2hvbGRfKGtEZWZhdWx0VG90YWxCeXRlc1dhcm5pbmdUaHJlc2hvbGQpLAotICAgIHJlY3Vyc2lvbl9kZXB0aF8oMCksCi0gICAgcmVjdXJzaW9uX2xpbWl0XyhrRGVmYXVsdFJlY3Vyc2lvbkxpbWl0KSwKKyAgICByZWN1cnNpb25fYnVkZ2V0XyhkZWZhdWx0X3JlY3Vyc2lvbl9saW1pdF8pLAorICAgIHJlY3Vyc2lvbl9saW1pdF8oZGVmYXVsdF9yZWN1cnNpb25fbGltaXRfKSwKICAgICBleHRlbnNpb25fcG9vbF8oTlVMTCksCiAgICAgZXh0ZW5zaW9uX2ZhY3RvcnlfKE5VTEwpIHsKICAgLy8gTm90ZSB0aGF0IHNldHRpbmcgY3VycmVudF9saW1pdF8gPT0gc2l6ZSBpcyBpbXBvcnRhbnQgdG8gcHJldmVudCBzb21lCiAgIC8vIGNvZGUgcGF0aHMgZnJvbSB0cnlpbmcgdG8gYWNjZXNzIGlucHV0XyBhbmQgc2VnZmF1bHRpbmcuCiB9CiAKLWlubGluZSBDb2RlZElucHV0U3RyZWFtOjp+Q29kZWRJbnB1dFN0cmVhbSgpIHsKLSAgaWYgKGlucHV0XyAhPSBOVUxMKSB7Ci0gICAgQmFja1VwSW5wdXRUb0N1cnJlbnRQb3NpdGlvbigpOwotICB9CitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpJc0ZsYXQoKSBjb25zdCB7CisgIHJldHVybiBpbnB1dF8gPT0gTlVMTDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGlvCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIAogCi0jaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgX01TQ19WRVIgPj0gMTMwMAorI2lmIF9NU0NfVkVSID49IDEzMDAgJiYgIWRlZmluZWQoX19JTlRFTF9DT01QSUxFUikKICAgI3ByYWdtYSBydW50aW1lX2NoZWNrcygiYyIsIHJlc3RvcmUpCi0jZW5kaWYgIC8vIF9NU0NfVkVSCisjZW5kaWYgIC8vIF9NU0NfVkVSICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCiAKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKICNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX0lPX0NPREVEX1NUUkVBTV9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV9pbmwuaAppbmRleCBlOTc5OWQ0Li4xNDQzZjRmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1faW5sLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX2lubC5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNiw5ICszNiwxMiBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfSU9fQ09ERURfU1RSRUFNX0lOTF9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX0NPREVEX1NUUkVBTV9JTkxfSF9fCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CiAjaW5jbHVkZSA8c3RyaW5nPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNTAsMTQgKzUzLDQ5IEBACiAKICAgaWYgKEJ1ZmZlclNpemUoKSA+PSBzaXplKSB7CiAgICAgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZChidWZmZXIsIHNpemUpOwotICAgIG1lbWNweShzdHJpbmdfYXNfYXJyYXkoYnVmZmVyKSwgYnVmZmVyXywgc2l6ZSk7Ci0gICAgQWR2YW5jZShzaXplKTsKKyAgICBzdGQ6OnBhaXI8Y2hhciosIGJvb2w+IHogPSBhc19zdHJpbmdfZGF0YShidWZmZXIpOworICAgIGlmICh6LnNlY29uZCkgeworICAgICAgLy8gT2RkbHkgZW5vdWdoLCBtZW1jcHkoKSByZXF1aXJlcyBpdHMgZmlyc3QgdHdvIGFyZ3MgdG8gYmUgbm9uLU5VTEwgZXZlbgorICAgICAgLy8gaWYgd2UgY29weSAwIGJ5dGVzLiAgU28sIHdlIGhhdmUgZW5zdXJlZCB0aGF0IHouZmlyc3QgaXMgbm9uLU5VTEwgaGVyZS4KKyAgICAgIEdPT0dMRV9EQ0hFQ0soei5maXJzdCAhPSBOVUxMKTsKKyNpZm5kZWYgU1RBUkJPQVJECisgICAgICBtZW1jcHkoei5maXJzdCwgYnVmZmVyXywgc2l6ZSk7CisjZWxzZQorICAgICAgU2JNZW1vcnlDb3B5KHouZmlyc3QsIGJ1ZmZlcl8sIHNpemUpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyAgICAgIEFkdmFuY2Uoc2l6ZSk7CisgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9CiAKICAgcmV0dXJuIFJlYWRTdHJpbmdGYWxsYmFjayhidWZmZXIsIHNpemUpOwogfQogCitpbmxpbmUgYm9vbCBDb2RlZElucHV0U3RyZWFtOjpJbnRlcm5hbFJlYWRSYXdJbmxpbmUodm9pZCogYnVmZmVyLCBpbnQgc2l6ZSkgeworICBpbnQgY3VycmVudF9idWZmZXJfc2l6ZTsKKyAgd2hpbGUgKChjdXJyZW50X2J1ZmZlcl9zaXplID0gQnVmZmVyU2l6ZSgpKSA8IHNpemUpIHsKKyAgICAvLyBSZWFkaW5nIHBhc3QgZW5kIG9mIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBoYXZlLCB0aGVuIHJlZnJlc2guCisjaWZuZGVmIFNUQVJCT0FSRAorICAgIG1lbWNweShidWZmZXIsIGJ1ZmZlcl8sIGN1cnJlbnRfYnVmZmVyX3NpemUpOworI2Vsc2UKKyAgICBTYk1lbW9yeUNvcHkoYnVmZmVyLCBidWZmZXJfLCBjdXJyZW50X2J1ZmZlcl9zaXplKTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisgICAgYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGJ1ZmZlcikgKyBjdXJyZW50X2J1ZmZlcl9zaXplOworICAgIHNpemUgLT0gY3VycmVudF9idWZmZXJfc2l6ZTsKKyAgICBBZHZhbmNlKGN1cnJlbnRfYnVmZmVyX3NpemUpOworICAgIGlmICghUmVmcmVzaCgpKSByZXR1cm4gZmFsc2U7CisgIH0KKworI2lmbmRlZiBTVEFSQk9BUkQKKyAgbWVtY3B5KGJ1ZmZlciwgYnVmZmVyXywgc2l6ZSk7CisjZWxzZQorICBTYk1lbW9yeUNvcHkoYnVmZmVyLCBidWZmZXJfLCBzaXplKTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisgIEFkdmFuY2Uoc2l6ZSk7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBpbwogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1fdW5pdHRlc3QuY2MKaW5kZXggZmYyNjhhYi4uYTgxMDhlNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbV91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzQsNiArMzQsMTAgQEAKIC8vCiAvLyBUaGlzIGZpbGUgY29udGFpbnMgdGVzdHMgYW5kIGJlbmNobWFya3MuCiAKKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8dmVjdG9yPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgpAQCAtNDEsMTAgKzQ1LDExIEBACiAjaW5jbHVkZSA8bGltaXRzLmg+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogCiAKIC8vIFRoaXMgZGVjbGFyZXMgYW4gdW5zaWduZWQgbG9uZyBsb25nIGludGVnZXIgbGl0ZXJhbCBpbiBhIHBvcnRhYmxlIHdheS4KQEAgLTEyNSw2ICsxMzAsMTMgQEAKIAogY2xhc3MgQ29kZWRTdHJlYW1UZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHByb3RlY3RlZDoKKyAgLy8gSGVscGVyIG1ldGhvZCB1c2VkIGJ5IHRlc3RzIGZvciBieXRlcyB3YXJuaW5nLiBTZWUgaW1wbGVtZW50YXRpb24gY29tbWVudAorICAvLyBmb3IgZnVydGhlciBpbmZvcm1hdGlvbi4KKyAgc3RhdGljIHZvaWQgU2V0dXBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nVGVzdCgKKyAgICAgIGludCB0b3RhbF9ieXRlc19saW1pdCwgaW50IHdhcm5pbmdfdGhyZXNob2xkLAorICAgICAgdmVjdG9yPHN0cmluZz4qIG91dF9lcnJvcnMsIHZlY3RvcjxzdHJpbmc+KiBvdXRfd2FybmluZ3MpOworCisgIC8vIEJ1ZmZlciB1c2VkIGR1cmluZyBtb3N0IG9mIHRoZSB0ZXN0cy4gVGhpcyBhc3N1bWVzIHRlc3RzIHJ1biBzZXF1ZW50aWFsbHkuCiAgIHN0YXRpYyBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAxMDI0ICogNjQ7CiAgIHN0YXRpYyB1aW50OCBidWZmZXJfW2tCdWZmZXJTaXplXTsKIH07CkBAIC0xMzgsNiArMTUwLDcgQEAKIC8vIGNoZWNrcy4KIGNvbnN0IGludCBrQmxvY2tTaXplc1tdID0gezEsIDIsIDMsIDUsIDcsIDEzLCAzMiwgMTAyNH07CiAKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gVmFyaW50IHRlc3RzLgogCkBAIC00OTUsMTEgKzUwOCwxMSBAQAogfTsKIAogaW5saW5lIHN0ZDo6b3N0cmVhbSYgb3BlcmF0b3I8PChzdGQ6Om9zdHJlYW0mIG9zLCBjb25zdCBGaXhlZDMyQ2FzZSYgYykgewotICByZXR1cm4gb3MgPDwgIjB4IiA8PCBoZXggPDwgYy52YWx1ZSA8PCBkZWM7CisgIHJldHVybiBvcyA8PCAiMHgiIDw8IHN0ZDo6aGV4IDw8IGMudmFsdWUgPDwgc3RkOjpkZWM7CiB9CiAKIGlubGluZSBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvcywgY29uc3QgRml4ZWQ2NENhc2UmIGMpIHsKLSAgcmV0dXJuIG9zIDw8ICIweCIgPDwgaGV4IDw8IGMudmFsdWUgPDwgZGVjOworICByZXR1cm4gb3MgPDwgIjB4IiA8PCBzdGQ6OmhleCA8PCBjLnZhbHVlIDw8IHN0ZDo6ZGVjOwogfQogCiBGaXhlZDMyQ2FzZSBrRml4ZWQzMkNhc2VzW10gPSB7CkBAIC02NzAsMjAgKzY4MywyMDMgQEAKIH0KIAogVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ0ltcG9zc2libHlMYXJnZUZyb21TdHJpbmdPbkhlYXApIHsKLSAgc2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXIobmV3IHVpbnQ4WzhdKTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXIobmV3IHVpbnQ4WzhdKTsKICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dChidWZmZXIuZ2V0KCksIDgpOwogICBzdHJpbmcgc3RyOwogICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxIDw8IDMwKSk7CiB9CiAKK1RFU1RfMUQoQ29kZWRTdHJlYW1UZXN0LCBSZWFkU3RyaW5nUmVzZXJ2ZXNNZW1vcnlPblRvdGFsTGltaXQsIGtCbG9ja1NpemVzKSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIGtCbG9ja1NpemVzX2Nhc2UpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgICAgY29kZWRfaW5wdXQuU2V0VG90YWxCeXRlc0xpbWl0KHNpemVvZihrUmF3Qnl0ZXMpLCBzaXplb2Yoa1Jhd0J5dGVzKSk7CisgICAgRVhQRUNUX0VRKHNpemVvZihrUmF3Qnl0ZXMpLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkpOworCisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIHN0cmxlbihrUmF3Qnl0ZXMpKSk7CisgICAgRVhQRUNUX0VRKHNpemVvZihrUmF3Qnl0ZXMpIC0gc3RybGVuKGtSYXdCeXRlcyksCisgICAgICAgICAgICAgIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7CisgICAgRVhQRUNUX0VRKGtSYXdCeXRlcywgc3RyKTsKKyAgICAvLyBUT0RPKGxpdWppc2kpOiBSZXBsYWNlIHdpdGggYSBtb3JlIG1lYW5pbmdmdWwgdGVzdCAoc2VlIGNsLzYwOTY2MDIzKS4KKyAgICBFWFBFQ1RfR0Uoc3RyLmNhcGFjaXR5KCksIHN0cmxlbihrUmF3Qnl0ZXMpKTsKKyAgfQorCisgIEVYUEVDVF9FUShzdHJsZW4oa1Jhd0J5dGVzKSwgaW5wdXQuQnl0ZUNvdW50KCkpOworfQorCitURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ1Jlc2VydmVzTWVtb3J5T25QdXNoZWRMaW1pdCwga0Jsb2NrU2l6ZXMpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwga0Jsb2NrU2l6ZXNfY2FzZSk7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoc2l6ZW9mKGJ1ZmZlcl8pKTsKKworICAgIHN0cmluZyBzdHI7CisgICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOworICAgIEVYUEVDVF9FUShrUmF3Qnl0ZXMsIHN0cik7CisgICAgLy8gVE9ETyhsaXVqaXNpKTogUmVwbGFjZSB3aXRoIGEgbW9yZSBtZWFuaW5nZnVsIHRlc3QgKHNlZSBjbC82MDk2NjAyMykuCisgICAgRVhQRUNUX0dFKHN0ci5jYXBhY2l0eSgpLCBzdHJsZW4oa1Jhd0J5dGVzKSk7CisgIH0KKworICBFWFBFQ1RfRVEoc3RybGVuKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ05vUmVzZXJ2YXRpb25JZkxpbWl0c05vdFNldCkgeworICBtZW1jcHkoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7CisgIC8vIEJ1ZmZlciBzaXplIGluIHRoZSBpbnB1dCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBzaXplb2Yoa1Jhd0J5dGVzKSwKKyAgLy8gb3RoZXJ3aXNlIGNoZWNrIGFnYWluc3QgY2FwYWNpdHkgd2lsbCBmYWlsIGFzIFJlYWRTdHJpbmdJbmxpbmUoKQorICAvLyB3aWxsIGhhbmRsZSB0aGUgcmVhZGluZyBhbmQgd2lsbCByZXNlcnZlIHRoZSBtZW1vcnkgYXMgbmVlZGVkLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgMzIpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisKKyAgICBzdHJpbmcgc3RyOworICAgIEVYUEVDVF9UUlVFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKGtSYXdCeXRlcykpKTsKKyAgICBFWFBFQ1RfRVEoa1Jhd0J5dGVzLCBzdHIpOworICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgZGVwZW5kcyBvbiBzdHJpbmcgY2xhc3MgaW1wbGVtZW50YXRpb24uIEl0CisgICAgLy8gZXhwZWN0cyB0aGF0IHN0cmluZyB3aWxsIGFsbG9jYXRlIG1vcmUgdGhhbiBzdHJsZW4oa1Jhd0J5dGVzKQorICAgIC8vIGlmIHRoZSBjb250ZW50IG9mIGtSYXdCeXRlcyBpcyBhcHBlbmRlZCB0byBzdHJpbmcgaW4gc21hbGwKKyAgICAvLyBjaHVua3MuCisgICAgLy8gVE9ETyhsaXVqaXNpKTogUmVwbGFjZSB3aXRoIGEgbW9yZSBtZWFuaW5nZnVsIHRlc3QgKHNlZSBjbC82MDk2NjAyMykuCisgICAgRVhQRUNUX0dFKHN0ci5jYXBhY2l0eSgpLCBzdHJsZW4oa1Jhd0J5dGVzKSk7CisgIH0KKworICBFWFBFQ1RfRVEoc3RybGVuKGtSYXdCeXRlcyksIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ05vUmVzZXJ2YXRpb25TaXplSXNOZWdhdGl2ZSkgeworICBtZW1jcHkoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7CisgIC8vIEJ1ZmZlciBzaXplIGluIHRoZSBpbnB1dCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBzaXplb2Yoa1Jhd0J5dGVzKSwKKyAgLy8gb3RoZXJ3aXNlIGNoZWNrIGFnYWluc3QgY2FwYWNpdHkgd2lsbCBmYWlsIGFzIFJlYWRTdHJpbmdJbmxpbmUoKQorICAvLyB3aWxsIGhhbmRsZSB0aGUgcmVhZGluZyBhbmQgd2lsbCByZXNlcnZlIHRoZSBtZW1vcnkgYXMgbmVlZGVkLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgMzIpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgICAgY29kZWRfaW5wdXQuUHVzaExpbWl0KHNpemVvZihidWZmZXJfKSk7CisKKyAgICBzdHJpbmcgc3RyOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIC0xKSk7CisgICAgLy8gTm90ZTogdGhpcyBjaGVjayBkZXBlbmRzIG9uIHN0cmluZyBjbGFzcyBpbXBsZW1lbnRhdGlvbi4gSXQKKyAgICAvLyBleHBlY3RzIHRoYXQgc3RyaW5nIHdpbGwgYWx3YXlzIGFsbG9jYXRlIHRoZSBzYW1lIGFtb3VudCBvZgorICAgIC8vIG1lbW9yeSBmb3IgYW4gZW1wdHkgc3RyaW5nLgorICAgIEVYUEVDVF9FUShzdHJpbmcoKS5jYXBhY2l0eSgpLCBzdHIuY2FwYWNpdHkoKSk7CisgIH0KK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ05vUmVzZXJ2YXRpb25TaXplSXNMYXJnZSkgeworICBtZW1jcHkoYnVmZmVyXywga1Jhd0J5dGVzLCBzaXplb2Yoa1Jhd0J5dGVzKSk7CisgIC8vIEJ1ZmZlciBzaXplIGluIHRoZSBpbnB1dCBtdXN0IGJlIHNtYWxsZXIgdGhhbiBzaXplb2Yoa1Jhd0J5dGVzKSwKKyAgLy8gb3RoZXJ3aXNlIGNoZWNrIGFnYWluc3QgY2FwYWNpdHkgd2lsbCBmYWlsIGFzIFJlYWRTdHJpbmdJbmxpbmUoKQorICAvLyB3aWxsIGhhbmRsZSB0aGUgcmVhZGluZyBhbmQgd2lsbCByZXNlcnZlIHRoZSBtZW1vcnkgYXMgbmVlZGVkLgorICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSwgMzIpOworCisgIHsKKyAgICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CisgICAgY29kZWRfaW5wdXQuUHVzaExpbWl0KHNpemVvZihidWZmZXJfKSk7CisKKyAgICBzdHJpbmcgc3RyOworICAgIEVYUEVDVF9GQUxTRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDEgPDwgMzApKTsKKyAgICBFWFBFQ1RfR1QoMSA8PCAzMCwgc3RyLmNhcGFjaXR5KCkpOworICB9Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFJlYWRTdHJpbmdOb1Jlc2VydmF0aW9uU2l6ZUlzT3ZlclRoZUxpbWl0KSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAorICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCisgIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoMTYpOworCisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOworICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgZGVwZW5kcyBvbiBzdHJpbmcgY2xhc3MgaW1wbGVtZW50YXRpb24uIEl0CisgICAgLy8gZXhwZWN0cyB0aGF0IHN0cmluZyB3aWxsIGFsbG9jYXRlIGxlc3MgdGhhbiBzdHJsZW4oa1Jhd0J5dGVzKQorICAgIC8vIGZvciBhbiBlbXB0eSBzdHJpbmcuCisgICAgRVhQRUNUX0dUKHN0cmxlbihrUmF3Qnl0ZXMpLCBzdHIuY2FwYWNpdHkoKSk7CisgIH0KK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgUmVhZFN0cmluZ05vUmVzZXJ2YXRpb25TaXplSXNPdmVyVGhlVG90YWxCeXRlc0xpbWl0KSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAorICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCisgIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMTYsIDE2KTsKKworICAgIHN0cmluZyBzdHI7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKGtSYXdCeXRlcykpKTsKKyAgICAvLyBOb3RlOiB0aGlzIGNoZWNrIGRlcGVuZHMgb24gc3RyaW5nIGNsYXNzIGltcGxlbWVudGF0aW9uLiBJdAorICAgIC8vIGV4cGVjdHMgdGhhdCBzdHJpbmcgd2lsbCBhbGxvY2F0ZSBsZXNzIHRoYW4gc3RybGVuKGtSYXdCeXRlcykKKyAgICAvLyBmb3IgYW4gZW1wdHkgc3RyaW5nLgorICAgIEVYUEVDVF9HVChzdHJsZW4oa1Jhd0J5dGVzKSwgc3RyLmNhcGFjaXR5KCkpOworICB9Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsCisgICAgICAgUmVhZFN0cmluZ05vUmVzZXJ2YXRpb25TaXplSXNPdmVyVGhlQ2xvc2VzdExpbWl0X0dsb2JhbExpbWl0SXNDbG9zZXIpIHsKKyAgbWVtY3B5KGJ1ZmZlcl8sIGtSYXdCeXRlcywgc2l6ZW9mKGtSYXdCeXRlcykpOworICAvLyBCdWZmZXIgc2l6ZSBpbiB0aGUgaW5wdXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKGtSYXdCeXRlcyksCisgIC8vIG90aGVyd2lzZSBjaGVjayBhZ2FpbnN0IGNhcGFjaXR5IHdpbGwgZmFpbCBhcyBSZWFkU3RyaW5nSW5saW5lKCkKKyAgLy8gd2lsbCBoYW5kbGUgdGhlIHJlYWRpbmcgYW5kIHdpbGwgcmVzZXJ2ZSB0aGUgbWVtb3J5IGFzIG5lZWRlZC4KKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXyksIDMyKTsKKworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBjb2RlZF9pbnB1dCgmaW5wdXQpOworICAgIGNvZGVkX2lucHV0LlB1c2hMaW1pdChzaXplb2YoYnVmZmVyXykpOworICAgIGNvZGVkX2lucHV0LlNldFRvdGFsQnl0ZXNMaW1pdCgxNiwgMTYpOworCisgICAgc3RyaW5nIHN0cjsKKyAgICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCBzdHJsZW4oa1Jhd0J5dGVzKSkpOworICAgIC8vIE5vdGU6IHRoaXMgY2hlY2sgZGVwZW5kcyBvbiBzdHJpbmcgY2xhc3MgaW1wbGVtZW50YXRpb24uIEl0CisgICAgLy8gZXhwZWN0cyB0aGF0IHN0cmluZyB3aWxsIGFsbG9jYXRlIGxlc3MgdGhhbiBzdHJsZW4oa1Jhd0J5dGVzKQorICAgIC8vIGZvciBhbiBlbXB0eSBzdHJpbmcuCisgICAgRVhQRUNUX0dUKHN0cmxlbihrUmF3Qnl0ZXMpLCBzdHIuY2FwYWNpdHkoKSk7CisgIH0KK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwKKyAgICAgICBSZWFkU3RyaW5nTm9SZXNlcnZhdGlvblNpemVJc092ZXJUaGVDbG9zZXN0TGltaXRfTG9jYWxMaW1pdElzQ2xvc2VyKSB7CisgIG1lbWNweShidWZmZXJfLCBrUmF3Qnl0ZXMsIHNpemVvZihrUmF3Qnl0ZXMpKTsKKyAgLy8gQnVmZmVyIHNpemUgaW4gdGhlIGlucHV0IG11c3QgYmUgc21hbGxlciB0aGFuIHNpemVvZihrUmF3Qnl0ZXMpLAorICAvLyBvdGhlcndpc2UgY2hlY2sgYWdhaW5zdCBjYXBhY2l0eSB3aWxsIGZhaWwgYXMgUmVhZFN0cmluZ0lubGluZSgpCisgIC8vIHdpbGwgaGFuZGxlIHRoZSByZWFkaW5nIGFuZCB3aWxsIHJlc2VydmUgdGhlIG1lbW9yeSBhcyBuZWVkZWQuCisgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAzMik7CisKKyAgeworICAgIENvZGVkSW5wdXRTdHJlYW0gY29kZWRfaW5wdXQoJmlucHV0KTsKKyAgICBjb2RlZF9pbnB1dC5QdXNoTGltaXQoMTYpOworICAgIGNvZGVkX2lucHV0LlNldFRvdGFsQnl0ZXNMaW1pdChzaXplb2YoYnVmZmVyXyksIHNpemVvZihidWZmZXJfKSk7CisgICAgRVhQRUNUX0VRKHNpemVvZihidWZmZXJfKSwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKKworICAgIHN0cmluZyBzdHI7CisgICAgRVhQRUNUX0ZBTFNFKGNvZGVkX2lucHV0LlJlYWRTdHJpbmcoJnN0ciwgc3RybGVuKGtSYXdCeXRlcykpKTsKKyAgICAvLyBOb3RlOiB0aGlzIGNoZWNrIGRlcGVuZHMgb24gc3RyaW5nIGNsYXNzIGltcGxlbWVudGF0aW9uLiBJdAorICAgIC8vIGV4cGVjdHMgdGhhdCBzdHJpbmcgd2lsbCBhbGxvY2F0ZSBsZXNzIHRoYW4gc3RybGVuKGtSYXdCeXRlcykKKyAgICAvLyBmb3IgYW4gZW1wdHkgc3RyaW5nLgorICAgIEVYUEVDVF9HVChzdHJsZW4oa1Jhd0J5dGVzKSwgc3RyLmNhcGFjaXR5KCkpOworICB9Cit9CisKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gU2tpcAogCiBjb25zdCBjaGFyIGtTa2lwVGVzdEJ5dGVzW10gPQogICAiPEJlZm9yZSBza2lwcGluZz48VG8gYmUgc2tpcHBlZD48QWZ0ZXIgc2tpcHBpbmc+IjsKLWNvbnN0IGNoYXIga1NraXBPdXRwdXRUZXN0Qnl0ZXNbXSA9Ci0gICItLS0tLS0tLS0tLS0tLS0tLTxUbyBiZSBza2lwcGVkPi0tLS0tLS0tLS0tLS0tLS0iOwogCiBURVNUXzFEKENvZGVkU3RyZWFtVGVzdCwgU2tpcElucHV0LCBrQmxvY2tTaXplcykgewogICBtZW1jcHkoYnVmZmVyXywga1NraXBUZXN0Qnl0ZXMsIHNpemVvZihrU2tpcFRlc3RCeXRlcykpOwpAQCAtOTc0LDkgKzExNzAsMTEgQEAKICAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXJfLCBzaXplb2YoYnVmZmVyXykpOwogICBDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KCZpbnB1dCk7CiAgIGNvZGVkX2lucHV0LlNldFRvdGFsQnl0ZXNMaW1pdCgxNiwgLTEpOworICBFWFBFQ1RfRVEoMTYsIGNvZGVkX2lucHV0LkJ5dGVzVW50aWxUb3RhbEJ5dGVzTGltaXQoKSk7CiAKICAgc3RyaW5nIHN0cjsKICAgRVhQRUNUX1RSVUUoY29kZWRfaW5wdXQuUmVhZFN0cmluZygmc3RyLCAxNikpOworICBFWFBFQ1RfRVEoMCwgY29kZWRfaW5wdXQuQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpKTsKIAogICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CiAKQEAgLTk5MSw3ICsxMTg5LDkgQEAKICAgICAiQSBwcm90b2NvbCBtZXNzYWdlIHdhcyByZWplY3RlZCBiZWNhdXNlIGl0IHdhcyB0b28gYmlnIiwgZXJyb3JzWzBdKTsKIAogICBjb2RlZF9pbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQoMzIsIC0xKTsKKyAgRVhQRUNUX0VRKDE2LCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkpOwogICBFWFBFQ1RfVFJVRShjb2RlZF9pbnB1dC5SZWFkU3RyaW5nKCZzdHIsIDE2KSk7CisgIEVYUEVDVF9FUSgwLCBjb2RlZF9pbnB1dC5CeXRlc1VudGlsVG90YWxCeXRlc0xpbWl0KCkpOwogfQogCiBURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBUb3RhbEJ5dGVzTGltaXROb3RWYWxpZE1lc3NhZ2VFbmQpIHsKQEAgLTEwMjIsNiArMTIyMiw1OSBAQAogICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOwogfQogCisvLyBUaGlzIG1ldGhvZCBpcyB1c2VkIGJ5IHRoZSB0ZXN0cyBiZWxvdy4KKy8vIEl0IGNvbnN0cnVjdHMgYSBDb2RlZElucHV0U3RyZWFtIHdpdGggdGhlIGdpdmVuIGxpbWl0cyBhbmQgdHJpZXMgdG8gcmVhZCAyS2lCCisvLyBvZiBkYXRhIGZyb20gaXQuIFRoZW4gaXQgcmV0dXJucyB0aGUgbG9nZ2VkIGVycm9ycyBhbmQgd2FybmluZ3MgaW4gdGhlIGdpdmVuCisvLyB2ZWN0b3JzLgordm9pZCBDb2RlZFN0cmVhbVRlc3Q6OlNldHVwVG90YWxCeXRlc0xpbWl0V2FybmluZ1Rlc3QoCisgICAgaW50IHRvdGFsX2J5dGVzX2xpbWl0LCBpbnQgd2FybmluZ190aHJlc2hvbGQsCisgICAgdmVjdG9yPHN0cmluZz4qIG91dF9lcnJvcnMsIHZlY3RvcjxzdHJpbmc+KiBvdXRfd2FybmluZ3MpIHsKKyAgQXJyYXlJbnB1dFN0cmVhbSByYXdfaW5wdXQoYnVmZmVyXywgc2l6ZW9mKGJ1ZmZlcl8pLCAxMjgpOworCisgIFNjb3BlZE1lbW9yeUxvZyBzY29wZWRfbG9nOworICB7CisgICAgQ29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgICBpbnB1dC5TZXRUb3RhbEJ5dGVzTGltaXQodG90YWxfYnl0ZXNfbGltaXQsIHdhcm5pbmdfdGhyZXNob2xkKTsKKyAgICBzdHJpbmcgc3RyOworICAgIEVYUEVDVF9UUlVFKGlucHV0LlJlYWRTdHJpbmcoJnN0ciwgMjA0OCkpOworICB9CisKKyAgKm91dF9lcnJvcnMgPSBzY29wZWRfbG9nLkdldE1lc3NhZ2VzKEVSUk9SKTsKKyAgKm91dF93YXJuaW5ncyA9IHNjb3BlZF9sb2cuR2V0TWVzc2FnZXMoV0FSTklORyk7Cit9CisKK1RFU1RfRihDb2RlZFN0cmVhbVRlc3QsIFRvdGFsQnl0ZXNMaW1pdFdhcm5pbmcpIHsKKyAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOworICB2ZWN0b3I8c3RyaW5nPiB3YXJuaW5nczsKKyAgU2V0dXBUb3RhbEJ5dGVzTGltaXRXYXJuaW5nVGVzdCgxMDI0MCwgMTAyNCwgJmVycm9ycywgJndhcm5pbmdzKTsKKworICBFWFBFQ1RfRVEoMCwgZXJyb3JzLnNpemUoKSk7CisKKyAgQVNTRVJUX0VRKDIsIHdhcm5pbmdzLnNpemUoKSk7CisgIEVYUEVDVF9QUkVEX0ZPUk1BVDIodGVzdGluZzo6SXNTdWJzdHJpbmcsCisgICAgIlJlYWRpbmcgZGFuZ2Vyb3VzbHkgbGFyZ2UgcHJvdG9jb2wgbWVzc2FnZS4gIElmIHRoZSBtZXNzYWdlIHR1cm5zIG91dCB0byAiCisgICAgImJlIGxhcmdlciB0aGFuIDEwMjQwIGJ5dGVzLCBwYXJzaW5nIHdpbGwgYmUgaGFsdGVkIGZvciBzZWN1cml0eSByZWFzb25zLiIsCisgICAgd2FybmluZ3NbMF0pOworICBFWFBFQ1RfUFJFRF9GT1JNQVQyKHRlc3Rpbmc6OklzU3Vic3RyaW5nLAorICAgICJUaGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHJlYWQgd2FzIDIwNDgiLAorICAgIHdhcm5pbmdzWzFdKTsKK30KKworVEVTVF9GKENvZGVkU3RyZWFtVGVzdCwgVG90YWxCeXRlc0xpbWl0V2FybmluZ0Rpc2FibGVkKSB7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgdmVjdG9yPHN0cmluZz4gd2FybmluZ3M7CisKKyAgLy8gVGVzdCB3aXRoIC0xCisgIFNldHVwVG90YWxCeXRlc0xpbWl0V2FybmluZ1Rlc3QoMTAyNDAsIC0xLCAmZXJyb3JzLCAmd2FybmluZ3MpOworICBFWFBFQ1RfRVEoMCwgZXJyb3JzLnNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCB3YXJuaW5ncy5zaXplKCkpOworCisgIC8vIFRlc3QgYWdhaW4gd2l0aCAtMiwgZXhwZWN0aW5nIHRoZSBzYW1lIHJlc3VsdAorICBTZXR1cFRvdGFsQnl0ZXNMaW1pdFdhcm5pbmdUZXN0KDEwMjQwLCAtMiwgJmVycm9ycywgJndhcm5pbmdzKTsKKyAgRVhQRUNUX0VRKDAsIGVycm9ycy5zaXplKCkpOworICBFWFBFQ1RfRVEoMCwgd2FybmluZ3Muc2l6ZSgpKTsKK30KKwogCiBURVNUX0YoQ29kZWRTdHJlYW1UZXN0LCBSZWN1cnNpb25MaW1pdCkgewogICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlcl8sIHNpemVvZihidWZmZXJfKSk7CkBAIC0xMDYwLDYgKzEzMTMsNyBAQAogICBFWFBFQ1RfRkFMU0UoY29kZWRfaW5wdXQuSW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSk7ICAgICAvLyA3CiB9CiAKKwogY2xhc3MgUmVhbGx5QmlnSW5wdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlJbnB1dFN0cmVhbSB7CiAgcHVibGljOgogICBSZWFsbHlCaWdJbnB1dFN0cmVhbSgpIDogYmFja3VwX2Ftb3VudF8oMCksIGJ1ZmZlcl9jb3VudF8oMCkge30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MKaW5kZXggMGYxZmY4Ny4uOWM2MjFiNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMzLDEyICszMywxMiBAQAogLy8gVGhpcyBmaWxlIGNvbnRhaW5zIHRoZSBpbXBsZW1lbnRhdGlvbiBvZiBjbGFzc2VzIEd6aXBJbnB1dFN0cmVhbSBhbmQKIC8vIEd6aXBPdXRwdXRTdHJlYW0uCiAKLSNpbmNsdWRlICJjb25maWcuaCIKIAogI2lmIEhBVkVfWkxJQgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTQ4LDcgKzQ4LDggQEAKIAogR3ppcElucHV0U3RyZWFtOjpHemlwSW5wdXRTdHJlYW0oCiAgICAgWmVyb0NvcHlJbnB1dFN0cmVhbSogc3ViX3N0cmVhbSwgRm9ybWF0IGZvcm1hdCwgaW50IGJ1ZmZlcl9zaXplKQotICAgIDogZm9ybWF0Xyhmb3JtYXQpLCBzdWJfc3RyZWFtXyhzdWJfc3RyZWFtKSwgemVycm9yXyhaX09LKSB7CisgICAgOiBmb3JtYXRfKGZvcm1hdCksIHN1Yl9zdHJlYW1fKHN1Yl9zdHJlYW0pLCB6ZXJyb3JfKFpfT0spLCBieXRlX2NvdW50XygwKSB7CisgIHpjb250ZXh0Xy5zdGF0ZSA9IFpfTlVMTDsKICAgemNvbnRleHRfLnphbGxvYyA9IFpfTlVMTDsKICAgemNvbnRleHRfLnpmcmVlID0gWl9OVUxMOwogICB6Y29udGV4dF8ub3BhcXVlID0gWl9OVUxMOwpAQCAtMTM0LDYgKzEzNSw3IEBACiAgICAgaWYgKHpjb250ZXh0Xy5uZXh0X291dCAhPSBOVUxMKSB7CiAgICAgICAvLyBzdWJfc3RyZWFtXyBtYXkgaGF2ZSBjb25jYXRlbmF0ZWQgc3RyZWFtcyB0byBmb2xsb3cKICAgICAgIHplcnJvcl8gPSBpbmZsYXRlRW5kKCZ6Y29udGV4dF8pOworICAgICAgYnl0ZV9jb3VudF8gKz0gemNvbnRleHRfLnRvdGFsX291dDsKICAgICAgIGlmICh6ZXJyb3JfICE9IFpfT0spIHsKICAgICAgICAgcmV0dXJuIGZhbHNlOwogICAgICAgfQpAQCAtMTc4LDggKzE4MCwxMiBAQAogICByZXR1cm4gb2s7CiB9CiBpbnQ2NCBHemlwSW5wdXRTdHJlYW06OkJ5dGVDb3VudCgpIGNvbnN0IHsKLSAgcmV0dXJuIHpjb250ZXh0Xy50b3RhbF9vdXQgKwotICAgICgoKHVpbnRwdHJfdCl6Y29udGV4dF8ubmV4dF9vdXQpIC0gKCh1aW50cHRyX3Qpb3V0cHV0X3Bvc2l0aW9uXykpOworICBpbnQ2NCByZXQgPSBieXRlX2NvdW50XyArIHpjb250ZXh0Xy50b3RhbF9vdXQ7CisgIGlmICh6Y29udGV4dF8ubmV4dF9vdXQgIT0gTlVMTCAmJiBvdXRwdXRfcG9zaXRpb25fICE9IE5VTEwpIHsKKyAgICByZXQgKz0gcmVpbnRlcnByZXRfY2FzdDx1aW50cHRyX3Q+KHpjb250ZXh0Xy5uZXh0X291dCkgLQorICAgICAgICAgICByZWludGVycHJldF9jYXN0PHVpbnRwdHJfdD4ob3V0cHV0X3Bvc2l0aW9uXyk7CisgIH0KKyAgcmV0dXJuIHJldDsKIH0KIAogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQpAQCAtMTk5LDE2ICsyMDUsNiBAQAogICBJbml0KHN1Yl9zdHJlYW0sIG9wdGlvbnMpOwogfQogCi1HemlwT3V0cHV0U3RyZWFtOjpHemlwT3V0cHV0U3RyZWFtKAotICAgIFplcm9Db3B5T3V0cHV0U3RyZWFtKiBzdWJfc3RyZWFtLCBGb3JtYXQgZm9ybWF0LCBpbnQgYnVmZmVyX3NpemUpIHsKLSAgT3B0aW9ucyBvcHRpb25zOwotICBvcHRpb25zLmZvcm1hdCA9IGZvcm1hdDsKLSAgaWYgKGJ1ZmZlcl9zaXplICE9IC0xKSB7Ci0gICAgb3B0aW9ucy5idWZmZXJfc2l6ZSA9IGJ1ZmZlcl9zaXplOwotICB9Ci0gIEluaXQoc3ViX3N0cmVhbSwgb3B0aW9ucyk7Ci19Ci0KIHZvaWQgR3ppcE91dHB1dFN0cmVhbTo6SW5pdChaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKSB7CiAgIHN1Yl9zdHJlYW1fID0gc3ViX3N0cmVhbTsKQEAgLTI0NSw5ICsyNDEsNyBAQAogCiBHemlwT3V0cHV0U3RyZWFtOjp+R3ppcE91dHB1dFN0cmVhbSgpIHsKICAgQ2xvc2UoKTsKLSAgaWYgKGlucHV0X2J1ZmZlcl8gIT0gTlVMTCkgewotICAgIG9wZXJhdG9yIGRlbGV0ZShpbnB1dF9idWZmZXJfKTsKLSAgfQorICBvcGVyYXRvciBkZWxldGUoaW5wdXRfYnVmZmVyXyk7CiB9CiAKIC8vIHByaXZhdGUKQEAgLTMwOSwxMCArMzAzLDExIEBACiB9CiAKIGJvb2wgR3ppcE91dHB1dFN0cmVhbTo6Rmx1c2goKSB7Ci0gIGRvIHsKLSAgICB6ZXJyb3JfID0gRGVmbGF0ZShaX0ZVTExfRkxVU0gpOwotICB9IHdoaWxlICh6ZXJyb3JfID09IFpfT0spOwotICByZXR1cm4gemVycm9yXyA9PSBaX09LOworICB6ZXJyb3JfID0gRGVmbGF0ZShaX0ZVTExfRkxVU0gpOworICAvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgZmx1c2ggc3VjY2VlZGVkIG9yIGlmIGl0IHdhcyBhIG5vLW9wLgorICByZXR1cm4gICh6ZXJyb3JfID09IFpfT0spIHx8CisgICAgICAoemVycm9yXyA9PSBaX0JVRl9FUlJPUiAmJiB6Y29udGV4dF8uYXZhaWxfaW4gPT0gMCAmJgorICAgICAgIHpjb250ZXh0Xy5hdmFpbF9vdXQgIT0gMCk7CiB9CiAKIGJvb2wgR3ppcE91dHB1dFN0cmVhbTo6Q2xvc2UoKSB7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaAppbmRleCA2NWRiYzViLi4xNWIwMmZlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQzLDkgKzQzLDkgQEAKICNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0lPX0daSVBfU1RSRUFNX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fR1pJUF9TVFJFQU1fSF9fCiAKLSNpbmNsdWRlIDx6bGliLmg+Ci0KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDx6bGliLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTk4LDYgKzk4LDcgQEAKICAgdm9pZCogb3V0cHV0X2J1ZmZlcl87CiAgIHZvaWQqIG91dHB1dF9wb3NpdGlvbl87CiAgIHNpemVfdCBvdXRwdXRfYnVmZmVyX2xlbmd0aF87CisgIGludDY0IGJ5dGVfY291bnRfOwogCiAgIGludCBJbmZsYXRlKGludCBmbHVzaCk7CiAgIHZvaWQgRG9OZXh0T3V0cHV0KGNvbnN0IHZvaWQqKiBkYXRhLCBpbnQqIHNpemUpOwpAQCAtMTQ0LDEyICsxNDUsNiBAQAogICAgICAgWmVyb0NvcHlPdXRwdXRTdHJlYW0qIHN1Yl9zdHJlYW0sCiAgICAgICBjb25zdCBPcHRpb25zJiBvcHRpb25zKTsKIAotICAvLyBERVBSRUNBVEVEOiAgVXNlIG9uZSBvZiB0aGUgYWJvdmUgY29uc3RydWN0b3JzIGluc3RlYWQuCi0gIEd6aXBPdXRwdXRTdHJlYW0oCi0gICAgICBaZXJvQ29weU91dHB1dFN0cmVhbSogc3ViX3N0cmVhbSwKLSAgICAgIEZvcm1hdCBmb3JtYXQsCi0gICAgICBpbnQgYnVmZmVyX3NpemUgPSAtMSkgR09PR0xFX0FUVFJJQlVURV9ERVBSRUNBVEVEOwotCiAgIHZpcnR1YWwgfkd6aXBPdXRwdXRTdHJlYW0oKTsKIAogICAvLyBSZXR1cm4gbGFzdCBlcnJvciBtZXNzYWdlIG9yIE5VTEwgaWYgbm8gZXJyb3IuCkBAIC0xNjUsNiArMTYwLDEzIEBACiAgIC8vIG5lY2Vzc2FyeS4KICAgLy8gQ29tcHJlc3Npb24gbWF5IGJlIGxlc3MgZWZmaWNpZW50IHN0b3BwaW5nIGFuZCBzdGFydGluZyBhcm91bmQgZmx1c2hlcy4KICAgLy8gUmV0dXJucyB0cnVlIGlmIG5vIGVycm9yLgorICAvLworICAvLyBQbGVhc2UgZW5zdXJlIHRoYXQgYmxvY2sgc2l6ZSBpcyA+IDYuIEhlcmUgaXMgYW4gZXhjZXJwdCBmcm9tIHRoZSB6bGliCisgIC8vIGRvYyB0aGF0IGV4cGxhaW5zIHdoeToKKyAgLy8KKyAgLy8gSW4gdGhlIGNhc2Ugb2YgYSBaX0ZVTExfRkxVU0ggb3IgWl9TWU5DX0ZMVVNILCBtYWtlIHN1cmUgdGhhdCBhdmFpbF9vdXQKKyAgLy8gaXMgZ3JlYXRlciB0aGFuIHNpeCB0byBhdm9pZCByZXBlYXRlZCBmbHVzaCBtYXJrZXJzIGR1ZSB0bworICAvLyBhdmFpbF9vdXQgPT0gMCBvbiByZXR1cm4uCiAgIGJvb2wgRmx1c2goKTsKIAogICAvLyBXcml0ZXMgb3V0IGFsbCBkYXRhIGFuZCBjbG9zZXMgdGhlIGd6aXAgc3RyZWFtLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW1fdW5pdHRlc3Quc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaAppbmRleCA2ZThhMDk0Li4xNjI1MWE5IDEwMDc1NQotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbV91bml0dGVzdC5zaApAQCAtMiw3ICsyLDcgQEAKICMKICMgUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAjIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotIyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisjIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAjCiAjIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogIyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wYWNrYWdlX2luZm8uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oCmluZGV4IDdhN2E0ZTcuLmRjMWZjOTEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3BhY2thZ2VfaW5mby5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5jYwppbmRleCA5YWI5MGRlLi43NTMyYjA5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM0LDMyICszNCw4MiBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBpbyB7CiAKIFByaW50ZXI6OlByaW50ZXIoWmVyb0NvcHlPdXRwdXRTdHJlYW0qIG91dHB1dCwgY2hhciB2YXJpYWJsZV9kZWxpbWl0ZXIpCi0gIDogdmFyaWFibGVfZGVsaW1pdGVyXyh2YXJpYWJsZV9kZWxpbWl0ZXIpLAotICAgIG91dHB1dF8ob3V0cHV0KSwKLSAgICBidWZmZXJfKE5VTEwpLAotICAgIGJ1ZmZlcl9zaXplXygwKSwKLSAgICBhdF9zdGFydF9vZl9saW5lXyh0cnVlKSwKLSAgICBmYWlsZWRfKGZhbHNlKSB7Ci19CisgICAgOiB2YXJpYWJsZV9kZWxpbWl0ZXJfKHZhcmlhYmxlX2RlbGltaXRlciksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBidWZmZXJfKE5VTEwpLAorICAgICAgYnVmZmVyX3NpemVfKDApLAorICAgICAgb2Zmc2V0XygwKSwKKyAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAorICAgICAgZmFpbGVkXyhmYWxzZSksCisgICAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8oTlVMTCkge30KKworUHJpbnRlcjo6UHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlciwKKyAgICAgICAgICAgICAgICAgQW5ub3RhdGlvbkNvbGxlY3RvciogYW5ub3RhdGlvbl9jb2xsZWN0b3IpCisgICAgOiB2YXJpYWJsZV9kZWxpbWl0ZXJfKHZhcmlhYmxlX2RlbGltaXRlciksCisgICAgICBvdXRwdXRfKG91dHB1dCksCisgICAgICBidWZmZXJfKE5VTEwpLAorICAgICAgYnVmZmVyX3NpemVfKDApLAorICAgICAgb2Zmc2V0XygwKSwKKyAgICAgIGF0X3N0YXJ0X29mX2xpbmVfKHRydWUpLAorICAgICAgZmFpbGVkXyhmYWxzZSksCisgICAgICBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8oYW5ub3RhdGlvbl9jb2xsZWN0b3IpIHt9CiAKIFByaW50ZXI6On5QcmludGVyKCkgewotICAvLyBPbmx5IEJhY2tVcCgpIGlmIHdlJ3JlIHN1cmUgd2UndmUgc3VjY2Vzc2Z1bGx5IGNhbGxlZCBOZXh0KCkgYXQgbGVhc3Qgb25jZS4KLSAgaWYgKGJ1ZmZlcl9zaXplXyA+IDApIHsKKyAgLy8gT25seSBCYWNrVXAoKSBpZiB3ZSBoYXZlIGNhbGxlZCBOZXh0KCkgYXQgbGVhc3Qgb25jZSBhbmQgbmV2ZXIgZmFpbGVkLgorICBpZiAoYnVmZmVyX3NpemVfID4gMCAmJiAhZmFpbGVkXykgewogICAgIG91dHB1dF8tPkJhY2tVcChidWZmZXJfc2l6ZV8pOwogICB9CiB9CiAKK2Jvb2wgUHJpbnRlcjo6R2V0U3Vic3RpdHV0aW9uUmFuZ2UoY29uc3QgY2hhciogdmFybmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGFpcjxzaXplX3QsIHNpemVfdD4qIHJhbmdlKSB7CisgIG1hcDxzdHJpbmcsIHBhaXI8c2l6ZV90LCBzaXplX3Q+ID46OmNvbnN0X2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgc3Vic3RpdHV0aW9uc18uZmluZCh2YXJuYW1lKTsKKyAgaWYgKGl0ZXIgPT0gc3Vic3RpdHV0aW9uc18uZW5kKCkpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIiBVbmRlZmluZWQgdmFyaWFibGUgaW4gYW5ub3RhdGlvbjogIiA8PCB2YXJuYW1lOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBpZiAoaXRlci0+c2Vjb25kLmZpcnN0ID4gaXRlci0+c2Vjb25kLnNlY29uZCkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiIFZhcmlhYmxlIHVzZWQgZm9yIGFubm90YXRpb24gdXNlZCBtdWx0aXBsZSB0aW1lczogIgorICAgICAgICAgICAgICAgIDw8IHZhcm5hbWU7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgICpyYW5nZSA9IGl0ZXItPnNlY29uZDsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgUHJpbnRlcjo6QW5ub3RhdGUoY29uc3QgY2hhciogYmVnaW5fdmFybmFtZSwgY29uc3QgY2hhciogZW5kX3Zhcm5hbWUsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgZmlsZV9wYXRoLCBjb25zdCB2ZWN0b3I8aW50PiYgcGF0aCkgeworICBpZiAoYW5ub3RhdGlvbl9jb2xsZWN0b3JfID09IE5VTEwpIHsKKyAgICAvLyBDYW4ndCBnZW5lcmF0ZSBzaWduYXR1cmVzIHdpdGggdGhpcyBQcmludGVyLgorICAgIHJldHVybjsKKyAgfQorICBwYWlyPHNpemVfdCwgc2l6ZV90PiBiZWdpbiwgZW5kOworICBpZiAoIUdldFN1YnN0aXR1dGlvblJhbmdlKGJlZ2luX3Zhcm5hbWUsICZiZWdpbikgfHwKKyAgICAgICFHZXRTdWJzdGl0dXRpb25SYW5nZShlbmRfdmFybmFtZSwgJmVuZCkpIHsKKyAgICByZXR1cm47CisgIH0KKyAgaWYgKGJlZ2luLmZpcnN0ID4gZW5kLnNlY29uZCkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiICBBbm5vdGF0aW9uIGhhcyBuZWdhdGl2ZSBsZW5ndGggZnJvbSAiIDw8IGJlZ2luX3Zhcm5hbWUKKyAgICAgICAgICAgICAgICA8PCAiIHRvICIgPDwgZW5kX3Zhcm5hbWU7CisgIH0gZWxzZSB7CisgICAgYW5ub3RhdGlvbl9jb2xsZWN0b3JfLT5BZGRBbm5vdGF0aW9uKGJlZ2luLmZpcnN0LCBlbmQuc2Vjb25kLCBmaWxlX3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhdGgpOworICB9Cit9CisKIHZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgbWFwPHN0cmluZywgc3RyaW5nPiYgdmFyaWFibGVzLCBjb25zdCBjaGFyKiB0ZXh0KSB7CiAgIGludCBzaXplID0gc3RybGVuKHRleHQpOwogICBpbnQgcG9zID0gMDsgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UndmUgd3JpdHRlbiBzbyBmYXIuCisgIHN1YnN0aXR1dGlvbnNfLmNsZWFyKCk7CiAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKICAgICBpZiAodGV4dFtpXSA9PSAnXG4nKSB7CkBAIC05Nyw3ICsxNDcsMTcgQEAKICAgICAgICAgaWYgKGl0ZXIgPT0gdmFyaWFibGVzLmVuZCgpKSB7CiAgICAgICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICIgVW5kZWZpbmVkIHZhcmlhYmxlOiAiIDw8IHZhcm5hbWU7CiAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgc2l6ZV90IGJlZ2luID0gb2Zmc2V0XzsKICAgICAgICAgICBXcml0ZVJhdyhpdGVyLT5zZWNvbmQuZGF0YSgpLCBpdGVyLT5zZWNvbmQuc2l6ZSgpKTsKKyAgICAgICAgICBwYWlyPG1hcDxzdHJpbmcsIHBhaXI8c2l6ZV90LCBzaXplX3Q+ID46Oml0ZXJhdG9yLCBib29sPiBpbnNlcnRlZCA9CisgICAgICAgICAgICAgIHN1YnN0aXR1dGlvbnNfLmluc2VydCgKKyAgICAgICAgICAgICAgICAgIHN0ZDo6bWFrZV9wYWlyKHZhcm5hbWUsIHN0ZDo6bWFrZV9wYWlyKGJlZ2luLCBvZmZzZXRfKSkpOworICAgICAgICAgIGlmICghaW5zZXJ0ZWQuc2Vjb25kKSB7CisgICAgICAgICAgICAvLyBUaGlzIHZhcmlhYmxlIHdhcyB1c2VkIG11bHRpcGxlIHRpbWVzLiAgTWFrZSBpdHMgc3BhbiBoYXZlCisgICAgICAgICAgICAvLyBuZWdhdGl2ZSBsZW5ndGggc28gd2UgY2FuIGRldGVjdCBpdCBpZiBpdCBnZXRzIHVzZWQgaW4gYW4KKyAgICAgICAgICAgIC8vIGFubm90YXRpb24uCisgICAgICAgICAgICBpbnNlcnRlZC5maXJzdC0+c2Vjb25kID0gc3RkOjptYWtlX3BhaXIoMSwgMCk7CisgICAgICAgICAgfQogICAgICAgICB9CiAgICAgICB9CiAKQEAgLTE0Myw2ICsyMDMsOTEgQEAKICAgUHJpbnQodmFycywgdGV4dCk7CiB9CiAKK3ZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKKyAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOworICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7CisgIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKKyAgUHJpbnQodmFycywgdGV4dCk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKKyAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOworICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7CisgIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKKyAgdmFyc1t2YXJpYWJsZTVdID0gdmFsdWU1OworICBQcmludCh2YXJzLCB0ZXh0KTsKK30KKwordm9pZCBQcmludGVyOjpQcmludChjb25zdCBjaGFyKiB0ZXh0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTMsIGNvbnN0IHN0cmluZyYgdmFsdWUzLAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTQsIGNvbnN0IHN0cmluZyYgdmFsdWU0LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTUsIGNvbnN0IHN0cmluZyYgdmFsdWU1LAorICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTYsIGNvbnN0IHN0cmluZyYgdmFsdWU2KSB7CisgIG1hcDxzdHJpbmcsIHN0cmluZz4gdmFyczsKKyAgdmFyc1t2YXJpYWJsZTFdID0gdmFsdWUxOworICB2YXJzW3ZhcmlhYmxlMl0gPSB2YWx1ZTI7CisgIHZhcnNbdmFyaWFibGUzXSA9IHZhbHVlMzsKKyAgdmFyc1t2YXJpYWJsZTRdID0gdmFsdWU0OworICB2YXJzW3ZhcmlhYmxlNV0gPSB2YWx1ZTU7CisgIHZhcnNbdmFyaWFibGU2XSA9IHZhbHVlNjsKKyAgUHJpbnQodmFycywgdGV4dCk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU2LCBjb25zdCBzdHJpbmcmIHZhbHVlNiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU3LCBjb25zdCBzdHJpbmcmIHZhbHVlNykgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKKyAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOworICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7CisgIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKKyAgdmFyc1t2YXJpYWJsZTVdID0gdmFsdWU1OworICB2YXJzW3ZhcmlhYmxlNl0gPSB2YWx1ZTY7CisgIHZhcnNbdmFyaWFibGU3XSA9IHZhbHVlNzsKKyAgUHJpbnQodmFycywgdGV4dCk7Cit9CisKK3ZvaWQgUHJpbnRlcjo6UHJpbnQoY29uc3QgY2hhciogdGV4dCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUyLCBjb25zdCBzdHJpbmcmIHZhbHVlMiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU1LCBjb25zdCBzdHJpbmcmIHZhbHVlNSwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU2LCBjb25zdCBzdHJpbmcmIHZhbHVlNiwKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU3LCBjb25zdCBzdHJpbmcmIHZhbHVlNywKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU4LCBjb25zdCBzdHJpbmcmIHZhbHVlOCkgeworICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisgIHZhcnNbdmFyaWFibGUxXSA9IHZhbHVlMTsKKyAgdmFyc1t2YXJpYWJsZTJdID0gdmFsdWUyOworICB2YXJzW3ZhcmlhYmxlM10gPSB2YWx1ZTM7CisgIHZhcnNbdmFyaWFibGU0XSA9IHZhbHVlNDsKKyAgdmFyc1t2YXJpYWJsZTVdID0gdmFsdWU1OworICB2YXJzW3ZhcmlhYmxlNl0gPSB2YWx1ZTY7CisgIHZhcnNbdmFyaWFibGU3XSA9IHZhbHVlNzsKKyAgdmFyc1t2YXJpYWJsZThdID0gdmFsdWU4OworICBQcmludCh2YXJzLCB0ZXh0KTsKK30KKwogdm9pZCBQcmludGVyOjpJbmRlbnQoKSB7CiAgIGluZGVudF8gKz0gIiAgIjsKIH0KQEAgLTE2OSw3ICszMTQsNyBAQAogICBpZiAoZmFpbGVkXykgcmV0dXJuOwogICBpZiAoc2l6ZSA9PSAwKSByZXR1cm47CiAKLSAgaWYgKGF0X3N0YXJ0X29mX2xpbmVfKSB7CisgIGlmIChhdF9zdGFydF9vZl9saW5lXyAmJiAoc2l6ZSA+IDApICYmIChkYXRhWzBdICE9ICdcbicpKSB7CiAgICAgLy8gSW5zZXJ0IGFuIGluZGVudC4KICAgICBhdF9zdGFydF9vZl9saW5lXyA9IGZhbHNlOwogICAgIFdyaXRlUmF3KGluZGVudF8uZGF0YSgpLCBpbmRlbnRfLnNpemUoKSk7CkBAIC0xODAsNiArMzI1LDcgQEAKICAgICAvLyBEYXRhIGV4Y2VlZHMgc3BhY2UgaW4gdGhlIGJ1ZmZlci4gIENvcHkgd2hhdCB3ZSBjYW4gYW5kIHJlcXVlc3QgYQogICAgIC8vIG5ldyBidWZmZXIuCiAgICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIGJ1ZmZlcl9zaXplXyk7CisgICAgb2Zmc2V0XyArPSBidWZmZXJfc2l6ZV87CiAgICAgZGF0YSArPSBidWZmZXJfc2l6ZV87CiAgICAgc2l6ZSAtPSBidWZmZXJfc2l6ZV87CiAgICAgdm9pZCogdm9pZF9idWZmZXI7CkBAIC0xOTIsNiArMzM4LDcgQEAKICAgbWVtY3B5KGJ1ZmZlcl8sIGRhdGEsIHNpemUpOwogICBidWZmZXJfICs9IHNpemU7CiAgIGJ1ZmZlcl9zaXplXyAtPSBzaXplOworICBvZmZzZXRfICs9IHNpemU7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlci5oCmluZGV4IDViZTQ4NTQuLjJiYTg0NTUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM5LDYgKzM5LDcgQEAKIAogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8dmVjdG9yPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CkBAIC00Nyw2ICs0OCw0NyBAQAogCiBjbGFzcyBaZXJvQ29weU91dHB1dFN0cmVhbTsgICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAogCisvLyBSZWNvcmRzIGFubm90YXRpb25zIGFib3V0IGEgUHJpbnRlcidzIG91dHB1dC4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBBbm5vdGF0aW9uQ29sbGVjdG9yIHsKKyBwdWJsaWM6CisgIC8vIFJlY29yZHMgdGhhdCB0aGUgYnl0ZXMgaW4gZmlsZV9wYXRoIGJlZ2lubmluZyB3aXRoIGJlZ2luX29mZnNldCBhbmQgZW5kaW5nCisgIC8vIGJlZm9yZSBlbmRfb2Zmc2V0IGFyZSBhc3NvY2lhdGVkIHdpdGggdGhlIFNvdXJjZUNvZGVJbmZvLXN0eWxlIHBhdGguCisgIHZpcnR1YWwgdm9pZCBBZGRBbm5vdGF0aW9uKHNpemVfdCBiZWdpbl9vZmZzZXQsIHNpemVfdCBlbmRfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludD4mIHBhdGgpID0gMDsKKworICB2aXJ0dWFsIH5Bbm5vdGF0aW9uQ29sbGVjdG9yKCkge30KK307CisKKy8vIFJlY29yZHMgYW5ub3RhdGlvbnMgYWJvdXQgYSBQcmludGVyJ3Mgb3V0cHV0IHRvIHRoZSBnaXZlbiBwcm90b2NvbCBidWZmZXIsCisvLyBhc3N1bWluZyB0aGF0IHRoZSBidWZmZXIgaGFzIGFuIDo6QW5ub3RhdGlvbiBtZXNzYWdlIGV4cG9zaW5nIHBhdGgsCisvLyBzb3VyY2VfZmlsZSwgYmVnaW4gYW5kIGVuZCBmaWVsZHMuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgQW5ub3RhdGlvblByb3RvPgorY2xhc3MgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yIDogcHVibGljIEFubm90YXRpb25Db2xsZWN0b3IgeworIHB1YmxpYzoKKyAgLy8gYW5ub3RhdGlvbl9wcm90byBpcyB0aGUgcHJvdG9jb2wgYnVmZmVyIHRvIHdoaWNoIG5ldyBBbm5vdGF0aW9ucyBzaG91bGQgYmUKKyAgLy8gYWRkZWQuIEl0IGlzIG5vdCBvd25lZCBieSB0aGUgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yLgorICBleHBsaWNpdCBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3IoQW5ub3RhdGlvblByb3RvKiBhbm5vdGF0aW9uX3Byb3RvKQorICAgICAgOiBhbm5vdGF0aW9uX3Byb3RvXyhhbm5vdGF0aW9uX3Byb3RvKSB7fQorCisgIC8vIE92ZXJyaWRlIGZvciBBbm5vdGF0aW9uQ29sbGVjdG9yOjpBZGRBbm5vdGF0aW9uLgorICB2aXJ0dWFsIHZvaWQgQWRkQW5ub3RhdGlvbihzaXplX3QgYmVnaW5fb2Zmc2V0LCBzaXplX3QgZW5kX29mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBmaWxlX3BhdGgsIGNvbnN0IHZlY3RvcjxpbnQ+JiBwYXRoKSB7CisgICAgdHlwZW5hbWUgQW5ub3RhdGlvblByb3RvOjpBbm5vdGF0aW9uKiBhbm5vdGF0aW9uID0KKyAgICAgICAgYW5ub3RhdGlvbl9wcm90b18tPmFkZF9hbm5vdGF0aW9uKCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBwYXRoLnNpemUoKTsgKytpKSB7CisgICAgICBhbm5vdGF0aW9uLT5hZGRfcGF0aChwYXRoW2ldKTsKKyAgICB9CisgICAgYW5ub3RhdGlvbi0+c2V0X3NvdXJjZV9maWxlKGZpbGVfcGF0aCk7CisgICAgYW5ub3RhdGlvbi0+c2V0X2JlZ2luKGJlZ2luX29mZnNldCk7CisgICAgYW5ub3RhdGlvbi0+c2V0X2VuZChlbmRfb2Zmc2V0KTsKKyAgfQorCisgcHJpdmF0ZToKKyAgLy8gVGhlIHByb3RvY29sIGJ1ZmZlciB0byB3aGljaCBuZXcgYW5ub3RhdGlvbnMgc2hvdWxkIGJlIGFkZGVkLgorICBBbm5vdGF0aW9uUHJvdG8qIGNvbnN0IGFubm90YXRpb25fcHJvdG9fOworfTsKKwogLy8gVGhpcyBzaW1wbGUgdXRpbGl0eSBjbGFzcyBhc3Npc3RzIGluIGNvZGUgZ2VuZXJhdGlvbi4gIEl0IGJhc2ljYWxseQogLy8gYWxsb3dzIHRoZSBjYWxsZXIgdG8gZGVmaW5lIGEgc2V0IG9mIHZhcmlhYmxlcyBhbmQgdGhlbiBvdXRwdXQgc29tZQogLy8gdGV4dCB3aXRoIHZhcmlhYmxlIHN1YnN0aXR1dGlvbnMuICBFeGFtcGxlIHVzYWdlOgpAQCAtNjEsMTMgKzEwMywxMDMgQEAKIC8vIFByaW50ZXIgYWdncmVzc2l2ZWx5IGVuZm9yY2VzIGNvcnJlY3QgdXNhZ2UsIGNyYXNoaW5nICh3aXRoIGFzc2VydCBmYWlsdXJlcykKIC8vIGluIHRoZSBjYXNlIG9mIHVuZGVmaW5lZCB2YXJpYWJsZXMgaW4gZGVidWcgYnVpbGRzLiBUaGlzIGhlbHBzIGdyZWF0bHkgaW4KIC8vIGRlYnVnZ2luZyBjb2RlIHdoaWNoIHVzZXMgaXQuCisvLworLy8gSWYgYSBQcmludGVyIGlzIGNvbnN0cnVjdGVkIHdpdGggYW4gQW5ub3RhdGlvbkNvbGxlY3RvciwgaXQgd2lsbCBwcm92aWRlIGl0CisvLyB3aXRoIGFubm90YXRpb25zIHRoYXQgY29ubmVjdCB0aGUgUHJpbnRlcidzIG91dHB1dCB0byBwYXRocyB0aGF0IGNhbiBpZGVudGlmeQorLy8gdmFyaW91cyBkZXNjcmlwdG9ycy4gIEluIHRoZSBhYm92ZSBleGFtcGxlLCBpZiBwZXJzb25fIGlzIGEgZGVzY3JpcHRvciB0aGF0CisvLyBpZGVudGlmaWVzIEJvYiwgd2UgY2FuIGFzc29jaWF0ZSB0aGUgb3V0cHV0IHN0cmluZyAiTXkgbmFtZSBpcyBCb2IuIiB3aXRoCisvLyBhIHNvdXJjZSBwYXRoIHBvaW50aW5nIHRvIHRoYXQgZGVzY3JpcHRvciB3aXRoOgorLy8KKy8vICAgcHJpbnRlci5Bbm5vdGF0ZSgibmFtZSIsIHBlcnNvbl8pOworLy8KKy8vIFRoZSBBbm5vdGF0aW9uQ29sbGVjdG9yIHdpbGwgYmUgc2VudCBhbiBhbm5vdGF0aW9uIGxpbmtpbmcgdGhlIG91dHB1dCByYW5nZQorLy8gY292ZXJpbmcgIkJvYiIgdG8gdGhlIGxvZ2ljYWwgcGF0aCBwcm92aWRlZCBieSBwZXJzb25fLiAgVG9vbHMgbWF5IHVzZQorLy8gdGhpcyBhc3NvY2lhdGlvbiB0byAoZm9yIGV4YW1wbGUpIGxpbmsgIkJvYiIgaW4gdGhlIG91dHB1dCBiYWNrIHRvIHRoZQorLy8gc291cmNlIGZpbGUgdGhhdCBkZWZpbmVkIHRoZSBwZXJzb25fIGRlc2NyaXB0b3IgaWRlbnRpZnlpbmcgQm9iLgorLy8KKy8vIEFubm90YXRlIGNhbiBvbmx5IGV4YW1pbmUgdmFyaWFibGVzIHN1YnN0aXR1dGVkIGR1cmluZyB0aGUgbGFzdCBjYWxsIHRvCisvLyBQcmludC4gIEl0IGlzIGludmFsaWQgdG8gcmVmZXIgdG8gYSB2YXJpYWJsZSB0aGF0IHdhcyB1c2VkIG11bHRpcGxlIHRpbWVzCisvLyBpbiBhIHNpbmdsZSBQcmludCBjYWxsLgorLy8KKy8vIEluIGZ1bGwgZ2VuZXJhbGl0eSwgb25lIG1heSBzcGVjaWZ5IGEgcmFuZ2Ugb2Ygb3V0cHV0IHRleHQgdXNpbmcgYSBiZWdpbm5pbmcKKy8vIHN1YnN0aXR1dGlvbiB2YXJpYWJsZSBhbmQgYW4gZW5kaW5nIHZhcmlhYmxlLiAgVGhlIHJlc3VsdGluZyBhbm5vdGF0aW9uIHdpbGwKKy8vIHNwYW4gZnJvbSB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdGl0dXRlZCB2YWx1ZSBmb3IgdGhlIGJlZ2lubmluZworLy8gdmFyaWFibGUgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIHRoZSBzdWJzdGl0dXRlZCB2YWx1ZSBmb3IgdGhlIGVuZGluZworLy8gdmFyaWFibGUuICBGb3IgZXhhbXBsZSwgdGhlIEFubm90YXRlIGNhbGwgYWJvdmUgaXMgZXF1aXZhbGVudCB0byB0aGlzIG9uZToKKy8vCisvLyAgIHByaW50ZXIuQW5ub3RhdGUoIm5hbWUiLCAibmFtZSIsIHBlcnNvbl8pOworLy8KKy8vIFRoaXMgaXMgdXNlZnVsIGlmIG11bHRpcGxlIHZhcmlhYmxlcyBjb21iaW5lIHRvIGZvcm0gYSBzaW5nbGUgc3BhbiBvZiBvdXRwdXQKKy8vIHRoYXQgc2hvdWxkIGJlIGFubm90YXRlZCB3aXRoIHRoZSBzYW1lIHNvdXJjZSBwYXRoLiAgRm9yIGV4YW1wbGU6CisvLworLy8gICBQcmludGVyIHByaW50ZXIob3V0cHV0LCAnJCcpOworLy8gICBtYXA8c3RyaW5nLCBzdHJpbmc+IHZhcnM7CisvLyAgIHZhcnNbImZpcnN0Il0gPSAiQWxpY2UiOworLy8gICB2YXJzWyJsYXN0Il0gPSAiU21pdGgiOworLy8gICBwcmludGVyLlByaW50KHZhcnMsICJNeSBuYW1lIGlzICRmaXJzdCQgJGxhc3QkLiIpOworLy8gICBwcmludGVyLkFubm90YXRlKCJmaXJzdCIsICJsYXN0IiwgcGVyc29uXyk7CisvLworLy8gVGhpcyBjb2RlIHdvdWxkIGFzc29jaWF0ZSB0aGUgc3BhbiBjb3ZlcmluZyAiQWxpY2UgU21pdGgiIGluIHRoZSBvdXRwdXQgd2l0aAorLy8gdGhlIHBlcnNvbl8gZGVzY3JpcHRvci4KKy8vCisvLyBOb3RlIHRoYXQgdGhlIGJlZ2lubmluZyB2YXJpYWJsZSBtdXN0IGNvbWUgYmVmb3JlIChvciBvdmVybGFwIHdpdGgsIGluIHRoZQorLy8gY2FzZSBvZiB6ZXJvLXNpemVkIHN1YnN0aXR1dGlvbiB2YWx1ZXMpIHRoZSBlbmRpbmcgdmFyaWFibGUuCisvLworLy8gSXQgaXMgYWxzbyBzb21ldGltZXMgdXNlZnVsIHRvIHVzZSB2YXJpYWJsZXMgd2l0aCB6ZXJvLXNpemVkIHZhbHVlcyBhcworLy8gbWFya2Vycy4gIFRoaXMgYXZvaWRzIGlzc3VlcyB3aXRoIG11bHRpcGxlIHJlZmVyZW5jZXMgdG8gdGhlIHNhbWUgdmFyaWFibGUKKy8vIGFuZCBhbHNvIGFsbG93cyBhbm5vdGF0aW9uIHJhbmdlcyB0byBzcGFuIGxpdGVyYWwgdGV4dCBmcm9tIHRoZSBQcmludAorLy8gdGVtcGxhdGVzOgorLy8KKy8vICAgUHJpbnRlciBwcmludGVyKG91dHB1dCwgJyQnKTsKKy8vICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworLy8gICB2YXJzWyJmb28iXSA9ICJiYXIiOworLy8gICB2YXJzWyJmdW5jdGlvbiJdID0gImNhbGwiOworLy8gICB2YXJzWyJtYXJrIl0gPSAiIjsKKy8vICAgcHJpbnRlci5QcmludCh2YXJzLCAiJGZ1bmN0aW9uJCgkZm9vJCwkZm9vJCkkbWFyayQiKTsKKy8vICAgcHJpbnRlci5Bbm5vdGF0ZSgiZnVuY3Rpb24iLCAicm1hcmsiLCBjYWxsXyk7CisvLworLy8gVGhpcyBjb2RlIGFzc29jaWF0ZXMgdGhlIHNwYW4gY292ZXJpbmcgImNhbGwoYmFyLGJhcikiIGluIHRoZSBvdXRwdXQgd2l0aCB0aGUKKy8vIGNhbGxfIGRlc2NyaXB0b3IuCisKIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBQcmludGVyIHsKICBwdWJsaWM6CiAgIC8vIENyZWF0ZSBhIHByaW50ZXIgdGhhdCB3cml0ZXMgdGV4dCB0byB0aGUgZ2l2ZW4gb3V0cHV0IHN0cmVhbS4gIFVzZSB0aGUKICAgLy8gZ2l2ZW4gY2hhcmFjdGVyIGFzIHRoZSBkZWxpbWl0ZXIgZm9yIHZhcmlhYmxlcy4KICAgUHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlcik7CisKKyAgLy8gQ3JlYXRlIGEgcHJpbnRlciB0aGF0IHdyaXRlcyB0ZXh0IHRvIHRoZSBnaXZlbiBvdXRwdXQgc3RyZWFtLiAgVXNlIHRoZQorICAvLyBnaXZlbiBjaGFyYWN0ZXIgYXMgdGhlIGRlbGltaXRlciBmb3IgdmFyaWFibGVzLiAgSWYgYW5ub3RhdGlvbl9jb2xsZWN0b3IKKyAgLy8gaXMgbm90IG51bGwsIFByaW50ZXIgd2lsbCBwcm92aWRlIGl0IHdpdGggYW5ub3RhdGlvbnMgYWJvdXQgY29kZSB3cml0dGVuCisgIC8vIHRvIHRoZSBzdHJlYW0uICBhbm5vdGF0aW9uX2NvbGxlY3RvciBpcyBub3Qgb3duZWQgYnkgUHJpbnRlci4KKyAgUHJpbnRlcihaZXJvQ29weU91dHB1dFN0cmVhbSogb3V0cHV0LCBjaGFyIHZhcmlhYmxlX2RlbGltaXRlciwKKyAgICAgICAgICBBbm5vdGF0aW9uQ29sbGVjdG9yKiBhbm5vdGF0aW9uX2NvbGxlY3Rvcik7CisKICAgflByaW50ZXIoKTsKIAorICAvLyBMaW5rIGEgc3Vic2l0dXRpb24gdmFyaWFibGUgZW1pdHRlZCBieSB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBvYmplY3QKKyAgLy8gZGVzY3JpYmVkIGJ5IGRlc2NyaXB0b3IuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBTb21lRGVzY3JpcHRvcj4KKyAgdm9pZCBBbm5vdGF0ZShjb25zdCBjaGFyKiB2YXJuYW1lLCBjb25zdCBTb21lRGVzY3JpcHRvciogZGVzY3JpcHRvcikgeworICAgIEFubm90YXRlKHZhcm5hbWUsIHZhcm5hbWUsIGRlc2NyaXB0b3IpOworICB9CisKKyAgLy8gTGluayB0aGUgb3V0cHV0IHJhbmdlIGRlZmluZWQgYnkgdGhlIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgYXMgZW1pdHRlZCBieQorICAvLyB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBvYmplY3QgZGVzY3JpYmVkIGJ5IGRlc2NyaXB0b3IuIFRoZSByYW5nZQorICAvLyBiZWdpbnMgYXQgYmVnaW5fdmFybmFtZSdzIHZhbHVlIGFuZCBlbmRzIGFmdGVyIHRoZSBsYXN0IGNoYXJhY3RlciBvZiB0aGUKKyAgLy8gdmFsdWUgc3Vic3RpdHV0ZWQgZm9yIGVuZF92YXJuYW1lLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgU29tZURlc2NyaXB0b3I+CisgIHZvaWQgQW5ub3RhdGUoY29uc3QgY2hhciogYmVnaW5fdmFybmFtZSwgY29uc3QgY2hhciogZW5kX3Zhcm5hbWUsCisgICAgICAgICAgICAgICAgY29uc3QgU29tZURlc2NyaXB0b3IqIGRlc2NyaXB0b3IpIHsKKyAgICBpZiAoYW5ub3RhdGlvbl9jb2xsZWN0b3JfID09IE5VTEwpIHsKKyAgICAgIC8vIEFubm90YXRpb25zIGFyZW4ndCB0dXJuZWQgb24gZm9yIHRoaXMgUHJpbnRlciwgc28gZG9uJ3QgcGF5IHRoZSBjb3N0CisgICAgICAvLyBvZiBidWlsZGluZyB0aGUgbG9jYXRpb24gcGF0aC4KKyAgICAgIHJldHVybjsKKyAgICB9CisgICAgdmVjdG9yPGludD4gcGF0aDsKKyAgICBkZXNjcmlwdG9yLT5HZXRMb2NhdGlvblBhdGgoJnBhdGgpOworICAgIEFubm90YXRlKGJlZ2luX3Zhcm5hbWUsIGVuZF92YXJuYW1lLCBkZXNjcmlwdG9yLT5maWxlKCktPm5hbWUoKSwgcGF0aCk7CisgIH0KKwogICAvLyBQcmludCBzb21lIHRleHQgYWZ0ZXIgYXBwbHlpbmcgdmFyaWFibGUgc3Vic3RpdHV0aW9ucy4gIElmIGEgcGFydGljdWxhcgogICAvLyB2YXJpYWJsZSBpbiB0aGUgdGV4dCBpcyBub3QgZGVmaW5lZCwgdGhpcyB3aWxsIGNyYXNoLiAgVmFyaWFibGVzIHRvIGJlCiAgIC8vIHN1YnN0aXR1dGVkIGFyZSBpZGVudGlmaWVkIGJ5IHRoZWlyIG5hbWVzIHN1cnJvdW5kZWQgYnkgZGVsaW1pdGVyCkBAIC04Niw4ICsyMTgsNDEgQEAKICAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMyk7Ci0gIC8vIFRPRE8oa2VudG9uKTogIE92ZXJsb2FkZWQgdmVyc2lvbnMgd2l0aCBtb3JlIHZhcmlhYmxlcz8gIFRocmVlIHNlZW1zCi0gIC8vICAgdG8gYmUgZW5vdWdoLgorICAvLyBMaWtlIHRoZSBmaXJzdCBQcmludCgpLCBleGNlcHQgdGhlIHN1YnN0aXR1dGlvbnMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMywgY29uc3Qgc3RyaW5nJiB2YWx1ZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCk7CisgIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTQsIGNvbnN0IHN0cmluZyYgdmFsdWU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTUpOworICAvLyBMaWtlIHRoZSBmaXJzdCBQcmludCgpLCBleGNlcHQgdGhlIHN1YnN0aXR1dGlvbnMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMywgY29uc3Qgc3RyaW5nJiB2YWx1ZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTUsIGNvbnN0IHN0cmluZyYgdmFsdWU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTYpOworICAvLyBMaWtlIHRoZSBmaXJzdCBQcmludCgpLCBleGNlcHQgdGhlIHN1YnN0aXR1dGlvbnMgYXJlIGdpdmVuIGFzIHBhcmFtZXRlcnMuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgY29uc3QgY2hhciogdmFyaWFibGUxLCBjb25zdCBzdHJpbmcmIHZhbHVlMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTIsIGNvbnN0IHN0cmluZyYgdmFsdWUyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMywgY29uc3Qgc3RyaW5nJiB2YWx1ZTMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU0LCBjb25zdCBzdHJpbmcmIHZhbHVlNCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTUsIGNvbnN0IHN0cmluZyYgdmFsdWU1LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU3LCBjb25zdCBzdHJpbmcmIHZhbHVlNyk7CisgIC8vIExpa2UgdGhlIGZpcnN0IFByaW50KCksIGV4Y2VwdCB0aGUgc3Vic3RpdHV0aW9ucyBhcmUgZ2l2ZW4gYXMgcGFyYW1ldGVycy4KKyAgdm9pZCBQcmludChjb25zdCBjaGFyKiB0ZXh0LCBjb25zdCBjaGFyKiB2YXJpYWJsZTEsIGNvbnN0IHN0cmluZyYgdmFsdWUxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlMiwgY29uc3Qgc3RyaW5nJiB2YWx1ZTIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGUzLCBjb25zdCBzdHJpbmcmIHZhbHVlMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTQsIGNvbnN0IHN0cmluZyYgdmFsdWU0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlNSwgY29uc3Qgc3RyaW5nJiB2YWx1ZTUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogdmFyaWFibGU2LCBjb25zdCBzdHJpbmcmIHZhbHVlNiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiB2YXJpYWJsZTcsIGNvbnN0IHN0cmluZyYgdmFsdWU3LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqIHZhcmlhYmxlOCwgY29uc3Qgc3RyaW5nJiB2YWx1ZTgpOwogCiAgIC8vIEluZGVudCB0ZXh0IGJ5IHR3byBzcGFjZXMuICBBZnRlciBjYWxsaW5nIEluZGVudCgpLCB0d28gc3BhY2VzIHdpbGwgYmUKICAgLy8gaW5zZXJ0ZWQgYXQgdGhlIGJlZ2lubmluZyBvZiBlYWNoIGxpbmUgb2YgdGV4dC4gIEluZGVudCgpIG1heSBiZSBjYWxsZWQKQEAgLTExNiwxNiArMjgxLDQ4IEBACiAgIGJvb2wgZmFpbGVkKCkgY29uc3QgeyByZXR1cm4gZmFpbGVkXzsgfQogCiAgcHJpdmF0ZToKKyAgLy8gTGluayB0aGUgb3V0cHV0IHJhbmdlIGRlZmluZWQgYnkgdGhlIHN1YnN0aXR1dGlvbiB2YXJpYWJsZXMgYXMgZW1pdHRlZCBieQorICAvLyB0aGUgbGFzdCBjYWxsIHRvIFByaW50IHRvIHRoZSBvYmplY3QgZm91bmQgYXQgdGhlIFNvdXJjZUNvZGVJbmZvLXN0eWxlIHBhdGgKKyAgLy8gaW4gYSBmaWxlIHdpdGggcGF0aCBmaWxlX3BhdGguIFRoZSByYW5nZSBiZWdpbnMgYXQgdGhlIHN0YXJ0IG9mCisgIC8vIGJlZ2luX3Zhcm5hbWUncyB2YWx1ZSBhbmQgZW5kcyBhZnRlciB0aGUgbGFzdCBjaGFyYWN0ZXIgb2YgdGhlIHZhbHVlCisgIC8vIHN1YnN0aXR1dGVkIGZvciBlbmRfdmFybmFtZS4gTm90ZSB0aGF0IGJlZ2luX3Zhcm5hbWUgYW5kIGVuZF92YXJuYW1lCisgIC8vIG1heSByZWZlciB0byB0aGUgc2FtZSB2YXJpYWJsZS4KKyAgdm9pZCBBbm5vdGF0ZShjb25zdCBjaGFyKiBiZWdpbl92YXJuYW1lLCBjb25zdCBjaGFyKiBlbmRfdmFybmFtZSwKKyAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIGZpbGVfcGF0aCwgY29uc3QgdmVjdG9yPGludD4mIHBhdGgpOworCiAgIGNvbnN0IGNoYXIgdmFyaWFibGVfZGVsaW1pdGVyXzsKIAogICBaZXJvQ29weU91dHB1dFN0cmVhbSogY29uc3Qgb3V0cHV0XzsKICAgY2hhciogYnVmZmVyXzsKICAgaW50IGJ1ZmZlcl9zaXplXzsKKyAgLy8gVGhlIGN1cnJlbnQgcG9zaXRpb24sIGluIGJ5dGVzLCBpbiB0aGUgb3V0cHV0IHN0cmVhbS4gIFRoaXMgaXMgZXF1aXZhbGVudAorICAvLyB0byB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHRoYXQgaGF2ZSBiZWVuIHdyaXR0ZW4gc28gZmFyLiAgVGhpcyB2YWx1ZSBpcworICAvLyB1c2VkIHRvIGNhbGN1bGF0ZSBhbm5vdGF0aW9uIHJhbmdlcyBpbiB0aGUgc3Vic3RpdHV0aW9uc18gbWFwIGJlbG93LgorICBzaXplX3Qgb2Zmc2V0XzsKIAogICBzdHJpbmcgaW5kZW50XzsKICAgYm9vbCBhdF9zdGFydF9vZl9saW5lXzsKICAgYm9vbCBmYWlsZWRfOwogCisgIC8vIEEgbWFwIGZyb20gdmFyaWFibGUgbmFtZSB0byBbc3RhcnQsIGVuZCkgb2Zmc2V0cyBpbiB0aGUgb3V0cHV0IGJ1ZmZlci4KKyAgLy8gVGhlc2UgcmVmZXIgdG8gdGhlIG9mZnNldHMgdXNlZCBmb3IgYSB2YXJpYWJsZSBhZnRlciB0aGUgbGFzdCBjYWxsIHRvCisgIC8vIFByaW50LiAgSWYgYSB2YXJpYWJsZSB3YXMgdXNlZCBtb3JlIHRoYW4gb25jZSwgdGhlIGVudHJ5IHVzZWQgaW4KKyAgLy8gdGhpcyBtYXAgaXMgc2V0IHRvIGEgbmVnYXRpdmUtbGVuZ3RoIHNwYW4uICBGb3Igc2luZ2x5LXVzZWQgdmFyaWFibGVzLCB0aGUKKyAgLy8gc3RhcnQgb2Zmc2V0IGlzIHRoZSBiZWdpbm5pbmcgb2YgdGhlIHN1YnN0aXR1dGlvbjsgdGhlIGVuZCBvZmZzZXQgaXMgdGhlCisgIC8vIGxhc3QgYnl0ZSBvZiB0aGUgc3Vic3RpdHV0aW9uIHBsdXMgb25lIChzdWNoIHRoYXQgKGVuZCAtIHN0YXJ0KSBpcyB0aGUKKyAgLy8gbGVuZ3RoIG9mIHRoZSBzdWJzdGl0dXRlZCBzdHJpbmcpLgorICBtYXA8c3RyaW5nLCBwYWlyPHNpemVfdCwgc2l6ZV90PiA+IHN1YnN0aXR1dGlvbnNfOworCisgIC8vIFJldHVybnMgdHJ1ZSBhbmQgc2V0cyByYW5nZSB0byB0aGUgc3Vic3RpdHV0aW9uIHJhbmdlIGluIHRoZSBvdXRwdXQgZm9yCisgIC8vIHZhcm5hbWUgaWYgdmFybmFtZSB3YXMgdXNlZCBvbmNlIGluIHRoZSBsYXN0IGNhbGwgdG8gUHJpbnQuIElmIHZhcm5hbWUKKyAgLy8gd2FzIG5vdCB1c2VkLCBvciBpZiBpdCB3YXMgdXNlZCBtdWx0aXBsZSB0aW1lcywgcmV0dXJucyBmYWxzZSAoYW5kCisgIC8vIGZhaWxzIGEgZGVidWcgYXNzZXJ0aW9uKS4KKyAgYm9vbCBHZXRTdWJzdGl0dXRpb25SYW5nZShjb25zdCBjaGFyKiB2YXJuYW1lLCBwYWlyPHNpemVfdCwgc2l6ZV90PiogcmFuZ2UpOworCisgIC8vIElmIG5vbi1udWxsLCBhbm5vdGF0aW9uX2NvbGxlY3Rvcl8gaXMgdXNlZCB0byBzdG9yZSBhbm5vdGF0aW9ucyBhYm91dAorICAvLyBnZW5lcmF0ZWQgY29kZS4KKyAgQW5ub3RhdGlvbkNvbGxlY3RvciogY29uc3QgYW5ub3RhdGlvbl9jb2xsZWN0b3JfOworCiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQcmludGVyKTsKIH07CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9wcmludGVyX3VuaXR0ZXN0LmNjCmluZGV4IDU4MGE1M2QuLjk1ZjNhZmEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXJfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vcHJpbnRlcl91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzYsNyArMzYsOSBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3ByaW50ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgpAQCAtMTY4LDYgKzE3MCwxOTYgQEAKICAgICAgICAgICAgICAgIGJ1ZmZlcik7CiB9CiAKKy8vIE1vY2tEZXNjcmlwdG9yRmlsZSBkZWZpbmVzIG9ubHkgdGhvc2UgbWVtYmVycyB0aGF0IFByaW50ZXIgdXNlcyB0byB3cml0ZSBvdXQKKy8vIGFubm90YXRpb25zLgorY2xhc3MgTW9ja0Rlc2NyaXB0b3JGaWxlIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE1vY2tEZXNjcmlwdG9yRmlsZShjb25zdCBzdHJpbmcmIGZpbGUpIDogZmlsZV8oZmlsZSkge30KKworICAvLyBUaGUgbW9jayBmaWxlbmFtZSBmb3IgdGhpcyBmaWxlLgorICBjb25zdCBzdHJpbmcmIG5hbWUoKSBjb25zdCB7IHJldHVybiBmaWxlXzsgfQorCisgcHJpdmF0ZToKKyAgc3RyaW5nIGZpbGVfOworfTsKKworLy8gTW9ja0Rlc2NyaXB0b3IgZGVmaW5lcyBvbmx5IHRob3NlIG1lbWJlcnMgdGhhdCBQcmludGVyIHVzZXMgdG8gd3JpdGUgb3V0CisvLyBhbm5vdGF0aW9ucy4KK2NsYXNzIE1vY2tEZXNjcmlwdG9yIHsKKyBwdWJsaWM6CisgIE1vY2tEZXNjcmlwdG9yKGNvbnN0IHN0cmluZyYgZmlsZSwgY29uc3QgdmVjdG9yPGludD4mIHBhdGgpCisgICAgICA6IGZpbGVfKGZpbGUpLCBwYXRoXyhwYXRoKSB7fQorCisgIC8vIFRoZSBtb2NrIGZpbGUgaW4gd2hpY2ggdGhpcyBkZXNjcmlwdG9yIHdhcyBkZWZpbmVkLgorICBjb25zdCBNb2NrRGVzY3JpcHRvckZpbGUqIGZpbGUoKSBjb25zdCB7IHJldHVybiAmZmlsZV87IH0KKworIHByaXZhdGU6CisgIC8vIEFsbG93cyBhY2Nlc3MgdG8gR2V0TG9jYXRpb25QYXRoLgorICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjppbzo6UHJpbnRlcjsKKworICAvLyBDb3BpZXMgdGhlIHByZS1zdG9yZWQgcGF0aCB0byBvdXRwdXQuCisgIHZvaWQgR2V0TG9jYXRpb25QYXRoKHN0ZDo6dmVjdG9yPGludD4qIG91dHB1dCkgY29uc3QgeyAqb3V0cHV0ID0gcGF0aF87IH0KKworICBNb2NrRGVzY3JpcHRvckZpbGUgZmlsZV87CisgIHZlY3RvcjxpbnQ+IHBhdGhfOworfTsKKworVEVTVChQcmludGVyLCBBbm5vdGF0ZU1hcCkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgbWFwPHN0cmluZywgc3RyaW5nPiB2YXJzOworICAgIHZhcnNbImZvbyJdID0gIjMiOworICAgIHZhcnNbImJhciJdID0gIjUiOworICAgIHByaW50ZXIuUHJpbnQodmFycywgIjAxMiRmb28kNCRiYXIkXG4iKTsKKyAgICB2ZWN0b3I8aW50PiBwYXRoXzE7CisgICAgcGF0aF8xLnB1c2hfYmFjaygzMyk7CisgICAgdmVjdG9yPGludD4gcGF0aF8yOworICAgIHBhdGhfMi5wdXNoX2JhY2soMTEpOworICAgIHBhdGhfMi5wdXNoX2JhY2soMjIpOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfMSgicGF0aF8xIiwgcGF0aF8xKTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yXzIoInBhdGhfMiIsIHBhdGhfMik7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiZm9vIiwgImZvbyIsICZkZXNjcmlwdG9yXzEpOworICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcl8yKTsKKyAgfQorICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisgIEVYUEVDVF9TVFJFUSgiMDEyMzQ1XG4iLCBidWZmZXIpOworICBBU1NFUlRfRVEoMiwgaW5mby5hbm5vdGF0aW9uX3NpemUoKSk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBmb28gPSBpbmZvLmFubm90YXRpb24oMCkucGF0aF9zaXplKCkgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmluZm8uYW5ub3RhdGlvbigwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmluZm8uYW5ub3RhdGlvbigxKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9IGluZm8uYW5ub3RhdGlvbigwKS5wYXRoX3NpemUoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmaW5mby5hbm5vdGF0aW9uKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmaW5mby5hbm5vdGF0aW9uKDApOworICBBU1NFUlRfRVEoMSwgZm9vLT5wYXRoX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBiYXItPnBhdGhfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMzLCBmb28tPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoMTEsIGJhci0+cGF0aCgwKSk7CisgIEVYUEVDVF9FUSgyMiwgYmFyLT5wYXRoKDEpKTsKKyAgRVhQRUNUX0VRKCJwYXRoXzEiLCBmb28tPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoInBhdGhfMiIsIGJhci0+c291cmNlX2ZpbGUoKSk7CisgIEVYUEVDVF9FUSgzLCBmb28tPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNCwgZm9vLT5lbmQoKSk7CisgIEVYUEVDVF9FUSg1LCBiYXItPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNiwgYmFyLT5lbmQoKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVJbmxpbmUpIHsKKyAgY2hhciBidWZmZXJbODE5Ml07CisgIEFycmF5T3V0cHV0U3RyZWFtIG91dHB1dChidWZmZXIsIHNpemVvZihidWZmZXIpKTsKKyAgR2VuZXJhdGVkQ29kZUluZm8gaW5mbzsKKyAgQW5ub3RhdGlvblByb3RvQ29sbGVjdG9yPEdlbmVyYXRlZENvZGVJbmZvPiBpbmZvX2NvbGxlY3RvcigmaW5mbyk7CisgIHsKKyAgICBQcmludGVyIHByaW50ZXIoJm91dHB1dCwgJyQnLCAmaW5mb19jb2xsZWN0b3IpOworICAgIHByaW50ZXIuUHJpbnQoIjAxMiRmb28kNCRiYXIkXG4iLCAiZm9vIiwgIjMiLCAiYmFyIiwgIjUiKTsKKyAgICB2ZWN0b3I8aW50PiBwYXRoXzE7CisgICAgcGF0aF8xLnB1c2hfYmFjaygzMyk7CisgICAgdmVjdG9yPGludD4gcGF0aF8yOworICAgIHBhdGhfMi5wdXNoX2JhY2soMTEpOworICAgIHBhdGhfMi5wdXNoX2JhY2soMjIpOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3JfMSgicGF0aF8xIiwgcGF0aF8xKTsKKyAgICBNb2NrRGVzY3JpcHRvciBkZXNjcmlwdG9yXzIoInBhdGhfMiIsIHBhdGhfMik7CisgICAgcHJpbnRlci5Bbm5vdGF0ZSgiZm9vIiwgImZvbyIsICZkZXNjcmlwdG9yXzEpOworICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcl8yKTsKKyAgfQorICBidWZmZXJbb3V0cHV0LkJ5dGVDb3VudCgpXSA9ICdcMCc7CisgIEVYUEVDVF9TVFJFUSgiMDEyMzQ1XG4iLCBidWZmZXIpOworICBBU1NFUlRfRVEoMiwgaW5mby5hbm5vdGF0aW9uX3NpemUoKSk7CisgIGNvbnN0IEdlbmVyYXRlZENvZGVJbmZvOjpBbm5vdGF0aW9uKiBmb28gPSBpbmZvLmFubm90YXRpb24oMCkucGF0aF9zaXplKCkgPT0gMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gJmluZm8uYW5ub3RhdGlvbigwKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDogJmluZm8uYW5ub3RhdGlvbigxKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9IGluZm8uYW5ub3RhdGlvbigwKS5wYXRoX3NpemUoKSA9PSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyAmaW5mby5hbm5vdGF0aW9uKDEpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAmaW5mby5hbm5vdGF0aW9uKDApOworICBBU1NFUlRfRVEoMSwgZm9vLT5wYXRoX3NpemUoKSk7CisgIEFTU0VSVF9FUSgyLCBiYXItPnBhdGhfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMzLCBmb28tPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoMTEsIGJhci0+cGF0aCgwKSk7CisgIEVYUEVDVF9FUSgyMiwgYmFyLT5wYXRoKDEpKTsKKyAgRVhQRUNUX0VRKCJwYXRoXzEiLCBmb28tPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoInBhdGhfMiIsIGJhci0+c291cmNlX2ZpbGUoKSk7CisgIEVYUEVDVF9FUSgzLCBmb28tPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNCwgZm9vLT5lbmQoKSk7CisgIEVYUEVDVF9FUSg1LCBiYXItPmJlZ2luKCkpOworICBFWFBFQ1RfRVEoNiwgYmFyLT5lbmQoKSk7Cit9CisKK1RFU1QoUHJpbnRlciwgQW5ub3RhdGVSYW5nZSkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGJhciRcbiIsICJmb28iLCAiMyIsICJiYXIiLCAiNSIpOworICAgIHZlY3RvcjxpbnQ+IHBhdGg7CisgICAgcGF0aC5wdXNoX2JhY2soMzMpOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IoInBhdGgiLCBwYXRoKTsKKyAgICBwcmludGVyLkFubm90YXRlKCJmb28iLCAiYmFyIiwgJmRlc2NyaXB0b3IpOworICB9CisgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKKyAgRVhQRUNUX1NUUkVRKCIwMTIzNDVcbiIsIGJ1ZmZlcik7CisgIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGZvb2JhciA9ICZpbmZvLmFubm90YXRpb24oMCk7CisgIEFTU0VSVF9FUSgxLCBmb29iYXItPnBhdGhfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMzLCBmb29iYXItPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBmb29iYXItPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoMywgZm9vYmFyLT5iZWdpbigpKTsKKyAgRVhQRUNUX0VRKDYsIGZvb2Jhci0+ZW5kKCkpOworfQorCitURVNUKFByaW50ZXIsIEFubm90YXRlRW1wdHlSYW5nZSkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGJheiQkYmFtJCRiYXIkXG4iLCAiZm9vIiwgIjMiLCAiYmFyIiwgIjUiLCAiYmF6IiwKKyAgICAgICAgICAgICAgICAgICIiLCAiYmFtIiwgIiIpOworICAgIHZlY3RvcjxpbnQ+IHBhdGg7CisgICAgcGF0aC5wdXNoX2JhY2soMzMpOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IoInBhdGgiLCBwYXRoKTsKKyAgICBwcmludGVyLkFubm90YXRlKCJiYXoiLCAiYmFtIiwgJmRlc2NyaXB0b3IpOworICB9CisgIGJ1ZmZlcltvdXRwdXQuQnl0ZUNvdW50KCldID0gJ1wwJzsKKyAgRVhQRUNUX1NUUkVRKCIwMTIzNDVcbiIsIGJ1ZmZlcik7CisgIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhemJhbSA9ICZpbmZvLmFubm90YXRpb24oMCk7CisgIEFTU0VSVF9FUSgxLCBiYXpiYW0tPnBhdGhfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMzLCBiYXpiYW0tPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBiYXpiYW0tPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoNSwgYmF6YmFtLT5iZWdpbigpKTsKKyAgRVhQRUNUX0VRKDUsIGJhemJhbS0+ZW5kKCkpOworfQorCitURVNUKFByaW50ZXIsIEFubm90YXRlRGVzcGl0ZVVucmVsYXRlZE11bHRpcGxlVXNlcykgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGZvbyQkYmFyJFxuIiwgImZvbyIsICIzIiwgImJhciIsICI1Iik7CisgICAgdmVjdG9yPGludD4gcGF0aDsKKyAgICBwYXRoLnB1c2hfYmFjaygzMyk7CisgICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcigicGF0aCIsIHBhdGgpOworICAgIHByaW50ZXIuQW5ub3RhdGUoImJhciIsICJiYXIiLCAmZGVzY3JpcHRvcik7CisgIH0KKyAgYnVmZmVyW291dHB1dC5CeXRlQ291bnQoKV0gPSAnXDAnOworICBFWFBFQ1RfU1RSRVEoIjAxMjM0MzVcbiIsIGJ1ZmZlcik7CisgIEFTU0VSVF9FUSgxLCBpbmZvLmFubm90YXRpb25fc2l6ZSgpKTsKKyAgY29uc3QgR2VuZXJhdGVkQ29kZUluZm86OkFubm90YXRpb24qIGJhciA9ICZpbmZvLmFubm90YXRpb24oMCk7CisgIEFTU0VSVF9FUSgxLCBiYXItPnBhdGhfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDMzLCBiYXItPnBhdGgoMCkpOworICBFWFBFQ1RfRVEoInBhdGgiLCBiYXItPnNvdXJjZV9maWxlKCkpOworICBFWFBFQ1RfRVEoNiwgYmFyLT5iZWdpbigpKTsKKyAgRVhQRUNUX0VRKDcsIGJhci0+ZW5kKCkpOworfQorCiBURVNUKFByaW50ZXIsIEluZGVudGluZykgewogICBjaGFyIGJ1ZmZlcls4MTkyXTsKIApAQCAtMjIwLDcgKzQxMiw3IEBACiB9CiAKIC8vIERlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgYXMgb2YgeWV0LgotI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKIFRFU1QoUHJpbnRlciwgRGVhdGgpIHsKICAgY2hhciBidWZmZXJbODE5Ml07CiAKQEAgLTIzMSw5ICs0MjMsNzkgQEAKICAgRVhQRUNUX0RFQlVHX0RFQVRIKHByaW50ZXIuUHJpbnQoIiR1bmNsb3NlZCIpLCAiVW5jbG9zZWQgdmFyaWFibGUgbmFtZSIpOwogICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5PdXRkZW50KCksICJ3aXRob3V0IG1hdGNoaW5nIEluZGVudCIpOwogfQotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAogCi1URVNUKFByaW50ZXIsIFdyaXRlRmFpbHVyZSkgeworVEVTVChQcmludGVyLCBBbm5vdGF0ZU11bHRpcGxlVXNlc0RlYXRoKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIEFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gaW5mb19jb2xsZWN0b3IoJmluZm8pOworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJywgJmluZm9fY29sbGVjdG9yKTsKKyAgICBwcmludGVyLlByaW50KCIwMTIkZm9vJDQkZm9vJFxuIiwgImZvbyIsICIzIik7CisgICAgdmVjdG9yPGludD4gcGF0aDsKKyAgICBwYXRoLnB1c2hfYmFjaygzMyk7CisgICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcigicGF0aCIsIHBhdGgpOworICAgIEVYUEVDVF9ERUJVR19ERUFUSChwcmludGVyLkFubm90YXRlKCJmb28iLCAiZm9vIiwgJmRlc2NyaXB0b3IpLCAibXVsdGlwbGUiKTsKKyAgfQorfQorCitURVNUKFByaW50ZXIsIEFubm90YXRlTmVnYXRpdmVMZW5ndGhEZWF0aCkgeworICBjaGFyIGJ1ZmZlcls4MTkyXTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwgc2l6ZW9mKGJ1ZmZlcikpOworICBHZW5lcmF0ZWRDb2RlSW5mbyBpbmZvOworICBBbm5vdGF0aW9uUHJvdG9Db2xsZWN0b3I8R2VuZXJhdGVkQ29kZUluZm8+IGluZm9fY29sbGVjdG9yKCZpbmZvKTsKKyAgeworICAgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcsICZpbmZvX2NvbGxlY3Rvcik7CisgICAgcHJpbnRlci5QcmludCgiMDEyJGZvbyQ0JGJhciRcbiIsICJmb28iLCAiMyIsICJiYXIiLCAiNSIpOworICAgIHZlY3RvcjxpbnQ+IHBhdGg7CisgICAgcGF0aC5wdXNoX2JhY2soMzMpOworICAgIE1vY2tEZXNjcmlwdG9yIGRlc2NyaXB0b3IoInBhdGgiLCBwYXRoKTsKKyAgICBFWFBFQ1RfREVCVUdfREVBVEgocHJpbnRlci5Bbm5vdGF0ZSgiYmFyIiwgImZvbyIsICZkZXNjcmlwdG9yKSwgIm5lZ2F0aXZlIik7CisgIH0KK30KKworVEVTVChQcmludGVyLCBBbm5vdGF0ZVVuZGVmaW5lZERlYXRoKSB7CisgIGNoYXIgYnVmZmVyWzgxOTJdOworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIEdlbmVyYXRlZENvZGVJbmZvIGluZm87CisgIEFubm90YXRpb25Qcm90b0NvbGxlY3RvcjxHZW5lcmF0ZWRDb2RlSW5mbz4gaW5mb19jb2xsZWN0b3IoJmluZm8pOworICB7CisgICAgUHJpbnRlciBwcmludGVyKCZvdXRwdXQsICckJywgJmluZm9fY29sbGVjdG9yKTsKKyAgICBwcmludGVyLlByaW50KCIwMTIkZm9vJDQkZm9vJFxuIiwgImZvbyIsICIzIik7CisgICAgdmVjdG9yPGludD4gcGF0aDsKKyAgICBwYXRoLnB1c2hfYmFjaygzMyk7CisgICAgTW9ja0Rlc2NyaXB0b3IgZGVzY3JpcHRvcigicGF0aCIsIHBhdGgpOworICAgIEVYUEVDVF9ERUJVR19ERUFUSChwcmludGVyLkFubm90YXRlKCJiYXIiLCAiYmFyIiwgJmRlc2NyaXB0b3IpLAorICAgICAgICAgICAgICAgICAgICAgICAiVW5kZWZpbmVkIik7CisgIH0KK30KKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworVEVTVChQcmludGVyLCBXcml0ZUZhaWx1cmVQYXJ0aWFsKSB7CisgIGNoYXIgYnVmZmVyWzE3XTsKKworICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CisgIFByaW50ZXIgcHJpbnRlcigmb3V0cHV0LCAnJCcpOworCisgIC8vIFByaW50IDE2IGJ5dGVzIHRvIGFsbW9zdCBmaWxsIHRoZSBidWZmZXIgKHNob3VsZCBub3QgZmFpbCkuCisgIHByaW50ZXIuUHJpbnQoIjAxMjM0NTY3ODlhYmNkZWYiKTsKKyAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuZmFpbGVkKCkpOworCisgIC8vIFRyeSB0byBwcmludCAyIGNoYXJzLiBPbmx5IG9uZSBmaXRzLgorICBwcmludGVyLlByaW50KCI8PiIpOworICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKKworICAvLyBBbnl0aGluZyBlbHNlIHNob3VsZCBmYWlsIHRvby4KKyAgcHJpbnRlci5QcmludCgiICIpOworICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKKyAgcHJpbnRlci5QcmludCgiYmxhaCIpOworICBFWFBFQ1RfVFJVRShwcmludGVyLmZhaWxlZCgpKTsKKworICAvLyBCdWZmZXIgc2hvdWxkIGNvbnRhaW4gdGhlIGZpcnN0IDE3IGJ5dGVzIHdyaXR0ZW4uCisgIEVYUEVDVF9FUSgiMDEyMzQ1Njc4OWFiY2RlZjwiLCBzdHJpbmcoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSkpOworfQorCitURVNUKFByaW50ZXIsIFdyaXRlRmFpbHVyZUV4YWN0KSB7CiAgIGNoYXIgYnVmZmVyWzE2XTsKIAogICBBcnJheU91dHB1dFN0cmVhbSBvdXRwdXQoYnVmZmVyLCBzaXplb2YoYnVmZmVyKSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmNjCmluZGV4IDUxMzgzMWQuLmIzNTUwZGYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplci5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTg5LDggKzg5LDEzIEBACiAvLyBleGFjdGx5IHByZXR0eS4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3N0cnRvZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtMTE4LDYgKzEyMyw4IEBACiAKIENIQVJBQ1RFUl9DTEFTUyhXaGl0ZXNwYWNlLCBjID09ICcgJyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHQnIHx8CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYyA9PSAnXHInIHx8IGMgPT0gJ1x2JyB8fCBjID09ICdcZicpOworQ0hBUkFDVEVSX0NMQVNTKFdoaXRlc3BhY2VOb05ld2xpbmUsIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGMgPT0gJ1xyJyB8fCBjID09ICdcdicgfHwgYyA9PSAnXGYnKTsKIAogQ0hBUkFDVEVSX0NMQVNTKFVucHJpbnRhYmxlLCBjIDwgJyAnICYmIGMgPiAnXDAnKTsKIApAQCAtMTg3LDkgKzE5NCwxMiBAQAogICAgIHJlYWRfZXJyb3JfKGZhbHNlKSwKICAgICBsaW5lXygwKSwKICAgICBjb2x1bW5fKDApLAotICAgIHRva2VuX3N0YXJ0XygtMSksCisgICAgcmVjb3JkX3RhcmdldF8oTlVMTCksCisgICAgcmVjb3JkX3N0YXJ0XygtMSksCiAgICAgYWxsb3dfZl9hZnRlcl9mbG9hdF8oZmFsc2UpLAotICAgIGNvbW1lbnRfc3R5bGVfKENQUF9DT01NRU5UX1NUWUxFKSB7CisgICAgY29tbWVudF9zdHlsZV8oQ1BQX0NPTU1FTlRfU1RZTEUpLAorICAgIHJlcXVpcmVfc3BhY2VfYWZ0ZXJfbnVtYmVyXyh0cnVlKSwKKyAgICBhbGxvd19tdWx0aWxpbmVfc3RyaW5nc18oZmFsc2UpIHsKIAogICBjdXJyZW50Xy5saW5lID0gMDsKICAgY3VycmVudF8uY29sdW1uID0gMDsKQEAgLTIzOCw5ICsyNDgsOSBAQAogICB9CiAKICAgLy8gSWYgd2UncmUgaW4gYSB0b2tlbiwgYXBwZW5kIHRoZSByZXN0IG9mIHRoZSBidWZmZXIgdG8gaXQuCi0gIGlmICh0b2tlbl9zdGFydF8gPj0gMCAmJiB0b2tlbl9zdGFydF8gPCBidWZmZXJfc2l6ZV8pIHsKLSAgICBjdXJyZW50Xy50ZXh0LmFwcGVuZChidWZmZXJfICsgdG9rZW5fc3RhcnRfLCBidWZmZXJfc2l6ZV8gLSB0b2tlbl9zdGFydF8pOwotICAgIHRva2VuX3N0YXJ0XyA9IDA7CisgIGlmIChyZWNvcmRfdGFyZ2V0XyAhPSBOVUxMICYmIHJlY29yZF9zdGFydF8gPCBidWZmZXJfc2l6ZV8pIHsKKyAgICByZWNvcmRfdGFyZ2V0Xy0+YXBwZW5kKGJ1ZmZlcl8gKyByZWNvcmRfc3RhcnRfLCBidWZmZXJfc2l6ZV8gLSByZWNvcmRfc3RhcnRfKTsKKyAgICByZWNvcmRfc3RhcnRfID0gMDsKICAgfQogCiAgIGNvbnN0IHZvaWQqIGRhdGEgPSBOVUxMOwpAQCAtMjYxLDIzICsyNzEsMzMgQEAKICAgY3VycmVudF9jaGFyXyA9IGJ1ZmZlcl9bMF07CiB9CiAKLWlubGluZSB2b2lkIFRva2VuaXplcjo6U3RhcnRUb2tlbigpIHsKLSAgdG9rZW5fc3RhcnRfID0gYnVmZmVyX3Bvc187Ci0gIGN1cnJlbnRfLnR5cGUgPSBUWVBFX1NUQVJUOyAgICAvLyBKdXN0IGZvciB0aGUgc2FrZSBvZiBpbml0aWFsaXppbmcgaXQuCi0gIGN1cnJlbnRfLnRleHQuY2xlYXIoKTsKLSAgY3VycmVudF8ubGluZSA9IGxpbmVfOwotICBjdXJyZW50Xy5jb2x1bW4gPSBjb2x1bW5fOworaW5saW5lIHZvaWQgVG9rZW5pemVyOjpSZWNvcmRUbyhzdHJpbmcqIHRhcmdldCkgeworICByZWNvcmRfdGFyZ2V0XyA9IHRhcmdldDsKKyAgcmVjb3JkX3N0YXJ0XyA9IGJ1ZmZlcl9wb3NfOwogfQogCi1pbmxpbmUgdm9pZCBUb2tlbml6ZXI6OkVuZFRva2VuKCkgeworaW5saW5lIHZvaWQgVG9rZW5pemVyOjpTdG9wUmVjb3JkaW5nKCkgewogICAvLyBOb3RlOiAgVGhlIGlmKCkgaXMgbmVjZXNzYXJ5IGJlY2F1c2Ugc29tZSBTVEwgaW1wbGVtZW50YXRpb25zIGNyYXNoIHdoZW4KICAgLy8gICB5b3UgY2FsbCBzdHJpbmc6OmFwcGVuZChOVUxMLCAwKSwgcHJlc3VtYWJseSBiZWNhdXNlIHRoZXkgYXJlIHRyeWluZyB0bwogICAvLyAgIGJlIGhlbHBmdWwgYnkgZGV0ZWN0aW5nIHRoZSBOVUxMIHBvaW50ZXIsIGV2ZW4gdGhvdWdoIHRoZXJlJ3Mgbm90aGluZwogICAvLyAgIHdyb25nIHdpdGggcmVhZGluZyB6ZXJvIGJ5dGVzIGZyb20gTlVMTC4KLSAgaWYgKGJ1ZmZlcl9wb3NfICE9IHRva2VuX3N0YXJ0XykgewotICAgIGN1cnJlbnRfLnRleHQuYXBwZW5kKGJ1ZmZlcl8gKyB0b2tlbl9zdGFydF8sIGJ1ZmZlcl9wb3NfIC0gdG9rZW5fc3RhcnRfKTsKKyAgaWYgKGJ1ZmZlcl9wb3NfICE9IHJlY29yZF9zdGFydF8pIHsKKyAgICByZWNvcmRfdGFyZ2V0Xy0+YXBwZW5kKGJ1ZmZlcl8gKyByZWNvcmRfc3RhcnRfLCBidWZmZXJfcG9zXyAtIHJlY29yZF9zdGFydF8pOwogICB9Ci0gIHRva2VuX3N0YXJ0XyA9IC0xOworICByZWNvcmRfdGFyZ2V0XyA9IE5VTEw7CisgIHJlY29yZF9zdGFydF8gPSAtMTsKK30KKworaW5saW5lIHZvaWQgVG9rZW5pemVyOjpTdGFydFRva2VuKCkgeworICBjdXJyZW50Xy50eXBlID0gVFlQRV9TVEFSVDsgICAgLy8gSnVzdCBmb3IgdGhlIHNha2Ugb2YgaW5pdGlhbGl6aW5nIGl0LgorICBjdXJyZW50Xy50ZXh0LmNsZWFyKCk7CisgIGN1cnJlbnRfLmxpbmUgPSBsaW5lXzsKKyAgY3VycmVudF8uY29sdW1uID0gY29sdW1uXzsKKyAgUmVjb3JkVG8oJmN1cnJlbnRfLnRleHQpOworfQorCitpbmxpbmUgdm9pZCBUb2tlbml6ZXI6OkVuZFRva2VuKCkgeworICBTdG9wUmVjb3JkaW5nKCk7CiAgIGN1cnJlbnRfLmVuZF9jb2x1bW4gPSBjb2x1bW5fOwogfQogCkBAIC0zMzQsOSArMzU0LDE2IEBACiAgIHdoaWxlICh0cnVlKSB7CiAgICAgc3dpdGNoIChjdXJyZW50X2NoYXJfKSB7CiAgICAgICBjYXNlICdcMCc6Ci0gICAgICBjYXNlICdcbic6IHsKLSAgICAgICAgQWRkRXJyb3IoIlN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLiIpOworICAgICAgICBBZGRFcnJvcigiVW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nLiIpOwogICAgICAgICByZXR1cm47CisKKyAgICAgIGNhc2UgJ1xuJzogeworICAgICAgICBpZiAoIWFsbG93X211bHRpbGluZV9zdHJpbmdzXykgeworICAgICAgICAgIEFkZEVycm9yKCJTdHJpbmcgbGl0ZXJhbHMgY2Fubm90IGNyb3NzIGxpbmUgYm91bmRhcmllcy4iKTsKKyAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgTmV4dENoYXIoKTsKKyAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKICAgICAgIGNhc2UgJ1xcJzogewpAQCAtMzQ4LDExICszNzUsMzIgQEAKICAgICAgICAgICAvLyBQb3NzaWJseSBmb2xsb3dlZCBieSB0d28gbW9yZSBvY3RhbCBkaWdpdHMsIGJ1dCB0aGVzZSB3aWxsCiAgICAgICAgICAgLy8ganVzdCBiZSBjb25zdW1lZCBieSB0aGUgbWFpbiBsb29wIGFueXdheSBzbyB3ZSBkb24ndCBuZWVkCiAgICAgICAgICAgLy8gdG8gZG8gc28gZXhwbGljaXRseSBoZXJlLgotICAgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ3gnKSB8fCBUcnlDb25zdW1lKCdYJykpIHsKKyAgICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCd4JykpIHsKICAgICAgICAgICBpZiAoIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkpIHsKICAgICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBoZXggZGlnaXRzIGZvciBlc2NhcGUgc2VxdWVuY2UuIik7CiAgICAgICAgICAgfQogICAgICAgICAgIC8vIFBvc3NpYmx5IGZvbGxvd2VkIGJ5IGFub3RoZXIgaGV4IGRpZ2l0LCBidXQgYWdhaW4gd2UgZG9uJ3QgY2FyZS4KKyAgICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCd1JykpIHsKKyAgICAgICAgICBpZiAoIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKKyAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKKyAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkgfHwKKyAgICAgICAgICAgICAgIVRyeUNvbnN1bWVPbmU8SGV4RGlnaXQ+KCkpIHsKKyAgICAgICAgICAgIEFkZEVycm9yKCJFeHBlY3RlZCBmb3VyIGhleCBkaWdpdHMgZm9yIFxcdSBlc2NhcGUgc2VxdWVuY2UuIik7CisgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJ1UnKSkgeworICAgICAgICAgIC8vIFdlIGV4cGVjdCA4IGhleCBkaWdpdHM7IGJ1dCBvbmx5IHRoZSByYW5nZSB1cCB0byAweDEwZmZmZiBpcworICAgICAgICAgIC8vIGxlZ2FsLgorICAgICAgICAgIGlmICghVHJ5Q29uc3VtZSgnMCcpIHx8CisgICAgICAgICAgICAgICFUcnlDb25zdW1lKCcwJykgfHwKKyAgICAgICAgICAgICAgIShUcnlDb25zdW1lKCcwJykgfHwgVHJ5Q29uc3VtZSgnMScpKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSB8fAorICAgICAgICAgICAgICAhVHJ5Q29uc3VtZU9uZTxIZXhEaWdpdD4oKSkgeworICAgICAgICAgICAgQWRkRXJyb3IoIkV4cGVjdGVkIGVpZ2h0IGhleCBkaWdpdHMgdXAgdG8gMTBmZmZmIGZvciBcXFUgZXNjYXBlICIKKyAgICAgICAgICAgICAgICAgICAgICJzZXF1ZW5jZSIpOworICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICBBZGRFcnJvcigiSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgaW4gc3RyaW5nIGxpdGVyYWwuIik7CiAgICAgICAgIH0KQEAgLTQxMiw3ICs0NjAsNyBAQAogICAgIH0KICAgfQogCi0gIGlmIChMb29raW5nQXQ8TGV0dGVyPigpKSB7CisgIGlmIChMb29raW5nQXQ8TGV0dGVyPigpICYmIHJlcXVpcmVfc3BhY2VfYWZ0ZXJfbnVtYmVyXykgewogICAgIEFkZEVycm9yKCJOZWVkIHNwYWNlIGJldHdlZW4gbnVtYmVyIGFuZCBpZGVudGlmaWVyLiIpOwogICB9IGVsc2UgaWYgKGN1cnJlbnRfY2hhcl8gPT0gJy4nKSB7CiAgICAgaWYgKGlzX2Zsb2F0KSB7CkBAIC00MjYsMjYgKzQ3NCw1MSBAQAogICByZXR1cm4gaXNfZmxvYXQgPyBUWVBFX0ZMT0FUIDogVFlQRV9JTlRFR0VSOwogfQogCi12b2lkIFRva2VuaXplcjo6Q29uc3VtZUxpbmVDb21tZW50KCkgewordm9pZCBUb2tlbml6ZXI6OkNvbnN1bWVMaW5lQ29tbWVudChzdHJpbmcqIGNvbnRlbnQpIHsKKyAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgUmVjb3JkVG8oY29udGVudCk7CisKICAgd2hpbGUgKGN1cnJlbnRfY2hhcl8gIT0gJ1wwJyAmJiBjdXJyZW50X2NoYXJfICE9ICdcbicpIHsKICAgICBOZXh0Q2hhcigpOwogICB9CiAgIFRyeUNvbnN1bWUoJ1xuJyk7CisKKyAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgU3RvcFJlY29yZGluZygpOwogfQogCi12b2lkIFRva2VuaXplcjo6Q29uc3VtZUJsb2NrQ29tbWVudCgpIHsKK3ZvaWQgVG9rZW5pemVyOjpDb25zdW1lQmxvY2tDb21tZW50KHN0cmluZyogY29udGVudCkgewogICBpbnQgc3RhcnRfbGluZSA9IGxpbmVfOwogICBpbnQgc3RhcnRfY29sdW1uID0gY29sdW1uXyAtIDI7CiAKKyAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgUmVjb3JkVG8oY29udGVudCk7CisKICAgd2hpbGUgKHRydWUpIHsKICAgICB3aGlsZSAoY3VycmVudF9jaGFyXyAhPSAnXDAnICYmCiAgICAgICAgICAgIGN1cnJlbnRfY2hhcl8gIT0gJyonICYmCi0gICAgICAgICAgIGN1cnJlbnRfY2hhcl8gIT0gJy8nKSB7CisgICAgICAgICAgIGN1cnJlbnRfY2hhcl8gIT0gJy8nICYmCisgICAgICAgICAgIGN1cnJlbnRfY2hhcl8gIT0gJ1xuJykgewogICAgICAgTmV4dENoYXIoKTsKICAgICB9CiAKLSAgICBpZiAoVHJ5Q29uc3VtZSgnKicpICYmIFRyeUNvbnN1bWUoJy8nKSkgeworICAgIGlmIChUcnlDb25zdW1lKCdcbicpKSB7CisgICAgICBpZiAoY29udGVudCAhPSBOVUxMKSBTdG9wUmVjb3JkaW5nKCk7CisKKyAgICAgIC8vIENvbnN1bWUgbGVhZGluZyB3aGl0ZXNwYWNlIGFuZCBhc3RlcmlzazsKKyAgICAgIENvbnN1bWVaZXJvT3JNb3JlPFdoaXRlc3BhY2VOb05ld2xpbmU+KCk7CisgICAgICBpZiAoVHJ5Q29uc3VtZSgnKicpKSB7CisgICAgICAgIGlmIChUcnlDb25zdW1lKCcvJykpIHsKKyAgICAgICAgICAvLyBFbmQgb2YgY29tbWVudC4KKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICBpZiAoY29udGVudCAhPSBOVUxMKSBSZWNvcmRUbyhjb250ZW50KTsKKyAgICB9IGVsc2UgaWYgKFRyeUNvbnN1bWUoJyonKSAmJiBUcnlDb25zdW1lKCcvJykpIHsKICAgICAgIC8vIEVuZCBvZiBjb21tZW50LgorICAgICAgaWYgKGNvbnRlbnQgIT0gTlVMTCkgeworICAgICAgICBTdG9wUmVjb3JkaW5nKCk7CisgICAgICAgIC8vIFN0cmlwIHRyYWlsaW5nICIqLyIuCisgICAgICAgIGNvbnRlbnQtPmVyYXNlKGNvbnRlbnQtPnNpemUoKSAtIDIpOworICAgICAgfQogICAgICAgYnJlYWs7CiAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcvJykgJiYgY3VycmVudF9jaGFyXyA9PSAnKicpIHsKICAgICAgIC8vIE5vdGU6ICBXZSBkaWRuJ3QgY29uc3VtZSB0aGUgJyonIGJlY2F1c2UgaWYgdGhlcmUgaXMgYSAnLycgYWZ0ZXIgaXQKQEAgLTQ1Niw0MiArNTI5LDU5IEBACiAgICAgICBBZGRFcnJvcigiRW5kLW9mLWZpbGUgaW5zaWRlIGJsb2NrIGNvbW1lbnQuIik7CiAgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcigKICAgICAgICAgc3RhcnRfbGluZSwgc3RhcnRfY29sdW1uLCAiICBDb21tZW50IHN0YXJ0ZWQgaGVyZS4iKTsKKyAgICAgIGlmIChjb250ZW50ICE9IE5VTEwpIFN0b3BSZWNvcmRpbmcoKTsKICAgICAgIGJyZWFrOwogICAgIH0KICAgfQogfQogCitUb2tlbml6ZXI6Ok5leHRDb21tZW50U3RhdHVzIFRva2VuaXplcjo6VHJ5Q29uc3VtZUNvbW1lbnRTdGFydCgpIHsKKyAgaWYgKGNvbW1lbnRfc3R5bGVfID09IENQUF9DT01NRU5UX1NUWUxFICYmIFRyeUNvbnN1bWUoJy8nKSkgeworICAgIGlmIChUcnlDb25zdW1lKCcvJykpIHsKKyAgICAgIHJldHVybiBMSU5FX0NPTU1FTlQ7CisgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcqJykpIHsKKyAgICAgIHJldHVybiBCTE9DS19DT01NRU5UOworICAgIH0gZWxzZSB7CisgICAgICAvLyBPb3BzLCBpdCB3YXMganVzdCBhIHNsYXNoLiAgUmV0dXJuIGl0LgorICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1lNQk9MOworICAgICAgY3VycmVudF8udGV4dCA9ICIvIjsKKyAgICAgIGN1cnJlbnRfLmxpbmUgPSBsaW5lXzsKKyAgICAgIGN1cnJlbnRfLmNvbHVtbiA9IGNvbHVtbl8gLSAxOworICAgICAgY3VycmVudF8uZW5kX2NvbHVtbiA9IGNvbHVtbl87CisgICAgICByZXR1cm4gU0xBU0hfTk9UX0NPTU1FTlQ7CisgICAgfQorICB9IGVsc2UgaWYgKGNvbW1lbnRfc3R5bGVfID09IFNIX0NPTU1FTlRfU1RZTEUgJiYgVHJ5Q29uc3VtZSgnIycpKSB7CisgICAgcmV0dXJuIExJTkVfQ09NTUVOVDsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gTk9fQ09NTUVOVDsKKyAgfQorfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGJvb2wgVG9rZW5pemVyOjpOZXh0KCkgewogICBwcmV2aW91c18gPSBjdXJyZW50XzsKIAotICAvLyBEaWQgd2Ugc2tpcCBhbnkgY2hhcmFjdGVycyBhZnRlciB0aGUgbGFzdCB0b2tlbj8KLSAgYm9vbCBza2lwcGVkX3N0dWZmID0gZmFsc2U7Ci0KICAgd2hpbGUgKCFyZWFkX2Vycm9yXykgewotICAgIGlmIChUcnlDb25zdW1lT25lPFdoaXRlc3BhY2U+KCkpIHsKLSAgICAgIENvbnN1bWVaZXJvT3JNb3JlPFdoaXRlc3BhY2U+KCk7CisgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZT4oKTsKIAotICAgIH0gZWxzZSBpZiAoY29tbWVudF9zdHlsZV8gPT0gQ1BQX0NPTU1FTlRfU1RZTEUgJiYgVHJ5Q29uc3VtZSgnLycpKSB7Ci0gICAgICAvLyBTdGFydGluZyBhIGNvbW1lbnQ/Ci0gICAgICBpZiAoVHJ5Q29uc3VtZSgnLycpKSB7Ci0gICAgICAgIENvbnN1bWVMaW5lQ29tbWVudCgpOwotICAgICAgfSBlbHNlIGlmIChUcnlDb25zdW1lKCcqJykpIHsKLSAgICAgICAgQ29uc3VtZUJsb2NrQ29tbWVudCgpOwotICAgICAgfSBlbHNlIHsKLSAgICAgICAgLy8gT29wcywgaXQgd2FzIGp1c3QgYSBzbGFzaC4gIFJldHVybiBpdC4KLSAgICAgICAgY3VycmVudF8udHlwZSA9IFRZUEVfU1lNQk9MOwotICAgICAgICBjdXJyZW50Xy50ZXh0ID0gIi8iOwotICAgICAgICBjdXJyZW50Xy5saW5lID0gbGluZV87Ci0gICAgICAgIGN1cnJlbnRfLmNvbHVtbiA9IGNvbHVtbl8gLSAxOworICAgIHN3aXRjaCAoVHJ5Q29uc3VtZUNvbW1lbnRTdGFydCgpKSB7CisgICAgICBjYXNlIExJTkVfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUxpbmVDb21tZW50KE5VTEwpOworICAgICAgICBjb250aW51ZTsKKyAgICAgIGNhc2UgQkxPQ0tfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUJsb2NrQ29tbWVudChOVUxMKTsKKyAgICAgICAgY29udGludWU7CisgICAgICBjYXNlIFNMQVNIX05PVF9DT01NRU5UOgogICAgICAgICByZXR1cm4gdHJ1ZTsKLSAgICAgIH0KKyAgICAgIGNhc2UgTk9fQ09NTUVOVDoKKyAgICAgICAgYnJlYWs7CisgICAgfQogCi0gICAgfSBlbHNlIGlmIChjb21tZW50X3N0eWxlXyA9PSBTSF9DT01NRU5UX1NUWUxFICYmIFRyeUNvbnN1bWUoJyMnKSkgewotICAgICAgQ29uc3VtZUxpbmVDb21tZW50KCk7CisgICAgLy8gQ2hlY2sgZm9yIEVPRiBiZWZvcmUgY29udGludWluZy4KKyAgICBpZiAocmVhZF9lcnJvcl8pIGJyZWFrOwogCi0gICAgfSBlbHNlIGlmIChMb29raW5nQXQ8VW5wcmludGFibGU+KCkgfHwgY3VycmVudF9jaGFyXyA9PSAnXDAnKSB7CisgICAgaWYgKExvb2tpbmdBdDxVbnByaW50YWJsZT4oKSB8fCBjdXJyZW50X2NoYXJfID09ICdcMCcpIHsKICAgICAgIEFkZEVycm9yKCJJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LiIpOwogICAgICAgTmV4dENoYXIoKTsKICAgICAgIC8vIFNraXAgbW9yZSB1bnByaW50YWJsZSBjaGFyYWN0ZXJzLCB0b28uICBCdXQsIHJlbWVtYmVyIHRoYXQgJ1wwJyBpcwpAQCAtNTE5LDcgKzYwOSw5IEBACiAKICAgICAgICAgaWYgKFRyeUNvbnN1bWVPbmU8RGlnaXQ+KCkpIHsKICAgICAgICAgICAvLyBJdCdzIGEgZmxvYXRpbmctcG9pbnQgbnVtYmVyLgotICAgICAgICAgIGlmIChwcmV2aW91c18udHlwZSA9PSBUWVBFX0lERU5USUZJRVIgJiYgIXNraXBwZWRfc3R1ZmYpIHsKKyAgICAgICAgICBpZiAocHJldmlvdXNfLnR5cGUgPT0gVFlQRV9JREVOVElGSUVSICYmCisgICAgICAgICAgICAgIGN1cnJlbnRfLmxpbmUgPT0gcHJldmlvdXNfLmxpbmUgJiYKKyAgICAgICAgICAgICAgY3VycmVudF8uY29sdW1uID09IHByZXZpb3VzXy5lbmRfY29sdW1uKSB7CiAgICAgICAgICAgICAvLyBXZSBkb24ndCBhY2NlcHQgc3ludGF4IGxpa2UgImJsYWguMTIzIi4KICAgICAgICAgICAgIGVycm9yX2NvbGxlY3Rvcl8tPkFkZEVycm9yKGxpbmVfLCBjb2x1bW5fIC0gMiwKICAgICAgICAgICAgICAgIk5lZWQgc3BhY2UgYmV0d2VlbiBpZGVudGlmaWVyIGFuZCBkZWNpbWFsIHBvaW50LiIpOwpAQCAtNTM3LDYgKzYyOSwxMiBAQAogICAgICAgICBDb25zdW1lU3RyaW5nKCdcJycpOwogICAgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9TVFJJTkc7CiAgICAgICB9IGVsc2UgeworICAgICAgICAvLyBDaGVjayBpZiB0aGUgaGlnaCBvcmRlciBiaXQgaXMgc2V0LgorICAgICAgICBpZiAoY3VycmVudF9jaGFyXyAmIDB4ODApIHsKKyAgICAgICAgICBlcnJvcl9jb2xsZWN0b3JfLT5BZGRFcnJvcihsaW5lXywgY29sdW1uXywKKyAgICAgICAgICAgICAgU3RyaW5nUHJpbnRmKCJJbnRlcnByZXRpbmcgbm9uIGFzY2lpIGNvZGVwb2ludCAlZC4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oY3VycmVudF9jaGFyXykpKTsKKyAgICAgICAgfQogICAgICAgICBOZXh0Q2hhcigpOwogICAgICAgICBjdXJyZW50Xy50eXBlID0gVFlQRV9TWU1CT0w7CiAgICAgICB9CkBAIC01NDQsOCArNjQyLDYgQEAKICAgICAgIEVuZFRva2VuKCk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9Ci0KLSAgICBza2lwcGVkX3N0dWZmID0gdHJ1ZTsKICAgfQogCiAgIC8vIEVPRgpAQCAtNTU3LDYgKzY1MywyMDQgQEAKICAgcmV0dXJuIGZhbHNlOwogfQogCituYW1lc3BhY2UgeworCisvLyBIZWxwZXIgY2xhc3MgZm9yIGNvbGxlY3RpbmcgY29tbWVudHMgYW5kIHB1dHRpbmcgdGhlbSBpbiB0aGUgcmlnaHQgcGxhY2VzLgorLy8KKy8vIFRoaXMgYmFzaWNhbGx5IGp1c3QgYnVmZmVycyB0aGUgbW9zdCByZWNlbnQgY29tbWVudCB1bnRpbCBpdCBjYW4gYmUgZGVjaWRlZAorLy8gZXhhY3RseSB3aGVyZSB0aGF0IGNvbW1lbnQgc2hvdWxkIGJlIHBsYWNlZC4gIFdoZW4gRmx1c2goKSBpcyBjYWxsZWQsIHRoZQorLy8gY3VycmVudCBjb21tZW50IGdvZXMgaW50byBlaXRoZXIgcHJldl90cmFpbGluZ19jb21tZW50cyBvciBkZXRhY2hlZF9jb21tZW50cy4KKy8vIFdoZW4gdGhlIENvbW1lbnRDb2xsZWN0b3IgaXMgZGVzdHJveWVkLCB0aGUgbGFzdCBidWZmZXJlZCBjb21tZW50IGdvZXMgaW50bworLy8gbmV4dF9sZWFkaW5nX2NvbW1lbnRzLgorY2xhc3MgQ29tbWVudENvbGxlY3RvciB7CisgcHVibGljOgorICBDb21tZW50Q29sbGVjdG9yKHN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBuZXh0X2xlYWRpbmdfY29tbWVudHMpCisgICAgICA6IHByZXZfdHJhaWxpbmdfY29tbWVudHNfKHByZXZfdHJhaWxpbmdfY29tbWVudHMpLAorICAgICAgICBkZXRhY2hlZF9jb21tZW50c18oZGV0YWNoZWRfY29tbWVudHMpLAorICAgICAgICBuZXh0X2xlYWRpbmdfY29tbWVudHNfKG5leHRfbGVhZGluZ19jb21tZW50cyksCisgICAgICAgIGhhc19jb21tZW50XyhmYWxzZSksCisgICAgICAgIGlzX2xpbmVfY29tbWVudF8oZmFsc2UpLAorICAgICAgICBjYW5fYXR0YWNoX3RvX3ByZXZfKHRydWUpIHsKKyAgICBpZiAocHJldl90cmFpbGluZ19jb21tZW50cyAhPSBOVUxMKSBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzLT5jbGVhcigpOworICAgIGlmIChkZXRhY2hlZF9jb21tZW50cyAhPSBOVUxMKSBkZXRhY2hlZF9jb21tZW50cy0+Y2xlYXIoKTsKKyAgICBpZiAobmV4dF9sZWFkaW5nX2NvbW1lbnRzICE9IE5VTEwpIG5leHRfbGVhZGluZ19jb21tZW50cy0+Y2xlYXIoKTsKKyAgfQorCisgIH5Db21tZW50Q29sbGVjdG9yKCkgeworICAgIC8vIFdoYXRldmVyIGlzIGluIHRoZSBidWZmZXIgaXMgYSBsZWFkaW5nIGNvbW1lbnQuCisgICAgaWYgKG5leHRfbGVhZGluZ19jb21tZW50c18gIT0gTlVMTCAmJiBoYXNfY29tbWVudF8pIHsKKyAgICAgIGNvbW1lbnRfYnVmZmVyXy5zd2FwKCpuZXh0X2xlYWRpbmdfY29tbWVudHNfKTsKKyAgICB9CisgIH0KKworICAvLyBBYm91dCB0byByZWFkIGEgbGluZSBjb21tZW50LiAgR2V0IHRoZSBjb21tZW50IGJ1ZmZlciBwb2ludGVyIGluIG9yZGVyIHRvCisgIC8vIHJlYWQgaW50byBpdC4KKyAgc3RyaW5nKiBHZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpIHsKKyAgICAvLyBXZSB3YW50IHRvIGNvbWJpbmUgd2l0aCBwcmV2aW91cyBsaW5lIGNvbW1lbnRzLCBidXQgbm90IGJsb2NrIGNvbW1lbnRzLgorICAgIGlmIChoYXNfY29tbWVudF8gJiYgIWlzX2xpbmVfY29tbWVudF8pIHsKKyAgICAgIEZsdXNoKCk7CisgICAgfQorICAgIGhhc19jb21tZW50XyA9IHRydWU7CisgICAgaXNfbGluZV9jb21tZW50XyA9IHRydWU7CisgICAgcmV0dXJuICZjb21tZW50X2J1ZmZlcl87CisgIH0KKworICAvLyBBYm91dCB0byByZWFkIGEgYmxvY2sgY29tbWVudC4gIEdldCB0aGUgY29tbWVudCBidWZmZXIgcG9pbnRlciBpbiBvcmRlciB0bworICAvLyByZWFkIGludG8gaXQuCisgIHN0cmluZyogR2V0QnVmZmVyRm9yQmxvY2tDb21tZW50KCkgeworICAgIGlmIChoYXNfY29tbWVudF8pIHsKKyAgICAgIEZsdXNoKCk7CisgICAgfQorICAgIGhhc19jb21tZW50XyA9IHRydWU7CisgICAgaXNfbGluZV9jb21tZW50XyA9IGZhbHNlOworICAgIHJldHVybiAmY29tbWVudF9idWZmZXJfOworICB9CisKKyAgdm9pZCBDbGVhckJ1ZmZlcigpIHsKKyAgICBjb21tZW50X2J1ZmZlcl8uY2xlYXIoKTsKKyAgICBoYXNfY29tbWVudF8gPSBmYWxzZTsKKyAgfQorCisgIC8vIENhbGxlZCBvbmNlIHdlIGtub3cgdGhhdCB0aGUgY29tbWVudCBidWZmZXIgaXMgY29tcGxldGUgYW5kIGlzICpub3QqCisgIC8vIGNvbm5lY3RlZCB0byB0aGUgbmV4dCB0b2tlbi4KKyAgdm9pZCBGbHVzaCgpIHsKKyAgICBpZiAoaGFzX2NvbW1lbnRfKSB7CisgICAgICBpZiAoY2FuX2F0dGFjaF90b19wcmV2XykgeworICAgICAgICBpZiAocHJldl90cmFpbGluZ19jb21tZW50c18gIT0gTlVMTCkgeworICAgICAgICAgIHByZXZfdHJhaWxpbmdfY29tbWVudHNfLT5hcHBlbmQoY29tbWVudF9idWZmZXJfKTsKKyAgICAgICAgfQorICAgICAgICBjYW5fYXR0YWNoX3RvX3ByZXZfID0gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoZGV0YWNoZWRfY29tbWVudHNfICE9IE5VTEwpIHsKKyAgICAgICAgICBkZXRhY2hlZF9jb21tZW50c18tPnB1c2hfYmFjayhjb21tZW50X2J1ZmZlcl8pOworICAgICAgICB9CisgICAgICB9CisgICAgICBDbGVhckJ1ZmZlcigpOworICAgIH0KKyAgfQorCisgIHZvaWQgRGV0YWNoRnJvbVByZXYoKSB7CisgICAgY2FuX2F0dGFjaF90b19wcmV2XyA9IGZhbHNlOworICB9CisKKyBwcml2YXRlOgorICBzdHJpbmcqIHByZXZfdHJhaWxpbmdfY29tbWVudHNfOworICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHNfOworICBzdHJpbmcqIG5leHRfbGVhZGluZ19jb21tZW50c187CisKKyAgc3RyaW5nIGNvbW1lbnRfYnVmZmVyXzsKKworICAvLyBUcnVlIGlmIGFueSBjb21tZW50cyB3ZXJlIHJlYWQgaW50byBjb21tZW50X2J1ZmZlcl8uICBUaGlzIGNhbiBiZSB0cnVlIGV2ZW4KKyAgLy8gaWYgY29tbWVudF9idWZmZXJfIGlzIGVtcHR5LCBuYW1lbHkgaWYgdGhlIGNvbW1lbnQgd2FzICIvKiovIi4KKyAgYm9vbCBoYXNfY29tbWVudF87CisKKyAgLy8gSXMgdGhlIGNvbW1lbnQgaW4gdGhlIGNvbW1lbnQgYnVmZmVyIGEgbGluZSBjb21tZW50PworICBib29sIGlzX2xpbmVfY29tbWVudF87CisKKyAgLy8gSXMgaXQgc3RpbGwgcG9zc2libGUgdGhhdCB3ZSBjb3VsZCBiZSByZWFkaW5nIGEgY29tbWVudCBhdHRhY2hlZCB0byB0aGUKKyAgLy8gcHJldmlvdXMgdG9rZW4/CisgIGJvb2wgY2FuX2F0dGFjaF90b19wcmV2XzsKK307CisKK30gLy8gbmFtZXNwYWNlCisKK2Jvb2wgVG9rZW5pemVyOjpOZXh0V2l0aENvbW1lbnRzKHN0cmluZyogcHJldl90cmFpbGluZ19jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZlY3RvcjxzdHJpbmc+KiBkZXRhY2hlZF9jb21tZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogbmV4dF9sZWFkaW5nX2NvbW1lbnRzKSB7CisgIENvbW1lbnRDb2xsZWN0b3IgY29sbGVjdG9yKHByZXZfdHJhaWxpbmdfY29tbWVudHMsIGRldGFjaGVkX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXh0X2xlYWRpbmdfY29tbWVudHMpOworCisgIGlmIChjdXJyZW50Xy50eXBlID09IFRZUEVfU1RBUlQpIHsKKyAgICAvLyBJZ25vcmUgdW5pY29kZSBieXRlIG9yZGVyIG1hcmsoQk9NKSBpZiBpdCBhcHBlYXJzIGF0IHRoZSBmaWxlCisgICAgLy8gYmVnaW5uaW5nLiBPbmx5IFVURi04IEJPTSAoMHhFRiAweEJCIDB4QkYpIGlzIGFjY2VwdGVkLgorICAgIGlmIChUcnlDb25zdW1lKChjaGFyKTB4RUYpKSB7CisgICAgICBpZiAoIVRyeUNvbnN1bWUoKGNoYXIpMHhCQikgfHwgIVRyeUNvbnN1bWUoKGNoYXIpMHhCRikpIHsKKyAgICAgICAgQWRkRXJyb3IoIlByb3RvIGZpbGUgc3RhcnRzIHdpdGggMHhFRiBidXQgbm90IFVURi04IEJPTS4gIgorICAgICAgICAgICAgICAgICAiT25seSBVVEYtOCBpcyBhY2NlcHRlZCBmb3IgcHJvdG8gZmlsZS4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgfQorICAgIH0KKyAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKKyAgfSBlbHNlIHsKKyAgICAvLyBBIGNvbW1lbnQgYXBwZWFyaW5nIG9uIHRoZSBzYW1lIGxpbmUgbXVzdCBiZSBhdHRhY2hlZCB0byB0aGUgcHJldmlvdXMKKyAgICAvLyBkZWNsYXJhdGlvbi4KKyAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworICAgIHN3aXRjaCAoVHJ5Q29uc3VtZUNvbW1lbnRTdGFydCgpKSB7CisgICAgICBjYXNlIExJTkVfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUxpbmVDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JMaW5lQ29tbWVudCgpKTsKKworICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKKyAgICAgICAgLy8gY29tbWVudC4KKyAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBCTE9DS19DT01NRU5UOgorICAgICAgICBDb25zdW1lQmxvY2tDb21tZW50KGNvbGxlY3Rvci5HZXRCdWZmZXJGb3JCbG9ja0NvbW1lbnQoKSk7CisKKyAgICAgICAgQ29uc3VtZVplcm9Pck1vcmU8V2hpdGVzcGFjZU5vTmV3bGluZT4oKTsKKyAgICAgICAgaWYgKCFUcnlDb25zdW1lKCdcbicpKSB7CisgICAgICAgICAgLy8gT29wcywgdGhlIG5leHQgdG9rZW4gaXMgb24gdGhlIHNhbWUgbGluZS4gIElmIHdlIHJlY29yZGVkIGEgY29tbWVudAorICAgICAgICAgIC8vIHdlIHJlYWxseSBoYXZlIG5vIGlkZWEgd2hpY2ggdG9rZW4gaXQgc2hvdWxkIGJlIGF0dGFjaGVkIHRvLgorICAgICAgICAgIGNvbGxlY3Rvci5DbGVhckJ1ZmZlcigpOworICAgICAgICAgIHJldHVybiBOZXh0KCk7CisgICAgICAgIH0KKworICAgICAgICAvLyBEb24ndCBhbGxvdyBjb21tZW50cyBvbiBzdWJzZXF1ZW50IGxpbmVzIHRvIGJlIGF0dGFjaGVkIHRvIGEgdHJhaWxpbmcKKyAgICAgICAgLy8gY29tbWVudC4KKyAgICAgICAgY29sbGVjdG9yLkZsdXNoKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBTTEFTSF9OT1RfQ09NTUVOVDoKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICBjYXNlIE5PX0NPTU1FTlQ6CisgICAgICAgIGlmICghVHJ5Q29uc3VtZSgnXG4nKSkgeworICAgICAgICAgIC8vIFRoZSBuZXh0IHRva2VuIGlzIG9uIHRoZSBzYW1lIGxpbmUuICBUaGVyZSBhcmUgbm8gY29tbWVudHMuCisgICAgICAgICAgcmV0dXJuIE5leHQoKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICAvLyBPSywgd2UgYXJlIG5vdyBvbiB0aGUgbGluZSAqYWZ0ZXIqIHRoZSBwcmV2aW91cyB0b2tlbi4KKyAgd2hpbGUgKHRydWUpIHsKKyAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworCisgICAgc3dpdGNoIChUcnlDb25zdW1lQ29tbWVudFN0YXJ0KCkpIHsKKyAgICAgIGNhc2UgTElORV9DT01NRU5UOgorICAgICAgICBDb25zdW1lTGluZUNvbW1lbnQoY29sbGVjdG9yLkdldEJ1ZmZlckZvckxpbmVDb21tZW50KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgQkxPQ0tfQ09NTUVOVDoKKyAgICAgICAgQ29uc3VtZUJsb2NrQ29tbWVudChjb2xsZWN0b3IuR2V0QnVmZmVyRm9yQmxvY2tDb21tZW50KCkpOworCisgICAgICAgIC8vIENvbnN1bWUgdGhlIHJlc3Qgb2YgdGhlIGxpbmUgc28gdGhhdCB3ZSBkb24ndCBpbnRlcnByZXQgaXQgYXMgYQorICAgICAgICAvLyBibGFuayBsaW5lIHRoZSBuZXh0IHRpbWUgYXJvdW5kIHRoZSBsb29wLgorICAgICAgICBDb25zdW1lWmVyb09yTW9yZTxXaGl0ZXNwYWNlTm9OZXdsaW5lPigpOworICAgICAgICBUcnlDb25zdW1lKCdcbicpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgU0xBU0hfTk9UX0NPTU1FTlQ6CisgICAgICAgIHJldHVybiB0cnVlOworICAgICAgY2FzZSBOT19DT01NRU5UOgorICAgICAgICBpZiAoVHJ5Q29uc3VtZSgnXG4nKSkgeworICAgICAgICAgIC8vIENvbXBsZXRlbHkgYmxhbmsgbGluZS4KKyAgICAgICAgICBjb2xsZWN0b3IuRmx1c2goKTsKKyAgICAgICAgICBjb2xsZWN0b3IuRGV0YWNoRnJvbVByZXYoKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBib29sIHJlc3VsdCA9IE5leHQoKTsKKyAgICAgICAgICBpZiAoIXJlc3VsdCB8fAorICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICJ9IiB8fAorICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICJdIiB8fAorICAgICAgICAgICAgICBjdXJyZW50Xy50ZXh0ID09ICIpIikgeworICAgICAgICAgICAgLy8gSXQgbG9va3MgbGlrZSB3ZSdyZSBhdCB0aGUgZW5kIG9mIGEgc2NvcGUuICBJbiB0aGlzIGNhc2UgaXQKKyAgICAgICAgICAgIC8vIG1ha2VzIG5vIHNlbnNlIHRvIGF0dGFjaCBhIGNvbW1lbnQgdG8gdGhlIGZvbGxvd2luZyB0b2tlbi4KKyAgICAgICAgICAgIGNvbGxlY3Rvci5GbHVzaCgpOworICAgICAgICAgIH0KKyAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBUb2tlbi1wYXJzaW5nIGhlbHBlcnMuICBSZW1lbWJlciB0aGF0IHRoZXNlIGRvbid0IG5lZWQgdG8gcmVwb3J0CiAvLyBlcnJvcnMgc2luY2UgYW55IGVycm9ycyBzaG91bGQgYWxyZWFkeSBoYXZlIGJlZW4gcmVwb3J0ZWQgd2hpbGUKQEAgLTU4Nyw5ICs4ODEsMTEgQEAKICAgdWludDY0IHJlc3VsdCA9IDA7CiAgIGZvciAoOyAqcHRyICE9ICdcMCc7IHB0cisrKSB7CiAgICAgaW50IGRpZ2l0ID0gRGlnaXRWYWx1ZSgqcHRyKTsKLSAgICBHT09HTEVfTE9HX0lGKERGQVRBTCwgZGlnaXQgPCAwIHx8IGRpZ2l0ID49IGJhc2UpCi0gICAgICA8PCAiIFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCkgcGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIgotICAgICAgICAgIiB0b2tlbml6ZWQgYXMgYW4gaW50ZWdlcjogIiA8PCBDRXNjYXBlKHRleHQpOworICAgIGlmIChkaWdpdCA8IDAgfHwgZGlnaXQgPj0gYmFzZSkgeworICAgICAgLy8gVGhlIHRva2VuIHByb3ZpZGVkIGJ5IFRva2VuaXplciBpcyBpbnZhbGlkLiBpLmUuLCAwOTkgaXMgYW4gaW52YWxpZAorICAgICAgLy8gdG9rZW4sIGJ1dCBUb2tlbml6ZXIgc3RpbGwgdGhpbmsgaXQncyBpbnRlZ2VyLgorICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KICAgICBpZiAoZGlnaXQgPiBtYXhfdmFsdWUgfHwgcmVzdWx0ID4gKG1heF92YWx1ZSAtIGRpZ2l0KSAvIGJhc2UpIHsKICAgICAgIC8vIE92ZXJmbG93LgogICAgICAgcmV0dXJuIGZhbHNlOwpAQCAtNjI2LDE3ICs5MjIsMTM4IEBACiAgIHJldHVybiByZXN1bHQ7CiB9CiAKKy8vIEhlbHBlciB0byBhcHBlbmQgYSBVbmljb2RlIGNvZGUgcG9pbnQgdG8gYSBzdHJpbmcgYXMgVVRGOCwgd2l0aG91dCBicmluZ2luZworLy8gaW4gYW55IGV4dGVybmFsIGRlcGVuZGVuY2llcy4KK3N0YXRpYyB2b2lkIEFwcGVuZFVURjgodWludDMyIGNvZGVfcG9pbnQsIHN0cmluZyogb3V0cHV0KSB7CisgIHVpbnQzMiB0bXAgPSAwOworICBpbnQgbGVuID0gMDsKKyAgaWYgKGNvZGVfcG9pbnQgPD0gMHg3ZikgeworICAgIHRtcCA9IGNvZGVfcG9pbnQ7CisgICAgbGVuID0gMTsKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4MDdmZikgeworICAgIHRtcCA9IDB4MDAwMGMwODAgfAorICAgICAgICAoKGNvZGVfcG9pbnQgJiAweDA3YzApIDw8IDIpIHwKKyAgICAgICAgKGNvZGVfcG9pbnQgJiAweDAwM2YpOworICAgIGxlbiA9IDI7CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSAweGZmZmYpIHsKKyAgICB0bXAgPSAweDAwZTA4MDgwIHwKKyAgICAgICAgKChjb2RlX3BvaW50ICYgMHhmMDAwKSA8PCA0KSB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MGZjMCkgPDwgMikgfAorICAgICAgICAoY29kZV9wb2ludCAmIDB4MDAzZik7CisgICAgbGVuID0gMzsKKyAgfSBlbHNlIGlmIChjb2RlX3BvaW50IDw9IDB4MWZmZmZmKSB7CisgICAgdG1wID0gMHhmMDgwODA4MCB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MWMwMDAwKSA8PCA2KSB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MDNmMDAwKSA8PCA0KSB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4MDAwZmMwKSA8PCAyKSB8CisgICAgICAgIChjb2RlX3BvaW50ICYgMHgwMDNmKTsKKyAgICBsZW4gPSA0OworICB9IGVsc2UgeworICAgIC8vIFVURi0xNiBpcyBvbmx5IGRlZmluZWQgZm9yIGNvZGUgcG9pbnRzIHVwIHRvIDB4MTBGRkZGLCBhbmQgVVRGLTggaXMKKyAgICAvLyBub3JtYWxseSBvbmx5IGRlZmluZWQgdXAgdG8gdGhlcmUgYXMgd2VsbC4KKyAgICBTdHJpbmdBcHBlbmRGKG91dHB1dCwgIlxcVSUwOHgiLCBjb2RlX3BvaW50KTsKKyAgICByZXR1cm47CisgIH0KKyAgdG1wID0gZ2h0b25sKHRtcCk7CisgIG91dHB1dC0+YXBwZW5kKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KCZ0bXApICsgc2l6ZW9mKHRtcCkgLSBsZW4sIGxlbik7Cit9CisKKy8vIFRyeSB0byByZWFkIDxsZW4+IGhleCBkaWdpdHMgZnJvbSBwdHIsIGFuZCBzdHVmZiB0aGUgbnVtZXJpYyByZXN1bHQgaW50bworLy8gKnJlc3VsdC4gUmV0dXJucyB0cnVlIGlmIHRoYXQgbWFueSBkaWdpdHMgd2VyZSBzdWNjZXNzZnVsbHkgY29uc3VtZWQuCitzdGF0aWMgYm9vbCBSZWFkSGV4RGlnaXRzKGNvbnN0IGNoYXIqIHB0ciwgaW50IGxlbiwgdWludDMyKiByZXN1bHQpIHsKKyAgKnJlc3VsdCA9IDA7CisgIGlmIChsZW4gPT0gMCkgcmV0dXJuIGZhbHNlOworICBmb3IgKGNvbnN0IGNoYXIqIGVuZCA9IHB0ciArIGxlbjsgcHRyIDwgZW5kOyArK3B0cikgeworICAgIGlmICgqcHRyID09ICdcMCcpIHJldHVybiBmYWxzZTsKKyAgICAqcmVzdWx0ID0gKCpyZXN1bHQgPDwgNCkgKyBEaWdpdFZhbHVlKCpwdHIpOworICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBIYW5kbGluZyBVVEYtMTYgc3Vycm9nYXRlIHBhaXJzLiBVVEYtMTYgZW5jb2RlcyBjb2RlIHBvaW50cyBpbiB0aGUgcmFuZ2UKKy8vIDB4MTAwMDAuLi4weDEwZmZmZiBhcyBhIHBhaXIgb2YgbnVtYmVycywgYSBoZWFkIHN1cnJvZ2F0ZSBmb2xsb3dlZCBieSBhIHRyYWlsCisvLyBzdXJyb2dhdGUuIFRoZXNlIG51bWJlcnMgYXJlIGluIGEgcmVzZXJ2ZWQgcmFuZ2Ugb2YgVW5pY29kZSBjb2RlIHBvaW50cywgc28KKy8vIGlmIHdlIGVuY291bnRlciBzdWNoIGEgcGFpciB3ZSBrbm93IGhvdyB0byBwYXJzZSBpdCBhbmQgY29udmVydCBpdCBpbnRvIGEKKy8vIHNpbmdsZSBjb2RlIHBvaW50Lgorc3RhdGljIGNvbnN0IHVpbnQzMiBrTWluSGVhZFN1cnJvZ2F0ZSA9IDB4ZDgwMDsKK3N0YXRpYyBjb25zdCB1aW50MzIga01heEhlYWRTdXJyb2dhdGUgPSAweGRjMDA7CitzdGF0aWMgY29uc3QgdWludDMyIGtNaW5UcmFpbFN1cnJvZ2F0ZSA9IDB4ZGMwMDsKK3N0YXRpYyBjb25zdCB1aW50MzIga01heFRyYWlsU3Vycm9nYXRlID0gMHhlMDAwOworCitzdGF0aWMgaW5saW5lIGJvb2wgSXNIZWFkU3Vycm9nYXRlKHVpbnQzMiBjb2RlX3BvaW50KSB7CisgIHJldHVybiAoY29kZV9wb2ludCA+PSBrTWluSGVhZFN1cnJvZ2F0ZSkgJiYgKGNvZGVfcG9pbnQgPCBrTWF4SGVhZFN1cnJvZ2F0ZSk7Cit9CisKK3N0YXRpYyBpbmxpbmUgYm9vbCBJc1RyYWlsU3Vycm9nYXRlKHVpbnQzMiBjb2RlX3BvaW50KSB7CisgIHJldHVybiAoY29kZV9wb2ludCA+PSBrTWluVHJhaWxTdXJyb2dhdGUpICYmCisgICAgICAoY29kZV9wb2ludCA8IGtNYXhUcmFpbFN1cnJvZ2F0ZSk7Cit9CisKKy8vIENvbWJpbmUgYSBoZWFkIGFuZCB0cmFpbCBzdXJyb2dhdGUgaW50byBhIHNpbmdsZSBVbmljb2RlIGNvZGUgcG9pbnQuCitzdGF0aWMgdWludDMyIEFzc2VtYmxlVVRGMTYodWludDMyIGhlYWRfc3Vycm9nYXRlLCB1aW50MzIgdHJhaWxfc3Vycm9nYXRlKSB7CisgIEdPT0dMRV9EQ0hFQ0soSXNIZWFkU3Vycm9nYXRlKGhlYWRfc3Vycm9nYXRlKSk7CisgIEdPT0dMRV9EQ0hFQ0soSXNUcmFpbFN1cnJvZ2F0ZSh0cmFpbF9zdXJyb2dhdGUpKTsKKyAgcmV0dXJuIDB4MTAwMDAgKyAoKChoZWFkX3N1cnJvZ2F0ZSAtIGtNaW5IZWFkU3Vycm9nYXRlKSA8PCAxMCkgfAorICAgICAgKHRyYWlsX3N1cnJvZ2F0ZSAtIGtNaW5UcmFpbFN1cnJvZ2F0ZSkpOworfQorCisvLyBDb252ZXJ0IHRoZSBlc2NhcGUgc2VxdWVuY2UgcGFyYW1ldGVyIHRvIGEgbnVtYmVyIG9mIGV4cGVjdGVkIGhleCBkaWdpdHMuCitzdGF0aWMgaW5saW5lIGludCBVbmljb2RlTGVuZ3RoKGNoYXIga2V5KSB7CisgIGlmIChrZXkgPT0gJ3UnKSByZXR1cm4gNDsKKyAgaWYgKGtleSA9PSAnVScpIHJldHVybiA4OworICByZXR1cm4gMDsKK30KKworLy8gR2l2ZW4gYSBwb2ludGVyIHRvIHRoZSAndScgb3IgJ1UnIHN0YXJ0aW5nIGEgVW5pY29kZSBlc2NhcGUgc2VxdWVuY2UsIGF0dGVtcHQKKy8vIHRvIHBhcnNlIHRoYXQgc2VxdWVuY2UuIE9uIHN1Y2Nlc3MsIHJldHVybnMgYSBwb2ludGVyIHRvIHRoZSBmaXJzdCBjaGFyCisvLyBiZXlvbmQgdGhhdCBzZXF1ZW5jZSwgYW5kIGZpbGxzIGluICpjb2RlX3BvaW50LiBPbiBmYWlsdXJlLCByZXR1cm5zIHB0cgorLy8gaXRzZWxmLgorc3RhdGljIGNvbnN0IGNoYXIqIEZldGNoVW5pY29kZVBvaW50KGNvbnN0IGNoYXIqIHB0ciwgdWludDMyKiBjb2RlX3BvaW50KSB7CisgIGNvbnN0IGNoYXIqIHAgPSBwdHI7CisgIC8vIEZldGNoIHRoZSBjb2RlIHBvaW50LgorICBjb25zdCBpbnQgbGVuID0gVW5pY29kZUxlbmd0aCgqcCsrKTsKKyAgaWYgKCFSZWFkSGV4RGlnaXRzKHAsIGxlbiwgY29kZV9wb2ludCkpCisgICAgcmV0dXJuIHB0cjsKKyAgcCArPSBsZW47CisKKyAgLy8gQ2hlY2sgaWYgdGhlIGNvZGUgcG9pbnQgd2UgcmVhZCBpcyBhICJoZWFkIHN1cnJvZ2F0ZS4iIElmIHNvLCB0aGVuIHdlCisgIC8vIGV4cGVjdCBpdCB0byBiZSBpbW1lZGlhdGVseSBmb2xsb3dlZCBieSBhbm90aGVyIGNvZGUgcG9pbnQgd2hpY2ggaXMgYSB2YWxpZAorICAvLyAidHJhaWwgc3Vycm9nYXRlLCIgYW5kIHRvZ2V0aGVyIHRoZXkgZm9ybSBhIFVURi0xNiBwYWlyIHdoaWNoIGRlY29kZXMgaW50bworICAvLyBhIHNpbmdsZSBVbmljb2RlIHBvaW50LiBUcmFpbCBzdXJyb2dhdGVzIG1heSBvbmx5IHVzZSBcdSwgbm90IFxVLgorICBpZiAoSXNIZWFkU3Vycm9nYXRlKCpjb2RlX3BvaW50KSAmJiAqcCA9PSAnXFwnICYmICoocCArIDEpID09ICd1JykgeworICAgIHVpbnQzMiB0cmFpbF9zdXJyb2dhdGU7CisgICAgaWYgKFJlYWRIZXhEaWdpdHMocCArIDIsIDQsICZ0cmFpbF9zdXJyb2dhdGUpICYmCisgICAgICAgIElzVHJhaWxTdXJyb2dhdGUodHJhaWxfc3Vycm9nYXRlKSkgeworICAgICAgKmNvZGVfcG9pbnQgPSBBc3NlbWJsZVVURjE2KCpjb2RlX3BvaW50LCB0cmFpbF9zdXJyb2dhdGUpOworICAgICAgcCArPSA2OworICAgIH0KKyAgICAvLyBJZiB0aGlzIGZhaWxlZCwgdGhlbiB3ZSBqdXN0IGVtaXQgdGhlIGhlYWQgc3Vycm9nYXRlIGFzIGEgY29kZSBwb2ludC4KKyAgICAvLyBJdCdzIGJvZ3VzLCBidXQgc28gaXMgdGhlIHN0cmluZy4KKyAgfQorCisgIHJldHVybiBwOworfQorCisvLyBUaGUgdGV4dCBzdHJpbmcgbXVzdCBiZWdpbiBhbmQgZW5kIHdpdGggc2luZ2xlIG9yIGRvdWJsZSBxdW90ZQorLy8gY2hhcmFjdGVycy4KIHZvaWQgVG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZChjb25zdCBzdHJpbmcmIHRleHQsIHN0cmluZyogb3V0cHV0KSB7Ci0gIC8vIFJlbWluZGVyOiAgdGV4dFswXSBpcyBhbHdheXMgdGhlIHF1b3RlIGNoYXJhY3Rlci4gIChJZiB0ZXh0IGlzCi0gIC8vICAgZW1wdHksIGl0J3MgaW52YWxpZCwgc28gd2UnbGwganVzdCByZXR1cm4uKQotICBpZiAodGV4dC5lbXB0eSgpKSB7CisgIC8vIFJlbWluZGVyOiB0ZXh0WzBdIGlzIGFsd2F5cyBhIHF1b3RlIGNoYXJhY3Rlci4gIChJZiB0ZXh0IGlzCisgIC8vIGVtcHR5LCBpdCdzIGludmFsaWQsIHNvIHdlJ2xsIGp1c3QgcmV0dXJuKS4KKyAgY29uc3Qgc2l6ZV90IHRleHRfc2l6ZSA9IHRleHQuc2l6ZSgpOworICBpZiAodGV4dF9zaXplID09IDApIHsKICAgICBHT09HTEVfTE9HKERGQVRBTCkKICAgICAgIDw8ICIgVG9rZW5pemVyOjpQYXJzZVN0cmluZ0FwcGVuZCgpIHBhc3NlZCB0ZXh0IHRoYXQgY291bGQgbm90IgogICAgICAgICAgIiBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgc3RyaW5nOiAiIDw8IENFc2NhcGUodGV4dCk7CiAgICAgcmV0dXJuOwogICB9CiAKLSAgb3V0cHV0LT5yZXNlcnZlKG91dHB1dC0+c2l6ZSgpICsgdGV4dC5zaXplKCkpOworICAvLyBSZXNlcnZlIHJvb20gZm9yIG5ldyBzdHJpbmcuIFRoZSBicmFuY2ggaXMgbmVjZXNzYXJ5IGJlY2F1c2UgaWYKKyAgLy8gdGhlcmUgaXMgYWxyZWFkeSBzcGFjZSBhdmFpbGFibGUgdGhlIHJlc2VydmUoKSBjYWxsIG1pZ2h0CisgIC8vIGRvd25zaXplIHRoZSBvdXRwdXQuCisgIGNvbnN0IHNpemVfdCBuZXdfbGVuID0gdGV4dF9zaXplICsgb3V0cHV0LT5zaXplKCk7CisgIGlmIChuZXdfbGVuID4gb3V0cHV0LT5jYXBhY2l0eSgpKSB7CisgICAgb3V0cHV0LT5yZXNlcnZlKG5ld19sZW4pOworICB9CiAKICAgLy8gTG9vcCB0aHJvdWdoIHRoZSBzdHJpbmcgY29weWluZyBjaGFyYWN0ZXJzIHRvICJvdXRwdXQiIGFuZAogICAvLyBpbnRlcnByZXRpbmcgZXNjYXBlIHNlcXVlbmNlcy4gIE5vdGUgdGhhdCBhbnkgaW52YWxpZCBlc2NhcGUKQEAgLTY3NCwxOSArMTA5MSw0NyBAQAogICAgICAgICB9CiAgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKHN0YXRpY19jYXN0PGNoYXI+KGNvZGUpKTsKIAorICAgICAgfSBlbHNlIGlmICgqcHRyID09ICd1JyB8fCAqcHRyID09ICdVJykgeworICAgICAgICB1aW50MzIgdW5pY29kZTsKKyAgICAgICAgY29uc3QgY2hhciogZW5kID0gRmV0Y2hVbmljb2RlUG9pbnQocHRyLCAmdW5pY29kZSk7CisgICAgICAgIGlmIChlbmQgPT0gcHRyKSB7CisgICAgICAgICAgLy8gRmFpbHVyZTogSnVzdCBkdW1wIG91dCB3aGF0IHdlIHNhdywgZG9uJ3QgdHJ5IHRvIHBhcnNlIGl0LgorICAgICAgICAgIG91dHB1dC0+cHVzaF9iYWNrKCpwdHIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIEFwcGVuZFVURjgodW5pY29kZSwgb3V0cHV0KTsKKyAgICAgICAgICBwdHIgPSBlbmQgLSAxOyAgLy8gQmVjYXVzZSB3ZSdyZSBhYm91dCB0byArK3B0ci4KKyAgICAgICAgfQogICAgICAgfSBlbHNlIHsKICAgICAgICAgLy8gU29tZSBvdGhlciBlc2NhcGUgY29kZS4KICAgICAgICAgb3V0cHV0LT5wdXNoX2JhY2soVHJhbnNsYXRlRXNjYXBlKCpwdHIpKTsKICAgICAgIH0KIAotICAgIH0gZWxzZSBpZiAoKnB0ciA9PSB0ZXh0WzBdKSB7Ci0gICAgICAvLyBJZ25vcmUgcXVvdGUgbWF0Y2hpbmcgdGhlIHN0YXJ0aW5nIHF1b3RlLgorICAgIH0gZWxzZSBpZiAoKnB0ciA9PSB0ZXh0WzBdICYmIHB0clsxXSA9PSAnXDAnKSB7CisgICAgICAvLyBJZ25vcmUgZmluYWwgcXVvdGUgbWF0Y2hpbmcgdGhlIHN0YXJ0aW5nIHF1b3RlLgogICAgIH0gZWxzZSB7CiAgICAgICBvdXRwdXQtPnB1c2hfYmFjaygqcHRyKTsKICAgICB9CiAgIH0KK30KIAotICByZXR1cm47Cit0ZW1wbGF0ZTx0eXBlbmFtZSBDaGFyYWN0ZXJDbGFzcz4KK3N0YXRpYyBib29sIEFsbEluQ2xhc3MoY29uc3Qgc3RyaW5nJiBzKSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgcy5zaXplKCk7ICsraSkgeworICAgIGlmICghQ2hhcmFjdGVyQ2xhc3M6OkluQ2xhc3Moc1tpXSkpCisgICAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgVG9rZW5pemVyOjpJc0lkZW50aWZpZXIoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CisgIC8vIE1pcnJvcnMgSURFTlRJRklFUiBkZWZpbml0aW9uIGluIFRva2VuaXplcjo6TmV4dCgpIGFib3ZlLgorICBpZiAodGV4dC5zaXplKCkgPT0gMCkKKyAgICByZXR1cm4gZmFsc2U7CisgIGlmICghTGV0dGVyOjpJbkNsYXNzKHRleHQuYXQoMCkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgaWYgKCFBbGxJbkNsYXNzPEFscGhhbnVtZXJpYz4odGV4dC5zdWJzdHIoMSkpKQorICAgIHJldHVybiBmYWxzZTsKKyAgcmV0dXJuIHRydWU7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaAppbmRleCA4Zjc1OWFiLi42NGVlN2Q4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzgsNyArMzgsOSBAQAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSU9fVE9LRU5JWkVSX0hfXwogCiAjaW5jbHVkZSA8c3RyaW5nPgorI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNTAsNiArNTIsMTIgQEAKIGNsYXNzIEVycm9yQ29sbGVjdG9yOwogY2xhc3MgVG9rZW5pemVyOwogCisvLyBCeSAiY29sdW1uIG51bWJlciIsIHRoZSBwcm90byBjb21waWxlciByZWZlcnMgdG8gYSBjb3VudCBvZiB0aGUgbnVtYmVyCisvLyBvZiBieXRlcyBiZWZvcmUgYSBnaXZlbiBieXRlLCBleGNlcHQgdGhhdCBhIHRhYiBjaGFyYWN0ZXIgYWR2YW5jZXMgdG8KKy8vIHRoZSBuZXh0IG11bHRpcGxlIG9mIDggYnl0ZXMuICBOb3RlIGluIHBhcnRpY3VsYXIgdGhhdCBjb2x1bW4gbnVtYmVycworLy8gYXJlIHplcm8tYmFzZWQsIHdoaWxlIG1hbnkgdXNlciBpbnRlcmZhY2VzIHVzZSBvbmUtYmFzZWQgY29sdW1uIG51bWJlcnMuCit0eXBlZGVmIGludCBDb2x1bW5OdW1iZXI7CisKIC8vIEFic3RyYWN0IGludGVyZmFjZSBmb3IgYW4gb2JqZWN0IHdoaWNoIGNvbGxlY3RzIHRoZSBlcnJvcnMgdGhhdCBvY2N1cgogLy8gZHVyaW5nIHBhcnNpbmcuICBBIHR5cGljYWwgaW1wbGVtZW50YXRpb24gbWlnaHQgc2ltcGx5IHByaW50IHRoZSBlcnJvcnMKIC8vIHRvIHN0ZG91dC4KQEAgLTYxLDEyICs2OSwxNCBAQAogICAvLyBJbmRpY2F0ZXMgdGhhdCB0aGVyZSB3YXMgYW4gZXJyb3IgaW4gdGhlIGlucHV0IGF0IHRoZSBnaXZlbiBsaW5lIGFuZAogICAvLyBjb2x1bW4gbnVtYmVycy4gIFRoZSBudW1iZXJzIGFyZSB6ZXJvLWJhc2VkLCBzbyB5b3UgbWF5IHdhbnQgdG8gYWRkCiAgIC8vIDEgdG8gZWFjaCBiZWZvcmUgcHJpbnRpbmcgdGhlbS4KLSAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpID0gMDsKKyAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBDb2x1bW5OdW1iZXIgY29sdW1uLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSA9IDA7CiAKICAgLy8gSW5kaWNhdGVzIHRoYXQgdGhlcmUgd2FzIGEgd2FybmluZyBpbiB0aGUgaW5wdXQgYXQgdGhlIGdpdmVuIGxpbmUgYW5kCiAgIC8vIGNvbHVtbiBudW1iZXJzLiAgVGhlIG51bWJlcnMgYXJlIHplcm8tYmFzZWQsIHNvIHlvdSBtYXkgd2FudCB0byBhZGQKICAgLy8gMSB0byBlYWNoIGJlZm9yZSBwcmludGluZyB0aGVtLgotICB2aXJ0dWFsIHZvaWQgQWRkV2FybmluZyhpbnQgbGluZSwgaW50IGNvbHVtbiwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7IH0KKyAgdmlydHVhbCB2b2lkIEFkZFdhcm5pbmcoaW50IGxpbmUsIENvbHVtbk51bWJlciBjb2x1bW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeyB9CiAKICBwcml2YXRlOgogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoRXJyb3JDb2xsZWN0b3IpOwpAQCAtMTIxLDggKzEzMSw4IEBACiAgICAgLy8gImxpbmUiIGFuZCAiY29sdW1uIiBzcGVjaWZ5IHRoZSBwb3NpdGlvbiBvZiB0aGUgZmlyc3QgY2hhcmFjdGVyIG9mCiAgICAgLy8gdGhlIHRva2VuIHdpdGhpbiB0aGUgaW5wdXQgc3RyZWFtLiAgVGhleSBhcmUgemVyby1iYXNlZC4KICAgICBpbnQgbGluZTsKLSAgICBpbnQgY29sdW1uOwotICAgIGludCBlbmRfY29sdW1uOworICAgIENvbHVtbk51bWJlciBjb2x1bW47CisgICAgQ29sdW1uTnVtYmVyIGVuZF9jb2x1bW47CiAgIH07CiAKICAgLy8gR2V0IHRoZSBjdXJyZW50IHRva2VuLiAgVGhpcyBpcyB1cGRhdGVkIHdoZW4gTmV4dCgpIGlzIGNhbGxlZC4gIEJlZm9yZQpAQCAtMTM3LDYgKzE0Nyw1MyBAQAogICAvLyByZWFjaGVkLgogICBib29sIE5leHQoKTsKIAorICAvLyBMaWtlIE5leHQoKSwgYnV0IGFsc28gY29sbGVjdHMgY29tbWVudHMgd2hpY2ggYXBwZWFyIGJldHdlZW4gdGhlIHByZXZpb3VzCisgIC8vIGFuZCBuZXh0IHRva2Vucy4KKyAgLy8KKyAgLy8gQ29tbWVudHMgd2hpY2ggYXBwZWFyIHRvIGJlIGF0dGFjaGVkIHRvIHRoZSBwcmV2aW91cyB0b2tlbiBhcmUgc3RvcmVkCisgIC8vIGluICpwcmV2X3RhaWxpbmdfY29tbWVudHMuICBDb21tZW50cyB3aGljaCBhcHBlYXIgdG8gYmUgYXR0YWNoZWQgdG8gdGhlCisgIC8vIG5leHQgdG9rZW4gYXJlIHN0b3JlZCBpbiAqbmV4dF9sZWFkaW5nX2NvbW1lbnRzLiAgQ29tbWVudHMgYXBwZWFyaW5nIGluCisgIC8vIGJldHdlZW4gd2hpY2ggZG8gbm90IGFwcGVhciB0byBiZSBhdHRhY2hlZCB0byBlaXRoZXIgd2lsbCBiZSBhZGRlZCB0bworICAvLyBkZXRhY2hlZF9jb21tZW50cy4gIEFueSBvZiB0aGVzZSBwYXJhbWV0ZXJzIGNhbiBiZSBOVUxMIHRvIHNpbXBseSBkaXNjYXJkCisgIC8vIHRoZSBjb21tZW50cy4KKyAgLy8KKyAgLy8gQSBzZXJpZXMgb2YgbGluZSBjb21tZW50cyBhcHBlYXJpbmcgb24gY29uc2VjdXRpdmUgbGluZXMsIHdpdGggbm8gb3RoZXIKKyAgLy8gdG9rZW5zIGFwcGVhcmluZyBvbiB0aG9zZSBsaW5lcywgd2lsbCBiZSB0cmVhdGVkIGFzIGEgc2luZ2xlIGNvbW1lbnQuCisgIC8vCisgIC8vIE9ubHkgdGhlIGNvbW1lbnQgY29udGVudCBpcyByZXR1cm5lZDsgY29tbWVudCBtYXJrZXJzIChlLmcuIC8vKSBhcmUKKyAgLy8gc3RyaXBwZWQgb3V0LiAgRm9yIGJsb2NrIGNvbW1lbnRzLCBsZWFkaW5nIHdoaXRlc3BhY2UgYW5kIGFuIGFzdGVyaXNrIHdpbGwKKyAgLy8gYmUgc3RyaXBwZWQgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIGVhY2ggbGluZSBvdGhlciB0aGFuIHRoZSBmaXJzdC4gIE5ld2xpbmVzCisgIC8vIGFyZSBpbmNsdWRlZCBpbiB0aGUgb3V0cHV0LgorICAvLworICAvLyBFeGFtcGxlczoKKyAgLy8KKyAgLy8gICBvcHRpb25hbCBpbnQzMiBmb28gPSAxOyAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBmb28uCisgIC8vICAgLy8gQ29tbWVudCBhdHRhY2hlZCB0byBiYXIuCisgIC8vICAgb3B0aW9uYWwgaW50MzIgYmFyID0gMjsKKyAgLy8KKyAgLy8gICBvcHRpb25hbCBzdHJpbmcgYmF6ID0gMzsKKyAgLy8gICAvLyBDb21tZW50IGF0dGFjaGVkIHRvIGJhei4KKyAgLy8gICAvLyBBbm90aGVyIGxpbmUgYXR0YWNoZWQgdG8gYmF6LgorICAvLworICAvLyAgIC8vIENvbW1lbnQgYXR0YWNoZWQgdG8gcXV4LgorICAvLyAgIC8vCisgIC8vICAgLy8gQW5vdGhlciBsaW5lIGF0dGFjaGVkIHRvIHF1eC4KKyAgLy8gICBvcHRpb25hbCBkb3VibGUgcXV4ID0gNDsKKyAgLy8KKyAgLy8gICAvLyBEZXRhY2hlZCBjb21tZW50LiAgVGhpcyBpcyBub3QgYXR0YWNoZWQgdG8gcXV4IG9yIGNvcmdlCisgIC8vICAgLy8gYmVjYXVzZSB0aGVyZSBhcmUgYmxhbmsgbGluZXMgc2VwYXJhdGluZyBpdCBmcm9tIGJvdGguCisgIC8vCisgIC8vICAgb3B0aW9uYWwgc3RyaW5nIGNvcmdlID0gNTsKKyAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkCisgIC8vICAgICogdG8gY29yZ2UuICBMZWFkaW5nIGFzdGVyaXNrcworICAvLyAgICAqIHdpbGwgYmUgcmVtb3ZlZC4gKi8KKyAgLy8gICAvKiBCbG9jayBjb21tZW50IGF0dGFjaGVkIHRvCisgIC8vICAgICogZ3JhdWx0LiAqLworICAvLyAgIG9wdGlvbmFsIGludDMyIGdyYXVsdCA9IDY7CisgIGJvb2wgTmV4dFdpdGhDb21tZW50cyhzdHJpbmcqIHByZXZfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogZGV0YWNoZWRfY29tbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIG5leHRfbGVhZGluZ19jb21tZW50cyk7CisKICAgLy8gUGFyc2UgaGVscGVycyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAvLyBQYXJzZXMgYSBUWVBFX0ZMT0FUIHRva2VuLiAgVGhpcyBuZXZlciBmYWlscywgc28gbG9uZyBhcyB0aGUgdGV4dCBhY3R1YWxseQpAQCAtMTgwLDYgKzIzNywyMSBAQAogICAvLyBTZXRzIHRoZSBjb21tZW50IHN0eWxlLgogICB2b2lkIHNldF9jb21tZW50X3N0eWxlKENvbW1lbnRTdHlsZSBzdHlsZSkgeyBjb21tZW50X3N0eWxlXyA9IHN0eWxlOyB9CiAKKyAgLy8gV2hldGhlciB0byByZXF1aXJlIHdoaXRlc3BhY2UgYmV0d2VlbiBhIG51bWJlciBhbmQgYSBmaWVsZCBuYW1lLgorICAvLyBEZWZhdWx0IGlzIHRydWUuIERvIG5vdCB1c2UgdGhpczsgZm9yIEdvb2dsZS1pbnRlcm5hbCBjbGVhbnVwIG9ubHkuCisgIHZvaWQgc2V0X3JlcXVpcmVfc3BhY2VfYWZ0ZXJfbnVtYmVyKGJvb2wgcmVxdWlyZSkgeworICAgIHJlcXVpcmVfc3BhY2VfYWZ0ZXJfbnVtYmVyXyA9IHJlcXVpcmU7CisgIH0KKworICAvLyBXaGV0aGVyIHRvIGFsbG93IHN0cmluZyBsaXRlcmFscyB0byBzcGFuIG11bHRpcGxlIGxpbmVzLiBEZWZhdWx0IGlzIGZhbHNlLgorICAvLyBEbyBub3QgdXNlIHRoaXM7IGZvciBHb29nbGUtaW50ZXJuYWwgY2xlYW51cCBvbmx5LgorICB2b2lkIHNldF9hbGxvd19tdWx0aWxpbmVfc3RyaW5ncyhib29sIGFsbG93KSB7CisgICAgYWxsb3dfbXVsdGlsaW5lX3N0cmluZ3NfID0gYWxsb3c7CisgIH0KKworICAvLyBFeHRlcm5hbCBoZWxwZXI6IHZhbGlkYXRlIGFuIGlkZW50aWZpZXIuCisgIHN0YXRpYyBib29sIElzSWRlbnRpZmllcihjb25zdCBzdHJpbmcmIHRleHQpOworCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgcHJpdmF0ZToKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFRva2VuaXplcik7CkBAIC0xOTgsMjAgKzI3MCwyNCBAQAogCiAgIC8vIExpbmUgYW5kIGNvbHVtbiBudW1iZXIgb2YgY3VycmVudF9jaGFyXyB3aXRoaW4gdGhlIHdob2xlIGlucHV0IHN0cmVhbS4KICAgaW50IGxpbmVfOwotICBpbnQgY29sdW1uXzsKKyAgQ29sdW1uTnVtYmVyIGNvbHVtbl87CiAKLSAgLy8gUG9zaXRpb24gaW4gYnVmZmVyXyB3aGVyZSBTdGFydFRva2VuKCkgd2FzIGNhbGxlZC4gIElmIHRoZSB0b2tlbgotICAvLyBzdGFydGVkIGluIHRoZSBwcmV2aW91cyBidWZmZXIsIHRoaXMgaXMgemVybywgYW5kIGN1cnJlbnRfLnRleHQgYWxyZWFkeQotICAvLyBjb250YWlucyB0aGUgcGFydCBvZiB0aGUgdG9rZW4gZnJvbSB0aGUgcHJldmlvdXMgYnVmZmVyLiAgSWYgbm90Ci0gIC8vIGN1cnJlbnRseSBwYXJzaW5nIGEgdG9rZW4sIHRoaXMgaXMgLTEuCi0gIGludCB0b2tlbl9zdGFydF87CisgIC8vIFN0cmluZyB0byB3aGljaCB0ZXh0IHNob3VsZCBiZSBhcHBlbmRlZCBhcyB3ZSBhZHZhbmNlIHRocm91Z2ggaXQuCisgIC8vIENhbGwgUmVjb3JkVG8oJnN0cikgdG8gc3RhcnQgcmVjb3JkaW5nIGFuZCBTdG9wUmVjb3JkaW5nKCkgdG8gc3RvcC4KKyAgLy8gRS5nLiBTdGFydFRva2VuKCkgY2FsbHMgUmVjb3JkVG8oJmN1cnJlbnRfLnRleHQpLiAgcmVjb3JkX3N0YXJ0XyBpcyB0aGUKKyAgLy8gcG9zaXRpb24gd2l0aGluIHRoZSBjdXJyZW50IGJ1ZmZlciB3aGVyZSByZWNvcmRpbmcgc3RhcnRlZC4KKyAgc3RyaW5nKiByZWNvcmRfdGFyZ2V0XzsKKyAgaW50IHJlY29yZF9zdGFydF87CiAKICAgLy8gT3B0aW9ucy4KICAgYm9vbCBhbGxvd19mX2FmdGVyX2Zsb2F0XzsKICAgQ29tbWVudFN0eWxlIGNvbW1lbnRfc3R5bGVfOworICBib29sIHJlcXVpcmVfc3BhY2VfYWZ0ZXJfbnVtYmVyXzsKKyAgYm9vbCBhbGxvd19tdWx0aWxpbmVfc3RyaW5nc187CiAKICAgLy8gU2luY2Ugd2UgY291bnQgY29sdW1ucyB3ZSBuZWVkIHRvIGludGVycHJldCB0YWJzIHNvbWVob3cuICBXZSdsbCB0YWtlCiAgIC8vIHRoZSBzdGFuZGFyZCA4LWNoYXJhY3RlciBkZWZpbml0aW9uIGZvciBsYWNrIG9mIGFueSB3YXkgdG8gZG8gYmV0dGVyLgorICAvLyBUaGlzIG11c3QgbWF0Y2ggdGhlIGRvY3VtZW50YXRpb24gb2YgQ29sdW1uTnVtYmVyLgogICBzdGF0aWMgY29uc3QgaW50IGtUYWJXaWR0aCA9IDg7CiAKICAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTIyMyw2ICsyOTksOSBAQAogICAvLyBSZWFkIGEgbmV3IGJ1ZmZlciBmcm9tIHRoZSBpbnB1dC4KICAgdm9pZCBSZWZyZXNoKCk7CiAKKyAgaW5saW5lIHZvaWQgUmVjb3JkVG8oc3RyaW5nKiB0YXJnZXQpOworICBpbmxpbmUgdm9pZCBTdG9wUmVjb3JkaW5nKCk7CisKICAgLy8gQ2FsbGVkIHdoZW4gdGhlIGN1cnJlbnQgY2hhcmFjdGVyIGlzIHRoZSBmaXJzdCBjaGFyYWN0ZXIgb2YgYSBuZXcKICAgLy8gdG9rZW4gKG5vdCBpbmNsdWRpbmcgd2hpdGVzcGFjZSBvciBjb21tZW50cykuCiAgIGlubGluZSB2b2lkIFN0YXJ0VG9rZW4oKTsKQEAgLTI1NSwxMyArMzM0LDMyIEBACiAgIFRva2VuVHlwZSBDb25zdW1lTnVtYmVyKGJvb2wgc3RhcnRlZF93aXRoX3plcm8sIGJvb2wgc3RhcnRlZF93aXRoX2RvdCk7CiAKICAgLy8gQ29uc3VtZSB0aGUgcmVzdCBvZiBhIGxpbmUuCi0gIHZvaWQgQ29uc3VtZUxpbmVDb21tZW50KCk7CisgIHZvaWQgQ29uc3VtZUxpbmVDb21tZW50KHN0cmluZyogY29udGVudCk7CiAgIC8vIENvbnN1bWUgdW50aWwgIiovIi4KLSAgdm9pZCBDb25zdW1lQmxvY2tDb21tZW50KCk7CisgIHZvaWQgQ29uc3VtZUJsb2NrQ29tbWVudChzdHJpbmcqIGNvbnRlbnQpOworCisgIGVudW0gTmV4dENvbW1lbnRTdGF0dXMgeworICAgIC8vIFN0YXJ0ZWQgYSBsaW5lIGNvbW1lbnQuCisgICAgTElORV9DT01NRU5ULAorCisgICAgLy8gU3RhcnRlZCBhIGJsb2NrIGNvbW1lbnQuCisgICAgQkxPQ0tfQ09NTUVOVCwKKworICAgIC8vIENvbnN1bWVkIGEgc2xhc2gsIHRoZW4gcmVhbGl6ZWQgaXQgd2Fzbid0IGEgY29tbWVudC4gIGN1cnJlbnRfIGhhcworICAgIC8vIGJlZW4gZmlsbGVkIGluIHdpdGggYSBzbGFzaCB0b2tlbi4gIFRoZSBjYWxsZXIgc2hvdWxkIHJldHVybiBpdC4KKyAgICBTTEFTSF9OT1RfQ09NTUVOVCwKKworICAgIC8vIFdlIGRvIG5vdCBhcHBlYXIgdG8gYmUgc3RhcnRpbmcgYSBjb21tZW50IGhlcmUuCisgICAgTk9fQ09NTUVOVAorICB9OworCisgIC8vIElmIHdlJ3JlIGF0IHRoZSBzdGFydCBvZiBhIG5ldyBjb21tZW50LCBjb25zdW1lIGl0IGFuZCByZXR1cm4gd2hhdCBraW5kCisgIC8vIG9mIGNvbW1lbnQgaXQgaXMuCisgIE5leHRDb21tZW50U3RhdHVzIFRyeUNvbnN1bWVDb21tZW50U3RhcnQoKTsKIAogICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBUaGVzZSBoZWxwZXIgbWV0aG9kcyBtYWtlIHRoZSBwYXJzaW5nIGNvZGUgbW9yZSByZWFkYWJsZS4gIFRoZQotICAvLyAiY2hhcmFjdGVyIGNsYXNzZXMiIHJlZmVyZWQgdG8gYXJlIGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGUgLmNjIGZpbGUuCisgIC8vICJjaGFyYWN0ZXIgY2xhc3NlcyIgcmVmZXJyZWQgdG8gYXJlIGRlZmluZWQgYXQgdGhlIHRvcCBvZiB0aGUgLmNjIGZpbGUuCiAgIC8vIEJhc2ljYWxseSBpdCBpcyBhIEMrKyBjbGFzcyB3aXRoIG9uZSBtZXRob2Q6CiAgIC8vICAgc3RhdGljIGJvb2wgSW5DbGFzcyhjaGFyIGMpOwogICAvLyBUaGUgbWV0aG9kIHJldHVybnMgdHJ1ZSBpZiBjIGlzIGEgbWVtYmVyIG9mIHRoaXMgImNsYXNzIiwgbGlrZSAiTGV0dGVyIgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyX3VuaXR0ZXN0LmNjCmluZGV4IDEwNmQwODAuLmFlMDgxMWYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3Rva2VuaXplcl91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXJfdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDE0ICszMiwxNiBAQAogLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKLSNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8bWF0aC5oPgogI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgpAQCAtNDEwLDEyICs0MTIsNiBAQAogICAgIHsgVG9rZW5pemVyOjpUWVBFX0VORCAgICAgICAsICIiICAgLCAxLCAzLCAzIH0sCiAgIH19LAogCi0gIC8vIEJ5dGVzIHdpdGggdGhlIGhpZ2gtb3JkZXIgYml0IHNldCBzaG91bGQgbm90IGJlIHNlZW4gYXMgY29udHJvbCBjaGFyYWN0ZXJzLgotICB7ICJcMzAwIiwgewotICAgIHsgVG9rZW5pemVyOjpUWVBFX1NZTUJPTCwgIlwzMDAiLCAwLCAwLCAxIH0sCi0gICAgeyBUb2tlbml6ZXI6OlRZUEVfRU5EICAgLCAiIiAgICAsIDAsIDEsIDEgfSwKLSAgfX0sCi0KICAgLy8gVGVzdCBhbGwgd2hpdGVzcGFjZSBjaGFycwogICB7ICJmb29cblx0XHJcdlxmYmFyIiwgewogICAgIHsgVG9rZW5pemVyOjpUWVBFX0lERU5USUZJRVIsICJmb28iLCAwLCAgMCwgIDMgfSwKQEAgLTUxNCw2ICs1MTAsMjE3IEBACiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAorLy8gSW4gZWFjaCBjYXNlLCB0aGUgaW5wdXQgaXMgZXhwZWN0ZWQgdG8gaGF2ZSB0d28gdG9rZW5zIG5hbWVkICJwcmV2IiBhbmQKKy8vICJuZXh0IiB3aXRoIGNvbW1lbnRzIGluIGJldHdlZW4uCitzdHJ1Y3QgRG9jQ29tbWVudENhc2UgeworICBzdHJpbmcgaW5wdXQ7CisKKyAgY29uc3QgY2hhciogcHJldl90cmFpbGluZ19jb21tZW50czsKKyAgY29uc3QgY2hhciogZGV0YWNoZWRfY29tbWVudHNbMTBdOworICBjb25zdCBjaGFyKiBuZXh0X2xlYWRpbmdfY29tbWVudHM7Cit9OworCitpbmxpbmUgb3N0cmVhbSYgb3BlcmF0b3I8PChvc3RyZWFtJiBvdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEb2NDb21tZW50Q2FzZSYgdGVzdF9jYXNlKSB7CisgIHJldHVybiBvdXQgPDwgQ0VzY2FwZSh0ZXN0X2Nhc2UuaW5wdXQpOworfQorCitEb2NDb21tZW50Q2FzZSBrRG9jQ29tbWVudENhc2VzW10gPSB7CisgIHsKKyAgICAicHJldiBuZXh0IiwKKworICAgICIiLAorICAgIHt9LAorICAgICIiCisgICAgICB9LAorCisgICAgICAgIHsKKyAgICAgICJwcmV2IC8qIGlnbm9yZWQgKi8gbmV4dCIsCisKKyAgICAgICIiLAorICAgICAge30sCisgICAgICAiIgorICAgICAgICB9LAorCisgICAgICAgICAgeworICAgICAgICAicHJldiAvLyB0cmFpbGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAibmV4dCIsCisKKyAgICAgICAgICAgICIgdHJhaWxpbmcgY29tbWVudFxuIiwKKyAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgIiIKKyAgICAgICAgICB9LAorCisgICAgICAgICAgICB7CisgICAgICAgICAgInByZXZcbiIKKyAgICAgICAgICAgICAgIi8vIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAgICAgICAgICJuZXh0IiwKKworICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICIgbGVhZGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICIgbGluZSAyXG4iCisgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICJwcmV2XG4iCisgICAgICAgICAgICAgICAgIi8vIHRyYWlsaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAiLy8gbGluZSAyXG4iCisgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICJuZXh0IiwKKworICAgICAgICAgICAgICAgICIgdHJhaWxpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICIgbGluZSAyXG4iLAorICAgICAgICAgICAgICAgIHt9LAorICAgICAgICAgICAgICAgICIiCisgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICJwcmV2IC8vIHRyYWlsaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICIvLyBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICIvLyBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgICAgICJuZXh0IiwKKworICAgICAgICAgICAgICAgICAgIiB0cmFpbGluZyBjb21tZW50XG4iLAorICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAiIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgIiBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgInByZXYgLyogdHJhaWxpbmcgYmxvY2sgY29tbWVudCAqL1xuIgorICAgICAgICAgICAgICAgICAgICAiLyogbGVhZGluZyBibG9jayBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICIgKiBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMyAqLyIKKyAgICAgICAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICAgICAgICIgdHJhaWxpbmcgYmxvY2sgY29tbWVudCAiLAorICAgICAgICAgICAgICAgICAgICB7fSwKKyAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGJsb2NrIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDMgIgorICAgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAicHJldlxuIgorICAgICAgICAgICAgICAgICAgICAgICIvKiB0cmFpbGluZyBibG9jayBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgKiBsaW5lIDNcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICovXG4iCisgICAgICAgICAgICAgICAgICAgICAgIi8qIGxlYWRpbmcgYmxvY2sgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgKiBsaW5lIDJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICogbGluZSAzICovIgorICAgICAgICAgICAgICAgICAgICAgICJuZXh0IiwKKworICAgICAgICAgICAgICAgICAgICAgICIgdHJhaWxpbmcgYmxvY2sgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgbGluZSAyXG4iCisgICAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDNcbiIsCisgICAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGJsb2NrIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgbGluZSAzICIKKyAgICAgICAgICAgICAgICAgICAgfSwKKworICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgInByZXZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICIvLyB0cmFpbGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiLy8gZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi8vIGxpbmUgMlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIlxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi8vIHNlY29uZCBkZXRhY2hlZCBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAiLyogdGhpcmQgZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIiAqIGxpbmUgMiAqL1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgIi8vIGxlYWRpbmcgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICAgICAgICAgICAiIHRyYWlsaW5nIGNvbW1lbnRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgIiBkZXRhY2hlZCBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICIgbGluZSAyXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiIHNlY29uZCBkZXRhY2hlZCBjb21tZW50XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiIHRoaXJkIGRldGFjaGVkIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsaW5lIDIgIgorICAgICAgICAgICAgICAgICAgICAgICAgfSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIH0sCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgInByZXYgLyoqL1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gZGV0YWNoZWQgY29tbWVudFxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gbGVhZGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm5leHQiLAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAiIGRldGFjaGVkIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiBsZWFkaW5nIGNvbW1lbnRcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInByZXYgLyoqL1xuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLy8gbGVhZGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJuZXh0IiwKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAge30sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgbGVhZGluZyBjb21tZW50XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKworVEVTVF8yRChUb2tlbml6ZXJUZXN0LCBEb2NDb21tZW50cywga0RvY0NvbW1lbnRDYXNlcywga0Jsb2NrU2l6ZXMpIHsKKyAgLy8gU2V0IHVwIHRoZSB0b2tlbml6ZXIuCisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dChrRG9jQ29tbWVudENhc2VzX2Nhc2UuaW5wdXQuZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAga0RvY0NvbW1lbnRDYXNlc19jYXNlLmlucHV0LnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtCbG9ja1NpemVzX2Nhc2UpOworICBUZXN0RXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICBUb2tlbml6ZXIgdG9rZW5pemVyKCZpbnB1dCwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgLy8gU2V0IHVwIGEgc2Vjb25kIHRva2VuaXplciB3aGVyZSB3ZSdsbCBwYXNzIGFsbCBOVUxMcyB0byBOZXh0V2l0aENvbW1lbnRzKCkuCisgIFRlc3RJbnB1dFN0cmVhbSBpbnB1dDIoa0RvY0NvbW1lbnRDYXNlc19jYXNlLmlucHV0LmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGtEb2NDb21tZW50Q2FzZXNfY2FzZS5pbnB1dC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc19jYXNlKTsKKyAgVG9rZW5pemVyIHRva2VuaXplcjIoJmlucHV0MiwgJmVycm9yX2NvbGxlY3Rvcik7CisKKyAgdG9rZW5pemVyLk5leHQoKTsKKyAgdG9rZW5pemVyMi5OZXh0KCk7CisKKyAgRVhQRUNUX0VRKCJwcmV2IiwgdG9rZW5pemVyLmN1cnJlbnQoKS50ZXh0KTsKKyAgRVhQRUNUX0VRKCJwcmV2IiwgdG9rZW5pemVyMi5jdXJyZW50KCkudGV4dCk7CisKKyAgc3RyaW5nIHByZXZfdHJhaWxpbmdfY29tbWVudHM7CisgIHZlY3RvcjxzdHJpbmc+IGRldGFjaGVkX2NvbW1lbnRzOworICBzdHJpbmcgbmV4dF9sZWFkaW5nX2NvbW1lbnRzOworICB0b2tlbml6ZXIuTmV4dFdpdGhDb21tZW50cygmcHJldl90cmFpbGluZ19jb21tZW50cywgJmRldGFjaGVkX2NvbW1lbnRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKKyAgdG9rZW5pemVyMi5OZXh0V2l0aENvbW1lbnRzKE5VTEwsIE5VTEwsIE5VTEwpOworICBFWFBFQ1RfRVEoIm5leHQiLCB0b2tlbml6ZXIuY3VycmVudCgpLnRleHQpOworICBFWFBFQ1RfRVEoIm5leHQiLCB0b2tlbml6ZXIyLmN1cnJlbnQoKS50ZXh0KTsKKworICBFWFBFQ1RfRVEoa0RvY0NvbW1lbnRDYXNlc19jYXNlLnByZXZfdHJhaWxpbmdfY29tbWVudHMsCisgICAgICAgICAgICBwcmV2X3RyYWlsaW5nX2NvbW1lbnRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGRldGFjaGVkX2NvbW1lbnRzLnNpemUoKTsgaSsrKSB7CisgICAgQVNTRVJUX0xUKGksIEdPT0dMRV9BUlJBWVNJWkUoa0RvY0NvbW1lbnRDYXNlcykpOworICAgIEFTU0VSVF9UUlVFKGtEb2NDb21tZW50Q2FzZXNfY2FzZS5kZXRhY2hlZF9jb21tZW50c1tpXSAhPSBOVUxMKTsKKyAgICBFWFBFQ1RfRVEoa0RvY0NvbW1lbnRDYXNlc19jYXNlLmRldGFjaGVkX2NvbW1lbnRzW2ldLAorICAgICAgICAgICAgICBkZXRhY2hlZF9jb21tZW50c1tpXSk7CisgIH0KKworICAvLyBWZXJpZnkgdGhhdCB3ZSBtYXRjaGVkIGFsbCB0aGUgZGV0YWNoZWQgY29tbWVudHMuCisgIEVYUEVDVF9FUShOVUxMLAorICAgICAga0RvY0NvbW1lbnRDYXNlc19jYXNlLmRldGFjaGVkX2NvbW1lbnRzW2RldGFjaGVkX2NvbW1lbnRzLnNpemUoKV0pOworCisgIEVYUEVDVF9FUShrRG9jQ29tbWVudENhc2VzX2Nhc2UubmV4dF9sZWFkaW5nX2NvbW1lbnRzLAorICAgICAgICAgICAgbmV4dF9sZWFkaW5nX2NvbW1lbnRzKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiAvLyBUZXN0IHBhcnNlIGhlbHBlcnMuICBJdCdzIG5vdCByZWFsbHkgd29ydGggc2V0dGluZyB1cCBhIGZ1bGwgZGF0YS1kcml2ZW4KIC8vIHRlc3QgaGVyZS4KIFRFU1RfRihUb2tlbml6ZXJUZXN0LCBQYXJzZUludGVnZXIpIHsKQEAgLTUyOSwxOSArNzM2LDEzIEBACiAgIEVYUEVDVF9FUSgwLCBQYXJzZUludGVnZXIoIjB4IikpOwogCiAgIHVpbnQ2NCBpOwotI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUICAvLyBkZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIHlldAorCiAgIC8vIFRlc3QgaW52YWxpZCBpbnRlZ2VycyB0aGF0IHdpbGwgbmV2ZXIgYmUgdG9rZW5pemVkIGFzIGludGVnZXJzLgotICBFWFBFQ1RfREVCVUdfREVBVEgoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoInp4eSIsIGt1aW50NjRtYXgsICZpKSwKLSAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7Ci0gIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMS4yIiwga3VpbnQ2NG1heCwgJmkpLAotICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGFuIGludGVnZXIiKTsKLSAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIwOCIsIGt1aW50NjRtYXgsICZpKSwKLSAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7Ci0gIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigiMHhnIiwga3VpbnQ2NG1heCwgJmkpLAotICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGFuIGludGVnZXIiKTsKLSAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCItMSIsIGt1aW50NjRtYXgsICZpKSwKLSAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhbiBpbnRlZ2VyIik7Ci0jZW5kaWYgIC8vIEdURVNUX0hBU19ERUFUSF9URVNUCisgIEVYUEVDVF9GQUxTRShUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcigienh5Iiwga3VpbnQ2NG1heCwgJmkpKTsKKyAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIxLjIiLCBrdWludDY0bWF4LCAmaSkpOworICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIjA4Iiwga3VpbnQ2NG1heCwgJmkpKTsKKyAgRVhQRUNUX0ZBTFNFKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIweGciLCBrdWludDY0bWF4LCAmaSkpOworICBFWFBFQ1RfRkFMU0UoVG9rZW5pemVyOjpQYXJzZUludGVnZXIoIi0xIiwga3VpbnQ2NG1heCwgJmkpKTsKIAogICAvLyBUZXN0IG92ZXJmbG93cy4KICAgRVhQRUNUX1RSVUUgKFRva2VuaXplcjo6UGFyc2VJbnRlZ2VyKCIwIiwgMCwgJmkpKTsKQEAgLTU4NCw3ICs3ODUsNyBAQAogICBFWFBFQ1RfRVEoICAgICAwLjAsIFRva2VuaXplcjo6UGFyc2VGbG9hdCgiMWUtOTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OSIpKTsKICAgRVhQRUNUX0VRKEhVR0VfVkFMLCBUb2tlbml6ZXI6OlBhcnNlRmxvYXQoIjFlKzk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTk5OTkiKSk7CiAKLSNpZmRlZiBHVEVTVF9IQVNfREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQKKyNpZmRlZiBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVCAgLy8gZGVhdGggdGVzdHMgZG8gbm90IHdvcmsgb24gV2luZG93cyB5ZXQKICAgLy8gVGVzdCBpbnZhbGlkIGludGVnZXJzIHRoYXQgd2lsbCBuZXZlciBiZSB0b2tlbml6ZWQgYXMgaW50ZWdlcnMuCiAgIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlRmxvYXQoInp4eSIpLAogICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKQEAgLTU5Miw3ICs3OTMsNyBAQAogICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKICAgRVhQRUNUX0RFQlVHX0RFQVRIKFRva2VuaXplcjo6UGFyc2VGbG9hdCgiLTEuMCIpLAogICAgICJwYXNzZWQgdGV4dCB0aGF0IGNvdWxkIG5vdCBoYXZlIGJlZW4gdG9rZW5pemVkIGFzIGEgZmxvYXQiKTsKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKIH0KIAogVEVTVF9GKFRva2VuaXplclRlc3QsIFBhcnNlU3RyaW5nKSB7CkBAIC02MTQsMTEgKzgxNSwyNyBAQAogICBUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCInXFwiLCAmb3V0cHV0KTsKICAgRVhQRUNUX0VRKCJcXCIsIG91dHB1dCk7CiAKKyAgLy8gRXhwZXJpbWVudCB3aXRoIFVuaWNvZGUgZXNjYXBlcy4gSGVyZSBhcmUgb25lLSwgdHdvLSBhbmQgdGhyZWUtYnl0ZSBVbmljb2RlCisgIC8vIGNoYXJhY3RlcnMuCisgIFRva2VuaXplcjo6UGFyc2VTdHJpbmcoIidcXHUwMDI0XFx1MDBhMlxcdTIwYWNcXFUwMDAyNGI2MlhYJyIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoIiTCouKCrPCkraJYWCIsIG91dHB1dCk7CisgIC8vIFNhbWUgdGhpbmcgZW5jb2RlZCB1c2luZyBVVEYxNi4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcdTAwMjRcXHUwMGEyXFx1MjBhY1xcdWQ4NTJcXHVkZjYyWFgnIiwgJm91dHB1dCk7CisgIEVYUEVDVF9FUSgiJMKi4oKs8KStolhYIiwgb3V0cHV0KTsKKyAgLy8gSGVyZSdzIHNvbWUgYnJva2VuIFVURjE2OyB0aGVyZSdzIGEgaGVhZCBzdXJyb2dhdGUgd2l0aCBubyB0YWlsIHN1cnJvZ2F0ZS4KKyAgLy8gV2UganVzdCBvdXRwdXQgdGhpcyBhcyBpZiBpdCB3ZXJlIFVURjg7IGl0J3Mgbm90IGEgZGVmaW5lZCBjb2RlIHBvaW50LCBidXQKKyAgLy8gaXQgaGFzIGEgZGVmaW5lZCBlbmNvZGluZy4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiJ1xcdWQ4NTJYWCciLCAmb3V0cHV0KTsKKyAgRVhQRUNUX0VRKCJceGVkXHhhMVx4OTJYWCIsIG91dHB1dCk7CisgIC8vIE1hbGZvcm1lZCBlc2NhcGU6IERlbW9ucyBtYXkgZmx5IG91dCBvZiB0aGUgbm9zZS4KKyAgVG9rZW5pemVyOjpQYXJzZVN0cmluZygiXFx1MCIsICZvdXRwdXQpOworICBFWFBFQ1RfRVEoInUwIiwgb3V0cHV0KTsKKwogICAvLyBUZXN0IGludmFsaWQgc3RyaW5ncyB0aGF0IHdpbGwgbmV2ZXIgYmUgdG9rZW5pemVkIGFzIHN0cmluZ3MuCi0jaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0CiAgIEVYUEVDVF9ERUJVR19ERUFUSChUb2tlbml6ZXI6OlBhcnNlU3RyaW5nKCIiLCAmb3V0cHV0KSwKICAgICAicGFzc2VkIHRleHQgdGhhdCBjb3VsZCBub3QgaGF2ZSBiZWVuIHRva2VuaXplZCBhcyBhIHN0cmluZyIpOwotI2VuZGlmICAvLyBHVEVTVF9IQVNfREVBVEhfVEVTVAorI2VuZGlmICAvLyBQUk9UT0JVRl9IQVNfREVBVEhfVEVTVAogfQogCiBURVNUX0YoVG9rZW5pemVyVGVzdCwgUGFyc2VTdHJpbmdBcHBlbmQpIHsKQEAgLTY1MiwxMiArODY5LDIwIEBACiAgIC8vIFN0cmluZyBlcnJvcnMuCiAgIHsgIidcXGwnIGZvbyIsIHRydWUsCiAgICAgIjA6MjogSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgaW4gc3RyaW5nIGxpdGVyYWwuXG4iIH0sCisgIHsgIidcXFgnIGZvbyIsIHRydWUsCisgICAgIjA6MjogSW52YWxpZCBlc2NhcGUgc2VxdWVuY2UgaW4gc3RyaW5nIGxpdGVyYWwuXG4iIH0sCiAgIHsgIidcXHgnIGZvbyIsIHRydWUsCiAgICAgIjA6MzogRXhwZWN0ZWQgaGV4IGRpZ2l0cyBmb3IgZXNjYXBlIHNlcXVlbmNlLlxuIiB9LAogICB7ICInZm9vIiwgZmFsc2UsCi0gICAgIjA6NDogU3RyaW5nIGxpdGVyYWxzIGNhbm5vdCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuXG4iIH0sCisgICAgIjA6NDogVW5leHBlY3RlZCBlbmQgb2Ygc3RyaW5nLlxuIiB9LAogICB7ICInYmFyXG5mb28iLCB0cnVlLAogICAgICIwOjQ6IFN0cmluZyBsaXRlcmFscyBjYW5ub3QgY3Jvc3MgbGluZSBib3VuZGFyaWVzLlxuIiB9LAorICB7ICInXFx1MDEnIGZvbyIsIHRydWUsCisgICAgIjA6NTogRXhwZWN0ZWQgZm91ciBoZXggZGlnaXRzIGZvciBcXHUgZXNjYXBlIHNlcXVlbmNlLlxuIiB9LAorICB7ICInXFx1MDEnIGZvbyIsIHRydWUsCisgICAgIjA6NTogRXhwZWN0ZWQgZm91ciBoZXggZGlnaXRzIGZvciBcXHUgZXNjYXBlIHNlcXVlbmNlLlxuIiB9LAorICB7ICInXFx1WFlaJyBmb28iLCB0cnVlLAorICAgICIwOjM6IEV4cGVjdGVkIGZvdXIgaGV4IGRpZ2l0cyBmb3IgXFx1IGVzY2FwZSBzZXF1ZW5jZS5cbiIgfSwKIAogICAvLyBJbnRlZ2VyIGVycm9ycy4KICAgeyAiMTIzZm9vIiwgdHJ1ZSwKQEAgLTcxNyw2ICs5NDIsMTAgQEAKICAgICAiMDowOiBJbnZhbGlkIGNvbnRyb2wgY2hhcmFjdGVycyBlbmNvdW50ZXJlZCBpbiB0ZXh0LlxuIiB9LAogICB7IHN0cmluZygiXDBcMGZvbyIsIDUpLCB0cnVlLAogICAgICIwOjA6IEludmFsaWQgY29udHJvbCBjaGFyYWN0ZXJzIGVuY291bnRlcmVkIGluIHRleHQuXG4iIH0sCisKKyAgLy8gQ2hlY2sgZXJyb3IgZnJvbSBoaWdoIG9yZGVyIGJpdHMgc2V0CisgIHsgIlwzMDBmb28iLCB0cnVlLAorICAgICIwOjA6IEludGVycHJldGluZyBub24gYXNjaWkgY29kZXBvaW50IDE5Mi5cbiIgfSwKIH07CiAKIFRFU1RfMkQoVG9rZW5pemVyVGVzdCwgRXJyb3JzLCBrRXJyb3JDYXNlcywga0Jsb2NrU2l6ZXMpIHsKQEAgLTczNCw3ICs5NjMsNyBAQAogICB9CiAKICAgLy8gQ2hlY2sgdGhhdCB0aGUgZXJyb3JzIG1hdGNoIHdoYXQgd2FzIGV4cGVjdGVkLgotICBFWFBFQ1RfRVEoZXJyb3JfY29sbGVjdG9yLnRleHRfLCBrRXJyb3JDYXNlc19jYXNlLmVycm9ycyk7CisgIEVYUEVDVF9FUShrRXJyb3JDYXNlc19jYXNlLmVycm9ycywgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKIAogICAvLyBJZiB0aGUgZXJyb3Igd2FzIHJlY292ZXJhYmxlLCBtYWtlIHN1cmUgd2Ugc2F3ICJmb28iIGFmdGVyIGl0LgogICBpZiAoa0Vycm9yQ2FzZXNfY2FzZS5yZWNvdmVyYWJsZSkgewpAQCAtNzYwLDYgKzk4OSw3IEBACiAgIEVYUEVDVF9FUShzdHJsZW4oImZvbyIpLCBpbnB1dC5CeXRlQ291bnQoKSk7CiB9CiAKKwogfSAgLy8gbmFtZXNwYWNlCiB9ICAvLyBuYW1lc3BhY2UgaW8KIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uY2MKaW5kZXggZGFkNmZmMS4uMTg2ZGUwMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCw2ICszNCw4IEBACiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTQzLDYgKzQ1LDE0IEBACiBaZXJvQ29weU91dHB1dFN0cmVhbTo6flplcm9Db3B5T3V0cHV0U3RyZWFtKCkge30KIAogCitib29sIFplcm9Db3B5T3V0cHV0U3RyZWFtOjpXcml0ZUFsaWFzZWRSYXcoY29uc3Qgdm9pZCogLyogZGF0YSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgLyogc2l6ZSAqLykgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBaZXJvQ29weU91dHB1dFN0cmVhbSBkb2Vzbid0IHN1cHBvcnQgYWxpYXNpbmcuICIKKyAgICAgICAgICAgICAgICAiUmVhY2hpbmcgaGVyZSB1c3VhbGx5IG1lYW5zIGEgWmVyb0NvcHlPdXRwdXRTdHJlYW0gIgorICAgICAgICAgICAgICAgICJpbXBsZW1lbnRhdGlvbiBidWcuIjsKKyAgcmV0dXJuIGZhbHNlOworfQorCiB9ICAvLyBuYW1lc3BhY2UgaW8KIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbS5oCmluZGV4IGRiNTMyNmYuLjUyNjUwZmMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTIyNiw2ICsyMjYsMTYgQEAKICAgLy8gUmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIGJ5dGVzIHdyaXR0ZW4gc2luY2UgdGhpcyBvYmplY3Qgd2FzIGNyZWF0ZWQuCiAgIHZpcnR1YWwgaW50NjQgQnl0ZUNvdW50KCkgY29uc3QgPSAwOwogCisgIC8vIFdyaXRlIGEgZ2l2ZW4gY2h1bmsgb2YgZGF0YSB0byB0aGUgb3V0cHV0LiAgU29tZSBvdXRwdXQgc3RyZWFtcyBtYXkKKyAgLy8gaW1wbGVtZW50IHRoaXMgaW4gYSB3YXkgdGhhdCBhdm9pZHMgY29weWluZy4gQ2hlY2sgQWxsb3dzQWxpYXNpbmcoKSBiZWZvcmUKKyAgLy8gY2FsbGluZyBXcml0ZUFsaWFzZWRSYXcoKS4gSXQgd2lsbCBHT09HTEVfQ0hFQ0sgZmFpbCBpZiBXcml0ZUFsaWFzZWRSYXcoKSBpcworICAvLyBjYWxsZWQgb24gYSBzdHJlYW0gdGhhdCBkb2VzIG5vdCBhbGxvdyBhbGlhc2luZy4KKyAgLy8KKyAgLy8gTk9URTogSXQgaXMgY2FsbGVyJ3MgcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIGNodW5rIG9mIG1lbW9yeQorICAvLyByZW1haW5zIGxpdmUgdW50aWwgYWxsIG9mIHRoZSBkYXRhIGhhcyBiZWVuIGNvbnN1bWVkIGZyb20gdGhlIHN0cmVhbS4KKyAgdmlydHVhbCBib29sIFdyaXRlQWxpYXNlZFJhdyhjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7CisgIHZpcnR1YWwgYm9vbCBBbGxvd3NBbGlhc2luZygpIGNvbnN0IHsgcmV0dXJuIGZhbHNlOyB9CisKIAogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhaZXJvQ29weU91dHB1dFN0cmVhbSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuY2MKaW5kZXggMTM4NGM3NC4uN2VjMmI1ZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDYsNyArNDYsOSBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KKwogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CkBAIC00MTIsNyArNDE0LDkgQEAKIAogTGltaXRpbmdJbnB1dFN0cmVhbTo6TGltaXRpbmdJbnB1dFN0cmVhbShaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjQgbGltaXQpCi0gIDogaW5wdXRfKGlucHV0KSwgbGltaXRfKGxpbWl0KSB7fQorICA6IGlucHV0XyhpbnB1dCksIGxpbWl0XyhsaW1pdCkgeworICBwcmlvcl9ieXRlc19yZWFkXyA9IGlucHV0Xy0+Qnl0ZUNvdW50KCk7Cit9CiAKIExpbWl0aW5nSW5wdXRTdHJlYW06On5MaW1pdGluZ0lucHV0U3RyZWFtKCkgewogICAvLyBJZiB3ZSBvdmVyc2hvdCB0aGUgbGltaXQsIGJhY2sgdXAuCkBAIC00NTYsOSArNDYwLDkgQEAKIAogaW50NjQgTGltaXRpbmdJbnB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgY29uc3QgewogICBpZiAobGltaXRfIDwgMCkgewotICAgIHJldHVybiBpbnB1dF8tPkJ5dGVDb3VudCgpICsgbGltaXRfOworICAgIHJldHVybiBpbnB1dF8tPkJ5dGVDb3VudCgpICsgbGltaXRfIC0gcHJpb3JfYnl0ZXNfcmVhZF87CiAgIH0gZWxzZSB7Ci0gICAgcmV0dXJuIGlucHV0Xy0+Qnl0ZUNvdW50KCk7CisgICAgcmV0dXJuIGlucHV0Xy0+Qnl0ZUNvdW50KCkgLSBwcmlvcl9ieXRlc19yZWFkXzsKICAgfQogfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oCmluZGV4IDlmZWRiMDAuLjA3NDZmYTYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNDQsNiArMzQ0LDcgQEAKICBwcml2YXRlOgogICBaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF87CiAgIGludDY0IGxpbWl0XzsgIC8vIERlY3JlYXNlcyBhcyB3ZSBnbywgYmVjb21lcyBuZWdhdGl2ZSBpZiB3ZSBvdmVyc2hvb3QuCisgIGludDY0IHByaW9yX2J5dGVzX3JlYWRfOyAgLy8gQnl0ZXMgcmVhZCBvbiB1bmRlcmx5aW5nIHN0cmVhbSBhdCBjb25zdHJ1Y3Rpb24KIAogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTGltaXRpbmdJbnB1dFN0cmVhbSk7CiB9OwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYwppbmRleCBlODAxMjUxLi5lNmNhODhjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsOSArMzIsMTUgQEAKIC8vICBCYXNlZCBvbiBvcmlnaW5hbCBQcm90b2NvbCBCdWZmZXJzIGRlc2lnbiBieQogLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgogCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNjMsNyArNjksNyBAQAogCiBib29sIEFycmF5SW5wdXRTdHJlYW06Ok5leHQoY29uc3Qgdm9pZCoqIGRhdGEsIGludCogc2l6ZSkgewogICBpZiAocG9zaXRpb25fIDwgc2l6ZV8pIHsKLSAgICBsYXN0X3JldHVybmVkX3NpemVfID0gbWluKGJsb2NrX3NpemVfLCBzaXplXyAtIHBvc2l0aW9uXyk7CisgICAgbGFzdF9yZXR1cm5lZF9zaXplXyA9IHN0ZDo6bWluKGJsb2NrX3NpemVfLCBzaXplXyAtIHBvc2l0aW9uXyk7CiAgICAgKmRhdGEgPSBkYXRhXyArIHBvc2l0aW9uXzsKICAgICAqc2l6ZSA9IGxhc3RfcmV0dXJuZWRfc2l6ZV87CiAgICAgcG9zaXRpb25fICs9IGxhc3RfcmV0dXJuZWRfc2l6ZV87CkBAIC0xMTYsNyArMTIyLDcgQEAKIAogYm9vbCBBcnJheU91dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CiAgIGlmIChwb3NpdGlvbl8gPCBzaXplXykgewotICAgIGxhc3RfcmV0dXJuZWRfc2l6ZV8gPSBtaW4oYmxvY2tfc2l6ZV8sIHNpemVfIC0gcG9zaXRpb25fKTsKKyAgICBsYXN0X3JldHVybmVkX3NpemVfID0gc3RkOjptaW4oYmxvY2tfc2l6ZV8sIHNpemVfIC0gcG9zaXRpb25fKTsKICAgICAqZGF0YSA9IGRhdGFfICsgcG9zaXRpb25fOwogICAgICpzaXplID0gbGFzdF9yZXR1cm5lZF9zaXplXzsKICAgICBwb3NpdGlvbl8gKz0gbGFzdF9yZXR1cm5lZF9zaXplXzsKQEAgLTE1MSw2ICsxNTcsNyBAQAogfQogCiBib29sIFN0cmluZ091dHB1dFN0cmVhbTo6TmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKSB7CisgIEdPT0dMRV9DSEVDSyh0YXJnZXRfICE9IE5VTEwpOwogICBpbnQgb2xkX3NpemUgPSB0YXJnZXRfLT5zaXplKCk7CiAKICAgLy8gR3JvdyB0aGUgc3RyaW5nLgpAQCAtMTU5LDI5ICsxNjYsNjcgQEAKICAgICAvLyB3aXRob3V0IGEgbWVtb3J5IGFsbG9jYXRpb24gdGhpcyB3YXkuCiAgICAgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZCh0YXJnZXRfLCB0YXJnZXRfLT5jYXBhY2l0eSgpKTsKICAgfSBlbHNlIHsKLSAgICAvLyBTaXplIGhhcyByZWFjaGVkIGNhcGFjaXR5LCBzbyBkb3VibGUgdGhlIHNpemUuICBBbHNvIG1ha2Ugc3VyZQotICAgIC8vIHRoYXQgdGhlIG5ldyBzaXplIGlzIGF0IGxlYXN0IGtNaW5pbXVtU2l6ZS4KKyAgICAvLyBTaXplIGhhcyByZWFjaGVkIGNhcGFjaXR5LCB0cnkgdG8gZG91YmxlIHRoZSBzaXplLgorICAgIGlmIChvbGRfc2l6ZSA+IHN0ZDo6bnVtZXJpY19saW1pdHM8aW50Pjo6bWF4KCkgLyAyKSB7CisgICAgICAvLyBDYW4gbm90IGRvdWJsZSB0aGUgc2l6ZSBvdGhlcndpc2UgaXQgaXMgZ29pbmcgdG8gY2F1c2UgaW50ZWdlcgorICAgICAgLy8gb3ZlcmZsb3cgaW4gdGhlIGV4cHJlc3Npb24gYmVsb3c6IG9sZF9zaXplICogMiAiOworICAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIkNhbm5vdCBhbGxvY2F0ZSBidWZmZXIgbGFyZ2VyIHRoYW4ga2ludDMybWF4IGZvciAiCisgICAgICAgICAgICAgICAgIDw8ICJTdHJpbmdPdXRwdXRTdHJlYW0uIjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gRG91YmxlIHRoZSBzaXplLCBhbHNvIG1ha2Ugc3VyZSB0aGF0IHRoZSBuZXcgc2l6ZSBpcyBhdCBsZWFzdAorICAgIC8vIGtNaW5pbXVtU2l6ZS4KICAgICBTVExTdHJpbmdSZXNpemVVbmluaXRpYWxpemVkKAotICAgICAgdGFyZ2V0XywKLSAgICAgIG1heChvbGRfc2l6ZSAqIDIsCi0gICAgICAgICAga01pbmltdW1TaXplICsgMCkpOyAgLy8gIisgMCIgd29ya3MgYXJvdW5kIEdDQzQgd2VpcmRuZXNzLgorICAgICAgICB0YXJnZXRfLAorICAgICAgICBzdGQ6Om1heChvbGRfc2l6ZSAqIDIsCisgICAgICAgICAgICAgICAgIGtNaW5pbXVtU2l6ZSArIDApKTsgIC8vICIrIDAiIHdvcmtzIGFyb3VuZCBHQ0M0IHdlaXJkbmVzcy4KICAgfQogCi0gICpkYXRhID0gc3RyaW5nX2FzX2FycmF5KHRhcmdldF8pICsgb2xkX3NpemU7CisgICpkYXRhID0gbXV0YWJsZV9zdHJpbmdfZGF0YSh0YXJnZXRfKSArIG9sZF9zaXplOwogICAqc2l6ZSA9IHRhcmdldF8tPnNpemUoKSAtIG9sZF9zaXplOwogICByZXR1cm4gdHJ1ZTsKIH0KIAogdm9pZCBTdHJpbmdPdXRwdXRTdHJlYW06OkJhY2tVcChpbnQgY291bnQpIHsKICAgR09PR0xFX0NIRUNLX0dFKGNvdW50LCAwKTsKKyAgR09PR0xFX0NIRUNLKHRhcmdldF8gIT0gTlVMTCk7CiAgIEdPT0dMRV9DSEVDS19MRShjb3VudCwgdGFyZ2V0Xy0+c2l6ZSgpKTsKICAgdGFyZ2V0Xy0+cmVzaXplKHRhcmdldF8tPnNpemUoKSAtIGNvdW50KTsKIH0KIAogaW50NjQgU3RyaW5nT3V0cHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIEdPT0dMRV9DSEVDSyh0YXJnZXRfICE9IE5VTEwpOwogICByZXR1cm4gdGFyZ2V0Xy0+c2l6ZSgpOwogfQogCit2b2lkIFN0cmluZ091dHB1dFN0cmVhbTo6U2V0U3RyaW5nKHN0cmluZyogdGFyZ2V0KSB7CisgIHRhcmdldF8gPSB0YXJnZXQ7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworTGF6eVN0cmluZ091dHB1dFN0cmVhbTo6TGF6eVN0cmluZ091dHB1dFN0cmVhbSgKKyAgICBSZXN1bHRDYWxsYmFjazxzdHJpbmcqPiogY2FsbGJhY2spCisgICAgOiBTdHJpbmdPdXRwdXRTdHJlYW0oTlVMTCksCisgICAgICBjYWxsYmFja18oR09PR0xFX0NIRUNLX05PVE5VTEwoY2FsbGJhY2spKSwKKyAgICAgIHN0cmluZ19pc19zZXRfKGZhbHNlKSB7Cit9CisKK0xhenlTdHJpbmdPdXRwdXRTdHJlYW06On5MYXp5U3RyaW5nT3V0cHV0U3RyZWFtKCkgeworfQorCitib29sIExhenlTdHJpbmdPdXRwdXRTdHJlYW06Ok5leHQodm9pZCoqIGRhdGEsIGludCogc2l6ZSkgeworICBpZiAoIXN0cmluZ19pc19zZXRfKSB7CisgICAgU2V0U3RyaW5nKGNhbGxiYWNrXy0+UnVuKCkpOworICAgIHN0cmluZ19pc19zZXRfID0gdHJ1ZTsKKyAgfQorICByZXR1cm4gU3RyaW5nT3V0cHV0U3RyZWFtOjpOZXh0KGRhdGEsIHNpemUpOworfQorCitpbnQ2NCBMYXp5U3RyaW5nT3V0cHV0U3RyZWFtOjpCeXRlQ291bnQoKSBjb25zdCB7CisgIHJldHVybiBzdHJpbmdfaXNfc2V0XyA/IFN0cmluZ091dHB1dFN0cmVhbTo6Qnl0ZUNvdW50KCkgOiAwOworfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIENvcHlpbmdJbnB1dFN0cmVhbTo6fkNvcHlpbmdJbnB1dFN0cmVhbSgpIHt9CkBAIC0xOTAsOCArMjM1LDggQEAKICAgY2hhciBqdW5rWzQwOTZdOwogICBpbnQgc2tpcHBlZCA9IDA7CiAgIHdoaWxlIChza2lwcGVkIDwgY291bnQpIHsKLSAgICBpbnQgYnl0ZXMgPSBSZWFkKGp1bmssIG1pbihjb3VudCAtIHNraXBwZWQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW1wbGljaXRfY2FzdDxpbnQ+KHNpemVvZihqdW5rKSkpKTsKKyAgICBpbnQgYnl0ZXMgPQorICAgICAgICBSZWFkKGp1bmssIHN0ZDo6bWluKGNvdW50IC0gc2tpcHBlZCwgaW1wbGljaXRfY2FzdDxpbnQ+KHNpemVvZihqdW5rKSkpKTsKICAgICBpZiAoYnl0ZXMgPD0gMCkgewogICAgICAgLy8gRU9GIG9yIHJlYWQgZXJyb3IuCiAgICAgICByZXR1cm4gc2tpcHBlZDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oCmluZGV4IDE1M2Y1NDMuLjlkODFjY2YgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDQsMTAgKzQ0LDE3IEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9JT19aRVJPX0NPUFlfU1RSRUFNX0lNUExfTElURV9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0lPX1pFUk9fQ09QWV9TVFJFQU1fSU1QTF9MSVRFX0hfXwogCisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDxpb3Nmd2Q+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KIAogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKQEAgLTEyNiw4ICsxMzMsMTAgQEAKIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdPdXRwdXRTdHJlYW0gOiBwdWJsaWMgWmVyb0NvcHlPdXRwdXRTdHJlYW0gewogIHB1YmxpYzoKICAgLy8gQ3JlYXRlIGEgU3RyaW5nT3V0cHV0U3RyZWFtIHdoaWNoIGFwcGVuZHMgYnl0ZXMgdG8gdGhlIGdpdmVuIHN0cmluZy4KLSAgLy8gVGhlIHN0cmluZyByZW1haW5zIHByb3BlcnR5IG9mIHRoZSBjYWxsZXIsIGJ1dCBpdCBNVVNUIE5PVCBiZSBhY2Nlc3NlZAotICAvLyBpbiBhbnkgd2F5IHVudGlsIHRoZSBzdHJlYW0gaXMgZGVzdHJveWVkLgorICAvLyBUaGUgc3RyaW5nIHJlbWFpbnMgcHJvcGVydHkgb2YgdGhlIGNhbGxlciwgYnV0IGl0IGlzIG11dGF0ZWQgaW4gYXJiaXRyYXJ5CisgIC8vIHdheXMgYW5kIE1VU1QgTk9UIGJlIGFjY2Vzc2VkIGluIGFueSB3YXkgdW50aWwgeW91J3JlIGRvbmUgd2l0aCB0aGUKKyAgLy8gc3RyZWFtLiBFaXRoZXIgYmUgc3VyZSB0aGVyZSdzIG5vIGZ1cnRoZXIgdXNhZ2UsIG9yIChzYWZlc3QpIGRlc3Ryb3kgdGhlCisgIC8vIHN0cmVhbSBiZWZvcmUgdXNpbmcgdGhlIGNvbnRlbnRzLgogICAvLwogICAvLyBIaW50OiAgSWYgeW91IGNhbGwgdGFyZ2V0LT5yZXNlcnZlKG4pIGJlZm9yZSBjcmVhdGluZyB0aGUgc3RyZWFtLAogICAvLyAgIHRoZSBmaXJzdCBjYWxsIHRvIE5leHQoKSB3aWxsIHJldHVybiBhdCBsZWFzdCBuIGJ5dGVzIG9mIGJ1ZmZlcgpAQCAtMTQwLDYgKzE0OSw5IEBACiAgIHZvaWQgQmFja1VwKGludCBjb3VudCk7CiAgIGludDY0IEJ5dGVDb3VudCgpIGNvbnN0OwogCisgcHJvdGVjdGVkOgorICB2b2lkIFNldFN0cmluZyhzdHJpbmcqIHRhcmdldCk7CisKICBwcml2YXRlOgogICBzdGF0aWMgY29uc3QgaW50IGtNaW5pbXVtU2l6ZSA9IDE2OwogCkBAIC0xNDgsNiArMTYwLDI3IEBACiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhTdHJpbmdPdXRwdXRTdHJlYW0pOwogfTsKIAorLy8gTGF6eVN0cmluZ091dHB1dFN0cmVhbSBpcyBhIFN0cmluZ091dHB1dFN0cmVhbSB3aXRoIGxhenkgYWNxdWlzaXRpb24gb2YKKy8vIHRoZSBvdXRwdXQgc3RyaW5nIGZyb20gYSBjYWxsYmFjay4gVGhlIHN0cmluZyBpcyBvd25lZCBleHRlcm5hbGx5LCBhbmQgbm90CisvLyBkZWxldGVkIGluIHRoZSBzdHJlYW0gZGVzdHJ1Y3Rvci4KK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBMYXp5U3RyaW5nT3V0cHV0U3RyZWFtIDogcHVibGljIFN0cmluZ091dHB1dFN0cmVhbSB7CisgcHVibGljOgorICAvLyBDYWxsYmFjayBzaG91bGQgYmUgcGVybWFuZW50IChub24tc2VsZi1kZWxldGluZykuIE93bmVyc2hpcCBpcyB0cmFuc2ZlcnJlZAorICAvLyB0byB0aGUgTGF6eVN0cmluZ091dHB1dFN0cmVhbS4KKyAgZXhwbGljaXQgTGF6eVN0cmluZ091dHB1dFN0cmVhbShSZXN1bHRDYWxsYmFjazxzdHJpbmcqPiogY2FsbGJhY2spOworICB+TGF6eVN0cmluZ091dHB1dFN0cmVhbSgpOworCisgIC8vIGltcGxlbWVudHMgWmVyb0NvcHlPdXRwdXRTdHJlYW0sIG92ZXJyaWRpbmcgU3RyaW5nT3V0cHV0U3RyZWFtIC0tLS0tLS0tLS0tCisgIGJvb2wgTmV4dCh2b2lkKiogZGF0YSwgaW50KiBzaXplKTsKKyAgaW50NjQgQnl0ZUNvdW50KCkgY29uc3Q7CisKKyBwcml2YXRlOgorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPFJlc3VsdENhbGxiYWNrPHN0cmluZyo+ID4gY2FsbGJhY2tfOworICBib29sIHN0cmluZ19pc19zZXRfOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhMYXp5U3RyaW5nT3V0cHV0U3RyZWFtKTsKK307CisKIC8vIE5vdGU6ICBUaGVyZSBpcyBubyBTdHJpbmdJbnB1dFN0cmVhbS4gIEluc3RlYWQsIGp1c3QgY3JlYXRlIGFuCiAvLyBBcnJheUlucHV0U3RyZWFtIGFzIGZvbGxvd3M6CiAvLyAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoc3RyLmRhdGEoKSwgc3RyLnNpemUoKSk7CkBAIC0yMzEsNyArMjY0LDcgQEAKIAogICAvLyBEYXRhIGlzIHJlYWQgaW50byB0aGlzIGJ1ZmZlci4gIEl0IG1heSBiZSBOVUxMIGlmIG5vIGJ1ZmZlciBpcyBjdXJyZW50bHkKICAgLy8gaW4gdXNlLiAgT3RoZXJ3aXNlLCBpdCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZSBidWZmZXJfc2l6ZV8uCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyXzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXJfOwogICBjb25zdCBpbnQgYnVmZmVyX3NpemVfOwogCiAgIC8vIE51bWJlciBvZiB2YWxpZCBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciAoaS5lLiB0aGUgc2l6ZSBsYXN0CkBAIC0zMjAsNyArMzUzLDcgQEAKIAogICAvLyBEYXRhIGlzIHdyaXR0ZW4gZnJvbSB0aGlzIGJ1ZmZlci4gIEl0IG1heSBiZSBOVUxMIGlmIG5vIGJ1ZmZlciBpcwogICAvLyBjdXJyZW50bHkgaW4gdXNlLiAgT3RoZXJ3aXNlLCBpdCBwb2ludHMgdG8gYW4gYXJyYXkgb2Ygc2l6ZSBidWZmZXJfc2l6ZV8uCi0gIHNjb3BlZF9hcnJheTx1aW50OD4gYnVmZmVyXzsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PHVpbnQ4PiBidWZmZXJfOwogICBjb25zdCBpbnQgYnVmZmVyX3NpemVfOwogCiAgIC8vIE51bWJlciBvZiB2YWxpZCBieXRlcyBjdXJyZW50bHkgaW4gdGhlIGJ1ZmZlciAoaS5lLiB0aGUgc2l6ZSBsYXN0CkBAIC0zMzMsNiArMzY2LDQ0IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAorLy8gbXV0YWJsZV9zdHJpbmdfZGF0YSgpIGFuZCBhc19zdHJpbmdfZGF0YSgpIGFyZSB3b3JrYXJvdW5kcyB0byBpbXByb3ZlCisvLyB0aGUgcGVyZm9ybWFuY2Ugb2Ygd3JpdGluZyBuZXcgZGF0YSB0byBhbiBleGlzdGluZyBzdHJpbmcuICBVbmZvcnR1bmF0ZWx5CisvLyB0aGUgbWV0aG9kcyBwcm92aWRlZCBieSB0aGUgc3RyaW5nIGNsYXNzIGFyZSBzdWJvcHRpbWFsLCBhbmQgdXNpbmcgbWVtY3B5KCkKKy8vIGlzIG1pbGRseSBhbm5veWluZyBiZWNhdXNlIGl0IHJlcXVpcmVzIGl0cyBwb2ludGVyIGFyZ3MgdG8gYmUgbm9uLU5VTEwgZXZlbgorLy8gaWYgd2UgYXNrIGl0IHRvIGNvcHkgMCBieXRlcy4gIEZ1cnRoZXJtb3JlLCBzdHJpbmdfYXNfYXJyYXkoKSBoYXMgdGhlCisvLyBwcm9wZXJ0eSB0aGF0IGl0IGFsd2F5cyByZXR1cm5zIE5VTEwgaWYgaXRzIGFyZyBpcyB0aGUgZW1wdHkgc3RyaW5nLCBleGFjdGx5CisvLyB3aGF0IHdlIHdhbnQgdG8gYXZvaWQgaWYgd2UncmUgdXNpbmcgaXQgaW4gY29uanVuY3Rpb24gd2l0aCBtZW1jcHkoKSEKKy8vIFdpdGggQysrMTEsIHRoZSBkZXNpcmVkIG1lbWNweSgpIGJvaWxzIGRvd24gdG8gbWVtY3B5KC4uLiwgJigqcylbMF0sIHNpemUpLAorLy8gd2hlcmUgcyBpcyBhIHN0cmluZyouICBXaXRob3V0IEMrKzExLCAmKCpzKVswXSBpcyBub3QgZ3VhcmFudGVlZCB0byBiZSBzYWZlLAorLy8gc28gd2UgdXNlIHN0cmluZ19hc19hcnJheSgpLCBhbmQgbGl2ZSB3aXRoIHRoZSBleHRyYSBsb2dpYyB0aGF0IHRlc3RzIHdoZXRoZXIKKy8vICpzIGlzIGVtcHR5LgorCisvLyBSZXR1cm4gYSBwb2ludGVyIHRvIG11dGFibGUgY2hhcmFjdGVycyB1bmRlcmx5aW5nIHRoZSBnaXZlbiBzdHJpbmcuICBUaGUKKy8vIHJldHVybiB2YWx1ZSBpcyB2YWxpZCB1bnRpbCB0aGUgbmV4dCB0aW1lIHRoZSBzdHJpbmcgaXMgcmVzaXplZC4gIFdlCisvLyB0cnVzdCB0aGUgY2FsbGVyIHRvIHRyZWF0IHRoZSByZXR1cm4gdmFsdWUgYXMgYW4gYXJyYXkgb2YgbGVuZ3RoIHMtPnNpemUoKS4KK2lubGluZSBjaGFyKiBtdXRhYmxlX3N0cmluZ19kYXRhKHN0cmluZyogcykgeworI2lmZGVmIExBTkdfQ1hYMTEKKyAgLy8gVGhpcyBzaG91bGQgYmUgc2ltcGxlciAmIGZhc3RlciB0aGFuIHN0cmluZ19hc19hcnJheSgpIGJlY2F1c2UgdGhlIGxhdHRlcgorICAvLyBpcyBndWFyYW50ZWVkIHRvIHJldHVybiBOVUxMIHdoZW4gKnMgaXMgZW1wdHksIHNvIGl0IGhhcyB0byBjaGVjayBmb3IgdGhhdC4KKyAgcmV0dXJuICYoKnMpWzBdOworI2Vsc2UKKyAgcmV0dXJuIHN0cmluZ19hc19hcnJheShzKTsKKyNlbmRpZgorfQorCisvLyBhc19zdHJpbmdfZGF0YShzKSBpcyBlcXVpdmFsZW50IHRvCisvLyAgKHsgY2hhciogcCA9IG11dGFibGVfc3RyaW5nX2RhdGEocyk7IG1ha2VfcGFpcihwLCBwICE9IE5VTEwpOyB9KQorLy8gU29tZXRpbWVzIGl0J3MgZmFzdGVyOiBpbiBzb21lIHNjZW5hcmlvcyBwIGNhbm5vdCBiZSBOVUxMLCBhbmQgdGhlbiB0aGUKKy8vIGNvZGUgY2FuIGF2b2lkIHRoYXQgY2hlY2suCitpbmxpbmUgc3RkOjpwYWlyPGNoYXIqLCBib29sPiBhc19zdHJpbmdfZGF0YShzdHJpbmcqIHMpIHsKKyAgY2hhciAqcCA9IG11dGFibGVfc3RyaW5nX2RhdGEocyk7CisjaWZkZWYgTEFOR19DWFgxMQorICByZXR1cm4gc3RkOjptYWtlX3BhaXIocCwgdHJ1ZSk7CisjZWxzZQorICByZXR1cm4gbWFrZV9wYWlyKHAsIHAgIT0gTlVMTCk7CisjZW5kaWYKK30KKwogfSAgLy8gbmFtZXNwYWNlIGlvCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1fdW5pdHRlc3QuY2MKaW5kZXggNTE5NmQ5MC4uYTlkYjg4NyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00Niw3ICs0Niw2IEBACiAvLyAgICJwYXJhbWV0aXplZCB0ZXN0cyIgc28gdGhhdCBvbmUgc2V0IG9mIHRlc3RzIGNhbiBiZSB1c2VkIG9uIGFsbCB0aGUKIC8vICAgaW1wbGVtZW50YXRpb25zLgogCi0jaW5jbHVkZSAiY29uZmlnLmgiCiAKICNpZmRlZiBfTVNDX1ZFUgogI2luY2x1ZGUgPGlvLmg+CkBAIC01OCwxNiArNTcsMjIgQEAKICNpbmNsdWRlIDxzeXMvc3RhdC5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxtZW1vcnk+CisjaWZuZGVmIF9TSEFSRURfUFRSX0gKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2hhcmVkX3B0ci5oPgorI2VuZGlmCiAjaW5jbHVkZSA8c3N0cmVhbT4KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KIAogI2lmIEhBVkVfWkxJQgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9nemlwX3N0cmVhbS5oPgogI2VuZGlmCiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CkBAIC0xOTYsNyArMjAxLDcgQEAKIH0KIAogdm9pZCBJb1Rlc3Q6OlJlYWRTdHJpbmcoWmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsIGNvbnN0IHN0cmluZyYgc3RyKSB7Ci0gIHNjb3BlZF9hcnJheTxjaGFyPiBidWZmZXIobmV3IGNoYXJbc3RyLnNpemUoKSArIDFdKTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX2FycmF5PGNoYXI+IGJ1ZmZlcihuZXcgY2hhcltzdHIuc2l6ZSgpICsgMV0pOwogICBidWZmZXJbc3RyLnNpemUoKV0gPSAnXDAnOwogICBFWFBFQ1RfRVEoUmVhZEZyb21JbnB1dChpbnB1dCwgYnVmZmVyLmdldCgpLCBzdHIuc2l6ZSgpKSwgc3RyLnNpemUoKSk7CiAgIEVYUEVDVF9TVFJFUShzdHIuY19zdHIoKSwgYnVmZmVyLmdldCgpKTsKQEAgLTM3MCw2ICszNzUsMTAwIEBACiAgIGRlbGV0ZSBbXSBidWZmZXI7CiB9CiAKK1RFU1RfRihJb1Rlc3QsIEd6aXBJb1dpdGhGbHVzaCkgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CisgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOworICAvLyBXZSBzdGFydCB3aXRoIGkgPSA0IGFzIHdlIHdhbnQgYSBibG9jayBzaXplID4gNi4gV2l0aCBibG9jayBzaXplIDw9IDYKKyAgLy8gRmx1c2goKSBmaWxscyB1cCB0aGUgZW50aXJlIDJLIGJ1ZmZlciB3aXRoIGZsdXNoIG1hcmtlcnMgYW5kIHRoZSB0ZXN0CisgIC8vIGZhaWxzLiBTZWUgZG9jdW1lbnRhdGlvbiBmb3IgRmx1c2goKSBmb3IgbW9yZSBkZXRhaWwuCisgIGZvciAoaW50IGkgPSA0OyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBmb3IgKGludCBqID0gMDsgaiA8IGtCbG9ja1NpemVDb3VudDsgaisrKSB7CisgICAgICBmb3IgKGludCB6ID0gMDsgeiA8IGtCbG9ja1NpemVDb3VudDsgeisrKSB7CisgICAgICAgIGludCBnemlwX2J1ZmZlcl9zaXplID0ga0Jsb2NrU2l6ZXNbel07CisgICAgICAgIGludCBzaXplOworICAgICAgICB7CisgICAgICAgICAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGtCbG9ja1NpemVzW2ldKTsKKyAgICAgICAgICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgICAgICAgICAgb3B0aW9ucy5mb3JtYXQgPSBHemlwT3V0cHV0U3RyZWFtOjpHWklQOworICAgICAgICAgIGlmIChnemlwX2J1ZmZlcl9zaXplICE9IC0xKSB7CisgICAgICAgICAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgICAgICAgICB9CisgICAgICAgICAgR3ppcE91dHB1dFN0cmVhbSBnem91dCgmb3V0cHV0LCBvcHRpb25zKTsKKyAgICAgICAgICBXcml0ZVN0dWZmKCZnem91dCk7CisgICAgICAgICAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7CisgICAgICAgICAgZ3pvdXQuQ2xvc2UoKTsKKyAgICAgICAgICBzaXplID0gb3V0cHV0LkJ5dGVDb3VudCgpOworICAgICAgICB9CisgICAgICAgIHsKKyAgICAgICAgICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwga0Jsb2NrU2l6ZXNbal0pOworICAgICAgICAgIEd6aXBJbnB1dFN0cmVhbSBnemluKAorICAgICAgICAgICAgICAmaW5wdXQsIEd6aXBJbnB1dFN0cmVhbTo6R1pJUCwgZ3ppcF9idWZmZXJfc2l6ZSk7CisgICAgICAgICAgUmVhZFN0dWZmKCZnemluKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBkZWxldGUgW10gYnVmZmVyOworfQorCitURVNUX0YoSW9UZXN0LCBHemlwSW9Db250aWd1b3VzRmx1c2hlcykgeworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CisgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOworCisgIGludCBibG9ja19zaXplID0ga0Jsb2NrU2l6ZXNbNF07CisgIGludCBnemlwX2J1ZmZlcl9zaXplID0gYmxvY2tfc2l6ZTsKKyAgaW50IHNpemU7CisKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGJsb2NrX3NpemUpOworICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKKyAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgfQorICBHemlwT3V0cHV0U3RyZWFtIGd6b3V0KCZvdXRwdXQsIG9wdGlvbnMpOworICBXcml0ZVN0dWZmKCZnem91dCk7CisgIEVYUEVDVF9UUlVFKGd6b3V0LkZsdXNoKCkpOworICBFWFBFQ1RfVFJVRShnem91dC5GbHVzaCgpKTsKKyAgZ3pvdXQuQ2xvc2UoKTsKKyAgc2l6ZSA9IG91dHB1dC5CeXRlQ291bnQoKTsKKworICBBcnJheUlucHV0U3RyZWFtIGlucHV0KGJ1ZmZlciwgc2l6ZSwgYmxvY2tfc2l6ZSk7CisgIEd6aXBJbnB1dFN0cmVhbSBnemluKAorICAgICAgJmlucHV0LCBHemlwSW5wdXRTdHJlYW06OkdaSVAsIGd6aXBfYnVmZmVyX3NpemUpOworICBSZWFkU3R1ZmYoJmd6aW4pOworCisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisKK1RFU1RfRihJb1Rlc3QsIEd6aXBJb1JlYWRBZnRlckZsdXNoKSB7CisgIGNvbnN0IGludCBrQnVmZmVyU2l6ZSA9IDIqMTAyNDsKKyAgdWludDgqIGJ1ZmZlciA9IG5ldyB1aW50OFtrQnVmZmVyU2l6ZV07CisKKyAgaW50IGJsb2NrX3NpemUgPSBrQmxvY2tTaXplc1s0XTsKKyAgaW50IGd6aXBfYnVmZmVyX3NpemUgPSBibG9ja19zaXplOworICBpbnQgc2l6ZTsKKyAgQXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0KGJ1ZmZlciwga0J1ZmZlclNpemUsIGJsb2NrX3NpemUpOworICBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zIG9wdGlvbnM7CisgIG9wdGlvbnMuZm9ybWF0ID0gR3ppcE91dHB1dFN0cmVhbTo6R1pJUDsKKyAgaWYgKGd6aXBfYnVmZmVyX3NpemUgIT0gLTEpIHsKKyAgICBvcHRpb25zLmJ1ZmZlcl9zaXplID0gZ3ppcF9idWZmZXJfc2l6ZTsKKyAgfQorCisgIEd6aXBPdXRwdXRTdHJlYW0gZ3pvdXQoJm91dHB1dCwgb3B0aW9ucyk7CisgIFdyaXRlU3R1ZmYoJmd6b3V0KTsKKyAgRVhQRUNUX1RSVUUoZ3pvdXQuRmx1c2goKSk7CisgIHNpemUgPSBvdXRwdXQuQnl0ZUNvdW50KCk7CisKKyAgQXJyYXlJbnB1dFN0cmVhbSBpbnB1dChidWZmZXIsIHNpemUsIGJsb2NrX3NpemUpOworICBHemlwSW5wdXRTdHJlYW0gZ3ppbigKKyAgICAgICZpbnB1dCwgR3ppcElucHV0U3RyZWFtOjpHWklQLCBnemlwX2J1ZmZlcl9zaXplKTsKKyAgUmVhZFN0dWZmKCZnemluKTsKKworICBnem91dC5DbG9zZSgpOworCisgIGRlbGV0ZSBbXSBidWZmZXI7Cit9CisKIFRFU1RfRihJb1Rlc3QsIFpsaWJJbykgewogICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSAyKjEwMjQ7CiAgIHVpbnQ4KiBidWZmZXIgPSBuZXcgdWludDhba0J1ZmZlclNpemVdOwpAQCAtNDY2LDkgKzU2NSwxMCBAQAogICAvLyBTb21lIGFkLWhvYyB0ZXN0aW5nIG9mIGNvbXByZXNzaW9uIG9wdGlvbnMuCiAKICAgc3RyaW5nIGdvbGRlbjsKLSAgRmlsZTo6UmVhZEZpbGVUb1N0cmluZ09yRGllKAotICAgIFRlc3RTb3VyY2VEaXIoKSArICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlIiwKLSAgICAmZ29sZGVuKTsKKyAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKAorICAgICAgVGVzdFNvdXJjZURpcigpICsKKyAgICAgICAgICAiL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSIsCisgICAgICAmZ29sZGVuLCB0cnVlKSk7CiAKICAgR3ppcE91dHB1dFN0cmVhbTo6T3B0aW9ucyBvcHRpb25zOwogICBzdHJpbmcgZ3ppcF9jb21wcmVzc2VkID0gQ29tcHJlc3MoZ29sZGVuLCBvcHRpb25zKTsKQEAgLTU2MSw2ICs2NjEsNDMgQEAKICAgZGVsZXRlIFtdIHRlbXBfYnVmZmVyOwogICBkZWxldGUgW10gYnVmZmVyOwogfQorCitURVNUX0YoSW9UZXN0LCBHemlwSW5wdXRCeXRlQ291bnRBZnRlckNsb3NlZCkgeworICBzdHJpbmcgZ29sZGVuID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgc3RyaW5nIGNvbXByZXNzZWQgPSBDb21wcmVzcyhnb2xkZW4sIEd6aXBPdXRwdXRTdHJlYW06Ok9wdGlvbnMoKSk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBrQmxvY2tTaXplQ291bnQ7IGkrKykgeworICAgIEFycmF5SW5wdXRTdHJlYW0gYXJyX2lucHV0KGNvbXByZXNzZWQuZGF0YSgpLCBjb21wcmVzc2VkLnNpemUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrQmxvY2tTaXplc1tpXSk7CisgICAgR3ppcElucHV0U3RyZWFtIGd6X2lucHV0KCZhcnJfaW5wdXQpOworICAgIGNvbnN0IHZvaWQqIGJ1ZmZlcjsKKyAgICBpbnQgc2l6ZTsKKyAgICB3aGlsZSAoZ3pfaW5wdXQuTmV4dCgmYnVmZmVyLCAmc2l6ZSkpIHsKKyAgICAgIEVYUEVDVF9MRShnel9pbnB1dC5CeXRlQ291bnQoKSwgZ29sZGVuLnNpemUoKSk7CisgICAgfQorICAgIEVYUEVDVF9FUShnb2xkZW4uc2l6ZSgpLCBnel9pbnB1dC5CeXRlQ291bnQoKSk7CisgIH0KK30KKworVEVTVF9GKElvVGVzdCwgR3ppcElucHV0Qnl0ZUNvdW50QWZ0ZXJDbG9zZWRDb25jYXRlbmF0ZWRTdHJlYW1zKSB7CisgIHN0cmluZyBnb2xkZW4xID0gImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6IjsKKyAgc3RyaW5nIGdvbGRlbjIgPSAidGhlIHF1aWNrIGJyb3duIGZveCBqdW1wcyBvdmVyIHRoZSBsYXp5IGRvZyI7CisgIGNvbnN0IHNpemVfdCB0b3RhbF9zaXplID0gZ29sZGVuMS5zaXplKCkgKyBnb2xkZW4yLnNpemUoKTsKKyAgc3RyaW5nIGNvbXByZXNzZWQgPSBDb21wcmVzcyhnb2xkZW4xLCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zKCkpICsKKyAgICAgICAgICAgICAgICAgICAgICBDb21wcmVzcyhnb2xkZW4yLCBHemlwT3V0cHV0U3RyZWFtOjpPcHRpb25zKCkpOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwga0Jsb2NrU2l6ZUNvdW50OyBpKyspIHsKKyAgICBBcnJheUlucHV0U3RyZWFtIGFycl9pbnB1dChjb21wcmVzc2VkLmRhdGEoKSwgY29tcHJlc3NlZC5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga0Jsb2NrU2l6ZXNbaV0pOworICAgIEd6aXBJbnB1dFN0cmVhbSBnel9pbnB1dCgmYXJyX2lucHV0KTsKKyAgICBjb25zdCB2b2lkKiBidWZmZXI7CisgICAgaW50IHNpemU7CisgICAgd2hpbGUgKGd6X2lucHV0Lk5leHQoJmJ1ZmZlciwgJnNpemUpKSB7CisgICAgICBFWFBFQ1RfTEUoZ3pfaW5wdXQuQnl0ZUNvdW50KCksIHRvdGFsX3NpemUpOworICAgIH0KKyAgICBFWFBFQ1RfRVEodG90YWxfc2l6ZSwgZ3pfaW5wdXQuQnl0ZUNvdW50KCkpOworICB9Cit9CiAjZW5kaWYKIAogLy8gVGhlcmUgaXMgbm8gc3RyaW5nIGlucHV0LCBvbmx5IHN0cmluZyBvdXRwdXQuICBBbHNvLCBpdCBkb2Vzbid0IHN1cHBvcnQKQEAgLTgyOSw2ICs5NjYsMjYgQEAKICAgUmVhZFN0dWZmKCZpbnB1dCk7CiB9CiAKKy8vIENoZWNrcyB0aGF0IEJ5dGVDb3VudCB3b3JrcyBjb3JyZWN0bHkgZm9yIExpbWl0aW5nSW5wdXRTdHJlYW1zIHdoZXJlIHRoZQorLy8gdW5kZXJseWluZyBzdHJlYW0gaGFzIGFscmVhZHkgYmVlbiByZWFkLgorVEVTVF9GKElvVGVzdCwgTGltaXRpbmdJbnB1dFN0cmVhbUJ5dGVDb3VudCkgeworICBjb25zdCBpbnQga0hhbGZCdWZmZXJTaXplID0gMTI4OworICBjb25zdCBpbnQga0J1ZmZlclNpemUgPSBrSGFsZkJ1ZmZlclNpemUgKiAyOworICB1aW50OCBidWZmZXJba0J1ZmZlclNpemVdOworCisgIC8vIFNldCB1cCBpbnB1dC4gT25seSBhbGxvdyBoYWxmIHRvIGJlIHJlYWQgYXQgb25jZS4KKyAgQXJyYXlJbnB1dFN0cmVhbSBhcnJheV9pbnB1dChidWZmZXIsIGtCdWZmZXJTaXplLCBrSGFsZkJ1ZmZlclNpemUpOworICBjb25zdCB2b2lkKiBkYXRhOworICBpbnQgc2l6ZTsKKyAgRVhQRUNUX1RSVUUoYXJyYXlfaW5wdXQuTmV4dCgmZGF0YSwgJnNpemUpKTsKKyAgRVhQRUNUX0VRKGtIYWxmQnVmZmVyU2l6ZSwgYXJyYXlfaW5wdXQuQnl0ZUNvdW50KCkpOworICAvLyBrSGFsZkJ1ZmZlclNpemUgLSAxIHRvIHRlc3QgbGltaXRpbmcgbG9naWMgYXMgd2VsbC4KKyAgTGltaXRpbmdJbnB1dFN0cmVhbSBpbnB1dCgmYXJyYXlfaW5wdXQsIGtIYWxmQnVmZmVyU2l6ZSAtIDEpOworICBFWFBFQ1RfRVEoMCwgaW5wdXQuQnl0ZUNvdW50KCkpOworICBFWFBFQ1RfVFJVRShpbnB1dC5OZXh0KCZkYXRhLCAmc2l6ZSkpOworICBFWFBFQ1RfRVEoa0hhbGZCdWZmZXJTaXplIC0gMSAsIGlucHV0LkJ5dGVDb3VudCgpKTsKK30KKwogLy8gQ2hlY2sgdGhhdCBhIHplcm8tc2l6ZSBhcnJheSBkb2Vzbid0IGNvbmZ1c2UgdGhlIGNvZGUuCiBURVNUKFplcm9TaXplQXJyYXksIElucHV0KSB7CiAgIEFycmF5SW5wdXRTdHJlYW0gaW5wdXQoTlVMTCwgMCk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX2FyZW5hX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfYXJlbmFfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9saXRlX3VuaXR0ZXN0LmNjCmluZGV4IGZmZWVjM2MuLjNjYTNmYmEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL2xpdGVfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbGl0ZV91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzMsMTMgKzMzLDcwIEBACiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGlvc3RyZWFtPgogCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hX3Rlc3RfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tYXBfbGl0ZV90ZXN0X3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAKIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAKK25hbWVzcGFjZSB7CisvLyBIZWxwZXIgbWV0aG9kcyB0byB0ZXN0IHBhcnNpbmcgbWVyZ2UgYmVoYXZpb3IuCit2b2lkIEV4cGVjdE1lc3NhZ2VNZXJnZWQoY29uc3QgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUmIG1lc3NhZ2UpIHsKKyAgR09PR0xFX0NIRUNLKG1lc3NhZ2Uub3B0aW9uYWxfaW50MzIoKSA9PSAzKTsKKyAgR09PR0xFX0NIRUNLKG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQoKSA9PSAyKTsKKyAgR09PR0xFX0NIRUNLKG1lc3NhZ2Uub3B0aW9uYWxfc3RyaW5nKCkgPT0gImhlbGxvIik7Cit9CisKK3ZvaWQgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMoCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzEsCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzIsCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUqIG1zZzMpIHsKKyAgbXNnMS0+c2V0X29wdGlvbmFsX2ludDMyKDEpOworICBtc2cyLT5zZXRfb3B0aW9uYWxfaW50NjQoMik7CisgIG1zZzMtPnNldF9vcHRpb25hbF9pbnQzMigzKTsKKyAgbXNnMy0+c2V0X29wdGlvbmFsX3N0cmluZygiaGVsbG8iKTsKK30KKwordm9pZCBTZXRBbGxUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygKKyAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUqIGVtcHR5X21lc3NhZ2UpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICBzdHJpbmcgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgZW1wdHlfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpOworfQorCit2b2lkIFNldFNvbWVUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygKKyAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUqIGVtcHR5X21lc3NhZ2UpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGUgbWVzc2FnZTsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50MzIoMTAxKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfaW50NjQoMTAyKTsKKyAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfdWludDMyKDEwMyk7CisgIG1lc3NhZ2Uuc2V0X29wdGlvbmFsX3VpbnQ2NCgxMDQpOworICBzdHJpbmcgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgZW1wdHlfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKGRhdGEpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworI2RlZmluZSBFWFBFQ1RfVFJVRSBHT09HTEVfQ0hFQ0sKKyNkZWZpbmUgQVNTRVJUX1RSVUUgR09PR0xFX0NIRUNLCisjZGVmaW5lIEVYUEVDVF9GQUxTRShDT05EKSBHT09HTEVfQ0hFQ0soIShDT05EKSkKKyNkZWZpbmUgRVhQRUNUX0VRIEdPT0dMRV9DSEVDS19FUQorI2RlZmluZSBBU1NFUlRfRVEgR09PR0xFX0NIRUNLX0VRCisKIGludCBtYWluKGludCBhcmdjLCBjaGFyKiBhcmd2W10pIHsKLSAgc3RyaW5nIGRhdGEsIHBhY2tlZF9kYXRhOworICBzdHJpbmcgZGF0YSwgZGF0YTIsIHBhY2tlZF9kYXRhOwogCiAgIHsKICAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSBtZXNzYWdlLCBtZXNzYWdlMiwgbWVzc2FnZTM7CkBAIC02Myw3ICsxMjAsNiBAQAogICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CiAgICAgbWVzc2FnZTIuQ29weUZyb20obWVzc2FnZSk7CiAgICAgc3RyaW5nIGV4dGVuc2lvbnNfZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKLSAgICBHT09HTEVfQ0hFQ0soZXh0ZW5zaW9uc19kYXRhID09IGRhdGEpOwogICAgIG1lc3NhZ2UzLlBhcnNlRnJvbVN0cmluZyhleHRlbnNpb25zX2RhdGEpOwogICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlKTsKICAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdEFsbEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOwpAQCAtMTA3LDYgKzE2Myw1NTYgQEAKICAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKICAgfQogCi0gIGNvdXQgPDwgIlBBU1MiIDw8IGVuZGw7CisgIHsKKyAgICAvLyBUZXN0IHRoYXQgaWYgYW4gb3B0aW9uYWwgb3IgcmVxdWlyZWQgbWVzc2FnZS9ncm91cCBmaWVsZCBhcHBlYXJzIG11bHRpcGxlCisgICAgLy8gdGltZXMgaW4gdGhlIGlucHV0LCB0aGV5IG5lZWQgdG8gYmUgbWVyZ2VkLgorICAgIGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlTGl0ZTo6UmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgZ2VuZXJhdG9yOworICAgIGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtc2cxOworICAgIGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtc2cyOworICAgIGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlKiBtc2czOworCisjZGVmaW5lIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChGSUVMRCkgICAgICAgICAgICAgICAgXAorICBtc2cxID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgbXNnMiA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICAgICAgICAgICAgICAgICBcCisgIG1zZzMgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgICAgICAgICAgICAgICAgXAorICBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcyhtc2cxLCBtc2cyLCBtc2czKQorCisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMSk7CisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMik7CisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMyk7CisgICAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGV4dDEpOworICAgIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChleHQyKTsKKworI3VuZGVmIEFTU0lHTl9SRVBFQVRFRF9GSUVMRAorI2RlZmluZSBBU1NJR05fUkVQRUFURURfR1JPVVAoRklFTEQpICAgICAgICAgICAgICAgIFwKKyAgbXNnMSA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCisgIG1zZzIgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAorICBtc2czID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKKyAgQXNzaWduUGFyc2luZ01lcmdlTWVzc2FnZXMobXNnMSwgbXNnMiwgbXNnMykKKworICAgIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChncm91cDEpOworICAgIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChncm91cDIpOworCisjdW5kZWYgQVNTSUdOX1JFUEVBVEVEX0dST1VQCisKKyAgICBzdHJpbmcgYnVmZmVyOworICAgIGdlbmVyYXRvci5TZXJpYWxpemVUb1N0cmluZygmYnVmZmVyKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZUxpdGUgcGFyc2luZ19tZXJnZTsKKyAgICBwYXJzaW5nX21lcmdlLlBhcnNlRnJvbVN0cmluZyhidWZmZXIpOworCisgICAgLy8gUmVxdWlyZWQgYW5kIG9wdGlvbmFsIGZpZWxkcyBzaG91bGQgYmUgbWVyZ2VkLgorICAgIEV4cGVjdE1lc3NhZ2VNZXJnZWQocGFyc2luZ19tZXJnZS5yZXF1aXJlZF9hbGxfdHlwZXMoKSk7CisgICAgRXhwZWN0TWVzc2FnZU1lcmdlZChwYXJzaW5nX21lcmdlLm9wdGlvbmFsX2FsbF90eXBlcygpKTsKKyAgICBFeHBlY3RNZXNzYWdlTWVyZ2VkKAorICAgICAgICBwYXJzaW5nX21lcmdlLm9wdGlvbmFsZ3JvdXAoKS5vcHRpb25hbF9ncm91cF9hbGxfdHlwZXMoKSk7CisgICAgRXhwZWN0TWVzc2FnZU1lcmdlZChwYXJzaW5nX21lcmdlLkdldEV4dGVuc2lvbigKKyAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RQYXJzaW5nTWVyZ2VMaXRlOjpvcHRpb25hbF9leHQpKTsKKworICAgIC8vIFJlcGVhdGVkIGZpZWxkcyBzaG91bGQgbm90IGJlIG1lcmdlZC4KKyAgICBHT09HTEVfQ0hFQ0socGFyc2luZ19tZXJnZS5yZXBlYXRlZF9hbGxfdHlwZXNfc2l6ZSgpID09IDMpOworICAgIEdPT0dMRV9DSEVDSyhwYXJzaW5nX21lcmdlLnJlcGVhdGVkZ3JvdXBfc2l6ZSgpID09IDMpOworICAgIEdPT0dMRV9DSEVDSyhwYXJzaW5nX21lcmdlLkV4dGVuc2lvblNpemUoCisgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OnVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlTGl0ZTo6cmVwZWF0ZWRfZXh0KSA9PSAzKTsKKyAgfQorCisgIC8vIFRlc3QgdW5rbm93biBmaWVsZHMgc3VwcG9ydCBmb3IgbGl0ZSBtZXNzYWdlcy4KKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eV9tZXNzYWdlOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0Q2xlYXIobWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRBbGxGaWVsZHMoJm1lc3NhZ2UpOworICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgZW1wdHlfbWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgZGF0YS5jbGVhcigpOworICAgIGRhdGEgPSBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgbWVzc2FnZTIuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIGRhdGEgPSBtZXNzYWdlMi5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0QWxsRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eV9tZXNzYWdlOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0RXh0ZW5zaW9uc0NsZWFyKG1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6U2V0QWxsRXh0ZW5zaW9ucygmbWVzc2FnZSk7CisgICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBkYXRhLmNsZWFyKCk7CisgICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgZGF0YSA9IG1lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RBbGxFeHRlbnNpb25zU2V0KG1lc3NhZ2UyKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgIH0KKworICB7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RQYWNrZWRUeXBlc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTI7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRDbGVhcihtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OlNldFBhY2tlZEZpZWxkcygmbWVzc2FnZSk7CisgICAgZGF0YSA9IG1lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBlbXB0eV9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBkYXRhLmNsZWFyKCk7CisgICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgZGF0YSA9IG1lc3NhZ2UyLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRGaWVsZHNTZXQobWVzc2FnZTIpOworICAgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZENsZWFyKG1lc3NhZ2UpOworICB9CisKKyAgeworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgbWVzc2FnZSwgbWVzc2FnZTI7CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIobWVzc2FnZSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6VGVzdFV0aWxMaXRlOjpTZXRQYWNrZWRFeHRlbnNpb25zKCZtZXNzYWdlKTsKKyAgICBkYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIGRhdGEuY2xlYXIoKTsKKyAgICBkYXRhID0gZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBkYXRhID0gbWVzc2FnZTIuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQobWVzc2FnZTIpOworICAgIG1lc3NhZ2UuQ2xlYXIoKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpUZXN0VXRpbExpdGU6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNDbGVhcihtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IFVua25vd24gZmllbGRzIHN3YXAKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVtcHR5TWVzc2FnZUxpdGUgZW1wdHlfbWVzc2FnZSwgZW1wdHlfbWVzc2FnZTI7CisgICAgU2V0QWxsVHlwZXNJbkVtcHR5TWVzc2FnZVVua25vd25GaWVsZHMoJmVtcHR5X21lc3NhZ2UpOworICAgIFNldFNvbWVUeXBlc0luRW1wdHlNZXNzYWdlVW5rbm93bkZpZWxkcygmZW1wdHlfbWVzc2FnZTIpOworICAgIGRhdGEgPSBlbXB0eV9tZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgZGF0YTIgPSBlbXB0eV9tZXNzYWdlMi5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGVtcHR5X21lc3NhZ2UuU3dhcCgmZW1wdHlfbWVzc2FnZTIpOworICAgIEdPT0dMRV9DSEVDS19FUShkYXRhLCBlbXB0eV9tZXNzYWdlMi5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgICBHT09HTEVfQ0hFQ0tfRVEoZGF0YTIsIGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIH0KKworICB7CisgICAgLy8gVGVzdCB1bmtub3duIGZpZWxkcyBzd2FwIHdpdGggc2VsZgorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eV9tZXNzYWdlOworICAgIFNldEFsbFR5cGVzSW5FbXB0eU1lc3NhZ2VVbmtub3duRmllbGRzKCZlbXB0eV9tZXNzYWdlKTsKKyAgICBkYXRhID0gZW1wdHlfbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGVtcHR5X21lc3NhZ2UuU3dhcCgmZW1wdHlfbWVzc2FnZSk7CisgICAgR09PR0xFX0NIRUNLX0VRKGRhdGEsIGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKSk7CisgIH0KKworICB7CisgICAgLy8gVGVzdCBNZXJnZUZyb20gd2l0aCB1bmtub3duIGZpZWxkcworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2UsIG1lc3NhZ2UyOworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlTGl0ZSBlbXB0eV9tZXNzYWdlLCBlbXB0eV9tZXNzYWdlMjsKKyAgICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQzMigxMDEpOworICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ludDMyKDIwMSk7CisgICAgbWVzc2FnZS5zZXRfb3B0aW9uYWxfbmVzdGVkX2VudW0oZ29vZ2xlOjpwcm90b2J1Zjo6dW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWik7CisgICAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX2ludDY0KDEwMik7CisgICAgbWVzc2FnZTIuYWRkX3JlcGVhdGVkX2ludDY0KDIwMik7CisgICAgbWVzc2FnZTIuc2V0X29wdGlvbmFsX2ZvcmVpZ25fZW51bShnb29nbGU6OnByb3RvYnVmOjp1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWik7CisKKyAgICBkYXRhID0gbWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGVtcHR5X21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpOworICAgIGRhdGEgPSBtZXNzYWdlMi5TZXJpYWxpemVBc1N0cmluZygpOworICAgIGVtcHR5X21lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKTsKKyAgICBtZXNzYWdlLk1lcmdlRnJvbShtZXNzYWdlMik7CisgICAgZW1wdHlfbWVzc2FnZS5NZXJnZUZyb20oZW1wdHlfbWVzc2FnZTIpOworCisgICAgZGF0YSA9IGVtcHR5X21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKyAgICBtZXNzYWdlMi5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CisgICAgLy8gV2UgZG8gbm90IGNvbXBhcmUgdGhlIHNlcmlhbGl6ZWQgb3V0cHV0IG9mIGEgbm9ybWFsIG1lc3NhZ2UgYW5kIGEgbGl0ZQorICAgIC8vIG1lc3NhZ2UgYmVjYXVzZSB0aGUgb3JkZXIgb2YgZmllbGRzIGRvIG5vdCBtYXRjaC4gV2UgY29udmVydCBsaXRlIG1lc3NhZ2UKKyAgICAvLyBiYWNrIGludG8gbm9ybWFsIG1lc3NhZ2UsIHRoZW4gY29tcGFyZS4KKyAgICBHT09HTEVfQ0hFQ0tfRVEobWVzc2FnZS5TZXJpYWxpemVBc1N0cmluZygpLCBtZXNzYWdlMi5TZXJpYWxpemVBc1N0cmluZygpKTsKKyAgfQorCisgIHsKKyAgICAvLyBUZXN0IHVua25vd24gZW51bSB2YWx1ZQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlIG1lc3NhZ2U7CisgICAgc3RyaW5nIGJ1ZmZlcjsKKyAgICB7CisgICAgICBnb29nbGU6OnByb3RvYnVmOjppbzo6U3RyaW5nT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmJ1ZmZlcik7CisgICAgICBnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoCisgICAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OmtPcHRpb25hbE5lc3RlZEVudW1GaWVsZE51bWJlciwKKyAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCwgJmNvZGVkX291dHB1dCk7CisgICAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMigxMCk7CisgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OldyaXRlVGFnKAorICAgICAgICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjprUmVwZWF0ZWROZXN0ZWRFbnVtRmllbGROdW1iZXIsCisgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICZjb2RlZF9vdXRwdXQpOworICAgICAgY29kZWRfb3V0cHV0LldyaXRlVmFyaW50MzIoMjApOworICAgIH0KKyAgICBtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhidWZmZXIpOworICAgIGRhdGEgPSBtZXNzYWdlLlNlcmlhbGl6ZUFzU3RyaW5nKCk7CisgICAgR09PR0xFX0NIRUNLX0VRKGRhdGEsIGJ1ZmZlcik7CisgIH0KKworICB7CisgICAgLy8gVGVzdCBDbGVhciB3aXRoIHVua25vd24gZmllbGRzCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RFbXB0eU1lc3NhZ2VMaXRlIGVtcHR5X21lc3NhZ2U7CisgICAgU2V0QWxsVHlwZXNJbkVtcHR5TWVzc2FnZVVua25vd25GaWVsZHMoJmVtcHR5X21lc3NhZ2UpOworICAgIGVtcHR5X21lc3NhZ2UuQ2xlYXIoKTsKKyAgICBHT09HTEVfQ0hFQ0tfRVEoMCwgZW1wdHlfbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLnNpemUoKSk7CisgIH0KKworICAvLyBUZXN0cyBmb3IgbWFwIGxpdGUgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKyAgeworICAgIC8vIEFjY2Vzc29ycworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOworCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpNb2RpZnlNYXBGaWVsZHMoJm1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzTW9kaWZpZWQobWVzc2FnZSk7CisgIH0KKworICB7CisgICAgLy8gU2V0TWFwRmllbGRzSW5pdGlhbGl6ZWQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzSW5pdGlhbGl6ZWQoJm1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0SW5pdGlhbGl6ZWQobWVzc2FnZSk7CisgIH0KKworICB7CisgICAgLy8gQ2xlYXIKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlKTsKKyAgICBtZXNzYWdlLkNsZWFyKCk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBDbGVhck1lc3NhZ2VNYXAKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICAvLyBDcmVhdGVzIGEgVGVzdEFsbFR5cGVzIHdpdGggZGVmYXVsdCB2YWx1ZQorICAgIGdvb2dsZTo6cHJvdG9idWY6OlRlc3RVdGlsTGl0ZTo6RXhwZWN0Q2xlYXIoCisgICAgICAgICgqbWVzc2FnZS5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdKTsKKyAgfQorCisgIHsKKyAgICAvLyBDb3B5RnJvbQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisKKyAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OlNldE1hcEZpZWxkcygmbWVzc2FnZTEpOworICAgIG1lc3NhZ2UyLkNvcHlGcm9tKG1lc3NhZ2UxKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMik7CisKKyAgICAvLyBDb3B5aW5nIGZyb20gc2VsZiBzaG91bGQgYmUgYSBuby1vcC4KKyAgICBtZXNzYWdlMi5Db3B5RnJvbShtZXNzYWdlMik7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9CisKKyAgeworICAgIC8vIENvcHlGcm9tTWVzc2FnZU1hcAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWVzc2FnZU1hcExpdGUgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgICAgKCptZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9tZXNzYWdlKCkpWzBdLmFkZF9yZXBlYXRlZF9pbnQzMigxMDApOworICAgICgqbWVzc2FnZTIubXV0YWJsZV9tYXBfaW50MzJfbWVzc2FnZSgpKVswXS5hZGRfcmVwZWF0ZWRfaW50MzIoMTAxKTsKKworICAgIG1lc3NhZ2UxLkNvcHlGcm9tKG1lc3NhZ2UyKTsKKworICAgIC8vIENoZWNrcyByZXBlYXRlZCBmaWVsZCBpcyBvdmVyd3JpdHRlbi4KKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZTEubWFwX2ludDMyX21lc3NhZ2UoKS5hdCgwKS5yZXBlYXRlZF9pbnQzMl9zaXplKCkpOworICAgIEVYUEVDVF9FUSgxMDEsIG1lc3NhZ2UxLm1hcF9pbnQzMl9tZXNzYWdlKCkuYXQoMCkucmVwZWF0ZWRfaW50MzIoMCkpOworICB9CisKKyAgeworICAgIC8vIFN3YXBXaXRoRW1wdHkKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTEsIG1lc3NhZ2UyOworCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlMSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RDbGVhcihtZXNzYWdlMik7CisKKyAgICBtZXNzYWdlMS5Td2FwKCZtZXNzYWdlMik7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0Q2xlYXIobWVzc2FnZTEpOworICB9CisKKyAgeworICAgIC8vIFN3YXBXaXRoU2VsZgorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOworCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UpOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UpOworCisgICAgbWVzc2FnZS5Td2FwKCZtZXNzYWdlKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6OkV4cGVjdE1hcEZpZWxkc1NldChtZXNzYWdlKTsKKyAgfQorCisgIHsKKyAgICAvLyBTd2FwV2l0aE90aGVyCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UyKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpNYXBMaXRlVGVzdFV0aWw6Ok1vZGlmeU1hcEZpZWxkcygmbWVzc2FnZTIpOworCisgICAgbWVzc2FnZTEuU3dhcCgmbWVzc2FnZTIpOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzTW9kaWZpZWQobWVzc2FnZTEpOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKKyAgfQorCisgIHsKKyAgICAvLyBDb3B5Q29uc3RydWN0b3IKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTE7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMihtZXNzYWdlMSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9CisKKyAgeworICAgIC8vIENvcHlBc3NpZ25tZW50T3BlcmF0b3IKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTE7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKworICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMjsKKyAgICBtZXNzYWdlMiA9IG1lc3NhZ2UxOworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6RXhwZWN0TWFwRmllbGRzU2V0KG1lc3NhZ2UyKTsKKworICAgIC8vIE1ha2Ugc3VyZSB0aGF0IHNlbGYtYXNzaWdubWVudCBkb2VzIHNvbWV0aGluZyBzYW5lLgorICAgIG1lc3NhZ2UyLm9wZXJhdG9yPShtZXNzYWdlMik7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9CisKKyAgeworICAgIC8vIE5vbkVtcHR5TWVyZ2VGcm9tCisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1hcExpdGVUZXN0VXRpbDo6U2V0TWFwRmllbGRzKCZtZXNzYWdlMSk7CisKKyAgICAvLyBUaGlzIGZpZWxkIHdpbGwgdGVzdCBtZXJnaW5nIGludG8gYW4gZW1wdHkgc3BvdC4KKyAgICAoKm1lc3NhZ2UyLm11dGFibGVfbWFwX2ludDMyX2ludDMyKCkpWzFdID0gMTsKKyAgICBtZXNzYWdlMS5tdXRhYmxlX21hcF9pbnQzMl9pbnQzMigpLT5lcmFzZSgxKTsKKworICAgIC8vIFRoaXMgdGVzdHMgb3ZlcndyaXRpbmcuCisgICAgKCptZXNzYWdlMi5tdXRhYmxlX21hcF9pbnQzMl9kb3VibGUoKSlbMV0gPSAxOworICAgICgqbWVzc2FnZTEubXV0YWJsZV9tYXBfaW50MzJfZG91YmxlKCkpWzFdID0gMjsKKworICAgIG1lc3NhZ2UxLk1lcmdlRnJvbShtZXNzYWdlMik7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTEpOworICB9CisKKyAgeworICAgIC8vIE1lcmdlRnJvbU1lc3NhZ2VNYXAKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1lc3NhZ2VNYXBMaXRlIG1lc3NhZ2UxLCBtZXNzYWdlMjsKKworICAgICgqbWVzc2FnZTEubXV0YWJsZV9tYXBfaW50MzJfbWVzc2FnZSgpKVswXS5hZGRfcmVwZWF0ZWRfaW50MzIoMTAwKTsKKyAgICAoKm1lc3NhZ2UyLm11dGFibGVfbWFwX2ludDMyX21lc3NhZ2UoKSlbMF0uYWRkX3JlcGVhdGVkX2ludDMyKDEwMSk7CisKKyAgICBtZXNzYWdlMS5NZXJnZUZyb20obWVzc2FnZTIpOworCisgICAgLy8gQ2hlY2tzIHJlcGVhdGVkIGZpZWxkIGlzIG92ZXJ3cml0dGVuLgorICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlMS5tYXBfaW50MzJfbWVzc2FnZSgpLmF0KDApLnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgICAgRVhQRUNUX0VRKDEwMSwgbWVzc2FnZTEubWFwX2ludDMyX21lc3NhZ2UoKS5hdCgwKS5yZXBlYXRlZF9pbnQzMigwKSk7CisgIH0KKworICB7CisgICAgLy8gVGVzdCB0aGUgZ2VuZXJhdGVkIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplc1RvQXJyYXkoKQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgc3RyaW5nIGRhdGE7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgOjpnb29nbGU6OnByb3RvYnVmOjp1aW50OCogc3RhcnQgPSByZWludGVycHJldF9jYXN0PCA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4Kj4oOjpnb29nbGU6OnByb3RvYnVmOjpzdHJpbmdfYXNfYXJyYXkoJmRhdGEpKTsKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnVpbnQ4KiBlbmQgPSBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKKyAgICBFWFBFQ1RfRVEoc2l6ZSwgZW5kIC0gc3RhcnQpOworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9CisKKyAgeworICAgIC8vIFRlc3QgdGhlIGdlbmVyYXRlZCBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoKQorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlMSwgbWVzc2FnZTI7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpTZXRNYXBGaWVsZHMoJm1lc3NhZ2UxKTsKKyAgICBpbnQgc2l6ZSA9IG1lc3NhZ2UxLkJ5dGVTaXplKCk7CisgICAgc3RyaW5nIGRhdGE7CisgICAgZGF0YS5yZXNpemUoc2l6ZSk7CisgICAgeworICAgICAgLy8gQWxsb3cgdGhlIG91dHB1dCBzdHJlYW0gdG8gYnVmZmVyIG9ubHkgb25lIGJ5dGUgYXQgYSB0aW1lLgorICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkFycmF5T3V0cHV0U3RyZWFtIGFycmF5X3N0cmVhbSgKKyAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OnN0cmluZ19hc19hcnJheSgmZGF0YSksIHNpemUsIDEpOworICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dF9zdHJlYW0oJmFycmF5X3N0cmVhbSk7CisgICAgICBtZXNzYWdlMS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dF9zdHJlYW0pOworICAgICAgRVhQRUNUX0ZBTFNFKG91dHB1dF9zdHJlYW0uSGFkRXJyb3IoKSk7CisgICAgICBFWFBFQ1RfRVEoc2l6ZSwgb3V0cHV0X3N0cmVhbS5CeXRlQ291bnQoKSk7CisgICAgfQorICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UyLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWFwTGl0ZVRlc3RVdGlsOjpFeHBlY3RNYXBGaWVsZHNTZXQobWVzc2FnZTIpOworICB9CisKKworICB7CisgICAgLy8gUHJvdG8yVW5rbm93bkVudW0KKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVudW1NYXBQbHVzRXh0cmFMaXRlIGZyb207CisgICAgKCpmcm9tLm11dGFibGVfa25vd25fbWFwX2ZpZWxkKCkpWzBdID0KKyAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkVfUFJPVE8yX01BUF9FTlVNX0ZPT19MSVRFOworICAgICgqZnJvbS5tdXRhYmxlX3Vua25vd25fbWFwX2ZpZWxkKCkpWzBdID0KKyAgICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OkVfUFJPVE8yX01BUF9FTlVNX0VYVFJBX0xJVEU7CisgICAgc3RyaW5nIGRhdGE7CisgICAgZnJvbS5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEVudW1NYXBMaXRlIHRvOworICAgIEVYUEVDVF9UUlVFKHRvLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKDAsIHRvLnVua25vd25fbWFwX2ZpZWxkKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRkFMU0UodG8ubXV0YWJsZV91bmtub3duX2ZpZWxkcygpLT5lbXB0eSgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgdG8ua25vd25fbWFwX2ZpZWxkKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEocHJvdG9idWZfdW5pdHRlc3Q6OlBST1RPMl9NQVBfRU5VTV9GT09fTElURSwKKyAgICAgICAgICAgICAgdG8ua25vd25fbWFwX2ZpZWxkKCkuYXQoMCkpOworCisgICAgZGF0YS5jbGVhcigpOworICAgIGZyb20uQ2xlYXIoKTsKKyAgICB0by5TZXJpYWxpemVUb1N0cmluZygmZGF0YSk7CisgICAgRVhQRUNUX1RSVUUoZnJvbS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUSgxLCBmcm9tLmtub3duX21hcF9maWVsZCgpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKHByb3RvYnVmX3VuaXR0ZXN0OjpFX1BST1RPMl9NQVBfRU5VTV9GT09fTElURSwKKyAgICAgICAgICAgICAgZnJvbS5rbm93bl9tYXBfZmllbGQoKS5hdCgwKSk7CisgICAgRVhQRUNUX0VRKDEsIGZyb20udW5rbm93bl9tYXBfZmllbGQoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUShwcm90b2J1Zl91bml0dGVzdDo6RV9QUk9UTzJfTUFQX0VOVU1fRVhUUkFfTElURSwKKyAgICAgICAgICAgICAgZnJvbS51bmtub3duX21hcF9maWVsZCgpLmF0KDApKTsKKyAgfQorCisgIHsKKyAgICAvLyBTdGFuZGFyZFdpcmVGb3JtYXQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKyAgICBzdHJpbmcgZGF0YSA9ICJceDBBXHgwNFx4MDhceDAxXHgxMFx4MDEiOworCisgICAgRVhQRUNUX1RSVUUobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLnNpemUoKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuYXQoMSkpOworICB9CisKKyAgeworICAgIC8vIFVub3JkZXJlZFdpcmVGb3JtYXQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIC8vIHB1dCB2YWx1ZSBiZWZvcmUga2V5IGluIHdpcmUgZm9ybWF0CisgICAgc3RyaW5nIGRhdGEgPSAiXHgwQVx4MDRceDEwXHgwMVx4MDhceDAyIjsKKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDIpKTsKKyAgfQorCisgIHsKKyAgICAvLyBEdXBsaWNhdGVkS2V5V2lyZUZvcm1hdAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOworCisgICAgLy8gVHdvIGtleSBmaWVsZHMgaW4gd2lyZSBmb3JtYXQKKyAgICBzdHJpbmcgZGF0YSA9ICJceDBBXHgwNlx4MDhceDAxXHgwOFx4MDJceDEwXHgwMSI7CisKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgyKSk7CisgIH0KKworICB7CisgICAgLy8gRHVwbGljYXRlZFZhbHVlV2lyZUZvcm1hdAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOworCisgICAgLy8gVHdvIHZhbHVlIGZpZWxkcyBpbiB3aXJlIGZvcm1hdAorICAgIHN0cmluZyBkYXRhID0gIlx4MEFceDA2XHgwOFx4MDFceDEwXHgwMVx4MTBceDAyIjsKKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgyLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDEpKTsKKyAgfQorCisgIHsKKyAgICAvLyBNaXNzZWRLZXlXaXJlRm9ybWF0CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICAvLyBObyBrZXkgZmllbGQgaW4gd2lyZSBmb3JtYXQKKyAgICBzdHJpbmcgZGF0YSA9ICJceDBBXHgwMlx4MTBceDAxIjsKKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDApKTsKKyAgfQorCisgIHsKKyAgICAvLyBNaXNzZWRWYWx1ZVdpcmVGb3JtYXQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdE1hcExpdGUgbWVzc2FnZTsKKworICAgIC8vIE5vIHZhbHVlIGZpZWxkIGluIHdpcmUgZm9ybWF0CisgICAgc3RyaW5nIGRhdGEgPSAiXHgwQVx4MDJceDA4XHgwMSI7CisKKyAgICBFWFBFQ1RfVFJVRShtZXNzYWdlLlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UubWFwX2ludDMyX2ludDMyKCkuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5hdCgxKSk7CisgIH0KKworICB7CisgICAgLy8gVW5rbm93bkZpZWxkV2lyZUZvcm1hdAorICAgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0TWFwTGl0ZSBtZXNzYWdlOworCisgICAgLy8gVW5rbm93biBmaWVsZCBpbiB3aXJlIGZvcm1hdAorICAgIHN0cmluZyBkYXRhID0gIlx4MEFceDA2XHgwOFx4MDJceDEwXHgwM1x4MThceDAxIjsKKworICAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKGRhdGEpKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5tYXBfaW50MzJfaW50MzIoKS5zaXplKCkpOworICAgIEVYUEVDVF9FUSgzLCBtZXNzYWdlLm1hcF9pbnQzMl9pbnQzMigpLmF0KDIpKTsKKyAgfQorCisgIHsKKyAgICAvLyBDb3JydXB0ZWRXaXJlRm9ybWF0CisgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RNYXBMaXRlIG1lc3NhZ2U7CisKKyAgICAvLyBjb3JydXB0ZWQgZGF0YSBpbiB3aXJlIGZvcm1hdAorICAgIHN0cmluZyBkYXRhID0gIlx4MEFceDA2XHgwOFx4MDJceDExXHgwMyI7CisKKyAgICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5QYXJzZUZyb21TdHJpbmcoZGF0YSkpOworICB9CisKKyAgeworICAgIC8vIElzSW5pdGlhbGl6ZWQKKyAgICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdFJlcXVpcmVkTWVzc2FnZU1hcExpdGUgbWFwX21lc3NhZ2U7CisKKyAgICAvLyBBZGQgYW4gdW5pbml0aWFsaXplZCBtZXNzYWdlLgorICAgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF07CisgICAgRVhQRUNUX0ZBTFNFKG1hcF9tZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisKKyAgICAvLyBJbml0aWFsaXplIHVuaW5pdGlhbGl6ZWQgbWVzc2FnZQorICAgICgqbWFwX21lc3NhZ2UubXV0YWJsZV9tYXBfZmllbGQoKSlbMF0uc2V0X2EoMCk7CisgICAgKCptYXBfbWVzc2FnZS5tdXRhYmxlX21hcF9maWVsZCgpKVswXS5zZXRfYigwKTsKKyAgICAoKm1hcF9tZXNzYWdlLm11dGFibGVfbWFwX2ZpZWxkKCkpWzBdLnNldF9jKDApOworICAgIEVYUEVDVF9UUlVFKG1hcF9tZXNzYWdlLklzSW5pdGlhbGl6ZWQoKSk7CisgIH0KKworICB7CisgICAgICAvLyBDaGVjayB0aGF0IGFkZGluZyBtb3JlIHZhbHVlcyB0byBlbnVtIGRvZXMgbm90IGNvcnJ1cHQgbWVzc2FnZQorICAgICAgLy8gd2hlbiBwYXNzZWQgdGhyb3VnaCBhbiBvbGQgY2xpZW50LgorICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlYyTWVzc2FnZUxpdGUgdjJfbWVzc2FnZTsKKyAgICAgIHYyX21lc3NhZ2Uuc2V0X2ludF9maWVsZCg4MDApOworICAgICAgLy8gU2V0IGVudW0gZmllbGQgdG8gdGhlIHZhbHVlIG5vdCB1bmRlcnN0b29kIGJ5IHRoZSBvbGQgY2xpZW50LgorICAgICAgdjJfbWVzc2FnZS5zZXRfZW51bV9maWVsZChwcm90b2J1Zl91bml0dGVzdDo6VjJfU0VDT05EKTsKKyAgICAgIHN0cmluZyB2Ml9ieXRlcyA9IHYyX21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlYxTWVzc2FnZUxpdGUgdjFfbWVzc2FnZTsKKyAgICAgIHYxX21lc3NhZ2UuUGFyc2VGcm9tU3RyaW5nKHYyX2J5dGVzKTsKKyAgICAgIEVYUEVDVF9UUlVFKHYxX21lc3NhZ2UuSXNJbml0aWFsaXplZCgpKTsKKyAgICAgIEVYUEVDVF9FUSh2MV9tZXNzYWdlLmludF9maWVsZCgpLCB2Ml9tZXNzYWdlLmludF9maWVsZCgpKTsKKyAgICAgIC8vIFYxIGNsaWVudCBkb2VzIG5vdCB1bmRlcnN0YW5kIFYyX1NFQ09ORCB2YWx1ZSwgc28gaXQgZGlzY2FyZHMgaXQgYW5kCisgICAgICAvLyB1c2VzIGRlZmF1bHQgdmFsdWUgaW5zdGVhZC4KKyAgICAgIEVYUEVDVF9FUSh2MV9tZXNzYWdlLmVudW1fZmllbGQoKSwgcHJvdG9idWZfdW5pdHRlc3Q6OlYxX0ZJUlNUKTsKKworICAgICAgLy8gSG93ZXZlciwgd2hlbiByZS1zZXJpYWxpemVkLCBpdCBzaG91bGQgcHJlc2VydmUgZW51bSB2YWx1ZS4KKyAgICAgIHN0cmluZyB2MV9ieXRlcyA9IHYxX21lc3NhZ2UuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICAgICAgcHJvdG9idWZfdW5pdHRlc3Q6OlYyTWVzc2FnZUxpdGUgc2FtZV92Ml9tZXNzYWdlOworICAgICAgc2FtZV92Ml9tZXNzYWdlLlBhcnNlRnJvbVN0cmluZyh2MV9ieXRlcyk7CisKKyAgICAgIEVYUEVDVF9FUSh2Ml9tZXNzYWdlLmludF9maWVsZCgpLCBzYW1lX3YyX21lc3NhZ2UuaW50X2ZpZWxkKCkpOworICAgICAgRVhQRUNUX0VRKHYyX21lc3NhZ2UuZW51bV9maWVsZCgpLCBzYW1lX3YyX21lc3NhZ2UuZW51bV9maWVsZCgpKTsKKyAgfQorCisgIHN0ZDo6Y291dCA8PCAiUEFTUyIgPDwgc3RkOjplbmRsOwogICByZXR1cm4gMDsKIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXAuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZW50cnkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZW50cnkuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5LmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5X2xpdGUuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9lbnRyeV9saXRlLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5X2xpdGUuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2VudHJ5X2xpdGUuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGQuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9pbmwuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX2lubC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfbGl0ZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZF9saXRlLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfZmllbGRfdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2ZpZWxkX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdGVzdF91dGlsLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3Rlc3RfdXRpbC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX2xpdGVfdW5pdHRlc3QucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9saXRlX3VuaXR0ZXN0LnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfcHJvdG8yX3VuaXR0ZXN0LnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF9wcm90bzJfdW5pdHRlc3QucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90ZXN0X3V0aWwuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbF9pbXBsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsX2ltcGwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdGVzdF91dGlsX2ltcGwuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3Rlc3RfdXRpbF9pbXBsLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3R5cGVfaGFuZGxlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3R5cGVfaGFuZGxlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF90eXBlX2hhbmRsZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3R5cGVfaGFuZGxlci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3QucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21hcF91bml0dGVzdC5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3RfcHJvdG8zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWFwX3VuaXR0ZXN0X3Byb3RvMy5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3RfcHJvdG8zLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tYXBfdW5pdHRlc3RfcHJvdG8zLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5jYwppbmRleCA5MWU2ODc4Li5kNjJjYTc5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDIyICszMiwyOSBAQAogLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKKyNpbmNsdWRlIDxpb3N0cmVhbT4KICNpbmNsdWRlIDxzdGFjaz4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25faW50ZXJuYWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21hcF9maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXAtdXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc2luZ2xldG9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTYyLDcgKzY5LDcgQEAKICAgR09PR0xFX0NIRUNLX0VRKGZyb20uR2V0RGVzY3JpcHRvcigpLCBkZXNjcmlwdG9yKQogICAgIDw8ICI6IFRyaWVkIHRvIG1lcmdlIGZyb20gYSBtZXNzYWdlIHdpdGggYSBkaWZmZXJlbnQgdHlwZS4gICIKICAgICAgICAidG86ICIgPDwgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgPDwgIiwgIgotICAgICAgICJmcm9tOiIgPDwgZnJvbS5HZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpOworICAgICAgICJmcm9tOiAiIDw8IGZyb20uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKICAgUmVmbGVjdGlvbk9wczo6TWVyZ2UoZnJvbSwgdGhpcyk7CiB9CiAKQEAgLTczLDkgKzgwLDkgQEAKIHZvaWQgTWVzc2FnZTo6Q29weUZyb20oY29uc3QgTWVzc2FnZSYgZnJvbSkgewogICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gR2V0RGVzY3JpcHRvcigpOwogICBHT09HTEVfQ0hFQ0tfRVEoZnJvbS5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpCi0gICAgPDwgIjogVHJpZWQgdG8gY29weSBmcm9tIGEgbWVzc2FnZSB3aXRoIGEgZGlmZmVyZW50IHR5cGUuIgorICAgIDw8ICI6IFRyaWVkIHRvIGNvcHkgZnJvbSBhIG1lc3NhZ2Ugd2l0aCBhIGRpZmZlcmVudCB0eXBlLiAiCiAgICAgICAgInRvOiAiIDw8IGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpIDw8ICIsICIKLSAgICAgICAiZnJvbToiIDw8IGZyb20uR2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKTsKKyAgICAgICAiZnJvbTogIiA8PCBmcm9tLkdldERlc2NyaXB0b3IoKS0+ZnVsbF9uYW1lKCk7CiAgIFJlZmxlY3Rpb25PcHM6OkNvcHkoZnJvbSwgdGhpcyk7CiB9CiAKQEAgLTk4LDcgKzEwNSw3IEBACiBzdHJpbmcgTWVzc2FnZTo6SW5pdGlhbGl6YXRpb25FcnJvclN0cmluZygpIGNvbnN0IHsKICAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwogICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJmVycm9ycyk7Ci0gIHJldHVybiBKb2luU3RyaW5ncyhlcnJvcnMsICIsICIpOworICByZXR1cm4gSm9pbihlcnJvcnMsICIsICIpOwogfQogCiB2b2lkIE1lc3NhZ2U6OkNoZWNrSW5pdGlhbGl6ZWQoKSBjb25zdCB7CkBAIC0xNDcsNyArMTU0LDcgQEAKICAgcmV0dXJuIHNpemU7CiB9CiAKLXZvaWQgTWVzc2FnZTo6U2V0Q2FjaGVkU2l6ZShpbnQgc2l6ZSkgY29uc3Qgewordm9pZCBNZXNzYWdlOjpTZXRDYWNoZWRTaXplKGludCAvKiBzaXplICovKSBjb25zdCB7CiAgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJNZXNzYWdlIGNsYXNzIFwiIiA8PCBHZXREZXNjcmlwdG9yKCktPmZ1bGxfbmFtZSgpCiAgICAgICAgICAgICAgPDwgIlwiIGltcGxlbWVudHMgbmVpdGhlciBTZXRDYWNoZWRTaXplKCkgbm9yIEJ5dGVTaXplKCkuICAiCiAgICAgICAgICAgICAgICAgIk11c3QgaW1wbGVtZW50IG9uZSBvciB0aGUgb3RoZXIuIjsKQEAgLTE4MSw5ICsxODgsOTQgQEAKIH0KIAogCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUmVmbGVjdGlvbiBhbmQgYXNzb2NpYXRlZCBUZW1wbGF0ZSBTcGVjaWFsaXphdGlvbnMKKwogUmVmbGVjdGlvbjo6flJlZmxlY3Rpb24oKSB7fQogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEhBTkRMRV9UWVBFKFRZUEUsIENQUFRZUEUsIENUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4mIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkRmllbGQ8VFlQRT4oICAgICAgICBcCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeyAgICAgXAorICByZXR1cm4gKnN0YXRpY19jYXN0PFJlcGVhdGVkRmllbGQ8VFlQRT4qID4oICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIGZpZWxkLCBDUFBUWVBFLCBDVFlQRSwgTlVMTCkpOyAgICAgICAgICAgICAgXAorfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit0ZW1wbGF0ZTw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorUmVwZWF0ZWRGaWVsZDxUWVBFPiogUmVmbGVjdGlvbjo6TXV0YWJsZVJlcGVhdGVkRmllbGQ8VFlQRT4oICAgICAgICAgIFwKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7ICAgICAgICAgICBcCisgIHJldHVybiBzdGF0aWNfY2FzdDxSZXBlYXRlZEZpZWxkPFRZUEU+KiA+KCAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQobWVzc2FnZSwgZmllbGQsIENQUFRZUEUsIENUWVBFLCBOVUxMKSk7IFwKK30KKworSEFORExFX1RZUEUoaW50MzIsICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UMzIsICAtMSk7CitIQU5ETEVfVFlQRShpbnQ2NCwgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQ2NCwgIC0xKTsKK0hBTkRMRV9UWVBFKHVpbnQzMiwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMiwgLTEpOworSEFORExFX1RZUEUodWludDY0LCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfVUlOVDY0LCAtMSk7CitIQU5ETEVfVFlQRShmbG9hdCwgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9GTE9BVCwgIC0xKTsKK0hBTkRMRV9UWVBFKGRvdWJsZSwgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0RPVUJMRSwgLTEpOworSEFORExFX1RZUEUoYm9vbCwgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTCwgICAtMSk7CisKKworI3VuZGVmIEhBTkRMRV9UWVBFCisKK3ZvaWQqIFJlZmxlY3Rpb246Ok11dGFibGVSYXdSZXBlYXRlZFN0cmluZygKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIGlzX3N0cmluZykgY29uc3QgeworICByZXR1cm4gTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQobWVzc2FnZSwgZmllbGQsCisgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HLCBGaWVsZE9wdGlvbnM6OlNUUklORywgTlVMTCk7Cit9CisKKworLy8gRGVmYXVsdCBFbnVtVmFsdWUgQVBJIGltcGxlbWVudGF0aW9ucy4gUmVhbCByZWZsZWN0aW9uIGltcGxlbWVudGF0aW9ucyBzaG91bGQKKy8vIG92ZXJyaWRlIHRoZXNlLiBIb3dldmVyLCB0aGVyZSBhcmUgc2V2ZXJhbCBsZWdhY3kgaW1wbGVtZW50YXRpb25zIHRoYXQgZG8KKy8vIG5vdCwgYW5kIGNhbm5vdCBlYXNpbHkgYmUgY2hhbmdlZCBhdCB0aGUgc2FtZSB0aW1lIGFzIHRoZSBSZWZsZWN0aW9uIEFQSSwgc28KKy8vIHdlIHByb3ZpZGUgdGhlc2UgZm9yIG5vdy4KKy8vIFRPRE86IFJlbW92ZSB0aGVzZSBvbmNlIGFsbCBSZWZsZWN0aW9uIGltcGxlbWVudGF0aW9ucyBhcmUgdXBkYXRlZC4KK2ludCBSZWZsZWN0aW9uOjpHZXRFbnVtVmFsdWUoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCBFbnVtVmFsdWUgQVBJLiI7CisgIHJldHVybiAwOworfQordm9pZCBSZWZsZWN0aW9uOjpTZXRFbnVtVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0IHsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlVuaW1wbGVtZW50ZWQgRW51bVZhbHVlIEFQSS4iOworfQoraW50IFJlZmxlY3Rpb246OkdldFJlcGVhdGVkRW51bVZhbHVlKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSBjb25zdCB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmltcGxlbWVudGVkIEVudW1WYWx1ZSBBUEkuIjsKKyAgcmV0dXJuIDA7Cit9Cit2b2lkIFJlZmxlY3Rpb246OlNldFJlcGVhdGVkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3QgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCBFbnVtVmFsdWUgQVBJLiI7Cit9Cit2b2lkIFJlZmxlY3Rpb246OkFkZEVudW1WYWx1ZShNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3QgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCBFbnVtVmFsdWUgQVBJLiI7Cit9CisKK01hcEl0ZXJhdG9yIFJlZmxlY3Rpb246Ok1hcEJlZ2luKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVW5pbXBsZW1lbnRlZCBNYXAgUmVmbGVjdGlvbiBBUEkuIjsKKyAgTWFwSXRlcmF0b3IgaXRlcihtZXNzYWdlLCBmaWVsZCk7CisgIHJldHVybiBpdGVyOworfQorCitNYXBJdGVyYXRvciBSZWZsZWN0aW9uOjpNYXBFbmQoCisgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIEdPT0dMRV9MT0coRkFUQUwpIDw8ICJVbmltcGxlbWVudGVkIE1hcCBSZWZsZWN0aW9uIEFQSS4iOworICBNYXBJdGVyYXRvciBpdGVyKG1lc3NhZ2UsIGZpZWxkKTsKKyAgcmV0dXJuIGl0ZXI7Cit9CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBNZXNzYWdlRmFjdG9yeQogCiBNZXNzYWdlRmFjdG9yeTo6fk1lc3NhZ2VGYWN0b3J5KCkge30KQEAgLTI1Nyw2ICszNDksNyBAQAogICB9CiB9CiAKKwogY29uc3QgTWVzc2FnZSogR2VuZXJhdGVkTWVzc2FnZUZhY3Rvcnk6OkdldFByb3RvdHlwZShjb25zdCBEZXNjcmlwdG9yKiB0eXBlKSB7CiAgIHsKICAgICBSZWFkZXJNdXRleExvY2sgbG9jaygmbXV0ZXhfKTsKQEAgLTMxNCw1ICs0MDcsMTExIEBACiB9CiAKIAorTWVzc2FnZUZhY3RvcnkqIFJlZmxlY3Rpb246OkdldE1lc3NhZ2VGYWN0b3J5KCkgY29uc3QgeworICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiTm90IGltcGxlbWVudGVkLiI7CisgIHJldHVybiBOVUxMOworfQorCit2b2lkKiBSZWZsZWN0aW9uOjpSZXBlYXRlZEZpZWxkRGF0YSgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHBfdHlwZSwKKyAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIGNvbnN0IHsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIk5vdCBpbXBsZW1lbnRlZC4iOworICByZXR1cm4gTlVMTDsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKK1JlcGVhdGVkRmllbGRBY2Nlc3Nvcjo6flJlcGVhdGVkRmllbGRBY2Nlc3NvcigpIHsKK30KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCitjb25zdCBpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZEFjY2Vzc29yKiBSZWZsZWN0aW9uOjpSZXBlYXRlZEZpZWxkQWNjZXNzb3IoCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBHT09HTEVfQ0hFQ0soZmllbGQtPmlzX3JlcGVhdGVkKCkpOworICBzd2l0Y2ggKGZpZWxkLT5jcHBfdHlwZSgpKSB7CisjZGVmaW5lIEhBTkRMRV9QUklNSVRJVkVfVFlQRShUWVBFLCB0eXBlKSBcCisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfICMjIFRZUEU6IFwKKyAgICAgIHJldHVybiBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZEZpZWxkUHJpbWl0aXZlQWNjZXNzb3I8dHlwZT4gPjo6Z2V0KCk7CisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKElOVDMyLCBpbnQzMikKKyAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoVUlOVDMyLCB1aW50MzIpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKElOVDY0LCBpbnQ2NCkKKyAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoVUlOVDY0LCB1aW50NjQpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEZMT0FULCBmbG9hdCkKKyAgICBIQU5ETEVfUFJJTUlUSVZFX1RZUEUoRE9VQkxFLCBkb3VibGUpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEJPT0wsIGJvb2wpCisgICAgSEFORExFX1BSSU1JVElWRV9UWVBFKEVOVU0sIGludDMyKQorI3VuZGVmIEhBTkRMRV9QUklNSVRJVkVfVFlQRQorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzoKKyAgICAgIHN3aXRjaCAoZmllbGQtPm9wdGlvbnMoKS5jdHlwZSgpKSB7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGNhc2UgRmllbGRPcHRpb25zOjpTVFJJTkc6CisgICAgICAgICAgcmV0dXJuIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRTdHJpbmdBY2Nlc3Nvcj46OmdldCgpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICAgICAgcmV0dXJuIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6Ok1hcEZpZWxkQWNjZXNzb3I+OjpnZXQoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZFB0ckZpZWxkTWVzc2FnZUFjY2Vzc29yPjo6Z2V0KCk7CisgICAgICB9CisgIH0KKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlNob3VsZCBub3QgcmVhY2ggaGVyZS4iOworICByZXR1cm4gTlVMTDsKK30KKworbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7Cit2b2lkIFNodXRkb3duUmVwZWF0ZWRGaWVsZEFjY2Vzc29yKCkgeworICBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZEZpZWxkUHJpbWl0aXZlQWNjZXNzb3I8aW50MzI+ID46OlNodXREb3duKCk7CisgIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkRmllbGRQcmltaXRpdmVBY2Nlc3Nvcjx1aW50MzI+ID46OlNodXREb3duKCk7CisgIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6OlJlcGVhdGVkRmllbGRQcmltaXRpdmVBY2Nlc3NvcjxpbnQ2ND4gPjo6U2h1dERvd24oKTsKKyAgaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZFByaW1pdGl2ZUFjY2Vzc29yPHVpbnQ2ND4gPjo6U2h1dERvd24oKTsKKyAgaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZFByaW1pdGl2ZUFjY2Vzc29yPGZsb2F0PiA+OjpTaHV0RG93bigpOworICBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZEZpZWxkUHJpbWl0aXZlQWNjZXNzb3I8ZG91YmxlPiA+OjpTaHV0RG93bigpOworICBpbnRlcm5hbDo6U2luZ2xldG9uPGludGVybmFsOjpSZXBlYXRlZEZpZWxkUHJpbWl0aXZlQWNjZXNzb3I8Ym9vbD4gPjo6U2h1dERvd24oKTsKKyAgaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZFN0cmluZ0FjY2Vzc29yPjo6U2h1dERvd24oKTsKKyAgaW50ZXJuYWw6OlNpbmdsZXRvbjxpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZE1lc3NhZ2VBY2Nlc3Nvcj46OlNodXREb3duKCk7CisgIGludGVybmFsOjpTaW5nbGV0b248aW50ZXJuYWw6Ok1hcEZpZWxkQWNjZXNzb3I+OjpTaHV0RG93bigpOworfQorCitzdHJ1Y3QgU2h1dGRvd25SZXBlYXRlZEZpZWxkUmVnaXN0ZXIgeworICBTaHV0ZG93blJlcGVhdGVkRmllbGRSZWdpc3RlcigpIHsKKyAgICBPblNodXRkb3duKCZTaHV0ZG93blJlcGVhdGVkRmllbGRBY2Nlc3Nvcik7CisgIH0KK30gc2h1dGRvd25fOworCit9ICAvLyBuYW1lc3BhY2UKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCituYW1lc3BhY2UgaW50ZXJuYWwgewordGVtcGxhdGU8PgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxOTAwKQorLy8gTm90ZTogZm9yY2Ugbm9pbmxpbmUgdG8gd29ya2Fyb3VuZCBNU1ZDIDIwMTUgY29tcGlsZXIgYnVnLCBpc3N1ZSAjMjQwCitHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCisjZW5kaWYKK01lc3NhZ2UqIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlPjo6TmV3RnJvbVByb3RvdHlwZSgKKyAgICBjb25zdCBNZXNzYWdlKiBwcm90b3R5cGUsIGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gcHJvdG90eXBlLT5OZXcoYXJlbmEpOworfQordGVtcGxhdGU8PgorI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIChfTVNDX1ZFUiA+PSAxOTAwKQorLy8gTm90ZTogZm9yY2Ugbm9pbmxpbmUgdG8gd29ya2Fyb3VuZCBNU1ZDIDIwMTUgY29tcGlsZXIgYnVnLCBpc3N1ZSAjMjQwCitHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCisjZW5kaWYKK2dvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT46OkdldEFyZW5hKAorICAgIE1lc3NhZ2UqIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZS0+R2V0QXJlbmEoKTsKK30KK3RlbXBsYXRlPD4KKyNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTkwMCkKKy8vIE5vdGU6IGZvcmNlIG5vaW5saW5lIHRvIHdvcmthcm91bmQgTVNWQyAyMDE1IGNvbXBpbGVyIGJ1ZywgaXNzdWUgIzI0MAorR09PR0xFX0FUVFJJQlVURV9OT0lOTElORQorI2VuZGlmCit2b2lkKiBHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZT46OkdldE1heWJlQXJlbmFQb2ludGVyKAorICAgIE1lc3NhZ2UqIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZS0+R2V0TWF5YmVBcmVuYVBvaW50ZXIoKTsKK30KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaAppbmRleCA0YmJjNjQxLi5hNGQ5Mjc3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC03OSwyOSArNzksMzAgQEAKIC8vICAgICAvLyBTYW1lIGFzIHRoZSBsYXN0IGJsb2NrLCBidXQgZG8gaXQgZHluYW1pY2FsbHkgdmlhIHRoZSBNZXNzYWdlCiAvLyAgICAgLy8gcmVmbGVjdGlvbiBpbnRlcmZhY2UuCiAvLyAgICAgTWVzc2FnZSogZm9vID0gbmV3IEZvbzsKLS8vICAgICBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gZm9vLT5HZXREZXNjcmlwdG9yKCk7CisvLyAgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IGZvby0+R2V0RGVzY3JpcHRvcigpOwogLy8KIC8vICAgICAvLyBHZXQgdGhlIGRlc2NyaXB0b3JzIGZvciB0aGUgZmllbGRzIHdlJ3JlIGludGVyZXN0ZWQgaW4gYW5kIHZlcmlmeQogLy8gICAgIC8vIHRoZWlyIHR5cGVzLgotLy8gICAgIEZpZWxkRGVzY3JpcHRvciogdGV4dF9maWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgidGV4dCIpOworLy8gICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogdGV4dF9maWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgidGV4dCIpOwogLy8gICAgIGFzc2VydCh0ZXh0X2ZpZWxkICE9IE5VTEwpOwogLy8gICAgIGFzc2VydCh0ZXh0X2ZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyk7Ci0vLyAgICAgYXNzZXJ0KHRleHRfZmllbGQtPmxhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX09QVElPTkFMKTsKLS8vICAgICBGaWVsZERlc2NyaXB0b3IqIG51bWJlcnNfZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoIm51bWJlcnMiKTsKKy8vICAgICBhc3NlcnQodGV4dF9maWVsZC0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX09QVElPTkFMKTsKKy8vICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG51bWJlcnNfZmllbGQgPSBkZXNjcmlwdG9yLT4KKy8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGaW5kRmllbGRCeU5hbWUoIm51bWJlcnMiKTsKIC8vICAgICBhc3NlcnQobnVtYmVyc19maWVsZCAhPSBOVUxMKTsKIC8vICAgICBhc3NlcnQobnVtYmVyc19maWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9JTlQzMik7Ci0vLyAgICAgYXNzZXJ0KG51bWJlcnNfZmllbGQtPmxhYmVsKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1JFUEVBVEVEKTsKKy8vICAgICBhc3NlcnQobnVtYmVyc19maWVsZC0+bGFiZWwoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkxBQkVMX1JFUEVBVEVEKTsKIC8vCiAvLyAgICAgLy8gUGFyc2UgdGhlIG1lc3NhZ2UuCiAvLyAgICAgZm9vLT5QYXJzZUZyb21TdHJpbmcoZGF0YSk7CiAvLwogLy8gICAgIC8vIFVzZSB0aGUgcmVmbGVjdGlvbiBpbnRlcmZhY2UgdG8gZXhhbWluZSB0aGUgY29udGVudHMuCiAvLyAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGZvby0+R2V0UmVmbGVjdGlvbigpOwotLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRTdHJpbmcoZm9vLCB0ZXh0X2ZpZWxkKSA9PSAiSGVsbG8gV29ybGQhIik7Ci0vLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShmb28sIG51bWJlcnNfZmllbGQpID09IDMpOwotLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKGZvbywgbnVtYmVyc19maWVsZCwgMCkgPT0gMSk7Ci0vLyAgICAgYXNzZXJ0KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50MzIoZm9vLCBudW1iZXJzX2ZpZWxkLCAxKSA9PSA1KTsKLS8vICAgICBhc3NlcnQocmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQzMihmb28sIG51bWJlcnNfZmllbGQsIDIpID09IDQyKTsKKy8vICAgICBhc3NlcnQocmVmbGVjdGlvbi0+R2V0U3RyaW5nKCpmb28sIHRleHRfZmllbGQpID09ICJIZWxsbyBXb3JsZCEiKTsKKy8vICAgICBhc3NlcnQocmVmbGVjdGlvbi0+RmllbGRTaXplKCpmb28sIG51bWJlcnNfZmllbGQpID09IDMpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKCpmb28sIG51bWJlcnNfZmllbGQsIDApID09IDEpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKCpmb28sIG51bWJlcnNfZmllbGQsIDEpID09IDUpOworLy8gICAgIGFzc2VydChyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDMyKCpmb28sIG51bWJlcnNfZmllbGQsIDIpID09IDQyKTsKIC8vCiAvLyAgICAgZGVsZXRlIGZvbzsKIC8vICAgfQpAQCAtMTA5LDIxICsxMTAsMjEgQEAKICNpZm5kZWYgR09PR0xFX1BST1RPQlVGX01FU1NBR0VfSF9fCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NRVNTQUdFX0hfXwogCi0jaW5jbHVkZSA8dmVjdG9yPgotI2luY2x1ZGUgPHN0cmluZz4KLQotI2lmZGVmIF9fREVDQ1hYCi0vLyBIUCBDKysncyBpb3Nmd2QgZG9lc24ndCB3b3JrLgotI2luY2x1ZGUgPGlvc3RyZWFtPgotI2Vsc2UKICNpbmNsdWRlIDxpb3Nmd2Q+Ci0jZW5kaWYKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8dmVjdG9yPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CiAKIAorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTX09ORU9GCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfQVJFTkFTCisKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIApAQCAtMTMzLDE3ICsxMzQsMzEgQEAKIGNsYXNzIE1lc3NhZ2VGYWN0b3J5OwogCiAvLyBEZWZpbmVkIGluIG90aGVyIGZpbGVzLgotY2xhc3MgRGVzY3JpcHRvcjsgICAgICAgICAgICAvLyBkZXNjcmlwdG9yLmgKLWNsYXNzIEZpZWxkRGVzY3JpcHRvcjsgICAgICAgLy8gZGVzY3JpcHRvci5oCi1jbGFzcyBFbnVtRGVzY3JpcHRvcjsgICAgICAgIC8vIGRlc2NyaXB0b3IuaAotY2xhc3MgRW51bVZhbHVlRGVzY3JpcHRvcjsgICAvLyBkZXNjcmlwdG9yLmgKLW5hbWVzcGFjZSBpbyB7Ci0gIGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07ICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCi0gIGNsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOyAgLy8gemVyb19jb3B5X3N0cmVhbS5oCi0gIGNsYXNzIENvZGVkSW5wdXRTdHJlYW07ICAgICAgLy8gY29kZWRfc3RyZWFtLmgKLSAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAvLyBjb2RlZF9zdHJlYW0uaAorY2xhc3MgTWFwS2V5OworY2xhc3MgTWFwVmFsdWVSZWY7CitjbGFzcyBNYXBJdGVyYXRvcjsKK2NsYXNzIE1hcFJlZmxlY3Rpb25UZXN0ZXI7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CitjbGFzcyBNYXBGaWVsZEJhc2U7CiB9Ci1jbGFzcyBVbmtub3duRmllbGRTZXQ7ICAgICAgIC8vIHVua25vd25fZmllbGRfc2V0LmgKK2NsYXNzIFVua25vd25GaWVsZFNldDsgICAgICAgICAvLyB1bmtub3duX2ZpZWxkX3NldC5oCituYW1lc3BhY2UgaW8geworY2xhc3MgWmVyb0NvcHlJbnB1dFN0cmVhbTsgICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAorY2xhc3MgWmVyb0NvcHlPdXRwdXRTdHJlYW07ICAgIC8vIHplcm9fY29weV9zdHJlYW0uaAorY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCitjbGFzcyBDb2RlZE91dHB1dFN0cmVhbTsgICAgICAgLy8gY29kZWRfc3RyZWFtLmgKK30KK25hbWVzcGFjZSBweXRob24geworY2xhc3MgTWFwUmVmbGVjdGlvbkZyaWVuZDsgICAgIC8vIHNjYWxhcl9tYXBfY29udGFpbmVyLmgKK30KKworCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgUmVwZWF0ZWRGaWVsZDsgICAgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKKwordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2NsYXNzIFJlcGVhdGVkUHRyRmllbGQ7ICAvLyByZXBlYXRlZF9maWVsZC5oCiAKIC8vIEEgY29udGFpbmVyIHRvIGhvbGQgbWVzc2FnZSBtZXRhZGF0YS4KIHN0cnVjdCBNZXRhZGF0YSB7CkBAIC0xNTEsMTIgKzE2Niw2IEBACiAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb247CiB9OwogCi0vLyBSZXR1cm5zIHRoZSBFbnVtRGVzY3JpcHRvciBmb3IgZW51bSB0eXBlIEUsIHdoaWNoIG11c3QgYmUgYQotLy8gcHJvdG8tZGVjbGFyZWQgZW51bSB0eXBlLiAgQ29kZSBnZW5lcmF0ZWQgYnkgdGhlIHByb3RvY29sIGNvbXBpbGVyCi0vLyB3aWxsIGluY2x1ZGUgc3BlY2lhbGl6YXRpb25zIG9mIHRoaXMgdGVtcGxhdGUgZm9yIGVhY2ggZW51bSB0eXBlIGRlY2xhcmVkLgotdGVtcGxhdGUgPHR5cGVuYW1lIEU+Ci1jb25zdCBFbnVtRGVzY3JpcHRvciogR2V0RW51bURlc2NyaXB0b3IoKTsKLQogLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBwcm90b2NvbCBtZXNzYWdlcy4KIC8vCiAvLyBTZWUgYWxzbyBNZXNzYWdlTGl0ZSwgd2hpY2ggY29udGFpbnMgbW9zdCBldmVyeS1kYXkgb3BlcmF0aW9ucy4gIE1lc3NhZ2UKQEAgLTE3OSwxNSArMTg4LDI3IEBACiAgIC8vIGZvciByZXR1cm4tdHlwZSBjb3ZhcmlhbmNlLikKICAgdmlydHVhbCBNZXNzYWdlKiBOZXcoKSBjb25zdCA9IDA7CiAKKyAgLy8gQ29uc3RydWN0IGEgbmV3IGluc3RhbmNlIG9uIHRoZSBhcmVuYS4gT3duZXJzaGlwIGlzIHBhc3NlZCB0byB0aGUgY2FsbGVyCisgIC8vIGlmIGFyZW5hIGlzIGEgTlVMTC4gRGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBhbGxvd3MgZm9yIEFQSSBjb21wYXRpYmlsaXR5CisgIC8vIGR1cmluZyB0aGUgQXJlbmEgdHJhbnNpdGlvbi4KKyAgdmlydHVhbCBNZXNzYWdlKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0IHsKKyAgICBNZXNzYWdlKiBtZXNzYWdlID0gTmV3KCk7CisgICAgaWYgKGFyZW5hICE9IE5VTEwpIHsKKyAgICAgIGFyZW5hLT5Pd24obWVzc2FnZSk7CisgICAgfQorICAgIHJldHVybiBtZXNzYWdlOworICB9CisKICAgLy8gTWFrZSB0aGlzIG1lc3NhZ2UgaW50byBhIGNvcHkgb2YgdGhlIGdpdmVuIG1lc3NhZ2UuICBUaGUgZ2l2ZW4gbWVzc2FnZQogICAvLyBtdXN0IGhhdmUgdGhlIHNhbWUgZGVzY3JpcHRvciwgYnV0IG5lZWQgbm90IG5lY2Vzc2FyaWx5IGJlIHRoZSBzYW1lIGNsYXNzLgogICAvLyBCeSBkZWZhdWx0IHRoaXMgaXMganVzdCBpbXBsZW1lbnRlZCBhcyAiQ2xlYXIoKTsgTWVyZ2VGcm9tKGZyb20pOyIuCiAgIHZpcnR1YWwgdm9pZCBDb3B5RnJvbShjb25zdCBNZXNzYWdlJiBmcm9tKTsKIAogICAvLyBNZXJnZSB0aGUgZmllbGRzIGZyb20gdGhlIGdpdmVuIG1lc3NhZ2UgaW50byB0aGlzIG1lc3NhZ2UuICBTaW5ndWxhcgotICAvLyBmaWVsZHMgd2lsbCBiZSBvdmVyd3JpdHRlbiwgZXhjZXB0IGZvciBlbWJlZGRlZCBtZXNzYWdlcyB3aGljaCB3aWxsCi0gIC8vIGJlIG1lcmdlZC4gIFJlcGVhdGVkIGZpZWxkcyB3aWxsIGJlIGNvbmNhdGVuYXRlZC4gIFRoZSBnaXZlbiBtZXNzYWdlCi0gIC8vIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG1lc3NhZ2UgKGkuZS4gdGhlIGV4YWN0IHNhbWUgY2xhc3MpLgorICAvLyBmaWVsZHMgd2lsbCBiZSBvdmVyd3JpdHRlbiwgaWYgc3BlY2lmaWVkIGluIGZyb20sIGV4Y2VwdCBmb3IgZW1iZWRkZWQKKyAgLy8gbWVzc2FnZXMgd2hpY2ggd2lsbCBiZSBtZXJnZWQuICBSZXBlYXRlZCBmaWVsZHMgd2lsbCBiZSBjb25jYXRlbmF0ZWQuCisgIC8vIFRoZSBnaXZlbiBtZXNzYWdlIG11c3QgYmUgb2YgdGhlIHNhbWUgdHlwZSBhcyB0aGlzIG1lc3NhZ2UgKGkuZS4gdGhlCisgIC8vIGV4YWN0IHNhbWUgY2xhc3MpLgogICB2aXJ0dWFsIHZvaWQgTWVyZ2VGcm9tKGNvbnN0IE1lc3NhZ2UmIGZyb20pOwogCiAgIC8vIFZlcmlmaWVzIHRoYXQgSXNJbml0aWFsaXplZCgpIHJldHVybnMgdHJ1ZS4gIEdPT0dMRV9DSEVDSy1mYWlscyBvdGhlcndpc2UsIHdpdGgKQEAgLTE5OCw3ICsyMTksNyBAQAogICAvLyBUaGlzIGlzIG11Y2gsIG11Y2ggc2xvd2VyIHRoYW4gSXNJbml0aWFsaXplZCgpIGFzIGl0IGlzIGltcGxlbWVudGVkCiAgIC8vIHB1cmVseSB2aWEgcmVmbGVjdGlvbi4gIEdlbmVyYWxseSwgeW91IHNob3VsZCBub3QgY2FsbCB0aGlzIHVubGVzcyB5b3UKICAgLy8gaGF2ZSBhbHJlYWR5IGRldGVybWluZWQgdGhhdCBhbiBlcnJvciBleGlzdHMgYnkgY2FsbGluZyBJc0luaXRpYWxpemVkKCkuCi0gIHZvaWQgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKHZlY3RvcjxzdHJpbmc+KiBlcnJvcnMpIGNvbnN0OworICB2b2lkIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycyhzdGQ6OnZlY3RvcjxzdHJpbmc+KiBlcnJvcnMpIGNvbnN0OwogCiAgIC8vIExpa2UgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzLCBidXQgam9pbnMgYWxsIHRoZSBzdHJpbmdzLCBkZWxpbWl0ZWQgYnkKICAgLy8gY29tbWFzLCBhbmQgcmV0dXJucyB0aGVtLgpAQCAtMjE5LDYgKzI0MCwxMSBAQAogICAvLyBDb21wdXRlcyAoYW4gZXN0aW1hdGUgb2YpIHRoZSB0b3RhbCBudW1iZXIgb2YgYnl0ZXMgY3VycmVudGx5IHVzZWQgZm9yCiAgIC8vIHN0b3JpbmcgdGhlIG1lc3NhZ2UgaW4gbWVtb3J5LiAgVGhlIGRlZmF1bHQgaW1wbGVtZW50YXRpb24gY2FsbHMgdGhlCiAgIC8vIFJlZmxlY3Rpb24gb2JqZWN0J3MgU3BhY2VVc2VkKCkgbWV0aG9kLgorICAvLworICAvLyBTcGFjZVVzZWQoKSBpcyBub3RpY2VhYmx5IHNsb3dlciB0aGFuIEJ5dGVTaXplKCksIGFzIGl0IGlzIGltcGxlbWVudGVkCisgIC8vIHVzaW5nIHJlZmxlY3Rpb24gKHJhdGhlciB0aGFuIHRoZSBnZW5lcmF0ZWQgY29kZSBpbXBsZW1lbnRhdGlvbiBmb3IKKyAgLy8gQnl0ZVNpemUoKSkuIExpa2UgQnl0ZVNpemUoKSwgaXRzIENQVSB0aW1lIGlzIGxpbmVhciBpbiB0aGUgbnVtYmVyIG9mCisgIC8vIGZpZWxkcyBkZWZpbmVkIGZvciB0aGUgcHJvdG8uCiAgIHZpcnR1YWwgaW50IFNwYWNlVXNlZCgpIGNvbnN0OwogCiAgIC8vIERlYnVnZ2luZyAmIFRlc3RpbmctLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0zMTcsNiArMzQzLDIwIEBACiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhNZXNzYWdlKTsKIH07CiAKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBGb3J3YXJkLWRlY2xhcmUgaW50ZXJmYWNlcyB1c2VkIHRvIGltcGxlbWVudCBSZXBlYXRlZEZpZWxkUmVmLgorLy8gVGhlc2UgYXJlIHByb3RvYnVmIGludGVybmFscyB0aGF0IHVzZXJzIHNob3VsZG4ndCBjYXJlIGFib3V0LgorY2xhc3MgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yOworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKKy8vIEZvcndhcmQtZGVjbGFyZSBSZXBlYXRlZEZpZWxkUmVmIHRlbXBsYXRlcy4gVGhlIHNlY29uZCB0eXBlIHBhcmFtZXRlciBpcworLy8gdXNlZCBmb3IgU0ZJTkFFIHRyaWNrcy4gVXNlcnMgc2hvdWxkIGlnbm9yZSBpdC4KK3RlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZSA9IHZvaWQ+CitjbGFzcyBSZXBlYXRlZEZpZWxkUmVmOworCit0ZW1wbGF0ZTx0eXBlbmFtZSBULCB0eXBlbmFtZSBFbmFibGUgPSB2b2lkPgorY2xhc3MgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY7CisKIC8vIFRoaXMgaW50ZXJmYWNlIGNvbnRhaW5zIG1ldGhvZHMgdGhhdCBjYW4gYmUgdXNlZCB0byBkeW5hbWljYWxseSBhY2Nlc3MKIC8vIGFuZCBtb2RpZnkgdGhlIGZpZWxkcyBvZiBhIHByb3RvY29sIG1lc3NhZ2UuICBUaGVpciBzZW1hbnRpY3MgYXJlCiAvLyBzaW1pbGFyIHRvIHRoZSBhY2Nlc3NvcnMgdGhlIHByb3RvY29sIGNvbXBpbGVyIGdlbmVyYXRlcy4KQEAgLTM2MCwxOCArNDAwLDIwIEBACiAvLyAgIHdyaXRlIGZpZWxkcyBmcm9tIGEgUmVmbGVjdGlvbiB3aXRob3V0IHBheWluZyBhdHRlbnRpb24gdG8gdGhlIHR5cGUuCiBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgUmVmbGVjdGlvbiB7CiAgcHVibGljOgotICAvLyBUT0RPKGtlbnRvbik6ICBSZW1vdmUgcGFyYW1ldGVyLgogICBpbmxpbmUgUmVmbGVjdGlvbigpIHt9CiAgIHZpcnR1YWwgflJlZmxlY3Rpb24oKTsKIAogICAvLyBHZXQgdGhlIFVua25vd25GaWVsZFNldCBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzIGNvbnRhaW5zIGZpZWxkcyB3aGljaAogICAvLyB3ZXJlIHNlZW4gd2hlbiB0aGUgTWVzc2FnZSB3YXMgcGFyc2VkIGJ1dCB3ZXJlIG5vdCByZWNvZ25pemVkIGFjY29yZGluZwotICAvLyB0byB0aGUgTWVzc2FnZSdzIGRlZmluaXRpb24uCisgIC8vIHRvIHRoZSBNZXNzYWdlJ3MgZGVmaW5pdGlvbi4gRm9yIHByb3RvMyBwcm90b3MsIHRoaXMgbWV0aG9kIHdpbGwgYWx3YXlzCisgIC8vIHJldHVybiBhbiBlbXB0eSBVbmtub3duRmllbGRTZXQuCiAgIHZpcnR1YWwgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBHZXRVbmtub3duRmllbGRzKAogICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSkgY29uc3QgPSAwOwogICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gdGhlIFVua25vd25GaWVsZFNldCBmb3IgdGhlIG1lc3NhZ2UuICBUaGlzCiAgIC8vIGNvbnRhaW5zIGZpZWxkcyB3aGljaCB3ZXJlIHNlZW4gd2hlbiB0aGUgTWVzc2FnZSB3YXMgcGFyc2VkIGJ1dCB3ZXJlIG5vdAotICAvLyByZWNvZ25pemVkIGFjY29yZGluZyB0byB0aGUgTWVzc2FnZSdzIGRlZmluaXRpb24uCisgIC8vIHJlY29nbml6ZWQgYWNjb3JkaW5nIHRvIHRoZSBNZXNzYWdlJ3MgZGVmaW5pdGlvbi4gRm9yIHByb3RvMyBwcm90b3MsIHRoaXMKKyAgLy8gbWV0aG9kIHdpbGwgcmV0dXJuIGEgdmFsaWQgbXV0YWJsZSBVbmtub3duRmllbGRTZXQgcG9pbnRlciBidXQgbW9kaWZ5aW5nCisgIC8vIGl0IHdvbid0IGFmZmVjdCB0aGUgc2VyaWFsaXplZCBieXRlcyBvZiB0aGUgbWVzc2FnZS4KICAgdmlydHVhbCBVbmtub3duRmllbGRTZXQqIE11dGFibGVVbmtub3duRmllbGRzKE1lc3NhZ2UqIG1lc3NhZ2UpIGNvbnN0ID0gMDsKIAogICAvLyBFc3RpbWF0ZSB0aGUgYW1vdW50IG9mIG1lbW9yeSB1c2VkIGJ5IHRoZSBtZXNzYWdlIG9iamVjdC4KQEAgLTM5MCw3ICs0MzIsMjcgQEAKICAgdmlydHVhbCB2b2lkIENsZWFyRmllbGQoTWVzc2FnZSogbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOwogCi0gIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IG9mIGEgcmVwZWF0ZWQgZmllbGQuCisgIC8vIENoZWNrIGlmIHRoZSBvbmVvZiBpcyBzZXQuIFJldHVybnMgdHJ1ZSBpZiBhbnkgZmllbGQgaW4gb25lb2YKKyAgLy8gaXMgc2V0LCBmYWxzZSBvdGhlcndpc2UuCisgIC8vIFRPRE8oamllbHVvKSAtIG1ha2UgaXQgcHVyZSB2aXJ0dWFsIGFmdGVyIHVwZGF0aW5nIGFsbAorICAvLyB0aGUgc3ViY2xhc3Nlcy4KKyAgdmlydHVhbCBib29sIEhhc09uZW9mKGNvbnN0IE1lc3NhZ2UmIC8qbWVzc2FnZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT25lb2ZEZXNjcmlwdG9yKiAvKm9uZW9mX2Rlc2NyaXB0b3IqLykgY29uc3QgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIHZpcnR1YWwgdm9pZCBDbGVhck9uZW9mKE1lc3NhZ2UqIC8qbWVzc2FnZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBPbmVvZkRlc2NyaXB0b3IqIC8qb25lb2ZfZGVzY3JpcHRvciovKSBjb25zdCB7fQorCisgIC8vIFJldHVybnMgdGhlIGZpZWxkIGRlc2NyaXB0b3IgaWYgdGhlIG9uZW9mIGlzIHNldC4gTlVMTCBvdGhlcndpc2UuCisgIC8vIFRPRE8oamllbHVvKSAtIG1ha2UgaXQgcHVyZSB2aXJ0dWFsLgorICB2aXJ0dWFsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogR2V0T25lb2ZGaWVsZERlc2NyaXB0b3IoCisgICAgICBjb25zdCBNZXNzYWdlJiAvKm1lc3NhZ2UqLywKKyAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogLypvbmVvZl9kZXNjcmlwdG9yKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIC8vIFJlbW92ZXMgdGhlIGxhc3QgZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkLgogICAvLyBXZSBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHJlbW92ZSBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBsYXN0CiAgIC8vIGJlY2F1c2UgaXQgaW52aXRlcyBpbmVmZmljaWVudCB1c2UsIHN1Y2ggYXMgTyhuXjIpIGZpbHRlcmluZyBsb29wcwogICAvLyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gTyhuKS4gIElmIHlvdSB3YW50IHRvIHJlbW92ZSBhbiBlbGVtZW50IG90aGVyCkBAIC0zOTksMjMgKzQ2MSwzNCBAQAogICAvLyBjYWxsIFJlbW92ZUxhc3QoKS4KICAgdmlydHVhbCB2b2lkIFJlbW92ZUxhc3QoTWVzc2FnZSogbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOworICAvLyBSZW1vdmVzIHRoZSBsYXN0IGVsZW1lbnQgb2YgYSByZXBlYXRlZCBtZXNzYWdlIGZpZWxkLCBhbmQgcmV0dXJucyB0aGUKKyAgLy8gcG9pbnRlciB0byB0aGUgY2FsbGVyLiAgQ2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcmV0dXJuZWQgcG9pbnRlci4KKyAgdmlydHVhbCBNZXNzYWdlKiBSZWxlYXNlTGFzdChNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKIAogICAvLyBTd2FwIHRoZSBjb21wbGV0ZSBjb250ZW50cyBvZiB0d28gbWVzc2FnZXMuCiAgIHZpcnR1YWwgdm9pZCBTd2FwKE1lc3NhZ2UqIG1lc3NhZ2UxLCBNZXNzYWdlKiBtZXNzYWdlMikgY29uc3QgPSAwOwogCisgIC8vIFN3YXAgZmllbGRzIGxpc3RlZCBpbiBmaWVsZHMgdmVjdG9yIG9mIHR3byBtZXNzYWdlcy4KKyAgdmlydHVhbCB2b2lkIFN3YXBGaWVsZHMoTWVzc2FnZSogbWVzc2FnZTEsCisgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UyLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdGQ6OnZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiYgZmllbGRzKQorICAgICAgY29uc3QgPSAwOworCiAgIC8vIFN3YXAgdHdvIGVsZW1lbnRzIG9mIGEgcmVwZWF0ZWQgZmllbGQuCiAgIHZpcnR1YWwgdm9pZCBTd2FwRWxlbWVudHMoTWVzc2FnZSogbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MSwKLSAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MikgY29uc3QgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4MSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgyKSBjb25zdCA9IDA7CiAKICAgLy8gTGlzdCBhbGwgZmllbGRzIG9mIHRoZSBtZXNzYWdlIHdoaWNoIGFyZSBjdXJyZW50bHkgc2V0LiAgVGhpcyBpbmNsdWRlcwogICAvLyBleHRlbnNpb25zLiAgU2luZ3VsYXIgZmllbGRzIHdpbGwgb25seSBiZSBsaXN0ZWQgaWYgSGFzRmllbGQoZmllbGQpIHdvdWxkCiAgIC8vIHJldHVybiB0cnVlIGFuZCByZXBlYXRlZCBmaWVsZHMgd2lsbCBvbmx5IGJlIGxpc3RlZCBpZiBGaWVsZFNpemUoZmllbGQpCiAgIC8vIHdvdWxkIHJldHVybiBub24temVyby4gIEZpZWxkcyAoYm90aCBub3JtYWwgZmllbGRzIGFuZCBleHRlbnNpb24gZmllbGRzKQogICAvLyB3aWxsIGJlIGxpc3RlZCBvcmRlcmVkIGJ5IGZpZWxkIG51bWJlci4KLSAgdmlydHVhbCB2b2lkIExpc3RGaWVsZHMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+KiBvdXRwdXQpIGNvbnN0ID0gMDsKKyAgdmlydHVhbCB2b2lkIExpc3RGaWVsZHMoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgc3RkOjp2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4qIG91dHB1dCkgY29uc3QgPSAwOwogCiAgIC8vIFNpbmd1bGFyIGZpZWxkIGdldHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIFRoZXNlIGdldCB0aGUgdmFsdWUgb2YgYSBub24tcmVwZWF0ZWQgZmllbGQuICBUaGV5IHJldHVybiB0aGUgZGVmYXVsdApAQCAtNDM5LDYgKzUxMiwxNSBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgPSAwOwogICB2aXJ0dWFsIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIEdldEVudW0oCiAgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCA9IDA7CisKKyAgLy8gR2V0RW51bVZhbHVlKCkgcmV0dXJucyBhbiBlbnVtIGZpZWxkJ3MgdmFsdWUgYXMgYW4gaW50ZWdlciByYXRoZXIgdGhhbgorICAvLyBhbiBFbnVtVmFsdWVEZXNjcmlwdG9yKi4gSWYgdGhlIGludGVnZXIgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhCisgIC8vIGtub3duIHZhbHVlIGRlc2NyaXB0b3IsIGEgbmV3IHZhbHVlIGRlc2NyaXB0b3IgaXMgY3JlYXRlZC4gKFN1Y2ggYSB2YWx1ZQorICAvLyB3aWxsIG9ubHkgYmUgcHJlc2VudCB3aGVuIHRoZSBuZXcgdW5rbm93bi1lbnVtLXZhbHVlIHNlbWFudGljcyBhcmUgZW5hYmxlZAorICAvLyBmb3IgYSBtZXNzYWdlLikKKyAgdmlydHVhbCBpbnQgR2V0RW51bVZhbHVlKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKICAgLy8gU2VlIE11dGFibGVNZXNzYWdlKCkgZm9yIHRoZSBtZWFuaW5nIG9mIHRoZSAiZmFjdG9yeSIgcGFyYW1ldGVyLgogICB2aXJ0dWFsIGNvbnN0IE1lc3NhZ2UmIEdldE1lc3NhZ2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCkBAIC00NTgsNyArNTQwLDcgQEAKICAgLy8gICByZWdhcmRsZXNzIG9mIHRoZSBmaWVsZCdzIHVuZGVybHlpbmcgcmVwcmVzZW50YXRpb24uICBXaGVuIGluaXRpYWxpemluZwogICAvLyAgIGEgbmV3bHktY29uc3RydWN0ZWQgc3RyaW5nLCB0aG91Z2gsIGl0J3MganVzdCBhcyBmYXN0IGFuZCBtb3JlIHJlYWRhYmxlCiAgIC8vICAgdG8gdXNlIGNvZGUgbGlrZToKLSAgLy8gICAgIHN0cmluZyBzdHIgPSByZWZsZWN0aW9uLT5HZXRTdHJpbmcoZmllbGQpOworICAvLyAgICAgc3RyaW5nIHN0ciA9IHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBmaWVsZCk7CiAgIHZpcnR1YWwgY29uc3Qgc3RyaW5nJiBHZXRTdHJpbmdSZWZlcmVuY2UoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogc2NyYXRjaCkgY29uc3QgPSAwOwpAQCAtNDg3LDYgKzU2OSwxNCBAQAogICB2aXJ0dWFsIHZvaWQgU2V0RW51bSAgKE1lc3NhZ2UqIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgPSAwOworICAvLyBTZXQgYW4gZW51bSBmaWVsZCdzIHZhbHVlIHdpdGggYW4gaW50ZWdlciByYXRoZXIgdGhhbiBFbnVtVmFsdWVEZXNjcmlwdG9yLgorICAvLyBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGtub3duIGVudW0gdmFsdWUsIGVpdGhlciBiZWhhdmlvciBpcworICAvLyB1bmRlZmluZWQgKGZvciBwcm90bzIgbWVzc2FnZXMpLCBvciB0aGUgdmFsdWUgaXMgYWNjZXB0ZWQgc2lsZW50bHkgZm9yCisgIC8vIG1lc3NhZ2VzIHdpdGggbmV3IHVua25vd24tZW51bS12YWx1ZSBzZW1hbnRpY3MuCisgIHZpcnR1YWwgdm9pZCBTZXRFbnVtVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CisKICAgLy8gR2V0IGEgbXV0YWJsZSBwb2ludGVyIHRvIGEgZmllbGQgd2l0aCBhIG1lc3NhZ2UgdHlwZS4gIElmIGEgTWVzc2FnZUZhY3RvcnkKICAgLy8gaXMgcHJvdmlkZWQsIGl0IHdpbGwgYmUgdXNlZCB0byBjb25zdHJ1Y3QgaW5zdGFuY2VzIG9mIHRoZSBzdWItbWVzc2FnZTsKICAgLy8gb3RoZXJ3aXNlLCB0aGUgZGVmYXVsdCBmYWN0b3J5IGlzIHVzZWQuICBJZiB0aGUgZmllbGQgaXMgYW4gZXh0ZW5zaW9uIHRoYXQKQEAgLTUwMCw2ICs1OTAsMjMgQEAKICAgdmlydHVhbCBNZXNzYWdlKiBNdXRhYmxlTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdCA9IDA7CisgIC8vIFJlcGxhY2VzIHRoZSBtZXNzYWdlIHNwZWNpZmllZCBieSAnZmllbGQnIHdpdGggdGhlIGFscmVhZHktYWxsb2NhdGVkIG9iamVjdAorICAvLyBzdWJfbWVzc2FnZSwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlIG1lc3NhZ2UuICBJZiB0aGUgZmllbGQgY29udGFpbmVkIGEKKyAgLy8gbWVzc2FnZSwgdGhhdCBtZXNzYWdlIGlzIGRlbGV0ZWQuICBJZiBzdWJfbWVzc2FnZSBpcyBOVUxMLCB0aGUgZmllbGQgaXMKKyAgLy8gY2xlYXJlZC4KKyAgdmlydHVhbCB2b2lkIFNldEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0ID0gMDsKKyAgLy8gUmVsZWFzZXMgdGhlIG1lc3NhZ2Ugc3BlY2lmaWVkIGJ5ICdmaWVsZCcgYW5kIHJldHVybnMgdGhlIHBvaW50ZXIsCisgIC8vIFJlbGVhc2VNZXNzYWdlKCkgd2lsbCByZXR1cm4gdGhlIG1lc3NhZ2UgdGhlIG1lc3NhZ2Ugb2JqZWN0IGlmIGl0IGV4aXN0cy4KKyAgLy8gT3RoZXJ3aXNlLCBpdCBtYXkgb3IgbWF5IG5vdCByZXR1cm4gTlVMTC4gIEluIGFueSBjYXNlLCBpZiB0aGUgcmV0dXJuIHZhbHVlCisgIC8vIGlzIG5vbi1OVUxMLCB0aGUgY2FsbGVyIHRha2VzIG93bmVyc2hpcCBvZiB0aGUgcG9pbnRlci4KKyAgLy8gSWYgdGhlIGZpZWxkIGV4aXN0ZWQgKEhhc0ZpZWxkKCkgaXMgdHJ1ZSksIHRoZW4gdGhlIHJldHVybmVkIHBvaW50ZXIgd2lsbAorICAvLyBiZSB0aGUgc2FtZSBhcyB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBNdXRhYmxlTWVzc2FnZSgpLgorICAvLyBUaGlzIGZ1bmN0aW9uIGhhcyB0aGUgc2FtZSBlZmZlY3QgYXMgQ2xlYXJGaWVsZCgpLgorICB2aXJ0dWFsIE1lc3NhZ2UqIFJlbGVhc2VNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlRmFjdG9yeSogZmFjdG9yeSA9IE5VTEwpIGNvbnN0ID0gMDsKIAogCiAgIC8vIFJlcGVhdGVkIGZpZWxkIGdldHRlcnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01MzIsNiArNjM5LDE0IEBACiAgIHZpcnR1YWwgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogR2V0UmVwZWF0ZWRFbnVtKAogICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOworICAvLyBHZXRSZXBlYXRlZEVudW1WYWx1ZSgpIHJldHVybnMgYW4gZW51bSBmaWVsZCdzIHZhbHVlIGFzIGFuIGludGVnZXIgcmF0aGVyCisgIC8vIHRoYW4gYW4gRW51bVZhbHVlRGVzY3JpcHRvciouIElmIHRoZSBpbnRlZ2VyIHZhbHVlIGRvZXMgbm90IGNvcnJlc3BvbmQgdG8gYQorICAvLyBrbm93biB2YWx1ZSBkZXNjcmlwdG9yLCBhIG5ldyB2YWx1ZSBkZXNjcmlwdG9yIGlzIGNyZWF0ZWQuIChTdWNoIGEgdmFsdWUKKyAgLy8gd2lsbCBvbmx5IGJlIHByZXNlbnQgd2hlbiB0aGUgbmV3IHVua25vd24tZW51bS12YWx1ZSBzZW1hbnRpY3MgYXJlIGVuYWJsZWQKKyAgLy8gZm9yIGEgbWVzc2FnZS4pCisgIHZpcnR1YWwgaW50IEdldFJlcGVhdGVkRW51bVZhbHVlKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3Q7CiAgIHZpcnR1YWwgY29uc3QgTWVzc2FnZSYgR2V0UmVwZWF0ZWRNZXNzYWdlKAogICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgPSAwOwpAQCAtNTcyLDYgKzY4NywxMyBAQAogICB2aXJ0dWFsIHZvaWQgU2V0UmVwZWF0ZWRFbnVtKE1lc3NhZ2UqIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIHZhbHVlKSBjb25zdCA9IDA7CisgIC8vIFNldCBhbiBlbnVtIGZpZWxkJ3MgdmFsdWUgd2l0aCBhbiBpbnRlZ2VyIHJhdGhlciB0aGFuIEVudW1WYWx1ZURlc2NyaXB0b3IuCisgIC8vIElmIHRoZSB2YWx1ZSBkb2VzIG5vdCBjb3JyZXNwb25kIHRvIGEga25vd24gZW51bSB2YWx1ZSwgZWl0aGVyIGJlaGF2aW9yIGlzCisgIC8vIHVuZGVmaW5lZCAoZm9yIHByb3RvMiBtZXNzYWdlcyksIG9yIHRoZSB2YWx1ZSBpcyBhY2NlcHRlZCBzaWxlbnRseSBmb3IKKyAgLy8gbWVzc2FnZXMgd2l0aCBuZXcgdW5rbm93bi1lbnVtLXZhbHVlIHNlbWFudGljcy4KKyAgdmlydHVhbCB2b2lkIFNldFJlcGVhdGVkRW51bVZhbHVlKE1lc3NhZ2UqIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgdmFsdWUpIGNvbnN0OwogICAvLyBHZXQgYSBtdXRhYmxlIHBvaW50ZXIgdG8gYW4gZWxlbWVudCBvZiBhIHJlcGVhdGVkIGZpZWxkIHdpdGggYSBtZXNzYWdlCiAgIC8vIHR5cGUuCiAgIHZpcnR1YWwgTWVzc2FnZSogTXV0YWJsZVJlcGVhdGVkTWVzc2FnZSgKQEAgLTYwMSwxMyArNzIzLDEwNiBAQAogICB2aXJ0dWFsIHZvaWQgQWRkRW51bSAgKE1lc3NhZ2UqIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiB2YWx1ZSkgY29uc3QgPSAwOworICAvLyBTZXQgYW4gZW51bSBmaWVsZCdzIHZhbHVlIHdpdGggYW4gaW50ZWdlciByYXRoZXIgdGhhbiBFbnVtVmFsdWVEZXNjcmlwdG9yLgorICAvLyBJZiB0aGUgdmFsdWUgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIGtub3duIGVudW0gdmFsdWUsIGVpdGhlciBiZWhhdmlvciBpcworICAvLyB1bmRlZmluZWQgKGZvciBwcm90bzIgbWVzc2FnZXMpLCBvciB0aGUgdmFsdWUgaXMgYWNjZXB0ZWQgc2lsZW50bHkgZm9yCisgIC8vIG1lc3NhZ2VzIHdpdGggbmV3IHVua25vd24tZW51bS12YWx1ZSBzZW1hbnRpY3MuCisgIHZpcnR1YWwgdm9pZCBBZGRFbnVtVmFsdWUoTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCB2YWx1ZSkgY29uc3Q7CiAgIC8vIFNlZSBNdXRhYmxlTWVzc2FnZSgpIGZvciBjb21tZW50cyBvbiB0aGUgImZhY3RvcnkiIHBhcmFtZXRlci4KICAgdmlydHVhbCBNZXNzYWdlKiBBZGRNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUZhY3RvcnkqIGZhY3RvcnkgPSBOVUxMKSBjb25zdCA9IDA7CiAKKyAgLy8gQXBwZW5kcyBhbiBhbHJlYWR5LWFsbG9jYXRlZCBvYmplY3QgJ25ld19lbnRyeScgdG8gdGhlIHJlcGVhdGVkIGZpZWxkCisgIC8vIHNwZWNpZnllZCBieSAnZmllbGQnIHBhc3Npbmcgb3duZXJzaGlwIHRvIHRoZSBtZXNzYWdlLgorICAvLyBUT0RPKHRtYXJlayk6IE1ha2UgdmlydHVhbCBhZnRlciBhbGwgc3ViY2xhc3NlcyBoYXZlIGJlZW4KKyAgLy8gdXBkYXRlZC4KKyAgdmlydHVhbCB2b2lkIEFkZEFsbG9jYXRlZE1lc3NhZ2UoTWVzc2FnZSogLyogbWVzc2FnZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAvKmZpZWxkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiAvKiBuZXdfZW50cnkgKi8pIGNvbnN0IHt9CiAKLSAgLy8gRXh0ZW5zaW9ucyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAvLyBHZXQgYSBSZXBlYXRlZEZpZWxkUmVmIG9iamVjdCB0aGF0IGNhbiBiZSB1c2VkIHRvIHJlYWQgdGhlIHVuZGVybHlpbmcKKyAgLy8gcmVwZWF0ZWQgZmllbGQuIFRoZSB0eXBlIHBhcmFtZXRlciBUIG11c3QgYmUgc2V0IGFjY29yZGluZyB0byB0aGUKKyAgLy8gZmllbGQncyBjcHAgdHlwZS4gVGhlIGZvbGxvd2luZyB0YWJsZSBzaG93cyB0aGUgbWFwcGluZyBmcm9tIGNwcCB0eXBlCisgIC8vIHRvIGFjY2VwdGFibGUgVC4KKyAgLy8KKyAgLy8gICBmaWVsZC0+Y3BwX3R5cGUoKSAgICAgIFQKKyAgLy8gICBDUFBUWVBFX0lOVDMyICAgICAgICBpbnQzMgorICAvLyAgIENQUFRZUEVfVUlOVDMyICAgICAgIHVpbnQzMgorICAvLyAgIENQUFRZUEVfSU5UNjQgICAgICAgIGludDY0CisgIC8vICAgQ1BQVFlQRV9VSU5UNjQgICAgICAgdWludDY0CisgIC8vICAgQ1BQVFlQRV9ET1VCTEUgICAgICAgZG91YmxlCisgIC8vICAgQ1BQVFlQRV9GTE9BVCAgICAgICAgZmxvYXQKKyAgLy8gICBDUFBUWVBFX0JPT0wgICAgICAgICBib29sCisgIC8vICAgQ1BQVFlQRV9FTlVNICAgICAgICAgZ2VuZXJhdGVkIGVudW0gdHlwZSBvciBpbnQzMgorICAvLyAgIENQUFRZUEVfU1RSSU5HICAgICAgIHN0cmluZworICAvLyAgIENQUFRZUEVfTUVTU0FHRSAgICAgIGdlbmVyYXRlZCBtZXNzYWdlIHR5cGUgb3IgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZQorICAvLworICAvLyBBIFJlcGVhdGVkRmllbGRSZWYgb2JqZWN0IGNhbiBiZSBjb3BpZWQgYW5kIHRoZSByZXN1bHRlZCBvYmplY3Qgd2lsbCBwb2ludAorICAvLyB0byB0aGUgc2FtZSByZXBlYXRlZCBmaWVsZCBpbiB0aGUgc2FtZSBtZXNzYWdlLiBUaGUgb2JqZWN0IGNhbiBiZSB1c2VkIGFzCisgIC8vIGxvbmcgYXMgdGhlIG1lc3NhZ2UgaXMgbm90IGRlc3Ryb3llZC4KKyAgLy8KKyAgLy8gTm90ZSB0aGF0IHRvIHVzZSB0aGlzIG1ldGhvZCB1c2VycyBuZWVkIHRvIGluY2x1ZGUgdGhlIGhlYWRlciBmaWxlCisgIC8vICJnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbi5oIiAod2hpY2ggZGVmaW5lcyB0aGUgUmVwZWF0ZWRGaWVsZFJlZgorICAvLyBjbGFzcyB0ZW1wbGF0ZXMpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBSZXBlYXRlZEZpZWxkUmVmPFQ+IEdldFJlcGVhdGVkRmllbGRSZWYoCisgICAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICAvLyBMaWtlIEdldFJlcGVhdGVkRmllbGRSZWYoKSBidXQgcmV0dXJuIGFuIG9iamVjdCB0aGF0IGNhbiBhbHNvIGJlIHVzZWQKKyAgLy8gbWFuaXB1bGF0ZSB0aGUgdW5kZXJseWluZyByZXBlYXRlZCBmaWVsZC4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KKyAgTXV0YWJsZVJlcGVhdGVkRmllbGRSZWY8VD4gR2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWYoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworICAvLyBERVBSRUNBVEVELiBQbGVhc2UgdXNlIEdldChNdXRhYmxlKVJlcGVhdGVkRmllbGRSZWYoKSBmb3IgcmVwZWF0ZWQgZmllbGQKKyAgLy8gYWNjZXNzLiBUaGUgZm9sbG93aW5nIHJlcGVhdGVkIGZpZWxkIGFjY2Vzb3JzIHdpbGwgYmUgcmVtb3ZlZCBpbiB0aGUKKyAgLy8gZnV0dXJlLgorICAvLworICAvLyBSZXBlYXRlZCBmaWVsZCBhY2Nlc3NvcnMgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgLy8gVGhlIG1ldGhvZHMgYWJvdmUsIGUuZy4gR2V0UmVwZWF0ZWRJbnQzMihtc2csIGZkLCBpbmRleCksIHByb3ZpZGUgc2luZ3VsYXIKKyAgLy8gYWNjZXNzIHRvIHRoZSBkYXRhIGluIGEgUmVwZWF0ZWRGaWVsZC4gIFRoZSBtZXRob2RzIGJlbG93IHByb3ZpZGUgYWdncmVnYXRlCisgIC8vIGFjY2VzcyBieSBleHBvc2luZyB0aGUgUmVwZWF0ZWRGaWVsZCBvYmplY3QgaXRzZWxmIHdpdGggdGhlIE1lc3NhZ2UuCisgIC8vIEFwcGx5aW5nIHRoZXNlIHRlbXBsYXRlcyB0byBpbmFwcHJvcHJpYXRlIHR5cGVzIHdpbGwgbGVhZCB0byBhbiB1bmRlZmluZWQKKyAgLy8gcmVmZXJlbmNlIGF0IGxpbmsgdGltZSAoZS5nLiBHZXRSZXBlYXRlZEZpZWxkPCoqKmRvdWJsZT4pLCBvciBwb3NzaWJseSBhCisgIC8vIHRlbXBsYXRlIG1hdGNoaW5nIGVycm9yIGF0IGNvbXBpbGUgdGltZSAoZS5nLiBHZXRSZXBlYXRlZFB0ckZpZWxkPEZpbGU+KS4KKyAgLy8KKyAgLy8gVXNhZ2UgZXhhbXBsZTogbXlfZG91YnMgPSByZWZsLT5HZXRSZXBlYXRlZEZpZWxkPGRvdWJsZT4obXNnLCBmZCk7CisKKyAgLy8gREVQUkVDQVRFRC4gUGxlYXNlIHVzZSBHZXRSZXBlYXRlZEZpZWxkUmVmKCkuCisgIC8vCisgIC8vIGZvciBUID0gQ29yZCBhbmQgYWxsIHByb3RvYnVmIHNjYWxhciB0eXBlcyBleGNlcHQgZW51bXMuCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIGNvbnN0IFJlcGVhdGVkRmllbGQ8VD4mIEdldFJlcGVhdGVkRmllbGQoCisgICAgICBjb25zdCBNZXNzYWdlJiwgY29uc3QgRmllbGREZXNjcmlwdG9yKikgY29uc3Q7CisKKyAgLy8gREVQUkVDQVRFRC4gUGxlYXNlIHVzZSBHZXRNdXRhYmxlUmVwZWF0ZWRGaWVsZFJlZigpLgorICAvLworICAvLyBmb3IgVCA9IENvcmQgYW5kIGFsbCBwcm90b2J1ZiBzY2FsYXIgdHlwZXMgZXhjZXB0IGVudW1zLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBSZXBlYXRlZEZpZWxkPFQ+KiBNdXRhYmxlUmVwZWF0ZWRGaWVsZCgKKyAgICAgIE1lc3NhZ2UqLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqKSBjb25zdDsKKworICAvLyBERVBSRUNBVEVELiBQbGVhc2UgdXNlIEdldFJlcGVhdGVkRmllbGRSZWYoKS4KKyAgLy8KKyAgLy8gZm9yIFQgPSBzdHJpbmcsIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpTdHJpbmdQaWVjZUZpZWxkCisgIC8vICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSAmIGRlc2NlbmRhbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFQ+JiBHZXRSZXBlYXRlZFB0ckZpZWxkKAorICAgICAgY29uc3QgTWVzc2FnZSYsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciopIGNvbnN0OworCisgIC8vIERFUFJFQ0FURUQuIFBsZWFzZSB1c2UgR2V0TXV0YWJsZVJlcGVhdGVkRmllbGRSZWYoKS4KKyAgLy8KKyAgLy8gZm9yIFQgPSBzdHJpbmcsIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpTdHJpbmdQaWVjZUZpZWxkCisgIC8vICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6TWVzc2FnZSAmIGRlc2NlbmRhbnRzLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorICBSZXBlYXRlZFB0ckZpZWxkPFQ+KiBNdXRhYmxlUmVwZWF0ZWRQdHJGaWVsZCgKKyAgICAgIE1lc3NhZ2UqLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqKSBjb25zdDsKKworICAvLyBFeHRlbnNpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAogICAvLyBUcnkgdG8gZmluZCBhbiBleHRlbnNpb24gb2YgdGhpcyBtZXNzYWdlIHR5cGUgYnkgZnVsbHktcXVhbGlmaWVkIGZpZWxkCiAgIC8vIG5hbWUuICBSZXR1cm5zIE5VTEwgaWYgbm8gZXh0ZW5zaW9uIGlzIGtub3duIGZvciB0aGlzIG5hbWUgb3IgbnVtYmVyLgpAQCAtNjE5LDcgKzgzNCwxNzEgQEAKICAgdmlydHVhbCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIEZpbmRLbm93bkV4dGVuc2lvbkJ5TnVtYmVyKAogICAgICAgaW50IG51bWJlcikgY29uc3QgPSAwOwogCisgIC8vIEZlYXR1cmUgRmxhZ3MgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgIC8vIERvZXMgdGhpcyBtZXNzYWdlIHN1cHBvcnQgc3RvcmluZyBhcmJpdHJhcnkgaW50ZWdlciB2YWx1ZXMgaW4gZW51bSBmaWVsZHM/CisgIC8vIElmIHx0cnVlfCwgR2V0RW51bVZhbHVlL1NldEVudW1WYWx1ZSBhbmQgYXNzb2NpYXRlZCByZXBlYXRlZC1maWVsZCB2ZXJzaW9ucworICAvLyB0YWtlIGFyYml0cmFyeSBpbnRlZ2VyIHZhbHVlcywgYW5kIHRoZSBsZWdhY3kgR2V0RW51bSgpIGdldHRlciB3aWxsCisgIC8vIGR5bmFtaWNhbGx5IGNyZWF0ZSBhbiBFbnVtVmFsdWVEZXNjcmlwdG9yIGZvciBhbnkgaW50ZWdlciB2YWx1ZSB3aXRob3V0CisgIC8vIG9uZS4gSWYgfGZhbHNlfCwgc2V0dGluZyBhbiB1bmtub3duIGVudW0gdmFsdWUgdmlhIHRoZSBpbnRlZ2VyLWJhc2VkCisgIC8vIHNldHRlcnMgcmVzdWx0cyBpbiB1bmRlZmluZWQgYmVoYXZpb3IgKGluIHByYWN0aWNlLCBHT09HTEVfRENIRUNLLWZhaWxzKS4KKyAgLy8KKyAgLy8gR2VuZXJpYyBjb2RlIHRoYXQgdXNlcyByZWZsZWN0aW9uIHRvIGhhbmRsZSBtZXNzYWdlcyB3aXRoIGVudW0gZmllbGRzCisgIC8vIHNob3VsZCBjaGVjayB0aGlzIGZsYWcgYmVmb3JlIHVzaW5nIHRoZSBpbnRlZ2VyLWJhc2VkIHNldHRlciwgYW5kIGVpdGhlcgorICAvLyBkb3duZ3JhZGUgdG8gYSBjb21wYXRpYmxlIHZhbHVlIG9yIHVzZSB0aGUgVW5rbm93bkZpZWxkU2V0IGlmIG5vdC4gRm9yCisgIC8vIGV4YW1wbGU6CisgIC8vCisgIC8vIGludCBuZXdfdmFsdWUgPSBHZXRWYWx1ZUZyb21BcHBsaWNhdGlvbkxvZ2ljKCk7CisgIC8vIGlmIChyZWZsZWN0aW9uLT5TdXBwb3J0c1Vua25vd25FbnVtVmFsdWVzKCkpIHsKKyAgLy8gICAgIHJlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCwgbmV3X3ZhbHVlKTsKKyAgLy8gfSBlbHNlIHsKKyAgLy8gICAgIGlmIChmaWVsZF9kZXNjcmlwdG9yLT5lbnVtX3R5cGUoKS0+CisgIC8vICAgICAgICAgICAgIEZpbmRWYWx1ZUJ5TnVtdmVyKG5ld192YWx1ZSkgIT0gTlVMTCkgeworICAvLyAgICAgICAgIHJlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCwgbmV3X3ZhbHVlKTsKKyAgLy8gICAgIH0gZWxzZSBpZiAoZW1pdF91bmtub3duX2VudW1fdmFsdWVzKSB7CisgIC8vICAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSktPkFkZFZhcmludCgKKyAgLy8gICAgICAgICAgICAgZmllbGQtPm51bWJlcigpLAorICAvLyAgICAgICAgICAgICBuZXdfdmFsdWUpOworICAvLyAgICAgfSBlbHNlIHsKKyAgLy8gICAgICAgICAvLyBjb252ZXJ0IHZhbHVlIHRvIGEgY29tcGF0aWJsZS9kZWZhdWx0IHZhbHVlLgorICAvLyAgICAgICAgIG5ld192YWx1ZSA9IENvbXBhdGlibGVEb3duZ3JhZGUobmV3X3ZhbHVlKTsKKyAgLy8gICAgICAgICByZWZsZWN0aW9uLT5TZXRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIG5ld192YWx1ZSk7CisgIC8vICAgICB9CisgIC8vIH0KKyAgdmlydHVhbCBib29sIFN1cHBvcnRzVW5rbm93bkVudW1WYWx1ZXMoKSBjb25zdCB7IHJldHVybiBmYWxzZTsgfQorCisgIC8vIFJldHVybnMgdGhlIE1lc3NhZ2VGYWN0b3J5IGFzc29jaWF0ZWQgd2l0aCB0aGlzIG1lc3NhZ2UuICBUaGlzIGNhbiBiZQorICAvLyB1c2VmdWwgZm9yIGRldGVybWluaW5nIGlmIGEgbWVzc2FnZSBpcyBhIGdlbmVyYXRlZCBtZXNzYWdlIG9yIG5vdCwgZm9yCisgIC8vIGV4YW1wbGU6CisgIC8vCisgIC8vIGlmIChtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldE1lc3NhZ2VGYWN0b3J5KCkgPT0KKyAgLy8gICAgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpKSB7CisgIC8vICAgLy8gVGhpcyBpcyBhIGdlbmVyYXRlZCBtZXNzYWdlLgorICAvLyB9CisgIC8vCisgIC8vIEl0IGNhbiBhbHNvIGJlIHVzZWQgdG8gY3JlYXRlIG1vcmUgbWVzc2FnZXMgb2YgdGhpcyB0eXBlLCB0aG91Z2gKKyAgLy8gTWVzc2FnZTo6TmV3KCkgaXMgYW4gZWFzaWVyIHdheSB0byBhY2NvbXBsaXNoIHRoaXMuCisgIHZpcnR1YWwgTWVzc2FnZUZhY3RvcnkqIEdldE1lc3NhZ2VGYWN0b3J5KCkgY29uc3Q7CisKKyAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyBwcm90ZWN0ZWQ6CisgIC8vIE9idGFpbiBhIHBvaW50ZXIgdG8gYSBSZXBlYXRlZCBGaWVsZCBTdHJ1Y3R1cmUgYW5kIGRvIHNvbWUgdHlwZSBjaGVja2luZzoKKyAgLy8gICBvbiBmaWVsZC0+Y3BwX3R5cGUoKSwKKyAgLy8gICBvbiBmaWVsZC0+ZmllbGRfb3B0aW9uKCkuY3R5cGUoKSAoaWYgY3R5cGUgPj0gMCkKKyAgLy8gICBvZiBmaWVsZC0+bWVzc2FnZV90eXBlKCkgKGlmIG1lc3NhZ2VfdHlwZSAhPSBOVUxMKS4KKyAgLy8gV2UgdXNlIDIgcm91dGluZSByYXRoZXIgdGhhbiA0IChjb25zdCB2cyBtdXRhYmxlKSB4IChzY2FsYXIgdnMgcG9pbnRlcikuCisgIHZpcnR1YWwgdm9pZCogTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBGaWVsZERlc2NyaXB0b3I6OkNwcFR5cGUsCisgICAgICBpbnQgY3R5cGUsIGNvbnN0IERlc2NyaXB0b3IqIG1lc3NhZ2VfdHlwZSkgY29uc3QgPSAwOworCisgIC8vIFRPRE8oamllbHVvKSAtIG1ha2UgaXQgcHVyZSB2aXJ0dWFsIGFmdGVyIHVwZGF0aW5nIGFsbCB0aGUgc3ViY2xhc3Nlcy4KKyAgdmlydHVhbCBjb25zdCB2b2lkKiBHZXRSYXdSZXBlYXRlZEZpZWxkKAorICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q3BwVHlwZSBjcHB0eXBlLCBpbnQgY3R5cGUsCisgICAgICBjb25zdCBEZXNjcmlwdG9yKiBtZXNzYWdlX3R5cGUpIGNvbnN0IHsKKyAgICByZXR1cm4gTXV0YWJsZVJhd1JlcGVhdGVkRmllbGQoCisgICAgICAgIGNvbnN0X2Nhc3Q8TWVzc2FnZSo+KCZtZXNzYWdlKSwgZmllbGQsIGNwcHR5cGUsIGN0eXBlLCBtZXNzYWdlX3R5cGUpOworICB9CisKKyAgLy8gVGhlIGZvbGxvd2luZyBtZXRob2RzIGFyZSB1c2VkIHRvIGltcGxlbWVudCAoTXV0YWJsZSlSZXBlYXRlZEZpZWxkUmVmLgorICAvLyBBIFJlZiBvYmplY3Qgd2lsbCBzdG9yZSBhIHJhdyBwb2ludGVyIHRvIHRoZSByZXBlYXRlZCBmaWVsZCBkYXRhIChvYnRhaW5lZAorICAvLyBmcm9tIFJlcGVhdGVkRmllbGREYXRhKCkpIGFuZCBhIHBvaW50ZXIgdG8gYSBBY2Nlc3NvciAob2J0YWluZWQgZnJvbQorICAvLyBSZXBlYXRlZEZpZWxkQWNjZXNzb3IpIHdoaWNoIHdpbGwgYmUgdXNlZCB0byBhY2Nlc3MgdGhlIHJhdyBkYXRhLgorICAvLworICAvLyBUT0RPKHhpYW9mZW5nKTogTWFrZSB0aGVzZSBtZXRob2RzIHB1cmUtdmlydHVhbC4KKworICAvLyBSZXR1cm5zIGEgcmF3IHBvaW50ZXIgdG8gdGhlIHJlcGVhdGVkIGZpZWxkCisgIC8vCisgIC8vICJjcHBfdHlwZSIgYW5kICJtZXNzYWdlX3R5cGUiIGFyZSBkZWN1ZGVkIGZyb20gdGhlIHR5cGUgcGFyYW1ldGVyIFQgcGFzc2VkCisgIC8vIHRvIEdldChNdXRhYmxlKVJlcGVhdGVkRmllbGRSZWYuIElmIFQgaXMgYSBnZW5lcmF0ZWQgbWVzc2FnZSB0eXBlLAorICAvLyAibWVzc2FnZV90eXBlIiBzaG91bGQgYmUgc2V0IHRvIGl0cyBkZXNjcmlwdG9yLiBPdGhlcndpc2UgIm1lc3NhZ2VfdHlwZSIKKyAgLy8gc2hvdWxkIGJlIHNldCB0byBOVUxMLiBJbXBsZW1lbnRhdGlvbnMgb2YgdGhpcyBtZXRob2Qgc2hvdWxkIGNoZWNrIHdoZXRoZXIKKyAgLy8gImNwcF90eXBlIi8ibWVzc2FnZV90eXBlIiBpcyBjb25zaXN0ZW50IHdpdGggdGhlIGFjdHVhbCB0eXBlIG9mIHRoZSBmaWVsZC4KKyAgLy8gV2UgdXNlIDEgcm91dGluZSByYXRoZXIgdGhhbiAyIChjb25zdCB2cyBtdXRhYmxlKSBiZWNhdXNlIGl0IGlzIHByb3RlY3RlZAorICAvLyBhbmQgaXQgZG9lc24ndCBjaGFuZ2UgdGhlIG1lc3NhZ2UuCisgIHZpcnR1YWwgdm9pZCogUmVwZWF0ZWRGaWVsZERhdGEoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgRmllbGREZXNjcmlwdG9yOjpDcHBUeXBlIGNwcF90eXBlLAorICAgICAgY29uc3QgRGVzY3JpcHRvciogbWVzc2FnZV90eXBlKSBjb25zdDsKKworICAvLyBUaGUgcmV0dXJuZWQgcG9pbnRlciBzaG91bGQgcG9pbnQgdG8gYSBzaW5nbGV0b24gaW5zdGFuY2Ugd2hpY2ggaW1wbGVtZW50cworICAvLyB0aGUgUmVwZWF0ZWRGaWVsZEFjY2Vzc29yIGludGVyZmFjZS4KKyAgdmlydHVhbCBjb25zdCBpbnRlcm5hbDo6UmVwZWF0ZWRGaWVsZEFjY2Vzc29yKiBSZXBlYXRlZEZpZWxkQWNjZXNzb3IoCisgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKwogIHByaXZhdGU6CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZT4KKyAgZnJpZW5kIGNsYXNzIFJlcGVhdGVkRmllbGRSZWY7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFQsIHR5cGVuYW1lIEVuYWJsZT4KKyAgZnJpZW5kIGNsYXNzIE11dGFibGVSZXBlYXRlZEZpZWxkUmVmOworICBmcmllbmQgY2xhc3MgOjpnb29nbGU6OnByb3RvYnVmOjpweXRob246Ok1hcFJlZmxlY3Rpb25GcmllbmQ7CisKKyAgLy8gU3BlY2lhbCB2ZXJzaW9uIGZvciBzcGVjaWFsaXplZCBpbXBsZW1lbnRhdGlvbnMgb2Ygc3RyaW5nLiAgV2UgY2FuJ3QgY2FsbAorICAvLyBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZCBkaXJlY3RseSBoZXJlIGJlY2F1c2Ugd2UgZG9uJ3QgaGF2ZSBhY2Nlc3MgdG8KKyAgLy8gRmllbGRPcHRpb25zOjoqIHdoaWNoIGFyZSBkZWZpbmVkIGluIGRlc2NyaXB0b3IucGIuaC4gIEluY2x1ZGluZyB0aGF0CisgIC8vIGZpbGUgaGVyZSBpcyBub3QgcG9zc2libGUgYmVjYXVzZSBpdCB3b3VsZCBjYXVzZSBhIGNpcmN1bGFyIGluY2x1ZGUgY3ljbGUuCisgIC8vIFdlIHVzZSAxIHJvdXRpbmUgcmF0aGVyIHRoYW4gMiAoY29uc3QgdnMgbXV0YWJsZSkgYmVjYXVzZSBpdCBpcyBwcml2YXRlCisgIC8vIGFuZCBtdXRhYmxlIGEgcmVwZWF0ZWQgc3RyaW5nIGZpZWxkIGRvZXNuJ3QgY2hhbmdlIHRoZSBtZXNzYWdlLgorICB2b2lkKiBNdXRhYmxlUmF3UmVwZWF0ZWRTdHJpbmcoCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBib29sIGlzX3N0cmluZykgY29uc3Q7CisKKyAgZnJpZW5kIGNsYXNzIE1hcFJlZmxlY3Rpb25UZXN0ZXI7CisgIC8vIFRPRE8oamllbHVvKSAtIG1ha2UgdGhlIG1hcCBBUElzIHB1cmUgdmlydHVhbCBhZnRlciB1cGRhdGluZworICAvLyBhbGwgdGhlIHN1YmNsYXNzZXMuCisgIC8vIFJldHVybnMgdHJ1ZSBpZiBrZXkgaXMgaW4gbWFwLiBSZXR1cm5zIGZhbHNlIGlmIGtleSBpcyBub3QgaW4gbWFwIGZpZWxkLgorICB2aXJ0dWFsIGJvb2wgQ29udGFpbnNNYXBLZXkoY29uc3QgTWVzc2FnZSYgLyogbWVzc2FnZSovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAvKiBmaWVsZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1hcEtleSYgLyoga2V5ICovKSBjb25zdCB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gSWYga2V5IGlzIGluIG1hcCBmaWVsZDogU2F2ZXMgdGhlIHZhbHVlIHBvaW50ZXIgdG8gdmFsIGFuZCByZXR1cm5zCisgIC8vIGZhbHNlLiBJZiBrZXkgaW4gbm90IGluIG1hcCBmaWVsZDogSW5zZXJ0IHRoZSBrZXkgaW50byBtYXAsIHNhdmVzCisgIC8vIHZhbHVlIHBvaW50ZXIgdG8gdmFsIGFuZCByZXR1bnMgdHJ1ZS4KKyAgdmlydHVhbCBib29sIEluc2VydE9yTG9va3VwTWFwVmFsdWUoTWVzc2FnZSogLyogbWVzc2FnZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiAvKiBmaWVsZCAqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiAvKiBrZXkgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1hcFZhbHVlUmVmKiAvKiB2YWwgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBEZWxldGUgYW5kIHJldHVybnMgdHJ1ZSBpZiBrZXkgaXMgaW4gdGhlIG1hcCBmaWVsZC4gUmV0dXJucyBmYWxzZQorICAvLyBvdGhlcndpc2UuCisgIHZpcnR1YWwgYm9vbCBEZWxldGVNYXBWYWx1ZShNZXNzYWdlKiAvKiBtZXNhZ2UgKi8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIC8qIGZpZWxkICovLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWFwS2V5JiAvKiBrZXkgKi8pIGNvbnN0IHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBSZXR1cm5zIGEgTWFwSXRlcmF0b3IgcmVmZXJyaW5nIHRvIHRoZSBmaXJzdCBlbGVtZW50IGluIHRoZSBtYXAgZmllbGQuCisgIC8vIElmIHRoZSBtYXAgZmllbGQgaXMgZW1wdHksIHRoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgc2FtZSBhcworICAvLyByZWZsZWN0aW9uOjpNYXBFbmQuIE11dGF0aW9uIHRvIHRoZSBmaWVsZCBtYXkgaW52YWxpZGF0ZSB0aGUgaXRlcmF0b3IuCisgIHZpcnR1YWwgTWFwSXRlcmF0b3IgTWFwQmVnaW4oCisgICAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3Q7CisKKyAgLy8gUmV0dXJucyBhIE1hcEl0ZXJhdG9yIHJlZmVycmluZyB0byB0aGUgdGhlb3JldGljYWwgZWxlbWVudCB0aGF0IHdvdWxkCisgIC8vIGZvbGxvdyB0aGUgbGFzdCBlbGVtZW50IGluIHRoZSBtYXAgZmllbGQuIEl0IGRvZXMgbm90IHBvaW50IHRvIGFueQorICAvLyByZWFsIGVsZW1lbnQuIE11dGF0aW9uIHRvIHRoZSBmaWVsZCBtYXkgaW52YWxpZGF0ZSB0aGUgaXRlcmF0b3IuCisgIHZpcnR1YWwgTWFwSXRlcmF0b3IgTWFwRW5kKAorICAgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OworCisgIC8vIEdldCB0aGUgbnVtYmVyIG9mIDxrZXksIHZhbHVlPiBwYWlyIG9mIGEgbWFwIGZpZWxkLiBUaGUgcmVzdWx0IG1heSBiZQorICAvLyBkaWZmZXJlbnQgZnJvbSBGaWVsZFNpemUgd2hpY2ggY2FuIGhhdmUgZHVwbGljYXRlIGtleXMuCisgIHZpcnR1YWwgaW50IE1hcFNpemUoY29uc3QgTWVzc2FnZSYgLyogbWVzc2FnZSAqLywKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIC8qIGZpZWxkICovKSBjb25zdCB7CisgICAgcmV0dXJuIDA7CisgIH0KKworICAvLyBIZWxwIG1ldGhvZCBmb3IgTWFwSXRlcmF0b3IuCisgIGZyaWVuZCBjbGFzcyBNYXBJdGVyYXRvcjsKKyAgdmlydHVhbCBpbnRlcm5hbDo6TWFwRmllbGRCYXNlKiBNYXBEYXRhKAorICAgICAgTWVzc2FnZSogLyogbWVzc2FnZSAqLywgY29uc3QgRmllbGREZXNjcmlwdG9yKiAvKiBmaWVsZCAqLykgY29uc3QgeworICAgIHJldHVybiBOVUxMOworICB9CisKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKFJlZmxlY3Rpb24pOwogfTsKIApAQCAtNjM2LDcgKzEwMTUsNyBAQAogICAvLyBDYWxsaW5nIHRoaXMgbWV0aG9kIHR3aWNlIHdpdGggdGhlIHNhbWUgRGVzY3JpcHRvciByZXR1cm5zIHRoZSBzYW1lCiAgIC8vIG9iamVjdC4gIFRoZSByZXR1cm5lZCBvYmplY3QgcmVtYWlucyBwcm9wZXJ0eSBvZiB0aGUgZmFjdG9yeS4gIEFsc28sIGFueQogICAvLyBvYmplY3RzIGNyZWF0ZWQgYnkgY2FsbGluZyB0aGUgcHJvdG90eXBlJ3MgTmV3KCkgbWV0aG9kIHNoYXJlIHNvbWUgZGF0YQotICAvLyB3aXRoIHRoZSBwcm90b3R5cGUsIHNvIHRoZXNlIG11c3QgYmUgZGVzdG95ZWQgYmVmb3JlIHRoZSBNZXNzYWdlRmFjdG9yeQorICAvLyB3aXRoIHRoZSBwcm90b3R5cGUsIHNvIHRoZXNlIG11c3QgYmUgZGVzdHJveWVkIGJlZm9yZSB0aGUgTWVzc2FnZUZhY3RvcnkKICAgLy8gaXMgZGVzdHJveWVkLgogICAvLwogICAvLyBUaGUgZ2l2ZW4gZGVzY3JpcHRvciBtdXN0IG91dGxpdmUgdGhlIHJldHVybmVkIG1lc3NhZ2UsIGFuZCBoZW5jZSBtdXN0CkBAIC02ODIsMTAgKzEwNjEsODkgQEAKICAgc3RhdGljIHZvaWQgSW50ZXJuYWxSZWdpc3RlckdlbmVyYXRlZE1lc3NhZ2UoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgTWVzc2FnZSogcHJvdG90eXBlKTsKIAorCiAgcHJpdmF0ZToKICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE1lc3NhZ2VGYWN0b3J5KTsKIH07CiAKKyNkZWZpbmUgREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgXAordGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitMSUJQUk9UT0JVRl9FWFBPUlQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK2NvbnN0IFJlcGVhdGVkRmllbGQ8VFlQRT4mIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkRmllbGQ8VFlQRT4oICAgXAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0OyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3RlbXBsYXRlPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorTElCUFJPVE9CVUZfRVhQT1JUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCitSZXBlYXRlZEZpZWxkPFRZUEU+KiBSZWZsZWN0aW9uOjpNdXRhYmxlUmVwZWF0ZWRGaWVsZDxUWVBFPiggICAgIFwKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKworREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoaW50MzIpCitERUNMQVJFX0dFVF9SRVBFQVRFRF9GSUVMRChpbnQ2NCkKK0RFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKHVpbnQzMikKK0RFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKHVpbnQ2NCkKK0RFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxEKGZsb2F0KQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoZG91YmxlKQorREVDTEFSRV9HRVRfUkVQRUFURURfRklFTEQoYm9vbCkKKworI3VuZGVmIERFQ0xBUkVfR0VUX1JFUEVBVEVEX0ZJRUxECisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBJbXBsZW1lbnRhdGlvbiBkZXRhaWxzIGZvciB7R2V0LE11dGFibGV9UmF3UmVwZWF0ZWRQdHJGaWVsZC4gIFdlIHByb3ZpZGUKKy8vIHNwZWNpYWxpemF0aW9ucyBmb3IgPHN0cmluZz4sIDxTdHJpbmdQaWVjZUZpZWxkPiBhbmQgPE1lc3NhZ2U+IGFuZCBoYW5kbGUKKy8vIGV2ZXJ5dGhpbmcgZWxzZSB3aXRoIHRoZSBkZWZhdWx0IHRlbXBsYXRlIHdoaWNoIHdpbGwgbWF0Y2ggYW55IHR5cGUgaGF2aW5nCisvLyBhIG1ldGhvZCB3aXRoIHNpZ25hdHVyZSAic3RhdGljIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6OkRlc2NyaXB0b3IqIGRlc2NyaXB0b3IoKSIuCisvLyBTdWNoIGEgdHlwZSBwcmVzdW1hYmx5IGlzIGEgZGVzY2VuZGFudCBvZiBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlLgorCit0ZW1wbGF0ZTw+CitpbmxpbmUgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+JiBSZWZsZWN0aW9uOjpHZXRSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4oCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gKnN0YXRpY19jYXN0PFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiogPigKKyAgICAgIE11dGFibGVSYXdSZXBlYXRlZFN0cmluZyhjb25zdF9jYXN0PE1lc3NhZ2UqPigmbWVzc2FnZSksIGZpZWxkLCB0cnVlKSk7Cit9CisKK3RlbXBsYXRlPD4KK2lubGluZSBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4oCisgICAgTWVzc2FnZSogbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gc3RhdGljX2Nhc3Q8UmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiA+KAorICAgICAgTXV0YWJsZVJhd1JlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCB0cnVlKSk7Cit9CisKKworLy8gLS0tLS0KKwordGVtcGxhdGU8PgoraW5saW5lIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4mIFJlZmxlY3Rpb246OkdldFJlcGVhdGVkUHRyRmllbGQoCisgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICByZXR1cm4gKnN0YXRpY19jYXN0PGNvbnN0IFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qID4oCisgICAgICBHZXRSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIE5VTEwpKTsKK30KKwordGVtcGxhdGU8PgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qIFJlZmxlY3Rpb246Ok11dGFibGVSZXBlYXRlZFB0ckZpZWxkKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIGNvbnN0IHsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT4qID4oCisgICAgICBNdXRhYmxlUmF3UmVwZWF0ZWRGaWVsZChtZXNzYWdlLCBmaWVsZCwKKyAgICAgICAgICBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwgLTEsCisgICAgICAgICAgTlVMTCkpOworfQorCit0ZW1wbGF0ZTx0eXBlbmFtZSBQQj4KK2lubGluZSBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPFBCPiYgUmVmbGVjdGlvbjo6R2V0UmVwZWF0ZWRQdHJGaWVsZCgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiAqc3RhdGljX2Nhc3Q8Y29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxQQj4qID4oCisgICAgICBHZXRSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLCBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLTEsIFBCOjpkZWZhdWx0X2luc3RhbmNlKCkuR2V0RGVzY3JpcHRvcigpKSk7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIFBCPgoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8UEI+KiBSZWZsZWN0aW9uOjpNdXRhYmxlUmVwZWF0ZWRQdHJGaWVsZCgKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdCB7CisgIHJldHVybiBzdGF0aWNfY2FzdDxSZXBlYXRlZFB0ckZpZWxkPFBCPiogPigKKyAgICAgIE11dGFibGVSYXdSZXBlYXRlZEZpZWxkKG1lc3NhZ2UsIGZpZWxkLAorICAgICAgICAgIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFLCAtMSwKKyAgICAgICAgICBQQjo6ZGVmYXVsdF9pbnN0YW5jZSgpLkdldERlc2NyaXB0b3IoKSkpOworfQogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiAKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5jYwppbmRleCA3YzhmMzdkLi45ZDdiNjRmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCwxMSArMzQsMTQgQEAKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvYXJlbmEuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTU5LDEzICs2MiwxNSBAQAogLy8gcHJvdmlkZSBhIHVzZWZ1bCBlcnJvciBtZXNzYWdlLgogdm9pZCBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3IoaW50IGJ5dGVfc2l6ZV9iZWZvcmVfc2VyaWFsaXphdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlX3NpemVfYWZ0ZXJfc2VyaWFsaXphdGlvbiwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBieXRlc19wcm9kdWNlZF9ieV9zZXJpYWxpemF0aW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYnl0ZXNfcHJvZHVjZWRfYnlfc2VyaWFsaXphdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE1lc3NhZ2VMaXRlJiBtZXNzYWdlKSB7CiAgIEdPT0dMRV9DSEVDS19FUShieXRlX3NpemVfYmVmb3JlX3NlcmlhbGl6YXRpb24sIGJ5dGVfc2l6ZV9hZnRlcl9zZXJpYWxpemF0aW9uKQotICAgICAgPDwgIlByb3RvY29sIG1lc3NhZ2Ugd2FzIG1vZGlmaWVkIGNvbmN1cnJlbnRseSBkdXJpbmcgc2VyaWFsaXphdGlvbi4iOworICAgICAgPDwgbWVzc2FnZS5HZXRUeXBlTmFtZSgpCisgICAgICA8PCAiIHdhcyBtb2RpZmllZCBjb25jdXJyZW50bHkgZHVyaW5nIHNlcmlhbGl6YXRpb24uIjsKICAgR09PR0xFX0NIRUNLX0VRKGJ5dGVzX3Byb2R1Y2VkX2J5X3NlcmlhbGl6YXRpb24sIGJ5dGVfc2l6ZV9iZWZvcmVfc2VyaWFsaXphdGlvbikKICAgICAgIDw8ICJCeXRlIHNpemUgY2FsY3VsYXRpb24gYW5kIHNlcmlhbGl6YXRpb24gd2VyZSBpbmNvbnNpc3RlbnQuICBUaGlzICIKICAgICAgICAgICJtYXkgaW5kaWNhdGUgYSBidWcgaW4gcHJvdG9jb2wgYnVmZmVycyBvciBpdCBtYXkgYmUgY2F1c2VkIGJ5ICIKLSAgICAgICAgICJjb25jdXJyZW50IG1vZGlmaWNhdGlvbiBvZiB0aGUgbWVzc2FnZS4iOworICAgICAgICAgImNvbmN1cnJlbnQgbW9kaWZpY2F0aW9uIG9mICIgPDwgbWVzc2FnZS5HZXRUeXBlTmFtZSgpIDw8ICIuIjsKICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIlRoaXMgc2hvdWxkbid0IGJlIGNhbGxlZCBpZiBhbGwgdGhlIHNpemVzIGFyZSBlcXVhbC4iOwogfQogCkBAIC05NywyNyArMTAyLDE5IEBACiAvLyBjYWxsIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbSgpLiAgSG93ZXZlciwgd2hlbiBwYXJzaW5nIHZlcnkgc21hbGwKIC8vIG1lc3NhZ2VzLCBldmVyeSBmdW5jdGlvbiBjYWxsIGludHJvZHVjZXMgc2lnbmlmaWNhbnQgb3ZlcmhlYWQuICBUbyBhdm9pZAogLy8gdGhpcyB3aXRob3V0IHJlcHJvZHVjaW5nIGNvZGUsIHdlIHVzZSB0aGVzZSBmb3JjZWQtaW5saW5lIGhlbHBlcnMuCi0vLwotLy8gTm90ZTogIEdDQyBvbmx5IGFsbG93cyBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgb24gZGVjbGFyYXRpb25zLCBub3QKLS8vICAgZGVmaW5pdGlvbnMuCi1pbmxpbmUgYm9vbCBJbmxpbmVNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKLWlubGluZSBib29sIElubGluZVBhcnNlRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOwotaW5saW5lIGJvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7Ci1pbmxpbmUgYm9vbCBJbmxpbmVQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FOwotaW5saW5lIGJvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUFycmF5KGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKQotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORTsKK0dPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSBib29sIElubGluZU1lcmdlRnJvbUNvZGVkU3RyZWFtKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpOworR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGJvb2wgSW5saW5lUGFyc2VGcm9tQ29kZWRTdHJlYW0oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7CitHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7CitHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgYm9vbCBJbmxpbmVQYXJzZUZyb21BcnJheSgKKyAgICBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpOworR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIGJvb2wgSW5saW5lUGFyc2VQYXJ0aWFsRnJvbUFycmF5KAorICAgIGNvbnN0IHZvaWQqIGRhdGEsIGludCBzaXplLCBNZXNzYWdlTGl0ZSogbWVzc2FnZSk7CiAKLWJvb2wgSW5saW5lTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworaW5saW5lIGJvb2wgSW5saW5lTWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKICAgaWYgKCFtZXNzYWdlLT5NZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKSByZXR1cm4gZmFsc2U7CiAgIGlmICghbWVzc2FnZS0+SXNJbml0aWFsaXplZCgpKSB7CiAgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgSW5pdGlhbGl6YXRpb25FcnJvck1lc3NhZ2UoInBhcnNlIiwgKm1lc3NhZ2UpOwpAQCAtMTI2LDI2ICsxMjMsMjcgQEAKICAgcmV0dXJuIHRydWU7CiB9CiAKLWJvb2wgSW5saW5lUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogbWVzc2FnZSkgeworaW5saW5lIGJvb2wgSW5saW5lUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKICAgbWVzc2FnZS0+Q2xlYXIoKTsKICAgcmV0dXJuIElubGluZU1lcmdlRnJvbUNvZGVkU3RyZWFtKGlucHV0LCBtZXNzYWdlKTsKIH0KIAotYm9vbCBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKK2lubGluZSBib29sIElubGluZVBhcnNlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKICAgbWVzc2FnZS0+Q2xlYXIoKTsKICAgcmV0dXJuIG1lc3NhZ2UtPk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCk7CiB9CiAKLWJvb2wgSW5saW5lUGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CitpbmxpbmUgYm9vbCBJbmxpbmVQYXJzZUZyb21BcnJheSgKKyAgICBjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwgTWVzc2FnZUxpdGUqIG1lc3NhZ2UpIHsKICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQocmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KGRhdGEpLCBzaXplKTsKICAgcmV0dXJuIElubGluZVBhcnNlRnJvbUNvZGVkU3RyZWFtKCZpbnB1dCwgbWVzc2FnZSkgJiYKICAgICAgICAgIGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpOwogfQogCi1ib29sIElubGluZVBhcnNlUGFydGlhbEZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CitpbmxpbmUgYm9vbCBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQXJyYXkoCisgICAgY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUsIE1lc3NhZ2VMaXRlKiBtZXNzYWdlKSB7CiAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhKSwgc2l6ZSk7CiAgIHJldHVybiBJbmxpbmVQYXJzZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oJmlucHV0LCBtZXNzYWdlKSAmJgogICAgICAgICAgaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCk7CkBAIC0xNTMsNiArMTUxLDE1IEBACiAKIH0gIC8vIG5hbWVzcGFjZQogCisKK01lc3NhZ2VMaXRlKiBNZXNzYWdlTGl0ZTo6TmV3KDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSBjb25zdCB7CisgIE1lc3NhZ2VMaXRlKiBtZXNzYWdlID0gTmV3KCk7CisgIGlmIChhcmVuYSAhPSBOVUxMKSB7CisgICAgYXJlbmEtPk93bihtZXNzYWdlKTsKKyAgfQorICByZXR1cm4gbWVzc2FnZTsKK30KKwogYm9vbCBNZXNzYWdlTGl0ZTo6TWVyZ2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CiAgIHJldHVybiBJbmxpbmVNZXJnZUZyb21Db2RlZFN0cmVhbShpbnB1dCwgdGhpcyk7CiB9CkBAIC0yMzMsMTEgKzI0MCwxNyBAQAogYm9vbCBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplUGFydGlhbFRvQ29kZWRTdHJlYW0oCiAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKICAgY29uc3QgaW50IHNpemUgPSBCeXRlU2l6ZSgpOyAgLy8gRm9yY2Ugc2l6ZSB0byBiZSBjYWNoZWQuCisgIGlmIChzaXplIDwgMCkgeworICAgIC8vIE1lc3NhZ2VzID4yRyBjYW5ub3QgYmUgc2VyaWFsaXplZCBkdWUgdG8gb3ZlcmZsb3cgY29tcHV0aW5nIEJ5dGVTaXplLgorICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFcnJvciBjb21wdXRpbmcgQnl0ZVNpemUgKHBvc3NpYmxlIG92ZXJmbG93PykuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKwogICB1aW50OCogYnVmZmVyID0gb3V0cHV0LT5HZXREaXJlY3RCdWZmZXJGb3JOQnl0ZXNBbmRBZHZhbmNlKHNpemUpOwogICBpZiAoYnVmZmVyICE9IE5VTEwpIHsKICAgICB1aW50OCogZW5kID0gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShidWZmZXIpOwogICAgIGlmIChlbmQgLSBidWZmZXIgIT0gc2l6ZSkgewotICAgICAgQnl0ZVNpemVDb25zaXN0ZW5jeUVycm9yKHNpemUsIEJ5dGVTaXplKCksIGVuZCAtIGJ1ZmZlcik7CisgICAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3Ioc2l6ZSwgQnl0ZVNpemUoKSwgZW5kIC0gYnVmZmVyLCAqdGhpcyk7CiAgICAgfQogICAgIHJldHVybiB0cnVlOwogICB9IGVsc2UgewpAQCAtMjUwLDcgKzI2Myw3IEBACiAKICAgICBpZiAoZmluYWxfYnl0ZV9jb3VudCAtIG9yaWdpbmFsX2J5dGVfY291bnQgIT0gc2l6ZSkgewogICAgICAgQnl0ZVNpemVDb25zaXN0ZW5jeUVycm9yKHNpemUsIEJ5dGVTaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmluYWxfYnl0ZV9jb3VudCAtIG9yaWdpbmFsX2J5dGVfY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbmFsX2J5dGVfY291bnQgLSBvcmlnaW5hbF9ieXRlX2NvdW50LCAqdGhpcyk7CiAgICAgfQogCiAgICAgcmV0dXJuIHRydWU7CkBAIC0yNzcsMTEgKzI5MCwxOCBAQAogYm9vbCBNZXNzYWdlTGl0ZTo6QXBwZW5kUGFydGlhbFRvU3RyaW5nKHN0cmluZyogb3V0cHV0KSBjb25zdCB7CiAgIGludCBvbGRfc2l6ZSA9IG91dHB1dC0+c2l6ZSgpOwogICBpbnQgYnl0ZV9zaXplID0gQnl0ZVNpemUoKTsKKyAgaWYgKGJ5dGVfc2l6ZSA8IDApIHsKKyAgICAvLyBNZXNzYWdlcyA+MkcgY2Fubm90IGJlIHNlcmlhbGl6ZWQgZHVlIHRvIG92ZXJmbG93IGNvbXB1dGluZyBCeXRlU2l6ZS4KKyAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRXJyb3IgY29tcHV0aW5nIEJ5dGVTaXplIChwb3NzaWJsZSBvdmVyZmxvdz8pLiI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKICAgU1RMU3RyaW5nUmVzaXplVW5pbml0aWFsaXplZChvdXRwdXQsIG9sZF9zaXplICsgYnl0ZV9zaXplKTsKLSAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KHN0cmluZ19hc19hcnJheShvdXRwdXQpICsgb2xkX3NpemUpOworICB1aW50OCogc3RhcnQgPQorICAgICAgcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGlvOjptdXRhYmxlX3N0cmluZ19kYXRhKG91dHB1dCkgKyBvbGRfc2l6ZSk7CiAgIHVpbnQ4KiBlbmQgPSBTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXNUb0FycmF5KHN0YXJ0KTsKICAgaWYgKGVuZCAtIHN0YXJ0ICE9IGJ5dGVfc2l6ZSkgewotICAgIEJ5dGVTaXplQ29uc2lzdGVuY3lFcnJvcihieXRlX3NpemUsIEJ5dGVTaXplKCksIGVuZCAtIHN0YXJ0KTsKKyAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3IoYnl0ZV9zaXplLCBCeXRlU2l6ZSgpLCBlbmQgLSBzdGFydCwgKnRoaXMpOwogICB9CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMzA3LDE0ICszMjcsMTQgQEAKICAgdWludDgqIHN0YXJ0ID0gcmVpbnRlcnByZXRfY2FzdDx1aW50OCo+KGRhdGEpOwogICB1aW50OCogZW5kID0gU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheShzdGFydCk7CiAgIGlmIChlbmQgLSBzdGFydCAhPSBieXRlX3NpemUpIHsKLSAgICBCeXRlU2l6ZUNvbnNpc3RlbmN5RXJyb3IoYnl0ZV9zaXplLCBCeXRlU2l6ZSgpLCBlbmQgLSBzdGFydCk7CisgICAgQnl0ZVNpemVDb25zaXN0ZW5jeUVycm9yKGJ5dGVfc2l6ZSwgQnl0ZVNpemUoKSwgZW5kIC0gc3RhcnQsICp0aGlzKTsKICAgfQogICByZXR1cm4gdHJ1ZTsKIH0KIAogc3RyaW5nIE1lc3NhZ2VMaXRlOjpTZXJpYWxpemVBc1N0cmluZygpIGNvbnN0IHsKICAgLy8gSWYgdGhlIGNvbXBpbGVyIGltcGxlbWVudHMgdGhlIChOYW1lZCkgUmV0dXJuIFZhbHVlIE9wdGltaXphdGlvbiwKLSAgLy8gdGhlIGxvY2FsIHZhcmlhYmxlICdyZXN1bHQnIHdpbGwgbm90IGFjdHVhbGx5IHJlc2lkZSBvbiB0aGUgc3RhY2sKKyAgLy8gdGhlIGxvY2FsIHZhcmlhYmxlICdvdXRwdXQnIHdpbGwgbm90IGFjdHVhbGx5IHJlc2lkZSBvbiB0aGUgc3RhY2sKICAgLy8gb2YgdGhpcyBmdW5jdGlvbiwgYnV0IHdpbGwgYmUgb3ZlcmxhaWQgd2l0aCB0aGUgb2JqZWN0IHRoYXQgdGhlCiAgIC8vIGNhbGxlciBzdXBwbGllZCBmb3IgdGhlIHJldHVybiB2YWx1ZSB0byBiZSBjb25zdHJ1Y3RlZCBpbi4KICAgc3RyaW5nIG91dHB1dDsKQEAgLTMzMCw1ICszNTAsMjMgQEAKICAgcmV0dXJuIG91dHB1dDsKIH0KIAorbmFtZXNwYWNlIGludGVybmFsIHsKK3RlbXBsYXRlPD4KK01lc3NhZ2VMaXRlKiBHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+OjpOZXdGcm9tUHJvdG90eXBlKAorICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsIGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gcHJvdG90eXBlLT5OZXcoYXJlbmEpOworfQordGVtcGxhdGUgPD4KK3ZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6TWVyZ2UoY29uc3QgTWVzc2FnZUxpdGUmIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VMaXRlKiB0bykgeworICB0by0+Q2hlY2tUeXBlQW5kTWVyZ2VGcm9tKGZyb20pOworfQordGVtcGxhdGU8Pgordm9pZCBHZW5lcmljVHlwZUhhbmRsZXI8c3RyaW5nPjo6TWVyZ2UoY29uc3Qgc3RyaW5nJiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdG8pIHsKKyAgKnRvID0gZnJvbTsKK30KK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmgKaW5kZXggZWJmNGJhMy4uNGMxNmY0YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQwLDEwICs0MCwxNyBAQAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUVTU0FHRV9MSVRFX0hfXwogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4KKwogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisgIGNsYXNzIEFyZW5hOworbmFtZXNwYWNlIGlvIHsKKyAgY2xhc3MgQ29kZWRJbnB1dFN0cmVhbTsKKyAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07CisgIGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07CisgIGNsYXNzIFplcm9Db3B5T3V0cHV0U3RyZWFtOworfQogCiAvLyBJbnRlcmZhY2UgdG8gbGlnaHQgd2VpZ2h0IHByb3RvY29sIG1lc3NhZ2VzLgogLy8KQEAgLTgyLDYgKzg5LDI3IEBACiAgIC8vIGNhbGxlci4KICAgdmlydHVhbCBNZXNzYWdlTGl0ZSogTmV3KCkgY29uc3QgPSAwOwogCisgIC8vIENvbnN0cnVjdCBhIG5ldyBpbnN0YW5jZSBvbiB0aGUgYXJlbmEuIE93bmVyc2hpcCBpcyBwYXNzZWQgdG8gdGhlIGNhbGxlcgorICAvLyBpZiBhcmVuYSBpcyBhIE5VTEwuIERlZmF1bHQgaW1wbGVtZW50YXRpb24gZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5LgorICB2aXJ0dWFsIE1lc3NhZ2VMaXRlKiBOZXcoOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogYXJlbmEpIGNvbnN0OworCisgIC8vIEdldCB0aGUgYXJlbmEsIGlmIGFueSwgYXNzb2NpYXRlZCB3aXRoIHRoaXMgbWVzc2FnZS4gVmlydHVhbCBtZXRob2QKKyAgLy8gcmVxdWlyZWQgZm9yIGdlbmVyaWMgb3BlcmF0aW9ucyBidXQgbW9zdCBhcmVuYS1yZWxhdGVkIG9wZXJhdGlvbnMgc2hvdWxkCisgIC8vIHVzZSB0aGUgR2V0QXJlbmFOb1ZpcnR1YWwoKSBnZW5lcmF0ZWQtY29kZSBtZXRob2QuIERlZmF1bHQgaW1wbGVtZW50YXRpb24KKyAgLy8gdG8gcmVkdWNlIGNvZGUgc2l6ZSBieSBhdm9pZGluZyB0aGUgbmVlZCBmb3IgcGVyLXR5cGUgaW1wbGVtZW50YXRpb25zIHdoZW4KKyAgLy8gdHlwZXMgZG8gbm90IGltcGxlbWVudCBhcmVuYSBzdXBwb3J0LgorICB2aXJ0dWFsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdldEFyZW5hKCkgY29uc3QgeyByZXR1cm4gTlVMTDsgfQorCisgIC8vIEdldCBhIHBvaW50ZXIgdGhhdCBtYXkgYmUgZXF1YWwgdG8gdGhpcyBtZXNzYWdlJ3MgYXJlbmEsIG9yIG1heSBub3QgYmUuIElmCisgIC8vIHRoZSB2YWx1ZSByZXR1cm5lZCBieSB0aGlzIG1ldGhvZCBpcyBlcXVhbCB0byBzb21lIGFyZW5hIHBvaW50ZXIsIHRoZW4gdGhpcworICAvLyBtZXNzYWdlIGlzIG9uIHRoYXQgYXJlbmE7IGhvd2V2ZXIsIGlmIHRoaXMgbWVzc2FnZSBpcyBvbiBzb21lIGFyZW5hLCB0aGlzCisgIC8vIG1ldGhvZCBtYXkgb3IgbWF5IG5vdCByZXR1cm4gdGhhdCBhcmVuYSdzIHBvaW50ZXIuIEFzIGEgdHJhZGVvZmYsIHRoaXMKKyAgLy8gbWV0aG9kIG1heSBiZSBtb3JlIGVmZmljaWVudCB0aGFuIEdldEFyZW5hKCkuIFRoZSBpbnRlbnQgaXMgdG8gYWxsb3cKKyAgLy8gdW5kZXJseWluZyByZXByZXNlbnRhdGlvbnMgdGhhdCB1c2UgZS5nLiB0YWdnZWQgcG9pbnRlcnMgdG8gc29tZXRpbWVzIHN0b3JlCisgIC8vIHRoZSBhcmVuYSBwb2ludGVyIGRpcmVjdGx5LCBhbmQgc29tZXRpbWVzIGluIGEgbW9yZSBpbmRpcmVjdCB3YXksIGFuZCBhbGxvdworICAvLyBhIGZhc3RwYXRoIGNvbXBhcmlzb24gYWdhaW5zdCB0aGUgYXJlbmEgcG9pbnRlciB3aGVuIGl0J3MgZWFzeSB0byBvYnRhaW4uCisgIHZpcnR1YWwgdm9pZCogR2V0TWF5YmVBcmVuYVBvaW50ZXIoKSBjb25zdCB7IHJldHVybiBHZXRBcmVuYSgpOyB9CisKICAgLy8gQ2xlYXIgYWxsIGZpZWxkcyBvZiB0aGUgbWVzc2FnZSBhbmQgc2V0IHRoZW0gdG8gdGhlaXIgZGVmYXVsdCB2YWx1ZXMuCiAgIC8vIENsZWFyKCkgYXZvaWRzIGZyZWVpbmcgbWVtb3J5LCBhc3N1bWluZyB0aGF0IGFueSBtZW1vcnkgYWxsb2NhdGVkCiAgIC8vIHRvIGhvbGQgcGFydHMgb2YgdGhlIG1lc3NhZ2Ugd2lsbCBiZSBuZWVkZWQgYWdhaW4gdG8gaG9sZCB0aGUgbmV4dApAQCAtMTAzLDExICsxMzEsMTMgQEAKIAogICAvLyBQYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogICAvLyBNZXRob2RzIGZvciBwYXJzaW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlIGFyZQotICAvLyBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgTWVyZ2VGcm9tQ29kZWRTdHJlYW0oKS4KKyAgLy8ganVzdCBzaW1wbGUgd3JhcHBlcnMgYXJvdW5kIE1lcmdlRnJvbUNvZGVkU3RyZWFtKCkuICBDbGVhcigpIHdpbGwgYmUgY2FsbGVkCisgIC8vIGJlZm9yZSBtZXJnaW5nIHRoZSBpbnB1dC4KIAotICAvLyBGaWxsIHRoZSBtZXNzYWdlIHdpdGggYSBwcm90b2NvbCBidWZmZXIgcGFyc2VkIGZyb20gdGhlIGdpdmVuIGlucHV0Ci0gIC8vIHN0cmVhbS4gIFJldHVybnMgZmFsc2Ugb24gYSByZWFkIGVycm9yIG9yIGlmIHRoZSBpbnB1dCBpcyBpbiB0aGUKLSAgLy8gd3JvbmcgZm9ybWF0LgorICAvLyBGaWxsIHRoZSBtZXNzYWdlIHdpdGggYSBwcm90b2NvbCBidWZmZXIgcGFyc2VkIGZyb20gdGhlIGdpdmVuIGlucHV0IHN0cmVhbS4KKyAgLy8gUmV0dXJucyBmYWxzZSBvbiBhIHJlYWQgZXJyb3Igb3IgaWYgdGhlIGlucHV0IGlzIGluIHRoZSB3cm9uZyBmb3JtYXQuICBBCisgIC8vIHN1Y2Nlc3NmdWwgcmV0dXJuIGRvZXMgbm90IGluZGljYXRlIHRoZSBlbnRpcmUgaW5wdXQgaXMgY29uc3VtZWQsIGVuc3VyZQorICAvLyB5b3UgY2FsbCBDb25zdW1lZEVudGlyZU1lc3NhZ2UoKSB0byBjaGVjayB0aGF0IGlmIGFwcGxpY2FibGUuCiAgIGJvb2wgUGFyc2VGcm9tQ29kZWRTdHJlYW0oaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKICAgLy8gTGlrZSBQYXJzZUZyb21Db2RlZFN0cmVhbSgpLCBidXQgYWNjZXB0cyBtZXNzYWdlcyB0aGF0IGFyZSBtaXNzaW5nCiAgIC8vIHJlcXVpcmVkIGZpZWxkcy4KQEAgLTEyNiw3ICsxNTYsMTEgQEAKICAgLy8gbWlzc2luZyByZXF1aXJlZCBmaWVsZHMuCiAgIGJvb2wgUGFyc2VQYXJ0aWFsRnJvbUJvdW5kZWRaZXJvQ29weVN0cmVhbShpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgc2l6ZSk7Ci0gIC8vIFBhcnNlIGEgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5lZCBpbiBhIHN0cmluZy4KKyAgLy8gUGFyc2VzIGEgcHJvdG9jb2wgYnVmZmVyIGNvbnRhaW5lZCBpbiBhIHN0cmluZy4gUmV0dXJucyB0cnVlIG9uIHN1Y2Nlc3MuCisgIC8vIFRoaXMgZnVuY3Rpb24gdGFrZXMgYSBzdHJpbmcgaW4gdGhlIChub24taHVtYW4tcmVhZGFibGUpIGJpbmFyeSB3aXJlCisgIC8vIGZvcm1hdCwgbWF0Y2hpbmcgdGhlIGVuY29kaW5nIG91dHB1dCBieSBNZXNzYWdlTGl0ZTo6U2VyaWFsaXplVG9TdHJpbmcoKS4KKyAgLy8gSWYgeW91J2QgbGlrZSB0byBjb252ZXJ0IGEgaHVtYW4tcmVhZGFibGUgc3RyaW5nIGludG8gYSBwcm90b2NvbCBidWZmZXIKKyAgLy8gb2JqZWN0LCBzZWUgZ29vZ2xlOjpwcm90b2J1Zjo6VGV4dEZvcm1hdDo6UGFyc2VGcm9tU3RyaW5nKCkuCiAgIGJvb2wgUGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgZGF0YSk7CiAgIC8vIExpa2UgUGFyc2VGcm9tU3RyaW5nKCksIGJ1dCBhY2NlcHRzIG1lc3NhZ2VzIHRoYXQgYXJlIG1pc3NpbmcKICAgLy8gcmVxdWlyZWQgZmllbGRzLgpAQCAtMTU4LDYgKzE5Miw3IEBACiAgIC8vIGZvbGxvd2VkIGJ5IElzSW5pdGlhbGl6ZWQoKS4KICAgdmlydHVhbCBib29sIE1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpID0gMDsKIAorCiAgIC8vIFNlcmlhbGl6YXRpb24gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAgIC8vIE1ldGhvZHMgZm9yIHNlcmlhbGl6aW5nIGluIHByb3RvY29sIGJ1ZmZlciBmb3JtYXQuICBNb3N0IG9mIHRoZXNlCiAgIC8vIGFyZSBqdXN0IHNpbXBsZSB3cmFwcGVycyBhcm91bmQgQnl0ZVNpemUoKSBhbmQgU2VyaWFsaXplV2l0aENhY2hlZFNpemVzKCkuCkBAIC0yMDMsNiArMjM4LDkgQEAKICAgLy8gQ29tcHV0ZXMgdGhlIHNlcmlhbGl6ZWQgc2l6ZSBvZiB0aGUgbWVzc2FnZS4gIFRoaXMgcmVjdXJzaXZlbHkgY2FsbHMKICAgLy8gQnl0ZVNpemUoKSBvbiBhbGwgZW1iZWRkZWQgbWVzc2FnZXMuICBJZiBhIHN1YmNsYXNzIGRvZXMgbm90IG92ZXJyaWRlCiAgIC8vIHRoaXMsIGl0IE1VU1Qgb3ZlcnJpZGUgU2V0Q2FjaGVkU2l6ZSgpLgorICAvLworICAvLyBCeXRlU2l6ZSgpIGlzIGdlbmVyYWxseSBsaW5lYXIgaW4gdGhlIG51bWJlciBvZiBmaWVsZHMgZGVmaW5lZCBmb3IgdGhlCisgIC8vIHByb3RvLgogICB2aXJ0dWFsIGludCBCeXRlU2l6ZSgpIGNvbnN0ID0gMDsKIAogICAvLyBTZXJpYWxpemVzIHRoZSBtZXNzYWdlIHdpdGhvdXQgcmVjb21wdXRpbmcgdGhlIHNpemUuICBUaGUgbWVzc2FnZSBtdXN0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWVzc2FnZV91bml0dGVzdC5jYwppbmRleCAzM2I5ZTc3Li5kNjY4YTFhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXNzYWdlX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQ1LDE0ICs0NSwxNyBAQAogI2luY2x1ZGUgPHNzdHJlYW0+CiAjaW5jbHVkZSA8ZnN0cmVhbT4KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaD4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKQEAgLTIwNSw3ICsyMDgsMjkgQEAKICAgRVhQRUNUX0VRKCJhLCBiLCBjIiwgbWVzc2FnZS5Jbml0aWFsaXphdGlvbkVycm9yU3RyaW5nKCkpOwogfQogCi0jaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QgIC8vIGRlYXRoIHRlc3RzIGRvIG5vdCB3b3JrIG9uIFdpbmRvd3MgeWV0LgorVEVTVChNZXNzYWdlVGVzdCwgRHluYW1pY0Nhc3RUb0dlbmVyYXRlZCkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHRlc3RfYWxsX3R5cGVzOworCisgIGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXIgPSAmdGVzdF9hbGxfdHlwZXM7CisgIEVYUEVDVF9FUSgmdGVzdF9hbGxfdHlwZXMsCisgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6RHluYW1pY0Nhc3RUb0dlbmVyYXRlZDx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPigKKyAgICAgICAgICAgICAgICB0ZXN0X2FsbF90eXBlc19wb2ludGVyKSk7CisgIEVYUEVDVF9FUShOVUxMLAorICAgICAgICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OkR5bmFtaWNDYXN0VG9HZW5lcmF0ZWQ8dW5pdHRlc3Q6OlRlc3RSZXF1aXJlZD4oCisgICAgICAgICAgICAgICAgdGVzdF9hbGxfdHlwZXNfcG9pbnRlcikpOworCisgIGNvbnN0IGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2UqIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXJfY29uc3QgPSAmdGVzdF9hbGxfdHlwZXM7CisgIEVYUEVDVF9FUSgKKyAgICAgICZ0ZXN0X2FsbF90eXBlcywKKyAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+KAorICAgICAgICAgIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXJfY29uc3QpKTsKKyAgRVhQRUNUX0VRKAorICAgICAgTlVMTCwKKyAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpEeW5hbWljQ2FzdFRvR2VuZXJhdGVkPGNvbnN0IHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQ+KAorICAgICAgICAgIHRlc3RfYWxsX3R5cGVzX3BvaW50ZXJfY29uc3QpKTsKK30KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUICAvLyBkZWF0aCB0ZXN0cyBkbyBub3Qgd29yayBvbiBXaW5kb3dzIHlldC4KIAogVEVTVChNZXNzYWdlVGVzdCwgU2VyaWFsaXplRmFpbHNJZk5vdEluaXRpYWxpemVkKSB7CiAgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKQEAgLTIyMiw3ICsyNDcsNDQgQEAKICAgICAiZmllbGRzOiBhLCBiLCBjIik7CiB9CiAKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKK1RFU1QoTWVzc2FnZVRlc3QsIENoZWNrT3ZlcmZsb3cpIHsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICAvLyBDcmVhdGUgYSBtZXNzYWdlIHdpdGggc2l6ZSBqdXN0IG92ZXIgMkdCLiBUaGlzIHRyaWdnZXJzIGludGVnZXIgb3ZlcmZsb3cKKyAgLy8gd2hlbiBjb21wdXRpbmcgbWVzc2FnZSBzaXplLgorICBjb25zdCBzdHJpbmcgZGF0YSgxMDI0LCAneCcpOworICBDb3JkIG9uZV9tZWdhYnl0ZTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDI0OyBpKyspIHsKKyAgICBvbmVfbWVnYWJ5dGUuQXBwZW5kKGRhdGEpOworICB9CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAyICogMTAyNCArIDE7ICsraSkgeworICAgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2NvcmQoKS0+Q29weUZyb20ob25lX21lZ2FieXRlKTsKKyAgfQorCisgIENvcmQgc2VyaWFsaXplZDsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuQXBwZW5kVG9Db3JkKCZzZXJpYWxpemVkKSk7Cit9CisKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKworbmFtZXNwYWNlIHsKKworY2xhc3MgTmVnYXRpdmVCeXRlU2l6ZSA6IHB1YmxpYyB1bml0dGVzdDo6VGVzdFJlcXVpcmVkIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgaW50IEJ5dGVTaXplKCkgY29uc3QgeyByZXR1cm4gLTE7IH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitURVNUKE1lc3NhZ2VUZXN0LCBTZXJpYWxpemF0aW9uRmFpbHNPbk5lZ2F0aXZlQnl0ZVNpemUpIHsKKyAgTmVnYXRpdmVCeXRlU2l6ZSBtZXNzYWdlOworICBzdHJpbmcgc3RyaW5nX291dHB1dDsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuQXBwZW5kUGFydGlhbFRvU3RyaW5nKCZzdHJpbmdfb3V0cHV0KSk7CisKKyAgaW86OkFycmF5T3V0cHV0U3RyZWFtIGNvZGVkX3Jhd19vdXRwdXQoTlVMTCwgMTAwKTsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIGNvZGVkX291dHB1dCgmY29kZWRfcmF3X291dHB1dCk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlNlcmlhbGl6ZVBhcnRpYWxUb0NvZGVkU3RyZWFtKCZjb2RlZF9vdXRwdXQpKTsKK30KIAogVEVTVChNZXNzYWdlVGVzdCwgQnlwYXNzSW5pdGlhbGl6YXRpb25DaGVja09uU2VyaWFsaXplKSB7CiAgIHVuaXR0ZXN0OjpUZXN0UmVxdWlyZWQgbWVzc2FnZTsKQEAgLTI1Nyw2ICszMTksMTMzIEBACiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLlBhcnNlRnJvbUFycmF5KCJcMDE0IiwgMSkpOwogfQogCituYW1lc3BhY2UgeworCit2b2lkIEV4cGVjdE1lc3NhZ2VNZXJnZWQoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgeworICBFWFBFQ1RfRVEoMywgbWVzc2FnZS5vcHRpb25hbF9pbnQzMigpKTsKKyAgRVhQRUNUX0VRKDIsIG1lc3NhZ2Uub3B0aW9uYWxfaW50NjQoKSk7CisgIEVYUEVDVF9FUSgiaGVsbG8iLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZygpKTsKK30KKwordm9pZCBBc3NpZ25QYXJzaW5nTWVyZ2VNZXNzYWdlcygKKyAgICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtc2cxLAorICAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1zZzIsCisgICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbXNnMykgeworICBtc2cxLT5zZXRfb3B0aW9uYWxfaW50MzIoMSk7CisgIG1zZzItPnNldF9vcHRpb25hbF9pbnQ2NCgyKTsKKyAgbXNnMy0+c2V0X29wdGlvbmFsX2ludDMyKDMpOworICBtc2czLT5zZXRfb3B0aW9uYWxfc3RyaW5nKCJoZWxsbyIpOworfQorCit9ICAvLyBuYW1lc3BhY2UKKworLy8gVGVzdCB0aGF0IGlmIGFuIG9wdGlvbmFsIG9yIHJlcXVpcmVkIG1lc3NhZ2UvZ3JvdXAgZmllbGQgYXBwZWFycyBtdWx0aXBsZQorLy8gdGltZXMgaW4gdGhlIGlucHV0LCB0aGV5IG5lZWQgdG8gYmUgbWVyZ2VkLgorVEVTVChNZXNzYWdlVGVzdCwgUGFyc2luZ01lcmdlKSB7CisgIHVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlOjpSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciBnZW5lcmF0b3I7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1zZzE7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1zZzI7CisgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1zZzM7CisKKyNkZWZpbmUgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKEZJRUxEKSAgICAgICAgICAgICAgICBcCisgIG1zZzEgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKTsgICAgICAgICAgICAgICAgICAgXAorICBtc2cyID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCk7ICAgICAgICAgICAgICAgICAgIFwKKyAgbXNnMyA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpOyAgICAgICAgICAgICAgICAgICBcCisgIEFzc2lnblBhcnNpbmdNZXJnZU1lc3NhZ2VzKG1zZzEsIG1zZzIsIG1zZzMpCisKKyAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGZpZWxkMSk7CisgIEFTU0lHTl9SRVBFQVRFRF9GSUVMRChmaWVsZDIpOworICBBU1NJR05fUkVQRUFURURfRklFTEQoZmllbGQzKTsKKyAgQVNTSUdOX1JFUEVBVEVEX0ZJRUxEKGV4dDEpOworICBBU1NJR05fUkVQRUFURURfRklFTEQoZXh0Mik7CisKKyN1bmRlZiBBU1NJR05fUkVQRUFURURfRklFTEQKKyNkZWZpbmUgQVNTSUdOX1JFUEVBVEVEX0dST1VQKEZJRUxEKSAgICAgICAgICAgICAgICBcCisgIG1zZzEgPSBnZW5lcmF0b3IuYWRkXyMjRklFTEQoKS0+bXV0YWJsZV9maWVsZDEoKTsgXAorICBtc2cyID0gZ2VuZXJhdG9yLmFkZF8jI0ZJRUxEKCktPm11dGFibGVfZmllbGQxKCk7IFwKKyAgbXNnMyA9IGdlbmVyYXRvci5hZGRfIyNGSUVMRCgpLT5tdXRhYmxlX2ZpZWxkMSgpOyBcCisgIEFzc2lnblBhcnNpbmdNZXJnZU1lc3NhZ2VzKG1zZzEsIG1zZzIsIG1zZzMpCisKKyAgQVNTSUdOX1JFUEVBVEVEX0dST1VQKGdyb3VwMSk7CisgIEFTU0lHTl9SRVBFQVRFRF9HUk9VUChncm91cDIpOworCisjdW5kZWYgQVNTSUdOX1JFUEVBVEVEX0dST1VQCisKKyAgc3RyaW5nIGJ1ZmZlcjsKKyAgZ2VuZXJhdG9yLlNlcmlhbGl6ZVRvU3RyaW5nKCZidWZmZXIpOworICB1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZSBwYXJzaW5nX21lcmdlOworICBwYXJzaW5nX21lcmdlLlBhcnNlRnJvbVN0cmluZyhidWZmZXIpOworCisgIC8vIFJlcXVpcmVkIGFuZCBvcHRpb25hbCBmaWVsZHMgc2hvdWxkIGJlIG1lcmdlZC4KKyAgRXhwZWN0TWVzc2FnZU1lcmdlZChwYXJzaW5nX21lcmdlLnJlcXVpcmVkX2FsbF90eXBlcygpKTsKKyAgRXhwZWN0TWVzc2FnZU1lcmdlZChwYXJzaW5nX21lcmdlLm9wdGlvbmFsX2FsbF90eXBlcygpKTsKKyAgRXhwZWN0TWVzc2FnZU1lcmdlZCgKKyAgICAgIHBhcnNpbmdfbWVyZ2Uub3B0aW9uYWxncm91cCgpLm9wdGlvbmFsX2dyb3VwX2FsbF90eXBlcygpKTsKKyAgRXhwZWN0TWVzc2FnZU1lcmdlZCgKKyAgICAgIHBhcnNpbmdfbWVyZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpUZXN0UGFyc2luZ01lcmdlOjpvcHRpb25hbF9leHQpKTsKKworICAvLyBSZXBlYXRlZCBmaWVsZHMgc2hvdWxkIG5vdCBiZSBtZXJnZWQuCisgIEVYUEVDVF9FUSgzLCBwYXJzaW5nX21lcmdlLnJlcGVhdGVkX2FsbF90eXBlc19zaXplKCkpOworICBFWFBFQ1RfRVEoMywgcGFyc2luZ19tZXJnZS5yZXBlYXRlZGdyb3VwX3NpemUoKSk7CisgIEVYUEVDVF9FUSgzLCBwYXJzaW5nX21lcmdlLkV4dGVuc2lvblNpemUoCisgICAgICB1bml0dGVzdDo6VGVzdFBhcnNpbmdNZXJnZTo6cmVwZWF0ZWRfZXh0KSk7Cit9CisKK1RFU1QoTWVzc2FnZVRlc3QsIE1lcmdlRnJvbSkgeworICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIHNvdXJjZTsKKyAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBkZXN0OworCisgIC8vIE9wdGlvbmFsIGZpZWxkcworICBzb3VyY2Uuc2V0X29wdGlvbmFsX2ludDMyKDEpOyAgLy8gb25seSBzb3VyY2UKKyAgc291cmNlLnNldF9vcHRpb25hbF9pbnQ2NCgyKTsgIC8vIGJvdGggc291cmNlIGFuZCBkZXN0CisgIGRlc3Quc2V0X29wdGlvbmFsX2ludDY0KDMpOworICBkZXN0LnNldF9vcHRpb25hbF91aW50MzIoNCk7ICAgLy8gb25seSBkZXN0CisKKyAgLy8gT3B0aW9uYWwgZmllbGRzIHdpdGggZGVmYXVsdHMKKyAgc291cmNlLnNldF9kZWZhdWx0X2ludDMyKDEzKTsgIC8vIG9ubHkgc291cmNlCisgIHNvdXJjZS5zZXRfZGVmYXVsdF9pbnQ2NCgxNCk7ICAvLyBib3RoIHNvdXJjZSBhbmQgZGVzdAorICBkZXN0LnNldF9kZWZhdWx0X2ludDY0KDE1KTsKKyAgZGVzdC5zZXRfZGVmYXVsdF91aW50MzIoMTYpOyAgIC8vIG9ubHkgZGVzdAorCisgIC8vIFJlcGVhdGVkIGZpZWxkcworICBzb3VyY2UuYWRkX3JlcGVhdGVkX2ludDMyKDUpOyAgLy8gb25seSBzb3VyY2UKKyAgc291cmNlLmFkZF9yZXBlYXRlZF9pbnQzMig2KTsKKyAgc291cmNlLmFkZF9yZXBlYXRlZF9pbnQ2NCg3KTsgIC8vIGJvdGggc291cmNlIGFuZCBkZXN0CisgIHNvdXJjZS5hZGRfcmVwZWF0ZWRfaW50NjQoOCk7CisgIGRlc3QuYWRkX3JlcGVhdGVkX2ludDY0KDkpOworICBkZXN0LmFkZF9yZXBlYXRlZF9pbnQ2NCgxMCk7CisgIGRlc3QuYWRkX3JlcGVhdGVkX3VpbnQzMigxMSk7ICAvLyBvbmx5IGRlc3QKKyAgZGVzdC5hZGRfcmVwZWF0ZWRfdWludDMyKDEyKTsKKworICBkZXN0Lk1lcmdlRnJvbShzb3VyY2UpOworCisgIC8vIE9wdGlvbmFsIGZpZWxkczogc291cmNlIG92ZXJ3cml0ZXMgZGVzdCBpZiBzb3VyY2UgaXMgc3BlY2lmaWVkCisgIEVYUEVDVF9FUSgxLCBkZXN0Lm9wdGlvbmFsX2ludDMyKCkpOyAgLy8gb25seSBzb3VyY2U6IHVzZSBzb3VyY2UKKyAgRVhQRUNUX0VRKDIsIGRlc3Qub3B0aW9uYWxfaW50NjQoKSk7ICAvLyBzb3VyY2UgYW5kIGRlc3Q6IHVzZSBzb3VyY2UKKyAgRVhQRUNUX0VRKDQsIGRlc3Qub3B0aW9uYWxfdWludDMyKCkpOyAgLy8gb25seSBkZXN0OiB1c2UgZGVzdAorICBFWFBFQ1RfRVEoMCwgZGVzdC5vcHRpb25hbF91aW50NjQoKSk7ICAvLyBuZWl0aGVyOiB1c2UgZGVmYXVsdAorCisgIC8vIE9wdGlvbmFsIGZpZWxkcyB3aXRoIGRlZmF1bHRzCisgIEVYUEVDVF9FUSgxMywgZGVzdC5kZWZhdWx0X2ludDMyKCkpOyAgLy8gb25seSBzb3VyY2U6IHVzZSBzb3VyY2UKKyAgRVhQRUNUX0VRKDE0LCBkZXN0LmRlZmF1bHRfaW50NjQoKSk7ICAvLyBzb3VyY2UgYW5kIGRlc3Q6IHVzZSBzb3VyY2UKKyAgRVhQRUNUX0VRKDE2LCBkZXN0LmRlZmF1bHRfdWludDMyKCkpOyAgLy8gb25seSBkZXN0OiB1c2UgZGVzdAorICBFWFBFQ1RfRVEoNDQsIGRlc3QuZGVmYXVsdF91aW50NjQoKSk7ICAvLyBuZWl0aGVyOiB1c2UgZGVmYXVsdAorCisgIC8vIFJlcGVhdGVkIGZpZWxkczogY29uY2F0ZW5hdGUgc291cmNlIG9udG8gdGhlIGVuZCBvZiBkZXN0CisgIEFTU0VSVF9FUSgyLCBkZXN0LnJlcGVhdGVkX2ludDMyX3NpemUoKSk7CisgIEVYUEVDVF9FUSg1LCBkZXN0LnJlcGVhdGVkX2ludDMyKDApKTsKKyAgRVhQRUNUX0VRKDYsIGRlc3QucmVwZWF0ZWRfaW50MzIoMSkpOworICBBU1NFUlRfRVEoNCwgZGVzdC5yZXBlYXRlZF9pbnQ2NF9zaXplKCkpOworICBFWFBFQ1RfRVEoOSwgIGRlc3QucmVwZWF0ZWRfaW50NjQoMCkpOworICBFWFBFQ1RfRVEoMTAsIGRlc3QucmVwZWF0ZWRfaW50NjQoMSkpOworICBFWFBFQ1RfRVEoNywgIGRlc3QucmVwZWF0ZWRfaW50NjQoMikpOworICBFWFBFQ1RfRVEoOCwgIGRlc3QucmVwZWF0ZWRfaW50NjQoMykpOworICBBU1NFUlRfRVEoMiwgZGVzdC5yZXBlYXRlZF91aW50MzJfc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDExLCBkZXN0LnJlcGVhdGVkX3VpbnQzMigwKSk7CisgIEVYUEVDVF9FUSgxMiwgZGVzdC5yZXBlYXRlZF91aW50MzIoMSkpOworICBBU1NFUlRfRVEoMCwgZGVzdC5yZXBlYXRlZF91aW50NjRfc2l6ZSgpKTsKK30KKwogVEVTVChNZXNzYWdlRmFjdG9yeVRlc3QsIEdlbmVyYXRlZEZhY3RvcnlMb29rdXApIHsKICAgRVhQRUNUX0VRKAogICAgIE1lc3NhZ2VGYWN0b3J5OjpnZW5lcmF0ZWRfZmFjdG9yeSgpLT5HZXRQcm90b3R5cGUoCkBAIC0yNzcsNSArNDY2LDYgQEAKICAgICBNZXNzYWdlRmFjdG9yeTo6Z2VuZXJhdGVkX2ZhY3RvcnkoKS0+R2V0UHJvdG90eXBlKGRlc2NyaXB0b3IpID09IE5VTEwpOwogfQogCisKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvbWV0YWRhdGEuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9tZXRhZGF0YS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9ub19maWVsZF9wcmVzZW5jZV90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL25vX2ZpZWxkX3ByZXNlbmNlX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3BhY2thZ2VfaW5mby5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmgKaW5kZXggNjBjZDM5OS4uOTM1ZTk2MyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcGFja2FnZV9pbmZvLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcmVzZXJ2ZV91bmtub3duX2VudW1fdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcHJlc2VydmVfdW5rbm93bl9lbnVtX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9wcm90bzNfYXJlbmFfbGl0ZV91bml0dGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX2xpdGVfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19hcmVuYV91bml0dGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2FyZW5hX3VuaXR0ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcHJvdG8zX2xpdGVfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Byb3RvM19saXRlX3VuaXR0ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb24uaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX2ludGVybmFsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX2ludGVybmFsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9pbnRlcm5hbC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX2ludGVybmFsLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MKaW5kZXggODk3YzBkNy4uNDYyOWRlYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDggKzMyLDEyIEBACiAvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KIApAQCAtNTIsNyArNTYsOSBAQAogCiAgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBmcm9tLkdldERlc2NyaXB0b3IoKTsKICAgR09PR0xFX0NIRUNLX0VRKHRvLT5HZXREZXNjcmlwdG9yKCksIGRlc2NyaXB0b3IpCi0gICAgPDwgIlRyaWVkIHRvIG1lcmdlIG1lc3NhZ2VzIG9mIGRpZmZlcmVudCB0eXBlcy4iOworICAgIDw8ICJUcmllZCB0byBtZXJnZSBtZXNzYWdlcyBvZiBkaWZmZXJlbnQgdHlwZXMgIgorICAgIDw8ICIobWVyZ2UgIiA8PCBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKQorICAgIDw8ICIgdG8gIiA8PCB0by0+R2V0RGVzY3JpcHRvcigpLT5mdWxsX25hbWUoKSA8PCAiKSI7CiAKICAgY29uc3QgUmVmbGVjdGlvbiogZnJvbV9yZWZsZWN0aW9uID0gZnJvbS5HZXRSZWZsZWN0aW9uKCk7CiAgIGNvbnN0IFJlZmxlY3Rpb24qIHRvX3JlZmxlY3Rpb24gPSB0by0+R2V0UmVmbGVjdGlvbigpOwpAQCAtMTUxLDExICsxNTcsMTIgQEAKICAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyBpKyspIHsKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOwogICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgeworCiAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKICAgICAgICAgaW50IHNpemUgPSByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgZmllbGQpOwogCi0gICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7Ci0gICAgICAgICAgaWYgKCFyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGkpCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgICAgaWYgKCFyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGopCiAgICAgICAgICAgICAgICAgICAgICAgICAgIC5Jc0luaXRpYWxpemVkKCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICB9CkBAIC0xODMsOCArMTkwLDggQEAKICAgICBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewogICAgICAgICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZSgqbWVzc2FnZSwgZmllbGQpOwotICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgewotICAgICAgICAgIHJlZmxlY3Rpb24tPk11dGFibGVSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGkpCisgICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgc2l6ZTsgaisrKSB7CisgICAgICAgICAgcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaikKICAgICAgICAgICAgICAgICAgICAgLT5EaXNjYXJkVW5rbm93bkZpZWxkcygpOwogICAgICAgICB9CiAgICAgICB9IGVsc2UgewpAQCAtMjQwLDExICsyNDcsMTEgQEAKICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewogICAgICAgICBpbnQgc2l6ZSA9IHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBmaWVsZCk7CiAKLSAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzaXplOyBpKyspIHsKKyAgICAgICAgZm9yIChpbnQgaiA9IDA7IGogPCBzaXplOyBqKyspIHsKICAgICAgICAgICBjb25zdCBNZXNzYWdlJiBzdWJfbWVzc2FnZSA9Ci0gICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGkpOworICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkLCBqKTsKICAgICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoc3ViX21lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgaSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN1Yk1lc3NhZ2VQcmVmaXgocHJlZml4LCBmaWVsZCwgaiksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9ycyk7CiAgICAgICAgIH0KICAgICAgIH0gZWxzZSB7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVmbGVjdGlvbl9vcHMuaAppbmRleCAzNTVhMGE1Li40Nzc1OTExIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wcy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM4LDYgKzM4LDcgQEAKICNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1JFRkxFQ1RJT05fT1BTX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfUkVGTEVDVElPTl9PUFNfSF9fCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2UuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZWZsZWN0aW9uX29wc191bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCmluZGV4IDFjZDU2ZjEuLjg4ZDZiZmIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlZmxlY3Rpb25fb3BzX3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNyw2ICszNyw3IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CkBAIC03OCw2ICs3OSwxOCBAQAogICBUZXN0VXRpbDo6RXhwZWN0QWxsRXh0ZW5zaW9uc1NldChtZXNzYWdlMik7CiB9CiAKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIENvcHlPbmVvZikgeworICB1bml0dGVzdDo6VGVzdE9uZW9mMiBtZXNzYWdlLCBtZXNzYWdlMjsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZSk7CisgIFJlZmxlY3Rpb25PcHM6OkNvcHkobWVzc2FnZSwgJm1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShtZXNzYWdlMik7CisKKyAgVGVzdFV0aWw6OlNldE9uZW9mMigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDIobWVzc2FnZSk7CisgIFJlZmxlY3Rpb25PcHM6OkNvcHkobWVzc2FnZSwgJm1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MihtZXNzYWdlMik7Cit9CisKIFRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlKSB7CiAgIC8vIE5vdGU6ICBDb3B5IGlzIGltcGxlbWVudGVkIGluIHRlcm1zIG9mIE1lcmdlKCkgc28gdGVjaG5pY2FsbHkgdGhlIENvcHkKICAgLy8gICB0ZXN0IGFscmVhZHkgdGVzdGVkIG1vc3Qgb2YgdGhpcy4KQEAgLTE1Miw3ICsxNjUsMjUgQEAKICAgRVhQRUNUX0VRKDIsIG1lc3NhZ2UxLnVua25vd25fZmllbGRzKCkuZmllbGQoMSkudmFyaW50KCkpOwogfQogCi0jaWZkZWYgR1RFU1RfSEFTX0RFQVRIX1RFU1QKK1RFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlT25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTEsIG1lc3NhZ2UyOworICBUZXN0VXRpbDo6U2V0T25lb2YxKCZtZXNzYWdlMSk7CisKKyAgLy8gTWVyZ2UgdG8gZW1wdHkgbWVzc2FnZQorICBSZWZsZWN0aW9uT3BzOjpNZXJnZShtZXNzYWdlMSwgJm1lc3NhZ2UyKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MShtZXNzYWdlMik7CisKKyAgLy8gTWVyZ2Ugd2l0aCB0aGUgc2FtZSBvbmVvZiBmaWVsZHMKKyAgUmVmbGVjdGlvbk9wczo6TWVyZ2UobWVzc2FnZTEsICZtZXNzYWdlMik7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEobWVzc2FnZTIpOworCisgIC8vIE1lcmdlIHdpdGggZGlmZmVyZW50IG9uZW9mIGZpZWxkcworICBUZXN0VXRpbDo6U2V0T25lb2YyKCZtZXNzYWdlMSk7CisgIFJlZmxlY3Rpb25PcHM6Ok1lcmdlKG1lc3NhZ2UxLCAmbWVzc2FnZTIpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQyKG1lc3NhZ2UyKTsKK30KKworI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCiAKIFRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIE1lcmdlRnJvbVNlbGYpIHsKICAgLy8gTm90ZTogIENvcHkgaXMgaW1wbGVtZW50ZWQgaW4gdGVybXMgb2YgTWVyZ2UoKSBzbyB0ZWNobmljYWxseSB0aGUgQ29weQpAQCAtMTY1LDcgKzE5Niw3IEBACiAgICAgIiZmcm9tIik7CiB9CiAKLSNlbmRpZiAgLy8gR1RFU1RfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKIAogVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgQ2xlYXIpIHsKICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwpAQCAtMjIwLDYgKzI1MSwyMyBAQAogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS51bmtub3duX2ZpZWxkcygpLmZpZWxkX2NvdW50KCkpOwogfQogCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBDbGVhck9uZW9mKSB7CisgIHVuaXR0ZXN0OjpUZXN0T25lb2YyIG1lc3NhZ2U7CisKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mQ2xlYXIobWVzc2FnZSk7CisgIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UpOworICBSZWZsZWN0aW9uT3BzOjpDbGVhcigmbWVzc2FnZSk7CisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZkNsZWFyKG1lc3NhZ2UpOworCisgIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKG1lc3NhZ2UpOworICBUZXN0VXRpbDo6U2V0T25lb2YyKCZtZXNzYWdlKTsKKyAgVGVzdFV0aWw6OkV4cGVjdE9uZW9mU2V0MihtZXNzYWdlKTsKKyAgUmVmbGVjdGlvbk9wczo6Q2xlYXIoJm1lc3NhZ2UpOworICBUZXN0VXRpbDo6RXhwZWN0T25lb2ZDbGVhcihtZXNzYWdlKTsKK30KKwogVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRGlzY2FyZFVua25vd25GaWVsZHMpIHsKICAgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOwogICBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKCZtZXNzYWdlKTsKQEAgLTM1NCwxMCArNDAyLDI2IEBACiAgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOwogfQogCitURVNUKFJlZmxlY3Rpb25PcHNUZXN0LCBPbmVvZklzSW5pdGlhbGl6ZWQpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZE9uZW9mIG1lc3NhZ2U7CisgIEVYUEVDVF9UUlVFKFJlZmxlY3Rpb25PcHM6OklzSW5pdGlhbGl6ZWQobWVzc2FnZSkpOworCisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpOworICBFWFBFQ1RfRkFMU0UoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisKKyAgbWVzc2FnZS5zZXRfZm9vX2ludCgxKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7CisKKyAgbWVzc2FnZS5tdXRhYmxlX2Zvb19tZXNzYWdlKCk7CisgIEVYUEVDVF9GQUxTRShSZWZsZWN0aW9uT3BzOjpJc0luaXRpYWxpemVkKG1lc3NhZ2UpKTsKKyAgbWVzc2FnZS5tdXRhYmxlX2Zvb19tZXNzYWdlKCktPnNldF9yZXF1aXJlZF9kb3VibGUoMC4xKTsKKyAgRVhQRUNUX1RSVUUoUmVmbGVjdGlvbk9wczo6SXNJbml0aWFsaXplZChtZXNzYWdlKSk7Cit9CisKIHN0YXRpYyBzdHJpbmcgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpIHsKICAgdmVjdG9yPHN0cmluZz4gZXJyb3JzOwogICBSZWZsZWN0aW9uT3BzOjpGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSwgIiIsICZlcnJvcnMpOwotICByZXR1cm4gSm9pblN0cmluZ3MoZXJyb3JzLCAiLCIpOworICByZXR1cm4gSm9pbihlcnJvcnMsICIsIik7CiB9CiAKIFRFU1QoUmVmbGVjdGlvbk9wc1Rlc3QsIEZpbmRJbml0aWFsaXphdGlvbkVycm9ycykgewpAQCAtMzk5LDYgKzQ2MywxMyBAQAogICAgICAgICAgICAgRmluZEluaXRpYWxpemF0aW9uRXJyb3JzKG1lc3NhZ2UpKTsKIH0KIAorVEVTVChSZWZsZWN0aW9uT3BzVGVzdCwgRmluZE9uZW9mSW5pdGlhbGl6YXRpb25FcnJvcnMpIHsKKyAgdW5pdHRlc3Q6OlRlc3RSZXF1aXJlZE9uZW9mIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9mb29fbWVzc2FnZSgpOworICBFWFBFQ1RfRVEoImZvb19tZXNzYWdlLnJlcXVpcmVkX2RvdWJsZSIsCisgICAgICAgICAgICBGaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMobWVzc2FnZSkpOworfQorCiB9ICAvLyBuYW1lc3BhY2UKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCmluZGV4IDA5Mzc3NzQuLmE2OTliMjkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMiw5ICszMiwxMiBAQAogLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewpAQCAtNDIsNTMgKzQ1LDU2IEBACiAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAKK3ZvaWQqKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6SW50ZXJuYWxFeHRlbmQoaW50IGV4dGVuZF9hbW91bnQpIHsKKyAgaW50IG5ld19zaXplID0gY3VycmVudF9zaXplXyArIGV4dGVuZF9hbW91bnQ7CisgIGlmICh0b3RhbF9zaXplXyA+PSBuZXdfc2l6ZSkgeworICAgIC8vIE4uQi46IHJlcF8gaXMgbm9uLU5VTEwgYmVjYXVzZSBleHRlbmRfYW1vdW50IGlzIGFsd2F5cyA+IDAsIGhlbmNlCisgICAgLy8gdG90YWxfc2l6ZSBtdXN0IGJlIG5vbi16ZXJvIHNpbmNlIGl0IGlzIGxvd2VyLWJvdW5kZWQgYnkgbmV3X3NpemUuCisgICAgcmV0dXJuICZyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfXTsKKyAgfQorICBSZXAqIG9sZF9yZXAgPSByZXBfOworICBBcmVuYSogYXJlbmEgPSBHZXRBcmVuYU5vVmlydHVhbCgpOworICBuZXdfc2l6ZSA9IHN0ZDo6bWF4KGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUsCisgICAgICAgICAgICAgICAgICAgICAgc3RkOjptYXgodG90YWxfc2l6ZV8gKiAyLCBuZXdfc2l6ZSkpOworICBHT09HTEVfQ0hFQ0tfTEUobmV3X3NpemUsCisgICAgICAgICAgIChzdGQ6Om51bWVyaWNfbGltaXRzPHNpemVfdD46Om1heCgpIC0ga1JlcEhlYWRlclNpemUpIC8KKyAgICAgICAgICAgc2l6ZW9mKG9sZF9yZXAtPmVsZW1lbnRzWzBdKSkKKyAgICAgIDw8ICJSZXF1ZXN0ZWQgc2l6ZSBpcyB0b28gbGFyZ2UgdG8gZml0IGludG8gc2l6ZV90LiI7CisgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgcmVwXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwKj4oCisgICAgICAgIG5ldyBjaGFyW2tSZXBIZWFkZXJTaXplICsgc2l6ZW9mKG9sZF9yZXAtPmVsZW1lbnRzWzBdKSAqIG5ld19zaXplXSk7CisgIH0gZWxzZSB7CisgICAgcmVwXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwKj4oCisgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZUFycmF5PGNoYXI+KGFyZW5hLAorICAgICAgICAgICAga1JlcEhlYWRlclNpemUgKyBzaXplb2Yob2xkX3JlcC0+ZWxlbWVudHNbMF0pICogbmV3X3NpemUpKTsKKyAgfQorICB0b3RhbF9zaXplXyA9IG5ld19zaXplOworICBpZiAob2xkX3JlcCAmJiBvbGRfcmVwLT5hbGxvY2F0ZWRfc2l6ZSA+IDApIHsKKyAgICBtZW1jcHkocmVwXy0+ZWxlbWVudHMsIG9sZF9yZXAtPmVsZW1lbnRzLAorICAgICAgICAgICBvbGRfcmVwLT5hbGxvY2F0ZWRfc2l6ZSAqIHNpemVvZihyZXBfLT5lbGVtZW50c1swXSkpOworICAgIHJlcF8tPmFsbG9jYXRlZF9zaXplID0gb2xkX3JlcC0+YWxsb2NhdGVkX3NpemU7CisgIH0gZWxzZSB7CisgICAgcmVwXy0+YWxsb2NhdGVkX3NpemUgPSAwOworICB9CisgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgZGVsZXRlIFtdIHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KG9sZF9yZXApOworICB9CisgIHJldHVybiAmcmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplX107Cit9CisKIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlc2VydmUoaW50IG5ld19zaXplKSB7Ci0gIGlmICh0b3RhbF9zaXplXyA+PSBuZXdfc2l6ZSkgcmV0dXJuOwotCi0gIHZvaWQqKiBvbGRfZWxlbWVudHMgPSBlbGVtZW50c187Ci0gIHRvdGFsX3NpemVfID0gbWF4KHRvdGFsX3NpemVfICogMiwgbmV3X3NpemUpOwotICBlbGVtZW50c18gPSBuZXcgdm9pZCpbdG90YWxfc2l6ZV9dOwotICBtZW1jcHkoZWxlbWVudHNfLCBvbGRfZWxlbWVudHMsIGFsbG9jYXRlZF9zaXplXyAqIHNpemVvZihlbGVtZW50c19bMF0pKTsKLSAgaWYgKG9sZF9lbGVtZW50cyAhPSBpbml0aWFsX3NwYWNlXykgewotICAgIGRlbGV0ZSBbXSBvbGRfZWxlbWVudHM7CisgIGlmIChuZXdfc2l6ZSA+IGN1cnJlbnRfc2l6ZV8pIHsKKyAgICBJbnRlcm5hbEV4dGVuZChuZXdfc2l6ZSAtIGN1cnJlbnRfc2l6ZV8pOwogICB9CiB9CiAKLXZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7Ci0gIHZvaWQqKiBzd2FwX2VsZW1lbnRzICAgICAgID0gZWxlbWVudHNfOwotICBpbnQgICAgc3dhcF9jdXJyZW50X3NpemUgICA9IGN1cnJlbnRfc2l6ZV87Ci0gIGludCAgICBzd2FwX2FsbG9jYXRlZF9zaXplID0gYWxsb2NhdGVkX3NpemVfOwotICBpbnQgICAgc3dhcF90b3RhbF9zaXplICAgICA9IHRvdGFsX3NpemVfOwotICAvLyBXZSBtYXkgbm90IGJlIHVzaW5nIGluaXRpYWxfc3BhY2VfIGJ1dCBpdCdzIG5vdCB3b3J0aCBjaGVja2luZy4gIEp1c3QKLSAgLy8gY29weSBpdCBhbnl3YXkuCi0gIHZvaWQqIHN3YXBfaW5pdGlhbF9zcGFjZVtrSW5pdGlhbFNpemVdOwotICBtZW1jcHkoc3dhcF9pbml0aWFsX3NwYWNlLCBpbml0aWFsX3NwYWNlXywgc2l6ZW9mKGluaXRpYWxfc3BhY2VfKSk7Ci0KLSAgZWxlbWVudHNfICAgICAgID0gb3RoZXItPmVsZW1lbnRzXzsKLSAgY3VycmVudF9zaXplXyAgID0gb3RoZXItPmN1cnJlbnRfc2l6ZV87Ci0gIGFsbG9jYXRlZF9zaXplXyA9IG90aGVyLT5hbGxvY2F0ZWRfc2l6ZV87Ci0gIHRvdGFsX3NpemVfICAgICA9IG90aGVyLT50b3RhbF9zaXplXzsKLSAgbWVtY3B5KGluaXRpYWxfc3BhY2VfLCBvdGhlci0+aW5pdGlhbF9zcGFjZV8sIHNpemVvZihpbml0aWFsX3NwYWNlXykpOwotCi0gIG90aGVyLT5lbGVtZW50c18gICAgICAgPSBzd2FwX2VsZW1lbnRzOwotICBvdGhlci0+Y3VycmVudF9zaXplXyAgID0gc3dhcF9jdXJyZW50X3NpemU7Ci0gIG90aGVyLT5hbGxvY2F0ZWRfc2l6ZV8gPSBzd2FwX2FsbG9jYXRlZF9zaXplOwotICBvdGhlci0+dG90YWxfc2l6ZV8gICAgID0gc3dhcF90b3RhbF9zaXplOwotICBtZW1jcHkob3RoZXItPmluaXRpYWxfc3BhY2VfLCBzd2FwX2luaXRpYWxfc3BhY2UsIHNpemVvZihzd2FwX2luaXRpYWxfc3BhY2UpKTsKLQotICBpZiAoZWxlbWVudHNfID09IG90aGVyLT5pbml0aWFsX3NwYWNlXykgewotICAgIGVsZW1lbnRzXyA9IGluaXRpYWxfc3BhY2VfOwotICB9Ci0gIGlmIChvdGhlci0+ZWxlbWVudHNfID09IGluaXRpYWxfc3BhY2VfKSB7Ci0gICAgb3RoZXItPmVsZW1lbnRzXyA9IG90aGVyLT5pbml0aWFsX3NwYWNlXzsKLSAgfQotfQotCi1zdHJpbmcqIFN0cmluZ1R5cGVIYW5kbGVyQmFzZTo6TmV3KCkgewotICByZXR1cm4gbmV3IHN0cmluZzsKLX0KLXZvaWQgU3RyaW5nVHlwZUhhbmRsZXJCYXNlOjpEZWxldGUoc3RyaW5nKiB2YWx1ZSkgewotICBkZWxldGUgdmFsdWU7Cit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbG9zZUdhcChpbnQgc3RhcnQsIGludCBudW0pIHsKKyAgaWYgKHJlcF8gPT0gTlVMTCkgcmV0dXJuOworICAvLyBDbG9zZSB1cCBhIGdhcCBvZiAibnVtIiBlbGVtZW50cyBzdGFydGluZyBhdCBvZmZzZXQgInN0YXJ0Ii4KKyAgZm9yIChpbnQgaSA9IHN0YXJ0ICsgbnVtOyBpIDwgcmVwXy0+YWxsb2NhdGVkX3NpemU7ICsraSkKKyAgICByZXBfLT5lbGVtZW50c1tpIC0gbnVtXSA9IHJlcF8tPmVsZW1lbnRzW2ldOworICBjdXJyZW50X3NpemVfIC09IG51bTsKKyAgcmVwXy0+YWxsb2NhdGVkX3NpemUgLT0gbnVtOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oCmluZGV4IDZhNmFlNjMuLjgwOTlkNjQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDYsMjcgKzQ2LDYzIEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9SRVBFQVRFRF9GSUVMRF9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1JFUEVBVEVEX0ZJRUxEX0hfXwogCi0jaW5jbHVkZSA8c3RyaW5nPgotI2lmbmRlZiBTVEFSQk9BUkQKLSNpbmNsdWRlIDxpdGVyYXRvcj4KLSNlbmRpZiAgLy8gU1RBUkJPQVJECisjaWZkZWYgX01TQ19WRVIKKy8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIG1pbi9tYXggb24gVlMyMDEzIG9ubHkuCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2VuZGlmCiAKKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8aXRlcmF0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Nhc3RzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZV9saXRlLmg+CiAKKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQorCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIAorbmFtZXNwYWNlIHVwYiB7CituYW1lc3BhY2UgZ29vZ2xlX29wZW5zb3VyY2UgeworY2xhc3MgR01SX0hhbmRsZXJzOworfSAgLy8gbmFtZXNwYWNlIGdvb2dsZV9vcGVuc291cmNlCit9ICAvLyBuYW1lc3BhY2UgdXBiCisKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKIGNsYXNzIE1lc3NhZ2U7CiAKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAKLS8vIFdlIG5lZWQgdGhpcyAoZnJvbSBnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmNjKS4KLUxJQlBST1RPQlVGX0VYUE9SVCBpbnQgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZihjb25zdCBzdHJpbmcmIHN0cik7CitzdGF0aWMgY29uc3QgaW50IGtNaW5SZXBlYXRlZEZpZWxkQWxsb2NhdGlvblNpemUgPSA0OwogCisvLyBBIHV0aWxpdHkgZnVuY3Rpb24gZm9yIGxvZ2dpbmcgdGhhdCBkb2Vzbid0IG5lZWQgYW55IHRlbXBsYXRlIHR5cGVzLgordm9pZCBMb2dJbmRleE91dE9mQm91bmRzKGludCBpbmRleCwgaW50IHNpemUpOworCit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXRlcj4KK2lubGluZSBpbnQgQ2FsY3VsYXRlUmVzZXJ2ZShJdGVyIGJlZ2luLCBJdGVyIGVuZCwgc3RkOjpmb3J3YXJkX2l0ZXJhdG9yX3RhZykgeworICByZXR1cm4gc3RkOjpkaXN0YW5jZShiZWdpbiwgZW5kKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CitpbmxpbmUgaW50IENhbGN1bGF0ZVJlc2VydmUoSXRlciAvKmJlZ2luKi8sIEl0ZXIgLyplbmQqLywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGQ6OmlucHV0X2l0ZXJhdG9yX3RhZyAvKnVudXNlZCovKSB7CisgIHJldHVybiAtMTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CitpbmxpbmUgaW50IENhbGN1bGF0ZVJlc2VydmUoSXRlciBiZWdpbiwgSXRlciBlbmQpIHsKKyAgdHlwZWRlZiB0eXBlbmFtZSBzdGQ6Oml0ZXJhdG9yX3RyYWl0czxJdGVyPjo6aXRlcmF0b3JfY2F0ZWdvcnkgQ2F0ZWdvcnk7CisgIHJldHVybiBDYWxjdWxhdGVSZXNlcnZlKGJlZ2luLCBlbmQsIENhdGVnb3J5KCkpOworfQogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCiAKKwogLy8gUmVwZWF0ZWRGaWVsZCBpcyB1c2VkIHRvIHJlcHJlc2VudCByZXBlYXRlZCBmaWVsZHMgb2YgYSBwcmltaXRpdmUgdHlwZSAoaW4KIC8vIG90aGVyIHdvcmRzLCBldmVyeXRoaW5nIGV4Y2VwdCBzdHJpbmdzIGFuZCBuZXN0ZWQgTWVzc2FnZXMpLiAgTW9zdCB1c2VycyB3aWxsCiAvLyBub3QgZXZlciB1c2UgYSBSZXBlYXRlZEZpZWxkIGRpcmVjdGx5OyB0aGV5IHdpbGwgdXNlIHRoZSBnZXQtYnktaW5kZXgsCkBAIC03NSwxMSArMTExLDE1IEBACiBjbGFzcyBSZXBlYXRlZEZpZWxkIHsKICBwdWJsaWM6CiAgIFJlcGVhdGVkRmllbGQoKTsKKyAgZXhwbGljaXQgUmVwZWF0ZWRGaWVsZChBcmVuYSogYXJlbmEpOwogICBSZXBlYXRlZEZpZWxkKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CisgIFJlcGVhdGVkRmllbGQoSXRlciBiZWdpbiwgY29uc3QgSXRlciYgZW5kKTsKICAgflJlcGVhdGVkRmllbGQoKTsKIAogICBSZXBlYXRlZEZpZWxkJiBvcGVyYXRvcj0oY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpOwogCisgIGJvb2wgZW1wdHkoKSBjb25zdDsKICAgaW50IHNpemUoKSBjb25zdDsKIAogICBjb25zdCBFbGVtZW50JiBHZXQoaW50IGluZGV4KSBjb25zdDsKQEAgLTg4LDEyICsxMjgsMTQgQEAKICAgdm9pZCBBZGQoY29uc3QgRWxlbWVudCYgdmFsdWUpOwogICBFbGVtZW50KiBBZGQoKTsKICAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgotICAvLyBXZSBkb24ndCBwcm92aWRlIGEgd2F5IHRvIHJlbW92ZSBhbnkgZWxlbWVudCBvdGhlciB0aGFuIHRoZSBsYXN0Ci0gIC8vIGJlY2F1c2UgaXQgaW52aXRlcyBpbmVmZmljaWVudCB1c2UsIHN1Y2ggYXMgTyhuXjIpIGZpbHRlcmluZyBsb29wcwotICAvLyB0aGF0IHNob3VsZCBoYXZlIGJlZW4gTyhuKS4gIElmIHlvdSB3YW50IHRvIHJlbW92ZSBhbiBlbGVtZW50IG90aGVyCi0gIC8vIHRoYW4gdGhlIGxhc3QsIHRoZSBiZXN0IHdheSB0byBkbyBpdCBpcyB0byByZS1hcnJhbmdlIHRoZSBlbGVtZW50cwotICAvLyBzbyB0aGF0IHRoZSBvbmUgeW91IHdhbnQgcmVtb3ZlZCBpcyBhdCB0aGUgZW5kLCB0aGVuIGNhbGwgUmVtb3ZlTGFzdCgpLgogICB2b2lkIFJlbW92ZUxhc3QoKTsKKworICAvLyBFeHRyYWN0IGVsZW1lbnRzIHdpdGggaW5kaWNlcyBpbiAiW3N0YXJ0IC4uIHN0YXJ0K251bS0xXSIuCisgIC8vIENvcHkgdGhlbSBpbnRvICJlbGVtZW50c1swIC4uIG51bS0xXSIgaWYgImVsZW1lbnRzIiBpcyBub3QgTlVMTC4KKyAgLy8gQ2F1dGlvbjogaW1wbGVtZW50YXRpb24gYWxzbyBtb3ZlcyBlbGVtZW50cyB3aXRoIGluZGljZXMgW3N0YXJ0K251bSAuLl0uCisgIC8vIENhbGxpbmcgdGhpcyByb3V0aW5lIGluc2lkZSBhIGxvb3AgY2FuIGNhdXNlIHF1YWRyYXRpYyBiZWhhdmlvci4KKyAgdm9pZCBFeHRyYWN0U3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiBlbGVtZW50cyk7CisKICAgdm9pZCBDbGVhcigpOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcik7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpOwpAQCAtMTA5LDE0ICsxNTEsMjYgQEAKICAgRWxlbWVudCogQWRkQWxyZWFkeVJlc2VydmVkKCk7CiAgIGludCBDYXBhY2l0eSgpIGNvbnN0OwogCisgIC8vIExpa2UgU1RMIHJlc2l6ZS4gIFVzZXMgdmFsdWUgdG8gZmlsbCBhcHBlbmRlZCBlbGVtZW50cy4KKyAgLy8gTGlrZSBUcnVuY2F0ZSgpIGlmIG5ld19zaXplIDw9IHNpemUoKSwgb3RoZXJ3aXNlIHRoaXMgaXMKKyAgLy8gTyhuZXdfc2l6ZSAtIHNpemUoKSkuCisgIHZvaWQgUmVzaXplKGludCBuZXdfc2l6ZSwgY29uc3QgRWxlbWVudCYgdmFsdWUpOworCiAgIC8vIEdldHMgdGhlIHVuZGVybHlpbmcgYXJyYXkuICBUaGlzIHBvaW50ZXIgaXMgcG9zc2libHkgaW52YWxpZGF0ZWQgYnkKICAgLy8gYW55IGFkZCBvciByZW1vdmUgb3BlcmF0aW9uLgogICBFbGVtZW50KiBtdXRhYmxlX2RhdGEoKTsKICAgY29uc3QgRWxlbWVudCogZGF0YSgpIGNvbnN0OwogCi0gIC8vIFN3YXAgZW50aXJlIGNvbnRlbnRzIHdpdGggIm90aGVyIi4KKyAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLiBJZiB0aGV5IGFyZSBzZXBhcmF0ZSBhcmVuYXMgdGhlbiwgY29waWVzCisgIC8vIGRhdGEgYmV0d2VlbiBlYWNoIG90aGVyLgogICB2b2lkIFN3YXAoUmVwZWF0ZWRGaWVsZCogb3RoZXIpOwogCisgIC8vIFN3YXAgZW50aXJlIGNvbnRlbnRzIHdpdGggIm90aGVyIi4gU2hvdWxkIGJlIGNhbGxlZCBvbmx5IGlmIHRoZSBjYWxsZXIgY2FuCisgIC8vIGd1YXJhbnRlZSB0aGF0IGJvdGggcmVwZWF0ZWQgZmllbGRzIGFyZSBvbiB0aGUgc2FtZSBhcmVuYSBvciBhcmUgb24gdGhlCisgIC8vIGhlYXAuIFN3YXBwaW5nIGJldHdlZW4gZGlmZmVyZW50IGFyZW5hcyBpcyBkaXNhbGxvd2VkIGFuZCBjYXVnaHQgYnkgYQorICAvLyBHT09HTEVfRENIRUNLIChzZWUgQVBJIGRvY3MgZm9yIGRldGFpbHMpLgorICB2b2lkIFVuc2FmZUFyZW5hU3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcik7CisKICAgLy8gU3dhcCB0d28gZWxlbWVudHMuCiAgIHZvaWQgU3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpOwogCkBAIC0xMjQsNDEgKzE3OCwxODIgQEAKICAgdHlwZWRlZiBFbGVtZW50KiBpdGVyYXRvcjsKICAgdHlwZWRlZiBjb25zdCBFbGVtZW50KiBjb25zdF9pdGVyYXRvcjsKICAgdHlwZWRlZiBFbGVtZW50IHZhbHVlX3R5cGU7CisgIHR5cGVkZWYgdmFsdWVfdHlwZSYgcmVmZXJlbmNlOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUmIGNvbnN0X3JlZmVyZW5jZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IHZhbHVlX3R5cGUqIGNvbnN0X3BvaW50ZXI7CisgIHR5cGVkZWYgaW50IHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOwogCiAgIGl0ZXJhdG9yIGJlZ2luKCk7CiAgIGNvbnN0X2l0ZXJhdG9yIGJlZ2luKCkgY29uc3Q7CisgIGNvbnN0X2l0ZXJhdG9yIGNiZWdpbigpIGNvbnN0OwogICBpdGVyYXRvciBlbmQoKTsKICAgY29uc3RfaXRlcmF0b3IgZW5kKCkgY29uc3Q7CisgIGNvbnN0X2l0ZXJhdG9yIGNlbmQoKSBjb25zdDsKKworICAvLyBSZXZlcnNlIGl0ZXJhdG9yIHN1cHBvcnQKKyAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8Y29uc3RfaXRlcmF0b3I+IGNvbnN0X3JldmVyc2VfaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGl0ZXJhdG9yPiByZXZlcnNlX2l0ZXJhdG9yOworICByZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKyAgY29uc3RfcmV2ZXJzZV9pdGVyYXRvciByYmVnaW4oKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoZW5kKCkpOworICB9CisgIHJldmVyc2VfaXRlcmF0b3IgcmVuZCgpIHsKKyAgICByZXR1cm4gcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IoYmVnaW4oKSk7CisgIH0KIAogICAvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgdXNlZCBieSB0aGUgcmVwZWF0ZWQgZmllbGQsIGV4Y2x1ZGluZwogICAvLyBzaXplb2YoKnRoaXMpCiAgIGludCBTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3Q7CiAKKyAgLy8gUmVtb3ZlcyB0aGUgZWxlbWVudCByZWZlcmVuY2VkIGJ5IHBvc2l0aW9uLgorICAvLworICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcmVtb3ZlZAorICAvLyBlbGVtZW50LgorICAvLworICAvLyBJbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzIGF0IG9yIGFmdGVyIHRoZSByZW1vdmVkIGVsZW1lbnQsIGluY2x1ZGluZyBlbmQoKS4KKyAgaXRlcmF0b3IgZXJhc2UoY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pOworCisgIC8vIFJlbW92ZXMgdGhlIGVsZW1lbnRzIGluIHRoZSByYW5nZSBbZmlyc3QsIGxhc3QpLgorICAvLworICAvLyBSZXR1cm5zIGFuIGl0ZXJhdG9yIHRvIHRoZSBlbGVtZW50IGltbWVkaWF0ZWx5IGZvbGxvd2luZyB0aGUgcmVtb3ZlZCByYW5nZS4KKyAgLy8KKyAgLy8gSW52YWxpZGF0ZXMgYWxsIGl0ZXJhdG9ycyBhdCBvciBhZnRlciB0aGUgcmVtb3ZlZCByYW5nZSwgaW5jbHVkaW5nIGVuZCgpLgorICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCk7CisKKyAgLy8gR2V0IHRoZSBBcmVuYSBvbiB3aGljaCB0aGlzIFJlcGVhdGVkRmllbGQgc3RvcmVzIGl0cyBlbGVtZW50cy4KKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEFyZW5hTm9WaXJ0dWFsKCk7CisgIH0KKwogIHByaXZhdGU6Ci0gIHN0YXRpYyBjb25zdCBpbnQga0luaXRpYWxTaXplID0gNDsKKyAgc3RhdGljIGNvbnN0IGludCBrSW5pdGlhbFNpemUgPSAwOworICAvLyBBIG5vdGUgb24gdGhlIHJlcHJlc2VudGF0aW9uIGhlcmUgKHNlZSBhbHNvIGNvbW1lbnQgYmVsb3cgZm9yCisgIC8vIFJlcGVhdGVkUHRyRmllbGRCYXNlJ3Mgc3RydWN0IFJlcCk6CisgIC8vCisgIC8vIFdlIG1haW50YWluIHRoZSBzYW1lIHNpemVvZihSZXBlYXRlZEZpZWxkKSBhcyBiZWZvcmUgd2UgYWRkZWQgYXJlbmEgc3VwcG9ydAorICAvLyBzbyB0aGF0IHdlIGRvIG5vdCBkZWdyYWRlIHBlcmZvcm1hbmNlIGJ5IGJsb2F0aW5nIG1lbW9yeSB1c2FnZS4gRGlyZWN0bHkKKyAgLy8gYWRkaW5nIGFuIGFyZW5hXyBlbGVtZW50IHRvIFJlcGVhdGVkRmllbGQgaXMgcXVpdGUgY29zdGx5LiBCeSB1c2luZworICAvLyBpbmRpcmVjdGlvbiBpbiB0aGlzIHdheSwgd2Uga2VlcCB0aGUgc2FtZSBzaXplIHdoZW4gdGhlIFJlcGVhdGVkRmllbGQgaXMKKyAgLy8gZW1wdHkgKGNvbW1vbiBjYXNlKSwgYW5kIGFkZCBvbmx5IGFuIDgtYnl0ZSBoZWFkZXIgdG8gdGhlIGVsZW1lbnRzIGFycmF5CisgIC8vIHdoZW4gbm9uLWVtcHR5LiBXZSBtYWtlIHN1cmUgdG8gcGxhY2UgdGhlIHNpemUgZmllbGRzIGRpcmVjdGx5IGluIHRoZQorICAvLyBSZXBlYXRlZEZpZWxkIGNsYXNzIHRvIGF2b2lkIGNvc3RseSBjYWNoZSBtaXNzZXMgZHVlIHRvIHRoZSBpbmRpcmVjdGlvbi4KKyAgaW50IGN1cnJlbnRfc2l6ZV87CisgIGludCB0b3RhbF9zaXplXzsKKyAgc3RydWN0IFJlcCB7CisgICAgQXJlbmEqIGFyZW5hOworICAgIEVsZW1lbnQgZWxlbWVudHNbMV07CisgIH07CisgIC8vIFdlIGNhbiBub3QgdXNlIHNpemVvZihSZXApIC0gc2l6ZW9mKEVsZW1lbnQpIGR1ZSB0byB0aGUgdHJhaWxpbmcgcGFkZGluZyBvbgorICAvLyB0aGUgc3RydWN0LiBXZSBjYW4gbm90IHVzZSBzaXplb2YoQXJlbmEqKSBhcyB3ZWxsIGJlY2F1c2UgdGhlcmUgbWlnaHQgYmUKKyAgLy8gYSAiZ2FwIiBhZnRlciB0aGUgZmllbGQgYXJlbmEgYW5kIGJlZm9yZSB0aGUgZmllbGQgZWxlbWVudHMgKGUuZy4sIHdoZW4KKyAgLy8gRWxlbWVudCBpcyBkb3VibGUgYW5kIHBvaW50ZXIgaXMgMzJiaXQpLgorICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXBIZWFkZXJTaXplOworICAvLyBDb250YWlucyBhcmVuYSBwdHIgYW5kIHRoZSBlbGVtZW50cyBhcnJheS4gV2UgYWxzbyBrZWVwIHRoZSBpbnZhcmlhbnQgdGhhdAorICAvLyBpZiByZXBfIGlzIE5VTEwsIHRoZW4gYXJlbmEgaXMgTlVMTC4KKyAgUmVwKiByZXBfOwogCi0gIEVsZW1lbnQqIGVsZW1lbnRzXzsKLSAgaW50ICAgICAgY3VycmVudF9zaXplXzsKLSAgaW50ICAgICAgdG90YWxfc2l6ZV87Ci0KLSAgRWxlbWVudCAgaW5pdGlhbF9zcGFjZV9ba0luaXRpYWxTaXplXTsKKyAgZnJpZW5kIGNsYXNzIEFyZW5hOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOwogCiAgIC8vIE1vdmUgdGhlIGNvbnRlbnRzIG9mIHxmcm9tfCBpbnRvIHx0b3wsIHBvc3NpYmx5IGNsb2JiZXJpbmcgfGZyb218IGluIHRoZQogICAvLyBwcm9jZXNzLiAgRm9yIHByaW1pdGl2ZSB0eXBlcyB0aGlzIGlzIGp1c3QgYSBtZW1jcHkoKSwgYnV0IGl0IGNvdWxkIGJlCiAgIC8vIHNwZWNpYWxpemVkIGZvciBub24tcHJpbWl0aXZlIHR5cGVzIHRvLCBzYXksIHN3YXAgZWFjaCBlbGVtZW50IGluc3RlYWQuCi0gIHZvaWQgTW92ZUFycmF5KEVsZW1lbnQgdG9bXSwgRWxlbWVudCBmcm9tW10sIGludCBzaXplKTsKKyAgdm9pZCBNb3ZlQXJyYXkoRWxlbWVudCogdG8sIEVsZW1lbnQqIGZyb20sIGludCBzaXplKTsKIAogICAvLyBDb3B5IHRoZSBlbGVtZW50cyBvZiB8ZnJvbXwgaW50byB8dG98LgotICB2b2lkIENvcHlBcnJheShFbGVtZW50IHRvW10sIGNvbnN0IEVsZW1lbnQgZnJvbVtdLCBpbnQgc2l6ZSk7CisgIHZvaWQgQ29weUFycmF5KEVsZW1lbnQqIHRvLCBjb25zdCBFbGVtZW50KiBmcm9tLCBpbnQgc2l6ZSk7CisKKyAgaW5saW5lIHZvaWQgSW50ZXJuYWxTd2FwKFJlcGVhdGVkRmllbGQqIG90aGVyKTsKKworICAvLyBJbnRlcm5hbCBoZWxwZXIgZXhwZWN0ZWQgYnkgQXJlbmEgbWV0aG9kcy4KKyAgaW5saW5lIEFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gKHJlcF8gPT0gTlVMTCkgPyBOVUxMIDogcmVwXy0+YXJlbmE7CisgIH0KKworICAvLyBJbnRlcm5hbCBoZWxwZXIgdG8gZGVsZXRlIGFsbCBlbGVtZW50cyBhbmQgZGVhbGxvY2F0ZSB0aGUgc3RvcmFnZS4KKyAgLy8gSWYgRWxlbWVudCBoYXMgYSB0cml2aWFsIGRlc3RydWN0b3IgKGZvciBleGFtcGxlLCBpZiBpdCdzIGEgZnVuZGFtZW50YWwKKyAgLy8gdHlwZSwgbGlrZSBpbnQzMiksIHRoZSBsb29wIHdpbGwgYmUgcmVtb3ZlZCBieSB0aGUgb3B0aW1pemVyLgorICB2b2lkIEludGVybmFsRGVhbGxvY2F0ZShSZXAqIHJlcCwgaW50IHNpemUpIHsKKyAgICBpZiAocmVwICE9IE5VTEwpIHsKKyAgICAgIEVsZW1lbnQqIGUgPSAmcmVwLT5lbGVtZW50c1swXTsKKyAgICAgIEVsZW1lbnQqIGxpbWl0ID0gJnJlcC0+ZWxlbWVudHNbc2l6ZV07CisgICAgICBmb3IgKDsgZSA8IGxpbWl0OyBlKyspIHsKKyAgICAgICAgZS0+RWxlbWVudDo6fkVsZW1lbnQoKTsKKyAgICAgIH0KKyAgICAgIGlmIChyZXAtPmFyZW5hID09IE5VTEwpIHsKKyAgICAgICAgZGVsZXRlW10gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocmVwKTsKKyAgICAgIH0KKyAgICB9CisgIH0KIH07CiAKK3RlbXBsYXRlPHR5cGVuYW1lIEVsZW1lbnQ+Citjb25zdCBzaXplX3QgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6a1JlcEhlYWRlclNpemUgPQorICAgIHJlaW50ZXJwcmV0X2Nhc3Q8c2l6ZV90PigmcmVpbnRlcnByZXRfY2FzdDxSZXAqPigxNiktPmVsZW1lbnRzWzBdKSAtIDE2OworCiBuYW1lc3BhY2UgaW50ZXJuYWwgewogdGVtcGxhdGUgPHR5cGVuYW1lIEl0PiBjbGFzcyBSZXBlYXRlZFB0ckl0ZXJhdG9yOwotdGVtcGxhdGUgPHR5cGVuYW1lIEl0PiBjbGFzcyBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3I7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgSXQsIHR5cGVuYW1lIFZvaWRQdHI+IGNsYXNzIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjsKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogCiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCisvLyBUaGlzIGlzIGEgaGVscGVyIHRlbXBsYXRlIHRvIGNvcHkgYW4gYXJyYXkgb2YgZWxlbWVudHMgZWZmZWNpZW50bHkgd2hlbiB0aGV5CisvLyBoYXZlIGEgdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yLCBhbmQgY29ycmVjdGx5IG90aGVyd2lzZS4gVGhpcyByZWFsbHkKKy8vIHNob3VsZG4ndCBiZSBuZWNlc3NhcnksIGJ1dCBvdXIgY29tcGlsZXIgZG9lc24ndCBvcHRpbWl6ZSBzdGQ6OmNvcHkgdmVyeQorLy8gZWZmZWN0aXZlbHkuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudCwKKyAgICAgICAgICBib29sIEhhc1RyaXZpYWxDb3B5ID0gaGFzX3RyaXZpYWxfY29weTxFbGVtZW50Pjo6dmFsdWU+CitzdHJ1Y3QgRWxlbWVudENvcGllciB7CisgIHZvaWQgb3BlcmF0b3IoKShFbGVtZW50KiB0bywgY29uc3QgRWxlbWVudCogZnJvbSwgaW50IGFycmF5X3NpemUpOworfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIHR5cGUtdHJhaXRzIGhlbHBlciBmb3IgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6IHdlIG9ubHkgd2FudCB0byBpbnZva2UKKy8vIGFyZW5hLXJlbGF0ZWQgImNvcHkgaWYgb24gZGlmZmVyZW50IGFyZW5hIiBiZWhhdmlvciBpZiB0aGUgbmVjZXNzYXJ5IG1ldGhvZHMKKy8vIGV4aXN0IG9uIHRoZSBjb250YWluZWQgdHlwZS4gSW4gcGFydGljdWxhciwgd2UgcmVseSBvbiBNZXJnZUZyb20oKSBleGlzdGluZworLy8gYXMgYSBnZW5lcmFsIHByb3h5IGZvciB0aGUgZmFjdCB0aGF0IGEgY29weSB3aWxsIHdvcmssIGFuZCB3ZSBhbHNvIHByb3ZpZGUgYQorLy8gc3BlY2lmaWMgb3ZlcnJpZGUgZm9yIHN0cmluZyouCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorc3RydWN0IFR5cGVJbXBsZW1lbnRzTWVyZ2VCZWhhdmlvciB7CisgIHR5cGVkZWYgY2hhciBIYXNNZXJnZTsKKyAgdHlwZWRlZiBsb25nIEhhc05vTWVyZ2U7CisKKyAgLy8gV2UgYWNjZXB0IGVpdGhlciBvZjoKKyAgLy8gLSB2b2lkIE1lcmdlRnJvbShjb25zdCBUJiBvdGhlcikKKyAgLy8gLSBib29sIE1lcmdlRnJvbShjb25zdCBUJiBvdGhlcikKKyAgLy8KKyAgLy8gV2UgbWFuZ2xlIHRoZXNlIG5hbWVzIGEgYml0IHRvIGF2b2lkIGNvbXBhdGliaWxpdHkgaXNzdWVzIGluICd1bmNsZWFuJworICAvLyBpbmNsdWRlIGVudmlyb25tZW50cyB0aGF0IG1heSBoYXZlLCBlLmcuLCAiI2RlZmluZSB0ZXN0IC4uLiIgKHllcywgdGhpcworICAvLyBleGlzdHMpLgorICB0ZW1wbGF0ZTx0eXBlbmFtZSBVLCB0eXBlbmFtZSBSZXRUeXBlLCBSZXRUeXBlIChVOjoqKShjb25zdCBVJiBhcmcpPgorICAgICAgc3RydWN0IENoZWNrVHlwZTsKKyAgdGVtcGxhdGU8dHlwZW5hbWUgVT4gc3RhdGljIEhhc01lcmdlIENoZWNrKAorICAgICAgQ2hlY2tUeXBlPFUsIHZvaWQsICZVOjpNZXJnZUZyb20+Kik7CisgIHRlbXBsYXRlPHR5cGVuYW1lIFU+IHN0YXRpYyBIYXNNZXJnZSBDaGVjaygKKyAgICAgIENoZWNrVHlwZTxVLCBib29sLCAmVTo6TWVyZ2VGcm9tPiopOworICB0ZW1wbGF0ZTx0eXBlbmFtZSBVPiBzdGF0aWMgSGFzTm9NZXJnZSBDaGVjayguLi4pOworCisgIC8vIFJlc292bGVzIHRvIGVpdGhlciBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlIG9yIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlLgorICB0eXBlZGVmIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjppbnRlZ3JhbF9jb25zdGFudDxib29sLAorICAgICAgICAgICAgICAgKHNpemVvZihDaGVjazxUPigwKSkgPT0gc2l6ZW9mKEhhc01lcmdlKSk+IHR5cGU7Cit9OworCit0ZW1wbGF0ZTw+CitzdHJ1Y3QgVHlwZUltcGxlbWVudHNNZXJnZUJlaGF2aW9yPCA6OnN0ZDo6c3RyaW5nID4geworICB0eXBlZGVmIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUgdHlwZTsKK307CisKIC8vIFRoaXMgaXMgdGhlIGNvbW1vbiBiYXNlIGNsYXNzIGZvciBSZXBlYXRlZFB0ckZpZWxkcy4gIEl0IGRlYWxzIG9ubHkgaW4gdm9pZCoKIC8vIHBvaW50ZXJzLiAgVXNlcnMgc2hvdWxkIG5vdCB1c2UgdGhpcyBpbnRlcmZhY2UgZGlyZWN0bHkuCiAvLwpAQCAtMTg5LDEyICszODQsMjQgQEAKICAgLy8gdXNlIG9mIEFkZEZyb21DbGVhcmVkKCksIHdoaWNoIGlzIG5vdCBwYXJ0IG9mIHRoZSBwdWJsaWMgaW50ZXJmYWNlLgogICBmcmllbmQgY2xhc3MgRXh0ZW5zaW9uU2V0OwogCisgIC8vIFRoZSBNYXBGaWVsZEJhc2UgaW1wbGVtZW50YXRpb24gbmVlZHMgdG8gY2FsbCBwcm90ZWN0ZWQgbWV0aG9kcyBkaXJlY3RseSwKKyAgLy8gcmVpbnRlcnByZXRpbmcgcG9pbnRlcnMgYXMgYmVpbmcgdG8gTWVzc2FnZSBpbnN0ZWFkIG9mIGEgc3BlY2lmaWMgTWVzc2FnZQorICAvLyBzdWJjbGFzcy4KKyAgZnJpZW5kIGNsYXNzIE1hcEZpZWxkQmFzZTsKKworICAvLyBUbyBwYXJzZSBkaXJlY3RseSBpbnRvIGEgcHJvdG8yIGdlbmVyYXRlZCBjbGFzcywgdGhlIHVwYiBjbGFzcyBHTVJfSGFuZGxlcnMKKyAgLy8gbmVlZHMgdG8gYmUgYWJsZSB0byBtb2RpZnkgYSBSZXBlYXRlZFB0ckZpZWxkQmFzZSBkaXJlY3RseS4KKyAgZnJpZW5kIGNsYXNzIHVwYjo6Z29vZ2xlX29wZW5zb3VyY2U6OkdNUl9IYW5kbGVyczsKKwogICBSZXBlYXRlZFB0ckZpZWxkQmFzZSgpOworICBleHBsaWNpdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7CisgIH5SZXBlYXRlZFB0ckZpZWxkQmFzZSgpIHt9CiAKICAgLy8gTXVzdCBiZSBjYWxsZWQgZnJvbSBkZXN0cnVjdG9yLgogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CiAgIHZvaWQgRGVzdHJveSgpOwogCisgIGJvb2wgZW1wdHkoKSBjb25zdDsKICAgaW50IHNpemUoKSBjb25zdDsKIAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CkBAIC0yMDIsNyArNDA5LDEwIEBACiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIE11dGFibGUoaW50IGluZGV4KTsKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogQWRkKCk7CisgIHZvaWQgRGVsZXRlKGludCBpbmRleCk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIEFkZCh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcHJvdG90eXBlID0gTlVMTCk7CisKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgogICB2b2lkIFJlbW92ZUxhc3QoKTsKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgpAQCAtMjEyLDYgKzQyMiw4IEBACiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KICAgdm9pZCBDb3B5RnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIpOwogCisgIHZvaWQgQ2xvc2VHYXAoaW50IHN0YXJ0LCBpbnQgbnVtKTsKKwogICB2b2lkIFJlc2VydmUoaW50IG5ld19zaXplKTsKIAogICBpbnQgQ2FwYWNpdHkoKSBjb25zdDsKQEAgLTIyNSw3ICs0MzcsOCBAQAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CiAgIGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb25zdCogZGF0YSgpIGNvbnN0OwogCi0gIHZvaWQgU3dhcChSZXBlYXRlZFB0ckZpZWxkQmFzZSogb3RoZXIpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORSB2b2lkIFN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKTsKIAogICB2b2lkIFN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKTsKIApAQCAtMjM5LDEwICs0NTIsMjUgQEAKICAgdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgogICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogQWRkRnJvbUNsZWFyZWQoKTsKIAorICB0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdm9pZCBBZGRBbGxvY2F0ZWQodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKSB7CisgICAgdHlwZW5hbWUgVHlwZUltcGxlbWVudHNNZXJnZUJlaGF2aW9yPHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlPjo6dHlwZSB0OworICAgIEFkZEFsbG9jYXRlZEludGVybmFsPFR5cGVIYW5kbGVyPih2YWx1ZSwgdCk7CisgIH0KKwogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHZvaWQgQWRkQWxsb2NhdGVkKHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSk7CisgIHZvaWQgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKTsKKwogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci0gIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZWxlYXNlTGFzdCgpOworICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogUmVsZWFzZUxhc3QoKSB7CisgICAgdHlwZW5hbWUgVHlwZUltcGxlbWVudHNNZXJnZUJlaGF2aW9yPHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlPjo6dHlwZSB0OworICAgIHJldHVybiBSZWxlYXNlTGFzdEludGVybmFsPFR5cGVIYW5kbGVyPih0KTsKKyAgfQorCisgIC8vIFJlbGVhc2VzIGxhc3QgZWxlbWVudCBhbmQgcmV0dXJucyBpdCwgYnV0IGRvZXMgbm90IGRvIG91dC1vZi1hcmVuYSBjb3B5LgorICAvLyBBbmQganVzdCByZXR1cm5zIHRoZSByYXcgcG9pbnRlciB0byB0aGUgY29udGFpbmVkIGVsZW1lbnQgaW4gdGhlIGFyZW5hLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBVbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCk7CiAKICAgaW50IENsZWFyZWRDb3VudCgpIGNvbnN0OwogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CkBAIC0yNTAsMTcgKzQ3OCw1OSBAQAogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CiAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZWxlYXNlQ2xlYXJlZCgpOwogCisgcHJvdGVjdGVkOgorICBpbmxpbmUgdm9pZCBJbnRlcm5hbFN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgQWRkQWxsb2NhdGVkSW50ZXJuYWwodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUpOworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CisgIHZvaWQgQWRkQWxsb2NhdGVkSW50ZXJuYWwodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlKTsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+IEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKKyAgdm9pZCBBZGRBbGxvY2F0ZWRTbG93V2l0aENvcHkodHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmVuYSogdmFsdWVfYXJlbmEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZW5hKiBteV9hcmVuYSk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4gR09PR0xFX0FUVFJJQlVURV9OT0lOTElORQorICB2b2lkIEFkZEFsbG9jYXRlZFNsb3dXaXRob3V0Q29weSh0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogdmFsdWUpOworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlbGVhc2VMYXN0SW50ZXJuYWwoZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSk7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KKyAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlbGVhc2VMYXN0SW50ZXJuYWwoZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmZhbHNlX3R5cGUpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVIYW5kbGVyPiBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FCisgIHZvaWQgU3dhcEZhbGxiYWNrKFJlcGVhdGVkUHRyRmllbGRCYXNlKiBvdGhlcik7CisKKyAgaW5saW5lIEFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0IHsKKyAgICByZXR1cm4gYXJlbmFfOworICB9CisKICBwcml2YXRlOgotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoUmVwZWF0ZWRQdHJGaWVsZEJhc2UpOwotCi0gIHN0YXRpYyBjb25zdCBpbnQga0luaXRpYWxTaXplID0gNDsKLQotICB2b2lkKiogZWxlbWVudHNfOworICBzdGF0aWMgY29uc3QgaW50IGtJbml0aWFsU2l6ZSA9IDA7CisgIC8vIEEgZmV3IG5vdGVzIG9uIGludGVybmFsIHJlcHJlc2VudGF0aW9uOgorICAvLworICAvLyBXZSB1c2UgYW4gaW5kaXJlY3RlZCBhcHByb2FjaCwgd2l0aCBzdHJ1Y3QgUmVwLCB0byBrZWVwCisgIC8vIHNpemVvZihSZXBlYXRlZFB0ckZpZWxkQmFzZSkgZXF1aXZhbGVudCB0byB3aGF0IGl0IHdhcyBiZWZvcmUgYXJlbmEgc3VwcG9ydAorICAvLyB3YXMgYWRkZWQsIG5hbWVseSwgMyA4LWJ5dGUgbWFjaGluZSB3b3JkcyBvbiB4ODYtNjQuIEFuIGluc3RhbmNlIG9mIFJlcCBpcworICAvLyBhbGxvY2F0ZWQgb25seSB3aGVuIHRoZSByZXBlYXRlZCBmaWVsZCBpcyBub24tZW1wdHksIGFuZCBpdCBpcyBhCisgIC8vIGR5bmFtaWNhbGx5LXNpemVkIHN0cnVjdCAodGhlIGhlYWRlciBpcyBkaXJlY3RseSBmb2xsb3dlZCBieSBlbGVtZW50c1tdKS4KKyAgLy8gV2UgcGxhY2UgYXJlbmFfIGFuZCBjdXJyZW50X3NpemVfIGRpcmVjdGx5IGluIHRoZSBvYmplY3QgdG8gYXZvaWQgY2FjaGUKKyAgLy8gbWlzc2VzIGR1ZSB0byB0aGUgaW5kaXJlY3Rpb24sIGJlY2F1c2UgdGhlc2UgZmllbGRzIGFyZSBjaGVja2VkIGZyZXF1ZW50bHkuCisgIC8vIFBsYWNpbmcgYWxsIGZpZWxkcyBkaXJlY3RseSBpbiB0aGUgUmVwZWF0ZWRQdHJGaWVsZEJhc2UgaW5zdGFuY2UgY29zdHMKKyAgLy8gc2lnbmlmaWNhbnQgcGVyZm9ybWFuY2UgZm9yIG1lbW9yeS1zZW5zaXRpdmUgd29ya2xvYWRzLgorICBBcmVuYSogYXJlbmFfOwogICBpbnQgICAgY3VycmVudF9zaXplXzsKLSAgaW50ICAgIGFsbG9jYXRlZF9zaXplXzsKICAgaW50ICAgIHRvdGFsX3NpemVfOwotCi0gIHZvaWQqICBpbml0aWFsX3NwYWNlX1trSW5pdGlhbFNpemVdOworICBzdHJ1Y3QgUmVwIHsKKyAgICBpbnQgICAgYWxsb2NhdGVkX3NpemU7CisgICAgdm9pZCogIGVsZW1lbnRzWzFdOworICB9OworICBzdGF0aWMgY29uc3Qgc2l6ZV90IGtSZXBIZWFkZXJTaXplID0gc2l6ZW9mKFJlcCkgLSBzaXplb2Yodm9pZCopOworICAvLyBDb250YWlucyBhcmVuYSBwdHIgYW5kIHRoZSBlbGVtZW50cyBhcnJheS4gV2UgYWxzbyBrZWVwIHRoZSBpbnZhcmlhbnQgdGhhdAorICAvLyBpZiByZXBfIGlzIE5VTEwsIHRoZW4gYXJlbmEgaXMgTlVMTC4KKyAgUmVwKiByZXBfOwogCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KICAgc3RhdGljIGlubGluZSB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogY2FzdCh2b2lkKiBlbGVtZW50KSB7CkBAIC0yNzAsMjYgKzU0MCwxNDMgQEAKICAgc3RhdGljIGlubGluZSBjb25zdCB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogY2FzdChjb25zdCB2b2lkKiBlbGVtZW50KSB7CiAgICAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqPihlbGVtZW50KTsKICAgfQorCisgIC8vIE5vbi10ZW1wbGF0ZWQgaW5uZXIgZnVuY3Rpb24gdG8gYXZvaWQgY29kZSBkdXBsaWNhdGlvbi4gVGFrZXMgYSBmdW5jdGlvbgorICAvLyBwb2ludGVyIHRvIHRoZSB0eXBlLXNwZWNpZmljICh0ZW1wbGF0ZWQpIGlubmVyIGFsbG9jYXRlL21lcmdlIGxvb3AuCisgIHZvaWQgTWVyZ2VGcm9tSW50ZXJuYWwoCisgICAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIsCisgICAgICB2b2lkIChSZXBlYXRlZFB0ckZpZWxkQmFzZTo6KmlubmVyX2xvb3ApKHZvaWQqKiwgdm9pZCoqLCBpbnQsIGludCkpOworCisgIHRlbXBsYXRlPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgorICB2b2lkIE1lcmdlRnJvbUlubmVyTG9vcCgKKyAgICAgIHZvaWQqKiBvdXJfZWxlbXMsIHZvaWQqKiBvdGhlcl9lbGVtcywgaW50IGxlbmd0aCwgaW50IGFscmVhZHlfYWxsb2NhdGVkKTsKKworICAvLyBJbnRlcm5hbCBoZWxwZXI6IGV4dGVuZCBhcnJheSBzcGFjZSBpZiBuZWNlc3NhcnkgdG8gY29udGFpbiB8ZXh0ZW5kX2Ftb3VudHwKKyAgLy8gbW9yZSBlbGVtZW50cywgYW5kIHJldHVybiBhIHBvaW50ZXIgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nCisgIC8vIHRoZSBvbGQgbGlzdCBvZiBlbGVtZW50cy4gIFRoaXMgaW50ZXJmYWNlIGZhY3RvcnMgb3V0IGNvbW1vbiBiZWhhdmlvciBmcm9tCisgIC8vIFJlc2VydmUoKSBhbmQgTWVyZ2VGcm9tKCkgdG8gcmVkdWNlIGNvZGUgc2l6ZS4gfGV4dGVuZF9hbW91bnR8IG11c3QgYmUgPiAwLgorICB2b2lkKiogSW50ZXJuYWxFeHRlbmQoaW50IGV4dGVuZF9hbW91bnQpOworCisgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhSZXBlYXRlZFB0ckZpZWxkQmFzZSk7CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJpY1R5cGU+CiBjbGFzcyBHZW5lcmljVHlwZUhhbmRsZXIgewogIHB1YmxpYzoKICAgdHlwZWRlZiBHZW5lcmljVHlwZSBUeXBlOwotICBzdGF0aWMgR2VuZXJpY1R5cGUqIE5ldygpIHsgcmV0dXJuIG5ldyBHZW5lcmljVHlwZTsgfQotICBzdGF0aWMgdm9pZCBEZWxldGUoR2VuZXJpY1R5cGUqIHZhbHVlKSB7IGRlbGV0ZSB2YWx1ZTsgfQotICBzdGF0aWMgdm9pZCBDbGVhcihHZW5lcmljVHlwZSogdmFsdWUpIHsgdmFsdWUtPkNsZWFyKCk7IH0KLSAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3QgR2VuZXJpY1R5cGUmIGZyb20sIEdlbmVyaWNUeXBlKiB0bykgewotICAgIHRvLT5NZXJnZUZyb20oZnJvbSk7CisgIHN0YXRpYyBpbmxpbmUgR2VuZXJpY1R5cGUqIE5ldyhBcmVuYSogYXJlbmEpIHsKKyAgICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6Q3JlYXRlTWF5YmVNZXNzYWdlPFR5cGU+KAorICAgICAgICBhcmVuYSwgc3RhdGljX2Nhc3Q8R2VuZXJpY1R5cGUqPigwKSk7CiAgIH0KLSAgc3RhdGljIGludCBTcGFjZVVzZWQoY29uc3QgR2VuZXJpY1R5cGUmIHZhbHVlKSB7IHJldHVybiB2YWx1ZS5TcGFjZVVzZWQoKTsgfQorICAvLyBXZSBmb3JjZSBOZXdGcm9tUHJvdG90eXBlKCkgYW5kIERlbGV0ZSgpIHRvIGJlIG5vbi1pbmxpbmUgdG8gcmVkdWNlIGNvZGUKKyAgLy8gc2l6ZTogZWxzZSwgc2V2ZXJhbCBvdGhlciBtZXRob2RzIGdldCBpbmxpbmVkIGNvcGllcyBvZiBtZXNzYWdlIHR5cGVzJworICAvLyBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzLgorICBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIHN0YXRpYyBHZW5lcmljVHlwZSogTmV3RnJvbVByb3RvdHlwZSgKKyAgICAgIGNvbnN0IEdlbmVyaWNUeXBlKiBwcm90b3R5cGUsIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hID0gTlVMTCk7CisgIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgc3RhdGljIHZvaWQgRGVsZXRlKEdlbmVyaWNUeXBlKiB2YWx1ZSwgQXJlbmEqIGFyZW5hKTsKKyAgc3RhdGljIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYShHZW5lcmljVHlwZSogdmFsdWUpIHsKKyAgICByZXR1cm4gOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYTo6R2V0QXJlbmE8VHlwZT4odmFsdWUpOworICB9CisgIHN0YXRpYyBpbmxpbmUgdm9pZCogR2V0TWF5YmVBcmVuYVBvaW50ZXIoR2VuZXJpY1R5cGUqIHZhbHVlKSB7CisgICAgcmV0dXJuIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkdldEFyZW5hPFR5cGU+KHZhbHVlKTsKKyAgfQorCisgIHN0YXRpYyBpbmxpbmUgdm9pZCBDbGVhcihHZW5lcmljVHlwZSogdmFsdWUpIHsgdmFsdWUtPkNsZWFyKCk7IH0KKyAgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORSBzdGF0aWMgdm9pZCBNZXJnZShjb25zdCBHZW5lcmljVHlwZSYgZnJvbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdlbmVyaWNUeXBlKiB0byk7CisgIHN0YXRpYyBpbmxpbmUgaW50IFNwYWNlVXNlZChjb25zdCBHZW5lcmljVHlwZSYgdmFsdWUpIHsKKyAgICByZXR1cm4gdmFsdWUuU3BhY2VVc2VkKCk7CisgIH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBUeXBlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiBUeXBlOjpkZWZhdWx0X2luc3RhbmNlKCk7CisgIH0KIH07CiAKLXRlbXBsYXRlIDw+Ci1pbmxpbmUgdm9pZCBHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+OjpNZXJnZSgKLSAgICBjb25zdCBNZXNzYWdlTGl0ZSYgZnJvbSwgTWVzc2FnZUxpdGUqIHRvKSB7Ci0gIHRvLT5DaGVja1R5cGVBbmRNZXJnZUZyb20oZnJvbSk7Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJpY1R5cGU+CitHZW5lcmljVHlwZSogR2VuZXJpY1R5cGVIYW5kbGVyPEdlbmVyaWNUeXBlPjo6TmV3RnJvbVByb3RvdHlwZSgKKyAgICBjb25zdCBHZW5lcmljVHlwZSogLyogcHJvdG90eXBlICovLCA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgeworICByZXR1cm4gTmV3KGFyZW5hKTsKIH0KK3RlbXBsYXRlIDx0eXBlbmFtZSBHZW5lcmljVHlwZT4KK3ZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPEdlbmVyaWNUeXBlPjo6RGVsZXRlKEdlbmVyaWNUeXBlKiB2YWx1ZSwgQXJlbmEqIGFyZW5hKSB7CisgIGlmIChhcmVuYSA9PSBOVUxMKSB7CisgICAgZGVsZXRlIHZhbHVlOworICB9Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgR2VuZXJpY1R5cGU+Cit2b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxHZW5lcmljVHlwZT46Ok1lcmdlKGNvbnN0IEdlbmVyaWNUeXBlJiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZW5lcmljVHlwZSogdG8pIHsKKyAgdG8tPk1lcmdlRnJvbShmcm9tKTsKK30KKworLy8gTmV3RnJvbVByb3RvdHlwZSgpIGFuZCBNZXJnZSgpIGNhbm5vdCBiZSBkZWZpbmVkIGhlcmU7IGlmIHRoZXkncmUgZGVjbGFyZWQKKy8vIGlubGluZSB0aGUgY29tcGlsZXIgd2lsbCBjb21wbGFpbiBhYm91dCBub3QgbWF0Y2hpbmcgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORQorLy8gYWJvdmUsIGFuZCBpZiBub3QsIGNvbXBpbGF0aW9uIHdpbGwgcmVzdWx0IGluIG11bHRpcGxlIGRlZmluaXRpb25zLiAgVGhlc2UKKy8vIGFyZSB0aGVyZWZvcmUgZGVjbGFyZWQgYXMgc3BlY2lhbGl6YXRpb25zIGhlcmUgYW5kIGRlZmluZWQgaW4KKy8vIG1lc3NhZ2VfbGl0ZS5jYy4KK3RlbXBsYXRlPD4KK01lc3NhZ2VMaXRlKiBHZW5lcmljVHlwZUhhbmRsZXI8TWVzc2FnZUxpdGU+OjpOZXdGcm9tUHJvdG90eXBlKAorICAgIGNvbnN0IE1lc3NhZ2VMaXRlKiBwcm90b3R5cGUsIGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7Cit0ZW1wbGF0ZTw+CitpbmxpbmUgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46OkdldEFyZW5hKAorICAgIE1lc3NhZ2VMaXRlKiB2YWx1ZSkgeworICByZXR1cm4gdmFsdWUtPkdldEFyZW5hKCk7Cit9Cit0ZW1wbGF0ZTw+CitpbmxpbmUgdm9pZCogR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2VMaXRlPjo6R2V0TWF5YmVBcmVuYVBvaW50ZXIoCisgICAgTWVzc2FnZUxpdGUqIHZhbHVlKSB7CisgIHJldHVybiB2YWx1ZS0+R2V0TWF5YmVBcmVuYVBvaW50ZXIoKTsKK30KK3RlbXBsYXRlIDw+Cit2b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46Ok1lcmdlKGNvbnN0IE1lc3NhZ2VMaXRlJiBmcm9tLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogdG8pOwordGVtcGxhdGU8PgoraW5saW5lIHZvaWQgR2VuZXJpY1R5cGVIYW5kbGVyPHN0cmluZz46OkNsZWFyKHN0cmluZyogdmFsdWUpIHsKKyAgdmFsdWUtPmNsZWFyKCk7Cit9Cit0ZW1wbGF0ZTw+Cit2b2lkIEdlbmVyaWNUeXBlSGFuZGxlcjxzdHJpbmc+OjpNZXJnZShjb25zdCBzdHJpbmcmIGZyb20sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIHRvKTsKKworLy8gRGVjbGFyYXRpb25zIG9mIHRoZSBzcGVjaWFsaXphdGlvbiBhcyB3ZSBjYW5ub3QgZGVmaW5lIHRoZW0gaGVyZSwgYXMgdGhlCisvLyBoZWFkZXIgdGhhdCBkZWZpbmVzIFByb3RvY29sTWVzc2FnZSBkZXBlbmRzIG9uIHR5cGVzIGRlZmluZWQgaW4gdGhpcyBoZWFkZXIuCisjZGVmaW5lIERFQ0xBUkVfU1BFQ0lBTElaQVRJT05TX0ZPUl9CQVNFX1BST1RPX1RZUEVTKFR5cGVOYW1lKSAgICAgICAgICAgICAgICAgXAorICAgIHRlbXBsYXRlPD4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUeXBlTmFtZSogR2VuZXJpY1R5cGVIYW5kbGVyPFR5cGVOYW1lPjo6TmV3RnJvbVByb3RvdHlwZSggICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNvbnN0IFR5cGVOYW1lKiBwcm90b3R5cGUsIGdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSk7ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0ZW1wbGF0ZTw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIEdlbmVyaWNUeXBlSGFuZGxlcjxUeXBlTmFtZT46OkdldEFyZW5hKCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVHlwZU5hbWUqIHZhbHVlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgdGVtcGxhdGU8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHZvaWQqIEdlbmVyaWNUeXBlSGFuZGxlcjxUeXBlTmFtZT46OkdldE1heWJlQXJlbmFQb2ludGVyKCAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVHlwZU5hbWUqIHZhbHVlKTsKKworLy8gTWVzc2FnZSBzcGVjaWFsaXphdGlvbiBib2RpZXMgZGVmaW5lZCBpbiBtZXNzYWdlLmNjLiBUaGlzIHNwbGl0IGlzIG5lY2Vzc2FyeQorLy8gdG8gYWxsb3cgcHJvdG8yLWxpdGUgKHdoaWNoIGluY2x1ZGVzIHRoaXMgaGVhZGVyKSB0byBiZSBpbmRlcGVuZGVudCBvZgorLy8gTWVzc2FnZS4KK0RFQ0xBUkVfU1BFQ0lBTElaQVRJT05TX0ZPUl9CQVNFX1BST1RPX1RZUEVTKE1lc3NhZ2UpCisKKworI3VuZGVmIERFQ0xBUkVfU1BFQ0lBTElaQVRJT05TX0ZPUl9CQVNFX1BST1RPX1RZUEVTCisKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgTWVzc2FnZUxpdGUmIEdlbmVyaWNUeXBlSGFuZGxlcjxNZXNzYWdlTGl0ZT46OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIC8vIFllcywgdGhlIGJlaGF2aW9yIG9mIHRoZSBjb2RlIGlzIHVuZGVmaW5lZCwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgb25seQorICAvLyBjYWxsZWQgd2hlbiB3ZSdyZSBhbHJlYWR5IGRlZXAgaW50byB0aGUgd29ybGQgb2YgdW5kZWZpbmVkLCBiZWNhdXNlIHRoZQorICAvLyBjYWxsZXIgY2FsbGVkIEdldChpbmRleCkgb3V0IG9mIGJvdW5kcy4KKyAgTWVzc2FnZUxpdGUqIG51bGwgPSBOVUxMOworICByZXR1cm4gKm51bGw7Cit9CisKK3RlbXBsYXRlIDw+CitpbmxpbmUgY29uc3QgTWVzc2FnZSYgR2VuZXJpY1R5cGVIYW5kbGVyPE1lc3NhZ2U+OjpkZWZhdWx0X2luc3RhbmNlKCkgeworICAvLyBZZXMsIHRoZSBiZWhhdmlvciBvZiB0aGUgY29kZSBpcyB1bmRlZmluZWQsIGJ1dCB0aGlzIGZ1bmN0aW9uIGlzIG9ubHkKKyAgLy8gY2FsbGVkIHdoZW4gd2UncmUgYWxyZWFkeSBkZWVwIGludG8gdGhlIHdvcmxkIG9mIHVuZGVmaW5lZCwgYmVjYXVzZSB0aGUKKyAgLy8gY2FsbGVyIGNhbGxlZCBHZXQoaW5kZXgpIG91dCBvZiBib3VuZHMuCisgIE1lc3NhZ2UqIG51bGwgPSBOVUxMOworICByZXR1cm4gKm51bGw7Cit9CisKIAogLy8gSEFDSzogIElmIGEgY2xhc3MgaXMgZGVjbGFyZWQgYXMgRExMLWV4cG9ydGVkIGluIE1TVkMsIGl0IGluc2lzdHMgb24KIC8vICAgZ2VuZXJhdGluZyBjb3BpZXMgb2YgYWxsIGl0cyBtZXRob2RzIC0tIGV2ZW4gaW5saW5lIG9uZXMgLS0gdG8gaW5jbHVkZQpAQCAtMjk4LDIxICs2ODUsNDEgQEAKIC8vICAgU3RyaW5nVHlwZUhhbmRsZXIgaXMgZXhwb3J0ZWQuICBTbywgd2UgZmFjdG9yIG91dCBTdHJpbmdUeXBlSGFuZGxlckJhc2UsCiAvLyAgIGV4cG9ydCB0aGF0LCB0aGVuIG1ha2UgU3RyaW5nVHlwZUhhbmRsZXIgYmUgYSBzdWJjbGFzcyB3aGljaCBpcyBOT1QKIC8vICAgZXhwb3J0ZWQuCi0vLyBUT0RPKGtlbnRvbik6ICBUaGVyZSBoYXMgdG8gYmUgYSBiZXR0ZXIgd2F5LgorLy8gVE9ETyhrZW50b24pOiAgTm93IHRoYXQgU3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpIGlzIGluIHRoZSBsaXRlCisvLyAgIGxpYnJhcnksIHRoaXMgY2FuIGJlIGNsZWFuZWQgdXAuCiBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgU3RyaW5nVHlwZUhhbmRsZXJCYXNlIHsKICBwdWJsaWM6CiAgIHR5cGVkZWYgc3RyaW5nIFR5cGU7Ci0gIHN0YXRpYyBzdHJpbmcqIE5ldygpOwotICBzdGF0aWMgdm9pZCBEZWxldGUoc3RyaW5nKiB2YWx1ZSk7Ci0gIHN0YXRpYyB2b2lkIENsZWFyKHN0cmluZyogdmFsdWUpIHsgdmFsdWUtPmNsZWFyKCk7IH0KLSAgc3RhdGljIHZvaWQgTWVyZ2UoY29uc3Qgc3RyaW5nJiBmcm9tLCBzdHJpbmcqIHRvKSB7ICp0byA9IGZyb207IH0KKworICBzdGF0aWMgaW5saW5lIHN0cmluZyogTmV3KEFyZW5hKiBhcmVuYSkgeworICAgIHJldHVybiBBcmVuYTo6Q3JlYXRlPHN0cmluZz4oYXJlbmEpOworICB9CisgIHN0YXRpYyBpbmxpbmUgc3RyaW5nKiBOZXdGcm9tUHJvdG90eXBlKGNvbnN0IHN0cmluZyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKSB7CisgICAgcmV0dXJuIE5ldyhhcmVuYSk7CisgIH0KKyAgc3RhdGljIGlubGluZSA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBHZXRBcmVuYShzdHJpbmcqKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkKiBHZXRNYXliZUFyZW5hUG9pbnRlcihzdHJpbmcqIC8qIHZhbHVlICovKSB7CisgICAgcmV0dXJuIE5VTEw7CisgIH0KKyAgc3RhdGljIGlubGluZSB2b2lkIERlbGV0ZShzdHJpbmcqIHZhbHVlLCBBcmVuYSogYXJlbmEpIHsKKyAgICBpZiAoYXJlbmEgPT0gTlVMTCkgeworICAgICAgZGVsZXRlIHZhbHVlOworICAgIH0KKyAgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgQ2xlYXIoc3RyaW5nKiB2YWx1ZSkgeyB2YWx1ZS0+Y2xlYXIoKTsgfQorICBzdGF0aWMgaW5saW5lIHZvaWQgTWVyZ2UoY29uc3Qgc3RyaW5nJiBmcm9tLCBzdHJpbmcqIHRvKSB7ICp0byA9IGZyb207IH0KKyAgc3RhdGljIGlubGluZSBjb25zdCBUeXBlJiBkZWZhdWx0X2luc3RhbmNlKCkgeworICAgIHJldHVybiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpHZXRFbXB0eVN0cmluZygpOworICB9CiB9OwogCiBjbGFzcyBTdHJpbmdUeXBlSGFuZGxlciA6IHB1YmxpYyBTdHJpbmdUeXBlSGFuZGxlckJhc2UgewogIHB1YmxpYzoKICAgc3RhdGljIGludCBTcGFjZVVzZWQoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgIHsKLSAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigKLSAgICAgICAgc2l6ZW9mKHZhbHVlKSArIFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYodmFsdWUpKTsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihzaXplb2YodmFsdWUpKSArIFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYodmFsdWUpOwogICB9CiB9OwogCkBAIC0zMjUsMTcgKzczMiwzMSBAQAogY2xhc3MgUmVwZWF0ZWRQdHJGaWVsZCA6IHB1YmxpYyBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhc2UgewogIHB1YmxpYzoKICAgUmVwZWF0ZWRQdHJGaWVsZCgpOworICBleHBsaWNpdCBSZXBlYXRlZFB0ckZpZWxkKDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmEqIGFyZW5hKTsKKwogICBSZXBlYXRlZFB0ckZpZWxkKGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKTsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CisgIFJlcGVhdGVkUHRyRmllbGQoSXRlciBiZWdpbiwgY29uc3QgSXRlciYgZW5kKTsKICAgflJlcGVhdGVkUHRyRmllbGQoKTsKIAogICBSZXBlYXRlZFB0ckZpZWxkJiBvcGVyYXRvcj0oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpOwogCisgIGJvb2wgZW1wdHkoKSBjb25zdDsKICAgaW50IHNpemUoKSBjb25zdDsKIAogICBjb25zdCBFbGVtZW50JiBHZXQoaW50IGluZGV4KSBjb25zdDsKICAgRWxlbWVudCogTXV0YWJsZShpbnQgaW5kZXgpOwogICBFbGVtZW50KiBBZGQoKTsKLSAgdm9pZCBSZW1vdmVMYXN0KCk7ICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBpbiB0aGUgYXJyYXkuCisKKyAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgaW4gdGhlIGFycmF5LgorICAvLyBPd25lcnNoaXAgb2YgdGhlIGVsZW1lbnQgaXMgcmV0YWluZWQgYnkgdGhlIGFycmF5LgorICB2b2lkIFJlbW92ZUxhc3QoKTsKKworICAvLyBEZWxldGUgZWxlbWVudHMgd2l0aCBpbmRpY2VzIGluIHRoZSByYW5nZSBbc3RhcnQgLi4gc3RhcnQrbnVtLTFdLgorICAvLyBDYXV0aW9uOiBpbXBsZW1lbnRhdGlvbiBtb3ZlcyBhbGwgZWxlbWVudHMgd2l0aCBpbmRpY2VzIFtzdGFydCtudW0gLi4gXS4KKyAgLy8gQ2FsbGluZyB0aGlzIHJvdXRpbmUgaW5zaWRlIGEgbG9vcCBjYW4gY2F1c2UgcXVhZHJhdGljIGJlaGF2aW9yLgorICB2b2lkIERlbGV0ZVN1YnJhbmdlKGludCBzdGFydCwgaW50IG51bSk7CisKICAgdm9pZCBDbGVhcigpOwogICB2b2lkIE1lcmdlRnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcik7CiAgIHZvaWQgQ29weUZyb20oY29uc3QgUmVwZWF0ZWRQdHJGaWVsZCYgb3RoZXIpOwpAQCAtMzUyLDkgKzc3MywxNiBAQAogICBFbGVtZW50KiogbXV0YWJsZV9kYXRhKCk7CiAgIGNvbnN0IEVsZW1lbnQqIGNvbnN0KiBkYXRhKCkgY29uc3Q7CiAKLSAgLy8gU3dhcCBlbnRpcmUgY29udGVudHMgd2l0aCAib3RoZXIiLgorICAvLyBTd2FwIGVudGlyZSBjb250ZW50cyB3aXRoICJvdGhlciIuIElmIHRoZXkgYXJlIG9uIHNlcGFyYXRlIGFyZW5hcywgdGhlbgorICAvLyBjb3BpZXMgZGF0YS4KICAgdm9pZCBTd2FwKFJlcGVhdGVkUHRyRmllbGQqIG90aGVyKTsKIAorICAvLyBTd2FwIGVudGlyZSBjb250ZW50cyB3aXRoICJvdGhlciIuIENhbGxlciBzaG91bGQgZ3VhcmFudGVlIHRoYXQgZWl0aGVyIGJvdGgKKyAgLy8gZmllbGRzIGFyZSBvbiB0aGUgc2FtZSBhcmVuYSBvciBib3RoIGFyZSBvbiB0aGUgaGVhcC4gU3dhcHBpbmcgYmV0d2VlbgorICAvLyBkaWZmZXJlbnQgYXJlbmFzIHdpdGggdGhpcyBmdW5jdGlvbiBpcyBkaXNhbGxvd2VkIGFuZCBpcyBjYXVnaHQgdmlhCisgIC8vIEdPT0dMRV9EQ0hFQ0suCisgIHZvaWQgVW5zYWZlQXJlbmFTd2FwKFJlcGVhdGVkUHRyRmllbGQqIG90aGVyKTsKKwogICAvLyBTd2FwIHR3byBlbGVtZW50cy4KICAgdm9pZCBTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4Mik7CiAKQEAgLTM2Miw0MiArNzkwLDEyNiBAQAogICB0eXBlZGVmIGludGVybmFsOjpSZXBlYXRlZFB0ckl0ZXJhdG9yPEVsZW1lbnQ+IGl0ZXJhdG9yOwogICB0eXBlZGVmIGludGVybmFsOjpSZXBlYXRlZFB0ckl0ZXJhdG9yPGNvbnN0IEVsZW1lbnQ+IGNvbnN0X2l0ZXJhdG9yOwogICB0eXBlZGVmIEVsZW1lbnQgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiB2YWx1ZV90eXBlJiByZWZlcmVuY2U7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSYgY29uc3RfcmVmZXJlbmNlOworICB0eXBlZGVmIHZhbHVlX3R5cGUqIHBvaW50ZXI7CisgIHR5cGVkZWYgY29uc3QgdmFsdWVfdHlwZSogY29uc3RfcG9pbnRlcjsKKyAgdHlwZWRlZiBpbnQgc2l6ZV90eXBlOworICB0eXBlZGVmIHB0cmRpZmZfdCBkaWZmZXJlbmNlX3R5cGU7CiAKICAgaXRlcmF0b3IgYmVnaW4oKTsKICAgY29uc3RfaXRlcmF0b3IgYmVnaW4oKSBjb25zdDsKKyAgY29uc3RfaXRlcmF0b3IgY2JlZ2luKCkgY29uc3Q7CiAgIGl0ZXJhdG9yIGVuZCgpOwogICBjb25zdF9pdGVyYXRvciBlbmQoKSBjb25zdDsKKyAgY29uc3RfaXRlcmF0b3IgY2VuZCgpIGNvbnN0OworCisgIC8vIFJldmVyc2UgaXRlcmF0b3Igc3VwcG9ydAorICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxjb25zdF9pdGVyYXRvcj4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcjsKKyAgdHlwZWRlZiBzdGQ6OnJldmVyc2VfaXRlcmF0b3I8aXRlcmF0b3I+IHJldmVyc2VfaXRlcmF0b3I7CisgIHJldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgeworICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGVuZCgpKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJiZWdpbigpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihlbmQoKSk7CisgIH0KKyAgcmV2ZXJzZV9pdGVyYXRvciByZW5kKCkgeworICAgIHJldHVybiByZXZlcnNlX2l0ZXJhdG9yKGJlZ2luKCkpOworICB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmVuZCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29uc3RfcmV2ZXJzZV9pdGVyYXRvcihiZWdpbigpKTsKKyAgfQogCiAgIC8vIEN1c3RvbSBTVEwtbGlrZSBpdGVyYXRvciB0aGF0IGl0ZXJhdGVzIG92ZXIgYW5kIHJldHVybnMgdGhlIHVuZGVybHlpbmcKICAgLy8gcG9pbnRlcnMgdG8gRWxlbWVudCByYXRoZXIgdGhhbiBFbGVtZW50IGl0c2VsZi4KLSAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yPEVsZW1lbnQ+IHBvaW50ZXJfaXRlcmF0b3I7CisgIHR5cGVkZWYgaW50ZXJuYWw6OlJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxFbGVtZW50LCB2b2lkKj4KKyAgcG9pbnRlcl9pdGVyYXRvcjsKKyAgdHlwZWRlZiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yPGNvbnN0IEVsZW1lbnQsIGNvbnN0IHZvaWQqPgorICBjb25zdF9wb2ludGVyX2l0ZXJhdG9yOwogICBwb2ludGVyX2l0ZXJhdG9yIHBvaW50ZXJfYmVnaW4oKTsKKyAgY29uc3RfcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2JlZ2luKCkgY29uc3Q7CiAgIHBvaW50ZXJfaXRlcmF0b3IgcG9pbnRlcl9lbmQoKTsKKyAgY29uc3RfcG9pbnRlcl9pdGVyYXRvciBwb2ludGVyX2VuZCgpIGNvbnN0OwogCiAgIC8vIFJldHVybnMgKGFuIGVzdGltYXRlIG9mKSB0aGUgbnVtYmVyIG9mIGJ5dGVzIHVzZWQgYnkgdGhlIHJlcGVhdGVkIGZpZWxkLAogICAvLyBleGNsdWRpbmcgc2l6ZW9mKCp0aGlzKS4KICAgaW50IFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdDsKIAogICAvLyBBZHZhbmNlZCBtZW1vcnkgbWFuYWdlbWVudCAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotICAvLyBXaGVuIGhhcmRjb3JlIG1lbW9yeSBtYW5hZ2VtZW50IGJlY29tZXMgbmVjZXNzYXJ5IC0tIGFzIGl0IG9mdGVuCisgIC8vIFdoZW4gaGFyZGNvcmUgbWVtb3J5IG1hbmFnZW1lbnQgYmVjb21lcyBuZWNlc3NhcnkgLS0gYXMgaXQgc29tZXRpbWVzCiAgIC8vIGRvZXMgaGVyZSBhdCBHb29nbGUgLS0gdGhlIGZvbGxvd2luZyBtZXRob2RzIG1heSBiZSB1c2VmdWwuCiAKICAgLy8gQWRkIGFuIGFscmVhZHktYWxsb2NhdGVkIG9iamVjdCwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlCiAgIC8vIFJlcGVhdGVkUHRyRmllbGQuCisgIC8vCisgIC8vIE5vdGUgdGhhdCBzb21lIHNwZWNpYWwgYmVoYXZpb3Igb2NjdXJzIHdpdGggcmVzcGVjdCB0byBhcmVuYXM6CisgIC8vCisgIC8vICAgKGkpIGlmIHRoaXMgZmllbGQgaG9sZHMgc3VibWVzc2FnZXMsIHRoZSBuZXcgc3VibWVzc2FnZSB3aWxsIGJlIGNvcGllZCBpZgorICAvLyAgIHRoZSBvcmlnaW5hbCBpcyBpbiBhbiBhcmVuYSBhbmQgdGhpcyBSZXBlYXRlZFB0ckZpZWxkIGlzIGVpdGhlciBpbiBhCisgIC8vICAgZGlmZmVyZW50IGFyZW5hLCBvciBvbiB0aGUgaGVhcC4KKyAgLy8gICAoaWkpIGlmIHRoaXMgZmllbGQgaG9sZHMgc3RyaW5ncywgdGhlIHBhc3NlZC1pbiBzdHJpbmcgKm11c3QqIGJlCisgIC8vICAgaGVhcC1hbGxvY2F0ZWQsIG5vdCBhcmVuYS1hbGxvY2F0ZWQuIFRoZXJlIGlzIG5vIHdheSB0byBkeW5hbWljYWxseSBjaGVjaworICAvLyAgIHRoaXMgYXQgcnVudGltZSwgc28gVXNlciBCZXdhcmUuCiAgIHZvaWQgQWRkQWxsb2NhdGVkKEVsZW1lbnQqIHZhbHVlKTsKLSAgLy8gUmVtb3ZlIHRoZSBsYXN0IGVsZW1lbnQgYW5kIHJldHVybiBpdCwgcGFzc2luZyBvd25lcnNoaXAgdG8gdGhlCi0gIC8vIGNhbGxlci4KKworICAvLyBSZW1vdmUgdGhlIGxhc3QgZWxlbWVudCBhbmQgcmV0dXJuIGl0LCBwYXNzaW5nIG93bmVyc2hpcCB0byB0aGUgY2FsbGVyLgogICAvLyBSZXF1aXJlczogIHNpemUoKSA+IDAKKyAgLy8KKyAgLy8gSWYgdGhpcyBSZXBlYXRlZFB0ckZpZWxkIGlzIG9uIGFuIGFyZW5hLCBhbiBvYmplY3QgY29weSBpcyByZXF1aXJlZCB0byBwYXNzCisgIC8vIG93bmVyc2hpcCBiYWNrIHRvIHRoZSB1c2VyIChmb3IgY29tcGF0aWJsZSBzZW1hbnRpY3MpLiBVc2UKKyAgLy8gVW5zYWZlQXJlbmFSZWxlYXNlTGFzdCgpIGlmIHRoaXMgYmVoYXZpb3IgaXMgdW5kZXNpcmVkLgogICBFbGVtZW50KiBSZWxlYXNlTGFzdCgpOwogCisgIC8vIEFkZCBhbiBhbHJlYWR5LWFsbG9jYXRlZCBvYmplY3QsIHNraXBwaW5nIGFyZW5hLW93bmVyc2hpcCBjaGVja3MuIFRoZSB1c2VyCisgIC8vIG11c3QgZ3VhcmFudGVlIHRoYXQgdGhlIGdpdmVuIG9iamVjdCBpcyBpbiB0aGUgc2FtZSBhcmVuYSBhcyB0aGlzCisgIC8vIFJlcGVhdGVkUHRyRmllbGQuCisgIC8vIEl0IGlzIGFsc28gdXNlZnVsIGluIGxlZ2FjeSBjb2RlIHRoYXQgdXNlcyB0ZW1wb3Jhcnkgb3duZXJzaGlwIHRvIGF2b2lkCisgIC8vIGNvcGllcy4gRXhhbXBsZToKKyAgLy8gUmVwZWF0ZWRQdHJGaWVsZDxUPiB0ZW1wX2ZpZWxkOworICAvLyB0ZW1wX2ZpZWxkLkFkZEFsbG9jYXRlZChuZXcgVCk7CisgIC8vIC4uLiAvLyBEbyBzb21ldGhpbmcgd2l0aCB0ZW1wX2ZpZWxkCisgIC8vIHRlbXBfZmllbGQuRXh0cmFjdFN1YnJhbmdlKDAsIHRlbXBfZmllbGQuc2l6ZSgpLCBOVUxMKTsKKyAgLy8gSWYgeW91IHB1dCB0ZW1wX2ZpZWxkIG9uIHRoZSBhcmVuYSB0aGlzIGZhaWxzLCBiZWNhdXNlIHRoZSBvd25lcnNoaXAKKyAgLy8gdHJhbnNmZXJzIHRvIHRoZSBhcmVuYSBhdCB0aGUgIkFkZEFsbG9jYXRlZCIgY2FsbCBhbmQgaXMgbm90IHJlbGVhc2VkCisgIC8vIGFueW1vcmUgY2F1c2luZyBhIGRvdWJsZSBkZWxldGUuIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkIHByZXZlbnRzIHRoaXMuCisgIHZvaWQgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQoRWxlbWVudCogdmFsdWUpOworCisgIC8vIFJlbW92ZSB0aGUgbGFzdCBlbGVtZW50IGFuZCByZXR1cm4gaXQuICBXb3JrcyBvbmx5IHdoZW4gb3BlcmF0aW5nIG9uIGFuCisgIC8vIGFyZW5hLiBUaGUgcmV0dXJuZWQgcG9pbnRlciBpcyB0byB0aGUgb3JpZ2luYWwgb2JqZWN0IGluIHRoZSBhcmVuYSwgaGVuY2UKKyAgLy8gaGFzIHRoZSBhcmVuYSdzIGxpZmV0aW1lLgorICAvLyBSZXF1aXJlczogIGN1cnJlbnRfc2l6ZV8gPiAwCisgIEVsZW1lbnQqIFVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKTsKKworICAvLyBFeHRyYWN0IGVsZW1lbnRzIHdpdGggaW5kaWNlcyBpbiB0aGUgcmFuZ2UgIltzdGFydCAuLiBzdGFydCtudW0tMV0iLgorICAvLyBUaGUgY2FsbGVyIGFzc3VtZXMgb3duZXJzaGlwIG9mIHRoZSBleHRyYWN0ZWQgZWxlbWVudHMgYW5kIGlzIHJlc3BvbnNpYmxlCisgIC8vIGZvciBkZWxldGluZyB0aGVtIHdoZW4gdGhleSBhcmUgbm8gbG9uZ2VyIG5lZWRlZC4KKyAgLy8gSWYgImVsZW1lbnRzIiBpcyBub24tTlVMTCwgdGhlbiBwb2ludGVycyB0byB0aGUgZXh0cmFjdGVkIGVsZW1lbnRzCisgIC8vIGFyZSBzdG9yZWQgaW4gImVsZW1lbnRzWzAgLi4gbnVtLTFdIiBmb3IgdGhlIGNvbnZlbmllbmNlIG9mIHRoZSBjYWxsZXIuCisgIC8vIElmICJlbGVtZW50cyIgaXMgTlVMTCwgdGhlbiB0aGUgY2FsbGVyIG11c3QgdXNlIHNvbWUgb3RoZXIgbWVjaGFuaXNtCisgIC8vIHRvIHBlcmZvcm0gYW55IGZ1cnRoZXIgb3BlcmF0aW9ucyAobGlrZSBkZWxldGlvbikgb24gdGhlc2UgZWxlbWVudHMuCisgIC8vIENhdXRpb246IGltcGxlbWVudGF0aW9uIGFsc28gbW92ZXMgZWxlbWVudHMgd2l0aCBpbmRpY2VzIFtzdGFydCtudW0gLi5dLgorICAvLyBDYWxsaW5nIHRoaXMgcm91dGluZSBpbnNpZGUgYSBsb29wIGNhbiBjYXVzZSBxdWFkcmF0aWMgYmVoYXZpb3IuCisgIC8vCisgIC8vIE1lbW9yeSBjb3B5aW5nIGJlaGF2aW9yIGlzIGlkZW50aWNhbCB0byBSZWxlYXNlTGFzdCgpLCBkZXNjcmliZWQgYWJvdmU6IGlmCisgIC8vIHRoaXMgUmVwZWF0ZWRQdHJGaWVsZCBpcyBvbiBhbiBhcmVuYSwgYW4gb2JqZWN0IGNvcHkgaXMgcGVyZm9ybWVkIGZvciBlYWNoCisgIC8vIHJldHVybmVkIGVsZW1lbnQsIHNvIHRoYXQgYWxsIHJldHVybmVkIGVsZW1lbnQgcG9pbnRlcnMgYXJlIHRvCisgIC8vIGhlYXAtYWxsb2NhdGVkIGNvcGllcy4gSWYgdGhpcyBjb3B5IGlzIG5vdCBkZXNpcmVkLCB0aGUgdXNlciBzaG91bGQgY2FsbAorICAvLyBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZSgpLgorICB2b2lkIEV4dHJhY3RTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cyk7CisKKyAgLy8gSWRlbnRpY2FsIHRvIEV4dHJhY3RTdWJyYW5nZSgpIGRlc2NyaWJlZCBhYm92ZSwgZXhjZXB0IHRoYXQgd2hlbiB0aGlzCisgIC8vIHJlcGVhdGVkIGZpZWxkIGlzIG9uIGFuIGFyZW5hLCBubyBvYmplY3QgY29waWVzIGFyZSBwZXJmb3JtZWQuIEluc3RlYWQsIHRoZQorICAvLyByYXcgb2JqZWN0IHBvaW50ZXJzIGFyZSByZXR1cm5lZC4gVGh1cywgaWYgb24gYW4gYXJlbmEsIHRoZSByZXR1cm5lZAorICAvLyBvYmplY3RzIG11c3Qgbm90IGJlIGZyZWVkLCBiZWNhdXNlIHRoZXkgd2lsbCBub3QgYmUgaGVhcC1hbGxvY2F0ZWQgb2JqZWN0cy4KKyAgdm9pZCBVbnNhZmVBcmVuYUV4dHJhY3RTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cyk7CisKICAgLy8gV2hlbiBlbGVtZW50cyBhcmUgcmVtb3ZlZCBieSBjYWxscyB0byBSZW1vdmVMYXN0KCkgb3IgQ2xlYXIoKSwgdGhleQogICAvLyBhcmUgbm90IGFjdHVhbGx5IGZyZWVkLiAgSW5zdGVhZCwgdGhleSBhcmUgY2xlYXJlZCBhbmQga2VwdCBzbyB0aGF0CiAgIC8vIHRoZXkgY2FuIGJlIHJldXNlZCBsYXRlci4gIFRoaXMgY2FuIHNhdmUgbG90cyBvZiBDUFUgdGltZSB3aGVuCiAgIC8vIHJlcGVhdGVkbHkgcmV1c2luZyBhIHByb3RvY29sIG1lc3NhZ2UgZm9yIHNpbWlsYXIgcHVycG9zZXMuCiAgIC8vCi0gIC8vIFJlYWxseSwgZXh0cmVtZWx5IGhhcmRjb3JlIHByb2dyYW1zIG1heSBhY3R1YWxseSB3YW50IHRvIG1hbmlwdWxhdGUKLSAgLy8gdGhlc2Ugb2JqZWN0cyB0byBiZXR0ZXItb3B0aW1pemUgbWVtb3J5IG1hbmFnZW1lbnQuICBUaGVzZSBtZXRob2RzCi0gIC8vIGFsbG93IHRoYXQuCisgIC8vIEhhcmRjb3JlIHByb2dyYW1zIG1heSBjaG9vc2UgdG8gbWFuaXB1bGF0ZSB0aGVzZSBjbGVhcmVkIG9iamVjdHMKKyAgLy8gdG8gYmV0dGVyIG9wdGltaXplIG1lbW9yeSBtYW5hZ2VtZW50IHVzaW5nIHRoZSBmb2xsb3dpbmcgcm91dGluZXMuCiAKICAgLy8gR2V0IHRoZSBudW1iZXIgb2YgY2xlYXJlZCBvYmplY3RzIHRoYXQgYXJlIGN1cnJlbnRseSBiZWluZyBrZXB0CiAgIC8vIGFyb3VuZCBmb3IgcmV1c2UuCkBAIC00MDUsMTIgKzkxNywzOSBAQAogICAvLyBBZGQgYW4gZWxlbWVudCB0byB0aGUgcG9vbCBvZiBjbGVhcmVkIG9iamVjdHMsIHBhc3Npbmcgb3duZXJzaGlwIHRvCiAgIC8vIHRoZSBSZXBlYXRlZFB0ckZpZWxkLiAgVGhlIGVsZW1lbnQgbXVzdCBiZSBjbGVhcmVkIHByaW9yIHRvIGNhbGxpbmcKICAgLy8gdGhpcyBtZXRob2QuCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVwZWF0ZWQgZmllbGQgaXMgb24gYW4gYXJlbmEgb3Igd2hlbgorICAvLyB8dmFsdWV8IGlzOyBib3RoIGNhc2VzIHdpbGwgdHJpZ2dlciBhIEdPT0dMRV9EQ0hFQ0stZmFpbHVyZS4KICAgdm9pZCBBZGRDbGVhcmVkKEVsZW1lbnQqIHZhbHVlKTsKICAgLy8gUmVtb3ZlIGEgc2luZ2xlIGVsZW1lbnQgZnJvbSB0aGUgY2xlYXJlZCBwb29sIGFuZCByZXR1cm4gaXQsIHBhc3NpbmcKICAgLy8gb3duZXJzaGlwIHRvIHRoZSBjYWxsZXIuICBUaGUgZWxlbWVudCBpcyBndWFyYW50ZWVkIHRvIGJlIGNsZWFyZWQuCiAgIC8vIFJlcXVpcmVzOiAgQ2xlYXJlZENvdW50KCkgPiAwCisgIC8vCisgIC8vCisgIC8vIFRoaXMgbWV0aG9kIGNhbm5vdCBiZSBjYWxsZWQgd2hlbiB0aGUgcmVwZWF0ZWQgZmllbGQgaXMgb24gYW4gYXJlbmE7IGRvaW5nCisgIC8vIHNvIHdpbGwgdHJpZ2dlciBhIEdPT0dMRV9EQ0hFQ0stZmFpbHVyZS4KICAgRWxlbWVudCogUmVsZWFzZUNsZWFyZWQoKTsKIAorICAvLyBSZW1vdmVzIHRoZSBlbGVtZW50IHJlZmVyZW5jZWQgYnkgcG9zaXRpb24uCisgIC8vCisgIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSByZW1vdmVkCisgIC8vIGVsZW1lbnQuCisgIC8vCisgIC8vIEludmFsaWRhdGVzIGFsbCBpdGVyYXRvcnMgYXQgb3IgYWZ0ZXIgdGhlIHJlbW92ZWQgZWxlbWVudCwgaW5jbHVkaW5nIGVuZCgpLgorICBpdGVyYXRvciBlcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbik7CisKKyAgLy8gUmVtb3ZlcyB0aGUgZWxlbWVudHMgaW4gdGhlIHJhbmdlIFtmaXJzdCwgbGFzdCkuCisgIC8vCisgIC8vIFJldHVybnMgYW4gaXRlcmF0b3IgdG8gdGhlIGVsZW1lbnQgaW1tZWRpYXRlbHkgZm9sbG93aW5nIHRoZSByZW1vdmVkIHJhbmdlLgorICAvLworICAvLyBJbnZhbGlkYXRlcyBhbGwgaXRlcmF0b3JzIGF0IG9yIGFmdGVyIHRoZSByZW1vdmVkIHJhbmdlLCBpbmNsdWRpbmcgZW5kKCkuCisgIGl0ZXJhdG9yIGVyYXNlKGNvbnN0X2l0ZXJhdG9yIGZpcnN0LCBjb25zdF9pdGVyYXRvciBsYXN0KTsKKworICAvLyBHZXRzIHRoZSBhcmVuYSBvbiB3aGljaCB0aGlzIFJlcGVhdGVkUHRyRmllbGQgc3RvcmVzIGl0cyBlbGVtZW50cy4KKyAgOjpnb29nbGU6OnByb3RvYnVmOjpBcmVuYSogR2V0QXJlbmEoKSBjb25zdCB7CisgICAgcmV0dXJuIEdldEFyZW5hTm9WaXJ0dWFsKCk7CisgIH0KKwogIHByb3RlY3RlZDoKICAgLy8gTm90ZTogIFJlcGVhdGVkUHRyRmllbGQgU0hPVUxEIE5PVCBiZSBzdWJjbGFzc2VkIGJ5IHVzZXJzLiAgV2Ugb25seQogICAvLyAgIHN1YmNsYXNzIGl0IGluIG9uZSBwbGFjZSBhcyBhIGhhY2sgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuICBUaGUKQEAgLTQxOCw0MCArOTU3LDk1IEBACiAgIC8vICAgbWV0aG9kcyBvbiBSZXBlYXRlZFB0ckZpZWxkQmFzZS4KICAgY2xhc3MgVHlwZUhhbmRsZXI7CiAKKyAgLy8gSW50ZXJuYWwgYXJlbmEgYWNjZXNzb3IgZXhwZWN0ZWQgYnkgaGVscGVycyBpbiBBcmVuYS4KKyAgaW5saW5lIEFyZW5hKiBHZXRBcmVuYU5vVmlydHVhbCgpIGNvbnN0OworCisgcHJpdmF0ZToKKyAgLy8gSW1wbGVtZW50YXRpb25zIGZvciBFeHRyYWN0U3VicmFuZ2UoKS4gVGhlIGNvcHlpbmcgYmVoYXZpb3IgbXVzdCBiZQorICAvLyBpbmNsdWRlZCBvbmx5IGlmIHRoZSB0eXBlIHN1cHBvcnRzIHRoZSBuZWNlc3Nhcnkgb3BlcmF0aW9ucyAoZS5nLiwKKyAgLy8gTWVyZ2VGcm9tKCkpLCBzbyB3ZSBtdXN0IHJlc29sdmUgdGhpcyBhdCBjb21waWxlIHRpbWUuIEV4dHJhY3RTdWJyYW5nZSgpCisgIC8vIHVzZXMgU0ZJTkFFIHRvIGNob29zZSBvbmUgb2YgdGhlIGJlbG93IGltcGxlbWVudGF0aW9ucy4KKyAgdm9pZCBFeHRyYWN0U3VicmFuZ2VJbnRlcm5hbChpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlKTsKKyAgdm9pZCBFeHRyYWN0U3VicmFuZ2VJbnRlcm5hbChpbnQgc3RhcnQsIGludCBudW0sIEVsZW1lbnQqKiBlbGVtZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZmFsc2VfdHlwZSk7CisKKyAgZnJpZW5kIGNsYXNzIEFyZW5hOworICB0eXBlZGVmIHZvaWQgSW50ZXJuYWxBcmVuYUNvbnN0cnVjdGFibGVfOworCiB9OwogCiAvLyBpbXBsZW1lbnRhdGlvbiA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkRmllbGQoKQotICA6IGVsZW1lbnRzXyhpbml0aWFsX3NwYWNlXyksCi0gICAgY3VycmVudF9zaXplXygwKSwKLSAgICB0b3RhbF9zaXplXyhrSW5pdGlhbFNpemUpIHsKKyAgOiBjdXJyZW50X3NpemVfKDApLAorICAgIHRvdGFsX3NpemVfKDApLAorICAgIHJlcF8oTlVMTCkgeworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpSZXBlYXRlZEZpZWxkKEFyZW5hKiBhcmVuYSkKKyAgOiBjdXJyZW50X3NpemVfKDApLAorICAgIHRvdGFsX3NpemVfKDApLAorICAgIHJlcF8oTlVMTCkgeworIC8vIEluIGNhc2UgYXJlbmEgaXMgTlVMTCwgdGhlbiB3ZSBkbyBub3QgY3JlYXRlIHJlcF8sIGFzIGNvZGUgaGFzIGFuIGludmFyaWFudAorIC8vIGByZXBfID09IE5VTEwgdGhlbiBhcmVuYSA9PSBOVUxMYC4KKyBpZiAoYXJlbmEgIT0gTlVMTCkgeworICByZXBfID0gcmVpbnRlcnByZXRfY2FzdDxSZXAqPigKKyAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6QXJlbmE6OkNyZWF0ZUFycmF5PGNoYXI+KGFyZW5hLCBrUmVwSGVhZGVyU2l6ZSkpOworICByZXBfLT5hcmVuYSA9IGFyZW5hOworIH0KIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZChjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcikKLSAgOiBlbGVtZW50c18oaW5pdGlhbF9zcGFjZV8pLAotICAgIGN1cnJlbnRfc2l6ZV8oMCksCi0gICAgdG90YWxfc2l6ZV8oa0luaXRpYWxTaXplKSB7CisgIDogY3VycmVudF9zaXplXygwKSwKKyAgICB0b3RhbF9zaXplXygwKSwKKyAgICByZXBfKE5VTEwpIHsKICAgQ29weUZyb20ob3RoZXIpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KLVJlcGVhdGVkRmllbGQ8RWxlbWVudD46On5SZXBlYXRlZEZpZWxkKCkgewotICBpZiAoZWxlbWVudHNfICE9IGluaXRpYWxfc3BhY2VfKSB7Ci0gICAgZGVsZXRlIFtdIGVsZW1lbnRzXzsKK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyPgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRGaWVsZChJdGVyIGJlZ2luLCBjb25zdCBJdGVyJiBlbmQpCisgIDogY3VycmVudF9zaXplXygwKSwKKyAgICB0b3RhbF9zaXplXygwKSwKKyAgICByZXBfKE5VTEwpIHsKKyAgaW50IHJlc2VydmUgPSBpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZShiZWdpbiwgZW5kKTsKKyAgaWYgKHJlc2VydmUgIT0gLTEpIHsKKyAgICBSZXNlcnZlKHJlc2VydmUpOworICAgIGZvciAoOyBiZWdpbiAhPSBlbmQ7ICsrYmVnaW4pIHsKKyAgICAgIEFkZEFscmVhZHlSZXNlcnZlZCgqYmVnaW4pOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICBmb3IgKDsgYmVnaW4gIT0gZW5kOyArK2JlZ2luKSB7CisgICAgICBBZGQoKmJlZ2luKTsKKyAgICB9CiAgIH0KIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+Ojp+UmVwZWF0ZWRGaWVsZCgpIHsKKyAgLy8gU2VlIGV4cGxhbmF0aW9uIGluIFJlc2VydmUoKTogd2UgbmVlZCB0byBpbnZva2UgZGVzdHJ1Y3RvcnMgaGVyZSBmb3IgdGhlCisgIC8vIGNhc2UgdGhhdCBFbGVtZW50IGhhcyBhIG5vbi10cml2aWFsIGRlc3RydWN0b3IuCisgIEludGVybmFsRGVhbGxvY2F0ZShyZXBfLCB0b3RhbF9zaXplXyk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD4mCiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpvcGVyYXRvcj0oY29uc3QgUmVwZWF0ZWRGaWVsZCYgb3RoZXIpIHsKLSAgQ29weUZyb20ob3RoZXIpOworICBpZiAodGhpcyAhPSAmb3RoZXIpCisgICAgQ29weUZyb20ob3RoZXIpOwogICByZXR1cm4gKnRoaXM7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIGJvb2wgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZW1wdHkoKSBjb25zdCB7CisgIHJldHVybiBjdXJyZW50X3NpemVfID09IDA7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIGludCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpzaXplKCkgY29uc3QgewogICByZXR1cm4gY3VycmVudF9zaXplXzsKIH0KQEAgLTQ2Myw1MCArMTA1Nyw4NSBAQAogCiB0ZW1wbGF0ZTx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6QWRkQWxyZWFkeVJlc2VydmVkKGNvbnN0IEVsZW1lbnQmIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTFQoc2l6ZSgpLCBDYXBhY2l0eSgpKTsKLSAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKKyAgR09PR0xFX0RDSEVDS19MVChjdXJyZW50X3NpemVfLCB0b3RhbF9zaXplXyk7CisgIHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKIH0KIAogdGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpBZGRBbHJlYWR5UmVzZXJ2ZWQoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfTFQoc2l6ZSgpLCBDYXBhY2l0eSgpKTsKLSAgcmV0dXJuICZlbGVtZW50c19bY3VycmVudF9zaXplXysrXTsKKyAgR09PR0xFX0RDSEVDS19MVChjdXJyZW50X3NpemVfLCB0b3RhbF9zaXplXyk7CisgIHJldHVybiAmcmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplXysrXTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlJlc2l6ZShpbnQgbmV3X3NpemUsIGNvbnN0IEVsZW1lbnQmIHZhbHVlKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobmV3X3NpemUsIDApOworICBpZiAobmV3X3NpemUgPiBjdXJyZW50X3NpemVfKSB7CisgICAgUmVzZXJ2ZShuZXdfc2l6ZSk7CisgICAgc3RkOjpmaWxsKCZyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfXSwKKyAgICAgICAgICAgICAgJnJlcF8tPmVsZW1lbnRzW25ld19zaXplXSwgdmFsdWUpOworICB9CisgIGN1cnJlbnRfc2l6ZV8gPSBuZXdfc2l6ZTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgY29uc3QgRWxlbWVudCYgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6R2V0KGludCBpbmRleCkgY29uc3QgewotICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBzaXplKCkpOwotICByZXR1cm4gZWxlbWVudHNfW2luZGV4XTsKKyAgR09PR0xFX0RDSEVDS19HRShpbmRleCwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfTFQoaW5kZXgsIGN1cnJlbnRfc2l6ZV8pOworICByZXR1cm4gcmVwXy0+ZWxlbWVudHNbaW5kZXhdOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSBFbGVtZW50KiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpNdXRhYmxlKGludCBpbmRleCkgewotICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBzaXplKCkpOwotICByZXR1cm4gZWxlbWVudHNfICsgaW5kZXg7CisgIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOworICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKKyAgcmV0dXJuICZyZXBfLT5lbGVtZW50c1tpbmRleF07CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U2V0KGludCBpbmRleCwgY29uc3QgRWxlbWVudCYgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgc2l6ZSgpKTsKLSAgZWxlbWVudHNfW2luZGV4XSA9IHZhbHVlOworICBHT09HTEVfRENIRUNLX0dFKGluZGV4LCAwKTsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgY3VycmVudF9zaXplXyk7CisgIHJlcF8tPmVsZW1lbnRzW2luZGV4XSA9IHZhbHVlOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZChjb25zdCBFbGVtZW50JiB2YWx1ZSkgewogICBpZiAoY3VycmVudF9zaXplXyA9PSB0b3RhbF9zaXplXykgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOwotICBlbGVtZW50c19bY3VycmVudF9zaXplXysrXSA9IHZhbHVlOworICByZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdID0gdmFsdWU7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkFkZCgpIHsKICAgaWYgKGN1cnJlbnRfc2l6ZV8gPT0gdG90YWxfc2l6ZV8pIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKLSAgcmV0dXJuICZlbGVtZW50c19bY3VycmVudF9zaXplXysrXTsKKyAgcmV0dXJuICZyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlJlbW92ZUxhc3QoKSB7CiAgIEdPT0dMRV9EQ0hFQ0tfR1QoY3VycmVudF9zaXplXywgMCk7Ci0gIC0tY3VycmVudF9zaXplXzsKKyAgY3VycmVudF9zaXplXy0tOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3ZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6RXh0cmFjdFN1YnJhbmdlKAorICAgIGludCBzdGFydCwgaW50IG51bSwgRWxlbWVudCogZWxlbWVudHMpIHsKKyAgR09PR0xFX0RDSEVDS19HRShzdGFydCwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobnVtLCAwKTsKKyAgR09PR0xFX0RDSEVDS19MRShzdGFydCArIG51bSwgdGhpcy0+Y3VycmVudF9zaXplXyk7CisKKyAgLy8gU2F2ZSB0aGUgdmFsdWVzIG9mIHRoZSByZW1vdmVkIGVsZW1lbnRzIGlmIHJlcXVlc3RlZC4KKyAgaWYgKGVsZW1lbnRzICE9IE5VTEwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKQorICAgICAgZWxlbWVudHNbaV0gPSB0aGlzLT5HZXQoaSArIHN0YXJ0KTsKKyAgfQorCisgIC8vIFNsaWRlIHJlbWFpbmluZyBlbGVtZW50cyBkb3duIHRvIGZpbGwgdGhlIGdhcC4KKyAgaWYgKG51bSA+IDApIHsKKyAgICBmb3IgKGludCBpID0gc3RhcnQgKyBudW07IGkgPCB0aGlzLT5jdXJyZW50X3NpemVfOyArK2kpCisgICAgICB0aGlzLT5TZXQoaSAtIG51bSwgdGhpcy0+R2V0KGkpKTsKKyAgICB0aGlzLT5UcnVuY2F0ZSh0aGlzLT5jdXJyZW50X3NpemVfIC0gbnVtKTsKKyAgfQogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KQEAgLTUxNiwxOTcgKzExNDUsMzkxIEBACiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6TWVyZ2VGcm9tKGNvbnN0IFJlcGVhdGVkRmllbGQmIG90aGVyKSB7Ci0gIFJlc2VydmUoY3VycmVudF9zaXplXyArIG90aGVyLmN1cnJlbnRfc2l6ZV8pOwotICBDb3B5QXJyYXkoZWxlbWVudHNfICsgY3VycmVudF9zaXplXywgb3RoZXIuZWxlbWVudHNfLCBvdGhlci5jdXJyZW50X3NpemVfKTsKLSAgY3VycmVudF9zaXplXyArPSBvdGhlci5jdXJyZW50X3NpemVfOworICBHT09HTEVfQ0hFQ0tfTkUoJm90aGVyLCB0aGlzKTsKKyAgaWYgKG90aGVyLmN1cnJlbnRfc2l6ZV8gIT0gMCkgeworICAgIFJlc2VydmUoY3VycmVudF9zaXplXyArIG90aGVyLmN1cnJlbnRfc2l6ZV8pOworICAgIENvcHlBcnJheShyZXBfLT5lbGVtZW50cyArIGN1cnJlbnRfc2l6ZV8sCisgICAgICAgICAgICAgIG90aGVyLnJlcF8tPmVsZW1lbnRzLCBvdGhlci5jdXJyZW50X3NpemVfKTsKKyAgICBjdXJyZW50X3NpemVfICs9IG90aGVyLmN1cnJlbnRfc2l6ZV87CisgIH0KIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpDb3B5RnJvbShjb25zdCBSZXBlYXRlZEZpZWxkJiBvdGhlcikgeworICBpZiAoJm90aGVyID09IHRoaXMpIHJldHVybjsKICAgQ2xlYXIoKTsKICAgTWVyZ2VGcm9tKG90aGVyKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6aXRlcmF0b3IgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZXJhc2UoCisgICAgY29uc3RfaXRlcmF0b3IgcG9zaXRpb24pIHsKKyAgcmV0dXJuIGVyYXNlKHBvc2l0aW9uLCBwb3NpdGlvbiArIDEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjppdGVyYXRvciBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplcmFzZSgKKyAgICBjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCkgeworICBzaXplX3R5cGUgZmlyc3Rfb2Zmc2V0ID0gZmlyc3QgLSBjYmVnaW4oKTsKKyAgaWYgKGZpcnN0ICE9IGxhc3QpIHsKKyAgICBUcnVuY2F0ZShzdGQ6OmNvcHkobGFzdCwgY2VuZCgpLCBiZWdpbigpICsgZmlyc3Rfb2Zmc2V0KSAtIGNiZWdpbigpKTsKKyAgfQorICByZXR1cm4gYmVnaW4oKSArIGZpcnN0X29mZnNldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6bXV0YWJsZV9kYXRhKCkgewotICByZXR1cm4gZWxlbWVudHNfOworICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzIDogTlVMTDsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgY29uc3QgRWxlbWVudCogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZGF0YSgpIGNvbnN0IHsKLSAgcmV0dXJuIGVsZW1lbnRzXzsKKyAgcmV0dXJuIHJlcF8gPyByZXBfLT5lbGVtZW50cyA6IE5VTEw7CiB9CiAKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpJbnRlcm5hbFN3YXAoUmVwZWF0ZWRGaWVsZCogb3RoZXIpIHsKKyAgc3RkOjpzd2FwKHJlcF8sIG90aGVyLT5yZXBfKTsKKyAgc3RkOjpzd2FwKGN1cnJlbnRfc2l6ZV8sIG90aGVyLT5jdXJyZW50X3NpemVfKTsKKyAgc3RkOjpzd2FwKHRvdGFsX3NpemVfLCBvdGhlci0+dG90YWxfc2l6ZV8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6U3dhcChSZXBlYXRlZEZpZWxkKiBvdGhlcikgewotICBFbGVtZW50KiBzd2FwX2VsZW1lbnRzICAgICA9IGVsZW1lbnRzXzsKLSAgaW50ICAgICAgc3dhcF9jdXJyZW50X3NpemUgPSBjdXJyZW50X3NpemVfOwotICBpbnQgICAgICBzd2FwX3RvdGFsX3NpemUgICA9IHRvdGFsX3NpemVfOwotICAvLyBXZSBtYXkgbm90IGJlIHVzaW5nIGluaXRpYWxfc3BhY2VfIGJ1dCBpdCdzIG5vdCB3b3J0aCBjaGVja2luZy4gIEp1c3QKLSAgLy8gY29weSBpdCBhbnl3YXkuCi0gIEVsZW1lbnQgc3dhcF9pbml0aWFsX3NwYWNlW2tJbml0aWFsU2l6ZV07Ci0gIE1vdmVBcnJheShzd2FwX2luaXRpYWxfc3BhY2UsIGluaXRpYWxfc3BhY2VfLCBrSW5pdGlhbFNpemUpOwotCi0gIGVsZW1lbnRzXyAgICAgPSBvdGhlci0+ZWxlbWVudHNfOwotICBjdXJyZW50X3NpemVfID0gb3RoZXItPmN1cnJlbnRfc2l6ZV87Ci0gIHRvdGFsX3NpemVfICAgPSBvdGhlci0+dG90YWxfc2l6ZV87Ci0gIE1vdmVBcnJheShpbml0aWFsX3NwYWNlXywgb3RoZXItPmluaXRpYWxfc3BhY2VfLCBrSW5pdGlhbFNpemUpOwotCi0gIG90aGVyLT5lbGVtZW50c18gICAgID0gc3dhcF9lbGVtZW50czsKLSAgb3RoZXItPmN1cnJlbnRfc2l6ZV8gPSBzd2FwX2N1cnJlbnRfc2l6ZTsKLSAgb3RoZXItPnRvdGFsX3NpemVfICAgPSBzd2FwX3RvdGFsX3NpemU7Ci0gIE1vdmVBcnJheShvdGhlci0+aW5pdGlhbF9zcGFjZV8sIHN3YXBfaW5pdGlhbF9zcGFjZSwga0luaXRpYWxTaXplKTsKLQotICBpZiAoZWxlbWVudHNfID09IG90aGVyLT5pbml0aWFsX3NwYWNlXykgewotICAgIGVsZW1lbnRzXyA9IGluaXRpYWxfc3BhY2VfOworICBpZiAodGhpcyA9PSBvdGhlcikgcmV0dXJuOworICBpZiAoR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSAgb3RoZXItPkdldEFyZW5hTm9WaXJ0dWFsKCkpIHsKKyAgICBJbnRlcm5hbFN3YXAob3RoZXIpOworICB9IGVsc2UgeworICAgIFJlcGVhdGVkRmllbGQ8RWxlbWVudD4gdGVtcChvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSk7CisgICAgdGVtcC5NZXJnZUZyb20oKnRoaXMpOworICAgIENvcHlGcm9tKCpvdGhlcik7CisgICAgb3RoZXItPlVuc2FmZUFyZW5hU3dhcCgmdGVtcCk7CiAgIH0KLSAgaWYgKG90aGVyLT5lbGVtZW50c18gPT0gaW5pdGlhbF9zcGFjZV8pIHsKLSAgICBvdGhlci0+ZWxlbWVudHNfID0gb3RoZXItPmluaXRpYWxfc3BhY2VfOwotICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgordm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpVbnNhZmVBcmVuYVN3YXAoUmVwZWF0ZWRGaWVsZCogb3RoZXIpIHsKKyAgaWYgKHRoaXMgPT0gb3RoZXIpIHJldHVybjsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYU5vVmlydHVhbCgpID09IG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKTsKKyAgSW50ZXJuYWxTd2FwKG90aGVyKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlN3YXBFbGVtZW50cyhpbnQgaW5kZXgxLCBpbnQgaW5kZXgyKSB7Ci0gIHN0ZDo6c3dhcChlbGVtZW50c19baW5kZXgxXSwgZWxlbWVudHNfW2luZGV4Ml0pOworICB1c2luZyBzdGQ6OnN3YXA7ICAvLyBlbmFibGUgQURMIHdpdGggZmFsbGJhY2sKKyAgc3dhcChyZXBfLT5lbGVtZW50c1tpbmRleDFdLCByZXBfLT5lbGVtZW50c1tpbmRleDJdKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6aXRlcmF0b3IKIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmJlZ2luKCkgewotICByZXR1cm4gZWxlbWVudHNfOworICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzIDogTlVMTDsKIH0KIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNvbnN0X2l0ZXJhdG9yCiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpiZWdpbigpIGNvbnN0IHsKLSAgcmV0dXJuIGVsZW1lbnRzXzsKKyAgcmV0dXJuIHJlcF8gPyByZXBfLT5lbGVtZW50cyA6IE5VTEw7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgorUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Y2JlZ2luKCkgY29uc3QgeworICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzIDogTlVMTDsKIH0KIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCiBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjplbmQoKSB7Ci0gIHJldHVybiBlbGVtZW50c18gKyBjdXJyZW50X3NpemVfOworICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzICsgY3VycmVudF9zaXplXyA6IE5VTEw7CiB9CiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSB0eXBlbmFtZSBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9pdGVyYXRvcgogUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6ZW5kKCkgY29uc3QgewotICByZXR1cm4gZWxlbWVudHNfICsgY3VycmVudF9zaXplXzsKKyAgcmV0dXJuIHJlcF8gPyByZXBfLT5lbGVtZW50cyArIGN1cnJlbnRfc2l6ZV8gOiBOVUxMOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkRmllbGQ8RWxlbWVudD46OmNlbmQoKSBjb25zdCB7CisgIHJldHVybiByZXBfID8gcmVwXy0+ZWxlbWVudHMgKyBjdXJyZW50X3NpemVfIDogTlVMTDsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgaW50IFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7Ci0gIHJldHVybiAoZWxlbWVudHNfICE9IGluaXRpYWxfc3BhY2VfKSA/IHRvdGFsX3NpemVfICogc2l6ZW9mKGVsZW1lbnRzX1swXSkgOiAwOworICByZXR1cm4gcmVwXyA/CisgICAgICAodG90YWxfc2l6ZV8gKiBzaXplb2YoRWxlbWVudCkgKyBrUmVwSGVhZGVyU2l6ZSkgOiAwOwogfQogCi0vLyBBdm9pZCBpbmxpbmluZyBvZiBSZXNlcnZlKCk6IG5ldywgbWVtY3B5LCBhbmQgZGVsZXRlW10gbGVhZCB0byBhIHNpZ25pZmljYW50CisvLyBBdm9pZCBpbmxpbmluZyBvZiBSZXNlcnZlKCk6IG5ldywgY29weSwgYW5kIGRlbGV0ZVtdIGxlYWQgdG8gYSBzaWduaWZpY2FudAogLy8gYW1vdW50IG9mIGNvZGUgYmxvYXQuCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6UmVzZXJ2ZShpbnQgbmV3X3NpemUpIHsKICAgaWYgKHRvdGFsX3NpemVfID49IG5ld19zaXplKSByZXR1cm47Ci0KLSAgRWxlbWVudCogb2xkX2VsZW1lbnRzID0gZWxlbWVudHNfOwotICB0b3RhbF9zaXplXyA9IG1heCh0b3RhbF9zaXplXyAqIDIsIG5ld19zaXplKTsKLSAgZWxlbWVudHNfID0gbmV3IEVsZW1lbnRbc3RhdGljX2Nhc3Q8c2l6ZV90Pih0b3RhbF9zaXplXyldOwotICBNb3ZlQXJyYXkoZWxlbWVudHNfLCBvbGRfZWxlbWVudHMsIGN1cnJlbnRfc2l6ZV8pOwotICBpZiAob2xkX2VsZW1lbnRzICE9IGluaXRpYWxfc3BhY2VfKSB7Ci0gICAgZGVsZXRlIFtdIG9sZF9lbGVtZW50czsKKyAgUmVwKiBvbGRfcmVwID0gcmVwXzsKKyAgQXJlbmEqIGFyZW5hID0gR2V0QXJlbmFOb1ZpcnR1YWwoKTsKKyAgbmV3X3NpemUgPSBzdGQ6Om1heChnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6a01pblJlcGVhdGVkRmllbGRBbGxvY2F0aW9uU2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICBzdGQ6Om1heCh0b3RhbF9zaXplXyAqIDIsIG5ld19zaXplKSk7CisgIEdPT0dMRV9DSEVDS19MRShzdGF0aWNfY2FzdDxzaXplX3Q+KG5ld19zaXplKSwKKyAgICAgICAgICAgKHN0ZDo6bnVtZXJpY19saW1pdHM8c2l6ZV90Pjo6bWF4KCkgLSBrUmVwSGVhZGVyU2l6ZSkgLworICAgICAgICAgICBzaXplb2YoRWxlbWVudCkpCisgICAgICA8PCAiUmVxdWVzdGVkIHNpemUgaXMgdG9vIGxhcmdlIHRvIGZpdCBpbnRvIHNpemVfdC4iOworICBpZiAoYXJlbmEgPT0gTlVMTCkgeworICAgIHJlcF8gPSByZWludGVycHJldF9jYXN0PFJlcCo+KAorICAgICAgICBuZXcgY2hhcltrUmVwSGVhZGVyU2l6ZSArIHNpemVvZihFbGVtZW50KSAqIG5ld19zaXplXSk7CisgIH0gZWxzZSB7CisgICAgcmVwXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8UmVwKj4oCisgICAgICAgICAgICA6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hOjpDcmVhdGVBcnJheTxjaGFyPihhcmVuYSwKKyAgICAgICAgICAgICAgICBrUmVwSGVhZGVyU2l6ZSArIHNpemVvZihFbGVtZW50KSAqIG5ld19zaXplKSk7CiAgIH0KKyAgcmVwXy0+YXJlbmEgPSBhcmVuYTsKKyAgaW50IG9sZF90b3RhbF9zaXplID0gdG90YWxfc2l6ZV87CisgIHRvdGFsX3NpemVfID0gbmV3X3NpemU7CisgIC8vIEludm9rZSBwbGFjZW1lbnQtbmV3IG9uIG5ld2x5IGFsbG9jYXRlZCBlbGVtZW50cy4gV2Ugc2hvdWxkbid0IGhhdmUgdG8gZG8KKyAgLy8gdGhpcywgc2luY2UgRWxlbWVudCBpcyBzdXBwb3NlZCB0byBiZSBQT0QsIGJ1dCBhIHByZXZpb3VzIHZlcnNpb24gb2YgdGhpcworICAvLyBjb2RlIGFsbG9jYXRlZCBzdG9yYWdlIHdpdGggIm5ldyBFbGVtZW50W3NpemVdIiBhbmQgc29tZSBjb2RlIHVzZXMKKyAgLy8gUmVwZWF0ZWRGaWVsZCB3aXRoIG5vbi1QT0QgdHlwZXMsIHJlbHlpbmcgb24gY29uc3RydWN0b3IgaW52b2NhdGlvbi4gSWYKKyAgLy8gRWxlbWVudCBoYXMgYSB0cml2aWFsIGNvbnN0cnVjdG9yIChlLmcuLCBpbnQzMiksIGdjYyAodGVzdGVkIHdpdGggLU8yKQorICAvLyBjb21wbGV0ZWx5IHJlbW92ZXMgdGhpcyBsb29wIGJlY2F1c2UgdGhlIGxvb3AgYm9keSBpcyBlbXB0eSwgc28gdGhpcyBoYXMgbm8KKyAgLy8gZWZmZWN0IHVubGVzcyBpdHMgc2lkZS1lZmZlY3RzIGFyZSByZXF1aXJlZCBmb3IgY29ycmVjdG5lc3MuCisgIC8vIE5vdGUgdGhhdCB3ZSBkbyB0aGlzIGJlZm9yZSBNb3ZlQXJyYXkoKSBiZWxvdyBiZWNhdXNlIEVsZW1lbnQncyBjb3B5CisgIC8vIGFzc2lnbm1lbnQgaW1wbGVtZW50YXRpb24gd2lsbCB3YW50IGFuIGluaXRpYWxpemVkIGluc3RhbmNlIGZpcnN0LgorICBFbGVtZW50KiBlID0gJnJlcF8tPmVsZW1lbnRzWzBdOworICBFbGVtZW50KiBsaW1pdCA9ICZyZXBfLT5lbGVtZW50c1t0b3RhbF9zaXplX107CisgIGZvciAoOyBlIDwgbGltaXQ7IGUrKykgeworICAgIG5ldyAoZSkgRWxlbWVudCgpOworICB9CisgIGlmIChjdXJyZW50X3NpemVfID4gMCkgeworICAgIE1vdmVBcnJheShyZXBfLT5lbGVtZW50cywgb2xkX3JlcC0+ZWxlbWVudHMsIGN1cnJlbnRfc2l6ZV8pOworICB9CisKKyAgLy8gTGlrZXdpc2UsIHdlIG5lZWQgdG8gaW52b2tlIGRlc3RydWN0b3JzIG9uIHRoZSBvbGQgYXJyYXkuCisgIEludGVybmFsRGVhbGxvY2F0ZShvbGRfcmVwLCBvbGRfdG90YWxfc2l6ZSk7CisKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgdm9pZCBSZXBlYXRlZEZpZWxkPEVsZW1lbnQ+OjpUcnVuY2F0ZShpbnQgbmV3X3NpemUpIHsKICAgR09PR0xFX0RDSEVDS19MRShuZXdfc2l6ZSwgY3VycmVudF9zaXplXyk7Ci0gIGN1cnJlbnRfc2l6ZV8gPSBuZXdfc2l6ZTsKKyAgaWYgKGN1cnJlbnRfc2l6ZV8gPiAwKSB7CisgICAgY3VycmVudF9zaXplXyA9IG5ld19zaXplOworICB9CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIHZvaWQgUmVwZWF0ZWRGaWVsZDxFbGVtZW50Pjo6TW92ZUFycmF5KAotICAgIEVsZW1lbnQgdG9bXSwgRWxlbWVudCBmcm9tW10sIGludCBhcnJheV9zaXplKSB7Ci0gIG1lbWNweSh0bywgZnJvbSwgYXJyYXlfc2l6ZSAqIHNpemVvZihFbGVtZW50KSk7CisgIEVsZW1lbnQqIHRvLCBFbGVtZW50KiBmcm9tLCBpbnQgYXJyYXlfc2l6ZSkgeworICBDb3B5QXJyYXkodG8sIGZyb20sIGFycmF5X3NpemUpOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSB2b2lkIFJlcGVhdGVkRmllbGQ8RWxlbWVudD46OkNvcHlBcnJheSgKLSAgICBFbGVtZW50IHRvW10sIGNvbnN0IEVsZW1lbnQgZnJvbVtdLCBpbnQgYXJyYXlfc2l6ZSkgewotICBtZW1jcHkodG8sIGZyb20sIGFycmF5X3NpemUgKiBzaXplb2YoRWxlbWVudCkpOworICBFbGVtZW50KiB0bywgY29uc3QgRWxlbWVudCogZnJvbSwgaW50IGFycmF5X3NpemUpIHsKKyAgaW50ZXJuYWw6OkVsZW1lbnRDb3BpZXI8RWxlbWVudD4oKSh0bywgZnJvbSwgYXJyYXlfc2l6ZSk7CiB9CiAKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50LCBib29sIEhhc1RyaXZpYWxDb3B5Pgordm9pZCBFbGVtZW50Q29waWVyPEVsZW1lbnQsIEhhc1RyaXZpYWxDb3B5Pjo6b3BlcmF0b3IoKSgKKyAgRWxlbWVudCogdG8sIGNvbnN0IEVsZW1lbnQqIGZyb20sIGludCBhcnJheV9zaXplKSB7CisgIHN0ZDo6Y29weShmcm9tLCBmcm9tICsgYXJyYXlfc2l6ZSwgdG8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK3N0cnVjdCBFbGVtZW50Q29waWVyPEVsZW1lbnQsIHRydWU+IHsKKyAgdm9pZCBvcGVyYXRvcigpKEVsZW1lbnQqIHRvLCBjb25zdCBFbGVtZW50KiBmcm9tLCBpbnQgYXJyYXlfc2l6ZSkgeworI2lmbmRlZiBTVEFSQk9BUkQKKyAgICBtZW1jcHkodG8sIGZyb20sIGFycmF5X3NpemUgKiBzaXplb2YoRWxlbWVudCkpOworI2Vsc2UKKyAgICBTYk1lbW9yeUNvcHkodG8sIGZyb20sIGFycmF5X3NpemUgKiBzaXplb2YoRWxlbWVudCkpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyAgfQorfTsKKworfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCisKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCiBpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlcGVhdGVkUHRyRmllbGRCYXNlKCkKLSAgOiBlbGVtZW50c18oaW5pdGlhbF9zcGFjZV8pLAorICA6IGFyZW5hXyhOVUxMKSwKICAgICBjdXJyZW50X3NpemVfKDApLAotICAgIGFsbG9jYXRlZF9zaXplXygwKSwKLSAgICB0b3RhbF9zaXplXyhrSW5pdGlhbFNpemUpIHsKKyAgICB0b3RhbF9zaXplXygwKSwKKyAgICByZXBfKE5VTEwpIHsKK30KKworaW5saW5lIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpSZXBlYXRlZFB0ckZpZWxkQmFzZSg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkKKyAgOiBhcmVuYV8oYXJlbmEpLAorICAgIGN1cnJlbnRfc2l6ZV8oMCksCisgICAgdG90YWxfc2l6ZV8oMCksCisgICAgcmVwXyhOVUxMKSB7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkRlc3Ryb3koKSB7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb2NhdGVkX3NpemVfOyBpKyspIHsKLSAgICBUeXBlSGFuZGxlcjo6RGVsZXRlKGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tpXSkpOworICBpZiAocmVwXyAhPSBOVUxMKSB7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZTsgaSsrKSB7CisgICAgICBUeXBlSGFuZGxlcjo6RGVsZXRlKGNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzW2ldKSwgYXJlbmFfKTsKKyAgICB9CisgICAgaWYgKGFyZW5hXyA9PSBOVUxMKSB7CisgICAgICBkZWxldGUgW10gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4ocmVwXyk7CisgICAgfQogICB9Ci0gIGlmIChlbGVtZW50c18gIT0gaW5pdGlhbF9zcGFjZV8pIHsKLSAgICBkZWxldGUgW10gZWxlbWVudHNfOworICByZXBfID0gTlVMTDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXAoUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7CisgIGlmIChvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBHZXRBcmVuYU5vVmlydHVhbCgpKSB7CisgICAgSW50ZXJuYWxTd2FwKG90aGVyKTsKKyAgfSBlbHNlIHsKKyAgICBTd2FwRmFsbGJhY2s8VHlwZUhhbmRsZXI+KG90aGVyKTsKICAgfQogfQogCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Cit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTd2FwRmFsbGJhY2soUmVwZWF0ZWRQdHJGaWVsZEJhc2UqIG90aGVyKSB7CisgIEdPT0dMRV9EQ0hFQ0sob3RoZXItPkdldEFyZW5hTm9WaXJ0dWFsKCkgIT0gR2V0QXJlbmFOb1ZpcnR1YWwoKSk7CisKKyAgLy8gQ29weSBzZW1hbnRpY3MgaW4gdGhpcyBjYXNlLiBXZSB0cnkgdG8gaW1wcm92ZSBlZmZpY2llbmN5IGJ5IHBsYWNpbmcgdGhlCisgIC8vIHRlbXBvcmFyeSBvbiB8b3RoZXJ8J3MgYXJlbmEgc28gdGhhdCBtZXNzYWdlcyBhcmUgY29waWVkIGNyb3NzLWFyZW5hIG9ubHkKKyAgLy8gb25jZSwgbm90IHR3aWNlLgorICBSZXBlYXRlZFB0ckZpZWxkQmFzZSB0ZW1wKG90aGVyLT5HZXRBcmVuYU5vVmlydHVhbCgpKTsKKyAgdGVtcC5NZXJnZUZyb208VHlwZUhhbmRsZXI+KCp0aGlzKTsKKyAgdGhpcy0+Q2xlYXI8VHlwZUhhbmRsZXI+KCk7CisgIHRoaXMtPk1lcmdlRnJvbTxUeXBlSGFuZGxlcj4oKm90aGVyKTsKKyAgb3RoZXItPkNsZWFyPFR5cGVIYW5kbGVyPigpOworICBvdGhlci0+SW50ZXJuYWxTd2FwKCZ0ZW1wKTsKKyAgdGVtcC5EZXN0cm95PFR5cGVIYW5kbGVyPigpOyAgLy8gRnJlZXMgcmVwXyBpZiBgb3RoZXJgIGhhZCBubyBhcmVuYS4KK30KKworaW5saW5lIGJvb2wgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmVtcHR5KCkgY29uc3QgeworICByZXR1cm4gY3VycmVudF9zaXplXyA9PSAwOworfQorCiBpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpzaXplKCkgY29uc3QgewogICByZXR1cm4gY3VycmVudF9zaXplXzsKIH0KIAotCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CiBpbmxpbmUgY29uc3QgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUmCiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6R2V0KGludCBpbmRleCkgY29uc3QgewotICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBzaXplKCkpOwotICByZXR1cm4gKmNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tpbmRleF0pOworICBHT09HTEVfRENIRUNLX0dFKGluZGV4LCAwKTsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgY3VycmVudF9zaXplXyk7CisgIHJldHVybiAqY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbaW5kZXhdKTsKIH0KIAorCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CiBpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqCiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZShpbnQgaW5kZXgpIHsKLSAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgc2l6ZSgpKTsKLSAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tpbmRleF0pOworICBHT09HTEVfRENIRUNLX0dFKGluZGV4LCAwKTsKKyAgR09PR0xFX0RDSEVDS19MVChpbmRleCwgY3VycmVudF9zaXplXyk7CisgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpbmRleF0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Ci1pbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGQoKSB7Ci0gIGlmIChjdXJyZW50X3NpemVfIDwgYWxsb2NhdGVkX3NpemVfKSB7Ci0gICAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tjdXJyZW50X3NpemVfKytdKTsKK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpEZWxldGUoaW50IGluZGV4KSB7CisgIEdPT0dMRV9EQ0hFQ0tfR0UoaW5kZXgsIDApOworICBHT09HTEVfRENIRUNLX0xUKGluZGV4LCBjdXJyZW50X3NpemVfKTsKKyAgVHlwZUhhbmRsZXI6OkRlbGV0ZShjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpbmRleF0pLCBhcmVuYV8pOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CitpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGQoCisgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHByb3RvdHlwZSkgeworICBpZiAocmVwXyAhPSBOVUxMICYmIGN1cnJlbnRfc2l6ZV8gPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZSkgeworICAgIHJldHVybiBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdKTsKICAgfQotICBpZiAoYWxsb2NhdGVkX3NpemVfID09IHRvdGFsX3NpemVfKSBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7Ci0gICsrYWxsb2NhdGVkX3NpemVfOwotICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0gVHlwZUhhbmRsZXI6Ok5ldygpOwotICBlbGVtZW50c19bY3VycmVudF9zaXplXysrXSA9IHJlc3VsdDsKKyAgaWYgKCFyZXBfIHx8IHJlcF8tPmFsbG9jYXRlZF9zaXplID09IHRvdGFsX3NpemVfKSB7CisgICAgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOworICB9CisgICsrcmVwXy0+YWxsb2NhdGVkX3NpemU7CisgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiByZXN1bHQgPQorICAgICAgVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUocHJvdG90eXBlLCBhcmVuYV8pOworICByZXBfLT5lbGVtZW50c1tjdXJyZW50X3NpemVfKytdID0gcmVzdWx0OwogICByZXR1cm4gcmVzdWx0OwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CiBpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVtb3ZlTGFzdCgpIHsKICAgR09PR0xFX0RDSEVDS19HVChjdXJyZW50X3NpemVfLCAwKTsKLSAgVHlwZUhhbmRsZXI6OkNsZWFyKGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1stLWN1cnJlbnRfc2l6ZV9dKSk7CisgIFR5cGVIYW5kbGVyOjpDbGVhcihjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1stLWN1cnJlbnRfc2l6ZV9dKSk7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkNsZWFyKCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IGN1cnJlbnRfc2l6ZV87IGkrKykgewotICAgIFR5cGVIYW5kbGVyOjpDbGVhcihjYXN0PFR5cGVIYW5kbGVyPihlbGVtZW50c19baV0pKTsKKyAgY29uc3QgaW50IG4gPSBjdXJyZW50X3NpemVfOworICBHT09HTEVfRENIRUNLX0dFKG4sIDApOworICBpZiAobiA+IDApIHsKKyAgICB2b2lkKiBjb25zdCogZWxlbWVudHMgPSByZXBfLT5lbGVtZW50czsKKyAgICBpbnQgaSA9IDA7CisgICAgZG8geworICAgICAgVHlwZUhhbmRsZXI6OkNsZWFyKGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzW2krK10pKTsKKyAgICB9IHdoaWxlIChpIDwgbik7CisgICAgY3VycmVudF9zaXplXyA9IDA7CiAgIH0KLSAgY3VycmVudF9zaXplXyA9IDA7CiB9CiAKKy8vIFRvIGF2b2lkIHVubmVjZXNzYXJ5IGNvZGUgZHVwbGljYXRpb24gYW5kIHJlZHVjZSBiaW5hcnkgc2l6ZSwgd2UgdXNlIGEKKy8vIGxheWVyZWQgYXBwcm9hY2ggdG8gaW1wbGVtZW50aW5nIE1lcmdlRnJvbSgpLiBUaGUgdG9wbGV2ZWwgbWV0aG9kIGlzCisvLyB0ZW1wbGF0ZWQsIHNvIHdlIGdldCBhIHNtYWxsIHRodW5rIHBlciBjb25jcmV0ZSBtZXNzYWdlIHR5cGUgaW4gdGhlIGJpbmFyeS4KKy8vIFRoaXMgY2FsbHMgYSBzaGFyZWQgaW1wbGVtZW50YXRpb24gd2l0aCBtb3N0IG9mIHRoZSBsb2dpYywgcGFzc2luZyBhIGZ1bmN0aW9uCisvLyBwb2ludGVyIHRvIGFub3RoZXIgdHlwZS1zcGVjaWZpYyBwaWVjZSBvZiBjb2RlIHRoYXQgY2FsbHMgdGhlIG9iamVjdC1hbGxvY2F0ZQorLy8gYW5kIG1lcmdlIGhhbmRsZXJzLgogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgogaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIpIHsKLSAgUmVzZXJ2ZShjdXJyZW50X3NpemVfICsgb3RoZXIuY3VycmVudF9zaXplXyk7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXIuY3VycmVudF9zaXplXzsgaSsrKSB7Ci0gICAgVHlwZUhhbmRsZXI6Ok1lcmdlKG90aGVyLnRlbXBsYXRlIEdldDxUeXBlSGFuZGxlcj4oaSksIEFkZDxUeXBlSGFuZGxlcj4oKSk7CisgIEdPT0dMRV9EQ0hFQ0tfTkUoJm90aGVyLCB0aGlzKTsKKyAgaWYgKG90aGVyLmN1cnJlbnRfc2l6ZV8gPT0gMCkgcmV0dXJuOworICBNZXJnZUZyb21JbnRlcm5hbCgKKyAgICAgIG90aGVyLCAmUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbUlubmVyTG9vcDxUeXBlSGFuZGxlcj4pOworfQorCitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TWVyZ2VGcm9tSW50ZXJuYWwoCisgICAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZEJhc2UmIG90aGVyLAorICAgIHZvaWQgKFJlcGVhdGVkUHRyRmllbGRCYXNlOjoqaW5uZXJfbG9vcCkodm9pZCoqLCB2b2lkKiosIGludCwgaW50KSkgeworICAvLyBOb3RlOiB3cmFwcGVyIGhhcyBhbHJlYWR5IGd1YXJhbnRlZWQgdGhhdCBvdGhlci5yZXBfICE9IE5VTEwgaGVyZS4KKyAgaW50IG90aGVyX3NpemUgPSBvdGhlci5jdXJyZW50X3NpemVfOworICB2b2lkKiogb3RoZXJfZWxlbWVudHMgPSBvdGhlci5yZXBfLT5lbGVtZW50czsKKyAgdm9pZCoqIG5ld19lbGVtZW50cyA9IEludGVybmFsRXh0ZW5kKG90aGVyX3NpemUpOworICBpbnQgYWxsb2NhdGVkX2VsZW1zID0gcmVwXy0+YWxsb2NhdGVkX3NpemUgLSBjdXJyZW50X3NpemVfOworICAodGhpcy0+KmlubmVyX2xvb3ApKG5ld19lbGVtZW50cywgb3RoZXJfZWxlbWVudHMsCisgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfc2l6ZSwgYWxsb2NhdGVkX2VsZW1zKTsKKyAgY3VycmVudF9zaXplXyArPSBvdGhlcl9zaXplOworICBpZiAocmVwXy0+YWxsb2NhdGVkX3NpemUgPCBjdXJyZW50X3NpemVfKSB7CisgICAgcmVwXy0+YWxsb2NhdGVkX3NpemUgPSBjdXJyZW50X3NpemVfOworICB9Cit9CisKKy8vIE1lcmdlcyBvdGhlcl9lbGVtcyB0byBvdXJfZWxlbXMuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KK3ZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbUlubmVyTG9vcCgKKyAgICB2b2lkKiogb3VyX2VsZW1zLCB2b2lkKiogb3RoZXJfZWxlbXMsIGludCBsZW5ndGgsIGludCBhbHJlYWR5X2FsbG9jYXRlZCkgeworICAvLyBTcGxpdCBpbnRvIHR3byBsb29wcywgb3ZlciByYW5nZXMgWzAsIGFsbG9jYXRlZCkgYW5kIFthbGxvY2F0ZWQsIGxlbmd0aCksCisgIC8vIHRvIGF2b2lkIGEgYnJhbmNoIHdpdGhpbiB0aGUgbG9vcC4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBhbHJlYWR5X2FsbG9jYXRlZCAmJiBpIDwgbGVuZ3RoOyBpKyspIHsKKyAgICAvLyBBbHJlYWR5IGFsbG9jYXRlZDogdXNlIGV4aXN0aW5nIGVsZW1lbnQuCisgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIG90aGVyX2VsZW0gPQorICAgICAgICByZWludGVycHJldF9jYXN0PHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKj4ob3RoZXJfZWxlbXNbaV0pOworICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfZWxlbSA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqPihvdXJfZWxlbXNbaV0pOworICAgIFR5cGVIYW5kbGVyOjpNZXJnZSgqb3RoZXJfZWxlbSwgbmV3X2VsZW0pOworICB9CisgIEFyZW5hKiBhcmVuYSA9IEdldEFyZW5hTm9WaXJ0dWFsKCk7CisgIGZvciAoaW50IGkgPSBhbHJlYWR5X2FsbG9jYXRlZDsgaSA8IGxlbmd0aDsgaSsrKSB7CisgICAgLy8gTm90IGFsbG9jYXRlZDogYWxsb2MgYSBuZXcgZWxlbWVudCBmaXJzdCwgdGhlbiBtZXJnZSBpdC4KKyAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogb3RoZXJfZWxlbSA9CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqPihvdGhlcl9lbGVtc1tpXSk7CisgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIG5ld19lbGVtID0KKyAgICAgICAgVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUob3RoZXJfZWxlbSwgYXJlbmEpOworICAgIFR5cGVIYW5kbGVyOjpNZXJnZSgqb3RoZXJfZWxlbSwgbmV3X2VsZW0pOworICAgIG91cl9lbGVtc1tpXSA9IG5ld19lbGVtOwogICB9CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KIGlubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDb3B5RnJvbShjb25zdCBSZXBlYXRlZFB0ckZpZWxkQmFzZSYgb3RoZXIpIHsKKyAgaWYgKCZvdGhlciA9PSB0aGlzKSByZXR1cm47CiAgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcjxUeXBlSGFuZGxlcj4oKTsKICAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok1lcmdlRnJvbTxUeXBlSGFuZGxlcj4ob3RoZXIpOwogfQpAQCAtNzE2LDE4ICsxNTM5LDE4IEBACiB9CiAKIGlubGluZSB2b2lkKiBjb25zdCogUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OnJhd19kYXRhKCkgY29uc3QgewotICByZXR1cm4gZWxlbWVudHNfOworICByZXR1cm4gcmVwXyA/IHJlcF8tPmVsZW1lbnRzIDogTlVMTDsKIH0KIAogaW5saW5lIHZvaWQqKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6cmF3X211dGFibGVfZGF0YSgpIGNvbnN0IHsKLSAgcmV0dXJuIGVsZW1lbnRzXzsKKyAgcmV0dXJuIHJlcF8gPyBjb25zdF9jYXN0PHZvaWQqKj4ocmVwXy0+ZWxlbWVudHMpIDogTlVMTDsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgogaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiogUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Om11dGFibGVfZGF0YSgpIHsKICAgLy8gVE9ETyhrZW50b24pOiAgQnJlYWtzIEMrKyBhbGlhc2luZyBydWxlcy4gIFdlIHNob3VsZCBwcm9iYWJseSByZW1vdmUgdGhpcwogICAvLyAgIG1ldGhvZCBlbnRpcmVseS4KLSAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKj4oZWxlbWVudHNfKTsKKyAgcmV0dXJuIHJlaW50ZXJwcmV0X2Nhc3Q8dHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqKj4ocmF3X211dGFibGVfZGF0YSgpKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgpAQCAtNzM1LDg5ICsxNTU4LDIxMiBAQAogUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmRhdGEoKSBjb25zdCB7CiAgIC8vIFRPRE8oa2VudG9uKTogIEJyZWFrcyBDKysgYWxpYXNpbmcgcnVsZXMuICBXZSBzaG91bGQgcHJvYmFibHkgcmVtb3ZlIHRoaXMKICAgLy8gICBtZXRob2QgZW50aXJlbHkuCi0gIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb25zdCo+KGVsZW1lbnRzXyk7CisgIHJldHVybiByZWludGVycHJldF9jYXN0PGNvbnN0IHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBjb25zdCo+KHJhd19kYXRhKCkpOwogfQogCiBpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcEVsZW1lbnRzKGludCBpbmRleDEsIGludCBpbmRleDIpIHsKLSAgc3RkOjpzd2FwKGVsZW1lbnRzX1tpbmRleDFdLCBlbGVtZW50c19baW5kZXgyXSk7CisgIHVzaW5nIHN0ZDo6c3dhcDsgIC8vIGVuYWJsZSBBREwgd2l0aCBmYWxsYmFjaworICBzd2FwKHJlcF8tPmVsZW1lbnRzW2luZGV4MV0sIHJlcF8tPmVsZW1lbnRzW2luZGV4Ml0pOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgVHlwZUhhbmRsZXI+CiBpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgewotICBpbnQgYWxsb2NhdGVkX2J5dGVzID0KLSAgICAgIChlbGVtZW50c18gIT0gaW5pdGlhbF9zcGFjZV8pID8gdG90YWxfc2l6ZV8gKiBzaXplb2YoZWxlbWVudHNfWzBdKSA6IDA7Ci0gIGZvciAoaW50IGkgPSAwOyBpIDwgYWxsb2NhdGVkX3NpemVfOyArK2kpIHsKLSAgICBhbGxvY2F0ZWRfYnl0ZXMgKz0gVHlwZUhhbmRsZXI6OlNwYWNlVXNlZCgqY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfW2ldKSk7CisgIGludCBhbGxvY2F0ZWRfYnl0ZXMgPSB0b3RhbF9zaXplXyAqIHNpemVvZih2b2lkKik7CisgIGlmIChyZXBfICE9IE5VTEwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHJlcF8tPmFsbG9jYXRlZF9zaXplOyArK2kpIHsKKyAgICAgIGFsbG9jYXRlZF9ieXRlcyArPSBUeXBlSGFuZGxlcjo6U3BhY2VVc2VkKAorICAgICAgICAgICpjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1tpXSkpOworICAgIH0KKyAgICBhbGxvY2F0ZWRfYnl0ZXMgKz0ga1JlcEhlYWRlclNpemU7CiAgIH0KICAgcmV0dXJuIGFsbG9jYXRlZF9ieXRlczsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgogaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkRnJvbUNsZWFyZWQoKSB7Ci0gIGlmIChjdXJyZW50X3NpemVfIDwgYWxsb2NhdGVkX3NpemVfKSB7Ci0gICAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1tjdXJyZW50X3NpemVfKytdKTsKKyAgaWYgKHJlcF8gIT0gTlVMTCAmJiBjdXJyZW50X3NpemVfIDwgcmVwXy0+YWxsb2NhdGVkX3NpemUpIHsKKyAgICByZXR1cm4gY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplXysrXSk7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIE5VTEw7CiAgIH0KIH0KIAorLy8gQWRkQWxsb2NhdGVkIHZlcnNpb24gdGhhdCBpbXBsZW1lbnRzIGFyZW5hLXNhZmUgY29weWluZyBiZWhhdmlvci4KIHRlbXBsYXRlIDx0eXBlbmFtZSBUeXBlSGFuZGxlcj4KLXZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZEFsbG9jYXRlZCgKK3ZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZEFsbG9jYXRlZEludGVybmFsKAorICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiB2YWx1ZSwKKyAgICBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6dHJ1ZV90eXBlKSB7CisgIEFyZW5hKiBlbGVtZW50X2FyZW5hID0gcmVpbnRlcnByZXRfY2FzdDxBcmVuYSo+KAorICAgICAgVHlwZUhhbmRsZXI6OkdldE1heWJlQXJlbmFQb2ludGVyKHZhbHVlKSk7CisgIEFyZW5hKiBhcmVuYSA9IEdldEFyZW5hTm9WaXJ0dWFsKCk7CisgIGlmIChhcmVuYSA9PSBlbGVtZW50X2FyZW5hICYmIHJlcF8gJiYKKyAgICAgIHJlcF8tPmFsbG9jYXRlZF9zaXplIDwgdG90YWxfc2l6ZV8pIHsKKyAgICAvLyBGYXN0IHBhdGg6IHVuZGVybHlpbmcgYXJlbmEgcmVwcmVzZW50YXRpb24gKHRhZ2dlZCBwb2ludGVyKSBpcyBlcXVhbCB0bworICAgIC8vIG91ciBhcmVuYSBwb2ludGVyLCBhbmQgd2UgY2FuIGFkZCB0byBhcnJheSB3aXRob3V0IHJlc2l6aW5nIGl0IChhdCBsZWFzdAorICAgIC8vIG9uZSBzbG90IHRoYXQgaXMgbm90IGFsbG9jYXRlZCkuCisgICAgdm9pZCoqIGVsZW1zID0gcmVwXy0+ZWxlbWVudHM7CisgICAgaWYgKGN1cnJlbnRfc2l6ZV8gPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZSkgeworICAgICAgLy8gTWFrZSBzcGFjZSBhdCBbY3VycmVudF0gYnkgbW92aW5nIGZpcnN0IGFsbG9jYXRlZCBlbGVtZW50IHRvIGVuZCBvZgorICAgICAgLy8gYWxsb2NhdGVkIGxpc3QuCisgICAgICBlbGVtc1tyZXBfLT5hbGxvY2F0ZWRfc2l6ZV0gPSBlbGVtc1tjdXJyZW50X3NpemVfXTsKKyAgICB9CisgICAgZWxlbXNbY3VycmVudF9zaXplX10gPSB2YWx1ZTsKKyAgICBjdXJyZW50X3NpemVfID0gY3VycmVudF9zaXplXyArIDE7CisgICAgcmVwXy0+YWxsb2NhdGVkX3NpemUgPSByZXBfLT5hbGxvY2F0ZWRfc2l6ZSArIDE7CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIEFkZEFsbG9jYXRlZFNsb3dXaXRoQ29weTxUeXBlSGFuZGxlcj4oCisgICAgICAgIHZhbHVlLCBUeXBlSGFuZGxlcjo6R2V0QXJlbmEodmFsdWUpLCBhcmVuYSk7CisgIH0KK30KKworLy8gU2xvd3BhdGggaGFuZGxlcyBhbGwgY2FzZXMsIGNvcHlpbmcgaWYgbmVjZXNzYXJ5LgordGVtcGxhdGU8dHlwZW5hbWUgVHlwZUhhbmRsZXI+Cit2b2lkIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpBZGRBbGxvY2F0ZWRTbG93V2l0aENvcHkoCisgICAgLy8gUGFzcyB2YWx1ZV9hcmVuYSBhbmQgbXlfYXJlbmEgdG8gYXZvaWQgZHVwbGljYXRlIHZpcnR1YWwgY2FsbCAodmFsdWUpIG9yCisgICAgLy8gbG9hZCAobWluZSkuCisgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlLCBBcmVuYSogdmFsdWVfYXJlbmEsIEFyZW5hKiBteV9hcmVuYSkgeworICAvLyBFbnN1cmUgdGhhdCBlaXRoZXIgdGhlIHZhbHVlIGlzIGluIHRoZSBzYW1lIGFyZW5hLCBvciBpZiBub3QsIHdlIGRvIHRoZQorICAvLyBhcHByb3ByaWF0ZSB0aGluZzogT3duKCkgaXQgKGlmIGl0J3Mgb24gaGVhcCBhbmQgd2UncmUgaW4gYW4gYXJlbmEpIG9yIGNvcHkKKyAgLy8gaXQgdG8gb3VyIGFyZW5hL2hlYXAgKG90aGVyd2lzZSkuCisgIGlmIChteV9hcmVuYSAhPSBOVUxMICYmIHZhbHVlX2FyZW5hID09IE5VTEwpIHsKKyAgICBteV9hcmVuYS0+T3duKHZhbHVlKTsKKyAgfSBlbHNlIGlmIChteV9hcmVuYSAhPSB2YWx1ZV9hcmVuYSkgeworICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBuZXdfdmFsdWUgPQorICAgICAgICBUeXBlSGFuZGxlcjo6TmV3RnJvbVByb3RvdHlwZSh2YWx1ZSwgbXlfYXJlbmEpOworICAgIFR5cGVIYW5kbGVyOjpNZXJnZSgqdmFsdWUsIG5ld192YWx1ZSk7CisgICAgVHlwZUhhbmRsZXI6OkRlbGV0ZSh2YWx1ZSwgdmFsdWVfYXJlbmEpOworICAgIHZhbHVlID0gbmV3X3ZhbHVlOworICB9CisKKyAgVW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQ8VHlwZUhhbmRsZXI+KHZhbHVlKTsKK30KKworLy8gQWRkQWxsb2NhdGVkIHZlcnNpb24gdGhhdCBkb2VzIG5vdCBpbXBsZW1lbnQgYXJlbmEtc2FmZSBjb3B5aW5nIGJlaGF2aW9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgordm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6QWRkQWxsb2NhdGVkSW50ZXJuYWwoCisgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlLAorICAgIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpmYWxzZV90eXBlKSB7CisgIGlmIChyZXBfICYmICByZXBfLT5hbGxvY2F0ZWRfc2l6ZSA8IHRvdGFsX3NpemVfKSB7CisgICAgLy8gRmFzdCBwYXRoOiB1bmRlcmx5aW5nIGFyZW5hIHJlcHJlc2VudGF0aW9uICh0YWdnZWQgcG9pbnRlcikgaXMgZXF1YWwgdG8KKyAgICAvLyBvdXIgYXJlbmEgcG9pbnRlciwgYW5kIHdlIGNhbiBhZGQgdG8gYXJyYXkgd2l0aG91dCByZXNpemluZyBpdCAoYXQgbGVhc3QKKyAgICAvLyBvbmUgc2xvdCB0aGF0IGlzIG5vdCBhbGxvY2F0ZWQpLgorICAgIHZvaWQqKiBlbGVtcyA9IHJlcF8tPmVsZW1lbnRzOworICAgIGlmIChjdXJyZW50X3NpemVfIDwgcmVwXy0+YWxsb2NhdGVkX3NpemUpIHsKKyAgICAgIC8vIE1ha2Ugc3BhY2UgYXQgW2N1cnJlbnRdIGJ5IG1vdmluZyBmaXJzdCBhbGxvY2F0ZWQgZWxlbWVudCB0byBlbmQgb2YKKyAgICAgIC8vIGFsbG9jYXRlZCBsaXN0LgorICAgICAgZWxlbXNbcmVwXy0+YWxsb2NhdGVkX3NpemVdID0gZWxlbXNbY3VycmVudF9zaXplX107CisgICAgfQorICAgIGVsZW1zW2N1cnJlbnRfc2l6ZV9dID0gdmFsdWU7CisgICAgY3VycmVudF9zaXplXyA9IGN1cnJlbnRfc2l6ZV8gKyAxOworICAgICsrcmVwXy0+YWxsb2NhdGVkX3NpemU7CisgICAgcmV0dXJuOworICB9IGVsc2UgeworICAgIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkPFR5cGVIYW5kbGVyPih2YWx1ZSk7CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgordm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQoCiAgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKSB7CiAgIC8vIE1ha2Ugcm9vbSBmb3IgdGhlIG5ldyBwb2ludGVyLgotICBpZiAoY3VycmVudF9zaXplXyA9PSB0b3RhbF9zaXplXykgeworICBpZiAoIXJlcF8gfHwgY3VycmVudF9zaXplXyA9PSB0b3RhbF9zaXplXykgewogICAgIC8vIFRoZSBhcnJheSBpcyBjb21wbGV0ZWx5IGZ1bGwgd2l0aCBubyBjbGVhcmVkIG9iamVjdHMsIHNvIGdyb3cgaXQuCiAgICAgUmVzZXJ2ZSh0b3RhbF9zaXplXyArIDEpOwotICAgICsrYWxsb2NhdGVkX3NpemVfOwotICB9IGVsc2UgaWYgKGFsbG9jYXRlZF9zaXplXyA9PSB0b3RhbF9zaXplXykgeworICAgICsrcmVwXy0+YWxsb2NhdGVkX3NpemU7CisgIH0gZWxzZSBpZiAocmVwXy0+YWxsb2NhdGVkX3NpemUgPT0gdG90YWxfc2l6ZV8pIHsKICAgICAvLyBUaGVyZSBpcyBubyBtb3JlIHNwYWNlIGluIHRoZSBwb2ludGVyIGFycmF5IGJlY2F1c2UgaXQgY29udGFpbnMgc29tZQogICAgIC8vIGNsZWFyZWQgb2JqZWN0cyBhd2FpdGluZyByZXVzZS4gIFdlIGRvbid0IHdhbnQgdG8gZ3JvdyB0aGUgYXJyYXkgaW4gdGhpcwogICAgIC8vIGNhc2UgYmVjYXVzZSBvdGhlcndpc2UgYSBsb29wIGNhbGxpbmcgQWRkQWxsb2NhdGVkKCkgZm9sbG93ZWQgYnkgQ2xlYXIoKQogICAgIC8vIHdvdWxkIGxlYWsgbWVtb3J5LgotICAgIFR5cGVIYW5kbGVyOjpEZWxldGUoY2FzdDxUeXBlSGFuZGxlcj4oZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV9dKSk7Ci0gIH0gZWxzZSBpZiAoY3VycmVudF9zaXplXyA8IGFsbG9jYXRlZF9zaXplXykgeworICAgIFR5cGVIYW5kbGVyOjpEZWxldGUoCisgICAgICAgIGNhc3Q8VHlwZUhhbmRsZXI+KHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV9dKSwgYXJlbmFfKTsKKyAgfSBlbHNlIGlmIChjdXJyZW50X3NpemVfIDwgcmVwXy0+YWxsb2NhdGVkX3NpemUpIHsKICAgICAvLyBXZSBoYXZlIHNvbWUgY2xlYXJlZCBvYmplY3RzLiAgV2UgZG9uJ3QgY2FyZSBhYm91dCB0aGVpciBvcmRlciwgc28gd2UKICAgICAvLyBjYW4ganVzdCBtb3ZlIHRoZSBmaXJzdCBvbmUgdG8gdGhlIGVuZCB0byBtYWtlIHNwYWNlLgotICAgIGVsZW1lbnRzX1thbGxvY2F0ZWRfc2l6ZV9dID0gZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV9dOwotICAgICsrYWxsb2NhdGVkX3NpemVfOworICAgIHJlcF8tPmVsZW1lbnRzW3JlcF8tPmFsbG9jYXRlZF9zaXplXSA9IHJlcF8tPmVsZW1lbnRzW2N1cnJlbnRfc2l6ZV9dOworICAgICsrcmVwXy0+YWxsb2NhdGVkX3NpemU7CiAgIH0gZWxzZSB7CiAgICAgLy8gVGhlcmUgYXJlIG5vIGNsZWFyZWQgb2JqZWN0cy4KLSAgICArK2FsbG9jYXRlZF9zaXplXzsKKyAgICArK3JlcF8tPmFsbG9jYXRlZF9zaXplOwogICB9CiAKLSAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV8rK10gPSB2YWx1ZTsKKyAgcmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplXysrXSA9IHZhbHVlOworfQorCisvLyBSZWxlYXNlTGFzdCgpIGZvciB0eXBlcyB0aGF0IGltcGxlbWVudCBtZXJnZS9jb3B5IGJlaGF2aW9yLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKgorUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlbGVhc2VMYXN0SW50ZXJuYWwoZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OnRydWVfdHlwZSkgeworICAvLyBGaXJzdCwgcmVsZWFzZSBhbiBlbGVtZW50LgorICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0gVW5zYWZlQXJlbmFSZWxlYXNlTGFzdDxUeXBlSGFuZGxlcj4oKTsKKyAgLy8gTm93IHBlcmZvcm0gYSBjb3B5IGlmIHdlJ3JlIG9uIGFuIGFyZW5hLgorICBBcmVuYSogYXJlbmEgPSBHZXRBcmVuYU5vVmlydHVhbCgpOworICBpZiAoYXJlbmEgPT0gTlVMTCkgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0gZWxzZSB7CisgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIG5ld19yZXN1bHQgPQorICAgICAgICBUeXBlSGFuZGxlcjo6TmV3RnJvbVByb3RvdHlwZShyZXN1bHQsIE5VTEwpOworICAgIFR5cGVIYW5kbGVyOjpNZXJnZSgqcmVzdWx0LCBuZXdfcmVzdWx0KTsKKyAgICByZXR1cm4gbmV3X3Jlc3VsdDsKKyAgfQorfQorCisvLyBSZWxlYXNlTGFzdCgpIGZvciB0eXBlcyB0aGF0ICpkbyBub3QqIGltcGxlbWVudCBtZXJnZS9jb3B5IGJlaGF2aW9yIC0tIHRoaXMKKy8vIGlzIHRoZSBzYW1lIGFzIFVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKS4gTm90ZSB0aGF0IHdlIEdPT0dMRV9EQ0hFQ0stZmFpbCBpZiB3ZSdyZSBvbgorLy8gYW4gYXJlbmEsIHNpbmNlIHRoZSB1c2VyIHJlYWxseSBzaG91bGQgaW1wbGVtZW50IHRoZSBjb3B5IG9wZXJhdGlvbiBpbiB0aGlzCisvLyBjYXNlLgordGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgoraW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKgorUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlJlbGVhc2VMYXN0SW50ZXJuYWwoZ29vZ2xlOjpwcm90b2J1Zjo6aW50ZXJuYWw6OmZhbHNlX3R5cGUpIHsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYU5vVmlydHVhbCgpID09IE5VTEwpCisgICAgICA8PCAiUmVsZWFzZUxhc3QoKSBjYWxsZWQgb24gYSBSZXBlYXRlZFB0ckZpZWxkIHRoYXQgaXMgb24gYW4gYXJlbmEsICIKKyAgICAgIDw8ICJ3aXRoIGEgdHlwZSB0aGF0IGRvZXMgbm90IGltcGxlbWVudCBNZXJnZUZyb20uIFRoaXMgaXMgdW5zYWZlOyAiCisgICAgICA8PCAicGxlYXNlIGltcGxlbWVudCBNZXJnZUZyb20gZm9yIHlvdXIgdHlwZS4iOworICByZXR1cm4gVW5zYWZlQXJlbmFSZWxlYXNlTGFzdDxUeXBlSGFuZGxlcj4oKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgotaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUxhc3QoKSB7CitpbmxpbmUgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqCisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpVbnNhZmVBcmVuYVJlbGVhc2VMYXN0KCkgewogICBHT09HTEVfRENIRUNLX0dUKGN1cnJlbnRfc2l6ZV8sIDApOwogICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogcmVzdWx0ID0KLSAgICAgIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1stLWN1cnJlbnRfc2l6ZV9dKTsKLSAgLS1hbGxvY2F0ZWRfc2l6ZV87Ci0gIGlmIChjdXJyZW50X3NpemVfIDwgYWxsb2NhdGVkX3NpemVfKSB7CisgICAgICBjYXN0PFR5cGVIYW5kbGVyPihyZXBfLT5lbGVtZW50c1stLWN1cnJlbnRfc2l6ZV9dKTsKKyAgLS1yZXBfLT5hbGxvY2F0ZWRfc2l6ZTsKKyAgaWYgKGN1cnJlbnRfc2l6ZV8gPCByZXBfLT5hbGxvY2F0ZWRfc2l6ZSkgewogICAgIC8vIFRoZXJlIGFyZSBjbGVhcmVkIGVsZW1lbnRzIG9uIHRoZSBlbmQ7IHJlcGxhY2UgdGhlIHJlbW92ZWQgZWxlbWVudAogICAgIC8vIHdpdGggdGhlIGxhc3QgYWxsb2NhdGVkIGVsZW1lbnQuCi0gICAgZWxlbWVudHNfW2N1cnJlbnRfc2l6ZV9dID0gZWxlbWVudHNfW2FsbG9jYXRlZF9zaXplX107CisgICAgcmVwXy0+ZWxlbWVudHNbY3VycmVudF9zaXplX10gPSByZXBfLT5lbGVtZW50c1tyZXBfLT5hbGxvY2F0ZWRfc2l6ZV07CiAgIH0KICAgcmV0dXJuIHJlc3VsdDsKIH0KIAotCiBpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcmVkQ291bnQoKSBjb25zdCB7Ci0gIHJldHVybiBhbGxvY2F0ZWRfc2l6ZV8gLSBjdXJyZW50X3NpemVfOworICByZXR1cm4gcmVwXyA/IChyZXBfLT5hbGxvY2F0ZWRfc2l6ZSAtIGN1cnJlbnRfc2l6ZV8pIDogMDsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgogaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkFkZENsZWFyZWQoCiAgICAgdHlwZW5hbWUgVHlwZUhhbmRsZXI6OlR5cGUqIHZhbHVlKSB7Ci0gIGlmIChhbGxvY2F0ZWRfc2l6ZV8gPT0gdG90YWxfc2l6ZV8pIFJlc2VydmUodG90YWxfc2l6ZV8gKyAxKTsKLSAgZWxlbWVudHNfW2FsbG9jYXRlZF9zaXplXysrXSA9IHZhbHVlOworICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gTlVMTCkKKyAgICAgIDw8ICJBZGRDbGVhcmVkKCkgY2FuIG9ubHkgYmUgdXNlZCBvbiBhIFJlcGVhdGVkUHRyRmllbGQgbm90IG9uIGFuIGFyZW5hLiI7CisgIEdPT0dMRV9EQ0hFQ0soVHlwZUhhbmRsZXI6OkdldEFyZW5hKHZhbHVlKSA9PSBOVUxMKQorICAgICAgPDwgIkFkZENsZWFyZWQoKSBjYW4gb25seSBhY2NlcHQgdmFsdWVzIG5vdCBvbiBhbiBhcmVuYS4iOworICBpZiAoIXJlcF8gfHwgcmVwXy0+YWxsb2NhdGVkX3NpemUgPT0gdG90YWxfc2l6ZV8pIHsKKyAgICBSZXNlcnZlKHRvdGFsX3NpemVfICsgMSk7CisgIH0KKyAgcmVwXy0+ZWxlbWVudHNbcmVwXy0+YWxsb2NhdGVkX3NpemUrK10gPSB2YWx1ZTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIFR5cGVIYW5kbGVyPgogaW5saW5lIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlKiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUNsZWFyZWQoKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfR1QoYWxsb2NhdGVkX3NpemVfLCBjdXJyZW50X3NpemVfKTsKLSAgcmV0dXJuIGNhc3Q8VHlwZUhhbmRsZXI+KGVsZW1lbnRzX1stLWFsbG9jYXRlZF9zaXplX10pOworICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gTlVMTCkKKyAgICAgIDw8ICJSZWxlYXNlQ2xlYXJlZCgpIGNhbiBvbmx5IGJlIHVzZWQgb24gYSBSZXBlYXRlZFB0ckZpZWxkIG5vdCBvbiAiCisgICAgICA8PCAiYW4gYXJlbmEuIjsKKyAgR09PR0xFX0RDSEVDSyhHZXRBcmVuYU5vVmlydHVhbCgpID09IE5VTEwpOworICBHT09HTEVfRENIRUNLKHJlcF8gIT0gTlVMTCk7CisgIEdPT0dMRV9EQ0hFQ0tfR1QocmVwXy0+YWxsb2NhdGVkX3NpemUsIGN1cnJlbnRfc2l6ZV8pOworICByZXR1cm4gY2FzdDxUeXBlSGFuZGxlcj4ocmVwXy0+ZWxlbWVudHNbLS1yZXBfLT5hbGxvY2F0ZWRfc2l6ZV0pOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKQEAgLTgyNiwyMyArMTc3Miw0NCBAQAogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGNsYXNzIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlR5cGVIYW5kbGVyCi0gICAgOiBwdWJsaWMgaW50ZXJuYWw6OkdlbmVyaWNUeXBlSGFuZGxlcjxFbGVtZW50PiB7fTsKKyAgICA6IHB1YmxpYyBpbnRlcm5hbDo6R2VuZXJpY1R5cGVIYW5kbGVyPEVsZW1lbnQ+IHsKK307CiAKIHRlbXBsYXRlIDw+CiBjbGFzcyBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OlR5cGVIYW5kbGVyCi0gICAgOiBwdWJsaWMgaW50ZXJuYWw6OlN0cmluZ1R5cGVIYW5kbGVyIHt9OworICAgIDogcHVibGljIGludGVybmFsOjpTdHJpbmdUeXBlSGFuZGxlciB7Cit9OwogCiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgotaW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkUHRyRmllbGQoKSB7fQoraW5saW5lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlJlcGVhdGVkUHRyRmllbGQoKQorICA6IFJlcGVhdGVkUHRyRmllbGRCYXNlKCkge30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZCg6Omdvb2dsZTo6cHJvdG9idWY6OkFyZW5hKiBhcmVuYSkgOgorICBSZXBlYXRlZFB0ckZpZWxkQmFzZShhcmVuYSkge30KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZCgKLSAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkJiBvdGhlcikgeworICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKQorICA6IFJlcGVhdGVkUHRyRmllbGRCYXNlKCkgewogICBDb3B5RnJvbShvdGhlcik7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgordGVtcGxhdGUgPHR5cGVuYW1lIEl0ZXI+CitpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVwZWF0ZWRQdHJGaWVsZCgKKyAgICBJdGVyIGJlZ2luLCBjb25zdCBJdGVyJiBlbmQpIHsKKyAgaW50IHJlc2VydmUgPSBpbnRlcm5hbDo6Q2FsY3VsYXRlUmVzZXJ2ZShiZWdpbiwgZW5kKTsKKyAgaWYgKHJlc2VydmUgIT0gLTEpIHsKKyAgICBSZXNlcnZlKHJlc2VydmUpOworICB9CisgIGZvciAoOyBiZWdpbiAhPSBlbmQ7ICsrYmVnaW4pIHsKKyAgICAqQWRkKCkgPSAqYmVnaW47CisgIH0KK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojp+UmVwZWF0ZWRQdHJGaWVsZCgpIHsKICAgRGVzdHJveTxUeXBlSGFuZGxlcj4oKTsKIH0KQEAgLTg1MCwxMSArMTgxNywxNyBAQAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50PiYgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6b3BlcmF0b3I9KAogICAgIGNvbnN0IFJlcGVhdGVkUHRyRmllbGQmIG90aGVyKSB7Ci0gIENvcHlGcm9tKG90aGVyKTsKKyAgaWYgKHRoaXMgIT0gJm90aGVyKQorICAgIENvcHlGcm9tKG90aGVyKTsKICAgcmV0dXJuICp0aGlzOwogfQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSBib29sIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmVtcHR5KCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OmVtcHR5KCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpzaXplKCkgY29uc3QgewogICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OnNpemUoKTsKIH0KQEAgLTg2NCw2ICsxODM3LDcgQEAKICAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpHZXQ8VHlwZUhhbmRsZXI+KGluZGV4KTsKIH0KIAorCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSBFbGVtZW50KiBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpNdXRhYmxlKGludCBpbmRleCkgewogICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok11dGFibGU8VHlwZUhhbmRsZXI+KGluZGV4KTsKQEAgLTg4MCw2ICsxODU0LDkxIEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6RGVsZXRlU3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR0Uoc3RhcnQsIDApOworICBHT09HTEVfRENIRUNLX0dFKG51bSwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfTEUoc3RhcnQgKyBudW0sIHNpemUoKSk7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6RGVsZXRlPFR5cGVIYW5kbGVyPihzdGFydCArIGkpOworICB9CisgIEV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBOVUxMKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpFeHRyYWN0U3VicmFuZ2UoCisgICAgaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMpIHsKKyAgdHlwZW5hbWUgaW50ZXJuYWw6OlR5cGVJbXBsZW1lbnRzTWVyZ2VCZWhhdmlvcjwKKyAgICAgIHR5cGVuYW1lIFR5cGVIYW5kbGVyOjpUeXBlPjo6dHlwZSB0OworICBFeHRyYWN0U3VicmFuZ2VJbnRlcm5hbChzdGFydCwgbnVtLCBlbGVtZW50cywgdCk7Cit9CisKKy8vIEV4dHJhY3RTdWJyYW5nZSgpIGltcGxlbWVudGF0aW9uIGZvciB0eXBlcyB0aGF0IGltcGxlbWVudCBtZXJnZS9jb3B5CisvLyBiZWhhdmlvci4KK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6RXh0cmFjdFN1YnJhbmdlSW50ZXJuYWwoCisgICAgaW50IHN0YXJ0LCBpbnQgbnVtLCBFbGVtZW50KiogZWxlbWVudHMsIGdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjp0cnVlX3R5cGUpIHsKKyAgR09PR0xFX0RDSEVDS19HRShzdGFydCwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfR0UobnVtLCAwKTsKKyAgR09PR0xFX0RDSEVDS19MRShzdGFydCArIG51bSwgc2l6ZSgpKTsKKworICBpZiAobnVtID4gMCkgeworICAgIC8vIFNhdmUgdGhlIHZhbHVlcyBvZiB0aGUgcmVtb3ZlZCBlbGVtZW50cyBpZiByZXF1ZXN0ZWQuCisgICAgaWYgKGVsZW1lbnRzICE9IE5VTEwpIHsKKyAgICAgIGlmIChHZXRBcmVuYU5vVmlydHVhbCgpICE9IE5VTEwpIHsKKyAgICAgICAgLy8gSWYgd2UncmUgb24gYW4gYXJlbmEsIHdlIHBlcmZvcm0gYSBjb3B5IGZvciBlYWNoIGVsZW1lbnQgc28gdGhhdCB0aGUKKyAgICAgICAgLy8gcmV0dXJuZWQgZWxlbWVudHMgYXJlIGhlYXAtYWxsb2NhdGVkLgorICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgICAgICAgRWxlbWVudCogZWxlbWVudCA9IFJlcGVhdGVkUHRyRmllbGRCYXNlOjoKKyAgICAgICAgICAgICAgTXV0YWJsZTxUeXBlSGFuZGxlcj4oaSArIHN0YXJ0KTsKKyAgICAgICAgICB0eXBlbmFtZSBUeXBlSGFuZGxlcjo6VHlwZSogbmV3X3ZhbHVlID0KKyAgICAgICAgICAgICAgVHlwZUhhbmRsZXI6Ok5ld0Zyb21Qcm90b3R5cGUoZWxlbWVudCwgTlVMTCk7CisgICAgICAgICAgVHlwZUhhbmRsZXI6Ok1lcmdlKCplbGVtZW50LCBuZXdfdmFsdWUpOworICAgICAgICAgIGVsZW1lbnRzW2ldID0gbmV3X3ZhbHVlOworICAgICAgICB9CisgICAgICB9IGVsc2UgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgICAgICAgZWxlbWVudHNbaV0gPSBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6TXV0YWJsZTxUeXBlSGFuZGxlcj4oaSArIHN0YXJ0KTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgICBDbG9zZUdhcChzdGFydCwgbnVtKTsKKyAgfQorfQorCisvLyBFeHRyYWN0U3VicmFuZ2UoKSBpbXBsZW1lbnRhdGlvbiBmb3IgdHlwZXMgdGhhdCBkbyBub3QgaW1wbGVtZW50IG1lcmdlL2NvcHkKKy8vIGJlaGF2aW9yLgordGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkV4dHJhY3RTdWJyYW5nZUludGVybmFsKAorICAgIGludCBzdGFydCwgaW50IG51bSwgRWxlbWVudCoqIGVsZW1lbnRzLCBnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6ZmFsc2VfdHlwZSkgeworICAvLyBUaGlzIGNhc2UgaXMgaWRlbnRpY2FsIHRvIFVuc2FmZUFyZW5hRXh0cmFjdFN1YnJhbmdlKCkuIEhvd2V2ZXIsIHNpbmNlCisgIC8vIEV4dHJhY3RTdWJyYW5nZSgpIG11c3QgcmV0dXJuIGhlYXAtYWxsb2NhdGVkIG9iamVjdHMgYnkgY29udHJhY3QsIGFuZCB3ZQorICAvLyBjYW5ub3QgZnVsZmlsbCB0aGlzIGNvbnRyYWN0IGlmIHdlIGFyZSBhbiBvbiBhcmVuYSwgd2UgbXVzdCBHT09HTEVfRENIRUNLKCkgdGhhdAorICAvLyB3ZSBhcmUgbm90IG9uIGFuIGFyZW5hLgorICBHT09HTEVfRENIRUNLKEdldEFyZW5hTm9WaXJ0dWFsKCkgPT0gTlVMTCkKKyAgICAgIDw8ICJFeHRyYWN0U3VicmFuZ2UoKSB3aGVuIGFyZW5hIGlzIG5vbi1OVUxMIGlzIG9ubHkgc3VwcG9ydGVkIHdoZW4gIgorICAgICAgPDwgInRoZSBFbGVtZW50IHR5cGUgc3VwcGxpZXMgYSBNZXJnZUZyb20oKSBvcGVyYXRpb24gdG8gbWFrZSBjb3BpZXMuIjsKKyAgVW5zYWZlQXJlbmFFeHRyYWN0U3VicmFuZ2Uoc3RhcnQsIG51bSwgZWxlbWVudHMpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB2b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlVuc2FmZUFyZW5hRXh0cmFjdFN1YnJhbmdlKAorICAgIGludCBzdGFydCwgaW50IG51bSwgRWxlbWVudCoqIGVsZW1lbnRzKSB7CisgIEdPT0dMRV9EQ0hFQ0tfR0Uoc3RhcnQsIDApOworICBHT09HTEVfRENIRUNLX0dFKG51bSwgMCk7CisgIEdPT0dMRV9EQ0hFQ0tfTEUoc3RhcnQgKyBudW0sIHNpemUoKSk7CisKKyAgaWYgKG51bSA+IDApIHsKKyAgICAvLyBTYXZlIHRoZSB2YWx1ZXMgb2YgdGhlIHJlbW92ZWQgZWxlbWVudHMgaWYgcmVxdWVzdGVkLgorICAgIGlmIChlbGVtZW50cyAhPSBOVUxMKSB7CisgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKSB7CisgICAgICAgIGVsZW1lbnRzW2ldID0gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6Ok11dGFibGU8VHlwZUhhbmRsZXI+KGkgKyBzdGFydCk7CisgICAgICB9CisgICAgfQorICAgIENsb3NlR2FwKHN0YXJ0LCBudW0pOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Q2xlYXIoKSB7CiAgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpDbGVhcjxUeXBlSGFuZGxlcj4oKTsKIH0KQEAgLTg5Nyw2ICsxOTU2LDIxIEBACiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplcmFzZShjb25zdF9pdGVyYXRvciBwb3NpdGlvbikgeworICByZXR1cm4gZXJhc2UocG9zaXRpb24sIHBvc2l0aW9uICsgMSk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIHR5cGVuYW1lIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Oml0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjplcmFzZShjb25zdF9pdGVyYXRvciBmaXJzdCwgY29uc3RfaXRlcmF0b3IgbGFzdCkgeworICBzaXplX3R5cGUgcG9zX29mZnNldCA9IHN0ZDo6ZGlzdGFuY2UoY2JlZ2luKCksIGZpcnN0KTsKKyAgc2l6ZV90eXBlIGxhc3Rfb2Zmc2V0ID0gc3RkOjpkaXN0YW5jZShjYmVnaW4oKSwgbGFzdCk7CisgIERlbGV0ZVN1YnJhbmdlKHBvc19vZmZzZXQsIGxhc3Rfb2Zmc2V0IC0gcG9zX29mZnNldCk7CisgIHJldHVybiBiZWdpbigpICsgcG9zX29mZnNldDsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgRWxlbWVudCoqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46Om11dGFibGVfZGF0YSgpIHsKICAgcmV0dXJuIFJlcGVhdGVkUHRyRmllbGRCYXNlOjptdXRhYmxlX2RhdGE8VHlwZUhhbmRsZXI+KCk7CiB9CkBAIC05MDcsMTYgKzE5ODEsMzIgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+Ci12b2lkIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlN3YXAoUmVwZWF0ZWRQdHJGaWVsZCogb3RoZXIpIHsKLSAgUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlN3YXAob3RoZXIpOworaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6U3dhcChSZXBlYXRlZFB0ckZpZWxkKiBvdGhlcikgeworICBpZiAodGhpcyA9PSBvdGhlcikKKyAgICByZXR1cm47CisgIFJlcGVhdGVkUHRyRmllbGRCYXNlOjpTd2FwPFR5cGVIYW5kbGVyPihvdGhlcik7CiB9CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50Pgotdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4MikgeworaW5saW5lIHZvaWQgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6VW5zYWZlQXJlbmFTd2FwKAorICAgIFJlcGVhdGVkUHRyRmllbGQqIG90aGVyKSB7CisgIEdPT0dMRV9EQ0hFQ0soR2V0QXJlbmFOb1ZpcnR1YWwoKSA9PSBvdGhlci0+R2V0QXJlbmFOb1ZpcnR1YWwoKSk7CisgIGlmICh0aGlzID09IG90aGVyKQorICAgICAgcmV0dXJuOworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6SW50ZXJuYWxTd2FwKG90aGVyKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpTd2FwRWxlbWVudHMoaW50IGluZGV4MSwgaW50IGluZGV4MikgewogICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6U3dhcEVsZW1lbnRzKGluZGV4MSwgaW5kZXgyKTsKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgQXJlbmEqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkdldEFyZW5hTm9WaXJ0dWFsKCkgY29uc3QgeworICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OkdldEFyZW5hTm9WaXJ0dWFsKCk7Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgogaW5saW5lIGludCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpTcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkgY29uc3QgewogICByZXR1cm4gUmVwZWF0ZWRQdHJGaWVsZEJhc2U6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGY8VHlwZUhhbmRsZXI+KCk7CiB9CkBAIC05MjcsMTAgKzIwMTcsMTkgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdm9pZCBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjpVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZChFbGVtZW50KiB2YWx1ZSkgeworICBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6VW5zYWZlQXJlbmFBZGRBbGxvY2F0ZWQ8VHlwZUhhbmRsZXI+KHZhbHVlKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgRWxlbWVudCogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6UmVsZWFzZUxhc3QoKSB7CiAgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6UmVsZWFzZUxhc3Q8VHlwZUhhbmRsZXI+KCk7CiB9CiAKK3RlbXBsYXRlIDx0eXBlbmFtZSBFbGVtZW50PgoraW5saW5lIEVsZW1lbnQqIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OlVuc2FmZUFyZW5hUmVsZWFzZUxhc3QoKSB7CisgIHJldHVybiBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6VW5zYWZlQXJlbmFSZWxlYXNlTGFzdDxUeXBlSGFuZGxlcj4oKTsKK30KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgaW50IFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OkNsZWFyZWRDb3VudCgpIGNvbnN0IHsKQEAgLTk2NSw3ICsyMDY0LDcgQEAKIC8vIHJlZmVyIHRvIHRoaXMgY2xhc3MgZGlyZWN0bHk7IHVzZSBSZXBlYXRlZFB0ckZpZWxkPFQ+OjppdGVyYXRvciBpbnN0ZWFkLgogLy8KIC8vIFRoZSBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZDxUPiwgUmVwZWF0ZWRQdHJJdGVyYXRvcjxUPiwgaXMKLS8vIHZlcnkgc2ltaWxhciB0byBpdGVyYXRvcl9wdHI8VCoqPiBpbiB1dGlsL2d0bC9pdGVyYXRvcl9hZGFwdG9ycy1pbmwuaCwKKy8vIHZlcnkgc2ltaWxhciB0byBpdGVyYXRvcl9wdHI8VCoqPiBpbiB1dGlsL2d0bC9pdGVyYXRvcl9hZGFwdG9ycy5oLAogLy8gYnV0IGFkZHMgcmFuZG9tLWFjY2VzcyBvcGVyYXRvcnMgYW5kIGlzIG1vZGlmaWVkIHRvIHdyYXAgYSB2b2lkKiogYmFzZQogLy8gaXRlcmF0b3IgKHNpbmNlIFJlcGVhdGVkUHRyRmllbGQgc3RvcmVzIGl0cyBhcnJheSBhcyBhIHZvaWQqIGFycmF5IGFuZAogLy8gY2FzdGluZyB2b2lkKiogdG8gVCoqIHdvdWxkIHZpb2xhdGUgQysrIGFsaWFzaW5nIHJ1bGVzKS4KQEAgLTk4MSw2ICsyMDgwLDEwIEBACiAgIHR5cGVkZWYgc3RkOjppdGVyYXRvcjwKICAgICAgICAgICBzdGQ6OnJhbmRvbV9hY2Nlc3NfaXRlcmF0b3JfdGFnLCBFbGVtZW50PiBzdXBlcmNsYXNzOwogCisgIC8vIFNoYWRvdyB0aGUgdmFsdWVfdHlwZSBpbiBzdGQ6Oml0ZXJhdG9yPD4gYmVjYXVzZSBjb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZQorICAvLyBuZWVkcyB0byBiZSBULCBub3QgY29uc3QgVC4KKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8RWxlbWVudD46OnR5cGUgdmFsdWVfdHlwZTsKKwogICAvLyBMZXQgdGhlIGNvbXBpbGVyIGtub3cgdGhhdCB0aGVzZSBhcmUgdHlwZSBuYW1lcywgc28gd2UgZG9uJ3QgaGF2ZSB0bwogICAvLyB3cml0ZSAidHlwZW5hbWUiIGluIGZyb250IG9mIHRoZW0gZXZlcnl3aGVyZS4KICAgdHlwZWRlZiB0eXBlbmFtZSBzdXBlcmNsYXNzOjpyZWZlcmVuY2UgcmVmZXJlbmNlOwpAQCAtMTAyNiwxMSArMjEyOSwxMSBAQAogICAgIGl0XyArPSBkOwogICAgIHJldHVybiAqdGhpczsKICAgfQotICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGl0ZXJhdG9yIGl0LCBkaWZmZXJlbmNlX3R5cGUgZCkgeworICBmcmllbmQgaXRlcmF0b3Igb3BlcmF0b3IrKGl0ZXJhdG9yIGl0LCBjb25zdCBkaWZmZXJlbmNlX3R5cGUgZCkgewogICAgIGl0ICs9IGQ7CiAgICAgcmV0dXJuIGl0OwogICB9Ci0gIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvcisoZGlmZmVyZW5jZV90eXBlIGQsIGl0ZXJhdG9yIGl0KSB7CisgIGZyaWVuZCBpdGVyYXRvciBvcGVyYXRvcisoY29uc3QgZGlmZmVyZW5jZV90eXBlIGQsIGl0ZXJhdG9yIGl0KSB7CiAgICAgaXQgKz0gZDsKICAgICByZXR1cm4gaXQ7CiAgIH0KQEAgLTEwNjEsMTQgKzIxNjQsMjEgQEAKIC8vIHJhdGhlciB0aGFuIHRoZSBvYmplY3RzIHRoZW1zZWx2ZXMgYXMgUmVwZWF0ZWRQdHJJdGVyYXRvciBkb2VzLgogLy8gQ29uc2lkZXIgdXNpbmcgdGhpcyB3aGVuIHdvcmtpbmcgd2l0aCBzdGwgYWxnb3JpdGhtcyB0aGF0IGNoYW5nZQogLy8gdGhlIGFycmF5LgotdGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudD4KKy8vIFRoZSBWb2lkUHRyIHRlbXBsYXRlIHBhcmFtZXRlciBob2xkcyB0aGUgdHlwZS1hZ25vc3RpYyBwb2ludGVyIHZhbHVlCisvLyByZWZlcmVuY2VkIGJ5IHRoZSBpdGVyYXRvci4gIEl0IHNob3VsZCBlaXRoZXIgYmUgInZvaWQgKiIgZm9yIGEgbXV0YWJsZQorLy8gaXRlcmF0b3IsIG9yICJjb25zdCB2b2lkICoiIGZvciBhIGNvbnN0YW50IGl0ZXJhdG9yLgordGVtcGxhdGU8dHlwZW5hbWUgRWxlbWVudCwgdHlwZW5hbWUgVm9pZFB0cj4KIGNsYXNzIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcgogICAgIDogcHVibGljIHN0ZDo6aXRlcmF0b3I8c3RkOjpyYW5kb21fYWNjZXNzX2l0ZXJhdG9yX3RhZywgRWxlbWVudCo+IHsKICBwdWJsaWM6Ci0gIHR5cGVkZWYgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yPEVsZW1lbnQ+IGl0ZXJhdG9yOworICB0eXBlZGVmIFJlcGVhdGVkUHRyT3ZlclB0cnNJdGVyYXRvcjxFbGVtZW50LCBWb2lkUHRyPiBpdGVyYXRvcjsKICAgdHlwZWRlZiBzdGQ6Oml0ZXJhdG9yPAogICAgICAgICAgIHN0ZDo6cmFuZG9tX2FjY2Vzc19pdGVyYXRvcl90YWcsIEVsZW1lbnQqPiBzdXBlcmNsYXNzOwogCisgIC8vIFNoYWRvdyB0aGUgdmFsdWVfdHlwZSBpbiBzdGQ6Oml0ZXJhdG9yPD4gYmVjYXVzZSBjb25zdF9pdGVyYXRvcjo6dmFsdWVfdHlwZQorICAvLyBuZWVkcyB0byBiZSBULCBub3QgY29uc3QgVC4KKyAgdHlwZWRlZiB0eXBlbmFtZSByZW1vdmVfY29uc3Q8RWxlbWVudCo+Ojp0eXBlIHZhbHVlX3R5cGU7CisKICAgLy8gTGV0IHRoZSBjb21waWxlciBrbm93IHRoYXQgdGhlc2UgYXJlIHR5cGUgbmFtZXMsIHNvIHdlIGRvbid0IGhhdmUgdG8KICAgLy8gd3JpdGUgInR5cGVuYW1lIiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCiAgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXJjbGFzczo6cmVmZXJlbmNlIHJlZmVyZW5jZTsKQEAgLTEwNzYsNyArMjE4Niw3IEBACiAgIHR5cGVkZWYgdHlwZW5hbWUgc3VwZXJjbGFzczo6ZGlmZmVyZW5jZV90eXBlIGRpZmZlcmVuY2VfdHlwZTsKIAogICBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3IoKSA6IGl0XyhOVUxMKSB7fQotICBleHBsaWNpdCBSZXBlYXRlZFB0ck92ZXJQdHJzSXRlcmF0b3Iodm9pZCoqIGl0KSA6IGl0XyhpdCkge30KKyAgZXhwbGljaXQgUmVwZWF0ZWRQdHJPdmVyUHRyc0l0ZXJhdG9yKFZvaWRQdHIqIGl0KSA6IGl0XyhpdCkge30KIAogICAvLyBkZXJlZmVyZW5jZWFibGUKICAgcmVmZXJlbmNlIG9wZXJhdG9yKigpIGNvbnN0IHsgcmV0dXJuICpyZWludGVycHJldF9jYXN0PEVsZW1lbnQqKj4oaXRfKTsgfQpAQCAtMTEzMSw5ICsyMjQxLDE0IEBACiAgIGZyaWVuZCBjbGFzcyBSZXBlYXRlZFB0ckl0ZXJhdG9yOwogCiAgIC8vIFRoZSBpbnRlcm5hbCBpdGVyYXRvci4KLSAgdm9pZCoqIGl0XzsKKyAgVm9pZFB0ciogaXRfOwogfTsKIAordm9pZCBSZXBlYXRlZFB0ckZpZWxkQmFzZTo6SW50ZXJuYWxTd2FwKFJlcGVhdGVkUHRyRmllbGRCYXNlKiBvdGhlcikgeworICBzdGQ6OnN3YXAocmVwXywgb3RoZXItPnJlcF8pOworICBzdGQ6OnN3YXAoY3VycmVudF9zaXplXywgb3RoZXItPmN1cnJlbnRfc2l6ZV8pOworICBzdGQ6OnN3YXAodG90YWxfc2l6ZV8sIG90aGVyLT50b3RhbF9zaXplXyk7Cit9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogCkBAIC0xMTQ4LDYgKzIyNjMsMTEgQEAKICAgcmV0dXJuIGl0ZXJhdG9yKHJhd19kYXRhKCkpOwogfQogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNiZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGJlZ2luKCk7Cit9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KIGlubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+OjppdGVyYXRvcgogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6ZW5kKCkgewogICByZXR1cm4gaXRlcmF0b3IocmF3X2RhdGEoKSArIHNpemUoKSk7CkBAIC0xMTU3LDYgKzIyNzcsMTEgQEAKIFJlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmVuZCgpIGNvbnN0IHsKICAgcmV0dXJuIGl0ZXJhdG9yKHJhd19kYXRhKCkgKyBzaXplKCkpOwogfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfaXRlcmF0b3IKK1JlcGVhdGVkUHRyRmllbGQ8RWxlbWVudD46OmNlbmQoKSBjb25zdCB7CisgIHJldHVybiBlbmQoKTsKK30KIAogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9pdGVyYXRvcgpAQCAtMTE2NCwyMCArMjI4OSwzMSBAQAogICByZXR1cm4gcG9pbnRlcl9pdGVyYXRvcihyYXdfbXV0YWJsZV9kYXRhKCkpOwogfQogdGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CitpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvcgorUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9iZWdpbigpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3IoY29uc3RfY2FzdDxjb25zdCB2b2lkKio+KHJhd19tdXRhYmxlX2RhdGEoKSkpOworfQordGVtcGxhdGUgPHR5cGVuYW1lIEVsZW1lbnQ+CiBpbmxpbmUgdHlwZW5hbWUgUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9pdGVyYXRvcgogUmVwZWF0ZWRQdHJGaWVsZDxFbGVtZW50Pjo6cG9pbnRlcl9lbmQoKSB7CiAgIHJldHVybiBwb2ludGVyX2l0ZXJhdG9yKHJhd19tdXRhYmxlX2RhdGEoKSArIHNpemUoKSk7CiB9Cit0ZW1wbGF0ZSA8dHlwZW5hbWUgRWxlbWVudD4KK2lubGluZSB0eXBlbmFtZSBSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yCitSZXBlYXRlZFB0ckZpZWxkPEVsZW1lbnQ+Ojpwb2ludGVyX2VuZCgpIGNvbnN0IHsKKyAgcmV0dXJuIGNvbnN0X3BvaW50ZXJfaXRlcmF0b3IoCisgICAgICBjb25zdF9jYXN0PGNvbnN0IHZvaWQqKj4ocmF3X211dGFibGVfZGF0YSgpICsgc2l6ZSgpKSk7Cit9CiAKIAogLy8gSXRlcmF0b3JzIGFuZCBoZWxwZXIgZnVuY3Rpb25zIHRoYXQgZm9sbG93IHRoZSBzcGlyaXQgb2YgdGhlIFNUTAogLy8gc3RkOjpiYWNrX2luc2VydF9pdGVyYXRvciBhbmQgc3RkOjpiYWNrX2luc2VydGVyIGJ1dCBhcmUgdGFpbG9yLW1hZGUKLS8vIGZvciBSZXBlYXRlZEZpZWxkIGFuZCBSZXBhdGVkUHRyRmllbGQuIFR5cGljYWwgdXNhZ2Ugd291bGQgYmU6CisvLyBmb3IgUmVwZWF0ZWRGaWVsZCBhbmQgUmVwZWF0ZWRQdHJGaWVsZC4gVHlwaWNhbCB1c2FnZSB3b3VsZCBiZToKIC8vCiAvLyAgIHN0ZDo6Y29weShzb21lX3NlcXVlbmNlLmJlZ2luKCksIHNvbWVfc2VxdWVuY2UuZW5kKCksCiAvLyAgICAgICAgICAgICBnb29nbGU6OnByb3RvYnVmOjpSZXBlYXRlZEZpZWxkQmFja0luc2VydGVyKHByb3RvLm11dGFibGVfc2VxdWVuY2UoKSkpOwogLy8KLS8vIFBvcnRlZCBieSBqb2hhbm5lcyBmcm9tIHV0aWwvZ3RsL3Byb3RvLWFycmF5LWl0ZXJhdG9ycy1pbmwuaAorLy8gUG9ydGVkIGJ5IGpvaGFubmVzIGZyb20gdXRpbC9ndGwvcHJvdG8tYXJyYXktaXRlcmF0b3JzLmgKIAogbmFtZXNwYWNlIGludGVybmFsIHsKIC8vIEEgYmFjayBpbnNlcnRlciBmb3IgUmVwZWF0ZWRGaWVsZCBvYmplY3RzLgpAQCAtMTE5OCw3ICsyMzM0LDcgQEAKICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygpIHsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KLSAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKyhpbnQgLyppZ25vcmVzX3BhcmFtZXRlciovKSB7CisgIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoaW50IC8qIHVudXNlZCAqLykgewogICAgIHJldHVybiAqdGhpczsKICAgfQogCkBAIC0xMjI5LDcgKzIzNjUsNyBAQAogICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgewogICAgIHJldHVybiAqdGhpczsKICAgfQotICBSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKGludCAvKmlnbm9yZXNfcGFyYW1ldGVyKi8pIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKyhpbnQgLyogdW51c2VkICovKSB7CiAgICAgcmV0dXJuICp0aGlzOwogICB9CiAKQEAgLTEyNTgsMjYgKzIzOTQsNjMgQEAKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPiYgb3BlcmF0b3IrKygKLSAgICAgIGludCAvKmlnbm9yZXNfcGFyYW1ldGVyKi8pIHsKKyAgICAgIGludCAvKiB1bnVzZWQgKi8pIHsKICAgICByZXR1cm4gKnRoaXM7CiAgIH0KIAogIHByaXZhdGU6CiAgIFJlcGVhdGVkUHRyRmllbGQ8VD4qIGZpZWxkXzsKIH07CisKKy8vIEFsbW9zdCBpZGVudGljYWwgdG8gQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvci4gVGhpcyBvbmUKKy8vIHVzZXMgdGhlIFVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkIGluc3RlYWQuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPgorY2xhc3MgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yCisgICAgOiBwdWJsaWMgc3RkOjppdGVyYXRvcjxzdGQ6Om91dHB1dF9pdGVyYXRvcl90YWcsIFQ+IHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpCisgIDogZmllbGRfKG11dGFibGVfZmllbGQpIHsKKyAgfQorICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yPSgKKyAgICBUIGNvbnN0KiBjb25zdCBwdHJfdG9fdmFsdWUpIHsKKyAgICBmaWVsZF8tPlVuc2FmZUFyZW5hQWRkQWxsb2NhdGVkKGNvbnN0X2Nhc3Q8VCo+KHB0cl90b192YWx1ZSkpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKigpIHsKKyAgICByZXR1cm4gKnRoaXM7CisgIH0KKyAgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkQmFja0luc2VydEl0ZXJhdG9yPFQ+JiBvcGVyYXRvcisrKCkgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4mIG9wZXJhdG9yKysoCisgICAgICBpbnQgLyogdW51c2VkICovKSB7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyBwcml2YXRlOgorICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8VD4qIGZpZWxkXzsKK307CisKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogCiAvLyBQcm92aWRlcyBhIGJhY2sgaW5zZXJ0IGl0ZXJhdG9yIGZvciBSZXBlYXRlZEZpZWxkIGluc3RhbmNlcywKLS8vIHNpbWlsYXIgdG8gc3RkOjpiYWNrX2luc2VydGVyKCkuIE5vdGUgdGhlIGlkZW50aWNhbGx5IG5hbWVkCi0vLyBmdW5jdGlvbiBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBpbnN0YW5jZXMuCisvLyBzaW1pbGFyIHRvIHN0ZDo6YmFja19pbnNlcnRlcigpLgogdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4KIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIoUmVwZWF0ZWRGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkgewogICByZXR1cm4gaW50ZXJuYWw6OlJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4obXV0YWJsZV9maWVsZCk7CiB9CiAKIC8vIFByb3ZpZGVzIGEgYmFjayBpbnNlcnQgaXRlcmF0b3IgZm9yIFJlcGVhdGVkUHRyRmllbGQgaW5zdGFuY2VzLAotLy8gc2ltaWxhciB0byBzdGQ6OmJhY2tfaW5zZXJ0ZXIoKS4gTm90ZSB0aGUgaWRlbnRpY2FsbHkgbmFtZWQKLS8vIGZ1bmN0aW9uIGZvciBSZXBlYXRlZEZpZWxkIGluc3RhbmNlcy4KKy8vIHNpbWlsYXIgdG8gc3RkOjpiYWNrX2luc2VydGVyKCkuCit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPgorUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcihSZXBlYXRlZFB0ckZpZWxkPFQ+KiBjb25zdCBtdXRhYmxlX2ZpZWxkKSB7CisgIHJldHVybiBpbnRlcm5hbDo6UmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRJdGVyYXRvcjxUPihtdXRhYmxlX2ZpZWxkKTsKK30KKworLy8gU3BlY2lhbCBiYWNrIGluc2VydCBpdGVyYXRvciBmb3IgUmVwZWF0ZWRQdHJGaWVsZCBpbnN0YW5jZXMsIGp1c3QgaW4KKy8vIGNhc2Ugc29tZW9uZSB3YW50cyB0byB3cml0ZSBnZW5lcmljIHRlbXBsYXRlIGNvZGUgdGhhdCBjYW4gYWNjZXNzIGJvdGgKKy8vIFJlcGVhdGVkRmllbGRzIGFuZCBSZXBlYXRlZFB0ckZpZWxkcyB1c2luZyBhIGNvbW1vbiBuYW1lLgogdGVtcGxhdGU8dHlwZW5hbWUgVD4gaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4KIFJlcGVhdGVkRmllbGRCYWNrSW5zZXJ0ZXIoUmVwZWF0ZWRQdHJGaWVsZDxUPiogY29uc3QgbXV0YWJsZV9maWVsZCkgewogICByZXR1cm4gaW50ZXJuYWw6OlJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4obXV0YWJsZV9maWVsZCk7CkBAIC0xMjkzLDYgKzI0NjYsMjUgQEAKICAgICAgIG11dGFibGVfZmllbGQpOwogfQogCisvLyBTaW1pbGFyIHRvIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIsIHVzaW5nCisvLyBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCBpbnN0ZWFkIG9mIEFkZEFsbG9jYXRlZC4KKy8vIFRoaXMgaXMgc2xpZ2h0bHkgZmFzdGVyIGlmIHRoYXQgbWF0dGVycy4gSXQgaXMgYWxzbyB1c2VmdWwgaW4gbGVnYWN5IGNvZGUKKy8vIHRoYXQgdXNlcyB0ZW1wb3Jhcnkgb3duZXJzaGlwIHRvIGF2b2lkIGNvcGllcy4gRXhhbXBsZToKKy8vIFJlcGVhdGVkUHRyRmllbGQ8VD4gdGVtcF9maWVsZDsKKy8vIHRlbXBfZmllbGQuQWRkQWxsb2NhdGVkKG5ldyBUKTsKKy8vIC4uLiAvLyBEbyBzb21ldGhpbmcgd2l0aCB0ZW1wX2ZpZWxkCisvLyB0ZW1wX2ZpZWxkLkV4dHJhY3RTdWJyYW5nZSgwLCB0ZW1wX2ZpZWxkLnNpemUoKSwgTlVMTCk7CisvLyBJZiB5b3UgcHV0IHRlbXBfZmllbGQgb24gdGhlIGFyZW5hIHRoaXMgZmFpbHMsIGJlY2F1c2UgdGhlIG93bmVyc2hpcAorLy8gdHJhbnNmZXJzIHRvIHRoZSBhcmVuYSBhdCB0aGUgIkFkZEFsbG9jYXRlZCIgY2FsbCBhbmQgaXMgbm90IHJlbGVhc2VkIGFueW1vcmUKKy8vIGNhdXNpbmcgYSBkb3VibGUgZGVsZXRlLiBVc2luZyBVbnNhZmVBcmVuYUFkZEFsbG9jYXRlZCBwcmV2ZW50cyB0aGlzLgordGVtcGxhdGU8dHlwZW5hbWUgVD4KK2ludGVybmFsOjpVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4KK1Vuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICA6Omdvb2dsZTo6cHJvdG9idWY6OlJlcGVhdGVkUHRyRmllbGQ8VD4qIGNvbnN0IG11dGFibGVfZmllbGQpIHsKKyAgcmV0dXJuIGludGVybmFsOjpVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0SXRlcmF0b3I8VD4oCisgICAgICBtdXRhYmxlX2ZpZWxkKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiAKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb24uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfcmVmbGVjdGlvbi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZF9yZWZsZWN0aW9uX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3JlZmxlY3Rpb25fdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKaW5kZXggZTdlMWU5OS4uMzliMjRiMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGRfdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM2LDE3ICszNiwxOSBAQAogLy8gICBvdGhlciBwcm90bzIgdW5pdHRlc3RzLgogCiAjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGxpbWl0cz4KICNpbmNsdWRlIDxsaXN0PgogI2luY2x1ZGUgPHZlY3Rvcj4KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogdXNpbmcgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczsKQEAgLTU0LDQyICs1Niw0OSBAQAogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSB7CiAKLS8vIFRlc3Qgb3BlcmF0aW9ucyBvbiBhIFJlcGVhdGVkRmllbGQgd2hpY2ggaXMgc21hbGwgZW5vdWdoIHRoYXQgaXQgZG9lcwotLy8gbm90IGFsbG9jYXRlIGEgc2VwYXJhdGUgYXJyYXkgZm9yIHN0b3JhZ2UuCisvLyBUZXN0IG9wZXJhdGlvbnMgb24gYSBzbWFsbCBSZXBlYXRlZEZpZWxkLgogVEVTVChSZXBlYXRlZEZpZWxkLCBTbWFsbCkgewogICBSZXBlYXRlZEZpZWxkPGludD4gZmllbGQ7CiAKKyAgRVhQRUNUX1RSVUUoZmllbGQuZW1wdHkoKSk7CiAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDApOwogCiAgIGZpZWxkLkFkZCg1KTsKIAorICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7CiAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDEpOwogICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCA1KTsKIAogICBmaWVsZC5BZGQoNDIpOwogCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMik7CiAgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksIDUpOwogICBFWFBFQ1RfRVEoZmllbGQuR2V0KDEpLCA0Mik7CiAKICAgZmllbGQuU2V0KDEsIDIzKTsKIAorICBFWFBFQ1RfRkFMU0UoZmllbGQuZW1wdHkoKSk7CiAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIDIpOwogICBFWFBFQ1RfRVEoZmllbGQuR2V0KDApLCA1KTsKICAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgMjMpOwotICBFWFBFQ1RfRVEoZmllbGQuU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigpLCAwKTsKIAogICBmaWVsZC5SZW1vdmVMYXN0KCk7CiAKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOwogICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxKTsKICAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgNSk7CiAKICAgZmllbGQuQ2xlYXIoKTsKIAorICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7Ci0gIEVYUEVDVF9FUShmaWVsZC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCksIDApOworICAvLyBBZGRpdGlvbmFsIGJ5dGVzIGFyZSBmb3IgJ3N0cnVjdCBSZXAnIGhlYWRlci4KKyAgaW50IGV4cGVjdGVkX3VzYWdlID0gNCAqIHNpemVvZihpbnQpICsgc2l6ZW9mKEFyZW5hKik7CisgIEVYUEVDVF9FUShmaWVsZC5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCksIGV4cGVjdGVkX3VzYWdlKTsKIH0KIAorCiAvLyBUZXN0IG9wZXJhdGlvbnMgb24gYSBSZXBlYXRlZEZpZWxkIHdoaWNoIGlzIGxhcmdlIGVub3VnaCB0byBhbGxvY2F0ZSBhCiAvLyBzZXBhcmF0ZSBhcnJheS4KIFRFU1QoUmVwZWF0ZWRGaWVsZCwgTGFyZ2UpIHsKQEAgLTk5LDYgKzEwOCw3IEBACiAgICAgZmllbGQuQWRkKGkgKiBpKTsKICAgfQogCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMTYpOwogCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTY7IGkrKykgewpAQCAtMTE3LDkgKzEyNywyMCBAQAogICBmaWVsZDEuQWRkKDUpOwogICBmaWVsZDEuQWRkKDQyKTsKIAorICBFWFBFQ1RfRkFMU0UoZmllbGQxLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQxLnNpemUoKSwgMik7CisgIEVYUEVDVF9FUShmaWVsZDEuR2V0KDApLCA1KTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5HZXQoMSksIDQyKTsKKworICBFWFBFQ1RfVFJVRShmaWVsZDIuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAwKTsKKwogICBmaWVsZDEuU3dhcCgmZmllbGQyKTsKIAorICBFWFBFQ1RfVFJVRShmaWVsZDEuZW1wdHkoKSk7CiAgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAwKTsKKworICBFWFBFQ1RfRkFMU0UoZmllbGQyLmVtcHR5KCkpOwogICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMik7CiAgIEVYUEVDVF9FUShmaWVsZDIuR2V0KDApLCA1KTsKICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMSksIDQyKTsKQEAgLTIxMSwxMiArMjMyLDI2IEBACiAgIEVYUEVDVF9FUSgyMCwgUmVzZXJ2ZWRTcGFjZSgmZmllbGQpKTsKIH0KIAorVEVTVChSZXBlYXRlZEZpZWxkLCBSZXNpemUpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkOworICBmaWVsZC5SZXNpemUoMiwgMSk7CisgIEVYUEVDVF9FUSgyLCBmaWVsZC5zaXplKCkpOworICBmaWVsZC5SZXNpemUoNSwgMik7CisgIEVYUEVDVF9FUSg1LCBmaWVsZC5zaXplKCkpOworICBmaWVsZC5SZXNpemUoNCwgMyk7CisgIEFTU0VSVF9FUSg0LCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEoMSwgZmllbGQuR2V0KDApKTsKKyAgRVhQRUNUX0VRKDEsIGZpZWxkLkdldCgxKSk7CisgIEVYUEVDVF9FUSgyLCBmaWVsZC5HZXQoMikpOworICBFWFBFQ1RfRVEoMiwgZmllbGQuR2V0KDMpKTsKKyAgZmllbGQuUmVzaXplKDAsIDQpOworICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKK30KKwogVEVTVChSZXBlYXRlZEZpZWxkLCBNZXJnZUZyb20pIHsKICAgUmVwZWF0ZWRGaWVsZDxpbnQ+IHNvdXJjZSwgZGVzdGluYXRpb247Ci0KICAgc291cmNlLkFkZCg0KTsKICAgc291cmNlLkFkZCg1KTsKLQogICBkZXN0aW5hdGlvbi5BZGQoMSk7CiAgIGRlc3RpbmF0aW9uLkFkZCgyKTsKICAgZGVzdGluYXRpb24uQWRkKDMpOwpAQCAtMjI0LDcgKzI1OSw2IEBACiAgIGRlc3RpbmF0aW9uLk1lcmdlRnJvbShzb3VyY2UpOwogCiAgIEFTU0VSVF9FUSg1LCBkZXN0aW5hdGlvbi5zaXplKCkpOwotCiAgIEVYUEVDVF9FUSgxLCBkZXN0aW5hdGlvbi5HZXQoMCkpOwogICBFWFBFQ1RfRVEoMiwgZGVzdGluYXRpb24uR2V0KDEpKTsKICAgRVhQRUNUX0VRKDMsIGRlc3RpbmF0aW9uLkdldCgyKSk7CkBAIC0yMzIsMTIgKzI2NiwxOCBAQAogICBFWFBFQ1RfRVEoNSwgZGVzdGluYXRpb24uR2V0KDQpKTsKIH0KIAorI2lmZGVmIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCitURVNUKFJlcGVhdGVkRmllbGQsIE1lcmdlRnJvbVNlbGYpIHsKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IG1lOworICBtZS5BZGQoMyk7CisgIEVYUEVDVF9ERUFUSChtZS5NZXJnZUZyb20obWUpLCAiIik7Cit9CisjZW5kaWYgIC8vIFBST1RPQlVGX0hBU19ERUFUSF9URVNUCisKIFRFU1QoUmVwZWF0ZWRGaWVsZCwgQ29weUZyb20pIHsKICAgUmVwZWF0ZWRGaWVsZDxpbnQ+IHNvdXJjZSwgZGVzdGluYXRpb247Ci0KICAgc291cmNlLkFkZCg0KTsKICAgc291cmNlLkFkZCg1KTsKLQogICBkZXN0aW5hdGlvbi5BZGQoMSk7CiAgIGRlc3RpbmF0aW9uLkFkZCgyKTsKICAgZGVzdGluYXRpb24uQWRkKDMpOwpAQCAtMjQ1LDExICsyODUsNTEgQEAKICAgZGVzdGluYXRpb24uQ29weUZyb20oc291cmNlKTsKIAogICBBU1NFUlRfRVEoMiwgZGVzdGluYXRpb24uc2l6ZSgpKTsKLQogICBFWFBFQ1RfRVEoNCwgZGVzdGluYXRpb24uR2V0KDApKTsKICAgRVhQRUNUX0VRKDUsIGRlc3RpbmF0aW9uLkdldCgxKSk7CiB9CiAKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgQ29weUZyb21TZWxmKSB7CisgIFJlcGVhdGVkRmllbGQ8aW50PiBtZTsKKyAgbWUuQWRkKDMpOworICBtZS5Db3B5RnJvbShtZSk7CisgIEFTU0VSVF9FUSgxLCBtZS5zaXplKCkpOworICBFWFBFQ1RfRVEoMywgbWUuR2V0KDApKTsKK30KKworVEVTVChSZXBlYXRlZEZpZWxkLCBFcmFzZSkgeworICBSZXBlYXRlZEZpZWxkPGludD4gbWU7CisgIFJlcGVhdGVkRmllbGQ8aW50Pjo6aXRlcmF0b3IgaXQgPSBtZS5lcmFzZShtZS5iZWdpbigpLCBtZS5lbmQoKSk7CisgIEVYUEVDVF9UUlVFKG1lLmJlZ2luKCkgPT0gaXQpOworICBFWFBFQ1RfRVEoMCwgbWUuc2l6ZSgpKTsKKworICBtZS5BZGQoMSk7CisgIG1lLkFkZCgyKTsKKyAgbWUuQWRkKDMpOworICBpdCA9IG1lLmVyYXNlKG1lLmJlZ2luKCksIG1lLmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSA9PSBpdCk7CisgIEVYUEVDVF9FUSgwLCBtZS5zaXplKCkpOworCisgIG1lLkFkZCg0KTsKKyAgbWUuQWRkKDUpOworICBtZS5BZGQoNik7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDIsIG1lLmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDIgPT0gaXQpOworICBFWFBFQ1RfRVEoMiwgbWUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQsIG1lLkdldCgwKSk7CisgIEVYUEVDVF9FUSg1LCBtZS5HZXQoMSkpOworCisgIG1lLkFkZCg2KTsKKyAgbWUuQWRkKDcpOworICBtZS5BZGQoOCk7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDEsIG1lLmJlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDEgPT0gaXQpOworICBFWFBFQ1RfRVEoMywgbWUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKDQsIG1lLkdldCgwKSk7CisgIEVYUEVDVF9FUSg3LCBtZS5HZXQoMSkpOworICBFWFBFQ1RfRVEoOCwgbWUuR2V0KDIpKTsKK30KKwogVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5Q29uc3RydWN0KSB7CiAgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2U7CiAgIHNvdXJjZS5BZGQoMSk7CkBAIC0yNjIsMTIgKzM0MiwyNiBAQAogICBFWFBFQ1RfRVEoMiwgZGVzdGluYXRpb24uR2V0KDEpKTsKIH0KIAorVEVTVChSZXBlYXRlZEZpZWxkLCBJdGVyYXRvckNvbnN0cnVjdCkgeworICB2ZWN0b3I8aW50PiB2YWx1ZXM7CisgIHZhbHVlcy5wdXNoX2JhY2soMSk7CisgIHZhbHVlcy5wdXNoX2JhY2soMik7CisKKyAgUmVwZWF0ZWRGaWVsZDxpbnQ+IGZpZWxkKHZhbHVlcy5iZWdpbigpLCB2YWx1ZXMuZW5kKCkpOworICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgZmllbGQuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1swXSwgZmllbGQuR2V0KDApKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXSwgZmllbGQuR2V0KDEpKTsKKworICBSZXBlYXRlZEZpZWxkPGludD4gb3RoZXIoZmllbGQuYmVnaW4oKSwgZmllbGQuZW5kKCkpOworICBBU1NFUlRfRVEodmFsdWVzLnNpemUoKSwgb3RoZXIuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1swXSwgb3RoZXIuR2V0KDApKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXSwgb3RoZXIuR2V0KDEpKTsKK30KKwogVEVTVChSZXBlYXRlZEZpZWxkLCBDb3B5QXNzaWduKSB7CiAgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2UsIGRlc3RpbmF0aW9uOwotCiAgIHNvdXJjZS5BZGQoNCk7CiAgIHNvdXJjZS5BZGQoNSk7Ci0KICAgZGVzdGluYXRpb24uQWRkKDEpOwogICBkZXN0aW5hdGlvbi5BZGQoMik7CiAgIGRlc3RpbmF0aW9uLkFkZCgzKTsKQEAgLTI3NSwxMSArMzY5LDI0IEBACiAgIGRlc3RpbmF0aW9uID0gc291cmNlOwogCiAgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOwotCiAgIEVYUEVDVF9FUSg0LCBkZXN0aW5hdGlvbi5HZXQoMCkpOwogICBFWFBFQ1RfRVEoNSwgZGVzdGluYXRpb24uR2V0KDEpKTsKIH0KIAorVEVTVChSZXBlYXRlZEZpZWxkLCBTZWxmQXNzaWduKSB7CisgIC8vIFZlcmlmeSB0aGF0IGFzc2lnbm1lbnQgdG8gc2VsZiBkb2VzIG5vdCBkZXN0cm95IGRhdGEuCisgIFJlcGVhdGVkRmllbGQ8aW50PiBzb3VyY2UsICpwOworICBwID0gJnNvdXJjZTsKKyAgc291cmNlLkFkZCg3KTsKKyAgc291cmNlLkFkZCg4KTsKKworICAqcCA9IHNvdXJjZTsKKworICBBU1NFUlRfRVEoMiwgc291cmNlLnNpemUoKSk7CisgIEVYUEVDVF9FUSg3LCBzb3VyY2UuR2V0KDApKTsKKyAgRVhQRUNUX0VRKDgsIHNvdXJjZS5HZXQoMSkpOworfQorCiBURVNUKFJlcGVhdGVkRmllbGQsIE11dGFibGVEYXRhSXNNdXRhYmxlKSB7CiAgIFJlcGVhdGVkRmllbGQ8aW50PiBmaWVsZDsKICAgZmllbGQuQWRkKDEpOwpAQCAtMzA5LDEyICs0MTYsNjkgQEAKICAgLy8gVHJ1bmNhdGlvbnMgdGhhdCBkb24ndCBjaGFuZ2UgdGhlIHNpemUgYXJlIGFsbG93ZWQsIGJ1dCBncm93aW5nIGlzIG5vdAogICAvLyBhbGxvd2VkLgogICBmaWVsZC5UcnVuY2F0ZShmaWVsZC5zaXplKCkpOwotI2lmZGVmIEdURVNUX0hBU19ERUFUSF9URVNUCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKICAgRVhQRUNUX0RFQlVHX0RFQVRIKGZpZWxkLlRydW5jYXRlKGZpZWxkLnNpemUoKSArIDEpLCAibmV3X3NpemUiKTsKICNlbmRpZgogfQogCiAKK1RFU1QoUmVwZWF0ZWRGaWVsZCwgRXh0cmFjdFN1YnJhbmdlKSB7CisgIC8vIEV4aGF1c3RpdmVseSB0ZXN0IGV2ZXJ5IHN1YnJhbmdlIGluIGFycmF5cyBvZiBhbGwgc2l6ZXMgZnJvbSAwIHRocm91Z2ggOS4KKyAgZm9yIChpbnQgc3ogPSAwOyBzeiA8IDEwOyArK3N6KSB7CisgICAgZm9yIChpbnQgbnVtID0gMDsgbnVtIDw9IHN6OyArK251bSkgeworICAgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHN6IC0gbnVtOyArK3N0YXJ0KSB7CisgICAgICAgIC8vIENyZWF0ZSBSZXBlYXRlZEZpZWxkIHdpdGggc3ogZWxlbWVudHMgaGF2aW5nIHZhbHVlcyAwIHRocm91Z2ggc3otMS4KKyAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQzMj4gZmllbGQ7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3o7ICsraSkKKyAgICAgICAgICBmaWVsZC5BZGQoaSk7CisgICAgICAgIEVYUEVDVF9FUShmaWVsZC5zaXplKCksIHN6KTsKKworICAgICAgICAvLyBDcmVhdGUgYSBjYXRjaGVyIGFycmF5IGFuZCBjYWxsIEV4dHJhY3RTdWJyYW5nZS4KKyAgICAgICAgaW50MzIgY2F0Y2hlclsxMF07CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkKKyAgICAgICAgICBjYXRjaGVyW2ldID0gLTE7CisgICAgICAgIGZpZWxkLkV4dHJhY3RTdWJyYW5nZShzdGFydCwgbnVtLCBjYXRjaGVyKTsKKworICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgaGF2ZSB0aGUgcmlnaHQgc2l6ZT8KKyAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogLSBudW0pOworCisgICAgICAgIC8vIFdlcmUgdGhlIHJlbW92ZWQgZWxlbWVudHMgZXh0cmFjdGVkIGludG8gdGhlIGNhdGNoZXIgYXJyYXk/CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpCisgICAgICAgICAgRVhQRUNUX0VRKGNhdGNoZXJbaV0sIHN0YXJ0ICsgaSk7CisgICAgICAgIEVYUEVDVF9FUShjYXRjaGVyW251bV0sIC0xKTsKKworICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgY29udGFpbiB0aGUgcmlnaHQgdmFsdWVzPworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHN0YXJ0OyArK2kpCisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLkdldChpKSwgaSk7CisgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGZpZWxkLnNpemUoKTsgKytpKQorICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5HZXQoaSksIGkgKyBudW0pOworICAgICAgfQorICAgIH0KKyAgfQorfQorCitURVNUKFJlcGVhdGVkRmllbGQsIENsZWFyVGhlblJlc2VydmVNb3JlKSB7CisgIC8vIFRlc3QgdGhhdCBSZXNlcnZlIHByb3Blcmx5IGRlc3Ryb3lzIHRoZSBvbGQgaW50ZXJuYWwgYXJyYXkgd2hlbiBpdCdzIGZvcmNlZAorICAvLyB0byBhbGxvY2F0ZSBhIG5ldyBvbmUsIGV2ZW4gd2hlbiBjbGVhcmVkLWJ1dC1ub3QtZGVsZXRlZCBvYmplY3RzIGFyZQorICAvLyBwcmVzZW50LiBVc2UgYSAnc3RyaW5nJyBhbmQgPiAxNiBieXRlcyBsZW5ndGggc28gdGhhdCB0aGUgZWxlbWVudHMgYXJlCisgIC8vIG5vbi1QT0QgYW5kIGFsbG9jYXRlIC0tIHRoZSBsZWFrIGNoZWNrZXIgd2lsbCBjYXRjaCBhbnkgc2tpcHBlZCBkZXN0cnVjdG9yCisgIC8vIGNhbGxzIGhlcmUuCisgIFJlcGVhdGVkRmllbGQ8c3RyaW5nPiBmaWVsZDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAzMjsgaSsrKSB7CisgICAgZmllbGQuQWRkKHN0cmluZygiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5IikpOworICB9CisgIEVYUEVDVF9FUSgzMiwgZmllbGQuc2l6ZSgpKTsKKyAgZmllbGQuQ2xlYXIoKTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9FUSgzMiwgZmllbGQuQ2FwYWNpdHkoKSk7CisKKyAgZmllbGQuUmVzZXJ2ZSgxMDI0KTsKKyAgRVhQRUNUX0VRKDAsIGZpZWxkLnNpemUoKSk7CisgIEVYUEVDVF9FUSgxMDI0LCBmaWVsZC5DYXBhY2l0eSgpKTsKKyAgLy8gRmluaXNoIHRlc3QgLS0gfGZpZWxkfCBzaG91bGQgZGVzdHJveSB0aGUgY2xlYXJlZC1idXQtbm90LXlldC1kZXN0cm95ZWQKKyAgLy8gc3RyaW5ncy4KK30KKwogLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogLy8gUmVwZWF0ZWRQdHJGaWVsZCB0ZXN0cy4gIFRoZXNlIHByZXR0eSBtdWNoIGp1c3QgbWlycm9yIHRoZSBSZXBlYXRlZEZpZWxkCiAvLyB0ZXN0cyBhYm92ZS4KQEAgLTMyMiwzMiArNDg2LDM4IEBACiBURVNUKFJlcGVhdGVkUHRyRmllbGQsIFNtYWxsKSB7CiAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBmaWVsZDsKIAorICBFWFBFQ1RfVFJVRShmaWVsZC5lbXB0eSgpKTsKICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMCk7CiAKICAgZmllbGQuQWRkKCktPmFzc2lnbigiZm9vIik7CiAKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOwogICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAxKTsKICAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgImZvbyIpOwogCiAgIGZpZWxkLkFkZCgpLT5hc3NpZ24oImJhciIpOwogCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMik7CiAgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKICAgRVhQRUNUX0VRKGZpZWxkLkdldCgxKSwgImJhciIpOwogCiAgIGZpZWxkLk11dGFibGUoMSktPmFzc2lnbigiYmF6Iik7CiAKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkLmVtcHR5KCkpOwogICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAyKTsKICAgRVhQRUNUX0VRKGZpZWxkLkdldCgwKSwgImZvbyIpOwogICBFWFBFQ1RfRVEoZmllbGQuR2V0KDEpLCAiYmF6Iik7CiAKICAgZmllbGQuUmVtb3ZlTGFzdCgpOwogCisgIEVYUEVDVF9GQUxTRShmaWVsZC5lbXB0eSgpKTsKICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgMSk7CiAgIEVYUEVDVF9FUShmaWVsZC5HZXQoMCksICJmb28iKTsKIAogICBmaWVsZC5DbGVhcigpOwogCisgIEVYUEVDVF9UUlVFKGZpZWxkLmVtcHR5KCkpOwogICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCAwKTsKIH0KIApAQCAtMzczLDExICs1NDMsMjcgQEAKICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMTsKICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkMjsKIAorICBFWFBFQ1RfVFJVRShmaWVsZDEuZW1wdHkoKSk7CisgIEVYUEVDVF9FUShmaWVsZDEuc2l6ZSgpLCAwKTsKKyAgRVhQRUNUX1RSVUUoZmllbGQyLmVtcHR5KCkpOworICBFWFBFQ1RfRVEoZmllbGQyLnNpemUoKSwgMCk7CisKICAgZmllbGQxLkFkZCgpLT5hc3NpZ24oImZvbyIpOwogICBmaWVsZDEuQWRkKCktPmFzc2lnbigiYmFyIik7CisKKyAgRVhQRUNUX0ZBTFNFKGZpZWxkMS5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDIpOworICBFWFBFQ1RfRVEoZmllbGQxLkdldCgwKSwgImZvbyIpOworICBFWFBFQ1RfRVEoZmllbGQxLkdldCgxKSwgImJhciIpOworCisgIEVYUEVDVF9UUlVFKGZpZWxkMi5lbXB0eSgpKTsKKyAgRVhQRUNUX0VRKGZpZWxkMi5zaXplKCksIDApOworCiAgIGZpZWxkMS5Td2FwKCZmaWVsZDIpOwogCisgIEVYUEVDVF9UUlVFKGZpZWxkMS5lbXB0eSgpKTsKICAgRVhQRUNUX0VRKGZpZWxkMS5zaXplKCksIDApOworCiAgIEVYUEVDVF9FUShmaWVsZDIuc2l6ZSgpLCAyKTsKICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMCksICJmb28iKTsKICAgRVhQRUNUX0VRKGZpZWxkMi5HZXQoMSksICJiYXIiKTsKQEAgLTU2NSwxMCArNzUxLDggQEAKIAogVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBNZXJnZUZyb20pIHsKICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IHNvdXJjZSwgZGVzdGluYXRpb247Ci0KICAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjQiKTsKICAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjUiKTsKLQogICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIxIik7CiAgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjIiKTsKICAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMyIpOwpAQCAtNTc2LDcgKzc2MCw2IEBACiAgIGRlc3RpbmF0aW9uLk1lcmdlRnJvbShzb3VyY2UpOwogCiAgIEFTU0VSVF9FUSg1LCBkZXN0aW5hdGlvbi5zaXplKCkpOwotCiAgIEVYUEVDVF9FUSgiMSIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CiAgIEVYUEVDVF9FUSgiMiIsIGRlc3RpbmF0aW9uLkdldCgxKSk7CiAgIEVYUEVDVF9FUSgiMyIsIGRlc3RpbmF0aW9uLkdldCgyKSk7CkBAIC01ODQsMTIgKzc2NywxOCBAQAogICBFWFBFQ1RfRVEoIjUiLCBkZXN0aW5hdGlvbi5HZXQoNCkpOwogfQogCisjaWZkZWYgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTWVyZ2VGcm9tU2VsZikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gbWU7CisgIG1lLkFkZCgpLT5hc3NpZ24oIjEiKTsKKyAgRVhQRUNUX0RFQVRIKG1lLk1lcmdlRnJvbShtZSksICIiKTsKK30KKyNlbmRpZiAgLy8gUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKwogVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5RnJvbSkgewogICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlLCBkZXN0aW5hdGlvbjsKLQogICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNCIpOwogICBzb3VyY2UuQWRkKCktPmFzc2lnbigiNSIpOwotCiAgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjEiKTsKICAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMiIpOwogICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIzIik7CkBAIC01OTcsMTQgKzc4Niw1MyBAQAogICBkZXN0aW5hdGlvbi5Db3B5RnJvbShzb3VyY2UpOwogCiAgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOwotCiAgIEVYUEVDVF9FUSgiNCIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CiAgIEVYUEVDVF9FUSgiNSIsIGRlc3RpbmF0aW9uLkdldCgxKSk7CiB9CiAKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgQ29weUZyb21TZWxmKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBtZTsKKyAgbWUuQWRkKCktPmFzc2lnbigiMSIpOworICBtZS5Db3B5RnJvbShtZSk7CisgIEFTU0VSVF9FUSgxLCBtZS5zaXplKCkpOworICBFWFBFQ1RfRVEoIjEiLCBtZS5HZXQoMCkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIEVyYXNlKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBtZTsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdCA9IG1lLmVyYXNlKG1lLmJlZ2luKCksIG1lLmVuZCgpKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSA9PSBpdCk7CisgIEVYUEVDVF9FUSgwLCBtZS5zaXplKCkpOworCisgICptZS5BZGQoKSA9ICIxIjsKKyAgKm1lLkFkZCgpID0gIjIiOworICAqbWUuQWRkKCkgPSAiMyI7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSwgbWUuZW5kKCkpOworICBFWFBFQ1RfVFJVRShtZS5iZWdpbigpID09IGl0KTsKKyAgRVhQRUNUX0VRKDAsIG1lLnNpemUoKSk7CisKKyAgKm1lLkFkZCgpID0gIjQiOworICAqbWUuQWRkKCkgPSAiNSI7CisgICptZS5BZGQoKSA9ICI2IjsKKyAgaXQgPSBtZS5lcmFzZShtZS5iZWdpbigpICsgMiwgbWUuZW5kKCkpOworICBFWFBFQ1RfVFJVRShtZS5iZWdpbigpICsgMiA9PSBpdCk7CisgIEVYUEVDVF9FUSgyLCBtZS5zaXplKCkpOworICBFWFBFQ1RfRVEoIjQiLCBtZS5HZXQoMCkpOworICBFWFBFQ1RfRVEoIjUiLCBtZS5HZXQoMSkpOworCisgICptZS5BZGQoKSA9ICI2IjsKKyAgKm1lLkFkZCgpID0gIjciOworICAqbWUuQWRkKCkgPSAiOCI7CisgIGl0ID0gbWUuZXJhc2UobWUuYmVnaW4oKSArIDEsIG1lLmJlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUobWUuYmVnaW4oKSArIDEgPT0gaXQpOworICBFWFBFQ1RfRVEoMywgbWUuc2l6ZSgpKTsKKyAgRVhQRUNUX0VRKCI0IiwgbWUuR2V0KDApKTsKKyAgRVhQRUNUX0VRKCI3IiwgbWUuR2V0KDEpKTsKKyAgRVhQRUNUX0VRKCI4IiwgbWUuR2V0KDIpKTsKK30KKwogVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5Q29uc3RydWN0KSB7CiAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBzb3VyY2U7Ci0KICAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjEiKTsKICAgc291cmNlLkFkZCgpLT5hc3NpZ24oIjIiKTsKIApAQCAtNjE1LDEyICs4NDMsNDUgQEAKICAgRVhQRUNUX0VRKCIyIiwgZGVzdGluYXRpb24uR2V0KDEpKTsKIH0KIAorVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBJdGVyYXRvckNvbnN0cnVjdF9TdHJpbmcpIHsKKyAgdmVjdG9yPHN0cmluZz4gdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKCIxIik7CisgIHZhbHVlcy5wdXNoX2JhY2soIjIiKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gZmllbGQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLCBmaWVsZC5HZXQoMCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLCBmaWVsZC5HZXQoMSkpOworCisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBvdGhlcihmaWVsZC5iZWdpbigpLCBmaWVsZC5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBvdGhlci5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLCBvdGhlci5HZXQoMCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLCBvdGhlci5HZXQoMSkpOworfQorCitURVNUKFJlcGVhdGVkUHRyRmllbGQsIEl0ZXJhdG9yQ29uc3RydWN0X1Byb3RvKSB7CisgIHR5cGVkZWYgVGVzdEFsbFR5cGVzOjpOZXN0ZWRNZXNzYWdlIE5lc3RlZDsKKyAgdmVjdG9yPE5lc3RlZD4gdmFsdWVzOworICB2YWx1ZXMucHVzaF9iYWNrKE5lc3RlZCgpKTsKKyAgdmFsdWVzLmJhY2soKS5zZXRfYmIoMSk7CisgIHZhbHVlcy5wdXNoX2JhY2soTmVzdGVkKCkpOworICB2YWx1ZXMuYmFjaygpLnNldF9iYigyKTsKKworICBSZXBlYXRlZFB0ckZpZWxkPE5lc3RlZD4gZmllbGQodmFsdWVzLmJlZ2luKCksIHZhbHVlcy5lbmQoKSk7CisgIEFTU0VSVF9FUSh2YWx1ZXMuc2l6ZSgpLCBmaWVsZC5zaXplKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzBdLmJiKCksIGZpZWxkLkdldCgwKS5iYigpKTsKKyAgRVhQRUNUX0VRKHZhbHVlc1sxXS5iYigpLCBmaWVsZC5HZXQoMSkuYmIoKSk7CisKKyAgUmVwZWF0ZWRQdHJGaWVsZDxOZXN0ZWQ+IG90aGVyKGZpZWxkLmJlZ2luKCksIGZpZWxkLmVuZCgpKTsKKyAgQVNTRVJUX0VRKHZhbHVlcy5zaXplKCksIG90aGVyLnNpemUoKSk7CisgIEVYUEVDVF9FUSh2YWx1ZXNbMF0uYmIoKSwgb3RoZXIuR2V0KDApLmJiKCkpOworICBFWFBFQ1RfRVEodmFsdWVzWzFdLmJiKCksIG90aGVyLkdldCgxKS5iYigpKTsKK30KKwogVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBDb3B5QXNzaWduKSB7CiAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPiBzb3VyY2UsIGRlc3RpbmF0aW9uOwotCiAgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI0Iik7CiAgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI1Iik7Ci0KICAgZGVzdGluYXRpb24uQWRkKCktPmFzc2lnbigiMSIpOwogICBkZXN0aW5hdGlvbi5BZGQoKS0+YXNzaWduKCIyIik7CiAgIGRlc3RpbmF0aW9uLkFkZCgpLT5hc3NpZ24oIjMiKTsKQEAgLTYyOCwxMSArODg5LDI0IEBACiAgIGRlc3RpbmF0aW9uID0gc291cmNlOwogCiAgIEFTU0VSVF9FUSgyLCBkZXN0aW5hdGlvbi5zaXplKCkpOwotCiAgIEVYUEVDVF9FUSgiNCIsIGRlc3RpbmF0aW9uLkdldCgwKSk7CiAgIEVYUEVDVF9FUSgiNSIsIGRlc3RpbmF0aW9uLkdldCgxKSk7CiB9CiAKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgU2VsZkFzc2lnbikgeworICAvLyBWZXJpZnkgdGhhdCBhc3NpZ25tZW50IHRvIHNlbGYgZG9lcyBub3QgZGVzdHJveSBkYXRhLgorICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz4gc291cmNlLCAqcDsKKyAgcCA9ICZzb3VyY2U7CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI3Iik7CisgIHNvdXJjZS5BZGQoKS0+YXNzaWduKCI4Iik7CisKKyAgKnAgPSBzb3VyY2U7CisKKyAgQVNTRVJUX0VRKDIsIHNvdXJjZS5zaXplKCkpOworICBFWFBFQ1RfRVEoIjciLCBzb3VyY2UuR2V0KDApKTsKKyAgRVhQRUNUX0VRKCI4Iiwgc291cmNlLkdldCgxKSk7Cit9CisKIFRFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgTXV0YWJsZURhdGFJc011dGFibGUpIHsKICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOwogICAqZmllbGQuQWRkKCkgPSAiMSI7CkBAIC02NDQsNiArOTE4LDc3IEBACiAgIEVYUEVDVF9FUSgiMiIsIGZpZWxkLkdldCgwKSk7CiB9CiAKK1RFU1QoUmVwZWF0ZWRQdHJGaWVsZCwgRXh0cmFjdFN1YnJhbmdlKSB7CisgIC8vIEV4aGF1c3RpdmVseSB0ZXN0IGV2ZXJ5IHN1YnJhbmdlIGluIGFycmF5cyBvZiBhbGwgc2l6ZXMgZnJvbSAwIHRocm91Z2ggOQorICAvLyB3aXRoIDAgdGhyb3VnaCAzIGNsZWFyZWQgZWxlbWVudHMgYXQgdGhlIGVuZC4KKyAgZm9yIChpbnQgc3ogPSAwOyBzeiA8IDEwOyArK3N6KSB7CisgICAgZm9yIChpbnQgbnVtID0gMDsgbnVtIDw9IHN6OyArK251bSkgeworICAgICAgZm9yIChpbnQgc3RhcnQgPSAwOyBzdGFydCA8IHN6IC0gbnVtOyArK3N0YXJ0KSB7CisgICAgICAgIGZvciAoaW50IGV4dHJhID0gMDsgZXh0cmEgPCA0OyArK2V4dHJhKSB7CisgICAgICAgICAgdmVjdG9yPHN0cmluZyo+IHN1YmplY3Q7CisKKyAgICAgICAgICAvLyBDcmVhdGUgYW4gYXJyYXkgd2l0aCAic3oiIGVsZW1lbnRzIGFuZCAiZXh0cmEiIGNsZWFyZWQgZWxlbWVudHMuCisgICAgICAgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IGZpZWxkOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgc3ogKyBleHRyYTsgKytpKSB7CisgICAgICAgICAgICBzdWJqZWN0LnB1c2hfYmFjayhuZXcgc3RyaW5nKCkpOworICAgICAgICAgICAgZmllbGQuQWRkQWxsb2NhdGVkKHN1YmplY3RbaV0pOworICAgICAgICAgIH0KKyAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCBzeiArIGV4dHJhKTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGV4dHJhOyArK2kpCisgICAgICAgICAgICBmaWVsZC5SZW1vdmVMYXN0KCk7CisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3opOworICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgZXh0cmEpOworCisgICAgICAgICAgLy8gQ3JlYXRlIGEgY2F0Y2hlciBhcnJheSBhbmQgY2FsbCBFeHRyYWN0U3VicmFuZ2UuCisgICAgICAgICAgc3RyaW5nKiBjYXRjaGVyWzEwXTsKKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICBjYXRjaGVyW2ldID0gTlVMTDsKKyAgICAgICAgICBmaWVsZC5FeHRyYWN0U3VicmFuZ2Uoc3RhcnQsIG51bSwgY2F0Y2hlcik7CisKKyAgICAgICAgICAvLyBEb2VzIHRoZSByZXN1bHRpbmcgYXJyYXkgaGF2ZSB0aGUgcmlnaHQgc2l6ZT8KKyAgICAgICAgICBFWFBFQ1RfRVEoZmllbGQuc2l6ZSgpLCBzeiAtIG51bSk7CisKKyAgICAgICAgICAvLyBXZXJlIHRoZSByZW1vdmVkIGVsZW1lbnRzIGV4dHJhY3RlZCBpbnRvIHRoZSBjYXRjaGVyIGFycmF5PworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpCisgICAgICAgICAgICBFWFBFQ1RfRVEoY2F0Y2hlcltpXSwgc3ViamVjdFtzdGFydCArIGldKTsKKyAgICAgICAgICBFWFBFQ1RfRVEoTlVMTCwgY2F0Y2hlcltudW1dKTsKKworICAgICAgICAgIC8vIERvZXMgdGhlIHJlc3VsdGluZyBhcnJheSBjb250YWluIHRoZSByaWdodCB2YWx1ZXM/CisgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBzdGFydDsgKytpKQorICAgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLk11dGFibGUoaSksIHN1YmplY3RbaV0pOworICAgICAgICAgIGZvciAoaW50IGkgPSBzdGFydDsgaSA8IGZpZWxkLnNpemUoKTsgKytpKQorICAgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLk11dGFibGUoaSksIHN1YmplY3RbaSArIG51bV0pOworCisgICAgICAgICAgLy8gUmVpbnN0YXRlIHRoZSBjbGVhcmVkIGVsZW1lbnRzLgorICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgZXh0cmEpOworICAgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgZXh0cmE7ICsraSkKKyAgICAgICAgICAgIGZpZWxkLkFkZCgpOworICAgICAgICAgIEVYUEVDVF9FUShmaWVsZC5DbGVhcmVkQ291bnQoKSwgMCk7CisgICAgICAgICAgRVhQRUNUX0VRKGZpZWxkLnNpemUoKSwgc3ogLSBudW0gKyBleHRyYSk7CisKKyAgICAgICAgICAvLyBNYWtlIHN1cmUgdGhlIGV4dHJhIGVsZW1lbnRzIGFyZSBhbGwgdGhlcmUgKGluIHNvbWUgb3JkZXIpLgorICAgICAgICAgIGZvciAoaW50IGkgPSBzejsgaSA8IHN6ICsgZXh0cmE7ICsraSkgeworICAgICAgICAgICAgaW50IGNvdW50ID0gMDsKKyAgICAgICAgICAgIGZvciAoaW50IGogPSBzejsgaiA8IHN6ICsgZXh0cmE7ICsraikgeworICAgICAgICAgICAgICBpZiAoZmllbGQuTXV0YWJsZShqIC0gbnVtKSA9PSBzdWJqZWN0W2ldKQorICAgICAgICAgICAgICAgIGNvdW50ICs9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBFWFBFQ1RfRVEoY291bnQsIDEpOworICAgICAgICAgIH0KKworICAgICAgICAgIC8vIFJlbGVhc2UgdGhlIGNhdWdodCBlbGVtZW50cy4KKyAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG51bTsgKytpKQorICAgICAgICAgICAgZGVsZXRlIGNhdGNoZXJbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KK30KKworVEVTVChSZXBlYXRlZFB0ckZpZWxkLCBEZWxldGVTdWJyYW5nZSkgeworICAvLyBEZWxldGVTdWJyYW5nZSBpcyBhIHRyaXZpYWwgZXh0ZW5zaW9uIG9mIEV4dGVuZFN1YnJhbmdlLgorfQorCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIC8vIEl0ZXJhdG9yIHRlc3RzIHN0b2xlbiBmcm9tIG5ldC9wcm90by9wcm90by1hcnJheV91bml0dGVzdC4KQEAgLTczOCw2ICsxMDgzLDMwIEBACiAgIEVYUEVDVF9FUSgiYmF6IiwgKigtLWNvbnN0X3Byb3RvX2FycmF5LmVuZCgpKSk7CiB9CiAKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBNdXRhYmxlUmV2ZXJzZUl0ZXJhdGlvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnJldmVyc2VfaXRlcmF0b3IgaXRlciA9IHByb3RvX2FycmF5Xy5yYmVnaW4oKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX0VRKCJiYXIiLCAqKGl0ZXIrKykpOworICBFWFBFQ1RfRVEoImZvbyIsICppdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShwcm90b19hcnJheV8ucmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoImZvbyIsICooLS1wcm90b19hcnJheV8ucmVuZCgpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkSXRlcmF0b3JUZXN0LCBDb25zdFJldmVyc2VJdGVyYXRpb24pIHsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+JiBjb25zdF9wcm90b19hcnJheSA9IHByb3RvX2FycmF5XzsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIGl0ZXIKKyAgICAgID0gY29uc3RfcHJvdG9fYXJyYXkucmJlZ2luKCk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgiYmFyIiwgKihpdGVyKyspKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqaXRlcik7CisgICsraXRlcjsKKyAgRVhQRUNUX1RSVUUoY29uc3RfcHJvdG9fYXJyYXkucmVuZCgpID09IGl0ZXIpOworICBFWFBFQ1RfRVEoImZvbyIsICooLS1jb25zdF9wcm90b19hcnJheS5yZW5kKCkpKTsKK30KKwogVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRJdGVyYXRvclRlc3QsIFJhbmRvbUFjY2VzcykgewogICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46Oml0ZXJhdG9yIGl0ZXIgPSBwcm90b19hcnJheV8uYmVnaW4oKTsKICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+OjppdGVyYXRvciBpdGVyMiA9IGl0ZXI7CkBAIC03ODUsNyArMTE1NCw3IEBACiAKICAgc3RyaW5nIHYgPSAiZiI7CiAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfaXRlcmF0b3IgaXQgPQotICAgICAgbG93ZXJfYm91bmQocHJvdG9fYXJyYXlfLmJlZ2luKCksIHByb3RvX2FycmF5Xy5lbmQoKSwgdik7CisgICAgICBzdGQ6Omxvd2VyX2JvdW5kKHByb3RvX2FycmF5Xy5iZWdpbigpLCBwcm90b19hcnJheV8uZW5kKCksIHYpOwogCiAgIEVYUEVDVF9FUSgqaXQsICJuIik7CiAgIEVYUEVDVF9UUlVFKGl0ID09IHByb3RvX2FycmF5Xy5iZWdpbigpICsgMyk7CkBAIC04MDUsMTQgKzExNzQsMjMgQEAKICAgICBwcm90b19hcnJheV8uQWRkKCktPmFzc2lnbigiZm9vIik7CiAgICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oImJhciIpOwogICAgIHByb3RvX2FycmF5Xy5BZGQoKS0+YXNzaWduKCJiYXoiKTsKKyAgICBjb25zdF9wcm90b19hcnJheV8gPSAmcHJvdG9fYXJyYXlfOwogICB9CiAKICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+IHByb3RvX2FycmF5XzsKKyAgY29uc3QgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+KiBjb25zdF9wcm90b19hcnJheV87CiB9OwogCiBURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIENvbnZlcnRpYmxlUHRyKSB7CiAgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6cG9pbnRlcl9pdGVyYXRvciBpdGVyID0KICAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCk7CisgIHN0YXRpY19jYXN0PHZvaWQ+KGl0ZXIpOworfQorCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIENvbnZlcnRpYmxlQ29uc3RQdHIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCk7CisgIHN0YXRpY19jYXN0PHZvaWQ+KGl0ZXIpOwogfQogCiBURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIE11dGFibGVQdHJJdGVyYXRpb24pIHsKQEAgLTgyNyw2ICsxMjA1LDE4IEBACiAgIEVYUEVDVF9FUSgiYmF6IiwgKiooLS1wcm90b19hcnJheV8ucG9pbnRlcl9lbmQoKSkpOwogfQogCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIE11dGFibGVDb25zdFB0ckl0ZXJhdGlvbikgeworICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXRlciA9CisgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKTsKKyAgRVhQRUNUX0VRKCJmb28iLCAqKml0ZXIpOworICArK2l0ZXI7CisgIEVYUEVDVF9FUSgiYmFyIiwgKiooaXRlcisrKSk7CisgIEVYUEVDVF9FUSgiYmF6IiwgKippdGVyKTsKKyAgKytpdGVyOworICBFWFBFQ1RfVFJVRShjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCkgPT0gaXRlcik7CisgIEVYUEVDVF9FUSgiYmF6IiwgKiooLS1jb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCkpKTsKK30KKwogVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBSYW5kb21QdHJBY2Nlc3MpIHsKICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQogICAgICAgcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKTsKQEAgLTg0MCw2ICsxMjMwLDE5IEBACiAgIEVYUEVDVF9FUSgzLCBwcm90b19hcnJheV8uZW5kKCkgLSBwcm90b19hcnJheV8uYmVnaW4oKSk7CiB9CiAKK1RFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgUmFuZG9tQ29uc3RQdHJBY2Nlc3MpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyMiA9IGl0ZXI7CisgICsraXRlcjI7CisgICsraXRlcjI7CisgIEVYUEVDVF9UUlVFKGl0ZXIgKyAyID09IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA9PSBpdGVyMiAtIDIpOworICBFWFBFQ1RfRVEoImJheiIsICppdGVyWzJdKTsKKyAgRVhQRUNUX0VRKCJiYXoiLCAqKihpdGVyICsgMikpOworICBFWFBFQ1RfRVEoMywgY29uc3RfcHJvdG9fYXJyYXlfLT5lbmQoKSAtIGNvbnN0X3Byb3RvX2FycmF5Xy0+YmVnaW4oKSk7Cit9CisKIFRFU1RfRihSZXBlYXRlZFB0ckZpZWxkUHRyc0l0ZXJhdG9yVGVzdCwgQ29tcGFyYWJsZVB0cikgewogICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlciA9CiAgICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpOwpAQCAtODU0LDYgKzEyNTcsMjAgQEAKICAgRVhQRUNUX1RSVUUoaXRlciA+PSBpdGVyKTsKIH0KIAorVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBDb21wYXJhYmxlQ29uc3RQdHIpIHsKKyAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpjb25zdF9wb2ludGVyX2l0ZXJhdG9yIGl0ZXIgPQorICAgICAgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCk7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyMiA9IGl0ZXIgKyAxOworICBFWFBFQ1RfVFJVRShpdGVyID09IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8IGl0ZXIyKTsKKyAgRVhQRUNUX1RSVUUoaXRlciA8PSBpdGVyMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgPD0gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID4gaXRlcik7CisgIEVYUEVDVF9UUlVFKGl0ZXIyID49IGl0ZXIpOworICBFWFBFQ1RfVFJVRShpdGVyID49IGl0ZXIpOworfQorCiAvLyBVbmluaXRpYWxpemVkIGl0ZXJhdG9yIGRvZXMgbm90IHBvaW50IHRvIGFueSBvZiB0aGUgUmVwZWF0ZWRQdHJPdmVyUHRycy4KIC8vIERlcmVmZXJlbmNpbmcgYW4gdW5pbml0aWFsaXplZCBpdGVyYXRvciBjcmFzaGVzIHRoZSBwcm9jZXNzLgogVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBVbmluaXRpYWxpemVkUHRySXRlcmF0b3IpIHsKQEAgLTg2NSw2ICsxMjgyLDE0IEBACiAgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCkpOwogfQogCitURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFVuaW5pdGlhbGl6ZWRDb25zdFB0ckl0ZXJhdG9yKSB7CisgIFJlcGVhdGVkUHRyRmllbGQ8c3RyaW5nPjo6Y29uc3RfcG9pbnRlcl9pdGVyYXRvciBpdGVyOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSArIDEpOworICBFWFBFQ1RfVFJVRShpdGVyICE9IGNvbnN0X3Byb3RvX2FycmF5Xy0+cG9pbnRlcl9iZWdpbigpICsgMik7CisgIEVYUEVDVF9UUlVFKGl0ZXIgIT0gY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCkgKyAzKTsKKyAgRVhQRUNUX1RSVUUoaXRlciAhPSBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfZW5kKCkpOworfQogCiAvLyBUaGlzIGNvbXBhcmlzb24gZnVuY3RvciBpcyByZXF1aXJlZCBieSB0aGUgdGVzdHMgZm9yIFJlcGVhdGVkUHRyT3ZlclB0cnMuCiAvLyBUaGV5IG9wZXJhdGUgb24gc3RyaW5ncyBhbmQgbmVlZCB0byBjb21wYXJlIHN0cmluZ3MgYXMgc3RyaW5ncyBpbgpAQCAtODc0LDkgKzEyOTksNyBAQAogICBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nKiB6LCBjb25zdCBzdHJpbmcmIHkpIHsKICAgICByZXR1cm4gKnogPCB5OwogICB9Ci0gIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcqIHosIGNvbnN0IHN0cmluZyogeSkgewotICAgIHJldHVybiAqeiA8ICp5OwotICB9CisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBzdHJpbmcqIHosIGNvbnN0IHN0cmluZyogeSkgY29uc3QgeyByZXR1cm4gKnogPCAqeTsgfQogfTsKIAogVEVTVF9GKFJlcGVhdGVkUHRyRmllbGRQdHJzSXRlcmF0b3JUZXN0LCBQdHJTVExBbGdvcml0aG1zX2xvd2VyX2JvdW5kKSB7CkBAIC04ODksMTcgKzEzMTIsMjggQEAKICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oIngiKTsKICAgcHJvdG9fYXJyYXlfLkFkZCgpLT5hc3NpZ24oInkiKTsKIAotICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OnBvaW50ZXJfaXRlcmF0b3IgaXRlciA9Ci0gICAgICBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpOwotICBzdHJpbmcgdiA9ICJmIjsKLSAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ID0KLSAgICAgIGxvd2VyX2JvdW5kKHByb3RvX2FycmF5Xy5wb2ludGVyX2JlZ2luKCksIHByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpLAotICAgICAgICAgICAgICAgICAgJnYsIFN0cmluZ0xlc3NUaGFuKCkpOworICB7CisgICAgc3RyaW5nIHYgPSAiZiI7CisgICAgUmVwZWF0ZWRQdHJGaWVsZDxzdHJpbmc+Ojpwb2ludGVyX2l0ZXJhdG9yIGl0ID0KKyAgICAgICAgc3RkOjpsb3dlcl9ib3VuZChwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpLCAmdiwgU3RyaW5nTGVzc1RoYW4oKSk7CiAKLSAgR09PR0xFX0NIRUNLKCppdCAhPSBOVUxMKTsKKyAgICBHT09HTEVfQ0hFQ0soKml0ICE9IE5VTEwpOwogCi0gIEVYUEVDVF9FUSgqKml0LCAibiIpOwotICBFWFBFQ1RfVFJVRShpdCA9PSBwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpICsgMyk7CisgICAgRVhQRUNUX0VRKCoqaXQsICJuIik7CisgICAgRVhQRUNUX1RSVUUoaXQgPT0gcHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSArIDMpOworICB9CisgIHsKKyAgICBzdHJpbmcgdiA9ICJmIjsKKyAgICBSZXBlYXRlZFB0ckZpZWxkPHN0cmluZz46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXQgPSBzdGQ6Omxvd2VyX2JvdW5kKAorICAgICAgICBjb25zdF9wcm90b19hcnJheV8tPnBvaW50ZXJfYmVnaW4oKSwgY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2VuZCgpLAorICAgICAgICAmdiwgU3RyaW5nTGVzc1RoYW4oKSk7CisKKyAgICBHT09HTEVfQ0hFQ0soKml0ICE9IE5VTEwpOworCisgICAgRVhQRUNUX0VRKCoqaXQsICJuIik7CisgICAgRVhQRUNUX1RSVUUoaXQgPT0gY29uc3RfcHJvdG9fYXJyYXlfLT5wb2ludGVyX2JlZ2luKCkgKyAzKTsKKyAgfQogfQogCiBURVNUX0YoUmVwZWF0ZWRQdHJGaWVsZFB0cnNJdGVyYXRvclRlc3QsIFB0ck11dGF0aW9uKSB7CkBAIC05MzEsOSArMTM2NSw4IEBACiAgIEVYUEVDVF9FUSgiZm9vIiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7CiAgIEVYUEVDVF9FUSgibiIsIHByb3RvX2FycmF5Xy5HZXQoNSkpOwogICBFWFBFQ1RfRVEoIngiLCBwcm90b19hcnJheV8uR2V0KDkpKTsKLSAgc29ydChwcm90b19hcnJheV8ucG9pbnRlcl9iZWdpbigpLAotICAgICAgIHByb3RvX2FycmF5Xy5wb2ludGVyX2VuZCgpLAotICAgICAgIFN0cmluZ0xlc3NUaGFuKCkpOworICBzdGQ6OnNvcnQocHJvdG9fYXJyYXlfLnBvaW50ZXJfYmVnaW4oKSwgcHJvdG9fYXJyYXlfLnBvaW50ZXJfZW5kKCksCisgICAgICAgICAgICBTdHJpbmdMZXNzVGhhbigpKTsKICAgRVhQRUNUX0VRKCJhIiwgcHJvdG9fYXJyYXlfLkdldCgwKSk7CiAgIEVYUEVDVF9FUSgiYmF6IiwgcHJvdG9fYXJyYXlfLkdldCgyKSk7CiAgIEVYUEVDVF9FUSgieSIsIHByb3RvX2FycmF5Xy5HZXQoOSkpOwpAQCAtOTk3LDcgKzE0MzAsNiBAQAogICAgIHN0ZDo6Y29weShuZXN0ZWRfcHRycy5iZWdpbigpLCBuZXN0ZWRfcHRycy5lbmQoKSwKICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZEJhY2tJbnNlcnRlcigKICAgICAgICAgICAgICAgICAgIHByb3RvYnVmZmVyLm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKSkpOwotCiAgIH0KIAogICB2aXJ0dWFsIHZvaWQgVGVhckRvd24oKSB7CkBAIC0xMDI1LDEzICsxNDU3LDI0IEBACiAKIFRFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwgV29yZHMpIHsKICAgQVNTRVJUX0VRKHdvcmRzLnNpemUoKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nX3NpemUoKSk7Ci0gIEVYUEVDVF9FUSh3b3Jkcy5hdCgwKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKDApKTsKLSAgRVhQRUNUX0VRKHdvcmRzLmF0KDEpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoMSkpOwotICBFWFBFQ1RfRVEod29yZHMuYXQoMiksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZygyKSk7Ci0gIEVYUEVDVF9FUSh3b3Jkcy5hdCgzKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKDMpKTsKLSAgRVhQRUNUX0VRKHdvcmRzLmF0KDQpLCBwcm90b2J1ZmZlci5yZXBlYXRlZF9zdHJpbmcoNCkpOwotICBFWFBFQ1RfRVEod29yZHMuYXQoNSksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZyg1KSk7Ci0gIEVYUEVDVF9FUSh3b3Jkcy5hdCg2KSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKDYpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB3b3Jkcy5zaXplKCk7ICsraSkKKyAgICBFWFBFQ1RfRVEod29yZHMuYXQoaSksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZyhpKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwgV29yZHMyKSB7CisgIHdvcmRzLmNsZWFyKCk7CisgIHdvcmRzLnB1c2hfYmFjaygic2luZyIpOworICB3b3Jkcy5wdXNoX2JhY2soImEiKTsKKyAgd29yZHMucHVzaF9iYWNrKCJzb25nIik7CisgIHdvcmRzLnB1c2hfYmFjaygib2YiKTsKKyAgd29yZHMucHVzaF9iYWNrKCJzaXgiKTsKKyAgd29yZHMucHVzaF9iYWNrKCJwZW5jZSIpOworICBwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX3N0cmluZygpLT5DbGVhcigpOworICBzdGQ6OmNvcHkod29yZHMuYmVnaW4oKSwgd29yZHMuZW5kKCksIFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgICBwcm90b2J1ZmZlci5tdXRhYmxlX3JlcGVhdGVkX3N0cmluZygpKSk7CisgIEFTU0VSVF9FUSh3b3Jkcy5zaXplKCksIHByb3RvYnVmZmVyLnJlcGVhdGVkX3N0cmluZ19zaXplKCkpOworICBmb3IgKGludCBpID0gMDsgaSA8IHdvcmRzLnNpemUoKTsgKytpKQorICAgIEVYUEVDVF9FUSh3b3Jkcy5hdChpKSwgcHJvdG9idWZmZXIucmVwZWF0ZWRfc3RyaW5nKGkpKTsKIH0KIAogVEVTVF9GKFJlcGVhdGVkRmllbGRJbnNlcnRpb25JdGVyYXRvcnNUZXN0LCBOZXN0ZWRzKSB7CkBAIC0xMDU1LDkgKzE0OTgsOSBAQAogICAgIG5ld19kYXRhLT5zZXRfYmIoaSk7CiAgIH0KICAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKLSAgY29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksCi0gICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKLSAgICAgICAgICAgdGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoKSkpOworICBzdGQ6OmNvcHkoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLAorICAgICAgICAgICAgQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgICAgICB0ZXN0cHJvdG8ubXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpKSk7CiAgIEVYUEVDVF9FUSh0ZXN0cHJvdG8uRGVidWdTdHJpbmcoKSwgZ29sZGVucHJvdG8uRGVidWdTdHJpbmcoKSk7CiB9CiAKQEAgLTEwNzQsOSArMTUxNyw0NiBAQAogICAgICpuZXdfZGF0YSA9ICJuYW1lLSIgKyBTaW1wbGVJdG9hKGkpOwogICB9CiAgIFRlc3RBbGxUeXBlcyB0ZXN0cHJvdG87Ci0gIGNvcHkoZGF0YS5iZWdpbigpLCBkYXRhLmVuZCgpLAotICAgICAgIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCi0gICAgICAgICAgIHRlc3Rwcm90by5tdXRhYmxlX3JlcGVhdGVkX3N0cmluZygpKSk7CisgIHN0ZDo6Y29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksIEFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZXN0cHJvdG8ubXV0YWJsZV9yZXBlYXRlZF9zdHJpbmcoKSkpOworICBFWFBFQ1RfRVEodGVzdHByb3RvLkRlYnVnU3RyaW5nKCksIGdvbGRlbnByb3RvLkRlYnVnU3RyaW5nKCkpOworfQorCitURVNUX0YoUmVwZWF0ZWRGaWVsZEluc2VydGlvbkl0ZXJhdG9yc1Rlc3QsCisgICAgICAgVW5zYWZlQXJlbmFBbGxvY2F0ZWRSZXBlYXRlZFB0ckZpZWxkV2l0aFN0cmluZ0ludERhdGEpIHsKKyAgdmVjdG9yPE5lc3RlZCo+IGRhdGE7CisgIFRlc3RBbGxUeXBlcyBnb2xkZW5wcm90bzsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCAxMDsgKytpKSB7CisgICAgTmVzdGVkKiBuZXdfZGF0YSA9IG5ldyBOZXN0ZWQ7CisgICAgbmV3X2RhdGEtPnNldF9iYihpKTsKKyAgICBkYXRhLnB1c2hfYmFjayhuZXdfZGF0YSk7CisKKyAgICBuZXdfZGF0YSA9IGdvbGRlbnByb3RvLmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpOworICAgIG5ld19kYXRhLT5zZXRfYmIoaSk7CisgIH0KKyAgVGVzdEFsbFR5cGVzIHRlc3Rwcm90bzsKKyAgc3RkOjpjb3B5KGRhdGEuYmVnaW4oKSwgZGF0YS5lbmQoKSwKKyAgICAgICAgICAgIFVuc2FmZUFyZW5hQWxsb2NhdGVkUmVwZWF0ZWRQdHJGaWVsZEJhY2tJbnNlcnRlcigKKyAgICAgICAgICAgICAgICB0ZXN0cHJvdG8ubXV0YWJsZV9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSgpKSk7CisgIEVYUEVDVF9FUSh0ZXN0cHJvdG8uRGVidWdTdHJpbmcoKSwgZ29sZGVucHJvdG8uRGVidWdTdHJpbmcoKSk7Cit9CisKK1RFU1RfRihSZXBlYXRlZEZpZWxkSW5zZXJ0aW9uSXRlcmF0b3JzVGVzdCwKKyAgICAgICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRXaXRoU3RyaW5nKSB7CisgIHZlY3RvcjxzdHJpbmcqPiBkYXRhOworICBUZXN0QWxsVHlwZXMgZ29sZGVucHJvdG87CisgIGZvciAoaW50IGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgIHN0cmluZyogbmV3X2RhdGEgPSBuZXcgc3RyaW5nOworICAgICpuZXdfZGF0YSA9ICJuYW1lLSIgKyBTaW1wbGVJdG9hKGkpOworICAgIGRhdGEucHVzaF9iYWNrKG5ld19kYXRhKTsKKworICAgIG5ld19kYXRhID0gZ29sZGVucHJvdG8uYWRkX3JlcGVhdGVkX3N0cmluZygpOworICAgICpuZXdfZGF0YSA9ICJuYW1lLSIgKyBTaW1wbGVJdG9hKGkpOworICB9CisgIFRlc3RBbGxUeXBlcyB0ZXN0cHJvdG87CisgIHN0ZDo6Y29weShkYXRhLmJlZ2luKCksIGRhdGEuZW5kKCksCisgICAgICAgICAgICBVbnNhZmVBcmVuYUFsbG9jYXRlZFJlcGVhdGVkUHRyRmllbGRCYWNrSW5zZXJ0ZXIoCisgICAgICAgICAgICAgICAgdGVzdHByb3RvLm11dGFibGVfcmVwZWF0ZWRfc3RyaW5nKCkpKTsKICAgRVhQRUNUX0VRKHRlc3Rwcm90by5EZWJ1Z1N0cmluZygpLCBnb2xkZW5wcm90by5EZWJ1Z1N0cmluZygpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuY2MKaW5kZXggY2FmOTY4Yy4uZmZhOTE5ZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zZXJ2aWNlLmgKaW5kZXggYTZhN2QxNi4uYWQ2Zjk2OCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc2VydmljZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NlcnZpY2UuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNzQsMTIgKzc0LDEyIEBACiAvLwogLy8gVG8gY2FsbCBhIHJlbW90ZSBNeVNlcnZpY2VJbXBsLCBmaXJzdCB5b3UgbmVlZCBhbiBScGNDaGFubmVsIGNvbm5lY3RlZCB0byBpdC4KIC8vIEhvdyB0byBjb25zdHJ1Y3QgYSBjaGFubmVsIGRlcGVuZHMsIGFnYWluLCBvbiB5b3VyIFJQQyBpbXBsZW1lbnRhdGlvbi4KLS8vIEhlcmUgd2UgdXNlIGEgaHlwb3RoZW50aWNhbCAiTXlScGNDaGFubmVsIiBhcyBhbiBleGFtcGxlOgorLy8gSGVyZSB3ZSB1c2UgYSBoeXBvdGhldGljYWwgIk15UnBjQ2hhbm5lbCIgYXMgYW4gZXhhbXBsZToKIC8vICAgTXlScGNDaGFubmVsIGNoYW5uZWwoInJwYzpob3N0bmFtZToxMjM0L215c2VydmljZSIpOwogLy8gICBNeVJwY0NvbnRyb2xsZXIgY29udHJvbGxlcjsKIC8vICAgTXlTZXJ2aWNlSW1wbDo6U3R1YiBzdHViKCZjaGFubmVsKTsKIC8vICAgRm9vUmVxdWVzdCByZXF1ZXN0OwotLy8gICBGb29SZXNwbm9zZSByZXNwb25zZTsKKy8vICAgRm9vUmVzcG9uc2UgcmVzcG9uc2U7CiAvLwogLy8gICAvLyAuLi4gZmlsbCBpbiByZXF1ZXN0IC4uLgogLy8KQEAgLTEwMiw2ICsxMDIsNyBAQAogCiAjaW5jbHVkZSA8c3RyaW5nPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnBiLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucGIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zb3VyY2VfY29udGV4dC5wYi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc291cmNlX2NvbnRleHQucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3NvdXJjZV9jb250ZXh0LnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0cnVjdC5wYi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucGIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3RydWN0LnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHJ1Y3QucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljX3NlcXVlbmNlX251bS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljX3NlcXVlbmNlX251bS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY19zZXF1ZW5jZV9udW0uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljX3NlcXVlbmNlX251bS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oCmluZGV4IGRjZWM1NTAuLmI4NDExN2IgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC01NCwxNCArNTQsMTUgQEAKICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19IXwogCiAvLyBEb24ndCBpbmNsdWRlIHRoaXMgZmlsZSBmb3IgcGVvcGxlIG5vdCBjb25jZXJuZWQgYWJvdXQgdGhyZWFkIHNhZmV0eS4KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRFNBRkVUWQorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaD4KIAogI2lmIGRlZmluZWQoU1RBUkJPQVJEKQogI2luY2x1ZGUgInN0YXJib2FyZC9hdG9taWMuaCIKICNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmg+Ci0KIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CkBAIC03MiwxOCArNzMsMjkgQEAKIHR5cGVkZWYgU2JBdG9taWM2NCBBdG9taWM2NDsKICNlbmRpZiAgLy8gZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQpCiAjZWxzZSAgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQorI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfUE9XRVIpCisjaWYgZGVmaW5lZChfTFA2NCkgfHwgZGVmaW5lZChfX0xQNjRfXykKK3R5cGVkZWYgaW50MzIgQXRvbWljMzI7Cit0eXBlZGVmIGludHB0cl90IEF0b21pYzY0OworI2Vsc2UKK3R5cGVkZWYgaW50cHRyX3QgQXRvbWljMzI7Cit0eXBlZGVmIGludDY0IEF0b21pYzY0OworI2VuZGlmCisjZWxzZQogdHlwZWRlZiBpbnQzMiBBdG9taWMzMjsKICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQKIC8vIFdlIG5lZWQgdG8gYmUgYWJsZSB0byBnbyBiZXR3ZWVuIEF0b21pYzY0IGFuZCBBdG9taWNXb3JkIGltcGxpY2l0bHkuICBUaGlzCiAvLyBtZWFucyBBdG9taWM2NCBhbmQgQXRvbWljV29yZCBzaG91bGQgYmUgdGhlIHNhbWUgdHlwZSBvbiA2NC1iaXQuCi0jaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfTkFDTCkKKyNpZiBkZWZpbmVkKF9fSUxQMzJfXykgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfTkFDTCkKIC8vIE5hQ2wncyBpbnRwdHJfdCBpcyBub3QgYWN0dWFsbHkgNjQtYml0cyBvbiA2NC1iaXQhCiAvLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvbmF0aXZlY2xpZW50L2lzc3Vlcy9kZXRhaWw/aWQ9MTE2MgorLy8gc3BhcmN2OSdzIHBvaW50ZXIgdHlwZSBpcyAzMmJpdHMKIHR5cGVkZWYgaW50NjQgQXRvbWljNjQ7CiAjZWxzZQogdHlwZWRlZiBpbnRwdHJfdCBBdG9taWM2NDsKICNlbmRpZgogI2VuZGlmCisjZW5kaWYKICNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAKIC8vIFVzZSBBdG9taWNXb3JkIGZvciBhIG1hY2hpbmUtc2l6ZWQgcG9pbnRlci4gIEl0IHdpbGwgdXNlIHRoZSBBdG9taWMzMiBvcgpAQCAtMTMxLDYgKzE0Myw5IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzMyIG9sZF92YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXRvbWljMzIgbmV3X3ZhbHVlKTsKIAorI2lmIGRlZmluZWQoX19NSU5HVzMyX18pICYmIGRlZmluZWQoTWVtb3J5QmFycmllcikKKyN1bmRlZiBNZW1vcnlCYXJyaWVyCisjZW5kaWYKIHZvaWQgTWVtb3J5QmFycmllcigpOwogdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljMzIqIHB0ciwgQXRvbWljMzIgdmFsdWUpOwogdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzMyKiBwdHIsIEF0b21pYzMyIHZhbHVlKTsKQEAgLTE2OSw0NiArMTg0LDY4IEBACiAKIC8vIEluY2x1ZGUgb3VyIHBsYXRmb3JtIHNwZWNpZmljIGltcGxlbWVudGF0aW9uLgogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0VSUk9SIFwKLSNlcnJvciAiQXRvbWljIG9wZXJhdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQgb24geW91ciBwbGF0Zm9ybSIKKyJBdG9taWMgb3BlcmF0aW9ucyBhcmUgbm90IHN1cHBvcnRlZCBvbiB5b3VyIHBsYXRmb3JtIgogCiAvLyBTdGFyYm9hcmQuCiAjaWYgZGVmaW5lZChTVEFSQk9BUkQpCiAjaW5jbHVkZSAidGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3N0YXJib2FyZC5oIgogI2Vsc2UKLQorLy8gVGhyZWFkU2FuaXRpemVyLCBodHRwOi8vY2xhbmcubGx2bS5vcmcvZG9jcy9UaHJlYWRTYW5pdGl6ZXIuaHRtbC4KKyNpZiBkZWZpbmVkKFRIUkVBRF9TQU5JVElaRVIpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfdHNhbi5oPgogLy8gTVNWQy4KLSNpZiBkZWZpbmVkKF9NU0NfVkVSKQorI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikKICNpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX0lBMzIpIHx8IGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfWDY0KQogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmg+CiAjZWxzZQotR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgorI2Vycm9yIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IKICNlbmRpZgogCisvLyBTb2xhcmlzCisjZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19TT0xBUklTKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3NvbGFyaXMuaD4KKworLy8gQUlYCisjZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19BSVgpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG93ZXIuaD4KKwogLy8gQXBwbGUuCiAjZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9PU19BUFBMRSkKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19tYWNvc3guaD4KIAotLy8gTEIgc2hlbGwgcGxhdGZvcm1zIHRoYXQgZG9uJ3QgZml0IGFueSBvZiB0aGUgZXhpc3RpbmcgYXRvbWljb3BzX2ludGVybmFsc19YWFgKLSNlbGlmIChkZWZpbmVkKF9fTEJfUFMzX18pIHx8IGRlZmluZWQoX19MQl9XSUlVX18pKSAmJiAhZGVmaW5lZChfX0xCX0hPU1RfXykKLSNkZWZpbmUgU0hFTExfQkVHSU5fQVRPTUlDT1BTX05BTUVTUEFDRVMgbmFtZXNwYWNlIGdvb2dsZSB7IG5hbWVzcGFjZSBwcm90b2J1ZiB7IG5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0jZGVmaW5lIFNIRUxMX0VORF9BVE9NSUNPUFNfTkFNRVNQQUNFUyB9IH0gfQotI2luY2x1ZGUgImF0b21pY29wc19pbnRlcm5hbHNfc2hlbGwuaCIgIC8vIGZyb20gdGhlIHBsYXRmb3JtIGxpYgotCiAvLyBHQ0MuCiAjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQogI2lmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfSUEzMikgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQpCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oPgotI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk0pCisjZWxpZiBkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9BUkNIX0FSTSkgJiYgZGVmaW5lZChfX2xpbnV4X18pCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX2djYy5oPgotI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTKQorI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9BQVJDSDY0KQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybTY0X2djYy5oPgorI2VsaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk1fUU5YKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9xbnguaD4KKyNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfTUlQUykgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTNjQpCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWlwc19nY2MuaD4KKyNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfUE9XRVIpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG93ZXIuaD4KKyNlbGlmIGRlZmluZWQoX19uYXRpdmVfY2xpZW50X18pCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG5hY2wuaD4KKyNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0FSQ0hfUFBDKQorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3BwY19nY2MuaD4KKyNlbGlmICgoKF9fR05VQ19fID09IDQpICYmIChfX0dOVUNfTUlOT1JfXyA+PSA3KSkgfHwgKF9fR05VQ19fID4gNCkpCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfZ2VuZXJpY19nY2MuaD4KKyNlbGlmIGRlZmluZWQoX19jbGFuZ19fKQorI2lmIF9faGFzX2V4dGVuc2lvbihjX2F0b21pYykKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19nZW5lcmljX2djYy5oPgogI2Vsc2UKLUdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IKKyNlcnJvciBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0VSUk9SCisjZW5kaWYKKyNlbHNlCisjZXJyb3IgR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgogI2VuZGlmCiAKIC8vIFVua25vd24uCiAjZWxzZQotR09PR0xFX1BST1RPQlVGX0FUT01JQ09QU19FUlJPUgorI2Vycm9yIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfRVJST1IKICNlbmRpZgogCiAjZW5kaWYgIC8vIGRlZmluZWQoU1RBUkJPQVJEKQpAQCAtMjIxLDYgKzI1OCw2IEBACiAKICN1bmRlZiBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0VSUk9SCiAKLSNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRFNBRkVUWQorI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQogCiAjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9BVE9NSUNPUFNfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm02NF9nY2MuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtNjRfZ2NjLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm02NF9nY2MuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm02NF9nY2MuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hcm1fZ2NjLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaAppbmRleCAxZjRkZWRjLi45MGU3MjdiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9nY2MuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9xbnguaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXJtX3FueC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2FybV9xbnguaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19hdG9taWN3b3JkX2NvbXBhdC5oCmluZGV4IGU5ZDg2NzkuLmViMTk4ZmYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfYXRvbWljd29yZF9jb21wYXQuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX2F0b21pY3dvcmRfY29tcGF0LmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19nZW5lcmljX2djYy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19nZW5lcmljX2djYy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfZ2VuZXJpY19nY2MuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19nZW5lcmljX2djYy5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19tYWNvc3guaAppbmRleCBmOWI3NTgxLi43OTYzMzI0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21hY29zeC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWFjb3N4LmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWlwc19nY2MuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfbWlwc19nY2MuaAppbmRleCBkYzQ2ODUxLi5mNTgzN2M5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX21pcHNfZ2NjLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19taXBzX2djYy5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC02NSw3ICs2NSw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICIyOlxuIgogICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKICAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAocHJldiksICI9bSIgKCpwdHIpLCAiPSZyIiAodG1wKQotICAgICAgICAgICAgICAgICAgICAgICA6ICJJciIgKG9sZF92YWx1ZSksICJyIiAobmV3X3ZhbHVlKSwgIm0iICgqcHRyKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAob2xkX3ZhbHVlKSwgInIiIChuZXdfdmFsdWUpLCAibSIgKCpwdHIpCiAgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOwogICByZXR1cm4gcHJldjsKIH0KQEAgLTc4LDcgKzc4LDcgQEAKICAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgogICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKICAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCi0gICAgICAgICAgICAgICAgICAgICAgICJsbCAlMSwgJTJcbiIgIC8vIG9sZCA9ICpwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgImxsICUxLCAlNFxuIiAgLy8gb2xkID0gKnB0cgogICAgICAgICAgICAgICAgICAgICAgICAibW92ZSAlMCwgJTNcbiIgIC8vIHRlbXAgPSBuZXdfdmFsdWUKICAgICAgICAgICAgICAgICAgICAgICAgInNjICUwLCAlMlxuIiAgLy8gKnB0ciA9IHRlbXAgKHdpdGggYXRvbWljIGNoZWNrKQogICAgICAgICAgICAgICAgICAgICAgICAiYmVxeiAlMCwgMWJcbiIgIC8vIHN0YXJ0IGFnYWluIG9uIGF0b21pYyBlcnJvcgpAQCAtMTAwLDcgKzEwMCw3IEBACiAgIF9fYXNtX18gX192b2xhdGlsZV9fKCIuc2V0IHB1c2hcbiIKICAgICAgICAgICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyXG4iCiAgICAgICAgICAgICAgICAgICAgICAgICIxOlxuIgotICAgICAgICAgICAgICAgICAgICAgICAibGwgJTAsICUyXG4iICAvLyB0ZW1wID0gKnB0cgorICAgICAgICAgICAgICAgICAgICAgICAibGwgJTAsICU0XG4iICAvLyB0ZW1wID0gKnB0cgogICAgICAgICAgICAgICAgICAgICAgICAiYWRkdSAlMSwgJTAsICUzXG4iICAvLyB0ZW1wMiA9IHRlbXAgKyBpbmNyZW1lbnQKICAgICAgICAgICAgICAgICAgICAgICAgInNjICUxLCAlMlxuIiAgLy8gKnB0ciA9IHRlbXAyICh3aXRoIGF0b21pYyBjaGVjaykKICAgICAgICAgICAgICAgICAgICAgICAgImJlcXogJTEsIDFiXG4iICAvLyBzdGFydCBhZ2FpbiBvbiBhdG9taWMgZXJyb3IKQEAgLTE3OCw2ICsxNzgsMTMyIEBACiAgIHJldHVybiAqcHRyOwogfQogCisjaWYgZGVmaW5lZChfX0xQNjRfXykKKy8vIDY0LWJpdCB2ZXJzaW9ucyBvZiB0aGUgYXRvbWljIG9wcy4KKworaW5saW5lIEF0b21pYzY0IE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICBBdG9taWM2NCBwcmV2LCB0bXA7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCIuc2V0IHB1c2hcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIxOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAibGxkICUwLCAlNVxuIiAgLy8gcHJldiA9ICpwdHIKKyAgICAgICAgICAgICAgICAgICAgICAgImJuZSAlMCwgJTMsIDJmXG4iICAvLyBpZiAocHJldiAhPSBvbGRfdmFsdWUpIGdvdG8gMgorICAgICAgICAgICAgICAgICAgICAgICAibW92ZSAlMiwgJTRcbiIgIC8vIHRtcCA9IG5ld192YWx1ZQorICAgICAgICAgICAgICAgICAgICAgICAic2NkICUyLCAlMVxuIiAgLy8gKnB0ciA9IHRtcCAod2l0aCBhdG9taWMgY2hlY2spCisgICAgICAgICAgICAgICAgICAgICAgICJiZXF6ICUyLCAxYlxuIiAgLy8gc3RhcnQgYWdhaW4gb24gYXRvbWljIGVycm9yCisgICAgICAgICAgICAgICAgICAgICAgICJub3BcbiIgIC8vIGRlbGF5IHNsb3Qgbm9wCisgICAgICAgICAgICAgICAgICAgICAgICIyOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBwb3BcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiPSZyIiAocHJldiksICI9bSIgKCpwdHIpLCAiPSZyIiAodG1wKQorICAgICAgICAgICAgICAgICAgICAgICA6ICJyIiAob2xkX3ZhbHVlKSwgInIiIChuZXdfdmFsdWUpLCAibSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOworICByZXR1cm4gcHJldjsKK30KKworLy8gQXRvbWljYWxseSBzdG9yZSBuZXdfdmFsdWUgaW50byAqcHRyLCByZXR1cm5pbmcgdGhlIHByZXZpb3VzIHZhbHVlIGhlbGQgaW4KKy8vICpwdHIuICBUaGlzIHJvdXRpbmUgaW1wbGllcyBubyBtZW1vcnkgYmFycmllcnMuCitpbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0F0b21pY0V4Y2hhbmdlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IG5ld192YWx1ZSkgeworICBBdG9taWM2NCB0ZW1wLCBvbGQ7CisgIF9fYXNtX18gX192b2xhdGlsZV9fKCIuc2V0IHB1c2hcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIi5zZXQgbm9yZW9yZGVyXG4iCisgICAgICAgICAgICAgICAgICAgICAgICIxOlxuIgorICAgICAgICAgICAgICAgICAgICAgICAibGxkICUxLCAlNFxuIiAgLy8gb2xkID0gKnB0cgorICAgICAgICAgICAgICAgICAgICAgICAibW92ZSAlMCwgJTNcbiIgIC8vIHRlbXAgPSBuZXdfdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgInNjZCAlMCwgJTJcbiIgIC8vICpwdHIgPSB0ZW1wICh3aXRoIGF0b21pYyBjaGVjaykKKyAgICAgICAgICAgICAgICAgICAgICAgImJlcXogJTAsIDFiXG4iICAvLyBzdGFydCBhZ2FpbiBvbiBhdG9taWMgZXJyb3IKKyAgICAgICAgICAgICAgICAgICAgICAgIm5vcFxuIiAgLy8gZGVsYXkgc2xvdCBub3AKKyAgICAgICAgICAgICAgICAgICAgICAgIi5zZXQgcG9wXG4iCisgICAgICAgICAgICAgICAgICAgICAgIDogIj0mciIgKHRlbXApLCAiPSZyIiAob2xkKSwgIj1tIiAoKnB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiciIgKG5ld192YWx1ZSksICJtIiAoKnB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisKKyAgcmV0dXJuIG9sZDsKK30KKworLy8gQXRvbWljYWxseSBpbmNyZW1lbnQgKnB0ciBieSAiaW5jcmVtZW50Ii4gIFJldHVybnMgdGhlIG5ldyB2YWx1ZSBvZgorLy8gKnB0ciB3aXRoIHRoZSBpbmNyZW1lbnQgYXBwbGllZC4gIFRoaXMgcm91dGluZSBpbXBsaWVzIG5vIG1lbW9yeSBiYXJyaWVycy4KK2lubGluZSBBdG9taWM2NCBOb0JhcnJpZXJfQXRvbWljSW5jcmVtZW50KHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBpbmNyZW1lbnQpIHsKKyAgQXRvbWljNjQgdGVtcCwgdGVtcDI7CisKKyAgX19hc21fXyBfX3ZvbGF0aWxlX18oIi5zZXQgcHVzaFxuIgorICAgICAgICAgICAgICAgICAgICAgICAiLnNldCBub3Jlb3JkZXJcbiIKKyAgICAgICAgICAgICAgICAgICAgICAgIjE6XG4iCisgICAgICAgICAgICAgICAgICAgICAgICJsbGQgJTAsICU0XG4iICAvLyB0ZW1wID0gKnB0cgorICAgICAgICAgICAgICAgICAgICAgICAiZGFkZHUgJTEsICUwLCAlM1xuIiAgLy8gdGVtcDIgPSB0ZW1wICsgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICJzY2QgJTEsICUyXG4iICAvLyAqcHRyID0gdGVtcDIgKHdpdGggYXRvbWljIGNoZWNrKQorICAgICAgICAgICAgICAgICAgICAgICAiYmVxeiAlMSwgMWJcbiIgIC8vIHN0YXJ0IGFnYWluIG9uIGF0b21pYyBlcnJvcgorICAgICAgICAgICAgICAgICAgICAgICAiZGFkZHUgJTEsICUwLCAlM1xuIiAgLy8gdGVtcDIgPSB0ZW1wICsgaW5jcmVtZW50CisgICAgICAgICAgICAgICAgICAgICAgICIuc2V0IHBvcFxuIgorICAgICAgICAgICAgICAgICAgICAgICA6ICI9JnIiICh0ZW1wKSwgIj0mciIgKHRlbXAyKSwgIj1tIiAoKnB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgOiAiSXIiIChpbmNyZW1lbnQpLCAibSIgKCpwdHIpCisgICAgICAgICAgICAgICAgICAgICAgIDogIm1lbW9yeSIpOworICAvLyB0ZW1wMiBub3cgaG9sZHMgdGhlIGZpbmFsIHZhbHVlLgorICByZXR1cm4gdGVtcDI7Cit9CisKK2lubGluZSBBdG9taWM2NCBCYXJyaWVyX0F0b21pY0luY3JlbWVudCh2b2xhdGlsZSBBdG9taWM2NCogcHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF0b21pYzY0IGluY3JlbWVudCkgeworICBNZW1vcnlCYXJyaWVyKCk7CisgIEF0b21pYzY0IHJlcyA9IE5vQmFycmllcl9BdG9taWNJbmNyZW1lbnQocHRyLCBpbmNyZW1lbnQpOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiByZXM7Cit9CisKKy8vICJBY3F1aXJlIiBvcGVyYXRpb25zCisvLyBlbnN1cmUgdGhhdCBubyBsYXRlciBtZW1vcnkgYWNjZXNzIGNhbiBiZSByZW9yZGVyZWQgYWhlYWQgb2YgdGhlIG9wZXJhdGlvbi4KKy8vICJSZWxlYXNlIiBvcGVyYXRpb25zIGVuc3VyZSB0aGF0IG5vIHByZXZpb3VzIG1lbW9yeSBhY2Nlc3MgY2FuIGJlIHJlb3JkZXJlZAorLy8gYWZ0ZXIgdGhlIG9wZXJhdGlvbi4gICJCYXJyaWVyIiBvcGVyYXRpb25zIGhhdmUgYm90aCAiQWNxdWlyZSIgYW5kICJSZWxlYXNlIgorLy8gc2VtYW50aWNzLiAgIEEgTWVtb3J5QmFycmllcigpIGhhcyAiQmFycmllciIgc2VtYW50aWNzLCBidXQgZG9lcyBubyBtZW1vcnkKKy8vIGFjY2Vzcy4KK2lubGluZSBBdG9taWM2NCBBY3F1aXJlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgQXRvbWljNjQgcmVzID0gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiByZXM7Cit9CisKK2lubGluZSBBdG9taWM2NCBSZWxlYXNlX0NvbXBhcmVBbmRTd2FwKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBvbGRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBdG9taWM2NCBuZXdfdmFsdWUpIHsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gTm9CYXJyaWVyX0NvbXBhcmVBbmRTd2FwKHB0ciwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUpOworfQorCitpbmxpbmUgdm9pZCBOb0JhcnJpZXJfU3RvcmUodm9sYXRpbGUgQXRvbWljNjQqIHB0ciwgQXRvbWljNjQgdmFsdWUpIHsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgdm9pZCBBY3F1aXJlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgICpwdHIgPSB2YWx1ZTsKKyAgTWVtb3J5QmFycmllcigpOworfQorCitpbmxpbmUgdm9pZCBSZWxlYXNlX1N0b3JlKHZvbGF0aWxlIEF0b21pYzY0KiBwdHIsIEF0b21pYzY0IHZhbHVlKSB7CisgIE1lbW9yeUJhcnJpZXIoKTsKKyAgKnB0ciA9IHZhbHVlOworfQorCitpbmxpbmUgQXRvbWljNjQgTm9CYXJyaWVyX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgeworICByZXR1cm4gKnB0cjsKK30KKworaW5saW5lIEF0b21pYzY0IEFjcXVpcmVfTG9hZCh2b2xhdGlsZSBjb25zdCBBdG9taWM2NCogcHRyKSB7CisgIEF0b21pYzY0IHZhbHVlID0gKnB0cjsKKyAgTWVtb3J5QmFycmllcigpOworICByZXR1cm4gdmFsdWU7Cit9CisKK2lubGluZSBBdG9taWM2NCBSZWxlYXNlX0xvYWQodm9sYXRpbGUgY29uc3QgQXRvbWljNjQqIHB0cikgeworICBNZW1vcnlCYXJyaWVyKCk7CisgIHJldHVybiAqcHRyOworfQorI2VuZGlmCisKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG5hY2wuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG5hY2wuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3BuYWNsLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfcG5hY2wuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3Bvd2VyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3Bvd2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wb3dlci5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3Bvd2VyLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wcGNfZ2NjLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3BwY19nY2MuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3BwY19nY2MuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19wcGNfZ2NjLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19zb2xhcmlzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3NvbGFyaXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3NvbGFyaXMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc19zb2xhcmlzLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc190c2FuLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3RzYW4uaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3RzYW4uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc190c2FuLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5jYwppbmRleCAwNzc0ODcyLi41M2M5ZWFlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfZ2NjLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9nY2MuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oCmluZGV4IDUzMjRkZmIuLmVkY2NjNTkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X2djYy5oCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5jYwppbmRleCA4MzY2YTg5Li43NDFiMTY0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDEyIEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDcgKzMyLDcgQEAKIC8vIFRoZXJlZm9yZSB3ZSBtb3ZlIHRoZSBjb2RlIGRlcGVuZGluZyBvbiB3aW5kb3dzLmggdG8gdGhpcyBzZXBhcmF0ZSBjYyBmaWxlLgogCiAvLyBEb24ndCBjb21waWxlIHRoaXMgZmlsZSBmb3IgcGVvcGxlIG5vdCBjb25jZXJuZWQgYWJvdXQgdGhyZWFkIHNhZmV0eS4KLSNpZm5kZWYgR09PR0xFX1BST1RPQlVGX05PX1RIUkVBRFNBRkVUWQorI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wcy5oPgogCkBAIC0xMDksNCArMTA5LDQgQEAKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKIAogI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfQVRPTUlDT1BTX0lOVEVSTkFMU19YODZfTVNWQ19IXwotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEU0FGRVRZCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURfU0FGRVRZCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmgKaW5kZXggNmY5ODY5ZC4uZTUzYTY0MSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2F0b21pY29wc19pbnRlcm5hbHNfeDg2X21zdmMuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQzYWY4ZgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uY2MKQEAgLTAsMCArMSwyMDEgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtLmg+CisKKyNpZm5kZWYgU1RBUkJPQVJECisjaW5jbHVkZSA8c3RyaW5nLmg+CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2Ugc3RyaW5ncyB7CisKK3ZvaWQgQnl0ZVNvdXJjZTo6Q29weVRvKEJ5dGVTaW5rKiBzaW5rLCBzaXplX3QgbikgeworICB3aGlsZSAobiA+IDApIHsKKyAgICBTdHJpbmdQaWVjZSBmcmFnbWVudCA9IFBlZWsoKTsKKyAgICBpZiAoZnJhZ21lbnQuZW1wdHkoKSkgeworICAgICAgR09PR0xFX0xPRyhERkFUQUwpIDw8ICJCeXRlU291cmNlOjpDb3B5VG8oKSBvdmVycmFuIGlucHV0LiI7CisgICAgICBicmVhazsKKyAgICB9CisgICAgc3RkOjpzaXplX3QgZnJhZ21lbnRfc2l6ZSA9IHN0ZDo6bWluPHN0ZDo6c2l6ZV90PihuLCBmcmFnbWVudC5zaXplKCkpOworICAgIHNpbmstPkFwcGVuZChmcmFnbWVudC5kYXRhKCksIGZyYWdtZW50X3NpemUpOworICAgIFNraXAoZnJhZ21lbnRfc2l6ZSk7CisgICAgbiAtPSBmcmFnbWVudF9zaXplOworICB9Cit9CisKK3ZvaWQgQnl0ZVNpbms6OkZsdXNoKCkge30KKwordm9pZCBVbmNoZWNrZWRBcnJheUJ5dGVTaW5rOjpBcHBlbmQoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IG4pIHsKKyAgaWYgKGRhdGEgIT0gZGVzdF8pIHsKKyAgICAvLyBDYXRjaCBjYXNlcyB3aGVyZSB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBHZXRBcHBlbmRCdWZmZXIoKSB3YXMgbW9kaWZpZWQuCisgICAgR09PR0xFX0RDSEVDSyghKGRlc3RfIDw9IGRhdGEgJiYgZGF0YSA8IChkZXN0XyArIG4pKSkKKyAgICAgICAgPDwgIkFwcGVuZCgpIGRhdGFbXSBvdmVybGFwcyB3aXRoIGRlc3RfW10iOworICAgIG1lbWNweShkZXN0XywgZGF0YSwgbik7CisgIH0KKyAgZGVzdF8gKz0gbjsKK30KKworQ2hlY2tlZEFycmF5Qnl0ZVNpbms6OkNoZWNrZWRBcnJheUJ5dGVTaW5rKGNoYXIqIG91dGJ1Ziwgc2l6ZV90IGNhcGFjaXR5KQorICAgIDogb3V0YnVmXyhvdXRidWYpLCBjYXBhY2l0eV8oY2FwYWNpdHkpLCBzaXplXygwKSwgb3ZlcmZsb3dlZF8oZmFsc2UpIHsKK30KKwordm9pZCBDaGVja2VkQXJyYXlCeXRlU2luazo6QXBwZW5kKGNvbnN0IGNoYXIqIGJ5dGVzLCBzaXplX3QgbikgeworICBzaXplX3QgYXZhaWxhYmxlID0gY2FwYWNpdHlfIC0gc2l6ZV87CisgIGlmIChuID4gYXZhaWxhYmxlKSB7CisgICAgbiA9IGF2YWlsYWJsZTsKKyAgICBvdmVyZmxvd2VkXyA9IHRydWU7CisgIH0KKyAgaWYgKG4gPiAwICYmIGJ5dGVzICE9IChvdXRidWZfICsgc2l6ZV8pKSB7CisgICAgLy8gQ2F0Y2ggY2FzZXMgd2hlcmUgdGhlIHBvaW50ZXIgcmV0dXJuZWQgYnkgR2V0QXBwZW5kQnVmZmVyKCkgd2FzIG1vZGlmaWVkLgorICAgIEdPT0dMRV9EQ0hFQ0soIShvdXRidWZfIDw9IGJ5dGVzICYmIGJ5dGVzIDwgKG91dGJ1Zl8gKyBjYXBhY2l0eV8pKSkKKyAgICAgICAgPDwgIkFwcGVuZCgpIGJ5dGVzW10gb3ZlcmxhcHMgd2l0aCBvdXRidWZfW10iOworICAgIG1lbWNweShvdXRidWZfICsgc2l6ZV8sIGJ5dGVzLCBuKTsKKyAgfQorICBzaXplXyArPSBuOworfQorCitHcm93aW5nQXJyYXlCeXRlU2luazo6R3Jvd2luZ0FycmF5Qnl0ZVNpbmsoc2l6ZV90IGVzdGltYXRlZF9zaXplKQorICAgIDogY2FwYWNpdHlfKGVzdGltYXRlZF9zaXplKSwKKyAgICAgIGJ1Zl8obmV3IGNoYXJbZXN0aW1hdGVkX3NpemVdKSwKKyAgICAgIHNpemVfKDApIHsKK30KKworR3Jvd2luZ0FycmF5Qnl0ZVNpbms6On5Hcm93aW5nQXJyYXlCeXRlU2luaygpIHsKKyAgZGVsZXRlW10gYnVmXzsgIC8vIEp1c3QgaW4gY2FzZSB0aGUgdXNlciBkaWRuJ3QgY2FsbCBHZXRCdWZmZXIuCit9CisKK3ZvaWQgR3Jvd2luZ0FycmF5Qnl0ZVNpbms6OkFwcGVuZChjb25zdCBjaGFyKiBieXRlcywgc2l6ZV90IG4pIHsKKyAgc2l6ZV90IGF2YWlsYWJsZSA9IGNhcGFjaXR5XyAtIHNpemVfOworICBpZiAoYnl0ZXMgIT0gKGJ1Zl8gKyBzaXplXykpIHsKKyAgICAvLyBDYXRjaCBjYXNlcyB3aGVyZSB0aGUgcG9pbnRlciByZXR1cm5lZCBieSBHZXRBcHBlbmRCdWZmZXIoKSB3YXMgbW9kaWZpZWQuCisgICAgLy8gV2UgbmVlZCB0byB0ZXN0IGZvciB0aGlzIGJlZm9yZSBjYWxsaW5nIEV4cGFuZCgpIHdoaWNoIG1heSByZWFsbG9jYXRlLgorICAgIEdPT0dMRV9EQ0hFQ0soIShidWZfIDw9IGJ5dGVzICYmIGJ5dGVzIDwgKGJ1Zl8gKyBjYXBhY2l0eV8pKSkKKyAgICAgICAgPDwgIkFwcGVuZCgpIGJ5dGVzW10gb3ZlcmxhcHMgd2l0aCBidWZfW10iOworICB9CisgIGlmIChuID4gYXZhaWxhYmxlKSB7CisgICAgRXhwYW5kKG4gLSBhdmFpbGFibGUpOworICB9CisgIGlmIChuID4gMCAmJiBieXRlcyAhPSAoYnVmXyArIHNpemVfKSkgeworICAgIG1lbWNweShidWZfICsgc2l6ZV8sIGJ5dGVzLCBuKTsKKyAgfQorICBzaXplXyArPSBuOworfQorCitjaGFyKiBHcm93aW5nQXJyYXlCeXRlU2luazo6R2V0QnVmZmVyKHNpemVfdCogbmJ5dGVzKSB7CisgIFNocmlua1RvRml0KCk7CisgIGNoYXIqIGIgPSBidWZfOworICAqbmJ5dGVzID0gc2l6ZV87CisgIGJ1Zl8gPSBOVUxMOworICBzaXplXyA9IGNhcGFjaXR5XyA9IDA7CisgIHJldHVybiBiOworfQorCit2b2lkIEdyb3dpbmdBcnJheUJ5dGVTaW5rOjpFeHBhbmQoc2l6ZV90IGFtb3VudCkgeyAgLy8gRXhwYW5kIGJ5IGF0IGxlYXN0IDUwJS4KKyAgc2l6ZV90IG5ld19jYXBhY2l0eSA9IHN0ZDo6bWF4KGNhcGFjaXR5XyArIGFtb3VudCwgKDMgKiBjYXBhY2l0eV8pIC8gMik7CisgIGNoYXIqIGJpZ2dlciA9IG5ldyBjaGFyW25ld19jYXBhY2l0eV07CisgIG1lbWNweShiaWdnZXIsIGJ1Zl8sIHNpemVfKTsKKyAgZGVsZXRlW10gYnVmXzsKKyAgYnVmXyA9IGJpZ2dlcjsKKyAgY2FwYWNpdHlfID0gbmV3X2NhcGFjaXR5OworfQorCit2b2lkIEdyb3dpbmdBcnJheUJ5dGVTaW5rOjpTaHJpbmtUb0ZpdCgpIHsKKyAgLy8gU2hyaW5rIG9ubHkgaWYgdGhlIGJ1ZmZlciBpcyBsYXJnZSBhbmQgc2l6ZV8gaXMgbGVzcyB0aGFuIDMvNAorICAvLyBvZiBjYXBhY2l0eV8uCisgIGlmIChjYXBhY2l0eV8gPiAyNTYgJiYgc2l6ZV8gPCAoMyAqIGNhcGFjaXR5XykgLyA0KSB7CisgICAgY2hhcioganVzdF9lbm91Z2ggPSBuZXcgY2hhcltzaXplX107CisgICAgbWVtY3B5KGp1c3RfZW5vdWdoLCBidWZfLCBzaXplXyk7CisgICAgZGVsZXRlW10gYnVmXzsKKyAgICBidWZfID0ganVzdF9lbm91Z2g7CisgICAgY2FwYWNpdHlfID0gc2l6ZV87CisgIH0KK30KKwordm9pZCBTdHJpbmdCeXRlU2luazo6QXBwZW5kKGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBuKSB7CisgIGRlc3RfLT5hcHBlbmQoZGF0YSwgbik7Cit9CisKK3NpemVfdCBBcnJheUJ5dGVTb3VyY2U6OkF2YWlsYWJsZSgpIGNvbnN0IHsKKyAgcmV0dXJuIGlucHV0Xy5zaXplKCk7Cit9CisKK1N0cmluZ1BpZWNlIEFycmF5Qnl0ZVNvdXJjZTo6UGVlaygpIHsKKyAgcmV0dXJuIGlucHV0XzsKK30KKwordm9pZCBBcnJheUJ5dGVTb3VyY2U6OlNraXAoc2l6ZV90IG4pIHsKKyAgR09PR0xFX0RDSEVDS19MRShuLCBpbnB1dF8uc2l6ZSgpKTsKKyAgaW5wdXRfLnJlbW92ZV9wcmVmaXgobik7Cit9CisKK0xpbWl0Qnl0ZVNvdXJjZTo6TGltaXRCeXRlU291cmNlKEJ5dGVTb3VyY2UgKnNvdXJjZSwgc2l6ZV90IGxpbWl0KQorICA6IHNvdXJjZV8oc291cmNlKSwKKyAgICBsaW1pdF8obGltaXQpIHsKK30KKworc2l6ZV90IExpbWl0Qnl0ZVNvdXJjZTo6QXZhaWxhYmxlKCkgY29uc3QgeworICBzaXplX3QgYXZhaWxhYmxlID0gc291cmNlXy0+QXZhaWxhYmxlKCk7CisgIGlmIChhdmFpbGFibGUgPiBsaW1pdF8pIHsKKyAgICBhdmFpbGFibGUgPSBsaW1pdF87CisgIH0KKworICByZXR1cm4gYXZhaWxhYmxlOworfQorCitTdHJpbmdQaWVjZSBMaW1pdEJ5dGVTb3VyY2U6OlBlZWsoKSB7CisgIFN0cmluZ1BpZWNlIHBpZWNlKHNvdXJjZV8tPlBlZWsoKSk7CisgIGlmIChwaWVjZS5zaXplKCkgPiBsaW1pdF8pIHsKKyAgICBwaWVjZS5zZXQocGllY2UuZGF0YSgpLCBsaW1pdF8pOworICB9CisKKyAgcmV0dXJuIHBpZWNlOworfQorCit2b2lkIExpbWl0Qnl0ZVNvdXJjZTo6U2tpcChzaXplX3QgbikgeworICBHT09HTEVfRENIRUNLX0xFKG4sIGxpbWl0Xyk7CisgIHNvdXJjZV8tPlNraXAobik7CisgIGxpbWl0XyAtPSBuOworfQorCit2b2lkIExpbWl0Qnl0ZVNvdXJjZTo6Q29weVRvKEJ5dGVTaW5rICpzaW5rLCBzaXplX3QgbikgeworICBHT09HTEVfRENIRUNLX0xFKG4sIGxpbWl0Xyk7CisgIHNvdXJjZV8tPkNvcHlUbyhzaW5rLCBuKTsKKyAgbGltaXRfIC09IG47Cit9CisKK30gIC8vIG5hbWVzcGFjZSBzdHJpbmdzCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW0uaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvYnl0ZXN0cmVhbS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9ieXRlc3RyZWFtX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2J5dGVzdHJlYW1fdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jYXN0cy5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uY2MKaW5kZXggMWYzNWFmNC4uZmE2OGNlYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsMjMgKzMyLDI0IEBACiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaD4KLQotI2luY2x1ZGUgImNvbmZpZy5oIgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaD4KIAogI2lmZGVmIFNUQVJCT0FSRAotI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGlvX3BvZW0uaCIKICNpbmNsdWRlICJzdGFyYm9hcmQvbG9nLmgiCiAjaW5jbHVkZSAic3RhcmJvYXJkL211dGV4LmgiCisjaW5jbHVkZSAic3RhcmJvYXJkL3N0cmluZy5oIgogI2luY2x1ZGUgInN0YXJib2FyZC9zeXN0ZW0uaCIKICNkZWZpbmUgYWJvcnQgU2JTeXN0ZW1CcmVha0ludG9EZWJ1Z2dlcgogI2RlZmluZSBmZmx1c2goc3RkZXJyKSBTYkxvZ0ZsdXNoKCkKKyNkZWZpbmUgc25wcmludGYgU2JTdHJpbmdGb3JtYXRGCiAjZWxzZSAgLy8gU1RBUkJPQVJECiAjaW5jbHVkZSA8ZXJybm8uaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2lmZGVmIF9XSU4zMgotI2lmbmRlZiBXSU4zMl9MRUFOX0FORF9NRUFOCiAjZGVmaW5lIFdJTjMyX0xFQU5fQU5EX01FQU4gIC8vIFdlIG9ubHkgbmVlZCBtaW5pbWFsIGluY2x1ZGVzCi0jZW5kaWYgICAgICAgICAgICAgICAgICAgICAgIC8vIFdJTjMyX0xFQU5fQU5EX01FQU4KICNpbmNsdWRlIDx3aW5kb3dzLmg+CiAjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZiAgICAvLyBzZWUgY29tbWVudCBpbiBzdHJ1dGlsLmNjCiAjZWxpZiBkZWZpbmVkKEhBVkVfUFRIUkVBRCkKQEAgLTU2LDggKzU3LDEyIEBACiAjZWxzZQogI2Vycm9yICJObyBzdWl0YWJsZSB0aHJlYWRpbmcgbGlicmFyeSBhdmFpbGFibGUuIgogI2VuZGlmCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykKKyNpbmNsdWRlIDxhbmRyb2lkL2xvZy5oPgorI2VuZGlmCiAjZW5kaWYgIC8vIFNUQVJCT0FSRAogCisjaW5jbHVkZSA8c3N0cmVhbT4KICNpbmNsdWRlIDx2ZWN0b3I+CiAKIG5hbWVzcGFjZSBnb29nbGUgewpAQCAtMTE1LDcgKzEyMCw0MyBAQAogLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL2xvZ2dpbmcuY2MKIAogbmFtZXNwYWNlIGludGVybmFsIHsKKyNpZiBkZWZpbmVkKF9fQU5EUk9JRF9fKQoraW5saW5lIHZvaWQgRGVmYXVsdExvZ0hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbWVzc2FnZSkgeworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9NSU5fTE9HX0xFVkVMCisgIGlmIChsZXZlbCA8IEdPT0dMRV9QUk9UT0JVRl9NSU5fTE9HX0xFVkVMKSB7CisgICAgcmV0dXJuOworICB9CisgIHN0YXRpYyBjb25zdCBjaGFyKiBsZXZlbF9uYW1lc1tdID0geyJJTkZPIiwgIldBUk5JTkciLCAiRVJST1IiLCAiRkFUQUwifTsKIAorICBzdGF0aWMgY29uc3QgaW50IGFuZHJvaWRfbG9nX2xldmVsc1tdID0geworICAgICAgQU5EUk9JRF9MT0dfSU5GTywgICAvLyBMT0coSU5GTyksCisgICAgICBBTkRST0lEX0xPR19XQVJOLCAgIC8vIExPRyhXQVJOSU5HKQorICAgICAgQU5EUk9JRF9MT0dfRVJST1IsICAvLyBMT0coRVJST1IpCisgICAgICBBTkRST0lEX0xPR19GQVRBTCwgIC8vIExPRyhGQVRBTCkKKyAgfTsKKworICAvLyBCb3VuZCB0aGUgbG9nZ2luZyBsZXZlbC4KKyAgY29uc3QgaW50IGFuZHJvaWRfbG9nX2xldmVsID0gYW5kcm9pZF9sb2dfbGV2ZWxzW2xldmVsXTsKKyAgOjpzdGQ6Om9zdHJpbmdzdHJlYW0gb3N0cjsKKyAgb3N0ciA8PCAiW2xpYnByb3RvYnVmICIgPDwgbGV2ZWxfbmFtZXNbbGV2ZWxdIDw8ICIgIiA8PCBmaWxlbmFtZSA8PCAiOiIKKyAgICAgICA8PCBsaW5lIDw8ICJdICIgPDwgbWVzc2FnZS5jX3N0cigpOworCisgIC8vIE91dHB1dCB0aGUgbG9nIHN0cmluZyB0aGUgQW5kcm9pZCBsb2cgYXQgdGhlIGFwcHJvcHJpYXRlIGxldmVsLgorICBfX2FuZHJvaWRfbG9nX3dyaXRlKGFuZHJvaWRfbG9nX2xldmVsLCAibGlicHJvdG9idWYtbmF0aXZlIiwKKyAgICAgICAgICAgICAgICAgICAgICBvc3RyLnN0cigpLmNfc3RyKCkpOworICAvLyBBbHNvIG91dHB1dCB0byBzdGQ6OmNlcnIuCisgIGZwcmludGYoc3RkZXJyLCAiJXMiLCBvc3RyLnN0cigpLmNfc3RyKCkpOworICBmZmx1c2goc3RkZXJyKTsKKworICAvLyBJbmRpY2F0ZSB0ZXJtaW5hdGlvbiBpZiBuZWVkZWQuCisgIGlmIChhbmRyb2lkX2xvZ19sZXZlbCA9PSBBTkRST0lEX0xPR19GQVRBTCkgeworICAgIF9fYW5kcm9pZF9sb2dfd3JpdGUoQU5EUk9JRF9MT0dfRkFUQUwsICJsaWJwcm90b2J1Zi1uYXRpdmUiLAorICAgICAgICAgICAgICAgICAgICAgICAgInRlcm1pbmF0aW5nLlxuIik7CisgIH0KKyNlbmRpZgorfQorI2Vsc2UKIHZvaWQgRGVmYXVsdExvZ0hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7CiAgIHN0YXRpYyBjb25zdCBjaGFyKiBsZXZlbF9uYW1lc1tdID0geyAiSU5GTyIsICJXQVJOSU5HIiwgIkVSUk9SIiwgIkZBVEFMIiB9OwpAQCAtMTIzLDE4ICsxNjQsMTkgQEAKICAgLy8gV2UgdXNlIGZwcmludGYoKSBpbnN0ZWFkIG9mIGNlcnIgYmVjYXVzZSB3ZSB3YW50IHRoaXMgdG8gd29yayBhdCBzdGF0aWMKICAgLy8gaW5pdGlhbGl6YXRpb24gdGltZS4KICNpZm5kZWYgU1RBUkJPQVJECi0gIGZwcmludGYoc3RkZXJyLCAibGlicHJvdG9idWYgJXMgJXM6JWRdICVzXG4iLAorICBmcHJpbnRmKHN0ZGVyciwgIltsaWJwcm90b2J1ZiAlcyAlczolZF0gJXNcbiIsCiAgICAgICAgICAgbGV2ZWxfbmFtZXNbbGV2ZWxdLCBmaWxlbmFtZSwgbGluZSwgbWVzc2FnZS5jX3N0cigpKTsKICNlbHNlCi0gIFNiTG9nUmF3Rm9ybWF0RigibGlicHJvdG9idWYgJXMgJXM6JWRdICVzXG4iLCBsZXZlbF9uYW1lc1tsZXZlbF0sIGZpbGVuYW1lLAorICBTYkxvZ1Jhd0Zvcm1hdEYoIltsaWJwcm90b2J1ZiAlcyAlczolZF0gJXNcbiIsIGxldmVsX25hbWVzW2xldmVsXSwgZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICBsaW5lLCBtZXNzYWdlLmNfc3RyKCkpOwogI2VuZGlmICAvLyBTVEFSQk9BUkQKIAogICBmZmx1c2goc3RkZXJyKTsgIC8vIE5lZWRlZCBvbiBNU1ZDLgogfQorI2VuZGlmCiAKLXZvaWQgTnVsbExvZ0hhbmRsZXIoTG9nTGV2ZWwgbGV2ZWwsIGNvbnN0IGNoYXIqIGZpbGVuYW1lLCBpbnQgbGluZSwKLSAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBtZXNzYWdlKSB7Cit2b2lkIE51bGxMb2dIYW5kbGVyKExvZ0xldmVsIC8qIGxldmVsICovLCBjb25zdCBjaGFyKiAvKiBmaWxlbmFtZSAqLywKKyAgICAgICAgICAgICAgICAgICAgaW50IC8qIGxpbmUgKi8sIGNvbnN0IHN0cmluZyYgLyogbWVzc2FnZSAqLykgewogICAvLyBOb3RoaW5nLgogfQogCkBAIC0xNjYsNiArMjA4LDI0IEBACiAgIHJldHVybiAqdGhpczsKIH0KIAorTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjb25zdCBTdHJpbmdQaWVjZSYgdmFsdWUpIHsKKyAgbWVzc2FnZV8gKz0gdmFsdWUuVG9TdHJpbmcoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCitMb2dNZXNzYWdlJiBMb2dNZXNzYWdlOjpvcGVyYXRvcjw8KAorICAgIGNvbnN0IDo6Z29vZ2xlOjpwcm90b2J1Zjo6dXRpbDo6U3RhdHVzJiBzdGF0dXMpIHsKKyAgbWVzc2FnZV8gKz0gc3RhdHVzLlRvU3RyaW5nKCk7CisgIHJldHVybiAqdGhpczsKK30KKworTG9nTWVzc2FnZSYgTG9nTWVzc2FnZTo6b3BlcmF0b3I8PChjb25zdCB1aW50MTI4JiB2YWx1ZSkgeworICBzdGQ6Om9zdHJpbmdzdHJlYW0gc3RyOworICBzdHIgPDwgdmFsdWU7CisgIG1lc3NhZ2VfICs9IHN0ci5zdHIoKTsKKyAgcmV0dXJuICp0aGlzOworfQorCiAvLyBTaW5jZSB0aGlzIGlzIGp1c3QgZm9yIGxvZ2dpbmcsIHdlIGRvbid0IGNhcmUgaWYgdGhlIGN1cnJlbnQgbG9jYWxlIGNoYW5nZXMKIC8vIHRoZSByZXN1bHRzIC0tIGluIGZhY3QsIHdlIHByb2JhYmx5IHByZWZlciB0aGF0LiAgU28gd2UgdXNlIHNucHJpbnRmKCkKIC8vIGluc3RlYWQgb2YgU2ltcGxlKnRvYSgpLgpAQCAtMTg1LDEwICsyNDUsMTMgQEAKIAogREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IoY2hhciAgICAgICAgICwgIiVjIiApCiBERUNMQVJFX1NUUkVBTV9PUEVSQVRPUihpbnQgICAgICAgICAgLCAiJWQiICkKLURFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKHVpbnQgICAgICAgICAsICIldSIgKQorREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IodW5zaWduZWQgaW50ICwgIiV1IiApCiBERUNMQVJFX1NUUkVBTV9PUEVSQVRPUihsb25nICAgICAgICAgLCAiJWxkIikKIERFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKHVuc2lnbmVkIGxvbmcsICIlbHUiKQogREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IoZG91YmxlICAgICAgICwgIiVnIiApCitERUNMQVJFX1NUUkVBTV9PUEVSQVRPUih2b2lkKiAgICAgICAgLCAiJXAiICkKK0RFQ0xBUkVfU1RSRUFNX09QRVJBVE9SKGxvbmcgbG9uZyAgICAgICAgICwgIiUiIEdPT0dMRV9MTF9GT1JNQVQgImQiKQorREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IodW5zaWduZWQgbG9uZyBsb25nLCAiJSIgR09PR0xFX0xMX0ZPUk1BVCAidSIpCiAjdW5kZWYgREVDTEFSRV9TVFJFQU1fT1BFUkFUT1IKIAogTG9nTWVzc2FnZTo6TG9nTWVzc2FnZShMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lKQpAQCAtMjAxLDE1ICsyNjQsMTUgQEAKICAgaWYgKGxldmVsXyAhPSBMT0dMRVZFTF9GQVRBTCkgewogICAgIEluaXRMb2dTaWxlbmNlckNvdW50T25jZSgpOwogICAgIE11dGV4TG9jayBsb2NrKGxvZ19zaWxlbmNlcl9jb3VudF9tdXRleF8pOwotICAgIHN1cHByZXNzID0gaW50ZXJuYWw6OmxvZ19zaWxlbmNlcl9jb3VudF8gPiAwOworICAgIHN1cHByZXNzID0gbG9nX3NpbGVuY2VyX2NvdW50XyA+IDA7CiAgIH0KIAogICBpZiAoIXN1cHByZXNzKSB7Ci0gICAgaW50ZXJuYWw6OmxvZ19oYW5kbGVyXyhsZXZlbF8sIGZpbGVuYW1lXywgbGluZV8sIG1lc3NhZ2VfKTsKKyAgICBsb2dfaGFuZGxlcl8obGV2ZWxfLCBmaWxlbmFtZV8sIGxpbmVfLCBtZXNzYWdlXyk7CiAgIH0KIAogICBpZiAobGV2ZWxfID09IExPR0xFVkVMX0ZBVEFMKSB7Ci0jaWZkZWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKKyNpZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUwogICAgIHRocm93IEZhdGFsRXhjZXB0aW9uKGZpbGVuYW1lXywgbGluZV8sIG1lc3NhZ2VfKTsKICNlbHNlCiAgICAgYWJvcnQoKTsKQEAgLTM2OSw2ICs0MzIsMjQgQEAKICNlbmRpZgogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBlbXVsYXRlcyBnb29nbGUzL3V0aWwvZW5kaWFuL2VuZGlhbi5oCisvLworLy8gVE9ETyh4aWFvZmVuZyk6IFBST1RPQlVGX0xJVFRMRV9FTkRJQU4gaXMgdW5mb3J0dW5hdGVseSBkZWZpbmVkIGluCisvLyBnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmggYW5kIHRoZXJlZm9yZSBjYW4gbm90IGJlIHVzZWQgaGVyZS4KKy8vIE1heWJlIG1vdmUgdGhhdCBtYWNybyBkZWZpbml0aW9uIGhlcmUgaW4gdGhlIGZ1cnR1cmUuCit1aW50MzIgZ2h0b25sKHVpbnQzMiB4KSB7CisgIHVuaW9uIHsKKyAgICB1aW50MzIgcmVzdWx0OworICAgIHVpbnQ4IHJlc3VsdF9hcnJheVs0XTsKKyAgfTsKKyAgcmVzdWx0X2FycmF5WzBdID0gc3RhdGljX2Nhc3Q8dWludDg+KHggPj4gMjQpOworICByZXN1bHRfYXJyYXlbMV0gPSBzdGF0aWNfY2FzdDx1aW50OD4oKHggPj4gMTYpICYgMHhGRik7CisgIHJlc3VsdF9hcnJheVsyXSA9IHN0YXRpY19jYXN0PHVpbnQ4PigoeCA+PiA4KSAmIDB4RkYpOworICByZXN1bHRfYXJyYXlbM10gPSBzdGF0aWNfY2FzdDx1aW50OD4oeCAmIDB4RkYpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBTaHV0ZG93biBzdXBwb3J0LgogCiBuYW1lc3BhY2UgaW50ZXJuYWwgewpAQCAtNDE0LDcgKzQ5NSw3IEBACiAgIGludGVybmFsOjpzaHV0ZG93bl9mdW5jdGlvbnNfbXV0ZXggPSBOVUxMOwogfQogCi0jaWZkZWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKKyNpZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUwogRmF0YWxFeGNlcHRpb246On5GYXRhbEV4Y2VwdGlvbigpIHRocm93KCkge30KIAogY29uc3QgY2hhciogRmF0YWxFeGNlcHRpb246OndoYXQoKSBjb25zdCB0aHJvdygpIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKaW5kZXggYzJmZDE3NC4uOWMwNWNhYyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM1LDMyICszNSwzOCBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfQ09NTU9OX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQ09NTU9OX0hfXwogCi0jaW5jbHVkZSA8YXNzZXJ0Lmg+CiAjaW5jbHVkZSA8c3RyaW5nPgogCi0jaWZuZGVmIFNUQVJCT0FSRAotI2luY2x1ZGUgPHN0ZGxpYi5oPgotI2luY2x1ZGUgPGNzdGRkZWY+Ci0jaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaWYgZGVmaW5lZChfX29zZl9fKQotLy8gVHJ1NjQgbGFja3Mgc3RkaW50LmgsIGJ1dCBoYXMgaW50dHlwZXMuaCB3aGljaCBkZWZpbmVzIGEgc3VwZXJzZXQgb2YKLS8vIHdoYXQgc3RkaW50Lmggd291bGQgZGVmaW5lLgotI2luY2x1ZGUgPGludHR5cGVzLmg+Ci0jZWxpZiAhZGVmaW5lZChfTVNDX1ZFUikKLSNpbmNsdWRlIDxzdGRpbnQuaD4KLSNlbmRpZgotI2Vsc2UKLSNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKLSNlbmRpZiAgLy8gU1RBUkJPQVJECisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BvcnQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbWFjcm9zLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3BsYXRmb3JtX21hY3Jvcy5oPgogCisvLyBUT0RPKGxpdWppc2kpOiBSZW1vdmUgdGhlIGZvbGxvd2luZyBpbmNsdWRlcyBhZnRlciB0aGUgaW5jbHVkZSBjbGVhbi11cC4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zY29wZWRfcHRyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmg+CisKKyNpZm5kZWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKICNpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiBkZWZpbmVkKF9DUFBVTldJTkQpCi0gICNkZWZpbmUgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKKyAgI2RlZmluZSBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUyAxCiAjZWxpZiBkZWZpbmVkKF9fRVhDRVBUSU9OUykKLSAgI2RlZmluZSBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUworICAjZGVmaW5lIFBST1RPQlVGX1VTRV9FWENFUFRJT05TIDEKKyNlbHNlCisgICNkZWZpbmUgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMgMAogI2VuZGlmCi0jaWZkZWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKKyNlbmRpZgorCisjaWYgUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMKICNpbmNsdWRlIDxleGNlcHRpb24+CiAjZW5kaWYKKyNpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyNpbmNsdWRlIDxUYXJnZXRDb25kaXRpb25hbHMuaD4gIC8vIGZvciBUQVJHRVRfT1NfSVBIT05FCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19BTkRST0lEX18pIHx8IGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX0FORFJPSUQpIHx8IChkZWZpbmVkKFRBUkdFVF9PU19JUEhPTkUpICYmIFRBUkdFVF9PU19JUEhPTkUpIHx8IGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX0lQSE9ORSkKKyNpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKIAogI2lmIGRlZmluZWQoX1dJTjMyKSAmJiBkZWZpbmVkKEdldE1lc3NhZ2UpCiAvLyBBbGxvdyBHZXRNZXNzYWdlIHRvIGJlIHVzZWQgYXMgYSB2YWxpZCBtZXRob2QgbmFtZSBpbiBwcm90b2J1ZiBjbGFzc2VzLgpAQCAtNzksMzMgKzg1LDEwIEBACiB9CiAjZW5kaWYKIAotCiBuYW1lc3BhY2Ugc3RkIHt9CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKLQotI3VuZGVmIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUwotI2RlZmluZSBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVHlwZU5hbWUpICAgIFwKLSAgVHlwZU5hbWUoY29uc3QgVHlwZU5hbWUmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IFR5cGVOYW1lJikKLQotI2lmIGRlZmluZWQoX01TQ19WRVIpICYmIGRlZmluZWQoUFJPVE9CVUZfVVNFX0RMTFMpCi0gICNpZmRlZiBMSUJQUk9UT0JVRl9FWFBPUlRTCi0gICAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQgX19kZWNsc3BlYyhkbGxleHBvcnQpCi0gICNlbHNlCi0gICAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCi0gICNlbmRpZgotICAjaWZkZWYgTElCUFJPVE9DX0VYUE9SVFMKLSAgICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKLSAgI2Vsc2UKLSAgICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQgICBfX2RlY2xzcGVjKGRsbGltcG9ydCkKLSAgI2VuZGlmCi0jZWxzZQotICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVAotICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQKLSNlbmRpZgotCiBuYW1lc3BhY2UgaW50ZXJuYWwgewogCiAvLyBTb21lIG9mIHRoZXNlIGNvbnN0YW50cyBhcmUgbWFjcm9zIHJhdGhlciB0aGFuIGNvbnN0IGludHMgc28gdGhhdCB0aGV5IGNhbgpAQCAtMTEzLDI0ICs5NiwyNCBAQAogCiAvLyBUaGUgY3VycmVudCB2ZXJzaW9uLCByZXByZXNlbnRlZCBhcyBhIHNpbmdsZSBpbnRlZ2VyIHRvIG1ha2UgY29tcGFyaXNvbgogLy8gZWFzaWVyOiAgbWFqb3IgKiAxMF42ICsgbWlub3IgKiAxMF4zICsgbWljcm8KLSNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1ZFUlNJT04gMjAwNDAwMgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiAzMDAwMDAwCiAKIC8vIFRoZSBtaW5pbXVtIGxpYnJhcnkgdmVyc2lvbiB3aGljaCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlCiAvLyBoZWFkZXJzLgotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUlOX0xJQlJBUllfVkVSU0lPTiAyMDA0MDAwCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9NSU5fTElCUkFSWV9WRVJTSU9OIDMwMDAwMDAKIAogLy8gVGhlIG1pbmltdW0gaGVhZGVyIHZlcnNpb24gd2hpY2ggd29ya3Mgd2l0aCB0aGUgY3VycmVudCB2ZXJzaW9uIG9mCiAvLyB0aGUgbGlicmFyeS4gIFRoaXMgY29uc3RhbnQgc2hvdWxkIG9ubHkgYmUgdXNlZCBieSBwcm90b2MncyBDKysgY29kZQogLy8gZ2VuZXJhdG9yLgotc3RhdGljIGNvbnN0IGludCBrTWluSGVhZGVyVmVyc2lvbkZvckxpYnJhcnkgPSAyMDA0MDAwOworc3RhdGljIGNvbnN0IGludCBrTWluSGVhZGVyVmVyc2lvbkZvckxpYnJhcnkgPSAzMDAwMDAwOwogCiAvLyBUaGUgbWluaW11bSBwcm90b2MgdmVyc2lvbiB3aGljaCB3b3JrcyB3aXRoIHRoZSBjdXJyZW50IHZlcnNpb24gb2YgdGhlCiAvLyBoZWFkZXJzLgotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUlOX1BST1RPQ19WRVJTSU9OIDIwMDQwMDAKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX01JTl9QUk9UT0NfVkVSU0lPTiAzMDAwMDAwCiAKIC8vIFRoZSBtaW5pbXVtIGhlYWRlciB2ZXJzaW9uIHdoaWNoIHdvcmtzIHdpdGggdGhlIGN1cnJlbnQgdmVyc2lvbiBvZgogLy8gcHJvdG9jLiAgVGhpcyBjb25zdGFudCBzaG91bGQgb25seSBiZSB1c2VkIGluIFZlcmlmeVZlcnNpb24oKS4KLXN0YXRpYyBjb25zdCBpbnQga01pbkhlYWRlclZlcnNpb25Gb3JQcm90b2MgPSAyMDA0MDAwOworc3RhdGljIGNvbnN0IGludCBrTWluSGVhZGVyVmVyc2lvbkZvclByb3RvYyA9IDMwMDAwMDA7CiAKIC8vIFZlcmlmaWVzIHRoYXQgdGhlIGhlYWRlcnMgYW5kIGxpYnJhcmllcyBhcmUgY29tcGF0aWJsZS4gIFVzZSB0aGUgbWFjcm8KIC8vIGJlbG93IHRvIGNhbGwgdGhpcy4KQEAgLTE1MSwxMDE2ICsxMzQsNDIgQEAKICAgICBHT09HTEVfUFJPVE9CVUZfVkVSU0lPTiwgR09PR0xFX1BST1RPQlVGX01JTl9MSUJSQVJZX1ZFUlNJT04sICAgICAgICAgXAogICAgIF9fRklMRV9fKQogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBmcm9tIGdvb2dsZTMvYmFzZS9wb3J0LmgKLQotdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKLQotI2lmZGVmIF9NU0NfVkVSCi10eXBlZGVmIF9faW50OCAgaW50ODsKLXR5cGVkZWYgX19pbnQxNiBpbnQxNjsKLXR5cGVkZWYgX19pbnQzMiBpbnQzMjsKLXR5cGVkZWYgX19pbnQ2NCBpbnQ2NDsKLQotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDggIHVpbnQ4OwotdHlwZWRlZiB1bnNpZ25lZCBfX2ludDE2IHVpbnQxNjsKLXR5cGVkZWYgdW5zaWduZWQgX19pbnQzMiB1aW50MzI7Ci10eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgdWludDY0OwotI2Vsc2UKLXR5cGVkZWYgaW50OF90ICBpbnQ4OwotdHlwZWRlZiBpbnQxNl90IGludDE2OwotdHlwZWRlZiBpbnQzMl90IGludDMyOwotdHlwZWRlZiBpbnQ2NF90IGludDY0OwotCi10eXBlZGVmIHVpbnQ4X3QgIHVpbnQ4OwotdHlwZWRlZiB1aW50MTZfdCB1aW50MTY7Ci10eXBlZGVmIHVpbnQzMl90IHVpbnQzMjsKLXR5cGVkZWYgdWludDY0X3QgdWludDY0OwotI2VuZGlmCi0KLS8vIGxvbmcgbG9uZyBtYWNyb3MgdG8gYmUgdXNlZCBiZWNhdXNlIGdjYyBhbmQgdmMrKyB1c2UgZGlmZmVyZW50IHN1ZmZpeGVzLAotLy8gYW5kIGRpZmZlcmVudCBzaXplIHNwZWNpZmllcnMgaW4gZm9ybWF0IHN0cmluZ3MKLSN1bmRlZiBHT09HTEVfTE9OR0xPTkcKLSN1bmRlZiBHT09HTEVfVUxPTkdMT05HCi0jdW5kZWYgR09PR0xFX0xMX0ZPUk1BVAotCi0jaWZkZWYgX01TQ19WRVIKLSNkZWZpbmUgR09PR0xFX0xPTkdMT05HKHgpIHgjI0k2NAotI2RlZmluZSBHT09HTEVfVUxPTkdMT05HKHgpIHgjI1VJNjQKLSNkZWZpbmUgR09PR0xFX0xMX0ZPUk1BVCAiSTY0IiAgLy8gQXMgaW4gcHJpbnRmKCIlSTY0ZCIsIC4uLikKLSNlbHNlCi0jZGVmaW5lIEdPT0dMRV9MT05HTE9ORyh4KSB4IyNMTAotI2RlZmluZSBHT09HTEVfVUxPTkdMT05HKHgpIHgjI1VMTAotI2RlZmluZSBHT09HTEVfTExfRk9STUFUICJsbCIgIC8vIEFzIGluICIlbGxkIi4gTm90ZSB0aGF0ICJxIiBpcyBwb29yIGZvcm0gYWxzby4KLSNlbmRpZgotCi1zdGF0aWMgY29uc3QgaW50MzIga2ludDMybWF4ID0gMHg3RkZGRkZGRjsKLXN0YXRpYyBjb25zdCBpbnQzMiBraW50MzJtaW4gPSAta2ludDMybWF4IC0gMTsKLXN0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtYXggPSBHT09HTEVfTE9OR0xPTkcoMHg3RkZGRkZGRkZGRkZGRkZGKTsKLXN0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtaW4gPSAta2ludDY0bWF4IC0gMTsKLXN0YXRpYyBjb25zdCB1aW50MzIga3VpbnQzMm1heCA9IDB4RkZGRkZGRkZ1Owotc3RhdGljIGNvbnN0IHVpbnQ2NCBrdWludDY0bWF4ID0gR09PR0xFX1VMT05HTE9ORygweEZGRkZGRkZGRkZGRkZGRkYpOwotCi0vLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCi0vLyBBbm5vdGF0aW9uczogIFNvbWUgcGFydHMgb2YgdGhlIGNvZGUgaGF2ZSBiZWVuIGFubm90YXRlZCBpbiB3YXlzIHRoYXQgbWlnaHQKLS8vICAgYmUgdXNlZnVsIHRvIHNvbWUgY29tcGlsZXJzIG9yIHRvb2xzLCBidXQgYXJlIG5vdCBzdXBwb3J0ZWQgdW5pdmVyc2FsbHkuCi0vLyAgIFlvdSBjYW4gI2RlZmluZSB0aGVzZSBhbm5vdGF0aW9ucyB5b3Vyc2VsZiBpZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgotLy8gICBpcyBub3QgcmlnaHQgZm9yIHlvdS4KLQotI2lmbmRlZiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKLSNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAzIHx8KF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkpCi0vLyBGb3IgZnVuY3Rpb25zIHdlIHdhbnQgdG8gZm9yY2UgaW5saW5lLgotLy8gSW50cm9kdWNlZCBpbiBnY2MgMy4xLgotI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKQotI2Vsc2UKLS8vIE90aGVyIGNvbXBpbGVycyB3aWxsIGhhdmUgdG8gZmlndXJlIGl0IG91dCBmb3IgdGhlbXNlbHZlcy4KLSNkZWZpbmUgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCi0jZW5kaWYKLSNlbmRpZgotCi0jaWZuZGVmIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAotI2lmZGVmIF9fR05VQ19fCi0vLyBJZiB0aGUgbWV0aG9kL3ZhcmlhYmxlL3R5cGUgaXMgdXNlZCBhbnl3aGVyZSwgcHJvZHVjZSBhIHdhcm5pbmcuCi0jZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKLSNlbHNlCi0jZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAotI2VuZGlmCi0jZW5kaWYKLQotI2lmbmRlZiBHT09HTEVfUFJFRElDVF9UUlVFCi0jaWZkZWYgX19HTlVDX18KLS8vIFByb3ZpZGVkIGF0IGxlYXN0IHNpbmNlIEdDQyAzLjAuCi0jZGVmaW5lIEdPT0dMRV9QUkVESUNUX1RSVUUoeCkgKF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpKQotI2Vsc2UKLSNkZWZpbmUgR09PR0xFX1BSRURJQ1RfVFJVRQotI2VuZGlmCi0jZW5kaWYKLQotLy8gRGVsaW1pdHMgYSBibG9jayBvZiBjb2RlIHdoaWNoIG1heSB3cml0ZSB0byBtZW1vcnkgd2hpY2ggaXMgc2ltdWx0YW5lb3VzbHkKLS8vIHdyaXR0ZW4gYnkgb3RoZXIgdGhyZWFkcywgYnV0IHdoaWNoIGhhcyBiZWVuIGRldGVybWluZWQgdG8gYmUgdGhyZWFkLXNhZmUKLS8vIChlLmcuIGJlY2F1c2UgaXQgaXMgYW4gaWRlbXBvdGVudCB3cml0ZSkuCi0jaWZuZGVmIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOCi0jZGVmaW5lIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0JFR0lOKCkKLSNlbmRpZgotI2lmbmRlZiBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19FTkQKLSNkZWZpbmUgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5EKCkKLSNlbmRpZgogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBmcm9tIGdvb2dsZTMvYmFzZS9iYXNpY3R5cGVzLmgKKy8vIGZyb20gZ29vZ2xlMy91dGlsL3V0ZjgvcHVibGljL3VuaWxpYi5oCiAKLS8vIFRoZSBHT09HTEVfQVJSQVlTSVpFKGFycikgbWFjcm8gcmV0dXJucyB0aGUgIyBvZiBlbGVtZW50cyBpbiBhbiBhcnJheSBhcnIuCi0vLyBUaGUgZXhwcmVzc2lvbiBpcyBhIGNvbXBpbGUtdGltZSBjb25zdGFudCwgYW5kIHRoZXJlZm9yZSBjYW4gYmUKLS8vIHVzZWQgaW4gZGVmaW5pbmcgbmV3IGFycmF5cywgZm9yIGV4YW1wbGUuCi0vLwotLy8gR09PR0xFX0FSUkFZU0laRSBjYXRjaGVzIGEgZmV3IHR5cGUgZXJyb3JzLiAgSWYgeW91IHNlZSBhIGNvbXBpbGVyIGVycm9yCi0vLwotLy8gICAid2FybmluZzogZGl2aXNpb24gYnkgemVybyBpbiAuLi4iCi0vLwotLy8gd2hlbiB1c2luZyBHT09HTEVfQVJSQVlTSVpFLCB5b3UgYXJlICh3cm9uZ2Z1bGx5KSBnaXZpbmcgaXQgYSBwb2ludGVyLgotLy8gWW91IHNob3VsZCBvbmx5IHVzZSBHT09HTEVfQVJSQVlTSVpFIG9uIHN0YXRpY2FsbHkgYWxsb2NhdGVkIGFycmF5cy4KLS8vCi0vLyBUaGUgZm9sbG93aW5nIGNvbW1lbnRzIGFyZSBvbiB0aGUgaW1wbGVtZW50YXRpb24gZGV0YWlscywgYW5kIGNhbgotLy8gYmUgaWdub3JlZCBieSB0aGUgdXNlcnMuCi0vLwotLy8gQVJSQVlTSVpFKGFycikgd29ya3MgYnkgaW5zcGVjdGluZyBzaXplb2YoYXJyKSAodGhlICMgb2YgYnl0ZXMgaW4KLS8vIHRoZSBhcnJheSkgYW5kIHNpemVvZigqKGFycikpICh0aGUgIyBvZiBieXRlcyBpbiBvbmUgYXJyYXkKLS8vIGVsZW1lbnQpLiAgSWYgdGhlIGZvcm1lciBpcyBkaXZpc2libGUgYnkgdGhlIGxhdHRlciwgcGVyaGFwcyBhcnIgaXMKLS8vIGluZGVlZCBhbiBhcnJheSwgaW4gd2hpY2ggY2FzZSB0aGUgZGl2aXNpb24gcmVzdWx0IGlzIHRoZSAjIG9mCi0vLyBlbGVtZW50cyBpbiB0aGUgYXJyYXkuICBPdGhlcndpc2UsIGFyciBjYW5ub3QgcG9zc2libHkgYmUgYW4gYXJyYXksCi0vLyBhbmQgd2UgZ2VuZXJhdGUgYSBjb21waWxlciBlcnJvciB0byBwcmV2ZW50IHRoZSBjb2RlIGZyb20KLS8vIGNvbXBpbGluZy4KLS8vCi0vLyBTaW5jZSB0aGUgc2l6ZSBvZiBib29sIGlzIGltcGxlbWVudGF0aW9uLWRlZmluZWQsIHdlIG5lZWQgdG8gY2FzdAotLy8gIShzaXplb2YoYSkgJiBzaXplb2YoKihhKSkpIHRvIHNpemVfdCBpbiBvcmRlciB0byBlbnN1cmUgdGhlIGZpbmFsCi0vLyByZXN1bHQgaGFzIHR5cGUgc2l6ZV90LgotLy8KLS8vIFRoaXMgbWFjcm8gaXMgbm90IHBlcmZlY3QgYXMgaXQgd3JvbmdmdWxseSBhY2NlcHRzIGNlcnRhaW4KLS8vIHBvaW50ZXJzLCBuYW1lbHkgd2hlcmUgdGhlIHBvaW50ZXIgc2l6ZSBpcyBkaXZpc2libGUgYnkgdGhlIHBvaW50ZWUKLS8vIHNpemUuICBTaW5jZSBhbGwgb3VyIGNvZGUgaGFzIHRvIGdvIHRocm91Z2ggYSAzMi1iaXQgY29tcGlsZXIsCi0vLyB3aGVyZSBhIHBvaW50ZXIgaXMgNCBieXRlcywgdGhpcyBtZWFucyBhbGwgcG9pbnRlcnMgdG8gYSB0eXBlIHdob3NlCi0vLyBzaXplIGlzIDMgb3IgZ3JlYXRlciB0aGFuIDQgd2lsbCBiZSAocmlnaHRlb3VzbHkpIHJlamVjdGVkLgotLy8KLS8vIEt1ZG9zIHRvIEpvcmcgQnJvd24gZm9yIHRoaXMgc2ltcGxlIGFuZCBlbGVnYW50IGltcGxlbWVudGF0aW9uLgotCi0jdW5kZWYgR09PR0xFX0FSUkFZU0laRQotI2RlZmluZSBHT09HTEVfQVJSQVlTSVpFKGEpIFwKLSAgKChzaXplb2YoYSkgLyBzaXplb2YoKihhKSkpIC8gXAotICAgc3RhdGljX2Nhc3Q8c2l6ZV90PighKHNpemVvZihhKSAlIHNpemVvZigqKGEpKSkpKQotCitjbGFzcyBTdHJpbmdQaWVjZTsKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CiAKLS8vIFVzZSBpbXBsaWNpdF9jYXN0IGFzIGEgc2FmZSB2ZXJzaW9uIG9mIHN0YXRpY19jYXN0IG9yIGNvbnN0X2Nhc3QKLS8vIGZvciB1cGNhc3RpbmcgaW4gdGhlIHR5cGUgaGllcmFyY2h5IChpLmUuIGNhc3RpbmcgYSBwb2ludGVyIHRvIEZvbwotLy8gdG8gYSBwb2ludGVyIHRvIFN1cGVyY2xhc3NPZkZvbyBvciBjYXN0aW5nIGEgcG9pbnRlciB0byBGb28gdG8KLS8vIGEgY29uc3QgcG9pbnRlciB0byBGb28pLgotLy8gV2hlbiB5b3UgdXNlIGltcGxpY2l0X2Nhc3QsIHRoZSBjb21waWxlciBjaGVja3MgdGhhdCB0aGUgY2FzdCBpcyBzYWZlLgotLy8gU3VjaCBleHBsaWNpdCBpbXBsaWNpdF9jYXN0cyBhcmUgbmVjZXNzYXJ5IGluIHN1cnByaXNpbmdseSBtYW55Ci0vLyBzaXR1YXRpb25zIHdoZXJlIEMrKyBkZW1hbmRzIGFuIGV4YWN0IHR5cGUgbWF0Y2ggaW5zdGVhZCBvZiBhbgotLy8gYXJndW1lbnQgdHlwZSBjb252ZXJ0YWJsZSB0byBhIHRhcmdldCB0eXBlLgotLy8KLS8vIFRoZSBGcm9tIHR5cGUgY2FuIGJlIGluZmVycmVkLCBzbyB0aGUgcHJlZmVycmVkIHN5bnRheCBmb3IgdXNpbmcKLS8vIGltcGxpY2l0X2Nhc3QgaXMgdGhlIHNhbWUgYXMgZm9yIHN0YXRpY19jYXN0IGV0Yy46Ci0vLwotLy8gICBpbXBsaWNpdF9jYXN0PFRvVHlwZT4oZXhwcikKLS8vCi0vLyBpbXBsaWNpdF9jYXN0IHdvdWxkIGhhdmUgYmVlbiBwYXJ0IG9mIHRoZSBDKysgc3RhbmRhcmQgbGlicmFyeSwKLS8vIGJ1dCB0aGUgcHJvcG9zYWwgd2FzIHN1Ym1pdHRlZCB0b28gbGF0ZS4gIEl0IHdpbGwgcHJvYmFibHkgbWFrZQotLy8gaXRzIHdheSBpbnRvIHRoZSBsYW5ndWFnZSBpbiB0aGUgZnV0dXJlLgotdGVtcGxhdGU8dHlwZW5hbWUgVG8sIHR5cGVuYW1lIEZyb20+Ci1pbmxpbmUgVG8gaW1wbGljaXRfY2FzdChGcm9tIGNvbnN0ICZmKSB7Ci0gIHJldHVybiBmOwotfQotCi0vLyBXaGVuIHlvdSB1cGNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20gdHlwZSBGb28gdG8gdHlwZQotLy8gU3VwZXJjbGFzc09mRm9vKSwgaXQncyBmaW5lIHRvIHVzZSBpbXBsaWNpdF9jYXN0PD4sIHNpbmNlIHVwY2FzdHMKLS8vIGFsd2F5cyBzdWNjZWVkLiAgV2hlbiB5b3UgZG93bmNhc3QgKHRoYXQgaXMsIGNhc3QgYSBwb2ludGVyIGZyb20KLS8vIHR5cGUgRm9vIHRvIHR5cGUgU3ViY2xhc3NPZkZvbyksIHN0YXRpY19jYXN0PD4gaXNuJ3Qgc2FmZSwgYmVjYXVzZQotLy8gaG93IGRvIHlvdSBrbm93IHRoZSBwb2ludGVyIGlzIHJlYWxseSBvZiB0eXBlIFN1YmNsYXNzT2ZGb28/ICBJdAotLy8gY291bGQgYmUgYSBiYXJlIEZvbywgb3Igb2YgdHlwZSBEaWZmZXJlbnRTdWJjbGFzc09mRm9vLiAgVGh1cywKLS8vIHdoZW4geW91IGRvd25jYXN0LCB5b3Ugc2hvdWxkIHVzZSB0aGlzIG1hY3JvLiAgSW4gZGVidWcgbW9kZSwgd2UKLS8vIHVzZSBkeW5hbWljX2Nhc3Q8PiB0byBkb3VibGUtY2hlY2sgdGhlIGRvd25jYXN0IGlzIGxlZ2FsICh3ZSBkaWUKLS8vIGlmIGl0J3Mgbm90KS4gIEluIG5vcm1hbCBtb2RlLCB3ZSBkbyB0aGUgZWZmaWNpZW50IHN0YXRpY19jYXN0PD4KLS8vIGluc3RlYWQuICBUaHVzLCBpdCdzIGltcG9ydGFudCB0byB0ZXN0IGluIGRlYnVnIG1vZGUgdG8gbWFrZSBzdXJlCi0vLyB0aGUgY2FzdCBpcyBsZWdhbCEKLS8vICAgIFRoaXMgaXMgdGhlIG9ubHkgcGxhY2UgaW4gdGhlIGNvZGUgd2Ugc2hvdWxkIHVzZSBkeW5hbWljX2Nhc3Q8Pi4KLS8vIEluIHBhcnRpY3VsYXIsIHlvdSBTSE9VTEROJ1QgYmUgdXNpbmcgZHluYW1pY19jYXN0PD4gaW4gb3JkZXIgdG8KLS8vIGRvIFJUVEkgKGVnIGNvZGUgbGlrZSB0aGlzOgotLy8gICAgaWYgKGR5bmFtaWNfY2FzdDxTdWJjbGFzczE+KGZvbykpIEhhbmRsZUFTdWJjbGFzczFPYmplY3QoZm9vKTsKLS8vICAgIGlmIChkeW5hbWljX2Nhc3Q8U3ViY2xhc3MyPihmb28pKSBIYW5kbGVBU3ViY2xhc3MyT2JqZWN0KGZvbyk7Ci0vLyBZb3Ugc2hvdWxkIGRlc2lnbiB0aGUgY29kZSBzb21lIG90aGVyIHdheSBub3QgdG8gbmVlZCB0aGlzLgotCi10ZW1wbGF0ZTx0eXBlbmFtZSBUbywgdHlwZW5hbWUgRnJvbT4gICAgIC8vIHVzZSBsaWtlIHRoaXM6IGRvd25fY2FzdDxUKj4oZm9vKTsKLWlubGluZSBUbyBkb3duX2Nhc3QoRnJvbSogZikgeyAgICAgICAgICAgICAgICAgICAvLyBzbyB3ZSBvbmx5IGFjY2VwdCBwb2ludGVycwotICAvLyBFbnN1cmVzIHRoYXQgVG8gaXMgYSBzdWItdHlwZSBvZiBGcm9tICouICBUaGlzIHRlc3QgaXMgaGVyZSBvbmx5Ci0gIC8vIGZvciBjb21waWxlLXRpbWUgdHlwZSBjaGVja2luZywgYW5kIGhhcyBubyBvdmVyaGVhZCBpbiBhbgotICAvLyBvcHRpbWl6ZWQgYnVpbGQgYXQgcnVuLXRpbWUsIGFzIGl0IHdpbGwgYmUgb3B0aW1pemVkIGF3YXkKLSAgLy8gY29tcGxldGVseS4KLSAgaWYgKGZhbHNlKSB7Ci0gICAgaW1wbGljaXRfY2FzdDxGcm9tKiwgVG8+KDApOwotICB9Ci0KLSNpZiAhZGVmaW5lZChOREVCVUcpICYmICFkZWZpbmVkKEdPT0dMRV9QUk9UT0JVRl9OT19SVFRJKQotICBhc3NlcnQoZiA9PSBOVUxMIHx8IGR5bmFtaWNfY2FzdDxUbz4oZikgIT0gTlVMTCk7ICAvLyBSVFRJOiBkZWJ1ZyBtb2RlIG9ubHkhCi0jZW5kaWYKLSAgcmV0dXJuIHN0YXRpY19jYXN0PFRvPihmKTsKLX0KLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKLS8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCi11c2luZyBpbnRlcm5hbDo6aW1wbGljaXRfY2FzdDsKLXVzaW5nIGludGVybmFsOjpkb3duX2Nhc3Q7Ci0KLS8vIFRoZSBDT01QSUxFX0FTU0VSVCBtYWNybyBjYW4gYmUgdXNlZCB0byB2ZXJpZnkgdGhhdCBhIGNvbXBpbGUgdGltZQotLy8gZXhwcmVzc2lvbiBpcyB0cnVlLiBGb3IgZXhhbXBsZSwgeW91IGNvdWxkIHVzZSBpdCB0byB2ZXJpZnkgdGhlCi0vLyBzaXplIG9mIGEgc3RhdGljIGFycmF5OgotLy8KLS8vICAgQ09NUElMRV9BU1NFUlQoQVJSQVlTSVpFKGNvbnRlbnRfdHlwZV9uYW1lcykgPT0gQ09OVEVOVF9OVU1fVFlQRVMsCi0vLyAgICAgICAgICAgICAgICAgIGNvbnRlbnRfdHlwZV9uYW1lc19pbmNvcnJlY3Rfc2l6ZSk7Ci0vLwotLy8gb3IgdG8gbWFrZSBzdXJlIGEgc3RydWN0IGlzIHNtYWxsZXIgdGhhbiBhIGNlcnRhaW4gc2l6ZToKLS8vCi0vLyAgIENPTVBJTEVfQVNTRVJUKHNpemVvZihmb28pIDwgMTI4LCBmb29fdG9vX2xhcmdlKTsKLS8vCi0vLyBUaGUgc2Vjb25kIGFyZ3VtZW50IHRvIHRoZSBtYWNybyBpcyB0aGUgbmFtZSBvZiB0aGUgdmFyaWFibGUuIElmCi0vLyB0aGUgZXhwcmVzc2lvbiBpcyBmYWxzZSwgbW9zdCBjb21waWxlcnMgd2lsbCBpc3N1ZSBhIHdhcm5pbmcvZXJyb3IKLS8vIGNvbnRhaW5pbmcgdGhlIG5hbWUgb2YgdGhlIHZhcmlhYmxlLgotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi10ZW1wbGF0ZSA8Ym9vbD4KLXN0cnVjdCBDb21waWxlQXNzZXJ0IHsKLX07Ci0KLX0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAotCi0jdW5kZWYgR09PR0xFX0NPTVBJTEVfQVNTRVJUCi0jZGVmaW5lIEdPT0dMRV9DT01QSUxFX0FTU0VSVChleHByLCBtc2cpIFwKLSAgdHlwZWRlZiA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4gXAotICAgICAgICAgIG1zZ1tib29sKGV4cHIpID8gMSA6IC0xXQotCi0KLS8vIEltcGxlbWVudGF0aW9uIGRldGFpbHMgb2YgQ09NUElMRV9BU1NFUlQ6Ci0vLwotLy8gLSBDT01QSUxFX0FTU0VSVCB3b3JrcyBieSBkZWZpbmluZyBhbiBhcnJheSB0eXBlIHRoYXQgaGFzIC0xCi0vLyAgIGVsZW1lbnRzIChhbmQgdGh1cyBpcyBpbnZhbGlkKSB3aGVuIHRoZSBleHByZXNzaW9uIGlzIGZhbHNlLgotLy8KLS8vIC0gVGhlIHNpbXBsZXIgZGVmaW5pdGlvbgotLy8KLS8vICAgICAjZGVmaW5lIENPTVBJTEVfQVNTRVJUKGV4cHIsIG1zZykgdHlwZWRlZiBjaGFyIG1zZ1soZXhwcikgPyAxIDogLTFdCi0vLwotLy8gICBkb2VzIG5vdCB3b3JrLCBhcyBnY2Mgc3VwcG9ydHMgdmFyaWFibGUtbGVuZ3RoIGFycmF5cyB3aG9zZSBzaXplcwotLy8gICBhcmUgZGV0ZXJtaW5lZCBhdCBydW4tdGltZSAodGhpcyBpcyBnY2MncyBleHRlbnNpb24gYW5kIG5vdCBwYXJ0Ci0vLyAgIG9mIHRoZSBDKysgc3RhbmRhcmQpLiAgQXMgYSByZXN1bHQsIGdjYyBmYWlscyB0byByZWplY3QgdGhlCi0vLyAgIGZvbGxvd2luZyBjb2RlIHdpdGggdGhlIHNpbXBsZSBkZWZpbml0aW9uOgotLy8KLS8vICAgICBpbnQgZm9vOwotLy8gICAgIENPTVBJTEVfQVNTRVJUKGZvbywgbXNnKTsgLy8gbm90IHN1cHBvc2VkIHRvIGNvbXBpbGUgYXMgZm9vIGlzCi0vLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3QgYSBjb21waWxlLXRpbWUgY29uc3RhbnQuCi0vLwotLy8gLSBCeSB1c2luZyB0aGUgdHlwZSBDb21waWxlQXNzZXJ0PChib29sKGV4cHIpKT4sIHdlIGVuc3VyZXMgdGhhdAotLy8gICBleHByIGlzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LiAgKFRlbXBsYXRlIGFyZ3VtZW50cyBtdXN0IGJlCi0vLyAgIGRldGVybWluZWQgYXQgY29tcGlsZS10aW1lLikKLS8vCi0vLyAtIFRoZSBvdXR0ZXIgcGFyZW50aGVzZXMgaW4gQ29tcGlsZUFzc2VydDwoYm9vbChleHByKSk+IGFyZSBuZWNlc3NhcnkKLS8vICAgdG8gd29yayBhcm91bmQgYSBidWcgaW4gZ2NjIDMuNC40IGFuZCA0LjAuMS4gIElmIHdlIGhhZCB3cml0dGVuCi0vLwotLy8gICAgIENvbXBpbGVBc3NlcnQ8Ym9vbChleHByKT4KLS8vCi0vLyAgIGluc3RlYWQsIHRoZXNlIGNvbXBpbGVycyB3aWxsIHJlZnVzZSB0byBjb21waWxlCi0vLwotLy8gICAgIENPTVBJTEVfQVNTRVJUKDUgPiAwLCBzb21lX21lc3NhZ2UpOwotLy8KLS8vICAgKFRoZXkgc2VlbSB0byB0aGluayB0aGUgIj4iIGluICI1ID4gMCIgbWFya3MgdGhlIGVuZCBvZiB0aGUKLS8vICAgdGVtcGxhdGUgYXJndW1lbnQgbGlzdC4pCi0vLwotLy8gLSBUaGUgYXJyYXkgc2l6ZSBpcyAoYm9vbChleHByKSA/IDEgOiAtMSksIGluc3RlYWQgb2Ygc2ltcGx5Ci0vLwotLy8gICAgICgoZXhwcikgPyAxIDogLTEpLgotLy8KLS8vICAgVGhpcyBpcyB0byBhdm9pZCBydW5uaW5nIGludG8gYSBidWcgaW4gTVMgVkMgNy4xLCB3aGljaAotLy8gICBjYXVzZXMgKCgwLjApID8gMSA6IC0xKSB0byBpbmNvcnJlY3RseSBldmFsdWF0ZSB0byAxLgotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0vLyBmcm9tIGdvb2dsZTMvYmFzZS9tZW1vcnkvc2NvcGVkX3B0ci5oCi0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLS8vICBUaGlzIGlzIGFuIGltcGxlbWVudGF0aW9uIGRlc2lnbmVkIHRvIG1hdGNoIHRoZSBhbnRpY2lwYXRlZCBmdXR1cmUgVFIyCi0vLyAgaW1wbGVtZW50YXRpb24gb2YgdGhlIHNjb3BlZF9wdHIgY2xhc3MsIGFuZCBpdHMgY2xvc2VseS1yZWxhdGVkIGJyZXRocmVuLAotLy8gIHNjb3BlZF9hcnJheSwgc2NvcGVkX3B0cl9tYWxsb2MsIGFuZCBtYWtlX3Njb3BlZF9wdHIuCi0KLXRlbXBsYXRlIDxjbGFzcyBDPiBjbGFzcyBzY29wZWRfcHRyOwotdGVtcGxhdGUgPGNsYXNzIEM+IGNsYXNzIHNjb3BlZF9hcnJheTsKLQotLy8gQSBzY29wZWRfcHRyPFQ+IGlzIGxpa2UgYSBUKiwgZXhjZXB0IHRoYXQgdGhlIGRlc3RydWN0b3Igb2Ygc2NvcGVkX3B0cjxUPgotLy8gYXV0b21hdGljYWxseSBkZWxldGVzIHRoZSBwb2ludGVyIGl0IGhvbGRzIChpZiBhbnkpLgotLy8gVGhhdCBpcywgc2NvcGVkX3B0cjxUPiBvd25zIHRoZSBUIG9iamVjdCB0aGF0IGl0IHBvaW50cyB0by4KLS8vIExpa2UgYSBUKiwgYSBzY29wZWRfcHRyPFQ+IG1heSBob2xkIGVpdGhlciBOVUxMIG9yIGEgcG9pbnRlciB0byBhIFQgb2JqZWN0LgotLy8KLS8vIFRoZSBzaXplIG9mIGEgc2NvcGVkX3B0ciBpcyBzbWFsbDoKLS8vIHNpemVvZihzY29wZWRfcHRyPEM+KSA9PSBzaXplb2YoQyopCi10ZW1wbGF0ZSA8Y2xhc3MgQz4KLWNsYXNzIHNjb3BlZF9wdHIgewotIHB1YmxpYzoKLQotICAvLyBUaGUgZWxlbWVudCB0eXBlCi0gIHR5cGVkZWYgQyBlbGVtZW50X3R5cGU7Ci0KLSAgLy8gQ29uc3RydWN0b3IuICBEZWZhdWx0cyB0byBpbnRpYWxpemluZyB3aXRoIE5VTEwuCi0gIC8vIFRoZXJlIGlzIG5vIHdheSB0byBjcmVhdGUgYW4gdW5pbml0aWFsaXplZCBzY29wZWRfcHRyLgotICAvLyBUaGUgaW5wdXQgcGFyYW1ldGVyIG11c3QgYmUgYWxsb2NhdGVkIHdpdGggbmV3LgotICBleHBsaWNpdCBzY29wZWRfcHRyKEMqIHAgPSBOVUxMKSA6IHB0cl8ocCkgeyB9Ci0KLSAgLy8gRGVzdHJ1Y3Rvci4gIElmIHRoZXJlIGlzIGEgQyBvYmplY3QsIGRlbGV0ZSBpdC4KLSAgLy8gV2UgZG9uJ3QgbmVlZCB0byB0ZXN0IHB0cl8gPT0gTlVMTCBiZWNhdXNlIEMrKyBkb2VzIHRoYXQgZm9yIHVzLgotICB+c2NvcGVkX3B0cigpIHsKLSAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07Ci0gICAgZGVsZXRlIHB0cl87Ci0gIH0KLQotICAvLyBSZXNldC4gIERlbGV0ZXMgdGhlIGN1cnJlbnQgb3duZWQgb2JqZWN0LCBpZiBhbnkuCi0gIC8vIFRoZW4gdGFrZXMgb3duZXJzaGlwIG9mIGEgbmV3IG9iamVjdCwgaWYgZ2l2ZW4uCi0gIC8vIHRoaXMtPnJlc2V0KHRoaXMtPmdldCgpKSB3b3Jrcy4KLSAgdm9pZCByZXNldChDKiBwID0gTlVMTCkgewotICAgIGlmIChwICE9IHB0cl8pIHsKLSAgICAgIGVudW0geyB0eXBlX211c3RfYmVfY29tcGxldGUgPSBzaXplb2YoQykgfTsKLSAgICAgIGRlbGV0ZSBwdHJfOwotICAgICAgcHRyXyA9IHA7Ci0gICAgfQotICB9Ci0KLSAgLy8gQWNjZXNzb3JzIHRvIGdldCB0aGUgb3duZWQgb2JqZWN0LgotICAvLyBvcGVyYXRvciogYW5kIG9wZXJhdG9yLT4gd2lsbCBhc3NlcnQoKSBpZiB0aGVyZSBpcyBubyBjdXJyZW50IG9iamVjdC4KLSAgQyYgb3BlcmF0b3IqKCkgY29uc3QgewotICAgIGFzc2VydChwdHJfICE9IE5VTEwpOwotICAgIHJldHVybiAqcHRyXzsKLSAgfQotICBDKiBvcGVyYXRvci0+KCkgY29uc3QgIHsKLSAgICBhc3NlcnQocHRyXyAhPSBOVUxMKTsKLSAgICByZXR1cm4gcHRyXzsKLSAgfQotICBDKiBnZXQoKSBjb25zdCB7IHJldHVybiBwdHJfOyB9Ci0KLSAgLy8gQ29tcGFyaXNvbiBvcGVyYXRvcnMuCi0gIC8vIFRoZXNlIHJldHVybiB3aGV0aGVyIHR3byBzY29wZWRfcHRyIHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8KLSAgLy8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgYm9vbCBvcGVyYXRvcj09KEMqIHApIGNvbnN0IHsgcmV0dXJuIHB0cl8gPT0gcDsgfQotICBib29sIG9wZXJhdG9yIT0oQyogcCkgY29uc3QgeyByZXR1cm4gcHRyXyAhPSBwOyB9Ci0KLSAgLy8gU3dhcCB0d28gc2NvcGVkIHBvaW50ZXJzLgotICB2b2lkIHN3YXAoc2NvcGVkX3B0ciYgcDIpIHsKLSAgICBDKiB0bXAgPSBwdHJfOwotICAgIHB0cl8gPSBwMi5wdHJfOwotICAgIHAyLnB0cl8gPSB0bXA7Ci0gIH0KLQotICAvLyBSZWxlYXNlIGEgcG9pbnRlci4KLSAgLy8gVGhlIHJldHVybiB2YWx1ZSBpcyB0aGUgY3VycmVudCBwb2ludGVyIGhlbGQgYnkgdGhpcyBvYmplY3QuCi0gIC8vIElmIHRoaXMgb2JqZWN0IGhvbGRzIGEgTlVMTCBwb2ludGVyLCB0aGUgcmV0dXJuIHZhbHVlIGlzIE5VTEwuCi0gIC8vIEFmdGVyIHRoaXMgb3BlcmF0aW9uLCB0aGlzIG9iamVjdCB3aWxsIGhvbGQgYSBOVUxMIHBvaW50ZXIsCi0gIC8vIGFuZCB3aWxsIG5vdCBvd24gdGhlIG9iamVjdCBhbnkgbW9yZS4KLSAgQyogcmVsZWFzZSgpIHsKLSAgICBDKiByZXRWYWwgPSBwdHJfOwotICAgIHB0cl8gPSBOVUxMOwotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEMqIHB0cl87Ci0KLSAgLy8gRm9yYmlkIGNvbXBhcmlzb24gb2Ygc2NvcGVkX3B0ciB0eXBlcy4gIElmIEMyICE9IEMsIGl0IHRvdGFsbHkgZG9lc24ndAotICAvLyBtYWtlIHNlbnNlLCBhbmQgaWYgQzIgPT0gQywgaXQgc3RpbGwgZG9lc24ndCBtYWtlIHNlbnNlIGJlY2F1c2UgeW91IHNob3VsZAotICAvLyBuZXZlciBoYXZlIHRoZSBzYW1lIG9iamVjdCBvd25lZCBieSB0d28gZGlmZmVyZW50IHNjb3BlZF9wdHJzLgotICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3I9PShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OwotICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3IhPShzY29wZWRfcHRyPEMyPiBjb25zdCYgcDIpIGNvbnN0OwotCi0gIC8vIERpc2FsbG93IGV2aWwgY29uc3RydWN0b3JzCi0gIHNjb3BlZF9wdHIoY29uc3Qgc2NvcGVkX3B0ciYpOwotICB2b2lkIG9wZXJhdG9yPShjb25zdCBzY29wZWRfcHRyJik7Ci19OwotCi0vLyBzY29wZWRfYXJyYXk8Qz4gaXMgbGlrZSBzY29wZWRfcHRyPEM+LCBleGNlcHQgdGhhdCB0aGUgY2FsbGVyIG11c3QgYWxsb2NhdGUKLS8vIHdpdGggbmV3IFtdIGFuZCB0aGUgZGVzdHJ1Y3RvciBkZWxldGVzIG9iamVjdHMgd2l0aCBkZWxldGUgW10uCi0vLwotLy8gQXMgd2l0aCBzY29wZWRfcHRyPEM+LCBhIHNjb3BlZF9hcnJheTxDPiBlaXRoZXIgcG9pbnRzIHRvIGFuIG9iamVjdAotLy8gb3IgaXMgTlVMTC4gIEEgc2NvcGVkX2FycmF5PEM+IG93bnMgdGhlIG9iamVjdCB0aGF0IGl0IHBvaW50cyB0by4KLS8vCi0vLyBTaXplOiBzaXplb2Yoc2NvcGVkX2FycmF5PEM+KSA9PSBzaXplb2YoQyopCi10ZW1wbGF0ZSA8Y2xhc3MgQz4KLWNsYXNzIHNjb3BlZF9hcnJheSB7Ci0gcHVibGljOgotCi0gIC8vIFRoZSBlbGVtZW50IHR5cGUKLSAgdHlwZWRlZiBDIGVsZW1lbnRfdHlwZTsKLQotICAvLyBDb25zdHJ1Y3Rvci4gIERlZmF1bHRzIHRvIGludGlhbGl6aW5nIHdpdGggTlVMTC4KLSAgLy8gVGhlcmUgaXMgbm8gd2F5IHRvIGNyZWF0ZSBhbiB1bmluaXRpYWxpemVkIHNjb3BlZF9hcnJheS4KLSAgLy8gVGhlIGlucHV0IHBhcmFtZXRlciBtdXN0IGJlIGFsbG9jYXRlZCB3aXRoIG5ldyBbXS4KLSAgZXhwbGljaXQgc2NvcGVkX2FycmF5KEMqIHAgPSBOVUxMKSA6IGFycmF5XyhwKSB7IH0KLQotICAvLyBEZXN0cnVjdG9yLiAgSWYgdGhlcmUgaXMgYSBDIG9iamVjdCwgZGVsZXRlIGl0LgotICAvLyBXZSBkb24ndCBuZWVkIHRvIHRlc3QgcHRyXyA9PSBOVUxMIGJlY2F1c2UgQysrIGRvZXMgdGhhdCBmb3IgdXMuCi0gIH5zY29wZWRfYXJyYXkoKSB7Ci0gICAgZW51bSB7IHR5cGVfbXVzdF9iZV9jb21wbGV0ZSA9IHNpemVvZihDKSB9OwotICAgIGRlbGV0ZVtdIGFycmF5XzsKLSAgfQotCi0gIC8vIFJlc2V0LiAgRGVsZXRlcyB0aGUgY3VycmVudCBvd25lZCBvYmplY3QsIGlmIGFueS4KLSAgLy8gVGhlbiB0YWtlcyBvd25lcnNoaXAgb2YgYSBuZXcgb2JqZWN0LCBpZiBnaXZlbi4KLSAgLy8gdGhpcy0+cmVzZXQodGhpcy0+Z2V0KCkpIHdvcmtzLgotICB2b2lkIHJlc2V0KEMqIHAgPSBOVUxMKSB7Ci0gICAgaWYgKHAgIT0gYXJyYXlfKSB7Ci0gICAgICBlbnVtIHsgdHlwZV9tdXN0X2JlX2NvbXBsZXRlID0gc2l6ZW9mKEMpIH07Ci0gICAgICBkZWxldGVbXSBhcnJheV87Ci0gICAgICBhcnJheV8gPSBwOwotICAgIH0KLSAgfQotCi0gIC8vIEdldCBvbmUgZWxlbWVudCBvZiB0aGUgY3VycmVudCBvYmplY3QuCi0gIC8vIFdpbGwgYXNzZXJ0KCkgaWYgdGhlcmUgaXMgbm8gY3VycmVudCBvYmplY3QsIG9yIGluZGV4IGkgaXMgbmVnYXRpdmUuCi0gIEMmIG9wZXJhdG9yW10oc3RkOjpwdHJkaWZmX3QgaSkgY29uc3QgewotICAgIGFzc2VydChpID49IDApOwotICAgIGFzc2VydChhcnJheV8gIT0gTlVMTCk7Ci0gICAgcmV0dXJuIGFycmF5X1tpXTsKLSAgfQotCi0gIC8vIEdldCBhIHBvaW50ZXIgdG8gdGhlIHplcm90aCBlbGVtZW50IG9mIHRoZSBjdXJyZW50IG9iamVjdC4KLSAgLy8gSWYgdGhlcmUgaXMgbm8gY3VycmVudCBvYmplY3QsIHJldHVybiBOVUxMLgotICBDKiBnZXQoKSBjb25zdCB7Ci0gICAgcmV0dXJuIGFycmF5XzsKLSAgfQotCi0gIC8vIENvbXBhcmlzb24gb3BlcmF0b3JzLgotICAvLyBUaGVzZSByZXR1cm4gd2hldGhlciB0d28gc2NvcGVkX2FycmF5IHJlZmVyIHRvIHRoZSBzYW1lIG9iamVjdCwgbm90IGp1c3QgdG8KLSAgLy8gdHdvIGRpZmZlcmVudCBidXQgZXF1YWwgb2JqZWN0cy4KLSAgYm9vbCBvcGVyYXRvcj09KEMqIHApIGNvbnN0IHsgcmV0dXJuIGFycmF5XyA9PSBwOyB9Ci0gIGJvb2wgb3BlcmF0b3IhPShDKiBwKSBjb25zdCB7IHJldHVybiBhcnJheV8gIT0gcDsgfQotCi0gIC8vIFN3YXAgdHdvIHNjb3BlZCBhcnJheXMuCi0gIHZvaWQgc3dhcChzY29wZWRfYXJyYXkmIHAyKSB7Ci0gICAgQyogdG1wID0gYXJyYXlfOwotICAgIGFycmF5XyA9IHAyLmFycmF5XzsKLSAgICBwMi5hcnJheV8gPSB0bXA7Ci0gIH0KLQotICAvLyBSZWxlYXNlIGFuIGFycmF5LgotICAvLyBUaGUgcmV0dXJuIHZhbHVlIGlzIHRoZSBjdXJyZW50IHBvaW50ZXIgaGVsZCBieSB0aGlzIG9iamVjdC4KLSAgLy8gSWYgdGhpcyBvYmplY3QgaG9sZHMgYSBOVUxMIHBvaW50ZXIsIHRoZSByZXR1cm4gdmFsdWUgaXMgTlVMTC4KLSAgLy8gQWZ0ZXIgdGhpcyBvcGVyYXRpb24sIHRoaXMgb2JqZWN0IHdpbGwgaG9sZCBhIE5VTEwgcG9pbnRlciwKLSAgLy8gYW5kIHdpbGwgbm90IG93biB0aGUgb2JqZWN0IGFueSBtb3JlLgotICBDKiByZWxlYXNlKCkgewotICAgIEMqIHJldFZhbCA9IGFycmF5XzsKLSAgICBhcnJheV8gPSBOVUxMOwotICAgIHJldHVybiByZXRWYWw7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEMqIGFycmF5XzsKLQotICAvLyBGb3JiaWQgY29tcGFyaXNvbiBvZiBkaWZmZXJlbnQgc2NvcGVkX2FycmF5IHR5cGVzLgotICB0ZW1wbGF0ZSA8Y2xhc3MgQzI+IGJvb2wgb3BlcmF0b3I9PShzY29wZWRfYXJyYXk8QzI+IGNvbnN0JiBwMikgY29uc3Q7Ci0gIHRlbXBsYXRlIDxjbGFzcyBDMj4gYm9vbCBvcGVyYXRvciE9KHNjb3BlZF9hcnJheTxDMj4gY29uc3QmIHAyKSBjb25zdDsKLQotICAvLyBEaXNhbGxvdyBldmlsIGNvbnN0cnVjdG9ycwotICBzY29wZWRfYXJyYXkoY29uc3Qgc2NvcGVkX2FycmF5Jik7Ci0gIHZvaWQgb3BlcmF0b3I9KGNvbnN0IHNjb3BlZF9hcnJheSYpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKLS8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCi11c2luZyBpbnRlcm5hbDo6c2NvcGVkX3B0cjsKLXVzaW5nIGludGVybmFsOjpzY29wZWRfYXJyYXk7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGVtdWxhdGVzIGdvb2dsZTMvYmFzZS9sb2dnaW5nLmgKLQotZW51bSBMb2dMZXZlbCB7Ci0gIExPR0xFVkVMX0lORk8sICAgICAvLyBJbmZvcm1hdGlvbmFsLiAgVGhpcyBpcyBuZXZlciBhY3R1YWxseSB1c2VkIGJ5Ci0gICAgICAgICAgICAgICAgICAgICAvLyBsaWJwcm90b2J1Zi4KLSAgTE9HTEVWRUxfV0FSTklORywgIC8vIFdhcm5zIGFib3V0IGlzc3VlcyB0aGF0LCBhbHRob3VnaCBub3QgdGVjaG5pY2FsbHkgYQotICAgICAgICAgICAgICAgICAgICAgLy8gcHJvYmxlbSBub3csIGNvdWxkIGNhdXNlIHByb2JsZW1zIGluIHRoZSBmdXR1cmUuICBGb3IKLSAgICAgICAgICAgICAgICAgICAgIC8vIGV4YW1wbGUsIGEgLy8gd2FybmluZyB3aWxsIGJlIHByaW50ZWQgd2hlbiBwYXJzaW5nIGEKLSAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UgdGhhdCBpcyBuZWFyIHRoZSBtZXNzYWdlIHNpemUgbGltaXQuCi0gIExPR0xFVkVMX0VSUk9SLCAgICAvLyBBbiBlcnJvciBvY2N1cnJlZCB3aGljaCBzaG91bGQgbmV2ZXIgaGFwcGVuIGR1cmluZwotICAgICAgICAgICAgICAgICAgICAgLy8gbm9ybWFsIHVzZS4KLSAgTE9HTEVWRUxfRkFUQUwsICAgIC8vIEFuIGVycm9yIG9jY3VycmVkIGZyb20gd2hpY2ggdGhlIGxpYnJhcnkgY2Fubm90Ci0gICAgICAgICAgICAgICAgICAgICAvLyByZWNvdmVyLiAgVGhpcyB1c3VhbGx5IGluZGljYXRlcyBhIHByb2dyYW1taW5nIGVycm9yCi0gICAgICAgICAgICAgICAgICAgICAvLyBpbiB0aGUgY29kZSB3aGljaCBjYWxscyB0aGUgbGlicmFyeSwgZXNwZWNpYWxseSB3aGVuCi0gICAgICAgICAgICAgICAgICAgICAvLyBjb21waWxlZCBpbiBkZWJ1ZyBtb2RlLgotCi0jaWZkZWYgTkRFQlVHCi0gIExPR0xFVkVMX0RGQVRBTCA9IExPR0xFVkVMX0VSUk9SCi0jZWxzZQotICBMT0dMRVZFTF9ERkFUQUwgPSBMT0dMRVZFTF9GQVRBTAotI2VuZGlmCi19OwotCi1uYW1lc3BhY2UgaW50ZXJuYWwgewotCi1jbGFzcyBMb2dGaW5pc2hlcjsKLQotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExvZ01lc3NhZ2UgewotIHB1YmxpYzoKLSAgTG9nTWVzc2FnZShMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lKTsKLSAgfkxvZ01lc3NhZ2UoKTsKLQotICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNvbnN0IHN0ZDo6c3RyaW5nJiB2YWx1ZSk7Ci0gIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoY29uc3QgY2hhciogdmFsdWUpOwotICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGNoYXIgdmFsdWUpOwotICBMb2dNZXNzYWdlJiBvcGVyYXRvcjw8KGludCB2YWx1ZSk7Ci0gIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodWludCB2YWx1ZSk7Ci0gIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwobG9uZyB2YWx1ZSk7Ci0gIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwodW5zaWduZWQgbG9uZyB2YWx1ZSk7Ci0gIExvZ01lc3NhZ2UmIG9wZXJhdG9yPDwoZG91YmxlIHZhbHVlKTsKLQotIHByaXZhdGU6Ci0gIGZyaWVuZCBjbGFzcyBMb2dGaW5pc2hlcjsKLSAgdm9pZCBGaW5pc2goKTsKLQotICBMb2dMZXZlbCBsZXZlbF87Ci0gIGNvbnN0IGNoYXIqIGZpbGVuYW1lXzsKLSAgaW50IGxpbmVfOwotICBzdGQ6OnN0cmluZyBtZXNzYWdlXzsKLX07Ci0KLS8vIFVzZWQgdG8gbWFrZSB0aGUgZW50aXJlICJMT0coQkxBSCkgPDwgZXRjLiIgZXhwcmVzc2lvbiBoYXZlIGEgdm9pZCByZXR1cm4KLS8vIHR5cGUgYW5kIHByaW50IGEgbmV3bGluZSBhZnRlciBlYWNoIG1lc3NhZ2UuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTG9nRmluaXNoZXIgewotIHB1YmxpYzoKLSAgdm9pZCBvcGVyYXRvcj0oTG9nTWVzc2FnZSYgb3RoZXIpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFVuZGVmIGV2ZXJ5dGhpbmcgaW4gY2FzZSB3ZSdyZSBiZWluZyBtaXhlZCB3aXRoIHNvbWUgb3RoZXIgR29vZ2xlIGxpYnJhcnkKLS8vIHdoaWNoIGFscmVhZHkgZGVmaW5lZCB0aGVtIGl0c2VsZi4gIFByZXN1bWFibHkgYWxsIEdvb2dsZSBsaWJyYXJpZXMgd2lsbAotLy8gc3VwcG9ydCB0aGUgc2FtZSBzeW50YXggZm9yIHRoZXNlIHNvIGl0IHNob3VsZCBub3QgYmUgYSBiaWcgZGVhbCBpZiB0aGV5Ci0vLyBlbmQgdXAgdXNpbmcgb3VyIGRlZmluaXRpb25zIGluc3RlYWQuCi0jdW5kZWYgR09PR0xFX0xPRwotI3VuZGVmIEdPT0dMRV9MT0dfSUYKLQotI3VuZGVmIEdPT0dMRV9DSEVDSwotI3VuZGVmIEdPT0dMRV9DSEVDS19FUQotI3VuZGVmIEdPT0dMRV9DSEVDS19ORQotI3VuZGVmIEdPT0dMRV9DSEVDS19MVAotI3VuZGVmIEdPT0dMRV9DSEVDS19MRQotI3VuZGVmIEdPT0dMRV9DSEVDS19HVAotI3VuZGVmIEdPT0dMRV9DSEVDS19HRQotCi0jdW5kZWYgR09PR0xFX0RMT0cKLSN1bmRlZiBHT09HTEVfRENIRUNLCi0jdW5kZWYgR09PR0xFX0RDSEVDS19FUQotI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfTkUKLSN1bmRlZiBHT09HTEVfRENIRUNLX0xUCi0jdW5kZWYgR09PR0xFX0RDSEVDS19MRQotI3VuZGVmIEdPT0dMRV9EQ0hFQ0tfR1QKLSN1bmRlZiBHT09HTEVfRENIRUNLX0dFCi0KLSNkZWZpbmUgR09PR0xFX0xPRyhMRVZFTCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICA6Omdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpMb2dGaW5pc2hlcigpID0gICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6TG9nTWVzc2FnZSggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6TE9HTEVWRUxfIyNMRVZFTCwgX19GSUxFX18sIF9fTElORV9fKQotI2RlZmluZSBHT09HTEVfTE9HX0lGKExFVkVMLCBDT05ESVRJT04pIFwKLSAgIShDT05ESVRJT04pID8gKHZvaWQpMCA6IEdPT0dMRV9MT0coTEVWRUwpCi0KLSNkZWZpbmUgR09PR0xFX0NIRUNLKEVYUFJFU1NJT04pIFwKLSAgR09PR0xFX0xPR19JRihGQVRBTCwgIShFWFBSRVNTSU9OKSkgPDwgIkNIRUNLIGZhaWxlZDogIiAjRVhQUkVTU0lPTiAiOiAiCi0jZGVmaW5lIEdPT0dMRV9DSEVDS19FUShBLCBCKSBHT09HTEVfQ0hFQ0soKEEpID09IChCKSkKLSNkZWZpbmUgR09PR0xFX0NIRUNLX05FKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgIT0gKEIpKQotI2RlZmluZSBHT09HTEVfQ0hFQ0tfTFQoQSwgQikgR09PR0xFX0NIRUNLKChBKSA8ICAoQikpCi0jZGVmaW5lIEdPT0dMRV9DSEVDS19MRShBLCBCKSBHT09HTEVfQ0hFQ0soKEEpIDw9IChCKSkKLSNkZWZpbmUgR09PR0xFX0NIRUNLX0dUKEEsIEIpIEdPT0dMRV9DSEVDSygoQSkgPiAgKEIpKQotI2RlZmluZSBHT09HTEVfQ0hFQ0tfR0UoQSwgQikgR09PR0xFX0NIRUNLKChBKSA+PSAoQikpCi0KLSNpZmRlZiBOREVCVUcKLQotI2RlZmluZSBHT09HTEVfRExPRyBHT09HTEVfTE9HX0lGKElORk8sIGZhbHNlKQotCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0soRVhQUkVTU0lPTikgd2hpbGUoZmFsc2UpIEdPT0dMRV9DSEVDSyhFWFBSRVNTSU9OKQotI2RlZmluZSBHT09HTEVfRENIRUNLX0VRKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpID09IChCKSkKLSNkZWZpbmUgR09PR0xFX0RDSEVDS19ORShBLCBCKSBHT09HTEVfRENIRUNLKChBKSAhPSAoQikpCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTFQoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgPCAgKEIpKQotI2RlZmluZSBHT09HTEVfRENIRUNLX0xFKEEsIEIpIEdPT0dMRV9EQ0hFQ0soKEEpIDw9IChCKSkKLSNkZWZpbmUgR09PR0xFX0RDSEVDS19HVChBLCBCKSBHT09HTEVfRENIRUNLKChBKSA+ICAoQikpCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR0UoQSwgQikgR09PR0xFX0RDSEVDSygoQSkgPj0gKEIpKQotCi0jZWxzZSAgLy8gTkRFQlVHCi0KLSNkZWZpbmUgR09PR0xFX0RMT0cgR09PR0xFX0xPRwotCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0sgICAgR09PR0xFX0NIRUNLCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfRVEgR09PR0xFX0NIRUNLX0VRCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTkUgR09PR0xFX0NIRUNLX05FCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTFQgR09PR0xFX0NIRUNLX0xUCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTEUgR09PR0xFX0NIRUNLX0xFCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR1QgR09PR0xFX0NIRUNLX0dUCi0jZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfR0UgR09PR0xFX0NIRUNLX0dFCi0KLSNlbmRpZiAgLy8gIU5ERUJVRwotCi10eXBlZGVmIHZvaWQgTG9nSGFuZGxlcihMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsIGludCBsaW5lLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RkOjpzdHJpbmcmIG1lc3NhZ2UpOwotCi0vLyBUaGUgcHJvdG9idWYgbGlicmFyeSBzb21ldGltZXMgd3JpdGVzIHdhcm5pbmcgYW5kIGVycm9yIG1lc3NhZ2VzIHRvCi0vLyBzdGRlcnIuICBUaGVzZSBtZXNzYWdlcyBhcmUgcHJpbWFyaWx5IHVzZWZ1bCBmb3IgZGV2ZWxvcGVycywgYnV0IG1heQotLy8gYWxzbyBoZWxwIGVuZCB1c2VycyBmaWd1cmUgb3V0IGEgcHJvYmxlbS4gIElmIHlvdSB3b3VsZCBwcmVmZXIgdGhhdAotLy8gdGhlc2UgbWVzc2FnZXMgYmUgc2VudCBzb21ld2hlcmUgb3RoZXIgdGhhbiBzdGRlcnIsIGNhbGwgU2V0TG9nSGFuZGxlcigpCi0vLyB0byBzZXQgeW91ciBvd24gaGFuZGxlci4gIFRoaXMgcmV0dXJucyB0aGUgb2xkIGhhbmRsZXIuICBTZXQgdGhlIGhhbmRsZXIKLS8vIHRvIE5VTEwgdG8gaWdub3JlIGxvZyBtZXNzYWdlcyAoYnV0IHNlZSBhbHNvIExvZ1NpbGVuY2VyLCBiZWxvdykuCi0vLwotLy8gT2J2aW91c2x5LCBTZXRMb2dIYW5kbGVyIGlzIG5vdCB0aHJlYWQtc2FmZS4gIFlvdSBzaG91bGQgb25seSBjYWxsIGl0Ci0vLyBhdCBpbml0aWFsaXphdGlvbiB0aW1lLCBhbmQgcHJvYmFibHkgbm90IGZyb20gbGlicmFyeSBjb2RlLiAgSWYgeW91Ci0vLyBzaW1wbHkgd2FudCB0byBzdXBwcmVzcyBsb2cgbWVzc2FnZXMgdGVtcG9yYXJpbHkgKGUuZy4gYmVjYXVzZSB5b3UKLS8vIGhhdmUgc29tZSBjb2RlIHRoYXQgdGVuZHMgdG8gdHJpZ2dlciB0aGVtIGZyZXF1ZW50bHkgYW5kIHlvdSBrbm93Ci0vLyB0aGUgd2FybmluZ3MgYXJlIG5vdCBpbXBvcnRhbnQgdG8geW91KSwgdXNlIHRoZSBMb2dTaWxlbmNlciBjbGFzcwotLy8gYmVsb3cuCi1MSUJQUk9UT0JVRl9FWFBPUlQgTG9nSGFuZGxlciogU2V0TG9nSGFuZGxlcihMb2dIYW5kbGVyKiBuZXdfZnVuYyk7Ci0KLS8vIENyZWF0ZSBhIExvZ1NpbGVuY2VyIGlmIHlvdSB3YW50IHRvIHRlbXBvcmFyaWx5IHN1cHByZXNzIGFsbCBsb2cKLS8vIG1lc3NhZ2VzLiAgQXMgbG9uZyBhcyBhbnkgTG9nU2lsZW5jZXIgb2JqZWN0cyBleGlzdCwgbm9uLWZhdGFsCi0vLyBsb2cgbWVzc2FnZXMgd2lsbCBiZSBkaXNjYXJkZWQgKHRoZSBjdXJyZW50IExvZ0hhbmRsZXIgd2lsbCAqbm90KgotLy8gYmUgY2FsbGVkKS4gIENvbnN0cnVjdGluZyBhIExvZ1NpbGVuY2VyIGlzIHRocmVhZC1zYWZlLiAgWW91IG1heQotLy8gYWNjaWRlbnRhbGx5IHN1cHByZXNzIGxvZyBtZXNzYWdlcyBvY2N1cnJpbmcgaW4gYW5vdGhlciB0aHJlYWQsIGJ1dAotLy8gc2luY2UgbWVzc2FnZXMgYXJlIGdlbmVyYWxseSBmb3IgZGVidWdnaW5nIHB1cnBvc2VzIG9ubHksIHRoaXMgaXNuJ3QKLS8vIGEgYmlnIGRlYWwuICBJZiB5b3Ugd2FudCB0byBpbnRlcmNlcHQgbG9nIG1lc3NhZ2VzLCB1c2UgU2V0TG9nSGFuZGxlcigpLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIExvZ1NpbGVuY2VyIHsKLSBwdWJsaWM6Ci0gIExvZ1NpbGVuY2VyKCk7Ci0gIH5Mb2dTaWxlbmNlcigpOwotfTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL2NhbGxiYWNrLmgKLQotLy8gQWJzdHJhY3QgaW50ZXJmYWNlIGZvciBhIGNhbGxiYWNrLiAgV2hlbiBjYWxsaW5nIGFuIFJQQywgeW91IG11c3QgcHJvdmlkZQotLy8gYSBDbG9zdXJlIHRvIGNhbGwgd2hlbiB0aGUgcHJvY2VkdXJlIGNvbXBsZXRlcy4gIFNlZSB0aGUgU2VydmljZSBpbnRlcmZhY2UKLS8vIGluIHNlcnZpY2UuaC4KLS8vCi0vLyBUbyBhdXRvbWF0aWNhbGx5IGNvbnN0cnVjdCBhIENsb3N1cmUgd2hpY2ggY2FsbHMgYSBwYXJ0aWN1bGFyIGZ1bmN0aW9uIG9yCi0vLyBtZXRob2Qgd2l0aCBhIHBhcnRpY3VsYXIgc2V0IG9mIHBhcmFtZXRlcnMsIHVzZSB0aGUgTmV3Q2FsbGJhY2soKSBmdW5jdGlvbi4KLS8vIEV4YW1wbGU6Ci0vLyAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKLS8vICAgICAuLi4KLS8vICAgfQotLy8KLS8vICAgdm9pZCBDYWxsRm9vKCkgewotLy8gICAgIC4uLgotLy8gICAgIC8vIFdoZW4gZG9uZSwgY2FsbCBGb29Eb25lKCkgYW5kIHBhc3MgaXQgYSBwb2ludGVyIHRvIHRoZSByZXNwb25zZS4KLS8vICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKCZGb29Eb25lLCByZXNwb25zZSk7Ci0vLyAgICAgLy8gTWFrZSB0aGUgY2FsbC4KLS8vICAgICBzZXJ2aWNlLT5Gb28oY29udHJvbGxlciwgcmVxdWVzdCwgcmVzcG9uc2UsIGNhbGxiYWNrKTsKLS8vICAgfQotLy8KLS8vIEV4YW1wbGUgdGhhdCBjYWxscyBhIG1ldGhvZDoKLS8vICAgY2xhc3MgSGFuZGxlciB7Ci0vLyAgICBwdWJsaWM6Ci0vLyAgICAgLi4uCi0vLwotLy8gICAgIHZvaWQgRm9vRG9uZShjb25zdCBGb29SZXNwb25zZSogcmVzcG9uc2UpIHsKLS8vICAgICAgIC4uLgotLy8gICAgIH0KLS8vCi0vLyAgICAgdm9pZCBDYWxsRm9vKCkgewotLy8gICAgICAgLi4uCi0vLyAgICAgICAvLyBXaGVuIGRvbmUsIGNhbGwgRm9vRG9uZSgpIGFuZCBwYXNzIGl0IGEgcG9pbnRlciB0byB0aGUgcmVzcG9uc2UuCi0vLyAgICAgICBDbG9zdXJlKiBjYWxsYmFjayA9IE5ld0NhbGxiYWNrKHRoaXMsICZIYW5kbGVyOjpGb29Eb25lLCByZXNwb25zZSk7Ci0vLyAgICAgICAvLyBNYWtlIHRoZSBjYWxsLgotLy8gICAgICAgc2VydmljZS0+Rm9vKGNvbnRyb2xsZXIsIHJlcXVlc3QsIHJlc3BvbnNlLCBjYWxsYmFjayk7Ci0vLyAgICAgfQotLy8gICB9OwotLy8KLS8vIEN1cnJlbnRseSBOZXdDYWxsYmFjaygpIHN1cHBvcnRzIGJpbmRpbmcgemVybywgb25lLCBvciB0d28gYXJndW1lbnRzLgotLy8KLS8vIENhbGxiYWNrcyBjcmVhdGVkIHdpdGggTmV3Q2FsbGJhY2soKSBhdXRvbWF0aWNhbGx5IGRlbGV0ZSB0aGVtc2VsdmVzIHdoZW4KLS8vIGV4ZWN1dGVkLiAgVGhleSBzaG91bGQgYmUgdXNlZCB3aGVuIGEgY2FsbGJhY2sgaXMgdG8gYmUgY2FsbGVkIGV4YWN0bHkKLS8vIG9uY2UgKHVzdWFsbHkgdGhlIGNhc2Ugd2l0aCBSUEMgY2FsbGJhY2tzKS4gIElmIGEgY2FsbGJhY2sgbWF5IGJlIGNhbGxlZAotLy8gYSBkaWZmZXJlbnQgbnVtYmVyIG9mIHRpbWVzIChpbmNsdWRpbmcgemVybyksIGNyZWF0ZSBpdCB3aXRoCi0vLyBOZXdQZXJtYW5lbnRDYWxsYmFjaygpIGluc3RlYWQuICBZb3UgYXJlIHRoZW4gcmVzcG9uc2libGUgZm9yIGRlbGV0aW5nIHRoZQotLy8gY2FsbGJhY2sgKHVzaW5nIHRoZSAiZGVsZXRlIiBrZXl3b3JkIGFzIG5vcm1hbCkuCi0vLwotLy8gTm90ZSB0aGF0IE5ld0NhbGxiYWNrKCkgaXMgYSBiaXQgdG91Y2h5IHJlZ2FyZGluZyBhcmd1bWVudCB0eXBlcy4gIEdlbmVyYWxseSwKLS8vIHRoZSB2YWx1ZXMgeW91IHByb3ZpZGUgZm9yIHRoZSBwYXJhbWV0ZXIgYmluZGluZ3MgbXVzdCBleGFjdGx5IG1hdGNoIHRoZQotLy8gdHlwZXMgYWNjZXB0ZWQgYnkgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uLiAgRm9yIGV4YW1wbGU6Ci0vLyAgIHZvaWQgRm9vKHN0cmluZyBzKTsKLS8vICAgTmV3Q2FsbGJhY2soJkZvbywgImZvbyIpOyAgICAgICAgICAvLyBXT04nVCBXT1JLOiAgY29uc3QgY2hhciogIT0gc3RyaW5nCi0vLyAgIE5ld0NhbGxiYWNrKCZGb28sIHN0cmluZygiZm9vIikpOyAgLy8gV09SS1MKLS8vIEFsc28gbm90ZSB0aGF0IHRoZSBhcmd1bWVudHMgY2Fubm90IGJlIHJlZmVyZW5jZXM6Ci0vLyAgIHZvaWQgRm9vKGNvbnN0IHN0cmluZyYgcyk7Ci0vLyAgIHN0cmluZyBteV9zdHI7Ci0vLyAgIE5ld0NhbGxiYWNrKCZGb28sIG15X3N0cik7ICAvLyBXT04nVCBXT1JLOiAgQ2FuJ3QgdXNlIHJlZmVyZWNuZXMuCi0vLyBIb3dldmVyLCBjb3JyZWN0bHktdHlwZWQgcG9pbnRlcnMgd2lsbCB3b3JrIGp1c3QgZmluZS4KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBDbG9zdXJlIHsKLSBwdWJsaWM6Ci0gIENsb3N1cmUoKSB7fQotICB2aXJ0dWFsIH5DbG9zdXJlKCk7Ci0KLSAgdmlydHVhbCB2b2lkIFJ1bigpID0gMDsKLQotIHByaXZhdGU6Ci0gIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhDbG9zdXJlKTsKLX07Ci0KLW5hbWVzcGFjZSBpbnRlcm5hbCB7Ci0KLWNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBGdW5jdGlvbkNsb3N1cmUwIDogcHVibGljIENsb3N1cmUgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKSgpOwotCi0gIEZ1bmN0aW9uQ2xvc3VyZTAoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcpCi0gICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSB7fQotICB+RnVuY3Rpb25DbG9zdXJlMCgpOwotCi0gIHZvaWQgUnVuKCkgewotICAgIGJvb2wgbmVlZHNfZGVsZXRlID0gc2VsZl9kZWxldGluZ187ICAvLyByZWFkIGluIGNhc2UgY2FsbGJhY2sgZGVsZXRlcwotICAgIGZ1bmN0aW9uXygpOwotICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOwotICB9Ci0KLSBwcml2YXRlOgotICBGdW5jdGlvblR5cGUgZnVuY3Rpb25fOwotICBib29sIHNlbGZfZGVsZXRpbmdfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzPgotY2xhc3MgTWV0aG9kQ2xvc3VyZTAgOiBwdWJsaWMgQ2xvc3VyZSB7Ci0gcHVibGljOgotICB0eXBlZGVmIHZvaWQgKENsYXNzOjoqTWV0aG9kVHlwZSkoKTsKLQotICBNZXRob2RDbG9zdXJlMChDbGFzcyogb2JqZWN0LCBNZXRob2RUeXBlIG1ldGhvZCwgYm9vbCBzZWxmX2RlbGV0aW5nKQotICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpIHt9Ci0gIH5NZXRob2RDbG9zdXJlMCgpIHt9Ci0KLSAgdm9pZCBSdW4oKSB7Ci0gICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCi0gICAgKG9iamVjdF8tPiptZXRob2RfKSgpOwotICAgIGlmIChuZWVkc19kZWxldGUpIGRlbGV0ZSB0aGlzOwotICB9Ci0KLSBwcml2YXRlOgotICBDbGFzcyogb2JqZWN0XzsKLSAgTWV0aG9kVHlwZSBtZXRob2RfOwotICBib29sIHNlbGZfZGVsZXRpbmdfOwotfTsKLQotdGVtcGxhdGUgPHR5cGVuYW1lIEFyZzE+Ci1jbGFzcyBGdW5jdGlvbkNsb3N1cmUxIDogcHVibGljIENsb3N1cmUgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB2b2lkICgqRnVuY3Rpb25UeXBlKShBcmcxIGFyZzEpOwotCi0gIEZ1bmN0aW9uQ2xvc3VyZTEoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCi0gICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQotICAgIDogZnVuY3Rpb25fKGZ1bmN0aW9uKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCi0gICAgICBhcmcxXyhhcmcxKSB7fQotICB+RnVuY3Rpb25DbG9zdXJlMSgpIHt9Ci0KLSAgdm9pZCBSdW4oKSB7Ci0gICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCi0gICAgZnVuY3Rpb25fKGFyZzFfKTsKLSAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKLSAgfQotCi0gcHJpdmF0ZToKLSAgRnVuY3Rpb25UeXBlIGZ1bmN0aW9uXzsKLSAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKLSAgQXJnMSBhcmcxXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMT4KLWNsYXNzIE1ldGhvZENsb3N1cmUxIDogcHVibGljIENsb3N1cmUgewotIHB1YmxpYzoKLSAgdHlwZWRlZiB2b2lkIChDbGFzczo6Kk1ldGhvZFR5cGUpKEFyZzEgYXJnMSk7Ci0KLSAgTWV0aG9kQ2xvc3VyZTEoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKLSAgICAgICAgICAgICAgICAgQXJnMSBhcmcxKQotICAgIDogb2JqZWN0XyhvYmplY3QpLCBtZXRob2RfKG1ldGhvZCksIHNlbGZfZGVsZXRpbmdfKHNlbGZfZGVsZXRpbmcpLAotICAgICAgYXJnMV8oYXJnMSkge30KLSAgfk1ldGhvZENsb3N1cmUxKCkge30KLQotICB2b2lkIFJ1bigpIHsKLSAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKLSAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfKTsKLSAgICBpZiAobmVlZHNfZGVsZXRlKSBkZWxldGUgdGhpczsKLSAgfQotCi0gcHJpdmF0ZToKLSAgQ2xhc3MqIG9iamVjdF87Ci0gIE1ldGhvZFR5cGUgbWV0aG9kXzsKLSAgYm9vbCBzZWxmX2RlbGV0aW5nXzsKLSAgQXJnMSBhcmcxXzsKLX07Ci0KLXRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgotY2xhc3MgRnVuY3Rpb25DbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCAoKkZ1bmN0aW9uVHlwZSkoQXJnMSBhcmcxLCBBcmcyIGFyZzIpOwotCi0gIEZ1bmN0aW9uQ2xvc3VyZTIoRnVuY3Rpb25UeXBlIGZ1bmN0aW9uLCBib29sIHNlbGZfZGVsZXRpbmcsCi0gICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCi0gICAgOiBmdW5jdGlvbl8oZnVuY3Rpb24pLCBzZWxmX2RlbGV0aW5nXyhzZWxmX2RlbGV0aW5nKSwKLSAgICAgIGFyZzFfKGFyZzEpLCBhcmcyXyhhcmcyKSB7fQotICB+RnVuY3Rpb25DbG9zdXJlMigpIHt9Ci0KLSAgdm9pZCBSdW4oKSB7Ci0gICAgYm9vbCBuZWVkc19kZWxldGUgPSBzZWxmX2RlbGV0aW5nXzsgIC8vIHJlYWQgaW4gY2FzZSBjYWxsYmFjayBkZWxldGVzCi0gICAgZnVuY3Rpb25fKGFyZzFfLCBhcmcyXyk7Ci0gICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIEZ1bmN0aW9uVHlwZSBmdW5jdGlvbl87Ci0gIGJvb2wgc2VsZl9kZWxldGluZ187Ci0gIEFyZzEgYXJnMV87Ci0gIEFyZzIgYXJnMl87Ci19OwotCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci1jbGFzcyBNZXRob2RDbG9zdXJlMiA6IHB1YmxpYyBDbG9zdXJlIHsKLSBwdWJsaWM6Ci0gIHR5cGVkZWYgdm9pZCAoQ2xhc3M6OipNZXRob2RUeXBlKShBcmcxIGFyZzEsIEFyZzIgYXJnMik7Ci0KLSAgTWV0aG9kQ2xvc3VyZTIoQ2xhc3MqIG9iamVjdCwgTWV0aG9kVHlwZSBtZXRob2QsIGJvb2wgc2VsZl9kZWxldGluZywKLSAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpCi0gICAgOiBvYmplY3RfKG9iamVjdCksIG1ldGhvZF8obWV0aG9kKSwgc2VsZl9kZWxldGluZ18oc2VsZl9kZWxldGluZyksCi0gICAgICBhcmcxXyhhcmcxKSwgYXJnMl8oYXJnMikge30KLSAgfk1ldGhvZENsb3N1cmUyKCkge30KLQotICB2b2lkIFJ1bigpIHsKLSAgICBib29sIG5lZWRzX2RlbGV0ZSA9IHNlbGZfZGVsZXRpbmdfOyAgLy8gcmVhZCBpbiBjYXNlIGNhbGxiYWNrIGRlbGV0ZXMKLSAgICAob2JqZWN0Xy0+Km1ldGhvZF8pKGFyZzFfLCBhcmcyXyk7Ci0gICAgaWYgKG5lZWRzX2RlbGV0ZSkgZGVsZXRlIHRoaXM7Ci0gIH0KLQotIHByaXZhdGU6Ci0gIENsYXNzKiBvYmplY3RfOwotICBNZXRob2RUeXBlIG1ldGhvZF87Ci0gIGJvb2wgc2VsZl9kZWxldGluZ187Ci0gIEFyZzEgYXJnMV87Ci0gIEFyZzIgYXJnMl87Ci19OwotCi19ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKLQotLy8gU2VlIENsb3N1cmUuCi1pbmxpbmUgQ2xvc3VyZSogTmV3Q2FsbGJhY2sodm9pZCAoKmZ1bmN0aW9uKSgpKSB7Ci0gIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTAoZnVuY3Rpb24sIHRydWUpOwotfQotCi0vLyBTZWUgQ2xvc3VyZS4KLWlubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKCkpIHsKLSAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMChmdW5jdGlvbiwgZmFsc2UpOwotfQotCi0vLyBTZWUgQ2xvc3VyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4KLWlubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoKSkgewotICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMDxDbGFzcz4ob2JqZWN0LCBtZXRob2QsIHRydWUpOwotfQotCi0vLyBTZWUgQ2xvc3VyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcz4KLWlubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoKSkgewotICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMDxDbGFzcz4ob2JqZWN0LCBtZXRob2QsIGZhbHNlKTsKLX0KLQotLy8gU2VlIENsb3N1cmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMT4KLWlubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgewotICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUxPEFyZzE+KGZ1bmN0aW9uLCB0cnVlLCBhcmcxKTsKLX0KLQotLy8gU2VlIENsb3N1cmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMT4KLWlubGluZSBDbG9zdXJlKiBOZXdQZXJtYW5lbnRDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgewotICByZXR1cm4gbmV3IGludGVybmFsOjpGdW5jdGlvbkNsb3N1cmUxPEFyZzE+KGZ1bmN0aW9uLCBmYWxzZSwgYXJnMSk7Ci19Ci0KLS8vIFNlZSBDbG9zdXJlLgotdGVtcGxhdGUgPHR5cGVuYW1lIENsYXNzLCB0eXBlbmFtZSBBcmcxPgotaW5saW5lIENsb3N1cmUqIE5ld0NhbGxiYWNrKENsYXNzKiBvYmplY3QsIHZvaWQgKENsYXNzOjoqbWV0aG9kKShBcmcxKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICBBcmcxIGFyZzEpIHsKLSAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTE8Q2xhc3MsIEFyZzE+KG9iamVjdCwgbWV0aG9kLCB0cnVlLCBhcmcxKTsKLX0KLQotLy8gU2VlIENsb3N1cmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzE+Ci1pbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2soQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKEFyZzEpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSkgewotICByZXR1cm4gbmV3IGludGVybmFsOjpNZXRob2RDbG9zdXJlMTxDbGFzcywgQXJnMT4ob2JqZWN0LCBtZXRob2QsIGZhbHNlLCBhcmcxKTsKLX0KLQotLy8gU2VlIENsb3N1cmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KLWlubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayh2b2lkICgqZnVuY3Rpb24pKEFyZzEsIEFyZzIpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7Ci0gIHJldHVybiBuZXcgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTI8QXJnMSwgQXJnMj4oCi0gICAgZnVuY3Rpb24sIHRydWUsIGFyZzEsIGFyZzIpOwotfQotCi0vLyBTZWUgQ2xvc3VyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBBcmcxLCB0eXBlbmFtZSBBcmcyPgotaW5saW5lIENsb3N1cmUqIE5ld1Blcm1hbmVudENhbGxiYWNrKHZvaWQgKCpmdW5jdGlvbikoQXJnMSwgQXJnMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpIHsKLSAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMjxBcmcxLCBBcmcyPigKLSAgICBmdW5jdGlvbiwgZmFsc2UsIGFyZzEsIGFyZzIpOwotfQotCi0vLyBTZWUgQ2xvc3VyZS4KLXRlbXBsYXRlIDx0eXBlbmFtZSBDbGFzcywgdHlwZW5hbWUgQXJnMSwgdHlwZW5hbWUgQXJnMj4KLWlubGluZSBDbG9zdXJlKiBOZXdDYWxsYmFjayhDbGFzcyogb2JqZWN0LCB2b2lkIChDbGFzczo6Km1ldGhvZCkoQXJnMSwgQXJnMiksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgQXJnMSBhcmcxLCBBcmcyIGFyZzIpIHsKLSAgcmV0dXJuIG5ldyBpbnRlcm5hbDo6TWV0aG9kQ2xvc3VyZTI8Q2xhc3MsIEFyZzEsIEFyZzI+KAotICAgIG9iamVjdCwgbWV0aG9kLCB0cnVlLCBhcmcxLCBhcmcyKTsKLX0KLQotLy8gU2VlIENsb3N1cmUuCi10ZW1wbGF0ZSA8dHlwZW5hbWUgQ2xhc3MsIHR5cGVuYW1lIEFyZzEsIHR5cGVuYW1lIEFyZzI+Ci1pbmxpbmUgQ2xvc3VyZSogTmV3UGVybWFuZW50Q2FsbGJhY2soCi0gICAgQ2xhc3MqIG9iamVjdCwgdm9pZCAoQ2xhc3M6OiptZXRob2QpKEFyZzEsIEFyZzIpLAotICAgIEFyZzEgYXJnMSwgQXJnMiBhcmcyKSB7Ci0gIHJldHVybiBuZXcgaW50ZXJuYWw6Ok1ldGhvZENsb3N1cmUyPENsYXNzLCBBcmcxLCBBcmcyPigKLSAgICBvYmplY3QsIG1ldGhvZCwgZmFsc2UsIGFyZzEsIGFyZzIpOwotfQotCi0vLyBBIGZ1bmN0aW9uIHdoaWNoIGRvZXMgbm90aGluZy4gIFVzZWZ1bCBmb3IgY3JlYXRpbmcgbm8tb3AgY2FsbGJhY2tzLCBlLmcuOgotLy8gICBDbG9zdXJlKiBub3RoaW5nID0gTmV3Q2FsbGJhY2soJkRvTm90aGluZyk7Ci12b2lkIExJQlBST1RPQlVGX0VYUE9SVCBEb05vdGhpbmcoKTsKLQotLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLy8gZW11bGF0ZXMgZ29vZ2xlMy9iYXNlL211dGV4LmgKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gQSBNdXRleCBpcyBhIG5vbi1yZWVudHJhbnQgKGFrYSBub24tcmVjdXJzaXZlKSBtdXRleC4gIEF0IG1vc3Qgb25lIHRocmVhZCBUCi0vLyBtYXkgaG9sZCBhIG11dGV4IGF0IGEgZ2l2ZW4gdGltZS4gIElmIFQgYXR0ZW1wdHMgdG8gTG9jaygpIHRoZSBzYW1lIE11dGV4Ci0vLyB3aGlsZSBob2xkaW5nIGl0LCBUIHdpbGwgZGVhZGxvY2suCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTXV0ZXggewotIHB1YmxpYzoKLSAgLy8gQ3JlYXRlIGEgTXV0ZXggdGhhdCBpcyBub3QgaGVsZCBieSBhbnlib2R5LgotICBNdXRleCgpOwotCi0gIC8vIERlc3RydWN0b3IKLSAgfk11dGV4KCk7Ci0KLSAgLy8gQmxvY2sgaWYgbmVjZXNzYXJ5IHVudGlsIHRoaXMgTXV0ZXggaXMgZnJlZSwgdGhlbiBhY3F1aXJlIGl0IGV4Y2x1c2l2ZWx5LgotICB2b2lkIExvY2soKTsKLQotICAvLyBSZWxlYXNlIHRoaXMgTXV0ZXguICBDYWxsZXIgbXVzdCBob2xkIGl0IGV4Y2x1c2l2ZWx5LgotICB2b2lkIFVubG9jaygpOwotCi0gIC8vIENyYXNoIGlmIHRoaXMgTXV0ZXggaXMgbm90IGhlbGQgZXhjbHVzaXZlbHkgYnkgdGhpcyB0aHJlYWQuCi0gIC8vIE1heSBmYWlsIHRvIGNyYXNoIHdoZW4gaXQgc2hvdWxkOyB3aWxsIG5ldmVyIGNyYXNoIHdoZW4gaXQgc2hvdWxkIG5vdC4KLSAgdm9pZCBBc3NlcnRIZWxkKCk7Ci0KLSBwcml2YXRlOgotICBzdHJ1Y3QgSW50ZXJuYWw7Ci0gIEludGVybmFsKiBtSW50ZXJuYWw7Ci0KLSAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKE11dGV4KTsKLX07Ci0KLS8vIE11dGV4TG9jayhtdSkgYWNxdWlyZXMgbXUgd2hlbiBjb25zdHJ1Y3RlZCBhbmQgcmVsZWFzZXMgaXQgd2hlbiBkZXN0cm95ZWQuCi1jbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgTXV0ZXhMb2NrIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE11dGV4TG9jayhNdXRleCAqbXUpIDogbXVfKG11KSB7IHRoaXMtPm11Xy0+TG9jaygpOyB9Ci0gIH5NdXRleExvY2soKSB7IHRoaXMtPm11Xy0+VW5sb2NrKCk7IH0KLSBwcml2YXRlOgotICBNdXRleCAqY29uc3QgbXVfOwotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrKTsKLX07Ci0KLS8vIFRPRE8oa2VudG9uKTogIEltcGxlbWVudCB0aGVzZT8gIEhhcmQgdG8gaW1wbGVtZW50IHBvcnRhYmx5LgotdHlwZWRlZiBNdXRleExvY2sgUmVhZGVyTXV0ZXhMb2NrOwotdHlwZWRlZiBNdXRleExvY2sgV3JpdGVyTXV0ZXhMb2NrOwotCi0vLyBNdXRleExvY2tNYXliZSBpcyBsaWtlIE11dGV4TG9jaywgYnV0IGlzIGEgbm8tb3Agd2hlbiBtdSBpcyBOVUxMLgotY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIE11dGV4TG9ja01heWJlIHsKLSBwdWJsaWM6Ci0gIGV4cGxpY2l0IE11dGV4TG9ja01heWJlKE11dGV4ICptdSkgOgotICAgIG11XyhtdSkgeyBpZiAodGhpcy0+bXVfICE9IE5VTEwpIHsgdGhpcy0+bXVfLT5Mb2NrKCk7IH0gfQotICB+TXV0ZXhMb2NrTWF5YmUoKSB7IGlmICh0aGlzLT5tdV8gIT0gTlVMTCkgeyB0aGlzLT5tdV8tPlVubG9jaygpOyB9IH0KLSBwcml2YXRlOgotICBNdXRleCAqY29uc3QgbXVfOwotICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoTXV0ZXhMb2NrTWF5YmUpOwotfTsKLQotfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCi0KLS8vIFdlIG1hZGUgdGhlc2UgaW50ZXJuYWwgc28gdGhhdCB0aGV5IHdvdWxkIHNob3cgdXAgYXMgc3VjaCBpbiB0aGUgZG9jcywKLS8vIGJ1dCB3ZSBkb24ndCB3YW50IHRvIHN0aWNrICJpbnRlcm5hbDo6IiBpbiBmcm9udCBvZiB0aGVtIGV2ZXJ5d2hlcmUuCi11c2luZyBpbnRlcm5hbDo6TXV0ZXg7Ci11c2luZyBpbnRlcm5hbDo6TXV0ZXhMb2NrOwotdXNpbmcgaW50ZXJuYWw6OlJlYWRlck11dGV4TG9jazsKLXVzaW5nIGludGVybmFsOjpXcml0ZXJNdXRleExvY2s7Ci11c2luZyBpbnRlcm5hbDo6TXV0ZXhMb2NrTWF5YmU7Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS8vIGZyb20gZ29vZ2xlMy9iYXNlL3R5cGVfdHJhaXRzLmgKLQotbmFtZXNwYWNlIGludGVybmFsIHsKLQotLy8gU3BlY2lmaWVkIGJ5IFRSMSBbNC43LjRdIFBvaW50ZXIgbW9kaWZpY2F0aW9ucy4KLXRlbXBsYXRlPHR5cGVuYW1lIFQ+IHN0cnVjdCByZW1vdmVfcG9pbnRlciB7IHR5cGVkZWYgVCB0eXBlOyB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIGNvbnN0PiB7IHR5cGVkZWYgVCB0eXBlOyB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIHZvbGF0aWxlPiB7IHR5cGVkZWYgVCB0eXBlOyB9OwotdGVtcGxhdGU8dHlwZW5hbWUgVD4gc3RydWN0IHJlbW92ZV9wb2ludGVyPFQqIGNvbnN0IHZvbGF0aWxlPiB7Ci0gIHR5cGVkZWYgVCB0eXBlOyB9OwotCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KIC8vIENoZWNrcyBpZiB0aGUgYnVmZmVyIGNvbnRhaW5zIHN0cnVjdHVyYWxseS12YWxpZCBVVEYtOC4gIEltcGxlbWVudGVkIGluCiAvLyBzdHJ1Y3R1cmFsbHlfdmFsaWQuY2MuCiBMSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBjaGFyKiBidWYsIGludCBsZW4pOwogCitpbmxpbmUgYm9vbCBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChjb25zdCBzdGQ6OnN0cmluZyYgc3RyKSB7CisgIHJldHVybiBJc1N0cnVjdHVyYWxseVZhbGlkVVRGOChzdHIuZGF0YSgpLCBzdGF0aWNfY2FzdDxpbnQ+KHN0ci5sZW5ndGgoKSkpOworfQorCisvLyBSZXR1cm5zIGluaXRpYWwgbnVtYmVyIG9mIGJ5dGVzIG9mIHN0cnVjdHVhbGx5IHZhbGlkIFVURi04LgorTElCUFJPVE9CVUZfRVhQT1JUIGludCBVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoY29uc3QgU3RyaW5nUGllY2UmIHN0cik7CisKKy8vIENvZXJjZSBVVEYtOCBieXRlIHN0cmluZyBpbiBzcmNfc3RyIHRvIGJlCisvLyBhIHN0cnVjdHVyYWxseS12YWxpZCBlcXVhbC1sZW5ndGggc3RyaW5nIGJ5IHNlbGVjdGl2ZWx5CisvLyBvdmVyd3JpdGluZyBpbGxlZ2FsIGJ5dGVzIHdpdGggcmVwbGFjZV9jaGFyICh0eXBpY2FsbHkgJyAnIG9yICc/JykuCisvLyByZXBsYWNlX2NoYXIgbXVzdCBiZSBsZWdhbCBwcmludGFibGUgNy1iaXQgQXNjaWkgMHgyMC4uMHg3ZS4KKy8vIHNyY19zdHIgaXMgcmVhZC1vbmx5LgorLy8KKy8vIFJldHVybnMgcG9pbnRlciB0byBvdXRwdXQgYnVmZmVyLCBzcmNfc3RyLmRhdGEoKSBpZiBubyBjaGFuZ2VzIHdlcmUgbWFkZSwKKy8vICBvciBpZHN0IGlmIHNvbWUgYnl0ZXMgd2VyZSBjaGFuZ2VkLiBpZHN0IGlzIGFsbG9jYXRlZCBieSB0aGUgY2FsbGVyCisvLyAgYW5kIG11c3QgYmUgYXQgbGVhc3QgYXMgYmlnIGFzIHNyY19zdHIKKy8vCisvLyBPcHRpbWl6ZWQgZm9yOiBhbGwgc3RydWN0dXJhbGx5IHZhbGlkIGFuZCBubyBieXRlIGNvcHlpbmcgaXMgZG9uZS4KKy8vCitMSUJQUk9UT0JVRl9FWFBPUlQgY2hhciogVVRGOENvZXJjZVRvU3RydWN0dXJhbGx5VmFsaWQoCisgICAgY29uc3QgU3RyaW5nUGllY2UmIHN0ciwgY2hhciogZHN0LCBjaGFyIHJlcGxhY2VfY2hhcik7CisKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAogCisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIC8vIFNodXRkb3duIHN1cHBvcnQuCiAKQEAgLTExODYsNyArMTk1LDcgQEAKIAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCiAKLSNpZmRlZiBQUk9UT0JVRl9VU0VfRVhDRVBUSU9OUworI2lmIFBST1RPQlVGX1VTRV9FWENFUFRJT05TCiBjbGFzcyBGYXRhbEV4Y2VwdGlvbiA6IHB1YmxpYyBzdGQ6OmV4Y2VwdGlvbiB7CiAgcHVibGljOgogICBGYXRhbEV4Y2VwdGlvbihjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUsIGNvbnN0IHN0ZDo6c3RyaW5nJiBtZXNzYWdlKQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uX3VuaXR0ZXN0LmNjCmluZGV4IDQxMDlhNTIuLjI1YmFlOWIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbl91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb25fdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMxLDYgKzMxLDcgQEAKIC8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKIAogI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FzdHMuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgpAQCAtMzgsMTAgKzM5LDEwIEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CiAKLSNpbmNsdWRlICJjb25maWcuaCIKLQogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewordXNpbmcgaW50ZXJuYWw6Ok5ld0NhbGxiYWNrOwordXNpbmcgaW50ZXJuYWw6Ok5ld1Blcm1hbmVudENhbGxiYWNrOwogbmFtZXNwYWNlIHsKIAogLy8gVE9ETyhrZW50b24pOiAgTW9yZSB0ZXN0cy4KQEAgLTk0LDkgKzk1LDkgQEAKIAogICBzdHJpbmcgdGV4dCA9IEdldENhcHR1cmVkVGVzdFN0ZGVycigpOwogICBFWFBFQ1RfRVEoCi0gICAgImxpYnByb3RvYnVmIElORk8gIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lICsgMSkgKyAiXSBBIG1lc3NhZ2UuXG4iCi0gICAgImxpYnByb3RvYnVmIFdBUk5JTkcgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lICsgMikgKyAiXSBBIHdhcm5pbmcuXG4iCi0gICAgImxpYnByb3RvYnVmIEVSUk9SICJfX0ZJTEVfXyI6IiArIFNpbXBsZUl0b2EobGluZSArIDMpICsgIl0gQW4gZXJyb3IuXG4iLAorICAgICJbbGlicHJvdG9idWYgSU5GTyAiIF9fRklMRV9fICI6IiArIFNpbXBsZUl0b2EobGluZSArIDEpICsgIl0gQSBtZXNzYWdlLlxuIgorICAgICJbbGlicHJvdG9idWYgV0FSTklORyAiIF9fRklMRV9fICI6IiArIFNpbXBsZUl0b2EobGluZSArIDIpICsgIl0gQSB3YXJuaW5nLlxuIgorICAgICJbbGlicHJvdG9idWYgRVJST1IgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKGxpbmUgKyAzKSArICJdIEFuIGVycm9yLlxuIiwKICAgICB0ZXh0KTsKIH0KIApAQCAtMTI3LDEwICsxMjgsMTAgQEAKIAogICBBU1NFUlRfRVEoMiwgY2FwdHVyZWRfbWVzc2FnZXNfLnNpemUoKSk7CiAgIEVYUEVDVF9FUSgKLSAgICAiMiAiX19GSUxFX18iOiIgKyBTaW1wbGVJdG9hKHN0YXJ0X2xpbmUgKyAxKSArICI6IEFuIGVycm9yLiIsCisgICAgIjIgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKHN0YXJ0X2xpbmUgKyAxKSArICI6IEFuIGVycm9yLiIsCiAgICAgY2FwdHVyZWRfbWVzc2FnZXNfWzBdKTsKICAgRVhQRUNUX0VRKAotICAgICIxICJfX0ZJTEVfXyI6IiArIFNpbXBsZUl0b2Eoc3RhcnRfbGluZSArIDIpICsgIjogQSB3YXJuaW5nLiIsCisgICAgIjEgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKHN0YXJ0X2xpbmUgKyAyKSArICI6IEEgd2FybmluZy4iLAogICAgIGNhcHR1cmVkX21lc3NhZ2VzX1sxXSk7CiB9CiAKQEAgLTE1MywxMCArMTU0LDEwIEBACiAKICAgQVNTRVJUX0VRKDIsIGNhcHR1cmVkX21lc3NhZ2VzXy5zaXplKCkpOwogICBFWFBFQ1RfRVEoCi0gICAgIjAgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lMSkgKyAiOiBWaXNpYmxlMSIsCisgICAgIjAgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKGxpbmUxKSArICI6IFZpc2libGUxIiwKICAgICBjYXB0dXJlZF9tZXNzYWdlc19bMF0pOwogICBFWFBFQ1RfRVEoCi0gICAgIjAgIl9fRklMRV9fIjoiICsgU2ltcGxlSXRvYShsaW5lMikgKyAiOiBWaXNpYmxlMiIsCisgICAgIjAgIiBfX0ZJTEVfXyAiOiIgKyBTaW1wbGVJdG9hKGxpbmUyKSArICI6IFZpc2libGUyIiwKICAgICBjYXB0dXJlZF9tZXNzYWdlc19bMV0pOwogfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9mYXN0bWVtLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9mYXN0bWVtLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzg4YTE3MgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2Zhc3RtZW0uaApAQCAtMCwwICsxLDE5MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEZhc3QgbWVtb3J5IGNvcHlpbmcgYW5kIGNvbXBhcmlzb24gcm91dGluZXMuCisvLyAgIHN0cmluZ3M6OmZhc3RtZW1jbXBfaW5saW5lZCgpIHJlcGxhY2VzIG1lbWNtcCgpCisvLyAgIHN0cmluZ3M6Om1lbWNweV9pbmxpbmVkKCkgcmVwbGFjZXMgbWVtY3B5KCkKKy8vICAgc3RyaW5nczo6bWVtZXEoYSwgYiwgbikgcmVwbGFjZXMgbWVtY21wKGEsIGIsIG4pID09IDAKKy8vCisvLyBzdHJpbmdzOjoqX2lubGluZWQoKSByb3V0aW5lcyBhcmUgaW5saW5lIHZlcnNpb25zIG9mIHRoZQorLy8gcm91dGluZXMgZXhwb3J0ZWQgYnkgdGhpcyBtb2R1bGUuICBTb21ldGltZXMgdXNpbmcgdGhlIGlubGluZWQKKy8vIHZlcnNpb25zIGlzIGZhc3Rlci4gIE1lYXN1cmUgYmVmb3JlIHVzaW5nIHRoZSBpbmxpbmVkIHZlcnNpb25zLgorLy8KKy8vIFBlcmZvcm1hbmNlIG1lYXN1cmVtZW50OgorLy8gICBzdHJpbmdzOjpmYXN0bWVtY21wX2lubGluZWQKKy8vICAgICBBbmFseXNpczogbWVtY21wLCBmYXN0bWVtY21wX2lubGluZWQsIGZhc3RtZW1jbXAKKy8vICAgICAyMDEyLTAxLTMwCisKKyNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1NUVUJTX0ZBU1RNRU1fSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0ZBU1RNRU1fSF8KKworI2lmbmRlZiBTVEFSQk9BUkQKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2Vsc2UKKyNpbmNsdWRlICJzdGFyYm9hcmQvbWVtb3J5LmgiCisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CituYW1lc3BhY2UgaW50ZXJuYWwgeworCisvLyBSZXR1cm4gdHJ1ZSBpZiB0aGUgbiBieXRlcyBhdCBhIGVxdWFsIHRoZSBuIGJ5dGVzIGF0IGIuCisvLyBUaGUgcmVnaW9ucyBhcmUgYWxsb3dlZCB0byBvdmVybGFwLgorLy8KKy8vIFRoZSBwZXJmb3JtYW5jZSBpcyBzaW1pbGFyIHRvIHRoZSBwZXJmb3JtYW5jZSBtZW1jbXAoKSwgYnV0IGZhc3RlciBmb3IKKy8vIG1vZGVyYXRlbHktc2l6ZWQgaW5wdXRzLCBvciBpbnB1dHMgdGhhdCBzaGFyZSBhIGNvbW1vbiBwcmVmaXggYW5kIGRpZmZlcgorLy8gc29tZXdoZXJlIGluIHRoZWlyIGxhc3QgOCBieXRlcy4gRnVydGhlciBvcHRpbWl6YXRpb25zIGNhbiBiZSBhZGRlZCBsYXRlcgorLy8gaWYgaXQgbWFrZXMgc2Vuc2UgdG8gZG8gc28uOncKK2lubGluZSBib29sIG1lbWVxKGNvbnN0IGNoYXIqIGEsIGNvbnN0IGNoYXIqIGIsIHNpemVfdCBuKSB7CisgIHNpemVfdCBuX3JvdW5kZWRfZG93biA9IG4gJiB+c3RhdGljX2Nhc3Q8c2l6ZV90Pig3KTsKKyAgaWYgKEdPT0dMRV9QUkVESUNUX0ZBTFNFKG5fcm91bmRlZF9kb3duID09IDApKSB7ICAvLyBuIDw9IDcKKyNpZm5kZWYgU1RBUkJPQVJECisgICAgcmV0dXJuIG1lbWNtcChhLCBiLCBuKSA9PSAwOworI2Vsc2UKKyAgICByZXR1cm4gU2JNZW1vcnlDb21wYXJlKGEsIGIsIG4pID09IDA7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorICB9CisgIC8vIG4gPj0gOAorICB1aW50NjQgdSA9IEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGEpIF4gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYik7CisgIHVpbnQ2NCB2ID0gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYSArIG4gLSA4KSBeIEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGIgKyBuIC0gOCk7CisgIGlmICgodSB8IHYpICE9IDApIHsgIC8vIFRoZSBmaXJzdCBvciBsYXN0IDggYnl0ZXMgZGlmZmVyLgorICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBhICs9IDg7CisgIGIgKz0gODsKKyAgbiA9IG5fcm91bmRlZF9kb3duIC0gODsKKyAgaWYgKG4gPiAxMjgpIHsKKyAgICAvLyBBcyBvZiAyMDEyLCBtZW1jbXAgb24geDg2LTY0IHVzZXMgYSBiaWcgdW5yb2xsZWQgbG9vcCB3aXRoIFNTRTIKKyAgICAvLyBpbnN0cnVjdGlvbnMsIGFuZCB3aGlsZSB3ZSBjb3VsZCB0cnkgdG8gZG8gc29tZXRoaW5nIGZhc3RlciwgaXQKKyAgICAvLyBkb2Vzbid0IHNlZW0gd29ydGggcHVyc3VpbmcuCisjaWZuZGVmIFNUQVJCT0FSRAorICAgIHJldHVybiBtZW1jbXAoYSwgYiwgbikgPT0gMDsKKyNlbHNlCisgICAgcmV0dXJuIFNiTWVtb3J5Q29tcGFyZShhLCBiLCBuKSA9PSAwOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyAgfQorICBmb3IgKDsgbiA+PSAxNjsgbiAtPSAxNikgeworICAgIHVpbnQ2NCB4ID0gR09PR0xFX1VOQUxJR05FRF9MT0FENjQoYSkgXiBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChiKTsKKyAgICB1aW50NjQgeSA9IEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGEgKyA4KSBeIEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGIgKyA4KTsKKyAgICBpZiAoKHggfCB5KSAhPSAwKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGEgKz0gMTY7CisgICAgYiArPSAxNjsKKyAgfQorICAvLyBuIG11c3QgYmUgMCBvciA4IG5vdyBiZWNhdXNlIGl0IHdhcyBhIG11bHRpcGxlIG9mIDggYXQgdGhlIHRvcCBvZiB0aGUgbG9vcC4KKyAgcmV0dXJuIG4gPT0gMCB8fCBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChhKSA9PSBHT09HTEVfVU5BTElHTkVEX0xPQUQ2NChiKTsKK30KKworaW5saW5lIGludCBmYXN0bWVtY21wX2lubGluZWQoY29uc3QgY2hhciAqYSwgY29uc3QgY2hhciAqYiwgc2l6ZV90IG4pIHsKKyAgaWYgKG4gPj0gNjQpIHsKKyNpZm5kZWYgU1RBUkJPQVJECisgICAgcmV0dXJuIG1lbWNtcChhLCBiLCBuKTsKKyNlbHNlCisgICAgcmV0dXJuIFNiTWVtb3J5Q29tcGFyZShhLCBiLCBuKTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisgIH0KKyAgY29uc3QgY2hhciogYV9saW1pdCA9IGEgKyBuOworICB3aGlsZSAoYSArIHNpemVvZih1aW50NjQpIDw9IGFfbGltaXQgJiYKKyAgICAgICAgIEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGEpID09IEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KGIpKSB7CisgICAgYSArPSBzaXplb2YodWludDY0KTsKKyAgICBiICs9IHNpemVvZih1aW50NjQpOworICB9CisgIGlmIChhICsgc2l6ZW9mKHVpbnQzMikgPD0gYV9saW1pdCAmJgorICAgICAgR09PR0xFX1VOQUxJR05FRF9MT0FEMzIoYSkgPT0gR09PR0xFX1VOQUxJR05FRF9MT0FEMzIoYikpIHsKKyAgICBhICs9IHNpemVvZih1aW50MzIpOworICAgIGIgKz0gc2l6ZW9mKHVpbnQzMik7CisgIH0KKyAgd2hpbGUgKGEgPCBhX2xpbWl0KSB7CisgICAgaW50IGQgPSBzdGF0aWNfY2FzdDx1aW50MzI+KCphKyspIC0gc3RhdGljX2Nhc3Q8dWludDMyPigqYisrKTsKKyAgICBpZiAoZCkgcmV0dXJuIGQ7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKKy8vIFRoZSBzdGFuZGFyZCBtZW1jcHkgb3BlcmF0aW9uIGlzIHNsb3cgZm9yIHZhcmlhYmxlIHNtYWxsIHNpemVzLgorLy8gVGhpcyBpbXBsZW1lbnRhdGlvbiBpbmxpbmVzIHRoZSBvcHRpbWFsIHJlYWxpemF0aW9uIGZvciBzaXplcyAxIHRvIDE2LgorLy8gVG8gYXZvaWQgY29kZSBibG9hdCBkb24ndCB1c2UgaXQgaW4gY2FzZSBvZiBub3QgcGVyZm9ybWFuY2UtY3JpdGljYWwgc3BvdHMsCisvLyBub3Igd2hlbiB5b3UgZG9uJ3QgZXhwZWN0IHZlcnkgZnJlcXVlbnQgdmFsdWVzIG9mIHNpemUgPD0gMTYuCitpbmxpbmUgdm9pZCBtZW1jcHlfaW5saW5lZChjaGFyICpkc3QsIGNvbnN0IGNoYXIgKnNyYywgc2l6ZV90IHNpemUpIHsKKyAgLy8gQ29tcGlsZXIgaW5saW5lcyBjb2RlIHdpdGggbWluaW1hbCBhbW91bnQgb2YgZGF0YSBtb3ZlbWVudCB3aGVuIHRoaXJkCisgIC8vIHBhcmFtZXRlciBvZiBtZW1jcHkgaXMgYSBjb25zdGFudC4KKyNpZm5kZWYgU1RBUkJPQVJECisgIHN3aXRjaCAoc2l6ZSkgeworICAgIGNhc2UgIDE6IG1lbWNweShkc3QsIHNyYywgMSk7IGJyZWFrOworICAgIGNhc2UgIDI6IG1lbWNweShkc3QsIHNyYywgMik7IGJyZWFrOworICAgIGNhc2UgIDM6IG1lbWNweShkc3QsIHNyYywgMyk7IGJyZWFrOworICAgIGNhc2UgIDQ6IG1lbWNweShkc3QsIHNyYywgNCk7IGJyZWFrOworICAgIGNhc2UgIDU6IG1lbWNweShkc3QsIHNyYywgNSk7IGJyZWFrOworICAgIGNhc2UgIDY6IG1lbWNweShkc3QsIHNyYywgNik7IGJyZWFrOworICAgIGNhc2UgIDc6IG1lbWNweShkc3QsIHNyYywgNyk7IGJyZWFrOworICAgIGNhc2UgIDg6IG1lbWNweShkc3QsIHNyYywgOCk7IGJyZWFrOworICAgIGNhc2UgIDk6IG1lbWNweShkc3QsIHNyYywgOSk7IGJyZWFrOworICAgIGNhc2UgMTA6IG1lbWNweShkc3QsIHNyYywgMTApOyBicmVhazsKKyAgICBjYXNlIDExOiBtZW1jcHkoZHN0LCBzcmMsIDExKTsgYnJlYWs7CisgICAgY2FzZSAxMjogbWVtY3B5KGRzdCwgc3JjLCAxMik7IGJyZWFrOworICAgIGNhc2UgMTM6IG1lbWNweShkc3QsIHNyYywgMTMpOyBicmVhazsKKyAgICBjYXNlIDE0OiBtZW1jcHkoZHN0LCBzcmMsIDE0KTsgYnJlYWs7CisgICAgY2FzZSAxNTogbWVtY3B5KGRzdCwgc3JjLCAxNSk7IGJyZWFrOworICAgIGNhc2UgMTY6IG1lbWNweShkc3QsIHNyYywgMTYpOyBicmVhazsKKyAgICBkZWZhdWx0OiBtZW1jcHkoZHN0LCBzcmMsIHNpemUpOyBicmVhazsKKyAgfQorI2Vsc2UKKyAgc3dpdGNoIChzaXplKSB7CisgICAgY2FzZSAgMTogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCAxKTsgYnJlYWs7CisgICAgY2FzZSAgMjogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCAyKTsgYnJlYWs7CisgICAgY2FzZSAgMzogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCAzKTsgYnJlYWs7CisgICAgY2FzZSAgNDogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCA0KTsgYnJlYWs7CisgICAgY2FzZSAgNTogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCA1KTsgYnJlYWs7CisgICAgY2FzZSAgNjogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCA2KTsgYnJlYWs7CisgICAgY2FzZSAgNzogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCA3KTsgYnJlYWs7CisgICAgY2FzZSAgODogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCA4KTsgYnJlYWs7CisgICAgY2FzZSAgOTogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCA5KTsgYnJlYWs7CisgICAgY2FzZSAxMDogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCAxMCk7IGJyZWFrOworICAgIGNhc2UgMTE6IFNiTWVtb3J5Q29weShkc3QsIHNyYywgMTEpOyBicmVhazsKKyAgICBjYXNlIDEyOiBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIDEyKTsgYnJlYWs7CisgICAgY2FzZSAxMzogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCAxMyk7IGJyZWFrOworICAgIGNhc2UgMTQ6IFNiTWVtb3J5Q29weShkc3QsIHNyYywgMTQpOyBicmVhazsKKyAgICBjYXNlIDE1OiBTYk1lbW9yeUNvcHkoZHN0LCBzcmMsIDE1KTsgYnJlYWs7CisgICAgY2FzZSAxNjogU2JNZW1vcnlDb3B5KGRzdCwgc3JjLCAxNik7IGJyZWFrOworICAgIGRlZmF1bHQ6IFNiTWVtb3J5Q29weShkc3QsIHNyYywgc2l6ZSk7IGJyZWFrOworICB9CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorfQorCit9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19GQVNUTUVNX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9oYXNoLmgKaW5kZXggODIyZDYwNS4uMDJlMTZlNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaGFzaC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzUsMTUgKzM1LDE0NSBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfSEFTSF9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX0hBU0hfSF9fCiAKKyNpZm5kZWYgU1RBUkJPQVJECiAjaW5jbHVkZSA8c3RyaW5nLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgImNvbmZpZy5oIgotCi0jaWYgZGVmaW5lZChIQVZFX0hBU0hfTUFQKSAmJiBkZWZpbmVkKEhBVkVfSEFTSF9TRVQpCi0jaW5jbHVkZSBIQVNIX01BUF9ICi0jaW5jbHVkZSBIQVNIX1NFVF9ICiAjZWxzZQotI2RlZmluZSBNSVNTSU5HX0hBU0gKKyNpbmNsdWRlICJzdGFyYm9hcmQvc3RyaW5nLmgiCisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisjaWZuZGVmIFNUQVJCT0FSRAorCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVZFX0hBU0hfTUFQIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBVkVfSEFTSF9TRVQgMQorCisvLyBBbmRyb2lkCisjaWYgZGVmaW5lZChfX0FORFJPSURfXykKKyMgdW5kZWYgR09PR0xFX1BST1RPQlVGX0hBVkVfSEFTSF9NQVAKKyMgdW5kZWYgR09PR0xFX1BST1RPQlVGX0hBVkVfSEFTSF9NQVAKKworLy8gVXNlIEMrKzExIHVub3JkZXJlZF97bWFwfHNldH0gaWYgYXZhaWxhYmxlLgorI2VsaWYgKChfTElCQ1BQX1NURF9WRVIgPj0gMTEpIHx8IFwKKyAgICAgICgoKF9fY3BsdXNwbHVzID49IDIwMTEwM0wpIHx8IGRlZmluZWQoX19HWFhfRVhQRVJJTUVOVEFMX0NYWDBYKSkgJiYgXAorICAgICAgKF9fR0xJQkNYWF9fID4gMjAwOTA0MjEpKSkKKyMgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNfQ1hYMTFfSEFTSAorCisvLyBGb3IgWENvZGUgPj0gNC42OiAgdGhlIGNvbXBpbGVyIGlzIGNsYW5nIHdpdGggbGliYysrLgorLy8gRm9yIGVhcmxpZXIgWENvZGUgdmVyc2lvbjogdGhlIGNvbXBpbGVyIGlzIGdjYy00LjIuMSB3aXRoIGxpYnN0ZGMrKy4KKy8vIGxpYmMrKyBwcm92aWRlcyA8dW5vcmRlcmVkX21hcD4gYW5kIGZyaWVuZHMgZXZlbiBpbiBub24gQysrMTEgbW9kZSwKKy8vIGFuZCBpdCBkb2VzIG5vdCBwcm92aWRlIHRoZSB0cjEgbGlicmFyeS4gVGhlcmVmb3JlIHRoZSBmb2xsb3dpbmcgbWFjcm8KKy8vIGNoZWNrcyBhZ2FpbnN0IHRoaXMgc3BlY2lhbCBjYXNlLgorLy8gTm90ZSB0aGF0IHdlIHNob3VsZCBub3QgdGVzdCB0aGUgX19BUFBMRV9DQ19fIHZlcnNpb24gbnVtYmVyIG9yIHRoZQorLy8gX19jbGFuZ19fIG1hY3JvLCBzaW5jZSB0aGUgbmV3IGNvbXBpbGVyIGNhbiBzdGlsbCB1c2UgLXN0ZGxpYj1saWJzdGRjKyssIGluCisvLyB3aGljaCBjYXNlIDx1bm9yZGVyZWRfbWFwPiBpcyBub3QgY29tcGlsYWJsZSB3aXRob3V0IC1zdGQ9YysrMTEKKyNlbGlmIGRlZmluZWQoX19BUFBMRV9DQ19fKQorIyBpZiBfX0dOVUNfXyA+PSA0CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU19UUjEKKyMgZWxzZQorLy8gTm90IHRlc3RlZCBmb3IgZ2NjIDwgNC4uLiBUaGVzZSBzZXR0aW5nIGNhbiBjb21waWxlIHVuZGVyIDQuMi4xIHRob3VnaC4KKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0UgX19nbnVfY3h4CisjICBpbmNsdWRlIDxleHQvaGFzaF9tYXA+CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTIGhhc2hfbWFwCisjICBpbmNsdWRlIDxleHQvaGFzaF9zZXQ+CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfU0VUX0NMQVNTIGhhc2hfc2V0CisjIGVuZGlmCisKKy8vIFZlcnNpb24gY2hlY2tzIGZvciBnY2MuCisjZWxpZiBkZWZpbmVkKF9fR05VQ19fKQorLy8gRm9yIEdDQyA0LngrLCB1c2UgdHIxOjp1bm9yZGVyZWRfbWFwL3NldDsgb3RoZXJ3aXNlLCBmb2xsb3cgdGhlCisvLyBpbnN0cnVjdGlvbnMgZnJvbToKKy8vIGh0dHBzOi8vZ2NjLmdudS5vcmcvb25saW5lZG9jcy9saWJzdGRjKysvbWFudWFsL2JhY2t3YXJkcy5odG1sCisjIGlmIF9fR05VQ19fID49IDQKKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTX1RSMQorIyBlbGlmIF9fR05VQ19fID49IDMKKyMgIGluY2x1ZGUgPGJhY2t3YXJkL2hhc2hfbWFwPgorIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUyBoYXNoX21hcAorIyAgaW5jbHVkZSA8YmFja3dhcmQvaGFzaF9zZXQ+CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfU0VUX0NMQVNTIGhhc2hfc2V0CisjICBpZiBfX0dOVUNfXyA9PSAzICYmIF9fR05VQ19NSU5PUl9fID09IDAKKyMgICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFIHN0ZCAgICAgICAvLyBHQ0MgMy4wCisjICBlbHNlCisjICAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRSBfX2dudV9jeHggLy8gR0NDIDMuMSBhbmQgbGF0ZXIKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0UKKyMgIGluY2x1ZGUgPGhhc2hfbWFwPgorIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUyBoYXNoX21hcAorIyAgaW5jbHVkZSA8aGFzaF9zZXQ+CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfU0VUX0NMQVNTIGhhc2hfc2V0CisjIGVuZGlmCisKKy8vIFZlcnNpb24gY2hlY2tzIGZvciBNU0MuCisvLyBBcHBhcmVudGx5IE1pY3Jvc29mdCBkZWNpZGVkIHRvIG1vdmUgaGFzaF9tYXAgKmJhY2sqIHRvIHRoZSBzdGQgbmFtZXNwYWNlIGluCisvLyBNU1ZDIDIwMTA6CisvLyBodHRwOi8vYmxvZ3MubXNkbi5jb20vdmNibG9nL2FyY2hpdmUvMjAwOS8wNS8yNS9zdGwtYnJlYWtpbmctY2hhbmdlcy1pbi12aXN1YWwtc3R1ZGlvLTIwMTAtYmV0YS0xLmFzcHgKKy8vIEFuZC4uIHRoZXkgYXJlIG1vdmVkIGJhY2sgdG8gc3RkZXh0IGluIE1TVkMgMjAxMyAoaGF2ZW4ndCBjaGVja2VkIDIwMTIpLiBUaGF0CisvLyBzYWlkLCB1c2UgdW5vcmRlcmVkX21hcCBmb3IgTVNWQyAyMDEwIGFuZCBiZXlvbmQgaXMgb3VyIHNhZmVzdCBiZXQuCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKQorIyBpZiBfTVNDX1ZFUiA+PSAxNjAwICAvLyBTaW5jZSBWaXN1YWwgU3R1ZGlvIDIwMTAKKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTX0NYWDExX0hBU0gKKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9DT01QQVJFIHN0ZDo6aGFzaF9jb21wYXJlCisjIGVsaWYgX01TQ19WRVIgPj0gMTUwMCAgLy8gU2luY2UgVmlzdWFsIFN0dWRpbyAyMDA4CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFIHN0ZGV4dAorIyAgaW5jbHVkZSA8aGFzaF9tYXA+CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTIGhhc2hfbWFwCisjICBpbmNsdWRlIDxoYXNoX3NldD4KKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9TRVRfQ0xBU1MgaGFzaF9zZXQKKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9DT01QQVJFIHN0ZGV4dDo6aGFzaF9jb21wYXJlCisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0NPTlRBSU5FUlNfTkVFRF9IQVNIX0NPTVBBUkUKKyMgZWxpZiBfTVNDX1ZFUiA+PSAxMzEwCisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFIHN0ZGV4dAorIyAgaW5jbHVkZSA8aGFzaF9tYXA+CisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTIGhhc2hfbWFwCisjICBpbmNsdWRlIDxoYXNoX3NldD4KKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9TRVRfQ0xBU1MgaGFzaF9zZXQKKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9DT01QQVJFIHN0ZGV4dDo6aGFzaF9jb21wYXJlCisjIGVsc2UKKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0Ugc3RkCisjICBpbmNsdWRlIDxoYXNoX21hcD4KKyMgIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1MgaGFzaF9tYXAKKyMgIGluY2x1ZGUgPGhhc2hfc2V0PgorIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUyBoYXNoX3NldAorIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX0NPTVBBUkUgc3RkZXh0OjpoYXNoX2NvbXBhcmUKKyMgZW5kaWYKKworLy8gKipBREQgTkVXIENPTVBJTEVSUyBTVVBQT1JUIEhFUkUuKioKKy8vIEZvciBvdGhlciBjb21waWxlcnMsIHVuZGVmaW5lIHRoZSBtYWNybyBhbmQgZmFsbGJhY2sgdG8gdXNlIHN0ZDo6bWFwLCBpbgorLy8gZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaAorI2Vsc2UKKyMgdW5kZWYgR09PR0xFX1BST1RPQlVGX0hBVkVfSEFTSF9NQVAKKyMgdW5kZWYgR09PR0xFX1BST1RPQlVGX0hBVkVfSEFTSF9TRVQKKyNlbmRpZgorCisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfSEFTX0NYWDExX0hBU0gpCisjIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0Ugc3RkCisjIGluY2x1ZGUgPHVub3JkZXJlZF9tYXA+CisjIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1MgdW5vcmRlcmVkX21hcAorIyBpbmNsdWRlIDx1bm9yZGVyZWRfc2V0PgorIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfU0VUX0NMQVNTIHVub3JkZXJlZF9zZXQKKyNlbGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0hBU19UUjEpCisjIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0Ugc3RkOjp0cjEKKyMgaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9tYXA+CisjIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1MgdW5vcmRlcmVkX21hcAorIyBpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX3NldD4KKyMgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUyB1bm9yZGVyZWRfc2V0CisjZW5kaWYKKworIyBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFX0RFQ0xBUkFUSU9OX1NUQVJUIFwKKyAgbmFtZXNwYWNlIGdvb2dsZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgIG5hbWVzcGFjZSBwcm90b2J1ZiB7CisjIGRlZmluZSBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0VfREVDTEFSQVRJT05fRU5EIH19CisKKyN1bmRlZiBHT09HTEVfUFJPVE9CVUZfSEFTX0NYWDExX0hBU0gKKyN1bmRlZiBHT09HTEVfUFJPVE9CVUZfSEFTX1RSMQorCisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfSEFWRV9IQVNIX01BUCkgJiYgXAorICAgIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX0hBVkVfSEFTSF9TRVQpCisjZWxzZQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfTUlTU0lOR19IQVNICiAjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHNldD4KICNlbmRpZgpAQCAtNTEsNyArMTgxLDggQEAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIAotI2lmZGVmIE1JU1NJTkdfSEFTSAorI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9NSVNTSU5HX0hBU0gKKyN1bmRlZiBHT09HTEVfUFJPVE9CVUZfTUlTU0lOR19IQVNICiAKIC8vIFRoaXMgc3lzdGVtIGRvZXNuJ3QgaGF2ZSBoYXNoX21hcCBvciBoYXNoX3NldC4gIEVtdWxhdGUgdGhlbSB1c2luZyBtYXAgYW5kCiAvLyBzZXQuCkBAIC04MiwyNiArMjEzLDQzIEBACiAgIH0KIAogICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IGNoYXIqIGEsIGNvbnN0IGNoYXIqIGIpIGNvbnN0IHsKKyNpZm5kZWYgU1RBUkJPQVJECiAgICAgcmV0dXJuIHN0cmNtcChhLCBiKSA8IDA7CisjZWxzZQorICAgIHJldHVybiBTYlN0cmluZ0NvbXBhcmVBbGwoYSwgYikgPCAwOworI2VuZGlmICAvLyBTVEFSQk9BUkQKICAgfQogfTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKICAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gaW50ID4KLWNsYXNzIGhhc2hfbWFwIDogcHVibGljIHN0ZDo6bWFwPEtleSwgRGF0YSwgSGFzaEZjbj4geworICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEFsbG9jID0gc3RkOjphbGxvY2F0b3I8IHN0ZDo6cGFpcjxjb25zdCBLZXksIERhdGE+ID4gPgorY2xhc3MgaGFzaF9tYXAgOiBwdWJsaWMgc3RkOjptYXA8S2V5LCBEYXRhLCBIYXNoRmNuLCBBbGxvYz4geworICB0eXBlZGVmIHN0ZDo6bWFwPEtleSwgRGF0YSwgSGFzaEZjbiwgQWxsb2M+IEJhc2VDbGFzczsKKworIHB1YmxpYzoKKyAgaGFzaF9tYXAoaW50IGEgPSAwLCBjb25zdCBIYXNoRmNuJiBiID0gSGFzaEZjbigpLAorICAgICAgICAgICBjb25zdCBFcXVhbEtleSYgYyA9IEVxdWFsS2V5KCksCisgICAgICAgICAgIGNvbnN0IEFsbG9jJiBkID0gQWxsb2MoKSkgOiBCYXNlQ2xhc3MoYiwgZCkge30KKworICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KIH07CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBLZXksCiAgICAgICAgICAgdHlwZW5hbWUgSGFzaEZjbiA9IGhhc2g8S2V5PiwKLSAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IGludCA+CisgICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBzdGQ6OmVxdWFsX3RvPEtleT4gPgogY2xhc3MgaGFzaF9zZXQgOiBwdWJsaWMgc3RkOjpzZXQ8S2V5LCBIYXNoRmNuPiB7CisgcHVibGljOgorICBoYXNoX3NldChpbnQgPSAwKSB7fQorCisgIEhhc2hGY24gaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hGY24oKTsgfQogfTsKIAogI2VsaWYgZGVmaW5lZChfTVNDX1ZFUikgJiYgIWRlZmluZWQoX1NUTFBPUlRfVkVSU0lPTikKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleT4KLXN0cnVjdCBoYXNoIDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpoYXNoX2NvbXBhcmU8S2V5PiB7CitzdHJ1Y3QgaGFzaCA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9DT01QQVJFPEtleT4gewogfTsKIAogLy8gTVNWQydzIGhhc2hfY29tcGFyZTxjb25zdCBjaGFyKj4gaGFzaGVzIGJhc2VkIG9uIHRoZSBzdHJpbmcgY29udGVudHMgYnV0CkBAIC0xMDksMzMgKzI1Nyw5OCBAQAogY2xhc3MgQ3N0cmluZ0xlc3MgewogIHB1YmxpYzoKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBhLCBjb25zdCBjaGFyKiBiKSBjb25zdCB7CisjaWZuZGVmIFNUQVJCT0FSRAogICAgIHJldHVybiBzdHJjbXAoYSwgYikgPCAwOworI2Vsc2UKKyAgICByZXR1cm4gU2JTdHJpbmdDb21wYXJlQWxsKGEsIGIpIDwgMDsKKyNlbmRpZiAvLyBTVEFSQk9BUkQKICAgfQogfTsKIAogdGVtcGxhdGUgPD4KIHN0cnVjdCBoYXNoPGNvbnN0IGNoYXIqPgotICA6IHB1YmxpYyBIQVNIX05BTUVTUEFDRTo6aGFzaF9jb21wYXJlPGNvbnN0IGNoYXIqLCBDc3RyaW5nTGVzcz4geworICAgIDogcHVibGljIEdPT0dMRV9QUk9UT0JVRl9IQVNIX0NPTVBBUkU8Y29uc3QgY2hhciosIENzdHJpbmdMZXNzPiB7fTsKKworI2lmZGVmIEdPT0dMRV9QUk9UT0JVRl9DT05UQUlORVJTX05FRURfSEFTSF9DT01QQVJFCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBLZXksIHR5cGVuYW1lIEhhc2hGY24sIHR5cGVuYW1lIEVxdWFsS2V5Pgorc3RydWN0IEludGVybmFsSGFzaENvbXBhcmUgOiBwdWJsaWMgR09PR0xFX1BST1RPQlVGX0hBU0hfQ09NUEFSRTxLZXk+IHsKKyAgSW50ZXJuYWxIYXNoQ29tcGFyZSgpIHt9CisgIEludGVybmFsSGFzaENvbXBhcmUoSGFzaEZjbiBoYXNoZmNuLCBFcXVhbEtleSBlcXVhbGtleSkKKyAgICAgIDogaGFzaGZjbl8oaGFzaGZjbiksIGVxdWFsa2V5XyhlcXVhbGtleSkge30KKyAgc2l6ZV90IG9wZXJhdG9yKCkoY29uc3QgS2V5JiBrZXkpIGNvbnN0IHsgcmV0dXJuIGhhc2hmY25fKGtleSk7IH0KKyAgYm9vbCBvcGVyYXRvcigpKGNvbnN0IEtleSYga2V5MSwgY29uc3QgS2V5JiBrZXkyKSBjb25zdCB7CisgICAgcmV0dXJuICFlcXVhbGtleV8oa2V5MSwga2V5Mik7CisgIH0KKyAgSGFzaEZjbiBoYXNoZmNuXzsKKyAgRXF1YWxLZXkgZXF1YWxrZXlfOwogfTsKIAogdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKICAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gaW50ID4KLWNsYXNzIGhhc2hfbWFwIDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpoYXNoX21hcDwKLSAgICBLZXksIERhdGEsIEhhc2hGY24+IHsKKyAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IHN0ZDo6ZXF1YWxfdG88S2V5PiwKKyAgICAgICAgICB0eXBlbmFtZSBBbGxvYyA9IHN0ZDo6YWxsb2NhdG9yPCBzdGQ6OnBhaXI8Y29uc3QgS2V5LCBEYXRhPiA+ID4KK2NsYXNzIGhhc2hfbWFwCisgICAgOiBwdWJsaWMgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFOjpHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1M8CisgICAgICAgICAgS2V5LCBEYXRhLCBJbnRlcm5hbEhhc2hDb21wYXJlPEtleSwgSGFzaEZjbiwgRXF1YWxLZXk+LCBBbGxvYz4geworICB0eXBlZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRTo6R09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTPAorICAgICAgS2V5LCBEYXRhLCBJbnRlcm5hbEhhc2hDb21wYXJlPEtleSwgSGFzaEZjbiwgRXF1YWxLZXk+LCBBbGxvYz4gQmFzZUNsYXNzOworCisgcHVibGljOgorICBoYXNoX21hcChpbnQgYSA9IDAsIGNvbnN0IEhhc2hGY24mIGIgPSBIYXNoRmNuKCksCisgICAgICAgICAgIGNvbnN0IEVxdWFsS2V5JiBjID0gRXF1YWxLZXkoKSwgY29uc3QgQWxsb2MmIGQgPSBBbGxvYygpKQorICAgICAgOiBCYXNlQ2xhc3MoSW50ZXJuYWxIYXNoQ29tcGFyZTxLZXksIEhhc2hGY24sIEVxdWFsS2V5PihiLCBjKSwgZCkge30KKworICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KIH07CiAKLXRlbXBsYXRlIDx0eXBlbmFtZSBLZXksCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+ID4KK2NsYXNzIGhhc2hfc2V0CisgICAgOiBwdWJsaWMgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFOjpHT09HTEVfUFJPVE9CVUZfSEFTSF9TRVRfQ0xBU1M8CisgICAgICAgICAgS2V5LCBJbnRlcm5hbEhhc2hDb21wYXJlPEtleSwgSGFzaEZjbiwgRXF1YWxLZXk+ID4geworIHB1YmxpYzoKKyAgaGFzaF9zZXQoaW50ID0gMCkge30KKworICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KK307CisKKyNlbHNlICAvLyBHT09HTEVfUFJPVE9CVUZfQ09OVEFJTkVSU19ORUVEX0hBU0hfQ09NUEFSRQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBEYXRhLAogICAgICAgICAgIHR5cGVuYW1lIEhhc2hGY24gPSBoYXNoPEtleT4sCi0gICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBpbnQgPgotY2xhc3MgaGFzaF9zZXQgOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2hfc2V0PAotICAgIEtleSwgSGFzaEZjbj4geworICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEFsbG9jID0gc3RkOjphbGxvY2F0b3I8IHN0ZDo6cGFpcjxjb25zdCBLZXksIERhdGE+ID4gPgorY2xhc3MgaGFzaF9tYXAKKyAgICA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6OkdPT0dMRV9QUk9UT0JVRl9IQVNIX01BUF9DTEFTUzwKKyAgICAgICAgICBLZXksIERhdGEsIEhhc2hGY24sIEVxdWFsS2V5LCBBbGxvYz4geworICB0eXBlZGVmIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRTo6R09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTPAorICAgICAgS2V5LCBEYXRhLCBIYXNoRmNuLCBFcXVhbEtleSwgQWxsb2M+IEJhc2VDbGFzczsKKworIHB1YmxpYzoKKyAgaGFzaF9tYXAoaW50IGEgPSAwLCBjb25zdCBIYXNoRmNuJiBiID0gSGFzaEZjbigpLAorICAgICAgICAgICBjb25zdCBFcXVhbEtleSYgYyA9IEVxdWFsS2V5KCksCisgICAgICAgICAgIGNvbnN0IEFsbG9jJiBkID0gQWxsb2MoKSkgOiBCYXNlQ2xhc3MoYSwgYiwgYywgZCkge30KKworICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KIH07CiAKLSNlbHNlCit0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5LCB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAorICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+ID4KK2NsYXNzIGhhc2hfc2V0CisgICAgOiBwdWJsaWMgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFOjpHT09HTEVfUFJPVE9CVUZfSEFTSF9TRVRfQ0xBU1M8CisgICAgICAgICAgS2V5LCBIYXNoRmNuLCBFcXVhbEtleT4geworIHB1YmxpYzoKKyAgaGFzaF9zZXQoaW50ID0gMCkge30KKworICBIYXNoRmNuIGhhc2hfZnVuY3Rpb24oKSBjb25zdCB7IHJldHVybiBIYXNoRmNuKCk7IH0KK307CisjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9DT05UQUlORVJTX05FRURfSEFTSF9DT01QQVJFCisKKyNlbHNlICAvLyBkZWZpbmVkKF9NU0NfVkVSKSAmJiAhZGVmaW5lZChfU1RMUE9SVF9WRVJTSU9OKQogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5Pgotc3RydWN0IGhhc2ggOiBwdWJsaWMgSEFTSF9OQU1FU1BBQ0U6Omhhc2g8S2V5PiB7CitzdHJ1Y3QgaGFzaCA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6Omhhc2g8S2V5PiB7CiB9OwogCiB0ZW1wbGF0ZSA8dHlwZW5hbWUgS2V5PgpAQCAtMTU4LDIxICszNzEsNDMgQEAKICAgfQogfTsKIAordGVtcGxhdGU8Pgorc3RydWN0IGhhc2g8Ym9vbD4geworICBzaXplX3Qgb3BlcmF0b3IoKShib29sIHgpIGNvbnN0IHsKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c2l6ZV90Pih4KTsKKyAgfQorfTsKKwogdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgRGF0YSwKICAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAotICAgICAgICAgIHR5cGVuYW1lIEVxdWFsS2V5ID0gc3RkOjplcXVhbF90bzxLZXk+ID4KLWNsYXNzIGhhc2hfbWFwIDogcHVibGljIEhBU0hfTkFNRVNQQUNFOjpIQVNIX01BUF9DTEFTUzwKLSAgICBLZXksIERhdGEsIEhhc2hGY24sIEVxdWFsS2V5PiB7CisgICAgICAgICAgdHlwZW5hbWUgRXF1YWxLZXkgPSBzdGQ6OmVxdWFsX3RvPEtleT4sCisgICAgICAgICAgdHlwZW5hbWUgQWxsb2MgPSBzdGQ6OmFsbG9jYXRvcjwgc3RkOjpwYWlyPGNvbnN0IEtleSwgRGF0YT4gPiA+CitjbGFzcyBoYXNoX21hcAorICAgIDogcHVibGljIEdPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRTo6R09PR0xFX1BST1RPQlVGX0hBU0hfTUFQX0NMQVNTPAorICAgICAgICAgIEtleSwgRGF0YSwgSGFzaEZjbiwgRXF1YWxLZXksIEFsbG9jPiB7CisgIHR5cGVkZWYgR09PR0xFX1BST1RPQlVGX0hBU0hfTkFNRVNQQUNFOjpHT09HTEVfUFJPVE9CVUZfSEFTSF9NQVBfQ0xBU1M8CisgICAgICBLZXksIERhdGEsIEhhc2hGY24sIEVxdWFsS2V5LCBBbGxvYz4gQmFzZUNsYXNzOworCisgcHVibGljOgorICBoYXNoX21hcChpbnQgYSA9IDAsIGNvbnN0IEhhc2hGY24mIGIgPSBIYXNoRmNuKCksCisgICAgICAgICAgIGNvbnN0IEVxdWFsS2V5JiBjID0gRXF1YWxLZXkoKSwKKyAgICAgICAgICAgY29uc3QgQWxsb2MmIGQgPSBBbGxvYygpKSA6IEJhc2VDbGFzcyhhLCBiLCBjLCBkKSB7fQorCisgIEhhc2hGY24gaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hGY24oKTsgfQogfTsKIAotdGVtcGxhdGUgPHR5cGVuYW1lIEtleSwKLSAgICAgICAgICB0eXBlbmFtZSBIYXNoRmNuID0gaGFzaDxLZXk+LAordGVtcGxhdGUgPHR5cGVuYW1lIEtleSwgdHlwZW5hbWUgSGFzaEZjbiA9IGhhc2g8S2V5PiwKICAgICAgICAgICB0eXBlbmFtZSBFcXVhbEtleSA9IHN0ZDo6ZXF1YWxfdG88S2V5PiA+Ci1jbGFzcyBoYXNoX3NldCA6IHB1YmxpYyBIQVNIX05BTUVTUEFDRTo6SEFTSF9TRVRfQ0xBU1M8Ci0gICAgS2V5LCBIYXNoRmNuLCBFcXVhbEtleT4geworY2xhc3MgaGFzaF9zZXQKKyAgICA6IHB1YmxpYyBHT09HTEVfUFJPVE9CVUZfSEFTSF9OQU1FU1BBQ0U6OkdPT0dMRV9QUk9UT0JVRl9IQVNIX1NFVF9DTEFTUzwKKyAgICAgICAgICBLZXksIEhhc2hGY24sIEVxdWFsS2V5PiB7CisgcHVibGljOgorICBoYXNoX3NldChpbnQgPSAwKSB7fQorCisgIEhhc2hGY24gaGFzaF9mdW5jdGlvbigpIGNvbnN0IHsgcmV0dXJuIEhhc2hGY24oKTsgfQogfTsKIAotI2VuZGlmCisjZW5kaWYgIC8vICFHT09HTEVfUFJPVE9CVUZfTUlTU0lOR19IQVNICiAKIHRlbXBsYXRlIDw+CiBzdHJ1Y3QgaGFzaDxzdHJpbmc+IHsKQEAgLTE4Miw3ICs0MTcsNyBAQAogCiAgIHN0YXRpYyBjb25zdCBzaXplX3QgYnVja2V0X3NpemUgPSA0OwogICBzdGF0aWMgY29uc3Qgc2l6ZV90IG1pbl9idWNrZXRzID0gODsKLSAgaW5saW5lIHNpemVfdCBvcGVyYXRvcigpKGNvbnN0IHN0cmluZyYgYSwgY29uc3Qgc3RyaW5nJiBiKSBjb25zdCB7CisgIGlubGluZSBib29sIG9wZXJhdG9yKCkoY29uc3Qgc3RyaW5nJiBhLCBjb25zdCBzdHJpbmcmIGIpIGNvbnN0IHsKICAgICByZXR1cm4gYSA8IGI7CiAgIH0KIH07CkBAIC0yMDAsNyArNDM1LDcgQEAKIAogICBzdGF0aWMgY29uc3Qgc2l6ZV90IGJ1Y2tldF9zaXplID0gNDsKICAgc3RhdGljIGNvbnN0IHNpemVfdCBtaW5fYnVja2V0cyA9IDg7Ci0gIGlubGluZSBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBwYWlyPEZpcnN0LCBTZWNvbmQ+JiBhLAorICBpbmxpbmUgYm9vbCBvcGVyYXRvcigpKGNvbnN0IHBhaXI8Rmlyc3QsIFNlY29uZD4mIGEsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBwYWlyPEZpcnN0LCBTZWNvbmQ+JiBiKSBjb25zdCB7CiAgICAgcmV0dXJuIGEgPCBiOwogICB9CkBAIC0yMTAsNyArNDQ1LDExIEBACiAvLyBsaWJyYXJ5PyAgOiggKQogc3RydWN0IHN0cmVxIHsKICAgaW5saW5lIGJvb2wgb3BlcmF0b3IoKShjb25zdCBjaGFyKiBhLCBjb25zdCBjaGFyKiBiKSBjb25zdCB7CisjaWZuZGVmIFNUQVJCT0FSRAogICAgIHJldHVybiBzdHJjbXAoYSwgYikgPT0gMDsKKyNlbHNlCisgICAgcmV0dXJuIFNiU3RyaW5nQ29tcGFyZUFsbChhLCBiKSA9PSAwOworI2VuZGlmICAvLyBTVEFSQk9BUkQKICAgfQogfTsKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9pbnQxMjguaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4LmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2ludDEyOF91bml0dGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvaW50MTI4X3VuaXR0ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hY3Jvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hY3Jvcy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYWNyb3MuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcC11dGlsLmgKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IGY1YzlkNmIuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwLXV0aWwuaAorKysgL2Rldi9udWxsCkBAIC0xLDExOSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBmcm9tIGdvb2dsZTMvdXRpbC9ndGwvbWFwLXV0aWwuaAotLy8gQXV0aG9yOiBBbnRvbiBDYXJ2ZXIKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfTUFQX1VUSUxfSF9fCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19NQVBfVVRJTF9IX18KLQotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KLQotbmFtZXNwYWNlIGdvb2dsZSB7Ci1uYW1lc3BhY2UgcHJvdG9idWYgewotCi0vLyBQZXJmb3JtIGEgbG9va3VwIGluIGEgbWFwIG9yIGhhc2hfbWFwLgotLy8gSWYgdGhlIGtleSBpcyBwcmVzZW50IGluIHRoZSBtYXAgdGhlbiB0aGUgdmFsdWUgYXNzb2NpYXRlZCB3aXRoIHRoYXQKLS8vIGtleSBpcyByZXR1cm5lZCwgb3RoZXJ3aXNlIHRoZSB2YWx1ZSBwYXNzZWQgYXMgYSBkZWZhdWx0IGlzIHJldHVybmVkLgotdGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Ci1jb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYKLUZpbmRXaXRoRGVmYXVsdChjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgIGNvbnN0IHR5cGVuYW1lIENvbGxlY3Rpb246OnZhbHVlX3R5cGU6OmZpcnN0X3R5cGUmIGtleSwKLSAgICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSYgdmFsdWUpIHsKLSAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKLSAgaWYgKGl0ID09IGNvbGxlY3Rpb24uZW5kKCkpIHsKLSAgICByZXR1cm4gdmFsdWU7Ci0gIH0KLSAgcmV0dXJuIGl0LT5zZWNvbmQ7Ci19Ci0KLS8vIFBlcmZvcm0gYSBsb29rdXAgaW4gYSBtYXAgb3IgaGFzaF9tYXAuCi0vLyBJZiB0aGUga2V5IGlzIHByZXNlbnQgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHJldHVybmVkLAotLy8gb3RoZXJ3aXNlIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgotdGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Ci1jb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZSoKLUZpbmRPck51bGwoY29uc3QgQ29sbGVjdGlvbiYgY29sbGVjdGlvbiwKLSAgICAgICAgICAgY29uc3QgdHlwZW5hbWUgQ29sbGVjdGlvbjo6dmFsdWVfdHlwZTo6Zmlyc3RfdHlwZSYga2V5KSB7Ci0gIHR5cGVuYW1lIENvbGxlY3Rpb246OmNvbnN0X2l0ZXJhdG9yIGl0ID0gY29sbGVjdGlvbi5maW5kKGtleSk7Ci0gIGlmIChpdCA9PSBjb2xsZWN0aW9uLmVuZCgpKSB7Ci0gICAgcmV0dXJuIDA7Ci0gIH0KLSAgcmV0dXJuICZpdC0+c2Vjb25kOwotfQotCi0vLyBQZXJmb3JtIGEgbG9va3VwIGluIGEgbWFwIG9yIGhhc2hfbWFwIHdob3NlIHZhbHVlcyBhcmUgcG9pbnRlcnMuCi0vLyBJZiB0aGUga2V5IGlzIHByZXNlbnQgYSBjb25zdCBwb2ludGVyIHRvIHRoZSBhc3NvY2lhdGVkIHZhbHVlIGlzIHJldHVybmVkLAotLy8gb3RoZXJ3aXNlIGEgTlVMTCBwb2ludGVyIGlzIHJldHVybmVkLgotLy8gVGhpcyBmdW5jdGlvbiBkb2VzIG5vdCBkaXN0aW5ndWlzaCBiZXR3ZWVuIGEgbWlzc2luZyBrZXkgYW5kIGEga2V5IG1hcHBlZAotLy8gdG8gYSBOVUxMIHZhbHVlLgotdGVtcGxhdGUgPGNsYXNzIENvbGxlY3Rpb24+Ci1jb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpzZWNvbmRfdHlwZQotRmluZFB0ck9yTnVsbChjb25zdCBDb2xsZWN0aW9uJiBjb2xsZWN0aW9uLAotICAgICAgICAgICAgICBjb25zdCB0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlOjpmaXJzdF90eXBlJiBrZXkpIHsKLSAgdHlwZW5hbWUgQ29sbGVjdGlvbjo6Y29uc3RfaXRlcmF0b3IgaXQgPSBjb2xsZWN0aW9uLmZpbmQoa2V5KTsKLSAgaWYgKGl0ID09IGNvbGxlY3Rpb24uZW5kKCkpIHsKLSAgICByZXR1cm4gMDsKLSAgfQotICByZXR1cm4gaXQtPnNlY29uZDsKLX0KLQotLy8gQ2hhbmdlIHRoZSB2YWx1ZSBhc3NvY2lhdGVkIHdpdGggYSBwYXJ0aWN1bGFyIGtleSBpbiBhIG1hcCBvciBoYXNoX21hcC4KLS8vIElmIHRoZSBrZXkgaXMgbm90IHByZXNlbnQgaW4gdGhlIG1hcCB0aGUga2V5IGFuZCB2YWx1ZSBhcmUgaW5zZXJ0ZWQsCi0vLyBvdGhlcndpc2UgdGhlIHZhbHVlIGlzIHVwZGF0ZWQgdG8gYmUgYSBjb3B5IG9mIHRoZSB2YWx1ZSBwcm92aWRlZC4KLS8vIFRydWUgaW5kaWNhdGVzIHRoYXQgYW4gaW5zZXJ0IHRvb2sgcGxhY2UsIGZhbHNlIGluZGljYXRlcyBhbiB1cGRhdGUuCi10ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KLWJvb2wgSW5zZXJ0T3JVcGRhdGUoQ29sbGVjdGlvbiAqIGNvbnN0IGNvbGxlY3Rpb24sCi0gICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBrZXksIGNvbnN0IFZhbHVlJiB2YWx1ZSkgewotICBwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQotICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKLSAgaWYgKCFyZXQuc2Vjb25kKSB7Ci0gICAgLy8gdXBkYXRlCi0gICAgcmV0LmZpcnN0LT5zZWNvbmQgPSB2YWx1ZTsKLSAgICByZXR1cm4gZmFsc2U7Ci0gIH0KLSAgcmV0dXJuIHRydWU7Ci19Ci0KLS8vIEluc2VydCBhIG5ldyBrZXkgYW5kIHZhbHVlIGludG8gYSBtYXAgb3IgaGFzaF9tYXAuCi0vLyBJZiB0aGUga2V5IGlzIG5vdCBwcmVzZW50IGluIHRoZSBtYXAgdGhlIGtleSBhbmQgdmFsdWUgYXJlCi0vLyBpbnNlcnRlZCwgb3RoZXJ3aXNlIG5vdGhpbmcgaGFwcGVucy4gVHJ1ZSBpbmRpY2F0ZXMgdGhhdCBhbiBpbnNlcnQKLS8vIHRvb2sgcGxhY2UsIGZhbHNlIGluZGljYXRlcyB0aGUga2V5IHdhcyBhbHJlYWR5IHByZXNlbnQuCi10ZW1wbGF0ZSA8Y2xhc3MgQ29sbGVjdGlvbiwgY2xhc3MgS2V5LCBjbGFzcyBWYWx1ZT4KLWJvb2wgSW5zZXJ0SWZOb3RQcmVzZW50KENvbGxlY3Rpb24gKiBjb25zdCBjb2xsZWN0aW9uLAotICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgS2V5JiBrZXksIGNvbnN0IFZhbHVlJiB2YWx1ZSkgewotICBwYWlyPHR5cGVuYW1lIENvbGxlY3Rpb246Oml0ZXJhdG9yLCBib29sPiByZXQgPQotICAgIGNvbGxlY3Rpb24tPmluc2VydCh0eXBlbmFtZSBDb2xsZWN0aW9uOjp2YWx1ZV90eXBlKGtleSwgdmFsdWUpKTsKLSAgcmV0dXJuIHJldC5zZWNvbmQ7Ci19Ci0KLX0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgotfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQotCi0jZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19NQVBfVVRJTF9IX18KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hcF91dGlsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWFwX3V0aWwuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aGxpbWl0cy5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzAwMTdhNAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuaApAQCAtMCwwICsxLDI4MiBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIEFsbCBSaWdodHMgUmVzZXJ2ZWQuCisvLworLy8gQXV0aG9yOiBNYXhpbSBMaWZhbnRzZXYKKy8vCisvLyBVc2VmdWwgaW50ZWdlciBhbmQgZmxvYXRpbmcgcG9pbnQgbGltaXRzIGFuZCB0eXBlIHRyYWl0cy4KKy8vCisvLyBUaGlzIHBhcnRpYWxseSByZXBsYWNlcy9kdXBsaWN0ZXMgbnVtZXJpY19saW1pdHM8PiBmcm9tIDxsaW1pdHM+LgorLy8gV2UgZ2V0IGEgR29vZ2xlLXN0eWxlIGNsYXNzIHRoYXQgd2UgaGF2ZSBhIGdyZWF0ZXIgY29udHJvbCBvdmVyCisvLyBhbmQgdGh1cyBjYW4gYWRkIG5ldyBmZWF0dXJlcyB0byBpdCBvciBmaXggd2hhdGV2ZXIgaGFwcGVucyB0byBiZSBicm9rZW4gaW4KKy8vIG51bWVyaWNfbGltaXRzIGZvciB0aGUgY29tcGlsZXJzIHdlIHVzZS4KKy8vCisKKyNpZm5kZWYgVVRJTF9NQVRIX01BVEhMSU1JVFNfSF9fCisjZGVmaW5lIFVUSUxfTUFUSF9NQVRITElNSVRTX0hfXworCisvLyA8bWF0aC5oPiBsYWNrcyBhIGxvdCBvZiBwcm90b3R5cGVzLiBIb3dldmVyLCB0aGlzIGZpbGUgbmVlZHMgPG1hdGguaD4gdG8KKy8vIGFjY2VzcyBvbGQtZmFzaGlvbmVkIGlzaW5mIGV0IGFsLiBFdmVuIHdvcnNlIG1vcmU6IHRoaXMgZmlsZSBtdXN0IG5vdAorLy8gaW5jbHVkZSA8Y21hdGg+IGJlY2F1c2UgdGhhdCBicmVha3MgdGhlIGRlZmluaXRpb24gb2YgaXNpbmYgd2l0aCBnY2MgNC45LgorLy8KKy8vIFRPRE8obWVjKTogYWZ0ZXIgQysrMTEgZXZlcnl3aGVyZSwgdXNlIDxjbWF0aD4gYW5kIHN0ZDo6aXNpbmYgaW4gdGhpcyBmaWxlLgorI2luY2x1ZGUgPG1hdGguaD4KKworI2lmbmRlZiBTVEFSQk9BUkQKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbmRpZiAgLy8gU1RBUkJPQVJECisKKyNpbmNsdWRlIDxjZmxvYXQ+CisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKworLy8gVXNlZnVsIGludGVnZXIgYW5kIGZsb2F0aW5nIHBvaW50IGxpbWl0cyBhbmQgdHlwZSB0cmFpdHMuCisvLyBUaGlzIGlzIGp1c3QgZm9yIHRoZSBkb2N1bWVudGF0aW9uOworLy8gcmVhbCBtZW1iZXJzIGFyZSBkZWZpbmVkIGluIG91ciBzcGVjaWFsaXphdGlvbnMgYmVsb3cuCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7Cit0ZW1wbGF0ZTx0eXBlbmFtZSBUPiBzdHJ1Y3QgTWF0aExpbWl0cyB7CisgIC8vIFR5cGUgbmFtZS4KKyAgdHlwZWRlZiBUIFR5cGU7CisgIC8vIFVuc2lnbmVkIHZlcnNpb24gb2YgdGhlIFR5cGUgd2l0aCB0aGUgc2FtZSBieXRlIHNpemUuCisgIC8vIFNhbWUgYXMgVHlwZSBmb3IgZmxvYXRpbmcgcG9pbnQgYW5kIHVuc2lnbmVkIHR5cGVzLgorICB0eXBlZGVmIFQgVW5zaWduZWRUeXBlOworICAvLyBJZiB0aGUgdHlwZSBzdXBwb3J0cyBuZWdhdGl2ZSB2YWx1ZXMuCisgIHN0YXRpYyBjb25zdCBib29sIGtJc1NpZ25lZDsKKyAgLy8gSWYgdGhlIHR5cGUgc3VwcG9ydHMgb25seSBpbnRlZ2VyIHZhbHVlcy4KKyAgc3RhdGljIGNvbnN0IGJvb2wga0lzSW50ZWdlcjsKKyAgLy8gTWFnbml0dWRlLXdpc2Ugc21hbGxlc3QgcmVwcmVzZW50YWJsZSBwb3NpdGl2ZSB2YWx1ZS4KKyAgc3RhdGljIGNvbnN0IFR5cGUga1Bvc01pbjsKKyAgLy8gTWFnbml0dWRlLXdpc2UgbGFyZ2VzdCByZXByZXNlbnRhYmxlIHBvc2l0aXZlIHZhbHVlLgorICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWF4OworICAvLyBTbWFsbGVzdCByZXByZXNlbnRhYmxlIHZhbHVlLgorICBzdGF0aWMgY29uc3QgVHlwZSBrTWluOworICAvLyBMYXJnZXN0IHJlcHJlc2VudGFibGUgdmFsdWUuCisgIHN0YXRpYyBjb25zdCBUeXBlIGtNYXg7CisgIC8vIE1hZ25pdHVkZS13aXNlIHNtYWxsZXN0IHJlcHJlc2VudGFibGUgbmVnYXRpdmUgdmFsdWUuCisgIC8vIFByZXNlbnQgb25seSBpZiBrSXNTaWduZWQuCisgIHN0YXRpYyBjb25zdCBUeXBlIGtOZWdNaW47CisgIC8vIE1hZ25pdHVkZS13aXNlIGxhcmdlc3QgcmVwcmVzZW50YWJsZSBuZWdhdGl2ZSB2YWx1ZS4KKyAgLy8gUHJlc2VudCBvbmx5IGlmIGtJc1NpZ25lZC4KKyAgc3RhdGljIGNvbnN0IFR5cGUga05lZ01heDsKKyAgLy8gU21hbGxlc3QgaW50ZWdlciB4IHN1Y2ggdGhhdCAxMF54IGlzIHJlcHJlc2VudGFibGUuCisgIHN0YXRpYyBjb25zdCBpbnQga01pbjEwRXhwOworICAvLyBMYXJnZXN0IGludGVnZXIgeCBzdWNoIHRoYXQgMTBeeCBpcyByZXByZXNlbnRhYmxlLgorICBzdGF0aWMgY29uc3QgaW50IGtNYXgxMEV4cDsKKyAgLy8gU21hbGxlc3QgcG9zaXRpdmUgdmFsdWUgc3VjaCB0aGF0IFR5cGUoMSkgKyBrRXBzaWxvbiAhPSBUeXBlKDEpCisgIHN0YXRpYyBjb25zdCBUeXBlIGtFcHNpbG9uOworICAvLyBUeXBpY2FsIHJvdW5kaW5nIGVycm9yIHRoYXQgaXMgZW5vdWdoIHRvIGNvdmVyCisgIC8vIGEgZmV3IHNpbXBsZSBmbG9hdGluZy1wb2ludCBvcGVyYXRpb25zLgorICAvLyBTbGlnaHRseSBsYXJnZXIgdGhhbiBrRXBzaWxvbiB0byBhY2NvdW50IGZvciBhIGZldyByb3VuZGluZyBlcnJvcnMuCisgIC8vIElzIHplcm8gaWYga0lzSW50ZWdlci4KKyAgc3RhdGljIGNvbnN0IFR5cGUga1N0ZEVycm9yOworICAvLyBOdW1iZXIgb2YgZGVjaW1hbCBkaWdpdHMgb2YgbWFudGlzc2EgcHJlY2lzaW9uLgorICAvLyBQcmVzZW50IG9ubHkgaWYgIWtJc0ludGVnZXIuCisgIHN0YXRpYyBjb25zdCBpbnQga1ByZWNpc2lvbkRpZ2l0czsKKyAgLy8gTm90IGEgbnVtYmVyLCBpLmUuIHJlc3VsdCBvZiAwLzAuCisgIC8vIFByZXNlbnQgb25seSBpZiAha0lzSW50ZWdlci4KKyAgc3RhdGljIGNvbnN0IFR5cGUga05hTjsKKyAgLy8gUG9zaXRpdmUgaW5maW5pdHksIGkuZS4gcmVzdWx0IG9mIDEvMC4KKyAgLy8gUHJlc2VudCBvbmx5IGlmICFrSXNJbnRlZ2VyLgorICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zSW5mOworICAvLyBOZWdhdGl2ZSBpbmZpbml0eSwgaS5lLiByZXN1bHQgb2YgLTEvMC4KKyAgLy8gUHJlc2VudCBvbmx5IGlmICFrSXNJbnRlZ2VyLgorICBzdGF0aWMgY29uc3QgVHlwZSBrTmVnSW5mOworCisgIC8vIE5PVEU6IFNwZWNpYWwgZmxvYXRpbmcgcG9pbnQgdmFsdWVzIGJlaGF2ZQorICAvLyBpbiBhIHNwZWNpYWwgKGJ1dCBtYXRoZW1hdGljYWxseS1sb2dpY2FsKSB3YXkKKyAgLy8gaW4gdGVybXMgb2YgKGluKWVxdWFsdHkgY29tcGFyaXNvbiBhbmQgbWF0aGVtYXRpY2FsIG9wZXJhdGlvbnMKKyAgLy8gLS0gc2VlIG91dCB1bml0dGVzdCBmb3IgZXhhbXBsZXMuCisKKyAgLy8gU3BlY2lhbCBmbG9hdGluZyBwb2ludCB2YWx1ZSB0ZXN0ZXJzLgorICAvLyBQcmVzZW50IGluIGludGVnZXIgdHlwZXMgZm9yIGNvbnZlbmllbmNlLgorICBzdGF0aWMgYm9vbCBJc0Zpbml0ZShjb25zdCBUeXBlIHgpOworICBzdGF0aWMgYm9vbCBJc05hTihjb25zdCBUeXBlIHgpOworICBzdGF0aWMgYm9vbCBJc0luZihjb25zdCBUeXBlIHgpOworICBzdGF0aWMgYm9vbCBJc1Bvc0luZihjb25zdCBUeXBlIHgpOworICBzdGF0aWMgYm9vbCBJc05lZ0luZihjb25zdCBUeXBlIHgpOworfTsKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAvLworCisvLyBBbGwgI2RlZmluZS1zIGJlbG93IGFyZSBzaW1wbHkgdG8gcmVmYWN0b3IgdGhlIGRlY2xhcmF0aW9ucyBvZgorLy8gTWF0aExpbWl0cyB0ZW1wbGF0ZSBzcGVjaWFsaXphdGlvbnMuCisvLyBUaGV5IGFyZSBhbGwgI3VuZGVmLWluZWQgYmVsb3cuCisKKy8vIFRoZSBob29wLWp1bXBpbmcgaW4gKl9JTlRfKE1BWHxNSU4pIGJlbG93IGlzIHNvIHRoYXQgdGhlIGNvbXBpbGVyIGRvZXMgbm90CisvLyBnZXQgYW4gb3ZlcmZsb3cgd2hpbGUgY29tcHV0aW5nIHRoZSBjb25zdGFudHMuCisKKyNkZWZpbmUgU0lHTkVEX0lOVF9NQVgoVHlwZSkgXAorICAoKChUeXBlKDEpIDw8IChzaXplb2YoVHlwZSkqOCAtIDIpKSAtIDEpICsgKFR5cGUoMSkgPDwgKHNpemVvZihUeXBlKSo4IC0gMikpKQorCisjZGVmaW5lIFNJR05FRF9JTlRfTUlOKFR5cGUpIFwKKyAgKC0oVHlwZSgxKSA8PCAoc2l6ZW9mKFR5cGUpKjggLSAyKSkgLSAoVHlwZSgxKSA8PCAoc2l6ZW9mKFR5cGUpKjggLSAyKSkpCisKKyNkZWZpbmUgVU5TSUdORURfSU5UX01BWChUeXBlKSBcCisgICgoKFR5cGUoMSkgPDwgKHNpemVvZihUeXBlKSo4IC0gMSkpIC0gMSkgKyAoVHlwZSgxKSA8PCAoc2l6ZW9mKFR5cGUpKjggLSAxKSkpCisKKy8vIENvbXBpbGUtdGltZSBzZWxlY3RlZCBsb2cxMC1yZWxhdGVkIGNvbnN0YW50cyBmb3IgaW50ZWdlciB0eXBlcy4KKyNkZWZpbmUgU0lHTkVEX01BWF8xMF9FWFAoVHlwZSkgXAorICAoc2l6ZW9mKFR5cGUpID09IDEgPyAyIDogKCBcCisgICAgc2l6ZW9mKFR5cGUpID09IDIgPyA0IDogKCBcCisgICAgICBzaXplb2YoVHlwZSkgPT0gNCA/IDkgOiAoIFwKKyAgICAgICAgc2l6ZW9mKFR5cGUpID09IDggPyAxOCA6IC0xKSkpKQorCisjZGVmaW5lIFVOU0lHTkVEX01BWF8xMF9FWFAoVHlwZSkgXAorICAoc2l6ZW9mKFR5cGUpID09IDEgPyAyIDogKCBcCisgICAgc2l6ZW9mKFR5cGUpID09IDIgPyA0IDogKCBcCisgICAgICBzaXplb2YoVHlwZSkgPT0gNCA/IDkgOiAoIFwKKyAgICAgICAgc2l6ZW9mKFR5cGUpID09IDggPyAxOSA6IC0xKSkpKQorCisjZGVmaW5lIERFQ0xfSU5UX0xJTUlUX0ZVTkNTIFwKKyAgc3RhdGljIGJvb2wgSXNGaW5pdGUoY29uc3QgVHlwZSAvKngqLykgeyByZXR1cm4gdHJ1ZTsgfSBcCisgIHN0YXRpYyBib29sIElzTmFOKGNvbnN0IFR5cGUgLyp4Ki8pIHsgcmV0dXJuIGZhbHNlOyB9IFwKKyAgc3RhdGljIGJvb2wgSXNJbmYoY29uc3QgVHlwZSAvKngqLykgeyByZXR1cm4gZmFsc2U7IH0gXAorICBzdGF0aWMgYm9vbCBJc1Bvc0luZihjb25zdCBUeXBlIC8qeCovKSB7IHJldHVybiBmYWxzZTsgfSBcCisgIHN0YXRpYyBib29sIElzTmVnSW5mKGNvbnN0IFR5cGUgLyp4Ki8pIHsgcmV0dXJuIGZhbHNlOyB9CisKKyNkZWZpbmUgREVDTF9TSUdORURfSU5UX0xJTUlUUyhJbnRUeXBlLCBVbnNpZ25lZEludFR5cGUpIFwKK3RlbXBsYXRlPD4gXAorc3RydWN0IExJQlBST1RPQlVGX0VYUE9SVCBNYXRoTGltaXRzPEludFR5cGU+IHsgXAorICB0eXBlZGVmIEludFR5cGUgVHlwZTsgXAorICB0eXBlZGVmIFVuc2lnbmVkSW50VHlwZSBVbnNpZ25lZFR5cGU7IFwKKyAgc3RhdGljIGNvbnN0IGJvb2wga0lzU2lnbmVkID0gdHJ1ZTsgXAorICBzdGF0aWMgY29uc3QgYm9vbCBrSXNJbnRlZ2VyID0gdHJ1ZTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWluID0gMTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWF4ID0gU0lHTkVEX0lOVF9NQVgoVHlwZSk7IFwKKyAgc3RhdGljIGNvbnN0IFR5cGUga01pbiA9IFNJR05FRF9JTlRfTUlOKFR5cGUpOyBcCisgIHN0YXRpYyBjb25zdCBUeXBlIGtNYXggPSBrUG9zTWF4OyBcCisgIHN0YXRpYyBjb25zdCBUeXBlIGtOZWdNaW4gPSAtMTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrTmVnTWF4ID0ga01pbjsgXAorICBzdGF0aWMgY29uc3QgaW50IGtNaW4xMEV4cCA9IDA7IFwKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4MTBFeHAgPSBTSUdORURfTUFYXzEwX0VYUChUeXBlKTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrRXBzaWxvbiA9IDE7IFwKKyAgc3RhdGljIGNvbnN0IFR5cGUga1N0ZEVycm9yID0gMDsgXAorICBERUNMX0lOVF9MSU1JVF9GVU5DUyBcCit9OworCisjZGVmaW5lIERFQ0xfVU5TSUdORURfSU5UX0xJTUlUUyhJbnRUeXBlKSBcCit0ZW1wbGF0ZTw+IFwKK3N0cnVjdCBMSUJQUk9UT0JVRl9FWFBPUlQgTWF0aExpbWl0czxJbnRUeXBlPiB7IFwKKyAgdHlwZWRlZiBJbnRUeXBlIFR5cGU7IFwKKyAgdHlwZWRlZiBJbnRUeXBlIFVuc2lnbmVkVHlwZTsgXAorICBzdGF0aWMgY29uc3QgYm9vbCBrSXNTaWduZWQgPSBmYWxzZTsgXAorICBzdGF0aWMgY29uc3QgYm9vbCBrSXNJbnRlZ2VyID0gdHJ1ZTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWluID0gMTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrUG9zTWF4ID0gVU5TSUdORURfSU5UX01BWChUeXBlKTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrTWluID0gMDsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrTWF4ID0ga1Bvc01heDsgXAorICBzdGF0aWMgY29uc3QgaW50IGtNaW4xMEV4cCA9IDA7IFwKKyAgc3RhdGljIGNvbnN0IGludCBrTWF4MTBFeHAgPSBVTlNJR05FRF9NQVhfMTBfRVhQKFR5cGUpOyBcCisgIHN0YXRpYyBjb25zdCBUeXBlIGtFcHNpbG9uID0gMTsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrU3RkRXJyb3IgPSAwOyBcCisgIERFQ0xfSU5UX0xJTUlUX0ZVTkNTIFwKK307CisKK0RFQ0xfU0lHTkVEX0lOVF9MSU1JVFMoc2lnbmVkIGNoYXIsIHVuc2lnbmVkIGNoYXIpCitERUNMX1NJR05FRF9JTlRfTElNSVRTKHNpZ25lZCBzaG9ydCBpbnQsIHVuc2lnbmVkIHNob3J0IGludCkKK0RFQ0xfU0lHTkVEX0lOVF9MSU1JVFMoc2lnbmVkIGludCwgdW5zaWduZWQgaW50KQorREVDTF9TSUdORURfSU5UX0xJTUlUUyhzaWduZWQgbG9uZyBpbnQsIHVuc2lnbmVkIGxvbmcgaW50KQorREVDTF9TSUdORURfSU5UX0xJTUlUUyhzaWduZWQgbG9uZyBsb25nIGludCwgdW5zaWduZWQgbG9uZyBsb25nIGludCkKK0RFQ0xfVU5TSUdORURfSU5UX0xJTUlUUyh1bnNpZ25lZCBjaGFyKQorREVDTF9VTlNJR05FRF9JTlRfTElNSVRTKHVuc2lnbmVkIHNob3J0IGludCkKK0RFQ0xfVU5TSUdORURfSU5UX0xJTUlUUyh1bnNpZ25lZCBpbnQpCitERUNMX1VOU0lHTkVEX0lOVF9MSU1JVFModW5zaWduZWQgbG9uZyBpbnQpCitERUNMX1VOU0lHTkVEX0lOVF9MSU1JVFModW5zaWduZWQgbG9uZyBsb25nIGludCkKKworI3VuZGVmIERFQ0xfU0lHTkVEX0lOVF9MSU1JVFMKKyN1bmRlZiBERUNMX1VOU0lHTkVEX0lOVF9MSU1JVFMKKyN1bmRlZiBTSUdORURfSU5UX01BWAorI3VuZGVmIFNJR05FRF9JTlRfTUlOCisjdW5kZWYgVU5TSUdORURfSU5UX01BWAorI3VuZGVmIFNJR05FRF9NQVhfMTBfRVhQCisjdW5kZWYgVU5TSUdORURfTUFYXzEwX0VYUAorI3VuZGVmIERFQ0xfSU5UX0xJTUlUX0ZVTkNTCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KKyNpZmRlZiBXSU4zMiAgLy8gTGFja3MgYnVpbHQtaW4gaXNuYW4oKSBhbmQgaXNpbmYoKQorI2RlZmluZSBERUNMX0ZQX0xJTUlUX0ZVTkNTIFwKKyAgc3RhdGljIGJvb2wgSXNGaW5pdGUoY29uc3QgVHlwZSB4KSB7IHJldHVybiBfZmluaXRlKHgpOyB9IFwKKyAgc3RhdGljIGJvb2wgSXNOYU4oY29uc3QgVHlwZSB4KSB7IHJldHVybiBfaXNuYW4oeCk7IH0gXAorICBzdGF0aWMgYm9vbCBJc0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIChfZnBjbGFzcyh4KSAmIChfRlBDTEFTU19OSU5GIHwgX0ZQQ0xBU1NfUElORikpICE9IDA7IH0gXAorICBzdGF0aWMgYm9vbCBJc1Bvc0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIF9mcGNsYXNzKHgpID09IF9GUENMQVNTX1BJTkY7IH0gXAorICBzdGF0aWMgYm9vbCBJc05lZ0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIF9mcGNsYXNzKHgpID09IF9GUENMQVNTX05JTkY7IH0KKyNlbHNlCisjZGVmaW5lIERFQ0xfRlBfTElNSVRfRlVOQ1MgXAorICBzdGF0aWMgYm9vbCBJc0Zpbml0ZShjb25zdCBUeXBlIHgpIHsgcmV0dXJuICFpc2luZih4KSAgJiYgICFpc25hbih4KTsgfSBcCisgIHN0YXRpYyBib29sIElzTmFOKGNvbnN0IFR5cGUgeCkgeyByZXR1cm4gaXNuYW4oeCk7IH0gXAorICBzdGF0aWMgYm9vbCBJc0luZihjb25zdCBUeXBlIHgpIHsgcmV0dXJuIGlzaW5mKHgpOyB9IFwKKyAgc3RhdGljIGJvb2wgSXNQb3NJbmYoY29uc3QgVHlwZSB4KSB7IHJldHVybiBpc2luZih4KSAgJiYgIHggPiAwOyB9IFwKKyAgc3RhdGljIGJvb2wgSXNOZWdJbmYoY29uc3QgVHlwZSB4KSB7IHJldHVybiBpc2luZih4KSAgJiYgIHggPCAwOyB9CisjZW5kaWYKKworLy8gV2UgY2FuJ3QgcHV0IGZsb2F0aW5nLXBvaW50IGNvbnN0YW50IHZhbHVlcyBpbiB0aGUgaGVhZGVyIGhlcmUgYmVjYXVzZQorLy8gc3VjaCBjb25zdGFudHMgYXJlIG5vdCBjb25zaWRlcmVkIHRvIGJlIHByaW1pdGl2ZS10eXBlIGNvbnN0YW50cyBieSBnY2MuCisvLyBDQVZFQVQ6IEhlbmNlLCB0aGV5IGFyZSBnb2luZyB0byBiZSBpbml0aWFsaXplZCBvbmx5IGR1cmluZworLy8gdGhlIGdsb2JhbCBvYmplY3RzIGNvbnN0cnVjdGlvbiB0aW1lLgorI2RlZmluZSBERUNMX0ZQX0xJTUlUUyhGUF9UeXBlLCBQUkVGSVgpIFwKK3RlbXBsYXRlPD4gXAorc3RydWN0IExJQlBST1RPQlVGX0VYUE9SVCBNYXRoTGltaXRzPEZQX1R5cGU+IHsgXAorICB0eXBlZGVmIEZQX1R5cGUgVHlwZTsgXAorICB0eXBlZGVmIEZQX1R5cGUgVW5zaWduZWRUeXBlOyBcCisgIHN0YXRpYyBjb25zdCBib29sIGtJc1NpZ25lZCA9IHRydWU7IFwKKyAgc3RhdGljIGNvbnN0IGJvb2wga0lzSW50ZWdlciA9IGZhbHNlOyBcCisgIHN0YXRpYyBjb25zdCBUeXBlIGtQb3NNaW47IFwKKyAgc3RhdGljIGNvbnN0IFR5cGUga1Bvc01heDsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrTWluOyBcCisgIHN0YXRpYyBjb25zdCBUeXBlIGtNYXg7IFwKKyAgc3RhdGljIGNvbnN0IFR5cGUga05lZ01pbjsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrTmVnTWF4OyBcCisgIHN0YXRpYyBjb25zdCBpbnQga01pbjEwRXhwID0gUFJFRklYIyNfTUlOXzEwX0VYUDsgXAorICBzdGF0aWMgY29uc3QgaW50IGtNYXgxMEV4cCA9IFBSRUZJWCMjX01BWF8xMF9FWFA7IFwKKyAgc3RhdGljIGNvbnN0IFR5cGUga0Vwc2lsb247IFwKKyAgc3RhdGljIGNvbnN0IFR5cGUga1N0ZEVycm9yOyBcCisgIHN0YXRpYyBjb25zdCBpbnQga1ByZWNpc2lvbkRpZ2l0cyA9IFBSRUZJWCMjX0RJRzsgXAorICBzdGF0aWMgY29uc3QgVHlwZSBrTmFOOyBcCisgIHN0YXRpYyBjb25zdCBUeXBlIGtQb3NJbmY7IFwKKyAgc3RhdGljIGNvbnN0IFR5cGUga05lZ0luZjsgXAorICBERUNMX0ZQX0xJTUlUX0ZVTkNTIFwKK307CisKK0RFQ0xfRlBfTElNSVRTKGZsb2F0LCBGTFQpCitERUNMX0ZQX0xJTUlUUyhkb3VibGUsIERCTCkKK0RFQ0xfRlBfTElNSVRTKGxvbmcgZG91YmxlLCBMREJMKQorCisjdW5kZWYgREVDTF9GUF9MSU1JVFMKKyN1bmRlZiBERUNMX0ZQX0xJTUlUX0ZVTkNTCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gLy8KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQorCisjZW5kaWYgIC8vIFVUSUxfTUFUSF9NQVRITElNSVRTX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRodXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvbWF0aHV0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRodXRpbC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRodXRpbC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9tdXRleC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4LmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4LmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmNjCmluZGV4IGE1ODA4NWIuLjJlMjQ0YTAgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNjYsNiArNjYsMTMgQEAKIAogfSAgLy8gbmFtZXNwYWNlCiAKK3ZvaWQgR29vZ2xlT25jZUluaXQoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgdm9pZCAoKmluaXRfZnVuYykoKSkgeworICBpZiAoaW50ZXJuYWw6OkFjcXVpcmVfTG9hZChvbmNlKSAhPSBPTkNFX1NUQVRFX0RPTkUpIHsKKyAgICBpbnRlcm5hbDo6RnVuY3Rpb25DbG9zdXJlMCBmdW5jKGluaXRfZnVuYywgZmFsc2UpOworICAgIEdvb2dsZU9uY2VJbml0SW1wbChvbmNlLCAmZnVuYyk7CisgIH0KK30KKwogdm9pZCBHb29nbGVPbmNlSW5pdEltcGwoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgQ2xvc3VyZSogY2xvc3VyZSkgewogICBpbnRlcm5hbDo6QXRvbWljV29yZCBzdGF0ZSA9IGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSk7CiAgIC8vIEZhc3QgcGF0aC4gVGhlIHByb3ZpZGVkIGNsb3N1cmUgd2FzIGFscmVhZHkgZXhlY3V0ZWQuCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlLmgKaW5kZXggYzhjYmUyNC4uOTUyMmIyMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2UuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNzksNiArNzksNyBAQAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfT05DRV9IX18KIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9hdG9taWNvcHMuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY2FsbGJhY2suaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewpAQCAtMTE4LDE0ICsxMTksMTEgQEAKIAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT05DRV9JTklUIDo6Z29vZ2xlOjpwcm90b2J1Zjo6T05DRV9TVEFURV9VTklOSVRJQUxJWkVECiAKK0xJQlBST1RPQlVGX0VYUE9SVAogdm9pZCBHb29nbGVPbmNlSW5pdEltcGwoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgQ2xvc3VyZSogY2xvc3VyZSk7CiAKLWlubGluZSB2b2lkIEdvb2dsZU9uY2VJbml0KFByb3RvYnVmT25jZVR5cGUqIG9uY2UsIHZvaWQgKCppbml0X2Z1bmMpKCkpIHsKLSAgaWYgKGludGVybmFsOjpBY3F1aXJlX0xvYWQob25jZSkgIT0gT05DRV9TVEFURV9ET05FKSB7Ci0gICAgaW50ZXJuYWw6OkZ1bmN0aW9uQ2xvc3VyZTAgZnVuYyhpbml0X2Z1bmMsIGZhbHNlKTsKLSAgICBHb29nbGVPbmNlSW5pdEltcGwob25jZSwgJmZ1bmMpOwotICB9Ci19CitMSUJQUk9UT0JVRl9FWFBPUlQKK3ZvaWQgR29vZ2xlT25jZUluaXQoUHJvdG9idWZPbmNlVHlwZSogb25jZSwgdm9pZCAoKmluaXRfZnVuYykoKSk7CiAKIHRlbXBsYXRlIDx0eXBlbmFtZSBBcmc+CiBpbmxpbmUgdm9pZCBHb29nbGVPbmNlSW5pdChQcm90b2J1Zk9uY2VUeXBlKiBvbmNlLCB2b2lkICgqaW5pdF9mdW5jKShBcmcqKSwKQEAgLTEzOCw2ICsxMzYsMjQgQEAKIAogI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfTk9fVEhSRUFEX1NBRkVUWQogCitjbGFzcyBHb29nbGVPbmNlRHluYW1pYyB7CisgcHVibGljOgorICBHb29nbGVPbmNlRHluYW1pYygpIDogc3RhdGVfKEdPT0dMRV9QUk9UT0JVRl9PTkNFX0lOSVQpIHsgfQorCisgIC8vIElmIHRoaXMtPkluaXQoKSBoYXMgbm90IGJlZW4gY2FsbGVkIGJlZm9yZSBieSBhbnkgdGhyZWFkLAorICAvLyBleGVjdXRlICgqZnVuY193aXRoX2FyZykoYXJnKSB0aGVuIHJldHVybi4KKyAgLy8gT3RoZXJ3aXNlLCB3YWl0IHVudGlsIHRoYXQgcHJpb3IgaW52b2NhdGlvbiBoYXMgZmluaXNoZWQKKyAgLy8gZXhlY3V0aW5nIGl0cyBmdW5jdGlvbiwgdGhlbiByZXR1cm4uCisgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+CisgIHZvaWQgSW5pdCh2b2lkICgqZnVuY193aXRoX2FyZykoVCopLCBUKiBhcmcpIHsKKyAgICBHb29nbGVPbmNlSW5pdDxUPigmdGhpcy0+c3RhdGVfLAorICAgICAgICAgICAgICAgICAgICAgIGZ1bmNfd2l0aF9hcmcsCisgICAgICAgICAgICAgICAgICAgICAgYXJnKTsKKyAgfQorIHByaXZhdGU6CisgIFByb3RvYnVmT25jZVR5cGUgc3RhdGVfOworfTsKKwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfREVDTEFSRV9PTkNFKE5BTUUpIFwKICAgOjpnb29nbGU6OnByb3RvYnVmOjpQcm90b2J1Zk9uY2VUeXBlIE5BTUUgPSBHT09HTEVfUFJPVE9CVUZfT05DRV9JTklUCiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9vbmNlX3VuaXR0ZXN0LmNjCmluZGV4IGI4Zjg2YTAuLjM3ZGVmNTggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL29uY2VfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvb25jZV91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDMsNiArNDMsNyBAQAogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7Cit1c2luZyBpbnRlcm5hbDo6TmV3Q2FsbGJhY2s7CiBuYW1lc3BhY2UgewogCiBjbGFzcyBPbmNlSW5pdFRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CkBAIC0xMjcsMTAgKzEyOCwxMSBAQAogICB9OwogCiAgIFRlc3RUaHJlYWQqIFJ1bkluaXRPbmNlSW5OZXdUaHJlYWQoKSB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0VGhyZWFkKE5ld0NhbGxiYWNrKHRoaXMsICZPbmNlSW5pdFRlc3Q6OkluaXRPbmNlKSk7CisgICAgcmV0dXJuIG5ldyBUZXN0VGhyZWFkKGludGVybmFsOjpOZXdDYWxsYmFjayh0aGlzLCAmT25jZUluaXRUZXN0OjpJbml0T25jZSkpOwogICB9CiAgIFRlc3RUaHJlYWQqIFJ1bkluaXRSZWN1cnNpdmVPbmNlSW5OZXdUaHJlYWQoKSB7Ci0gICAgcmV0dXJuIG5ldyBUZXN0VGhyZWFkKE5ld0NhbGxiYWNrKHRoaXMsICZPbmNlSW5pdFRlc3Q6OkluaXRSZWN1cnNpdmVPbmNlKSk7CisgICAgcmV0dXJuIG5ldyBUZXN0VGhyZWFkKAorICAgICAgICBpbnRlcm5hbDo6TmV3Q2FsbGJhY2sodGhpcywgJk9uY2VJbml0VGVzdDo6SW5pdFJlY3Vyc2l2ZU9uY2UpKTsKICAgfQogCiAgIGVudW0gU3RhdGUgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcGxhdGZvcm1fbWFjcm9zLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaAppbmRleCA1ZWJjOWUxLi42Zjc4ODYwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wbGF0Zm9ybV9tYWNyb3MuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMTIgR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzEsNyArMzEsOCBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fTUFDUk9TX0hfCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9NQUNST1NfSF8KIAotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX0VSUk9SIFwKKyNlcnJvciAiSG9zdCBwbGF0Zm9ybSB3YXMgbm90IGRldGVjdGVkIGFzIHN1cHBvcnRlZCBieSBwcm90b2J1ZiIKIAogLy8gUHJvY2Vzc29yIGFyY2hpdGVjdHVyZSBkZXRlY3Rpb24uICBGb3IgbW9yZSBpbmZvIG9uIHdoYXQncyBkZWZpbmVkLCBzZWU6CiAvLyAgIGh0dHA6Ly9tc2RuLm1pY3Jvc29mdC5jb20vZW4tdXMvbGlicmFyeS9iMDA4NGtheS5hc3B4CkBAIC00Myw3ICs0NCwxNSBAQAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQogI2VsaWYgU0JfSVMoNjRfQklUKQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQotI2VuZGlmICAvLyBTQl9JUygzMl9CSVQpCisjZWxpZiBTQl9JUyhBUkNIX0FSTSkKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfQVJNIDEKKyNlbGlmIFNCX0lTKEFSQ0hfWDg2XzY0KQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQgMQorI2VsaWYgU0JfSVMoQVJDSF9YODYpCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX0lBMzIgMQorI2VsaWYgU0JfSVMoQVJDSF9NSVBTKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9NSVBTIDEKKyNlbmRpZgogI2Vsc2UgICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKICNpZiBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9YNjQgMQpAQCAtNTEsMjYgKzYwLDgzIEBACiAjZWxpZiBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19pMzg2X18pCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX0lBMzIgMQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChfX1FOWF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk1fUU5YIDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfMzJfQklUIDEKICNlbGlmIGRlZmluZWQoX19BUk1FTF9fKQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9BUk0gMQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChfX2FhcmNoNjRfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfQUFSQ0g2NCAxCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzY0X0JJVCAxCiAjZWxpZiBkZWZpbmVkKF9fTUlQU0VMX18pCisjaWYgZGVmaW5lZChfX0xQNjRfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfTUlQUzY0IDEKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUIDEKKyNlbHNlCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX01JUFMgMQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQotI2VsaWYgZGVmaW5lZChfX3BwY19fKSB8fCBkZWZpbmVkKF9fUFBDX18pCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIX1BQQyAxCi0jZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX2JpdCAxCisjZW5kaWYKICNlbGlmIGRlZmluZWQoX19wbmFjbF9fKQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChzcGFyYykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfU1BBUkMgMQorI2lmIGRlZmluZWQoX19zcGFyY192OV9fKSB8fCBkZWZpbmVkKF9fc3BhcmN2OSkgfHwgZGVmaW5lZChfX2FyY2g2NF9fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQogI2Vsc2UKLSNlcnJvciBIb3N0IGFyY2hpdGVjdHVyZSB3YXMgbm90IGRldGVjdGVkIGFzIHN1cHBvcnRlZCBieSBwcm90b2J1ZgorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VuZGlmCisjZWxpZiBkZWZpbmVkKF9QT1dFUikgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKSB8fCBkZWZpbmVkKF9fUFBDNjRfXykKKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfUE9XRVIgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF82NF9CSVQgMQorI2VsaWYgZGVmaW5lZChfX1BQQ19fKQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF9QUEMgMQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfQVJDSF8zMl9CSVQgMQorI2VsaWYgZGVmaW5lZChfX0dOVUNfXykKKyMgaWYgKCgoX19HTlVDX18gPT0gNCkgJiYgKF9fR05VQ19NSU5PUl9fID49IDcpKSB8fCAoX19HTlVDX18gPiA0KSkKKy8vIFdlIGZhbGxiYWNrIHRvIHRoZSBnZW5lcmljIENsYW5nL0dDQyA+PSA0LjcgaW1wbGVtZW50YXRpb24gaW4gYXRvbWljb3BzLmgKKyMgZWxpZiBkZWZpbmVkKF9fY2xhbmdfXykKKyMgIGlmICFfX2hhc19leHRlbnNpb24oY19hdG9taWMpCitHT09HTEVfUFJPVE9CVUZfUExBVEZPUk1fRVJST1IKKyMgIGVuZGlmCisvLyBXZSBmYWxsYmFjayB0byB0aGUgZ2VuZXJpYyBDbGFuZy9HQ0MgPj0gNC43IGltcGxlbWVudGF0aW9uIGluIGF0b21pY29wcy5oCisjIGVuZGlmCisjIGlmIF9fTFA2NF9fCisjICBkZWZpbmUgR09PR0xFX1BST1RPQlVGX0FSQ0hfNjRfQklUIDEKKyMgZWxzZQorIyAgZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9BUkNIXzMyX0JJVCAxCisjIGVuZGlmCisjZWxzZQorR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX0VSUk9SCiAjZW5kaWYKICNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCiAKICNpZiBkZWZpbmVkKF9fQVBQTEVfXykKICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX09TX0FQUExFCisjaW5jbHVkZSA8VGFyZ2V0Q29uZGl0aW9uYWxzLmg+CisjaWYgVEFSR0VUX09TX0lQSE9ORQorI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfSVBIT05FCisjZW5kaWYKKyNlbGlmIGRlZmluZWQoX19FTVNDUklQVEVOX18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19FTVNDUklQVEVOCiAjZWxpZiBkZWZpbmVkKF9fbmF0aXZlX2NsaWVudF9fKQogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfT1NfTkFDTAorI2VsaWYgZGVmaW5lZChzdW4pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19TT0xBUklTCisjZWxpZiBkZWZpbmVkKF9BSVgpCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19BSVgKKyNlbGlmIGRlZmluZWQoX19BTkRST0lEX18pCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9PU19BTkRST0lECisjZW5kaWYKKworI3VuZGVmIEdPT0dMRV9QUk9UT0JVRl9QTEFURk9STV9FUlJPUgorCisjaWYgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfQU5EUk9JRCkgfHwgZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfSVBIT05FKQorLy8gQW5kcm9pZCBuZGsgZG9lcyBub3Qgc3VwcG9ydCB0aGUgX190aHJlYWQga2V5d29yZCB2ZXJ5IHdlbGwgeWV0LiBIZXJlCisvLyB3ZSB1c2UgcHRocmVhZF9rZXlfY3JlYXRlKCkvcHRocmVhZF9nZXRzcGVjaWZpYygpLy4uLiBtZXRob2RzIGZvcgorLy8gVExTIHN1cHBvcnQgb24gYW5kcm9pZC4KKy8vIGlPUyBhbHNvIGRvZXMgbm90IHN1cHBvcnQgdGhlIF9fdGhyZWFkIGtleXdvcmQuCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9OT19USFJFQURMT0NBTAogI2VuZGlmCiAKICNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1BMQVRGT1JNX01BQ1JPU19IXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvcG9ydC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ2MTg5ZGMKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9wb3J0LmgKQEAgLTAsMCArMSw0NDcgQEAKKy8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAorLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLworLy8KKy8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAorLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQorLy8gbWV0OgorLy8KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0CisvLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCisvLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCisvLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCisvLyBkaXN0cmlidXRpb24uCisvLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCisvLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQorLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKy8vCisvLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCisvLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisvLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAorLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCisvLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKKy8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQorLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAorLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCisvLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgorCisjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19QT1JUX0hfCisjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19QT1JUX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisKKyNpZm5kZWYgU1RBUkJPQVJECisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8Y3N0ZGRlZj4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZiBkZWZpbmVkKF9fb3NmX18pCisvLyBUcnU2NCBsYWNrcyBzdGRpbnQuaCwgYnV0IGhhcyBpbnR0eXBlcy5oIHdoaWNoIGRlZmluZXMgYSBzdXBlcnNldCBvZgorLy8gd2hhdCBzdGRpbnQuaCB3b3VsZCBkZWZpbmUuCisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNlbGlmICFkZWZpbmVkKF9NU0NfVkVSKQorI2luY2x1ZGUgPHN0ZGludC5oPgorI2VuZGlmCisjZWxzZQorI2luY2x1ZGUgInN0YXJib2FyZC9tZW1vcnkuaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvdHlwZXMuaCIKKy8vIFRoaXMgd29ya2Fyb3VuZCBpcyBmb3IgcHJvdG9jIGF1dG8tZ2VuZXJhdGVkIGZpbGVzIHdoaWNoIHVzZSBtZW1zZXQuCisjaWZuZGVmIG1lbXNldAorI2RlZmluZSBtZW1zZXQgU2JNZW1vcnlTZXQKKyNlbmRpZiAgLy8gbWVtc2V0CisjZW5kaWYKKworI3VuZGVmIFBST1RPQlVGX0xJVFRMRV9FTkRJQU4KKyNpZiBkZWZpbmVkKFNUQVJCT0FSRCkKKyNpbmNsdWRlICJzdGFyYm9hcmQvY29uZmlndXJhdGlvbi5oIgorI2lmIFNCX0lTKExJVFRMRV9FTkRJQU4pICYmIFwKKyAgICAhZGVmaW5lZChQUk9UT0JVRl9ESVNBQkxFX0xJVFRMRV9FTkRJQU5fT1BUX0ZPUl9URVNUKQorI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKKyNlbmRpZgorI2Vsc2UKKyNpZmRlZiBfV0lOMzIKKyAgLy8gQXNzdW1pbmcgd2luZG93cyBpcyBhbHdheXMgbGl0dGxlLWVuZGlhbi4KKyAgLy8gVE9ETyh4aWFvZmVuZyk6IFRoZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIGlzIG5vdCBvbmx5IHVzZWQgZm9yCisgIC8vIG9wdGltaXphdGlvbiBidXQgYWxzbyBmb3IgY29ycmVjdG5lc3MuIFdlIHNob3VsZCBkZWZpbmUgYW4KKyAgLy8gZGlmZmVyZW50IG1hY3JvIHRvIHRlc3QgdGhlIGJpZy1lbmRpYW4gY29kZSBwYXRoIGluIGNvZGVkX3N0cmVhbS4KKyAgI2lmICFkZWZpbmVkKFBST1RPQlVGX0RJU0FCTEVfTElUVExFX0VORElBTl9PUFRfRk9SX1RFU1QpCisgICAgI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKKyAgI2VuZGlmCisgICNpZiBfTVNDX1ZFUiA+PSAxMzAwICYmICFkZWZpbmVkKF9fSU5URUxfQ09NUElMRVIpCisgICAgLy8gSWYgTVNWQyBoYXMgIi9SVENjIiBzZXQsIGl0IHdpbGwgY29tcGxhaW4gYWJvdXQgdHJ1bmNhdGluZyBjYXN0cyBhdAorICAgIC8vIHJ1bnRpbWUuICBUaGlzIGZpbGUgY29udGFpbnMgc29tZSBpbnRlbnRpb25hbCB0cnVuY2F0aW5nIGNhc3RzLgorICAgICNwcmFnbWEgcnVudGltZV9jaGVja3MoImMiLCBvZmYpCisgICNlbmRpZgorI2Vsc2UKKyAgI2luY2x1ZGUgPHN5cy9wYXJhbS5oPiAgIC8vIF9fQllURV9PUkRFUgorICAjaWYgKChkZWZpbmVkKF9fTElUVExFX0VORElBTl9fKSAmJiAhZGVmaW5lZChfX0JJR19FTkRJQU5fXykpIHx8IFwKKyAgICAgICAgIChkZWZpbmVkKF9fQllURV9PUkRFUikgJiYgX19CWVRFX09SREVSID09IF9fTElUVExFX0VORElBTikpICYmIFwKKyAgICAgICFkZWZpbmVkKFBST1RPQlVGX0RJU0FCTEVfTElUVExFX0VORElBTl9PUFRfRk9SX1RFU1QpCisgICAgI2RlZmluZSBQUk9UT0JVRl9MSVRUTEVfRU5ESUFOIDEKKyAgI2VuZGlmCisjZW5kaWYKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCisKKy8vIFRoZSBtYWNyb3MgZGVmaW5lZCBiZWxvdyBhcmUgcmVxdWlyZWQgaW4gb3JkZXIgdG8gbWFrZSBwcm90b2J1Zl9saXRlIGEKKy8vIGNvbXBvbmVudCBvbiBhbGwgcGxhdGZvcm1zLiBTZWUgaHR0cDovL2NyYnVnLmNvbS8xNzI4MDAuCisjaWYgZGVmaW5lZChDT01QT05FTlRfQlVJTEQpICYmIGRlZmluZWQoUFJPVE9CVUZfVVNFX0RMTFMpCisgICNpZiBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNpZmRlZiBMSUJQUk9UT0JVRl9FWFBPUlRTCisgICAgICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVCBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBMSUJQUk9UT0JVRl9FWFBPUlQgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICAgI2VuZGlmCisgICAgI2lmZGVmIExJQlBST1RPQ19FWFBPUlRTCisgICAgICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQgICBfX2RlY2xzcGVjKGRsbGV4cG9ydCkKKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19kZWNsc3BlYyhkbGxpbXBvcnQpCisgICAgI2VuZGlmCisgICNlbHNlICAvLyBkZWZpbmVkKF9NU0NfVkVSKQorICAgICNpZmRlZiBMSUJQUk9UT0JVRl9FWFBPUlRTCisgICAgICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVCBfX2F0dHJpYnV0ZV9fKCh2aXNpYmlsaXR5KCJkZWZhdWx0IikpKQorICAgICNlbHNlCisgICAgICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVAorICAgICNlbmRpZgorICAgICNpZmRlZiBMSUJQUk9UT0NfRVhQT1JUUworICAgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUICAgX19hdHRyaWJ1dGVfXygodmlzaWJpbGl0eSgiZGVmYXVsdCIpKSkKKyAgICAjZWxzZQorICAgICAgI2RlZmluZSBMSUJQUk9UT0NfRVhQT1JUCisgICAgI2VuZGlmCisgICNlbmRpZgorI2Vsc2UgIC8vIGRlZmluZWQoQ09NUE9ORU5UX0JVSUxEKSAmJiBkZWZpbmVkKFBST1RPQlVGX1VTRV9ETExTKQorICAjZGVmaW5lIExJQlBST1RPQlVGX0VYUE9SVAorICAjZGVmaW5lIExJQlBST1RPQ19FWFBPUlQKKyNlbmRpZgorCisvLyBUaGVzZSAjaW5jbHVkZXMgYXJlIGZvciB0aGUgYnl0ZSBzd2FwIGZ1bmN0aW9ucyBkZWNsYXJlZCBsYXRlciBvbi4KKyNpZmRlZiBfTVNDX1ZFUgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgLy8gTk9MSU5UKGJ1aWxkL2luY2x1ZGUpCisjZWxpZiBkZWZpbmVkKF9fQVBQTEVfXykKKyNpbmNsdWRlIDxsaWJrZXJuL09TQnl0ZU9yZGVyLmg+CisjZWxpZiBkZWZpbmVkKF9fR0xJQkNfXykgfHwgZGVmaW5lZChfX0NZR1dJTl9fKQorI2luY2x1ZGUgPGJ5dGVzd2FwLmg+ICAvLyBJV1lVIHByYWdtYTogZXhwb3J0CisjZW5kaWYKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gZnJvbSBnb29nbGUzL2Jhc2UvcG9ydC5oCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKK3R5cGVkZWYgdW5zaWduZWQgaW50IHVpbnQ7CisKKyNpZmRlZiBfTVNDX1ZFUgordHlwZWRlZiBzaWduZWQgX19pbnQ4ICBpbnQ4OwordHlwZWRlZiBfX2ludDE2IGludDE2OwordHlwZWRlZiBfX2ludDMyIGludDMyOwordHlwZWRlZiBfX2ludDY0IGludDY0OworCit0eXBlZGVmIHVuc2lnbmVkIF9faW50OCAgdWludDg7Cit0eXBlZGVmIHVuc2lnbmVkIF9faW50MTYgdWludDE2OwordHlwZWRlZiB1bnNpZ25lZCBfX2ludDMyIHVpbnQzMjsKK3R5cGVkZWYgdW5zaWduZWQgX19pbnQ2NCB1aW50NjQ7CisjZWxzZQordHlwZWRlZiBpbnQ4X3QgIGludDg7Cit0eXBlZGVmIGludDE2X3QgaW50MTY7Cit0eXBlZGVmIGludDMyX3QgaW50MzI7Cit0eXBlZGVmIGludDY0X3QgaW50NjQ7CisKK3R5cGVkZWYgdWludDhfdCAgdWludDg7Cit0eXBlZGVmIHVpbnQxNl90IHVpbnQxNjsKK3R5cGVkZWYgdWludDMyX3QgdWludDMyOwordHlwZWRlZiB1aW50NjRfdCB1aW50NjQ7CisjZW5kaWYKKworLy8gbG9uZyBsb25nIG1hY3JvcyB0byBiZSB1c2VkIGJlY2F1c2UgZ2NjIGFuZCB2YysrIHVzZSBkaWZmZXJlbnQgc3VmZml4ZXMsCisvLyBhbmQgZGlmZmVyZW50IHNpemUgc3BlY2lmaWVycyBpbiBmb3JtYXQgc3RyaW5ncworI3VuZGVmIEdPT0dMRV9MT05HTE9ORworI3VuZGVmIEdPT0dMRV9VTE9OR0xPTkcKKyN1bmRlZiBHT09HTEVfTExfRk9STUFUCisKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBHT09HTEVfTE9OR0xPTkcoeCkgeCMjSTY0CisjZGVmaW5lIEdPT0dMRV9VTE9OR0xPTkcoeCkgeCMjVUk2NAorI2RlZmluZSBHT09HTEVfTExfRk9STUFUICJJNjQiICAvLyBBcyBpbiBwcmludGYoIiVJNjRkIiwgLi4uKQorI2Vsc2UKKyNkZWZpbmUgR09PR0xFX0xPTkdMT05HKHgpIElOVDY0X0MoeCkKKyNkZWZpbmUgR09PR0xFX1VMT05HTE9ORyh4KSBVSU5UNjRfQyh4KQorI2RlZmluZSBHT09HTEVfTExfRk9STUFUICJsbCIgIC8vIEFzIGluICIlbGxkIi4gTm90ZSB0aGF0ICJxIiBpcyBwb29yIGZvcm0gYWxzby4KKyNlbmRpZgorCitzdGF0aWMgY29uc3QgaW50MzIga2ludDMybWF4ID0gMHg3RkZGRkZGRjsKK3N0YXRpYyBjb25zdCBpbnQzMiBraW50MzJtaW4gPSAta2ludDMybWF4IC0gMTsKK3N0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtYXggPSBHT09HTEVfTE9OR0xPTkcoMHg3RkZGRkZGRkZGRkZGRkZGKTsKK3N0YXRpYyBjb25zdCBpbnQ2NCBraW50NjRtaW4gPSAta2ludDY0bWF4IC0gMTsKK3N0YXRpYyBjb25zdCB1aW50MzIga3VpbnQzMm1heCA9IDB4RkZGRkZGRkZ1Oworc3RhdGljIGNvbnN0IHVpbnQ2NCBrdWludDY0bWF4ID0gR09PR0xFX1VMT05HTE9ORygweEZGRkZGRkZGRkZGRkZGRkYpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBbm5vdGF0aW9uczogIFNvbWUgcGFydHMgb2YgdGhlIGNvZGUgaGF2ZSBiZWVuIGFubm90YXRlZCBpbiB3YXlzIHRoYXQgbWlnaHQKKy8vICAgYmUgdXNlZnVsIHRvIHNvbWUgY29tcGlsZXJzIG9yIHRvb2xzLCBidXQgYXJlIG5vdCBzdXBwb3J0ZWQgdW5pdmVyc2FsbHkuCisvLyAgIFlvdSBjYW4gI2RlZmluZSB0aGVzZSBhbm5vdGF0aW9ucyB5b3Vyc2VsZiBpZiB0aGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbgorLy8gICBpcyBub3QgcmlnaHQgZm9yIHlvdS4KKworI2lmbmRlZiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyNpZiBkZWZpbmVkKF9fR05VQ19fKSAmJiAoX19HTlVDX18gPiAzIHx8KF9fR05VQ19fID09IDMgJiYgX19HTlVDX01JTk9SX18gPj0gMSkpCisvLyBGb3IgZnVuY3Rpb25zIHdlIHdhbnQgdG8gZm9yY2UgaW5saW5lLgorLy8gSW50cm9kdWNlZCBpbiBnY2MgMy4xLgorI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUgX19hdHRyaWJ1dGVfXyAoKGFsd2F5c19pbmxpbmUpKQorI2Vsc2UKKy8vIE90aGVyIGNvbXBpbGVycyB3aWxsIGhhdmUgdG8gZmlndXJlIGl0IG91dCBmb3IgdGhlbXNlbHZlcy4KKyNkZWZpbmUgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCisjZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgU1RBUkJPQVJECisvLyBMZXQgY29tcGlsZXJzIGZpZ3VyZSBpdCBvdXQgZm9yIHRoZW1zZWx2ZXMuCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKKyNlbHNlICAvLyBTVEFSQk9BUkQKKyNpZm5kZWYgR09PR0xFX0FUVFJJQlVURV9OT0lOTElORQorI2lmIGRlZmluZWQoX19HTlVDX18pICYmIChfX0dOVUNfXyA+IDMgfHwoX19HTlVDX18gPT0gMyAmJiBfX0dOVUNfTUlOT1JfXyA+PSAxKSkKKy8vIEZvciBmdW5jdGlvbnMgd2Ugd2FudCB0byBmb3JjZSBub3QgaW5saW5lLgorLy8gSW50cm9kdWNlZCBpbiBnY2MgMy4xLgorI2RlZmluZSBHT09HTEVfQVRUUklCVVRFX05PSU5MSU5FIF9fYXR0cmlidXRlX18gKChub2lubGluZSkpCisjZWxpZiBkZWZpbmVkKF9NU0NfVkVSKSAmJiAoX01TQ19WRVIgPj0gMTQwMCkKKy8vIFNlZW1zIHRvIGhhdmUgYmVlbiBhcm91bmQgc2luY2UgYXQgbGVhc3QgVmlzdWFsIFN0dWRpbyAyMDA1CisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUgX19kZWNsc3BlYyhub2lubGluZSkKKyNlbHNlCisvLyBPdGhlciBjb21waWxlcnMgd2lsbCBoYXZlIHRvIGZpZ3VyZSBpdCBvdXQgZm9yIHRoZW1zZWx2ZXMuCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfTk9JTkxJTkUKKyNlbmRpZgorI2VuZGlmCisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisjaWZuZGVmIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAorI2lmZGVmIF9fR05VQ19fCisvLyBJZiB0aGUgbWV0aG9kL3ZhcmlhYmxlL3R5cGUgaXMgdXNlZCBhbnl3aGVyZSwgcHJvZHVjZSBhIHdhcm5pbmcuCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRCBfX2F0dHJpYnV0ZV9fKChkZXByZWNhdGVkKSkKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfREVQUkVDQVRFRAorI2VuZGlmCisjZW5kaWYKKworI2lmbmRlZiBHT09HTEVfUFJFRElDVF9UUlVFCisjaWZkZWYgX19HTlVDX18KKy8vIFByb3ZpZGVkIGF0IGxlYXN0IHNpbmNlIEdDQyAzLjAuCisjZGVmaW5lIEdPT0dMRV9QUkVESUNUX1RSVUUoeCkgKF9fYnVpbHRpbl9leHBlY3QoISEoeCksIDEpKQorI2Vsc2UKKyNkZWZpbmUgR09PR0xFX1BSRURJQ1RfVFJVRSh4KSAoeCkKKyNlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgR09PR0xFX1BSRURJQ1RfRkFMU0UKKyNpZmRlZiBfX0dOVUNfXworLy8gUHJvdmlkZWQgYXQgbGVhc3Qgc2luY2UgR0NDIDMuMC4KKyNkZWZpbmUgR09PR0xFX1BSRURJQ1RfRkFMU0UoeCkgKF9fYnVpbHRpbl9leHBlY3QoeCwgMCkpCisjZWxzZQorI2RlZmluZSBHT09HTEVfUFJFRElDVF9GQUxTRSh4KSAoeCkKKyNlbmRpZgorI2VuZGlmCisKKy8vIERlbGltaXRzIGEgYmxvY2sgb2YgY29kZSB3aGljaCBtYXkgd3JpdGUgdG8gbWVtb3J5IHdoaWNoIGlzIHNpbXVsdGFuZW91c2x5CisvLyB3cml0dGVuIGJ5IG90aGVyIHRocmVhZHMsIGJ1dCB3aGljaCBoYXMgYmVlbiBkZXRlcm1pbmVkIHRvIGJlIHRocmVhZC1zYWZlCisvLyAoZS5nLiBiZWNhdXNlIGl0IGlzIGFuIGlkZW1wb3RlbnQgd3JpdGUpLgorI2lmbmRlZiBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTgorI2RlZmluZSBHT09HTEVfU0FGRV9DT05DVVJSRU5UX1dSSVRFU19CRUdJTigpCisjZW5kaWYKKyNpZm5kZWYgR09PR0xFX1NBRkVfQ09OQ1VSUkVOVF9XUklURVNfRU5ECisjZGVmaW5lIEdPT0dMRV9TQUZFX0NPTkNVUlJFTlRfV1JJVEVTX0VORCgpCisjZW5kaWYKKworI2lmIGRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9faGFzX2NwcF9hdHRyaWJ1dGUpIFwKKyAgICAmJiAhZGVmaW5lZChHT09HTEVfUFJPVE9CVUZfT1NfQVBQTEUpCisjIGlmIGRlZmluZWQoR09PR0xFX1BST1RPQlVGX09TX05BQ0wpIHx8IGRlZmluZWQoRU1TQ1JJUFRFTikgfHwgXAorICAgICBfX2hhc19jcHBfYXR0cmlidXRlKGNsYW5nOjpmYWxsdGhyb3VnaCkKKyMgIGRlZmluZSBHT09HTEVfRkFMTFRIUk9VR0hfSU5URU5ERUQgW1tjbGFuZzo6ZmFsbHRocm91Z2hdXQorIyBlbmRpZgorI2VuZGlmCisKKyNpZm5kZWYgR09PR0xFX0ZBTExUSFJPVUdIX0lOVEVOREVECisjIGRlZmluZSBHT09HTEVfRkFMTFRIUk9VR0hfSU5URU5ERUQKKyNlbmRpZgorCisjZGVmaW5lIEdPT0dMRV9HVUFSREVEX0JZKHgpCisjZGVmaW5lIEdPT0dMRV9BVFRSSUJVVEVfQ09MRAorCisvLyB4ODYgYW5kIHg4Ni02NCBjYW4gcGVyZm9ybSB1bmFsaWduZWQgbG9hZHMvc3RvcmVzIGRpcmVjdGx5LgorI2lmIGRlZmluZWQoX01fWDY0KSB8fCBkZWZpbmVkKF9feDg2XzY0X18pIHx8IFwKKyAgICBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19pMzg2X18pCisKKyNkZWZpbmUgR09PR0xFX1VOQUxJR05FRF9MT0FEMTYoX3ApICgqcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50MTYgKj4oX3ApKQorI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX0xPQUQzMihfcCkgKCpyZWludGVycHJldF9jYXN0PGNvbnN0IHVpbnQzMiAqPihfcCkpCisjZGVmaW5lIEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KF9wKSAoKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDY0ICo+KF9wKSkKKworI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX1NUT1JFMTYoX3AsIF92YWwpICgqcmVpbnRlcnByZXRfY2FzdDx1aW50MTYgKj4oX3ApID0gKF92YWwpKQorI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX1NUT1JFMzIoX3AsIF92YWwpICgqcmVpbnRlcnByZXRfY2FzdDx1aW50MzIgKj4oX3ApID0gKF92YWwpKQorI2RlZmluZSBHT09HTEVfVU5BTElHTkVEX1NUT1JFNjQoX3AsIF92YWwpICgqcmVpbnRlcnByZXRfY2FzdDx1aW50NjQgKj4oX3ApID0gKF92YWwpKQorCisjZWxzZQoraW5saW5lIHVpbnQxNiBHT09HTEVfVU5BTElHTkVEX0xPQUQxNihjb25zdCB2b2lkICpwKSB7CisgIHVpbnQxNiB0OworI2lmbmRlZiBTVEFSQk9BUkQKKyAgbWVtY3B5KCZ0LCBwLCBzaXplb2YgdCk7CisjZWxzZQorICBTYk1lbW9yeUNvcHkoJnQsIHAsIHNpemVvZiB0KTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisgIHJldHVybiB0OworfQorCitpbmxpbmUgdWludDMyIEdPT0dMRV9VTkFMSUdORURfTE9BRDMyKGNvbnN0IHZvaWQgKnApIHsKKyAgdWludDMyIHQ7CisjaWZuZGVmIFNUQVJCT0FSRAorICBtZW1jcHkoJnQsIHAsIHNpemVvZiB0KTsKKyNlbHNlCisgIFNiTWVtb3J5Q29weSgmdCwgcCwgc2l6ZW9mIHQpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyAgcmV0dXJuIHQ7Cit9CisKK2lubGluZSB1aW50NjQgR09PR0xFX1VOQUxJR05FRF9MT0FENjQoY29uc3Qgdm9pZCAqcCkgeworICB1aW50NjQgdDsKKyNpZm5kZWYgU1RBUkJPQVJECisgIG1lbWNweSgmdCwgcCwgc2l6ZW9mIHQpOworI2Vsc2UKKyAgU2JNZW1vcnlDb3B5KCZ0LCBwLCBzaXplb2YgdCk7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorICByZXR1cm4gdDsKK30KKworaW5saW5lIHZvaWQgR09PR0xFX1VOQUxJR05FRF9TVE9SRTE2KHZvaWQgKnAsIHVpbnQxNiB2KSB7CisjaWZuZGVmIFNUQVJCT0FSRAorICBtZW1jcHkocCwgJnYsIHNpemVvZiB2KTsKKyNlbHNlCisgIFNiTWVtb3J5Q29weShwLCAmdiwgc2l6ZW9mIHYpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKK30KKworaW5saW5lIHZvaWQgR09PR0xFX1VOQUxJR05FRF9TVE9SRTMyKHZvaWQgKnAsIHVpbnQzMiB2KSB7CisjaWZuZGVmIFNUQVJCT0FSRAorICBtZW1jcHkocCwgJnYsIHNpemVvZiB2KTsKKyNlbHNlCisgIFNiTWVtb3J5Q29weShwLCAmdiwgc2l6ZW9mIHYpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKK30KKworaW5saW5lIHZvaWQgR09PR0xFX1VOQUxJR05FRF9TVE9SRTY0KHZvaWQgKnAsIHVpbnQ2NCB2KSB7CisjaWZuZGVmIFNUQVJCT0FSRAorICBtZW1jcHkocCwgJnYsIHNpemVvZiB2KTsKKyNlbHNlCisgIFNiTWVtb3J5Q29weShwLCAmdiwgc2l6ZW9mIHYpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKK30KKyNlbmRpZgorCisjaWYgZGVmaW5lZChfTVNDX1ZFUikKKyNkZWZpbmUgR09PR0xFX1RIUkVBRF9MT0NBTCBfX2RlY2xzcGVjKHRocmVhZCkKKyNlbHNlCisjZGVmaW5lIEdPT0dMRV9USFJFQURfTE9DQUwgX190aHJlYWQKKyNlbmRpZgorCisvLyBUaGUgZm9sbG93aW5nIGd1YXJhbnRlZXMgZGVjbGFyYXRpb24gb2YgdGhlIGJ5dGUgc3dhcCBmdW5jdGlvbnMsIGFuZAorLy8gZGVmaW5lcyBfX0JZVEVfT1JERVIgZm9yIE1TVkMKKyNpZmRlZiBfTVNDX1ZFUgorI2RlZmluZSBfX0JZVEVfT1JERVIgX19MSVRUTEVfRU5ESUFOCisjZGVmaW5lIGJzd2FwXzE2KHgpIF9ieXRlc3dhcF91c2hvcnQoeCkKKyNkZWZpbmUgYnN3YXBfMzIoeCkgX2J5dGVzd2FwX3Vsb25nKHgpCisjZGVmaW5lIGJzd2FwXzY0KHgpIF9ieXRlc3dhcF91aW50NjQoeCkKKworI2VsaWYgZGVmaW5lZChfX0FQUExFX18pCisvLyBNYWMgT1MgWCAvIERhcndpbiBmZWF0dXJlcworI2RlZmluZSBic3dhcF8xNih4KSBPU1N3YXBJbnQxNih4KQorI2RlZmluZSBic3dhcF8zMih4KSBPU1N3YXBJbnQzMih4KQorI2RlZmluZSBic3dhcF82NCh4KSBPU1N3YXBJbnQ2NCh4KQorCisjZWxpZiAhZGVmaW5lZChfX0dMSUJDX18pICYmICFkZWZpbmVkKF9fQ1lHV0lOX18pCisKK3N0YXRpYyBpbmxpbmUgdWludDE2IGJzd2FwXzE2KHVpbnQxNiB4KSB7CisgIHJldHVybiBzdGF0aWNfY2FzdDx1aW50MTY+KCgoeCAmIDB4RkYpIDw8IDgpIHwgKCh4ICYgMHhGRjAwKSA+PiA4KSk7Cit9CisjZGVmaW5lIGJzd2FwXzE2KHgpIGJzd2FwXzE2KHgpCitzdGF0aWMgaW5saW5lIHVpbnQzMiBic3dhcF8zMih1aW50MzIgeCkgeworICByZXR1cm4gKCgoeCAmIDB4RkYpIDw8IDI0KSB8CisgICAgICAgICAgKCh4ICYgMHhGRjAwKSA8PCA4KSB8CisgICAgICAgICAgKCh4ICYgMHhGRjAwMDApID4+IDgpIHwKKyAgICAgICAgICAoKHggJiAweEZGMDAwMDAwKSA+PiAyNCkpOworfQorI2RlZmluZSBic3dhcF8zMih4KSBic3dhcF8zMih4KQorc3RhdGljIGlubGluZSB1aW50NjQgYnN3YXBfNjQodWludDY0IHgpIHsKKyAgcmV0dXJuICgoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYpKSA8PCA1NikgfAorICAgICAgICAgICgoeCAmIEdPT0dMRV9VTE9OR0xPTkcoMHhGRjAwKSkgPDwgNDApIHwKKyAgICAgICAgICAoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYwMDAwKSkgPDwgMjQpIHwKKyAgICAgICAgICAoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYwMDAwMDApKSA8PCA4KSB8CisgICAgICAgICAgKCh4ICYgR09PR0xFX1VMT05HTE9ORygweEZGMDAwMDAwMDApKSA+PiA4KSB8CisgICAgICAgICAgKCh4ICYgR09PR0xFX1VMT05HTE9ORygweEZGMDAwMDAwMDAwMCkpID4+IDI0KSB8CisgICAgICAgICAgKCh4ICYgR09PR0xFX1VMT05HTE9ORygweEZGMDAwMDAwMDAwMDAwKSkgPj4gNDApIHwKKyAgICAgICAgICAoKHggJiBHT09HTEVfVUxPTkdMT05HKDB4RkYwMDAwMDAwMDAwMDAwMCkpID4+IDU2KSk7Cit9CisjZGVmaW5lIGJzd2FwXzY0KHgpIGJzd2FwXzY0KHgpCisKKyNlbmRpZgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBmcm9tIGdvb2dsZTMvdXRpbC9lbmRpYW4vZW5kaWFuLmgKK0xJQlBST1RPQlVGX0VYUE9SVCB1aW50MzIgZ2h0b25sKHVpbnQzMiB4KTsKKworY2xhc3MgQmlnRW5kaWFuIHsKKyBwdWJsaWM6CisjaWZkZWYgUFJPVE9CVUZfTElUVExFX0VORElBTgorCisgIHN0YXRpYyB1aW50MTYgRnJvbUhvc3QxNih1aW50MTYgeCkgeyByZXR1cm4gYnN3YXBfMTYoeCk7IH0KKyAgc3RhdGljIHVpbnQxNiBUb0hvc3QxNih1aW50MTYgeCkgeyByZXR1cm4gYnN3YXBfMTYoeCk7IH0KKworICBzdGF0aWMgdWludDMyIEZyb21Ib3N0MzIodWludDMyIHgpIHsgcmV0dXJuIGJzd2FwXzMyKHgpOyB9CisgIHN0YXRpYyB1aW50MzIgVG9Ib3N0MzIodWludDMyIHgpIHsgcmV0dXJuIGJzd2FwXzMyKHgpOyB9CisKKyAgc3RhdGljIHVpbnQ2NCBGcm9tSG9zdDY0KHVpbnQ2NCB4KSB7IHJldHVybiBic3dhcF82NCh4KTsgfQorICBzdGF0aWMgdWludDY0IFRvSG9zdDY0KHVpbnQ2NCB4KSB7IHJldHVybiBic3dhcF82NCh4KTsgfQorCisgIHN0YXRpYyBib29sIElzTGl0dGxlRW5kaWFuKCkgeyByZXR1cm4gdHJ1ZTsgfQorCisjZWxzZQorCisgIHN0YXRpYyB1aW50MTYgRnJvbUhvc3QxNih1aW50MTYgeCkgeyByZXR1cm4geDsgfQorICBzdGF0aWMgdWludDE2IFRvSG9zdDE2KHVpbnQxNiB4KSB7IHJldHVybiB4OyB9CisKKyAgc3RhdGljIHVpbnQzMiBGcm9tSG9zdDMyKHVpbnQzMiB4KSB7IHJldHVybiB4OyB9CisgIHN0YXRpYyB1aW50MzIgVG9Ib3N0MzIodWludDMyIHgpIHsgcmV0dXJuIHg7IH0KKworICBzdGF0aWMgdWludDY0IEZyb21Ib3N0NjQodWludDY0IHgpIHsgcmV0dXJuIHg7IH0KKyAgc3RhdGljIHVpbnQ2NCBUb0hvc3Q2NCh1aW50NjQgeCkgeyByZXR1cm4geDsgfQorCisgIHN0YXRpYyBib29sIElzTGl0dGxlRW5kaWFuKCkgeyByZXR1cm4gZmFsc2U7IH0KKworI2VuZGlmIC8qIEVORElBTiAqLworCisgIC8vIEZ1bmN0aW9ucyB0byBkbyB1bmFsaWduZWQgbG9hZHMgYW5kIHN0b3JlcyBpbiBiaWctZW5kaWFuIG9yZGVyLgorICBzdGF0aWMgdWludDE2IExvYWQxNihjb25zdCB2b2lkICpwKSB7CisgICAgcmV0dXJuIFRvSG9zdDE2KEdPT0dMRV9VTkFMSUdORURfTE9BRDE2KHApKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFN0b3JlMTYodm9pZCAqcCwgdWludDE2IHYpIHsKKyAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFMTYocCwgRnJvbUhvc3QxNih2KSk7CisgIH0KKworICBzdGF0aWMgdWludDMyIExvYWQzMihjb25zdCB2b2lkICpwKSB7CisgICAgcmV0dXJuIFRvSG9zdDMyKEdPT0dMRV9VTkFMSUdORURfTE9BRDMyKHApKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFN0b3JlMzIodm9pZCAqcCwgdWludDMyIHYpIHsKKyAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFMzIocCwgRnJvbUhvc3QzMih2KSk7CisgIH0KKworICBzdGF0aWMgdWludDY0IExvYWQ2NChjb25zdCB2b2lkICpwKSB7CisgICAgcmV0dXJuIFRvSG9zdDY0KEdPT0dMRV9VTkFMSUdORURfTE9BRDY0KHApKTsKKyAgfQorCisgIHN0YXRpYyB2b2lkIFN0b3JlNjQodm9pZCAqcCwgdWludDY0IHYpIHsKKyAgICBHT09HTEVfVU5BTElHTkVEX1NUT1JFNjQocCwgRnJvbUhvc3Q2NCh2KSk7CisgIH0KK307CisKKworfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1BPUlRfSF8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc2NvcGVkX3B0ci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc2NvcGVkX3B0ci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3Njb3BlZF9wdHIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc2NvcGVkX3B0ci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zaGFyZWRfcHRyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjk1YTQ3NQotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaApAQCAtMCwwICsxLDQ3MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxNCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIGZyb20gZ29vZ2xlMy91dGlsL2d0bC9zaGFyZWRfcHRyLmgKKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU0hBUkVEX1BUUl9IX18KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NIQVJFRF9QVFJfSF9fCisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvYXRvbWljb3BzLmg+CisKKyNpbmNsdWRlIDxhbGdvcml0aG0+ICAvLyBmb3Igc3dhcAorCisjaWZuZGVmIFNUQVJCT0FSRAorI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPG1lbW9yeT4KKyNlbmRpZiAgLy8gU1RBUkJPQVJECisKK25hbWVzcGFjZSBnb29nbGUgeworbmFtZXNwYWNlIHByb3RvYnVmIHsKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisKKy8vIEFsaWFzIHRvIHN0ZDo6c2hhcmVkX3B0ciBmb3IgYW55IEMrKzExIHBsYXRmb3JtLAorLy8gYW5kIGZvciBhbnkgc3VwcG9ydGVkIE1TVkMgY29tcGlsZXIuCisjaWYgIWRlZmluZWQoVVRJTF9HVExfVVNFX1NURF9TSEFSRURfUFRSKSAmJiBcCisgICAgKGRlZmluZWQoQ09NUElMRVJfTVNWQykgfHwgZGVmaW5lZChMQU5HX0NYWDExKSkKKyNkZWZpbmUgVVRJTF9HVExfVVNFX1NURF9TSEFSRURfUFRSIDEKKyNlbmRpZgorCisjaWYgZGVmaW5lZChVVElMX0dUTF9VU0VfU1REX1NIQVJFRF9QVFIpICYmIFVUSUxfR1RMX1VTRV9TVERfU0hBUkVEX1BUUgorCisvLyBUaGVzZSBhcmUgdHJhbnNpdGlvbmFsLiAgVGhleSB3aWxsIGJlIGdvaW5nIGF3YXkgc29vbi4KKy8vIFBsZWFzZSBqdXN0ICNpbmNsdWRlIDxtZW1vcnk+IGFuZCBqdXN0IHR5cGUgc3RkOjpzaGFyZWRfcHRyIHlvdXJzZWxmLCBpbnN0ZWFkCisvLyBvZiByZWx5aW5nIG9uIHRoaXMgZmlsZS4KKy8vCisvLyBNaWdyYXRpb24gZG9jOiBodHRwOi8vZ28vc3RkLXNoYXJlZC1wdHItbHNjCit1c2luZyBzdGQ6OmVuYWJsZV9zaGFyZWRfZnJvbV90aGlzOwordXNpbmcgc3RkOjpzaGFyZWRfcHRyOwordXNpbmcgc3RkOjpzdGF0aWNfcG9pbnRlcl9jYXN0OwordXNpbmcgc3RkOjp3ZWFrX3B0cjsKKworI2Vsc2UgIC8vIGJlbG93LCBVVElMX0dUTF9VU0VfU1REX1NIQVJFRF9QVFIgbm90IHNldCBvciBzZXQgdG8gMC4KKworLy8gRm9yIGV2ZXJ5dGhpbmcgZWxzZSB0aGVyZSBpcyB0aGUgZ29vZ2xlMyBpbXBsZW1lbnRhdGlvbi4KK2lubGluZSBib29sIFJlZkNvdW50RGVjKHZvbGF0aWxlIEF0b21pYzMyICpwdHIpIHsKKyAgcmV0dXJuIEJhcnJpZXJfQXRvbWljSW5jcmVtZW50KHB0ciwgLTEpICE9IDA7Cit9CisKK2lubGluZSB2b2lkIFJlZkNvdW50SW5jKHZvbGF0aWxlIEF0b21pYzMyICpwdHIpIHsKKyAgTm9CYXJyaWVyX0F0b21pY0luY3JlbWVudChwdHIsIDEpOworfQorCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3Mgc2hhcmVkX3B0cjsKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyB3ZWFrX3B0cjsKKworLy8gVGhpcyBjbGFzcyBpcyBhbiBpbnRlcm5hbCBpbXBsZW1lbnRhdGlvbiBkZXRhaWwgZm9yIHNoYXJlZF9wdHIuIElmIHR3bworLy8gc2hhcmVkX3B0cnMgcG9pbnQgdG8gdGhlIHNhbWUgb2JqZWN0LCB0aGV5IGFsc28gc2hhcmUgYSBjb250cm9sIGJsb2NrLgorLy8gQW4gImVtcHR5IiBzaGFyZWRfcG9pbnRlciByZWZlcnMgdG8gTlVMTCBhbmQgYWxzbyBoYXMgYSBOVUxMIGNvbnRyb2wgYmxvY2suCisvLyBJdCBjb250YWlucyBhbGwgb2YgdGhlIHN0YXRlIHRoYXQncyBuZWVkZWQgZm9yIHJlZmVyZW5jZSBjb3VudGluZyBvciBhbnkKKy8vIG90aGVyIGtpbmQgb2YgcmVzb3VyY2UgbWFuYWdlbWVudC4gSW4gdGhpcyBpbXBsZW1lbnRhdGlvbiB0aGUgY29udHJvbCBibG9jaworLy8gaGFwcGVucyB0byBjb25zaXN0IG9mIHR3byBhdG9taWMgd29yZHMsIHRoZSByZWZlcmVuY2UgY291bnQgKHRoZSBudW1iZXIKKy8vIG9mIHNoYXJlZF9wdHJzIHRoYXQgc2hhcmUgb3duZXJzaGlwIG9mIHRoZSBvYmplY3QpIGFuZCB0aGUgd2VhayBjb3VudAorLy8gKHRoZSBudW1iZXIgb2Ygd2Vha19wdHJzIHRoYXQgb2JzZXJ2ZSB0aGUgb2JqZWN0LCBwbHVzIDEgaWYgdGhlCisvLyByZWZjb3VudCBpcyBub256ZXJvKS4KKy8vCisvLyBUaGUgInBsdXMgMSIgaXMgdG8gcHJldmVudCBhIHJhY2UgY29uZGl0aW9uIGluIHRoZSBzaGFyZWRfcHRyIGFuZAorLy8gd2Vha19wdHIgZGVzdHJ1Y3RvcnMuIFdlIG5lZWQgdG8gbWFrZSBzdXJlIHRoZSBjb250cm9sIGJsb2NrIGlzCisvLyBvbmx5IGRlbGV0ZWQgb25jZSwgc28gd2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCBhdCBtb3N0IG9uZQorLy8gb2JqZWN0IHNlZXMgdGhlIHdlYWsgY291bnQgZGVjcmVtZW50ZWQgZnJvbSAxIHRvIDAuCitjbGFzcyBTaGFyZWRQdHJDb250cm9sQmxvY2sgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gZnJpZW5kIGNsYXNzIHNoYXJlZF9wdHI7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPiBmcmllbmQgY2xhc3Mgd2Vha19wdHI7CisgcHJpdmF0ZToKKyAgU2hhcmVkUHRyQ29udHJvbEJsb2NrKCkgOiByZWZjb3VudF8oMSksIHdlYWtfY291bnRfKDEpIHsgfQorICBBdG9taWMzMiByZWZjb3VudF87CisgIEF0b21pYzMyIHdlYWtfY291bnRfOworfTsKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbi4gVGhlIGNsYXNzIGlzIGRlZmluZWQgYmVsb3cuCit0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM7CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3Mgc2hhcmVkX3B0ciB7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPiBmcmllbmQgY2xhc3Mgd2Vha19wdHI7CisgcHVibGljOgorICB0eXBlZGVmIFQgZWxlbWVudF90eXBlOworCisgIHNoYXJlZF9wdHIoKSA6IHB0cl8oTlVMTCksIGNvbnRyb2xfYmxvY2tfKE5VTEwpIHt9CisKKyAgZXhwbGljaXQgc2hhcmVkX3B0cihUKiBwdHIpCisgICAgICA6IHB0cl8ocHRyKSwKKyAgICAgICAgY29udHJvbF9ibG9ja18ocHRyICE9IE5VTEwgPyBuZXcgU2hhcmVkUHRyQ29udHJvbEJsb2NrIDogTlVMTCkgeworICAgIC8vIElmIHAgaXMgbm9uLW51bGwgYW5kIFQgaW5oZXJpdHMgZnJvbSBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcywgd2UKKyAgICAvLyBzZXQgdXAgdGhlIGRhdGEgdGhhdCBzaGFyZWRfZnJvbV90aGlzIG5lZWRzLgorICAgIE1heWJlU2V0dXBXZWFrVGhpcyhwdHIpOworICB9CisKKyAgLy8gQ29weSBjb25zdHJ1Y3RvcjogbWFrZXMgdGhpcyBvYmplY3QgYSBjb3B5IG9mIHB0ciwgYW5kIGluY3JlbWVudHMKKyAgLy8gdGhlIHJlZmVyZW5jZSBjb3VudC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxVPiYgcHRyKQorICAgICAgOiBwdHJfKE5VTEwpLAorICAgICAgICBjb250cm9sX2Jsb2NrXyhOVUxMKSB7CisgICAgSW5pdGlhbGl6ZShwdHIpOworICB9CisgIC8vIE5lZWQgbm9uLXRlbXBsYXRlZCB2ZXJzaW9uIHRvIHByZXZlbnQgdGhlIGNvbXBpbGVyLWdlbmVyYXRlZCBkZWZhdWx0CisgIHNoYXJlZF9wdHIoY29uc3Qgc2hhcmVkX3B0cjxUPiYgcHRyKQorICAgICAgOiBwdHJfKE5VTEwpLAorICAgICAgICBjb250cm9sX2Jsb2NrXyhOVUxMKSB7CisgICAgSW5pdGlhbGl6ZShwdHIpOworICB9CisKKyAgLy8gQXNzaWdubWVudCBvcGVyYXRvci4gUmVwbGFjZXMgdGhlIGV4aXN0aW5nIHNoYXJlZF9wdHIgd2l0aCBwdHIuCisgIC8vIEluY3JlbWVudCBwdHIncyByZWZlcmVuY2UgY291bnQgYW5kIGRlY3JlbWVudCB0aGUgb25lIGJlaW5nIHJlcGxhY2VkLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4KKyAgc2hhcmVkX3B0cjxUPiYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHI8VT4mIHB0cikgeworICAgIGlmIChwdHJfICE9IHB0ci5wdHJfKSB7CisgICAgICBzaGFyZWRfcHRyPFQ+IG1lKHB0cik7ICAgLy8gd2lsbCBob2xkIG91ciBwcmV2aW91cyBzdGF0ZSB0byBiZSBkZXN0cm95ZWQuCisgICAgICBzd2FwKG1lKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gTmVlZCBub24tdGVtcGxhdGVkIHZlcnNpb24gdG8gcHJldmVudCB0aGUgY29tcGlsZXItZ2VuZXJhdGVkIGRlZmF1bHQKKyAgc2hhcmVkX3B0cjxUPiYgb3BlcmF0b3I9KGNvbnN0IHNoYXJlZF9wdHI8VD4mIHB0cikgeworICAgIGlmIChwdHJfICE9IHB0ci5wdHJfKSB7CisgICAgICBzaGFyZWRfcHRyPFQ+IG1lKHB0cik7ICAgLy8gd2lsbCBob2xkIG91ciBwcmV2aW91cyBzdGF0ZSB0byBiZSBkZXN0cm95ZWQuCisgICAgICBzd2FwKG1lKTsKKyAgICB9CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgLy8gVE9ETyhhdXN0ZXJuKTogQ29uc2lkZXIgcHJvdmlkaW5nIHRoaXMgY29uc3RydWN0b3IuIFRoZSBkcmFmdCBDKysgc3RhbmRhcmQKKyAgLy8gKDIwLjguMTAuMi4xKSBpbmNsdWRlcyBpdC4gSG93ZXZlciwgaXQgc2F5cyB0aGF0IHRoaXMgY29uc3RydWN0b3IgdGhyb3dzCisgIC8vIGEgYmFkX3dlYWtfcHRyIGV4Y2VwdGlvbiB3aGVuIHB0ciBpcyBleHBpcmVkLiBJcyBpdCBiZXR0ZXIgdG8gcHJvdmlkZSB0aGlzCisgIC8vIGNvbnN0cnVjdG9yIGFuZCBtYWtlIGl0IGRvIHNvbWV0aGluZyBlbHNlLCBsaWtlIGZhaWwgd2l0aCBhIENIRUNLLCBvciB0bworICAvLyBsZWF2ZSB0aGlzIGNvbnN0cnVjdG9yIG91dCBlbnRpcmVseT8KKyAgLy8KKyAgLy8gdGVtcGxhdGUgPHR5cGVuYW1lIFU+CisgIC8vIHNoYXJlZF9wdHIoY29uc3Qgd2Vha19wdHI8VT4mIHB0cik7CisKKyAgfnNoYXJlZF9wdHIoKSB7CisgICAgaWYgKHB0cl8gIT0gTlVMTCkgeworICAgICAgaWYgKCFSZWZDb3VudERlYygmY29udHJvbF9ibG9ja18tPnJlZmNvdW50XykpIHsKKyAgICAgICAgZGVsZXRlIHB0cl87CisKKyAgICAgICAgLy8gd2Vha19jb3VudF8gaXMgZGVmaW5lZCBhcyB0aGUgbnVtYmVyIG9mIHdlYWtfcHRycyB0aGF0IG9ic2VydmUKKyAgICAgICAgLy8gcHRyXywgcGx1cyAxIGlmIHJlZmNvdW50XyBpcyBub256ZXJvLgorICAgICAgICBpZiAoIVJlZkNvdW50RGVjKCZjb250cm9sX2Jsb2NrXy0+d2Vha19jb3VudF8pKSB7CisgICAgICAgICAgZGVsZXRlIGNvbnRyb2xfYmxvY2tfOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgLy8gUmVwbGFjZXMgdW5kZXJseWluZyByYXcgcG9pbnRlciB3aXRoIHRoZSBvbmUgcGFzc2VkIGluLiAgVGhlIHJlZmVyZW5jZQorICAvLyBjb3VudCBpcyBzZXQgdG8gb25lIChvciB6ZXJvIGlmIHRoZSBwb2ludGVyIGlzIE5VTEwpIGZvciB0aGUgcG9pbnRlcgorICAvLyBiZWluZyBwYXNzZWQgaW4gYW5kIGRlY3JlbWVudGVkIGZvciB0aGUgb25lIGJlaW5nIHJlcGxhY2VkLgorICAvLworICAvLyBJZiB5b3UgaGF2ZSBhIGNvbXBpbGF0aW9uIGVycm9yIHdpdGggdGhpcyBjb2RlLCBtYWtlIHN1cmUgeW91IGFyZW4ndAorICAvLyBwYXNzaW5nIE5VTEwsIG51bGxwdHIsIG9yIDAgdG8gdGhpcyBmdW5jdGlvbi4gIENhbGwgcmVzZXQgd2l0aG91dCBhbgorICAvLyBhcmd1bWVudCB0byByZXNldCB0byBhIG51bGwgcHRyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgWT4KKyAgdm9pZCByZXNldChZKiBwKSB7CisgICAgaWYgKHAgIT0gcHRyXykgeworICAgICAgc2hhcmVkX3B0cjxUPiB0bXAocCk7CisgICAgICB0bXAuc3dhcCgqdGhpcyk7CisgICAgfQorICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICByZXNldChzdGF0aWNfY2FzdDxUKj4oTlVMTCkpOworICB9CisKKyAgLy8gRXhjaGFuZ2VzIHRoZSBjb250ZW50cyBvZiB0aGlzIHdpdGggdGhlIGNvbnRlbnRzIG9mIHIuICBUaGlzIGZ1bmN0aW9uCisgIC8vIHN1cHBvcnRzIG1vcmUgZWZmaWNpZW50IHN3YXBwaW5nIHNpbmNlIGl0IGVsaW1pbmF0ZXMgdGhlIG5lZWQgZm9yIGEKKyAgLy8gdGVtcG9yYXJ5IHNoYXJlZF9wdHIgb2JqZWN0LgorICB2b2lkIHN3YXAoc2hhcmVkX3B0cjxUPiYgcikgeworICAgIHVzaW5nIHN0ZDo6c3dhcDsgIC8vIGh0dHA6Ly9nby91c2luZy1zdGQtc3dhcAorICAgIHN3YXAocHRyXywgci5wdHJfKTsKKyAgICBzd2FwKGNvbnRyb2xfYmxvY2tfLCByLmNvbnRyb2xfYmxvY2tfKTsKKyAgfQorCisgIC8vIFRoZSBmb2xsb3dpbmcgZnVuY3Rpb24gaXMgdXNlZnVsIGZvciBnYWluaW5nIGFjY2VzcyB0byB0aGUgdW5kZXJseWluZworICAvLyBwb2ludGVyIHdoZW4gYSBzaGFyZWRfcHRyIHJlbWFpbnMgaW4gc2NvcGUgc28gdGhlIHJlZmVyZW5jZS1jb3VudCBpcworICAvLyBrbm93biB0byBiZSA+IDAgKGUuZy4gZm9yIHBhcmFtZXRlciBwYXNzaW5nKS4KKyAgVCogZ2V0KCkgY29uc3QgeworICAgIHJldHVybiBwdHJfOworICB9CisKKyAgVCYgb3BlcmF0b3IqKCkgY29uc3QgeworICAgIHJldHVybiAqcHRyXzsKKyAgfQorCisgIFQqIG9wZXJhdG9yLT4oKSBjb25zdCB7CisgICAgcmV0dXJuIHB0cl87CisgIH0KKworICBsb25nIHVzZV9jb3VudCgpIGNvbnN0IHsKKyAgICByZXR1cm4gY29udHJvbF9ibG9ja18gPyBjb250cm9sX2Jsb2NrXy0+cmVmY291bnRfIDogMTsKKyAgfQorCisgIGJvb2wgdW5pcXVlKCkgY29uc3QgeworICAgIHJldHVybiB1c2VfY291bnQoKSA9PSAxOworICB9CisKKyBwcml2YXRlOgorICAvLyBJZiByIGlzIG5vbi1lbXB0eSwgaW5pdGlhbGl6ZSAqdGhpcyB0byBzaGFyZSBvd25lcnNoaXAgd2l0aCByLAorICAvLyBpbmNyZWFzaW5nIHRoZSB1bmRlcmx5aW5nIHJlZmVyZW5jZSBjb3VudC4KKyAgLy8gSWYgciBpcyBlbXB0eSwgKnRoaXMgcmVtYWlucyBlbXB0eS4KKyAgLy8gUmVxdWlyZXM6IHRoaXMgaXMgZW1wdHksIG5hbWVseSB0aGlzLT5wdHJfID09IE5VTEwuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICB2b2lkIEluaXRpYWxpemUoY29uc3Qgc2hhcmVkX3B0cjxVPiYgcikgeworICAgIC8vIFRoaXMgcGVyZm9ybXMgYSBzdGF0aWNfY2FzdCBvbiByLnB0cl8gdG8gVSosIHdoaWNoIGlzIGEgbm8tb3Agc2luY2UgaXQKKyAgICAvLyBpcyBhbHJlYWR5IGEgVSouIFNvIGluaXRpYWxpemF0aW9uIGhlcmUgcmVxdWlyZXMgdGhhdCByLnB0cl8gaXMKKyAgICAvLyBpbXBsaWNpdGx5IGNvbnZlcnRpYmxlIHRvIFQqLgorICAgIEluaXRpYWxpemVXaXRoU3RhdGljQ2FzdDxVPihyKTsKKyAgfQorCisgIC8vIEluaXRpYWxpemVzICp0aGlzIGFzIGRlc2NyaWJlZCBpbiBJbml0aWFsaXplLCBidXQgYWRkaXRpb25hbGx5IHBlcmZvcm1zIGEKKyAgLy8gc3RhdGljX2Nhc3QgZnJvbSByLnB0cl8gKFYqKSB0byBVKi4KKyAgLy8gTk9URShnZmMpOiBXZSdkIG5lZWQgYSBtb3JlIGdlbmVyYWwgZm9ybSB0byBzdXBwb3J0IGNvbnN0X3BvaW50ZXJfY2FzdCBhbmQKKyAgLy8gZHluYW1pY19wb2ludGVyX2Nhc3QsIGJ1dCB0aG9zZSBvcGVyYXRpb25zIGFyZSBzdWZmaWNpZW50bHkgZGlzY291cmFnZWQKKyAgLy8gdGhhdCBzdXBwb3J0aW5nIHN0YXRpY19wb2ludGVyX2Nhc3QgaXMgc3VmZmljaWVudC4KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFUsIHR5cGVuYW1lIFY+CisgIHZvaWQgSW5pdGlhbGl6ZVdpdGhTdGF0aWNDYXN0KGNvbnN0IHNoYXJlZF9wdHI8Vj4mIHIpIHsKKyAgICBpZiAoci5jb250cm9sX2Jsb2NrXyAhPSBOVUxMKSB7CisgICAgICBSZWZDb3VudEluYygmci5jb250cm9sX2Jsb2NrXy0+cmVmY291bnRfKTsKKworICAgICAgcHRyXyA9IHN0YXRpY19jYXN0PFUqPihyLnB0cl8pOworICAgICAgY29udHJvbF9ibG9ja18gPSByLmNvbnRyb2xfYmxvY2tfOworICAgIH0KKyAgfQorCisgIC8vIEhlbHBlciBmdW5jdGlvbiBmb3IgdGhlIGNvbnN0cnVjdG9yIHRoYXQgdGFrZXMgYSByYXcgcG9pbnRlci4gSWYgVAorICAvLyBkb2Vzbid0IGluaGVyaXQgZnJvbSBlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxUPiB0aGVuIHdlIGhhdmUgbm90aGluZyB0bworICAvLyBkbywgc28gdGhpcyBmdW5jdGlvbiBpcyB0cml2aWFsIGFuZCBpbmxpbmUuIFRoZSBvdGhlciB2ZXJzaW9uIGlzIGRlY2xhcmVkCisgIC8vIG91dCBvZiBsaW5lLCBhZnRlciB0aGUgY2xhc3MgZGVmaW5pdGlvbiBvZiBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcy4KKyAgdm9pZCBNYXliZVNldHVwV2Vha1RoaXMoZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXM8VD4qIHB0cik7CisgIHZvaWQgTWF5YmVTZXR1cFdlYWtUaGlzKC4uLikgeyB9CisKKyAgVCogcHRyXzsKKyAgU2hhcmVkUHRyQ29udHJvbEJsb2NrKiBjb250cm9sX2Jsb2NrXzsKKworI2lmbmRlZiBTV0lHCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBVPgorICBmcmllbmQgY2xhc3Mgc2hhcmVkX3B0cjsKKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVSwgdHlwZW5hbWUgVj4KKyAgZnJpZW5kIHNoYXJlZF9wdHI8VT4gc3RhdGljX3BvaW50ZXJfY2FzdChjb25zdCBzaGFyZWRfcHRyPFY+JiByaHMpOworI2VuZGlmCit9OworCisvLyBNYXRjaGVzIHRoZSBpbnRlcmZhY2Ugb2Ygc3RkOjpzd2FwIGFzIGFuIGFpZCB0byBnZW5lcmljIHByb2dyYW1taW5nLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+IHZvaWQgc3dhcChzaGFyZWRfcHRyPFQ+JiByLCBzaGFyZWRfcHRyPFQ+JiBzKSB7CisgIHIuc3dhcChzKTsKK30KKwordGVtcGxhdGUgPHR5cGVuYW1lIFQsIHR5cGVuYW1lIFU+CitzaGFyZWRfcHRyPFQ+IHN0YXRpY19wb2ludGVyX2Nhc3QoY29uc3Qgc2hhcmVkX3B0cjxVPiYgcmhzKSB7CisgIHNoYXJlZF9wdHI8VD4gbGhzOworICBsaHMudGVtcGxhdGUgSW5pdGlhbGl6ZVdpdGhTdGF0aWNDYXN0PFQ+KHJocyk7CisgIHJldHVybiBsaHM7Cit9CisKKy8vIFNlZSBjb21tZW50cyBhdCB0aGUgdG9wIG9mIHRoZSBmaWxlIGZvciBhIGRlc2NyaXB0aW9uIG9mIHdoeSB0aGlzCisvLyBjbGFzcyBleGlzdHMsIGFuZCB0aGUgZHJhZnQgQysrIHN0YW5kYXJkIChhcyBvZiBKdWx5IDIwMDkgdGhlCisvLyBsYXRlc3QgZHJhZnQgaXMgTjI5MTQpIGZvciB0aGUgZGV0YWlsZWQgc3BlY2lmaWNhdGlvbi4KK3RlbXBsYXRlIDx0eXBlbmFtZSBUPgorY2xhc3Mgd2Vha19wdHIgeworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gZnJpZW5kIGNsYXNzIHdlYWtfcHRyOworIHB1YmxpYzoKKyAgdHlwZWRlZiBUIGVsZW1lbnRfdHlwZTsKKworICAvLyBDcmVhdGUgYW4gZW1wdHkgKGkuZS4gYWxyZWFkeSBleHBpcmVkKSB3ZWFrX3B0ci4KKyAgd2Vha19wdHIoKSA6IHB0cl8oTlVMTCksIGNvbnRyb2xfYmxvY2tfKE5VTEwpIHsgfQorCisgIC8vIENyZWF0ZSBhIHdlYWtfcHRyIHRoYXQgb2JzZXJ2ZXMgdGhlIHNhbWUgb2JqZWN0IHRoYXQgcHRyIHBvaW50cworICAvLyB0by4gIE5vdGUgdGhhdCB0aGVyZSBpcyBubyByYWNlIGNvbmRpdGlvbiBoZXJlOiB3ZSBrbm93IHRoYXQgdGhlCisgIC8vIGNvbnRyb2wgYmxvY2sgY2FuJ3QgZGlzYXBwZWFyIHdoaWxlIHdlJ3JlIGxvb2tpbmcgYXQgaXQgYmVjYXVzZQorICAvLyBpdCBpcyBvd25lZCBieSBhdCBsZWFzdCBvbmUgc2hhcmVkX3B0ciwgcHRyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gd2Vha19wdHIoY29uc3Qgc2hhcmVkX3B0cjxVPiYgcHRyKSB7CisgICAgQ29weUZyb20ocHRyLnB0cl8sIHB0ci5jb250cm9sX2Jsb2NrXyk7CisgIH0KKworICAvLyBDb3B5IGEgd2Vha19wdHIuIFRoZSBvYmplY3QgaXQgcG9pbnRzIHRvIG1pZ2h0IGRpc2FwcGVhciwgYnV0IHdlCisgIC8vIGRvbid0IGNhcmU6IHdlJ3JlIG9ubHkgd29ya2luZyB3aXRoIHRoZSBjb250cm9sIGJsb2NrLCBhbmQgaXQgY2FuJ3QKKyAgLy8gZGlzYXBwZWFyIHdoaWxlIHdlJ3JlIGxvb2tpbmcgYXQgYmVjYXVzZSBpdCdzIG93bmVkIGJ5IGF0IGxlYXN0IG9uZQorICAvLyB3ZWFrX3B0ciwgcHRyLgorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gd2Vha19wdHIoY29uc3Qgd2Vha19wdHI8VT4mIHB0cikgeworICAgIENvcHlGcm9tKHB0ci5wdHJfLCBwdHIuY29udHJvbF9ibG9ja18pOworICB9CisKKyAgLy8gTmVlZCBub24tdGVtcGxhdGVkIHZlcnNpb24gdG8gcHJldmVudCBkZWZhdWx0IGNvcHkgY29uc3RydWN0b3IKKyAgd2Vha19wdHIoY29uc3Qgd2Vha19wdHImIHB0cikgeworICAgIENvcHlGcm9tKHB0ci5wdHJfLCBwdHIuY29udHJvbF9ibG9ja18pOworICB9CisKKyAgLy8gRGVzdHJveSB0aGUgd2Vha19wdHIuIElmIG5vIHNoYXJlZF9wdHIgb3ducyB0aGUgY29udHJvbCBibG9jaywgYW5kIGlmCisgIC8vIHdlIGFyZSB0aGUgbGFzdCB3ZWFrX3B0ciB0byBvd24gaXQsIHRoZW4gaXQgY2FuIGJlIGRlbGV0ZWQuIE5vdGUgdGhhdAorICAvLyB3ZWFrX2NvdW50XyBpcyBkZWZpbmVkIGFzIHRoZSBudW1iZXIgb2Ygd2Vha19wdHJzIHNoYXJpbmcgdGhpcyBjb250cm9sCisgIC8vIGJsb2NrLCBwbHVzIDEgaWYgdGhlcmUgYXJlIGFueSBzaGFyZWRfcHRycy4gV2UgdGhlcmVmb3JlIGtub3cgdGhhdCBpdCdzCisgIC8vIHNhZmUgdG8gZGVsZXRlIHRoZSBjb250cm9sIGJsb2NrIHdoZW4gd2Vha19jb3VudF8gcmVhY2hlcyAwLCB3aXRob3V0CisgIC8vIGhhdmluZyB0byBwZXJmb3JtIGFueSBhZGRpdGlvbmFsIHRlc3RzLgorICB+d2Vha19wdHIoKSB7CisgICAgaWYgKGNvbnRyb2xfYmxvY2tfICE9IE5VTEwgJiYKKyAgICAgICAgIVJlZkNvdW50RGVjKCZjb250cm9sX2Jsb2NrXy0+d2Vha19jb3VudF8pKSB7CisgICAgICBkZWxldGUgY29udHJvbF9ibG9ja187CisgICAgfQorICB9CisKKyAgd2Vha19wdHImIG9wZXJhdG9yPShjb25zdCB3ZWFrX3B0ciYgcHRyKSB7CisgICAgaWYgKCZwdHIgIT0gdGhpcykgeworICAgICAgd2Vha19wdHIgdG1wKHB0cik7CisgICAgICB0bXAuc3dhcCgqdGhpcyk7CisgICAgfQorICAgIHJldHVybiAqdGhpczsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gd2Vha19wdHImIG9wZXJhdG9yPShjb25zdCB3ZWFrX3B0cjxVPiYgcHRyKSB7CisgICAgd2Vha19wdHIgdG1wKHB0cik7CisgICAgdG1wLnN3YXAoKnRoaXMpOworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVT4gd2Vha19wdHImIG9wZXJhdG9yPShjb25zdCBzaGFyZWRfcHRyPFU+JiBwdHIpIHsKKyAgICB3ZWFrX3B0ciB0bXAocHRyKTsKKyAgICB0bXAuc3dhcCgqdGhpcyk7CisgICAgcmV0dXJuICp0aGlzOworICB9CisKKyAgdm9pZCBzd2FwKHdlYWtfcHRyJiBwdHIpIHsKKyAgICB1c2luZyBzdGQ6OnN3YXA7ICAvLyBodHRwOi8vZ28vdXNpbmctc3RkLXN3YXAKKyAgICBzd2FwKHB0cl8sIHB0ci5wdHJfKTsKKyAgICBzd2FwKGNvbnRyb2xfYmxvY2tfLCBwdHIuY29udHJvbF9ibG9ja18pOworICB9CisKKyAgdm9pZCByZXNldCgpIHsKKyAgICB3ZWFrX3B0ciB0bXA7CisgICAgdG1wLnN3YXAoKnRoaXMpOworICB9CisKKyAgLy8gUmV0dXJuIHRoZSBudW1iZXIgb2Ygc2hhcmVkX3B0cnMgdGhhdCBvd24gdGhlIG9iamVjdCB3ZSBhcmUgb2JzZXJ2aW5nLgorICAvLyBOb3RlIHRoYXQgdGhpcyBudW1iZXIgY2FuIGJlIDAgKGlmIHRoaXMgcG9pbnRlciBoYXMgZXhwaXJlZCkuCisgIGxvbmcgdXNlX2NvdW50KCkgY29uc3QgeworICAgIHJldHVybiBjb250cm9sX2Jsb2NrXyAhPSBOVUxMID8gY29udHJvbF9ibG9ja18tPnJlZmNvdW50XyA6IDA7CisgIH0KKworICBib29sIGV4cGlyZWQoKSBjb25zdCB7IHJldHVybiB1c2VfY291bnQoKSA9PSAwOyB9CisKKyAgLy8gUmV0dXJuIGEgc2hhcmVkX3B0ciB0aGF0IG93bnMgdGhlIG9iamVjdCB3ZSBhcmUgb2JzZXJ2aW5nLiBJZiB3ZQorICAvLyBoYXZlIGV4cGlyZWQsIHRoZSBzaGFyZWRfcHRyIHdpbGwgYmUgZW1wdHkuIFdlIGhhdmUgdG8gYmUgY2FyZWZ1bAorICAvLyBhYm91dCBjb25jdXJyZW5jeSwgdGhvdWdoLCBzaW5jZSBzb21lIG90aGVyIHRocmVhZCBtaWdodCBiZQorICAvLyBkZXN0cm95aW5nIHRoZSBsYXN0IG93bmluZyBzaGFyZWRfcHRyIHdoaWxlIHdlJ3JlIGluIHRoaXMKKyAgLy8gZnVuY3Rpb24uICBXZSB3YW50IHRvIGluY3JlbWVudCB0aGUgcmVmY291bnQgb25seSBpZiBpdCdzIG5vbnplcm8KKyAgLy8gYW5kIGdldCB0aGUgbmV3IHZhbHVlLCBhbmQgd2Ugd2FudCB0aGF0IHdob2xlIG9wZXJhdGlvbiB0byBiZQorICAvLyBhdG9taWMuCisgIHNoYXJlZF9wdHI8VD4gbG9jaygpIGNvbnN0IHsKKyAgICBzaGFyZWRfcHRyPFQ+IHJlc3VsdDsKKyAgICBpZiAoY29udHJvbF9ibG9ja18gIT0gTlVMTCkgeworICAgICAgQXRvbWljMzIgb2xkX3JlZmNvdW50OworICAgICAgZG8geworICAgICAgICBvbGRfcmVmY291bnQgPSBjb250cm9sX2Jsb2NrXy0+cmVmY291bnRfOworICAgICAgICBpZiAob2xkX3JlZmNvdW50ID09IDApCisgICAgICAgICAgYnJlYWs7CisgICAgICB9IHdoaWxlIChvbGRfcmVmY291bnQgIT0KKyAgICAgICAgICAgICAgIE5vQmFycmllcl9Db21wYXJlQW5kU3dhcCgKKyAgICAgICAgICAgICAgICAgICAmY29udHJvbF9ibG9ja18tPnJlZmNvdW50Xywgb2xkX3JlZmNvdW50LAorICAgICAgICAgICAgICAgICAgIG9sZF9yZWZjb3VudCArIDEpKTsKKyAgICAgIGlmIChvbGRfcmVmY291bnQgPiAwKSB7CisgICAgICAgIHJlc3VsdC5wdHJfID0gcHRyXzsKKyAgICAgICAgcmVzdWx0LmNvbnRyb2xfYmxvY2tfID0gY29udHJvbF9ibG9ja187CisgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorCisgcHJpdmF0ZToKKyAgdm9pZCBDb3B5RnJvbShUKiBwdHIsIFNoYXJlZFB0ckNvbnRyb2xCbG9jayogY29udHJvbF9ibG9jaykgeworICAgIHB0cl8gPSBwdHI7CisgICAgY29udHJvbF9ibG9ja18gPSBjb250cm9sX2Jsb2NrOworICAgIGlmIChjb250cm9sX2Jsb2NrXyAhPSBOVUxMKQorICAgICAgUmVmQ291bnRJbmMoJmNvbnRyb2xfYmxvY2tfLT53ZWFrX2NvdW50Xyk7CisgIH0KKworIHByaXZhdGU6CisgIGVsZW1lbnRfdHlwZSogcHRyXzsKKyAgU2hhcmVkUHRyQ29udHJvbEJsb2NrKiBjb250cm9sX2Jsb2NrXzsKK307CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiB2b2lkIHN3YXAod2Vha19wdHI8VD4mIHIsIHdlYWtfcHRyPFQ+JiBzKSB7CisgIHIuc3dhcChzKTsKK30KKworLy8gU2VlIGNvbW1lbnRzIGF0IHRoZSB0b3Agb2YgdGhlIGZpbGUgZm9yIGEgZGVzY3JpcHRpb24gb2Ygd2h5IHRoaXMgY2xhc3MKKy8vIGV4aXN0cywgYW5kIHNlY3Rpb24gMjAuOC4xMC41IG9mIHRoZSBkcmFmdCBDKysgc3RhbmRhcmQgKGFzIG9mIEp1bHkgMjAwOQorLy8gdGhlIGxhdGVzdCBkcmFmdCBpcyBOMjkxNCkgZm9yIHRoZSBkZXRhaWxlZCBzcGVjaWZpY2F0aW9uLgordGVtcGxhdGUgPHR5cGVuYW1lIFQ+CitjbGFzcyBlbmFibGVfc2hhcmVkX2Zyb21fdGhpcyB7CisgIGZyaWVuZCBjbGFzcyBzaGFyZWRfcHRyPFQ+OworIHB1YmxpYzoKKyAgLy8gUHJlY29uZGl0aW9uOiB0aGVyZSBtdXN0IGJlIGEgc2hhcmVkX3B0ciB0aGF0IG93bnMgKnRoaXMgYW5kIHRoYXQgd2FzCisgIC8vIGNyZWF0ZWQsIGRpcmVjdGx5IG9yIGluZGlyZWN0bHksIGZyb20gYSByYXcgcG9pbnRlciBvZiB0eXBlIFQqLiAoVGhlCisgIC8vIGxhdHRlciBwYXJ0IG9mIHRoZSBjb25kaXRpb24gaXMgdGVjaG5pY2FsIGJ1dCBub3QgcXVpdGUgcmVkdW5kYW50OyBpdAorICAvLyBydWxlcyBvdXQgc29tZSBjb21wbGljYXRlZCB1c2VzIGludm9sdmluZyBpbmhlcml0YW5jZSBoaWVyYXJjaGllcy4pCisgIHNoYXJlZF9wdHI8VD4gc2hhcmVkX2Zyb21fdGhpcygpIHsKKyAgICAvLyBCZWhhdmlvciBpcyB1bmRlZmluZWQgaWYgdGhlIHByZWNvbmRpdGlvbiBpc24ndCBzYXRpc2ZpZWQ7IHdlIGNob29zZQorICAgIC8vIHRvIGRpZSB3aXRoIGEgQ0hFQ0sgZmFpbHVyZS4KKyAgICBDSEVDSyghd2Vha190aGlzXy5leHBpcmVkKCkpIDw8ICJObyBzaGFyZWRfcHRyIG93bnMgdGhpcyBvYmplY3QiOworICAgIHJldHVybiB3ZWFrX3RoaXNfLmxvY2soKTsKKyAgfQorICBzaGFyZWRfcHRyPGNvbnN0IFQ+IHNoYXJlZF9mcm9tX3RoaXMoKSBjb25zdCB7CisgICAgQ0hFQ0soIXdlYWtfdGhpc18uZXhwaXJlZCgpKSA8PCAiTm8gc2hhcmVkX3B0ciBvd25zIHRoaXMgb2JqZWN0IjsKKyAgICByZXR1cm4gd2Vha190aGlzXy5sb2NrKCk7CisgIH0KKworIHByb3RlY3RlZDoKKyAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKyAgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmIC8qb3RoZXIqLykgeyB9CisgIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzJiBvcGVyYXRvcj0oY29uc3QgZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMmIC8qb3RoZXIqLykgeworICAgIHJldHVybiAqdGhpczsKKyAgfQorICB+ZW5hYmxlX3NoYXJlZF9mcm9tX3RoaXMoKSB7IH0KKworIHByaXZhdGU6CisgIHdlYWtfcHRyPFQ+IHdlYWtfdGhpc187Cit9OworCisvLyBUaGlzIGlzIGEgaGVscGVyIGZ1bmN0aW9uIGNhbGxlZCBieSBzaGFyZWRfcHRyJ3MgY29uc3RydWN0b3IgZnJvbSBhIHJhdworLy8gcG9pbnRlci4gSWYgVCBpbmhlcml0cyBmcm9tIGVuYWJsZV9zaGFyZWRfZnJvbV90aGlzPFQ+LCBpdCBzZXRzIHVwCisvLyB3ZWFrX3RoaXNfIHNvIHRoYXQgc2hhcmVkX2Zyb21fdGhpcyB3b3JrcyBjb3JyZWN0bHkuIElmIFQgZG9lcyBub3QgaW5oZXJpdAorLy8gZnJvbSB3ZWFrX3RoaXMgd2UgZ2V0IGEgZGlmZmVyZW50IG92ZXJsb2FkLCBkZWZpbmVkIGlubGluZSwgd2hpY2ggZG9lcworLy8gbm90aGluZy4KK3RlbXBsYXRlPHR5cGVuYW1lIFQ+Cit2b2lkIHNoYXJlZF9wdHI8VD46Ok1heWJlU2V0dXBXZWFrVGhpcyhlbmFibGVfc2hhcmVkX2Zyb21fdGhpczxUPiogcHRyKSB7CisgIGlmIChwdHIpIHsKKyAgICBDSEVDSyhwdHItPndlYWtfdGhpc18uZXhwaXJlZCgpKSA8PCAiT2JqZWN0IGFscmVhZHkgb3duZWQgYnkgYSBzaGFyZWRfcHRyIjsKKyAgICBwdHItPndlYWtfdGhpc18gPSAqdGhpczsKKyAgfQorfQorCisjZW5kaWYgIC8vIFVUSUxfR1RMX1VTRV9TVERfU0hBUkVEX1BUUgorCit9ICAvLyBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKKyNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1NUVUJTX1NIQVJFRF9QVFJfSF9fCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NpbmdsZXRvbi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc2luZ2xldG9uLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc2luZ2xldG9uLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NpbmdsZXRvbi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDVkODViMAotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5jYwpAQCAtMCwwICsxLDE0MCBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1cy5oPgorCisjaWZuZGVmIFNUQVJCT0FSRAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisjaW5jbHVkZSA8b3N0cmVhbT4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8dXRpbGl0eT4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworbmFtZXNwYWNlIHV0aWwgeworbmFtZXNwYWNlIGVycm9yIHsKK2lubGluZSBzdHJpbmcgQ29kZUVudW1Ub1N0cmluZyhlcnJvcjo6Q29kZSBjb2RlKSB7CisgIHN3aXRjaCAoY29kZSkgeworICAgIGNhc2UgT0s6CisgICAgICByZXR1cm4gIk9LIjsKKyAgICBjYXNlIENBTkNFTExFRDoKKyAgICAgIHJldHVybiAiQ0FOQ0VMTEVEIjsKKyAgICBjYXNlIFVOS05PV046CisgICAgICByZXR1cm4gIlVOS05PV04iOworICAgIGNhc2UgSU5WQUxJRF9BUkdVTUVOVDoKKyAgICAgIHJldHVybiAiSU5WQUxJRF9BUkdVTUVOVCI7CisgICAgY2FzZSBERUFETElORV9FWENFRURFRDoKKyAgICAgIHJldHVybiAiREVBRExJTkVfRVhDRUVERUQiOworICAgIGNhc2UgTk9UX0ZPVU5EOgorICAgICAgcmV0dXJuICJOT1RfRk9VTkQiOworICAgIGNhc2UgQUxSRUFEWV9FWElTVFM6CisgICAgICByZXR1cm4gIkFMUkVBRFlfRVhJU1RTIjsKKyAgICBjYXNlIFBFUk1JU1NJT05fREVOSUVEOgorICAgICAgcmV0dXJuICJQRVJNSVNTSU9OX0RFTklFRCI7CisgICAgY2FzZSBVTkFVVEhFTlRJQ0FURUQ6CisgICAgICByZXR1cm4gIlVOQVVUSEVOVElDQVRFRCI7CisgICAgY2FzZSBSRVNPVVJDRV9FWEhBVVNURUQ6CisgICAgICByZXR1cm4gIlJFU09VUkNFX0VYSEFVU1RFRCI7CisgICAgY2FzZSBGQUlMRURfUFJFQ09ORElUSU9OOgorICAgICAgcmV0dXJuICJGQUlMRURfUFJFQ09ORElUSU9OIjsKKyAgICBjYXNlIEFCT1JURUQ6CisgICAgICByZXR1cm4gIkFCT1JURUQiOworICAgIGNhc2UgT1VUX09GX1JBTkdFOgorICAgICAgcmV0dXJuICJPVVRfT0ZfUkFOR0UiOworICAgIGNhc2UgVU5JTVBMRU1FTlRFRDoKKyAgICAgIHJldHVybiAiVU5JTVBMRU1FTlRFRCI7CisgICAgY2FzZSBJTlRFUk5BTDoKKyAgICAgIHJldHVybiAiSU5URVJOQUwiOworICAgIGNhc2UgVU5BVkFJTEFCTEU6CisgICAgICByZXR1cm4gIlVOQVZBSUxBQkxFIjsKKyAgICBjYXNlIERBVEFfTE9TUzoKKyAgICAgIHJldHVybiAiREFUQV9MT1NTIjsKKyAgfQorCisgIC8vIE5vIGRlZmF1bHQgY2xhdXNlLCBjbGFuZyB3aWxsIGFib3J0IGlmIGEgY29kZSBpcyBtaXNzaW5nIGZyb20KKyAgLy8gYWJvdmUgc3dpdGNoLgorICByZXR1cm4gIlVOS05PV04iOworfQorfSAgLy8gbmFtZXNwYWNlIGVycm9yLgorCitjb25zdCBTdGF0dXNQb2QgU3RhdHVzOjpPSyA9IHsgZXJyb3I6Ok9LIH07Citjb25zdCBTdGF0dXNQb2QgU3RhdHVzOjpDQU5DRUxMRUQgPSB7IGVycm9yOjpDQU5DRUxMRUQgfTsKK2NvbnN0IFN0YXR1c1BvZCBTdGF0dXM6OlVOS05PV04gPSB7IGVycm9yOjpVTktOT1dOIH07CisKK1N0YXR1czo6U3RhdHVzKCkgOiBlcnJvcl9jb2RlXyhlcnJvcjo6T0spIHsKK30KKworU3RhdHVzOjpTdGF0dXMoZXJyb3I6OkNvZGUgZXJyb3JfY29kZSwgU3RyaW5nUGllY2UgZXJyb3JfbWVzc2FnZSkKKyAgICA6IGVycm9yX2NvZGVfKGVycm9yX2NvZGUpIHsKKyAgaWYgKGVycm9yX2NvZGUgIT0gZXJyb3I6Ok9LKSB7CisgICAgZXJyb3JfbWVzc2FnZV8gPSBlcnJvcl9tZXNzYWdlLlRvU3RyaW5nKCk7CisgIH0KK30KKworU3RhdHVzOjpTdGF0dXMoY29uc3QgU3RhdHVzJiBvdGhlcikKKyAgICA6IGVycm9yX2NvZGVfKG90aGVyLmVycm9yX2NvZGVfKSwgZXJyb3JfbWVzc2FnZV8ob3RoZXIuZXJyb3JfbWVzc2FnZV8pIHsKK30KKworU3RhdHVzOjpTdGF0dXMoY29uc3QgU3RhdHVzUG9kJiBzdGF0dXNfcG9kKSA6IGVycm9yX2NvZGVfKHN0YXR1c19wb2QuY29kZSkgeworfQorCitTdGF0dXMmIFN0YXR1czo6b3BlcmF0b3I9KGNvbnN0IFN0YXR1cyYgb3RoZXIpIHsKKyAgZXJyb3JfY29kZV8gPSBvdGhlci5lcnJvcl9jb2RlXzsKKyAgZXJyb3JfbWVzc2FnZV8gPSBvdGhlci5lcnJvcl9tZXNzYWdlXzsKKyAgcmV0dXJuICp0aGlzOworfQorCitib29sIFN0YXR1czo6b3BlcmF0b3I9PShjb25zdCBTdGF0dXMmIHgpIGNvbnN0IHsKKyAgcmV0dXJuIGVycm9yX2NvZGVfID09IHguZXJyb3JfY29kZV8gJiYKKyAgICAgIGVycm9yX21lc3NhZ2VfID09IHguZXJyb3JfbWVzc2FnZV87Cit9CisKK3N0cmluZyBTdGF0dXM6OlRvU3RyaW5nKCkgY29uc3QgeworICBpZiAoZXJyb3JfY29kZV8gPT0gZXJyb3I6Ok9LKSB7CisgICAgcmV0dXJuICJPSyI7CisgIH0gZWxzZSB7CisgICAgaWYgKGVycm9yX21lc3NhZ2VfLmVtcHR5KCkpIHsKKyAgICAgIHJldHVybiBlcnJvcjo6Q29kZUVudW1Ub1N0cmluZyhlcnJvcl9jb2RlXyk7CisgICAgfSBlbHNlIHsKKyAgICAgIHJldHVybiBlcnJvcjo6Q29kZUVudW1Ub1N0cmluZyhlcnJvcl9jb2RlXykgKyAiOiIgKworICAgICAgICAgIGVycm9yX21lc3NhZ2VfOworICAgIH0KKyAgfQorfQorCitvc3RyZWFtJiBvcGVyYXRvcjw8KG9zdHJlYW0mIG9zLCBjb25zdCBTdGF0dXMmIHgpIHsKKyAgb3MgPDwgeC5Ub1N0cmluZygpOworICByZXR1cm4gb3M7Cit9CisKK30gIC8vIG5hbWVzcGFjZSB1dGlsCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX21hY3Jvcy5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX21hY3Jvcy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c19tYWNyb3MuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX21hY3Jvcy5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX3Rlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c190ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3IuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGF0dXNvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0YXR1c29yX3Rlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RhdHVzb3JfdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaApkZWxldGVkIGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggYTJlNjcxYi4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaAorKysgL2Rldi9udWxsCkBAIC0xLDEyMSArMCwwIEBACi0vLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKLS8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLwotLy8KLS8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAotLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQotLy8gbWV0OgotLy8KLS8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJvdmUgY29weXJpZ2h0Ci0vLyBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIuCi0vLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlCi0vLyBjb3B5cmlnaHQgbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyCi0vLyBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlCi0vLyBkaXN0cmlidXRpb24uCi0vLyAgICAgKiBOZWl0aGVyIHRoZSBuYW1lIG9mIEdvb2dsZSBJbmMuIG5vciB0aGUgbmFtZXMgb2YgaXRzCi0vLyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzIGRlcml2ZWQgZnJvbQotLy8gdGhpcyBzb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KLS8vCi0vLyBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZIFRIRSBDT1BZUklHSFQgSE9MREVSUyBBTkQgQ09OVFJJQlVUT1JTCi0vLyAiQVMgSVMiIEFORCBBTlkgRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVUIE5PVAotLy8gTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCi0vLyBBIFBBUlRJQ1VMQVIgUFVSUE9TRSBBUkUgRElTQ0xBSU1FRC4gSU4gTk8gRVZFTlQgU0hBTEwgVEhFIENPUFlSSUdIVAotLy8gT1dORVIgT1IgQ09OVFJJQlVUT1JTIEJFIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwgSU5ESVJFQ1QsIElOQ0lERU5UQUwsCi0vLyBTUEVDSUFMLCBFWEVNUExBUlksIE9SIENPTlNFUVVFTlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UCi0vLyBMSU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwKLS8vIERBVEEsIE9SIFBST0ZJVFM7IE9SIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQgQU5EIE9OIEFOWQotLy8gVEhFT1JZIE9GIExJQUJJTElUWSwgV0hFVEhFUiBJTiBDT05UUkFDVCwgU1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVAotLy8gKElOQ0xVRElORyBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFCi0vLyBPRiBUSElTIFNPRlRXQVJFLCBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdFLgotCi0vLyBmcm9tIGdvb2dsZTMvdXRpbC9ndGwvc3RsX3V0aWwtaW5sLmgKLQotI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RMX1VUSUxfSU5MX0hfXwotI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RMX1VUSUxfSU5MX0hfXwotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotCi1uYW1lc3BhY2UgZ29vZ2xlIHsKLW5hbWVzcGFjZSBwcm90b2J1ZiB7Ci0KLS8vIFNUTERlbGV0ZUNvbnRhaW5lclBvaW50ZXJzKCkKLS8vICBGb3IgYSByYW5nZSB3aXRoaW4gYSBjb250YWluZXIgb2YgcG9pbnRlcnMsIGNhbGxzIGRlbGV0ZQotLy8gIChub24tYXJyYXkgdmVyc2lvbikgb24gdGhlc2UgcG9pbnRlcnMuCi0vLyBOT1RFOiBmb3IgdGhlc2UgdGhyZWUgZnVuY3Rpb25zLCB3ZSBjb3VsZCBqdXN0IGltcGxlbWVudCBhIERlbGV0ZU9iamVjdAotLy8gZnVuY3RvciBhbmQgdGhlbiBjYWxsIGZvcl9lYWNoKCkgb24gdGhlIHJhbmdlIGFuZCBmdW5jdG9yLCBidXQgdGhpcwotLy8gcmVxdWlyZXMgdXMgdG8gcHVsbCBpbiBhbGwgb2YgYWxnb3JpdGhtLmgsIHdoaWNoIHNlZW1zIGV4cGVuc2l2ZS4KLS8vIEZvciBoYXNoX1ttdWx0aV1zZXQsIGl0IGlzIGltcG9ydGFudCB0aGF0IHRoaXMgZGVsZXRlcyBiZWhpbmQgdGhlIGl0ZXJhdG9yCi0vLyBiZWNhdXNlIHRoZSBoYXNoX3NldCBtYXkgY2FsbCB0aGUgaGFzaCBmdW5jdGlvbiBvbiB0aGUgaXRlcmF0b3Igd2hlbiBpdCBpcwotLy8gYWR2YW5jZWQsIHdoaWNoIGNvdWxkIHJlc3VsdCBpbiB0aGUgaGFzaCBmdW5jdGlvbiB0cnlpbmcgdG8gZGVmZXJlbmNlIGEKLS8vIHN0YWxlIHBvaW50ZXIuCi10ZW1wbGF0ZSA8Y2xhc3MgRm9yd2FyZEl0ZXJhdG9yPgotdm9pZCBTVExEZWxldGVDb250YWluZXJQb2ludGVycyhGb3J3YXJkSXRlcmF0b3IgYmVnaW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvcndhcmRJdGVyYXRvciBlbmQpIHsKLSAgd2hpbGUgKGJlZ2luICE9IGVuZCkgewotICAgIEZvcndhcmRJdGVyYXRvciB0ZW1wID0gYmVnaW47Ci0gICAgKytiZWdpbjsKLSAgICBkZWxldGUgKnRlbXA7Ci0gIH0KLX0KLQotLy8gSW5zaWRlIEdvb2dsZSwgdGhpcyBmdW5jdGlvbiBpbXBsZW1lbnRzIGEgaG9ycmlibGUsIGRpc2d1c3RpbmcgaGFjayBpbiB3aGljaAotLy8gd2UgcmVhY2ggaW50byB0aGUgc3RyaW5nJ3MgcHJpdmF0ZSBpbXBsZW1lbnRhdGlvbiBhbmQgcmVzaXplIGl0IHdpdGhvdXQKLS8vIGluaXRpYWxpemluZyB0aGUgbmV3IGJ5dGVzLiAgSW4gc29tZSBjYXNlcyBkb2luZyB0aGlzIGNhbiBzaWduaWZpY2FudGx5Ci0vLyBpbXByb3ZlIHBlcmZvcm1hbmNlLiAgSG93ZXZlciwgc2luY2UgaXQncyB0b3RhbGx5IG5vbi1wb3J0YWJsZSBpdCBoYXMgbm8KLS8vIHBsYWNlIGluIG9wZW4gc291cmNlIGNvZGUuICBGZWVsIGZyZWUgdG8gZmlsbCB0aGlzIGZ1bmN0aW9uIGluIHdpdGggeW91cgotLy8gb3duIGRpc2d1c3RpbmcgaGFjayBpZiB5b3Ugd2FudCB0aGUgcGVyZiBib29zdC4KLWlubGluZSB2b2lkIFNUTFN0cmluZ1Jlc2l6ZVVuaW5pdGlhbGl6ZWQoc3RyaW5nKiBzLCBzaXplX3QgbmV3X3NpemUpIHsKLSAgcy0+cmVzaXplKG5ld19zaXplKTsKLX0KLQotLy8gUmV0dXJuIGEgbXV0YWJsZSBjaGFyKiBwb2ludGluZyB0byBhIHN0cmluZydzIGludGVybmFsIGJ1ZmZlciwKLS8vIHdoaWNoIG1heSBub3QgYmUgbnVsbC10ZXJtaW5hdGVkLiBXcml0aW5nIHRocm91Z2ggdGhpcyBwb2ludGVyIHdpbGwKLS8vIG1vZGlmeSB0aGUgc3RyaW5nLgotLy8KLS8vIHN0cmluZ19hc19hcnJheSgmc3RyKVtpXSBpcyB2YWxpZCBmb3IgMCA8PSBpIDwgc3RyLnNpemUoKSB1bnRpbCB0aGUKLS8vIG5leHQgY2FsbCB0byBhIHN0cmluZyBtZXRob2QgdGhhdCBpbnZhbGlkYXRlcyBpdGVyYXRvcnMuCi0vLwotLy8gQXMgb2YgMjAwNi0wNCwgdGhlcmUgaXMgbm8gc3RhbmRhcmQtYmxlc3NlZCB3YXkgb2YgZ2V0dGluZyBhCi0vLyBtdXRhYmxlIHJlZmVyZW5jZSB0byBhIHN0cmluZydzIGludGVybmFsIGJ1ZmZlci4gSG93ZXZlciwgaXNzdWUgNTMwCi0vLyAoaHR0cDovL3d3dy5vcGVuLXN0ZC5vcmcvSlRDMS9TQzIyL1dHMjEvZG9jcy9sd2ctYWN0aXZlLmh0bWwjNTMwKQotLy8gcHJvcG9zZXMgdGhpcyBhcyB0aGUgbWV0aG9kLiBBY2NvcmRpbmcgdG8gTWF0dCBBdXN0ZXJuLCB0aGlzIHNob3VsZAotLy8gYWxyZWFkeSB3b3JrIG9uIGFsbCBjdXJyZW50IGltcGxlbWVudGF0aW9ucy4KLWlubGluZSBjaGFyKiBzdHJpbmdfYXNfYXJyYXkoc3RyaW5nKiBzdHIpIHsKLSAgLy8gRE8gTk9UIFVTRSBjb25zdF9jYXN0PGNoYXIqPihzdHItPmRhdGEoKSkhIFNlZSB0aGUgdW5pdHRlc3QgZm9yIHdoeS4KLSAgcmV0dXJuIHN0ci0+ZW1wdHkoKSA/IE5VTEwgOiAmKnN0ci0+YmVnaW4oKTsKLX0KLQotLy8gU1RMRGVsZXRlRWxlbWVudHMoKSBkZWxldGVzIGFsbCB0aGUgZWxlbWVudHMgaW4gYW4gU1RMIGNvbnRhaW5lciBhbmQgY2xlYXJzCi0vLyB0aGUgY29udGFpbmVyLiAgVGhpcyBmdW5jdGlvbiBpcyBzdWl0YWJsZSBmb3IgdXNlIHdpdGggYSB2ZWN0b3IsIHNldCwKLS8vIGhhc2hfc2V0LCBvciBhbnkgb3RoZXIgU1RMIGNvbnRhaW5lciB3aGljaCBkZWZpbmVzIHNlbnNpYmxlIGJlZ2luKCksIGVuZCgpLAotLy8gYW5kIGNsZWFyKCkgbWV0aG9kcy4KLS8vCi0vLyBJZiBjb250YWluZXIgaXMgTlVMTCwgdGhpcyBmdW5jdGlvbiBpcyBhIG5vLW9wLgotLy8KLS8vIEFzIGFuIGFsdGVybmF0aXZlIHRvIGNhbGxpbmcgU1RMRGVsZXRlRWxlbWVudHMoKSBkaXJlY3RseSwgY29uc2lkZXIKLS8vIEVsZW1lbnREZWxldGVyIChkZWZpbmVkIGJlbG93KSwgd2hpY2ggZW5zdXJlcyB0aGF0IHlvdXIgY29udGFpbmVyJ3MgZWxlbWVudHMKLS8vIGFyZSBkZWxldGVkIHdoZW4gdGhlIEVsZW1lbnREZWxldGVyIGdvZXMgb3V0IG9mIHNjb3BlLgotdGVtcGxhdGUgPGNsYXNzIFQ+Ci12b2lkIFNUTERlbGV0ZUVsZW1lbnRzKFQgKmNvbnRhaW5lcikgewotICBpZiAoIWNvbnRhaW5lcikgcmV0dXJuOwotICBTVExEZWxldGVDb250YWluZXJQb2ludGVycyhjb250YWluZXItPmJlZ2luKCksIGNvbnRhaW5lci0+ZW5kKCkpOwotICBjb250YWluZXItPmNsZWFyKCk7Ci19Ci0KLS8vIEdpdmVuIGFuIFNUTCBjb250YWluZXIgY29uc2lzdGluZyBvZiAoa2V5LCB2YWx1ZSkgcGFpcnMsIFNUTERlbGV0ZVZhbHVlcwotLy8gZGVsZXRlcyBhbGwgdGhlICJ2YWx1ZSIgY29tcG9uZW50cyBhbmQgY2xlYXJzIHRoZSBjb250YWluZXIuICBEb2VzIG5vdGhpbmcKLS8vIGluIHRoZSBjYXNlIGl0J3MgZ2l2ZW4gYSBOVUxMIHBvaW50ZXIuCi0KLXRlbXBsYXRlIDxjbGFzcyBUPgotdm9pZCBTVExEZWxldGVWYWx1ZXMoVCAqdikgewotICBpZiAoIXYpIHJldHVybjsKLSAgZm9yICh0eXBlbmFtZSBUOjppdGVyYXRvciBpID0gdi0+YmVnaW4oKTsgaSAhPSB2LT5lbmQoKTsgKytpKSB7Ci0gICAgZGVsZXRlIGktPnNlY29uZDsKLSAgfQotICB2LT5jbGVhcigpOwotfQotCi19ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKLX0gIC8vIG5hbWVzcGFjZSBnb29nbGUKLQotI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RMX1VUSUxfSU5MX0hfXwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmNjCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIyOWViMDEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5jYwpAQCAtMCwwICsxLDI3MyBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RyaW5nX3BvZW0uaCIKKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oPgorCisjaWZuZGVmIFNUQVJCT0FSRAorI2luY2x1ZGUgPHN0cmluZy5oPgorI2VuZGlmICAvLyBTVEFSQk9BUkQKKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDxjbGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxvc3RyZWFtPgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CitzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLCBTdHJpbmdQaWVjZSBwaWVjZSkgeworICBvLndyaXRlKHBpZWNlLmRhdGEoKSwgcGllY2Uuc2l6ZSgpKTsKKyAgcmV0dXJuIG87Cit9CisKKy8vIE91dC1vZi1saW5lIGVycm9yIHBhdGguCit2b2lkIFN0cmluZ1BpZWNlOjpMb2dGYXRhbFNpemVUb29CaWcoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGRldGFpbHMpIHsKKyAgR09PR0xFX0xPRyhGQVRBTCkgPDwgInNpemUgdG9vIGJpZzogIiA8PCBzaXplIDw8ICIgZGV0YWlsczogIiA8PCBkZXRhaWxzOworfQorCitTdHJpbmdQaWVjZTo6U3RyaW5nUGllY2UoU3RyaW5nUGllY2UgeCwgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBwb3MpCisgICAgOiBwdHJfKHgucHRyXyArIHBvcyksIGxlbmd0aF8oeC5sZW5ndGhfIC0gcG9zKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTEUoMCwgcG9zKTsKKyAgR09PR0xFX0RDSEVDS19MRShwb3MsIHgubGVuZ3RoXyk7Cit9CisKK1N0cmluZ1BpZWNlOjpTdHJpbmdQaWVjZShTdHJpbmdQaWVjZSB4LAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgcG9zLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuKQorICAgIDogcHRyXyh4LnB0cl8gKyBwb3MpLCBsZW5ndGhfKHN0ZDo6bWluKGxlbiwgeC5sZW5ndGhfIC0gcG9zKSkgeworICBHT09HTEVfRENIRUNLX0xFKDAsIHBvcyk7CisgIEdPT0dMRV9EQ0hFQ0tfTEUocG9zLCB4Lmxlbmd0aF8pOworICBHT09HTEVfRENIRUNLX0dFKGxlbiwgMCk7Cit9CisKK3ZvaWQgU3RyaW5nUGllY2U6OkNvcHlUb1N0cmluZyhzdHJpbmcqIHRhcmdldCkgY29uc3QgeworICB0YXJnZXQtPmFzc2lnbihwdHJfLCBsZW5ndGhfKTsKK30KKwordm9pZCBTdHJpbmdQaWVjZTo6QXBwZW5kVG9TdHJpbmcoc3RyaW5nKiB0YXJnZXQpIGNvbnN0IHsKKyAgdGFyZ2V0LT5hcHBlbmQocHRyXywgbGVuZ3RoXyk7Cit9CisKK2Jvb2wgU3RyaW5nUGllY2U6OkNvbnN1bWUoU3RyaW5nUGllY2UgeCkgeworICBpZiAoc3RhcnRzX3dpdGgoeCkpIHsKKyAgICBwdHJfICs9IHgubGVuZ3RoXzsKKyAgICBsZW5ndGhfIC09IHgubGVuZ3RoXzsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorICByZXR1cm4gZmFsc2U7Cit9CisKK2Jvb2wgU3RyaW5nUGllY2U6OkNvbnN1bWVGcm9tRW5kKFN0cmluZ1BpZWNlIHgpIHsKKyAgaWYgKGVuZHNfd2l0aCh4KSkgeworICAgIGxlbmd0aF8gLT0geC5sZW5ndGhfOworICAgIHJldHVybiB0cnVlOworICB9CisgIHJldHVybiBmYWxzZTsKK30KKworc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6Y29weShjaGFyKiBidWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgcmV0ID0gc3RkOjptaW4obGVuZ3RoXyAtIHBvcywgbik7CisgIG1lbWNweShidWYsIHB0cl8gKyBwb3MsIHJldCk7CisgIHJldHVybiByZXQ7Cit9CisKK2Jvb2wgU3RyaW5nUGllY2U6OmNvbnRhaW5zKFN0cmluZ1BpZWNlIHMpIGNvbnN0IHsKKyAgcmV0dXJuIGZpbmQocywgMCkgIT0gbnBvczsKK30KKworc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZChTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChsZW5ndGhfIDw9IDAgfHwgcG9zID4gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKSkgeworICAgIGlmIChsZW5ndGhfID09IDAgJiYgcG9zID09IDAgJiYgcy5sZW5ndGhfID09IDApIHJldHVybiAwOworICAgIHJldHVybiBucG9zOworICB9CisgIGNvbnN0IGNoYXIgKnJlc3VsdCA9IHN0ZDo6c2VhcmNoKHB0cl8gKyBwb3MsIHB0cl8gKyBsZW5ndGhfLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzLnB0cl8sIHMucHRyXyArIHMubGVuZ3RoXyk7CisgIHJldHVybiByZXN1bHQgPT0gcHRyXyArIGxlbmd0aF8gPyBucG9zIDogcmVzdWx0IC0gcHRyXzsKK30KKworc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZChjaGFyIGMsIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKKyAgaWYgKGxlbmd0aF8gPD0gMCB8fCBwb3MgPj0gc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKSkgeworICAgIHJldHVybiBucG9zOworICB9CisgIGNvbnN0IGNoYXIqIHJlc3VsdCA9IHN0YXRpY19jYXN0PGNvbnN0IGNoYXIqPigKKyAgICAgIG1lbWNocihwdHJfICsgcG9zLCBjLCBsZW5ndGhfIC0gcG9zKSk7CisgIHJldHVybiByZXN1bHQgIT0gTlVMTCA/IHJlc3VsdCAtIHB0cl8gOiBucG9zOworfQorCitzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpyZmluZChTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChsZW5ndGhfIDwgcy5sZW5ndGhfKSByZXR1cm4gbnBvczsKKyAgY29uc3Qgc2l6ZV90IHVsZW4gPSBsZW5ndGhfOworICBpZiAocy5sZW5ndGhfID09IDApIHJldHVybiBzdGQ6Om1pbih1bGVuLCBwb3MpOworCisgIGNvbnN0IGNoYXIqIGxhc3QgPSBwdHJfICsgc3RkOjptaW4odWxlbiAtIHMubGVuZ3RoXywgcG9zKSArIHMubGVuZ3RoXzsKKyAgY29uc3QgY2hhciogcmVzdWx0ID0gc3RkOjpmaW5kX2VuZChwdHJfLCBsYXN0LCBzLnB0cl8sIHMucHRyXyArIHMubGVuZ3RoXyk7CisgIHJldHVybiByZXN1bHQgIT0gbGFzdCA/IHJlc3VsdCAtIHB0cl8gOiBucG9zOworfQorCisvLyBTZWFyY2ggcmFuZ2UgaXMgWzAuLnBvc10gaW5jbHVzaXZlLiAgSWYgcG9zID09IG5wb3MsIHNlYXJjaCBldmVyeXRoaW5nLgorc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6cmZpbmQoY2hhciBjLCBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIC8vIE5vdGU6IG1lbXJjaHIoKSBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MuCisgIGlmIChsZW5ndGhfIDw9IDApIHJldHVybiBucG9zOworICBmb3IgKHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgaSA9CisgICAgICBzdGQ6Om1pbihwb3MsIHN0YXRpY19jYXN0PHNpemVfdHlwZT4obGVuZ3RoXyAtIDEpKTsKKyAgICAgICBpID49IDA7IC0taSkgeworICAgIGlmIChwdHJfW2ldID09IGMpIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1cm4gbnBvczsKK30KKworLy8gRm9yIGVhY2ggY2hhcmFjdGVyIGluIGNoYXJhY3RlcnNfd2FudGVkLCBzZXRzIHRoZSBpbmRleCBjb3JyZXNwb25kaW5nCisvLyB0byB0aGUgQVNDSUkgY29kZSBvZiB0aGF0IGNoYXJhY3RlciB0byAxIGluIHRhYmxlLiAgVGhpcyBpcyB1c2VkIGJ5CisvLyB0aGUgZmluZF8uKl9vZiBtZXRob2RzIGJlbG93IHRvIHRlbGwgd2hldGhlciBvciBub3QgYSBjaGFyYWN0ZXIgaXMgaW4KKy8vIHRoZSBsb29rdXAgdGFibGUgaW4gY29uc3RhbnQgdGltZS4KKy8vIFRoZSBhcmd1bWVudCBgdGFibGUnIG11c3QgYmUgYW4gYXJyYXkgdGhhdCBpcyBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwKKy8vIHRoZSBwb3NzaWJsZSB2YWx1ZXMgb2YgYW4gdW5zaWduZWQgY2hhci4gIFRodXMgaXQgc2hvdWxkIGJlIGJlIGRlY2xhcmVkCisvLyBhcyBmb2xsb3dzOgorLy8gICBib29sIHRhYmxlW1VDSEFSX01BWCArIDFdCitzdGF0aWMgaW5saW5lIHZvaWQgQnVpbGRMb29rdXBUYWJsZShTdHJpbmdQaWVjZSBjaGFyYWN0ZXJzX3dhbnRlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wqIHRhYmxlKSB7CisgIGNvbnN0IHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuZ3RoID0gY2hhcmFjdGVyc193YW50ZWQubGVuZ3RoKCk7CisgIGNvbnN0IGNoYXIqIGNvbnN0IGRhdGEgPSBjaGFyYWN0ZXJzX3dhbnRlZC5kYXRhKCk7CisgIGZvciAoc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBpID0gMDsgaSA8IGxlbmd0aDsgKytpKSB7CisgICAgdGFibGVbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oZGF0YVtpXSldID0gdHJ1ZTsKKyAgfQorfQorCitzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2ZpcnN0X29mKFN0cmluZ1BpZWNlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MpIGNvbnN0IHsKKyAgaWYgKGxlbmd0aF8gPD0gMCB8fCBzLmxlbmd0aF8gPD0gMCkgeworICAgIHJldHVybiBucG9zOworICB9CisgIC8vIEF2b2lkIHRoZSBjb3N0IG9mIEJ1aWxkTG9va3VwVGFibGUoKSBmb3IgYSBzaW5nbGUtY2hhcmFjdGVyIHNlYXJjaC4KKyAgaWYgKHMubGVuZ3RoXyA9PSAxKSByZXR1cm4gZmluZF9maXJzdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yIChzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPSBwb3M7IGkgPCBsZW5ndGhfOyArK2kpIHsKKyAgICBpZiAobG9va3VwW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHB0cl9baV0pXSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiBucG9zOworfQorCitzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2ZpcnN0X25vdF9vZihTdHJpbmdQaWVjZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKKyAgaWYgKHMubGVuZ3RoXyA8PSAwKSByZXR1cm4gMDsKKyAgLy8gQXZvaWQgdGhlIGNvc3Qgb2YgQnVpbGRMb29rdXBUYWJsZSgpIGZvciBhIHNpbmdsZS1jaGFyYWN0ZXIgc2VhcmNoLgorICBpZiAocy5sZW5ndGhfID09IDEpIHJldHVybiBmaW5kX2ZpcnN0X25vdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yIChzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPSBwb3M7IGkgPCBsZW5ndGhfOyArK2kpIHsKKyAgICBpZiAoIWxvb2t1cFtzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihwdHJfW2ldKV0pIHsKKyAgICAgIHJldHVybiBpOworICAgIH0KKyAgfQorICByZXR1cm4gbnBvczsKK30KKworc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBTdHJpbmdQaWVjZTo6ZmluZF9maXJzdF9ub3Rfb2YoY2hhciBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKKworICBmb3IgKDsgcG9zIDwgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfKTsgKytwb3MpIHsKKyAgICBpZiAocHRyX1twb3NdICE9IGMpIHsKKyAgICAgIHJldHVybiBwb3M7CisgICAgfQorICB9CisgIHJldHVybiBucG9zOworfQorCitzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2xhc3Rfb2YoU3RyaW5nUGllY2UgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zKSBjb25zdCB7CisgIGlmIChsZW5ndGhfIDw9IDAgfHwgcy5sZW5ndGhfIDw9IDApIHJldHVybiBucG9zOworICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCisgIGlmIChzLmxlbmd0aF8gPT0gMSkgcmV0dXJuIGZpbmRfbGFzdF9vZihzLnB0cl9bMF0sIHBvcyk7CisKKyAgYm9vbCBsb29rdXBbVUNIQVJfTUFYICsgMV0gPSB7IGZhbHNlIH07CisgIEJ1aWxkTG9va3VwVGFibGUocywgbG9va3VwKTsKKyAgZm9yIChzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPQorICAgICAgIHN0ZDo6bWluKHBvcywgc3RhdGljX2Nhc3Q8c2l6ZV90eXBlPihsZW5ndGhfIC0gMSkpOyBpID49IDA7IC0taSkgeworICAgIGlmIChsb29rdXBbc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4ocHRyX1tpXSldKSB7CisgICAgICByZXR1cm4gaTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG5wb3M7Cit9CisKK3N0cmluZ3BpZWNlX3NzaXplX3R5cGUgU3RyaW5nUGllY2U6OmZpbmRfbGFzdF9ub3Rfb2YoU3RyaW5nUGllY2UgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKKworICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGkgPSBzdGQ6Om1pbihwb3MsIHN0YXRpY19jYXN0PHNpemVfdHlwZT4obGVuZ3RoXyAtIDEpKTsKKyAgaWYgKHMubGVuZ3RoXyA8PSAwKSByZXR1cm4gaTsKKworICAvLyBBdm9pZCB0aGUgY29zdCBvZiBCdWlsZExvb2t1cFRhYmxlKCkgZm9yIGEgc2luZ2xlLWNoYXJhY3RlciBzZWFyY2guCisgIGlmIChzLmxlbmd0aF8gPT0gMSkgcmV0dXJuIGZpbmRfbGFzdF9ub3Rfb2Yocy5wdHJfWzBdLCBwb3MpOworCisgIGJvb2wgbG9va3VwW1VDSEFSX01BWCArIDFdID0geyBmYWxzZSB9OworICBCdWlsZExvb2t1cFRhYmxlKHMsIGxvb2t1cCk7CisgIGZvciAoOyBpID49IDA7IC0taSkgeworICAgIGlmICghbG9va3VwW3N0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHB0cl9baV0pXSkgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiBucG9zOworfQorCitzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIFN0cmluZ1BpZWNlOjpmaW5kX2xhc3Rfbm90X29mKGNoYXIgYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcykgY29uc3QgeworICBpZiAobGVuZ3RoXyA8PSAwKSByZXR1cm4gbnBvczsKKworICBmb3IgKHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgaSA9CisgICAgICAgc3RkOjptaW4ocG9zLCBzdGF0aWNfY2FzdDxzaXplX3R5cGU+KGxlbmd0aF8gLSAxKSk7IGkgPj0gMDsgLS1pKSB7CisgICAgaWYgKHB0cl9baV0gIT0gYykgeworICAgICAgcmV0dXJuIGk7CisgICAgfQorICB9CisgIHJldHVybiBucG9zOworfQorCitTdHJpbmdQaWVjZSBTdHJpbmdQaWVjZTo6c3Vic3RyKHNpemVfdHlwZSBwb3MsIHNpemVfdHlwZSBuKSBjb25zdCB7CisgIGlmIChwb3MgPiBsZW5ndGhfKSBwb3MgPSBsZW5ndGhfOworICBpZiAobiA+IGxlbmd0aF8gLSBwb3MpIG4gPSBsZW5ndGhfIC0gcG9zOworICByZXR1cm4gU3RyaW5nUGllY2UocHRyXyArIHBvcywgbik7Cit9CisKK2NvbnN0IFN0cmluZ1BpZWNlOjpzaXplX3R5cGUgU3RyaW5nUGllY2U6Om5wb3MgPSBzaXplX3R5cGUoLTEpOworCit9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKK30gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc3NTM4MzEKLS0tIC9kZXYvbnVsbAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oCkBAIC0wLDAgKzEsNTI3IEBACisvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKKy8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgorLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KKy8vCisvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKy8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKKy8vIG1ldDoKKy8vCisvLyAgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodAorLy8gbm90aWNlLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVyLgorLy8gICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZQorLy8gY29weXJpZ2h0IG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcgorLy8gaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kL29yIG90aGVyIG1hdGVyaWFscyBwcm92aWRlZCB3aXRoIHRoZQorLy8gZGlzdHJpYnV0aW9uLgorLy8gICAgICogTmVpdGhlciB0aGUgbmFtZSBvZiBHb29nbGUgSW5jLiBub3IgdGhlIG5hbWVzIG9mIGl0cworLy8gY29udHJpYnV0b3JzIG1heSBiZSB1c2VkIHRvIGVuZG9yc2Ugb3IgcHJvbW90ZSBwcm9kdWN0cyBkZXJpdmVkIGZyb20KKy8vIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYyBwcmlvciB3cml0dGVuIHBlcm1pc3Npb24uCisvLworLy8gVEhJUyBTT0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUlMgQU5EIENPTlRSSUJVVE9SUworLy8gIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFRIRSBJTVBMSUVEIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZIEFORCBGSVRORVNTIEZPUgorLy8gQSBQQVJUSUNVTEFSIFBVUlBPU0UgQVJFIERJU0NMQUlNRUQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQKKy8vIE9XTkVSIE9SIENPTlRSSUJVVE9SUyBCRSBMSUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLAorLy8gU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVAorLy8gTElNSVRFRCBUTywgUFJPQ1VSRU1FTlQgT0YgU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNFUzsgTE9TUyBPRiBVU0UsCisvLyBEQVRBLCBPUiBQUk9GSVRTOyBPUiBCVVNJTkVTUyBJTlRFUlJVUFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkKKy8vIFRIRU9SWSBPRiBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQKKy8vIChJTkNMVURJTkcgTkVHTElHRU5DRSBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0YgVEhFIFVTRQorLy8gT0YgVEhJUyBTT0ZUV0FSRSwgRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NTSUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKworLy8gQSBTdHJpbmdQaWVjZSBwb2ludHMgdG8gcGFydCBvciBhbGwgb2YgYSBzdHJpbmcsIENvcmQsIGRvdWJsZS1xdW90ZWQgc3RyaW5nCisvLyBsaXRlcmFsLCBvciBvdGhlciBzdHJpbmctbGlrZSBvYmplY3QuICBBIFN0cmluZ1BpZWNlIGRvZXMgKm5vdCogb3duIHRoZQorLy8gc3RyaW5nIHRvIHdoaWNoIGl0IHBvaW50cy4gIEEgU3RyaW5nUGllY2UgaXMgbm90IG51bGwtdGVybWluYXRlZC4KKy8vCisvLyBZb3UgY2FuIHVzZSBTdHJpbmdQaWVjZSBhcyBhIGZ1bmN0aW9uIG9yIG1ldGhvZCBwYXJhbWV0ZXIuICBBIFN0cmluZ1BpZWNlCisvLyBwYXJhbWV0ZXIgY2FuIHJlY2VpdmUgYSBkb3VibGUtcXVvdGVkIHN0cmluZyBsaXRlcmFsIGFyZ3VtZW50LCBhICJjb25zdAorLy8gY2hhcioiIGFyZ3VtZW50LCBhIHN0cmluZyBhcmd1bWVudCwgb3IgYSBTdHJpbmdQaWVjZSBhcmd1bWVudCB3aXRoIG5vIGRhdGEKKy8vIGNvcHlpbmcuICBTeXN0ZW1hdGljIHVzZSBvZiBTdHJpbmdQaWVjZSBmb3IgYXJndW1lbnRzIHJlZHVjZXMgZGF0YQorLy8gY29waWVzIGFuZCBzdHJsZW4oKSBjYWxscy4KKy8vCisvLyBQcmVmZXIgcGFzc2luZyBTdHJpbmdQaWVjZXMgYnkgdmFsdWU6CisvLyAgIHZvaWQgTXlGdW5jdGlvbihTdHJpbmdQaWVjZSBhcmcpOworLy8gSWYgY2lyY3Vtc3RhbmNlcyByZXF1aXJlLCB5b3UgbWF5IGFsc28gcGFzcyBieSBjb25zdCByZWZlcmVuY2U6CisvLyAgIHZvaWQgTXlGdW5jdGlvbihjb25zdCBTdHJpbmdQaWVjZSYgYXJnKTsgIC8vIG5vdCBwcmVmZXJyZWQKKy8vIEJvdGggb2YgdGhlc2UgaGF2ZSB0aGUgc2FtZSBsaWZldGltZSBzZW1hbnRpY3MuICBQYXNzaW5nIGJ5IHZhbHVlCisvLyBnZW5lcmF0ZXMgc2xpZ2h0bHkgc21hbGxlciBjb2RlLiAgRm9yIG1vcmUgZGlzY3Vzc2lvbiwgc2VlIHRoZSB0aHJlYWQKKy8vIGdvL3N0cmluZ3BpZWNlYnl2YWx1ZSBvbiBjLXVzZXJzLgorLy8KKy8vIFN0cmluZ1BpZWNlIGlzIGFsc28gc3VpdGFibGUgZm9yIGxvY2FsIHZhcmlhYmxlcyBpZiB5b3Uga25vdyB0aGF0CisvLyB0aGUgbGlmZXRpbWUgb2YgdGhlIHVuZGVybHlpbmcgb2JqZWN0IGlzIGxvbmdlciB0aGFuIHRoZSBsaWZldGltZQorLy8gb2YgeW91ciBTdHJpbmdQaWVjZSB2YXJpYWJsZS4KKy8vCisvLyBCZXdhcmUgb2YgYmluZGluZyBhIFN0cmluZ1BpZWNlIHRvIGEgdGVtcG9yYXJ5OgorLy8gICBTdHJpbmdQaWVjZSBzcCA9IG9iai5NZXRob2RSZXR1cm5pbmdTdHJpbmcoKTsgIC8vIEJBRDogbGlmZXRpbWUgcHJvYmxlbQorLy8KKy8vIFRoaXMgY29kZSBpcyBva2F5OgorLy8gICBzdHJpbmcgc3RyID0gb2JqLk1ldGhvZFJldHVybmluZ1N0cmluZygpOyAgLy8gc3RyIG93bnMgaXRzIGNvbnRlbnRzCisvLyAgIFN0cmluZ1BpZWNlIHNwKHN0cik7ICAvLyBHT09ELCBiZWNhdXNlIHN0ciBvdXRsaXZlcyBzcAorLy8KKy8vIFN0cmluZ1BpZWNlIGlzIHNvbWV0aW1lcyBhIHBvb3IgY2hvaWNlIGZvciBhIHJldHVybiB2YWx1ZSBhbmQgdXN1YWxseSBhIHBvb3IKKy8vIGNob2ljZSBmb3IgYSBkYXRhIG1lbWJlci4gIElmIHlvdSBkbyB1c2UgYSBTdHJpbmdQaWVjZSB0aGlzIHdheSwgaXQgaXMgeW91cgorLy8gcmVzcG9uc2liaWxpdHkgdG8gZW5zdXJlIHRoYXQgdGhlIG9iamVjdCBwb2ludGVkIHRvIGJ5IHRoZSBTdHJpbmdQaWVjZQorLy8gb3V0bGl2ZXMgdGhlIFN0cmluZ1BpZWNlLgorLy8KKy8vIEEgU3RyaW5nUGllY2UgbWF5IHJlcHJlc2VudCBqdXN0IHBhcnQgb2YgYSBzdHJpbmc7IHRodXMgdGhlIG5hbWUgIlBpZWNlIi4KKy8vIEZvciBleGFtcGxlLCB3aGVuIHNwbGl0dGluZyBhIHN0cmluZywgdmVjdG9yPFN0cmluZ1BpZWNlPiBpcyBhIG5hdHVyYWwgZGF0YQorLy8gdHlwZSBmb3IgdGhlIG91dHB1dC4gIEZvciBhbm90aGVyIGV4YW1wbGUsIGEgQ29yZCBpcyBhIG5vbi1jb250aWd1b3VzLAorLy8gcG90ZW50aWFsbHkgdmVyeSBsb25nIHN0cmluZy1saWtlIG9iamVjdC4gIFRoZSBDb3JkIGNsYXNzIGhhcyBhbiBpbnRlcmZhY2UKKy8vIHRoYXQgaXRlcmF0aXZlbHkgcHJvdmlkZXMgU3RyaW5nUGllY2Ugb2JqZWN0cyB0aGF0IHBvaW50IHRvIHRoZQorLy8gc3VjY2Vzc2l2ZSBwaWVjZXMgb2YgYSBDb3JkIG9iamVjdC4KKy8vCisvLyBBIFN0cmluZ1BpZWNlIGlzIG5vdCBudWxsLXRlcm1pbmF0ZWQuICBJZiB5b3Ugd3JpdGUgY29kZSB0aGF0IHNjYW5zIGEKKy8vIFN0cmluZ1BpZWNlLCB5b3UgbXVzdCBjaGVjayBpdHMgbGVuZ3RoIGJlZm9yZSByZWFkaW5nIGFueSBjaGFyYWN0ZXJzLgorLy8gQ29tbW9uIGlkaW9tcyB0aGF0IHdvcmsgb24gbnVsbC10ZXJtaW5hdGVkIHN0cmluZ3MgZG8gbm90IHdvcmsgb24KKy8vIFN0cmluZ1BpZWNlIG9iamVjdHMuCisvLworLy8gVGhlcmUgYXJlIHNldmVyYWwgd2F5cyB0byBjcmVhdGUgYSBudWxsIFN0cmluZ1BpZWNlOgorLy8gICBTdHJpbmdQaWVjZSgpCisvLyAgIFN0cmluZ1BpZWNlKE5VTEwpCisvLyAgIFN0cmluZ1BpZWNlKE5VTEwsIDApCisvLyBGb3IgYWxsIG9mIHRoZSBhYm92ZSwgc3AuZGF0YSgpID09IE5VTEwsIHNwLmxlbmd0aCgpID09IDAsCisvLyBhbmQgc3AuZW1wdHkoKSA9PSB0cnVlLiAgQWxzbywgaWYgeW91IGNyZWF0ZSBhIFN0cmluZ1BpZWNlIHdpdGgKKy8vIGEgbm9uLU5VTEwgcG9pbnRlciB0aGVuIHNwLmRhdGEoKSAhPSBOVUxMLiAgT25jZSBjcmVhdGVkLAorLy8gc3AuZGF0YSgpIHdpbGwgc3RheSBlaXRoZXIgTlVMTCBvciBub3QtTlVMTCwgZXhjZXB0IGlmIHlvdSBjYWxsCisvLyBzcC5jbGVhcigpIG9yIHNwLnNldCgpLgorLy8KKy8vIFRodXMsIHlvdSBjYW4gdXNlIFN0cmluZ1BpZWNlKE5VTEwpIHRvIHNpZ25hbCBhbiBvdXQtb2YtYmFuZCB2YWx1ZQorLy8gdGhhdCBpcyBkaWZmZXJlbnQgZnJvbSBvdGhlciBTdHJpbmdQaWVjZSB2YWx1ZXMuICBUaGlzIGlzIHNpbWlsYXIKKy8vIHRvIHRoZSB3YXkgdGhhdCBjb25zdCBjaGFyKiBwMSA9IE5VTEw7IGlzIGRpZmZlcmVudCBmcm9tCisvLyBjb25zdCBjaGFyKiBwMiA9ICIiOy4KKy8vCisvLyBUaGVyZSBhcmUgbWFueSB3YXlzIHRvIGNyZWF0ZSBhbiBlbXB0eSBTdHJpbmdQaWVjZToKKy8vICAgU3RyaW5nUGllY2UoKQorLy8gICBTdHJpbmdQaWVjZShOVUxMKQorLy8gICBTdHJpbmdQaWVjZShOVUxMLCAwKQorLy8gICBTdHJpbmdQaWVjZSgiIikKKy8vICAgU3RyaW5nUGllY2UoIiIsIDApCisvLyAgIFN0cmluZ1BpZWNlKCJhYmNkZWYiLCAwKQorLy8gICBTdHJpbmdQaWVjZSgiYWJjZGVmIis2LCAwKQorLy8gRm9yIGFsbCBvZiB0aGUgYWJvdmUsIHNwLmxlbmd0aCgpIHdpbGwgYmUgMCBhbmQgc3AuZW1wdHkoKSB3aWxsIGJlIHRydWUuCisvLyBGb3Igc29tZSBlbXB0eSBTdHJpbmdQaWVjZSB2YWx1ZXMsIHNwLmRhdGEoKSB3aWxsIGJlIE5VTEwuCisvLyBGb3Igc29tZSBlbXB0eSBTdHJpbmdQaWVjZSB2YWx1ZXMsIHNwLmRhdGEoKSB3aWxsIG5vdCBiZSBOVUxMLgorLy8KKy8vIEJlIGNhcmVmdWwgbm90IHRvIGNvbmZ1c2U6IG51bGwgU3RyaW5nUGllY2UgYW5kIGVtcHR5IFN0cmluZ1BpZWNlLgorLy8gVGhlIHNldCBvZiBlbXB0eSBTdHJpbmdQaWVjZXMgcHJvcGVybHkgaW5jbHVkZXMgdGhlIHNldCBvZiBudWxsIFN0cmluZ1BpZWNlcy4KKy8vIFRoYXQgaXMsIGV2ZXJ5IG51bGwgU3RyaW5nUGllY2UgaXMgYW4gZW1wdHkgU3RyaW5nUGllY2UsCisvLyBidXQgc29tZSBub24tbnVsbCBTdHJpbmdQaWVjZXMgYXJlIGVtcHR5IFN0cmluZ3BpZWNlcyB0b28uCisvLworLy8gQWxsIGVtcHR5IFN0cmluZ1BpZWNlIHZhbHVlcyBjb21wYXJlIGVxdWFsIHRvIGVhY2ggb3RoZXIuCisvLyBFdmVuIGEgbnVsbCBTdHJpbmdQaWVjZXMgY29tcGFyZXMgZXF1YWwgdG8gYSBub24tbnVsbCBlbXB0eSBTdHJpbmdQaWVjZToKKy8vICBTdHJpbmdQaWVjZSgpID09IFN0cmluZ1BpZWNlKCIiLCAwKQorLy8gIFN0cmluZ1BpZWNlKE5VTEwpID09IFN0cmluZ1BpZWNlKCJhYmMiLCAwKQorLy8gIFN0cmluZ1BpZWNlKE5VTEwsIDApID09IFN0cmluZ1BpZWNlKCJhYmNkZWYiKzYsIDApCisvLworLy8gTG9vayBjYXJlZnVsbHkgYXQgdGhpcyBleGFtcGxlOgorLy8gICBTdHJpbmdQaWVjZSgiIikgPT0gTlVMTAorLy8gVHJ1ZSBvciBmYWxzZT8gIFRSVUUsIGJlY2F1c2UgU3RyaW5nUGllY2U6Om9wZXJhdG9yPT0gY29udmVydHMKKy8vIHRoZSByaWdodC1oYW5kIHNpZGUgZnJvbSBOVUxMIHRvIFN0cmluZ1BpZWNlKE5VTEwpLAorLy8gYW5kIHRoZW4gY29tcGFyZXMgdHdvIHplcm8tbGVuZ3RoIHNwYW5zIG9mIGNoYXJhY3RlcnMuCisvLyBIb3dldmVyLCB3ZSBhcmUgd29ya2luZyB0byBtYWtlIHRoaXMgZXhhbXBsZSBwcm9kdWNlIGEgY29tcGlsZSBlcnJvci4KKy8vCisvLyBTdXBwb3NlIHlvdSB3YW50IHRvIHdyaXRlOgorLy8gICBib29sIFRlc3RXaGF0PyhTdHJpbmdQaWVjZSBzcCkgeyByZXR1cm4gc3AgPT0gTlVMTDsgfSAgLy8gQkFECisvLyBEbyBub3QgZG8gdGhhdC4gIFdyaXRlIG9uZSBvZiB0aGVzZSBpbnN0ZWFkOgorLy8gICBib29sIFRlc3ROdWxsKFN0cmluZ1BpZWNlIHNwKSB7IHJldHVybiBzcC5kYXRhKCkgPT0gTlVMTDsgfQorLy8gICBib29sIFRlc3RFbXB0eShTdHJpbmdQaWVjZSBzcCkgeyByZXR1cm4gc3AuZW1wdHkoKTsgfQorLy8gVGhlIGludGVudCBvZiBUZXN0V2hhdD8gaXMgdW5jbGVhci4gIERpZCB5b3UgbWVhbiBUZXN0TnVsbCBvciBUZXN0RW1wdHk/CisvLyBSaWdodCBub3csIFRlc3RXaGF0PyBiZWhhdmVzIGxpa2VzIFRlc3RFbXB0eS4KKy8vIFdlIGFyZSB3b3JraW5nIHRvIG1ha2UgVGVzdFdoYXQ/IHByb2R1Y2UgYSBjb21waWxlIGVycm9yLgorLy8gVGVzdE51bGwgaXMgZ29vZCB0byB0ZXN0IGZvciBhbiBvdXQtb2YtYmFuZCBzaWduYWwuCisvLyBUZXN0RW1wdHkgaXMgZ29vZCB0byB0ZXN0IGZvciBhbiBlbXB0eSBTdHJpbmdQaWVjZS4KKy8vCisvLyBDYXZlYXRzIChhZ2Fpbik6CisvLyAoMSkgVGhlIGxpZmV0aW1lIG9mIHRoZSBwb2ludGVkLXRvIHN0cmluZyAob3IgcGllY2Ugb2YgYSBzdHJpbmcpCisvLyAgICAgbXVzdCBiZSBsb25nZXIgdGhhbiB0aGUgbGlmZXRpbWUgb2YgdGhlIFN0cmluZ1BpZWNlLgorLy8gKDIpIFRoZXJlIG1heSBvciBtYXkgbm90IGJlIGEgJ1wwJyBjaGFyYWN0ZXIgYWZ0ZXIgdGhlIGVuZCBvZgorLy8gICAgIFN0cmluZ1BpZWNlIGRhdGEuCisvLyAoMykgQSBudWxsIFN0cmluZ1BpZWNlIGlzIGVtcHR5LgorLy8gICAgIEFuIGVtcHR5IFN0cmluZ1BpZWNlIG1heSBvciBtYXkgbm90IGJlIGEgbnVsbCBTdHJpbmdQaWVjZS4KKworI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RSSU5HUElFQ0VfSF8KKyNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1NUVUJTX1NUUklOR1BJRUNFX0hfCisKKyNpbmNsdWRlIDxhc3NlcnQuaD4KKyNpbmNsdWRlIDxpb3Nmd2Q+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgPHN0cmluZz4KKworI2lmbmRlZiBTVEFSQk9BUkQKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNlbHNlCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2hhc2guaD4KKworbmFtZXNwYWNlIGdvb2dsZSB7CituYW1lc3BhY2UgcHJvdG9idWYgeworLy8gU3RyaW5nUGllY2UgaGFzICp0d28qIHNpemUgdHlwZXMuCisvLyBTdHJpbmdQaWVjZTo6c2l6ZV90eXBlCisvLyAgIGlzIHVuc2lnbmVkCisvLyAgIGlzIDMyIGJpdHMgaW4gTFAzMiwgNjQgYml0cyBpbiBMUDY0LCA2NCBiaXRzIGluIExMUDY0CisvLyAgIG5vIGZ1dHVyZSBjaGFuZ2VzIGludGVuZGVkCisvLyBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlCisvLyAgIGlzIHNpZ25lZAorLy8gICBpcyAzMiBiaXRzIGluIExQMzIsIDY0IGJpdHMgaW4gTFA2NCwgNjQgYml0cyBpbiBMTFA2NAorLy8gICBmdXR1cmUgY2hhbmdlcyBpbnRlbmRlZDogaHR0cDovL2dvLzY0Qml0U3RyaW5nUGllY2UKKy8vCit0eXBlZGVmIHN0cmluZzo6ZGlmZmVyZW5jZV90eXBlIHN0cmluZ3BpZWNlX3NzaXplX3R5cGU7CisKKy8vIFNUUklOR1BJRUNFX0NIRUNLX1NJWkUgcHJvdGVjdHMgdXMgZnJvbSAzMi1iaXQgb3ZlcmZsb3dzLgorLy8gVE9ETyhtZWMpOiBkZWxldGUgdGhpcyBhZnRlciBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGdvZXMgNjQgYml0LgorI2lmICFkZWZpbmVkKE5ERUJVRykKKyNkZWZpbmUgU1RSSU5HUElFQ0VfQ0hFQ0tfU0laRSAxCisjZWxpZiBkZWZpbmVkKF9GT1JUSUZZX1NPVVJDRSkgJiYgX0ZPUlRJRllfU09VUkNFID4gMAorI2RlZmluZSBTVFJJTkdQSUVDRV9DSEVDS19TSVpFIDEKKyNlbHNlCisjZGVmaW5lIFNUUklOR1BJRUNFX0NIRUNLX1NJWkUgMAorI2VuZGlmCisKK2NsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBTdHJpbmdQaWVjZSB7CisgcHJpdmF0ZToKKyAgY29uc3QgY2hhciogcHRyXzsKKyAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBsZW5ndGhfOworCisgIC8vIFByZXZlbnQgb3ZlcmZsb3cgaW4gZGVidWcgbW9kZSBvciBmb3J0aWZpZWQgbW9kZS4KKyAgLy8gc2l6ZW9mKHN0cmluZ3BpZWNlX3NzaXplX3R5cGUpIG1heSBiZSBzbWFsbGVyIHRoYW4gc2l6ZW9mKHNpemVfdCkuCisgIHN0YXRpYyBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIENoZWNrZWRTc2l6ZVRGcm9tU2l6ZVQoc2l6ZV90IHNpemUpIHsKKyNpZiBTVFJJTkdQSUVDRV9DSEVDS19TSVpFID4gMAorI2lmZGVmIG1heAorI3VuZGVmIG1heAorI2VuZGlmCisgICAgaWYgKHNpemUgPiBzdGF0aWNfY2FzdDxzaXplX3Q+KAorICAgICAgICBzdGQ6Om51bWVyaWNfbGltaXRzPHN0cmluZ3BpZWNlX3NzaXplX3R5cGU+OjptYXgoKSkpIHsKKyAgICAgIC8vIFNvbWUgcGVvcGxlIGdyZXAgZm9yIHRoaXMgbWVzc2FnZSBpbiBsb2dzCisgICAgICAvLyBzbyB0YWtlIGNhcmUgaWYgeW91IGV2ZXIgY2hhbmdlIGl0LgorICAgICAgTG9nRmF0YWxTaXplVG9vQmlnKHNpemUsICJzaXplX3QgdG8gaW50IGNvbnZlcnNpb24iKTsKKyAgICB9CisjZW5kaWYKKyAgICByZXR1cm4gc3RhdGljX2Nhc3Q8c3RyaW5ncGllY2Vfc3NpemVfdHlwZT4oc2l6ZSk7CisgIH0KKworICAvLyBPdXQtb2YtbGluZSBlcnJvciBwYXRoLgorICBzdGF0aWMgdm9pZCBMb2dGYXRhbFNpemVUb29CaWcoc2l6ZV90IHNpemUsIGNvbnN0IGNoYXIqIGRldGFpbHMpOworCisgcHVibGljOgorICAvLyBXZSBwcm92aWRlIG5vbi1leHBsaWNpdCBzaW5nbGV0b24gY29uc3RydWN0b3JzIHNvIHVzZXJzIGNhbiBwYXNzCisgIC8vIGluIGEgImNvbnN0IGNoYXIqIiBvciBhICJzdHJpbmciIHdoZXJldmVyIGEgIlN0cmluZ1BpZWNlIiBpcworICAvLyBleHBlY3RlZC4KKyAgLy8KKyAgLy8gU3R5bGUgZ3VpZGUgZXhjZXB0aW9uIGdyYW50ZWQ6CisgIC8vIGh0dHA6Ly9nb3RvL3N0eWxlLWd1aWRlLWV4Y2VwdGlvbi0yMDk3ODI4OAorICBTdHJpbmdQaWVjZSgpIDogcHRyXyhOVUxMKSwgbGVuZ3RoXygwKSB7fQorCisgIFN0cmluZ1BpZWNlKGNvbnN0IGNoYXIqIHN0cikgIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQorICAgICAgOiBwdHJfKHN0ciksIGxlbmd0aF8oMCkgeworICAgIGlmIChzdHIgIT0gTlVMTCkgeworI2lmbmRlZiBTVEFSQk9BUkQKKyAgICAgIGxlbmd0aF8gPSBDaGVja2VkU3NpemVURnJvbVNpemVUKHN0cmxlbihzdHIpKTsKKyNlbHNlCisgICAgICBsZW5ndGhfID0gQ2hlY2tlZFNzaXplVEZyb21TaXplVChTYlN0cmluZ0dldExlbmd0aChzdHIpKTsKKyNlbmRpZiAgLy8gZGVmaW5lZChTVEFSQk9BUkQpCisgICAgfQorICB9CisKKyAgdGVtcGxhdGUgPGNsYXNzIEFsbG9jYXRvcj4KKyAgU3RyaW5nUGllY2UoICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKKyAgICAgIGNvbnN0IHN0ZDo6YmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIEFsbG9jYXRvcj4mIHN0cikKKyAgICAgIDogcHRyXyhzdHIuZGF0YSgpKSwgbGVuZ3RoXygwKSB7CisgICAgbGVuZ3RoXyA9IENoZWNrZWRTc2l6ZVRGcm9tU2l6ZVQoc3RyLnNpemUoKSk7CisgIH0KKyNpZiBkZWZpbmVkKEhBU19HTE9CQUxfU1RSSU5HKQorICB0ZW1wbGF0ZSA8Y2xhc3MgQWxsb2NhdG9yPgorICBTdHJpbmdQaWVjZSggIC8vIE5PTElOVChydW50aW1lL2V4cGxpY2l0KQorICAgICAgY29uc3QgYmFzaWNfc3RyaW5nPGNoYXIsIHN0ZDo6Y2hhcl90cmFpdHM8Y2hhcj4sIEFsbG9jYXRvcj4mIHN0cikKKyAgICAgIDogcHRyXyhzdHIuZGF0YSgpKSwgbGVuZ3RoXygwKSB7CisgICAgbGVuZ3RoXyA9IENoZWNrZWRTc2l6ZVRGcm9tU2l6ZVQoc3RyLnNpemUoKSk7CisgIH0KKyNlbmRpZgorCisgIFN0cmluZ1BpZWNlKGNvbnN0IGNoYXIqIG9mZnNldCwgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBsZW4pCisgICAgICA6IHB0cl8ob2Zmc2V0KSwgbGVuZ3RoXyhsZW4pIHsKKyAgICBhc3NlcnQobGVuID49IDApOworICB9CisKKyAgLy8gU3Vic3RyaW5nIG9mIGFub3RoZXIgU3RyaW5nUGllY2UuCisgIC8vIHBvcyBtdXN0IGJlIG5vbi1uZWdhdGl2ZSBhbmQgPD0geC5sZW5ndGgoKS4KKyAgU3RyaW5nUGllY2UoU3RyaW5nUGllY2UgeCwgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBwb3MpOworICAvLyBTdWJzdHJpbmcgb2YgYW5vdGhlciBTdHJpbmdQaWVjZS4KKyAgLy8gcG9zIG11c3QgYmUgbm9uLW5lZ2F0aXZlIGFuZCA8PSB4Lmxlbmd0aCgpLgorICAvLyBsZW4gbXVzdCBiZSBub24tbmVnYXRpdmUgYW5kIHdpbGwgYmUgcGlubmVkIHRvIGF0IG1vc3QgeC5sZW5ndGgoKSAtIHBvcy4KKyAgU3RyaW5nUGllY2UoU3RyaW5nUGllY2UgeCwKKyAgICAgICAgICAgICAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBwb3MsCisgICAgICAgICAgICAgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuKTsKKworICAvLyBkYXRhKCkgbWF5IHJldHVybiBhIHBvaW50ZXIgdG8gYSBidWZmZXIgd2l0aCBlbWJlZGRlZCBOVUxzLCBhbmQgdGhlCisgIC8vIHJldHVybmVkIGJ1ZmZlciBtYXkgb3IgbWF5IG5vdCBiZSBudWxsIHRlcm1pbmF0ZWQuICBUaGVyZWZvcmUgaXQgaXMKKyAgLy8gdHlwaWNhbGx5IGEgbWlzdGFrZSB0byBwYXNzIGRhdGEoKSB0byBhIHJvdXRpbmUgdGhhdCBleHBlY3RzIGEgTlVMCisgIC8vIHRlcm1pbmF0ZWQgc3RyaW5nLgorICBjb25zdCBjaGFyKiBkYXRhKCkgY29uc3QgeyByZXR1cm4gcHRyXzsgfQorICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIHNpemUoKSBjb25zdCB7IHJldHVybiBsZW5ndGhfOyB9CisgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuZ3RoKCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXzsgfQorICBib29sIGVtcHR5KCkgY29uc3QgeyByZXR1cm4gbGVuZ3RoXyA9PSAwOyB9CisKKyAgdm9pZCBjbGVhcigpIHsKKyAgICBwdHJfID0gTlVMTDsKKyAgICBsZW5ndGhfID0gMDsKKyAgfQorCisgIHZvaWQgc2V0KGNvbnN0IGNoYXIqIGRhdGEsIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuKSB7CisgICAgYXNzZXJ0KGxlbiA+PSAwKTsKKyAgICBwdHJfID0gZGF0YTsKKyAgICBsZW5ndGhfID0gbGVuOworICB9CisKKyAgdm9pZCBzZXQoY29uc3QgY2hhciogc3RyKSB7CisgICAgcHRyXyA9IHN0cjsKKyAgICBpZiAoc3RyICE9IE5VTEwpCisjaWZuZGVmIFNUQVJCT0FSRAorICAgICAgbGVuZ3RoXyA9IENoZWNrZWRTc2l6ZVRGcm9tU2l6ZVQoc3RybGVuKHN0cikpOworI2Vsc2UKKyAgICAgIGxlbmd0aF8gPSBDaGVja2VkU3NpemVURnJvbVNpemVUKFNiU3RyaW5nR2V0TGVuZ3RoKHN0cikpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyAgICBlbHNlCisgICAgICBsZW5ndGhfID0gMDsKKyAgfQorCisgIHZvaWQgc2V0KGNvbnN0IHZvaWQqIGRhdGEsIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbGVuKSB7CisgICAgcHRyXyA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGRhdGEpOworICAgIGxlbmd0aF8gPSBsZW47CisgIH0KKworICBjaGFyIG9wZXJhdG9yW10oc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBpKSBjb25zdCB7CisgICAgYXNzZXJ0KDAgPD0gaSk7CisgICAgYXNzZXJ0KGkgPCBsZW5ndGhfKTsKKyAgICByZXR1cm4gcHRyX1tpXTsKKyAgfQorCisgIHZvaWQgcmVtb3ZlX3ByZWZpeChzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIG4pIHsKKyAgICBhc3NlcnQobGVuZ3RoXyA+PSBuKTsKKyAgICBwdHJfICs9IG47CisgICAgbGVuZ3RoXyAtPSBuOworICB9CisKKyAgdm9pZCByZW1vdmVfc3VmZml4KHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbikgeworICAgIGFzc2VydChsZW5ndGhfID49IG4pOworICAgIGxlbmd0aF8gLT0gbjsKKyAgfQorCisgIC8vIHJldHVybnMgey0xLCAwLCAxfQorICBpbnQgY29tcGFyZShTdHJpbmdQaWVjZSB4KSBjb25zdCB7CisgICAgY29uc3Qgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBtaW5fc2l6ZSA9CisgICAgICAgIGxlbmd0aF8gPCB4Lmxlbmd0aF8gPyBsZW5ndGhfIDogeC5sZW5ndGhfOworI2lmbmRlZiBTVEFSQk9BUkQKKyAgICBpbnQgciA9IG1lbWNtcChwdHJfLCB4LnB0cl8sIG1pbl9zaXplKTsKKyNlbHNlCisgICAgaW50IHIgPSBTYk1lbW9yeUNvbXBhcmUocHRyXywgeC5wdHJfLCBtaW5fc2l6ZSk7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorICAgIGlmIChyIDwgMCkgcmV0dXJuIC0xOworICAgIGlmIChyID4gMCkgcmV0dXJuIDE7CisgICAgaWYgKGxlbmd0aF8gPCB4Lmxlbmd0aF8pIHJldHVybiAtMTsKKyAgICBpZiAobGVuZ3RoXyA+IHgubGVuZ3RoXykgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7CisgIH0KKworICBzdHJpbmcgYXNfc3RyaW5nKCkgY29uc3QgeworICAgIHJldHVybiBUb1N0cmluZygpOworICB9CisgIC8vIFdlIGFsc28gZGVmaW5lIFRvU3RyaW5nKCkgaGVyZSwgc2luY2UgbWFueSBvdGhlciBzdHJpbmctbGlrZQorICAvLyBpbnRlcmZhY2VzIG5hbWUgdGhlIHJvdXRpbmUgdGhhdCBjb252ZXJ0cyB0byBhIEMrKyBzdHJpbmcKKyAgLy8gIlRvU3RyaW5nIiwgYW5kIGl0J3MgY29uZnVzaW5nIHRvIGhhdmUgdGhlIG1ldGhvZCB0aGF0IGRvZXMgdGhhdAorICAvLyBmb3IgYSBTdHJpbmdQaWVjZSBiZSBjYWxsZWQgImFzX3N0cmluZygpIi4gIFdlIGFsc28gbGVhdmUgdGhlCisgIC8vICJhc19zdHJpbmcoKSIgbWV0aG9kIGRlZmluZWQgaGVyZSBmb3IgZXhpc3RpbmcgY29kZS4KKyAgc3RyaW5nIFRvU3RyaW5nKCkgY29uc3QgeworICAgIGlmIChwdHJfID09IE5VTEwpIHJldHVybiBzdHJpbmcoKTsKKyAgICByZXR1cm4gc3RyaW5nKGRhdGEoKSwgc2l6ZSgpKTsKKyAgfQorCisgIG9wZXJhdG9yIHN0cmluZygpIGNvbnN0IHsKKyAgICByZXR1cm4gVG9TdHJpbmcoKTsKKyAgfQorCisgIHZvaWQgQ29weVRvU3RyaW5nKHN0cmluZyogdGFyZ2V0KSBjb25zdDsKKyAgdm9pZCBBcHBlbmRUb1N0cmluZyhzdHJpbmcqIHRhcmdldCkgY29uc3Q7CisKKyAgYm9vbCBzdGFydHNfd2l0aChTdHJpbmdQaWVjZSB4KSBjb25zdCB7CisjaWZuZGVmIFNUQVJCT0FSRAorICAgIHJldHVybiAobGVuZ3RoXyA+PSB4Lmxlbmd0aF8pICYmIChtZW1jbXAocHRyXywgeC5wdHJfLCB4Lmxlbmd0aF8pID09IDApOworI2Vsc2UKKyAgICByZXR1cm4gKGxlbmd0aF8gPj0geC5sZW5ndGhfKSAmJiAoU2JNZW1vcnlDb21wYXJlKHB0cl8sIHgucHRyXywgeC5sZW5ndGhfKSA9PSAwKTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisgIH0KKworICBib29sIGVuZHNfd2l0aChTdHJpbmdQaWVjZSB4KSBjb25zdCB7CisjaWZuZGVmIFNUQVJCT0FSRAorICAgIHJldHVybiAoKGxlbmd0aF8gPj0geC5sZW5ndGhfKSAmJgorICAgICAgICAgICAgKG1lbWNtcChwdHJfICsgKGxlbmd0aF8teC5sZW5ndGhfKSwgeC5wdHJfLCB4Lmxlbmd0aF8pID09IDApKTsKKyNlbHNlCisgICAgcmV0dXJuICgobGVuZ3RoXyA+PSB4Lmxlbmd0aF8pICYmCisgICAgICAgICAgICAoU2JNZW1vcnlDb21wYXJlKHB0cl8gKyAobGVuZ3RoXy14Lmxlbmd0aF8pLCB4LnB0cl8sIHgubGVuZ3RoXykgPT0gMCkpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyAgfQorCisgIC8vIENoZWNrcyB3aGV0aGVyIFN0cmluZ1BpZWNlIHN0YXJ0cyB3aXRoIHggYW5kIGlmIHNvIGFkdmFuY2VzIHRoZSBiZWdpbm5pbmcKKyAgLy8gb2YgaXQgdG8gcGFzdCB0aGUgbWF0Y2guICBJdCdzIGJhc2ljYWxseSBhIHNob3J0Y3V0IGZvciBzdGFydHNfd2l0aAorICAvLyBmb2xsb3dlZCBieSByZW1vdmVfcHJlZml4LgorICBib29sIENvbnN1bWUoU3RyaW5nUGllY2UgeCk7CisgIC8vIExpa2UgYWJvdmUgYnV0IGZvciB0aGUgZW5kIG9mIHRoZSBzdHJpbmcuCisgIGJvb2wgQ29uc3VtZUZyb21FbmQoU3RyaW5nUGllY2UgeCk7CisKKyAgLy8gc3RhbmRhcmQgU1RMIGNvbnRhaW5lciBib2lsZXJwbGF0ZQorICB0eXBlZGVmIGNoYXIgdmFsdWVfdHlwZTsKKyAgdHlwZWRlZiBjb25zdCBjaGFyKiBwb2ludGVyOworICB0eXBlZGVmIGNvbnN0IGNoYXImIHJlZmVyZW5jZTsKKyAgdHlwZWRlZiBjb25zdCBjaGFyJiBjb25zdF9yZWZlcmVuY2U7CisgIHR5cGVkZWYgc2l6ZV90IHNpemVfdHlwZTsKKyAgdHlwZWRlZiBwdHJkaWZmX3QgZGlmZmVyZW5jZV90eXBlOworICBzdGF0aWMgY29uc3Qgc2l6ZV90eXBlIG5wb3M7CisgIHR5cGVkZWYgY29uc3QgY2hhciogY29uc3RfaXRlcmF0b3I7CisgIHR5cGVkZWYgY29uc3QgY2hhciogaXRlcmF0b3I7CisgIHR5cGVkZWYgc3RkOjpyZXZlcnNlX2l0ZXJhdG9yPGNvbnN0X2l0ZXJhdG9yPiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yOworICB0eXBlZGVmIHN0ZDo6cmV2ZXJzZV9pdGVyYXRvcjxpdGVyYXRvcj4gcmV2ZXJzZV9pdGVyYXRvcjsKKyAgaXRlcmF0b3IgYmVnaW4oKSBjb25zdCB7IHJldHVybiBwdHJfOyB9CisgIGl0ZXJhdG9yIGVuZCgpIGNvbnN0IHsgcmV0dXJuIHB0cl8gKyBsZW5ndGhfOyB9CisgIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IgcmJlZ2luKCkgY29uc3QgeworICAgIHJldHVybiBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yKHB0cl8gKyBsZW5ndGhfKTsKKyAgfQorICBjb25zdF9yZXZlcnNlX2l0ZXJhdG9yIHJlbmQoKSBjb25zdCB7CisgICAgcmV0dXJuIGNvbnN0X3JldmVyc2VfaXRlcmF0b3IocHRyXyk7CisgIH0KKyAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF87IH0KKyAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBjYXBhY2l0eSgpIGNvbnN0IHsgcmV0dXJuIGxlbmd0aF87IH0KKworICAvLyBjcHBsaW50LnB5IGVtaXRzIGEgZmFsc2UgcG9zaXRpdmUgW2J1aWxkL2luY2x1ZGVfd2hhdF95b3VfdXNlXQorICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGNvcHkoY2hhciogYnVmLCBzaXplX3R5cGUgbiwgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OyAgLy8gTk9MSU5UCisKKyAgYm9vbCBjb250YWlucyhTdHJpbmdQaWVjZSBzKSBjb25zdDsKKworICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmQoU3RyaW5nUGllY2Ugcywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmQoY2hhciBjLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgcmZpbmQoU3RyaW5nUGllY2Ugcywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIHJmaW5kKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworCisgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgZmluZF9maXJzdF9vZihTdHJpbmdQaWVjZSBzLCBzaXplX3R5cGUgcG9zID0gMCkgY29uc3Q7CisgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgZmluZF9maXJzdF9vZihjaGFyIGMsIHNpemVfdHlwZSBwb3MgPSAwKSBjb25zdCB7CisgICAgcmV0dXJuIGZpbmQoYywgcG9zKTsKKyAgfQorICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKFN0cmluZ1BpZWNlIHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmRfZmlyc3Rfbm90X29mKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IDApIGNvbnN0OworICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmRfbGFzdF9vZihTdHJpbmdQaWVjZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3R5cGUgcG9zID0gbnBvcykgY29uc3Q7CisgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgZmluZF9sYXN0X29mKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0IHsKKyAgICByZXR1cm4gcmZpbmQoYywgcG9zKTsKKyAgfQorICBzdHJpbmdwaWVjZV9zc2l6ZV90eXBlIGZpbmRfbGFzdF9ub3Rfb2YoU3RyaW5nUGllY2UgcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdHlwZSBwb3MgPSBucG9zKSBjb25zdDsKKyAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBmaW5kX2xhc3Rfbm90X29mKGNoYXIgYywgc2l6ZV90eXBlIHBvcyA9IG5wb3MpIGNvbnN0OworCisgIFN0cmluZ1BpZWNlIHN1YnN0cihzaXplX3R5cGUgcG9zLCBzaXplX3R5cGUgbiA9IG5wb3MpIGNvbnN0OworfTsKKworLy8gVGhpcyBsYXJnZSBmdW5jdGlvbiBpcyBkZWZpbmVkIGlubGluZSBzbyB0aGF0IGluIGEgZmFpcmx5IGNvbW1vbiBjYXNlIHdoZXJlCisvLyBvbmUgb2YgdGhlIGFyZ3VtZW50cyBpcyBhIGxpdGVyYWwsIHRoZSBjb21waWxlciBjYW4gZWxpZGUgYSBsb3Qgb2YgdGhlCisvLyBmb2xsb3dpbmcgY29tcGFyaXNvbnMuCitpbmxpbmUgYm9vbCBvcGVyYXRvcj09KFN0cmluZ1BpZWNlIHgsIFN0cmluZ1BpZWNlIHkpIHsKKyAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBsZW4gPSB4LnNpemUoKTsKKyAgaWYgKGxlbiAhPSB5LnNpemUoKSkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisjaWZuZGVmIFNUQVJCT0FSRAorICByZXR1cm4geC5kYXRhKCkgPT0geS5kYXRhKCkgfHwgbGVuIDw9IDAgfHwKKyAgICAgIG1lbWNtcCh4LmRhdGEoKSwgeS5kYXRhKCksIGxlbikgPT0gMDsKKyNlbHNlCisgIHJldHVybiB4LmRhdGEoKSA9PSB5LmRhdGEoKSB8fCBsZW4gPD0gMCB8fAorICAgICAgU2JNZW1vcnlDb21wYXJlKHguZGF0YSgpLCB5LmRhdGEoKSwgbGVuKSA9PSAwOworI2VuZGlmICAvLyBTVEFSQk9BUkQKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3IhPShTdHJpbmdQaWVjZSB4LCBTdHJpbmdQaWVjZSB5KSB7CisgIHJldHVybiAhKHggPT0geSk7Cit9CisKK2lubGluZSBib29sIG9wZXJhdG9yPChTdHJpbmdQaWVjZSB4LCBTdHJpbmdQaWVjZSB5KSB7CisgIGNvbnN0IHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgbWluX3NpemUgPQorICAgICAgeC5zaXplKCkgPCB5LnNpemUoKSA/IHguc2l6ZSgpIDogeS5zaXplKCk7CisjaWZuZGVmIFNUQVJCT0FSRAorICBjb25zdCBpbnQgciA9IG1lbWNtcCh4LmRhdGEoKSwgeS5kYXRhKCksIG1pbl9zaXplKTsKKyNlbHNlCisgIGNvbnN0IGludCByID0gU2JNZW1vcnlDb21wYXJlKHguZGF0YSgpLCB5LmRhdGEoKSwgbWluX3NpemUpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKKyAgcmV0dXJuIChyIDwgMCkgfHwgKHIgPT0gMCAmJiB4LnNpemUoKSA8IHkuc2l6ZSgpKTsKK30KKworaW5saW5lIGJvb2wgb3BlcmF0b3I+KFN0cmluZ1BpZWNlIHgsIFN0cmluZ1BpZWNlIHkpIHsKKyAgcmV0dXJuIHkgPCB4OworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcjw9KFN0cmluZ1BpZWNlIHgsIFN0cmluZ1BpZWNlIHkpIHsKKyAgcmV0dXJuICEoeCA+IHkpOworfQorCitpbmxpbmUgYm9vbCBvcGVyYXRvcj49KFN0cmluZ1BpZWNlIHgsIFN0cmluZ1BpZWNlIHkpIHsKKyAgcmV0dXJuICEoeCA8IHkpOworfQorCisvLyBhbGxvdyBTdHJpbmdQaWVjZSB0byBiZSBsb2dnZWQKK2V4dGVybiBzdGQ6Om9zdHJlYW0mIG9wZXJhdG9yPDwoc3RkOjpvc3RyZWFtJiBvLCBTdHJpbmdQaWVjZSBwaWVjZSk7CisKK25hbWVzcGFjZSBpbnRlcm5hbCB7CisvLyBTdHJpbmdQaWVjZSBpcyBub3QgYSBQT0QgYW5kIGNhbiBub3QgYmUgdXNlZCBpbiBhbiB1bmlvbiAocHJlIEMrKzExKS4gV2UKKy8vIG5lZWQgYSBQT0QgdmVyc2lvbiBvZiBpdC4KK3N0cnVjdCBTdHJpbmdQaWVjZVBvZCB7CisgIC8vIENyZWF0ZSBmcm9tIGEgU3RyaW5nUGllY2UuCisgIHN0YXRpYyBTdHJpbmdQaWVjZVBvZCBDcmVhdGVGcm9tU3RyaW5nUGllY2UoU3RyaW5nUGllY2Ugc3RyKSB7CisgICAgU3RyaW5nUGllY2VQb2QgcG9kOworICAgIHBvZC5kYXRhXyA9IHN0ci5kYXRhKCk7CisgICAgcG9kLnNpemVfID0gc3RyLnNpemUoKTsKKyAgICByZXR1cm4gcG9kOworICB9CisKKyAgLy8gQ2FzdCB0byBTdHJpbmdQaWVjZS4KKyAgb3BlcmF0b3IgU3RyaW5nUGllY2UoKSBjb25zdCB7IHJldHVybiBTdHJpbmdQaWVjZShkYXRhXywgc2l6ZV8pOyB9CisKKyAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IGNoYXIqIHZhbHVlKSBjb25zdCB7CisgICAgcmV0dXJuIFN0cmluZ1BpZWNlKGRhdGFfLCBzaXplXykgPT0gU3RyaW5nUGllY2UodmFsdWUpOworICB9CisKKyAgY2hhciBvcGVyYXRvcltdKHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgaSkgY29uc3QgeworICAgIGFzc2VydCgwIDw9IGkpOworICAgIGFzc2VydChpIDwgc2l6ZV8pOworICAgIHJldHVybiBkYXRhX1tpXTsKKyAgfQorCisgIGNvbnN0IGNoYXIqIGRhdGEoKSBjb25zdCB7IHJldHVybiBkYXRhXzsgfQorCisgIHN0cmluZ3BpZWNlX3NzaXplX3R5cGUgc2l6ZSgpIGNvbnN0IHsKKyAgICByZXR1cm4gc2l6ZV87CisgIH0KKworICBzdGQ6OnN0cmluZyBUb1N0cmluZygpIGNvbnN0IHsgcmV0dXJuIHN0ZDo6c3RyaW5nKGRhdGFfLCBzaXplXyk7IH0KKyBwcml2YXRlOgorICBjb25zdCBjaGFyKiBkYXRhXzsKKyAgc3RyaW5ncGllY2Vfc3NpemVfdHlwZSBzaXplXzsKK307CisKK30gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbAorfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCit9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCisKK0dPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRV9ERUNMQVJBVElPTl9TVEFSVAordGVtcGxhdGU8PiBzdHJ1Y3QgaGFzaDxTdHJpbmdQaWVjZT4geworICBzaXplX3Qgb3BlcmF0b3IoKShjb25zdCBTdHJpbmdQaWVjZSYgcykgY29uc3QgeworICAgIHNpemVfdCByZXN1bHQgPSAwOworICAgIGZvciAoY29uc3QgY2hhciAqc3RyID0gcy5kYXRhKCksICplbmQgPSBzdHIgKyBzLnNpemUoKTsgc3RyIDwgZW5kOyBzdHIrKykgeyAgCisgICAgICByZXN1bHQgPSA1ICogcmVzdWx0ICsgKnN0cjsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKKyAgfQorfTsKK0dPT0dMRV9QUk9UT0JVRl9IQVNIX05BTUVTUEFDRV9ERUNMQVJBVElPTl9FTkQKKworI2VuZGlmICAvLyBTVFJJTkdTX1NUUklOR1BJRUNFX0hfCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncGllY2VfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlX3VuaXR0ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuY2MKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTM3NGQ0YgotLS0gL2Rldi9udWxsCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5jYwpAQCAtMCwwICsxLDE3OSBAQAorLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CisvLyBDb3B5cmlnaHQgMjAxMiBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCisvLworLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCisvLyBtZXQ6CisvLworLy8gICAgICogUmVkaXN0cmlidXRpb25zIG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKy8vIG5vdGljZSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKy8vICAgICAqIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0IHJlcHJvZHVjZSB0aGUgYWJvdmUKKy8vIGNvcHlyaWdodCBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIKKy8vIGluIHRoZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUKKy8vIGRpc3RyaWJ1dGlvbi4KKy8vICAgICAqIE5laXRoZXIgdGhlIG5hbWUgb2YgR29vZ2xlIEluYy4gbm9yIHRoZSBuYW1lcyBvZiBpdHMKKy8vIGNvbnRyaWJ1dG9ycyBtYXkgYmUgdXNlZCB0byBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tCisvLyB0aGlzIHNvZnR3YXJlIHdpdGhvdXQgc3BlY2lmaWMgcHJpb3Igd3JpdHRlbiBwZXJtaXNzaW9uLgorLy8KKy8vIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKy8vICJBUyBJUyIgQU5EIEFOWSBFWFBSRVNTIE9SIElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UCisvLyBMSU1JVEVEIFRPLCBUSEUgSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1IKKy8vIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisvLyBPV05FUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKy8vIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IgQ09OU0VRVUVOVElBTCBEQU1BR0VTIChJTkNMVURJTkcsIEJVVCBOT1QKKy8vIExJTUlURUQgVE8sIFBST0NVUkVNRU5UIE9GIFNVQlNUSVRVVEUgR09PRFMgT1IgU0VSVklDRVM7IExPU1MgT0YgVVNFLAorLy8gREFUQSwgT1IgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZCisvLyBUSEVPUlkgT0YgTElBQklMSVRZLCBXSEVUSEVSIElOIENPTlRSQUNULCBTVFJJQ1QgTElBQklMSVRZLCBPUiBUT1JUCisvLyAoSU5DTFVESU5HIE5FR0xJR0VOQ0UgT1IgT1RIRVJXSVNFKSBBUklTSU5HIElOIEFOWSBXQVkgT1VUIE9GIFRIRSBVU0UKKy8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisKKy8vIGZyb20gZ29vZ2xlMy9iYXNlL3N0cmluZ3ByaW50Zi5jYworCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgorCisjaWZuZGVmIFNUQVJCT0FSRAorI2luY2x1ZGUgPHN0ZGlvLmg+IC8vIE1TVkMgcmVxdWlyZXMgdGhpcyBmb3IgX3ZzbnByaW50ZgorI2VuZGlmICAvLyBkZWZpbmVkKFNUQVJCT0FSRCkKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+IC8vIEZvciB2YV9saXN0IGFuZCByZWxhdGVkIG9wZXJhdGlvbnMKKyNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorCisjaW5jbHVkZSAic3RhcmJvYXJkL2NsaWVudF9wb3J0aW5nL3BvZW0vc3RkaW9fcG9lbS5oIgorCituYW1lc3BhY2UgZ29vZ2xlIHsKK25hbWVzcGFjZSBwcm90b2J1ZiB7CisKKyNpZmRlZiBfTVNDX1ZFUgorZW51bSB7IElTX0NPTVBJTEVSX01TVkMgPSAxIH07CisjaWZuZGVmIHZhX2NvcHkKKy8vIERlZmluZSB2YV9jb3B5IGZvciBNU1ZDLiBUaGlzIGlzIGEgaGFjaywgYXNzdW1pbmcgdmFfbGlzdCBpcyBzaW1wbHkgYQorLy8gcG9pbnRlciBpbnRvIHRoZSBzdGFjayBhbmQgaXMgc2FmZSB0byBjb3B5LgorI2RlZmluZSB2YV9jb3B5KGRlc3QsIHNyYykgKChkZXN0KSA9IChzcmMpKQorI2VuZGlmCisjZWxzZQorZW51bSB7IElTX0NPTVBJTEVSX01TVkMgPSAwIH07CisjZW5kaWYKKwordm9pZCBTdHJpbmdBcHBlbmRWKHN0cmluZyogZHN0LCBjb25zdCBjaGFyKiBmb3JtYXQsIHZhX2xpc3QgYXApIHsKKyAgLy8gRmlyc3QgdHJ5IHdpdGggYSBzbWFsbCBmaXhlZCBzaXplIGJ1ZmZlcgorICBzdGF0aWMgY29uc3QgaW50IGtTcGFjZUxlbmd0aCA9IDEwMjQ7CisgIGNoYXIgc3BhY2Vba1NwYWNlTGVuZ3RoXTsKKworICAvLyBJdCdzIHBvc3NpYmxlIGZvciBtZXRob2RzIHRoYXQgdXNlIGEgdmFfbGlzdCB0byBpbnZhbGlkYXRlCisgIC8vIHRoZSBkYXRhIGluIGl0IHVwb24gdXNlLiAgVGhlIGZpeCBpcyB0byBtYWtlIGEgY29weQorICAvLyBvZiB0aGUgc3RydWN0dXJlIGJlZm9yZSB1c2luZyBpdCBhbmQgdXNlIHRoYXQgY29weSBpbnN0ZWFkLgorICB2YV9saXN0IGJhY2t1cF9hcDsKKyAgdmFfY29weShiYWNrdXBfYXAsIGFwKTsKKyAgaW50IHJlc3VsdCA9IHZzbnByaW50ZihzcGFjZSwga1NwYWNlTGVuZ3RoLCBmb3JtYXQsIGJhY2t1cF9hcCk7CisgIHZhX2VuZChiYWNrdXBfYXApOworCisgIGlmIChyZXN1bHQgPCBrU3BhY2VMZW5ndGgpIHsKKyAgICBpZiAocmVzdWx0ID49IDApIHsKKyAgICAgIC8vIE5vcm1hbCBjYXNlIC0tIGV2ZXJ5dGhpbmcgZml0LgorICAgICAgZHN0LT5hcHBlbmQoc3BhY2UsIHJlc3VsdCk7CisgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKElTX0NPTVBJTEVSX01TVkMpIHsKKyAgICAgIC8vIEVycm9yIG9yIE1TVkMgcnVubmluZyBvdXQgb2Ygc3BhY2UuICBNU1ZDIDguMCBhbmQgaGlnaGVyCisgICAgICAvLyBjYW4gYmUgYXNrZWQgYWJvdXQgc3BhY2UgbmVlZGVkIHdpdGggdGhlIHNwZWNpYWwgaWRpb20gYmVsb3c6CisgICAgICB2YV9jb3B5KGJhY2t1cF9hcCwgYXApOworICAgICAgcmVzdWx0ID0gdnNucHJpbnRmKE5VTEwsIDAsIGZvcm1hdCwgYmFja3VwX2FwKTsKKyAgICAgIHZhX2VuZChiYWNrdXBfYXApOworICAgIH0KKworICAgIGlmIChyZXN1bHQgPCAwKSB7CisgICAgICAvLyBKdXN0IGFuIGVycm9yLgorICAgICAgcmV0dXJuOworICAgIH0KKyAgfQorCisgIC8vIEluY3JlYXNlIHRoZSBidWZmZXIgc2l6ZSB0byB0aGUgc2l6ZSByZXF1ZXN0ZWQgYnkgdnNucHJpbnRmLAorICAvLyBwbHVzIG9uZSBmb3IgdGhlIGNsb3NpbmcgXDAuCisgIGludCBsZW5ndGggPSByZXN1bHQrMTsKKyAgY2hhciogYnVmID0gbmV3IGNoYXJbbGVuZ3RoXTsKKworICAvLyBSZXN0b3JlIHRoZSB2YV9saXN0IGJlZm9yZSB3ZSB1c2UgaXQgYWdhaW4KKyAgdmFfY29weShiYWNrdXBfYXAsIGFwKTsKKyAgcmVzdWx0ID0gdnNucHJpbnRmKGJ1ZiwgbGVuZ3RoLCBmb3JtYXQsIGJhY2t1cF9hcCk7CisgIHZhX2VuZChiYWNrdXBfYXApOworCisgIGlmIChyZXN1bHQgPj0gMCAmJiByZXN1bHQgPCBsZW5ndGgpIHsKKyAgICAvLyBJdCBmaXQKKyAgICBkc3QtPmFwcGVuZChidWYsIHJlc3VsdCk7CisgIH0KKyAgZGVsZXRlW10gYnVmOworfQorCisKK3N0cmluZyBTdHJpbmdQcmludGYoY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIHN0cmluZyByZXN1bHQ7CisgIFN0cmluZ0FwcGVuZFYoJnJlc3VsdCwgZm9ybWF0LCBhcCk7CisgIHZhX2VuZChhcCk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK2NvbnN0IHN0cmluZyYgU1N0cmluZ1ByaW50ZihzdHJpbmcqIGRzdCwgY29uc3QgY2hhciogZm9ybWF0LCAuLi4pIHsKKyAgdmFfbGlzdCBhcDsKKyAgdmFfc3RhcnQoYXAsIGZvcm1hdCk7CisgIGRzdC0+Y2xlYXIoKTsKKyAgU3RyaW5nQXBwZW5kVihkc3QsIGZvcm1hdCwgYXApOworICB2YV9lbmQoYXApOworICByZXR1cm4gKmRzdDsKK30KKwordm9pZCBTdHJpbmdBcHBlbmRGKHN0cmluZyogZHN0LCBjb25zdCBjaGFyKiBmb3JtYXQsIC4uLikgeworICB2YV9saXN0IGFwOworICB2YV9zdGFydChhcCwgZm9ybWF0KTsKKyAgU3RyaW5nQXBwZW5kVihkc3QsIGZvcm1hdCwgYXApOworICB2YV9lbmQoYXApOworfQorCisvLyBNYXggYXJndW1lbnRzIHN1cHBvcnRlZCBieSBTdHJpbmdQcmludFZlY3RvcgorY29uc3QgaW50IGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzID0gMzI7CisKKy8vIEFuIGVtcHR5IGJsb2NrIG9mIHplcm8gZm9yIGZpbGxlciBhcmd1bWVudHMuICBUaGlzIGlzIGNvbnN0IHNvIHRoYXQgaWYKKy8vIHByaW50ZiB0cmllcyB0byB3cml0ZSB0byBpdCAodmlhICVuKSB0aGVuIHRoZSBwcm9ncmFtIGdldHMgYSBTSUdTRUdWCisvLyBhbmQgd2UgY2FuIGZpeCB0aGUgcHJvYmxlbSBvciBwcm90ZWN0IGFnYWluc3QgYW4gYXR0YWNrLgorc3RhdGljIGNvbnN0IGNoYXIgc3RyaW5nX3ByaW50Zl9lbXB0eV9ibG9ja1syNTZdID0geyAnXDAnIH07CisKK3N0cmluZyBTdHJpbmdQcmludGZWZWN0b3IoY29uc3QgY2hhciogZm9ybWF0LCBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgdikgeworICBHT09HTEVfQ0hFQ0tfTEUodi5zaXplKCksIGtTdHJpbmdQcmludGZWZWN0b3JNYXhBcmdzKQorICAgICAgPDwgIlN0cmluZ1ByaW50ZlZlY3RvciBjdXJyZW50bHkgb25seSBzdXBwb3J0cyB1cCB0byAiCisgICAgICA8PCBrU3RyaW5nUHJpbnRmVmVjdG9yTWF4QXJncyA8PCAiIGFyZ3VtZW50cy4gIgorICAgICAgPDwgIkZlZWwgZnJlZSB0byBhZGQgc3VwcG9ydCBmb3IgbW9yZSBpZiB5b3UgbmVlZCBpdC4iOworCisgIC8vIEFkZCBmaWxsZXIgYXJndW1lbnRzIHNvIHRoYXQgYm9ndXMgZm9ybWF0K2FyZ3MgaGF2ZSBhIGhhcmRlciB0aW1lCisgIC8vIGNyYXNoaW5nIHRoZSBwcm9ncmFtLCBjb3JydXB0aW5nIHRoZSBwcm9ncmFtICglbiksCisgIC8vIG9yIGRpc3BsYXlpbmcgcmFuZG9tIGNodW5rcyBvZiBtZW1vcnkgdG8gdXNlcnMuCisKKyAgY29uc3QgY2hhciogY3N0cltrU3RyaW5nUHJpbnRmVmVjdG9yTWF4QXJnc107CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkgeworICAgIGNzdHJbaV0gPSB2W2ldLmNfc3RyKCk7CisgIH0KKyAgZm9yIChpbnQgaSA9IHYuc2l6ZSgpOyBpIDwgR09PR0xFX0FSUkFZU0laRShjc3RyKTsgKytpKSB7CisgICAgY3N0cltpXSA9ICZzdHJpbmdfcHJpbnRmX2VtcHR5X2Jsb2NrWzBdOworICB9CisKKyAgLy8gSSBkbyBub3Qga25vdyBhbnkgd2F5IHRvIHBhc3Mga1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3MgYXJndW1lbnRzLAorICAvLyBvciBhbnkgd2F5IHRvIGJ1aWxkIGEgdmFfbGlzdCBieSBoYW5kLCBvciBhbnkgQVBJIGZvciBwcmludGYKKyAgLy8gdGhhdCBhY2NlcHRzIGFuIGFycmF5IG9mIGFyZ3VtZW50cy4gIFRoZSBiZXN0IEkgY2FuIGRvIGlzIHN0aWNrCisgIC8vIHRoaXMgQ09NUElMRV9BU1NFUlQgcmlnaHQgbmV4dCB0byB0aGUgYWN0dWFsIHN0YXRlbWVudC4KKworICBHT09HTEVfQ09NUElMRV9BU1NFUlQoa1N0cmluZ1ByaW50ZlZlY3Rvck1heEFyZ3MgPT0gMzIsIGFyZ19jb3VudF9taXNtYXRjaCk7CisgIHJldHVybiBTdHJpbmdQcmludGYoZm9ybWF0LAorICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMF0sIGNzdHJbMV0sIGNzdHJbMl0sIGNzdHJbM10sIGNzdHJbNF0sCisgICAgICAgICAgICAgICAgICAgICAgY3N0cls1XSwgY3N0cls2XSwgY3N0cls3XSwgY3N0cls4XSwgY3N0cls5XSwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyWzEwXSwgY3N0clsxMV0sIGNzdHJbMTJdLCBjc3RyWzEzXSwgY3N0clsxNF0sCisgICAgICAgICAgICAgICAgICAgICAgY3N0clsxNV0sIGNzdHJbMTZdLCBjc3RyWzE3XSwgY3N0clsxOF0sIGNzdHJbMTldLAorICAgICAgICAgICAgICAgICAgICAgIGNzdHJbMjBdLCBjc3RyWzIxXSwgY3N0clsyMl0sIGNzdHJbMjNdLCBjc3RyWzI0XSwKKyAgICAgICAgICAgICAgICAgICAgICBjc3RyWzI1XSwgY3N0clsyNl0sIGNzdHJbMjddLCBjc3RyWzI4XSwgY3N0clsyOV0sCisgICAgICAgICAgICAgICAgICAgICAgY3N0clszMF0sIGNzdHJbMzFdKTsKK30KK30gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgorfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmX3VuaXR0ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGZfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnVjdHVyYWxseV92YWxpZC5jYwppbmRleCAwZjZhZmU2Li5hYjUxYWU2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1Y3R1cmFsbHlfdmFsaWQuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydWN0dXJhbGx5X3ZhbGlkLmNjCkBAIC0xLDggKzEsMTIgQEAKIC8vIENvcHlyaWdodCAyMDA1LTIwMDggR29vZ2xlIEluYy4gQWxsIFJpZ2h0cyBSZXNlcnZlZC4KIC8vIEF1dGhvcjoganJtQGdvb2dsZS5jb20gKEppbSBNZWVoYW4pCiAKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3BpZWNlLmg+CisKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIG5hbWVzcGFjZSBpbnRlcm5hbCB7CkBAIC01MzEsNiArNTM1LDU2IEBACiAgIHJldHVybiAoYnl0ZXNfY29uc3VtZWQgPT0gbGVuKTsKIH0KIAoraW50IFVURjhTcG5TdHJ1Y3R1cmFsbHlWYWxpZChjb25zdCBTdHJpbmdQaWVjZSYgc3RyKSB7CisgIGlmICghbW9kdWxlX2luaXRpYWxpemVkXykgcmV0dXJuIHN0ci5zaXplKCk7CisKKyAgaW50IGJ5dGVzX2NvbnN1bWVkID0gMDsKKyAgVVRGOEdlbmVyaWNTY2FuRmFzdEFzY2lpKCZ1dGY4YWNjZXB0bm9uc3Vycm9nYXRlc19vYmosCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHIuZGF0YSgpLCBzdHIuc2l6ZSgpLCAmYnl0ZXNfY29uc3VtZWQpOworICByZXR1cm4gYnl0ZXNfY29uc3VtZWQ7Cit9CisKKy8vIENvZXJjZSBVVEYtOCBieXRlIHN0cmluZyBpbiBzcmNfc3RyIHRvIGJlCisvLyBhIHN0cnVjdHVyYWxseS12YWxpZCBlcXVhbC1sZW5ndGggc3RyaW5nIGJ5IHNlbGVjdGl2ZWx5CisvLyBvdmVyd3JpdGluZyBpbGxlZ2FsIGJ5dGVzIHdpdGggcmVwbGFjZV9jaGFyICh0eXBpY2FsbHkgYmxhbmspLgorLy8gcmVwbGFjZV9jaGFyIG11c3QgYmUgbGVnYWwgcHJpbnRhYmxlIDctYml0IEFzY2lpIDB4MjAuLjB4N2UuCisvLyBzcmNfc3RyIGlzIHJlYWQtb25seS4gSWYgYW55IG92ZXJ3cml0aW5nIGlzIG5lZWRlZCwgYSBtb2RpZmllZCBieXRlIHN0cmluZworLy8gaXMgY3JlYXRlZCBpbiBpZHN0LCBsZW5ndGggaXNyY2xlbi4KKy8vCisvLyBSZXR1cm5zIHBvaW50ZXIgdG8gb3V0cHV0IGJ1ZmZlciwgaXNyYyBpZiBubyBjaGFuZ2VzIHdlcmUgbWFkZSwKKy8vICBvciBpZHN0IGlmIHNvbWUgYnl0ZXMgd2VyZSBjaGFuZ2VkLgorLy8KKy8vIEZhc3QgY2FzZTogYWxsIGlzIHN0cnVjdHVyYWxseSB2YWxpZCBhbmQgbm8gYnl0ZSBjb3B5aW5nIGlzIGRvbmUuCisvLworY2hhciogVVRGOENvZXJjZVRvU3RydWN0dXJhbGx5VmFsaWQoY29uc3QgU3RyaW5nUGllY2UmIHNyY19zdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBpZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciByZXBsYWNlX2NoYXIpIHsKKyAgY29uc3QgY2hhciogaXNyYyA9IHNyY19zdHIuZGF0YSgpOworICBjb25zdCBpbnQgbGVuID0gc3JjX3N0ci5sZW5ndGgoKTsKKyAgaW50IG4gPSBVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoc3JjX3N0cik7CisgIGlmIChuID09IGxlbikgeyAgICAgICAgICAgICAgIC8vIE5vcm1hbCBjYXNlIC0tIGFsbCBpcyBjb29sLCByZXR1cm4KKyAgICByZXR1cm4gY29uc3RfY2FzdDxjaGFyKj4oaXNyYyk7CisgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIFVudXN1YWwgY2FzZSAtLSBjb3B5IHcvbyBiYWQgYnl0ZXMKKyAgICBjb25zdCBjaGFyKiBzcmMgPSBpc3JjOworICAgIGNvbnN0IGNoYXIqIHNyY2xpbWl0ID0gaXNyYyArIGxlbjsKKyAgICBjaGFyKiBkc3QgPSBpZHN0OworICAgIG1lbW1vdmUoZHN0LCBzcmMsIG4pOyAgICAgICAvLyBDb3B5IGluaXRpYWwgZ29vZCBjaHVuaworICAgIHNyYyArPSBuOworICAgIGRzdCArPSBuOworICAgIHdoaWxlIChzcmMgPCBzcmNsaW1pdCkgeyAgICAvLyBzcmMgcG9pbnRzIHRvIGJvZ3VzIGJ5dGUgb3IgaXMgb2ZmIHRoZSBlbmQKKyAgICAgIGRzdFswXSA9IHJlcGxhY2VfY2hhcjsgICAgICAgICAgICAgICAgICAgIC8vIHJlcGxhY2Ugb25lIGJhZCBieXRlCisgICAgICBzcmMrKzsKKyAgICAgIGRzdCsrOworICAgICAgU3RyaW5nUGllY2Ugc3RyMihzcmMsIHNyY2xpbWl0IC0gc3JjKTsKKyAgICAgIG4gPSBVVEY4U3BuU3RydWN0dXJhbGx5VmFsaWQoc3RyMik7ICAgICAgIC8vIHNjYW4gdGhlIHJlbWFpbmRlcgorICAgICAgbWVtbW92ZShkc3QsIHNyYywgbik7ICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBuZXh0IGdvb2QgY2h1bmsKKyAgICAgIHNyYyArPSBuOworICAgICAgZHN0ICs9IG47CisgICAgfQorICB9CisgIHJldHVybiBpZHN0OworfQorCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuY2MKaW5kZXggZWUwN2NlNy4uMjk2Njk0YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0yOSwxNSArMjksMjUgQEAKIC8vIE9GIFRISVMgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCiAKIC8vIGZyb20gZ29vZ2xlMy9zdHJpbmdzL3N0cnV0aWwuY2MKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdGRsaWJfcG9lbS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9jbGllbnRfcG9ydGluZy9wb2VtL3N0ZGlvX3BvZW0uaCIKKyNpbmNsdWRlICJzdGFyYm9hcmQvY2xpZW50X3BvcnRpbmcvcG9lbS9zdHJpbmdfcG9lbS5oIgogCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KKyNpZm5kZWYgU1RBUkJPQVJECisjaW5jbHVkZSA8c3RkaW8uaD4KKyNlbmRpZiAgLy8gU1RBUkJPQVJECisKICNpbmNsdWRlIDxlcnJuby5oPgogI2luY2x1ZGUgPGZsb2F0Lmg+ICAgIC8vIEZMVF9ESUcgYW5kIERCTF9ESUcKICNpbmNsdWRlIDxsaW1pdHM+CiAjaW5jbHVkZSA8bGltaXRzLmg+Ci0jaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxpdGVyYXRvcj4KIAorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL21hdGhsaW1pdHMuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgorCiAjaWZkZWYgX1dJTjMyCiAvLyBNU1ZDIGhhcyBvbmx5IF9zbnByaW50Ziwgbm90IHNucHJpbnRmLgogLy8KQEAgLTU1LDExICs2NSw2IEBACiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKLWlubGluZSBib29sIElzTmFOKGRvdWJsZSB2YWx1ZSkgewotICAvLyBOYU4gaXMgbmV2ZXIgZXF1YWwgdG8gYW55dGhpbmcsIGV2ZW4gaXRzZWxmLgotICByZXR1cm4gdmFsdWUgIT0gdmFsdWU7Ci19Ci0KIC8vIFRoZXNlIGFyZSBkZWZpbmVkIGFzIG1hY3JvcyBvbiBzb21lIHBsYXRmb3Jtcy4gICN1bmRlZiB0aGVtIHNvIHRoYXQgd2UgY2FuCiAvLyByZWRlZmluZSB0aGVtLgogI3VuZGVmIGlzeGRpZ2l0CkBAIC04NCw2ICs4OSw4IEBACiAvLyAgICBSZXBsYWNlcyBhbnkgb2NjdXJyZW5jZSBvZiB0aGUgY2hhcmFjdGVyICdyZW1vdmUnIChvciB0aGUgY2hhcmFjdGVycwogLy8gICAgaW4gJ3JlbW92ZScpIHdpdGggdGhlIGNoYXJhY3RlciAncmVwbGFjZXdpdGgnLgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRGlzYWJsZWQgaW4gU1RBUkJPQVJELCBiZWNhdXNlIG5vIHJlcGxhY2VtZW50IGZvciB8c3RycGJya3wuCisjaWZuZGVmIFNUQVJCT0FSRAogdm9pZCBTdHJpcFN0cmluZyhzdHJpbmcqIHMsIGNvbnN0IGNoYXIqIHJlbW92ZSwgY2hhciByZXBsYWNld2l0aCkgewogICBjb25zdCBjaGFyICogc3RyX3N0YXJ0ID0gcy0+Y19zdHIoKTsKICAgY29uc3QgY2hhciAqIHN0ciA9IHN0cl9zdGFydDsKQEAgLTkzLDYgKzEwMCwzNSBAQAogICAgICgqcylbc3RyIC0gc3RyX3N0YXJ0XSA9IHJlcGxhY2V3aXRoOwogICB9CiB9CisjZW5kaWYKKwordm9pZCBTdHJpcFdoaXRlc3BhY2Uoc3RyaW5nKiBzdHIpIHsKKyAgaW50IHN0cl9sZW5ndGggPSBzdHItPmxlbmd0aCgpOworCisgIC8vIFN0cmlwIG9mZiBsZWFkaW5nIHdoaXRlc3BhY2UuCisgIGludCBmaXJzdCA9IDA7CisgIHdoaWxlIChmaXJzdCA8IHN0cl9sZW5ndGggJiYgYXNjaWlfaXNzcGFjZShzdHItPmF0KGZpcnN0KSkpIHsKKyAgICArK2ZpcnN0OworICB9CisgIC8vIElmIGVudGlyZSBzdHJpbmcgaXMgd2hpdGUgc3BhY2UuCisgIGlmIChmaXJzdCA9PSBzdHJfbGVuZ3RoKSB7CisgICAgc3RyLT5jbGVhcigpOworICAgIHJldHVybjsKKyAgfQorICBpZiAoZmlyc3QgPiAwKSB7CisgICAgc3RyLT5lcmFzZSgwLCBmaXJzdCk7CisgICAgc3RyX2xlbmd0aCAtPSBmaXJzdDsKKyAgfQorCisgIC8vIFN0cmlwIG9mZiB0cmFpbGluZyB3aGl0ZXNwYWNlLgorICBpbnQgbGFzdCA9IHN0cl9sZW5ndGggLSAxOworICB3aGlsZSAobGFzdCA+PSAwICYmIGFzY2lpX2lzc3BhY2Uoc3RyLT5hdChsYXN0KSkpIHsKKyAgICAtLWxhc3Q7CisgIH0KKyAgaWYgKGxhc3QgIT0gKHN0cl9sZW5ndGggLSAxKSAmJiBsYXN0ID49IDApIHsKKyAgICBzdHItPmVyYXNlKGxhc3QgKyAxLCBzdHJpbmc6Om5wb3MpOworICB9Cit9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFN0cmluZ1JlcGxhY2UoKQpAQCAtMTg5LDYgKzIyNSw0NCBAQAogICBTcGxpdFN0cmluZ1RvSXRlcmF0b3JVc2luZyhmdWxsLCBkZWxpbSwgaXQpOwogfQogCisvLyBTcGxpdCBhIHN0cmluZyB1c2luZyBhIGNoYXJhY3RlciBkZWxpbWl0ZXIuIEFwcGVuZCB0aGUgY29tcG9uZW50cworLy8gdG8gJ3Jlc3VsdCcuICBJZiB0aGVyZSBhcmUgY29uc2VjdXRpdmUgZGVsaW1pdGVycywgdGhpcyBmdW5jdGlvbgorLy8gd2lsbCByZXR1cm4gY29ycmVzcG9uZGluZyBlbXB0eSBzdHJpbmdzLiBUaGUgc3RyaW5nIGlzIHNwbGl0IGludG8KKy8vIGF0IG1vc3QgdGhlIHNwZWNpZmllZCBudW1iZXIgb2YgcGllY2VzIGdyZWVkaWx5LiBUaGlzIG1lYW5zIHRoYXQgdGhlCisvLyBsYXN0IHBpZWNlIG1heSBwb3NzaWJseSBiZSBzcGxpdCBmdXJ0aGVyLiBUbyBzcGxpdCBpbnRvIGFzIG1hbnkgcGllY2VzCisvLyBhcyBwb3NzaWJsZSwgc3BlY2lmeSAwIGFzIHRoZSBudW1iZXIgb2YgcGllY2VzLgorLy8KKy8vIElmICJmdWxsIiBpcyB0aGUgZW1wdHkgc3RyaW5nLCB5aWVsZHMgYW4gZW1wdHkgc3RyaW5nIGFzIHRoZSBvbmx5IHZhbHVlLgorLy8KKy8vIElmICJwaWVjZXMiIGlzIG5lZ2F0aXZlIGZvciBzb21lIHJlYXNvbiwgaXQgcmV0dXJucyB0aGUgd2hvbGUgc3RyaW5nCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCit0ZW1wbGF0ZSA8dHlwZW5hbWUgU3RyaW5nVHlwZSwgdHlwZW5hbWUgSVRSPgorc3RhdGljIGlubGluZQordm9pZCBTcGxpdFN0cmluZ1RvSXRlcmF0b3JBbGxvd0VtcHR5KGNvbnN0IFN0cmluZ1R5cGUmIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHBpZWNlcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFImIHJlc3VsdCkgeworICBzdHJpbmc6OnNpemVfdHlwZSBiZWdpbl9pbmRleCwgZW5kX2luZGV4OworICBiZWdpbl9pbmRleCA9IDA7CisKKyAgZm9yIChpbnQgaSA9IDA7IChpIDwgcGllY2VzLTEpIHx8IChwaWVjZXMgPT0gMCk7IGkrKykgeworICAgIGVuZF9pbmRleCA9IGZ1bGwuZmluZF9maXJzdF9vZihkZWxpbSwgYmVnaW5faW5kZXgpOworICAgIGlmIChlbmRfaW5kZXggPT0gc3RyaW5nOjpucG9zKSB7CisgICAgICAqcmVzdWx0KysgPSBmdWxsLnN1YnN0cihiZWdpbl9pbmRleCk7CisgICAgICByZXR1cm47CisgICAgfQorICAgICpyZXN1bHQrKyA9IGZ1bGwuc3Vic3RyKGJlZ2luX2luZGV4LCAoZW5kX2luZGV4IC0gYmVnaW5faW5kZXgpKTsKKyAgICBiZWdpbl9pbmRleCA9IGVuZF9pbmRleCArIDE7CisgIH0KKyAgKnJlc3VsdCsrID0gZnVsbC5zdWJzdHIoYmVnaW5faW5kZXgpOworfQorCit2b2lkIFNwbGl0U3RyaW5nQWxsb3dFbXB0eShjb25zdCBzdHJpbmcmIGZ1bGwsIGNvbnN0IGNoYXIqIGRlbGltLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIHJlc3VsdCkgeworICBiYWNrX2luc2VydF9pdGVyYXRvcjx2ZWN0b3I8c3RyaW5nPiA+IGl0KCpyZXN1bHQpOworICBTcGxpdFN0cmluZ1RvSXRlcmF0b3JBbGxvd0VtcHR5KGZ1bGwsIGRlbGltLCAwLCBpdCk7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEpvaW5TdHJpbmdzKCkKIC8vICAgIFRoaXMgbWVyZ2VzIGEgdmVjdG9yIG9mIHN0cmluZyBjb21wb25lbnRzIHdpdGggZGVsaW0gaW5zZXJ0ZWQKQEAgLTI0MywxNyArMzE3LDYgQEAKIAogI2RlZmluZSBJU19PQ1RBTF9ESUdJVChjKSAoKChjKSA+PSAnMCcpICYmICgoYykgPD0gJzcnKSkKIAotaW5saW5lIGludCBoZXhfZGlnaXRfdG9faW50KGNoYXIgYykgewotICAvKiBBc3N1bWUgQVNDSUkuICovCi0gIGFzc2VydCgnMCcgPT0gMHgzMCAmJiAnQScgPT0gMHg0MSAmJiAnYScgPT0gMHg2MSk7Ci0gIGFzc2VydChpc3hkaWdpdChjKSk7Ci0gIGludCB4ID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oYyk7Ci0gIGlmICh4ID4gJzknKSB7Ci0gICAgeCArPSA5OwotICB9Ci0gIHJldHVybiB4ICYgMHhmOwotfQotCiAvLyBQcm90b2NvbCBidWZmZXJzIGRvZXNuJ3QgZXZlciBjYXJlIGFib3V0IGVycm9ycywgYnV0IEkgZG9uJ3Qgd2FudCB0byByZW1vdmUKIC8vIHRoZSBjb2RlLgogI2RlZmluZSBMT0dfU1RSSU5HKExFVkVMLCBWRUNUT1IpIEdPT0dMRV9MT0dfSUYoTEVWRUwsIGZhbHNlKQpAQCAtNDcwLDI3ICs1MzMsODEgQEAKICAgcmV0dXJuIHVzZWQ7CiB9CiAKLWludCBDRXNjYXBlU3RyaW5nKGNvbnN0IGNoYXIqIHNyYywgaW50IHNyY19sZW4sIGNoYXIqIGRlc3QsIGludCBkZXN0X2xlbikgewotICByZXR1cm4gQ0VzY2FwZUludGVybmFsKHNyYywgc3JjX2xlbiwgZGVzdCwgZGVzdF9sZW4sIGZhbHNlLCBmYWxzZSk7CisvLyBDYWxjdWxhdGVzIHRoZSBsZW5ndGggb2YgdGhlIEMtc3R5bGUgZXNjYXBlZCB2ZXJzaW9uIG9mICdzcmMnLgorLy8gQXNzdW1lcyB0aGF0IG5vbi1wcmludGFibGUgY2hhcmFjdGVycyBhcmUgZXNjYXBlZCB1c2luZyBvY3RhbCBzZXF1ZW5jZXMsIGFuZAorLy8gdGhhdCBVVEYtOCBieXRlcyBhcmUgbm90IGhhbmRsZWQgc3BlY2lhbGx5Lgorc3RhdGljIGlubGluZSBzaXplX3QgQ0VzY2FwZWRMZW5ndGgoU3RyaW5nUGllY2Ugc3JjKSB7CisgIHN0YXRpYyBjaGFyIGNfZXNjYXBlZF9sZW5bMjU2XSA9IHsKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCAyLCAyLCA0LCA0LCAyLCA0LCA0LCAgLy8gXHQsIFxuLCBccgorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMiwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgMSwgIC8vICIsICcKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgLy8gJzAnLi4nOScKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAgLy8gJ0EnLi4nTycKKyAgICAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAxLCAyLCAxLCAxLCAxLCAgLy8gJ1AnLi4nWicsICdcJworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsICAvLyAnYScuLidvJworICAgIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDEsIDQsICAvLyAncCcuLid6JywgREVMCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICAgIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsIDQsCisgICAgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwgNCwKKyAgICA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LCA0LAorICB9OworCisgIHNpemVfdCBlc2NhcGVkX2xlbiA9IDA7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLnNpemUoKTsgKytpKSB7CisgICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3JjW2ldKTsKKyAgICBlc2NhcGVkX2xlbiArPSBjX2VzY2FwZWRfbGVuW2NdOworICB9CisgIHJldHVybiBlc2NhcGVkX2xlbjsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gQ0VzY2FwZSgpCi0vLyBDSGV4RXNjYXBlKCkKLS8vICAgIENvcGllcyAnc3JjJyB0byByZXN1bHQsIGVzY2FwaW5nIGRhbmdlcm91cyBjaGFyYWN0ZXJzIHVzaW5nCi0vLyAgICBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMuIFRoaXMgaXMgdmVyeSB1c2VmdWwgZm9yIHByZXBhcmluZyBxdWVyeQotLy8gICAgZmxhZ3MuICdzcmMnIGFuZCAnZGVzdCcgc2hvdWxkIG5vdCBvdmVybGFwLiBUaGUgJ0hleCcgdmVyc2lvbgotLy8gICAgaGV4YWRlY2ltYWwgcmF0aGVyIHRoYW4gb2N0YWwgc2VxdWVuY2VzLgotLy8KLS8vICAgIEN1cnJlbnRseSBvbmx5IFxuLCBcciwgXHQsICIsICcsIFwgYW5kICFpc3ByaW50KCkgY2hhcnMgYXJlIGVzY2FwZWQuCisvLyBFc2NhcGVzICdzcmMnIHVzaW5nIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcywgYW5kIGFwcGVuZHMgdGhlIGVzY2FwZWQgc3RyaW5nCisvLyB0byAnZGVzdCcuIFRoaXMgdmVyc2lvbiBpcyBmYXN0ZXIgdGhhbiBjYWxsaW5nIENFc2NhcGVJbnRlcm5hbCBhcyBpdCBjb21wdXRlcworLy8gdGhlIHJlcXVpcmVkIHNwYWNlIHVzaW5nIGEgbG9va3VwIHRhYmxlLCBhbmQgYWxzbyBkb2VzIG5vdCBkbyBhbnkgc3BlY2lhbAorLy8gaGFuZGxpbmcgZm9yIEhleCBvciBVVEYtOCBjaGFyYWN0ZXJzLgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQordm9pZCBDRXNjYXBlQW5kQXBwZW5kKFN0cmluZ1BpZWNlIHNyYywgc3RyaW5nKiBkZXN0KSB7CisgIHNpemVfdCBlc2NhcGVkX2xlbiA9IENFc2NhcGVkTGVuZ3RoKHNyYyk7CisgIGlmIChlc2NhcGVkX2xlbiA9PSBzcmMuc2l6ZSgpKSB7CisgICAgZGVzdC0+YXBwZW5kKHNyYy5kYXRhKCksIHNyYy5zaXplKCkpOworICAgIHJldHVybjsKKyAgfQorCisgIHNpemVfdCBjdXJfZGVzdF9sZW4gPSBkZXN0LT5zaXplKCk7CisgIGRlc3QtPnJlc2l6ZShjdXJfZGVzdF9sZW4gKyBlc2NhcGVkX2xlbik7CisgIGNoYXIqIGFwcGVuZF9wdHIgPSAmKCpkZXN0KVtjdXJfZGVzdF9sZW5dOworCisgIGZvciAoaW50IGkgPSAwOyBpIDwgc3JjLnNpemUoKTsgKytpKSB7CisgICAgdW5zaWduZWQgY2hhciBjID0gc3RhdGljX2Nhc3Q8dW5zaWduZWQgY2hhcj4oc3JjW2ldKTsKKyAgICBzd2l0Y2ggKGMpIHsKKyAgICAgIGNhc2UgJ1xuJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnbic7IGJyZWFrOworICAgICAgY2FzZSAnXHInOiAqYXBwZW5kX3B0cisrID0gJ1xcJzsgKmFwcGVuZF9wdHIrKyA9ICdyJzsgYnJlYWs7CisgICAgICBjYXNlICdcdCc6ICphcHBlbmRfcHRyKysgPSAnXFwnOyAqYXBwZW5kX3B0cisrID0gJ3QnOyBicmVhazsKKyAgICAgIGNhc2UgJ1wiJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXCInOyBicmVhazsKKyAgICAgIGNhc2UgJ1wnJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXCcnOyBicmVhazsKKyAgICAgIGNhc2UgJ1xcJzogKmFwcGVuZF9wdHIrKyA9ICdcXCc7ICphcHBlbmRfcHRyKysgPSAnXFwnOyBicmVhazsKKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIGlmICghaXNwcmludChjKSkgeworICAgICAgICAgICphcHBlbmRfcHRyKysgPSAnXFwnOworICAgICAgICAgICphcHBlbmRfcHRyKysgPSAnMCcgKyBjIC8gNjQ7CisgICAgICAgICAgKmFwcGVuZF9wdHIrKyA9ICcwJyArIChjICUgNjQpIC8gODsKKyAgICAgICAgICAqYXBwZW5kX3B0cisrID0gJzAnICsgYyAlIDg7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgKmFwcGVuZF9wdHIrKyA9IGM7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisgICAgfQorICB9Cit9CisKIHN0cmluZyBDRXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKSB7Ci0gIGNvbnN0IGludCBkZXN0X2xlbmd0aCA9IHNyYy5zaXplKCkgKiA0ICsgMTsgLy8gTWF4aW11bSBwb3NzaWJsZSBleHBhbnNpb24KLSAgc2NvcGVkX2FycmF5PGNoYXI+IGRlc3QobmV3IGNoYXJbZGVzdF9sZW5ndGhdKTsKLSAgY29uc3QgaW50IGxlbiA9IENFc2NhcGVJbnRlcm5hbChzcmMuZGF0YSgpLCBzcmMuc2l6ZSgpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3QuZ2V0KCksIGRlc3RfbGVuZ3RoLCBmYWxzZSwgZmFsc2UpOwotICBHT09HTEVfRENIRUNLX0dFKGxlbiwgMCk7Ci0gIHJldHVybiBzdHJpbmcoZGVzdC5nZXQoKSwgbGVuKTsKKyAgc3RyaW5nIGRlc3Q7CisgIENFc2NhcGVBbmRBcHBlbmQoc3JjLCAmZGVzdCk7CisgIHJldHVybiBkZXN0OwogfQogCiBuYW1lc3BhY2Ugc3RyaW5ncyB7CkBAIC01NTgsNiArNjc1LDEzMyBAQAogICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPihyZXN1bHQpOwogfQogCitpbmxpbmUgYm9vbCBzYWZlX3BhcnNlX3NpZ24oc3RyaW5nKiB0ZXh0ICAvKmlub3V0Ki8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCogbmVnYXRpdmVfcHRyICAvKm91dHB1dCovKSB7CisgIGNvbnN0IGNoYXIqIHN0YXJ0ID0gdGV4dC0+ZGF0YSgpOworICBjb25zdCBjaGFyKiBlbmQgPSBzdGFydCArIHRleHQtPnNpemUoKTsKKworICAvLyBDb25zdW1lIHdoaXRlc3BhY2UuCisgIHdoaWxlIChzdGFydCA8IGVuZCAmJiAoc3RhcnRbMF0gPT0gJyAnKSkgeworICAgICsrc3RhcnQ7CisgIH0KKyAgd2hpbGUgKHN0YXJ0IDwgZW5kICYmIChlbmRbLTFdID09ICcgJykpIHsKKyAgICAtLWVuZDsKKyAgfQorICBpZiAoc3RhcnQgPj0gZW5kKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgLy8gQ29uc3VtZSBzaWduLgorICAqbmVnYXRpdmVfcHRyID0gKHN0YXJ0WzBdID09ICctJyk7CisgIGlmICgqbmVnYXRpdmVfcHRyIHx8IHN0YXJ0WzBdID09ICcrJykgeworICAgICsrc3RhcnQ7CisgICAgaWYgKHN0YXJ0ID49IGVuZCkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorICAqdGV4dCA9IHRleHQtPnN1YnN0cihzdGFydCAtIHRleHQtPmRhdGEoKSwgZW5kIC0gc3RhcnQpOworICByZXR1cm4gdHJ1ZTsKK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSW50VHlwZT4KK2Jvb2wgc2FmZV9wYXJzZV9wb3NpdGl2ZV9pbnQoCisgICAgc3RyaW5nIHRleHQsIEludFR5cGUqIHZhbHVlX3ApIHsKKyAgaW50IGJhc2UgPSAxMDsKKyAgSW50VHlwZSB2YWx1ZSA9IDA7CisgIGNvbnN0IEludFR5cGUgdm1heCA9IHN0ZDo6bnVtZXJpY19saW1pdHM8SW50VHlwZT46Om1heCgpOworICBhc3NlcnQodm1heCA+IDApOworICBhc3NlcnQodm1heCA+PSBiYXNlKTsKKyAgY29uc3QgSW50VHlwZSB2bWF4X292ZXJfYmFzZSA9IHZtYXggLyBiYXNlOworICBjb25zdCBjaGFyKiBzdGFydCA9IHRleHQuZGF0YSgpOworICBjb25zdCBjaGFyKiBlbmQgPSBzdGFydCArIHRleHQuc2l6ZSgpOworICAvLyBsb29wIG92ZXIgZGlnaXRzCisgIGZvciAoOyBzdGFydCA8IGVuZDsgKytzdGFydCkgeworICAgIHVuc2lnbmVkIGNoYXIgYyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHN0YXJ0WzBdKTsKKyAgICBpbnQgZGlnaXQgPSBjIC0gJzAnOworICAgIGlmIChkaWdpdCA+PSBiYXNlIHx8IGRpZ2l0IDwgMCkgeworICAgICAgKnZhbHVlX3AgPSB2YWx1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbHVlID4gdm1heF9vdmVyX2Jhc2UpIHsKKyAgICAgICp2YWx1ZV9wID0gdm1heDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgKj0gYmFzZTsKKyAgICBpZiAodmFsdWUgPiB2bWF4IC0gZGlnaXQpIHsKKyAgICAgICp2YWx1ZV9wID0gdm1heDsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgKz0gZGlnaXQ7CisgIH0KKyAgKnZhbHVlX3AgPSB2YWx1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEludFR5cGU+Citib29sIHNhZmVfcGFyc2VfbmVnYXRpdmVfaW50KAorICAgIGNvbnN0IHN0cmluZyYgdGV4dCwgSW50VHlwZSogdmFsdWVfcCkgeworICBpbnQgYmFzZSA9IDEwOworICBJbnRUeXBlIHZhbHVlID0gMDsKKyAgY29uc3QgSW50VHlwZSB2bWluID0gc3RkOjpudW1lcmljX2xpbWl0czxJbnRUeXBlPjo6bWluKCk7CisgIGFzc2VydCh2bWluIDwgMCk7CisgIGFzc2VydCh2bWluIDw9IDAgLSBiYXNlKTsKKyAgSW50VHlwZSB2bWluX292ZXJfYmFzZSA9IHZtaW4gLyBiYXNlOworICAvLyAyMDAzIGMrKyBzdGFuZGFyZCBbZXhwci5tdWxdCisgIC8vICIuLi4gdGhlIHNpZ24gb2YgdGhlIHJlbWFpbmRlciBpcyBpbXBsZW1lbnRhdGlvbi1kZWZpbmVkLiIKKyAgLy8gQWx0aG91Z2ggKHZtaW4vYmFzZSkqYmFzZSArIHZtaW4lYmFzZSBpcyBhbHdheXMgdm1pbi4KKyAgLy8gMjAxMSBjKysgc3RhbmRhcmQgdGlnaHRlbnMgdGhlIHNwZWMgYnV0IHdlIGNhbm5vdCByZWx5IG9uIGl0LgorICBpZiAodm1pbiAlIGJhc2UgPiAwKSB7CisgICAgdm1pbl9vdmVyX2Jhc2UgKz0gMTsKKyAgfQorICBjb25zdCBjaGFyKiBzdGFydCA9IHRleHQuZGF0YSgpOworICBjb25zdCBjaGFyKiBlbmQgPSBzdGFydCArIHRleHQuc2l6ZSgpOworICAvLyBsb29wIG92ZXIgZGlnaXRzCisgIGZvciAoOyBzdGFydCA8IGVuZDsgKytzdGFydCkgeworICAgIHVuc2lnbmVkIGNoYXIgYyA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KHN0YXJ0WzBdKTsKKyAgICBpbnQgZGlnaXQgPSBjIC0gJzAnOworICAgIGlmIChkaWdpdCA+PSBiYXNlIHx8IGRpZ2l0IDwgMCkgeworICAgICAgKnZhbHVlX3AgPSB2YWx1ZTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKHZhbHVlIDwgdm1pbl9vdmVyX2Jhc2UpIHsKKyAgICAgICp2YWx1ZV9wID0gdm1pbjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgKj0gYmFzZTsKKyAgICBpZiAodmFsdWUgPCB2bWluICsgZGlnaXQpIHsKKyAgICAgICp2YWx1ZV9wID0gdm1pbjsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgdmFsdWUgLT0gZGlnaXQ7CisgIH0KKyAgKnZhbHVlX3AgPSB2YWx1ZTsKKyAgcmV0dXJuIHRydWU7Cit9CisKK3RlbXBsYXRlPHR5cGVuYW1lIEludFR5cGU+Citib29sIHNhZmVfaW50X2ludGVybmFsKHN0cmluZyB0ZXh0LCBJbnRUeXBlKiB2YWx1ZV9wKSB7CisgICp2YWx1ZV9wID0gMDsKKyAgYm9vbCBuZWdhdGl2ZTsKKyAgaWYgKCFzYWZlX3BhcnNlX3NpZ24oJnRleHQsICZuZWdhdGl2ZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgaWYgKCFuZWdhdGl2ZSkgeworICAgIHJldHVybiBzYWZlX3BhcnNlX3Bvc2l0aXZlX2ludCh0ZXh0LCB2YWx1ZV9wKTsKKyAgfSBlbHNlIHsKKyAgICByZXR1cm4gc2FmZV9wYXJzZV9uZWdhdGl2ZV9pbnQodGV4dCwgdmFsdWVfcCk7CisgIH0KK30KKwordGVtcGxhdGU8dHlwZW5hbWUgSW50VHlwZT4KK2Jvb2wgc2FmZV91aW50X2ludGVybmFsKHN0cmluZyB0ZXh0LCBJbnRUeXBlKiB2YWx1ZV9wKSB7CisgICp2YWx1ZV9wID0gMDsKKyAgYm9vbCBuZWdhdGl2ZTsKKyAgaWYgKCFzYWZlX3BhcnNlX3NpZ24oJnRleHQsICZuZWdhdGl2ZSkgfHwgbmVnYXRpdmUpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHNhZmVfcGFyc2VfcG9zaXRpdmVfaW50KHRleHQsIHZhbHVlX3ApOworfQorCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBGYXN0SW50VG9CdWZmZXIoKQogLy8gRmFzdEludDY0VG9CdWZmZXIoKQpAQCAtNjkxLDEzICs5MzUsNiBAQAogICByZXR1cm4gSW50ZXJuYWxGYXN0SGV4VG9CdWZmZXIodmFsdWUsIGJ1ZmZlciwgOCk7CiB9CiAKLXN0YXRpYyBpbmxpbmUgY2hhciogUGxhY2VOdW0oY2hhciogcCwgaW50IG51bSwgY2hhciBwcmV2X3NlcCkgewotICAgKnAtLSA9ICcwJyArIG51bSAlIDEwOwotICAgKnAtLSA9ICcwJyArIG51bSAvIDEwOwotICAgKnAtLSA9IHByZXZfc2VwOwotICAgcmV0dXJuIHA7Ci19Ci0KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEZhc3RJbnQzMlRvQnVmZmVyTGVmdCgpCiAvLyBGYXN0VUludDMyVG9CdWZmZXJMZWZ0KCkKQEAgLTEwMjUsNyArMTI2Miw3IEBACiAgIH0gZWxzZSBpZiAodmFsdWUgPT0gLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpIHsKICAgICBzdHJjcHkoYnVmZmVyLCAiLWluZiIpOwogICAgIHJldHVybiBidWZmZXI7Ci0gIH0gZWxzZSBpZiAoSXNOYU4odmFsdWUpKSB7CisgIH0gZWxzZSBpZiAoTWF0aExpbWl0czxkb3VibGU+OjpJc05hTih2YWx1ZSkpIHsKICAgICBzdHJjcHkoYnVmZmVyLCAibmFuIik7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKICAgfQpAQCAtMTA1NiwxMCArMTI5Myw0NSBAQAogICByZXR1cm4gYnVmZmVyOwogfQogCitzdGF0aWMgaW50IG1lbWNhc2VjbXAoY29uc3QgY2hhciAqczEsIGNvbnN0IGNoYXIgKnMyLCBzaXplX3QgbGVuKSB7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzMSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihzMSk7CisgIGNvbnN0IHVuc2lnbmVkIGNoYXIgKnVzMiA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhciAqPihzMik7CisKKyAgZm9yICggaW50IGkgPSAwOyBpIDwgbGVuOyBpKysgKSB7CisgICAgY29uc3QgaW50IGRpZmYgPQorICAgICAgc3RhdGljX2Nhc3Q8aW50PihzdGF0aWNfY2FzdDx1bnNpZ25lZCBjaGFyPihhc2NpaV90b2xvd2VyKHVzMVtpXSkpKSAtCisgICAgICBzdGF0aWNfY2FzdDxpbnQ+KHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGFzY2lpX3RvbG93ZXIodXMyW2ldKSkpOworICAgIGlmIChkaWZmICE9IDApIHJldHVybiBkaWZmOworICB9CisgIHJldHVybiAwOworfQorCitpbmxpbmUgYm9vbCBDYXNlRXF1YWwoU3RyaW5nUGllY2UgczEsIFN0cmluZ1BpZWNlIHMyKSB7CisgIGlmIChzMS5zaXplKCkgIT0gczIuc2l6ZSgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBtZW1jYXNlY21wKHMxLmRhdGEoKSwgczIuZGF0YSgpLCBzMS5zaXplKCkpID09IDA7Cit9CisKK2Jvb2wgc2FmZV9zdHJ0b2IoU3RyaW5nUGllY2Ugc3RyLCBib29sKiB2YWx1ZSkgeworICBHT09HTEVfQ0hFQ0sodmFsdWUgIT0gTlVMTCkgPDwgIk5VTEwgb3V0cHV0IGJvb2xlYW4gZ2l2ZW4uIjsKKyAgaWYgKENhc2VFcXVhbChzdHIsICJ0cnVlIikgfHwgQ2FzZUVxdWFsKHN0ciwgInQiKSB8fAorICAgICAgQ2FzZUVxdWFsKHN0ciwgInllcyIpIHx8IENhc2VFcXVhbChzdHIsICJ5IikgfHwKKyAgICAgIENhc2VFcXVhbChzdHIsICIxIikpIHsKKyAgICAqdmFsdWUgPSB0cnVlOworICAgIHJldHVybiB0cnVlOworICB9CisgIGlmIChDYXNlRXF1YWwoc3RyLCAiZmFsc2UiKSB8fCBDYXNlRXF1YWwoc3RyLCAiZiIpIHx8CisgICAgICBDYXNlRXF1YWwoc3RyLCAibm8iKSB8fCBDYXNlRXF1YWwoc3RyLCAibiIpIHx8CisgICAgICBDYXNlRXF1YWwoc3RyLCAiMCIpKSB7CisgICAgKnZhbHVlID0gZmFsc2U7CisgICAgcmV0dXJuIHRydWU7CisgIH0KKyAgcmV0dXJuIGZhbHNlOworfQorCiBib29sIHNhZmVfc3RydG9mKGNvbnN0IGNoYXIqIHN0ciwgZmxvYXQqIHZhbHVlKSB7CiAgIGNoYXIqIGVuZHB0cjsKICAgZXJybm8gPSAwOyAgLy8gZXJybm8gb25seSBnZXRzIHNldCBvbiBlcnJvcnMKLSNpZiBkZWZpbmVkKF9XSU4zMikgfHwgZGVmaW5lZCAoX19ocHV4KSAgLy8gaGFzIG5vIHN0cnRvZigpCisjaWYgZGVmaW5lZChfV0lOMzIpIHx8IGRlZmluZWQgKF9faHB1eCkgfHwgZGVmaW5lZChTVEFSQk9BUkQpICAvLyBoYXMgbm8gc3RydG9mKCkKICAgKnZhbHVlID0gc3RydG9kKHN0ciwgJmVuZHB0cik7CiAjZWxzZQogICAqdmFsdWUgPSBzdHJ0b2Yoc3RyLCAmZW5kcHRyKTsKQEAgLTEwNjcsNiArMTMzOSwzNCBAQAogICByZXR1cm4gKnN0ciAhPSAwICYmICplbmRwdHIgPT0gMCAmJiBlcnJubyA9PSAwOwogfQogCitib29sIHNhZmVfc3RydG9kKGNvbnN0IGNoYXIqIHN0ciwgZG91YmxlKiB2YWx1ZSkgeworICBjaGFyKiBlbmRwdHI7CisgICp2YWx1ZSA9IHN0cnRvZChzdHIsICZlbmRwdHIpOworICBpZiAoZW5kcHRyICE9IHN0cikgeworICAgIHdoaWxlIChhc2NpaV9pc3NwYWNlKCplbmRwdHIpKSArK2VuZHB0cjsKKyAgfQorICAvLyBJZ25vcmUgcmFuZ2UgZXJyb3JzIGZyb20gc3RydG9kLiAgVGhlIHZhbHVlcyBpdAorICAvLyByZXR1cm5zIG9uIHVuZGVyZmxvdyBhbmQgb3ZlcmZsb3cgYXJlIHRoZSByaWdodAorICAvLyBmYWxsYmFjayBpbiBhIHJvYnVzdCBzZXR0aW5nLgorICByZXR1cm4gKnN0ciAhPSAnXDAnICYmICplbmRwdHIgPT0gJ1wwJzsKK30KKworYm9vbCBzYWZlX3N0cnRvMzIoY29uc3Qgc3RyaW5nJiBzdHIsIGludDMyKiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV9pbnRfaW50ZXJuYWwoc3RyLCB2YWx1ZSk7Cit9CisKK2Jvb2wgc2FmZV9zdHJ0b3UzMihjb25zdCBzdHJpbmcmIHN0ciwgdWludDMyKiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV91aW50X2ludGVybmFsKHN0ciwgdmFsdWUpOworfQorCitib29sIHNhZmVfc3RydG82NChjb25zdCBzdHJpbmcmIHN0ciwgaW50NjQqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX2ludF9pbnRlcm5hbChzdHIsIHZhbHVlKTsKK30KKworYm9vbCBzYWZlX3N0cnRvdTY0KGNvbnN0IHN0cmluZyYgc3RyLCB1aW50NjQqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3VpbnRfaW50ZXJuYWwoc3RyLCB2YWx1ZSk7Cit9CisKIGNoYXIqIEZsb2F0VG9CdWZmZXIoZmxvYXQgdmFsdWUsIGNoYXIqIGJ1ZmZlcikgewogICAvLyBGTFRfRElHIGlzIDYgZm9yIElFRUUtNzU0IGZsb2F0cywgd2hpY2ggYXJlIHVzZWQgb24gYWxtb3N0IGFsbAogICAvLyBwbGF0Zm9ybXMgdGhlc2UgZGF5cy4gIEp1c3QgaW4gY2FzZSBzb21lIHN5c3RlbSBleGlzdHMgd2hlcmUgRkxUX0RJRwpAQCAtMTA4MCw3ICsxMzgwLDcgQEAKICAgfSBlbHNlIGlmICh2YWx1ZSA9PSAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSkgewogICAgIHN0cmNweShidWZmZXIsICItaW5mIik7CiAgICAgcmV0dXJuIGJ1ZmZlcjsKLSAgfSBlbHNlIGlmIChJc05hTih2YWx1ZSkpIHsKKyAgfSBlbHNlIGlmIChNYXRoTGltaXRzPGZsb2F0Pjo6SXNOYU4odmFsdWUpKSB7CiAgICAgc3RyY3B5KGJ1ZmZlciwgIm5hbiIpOwogICAgIHJldHVybiBidWZmZXI7CiAgIH0KQEAgLTExMDUsNjggKzE0MDUsODkzIEBACiAgIHJldHVybiBidWZmZXI7CiB9CiAKK25hbWVzcGFjZSBzdHJpbmdzIHsKKworQWxwaGFOdW06OkFscGhhTnVtKHN0cmluZ3M6OkhleCBoZXgpIHsKKyAgY2hhciAqY29uc3QgZW5kID0gJmRpZ2l0c1trRmFzdFRvQnVmZmVyU2l6ZV07CisgIGNoYXIgKndyaXRlciA9IGVuZDsKKyAgdWludDY0IHZhbHVlID0gaGV4LnZhbHVlOworICB1aW50NjQgd2lkdGggPSBoZXguc3BlYzsKKyAgLy8gV2UgYWNjb21wbGlzaCBtaW5pbXVtIHdpZHRoIGJ5IE9SJ2luZyBpbiAweDEwMDAwIHRvIHRoZSB1c2VyJ3MgdmFsdWUsCisgIC8vIHdoZXJlIDB4MTAwMDAgaXMgdGhlIHNtYWxsZXN0IGhleCBudW1iZXIgdGhhdCBpcyBhcyB3aWRlIGFzIHRoZSB1c2VyCisgIC8vIGFza2VkIGZvci4KKyAgdWludDY0IG1hc2sgPSAoKHN0YXRpY19jYXN0PHVpbnQ2ND4oMSkgPDwgKHdpZHRoIC0gMSkgKiA0KSkgfCB2YWx1ZTsKKyAgc3RhdGljIGNvbnN0IGNoYXIgaGV4ZGlnaXRzW10gPSAiMDEyMzQ1Njc4OWFiY2RlZiI7CisgIGRvIHsKKyAgICAqLS13cml0ZXIgPSBoZXhkaWdpdHNbdmFsdWUgJiAweEZdOworICAgIHZhbHVlID4+PSA0OworICAgIG1hc2sgPj49IDQ7CisgIH0gd2hpbGUgKG1hc2sgIT0gMCk7CisgIHBpZWNlX2RhdGFfID0gd3JpdGVyOworICBwaWVjZV9zaXplXyA9IGVuZCAtIHdyaXRlcjsKK30KKworfSAgLy8gbmFtZXNwYWNlIHN0cmluZ3MKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm9Mb2NhbGVTdHJ0b2QoKQotLy8gICBUaGlzIGNvZGUgd2lsbCBtYWtlIHlvdSBjcnkuCisvLyBTdHJDYXQoKQorLy8gICAgVGhpcyBtZXJnZXMgdGhlIGdpdmVuIHN0cmluZ3Mgb3IgaW50ZWdlcnMsIHdpdGggbm8gZGVsaW1pdGVyLiAgVGhpcworLy8gICAgaXMgZGVzaWduZWQgdG8gYmUgdGhlIGZhc3Rlc3QgcG9zc2libGUgd2F5IHRvIGNvbnN0cnVjdCBhIHN0cmluZyBvdXQKKy8vICAgIG9mIGEgbWl4IG9mIHJhdyBDIHN0cmluZ3MsIEMrKyBzdHJpbmdzLCBhbmQgaW50ZWdlciB2YWx1ZXMuCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLS8vIFJldHVybnMgYSBzdHJpbmcgaWRlbnRpY2FsIHRvICppbnB1dCBleGNlcHQgdGhhdCB0aGUgY2hhcmFjdGVyIHBvaW50ZWQgdG8KLS8vIGJ5IHJhZGl4X3BvcyAod2hpY2ggc2hvdWxkIGJlICcuJykgaXMgcmVwbGFjZWQgd2l0aCB0aGUgbG9jYWxlLXNwZWNpZmljCi0vLyByYWRpeCBjaGFyYWN0ZXIuCi1zdHJpbmcgTG9jYWxpemVSYWRpeChjb25zdCBjaGFyKiBpbnB1dCwgY29uc3QgY2hhciogcmFkaXhfcG9zKSB7Ci0gIC8vIERldGVybWluZSB0aGUgbG9jYWxlLXNwZWNpZmljIHJhZGl4IGNoYXJhY3RlciBieSBjYWxsaW5nIHNwcmludGYoKSB0bwotICAvLyBwcmludCB0aGUgbnVtYmVyIDEuNSwgdGhlbiBzdHJpcHBpbmcgb2ZmIHRoZSBkaWdpdHMuICBBcyBmYXIgYXMgSSBjYW4KLSAgLy8gdGVsbCwgdGhpcyBpcyB0aGUgb25seSBwb3J0YWJsZSwgdGhyZWFkLXNhZmUgd2F5IHRvIGdldCB0aGUgQyBsaWJyYXJ5Ci0gIC8vIHRvIGRpdnVsZGdlIHRoZSBsb2NhbGUncyByYWRpeCBjaGFyYWN0ZXIuICBObywgbG9jYWxlY29udigpIGlzIE5PVAotICAvLyB0aHJlYWQtc2FmZS4KLSAgY2hhciB0ZW1wWzE2XTsKLSAgaW50IHNpemUgPSBzcHJpbnRmKHRlbXAsICIlLjFmIiwgMS41KTsKLSAgR09PR0xFX0NIRUNLX0VRKHRlbXBbMF0sICcxJyk7Ci0gIEdPT0dMRV9DSEVDS19FUSh0ZW1wW3NpemUtMV0sICc1Jyk7Ci0gIEdPT0dMRV9DSEVDS19MRShzaXplLCA2KTsKKy8vIEFwcGVuZCBpcyBtZXJlbHkgYSB2ZXJzaW9uIG9mIG1lbWNweSB0aGF0IHJldHVybnMgdGhlIGFkZHJlc3Mgb2YgdGhlIGJ5dGUKKy8vIGFmdGVyIHRoZSBhcmVhIGp1c3Qgb3ZlcndyaXR0ZW4uICBJdCBjb21lcyBpbiBtdWx0aXBsZSBmbGF2b3JzIHRvIG1pbmltaXplCisvLyBjYWxsIG92ZXJoZWFkLgorc3RhdGljIGNoYXIgKkFwcGVuZDEoY2hhciAqb3V0LCBjb25zdCBBbHBoYU51bSAmeCkgeworICBtZW1jcHkob3V0LCB4LmRhdGEoKSwgeC5zaXplKCkpOworICByZXR1cm4gb3V0ICsgeC5zaXplKCk7Cit9CiAKLSAgLy8gTm93IHJlcGxhY2UgdGhlICcuJyBpbiB0aGUgaW5wdXQgd2l0aCBpdC4KK3N0YXRpYyBjaGFyICpBcHBlbmQyKGNoYXIgKm91dCwgY29uc3QgQWxwaGFOdW0gJngxLCBjb25zdCBBbHBoYU51bSAmeDIpIHsKKyAgbWVtY3B5KG91dCwgeDEuZGF0YSgpLCB4MS5zaXplKCkpOworICBvdXQgKz0geDEuc2l6ZSgpOworCisgIG1lbWNweShvdXQsIHgyLmRhdGEoKSwgeDIuc2l6ZSgpKTsKKyAgcmV0dXJuIG91dCArIHgyLnNpemUoKTsKK30KKworc3RhdGljIGNoYXIgKkFwcGVuZDQoY2hhciAqb3V0LAorICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJngxLCBjb25zdCBBbHBoYU51bSAmeDIsCisgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSAmeDMsIGNvbnN0IEFscGhhTnVtICZ4NCkgeworICBtZW1jcHkob3V0LCB4MS5kYXRhKCksIHgxLnNpemUoKSk7CisgIG91dCArPSB4MS5zaXplKCk7CisKKyAgbWVtY3B5KG91dCwgeDIuZGF0YSgpLCB4Mi5zaXplKCkpOworICBvdXQgKz0geDIuc2l6ZSgpOworCisgIG1lbWNweShvdXQsIHgzLmRhdGEoKSwgeDMuc2l6ZSgpKTsKKyAgb3V0ICs9IHgzLnNpemUoKTsKKworICBtZW1jcHkob3V0LCB4NC5kYXRhKCksIHg0LnNpemUoKSk7CisgIHJldHVybiBvdXQgKyB4NC5zaXplKCk7Cit9CisKK3N0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiKSB7CiAgIHN0cmluZyByZXN1bHQ7Ci0gIHJlc3VsdC5yZXNlcnZlKHN0cmxlbihpbnB1dCkgKyBzaXplIC0gMyk7Ci0gIHJlc3VsdC5hcHBlbmQoaW5wdXQsIHJhZGl4X3Bvcyk7Ci0gIHJlc3VsdC5hcHBlbmQodGVtcCArIDEsIHNpemUgLSAyKTsKLSAgcmVzdWx0LmFwcGVuZChyYWRpeF9wb3MgKyAxKTsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpKTsKKyAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQyKGJlZ2luLCBhLCBiKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LnNpemUoKSk7CiAgIHJldHVybiByZXN1bHQ7CiB9CiAKLWRvdWJsZSBOb0xvY2FsZVN0cnRvZChjb25zdCBjaGFyKiB0ZXh0LCBjaGFyKiogb3JpZ2luYWxfZW5kcHRyKSB7Ci0gIC8vIFdlIGNhbm5vdCBzaW1wbHkgc2V0IHRoZSBsb2NhbGUgdG8gIkMiIHRlbXBvcmFyaWx5IHdpdGggc2V0bG9jYWxlKCkKLSAgLy8gYXMgdGhpcyBpcyBub3QgdGhyZWFkLXNhZmUuICBJbnN0ZWFkLCB3ZSB0cnkgdG8gcGFyc2UgaW4gdGhlIGN1cnJlbnQKLSAgLy8gbG9jYWxlIGZpcnN0LiAgSWYgcGFyc2luZyBzdG9wcyBhdCBhICcuJyBjaGFyYWN0ZXIsIHRoZW4gdGhpcyBpcyBhCi0gIC8vIHByZXR0eSBnb29kIGhpbnQgdGhhdCB3ZSdyZSBhY3R1YWxseSBpbiBzb21lIG90aGVyIGxvY2FsZSBpbiB3aGljaAotICAvLyAnLicgaXMgbm90IHRoZSByYWRpeCBjaGFyYWN0ZXIuCitzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7CisgIGNoYXIgKm91dCA9IEFwcGVuZDIoYmVnaW4sIGEsIGIpOworICBvdXQgPSBBcHBlbmQxKG91dCwgYyk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQogCi0gIGNoYXIqIHRlbXBfZW5kcHRyOwotICBkb3VibGUgcmVzdWx0ID0gc3RydG9kKHRleHQsICZ0ZW1wX2VuZHB0cik7Ci0gIGlmIChvcmlnaW5hbF9lbmRwdHIgIT0gTlVMTCkgKm9yaWdpbmFsX2VuZHB0ciA9IHRlbXBfZW5kcHRyOwotICBpZiAoKnRlbXBfZW5kcHRyICE9ICcuJykgcmV0dXJuIHJlc3VsdDsKK3N0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLCBjb25zdCBBbHBoYU51bSAmYywKKyAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmQpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSk7CisgIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKKyAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiwgYSwgYiwgYywgZCk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQogCi0gIC8vIFBhcnNpbmcgaGFsdGVkIG9uIGEgJy4nLiAgUGVyaGFwcyB3ZSdyZSBpbiBhIGRpZmZlcmVudCBsb2NhbGU/ICBMZXQncwotICAvLyB0cnkgdG8gcmVwbGFjZSB0aGUgJy4nIHdpdGggYSBsb2NhbGUtc3BlY2lmaWMgcmFkaXggY2hhcmFjdGVyIGFuZAotICAvLyB0cnkgYWdhaW4uCi0gIHN0cmluZyBsb2NhbGl6ZWQgPSBMb2NhbGl6ZVJhZGl4KHRleHQsIHRlbXBfZW5kcHRyKTsKLSAgY29uc3QgY2hhciogbG9jYWxpemVkX2NzdHIgPSBsb2NhbGl6ZWQuY19zdHIoKTsKLSAgY2hhciogbG9jYWxpemVkX2VuZHB0cjsKLSAgcmVzdWx0ID0gc3RydG9kKGxvY2FsaXplZF9jc3RyLCAmbG9jYWxpemVkX2VuZHB0cik7Ci0gIGlmICgobG9jYWxpemVkX2VuZHB0ciAtIGxvY2FsaXplZF9jc3RyKSA+Ci0gICAgICAodGVtcF9lbmRwdHIgLSB0ZXh0KSkgewotICAgIC8vIFRoaXMgYXR0ZW1wdCBnb3QgZnVydGhlciwgc28gcmVwbGFjaW5nIHRoZSBkZWNpbWFsIG11c3QgaGF2ZSBoZWxwZWQuCi0gICAgLy8gVXBkYXRlIG9yaWdpbmFsX2VuZHB0ciB0byBwb2ludCBhdCB0aGUgcmlnaHQgbG9jYXRpb24uCi0gICAgaWYgKG9yaWdpbmFsX2VuZHB0ciAhPSBOVUxMKSB7Ci0gICAgICAvLyBzaXplX2RpZmYgaXMgbm9uLXplcm8gaWYgdGhlIGxvY2FsaXplZCByYWRpeCBoYXMgbXVsdGlwbGUgYnl0ZXMuCi0gICAgICBpbnQgc2l6ZV9kaWZmID0gbG9jYWxpemVkLnNpemUoKSAtIHN0cmxlbih0ZXh0KTsKLSAgICAgIC8vIGNvbnN0X2Nhc3QgaXMgbmVjZXNzYXJ5IHRvIG1hdGNoIHRoZSBzdHJ0b2QoKSBpbnRlcmZhY2UuCi0gICAgICAqb3JpZ2luYWxfZW5kcHRyID0gY29uc3RfY2FzdDxjaGFyKj4oCi0gICAgICAgIHRleHQgKyAobG9jYWxpemVkX2VuZHB0ciAtIGxvY2FsaXplZF9jc3RyIC0gc2l6ZV9kaWZmKSk7CitzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMsCisgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkLCBjb25zdCBBbHBoYU51bSAmZSkgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpICsgZS5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LmJlZ2luKCk7CisgIGNoYXIgKm91dCA9IEFwcGVuZDQoYmVnaW4sIGEsIGIsIGMsIGQpOworICBvdXQgPSBBcHBlbmQxKG91dCwgZSk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMsCisgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkLCBjb25zdCBBbHBoYU51bSAmZSwgY29uc3QgQWxwaGFOdW0gJmYpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSArIGUuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBmLnNpemUoKSk7CisgIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKKyAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiwgYSwgYiwgYywgZCk7CisgIG91dCA9IEFwcGVuZDIob3V0LCBlLCBmKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LnNpemUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLCBjb25zdCBBbHBoYU51bSAmYywKKyAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmQsIGNvbnN0IEFscGhhTnVtICZlLCBjb25zdCBBbHBoYU51bSAmZiwKKyAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmcpIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgcmVzdWx0LnJlc2l6ZShhLnNpemUoKSArIGIuc2l6ZSgpICsgYy5zaXplKCkgKyBkLnNpemUoKSArIGUuc2l6ZSgpICsKKyAgICAgICAgICAgICAgICBmLnNpemUoKSArIGcuc2l6ZSgpKTsKKyAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQ0KGJlZ2luLCBhLCBiLCBjLCBkKTsKKyAgb3V0ID0gQXBwZW5kMihvdXQsIGUsIGYpOworICBvdXQgPSBBcHBlbmQxKG91dCwgZyk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCitzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwgY29uc3QgQWxwaGFOdW0gJmMsCisgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZkLCBjb25zdCBBbHBoYU51bSAmZSwgY29uc3QgQWxwaGFOdW0gJmYsCisgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZnLCBjb25zdCBBbHBoYU51bSAmaCkgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpICsgZS5zaXplKCkgKworICAgICAgICAgICAgICAgIGYuc2l6ZSgpICsgZy5zaXplKCkgKyBoLnNpemUoKSk7CisgIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQuYmVnaW4oKTsKKyAgY2hhciAqb3V0ID0gQXBwZW5kNChiZWdpbiwgYSwgYiwgYywgZCk7CisgIG91dCA9IEFwcGVuZDQob3V0LCBlLCBmLCBnLCBoKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LnNpemUoKSk7CisgIHJldHVybiByZXN1bHQ7Cit9CisKK3N0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLCBjb25zdCBBbHBoYU51bSAmYywKKyAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmQsIGNvbnN0IEFscGhhTnVtICZlLCBjb25zdCBBbHBoYU51bSAmZiwKKyAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmcsIGNvbnN0IEFscGhhTnVtICZoLCBjb25zdCBBbHBoYU51bSAmaSkgeworICBzdHJpbmcgcmVzdWx0OworICByZXN1bHQucmVzaXplKGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSArIGQuc2l6ZSgpICsgZS5zaXplKCkgKworICAgICAgICAgICAgICAgIGYuc2l6ZSgpICsgZy5zaXplKCkgKyBoLnNpemUoKSArIGkuc2l6ZSgpKTsKKyAgY2hhciAqY29uc3QgYmVnaW4gPSAmKnJlc3VsdC5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQ0KGJlZ2luLCBhLCBiLCBjLCBkKTsKKyAgb3V0ID0gQXBwZW5kNChvdXQsIGUsIGYsIGcsIGgpOworICBvdXQgPSBBcHBlbmQxKG91dCwgaSk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEob3V0LCBiZWdpbiArIHJlc3VsdC5zaXplKCkpOworICByZXR1cm4gcmVzdWx0OworfQorCisvLyBJdCdzIHBvc3NpYmxlIHRvIGNhbGwgU3RyQXBwZW5kIHdpdGggYSBjaGFyICogcG9pbnRlciB0aGF0IGlzIHBhcnR3YXkgaW50bworLy8gdGhlIHN0cmluZyB3ZSdyZSBhcHBlbmRpbmcgdG8uICBIb3dldmVyIHRoZSByZXN1bHRzIG9mIHRoaXMgYXJlIHJhbmRvbS4KKy8vIFRoZXJlZm9yZSwgY2hlY2sgZm9yIHRoaXMgaW4gZGVidWcgbW9kZS4gIFVzZSB1bnNpZ25lZCBtYXRoIHNvIHdlIG9ubHkgaGF2ZQorLy8gdG8gZG8gb25lIGNvbXBhcmlzb24uCisjZGVmaW5lIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUChkZXN0LCBzcmMpIFwKKyAgICBHT09HTEVfRENIRUNLX0dUKHVpbnRwdHJfdCgoc3JjKS5kYXRhKCkgLSAoZGVzdCkuZGF0YSgpKSwgXAorICAgICAgICAgICAgICAgICAgICAgdWludHB0cl90KChkZXN0KS5zaXplKCkpKQorCit2b2lkIFN0ckFwcGVuZChzdHJpbmcgKnJlc3VsdCwgY29uc3QgQWxwaGFOdW0gJmEpIHsKKyAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGEpOworICByZXN1bHQtPmFwcGVuZChhLmRhdGEoKSwgYS5zaXplKCkpOworfQorCit2b2lkIFN0ckFwcGVuZChzdHJpbmcgKnJlc3VsdCwgY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiKSB7CisgIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBhKTsKKyAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGIpOworICBzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHJlc3VsdC0+c2l6ZSgpOworICByZXN1bHQtPnJlc2l6ZShvbGRfc2l6ZSArIGEuc2l6ZSgpICsgYi5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LT5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQyKGJlZ2luICsgb2xkX3NpemUsIGEsIGIpOworICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQtPnNpemUoKSk7Cit9CisKK3ZvaWQgU3RyQXBwZW5kKHN0cmluZyAqcmVzdWx0LAorICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0gJmEsIGNvbnN0IEFscGhhTnVtICZiLCBjb25zdCBBbHBoYU51bSAmYykgeworICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYSk7CisgIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBiKTsKKyAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGMpOworICBzdHJpbmc6OnNpemVfdHlwZSBvbGRfc2l6ZSA9IHJlc3VsdC0+c2l6ZSgpOworICByZXN1bHQtPnJlc2l6ZShvbGRfc2l6ZSArIGEuc2l6ZSgpICsgYi5zaXplKCkgKyBjLnNpemUoKSk7CisgIGNoYXIgKmNvbnN0IGJlZ2luID0gJipyZXN1bHQtPmJlZ2luKCk7CisgIGNoYXIgKm91dCA9IEFwcGVuZDIoYmVnaW4gKyBvbGRfc2l6ZSwgYSwgYik7CisgIG91dCA9IEFwcGVuZDEob3V0LCBjKTsKKyAgR09PR0xFX0RDSEVDS19FUShvdXQsIGJlZ2luICsgcmVzdWx0LT5zaXplKCkpOworfQorCit2b2lkIFN0ckFwcGVuZChzdHJpbmcgKnJlc3VsdCwKKyAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZhLCBjb25zdCBBbHBoYU51bSAmYiwKKyAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtICZjLCBjb25zdCBBbHBoYU51bSAmZCkgeworICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgYSk7CisgIEdPT0dMRV9EQ0hFQ0tfTk9fT1ZFUkxBUCgqcmVzdWx0LCBiKTsKKyAgR09PR0xFX0RDSEVDS19OT19PVkVSTEFQKCpyZXN1bHQsIGMpOworICBHT09HTEVfRENIRUNLX05PX09WRVJMQVAoKnJlc3VsdCwgZCk7CisgIHN0cmluZzo6c2l6ZV90eXBlIG9sZF9zaXplID0gcmVzdWx0LT5zaXplKCk7CisgIHJlc3VsdC0+cmVzaXplKG9sZF9zaXplICsgYS5zaXplKCkgKyBiLnNpemUoKSArIGMuc2l6ZSgpICsgZC5zaXplKCkpOworICBjaGFyICpjb25zdCBiZWdpbiA9ICYqcmVzdWx0LT5iZWdpbigpOworICBjaGFyICpvdXQgPSBBcHBlbmQ0KGJlZ2luICsgb2xkX3NpemUsIGEsIGIsIGMsIGQpOworICBHT09HTEVfRENIRUNLX0VRKG91dCwgYmVnaW4gKyByZXN1bHQtPnNpemUoKSk7Cit9CisKK2ludCBHbG9iYWxSZXBsYWNlU3Vic3RyaW5nKGNvbnN0IHN0cmluZyYgc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiByZXBsYWNlbWVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogcykgeworICBHT09HTEVfQ0hFQ0socyAhPSBOVUxMKTsKKyAgaWYgKHMtPmVtcHR5KCkgfHwgc3Vic3RyaW5nLmVtcHR5KCkpCisgICAgcmV0dXJuIDA7CisgIHN0cmluZyB0bXA7CisgIGludCBudW1fcmVwbGFjZW1lbnRzID0gMDsKKyAgaW50IHBvcyA9IDA7CisgIGZvciAoaW50IG1hdGNoX3BvcyA9IHMtPmZpbmQoc3Vic3RyaW5nLmRhdGEoKSwgcG9zLCBzdWJzdHJpbmcubGVuZ3RoKCkpOworICAgICAgIG1hdGNoX3BvcyAhPSBzdHJpbmc6Om5wb3M7CisgICAgICAgcG9zID0gbWF0Y2hfcG9zICsgc3Vic3RyaW5nLmxlbmd0aCgpLAorICAgICAgICAgICBtYXRjaF9wb3MgPSBzLT5maW5kKHN1YnN0cmluZy5kYXRhKCksIHBvcywgc3Vic3RyaW5nLmxlbmd0aCgpKSkgeworICAgICsrbnVtX3JlcGxhY2VtZW50czsKKyAgICAvLyBBcHBlbmQgdGhlIG9yaWdpbmFsIGNvbnRlbnQgYmVmb3JlIHRoZSBtYXRjaC4KKyAgICB0bXAuYXBwZW5kKCpzLCBwb3MsIG1hdGNoX3BvcyAtIHBvcyk7CisgICAgLy8gQXBwZW5kIHRoZSByZXBsYWNlbWVudCBmb3IgdGhlIG1hdGNoLgorICAgIHRtcC5hcHBlbmQocmVwbGFjZW1lbnQuYmVnaW4oKSwgcmVwbGFjZW1lbnQuZW5kKCkpOworICB9CisgIC8vIEFwcGVuZCB0aGUgY29udGVudCBhZnRlciB0aGUgbGFzdCBtYXRjaC4gSWYgbm8gcmVwbGFjZW1lbnRzIHdlcmUgbWFkZSwgdGhlCisgIC8vIG9yaWdpbmFsIHN0cmluZyBpcyBsZWZ0IHVudG91Y2hlZC4KKyAgaWYgKG51bV9yZXBsYWNlbWVudHMgPiAwKSB7CisgICAgdG1wLmFwcGVuZCgqcywgcG9zLCBzLT5sZW5ndGgoKSAtIHBvcyk7CisgICAgcy0+c3dhcCh0bXApOworICB9CisgIHJldHVybiBudW1fcmVwbGFjZW1lbnRzOworfQorCitpbnQgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihpbnQgaW5wdXRfbGVuLCBib29sIGRvX3BhZGRpbmcpIHsKKyAgLy8gQmFzZTY0IGVuY29kZXMgdGhyZWUgYnl0ZXMgb2YgaW5wdXQgYXQgYSB0aW1lLiBJZiB0aGUgaW5wdXQgaXMgbm90CisgIC8vIGRpdmlzaWJsZSBieSB0aHJlZSwgd2UgcGFkIGFzIGFwcHJvcHJpYXRlLgorICAvLworICAvLyAoZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4KQorICAvLyBTcGVjaWFsIHByb2Nlc3NpbmcgaXMgcGVyZm9ybWVkIGlmIGZld2VyIHRoYW4gMjQgYml0cyBhcmUgYXZhaWxhYmxlCisgIC8vIGF0IHRoZSBlbmQgb2YgdGhlIGRhdGEgYmVpbmcgZW5jb2RlZC4gIEEgZnVsbCBlbmNvZGluZyBxdWFudHVtIGlzCisgIC8vIGFsd2F5cyBjb21wbGV0ZWQgYXQgdGhlIGVuZCBvZiBhIHF1YW50aXR5LiAgV2hlbiBmZXdlciB0aGFuIDI0IGlucHV0CisgIC8vIGJpdHMgYXJlIGF2YWlsYWJsZSBpbiBhbiBpbnB1dCBncm91cCwgemVybyBiaXRzIGFyZSBhZGRlZCAob24gdGhlCisgIC8vIHJpZ2h0KSB0byBmb3JtIGFuIGludGVncmFsIG51bWJlciBvZiA2LWJpdCBncm91cHMuICBQYWRkaW5nIGF0IHRoZQorICAvLyBlbmQgb2YgdGhlIGRhdGEgaXMgcGVyZm9ybWVkIHVzaW5nIHRoZSAnPScgY2hhcmFjdGVyLiAgU2luY2UgYWxsIGJhc2UKKyAgLy8gNjQgaW5wdXQgaXMgYW4gaW50ZWdyYWwgbnVtYmVyIG9mIG9jdGV0cywgb25seSB0aGUgZm9sbG93aW5nIGNhc2VzCisgIC8vIGNhbiBhcmlzZToKKworCisgIC8vIEJhc2U2NCBlbmNvZGVzIGVhY2ggdGhyZWUgYnl0ZXMgb2YgaW5wdXQgaW50byBmb3VyIGJ5dGVzIG9mIG91dHB1dC4KKyAgaW50IGxlbiA9IChpbnB1dF9sZW4gLyAzKSAqIDQ7CisKKyAgaWYgKGlucHV0X2xlbiAlIDMgPT0gMCkgeworICAgIC8vIChmcm9tIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1NDgpCisgICAgLy8gKDEpIHRoZSBmaW5hbCBxdWFudHVtIG9mIGVuY29kaW5nIGlucHV0IGlzIGFuIGludGVncmFsIG11bHRpcGxlIG9mIDI0CisgICAgLy8gYml0czsgaGVyZSwgdGhlIGZpbmFsIHVuaXQgb2YgZW5jb2RlZCBvdXRwdXQgd2lsbCBiZSBhbiBpbnRlZ3JhbAorICAgIC8vIG11bHRpcGxlIG9mIDQgY2hhcmFjdGVycyB3aXRoIG5vICI9IiBwYWRkaW5nLAorICB9IGVsc2UgaWYgKGlucHV0X2xlbiAlIDMgPT0gMSkgeworICAgIC8vIChmcm9tIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzM1NDgpCisgICAgLy8gKDIpIHRoZSBmaW5hbCBxdWFudHVtIG9mIGVuY29kaW5nIGlucHV0IGlzIGV4YWN0bHkgOCBiaXRzOyBoZXJlLCB0aGUKKyAgICAvLyBmaW5hbCB1bml0IG9mIGVuY29kZWQgb3V0cHV0IHdpbGwgYmUgdHdvIGNoYXJhY3RlcnMgZm9sbG93ZWQgYnkgdHdvCisgICAgLy8gIj0iIHBhZGRpbmcgY2hhcmFjdGVycywgb3IKKyAgICBsZW4gKz0gMjsKKyAgICBpZiAoZG9fcGFkZGluZykgeworICAgICAgbGVuICs9IDI7CisgICAgfQorICB9IGVsc2UgeyAgLy8gKGlucHV0X2xlbiAlIDMgPT0gMikKKyAgICAvLyAoZnJvbSBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4KQorICAgIC8vICgzKSB0aGUgZmluYWwgcXVhbnR1bSBvZiBlbmNvZGluZyBpbnB1dCBpcyBleGFjdGx5IDE2IGJpdHM7IGhlcmUsIHRoZQorICAgIC8vIGZpbmFsIHVuaXQgb2YgZW5jb2RlZCBvdXRwdXQgd2lsbCBiZSB0aHJlZSBjaGFyYWN0ZXJzIGZvbGxvd2VkIGJ5IG9uZQorICAgIC8vICI9IiBwYWRkaW5nIGNoYXJhY3Rlci4KKyAgICBsZW4gKz0gMzsKKyAgICBpZiAoZG9fcGFkZGluZykgeworICAgICAgbGVuICs9IDE7CiAgICAgfQogICB9CiAKLSAgcmV0dXJuIHJlc3VsdDsKKyAgYXNzZXJ0KGxlbiA+PSBpbnB1dF9sZW4pOyAgLy8gbWFrZSBzdXJlIHdlIGRpZG4ndCBvdmVyZmxvdworICByZXR1cm4gbGVuOworfQorCisvLyBCYXNlNjRFc2NhcGUgZG9lcyBwYWRkaW5nLCBzbyB0aGlzIGNhbGN1bGF0aW9uIGluY2x1ZGVzIHBhZGRpbmcuCitpbnQgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihpbnQgaW5wdXRfbGVuKSB7CisgIHJldHVybiBDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKGlucHV0X2xlbiwgdHJ1ZSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGludCBCYXNlNjRVbmVzY2FwZSgpIC0gYmFzZTY0IGRlY29kZXIKKy8vIGludCBCYXNlNjRFc2NhcGUoKSAtIGJhc2U2NCBlbmNvZGVyCisvLyBpbnQgV2ViU2FmZUJhc2U2NFVuZXNjYXBlKCkgLSBHb29nbGUncyB2YXJpYXRpb24gb2YgYmFzZTY0IGRlY29kZXIKKy8vIGludCBXZWJTYWZlQmFzZTY0RXNjYXBlKCkgLSBHb29nbGUncyB2YXJpYXRpb24gb2YgYmFzZTY0IGVuY29kZXIKKy8vCisvLyBDaGVjayBvdXQKKy8vIGh0dHA6Ly90b29scy5pZXRmLm9yZy9odG1sL3JmYzIwNDUgZm9yIGZvcm1hbCBkZXNjcmlwdGlvbiwgYnV0IHdoYXQgd2UKKy8vIGNhcmUgYWJvdXQgaXMgdGhhdC4uLgorLy8gICBUYWtlIHRoZSBlbmNvZGVkIHN0dWZmIGluIGdyb3VwcyBvZiA0IGNoYXJhY3RlcnMgYW5kIHR1cm4gZWFjaAorLy8gICBjaGFyYWN0ZXIgaW50byBhIGNvZGUgMCB0byA2MyB0aHVzOgorLy8gICAgICAgICAgIEEtWiBtYXAgdG8gMCB0byAyNQorLy8gICAgICAgICAgIGEteiBtYXAgdG8gMjYgdG8gNTEKKy8vICAgICAgICAgICAwLTkgbWFwIHRvIDUyIHRvIDYxCisvLyAgICAgICAgICAgKygtIGZvciBXZWJTYWZlKSBtYXBzIHRvIDYyCisvLyAgICAgICAgICAgLyhfIGZvciBXZWJTYWZlKSBtYXBzIHRvIDYzCisvLyAgIFRoZXJlIHdpbGwgYmUgZm91ciBudW1iZXJzLCBhbGwgbGVzcyB0aGFuIDY0IHdoaWNoIGNhbiBiZSByZXByZXNlbnRlZAorLy8gICBieSBhIDYgZGlnaXQgYmluYXJ5IG51bWJlciAoYWFhYWFhLCBiYmJiYmIsIGNjY2NjYywgZGRkZGRkIHJlc3BlY3RpdmVseSkuCisvLyAgIEFycmFuZ2UgdGhlIDYgZGlnaXQgYmluYXJ5IG51bWJlcnMgaW50byB0aHJlZSBieXRlcyBhcyBzdWNoOgorLy8gICBhYWFhYWFiYiBiYmJiY2NjYyBjY2RkZGRkZAorLy8gICBFcXVhbHMgc2lnbnMgKG9uZSBvciB0d28pIGFyZSB1c2VkIGF0IHRoZSBlbmQgb2YgdGhlIGVuY29kZWQgYmxvY2sgdG8KKy8vICAgaW5kaWNhdGUgdGhhdCB0aGUgdGV4dCB3YXMgbm90IGFuIGludGVnZXIgbXVsdGlwbGUgb2YgdGhyZWUgYnl0ZXMgbG9uZy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworaW50IEJhc2U2NFVuZXNjYXBlSW50ZXJuYWwoY29uc3QgY2hhciAqc3JjX3BhcmFtLCBpbnQgc3pzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkZXN0LCBpbnQgc3pkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2lnbmVkIGNoYXIqIHVuYmFzZTY0KSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtQYWQ2NEVxdWFscyA9ICc9JzsKKyAgc3RhdGljIGNvbnN0IGNoYXIga1BhZDY0RG90ID0gJy4nOworCisgIGludCBkZWNvZGUgPSAwOworICBpbnQgZGVzdGlkeCA9IDA7CisgIGludCBzdGF0ZSA9IDA7CisgIHVuc2lnbmVkIGludCBjaCA9IDA7CisgIHVuc2lnbmVkIGludCB0ZW1wID0gMDsKKworICAvLyBJZiAiY2hhciIgaXMgc2lnbmVkIGJ5IGRlZmF1bHQsIHVzaW5nICpzcmMgYXMgYW4gYXJyYXkgaW5kZXggcmVzdWx0cyBpbgorICAvLyBhY2Nlc3NpbmcgbmVnYXRpdmUgYXJyYXkgZWxlbWVudHMuIFRyZWF0IHRoZSBpbnB1dCBhcyBhIHBvaW50ZXIgdG8KKyAgLy8gdW5zaWduZWQgY2hhciB0byBhdm9pZCB0aGlzLgorICBjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMgPSByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzcmNfcGFyYW0pOworCisgIC8vIFRoZSBHRVRfSU5QVVQgbWFjcm8gZ2V0cyB0aGUgbmV4dCBpbnB1dCBjaGFyYWN0ZXIsIHNraXBwaW5nCisgIC8vIG92ZXIgYW55IHdoaXRlc3BhY2UsIGFuZCBzdG9wcGluZyB3aGVuIHdlIHJlYWNoIHRoZSBlbmQgb2YgdGhlCisgIC8vIHN0cmluZyBvciB3aGVuIHdlIHJlYWQgYW55IG5vbi1kYXRhIGNoYXJhY3Rlci4gIFRoZSBhcmd1bWVudHMgYXJlCisgIC8vIGFuIGFyYml0cmFyeSBpZGVudGlmaWVyICh1c2VkIGFzIGEgbGFiZWwgZm9yIGdvdG8pIGFuZCB0aGUgbnVtYmVyCisgIC8vIG9mIGRhdGEgYnl0ZXMgdGhhdCBtdXN0IHJlbWFpbiBpbiB0aGUgaW5wdXQgdG8gYXZvaWQgYWJvcnRpbmcgdGhlCisgIC8vIGxvb3AuCisjZGVmaW5lIEdFVF9JTlBVVChsYWJlbCwgcmVtYWluKSAgICAgICAgICAgICAgICAgXAorICBsYWJlbDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAtLXN6c3JjOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgY2ggPSAqc3JjKys7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGRlY29kZSA9IHVuYmFzZTY0W2NoXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZGVjb2RlIDwgMCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBpZiAoYXNjaWlfaXNzcGFjZShjaCkgJiYgc3pzcmMgPj0gcmVtYWluKSAgXAorICAgICAgICBnb3RvIGxhYmVsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHN0YXRlID0gNCAtIHJlbWFpbjsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBicmVhazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAvLyBpZiBkZXN0IGlzIG51bGwsIHdlJ3JlIGp1c3QgY2hlY2tpbmcgdG8gc2VlIGlmIGl0J3MgbGVnYWwgaW5wdXQKKyAgLy8gcmF0aGVyIHRoYW4gcHJvZHVjaW5nIG91dHB1dC4gIChJIHN1c3BlY3QgdGhpcyBjb3VsZCBqdXN0IGJlIGRvbmUKKyAgLy8gd2l0aCBhIHJlZ2V4cC4uLikuICBXZSBkdXBsaWNhdGUgdGhlIGxvb3Agc28gdGhpcyB0ZXN0IGNhbiBiZQorICAvLyBvdXRzaWRlIGl0IGluc3RlYWQgb2YgaW4gZXZlcnkgaXRlcmF0aW9uLgorCisgIGlmIChkZXN0KSB7CisgICAgLy8gVGhpcyBsb29wIGNvbnN1bWVzIDQgaW5wdXQgYnl0ZXMgYW5kIHByb2R1Y2VzIDMgb3V0cHV0IGJ5dGVzCisgICAgLy8gcGVyIGl0ZXJhdGlvbi4gIFdlIGNhbid0IGtub3cgYXQgdGhlIHN0YXJ0IHRoYXQgdGhlcmUgaXMgZW5vdWdoCisgICAgLy8gZGF0YSBsZWZ0IGluIHRoZSBzdHJpbmcgZm9yIGEgZnVsbCBpdGVyYXRpb24sIHNvIHRoZSBsb29wIG1heQorICAgIC8vIGJyZWFrIG91dCBpbiB0aGUgbWlkZGxlOyBpZiBzbyAnc3RhdGUnIHdpbGwgYmUgc2V0IHRvIHRoZQorICAgIC8vIG51bWJlciBvZiBpbnB1dCBieXRlcyByZWFkLgorCisgICAgd2hpbGUgKHN6c3JjID49IDQpICB7CisgICAgICAvLyBXZSdsbCBzdGFydCBieSBvcHRpbWlzdGljYWxseSBhc3N1bWluZyB0aGF0IHRoZSBuZXh0IGZvdXIKKyAgICAgIC8vIGJ5dGVzIG9mIHRoZSBzdHJpbmcgKHNyY1swLi4zXSkgYXJlIGZvdXIgZ29vZCBkYXRhIGJ5dGVzCisgICAgICAvLyAodGhhdCBpcywgbm8gbnVsbHMsIHdoaXRlc3BhY2UsIHBhZGRpbmcgY2hhcnMsIG9yIGlsbGVnYWwKKyAgICAgIC8vIGNoYXJzKS4gIFdlIG5lZWQgdG8gdGVzdCBzcmNbMC4uMl0gZm9yIG51bGxzIGluZGl2aWR1YWxseQorICAgICAgLy8gYmVmb3JlIGNvbnN0cnVjdGluZyB0ZW1wIHRvIHByZXNlcnZlIHRoZSBwcm9wZXJ0eSB0aGF0IHdlCisgICAgICAvLyBuZXZlciByZWFkIHBhc3QgYSBudWxsIGluIHRoZSBzdHJpbmcgKG5vIG1hdHRlciBob3cgbG9uZworICAgICAgLy8gc3pzcmMgY2xhaW1zIHRoZSBzdHJpbmcgaXMpLgorCisgICAgICBpZiAoIXNyY1swXSB8fCAhc3JjWzFdIHx8ICFzcmNbMl0gfHwKKyAgICAgICAgICAodGVtcCA9ICgodW5zaWduZWQodW5iYXNlNjRbc3JjWzBdXSkgPDwgMTgpIHwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzFdXSkgPDwgMTIpIHwKKyAgICAgICAgICAgICAgICAgICAodW5zaWduZWQodW5iYXNlNjRbc3JjWzJdXSkgPDwgNikgfAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCh1bmJhc2U2NFtzcmNbM11dKSkpKSAmIDB4ODAwMDAwMDApIHsKKyAgICAgICAgLy8gSWZmIGFueSBvZiB0aG9zZSBmb3VyIGNoYXJhY3RlcnMgd2FzIGJhZCAobnVsbCwgaWxsZWdhbCwKKyAgICAgICAgLy8gd2hpdGVzcGFjZSwgcGFkZGluZyksIHRoZW4gdGVtcCdzIGhpZ2ggYml0IHdpbGwgYmUgc2V0CisgICAgICAgIC8vIChiZWNhdXNlIHVuYmFzZTY0W10gaXMgLTEgZm9yIGFsbCBiYWQgY2hhcmFjdGVycykuCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlJ2xsIGJhY2sgdXAgYW5kIHJlc29ydCB0byB0aGUgc2xvd2VyIGRlY29kZXIsIHdoaWNoIGtub3dzCisgICAgICAgIC8vIGhvdyB0byBoYW5kbGUgdGhvc2UgY2FzZXMuCisKKyAgICAgICAgR0VUX0lOUFVUKGZpcnN0LCA0KTsKKyAgICAgICAgdGVtcCA9IGRlY29kZTsKKyAgICAgICAgR0VUX0lOUFVUKHNlY29uZCwgMyk7CisgICAgICAgIHRlbXAgPSAodGVtcCA8PCA2KSB8IGRlY29kZTsKKyAgICAgICAgR0VUX0lOUFVUKHRoaXJkLCAyKTsKKyAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDYpIHwgZGVjb2RlOworICAgICAgICBHRVRfSU5QVVQoZm91cnRoLCAxKTsKKyAgICAgICAgdGVtcCA9ICh0ZW1wIDw8IDYpIHwgZGVjb2RlOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2UgcmVhbGx5IGRpZCBoYXZlIGZvdXIgZ29vZCBkYXRhIGJ5dGVzLCBzbyBhZHZhbmNlIGZvdXIKKyAgICAgICAgLy8gY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLgorCisgICAgICAgIHN6c3JjIC09IDQ7CisgICAgICAgIHNyYyArPSA0OworICAgICAgICBkZWNvZGUgPSAtMTsKKyAgICAgICAgY2ggPSAnXDAnOworICAgICAgfQorCisgICAgICAvLyB0ZW1wIGhhcyAyNCBiaXRzIG9mIGlucHV0LCBzbyB3cml0ZSB0aGF0IG91dCBhcyB0aHJlZSBieXRlcy4KKworICAgICAgaWYgKGRlc3RpZHgrMyA+IHN6ZGVzdCkgcmV0dXJuIC0xOworICAgICAgZGVzdFtkZXN0aWR4KzJdID0gdGVtcDsKKyAgICAgIHRlbXAgPj49IDg7CisgICAgICBkZXN0W2Rlc3RpZHgrMV0gPSB0ZW1wOworICAgICAgdGVtcCA+Pj0gODsKKyAgICAgIGRlc3RbZGVzdGlkeF0gPSB0ZW1wOworICAgICAgZGVzdGlkeCArPSAzOworICAgIH0KKyAgfSBlbHNlIHsKKyAgICB3aGlsZSAoc3pzcmMgPj0gNCkgIHsKKyAgICAgIGlmICghc3JjWzBdIHx8ICFzcmNbMV0gfHwgIXNyY1syXSB8fAorICAgICAgICAgICh0ZW1wID0gKCh1bnNpZ25lZCh1bmJhc2U2NFtzcmNbMF1dKSA8PCAxOCkgfAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCh1bmJhc2U2NFtzcmNbMV1dKSA8PCAxMikgfAorICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCh1bmJhc2U2NFtzcmNbMl1dKSA8PCA2KSB8CisgICAgICAgICAgICAgICAgICAgKHVuc2lnbmVkKHVuYmFzZTY0W3NyY1szXV0pKSkpICYgMHg4MDAwMDAwMCkgeworICAgICAgICBHRVRfSU5QVVQoZmlyc3Rfbm9fZGVzdCwgNCk7CisgICAgICAgIEdFVF9JTlBVVChzZWNvbmRfbm9fZGVzdCwgMyk7CisgICAgICAgIEdFVF9JTlBVVCh0aGlyZF9ub19kZXN0LCAyKTsKKyAgICAgICAgR0VUX0lOUFVUKGZvdXJ0aF9ub19kZXN0LCAxKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHN6c3JjIC09IDQ7CisgICAgICAgIHNyYyArPSA0OworICAgICAgICBkZWNvZGUgPSAtMTsKKyAgICAgICAgY2ggPSAnXDAnOworICAgICAgfQorICAgICAgZGVzdGlkeCArPSAzOworICAgIH0KKyAgfQorCisjdW5kZWYgR0VUX0lOUFVUCisKKyAgLy8gaWYgdGhlIGxvb3AgdGVybWluYXRlZCBiZWNhdXNlIHdlIHJlYWQgYSBiYWQgY2hhcmFjdGVyLCByZXR1cm4KKyAgLy8gbm93LgorICBpZiAoZGVjb2RlIDwgMCAmJiBjaCAhPSAnXDAnICYmCisgICAgICBjaCAhPSBrUGFkNjRFcXVhbHMgJiYgY2ggIT0ga1BhZDY0RG90ICYmICFhc2NpaV9pc3NwYWNlKGNoKSkKKyAgICByZXR1cm4gLTE7CisKKyAgaWYgKGNoID09IGtQYWQ2NEVxdWFscyB8fCBjaCA9PSBrUGFkNjREb3QpIHsKKyAgICAvLyBpZiB3ZSBzdG9wcGVkIGJ5IGhpdHRpbmcgYW4gJz0nIG9yICcuJywgdW4tcmVhZCB0aGF0IGNoYXJhY3RlciAtLSB3ZSdsbAorICAgIC8vIGxvb2sgYXQgaXQgYWdhaW4gd2hlbiB3ZSBjb3VudCB0byBjaGVjayBmb3IgdGhlIHByb3BlciBudW1iZXIgb2YKKyAgICAvLyBlcXVhbHMgc2lnbnMgYXQgdGhlIGVuZC4KKyAgICArK3N6c3JjOworICAgIC0tc3JjOworICB9IGVsc2UgeworICAgIC8vIFRoaXMgbG9vcCBjb25zdW1lcyAxIGlucHV0IGJ5dGUgcGVyIGl0ZXJhdGlvbi4gIEl0J3MgdXNlZCB0bworICAgIC8vIGNsZWFuIHVwIHRoZSAwLTMgaW5wdXQgYnl0ZXMgcmVtYWluaW5nIHdoZW4gdGhlIGZpcnN0LCBmYXN0ZXIKKyAgICAvLyBsb29wIGZpbmlzaGVzLiAgJ3RlbXAnIGNvbnRhaW5zIHRoZSBkYXRhIGZyb20gJ3N0YXRlJyBpbnB1dAorICAgIC8vIGNoYXJhY3RlcnMgcmVhZCBieSB0aGUgZmlyc3QgbG9vcC4KKyAgICB3aGlsZSAoc3pzcmMgPiAwKSAgeworICAgICAgLS1zenNyYzsKKyAgICAgIGNoID0gKnNyYysrOworICAgICAgZGVjb2RlID0gdW5iYXNlNjRbY2hdOworICAgICAgaWYgKGRlY29kZSA8IDApIHsKKyAgICAgICAgaWYgKGFzY2lpX2lzc3BhY2UoY2gpKSB7CisgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0gZWxzZSBpZiAoY2ggPT0gJ1wwJykgeworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgaWYgKGNoID09IGtQYWQ2NEVxdWFscyB8fCBjaCA9PSBrUGFkNjREb3QpIHsKKyAgICAgICAgICAvLyBiYWNrIHVwIG9uZSBjaGFyYWN0ZXI7IHdlJ2xsIHJlYWQgaXQgYWdhaW4gd2hlbiB3ZSBjaGVjaworICAgICAgICAgIC8vIGZvciB0aGUgY29ycmVjdCBudW1iZXIgb2YgcGFkIGNoYXJhY3RlcnMgYXQgdGhlIGVuZC4KKyAgICAgICAgICArK3N6c3JjOworICAgICAgICAgIC0tc3JjOworICAgICAgICAgIGJyZWFrOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgfQorCisgICAgICAvLyBFYWNoIGlucHV0IGNoYXJhY3RlciBnaXZlcyB1cyBzaXggYml0cyBvZiBvdXRwdXQuCisgICAgICB0ZW1wID0gKHRlbXAgPDwgNikgfCBkZWNvZGU7CisgICAgICArK3N0YXRlOworICAgICAgaWYgKHN0YXRlID09IDQpIHsKKyAgICAgICAgLy8gSWYgd2UndmUgYWNjdW11bGF0ZWQgMjQgYml0cyBvZiBvdXRwdXQsIHdyaXRlIHRoYXQgb3V0IGFzCisgICAgICAgIC8vIHRocmVlIGJ5dGVzLgorICAgICAgICBpZiAoZGVzdCkgeworICAgICAgICAgIGlmIChkZXN0aWR4KzMgPiBzemRlc3QpIHJldHVybiAtMTsKKyAgICAgICAgICBkZXN0W2Rlc3RpZHgrMl0gPSB0ZW1wOworICAgICAgICAgIHRlbXAgPj49IDg7CisgICAgICAgICAgZGVzdFtkZXN0aWR4KzFdID0gdGVtcDsKKyAgICAgICAgICB0ZW1wID4+PSA4OworICAgICAgICAgIGRlc3RbZGVzdGlkeF0gPSB0ZW1wOworICAgICAgICB9CisgICAgICAgIGRlc3RpZHggKz0gMzsKKyAgICAgICAgc3RhdGUgPSAwOworICAgICAgICB0ZW1wID0gMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICAvLyBQcm9jZXNzIHRoZSBsZWZ0b3ZlciBkYXRhIGNvbnRhaW5lZCBpbiAndGVtcCcgYXQgdGhlIGVuZCBvZiB0aGUgaW5wdXQuCisgIGludCBleHBlY3RlZF9lcXVhbHMgPSAwOworICBzd2l0Y2ggKHN0YXRlKSB7CisgICAgY2FzZSAwOgorICAgICAgLy8gTm90aGluZyBsZWZ0IG92ZXI7IG91dHB1dCBpcyBhIG11bHRpcGxlIG9mIDMgYnl0ZXMuCisgICAgICBicmVhazsKKworICAgIGNhc2UgMToKKyAgICAgIC8vIEJhZCBpbnB1dDsgd2UgaGF2ZSA2IGJpdHMgbGVmdCBvdmVyLgorICAgICAgcmV0dXJuIC0xOworCisgICAgY2FzZSAyOgorICAgICAgLy8gUHJvZHVjZSBvbmUgbW9yZSBvdXRwdXQgYnl0ZSBmcm9tIHRoZSAxMiBpbnB1dCBiaXRzIHdlIGhhdmUgbGVmdC4KKyAgICAgIGlmIChkZXN0KSB7CisgICAgICAgIGlmIChkZXN0aWR4KzEgPiBzemRlc3QpIHJldHVybiAtMTsKKyAgICAgICAgdGVtcCA+Pj0gNDsKKyAgICAgICAgZGVzdFtkZXN0aWR4XSA9IHRlbXA7CisgICAgICB9CisgICAgICArK2Rlc3RpZHg7CisgICAgICBleHBlY3RlZF9lcXVhbHMgPSAyOworICAgICAgYnJlYWs7CisKKyAgICBjYXNlIDM6CisgICAgICAvLyBQcm9kdWNlIHR3byBtb3JlIG91dHB1dCBieXRlcyBmcm9tIHRoZSAxOCBpbnB1dCBiaXRzIHdlIGhhdmUgbGVmdC4KKyAgICAgIGlmIChkZXN0KSB7CisgICAgICAgIGlmIChkZXN0aWR4KzIgPiBzemRlc3QpIHJldHVybiAtMTsKKyAgICAgICAgdGVtcCA+Pj0gMjsKKyAgICAgICAgZGVzdFtkZXN0aWR4KzFdID0gdGVtcDsKKyAgICAgICAgdGVtcCA+Pj0gODsKKyAgICAgICAgZGVzdFtkZXN0aWR4XSA9IHRlbXA7CisgICAgICB9CisgICAgICBkZXN0aWR4ICs9IDI7CisgICAgICBleHBlY3RlZF9lcXVhbHMgPSAxOworICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgLy8gc3RhdGUgc2hvdWxkIGhhdmUgbm8gb3RoZXIgdmFsdWVzIGF0IHRoaXMgcG9pbnQuCisgICAgICBHT09HTEVfTE9HKEZBVEFMKSA8PCAiVGhpcyBjYW4ndCBoYXBwZW47IGJhc2U2NCBkZWNvZGVyIHN0YXRlID0gIiA8PCBzdGF0ZTsKKyAgfQorCisgIC8vIFRoZSByZW1haW5kZXIgb2YgdGhlIHN0cmluZyBzaG91bGQgYmUgYWxsIHdoaXRlc3BhY2UsIG1peGVkIHdpdGgKKyAgLy8gZXhhY3RseSAwIGVxdWFscyBzaWducywgb3IgZXhhY3RseSAnZXhwZWN0ZWRfZXF1YWxzJyBlcXVhbHMKKyAgLy8gc2lnbnMuICAoQWx3YXlzIGFjY2VwdGluZyAwIGVxdWFscyBzaWducyBpcyBhIGdvb2dsZSBleHRlbnNpb24KKyAgLy8gbm90IGNvdmVyZWQgaW4gdGhlIFJGQywgYXMgaXMgYWNjZXB0aW5nIGRvdCBhcyB0aGUgcGFkIGNoYXJhY3Rlci4pCisKKyAgaW50IGVxdWFscyA9IDA7CisgIHdoaWxlIChzenNyYyA+IDAgJiYgKnNyYykgeworICAgIGlmICgqc3JjID09IGtQYWQ2NEVxdWFscyB8fCAqc3JjID09IGtQYWQ2NERvdCkKKyAgICAgICsrZXF1YWxzOworICAgIGVsc2UgaWYgKCFhc2NpaV9pc3NwYWNlKCpzcmMpKQorICAgICAgcmV0dXJuIC0xOworICAgIC0tc3pzcmM7CisgICAgKytzcmM7CisgIH0KKworICByZXR1cm4gKGVxdWFscyA9PSAwIHx8IGVxdWFscyA9PSBleHBlY3RlZF9lcXVhbHMpID8gZGVzdGlkeCA6IC0xOworfQorCisvLyBUaGUgYXJyYXlzIGJlbG93IHdlcmUgZ2VuZXJhdGVkIGJ5IHRoZSBmb2xsb3dpbmcgY29kZQorLy8gI2luY2x1ZGUgPHN5cy90aW1lLmg+CisvLyAjaW5jbHVkZSA8c3RkbGliLmg+CisvLyAjaW5jbHVkZSA8c3RyaW5nLmg+CisvLyBtYWluKCkKKy8vIHsKKy8vICAgc3RhdGljIGNvbnN0IGNoYXIgQmFzZTY0W10gPQorLy8gICAgICJBQkNERUZHSElKS0xNTk9QUVJTVFVWV1hZWmFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eHl6MDEyMzQ1Njc4OSsvIjsKKy8vICAgY2hhciAqcG9zOworLy8gICBpbnQgaWR4LCBpLCBqOworLy8gICBwcmludGYoIiAgICAiKTsKKy8vICAgZm9yIChpID0gMDsgaSA8IDI1NTsgaSArPSA4KSB7CisvLyAgICAgZm9yIChqID0gaTsgaiA8IGkgKyA4OyBqKyspIHsKKy8vICAgICAgIHBvcyA9IHN0cmNocihCYXNlNjQsIGopOworLy8gICAgICAgaWYgKChwb3MgPT0gTlVMTCkgfHwgKGogPT0gMCkpCisvLyAgICAgICAgIGlkeCA9IC0xOworLy8gICAgICAgZWxzZQorLy8gICAgICAgICBpZHggPSBwb3MgLSBCYXNlNjQ7CisvLyAgICAgICBpZiAoaWR4ID09IC0xKQorLy8gICAgICAgICBwcmludGYoIiAlMmQsICAgICAiLCBpZHgpOworLy8gICAgICAgZWxzZQorLy8gICAgICAgICBwcmludGYoIiAlMmQvKiVjKi8sIiwgaWR4LCBqKTsKKy8vICAgICB9CisvLyAgICAgcHJpbnRmKCJcbiAgICAiKTsKKy8vICAgfQorLy8gfQorLy8KKy8vIHdoZXJlIHRoZSB2YWx1ZSBvZiAiQmFzZTY0W10iIHdhcyByZXBsYWNlZCBieSBvbmUgb2YgdGhlIGJhc2UtNjQgY29udmVyc2lvbgorLy8gdGFibGVzIGZyb20gdGhlIGZ1bmN0aW9ucyBiZWxvdy4KK3N0YXRpYyBjb25zdCBzaWduZWQgY2hhciBrVW5CYXNlNjRbXSA9IHsKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICA2Mi8qKyovLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICA2My8qLyAqLywKKyAgNTIvKjAqLywgNTMvKjEqLywgNTQvKjIqLywgNTUvKjMqLywgNTYvKjQqLywgNTcvKjUqLywgNTgvKjYqLywgNTkvKjcqLywKKyAgNjAvKjgqLywgNjEvKjkqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgICAwLypBKi8sICAxLypCKi8sICAyLypDKi8sICAzLypEKi8sICA0LypFKi8sICA1LypGKi8sICA2LypHKi8sCisgIDA3LypIKi8sICA4LypJKi8sICA5LypKKi8sIDEwLypLKi8sIDExLypMKi8sIDEyLypNKi8sIDEzLypOKi8sIDE0LypPKi8sCisgIDE1LypQKi8sIDE2LypRKi8sIDE3LypSKi8sIDE4LypTKi8sIDE5LypUKi8sIDIwLypVKi8sIDIxLypWKi8sIDIyLypXKi8sCisgIDIzLypYKi8sIDI0LypZKi8sIDI1LypaKi8sIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAyNi8qYSovLCAyNy8qYiovLCAyOC8qYyovLCAyOS8qZCovLCAzMC8qZSovLCAzMS8qZiovLCAzMi8qZyovLAorICAzMy8qaCovLCAzNC8qaSovLCAzNS8qaiovLCAzNi8qayovLCAzNy8qbCovLCAzOC8qbSovLCAzOS8qbiovLCA0MC8qbyovLAorICA0MS8qcCovLCA0Mi8qcSovLCA0My8qciovLCA0NC8qcyovLCA0NS8qdCovLCA0Ni8qdSovLCA0Ny8qdiovLCA0OC8qdyovLAorICA0OS8qeCovLCA1MC8qeSovLCA1MS8qeiovLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEKK307CitzdGF0aWMgY29uc3Qgc2lnbmVkIGNoYXIga1VuV2ViU2FmZUJhc2U2NFtdID0geworICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIDYyLyotKi8sIC0xLCAgICAgIC0xLAorICA1Mi8qMCovLCA1My8qMSovLCA1NC8qMiovLCA1NS8qMyovLCA1Ni8qNCovLCA1Ny8qNSovLCA1OC8qNiovLCA1OS8qNyovLAorICA2MC8qOCovLCA2MS8qOSovLCAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgIDAvKkEqLywgIDEvKkIqLywgIDIvKkMqLywgIDMvKkQqLywgIDQvKkUqLywgIDUvKkYqLywgIDYvKkcqLywKKyAgMDcvKkgqLywgIDgvKkkqLywgIDkvKkoqLywgMTAvKksqLywgMTEvKkwqLywgMTIvKk0qLywgMTMvKk4qLywgMTQvKk8qLywKKyAgMTUvKlAqLywgMTYvKlEqLywgMTcvKlIqLywgMTgvKlMqLywgMTkvKlQqLywgMjAvKlUqLywgMjEvKlYqLywgMjIvKlcqLywKKyAgMjMvKlgqLywgMjQvKlkqLywgMjUvKloqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgNjMvKl8qLywKKyAgLTEsICAgICAgMjYvKmEqLywgMjcvKmIqLywgMjgvKmMqLywgMjkvKmQqLywgMzAvKmUqLywgMzEvKmYqLywgMzIvKmcqLywKKyAgMzMvKmgqLywgMzQvKmkqLywgMzUvKmoqLywgMzYvKmsqLywgMzcvKmwqLywgMzgvKm0qLywgMzkvKm4qLywgNDAvKm8qLywKKyAgNDEvKnAqLywgNDIvKnEqLywgNDMvKnIqLywgNDQvKnMqLywgNDUvKnQqLywgNDYvKnUqLywgNDcvKnYqLywgNDgvKncqLywKKyAgNDkvKngqLywgNTAvKnkqLywgNTEvKnoqLywgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLAorICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwgICAgICAtMSwKKyAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsICAgICAgLTEsCisgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xLCAgICAgIC0xCit9OworCitpbnQgV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGNvbnN0IGNoYXIgKnNyYywgaW50IHN6c3JjLCBjaGFyICpkZXN0LCBpbnQgc3pkZXN0KSB7CisgIHJldHVybiBCYXNlNjRVbmVzY2FwZUludGVybmFsKHNyYywgc3pzcmMsIGRlc3QsIHN6ZGVzdCwga1VuV2ViU2FmZUJhc2U2NCk7Cit9CisKK3N0YXRpYyBib29sIEJhc2U2NFVuZXNjYXBlSW50ZXJuYWwoY29uc3QgY2hhciogc3JjLCBpbnQgc2xlbiwgc3RyaW5nKiBkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzaWduZWQgY2hhciogdW5iYXNlNjQpIHsKKyAgLy8gRGV0ZXJtaW5lIHRoZSBzaXplIG9mIHRoZSBvdXRwdXQgc3RyaW5nLiAgQmFzZTY0IGVuY29kZXMgZXZlcnkgMyBieXRlcyBpbnRvCisgIC8vIDQgY2hhcmFjdGVycy4gIGFueSBsZWZ0b3ZlciBjaGFycyBhcmUgYWRkZWQgZGlyZWN0bHkgZm9yIGdvb2QgbWVhc3VyZS4KKyAgLy8gVGhpcyBpcyBkb2N1bWVudGVkIGluIHRoZSBiYXNlNjQgUkZDOiBodHRwOi8vdG9vbHMuaWV0Zi5vcmcvaHRtbC9yZmMzNTQ4CisgIGNvbnN0IGludCBkZXN0X2xlbiA9IDMgKiAoc2xlbiAvIDQpICsgKHNsZW4gJSA0KTsKKworICBkZXN0LT5yZXNpemUoZGVzdF9sZW4pOworCisgIC8vIFdlIGFyZSBnZXR0aW5nIHRoZSBkZXN0aW5hdGlvbiBidWZmZXIgYnkgZ2V0dGluZyB0aGUgYmVnaW5uaW5nIG9mIHRoZQorICAvLyBzdHJpbmcgYW5kIGNvbnZlcnRpbmcgaXQgaW50byBhIGNoYXIgKi4KKyAgY29uc3QgaW50IGxlbiA9IEJhc2U2NFVuZXNjYXBlSW50ZXJuYWwoc3JjLCBzbGVuLCBzdHJpbmdfYXNfYXJyYXkoZGVzdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlc3RfbGVuLCB1bmJhc2U2NCk7CisgIGlmIChsZW4gPCAwKSB7CisgICAgZGVzdC0+Y2xlYXIoKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBjb3VsZCBiZSBzaG9ydGVyIGlmIHRoZXJlIHdhcyBwYWRkaW5nCisgIEdPT0dMRV9EQ0hFQ0tfTEUobGVuLCBkZXN0X2xlbik7CisgIGRlc3QtPmVyYXNlKGxlbik7CisKKyAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdHJpbmcqIGRlc3QpIHsKKyAgcmV0dXJuIEJhc2U2NFVuZXNjYXBlSW50ZXJuYWwoc3JjLmRhdGEoKSwgc3JjLnNpemUoKSwgZGVzdCwga1VuQmFzZTY0KTsKK30KKworYm9vbCBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdHJpbmcqIGRlc3QpIHsKKyAgcmV0dXJuIEJhc2U2NFVuZXNjYXBlSW50ZXJuYWwoc3JjLmRhdGEoKSwgc3JjLnNpemUoKSwgZGVzdCwga1VuV2ViU2FmZUJhc2U2NCk7Cit9CisKK2ludCBCYXNlNjRFc2NhcGVJbnRlcm5hbChjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzenNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpkZXN0LCBpbnQgc3pkZXN0LCBjb25zdCBjaGFyICpiYXNlNjQsCisgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb19wYWRkaW5nKSB7CisgIHN0YXRpYyBjb25zdCBjaGFyIGtQYWQ2NCA9ICc9JzsKKworICBpZiAoc3pzcmMgPD0gMCkgcmV0dXJuIDA7CisKKyAgaWYgKHN6c3JjICogNCA+IHN6ZGVzdCAqIDMpIHJldHVybiAwOworCisgIGNoYXIgKmN1cl9kZXN0ID0gZGVzdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqY3VyX3NyYyA9IHNyYzsKKworICBjaGFyICpsaW1pdF9kZXN0ID0gZGVzdCArIHN6ZGVzdDsKKyAgY29uc3QgdW5zaWduZWQgY2hhciAqbGltaXRfc3JjID0gc3JjICsgc3pzcmM7CisKKyAgLy8gVGhyZWUgYnl0ZXMgb2YgZGF0YSBlbmNvZGVzIHRvIGZvdXIgY2hhcmFjdGVycyBvZiBjeXBoZXJ0ZXh0LgorICAvLyBTbyB3ZSBjYW4gcHVtcCB0aHJvdWdoIHRocmVlLWJ5dGUgY2h1bmtzIGF0b21pY2FsbHkuCisgIHdoaWxlIChjdXJfc3JjIDwgbGltaXRfc3JjIC0gMykgeyAgLy8ga2VlcCBnb2luZyBhcyBsb25nIGFzIHdlIGhhdmUgPj0gMzIgYml0cworICAgIHVpbnQzMiBpbiA9IEJpZ0VuZGlhbjo6TG9hZDMyKGN1cl9zcmMpID4+IDg7CisKKyAgICBjdXJfZGVzdFswXSA9IGJhc2U2NFtpbiA+PiAxOF07CisgICAgaW4gJj0gMHgzRkZGRjsKKyAgICBjdXJfZGVzdFsxXSA9IGJhc2U2NFtpbiA+PiAxMl07CisgICAgaW4gJj0gMHhGRkY7CisgICAgY3VyX2Rlc3RbMl0gPSBiYXNlNjRbaW4gPj4gNl07CisgICAgaW4gJj0gMHgzRjsKKyAgICBjdXJfZGVzdFszXSA9IGJhc2U2NFtpbl07CisKKyAgICBjdXJfZGVzdCArPSA0OworICAgIGN1cl9zcmMgKz0gMzsKKyAgfQorICAvLyBUbyBzYXZlIHRpbWUsIHdlIGRpZG4ndCB1cGRhdGUgc3pkZXN0IG9yIHN6c3JjIGluIHRoZSBsb29wLiAgU28gZG8gaXQgbm93LgorICBzemRlc3QgPSBsaW1pdF9kZXN0IC0gY3VyX2Rlc3Q7CisgIHN6c3JjID0gbGltaXRfc3JjIC0gY3VyX3NyYzsKKworICAvKiBub3cgZGVhbCB3aXRoIHRoZSB0YWlsICg8PTMgYnl0ZXMpICovCisgIHN3aXRjaCAoc3pzcmMpIHsKKyAgICBjYXNlIDA6CisgICAgICAvLyBOb3RoaW5nIGxlZnQ7IG5vdGhpbmcgbW9yZSB0byBkby4KKyAgICAgIGJyZWFrOworICAgIGNhc2UgMTogeworICAgICAgLy8gT25lIGJ5dGUgbGVmdDogdGhpcyBlbmNvZGVzIHRvIHR3byBjaGFyYWN0ZXJzLCBhbmQgKG9wdGlvbmFsbHkpCisgICAgICAvLyB0d28gcGFkIGNoYXJhY3RlcnMgdG8gcm91bmQgb3V0IHRoZSBmb3VyLWNoYXJhY3RlciBjeXBoZXJibG9jay4KKyAgICAgIGlmICgoc3pkZXN0IC09IDIpIDwgMCkgcmV0dXJuIDA7CisgICAgICB1aW50MzIgaW4gPSBjdXJfc3JjWzBdOworICAgICAgY3VyX2Rlc3RbMF0gPSBiYXNlNjRbaW4gPj4gMl07CisgICAgICBpbiAmPSAweDM7CisgICAgICBjdXJfZGVzdFsxXSA9IGJhc2U2NFtpbiA8PCA0XTsKKyAgICAgIGN1cl9kZXN0ICs9IDI7CisgICAgICBpZiAoZG9fcGFkZGluZykgeworICAgICAgICBpZiAoKHN6ZGVzdCAtPSAyKSA8IDApIHJldHVybiAwOworICAgICAgICBjdXJfZGVzdFswXSA9IGtQYWQ2NDsKKyAgICAgICAgY3VyX2Rlc3RbMV0gPSBrUGFkNjQ7CisgICAgICAgIGN1cl9kZXN0ICs9IDI7CisgICAgICB9CisgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSAyOiB7CisgICAgICAvLyBUd28gYnl0ZXMgbGVmdDogdGhpcyBlbmNvZGVzIHRvIHRocmVlIGNoYXJhY3RlcnMsIGFuZCAob3B0aW9uYWxseSkKKyAgICAgIC8vIG9uZSBwYWQgY2hhcmFjdGVyIHRvIHJvdW5kIG91dCB0aGUgZm91ci1jaGFyYWN0ZXIgY3lwaGVyYmxvY2suCisgICAgICBpZiAoKHN6ZGVzdCAtPSAzKSA8IDApIHJldHVybiAwOworICAgICAgdWludDMyIGluID0gQmlnRW5kaWFuOjpMb2FkMTYoY3VyX3NyYyk7CisgICAgICBjdXJfZGVzdFswXSA9IGJhc2U2NFtpbiA+PiAxMF07CisgICAgICBpbiAmPSAweDNGRjsKKyAgICAgIGN1cl9kZXN0WzFdID0gYmFzZTY0W2luID4+IDRdOworICAgICAgaW4gJj0gMHgwMEY7CisgICAgICBjdXJfZGVzdFsyXSA9IGJhc2U2NFtpbiA8PCAyXTsKKyAgICAgIGN1cl9kZXN0ICs9IDM7CisgICAgICBpZiAoZG9fcGFkZGluZykgeworICAgICAgICBpZiAoKHN6ZGVzdCAtPSAxKSA8IDApIHJldHVybiAwOworICAgICAgICBjdXJfZGVzdFswXSA9IGtQYWQ2NDsKKyAgICAgICAgY3VyX2Rlc3QgKz0gMTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KKyAgICBjYXNlIDM6IHsKKyAgICAgIC8vIFRocmVlIGJ5dGVzIGxlZnQ6IHNhbWUgYXMgaW4gdGhlIGJpZyBsb29wIGFib3ZlLiAgV2UgY2FuJ3QgZG8gdGhpcyBpbgorICAgICAgLy8gdGhlIGxvb3AgYmVjYXVzZSB0aGUgbG9vcCBhYm92ZSBhbHdheXMgcmVhZHMgNCBieXRlcywgYW5kIHRoZSBmb3VydGgKKyAgICAgIC8vIGJ5dGUgaXMgcGFzdCB0aGUgZW5kIG9mIHRoZSBpbnB1dC4KKyAgICAgIGlmICgoc3pkZXN0IC09IDQpIDwgMCkgcmV0dXJuIDA7CisgICAgICB1aW50MzIgaW4gPSAoY3VyX3NyY1swXSA8PCAxNikgKyBCaWdFbmRpYW46OkxvYWQxNihjdXJfc3JjICsgMSk7CisgICAgICBjdXJfZGVzdFswXSA9IGJhc2U2NFtpbiA+PiAxOF07CisgICAgICBpbiAmPSAweDNGRkZGOworICAgICAgY3VyX2Rlc3RbMV0gPSBiYXNlNjRbaW4gPj4gMTJdOworICAgICAgaW4gJj0gMHhGRkY7CisgICAgICBjdXJfZGVzdFsyXSA9IGJhc2U2NFtpbiA+PiA2XTsKKyAgICAgIGluICY9IDB4M0Y7CisgICAgICBjdXJfZGVzdFszXSA9IGJhc2U2NFtpbl07CisgICAgICBjdXJfZGVzdCArPSA0OworICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6CisgICAgICAvLyBTaG91bGQgbm90IGJlIHJlYWNoZWQ6IGJsb2NrcyBvZiA0IGJ5dGVzIGFyZSBoYW5kbGVkCisgICAgICAvLyBpbiB0aGUgd2hpbGUgbG9vcCBiZWZvcmUgdGhpcyBzd2l0Y2ggc3RhdGVtZW50LgorICAgICAgR09PR0xFX0xPRyhGQVRBTCkgPDwgIkxvZ2ljIHByb2JsZW0/IHN6c3JjID0gIiA8PCBzenNyYzsKKyAgICAgIGJyZWFrOworICB9CisgIHJldHVybiAoY3VyX2Rlc3QgLSBkZXN0KTsKK30KKworc3RhdGljIGNvbnN0IGNoYXIga0Jhc2U2NENoYXJzW10gPQorIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5Ky8iOworCitzdGF0aWMgY29uc3QgY2hhciBrV2ViU2FmZUJhc2U2NENoYXJzW10gPQorIkFCQ0RFRkdISUpLTE1OT1BRUlNUVVZXWFlaYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXowMTIzNDU2Nzg5LV8iOworCitpbnQgQmFzZTY0RXNjYXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIgKnNyYywgaW50IHN6c3JjLCBjaGFyICpkZXN0LCBpbnQgc3pkZXN0KSB7CisgIHJldHVybiBCYXNlNjRFc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBzemRlc3QsIGtCYXNlNjRDaGFycywgdHJ1ZSk7Cit9CitpbnQgV2ViU2FmZUJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzenNyYywgY2hhciAqZGVzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBzemRlc3QsIGJvb2wgZG9fcGFkZGluZykgeworICByZXR1cm4gQmFzZTY0RXNjYXBlSW50ZXJuYWwoc3JjLCBzenNyYywgZGVzdCwgc3pkZXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga1dlYlNhZmVCYXNlNjRDaGFycywgZG9fcGFkZGluZyk7Cit9CisKK3ZvaWQgQmFzZTY0RXNjYXBlSW50ZXJuYWwoY29uc3QgdW5zaWduZWQgY2hhciogc3JjLCBpbnQgc3pzcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZGVzdCwgYm9vbCBkb19wYWRkaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBiYXNlNjRfY2hhcnMpIHsKKyAgY29uc3QgaW50IGNhbGNfZXNjYXBlZF9zaXplID0KKyAgICBDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKHN6c3JjLCBkb19wYWRkaW5nKTsKKyAgZGVzdC0+cmVzaXplKGNhbGNfZXNjYXBlZF9zaXplKTsKKyAgY29uc3QgaW50IGVzY2FwZWRfbGVuID0gQmFzZTY0RXNjYXBlSW50ZXJuYWwoc3JjLCBzenNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nX2FzX2FycmF5KGRlc3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXN0LT5zaXplKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF9jaGFycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZG9fcGFkZGluZyk7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoY2FsY19lc2NhcGVkX3NpemUsIGVzY2FwZWRfbGVuKTsKKyAgZGVzdC0+ZXJhc2UoZXNjYXBlZF9sZW4pOworfQorCit2b2lkIEJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzenNyYywKKyAgICAgICAgICAgICAgICAgIHN0cmluZyogZGVzdCwgYm9vbCBkb19wYWRkaW5nKSB7CisgIEJhc2U2NEVzY2FwZUludGVybmFsKHNyYywgc3pzcmMsIGRlc3QsIGRvX3BhZGRpbmcsIGtCYXNlNjRDaGFycyk7Cit9CisKK3ZvaWQgV2ViU2FmZUJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyICpzcmMsIGludCBzenNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcgKmRlc3QsIGJvb2wgZG9fcGFkZGluZykgeworICBCYXNlNjRFc2NhcGVJbnRlcm5hbChzcmMsIHN6c3JjLCBkZXN0LCBkb19wYWRkaW5nLCBrV2ViU2FmZUJhc2U2NENoYXJzKTsKK30KKwordm9pZCBCYXNlNjRFc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdHJpbmcqIGRlc3QpIHsKKyAgQmFzZTY0RXNjYXBlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KHNyYy5kYXRhKCkpLAorICAgICAgICAgICAgICAgc3JjLnNpemUoKSwgZGVzdCwgdHJ1ZSk7Cit9CisKK3ZvaWQgV2ViU2FmZUJhc2U2NEVzY2FwZShTdHJpbmdQaWVjZSBzcmMsIHN0cmluZyogZGVzdCkgeworICBXZWJTYWZlQmFzZTY0RXNjYXBlKHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KHNyYy5kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIHNyYy5zaXplKCksIGRlc3QsIGZhbHNlKTsKK30KKwordm9pZCBXZWJTYWZlQmFzZTY0RXNjYXBlV2l0aFBhZGRpbmcoU3RyaW5nUGllY2Ugc3JjLCBzdHJpbmcqIGRlc3QpIHsKKyAgV2ViU2FmZUJhc2U2NEVzY2FwZShyZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihzcmMuZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBzcmMuc2l6ZSgpLCBkZXN0LCB0cnVlKTsKK30KKworLy8gSGVscGVyIHRvIGFwcGVuZCBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIHN0cmluZyBhcyBVVEY4LCB3aXRob3V0IGJyaW5naW5nCisvLyBpbiBhbnkgZXh0ZXJuYWwgZGVwZW5kZW5jaWVzLgoraW50IEVuY29kZUFzVVRGOENoYXIodWludDMyIGNvZGVfcG9pbnQsIGNoYXIqIG91dHB1dCkgeworICB1aW50MzIgdG1wID0gMDsKKyAgaW50IGxlbiA9IDA7CisgIGlmIChjb2RlX3BvaW50IDw9IDB4N2YpIHsKKyAgICB0bXAgPSBjb2RlX3BvaW50OworICAgIGxlbiA9IDE7CisgIH0gZWxzZSBpZiAoY29kZV9wb2ludCA8PSAweDA3ZmYpIHsKKyAgICB0bXAgPSAweDAwMDBjMDgwIHwKKyAgICAgICAgKChjb2RlX3BvaW50ICYgMHgwN2MwKSA8PCAyKSB8CisgICAgICAgIChjb2RlX3BvaW50ICYgMHgwMDNmKTsKKyAgICBsZW4gPSAyOworICB9IGVsc2UgaWYgKGNvZGVfcG9pbnQgPD0gMHhmZmZmKSB7CisgICAgdG1wID0gMHgwMGUwODA4MCB8CisgICAgICAgICgoY29kZV9wb2ludCAmIDB4ZjAwMCkgPDwgNCkgfAorICAgICAgICAoKGNvZGVfcG9pbnQgJiAweDBmYzApIDw8IDIpIHwKKyAgICAgICAgKGNvZGVfcG9pbnQgJiAweDAwM2YpOworICAgIGxlbiA9IDM7CisgIH0gZWxzZSB7CisgICAgLy8gVVRGLTE2IGlzIG9ubHkgZGVmaW5lZCBmb3IgY29kZSBwb2ludHMgdXAgdG8gMHgxMEZGRkYsIGFuZCBVVEYtOCBpcworICAgIC8vIG5vcm1hbGx5IG9ubHkgZGVmaW5lZCB1cCB0byB0aGVyZSBhcyB3ZWxsLgorICAgIHRtcCA9IDB4ZjA4MDgwODAgfAorICAgICAgICAoKGNvZGVfcG9pbnQgJiAweDFjMDAwMCkgPDwgNikgfAorICAgICAgICAoKGNvZGVfcG9pbnQgJiAweDAzZjAwMCkgPDwgNCkgfAorICAgICAgICAoKGNvZGVfcG9pbnQgJiAweDAwMGZjMCkgPDwgMikgfAorICAgICAgICAoY29kZV9wb2ludCAmIDB4MDAzZik7CisgICAgbGVuID0gNDsKKyAgfQorICB0bXAgPSBnaHRvbmwodG1wKTsKKyAgbWVtY3B5KG91dHB1dCwgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oJnRtcCkgKyBzaXplb2YodG1wKSAtIGxlbiwgbGVuKTsKKyAgcmV0dXJuIGxlbjsKK30KKworLy8gVGFibGUgb2YgVVRGLTggY2hhcmFjdGVyIGxlbmd0aHMsIGJhc2VkIG9uIGZpcnN0IGJ5dGUKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBjaGFyIGtVVEY4TGVuVGJsWzI1Nl0gPSB7CisgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwKKyAgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLAorICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsCisgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwKKworICAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsCisgIDEsMSwxLDEsMSwxLDEsMSwgMSwxLDEsMSwxLDEsMSwxLCAxLDEsMSwxLDEsMSwxLDEsIDEsMSwxLDEsMSwxLDEsMSwKKyAgMiwyLDIsMiwyLDIsMiwyLCAyLDIsMiwyLDIsMiwyLDIsIDIsMiwyLDIsMiwyLDIsMiwgMiwyLDIsMiwyLDIsMiwyLAorICAzLDMsMywzLDMsMywzLDMsIDMsMywzLDMsMywzLDMsMywgNCw0LDQsNCw0LDQsNCw0LCA0LDQsNCw0LDQsNCw0LDQKK307CisKKy8vIFJldHVybiBsZW5ndGggb2YgYSBzaW5nbGUgVVRGLTggc291cmNlIGNoYXJhY3RlcgoraW50IFVURjhGaXJzdExldHRlck51bUJ5dGVzKGNvbnN0IGNoYXIqIHNyYywgaW50IGxlbikgeworICBpZiAobGVuID09IDApIHsKKyAgICByZXR1cm4gMDsKKyAgfQorICByZXR1cm4ga1VURjhMZW5UYmxbKnJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihzcmMpXTsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmgKaW5kZXggNGE3OWMyMi4uNWYxNjJmZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzMsMTMgKzMzLDIxIEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJVVElMX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfU1RVQlNfU1RSVVRJTF9IX18KIAorI2lmbmRlZiBTVEFSQk9BUkQKICNpbmNsdWRlIDxzdGRsaWIuaD4KKyNlbHNlCisjaW5jbHVkZSAic3RhcmJvYXJkL21lbW9yeS5oIgorI2luY2x1ZGUgInN0YXJib2FyZC9zdHJpbmcuaCIKKyNlbmRpZiAgLy8gU1RBUkJPQVJECisKICNpbmNsdWRlIDx2ZWN0b3I+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwaWVjZS5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKKyNpZm5kZWYgU1RBUkJPQVJECiAjaWZkZWYgX01TQ19WRVIKICNkZWZpbmUgc3RydG9sbCAgX3N0cnRvaTY0CiAjZGVmaW5lIHN0cnRvdWxsIF9zdHJ0b3VpNjQKQEAgLTQ4LDYgKzU2LDcgQEAKICNkZWZpbmUgc3RydG9sbCBzdHJ0b2wKICNkZWZpbmUgc3RydG91bGwgc3RydG91bAogI2VuZGlmCisjZW5kaWYgIC8vIFNUQVJCT0FSRAogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAvLyBhc2NpaV9pc2FsbnVtKCkKQEAgLTU3LDYgKzY2LDggQEAKIC8vICAgIHN0cmluZ3MsIHNvIGxvY2FsZSBzaG91bGQgbm90IGJlIHRha2VuIGludG8gYWNjb3VudC4KIC8vIGFzY2lpX2lzZGlnaXQoKQogLy8gICAgTGlrZSBhYm92ZSwgYnV0IG9ubHkgYWNjZXB0cyBkaWdpdHMuCisvLyBhc2NpaV9pc3NwYWNlKCkKKy8vICAgIENoZWNrIGlmIHRoZSBjaGFyYWN0ZXIgaXMgYSBzcGFjZSBjaGFyYWN0ZXIuCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKIGlubGluZSBib29sIGFzY2lpX2lzYWxudW0oY2hhciBjKSB7CkBAIC02OSw2ICs4MCwzNiBAQAogICByZXR1cm4gKCcwJyA8PSBjICYmIGMgPD0gJzknKTsKIH0KIAoraW5saW5lIGJvb2wgYXNjaWlfaXNzcGFjZShjaGFyIGMpIHsKKyAgcmV0dXJuIGMgPT0gJyAnIHx8IGMgPT0gJ1x0JyB8fCBjID09ICdcbicgfHwgYyA9PSAnXHYnIHx8IGMgPT0gJ1xmJyB8fAorICAgICAgYyA9PSAnXHInOworfQorCitpbmxpbmUgYm9vbCBhc2NpaV9pc3VwcGVyKGNoYXIgYykgeworICByZXR1cm4gYyA+PSAnQScgJiYgYyA8PSAnWic7Cit9CisKK2lubGluZSBib29sIGFzY2lpX2lzbG93ZXIoY2hhciBjKSB7CisgIHJldHVybiBjID49ICdhJyAmJiBjIDw9ICd6JzsKK30KKworaW5saW5lIGNoYXIgYXNjaWlfdG91cHBlcihjaGFyIGMpIHsKKyAgcmV0dXJuIGFzY2lpX2lzbG93ZXIoYykgPyBjIC0gKCdhJyAtICdBJykgOiBjOworfQorCitpbmxpbmUgY2hhciBhc2NpaV90b2xvd2VyKGNoYXIgYykgeworICByZXR1cm4gYXNjaWlfaXN1cHBlcihjKSA/IGMgKyAoJ2EnIC0gJ0EnKSA6IGM7Cit9CisKK2lubGluZSBpbnQgaGV4X2RpZ2l0X3RvX2ludChjaGFyIGMpIHsKKyAgLyogQXNzdW1lIEFTQ0lJLiAqLworICBpbnQgeCA9IHN0YXRpY19jYXN0PHVuc2lnbmVkIGNoYXI+KGMpOworICBpZiAoeCA+ICc5JykgeworICAgIHggKz0gOTsKKyAgfQorICByZXR1cm4geCAmIDB4ZjsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gSGFzUHJlZml4U3RyaW5nKCkKIC8vICAgIENoZWNrIGlmIGEgc3RyaW5nIGJlZ2lucyB3aXRoIGEgZ2l2ZW4gcHJlZml4LgpAQCAtMTE5LDEzICsxNjAsMjEgQEAKIC8vICAgIGluICdyZW1vdmUnKSB3aXRoIHRoZSBjaGFyYWN0ZXIgJ3JlcGxhY2V3aXRoJy4KIC8vICAgIEdvb2QgZm9yIGtlZXBpbmcgaHRtbCBjaGFyYWN0ZXJzIG9yIHByb3RvY29sIGNoYXJhY3RlcnMgKFx0KSBvdXQKIC8vICAgIG9mIHBsYWNlcyB3aGVyZSB0aGV5IG1pZ2h0IGNhdXNlIGEgcHJvYmxlbS4KKy8vIFN0cmlwV2hpdGVzcGFjZQorLy8gICAgUmVtb3ZlcyB3aGl0ZXNwYWNlcyBmcm9tIGJvdGggZW5kcyBvZiB0aGUgZ2l2ZW4gc3RyaW5nLgogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmbmRlZiBTVEFSQk9BUkQKIExJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFN0cmlwU3RyaW5nKHN0cmluZyogcywgY29uc3QgY2hhciogcmVtb3ZlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciByZXBsYWNld2l0aCk7CisjZW5kaWYKKworTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3RyaXBXaGl0ZXNwYWNlKHN0cmluZyogcyk7CisKIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gTG93ZXJTdHJpbmcoKQogLy8gVXBwZXJTdHJpbmcoKQorLy8gVG9VcHBlcigpCiAvLyAgICBDb252ZXJ0IHRoZSBjaGFyYWN0ZXJzIGluICJzIiB0byBsb3dlcmNhc2Ugb3IgdXBwZXJjYXNlLiAgQVNDSUktb25seToKIC8vICAgIHRoZXNlIGZ1bmN0aW9ucyBpbnRlbnRpb25hbGx5IGlnbm9yZSBsb2NhbGUgYmVjYXVzZSB0aGV5IGFyZSBhcHBsaWVkIHRvCiAvLyAgICBpZGVudGlmaWVycyB1c2VkIGluIHRoZSBQcm90b2NvbCBCdWZmZXIgbGFuZ3VhZ2UsIG5vdCB0byBuYXR1cmFsLWxhbmd1YWdlCkBAIC0xNDgsNiArMTk3LDEyIEBACiAgIH0KIH0KIAoraW5saW5lIHN0cmluZyBUb1VwcGVyKGNvbnN0IHN0cmluZyYgcykgeworICBzdHJpbmcgb3V0ID0gczsKKyAgVXBwZXJTdHJpbmcoJm91dCk7CisgIHJldHVybiBvdXQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIFN0cmluZ1JlcGxhY2UoKQogLy8gICAgR2l2ZSBtZSBhIHN0cmluZyBhbmQgdHdvIHBhdHRlcm5zICJvbGQiIGFuZCAibmV3IiwgYW5kIEkgcmVwbGFjZQpAQCAtMTY4LDYgKzIyMywzMyBAQAogTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3BsaXRTdHJpbmdVc2luZyhjb25zdCBzdHJpbmcmIGZ1bGwsIGNvbnN0IGNoYXIqIGRlbGltLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2ZWN0b3I8c3RyaW5nPiogcmVzKTsKIAorLy8gU3BsaXQgYSBzdHJpbmcgdXNpbmcgb25lIG9yIG1vcmUgYnl0ZSBkZWxpbWl0ZXJzLCBwcmVzZW50ZWQKKy8vIGFzIGEgbnVsLXRlcm1pbmF0ZWQgYyBzdHJpbmcuIEFwcGVuZCB0aGUgY29tcG9uZW50cyB0byAncmVzdWx0Jy4KKy8vIElmIHRoZXJlIGFyZSBjb25zZWN1dGl2ZSBkZWxpbWl0ZXJzLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisvLyBjb3JyZXNwb25kaW5nIGVtcHR5IHN0cmluZ3MuICBJZiB5b3Ugd2FudCB0byBkcm9wIHRoZSBlbXB0eQorLy8gc3RyaW5ncywgdHJ5IFNwbGl0U3RyaW5nVXNpbmcoKS4KKy8vCisvLyBJZiAiZnVsbCIgaXMgdGhlIGVtcHR5IHN0cmluZywgeWllbGRzIGFuIGVtcHR5IHN0cmluZyBhcyB0aGUgb25seSB2YWx1ZS4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFNwbGl0U3RyaW5nQWxsb3dFbXB0eShjb25zdCBzdHJpbmcmIGZ1bGwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmVjdG9yPHN0cmluZz4qIHJlc3VsdCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFNwbGl0KCkKKy8vICAgIFNwbGl0IGEgc3RyaW5nIHVzaW5nIGEgY2hhcmFjdGVyIGRlbGltaXRlci4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2lubGluZSB2ZWN0b3I8c3RyaW5nPiBTcGxpdCgKKyAgICBjb25zdCBzdHJpbmcmIGZ1bGwsIGNvbnN0IGNoYXIqIGRlbGltLCBib29sIHNraXBfZW1wdHkgPSB0cnVlKSB7CisgIHZlY3RvcjxzdHJpbmc+IHJlc3VsdDsKKyAgaWYgKHNraXBfZW1wdHkpIHsKKyAgICBTcGxpdFN0cmluZ1VzaW5nKGZ1bGwsIGRlbGltLCAmcmVzdWx0KTsKKyAgfSBlbHNlIHsKKyAgICBTcGxpdFN0cmluZ0FsbG93RW1wdHkoZnVsbCwgZGVsaW0sICZyZXN1bHQpOworICB9CisgIHJldHVybiByZXN1bHQ7Cit9CisKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIC8vIEpvaW5TdHJpbmdzKCkKIC8vICAgIFRoZXNlIG1ldGhvZHMgY29uY2F0ZW5hdGUgYSB2ZWN0b3Igb2Ygc3RyaW5ncyBpbnRvIGEgQysrIHN0cmluZywgdXNpbmcKQEAgLTI0MiwyNyArMzI0LDIxIEBACiBMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFVuZXNjYXBlQ0VzY2FwZVN0cmluZyhjb25zdCBzdHJpbmcmIHNyYyk7CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLS8vIENFc2NhcGVTdHJpbmcoKQotLy8gICAgQ29waWVzICdzcmMnIHRvICdkZXN0JywgZXNjYXBpbmcgZGFuZ2Vyb3VzIGNoYXJhY3RlcnMgdXNpbmcKLS8vICAgIEMtc3R5bGUgZXNjYXBlIHNlcXVlbmNlcy4gVGhpcyBpcyB2ZXJ5IHVzZWZ1bCBmb3IgcHJlcGFyaW5nIHF1ZXJ5Ci0vLyAgICBmbGFncy4gJ3NyYycgYW5kICdkZXN0JyBzaG91bGQgbm90IG92ZXJsYXAuCi0vLyAgICBSZXR1cm5zIHRoZSBudW1iZXIgb2YgYnl0ZXMgd3JpdHRlbiB0byAnZGVzdCcgKG5vdCBpbmNsdWRpbmcgdGhlIFwwKQotLy8gICAgb3IgLTEgaWYgdGhlcmUgd2FzIGluc3VmZmljaWVudCBzcGFjZS4KLS8vCi0vLyAgICBDdXJyZW50bHkgb25seSBcbiwgXHIsIFx0LCAiLCAnLCBcIGFuZCAhaXNwcmludCgpIGNoYXJzIGFyZSBlc2NhcGVkLgotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotTElCUFJPVE9CVUZfRVhQT1JUIGludCBDRXNjYXBlU3RyaW5nKGNvbnN0IGNoYXIqIHNyYywgaW50IHNyY19sZW4sCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciogZGVzdCwgaW50IGRlc3RfbGVuKTsKLQotLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gQ0VzY2FwZSgpCi0vLyAgICBNb3JlIGNvbnZlbmllbnQgZm9ybSBvZiBDRXNjYXBlU3RyaW5nOiByZXR1cm5zIHJlc3VsdCBhcyBhICJzdHJpbmciLgotLy8gICAgVGhpcyB2ZXJzaW9uIGlzIHNsb3dlciB0aGFuIENFc2NhcGVTdHJpbmcoKSBiZWNhdXNlIGl0IGRvZXMgbW9yZQotLy8gICAgYWxsb2NhdGlvbi4gIEhvd2V2ZXIsIGl0IGlzIG11Y2ggbW9yZSBjb252ZW5pZW50IHRvIHVzZSBpbgotLy8gICAgbm9uLXNwZWVkLWNyaXRpY2FsIGNvZGUgbGlrZSBsb2dnaW5nIG1lc3NhZ2VzIGV0Yy4KKy8vICAgIEVzY2FwZXMgJ3NyYycgdXNpbmcgQy1zdHlsZSBlc2NhcGUgc2VxdWVuY2VzIGFuZCByZXR1cm5zIHRoZSByZXN1bHRpbmcKKy8vICAgIHN0cmluZy4KKy8vCisvLyAgICBFc2NhcGVkIGNoYXJzOiBcbiwgXHIsIFx0LCAiLCAnLCBcLCBhbmQgIWlzcHJpbnQoKS4KIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIExJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgQ0VzY2FwZShjb25zdCBzdHJpbmcmIHNyYyk7CiAKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENFc2NhcGVBbmRBcHBlbmQoKQorLy8gICAgRXNjYXBlcyAnc3JjJyB1c2luZyBDLXN0eWxlIGVzY2FwZSBzZXF1ZW5jZXMsIGFuZCBhcHBlbmRzIHRoZSBlc2NhcGVkCisvLyAgICBzdHJpbmcgdG8gJ2Rlc3QnLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgQ0VzY2FwZUFuZEFwcGVuZChTdHJpbmdQaWVjZSBzcmMsIHN0cmluZyogZGVzdCk7CisKIG5hbWVzcGFjZSBzdHJpbmdzIHsKIC8vIExpa2UgQ0VzY2FwZSgpIGJ1dCBkb2VzIG5vdCBlc2NhcGUgYnl0ZXMgd2l0aCB0aGUgdXBwZXIgYml0IHNldC4KIExJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgVXRmOFNhZmVDRXNjYXBlKGNvbnN0IHN0cmluZyYgc3JjKTsKQEAgLTI4OCwxNCArMzY0LDIyIEBACiAKIGlubGluZSBpbnQzMiBzdHJ0bzMyKGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CiAgIGlmIChzaXplb2YoaW50MzIpID09IHNpemVvZihsb25nKSkKKyNpZm5kZWYgU1RBUkJPQVJECiAgICAgcmV0dXJuIHN0cnRvbChucHRyLCBlbmRwdHIsIGJhc2UpOworI2Vsc2UKKyAgICByZXR1cm4gU2JTdHJpbmdQYXJzZVNpZ25lZEludGVnZXIobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyNlbmRpZiAgLy8gU1RBUkJPQVJECiAgIGVsc2UKICAgICByZXR1cm4gc3RydG8zMl9hZGFwdG9yKG5wdHIsIGVuZHB0ciwgYmFzZSk7CiB9CiAKIGlubGluZSB1aW50MzIgc3RydG91MzIoY29uc3QgY2hhciAqbnB0ciwgY2hhciAqKmVuZHB0ciwgaW50IGJhc2UpIHsKICAgaWYgKHNpemVvZih1aW50MzIpID09IHNpemVvZih1bnNpZ25lZCBsb25nKSkKKyNpZm5kZWYgU1RBUkJPQVJECiAgICAgcmV0dXJuIHN0cnRvdWwobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyNlbHNlCisgICAgcmV0dXJuIFNiU3RyaW5nUGFyc2VVbnNpZ25lZEludGVnZXIobnB0ciwgZW5kcHRyLCBiYXNlKTsKKyNlbmRpZgogICBlbHNlCiAgICAgcmV0dXJuIHN0cnRvdTMyX2FkYXB0b3IobnB0ciwgZW5kcHRyLCBiYXNlKTsKIH0KQEAgLTMwNSwxMyArMzg5LDc3IEBACiBpbmxpbmUgaW50NjQgc3RydG82NChjb25zdCBjaGFyICpucHRyLCBjaGFyICoqZW5kcHRyLCBpbnQgYmFzZSkgewogICBHT09HTEVfQ09NUElMRV9BU1NFUlQoc2l6ZW9mKGludDY0KSA9PSBzaXplb2YobG9uZyBsb25nKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZl9pbnQ2NF9pc19ub3Rfc2l6ZW9mX2xvbmdfbG9uZyk7CisjaWZuZGVmIFNUQVJCT0FSRAogICByZXR1cm4gc3RydG9sbChucHRyLCBlbmRwdHIsIGJhc2UpOworI2Vsc2UKKyAgcmV0dXJuIFNiU3RyaW5nUGFyc2VTaWduZWRJbnRlZ2VyKG5wdHIsIGVuZHB0ciwgYmFzZSk7CisjZW5kaWYgIC8vIFNUQVJCT0FSRAogfQogCiBpbmxpbmUgdWludDY0IHN0cnRvdTY0KGNvbnN0IGNoYXIgKm5wdHIsIGNoYXIgKiplbmRwdHIsIGludCBiYXNlKSB7CiAgIEdPT0dMRV9DT01QSUxFX0FTU0VSVChzaXplb2YodWludDY0KSA9PSBzaXplb2YodW5zaWduZWQgbG9uZyBsb25nKSwKICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZl91aW50NjRfaXNfbm90X3NpemVvZl9sb25nX2xvbmcpOworI2lmbmRlZiBTVEFSQk9BUkQKICAgcmV0dXJuIHN0cnRvdWxsKG5wdHIsIGVuZHB0ciwgYmFzZSk7CisjZWxzZQorICByZXR1cm4gU2JTdHJpbmdQYXJzZVVJbnQ2NChucHRyLCBlbmRwdHIsIGJhc2UpOworI2VuZGlmICAvLyBTVEFSQk9BUkQKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gc2FmZV9zdHJ0b2IoKQorLy8gc2FmZV9zdHJ0bzMyKCkKKy8vIHNhZmVfc3RydG91MzIoKQorLy8gc2FmZV9zdHJ0bzY0KCkKKy8vIHNhZmVfc3RydG91NjQoKQorLy8gc2FmZV9zdHJ0b2YoKQorLy8gc2FmZV9zdHJ0b2QoKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgc2FmZV9zdHJ0b2IoU3RyaW5nUGllY2Ugc3RyLCBib29sKiB2YWx1ZSk7CisKK0xJQlBST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG8zMihjb25zdCBzdHJpbmcmIHN0ciwgaW50MzIqIHZhbHVlKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBib29sIHNhZmVfc3RydG91MzIoY29uc3Qgc3RyaW5nJiBzdHIsIHVpbnQzMiogdmFsdWUpOworaW5saW5lIGJvb2wgc2FmZV9zdHJ0bzMyKGNvbnN0IGNoYXIqIHN0ciwgaW50MzIqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvMzIoc3RyaW5nKHN0ciksIHZhbHVlKTsKK30KK2lubGluZSBib29sIHNhZmVfc3RydG8zMihTdHJpbmdQaWVjZSBzdHIsIGludDMyKiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV9zdHJ0bzMyKHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvdTMyKGNvbnN0IGNoYXIqIHN0ciwgdWludDMyKiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV9zdHJ0b3UzMihzdHJpbmcoc3RyKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgc2FmZV9zdHJ0b3UzMihTdHJpbmdQaWVjZSBzdHIsIHVpbnQzMiogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG91MzIoc3RyLlRvU3RyaW5nKCksIHZhbHVlKTsKK30KKworTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgc2FmZV9zdHJ0bzY0KGNvbnN0IHN0cmluZyYgc3RyLCBpbnQ2NCogdmFsdWUpOworTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgc2FmZV9zdHJ0b3U2NChjb25zdCBzdHJpbmcmIHN0ciwgdWludDY0KiB2YWx1ZSk7CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvNjQoY29uc3QgY2hhciogc3RyLCBpbnQ2NCogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG82NChzdHJpbmcoc3RyKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgc2FmZV9zdHJ0bzY0KFN0cmluZ1BpZWNlIHN0ciwgaW50NjQqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvNjQoc3RyLlRvU3RyaW5nKCksIHZhbHVlKTsKK30KK2lubGluZSBib29sIHNhZmVfc3RydG91NjQoY29uc3QgY2hhciogc3RyLCB1aW50NjQqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvdTY0KHN0cmluZyhzdHIpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvdTY0KFN0cmluZ1BpZWNlIHN0ciwgdWludDY0KiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV9zdHJ0b3U2NChzdHIuVG9TdHJpbmcoKSwgdmFsdWUpOworfQorCitMSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBzYWZlX3N0cnRvZihjb25zdCBjaGFyKiBzdHIsIGZsb2F0KiB2YWx1ZSk7CitMSUJQUk9UT0JVRl9FWFBPUlQgYm9vbCBzYWZlX3N0cnRvZChjb25zdCBjaGFyKiBzdHIsIGRvdWJsZSogdmFsdWUpOworaW5saW5lIGJvb2wgc2FmZV9zdHJ0b2YoY29uc3Qgc3RyaW5nJiBzdHIsIGZsb2F0KiB2YWx1ZSkgeworICByZXR1cm4gc2FmZV9zdHJ0b2Yoc3RyLmNfc3RyKCksIHZhbHVlKTsKK30KK2lubGluZSBib29sIHNhZmVfc3RydG9kKGNvbnN0IHN0cmluZyYgc3RyLCBkb3VibGUqIHZhbHVlKSB7CisgIHJldHVybiBzYWZlX3N0cnRvZChzdHIuY19zdHIoKSwgdmFsdWUpOworfQoraW5saW5lIGJvb2wgc2FmZV9zdHJ0b2YoU3RyaW5nUGllY2Ugc3RyLCBmbG9hdCogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG9mKHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7Cit9CitpbmxpbmUgYm9vbCBzYWZlX3N0cnRvZChTdHJpbmdQaWVjZSBzdHIsIGRvdWJsZSogdmFsdWUpIHsKKyAgcmV0dXJuIHNhZmVfc3RydG9kKHN0ci5Ub1N0cmluZygpLCB2YWx1ZSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTM5Nyw2ICs1NDUsMTAgQEAKICAgcmV0dXJuIGJ1ZmZlcjsKIH0KIAoraW5saW5lIHN0cmluZyBTaW1wbGVCdG9hKGJvb2wgdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlID8gInRydWUiIDogImZhbHNlIjsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogLy8gU2ltcGxlSXRvYSgpCiAvLyAgICBEZXNjcmlwdGlvbjogY29udmVydHMgYW4gaW50ZWdlciB0byBhIHN0cmluZy4KQEAgLTQ0MSwxNyArNTkzLDMyMiBAQAogc3RhdGljIGNvbnN0IGludCBrRG91YmxlVG9CdWZmZXJTaXplID0gMzI7CiBzdGF0aWMgY29uc3QgaW50IGtGbG9hdFRvQnVmZmVyU2l6ZSA9IDI0OwogCituYW1lc3BhY2Ugc3RyaW5ncyB7CisKK2VudW0gUGFkU3BlYyB7CisgIE5PX1BBRCA9IDEsCisgIFpFUk9fUEFEXzIsCisgIFpFUk9fUEFEXzMsCisgIFpFUk9fUEFEXzQsCisgIFpFUk9fUEFEXzUsCisgIFpFUk9fUEFEXzYsCisgIFpFUk9fUEFEXzcsCisgIFpFUk9fUEFEXzgsCisgIFpFUk9fUEFEXzksCisgIFpFUk9fUEFEXzEwLAorICBaRVJPX1BBRF8xMSwKKyAgWkVST19QQURfMTIsCisgIFpFUk9fUEFEXzEzLAorICBaRVJPX1BBRF8xNCwKKyAgWkVST19QQURfMTUsCisgIFpFUk9fUEFEXzE2LAorfTsKKworc3RydWN0IEhleCB7CisgIHVpbnQ2NCB2YWx1ZTsKKyAgZW51bSBQYWRTcGVjIHNwZWM7CisgIHRlbXBsYXRlIDxjbGFzcyBJbnQ+CisgIGV4cGxpY2l0IEhleChJbnQgdiwgUGFkU3BlYyBzID0gTk9fUEFEKQorICAgICAgOiBzcGVjKHMpIHsKKyAgICAvLyBQcmV2ZW50IHNpZ24tZXh0ZW5zaW9uIGJ5IGNhc3RpbmcgaW50ZWdlcnMgdG8KKyAgICAvLyB0aGVpciB1bnNpZ25lZCBjb3VudGVycGFydHMuCisjaWZkZWYgTEFOR19DWFgxMQorICAgIHN0YXRpY19hc3NlcnQoCisgICAgICAgIHNpemVvZih2KSA9PSAxIHx8IHNpemVvZih2KSA9PSAyIHx8IHNpemVvZih2KSA9PSA0IHx8IHNpemVvZih2KSA9PSA4LAorICAgICAgICAiVW5rbm93biBpbnRlZ2VyIHR5cGUiKTsKKyNlbmRpZgorICAgIHZhbHVlID0gc2l6ZW9mKHYpID09IDEgPyBzdGF0aWNfY2FzdDx1aW50OD4odikKKyAgICAgICAgICA6IHNpemVvZih2KSA9PSAyID8gc3RhdGljX2Nhc3Q8dWludDE2Pih2KQorICAgICAgICAgIDogc2l6ZW9mKHYpID09IDQgPyBzdGF0aWNfY2FzdDx1aW50MzI+KHYpCisgICAgICAgICAgOiBzdGF0aWNfY2FzdDx1aW50NjQ+KHYpOworICB9Cit9OworCitzdHJ1Y3QgTElCUFJPVE9CVUZfRVhQT1JUIEFscGhhTnVtIHsKKyAgY29uc3QgY2hhciAqcGllY2VfZGF0YV87ICAvLyBtb3ZlIHRoZXNlIHRvIHN0cmluZ19yZWYgZXZlbnR1YWxseQorICBzaXplX3QgcGllY2Vfc2l6ZV87ICAgICAgIC8vIG1vdmUgdGhlc2UgdG8gc3RyaW5nX3JlZiBldmVudHVhbGx5CisKKyAgY2hhciBkaWdpdHNba0Zhc3RUb0J1ZmZlclNpemVdOworCisgIC8vIE5vIGJvb2wgY3RvciAtLSBib29scyBjb252ZXJ0IHRvIGFuIGludGVncmFsIHR5cGUuCisgIC8vIEEgYm9vbCBjdG9yIHdvdWxkIGFsc28gY29udmVydCBpbmNvbWluZyBwb2ludGVycyAoYmxldGNoKS4KKworICBBbHBoYU51bShpbnQzMiBpMzIpCisgICAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksCisgICAgICAgIHBpZWNlX3NpemVfKEZhc3RJbnQzMlRvQnVmZmVyTGVmdChpMzIsIGRpZ2l0cykgLSAmZGlnaXRzWzBdKSB7fQorICBBbHBoYU51bSh1aW50MzIgdTMyKQorICAgICAgOiBwaWVjZV9kYXRhXyhkaWdpdHMpLAorICAgICAgICBwaWVjZV9zaXplXyhGYXN0VUludDMyVG9CdWZmZXJMZWZ0KHUzMiwgZGlnaXRzKSAtICZkaWdpdHNbMF0pIHt9CisgIEFscGhhTnVtKGludDY0IGk2NCkKKyAgICAgIDogcGllY2VfZGF0YV8oZGlnaXRzKSwKKyAgICAgICAgcGllY2Vfc2l6ZV8oRmFzdEludDY0VG9CdWZmZXJMZWZ0KGk2NCwgZGlnaXRzKSAtICZkaWdpdHNbMF0pIHt9CisgIEFscGhhTnVtKHVpbnQ2NCB1NjQpCisgICAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksCisgICAgICAgIHBpZWNlX3NpemVfKEZhc3RVSW50NjRUb0J1ZmZlckxlZnQodTY0LCBkaWdpdHMpIC0gJmRpZ2l0c1swXSkge30KKworICBBbHBoYU51bShmbG9hdCBmKQorI2lmbmRlZiBTVEFSQk9BUkQKKyAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksIHBpZWNlX3NpemVfKHN0cmxlbihGbG9hdFRvQnVmZmVyKGYsIGRpZ2l0cykpKSB7fQorI2Vsc2UKKyAgICA6IHBpZWNlX2RhdGFfKGRpZ2l0cyksIHBpZWNlX3NpemVfKFNiU3RyaW5nR2V0TGVuZ3RoKEZsb2F0VG9CdWZmZXIoZiwgZGlnaXRzKSkpIHt9CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorICBBbHBoYU51bShkb3VibGUgZikKKyNpZm5kZWYgU1RBUkJPQVJECisgICAgOiBwaWVjZV9kYXRhXyhkaWdpdHMpLCBwaWVjZV9zaXplXyhzdHJsZW4oRG91YmxlVG9CdWZmZXIoZiwgZGlnaXRzKSkpIHt9CisjZWxzZQorICAgIDogcGllY2VfZGF0YV8oZGlnaXRzKSwgcGllY2Vfc2l6ZV8oU2JTdHJpbmdHZXRMZW5ndGgoRG91YmxlVG9CdWZmZXIoZiwgZGlnaXRzKSkpIHt9CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorCisgIEFscGhhTnVtKEhleCBoZXgpOworCisgIEFscGhhTnVtKGNvbnN0IGNoYXIqIGNfc3RyKQorI2lmbmRlZiBTVEFSQk9BUkQKKyAgICAgIDogcGllY2VfZGF0YV8oY19zdHIpLCBwaWVjZV9zaXplXyhzdHJsZW4oY19zdHIpKSB7fQorI2Vsc2UKKyAgICAgIDogcGllY2VfZGF0YV8oY19zdHIpLCBwaWVjZV9zaXplXyhTYlN0cmluZ0dldExlbmd0aChjX3N0cikpIHt9CisjZW5kaWYgIC8vIFNUQVJCT0FSRAorICAvLyBUT0RPOiBBZGQgYSBzdHJpbmdfcmVmIGNvbnN0cnVjdG9yLCBldmVudHVhbGx5CisgIC8vIEFscGhhTnVtKGNvbnN0IFN0cmluZ1BpZWNlICZwYykgOiBwaWVjZShwYykge30KKworICBBbHBoYU51bShjb25zdCBzdHJpbmcmIHN0cikKKyAgICAgIDogcGllY2VfZGF0YV8oc3RyLmRhdGEoKSksIHBpZWNlX3NpemVfKHN0ci5zaXplKCkpIHt9CisKKyAgQWxwaGFOdW0oU3RyaW5nUGllY2Ugc3RyKQorICAgICAgOiBwaWVjZV9kYXRhXyhzdHIuZGF0YSgpKSwgcGllY2Vfc2l6ZV8oc3RyLnNpemUoKSkge30KKworICBBbHBoYU51bShpbnRlcm5hbDo6U3RyaW5nUGllY2VQb2Qgc3RyKQorICAgICAgOiBwaWVjZV9kYXRhXyhzdHIuZGF0YSgpKSwgcGllY2Vfc2l6ZV8oc3RyLnNpemUoKSkge30KKworICBzaXplX3Qgc2l6ZSgpIGNvbnN0IHsgcmV0dXJuIHBpZWNlX3NpemVfOyB9CisgIGNvbnN0IGNoYXIgKmRhdGEoKSBjb25zdCB7IHJldHVybiBwaWVjZV9kYXRhXzsgfQorCisgcHJpdmF0ZToKKyAgLy8gVXNlICI6IiBub3QgJzonCisgIEFscGhhTnVtKGNoYXIgYyk7ICAvLyBOT0xJTlQocnVudGltZS9leHBsaWNpdCkKKworICAvLyBEaXNhbGxvdyBjb3B5IGFuZCBhc3NpZ24uCisgIEFscGhhTnVtKGNvbnN0IEFscGhhTnVtJik7CisgIHZvaWQgb3BlcmF0b3I9KGNvbnN0IEFscGhhTnVtJik7Cit9OworCit9ICAvLyBuYW1lc3BhY2Ugc3RyaW5ncworCit1c2luZyBzdHJpbmdzOjpBbHBoYU51bTsKKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQotLy8gTm9Mb2NhbGVTdHJ0b2QoKQotLy8gICBFeGFjdGx5IGxpa2Ugc3RydG9kKCksIGV4Y2VwdCBpdCBhbHdheXMgYmVoYXZlcyBhcyBpZiBpbiB0aGUgIkMiCi0vLyAgIGxvY2FsZSAoaS5lLiBkZWNpbWFsIHBvaW50cyBtdXN0IGJlICcuJ3MpLgorLy8gU3RyQ2F0KCkKKy8vICAgIFRoaXMgbWVyZ2VzIHRoZSBnaXZlbiBzdHJpbmdzIG9yIG51bWJlcnMsIHdpdGggbm8gZGVsaW1pdGVyLiAgVGhpcworLy8gICAgaXMgZGVzaWduZWQgdG8gYmUgdGhlIGZhc3Rlc3QgcG9zc2libGUgd2F5IHRvIGNvbnN0cnVjdCBhIHN0cmluZyBvdXQKKy8vICAgIG9mIGEgbWl4IG9mIHJhdyBDIHN0cmluZ3MsIHN0cmluZ3MsIGJvb2wgdmFsdWVzLAorLy8gICAgYW5kIG51bWVyaWMgdmFsdWVzLgorLy8KKy8vICAgIERvbid0IHVzZSB0aGlzIGZvciB1c2VyLXZpc2libGUgc3RyaW5ncy4gIFRoZSBsb2NhbGl6YXRpb24gcHJvY2VzcworLy8gICAgd29ya3MgcG9vcmx5IG9uIHN0cmluZ3MgYnVpbHQgdXAgb3V0IG9mIGZyYWdtZW50cy4KKy8vCisvLyAgICBGb3IgY2xhcml0eSBhbmQgcGVyZm9ybWFuY2UsIGRvbid0IHVzZSBTdHJDYXQgd2hlbiBhcHBlbmRpbmcgdG8gYQorLy8gICAgc3RyaW5nLiAgSW4gcGFydGljdWxhciwgYXZvaWQgdXNpbmcgYW55IG9mIHRoZXNlIChhbnRpLSlwYXR0ZXJuczoKKy8vICAgICAgc3RyLmFwcGVuZChTdHJDYXQoLi4uKQorLy8gICAgICBzdHIgKz0gU3RyQ2F0KC4uLikKKy8vICAgICAgc3RyID0gU3RyQ2F0KHN0ciwgLi4uKQorLy8gICAgd2hlcmUgdGhlIGxhc3QgaXMgdGhlIHdvcnNlLCB3aXRoIHRoZSBwb3RlbnRpYWwgdG8gY2hhbmdlIGEgbG9vcAorLy8gICAgZnJvbSBhIGxpbmVhciB0aW1lIG9wZXJhdGlvbiB3aXRoIE8oMSkgZHluYW1pYyBhbGxvY2F0aW9ucyBpbnRvIGEKKy8vICAgIHF1YWRyYXRpYyB0aW1lIG9wZXJhdGlvbiB3aXRoIE8obikgZHluYW1pYyBhbGxvY2F0aW9ucy4gIFN0ckFwcGVuZAorLy8gICAgaXMgYSBiZXR0ZXIgY2hvaWNlIHRoYW4gYW55IG9mIHRoZSBhYm92ZSwgc3ViamVjdCB0byB0aGUgcmVzdHJpY3Rpb24KKy8vICAgIG9mIFN0ckFwcGVuZCgmc3RyLCBhLCBiLCBjLCAuLi4pIHRoYXQgbm9uZSBvZiB0aGUgYSwgYiwgYywgLi4uIG1heQorLy8gICAgYmUgYSByZWZlcmVuY2UgaW50byBzdHIuCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKLUxJQlBST1RPQlVGX0VYUE9SVCBkb3VibGUgTm9Mb2NhbGVTdHJ0b2QoY29uc3QgY2hhciogdGV4dCwgY2hhcioqIGVuZHB0cik7CitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0mIGEsIGNvbnN0IEFscGhhTnVtJiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0mIGEsIGNvbnN0IEFscGhhTnVtJiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBjLCBjb25zdCBBbHBoYU51bSYgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBlKTsKK0xJQlBST1RPQlVGX0VYUE9SVCBzdHJpbmcgU3RyQ2F0KGNvbnN0IEFscGhhTnVtJiBhLCBjb25zdCBBbHBoYU51bSYgYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBjLCBjb25zdCBBbHBoYU51bSYgZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBlLCBjb25zdCBBbHBoYU51bSYgZik7CitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYywgY29uc3QgQWxwaGFOdW0mIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZSwgY29uc3QgQWxwaGFOdW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZyk7CitMSUJQUk9UT0JVRl9FWFBPUlQgc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSwgY29uc3QgQWxwaGFOdW0mIGIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYywgY29uc3QgQWxwaGFOdW0mIGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZSwgY29uc3QgQWxwaGFOdW0mIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgZywgY29uc3QgQWxwaGFOdW0mIGgpOworTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBTdHJDYXQoY29uc3QgQWxwaGFOdW0mIGEsIGNvbnN0IEFscGhhTnVtJiBiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGMsIGNvbnN0IEFscGhhTnVtJiBkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGUsIGNvbnN0IEFscGhhTnVtJiBmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGcsIGNvbnN0IEFscGhhTnVtJiBoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGkpOworCitpbmxpbmUgc3RyaW5nIFN0ckNhdChjb25zdCBBbHBoYU51bSYgYSkgeyByZXR1cm4gc3RyaW5nKGEuZGF0YSgpLCBhLnNpemUoKSk7IH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gU3RyQXBwZW5kKCkKKy8vICAgIFNhbWUgYXMgYWJvdmUsIGJ1dCBhZGRzIHRoZSBvdXRwdXQgdG8gdGhlIGdpdmVuIHN0cmluZy4KKy8vICAgIFdBUk5JTkc6IEZvciBzcGVlZCwgU3RyQXBwZW5kIGRvZXMgbm90IHRyeSB0byBjaGVjayBlYWNoIG9mIGl0cyBpbnB1dAorLy8gICAgYXJndW1lbnRzIHRvIGJlIHN1cmUgdGhhdCB0aGV5IGFyZSBub3QgYSBzdWJzZXQgb2YgdGhlIHN0cmluZyBiZWluZworLy8gICAgYXBwZW5kZWQgdG8uICBUaGF0IGlzLCB3aGlsZSB0aGlzIHdpbGwgd29yazoKKy8vCisvLyAgICBzdHJpbmcgcyA9ICJmb28iOworLy8gICAgcyArPSBzOworLy8KKy8vICAgIFRoaXMgd2lsbCBub3QgKG5lY2Vzc2FyaWx5KSB3b3JrOgorLy8KKy8vICAgIHN0cmluZyBzID0gImZvbyI7CisvLyAgICBTdHJBcHBlbmQoJnMsIHMpOworLy8KKy8vICAgIE5vdGU6IHdoaWxlIFN0ckNhdCBzdXBwb3J0cyBhcHBlbmRpbmcgdXAgdG8gOSBhcmd1bWVudHMsIFN0ckFwcGVuZAorLy8gICAgaXMgY3VycmVudGx5IGxpbWl0ZWQgdG8gNC4gIFRoYXQncyByYXJlbHkgYW4gaXNzdWUgZXhjZXB0IHdoZW4KKy8vICAgIGF1dG9tYXRpY2FsbHkgdHJhbnNmb3JtaW5nIFN0ckNhdCB0byBTdHJBcHBlbmQsIGFuZCBjYW4gZWFzaWx5IGJlCisvLyAgICB3b3JrZWQgYXJvdW5kIGFzIGNvbnNlY3V0aXZlIGNhbGxzIHRvIFN0ckFwcGVuZCBhcmUgcXVpdGUgZWZmaWNpZW50LgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJBcHBlbmQoc3RyaW5nKiBkZXN0LCBjb25zdCBBbHBoYU51bSYgYSk7CitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJBcHBlbmQoc3RyaW5nKiBkZXN0LCBjb25zdCBBbHBoYU51bSYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYik7CitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBTdHJBcHBlbmQoc3RyaW5nKiBkZXN0LCBjb25zdCBBbHBoYU51bSYgYSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBBbHBoYU51bSYgYiwgY29uc3QgQWxwaGFOdW0mIGMpOworTElCUFJPVE9CVUZfRVhQT1JUIHZvaWQgU3RyQXBwZW5kKHN0cmluZyogZGVzdCwgY29uc3QgQWxwaGFOdW0mIGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQWxwaGFOdW0mIGIsIGNvbnN0IEFscGhhTnVtJiBjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEFscGhhTnVtJiBkKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSm9pbigpCisvLyAgICBUaGVzZSBtZXRob2RzIGNvbmNhdGVuYXRlIGEgcmFuZ2Ugb2YgY29tcG9uZW50cyBpbnRvIGEgQysrIHN0cmluZywgdXNpbmcKKy8vICAgIHRoZSBDLXN0cmluZyAiZGVsaW0iIGFzIGEgc2VwYXJhdG9yIGJldHdlZW4gY29tcG9uZW50cy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3RlbXBsYXRlIDx0eXBlbmFtZSBJdGVyYXRvcj4KK3ZvaWQgSm9pbihJdGVyYXRvciBzdGFydCwgSXRlcmF0b3IgZW5kLAorICAgICAgICAgIGNvbnN0IGNoYXIqIGRlbGltLCBzdHJpbmcqIHJlc3VsdCkgeworICBmb3IgKEl0ZXJhdG9yIGl0ID0gc3RhcnQ7IGl0ICE9IGVuZDsgKytpdCkgeworICAgIGlmIChpdCAhPSBzdGFydCkgeworICAgICAgcmVzdWx0LT5hcHBlbmQoZGVsaW0pOworICAgIH0KKyAgICBTdHJBcHBlbmQocmVzdWx0LCAqaXQpOworICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBSYW5nZT4KK3N0cmluZyBKb2luKGNvbnN0IFJhbmdlJiBjb21wb25lbnRzLAorICAgICAgICAgICAgY29uc3QgY2hhciogZGVsaW0pIHsKKyAgc3RyaW5nIHJlc3VsdDsKKyAgSm9pbihjb21wb25lbnRzLmJlZ2luKCksIGNvbXBvbmVudHMuZW5kKCksIGRlbGltLCAmcmVzdWx0KTsKKyAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVG9IZXgoKQorLy8gICAgUmV0dXJuIGEgbG93ZXItY2FzZSBoZXggc3RyaW5nIHJlcHJlc2VudGF0aW9uIG9mIHRoZSBnaXZlbiBpbnRlZ2VyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIHN0cmluZyBUb0hleCh1aW50NjQgbnVtKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gR2xvYmFsUmVwbGFjZVN1YnN0cmluZygpCisvLyAgICBSZXBsYWNlcyBhbGwgaW5zdGFuY2VzIG9mIGEgc3Vic3RyaW5nIGluIGEgc3RyaW5nLiAgRG9lcyBub3RoaW5nCisvLyAgICBpZiAnc3Vic3RyaW5nJyBpcyBlbXB0eS4gIFJldHVybnMgdGhlIG51bWJlciBvZiByZXBsYWNlbWVudHMuCisvLworLy8gICAgTk9URTogVGhlIHN0cmluZyBwaWVjZXMgbXVzdCBub3Qgb3ZlcmxhcCBzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIGludCBHbG9iYWxSZXBsYWNlU3Vic3RyaW5nKGNvbnN0IHN0cmluZyYgc3Vic3RyaW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgcmVwbGFjZW1lbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBzKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQmFzZTY0VW5lc2NhcGUoKQorLy8gICAgQ29udmVydHMgInNyYyIgd2hpY2ggaXMgZW5jb2RlZCBpbiBCYXNlNjQgdG8gaXRzIGJpbmFyeSBlcXVpdmFsZW50IGFuZAorLy8gICAgd3JpdGVzIGl0IHRvICJkZXN0Ii4gSWYgc3JjIGNvbnRhaW5zIGludmFsaWQgY2hhcmFjdGVycywgZGVzdCBpcyBjbGVhcmVkCisvLyAgICBhbmQgdGhlIGZ1bmN0aW9uIHJldHVybnMgZmFsc2UuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIGJvb2wgQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdHJpbmcqIGRlc3QpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoKQorLy8gICAgVGhpcyBpcyBhIHZhcmlhdGlvbiBvZiBCYXNlNjRVbmVzY2FwZSB3aGljaCB1c2VzICctJyBpbnN0ZWFkIG9mICcrJywgYW5kCisvLyAgICAnXycgaW5zdGVhZCBvZiAnLycuIHNyYyBpcyBub3QgbnVsbCB0ZXJtaW5hdGVkLCBpbnN0ZWFkIHNwZWNpZnkgbGVuLiBJCisvLyAgICByZWNvbW1lbmQgdGhhdCBzbGVuPHN6ZGVzdCwgYnV0IHdlIGhvbm9yIHN6ZGVzdCBhbnl3YXkuCisvLyAgICBSRVRVUk5TIHRoZSBsZW5ndGggb2YgZGVzdCwgb3IgLTEgaWYgc3JjIGNvbnRhaW5zIGludmFsaWQgY2hhcnMuCisKKy8vICAgIFRoZSB2YXJpYXRpb24gdGhhdCBzdG9yZXMgaW50byBhIHN0cmluZyBjbGVhcnMgdGhlIHN0cmluZyBmaXJzdCwgYW5kCisvLyAgICByZXR1cm5zIGZhbHNlICh3aXRoIGRlc3QgZW1wdHkpIGlmIHNyYyBjb250YWlucyBpbnZhbGlkIGNoYXJzOyBmb3IKKy8vICAgIHRoaXMgdmVyc2lvbiBzcmMgYW5kIGRlc3QgbXVzdCBiZSBkaWZmZXJlbnQgc3RyaW5ncy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0xJQlBST1RPQlVGX0VYUE9SVCBpbnQgV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGNvbnN0IGNoYXIqIHNyYywgaW50IHNsZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyKiBkZXN0LCBpbnQgc3pkZXN0KTsKK0xJQlBST1RPQlVGX0VYUE9SVCBib29sIFdlYlNhZmVCYXNlNjRVbmVzY2FwZShTdHJpbmdQaWVjZSBzcmMsIHN0cmluZyogZGVzdCk7CisKKy8vIFJldHVybiB0aGUgbGVuZ3RoIHRvIHVzZSBmb3IgdGhlIG91dHB1dCBidWZmZXIgZ2l2ZW4gdG8gdGhlIGJhc2U2NCBlc2NhcGUKKy8vIHJvdXRpbmVzLiBNYWtlIHN1cmUgdG8gdXNlIHRoZSBzYW1lIHZhbHVlIGZvciBkb19wYWRkaW5nIGluIGJvdGguCisvLyBUaGlzIGZ1bmN0aW9uIG1heSByZXR1cm4gaW5jb3JyZWN0IHJlc3VsdHMgaWYgZ2l2ZW4gaW5wdXRfbGVuIHZhbHVlcyB0aGF0CisvLyBhcmUgZXh0cmVtZWx5IGhpZ2gsIHdoaWNoIHNob3VsZCBoYXBwZW4gcmFyZWx5LgorTElCUFJPVE9CVUZfRVhQT1JUIGludCBDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKGludCBpbnB1dF9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBkb19wYWRkaW5nKTsKKy8vIFVzZSB0aGlzIHZlcnNpb24gd2hlbiBjYWxsaW5nIEJhc2U2NEVzY2FwZSB3aXRob3V0IGEgZG9fcGFkZGluZyBhcmcuCitMSUJQUk9UT0JVRl9FWFBPUlQgaW50IENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oaW50IGlucHV0X2xlbik7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJhc2U2NEVzY2FwZSgpCisvLyBXZWJTYWZlQmFzZTY0RXNjYXBlKCkKKy8vICAgIEVuY29kZSAic3JjIiB0byAiZGVzdCIgdXNpbmcgYmFzZTY0IGVuY29kaW5nLgorLy8gICAgc3JjIGlzIG5vdCBudWxsIHRlcm1pbmF0ZWQsIGluc3RlYWQgc3BlY2lmeSBsZW4uCisvLyAgICAnZGVzdCcgc2hvdWxkIGhhdmUgYXQgbGVhc3QgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbigpIGxlbmd0aC4KKy8vICAgIFJFVFVSTlMgdGhlIGxlbmd0aCBvZiBkZXN0LgorLy8gICAgVGhlIFdlYlNhZmUgdmFyaWF0aW9uIHVzZSAnLScgaW5zdGVhZCBvZiAnKycgYW5kICdfJyBpbnN0ZWFkIG9mICcvJworLy8gICAgc28gdGhhdCB3ZSBjYW4gcGxhY2UgdGhlIG91dCBpbiB0aGUgVVJMIG9yIGNvb2tpZXMgd2l0aG91dCBoYXZpbmcKKy8vICAgIHRvIGVzY2FwZSB0aGVtLiAgSXQgYWxzbyBoYXMgYW4gZXh0cmEgcGFyYW1ldGVyICJkb19wYWRkaW5nIiwKKy8vICAgIHdoaWNoIHdoZW4gc2V0IHRvIGZhbHNlIHdpbGwgcHJldmVudCBwYWRkaW5nIHdpdGggIj0iLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorTElCUFJPVE9CVUZfRVhQT1JUIGludCBCYXNlNjRFc2NhcGUoY29uc3QgdW5zaWduZWQgY2hhciogc3JjLCBpbnQgc2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIqIGRlc3QsIGludCBzemRlc3QpOworTElCUFJPVE9CVUZfRVhQT1JUIGludCBXZWJTYWZlQmFzZTY0RXNjYXBlKAorICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHNsZW4sIGNoYXIqIGRlc3QsCisgICAgaW50IHN6ZGVzdCwgYm9vbCBkb19wYWRkaW5nKTsKKy8vIEVuY29kZSBzcmMgaW50byBkZXN0IHdpdGggcGFkZGluZy4KK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIEJhc2U2NEVzY2FwZShTdHJpbmdQaWVjZSBzcmMsIHN0cmluZyogZGVzdCk7CisvLyBFbmNvZGUgc3JjIGludG8gZGVzdCB3ZWItc2FmZWx5IHdpdGhvdXQgcGFkZGluZy4KK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIFdlYlNhZmVCYXNlNjRFc2NhcGUoU3RyaW5nUGllY2Ugc3JjLCBzdHJpbmcqIGRlc3QpOworLy8gRW5jb2RlIHNyYyBpbnRvIGRlc3Qgd2ViLXNhZmVseSB3aXRoIHBhZGRpbmcuCitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBXZWJTYWZlQmFzZTY0RXNjYXBlV2l0aFBhZGRpbmcoU3RyaW5nUGllY2Ugc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogZGVzdCk7CisKK0xJQlBST1RPQlVGX0VYUE9SVCB2b2lkIEJhc2U2NEVzY2FwZShjb25zdCB1bnNpZ25lZCBjaGFyKiBzcmMsIGludCBzenNyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGRlc3QsIGJvb2wgZG9fcGFkZGluZyk7CitMSUJQUk9UT0JVRl9FWFBPUlQgdm9pZCBXZWJTYWZlQmFzZTY0RXNjYXBlKGNvbnN0IHVuc2lnbmVkIGNoYXIqIHNyYywgaW50IHN6c3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqIGRlc3QsIGJvb2wgZG9fcGFkZGluZyk7CisKK2lubGluZSBib29sIElzVmFsaWRDb2RlUG9pbnQodWludDMyIGNvZGVfcG9pbnQpIHsKKyAgcmV0dXJuIGNvZGVfcG9pbnQgPCAweEQ4MDAgfHwKKyAgICAgICAgIChjb2RlX3BvaW50ID49IDB4RTAwMCAmJiBjb2RlX3BvaW50IDw9IDB4MTBGRkZGKTsKK30KKworc3RhdGljIGNvbnN0IGludCBVVEZtYXggPSA0OworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW5jb2RlQXNVVEY4Q2hhcigpCisvLyAgSGVscGVyIHRvIGFwcGVuZCBhIFVuaWNvZGUgY29kZSBwb2ludCB0byBhIHN0cmluZyBhcyBVVEY4LCB3aXRob3V0IGJyaW5naW5nCisvLyAgaW4gYW55IGV4dGVybmFsIGRlcGVuZGVuY2llcy4gVGhlIG91dHB1dCBidWZmZXIgbXVzdCBiZSBhcyBsZWFzdCA0IGJ5dGVzCisvLyAgbGFyZ2UuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSUJQUk9UT0JVRl9FWFBPUlQgaW50IEVuY29kZUFzVVRGOENoYXIodWludDMyIGNvZGVfcG9pbnQsIGNoYXIqIG91dHB1dCk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFVURjhGaXJzdExldHRlck51bUJ5dGVzKCkKKy8vICAgTGVuZ3RoIG9mIHRoZSBmaXJzdCBVVEYtOCBjaGFyYWN0ZXIuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitMSUJQUk9UT0JVRl9FWFBPUlQgaW50IFVURjhGaXJzdExldHRlck51bUJ5dGVzKGNvbnN0IGNoYXIqIHNyYywgaW50IGxlbik7CiAKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQogCiAjZW5kaWYgIC8vIEdPT0dMRV9QUk9UT0JVRl9TVFVCU19TVFJVVElMX0hfXwotCi0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsX3VuaXR0ZXN0LmNjCmluZGV4IGI5YzkyNTMuLjVkNjJmYzQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWxfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbF91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsOSArMzIsMTUgQEAKIAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJ1dGlsLmg+CiAKKyNpbmNsdWRlIDxsb2NhbGUuaD4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KICNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgotI2luY2x1ZGUgPGxvY2FsZS5oPgorCisjaWZkZWYgX1dJTjMyCisjZGVmaW5lIHNucHJpbnRmIF9zbnByaW50ZgorI2VuZGlmCiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTUxLDMzICs1Nyw3NTQgQEAKICAgLy8gU2V0IHRoZSBsb2NhbGUgdG8gIkMiLgogICBBU1NFUlRfVFJVRShzZXRsb2NhbGUoTENfTlVNRVJJQywgIkMiKSAhPSBOVUxMKTsKIAotICBFWFBFQ1RfRVEoMS41LCBOb0xvY2FsZVN0cnRvZCgiMS41IiwgTlVMTCkpOwogICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUR0b2EoMS41KSk7CiAgIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRnRvYSgxLjUpKTsKIAotICAvLyBWZXJpZnkgdGhhdCB0aGUgZW5kcHRyIGlzIHNldCBjb3JyZWN0bHkgZXZlbiBpZiBub3QgYWxsIHRleHQgd2FzIHBhcnNlZC4KLSAgY29uc3QgY2hhciogdGV4dCA9ICIxLjVmIjsKLSAgY2hhciogZW5kcHRyOwotICBFWFBFQ1RfRVEoMS41LCBOb0xvY2FsZVN0cnRvZCh0ZXh0LCAmZW5kcHRyKSk7Ci0gIEVYUEVDVF9FUSgzLCBlbmRwdHIgLSB0ZXh0KTsKLQogICBpZiAoc2V0bG9jYWxlKExDX05VTUVSSUMsICJlc19FUyIpID09IE5VTEwgJiYKICAgICAgIHNldGxvY2FsZShMQ19OVU1FUklDLCAiZXNfRVMudXRmOCIpID09IE5VTEwpIHsKICAgICAvLyBTb21lIHN5c3RlbXMgbWF5IG5vdCBoYXZlIHRoZSBkZXNpcmVkIGxvY2FsZSBhdmFpbGFibGUuCiAgICAgR09PR0xFX0xPRyhXQVJOSU5HKQogICAgICAgPDwgIkNvdWxkbid0IHNldCBsb2NhbGUgdG8gZXNfRVMuICBTa2lwcGluZyB0aGlzIHRlc3QuIjsKICAgfSBlbHNlIHsKLSAgICBFWFBFQ1RfRVEoMS41LCBOb0xvY2FsZVN0cnRvZCgiMS41IiwgTlVMTCkpOwogICAgIEVYUEVDVF9FUSgiMS41IiwgU2ltcGxlRHRvYSgxLjUpKTsKICAgICBFWFBFQ1RfRVEoIjEuNSIsIFNpbXBsZUZ0b2EoMS41KSk7Ci0gICAgRVhQRUNUX0VRKDEuNSwgTm9Mb2NhbGVTdHJ0b2QodGV4dCwgJmVuZHB0cikpOwotICAgIEVYUEVDVF9FUSgzLCBlbmRwdHIgLSB0ZXh0KTsKICAgfQogCiAgIC8vIFJldHVybiB0byBvcmlnaW5hbCBsb2NhbGUuCiAgIHNldGxvY2FsZShMQ19OVU1FUklDLCBvbGRfbG9jYWxlLmNfc3RyKCkpOwogfQogCisjZGVmaW5lIEVYUEVDVF9FUV9BUlJBWShsZW4sIHgsIHksIG1zZykgICAgICAgICAgICAgICAgICAgICBcCisgIGZvciAoaW50IGogPSAwOyBqIDwgbGVuOyArK2opIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgRVhQRUNUX0VRKHhbal0sIHlbal0pIDw8ICIiICMgeCA8PCAiICE9ICIgIyB5ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIDw8ICIgYnl0ZSAiIDw8IGogPDwgIjogIiA8PCBtc2c7ICBcCisgIH0KKworc3RhdGljIHN0cnVjdCB7CisgIGludCBwbGFpbl9sZW5ndGg7CisgIGNvbnN0IGNoYXIqIHBsYWludGV4dDsKKyAgY29uc3QgY2hhciogY3lwaGVydGV4dDsKK30gYmFzZTY0X3Rlc3RzW10gPSB7CisgIC8vIEVtcHR5IHN0cmluZy4KKyAgeyAwLCAiIiwgIiJ9LAorCisgIC8vIEJhc2ljIGJpdCBwYXR0ZXJuczsKKyAgLy8gdmFsdWVzIG9idGFpbmVkIHdpdGggImVjaG8gLW4gJy4uLicgfCB1dWVuY29kZSAtbSB0ZXN0IgorCisgIHsgMSwgIlwwMDAiLCAiQUE9PSIgfSwKKyAgeyAxLCAiXDAwMSIsICJBUT09IiB9LAorICB7IDEsICJcMDAyIiwgIkFnPT0iIH0sCisgIHsgMSwgIlwwMDQiLCAiQkE9PSIgfSwKKyAgeyAxLCAiXDAxMCIsICJDQT09IiB9LAorICB7IDEsICJcMDIwIiwgIkVBPT0iIH0sCisgIHsgMSwgIlwwNDAiLCAiSUE9PSIgfSwKKyAgeyAxLCAiXDEwMCIsICJRQT09IiB9LAorICB7IDEsICJcMjAwIiwgImdBPT0iIH0sCisKKyAgeyAxLCAiXDM3NyIsICIvdz09IiB9LAorICB7IDEsICJcMzc2IiwgIi9nPT0iIH0sCisgIHsgMSwgIlwzNzUiLCAiL1E9PSIgfSwKKyAgeyAxLCAiXDM3MyIsICIrdz09IiB9LAorICB7IDEsICJcMzY3IiwgIjl3PT0iIH0sCisgIHsgMSwgIlwzNTciLCAiN3c9PSIgfSwKKyAgeyAxLCAiXDMzNyIsICIzdz09IiB9LAorICB7IDEsICJcMjc3IiwgInZ3PT0iIH0sCisgIHsgMSwgIlwxNzciLCAiZnc9PSIgfSwKKyAgeyAyLCAiXDAwMFwwMDAiLCAiQUFBPSIgfSwKKyAgeyAyLCAiXDAwMFwwMDEiLCAiQUFFPSIgfSwKKyAgeyAyLCAiXDAwMFwwMDIiLCAiQUFJPSIgfSwKKyAgeyAyLCAiXDAwMFwwMDQiLCAiQUFRPSIgfSwKKyAgeyAyLCAiXDAwMFwwMTAiLCAiQUFnPSIgfSwKKyAgeyAyLCAiXDAwMFwwMjAiLCAiQUJBPSIgfSwKKyAgeyAyLCAiXDAwMFwwNDAiLCAiQUNBPSIgfSwKKyAgeyAyLCAiXDAwMFwxMDAiLCAiQUVBPSIgfSwKKyAgeyAyLCAiXDAwMFwyMDAiLCAiQUlBPSIgfSwKKyAgeyAyLCAiXDAwMVwwMDAiLCAiQVFBPSIgfSwKKyAgeyAyLCAiXDAwMlwwMDAiLCAiQWdBPSIgfSwKKyAgeyAyLCAiXDAwNFwwMDAiLCAiQkFBPSIgfSwKKyAgeyAyLCAiXDAxMFwwMDAiLCAiQ0FBPSIgfSwKKyAgeyAyLCAiXDAyMFwwMDAiLCAiRUFBPSIgfSwKKyAgeyAyLCAiXDA0MFwwMDAiLCAiSUFBPSIgfSwKKyAgeyAyLCAiXDEwMFwwMDAiLCAiUUFBPSIgfSwKKyAgeyAyLCAiXDIwMFwwMDAiLCAiZ0FBPSIgfSwKKworICB7IDIsICJcMzc3XDM3NyIsICIvLzg9IiB9LAorICB7IDIsICJcMzc3XDM3NiIsICIvLzQ9IiB9LAorICB7IDIsICJcMzc3XDM3NSIsICIvLzA9IiB9LAorICB7IDIsICJcMzc3XDM3MyIsICIvL3M9IiB9LAorICB7IDIsICJcMzc3XDM2NyIsICIvL2M9IiB9LAorICB7IDIsICJcMzc3XDM1NyIsICIvKzg9IiB9LAorICB7IDIsICJcMzc3XDMzNyIsICIvOTg9IiB9LAorICB7IDIsICJcMzc3XDI3NyIsICIvNzg9IiB9LAorICB7IDIsICJcMzc3XDE3NyIsICIvMzg9IiB9LAorICB7IDIsICJcMzc2XDM3NyIsICIvdjg9IiB9LAorICB7IDIsICJcMzc1XDM3NyIsICIvZjg9IiB9LAorICB7IDIsICJcMzczXDM3NyIsICIrLzg9IiB9LAorICB7IDIsICJcMzY3XDM3NyIsICI5Lzg9IiB9LAorICB7IDIsICJcMzU3XDM3NyIsICI3Lzg9IiB9LAorICB7IDIsICJcMzM3XDM3NyIsICIzLzg9IiB9LAorICB7IDIsICJcMjc3XDM3NyIsICJ2Lzg9IiB9LAorICB7IDIsICJcMTc3XDM3NyIsICJmLzg9IiB9LAorCisgIHsgMywgIlwwMDBcMDAwXDAwMCIsICJBQUFBIiB9LAorICB7IDMsICJcMDAwXDAwMFwwMDEiLCAiQUFBQiIgfSwKKyAgeyAzLCAiXDAwMFwwMDBcMDAyIiwgIkFBQUMiIH0sCisgIHsgMywgIlwwMDBcMDAwXDAwNCIsICJBQUFFIiB9LAorICB7IDMsICJcMDAwXDAwMFwwMTAiLCAiQUFBSSIgfSwKKyAgeyAzLCAiXDAwMFwwMDBcMDIwIiwgIkFBQVEiIH0sCisgIHsgMywgIlwwMDBcMDAwXDA0MCIsICJBQUFnIiB9LAorICB7IDMsICJcMDAwXDAwMFwxMDAiLCAiQUFCQSIgfSwKKyAgeyAzLCAiXDAwMFwwMDBcMjAwIiwgIkFBQ0EiIH0sCisgIHsgMywgIlwwMDBcMDAxXDAwMCIsICJBQUVBIiB9LAorICB7IDMsICJcMDAwXDAwMlwwMDAiLCAiQUFJQSIgfSwKKyAgeyAzLCAiXDAwMFwwMDRcMDAwIiwgIkFBUUEiIH0sCisgIHsgMywgIlwwMDBcMDEwXDAwMCIsICJBQWdBIiB9LAorICB7IDMsICJcMDAwXDAyMFwwMDAiLCAiQUJBQSIgfSwKKyAgeyAzLCAiXDAwMFwwNDBcMDAwIiwgIkFDQUEiIH0sCisgIHsgMywgIlwwMDBcMTAwXDAwMCIsICJBRUFBIiB9LAorICB7IDMsICJcMDAwXDIwMFwwMDAiLCAiQUlBQSIgfSwKKyAgeyAzLCAiXDAwMVwwMDBcMDAwIiwgIkFRQUEiIH0sCisgIHsgMywgIlwwMDJcMDAwXDAwMCIsICJBZ0FBIiB9LAorICB7IDMsICJcMDA0XDAwMFwwMDAiLCAiQkFBQSIgfSwKKyAgeyAzLCAiXDAxMFwwMDBcMDAwIiwgIkNBQUEiIH0sCisgIHsgMywgIlwwMjBcMDAwXDAwMCIsICJFQUFBIiB9LAorICB7IDMsICJcMDQwXDAwMFwwMDAiLCAiSUFBQSIgfSwKKyAgeyAzLCAiXDEwMFwwMDBcMDAwIiwgIlFBQUEiIH0sCisgIHsgMywgIlwyMDBcMDAwXDAwMCIsICJnQUFBIiB9LAorCisgIHsgMywgIlwzNzdcMzc3XDM3NyIsICIvLy8vIiB9LAorICB7IDMsICJcMzc3XDM3N1wzNzYiLCAiLy8vKyIgfSwKKyAgeyAzLCAiXDM3N1wzNzdcMzc1IiwgIi8vLzkiIH0sCisgIHsgMywgIlwzNzdcMzc3XDM3MyIsICIvLy83IiB9LAorICB7IDMsICJcMzc3XDM3N1wzNjciLCAiLy8vMyIgfSwKKyAgeyAzLCAiXDM3N1wzNzdcMzU3IiwgIi8vL3YiIH0sCisgIHsgMywgIlwzNzdcMzc3XDMzNyIsICIvLy9mIiB9LAorICB7IDMsICJcMzc3XDM3N1wyNzciLCAiLy8rLyIgfSwKKyAgeyAzLCAiXDM3N1wzNzdcMTc3IiwgIi8vOS8iIH0sCisgIHsgMywgIlwzNzdcMzc2XDM3NyIsICIvLzcvIiB9LAorICB7IDMsICJcMzc3XDM3NVwzNzciLCAiLy8zLyIgfSwKKyAgeyAzLCAiXDM3N1wzNzNcMzc3IiwgIi8vdi8iIH0sCisgIHsgMywgIlwzNzdcMzY3XDM3NyIsICIvL2YvIiB9LAorICB7IDMsICJcMzc3XDM1N1wzNzciLCAiLysvLyIgfSwKKyAgeyAzLCAiXDM3N1wzMzdcMzc3IiwgIi85Ly8iIH0sCisgIHsgMywgIlwzNzdcMjc3XDM3NyIsICIvNy8vIiB9LAorICB7IDMsICJcMzc3XDE3N1wzNzciLCAiLzMvLyIgfSwKKyAgeyAzLCAiXDM3NlwzNzdcMzc3IiwgIi92Ly8iIH0sCisgIHsgMywgIlwzNzVcMzc3XDM3NyIsICIvZi8vIiB9LAorICB7IDMsICJcMzczXDM3N1wzNzciLCAiKy8vLyIgfSwKKyAgeyAzLCAiXDM2N1wzNzdcMzc3IiwgIjkvLy8iIH0sCisgIHsgMywgIlwzNTdcMzc3XDM3NyIsICI3Ly8vIiB9LAorICB7IDMsICJcMzM3XDM3N1wzNzciLCAiMy8vLyIgfSwKKyAgeyAzLCAiXDI3N1wzNzdcMzc3IiwgInYvLy8iIH0sCisgIHsgMywgIlwxNzdcMzc3XDM3NyIsICJmLy8vIiB9LAorCisgIC8vIFJhbmRvbSBudW1iZXJzOiB2YWx1ZXMgb2J0YWluZWQgd2l0aAorICAvLworICAvLyAgIyEgL2Jpbi9iYXNoCisgIC8vICBkZCBicz0kMSBjb3VudD0xIGlmPS9kZXYvcmFuZG9tIG9mPS90bXAvYmFyLnJhbmRvbQorICAvLyAgb2QgLU4gJDEgLXQgbzEgL3RtcC9iYXIucmFuZG9tCisgIC8vICB1dWVuY29kZSAtbSB0ZXN0IDwgL3RtcC9iYXIucmFuZG9tCisgIC8vCisgIC8vIHdoZXJlICQxIGlzIHRoZSBudW1iZXIgb2YgYnl0ZXMgKDIsIDMpCisKKyAgeyAyLCAiXDI0M1wzNjEiLCAiby9FPSIgfSwKKyAgeyAyLCAiXDAyNFwxNjciLCAiRkhjPSIgfSwKKyAgeyAyLCAiXDMxM1wyNTIiLCAieTZvPSIgfSwKKyAgeyAyLCAiXDA0NlwwNDEiLCAiSmlFPSIgfSwKKyAgeyAyLCAiXDE0NVwyMzYiLCAiWlo0PSIgfSwKKyAgeyAyLCAiXDI1NFwzMjUiLCAick5VPSIgfSwKKyAgeyAyLCAiXDA2MVwzMzAiLCAiTWRnPSIgfSwKKyAgeyAyLCAiXDI0NVwwMzIiLCAicFJvPSIgfSwKKyAgeyAyLCAiXDAwNlwwMDAiLCAiQmdBPSIgfSwKKyAgeyAyLCAiXDM3NVwxMzEiLCAiL1ZrPSIgfSwKKyAgeyAyLCAiXDMwM1wyMTAiLCAidzRnPSIgfSwKKyAgeyAyLCAiXDA0MFwwMzciLCAiSUI4PSIgfSwKKyAgeyAyLCAiXDI2MVwzNzIiLCAic2ZvPSIgfSwKKyAgeyAyLCAiXDMzNVwwMTQiLCAiM1F3PSIgfSwKKyAgeyAyLCAiXDIzM1wyMTciLCAibTQ4PSIgfSwKKyAgeyAyLCAiXDM3M1wwNTYiLCAiK3k0PSIgfSwKKyAgeyAyLCAiXDI0N1wyMzIiLCAicDVvPSIgfSwKKyAgeyAyLCAiXDEwN1wwNTMiLCAiUnlzPSIgfSwKKyAgeyAyLCAiXDIwNFwwNzciLCAiaEQ4PSIgfSwKKyAgeyAyLCAiXDI3NlwyMTEiLCAidm9rPSIgfSwKKyAgeyAyLCAiXDMxM1wxMTAiLCAieTBnPSIgfSwKKyAgeyAyLCAiXDM2M1wzNzYiLCAiOC80PSIgfSwKKyAgeyAyLCAiXDI1MVwyMzQiLCAicVp3PSIgfSwKKyAgeyAyLCAiXDEwM1wyNjIiLCAiUTdJPSIgfSwKKyAgeyAyLCAiXDE0MlwzMTIiLCAiWXNvPSIgfSwKKyAgeyAyLCAiXDA2N1wyMTEiLCAiTjRrPSIgfSwKKyAgeyAyLCAiXDIyMFwwMDEiLCAia0FFPSIgfSwKKyAgeyAyLCAiXDE1MlwyNDAiLCAiYXFBPSIgfSwKKyAgeyAyLCAiXDM2N1wwNjEiLCAiOXpFPSIgfSwKKyAgeyAyLCAiXDEzM1wyNTUiLCAiVzYwPSIgfSwKKyAgeyAyLCAiXDE3NlwwMzUiLCAiZmgwPSIgfSwKKyAgeyAyLCAiXDAzMlwyMzEiLCAiR3BrPSIgfSwKKworICB7IDMsICJcMDEzXDAwN1wxNDQiLCAiQ3dkayIgfSwKKyAgeyAzLCAiXDAzMFwxMTJcMTA2IiwgIkdFcEciIH0sCisgIHsgMywgIlwwNDdcMzI1XDA0NiIsICJKOVVtIiB9LAorICB7IDMsICJcMzEwXDE2MFwwMjIiLCAieUhBUyIgfSwKKyAgeyAzLCAiXDEzMVwxMDBcMjM3IiwgIldVQ2YiIH0sCisgIHsgMywgIlwwNjRcMzQyXDEzNCIsICJOT0pjIiB9LAorICB7IDMsICJcMDEwXDE3N1wwMDQiLCAiQ0g4RSIgfSwKKyAgeyAzLCAiXDM0NVwxNDdcMjA1IiwgIjVXZUYiIH0sCisgIHsgMywgIlwzMDBcMzQzXDM2MCIsICJ3T1B3IiB9LAorICB7IDMsICJcMDYxXDI0MFwyMDEiLCAiTWFDQiIgfSwKKyAgeyAzLCAiXDIyNVwzMzNcMDQ0IiwgImxkc2siIH0sCisgIHsgMywgIlwyMTVcMTM3XDM1MiIsICJqVi9xIiB9LAorICB7IDMsICJcMzcxXDE0N1wxNjAiLCAiK1dkdyIgfSwKKyAgeyAzLCAiXDAzMFwzMjBcMDUxIiwgIkdOQXAiIH0sCisgIHsgMywgIlwwNDRcMTc0XDI0MSIsICJKSHloIiB9LAorICB7IDMsICJcMjYwXDEyN1wwMzciLCAic0ZjZiIgfSwKKyAgeyAzLCAiXDExMVwwNDVcMDMzIiwgIlNTVWIiIH0sCisgIHsgMywgIlwyMDJcMTE0XDEwNyIsICJna3hIIiB9LAorICB7IDMsICJcMDU3XDM3MVwwNDIiLCAiTC9raSIgfSwKKyAgeyAzLCAiXDIyM1wyNDdcMjQ0IiwgIms2ZWsiIH0sCisgIHsgMywgIlwwNDdcMjE2XDE0NCIsICJKNDVrIiB9LAorICB7IDMsICJcMjAzXDA3MFwzMjciLCAiZ3pqWCIgfSwKKyAgeyAzLCAiXDI0N1wxNDBcMDcyIiwgInAyQTYiIH0sCisgIHsgMywgIlwxMjRcMTE1XDExNiIsICJWRTFPIiB9LAorICB7IDMsICJcMTU3XDE2MlwwNTAiLCAiYjNJbyIgfSwKKyAgeyAzLCAiXDM1N1wyMjNcMDA0IiwgIjc1TUUiIH0sCisgIHsgMywgIlwwNTJcMTE3XDE1NiIsICJLazl1IiB9LAorICB7IDMsICJcMzQ3XDE1NFwwMDAiLCAiNTJ3QSIgfSwKKyAgeyAzLCAiXDMwM1wwMTJcMTQyIiwgInd3cGkiIH0sCisgIHsgMywgIlwwNjBcMDM1XDM2MiIsICJNQjN5IiB9LAorICB7IDMsICJcMTMwXDIyNlwzNjEiLCAiV0pieCIgfSwKKyAgeyAzLCAiXDE3M1wwMTNcMDcxIiwgImV3czUiIH0sCisgIHsgMywgIlwzMzZcMDA0XDAyNyIsICIzZ1FYIiB9LAorICB7IDMsICJcMzU3XDM2NlwyMzQiLCAiNy9hYyIgfSwKKyAgeyAzLCAiXDM1M1wzMDRcMTExIiwgIjY4UkoiIH0sCisgIHsgMywgIlwwMjRcMjY0XDEzMSIsICJGTFJaIiB9LAorICB7IDMsICJcMDc1XDExNFwyNTEiLCAiUFV5cCIgfSwKKyAgeyAzLCAiXDMxNVwwMzFcMjI1IiwgInpSbVYiIH0sCisgIHsgMywgIlwxNTRcMjAxXDI3NiIsICJiSUcrIiB9LAorICB7IDMsICJcMjAwXDA2NlwwNzIiLCAiZ0RZNiIgfSwKKyAgeyAzLCAiXDE0MlwzNTBcMjY3IiwgIll1aTMiIH0sCisgIHsgMywgIlwwMzNcMDAwXDE2NiIsICJHd0IyIiB9LAorICB7IDMsICJcMjEwXDA1NVwwNzciLCAiaUMwLyIgfSwKKyAgeyAzLCAiXDM0MVwwMzdcMTI0IiwgIjRSOVUiIH0sCisgIHsgMywgIlwxNjFcMTAzXDE1MiIsICJjVU5xIiB9LAorICB7IDMsICJcMjcwXDE0MlwxMzEiLCAidUdKWiIgfSwKKyAgeyAzLCAiXDMzN1wwNzZcMDc0IiwgIjN6NDgiIH0sCisgIHsgMywgIlwzNzVcMTA2XDM2MiIsICIvVWJ5IiB9LAorICB7IDMsICJcMjI3XDMwMVwxMjciLCAibDhGWCIgfSwKKyAgeyAzLCAiXDM0MFwwMDJcMjM0IiwgIjRBS2MiIH0sCisgIHsgMywgIlwxMjFcMDY0XDAzMyIsICJVVFFiIiB9LAorICB7IDMsICJcMTU3XDEzNFwxNDMiLCAiYjF4aiIgfSwKKyAgeyAzLCAiXDI0N1wwNTVcMzI3IiwgInB5M1giIH0sCisgIHsgMywgIlwzNDBcMTQyXDAwNSIsICI0R0lGIiB9LAorICB7IDMsICJcMDYwXDI2MFwxNDMiLCAiTUxCaiIgfSwKKyAgeyAzLCAiXDA3NVwyMDNcMTcwIiwgIlBZTjQiIH0sCisgIHsgMywgIlwxNDNcMTYwXDAxNiIsICJZM0FPIiB9LAorICB7IDMsICJcMzEzXDAxM1wwNjMiLCAieXdzeiIgfSwKKyAgeyAzLCAiXDE3NFwyMzZcMTM1IiwgImZKNWQiIH0sCisgIHsgMywgIlwxMDNcMDQ3XDAyNiIsICJReWNXIiB9LAorICB7IDMsICJcMzY1XDAwNVwzNDMiLCAiOVFYaiIgfSwKKyAgeyAzLCAiXDI3MVwxNjBcMjIzIiwgInVYQ1QiIH0sCisgIHsgMywgIlwzNjJcMjU1XDE3MiIsICI4cTE2IiB9LAorICB7IDMsICJcMTEzXDAxMlwwMTUiLCAiU3dvTiIgfSwKKworICAvLyB2YXJpb3VzIGxlbmd0aHMsIGdlbmVyYXRlZCBieSB0aGlzIHB5dGhvbiBzY3JpcHQ6CisgIC8vCisgIC8vIGZyb20gc3RyaW5nIGltcG9ydCBsb3dlcmNhc2UgYXMgbGMKKyAgLy8gZm9yIGkgaW4gcmFuZ2UoMjcpOgorICAvLyAgIHByaW50ICd7ICUyZCwgIiVzIiwlcyAiJXMiIH0sJyAlIChpLCBsY1s6aV0sICcgJyAqICgyNi1pKSwKKyAgLy8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNbOmldLmVuY29kZSgnYmFzZTY0Jykuc3RyaXAoKSkKKworICB7ICAwLCAiIiwgICAgICAgICAgICAgICAgICAgICAgICAgICAiIiB9LAorICB7ICAxLCAiYSIsICAgICAgICAgICAgICAgICAgICAgICAgICAiWVE9PSIgfSwKKyAgeyAgMiwgImFiIiwgICAgICAgICAgICAgICAgICAgICAgICAgIllXST0iIH0sCisgIHsgIDMsICJhYmMiLCAgICAgICAgICAgICAgICAgICAgICAgICJZV0pqIiB9LAorICB7ICA0LCAiYWJjZCIsICAgICAgICAgICAgICAgICAgICAgICAiWVdKalpBPT0iIH0sCisgIHsgIDUsICJhYmNkZSIsICAgICAgICAgICAgICAgICAgICAgICJZV0pqWkdVPSIgfSwKKyAgeyAgNiwgImFiY2RlZiIsICAgICAgICAgICAgICAgICAgICAgIllXSmpaR1ZtIiB9LAorICB7ICA3LCAiYWJjZGVmZyIsICAgICAgICAgICAgICAgICAgICAiWVdKalpHVm1adz09IiB9LAorICB7ICA4LCAiYWJjZGVmZ2giLCAgICAgICAgICAgICAgICAgICAiWVdKalpHVm1aMmc9IiB9LAorICB7ICA5LCAiYWJjZGVmZ2hpIiwgICAgICAgICAgICAgICAgICAiWVdKalpHVm1aMmhwIiB9LAorICB7IDEwLCAiYWJjZGVmZ2hpaiIsICAgICAgICAgICAgICAgICAiWVdKalpHVm1aMmhwYWc9PSIgfSwKKyAgeyAxMSwgImFiY2RlZmdoaWprIiwgICAgICAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtcz0iIH0sCisgIHsgMTIsICJhYmNkZWZnaGlqa2wiLCAgICAgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXRzIiB9LAorICB7IDEzLCAiYWJjZGVmZ2hpamtsbSIsICAgICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JRPT0iIH0sCisgIHsgMTQsICJhYmNkZWZnaGlqa2xtbiIsICAgICAgICAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc0PSIgfSwKKyAgeyAxNSwgImFiY2RlZmdoaWprbG1ubyIsICAgICAgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2IiB9LAorICB7IDE2LCAiYWJjZGVmZ2hpamtsbW5vcCIsICAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjQT09IiB9LAorICB7IDE3LCAiYWJjZGVmZ2hpamtsbW5vcHEiLCAgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEU9IiB9LAorICB7IDE4LCAiYWJjZGVmZ2hpamtsbW5vcHFyIiwgICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5IiB9LAorICB7IDE5LCAiYWJjZGVmZ2hpamtsbW5vcHFycyIsICAgICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5Y3c9PSIgfSwKKyAgeyAyMCwgImFiY2RlZmdoaWprbG1ub3BxcnN0IiwgICAgICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUT0iIH0sCisgIHsgMjEsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHUiLCAgICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxIiB9LAorICB7IDIyLCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1diIsICAgICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRnPT0iIH0sCisgIHsgMjMsICJhYmNkZWZnaGlqa2xtbm9wcXJzdHV2dyIsICAgICJZV0pqWkdWbVoyaHBhbXRzYlc1dmNIRnljM1IxZG5jPSIgfSwKKyAgeyAyNCwgImFiY2RlZmdoaWprbG1ub3BxcnN0dXZ3eCIsICAgIllXSmpaR1ZtWjJocGFtdHNiVzV2Y0hGeWMzUjFkbmQ0IiB9LAorICB7IDI1LCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eSIsICAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRuZDRlUT09IiB9LAorICB7IDI2LCAiYWJjZGVmZ2hpamtsbW5vcHFyc3R1dnd4eXoiLCAiWVdKalpHVm1aMmhwYW10c2JXNXZjSEZ5YzNSMWRuZDRlWG89IiB9LAorfTsKKworc3RhdGljIHN0cnVjdCB7CisgIGNvbnN0IGNoYXIqIHBsYWludGV4dDsKKyAgY29uc3QgY2hhciogY3lwaGVydGV4dDsKK30gYmFzZTY0X3N0cmluZ3NbXSA9IHsKKyAgLy8gU29tZSBnb29nbGUgcXVvdGVzCisgIC8vIEN5cGhlcnRleHQgY3JlYXRlZCB3aXRoICJ1dWVuY29kZSAoR05VIHNoYXJ1dGlscykgNC42LjMiCisgIC8vIChOb3RlIHRoYXQgd2UncmUgdGVzdGluZyB0aGUgd2Vic2FmZSBlbmNvZGluZywgdGhvdWdoLCBzbyBpZgorICAvLyB5b3UgYWRkIG1lc3NhZ2VzLCBiZSBzdXJlIHRvIHJ1biAidHIgLS0gJysvJyAnLV8nIiBvbiB0aGUgb3V0cHV0KQorICB7ICJJIHdhcyBhbHdheXMgZ29vZCBhdCBtYXRoIGFuZCBzY2llbmNlLCBhbmQgSSBuZXZlciByZWFsaXplZCAiCisgICAgInRoYXQgd2FzIHVudXN1YWwgb3Igc29tZWhvdyB1bmRlc2lyYWJsZS4gU28gb25lIG9mIHRoZSB0aGluZ3MgIgorICAgICJJIGNhcmUgYSBsb3QgYWJvdXQgaXMgaGVscGluZyB0byByZW1vdmUgdGhhdCBzdGlnbWEsICIKKyAgICAidG8gc2hvdyBnaXJscyB0aGF0IHlvdSBjYW4gYmUgZmVtaW5pbmUsIHlvdSBjYW4gbGlrZSB0aGUgdGhpbmdzICIKKyAgICAidGhhdCBnaXJscyBsaWtlLCBidXQgeW91IGNhbiBhbHNvIGJlIHJlYWxseSBnb29kIGF0IHRlY2hub2xvZ3kuICIKKyAgICAiWW91IGNhbiBiZSByZWFsbHkgZ29vZCBhdCBidWlsZGluZyB0aGluZ3MuIgorICAgICIgLSBNYXJpc3NhIE1leWVyLCBOZXdzd2VlaywgMjAxMC0xMi0yMiIgIlxuIiwKKworICAgICJTU0IzWVhNZ1lXeDNZWGx6SUdkdmIyUWdZWFFnYldGMGFDQmhibVFnYzJOcFpXNWpaU3dnWVc1a0lFa2ciCisgICAgImJtVjJaWElnY21WaGJHbDZaV1FnZEdoaGRDQjNZWE1nZFc1MWMzVmhiQ0J2Y2lCemIyMWxhRzkzSUhWdSIKKyAgICAiWkdWemFYSmhZbXhsTGlCVGJ5QnZibVVnYjJZZ2RHaGxJSFJvYVc1bmN5QkpJR05oY21VZ1lTQnNiM1FnIgorICAgICJZV0p2ZFhRZ2FYTWdhR1ZzY0dsdVp5QjBieUJ5WlcxdmRtVWdkR2hoZENCemRHbG5iV0VzSUhSdklITm8iCisgICAgImIzY2daMmx5YkhNZ2RHaGhkQ0I1YjNVZ1kyRnVJR0psSUdabGJXbHVhVzVsTENCNWIzVWdZMkZ1SUd4cCIKKyAgICAiYTJVZ2RHaGxJSFJvYVc1bmN5QjBhR0YwSUdkcGNteHpJR3hwYTJVc0lHSjFkQ0I1YjNVZ1kyRnVJR0ZzIgorICAgICJjMjhnWW1VZ2NtVmhiR3g1SUdkdmIyUWdZWFFnZEdWamFHNXZiRzluZVM0Z1dXOTFJR05oYmlCaVpTQnkiCisgICAgIlpXRnNiSGtnWjI5dlpDQmhkQ0JpZFdsc1pHbHVaeUIwYUdsdVozTXVJQzBnVFdGeWFYTnpZU0JOWlhsbCIKKyAgICAiY2l3Z1RtVjNjM2RsWldzc0lESXdNVEF0TVRJdE1qSUsiIH0sCisKKyAgeyAiVHlwaWNhbCBmaXJzdCB5ZWFyIGZvciBhIG5ldyBjbHVzdGVyOiAiCisgICAgIn4wLjUgb3ZlcmhlYXRpbmcgIgorICAgICJ+MSBQRFUgZmFpbHVyZSAiCisgICAgIn4xIHJhY2stbW92ZSAiCisgICAgIn4xIG5ldHdvcmsgcmV3aXJpbmcgIgorICAgICJ+MjAgcmFjayBmYWlsdXJlcyAiCisgICAgIn41IHJhY2tzIGdvIHdvbmt5ICIKKyAgICAifjggbmV0d29yayBtYWludGVuYW5jZXMgIgorICAgICJ+MTIgcm91dGVyIHJlbG9hZHMgIgorICAgICJ+MyByb3V0ZXIgZmFpbHVyZXMgIgorICAgICJ+ZG96ZW5zIG9mIG1pbm9yIDMwLXNlY29uZCBibGlwcyBmb3IgZG5zICIKKyAgICAifjEwMDAgaW5kaXZpZHVhbCBtYWNoaW5lIGZhaWx1cmVzICIKKyAgICAifnRob3VzYW5kcyBvZiBoYXJkIGRyaXZlIGZhaWx1cmVzICIKKyAgICAic2xvdyBkaXNrcywgYmFkIG1lbW9yeSwgbWlzY29uZmlndXJlZCBtYWNoaW5lcywgZmxha3kgbWFjaGluZXMsIGV0Yy4iCisgICAgIiAtIEplZmYgRGVhbiwgVGhlIEpveXMgb2YgUmVhbCBIYXJkd2FyZSIgIlxuIiwKKworICAgICJWSGx3YVdOaGJDQm1hWEp6ZENCNVpXRnlJR1p2Y2lCaElHNWxkeUJqYkhWemRHVnlPaUItTUM0MUlHOTIiCisgICAgIlpYSm9aV0YwYVc1bklINHhJRkJFVlNCbVlXbHNkWEpsSUg0eElISmhZMnN0Ylc5MlpTQi1NU0J1WlhSMyIKKyAgICAiYjNKcklISmxkMmx5YVc1bklINHlNQ0J5WVdOcklHWmhhV3gxY21WeklINDFJSEpoWTJ0eklHZHZJSGR2IgorICAgICJibXQ1SUg0NElHNWxkSGR2Y21zZ2JXRnBiblJsYm1GdVkyVnpJSDR4TWlCeWIzVjBaWElnY21Wc2IyRmsiCisgICAgImN5Qi1NeUJ5YjNWMFpYSWdabUZwYkhWeVpYTWdmbVJ2ZW1WdWN5QnZaaUJ0YVc1dmNpQXpNQzF6WldOdiIKKyAgICAiYm1RZ1lteHBjSE1nWm05eUlHUnVjeUItTVRBd01DQnBibVJwZG1sa2RXRnNJRzFoWTJocGJtVWdabUZwIgorICAgICJiSFZ5WlhNZ2ZuUm9iM1Z6WVc1a2N5QnZaaUJvWVhKa0lHUnlhWFpsSUdaaGFXeDFjbVZ6SUhOc2IzY2ciCisgICAgIlpHbHphM01zSUdKaFpDQnRaVzF2Y25rc0lHMXBjMk52Ym1acFozVnlaV1FnYldGamFHbHVaWE1zSUdacyIKKyAgICAiWVd0NUlHMWhZMmhwYm1WekxDQmxkR011SUMwZ1NtVm1aaUJFWldGdUxDQlVhR1VnU205NWN5QnZaaUJTIgorICAgICJaV0ZzSUVoaGNtUjNZWEpsQ2ciIH0sCisKKyAgeyAiSSdtIHRoZSBoZWFkIG9mIHRoZSB3ZWJzcGFtIHRlYW0gYXQgR29vZ2xlLiAgIgorICAgICJUaGF0IG1lYW5zIHRoYXQgaWYgeW91IHR5cGUgeW91ciBuYW1lIGludG8gR29vZ2xlIGFuZCBnZXQgcG9ybiBiYWNrLCAiCisgICAgIml0J3MgbXkgZmF1bHQuIFVubGVzcyB5b3UncmUgYSBwb3JuIHN0YXIsIGluIHdoaWNoIGNhc2UgcG9ybiBpcyBhICIKKyAgICAiY29tcGxldGVseSByZWFzb25hYmxlIHJlc3BvbnNlLiIKKyAgICAiIC0gTWF0dCBDdXR0cywgR29vZ2xlIFBsdXMiICJcbiIsCisKKyAgICAiU1NkdElIUm9aU0JvWldGa0lHOW1JSFJvWlNCM1pXSnpjR0Z0SUhSbFlXMGdZWFFnUjI5dloyeGxMaUFnIgorICAgICJWR2hoZENCdFpXRnVjeUIwYUdGMElHbG1JSGx2ZFNCMGVYQmxJSGx2ZFhJZ2JtRnRaU0JwYm5SdklFZHYiCisgICAgImIyZHNaU0JoYm1RZ1oyVjBJSEJ2Y200Z1ltRmpheXdnYVhRbmN5QnRlU0JtWVhWc2RDNGdWVzVzWlhOeiIKKyAgICAiSUhsdmRTZHlaU0JoSUhCdmNtNGdjM1JoY2l3Z2FXNGdkMmhwWTJnZ1kyRnpaU0J3YjNKdUlHbHpJR0VnIgorICAgICJZMjl0Y0d4bGRHVnNlU0J5WldGemIyNWhZbXhsSUhKbGMzQnZibk5sTGlBdElFMWhkSFFnUTNWMGRITXMiCisgICAgIklFZHZiMmRzWlNCUWJIVnpDZyIgfSwKKworICB7ICJJdCB3aWxsIHN0aWxsIGJlIGEgbG9uZyB0aW1lIGJlZm9yZSBtYWNoaW5lcyBhcHByb2FjaCBodW1hbiBpbnRlbGxpZ2VuY2UuICIKKyAgICAiQnV0IGx1Y2tpbHksIG1hY2hpbmVzIGRvbid0IGFjdHVhbGx5IGhhdmUgdG8gYmUgaW50ZWxsaWdlbnQ7ICIKKyAgICAidGhleSBqdXN0IGhhdmUgdG8gZmFrZSBpdC4gQWNjZXNzIHRvIGEgd2VhbHRoIG9mIGluZm9ybWF0aW9uLCAiCisgICAgImNvbWJpbmVkIHdpdGggYSBydWRpbWVudGFyeSBkZWNpc2lvbi1tYWtpbmcgY2FwYWNpdHksICIKKyAgICAiY2FuIG9mdGVuIGJlIGFsbW9zdCBhcyB1c2VmdWwuIE9mIGNvdXJzZSwgdGhlIHJlc3VsdHMgYXJlIGJldHRlciB5ZXQgIgorICAgICJ3aGVuIGNvdXBsZWQgd2l0aCBpbnRlbGxpZ2VuY2UuIEEgcmVmZXJlbmNlIGxpYnJhcmlhbiB3aXRoIGFjY2VzcyB0byAiCisgICAgImEgZ29vZCBzZWFyY2ggZW5naW5lIGlzIGEgZm9ybWlkYWJsZSB0b29sLiIKKyAgICAiIC0gQ3JhaWcgU2lsdmVyc3RlaW4sIFNpZW1lbnMgUGljdHVyZXMgb2YgdGhlIEZ1dHVyZSwgU3ByaW5nIDIwMDQiICJcbiIsCisKKyAgICAiU1hRZ2QybHNiQ0J6ZEdsc2JDQmlaU0JoSUd4dmJtY2dkR2x0WlNCaVpXWnZjbVVnYldGamFHbHVaWE1nIgorICAgICJZWEJ3Y205aFkyZ2dhSFZ0WVc0Z2FXNTBaV3hzYVdkbGJtTmxMaUJDZFhRZ2JIVmphMmxzZVN3Z2JXRmoiCisgICAgImFHbHVaWE1nWkc5dUozUWdZV04wZFdGc2JIa2dhR0YyWlNCMGJ5QmlaU0JwYm5SbGJHeHBaMlZ1ZERzZyIKKyAgICAiZEdobGVTQnFkWE4wSUdoaGRtVWdkRzhnWm1GclpTQnBkQzRnUVdOalpYTnpJSFJ2SUdFZ2QyVmhiSFJvIgorICAgICJJRzltSUdsdVptOXliV0YwYVc5dUxDQmpiMjFpYVc1bFpDQjNhWFJvSUdFZ2NuVmthVzFsYm5SaGNua2ciCisgICAgIlpHVmphWE5wYjI0dGJXRnJhVzVuSUdOaGNHRmphWFI1TENCallXNGdiMlowWlc0Z1ltVWdZV3h0YjNOMCIKKyAgICAiSUdGeklIVnpaV1oxYkM0Z1QyWWdZMjkxY25ObExDQjBhR1VnY21WemRXeDBjeUJoY21VZ1ltVjBkR1Z5IgorICAgICJJSGxsZENCM2FHVnVJR052ZFhCc1pXUWdkMmwwYUNCcGJuUmxiR3hwWjJWdVkyVXVJRUVnY21WbVpYSmwiCisgICAgImJtTmxJR3hwWW5KaGNtbGhiaUIzYVhSb0lHRmpZMlZ6Y3lCMGJ5QmhJR2R2YjJRZ2MyVmhjbU5vSUdWdSIKKyAgICAiWjJsdVpTQnBjeUJoSUdadmNtMXBaR0ZpYkdVZ2RHOXZiQzRnTFNCRGNtRnBaeUJUYVd4MlpYSnpkR1ZwIgorICAgICJiaXdnVTJsbGJXVnVjeUJRYVdOMGRYSmxjeUJ2WmlCMGFHVWdSblYwZFhKbExDQlRjSEpwYm1jZ01qQXciCisgICAgIk5BbyIgfSwKKworICAvLyBEZWdlbmVyYXRlIGVkZ2UgY2FzZQorICB7ICIiLAorICAgICIiIH0sCit9OworCitURVNUKEJhc2U2NCwgRXNjYXBlQW5kVW5lc2NhcGUpIHsKKyAgLy8gQ2hlY2sgdGhlIHNob3J0IHN0cmluZ3M7IHRoaXMgdGVzdHMgdGhlIG1hdGggKGFuZCBib3VuZGFyaWVzKQorICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihiYXNlNjRfdGVzdHMpIC8gc2l6ZW9mKGJhc2U2NF90ZXN0c1swXSk7ICsraSkgeworICAgIGNoYXIgZW5jb2RlX2J1ZmZlclsxMDBdOworICAgIGludCBlbmNvZGVfbGVuZ3RoOworICAgIGNoYXIgZGVjb2RlX2J1ZmZlclsxMDBdOworICAgIGludCBkZWNvZGVfbGVuZ3RoOworICAgIGludCBjeXBoZXJfbGVuZ3RoOworICAgIHN0cmluZyBkZWNvZGVfc3RyOworCisgICAgY29uc3QgdW5zaWduZWQgY2hhciogdW5zaWduZWRfcGxhaW50ZXh0ID0KKyAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdW5zaWduZWQgY2hhcio+KGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQpOworCisgICAgU3RyaW5nUGllY2UgcGxhaW50ZXh0KGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOworCisgICAgY3lwaGVyX2xlbmd0aCA9IHN0cmxlbihiYXNlNjRfdGVzdHNbaV0uY3lwaGVydGV4dCk7CisKKyAgICAvLyBUaGUgYmFzaWMgZXNjYXBlIGZ1bmN0aW9uOgorICAgIG1lbXNldChlbmNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZW5jb2RlX2J1ZmZlcikpOworICAgIGVuY29kZV9sZW5ndGggPSBCYXNlNjRFc2NhcGUodW5zaWduZWRfcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZW5jb2RlX2J1ZmZlcikpOworICAgIC8vICAgIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGN5cGhlcl9sZW5ndGgpOworICAgIC8vIFdvdWxkIGl0IGhhdmUgYmVlbiBva2F5IHRvIGFsbG9jYXRlIG9ubHkgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlTGVuKCk/CisgICAgRVhQRUNUX0VRKENhbGN1bGF0ZUJhc2U2NEVzY2FwZWRMZW4oYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCksCisgICAgICAgICAgICAgIGVuY29kZV9sZW5ndGgpOworCisgICAgLy8gICAgSXMgaXQgdGhlIGV4cGVjdGVkIGVuY29kZWQgdmFsdWU/CisgICAgQVNTRVJUX1NUUkVRKGVuY29kZV9idWZmZXIsIGJhc2U2NF90ZXN0c1tpXS5jeXBoZXJ0ZXh0KTsKKworICAgIC8vIElmIHdlIGVuY29kZSBpdCBpbnRvIGEgYnVmZmVyIG9mIGV4YWN0bHkgdGhlIHJpZ2h0IGxlbmd0aC4uLgorICAgIG1lbXNldChlbmNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZW5jb2RlX2J1ZmZlcikpOworICAgIGVuY29kZV9sZW5ndGggPSBCYXNlNjRFc2NhcGUodW5zaWduZWRfcGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoKTsKKyAgICAvLyAgICBJcyBpdCBzdGlsbCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPworICAgIEVYUEVDVF9FUShlbmNvZGVfbGVuZ3RoLCBjeXBoZXJfbGVuZ3RoKTsKKworICAgIC8vICAgIEFuZCBpcyB0aGUgdmFsdWUgc3RpbGwgY29ycmVjdD8gIChpLmUuLCBub3QgbG9zaW5nIHRoZSBsYXN0IGJ5dGUpCisgICAgRVhQRUNUX1NUUkVRKGVuY29kZV9idWZmZXIsIGJhc2U2NF90ZXN0c1tpXS5jeXBoZXJ0ZXh0KTsKKworICAgIC8vIElmIHdlIGRlY29kZSBpdCBiYWNrOgorICAgIGRlY29kZV9zdHIuY2xlYXIoKTsKKyAgICBFWFBFQ1RfVFJVRShCYXNlNjRVbmVzY2FwZSgKKyAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgY3lwaGVyX2xlbmd0aCksICZkZWNvZGVfc3RyKSk7CisKKyAgICAvLyAgICBJcyBpdCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPworICAgIEVYUEVDVF9FUShiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLCBkZWNvZGVfc3RyLmxlbmd0aCgpKTsKKworICAgIC8vICAgIElzIGl0IHRoZSBleHBlY3RlZCBkZWNvZGVkIHZhbHVlPworICAgIEVYUEVDVF9FUShwbGFpbnRleHQsIGRlY29kZV9zdHIpOworCisgICAgLy8gTGV0J3MgdHJ5IHdpdGggYSBwcmUtcG9wdWxhdGVkIHN0cmluZy4KKyAgICBzdHJpbmcgZW5jb2RlZCgidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIik7CisgICAgQmFzZTY0RXNjYXBlKHN0cmluZyhiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LAorICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCksCisgICAgICAgICAgICAgICAgICZlbmNvZGVkKTsKKyAgICBFWFBFQ1RfRVEoZW5jb2RlZCwgc3RyaW5nKGVuY29kZV9idWZmZXIsIGN5cGhlcl9sZW5ndGgpKTsKKworICAgIHN0cmluZyBkZWNvZGVkKCJ0aGlzIGp1bmsgc2hvdWxkIGJlIGlnbm9yZWQiKTsKKyAgICBFWFBFQ1RfVFJVRShCYXNlNjRVbmVzY2FwZSgKKyAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgY3lwaGVyX2xlbmd0aCksICZkZWNvZGVkKSk7CisgICAgRVhQRUNUX0VRKGRlY29kZWQuc2l6ZSgpLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICBFWFBFQ1RfRVFfQVJSQVkoZGVjb2RlZC5zaXplKCksIGRlY29kZWQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGkpOworCisgICAgLy8gT3VyIGRlY29kZXIgdHJlYXRzIHRoZSBwYWRkaW5nICc9JyBjaGFyYWN0ZXJzIGF0IHRoZSBlbmQgYXMKKyAgICAvLyBvcHRpb25hbCAoYnV0IGlmIHRoZXJlIGFyZSBhbnksIHRoZXJlIG11c3QgYmUgdGhlIGNvcnJlY3QKKyAgICAvLyBudW1iZXIgb2YgdGhlbS4pICBJZiBlbmNvZGVfYnVmZmVyIGhhcyBhbnksIHJ1biBzb21lIGFkZGl0aW9uYWwKKyAgICAvLyB0ZXN0cyB0aGF0IGZpZGRsZSB3aXRoIHRoZW0uCisgICAgY2hhciogZmlyc3RfZXF1YWxzID0gc3RyY2hyKGVuY29kZV9idWZmZXIsICc9Jyk7CisgICAgaWYgKGZpcnN0X2VxdWFscykgeworICAgICAgLy8gSG93IG1hbnkgZXF1YWxzIHNpZ25zIGRvZXMgdGhlIHN0cmluZyBzdGFydCB3aXRoPworICAgICAgaW50IGVxdWFscyA9ICgqKGZpcnN0X2VxdWFscysxKSA9PSAnPScpID8gMiA6IDE7CisKKyAgICAgIC8vIFRyeSBjaG9wcGluZyBvZmYgdGhlIGVxdWFscyBzaWduKHMpIGVudGlyZWx5LiAgVGhlIGRlY29kZXIKKyAgICAgIC8vIHNob3VsZCBzdGlsbCBiZSBva2F5IHdpdGggdGhpcy4KKyAgICAgIHN0cmluZyBkZWNvZGVkMigidGhpcyBqdW5rIHNob3VsZCBhbHNvIGJlIGlnbm9yZWQiKTsKKyAgICAgICpmaXJzdF9lcXVhbHMgPSAnXDAnOworICAgICAgRVhQRUNUX1RSVUUoQmFzZTY0VW5lc2NhcGUoCisgICAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciksICZkZWNvZGVkMikpOworICAgICAgRVhQRUNUX0VRKGRlY29kZWQuc2l6ZSgpLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICAgIEVYUEVDVF9FUV9BUlJBWShkZWNvZGVkLnNpemUoKSwgZGVjb2RlZCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgaSk7CisKKyAgICAgIC8vIE5vdyB0ZXN0IGNob3BwaW5nIG9mZiB0aGUgZXF1YWxzIHNpZ24ocykgYW5kIGFkZGluZworICAgICAgLy8gd2hpdGVzcGFjZS4gIE91ciBkZWNvZGVyIHNob3VsZCBzdGlsbCBhY2NlcHQgdGhpcy4KKyAgICAgIGRlY29kZWQyLmFzc2lnbigidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIik7CisgICAgICAqZmlyc3RfZXF1YWxzID0gJyAnOworICAgICAgKihmaXJzdF9lcXVhbHMrMSkgPSAnXDAnOworICAgICAgRVhQRUNUX1RSVUUoQmFzZTY0VW5lc2NhcGUoCisgICAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDEpLAorICAgICAgICAgICZkZWNvZGVkMikpOworICAgICAgRVhQRUNUX0VRKGRlY29kZWQuc2l6ZSgpLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICAgIEVYUEVDVF9FUV9BUlJBWShkZWNvZGVkLnNpemUoKSwgZGVjb2RlZCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgaSk7CisKKyAgICAgIC8vIE5vdyBzdGljayBhIGJhZCBjaGFyYWN0ZXIgYXQgdGhlIGVuZCBvZiB0aGUgc3RyaW5nLiAgVGhlIGRlY29kZXIKKyAgICAgIC8vIHNob3VsZCByZWZ1c2UgdGhpcyBzdHJpbmcuCisgICAgICBkZWNvZGVkMi5hc3NpZ24oInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCIpOworICAgICAgKmZpcnN0X2VxdWFscyA9ICc/JzsKKyAgICAgICooZmlyc3RfZXF1YWxzKzEpID0gJ1wwJzsKKyAgICAgIEVYUEVDVF9UUlVFKAorICAgICAgICAgICFCYXNlNjRVbmVzY2FwZSgKKyAgICAgICAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDEpLAorICAgICAgICAgICAgICAmZGVjb2RlZDIpKTsKKworICAgICAgaW50IGxlbjsKKworICAgICAgLy8gVGVzdCB3aGl0ZXNwYWNlIG1peGVkIHdpdGggdGhlIHBhZGRpbmcuICAoZWcgIkFBID0gPSAiKSAgVGhlCisgICAgICAvLyBkZWNvZGVyIHNob3VsZCBhY2NlcHQgdGhpcy4KKyAgICAgIGlmIChlcXVhbHMgPT0gMikgeworICAgICAgICBzbnByaW50ZihmaXJzdF9lcXVhbHMsIDYsICIgPSA9ICIpOworICAgICAgICBsZW4gPSBmaXJzdF9lcXVhbHMgLSBlbmNvZGVfYnVmZmVyICsgNTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHNucHJpbnRmKGZpcnN0X2VxdWFscywgNiwgIiA9ICIpOworICAgICAgICBsZW4gPSBmaXJzdF9lcXVhbHMgLSBlbmNvZGVfYnVmZmVyICsgMzsKKyAgICAgIH0KKyAgICAgIGRlY29kZWQyLmFzc2lnbigidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIik7CisgICAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICBCYXNlNjRVbmVzY2FwZShTdHJpbmdQaWVjZShlbmNvZGVfYnVmZmVyLCBsZW4pLCAmZGVjb2RlZDIpKTsKKyAgICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisgICAgICBFWFBFQ1RfRVFfQVJSQVkoZGVjb2RlZC5zaXplKCksIGRlY29kZWQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGkpOworCisgICAgICAvLyBUZXN0IHdoaXRlc3BhY2UgbWl4ZWQgd2l0aCB0aGUgcGFkZGluZywgYnV0IHdpdGggdGhlIHdyb25nCisgICAgICAvLyBudW1iZXIgb2YgZXF1YWxzIHNpZ25zIChlZyAiQUEgPSAiKS4gIFRoZSBkZWNvZGVyIHNob3VsZAorICAgICAgLy8gcmVmdXNlIHRoZXNlIHN0cmluZ3MuCisgICAgICBpZiAoZXF1YWxzID09IDEpIHsKKyAgICAgICAgc25wcmludGYoZmlyc3RfZXF1YWxzLCA2LCAiID0gPSAiKTsKKyAgICAgICAgbGVuID0gZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDU7CisgICAgICB9IGVsc2UgeworICAgICAgICBzbnByaW50ZihmaXJzdF9lcXVhbHMsIDYsICIgPSAiKTsKKyAgICAgICAgbGVuID0gZmlyc3RfZXF1YWxzIC0gZW5jb2RlX2J1ZmZlciArIDM7CisgICAgICB9CisgICAgICBFWFBFQ1RfVFJVRSgKKyAgICAgICAgICAhQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgbGVuKSwgJmRlY29kZWQyKSk7CisgICAgfQorCisgICAgLy8gQ29vbCEgdGhlIGJhc2ljIEJhc2U2NCBlbmNvZGVyL2RlY29kZXIgd29ya3MuCisgICAgLy8gTGV0J3MgdHJ5IHRoZSBhbHRlcm5hdGUgYWxwaGFiZXQ6IHRyIC0tICcrLycgJy1fJworCisgICAgY2hhciB3ZWJzYWZlWzEwMF07CisgICAgbWVtc2V0KHdlYnNhZmUsIDAsIHNpemVvZih3ZWJzYWZlKSk7CisgICAgc3RybmNweSh3ZWJzYWZlLCBiYXNlNjRfdGVzdHNbaV0uY3lwaGVydGV4dCwgY3lwaGVyX2xlbmd0aCk7CisgICAgZm9yIChpbnQgYyA9IDA7IGMgPCBzaXplb2Yod2Vic2FmZSk7ICsrYykgeworICAgICAgaWYgKCcrJyA9PSB3ZWJzYWZlW2NdKSB7IHdlYnNhZmVbY10gPSAnLSc7IH0KKyAgICAgIGlmICgnLycgPT0gd2Vic2FmZVtjXSkgeyB3ZWJzYWZlW2NdID0gJ18nOyB9CisgICAgfQorCisgICAgLy8gVGhlIHdlYnNhZmUgZXNjYXBlIGZ1bmN0aW9uOgorICAgIG1lbXNldChlbmNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZW5jb2RlX2J1ZmZlcikpOworICAgIGVuY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0RXNjYXBlKHVuc2lnbmVkX3BsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGVuY29kZV9idWZmZXIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRydWUpOworICAgIC8vICAgIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGN5cGhlcl9sZW5ndGgpOworICAgIEVYUEVDVF9FUSgKKyAgICAgICAgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLCB0cnVlKSwKKyAgICAgICAgZW5jb2RlX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCB0aGUgZXhwZWN0ZWQgZW5jb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgd2Vic2FmZSk7CisKKyAgICAvLyAgICBJZiB3ZSBlbmNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5cGhlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJ1ZSk7CisgICAgLy8gICAgSXMgaXQgc3RpbGwgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZW5jb2RlX2xlbmd0aCwgY3lwaGVyX2xlbmd0aCk7CisKKyAgICAvLyAgICBBbmQgaXMgdGhlIHZhbHVlIHN0aWxsIGNvcnJlY3Q/ICAoaS5lLiwgbm90IGxvc2luZyB0aGUgbGFzdCBieXRlKQorICAgIEVYUEVDVF9TVFJFUShlbmNvZGVfYnVmZmVyLCB3ZWJzYWZlKTsKKworICAgIC8vICAgIExldCdzIHRyeSB0aGUgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGVuY29kZXIKKyAgICBlbmNvZGVkID0gInRoaXMganVuayBzaG91bGQgYmUgaWdub3JlZCI7CisgICAgV2ViU2FmZUJhc2U2NEVzY2FwZSgKKyAgICAgICAgdW5zaWduZWRfcGxhaW50ZXh0LCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoLAorICAgICAgICAmZW5jb2RlZCwgdHJ1ZSk7CisgICAgRVhQRUNUX0VRKGVuY29kZWQuc2l6ZSgpLCBjeXBoZXJfbGVuZ3RoKTsKKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlZC5jX3N0cigpLCB3ZWJzYWZlKTsKKworICAgIC8vICAgIElmIHdlIGRlY29kZSBpdCBiYWNrOgorICAgIG1lbXNldChkZWNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOworICAgIGRlY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoZW5jb2RlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5cGhlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKKworICAgIC8vICAgIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGRlY29kZV9sZW5ndGgsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOworCisgICAgLy8gICAgSXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/CisgICAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7CisKKyAgICAvLyAgICBJZiB3ZSBkZWNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZGVjb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKKyAgICBkZWNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGVuY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9sZW5ndGgpOworCisgICAgLy8gICAgSXMgaXQgc3RpbGwgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZGVjb2RlX2xlbmd0aCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisKKyAgICAvLyAgICBBbmQgaXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/CisgICAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7CisKKyAgICAvLyBUcnkgdXNpbmcgJy4nIGZvciB0aGUgcGFkIGNoYXJhY3Rlci4KKyAgICBmb3IgKGludCBjID0gY3lwaGVyX2xlbmd0aCAtIDE7IGMgPj0gMCAmJiAnPScgPT0gZW5jb2RlX2J1ZmZlcltjXTsgLS1jKSB7CisgICAgICBlbmNvZGVfYnVmZmVyW2NdID0gJy4nOworICAgIH0KKworICAgIC8vIElmIHdlIGRlY29kZSBpdCBiYWNrOgorICAgIG1lbXNldChkZWNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOworICAgIGRlY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoZW5jb2RlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5cGhlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKKworICAgIC8vIElzIGl0IG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGRlY29kZV9sZW5ndGgsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgpOworCisgICAgLy8gSXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/CisgICAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7CisKKyAgICAvLyBJZiB3ZSBkZWNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZGVjb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGRlY29kZV9idWZmZXIpKTsKKyAgICBkZWNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NFVuZXNjYXBlKGVuY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjeXBoZXJfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9sZW5ndGgpOworCisgICAgLy8gSXMgaXQgc3RpbGwgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZGVjb2RlX2xlbmd0aCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisKKyAgICAvLyBBbmQgaXMgaXQgdGhlIGV4cGVjdGVkIGRlY29kZWQgdmFsdWU/CisgICAgRVhQRUNUX0VRKDAsCisgICAgICAgICAgICAgIG1lbWNtcChkZWNvZGVfYnVmZmVyLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBkZWNvZGVfbGVuZ3RoKSk7CisKKyAgICAvLyBMZXQncyB0cnkgdGhlIHN0cmluZyB2ZXJzaW9uIG9mIHRoZSBkZWNvZGVyCisgICAgZGVjb2RlZCA9ICJ0aGlzIGp1bmsgc2hvdWxkIGJlIGlnbm9yZWQiOworICAgIEVYUEVDVF9UUlVFKFdlYlNhZmVCYXNlNjRVbmVzY2FwZSgKKyAgICAgICAgU3RyaW5nUGllY2UoZW5jb2RlX2J1ZmZlciwgY3lwaGVyX2xlbmd0aCksICZkZWNvZGVkKSk7CisgICAgRVhQRUNUX0VRKGRlY29kZWQuc2l6ZSgpLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKyAgICBFWFBFQ1RfRVFfQVJSQVkoZGVjb2RlZC5zaXplKCksIGRlY29kZWQsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGkpOworCisgICAgLy8gT2theSEgdGhlIHdlYnNhZmUgQmFzZTY0IGVuY29kZXIvZGVjb2RlciB3b3Jrcy4KKyAgICAvLyBMZXQncyB0cnkgdGhlIHVucGFkZGVkIHZlcnNpb24KKworICAgIGZvciAoaW50IGMgPSAwOyBjIDwgc2l6ZW9mKHdlYnNhZmUpOyArK2MpIHsKKyAgICAgIGlmICgnPScgPT0gd2Vic2FmZVtjXSkgeworICAgICAgICB3ZWJzYWZlW2NdID0gJ1wwJzsKKyAgICAgICAgY3lwaGVyX2xlbmd0aCA9IGM7CisgICAgICAgIGJyZWFrOworICAgICAgfQorICAgIH0KKworICAgIC8vIFRoZSB3ZWJzYWZlIGVzY2FwZSBmdW5jdGlvbjoKKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihlbmNvZGVfYnVmZmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgLy8gICAgSXMgaXQgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZW5jb2RlX2xlbmd0aCwgY3lwaGVyX2xlbmd0aCk7CisgICAgRVhQRUNUX0VRKAorICAgICAgICBDYWxjdWxhdGVCYXNlNjRFc2NhcGVkTGVuKGJhc2U2NF90ZXN0c1tpXS5wbGFpbl9sZW5ndGgsIGZhbHNlKSwKKyAgICAgICAgZW5jb2RlX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCB0aGUgZXhwZWN0ZWQgZW5jb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgd2Vic2FmZSk7CisKKyAgICAvLyAgICBJZiB3ZSBlbmNvZGUgaXQgaW50byBhIGJ1ZmZlciBvZiBleGFjdGx5IHRoZSByaWdodCBsZW5ndGguLi4KKyAgICBtZW1zZXQoZW5jb2RlX2J1ZmZlciwgMCwgc2l6ZW9mKGVuY29kZV9idWZmZXIpKTsKKyAgICBlbmNvZGVfbGVuZ3RoID0gV2ViU2FmZUJhc2U2NEVzY2FwZSh1bnNpZ25lZF9wbGFpbnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbmNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5cGhlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpOworICAgIC8vICAgIElzIGl0IHN0aWxsIG9mIHRoZSBleHBlY3RlZCBsZW5ndGg/CisgICAgRVhQRUNUX0VRKGVuY29kZV9sZW5ndGgsIGN5cGhlcl9sZW5ndGgpOworCisgICAgLy8gICAgQW5kIGlzIHRoZSB2YWx1ZSBzdGlsbCBjb3JyZWN0PyAgKGkuZS4sIG5vdCBsb3NpbmcgdGhlIGxhc3QgYnl0ZSkKKyAgICBFWFBFQ1RfU1RSRVEoZW5jb2RlX2J1ZmZlciwgd2Vic2FmZSk7CisKKyAgICAvLyBMZXQncyB0cnkgdGhlIChvdGhlcikgc3RyaW5nIHZlcnNpb24gb2YgdGhlIGVuY29kZXIKKyAgICBzdHJpbmcgcGxhaW4oYmFzZTY0X3Rlc3RzW2ldLnBsYWludGV4dCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisgICAgZW5jb2RlZCA9ICJ0aGlzIGp1bmsgc2hvdWxkIGJlIGlnbm9yZWQiOworICAgIFdlYlNhZmVCYXNlNjRFc2NhcGUocGxhaW4sICZlbmNvZGVkKTsKKyAgICBFWFBFQ1RfRVEoZW5jb2RlZC5zaXplKCksIGN5cGhlcl9sZW5ndGgpOworICAgIEVYUEVDVF9TVFJFUShlbmNvZGVkLmNfc3RyKCksIHdlYnNhZmUpOworCisgICAgLy8gICAgSWYgd2UgZGVjb2RlIGl0IGJhY2s6CisgICAgbWVtc2V0KGRlY29kZV9idWZmZXIsIDAsIHNpemVvZihkZWNvZGVfYnVmZmVyKSk7CisgICAgZGVjb2RlX2xlbmd0aCA9IFdlYlNhZmVCYXNlNjRVbmVzY2FwZShlbmNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3lwaGVyX2xlbmd0aCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlY29kZV9idWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOworCisgICAgLy8gICAgSXMgaXQgb2YgdGhlIGV4cGVjdGVkIGxlbmd0aD8KKyAgICBFWFBFQ1RfRVEoZGVjb2RlX2xlbmd0aCwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCB0aGUgZXhwZWN0ZWQgZGVjb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgICAgbWVtY21wKGRlY29kZV9idWZmZXIsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGRlY29kZV9sZW5ndGgpKTsKKworICAgIC8vICAgIElmIHdlIGRlY29kZSBpdCBpbnRvIGEgYnVmZmVyIG9mIGV4YWN0bHkgdGhlIHJpZ2h0IGxlbmd0aC4uLgorICAgIG1lbXNldChkZWNvZGVfYnVmZmVyLCAwLCBzaXplb2YoZGVjb2RlX2J1ZmZlcikpOworICAgIGRlY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0VW5lc2NhcGUoZW5jb2RlX2J1ZmZlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGN5cGhlcl9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWNvZGVfYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVjb2RlX2xlbmd0aCk7CisKKyAgICAvLyAgICBJcyBpdCBzdGlsbCBvZiB0aGUgZXhwZWN0ZWQgbGVuZ3RoPworICAgIEVYUEVDVF9FUShkZWNvZGVfbGVuZ3RoLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW5fbGVuZ3RoKTsKKworICAgIC8vICAgIEFuZCBpcyBpdCB0aGUgZXhwZWN0ZWQgZGVjb2RlZCB2YWx1ZT8KKyAgICBFWFBFQ1RfRVEoMCwKKyAgICAgICAgICAgICAgbWVtY21wKGRlY29kZV9idWZmZXIsIGJhc2U2NF90ZXN0c1tpXS5wbGFpbnRleHQsIGRlY29kZV9sZW5ndGgpKTsKKworCisgICAgLy8gTGV0J3MgdHJ5IHRoZSBzdHJpbmcgdmVyc2lvbiBvZiB0aGUgZGVjb2RlcgorICAgIGRlY29kZWQgPSAidGhpcyBqdW5rIHNob3VsZCBiZSBpZ25vcmVkIjsKKyAgICBFWFBFQ1RfVFJVRShXZWJTYWZlQmFzZTY0VW5lc2NhcGUoCisgICAgICAgIFN0cmluZ1BpZWNlKGVuY29kZV9idWZmZXIsIGN5cGhlcl9sZW5ndGgpLCAmZGVjb2RlZCkpOworICAgIEVYUEVDVF9FUShkZWNvZGVkLnNpemUoKSwgYmFzZTY0X3Rlc3RzW2ldLnBsYWluX2xlbmd0aCk7CisgICAgRVhQRUNUX0VRX0FSUkFZKGRlY29kZWQuc2l6ZSgpLCBkZWNvZGVkLCBiYXNlNjRfdGVzdHNbaV0ucGxhaW50ZXh0LCBpKTsKKworICAgIC8vIFRoaXMgdmFsdWUgd29ya3MuICBUcnkgdGhlIG5leHQuCisgIH0KKworICAvLyBOb3cgdHJ5IHRoZSBsb25nIHN0cmluZ3MsIHRoaXMgdGVzdHMgdGhlIHN0cmVhbWluZworICBmb3IgKGludCBpID0gMDsgaSA8IHNpemVvZihiYXNlNjRfc3RyaW5ncykgLyBzaXplb2YoYmFzZTY0X3N0cmluZ3NbMF0pOworICAgICAgICsraSkgeworICAgIGNvbnN0IHVuc2lnbmVkIGNoYXIqIHVuc2lnbmVkX3BsYWludGV4dCA9CisgICAgICByZWludGVycHJldF9jYXN0PGNvbnN0IHVuc2lnbmVkIGNoYXIqPihiYXNlNjRfc3RyaW5nc1tpXS5wbGFpbnRleHQpOworICAgIGludCBwbGFpbl9sZW5ndGggPSBzdHJsZW4oYmFzZTY0X3N0cmluZ3NbaV0ucGxhaW50ZXh0KTsKKyAgICBpbnQgY3lwaGVyX2xlbmd0aCA9IHN0cmxlbihiYXNlNjRfc3RyaW5nc1tpXS5jeXBoZXJ0ZXh0KTsKKyAgICB2ZWN0b3I8Y2hhcj4gYnVmZmVyKGN5cGhlcl9sZW5ndGgrMSk7CisgICAgaW50IGVuY29kZV9sZW5ndGggPSBXZWJTYWZlQmFzZTY0RXNjYXBlKHVuc2lnbmVkX3BsYWludGV4dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhaW5fbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmYnVmZmVyWzBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSk7CisgICAgRVhQRUNUX0VRKGN5cGhlcl9sZW5ndGgsIGVuY29kZV9sZW5ndGgpOworICAgIEVYUEVDVF9FUSgKKyAgICAgICAgQ2FsY3VsYXRlQmFzZTY0RXNjYXBlZExlbihwbGFpbl9sZW5ndGgsIGZhbHNlKSwgZW5jb2RlX2xlbmd0aCk7CisgICAgYnVmZmVyWyBlbmNvZGVfbGVuZ3RoIF0gPSAnXDAnOworICAgIEVYUEVDVF9TVFJFUShiYXNlNjRfc3RyaW5nc1tpXS5jeXBoZXJ0ZXh0LCAmYnVmZmVyWzBdKTsKKyAgfQorCisgIC8vIFZlcmlmeSB0aGUgYmVoYXZpb3Igd2hlbiBkZWNvZGluZyBiYWQgZGF0YQorICB7CisgICAgY29uc3QgY2hhciogYmFkX2RhdGEgPSAiYWItLyI7CisgICAgc3RyaW5nIGJ1ZjsKKyAgICBFWFBFQ1RfRkFMU0UoQmFzZTY0VW5lc2NhcGUoU3RyaW5nUGllY2UoYmFkX2RhdGEpLCAmYnVmKSk7CisgICAgRVhQRUNUX1RSVUUoIVdlYlNhZmVCYXNlNjRVbmVzY2FwZShiYWRfZGF0YSwgJmJ1ZikpOworICAgIEVYUEVDVF9UUlVFKGJ1Zi5lbXB0eSgpKTsKKyAgfQorfQorCiB9ICAvLyBhbm9ueW1vdXMgbmFtZXNwYWNlCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmNjCmluZGV4IGI1NDJhYWEuLmM5ZDk1ODkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsNyArMzIsNyBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC1pbmwuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwuaD4KIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oCmluZGV4IDI1ODE3OTMuLjdlZTQ0MmEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N1YnN0aXR1dGUuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy9zdWJzdGl0dXRlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWwuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGVtcGxhdGVfdXRpbC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90ZW1wbGF0ZV91dGlsX3VuaXR0ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RlbXBsYXRlX3V0aWxfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWUuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90aW1lLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3RpbWVfdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdGltZV90ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0cy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3N0dWJzL3R5cGVfdHJhaXRzLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi9zdHVicy90eXBlX3RyYWl0c191bml0dGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvc3R1YnMvdHlwZV90cmFpdHNfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5jYwppbmRleCBhZjhiMzkwLi4wN2FhMWQ3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC00Miw2ICs0Miw3IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+CkBAIC01MCw2ICs1MSwxNCBAQAogbmFtZXNwYWNlIHByb3RvYnVmIHsKIAogdm9pZCBUZXN0VXRpbDo6U2V0QWxsRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKKyAgU2V0T3B0aW9uYWxGaWVsZHMobWVzc2FnZSk7CisgIEFkZFJlcGVhdGVkRmllbGRzMShtZXNzYWdlKTsKKyAgQWRkUmVwZWF0ZWRGaWVsZHMyKG1lc3NhZ2UpOworICBTZXREZWZhdWx0RmllbGRzKG1lc3NhZ2UpOworICBTZXRPbmVvZkZpZWxkcyhtZXNzYWdlKTsKK30KKwordm9pZCBUZXN0VXRpbDo6U2V0T3B0aW9uYWxGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgewogICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfaW50MzIgICAoMTAxKTsKICAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2ludDY0ICAgKDEwMik7CiAgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF91aW50MzIgICgxMDMpOwpAQCAtNjYsMTAgKzc1LDEyIEBACiAgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9zdHJpbmcgICgiMTE1Iik7CiAgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9ieXRlcyAgICgiMTE2Iik7CiAKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbGdyb3VwICAgICAgICAgICAoKS0+c2V0X2EoMTE3KTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDExOCk7Ci0gIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDExOSk7Ci0gIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCktPnNldF9kKDEyMCk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCktPnNldF9hKDExNyk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCktPnNldF9iYigxMTgpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLT5zZXRfYygxMTkpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpLT5zZXRfZCgxMjApOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZSgxMjYpOworICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLT5zZXRfYmIoMTI3KTsKIAogICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CiAgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgKTsKQEAgLTg3LDkgKzk4LDExIEBACiAgICAgbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2NvcmQiKSwKICAgICAiMTI1Iik7CiAjZW5kaWYgIC8vICFQUk9UT0JVRl9URVNUX05PX0RFU0NSSVBUT1JTCit9CiAKLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KIAordm9pZCBUZXN0VXRpbDo6QWRkUmVwZWF0ZWRGaWVsZHMxKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDMyICAgKDIwMSk7CiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQ2NCAgICgyMDIpOwogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfdWludDMyICAoMjAzKTsKQEAgLTExMCw2ICsxMjMsNyBAQAogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKCktPnNldF9iYigyMTgpOwogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDIxOSk7CiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoKS0+c2V0X2QoMjIwKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgpLT5zZXRfYmIoMjI3KTsKIAogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUik7CiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgKTsKQEAgLTEyNSw3ICsxMzksOSBAQAogICAgIG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+RmluZEZpZWxkQnlOYW1lKCJyZXBlYXRlZF9jb3JkIiksCiAgICAgIjIyNSIpOwogI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUworfQogCit2b2lkIFRlc3RVdGlsOjpBZGRSZXBlYXRlZEZpZWxkczIodW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSkgewogICAvLyBBZGQgYSBzZWNvbmQgb25lIG9mIGVhY2ggZmllbGQuCiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbnQzMiAgICgzMDEpOwogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50NjQgICAoMzAyKTsKQEAgLTE0Nyw2ICsxNjMsNyBAQAogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKCktPnNldF9iYigzMTgpOwogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKCktPnNldF9jKDMxOSk7CiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoKS0+c2V0X2QoMzIwKTsKKyAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgpLT5zZXRfYmIoMzI3KTsKIAogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbmVzdGVkX2VudW0gKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgKTsKQEAgLTE2Miw5ICsxNzksMTEgQEAKICAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfY29yZCIpLAogICAgICIzMjUiKTsKICNlbmRpZiAgLy8gIVBST1RPQlVGX1RFU1RfTk9fREVTQ1JJUFRPUlMKK30KIAotICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCit2b2lkIFRlc3RVdGlsOjpTZXREZWZhdWx0RmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKICAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfaW50MzIgICAoNDAxKTsKICAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfaW50NjQgICAoNDAyKTsKICAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfdWludDMyICAoNDAzKTsKQEAgLTIyMCw2ICsyMzksNyBAQAogICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS0+c2V0X2JiKDUxOCk7CiAgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLT5zZXRfYyg1MTkpOwogICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS0+c2V0X2QoNTIwKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMSktPnNldF9iYig1MjcpOwogCiAgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6Rk9PKTsKICAgbWVzc2FnZS0+c2V0X3JlcGVhdGVkX2ZvcmVpZ25fZW51bSgxLCB1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICApOwpAQCAtMjM3LDYgKzI1NywxNCBAQAogI2VuZGlmICAvLyAhUFJPVE9CVUZfVEVTVF9OT19ERVNDUklQVE9SUwogfQogCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3ZvaWQgVGVzdFV0aWw6OlNldE9uZW9mRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+c2V0X29uZW9mX3VpbnQzMig2MDEpOworICBtZXNzYWdlLT5tdXRhYmxlX29uZW9mX25lc3RlZF9tZXNzYWdlKCktPnNldF9iYig2MDIpOworICBtZXNzYWdlLT5zZXRfb25lb2Zfc3RyaW5nKCI2MDMiKTsKKyAgbWVzc2FnZS0+c2V0X29uZW9mX2J5dGVzKCI2MDQiKTsKK30KKwogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQogCiB2b2lkIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNTZXQoY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSkgewpAQCAtMjU2LDE1ICsyODQsMTkgQEAKICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nICAoKSk7CiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2J5dGVzICAgKCkpOwogCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpKTsKIAotICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpLmhhc19hKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICgpLmhhc19iYigpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5oYXNfYygpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKS5oYXNfZCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS5oYXNfYSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkuaGFzX2MoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkuaGFzX2QoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2UoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkuaGFzX2JiKCkpOwogCiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKICAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOwpAQCAtMjg3LDE0ICszMTksMTYgQEAKICAgRVhQRUNUX0VRKDExMCAgLCBtZXNzYWdlLm9wdGlvbmFsX3NmaXhlZDY0KCkpOwogICBFWFBFQ1RfRVEoMTExICAsIG1lc3NhZ2Uub3B0aW9uYWxfZmxvYXQgICAoKSk7CiAgIEVYUEVDVF9FUSgxMTIgICwgbWVzc2FnZS5vcHRpb25hbF9kb3VibGUgICgpKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLm9wdGlvbmFsX2Jvb2wgICAgKCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCAgICAoKSk7CiAgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgICgpKTsKICAgRVhQRUNUX0VRKCIxMTYiLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzICAgKCkpOwogCi0gIEVYUEVDVF9FUSgxMTcsIG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgKCkuYSgpKTsKLSAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5iYigpKTsKLSAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5jKCkpOwotICBFWFBFQ1RfRVEoMTIwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLmQoKSk7CisgIEVYUEVDVF9FUSgxMTcsIG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgICgpLmEoKSk7CisgIEVYUEVDVF9FUSgxMTgsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgICgpLmJiKCkpOworICBFWFBFQ1RfRVEoMTE5LCBtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICAoKS5jKCkpOworICBFWFBFQ1RfRVEoMTIwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICAoKS5kKCkpOworICBFWFBFQ1RfRVEoMTI2LCBtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSAoKS5lKCkpOworICBFWFBFQ1RfRVEoMTI3LCBtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICAoKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9lbnVtICgpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CkBAIC0zMjMsNiArMzU3LDcgQEAKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUgICAoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CkBAIC0zNDQsNyArMzc5LDcgQEAKICAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKICAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKICAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKICAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKICAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKIApAQCAtMzUyLDYgKzM4Nyw3IEBACiAgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOwogICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOwogICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgwKS5iYigpKTsKIAogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDApKTsKQEAgLTM3MCw3ICs0MDYsNyBAQAogICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOwogICBFWFBFQ1RfRVEoMzExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMSkpOwogICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOwogICBFWFBFQ1RfRVEoIjMxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMSkpOwogICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMSkpOwogCkBAIC0zNzgsNiArNDE0LDcgQEAKICAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7CiAgIEVYUEVDVF9FUSgzMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CiAgIEVYUEVDVF9FUSgzMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDEpLmJiKCkpOwogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVosIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOwpAQCAtNDE5LDcgKzQ1Niw3IEBACiAgIEVYUEVDVF9FUSg0MTAgICwgbWVzc2FnZS5kZWZhdWx0X3NmaXhlZDY0KCkpOwogICBFWFBFQ1RfRVEoNDExICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKICAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLmRlZmF1bHRfZG91YmxlICAoKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgbWVzc2FnZS5kZWZhdWx0X2Jvb2wgICAgKCkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UuZGVmYXVsdF9ib29sICAgICgpKTsKICAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLmRlZmF1bHRfc3RyaW5nICAoKSk7CiAgIEVYUEVDVF9FUSgiNDE2IiwgbWVzc2FnZS5kZWZhdWx0X2J5dGVzICAgKCkpOwogCkBAIC00MjcsNiArNDY0LDEzIEBACiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9GT08gICAgICAsIG1lc3NhZ2UuZGVmYXVsdF9mb3JlaWduX2VudW0oKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9GT08sIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7CiAKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfdWludDMyICAgICAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3N0cmluZyAgICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vbmVvZl9ieXRlcyAgICAgICAgICAoKSk7CisKKyAgRVhQRUNUX0VRKCI2MDQiLCBtZXNzYWdlLm9uZW9mX2J5dGVzKCkpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC00NDksMTAgKzQ5MywxMiBAQAogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfc3RyaW5nICAoKSk7CiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9ieXRlcyAgICgpKTsKIAotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkpOwogCiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX2VudW0oKSk7CkBAIC00NzQsMjAgKzUyMCwyNCBAQAogICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfc2ZpeGVkNjQoKSk7CiAgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5vcHRpb25hbF9mbG9hdCAgICgpKTsKICAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLm9wdGlvbmFsX2RvdWJsZSAgKCkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2Uub3B0aW9uYWxfYm9vbCAgICAoKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5vcHRpb25hbF9ib29sICAgICgpKTsKICAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX3N0cmluZyAgKCkpOwogICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2Uub3B0aW9uYWxfYnl0ZXMgICAoKSk7CiAKICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpLmhhc19hKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5oYXNfYmIoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpLmhhc19jKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKS5oYXNfZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkuaGFzX2EoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpLmhhc19iYigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkuaGFzX2MoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpLmhhc19kKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UoKS5oYXNfZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkuaGFzX2JiKCkpOwogCi0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpLmEoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlICgpLmJiKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5jKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKS5kKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS5hKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCkuYygpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCkuZCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuZSgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2Uub3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCkuYmIoKSk7CiAKICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CkBAIC01MTYsNiArNTY2LDcgQEAKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOwogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUgICAoKSk7CiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOwogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CkBAIC01NTgsNyArNjA5LDcgQEAKICAgRVhQRUNUX0VRKC01MCAgICAsIG1lc3NhZ2UuZGVmYXVsdF9zZml4ZWQ2NCgpKTsKICAgRVhQRUNUX0VRKCA1MS41ICAsIG1lc3NhZ2UuZGVmYXVsdF9mbG9hdCAgICgpKTsKICAgRVhQRUNUX0VRKCA1MmUzICAsIG1lc3NhZ2UuZGVmYXVsdF9kb3VibGUgICgpKTsKLSAgRVhQRUNUX0VRKHRydWUgICAsIG1lc3NhZ2UuZGVmYXVsdF9ib29sICAgICgpKTsKKyAgRVhQRUNUX1RSVUUoICAgICAgIG1lc3NhZ2UuZGVmYXVsdF9ib29sICAgICgpKTsKICAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuZGVmYXVsdF9zdHJpbmcgICgpKTsKICAgRVhQRUNUX0VRKCJ3b3JsZCIsIG1lc3NhZ2UuZGVmYXVsdF9ieXRlcyAgICgpKTsKIApAQCAtNTY2LDYgKzYxNywxMSBAQAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfQkFSLCBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0gKCkpOwogCisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3VpbnQzMiAgICAgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9zdHJpbmcgICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX2J5dGVzICAgICAgICAgKCkpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC01OTUsNiArNjUxLDcgQEAKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX3NpemUgICAoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CkBAIC02MTYsNyArNjczLDcgQEAKICAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKICAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDApKTsKICAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDApKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDApKTsKICAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDApKTsKICAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDApKTsKIApAQCAtNjI0LDYgKzY4MSw3IEBACiAgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOwogICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOwogICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgwKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKQEAgLTY0Myw3ICs3MDEsNyBAQAogICBFWFBFQ1RfRVEoNTEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMSkpOwogICBFWFBFQ1RfRVEoNTExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMSkpOwogICBFWFBFQ1RfRVEoNTEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMSkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMSkpOwogICBFWFBFQ1RfRVEoIjUxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMSkpOwogICBFWFBFQ1RfRVEoIjUxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMSkpOwogCkBAIC02NTEsNiArNzA5LDcgQEAKICAgRVhQRUNUX0VRKDUxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7CiAgIEVYUEVDVF9FUSg1MTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CiAgIEVYUEVDVF9FUSg1MjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7CisgIEVYUEVDVF9FUSg1MjcsIG1lc3NhZ2UucmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKDEpLmJiKCkpOwogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMSkpOwpAQCAtNzc1LDcgKzgzNCw3IEBACiAgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMCkpOwogICBFWFBFQ1RfRVEoNjExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDApKTsKICAgRVhQRUNUX0VRKDYxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgwKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDApKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBUiwgbWVzc2FnZS5wYWNrZWRfZW51bSgwKSk7CiAKICAgRVhQRUNUX0VRKDcwMSAgLCBtZXNzYWdlLnBhY2tlZF9pbnQzMiAgICgxKSk7CkBAIC03OTAsNyArODQ5LDcgQEAKICAgRVhQRUNUX0VRKDcxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgxKSk7CiAgIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMSkpOwogICBFWFBFQ1RfRVEoNzEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDEpKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgxKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMSkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDEpKTsKIH0KIApAQCAtODI1LDcgKzg4NCw3IEBACiAgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS51bnBhY2tlZF9zZml4ZWQ2NCgwKSk7CiAgIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS51bnBhY2tlZF9mbG9hdCAgICgwKSk7CiAgIEVYUEVDVF9FUSg2MTIgICwgbWVzc2FnZS51bnBhY2tlZF9kb3VibGUgICgwKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS51bnBhY2tlZF9ib29sICAgICgwKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS51bnBhY2tlZF9ib29sICAgICgwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIsIG1lc3NhZ2UudW5wYWNrZWRfZW51bSgwKSk7CiAKICAgRVhQRUNUX0VRKDcwMSAgLCBtZXNzYWdlLnVucGFja2VkX2ludDMyICAgKDEpKTsKQEAgLTg0MCw3ICs4OTksNyBAQAogICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UudW5wYWNrZWRfc2ZpeGVkNjQoMSkpOwogICBFWFBFQ1RfRVEoNzExICAsIG1lc3NhZ2UudW5wYWNrZWRfZmxvYXQgICAoMSkpOwogICBFWFBFQ1RfRVEoNzEyICAsIG1lc3NhZ2UudW5wYWNrZWRfZG91YmxlICAoMSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UudW5wYWNrZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UudW5wYWNrZWRfYm9vbCAgICAoMSkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaLCBtZXNzYWdlLnVucGFja2VkX2VudW0oMSkpOwogfQogCkBAIC04OTcsNyArOTU2LDcgQEAKICAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLnBhY2tlZF9zZml4ZWQ2NCgwKSk7CiAgIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5wYWNrZWRfZmxvYXQgICAoMCkpOwogICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UucGFja2VkX2RvdWJsZSAgKDApKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnBhY2tlZF9ib29sICAgICgwKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLCBtZXNzYWdlLnBhY2tlZF9lbnVtKDApKTsKICAgLy8gQWN0dWFsbHkgdmVyaWZ5IHRoZSBzZWNvbmQgKG1vZGlmaWVkKSBlbGVtZW50cyBub3cuCiAgIEVYUEVDVF9FUSg4MDEgICwgbWVzc2FnZS5wYWNrZWRfaW50MzIgICAoMSkpOwpAQCAtOTEyLDcgKzk3MSw3IEBACiAgIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5wYWNrZWRfc2ZpeGVkNjQoMSkpOwogICBFWFBFQ1RfRVEoODExICAsIG1lc3NhZ2UucGFja2VkX2Zsb2F0ICAgKDEpKTsKICAgRVhQRUNUX0VRKDgxMiAgLCBtZXNzYWdlLnBhY2tlZF9kb3VibGUgICgxKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5wYWNrZWRfYm9vbCAgICAoMSkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucGFja2VkX2Jvb2wgICAgKDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTywgbWVzc2FnZS5wYWNrZWRfZW51bSgxKSk7CiB9CiAKQEAgLTk1Myw2ICsxMDEyLDkgQEAKICAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAiMTI0Iik7CiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfY29yZF9leHRlbnNpb24sICIxMjUiKTsKIAorICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS0+c2V0X2UoMTI2KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiktPnNldF9iYigxMjcpOworCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbnQzMl9leHRlbnNpb24gICAsIDIwMSk7CkBAIC05NzUsNiArMTAzNyw3IEBACiAgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9iYigyMTgpOwogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYygyMTkpOwogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfZCgyMjApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApLT5zZXRfYmIoMjI3KTsKIAogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUik7CiAgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgKTsKQEAgLTEwMDQsNiArMTA2Nyw3IEBACiAgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICktPnNldF9iYigzMTgpOwogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYygzMTkpOwogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLT5zZXRfZCgzMjApOworICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApLT5zZXRfYmIoMzI3KTsKIAogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBWik7CiAgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgdW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgKTsKQEAgLTEwMzYsNiArMTEwMCwxNSBAQAogCiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uLCAiNDI0Iik7CiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9jb3JkX2V4dGVuc2lvbiwgIjQyNSIpOworCisgIFNldE9uZW9mRmllbGRzKG1lc3NhZ2UpOworfQorCit2b2lkIFRlc3RVdGlsOjpTZXRPbmVvZkZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbEV4dGVuc2lvbnMqIG1lc3NhZ2UpIHsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl91aW50MzJfZXh0ZW5zaW9uLCA2MDEpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24pLT5zZXRfYmIoNjAyKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uLCAiNjAzIik7CisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfYnl0ZXNfZXh0ZW5zaW9uLCAiNjA0Iik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTEwNzMsNiArMTE0Niw3IEBACiAgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLT5zZXRfYmIoNTE4KTsKICAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSktPnNldF9jKDUxOSk7CiAgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLT5zZXRfZCg1MjApOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAxKS0+c2V0X2JiKDUyNyk7CiAKICAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08pOwogICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICk7CkBAIC0xMTAyLDE1ICsxMTc2LDE5IEBACiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKICAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbiAgICkpOwogCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICAgKSk7CiAKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApLmhhc19hKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkuaGFzX2JiKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikuaGFzX2MoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKS5oYXNfZCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAgICAgICApLmhhc19hKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICkuaGFzX2MoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKS5oYXNfZCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24pLmhhc19lKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICAgICkuaGFzX2JiKCkpOwogCiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7CiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uKSk7CkBAIC0xMTMxLDcgKzEyMDksNyBAQAogICBFWFBFQ1RfRVEoMTEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKICAgRVhQRUNUX0VRKDExMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CiAgIEVYUEVDVF9FUSgxMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2RvdWJsZV9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgKSk7CiAgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICkpOwogICBFWFBFQ1RfRVEoIjExNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9ieXRlc19leHRlbnNpb24gICApKTsKIApAQCAtMTE0Niw2ICsxMjI0LDggQEAKIAogICBFWFBFQ1RfRVEoIjEyNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CiAgIEVYUEVDVF9FUSgiMTI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9FUSgxMjYsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkuZSgpKTsKKyAgRVhQRUNUX0VRKDEyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24pLmJiKCkpOwogCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKQEAgLTExNjksNiArMTI0OSw3IEBACiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKQEAgLTExODgsNyArMTI2OSw3IEBACiAgIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOwogICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDApKTsKICAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKICAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAwKSk7CiAgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMCkpOwogCkBAIC0xMTk2LDYgKzEyNzcsNyBAQAogICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuYmIoKSk7CiAgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5jKCkpOwogICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDApLmJiKCkpOwogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAwKSk7CkBAIC0xMjE2LDcgKzEyOTgsNyBAQAogICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDEpKTsKICAgRVhQRUNUX0VRKDMxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAxKSk7CiAgIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CiAgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMSkpOwogICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDEpKTsKIApAQCAtMTIyNCw2ICsxMzA2LDcgQEAKICAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmJiKCkpOwogICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMSkuYygpKTsKICAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDEpLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAxKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMSkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMSkpOwpAQCAtMTI2OSw3ICsxMzUyLDcgQEAKICAgRVhQRUNUX0VRKDQxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKICAgRVhQRUNUX0VRKDQxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICApKTsKICAgRVhQRUNUX0VRKDQxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKICAgRVhQRUNUX0VRKCI0MTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKICAgRVhQRUNUX0VRKCI0MTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ieXRlc19leHRlbnNpb24gICApKTsKIApAQCAtMTI3OSw2ICsxMzYyLDE2IEBACiAKICAgRVhQRUNUX0VRKCI0MjQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uKSk7CiAgIEVYUEVDVF9FUSgiNDI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfY29yZF9leHRlbnNpb24pKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb24pKTsKKworICBFWFBFQ1RfRVEoNjAxLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoNjAyLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKS5iYigpKTsKKyAgRVhQRUNUX0VRKCI2MDMiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRVEoIjYwNCIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb24pKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTMwNywxMCArMTQwMCwxMiBAQAogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb24gICkpOwogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbiAgICkpOwogCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAgICAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICAgICkpOwogCiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICkpOwogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb24pKTsKQEAgLTEzMzIsMjAgKzE0MjcsMjQgQEAKICAgRVhQRUNUX0VRKDAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CiAgIEVYUEVDVF9FUSgwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Zsb2F0X2V4dGVuc2lvbiAgICkpOwogICBFWFBFQ1RfRVEoMCAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9kb3VibGVfZXh0ZW5zaW9uICApKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2Jvb2xfZXh0ZW5zaW9uICAgICkpOwogICBFWFBFQ1RfRVEoIiIgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9zdHJpbmdfZXh0ZW5zaW9uICApKTsKICAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CiAKICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb24gICAgICAgICAgICkuaGFzX2EoKSk7Ci0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkuaGFzX2JiKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLmhhc19jKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApLmhhc19kKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICAgICAgICApLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmhhc19iYigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgKS5oYXNfYygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gICAgICAgKS5oYXNfZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICAgKS5oYXNfYmIoKSk7CiAKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgKS5hKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApLmJiKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pLmMoKSk7Ci0gIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkuZCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgICAgICAgKS5hKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAgICAgICApLmJiKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24gICAgICApLmMoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICAgICAgICkuZCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uKS5lKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAgICAgICApLmJiKCkpOwogCiAgIC8vIEVudW1zIHdpdGhvdXQgZGVmYXVsdHMgYXJlIHNldCB0byB0aGUgZmlyc3QgdmFsdWUgaW4gdGhlIGVudW0uCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpGT08sIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb24gKSk7CkBAIC0xMzc2LDYgKzE0NzUsNyBAQAogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7CiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7CiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOwogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CkBAIC0xNDIwLDcgKzE1MjAsNyBAQAogICBFWFBFQ1RfRVEoLTUwICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc2ZpeGVkNjRfZXh0ZW5zaW9uKSk7CiAgIEVYUEVDVF9FUSggNTEuNSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mbG9hdF9leHRlbnNpb24gICApKTsKICAgRVhQRUNUX0VRKCA1MmUzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2RvdWJsZV9leHRlbnNpb24gICkpOwotICBFWFBFQ1RfRVEodHJ1ZSAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYm9vbF9leHRlbnNpb24gICAgKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9ib29sX2V4dGVuc2lvbiAgICApKTsKICAgRVhQRUNUX0VRKCJoZWxsbyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X3N0cmluZ19leHRlbnNpb24gICkpOwogICBFWFBFQ1RfRVEoIndvcmxkIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfYnl0ZXNfZXh0ZW5zaW9uICAgKSk7CiAKQEAgLTE0MzAsNiArMTUzMCwxMSBAQAogCiAgIEVYUEVDVF9FUSgiYWJjIiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbikpOwogICBFWFBFQ1RfRVEoIjEyMyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uKSk7CisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl91aW50MzJfZXh0ZW5zaW9uKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbikpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX2J5dGVzX2V4dGVuc2lvbikpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC0xNDU5LDYgKzE1NjQsNyBAQAogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24pKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAgICApKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiAgICkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfZW51bV9leHRlbnNpb24gICAgKSk7CkBAIC0xNDc4LDcgKzE1ODQsNyBAQAogICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKICAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7CiAgIEVYUEVDVF9FUSgyMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CiAgIEVYUEVDVF9FUSgiMjE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMCkpOwogICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDApKTsKIApAQCAtMTQ4Niw2ICsxNTkyLDcgQEAKICAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOwogICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKICAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7CisgIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAwKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMCkpOwpAQCAtMTUwNyw3ICsxNjE0LDcgQEAKICAgRVhQRUNUX0VRKDUxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CiAgIEVYUEVDVF9FUSg1MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOwogICBFWFBFQ1RfRVEoNTEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSkpOwogICBFWFBFQ1RfRVEoIjUxNSIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zdHJpbmdfZXh0ZW5zaW9uICAsIDEpKTsKICAgRVhQRUNUX0VRKCI1MTYiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYnl0ZXNfZXh0ZW5zaW9uICAgLCAxKSk7CiAKQEAgLTE1MTUsNiArMTYyMiw3IEBACiAgIEVYUEVDVF9FUSg1MTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gLCAxKS5iYigpKTsKICAgRVhQRUNUX0VRKDUxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb24sIDEpLmMoKSk7CiAgIEVYUEVDVF9FUSg1MjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gLCAxKS5kKCkpOworICBFWFBFQ1RfRVEoNTI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICwgMSkuYmIoKSk7CiAKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkZPTywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbiAsIDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0ZPTyAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb24sIDEpKTsKQEAgLTE2MDksNyArMTcxNyw3IEBACiAgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKICAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOwogICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLAogICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOwogICBFWFBFQ1RfRVEoNzAxICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7CkBAIC0xNjI0LDcgKzE3MzIsNyBAQAogICBFWFBFQ1RfRVEoNzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CiAgIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAsIDEpKTsKICAgRVhQRUNUX0VRKDcxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2RvdWJsZV9leHRlbnNpb24gICwgMSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9GQUxTRSggICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0JBWiwKICAgICAgICAgICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZW51bV9leHRlbnNpb24sIDEpKTsKIH0KQEAgLTE2NzksNyArMTc4Nyw3IEBACiAgIEVYUEVDVF9FUSg2MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKICAgRVhQRUNUX0VRKDYxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOwogICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSLAogICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMCkpOwogCkBAIC0xNjk2LDEzICsxODA0LDY0IEBACiAgIEVYUEVDVF9FUSg4MTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDEpKTsKICAgRVhQRUNUX0VRKDgxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOwogICBFWFBFQ1RfRVEoODEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpwYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fRk9PLAogICAgICAgICAgICAgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnBhY2tlZF9lbnVtX2V4dGVuc2lvbiwgMSkpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKK3ZvaWQgVGVzdFV0aWw6OkV4cGVjdFVucGFja2VkRXh0ZW5zaW9uc1NldCgKKyAgICBjb25zdCB1bml0dGVzdDo6VGVzdFVucGFja2VkRXh0ZW5zaW9ucyYgbWVzc2FnZSkgeworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9pbnQzMl9leHRlbnNpb24gICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfaW50NjRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX3VpbnQzMl9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF91aW50NjRfZXh0ZW5zaW9uICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfc2ludDMyX2V4dGVuc2lvbiAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX3NpbnQ2NF9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9maXhlZDMyX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfZml4ZWQ2NF9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX3NmaXhlZDMyX2V4dGVuc2lvbikpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zZml4ZWQ2NF9leHRlbnNpb24pKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfZmxvYXRfZXh0ZW5zaW9uICAgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnVucGFja2VkX2RvdWJsZV9leHRlbnNpb24gICkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0Ojp1bnBhY2tlZF9ib29sX2V4dGVuc2lvbiAgICApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6dW5wYWNrZWRfZW51bV9leHRlbnNpb24gICAgKSk7CisKKyAgRVhQRUNUX0VRKDYwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoNjAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCAwKSk7CisgIEVYUEVDVF9FUSg2MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3NpbnQzMl9leHRlbnNpb24gICwgMCkpOworICBFWFBFQ1RfRVEoNjA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKDYwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCAwKSk7CisgIEVYUEVDVF9FUSg2MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMCkpOworICBFWFBFQ1RfRVEoNjA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDYxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAwKSk7CisgIEVYUEVDVF9FUSg2MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMCkpOworICBFWFBFQ1RfRVEoNjEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDApKTsKKyAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIsCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZW51bV9leHRlbnNpb24sIDApKTsKKyAgRVhQRUNUX0VRKDcwMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfaW50MzJfZXh0ZW5zaW9uICAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2ludDY0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoNzAzICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF91aW50MzJfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwNCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfdWludDY0X2V4dGVuc2lvbiAgLCAxKSk7CisgIEVYUEVDVF9FUSg3MDUgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX3NpbnQzMl9leHRlbnNpb24gICwgMSkpOworICBFWFBFQ1RfRVEoNzA2ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zaW50NjRfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKDcwNyAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZml4ZWQzMl9leHRlbnNpb24gLCAxKSk7CisgIEVYUEVDVF9FUSg3MDggICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2ZpeGVkNjRfZXh0ZW5zaW9uICwgMSkpOworICBFWFBFQ1RfRVEoNzA5ICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9zZml4ZWQzMl9leHRlbnNpb24sIDEpKTsKKyAgRVhQRUNUX0VRKDcxMCAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfc2ZpeGVkNjRfZXh0ZW5zaW9uLCAxKSk7CisgIEVYUEVDVF9FUSg3MTEgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnVucGFja2VkX2Zsb2F0X2V4dGVuc2lvbiAgICwgMSkpOworICBFWFBFQ1RfRVEoNzEyICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0Ojp1bnBhY2tlZF9kb3VibGVfZXh0ZW5zaW9uICAsIDEpKTsKKyAgRVhQRUNUX0VRKGZhbHNlLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfYm9vbF9leHRlbnNpb24gICAgLCAxKSk7CisgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVosCisgICAgICAgICAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6dW5wYWNrZWRfZW51bV9leHRlbnNpb24sIDEpKTsKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCiB2b2lkIFRlc3RVdGlsOjpFeHBlY3RBbGxGaWVsZHNBbmRFeHRlbnNpb25zSW5PcmRlcihjb25zdCBzdHJpbmcmIHNlcmlhbGl6ZWQpIHsKICAgLy8gV2Ugc2V0IGVhY2ggZmllbGQgaW5kaXZpZHVhbGx5LCBzZXJpYWxpemUgc2VwYXJhdGVseSwgYW5kIGNvbmNhdGVuYXRlIGFsbAogICAvLyB0aGUgc3RyaW5ncyBpbiBjYW5vbmljYWwgb3JkZXIgdG8gZGV0ZXJtaW5lIHRoZSBleHBlY3RlZCBzZXJpYWxpemF0aW9uLgpAQCAtMTc1MCw2ICsxOTA5LDcgQEAKICAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2Vfc2l6ZSAoKSk7CiAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9zaXplKCkpOwogICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9zaXplICgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CiAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtX3NpemUgICAgKCkpOwogICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW1fc2l6ZSAgICgpKTsKICAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X2VudW1fc2l6ZSAgICAoKSk7CkBAIC0xNzcyLDcgKzE5MzIsNyBAQAogICBFWFBFQ1RfRVEoMjEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOwogICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOwogICBFWFBFQ1RfRVEoMjEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOwogICBFWFBFQ1RfRVEoIjIxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOwogICBFWFBFQ1RfRVEoIjIxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOwogCkBAIC0xNzgwLDYgKzE5NDAsNyBAQAogICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKICAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKICAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFSLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKQEAgLTE4MTAsNiArMTk3MSw3IEBACiAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKICAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwogICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApKTsKICAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOwogICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7CiAgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKQEAgLTE4MzAsNyArMTk5Miw3IEBACiAgIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMCkpOwogICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDApKTsKICAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAwKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMCkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKICAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAwKSk7CiAgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMCkpOwogCkBAIC0xODM4LDYgKzIwMDAsNyBAQAogICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuYmIoKSk7CiAgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5jKCkpOwogICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDApLmJiKCkpOwogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAwKSk7CkBAIC0xODQ3LDYgKzIwMTAsMzYgQEAKICAgRVhQRUNUX0VRKCIyMjUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfY29yZF9leHRlbnNpb24sIDApKTsKIH0KIAordm9pZCBUZXN0VXRpbDo6RXhwZWN0TGFzdFJlcGVhdGVkc1JlbGVhc2VkKAorICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRncm91cF9zaXplICAgICAgICAgICAoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UucmVwZWF0ZWRncm91cCAgICAgICAgICAgKDApLmEoKSk7CisgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOworICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworfQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RMYXN0UmVwZWF0ZWRFeHRlbnNpb25zUmVsZWFzZWQoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKSB7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkZ3JvdXBfZXh0ZW5zaW9uICAgICAgICAgICApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICkpOworICBBU1NFUlRfRVEoMSwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uKSk7CisgIEFTU0VSVF9FUSgxLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKKyAgQVNTRVJUX0VRKDEsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiAgICkpOworCisgIEVYUEVDVF9FUSgyMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZGdyb3VwX2V4dGVuc2lvbiAgICAgICAgICAgLCAwKS5hKCkpOworICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAwKS5jKCkpOworICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDApLmJiKCkpOworfQorCiB2b2lkIFRlc3RVdGlsOjpFeHBlY3RSZXBlYXRlZHNTd2FwcGVkKAogICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMmIG1lc3NhZ2UpIHsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW50MzJfc2l6ZSAgICgpKTsKQEAgLTE4NjksNiArMjA2Miw3IEBACiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwpAQCAtMTg5MSw3ICsyMDg1LDcgQEAKICAgRVhQRUNUX0VRKDIxMCAgLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDEpKTsKICAgRVhQRUNUX0VRKDIxMSAgLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0ICAgKDEpKTsKICAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSAgKDEpKTsKLSAgRVhQRUNUX0VRKHRydWUgLCBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDEpKTsKKyAgRVhQRUNUX1RSVUUoICAgICBtZXNzYWdlLnJlcGVhdGVkX2Jvb2wgICAgKDEpKTsKICAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLnJlcGVhdGVkX3N0cmluZyAgKDEpKTsKICAgRVhQRUNUX0VRKCIyMTYiLCBtZXNzYWdlLnJlcGVhdGVkX2J5dGVzICAgKDEpKTsKIApAQCAtMTg5OSw2ICsyMDkzLDcgQEAKICAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoMSkuYmIoKSk7CiAgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLmMoKSk7CiAgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7CisgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKDEpLmQoKSk7CiAKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM6OkJBUiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFSICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgxKSk7CkBAIC0xOTE2LDcgKzIxMTEsNyBAQAogICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkNjQoMCkpOwogICBFWFBFQ1RfRVEoMzExICAsIG1lc3NhZ2UucmVwZWF0ZWRfZmxvYXQgICAoMCkpOwogICBFWFBFQ1RfRVEoMzEyICAsIG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlICAoMCkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOworICBFWFBFQ1RfRkFMU0UoICAgIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCAgICAoMCkpOwogICBFWFBFQ1RfRVEoIjMxNSIsIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nICAoMCkpOwogICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UucmVwZWF0ZWRfYnl0ZXMgICAoMCkpOwogCkBAIC0xOTI0LDYgKzIxMTksNyBAQAogICBFWFBFQ1RfRVEoMzE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKICAgRVhQRUNUX0VRKDMxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKICAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVogICAgICAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDApKTsKQEAgLTE5NTMsNiArMjE0OSw3IEBACiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiApKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbikpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb24gKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICApKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICAgICkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uICAgKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbiAgICApKTsKQEAgLTE5NzIsNyArMjE2OSw3IEBACiAgIEVYUEVDVF9FUSgyMTAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3NmaXhlZDY0X2V4dGVuc2lvbiwgMSkpOwogICBFWFBFQ1RfRVEoMjExICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mbG9hdF9leHRlbnNpb24gICAsIDEpKTsKICAgRVhQRUNUX0VRKDIxMiAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZG91YmxlX2V4dGVuc2lvbiAgLCAxKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2Jvb2xfZXh0ZW5zaW9uICAgICwgMSkpOworICBFWFBFQ1RfVFJVRSggICAgIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDEpKTsKICAgRVhQRUNUX0VRKCIyMTUiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfc3RyaW5nX2V4dGVuc2lvbiAgLCAxKSk7CiAgIEVYUEVDVF9FUSgiMjE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2J5dGVzX2V4dGVuc2lvbiAgICwgMSkpOwogCkBAIC0xOTgwLDYgKzIxNzcsNyBAQAogICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uICwgMSkuYmIoKSk7CiAgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uLCAxKS5jKCkpOwogICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uICwgMSkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb24gICAsIDEpLmJiKCkpOwogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzOjpCQVIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb24gLCAxKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uLCAxKSk7CkBAIC0yMDAwLDcgKzIxOTgsNyBAQAogICBFWFBFQ1RfRVEoMzEwICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9zZml4ZWQ2NF9leHRlbnNpb24sIDApKTsKICAgRVhQRUNUX0VRKDMxMSAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZmxvYXRfZXh0ZW5zaW9uICAgLCAwKSk7CiAgIEVYUEVDVF9FUSgzMTIgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2RvdWJsZV9leHRlbnNpb24gICwgMCkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ib29sX2V4dGVuc2lvbiAgICAsIDApKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfYm9vbF9leHRlbnNpb24gICAgLCAwKSk7CiAgIEVYUEVDVF9FUSgiMzE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX3N0cmluZ19leHRlbnNpb24gICwgMCkpOwogICBFWFBFQ1RfRVEoIjMxNiIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9ieXRlc19leHRlbnNpb24gICAsIDApKTsKIApAQCAtMjAwOCw2ICsyMjA2LDcgQEAKICAgRVhQRUNUX0VRKDMxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmJiKCkpOwogICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbiwgMCkuYygpKTsKICAgRVhQRUNUX0VRKDMyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiAsIDApLmQoKSk7CisgIEVYUEVDVF9FUSgzMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uICAgLCAwKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlczo6QkFaLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uICwgMCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbiwgMCkpOwpAQCAtMjAxNyw2ICsyMjE2LDkyIEBACiAgIEVYUEVDVF9FUSgiMzI1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uLCAwKSk7CiB9CiAKK3ZvaWQgVGVzdFV0aWw6OlNldE9uZW9mMSh1bml0dGVzdDo6VGVzdE9uZW9mMiogbWVzc2FnZSkgeworICBtZXNzYWdlLT5tdXRhYmxlX2Zvb19sYXp5X21lc3NhZ2UoKS0+c2V0X3F1eF9pbnQoMTAwKTsKKyAgbWVzc2FnZS0+c2V0X2Jhcl9zdHJpbmcoIjEwMSIpOworICBtZXNzYWdlLT5zZXRfYmF6X2ludCgxMDIpOworICBtZXNzYWdlLT5zZXRfYmF6X3N0cmluZygiMTAzIik7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OlNldE9uZW9mMih1bml0dGVzdDo6VGVzdE9uZW9mMiogbWVzc2FnZSkgeworICBtZXNzYWdlLT5zZXRfZm9vX2ludCgyMDApOworICBtZXNzYWdlLT5zZXRfYmFyX2VudW0odW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkJBWik7CisgIG1lc3NhZ2UtPnNldF9iYXpfaW50KDIwMik7CisgIG1lc3NhZ2UtPnNldF9iYXpfc3RyaW5nKCIyMDMiKTsKK30KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0T25lb2ZTZXQxKGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyJiBtZXNzYWdlKSB7CisgIEV4cGVjdEF0TW9zdE9uZUZpZWxkU2V0SW5PbmVvZihtZXNzYWdlKTsKKworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19mb29fbGF6eV9tZXNzYWdlICAgICAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5mb29fbGF6eV9tZXNzYWdlKCkuaGFzX3F1eF9pbnQoKSk7CisKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfYmFyX3N0cmluZygpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfYmF6X2ludCAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfYmF6X3N0cmluZygpKTsKKworICBBU1NFUlRfRVEoMCwgbWVzc2FnZS5mb29fbGF6eV9tZXNzYWdlKCkuY29yZ2VfaW50X3NpemUoKSk7CisKKyAgRVhQRUNUX0VRKDEwMCAgLCBtZXNzYWdlLmZvb19sYXp5X21lc3NhZ2UoKS5xdXhfaW50KCkpOworICBFWFBFQ1RfRVEoIjEwMSIsIG1lc3NhZ2UuYmFyX3N0cmluZyAgICAgICAgICAgICAgICAoKSk7CisgIEVYUEVDVF9FUSgxMDIgICwgbWVzc2FnZS5iYXpfaW50ICAgICAgICAgICAgICAgICAgICgpKTsKKyAgRVhQRUNUX0VRKCIxMDMiLCBtZXNzYWdlLmJhel9zdHJpbmcgICAgICAgICAgICAgICAgKCkpOworfQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDIoY29uc3QgdW5pdHRlc3Q6OlRlc3RPbmVvZjImIG1lc3NhZ2UpIHsKKyAgRXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKG1lc3NhZ2UpOworCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Zvb19pbnQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Jhcl9lbnVtICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Jhel9pbnQgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX2Jhel9zdHJpbmcoKSk7CisKKyAgRVhQRUNUX0VRKDIwMCAgICAgICAgICAgICAgICAgICAgICAsIG1lc3NhZ2UuZm9vX2ludCAgICgpKTsKKyAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0T25lb2YyOjpCQVosIG1lc3NhZ2UuYmFyX2VudW0gICgpKTsKKyAgRVhQRUNUX0VRKDIwMiAgICAgICAgICAgICAgICAgICAgICAsIG1lc3NhZ2UuYmF6X2ludCAgICgpKTsKKyAgRVhQRUNUX0VRKCIyMDMiICAgICAgICAgICAgICAgICAgICAsIG1lc3NhZ2UuYmF6X3N0cmluZygpKTsKK30KKwordm9pZCBUZXN0VXRpbDo6RXhwZWN0T25lb2ZDbGVhcihjb25zdCB1bml0dGVzdDo6VGVzdE9uZW9mMiYgbWVzc2FnZSkgeworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vX2ludCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fYnl0ZXMoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fZW51bSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfZm9vZ3JvdXAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19mb29fbGF6eV9tZXNzYWdlKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXJfaW50KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmFyX3N0cmluZygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Jhcl9ieXRlcygpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX2Jhcl9lbnVtKCkpOworCisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19iYXpfaW50KCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfYmF6X3N0cmluZygpKTsKKworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkZPT19OT1RfU0VULCBtZXNzYWdlLmZvb19jYXNlKCkpOworICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RPbmVvZjI6OkJBUl9OT1RfU0VULCBtZXNzYWdlLmJhcl9jYXNlKCkpOworfQorCit2b2lkIFRlc3RVdGlsOjpFeHBlY3RBdE1vc3RPbmVGaWVsZFNldEluT25lb2YoCisgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RPbmVvZjImIG1lc3NhZ2UpIHsKKyAgaW50IGNvdW50ID0gMDsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19pbnQoKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19zdHJpbmcoKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19ieXRlcygpKSBjb3VudCsrOworICBpZiAobWVzc2FnZS5oYXNfZm9vX2VudW0oKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Zvb19tZXNzYWdlKCkpIGNvdW50Kys7CisgIGlmIChtZXNzYWdlLmhhc19mb29ncm91cCgpKSBjb3VudCsrOworICBpZiAobWVzc2FnZS5oYXNfZm9vX2xhenlfbWVzc2FnZSgpKSBjb3VudCsrOworICBFWFBFQ1RfTEUoY291bnQsIDEpOworICBjb3VudCA9IDA7CisgIGlmIChtZXNzYWdlLmhhc19iYXJfaW50KCkpIGNvdW50Kys7CisgIGlmIChtZXNzYWdlLmhhc19iYXJfc3RyaW5nKCkpIGNvdW50Kys7CisgIGlmIChtZXNzYWdlLmhhc19iYXJfYnl0ZXMoKSkgY291bnQrKzsKKyAgaWYgKG1lc3NhZ2UuaGFzX2Jhcl9lbnVtKCkpIGNvdW50Kys7CisgIEVYUEVDVF9UUlVFKGNvdW50ID09IDAgfHwgY291bnQgPT0gMSk7Cit9CisKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KIAogVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlJlZmxlY3Rpb25UZXN0ZXIoCkBAIC0yMDMxLDYgKzIzMTYsOCBAQAogICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuRm9yZWlnbk1lc3NhZ2UuYyIpOwogICBpbXBvcnRfZF8gPQogICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LkltcG9ydE1lc3NhZ2UuZCIpOworICBpbXBvcnRfZV8gPQorICAgIHBvb2wtPkZpbmRGaWVsZEJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2UuZSIpOwogICBuZXN0ZWRfZm9vXyA9CiAgICAgcG9vbC0+RmluZEVudW1WYWx1ZUJ5TmFtZSgicHJvdG9idWZfdW5pdHRlc3QuVGVzdEFsbFR5cGVzLkZPTyIpOwogICBuZXN0ZWRfYmFyXyA9CkBAIC0yMDY3LDYgKzIzNTQsNyBAQAogICBFWFBFQ1RfVFJVRShuZXN0ZWRfYl8gICAgICAgICAhPSBOVUxMKTsKICAgRVhQRUNUX1RSVUUoZm9yZWlnbl9jXyAgICAgICAgIT0gTlVMTCk7CiAgIEVYUEVDVF9UUlVFKGltcG9ydF9kXyAgICAgICAgICE9IE5VTEwpOworICBFWFBFQ1RfVFJVRShpbXBvcnRfZV8gICAgICAgICAhPSBOVUxMKTsKICAgRVhQRUNUX1RSVUUobmVzdGVkX2Zvb18gICAgICAgIT0gTlVMTCk7CiAgIEVYUEVDVF9UUlVFKG5lc3RlZF9iYXJfICAgICAgICE9IE5VTEwpOwogICBFWFBFQ1RfVFJVRShuZXN0ZWRfYmF6XyAgICAgICAhPSBOVUxMKTsKQEAgLTIxMjksNiArMjQxNywxMiBAQAogICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nX3BpZWNlIiksICIxMjQiKTsKICAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2NvcmQiKSwgIjEyNSIpOwogCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2VfLCAxMjYpOworCisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAxMjcpOworCiAgIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAKICAgcmVmbGVjdGlvbi0+QWRkSW50MzIgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ludDMyIiAgICksIDIwMSk7CkBAIC0yMTU1LDYgKzI0NDksOCBAQAogICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMjE5KTsKICAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpOwogICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAyMjApOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAyMjcpOwogCiAgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfYmFyXyk7CiAgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmFyXyk7CkBAIC0yMTg4LDYgKzI0ODQsOCBAQAogICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXywgMzE5KTsKICAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5BZGRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlIikpOwogICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgaW1wb3J0X2RfLCAzMjApOworICBzdWJfbWVzc2FnZSA9IHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfbGF6eV9tZXNzYWdlIikpOworICBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5TZXRJbnQzMihzdWJfbWVzc2FnZSwgbmVzdGVkX2JfLCAzMjcpOwogCiAgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksICBuZXN0ZWRfYmF6Xyk7CiAgIHJlZmxlY3Rpb24tPkFkZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksIGZvcmVpZ25fYmF6Xyk7CkBAIC0yMjIwLDYgKzI1MTgsNjkgQEAKIAogICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmdfcGllY2UiKSwgIjQyNCIpOwogICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9jb3JkIiksICI0MjUiKTsKKworICByZWZsZWN0aW9uLT5TZXRVSW50MzIobWVzc2FnZSwgRigib25lb2ZfdWludDMyIiAgICksIDYwMSk7CisgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgRigib25lb2ZfbmVzdGVkX21lc3NhZ2UiKSk7CisgIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPlNldEludDMyKHN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8sIDYwMik7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLCBGKCJvbmVvZl9zdHJpbmciKSwgIjYwMyIpOworICByZWZsZWN0aW9uLT5TZXRTdHJpbmcobWVzc2FnZSwgRigib25lb2ZfYnl0ZXMiICksICI2MDQiKTsKK30KKwordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6U2V0T25lb2ZWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlTWVzc2FnZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiZm9vX2xhenlfbWVzc2FnZSIpKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50NjQoCisgICAgICBzdWJfbWVzc2FnZSwKKyAgICAgIGRlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZS5xdXhfaW50IiksCisgICAgICAxMDApOworCisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXJfY29yZCIpLAorICAgICAgICAgICAgICAgICAgICAgICAgIjEwMSIpOworICByZWZsZWN0aW9uLT5TZXRJbnQzMihtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfaW50IiksCisgICAgICAgICAgICAgICAgICAgICAgIDEwMik7CisgIHJlZmxlY3Rpb24tPlNldFN0cmluZyhtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfc3RyaW5nIiksCisgICAgICAgICAgICAgICAgICAgICAgICAiMTAzIik7Cit9CisKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OkV4cGVjdE9uZW9mU2V0VmlhUmVmbGVjdGlvbigKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlKSB7CisgIGNvbnN0IERlc2NyaXB0b3IqIGRlc2NyaXB0b3IgPSBtZXNzYWdlLkdldERlc2NyaXB0b3IoKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworICBzdHJpbmcgc2NyYXRjaDsKKyAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImZvb19sYXp5X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZCgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZCgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X2ludCIpKSk7CisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJiYXpfc3RyaW5nIikpKTsKKworICBjb25zdCBNZXNzYWdlKiBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKAorICAgICAgbWVzc2FnZSwgZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKCJmb29fbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfRVEoMTAwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQ2NCgKKyAgICAgICpzdWJfbWVzc2FnZSwKKyAgICAgIGRlc2NyaXB0b3ItPmZpbGUoKS0+cG9vbCgpLT5GaW5kRmllbGRCeU5hbWUoCisgICAgICAgICAgInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RPbmVvZjIuTmVzdGVkTWVzc2FnZS5xdXhfaW50IikpKTsKKworICBFWFBFQ1RfRVEoIjEwMSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZygKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSkpOworICBFWFBFQ1RfRVEoIjEwMSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmFyX2NvcmQiKSwgJnNjcmF0Y2gpKTsKKworICBFWFBFQ1RfRVEoMTAyLCByZWZsZWN0aW9uLT5HZXRJbnQzMigKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X2ludCIpKSk7CisKKyAgRVhQRUNUX0VRKCIxMDMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcoCisgICAgICBtZXNzYWdlLCBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoImJhel9zdHJpbmciKSkpOworICBFWFBFQ1RfRVEoIjEwMyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgIG1lc3NhZ2UsIGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TmFtZSgiYmF6X3N0cmluZyIpLCAmc2NyYXRjaCkpOwogfQogCiB2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpTZXRQYWNrZWRGaWVsZHNWaWFSZWZsZWN0aW9uKApAQCAtMjI4OSwxMCArMjY1MCwxMiBAQAogICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApKSk7CiAgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKIAotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIiAgICAgICAgICAgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIgKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiKSkpOwotICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbGdyb3VwIiAgICAgICAgICAgICAgICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIgICAgICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9mb3JlaWduX21lc3NhZ2UiICAgICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9pbXBvcnRfbWVzc2FnZSIgICAgICAgKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiICAgICAgICAgKSkpOwogCiAgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxncm91cCIpKTsKICAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBncm91cF9hXykpOwpAQCAtMjMwMiw2ICsyNjY1LDEwIEBACiAgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOwogICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOwogICBFWFBFQ1RfVFJVRShzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5IYXNGaWVsZCgqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX1RSVUUoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9UUlVFKHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkhhc0ZpZWxkKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CiAKICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9lbnVtIikpKTsKQEAgLTIzMjIsNyArMjY4OSw3IEBACiAgIEVYUEVDVF9FUSgxMTAgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3NmaXhlZDY0IikpKTsKICAgRVhQRUNUX0VRKDExMSAgLCByZWZsZWN0aW9uLT5HZXRGbG9hdCAobWVzc2FnZSwgRigib3B0aW9uYWxfZmxvYXQiICAgKSkpOwogICBFWFBFQ1RfRVEoMTEyICAsIHJlZmxlY3Rpb24tPkdldERvdWJsZShtZXNzYWdlLCBGKCJvcHRpb25hbF9kb3VibGUiICApKSk7Ci0gIEVYUEVDVF9FUSh0cnVlICwgcmVmbGVjdGlvbi0+R2V0Qm9vbCAgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX1RSVUUoICAgICByZWZsZWN0aW9uLT5HZXRCb29sICAobWVzc2FnZSwgRigib3B0aW9uYWxfYm9vbCIgICAgKSkpOwogICBFWFBFQ1RfRVEoIjExNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9zdHJpbmciICApKSk7CiAgIEVYUEVDVF9FUSgiMTE2IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2J5dGVzIiAgICkpKTsKIApAQCAtMjMzNyw2ICsyNzA0LDEwIEBACiAgIEVYUEVDVF9FUSgxMTksIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOwogICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOwogICBFWFBFQ1RfRVEoMTIwLCBzdWJfbWVzc2FnZS0+R2V0UmVmbGVjdGlvbigpLT5HZXRJbnQzMigqc3ViX21lc3NhZ2UsIGltcG9ydF9kXykpOworICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSIpKTsKKyAgRVhQRUNUX0VRKDEyNiwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0TWVzc2FnZShtZXNzYWdlLCBGKCJvcHRpb25hbF9sYXp5X21lc3NhZ2UiKSk7CisgIEVYUEVDVF9FUSgxMjcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CiAKICAgRVhQRUNUX0VRKCBuZXN0ZWRfYmF6XywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSkpOwogICBFWFBFQ1RfRVEoZm9yZWlnbl9iYXpfLCByZWZsZWN0aW9uLT5HZXRFbnVtKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CkBAIC0yMzQ3LDYgKzI3MTgsMjEgQEAKIAogICBFWFBFQ1RfRVEoIjEyNSIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9jb3JkIikpKTsKICAgRVhQRUNUX0VRKCIxMjUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgRigib3B0aW9uYWxfY29yZCIpLCAmc2NyYXRjaCkpOworCisgIEVYUEVDVF9UUlVFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9uZW9mX2J5dGVzIiApKSk7CisgIEVYUEVDVF9FUSgiNjA0IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoIm9uZW9mX2J5dGVzIiAgICkpKTsKKworICBpZiAoYmFzZV9kZXNjcmlwdG9yXy0+bmFtZSgpID09ICJUZXN0QWxsVHlwZXMiKSB7CisgICAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9uZW9mX3VpbnQzMiIpKSk7CisgICAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9uZW9mX3N0cmluZyIpKSk7CisgIH0gZWxzZSB7CisgICAgRVhQRUNUX1RSVUUocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib25lb2ZfdWludDMyIikpKTsKKyAgICBFWFBFQ1RfVFJVRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvbmVvZl9zdHJpbmciKSkpOworICAgIEVYUEVDVF9FUSg2MDEgICwgcmVmbGVjdGlvbi0+R2V0VUludDMyKG1lc3NhZ2UsIEYoIm9uZW9mX3VpbnQzMiIpKSk7CisgICAgRVhQRUNUX0VRKCI2MDMiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib25lb2Zfc3RyaW5nIikpKTsKKyAgICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9uZW9mX25lc3RlZF9tZXNzYWdlIikpOworICAgIEVYUEVDVF9FUSg2MDIsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CisgIH0KIH0KIAogdm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6RXhwZWN0QWxsRmllbGRzU2V0VmlhUmVmbGVjdGlvbjIoCkBAIC0yMzc3LDYgKzI3NjMsNyBAQAogICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiApKSk7CiAgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlIikpKTsKICAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIgKSkpOworICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIgICApKSk7CiAgIEFTU0VSVF9FUSgyLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICAgICkpKTsKICAgQVNTRVJUX0VRKDIsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iICAgKSkpOwogICBBU1NFUlRfRVEoMiwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ltcG9ydF9lbnVtIiAgICApKSk7CkBAIC0yMzk2LDcgKzI3ODMsNyBAQAogICBFWFBFQ1RfRVEoMjEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3NmaXhlZDY0IiksIDApKTsKICAgRVhQRUNUX0VRKDIxMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9mbG9hdCIgICApLCAwKSk7CiAgIEVYUEVDVF9FUSgyMTIgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWREb3VibGUobWVzc2FnZSwgRigicmVwZWF0ZWRfZG91YmxlIiAgKSwgMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2Jvb2wiICAgICksIDApKTsKKyAgRVhQRUNUX1RSVUUoICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEJvb2wgIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApLCAwKSk7CiAgIEVYUEVDVF9FUSgiMjE1IiwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmcobWVzc2FnZSwgRigicmVwZWF0ZWRfc3RyaW5nIiAgKSwgMCkpOwogICBFWFBFQ1RfRVEoIjIxNiIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2J5dGVzIiAgICksIDApKTsKIApAQCAtMjQxMSw2ICsyNzk4LDggQEAKICAgRVhQRUNUX0VRKDIxOSwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBmb3JlaWduX2NfKSk7CiAgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAwKTsKICAgRVhQRUNUX0VRKDIyMCwgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8pKTsKKyAgc3ViX21lc3NhZ2UgPSAmcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIpLCAwKTsKKyAgRVhQRUNUX0VRKDIyNywgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+R2V0SW50MzIoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKIAogICBFWFBFQ1RfRVEoIG5lc3RlZF9iYXJfLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksMCkpOwogICBFWFBFQ1RfRVEoZm9yZWlnbl9iYXJfLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiksMCkpOwpAQCAtMjQzNiw3ICsyODI1LDcgQEAKICAgRVhQRUNUX0VRKDMxMCAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEludDY0IChtZXNzYWdlLCBGKCJyZXBlYXRlZF9zZml4ZWQ2NCIpLCAxKSk7CiAgIEVYUEVDVF9FUSgzMTEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdCAobWVzc2FnZSwgRigicmVwZWF0ZWRfZmxvYXQiICAgKSwgMSkpOwogICBFWFBFQ1RfRVEoMzEyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2RvdWJsZSIgICksIDEpKTsKLSAgRVhQRUNUX0VRKGZhbHNlLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEJvb2wgIChtZXNzYWdlLCBGKCJyZXBlYXRlZF9ib29sIiAgICApLCAxKSk7CisgIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sICAobWVzc2FnZSwgRigicmVwZWF0ZWRfYm9vbCIgICAgKSwgMSkpOwogICBFWFBFQ1RfRVEoIjMxNSIsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nKG1lc3NhZ2UsIEYoInJlcGVhdGVkX3N0cmluZyIgICksIDEpKTsKICAgRVhQRUNUX0VRKCIzMTYiLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZyhtZXNzYWdlLCBGKCJyZXBlYXRlZF9ieXRlcyIgICApLCAxKSk7CiAKQEAgLTI0NTMsNiArMjg0Miw4IEBACiAgIEVYUEVDVF9FUSgzMTksIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgZm9yZWlnbl9jXykpOwogICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiKSwgMSk7CiAgIEVYUEVDVF9FUSgzMjAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiKSwgMSk7CisgIEVYUEVDVF9FUSgzMjcsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CiAKICAgRVhQRUNUX0VRKCBuZXN0ZWRfYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiApLDEpKTsKICAgRVhQRUNUX0VRKGZvcmVpZ25fYmF6XywgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fZW51bSIpLDEpKTsKQEAgLTI1MDksNyArMjkwMCw3IEBACiAgIEVYUEVDVF9FUSg0MTAgICwgcmVmbGVjdGlvbi0+R2V0SW50NjQgKG1lc3NhZ2UsIEYoImRlZmF1bHRfc2ZpeGVkNjQiKSkpOwogICBFWFBFQ1RfRVEoNDExICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKICAgRVhQRUNUX0VRKDQxMiAgLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigiZGVmYXVsdF9kb3VibGUiICApKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgcmVmbGVjdGlvbi0+R2V0Qm9vbCAgKG1lc3NhZ2UsIEYoImRlZmF1bHRfYm9vbCIgICAgKSkpOworICBFWFBFQ1RfRkFMU0UoICAgIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKICAgRVhQRUNUX0VRKCI0MTUiLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigiZGVmYXVsdF9zdHJpbmciICApKSk7CiAgIEVYUEVDVF9FUSgiNDE2IiwgcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIEYoImRlZmF1bHRfYnl0ZXMiICAgKSkpOwogCkBAIC0yNTU5LDcgKzI5NTAsNyBAQAogICBFWFBFQ1RfRVEoNjEwICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkSW50NjQgKG1lc3NhZ2UsIEYoInBhY2tlZF9zZml4ZWQ2NCIpLCAwKSk7CiAgIEVYUEVDVF9FUSg2MTEgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRGbG9hdCAobWVzc2FnZSwgRigicGFja2VkX2Zsb2F0IiAgICksIDApKTsKICAgRVhQRUNUX0VRKDYxMiAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZERvdWJsZShtZXNzYWdlLCBGKCJwYWNrZWRfZG91YmxlIiAgKSwgMCkpOwotICBFWFBFQ1RfRVEodHJ1ZSAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbCAgKG1lc3NhZ2UsIEYoInBhY2tlZF9ib29sIiAgICApLCAwKSk7CisgIEVYUEVDVF9UUlVFKCAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sICAobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICksIDApKTsKICAgRVhQRUNUX0VRKGZvcmVpZ25fYmFyXywKICAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJwYWNrZWRfZW51bSIpLCAwKSk7CiAKQEAgLTI1NzUsNyArMjk2Niw3IEBACiAgIEVYUEVDVF9FUSg3MTAgICwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRJbnQ2NCAobWVzc2FnZSwgRigicGFja2VkX3NmaXhlZDY0IiksIDEpKTsKICAgRVhQRUNUX0VRKDcxMSAgLCByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEZsb2F0IChtZXNzYWdlLCBGKCJwYWNrZWRfZmxvYXQiICAgKSwgMSkpOwogICBFWFBFQ1RfRVEoNzEyICAsIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRG91YmxlKG1lc3NhZ2UsIEYoInBhY2tlZF9kb3VibGUiICApLCAxKSk7Ci0gIEVYUEVDVF9FUShmYWxzZSwgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRCb29sICAobWVzc2FnZSwgRigicGFja2VkX2Jvb2wiICAgICksIDEpKTsKKyAgRVhQRUNUX0ZBTFNFKCAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZEJvb2wgIChtZXNzYWdlLCBGKCJwYWNrZWRfYm9vbCIgICAgKSwgMSkpOwogICBFWFBFQ1RfRVEoZm9yZWlnbl9iYXpfLAogICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiksIDEpKTsKIH0KQEAgLTI2MDksNiArMzAwMCw4IEBACiAgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIgKSkpOwogICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlIikpKTsKICAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiApKSk7CisgIEVYUEVDVF9GQUxTRShyZWZsZWN0aW9uLT5IYXNGaWVsZChtZXNzYWdlLCBGKCJvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UiKSkpOworICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpKTsKIAogICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQobWVzc2FnZSwgRigib3B0aW9uYWxfbmVzdGVkX2VudW0iICkpKTsKICAgRVhQRUNUX0ZBTFNFKHJlZmxlY3Rpb24tPkhhc0ZpZWxkKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ZvcmVpZ25fZW51bSIpKSk7CkBAIC0yNjMwLDcgKzMwMjMsNyBAQAogICBFWFBFQ1RfRVEoMCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJvcHRpb25hbF9zZml4ZWQ2NCIpKSk7CiAgIEVYUEVDVF9FUSgwICAgICwgcmVmbGVjdGlvbi0+R2V0RmxvYXQgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Zsb2F0IiAgICkpKTsKICAgRVhQRUNUX0VRKDAgICAgLCByZWZsZWN0aW9uLT5HZXREb3VibGUobWVzc2FnZSwgRigib3B0aW9uYWxfZG91YmxlIiAgKSkpOwotICBFWFBFQ1RfRVEoZmFsc2UsIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJvcHRpb25hbF9ib29sIiAgICApKSk7CisgIEVYUEVDVF9GQUxTRSggICAgcmVmbGVjdGlvbi0+R2V0Qm9vbCAgKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2Jvb2wiICAgICkpKTsKICAgRVhQRUNUX0VRKCIiICAgLCByZWZsZWN0aW9uLT5HZXRTdHJpbmcobWVzc2FnZSwgRigib3B0aW9uYWxfc3RyaW5nIiAgKSkpOwogICBFWFBFQ1RfRVEoIiIgICAsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJvcHRpb25hbF9ieXRlcyIgICApKSk7CiAKQEAgLTI2NTAsNiArMzA0MywxMiBAQAogICBzdWJfbWVzc2FnZSA9ICZyZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIEYoIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIikpOwogICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZF8pKTsKICAgRVhQRUNUX0VRKDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2RfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIikpOworICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBpbXBvcnRfZV8pKTsKKyAgRVhQRUNUX0VRKDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgaW1wb3J0X2VfKSk7CisgIHN1Yl9tZXNzYWdlID0gJnJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgRigib3B0aW9uYWxfbGF6eV9tZXNzYWdlIikpOworICBFWFBFQ1RfRkFMU0Uoc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+SGFzRmllbGQoKnN1Yl9tZXNzYWdlLCBuZXN0ZWRfYl8pKTsKKyAgRVhQRUNUX0VRKDAsIHN1Yl9tZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCktPkdldEludDMyKCpzdWJfbWVzc2FnZSwgbmVzdGVkX2JfKSk7CiAKICAgLy8gRW51bXMgd2l0aG91dCBkZWZhdWx0cyBhcmUgc2V0IHRvIHRoZSBmaXJzdCB2YWx1ZSBpbiB0aGUgZW51bS4KICAgRVhQRUNUX0VRKCBuZXN0ZWRfZm9vXywgcmVmbGVjdGlvbi0+R2V0RW51bShtZXNzYWdlLCBGKCJvcHRpb25hbF9uZXN0ZWRfZW51bSIgKSkpOwpAQCAtMjY4Myw2ICszMDgyLDcgQEAKICAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSIgKSkpOwogICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSIpKSk7CiAgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UiICkpKTsKKyAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9sYXp5X21lc3NhZ2UiICAgKSkpOwogICBFWFBFQ1RfRVEoMCwgcmVmbGVjdGlvbi0+RmllbGRTaXplKG1lc3NhZ2UsIEYoInJlcGVhdGVkX25lc3RlZF9lbnVtIiAgICApKSk7CiAgIEVYUEVDVF9FUSgwLCByZWZsZWN0aW9uLT5GaWVsZFNpemUobWVzc2FnZSwgRigicmVwZWF0ZWRfZm9yZWlnbl9lbnVtIiAgICkpKTsKICAgRVhQRUNUX0VRKDAsIHJlZmxlY3Rpb24tPkZpZWxkU2l6ZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfZW51bSIgICAgKSkpOwpAQCAtMjcyNyw3ICszMTI3LDcgQEAKICAgRVhQRUNUX0VRKC01MCAgICAsIHJlZmxlY3Rpb24tPkdldEludDY0IChtZXNzYWdlLCBGKCJkZWZhdWx0X3NmaXhlZDY0IikpKTsKICAgRVhQRUNUX0VRKCA1MS41ICAsIHJlZmxlY3Rpb24tPkdldEZsb2F0IChtZXNzYWdlLCBGKCJkZWZhdWx0X2Zsb2F0IiAgICkpKTsKICAgRVhQRUNUX0VRKCA1MmUzICAsIHJlZmxlY3Rpb24tPkdldERvdWJsZShtZXNzYWdlLCBGKCJkZWZhdWx0X2RvdWJsZSIgICkpKTsKLSAgRVhQRUNUX0VRKHRydWUgICAsIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKKyAgRVhQRUNUX1RSVUUoICAgICAgIHJlZmxlY3Rpb24tPkdldEJvb2wgIChtZXNzYWdlLCBGKCJkZWZhdWx0X2Jvb2wiICAgICkpKTsKICAgRVhQRUNUX0VRKCJoZWxsbyIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X3N0cmluZyIgICkpKTsKICAgRVhQRUNUX0VRKCJ3b3JsZCIsIHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCBGKCJkZWZhdWx0X2J5dGVzIiAgICkpKTsKIApAQCAtMjc5Niw2ICszMTk2LDggQEAKICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGZvcmVpZ25fY18sIDUxOSk7CiAgIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+TXV0YWJsZVJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBGKCJyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSIpLCAxKTsKICAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIGltcG9ydF9kXywgNTIwKTsKKyAgc3ViX21lc3NhZ2UgPSByZWZsZWN0aW9uLT5NdXRhYmxlUmVwZWF0ZWRNZXNzYWdlKG1lc3NhZ2UsIEYoInJlcGVhdGVkX2xhenlfbWVzc2FnZSIpLCAxKTsKKyAgc3ViX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKS0+U2V0SW50MzIoc3ViX21lc3NhZ2UsIG5lc3RlZF9iXywgNTI3KTsKIAogICByZWZsZWN0aW9uLT5TZXRSZXBlYXRlZEVudW0obWVzc2FnZSwgRigicmVwZWF0ZWRfbmVzdGVkX2VudW0iICksIDEsICBuZXN0ZWRfZm9vXyk7CiAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bShtZXNzYWdlLCBGKCJyZXBlYXRlZF9mb3JlaWduX2VudW0iKSwgMSwgZm9yZWlnbl9mb29fKTsKQEAgLTI4MjQsNyArMzIyNiw4IEBACiAgIHJlZmxlY3Rpb24tPlNldFJlcGVhdGVkRW51bSAgKG1lc3NhZ2UsIEYoInBhY2tlZF9lbnVtIiAgICApLCAxLCBmb3JlaWduX2Zvb18pOwogfQogCi12b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpSZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKSB7Cit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpSZW1vdmVMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CiAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CiAKICAgdmVjdG9yPGNvbnN0IEZpZWxkRGVzY3JpcHRvcio+IG91dHB1dDsKQEAgLTI4MzcsNiArMzI0MCwyNiBAQAogICB9CiB9CiAKK3ZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlJlbGVhc2VMYXN0UmVwZWF0ZWRzVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlLCBib29sIGV4cGVjdF9leHRlbnNpb25zX25vdG51bGwpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gb3V0cHV0OworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmb3V0cHV0KTsKKyAgZm9yIChpbnQgaT0wOyBpPG91dHB1dC5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBvdXRwdXRbaV07CisgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgY29udGludWU7CisgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpICE9IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSBjb250aW51ZTsKKworICAgIE1lc3NhZ2UqIHJlbGVhc2VkID0gcmVmbGVjdGlvbi0+UmVsZWFzZUxhc3QobWVzc2FnZSwgZmllbGQpOworICAgIGlmICghZmllbGQtPmlzX2V4dGVuc2lvbigpIHx8IGV4cGVjdF9leHRlbnNpb25zX25vdG51bGwpIHsKKyAgICAgIEFTU0VSVF9UUlVFKHJlbGVhc2VkICE9IE5VTEwpIDw8ICJSZWxlYXNlTGFzdCByZXR1cm5lZCBOVUxMIGZvcjogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPDwgZmllbGQtPm5hbWUoKTsKKyAgICB9CisgICAgZGVsZXRlIHJlbGVhc2VkOworICB9Cit9CisKIHZvaWQgVGVzdFV0aWw6OlJlZmxlY3Rpb25UZXN0ZXI6OlN3YXBSZXBlYXRlZHNWaWFSZWZsZWN0aW9uKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKIApAQCAtMjg1MCw1ICszMjczLDc0IEBACiAgIH0KIH0KIAordm9pZCBUZXN0VXRpbDo6UmVmbGVjdGlvblRlc3Rlcjo6CitTZXRBbGxvY2F0ZWRPcHRpb25hbE1lc3NhZ2VGaWVsZHNUb051bGxWaWFSZWZsZWN0aW9uKAorICAgIE1lc3NhZ2UqIG1lc3NhZ2UpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICByZWZsZWN0aW9uLT5MaXN0RmllbGRzKCptZXNzYWdlLCAmZmllbGRzKTsKKworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7ICsraSkgeworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQgPSBmaWVsZHNbaV07CisgICAgaWYgKCFmaWVsZC0+aXNfb3B0aW9uYWwoKSB8fAorICAgICAgICBmaWVsZC0+Y3BwX3R5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgY29udGludWU7CisKKyAgICByZWZsZWN0aW9uLT5TZXRBbGxvY2F0ZWRNZXNzYWdlKG1lc3NhZ2UsIE5VTEwsIGZpZWxkKTsKKyAgfQorfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjoKK1NldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgTWVzc2FnZSogZnJvbV9tZXNzYWdlLAorICAgIE1lc3NhZ2UqIHRvX21lc3NhZ2UpIHsKKyAgRVhQRUNUX0VRKGZyb21fbWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLCB0b19tZXNzYWdlLT5HZXREZXNjcmlwdG9yKCkpOworICBjb25zdCBSZWZsZWN0aW9uKiBmcm9tX3JlZmxlY3Rpb24gPSBmcm9tX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKyAgY29uc3QgUmVmbGVjdGlvbiogdG9fcmVmbGVjdGlvbiA9IHRvX21lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICB2ZWN0b3I8Y29uc3QgRmllbGREZXNjcmlwdG9yKj4gZmllbGRzOworICBmcm9tX3JlZmxlY3Rpb24tPkxpc3RGaWVsZHMoKmZyb21fbWVzc2FnZSwgJmZpZWxkcyk7CisKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHMuc2l6ZSgpOyArK2kpIHsKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gZmllbGRzW2ldOworICAgIGlmICghZmllbGQtPmlzX29wdGlvbmFsKCkgfHwKKyAgICAgICAgZmllbGQtPmNwcF90eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIGNvbnRpbnVlOworCisgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPQorICAgICAgICBmcm9tX3JlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKGZyb21fbWVzc2FnZSwgZmllbGQpOworICAgIHRvX3JlZmxlY3Rpb24tPlNldEFsbG9jYXRlZE1lc3NhZ2UodG9fbWVzc2FnZSwgc3ViX21lc3NhZ2UsIGZpZWxkKTsKKyAgfQorfQorCit2b2lkIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpFeHBlY3RNZXNzYWdlc1JlbGVhc2VkVmlhUmVmbGVjdGlvbigKKyAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgIFRlc3RVdGlsOjpSZWZsZWN0aW9uVGVzdGVyOjpNZXNzYWdlUmVsZWFzZVN0YXRlIGV4cGVjdGVkX3JlbGVhc2Vfc3RhdGUpIHsKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UtPkdldFJlZmxlY3Rpb24oKTsKKworICBzdGF0aWMgY29uc3QgY2hhciogZmllbGRzW10gPSB7CisgICAgIm9wdGlvbmFsZ3JvdXAiLAorICAgICJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIsCisgICAgIm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSIsCisgICAgIm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlIiwKKyAgfTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBHT09HTEVfQVJSQVlTSVpFKGZpZWxkcyk7IGkrKykgeworICAgIGNvbnN0IE1lc3NhZ2UmIHN1Yl9tZXNzYWdlID0gcmVmbGVjdGlvbi0+R2V0TWVzc2FnZSgqbWVzc2FnZSwgRihmaWVsZHNbaV0pKTsKKyAgICBNZXNzYWdlKiByZWxlYXNlZCA9IHJlZmxlY3Rpb24tPlJlbGVhc2VNZXNzYWdlKG1lc3NhZ2UsIEYoZmllbGRzW2ldKSk7CisgICAgc3dpdGNoIChleHBlY3RlZF9yZWxlYXNlX3N0YXRlKSB7CisgICAgICBjYXNlIElTX05VTEw6CisgICAgICAgIEVYUEVDVF9UUlVFKHJlbGVhc2VkID09IE5VTEwpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgTk9UX05VTEw6CisgICAgICAgIEVYUEVDVF9UUlVFKHJlbGVhc2VkICE9IE5VTEwpOworICAgICAgICBFWFBFQ1RfRVEoJnN1Yl9tZXNzYWdlLCByZWxlYXNlZCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBDQU5fQkVfTlVMTDoKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlbGV0ZSByZWxlYXNlZDsKKyAgICBFWFBFQ1RfRkFMU0UocmVmbGVjdGlvbi0+SGFzRmllbGQoKm1lc3NhZ2UsIEYoZmllbGRzW2ldKSkpOworICB9Cit9CisKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaAppbmRleCAyNTE2NWYzLi4xYzEzYTFhIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWwuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDMsMjEgKzQzLDI5IEBACiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKLW5hbWVzcGFjZSB1bml0dGVzdCA9IHByb3RvYnVmX3VuaXR0ZXN0OworbmFtZXNwYWNlIHVuaXR0ZXN0ID0gOjpwcm90b2J1Zl91bml0dGVzdDsKIG5hbWVzcGFjZSB1bml0dGVzdF9pbXBvcnQgPSBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQ7CiAKIGNsYXNzIFRlc3RVdGlsIHsKICBwdWJsaWM6CiAgIC8vIFNldCBldmVyeSBmaWVsZCBpbiB0aGUgbWVzc2FnZSB0byBhIHVuaXF1ZSB2YWx1ZS4KICAgc3RhdGljIHZvaWQgU2V0QWxsRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRPcHRpb25hbEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgQWRkUmVwZWF0ZWRGaWVsZHMxKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBBZGRSZXBlYXRlZEZpZWxkczIodW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIFNldERlZmF1bHRGaWVsZHModW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIFNldE9uZW9mRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMqIG1lc3NhZ2UpOwogICBzdGF0aWMgdm9pZCBTZXRBbGxFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIFNldE9uZW9mRmllbGRzKHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyogbWVzc2FnZSk7CiAgIHN0YXRpYyB2b2lkIFNldEFsbEZpZWxkc0FuZEV4dGVuc2lvbnModW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyogbWVzc2FnZSk7CiAgIHN0YXRpYyB2b2lkIFNldFBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFBhY2tlZFR5cGVzKiBtZXNzYWdlKTsKICAgc3RhdGljIHZvaWQgU2V0UGFja2VkRXh0ZW5zaW9ucyh1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMqIG1lc3NhZ2UpOwogICBzdGF0aWMgdm9pZCBTZXRVbnBhY2tlZEZpZWxkcyh1bml0dGVzdDo6VGVzdFVucGFja2VkVHlwZXMqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRPbmVvZjEodW5pdHRlc3Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBTZXRPbmVvZjIodW5pdHRlc3Q6OlRlc3RPbmVvZjIqIG1lc3NhZ2UpOwogCiAgIC8vIFVzZSB0aGUgcmVwZWF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNldF8qKCkgYWNjZXNzb3JzIHRvIG1vZGlmeSBhbGwgdGhlCi0gIC8vIHJlcGVhdGVkIGZpZWxkcyBvZiB0aGUgbWVzc3NhZ2UgKHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgorICAvLyByZXBlYXRlZCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgKHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgogICAvLyBpbml0aWFsaXplZCB3aXRoIFNldCpGaWVsZHMoKSkuICBTZXQqRmllbGRzKCkgaXRzZWxmIG9ubHkgdGVzdHMKICAgLy8gdGhlIGFkZF8qKCkgYWNjZXNzb3JzLgogICBzdGF0aWMgdm9pZCBNb2RpZnlSZXBlYXRlZEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzKiBtZXNzYWdlKTsKQEAgLTc1LDYgKzgzLDEwIEBACiAgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOwogICBzdGF0aWMgdm9pZCBFeHBlY3RVbnBhY2tlZEZpZWxkc1NldCgKICAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRUeXBlcyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdFVucGFja2VkRXh0ZW5zaW9uc1NldCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0VW5wYWNrZWRFeHRlbnNpb25zJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0T25lb2ZTZXQxKGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0T25lb2ZTZXQyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyJiBtZXNzYWdlKTsKIAogICAvLyBFeHBlY3QgdGhhdCB0aGUgbWVzc2FnZSBpcyBtb2RpZmllZCBhcyB3b3VsZCBiZSBleHBlY3RlZCBmcm9tCiAgIC8vIE1vZGlmeSpGaWVsZHMoKS4KQEAgLTkzLDYgKzEwNSw3IEBACiAgIHN0YXRpYyB2b2lkIEV4cGVjdFBhY2tlZENsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0UGFja2VkVHlwZXMmIG1lc3NhZ2UpOwogICBzdGF0aWMgdm9pZCBFeHBlY3RQYWNrZWRFeHRlbnNpb25zQ2xlYXIoCiAgICAgICBjb25zdCB1bml0dGVzdDo6VGVzdFBhY2tlZEV4dGVuc2lvbnMmIG1lc3NhZ2UpOworICBzdGF0aWMgdm9pZCBFeHBlY3RPbmVvZkNsZWFyKGNvbnN0IHVuaXR0ZXN0OjpUZXN0T25lb2YyJiBtZXNzYWdlKTsKIAogICAvLyBDaGVjayB0aGF0IHRoZSBwYXNzZWQtaW4gc2VyaWFsaXphdGlvbiBpcyB0aGUgY2Fub25pY2FsIHNlcmlhbGl6YXRpb24gd2UKICAgLy8gZXhwZWN0IGZvciBhIFRlc3RGaWVsZE9yZGVyaW5ncyBtZXNzYWdlIGZpbGxlZCBpbiBieQpAQCAtMTA0LDYgKzExNywxMCBAQAogICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSk7CiAgIHN0YXRpYyB2b2lkIEV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZW1vdmVkKAogICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxFeHRlbnNpb25zJiBtZXNzYWdlKTsKKyAgc3RhdGljIHZvaWQgRXhwZWN0TGFzdFJlcGVhdGVkc1JlbGVhc2VkKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyYgbWVzc2FnZSk7CisgIHN0YXRpYyB2b2lkIEV4cGVjdExhc3RSZXBlYXRlZEV4dGVuc2lvbnNSZWxlYXNlZCgKKyAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CiAKICAgLy8gQ2hlY2sgdGhhdCBhbGwgcmVwZWF0ZWQgZmllbGRzIGhhdmUgaGFkIHRoZWlyIGZpcnN0IGFuZCBsYXN0IGVsZW1lbnRzCiAgIC8vIHN3YXBwZWQuCkBAIC0xMTEsNiArMTI4LDkgQEAKICAgc3RhdGljIHZvaWQgRXhwZWN0UmVwZWF0ZWRFeHRlbnNpb25zU3dhcHBlZCgKICAgICAgIGNvbnN0IHVuaXR0ZXN0OjpUZXN0QWxsRXh0ZW5zaW9ucyYgbWVzc2FnZSk7CiAKKyAgc3RhdGljIHZvaWQgRXhwZWN0QXRNb3N0T25lRmllbGRTZXRJbk9uZW9mKAorICAgICAgY29uc3QgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgJm1lc3NhZ2UpOworCiAgIC8vIExpa2UgYWJvdmUsIGJ1dCB1c2UgdGhlIHJlZmxlY3Rpb24gaW50ZXJmYWNlLgogICBjbGFzcyBSZWZsZWN0aW9uVGVzdGVyIHsKICAgIHB1YmxpYzoKQEAgLTEzMiw3ICsxNTIsMjcgQEAKICAgICB2b2lkIEV4cGVjdFBhY2tlZENsZWFyVmlhUmVmbGVjdGlvbihjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKIAogICAgIHZvaWQgUmVtb3ZlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgICAgdm9pZCBSZWxlYXNlTGFzdFJlcGVhdGVkc1ZpYVJlZmxlY3Rpb24oCisgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UsIGJvb2wgZXhwZWN0X2V4dGVuc2lvbnNfbm90bnVsbCk7CiAgICAgdm9pZCBTd2FwUmVwZWF0ZWRzVmlhUmVmbGVjdGlvbihNZXNzYWdlKiBtZXNzYWdlKTsKKyAgICB2b2lkIFNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTnVsbFZpYVJlZmxlY3Rpb24oCisgICAgICAgIE1lc3NhZ2UqIG1lc3NhZ2UpOworICAgIHN0YXRpYyB2b2lkIFNldEFsbG9jYXRlZE9wdGlvbmFsTWVzc2FnZUZpZWxkc1RvTWVzc2FnZVZpYVJlZmxlY3Rpb24oCisgICAgICAgIE1lc3NhZ2UqIGZyb21fbWVzc2FnZSwKKyAgICAgICAgTWVzc2FnZSogdG9fbWVzc2FnZSk7CisKKyAgICBlbnVtIE1lc3NhZ2VSZWxlYXNlU3RhdGUgeworICAgICAgSVNfTlVMTCwKKyAgICAgIENBTl9CRV9OVUxMLAorICAgICAgTk9UX05VTEwsCisgICAgfTsKKyAgICB2b2lkIEV4cGVjdE1lc3NhZ2VzUmVsZWFzZWRWaWFSZWZsZWN0aW9uKAorICAgICAgICBNZXNzYWdlKiBtZXNzYWdlLCBNZXNzYWdlUmVsZWFzZVN0YXRlIGV4cGVjdGVkX3JlbGVhc2Vfc3RhdGUpOworCisgICAgLy8gU2V0IGFuZCBjaGVjayBmdW5jdGlvbnMgZm9yIFRlc3RPbmVvZjIgbWVzc2FnZXMuIE5vIG5lZWQgdG8gY29uc3RydWN0CisgICAgLy8gdGhlIFJlZmxlY3Rpb25UZXN0ZXIgYnkgVGVzdEFsbFR5cGVzIG5vciBUZXN0QWxsRXh0ZW5zaW9ucy4KKyAgICBzdGF0aWMgdm9pZCBTZXRPbmVvZlZpYVJlZmxlY3Rpb24oTWVzc2FnZSogbWVzc2FnZSk7CisgICAgc3RhdGljIHZvaWQgRXhwZWN0T25lb2ZTZXRWaWFSZWZsZWN0aW9uKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UpOwogCiAgICBwcml2YXRlOgogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogRihjb25zdCBzdHJpbmcmIG5hbWUpOwpAQCAtMTQ0LDYgKzE4NCw3IEBACiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfYl87CiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmb3JlaWduX2NfOwogICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW1wb3J0X2RfOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogaW1wb3J0X2VfOwogCiAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Zvb187CiAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogbmVzdGVkX2Jhcl87CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCmluZGV4IGQ3MTQwZTAuLjM4OGMwY2IgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMyw2ICszMyw3IEBACiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KIAogCkBAIC02MiwxMCArNjMsMTIgQEAKICAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX3N0cmluZyAgKCIxMTUiKTsKICAgbWVzc2FnZS0+c2V0X29wdGlvbmFsX2J5dGVzICAgKCIxMTYiKTsKIAotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpLT5zZXRfYSgxMTcpOwotICBtZXNzYWdlLT5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICgpLT5zZXRfYmIoMTE4KTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMTE5KTsKLSAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKS0+c2V0X2QoMTIwKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbGdyb3VwICAgICAgICAgICAgICAgICAoKS0+c2V0X2EoMTE3KTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS0+c2V0X2JiKDExOCk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlICAgICAgKCktPnNldF9jKDExOSk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgICAgICAgKCktPnNldF9kKDEyMCk7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCktPnNldF9lKDEyNik7CisgIG1lc3NhZ2UtPm11dGFibGVfb3B0aW9uYWxfbGF6eV9tZXNzYWdlICAgICAgICAgKCktPnNldF9iYigxMjcpOwogCiAgIG1lc3NhZ2UtPnNldF9vcHRpb25hbF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiApOwogICBtZXNzYWdlLT5zZXRfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgKTsKQEAgLTk0LDYgKzk3LDcgQEAKICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgpLT5zZXRfYmIoMjE4KTsKICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgpLT5zZXRfYygyMTkpOwogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgKCktPnNldF9kKDIyMCk7CisgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoKS0+c2V0X2JiKDIyNyk7CiAKICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtICh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICk7CiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX2VudW0odW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICApOwpAQCAtMTIxLDYgKzEyNSw3IEBACiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSAoKS0+c2V0X2JiKDMxOCk7CiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoKS0+c2V0X2MoMzE5KTsKICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgpLT5zZXRfZCgzMjApOworICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfbGF6eV9tZXNzYWdlICAgKCktPnNldF9iYigzMjcpOwogCiAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiApOwogICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgKTsKQEAgLTE0OSw2ICsxNTQsMTEgQEAKICAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfZm9yZWlnbl9lbnVtKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgKTsKICAgbWVzc2FnZS0+c2V0X2RlZmF1bHRfaW1wb3J0X2VudW0gKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PKTsKIAorCisgIG1lc3NhZ2UtPnNldF9vbmVvZl91aW50MzIoNjAxKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpLT5zZXRfYmIoNjAyKTsKKyAgbWVzc2FnZS0+c2V0X29uZW9mX3N0cmluZygiNjAzIik7CisgIG1lc3NhZ2UtPnNldF9vbmVvZl9ieXRlcygiNjA0Iik7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTE3NCw2ICsxODQsNyBAQAogICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgxKS0+c2V0X2JiKDUxOCk7CiAgIG1lc3NhZ2UtPm11dGFibGVfcmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlKDEpLT5zZXRfYyg1MTkpOwogICBtZXNzYWdlLT5tdXRhYmxlX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS0+c2V0X2QoNTIwKTsKKyAgbWVzc2FnZS0+bXV0YWJsZV9yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMSktPnNldF9iYig1MjcpOwogCiAgIG1lc3NhZ2UtPnNldF9yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMSwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyApOwogICBtZXNzYWdlLT5zZXRfcmVwZWF0ZWRfZm9yZWlnbl9lbnVtKDEsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgKTsKQEAgLTIwMSwxNSArMjEyLDE5IEBACiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZyAgKCkpOwogICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9ieXRlcyAgICgpKTsKIAotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbGdyb3VwICAgICAgICAgICAoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKSk7CiAKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAoKS5oYXNfYSgpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5oYXNfYmIoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlKCkuaGFzX2MoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCkuaGFzX2QoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkuaGFzX2EoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgICAgICAgKCkuaGFzX2JiKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmhhc19jKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpLmhhc19kKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpLmhhc19lKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmhhc19iYigpKTsKIAogICBFWFBFQ1RfVFJVRShtZXNzYWdlLmhhc19vcHRpb25hbF9uZXN0ZWRfZW51bSAoKSk7CiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fZW51bSgpKTsKQEAgLTIzMiwxMCArMjQ3LDEyIEBACiAgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5vcHRpb25hbF9zdHJpbmcgICgpKTsKICAgRVhQRUNUX0VRKCIxMTYiLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzICAgKCkpOwogCi0gIEVYUEVDVF9FUSgxMTcsIG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgKCkuYSgpKTsKLSAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5iYigpKTsKLSAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5jKCkpOwotICBFWFBFQ1RfRVEoMTIwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpLmQoKSk7CisgIEVYUEVDVF9FUSgxMTcsIG1lc3NhZ2Uub3B0aW9uYWxncm91cCAgICAgICAgICAgICAgICAgKCkuYSgpKTsKKyAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5iYigpKTsKKyAgRVhQRUNUX0VRKDExOSwgbWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UgICAgICAoKS5jKCkpOworICBFWFBFQ1RfRVEoMTIwLCBtZXNzYWdlLm9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpLmQoKSk7CisgIEVYUEVDVF9FUSgxMjYsIG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuZSgpKTsKKyAgRVhQRUNUX0VRKDEyNywgbWVzc2FnZS5vcHRpb25hbF9sYXp5X21lc3NhZ2UgICAgICAgICAoKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiAsIG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICAsIG1lc3NhZ2Uub3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOwpAQCAtMjY0LDYgKzI4MSw3IEBACiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUgKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2Vfc2l6ZSgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2Vfc2l6ZSAoKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZV9zaXplICAgKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bV9zaXplICAgICgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9lbnVtX3NpemUgICAoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9lbnVtX3NpemUgICAgKCkpOwpAQCAtMjg5LDYgKzMwNyw3IEBACiAgIEVYUEVDVF9FUSgyMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDApLmJiKCkpOwogICBFWFBFQ1RfRVEoMjE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgwKS5jKCkpOwogICBFWFBFQ1RfRVEoMjIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgwKS5kKCkpOworICBFWFBFQ1RfRVEoMjI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgwKS5iYigpKTsKIAogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfZW51bSAoMCkpOwpAQCAtMzE1LDYgKzMzNCw3IEBACiAgIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLmJiKCkpOwogICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOwogICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOworICBFWFBFQ1RfRVEoMzI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgxKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgxKSk7CkBAIC0zNjQsNiArMzg0LDEzIEBACiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICwgbWVzc2FnZS5kZWZhdWx0X2ZvcmVpZ25fZW51bSgpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLmRlZmF1bHRfaW1wb3J0X2VudW0gKCkpOwogCisKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3VpbnQzMiAgICAgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfbmVzdGVkX21lc3NhZ2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9zdHJpbmcgICAgICAgICgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5oYXNfb25lb2ZfYnl0ZXMgICAgICAgICAgKCkpOworCisgIEVYUEVDVF9FUSgiNjA0IiwgbWVzc2FnZS5vbmVvZl9ieXRlcygpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMzg2LDEwICs0MTMsMTIgQEAKICAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3N0cmluZyAgKCkpOwogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfYnl0ZXMgICAoKSk7CiAKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2ltcG9ydF9tZXNzYWdlICAgICAgICgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpKTsKIAogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfbmVzdGVkX2VudW0gKCkpOwogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb3B0aW9uYWxfZm9yZWlnbl9lbnVtKCkpOwpAQCAtNDE0LDEwICs0NDMsMTIgQEAKICAgRVhQRUNUX0VRKCIiICAgLCBtZXNzYWdlLm9wdGlvbmFsX2J5dGVzICAgKCkpOwogCiAgIC8vIEVtYmVkZGVkIG1lc3NhZ2VzIHNob3VsZCBhbHNvIGJlIGNsZWFyLgotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAoKS5oYXNfYSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgKCkuaGFzX2JiKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9mb3JlaWduX21lc3NhZ2UoKS5oYXNfYygpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgKCkuaGFzX2QoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsZ3JvdXAgICAgICAgICAgICAgICAgICgpLmhhc19hKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgICAgICAoKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZSAgICAgICgpLmhhc19jKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSAgICAgICAoKS5oYXNfZCgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2Uub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlKCkuaGFzX2UoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLm9wdGlvbmFsX2xhenlfbWVzc2FnZSAgICAgICAgICgpLmhhc19iYigpKTsKIAogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbGdyb3VwICAgICAgICAgICAoKS5hKCkpOwogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAoKS5iYigpKTsKQEAgLTQ1MSw2ICs0ODIsNyBAQAogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSAgICgpKTsKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7CiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOwogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKQEAgLTQ5OSw2ICs1MzEsMTEgQEAKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgLCBtZXNzYWdlLmRlZmF1bHRfZm9yZWlnbl9lbnVtKCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3RfaW1wb3J0OjpJTVBPUlRfTElURV9CQVIsIG1lc3NhZ2UuZGVmYXVsdF9pbXBvcnRfZW51bSAoKSk7CiAKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfdWludDMyICAgICAgICAoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLmhhc19vbmVvZl9uZXN0ZWRfbWVzc2FnZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuaGFzX29uZW9mX3N0cmluZyAgICAgICAgKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5oYXNfb25lb2ZfYnl0ZXMgICAgICAgICAoKSk7CiB9CiAKIC8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KQEAgLTUyOCw2ICs1NjUsNyBAQAogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9zaXplICgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX3NpemUoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX3NpemUgKCkpOworICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2Vfc2l6ZSAgICgpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW1fc2l6ZSAgICAoKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9zaXplICAgKCkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfZW51bV9zaXplICAgICgpKTsKQEAgLTU1Myw2ICs1OTEsNyBAQAogICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlICgwKS5iYigpKTsKICAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX21lc3NhZ2UoMCkuYygpKTsKICAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5yZXBlYXRlZF9pbXBvcnRfbWVzc2FnZSAoMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5yZXBlYXRlZF9sYXp5X21lc3NhZ2UgICAoMCkuYmIoKSk7CiAKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtICgwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICwgbWVzc2FnZS5yZXBlYXRlZF9mb3JlaWduX2VudW0oMCkpOwpAQCAtNTgwLDYgKzYxOSw3IEBACiAgIEVYUEVDVF9FUSg1MTgsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgKDEpLmJiKCkpOwogICBFWFBFQ1RfRVEoNTE5LCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZSgxKS5jKCkpOwogICBFWFBFQ1RfRVEoNTIwLCBtZXNzYWdlLnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlICgxKS5kKCkpOworICBFWFBFQ1RfRVEoNTI3LCBtZXNzYWdlLnJlcGVhdGVkX2xhenlfbWVzc2FnZSAgICgxKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyAsIG1lc3NhZ2UucmVwZWF0ZWRfbmVzdGVkX2VudW0gKDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLnJlcGVhdGVkX2ZvcmVpZ25fZW51bSgxKSk7CkBAIC03ODcsMTAgKzgyNywxMiBAQAogICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgLCAiMTE1Iik7CiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICAsICIxMTYiKTsKIAotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICApLT5zZXRfYSgxMTcpOwotICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfYmIoMTE4KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS0+c2V0X2MoMTE5KTsKLSAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS0+c2V0X2QoMTIwKTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKS0+c2V0X2EoMTE3KTsKKyAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS0+c2V0X2JiKDExOCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICktPnNldF9jKDExOSk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICktPnNldF9kKDEyMCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSktPnNldF9lKDEyNik7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICAgICktPnNldF9iYigxMjcpOwogCiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFaICk7CiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBWiAgICAgICk7CkBAIC04MTksNiArODYxLDcgQEAKICAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLT5zZXRfYmIoMjE4KTsKICAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLT5zZXRfYygyMTkpOwogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICktPnNldF9kKDIyMCk7CisgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgKS0+c2V0X2JiKDIyNyk7CiAKICAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgKTsKICAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFSICAgICAgKTsKQEAgLTg0Niw2ICs4ODksNyBAQAogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICktPnNldF9iYigzMTgpOwogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSktPnNldF9jKDMxOSk7CiAgIG1lc3NhZ2UtPkFkZEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS0+c2V0X2QoMzIwKTsKKyAgbWVzc2FnZS0+QWRkRXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICApLT5zZXRfYmIoMzI3KTsKIAogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiApOwogICBtZXNzYWdlLT5BZGRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgdW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVogICAgICApOwpAQCAtODc0LDYgKzkxOCwxMSBAQAogICBtZXNzYWdlLT5TZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSAsIHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PKTsKIAorCisgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfdWludDMyX2V4dGVuc2lvbl9saXRlLCA2MDEpOworICBtZXNzYWdlLT5NdXRhYmxlRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSktPnNldF9iYig2MDIpOzsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUsICI2MDMiKTsKKyAgbWVzc2FnZS0+U2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9ieXRlc19leHRlbnNpb25fbGl0ZSwgIjYwNCIpOwogfQogCiAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCkBAIC05MDAsNiArOTQ5LDcgQEAKICAgbWVzc2FnZS0+TXV0YWJsZUV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAxKS0+c2V0X2JiKDUxOCk7CiAgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMSktPnNldF9jKDUxOSk7CiAgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSktPnNldF9kKDUyMCk7CisgIG1lc3NhZ2UtPk11dGFibGVFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICwgMSktPnNldF9iYig1MjcpOwogCiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAxLCB1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICk7CiAgIG1lc3NhZ2UtPlNldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxLCB1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0ZPTyAgICAgICk7CkBAIC05MjcsMTUgKzk3NywxOSBAQAogICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfc3RyaW5nX2V4dGVuc2lvbl9saXRlICApKTsKICAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CiAKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKLSAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICAgICkpOwogCi0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICApLmhhc19hKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS5oYXNfYmIoKSk7Ci0gIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmhhc19jKCkpOwotICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKS5oYXNfZCgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICAgICAgICkuaGFzX2EoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLmhhc19iYigpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICkuaGFzX2MoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLmhhc19kKCkpOworICBFWFBFQ1RfVFJVRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS5oYXNfZSgpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICAgICkuaGFzX2JiKCkpOwogCiAgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKICAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSkpOwpAQCAtOTU4LDEwICsxMDEyLDEyIEBACiAgIEVYUEVDVF9FUSgiMTE1IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7CiAgIEVYUEVDVF9FUSgiMTE2IiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CiAKLSAgRVhQRUNUX0VRKDExNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkuYSgpKTsKLSAgRVhQRUNUX0VRKDExOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkuYmIoKSk7Ci0gIEVYUEVDVF9FUSgxMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmMoKSk7Ci0gIEVYUEVDVF9FUSgxMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLmQoKSk7CisgIEVYUEVDVF9FUSgxMTcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbGdyb3VwX2V4dGVuc2lvbl9saXRlICAgICAgICAgICAgICAgICApLmEoKSk7CisgIEVYUEVDVF9FUSgxMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLmJiKCkpOworICBFWFBFQ1RfRVEoMTE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS5jKCkpOworICBFWFBFQ1RfRVEoMTIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgKS5kKCkpOworICBFWFBFQ1RfRVEoMTI2LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS5lKCkpOworICBFWFBFQ1RfRVEoMTI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CkBAIC05OTAsNiArMTA0Niw3IEBACiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlICAgKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOwpAQCAtMTAxNSw2ICsxMDcyLDcgQEAKICAgRVhQRUNUX0VRKDIxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMCkuYmIoKSk7CiAgIEVYUEVDVF9FUSgyMTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDApLmMoKSk7CiAgIEVYUEVDVF9FUSgyMjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDApLmQoKSk7CisgIEVYUEVDVF9FUSgyMjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAsIDApLmJiKCkpOwogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6QkFSICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMCkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9CQVIgICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDApKTsKQEAgLTEwNDEsNiArMTA5OSw3IEBACiAgIEVYUEVDVF9FUSgzMTgsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDEpLmJiKCkpOwogICBFWFBFQ1RfRVEoMzE5LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlLCAxKS5jKCkpOwogICBFWFBFQ1RfRVEoMzIwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAxKS5kKCkpOworICBFWFBFQ1RfRVEoMzI3LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgLCAxKS5iYigpKTsKIAogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkJBWiAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAsIDEpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfQkFaICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlLCAxKSk7CkBAIC0xMDkwLDYgKzExNDksMTYgQEAKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpGT1JFSUdOX0xJVEVfRk9PICAgICAgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUpKTsKICAgRVhQRUNUX0VRKHVuaXR0ZXN0X2ltcG9ydDo6SU1QT1JUX0xJVEVfRk9PLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6ZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKIAorCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl91aW50MzJfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UuSGFzRXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX2J5dGVzX2V4dGVuc2lvbl9saXRlKSk7CisKKyAgRVhQRUNUX0VRKDYwMSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRVEoNjAyLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmJiKCkpOworICBFWFBFQ1RfRVEoIjYwMyIsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uX2xpdGUpKTsKKyAgRVhQRUNUX0VRKCI2MDQiLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTExOCwxMCArMTE4NywxMiBAQAogICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3N0cmluZ19leHRlbnNpb25fbGl0ZSAgKSk7CiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUgICApKTsKIAotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICAgICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICAgICkpOwogCiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CiAgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CkBAIC0xMTQ2LDE1ICsxMjE3LDE5IEBACiAgIEVYUEVDVF9FUSgiIiAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2J5dGVzX2V4dGVuc2lvbl9saXRlICAgKSk7CiAKICAgLy8gRW1iZWRkZWQgbWVzc2FnZXMgc2hvdWxkIGFsc28gYmUgY2xlYXIuCi0gIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgKS5oYXNfYSgpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLmhhc19iYigpKTsKLSAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmhhc19jKCkpOwotICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkuaGFzX2QoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKS5oYXNfYSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICAgICApLmhhc19iYigpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICApLmhhc19jKCkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuaGFzX2QoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS5oYXNfZSgpKTsKKyAgRVhQRUNUX0ZBTFNFKG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAgICAgICApLmhhc19iYigpKTsKIAotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsZ3JvdXBfZXh0ZW5zaW9uX2xpdGUgICAgICAgICAgICkuYSgpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLmJiKCkpOwotICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkuYygpKTsKLSAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApLmQoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxncm91cF9leHRlbnNpb25fbGl0ZSAgICAgICAgICAgICAgICAgKS5hKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuYmIoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfZm9yZWlnbl9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgKS5jKCkpOworICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9wdGlvbmFsX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICkuZCgpKTsKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpLmUoKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6b3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgICAgICAgKS5iYigpKTsKIAogICAvLyBFbnVtcyB3aXRob3V0IGRlZmF1bHRzIGFyZSBzZXQgdG8gdGhlIGZpcnN0IHZhbHVlIGluIHRoZSBlbnVtLgogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OlRlc3RBbGxUeXBlc0xpdGU6OkZPTyAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpvcHRpb25hbF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSApKTsKQEAgLTExODMsNiArMTI1OCw3IEBACiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICkpOwogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUpKTsKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CisgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICkpOwogICBFWFBFQ1RfRVEoMCwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9uZXN0ZWRfZW51bV9leHRlbnNpb25fbGl0ZSAgICApKTsKICAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlICAgKSk7CiAgIEVYUEVDVF9FUSgwLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOwpAQCAtMTIzMSw2ICsxMzA3LDExIEBACiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfZm9yZWlnbl9lbnVtX2V4dGVuc2lvbl9saXRlKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdF9pbXBvcnQ6OklNUE9SVF9MSVRFX0JBUiwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OmRlZmF1bHRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgKSk7CiAKKworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5IYXNFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSkpOworICBFWFBFQ1RfRkFMU0UobWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6Om9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlKS5oYXNfYmIoKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2Zfc3RyaW5nX2V4dGVuc2lvbl9saXRlKSk7CisgIEVYUEVDVF9GQUxTRShtZXNzYWdlLkhhc0V4dGVuc2lvbih1bml0dGVzdDo6b25lb2ZfYnl0ZXNfZXh0ZW5zaW9uX2xpdGUpKTsKIH0KIAogLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQpAQCAtMTI2MCw2ICsxMzQxLDcgQEAKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSApKTsKKyAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICAgKSk7CiAgIEFTU0VSVF9FUSgyLCBtZXNzYWdlLkV4dGVuc2lvblNpemUodW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICAgICkpOwogICBBU1NFUlRfRVEoMiwgbWVzc2FnZS5FeHRlbnNpb25TaXplKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUgICApKTsKICAgQVNTRVJUX0VRKDIsIG1lc3NhZ2UuRXh0ZW5zaW9uU2l6ZSh1bml0dGVzdDo6cmVwZWF0ZWRfaW1wb3J0X2VudW1fZXh0ZW5zaW9uX2xpdGUgICAgKSk7CkBAIC0xMjg1LDYgKzEzNjcsNyBAQAogICBFWFBFQ1RfRVEoMjE4LCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgLCAwKS5iYigpKTsKICAgRVhQRUNUX0VRKDIxOSwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fbWVzc2FnZV9leHRlbnNpb25fbGl0ZSwgMCkuYygpKTsKICAgRVhQRUNUX0VRKDIyMCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMCkuZCgpKTsKKyAgRVhQRUNUX0VRKDIyNywgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAgICwgMCkuYmIoKSk7CiAKICAgRVhQRUNUX0VRKHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXNMaXRlOjpCQVIgLCBtZXNzYWdlLkdldEV4dGVuc2lvbih1bml0dGVzdDo6cmVwZWF0ZWRfbmVzdGVkX2VudW1fZXh0ZW5zaW9uX2xpdGUgLCAwKSk7CiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6Rk9SRUlHTl9MSVRFX0JBUiAgICAgICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX2ZvcmVpZ25fZW51bV9leHRlbnNpb25fbGl0ZSwgMCkpOwpAQCAtMTMxMiw2ICsxMzk1LDcgQEAKICAgRVhQRUNUX0VRKDUxOCwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlICwgMSkuYmIoKSk7CiAgIEVYUEVDVF9FUSg1MTksIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUsIDEpLmMoKSk7CiAgIEVYUEVDVF9FUSg1MjAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9pbXBvcnRfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSAsIDEpLmQoKSk7CisgIEVYUEVDVF9FUSg1MjcsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uX2xpdGUgICAsIDEpLmJiKCkpOwogCiAgIEVYUEVDVF9FUSh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZTo6Rk9PICwgbWVzc2FnZS5HZXRFeHRlbnNpb24odW5pdHRlc3Q6OnJlcGVhdGVkX25lc3RlZF9lbnVtX2V4dGVuc2lvbl9saXRlICwgMSkpOwogICBFWFBFQ1RfRVEodW5pdHRlc3Q6OkZPUkVJR05fTElURV9GT08gICAgICAsIG1lc3NhZ2UuR2V0RXh0ZW5zaW9uKHVuaXR0ZXN0OjpyZXBlYXRlZF9mb3JlaWduX2VudW1fZXh0ZW5zaW9uX2xpdGUsIDEpKTsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0X3V0aWxfbGl0ZS5oCmluZGV4IGNhMzVhYWEuLjQ3YTIyNjkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbF9saXRlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdF91dGlsX2xpdGUuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNTIsNyArNTIsNyBAQAogICBzdGF0aWMgdm9pZCBTZXRQYWNrZWRFeHRlbnNpb25zKHVuaXR0ZXN0OjpUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUqIG1lc3NhZ2UpOwogCiAgIC8vIFVzZSB0aGUgcmVwZWF0ZWQgdmVyc2lvbnMgb2YgdGhlIHNldF8qKCkgYWNjZXNzb3JzIHRvIG1vZGlmeSBhbGwgdGhlCi0gIC8vIHJlcGVhdGVkIGZpZWxkcyBvZiB0aGUgbWVzc3NhZ2UgKHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgorICAvLyByZXBlYXRlZCBmaWVsZHMgb2YgdGhlIG1lc3NhZ2UgKHdoaWNoIHNob3VsZCBhbHJlYWR5IGhhdmUgYmVlbgogICAvLyBpbml0aWFsaXplZCB3aXRoIFNldCpGaWVsZHMoKSkuICBTZXQqRmllbGRzKCkgaXRzZWxmIG9ubHkgdGVzdHMKICAgLy8gdGhlIGFkZF8qKCkgYWNjZXNzb3JzLgogICBzdGF0aWMgdm9pZCBNb2RpZnlSZXBlYXRlZEZpZWxkcyh1bml0dGVzdDo6VGVzdEFsbFR5cGVzTGl0ZSogbWVzc2FnZSk7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlCmluZGV4IDk0ODk4ZTQuLjBiN2U2NTUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL2dvbGRlbl9tZXNzYWdlCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9vbmVvZl9pbXBsZW1lbnRlZApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9vbmVvZl9pbXBsZW1lbnRlZApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2Vfb25lb2ZfaW1wbGVtZW50ZWQKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9wcm90bzMgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9wcm90bzMKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvZ29sZGVuX21lc3NhZ2VfcHJvdG8zCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9nb2xkZW5fbWVzc2FnZV9wcm90bzMKQmluYXJ5IGZpbGVzIGRpZmZlcgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9tYXBfdGVzdF9kYXRhLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL21hcF90ZXN0X2RhdGEudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL21hcF90ZXN0X2RhdGEudHh0CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS9tYXBfdGVzdF9kYXRhLnR4dApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dAppbmRleCBmZWVhOGY3Li43YTg3NGI1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhLnR4dApAQCAtMzAsNiArMzAsMTIgQEAKIG9wdGlvbmFsX2ltcG9ydF9lbnVtOiBJTVBPUlRfQkFaCiBvcHRpb25hbF9zdHJpbmdfcGllY2U6ICIxMjQiCiBvcHRpb25hbF9jb3JkOiAiMTI1Igorb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlIHsKKyAgZTogMTI2Cit9CitvcHRpb25hbF9sYXp5X21lc3NhZ2UgeworICBiYjogMTI3Cit9CiByZXBlYXRlZF9pbnQzMjogMjAxCiByZXBlYXRlZF9pbnQzMjogMzAxCiByZXBlYXRlZF9pbnQ2NDogMjAyCkBAIC05NCw2ICsxMDAsMTIgQEAKIHJlcGVhdGVkX3N0cmluZ19waWVjZTogIjMyNCIKIHJlcGVhdGVkX2NvcmQ6ICIyMjUiCiByZXBlYXRlZF9jb3JkOiAiMzI1IgorcmVwZWF0ZWRfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDIyNworfQorcmVwZWF0ZWRfbGF6eV9tZXNzYWdlIHsKKyAgYmI6IDMyNworfQogZGVmYXVsdF9pbnQzMjogNDAxCiBkZWZhdWx0X2ludDY0OiA0MDIKIGRlZmF1bHRfdWludDMyOiA0MDMKQEAgLTExNCwzICsxMjYsOSBAQAogZGVmYXVsdF9pbXBvcnRfZW51bTogSU1QT1JUX0ZPTwogZGVmYXVsdF9zdHJpbmdfcGllY2U6ICI0MjQiCiBkZWZhdWx0X2NvcmQ6ICI0MjUiCitvbmVvZl91aW50MzI6IDYwMQorb25lb2ZfbmVzdGVkX21lc3NhZ2UgeworICBiYjogNjAyCit9CitvbmVvZl9zdHJpbmc6ICI2MDMiCitvbmVvZl9ieXRlczogIjYwNCIKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX29uZW9mX2ltcGxlbWVudGVkLnR4dApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHkudHh0IGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHkudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5LnR4dApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9wb2ludHkudHh0CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5X29uZW9mLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5X29uZW9mLnR4dApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9kYXRhX3BvaW50eV9vbmVvZi50eHQKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGFfcG9pbnR5X29uZW9mLnR4dApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQKaW5kZXggMDU3YmVhZS4uOGM4YjFlYiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGEudHh0CkBAIC0zMCw2ICszMCwxMiBAQAogW3Byb3RvYnVmX3VuaXR0ZXN0Lm9wdGlvbmFsX2ltcG9ydF9lbnVtX2V4dGVuc2lvbl06IElNUE9SVF9CQVoKIFtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjEyNCIKIFtwcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9jb3JkX2V4dGVuc2lvbl06ICIxMjUiCitbcHJvdG9idWZfdW5pdHRlc3Qub3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl0geworICBlOiAxMjYKK30KK1twcm90b2J1Zl91bml0dGVzdC5vcHRpb25hbF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGJiOiAxMjcKK30KIFtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dOiAyMDEKIFtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQzMl9leHRlbnNpb25dOiAzMDEKIFtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9pbnQ2NF9leHRlbnNpb25dOiAyMDIKQEAgLTk0LDYgKzEwMCwxMiBAQAogW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX3N0cmluZ19waWVjZV9leHRlbnNpb25dOiAiMzI0IgogW3Byb3RvYnVmX3VuaXR0ZXN0LnJlcGVhdGVkX2NvcmRfZXh0ZW5zaW9uXTogIjIyNSIKIFtwcm90b2J1Zl91bml0dGVzdC5yZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl06ICIzMjUiCitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0geworICBiYjogMjI3Cit9CitbcHJvdG9idWZfdW5pdHRlc3QucmVwZWF0ZWRfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl0geworICBiYjogMzI3Cit9CiBbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9pbnQzMl9leHRlbnNpb25dOiA0MDEKIFtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2ludDY0X2V4dGVuc2lvbl06IDQwMgogW3Byb3RvYnVmX3VuaXR0ZXN0LmRlZmF1bHRfdWludDMyX2V4dGVuc2lvbl06IDQwMwpAQCAtMTE0LDMgKzEyNiw5IEBACiBbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9pbXBvcnRfZW51bV9leHRlbnNpb25dOiBJTVBPUlRfRk9PCiBbcHJvdG9idWZfdW5pdHRlc3QuZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uXTogIjQyNCIKIFtwcm90b2J1Zl91bml0dGVzdC5kZWZhdWx0X2NvcmRfZXh0ZW5zaW9uXTogIjQyNSIKK1twcm90b2J1Zl91bml0dGVzdC5vbmVvZl91aW50MzJfZXh0ZW5zaW9uXTogNjAxCitbcHJvdG9idWZfdW5pdHRlc3Qub25lb2ZfbmVzdGVkX21lc3NhZ2VfZXh0ZW5zaW9uXSB7CisgIGJiOiA2MDIKK30KK1twcm90b2J1Zl91bml0dGVzdC5vbmVvZl9zdHJpbmdfZXh0ZW5zaW9uXTogIjYwMyIKK1twcm90b2J1Zl91bml0dGVzdC5vbmVvZl9ieXRlc19leHRlbnNpb25dOiAiNjA0IgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGFfcG9pbnR5LnR4dCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YV9wb2ludHkudHh0CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YV9wb2ludHkudHh0CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0ZGF0YS90ZXh0X2Zvcm1hdF91bml0dGVzdF9leHRlbnNpb25zX2RhdGFfcG9pbnR5LnR4dApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmNjCmluZGV4IGUyMjQ3ODEuLjNkMDdiMTIgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTgyLDYgKzgyLDI0IEBACiAgIEdPT0dMRV9DSEVDSyhSZWFkRmlsZVRvU3RyaW5nKG5hbWUsIG91dHB1dCkpIDw8ICJDb3VsZCBub3QgcmVhZDogIiA8PCBuYW1lOwogfQogCitib29sIEZpbGU6OldyaXRlU3RyaW5nVG9GaWxlKGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgbmFtZSkgeworICBGSUxFKiBmaWxlID0gZm9wZW4obmFtZS5jX3N0cigpLCAid2IiKTsKKyAgaWYgKGZpbGUgPT0gTlVMTCkgeworICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJmb3BlbigiIDw8IG5hbWUgPDwgIiwgXCJ3YlwiKTogIiA8PCBzdHJlcnJvcihlcnJubyk7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgaWYgKGZ3cml0ZShjb250ZW50cy5kYXRhKCksIDEsIGNvbnRlbnRzLnNpemUoKSwgZmlsZSkgIT0gY29udGVudHMuc2l6ZSgpKSB7CisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgImZ3cml0ZSgiIDw8IG5hbWUgPDwgIik6ICIgPDwgc3RyZXJyb3IoZXJybm8pOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorCisgIGlmIChmY2xvc2UoZmlsZSkgIT0gMCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICByZXR1cm4gdHJ1ZTsKK30KKwogdm9pZCBGaWxlOjpXcml0ZVN0cmluZ1RvRmlsZU9yRGllKGNvbnN0IHN0cmluZyYgY29udGVudHMsIGNvbnN0IHN0cmluZyYgbmFtZSkgewogICBGSUxFKiBmaWxlID0gZm9wZW4obmFtZS5jX3N0cigpLCAid2IiKTsKICAgR09PR0xFX0NIRUNLKGZpbGUgIT0gTlVMTCkKQEAgLTExNSw2ICsxMzMsOCBAQAogCiB2b2lkIEZpbGU6OkRlbGV0ZVJlY3Vyc2l2ZWx5KGNvbnN0IHN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHVtbXkxLCB2b2lkKiBkdW1teTIpIHsKKyAgaWYgKG5hbWUuZW1wdHkoKSkgcmV0dXJuOworCiAgIC8vIFdlIGRvbid0IGNhcmUgdG9vIG11Y2ggYWJvdXQgZXJyb3IgY2hlY2tpbmcgaGVyZSBzaW5jZSB0aGlzIGlzIG9ubHkgdXNlZAogICAvLyBpbiB0ZXN0cyB0byBkZWxldGUgdGVtcG9yYXJ5IGRpcmVjdG9yaWVzIHRoYXQgYXJlIHVuZGVyIC90bXAgYW55d2F5LgogCkBAIC0xNzIsNSArMTkyLDkgQEAKICNlbmRpZgogfQogCitib29sIEZpbGU6OkNoYW5nZVdvcmtpbmdEaXJlY3RvcnkoY29uc3Qgc3RyaW5nJiBuZXdfd29ya2luZ19kaXJlY3RvcnkpIHsKKyAgcmV0dXJuIGNoZGlyKG5ld193b3JraW5nX2RpcmVjdG9yeS5jX3N0cigpKSA9PSAwOworfQorCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZmlsZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmgKaW5kZXggYTZiMWM3Ni4uMmY2M2Y4MCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTU2LDYgKzU2LDEwIEBACiAgIHN0YXRpYyB2b2lkIFJlYWRGaWxlVG9TdHJpbmdPckRpZShjb25zdCBzdHJpbmcmIG5hbWUsIHN0cmluZyogb3V0cHV0KTsKIAogICAvLyBDcmVhdGUgYSBmaWxlIGFuZCB3cml0ZSBhIHN0cmluZyB0byBpdC4KKyAgc3RhdGljIGJvb2wgV3JpdGVTdHJpbmdUb0ZpbGUoY29uc3Qgc3RyaW5nJiBjb250ZW50cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKTsKKworICAvLyBTYW1lIGFzIGFib3ZlLCBidXQgY3Jhc2ggb24gZmFpbHVyZS4KICAgc3RhdGljIHZvaWQgV3JpdGVTdHJpbmdUb0ZpbGVPckRpZShjb25zdCBzdHJpbmcmIGNvbnRlbnRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSk7CiAKQEAgLTczLDYgKzc3LDE5IEBACiAgIHN0YXRpYyB2b2lkIERlbGV0ZVJlY3Vyc2l2ZWx5KGNvbnN0IHN0cmluZyYgbmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCogZHVtbXkxLCB2b2lkKiBkdW1teTIpOwogCisgIC8vIENoYW5nZSB3b3JraW5nIGRpcmVjdG9yeSB0byBnaXZlbiBkaXJlY3RvcnkuCisgIHN0YXRpYyBib29sIENoYW5nZVdvcmtpbmdEaXJlY3RvcnkoY29uc3Qgc3RyaW5nJiBuZXdfd29ya2luZ19kaXJlY3RvcnkpOworCisgIHN0YXRpYyBib29sIEdldENvbnRlbnRzKAorICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lLCBzdHJpbmcqIG91dHB1dCwgYm9vbCAvKmlzX2RlZmF1bHQqLykgeworICAgIHJldHVybiBSZWFkRmlsZVRvU3RyaW5nKG5hbWUsIG91dHB1dCk7CisgIH0KKworICBzdGF0aWMgYm9vbCBTZXRDb250ZW50cygKKyAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSwgY29uc3Qgc3RyaW5nJiBjb250ZW50cywgYm9vbCAvKmlzX2RlZmF1bHQqLykgeworICAgIHJldHVybiBXcml0ZVN0cmluZ1RvRmlsZShjb250ZW50cywgbmFtZSk7CisgIH0KKwogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhGaWxlKTsKIH07CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuY2MKaW5kZXggY2QwOTRkMC4uMmI5Y2RkZSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNjUsNyArNjUsMTUgQEAKICNlbmRpZgogCiBzdHJpbmcgVGVzdFNvdXJjZURpcigpIHsKLSNpZmRlZiBfTVNDX1ZFUgorI2lmbmRlZiBHT09HTEVfVEhJUkRfUEFSVFlfUFJPVE9CVUYKKyNpZm5kZWYgX01TQ19WRVIKKyAgLy8gYXV0b21ha2Ugc2V0cyB0aGUgInNyY2RpciIgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgIGNoYXIqIHJlc3VsdCA9IGdldGVudigic3JjZGlyIik7CisgIGlmIChyZXN1bHQgIT0gTlVMTCkgeworICAgIHJldHVybiByZXN1bHQ7CisgIH0KKyNlbmRpZiAgLy8gX01TQ19WRVIKKwogICAvLyBMb29rIGZvciB0aGUgInNyYyIgZGlyZWN0b3J5LgogICBzdHJpbmcgcHJlZml4ID0gIi4iOwogCkBAIC03OSwyMCArODcsMjAgQEAKICAgfQogICByZXR1cm4gcHJlZml4ICsgIi9zcmMiOwogI2Vsc2UKLSAgLy8gYXV0b21ha2Ugc2V0cyB0aGUgInNyY2RpciIgZW52aXJvbm1lbnQgdmFyaWFibGUuCi0gIGNoYXIqIHJlc3VsdCA9IGdldGVudigic3JjZGlyIik7Ci0gIGlmIChyZXN1bHQgPT0gTlVMTCkgewotICAgIC8vIE90aGVyd2lzZSwgdGhlIHRlc3QgbXVzdCBiZSBydW4gZnJvbSB0aGUgc291cmNlIGRpcmVjdG9yeS4KLSAgICByZXR1cm4gIi4iOwotICB9IGVsc2UgewotICAgIHJldHVybiByZXN1bHQ7Ci0gIH0KLSNlbmRpZgorICByZXR1cm4gInRoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYyI7CisjZW5kaWYgIC8vIEdPT0dMRV9USElSRF9QQVJUWV9QUk9UT0JVRgogfQogCiBuYW1lc3BhY2UgewogCiBzdHJpbmcgR2V0VGVtcG9yYXJ5RGlyZWN0b3J5TmFtZSgpIHsKKyAgLy8gVGVzdHMgcnVuIHVuZGVyIEJhemVsICJzaG91bGQgbm90IiB1c2UgL3RtcC4gQmF6ZWwgc2V0cyB0aGlzIGVudmlyb25tZW50CisgIC8vIHZhcmlhYmxlIGZvciB0ZXN0cyB0byB1c2UgaW5zdGVhZC4KKyAgY2hhciAqZnJvbV9lbnZpcm9ubWVudCA9IGdldGVudigiVEVTVF9UTVBESVIiKTsKKyAgaWYgKGZyb21fZW52aXJvbm1lbnQgIT0gTlVMTCAmJiBmcm9tX2Vudmlyb25tZW50WzBdICE9ICdcMCcpIHsKKyAgICByZXR1cm4gc3RyaW5nKGZyb21fZW52aXJvbm1lbnQpICsgIi9wcm90b2J1Zl90bXBkaXIiOworICB9CisKICAgLy8gdG1wbmFtKCkgaXMgZ2VuZXJhbGx5IG5vdCBjb25zaWRlcmVkIHNhZmUgYnV0IHdlJ3JlIG9ubHkgdXNpbmcgaXQgZm9yCiAgIC8vIHRlc3RpbmcuICBXZSBjYW5ub3QgdXNlIHRtcGZpbGUoKSBvciBta3N0ZW1wKCkgc2luY2Ugd2UncmUgY3JlYXRpbmcgYQogICAvLyBkaXJlY3RvcnkuCkBAIC0xMDQsNiArMTEyLDEwIEBACiAgIGlmIChIYXNQcmVmaXhTdHJpbmcocmVzdWx0LCAiXFwiKSkgewogICAgIHJlc3VsdC5lcmFzZSgwLCAxKTsKICAgfQorICAvLyBUaGUgV2luMzIgQVBJIGFjY2VwdHMgZm9yd2FyZCBzbGFzaGVzIGFzIGEgcGF0aCBkZWxpbWl0ZXIgZXZlbiB0aG91Z2gKKyAgLy8gYmFja3NsYXNoZXMgYXJlIHN0YW5kYXJkLiAgTGV0J3MgYXZvaWQgY29uZnVzaW9uIGFuZCB1c2Ugb25seSBmb3J3YXJkCisgIC8vIHNsYXNoZXMuCisgIHJlc3VsdCA9IFN0cmluZ1JlcGxhY2UocmVzdWx0LCAiXFwiLCAiLyIsIHRydWUpOwogI2VuZGlmICAvLyBfV0lOMzIKICAgcmV0dXJuIHJlc3VsdDsKIH0KQEAgLTIyMywxNiArMjM1LDE3IEBACiAgIGFjdGl2ZV9sb2dfID0gTlVMTDsKIH0KIAotY29uc3QgdmVjdG9yPHN0cmluZz4mIFNjb3BlZE1lbW9yeUxvZzo6R2V0TWVzc2FnZXMoTG9nTGV2ZWwgZHVtbXkpIGNvbnN0IHsKLSAgR09PR0xFX0NIRUNLX0VRKGR1bW15LCBFUlJPUik7Ci0gIHJldHVybiBtZXNzYWdlc187Citjb25zdCB2ZWN0b3I8c3RyaW5nPiYgU2NvcGVkTWVtb3J5TG9nOjpHZXRNZXNzYWdlcyhMb2dMZXZlbCBsZXZlbCkgeworICBHT09HTEVfQ0hFQ0sobGV2ZWwgPT0gRVJST1IgfHwKKyAgICAgICAgICAgICAgIGxldmVsID09IFdBUk5JTkcpOworICByZXR1cm4gbWVzc2FnZXNfW2xldmVsXTsKIH0KIAogdm9pZCBTY29wZWRNZW1vcnlMb2c6OkhhbmRsZUxvZyhMb2dMZXZlbCBsZXZlbCwgY29uc3QgY2hhciogZmlsZW5hbWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsaW5lLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKICAgR09PR0xFX0NIRUNLKGFjdGl2ZV9sb2dfICE9IE5VTEwpOwotICBpZiAobGV2ZWwgPT0gRVJST1IpIHsKLSAgICBhY3RpdmVfbG9nXy0+bWVzc2FnZXNfLnB1c2hfYmFjayhtZXNzYWdlKTsKKyAgaWYgKGxldmVsID09IEVSUk9SIHx8IGxldmVsID09IFdBUk5JTkcpIHsKKyAgICBhY3RpdmVfbG9nXy0+bWVzc2FnZXNfW2xldmVsXS5wdXNoX2JhY2sobWVzc2FnZSk7CiAgIH0KIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaAppbmRleCA3MTQ0NGM5Li5jMGQ5OWU2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzQsOSArMzQsMTUgQEAKICNpZm5kZWYgR09PR0xFX1BST1RPQlVGX0dPT0dMRVRFU1RfSF9fCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9HT09HTEVURVNUX0hfXwogCisjaW5jbHVkZSA8bWFwPgogI2luY2x1ZGUgPHZlY3Rvcj4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAKKy8vIERpc2FibGUgZGVhdGggdGVzdHMgaWYgd2UgdXNlIGV4Y2VwdGlvbnMgaW4gQ0hFQ0soKS4KKyNpZiAhUFJPVE9CVUZfVVNFX0VYQ0VQVElPTlMgJiYgZGVmaW5lZChHVEVTVF9IQVNfREVBVEhfVEVTVCkKKyNkZWZpbmUgUFJPVE9CVUZfSEFTX0RFQVRIX1RFU1QKKyNlbmRpZgorCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKQEAgLTYwLDYgKzY2LDcgQEAKIC8vIFNjb3BlZE1lbW9yeUxvZyByZWZlcnMgdG8gTE9HTEVWRUxfRVJST1IgYXMganVzdCBFUlJPUi4KICN1bmRlZiBFUlJPUiAgLy8gZGVmZW5kIGFnYWluc3QgcHJvbWlzY3VvdXMgd2luZG93cy5oCiBzdGF0aWMgY29uc3QgTG9nTGV2ZWwgRVJST1IgPSBMT0dMRVZFTF9FUlJPUjsKK3N0YXRpYyBjb25zdCBMb2dMZXZlbCBXQVJOSU5HID0gTE9HTEVWRUxfV0FSTklORzsKIAogLy8gUmVjZWl2ZXMgY29waWVzIG9mIGFsbCBMT0coRVJST1IpIG1lc3NhZ2VzIHdoaWxlIGluIHNjb3BlLiAgU2FtcGxlIHVzYWdlOgogLy8gICB7CkBAIC03NCwxNCArODEsMTEgQEAKICAgU2NvcGVkTWVtb3J5TG9nKCk7CiAgIHZpcnR1YWwgflNjb3BlZE1lbW9yeUxvZygpOwogCi0gIC8vIEZldGNoZXMgYWxsIG1lc3NhZ2VzIGxvZ2dlZC4gIFRoZSBpbnRlcm5hbCB2ZXJzaW9uIG9mIHRoaXMgY2xhc3MKLSAgLy8gd291bGQgb25seSBmZXRjaCBtZXNzYWdlcyBhdCB0aGUgZ2l2ZW4gc2VjdXJpdHkgbGV2ZWwsIGJ1dCB0aGUgcHJvdG9idWYKLSAgLy8gb3BlbiBzb3VyY2UgdmVyc2lvbiBpZ25vcmVzIHRoZSBhcmd1bWVudCBzaW5jZSB3ZSBhbHdheXMgcGFzcyBFUlJPUgotICAvLyBhbnl3YXkuCi0gIGNvbnN0IHZlY3RvcjxzdHJpbmc+JiBHZXRNZXNzYWdlcyhMb2dMZXZlbCBkdW1teSkgY29uc3Q7CisgIC8vIEZldGNoZXMgYWxsIG1lc3NhZ2VzIHdpdGggdGhlIGdpdmVuIHNldmVyaXR5IGxldmVsLgorICBjb25zdCB2ZWN0b3I8c3RyaW5nPiYgR2V0TWVzc2FnZXMoTG9nTGV2ZWwgZXJyb3IpOwogCiAgcHJpdmF0ZToKLSAgdmVjdG9yPHN0cmluZz4gbWVzc2FnZXNfOworICBtYXA8TG9nTGV2ZWwsIHZlY3RvcjxzdHJpbmc+ID4gbWVzc2FnZXNfOwogICBMb2dIYW5kbGVyKiBvbGRfaGFuZGxlcl87CiAKICAgc3RhdGljIHZvaWQgSGFuZGxlTG9nKExvZ0xldmVsIGxldmVsLCBjb25zdCBjaGFyKiBmaWxlbmFtZSwgaW50IGxpbmUsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d1bnppcC5jYwppbmRleCBhNjE5Nzg1Li43NmY4Y2ZlIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL3pjZ3VuemlwLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNndW56aXAuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM4LDEzICszOCwyMCBAQAogLy8gUmVhZHMgZ3ppcCBzdHJlYW0gb24gc3RhbmRhcmQgaW5wdXQgYW5kIHdyaXRlcyBkZWNvbXByZXNzZWQgZGF0YSB0byBzdGFuZGFyZAogLy8gb3V0cHV0LgogCi0jaW5jbHVkZSAiY29uZmlnLmgiCi0KICNpbmNsdWRlIDxhc3NlcnQuaD4KICNpbmNsdWRlIDxzdGRpby5oPgogI2luY2x1ZGUgPHN0ZGxpYi5oPgogI2luY2x1ZGUgPGZjbnRsLmg+CiAKKyNpZmRlZiBfV0lOMzIKKyNpZm5kZWYgU1RESU5fRklMRU5PCisjZGVmaW5lIFNURElOX0ZJTEVOTyAwCisjZW5kaWYKKyNpZm5kZWYgU1RET1VUX0ZJTEVOTworI2RlZmluZSBTVERPVVRfRklMRU5PIDEKKyNlbmRpZgorI2VuZGlmCisKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vZ3ppcF9zdHJlYW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvemNnemlwLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKaW5kZXggOTEzMzI3NS4uOTkyZGRjNiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGVzdGluZy96Y2d6aXAuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA5IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM4LDEyICszOCwxOSBAQAogLy8gUmVhZHMgZGF0YSBvbiBzdGFuZGFyZCBpbnB1dCBhbmQgd3JpdGVzIGNvbXByZXNzZWQgZ3ppcCBzdHJlYW0gdG8gc3RhbmRhcmQKIC8vIG91dHB1dC4KIAotI2luY2x1ZGUgImNvbmZpZy5oIgotCiAjaW5jbHVkZSA8c3RkaW8uaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxmY250bC5oPgogCisjaWZkZWYgX1dJTjMyCisjaWZuZGVmIFNURElOX0ZJTEVOTworI2RlZmluZSBTVERJTl9GSUxFTk8gMAorI2VuZGlmCisjaWZuZGVmIFNURE9VVF9GSUxFTk8KKyNkZWZpbmUgU1RET1VUX0ZJTEVOTyAxCisjZW5kaWYKKyNlbmRpZgorCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjCmluZGV4IDE0OTRlYmQuLmMwZGZkNTMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMiw2ICszMiw3IEBACiAvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIAorI2luY2x1ZGUgPGFsZ29yaXRobT4KICNpbmNsdWRlIDxmbG9hdC5oPgogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdGRpby5oPgpAQCAtNDIsMjEgKzQzLDU4IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+CiAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9keW5hbWljX21lc3NhZ2UuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvcmVwZWF0ZWRfZmllbGQuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9zdHJ0b2QuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FueS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdHJpbmdwcmludGYuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RydXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXBfdXRpbC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKK25hbWVzcGFjZSB7CisKK2lubGluZSBib29sIElzSGV4TnVtYmVyKGNvbnN0IHN0cmluZyYgc3RyKSB7CisgIHJldHVybiAoc3RyLmxlbmd0aCgpID49IDIgJiYgc3RyWzBdID09ICcwJyAmJgorICAgICAgICAgIChzdHJbMV0gPT0gJ3gnIHx8IHN0clsxXSA9PSAnWCcpKTsKK30KKworaW5saW5lIGJvb2wgSXNPY3ROdW1iZXIoY29uc3Qgc3RyaW5nJiBzdHIpIHsKKyAgcmV0dXJuIChzdHIubGVuZ3RoKCkgPj0gMiAmJiBzdHJbMF0gPT0gJzAnICYmCisgICAgICAgICAgKHN0clsxXSA+PSAnMCcgJiYgc3RyWzFdIDwgJzgnKSk7Cit9CisKK2lubGluZSBib29sIEdldEFueUZpZWxkRGVzY3JpcHRvcnMoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiogdHlwZV91cmxfZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvcioqIHZhbHVlX2ZpZWxkKSB7CisgICAgY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvciA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpOworICAgICp0eXBlX3VybF9maWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKDEpOworICAgICp2YWx1ZV9maWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKDIpOworICAgIHJldHVybiAoKnR5cGVfdXJsX2ZpZWxkICE9IE5VTEwgJiYKKyAgICAgICAgICAgICgqdHlwZV91cmxfZmllbGQpLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX1NUUklORyAmJgorICAgICAgICAgICAgKnZhbHVlX2ZpZWxkICE9IE5VTEwgJiYKKyAgICAgICAgICAgICgqdmFsdWVfZmllbGQpLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0JZVEVTKTsKK30KKworfSAgLy8gbmFtZXNwYWNlCisKIHN0cmluZyBNZXNzYWdlOjpEZWJ1Z1N0cmluZygpIGNvbnN0IHsKICAgc3RyaW5nIGRlYnVnX3N0cmluZzsKIAotICBUZXh0Rm9ybWF0OjpQcmludFRvU3RyaW5nKCp0aGlzLCAmZGVidWdfc3RyaW5nKTsKKyAgVGV4dEZvcm1hdDo6UHJpbnRlciBwcmludGVyOworICBwcmludGVyLlNldEV4cGFuZEFueSh0cnVlKTsKKworICBwcmludGVyLlByaW50VG9TdHJpbmcoKnRoaXMsICZkZWJ1Z19zdHJpbmcpOwogCiAgIHJldHVybiBkZWJ1Z19zdHJpbmc7CiB9CkBAIC02Niw2ICsxMDQsNyBAQAogCiAgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKICAgcHJpbnRlci5TZXRTaW5nbGVMaW5lTW9kZSh0cnVlKTsKKyAgcHJpbnRlci5TZXRFeHBhbmRBbnkodHJ1ZSk7CiAKICAgcHJpbnRlci5QcmludFRvU3RyaW5nKCp0aGlzLCAmZGVidWdfc3RyaW5nKTsKICAgLy8gU2luZ2xlIGxpbmUgbW9kZSBjdXJyZW50bHkgbWlnaHQgaGF2ZSBhbiBleHRyYSBzcGFjZSBhdCB0aGUgZW5kLgpAQCAtODIsNiArMTIxLDcgQEAKIAogICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CiAgIHByaW50ZXIuU2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKHRydWUpOworICBwcmludGVyLlNldEV4cGFuZEFueSh0cnVlKTsKIAogICBwcmludGVyLlByaW50VG9TdHJpbmcoKnRoaXMsICZkZWJ1Z19zdHJpbmcpOwogCkBAIC05NCw2ICsxMzQsNzMgQEAKIAogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEltcGxlbWVudGF0aW9uIG9mIHRoZSBwYXJzZSBpbmZvcm1hdGlvbiB0cmVlIGNsYXNzLgorVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZTo6UGFyc2VJbmZvVHJlZSgpIHsgfQorCitUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjp+UGFyc2VJbmZvVHJlZSgpIHsKKyAgLy8gUmVtb3ZlIGFueSBuZXN0ZWQgaW5mb3JtYXRpb24gdHJlZXMsIGFzIHRoZXkgYXJlIG93bmVkIGJ5IHRoaXMgdHJlZS4KKyAgZm9yIChOZXN0ZWRNYXA6Oml0ZXJhdG9yIGl0ID0gbmVzdGVkXy5iZWdpbigpOyBpdCAhPSBuZXN0ZWRfLmVuZCgpOyArK2l0KSB7CisgICAgU1RMRGVsZXRlRWxlbWVudHMoJihpdC0+c2Vjb25kKSk7CisgIH0KK30KKwordm9pZCBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpSZWNvcmRMb2NhdGlvbigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb24gbG9jYXRpb24pIHsKKyAgbG9jYXRpb25zX1tmaWVsZF0ucHVzaF9iYWNrKGxvY2F0aW9uKTsKK30KKworVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZTo6Q3JlYXRlTmVzdGVkKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgLy8gT3duZWQgYnkgdXMgaW4gdGhlIG1hcC4KKyAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogaW5zdGFuY2UgPSBuZXcgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSgpOworICB2ZWN0b3I8VGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSo+KiB0cmVlcyA9ICZuZXN0ZWRfW2ZpZWxkXTsKKyAgR09PR0xFX0NIRUNLKHRyZWVzKTsKKyAgdHJlZXMtPnB1c2hfYmFjayhpbnN0YW5jZSk7CisgIHJldHVybiBpbnN0YW5jZTsKK30KKwordm9pZCBDaGVja0ZpZWxkSW5kZXgoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwgaW50IGluZGV4KSB7CisgIGlmIChmaWVsZCA9PSBOVUxMKSB7IHJldHVybjsgfQorCisgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBpbmRleCA9PSAtMSkgeworICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiSW5kZXggbXVzdCBiZSBpbiByYW5nZSBvZiByZXBlYXRlZCBmaWVsZCB2YWx1ZXMuICIKKyAgICAgICAgICAgICAgICA8PCAiRmllbGQ6ICIgPDwgZmllbGQtPm5hbWUoKTsKKyAgfSBlbHNlIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkgJiYgaW5kZXggIT0gLTEpIHsKKyAgICBHT09HTEVfTE9HKERGQVRBTCkgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIHNpbmd1bGFyIGZpZWxkcy4iCisgICAgICAgICAgICAgICAgPDwgIkZpZWxkOiAiIDw8IGZpZWxkLT5uYW1lKCk7CisgIH0KK30KKworVGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvbiBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpHZXRMb2NhdGlvbigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0IHsKKyAgQ2hlY2tGaWVsZEluZGV4KGZpZWxkLCBpbmRleCk7CisgIGlmIChpbmRleCA9PSAtMSkgeyBpbmRleCA9IDA7IH0KKworICBjb25zdCB2ZWN0b3I8VGV4dEZvcm1hdDo6UGFyc2VMb2NhdGlvbj4qIGxvY2F0aW9ucyA9CisgICAgICBGaW5kT3JOdWxsKGxvY2F0aW9uc18sIGZpZWxkKTsKKyAgaWYgKGxvY2F0aW9ucyA9PSBOVUxMIHx8IGluZGV4ID49IGxvY2F0aW9ucy0+c2l6ZSgpKSB7CisgICAgcmV0dXJuIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb24oKTsKKyAgfQorCisgIHJldHVybiAoKmxvY2F0aW9ucylbaW5kZXhdOworfQorCitUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKiBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlOjpHZXRUcmVlRm9yTmVzdGVkKAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIGludCBpbmRleCkgY29uc3QgeworICBDaGVja0ZpZWxkSW5kZXgoZmllbGQsIGluZGV4KTsKKyAgaWYgKGluZGV4ID09IC0xKSB7IGluZGV4ID0gMDsgfQorCisgIGNvbnN0IHZlY3RvcjxUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKj4qIHRyZWVzID0gRmluZE9yTnVsbChuZXN0ZWRfLCBmaWVsZCk7CisgIGlmICh0cmVlcyA9PSBOVUxMIHx8IGluZGV4ID49IHRyZWVzLT5zaXplKCkpIHsKKyAgICByZXR1cm4gTlVMTDsKKyAgfQorCisgIHJldHVybiAoKnRyZWVzKVtpbmRleF07Cit9CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAvLyBJbnRlcm5hbCBjbGFzcyBmb3IgcGFyc2luZyBhbiBBU0NJSSByZXByZXNlbnRhdGlvbiBvZiBhIFByb3RvY29sIE1lc3NhZ2UuCiAvLyBUaGlzIGNsYXNzIG1ha2VzIHVzZSBvZiB0aGUgUHJvdG9jb2wgTWVzc2FnZSBjb21waWxlcidzIHRva2VuaXplciBmb3VuZAogLy8gaW4gLy9nb29nbGUvcHJvdG9idWYvaW8vdG9rZW5pemVyLmguIE5vdGUgdGhhdCBjbGFzcydzIFBhcnNlCkBAIC0xMDgsOSArMjE1LDEwIEBACiBjbGFzcyBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlckltcGwgewogIHB1YmxpYzoKIAotICAvLyBEZXRlcm1pbmVzIGlmIHJlcGVhdGVkIHZhbHVlcyBmb3IgYSBub24tcmVwZWF0ZWQgZmllbGQgYXJlCi0gIC8vIHBlcm1pdHRlZCwgZS5nLiwgdGhlIHN0cmluZyAiZm9vOiAxIGZvbzogMiIgZm9yIGEKLSAgLy8gcmVxdWlyZWQvb3B0aW9uYWwgZmllbGQgbmFtZWQgImZvbyIuCisgIC8vIERldGVybWluZXMgaWYgcmVwZWF0ZWQgdmFsdWVzIGZvciBub24tcmVwZWF0ZWQgZmllbGRzIGFuZAorICAvLyBvbmVvZnMgYXJlIHBlcm1pdHRlZCwgZS5nLiwgdGhlIHN0cmluZyAiZm9vOiAxIGZvbzogMiIgZm9yIGEKKyAgLy8gcmVxdWlyZWQvb3B0aW9uYWwgZmllbGQgbmFtZWQgImZvbyIsIG9yICJiYXo6IDEgcXV4OiAyIgorICAvLyB3aGVyZSAiYmF6IiBhbmQgInF1eCIgYXJlIG1lbWJlcnMgb2YgdGhlIHNhbWUgb25lb2YuCiAgIGVudW0gU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgewogICAgIEFMTE9XX1NJTkdVTEFSX09WRVJXUklURVMgPSAwLCAgIC8vIHRoZSBsYXN0IHZhbHVlIGlzIHJldGFpbmVkCiAgICAgRk9SQklEX1NJTkdVTEFSX09WRVJXUklURVMgPSAxLCAgLy8gYW4gZXJyb3IgaXMgaXNzdWVkCkBAIC0xMjAsMTMgKzIyOCwyNCBAQAogICAgICAgICAgICAgIGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dF9zdHJlYW0sCiAgICAgICAgICAgICAgaW86OkVycm9yQ29sbGVjdG9yKiBlcnJvcl9jb2xsZWN0b3IsCiAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6RmluZGVyKiBmaW5kZXIsCi0gICAgICAgICAgICAgU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeSkKKyAgICAgICAgICAgICBQYXJzZUluZm9UcmVlKiBwYXJzZV9pbmZvX3RyZWUsCisgICAgICAgICAgICAgU2luZ3VsYXJPdmVyd3JpdGVQb2xpY3kgc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeSwKKyAgICAgICAgICAgICBib29sIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGQsCisgICAgICAgICAgICAgYm9vbCBhbGxvd191bmtub3duX2ZpZWxkLAorICAgICAgICAgICAgIGJvb2wgYWxsb3dfdW5rbm93bl9lbnVtLAorICAgICAgICAgICAgIGJvb2wgYWxsb3dfZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgIGJvb2wgYWxsb3dfcmVsYXhlZF93aGl0ZXNwYWNlKQogICAgIDogZXJyb3JfY29sbGVjdG9yXyhlcnJvcl9jb2xsZWN0b3IpLAogICAgICAgZmluZGVyXyhmaW5kZXIpLAorICAgICAgcGFyc2VfaW5mb190cmVlXyhwYXJzZV9pbmZvX3RyZWUpLAogICAgICAgdG9rZW5pemVyX2Vycm9yX2NvbGxlY3Rvcl8odGhpcyksCiAgICAgICB0b2tlbml6ZXJfKGlucHV0X3N0cmVhbSwgJnRva2VuaXplcl9lcnJvcl9jb2xsZWN0b3JfKSwKICAgICAgIHJvb3RfbWVzc2FnZV90eXBlXyhyb290X21lc3NhZ2VfdHlwZSksCiAgICAgICBzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5XyhzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5KSwKKyAgICAgIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfKGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGQpLAorICAgICAgYWxsb3dfdW5rbm93bl9maWVsZF8oYWxsb3dfdW5rbm93bl9maWVsZCksCisgICAgICBhbGxvd191bmtub3duX2VudW1fKGFsbG93X3Vua25vd25fZW51bSksCisgICAgICBhbGxvd19maWVsZF9udW1iZXJfKGFsbG93X2ZpZWxkX251bWJlciksCiAgICAgICBoYWRfZXJyb3JzXyhmYWxzZSkgewogICAgIC8vIEZvciBiYWNrd2FyZHMtY29tcGF0aWJpbGl0eSB3aXRoIHByb3RvMSwgd2UgbmVlZCB0byBhbGxvdyB0aGUgJ2YnIHN1ZmZpeAogICAgIC8vIGZvciBmbG9hdHMuCkBAIC0xMzUsNiArMjU0LDExIEBACiAgICAgLy8gJyMnIHN0YXJ0cyBhIGNvbW1lbnQuCiAgICAgdG9rZW5pemVyXy5zZXRfY29tbWVudF9zdHlsZShpbzo6VG9rZW5pemVyOjpTSF9DT01NRU5UX1NUWUxFKTsKIAorICAgIGlmIChhbGxvd19yZWxheGVkX3doaXRlc3BhY2UpIHsKKyAgICAgIHRva2VuaXplcl8uc2V0X3JlcXVpcmVfc3BhY2VfYWZ0ZXJfbnVtYmVyKGZhbHNlKTsKKyAgICAgIHRva2VuaXplcl8uc2V0X2FsbG93X211bHRpbGluZV9zdHJpbmdzKHRydWUpOworICAgIH0KKwogICAgIC8vIENvbnN1bWUgdGhlIHN0YXJ0aW5nIHRva2VuLgogICAgIHRva2VuaXplcl8uTmV4dCgpOwogICB9CkBAIC0xNDYsNyArMjcwLDcgQEAKICAgLy8gR09PR0xFX0xPRyhFUlJPUikpLgogICBib29sIFBhcnNlKE1lc3NhZ2UqIG91dHB1dCkgewogICAgIC8vIENvbnN1bWUgZmllbGRzIHVudGlsIHdlIGNhbm5vdCBkbyBzbyBhbnltb3JlLgotICAgIHdoaWxlKHRydWUpIHsKKyAgICB3aGlsZSAodHJ1ZSkgewogICAgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9FTkQpKSB7CiAgICAgICAgIHJldHVybiAhaGFkX2Vycm9yc187CiAgICAgICB9CkBAIC0yMTcsMjAgKzM0MSwzMSBAQAogICAgICAgICAgICAgICAgICAgbWVzc2FnZSk7CiAgIH0KIAotICAvLyBDb25zdW1lcyB0aGUgc3BlY2lmaWVkIG1lc3NhZ2Ugd2l0aCB0aGUgZ2l2ZW4gc3RhcnRpbmcgZGVsaW1ldGVyLgotICAvLyBUaGlzIG1ldGhvZCBjaGVja3MgdG8gc2VlIHRoYXQgdGhlIGVuZCBkZWxpbWV0ZXIgYXQgdGhlIGNvbmNsdXNpb24gb2YKLSAgLy8gdGhlIGNvbnN1bXB0aW9uIG1hdGNoZXMgdGhlIHN0YXJ0aW5nIGRlbGltZXRlciBwYXNzZWQgaW4gaGVyZS4KLSAgYm9vbCBDb25zdW1lTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLCBjb25zdCBzdHJpbmcgZGVsaW1ldGVyKSB7CisgIC8vIENvbnN1bWVzIHRoZSBzcGVjaWZpZWQgbWVzc2FnZSB3aXRoIHRoZSBnaXZlbiBzdGFydGluZyBkZWxpbWl0ZXIuCisgIC8vIFRoaXMgbWV0aG9kIGNoZWNrcyB0byBzZWUgdGhhdCB0aGUgZW5kIGRlbGltaXRlciBhdCB0aGUgY29uY2x1c2lvbiBvZgorICAvLyB0aGUgY29uc3VtcHRpb24gbWF0Y2hlcyB0aGUgc3RhcnRpbmcgZGVsaW1pdGVyIHBhc3NlZCBpbiBoZXJlLgorICBib29sIENvbnN1bWVNZXNzYWdlKE1lc3NhZ2UqIG1lc3NhZ2UsIGNvbnN0IHN0cmluZyBkZWxpbWl0ZXIpIHsKICAgICB3aGlsZSAoIUxvb2tpbmdBdCgiPiIpICYmICAhTG9va2luZ0F0KCJ9IikpIHsKICAgICAgIERPKENvbnN1bWVGaWVsZChtZXNzYWdlKSk7CiAgICAgfQogCi0gICAgLy8gQ29uZmlybSB0aGF0IHdlIGhhdmUgYSB2YWxpZCBlbmRpbmcgZGVsaW1ldGVyLgotICAgIERPKENvbnN1bWUoZGVsaW1ldGVyKSk7Ci0KKyAgICAvLyBDb25maXJtIHRoYXQgd2UgaGF2ZSBhIHZhbGlkIGVuZGluZyBkZWxpbWl0ZXIuCisgICAgRE8oQ29uc3VtZShkZWxpbWl0ZXIpKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIC8vIENvbnN1bWUgZWl0aGVyICI8IiBvciAieyIuCisgIGJvb2wgQ29uc3VtZU1lc3NhZ2VEZWxpbWl0ZXIoc3RyaW5nKiBkZWxpbWl0ZXIpIHsKKyAgICBpZiAoVHJ5Q29uc3VtZSgiPCIpKSB7CisgICAgICAqZGVsaW1pdGVyID0gIj4iOworICAgIH0gZWxzZSB7CisgICAgICBETyhDb25zdW1lKCJ7IikpOworICAgICAgKmRlbGltaXRlciA9ICJ9IjsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7CisgIH0KKworCiAgIC8vIENvbnN1bWVzIHRoZSBjdXJyZW50IGZpZWxkIChhcyByZXR1cm5lZCBieSB0aGUgdG9rZW5pemVyKSBvbiB0aGUKICAgLy8gcGFzc2VkIGluIG1lc3NhZ2UuCiAgIGJvb2wgQ29uc3VtZUZpZWxkKE1lc3NhZ2UqIG1lc3NhZ2UpIHsKQEAgLTI0MCwxNiArMzc1LDMxIEBACiAgICAgc3RyaW5nIGZpZWxkX25hbWU7CiAKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gTlVMTDsKKyAgICBpbnQgc3RhcnRfbGluZSA9IHRva2VuaXplcl8uY3VycmVudCgpLmxpbmU7CisgICAgaW50IHN0YXJ0X2NvbHVtbiA9IHRva2VuaXplcl8uY3VycmVudCgpLmNvbHVtbjsKIAorICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYW55X3R5cGVfdXJsX2ZpZWxkOworICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogYW55X3ZhbHVlX2ZpZWxkOworICAgIGlmIChpbnRlcm5hbDo6R2V0QW55RmllbGREZXNjcmlwdG9ycygqbWVzc2FnZSwgJmFueV90eXBlX3VybF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmFueV92YWx1ZV9maWVsZCkgJiYKKyAgICAgICAgVHJ5Q29uc3VtZSgiWyIpKSB7CisgICAgICBzdHJpbmcgZnVsbF90eXBlX25hbWUsIHByZWZpeDsKKyAgICAgIERPKENvbnN1bWVBbnlUeXBlVXJsKCZmdWxsX3R5cGVfbmFtZSwgJnByZWZpeCkpOworICAgICAgRE8oQ29uc3VtZSgiXSIpKTsKKyAgICAgIFRyeUNvbnN1bWUoIjoiKTsgIC8vICc6JyBpcyBvcHRpb25hbCBiZXR3ZWVuIG1lc3NhZ2UgbGFiZWxzIGFuZCB2YWx1ZXMuCisgICAgICBzdHJpbmcgc2VyaWFsaXplZF92YWx1ZTsKKyAgICAgIERPKENvbnN1bWVBbnlWYWx1ZShmdWxsX3R5cGVfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCktPmZpbGUoKS0+cG9vbCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICZzZXJpYWxpemVkX3ZhbHVlKSk7CisgICAgICByZWZsZWN0aW9uLT5TZXRTdHJpbmcoCisgICAgICAgICAgbWVzc2FnZSwgYW55X3R5cGVfdXJsX2ZpZWxkLAorICAgICAgICAgIHN0cmluZyhwcmVmaXggKyBmdWxsX3R5cGVfbmFtZSkpOworICAgICAgcmVmbGVjdGlvbi0+U2V0U3RyaW5nKG1lc3NhZ2UsIGFueV92YWx1ZV9maWVsZCwgc2VyaWFsaXplZF92YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAgICAgaWYgKFRyeUNvbnN1bWUoIlsiKSkgewogICAgICAgLy8gRXh0ZW5zaW9uLgotICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmZpZWxkX25hbWUpKTsKLSAgICAgIHdoaWxlIChUcnlDb25zdW1lKCIuIikpIHsKLSAgICAgICAgc3RyaW5nIHBhcnQ7Ci0gICAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZwYXJ0KSk7Ci0gICAgICAgIGZpZWxkX25hbWUgKz0gIi4iOwotICAgICAgICBmaWVsZF9uYW1lICs9IHBhcnQ7Ci0gICAgICB9CisgICAgICBETyhDb25zdW1lRnVsbFR5cGVOYW1lKCZmaWVsZF9uYW1lKSk7CiAgICAgICBETyhDb25zdW1lKCJdIikpOwogCiAgICAgICBmaWVsZCA9IChmaW5kZXJfICE9IE5VTEwKQEAgLTI1Nyw2NyArNDA3LDEyOSBAQAogICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5GaW5kS25vd25FeHRlbnNpb25CeU5hbWUoZmllbGRfbmFtZSkpOwogCiAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgICBSZXBvcnRFcnJvcigiRXh0ZW5zaW9uIFwiIiArIGZpZWxkX25hbWUgKyAiXCIgaXMgbm90IGRlZmluZWQgb3IgIgotICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFuIGV4dGVuc2lvbiBvZiBcIiIgKwotICAgICAgICAgICAgICAgICAgICBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArICJcIi4iKTsKLSAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIWFsbG93X3Vua25vd25fZmllbGRfKSB7CisgICAgICAgICAgUmVwb3J0RXJyb3IoIkV4dGVuc2lvbiBcIiIgKyBmaWVsZF9uYW1lICsgIlwiIGlzIG5vdCBkZWZpbmVkIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFuIGV4dGVuc2lvbiBvZiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsgIlwiLiIpOworICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBSZXBvcnRXYXJuaW5nKCJFeHRlbnNpb24gXCIiICsgZmllbGRfbmFtZSArICJcIiBpcyBub3QgZGVmaW5lZCBvciAiCisgICAgICAgICAgICAgICAgICAgICAgICAiaXMgbm90IGFuIGV4dGVuc2lvbiBvZiBcIiIgKworICAgICAgICAgICAgICAgICAgICAgICAgZGVzY3JpcHRvci0+ZnVsbF9uYW1lKCkgKyAiXCIuIik7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9IGVsc2UgewogICAgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJmZpZWxkX25hbWUpKTsKIAotICAgICAgZmllbGQgPSBkZXNjcmlwdG9yLT5GaW5kRmllbGRCeU5hbWUoZmllbGRfbmFtZSk7Ci0gICAgICAvLyBHcm91cCBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FwaXRhbGl6ZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlCi0gICAgICAvLyAucHJvdG8gZmlsZSwgd2hpY2ggYWN0dWFsbHkgbWF0Y2hlcyB0aGVpciB0eXBlIG5hbWVzLCBub3QgdGhlaXIgZmllbGQKLSAgICAgIC8vIG5hbWVzLgotICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKLSAgICAgICAgc3RyaW5nIGxvd2VyX2ZpZWxkX25hbWUgPSBmaWVsZF9uYW1lOwotICAgICAgICBMb3dlclN0cmluZygmbG93ZXJfZmllbGRfbmFtZSk7Ci0gICAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGxvd2VyX2ZpZWxkX25hbWUpOwotICAgICAgICAvLyBJZiB0aGUgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaCB3b3JrZWQgYnV0IHRoZSBmaWVsZCBpcyBOT1QgYSBncm91cCwKLSAgICAgICAgaWYgKGZpZWxkICE9IE5VTEwgJiYgZmllbGQtPnR5cGUoKSAhPSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAgIGludDMyIGZpZWxkX251bWJlcjsKKyAgICAgIGlmIChhbGxvd19maWVsZF9udW1iZXJfICYmIHNhZmVfc3RydG8zMihmaWVsZF9uYW1lLCAmZmllbGRfbnVtYmVyKSkgeworICAgICAgICBpZiAoZGVzY3JpcHRvci0+SXNFeHRlbnNpb25OdW1iZXIoZmllbGRfbnVtYmVyKSkgeworICAgICAgICAgIGZpZWxkID0gcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIoZmllbGRfbnVtYmVyKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TnVtYmVyKGZpZWxkX251bWJlcik7CisgICAgICAgIH0KKyAgICAgIH0gZWxzZSB7CisgICAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX25hbWUpOworICAgICAgICAvLyBHcm91cCBuYW1lcyBhcmUgZXhwZWN0ZWQgdG8gYmUgY2FwaXRhbGl6ZWQgYXMgdGhleSBhcHBlYXIgaW4gdGhlCisgICAgICAgIC8vIC5wcm90byBmaWxlLCB3aGljaCBhY3R1YWxseSBtYXRjaGVzIHRoZWlyIHR5cGUgbmFtZXMsIG5vdCB0aGVpcgorICAgICAgICAvLyBmaWVsZCBuYW1lcy4KKyAgICAgICAgaWYgKGZpZWxkID09IE5VTEwpIHsKKyAgICAgICAgICBzdHJpbmcgbG93ZXJfZmllbGRfbmFtZSA9IGZpZWxkX25hbWU7CisgICAgICAgICAgTG93ZXJTdHJpbmcoJmxvd2VyX2ZpZWxkX25hbWUpOworICAgICAgICAgIGZpZWxkID0gZGVzY3JpcHRvci0+RmluZEZpZWxkQnlOYW1lKGxvd2VyX2ZpZWxkX25hbWUpOworICAgICAgICAgIC8vIElmIHRoZSBjYXNlLWluc2Vuc2l0aXZlIG1hdGNoIHdvcmtlZCBidXQgdGhlIGZpZWxkIGlzIE5PVCBhIGdyb3VwLAorICAgICAgICAgIGlmIChmaWVsZCAhPSBOVUxMICYmIGZpZWxkLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7CisgICAgICAgICAgICBmaWVsZCA9IE5VTEw7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIC8vIEFnYWluLCBzcGVjaWFsLWNhc2UgZ3JvdXAgbmFtZXMgYXMgZGVzY3JpYmVkIGFib3ZlLgorICAgICAgICBpZiAoZmllbGQgIT0gTlVMTCAmJiBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUAorICAgICAgICAgICAgJiYgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCkgIT0gZmllbGRfbmFtZSkgewogICAgICAgICAgIGZpZWxkID0gTlVMTDsKICAgICAgICAgfQotICAgICAgfQotICAgICAgLy8gQWdhaW4sIHNwZWNpYWwtY2FzZSBncm91cCBuYW1lcyBhcyBkZXNjcmliZWQgYWJvdmUuCi0gICAgICBpZiAoZmllbGQgIT0gTlVMTCAmJiBmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9HUk9VUAotICAgICAgICAgICYmIGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bmFtZSgpICE9IGZpZWxkX25hbWUpIHsKLSAgICAgICAgZmllbGQgPSBOVUxMOworCisgICAgICAgIGlmIChmaWVsZCA9PSBOVUxMICYmIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfKSB7CisgICAgICAgICAgc3RyaW5nIGxvd2VyX2ZpZWxkX25hbWUgPSBmaWVsZF9uYW1lOworICAgICAgICAgIExvd2VyU3RyaW5nKCZsb3dlcl9maWVsZF9uYW1lKTsKKyAgICAgICAgICBmaWVsZCA9IGRlc2NyaXB0b3ItPkZpbmRGaWVsZEJ5TG93ZXJjYXNlTmFtZShsb3dlcl9maWVsZF9uYW1lKTsKKyAgICAgICAgfQogICAgICAgfQogCiAgICAgICBpZiAoZmllbGQgPT0gTlVMTCkgewotICAgICAgICBSZXBvcnRFcnJvcigiTWVzc2FnZSB0eXBlIFwiIiArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsKLSAgICAgICAgICAgICAgICAgICAgIlwiIGhhcyBubyBmaWVsZCBuYW1lZCBcIiIgKyBmaWVsZF9uYW1lICsgIlwiLiIpOwotICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIGlmICghYWxsb3dfdW5rbm93bl9maWVsZF8pIHsKKyAgICAgICAgICBSZXBvcnRFcnJvcigiTWVzc2FnZSB0eXBlIFwiIiArIGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpICsKKyAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIGZpZWxkX25hbWUgKyAiXCIuIik7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFJlcG9ydFdhcm5pbmcoIk1lc3NhZ2UgdHlwZSBcIiIgKyBkZXNjcmlwdG9yLT5mdWxsX25hbWUoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAiXCIgaGFzIG5vIGZpZWxkIG5hbWVkIFwiIiArIGZpZWxkX25hbWUgKyAiXCIuIik7CisgICAgICAgIH0KICAgICAgIH0KICAgICB9CiAKLSAgICAvLyBGYWlsIGlmIHRoZSBmaWVsZCBpcyBub3QgcmVwZWF0ZWQgYW5kIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLgotICAgIGlmICgoc2luZ3VsYXJfb3ZlcndyaXRlX3BvbGljeV8gPT0gRk9SQklEX1NJTkdVTEFSX09WRVJXUklURVMpICYmCi0gICAgICAgICFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiByZWZsZWN0aW9uLT5IYXNGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7Ci0gICAgICBSZXBvcnRFcnJvcigiTm9uLXJlcGVhdGVkIGZpZWxkIFwiIiArIGZpZWxkX25hbWUgKwotICAgICAgICAgICAgICAgICAgIlwiIGlzIHNwZWNpZmllZCBtdWx0aXBsZSB0aW1lcy4iKTsKLSAgICAgIHJldHVybiBmYWxzZTsKKyAgICAvLyBTa2lwcyB1bmtub3duIGZpZWxkLgorICAgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgICBHT09HTEVfQ0hFQ0soYWxsb3dfdW5rbm93bl9maWVsZF8pOworICAgICAgLy8gVHJ5IHRvIGd1ZXNzIHRoZSB0eXBlIG9mIHRoaXMgZmllbGQuCisgICAgICAvLyBJZiB0aGlzIGZpZWxkIGlzIG5vdCBhIG1lc3NhZ2UsIHRoZXJlIHNob3VsZCBiZSBhICI6IiBiZXR3ZWVuIHRoZQorICAgICAgLy8gZmllbGQgbmFtZSBhbmQgdGhlIGZpZWxkIHZhbHVlIGFuZCBhbHNvIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgbm90CisgICAgICAvLyBzdGFydCB3aXRoICJ7IiBvciAiPCIgd2hpY2ggaW5kaWNhdGVzIHRoZSBiZWdpbm5pbmcgb2YgYSBtZXNzYWdlIGJvZHkuCisgICAgICAvLyBJZiB0aGVyZSBpcyBubyAiOiIgb3IgdGhlcmUgaXMgYSAieyIgb3IgIjwiIGFmdGVyICI6IiwgdGhpcyBmaWVsZCBoYXMKKyAgICAgIC8vIHRvIGJlIGEgbWVzc2FnZSBvciB0aGUgaW5wdXQgaXMgaWxsLWZvcm1lZC4KKyAgICAgIGlmIChUcnlDb25zdW1lKCI6IikgJiYgIUxvb2tpbmdBdCgieyIpICYmICFMb29raW5nQXQoIjwiKSkgeworICAgICAgICByZXR1cm4gU2tpcEZpZWxkVmFsdWUoKTsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiBTa2lwRmllbGRNZXNzYWdlKCk7CisgICAgICB9CisgICAgfQorCisgICAgaWYgKHNpbmd1bGFyX292ZXJ3cml0ZV9wb2xpY3lfID09IEZPUkJJRF9TSU5HVUxBUl9PVkVSV1JJVEVTKSB7CisgICAgICAvLyBGYWlsIGlmIHRoZSBmaWVsZCBpcyBub3QgcmVwZWF0ZWQgYW5kIGl0IGhhcyBhbHJlYWR5IGJlZW4gc3BlY2lmaWVkLgorICAgICAgaWYgKCFmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiByZWZsZWN0aW9uLT5IYXNGaWVsZCgqbWVzc2FnZSwgZmllbGQpKSB7CisgICAgICAgIFJlcG9ydEVycm9yKCJOb24tcmVwZWF0ZWQgZmllbGQgXCIiICsgZmllbGRfbmFtZSArCisgICAgICAgICAgICAgICAgICAgICJcIiBpcyBzcGVjaWZpZWQgbXVsdGlwbGUgdGltZXMuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIC8vIEZhaWwgaWYgdGhlIGZpZWxkIGlzIGEgbWVtYmVyIG9mIGEgb25lb2YgYW5kIGFub3RoZXIgbWVtYmVyIGhhcyBhbHJlYWR5CisgICAgICAvLyBiZWVuIHNwZWNpZmllZC4KKyAgICAgIGNvbnN0IE9uZW9mRGVzY3JpcHRvciogb25lb2YgPSBmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpOworICAgICAgaWYgKG9uZW9mICE9IE5VTEwgJiYgcmVmbGVjdGlvbi0+SGFzT25lb2YoKm1lc3NhZ2UsIG9uZW9mKSkgeworICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIG90aGVyX2ZpZWxkID0KKyAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldE9uZW9mRmllbGREZXNjcmlwdG9yKCptZXNzYWdlLCBvbmVvZik7CisgICAgICAgIFJlcG9ydEVycm9yKCJGaWVsZCBcIiIgKyBmaWVsZF9uYW1lICsgIlwiIGlzIHNwZWNpZmllZCBhbG9uZyB3aXRoICIKKyAgICAgICAgICAgICAgICAgICAgImZpZWxkIFwiIiArIG90aGVyX2ZpZWxkLT5uYW1lKCkgKyAiXCIsIGFub3RoZXIgbWVtYmVyICIKKyAgICAgICAgICAgICAgICAgICAgIm9mIG9uZW9mIFwiIiArIG9uZW9mLT5uYW1lKCkgKyAiXCIuIik7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KICAgICB9CiAKICAgICAvLyBQZXJmb3JtIHNwZWNpYWwgaGFuZGxpbmcgZm9yIGVtYmVkZGVkIG1lc3NhZ2UgdHlwZXMuCiAgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CiAgICAgICAvLyAnOicgaXMgb3B0aW9uYWwgaGVyZS4KICAgICAgIFRyeUNvbnN1bWUoIjoiKTsKKyAgICB9IGVsc2UgeworICAgICAgLy8gJzonIGlzIHJlcXVpcmVkIGhlcmUuCisgICAgICBETyhDb25zdW1lKCI6IikpOworICAgIH0KKworICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBUcnlDb25zdW1lKCJbIikpIHsKKyAgICAgIC8vIFNob3J0IHJlcGVhdGVkIGZvcm1hdCwgZS5nLiAgImZvbzogWzEsIDIsIDNdIgorICAgICAgd2hpbGUgKHRydWUpIHsKKyAgICAgICAgaWYgKGZpZWxkLT5jcHBfdHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9NRVNTQUdFKSB7CisgICAgICAgICAgLy8gUGVyZm9ybSBzcGVjaWFsIGhhbmRsaW5nIGZvciBlbWJlZGRlZCBtZXNzYWdlIHR5cGVzLgorICAgICAgICAgIERPKENvbnN1bWVGaWVsZE1lc3NhZ2UobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBETyhDb25zdW1lRmllbGRWYWx1ZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCkpOworICAgICAgICB9CisgICAgICAgIGlmIChUcnlDb25zdW1lKCJdIikpIHsKKyAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBETyhDb25zdW1lKCIsIikpOworICAgICAgfQorICAgIH0gZWxzZSBpZiAoZmllbGQtPmNwcF90eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX01FU1NBR0UpIHsKICAgICAgIERPKENvbnN1bWVGaWVsZE1lc3NhZ2UobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKICAgICB9IGVsc2UgewotICAgICAgRE8oQ29uc3VtZSgiOiIpKTsKLSAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSAmJiBUcnlDb25zdW1lKCJbIikpIHsKLSAgICAgICAgLy8gU2hvcnQgcmVwZWF0ZWQgZm9ybWF0LCBlLmcuICAiZm9vOiBbMSwgMiwgM10iCi0gICAgICAgIHdoaWxlICh0cnVlKSB7Ci0gICAgICAgICAgRE8oQ29uc3VtZUZpZWxkVmFsdWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKLSAgICAgICAgICBpZiAoVHJ5Q29uc3VtZSgiXSIpKSB7Ci0gICAgICAgICAgICBicmVhazsKLSAgICAgICAgICB9Ci0gICAgICAgICAgRE8oQ29uc3VtZSgiLCIpKTsKLSAgICAgICAgfQotICAgICAgfSBlbHNlIHsKLSAgICAgICAgRE8oQ29uc3VtZUZpZWxkVmFsdWUobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGQpKTsKLSAgICAgIH0KKyAgICAgIERPKENvbnN1bWVGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkKSk7CiAgICAgfQogCiAgICAgLy8gRm9yIGhpc3RvcmljYWwgcmVhc29ucywgZmllbGRzIG1heSBvcHRpb25hbGx5IGJlIHNlcGFyYXRlZCBieSBjb21tYXMgb3IKQEAgLTMyOSwyNiArNTQxLDc4IEBACiAgICAgICAgICAgICAgICAgICAgICsgZmllbGRfbmFtZSArICJcIiIpOwogICAgIH0KIAorICAgIC8vIElmIGEgcGFyc2UgaW5mbyB0cmVlIGV4aXN0cywgYWRkIHRoZSBsb2NhdGlvbiBmb3IgdGhlIHBhcnNlZAorICAgIC8vIGZpZWxkLgorICAgIGlmIChwYXJzZV9pbmZvX3RyZWVfICE9IE5VTEwpIHsKKyAgICAgIFJlY29yZExvY2F0aW9uKHBhcnNlX2luZm9fdHJlZV8sIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgUGFyc2VMb2NhdGlvbihzdGFydF9saW5lLCBzdGFydF9jb2x1bW4pKTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIFNraXBzIHRoZSBuZXh0IGZpZWxkIGluY2x1ZGluZyB0aGUgZmllbGQncyBuYW1lIGFuZCB2YWx1ZS4KKyAgYm9vbCBTa2lwRmllbGQoKSB7CisgICAgc3RyaW5nIGZpZWxkX25hbWU7CisgICAgaWYgKFRyeUNvbnN1bWUoIlsiKSkgeworICAgICAgLy8gRXh0ZW5zaW9uIG5hbWUuCisgICAgICBETyhDb25zdW1lRnVsbFR5cGVOYW1lKCZmaWVsZF9uYW1lKSk7CisgICAgICBETyhDb25zdW1lKCJdIikpOworICAgIH0gZWxzZSB7CisgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmZmllbGRfbmFtZSkpOworICAgIH0KKworICAgIC8vIFRyeSB0byBndWVzcyB0aGUgdHlwZSBvZiB0aGlzIGZpZWxkLgorICAgIC8vIElmIHRoaXMgZmllbGQgaXMgbm90IGEgbWVzc2FnZSwgdGhlcmUgc2hvdWxkIGJlIGEgIjoiIGJldHdlZW4gdGhlCisgICAgLy8gZmllbGQgbmFtZSBhbmQgdGhlIGZpZWxkIHZhbHVlIGFuZCBhbHNvIHRoZSBmaWVsZCB2YWx1ZSBzaG91bGQgbm90CisgICAgLy8gc3RhcnQgd2l0aCAieyIgb3IgIjwiIHdoaWNoIGluZGljYXRlcyB0aGUgYmVnaW5uaW5nIG9mIGEgbWVzc2FnZSBib2R5LgorICAgIC8vIElmIHRoZXJlIGlzIG5vICI6IiBvciB0aGVyZSBpcyBhICJ7IiBvciAiPCIgYWZ0ZXIgIjoiLCB0aGlzIGZpZWxkIGhhcworICAgIC8vIHRvIGJlIGEgbWVzc2FnZSBvciB0aGUgaW5wdXQgaXMgaWxsLWZvcm1lZC4KKyAgICBpZiAoVHJ5Q29uc3VtZSgiOiIpICYmICFMb29raW5nQXQoInsiKSAmJiAhTG9va2luZ0F0KCI8IikpIHsKKyAgICAgIERPKFNraXBGaWVsZFZhbHVlKCkpOworICAgIH0gZWxzZSB7CisgICAgICBETyhTa2lwRmllbGRNZXNzYWdlKCkpOworICAgIH0KKyAgICAvLyBGb3IgaGlzdG9yaWNhbCByZWFzb25zLCBmaWVsZHMgbWF5IG9wdGlvbmFsbHkgYmUgc2VwYXJhdGVkIGJ5IGNvbW1hcyBvcgorICAgIC8vIHNlbWljb2xvbnMuCisgICAgVHJ5Q29uc3VtZSgiOyIpIHx8IFRyeUNvbnN1bWUoIiwiKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCiAgIGJvb2wgQ29uc3VtZUZpZWxkTWVzc2FnZShNZXNzYWdlKiBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKLSAgICBzdHJpbmcgZGVsaW1ldGVyOwotICAgIGlmIChUcnlDb25zdW1lKCI8IikpIHsKLSAgICAgIGRlbGltZXRlciA9ICI+IjsKLSAgICB9IGVsc2UgewotICAgICAgRE8oQ29uc3VtZSgieyIpKTsKLSAgICAgIGRlbGltZXRlciA9ICJ9IjsKKworICAgIC8vIElmIHRoZSBwYXJzZSBpbmZvcm1hdGlvbiB0cmVlIGlzIG5vdCBOVUxMLCBjcmVhdGUgYSBuZXN0ZWQgb25lCisgICAgLy8gZm9yIHRoZSBuZXN0ZWQgbWVzc2FnZS4KKyAgICBQYXJzZUluZm9UcmVlKiBwYXJlbnQgPSBwYXJzZV9pbmZvX3RyZWVfOworICAgIGlmIChwYXJlbnQgIT0gTlVMTCkgeworICAgICAgcGFyc2VfaW5mb190cmVlXyA9IENyZWF0ZU5lc3RlZChwYXJlbnQsIGZpZWxkKTsKICAgICB9CiAKKyAgICBzdHJpbmcgZGVsaW1pdGVyOworICAgIERPKENvbnN1bWVNZXNzYWdlRGVsaW1pdGVyKCZkZWxpbWl0ZXIpKTsKICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIERPKENvbnN1bWVNZXNzYWdlKHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLCBkZWxpbWV0ZXIpKTsKKyAgICAgIERPKENvbnN1bWVNZXNzYWdlKHJlZmxlY3Rpb24tPkFkZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLCBkZWxpbWl0ZXIpKTsKICAgICB9IGVsc2UgewogICAgICAgRE8oQ29uc3VtZU1lc3NhZ2UocmVmbGVjdGlvbi0+TXV0YWJsZU1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLAotICAgICAgICAgICAgICAgICAgICAgICAgZGVsaW1ldGVyKSk7CisgICAgICAgICAgICAgICAgICAgICAgICBkZWxpbWl0ZXIpKTsKICAgICB9CisKKyAgICAvLyBSZXNldCB0aGUgcGFyc2UgaW5mb3JtYXRpb24gdHJlZS4KKyAgICBwYXJzZV9pbmZvX3RyZWVfID0gcGFyZW50OworICAgIHJldHVybiB0cnVlOworICB9CisKKyAgLy8gU2tpcHMgdGhlIHdob2xlIGJvZHkgb2YgYSBtZXNzYWdlIGluY2x1ZGluZyB0aGUgYmVnaW5uaW5nIGRlbGltaXRlciBhbmQKKyAgLy8gdGhlIGVuZGluZyBkZWxpbWl0ZXIuCisgIGJvb2wgU2tpcEZpZWxkTWVzc2FnZSgpIHsKKyAgICBzdHJpbmcgZGVsaW1pdGVyOworICAgIERPKENvbnN1bWVNZXNzYWdlRGVsaW1pdGVyKCZkZWxpbWl0ZXIpKTsKKyAgICB3aGlsZSAoIUxvb2tpbmdBdCgiPiIpICYmICAhTG9va2luZ0F0KCJ9IikpIHsKKyAgICAgIERPKFNraXBGaWVsZCgpKTsKKyAgICB9CisgICAgRE8oQ29uc3VtZShkZWxpbWl0ZXIpKTsKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC0zOTgsNyArNjYyLDcgQEAKICAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX0ZMT0FUOiB7CiAgICAgICAgIGRvdWJsZSB2YWx1ZTsKICAgICAgICAgRE8oQ29uc3VtZURvdWJsZSgmdmFsdWUpKTsKLSAgICAgICAgU0VUX0ZJRUxEKEZsb2F0LCBzdGF0aWNfY2FzdDxmbG9hdD4odmFsdWUpKTsKKyAgICAgICAgU0VUX0ZJRUxEKEZsb2F0LCBpbzo6U2FmZURvdWJsZVRvRmxvYXQodmFsdWUpKTsKICAgICAgICAgYnJlYWs7CiAgICAgICB9CiAKQEAgLTQyNCw5ICs2ODgsOSBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIHN0cmluZyB2YWx1ZTsKICAgICAgICAgICBETyhDb25zdW1lSWRlbnRpZmllcigmdmFsdWUpKTsKLSAgICAgICAgICBpZiAodmFsdWUgPT0gInRydWUiIHx8IHZhbHVlID09ICJ0IikgeworICAgICAgICAgIGlmICh2YWx1ZSA9PSAidHJ1ZSIgfHwgdmFsdWUgPT0gIlRydWUiIHx8IHZhbHVlID09ICJ0IikgewogICAgICAgICAgICAgU0VUX0ZJRUxEKEJvb2wsIHRydWUpOwotICAgICAgICAgIH0gZWxzZSBpZiAodmFsdWUgPT0gImZhbHNlIiB8fCB2YWx1ZSA9PSAiZiIpIHsKKyAgICAgICAgICB9IGVsc2UgaWYgKHZhbHVlID09ICJmYWxzZSIgfHwgdmFsdWUgPT0gIkZhbHNlIiB8fCB2YWx1ZSA9PSAiZiIpIHsKICAgICAgICAgICAgIFNFVF9GSUVMRChCb29sLCBmYWxzZSk7CiAgICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAgIFJlcG9ydEVycm9yKCJJbnZhbGlkIHZhbHVlIGZvciBib29sZWFuIGZpZWxkIFwiIiArIGZpZWxkLT5uYW1lKCkKQEAgLTQ1OSw5ICs3MjMsMTUgQEAKICAgICAgICAgfQogCiAgICAgICAgIGlmIChlbnVtX3ZhbHVlID09IE5VTEwpIHsKLSAgICAgICAgICBSZXBvcnRFcnJvcigiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcIiIgKyB2YWx1ZSAgKyAiXCIgZm9yICIKLSAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgXCIiICsgZmllbGQtPm5hbWUoKSArICJcIi4iKTsKLSAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgaWYgKCFhbGxvd191bmtub3duX2VudW1fKSB7CisgICAgICAgICAgICBSZXBvcnRFcnJvcigiVW5rbm93biBlbnVtZXJhdGlvbiB2YWx1ZSBvZiBcIiIgKyB2YWx1ZSAgKyAiXCIgZm9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJmaWVsZCBcIiIgKyBmaWVsZC0+bmFtZSgpICsgIlwiLiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBSZXBvcnRXYXJuaW5nKCJVbmtub3duIGVudW1lcmF0aW9uIHZhbHVlIG9mIFwiIiArIHZhbHVlICArICJcIiBmb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAiZmllbGQgXCIiICsgZmllbGQtPm5hbWUoKSArICJcIi4iKTsKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgIH0KICAgICAgICAgfQogCiAgICAgICAgIFNFVF9GSUVMRChFbnVtLCBlbnVtX3ZhbHVlKTsKQEAgLTQ3OSw2ICs3NDksNjAgQEAKICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCisgIGJvb2wgU2tpcEZpZWxkVmFsdWUoKSB7CisgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9TVFJJTkcpKSB7CisgICAgICB3aGlsZSAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX1NUUklORykpIHsKKyAgICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgLy8gUG9zc2libGUgZmllbGQgdmFsdWVzIG90aGVyIHRoYW4gc3RyaW5nOgorICAgIC8vICAgMTIzNDUgICAgICAgID0+IFRZUEVfSU5URUdFUgorICAgIC8vICAgLTEyMzQ1ICAgICAgID0+IFRZUEVfU1lNQk9MICsgVFlQRV9JTlRFR0VSCisgICAgLy8gICAxLjIzNDUgICAgICAgPT4gVFlQRV9GTE9BVAorICAgIC8vICAgLTEuMjM0NSAgICAgID0+IFRZUEVfU1lNQk9MICsgVFlQRV9GTE9BVAorICAgIC8vICAgaW5mICAgICAgICAgID0+IFRZUEVfSURFTlRJRklFUgorICAgIC8vICAgLWluZiAgICAgICAgID0+IFRZUEVfU1lNQk9MICsgVFlQRV9JREVOVElGSUVSCisgICAgLy8gICBUWVBFX0lOVEVHRVIgPT4gVFlQRV9JREVOVElGSUVSCisgICAgLy8gRGl2aWRlcyB0aGVtIGludG8gdHdvIGdyb3VwLCBvbmUgd2l0aCBUWVBFX1NZTUJPTAorICAgIC8vIGFuZCB0aGUgb3RoZXIgd2l0aG91dDoKKyAgICAvLyAgIEdyb3VwIG9uZToKKyAgICAvLyAgICAgMTIzNDUgICAgICAgID0+IFRZUEVfSU5URUdFUgorICAgIC8vICAgICAxLjIzNDUgICAgICAgPT4gVFlQRV9GTE9BVAorICAgIC8vICAgICBpbmYgICAgICAgICAgPT4gVFlQRV9JREVOVElGSUVSCisgICAgLy8gICAgIFRZUEVfSU5URUdFUiA9PiBUWVBFX0lERU5USUZJRVIKKyAgICAvLyAgIEdyb3VwIHR3bzoKKyAgICAvLyAgICAgLTEyMzQ1ICAgICAgID0+IFRZUEVfU1lNQk9MICsgVFlQRV9JTlRFR0VSCisgICAgLy8gICAgIC0xLjIzNDUgICAgICA9PiBUWVBFX1NZTUJPTCArIFRZUEVfRkxPQVQKKyAgICAvLyAgICAgLWluZiAgICAgICAgID0+IFRZUEVfU1lNQk9MICsgVFlQRV9JREVOVElGSUVSCisgICAgLy8gQXMgd2UgY2FuIHNlZSwgdGhlIGZpZWxkIHZhbHVlIGNvbnNpc3RzIG9mIGFuIG9wdGlvbmFsICctJyBhbmQgb25lIG9mCisgICAgLy8gVFlQRV9JTlRFR0VSLCBUWVBFX0ZMT0FUIGFuZCBUWVBFX0lERU5USUZJRVIuCisgICAgYm9vbCBoYXNfbWludXMgPSBUcnlDb25zdW1lKCItIik7CisgICAgaWYgKCFMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSU5URUdFUikgJiYKKyAgICAgICAgIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9GTE9BVCkgJiYKKyAgICAgICAgIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICAvLyBDb21iaW5hdGlvbiBvZiAnLScgYW5kIFRZUEVfSURFTlRJRklFUiBtYXkgcmVzdWx0IGluIGFuIGludmFsaWQgZmllbGQKKyAgICAvLyB2YWx1ZSB3aGlsZSBvdGhlciBjb21iaW5hdGlvbnMgYWxsIGdlbmVyYXRlIHZhbGlkIHZhbHVlcy4KKyAgICAvLyBXZSBjaGVjayBpZiB0aGUgdmFsdWUgb2YgdGhpcyBjb21iaW5hdGlvbiBpcyB2YWxpZCBoZXJlLgorICAgIC8vIFRZUEVfSURFTlRJRklFUiBhZnRlciBhICctJyBzaG91bGQgYmUgb25lIG9mIHRoZSBmbG9hdCB2YWx1ZXMgbGlzdGVkCisgICAgLy8gYmVsb3c6CisgICAgLy8gICBpbmYsIGluZmYsIGluZmluaXR5LCBuYW4KKyAgICBpZiAoaGFzX21pbnVzICYmIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgc3RyaW5nIHRleHQgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworICAgICAgTG93ZXJTdHJpbmcoJnRleHQpOworICAgICAgaWYgKHRleHQgIT0gImluZiIgJiYKKyAgICAgICAgICB0ZXh0ICE9ICJpbmZpbml0eSIgJiYKKyAgICAgICAgICB0ZXh0ICE9ICJuYW4iKSB7CisgICAgICAgIFJlcG9ydEVycm9yKCJJbnZhbGlkIGZsb2F0IG51bWJlcjogIiArIHRleHQpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgfQorICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKICAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBjdXJyZW50IHRva2VuJ3MgdGV4dCBpcyBlcXVhbCB0byB0aGF0IHNwZWNpZmllZC4KICAgYm9vbCBMb29raW5nQXQoY29uc3Qgc3RyaW5nJiB0ZXh0KSB7CiAgICAgcmV0dXJuIHRva2VuaXplcl8uY3VycmVudCgpLnRleHQgPT0gdGV4dDsKQEAgLTQ5MiwxNCArODE2LDM0IEBACiAgIC8vIENvbnN1bWVzIGFuIGlkZW50aWZpZXIgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgaWRlbnRpZmllciBwYXJhbWV0ZXIuCiAgIC8vIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGlzIG5vdCBvZiB0eXBlIElERU5URklFUi4KICAgYm9vbCBDb25zdW1lSWRlbnRpZmllcihzdHJpbmcqIGlkZW50aWZpZXIpIHsKLSAgICBpZiAoIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgewotICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGlkZW50aWZpZXIuIik7Ci0gICAgICByZXR1cm4gZmFsc2U7CisgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JREVOVElGSUVSKSkgeworICAgICAgKmlkZW50aWZpZXIgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICAqaWRlbnRpZmllciA9IHRva2VuaXplcl8uY3VycmVudCgpLnRleHQ7CisgICAgLy8gSWYgYWxsb3dfZmllbGRfbnVtZXJfIG9yIGFsbG93X3Vua25vd25fZmllbGRfIGlzIHRydWUsIHdlIHNob3VsZCBhYmxlCisgICAgLy8gdG8gcGFyc2UgaW50ZWdlciBpZGVudGlmaWVycy4KKyAgICBpZiAoKGFsbG93X2ZpZWxkX251bWJlcl8gfHwgYWxsb3dfdW5rbm93bl9maWVsZF8pCisgICAgICAgICYmIExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgICAgKmlkZW50aWZpZXIgPSB0b2tlbml6ZXJfLmN1cnJlbnQoKS50ZXh0OworICAgICAgdG9rZW5pemVyXy5OZXh0KCk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CiAKLSAgICB0b2tlbml6ZXJfLk5leHQoKTsKKyAgICBSZXBvcnRFcnJvcigiRXhwZWN0ZWQgaWRlbnRpZmllci4iKTsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBDb25zdW1lIGEgc3RyaW5nIG9mIGZvcm0gIjxpZDE+LjxpZDI+Li4uLjxpZE4+Ii4KKyAgYm9vbCBDb25zdW1lRnVsbFR5cGVOYW1lKHN0cmluZyogbmFtZSkgeworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKG5hbWUpKTsKKyAgICB3aGlsZSAoVHJ5Q29uc3VtZSgiLiIpKSB7CisgICAgICBzdHJpbmcgcGFydDsKKyAgICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZwYXJ0KSk7CisgICAgICAqbmFtZSArPSAiLiI7CisgICAgICAqbmFtZSArPSBwYXJ0OworICAgIH0KICAgICByZXR1cm4gdHJ1ZTsKICAgfQogCkBAIC01NjcsNiArOTExLDI5IEBACiAgICAgcmV0dXJuIHRydWU7CiAgIH0KIAorICAvLyBDb25zdW1lcyBhIHVpbnQ2NCBhbmQgc2F2ZXMgaXRzIHZhbHVlIGluIHRoZSB2YWx1ZSBwYXJhbWV0ZXIuCisgIC8vIEFjY2VwdHMgZGVjaW1hbCBudW1iZXJzIG9ubHksIHJlamVjdHMgaGV4IG9yIG9jdCBudW1iZXJzLgorICBib29sIENvbnN1bWVVbnNpZ25lZERlY2ltYWxJbnRlZ2VyKHVpbnQ2NCogdmFsdWUsIHVpbnQ2NCBtYXhfdmFsdWUpIHsKKyAgICBpZiAoIUxvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgeworICAgICAgUmVwb3J0RXJyb3IoIkV4cGVjdGVkIGludGVnZXIuIik7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY29uc3Qgc3RyaW5nJiB0ZXh0ID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKKyAgICBpZiAoSXNIZXhOdW1iZXIodGV4dCkgfHwgSXNPY3ROdW1iZXIodGV4dCkpIHsKKyAgICAgIFJlcG9ydEVycm9yKCJFeHBlY3QgYSBkZWNpbWFsIG51bWJlci4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpZiAoIWlvOjpUb2tlbml6ZXI6OlBhcnNlSW50ZWdlcih0ZXh0LCBtYXhfdmFsdWUsIHZhbHVlKSkgeworICAgICAgUmVwb3J0RXJyb3IoIkludGVnZXIgb3V0IG9mIHJhbmdlLiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIHRva2VuaXplcl8uTmV4dCgpOworICAgIHJldHVybiB0cnVlOworICB9CisKICAgLy8gQ29uc3VtZXMgYSBkb3VibGUgYW5kIHNhdmVzIGl0cyB2YWx1ZSBpbiB0aGUgdmFsdWUgcGFyYW1ldGVyLgogICAvLyBOb3RlIHRoYXQgc2luY2UgdGhlIHRva2VuaXplciBkb2VzIG5vdCBzdXBwb3J0IG5lZ2F0aXZlIG51bWJlcnMsCiAgIC8vIHdlIGFjdHVhbGx5IG1heSBjb25zdW1lIGFuIGFkZGl0aW9uYWwgdG9rZW4gKGZvciB0aGUgbWludXMgc2lnbikgaW4gdGhpcwpAQCAtNTg0LDcgKzk1MSw3IEBACiAgICAgaWYgKExvb2tpbmdBdFR5cGUoaW86OlRva2VuaXplcjo6VFlQRV9JTlRFR0VSKSkgewogICAgICAgLy8gV2UgaGF2ZSBmb3VuZCBhbiBpbnRlZ2VyIHZhbHVlIGZvciB0aGUgZG91YmxlLgogICAgICAgdWludDY0IGludGVnZXJfdmFsdWU7Ci0gICAgICBETyhDb25zdW1lVW5zaWduZWRJbnRlZ2VyKCZpbnRlZ2VyX3ZhbHVlLCBrdWludDY0bWF4KSk7CisgICAgICBETyhDb25zdW1lVW5zaWduZWREZWNpbWFsSW50ZWdlcigmaW50ZWdlcl92YWx1ZSwga3VpbnQ2NG1heCkpOwogCiAgICAgICAqdmFsdWUgPSBzdGF0aWNfY2FzdDxkb3VibGU+KGludGVnZXJfdmFsdWUpOwogICAgIH0gZWxzZSBpZiAoTG9va2luZ0F0VHlwZShpbzo6VG9rZW5pemVyOjpUWVBFX0ZMT0FUKSkgewpAQCAtNTk2LDcgKzk2Myw4IEBACiAgICAgfSBlbHNlIGlmIChMb29raW5nQXRUeXBlKGlvOjpUb2tlbml6ZXI6OlRZUEVfSURFTlRJRklFUikpIHsKICAgICAgIHN0cmluZyB0ZXh0ID0gdG9rZW5pemVyXy5jdXJyZW50KCkudGV4dDsKICAgICAgIExvd2VyU3RyaW5nKCZ0ZXh0KTsKLSAgICAgIGlmICh0ZXh0ID09ICJpbmYiIHx8IHRleHQgPT0gImluZmluaXR5IikgeworICAgICAgaWYgKHRleHQgPT0gImluZiIgfHwKKyAgICAgICAgICB0ZXh0ID09ICJpbmZpbml0eSIpIHsKICAgICAgICAgKnZhbHVlID0gc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjppbmZpbml0eSgpOwogICAgICAgICB0b2tlbml6ZXJfLk5leHQoKTsKICAgICAgIH0gZWxzZSBpZiAodGV4dCA9PSAibmFuIikgewpAQCAtNjE4LDYgKzk4Niw1NyBAQAogICAgIHJldHVybiB0cnVlOwogICB9CiAKKyAgLy8gQ29uc3VtZXMgQW55Ojp0eXBlX3VybCB2YWx1ZSwgb2YgZm9ybSAidHlwZS5nb29nbGVhcGlzLmNvbS9mdWxsLnR5cGUuTmFtZSIKKyAgLy8gb3IgInR5cGUuZ29vZ2xlcHJvZC5jb20vZnVsbC50eXBlLk5hbWUiCisgIGJvb2wgQ29uc3VtZUFueVR5cGVVcmwoc3RyaW5nKiBmdWxsX3R5cGVfbmFtZSwgc3RyaW5nKiBwcmVmaXgpIHsKKyAgICAvLyBUT0RPKHNhaXRvKSBFeHRlbmQgQ29uc3VtZSgpIHRvIGNvbnN1bWUgbXVsdGlwbGUgdG9rZW5zIGF0IG9uY2UsIHNvIHRoYXQKKyAgICAvLyB0aGlzIGNvZGUgY2FuIGJlIHdyaXR0ZW4gYXMganVzdCBETyhDb25zdW1lKGtHb29nbGVBcGlzVHlwZVByZWZpeCkpLgorICAgIHN0cmluZyB1cmwxLCB1cmwyLCB1cmwzOworICAgIERPKENvbnN1bWVJZGVudGlmaWVyKCZ1cmwxKSk7ICAvLyB0eXBlCisgICAgRE8oQ29uc3VtZSgiLiIpKTsKKyAgICBETyhDb25zdW1lSWRlbnRpZmllcigmdXJsMikpOyAgLy8gZ29vZ2xlYXBpcworICAgIERPKENvbnN1bWUoIi4iKSk7CisgICAgRE8oQ29uc3VtZUlkZW50aWZpZXIoJnVybDMpKTsgIC8vIGNvbQorICAgIERPKENvbnN1bWUoIi8iKSk7CisgICAgRE8oQ29uc3VtZUZ1bGxUeXBlTmFtZShmdWxsX3R5cGVfbmFtZSkpOworCisgICAgKnByZWZpeCA9IHVybDEgKyAiLiIgKyB1cmwyICsgIi4iICsgdXJsMyArICIvIjsKKyAgICBpZiAoKnByZWZpeCAhPSBpbnRlcm5hbDo6a1R5cGVHb29nbGVBcGlzQ29tUHJlZml4ICYmCisgICAgICAgICpwcmVmaXggIT0gaW50ZXJuYWw6OmtUeXBlR29vZ2xlUHJvZENvbVByZWZpeCkgeworICAgICAgUmVwb3J0RXJyb3IoIlRleHRGb3JtYXQ6OlBhcnNlciBmb3IgQW55IHN1cHBvcnRzIG9ubHkgIgorICAgICAgICAgICAgICAgICAgInR5cGUuZ29vZ2xlYXBpcy5jb20gYW5kIHR5cGUuZ29vZ2xlcHJvZC5jb20sICIKKyAgICAgICAgICAgICAgICAgICJidXQgZm91bmQgXCIiICsgKnByZWZpeCArICJcIiIpOworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKKyAgfQorCisgIC8vIEEgaGVscGVyIGZ1bmN0aW9uIGZvciByZWNvbnN0cnVjdGluZyBBbnk6OnZhbHVlLiBDb25zdW1lcyBhIHRleHQgb2YKKyAgLy8gZnVsbF90eXBlX25hbWUsIHRoZW4gc2VyaWFsaXplcyBpdCBpbnRvIHNlcmlhbGl6ZWRfdmFsdWUuICJwb29sIiBpcyB1c2VkIHRvCisgIC8vIGxvb2sgdXAgYW5kIGNyZWF0ZSBhIHRlbXBvcmFyeSBvYmplY3Qgd2l0aCBmdWxsX3R5cGVfbmFtZS4KKyAgYm9vbCBDb25zdW1lQW55VmFsdWUoY29uc3Qgc3RyaW5nJiBmdWxsX3R5cGVfbmFtZSwgY29uc3QgRGVzY3JpcHRvclBvb2wqIHBvb2wsCisgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogc2VyaWFsaXplZF92YWx1ZSkgeworICAgIGNvbnN0IERlc2NyaXB0b3IqIHZhbHVlX2Rlc2NyaXB0b3IgPQorICAgICAgICBwb29sLT5GaW5kTWVzc2FnZVR5cGVCeU5hbWUoZnVsbF90eXBlX25hbWUpOworICAgIGlmICh2YWx1ZV9kZXNjcmlwdG9yID09IE5VTEwpIHsKKyAgICAgIFJlcG9ydEVycm9yKCJDb3VsZCBub3QgZmluZCB0eXBlIFwiIiArIGZ1bGxfdHlwZV9uYW1lICsKKyAgICAgICAgICAgICAgICAgICJcIiBzdG9yZWQgaW4gZ29vZ2xlLnByb3RvYnVmLkFueS4iKTsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgRHluYW1pY01lc3NhZ2VGYWN0b3J5IGZhY3Rvcnk7CisgICAgY29uc3QgTWVzc2FnZSogdmFsdWVfcHJvdG90eXBlID0gZmFjdG9yeS5HZXRQcm90b3R5cGUodmFsdWVfZGVzY3JpcHRvcik7CisgICAgaWYgKHZhbHVlX3Byb3RvdHlwZSA9PSBOVUxMKSB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8TWVzc2FnZT4gdmFsdWUodmFsdWVfcHJvdG90eXBlLT5OZXcoKSk7CisgICAgc3RyaW5nIHN1Yl9kZWxpbWl0ZXI7CisgICAgRE8oQ29uc3VtZU1lc3NhZ2VEZWxpbWl0ZXIoJnN1Yl9kZWxpbWl0ZXIpKTsKKyAgICBETyhDb25zdW1lTWVzc2FnZSh2YWx1ZS5nZXQoKSwgc3ViX2RlbGltaXRlcikpOworCisgICAgdmFsdWUtPkFwcGVuZFRvU3RyaW5nKHNlcmlhbGl6ZWRfdmFsdWUpOworICAgIHJldHVybiB0cnVlOworICB9CisKICAgLy8gQ29uc3VtZXMgYSB0b2tlbiBhbmQgY29uZmlybXMgdGhhdCBpdCBtYXRjaGVzIHRoYXQgc3BlY2lmaWVkIGluIHRoZQogICAvLyB2YWx1ZSBwYXJhbWV0ZXIuIFJldHVybnMgZmFsc2UgaWYgdGhlIHRva2VuIGZvdW5kIGRvZXMgbm90IG1hdGNoIHRoYXQKICAgLy8gd2hpY2ggd2FzIHNwZWNpZmllZC4KQEAgLTY1Myw3ICsxMDcyLDcgQEAKICAgICBleHBsaWNpdCBQYXJzZXJFcnJvckNvbGxlY3RvcihUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlckltcGwqIHBhcnNlcikgOgogICAgICAgICBwYXJzZXJfKHBhcnNlcikgeyB9CiAKLSAgICB2aXJ0dWFsIH5QYXJzZXJFcnJvckNvbGxlY3RvcigpIHsgfTsKKyAgICB2aXJ0dWFsIH5QYXJzZXJFcnJvckNvbGxlY3RvcigpIHsgfQogCiAgICAgdmlydHVhbCB2b2lkIEFkZEVycm9yKGludCBsaW5lLCBpbnQgY29sdW1uLCBjb25zdCBzdHJpbmcmIG1lc3NhZ2UpIHsKICAgICAgIHBhcnNlcl8tPlJlcG9ydEVycm9yKGxpbmUsIGNvbHVtbiwgbWVzc2FnZSk7CkBAIC02NzAsMTAgKzEwODksMTUgQEAKIAogICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CiAgIFRleHRGb3JtYXQ6OkZpbmRlciogZmluZGVyXzsKKyAgUGFyc2VJbmZvVHJlZSogcGFyc2VfaW5mb190cmVlXzsKICAgUGFyc2VyRXJyb3JDb2xsZWN0b3IgdG9rZW5pemVyX2Vycm9yX2NvbGxlY3Rvcl87CiAgIGlvOjpUb2tlbml6ZXIgdG9rZW5pemVyXzsKICAgY29uc3QgRGVzY3JpcHRvciogcm9vdF9tZXNzYWdlX3R5cGVfOwogICBTaW5ndWxhck92ZXJ3cml0ZVBvbGljeSBzaW5ndWxhcl9vdmVyd3JpdGVfcG9saWN5XzsKKyAgY29uc3QgYm9vbCBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXzsKKyAgY29uc3QgYm9vbCBhbGxvd191bmtub3duX2ZpZWxkXzsKKyAgY29uc3QgYm9vbCBhbGxvd191bmtub3duX2VudW1fOworICBjb25zdCBib29sIGFsbG93X2ZpZWxkX251bWJlcl87CiAgIGJvb2wgaGFkX2Vycm9yc187CiB9OwogCkBAIC02OTksNyArMTEyMyw3IEBACiAgIH5UZXh0R2VuZXJhdG9yKCkgewogICAgIC8vIE9ubHkgQmFja1VwKCkgaWYgd2UncmUgc3VyZSB3ZSd2ZSBzdWNjZXNzZnVsbHkgY2FsbGVkIE5leHQoKSBhdCBsZWFzdAogICAgIC8vIG9uY2UuCi0gICAgaWYgKGJ1ZmZlcl9zaXplXyA+IDApIHsKKyAgICBpZiAoIWZhaWxlZF8gJiYgYnVmZmVyX3NpemVfID4gMCkgewogICAgICAgb3V0cHV0Xy0+QmFja1VwKGJ1ZmZlcl9zaXplXyk7CiAgICAgfQogICB9CkBAIC03MzQsMTAgKzExNTgsMTAgQEAKICAgfQogCiAgIC8vIFByaW50IHRleHQgdG8gdGhlIG91dHB1dCBzdHJlYW0uCi0gIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgaW50IHNpemUpIHsKLSAgICBpbnQgcG9zID0gMDsgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UndmUgd3JpdHRlbiBzbyBmYXIuCisgIHZvaWQgUHJpbnQoY29uc3QgY2hhciogdGV4dCwgc2l6ZV90IHNpemUpIHsKKyAgICBzaXplX3QgcG9zID0gMDsgIC8vIFRoZSBudW1iZXIgb2YgYnl0ZXMgd2UndmUgd3JpdHRlbiBzbyBmYXIuCiAKLSAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7IGkrKykgeworICAgIGZvciAoc2l6ZV90IGkgPSAwOyBpIDwgc2l6ZTsgaSsrKSB7CiAgICAgICBpZiAodGV4dFtpXSA9PSAnXG4nKSB7CiAgICAgICAgIC8vIFNhdyBuZXdsaW5lLiAgSWYgdGhlcmUgaXMgbW9yZSB0ZXh0LCB3ZSBtYXkgbmVlZCB0byBpbnNlcnQgYW4gaW5kZW50CiAgICAgICAgIC8vIGhlcmUuICBTbywgd3JpdGUgd2hhdCB3ZSBoYXZlIHNvIGZhciwgaW5jbHVkaW5nIHRoZSAnXG4nLgpAQCAtNzYyLDcgKzExODYsNyBAQAogIHByaXZhdGU6CiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhUZXh0R2VuZXJhdG9yKTsKIAotICB2b2lkIFdyaXRlKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplKSB7CisgIHZvaWQgV3JpdGUoY29uc3QgY2hhciogZGF0YSwgc2l6ZV90IHNpemUpIHsKICAgICBpZiAoZmFpbGVkXykgcmV0dXJuOwogICAgIGlmIChzaXplID09IDApIHJldHVybjsKIApAQCAtODA5LDcgKzEyMzMsMTQgQEAKIFRleHRGb3JtYXQ6OlBhcnNlcjo6UGFyc2VyKCkKICAgOiBlcnJvcl9jb2xsZWN0b3JfKE5VTEwpLAogICAgIGZpbmRlcl8oTlVMTCksCi0gICAgYWxsb3dfcGFydGlhbF8oZmFsc2UpIHsKKyAgICBwYXJzZV9pbmZvX3RyZWVfKE5VTEwpLAorICAgIGFsbG93X3BhcnRpYWxfKGZhbHNlKSwKKyAgICBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXyhmYWxzZSksCisgICAgYWxsb3dfdW5rbm93bl9maWVsZF8oZmFsc2UpLAorICAgIGFsbG93X3Vua25vd25fZW51bV8oZmFsc2UpLAorICAgIGFsbG93X2ZpZWxkX251bWJlcl8oZmFsc2UpLAorICAgIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZV8oZmFsc2UpLAorICAgIGFsbG93X3Npbmd1bGFyX292ZXJ3cml0ZXNfKGZhbHNlKSB7CiB9CiAKIFRleHRGb3JtYXQ6OlBhcnNlcjo6flBhcnNlcigpIHt9CkBAIC04MTcsOCArMTI0OCwxOCBAQAogYm9vbCBUZXh0Rm9ybWF0OjpQYXJzZXI6OlBhcnNlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBvdXRwdXQpIHsKICAgb3V0cHV0LT5DbGVhcigpOworCisgIFBhcnNlckltcGw6OlNpbmd1bGFyT3ZlcndyaXRlUG9saWN5IG92ZXJ3cml0ZXNfcG9saWN5ID0KKyAgICAgIGFsbG93X3Npbmd1bGFyX292ZXJ3cml0ZXNfCisgICAgICA/IFBhcnNlckltcGw6OkFMTE9XX1NJTkdVTEFSX09WRVJXUklURVMKKyAgICAgIDogUGFyc2VySW1wbDo6Rk9SQklEX1NJTkdVTEFSX09WRVJXUklURVM7CisKICAgUGFyc2VySW1wbCBwYXJzZXIob3V0cHV0LT5HZXREZXNjcmlwdG9yKCksIGlucHV0LCBlcnJvcl9jb2xsZWN0b3JfLAotICAgICAgICAgICAgICAgICAgICBmaW5kZXJfLCBQYXJzZXJJbXBsOjpGT1JCSURfU0lOR1VMQVJfT1ZFUldSSVRFUyk7CisgICAgICAgICAgICAgICAgICAgIGZpbmRlcl8sIHBhcnNlX2luZm9fdHJlZV8sCisgICAgICAgICAgICAgICAgICAgIG92ZXJ3cml0ZXNfcG9saWN5LAorICAgICAgICAgICAgICAgICAgICBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXywgYWxsb3dfdW5rbm93bl9maWVsZF8sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZW51bV8sIGFsbG93X2ZpZWxkX251bWJlcl8sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZV8pOwogICByZXR1cm4gTWVyZ2VVc2luZ0ltcGwoaW5wdXQsIG91dHB1dCwgJnBhcnNlcik7CiB9CiAKQEAgLTgzMSw3ICsxMjcyLDExIEBACiBib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2UoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCkgewogICBQYXJzZXJJbXBsIHBhcnNlcihvdXRwdXQtPkdldERlc2NyaXB0b3IoKSwgaW5wdXQsIGVycm9yX2NvbGxlY3Rvcl8sCi0gICAgICAgICAgICAgICAgICAgIGZpbmRlcl8sIFBhcnNlckltcGw6OkFMTE9XX1NJTkdVTEFSX09WRVJXUklURVMpOworICAgICAgICAgICAgICAgICAgICBmaW5kZXJfLCBwYXJzZV9pbmZvX3RyZWVfLAorICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsOjpBTExPV19TSU5HVUxBUl9PVkVSV1JJVEVTLAorICAgICAgICAgICAgICAgICAgICBhbGxvd19jYXNlX2luc2Vuc2l0aXZlX2ZpZWxkXywgYWxsb3dfdW5rbm93bl9maWVsZF8sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X3Vua25vd25fZW51bV8sIGFsbG93X2ZpZWxkX251bWJlcl8sCisgICAgICAgICAgICAgICAgICAgIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZV8pOwogICByZXR1cm4gTWVyZ2VVc2luZ0ltcGwoaW5wdXQsIG91dHB1dCwgJnBhcnNlcik7CiB9CiAKQEAgLTg0MSw3ICsxMjg2LDcgQEAKICAgcmV0dXJuIE1lcmdlKCZpbnB1dF9zdHJlYW0sIG91dHB1dCk7CiB9CiAKLWJvb2wgVGV4dEZvcm1hdDo6UGFyc2VyOjpNZXJnZVVzaW5nSW1wbChpbzo6WmVyb0NvcHlJbnB1dFN0cmVhbSogaW5wdXQsCitib29sIFRleHRGb3JtYXQ6OlBhcnNlcjo6TWVyZ2VVc2luZ0ltcGwoaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIC8qIGlucHV0ICovLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZXJJbXBsKiBwYXJzZXJfaW1wbCkgewogICBpZiAoIXBhcnNlcl9pbXBsLT5QYXJzZShvdXRwdXQpKSByZXR1cm4gZmFsc2U7CkBAIC04NDksNyArMTI5NCw3IEBACiAgICAgdmVjdG9yPHN0cmluZz4gbWlzc2luZ19maWVsZHM7CiAgICAgb3V0cHV0LT5GaW5kSW5pdGlhbGl6YXRpb25FcnJvcnMoJm1pc3NpbmdfZmllbGRzKTsKICAgICBwYXJzZXJfaW1wbC0+UmVwb3J0RXJyb3IoLTEsIDAsICJNZXNzYWdlIG1pc3NpbmcgcmVxdWlyZWQgZmllbGRzOiAiICsKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEpvaW5TdHJpbmdzKG1pc3NpbmdfZmllbGRzLCAiLCAiKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSm9pbihtaXNzaW5nX2ZpZWxkcywgIiwgIikpOwogICAgIHJldHVybiBmYWxzZTsKICAgfQogICByZXR1cm4gdHJ1ZTsKQEAgLTg2MSw3ICsxMzA2LDExIEBACiAgICAgTWVzc2FnZSogb3V0cHV0KSB7CiAgIGlvOjpBcnJheUlucHV0U3RyZWFtIGlucHV0X3N0cmVhbShpbnB1dC5kYXRhKCksIGlucHV0LnNpemUoKSk7CiAgIFBhcnNlckltcGwgcGFyc2VyKG91dHB1dC0+R2V0RGVzY3JpcHRvcigpLCAmaW5wdXRfc3RyZWFtLCBlcnJvcl9jb2xsZWN0b3JfLAotICAgICAgICAgICAgICAgICAgICBmaW5kZXJfLCBQYXJzZXJJbXBsOjpBTExPV19TSU5HVUxBUl9PVkVSV1JJVEVTKTsKKyAgICAgICAgICAgICAgICAgICAgZmluZGVyXywgcGFyc2VfaW5mb190cmVlXywKKyAgICAgICAgICAgICAgICAgICAgUGFyc2VySW1wbDo6QUxMT1dfU0lOR1VMQVJfT1ZFUldSSVRFUywKKyAgICAgICAgICAgICAgICAgICAgYWxsb3dfY2FzZV9pbnNlbnNpdGl2ZV9maWVsZF8sIGFsbG93X3Vua25vd25fZmllbGRfLAorICAgICAgICAgICAgICAgICAgICBhbGxvd191bmtub3duX2VudW1fLCBhbGxvd19maWVsZF9udW1iZXJfLAorICAgICAgICAgICAgICAgICAgICBhbGxvd19yZWxheGVkX3doaXRlc3BhY2VfKTsKICAgcmV0dXJuIHBhcnNlci5QYXJzZUZpZWxkKGZpZWxkLCBvdXRwdXQpOwogfQogCkBAIC04ODcsMTMgKzEzMzYsMTI4IEBACiAKIC8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCisvLyBUaGUgZGVmYXVsdCBpbXBsZW1lbnRhdGlvbiBmb3IgRmllbGRWYWx1ZVByaW50ZXIuIFRoZSBiYXNlIGNsYXNzIGp1c3QKKy8vIGRvZXMgc2ltcGxlIGZvcm1hdHRpbmcuIFRoYXQgd2F5LCBkZXJpdmluZyBjbGFzc2VzIGNvdWxkIGRlY2lkZSB0byBmYWxsYmFjaworLy8gdG8gdGhhdCBiZWhhdmlvci4KK1RleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpGaWVsZFZhbHVlUHJpbnRlcigpIHt9CitUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6fkZpZWxkVmFsdWVQcmludGVyKCkge30KK3N0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRCb29sKGJvb2wgdmFsKSBjb25zdCB7CisgIHJldHVybiB2YWwgPyAidHJ1ZSIgOiAiZmFsc2UiOworfQorc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEludDMyKGludDMyIHZhbCkgY29uc3QgeworICByZXR1cm4gU2ltcGxlSXRvYSh2YWwpOworfQorc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludFVJbnQzMih1aW50MzIgdmFsKSBjb25zdCB7CisgIHJldHVybiBTaW1wbGVJdG9hKHZhbCk7Cit9CitzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50SW50NjQoaW50NjQgdmFsKSBjb25zdCB7CisgIHJldHVybiBTaW1wbGVJdG9hKHZhbCk7Cit9CitzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50VUludDY0KHVpbnQ2NCB2YWwpIGNvbnN0IHsKKyAgcmV0dXJuIFNpbXBsZUl0b2EodmFsKTsKK30KK3N0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRGbG9hdChmbG9hdCB2YWwpIGNvbnN0IHsKKyAgcmV0dXJuIFNpbXBsZUZ0b2EodmFsKTsKK30KK3N0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnREb3VibGUoZG91YmxlIHZhbCkgY29uc3QgeworICByZXR1cm4gU2ltcGxlRHRvYSh2YWwpOworfQorc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludFN0cmluZyhjb25zdCBzdHJpbmcmIHZhbCkgY29uc3QgeworICBzdHJpbmcgcHJpbnRlZCgiXCIiKTsKKyAgQ0VzY2FwZUFuZEFwcGVuZCh2YWwsICZwcmludGVkKTsKKyAgcHJpbnRlZC5wdXNoX2JhY2soJ1wiJyk7CisgIHJldHVybiBwcmludGVkOworfQorc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEJ5dGVzKGNvbnN0IHN0cmluZyYgdmFsKSBjb25zdCB7CisgIHJldHVybiBQcmludFN0cmluZyh2YWwpOworfQorc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEVudW0oaW50MzIgdmFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc3RyaW5nJiBuYW1lKSBjb25zdCB7CisgIHJldHVybiBuYW1lOworfQorc3RyaW5nIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyOjpQcmludEZpZWxkTmFtZSgKKyAgICBjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24sCisgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCkgY29uc3QgeworICBpZiAoZmllbGQtPmlzX2V4dGVuc2lvbigpKSB7CisgICAgLy8gV2Ugc3BlY2lhbC1jYXNlIE1lc3NhZ2VTZXQgZWxlbWVudHMgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBwcm90bzEuCisgICAgaWYgKGZpZWxkLT5jb250YWluaW5nX3R5cGUoKS0+b3B0aW9ucygpLm1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0KCkKKyAgICAgICAgJiYgZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfTUVTU0FHRQorICAgICAgICAmJiBmaWVsZC0+aXNfb3B0aW9uYWwoKQorICAgICAgICAmJiBmaWVsZC0+ZXh0ZW5zaW9uX3Njb3BlKCkgPT0gZmllbGQtPm1lc3NhZ2VfdHlwZSgpKSB7CisgICAgICByZXR1cm4gU3RyQ2F0KCJbIiwgZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5mdWxsX25hbWUoKSwgIl0iKTsKKyAgICB9IGVsc2UgeworICAgICAgcmV0dXJuIFN0ckNhdCgiWyIsIGZpZWxkLT5mdWxsX25hbWUoKSwgIl0iKTsKKyAgICB9CisgIH0gZWxzZSBpZiAoZmllbGQtPnR5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfR1JPVVApIHsKKyAgICAvLyBHcm91cHMgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggdGhlaXIgb3JpZ2luYWwgY2FwaXRhbGl6YXRpb24uCisgICAgcmV0dXJuIGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+bmFtZSgpOworICB9IGVsc2UgeworICAgIHJldHVybiBmaWVsZC0+bmFtZSgpOworICB9Cit9CitzdHJpbmcgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50TWVzc2FnZVN0YXJ0KAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgaW50IGZpZWxkX2luZGV4LAorICAgIGludCBmaWVsZF9jb3VudCwKKyAgICBib29sIHNpbmdsZV9saW5lX21vZGUpIGNvbnN0IHsKKyAgcmV0dXJuIHNpbmdsZV9saW5lX21vZGUgPyAiIHsgIiA6ICIge1xuIjsKK30KK3N0cmluZyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRNZXNzYWdlRW5kKAorICAgIGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgaW50IGZpZWxkX2luZGV4LAorICAgIGludCBmaWVsZF9jb3VudCwKKyAgICBib29sIHNpbmdsZV9saW5lX21vZGUpIGNvbnN0IHsKKyAgcmV0dXJuIHNpbmdsZV9saW5lX21vZGUgPyAifSAiIDogIn1cbiI7Cit9CisKK25hbWVzcGFjZSB7CisvLyBPdXIgb3duIHNwZWNpYWxpemF0aW9uOiBmb3IgVVRGOCBlc2NhcGVkIHN0cmluZ3MuCitjbGFzcyBGaWVsZFZhbHVlUHJpbnRlclV0ZjhFc2NhcGluZyA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIHN0cmluZyBQcmludFN0cmluZyhjb25zdCBzdHJpbmcmIHZhbCkgY29uc3QgeworICAgIHJldHVybiBTdHJDYXQoIlwiIiwgc3RyaW5nczo6VXRmOFNhZmVDRXNjYXBlKHZhbCksICJcIiIpOworICB9CisgIHZpcnR1YWwgc3RyaW5nIFByaW50Qnl0ZXMoY29uc3Qgc3RyaW5nJiB2YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXI6OlByaW50U3RyaW5nKHZhbCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCiBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludGVyKCkKICAgOiBpbml0aWFsX2luZGVudF9sZXZlbF8oMCksCiAgICAgc2luZ2xlX2xpbmVfbW9kZV8oZmFsc2UpLAorICAgIHVzZV9maWVsZF9udW1iZXJfKGZhbHNlKSwKICAgICB1c2Vfc2hvcnRfcmVwZWF0ZWRfcHJpbWl0aXZlc18oZmFsc2UpLAotICAgIHV0Zjhfc3RyaW5nX2VzY2FwaW5nXyhmYWxzZSkge30KKyAgICBoaWRlX3Vua25vd25fZmllbGRzXyhmYWxzZSksCisgICAgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXJfKGZhbHNlKSwKKyAgICBleHBhbmRfYW55XyhmYWxzZSksCisgICAgdHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuXygwTEwpIHsKKyAgU2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKGZhbHNlKTsKK30KIAotVGV4dEZvcm1hdDo6UHJpbnRlcjo6flByaW50ZXIoKSB7fQorVGV4dEZvcm1hdDo6UHJpbnRlcjo6flByaW50ZXIoKSB7CisgIFNUTERlbGV0ZVZhbHVlcygmY3VzdG9tX3ByaW50ZXJzXyk7Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6U2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKGJvb2wgYXNfdXRmOCkgeworICBTZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIoYXNfdXRmOAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBuZXcgRmllbGRWYWx1ZVByaW50ZXJVdGY4RXNjYXBpbmcoKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBuZXcgRmllbGRWYWx1ZVByaW50ZXIoKSk7Cit9CisKK3ZvaWQgVGV4dEZvcm1hdDo6UHJpbnRlcjo6U2V0RGVmYXVsdEZpZWxkVmFsdWVQcmludGVyKAorICAgIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyKSB7CisgIGRlZmF1bHRfZmllbGRfdmFsdWVfcHJpbnRlcl8ucmVzZXQocHJpbnRlcik7Cit9CisKK2Jvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcigKKyAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKiBwcmludGVyKSB7CisgIHJldHVybiBmaWVsZCAhPSBOVUxMICYmIHByaW50ZXIgIT0gTlVMTCAmJgorICAgICAgICAgY3VzdG9tX3ByaW50ZXJzXy5pbnNlcnQoc3RkOjptYWtlX3BhaXIoZmllbGQsIHByaW50ZXIpKS5zZWNvbmQ7Cit9CiAKIGJvb2wgVGV4dEZvcm1hdDo6UHJpbnRlcjo6UHJpbnRUb1N0cmluZyhjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogb3V0cHV0KSBjb25zdCB7CkBAIC05MDIsOSArMTQ2Niw3IEBACiAgIG91dHB1dC0+Y2xlYXIoKTsKICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKG91dHB1dCk7CiAKLSAgYm9vbCByZXN1bHQgPSBQcmludChtZXNzYWdlLCAmb3V0cHV0X3N0cmVhbSk7Ci0KLSAgcmV0dXJuIHJlc3VsdDsKKyAgcmV0dXJuIFByaW50KG1lc3NhZ2UsICZvdXRwdXRfc3RyZWFtKTsKIH0KIAogYm9vbCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludFVua25vd25GaWVsZHNUb1N0cmluZygKQEAgLTkzOCwxNSArMTUwMCw4MiBAQAogICByZXR1cm4gIWdlbmVyYXRvci5mYWlsZWQoKTsKIH0KIAorbmFtZXNwYWNlIHsKKy8vIENvbXBhcmlzb24gZnVuY3RvciBmb3Igc29ydGluZyBGaWVsZERlc2NyaXB0b3JzIGJ5IGZpZWxkIGluZGV4Lgorc3RydWN0IEZpZWxkSW5kZXhTb3J0ZXIgeworICBib29sIG9wZXJhdG9yKCkoY29uc3QgRmllbGREZXNjcmlwdG9yKiBsZWZ0LAorICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiByaWdodCkgY29uc3QgeworICAgIHJldHVybiBsZWZ0LT5pbmRleCgpIDwgcmlnaHQtPmluZGV4KCk7CisgIH0KK307CisKK30gIC8vIG5hbWVzcGFjZQorCitib29sIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50QW55KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3QgeworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHR5cGVfdXJsX2ZpZWxkOworICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIHZhbHVlX2ZpZWxkOworICBpZiAoIWludGVybmFsOjpHZXRBbnlGaWVsZERlc2NyaXB0b3JzKG1lc3NhZ2UsICZ0eXBlX3VybF9maWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdmFsdWVfZmllbGQpKSB7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisKKyAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IG1lc3NhZ2UuR2V0UmVmbGVjdGlvbigpOworCisgIC8vIEV4dHJhY3QgdGhlIGZ1bGwgdHlwZSBuYW1lIGZyb20gdGhlIHR5cGVfdXJsIGZpZWxkLgorICBjb25zdCBzdHJpbmcmIHR5cGVfdXJsID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKG1lc3NhZ2UsIHR5cGVfdXJsX2ZpZWxkKTsKKyAgc3RyaW5nIGZ1bGxfdHlwZV9uYW1lOworICBpZiAoIWludGVybmFsOjpQYXJzZUFueVR5cGVVcmwodHlwZV91cmwsICZmdWxsX3R5cGVfbmFtZSkpIHsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKworICAvLyBQcmludCB0aGUgInZhbHVlIiBpbiB0ZXh0LgorICBjb25zdCBnb29nbGU6OnByb3RvYnVmOjpEZXNjcmlwdG9yKiB2YWx1ZV9kZXNjcmlwdG9yID0KKyAgICAgIG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5maWxlKCktPnBvb2woKS0+RmluZE1lc3NhZ2VUeXBlQnlOYW1lKAorICAgICAgICAgIGZ1bGxfdHlwZV9uYW1lKTsKKyAgaWYgKHZhbHVlX2Rlc2NyaXB0b3IgPT0gTlVMTCkgeworICAgIEdPT0dMRV9MT0coV0FSTklORykgPDwgIlByb3RvIHR5cGUgIiA8PCB0eXBlX3VybCA8PCAiIG5vdCBmb3VuZCI7CisgICAgcmV0dXJuIGZhbHNlOworICB9CisgIER5bmFtaWNNZXNzYWdlRmFjdG9yeSBmYWN0b3J5OworICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPGdvb2dsZTo6cHJvdG9idWY6Ok1lc3NhZ2U+IHZhbHVlX21lc3NhZ2UoCisgICAgICBmYWN0b3J5LkdldFByb3RvdHlwZSh2YWx1ZV9kZXNjcmlwdG9yKS0+TmV3KCkpOworICBzdHJpbmcgc2VyaWFsaXplZF92YWx1ZSA9IHJlZmxlY3Rpb24tPkdldFN0cmluZyhtZXNzYWdlLCB2YWx1ZV9maWVsZCk7CisgIGlmICghdmFsdWVfbWVzc2FnZS0+UGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWRfdmFsdWUpKSB7CisgICAgR09PR0xFX0xPRyhXQVJOSU5HKSA8PCB0eXBlX3VybCA8PCAiOiBmYWlsZWQgdG8gcGFyc2UgY29udGVudHMiOworICAgIHJldHVybiBmYWxzZTsKKyAgfQorICBnZW5lcmF0b3IuUHJpbnQoU3RyQ2F0KCJbIiwgdHlwZV91cmwsICJdIikpOworICBjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlciA9IEZpbmRXaXRoRGVmYXVsdCgKKyAgICAgIGN1c3RvbV9wcmludGVyc18sIHZhbHVlX2ZpZWxkLCBkZWZhdWx0X2ZpZWxkX3ZhbHVlX3ByaW50ZXJfLmdldCgpKTsKKyAgZ2VuZXJhdG9yLlByaW50KAorICAgICAgcHJpbnRlci0+UHJpbnRNZXNzYWdlU3RhcnQobWVzc2FnZSwgLTEsIDAsIHNpbmdsZV9saW5lX21vZGVfKSk7CisgIGdlbmVyYXRvci5JbmRlbnQoKTsKKyAgUHJpbnQoKnZhbHVlX21lc3NhZ2UsIGdlbmVyYXRvcik7CisgIGdlbmVyYXRvci5PdXRkZW50KCk7CisgIGdlbmVyYXRvci5QcmludChwcmludGVyLT5QcmludE1lc3NhZ2VFbmQobWVzc2FnZSwgLTEsIDAsIHNpbmdsZV9saW5lX21vZGVfKSk7CisgIHJldHVybiB0cnVlOworfQorCiB2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3QgeworICBjb25zdCBEZXNjcmlwdG9yKiBkZXNjcmlwdG9yID0gbWVzc2FnZS5HZXREZXNjcmlwdG9yKCk7CiAgIGNvbnN0IFJlZmxlY3Rpb24qIHJlZmxlY3Rpb24gPSBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKTsKKyAgaWYgKGRlc2NyaXB0b3ItPmZ1bGxfbmFtZSgpID09IGludGVybmFsOjprQW55RnVsbFR5cGVOYW1lICYmIGV4cGFuZF9hbnlfICYmCisgICAgICBQcmludEFueShtZXNzYWdlLCBnZW5lcmF0b3IpKSB7CisgICAgcmV0dXJuOworICB9CiAgIHZlY3Rvcjxjb25zdCBGaWVsZERlc2NyaXB0b3IqPiBmaWVsZHM7CiAgIHJlZmxlY3Rpb24tPkxpc3RGaWVsZHMobWVzc2FnZSwgJmZpZWxkcyk7CisgIGlmIChwcmludF9tZXNzYWdlX2ZpZWxkc19pbl9pbmRleF9vcmRlcl8pIHsKKyAgICBzdGQ6OnNvcnQoZmllbGRzLmJlZ2luKCksIGZpZWxkcy5lbmQoKSwgRmllbGRJbmRleFNvcnRlcigpKTsKKyAgfQogICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkcy5zaXplKCk7IGkrKykgewogICAgIFByaW50RmllbGQobWVzc2FnZSwgcmVmbGVjdGlvbiwgZmllbGRzW2ldLCBnZW5lcmF0b3IpOwogICB9Ci0gIFByaW50VW5rbm93bkZpZWxkcyhyZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpLCBnZW5lcmF0b3IpOworICBpZiAoIWhpZGVfdW5rbm93bl9maWVsZHNfKSB7CisgICAgUHJpbnRVbmtub3duRmllbGRzKHJlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSksIGdlbmVyYXRvcik7CisgIH0KIH0KIAogdm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludEZpZWxkVmFsdWVUb1N0cmluZygKQEAgLTk2NCw2ICsxNTkzLDU0IEBACiAgIFByaW50RmllbGRWYWx1ZShtZXNzYWdlLCBtZXNzYWdlLkdldFJlZmxlY3Rpb24oKSwgZmllbGQsIGluZGV4LCBnZW5lcmF0b3IpOwogfQogCitjbGFzcyBNYXBFbnRyeU1lc3NhZ2VDb21wYXJhdG9yIHsKKyBwdWJsaWM6CisgIGV4cGxpY2l0IE1hcEVudHJ5TWVzc2FnZUNvbXBhcmF0b3IoY29uc3QgRGVzY3JpcHRvciogZGVzY3JpcHRvcikKKyAgICAgIDogZmllbGRfKGRlc2NyaXB0b3ItPmZpZWxkKDApKSB7fQorCisgIGJvb2wgb3BlcmF0b3IoKShjb25zdCBNZXNzYWdlKiBhLCBjb25zdCBNZXNzYWdlKiBiKSB7CisgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiA9IGEtPkdldFJlZmxlY3Rpb24oKTsKKyAgICBzd2l0Y2ggKGZpZWxkXy0+Y3BwX3R5cGUoKSkgeworICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDogeworICAgICAgICAgIGJvb2wgZmlyc3QgPSByZWZsZWN0aW9uLT5HZXRCb29sKCphLCBmaWVsZF8pOworICAgICAgICAgIGJvb2wgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0Qm9vbCgqYiwgZmllbGRfKTsKKyAgICAgICAgICByZXR1cm4gZmlyc3QgPCBzZWNvbmQ7CisgICAgICB9CisgICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9JTlQzMjogeworICAgICAgICAgIGludDMyIGZpcnN0ID0gcmVmbGVjdGlvbi0+R2V0SW50MzIoKmEsIGZpZWxkXyk7CisgICAgICAgICAgaW50MzIgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0SW50MzIoKmIsIGZpZWxkXyk7CisgICAgICAgICAgcmV0dXJuIGZpcnN0IDwgc2Vjb25kOworICAgICAgfQorICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfSU5UNjQ6IHsKKyAgICAgICAgICBpbnQ2NCBmaXJzdCA9IHJlZmxlY3Rpb24tPkdldEludDY0KCphLCBmaWVsZF8pOworICAgICAgICAgIGludDY0IHNlY29uZCA9IHJlZmxlY3Rpb24tPkdldEludDY0KCpiLCBmaWVsZF8pOworICAgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQzMjogeworICAgICAgICAgIHVpbnQzMiBmaXJzdCA9IHJlZmxlY3Rpb24tPkdldFVJbnQzMigqYSwgZmllbGRfKTsKKyAgICAgICAgICB1aW50MzIgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0VUludDMyKCpiLCBmaWVsZF8pOworICAgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1VJTlQ2NDogeworICAgICAgICAgIHVpbnQ2NCBmaXJzdCA9IHJlZmxlY3Rpb24tPkdldFVJbnQ2NCgqYSwgZmllbGRfKTsKKyAgICAgICAgICB1aW50NjQgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0VUludDY0KCpiLCBmaWVsZF8pOworICAgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKKyAgICAgIH0KKyAgICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFX1NUUklORzogeworICAgICAgICAgIHN0cmluZyBmaXJzdCA9IHJlZmxlY3Rpb24tPkdldFN0cmluZygqYSwgZmllbGRfKTsKKyAgICAgICAgICBzdHJpbmcgc2Vjb25kID0gcmVmbGVjdGlvbi0+R2V0U3RyaW5nKCpiLCBmaWVsZF8pOworICAgICAgICAgIHJldHVybiBmaXJzdCA8IHNlY29uZDsKKyAgICAgIH0KKyAgICAgIGRlZmF1bHQ6CisgICAgICAgIEdPT0dMRV9MT0coREZBVEFMKSA8PCAiSW52YWxpZCBrZXkgZm9yIG1hcCBmaWVsZC4iOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgIH0KKworIHByaXZhdGU6CisgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGRfOworfTsKKwogdm9pZCBUZXh0Rm9ybWF0OjpQcmludGVyOjpQcmludEZpZWxkKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLApAQCAtOTg0LDM2ICsxNjYxLDQ4IEBACiAgICAgY291bnQgPSAxOwogICB9CiAKKyAgc3RkOjp2ZWN0b3I8Y29uc3QgTWVzc2FnZSo+IHNvcnRlZF9tYXBfZmllbGQ7CisgIGlmIChmaWVsZC0+aXNfbWFwKCkpIHsKKyAgICBjb25zdCBSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+JiBtYXBfZmllbGQgPQorICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFB0ckZpZWxkPE1lc3NhZ2U+KG1lc3NhZ2UsIGZpZWxkKTsKKyAgICBmb3IgKFJlcGVhdGVkUHRyRmllbGQ8TWVzc2FnZT46OmNvbnN0X3BvaW50ZXJfaXRlcmF0b3IgaXQgPQorICAgICAgICAgICAgIG1hcF9maWVsZC5wb2ludGVyX2JlZ2luKCk7CisgICAgICAgICBpdCAhPSBtYXBfZmllbGQucG9pbnRlcl9lbmQoKTsgKytpdCkgeworICAgICAgc29ydGVkX21hcF9maWVsZC5wdXNoX2JhY2soKml0KTsKKyAgICB9CisKKyAgICBNYXBFbnRyeU1lc3NhZ2VDb21wYXJhdG9yIGNvbXBhcmF0b3IoZmllbGQtPm1lc3NhZ2VfdHlwZSgpKTsKKyAgICBzdGQ6OnN0YWJsZV9zb3J0KHNvcnRlZF9tYXBfZmllbGQuYmVnaW4oKSwgc29ydGVkX21hcF9maWVsZC5lbmQoKSwKKyAgICAgICAgICAgICAgICAgICAgIGNvbXBhcmF0b3IpOworICB9CisKICAgZm9yIChpbnQgaiA9IDA7IGogPCBjb3VudDsgKytqKSB7CisgICAgY29uc3QgaW50IGZpZWxkX2luZGV4ID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPyBqIDogLTE7CisKICAgICBQcmludEZpZWxkTmFtZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZ2VuZXJhdG9yKTsKIAogICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7Ci0gICAgICAgIGdlbmVyYXRvci5QcmludCgiIHsgIik7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIiB7XG4iKTsKLSAgICAgICAgZ2VuZXJhdG9yLkluZGVudCgpOwotICAgICAgfQorICAgICAgY29uc3QgRmllbGRWYWx1ZVByaW50ZXIqIHByaW50ZXIgPSBGaW5kV2l0aERlZmF1bHQoCisgICAgICAgICAgY3VzdG9tX3ByaW50ZXJzXywgZmllbGQsIGRlZmF1bHRfZmllbGRfdmFsdWVfcHJpbnRlcl8uZ2V0KCkpOworICAgICAgY29uc3QgTWVzc2FnZSYgc3ViX21lc3NhZ2UgPQorICAgICAgICAgIGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICAgID8gKGZpZWxkLT5pc19tYXAoKQorICAgICAgICAgICAgICAgICAgICAgPyAqc29ydGVkX21hcF9maWVsZFtqXQorICAgICAgICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZE1lc3NhZ2UobWVzc2FnZSwgZmllbGQsIGopKQorICAgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpOworICAgICAgZ2VuZXJhdG9yLlByaW50KAorICAgICAgICAgIHByaW50ZXItPlByaW50TWVzc2FnZVN0YXJ0KAorICAgICAgICAgICAgICBzdWJfbWVzc2FnZSwgZmllbGRfaW5kZXgsIGNvdW50LCBzaW5nbGVfbGluZV9tb2RlXykpOworICAgICAgZ2VuZXJhdG9yLkluZGVudCgpOworICAgICAgUHJpbnQoc3ViX21lc3NhZ2UsIGdlbmVyYXRvcik7CisgICAgICBnZW5lcmF0b3IuT3V0ZGVudCgpOworICAgICAgZ2VuZXJhdG9yLlByaW50KAorICAgICAgICAgIHByaW50ZXItPlByaW50TWVzc2FnZUVuZCgKKyAgICAgICAgICAgICAgc3ViX21lc3NhZ2UsIGZpZWxkX2luZGV4LCBjb3VudCwgc2luZ2xlX2xpbmVfbW9kZV8pKTsKICAgICB9IGVsc2UgewogICAgICAgZ2VuZXJhdG9yLlByaW50KCI6ICIpOwotICAgIH0KLQotICAgIC8vIFdyaXRlIHRoZSBmaWVsZCB2YWx1ZS4KLSAgICBpbnQgZmllbGRfaW5kZXggPSBqOwotICAgIGlmICghZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKLSAgICAgIGZpZWxkX2luZGV4ID0gLTE7Ci0gICAgfQotCi0gICAgUHJpbnRGaWVsZFZhbHVlKG1lc3NhZ2UsIHJlZmxlY3Rpb24sIGZpZWxkLCBmaWVsZF9pbmRleCwgZ2VuZXJhdG9yKTsKLQotICAgIGlmIChmaWVsZC0+Y3BwX3R5cGUoKSA9PSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRSkgewotICAgICAgaWYgKHNpbmdsZV9saW5lX21vZGVfKSB7Ci0gICAgICAgIGdlbmVyYXRvci5QcmludCgifSAiKTsKLSAgICAgIH0gZWxzZSB7Ci0gICAgICAgIGdlbmVyYXRvci5PdXRkZW50KCk7Ci0gICAgICAgIGdlbmVyYXRvci5QcmludCgifVxuIik7Ci0gICAgICB9Ci0gICAgfSBlbHNlIHsKKyAgICAgIC8vIFdyaXRlIHRoZSBmaWVsZCB2YWx1ZS4KKyAgICAgIFByaW50RmllbGRWYWx1ZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCwgZmllbGRfaW5kZXgsIGdlbmVyYXRvcik7CiAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKICAgICAgICAgZ2VuZXJhdG9yLlByaW50KCIgIik7CiAgICAgICB9IGVsc2UgewpAQCAtMTA0OCwyNiArMTczNywxNiBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBSZWZsZWN0aW9uKiByZWZsZWN0aW9uLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUZXh0R2VuZXJhdG9yJiBnZW5lcmF0b3IpIGNvbnN0IHsKLSAgaWYgKGZpZWxkLT5pc19leHRlbnNpb24oKSkgewotICAgIGdlbmVyYXRvci5QcmludCgiWyIpOwotICAgIC8vIFdlIHNwZWNpYWwtY2FzZSBNZXNzYWdlU2V0IGVsZW1lbnRzIGZvciBjb21wYXRpYmlsaXR5IHdpdGggcHJvdG8xLgotICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ190eXBlKCktPm9wdGlvbnMoKS5tZXNzYWdlX3NldF93aXJlX2Zvcm1hdCgpCi0gICAgICAgICYmIGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UKLSAgICAgICAgJiYgZmllbGQtPmlzX29wdGlvbmFsKCkKLSAgICAgICAgJiYgZmllbGQtPmV4dGVuc2lvbl9zY29wZSgpID09IGZpZWxkLT5tZXNzYWdlX3R5cGUoKSkgewotICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkLT5tZXNzYWdlX3R5cGUoKS0+ZnVsbF9uYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQtPmZ1bGxfbmFtZSgpKTsKLSAgICB9Ci0gICAgZ2VuZXJhdG9yLlByaW50KCJdIik7Ci0gIH0gZWxzZSB7Ci0gICAgaWYgKGZpZWxkLT50eXBlKCkgPT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX0dST1VQKSB7Ci0gICAgICAvLyBHcm91cHMgbXVzdCBiZSBzZXJpYWxpemVkIHdpdGggdGhlaXIgb3JpZ2luYWwgY2FwaXRhbGl6YXRpb24uCi0gICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQtPm1lc3NhZ2VfdHlwZSgpLT5uYW1lKCkpOwotICAgIH0gZWxzZSB7Ci0gICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQtPm5hbWUoKSk7Ci0gICAgfQorICAvLyBpZiB1c2VfZmllbGRfbnVtYmVyXyBpcyB0cnVlLCBwcmludHMgZmllbGQgbnVtYmVyIGluc3RlYWQKKyAgLy8gb2YgZmllbGQgbmFtZS4KKyAgaWYgKHVzZV9maWVsZF9udW1iZXJfKSB7CisgICAgZ2VuZXJhdG9yLlByaW50KFNpbXBsZUl0b2EoZmllbGQtPm51bWJlcigpKSk7CisgICAgcmV0dXJuOwogICB9CisKKyAgY29uc3QgRmllbGRWYWx1ZVByaW50ZXIqIHByaW50ZXIgPSBGaW5kV2l0aERlZmF1bHQoCisgICAgICBjdXN0b21fcHJpbnRlcnNfLCBmaWVsZCwgZGVmYXVsdF9maWVsZF92YWx1ZV9wcmludGVyXy5nZXQoKSk7CisgIGdlbmVyYXRvci5QcmludChwcmludGVyLT5QcmludEZpZWxkTmFtZShtZXNzYWdlLCByZWZsZWN0aW9uLCBmaWVsZCkpOwogfQogCiB2b2lkIFRleHRGb3JtYXQ6OlByaW50ZXI6OlByaW50RmllbGRWYWx1ZSgKQEAgLTEwNzksNjIgKzE3NTgsNzcgQEAKICAgR09PR0xFX0RDSEVDSyhmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fCAoaW5kZXggPT0gLTEpKQogICAgICAgPDwgIkluZGV4IG11c3QgYmUgLTEgZm9yIG5vbi1yZXBlYXRlZCBmaWVsZHMiOwogCi0gIHN3aXRjaCAoZmllbGQtPmNwcF90eXBlKCkpIHsKLSNkZWZpbmUgT1VUUFVUX0ZJRUxEKENQUFRZUEUsIE1FVEhPRCwgVE9fU1RSSU5HKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfIyNDUFBUWVBFOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGdlbmVyYXRvci5QcmludChUT19TVFJJTkcoZmllbGQtPmlzX3JlcGVhdGVkKCkgPyAgICAgICAgICAgICAgICAgICAgIFwKLSAgICAgICAgICByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkgOiAgICAgICAgICAgXAotICAgICAgICAgIHJlZmxlY3Rpb24tPkdldCMjTUVUSE9EKG1lc3NhZ2UsIGZpZWxkKSkpOyAgICAgICAgICAgICAgICAgICAgICAgICBcCi0gICAgICAgIGJyZWFrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgY29uc3QgRmllbGRWYWx1ZVByaW50ZXIqIHByaW50ZXIKKyAgICAgID0gRmluZFdpdGhEZWZhdWx0KGN1c3RvbV9wcmludGVyc18sIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdF9maWVsZF92YWx1ZV9wcmludGVyXy5nZXQoKSk7CiAKLSAgICAgIE9VVFBVVF9GSUVMRCggSU5UMzIsICBJbnQzMiwgU2ltcGxlSXRvYSk7Ci0gICAgICBPVVRQVVRfRklFTEQoIElOVDY0LCAgSW50NjQsIFNpbXBsZUl0b2EpOwotICAgICAgT1VUUFVUX0ZJRUxEKFVJTlQzMiwgVUludDMyLCBTaW1wbGVJdG9hKTsKLSAgICAgIE9VVFBVVF9GSUVMRChVSU5UNjQsIFVJbnQ2NCwgU2ltcGxlSXRvYSk7Ci0gICAgICBPVVRQVVRfRklFTEQoIEZMT0FULCAgRmxvYXQsIFNpbXBsZUZ0b2EpOwotICAgICAgT1VUUFVUX0ZJRUxEKERPVUJMRSwgRG91YmxlLCBTaW1wbGVEdG9hKTsKKyAgc3dpdGNoIChmaWVsZC0+Y3BwX3R5cGUoKSkgeworI2RlZmluZSBPVVRQVVRfRklFTEQoQ1BQVFlQRSwgTUVUSE9EKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgRmllbGREZXNjcmlwdG9yOjpDUFBUWVBFXyMjQ1BQVFlQRTogICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgZ2VuZXJhdG9yLlByaW50KHByaW50ZXItPlByaW50IyNNRVRIT0QoZmllbGQtPmlzX3JlcGVhdGVkKCkgICAgICAgXAorICAgICAgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZCMjTUVUSE9EKG1lc3NhZ2UsIGZpZWxkLCBpbmRleCkgXAorICAgICAgICAgICAgICAgOiByZWZsZWN0aW9uLT5HZXQjI01FVEhPRChtZXNzYWdlLCBmaWVsZCkpKTsgICAgICAgICAgICAgXAorICAgICAgICBicmVhaworCisgICAgT1VUUFVUX0ZJRUxEKCBJTlQzMiwgIEludDMyKTsKKyAgICBPVVRQVVRfRklFTEQoIElOVDY0LCAgSW50NjQpOworICAgIE9VVFBVVF9GSUVMRChVSU5UMzIsIFVJbnQzMik7CisgICAgT1VUUFVUX0ZJRUxEKFVJTlQ2NCwgVUludDY0KTsKKyAgICBPVVRQVVRfRklFTEQoIEZMT0FULCAgRmxvYXQpOworICAgIE9VVFBVVF9GSUVMRChET1VCTEUsIERvdWJsZSk7CisgICAgT1VUUFVUX0ZJRUxEKCAgQk9PTCwgICBCb29sKTsKICN1bmRlZiBPVVRQVVRfRklFTEQKIAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfU1RSSU5HOiB7Ci0gICAgICAgIHN0cmluZyBzY3JhdGNoOwotICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlID0gZmllbGQtPmlzX3JlcGVhdGVkKCkgPwotICAgICAgICAgICAgcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRTdHJpbmdSZWZlcmVuY2UoCi0gICAgICAgICAgICAgIG1lc3NhZ2UsIGZpZWxkLCBpbmRleCwgJnNjcmF0Y2gpIDoKLSAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOwotCi0gICAgICAgIGdlbmVyYXRvci5QcmludCgiXCIiKTsKLSAgICAgICAgaWYgKHV0Zjhfc3RyaW5nX2VzY2FwaW5nXykgewotICAgICAgICAgIGdlbmVyYXRvci5QcmludChzdHJpbmdzOjpVdGY4U2FmZUNFc2NhcGUodmFsdWUpKTsKLSAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoQ0VzY2FwZSh2YWx1ZSkpOwotICAgICAgICB9Ci0gICAgICAgIGdlbmVyYXRvci5QcmludCgiXCIiKTsKLQotICAgICAgICBicmVhazsKKyAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9TVFJJTkc6IHsKKyAgICAgIHN0cmluZyBzY3JhdGNoOworICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSA9IGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgPyByZWZsZWN0aW9uLT5HZXRSZXBlYXRlZFN0cmluZ1JlZmVyZW5jZSgKKyAgICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGluZGV4LCAmc2NyYXRjaCkKKyAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldFN0cmluZ1JlZmVyZW5jZShtZXNzYWdlLCBmaWVsZCwgJnNjcmF0Y2gpOworICAgICAgY29uc3Qgc3RyaW5nKiB2YWx1ZV90b19wcmludCA9ICZ2YWx1ZTsKKyAgICAgIHN0cmluZyB0cnVuY2F0ZWRfdmFsdWU7CisgICAgICBpZiAodHJ1bmNhdGVfc3RyaW5nX2ZpZWxkX2xvbmdlcl90aGFuXyA+IDAgJiYKKyAgICAgICAgICB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fIDwgdmFsdWUuc2l6ZSgpKSB7CisgICAgICAgIHRydW5jYXRlZF92YWx1ZSA9IHZhbHVlLnN1YnN0cigwLCB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICIuLi48dHJ1bmNhdGVkPi4uLiI7CisgICAgICAgIHZhbHVlX3RvX3ByaW50ID0gJnRydW5jYXRlZF92YWx1ZTsKICAgICAgIH0KKyAgICAgIGlmIChmaWVsZC0+dHlwZSgpID09IEZpZWxkRGVzY3JpcHRvcjo6VFlQRV9TVFJJTkcpIHsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KHByaW50ZXItPlByaW50U3RyaW5nKCp2YWx1ZV90b19wcmludCkpOworICAgICAgfSBlbHNlIHsKKyAgICAgICAgR09PR0xFX0RDSEVDS19FUShmaWVsZC0+dHlwZSgpLCBGaWVsZERlc2NyaXB0b3I6OlRZUEVfQllURVMpOworICAgICAgICBnZW5lcmF0b3IuUHJpbnQocHJpbnRlci0+UHJpbnRCeXRlcygqdmFsdWVfdG9fcHJpbnQpKTsKKyAgICAgIH0KKyAgICAgIGJyZWFrOworICAgIH0KIAotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfQk9PTDoKLSAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkQm9vbChtZXNzYWdlLCBmaWVsZCwgaW5kZXgpCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgZ2VuZXJhdG9yLlByaW50KHJlZmxlY3Rpb24tPkdldEJvb2wobWVzc2FnZSwgZmllbGQpCi0gICAgICAgICAgICAgICAgICAgICAgICAgID8gInRydWUiIDogImZhbHNlIik7Ci0gICAgICAgIH0KLSAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfRU5VTTogeworICAgICAgaW50IGVudW1fdmFsdWUgPSBmaWVsZC0+aXNfcmVwZWF0ZWQoKQorICAgICAgICAgID8gcmVmbGVjdGlvbi0+R2V0UmVwZWF0ZWRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIGluZGV4KQorICAgICAgICAgIDogcmVmbGVjdGlvbi0+R2V0RW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkKTsKKyAgICAgIGNvbnN0IEVudW1WYWx1ZURlc2NyaXB0b3IqIGVudW1fZGVzYyA9CisgICAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcihlbnVtX3ZhbHVlKTsKKyAgICAgIGlmIChlbnVtX2Rlc2MgIT0gTlVMTCkgeworICAgICAgICBnZW5lcmF0b3IuUHJpbnQocHJpbnRlci0+UHJpbnRFbnVtKGVudW1fdmFsdWUsIGVudW1fZGVzYy0+bmFtZSgpKSk7CisgICAgICB9IGVsc2UgeworICAgICAgICAvLyBPcmRpbmFyaWx5LCBlbnVtX2Rlc2Mgc2hvdWxkIG5vdCBiZSBudWxsLCBiZWNhdXNlIHByb3RvMiBoYXMgdGhlCisgICAgICAgIC8vIGludmFyaWFudCB0aGF0IHNldCBlbnVtIGZpZWxkIHZhbHVlcyBtdXN0IGJlIGluLXJhbmdlLCBidXQgd2l0aCB0aGUKKyAgICAgICAgLy8gbmV3IGludGVnZXItYmFzZWQgQVBJIGZvciBlbnVtcyAob3IgdGhlIFJlcGVhdGVkRmllbGQ8aW50PiBsb29waG9sZSksCisgICAgICAgIC8vIGl0IGlzIHBvc3NpYmxlIGZvciB0aGUgdXNlciB0byBmb3JjZSBhbiB1bmtub3duIGludGVnZXIgdmFsdWUuICBTbyB3ZQorICAgICAgICAvLyBzaW1wbHkgdXNlIHRoZSBpbnRlZ2VyIHZhbHVlIGl0c2VsZiBhcyB0aGUgZW51bSB2YWx1ZSBuYW1lIGluIHRoaXMKKyAgICAgICAgLy8gY2FzZS4KKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KHByaW50ZXItPlByaW50RW51bShlbnVtX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0cmluZ1ByaW50ZigiJWQiLCBlbnVtX3ZhbHVlKSkpOworICAgICAgfQorICAgICAgYnJlYWs7CisgICAgfQogCi0gICAgICBjYXNlIEZpZWxkRGVzY3JpcHRvcjo6Q1BQVFlQRV9FTlVNOgotICAgICAgICBnZW5lcmF0b3IuUHJpbnQoZmllbGQtPmlzX3JlcGVhdGVkKCkgPwotICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkRW51bShtZXNzYWdlLCBmaWVsZCwgaW5kZXgpLT5uYW1lKCkgOgotICAgICAgICAgIHJlZmxlY3Rpb24tPkdldEVudW0obWVzc2FnZSwgZmllbGQpLT5uYW1lKCkpOwotICAgICAgICBicmVhazsKLQotICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKLSAgICAgICAgUHJpbnQoZmllbGQtPmlzX3JlcGVhdGVkKCkgPwotICAgICAgICAgICAgICAgIHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaW5kZXgpIDoKLSAgICAgICAgICAgICAgICByZWZsZWN0aW9uLT5HZXRNZXNzYWdlKG1lc3NhZ2UsIGZpZWxkKSwKLSAgICAgICAgICAgICAgZ2VuZXJhdG9yKTsKLSAgICAgICAgYnJlYWs7CisgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OkNQUFRZUEVfTUVTU0FHRToKKyAgICAgIFByaW50KGZpZWxkLT5pc19yZXBlYXRlZCgpCisgICAgICAgICAgICA/IHJlZmxlY3Rpb24tPkdldFJlcGVhdGVkTWVzc2FnZShtZXNzYWdlLCBmaWVsZCwgaW5kZXgpCisgICAgICAgICAgICA6IHJlZmxlY3Rpb24tPkdldE1lc3NhZ2UobWVzc2FnZSwgZmllbGQpLAorICAgICAgICAgICAgZ2VuZXJhdG9yKTsKKyAgICAgIGJyZWFrOwogICB9CiB9CiAKQEAgLTEyMDYsOCArMTkwMCw4IEBACiAgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOiB7CiAgICAgICAgIGdlbmVyYXRvci5QcmludChmaWVsZF9udW1iZXIpOwogICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIjogMHgiKTsKLSAgICAgICAgY2hhciBidWZmZXJba0Zhc3RUb0J1ZmZlclNpemVdOwotICAgICAgICBnZW5lcmF0b3IuUHJpbnQoRmFzdEhleDMyVG9CdWZmZXIoZmllbGQuZml4ZWQzMigpLCBidWZmZXIpKTsKKyAgICAgICAgZ2VuZXJhdG9yLlByaW50KAorICAgICAgICAgICAgU3RyQ2F0KHN0cmluZ3M6OkhleChmaWVsZC5maXhlZDMyKCksIHN0cmluZ3M6OlpFUk9fUEFEXzgpKSk7CiAgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgewogICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiICIpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTIxOCw4ICsxOTEyLDggQEAKICAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQ6IHsKICAgICAgICAgZ2VuZXJhdG9yLlByaW50KGZpZWxkX251bWJlcik7CiAgICAgICAgIGdlbmVyYXRvci5QcmludCgiOiAweCIpOwotICAgICAgICBjaGFyIGJ1ZmZlcltrRmFzdFRvQnVmZmVyU2l6ZV07Ci0gICAgICAgIGdlbmVyYXRvci5QcmludChGYXN0SGV4NjRUb0J1ZmZlcihmaWVsZC5maXhlZDY0KCksIGJ1ZmZlcikpOworICAgICAgICBnZW5lcmF0b3IuUHJpbnQoCisgICAgICAgICAgICBTdHJDYXQoc3RyaW5nczo6SGV4KGZpZWxkLmZpeGVkNjQoKSwgc3RyaW5nczo6WkVST19QQURfMTYpKSk7CiAgICAgICAgIGlmIChzaW5nbGVfbGluZV9tb2RlXykgewogICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiICIpOwogICAgICAgICB9IGVsc2UgewpAQCAtMTI1MCwxNCArMTk0NCwxMCBAQAogICAgICAgICB9IGVsc2UgewogICAgICAgICAgIC8vIFRoaXMgZmllbGQgaXMgbm90IHBhcnNlYWJsZSBhcyBhIE1lc3NhZ2UuCiAgICAgICAgICAgLy8gU28gaXQgaXMgcHJvYmFibHkganVzdCBhIHBsYWluIHN0cmluZy4KLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIjogXCIiKTsKLSAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoQ0VzY2FwZSh2YWx1ZSkpOwotICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiXCIiKTsKLSAgICAgICAgICBpZiAoc2luZ2xlX2xpbmVfbW9kZV8pIHsKLSAgICAgICAgICAgIGdlbmVyYXRvci5QcmludCgiICIpOwotICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICBnZW5lcmF0b3IuUHJpbnQoIlxuIik7Ci0gICAgICAgICAgfQorICAgICAgICAgIHN0cmluZyBwcmludGVkKCI6IFwiIik7CisgICAgICAgICAgQ0VzY2FwZUFuZEFwcGVuZCh2YWx1ZSwgJnByaW50ZWQpOworICAgICAgICAgIHByaW50ZWQuYXBwZW5kKHNpbmdsZV9saW5lX21vZGVfID8gIlwiICIgOiAiXCJcbiIpOworICAgICAgICAgIGdlbmVyYXRvci5QcmludChwcmludGVkKTsKICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90ZXh0X2Zvcm1hdC5oCmluZGV4IDAzYzA0OTEuLmVmM2Q0YTggMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0LmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzgsOSArMzgsMTcgQEAKICNpZm5kZWYgR09PR0xFX1BST1RPQlVGX1RFWFRfRk9STUFUX0hfXwogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfVEVYVF9GT1JNQVRfSF9fCiAKKyNpbmNsdWRlIDxtYXA+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgogI2luY2x1ZGUgPHN0cmluZz4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKworI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9tZXNzYWdlLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTgyLDYgKzkwLDQxIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBpbmRleCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiBvdXRwdXQpOwogCisgIC8vIFRoZSBkZWZhdWx0IHByaW50ZXIgdGhhdCBjb252ZXJ0cyBzY2FsYXIgdmFsdWVzIGZyb20gZmllbGRzIGludG8KKyAgLy8gdGhlaXIgc3RyaW5nIHJlcHJlc2VudGF0aW9uLgorICAvLyBZb3UgY2FuIGRlcml2ZSBmcm9tIHRoaXMgRmllbGRWYWx1ZVByaW50ZXIgaWYgeW91IHdhbnQgdG8gaGF2ZQorICAvLyBmaWVsZHMgdG8gYmUgcHJpbnRlZCBpbiBhIGRpZmZlcmVudCB3YXkgYW5kIHJlZ2lzdGVyIGl0IGF0IHRoZQorICAvLyBQcmludGVyLgorICBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmllbGRWYWx1ZVByaW50ZXIgeworICAgcHVibGljOgorICAgIEZpZWxkVmFsdWVQcmludGVyKCk7CisgICAgdmlydHVhbCB+RmllbGRWYWx1ZVByaW50ZXIoKTsKKyAgICB2aXJ0dWFsIHN0cmluZyBQcmludEJvb2woYm9vbCB2YWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nIFByaW50SW50MzIoaW50MzIgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBQcmludFVJbnQzMih1aW50MzIgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBQcmludEludDY0KGludDY0IHZhbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdHJpbmcgUHJpbnRVSW50NjQodWludDY0IHZhbCkgY29uc3Q7CisgICAgdmlydHVhbCBzdHJpbmcgUHJpbnRGbG9hdChmbG9hdCB2YWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nIFByaW50RG91YmxlKGRvdWJsZSB2YWwpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nIFByaW50U3RyaW5nKGNvbnN0IHN0cmluZyYgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBQcmludEJ5dGVzKGNvbnN0IHN0cmluZyYgdmFsKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBQcmludEVudW0oaW50MzIgdmFsLCBjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0OworICAgIHZpcnR1YWwgc3RyaW5nIFByaW50RmllbGROYW1lKGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgUmVmbGVjdGlvbiogcmVmbGVjdGlvbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBQcmludE1lc3NhZ2VTdGFydChjb25zdCBNZXNzYWdlJiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlKSBjb25zdDsKKyAgICB2aXJ0dWFsIHN0cmluZyBQcmludE1lc3NhZ2VFbmQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgY29uc3Q7CisKKyAgIHByaXZhdGU6CisgICAgR09PR0xFX0RJU0FMTE9XX0VWSUxfQ09OU1RSVUNUT1JTKEZpZWxkVmFsdWVQcmludGVyKTsKKyAgfTsKKwogICAvLyBDbGFzcyBmb3IgdGhvc2UgdXNlcnMgd2hpY2ggcmVxdWlyZSBtb3JlIGZpbmUtZ3JhaW5lZCBjb250cm9sIG92ZXIgaG93CiAgIC8vIGEgcHJvdG9idWZmZXIgbWVzc2FnZSBpcyBwcmludGVkIG91dC4KICAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFByaW50ZXIgewpAQCAtMTE3LDYgKzE2MCwxNSBAQAogICAgICAgc2luZ2xlX2xpbmVfbW9kZV8gPSBzaW5nbGVfbGluZV9tb2RlOwogICAgIH0KIAorICAgIGJvb2wgSXNJblNpbmdsZUxpbmVNb2RlKCkgeworICAgICAgcmV0dXJuIHNpbmdsZV9saW5lX21vZGVfOworICAgIH0KKworICAgIC8vIElmIHVzZV9maWVsZF9udW1iZXIgaXMgdHJ1ZSwgdXNlcyBmaWVsZCBudW1iZXIgaW5zdGVhZCBvZiBmaWVsZCBuYW1lLgorICAgIHZvaWQgU2V0VXNlRmllbGROdW1iZXIoYm9vbCB1c2VfZmllbGRfbnVtYmVyKSB7CisgICAgICB1c2VfZmllbGRfbnVtYmVyXyA9IHVzZV9maWVsZF9udW1iZXI7CisgICAgfQorCiAgICAgLy8gU2V0IHRydWUgdG8gcHJpbnQgcmVwZWF0ZWQgcHJpbWl0aXZlcyBpbiBhIGZvcm1hdCBsaWtlOgogICAgIC8vICAgZmllbGRfbmFtZTogWzEsIDIsIDMsIDRdCiAgICAgLy8gaW5zdGVhZCBvZiBwcmludGluZyBlYWNoIHZhbHVlIG9uIGl0cyBvd24gbGluZS4gIFNob3J0IGZvcm1hdCBhcHBsaWVzCkBAIC0xMjksMTEgKzE4MSw2NCBAQAogICAgIC8vIFNldCB0cnVlIHRvIG91dHB1dCBVVEYtOCBpbnN0ZWFkIG9mIEFTQ0lJLiAgVGhlIG9ubHkgZGlmZmVyZW5jZQogICAgIC8vIGlzIHRoYXQgYnl0ZXMgPj0gMHg4MCBpbiBzdHJpbmcgZmllbGRzIHdpbGwgbm90IGJlIGVzY2FwZWQsCiAgICAgLy8gYmVjYXVzZSB0aGV5IGFyZSBhc3N1bWVkIHRvIGJlIHBhcnQgb2YgVVRGLTggbXVsdGktYnl0ZQotICAgIC8vIHNlcXVlbmNlcy4KLSAgICB2b2lkIFNldFVzZVV0ZjhTdHJpbmdFc2NhcGluZyhib29sIGFzX3V0ZjgpIHsKLSAgICAgIHV0Zjhfc3RyaW5nX2VzY2FwaW5nXyA9IGFzX3V0Zjg7CisgICAgLy8gc2VxdWVuY2VzLiBUaGlzIHdpbGwgY2hhbmdlIHRoZSBkZWZhdWx0IEZpZWxkVmFsdWVQcmludGVyLgorICAgIHZvaWQgU2V0VXNlVXRmOFN0cmluZ0VzY2FwaW5nKGJvb2wgYXNfdXRmOCk7CisKKyAgICAvLyBTZXQgdGhlIGRlZmF1bHQgRmllbGRWYWx1ZVByaW50ZXIgdGhhdCBpcyB1c2VkIGZvciBhbGwgZmllbGRzIHRoYXQKKyAgICAvLyBkb24ndCBoYXZlIGEgZmllbGQtc3BlY2lmaWMgcHJpbnRlciByZWdpc3RlcmVkLgorICAgIC8vIFRha2VzIG93bmVyc2hpcCBvZiB0aGUgcHJpbnRlci4KKyAgICB2b2lkIFNldERlZmF1bHRGaWVsZFZhbHVlUHJpbnRlcihjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcik7CisKKyAgICAvLyBTZXRzIHdoZXRoZXIgd2Ugd2FudCB0byBoaWRlIHVua25vd24gZmllbGRzIG9yIG5vdC4KKyAgICAvLyBVc3VhbGx5IHVua25vd24gZmllbGRzIGFyZSBwcmludGVkIGluIGEgZ2VuZXJpYyB3YXkgdGhhdCBpbmNsdWRlcyB0aGUKKyAgICAvLyB0YWcgbnVtYmVyIG9mIHRoZSBmaWVsZCBpbnN0ZWFkIG9mIGZpZWxkIG5hbWUuIEhvd2V2ZXIsIHNvbWV0aW1lcyBpdAorICAgIC8vIGlzIHVzZWZ1bCB0byBiZSBhYmxlIHRvIHByaW50IHRoZSBtZXNzYWdlIHdpdGhvdXQgdW5rbm93biBmaWVsZHMgKGUuZy4KKyAgICAvLyBmb3IgdGhlIHB5dGhvbiBwcm90b2J1ZiB2ZXJzaW9uIHRvIG1haW50YWluIGNvbnNpc3RlbmN5IGJldHdlZW4gaXRzIHB1cmUKKyAgICAvLyBweXRob24gYW5kIGMrKyBpbXBsZW1lbnRhdGlvbnMpLgorICAgIHZvaWQgU2V0SGlkZVVua25vd25GaWVsZHMoYm9vbCBoaWRlKSB7CisgICAgICBoaWRlX3Vua25vd25fZmllbGRzXyA9IGhpZGU7CiAgICAgfQogCisgICAgLy8gSWYgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXIgaXMgdHJ1ZSwgcHJpbnQgZmllbGRzIG9mIGEgcHJvdG8KKyAgICAvLyBtZXNzYWdlIHVzaW5nIHRoZSBvcmRlciBkZWZpbmVkIGluIHNvdXJjZSBjb2RlIGluc3RlYWQgb2YgdGhlIGZpZWxkCisgICAgLy8gbnVtYmVyLiBCeSBkZWZhdWx0LCB1c2UgdGhlIGZpZWxkIG51bWJlciBvcmRlci4KKyAgICB2b2lkIFNldFByaW50TWVzc2FnZUZpZWxkc0luSW5kZXhPcmRlcigKKyAgICAgICAgYm9vbCBwcmludF9tZXNzYWdlX2ZpZWxkc19pbl9pbmRleF9vcmRlcikgeworICAgICAgcHJpbnRfbWVzc2FnZV9maWVsZHNfaW5faW5kZXhfb3JkZXJfID0KKyAgICAgICAgICBwcmludF9tZXNzYWdlX2ZpZWxkc19pbl9pbmRleF9vcmRlcjsKKyAgICB9CisKKyAgICAvLyBJZiBleHBhbmQ9PXRydWUsIGV4cGFuZCBnb29nbGUucHJvdG9idWYuQW55IHBheWxvYWRzLiBUaGUgb3V0cHV0CisgICAgLy8gd2lsbCBiZSBvZiBmb3JtCisgICAgLy8gICAgW3R5cGVfdXJsXSB7IDx2YWx1ZV9wcmludGVkX2luX3RleHQ+IH0KKyAgICAvLworICAgIC8vIElmIGV4cGFuZD09ZmFsc2UsIHByaW50IEFueSB1c2luZyB0aGUgZGVmYXVsdCBwcmludGVyLiBUaGUgb3V0cHV0IHdpbGwKKyAgICAvLyBsb29rIGxpa2UKKyAgICAvLyAgICB0eXBlX3VybDogIjx0eXBlX3VybD4iICB2YWx1ZTogInNlcmlhbGl6ZWRfY29udGVudCIKKyAgICB2b2lkIFNldEV4cGFuZEFueShib29sIGV4cGFuZCkgeworICAgICAgZXhwYW5kX2FueV8gPSBleHBhbmQ7CisgICAgfQorCisgICAgLy8gSWYgbm9uLXplcm8sIHdlIHRydW5jYXRlIGFsbCBzdHJpbmcgZmllbGRzIHRoYXQgYXJlICBsb25nZXIgdGhhbiB0aGlzCisgICAgLy8gdGhyZXNob2xkLiAgVGhpcyBpcyB1c2VmdWwgd2hlbiB0aGUgcHJvdG8gbWVzc2FnZSBoYXMgdmVyeSBsb25nIHN0cmluZ3MsCisgICAgLy8gZS5nLiwgZHVtcCBvZiBlbmNvZGVkIGltYWdlIGZpbGUuCisgICAgLy8KKyAgICAvLyBOT1RFKGhmZ29uZyk6ICBTZXR0aW5nIGEgbm9uLXplcm8gdmFsdWUgYnJlYWtzIHJvdW5kLXRyaXAgc2FmZQorICAgIC8vIHByb3BlcnR5IG9mIFRleHRGb3JtYXQ6OlByaW50ZXIuICBUaGF0IGlzLCBmcm9tIHRoZSBwcmludGVkIG1lc3NhZ2UsIHdlCisgICAgLy8gY2Fubm90IGZ1bGx5IHJlY292ZXIgdGhlIG9yaWdpbmFsIHN0cmluZyBmaWVsZCBhbnkgbW9yZS4KKyAgICB2b2lkIFNldFRydW5jYXRlU3RyaW5nRmllbGRMb25nZXJUaGFuKAorICAgICAgICBjb25zdCBpbnQ2NCB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW4pIHsKKyAgICAgIHRydW5jYXRlX3N0cmluZ19maWVsZF9sb25nZXJfdGhhbl8gPSB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW47CisgICAgfQorCisgICAgLy8gUmVnaXN0ZXIgYSBjdXN0b20gZmllbGQtc3BlY2lmaWMgRmllbGRWYWx1ZVByaW50ZXIgZm9yIGZpZWxkcworICAgIC8vIHdpdGggYSBwYXJ0aWN1bGFyIEZpZWxkRGVzY3JpcHRvci4KKyAgICAvLyBSZXR1cm5zICJ0cnVlIiBpZiB0aGUgcmVnaXN0cmF0aW9uIHN1Y2NlZWRlZCwgb3IgImZhbHNlIiwgaWYgdGhlcmUgaXMKKyAgICAvLyBhbHJlYWR5IGEgcHJpbnRlciBmb3IgdGhhdCBGaWVsZERlc2NyaXB0b3IuCisgICAgLy8gVGFrZXMgb3duZXJzaGlwIG9mIHRoZSBwcmludGVyIG9uIHN1Y2Nlc3NmdWwgcmVnaXN0cmF0aW9uLgorICAgIGJvb2wgUmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZFZhbHVlUHJpbnRlciogcHJpbnRlcik7CisKICAgIHByaXZhdGU6CiAgICAgLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBhbiBpbnRlcm5hbCBjbGFzcyB1c2VkIHRvIHByaW50IHRoZSB0ZXh0CiAgICAgLy8gb3V0cHV0IHRvIHRoZSBPdXRwdXRTdHJlYW0gKHNlZSB0ZXh0X2Zvcm1hdC5jYyBmb3IgaW1wbGVtZW50YXRpb24pLgpAQCAtMTc3LDE4ICsyODIsNDUgQEAKICAgICB2b2lkIFByaW50VW5rbm93bkZpZWxkcyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7CiAKKyAgICBib29sIFByaW50QW55KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsIFRleHRHZW5lcmF0b3ImIGdlbmVyYXRvcikgY29uc3Q7CisKICAgICBpbnQgaW5pdGlhbF9pbmRlbnRfbGV2ZWxfOwogCiAgICAgYm9vbCBzaW5nbGVfbGluZV9tb2RlXzsKIAorICAgIGJvb2wgdXNlX2ZpZWxkX251bWJlcl87CisKICAgICBib29sIHVzZV9zaG9ydF9yZXBlYXRlZF9wcmltaXRpdmVzXzsKIAotICAgIGJvb2wgdXRmOF9zdHJpbmdfZXNjYXBpbmdfOworICAgIGJvb2wgaGlkZV91bmtub3duX2ZpZWxkc187CisKKyAgICBib29sIHByaW50X21lc3NhZ2VfZmllbGRzX2luX2luZGV4X29yZGVyXzsKKworICAgIGJvb2wgZXhwYW5kX2FueV87CisKKyAgICBpbnQ2NCB0cnVuY2F0ZV9zdHJpbmdfZmllbGRfbG9uZ2VyX3RoYW5fOworCisgICAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjxjb25zdCBGaWVsZFZhbHVlUHJpbnRlcj4gZGVmYXVsdF9maWVsZF92YWx1ZV9wcmludGVyXzsKKyAgICB0eXBlZGVmIG1hcDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLAorICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkVmFsdWVQcmludGVyKj4gQ3VzdG9tUHJpbnRlck1hcDsKKyAgICBDdXN0b21QcmludGVyTWFwIGN1c3RvbV9wcmludGVyc187CiAgIH07CiAKICAgLy8gUGFyc2VzIGEgdGV4dC1mb3JtYXQgcHJvdG9jb2wgbWVzc2FnZSBmcm9tIHRoZSBnaXZlbiBpbnB1dCBzdHJlYW0gdG8KLSAgLy8gdGhlIGdpdmVuIG1lc3NhZ2Ugb2JqZWN0LiAgVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIGZvcm1hdCB3cml0dGVuCi0gIC8vIGJ5IFByaW50KCkuCisgIC8vIHRoZSBnaXZlbiBtZXNzYWdlIG9iamVjdC4gVGhpcyBmdW5jdGlvbiBwYXJzZXMgdGhlIGh1bWFuLXJlYWRhYmxlIGZvcm1hdAorICAvLyB3cml0dGVuIGJ5IFByaW50KCkuIFJldHVybnMgdHJ1ZSBvbiBzdWNjZXNzLiBUaGUgbWVzc2FnZSBpcyBjbGVhcmVkIGZpcnN0LAorICAvLyBldmVuIGlmIHRoZSBmdW5jdGlvbiBmYWlscyAtLSBTZWUgTWVyZ2UoKSB0byBhdm9pZCB0aGlzIGJlaGF2aW9yLgorICAvLworICAvLyBFeGFtcGxlIGlucHV0OiAidXNlciB7XG4gaWQ6IDEyMyBleHRyYSB7IGdlbmRlcjogTUFMRSBsYW5ndWFnZTogJ2VuJyB9XG59IgorICAvLworICAvLyBPbmUgdXNlIGZvciB0aGlzIGZ1bmN0aW9uIGlzIHBhcnNpbmcgaGFuZHdyaXR0ZW4gc3RyaW5ncyBpbiB0ZXN0IGNvZGUuCisgIC8vIEFub3RoZXIgdXNlIGlzIHRvIHBhcnNlIHRoZSBvdXRwdXQgZnJvbSBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlOjpEZWJ1Z1N0cmluZygpCisgIC8vIChvciBTaG9ydERlYnVnU3RyaW5nKCkpLCBiZWNhdXNlIHRoZXNlIGZ1bmN0aW9ucyBvdXRwdXQgdXNpbmcKKyAgLy8gZ29vZ2xlOjpwcm90b2J1Zjo6VGV4dEZvcm1hdDo6UHJpbnQoKS4KKyAgLy8KKyAgLy8gSWYgeW91IHdvdWxkIGxpa2UgdG8gcmVhZCBhIHByb3RvY29sIGJ1ZmZlciBzZXJpYWxpemVkIGluIHRoZQorICAvLyAobm9uLWh1bWFuLXJlYWRhYmxlKSBiaW5hcnkgd2lyZSBmb3JtYXQsIHNlZQorICAvLyBnb29nbGU6OnByb3RvYnVmOjpNZXNzYWdlTGl0ZTo6UGFyc2VGcm9tU3RyaW5nKCkuCiAgIHN0YXRpYyBib29sIFBhcnNlKGlvOjpaZXJvQ29weUlucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZSogb3V0cHV0KTsKICAgLy8gTGlrZSBQYXJzZSgpLCBidXQgcmVhZHMgZGlyZWN0bHkgZnJvbSBhIHN0cmluZy4KICAgc3RhdGljIGJvb2wgUGFyc2VGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsIE1lc3NhZ2UqIG91dHB1dCk7CkBAIC0yMjAsNiArMzUyLDU3IEBACiAgICAgICAgIGNvbnN0IHN0cmluZyYgbmFtZSkgY29uc3QgPSAwOwogICB9OwogCisgIC8vIEEgbG9jYXRpb24gaW4gdGhlIHBhcnNlZCB0ZXh0LgorICBzdHJ1Y3QgUGFyc2VMb2NhdGlvbiB7CisgICAgaW50IGxpbmU7CisgICAgaW50IGNvbHVtbjsKKworICAgIFBhcnNlTG9jYXRpb24oKSA6IGxpbmUoLTEpLCBjb2x1bW4oLTEpIHt9CisgICAgUGFyc2VMb2NhdGlvbihpbnQgbGluZV9wYXJhbSwgaW50IGNvbHVtbl9wYXJhbSkKKyAgICAgICAgOiBsaW5lKGxpbmVfcGFyYW0pLCBjb2x1bW4oY29sdW1uX3BhcmFtKSB7fQorICB9OworCisgIC8vIERhdGEgc3RydWN0dXJlIHdoaWNoIGlzIHBvcHVsYXRlZCB3aXRoIHRoZSBsb2NhdGlvbnMgb2YgZWFjaCBmaWVsZAorICAvLyB2YWx1ZSBwYXJzZWQgZnJvbSB0aGUgdGV4dC4KKyAgY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIFBhcnNlSW5mb1RyZWUgeworICAgcHVibGljOgorICAgIFBhcnNlSW5mb1RyZWUoKTsKKyAgICB+UGFyc2VJbmZvVHJlZSgpOworCisgICAgLy8gUmV0dXJucyB0aGUgcGFyc2UgbG9jYXRpb24gZm9yIGluZGV4LXRoIHZhbHVlIG9mIHRoZSBmaWVsZCBpbiB0aGUgcGFyc2VkCisgICAgLy8gdGV4dC4gSWYgbm9uZSBleGlzdHMsIHJldHVybnMgYSBsb2NhdGlvbiB3aXRoIGxpbmUgPSAtMS4gSW5kZXggc2hvdWxkIGJlCisgICAgLy8gLTEgZm9yIG5vdC1yZXBlYXRlZCBmaWVsZHMuCisgICAgUGFyc2VMb2NhdGlvbiBHZXRMb2NhdGlvbihjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCBpbnQgaW5kZXgpIGNvbnN0OworCisgICAgLy8gUmV0dXJucyB0aGUgcGFyc2UgaW5mbyB0cmVlIGZvciB0aGUgZ2l2ZW4gZmllbGQsIHdoaWNoIG11c3QgYmUgYSBtZXNzYWdlCisgICAgLy8gdHlwZS4gVGhlIG5lc3RlZCBpbmZvcm1hdGlvbiB0cmVlIGlzIG93bmVkIGJ5IHRoZSByb290IHRyZWUgYW5kIHdpbGwgYmUKKyAgICAvLyBkZWxldGVkIHdoZW4gaXQgaXMgZGVsZXRlZC4KKyAgICBQYXJzZUluZm9UcmVlKiBHZXRUcmVlRm9yTmVzdGVkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgpIGNvbnN0OworCisgICBwcml2YXRlOgorICAgIC8vIEFsbG93IHRoZSB0ZXh0IGZvcm1hdCBwYXJzZXIgdG8gcmVjb3JkIGluZm9ybWF0aW9uIGludG8gdGhlIHRyZWUuCisgICAgZnJpZW5kIGNsYXNzIFRleHRGb3JtYXQ7CisKKyAgICAvLyBSZWNvcmRzIHRoZSBzdGFydGluZyBsb2NhdGlvbiBvZiBhIHNpbmdsZSB2YWx1ZSBmb3IgYSBmaWVsZC4KKyAgICB2b2lkIFJlY29yZExvY2F0aW9uKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsIFBhcnNlTG9jYXRpb24gbG9jYXRpb24pOworCisgICAgLy8gQ3JlYXRlIGFuZCByZWNvcmRzIGEgbmVzdGVkIHRyZWUgZm9yIGEgbmVzdGVkIG1lc3NhZ2UgZmllbGQuCisgICAgUGFyc2VJbmZvVHJlZSogQ3JlYXRlTmVzdGVkKGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpOworCisgICAgLy8gRGVmaW5lcyB0aGUgbWFwIGZyb20gdGhlIGluZGV4LXRoIGZpZWxkIGRlc2NyaXB0b3IgdG8gaXRzIHBhcnNlIGxvY2F0aW9uLgorICAgIHR5cGVkZWYgbWFwPGNvbnN0IEZpZWxkRGVzY3JpcHRvciosIHZlY3RvcjxQYXJzZUxvY2F0aW9uPiA+IExvY2F0aW9uTWFwOworCisgICAgLy8gRGVmaW5lcyB0aGUgbWFwIGZyb20gdGhlIGluZGV4LXRoIGZpZWxkIGRlc2NyaXB0b3IgdG8gdGhlIG5lc3RlZCBwYXJzZQorICAgIC8vIGluZm8gdHJlZS4KKyAgICB0eXBlZGVmIG1hcDxjb25zdCBGaWVsZERlc2NyaXB0b3IqLCB2ZWN0b3I8UGFyc2VJbmZvVHJlZSo+ID4gTmVzdGVkTWFwOworCisgICAgTG9jYXRpb25NYXAgbG9jYXRpb25zXzsKKyAgICBOZXN0ZWRNYXAgbmVzdGVkXzsKKworICAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhQYXJzZUluZm9UcmVlKTsKKyAgfTsKKwogICAvLyBGb3IgbW9yZSBjb250cm9sIG92ZXIgcGFyc2luZywgdXNlIHRoaXMgY2xhc3MuCiAgIGNsYXNzIExJQlBST1RPQlVGX0VYUE9SVCBQYXJzZXIgewogICAgcHVibGljOgpAQCAtMjQ4LDE3ICs0MzEsMzYgQEAKICAgICAgIGZpbmRlcl8gPSBmaW5kZXI7CiAgICAgfQogCisgICAgLy8gU2V0cyB3aGVyZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBhYm91dCB0aGUgcGFyc2Ugd2lsbCBiZSB3cml0dGVuLiBJZiBOVUxMCisgICAgLy8gKHRoZSBkZWZhdWx0KSwgdGhlbiBubyBsb2NhdGlvbiB3aWxsIGJlIHdyaXR0ZW4uCisgICAgdm9pZCBXcml0ZUxvY2F0aW9uc1RvKFBhcnNlSW5mb1RyZWUqIHRyZWUpIHsKKyAgICAgIHBhcnNlX2luZm9fdHJlZV8gPSB0cmVlOworICAgIH0KKwogICAgIC8vIE5vcm1hbGx5IHBhcnNpbmcgZmFpbHMgaWYsIGFmdGVyIHBhcnNpbmcsIG91dHB1dC0+SXNJbml0aWFsaXplZCgpCiAgICAgLy8gcmV0dXJucyBmYWxzZS4gIENhbGwgQWxsb3dQYXJ0aWFsTWVzc2FnZSh0cnVlKSB0byBza2lwIHRoaXMgY2hlY2suCiAgICAgdm9pZCBBbGxvd1BhcnRpYWxNZXNzYWdlKGJvb2wgYWxsb3cpIHsKICAgICAgIGFsbG93X3BhcnRpYWxfID0gYWxsb3c7CiAgICAgfQogCisgICAgLy8gQWxsb3cgZmllbGQgbmFtZXMgdG8gYmUgbWF0Y2hlZCBjYXNlLWluc2Vuc2l0aXZlbHkuCisgICAgLy8gVGhpcyBpcyBub3QgYWR2aXNhYmxlIGlmIHRoZXJlIGFyZSBmaWVsZHMgdGhhdCBvbmx5IGRpZmZlciBpbiBjYXNlLCBvcgorICAgIC8vIGlmIHlvdSB3YW50IHRvIGVuZm9yY2Ugd3JpdGluZyBpbiB0aGUgY2Fub25pY2FsIGZvcm0uCisgICAgLy8gVGhpcyBpcyAnZmFsc2UnIGJ5IGRlZmF1bHQuCisgICAgdm9pZCBBbGxvd0Nhc2VJbnNlbnNpdGl2ZUZpZWxkKGJvb2wgYWxsb3cpIHsKKyAgICAgIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfID0gYWxsb3c7CisgICAgfQorCiAgICAgLy8gTGlrZSBUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nCiAgICAgYm9vbCBQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKGNvbnN0IHN0cmluZyYgaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2UqIG91dHB1dCk7CiAKKworICAgIHZvaWQgQWxsb3dGaWVsZE51bWJlcihib29sIGFsbG93KSB7CisgICAgICBhbGxvd19maWVsZF9udW1iZXJfID0gYWxsb3c7CisgICAgfQorCiAgICBwcml2YXRlOgogICAgIC8vIEZvcndhcmQgZGVjbGFyYXRpb24gb2YgYW4gaW50ZXJuYWwgY2xhc3MgdXNlZCB0byBwYXJzZSB0ZXh0CiAgICAgLy8gcmVwcmVzZW50YXRpb25zIChzZWUgdGV4dF9mb3JtYXQuY2MgZm9yIGltcGxlbWVudGF0aW9uKS4KQEAgLTI3MiwxMyArNDc0LDQzIEBACiAKICAgICBpbzo6RXJyb3JDb2xsZWN0b3IqIGVycm9yX2NvbGxlY3Rvcl87CiAgICAgRmluZGVyKiBmaW5kZXJfOworICAgIFBhcnNlSW5mb1RyZWUqIHBhcnNlX2luZm9fdHJlZV87CiAgICAgYm9vbCBhbGxvd19wYXJ0aWFsXzsKKyAgICBib29sIGFsbG93X2Nhc2VfaW5zZW5zaXRpdmVfZmllbGRfOworICAgIGJvb2wgYWxsb3dfdW5rbm93bl9maWVsZF87CisgICAgYm9vbCBhbGxvd191bmtub3duX2VudW1fOworICAgIGJvb2wgYWxsb3dfZmllbGRfbnVtYmVyXzsKKyAgICBib29sIGFsbG93X3JlbGF4ZWRfd2hpdGVzcGFjZV87CisgICAgYm9vbCBhbGxvd19zaW5ndWxhcl9vdmVyd3JpdGVzXzsKICAgfTsKIAorCiAgcHJpdmF0ZToKKyAgLy8gSGFjazogUGFyc2VJbmZvVHJlZSBkZWNsYXJlcyBUZXh0Rm9ybWF0IGFzIGEgZnJpZW5kIHdoaWNoIHNob3VsZCBleHRlbmQKKyAgLy8gdGhlIGZyaWVuZHNoaXAgdG8gVGV4dEZvcm1hdDo6UGFyc2VyOjpQYXJzZXJJbXBsLCBidXQgdW5mb3J0dW5hdGVseSBzb21lCisgIC8vIG9sZCBjb21waWxlcnMgKGUuZy4gR0NDIDMuNC42KSBkb24ndCBpbXBsZW1lbnQgdGhpcyBjb3JyZWN0bHkuIFdlIHByb3ZpZGUKKyAgLy8gaGVscGVycyBmb3IgUGFyc2VySW1wbCB0byBjYWxsIG1ldGhvZHMgb2YgUGFyc2VJbmZvVHJlZS4KKyAgc3RhdGljIGlubGluZSB2b2lkIFJlY29yZExvY2F0aW9uKFBhcnNlSW5mb1RyZWUqIGluZm9fdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQYXJzZUxvY2F0aW9uIGxvY2F0aW9uKTsKKyAgc3RhdGljIGlubGluZSBQYXJzZUluZm9UcmVlKiBDcmVhdGVOZXN0ZWQoUGFyc2VJbmZvVHJlZSogaW5mb190cmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKTsKKwogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVGV4dEZvcm1hdCk7CiB9OwogCitpbmxpbmUgdm9pZCBUZXh0Rm9ybWF0OjpSZWNvcmRMb2NhdGlvbihQYXJzZUluZm9UcmVlKiBpbmZvX3RyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUGFyc2VMb2NhdGlvbiBsb2NhdGlvbikgeworICBpbmZvX3RyZWUtPlJlY29yZExvY2F0aW9uKGZpZWxkLCBsb2NhdGlvbik7Cit9CisKKworaW5saW5lIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIFRleHRGb3JtYXQ6OkNyZWF0ZU5lc3RlZCgKKyAgICBQYXJzZUluZm9UcmVlKiBpbmZvX3RyZWUsIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQpIHsKKyAgcmV0dXJuIGluZm9fdHJlZS0+Q3JlYXRlTmVzdGVkKGZpZWxkKTsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiAKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0X3VuaXR0ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKaW5kZXggMDBlYThjMy4uNThhYTNmOCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXRfdW5pdHRlc3QuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDIzICszMiwzMyBAQAogLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGV4dF9mb3JtYXQuaD4KKwogI2luY2x1ZGUgPG1hdGguaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWVtb3J5PgorI2lmbmRlZiBfU0hBUkVEX1BUUl9ICisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3NoYXJlZF9wdHIuaD4KKyNlbmRpZgogCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3RleHRfZm9ybWF0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbC5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9maWxlLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnBiLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgotCi0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgotI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2ZpbGUuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby90b2tlbml6ZXIuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cnV0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3Vic3RpdHV0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi90ZXN0aW5nL2dvb2dsZXRlc3QuaD4KKyNpbmNsdWRlIDxndGVzdC9ndGVzdC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9tYXRobGltaXRzLmg+CisKIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtNTYsMTEgKzY2LDYgQEAKIC8vIENhbid0IHVzZSBhbiBhbm9ueW1vdXMgbmFtZXNwYWNlIGhlcmUgZHVlIHRvIGJyb2tlbm5lc3Mgb2YgVHJ1NjQgY29tcGlsZXIuCiBuYW1lc3BhY2UgdGV4dF9mb3JtYXRfdW5pdHRlc3QgewogCi1pbmxpbmUgYm9vbCBJc05hTihkb3VibGUgdmFsdWUpIHsKLSAgLy8gTmFOIGlzIG5ldmVyIGVxdWFsIHRvIGFueXRoaW5nLCBldmVuIGl0c2VsZi4KLSAgcmV0dXJuIHZhbHVlICE9IHZhbHVlOwotfQotCiAvLyBBIGJhc2ljIHN0cmluZyB3aXRoIGRpZmZlcmVudCBlc2NhcGFibGUgY2hhcmFjdGVycyBmb3IgdGVzdGluZy4KIGNvbnN0IHN0cmluZyBrRXNjYXBlVGVzdFN0cmluZyA9CiAgICJcIkEgc3RyaW5nIHdpdGggJyBjaGFyYWN0ZXJzIFxuIGFuZCBcciBuZXdsaW5lcyBhbmQgXHQgdGFicyBhbmQgXDAwMSAiCkBAIC03NCwxMCArNzksMTEgQEAKIGNsYXNzIFRleHRGb3JtYXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHB1YmxpYzoKICAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoCi0gICAgICAgIFRlc3RTb3VyY2VEaXIoKQotICAgICAgICArICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhL3RleHRfZm9ybWF0X3VuaXR0ZXN0X2RhdGEudHh0IiwKLSAgICAgICAgJnN0YXRpY19wcm90b19kZWJ1Z19zdHJpbmdfKTsKKyAgICBHT09HTEVfQ0hFQ0tfT0soRmlsZTo6R2V0Q29udGVudHMoCisgICAgICAgIFRlc3RTb3VyY2VEaXIoKSArCisgICAgICAgICAgICAiL2dvb2dsZS9wcm90b2J1Zi8iCisgICAgICAgICAgICAidGVzdGRhdGEvdGV4dF9mb3JtYXRfdW5pdHRlc3RfZGF0YV9vbmVvZl9pbXBsZW1lbnRlZC50eHQiLAorICAgICAgICAmc3RhdGljX3Byb3RvX2RlYnVnX3N0cmluZ18sIHRydWUpKTsKICAgfQogCiAgIFRleHRGb3JtYXRUZXN0KCkgOiBwcm90b19kZWJ1Z19zdHJpbmdfKHN0YXRpY19wcm90b19kZWJ1Z19zdHJpbmdfKSB7fQpAQCAtOTUsMTEgKzEwMSwxMCBAQAogY2xhc3MgVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHB1YmxpYzoKICAgc3RhdGljIHZvaWQgU2V0VXBUZXN0Q2FzZSgpIHsKLSAgICBGaWxlOjpSZWFkRmlsZVRvU3RyaW5nT3JEaWUoCi0gICAgICAgIFRlc3RTb3VyY2VEaXIoKQotICAgICAgICArICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhLyIKLSAgICAgICAgICAidGV4dF9mb3JtYXRfdW5pdHRlc3RfZXh0ZW5zaW9uc19kYXRhLnR4dCIsCi0gICAgICAgICZzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXyk7CisgICAgR09PR0xFX0NIRUNLX09LKEZpbGU6OkdldENvbnRlbnRzKFRlc3RTb3VyY2VEaXIoKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIvZ29vZ2xlL3Byb3RvYnVmL3Rlc3RkYXRhLyIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRleHRfZm9ybWF0X3VuaXR0ZXN0X2V4dGVuc2lvbnNfZGF0YS50eHQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZzdGF0aWNfcHJvdG9fZGVidWdfc3RyaW5nXywgdHJ1ZSkpOwogICB9CiAKICAgVGV4dEZvcm1hdEV4dGVuc2lvbnNUZXN0KCkKQEAgLTIwNSwxNiArMjEwLDI1IEBACiBURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFV0ZjhEZWJ1Z1N0cmluZykgewogICAvLyBTZXQgdGhlIHN0cmluZyB2YWx1ZSB0byB0ZXN0LgogICBwcm90b18uc2V0X29wdGlvbmFsX3N0cmluZygiXDM1MFwyNjBcMjY3XDM0NlwyNTVcMjE0Iik7CisgIHByb3RvXy5zZXRfb3B0aW9uYWxfYnl0ZXMoIlwzNTBcMjYwXDI2N1wzNDZcMjU1XDIxNCIpOwogCiAgIC8vIEdldCB0aGUgRGVidWdTdHJpbmcgZnJvbSB0aGUgcHJvdG8uCiAgIHN0cmluZyBkZWJ1Z19zdHJpbmcgPSBwcm90b18uRGVidWdTdHJpbmcoKTsKICAgc3RyaW5nIHV0ZjhfZGVidWdfc3RyaW5nID0gcHJvdG9fLlV0ZjhEZWJ1Z1N0cmluZygpOwogCiAgIC8vIEhhcmRjb2RlIGEgY29ycmVjdCB2YWx1ZSB0byB0ZXN0IGFnYWluc3QuCi0gIHN0cmluZyBjb3JyZWN0X3V0Zjhfc3RyaW5nID0gIm9wdGlvbmFsX3N0cmluZzogIgorICBzdHJpbmcgY29ycmVjdF91dGY4X3N0cmluZyA9CisgICAgICAib3B0aW9uYWxfc3RyaW5nOiAiCiAgICAgICAiXCJcMzUwXDI2MFwyNjdcMzQ2XDI1NVwyMTRcIiIKKyAgICAgICJcbiIKKyAgICAgICJvcHRpb25hbF9ieXRlczogIgorICAgICAgIlwiXFwzNTBcXDI2MFxcMjY3XFwzNDZcXDI1NVxcMjE0XCIiCiAgICAgICAiXG4iOwotICBzdHJpbmcgY29ycmVjdF9zdHJpbmcgPSAib3B0aW9uYWxfc3RyaW5nOiAiCisgIHN0cmluZyBjb3JyZWN0X3N0cmluZyA9CisgICAgICAib3B0aW9uYWxfc3RyaW5nOiAiCisgICAgICAiXCJcXDM1MFxcMjYwXFwyNjdcXDM0NlxcMjU1XFwyMTRcIiIKKyAgICAgICJcbiIKKyAgICAgICJvcHRpb25hbF9ieXRlczogIgogICAgICAgIlwiXFwzNTBcXDI2MFxcMjY3XFwzNDZcXDI1NVxcMjE0XCIiCiAgICAgICAiXG4iOwogCkBAIC0yNTMsNiArMjY3LDMxIEBACiAgICAgbWVzc2FnZS5EZWJ1Z1N0cmluZygpKTsKIH0KIAorVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludFVua25vd25GaWVsZHNIaWRkZW4pIHsKKyAgLy8gVGVzdCBwcmludGluZyBvZiB1bmtub3duIGZpZWxkcyBpbiBhIG1lc3NhZ2Ugd2hlbiBzdXBwcmVzc2VkLgorCisgIHVuaXR0ZXN0OjpPbmVTdHJpbmcgbWVzc2FnZTsKKyAgbWVzc2FnZS5zZXRfZGF0YSgiZGF0YSIpOworICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzID0gbWVzc2FnZS5tdXRhYmxlX3Vua25vd25fZmllbGRzKCk7CisKKyAgdW5rbm93bl9maWVsZHMtPkFkZFZhcmludCg1LCAxKTsKKyAgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIoNSwgMik7CisgIHVua25vd25fZmllbGRzLT5BZGRGaXhlZDY0KDUsIDMpOworICB1bmtub3duX2ZpZWxkcy0+QWRkTGVuZ3RoRGVsaW1pdGVkKDUsICI0Iik7CisgIHVua25vd25fZmllbGRzLT5BZGRHcm91cCg1KS0+QWRkVmFyaW50KDEwLCA1KTsKKworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDEpOworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDIpOworICB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KDgsIDMpOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXRIaWRlVW5rbm93bkZpZWxkcyh0cnVlKTsKKyAgc3RyaW5nIG91dHB1dDsKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZvdXRwdXQpOworCisgIEVYUEVDVF9FUSgiZGF0YTogXCJkYXRhXCJcbiIsIG91dHB1dCk7Cit9CisKIFRFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUHJpbnRVbmtub3duTWVzc2FnZSkgewogICAvLyBUZXN0IGhldXJpc3RpYyBwcmludGluZyBvZiBtZXNzYWdlcyBpbiBhbiBVbmtub3duRmllbGRTZXQuCiAKQEAgLTMzOSw2ICszNzgsMTYxIEBACiAgICAgdGV4dCk7CiB9CiAKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgUHJpbnRCdWZmZXJUb29TbWFsbCkgeworICAvLyBUZXN0IHByaW50aW5nIGEgbWVzc2FnZSB0byBhIGJ1ZmZlciB0aGF0IGlzIHRvbyBzbWFsbC4KKworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJhYmMiKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfc3RyaW5nKCJkZWYiKTsKKworICBjaGFyIGJ1ZmZlclsxXSA9ICIiOworICBpbzo6QXJyYXlPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbShidWZmZXIsIDEpOworICBFWFBFQ1RfRkFMU0UoVGV4dEZvcm1hdDo6UHJpbnQobWVzc2FnZSwgJm91dHB1dF9zdHJlYW0pKTsKKyAgRVhQRUNUX0VRKGJ1ZmZlclswXSwgJ3InKTsKKyAgRVhQRUNUX0VRKG91dHB1dF9zdHJlYW0uQnl0ZUNvdW50KCksIDEpOworfQorCisvLyBBIHByaW50ZXIgdGhhdCBhcHBlbmRzICd1JyB0byBhbGwgdW5zaWduZWQgaW50MzIuCitjbGFzcyBDdXN0b21VSW50MzJGaWVsZFZhbHVlUHJpbnRlciA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIHN0cmluZyBQcmludFVJbnQzMih1aW50MzIgdmFsKSBjb25zdCB7CisgICAgcmV0dXJuIFN0ckNhdChGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRVSW50MzIodmFsKSwgInUiKTsKKyAgfQorfTsKKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBEZWZhdWx0Q3VzdG9tRmllbGRQcmludGVyKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLnNldF9vcHRpb25hbF91aW50MzIoNDIpOworICBtZXNzYWdlLmFkZF9yZXBlYXRlZF91aW50MzIoMSk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX3VpbnQzMigyKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfdWludDMyKDMpOworCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgcHJpbnRlci5TZXREZWZhdWx0RmllbGRWYWx1ZVByaW50ZXIobmV3IEN1c3RvbVVJbnQzMkZpZWxkVmFsdWVQcmludGVyKCkpOworICAvLyBMZXQncyBzZWUgaWYgdGhhdCB3b3JrcyB3ZWxsIHRvZ2V0aGVyIHdpdGggdGhlIHJlcGVhdGVkIHByaW1pdGl2ZXM6CisgIHByaW50ZXIuU2V0VXNlU2hvcnRSZXBlYXRlZFByaW1pdGl2ZXModHJ1ZSk7CisgIHN0cmluZyB0ZXh0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOworICBFWFBFQ1RfRVEoIm9wdGlvbmFsX3VpbnQzMjogNDJ1XG5yZXBlYXRlZF91aW50MzI6IFsxdSwgMnUsIDN1XVxuIiwgdGV4dCk7Cit9CisKK2NsYXNzIEN1c3RvbUludDMyRmllbGRWYWx1ZVByaW50ZXIgOiBwdWJsaWMgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIgeworIHB1YmxpYzoKKyAgdmlydHVhbCBzdHJpbmcgUHJpbnRJbnQzMihpbnQzMiB2YWwpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyQ2F0KCJ2YWx1ZS1pcygiLCBGaWVsZFZhbHVlUHJpbnRlcjo6UHJpbnRJbnQzMih2YWwpLCAiKSIpOworICB9Cit9OworCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIEZpZWxkU3BlY2lmaWNDdXN0b21QcmludGVyKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKworICBtZXNzYWdlLnNldF9vcHRpb25hbF9pbnQzMig0Mik7ICAvLyBUaGlzIHdpbGwgYmUgaGFuZGxlZCBieSBvdXIgUHJpbnRlci4KKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW50MzIoNDIpOyAgLy8gVGhpcyB3aWxsIGJlIHByaW50ZWQgYXMgbnVtYmVyLgorCisgIFRleHRGb3JtYXQ6OlByaW50ZXIgcHJpbnRlcjsKKyAgRVhQRUNUX1RSVUUocHJpbnRlci5SZWdpc3RlckZpZWxkVmFsdWVQcmludGVyKAorICAgICAgbWVzc2FnZS5HZXREZXNjcmlwdG9yKCktPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfaW50MzIiKSwKKyAgICAgIG5ldyBDdXN0b21JbnQzMkZpZWxkVmFsdWVQcmludGVyKCkpKTsKKyAgc3RyaW5nIHRleHQ7CisgIHByaW50ZXIuUHJpbnRUb1N0cmluZyhtZXNzYWdlLCAmdGV4dCk7CisgIEVYUEVDVF9FUSgib3B0aW9uYWxfaW50MzI6IHZhbHVlLWlzKDQyKVxucmVwZWF0ZWRfaW50MzI6IDQyXG4iLCB0ZXh0KTsKK30KKworVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBFcnJvckNhc2VzUmVnaXN0ZXJpbmdGaWVsZFZhbHVlUHJpbnRlclNob3VsZEZhaWwpIHsKKyAgcHJvdG9idWZfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyBtZXNzYWdlOworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIC8vIE5VTEwgcHJpbnRlci4KKyAgRVhQRUNUX0ZBTFNFKHByaW50ZXIuUmVnaXN0ZXJGaWVsZFZhbHVlUHJpbnRlcigKKyAgICAgIG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsX2ludDMyIiksCisgICAgICBOVUxMKSk7CisgIC8vIEJlY2F1c2UgcmVnaXN0cmF0aW9uIGZhaWxzLCB0aGUgb3duZXJzaGlwIG9mIHRoaXMgcHJpbnRlciBpcyBuZXZlciB0YWtlbi4KKyAgVGV4dEZvcm1hdDo6RmllbGRWYWx1ZVByaW50ZXIgbXlfZmllbGRfcHJpbnRlcjsKKyAgLy8gTlVMTCBmaWVsZAorICBFWFBFQ1RfRkFMU0UocHJpbnRlci5SZWdpc3RlckZpZWxkVmFsdWVQcmludGVyKE5VTEwsICZteV9maWVsZF9wcmludGVyKSk7Cit9CisKK2NsYXNzIEN1c3RvbU1lc3NhZ2VGaWVsZFZhbHVlUHJpbnRlciA6IHB1YmxpYyBUZXh0Rm9ybWF0OjpGaWVsZFZhbHVlUHJpbnRlciB7CisgcHVibGljOgorICB2aXJ0dWFsIHN0cmluZyBQcmludEludDMyKGludDMyIHYpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyQ2F0KEZpZWxkVmFsdWVQcmludGVyOjpQcmludEludDMyKHYpLCAiICAjIHgiLCBzdHJpbmdzOjpIZXgodikpOworICB9CisKKyAgdmlydHVhbCBzdHJpbmcgUHJpbnRNZXNzYWdlU3RhcnQoY29uc3QgTWVzc2FnZSYgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2luZGV4LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZmllbGRfY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgc2luZ2xlX2xpbmVfbW9kZSkgY29uc3QgeworICAgIGlmIChzaW5nbGVfbGluZV9tb2RlKSB7CisgICAgICByZXR1cm4gIiB7ICI7CisgICAgfQorICAgIHJldHVybiBTdHJDYXQoCisgICAgICAgICIgeyAgIyAiLCBtZXNzYWdlLkdldERlc2NyaXB0b3IoKS0+bmFtZSgpLCAiOiAiLCBmaWVsZF9pbmRleCwgIlxuIik7CisgIH0KK307CisKK1RFU1RfRihUZXh0Rm9ybWF0VGVzdCwgQ3VzdG9tUHJpbnRlckZvckNvbW1lbnRzKSB7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKKyAgbWVzc2FnZS5tdXRhYmxlX29wdGlvbmFsX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9pbXBvcnRfbWVzc2FnZSgpLT5zZXRfZCg0Mik7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX25lc3RlZF9tZXNzYWdlKCk7CisgIG1lc3NhZ2UuYWRkX3JlcGVhdGVkX2ltcG9ydF9tZXNzYWdlKCktPnNldF9kKDQzKTsKKyAgbWVzc2FnZS5hZGRfcmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoNDQpOworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIEN1c3RvbU1lc3NhZ2VGaWVsZFZhbHVlUHJpbnRlciBteV9maWVsZF9wcmludGVyOworICBwcmludGVyLlNldERlZmF1bHRGaWVsZFZhbHVlUHJpbnRlcihuZXcgQ3VzdG9tTWVzc2FnZUZpZWxkVmFsdWVQcmludGVyKCkpOworICBzdHJpbmcgdGV4dDsKKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KTsKKyAgRVhQRUNUX0VRKAorICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIHsgICMgTmVzdGVkTWVzc2FnZTogLTFcbiIKKyAgICAgICJ9XG4iCisgICAgICAib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgeyAgIyBJbXBvcnRNZXNzYWdlOiAtMVxuIgorICAgICAgIiAgZDogNDIgICMgeDJhXG4iCisgICAgICAifVxuIgorICAgICAgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIHsgICMgTmVzdGVkTWVzc2FnZTogMFxuIgorICAgICAgIn1cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSB7ICAjIE5lc3RlZE1lc3NhZ2U6IDFcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgeyAgIyBJbXBvcnRNZXNzYWdlOiAwXG4iCisgICAgICAiICBkOiA0MyAgIyB4MmJcbiIKKyAgICAgICJ9XG4iCisgICAgICAicmVwZWF0ZWRfaW1wb3J0X21lc3NhZ2UgeyAgIyBJbXBvcnRNZXNzYWdlOiAxXG4iCisgICAgICAiICBkOiA0NCAgIyB4MmNcbiIKKyAgICAgICJ9XG4iLAorICAgICAgdGV4dCk7Cit9CisKK2NsYXNzIEN1c3RvbU11bHRpbGluZUNvbW1lbnRQcmludGVyIDogcHVibGljIFRleHRGb3JtYXQ6OkZpZWxkVmFsdWVQcmludGVyIHsKKyBwdWJsaWM6CisgIHZpcnR1YWwgc3RyaW5nIFByaW50TWVzc2FnZVN0YXJ0KGNvbnN0IE1lc3NhZ2UmIG1lc3NhZ2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBmaWVsZF9pbmRleCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGZpZWxkX2NvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIHNpbmdsZV9saW5lX2NvbW1lbnQpIGNvbnN0IHsKKyAgICByZXR1cm4gU3RyQ2F0KCIgeyAgIyAxXG4iLCAiICAjIDJcbiIpOworICB9Cit9OworCitURVNUX0YoVGV4dEZvcm1hdFRlc3QsIEN1c3RvbVByaW50ZXJGb3JNdWx0aWxpbmVDb21tZW50cykgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CisgIG1lc3NhZ2UubXV0YWJsZV9vcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSgpOworICBtZXNzYWdlLm11dGFibGVfb3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UoKS0+c2V0X2QoNDIpOworICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIEN1c3RvbU1lc3NhZ2VGaWVsZFZhbHVlUHJpbnRlciBteV9maWVsZF9wcmludGVyOworICBwcmludGVyLlNldERlZmF1bHRGaWVsZFZhbHVlUHJpbnRlcihuZXcgQ3VzdG9tTXVsdGlsaW5lQ29tbWVudFByaW50ZXIoKSk7CisgIHN0cmluZyB0ZXh0OworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOworICBFWFBFQ1RfRVEoCisgICAgICAib3B0aW9uYWxfbmVzdGVkX21lc3NhZ2UgeyAgIyAxXG4iCisgICAgICAiICAjIDJcbiIKKyAgICAgICJ9XG4iCisgICAgICAib3B0aW9uYWxfaW1wb3J0X21lc3NhZ2UgeyAgIyAxXG4iCisgICAgICAiICAjIDJcbiIKKyAgICAgICIgIGQ6IDQyXG4iCisgICAgICAifVxuIiwKKyAgICAgIHRleHQpOworfQorCiBURVNUX0YoVGV4dEZvcm1hdFRlc3QsIFBhcnNlQmFzaWMpIHsKICAgaW86OkFycmF5SW5wdXRTdHJlYW0gaW5wdXRfc3RyZWFtKHByb3RvX2RlYnVnX3N0cmluZ18uZGF0YSgpLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdG9fZGVidWdfc3RyaW5nXy5zaXplKCkpOwpAQCAtMzk3LDcgKzU5MSw3IEBACiAgIC8vIENvbXBhcmUuCiAgIEVYUEVDVF9FUSgiZm9vYmFyIiwgcHJvdG9fLm9wdGlvbmFsX3N0cmluZygpKTsKIAotICAvLyBDcmVhdGUgYSBwYXJzZSBzdHJpbmcgd2l0aCBtdWx0aXBsZSBwYXJ0cyBvbiBzZXBlcmF0ZSBsaW5lcy4KKyAgLy8gQ3JlYXRlIGEgcGFyc2Ugc3RyaW5nIHdpdGggbXVsdGlwbGUgcGFydHMgb24gc2VwYXJhdGUgbGluZXMuCiAgIHBhcnNlX3N0cmluZyA9ICJvcHRpb25hbF9zdHJpbmc6IFwiZm9vXCJcbiIKICAgICAgICAgICAgICAgICAgIlwiYmFyXCJcbiI7CiAKQEAgLTQzNCw3ICs2MjgsMTEgQEAKICAgICAgICIgICAgICAgICAgICAgICAgICAgICAgICAgM11cbiIKICAgICAgIC8vIE5vdGUgdGhhdCB3aGlsZSB0aGUgcHJpbnRlciB3b24ndCBwcmludCByZXBlYXRlZCBzdHJpbmdzIGluIHNob3J0LWZvcm0sCiAgICAgICAvLyB0aGUgcGFyc2VyIHdpbGwgYWNjZXB0IHRoZW0uCi0gICAgICAicmVwZWF0ZWRfc3RyaW5nOiBbIFwiZm9vXCIsICdiYXInIF1cbiI7CisgICAgICAicmVwZWF0ZWRfc3RyaW5nOiBbIFwiZm9vXCIsICdiYXInIF1cbiIKKyAgICAgIC8vIFJlcGVhdGVkIG1lc3NhZ2UKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZTogWyB7IGJiOiAxIH0sIHsgYmIgOiAyIH1dXG4iCisgICAgICAvLyBSZXBlYXRlZCBncm91cAorICAgICAgIlJlcGVhdGVkR3JvdXAgW3sgYTogMyB9LHsgYTogNCB9XVxuIjsKIAogICBBU1NFUlRfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZyb21TdHJpbmcocGFyc2Vfc3RyaW5nLCAmcHJvdG9fKSk7CiAKQEAgLTQ1MSw4ICs2NDksMTcgQEAKICAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZF9zdHJpbmdfc2l6ZSgpKTsKICAgRVhQRUNUX0VRKCJmb28iLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDApKTsKICAgRVhQRUNUX0VRKCJiYXIiLCBwcm90b18ucmVwZWF0ZWRfc3RyaW5nKDEpKTsKKworICBBU1NFUlRfRVEoMiwgcHJvdG9fLnJlcGVhdGVkX25lc3RlZF9tZXNzYWdlX3NpemUoKSk7CisgIEVYUEVDVF9FUSgxLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMCkuYmIoKSk7CisgIEVYUEVDVF9FUSgyLCBwcm90b18ucmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UoMSkuYmIoKSk7CisKKyAgQVNTRVJUX0VRKDIsIHByb3RvXy5yZXBlYXRlZGdyb3VwX3NpemUoKSk7CisgIEVYUEVDVF9FUSgzLCBwcm90b18ucmVwZWF0ZWRncm91cCgwKS5hKCkpOworICBFWFBFQ1RfRVEoNCwgcHJvdG9fLnJlcGVhdGVkZ3JvdXAoMSkuYSgpKTsKIH0KIAorCiBURVNUX0YoVGV4dEZvcm1hdFRlc3QsIENvbW1lbnRzKSB7CiAgIC8vIFRlc3QgdGhhdCBjb21tZW50cyBhcmUgaWdub3JlZC4KIApAQCAtNjk1LDggKzkwMiw4IEBACiAgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSg4KSwgbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7CiAgIEVYUEVDVF9FUShtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSg5KSwgLW51bWVyaWNfbGltaXRzPGRvdWJsZT46OmluZmluaXR5KCkpOwogICBFWFBFQ1RfRVEobWVzc2FnZS5yZXBlYXRlZF9kb3VibGUoMTApLCAtbnVtZXJpY19saW1pdHM8ZG91YmxlPjo6aW5maW5pdHkoKSk7Ci0gIEVYUEVDVF9UUlVFKElzTmFOKG1lc3NhZ2UucmVwZWF0ZWRfZG91YmxlKDExKSkpOwotICBFWFBFQ1RfVFJVRShJc05hTihtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMikpKTsKKyAgRVhQRUNUX1RSVUUoTWF0aExpbWl0czxkb3VibGU+OjpJc05hTihtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMSkpKTsKKyAgRVhQRUNUX1RSVUUoTWF0aExpbWl0czxkb3VibGU+OjpJc05hTihtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgxMikpKTsKIAogICAvLyBOb3RlOiAgU2luY2UgdGhlc2Ugc3RyaW5nIGxpdGVyYWxzIGhhdmUgXDAncyBpbiB0aGVtLCB3ZSBtdXN0IGV4cGxpY2l0bHkKICAgLy8gICBwYXNzIHRoZWlyIHNpemVzIHRvIHN0cmluZydzIGNvbnN0cnVjdG9yLgpAQCAtNzA1LDExICs5MTIsMzIgQEAKICAgICAgICAgICAgIG1lc3NhZ2UucmVwZWF0ZWRfc3RyaW5nKDApKTsKIH0KIAorVEVTVF9GKFRleHRGb3JtYXRUZXN0LCBQcmludEZpZWxkc0luSW5kZXhPcmRlcikgeworICBwcm90b2J1Zl91bml0dGVzdDo6VGVzdEZpZWxkT3JkZXJpbmdzIG1lc3NhZ2U7CisgIC8vIEZpZWxkcyBhcmUgbGlzdGVkIGluIGluZGV4IG9yZGVyIGluc3RlYWQgb2YgZmllbGQgbnVtYmVyLgorICBtZXNzYWdlLnNldF9teV9zdHJpbmcoIlRlc3QgU3RyaW5nIik7ICAgLy8gRmllbGQgbnVtYmVyIDExCisgIG1lc3NhZ2Uuc2V0X215X2ludCgxMjM0NSk7ICAgICAgICAgICAgICAvLyBGaWVsZCBudW1iZXIgMQorICBtZXNzYWdlLnNldF9teV9mbG9hdCgwLjk5OSk7ICAgICAgICAgICAgLy8gRmllbGQgbnVtYmVyIDEwMQorICBUZXh0Rm9ybWF0OjpQcmludGVyIHByaW50ZXI7CisgIHN0cmluZyB0ZXh0OworCisgIC8vIEJ5IGRlZmF1bHQsIHByaW50IGluIGZpZWxkIG51bWJlciBvcmRlci4KKyAgcHJpbnRlci5QcmludFRvU3RyaW5nKG1lc3NhZ2UsICZ0ZXh0KTsKKyAgRVhQRUNUX0VRKCJteV9pbnQ6IDEyMzQ1XG5teV9zdHJpbmc6IFwiVGVzdCBTdHJpbmdcIlxubXlfZmxvYXQ6IDAuOTk5XG4iLAorICAgICAgICAgICAgdGV4dCk7CisKKyAgLy8gUHJpbnQgaW4gaW5kZXggb3JkZXIuCisgIHByaW50ZXIuU2V0UHJpbnRNZXNzYWdlRmllbGRzSW5JbmRleE9yZGVyKHRydWUpOworICBwcmludGVyLlByaW50VG9TdHJpbmcobWVzc2FnZSwgJnRleHQpOworICBFWFBFQ1RfRVEoIm15X3N0cmluZzogXCJUZXN0IFN0cmluZ1wiXG5teV9pbnQ6IDEyMzQ1XG5teV9mbG9hdDogMC45OTlcbiIsCisgICAgICAgICAgICB0ZXh0KTsKK30KKwogY2xhc3MgVGV4dEZvcm1hdFBhcnNlclRlc3QgOiBwdWJsaWMgdGVzdGluZzo6VGVzdCB7CiAgcHJvdGVjdGVkOgogICB2b2lkIEV4cGVjdEZhaWx1cmUoY29uc3Qgc3RyaW5nJiBpbnB1dCwgY29uc3Qgc3RyaW5nJiBtZXNzYWdlLCBpbnQgbGluZSwKICAgICAgICAgICAgICAgICAgICAgIGludCBjb2wpIHsKLSAgICBzY29wZWRfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IHByb3RvKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKKyAgICBnb29nbGU6OnByb3RvYnVmOjpzY29wZWRfcHRyPHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXM+IHByb3RvKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKICAgICBFeHBlY3RGYWlsdXJlKGlucHV0LCBtZXNzYWdlLCBsaW5lLCBjb2wsIHByb3RvLmdldCgpKTsKICAgfQogCkBAIC03MjMsMTEgKzk1MSwzMSBAQAogICAgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CiAgICAgTW9ja0Vycm9yQ29sbGVjdG9yIGVycm9yX2NvbGxlY3RvcjsKICAgICBwYXJzZXIuUmVjb3JkRXJyb3JzVG8oJmVycm9yX2NvbGxlY3Rvcik7Ci0gICAgRVhQRUNUX0VRKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoaW5wdXQsIHByb3RvKSwgZXhwZWN0ZWRfcmVzdWx0KTsKKyAgICBFWFBFQ1RfRVEoZXhwZWN0ZWRfcmVzdWx0LCBwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKGlucHV0LCBwcm90bykpCisgICAgICAgIDw8IGlucHV0IDw8ICIgLT4gIiA8PCBwcm90by0+RGVidWdTdHJpbmcoKTsKICAgICBFWFBFQ1RfRVEoU2ltcGxlSXRvYShsaW5lKSArICI6IiArIFNpbXBsZUl0b2EoY29sKSArICI6ICIgKyBtZXNzYWdlICsgIlxuIiwKICAgICAgICAgICAgICAgZXJyb3JfY29sbGVjdG9yLnRleHRfKTsKICAgfQogCisgIHZvaWQgRXhwZWN0U3VjY2Vzc0FuZFRyZWUoY29uc3Qgc3RyaW5nJiBpbnB1dCwgTWVzc2FnZSogcHJvdG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogaW5mb190cmVlKSB7CisgICAgVGV4dEZvcm1hdDo6UGFyc2VyIHBhcnNlcjsKKyAgICBNb2NrRXJyb3JDb2xsZWN0b3IgZXJyb3JfY29sbGVjdG9yOworICAgIHBhcnNlci5SZWNvcmRFcnJvcnNUbygmZXJyb3JfY29sbGVjdG9yKTsKKyAgICBwYXJzZXIuV3JpdGVMb2NhdGlvbnNUbyhpbmZvX3RyZWUpOworCisgICAgRVhQRUNUX1RSVUUocGFyc2VyLlBhcnNlRnJvbVN0cmluZyhpbnB1dCwgcHJvdG8pKTsKKyAgfQorCisgIHZvaWQgRXhwZWN0TG9jYXRpb24oVGV4dEZvcm1hdDo6UGFyc2VJbmZvVHJlZSogdHJlZSwKKyAgICAgICAgICAgICAgICAgICAgICBjb25zdCBEZXNjcmlwdG9yKiBkLCBjb25zdCBzdHJpbmcmIGZpZWxkX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgaW50IGluZGV4LCBpbnQgbGluZSwgaW50IGNvbHVtbikgeworICAgIFRleHRGb3JtYXQ6OlBhcnNlTG9jYXRpb24gbG9jYXRpb24gPSB0cmVlLT5HZXRMb2NhdGlvbigKKyAgICAgICAgZC0+RmluZEZpZWxkQnlOYW1lKGZpZWxkX25hbWUpLCBpbmRleCk7CisgICAgRVhQRUNUX0VRKGxpbmUsIGxvY2F0aW9uLmxpbmUpOworICAgIEVYUEVDVF9FUShjb2x1bW4sIGxvY2F0aW9uLmNvbHVtbik7CisgIH0KKwogICAvLyBBbiBlcnJvciBjb2xsZWN0b3Igd2hpY2ggc2ltcGx5IGNvbmNhdGVuYXRlcyBhbGwgaXRzIGVycm9ycyBpbnRvIGEgYmlnCiAgIC8vIGJsb2NrIG9mIHRleHQgd2hpY2ggY2FuIGJlIGNoZWNrZWQuCiAgIGNsYXNzIE1vY2tFcnJvckNvbGxlY3RvciA6IHB1YmxpYyBpbzo6RXJyb3JDb2xsZWN0b3IgewpAQCAtNzQ5LDggKzk5Nyw3MyBAQAogICB9OwogfTsKIAorVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZUluZm9UcmVlQnVpbGRpbmcpIHsKKyAgZ29vZ2xlOjpwcm90b2J1Zjo6c2NvcGVkX3B0cjx1bml0dGVzdDo6VGVzdEFsbFR5cGVzPiBtZXNzYWdlKG5ldyB1bml0dGVzdDo6VGVzdEFsbFR5cGVzKTsKKyAgY29uc3QgRGVzY3JpcHRvciogZCA9IG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKTsKKworICBzdHJpbmcgc3RyaW5nRGF0YSA9CisgICAgICAib3B0aW9uYWxfaW50MzI6IDFcbiIKKyAgICAgICJvcHRpb25hbF9pbnQ2NDogMlxuIgorICAgICAgIiAgb3B0aW9uYWxfZG91YmxlOiAyLjRcbiIKKyAgICAgICJyZXBlYXRlZF9pbnQzMjogNVxuIgorICAgICAgInJlcGVhdGVkX2ludDMyOiAxMFxuIgorICAgICAgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIDxcbiIKKyAgICAgICIgIGJiOiA3OFxuIgorICAgICAgIj5cbiIKKyAgICAgICJyZXBlYXRlZF9uZXN0ZWRfbWVzc2FnZSA8XG4iCisgICAgICAiICBiYjogNzlcbiIKKyAgICAgICI+XG4iCisgICAgICAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UgPFxuIgorICAgICAgIiAgYmI6IDgwXG4iCisgICAgICAiPiI7CisKKworICBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlIHRyZWU7CisgIEV4cGVjdFN1Y2Nlc3NBbmRUcmVlKHN0cmluZ0RhdGEsIG1lc3NhZ2UuZ2V0KCksICZ0cmVlKTsKKworICAvLyBWZXJpZnkgdGhhdCB0aGUgdHJlZSBoYXMgdGhlIGNvcnJlY3QgcG9zaXRpb25zLgorICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgIm9wdGlvbmFsX2ludDMyIiwgLTEsIDAsIDApOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgIm9wdGlvbmFsX2ludDY0IiwgLTEsIDEsIDApOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgIm9wdGlvbmFsX2RvdWJsZSIsIC0xLCAyLCAyKTsKKworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgInJlcGVhdGVkX2ludDMyIiwgMCwgMywgMCk7CisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfaW50MzIiLCAxLCA0LCAwKTsKKworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgIm9wdGlvbmFsX25lc3RlZF9tZXNzYWdlIiwgLTEsIDUsIDApOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgInJlcGVhdGVkX25lc3RlZF9tZXNzYWdlIiwgMCwgOCwgMCk7CisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiLCAxLCAxMSwgMCk7CisKKyAgLy8gQ2hlY2sgZm9yIGZpZWxkcyBub3Qgc2V0LiBGb3IgYW4gaW52YWxpZCBmaWVsZCwgdGhlIGxvY2F0aW9uIHJldHVybmVkCisgIC8vIHNob3VsZCBiZSAtMSwgLTEuCisgIEV4cGVjdExvY2F0aW9uKCZ0cmVlLCBkLCAicmVwZWF0ZWRfaW50NjQiLCAwLCAtMSwgLTEpOworICBFeHBlY3RMb2NhdGlvbigmdHJlZSwgZCwgInJlcGVhdGVkX2ludDMyIiwgNiwgLTEsIC0xKTsKKyAgRXhwZWN0TG9jYXRpb24oJnRyZWUsIGQsICJzb21lX3Vua25vd25fZmllbGQiLCAtMSwgLTEsIC0xKTsKKworICAvLyBWZXJpZnkgaW5zaWRlIHRoZSBuZXN0ZWQgbWVzc2FnZS4KKyAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBuZXN0ZWRfZmllbGQgPQorICAgICAgZC0+RmluZEZpZWxkQnlOYW1lKCJvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSIpOworCisgIFRleHRGb3JtYXQ6OlBhcnNlSW5mb1RyZWUqIG5lc3RlZF90cmVlID0KKyAgICAgIHRyZWUuR2V0VHJlZUZvck5lc3RlZChuZXN0ZWRfZmllbGQsIC0xKTsKKyAgRXhwZWN0TG9jYXRpb24obmVzdGVkX3RyZWUsIG5lc3RlZF9maWVsZC0+bWVzc2FnZV90eXBlKCksICJiYiIsIC0xLCA2LCAyKTsKKworICAvLyBWZXJpZnkgaW5zaWRlIGFub3RoZXIgbmVzdGVkIG1lc3NhZ2UuCisgIG5lc3RlZF9maWVsZCA9IGQtPkZpbmRGaWVsZEJ5TmFtZSgicmVwZWF0ZWRfbmVzdGVkX21lc3NhZ2UiKTsKKyAgbmVzdGVkX3RyZWUgPSB0cmVlLkdldFRyZWVGb3JOZXN0ZWQobmVzdGVkX2ZpZWxkLCAwKTsKKyAgRXhwZWN0TG9jYXRpb24obmVzdGVkX3RyZWUsIG5lc3RlZF9maWVsZC0+bWVzc2FnZV90eXBlKCksICJiYiIsIC0xLCA5LCAyKTsKKworICBuZXN0ZWRfdHJlZSA9IHRyZWUuR2V0VHJlZUZvck5lc3RlZChuZXN0ZWRfZmllbGQsIDEpOworICBFeHBlY3RMb2NhdGlvbihuZXN0ZWRfdHJlZSwgbmVzdGVkX2ZpZWxkLT5tZXNzYWdlX3R5cGUoKSwgImJiIiwgLTEsIDEyLCAyKTsKKworICAvLyBWZXJpZnkgYSBOVUxMIHRyZWUgZm9yIGFuIHVua25vd24gbmVzdGVkIGZpZWxkLgorICBUZXh0Rm9ybWF0OjpQYXJzZUluZm9UcmVlKiB1bmtub3duX25lc3RlZF90cmVlID0KKyAgICAgIHRyZWUuR2V0VHJlZUZvck5lc3RlZChuZXN0ZWRfZmllbGQsIDIpOworCisgIEVYUEVDVF9FUShOVUxMLCB1bmtub3duX25lc3RlZF90cmVlKTsKK30KKwogVEVTVF9GKFRleHRGb3JtYXRQYXJzZXJUZXN0LCBQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKSB7Ci0gIHNjb3BlZF9wdHI8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4gbWVzc2FnZShuZXcgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyk7CisgIGdvb2dsZTo6cHJvdG9idWY6OnNjb3BlZF9wdHI8dW5pdHRlc3Q6OlRlc3RBbGxUeXBlcz4gbWVzc2FnZShuZXcgdW5pdHRlc3Q6OlRlc3RBbGxUeXBlcyk7CiAgIGNvbnN0IERlc2NyaXB0b3IqIGQgPSBtZXNzYWdlLT5HZXREZXNjcmlwdG9yKCk7CiAKICNkZWZpbmUgRVhQRUNUX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgXApAQCAtNzU5LDYgKzEwNzIsMTIgQEAKICAgRVhQRUNUX0VRKHZhbHVlLCBtZXNzYWdlLT5vcHRpb25hbF8jI25hbWUoKSk7IFwKICAgRVhQRUNUX1RSVUUobWVzc2FnZS0+aGFzX29wdGlvbmFsXyMjbmFtZSgpKTsKIAorI2RlZmluZSBFWFBFQ1RfQk9PTF9GSUVMRChuYW1lLCB2YWx1ZSwgdmFsdWVzdHJpbmcpIFwKKyAgRVhQRUNUX1RSVUUoVGV4dEZvcm1hdDo6UGFyc2VGaWVsZFZhbHVlRnJvbVN0cmluZyggXAorICAgIHZhbHVlc3RyaW5nLCBkLT5GaW5kRmllbGRCeU5hbWUoIm9wdGlvbmFsXyIgI25hbWUpLCBtZXNzYWdlLmdldCgpKSk7IFwKKyAgRVhQRUNUX1RSVUUobWVzc2FnZS0+b3B0aW9uYWxfIyNuYW1lKCkgPT0gdmFsdWUpOyBcCisgIEVYUEVDVF9UUlVFKG1lc3NhZ2UtPmhhc19vcHRpb25hbF8jI25hbWUoKSk7CisKICNkZWZpbmUgRVhQRUNUX0ZMT0FUX0ZJRUxEKG5hbWUsIHZhbHVlLCB2YWx1ZXN0cmluZykgXAogICBFWFBFQ1RfVFJVRShUZXh0Rm9ybWF0OjpQYXJzZUZpZWxkVmFsdWVGcm9tU3RyaW5nKCBcCiAgICAgdmFsdWVzdHJpbmcsIGQtPkZpbmRGaWVsZEJ5TmFtZSgib3B0aW9uYWxfIiAjbmFtZSksIG1lc3NhZ2UuZ2V0KCkpKTsgXApAQCAtODE2LDE3ICsxMTM1LDIwIEBACiAgIEVYUEVDVF9JTlZBTElEKGZpeGVkNjQsICIxLDIiKTsKIAogICAvLyBib29sCi0gIEVYUEVDVF9GSUVMRChib29sLCB0cnVlLCAidHJ1ZSIpOwotICBFWFBFQ1RfRklFTEQoYm9vbCwgZmFsc2UsICJmYWxzZSIpOwotICBFWFBFQ1RfRklFTEQoYm9vbCwgdHJ1ZSwgIjEiKTsKLSAgRVhQRUNUX0ZJRUxEKGJvb2wsIHRydWUsICJ0Iik7Ci0gIEVYUEVDVF9GSUVMRChib29sLCBmYWxzZSwgIjAiKTsKLSAgRVhQRUNUX0ZJRUxEKGJvb2wsIGZhbHNlLCAiZiIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCB0cnVlLCAidHJ1ZSIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCBmYWxzZSwgImZhbHNlIik7CisgIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIHRydWUsICIxIik7CisgIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIHRydWUsICJ0Iik7CisgIEVYUEVDVF9CT09MX0ZJRUxEKGJvb2wsIGZhbHNlLCAiMCIpOworICBFWFBFQ1RfQk9PTF9GSUVMRChib29sLCBmYWxzZSwgImYiKTsKKyAgRVhQRUNUX0ZJRUxEKGJvb2wsIHRydWUsICJUcnVlIik7CisgIEVYUEVDVF9GSUVMRChib29sLCBmYWxzZSwgIkZhbHNlIik7CisgIEVYUEVDVF9JTlZBTElEKGJvb2wsICJ0UnVlIik7CisgIEVYUEVDVF9JTlZBTElEKGJvb2wsICJmYUxzZSIpOwogICBFWFBFQ1RfSU5WQUxJRChib29sLCAiMiIpOwogICBFWFBFQ1RfSU5WQUxJRChib29sLCAiLTAiKTsKICAgRVhQRUNUX0lOVkFMSUQoYm9vbCwgIm9uIik7CiAgIEVYUEVDVF9JTlZBTElEKGJvb2wsICJhIik7Ci0gIEVYUEVDVF9JTlZBTElEKGJvb2wsICJUcnVlIik7CiAKICAgLy8gZmxvYXQKICAgRVhQRUNUX0ZJRUxEKGZsb2F0LCAxLCAiMSIpOwpAQCAtODQzLDYgKzExNjUsOSBAQAogICBFWFBFQ1RfRE9VQkxFX0ZJRUxEKGRvdWJsZSwgM2U1LCAiM2U1Iik7CiAgIEVYUEVDVF9JTlZBTElEKGRvdWJsZSwgImEiKTsKICAgRVhQRUNUX0lOVkFMSUQoZG91YmxlLCAiMSwyIik7CisgIC8vIFJlamVjdHMgaGV4IGFuZCBvY3QgbnVtYmVycyBmb3IgYSBkb3VibGUgZmllbGQuCisgIEVYUEVDVF9JTlZBTElEKGRvdWJsZSwgIjB4ZiIpOworICBFWFBFQ1RfSU5WQUxJRChkb3VibGUsICIwMTIiKTsKIAogICAvLyBzdHJpbmcKICAgRVhQRUNUX0ZJRUxEKHN0cmluZywgImhlbGxvIiwgIlwiaGVsbG9cIiIpOwpAQCAtODYzLDYgKzExODgsNyBAQAogICBFWFBFQ1RfSU5WQUxJRChuZXN0ZWRfbWVzc2FnZSwgImFueSIpOwogCiAjdW5kZWYgRVhQRUNUX0ZJRUxECisjdW5kZWYgRVhQRUNUX0JPT0xfRklFTEQKICN1bmRlZiBFWFBFQ1RfRkxPQVRfRklFTEQKICN1bmRlZiBFWFBFQ1RfRE9VQkxFX0ZJRUxECiAjdW5kZWYgRVhQRUNUX0lOVkFMSUQKQEAgLTkwNCw2ICsxMjMwLDIyIEBACiAgICAgICAxLCAxNik7CiB9CiAKK1RFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgQWxsb3dJZ25vcmVDYXBpdGFsaXphdGlvbkVycm9yKSB7CisgIFRleHRGb3JtYXQ6OlBhcnNlciBwYXJzZXI7CisgIHByb3RvYnVmX3VuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgcHJvdG87CisKKyAgLy8gVGhlc2UgZmllbGRzIGhhdmUgYSBtaXNtYXRjaGluZyBjYXNlLgorICBFWFBFQ1RfRkFMU0UocGFyc2VyLlBhcnNlRnJvbVN0cmluZygiT3B0aW9uYWxfRG91YmxlOiAxMC4wIiwgJnByb3RvKSk7CisgIEVYUEVDVF9GQUxTRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJvUHRJb05hTGdSb1VwIHsgYTogMTUgfSIsICZwcm90bykpOworCisgIC8vIC4uLiBidXQgYXJlIHBhcnNlZCBjb3JyZWN0bHkgaWYgd2UgbWF0Y2ggY2FzZSBpbnNlbnNpdGl2ZS4KKyAgcGFyc2VyLkFsbG93Q2FzZUluc2Vuc2l0aXZlRmllbGQodHJ1ZSk7CisgIEVYUEVDVF9UUlVFKHBhcnNlci5QYXJzZUZyb21TdHJpbmcoIk9wdGlvbmFsX0RvdWJsZTogMTAuMCIsICZwcm90bykpOworICBFWFBFQ1RfRVEoMTAuMCwgcHJvdG8ub3B0aW9uYWxfZG91YmxlKCkpOworICBFWFBFQ1RfVFJVRShwYXJzZXIuUGFyc2VGcm9tU3RyaW5nKCJvUHRJb05hTGdSb1VwIHsgYTogMTUgfSIsICZwcm90bykpOworICBFWFBFQ1RfRVEoMTUsIHByb3RvLm9wdGlvbmFsZ3JvdXAoKS5hKCkpOworfQorCiBURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIEludmFsaWRGaWVsZFZhbHVlcykgewogICAvLyBJbnZhbGlkIHZhbHVlcyBmb3IgYSBkb3VibGUvZmxvYXQgZmllbGQuCiAgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2RvdWJsZTogXCJoZWxsb1wiXG4iLCAiRXhwZWN0ZWQgZG91YmxlLiIsIDEsIDE4KTsKQEAgLTkyMSwxMCArMTI2MywxMCBAQAogICAgICAgICAgICAgICAgIDEsIDE2KTsKICAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IDB4ODAwMDAwMDBcbiIsCiAgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE3KTsKLSAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IC0weDgwMDAwMDAxXG4iLAotICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxOCk7CiAgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDY0OiAweDgwMDAwMDAwMDAwMDAwMDBcbiIsCiAgICAgICAgICAgICAgICAgIkludGVnZXIgb3V0IG9mIHJhbmdlLiIsIDEsIDE3KTsKKyAgRXhwZWN0RmFpbHVyZSgib3B0aW9uYWxfaW50MzI6IC0weDgwMDAwMDAxXG4iLAorICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxOCk7CiAgIEV4cGVjdEZhaWx1cmUoIm9wdGlvbmFsX2ludDY0OiAtMHg4MDAwMDAwMDAwMDAwMDAxXG4iLAogICAgICAgICAgICAgICAgICJJbnRlZ2VyIG91dCBvZiByYW5nZS4iLCAxLCAxOCk7CiAKQEAgLTk4NywxMiArMTMyOSwxMiBAQAogICAgICAgIkV4cGVjdGVkIFwiOlwiLCBmb3VuZCBcIntcIi4iLCAxLCAyMik7CiB9CiAKLVRFU1RfRihUZXh0Rm9ybWF0UGFyc2VyVGVzdCwgTWVzc2FnZURlbGltZXRlcnMpIHsKLSAgLy8gTm9uLW1hdGNoaW5nIGRlbGltZXRlcnMuCitURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIE1lc3NhZ2VEZWxpbWl0ZXJzKSB7CisgIC8vIE5vbi1tYXRjaGluZyBkZWxpbWl0ZXJzLgogICBFeHBlY3RGYWlsdXJlKCJPcHRpb25hbEdyb3VwIDxcbiBcbn1cbiIsICJFeHBlY3RlZCBcIj5cIiwgZm91bmQgXCJ9XCIuIiwKICAgICAgICAgICAgICAgICAzLCAxKTsKIAotICAvLyBJbnZhbGlkIGRlbGltZXRlcnMuCisgIC8vIEludmFsaWQgZGVsaW1pdGVycy4KICAgRXhwZWN0RmFpbHVyZSgiT3B0aW9uYWxHcm91cCBbXG4gXG5dXG4iLCAiRXhwZWN0ZWQgXCJ7XCIsIGZvdW5kIFwiW1wiLiIsCiAgICAgICAgICAgICAgICAgMSwgMTUpOwogCkBAIC0xMDAzLDcgKzEzNDUsNyBAQAogfQogCiBURVNUX0YoVGV4dEZvcm1hdFBhcnNlclRlc3QsIFVua25vd25FeHRlbnNpb24pIHsKLSAgLy8gTm9uLW1hdGNoaW5nIGRlbGltZXRlcnMuCisgIC8vIE5vbi1tYXRjaGluZyBkZWxpbWl0ZXJzLgogICBFeHBlY3RGYWlsdXJlKCJbYmxhaGJsYWhdOiAxMjMiLAogICAgICAgICAgICAgICAgICJFeHRlbnNpb24gXCJibGFoYmxhaFwiIGlzIG5vdCBkZWZpbmVkIG9yIGlzIG5vdCBhbiAiCiAgICAgICAgICAgICAgICAgImV4dGVuc2lvbiBvZiBcInByb3RvYnVmX3VuaXR0ZXN0LlRlc3RBbGxUeXBlc1wiLiIsCkBAIC0xMTM2LDYgKzE0NzgsNyBAQAogICBFWFBFQ1RfRVEoMiwgZGVzY3JpcHRvcnMuc2l6ZSgpKTsKIH0KIAorCiB9ICAvLyBuYW1lc3BhY2UgdGV4dF9mb3JtYXRfdW5pdHRlc3QKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi90aW1lc3RhbXAucGIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnBiLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3RpbWVzdGFtcC5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdGltZXN0YW1wLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90eXBlLnBiLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucGIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdHlwZS5wYi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi90eXBlLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3R5cGUucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8KaW5kZXggOTdlYzY3NC4uZGE1NmFlMCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3QucHJvdG8KQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM0LDEyICszNCwxNCBAQAogLy8KIC8vIEEgcHJvdG8gZmlsZSB3ZSB3aWxsIHVzZSBmb3IgdW5pdCB0ZXN0aW5nLgogCitzeW50YXggPSAicHJvdG8yIjsKIAogLy8gU29tZSBnZW5lcmljX3NlcnZpY2VzIG9wdGlvbihzKSBhZGRlZCBhdXRvbWF0aWNhbGx5LgogLy8gU2VlOiAgaHR0cDovL2dvL3Byb3RvMi1nZW5lcmljLXNlcnZpY2VzLWRlZmF1bHQKIG9wdGlvbiBjY19nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKIG9wdGlvbiBqYXZhX2dlbmVyaWNfc2VydmljZXMgPSB0cnVlOyAgIC8vIGF1dG8tYWRkZWQKIG9wdGlvbiBweV9nZW5lcmljX3NlcnZpY2VzID0gdHJ1ZTsgICAgIC8vIGF1dG8tYWRkZWQKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKIAogaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvIjsKIApAQCAtNjksNiArNzEsNyBAQAogICAgIEZPTyA9IDE7CiAgICAgQkFSID0gMjsKICAgICBCQVogPSAzOworICAgIE5FRyA9IC0xOyAgLy8gSW50ZW50aW9uYWxseSBuZWdhdGl2ZS4KICAgfQogCiAgIC8vIFNpbmd1bGFyCkBAIC0xMDMsNiArMTA2LDEyIEBACiAgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9zdHJpbmdfcGllY2UgPSAyNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKICAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmQgPSAyNSBbY3R5cGU9Q09SRF07CiAKKyAgLy8gRGVmaW5lZCBpbiB1bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvCisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJbXBvcnRNZXNzYWdlCisgICAgICBvcHRpb25hbF9wdWJsaWNfaW1wb3J0X21lc3NhZ2UgPSAyNjsKKworICBvcHRpb25hbCBOZXN0ZWRNZXNzYWdlIG9wdGlvbmFsX2xhenlfbWVzc2FnZSA9IDI3IFtsYXp5PXRydWVdOworCiAgIC8vIFJlcGVhdGVkCiAgIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyICAgID0gMzE7CiAgIHJlcGVhdGVkICAgIGludDY0IHJlcGVhdGVkX2ludDY0ICAgID0gMzI7CkBAIC0xMzUsNiArMTQ0LDggQEAKICAgcmVwZWF0ZWQgc3RyaW5nIHJlcGVhdGVkX3N0cmluZ19waWVjZSA9IDU0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOwogICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZCA9IDU1IFtjdHlwZT1DT1JEXTsKIAorICByZXBlYXRlZCBOZXN0ZWRNZXNzYWdlIHJlcGVhdGVkX2xhenlfbWVzc2FnZSA9IDU3IFtsYXp5PXRydWVdOworCiAgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKICAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CiAgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjQgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOwpAQCAtMTU5LDYgKzE3MCwyMSBAQAogCiAgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X3N0cmluZ19waWVjZSA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsZGVmYXVsdD0iYWJjIl07CiAgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmQgPSA4NSBbY3R5cGU9Q09SRCxkZWZhdWx0PSIxMjMiXTsKKworICAvLyBGb3Igb25lb2YgdGVzdAorICBvbmVvZiBvbmVvZl9maWVsZCB7CisgICAgdWludDMyIG9uZW9mX3VpbnQzMiA9IDExMTsKKyAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlID0gMTEyOworICAgIHN0cmluZyBvbmVvZl9zdHJpbmcgPSAxMTM7CisgICAgYnl0ZXMgb25lb2ZfYnl0ZXMgPSAxMTQ7CisgIH0KK30KKworLy8gVGhpcyBwcm90byBpbmNsdWRlcyBhIHJlY3VzaXZlbHkgbmVzdGVkIG1lc3NhZ2UuCittZXNzYWdlIE5lc3RlZFRlc3RBbGxUeXBlcyB7CisgIG9wdGlvbmFsIE5lc3RlZFRlc3RBbGxUeXBlcyBjaGlsZCA9IDE7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBwYXlsb2FkID0gMjsKKyAgcmVwZWF0ZWQgTmVzdGVkVGVzdEFsbFR5cGVzIHJlcGVhdGVkX2NoaWxkID0gMzsKIH0KIAogbWVzc2FnZSBUZXN0RGVwcmVjYXRlZEZpZWxkcyB7CkBAIC0xNzcsNiArMjAzLDExIEBACiAgIEZPUkVJR05fQkFaID0gNjsKIH0KIAorbWVzc2FnZSBUZXN0UmVzZXJ2ZWRGaWVsZHMgeworICByZXNlcnZlZCAyLCAxNSwgOSB0byAxMTsKKyAgcmVzZXJ2ZWQgImJhciIsICJiYXoiOworfQorCiBtZXNzYWdlIFRlc3RBbGxFeHRlbnNpb25zIHsKICAgZXh0ZW5zaW9ucyAxIHRvIG1heDsKIH0KQEAgLTIxNiw2ICsyNDcsMTIgQEAKICAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX3N0cmluZ19waWVjZV9leHRlbnNpb24gPSAyNCBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKICAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uID0gMjUgW2N0eXBlPUNPUkRdOwogCisgIG9wdGlvbmFsIHByb3RvYnVmX3VuaXR0ZXN0X2ltcG9ydC5QdWJsaWNJbXBvcnRNZXNzYWdlCisgICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbiA9IDI2OworCisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcy5OZXN0ZWRNZXNzYWdlCisgICAgb3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbiA9IDI3IFtsYXp5PXRydWVdOworCiAgIC8vIFJlcGVhdGVkCiAgIHJlcGVhdGVkICAgIGludDMyIHJlcGVhdGVkX2ludDMyX2V4dGVuc2lvbiAgICA9IDMxOwogICByZXBlYXRlZCAgICBpbnQ2NCByZXBlYXRlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAzMjsKQEAgLTI1MCw2ICsyODcsOSBAQAogICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiA9IDU0IFtjdHlwZT1TVFJJTkdfUElFQ0VdOwogICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfY29yZF9leHRlbnNpb24gPSA1NSBbY3R5cGU9Q09SRF07CiAKKyAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzLk5lc3RlZE1lc3NhZ2UKKyAgICByZXBlYXRlZF9sYXp5X21lc3NhZ2VfZXh0ZW5zaW9uID0gNTcgW2xhenk9dHJ1ZV07CisKICAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cwogICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyX2V4dGVuc2lvbiAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CiAgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uICAgID0gNjIgW2RlZmF1bHQgPSAgNDIgICAgXTsKQEAgLTI3Nyw2ICszMTcsMTIgQEAKICAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlX2V4dGVuc2lvbiA9IDg0IFtjdHlwZT1TVFJJTkdfUElFQ0UsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJjIl07CiAgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uID0gODUgW2N0eXBlPUNPUkQsIGRlZmF1bHQ9IjEyMyJdOworCisgIC8vIEZvciBvbmVvZiB0ZXN0CisgIG9wdGlvbmFsIHVpbnQzMiBvbmVvZl91aW50MzJfZXh0ZW5zaW9uID0gMTExOworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMuTmVzdGVkTWVzc2FnZSBvbmVvZl9uZXN0ZWRfbWVzc2FnZV9leHRlbnNpb24gPSAxMTI7CisgIG9wdGlvbmFsIHN0cmluZyBvbmVvZl9zdHJpbmdfZXh0ZW5zaW9uID0gMTEzOworICBvcHRpb25hbCBieXRlcyBvbmVvZl9ieXRlc19leHRlbnNpb24gPSAxMTQ7CiB9CiAKIG1lc3NhZ2UgVGVzdE5lc3RlZEV4dGVuc2lvbiB7CkBAIC0yODQsNiArMzMwLDkgQEAKICAgICAvLyBDaGVjayBmb3IgYnVnIHdoZXJlIHN0cmluZyBleHRlbnNpb25zIGRlY2xhcmVkIGluIHRlc3RlZCBzY29wZSBkaWQgbm90CiAgICAgLy8gY29tcGlsZS4KICAgICBvcHRpb25hbCBzdHJpbmcgdGVzdCA9IDEwMDIgW2RlZmF1bHQ9InRlc3QiXTsKKyAgICAvLyBVc2VkIHRvIHRlc3QgaWYgZ2VuZXJhdGVkIGV4dGVuc2lvbiBuYW1lIGlzIGNvcnJlY3Qgd2hlbiB0aGVyZSBhcmUKKyAgICAvLyB1bmRlcnNjb3Jlcy4KKyAgICBvcHRpb25hbCBzdHJpbmcgbmVzdGVkX3N0cmluZ19leHRlbnNpb24gPSAxMDAzOwogICB9CiB9CiAKQEAgLTM4OCw3ICs0MzcsNyBAQAogfQogCiAvLyBUZXN0IHRoYXQgZ3JvdXBzIGhhdmUgZGlzam9pbnQgZmllbGQgbnVtYmVycyBmcm9tIHRoZWlyIHNpYmxpbmdzIGFuZAotLy8gcGFyZW50cy4gIFRoaXMgaXMgTk9UIHBvc3NpYmxlIGluIHByb3RvMTsgb25seSBwcm90bzIuICBXaGVuIGF0dGVtcHRpbmcKKy8vIHBhcmVudHMuICBUaGlzIGlzIE5PVCBwb3NzaWJsZSBpbiBwcm90bzE7IG9ubHkgZ29vZ2xlLnByb3RvYnVmLiAgV2hlbiBhdHRlbXB0aW5nCiAvLyB0byBjb21waWxlIHdpdGggcHJvdG8xLCB0aGlzIHdpbGwgZW1pdCBhbiBlcnJvcjsgc28gd2Ugb25seSBpbmNsdWRlIGl0CiAvLyBpbiBwcm90b2J1Zl91bml0dGVzdF9wcm90by4KIG1lc3NhZ2UgVGVzdER1cEZpZWxkTnVtYmVyIHsgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzEKQEAgLTM5Nyw2ICs0NDYsMTMgQEAKICAgb3B0aW9uYWwgZ3JvdXAgQmFyID0gMyB7IG9wdGlvbmFsIGludDMyIGEgPSAxOyB9ICAvLyBOT19QUk9UTzEKIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOT19QUk9UTzEKIAorLy8gQWRkaXRpb25hbCBtZXNzYWdlcyBmb3IgdGVzdGluZyBsYXp5IGZpZWxkcy4KK21lc3NhZ2UgVGVzdEVhZ2VyTWVzc2FnZSB7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBzdWJfbWVzc2FnZSA9IDEgW2xhenk9ZmFsc2VdOworfQorbWVzc2FnZSBUZXN0TGF6eU1lc3NhZ2UgeworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgc3ViX21lc3NhZ2UgPSAxIFtsYXp5PXRydWVdOworfQogCiAvLyBOZWVkZWQgZm9yIGEgUHl0aG9uIHRlc3QuCiBtZXNzYWdlIFRlc3ROZXN0ZWRNZXNzYWdlSGFzQml0cyB7CkBAIC00MTAsNiArNDY2LDggQEAKIAogLy8gVGVzdCBhbiBlbnVtIHRoYXQgaGFzIG11bHRpcGxlIHZhbHVlcyB3aXRoIHRoZSBzYW1lIG51bWJlci4KIGVudW0gVGVzdEVudW1XaXRoRHVwVmFsdWUgeworICBvcHRpb24gYWxsb3dfYWxpYXMgPSB0cnVlOworCiAgIEZPTzEgPSAxOwogICBCQVIxID0gMjsKICAgQkFaID0gMzsKQEAgLTQ1NSw2ICs1MTMsMTUgQEAKICAgb3B0aW9uYWwgaW50NjQgbXlfaW50ID0gMTsKICAgZXh0ZW5zaW9ucyAxMiB0byAxMDA7CiAgIG9wdGlvbmFsIGZsb2F0IG15X2Zsb2F0ID0gMTAxOworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIG9wdGlvbmFsIGludDY0IG9vID0gMjsKKyAgICAvLyBUaGUgZmllbGQgbmFtZSAiYiIgZmFpbHMgdG8gY29tcGlsZSBpbiBwcm90bzEgYmVjYXVzZSBpdCBjb25mbGljdHMgd2l0aAorICAgIC8vIGEgbG9jYWwgdmFyaWFibGUgbmFtZWQgImIiIGluIG9uZSBvZiB0aGUgZ2VuZXJhdGVkIG1ldGhvZHMuICBEb2guCisgICAgLy8gVGhpcyBmaWxlIG5lZWRzIHRvIGNvbXBpbGUgaW4gcHJvdG8xIHRvIHRlc3QgYmFja3dhcmRzLWNvbXBhdGliaWxpdHkuCisgICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOworICB9CisKKyAgb3B0aW9uYWwgTmVzdGVkTWVzc2FnZSBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZSAgPSAyMDA7CiB9CiAKIApAQCAtNDcwLDYgKzUzNyw4IEBACiAgIG9wdGlvbmFsIHVpbnQ2NCBsYXJnZV91aW50NjQgPSAzIFtkZWZhdWx0ID0gMHhGRkZGRkZGRkZGRkZGRkZGXTsKICAgb3B0aW9uYWwgIGludDMyIHNtYWxsX2ludDMyICA9IDQgW2RlZmF1bHQgPSAtMHg3RkZGRkZGRl07CiAgIG9wdGlvbmFsICBpbnQ2NCBzbWFsbF9pbnQ2NCAgPSA1IFtkZWZhdWx0ID0gLTB4N0ZGRkZGRkZGRkZGRkZGRl07CisgIG9wdGlvbmFsICBpbnQzMiByZWFsbHlfc21hbGxfaW50MzIgPSAyMSBbZGVmYXVsdCA9IC0weDgwMDAwMDAwXTsKKyAgb3B0aW9uYWwgIGludDY0IHJlYWxseV9zbWFsbF9pbnQ2NCA9IDIyIFtkZWZhdWx0ID0gLTB4ODAwMDAwMDAwMDAwMDAwMF07CiAKICAgLy8gVGhlIGRlZmF1bHQgdmFsdWUgaGVyZSBpcyBVVEYtOCBmb3IgIlx1MTIzNCIuICAoV2UgY291bGQgYWxzbyBqdXN0IHR5cGUKICAgLy8gdGhlIFVURi04IHRleHQgZGlyZWN0bHkgaW50byB0aGlzIHRleHQgZmlsZSByYXRoZXIgdGhhbiBlc2NhcGUgaXQsIGJ1dApAQCAtNTAwLDYgKzU2OSwxNSBAQAogICAvLyBOb3RlIHRoYXQgaW4gLnByb3RvIGZpbGUsICJcPyIgaXMgYSB2YWxpZCB3YXkgdG8gZXNjYXBlID8gaW4gc3RyaW5nCiAgIC8vIGxpdGVyYWxzLgogICBvcHRpb25hbCBzdHJpbmcgY3BwX3RyaWdyYXBoID0gMjAgW2RlZmF1bHQgPSAiPyBcPyA/PyBcPz8gXD8/PyA/Py8gP1w/LSJdOworCisgIC8vIFN0cmluZyBkZWZhdWx0cyBjb250YWluaW5nIHRoZSBjaGFyYWN0ZXIgJ1wwMDAnCisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfd2l0aF96ZXJvICAgICAgID0gMjMgW2RlZmF1bHQgPSAiaGVsXDAwMGxvIl07CisgIG9wdGlvbmFsICBieXRlcyBieXRlc193aXRoX3plcm8gICAgICAgID0gMjQgW2RlZmF1bHQgPSAid29yXDAwMGxkIl07CisgIG9wdGlvbmFsIHN0cmluZyBzdHJpbmdfcGllY2Vfd2l0aF96ZXJvID0gMjUgW2N0eXBlPVNUUklOR19QSUVDRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJcMDAwYyJdOworICBvcHRpb25hbCBzdHJpbmcgY29yZF93aXRoX3plcm8gICAgICAgICA9IDI2IFtjdHlwZT1DT1JELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0PSIxMlwwMDAzIl07CisgIG9wdGlvbmFsIHN0cmluZyByZXBsYWNlbWVudF9zdHJpbmcgICAgID0gMjcgW2RlZmF1bHQ9IiR7dW5rbm93bn0iXTsKIH0KIAogbWVzc2FnZSBTcGFyc2VFbnVtTWVzc2FnZSB7CkBAIC01MTEsMTAgKzU4OSwxMTQgQEAKICAgb3B0aW9uYWwgc3RyaW5nIGRhdGEgPSAxOwogfQogCittZXNzYWdlIE1vcmVTdHJpbmcgeworICByZXBlYXRlZCBzdHJpbmcgZGF0YSA9IDE7Cit9CisKIG1lc3NhZ2UgT25lQnl0ZXMgewogICBvcHRpb25hbCBieXRlcyBkYXRhID0gMTsKIH0KIAorbWVzc2FnZSBNb3JlQnl0ZXMgeworICByZXBlYXRlZCBieXRlcyBkYXRhID0gMTsKK30KKworLy8gVGVzdCBpbnQzMiwgdWludDMyLCBpbnQ2NCwgdWludDY0LCBhbmQgYm9vbCBhcmUgYWxsIGNvbXBhdGlibGUKK21lc3NhZ2UgSW50MzJNZXNzYWdlIHsKKyAgb3B0aW9uYWwgaW50MzIgZGF0YSA9IDE7Cit9CisKK21lc3NhZ2UgVWludDMyTWVzc2FnZSB7CisgIG9wdGlvbmFsIHVpbnQzMiBkYXRhID0gMTsKK30KKworbWVzc2FnZSBJbnQ2NE1lc3NhZ2UgeworICBvcHRpb25hbCBpbnQ2NCBkYXRhID0gMTsKK30KKworbWVzc2FnZSBVaW50NjRNZXNzYWdlIHsKKyAgb3B0aW9uYWwgdWludDY0IGRhdGEgPSAxOworfQorCittZXNzYWdlIEJvb2xNZXNzYWdlIHsKKyAgb3B0aW9uYWwgYm9vbCBkYXRhID0gMTsKK30KKworLy8gVGVzdCBvbmVvZnMuCittZXNzYWdlIFRlc3RPbmVvZiB7CisgIG9uZW9mIGZvbyB7CisgICAgaW50MzIgZm9vX2ludCA9IDE7CisgICAgc3RyaW5nIGZvb19zdHJpbmcgPSAyOworICAgIFRlc3RBbGxUeXBlcyBmb29fbWVzc2FnZSA9IDM7CisgICAgZ3JvdXAgRm9vR3JvdXAgPSA0IHsKKyAgICAgIG9wdGlvbmFsIGludDMyIGEgPSA1OworICAgICAgb3B0aW9uYWwgc3RyaW5nIGIgPSA2OworICAgIH0KKyAgfQorfQorCittZXNzYWdlIFRlc3RPbmVvZkJhY2t3YXJkc0NvbXBhdGlibGUgeworICBvcHRpb25hbCBpbnQzMiBmb29faW50ID0gMTsKKyAgb3B0aW9uYWwgc3RyaW5nIGZvb19zdHJpbmcgPSAyOworICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgZm9vX21lc3NhZ2UgPSAzOworICBvcHRpb25hbCBncm91cCBGb29Hcm91cCA9IDQgeworICAgIG9wdGlvbmFsIGludDMyIGEgPSA1OworICAgIG9wdGlvbmFsIHN0cmluZyBiID0gNjsKKyAgfQorfQorCittZXNzYWdlIFRlc3RPbmVvZjIgeworICBvbmVvZiBmb28geworICAgIGludDMyIGZvb19pbnQgPSAxOworICAgIHN0cmluZyBmb29fc3RyaW5nID0gMjsKKyAgICBzdHJpbmcgZm9vX2NvcmQgPSAzIFtjdHlwZT1DT1JEXTsKKyAgICBzdHJpbmcgZm9vX3N0cmluZ19waWVjZSA9IDQgW2N0eXBlPVNUUklOR19QSUVDRV07CisgICAgYnl0ZXMgZm9vX2J5dGVzID0gNTsKKyAgICBOZXN0ZWRFbnVtIGZvb19lbnVtID0gNjsKKyAgICBOZXN0ZWRNZXNzYWdlIGZvb19tZXNzYWdlID0gNzsKKyAgICBncm91cCBGb29Hcm91cCA9IDggeworICAgICAgb3B0aW9uYWwgaW50MzIgYSA9IDk7CisgICAgICBvcHRpb25hbCBzdHJpbmcgYiA9IDEwOworICAgIH0KKyAgICBOZXN0ZWRNZXNzYWdlIGZvb19sYXp5X21lc3NhZ2UgPSAxMSBbbGF6eT10cnVlXTsKKyAgfQorCisgIG9uZW9mIGJhciB7CisgICAgaW50MzIgYmFyX2ludCA9IDEyIFtkZWZhdWx0ID0gNV07CisgICAgc3RyaW5nIGJhcl9zdHJpbmcgPSAxMyBbZGVmYXVsdCA9ICJTVFJJTkciXTsKKyAgICBzdHJpbmcgYmFyX2NvcmQgPSAxNCBbY3R5cGU9Q09SRCwgZGVmYXVsdCA9ICJDT1JEIl07CisgICAgc3RyaW5nIGJhcl9zdHJpbmdfcGllY2UgPSAxNSBbY3R5cGU9U1RSSU5HX1BJRUNFLCBkZWZhdWx0ID0gIlNQSUVDRSJdOworICAgIGJ5dGVzIGJhcl9ieXRlcyA9IDE2IFtkZWZhdWx0ID0gIkJZVEVTIl07CisgICAgTmVzdGVkRW51bSBiYXJfZW51bSA9IDE3IFtkZWZhdWx0ID0gQkFSXTsKKyAgfQorCisgIG9wdGlvbmFsIGludDMyIGJhel9pbnQgPSAxODsKKyAgb3B0aW9uYWwgc3RyaW5nIGJhel9zdHJpbmcgPSAxOSBbZGVmYXVsdCA9ICJCQVoiXTsKKworICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIG9wdGlvbmFsIGludDY0IHF1eF9pbnQgPSAxOworICAgIHJlcGVhdGVkIGludDMyIGNvcmdlX2ludCA9IDI7CisgIH0KKworICBlbnVtIE5lc3RlZEVudW0geworICAgIEZPTyA9IDE7CisgICAgQkFSID0gMjsKKyAgICBCQVogPSAzOworICB9Cit9CisKK21lc3NhZ2UgVGVzdFJlcXVpcmVkT25lb2YgeworICBvbmVvZiBmb28geworICAgIGludDMyIGZvb19pbnQgPSAxOworICAgIHN0cmluZyBmb29fc3RyaW5nID0gMjsKKyAgICBOZXN0ZWRNZXNzYWdlIGZvb19tZXNzYWdlID0gMzsKKyAgfQorICBtZXNzYWdlIE5lc3RlZE1lc3NhZ2UgeworICAgIHJlcXVpcmVkIGRvdWJsZSByZXF1aXJlZF9kb3VibGUgPSAxOworICB9Cit9CisKKwogLy8gVGVzdCBtZXNzYWdlcyBmb3IgcGFja2VkIGZpZWxkcwogCiBtZXNzYWdlIFRlc3RQYWNrZWRUeXBlcyB7CkBAIC01NzQsNiArNzU2LDI3IEBACiAgIHJlcGVhdGVkIEZvcmVpZ25FbnVtIHBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgPSAxMDMgW3BhY2tlZCA9IHRydWVdOwogfQogCittZXNzYWdlIFRlc3RVbnBhY2tlZEV4dGVuc2lvbnMgeworICBleHRlbnNpb25zIDEgdG8gbWF4OworfQorCitleHRlbmQgVGVzdFVucGFja2VkRXh0ZW5zaW9ucyB7CisgIHJlcGVhdGVkICAgIGludDMyIHVucGFja2VkX2ludDMyX2V4dGVuc2lvbiAgICA9ICA5MCBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICBpbnQ2NCB1bnBhY2tlZF9pbnQ2NF9leHRlbnNpb24gICAgPSAgOTEgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICB1aW50MzIgdW5wYWNrZWRfdWludDMyX2V4dGVuc2lvbiAgID0gIDkyIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgdWludDY0IHVucGFja2VkX3VpbnQ2NF9leHRlbnNpb24gICA9ICA5MyBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgIHNpbnQzMiB1bnBhY2tlZF9zaW50MzJfZXh0ZW5zaW9uICAgPSAgOTQgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBzaW50NjQgdW5wYWNrZWRfc2ludDY0X2V4dGVuc2lvbiAgID0gIDk1IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICBmaXhlZDMyIHVucGFja2VkX2ZpeGVkMzJfZXh0ZW5zaW9uICA9ICA5NiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgZml4ZWQ2NCB1bnBhY2tlZF9maXhlZDY0X2V4dGVuc2lvbiAgPSAgOTcgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgc2ZpeGVkMzIgdW5wYWNrZWRfc2ZpeGVkMzJfZXh0ZW5zaW9uID0gIDk4IFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkIHNmaXhlZDY0IHVucGFja2VkX3NmaXhlZDY0X2V4dGVuc2lvbiA9ICA5OSBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCAgICBmbG9hdCB1bnBhY2tlZF9mbG9hdF9leHRlbnNpb24gICAgPSAxMDAgW3BhY2tlZCA9IGZhbHNlXTsKKyAgcmVwZWF0ZWQgICBkb3VibGUgdW5wYWNrZWRfZG91YmxlX2V4dGVuc2lvbiAgID0gMTAxIFtwYWNrZWQgPSBmYWxzZV07CisgIHJlcGVhdGVkICAgICBib29sIHVucGFja2VkX2Jvb2xfZXh0ZW5zaW9uICAgICA9IDEwMiBbcGFja2VkID0gZmFsc2VdOworICByZXBlYXRlZCBGb3JlaWduRW51bSB1bnBhY2tlZF9lbnVtX2V4dGVuc2lvbiAgPSAxMDMgW3BhY2tlZCA9IGZhbHNlXTsKK30KKwogLy8gVXNlZCBieSBFeHRlbnNpb25TZXRUZXN0L0R5bmFtaWNFeHRlbnNpb25zLiAgVGhlIHRlc3QgYWN0dWFsbHkgYnVpbGRzCiAvLyBhIHNldCBvZiBleHRlbnNpb25zIHRvIFRlc3RBbGxFeHRlbnNpb25zIGR5bmFtaWNhbGx5LCBiYXNlZCBvbiB0aGUgZmllbGRzCiAvLyBvZiB0aGlzIG1lc3NhZ2UgdHlwZS4KQEAgLTYxNSwxMSArODE4LDU2IEBACiAgIHJlcGVhdGVkIHVpbnQ2NCAgcmVwZWF0ZWRfdWludDY0ICA9IDI2MjE0MzsKIH0KIAorLy8gVGVzdCB0aGF0IGlmIGFuIG9wdGlvbmFsIG9yIHJlcXVpcmVkIG1lc3NhZ2UvZ3JvdXAgZmllbGQgYXBwZWFycyBtdWx0aXBsZQorLy8gdGltZXMgaW4gdGhlIGlucHV0LCB0aGV5IG5lZWQgdG8gYmUgbWVyZ2VkLgorbWVzc2FnZSBUZXN0UGFyc2luZ01lcmdlIHsKKyAgLy8gUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgZGVmaW5lcyBtYXRjaGluZyBmaWVsZCB0eXBlcyBhcyBUZXN0UGFyc2luZ01lcmdlLAorICAvLyBleGNlcHQgdGhhdCBhbGwgZmllbGRzIGFyZSByZXBlYXRlZC4gSW4gdGhlIHRlc3RzLCB3ZSB3aWxsIHNlcmlhbGl6ZSB0aGUKKyAgLy8gUmVwZWF0ZWRGaWVsZHNHZW5lcmF0b3IgdG8gYnl0ZXMsIGFuZCBwYXJzZSB0aGUgYnl0ZXMgdG8gVGVzdFBhcnNpbmdNZXJnZS4KKyAgLy8gUmVwZWF0ZWQgZmllbGRzIGluIFJlcGVhdGVkRmllbGRzR2VuZXJhdG9yIGFyZSBleHBlY3RlZCB0byBiZSBtZXJnZWQgaW50bworICAvLyB0aGUgY29ycmVzcG9uZGluZyByZXF1aXJlZC9vcHRpb25hbCBmaWVsZHMgaW4gVGVzdFBhcnNpbmdNZXJnZS4KKyAgbWVzc2FnZSBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciB7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIGZpZWxkMSA9IDE7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIGZpZWxkMiA9IDI7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzIGZpZWxkMyA9IDM7CisgICAgcmVwZWF0ZWQgZ3JvdXAgR3JvdXAxID0gMTAgeworICAgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzIGZpZWxkMSA9IDExOworICAgIH0KKyAgICByZXBlYXRlZCBncm91cCBHcm91cDIgPSAyMCB7CisgICAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgZmllbGQxID0gMjE7CisgICAgfQorICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyBleHQxID0gMTAwMDsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgZXh0MiA9IDEwMDE7CisgIH0KKyAgcmVxdWlyZWQgVGVzdEFsbFR5cGVzIHJlcXVpcmVkX2FsbF90eXBlcyA9IDE7CisgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9hbGxfdHlwZXMgPSAyOworICByZXBlYXRlZCBUZXN0QWxsVHlwZXMgcmVwZWF0ZWRfYWxsX3R5cGVzID0gMzsKKyAgb3B0aW9uYWwgZ3JvdXAgT3B0aW9uYWxHcm91cCA9IDEwIHsKKyAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgb3B0aW9uYWxfZ3JvdXBfYWxsX3R5cGVzID0gMTE7CisgIH0KKyAgcmVwZWF0ZWQgZ3JvdXAgUmVwZWF0ZWRHcm91cCA9IDIwIHsKKyAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXMgcmVwZWF0ZWRfZ3JvdXBfYWxsX3R5cGVzID0gMjE7CisgIH0KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKKyAgZXh0ZW5kIFRlc3RQYXJzaW5nTWVyZ2UgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlcyBvcHRpb25hbF9leHQgPSAxMDAwOworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlcyByZXBlYXRlZF9leHQgPSAxMDAxOworICB9Cit9CisKK21lc3NhZ2UgVGVzdENvbW1lbnRJbmplY3Rpb25NZXNzYWdlIHsKKyAgLy8gKi8gPC0gVGhpcyBzaG91bGQgbm90IGNsb3NlIHRoZSBnZW5lcmF0ZWQgZG9jIGNvbW1lbnQKKyAgb3B0aW9uYWwgc3RyaW5nIGEgPSAxIFtkZWZhdWx0PSIqLyA8LSBOZWl0aGVyIHNob3VsZCB0aGlzLiJdOworfQorCiAKIC8vIFRlc3QgdGhhdCBSUEMgc2VydmljZXMgd29yay4KIG1lc3NhZ2UgRm9vUmVxdWVzdCAge30KIG1lc3NhZ2UgRm9vUmVzcG9uc2Uge30KIAorbWVzc2FnZSBGb29DbGllbnRNZXNzYWdlIHt9CittZXNzYWdlIEZvb1NlcnZlck1lc3NhZ2V7fQorCiBzZXJ2aWNlIFRlc3RTZXJ2aWNlIHsKICAgcnBjIEZvbyhGb29SZXF1ZXN0KSByZXR1cm5zIChGb29SZXNwb25zZSk7CiAgIHJwYyBCYXIoQmFyUmVxdWVzdCkgcmV0dXJucyAoQmFyUmVzcG9uc2UpOwpAQCAtNjI4LDMgKzg3Niw0IEBACiAKIG1lc3NhZ2UgQmFyUmVxdWVzdCAge30KIG1lc3NhZ2UgQmFyUmVzcG9uc2Uge30KKwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2FyZW5hLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9hcmVuYS5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfY3VzdG9tX29wdGlvbnMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bwppbmRleCBhNjEwNzg1Li40Y2MwZTM2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9jdXN0b21fb3B0aW9ucy5wcm90bwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsOCArMzIsOSBAQAogLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAvLwotLy8gQSBwcm90byBmaWxlIHVzZWQgdG8gdGVzdCB0aGUgImN1c3RvbSBvcHRpb25zIiBmZWF0dXJlIG9mIHByb3RvMi4KKy8vIEEgcHJvdG8gZmlsZSB1c2VkIHRvIHRlc3QgdGhlICJjdXN0b20gb3B0aW9ucyIgZmVhdHVyZSBvZiBnb29nbGUucHJvdG9idWYuCiAKK3N5bnRheCA9ICJwcm90bzIiOwogCiAvLyBTb21lIGdlbmVyaWNfc2VydmljZXMgb3B0aW9uKHMpIGFkZGVkIGF1dG9tYXRpY2FsbHkuCiAvLyBTZWU6ICBodHRwOi8vZ28vcHJvdG8yLWdlbmVyaWMtc2VydmljZXMtZGVmYXVsdApAQCAtMTE2LDYgKzExNywxMiBAQAogbWVzc2FnZSBDdXN0b21PcHRpb25Gb29SZXNwb25zZSB7CiB9CiAKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vQ2xpZW50TWVzc2FnZSB7Cit9CisKK21lc3NhZ2UgQ3VzdG9tT3B0aW9uRm9vU2VydmVyTWVzc2FnZSB7Cit9CisKIHNlcnZpY2UgVGVzdFNlcnZpY2VXaXRoQ3VzdG9tT3B0aW9ucyB7CiAgIG9wdGlvbiAoc2VydmljZV9vcHQxKSA9IC05ODc2NTQzMjEwOwogCkBAIC0yMTIsNiArMjE5LDcgQEAKICAgb3B0aW9uYWwgaW50MzIgZm9vID0gMTsKICAgb3B0aW9uYWwgaW50MzIgZm9vMiA9IDI7CiAgIG9wdGlvbmFsIGludDMyIGZvbzMgPSAzOworICByZXBlYXRlZCBpbnQzMiBmb280ID0gNDsKIAogICBleHRlbnNpb25zIDEwMCB0byBtYXg7CiB9CkBAIC0yMjksNiArMjM3LDcgQEAKICAgfQogCiAgIG9wdGlvbmFsIENvbXBsZXhPcHRpb25UeXBlNCBmcmVkID0gMzsKKyAgcmVwZWF0ZWQgQ29tcGxleE9wdGlvblR5cGU0IGJhcm5leSA9IDQ7CiAKICAgZXh0ZW5zaW9ucyAxMDAgdG8gbWF4OwogfQpAQCAtMjY1LDYgKzI3NCw4IEBACiAgIG9wdGlvbiAoLnByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuZm9vID0gNDI7CiAgIG9wdGlvbiAocHJvdG9idWZfdW5pdHRlc3QuY29tcGxleF9vcHQxKS4oLnByb3RvYnVmX3VuaXR0ZXN0LnF1dXgpID0gMzI0OwogICBvcHRpb24gKC5wcm90b2J1Zl91bml0dGVzdC5jb21wbGV4X29wdDEpLihwcm90b2J1Zl91bml0dGVzdC5jb3JnZSkucXV4ID0gODc2OworICBvcHRpb24gKHByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuZm9vNCA9IDk5OworICBvcHRpb24gKHByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MSkuZm9vNCA9IDg4OwogICBvcHRpb24gKGNvbXBsZXhfb3B0MikuYmF6ID0gOTg3OwogICBvcHRpb24gKGNvbXBsZXhfb3B0MikuKGdyYXVsdCkgPSA2NTQ7CiAgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXIuZm9vID0gNzQzOwpAQCAtMjc1LDYgKzI4Niw4IEBACiAgIG9wdGlvbiAoY29tcGxleF9vcHQyKS4ocHJvdG9idWZfdW5pdHRlc3QuZ2FycGx5KS4oY29yZ2UpLnF1eCA9IDIxMjE7CiAgIG9wdGlvbiAoQ29tcGxleE9wdGlvblR5cGUyLkNvbXBsZXhPcHRpb25UeXBlNC5jb21wbGV4X29wdDQpLndhbGRvID0gMTk3MTsKICAgb3B0aW9uIChjb21wbGV4X29wdDIpLmZyZWQud2FsZG8gPSAzMjE7CisgIG9wdGlvbiAoY29tcGxleF9vcHQyKS5iYXJuZXkgPSB7IHdhbGRvOiAxMDEgfTsKKyAgb3B0aW9uIChjb21wbGV4X29wdDIpLmJhcm5leSA9IHsgd2FsZG86IDIxMiB9OwogICBvcHRpb24gKHByb3RvYnVmX3VuaXR0ZXN0LmNvbXBsZXhfb3B0MykucXV4ID0gOTsKICAgb3B0aW9uIChjb21wbGV4X29wdDMpLmNvbXBsZXhvcHRpb250eXBlNS5wbHVnaCA9IDIyOwogICBvcHRpb24gKGNvbXBsZXhvcHQ2KS54eXp6eSA9IDI0OwpAQCAtMzY0LDMgKzM3Nyw0NSBAQAogICBvcHRpb24gKGVudW1vcHQpID0geyBzOidFbnVtQW5ub3RhdGlvbicgfTsKICAgVkFMVUUgPSAxIFsoZW51bXZhbG9wdCkgPSB7IHM6J0VudW1WYWx1ZUFubm90YXRpb24nIH1dOwogfQorCisvLyBUZXN0IGN1c3RvbSBvcHRpb25zIGZvciBuZXN0ZWQgdHlwZS4KK21lc3NhZ2UgTmVzdGVkT3B0aW9uVHlwZSB7CisgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CisgICAgb3B0aW9uIChtZXNzYWdlX29wdDEpID0gMTAwMTsKKyAgICBvcHRpb25hbCBpbnQzMiBuZXN0ZWRfZmllbGQgPSAxIFsoZmllbGRfb3B0MSkgPSAxMDAyXTsKKyAgfQorICBlbnVtIE5lc3RlZEVudW0geworICAgIG9wdGlvbiAoZW51bV9vcHQxKSA9IDEwMDM7CisgICAgTkVTVEVEX0VOVU1fVkFMVUUgPSAxIFsoZW51bV92YWx1ZV9vcHQxKSA9IDEwMDRdOworICB9CisgIGV4dGVuZCBnb29nbGUucHJvdG9idWYuRmlsZU9wdGlvbnMgeworICAgIG9wdGlvbmFsIGludDMyIG5lc3RlZF9leHRlbnNpb24gPSA3OTEyNTczIFsoZmllbGRfb3B0MikgPSAxMDA1XTsKKyAgfQorfQorCisvLyBDdXN0b20gbWVzc2FnZSBvcHRpb24gdGhhdCBoYXMgYSByZXF1aXJlZCBlbnVtIGZpZWxkLgorLy8gV0FSTklORzogdGhpcyBpcyBzdHJvbmdseSBkaXNjb3VyYWdlZCEKK21lc3NhZ2UgT2xkT3B0aW9uVHlwZSB7CisgIGVudW0gVGVzdEVudW0geworICAgIE9MRF9WQUxVRSA9IDA7CisgIH0KKyAgcmVxdWlyZWQgVGVzdEVudW0gdmFsdWUgPSAxOworfQorCisvLyBVcGRhdGVkIHZlcnNpb24gb2YgdGhlIGN1c3RvbSBvcHRpb24gYWJvdmUuCittZXNzYWdlIE5ld09wdGlvblR5cGUgeworICBlbnVtIFRlc3RFbnVtIHsKKyAgICBPTERfVkFMVUUgPSAwOworICAgIE5FV19WQUxVRSA9IDE7CisgIH0KKyAgcmVxdWlyZWQgVGVzdEVudW0gdmFsdWUgPSAxOworfQorCitleHRlbmQgZ29vZ2xlLnByb3RvYnVmLk1lc3NhZ2VPcHRpb25zIHsKKyAgb3B0aW9uYWwgT2xkT3B0aW9uVHlwZSByZXF1aXJlZF9lbnVtX29wdCA9IDEwNjE2MTgwNzsKK30KKworLy8gVGVzdCBtZXNzYWdlIHVzaW5nIHRoZSAicmVxdWlyZWRfZW51bV9vcHQiIG9wdGlvbiBkZWZpbmVkIGFib3ZlLgorbWVzc2FnZSBUZXN0TWVzc2FnZVdpdGhSZXF1aXJlZEVudW1PcHRpb24geworICBvcHRpb24gKHJlcXVpcmVkX2VudW1fb3B0KSA9IHsgdmFsdWU6IE9MRF9WQUxVRSB9OworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZHJvcF91bmtub3duX2ZpZWxkcy5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9kcm9wX3Vua25vd25fZmllbGRzLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbWJlZF9vcHRpbWl6ZV9mb3IucHJvdG8KaW5kZXggZmExNzYyNS4uZDhiMGY5YiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW1iZWRfb3B0aW1pemVfZm9yLnByb3RvCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtYmVkX29wdGltaXplX2Zvci5wcm90bwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzQsNiArMzQsNyBAQAogLy8KIC8vIEEgcHJvdG8gZmlsZSB3aGljaCBpbXBvcnRzIGEgcHJvdG8gZmlsZSB0aGF0IHVzZXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLgogCitzeW50YXggPSAicHJvdG8yIjsKIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byI7CiAKIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbXB0eS5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvCmluZGV4IGFiMTJkMWYuLjM2NDQzZTcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2VtcHR5LnByb3RvCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNSwzICszNSw0IEBACiAvLyBUaGlzIGZpbGUgaW50ZW50aW9uYWxseSBsZWZ0IGJsYW5rLiAgKEF0IG9uZSBwb2ludCB0aGlzIHdvdWxkbid0IGNvbXBpbGUKIC8vIGNvcnJlY3RseS4pCiAKK3N5bnRheCA9ICJwcm90bzIiOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2Vub3Jtb3VzX2Rlc2NyaXB0b3IucHJvdG8KaW5kZXggYmMwYjdjMS4uNmU2NWRjMSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfZW5vcm1vdXNfZGVzY3JpcHRvci5wcm90bworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9lbm9ybW91c19kZXNjcmlwdG9yLnByb3RvCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zMyw4ICszMywxMCBAQAogLy8gIFNhbmpheSBHaGVtYXdhdCwgSmVmZiBEZWFuLCBhbmQgb3RoZXJzLgogLy8KIC8vIEEgcHJvdG8gZmlsZSB0aGF0IGhhcyBhbiBleHRyZW1lbHkgbGFyZ2UgZGVzY3JpcHRvci4gIFVzZWQgdG8gdGVzdCB0aGF0Ci0vLyBkZXNjcmlwdG9ycyBvdmVyIDY0ayBkb24ndCBicmVhayB0aGUgc3RyaW5nIGxpdGVyYWwgbGVuZ3RoIGxpbWl0IGluIEphdmEuCisvLyBkZXNjcmlwdG9ycyBvdmVyIDY0ayBkb24ndCBicmVhayBsYW5ndWFnZS1zcGVjaWZpYyBsaW1pdHMgaW4gZ2VuZXJhdGVkIGNvZGUsCisvLyBzdWNoIGFzIHRoZSBzdHJpbmcgbGl0ZXJhbCBsZW5ndGggbGltaXQgaW4gSmF2YS4KIAorc3ludGF4ID0gInByb3RvMiI7CiAKIHBhY2thZ2UgZ29vZ2xlLnByb3RvYnVmOwogb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmIjsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydC5wcm90bwppbmRleCBjZDUzM2VjLi44ZDAzZTM4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnQucHJvdG8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0LnByb3RvCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCw2ICszNCw3IEBACiAvLwogLy8gQSBwcm90byBmaWxlIHdoaWNoIGlzIGltcG9ydGVkIGJ5IHVuaXR0ZXN0LnByb3RvIHRvIHRlc3QgaW1wb3J0aW5nLgogCitzeW50YXggPSAicHJvdG8yIjsKIAogLy8gV2UgZG9uJ3QgcHV0IHRoaXMgaW4gYSBwYWNrYWdlIHdpdGhpbiBwcm90bzIgYmVjYXVzZSB3ZSBuZWVkIHRvIG1ha2Ugc3VyZQogLy8gdGhhdCB0aGUgZ2VuZXJhdGVkIGNvZGUgZG9lc24ndCBkZXBlbmQgb24gYmVpbmcgaW4gdGhlIHByb3RvMiBuYW1lc3BhY2UuCkBAIC00MiwxMyArNDMsMTcgQEAKIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OwogCiBvcHRpb24gb3B0aW1pemVfZm9yID0gU1BFRUQ7CitvcHRpb24gY2NfZW5hYmxlX2FyZW5hcyA9IHRydWU7CiAKLS8vIEV4Y2VyY2lzZSB0aGUgamF2YV9wYWNrYWdlIG9wdGlvbi4KKy8vIEV4ZXJjaXNlIHRoZSBqYXZhX3BhY2thZ2Ugb3B0aW9uLgogb3B0aW9uIGphdmFfcGFja2FnZSA9ICJjb20uZ29vZ2xlLnByb3RvYnVmLnRlc3QiOwogCiAvLyBEbyBub3Qgc2V0IGEgamF2YV9vdXRlcl9jbGFzc25hbWUgaGVyZSB0byB2ZXJpZnkgdGhhdCBQcm90bzIgd29ya3Mgd2l0aG91dAogLy8gb25lLgogCisvLyBUZXN0IHB1YmxpYyBpbXBvcnQKK2ltcG9ydCBwdWJsaWMgImdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvIjsKKwogbWVzc2FnZSBJbXBvcnRNZXNzYWdlIHsKICAgb3B0aW9uYWwgaW50MzIgZCA9IDE7CiB9CkBAIC01OSwzICs2NCwxMCBAQAogICBJTVBPUlRfQkFaID0gOTsKIH0KIAorCisvLyBUbyB1c2UgYW4gZW51bSBpbiBhIG1hcCwgaXQgbXVzdCBoYXMgdGhlIGZpcnN0IHZhbHVlIGFzIDAuCitlbnVtIEltcG9ydEVudW1Gb3JNYXAgeworICBVTktOT1dOID0gMDsKKyAgRk9PID0gMTsKKyAgQkFSID0gMjsKK30KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8KaW5kZXggZWJhYWI1Yy4uYTdhZmE0NSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X2xpdGUucHJvdG8KQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDEyICszMiwxNSBAQAogLy8KIC8vIFRoaXMgaXMgbGlrZSB1bml0dGVzdF9pbXBvcnQucHJvdG8gYnV0IHdpdGggb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FLgogCitzeW50YXggPSAicHJvdG8yIjsKIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0OwogCiBvcHRpb24gb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FOwogCiBvcHRpb24gamF2YV9wYWNrYWdlID0gImNvbS5nb29nbGUucHJvdG9idWYiOwogCitpbXBvcnQgcHVibGljICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvIjsKKwogbWVzc2FnZSBJbXBvcnRNZXNzYWdlTGl0ZSB7CiAgIG9wdGlvbmFsIGludDMyIGQgPSAxOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHJvdG8zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3Byb3RvMy5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHJvdG8zLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHJvdG8zLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9pbXBvcnRfcHVibGljLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWMucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfbGl0ZS5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19saXRlLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcHJvdG8zLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wcm90bzMucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfaW1wb3J0X3B1YmxpY19wcm90bzMucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9wdWJsaWNfcHJvdG8zLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZS5wcm90bwppbmRleCBjY2E2YjQ5Li44NzhlYzdjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlLnByb3RvCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2xpdGUucHJvdG8KQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDYgKzMyLDcgQEAKIC8vCiAvLyBUaGlzIGlzIGxpa2UgdW5pdHRlc3QucHJvdG8gYnV0IHdpdGggb3B0aW1pemVfZm9yID0gTElURV9SVU5USU1FLgogCitzeW50YXggPSAicHJvdG8yIjsKIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CiAKIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X2ltcG9ydF9saXRlLnByb3RvIjsKQEAgLTQyLDggKzQzLDEwIEBACiAKIC8vIFNhbWUgYXMgVGVzdEFsbFR5cGVzIGJ1dCB3aXRoIHRoZSBsaXRlIHJ1bnRpbWUuCiBtZXNzYWdlIFRlc3RBbGxUeXBlc0xpdGUgeworCiAgIG1lc3NhZ2UgTmVzdGVkTWVzc2FnZSB7CiAgICAgb3B0aW9uYWwgaW50MzIgYmIgPSAxOworICAgIG9wdGlvbmFsIGludDY0IGNjID0gMjsKICAgfQogCiAgIGVudW0gTmVzdGVkRW51bSB7CkBAIC04NSw2ICs4OCwxMiBAQAogICBvcHRpb25hbCBzdHJpbmcgb3B0aW9uYWxfc3RyaW5nX3BpZWNlID0gMjQgW2N0eXBlPVNUUklOR19QSUVDRV07CiAgIG9wdGlvbmFsIHN0cmluZyBvcHRpb25hbF9jb3JkID0gMjUgW2N0eXBlPUNPUkRdOwogCisgIC8vIERlZmluZWQgaW4gdW5pdHRlc3RfaW1wb3J0X3B1YmxpYy5wcm90bworICBvcHRpb25hbCBwcm90b2J1Zl91bml0dGVzdF9pbXBvcnQuUHVibGljSW1wb3J0TWVzc2FnZUxpdGUKKyAgICAgIG9wdGlvbmFsX3B1YmxpY19pbXBvcnRfbWVzc2FnZSA9IDI2OworCisgIG9wdGlvbmFsIE5lc3RlZE1lc3NhZ2Ugb3B0aW9uYWxfbGF6eV9tZXNzYWdlID0gMjcgW2xhenk9dHJ1ZV07CisKICAgLy8gUmVwZWF0ZWQKICAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzIgICAgPSAzMTsKICAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjQgICAgPSAzMjsKQEAgLTExOCw2ICsxMjcsOCBAQAogICByZXBlYXRlZCBzdHJpbmcgcmVwZWF0ZWRfc3RyaW5nX3BpZWNlID0gNTQgW2N0eXBlPVNUUklOR19QSUVDRV07CiAgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkID0gNTUgW2N0eXBlPUNPUkRdOwogCisgIHJlcGVhdGVkIE5lc3RlZE1lc3NhZ2UgcmVwZWF0ZWRfbGF6eV9tZXNzYWdlID0gNTcgW2xhenk9dHJ1ZV07CisKICAgLy8gU2luZ3VsYXIgd2l0aCBkZWZhdWx0cwogICBvcHRpb25hbCAgICBpbnQzMiBkZWZhdWx0X2ludDMyICAgID0gNjEgW2RlZmF1bHQgPSAgNDEgICAgXTsKICAgb3B0aW9uYWwgICAgaW50NjQgZGVmYXVsdF9pbnQ2NCAgICA9IDYyIFtkZWZhdWx0ID0gIDQyICAgIF07CkBAIC0xNDMsNiArMTU0LDE1IEBACiAKICAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfc3RyaW5nX3BpZWNlID0gODQgW2N0eXBlPVNUUklOR19QSUVDRSxkZWZhdWx0PSJhYmMiXTsKICAgb3B0aW9uYWwgc3RyaW5nIGRlZmF1bHRfY29yZCA9IDg1IFtjdHlwZT1DT1JELGRlZmF1bHQ9IjEyMyJdOworCisgIC8vIEZvciBvbmVvZiB0ZXN0CisgIG9uZW9mIG9uZW9mX2ZpZWxkIHsKKyAgICB1aW50MzIgb25lb2ZfdWludDMyID0gMTExOworICAgIE5lc3RlZE1lc3NhZ2Ugb25lb2ZfbmVzdGVkX21lc3NhZ2UgPSAxMTI7CisgICAgc3RyaW5nIG9uZW9mX3N0cmluZyA9IDExMzsKKyAgICBieXRlcyBvbmVvZl9ieXRlcyA9IDExNDsKKyAgICBOZXN0ZWRNZXNzYWdlIG9uZW9mX2xhenlfbmVzdGVkX21lc3NhZ2UgPSAxMTUgW2xhenkgPSB0cnVlXTsKKyAgfQogfQogCiBtZXNzYWdlIEZvcmVpZ25NZXNzYWdlTGl0ZSB7CkBAIC0yMTMsNiArMjMzLDEyIEBACiAgICAgICBbY3R5cGU9U1RSSU5HX1BJRUNFXTsKICAgb3B0aW9uYWwgc3RyaW5nIG9wdGlvbmFsX2NvcmRfZXh0ZW5zaW9uX2xpdGUgPSAyNSBbY3R5cGU9Q09SRF07CiAKKyAgb3B0aW9uYWwgcHJvdG9idWZfdW5pdHRlc3RfaW1wb3J0LlB1YmxpY0ltcG9ydE1lc3NhZ2VMaXRlCisgICAgb3B0aW9uYWxfcHVibGljX2ltcG9ydF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMjY7CisKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlCisgICAgb3B0aW9uYWxfbGF6eV9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMjcgW2xhenk9dHJ1ZV07CisKICAgLy8gUmVwZWF0ZWQKICAgcmVwZWF0ZWQgICAgaW50MzIgcmVwZWF0ZWRfaW50MzJfZXh0ZW5zaW9uX2xpdGUgICAgPSAzMTsKICAgcmVwZWF0ZWQgICAgaW50NjQgcmVwZWF0ZWRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAgPSAzMjsKQEAgLTI0OSw2ICsyNzUsOSBAQAogICAgICAgW2N0eXBlPVNUUklOR19QSUVDRV07CiAgIHJlcGVhdGVkIHN0cmluZyByZXBlYXRlZF9jb3JkX2V4dGVuc2lvbl9saXRlID0gNTUgW2N0eXBlPUNPUkRdOwogCisgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUuTmVzdGVkTWVzc2FnZQorICAgIHJlcGVhdGVkX2xhenlfbWVzc2FnZV9leHRlbnNpb25fbGl0ZSA9IDU3IFtsYXp5PXRydWVdOworCiAgIC8vIFNpbmd1bGFyIHdpdGggZGVmYXVsdHMKICAgb3B0aW9uYWwgICAgaW50MzIgZGVmYXVsdF9pbnQzMl9leHRlbnNpb25fbGl0ZSAgICA9IDYxIFtkZWZhdWx0ID0gIDQxICAgIF07CiAgIG9wdGlvbmFsICAgIGludDY0IGRlZmF1bHRfaW50NjRfZXh0ZW5zaW9uX2xpdGUgICAgPSA2MiBbZGVmYXVsdCA9ICA0MiAgICBdOwpAQCAtMjc2LDYgKzMwNSwxMiBAQAogICBvcHRpb25hbCBzdHJpbmcgZGVmYXVsdF9zdHJpbmdfcGllY2VfZXh0ZW5zaW9uX2xpdGUgPSA4NCBbY3R5cGU9U1RSSU5HX1BJRUNFLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdD0iYWJjIl07CiAgIG9wdGlvbmFsIHN0cmluZyBkZWZhdWx0X2NvcmRfZXh0ZW5zaW9uX2xpdGUgPSA4NSBbY3R5cGU9Q09SRCwgZGVmYXVsdD0iMTIzIl07CisKKyAgLy8gRm9yIG9uZW9mIHRlc3QKKyAgb3B0aW9uYWwgdWludDMyIG9uZW9mX3VpbnQzMl9leHRlbnNpb25fbGl0ZSA9IDExMTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZS5OZXN0ZWRNZXNzYWdlIG9uZW9mX25lc3RlZF9tZXNzYWdlX2V4dGVuc2lvbl9saXRlID0gMTEyOworICBvcHRpb25hbCBzdHJpbmcgb25lb2Zfc3RyaW5nX2V4dGVuc2lvbl9saXRlID0gMTEzOworICBvcHRpb25hbCBieXRlcyBvbmVvZl9ieXRlc19leHRlbnNpb25fbGl0ZSA9IDExNDsKIH0KIAogbWVzc2FnZSBUZXN0UGFja2VkRXh0ZW5zaW9uc0xpdGUgewpAQCAtMzEwLDMgKzM0NSw2MyBAQAogbWVzc2FnZSBUZXN0RGVwcmVjYXRlZExpdGUgewogICBvcHRpb25hbCBpbnQzMiBkZXByZWNhdGVkX2ZpZWxkID0gMSBbZGVwcmVjYXRlZCA9IHRydWVdOwogfQorCisvLyBTZWUgdGhlIGNvbW1lbnRzIG9mIHRoZSBzYW1lIHR5cGUgaW4gdW5pdHRlc3QucHJvdG8uCittZXNzYWdlIFRlc3RQYXJzaW5nTWVyZ2VMaXRlIHsKKyAgbWVzc2FnZSBSZXBlYXRlZEZpZWxkc0dlbmVyYXRvciB7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBmaWVsZDEgPSAxOworICAgIHJlcGVhdGVkIFRlc3RBbGxUeXBlc0xpdGUgZmllbGQyID0gMjsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlIGZpZWxkMyA9IDM7CisgICAgcmVwZWF0ZWQgZ3JvdXAgR3JvdXAxID0gMTAgeworICAgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZSBmaWVsZDEgPSAxMTsKKyAgICB9CisgICAgcmVwZWF0ZWQgZ3JvdXAgR3JvdXAyID0gMjAgeworICAgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZSBmaWVsZDEgPSAyMTsKKyAgICB9CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSBleHQxID0gMTAwMDsKKyAgICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlIGV4dDIgPSAxMDAxOworICB9CisgIHJlcXVpcmVkIFRlc3RBbGxUeXBlc0xpdGUgcmVxdWlyZWRfYWxsX3R5cGVzID0gMTsKKyAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZSBvcHRpb25hbF9hbGxfdHlwZXMgPSAyOworICByZXBlYXRlZCBUZXN0QWxsVHlwZXNMaXRlIHJlcGVhdGVkX2FsbF90eXBlcyA9IDM7CisgIG9wdGlvbmFsIGdyb3VwIE9wdGlvbmFsR3JvdXAgPSAxMCB7CisgICAgb3B0aW9uYWwgVGVzdEFsbFR5cGVzTGl0ZSBvcHRpb25hbF9ncm91cF9hbGxfdHlwZXMgPSAxMTsKKyAgfQorICByZXBlYXRlZCBncm91cCBSZXBlYXRlZEdyb3VwID0gMjAgeworICAgIG9wdGlvbmFsIFRlc3RBbGxUeXBlc0xpdGUgcmVwZWF0ZWRfZ3JvdXBfYWxsX3R5cGVzID0gMjE7CisgIH0KKyAgZXh0ZW5zaW9ucyAxMDAwIHRvIG1heDsKKyAgZXh0ZW5kIFRlc3RQYXJzaW5nTWVyZ2VMaXRlIHsKKyAgICBvcHRpb25hbCBUZXN0QWxsVHlwZXNMaXRlIG9wdGlvbmFsX2V4dCA9IDEwMDA7CisgICAgcmVwZWF0ZWQgVGVzdEFsbFR5cGVzTGl0ZSByZXBlYXRlZF9leHQgPSAxMDAxOworICB9Cit9CisKKy8vIFRlc3RFbXB0eU1lc3NhZ2VMaXRlIGlzIHVzZWQgdG8gdGVzdCB1bmtub3duIGZpZWxkcyBzdXBwb3J0IGluIGxpdGUgbW9kZS4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZUxpdGV7Cit9CisKKy8vIExpa2UgYWJvdmUsIGJ1dCBkZWNsYXJlIGFsbCBmaWVsZCBudW1iZXJzIGFzIHBvdGVudGlhbCBleHRlbnNpb25zLiAgTm8KKy8vIGFjdHVhbCBleHRlbnNpb25zIHNob3VsZCBldmVyIGJlIGRlZmluZWQgZm9yIHRoaXMgdHlwZS4KK21lc3NhZ2UgVGVzdEVtcHR5TWVzc2FnZVdpdGhFeHRlbnNpb25zTGl0ZSB7CisgIGV4dGVuc2lvbnMgMSB0byBtYXg7Cit9CisKK2VudW0gVjFFbnVtTGl0ZSB7CisgICAgVjFfRklSU1QgPSAxOworfQorCitlbnVtIFYyRW51bUxpdGUgeworICAgIFYyX0ZJUlNUID0gMTsKKyAgICBWMl9TRUNPTkQgPSAyOworfQorCittZXNzYWdlIFYxTWVzc2FnZUxpdGUgeworICAgIHJlcXVpcmVkIGludDMyIGludF9maWVsZCA9IDE7CisgICAgb3B0aW9uYWwgVjFFbnVtTGl0ZSBlbnVtX2ZpZWxkID0gMiBbIGRlZmF1bHQgPSBWMV9GSVJTVCBdOworfQorCittZXNzYWdlIFYyTWVzc2FnZUxpdGUgeworICAgIHJlcXVpcmVkIGludDMyIGludF9maWVsZCA9IDE7CisgICAgb3B0aW9uYWwgVjJFbnVtTGl0ZSBlbnVtX2ZpZWxkID0gMiBbIGRlZmF1bHQgPSBWMl9GSVJTVCBdOworfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbGl0ZV9pbXBvcnRzX25vbmxpdGUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90bwppbmRleCBkNTJjYjhjLi4xMzJkNmE4IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90bworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9saXRlX2ltcG9ydHNfbm9ubGl0ZS5wcm90bwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsNiArMzIsNyBAQAogLy8KIC8vIFRlc3RzIHRoYXQgYSAibGl0ZSIgbWVzc2FnZSBjYW4gaW1wb3J0IGEgcmVndWxhciBtZXNzYWdlLgogCitzeW50YXggPSAicHJvdG8yIjsKIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CiAKIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0LnByb3RvCmluZGV4IDM0OTdmMDkuLjQ5ZDlhZGEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X21zZXQucHJvdG8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wcm90bwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzIsMzYgKzMyLDQ3IEBACiAvLyAgQmFzZWQgb24gb3JpZ2luYWwgUHJvdG9jb2wgQnVmZmVycyBkZXNpZ24gYnkKIC8vICBTYW5qYXkgR2hlbWF3YXQsIEplZmYgRGVhbiwgYW5kIG90aGVycy4KIC8vCi0vLyBUaGlzIGZpbGUgY29udGFpbnMgbWVzc2FnZXMgZm9yIHRlc3RpbmcgbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQuCisvLyBUaGlzIGZpbGUgaXMgc2ltaWxhciB0byB1bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvLCBidXQgZG9lcyBub3QKKy8vIGhhdmUgYSBUZXN0TWVzc2FnZVNldCwgc28gaXQgY2FuIGJlIGRvd25ncmFkZWQgdG8gcHJvdG8xLgorCitzeW50YXggPSAicHJvdG8yIjsKKworaW1wb3J0ICJnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wcm90byI7CiAKIHBhY2thZ2UgcHJvdG9idWZfdW5pdHRlc3Q7CiAKK29wdGlvbiBjY19lbmFibGVfYXJlbmFzID0gdHJ1ZTsKIG9wdGlvbiBvcHRpbWl6ZV9mb3IgPSBTUEVFRDsKIAotLy8gQSBtZXNzYWdlIHdpdGggbWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQuCi1tZXNzYWdlIFRlc3RNZXNzYWdlU2V0IHsKLSAgb3B0aW9uIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0ID0gdHJ1ZTsKLSAgZXh0ZW5zaW9ucyA0IHRvIG1heDsKLX0KLQogbWVzc2FnZSBUZXN0TWVzc2FnZVNldENvbnRhaW5lciB7Ci0gIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0ID0gMTsKKyAgb3B0aW9uYWwgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3QuVGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQgPSAxOwogfQogCiBtZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMSB7Ci0gIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisgIGV4dGVuZCBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdC5UZXN0TWVzc2FnZVNldCB7CiAgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDE1NDUwMDg7CiAgIH0KICAgb3B0aW9uYWwgaW50MzIgaSA9IDE1OwogfQogCiBtZXNzYWdlIFRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMiB7Ci0gIGV4dGVuZCBUZXN0TWVzc2FnZVNldCB7CisgIGV4dGVuZCBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdC5UZXN0TWVzc2FnZVNldCB7CiAgICAgb3B0aW9uYWwgVGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24yIG1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiA9IDE1NDc3Njk7CiAgIH0KICAgb3B0aW9uYWwgc3RyaW5nIHN0ciA9IDI1OwogfQogCisvLyBUaGlzIG1lc3NhZ2Ugd2FzIHVzZWQgdG8gZ2VuZXJhdGUKKy8vIC8vbmV0L3Byb3RvMi9weXRob24vaW50ZXJuYWwvdGVzdGRhdGEvbWVzc2FnZV9zZXRfbWVzc2FnZSwgYnV0IGlzIGNvbW1lbnRlZAorLy8gb3V0IHNpbmNlIGl0IG11c3Qgbm90IGFjdHVhbGx5IGV4aXN0IGluIGNvZGUsIHRvIHNpbXVsYXRlIGFuICJ1bmtub3duIgorLy8gZXh0ZW5zaW9uLgorLy8gbWVzc2FnZSBUZXN0TWVzc2FnZVNldFVua25vd25FeHRlbnNpb24geworLy8gICBleHRlbmQgVGVzdE1lc3NhZ2VTZXQgeworLy8gICAgIG9wdGlvbmFsIFRlc3RNZXNzYWdlU2V0VW5rbm93bkV4dGVuc2lvbiBtZXNzYWdlX3NldF9leHRlbnNpb24gPSA1NjE0MTQyMTsKKy8vICAgfQorLy8gICBvcHRpb25hbCBpbnQ2NCBhID0gMTsKKy8vIH0KKwogLy8gTWVzc2FnZVNldCB3aXJlIGZvcm1hdCBpcyBlcXVpdmFsZW50IHRvIHRoaXMuCiBtZXNzYWdlIFJhd01lc3NhZ2VTZXQgewogICByZXBlYXRlZCBncm91cCBJdGVtID0gMSB7CkBAIC02OSw0ICs4MCwzIEBACiAgICAgcmVxdWlyZWQgYnl0ZXMgbWVzc2FnZSA9IDM7CiAgIH0KIH0KLQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldF93aXJlX2Zvcm1hdC5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmEucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmEucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hX2ltcG9ydC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hX2ltcG9ydC5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9pbXBvcnQucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2FyZW5hX2ltcG9ydC5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fYXJlbmFfbGl0ZS5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9saXRlLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19hcmVuYV9saXRlLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZmllbGRfcHJlc2VuY2UucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2ZpZWxkX3ByZXNlbmNlLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfbm9fZ2VuZXJpY19zZXJ2aWNlcy5wcm90bwppbmRleCBjZmZiNDEyLi44ZmM3NzEzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9ub19nZW5lcmljX3NlcnZpY2VzLnByb3RvCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X25vX2dlbmVyaWNfc2VydmljZXMucHJvdG8KQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMwLDggKzMwLDEwIEBACiAKIC8vIEF1dGhvcjoga2VudG9uQGdvb2dsZS5jb20gKEtlbnRvbiBWYXJkYSkKIAorc3ludGF4ID0gInByb3RvMiI7CiBwYWNrYWdlIGdvb2dsZS5wcm90b2J1Zi5ub19nZW5lcmljX3NlcnZpY2VzX3Rlc3Q7CiAKKwogLy8gKl9nZW5lcmljX3NlcnZpY2VzIGFyZSBmYWxzZSBieSBkZWZhdWx0LgogCiBtZXNzYWdlIFRlc3RNZXNzYWdlIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X29wdGltaXplX2Zvci5wcm90bwppbmRleCBmZWVjYmVmLi5lZTljYzdiIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9vcHRpbWl6ZV9mb3IucHJvdG8KKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3Rfb3B0aW1pemVfZm9yLnByb3RvCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zNCw2ICszNCw3IEBACiAvLwogLy8gQSBwcm90byBmaWxlIHdoaWNoIHVzZXMgb3B0aW1pemVfZm9yID0gQ09ERV9TSVpFLgogCitzeW50YXggPSAicHJvdG8yIjsKIGltcG9ydCAiZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnByb3RvIjsKIAogcGFja2FnZSBwcm90b2J1Zl91bml0dGVzdDsKQEAgLTUwLDEyICs1MSwxNyBAQAogICAgIG9wdGlvbmFsIGludDMyIHRlc3RfZXh0ZW5zaW9uID0gMTIzNDsKICAgICBvcHRpb25hbCBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIHRlc3RfZXh0ZW5zaW9uMiA9IDEyMzU7CiAgIH0KKworICBvbmVvZiBmb28geworICAgIGludDMyIGludGVnZXJfZmllbGQgPSAyOworICAgIHN0cmluZyBzdHJpbmdfZmllbGQgPSAzOworICB9CiB9CiAKIG1lc3NhZ2UgVGVzdFJlcXVpcmVkT3B0aW1pemVkRm9yU2l6ZSB7CiAgIHJlcXVpcmVkIGludDMyIHggPSAxOwogfQotIAorCiBtZXNzYWdlIFRlc3RPcHRpb25hbE9wdGltaXplZEZvclNpemUgewogICBvcHRpb25hbCBUZXN0UmVxdWlyZWRPcHRpbWl6ZWRGb3JTaXplIG8gPSAxOwogfQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcmVzZXJ2ZV91bmtub3duX2VudW0ucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3ByZXNlcnZlX3Vua25vd25fZW51bTIucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJlc2VydmVfdW5rbm93bl9lbnVtMi5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzMucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYS5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2FyZW5hX2xpdGUucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19hcmVuYV9saXRlLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfcHJvdG8zX2xpdGUucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3Byb3RvM19saXRlLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bml0dGVzdF93ZWxsX2tub3duX3R5cGVzLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0X3dlbGxfa25vd25fdHlwZXMucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKaW5kZXggMzhhMzZkNS4uZDRlMzgzZCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTMyLDM1ICszMiw0NSBAQAogLy8gIEJhc2VkIG9uIG9yaWdpbmFsIFByb3RvY29sIEJ1ZmZlcnMgZGVzaWduIGJ5CiAvLyAgU2FuamF5IEdoZW1hd2F0LCBKZWZmIERlYW4sIGFuZCBvdGhlcnMuCiAKLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oPgorCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby96ZXJvX2NvcHlfc3RyZWFtLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKIAotbmFtZXNwYWNlIGludGVybmFsIHsKK25hbWVzcGFjZSB7CisvLyBUaGlzIGdsb2JhbCBpbnN0YW5jZSBpcyByZXR1cm5lZCBieSB1bmtub3duX2ZpZWxkcygpIG9uIGFueSBtZXNzYWdlIGNsYXNzCisvLyB3aGVuIHRoZSBvYmplY3QgaGFzIG5vIHVua25vd24gZmllbGRzLiBUaGlzIGlzIG5lY2Vzc2FyeSBiZWNhdXNlIHdlIG5vdworLy8gaW5zdGFudGlhdGUgdGhlIFVua25vd25GaWVsZFNldCBkeW5hbWljYWxseSBvbmx5IHdoZW4gcmVxdWlyZWQuCitVbmtub3duRmllbGRTZXQqIGRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfaW5zdGFuY2VfID0gTlVMTDsKIAotaW50IFN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoY29uc3Qgc3RyaW5nJiBzdHIpIHsKLSAgY29uc3Qgdm9pZCogc3RhcnQgPSAmc3RyOwotICBjb25zdCB2b2lkKiBlbmQgPSAmc3RyICsgMTsKLQotICBpZiAoc3RhcnQgPD0gc3RyLmRhdGEoKSAmJiBzdHIuZGF0YSgpIDw9IGVuZCkgewotICAgIC8vIFRoZSBzdHJpbmcncyBkYXRhIGlzIHN0b3JlZCBpbnNpZGUgdGhlIHN0cmluZyBvYmplY3QgaXRzZWxmLgotICAgIHJldHVybiAwOwotICB9IGVsc2UgewotICAgIHJldHVybiBzdHIuY2FwYWNpdHkoKTsKLSAgfQordm9pZCBEZWxldGVEZWZhdWx0VW5rbm93bkZpZWxkU2V0KCkgeworICBkZWxldGUgZGVmYXVsdF91bmtub3duX2ZpZWxkX3NldF9pbnN0YW5jZV87CiB9CiAKK3ZvaWQgSW5pdERlZmF1bHRVbmtub3duRmllbGRTZXQoKSB7CisgIGRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfaW5zdGFuY2VfID0gbmV3IFVua25vd25GaWVsZFNldCgpOworICBpbnRlcm5hbDo6T25TaHV0ZG93bigmRGVsZXRlRGVmYXVsdFVua25vd25GaWVsZFNldCk7Cit9CisKK0dPT0dMRV9QUk9UT0JVRl9ERUNMQVJFX09OQ0UoZGVmYXVsdF91bmtub3duX2ZpZWxkX3NldF9vbmNlX2luaXRfKTsKK30KKworY29uc3QgVW5rbm93bkZpZWxkU2V0KiBVbmtub3duRmllbGRTZXQ6OmRlZmF1bHRfaW5zdGFuY2UoKSB7CisgIDo6Z29vZ2xlOjpwcm90b2J1Zjo6R29vZ2xlT25jZUluaXQoJmRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfb25jZV9pbml0XywKKyAgICAgICAgICAgICAgICAgJkluaXREZWZhdWx0VW5rbm93bkZpZWxkU2V0KTsKKyAgcmV0dXJuIGRlZmF1bHRfdW5rbm93bl9maWVsZF9zZXRfaW5zdGFuY2VfOwogfQogCiBVbmtub3duRmllbGRTZXQ6OlVua25vd25GaWVsZFNldCgpCi0gIDogZmllbGRzXyhOVUxMKSB7fQorICAgIDogZmllbGRzXyhOVUxMKSB7fQogCiBVbmtub3duRmllbGRTZXQ6On5Vbmtub3duRmllbGRTZXQoKSB7CiAgIENsZWFyKCk7CkBAIC02OCwyOSArNzgsNzAgQEAKIH0KIAogdm9pZCBVbmtub3duRmllbGRTZXQ6OkNsZWFyRmFsbGJhY2soKSB7Ci0gIEdPT0dMRV9EQ0hFQ0soZmllbGRzXyAhPSBOVUxMKTsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBmaWVsZHNfLT5zaXplKCk7IGkrKykgewotICAgICgqZmllbGRzXylbaV0uRGVsZXRlKCk7CisgIGlmIChmaWVsZHNfICE9IE5VTEwpIHsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc18tPnNpemUoKTsgaSsrKSB7CisgICAgICAoKmZpZWxkc18pW2ldLkRlbGV0ZSgpOworICAgIH0KKyAgICBkZWxldGUgZmllbGRzXzsKKyAgICBmaWVsZHNfID0gTlVMTDsKICAgfQotICBmaWVsZHNfLT5jbGVhcigpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6Q2xlYXJBbmRGcmVlTWVtb3J5KCkgeworICBpZiAoZmllbGRzXyAhPSBOVUxMKSB7CisgICAgQ2xlYXIoKTsKKyAgfQorfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6SW50ZXJuYWxNZXJnZUZyb20oY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlcikgeworICBpbnQgb3RoZXJfZmllbGRfY291bnQgPSBvdGhlci5maWVsZF9jb3VudCgpOworICBpZiAob3RoZXJfZmllbGRfY291bnQgPiAwKSB7CisgICAgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgb3RoZXJfZmllbGRfY291bnQ7IGkrKykgeworICAgICAgZmllbGRzXy0+cHVzaF9iYWNrKCgqb3RoZXIuZmllbGRzXylbaV0pOworICAgICAgZmllbGRzXy0+YmFjaygpLkRlZXBDb3B5KCgqb3RoZXIuZmllbGRzXylbaV0pOworICAgIH0KKyAgfQogfQogCiB2b2lkIFVua25vd25GaWVsZFNldDo6TWVyZ2VGcm9tKGNvbnN0IFVua25vd25GaWVsZFNldCYgb3RoZXIpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlci5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBBZGRGaWVsZChvdGhlci5maWVsZChpKSk7CisgIGludCBvdGhlcl9maWVsZF9jb3VudCA9IG90aGVyLmZpZWxkX2NvdW50KCk7CisgIGlmIChvdGhlcl9maWVsZF9jb3VudCA+IDApIHsKKyAgICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlcl9maWVsZF9jb3VudDsgaSsrKSB7CisgICAgICBmaWVsZHNfLT5wdXNoX2JhY2soKCpvdGhlci5maWVsZHNfKVtpXSk7CisgICAgICBmaWVsZHNfLT5iYWNrKCkuRGVlcENvcHkoKCpvdGhlci5maWVsZHNfKVtpXSk7CisgICAgfQogICB9CiB9CiAKKy8vIEEgc3BlY2lhbGl6ZWQgTWVyZ2VGcm9tIGZvciBwZXJmb3JtYW5jZSB3aGVuIHdlIGFyZSBtZXJnaW5nIGZyb20gYW4gVUZTIHRoYXQKKy8vIGlzIHRlbXBvcmFyeSBhbmQgY2FuIGJlIGRlc3Ryb3llZCBpbiB0aGUgcHJvY2Vzcy4KK3ZvaWQgVW5rbm93bkZpZWxkU2V0OjpNZXJnZUZyb21BbmREZXN0cm95KFVua25vd25GaWVsZFNldCogb3RoZXIpIHsKKyAgaW50IG90aGVyX2ZpZWxkX2NvdW50ID0gb3RoZXItPmZpZWxkX2NvdW50KCk7CisgIGlmIChvdGhlcl9maWVsZF9jb3VudCA+IDApIHsKKyAgICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+KCk7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBvdGhlcl9maWVsZF9jb3VudDsgaSsrKSB7CisgICAgICBmaWVsZHNfLT5wdXNoX2JhY2soKCpvdGhlci0+ZmllbGRzXylbaV0pOworICAgICAgKCpvdGhlci0+ZmllbGRzXylbaV0uUmVzZXQoKTsKKyAgICB9CisgIH0KKyAgZGVsZXRlIG90aGVyLT5maWVsZHNfOworICBvdGhlci0+ZmllbGRzXyA9IE5VTEw7Cit9CisKIGludCBVbmtub3duRmllbGRTZXQ6OlNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKSBjb25zdCB7CiAgIGlmIChmaWVsZHNfID09IE5VTEwpIHJldHVybiAwOwogCiAgIGludCB0b3RhbF9zaXplID0gc2l6ZW9mKCpmaWVsZHNfKSArIHNpemVvZihVbmtub3duRmllbGQpICogZmllbGRzXy0+c2l6ZSgpOworCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgZmllbGRzXy0+c2l6ZSgpOyBpKyspIHsKICAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gKCpmaWVsZHNfKVtpXTsKICAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgewogICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfKSArCi0gICAgICAgICAgaW50ZXJuYWw6OlN0cmluZ1NwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYoKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfKTsKKyAgICAgICAgdG90YWxfc2l6ZSArPSBzaXplb2YoKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8pICsKKyAgICAgICAgICAgICAgICAgICAgICBpbnRlcm5hbDo6U3RyaW5nU3BhY2VVc2VkRXhjbHVkaW5nU2VsZigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKmZpZWxkLmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8pOwogICAgICAgICBicmVhazsKICAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgogICAgICAgICB0b3RhbF9zaXplICs9IGZpZWxkLmdyb3VwXy0+U3BhY2VVc2VkKCk7CkBAIC0xMDcsNjQgKzE1OCwxMDYgQEAKIH0KIAogdm9pZCBVbmtub3duRmllbGRTZXQ6OkFkZFZhcmludChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUpIHsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKICAgVW5rbm93bkZpZWxkIGZpZWxkOwogICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ7CisgIGZpZWxkLlNldFR5cGUoVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVCk7CiAgIGZpZWxkLnZhcmludF8gPSB2YWx1ZTsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwogICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwogfQogCiB2b2lkIFVua25vd25GaWVsZFNldDo6QWRkRml4ZWQzMihpbnQgbnVtYmVyLCB1aW50MzIgdmFsdWUpIHsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKICAgVW5rbm93bkZpZWxkIGZpZWxkOwogICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOworICBmaWVsZC5TZXRUeXBlKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyKTsKICAgZmllbGQuZml4ZWQzMl8gPSB2YWx1ZTsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwogICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwogfQogCiB2b2lkIFVua25vd25GaWVsZFNldDo6QWRkRml4ZWQ2NChpbnQgbnVtYmVyLCB1aW50NjQgdmFsdWUpIHsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKICAgVW5rbm93bkZpZWxkIGZpZWxkOwogICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OworICBmaWVsZC5TZXRUeXBlKFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0KTsKICAgZmllbGQuZml4ZWQ2NF8gPSB2YWx1ZTsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwogICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwogfQogCiBzdHJpbmcqIFVua25vd25GaWVsZFNldDo6QWRkTGVuZ3RoRGVsaW1pdGVkKGludCBudW1iZXIpIHsKLSAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPjsKICAgVW5rbm93bkZpZWxkIGZpZWxkOwogICBmaWVsZC5udW1iZXJfID0gbnVtYmVyOwotICBmaWVsZC50eXBlXyA9IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOwotICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkXyA9IG5ldyBzdHJpbmc7CisgIGZpZWxkLlNldFR5cGUoVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfID0gbmV3IHN0cmluZzsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwogICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwotICByZXR1cm4gZmllbGQubGVuZ3RoX2RlbGltaXRlZF87CisgIHJldHVybiBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfOwogfQogCisKIFVua25vd25GaWVsZFNldCogVW5rbm93bkZpZWxkU2V0OjpBZGRHcm91cChpbnQgbnVtYmVyKSB7Ci0gIGlmIChmaWVsZHNfID09IE5VTEwpIGZpZWxkc18gPSBuZXcgdmVjdG9yPFVua25vd25GaWVsZD47CiAgIFVua25vd25GaWVsZCBmaWVsZDsKICAgZmllbGQubnVtYmVyXyA9IG51bWJlcjsKLSAgZmllbGQudHlwZV8gPSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA7CisgIGZpZWxkLlNldFR5cGUoVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQKTsKICAgZmllbGQuZ3JvdXBfID0gbmV3IFVua25vd25GaWVsZFNldDsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgZmllbGRzXyA9IG5ldyB2ZWN0b3I8VW5rbm93bkZpZWxkPigpOwogICBmaWVsZHNfLT5wdXNoX2JhY2soZmllbGQpOwogICByZXR1cm4gZmllbGQuZ3JvdXBfOwogfQogCiB2b2lkIFVua25vd25GaWVsZFNldDo6QWRkRmllbGQoY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCkgewotICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+OworICBpZiAoZmllbGRzXyA9PSBOVUxMKSBmaWVsZHNfID0gbmV3IHZlY3RvcjxVbmtub3duRmllbGQ+KCk7CiAgIGZpZWxkc18tPnB1c2hfYmFjayhmaWVsZCk7Ci0gIGZpZWxkc18tPmJhY2soKS5EZWVwQ29weSgpOworICBmaWVsZHNfLT5iYWNrKCkuRGVlcENvcHkoZmllbGQpOworfQorCit2b2lkIFVua25vd25GaWVsZFNldDo6RGVsZXRlU3VicmFuZ2UoaW50IHN0YXJ0LCBpbnQgbnVtKSB7CisgIC8vIERlbGV0ZSB0aGUgc3BlY2lmaWVkIGZpZWxkcy4KKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW07ICsraSkgeworICAgICgqZmllbGRzXylbaSArIHN0YXJ0XS5EZWxldGUoKTsKKyAgfQorICAvLyBTbGlkZSBkb3duIHRoZSByZW1haW5pbmcgZmllbGRzLgorICBmb3IgKGludCBpID0gc3RhcnQgKyBudW07IGkgPCBmaWVsZHNfLT5zaXplKCk7ICsraSkgeworICAgICgqZmllbGRzXylbaSAtIG51bV0gPSAoKmZpZWxkc18pW2ldOworICB9CisgIC8vIFBvcCBvZmYgdGhlICMgb2YgZGVsZXRlZCBmaWVsZHMuCisgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtOyArK2kpIHsKKyAgICBmaWVsZHNfLT5wb3BfYmFjaygpOworICB9CisgIGlmIChmaWVsZHNfICYmIGZpZWxkc18tPnNpemUoKSA9PSAwKSB7CisgICAgLy8gbWFpbnRhaW4gaW52YXJpYW50OiBuZXZlciBob2xkIGZpZWxkc18gaWYgZW1wdHkuCisgICAgZGVsZXRlIGZpZWxkc187CisgICAgZmllbGRzXyA9IE5VTEw7CisgIH0KK30KKwordm9pZCBVbmtub3duRmllbGRTZXQ6OkRlbGV0ZUJ5TnVtYmVyKGludCBudW1iZXIpIHsKKyAgaWYgKGZpZWxkc18gPT0gTlVMTCkgcmV0dXJuOworICBpbnQgbGVmdCA9IDA7ICAvLyBUaGUgbnVtYmVyIG9mIGZpZWxkcyBsZWZ0IGFmdGVyIGRlbGV0aW9uLgorICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkc18tPnNpemUoKTsgKytpKSB7CisgICAgVW5rbm93bkZpZWxkKiBmaWVsZCA9ICYoKmZpZWxkc18pW2ldOworICAgIGlmIChmaWVsZC0+bnVtYmVyKCkgPT0gbnVtYmVyKSB7CisgICAgICBmaWVsZC0+RGVsZXRlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgIGlmIChpICE9IGxlZnQpIHsKKyAgICAgICAgKCpmaWVsZHNfKVtsZWZ0XSA9ICgqZmllbGRzXylbaV07CisgICAgICB9CisgICAgICArK2xlZnQ7CisgICAgfQorICB9CisgIGZpZWxkc18tPnJlc2l6ZShsZWZ0KTsKKyAgaWYgKGxlZnQgPT0gMCkgeworICAgIC8vIG1haW50YWluIGludmFyaWFudDogbmV2ZXIgaG9sZCBmaWVsZHNfIGlmIGVtcHR5LgorICAgIGRlbGV0ZSBmaWVsZHNfOworICAgIGZpZWxkc18gPSBOVUxMOworICB9CiB9CiAKIGJvb2wgVW5rbm93bkZpZWxkU2V0OjpNZXJnZUZyb21Db2RlZFN0cmVhbShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLQogICBVbmtub3duRmllbGRTZXQgb3RoZXI7Ci0gIGlmIChpbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlNraXBNZXNzYWdlKGlucHV0LCAmb3RoZXIpICYmCisgIGlmIChpbnRlcm5hbDo6V2lyZUZvcm1hdDo6U2tpcE1lc3NhZ2UoaW5wdXQsICZvdGhlcikgJiYKICAgICAgIGlucHV0LT5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSkgewotICAgIE1lcmdlRnJvbShvdGhlcik7CisgICAgTWVyZ2VGcm9tQW5kRGVzdHJveSgmb3RoZXIpOwogICAgIHJldHVybiB0cnVlOwogICB9IGVsc2UgewogICAgIHJldHVybiBmYWxzZTsKQEAgLTE3OCw4ICsyNzEsOCBAQAogCiBib29sIFVua25vd25GaWVsZFNldDo6UGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KSB7CiAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGNvZGVkX2lucHV0KGlucHV0KTsKLSAgcmV0dXJuIFBhcnNlRnJvbUNvZGVkU3RyZWFtKCZjb2RlZF9pbnB1dCkgJiYKLSAgICBjb2RlZF9pbnB1dC5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKTsKKyAgcmV0dXJuIChQYXJzZUZyb21Db2RlZFN0cmVhbSgmY29kZWRfaW5wdXQpICYmCisgICAgICAgICAgY29kZWRfaW5wdXQuQ29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpOwogfQogCiBib29sIFVua25vd25GaWVsZFNldDo6UGFyc2VGcm9tQXJyYXkoY29uc3Qgdm9pZCogZGF0YSwgaW50IHNpemUpIHsKQEAgLTE5MCw3ICsyODMsNyBAQAogdm9pZCBVbmtub3duRmllbGQ6OkRlbGV0ZSgpIHsKICAgc3dpdGNoICh0eXBlKCkpIHsKICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgotICAgICAgZGVsZXRlIGxlbmd0aF9kZWxpbWl0ZWRfOworICAgICAgZGVsZXRlIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87CiAgICAgICBicmVhazsKICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKICAgICAgIGRlbGV0ZSBncm91cF87CkBAIC0yMDAsMTQgKzI5MywzMSBAQAogICB9CiB9CiAKLXZvaWQgVW5rbm93bkZpZWxkOjpEZWVwQ29weSgpIHsKKy8vIFJlc2V0IGFsbCBvd25lZCBwdHJzLCBhIHNwZWNpYWwgZnVuY3Rpb24gZm9yIHBlcmZvcm1hbmNlLCB0byBhdm9pZCBkb3VibGUKKy8vIG93bmluZyB0aGUgcHRycywgd2hlbiB3ZSBtZXJnZSBmcm9tIGEgdGVtcG9yYXJ5IFVua25vd25GaWVsZFNldCBvYmplY3RzLgordm9pZCBVbmtub3duRmllbGQ6OlJlc2V0KCkgewogICBzd2l0Y2ggKHR5cGUoKSkgewogICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICBsZW5ndGhfZGVsaW1pdGVkXyA9IG5ldyBzdHJpbmcoKmxlbmd0aF9kZWxpbWl0ZWRfKTsKKyAgICAgIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8gPSBOVUxMOwogICAgICAgYnJlYWs7CiAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6IHsKLSAgICAgIFVua25vd25GaWVsZFNldCogZ3JvdXAgPSBuZXcgVW5rbm93bkZpZWxkU2V0OwotICAgICAgZ3JvdXAtPk1lcmdlRnJvbSgqZ3JvdXBfKTsKKyAgICAgIGdyb3VwXyA9IE5VTEw7CisgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDoKKyAgICAgIGJyZWFrOworICB9Cit9CisKK3ZvaWQgVW5rbm93bkZpZWxkOjpEZWVwQ29weShjb25zdCBVbmtub3duRmllbGQmIG90aGVyKSB7CisgIHN3aXRjaCAodHlwZSgpKSB7CisgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8gPSBuZXcgc3RyaW5nKAorICAgICAgICAgICpsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfKTsKKyAgICAgIGJyZWFrOworICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOiB7CisgICAgICBVbmtub3duRmllbGRTZXQqIGdyb3VwID0gbmV3IFVua25vd25GaWVsZFNldCgpOworICAgICAgZ3JvdXAtPkludGVybmFsTWVyZ2VGcm9tKCpncm91cF8pOwogICAgICAgZ3JvdXBfID0gZ3JvdXA7CiAgICAgICBicmVhazsKICAgICB9CkBAIC0yMTYsNSArMzI2LDIyIEBACiAgIH0KIH0KIAorCit2b2lkIFVua25vd25GaWVsZDo6U2VyaWFsaXplTGVuZ3RoRGVsaW1pdGVkTm9UYWcoCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIGNvbnN0IHsKKyAgR09PR0xFX0RDSEVDS19FUShUWVBFX0xFTkdUSF9ERUxJTUlURUQsIHR5cGUoKSk7CisgIGNvbnN0IHN0cmluZyYgZGF0YSA9ICpsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIoZGF0YS5zaXplKCkpOworICBvdXRwdXQtPldyaXRlUmF3TWF5YmVBbGlhc2VkKGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7Cit9CisKK3VpbnQ4KiBVbmtub3duRmllbGQ6OlNlcmlhbGl6ZUxlbmd0aERlbGltaXRlZE5vVGFnVG9BcnJheSh1aW50OCogdGFyZ2V0KSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0eXBlKCkpOworICBjb25zdCBzdHJpbmcmIGRhdGEgPSAqbGVuZ3RoX2RlbGltaXRlZF8uc3RyaW5nX3ZhbHVlXzsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShkYXRhLnNpemUoKSwgdGFyZ2V0KTsKKyAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZ1RvQXJyYXkoZGF0YSwgdGFyZ2V0KTsKKyAgcmV0dXJuIHRhcmdldDsKK30KKwogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXQuaAppbmRleCA4NGMyZTJiLi42MTJhOTQyIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0LmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM4LDEyICszOCwyNCBAQAogI2lmbmRlZiBHT09HTEVfUFJPVE9CVUZfVU5LTk9XTl9GSUVMRF9TRVRfSF9fCiAjZGVmaW5lIEdPT0dMRV9QUk9UT0JVRl9VTktOT1dOX0ZJRUxEX1NFVF9IX18KIAorI2luY2x1ZGUgPGFzc2VydC5oPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3JlcGVhdGVkX2ZpZWxkLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKKyAgbmFtZXNwYWNlIGlvIHsKKyAgICBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyAgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCisgICAgY2xhc3MgQ29kZWRPdXRwdXRTdHJlYW07ICAgICAgICAvLyBjb2RlZF9zdHJlYW0uaAorICAgIGNsYXNzIFplcm9Db3B5SW5wdXRTdHJlYW07ICAgICAgLy8gemVyb19jb3B5X3N0cmVhbS5oCisgIH0KKyAgbmFtZXNwYWNlIGludGVybmFsIHsKKyAgICBjbGFzcyBXaXJlRm9ybWF0OyAgICAgICAgICAgICAgIC8vIHdpcmVfZm9ybWF0LmgKKyAgICBjbGFzcyBNZXNzYWdlU2V0RmllbGRTa2lwcGVyVXNpbmdDb3JkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXh0ZW5zaW9uX3NldF9oZWF2eS5jYworICB9CiAKIGNsYXNzIE1lc3NhZ2U7ICAgICAgICAgICAgICAgICAgICAgIC8vIG1lc3NhZ2UuaAogY2xhc3MgVW5rbm93bkZpZWxkOyAgICAgICAgICAgICAgICAgLy8gYmVsb3cKQEAgLTY4LDEyICs4MCwxOCBAQAogICAvLyBSZW1vdmUgYWxsIGZpZWxkcy4KICAgaW5saW5lIHZvaWQgQ2xlYXIoKTsKIAorICAvLyBSZW1vdmUgYWxsIGZpZWxkcyBhbmQgZGVhbGxvY2F0ZSBpbnRlcm5hbCBkYXRhIG9iamVjdHMKKyAgdm9pZCBDbGVhckFuZEZyZWVNZW1vcnkoKTsKKwogICAvLyBJcyB0aGlzIHNldCBlbXB0eT8KICAgaW5saW5lIGJvb2wgZW1wdHkoKSBjb25zdDsKIAogICAvLyBNZXJnZSB0aGUgY29udGVudHMgb2Ygc29tZSBvdGhlciBVbmtub3duRmllbGRTZXQgd2l0aCB0aGlzIG9uZS4KICAgdm9pZCBNZXJnZUZyb20oY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlcik7CiAKKyAgLy8gU2ltaWxhciB0byBhYm92ZSwgYnV0IHRoaXMgZnVuY3Rpb24gd2lsbCBkZXN0cm95IHRoZSBjb250ZW50cyBvZiBvdGhlci4KKyAgdm9pZCBNZXJnZUZyb21BbmREZXN0cm95KFVua25vd25GaWVsZFNldCogb3RoZXIpOworCiAgIC8vIFN3YXBzIHRoZSBjb250ZW50cyBvZiBzb21lIG90aGVyIFVua25vd25GaWVsZFNldCB3aXRoIHRoaXMgb25lLgogICBpbmxpbmUgdm9pZCBTd2FwKFVua25vd25GaWVsZFNldCogeCk7CiAKQEAgLTEwNyw2ICsxMjUsMTUgQEAKICAgLy8gQWRkcyBhbiB1bmtub3duIGZpZWxkIGZyb20gYW5vdGhlciBzZXQuCiAgIHZvaWQgQWRkRmllbGQoY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCk7CiAKKyAgLy8gRGVsZXRlIGZpZWxkcyB3aXRoIGluZGljZXMgaW4gdGhlIHJhbmdlIFtzdGFydCAuLiBzdGFydCtudW0tMV0uCisgIC8vIENhdXRpb246IGltcGxlbWVudGF0aW9uIG1vdmVzIGFsbCBmaWVsZHMgd2l0aCBpbmRpY2VzIFtzdGFydCtudW0gLi4gXS4KKyAgdm9pZCBEZWxldGVTdWJyYW5nZShpbnQgc3RhcnQsIGludCBudW0pOworCisgIC8vIERlbGV0ZSBhbGwgZmllbGRzIHdpdGggYSBzcGVjaWZpYyBmaWVsZCBudW1iZXIuIFRoZSBvcmRlciBvZiBsZWZ0IGZpZWxkcworICAvLyBpcyBwcmVzZXJ2ZWQuCisgIC8vIENhdXRpb246IGltcGxlbWVudGF0aW9uIG1vdmVzIGFsbCBmaWVsZHMgYWZ0ZXIgdGhlIGZpcnN0IGRlbGV0ZWQgZmllbGQuCisgIHZvaWQgRGVsZXRlQnlOdW1iZXIoaW50IG51bWJlcik7CisKICAgLy8gUGFyc2luZyBoZWxwZXJzIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KICAgLy8gVGhlc2Ugd29yayBleGFjdGx5IGxpa2UgdGhlIHNpbWlsYXJseS1uYW1lZCBtZXRob2RzIG9mIE1lc3NhZ2UuCiAKQEAgLTExNSwxNCArMTQyLDI1IEBACiAgIGJvb2wgUGFyc2VGcm9tWmVyb0NvcHlTdHJlYW0oaW86Olplcm9Db3B5SW5wdXRTdHJlYW0qIGlucHV0KTsKICAgYm9vbCBQYXJzZUZyb21BcnJheShjb25zdCB2b2lkKiBkYXRhLCBpbnQgc2l6ZSk7CiAgIGlubGluZSBib29sIFBhcnNlRnJvbVN0cmluZyhjb25zdCBzdHJpbmcmIGRhdGEpIHsKLSAgICByZXR1cm4gUGFyc2VGcm9tQXJyYXkoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpKTsKKyAgICByZXR1cm4gUGFyc2VGcm9tQXJyYXkoZGF0YS5kYXRhKCksIHN0YXRpY19jYXN0PGludD4oZGF0YS5zaXplKCkpKTsKICAgfQogCisgIHN0YXRpYyBjb25zdCBVbmtub3duRmllbGRTZXQqIGRlZmF1bHRfaW5zdGFuY2UoKTsKICBwcml2YXRlOgorICAvLyBGb3IgSW50ZXJuYWxNZXJnZUZyb20KKyAgZnJpZW5kIGNsYXNzIFVua25vd25GaWVsZDsKKyAgLy8gTWVyZ2VzIGZyb20gb3RoZXIgVW5rbm93bkZpZWxkU2V0LiBUaGlzIG1ldGhvZCBhc3N1bWVzLCB0aGF0IHRoaXMgb2JqZWN0CisgIC8vIGlzIG5ld2x5IGNyZWF0ZWQgYW5kIGhhcyBmaWVsZHNfID09IE5VTEw7CisgIHZvaWQgSW50ZXJuYWxNZXJnZUZyb20oY29uc3QgVW5rbm93bkZpZWxkU2V0JiBvdGhlcik7CiAgIHZvaWQgQ2xlYXJGYWxsYmFjaygpOwogCi0gIHZlY3RvcjxVbmtub3duRmllbGQ+KiBmaWVsZHNfOwotCisgIC8vIGZpZWxkc18gaXMgZWl0aGVyIE5VTEwsIG9yIGEgcG9pbnRlciB0byBhIHZlY3RvciB0aGF0IGlzICpub24tZW1wdHkqLiBXZQorICAvLyBuZXZlciBob2xkIHRoZSBlbXB0eSB2ZWN0b3IgYmVjYXVzZSB3ZSB3YW50IHRoZSAnZG8gd2UgaGF2ZSBhbnkgdW5rbm93bgorICAvLyBmaWVsZHMnIGNoZWNrIHRvIGJlIGZhc3QsIGFuZCBhdm9pZCBhIGNhY2hlIG1pc3M6IHRoZSBVRlMgaW5zdGFuY2UgZ2V0cworICAvLyBlbWJlZGRlZCBpbiB0aGUgbWVzc2FnZSBvYmplY3QsIHNvICdmaWVsZHNfICE9IE5VTEwnIHRlc3RzIGEgbWVtYmVyCisgIC8vIHZhcmlhYmxlIGhvdCBpbiB0aGUgY2FjaGUsIHdpdGhvdXQgdGhlIG5lZWQgdG8gZ28gdG91Y2ggYSB2ZWN0b3Igc29tZXdoZXJlCisgIC8vIGVsc2UgaW4gbWVtb3J5LgorICBzdGQ6OnZlY3RvcjxVbmtub3duRmllbGQ+KiBmaWVsZHNfOwogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoVW5rbm93bkZpZWxkU2V0KTsKIH07CiAKQEAgLTE1OSwyMiArMTk3LDQzIEBACiAgIGlubGluZSBzdHJpbmcqIG11dGFibGVfbGVuZ3RoX2RlbGltaXRlZCgpOwogICBpbmxpbmUgVW5rbm93bkZpZWxkU2V0KiBtdXRhYmxlX2dyb3VwKCk7CiAKKyAgLy8gU2VyaWFsaXphdGlvbiBBUEkuCisgIC8vIFRoZXNlIG1ldGhvZHMgY2FuIHRha2UgYWR2YW50YWdlIG9mIHRoZSB1bmRlcmx5aW5nIGltcGxlbWVudGF0aW9uIGFuZCBtYXkKKyAgLy8gYXJjaGlldmUgYSBiZXR0ZXIgcGVyZm9ybWFuY2UgdGhhbiB1c2luZyBnZXR0ZXJzIHRvIHJldHJpZXZlIHRoZSBkYXRhIGFuZAorICAvLyBkbyB0aGUgc2VyaWFsaXphdGlvbiB5b3Vyc2VsZi4KKyAgdm9pZCBTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZyhpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgY29uc3Q7CisgIHVpbnQ4KiBTZXJpYWxpemVMZW5ndGhEZWxpbWl0ZWROb1RhZ1RvQXJyYXkodWludDgqIHRhcmdldCkgY29uc3Q7CisKKyAgaW5saW5lIGludCBHZXRMZW5ndGhEZWxpbWl0ZWRTaXplKCkgY29uc3Q7CisKICBwcml2YXRlOgogICBmcmllbmQgY2xhc3MgVW5rbm93bkZpZWxkU2V0OwogCiAgIC8vIElmIHRoaXMgVW5rbm93bkZpZWxkIGNvbnRhaW5zIGEgcG9pbnRlciwgZGVsZXRlIGl0LgogICB2b2lkIERlbGV0ZSgpOwogCi0gIC8vIE1ha2UgYSBkZWVwIGNvcHkgb2YgYW55IHBvaW50ZXJzIGluIHRoaXMgVW5rbm93bkZpZWxkLgotICB2b2lkIERlZXBDb3B5KCk7CisgIC8vIFJlc2V0IGFsbCB0aGUgdW5kZXJseWluZyBwb2ludGVycyB0byBOVUxMLiBBIHNwZWNpYWwgZnVuY3Rpb24gdG8gYmUgb25seQorICAvLyB1c2VkIHdoaWxlIG1lcmdpbmcgZnJvbSBhIHRlbXBvcmFyeSBVRlMuCisgIHZvaWQgUmVzZXQoKTsKIAotICB1bnNpZ25lZCBpbnQgbnVtYmVyXyA6IDI5OwotICB1bnNpZ25lZCBpbnQgdHlwZV8gICA6IDM7CisgIC8vIE1ha2UgYSBkZWVwIGNvcHkgb2YgYW55IHBvaW50ZXJzIGluIHRoaXMgVW5rbm93bkZpZWxkLgorICB2b2lkIERlZXBDb3B5KGNvbnN0IFVua25vd25GaWVsZCYgb3RoZXIpOworCisgIC8vIFNldCB0aGUgd2lyZSB0eXBlIG9mIHRoaXMgVW5rbm93bkZpZWxkLiBTaG91bGQgb25seSBiZSB1c2VkIHdoZW4gdGhpcworICAvLyBVbmtub3duRmllbGQgaXMgYmVpbmcgY3JlYXRlZC4KKyAgaW5saW5lIHZvaWQgU2V0VHlwZShUeXBlIHR5cGUpOworCisgIHVuaW9uIExlbmd0aERlbGltaXRlZCB7CisgICAgc3RyaW5nKiBzdHJpbmdfdmFsdWVfOworICB9OworCisgIHVpbnQzMiBudW1iZXJfOworICB1aW50MzIgdHlwZV87CiAgIHVuaW9uIHsKICAgICB1aW50NjQgdmFyaW50XzsKICAgICB1aW50MzIgZml4ZWQzMl87CiAgICAgdWludDY0IGZpeGVkNjRfOwotICAgIHN0cmluZyogbGVuZ3RoX2RlbGltaXRlZF87CisgICAgbXV0YWJsZSB1bmlvbiBMZW5ndGhEZWxpbWl0ZWQgbGVuZ3RoX2RlbGltaXRlZF87CiAgICAgVW5rbm93bkZpZWxkU2V0KiBncm91cF87CiAgIH07CiB9OwpAQCAtMTgzLDEzICsyNDIsMTQgQEAKIC8vIGlubGluZSBpbXBsZW1lbnRhdGlvbnMKIAogaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkU2V0OjpDbGVhcigpIHsKLSAgaWYgKGZpZWxkc18gIT0gTlVMTCkgeworICBpZiAoZmllbGRzXykgewogICAgIENsZWFyRmFsbGJhY2soKTsKICAgfQogfQogCiBpbmxpbmUgYm9vbCBVbmtub3duRmllbGRTZXQ6OmVtcHR5KCkgY29uc3QgewotICByZXR1cm4gZmllbGRzXyA9PSBOVUxMIHx8IGZpZWxkc18tPmVtcHR5KCk7CisgIC8vIEludmFyaWFudDogZmllbGRzXyBpcyBuZXZlciBlbXB0eSBpZiBwcmVzZW50LgorICByZXR1cm4gIWZpZWxkc187CiB9CiAKIGlubGluZSB2b2lkIFVua25vd25GaWVsZFNldDo6U3dhcChVbmtub3duRmllbGRTZXQqIHgpIHsKQEAgLTE5Nyw5ICsyNTcsMTAgQEAKIH0KIAogaW5saW5lIGludCBVbmtub3duRmllbGRTZXQ6OmZpZWxkX2NvdW50KCkgY29uc3QgewotICByZXR1cm4gKGZpZWxkc18gPT0gTlVMTCkgPyAwIDogZmllbGRzXy0+c2l6ZSgpOworICByZXR1cm4gZmllbGRzXyA/IHN0YXRpY19jYXN0PGludD4oZmllbGRzXy0+c2l6ZSgpKSA6IDA7CiB9CiBpbmxpbmUgY29uc3QgVW5rbm93bkZpZWxkJiBVbmtub3duRmllbGRTZXQ6OmZpZWxkKGludCBpbmRleCkgY29uc3QgeworICBHT09HTEVfRENIRUNLKGZpZWxkc18gIT0gTlVMTCk7CiAgIHJldHVybiAoKmZpZWxkc18pW2luZGV4XTsKIH0KIGlubGluZSBVbmtub3duRmllbGQqIFVua25vd25GaWVsZFNldDo6bXV0YWJsZV9maWVsZChpbnQgaW5kZXgpIHsKQEAgLTIxMSw1NyArMjcyLDY4IEBACiAgIEFkZExlbmd0aERlbGltaXRlZChudW1iZXIpLT5hc3NpZ24odmFsdWUpOwogfQogCisKIGlubGluZSBpbnQgVW5rbm93bkZpZWxkOjpudW1iZXIoKSBjb25zdCB7IHJldHVybiBudW1iZXJfOyB9CiBpbmxpbmUgVW5rbm93bkZpZWxkOjpUeXBlIFVua25vd25GaWVsZDo6dHlwZSgpIGNvbnN0IHsKICAgcmV0dXJuIHN0YXRpY19jYXN0PFR5cGU+KHR5cGVfKTsKIH0KIAotaW5saW5lIHVpbnQ2NCBVbmtub3duRmllbGQ6OnZhcmludCAoKSBjb25zdCB7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfVkFSSU5UKTsKK2lubGluZSB1aW50NjQgVW5rbm93bkZpZWxkOjp2YXJpbnQoKSBjb25zdCB7CisgIGFzc2VydCh0eXBlKCkgPT0gVFlQRV9WQVJJTlQpOwogICByZXR1cm4gdmFyaW50XzsKIH0KIGlubGluZSB1aW50MzIgVW5rbm93bkZpZWxkOjpmaXhlZDMyKCkgY29uc3QgewotICBHT09HTEVfRENIRUNLX0VRKHR5cGVfLCBUWVBFX0ZJWEVEMzIpOworICBhc3NlcnQodHlwZSgpID09IFRZUEVfRklYRUQzMik7CiAgIHJldHVybiBmaXhlZDMyXzsKIH0KIGlubGluZSB1aW50NjQgVW5rbm93bkZpZWxkOjpmaXhlZDY0KCkgY29uc3QgewotICBHT09HTEVfRENIRUNLX0VRKHR5cGVfLCBUWVBFX0ZJWEVENjQpOworICBhc3NlcnQodHlwZSgpID09IFRZUEVfRklYRUQ2NCk7CiAgIHJldHVybiBmaXhlZDY0XzsKIH0KIGlubGluZSBjb25zdCBzdHJpbmcmIFVua25vd25GaWVsZDo6bGVuZ3RoX2RlbGltaXRlZCgpIGNvbnN0IHsKLSAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgcmV0dXJuICpsZW5ndGhfZGVsaW1pdGVkXzsKKyAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICByZXR1cm4gKmxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV87CiB9CiBpbmxpbmUgY29uc3QgVW5rbm93bkZpZWxkU2V0JiBVbmtub3duRmllbGQ6Omdyb3VwKCkgY29uc3QgewotICBHT09HTEVfRENIRUNLX0VRKHR5cGVfLCBUWVBFX0dST1VQKTsKKyAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0dST1VQKTsKICAgcmV0dXJuICpncm91cF87CiB9CiAKIGlubGluZSB2b2lkIFVua25vd25GaWVsZDo6c2V0X3ZhcmludCh1aW50NjQgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9WQVJJTlQpOworICBhc3NlcnQodHlwZSgpID09IFRZUEVfVkFSSU5UKTsKICAgdmFyaW50XyA9IHZhbHVlOwogfQogaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfZml4ZWQzMih1aW50MzIgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9GSVhFRDMyKTsKKyAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0ZJWEVEMzIpOwogICBmaXhlZDMyXyA9IHZhbHVlOwogfQogaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfZml4ZWQ2NCh1aW50NjQgdmFsdWUpIHsKLSAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9GSVhFRDY0KTsKKyAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0ZJWEVENjQpOwogICBmaXhlZDY0XyA9IHZhbHVlOwogfQogaW5saW5lIHZvaWQgVW5rbm93bkZpZWxkOjpzZXRfbGVuZ3RoX2RlbGltaXRlZChjb25zdCBzdHJpbmcmIHZhbHVlKSB7Ci0gIEdPT0dMRV9EQ0hFQ0tfRVEodHlwZV8sIFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7Ci0gIGxlbmd0aF9kZWxpbWl0ZWRfLT5hc3NpZ24odmFsdWUpOworICBhc3NlcnQodHlwZSgpID09IFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgIGxlbmd0aF9kZWxpbWl0ZWRfLnN0cmluZ192YWx1ZV8tPmFzc2lnbih2YWx1ZSk7CiB9CiBpbmxpbmUgc3RyaW5nKiBVbmtub3duRmllbGQ6Om11dGFibGVfbGVuZ3RoX2RlbGltaXRlZCgpIHsKLSAgR09PR0xFX0RDSEVDS19FUSh0eXBlXywgVFlQRV9MRU5HVEhfREVMSU1JVEVEKTsKLSAgcmV0dXJuIGxlbmd0aF9kZWxpbWl0ZWRfOworICBhc3NlcnQodHlwZSgpID09IFRZUEVfTEVOR1RIX0RFTElNSVRFRCk7CisgIHJldHVybiBsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfOwogfQogaW5saW5lIFVua25vd25GaWVsZFNldCogVW5rbm93bkZpZWxkOjptdXRhYmxlX2dyb3VwKCkgewotICBHT09HTEVfRENIRUNLX0VRKHR5cGVfLCBUWVBFX0dST1VQKTsKKyAgYXNzZXJ0KHR5cGUoKSA9PSBUWVBFX0dST1VQKTsKICAgcmV0dXJuIGdyb3VwXzsKIH0KIAoraW5saW5lIGludCBVbmtub3duRmllbGQ6OkdldExlbmd0aERlbGltaXRlZFNpemUoKSBjb25zdCB7CisgIEdPT0dMRV9EQ0hFQ0tfRVEoVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0eXBlKCkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PihsZW5ndGhfZGVsaW1pdGVkXy5zdHJpbmdfdmFsdWVfLT5zaXplKCkpOworfQorCitpbmxpbmUgdm9pZCBVbmtub3duRmllbGQ6OlNldFR5cGUoVHlwZSB0eXBlKSB7CisgIHR5cGVfID0gdHlwZTsKK30KKworCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIAogfSAgLy8gbmFtZXNwYWNlIGdvb2dsZQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdW5rbm93bl9maWVsZF9zZXRfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYwppbmRleCAxMjM1YzllLi41ZGU3MjYzIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldF91bml0dGVzdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDMsMTggKzQzLDE5IEBACiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3VuaXR0ZXN0LnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NhbGxiYWNrLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL211dGV4Lmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RpbmcvZ29vZ2xldGVzdC5oPgogI2luY2x1ZGUgPGd0ZXN0L2d0ZXN0Lmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLWlubC5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9zdGxfdXRpbC5oPgogCiBuYW1lc3BhY2UgZ29vZ2xlIHsKIG5hbWVzcGFjZSBwcm90b2J1ZiB7CiAKIHVzaW5nIGludGVybmFsOjpXaXJlRm9ybWF0OwogCi1uYW1lc3BhY2UgewotCiBjbGFzcyBVbmtub3duRmllbGRTZXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHByb3RlY3RlZDoKICAgdmlydHVhbCB2b2lkIFNldFVwKCkgewpAQCAtMTA3LDYgKzEwOCw4IEBACiAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHNfOwogfTsKIAorbmFtZXNwYWNlIHsKKwogVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIEFsbEZpZWxkc1ByZXNlbnQpIHsKICAgLy8gQWxsIGZpZWxkcyBvZiBUZXN0QWxsVHlwZXMgc2hvdWxkIGJlIHByZXNlbnQsIGluIG51bWVyaWMgb3JkZXIgKGJlY2F1c2UKICAgLy8gdGhhdCdzIHRoZSBvcmRlciB3ZSBwYXJzZWQgdGhlbSBpbikuICBGaWVsZHMgdGhhdCBhcmUgbm90IHZhbGlkIGZpZWxkCkBAIC0xMTgsNyArMTIxLDEyIEBACiAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCA9IGRlc2NyaXB0b3JfLT5GaW5kRmllbGRCeU51bWJlcihpKTsKICAgICBpZiAoZmllbGQgIT0gTlVMTCkgewogICAgICAgQVNTRVJUX0xUKHBvcywgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKLSAgICAgIEVYUEVDVF9FUShpLCB1bmtub3duX2ZpZWxkc18tPmZpZWxkKHBvcysrKS5udW1iZXIoKSk7CisgICAgICAvLyBEbyBub3QgY2hlY2sgb25lb2YgZmllbGQgaWYgaXQgaXMgbm90IHNldC4KKyAgICAgIGlmIChmaWVsZC0+Y29udGFpbmluZ19vbmVvZigpID09IE5VTEwpIHsKKyAgICAgICAgRVhQRUNUX0VRKGksIHVua25vd25fZmllbGRzXy0+ZmllbGQocG9zKyspLm51bWJlcigpKTsKKyAgICAgIH0gZWxzZSBpZiAoaSA9PSB1bmtub3duX2ZpZWxkc18tPmZpZWxkKHBvcykubnVtYmVyKCkpIHsKKyAgICAgICAgcG9zKys7CisgICAgICB9CiAgICAgICBpZiAoZmllbGQtPmlzX3JlcGVhdGVkKCkpIHsKICAgICAgICAgLy8gU2hvdWxkIGhhdmUgYSBzZWNvbmQgaW5zdGFuY2UuCiAgICAgICAgIEFTU0VSVF9MVChwb3MsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7CkBAIC0yOTcsMTIgKzMwNSwyMSBAQAogICAgIGRlc3RpbmF0aW9uLkRlYnVnU3RyaW5nKCkpOwogfQogCisKIFRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBDbGVhcikgewogICAvLyBDbGVhciB0aGUgc2V0LgogICBlbXB0eV9tZXNzYWdlXy5DbGVhcigpOwogICBFWFBFQ1RfRVEoMCwgdW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpKTsKIH0KIAorVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIENsZWFyQW5kRnJlZU1lbW9yeSkgeworICBFWFBFQ1RfR1QodW5rbm93bl9maWVsZHNfLT5maWVsZF9jb3VudCgpLCAwKTsKKyAgdW5rbm93bl9maWVsZHNfLT5DbGVhckFuZEZyZWVNZW1vcnkoKTsKKyAgRVhQRUNUX0VRKDAsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7CisgIHVua25vd25fZmllbGRzXy0+QWRkVmFyaW50KDEyMzQ1NiwgNjU0MzIxKTsKKyAgRVhQRUNUX0VRKDEsIHVua25vd25fZmllbGRzXy0+ZmllbGRfY291bnQoKSk7Cit9CisKIFRFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBQYXJzZUtub3duQW5kVW5rbm93bikgewogICAvLyBUZXN0IG1peGluZyBrbm93biBhbmQgdW5rbm93biBmaWVsZHMgd2hlbiBwYXJzaW5nLgogCkBAIC00NjgsNiArNDg1LDEzIEBACiAgIH0KIH0KIAorVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIFNwYWNlVXNlZEV4Y2x1ZGluZ1NlbGYpIHsKKyAgVW5rbm93bkZpZWxkU2V0IGVtcHR5OworICBlbXB0eS5BZGRWYXJpbnQoMSwgMCk7CisgIEVYUEVDVF9FUShzaXplb2YodmVjdG9yPFVua25vd25GaWVsZD4pICsgc2l6ZW9mKFVua25vd25GaWVsZCksCisgICAgICAgICAgICBlbXB0eS5TcGFjZVVzZWRFeGNsdWRpbmdTZWxmKCkpOworfQorCiBURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgU3BhY2VVc2VkKSB7CiAgIHVuaXR0ZXN0OjpUZXN0RW1wdHlNZXNzYWdlIGVtcHR5X21lc3NhZ2U7CiAKQEAgLTQ5OCw2ICs1MjIsNyBAQAogICBFWFBFQ1RfTFQoYmFzZV9zaXplLCBlbXB0eV9tZXNzYWdlLlNwYWNlVXNlZCgpKTsKIH0KIAorCiBURVNUX0YoVW5rbm93bkZpZWxkU2V0VGVzdCwgRW1wdHkpIHsKICAgVW5rbm93bkZpZWxkU2V0IHVua25vd25fZmllbGRzOwogICBFWFBFQ1RfVFJVRSh1bmtub3duX2ZpZWxkcy5lbXB0eSgpKTsKQEAgLTUwNyw2ICs1MzIsNzggQEAKICAgRVhQRUNUX1RSVUUodW5rbm93bl9maWVsZHMuZW1wdHkoKSk7CiB9CiAKK1RFU1RfRihVbmtub3duRmllbGRTZXRUZXN0LCBEZWxldGVTdWJyYW5nZSkgeworICAvLyBFeGhhdXN0aXZlbHkgdGVzdCB0aGUgZGVsZXRpb24gb2YgZXZlcnkgcG9zc2libGUgc3VicmFuZ2UgaW4gYXJyYXlzIG9mIGFsbAorICAvLyBzaXplcyBmcm9tIDAgdGhyb3VnaCA5LgorICBmb3IgKGludCBzaXplID0gMDsgc2l6ZSA8IDEwOyArK3NpemUpIHsKKyAgICBmb3IgKGludCBudW0gPSAwOyBudW0gPD0gc2l6ZTsgKytudW0pIHsKKyAgICAgIGZvciAoaW50IHN0YXJ0ID0gMDsgc3RhcnQgPCBzaXplIC0gbnVtOyArK3N0YXJ0KSB7CisgICAgICAgIC8vIENyZWF0ZSBhIHNldCB3aXRoICJzaXplIiBmaWVsZHMuCisgICAgICAgIFVua25vd25GaWVsZFNldCB1bmtub3duOworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IHNpemU7ICsraSkgeworICAgICAgICAgIHVua25vd24uQWRkRml4ZWQzMihpLCBpKTsKKyAgICAgICAgfQorICAgICAgICAvLyBEZWxldGUgdGhlIHNwZWNpZmllZCBzdWJyYW5nZS4KKyAgICAgICAgdW5rbm93bi5EZWxldGVTdWJyYW5nZShzdGFydCwgbnVtKTsKKyAgICAgICAgLy8gTWFrZSBzdXJlIHRoZSByZXN1bHRpbmcgZmllbGQgdmFsdWVzIGFyZSBzdGlsbCBjb3JyZWN0LgorICAgICAgICBFWFBFQ1RfRVEoc2l6ZSAtIG51bSwgdW5rbm93bi5maWVsZF9jb3VudCgpKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duLmZpZWxkX2NvdW50KCk7ICsraSkgeworICAgICAgICAgIGlmIChpIDwgc3RhcnQpIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpLCB1bmtub3duLmZpZWxkKGkpLmZpeGVkMzIoKSk7CisgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEVYUEVDVF9FUShpICsgbnVtLCB1bmtub3duLmZpZWxkKGkpLmZpeGVkMzIoKSk7CisgICAgICAgICAgfQorICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9Cit9CisKK3ZvaWQgQ2hlY2tEZWxldGVCeU51bWJlcihjb25zdCB2ZWN0b3I8aW50PiYgZmllbGRfbnVtYmVycywgaW50IGRlbGV0ZWRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdmVjdG9yPGludD4mIGV4cGVjdGVkX2ZpZWxkX251Ym1lcnMpIHsKKyAgVW5rbm93bkZpZWxkU2V0IHVua25vd25fZmllbGRzOworICBmb3IgKGludCBpID0gMDsgaSA8IGZpZWxkX251bWJlcnMuc2l6ZSgpOyArK2kpIHsKKyAgICB1bmtub3duX2ZpZWxkcy5BZGRGaXhlZDMyKGZpZWxkX251bWJlcnNbaV0sIGkpOworICB9CisgIHVua25vd25fZmllbGRzLkRlbGV0ZUJ5TnVtYmVyKGRlbGV0ZWRfbnVtYmVyKTsKKyAgQVNTRVJUX0VRKGV4cGVjdGVkX2ZpZWxkX251Ym1lcnMuc2l6ZSgpLCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpKTsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCBleHBlY3RlZF9maWVsZF9udWJtZXJzLnNpemUoKTsgKytpKSB7CisgICAgRVhQRUNUX0VRKGV4cGVjdGVkX2ZpZWxkX251Ym1lcnNbaV0sCisgICAgICAgICAgICAgIHVua25vd25fZmllbGRzLmZpZWxkKGkpLm51bWJlcigpKTsKKyAgfQorfQorCisjZGVmaW5lIE1BS0VfVkVDVE9SKHgpIHZlY3RvcjxpbnQ+KHgsIHggKyBHT09HTEVfQVJSQVlTSVpFKHgpKQorVEVTVF9GKFVua25vd25GaWVsZFNldFRlc3QsIERlbGV0ZUJ5TnVtYmVyKSB7CisgIENoZWNrRGVsZXRlQnlOdW1iZXIodmVjdG9yPGludD4oKSwgMSwgdmVjdG9yPGludD4oKSk7CisgIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RGaWVsZE51bWJlcnMxW10gPSB7MSwgMiwgM307CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpZWxkTnVtYmVyVG9EZWxldGUxID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBrRXhwZWN0ZWRGaWVsZE51bWJlcnMxW10gPSB7MiwgM307CisgIENoZWNrRGVsZXRlQnlOdW1iZXIoTUFLRV9WRUNUT1Ioa1Rlc3RGaWVsZE51bWJlcnMxKSwga0ZpZWxkTnVtYmVyVG9EZWxldGUxLAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfVkVDVE9SKGtFeHBlY3RlZEZpZWxkTnVtYmVyczEpKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczJbXSA9IHsxLCAyLCAzfTsKKyAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTIgPSAyOworICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczJbXSA9IHsxLCAzfTsKKyAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczIpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTIsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzMikpOworICBzdGF0aWMgY29uc3QgaW50IGtUZXN0RmllbGROdW1iZXJzM1tdID0gezEsIDIsIDN9OworICBzdGF0aWMgY29uc3QgaW50IGtGaWVsZE51bWJlclRvRGVsZXRlMyA9IDM7CisgIHN0YXRpYyBjb25zdCBpbnQga0V4cGVjdGVkRmllbGROdW1iZXJzM1tdID0gezEsIDJ9OworICBDaGVja0RlbGV0ZUJ5TnVtYmVyKE1BS0VfVkVDVE9SKGtUZXN0RmllbGROdW1iZXJzMyksIGtGaWVsZE51bWJlclRvRGVsZXRlMywKKyAgICAgICAgICAgICAgICAgICAgICBNQUtFX1ZFQ1RPUihrRXhwZWN0ZWRGaWVsZE51bWJlcnMzKSk7CisgIHN0YXRpYyBjb25zdCBpbnQga1Rlc3RGaWVsZE51bWJlcnM0W10gPSB7MSwgMiwgMSwgNCwgMX07CisgIHN0YXRpYyBjb25zdCBpbnQga0ZpZWxkTnVtYmVyVG9EZWxldGU0ID0gMTsKKyAgc3RhdGljIGNvbnN0IGludCBrRXhwZWN0ZWRGaWVsZE51bWJlcnM0W10gPSB7MiwgNH07CisgIENoZWNrRGVsZXRlQnlOdW1iZXIoTUFLRV9WRUNUT1Ioa1Rlc3RGaWVsZE51bWJlcnM0KSwga0ZpZWxkTnVtYmVyVG9EZWxldGU0LAorICAgICAgICAgICAgICAgICAgICAgIE1BS0VfVkVDVE9SKGtFeHBlY3RlZEZpZWxkTnVtYmVyczQpKTsKKyAgc3RhdGljIGNvbnN0IGludCBrVGVzdEZpZWxkTnVtYmVyczVbXSA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgc3RhdGljIGNvbnN0IGludCBrRmllbGROdW1iZXJUb0RlbGV0ZTUgPSA2OworICBzdGF0aWMgY29uc3QgaW50IGtFeHBlY3RlZEZpZWxkTnVtYmVyczVbXSA9IHsxLCAyLCAzLCA0LCA1fTsKKyAgQ2hlY2tEZWxldGVCeU51bWJlcihNQUtFX1ZFQ1RPUihrVGVzdEZpZWxkTnVtYmVyczUpLCBrRmllbGROdW1iZXJUb0RlbGV0ZTUsCisgICAgICAgICAgICAgICAgICAgICAgTUFLRV9WRUNUT1Ioa0V4cGVjdGVkRmllbGROdW1iZXJzNSkpOworfQorI3VuZGVmIE1BS0VfVkVDVE9SCiB9ICAvLyBuYW1lc3BhY2UKKwogfSAgLy8gbmFtZXNwYWNlIHByb3RvYnVmCiB9ICAvLyBuYW1lc3BhY2UgZ29vZ2xlCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvci5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3IuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3JfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfY29tcGFyYXRvcl90ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX2NvbXBhcmF0b3JfdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9maWVsZF9tYXNrX3V0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ZpZWxkX21hc2tfdXRpbF90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvZmllbGRfbWFza191dGlsX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvY29uc3RhbnRzLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9jb25zdGFudHMuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGF0YXBpZWNlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kYXRhcGllY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RhdGFwaWVjZS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9kZWZhdWx0X3ZhbHVlX29iamVjdHdyaXRlci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2RlZmF1bHRfdmFsdWVfb2JqZWN0d3JpdGVyX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZGVmYXVsdF92YWx1ZV9vYmplY3R3cml0ZXJfdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9lcnJvcl9saXN0ZW5lci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2Vycm9yX2xpc3RlbmVyLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXJyb3JfbGlzdGVuZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2V4cGVjdGluZ19vYmplY3R3cml0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXhwZWN0aW5nX29iamVjdHdyaXRlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZXhwZWN0aW5nX29iamVjdHdyaXRlci5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2V4cGVjdGluZ19vYmplY3R3cml0ZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvZmllbGRfbWFza191dGlsaXR5LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9maWVsZF9tYXNrX3V0aWxpdHkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2ZpZWxkX21hc2tfdXRpbGl0eS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9lc2NhcGluZy5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fZXNjYXBpbmcuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9vYmplY3R3cml0ZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX29iamVjdHdyaXRlcl90ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fb2JqZWN0d3JpdGVyX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlci5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvanNvbl9zdHJlYW1fcGFyc2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9qc29uX3N0cmVhbV9wYXJzZXJfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL2pzb25fc3RyZWFtX3BhcnNlcl90ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbG9jYXRpb25fdHJhY2tlci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9sb2NhdGlvbl90cmFja2VyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9sb2NhdGlvbl90cmFja2VyLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbG9jYXRpb25fdHJhY2tlci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbW9ja19lcnJvcl9saXN0ZW5lci5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9tb2NrX2Vycm9yX2xpc3RlbmVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9tb2NrX2Vycm9yX2xpc3RlbmVyLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvbW9ja19lcnJvcl9saXN0ZW5lci5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X2xvY2F0aW9uX3RyYWNrZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X2xvY2F0aW9uX3RyYWNrZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9sb2NhdGlvbl90cmFja2VyLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X2xvY2F0aW9uX3RyYWNrZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9zb3VyY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3NvdXJjZS5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvb2JqZWN0X3NvdXJjZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF9zb3VyY2UuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL29iamVjdF93cml0ZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9vYmplY3Rfd3JpdGVyLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvX3dyaXRlci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3RvX3dyaXRlci5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9fd3JpdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b193cml0ZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3Rzb3VyY2UuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZS5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHNvdXJjZV90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0c291cmNlX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlci5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvcHJvdG9zdHJlYW1fb2JqZWN0d3JpdGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC9wcm90b3N0cmVhbV9vYmplY3R3cml0ZXJfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Byb3Rvc3RyZWFtX29iamVjdHdyaXRlcl90ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3N0cnVjdHVyZWRfb2JqZWN0d3JpdGVyLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvc3RydWN0dXJlZF9vYmplY3R3cml0ZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9hbnlzLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2FueXMucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvYm9va3MucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9ib29rcy5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWUucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL2RlZmF1bHRfdmFsdWVfdGVzdC5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9kZWZhdWx0X3ZhbHVlX3Rlc3QucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvZmllbGRfbWFzay5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS9maWVsZF9tYXNrLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL21hcHMucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvbWFwcy5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvb25lb2ZzLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL29uZW9mcy5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvc3RydWN0LnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3N0cnVjdC5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wcm90byBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdGVzdGRhdGEvdGltZXN0YW1wX2R1cmF0aW9uLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3RpbWVzdGFtcF9kdXJhdGlvbi5wcm90bwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90ZXN0ZGF0YS93cmFwcGVycy5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnByb3RvCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3Rlc3RkYXRhL3dyYXBwZXJzLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm8uY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mby5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3R5cGVfaW5mb190ZXN0X2hlbHBlci5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvaW50ZXJuYWwvdHlwZV9pbmZvX3Rlc3RfaGVscGVyLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC90eXBlX2luZm9fdGVzdF9oZWxwZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2ludGVybmFsL3V0aWxpdHkuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9pbnRlcm5hbC91dGlsaXR5LmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucHJvdG8gYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wcm90bwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fZm9ybWF0X3Byb3RvMy5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX2Zvcm1hdF9wcm90bzMucHJvdG8KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvanNvbl91dGlsLmgKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuaApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWwuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9qc29uX3V0aWxfdGVzdC5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL2pzb25fdXRpbF90ZXN0LmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5jYwpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlci5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL21lc3NhZ2VfZGlmZmVyZW5jZXJfdW5pdHRlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnByb3RvCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvbWVzc2FnZV9kaWZmZXJlbmNlcl91bml0dGVzdC5wcm90bwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC9tZXNzYWdlX2RpZmZlcmVuY2VyX3VuaXR0ZXN0LnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWwuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmNjCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3RpbWVfdXRpbC5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmgKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsLmgKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdGltZV91dGlsX3Rlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90aW1lX3V0aWxfdGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlci5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXIuaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvdXRpbC90eXBlX3Jlc29sdmVyX3V0aWwuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbC5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi91dGlsL3R5cGVfcmVzb2x2ZXJfdXRpbF90ZXN0LmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3V0aWwvdHlwZV9yZXNvbHZlcl91dGlsX3Rlc3QuY2MKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dlbGxfa25vd25fdHlwZXNfdW5pdHRlc3QuY2MKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYwpyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2VsbF9rbm93bl90eXBlc191bml0dGVzdC5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuY2MgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYwppbmRleCBkMDdmNjMzLi41ZWU0ZTI1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYworKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5jYwpAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzgsNyArMzgsOSBAQAogCiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0Lmg+CiAKKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvbG9nZ2luZy5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9jb21tb24uaD4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RyaW5ncHJpbnRmLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvZGVzY3JpcHRvci5wYi5oPgpAQCAtNDgsMjAgKzUwLDMzMyBAQAogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bmtub3duX2ZpZWxkX3NldC5oPgogCiAKKwogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGludGVybmFsIHsKIAotdXNpbmcgaW50ZXJuYWw6OldpcmVGb3JtYXRMaXRlOworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogCi1uYW1lc3BhY2UgewotCi0vLyBUaGlzIGZ1bmN0aW9uIHR1cm5zIG91dCB0byBiZSBjb252ZW5pZW50IHdoZW4gdXNpbmcgc29tZSBtYWNyb3MgbGF0ZXIuCi1pbmxpbmUgaW50IEdldEVudW1OdW1iZXIoY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZGVzY3JpcHRvcikgewotICByZXR1cm4gZGVzY3JpcHRvci0+bnVtYmVyKCk7Citib29sIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcjo6U2tpcEZpZWxkKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZykgeworICByZXR1cm4gV2lyZUZvcm1hdDo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzXyk7CiB9CiAKLX0gIC8vIGFub255bW91cyBuYW1lc3BhY2UKK2Jvb2wgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKGlucHV0LCB1bmtub3duX2ZpZWxkc18pOworfQorCit2b2lkIFVua25vd25GaWVsZFNldEZpZWxkU2tpcHBlcjo6U2tpcFVua25vd25FbnVtKAorICAgIGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSkgeworICB1bmtub3duX2ZpZWxkc18tPkFkZFZhcmludChmaWVsZF9udW1iZXIsIHZhbHVlKTsKK30KKworYm9vbCBXaXJlRm9ybWF0OjpTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICBpbnQgbnVtYmVyID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7CisKKyAgc3dpdGNoIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSkgeworICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDogeworICAgICAgdWludDY0IHZhbHVlOworICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICh1bmtub3duX2ZpZWxkcyAhPSBOVUxMKSB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgdmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ6IHsKKyAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW42NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodW5rbm93bl9maWVsZHMgIT0gTlVMTCkgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQobnVtYmVyLCB2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDogeworICAgICAgdWludDMyIGxlbmd0aDsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgaWYgKHVua25vd25fZmllbGRzID09IE5VTEwpIHsKKyAgICAgICAgaWYgKCFpbnB1dC0+U2tpcChsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICB9IGVsc2UgeworICAgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQobnVtYmVyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpKSB7CisgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVA6IHsKKyAgICAgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghU2tpcE1lc3NhZ2UoaW5wdXQsICh1bmtub3duX2ZpZWxkcyA9PSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMIDogdW5rbm93bl9maWVsZHMtPkFkZEdyb3VwKG51bWJlcikpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgIH0KKyAgICAgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZW5kaW5nIHRhZyBtYXRjaGVkIHRoZSBzdGFydGluZyB0YWcuCisgICAgICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQOiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzI6IHsKKyAgICAgIHVpbnQzMiB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICBpZiAodW5rbm93bl9maWVsZHMgIT0gTlVMTCkgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkMzIobnVtYmVyLCB2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCitib29sIFdpcmVGb3JtYXQ6OlNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgeworICB3aGlsZSAodHJ1ZSkgeworICAgIHVpbnQzMiB0YWcgPSBpbnB1dC0+UmVhZFRhZygpOworICAgIGlmICh0YWcgPT0gMCkgeworICAgICAgLy8gRW5kIG9mIGlucHV0LiAgVGhpcyBpcyBhIHZhbGlkIHBsYWNlIHRvIGVuZCwgc28gcmV0dXJuIHRydWUuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgd2lyZV90eXBlID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ1dpcmVUeXBlKHRhZyk7CisKKyAgICBpZiAod2lyZV90eXBlID09IFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApIHsKKyAgICAgIC8vIE11c3QgYmUgdGhlIGVuZCBvZiB0aGUgbWVzc2FnZS4KKyAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIGlmICghU2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzKSkgcmV0dXJuIGZhbHNlOworICB9Cit9CisKK2Jvb2wgV2lyZUZvcm1hdDo6UmVhZFBhY2tlZEVudW1QcmVzZXJ2ZVVua25vd25zKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sICgqaXNfdmFsaWQpKGludCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxpbnQ+KiB2YWx1ZXMpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9IGlucHV0LT5QdXNoTGltaXQobGVuZ3RoKTsKKyAgd2hpbGUgKGlucHV0LT5CeXRlc1VudGlsTGltaXQoKSA+IDApIHsKKyAgICBpbnQgdmFsdWU7CisgICAgaWYgKCFnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6V2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8CisgICAgICAgIGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oaW5wdXQsICZ2YWx1ZSkpIHsKKyAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgaWYgKGlzX3ZhbGlkID09IE5VTEwgfHwgaXNfdmFsaWQodmFsdWUpKSB7CisgICAgICB2YWx1ZXMtPkFkZCh2YWx1ZSk7CisgICAgfSBlbHNlIHsKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRWYXJpbnQoZmllbGRfbnVtYmVyLCB2YWx1ZSk7CisgICAgfQorICB9CisgIGlucHV0LT5Qb3BMaW1pdChsaW1pdCk7CisgIHJldHVybiB0cnVlOworfQorCisKK3ZvaWQgV2lyZUZvcm1hdDo6U2VyaWFsaXplVW5rbm93bkZpZWxkcyhjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CisgIGZvciAoaW50IGkgPSAwOyBpIDwgdW5rbm93bl9maWVsZHMuZmllbGRfY291bnQoKTsgaSsrKSB7CisgICAgY29uc3QgVW5rbm93bkZpZWxkJiBmaWVsZCA9IHVua25vd25fZmllbGRzLmZpZWxkKGkpOworICAgIHN3aXRjaCAoZmllbGQudHlwZSgpKSB7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6CisgICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQpKTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDY0KGZpZWxkLnZhcmludCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgorICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMikpOworICAgICAgICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuMzIoZmllbGQuZml4ZWQzMigpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgorICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkpOworICAgICAgICBvdXRwdXQtPldyaXRlTGl0dGxlRW5kaWFuNjQoZmllbGQuZml4ZWQ2NCgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEOgorICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCkpOworICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpLnNpemUoKSk7CisgICAgICAgIG91dHB1dC0+V3JpdGVSYXdNYXliZUFsaWFzZWQoZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpLmRhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9HUk9VUDoKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQKSk7CisgICAgICAgIFNlcmlhbGl6ZVVua25vd25GaWVsZHMoZmllbGQuZ3JvdXAoKSwgb3V0cHV0KTsKKyAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KK30KKwordWludDgqIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgdWludDgqIHRhcmdldCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKworICAgIHN3aXRjaCAoZmllbGQudHlwZSgpKSB7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6CisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC52YXJpbnQoKSwgdGFyZ2V0KTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgorICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyVG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC5maXhlZDMyKCksIHRhcmdldCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKKyAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NFRvQXJyYXkoCisgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgZmllbGQuZml4ZWQ2NCgpLCB0YXJnZXQpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6CisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzVG9BcnJheSgKKyAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCksIHRhcmdldCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoCisgICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQLCB0YXJnZXQpOworICAgICAgICB0YXJnZXQgPSBTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheShmaWVsZC5ncm91cCgpLCB0YXJnZXQpOworICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVAsIHRhcmdldCk7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgfQorICByZXR1cm4gdGFyZ2V0OworfQorCit2b2lkIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCisgICAgY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKyAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKKyAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCisgICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgLy8gU3RhcnQgZ3JvdXAuCisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKTsKKworICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWcpOworICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGZpZWxkLm51bWJlcigpKTsKKworICAgICAgLy8gV3JpdGUgbWVzc2FnZS4KKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnKTsKKyAgICAgIGZpZWxkLlNlcmlhbGl6ZUxlbmd0aERlbGltaXRlZE5vVGFnKG91dHB1dCk7CisKKyAgICAgIC8vIEVuZCBncm91cC4KKyAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKKyAgICB9CisgIH0KK30KKwordWludDgqIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXNUb0FycmF5KAorICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgdWludDgqIHRhcmdldCkgeworICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgeworICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKKworICAgIC8vIFRoZSBvbmx5IHVua25vd24gZmllbGRzIHRoYXQgYXJlIGFsbG93ZWQgdG8gZXhpc3QgaW4gYSBNZXNzYWdlU2V0IGFyZQorICAgIC8vIG1lc3NhZ2VzLCB3aGljaCBhcmUgbGVuZ3RoLWRlbGltaXRlZC4KKyAgICBpZiAoZmllbGQudHlwZSgpID09IFVua25vd25GaWVsZDo6VFlQRV9MRU5HVEhfREVMSU1JVEVEKSB7CisgICAgICAvLyBTdGFydCBncm91cC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKKworICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZywgdGFyZ2V0KTsKKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCisgICAgICAgICAgZmllbGQubnVtYmVyKCksIHRhcmdldCk7CisKKyAgICAgIC8vIFdyaXRlIG1lc3NhZ2UuCisgICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnLCB0YXJnZXQpOworICAgICAgdGFyZ2V0ID0gZmllbGQuU2VyaWFsaXplTGVuZ3RoRGVsaW1pdGVkTm9UYWdUb0FycmF5KHRhcmdldCk7CisKKyAgICAgIC8vIEVuZCBncm91cC4KKyAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcsIHRhcmdldCk7CisgICAgfQorICB9CisKKyAgcmV0dXJuIHRhcmdldDsKK30KKworaW50IFdpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKSB7CisgIGludCBzaXplID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisKKyAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgeworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSk7CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQoZmllbGQudmFyaW50KCkpOworICAgICAgICBicmVhazsKKyAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyKSk7CisgICAgICAgIHNpemUgKz0gc2l6ZW9mKGludDMyKTsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgorICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkpOworICAgICAgICBzaXplICs9IHNpemVvZihpbnQ2NCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKTsKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCkpOworICAgICAgICBzaXplICs9IGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCk7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6CisgICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCisgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCkpOworICAgICAgICBzaXplICs9IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZShmaWVsZC5ncm91cCgpKTsKKyAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKKyAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAorICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpOworICAgICAgICBicmVhazsKKyAgICB9CisgIH0KKworICByZXR1cm4gc2l6ZTsKK30KKworaW50IFdpcmVGb3JtYXQ6OkNvbXB1dGVVbmtub3duTWVzc2FnZVNldEl0ZW1zU2l6ZSgKKyAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKSB7CisgIGludCBzaXplID0gMDsKKyAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKKyAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7CisKKyAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKKyAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCisgICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgeworICAgICAgc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7CisgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGZpZWxkLm51bWJlcigpKTsKKworICAgICAgaW50IGZpZWxkX3NpemUgPSBmaWVsZC5HZXRMZW5ndGhEZWxpbWl0ZWRTaXplKCk7CisgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGZpZWxkX3NpemUpOworICAgICAgc2l6ZSArPSBmaWVsZF9zaXplOworICAgIH0KKyAgfQorCisgIHJldHVybiBzaXplOworfQorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGJvb2wgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlKSB7CkBAIC0xMTUsNiArNDMwLDQxIEBACiAgIH0KIH0KIAorYm9vbCBXaXJlRm9ybWF0OjpTa2lwTWVzc2FnZVNldEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpIHsKKyAgdWludDMyIGxlbmd0aDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgIHJldHVybiBpbnB1dC0+UmVhZFN0cmluZygKKyAgICAgIHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQoZmllbGRfbnVtYmVyKSwgbGVuZ3RoKTsKK30KKworYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlTWVzc2FnZVNldEZpZWxkKHVpbnQzMiBmaWVsZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlKiBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCkgeworICBjb25zdCBSZWZsZWN0aW9uKiBtZXNzYWdlX3JlZmxlY3Rpb24gPSBtZXNzYWdlLT5HZXRSZWZsZWN0aW9uKCk7CisgIGlmIChmaWVsZCA9PSBOVUxMKSB7CisgICAgLy8gV2Ugc3RvcmUgdW5rbm93biBNZXNzYWdlU2V0IGV4dGVuc2lvbnMgYXMgZ3JvdXBzLgorICAgIHJldHVybiBTa2lwTWVzc2FnZVNldEZpZWxkKAorICAgICAgICBpbnB1dCwgZmllbGRfbnVtYmVyLCBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVVbmtub3duRmllbGRzKG1lc3NhZ2UpKTsKKyAgfSBlbHNlIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSB8fAorICAgICAgICAgICAgIGZpZWxkLT50eXBlKCkgIT0gRmllbGREZXNjcmlwdG9yOjpUWVBFX01FU1NBR0UpIHsKKyAgICAvLyBUaGlzIHNob3VsZG4ndCBoYXBwZW4gYXMgd2Ugb25seSBhbGxvdyBvcHRpb25hbCBtZXNzYWdlIGV4dGVuc2lvbnMgdG8KKyAgICAvLyBNZXNzYWdlU2V0LgorICAgIEdPT0dMRV9MT0coRVJST1IpIDw8ICJFeHRlbnNpb25zIG9mIE1lc3NhZ2VTZXRzIG11c3QgYmUgb3B0aW9uYWwgbWVzc2FnZXMuIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0gZWxzZSB7CisgICAgTWVzc2FnZSogc3ViX21lc3NhZ2UgPSBtZXNzYWdlX3JlZmxlY3Rpb24tPk11dGFibGVNZXNzYWdlKAorICAgICAgICBtZXNzYWdlLCBmaWVsZCwgaW5wdXQtPkdldEV4dGVuc2lvbkZhY3RvcnkoKSk7CisgICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpSZWFkTWVzc2FnZShpbnB1dCwgc3ViX21lc3NhZ2UpOworICB9Cit9CisKK3N0YXRpYyBib29sIFN0cmljdFV0ZjhDaGVjayhjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7CisgIHJldHVybiBmaWVsZC0+ZmlsZSgpLT5zeW50YXgoKSA9PSBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMzsKK30KKwogYm9vbCBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlRmllbGQoCiAgICAgdWludDMyIHRhZywKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkLCAgICAgICAgLy8gTWF5IGJlIE5VTEwgZm9yIHVua25vd24KQEAgLTE0MCw4ICs0OTAsOCBAQAogICB9CiAKICAgaWYgKHZhbHVlX2Zvcm1hdCA9PSBVTktOT1dOKSB7Ci0gICAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoCi0gICAgICAgIGlucHV0LCB0YWcsIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSkpOworICAgIHJldHVybiBTa2lwRmllbGQoaW5wdXQsIHRhZywKKyAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSkpOwogICB9IGVsc2UgaWYgKHZhbHVlX2Zvcm1hdCA9PSBQQUNLRURfRk9STUFUKSB7CiAgICAgdWludDMyIGxlbmd0aDsKICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKQEAgLTE4MywxMCArNTMzLDIzIEBACiAgICAgICAgICAgaW50IHZhbHVlOwogICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKICAgICAgICAgICAgICAgICAgIGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9Ci0gICAgICAgICAgICAgIGZpZWxkLT5lbnVtX3R5cGUoKS0+RmluZFZhbHVlQnlOdW1iZXIodmFsdWUpOwotICAgICAgICAgIGlmIChlbnVtX3ZhbHVlICE9IE5VTEwpIHsKLSAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBmaWVsZCwgZW51bV92YWx1ZSk7CisgICAgICAgICAgaWYgKG1lc3NhZ2UtPkdldERlc2NyaXB0b3IoKS0+ZmlsZSgpLT5zeW50YXgoKSA9PQorICAgICAgICAgICAgICBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgeworICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRFbnVtVmFsdWUobWVzc2FnZSwgZmllbGQsIHZhbHVlKTsKKyAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY29uc3QgRW51bVZhbHVlRGVzY3JpcHRvciogZW51bV92YWx1ZSA9CisgICAgICAgICAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgICAgICAgICBpZiAoZW51bV92YWx1ZSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBmaWVsZCwgZW51bV92YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAvLyBUaGUgZW51bSB2YWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBrbm93biB2YWx1ZXMuICBBZGQgaXQgdG8gdGhlCisgICAgICAgICAgICAgIC8vIFVua25vd25GaWVsZFNldC4KKyAgICAgICAgICAgICAgaW50NjQgc2lnbl9leHRlbmRlZF92YWx1ZSA9IHN0YXRpY19jYXN0PGludDY0Pih2YWx1ZSk7CisgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSkKKyAgICAgICAgICAgICAgICAgIC0+QWRkVmFyaW50KAorICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgICAgICAgICAgICAgIHNpZ25fZXh0ZW5kZWRfdmFsdWUpOworICAgICAgICAgICAgfQogICAgICAgICAgIH0KICAgICAgICAgfQogCkBAIC0yNDMsMzAgKzYwNiw1MCBAQAogICAgICAgICBpbnQgdmFsdWU7CiAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRQcmltaXRpdmU8aW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPigKICAgICAgICAgICAgICAgICBpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KLSAgICAgICAgICBmaWVsZC0+ZW51bV90eXBlKCktPkZpbmRWYWx1ZUJ5TnVtYmVyKHZhbHVlKTsKLSAgICAgICAgaWYgKGVudW1fdmFsdWUgIT0gTlVMTCkgeworICAgICAgICBpZiAobWVzc2FnZS0+R2V0RGVzY3JpcHRvcigpLT5maWxlKCktPnN5bnRheCgpID09CisgICAgICAgICAgICBGaWxlRGVzY3JpcHRvcjo6U1lOVEFYX1BST1RPMykgewogICAgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewotICAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5BZGRFbnVtKG1lc3NhZ2UsIGZpZWxkLCBlbnVtX3ZhbHVlKTsKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bVZhbHVlKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CiAgICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+U2V0RW51bShtZXNzYWdlLCBmaWVsZCwgZW51bV92YWx1ZSk7CisgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPlNldEVudW1WYWx1ZShtZXNzYWdlLCBmaWVsZCwgdmFsdWUpOwogICAgICAgICAgIH0KICAgICAgICAgfSBlbHNlIHsKLSAgICAgICAgICAvLyBUaGUgZW51bSB2YWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBrbm93biB2YWx1ZXMuICBBZGQgaXQgdG8gdGhlCi0gICAgICAgICAgLy8gVW5rbm93bkZpZWxkU2V0LgotICAgICAgICAgIGludDY0IHNpZ25fZXh0ZW5kZWRfdmFsdWUgPSBzdGF0aWNfY2FzdDxpbnQ2ND4odmFsdWUpOwotICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSkKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAtPkFkZFZhcmludChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnRmllbGROdW1iZXIodGFnKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduX2V4dGVuZGVkX3ZhbHVlKTsKKyAgICAgICAgICBjb25zdCBFbnVtVmFsdWVEZXNjcmlwdG9yKiBlbnVtX3ZhbHVlID0KKyAgICAgICAgICAgICAgZmllbGQtPmVudW1fdHlwZSgpLT5GaW5kVmFsdWVCeU51bWJlcih2YWx1ZSk7CisgICAgICAgICAgaWYgKGVudW1fdmFsdWUgIT0gTlVMTCkgeworICAgICAgICAgICAgaWYgKGZpZWxkLT5pc19yZXBlYXRlZCgpKSB7CisgICAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkRW51bShtZXNzYWdlLCBmaWVsZCwgZW51bV92YWx1ZSk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPlNldEVudW0obWVzc2FnZSwgZmllbGQsIGVudW1fdmFsdWUpOworICAgICAgICAgICAgfQorICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBUaGUgZW51bSB2YWx1ZSBpcyBub3Qgb25lIG9mIHRoZSBrbm93biB2YWx1ZXMuICBBZGQgaXQgdG8gdGhlCisgICAgICAgICAgICAvLyBVbmtub3duRmllbGRTZXQuCisgICAgICAgICAgICBpbnQ2NCBzaWduX2V4dGVuZGVkX3ZhbHVlID0gc3RhdGljX2Nhc3Q8aW50NjQ+KHZhbHVlKTsKKyAgICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+TXV0YWJsZVVua25vd25GaWVsZHMobWVzc2FnZSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0+QWRkVmFyaW50KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpZ25fZXh0ZW5kZWRfdmFsdWUpOworICAgICAgICAgIH0KICAgICAgICAgfQogICAgICAgICBicmVhazsKICAgICAgIH0KIAogICAgICAgLy8gSGFuZGxlIHN0cmluZ3Mgc2VwYXJhdGVseSBzbyB0aGF0IHdlIGNhbiBvcHRpbWl6ZSB0aGUgY3R5cGU9Q09SRCBjYXNlLgogICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOiB7CisgICAgICAgIGJvb2wgc3RyaWN0X3V0ZjhfY2hlY2sgPSBTdHJpY3RVdGY4Q2hlY2soZmllbGQpOwogICAgICAgICBzdHJpbmcgdmFsdWU7CiAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlJlYWRTdHJpbmcoaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgVmVyaWZ5VVRGOFN0cmluZyh2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBQQVJTRSk7CisgICAgICAgIGlmIChzdHJpY3RfdXRmOF9jaGVjaykgeworICAgICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICAgICAgICAgICAgICB2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBXaXJlRm9ybWF0TGl0ZTo6UEFSU0UsCisgICAgICAgICAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCkuY19zdHIoKSkpIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgVmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQodmFsdWUuZGF0YSgpLCB2YWx1ZS5sZW5ndGgoKSwgUEFSU0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9CiAgICAgICAgIGlmIChmaWVsZC0+aXNfcmVwZWF0ZWQoKSkgewogICAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+QWRkU3RyaW5nKG1lc3NhZ2UsIGZpZWxkLCB2YWx1ZSk7CiAgICAgICAgIH0gZWxzZSB7CkBAIC0zMzAsMjAgKzcxMywxNCBAQAogICAvLyAgIHJlcXVpcmVkIGludDMyIHR5cGVfaWQgPSAyOwogICAvLyAgIHJlcXVpcmVkIGRhdGEgbWVzc2FnZSA9IDM7CiAKLSAgLy8gT25jZSB3ZSBzZWUgYSB0eXBlX2lkLCB3ZSdsbCBjb25zdHJ1Y3QgYSBmYWtlIHRhZyBmb3IgdGhpcyBleHRlbnNpb24KLSAgLy8gd2hpY2ggaXMgdGhlIHRhZyBpdCB3b3VsZCBoYXZlIGhhZCB1bmRlciB0aGUgcHJvdG8yIGV4dGVuc2lvbnMgd2lyZQotICAvLyBmb3JtYXQuCi0gIHVpbnQzMiBmYWtlX3RhZyA9IDA7CisgIHVpbnQzMiBsYXN0X3R5cGVfaWQgPSAwOwogCiAgIC8vIE9uY2Ugd2Ugc2VlIGEgdHlwZV9pZCwgd2UnbGwgbG9vayB1cCB0aGUgRmllbGREZXNjcmlwdG9yIGZvciB0aGUKICAgLy8gZXh0ZW5zaW9uLgogICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkID0gTlVMTDsKIAogICAvLyBJZiB3ZSBzZWUgbWVzc2FnZSBkYXRhIGJlZm9yZSB0aGUgdHlwZV9pZCwgd2UnbGwgYXBwZW5kIGl0IHRvIHRoaXMgc28KLSAgLy8gd2UgY2FuIHBhcnNlIGl0IGxhdGVyLiAgVGhpcyB3aWxsIHByb2JhYmx5IG5ldmVyIGhhcHBlbiBpbiBwcmFjdGljZSwKLSAgLy8gYXMgbm8gTWVzc2FnZVNldCBlbmNvZGVyIEkga25vdyBvZiB3cml0ZXMgdGhlIG1lc3NhZ2UgYmVmb3JlIHRoZSB0eXBlIElELgotICAvLyBCdXQsIGl0J3MgdGVjaG5pY2FsbHkgdmFsaWQgc28gd2Ugc2hvdWxkIGFsbG93IGl0LgotICAvLyBUT0RPKGtlbnRvbik6ICBVc2UgYSBDb3JkIGluc3RlYWQ/ICBEbyBJIGNhcmU/CisgIC8vIHdlIGNhbiBwYXJzZSBpdCBsYXRlci4KICAgc3RyaW5nIG1lc3NhZ2VfZGF0YTsKIAogICB3aGlsZSAodHJ1ZSkgewpAQCAtMzU0LDggKzczMSw3IEBACiAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZzogewogICAgICAgICB1aW50MzIgdHlwZV9pZDsKICAgICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0eXBlX2lkKSkgcmV0dXJuIGZhbHNlOwotICAgICAgICBmYWtlX3RhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAotICAgICAgICAgICAgdHlwZV9pZCwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpOworICAgICAgICBsYXN0X3R5cGVfaWQgPSB0eXBlX2lkOwogICAgICAgICBmaWVsZCA9IG1lc3NhZ2VfcmVmbGVjdGlvbi0+RmluZEtub3duRXh0ZW5zaW9uQnlOdW1iZXIodHlwZV9pZCk7CiAKICAgICAgICAgaWYgKCFtZXNzYWdlX2RhdGEuZW1wdHkoKSkgewpAQCAtMzY0LDggKzc0MCw4IEBACiAgICAgICAgICAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KG1lc3NhZ2VfZGF0YS5kYXRhKCksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1lc3NhZ2VfZGF0YS5zaXplKCkpOwogICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtIHN1Yl9pbnB1dCgmcmF3X2lucHV0KTsKLSAgICAgICAgICBpZiAoIVBhcnNlQW5kTWVyZ2VGaWVsZChmYWtlX3RhZywgZmllbGQsIG1lc3NhZ2UsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1Yl9pbnB1dCkpIHsKKyAgICAgICAgICBpZiAoIVBhcnNlQW5kTWVyZ2VNZXNzYWdlU2V0RmllbGQobGFzdF90eXBlX2lkLCBmaWVsZCwgbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnN1Yl9pbnB1dCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICB9CiAgICAgICAgICAgbWVzc2FnZV9kYXRhLmNsZWFyKCk7CkBAIC0zNzUsMTYgKzc1MSwyMCBAQAogICAgICAgfQogCiAgICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldE1lc3NhZ2VUYWc6IHsKLSAgICAgICAgaWYgKGZha2VfdGFnID09IDApIHsKKyAgICAgICAgaWYgKGxhc3RfdHlwZV9pZCA9PSAwKSB7CiAgICAgICAgICAgLy8gV2UgaGF2ZW4ndCBzZWVuIGEgdHlwZV9pZCB5ZXQuICBBcHBlbmQgdGhpcyBkYXRhIHRvIG1lc3NhZ2VfZGF0YS4KICAgICAgICAgICBzdHJpbmcgdGVtcDsKICAgICAgICAgICB1aW50MzIgbGVuZ3RoOwogICAgICAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwogICAgICAgICAgIGlmICghaW5wdXQtPlJlYWRTdHJpbmcoJnRlbXAsIGxlbmd0aCkpIHJldHVybiBmYWxzZTsKLSAgICAgICAgICBtZXNzYWdlX2RhdGEuYXBwZW5kKHRlbXApOworICAgICAgICAgIGlvOjpTdHJpbmdPdXRwdXRTdHJlYW0gb3V0cHV0X3N0cmVhbSgmbWVzc2FnZV9kYXRhKTsKKyAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKKyAgICAgICAgICBjb2RlZF9vdXRwdXQuV3JpdGVWYXJpbnQzMihsZW5ndGgpOworICAgICAgICAgIGNvZGVkX291dHB1dC5Xcml0ZVN0cmluZyh0ZW1wKTsKICAgICAgICAgfSBlbHNlIHsKICAgICAgICAgICAvLyBBbHJlYWR5IHNhdyB0eXBlX2lkLCBzbyB3ZSBjYW4gcGFyc2UgdGhpcyBkaXJlY3RseS4KLSAgICAgICAgICBpZiAoIVBhcnNlQW5kTWVyZ2VGaWVsZChmYWtlX3RhZywgZmllbGQsIG1lc3NhZ2UsIGlucHV0KSkgeworICAgICAgICAgIGlmICghUGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRGaWVsZChsYXN0X3R5cGVfaWQsIGZpZWxkLCBtZXNzYWdlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCkpIHsKICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKICAgICAgICAgICB9CiAgICAgICAgIH0KQEAgLTM5Nyw3ICs3NzcsNyBAQAogICAgICAgfQogCiAgICAgICBkZWZhdWx0OiB7Ci0gICAgICAgIGlmICghV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCBOVUxMKSkgcmV0dXJuIGZhbHNlOworICAgICAgICBpZiAoIVNraXBGaWVsZChpbnB1dCwgdGFnLCBOVUxMKSkgcmV0dXJuIGZhbHNlOwogICAgICAgfQogICAgIH0KICAgfQpAQCAtNDE5LDEwICs3OTksMTAgQEAKICAgfQogCiAgIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIFdpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKAorICAgIFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCiAgICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSwgb3V0cHV0KTsKICAgfSBlbHNlIHsKLSAgICBXaXJlRm9ybWF0TGl0ZTo6U2VyaWFsaXplVW5rbm93bkZpZWxkcygKKyAgICBTZXJpYWxpemVVbmtub3duRmllbGRzKAogICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFVua25vd25GaWVsZHMobWVzc2FnZSksIG91dHB1dCk7CiAgIH0KIApAQCAtNDU0LDcgKzgzNCw3IEBACiAgICAgY291bnQgPSAxOwogICB9CiAKLSAgY29uc3QgYm9vbCBpc19wYWNrZWQgPSBmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpOworICBjb25zdCBib29sIGlzX3BhY2tlZCA9IGZpZWxkLT5pc19wYWNrZWQoKTsKICAgaWYgKGlzX3BhY2tlZCAmJiBjb3VudCA+IDApIHsKICAgICBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWcoZmllbGQtPm51bWJlcigpLAogICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKQEAgLTUyNywxMiArOTA3LDIwIEBACiAgICAgICAvLyBIYW5kbGUgc3RyaW5ncyBzZXBhcmF0ZWx5IHNvIHRoYXQgd2UgY2FuIGdldCBzdHJpbmcgcmVmZXJlbmNlcwogICAgICAgLy8gaW5zdGVhZCBvZiBjb3B5aW5nLgogICAgICAgY2FzZSBGaWVsZERlc2NyaXB0b3I6OlRZUEVfU1RSSU5HOiB7CisgICAgICAgIGJvb2wgc3RyaWN0X3V0ZjhfY2hlY2sgPSBTdHJpY3RVdGY4Q2hlY2soZmllbGQpOwogICAgICAgICBzdHJpbmcgc2NyYXRjaDsKICAgICAgICAgY29uc3Qgc3RyaW5nJiB2YWx1ZSA9IGZpZWxkLT5pc19yZXBlYXRlZCgpID8KICAgICAgICAgICBtZXNzYWdlX3JlZmxlY3Rpb24tPkdldFJlcGVhdGVkU3RyaW5nUmVmZXJlbmNlKAogICAgICAgICAgICAgbWVzc2FnZSwgZmllbGQsIGosICZzY3JhdGNoKSA6CiAgICAgICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRTdHJpbmdSZWZlcmVuY2UobWVzc2FnZSwgZmllbGQsICZzY3JhdGNoKTsKLSAgICAgICAgVmVyaWZ5VVRGOFN0cmluZyh2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLCBTRVJJQUxJWkUpOworICAgICAgICBpZiAoc3RyaWN0X3V0ZjhfY2hlY2spIHsKKyAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6VmVyaWZ5VXRmOFN0cmluZyh2YWx1ZS5kYXRhKCksIHZhbHVlLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpTRVJJQUxJWkUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmllbGQtPmZ1bGxfbmFtZSgpLmNfc3RyKCkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgIFZlcmlmeVVURjhTdHJpbmdOYW1lZEZpZWxkKHZhbHVlLmRhdGEoKSwgdmFsdWUubGVuZ3RoKCksIFNFUklBTElaRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWVsZC0+ZnVsbF9uYW1lKCkuY19zdHIoKSk7CisgICAgICAgIH0KICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldyaXRlU3RyaW5nKGZpZWxkLT5udW1iZXIoKSwgdmFsdWUsIG91dHB1dCk7CiAgICAgICAgIGJyZWFrOwogICAgICAgfQpAQCAtNTg5LDEwICs5NzcsMTAgQEAKICAgfQogCiAgIGlmIChkZXNjcmlwdG9yLT5vcHRpb25zKCkubWVzc2FnZV9zZXRfd2lyZV9mb3JtYXQoKSkgewotICAgIG91cl9zaXplICs9IFdpcmVGb3JtYXRMaXRlOjpDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgb3VyX3NpemUgKz0gQ29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKAogICAgICAgbWVzc2FnZV9yZWZsZWN0aW9uLT5HZXRVbmtub3duRmllbGRzKG1lc3NhZ2UpKTsKICAgfSBlbHNlIHsKLSAgICBvdXJfc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25GaWVsZHNTaXplKAorICAgIG91cl9zaXplICs9IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKICAgICAgIG1lc3NhZ2VfcmVmbGVjdGlvbi0+R2V0VW5rbm93bkZpZWxkcyhtZXNzYWdlKSk7CiAgIH0KIApAQCAtNjIwLDcgKzEwMDgsNyBAQAogCiAgIGNvbnN0IGludCBkYXRhX3NpemUgPSBGaWVsZERhdGFPbmx5Qnl0ZVNpemUoZmllbGQsIG1lc3NhZ2UpOwogICBpbnQgb3VyX3NpemUgPSBkYXRhX3NpemU7Ci0gIGlmIChmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHsKICAgICBpZiAoZGF0YV9zaXplID4gMCkgewogICAgICAgLy8gUGFja2VkIGZpZWxkcyBnZXQgc2VyaWFsaXplZCBsaWtlIGEgc3RyaW5nLCBub3QgdGhlaXIgbmF0aXZlIHR5cGUuCiAgICAgICAvLyBUZWNobmljYWxseSB0aGlzIGRvZXNuJ3QgcmVhbGx5IG1hdHRlcjsgdGhlIHNpemUgb25seSBjaGFuZ2VzIGlmIGl0J3MKQEAgLTc0MCwyOCArMTEyOCw2IEBACiAgIHJldHVybiBvdXJfc2l6ZTsKIH0KIAotdm9pZCBXaXJlRm9ybWF0OjpWZXJpZnlVVEY4U3RyaW5nRmFsbGJhY2soY29uc3QgY2hhciogZGF0YSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBzaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT3BlcmF0aW9uIG9wKSB7Ci0gIGlmICghSXNTdHJ1Y3R1cmFsbHlWYWxpZFVURjgoZGF0YSwgc2l6ZSkpIHsKLSAgICBjb25zdCBjaGFyKiBvcGVyYXRpb25fc3RyID0gTlVMTDsKLSAgICBzd2l0Y2ggKG9wKSB7Ci0gICAgICBjYXNlIFBBUlNFOgotICAgICAgICBvcGVyYXRpb25fc3RyID0gInBhcnNpbmciOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgU0VSSUFMSVpFOgotICAgICAgICBvcGVyYXRpb25fc3RyID0gInNlcmlhbGl6aW5nIjsKLSAgICAgICAgYnJlYWs7Ci0gICAgICAvLyBubyBkZWZhdWx0IGNhc2U6IGhhdmUgdGhlIGNvbXBpbGVyIHdhcm4gaWYgYSBjYXNlIGlzIG5vdCBjb3ZlcmVkLgotICAgIH0KLSAgICBHT09HTEVfTE9HKEVSUk9SKSA8PCAiRW5jb3VudGVyZWQgc3RyaW5nIGNvbnRhaW5pbmcgaW52YWxpZCBVVEYtOCBkYXRhIHdoaWxlICIKLSAgICAgICAgICAgICAgIDw8IG9wZXJhdGlvbl9zdHIKLSAgICAgICAgICAgICAgIDw8ICIgcHJvdG9jb2wgYnVmZmVyLiBTdHJpbmdzIG11c3QgY29udGFpbiBvbmx5IFVURi04OyAiCi0gICAgICAgICAgICAgICAgICAidXNlIHRoZSAnYnl0ZXMnIHR5cGUgZm9yIHJhdyBieXRlcy4iOwotICB9Ci19Ci0KLQogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCiB9ICAvLyBuYW1lc3BhY2UgcHJvdG9idWYKIH0gIC8vIG5hbWVzcGFjZSBnb29nbGUKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdC5oCmluZGV4IGQ1MmJjNGEuLjk0MWJlNzUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0LmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXQuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtNDAsNiArNDAsNyBAQAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfSF9fCiAKICNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9kZXNjcmlwdG9yLnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2Rlc2NyaXB0b3IuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvbWVzc2FnZS5oPgpAQCAtNzgsNyArNzksNyBAQAogICBzdGF0aWMgaW5saW5lIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSBXaXJlVHlwZUZvckZpZWxkKAogICAgICAgY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CiAKLSAgLy8gR2l2ZW4gYSBGaWVsZFNlc2NyaXB0b3I6OlR5cGUgcmV0dXJuIGl0cyBXaXJlVHlwZQorICAvLyBHaXZlbiBhIEZpZWxkRGVzY3JpcHRvcjo6VHlwZSByZXR1cm4gaXRzIFdpcmVUeXBlCiAgIHN0YXRpYyBpbmxpbmUgV2lyZUZvcm1hdExpdGU6OldpcmVUeXBlIFdpcmVUeXBlRm9yRmllbGRUeXBlKAogICAgICAgRmllbGREZXNjcmlwdG9yOjpUeXBlIHR5cGUpOwogCkBAIC0xMjMsNiArMTI0LDYyIEBACiAgIC8vIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpIG9uIHRoZSBzYW1lIG9iamVjdC4KICAgc3RhdGljIGludCBCeXRlU2l6ZShjb25zdCBNZXNzYWdlJiBtZXNzYWdlKTsKIAorICAvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAvLyBIZWxwZXJzIGZvciBkZWFsaW5nIHdpdGggdW5rbm93biBmaWVsZHMKKworICAvLyBTa2lwcyBhIGZpZWxkIHZhbHVlIG9mIHRoZSBnaXZlbiBXaXJlVHlwZS4gIFRoZSBpbnB1dCBzaG91bGQgc3RhcnQKKyAgLy8gcG9zaXRpb25lZCBpbW1lZGlhdGVseSBhZnRlciB0aGUgdGFnLiAgSWYgdW5rbm93bl9maWVsZHMgaXMgbm9uLU5VTEwsCisgIC8vIHRoZSBjb250ZW50cyBvZiB0aGUgZmllbGQgd2lsbCBiZSBhZGRlZCB0byBpdC4KKyAgc3RhdGljIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZywKKyAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMpOworCisgIC8vIFJlYWRzIGFuZCBpZ25vcmVzIGEgbWVzc2FnZSBmcm9tIHRoZSBpbnB1dC4gIElmIHVua25vd25fZmllbGRzIGlzIG5vbi1OVUxMLAorICAvLyB0aGUgY29udGVudHMgd2lsbCBiZSBhZGRlZCB0byBpdC4KKyAgc3RhdGljIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKKworICAvLyBSZWFkIGEgcGFja2VkIGVudW0gZmllbGQuIElmIHRoZSBpc192YWxpZCBmdW5jdGlvbiBpcyBub3QgTlVMTCwgdmFsdWVzIGZvcgorICAvLyB3aGljaCBpc192YWxpZCh2YWx1ZSkgcmV0dXJucyBmYWxzZSBhcmUgYXBwZW5kZWQgdG8gdW5rbm93bl9maWVsZHNfc3RyZWFtLgorICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkRW51bVByZXNlcnZlVW5rbm93bnMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlcyk7CisKKyAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGFuIFVua25vd25GaWVsZFNldCB0byB0aGUgb3V0cHV0LgorICBzdGF0aWMgdm9pZCBTZXJpYWxpemVVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgorICAvLyBDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodW5rbm93bl9maWVsZHMpLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KKyAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICB1aW50OCogdGFyZ2V0KTsKKworICAvLyBTYW1lIHRoaW5nIGV4Y2VwdCBmb3IgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdAorICAvLyBvcHRpb24uCisgIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOworICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgorICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgorICAvLyBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMpLgorICAvLworICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KKyAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKKyAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCisgICAgICB1aW50OCogdGFyZ2V0KTsKKworICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBVbmtub3duRmllbGRTZXQgb24gdGhlIHdpcmUuCisgIHN0YXRpYyBpbnQgQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpOworCisgIC8vIFNhbWUgdGhpbmcgZXhjZXB0IGZvciBtZXNzYWdlcyB0aGF0IGhhdmUgdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0CisgIC8vIG9wdGlvbi4KKyAgc3RhdGljIGludCBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCisgICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKKwogCiAgIC8vIEhlbHBlciBmdW5jdGlvbnMgZm9yIGVuY29kaW5nIGFuZCBkZWNvZGluZyB0YWdzLiAgKElubGluZWQgYmVsb3cgYW5kIGluCiAgIC8vIF9pbmwuaCkKQEAgLTEzMSw3ICsxODgsNyBAQAogICAvLyBvZiBwYWNrZWQgcmVwZWF0ZWQgZmllbGRzLgogICBzdGF0aWMgdWludDMyIE1ha2VUYWcoY29uc3QgRmllbGREZXNjcmlwdG9yKiBmaWVsZCk7CiAKLSAgLy8gUGFyc2UgYSBzaW5nbGUgZmllbGQuICBUaGUgaW5wdXQgc2hvdWxkIHN0YXJ0IG91dCBwb3NpdGlvbmVkIGltbWlkYXRlbHkKKyAgLy8gUGFyc2UgYSBzaW5nbGUgZmllbGQuICBUaGUgaW5wdXQgc2hvdWxkIHN0YXJ0IG91dCBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5CiAgIC8vIGFmdGVyIHRoZSB0YWcuCiAgIHN0YXRpYyBib29sIFBhcnNlQW5kTWVyZ2VGaWVsZCgKICAgICAgIHVpbnQzMiB0YWcsCkBAIC0xNzQsMzAgKzIzMSw1NyBAQAogICAgICAgY29uc3QgTWVzc2FnZSYgbWVzc2FnZSk7CiAKICAgZW51bSBPcGVyYXRpb24gewotICAgIFBBUlNFLAotICAgIFNFUklBTElaRSwKKyAgICBQQVJTRSA9IDAsCisgICAgU0VSSUFMSVpFID0gMSwKICAgfTsKIAogICAvLyBWZXJpZmllcyB0aGF0IGEgc3RyaW5nIGZpZWxkIGlzIHZhbGlkIFVURjgsIGxvZ2dpbmcgYW4gZXJyb3IgaWYgbm90LgorICAvLyBUaGlzIGZ1bmN0aW9uIHdpbGwgbm90IGJlIGNhbGxlZCBieSBuZXdseSBnZW5lcmF0ZWQgcHJvdG9idWYgY29kZQorICAvLyBidXQgcmVtYWlucyBwcmVzZW50IHRvIHN1cHBvcnQgZXhpc3RpbmcgY29kZS4KICAgc3RhdGljIHZvaWQgVmVyaWZ5VVRGOFN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSwgT3BlcmF0aW9uIG9wKTsKKyAgLy8gVGhlIE5hbWVkRmllbGQgdmFyaWFudCB0YWtlcyBhIGZpZWxkIG5hbWUgaW4gb3JkZXIgdG8gcHJvZHVjZSBhbgorICAvLyBpbmZvcm1hdGl2ZSBlcnJvciBtZXNzYWdlIGlmIHZlcmlmaWNhdGlvbiBmYWlscy4KKyAgc3RhdGljIHZvaWQgVmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoY29uc3QgY2hhciogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmllbGRfbmFtZSk7CiAKICBwcml2YXRlOgotICAvLyBWZXJpZmllcyB0aGF0IGEgc3RyaW5nIGZpZWxkIGlzIHZhbGlkIFVURjgsIGxvZ2dpbmcgYW4gZXJyb3IgaWYgbm90LgotICBzdGF0aWMgdm9pZCBWZXJpZnlVVEY4U3RyaW5nRmFsbGJhY2soCi0gICAgICBjb25zdCBjaGFyKiBkYXRhLAotICAgICAgaW50IHNpemUsCi0gICAgICBPcGVyYXRpb24gb3ApOworICAvLyBTa2lwIGEgTWVzc2FnZVNldCBmaWVsZC4KKyAgc3RhdGljIGJvb2wgU2tpcE1lc3NhZ2VTZXRGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyIGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKTsKIAotCisgIC8vIFBhcnNlIGEgTWVzc2FnZVNldCBmaWVsZC4KKyAgc3RhdGljIGJvb2wgUGFyc2VBbmRNZXJnZU1lc3NhZ2VTZXRGaWVsZCh1aW50MzIgZmllbGRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IEZpZWxkRGVzY3JpcHRvciogZmllbGQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZSogbWVzc2FnZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOwogCiAgIEdPT0dMRV9ESVNBTExPV19FVklMX0NPTlNUUlVDVE9SUyhXaXJlRm9ybWF0KTsKIH07CiAKKy8vIFN1YmNsYXNzIG9mIEZpZWxkU2tpcHBlciB3aGljaCBzYXZlcyBza2lwcGVkIGZpZWxkcyB0byBhbiBVbmtub3duRmllbGRTZXQuCitjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgVW5rbm93bkZpZWxkU2V0RmllbGRTa2lwcGVyIDogcHVibGljIEZpZWxkU2tpcHBlciB7CisgcHVibGljOgorICBVbmtub3duRmllbGRTZXRGaWVsZFNraXBwZXIoVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykKKyAgICAgIDogdW5rbm93bl9maWVsZHNfKHVua25vd25fZmllbGRzKSB7fQorICB2aXJ0dWFsIH5Vbmtub3duRmllbGRTZXRGaWVsZFNraXBwZXIoKSB7fQorCisgIC8vIGltcGxlbWVudHMgRmllbGRTa2lwcGVyIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgIHZpcnR1YWwgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKTsKKyAgdmlydHVhbCBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CisgIHZpcnR1YWwgdm9pZCBTa2lwVW5rbm93bkVudW0oaW50IGZpZWxkX251bWJlciwgaW50IHZhbHVlKTsKKworIHByb3RlY3RlZDoKKyAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkc187Cit9OworCiAvLyBpbmxpbmUgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGlubGluZSBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUgV2lyZUZvcm1hdDo6V2lyZVR5cGVGb3JGaWVsZCgKICAgICBjb25zdCBGaWVsZERlc2NyaXB0b3IqIGZpZWxkKSB7Ci0gIGlmIChmaWVsZC0+b3B0aW9ucygpLnBhY2tlZCgpKSB7CisgIGlmIChmaWVsZC0+aXNfcGFja2VkKCkpIHsKICAgICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQ7CiAgIH0gZWxzZSB7CiAgICAgcmV0dXJuIFdpcmVUeXBlRm9yRmllbGRUeXBlKGZpZWxkLT50eXBlKCkpOwpAQCAtMjI4LDcgKzMxMiwyMCBAQAogaW5saW5lIHZvaWQgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZyhjb25zdCBjaGFyKiBkYXRhLCBpbnQgc2l6ZSwKICAgICBXaXJlRm9ybWF0OjpPcGVyYXRpb24gb3ApIHsKICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKLSAgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ0ZhbGxiYWNrKGRhdGEsIHNpemUsIG9wKTsKKyAgV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoCisgICAgICBkYXRhLCBzaXplLCBzdGF0aWNfY2FzdDxXaXJlRm9ybWF0TGl0ZTo6T3BlcmF0aW9uPihvcCksIE5VTEwpOworI2Vsc2UKKyAgLy8gQXZvaWQgdGhlIGNvbXBpbGVyIHdhcm5pbmcgYWJvdXQgdW5zdWVkIHZhcmlhYmxlcy4KKyAgKHZvaWQpZGF0YTsgKHZvaWQpc2l6ZTsgKHZvaWQpb3A7CisjZW5kaWYKK30KKworaW5saW5lIHZvaWQgV2lyZUZvcm1hdDo6VmVyaWZ5VVRGOFN0cmluZ05hbWVkRmllbGQoCisgICAgY29uc3QgY2hhciogZGF0YSwgaW50IHNpemUsIFdpcmVGb3JtYXQ6Ok9wZXJhdGlvbiBvcCwKKyAgICBjb25zdCBjaGFyKiBmaWVsZF9uYW1lKSB7CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIFdpcmVGb3JtYXRMaXRlOjpWZXJpZnlVdGY4U3RyaW5nKAorICAgICAgZGF0YSwgc2l6ZSwgc3RhdGljX2Nhc3Q8V2lyZUZvcm1hdExpdGU6Ok9wZXJhdGlvbj4ob3ApLCBmaWVsZF9uYW1lKTsKICNlbmRpZgogfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5jYwppbmRleCAzYmY5MjY4Li5mMjUxNzA3IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuY2MKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTM3LDE4ICszNywyMiBAQAogI2luY2x1ZGUgPHN0YWNrPgogI2luY2x1ZGUgPHN0cmluZz4KICNpbmNsdWRlIDx2ZWN0b3I+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0cmluZ3ByaW50Zi5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW1faW5sLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW0uaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Vua25vd25fZmllbGRfc2V0Lmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL3plcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmg+CisKIAogbmFtZXNwYWNlIGdvb2dsZSB7CiBuYW1lc3BhY2UgcHJvdG9idWYgewogbmFtZXNwYWNlIGludGVybmFsIHsKIAotI2lmbmRlZiBfTVNDX1ZFUiAgICAvLyBNU1ZDIGRvZXNuJ3QgbGlrZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgY29uc3RhbnRzLCBHQ0MKLSAgICAgICAgICAgICAgICAgICAgLy8gcmVxdWlyZXMgdGhlbS4KKworI2lmICFkZWZpbmVkKF9NU0NfVkVSKSB8fCBfTVNDX1ZFUiA+PSAxOTAwCisvLyBPbGQgdmVyc2lvbiBvZiBNU1ZDIGRvZXNuJ3QgbGlrZSBkZWZpbml0aW9ucyBvZiBpbmxpbmUgY29uc3RhbnRzLCBHQ0MKKy8vIHJlcXVpcmVzIHRoZW0uCiBjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnOwogY29uc3QgaW50IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWc7CiBjb25zdCBpbnQgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0VHlwZUlkVGFnOwpAQCAtNTYsMjkgKzYwLDE2IEBACiAKICNlbmRpZgogCi0vLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0KLWJvb2wgRmllbGRTa2lwcGVyOjpTa2lwRmllbGQoCi0gICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKSB7Ci0gIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcsIHVua25vd25fZmllbGRzXyk7Ci19Ci0KLWJvb2wgRmllbGRTa2lwcGVyOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKLSAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbnB1dCwgdW5rbm93bl9maWVsZHNfKTsKLX0KLQotdm9pZCBGaWVsZFNraXBwZXI6OlNraXBVbmtub3duRW51bSgKLSAgICBpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUpIHsKLSAgdW5rbm93bl9maWVsZHNfLT5BZGRWYXJpbnQoZmllbGRfbnVtYmVyLCB2YWx1ZSk7Ci19Ci0KLS8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLQorLy8gSUJNIHhsQyByZXF1aXJlcyBwcmVmaXhpbmcgY29uc3RhbnRzIHdpdGggV2lyZUZvcm1hdExpdGU6OgogY29uc3QgaW50IFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1UYWdzU2l6ZSA9Ci0gIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPGtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnPjo6dmFsdWUgKwotICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlN0YXRpY1ZhcmludFNpemUzMjxrTWVzc2FnZVNldEl0ZW1FbmRUYWc+Ojp2YWx1ZSArCi0gIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPGtNZXNzYWdlU2V0VHlwZUlkVGFnPjo6dmFsdWUgKwotICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlN0YXRpY1ZhcmludFNpemUzMjxrTWVzc2FnZVNldE1lc3NhZ2VUYWc+Ojp2YWx1ZTsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8CisgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtU3RhcnRUYWc+Ojp2YWx1ZSArCisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPAorICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZz46OnZhbHVlICsKKyAgaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpTdGF0aWNWYXJpbnRTaXplMzI8CisgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWc+Ojp2YWx1ZSArCisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6U3RhdGljVmFyaW50U2l6ZTMyPAorICAgICAgV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0TWVzc2FnZVRhZz46OnZhbHVlOwogCiBjb25zdCBXaXJlRm9ybWF0TGl0ZTo6Q3BwVHlwZQogV2lyZUZvcm1hdExpdGU6OmtGaWVsZFR5cGVUb0NwcFR5cGVNYXBbTUFYX0ZJRUxEX1RZUEUgKyAxXSA9IHsKQEAgLTEyNyw0MiArMTE4LDI4IEBACiAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9WQVJJTlQsICAgICAgICAgICAgLy8gVFlQRV9TSU5UNjQKIH07CiAKLWJvb2wgV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICBpbnQgbnVtYmVyID0gV2lyZUZvcm1hdExpdGU6OkdldFRhZ0ZpZWxkTnVtYmVyKHRhZyk7Ci0KK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZCgKKyAgICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcpIHsKICAgc3dpdGNoIChXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKSkgewogICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVDogewogICAgICAgdWludDY0IHZhbHVlOwogICAgICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICh1bmtub3duX2ZpZWxkcyAhPSBOVUxMKSB1bmtub3duX2ZpZWxkcy0+QWRkVmFyaW50KG51bWJlciwgdmFsdWUpOwogICAgICAgcmV0dXJuIHRydWU7CiAgICAgfQogICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ6IHsKICAgICAgIHVpbnQ2NCB2YWx1ZTsKICAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW42NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7Ci0gICAgICBpZiAodW5rbm93bl9maWVsZHMgIT0gTlVMTCkgdW5rbm93bl9maWVsZHMtPkFkZEZpeGVkNjQobnVtYmVyLCB2YWx1ZSk7CiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDogewogICAgICAgdWludDMyIGxlbmd0aDsKICAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKHVua25vd25fZmllbGRzID09IE5VTEwpIHsKLSAgICAgICAgaWYgKCFpbnB1dC0+U2tpcChsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gICAgICB9IGVsc2UgewotICAgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKHVua25vd25fZmllbGRzLT5BZGRMZW5ndGhEZWxpbWl0ZWQobnVtYmVyKSwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsZW5ndGgpKSB7Ci0gICAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgICB9Ci0gICAgICB9CisgICAgICBpZiAoIWlucHV0LT5Ta2lwKGxlbmd0aCkpIHJldHVybiBmYWxzZTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBjYXNlIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUDogewogICAgICAgaWYgKCFpbnB1dC0+SW5jcmVtZW50UmVjdXJzaW9uRGVwdGgoKSkgcmV0dXJuIGZhbHNlOwotICAgICAgaWYgKCFTa2lwTWVzc2FnZShpbnB1dCwgKHVua25vd25fZmllbGRzID09IE5VTEwpID8KLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwgOiB1bmtub3duX2ZpZWxkcy0+QWRkR3JvdXAobnVtYmVyKSkpIHsKLSAgICAgICAgcmV0dXJuIGZhbHNlOwotICAgICAgfQorICAgICAgaWYgKCFTa2lwTWVzc2FnZShpbnB1dCkpIHJldHVybiBmYWxzZTsKICAgICAgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZW5kaW5nIHRhZyBtYXRjaGVkIHRoZSBzdGFydGluZyB0YWcuCiAgICAgICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKApAQCAtMTc4LDcgKzE1NSw2IEBACiAgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQzMjogewogICAgICAgdWludDMyIHZhbHVlOwogICAgICAgaWYgKCFpbnB1dC0+UmVhZExpdHRsZUVuZGlhbjMyKCZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKLSAgICAgIGlmICh1bmtub3duX2ZpZWxkcyAhPSBOVUxMKSB1bmtub3duX2ZpZWxkcy0+QWRkRml4ZWQzMihudW1iZXIsIHZhbHVlKTsKICAgICAgIHJldHVybiB0cnVlOwogICAgIH0KICAgICBkZWZhdWx0OiB7CkBAIC0xODcsOSArMTYzLDY1IEBACiAgIH0KIH0KIAotYm9vbCBXaXJlRm9ybWF0TGl0ZTo6U2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcykgewotICB3aGlsZSh0cnVlKSB7Citib29sIFdpcmVGb3JtYXRMaXRlOjpTa2lwRmllbGQoCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnLCBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICBzd2l0Y2ggKFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdXaXJlVHlwZSh0YWcpKSB7CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UOiB7CisgICAgICB1aW50NjQgdmFsdWU7CisgICAgICBpZiAoIWlucHV0LT5SZWFkVmFyaW50NjQoJnZhbHVlKSkgcmV0dXJuIGZhbHNlOworICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50NjQodmFsdWUpOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVENjQ6IHsKKyAgICAgIHVpbnQ2NCB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW42NCgmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIodGFnKTsKKyAgICAgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW42NCh2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRDogeworICAgICAgdWludDMyIGxlbmd0aDsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIobGVuZ3RoKTsKKyAgICAgIC8vIFRPRE8obWtpbGF2dXopOiBQcm92aWRlIEFQSSB0byBwcmV2ZW50IGV4dHJhIHN0cmluZyBjb3B5aW5nLgorICAgICAgc3RyaW5nIHRlbXA7CisgICAgICBpZiAoIWlucHV0LT5SZWFkU3RyaW5nKCZ0ZW1wLCBsZW5ndGgpKSByZXR1cm4gZmFsc2U7CisgICAgICBvdXRwdXQtPldyaXRlU3RyaW5nKHRlbXApOworICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQOiB7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIodGFnKTsKKyAgICAgIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlmICghU2tpcE1lc3NhZ2UoaW5wdXQsIG91dHB1dCkpIHJldHVybiBmYWxzZTsKKyAgICAgIGlucHV0LT5EZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOworICAgICAgLy8gQ2hlY2sgdGhhdCB0aGUgZW5kaW5nIHRhZyBtYXRjaGVkIHRoZSBzdGFydGluZyB0YWcuCisgICAgICBpZiAoIWlucHV0LT5MYXN0VGFnV2FzKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpHZXRUYWdGaWVsZE51bWJlcih0YWcpLAorICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVApKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICB9CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgY2FzZSBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQOiB7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIGNhc2UgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0ZJWEVEMzI6IHsKKyAgICAgIHVpbnQzMiB2YWx1ZTsKKyAgICAgIGlmICghaW5wdXQtPlJlYWRMaXR0bGVFbmRpYW4zMigmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIodGFnKTsKKyAgICAgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMih2YWx1ZSk7CisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgfQorfQorCitib29sIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgd2hpbGUgKHRydWUpIHsKICAgICB1aW50MzIgdGFnID0gaW5wdXQtPlJlYWRUYWcoKTsKICAgICBpZiAodGFnID09IDApIHsKICAgICAgIC8vIEVuZCBvZiBpbnB1dC4gIFRoaXMgaXMgYSB2YWxpZCBwbGFjZSB0byBlbmQsIHNvIHJldHVybiB0cnVlLgpAQCAtMjAzLDIxMiArMjM1LDU4IEBACiAgICAgICByZXR1cm4gdHJ1ZTsKICAgICB9CiAKLSAgICBpZiAoIVNraXBGaWVsZChpbnB1dCwgdGFnLCB1bmtub3duX2ZpZWxkcykpIHJldHVybiBmYWxzZTsKKyAgICBpZiAoIVNraXBGaWVsZChpbnB1dCwgdGFnKSkgcmV0dXJuIGZhbHNlOwogICB9CiB9CiAKLXZvaWQgV2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHMoY29uc3QgVW5rbm93bkZpZWxkU2V0JiB1bmtub3duX2ZpZWxkcywKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0gICAgc3dpdGNoIChmaWVsZC50eXBlKCkpIHsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX1ZBUklOVDoKLSAgICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1ZBUklOVCkpOwotICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50NjQoZmllbGQudmFyaW50KCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6Ci0gICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyKSk7Ci0gICAgICAgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW4zMihmaWVsZC5maXhlZDMyKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVENjQ6Ci0gICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDY0KSk7Ci0gICAgICAgIG91dHB1dC0+V3JpdGVMaXR0bGVFbmRpYW42NChmaWVsZC5maXhlZDY0KCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVEKSk7Ci0gICAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpKTsKLSAgICAgICAgb3V0cHV0LT5Xcml0ZVN0cmluZyhmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0dST1VQOgotICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfU1RBUlRfR1JPVVApKTsKLSAgICAgICAgU2VyaWFsaXplVW5rbm93bkZpZWxkcyhmaWVsZC5ncm91cCgpLCBvdXRwdXQpOwotICAgICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRU5EX0dST1VQKSk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotfQotCi11aW50OCogV2lyZUZvcm1hdExpdGU6OlNlcmlhbGl6ZVVua25vd25GaWVsZHNUb0FycmF5KAotICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgdWludDgqIHRhcmdldCkgewotICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKLQotICAgIHN3aXRjaCAoZmllbGQudHlwZSgpKSB7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9WQVJJTlQ6Ci0gICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUludDY0VG9BcnJheSgKLSAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC52YXJpbnQoKSwgdGFyZ2V0KTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDMyOgotICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVGaXhlZDMyVG9BcnJheSgKLSAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC5maXhlZDMyKCksIHRhcmdldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfRklYRUQ2NDoKLSAgICAgICAgdGFyZ2V0ID0gV2lyZUZvcm1hdExpdGU6OldyaXRlRml4ZWQ2NFRvQXJyYXkoCi0gICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgZmllbGQuZml4ZWQ2NCgpLCB0YXJnZXQpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQ6Ci0gICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzVG9BcnJheSgKLSAgICAgICAgICAgIGZpZWxkLm51bWJlcigpLCBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCksIHRhcmdldCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6Ci0gICAgICAgIHRhcmdldCA9IFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZ1RvQXJyYXkoCi0gICAgICAgICAgICBmaWVsZC5udW1iZXIoKSwgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX1NUQVJUX0dST1VQLCB0YXJnZXQpOwotICAgICAgICB0YXJnZXQgPSBTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheShmaWVsZC5ncm91cCgpLCB0YXJnZXQpOwotICAgICAgICB0YXJnZXQgPSBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgICAgZmllbGQubnVtYmVyKCksIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9FTkRfR1JPVVAsIHRhcmdldCk7Ci0gICAgICAgIGJyZWFrOwotICAgIH0KLSAgfQotICByZXR1cm4gdGFyZ2V0OwotfQotCi12b2lkIFdpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zKAotICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCitib29sIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCiAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0gICAgLy8gVGhlIG9ubHkgdW5rbm93biBmaWVsZHMgdGhhdCBhcmUgYWxsb3dlZCB0byBleGlzdCBpbiBhIE1lc3NhZ2VTZXQgYXJlCi0gICAgLy8gbWVzc2FnZXMsIHdoaWNoIGFyZSBsZW5ndGgtZGVsaW1pdGVkLgotICAgIGlmIChmaWVsZC50eXBlKCkgPT0gVW5rbm93bkZpZWxkOjpUWVBFX0xFTkdUSF9ERUxJTUlURUQpIHsKLSAgICAgIGNvbnN0IHN0cmluZyYgZGF0YSA9IGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKTsKLQotICAgICAgLy8gU3RhcnQgZ3JvdXAuCi0gICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKTsKLQotICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWRUYWcpOwotICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKGZpZWxkLm51bWJlcigpKTsKLQotICAgICAgLy8gV3JpdGUgbWVzc2FnZS4KLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnKTsKLSAgICAgIG91dHB1dC0+V3JpdGVWYXJpbnQzMihkYXRhLnNpemUoKSk7Ci0gICAgICBvdXRwdXQtPldyaXRlU3RyaW5nKGRhdGEpOwotCi0gICAgICAvLyBFbmQgZ3JvdXAuCi0gICAgICBvdXRwdXQtPldyaXRlVmFyaW50MzIoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbUVuZFRhZyk7CisgIHdoaWxlICh0cnVlKSB7CisgICAgdWludDMyIHRhZyA9IGlucHV0LT5SZWFkVGFnKCk7CisgICAgaWYgKHRhZyA9PSAwKSB7CisgICAgICAvLyBFbmQgb2YgaW5wdXQuICBUaGlzIGlzIGEgdmFsaWQgcGxhY2UgdG8gZW5kLCBzbyByZXR1cm4gdHJ1ZS4KKyAgICAgIHJldHVybiB0cnVlOwogICAgIH0KKworICAgIFdpcmVGb3JtYXRMaXRlOjpXaXJlVHlwZSB3aXJlX3R5cGUgPSBXaXJlRm9ybWF0TGl0ZTo6R2V0VGFnV2lyZVR5cGUodGFnKTsKKworICAgIGlmICh3aXJlX3R5cGUgPT0gV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkgeworICAgICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHRhZyk7CisgICAgICAvLyBNdXN0IGJlIHRoZSBlbmQgb2YgdGhlIG1lc3NhZ2UuCisgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoIVNraXBGaWVsZChpbnB1dCwgdGFnLCBvdXRwdXQpKSByZXR1cm4gZmFsc2U7CiAgIH0KIH0KIAotdWludDgqIFdpcmVGb3JtYXRMaXRlOjpTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKLSAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgIHVpbnQ4KiB0YXJnZXQpIHsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0KLSAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKLSAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCi0gICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgY29uc3Qgc3RyaW5nJiBkYXRhID0gZmllbGQubGVuZ3RoX2RlbGltaXRlZCgpOwotCi0gICAgICAvLyBTdGFydCBncm91cC4KLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1TdGFydFRhZywgdGFyZ2V0KTsKLQotICAgICAgLy8gV3JpdGUgdHlwZSBJRC4KLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldFR5cGVJZFRhZywgdGFyZ2V0KTsKLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCi0gICAgICAgICAgZmllbGQubnVtYmVyKCksIHRhcmdldCk7Ci0KLSAgICAgIC8vIFdyaXRlIG1lc3NhZ2UuCi0gICAgICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVGFnVG9BcnJheSgKLSAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlVGFnLCB0YXJnZXQpOwotICAgICAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheShkYXRhLnNpemUoKSwgdGFyZ2V0KTsKLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KGRhdGEsIHRhcmdldCk7Ci0KLSAgICAgIC8vIEVuZCBncm91cC4KLSAgICAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVUYWdUb0FycmF5KAotICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjprTWVzc2FnZVNldEl0ZW1FbmRUYWcsIHRhcmdldCk7Ci0gICAgfQotICB9Ci0KLSAgcmV0dXJuIHRhcmdldDsKK2Jvb2wgRmllbGRTa2lwcGVyOjpTa2lwRmllbGQoCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKSB7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6U2tpcEZpZWxkKGlucHV0LCB0YWcpOwogfQogCi1pbnQgV2lyZUZvcm1hdExpdGU6OkNvbXB1dGVVbmtub3duRmllbGRzU2l6ZSgKLSAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKSB7Ci0gIGludCBzaXplID0gMDsKLSAgZm9yIChpbnQgaSA9IDA7IGkgPCB1bmtub3duX2ZpZWxkcy5maWVsZF9jb3VudCgpOyBpKyspIHsKLSAgICBjb25zdCBVbmtub3duRmllbGQmIGZpZWxkID0gdW5rbm93bl9maWVsZHMuZmllbGQoaSk7Ci0KLSAgICBzd2l0Y2ggKGZpZWxkLnR5cGUoKSkgewotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfVkFSSU5UOgotICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKSk7Ci0gICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplNjQoZmllbGQudmFyaW50KCkpOwotICAgICAgICBicmVhazsKLSAgICAgIGNhc2UgVW5rbm93bkZpZWxkOjpUWVBFX0ZJWEVEMzI6Ci0gICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9GSVhFRDMyKSk7Ci0gICAgICAgIHNpemUgKz0gc2l6ZW9mKGludDMyKTsKLSAgICAgICAgYnJlYWs7Ci0gICAgICBjYXNlIFVua25vd25GaWVsZDo6VFlQRV9GSVhFRDY0OgotICAgICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6Ok1ha2VUYWcoZmllbGQubnVtYmVyKCksCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfRklYRUQ2NCkpOwotICAgICAgICBzaXplICs9IHNpemVvZihpbnQ2NCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRDoKLSAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQpKTsKLSAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgICAgICAgIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCkpOwotICAgICAgICBzaXplICs9IGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCk7Ci0gICAgICAgIGJyZWFrOwotICAgICAgY2FzZSBVbmtub3duRmllbGQ6OlRZUEVfR1JPVVA6Ci0gICAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZyhmaWVsZC5udW1iZXIoKSwKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpXSVJFVFlQRV9TVEFSVF9HUk9VUCkpOwotICAgICAgICBzaXplICs9IENvbXB1dGVVbmtub3duRmllbGRzU2l6ZShmaWVsZC5ncm91cCgpKTsKLSAgICAgICAgc2l6ZSArPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkLm51bWJlcigpLAotICAgICAgICAgICAgV2lyZUZvcm1hdExpdGU6OldJUkVUWVBFX0VORF9HUk9VUCkpOwotICAgICAgICBicmVhazsKLSAgICB9Ci0gIH0KLQotICByZXR1cm4gc2l6ZTsKK2Jvb2wgRmllbGRTa2lwcGVyOjpTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpIHsKKyAgcmV0dXJuIFdpcmVGb3JtYXRMaXRlOjpTa2lwTWVzc2FnZShpbnB1dCk7CiB9CiAKLWludCBXaXJlRm9ybWF0TGl0ZTo6Q29tcHV0ZVVua25vd25NZXNzYWdlU2V0SXRlbXNTaXplKAotICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpIHsKLSAgaW50IHNpemUgPSAwOwotICBmb3IgKGludCBpID0gMDsgaSA8IHVua25vd25fZmllbGRzLmZpZWxkX2NvdW50KCk7IGkrKykgewotICAgIGNvbnN0IFVua25vd25GaWVsZCYgZmllbGQgPSB1bmtub3duX2ZpZWxkcy5maWVsZChpKTsKK3ZvaWQgRmllbGRTa2lwcGVyOjpTa2lwVW5rbm93bkVudW0oCisgICAgaW50IC8qIGZpZWxkX251bWJlciAqLywgaW50IC8qIHZhbHVlICovKSB7CisgIC8vIE5vdGhpbmcuCit9CiAKLSAgICAvLyBUaGUgb25seSB1bmtub3duIGZpZWxkcyB0aGF0IGFyZSBhbGxvd2VkIHRvIGV4aXN0IGluIGEgTWVzc2FnZVNldCBhcmUKLSAgICAvLyBtZXNzYWdlcywgd2hpY2ggYXJlIGxlbmd0aC1kZWxpbWl0ZWQuCi0gICAgaWYgKGZpZWxkLnR5cGUoKSA9PSBVbmtub3duRmllbGQ6OlRZUEVfTEVOR1RIX0RFTElNSVRFRCkgewotICAgICAgc2l6ZSArPSBXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtVGFnc1NpemU7Ci0gICAgICBzaXplICs9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKGZpZWxkLm51bWJlcigpKTsKLSAgICAgIHNpemUgKz0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgICAgIGZpZWxkLmxlbmd0aF9kZWxpbWl0ZWQoKS5zaXplKCkpOwotICAgICAgc2l6ZSArPSBmaWVsZC5sZW5ndGhfZGVsaW1pdGVkKCkuc2l6ZSgpOwotICAgIH0KLSAgfQorYm9vbCBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcjo6U2tpcEZpZWxkKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZykgeworICByZXR1cm4gV2lyZUZvcm1hdExpdGU6OlNraXBGaWVsZChpbnB1dCwgdGFnLCB1bmtub3duX2ZpZWxkc18pOworfQogCi0gIHJldHVybiBzaXplOworYm9vbCBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcjo6U2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KSB7CisgIHJldHVybiBXaXJlRm9ybWF0TGl0ZTo6U2tpcE1lc3NhZ2UoaW5wdXQsIHVua25vd25fZmllbGRzXyk7Cit9CisKK3ZvaWQgQ29kZWRPdXRwdXRTdHJlYW1GaWVsZFNraXBwZXI6OlNraXBVbmtub3duRW51bSgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUpIHsKKyAgdW5rbm93bl9maWVsZHNfLT5Xcml0ZVZhcmludDMyKGZpZWxkX251bWJlcik7CisgIHVua25vd25fZmllbGRzXy0+V3JpdGVWYXJpbnQ2NCh2YWx1ZSk7CiB9CiAKIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRFbnVtTm9JbmxpbmUoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LApAQCAtNDIzLDcgKzMwMSw3IEBACiAgICAgICAgIGludCwgV2lyZUZvcm1hdExpdGU6OlRZUEVfRU5VTT4oaW5wdXQsICZ2YWx1ZSkpIHsKICAgICAgIHJldHVybiBmYWxzZTsKICAgICB9Ci0gICAgaWYgKGlzX3ZhbGlkKHZhbHVlKSkgeworICAgIGlmIChpc192YWxpZCA9PSBOVUxMIHx8IGlzX3ZhbGlkKHZhbHVlKSkgewogICAgICAgdmFsdWVzLT5BZGQodmFsdWUpOwogICAgIH0KICAgfQpAQCAtNDMxLDYgKzMwOSwzNCBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAorYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFBhY2tlZEVudW1QcmVzZXJ2ZVVua25vd25zKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICBpbnQgZmllbGRfbnVtYmVyLAorICAgIGJvb2wgKCppc192YWxpZCkoaW50KSwKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHVua25vd25fZmllbGRzX3N0cmVhbSwKKyAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlcykgeworICB1aW50MzIgbGVuZ3RoOworICBpZiAoIWlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkpIHJldHVybiBmYWxzZTsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0gaW5wdXQtPlB1c2hMaW1pdChsZW5ndGgpOworICB3aGlsZSAoaW5wdXQtPkJ5dGVzVW50aWxMaW1pdCgpID4gMCkgeworICAgIGludCB2YWx1ZTsKKyAgICBpZiAoIWdvb2dsZTo6cHJvdG9idWY6OmludGVybmFsOjpXaXJlRm9ybWF0TGl0ZTo6UmVhZFByaW1pdGl2ZTwKKyAgICAgICAgaW50LCBXaXJlRm9ybWF0TGl0ZTo6VFlQRV9FTlVNPihpbnB1dCwgJnZhbHVlKSkgeworICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpZiAoaXNfdmFsaWQgPT0gTlVMTCB8fCBpc192YWxpZCh2YWx1ZSkpIHsKKyAgICAgIHZhbHVlcy0+QWRkKHZhbHVlKTsKKyAgICB9IGVsc2UgeworICAgICAgdWludDMyIHRhZyA9IFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKGZpZWxkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfVkFSSU5UKTsKKyAgICAgIHVua25vd25fZmllbGRzX3N0cmVhbS0+V3JpdGVWYXJpbnQzMih0YWcpOworICAgICAgdW5rbm93bl9maWVsZHNfc3RyZWFtLT5Xcml0ZVZhcmludDMyKHZhbHVlKTsKKyAgICB9CisgIH0KKyAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKKyAgcmV0dXJuIHRydWU7Cit9CisKIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlSW50MzIoaW50IGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CiAgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfVkFSSU5ULCBvdXRwdXQpOwpAQCAtNTA2LDE1ICs0MTIsMzQgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7CiAgIC8vIFN0cmluZyBpcyBmb3IgVVRGLTggdGV4dCBvbmx5CiAgIFdyaXRlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgb3V0cHV0KTsKKyAgR09PR0xFX0NIRUNLX0xFKHZhbHVlLnNpemUoKSwga2ludDMybWF4KTsKICAgb3V0cHV0LT5Xcml0ZVZhcmludDMyKHZhbHVlLnNpemUoKSk7CiAgIG91dHB1dC0+V3JpdGVTdHJpbmcodmFsdWUpOwogfQordm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVTdHJpbmdNYXliZUFsaWFzZWQoCisgICAgaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCkgeworICAvLyBTdHJpbmcgaXMgZm9yIFVURi04IHRleHQgb25seQorICBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIG91dHB1dCk7CisgIEdPT0dMRV9DSEVDS19MRSh2YWx1ZS5zaXplKCksIGtpbnQzMm1heCk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZS5zaXplKCkpOworICBvdXRwdXQtPldyaXRlUmF3TWF5YmVBbGlhc2VkKHZhbHVlLmRhdGEoKSwgdmFsdWUuc2l6ZSgpKTsKK30KIHZvaWQgV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXMoaW50IGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKICAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICBHT09HTEVfQ0hFQ0tfTEUodmFsdWUuc2l6ZSgpLCBraW50MzJtYXgpOwogICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKICAgb3V0cHV0LT5Xcml0ZVN0cmluZyh2YWx1ZSk7CiB9Cit2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJ5dGVzTWF5YmVBbGlhc2VkKAorICAgIGludCBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsCisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKKyAgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCBvdXRwdXQpOworICBHT09HTEVfQ0hFQ0tfTEUodmFsdWUuc2l6ZSgpLCBraW50MzJtYXgpOworICBvdXRwdXQtPldyaXRlVmFyaW50MzIodmFsdWUuc2l6ZSgpKTsKKyAgb3V0cHV0LT5Xcml0ZVJhd01heWJlQWxpYXNlZCh2YWx1ZS5kYXRhKCksIHZhbHVlLnNpemUoKSk7Cit9CiAKIAogdm9pZCBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVHcm91cChpbnQgZmllbGRfbnVtYmVyLApAQCAtNTY0LDE5ICs0ODksNTMgQEAKICAgfQogfQogCi1ib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyaW5nKiB2YWx1ZSkgewotICAvLyBTdHJpbmcgaXMgZm9yIFVURi04IHRleHQgb25seQorR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FIHN0YXRpYyBib29sIFJlYWRCeXRlc1RvU3RyaW5nKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgc3RyaW5nKiB2YWx1ZSk7CitpbmxpbmUgc3RhdGljIGJvb2wgUmVhZEJ5dGVzVG9TdHJpbmcoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmFsdWUpIHsKICAgdWludDMyIGxlbmd0aDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIGlmICghaW5wdXQtPkludGVybmFsUmVhZFN0cmluZ0lubGluZSh2YWx1ZSwgbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICByZXR1cm4gdHJ1ZTsKKyAgcmV0dXJuIGlucHV0LT5SZWFkVmFyaW50MzIoJmxlbmd0aCkgJiYKKyAgICAgIGlucHV0LT5JbnRlcm5hbFJlYWRTdHJpbmdJbmxpbmUodmFsdWUsIGxlbmd0aCk7CiB9Ci1ib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmFsdWUpIHsKLSAgdWludDMyIGxlbmd0aDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIHJldHVybiBpbnB1dC0+SW50ZXJuYWxSZWFkU3RyaW5nSW5saW5lKHZhbHVlLCBsZW5ndGgpOworCitib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBzdHJpbmcqIHZhbHVlKSB7CisgIHJldHVybiBSZWFkQnl0ZXNUb1N0cmluZyhpbnB1dCwgdmFsdWUpOworfQorCitib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkQnl0ZXMoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBzdHJpbmcqKiBwKSB7CisgIGlmICgqcCA9PSAmOjpnb29nbGU6OnByb3RvYnVmOjppbnRlcm5hbDo6R2V0RW1wdHlTdHJpbmdBbHJlYWR5SW5pdGVkKCkpIHsKKyAgICAqcCA9IG5ldyA6OnN0ZDo6c3RyaW5nKCk7CisgIH0KKyAgcmV0dXJuIFJlYWRCeXRlc1RvU3RyaW5nKGlucHV0LCAqcCk7Cit9CisKK2Jvb2wgV2lyZUZvcm1hdExpdGU6OlZlcmlmeVV0ZjhTdHJpbmcoY29uc3QgY2hhciogZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciogZmllbGRfbmFtZSkgeworICBpZiAoIUlzU3RydWN0dXJhbGx5VmFsaWRVVEY4KGRhdGEsIHNpemUpKSB7CisgICAgY29uc3QgY2hhciogb3BlcmF0aW9uX3N0ciA9IE5VTEw7CisgICAgc3dpdGNoIChvcCkgeworICAgICAgY2FzZSBQQVJTRToKKyAgICAgICAgb3BlcmF0aW9uX3N0ciA9ICJwYXJzaW5nIjsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIFNFUklBTElaRToKKyAgICAgICAgb3BlcmF0aW9uX3N0ciA9ICJzZXJpYWxpemluZyI7CisgICAgICAgIGJyZWFrOworICAgICAgLy8gbm8gZGVmYXVsdCBjYXNlOiBoYXZlIHRoZSBjb21waWxlciB3YXJuIGlmIGEgY2FzZSBpcyBub3QgY292ZXJlZC4KKyAgICB9CisgICAgc3RyaW5nIHF1b3RlZF9maWVsZF9uYW1lID0gIiI7CisgICAgaWYgKGZpZWxkX25hbWUgIT0gTlVMTCkgeworICAgICAgcXVvdGVkX2ZpZWxkX25hbWUgPSBTdHJpbmdQcmludGYoIiAnJXMnIiwgZmllbGRfbmFtZSk7CisgICAgfQorICAgIC8vIG5vIHNwYWNlIGJlbG93IHRvIGF2b2lkIGRvdWJsZSBzcGFjZSB3aGVuIHRoZSBmaWVsZCBuYW1lIGlzIG1pc3NpbmcuCisgICAgR09PR0xFX0xPRyhFUlJPUikgPDwgIlN0cmluZyBmaWVsZCIgPDwgcXVvdGVkX2ZpZWxkX25hbWUgPDwgIiBjb250YWlucyBpbnZhbGlkICIKKyAgICAgICAgICAgICAgIDw8ICJVVEYtOCBkYXRhIHdoZW4gIiA8PCBvcGVyYXRpb25fc3RyIDw8ICIgYSBwcm90b2NvbCAiCisgICAgICAgICAgICAgICA8PCAiYnVmZmVyLiBVc2UgdGhlICdieXRlcycgdHlwZSBpZiB5b3UgaW50ZW5kIHRvIHNlbmQgcmF3ICIKKyAgICAgICAgICAgICAgIDw8ICJieXRlcy4gIjsKKyAgICByZXR1cm4gZmFsc2U7CisgIH0KKyAgcmV0dXJuIHRydWU7CiB9CiAKIH0gIC8vIG5hbWVzcGFjZSBpbnRlcm5hbApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZS5oCmluZGV4IGVlYTIzZjMuLjU1ZmM3ZWMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGUuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmgKQEAgLTEsNiArMSw2IEBACiAvLyBQcm90b2NvbCBCdWZmZXJzIC0gR29vZ2xlJ3MgZGF0YSBpbnRlcmNoYW5nZSBmb3JtYXQKIC8vIENvcHlyaWdodCAyMDA4IEdvb2dsZSBJbmMuICBBbGwgcmlnaHRzIHJlc2VydmVkLgotLy8gaHR0cDovL2NvZGUuZ29vZ2xlLmNvbS9wL3Byb3RvYnVmLworLy8gaHR0cHM6Ly9kZXZlbG9wZXJzLmdvb2dsZS5jb20vcHJvdG9jb2wtYnVmZmVycy8KIC8vCiAvLyBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQgYmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKIC8vIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucyBhcmUKQEAgLTQxLDE3ICs0MSwxNCBAQAogI2RlZmluZSBHT09HTEVfUFJPVE9CVUZfV0lSRV9GT1JNQVRfTElURV9IX18KIAogI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9pby9jb2RlZF9zdHJlYW0uaD4gIC8vIGZvciBDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50MzJTaXplCiAKIG5hbWVzcGFjZSBnb29nbGUgewogCiBuYW1lc3BhY2UgcHJvdG9idWYgewogICB0ZW1wbGF0ZSA8dHlwZW5hbWUgVD4gY2xhc3MgUmVwZWF0ZWRGaWVsZDsgIC8vIHJlcGVhdGVkX2ZpZWxkLmgKLSAgbmFtZXNwYWNlIGlvIHsKLSAgICBjbGFzcyBDb2RlZElucHV0U3RyZWFtOyAgICAgICAgICAgICAvLyBjb2RlZF9zdHJlYW0uaAotICAgIGNsYXNzIENvZGVkT3V0cHV0U3RyZWFtOyAgICAgICAgICAgIC8vIGNvZGVkX3N0cmVhbS5oCi0gIH0KLSAgY2xhc3MgVW5rbm93bkZpZWxkU2V0OwogfQogCiBuYW1lc3BhY2UgcHJvdG9idWYgewpAQCAtMTYwLDMwICsxNTcsMjggQEAKICAgLy8gYW5kIGVuZCB0YWdzLgogICBzdGF0aWMgaW5saW5lIGludCBUYWdTaXplKGludCBmaWVsZF9udW1iZXIsIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdHlwZSk7CiAKLSAgLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KLSAgLy8gSGVscGVycyBmb3IgZGVhbGluZyB3aXRoIHVua25vd24gZmllbGRzCi0KICAgLy8gU2tpcHMgYSBmaWVsZCB2YWx1ZSB3aXRoIHRoZSBnaXZlbiB0YWcuICBUaGUgaW5wdXQgc2hvdWxkIHN0YXJ0CiAgIC8vIHBvc2l0aW9uZWQgaW1tZWRpYXRlbHkgYWZ0ZXIgdGhlIHRhZy4gIFNraXBwZWQgdmFsdWVzIGFyZSBzaW1wbHkgZGlzY2FyZGVkLAogICAvLyBub3QgcmVjb3JkZWQgYW55d2hlcmUuICBTZWUgV2lyZUZvcm1hdDo6U2tpcEZpZWxkKCkgZm9yIGEgdmVyc2lvbiB0aGF0CiAgIC8vIHJlY29yZHMgdG8gYW4gVW5rbm93bkZpZWxkU2V0LgotICAvLyBUT0RPKHhpYW9taW5ncywgYi8yMTQwNTk1MSk6IFRoZSBvcHRpb25hbCB2YWx1ZSBOVUxMIGZvciB1bmtub3duX2ZpZWxkIHdhcwotICAvLyBhZGRlZCB0byBtYWtlIGl0IGNvbXBhdGlibGUgd2l0aCBwcm90b2MtMi40LjAuICBUaGlzIHNob3VsZCBiZSByZW1vdmVkIG9uY2UKLSAgLy8gd2UgY2FuIGNvbXBpbGUgcHJvdG9jIGZyb20gc291cmNlIGNvZGUuCi0gIHN0YXRpYyBib29sIFNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICB1aW50MzIgdGFnLAotICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyA9IE5VTEwpOworICBzdGF0aWMgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnKTsKIAotICAvLyBSZWFkcyBhbmQgaWdub3JlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQuICBJZiB1bmtub3duX2ZpZWxkcyBpcyBub24tTlVMTCwKLSAgLy8gdGhlIGNvbnRlbnRzIHdpbGwgYmUgYWRkZWQgdG8gaXQuCi0gIHN0YXRpYyBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgVW5rbm93bkZpZWxkU2V0KiB1bmtub3duX2ZpZWxkcyk7CisgIC8vIFNraXBzIGEgZmllbGQgdmFsdWUgd2l0aCB0aGUgZ2l2ZW4gdGFnLiAgVGhlIGlucHV0IHNob3VsZCBzdGFydAorICAvLyBwb3NpdGlvbmVkIGltbWVkaWF0ZWx5IGFmdGVyIHRoZSB0YWcuIFNraXBwZWQgdmFsdWVzIGFyZSByZWNvcmRlZCB0byBhCisgIC8vIENvZGVkT3V0cHV0U3RyZWFtLgorICBzdGF0aWMgYm9vbCBTa2lwRmllbGQoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCB1aW50MzIgdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOwogCi0KLSAgLy8gUmVhZHMgYW5kIGlnbm9yZXMgYSBtZXNzYWdlIGZyb20gdGhlIGlucHV0LiAgU2tpcHBlZCB2YWx1ZXMgbWF5IGJlIHN0b3JlZAotICAvLyBpbiB0aGUgVW5rbm93bkZpZWxkU2V0IGlmIGl0IGV4aXN0cy4KKyAgLy8gUmVhZHMgYW5kIGlnbm9yZXMgYSBtZXNzYWdlIGZyb20gdGhlIGlucHV0LiAgU2tpcHBlZCB2YWx1ZXMgYXJlIHNpbXBseQorICAvLyBkaXNjYXJkZWQsIG5vdCByZWNvcmRlZCBhbnl3aGVyZS4gIFNlZSBXaXJlRm9ybWF0OjpTa2lwTWVzc2FnZSgpIGZvciBhCisgIC8vIHZlcnNpb24gdGhhdCByZWNvcmRzIHRvIGFuIFVua25vd25GaWVsZFNldC4KICAgc3RhdGljIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKIAorICAvLyBSZWFkcyBhbmQgaWdub3JlcyBhIG1lc3NhZ2UgZnJvbSB0aGUgaW5wdXQuICBTa2lwcGVkIHZhbHVlcyBhcmUgcmVjb3JkZWQKKyAgLy8gdG8gYSBDb2RlZE91dHB1dFN0cmVhbS4KKyAgc3RhdGljIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIG91dHB1dCk7CisKIC8vIFRoaXMgbWFjcm8gZG9lcyB0aGUgc2FtZSB0aGluZyBhcyBXaXJlRm9ybWF0TGl0ZTo6TWFrZVRhZygpLCBidXQgdGhlCiAvLyByZXN1bHQgaXMgdXNhYmxlIGFzIGEgY29tcGlsZS10aW1lIGNvbnN0YW50LCB3aGljaCBtYWtlcyBpdCB1c2FibGUKIC8vIGFzIGEgc3dpdGNoIGNhc2Ugb3IgYSB0ZW1wbGF0ZSBpbnB1dC4gIFdpcmVGb3JtYXRMaXRlOjpNYWtlVGFnKCkgaXMgbW9yZQpAQCAtMjM4LDQ5ICsyMzMsMTUgQEAKICAgc3RhdGljIHVpbnQ2NCBaaWdaYWdFbmNvZGU2NChpbnQ2NCBuKTsKICAgc3RhdGljIGludDY0ICBaaWdaYWdEZWNvZGU2NCh1aW50NjQgbik7CiAKLSAgLy8gV3JpdGUgdGhlIGNvbnRlbnRzIG9mIGFuIFVua25vd25GaWVsZFNldCB0byB0aGUgb3V0cHV0LgotICBzdGF0aWMgdm9pZCBTZXJpYWxpemVVbmtub3duRmllbGRzKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgotICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgotICAvLyBDb21wdXRlVW5rbm93bkZpZWxkc1NpemUodW5rbm93bl9maWVsZHMpLgotICAvLwotICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KLSAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duRmllbGRzVG9BcnJheSgKLSAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgICB1aW50OCogdGFyZ2V0KTsKLQotICAvLyBTYW1lIHRoaW5nIGV4Y2VwdCBmb3IgbWVzc2FnZXMgdGhhdCBoYXZlIHRoZSBtZXNzYWdlX3NldF93aXJlX2Zvcm1hdAotICAvLyBvcHRpb24uCi0gIHN0YXRpYyB2b2lkIFNlcmlhbGl6ZVVua25vd25NZXNzYWdlU2V0SXRlbXMoCi0gICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzLAotICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpOwotICAvLyBTYW1lIGFzIGFib3ZlLCBleGNlcHQgd3JpdGluZyBkaXJlY3RseSB0byB0aGUgcHJvdmlkZWQgYnVmZmVyLgotICAvLyBSZXF1aXJlcyB0aGF0IHRoZSBidWZmZXIgaGF2ZSBzdWZmaWNpZW50IGNhcGFjaXR5IGZvcgotICAvLyBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUodW5rbm93bl9maWVsZHMpLgotICAvLwotICAvLyBSZXR1cm5zIGEgcG9pbnRlciBwYXN0IHRoZSBsYXN0IHdyaXR0ZW4gYnl0ZS4KLSAgc3RhdGljIHVpbnQ4KiBTZXJpYWxpemVVbmtub3duTWVzc2FnZVNldEl0ZW1zVG9BcnJheSgKLSAgICAgIGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMsCi0gICAgICB1aW50OCogdGFyZ2V0KTsKLQotICAvLyBDb21wdXRlIHRoZSBzaXplIG9mIHRoZSBVbmtub3duRmllbGRTZXQgb24gdGhlIHdpcmUuCi0gIHN0YXRpYyBpbnQgQ29tcHV0ZVVua25vd25GaWVsZHNTaXplKGNvbnN0IFVua25vd25GaWVsZFNldCYgdW5rbm93bl9maWVsZHMpOwotCi0gIC8vIFNhbWUgdGhpbmcgZXhjZXB0IGZvciBtZXNzYWdlcyB0aGF0IGhhdmUgdGhlIG1lc3NhZ2Vfc2V0X3dpcmVfZm9ybWF0Ci0gIC8vIG9wdGlvbi4KLSAgc3RhdGljIGludCBDb21wdXRlVW5rbm93bk1lc3NhZ2VTZXRJdGVtc1NpemUoCi0gICAgICBjb25zdCBVbmtub3duRmllbGRTZXQmIHVua25vd25fZmllbGRzKTsKLQogICAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQogICAvLyBNZXRob2RzIGZvciByZWFkaW5nL3dyaXRpbmcgaW5kaXZpZHVhbCBmaWVsZC4gIFRoZSBpbXBsZW1lbnRhdGlvbnMKICAgLy8gb2YgdGhlc2UgbWV0aG9kcyBhcmUgZGVmaW5lZCBpbiB3aXJlX2Zvcm1hdF9saXRlX2lubC5oOyB5b3UgbXVzdCAjaW5jbHVkZQogICAvLyB0aGF0IGZpbGUgdG8gdXNlIHRoZXNlLgogCiAvLyBBdm9pZCB1Z2x5IGxpbmUgd3JhcHBpbmcKLSNkZWZpbmUgaW5wdXQgIGlvOjpDb2RlZElucHV0U3RyZWFtKiAgaW5wdXQKLSNkZWZpbmUgb3V0cHV0IGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0Ci0jZGVmaW5lIGZpZWxkX251bWJlciBpbnQgZmllbGRfbnVtYmVyCisjZGVmaW5lIGlucHV0ICBpbzo6Q29kZWRJbnB1dFN0cmVhbSogIGlucHV0X2FyZworI2RlZmluZSBvdXRwdXQgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXRfYXJnCisjZGVmaW5lIGZpZWxkX251bWJlciBpbnQgZmllbGRfbnVtYmVyX2FyZwogI2RlZmluZSBJTkwgR09PR0xFX0FUVFJJQlVURV9BTFdBWVNfSU5MSU5FCiAKICAgLy8gUmVhZCBmaWVsZHMsIG5vdCBpbmNsdWRpbmcgdGFncy4gIFRoZSBhc3N1bXB0aW9uIGlzIHRoYXQgeW91IGFscmVhZHkKQEAgLTI4OSwxNyArMjUwLDE3IEBACiAgIC8vIEZvciBwcmltaXRpdmUgZmllbGRzLCB3ZSBqdXN0IHVzZSBhIHRlbXBsYXRpemVkIHJvdXRpbmUgcGFyYW1ldGVyaXplZCBieQogICAvLyB0aGUgcmVwcmVzZW50ZWQgdHlwZSBhbmQgdGhlIEZpZWxkVHlwZS4gVGhlc2UgYXJlIHNwZWNpYWxpemVkIHdpdGggdGhlCiAgIC8vIGFwcHJvcHJpYXRlIGRlZmluaXRpb24gZm9yIGVhY2ggZGVjbGFyZWQgdHlwZS4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkUHJpbWl0aXZlKGlucHV0LCBDVHlwZSogdmFsdWUpIElOTDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+IElOTAorICBzdGF0aWMgYm9vbCBSZWFkUHJpbWl0aXZlKGlucHV0LCBDVHlwZSogdmFsdWUpOwogCiAgIC8vIFJlYWRzIHJlcGVhdGVkIHByaW1pdGl2ZSB2YWx1ZXMsIHdpdGggb3B0aW1pemF0aW9ucyBmb3IgcmVwZWF0cy4KICAgLy8gdGFnX3NpemUgYW5kIHRhZyBzaG91bGQgYm90aCBiZSBjb21waWxlLXRpbWUgY29uc3RhbnRzIHByb3ZpZGVkIGJ5IHRoZQogICAvLyBwcm90b2NvbCBjb21waWxlci4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkUmVwZWF0ZWRQcmltaXRpdmUoaW50IHRhZ19zaXplLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5wdXQsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKSBJTkw7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPiBJTkwKKyAgc3RhdGljIGJvb2wgUmVhZFJlcGVhdGVkUHJpbWl0aXZlKGludCB0YWdfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7CiAKICAgLy8gSWRlbnRpY2FsIHRvIFJlYWRSZXBlYXRlZFByaW1pdGl2ZSwgZXhjZXB0IHdpbGwgbm90IGlubGluZSB0aGUKICAgLy8gaW1wbGVtZW50YXRpb24uCkBAIC0zMTQsMzAgKzI3NSw1NiBAQAogICAvLwogICAvLyBUaGlzIGlzIG9ubHkgaW1wbGVtZW50ZWQgZm9yIHRoZSB0eXBlcyB3aXRoIGZpeGVkIHdpcmUgc2l6ZSwgZS5nLgogICAvLyBmbG9hdCwgZG91YmxlLCBhbmQgdGhlIChzKWZpeGVkKiB0eXBlcy4KLSAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgY29uc3QgdWludDgqIFJlYWRQcmltaXRpdmVGcm9tQXJyYXkoY29uc3QgdWludDgqIGJ1ZmZlciwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDVHlwZSogdmFsdWUpIElOTDsKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+IElOTAorICBzdGF0aWMgY29uc3QgdWludDgqIFJlYWRQcmltaXRpdmVGcm9tQXJyYXkoY29uc3QgdWludDgqIGJ1ZmZlciwgQ1R5cGUqIHZhbHVlKTsKIAogICAvLyBSZWFkcyBhIHByaW1pdGl2ZSBwYWNrZWQgZmllbGQuCiAgIC8vCiAgIC8vIFRoaXMgaXMgb25seSBpbXBsZW1lbnRlZCBmb3IgcGFja2FibGUgdHlwZXMuCi0gIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgotICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZFBhY2tlZFByaW1pdGl2ZShpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKSBJTkw7CisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPiBJTkwKKyAgc3RhdGljIGJvb2wgUmVhZFBhY2tlZFByaW1pdGl2ZShpbnB1dCwgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKTsKIAogICAvLyBJZGVudGljYWwgdG8gUmVhZFBhY2tlZFByaW1pdGl2ZSwgZXhjZXB0IHdpbGwgbm90IGlubGluZSB0aGUKICAgLy8gaW1wbGVtZW50YXRpb24uCiAgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgogICBzdGF0aWMgYm9vbCBSZWFkUGFja2VkUHJpbWl0aXZlTm9JbmxpbmUoaW5wdXQsIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZSk7CiAKLSAgLy8gUmVhZCBhIHBhY2tlZCBlbnVtIGZpZWxkLiBWYWx1ZXMgZm9yIHdoaWNoIGlzX3ZhbGlkKCkgcmV0dXJucyBmYWxzZSBhcmUKLSAgLy8gZHJvcHBlZC4KKyAgLy8gUmVhZCBhIHBhY2tlZCBlbnVtIGZpZWxkLiBJZiB0aGUgaXNfdmFsaWQgZnVuY3Rpb24gaXMgbm90IE5VTEwsIHZhbHVlcyBmb3IKKyAgLy8gd2hpY2ggaXNfdmFsaWQodmFsdWUpIHJldHVybnMgZmFsc2UgYXJlIHNpbGVudGx5IGRyb3BwZWQuCiAgIHN0YXRpYyBib29sIFJlYWRQYWNrZWRFbnVtTm9JbmxpbmUoaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCAoKmlzX3ZhbGlkKShpbnQpLAotICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50PiogdmFsdWUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFJlcGVhdGVkRmllbGQ8aW50PiogdmFsdWVzKTsKIAotICBzdGF0aWMgYm9vbCBSZWFkU3RyaW5nKGlucHV0LCBzdHJpbmcqIHZhbHVlKTsKLSAgc3RhdGljIGJvb2wgUmVhZEJ5dGVzIChpbnB1dCwgc3RyaW5nKiB2YWx1ZSk7CisgIC8vIFJlYWQgYSBwYWNrZWQgZW51bSBmaWVsZC4gSWYgdGhlIGlzX3ZhbGlkIGZ1bmN0aW9uIGlzIG5vdCBOVUxMLCB2YWx1ZXMgZm9yCisgIC8vIHdoaWNoIGlzX3ZhbGlkKHZhbHVlKSByZXR1cm5zIGZhbHNlIGFyZSBhcHBlbmRlZCB0byB1bmtub3duX2ZpZWxkc19zdHJlYW0uCisgIHN0YXRpYyBib29sIFJlYWRQYWNrZWRFbnVtUHJlc2VydmVVbmtub3ducygKKyAgICAgIGlucHV0LAorICAgICAgZmllbGRfbnVtYmVyLAorICAgICAgYm9vbCAoKmlzX3ZhbGlkKShpbnQpLAorICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiB1bmtub3duX2ZpZWxkc19zdHJlYW0sCisgICAgICBSZXBlYXRlZEZpZWxkPGludD4qIHZhbHVlcyk7CisKKyAgLy8gUmVhZCBhIHN0cmluZy4gIFJlYWRTdHJpbmcoLi4uLCBzdHJpbmcqIHZhbHVlKSByZXF1aXJlcyBhbiBleGlzdGluZyBzdHJpbmcuCisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkU3RyaW5nKGlucHV0LCBzdHJpbmcqIHZhbHVlKTsKKyAgLy8gUmVhZFN0cmluZyguLi4sIHN0cmluZyoqIHApIGlzIGludGVybmFsLW9ubHksIGFuZCBzaG91bGQgb25seSBiZSBjYWxsZWQKKyAgLy8gZnJvbSBnZW5lcmF0ZWQgY29kZS4gSXQgc3RhcnRzIGJ5IHNldHRpbmcgKnAgdG8gIm5ldyBzdHJpbmciCisgIC8vIGlmICpwID09ICZHZXRFbXB0eVN0cmluZ0FscmVhZHlJbml0ZWQoKS4gIEl0IHRoZW4gaW52b2tlcworICAvLyBSZWFkU3RyaW5nKGlucHV0LCAqcCkuICBUaGlzIGlzIHVzZWZ1bCBmb3IgcmVkdWNpbmcgY29kZSBzaXplLgorICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZFN0cmluZyhpbnB1dCwgc3RyaW5nKiogcCk7CisgIC8vIEFuYWxvZ291cyB0byBSZWFkU3RyaW5nKCkuCisgIHN0YXRpYyBib29sIFJlYWRCeXRlcyhpbnB1dCwgc3RyaW5nKiB2YWx1ZSk7CisgIHN0YXRpYyBib29sIFJlYWRCeXRlcyhpbnB1dCwgc3RyaW5nKiogcCk7CisKKworICBlbnVtIE9wZXJhdGlvbiB7CisgICAgUEFSU0UgPSAwLAorICAgIFNFUklBTElaRSA9IDEsCisgIH07CisKKyAgLy8gUmV0dXJucyB0cnVlIGlmIHRoZSBkYXRhIGlzIHZhbGlkIFVURi04LgorICBzdGF0aWMgYm9vbCBWZXJpZnlVdGY4U3RyaW5nKGNvbnN0IGNoYXIqIGRhdGEsIGludCBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9wZXJhdGlvbiBvcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBmaWVsZF9uYW1lKTsKIAogICBzdGF0aWMgaW5saW5lIGJvb2wgUmVhZEdyb3VwICAoZmllbGRfbnVtYmVyLCBpbnB1dCwgTWVzc2FnZUxpdGUqIHZhbHVlKTsKICAgc3RhdGljIGlubGluZSBib29sIFJlYWRNZXNzYWdlKGlucHV0LCBNZXNzYWdlTGl0ZSogdmFsdWUpOwpAQCAtMzUxLDI2ICszMzgsMzcgQEAKICAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CiAgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkTWVzc2FnZU5vVmlydHVhbChpbnB1dCwgTWVzc2FnZVR5cGUqIHZhbHVlKTsKIAorICAvLyBUaGUgc2FtZSwgYnV0IGRvIG5vdCBtb2RpZnkgaW5wdXQncyByZWN1cnNpb24gZGVwdGguICBUaGlzIGlzIHVzZWZ1bAorICAvLyB3aGVuIHJlYWRpbmcgYSBidW5jaCBvZiBncm91cHMgb3IgbWVzc2FnZXMgaW4gYSBsb29wLCBiZWNhdXNlIHRoZW4gdGhlCisgIC8vIHJlY3Vyc2lvbiBkZXB0aCBjYW4gYmUgaW5jcmVtZW50ZWQgYmVmb3JlIHRoZSBsb29wIGFuZCBkZWNyZW1lbnRlZCBhZnRlci4KKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkR3JvdXBOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKGZpZWxkX251bWJlciwgaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE1lc3NhZ2VUeXBlKiB2YWx1ZSk7CisKKyAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+CisgIHN0YXRpYyBpbmxpbmUgYm9vbCBSZWFkTWVzc2FnZU5vVmlydHVhbE5vUmVjdXJzaW9uRGVwdGgoaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZVR5cGUqIHZhbHVlKTsKKwogICAvLyBXcml0ZSBhIHRhZy4gIFRoZSBXcml0ZSooKSBmdW5jdGlvbnMgdHlwaWNhbGx5IGluY2x1ZGUgdGhlIHRhZywgc28KICAgLy8gbm9ybWFsbHkgdGhlcmUncyBubyBuZWVkIHRvIGNhbGwgdGhpcyB1bmxlc3MgdXNpbmcgdGhlIFdyaXRlKk5vVGFnKCkKICAgLy8gdmFyaWFudHMuCi0gIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZVRhZyhmaWVsZF9udW1iZXIsIFdpcmVUeXBlIHR5cGUsIG91dHB1dCkgSU5MOworICBJTkwgc3RhdGljIHZvaWQgV3JpdGVUYWcoZmllbGRfbnVtYmVyLCBXaXJlVHlwZSB0eXBlLCBvdXRwdXQpOwogCiAgIC8vIFdyaXRlIGZpZWxkcywgd2l0aG91dCB0YWdzLgotICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVJbnQzMk5vVGFnICAgKGludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlSW50NjROb1RhZyAgIChpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZVVJbnQzMk5vVGFnICAodWludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlVUludDY0Tm9UYWcgICh1aW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVTSW50MzJOb1RhZyAgKGludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlU0ludDY0Tm9UYWcgIChpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUZpeGVkMzJOb1RhZyAodWludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlRml4ZWQ2NE5vVGFnICh1aW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVTRml4ZWQzMk5vVGFnKGludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB2b2lkIFdyaXRlU0ZpeGVkNjROb1RhZyhpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUZsb2F0Tm9UYWcgICAoZmxvYXQgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHZvaWQgV3JpdGVEb3VibGVOb1RhZyAgKGRvdWJsZSB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUJvb2xOb1RhZyAgICAoYm9vbCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdm9pZCBXcml0ZUVudW1Ob1RhZyAgICAoaW50IHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlSW50MzJOb1RhZyAgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlSW50NjROb1RhZyAgIChpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlVUludDMyTm9UYWcgICh1aW50MzIgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdm9pZCBXcml0ZVVJbnQ2NE5vVGFnICAodWludDY0IHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHZvaWQgV3JpdGVTSW50MzJOb1RhZyAgKGludDMyIHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHZvaWQgV3JpdGVTSW50NjROb1RhZyAgKGludDY0IHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHZvaWQgV3JpdGVGaXhlZDMyTm9UYWcgKHVpbnQzMiB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB2b2lkIFdyaXRlRml4ZWQ2NE5vVGFnICh1aW50NjQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDMyTm9UYWcoaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdm9pZCBXcml0ZVNGaXhlZDY0Tm9UYWcoaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdm9pZCBXcml0ZUZsb2F0Tm9UYWcgICAoZmxvYXQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdm9pZCBXcml0ZURvdWJsZU5vVGFnICAoZG91YmxlIHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHZvaWQgV3JpdGVCb29sTm9UYWcgICAgKGJvb2wgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdm9pZCBXcml0ZUVudW1Ob1RhZyAgICAoaW50IHZhbHVlLCBvdXRwdXQpOwogCiAgIC8vIFdyaXRlIGZpZWxkcywgaW5jbHVkaW5nIHRhZ3MuCiAgIHN0YXRpYyB2b2lkIFdyaXRlSW50MzIgICAoZmllbGRfbnVtYmVyLCAgaW50MzIgdmFsdWUsIG91dHB1dCk7CkBAIC0zOTAsNiArMzg4LDEwIEBACiAKICAgc3RhdGljIHZvaWQgV3JpdGVTdHJpbmcoZmllbGRfbnVtYmVyLCBjb25zdCBzdHJpbmcmIHZhbHVlLCBvdXRwdXQpOwogICBzdGF0aWMgdm9pZCBXcml0ZUJ5dGVzIChmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCk7CisgIHN0YXRpYyB2b2lkIFdyaXRlU3RyaW5nTWF5YmVBbGlhc2VkKAorICAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBzdHJpbmcmIHZhbHVlLCBvdXRwdXQpOworICBzdGF0aWMgdm9pZCBXcml0ZUJ5dGVzTWF5YmVBbGlhc2VkKAorICAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBzdHJpbmcmIHZhbHVlLCBvdXRwdXQpOwogCiAgIHN0YXRpYyB2b2lkIFdyaXRlR3JvdXAoCiAgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUsIG91dHB1dCk7CkBAIC00MTYsNzMgKzQxOCw1OSBAQAogI2RlZmluZSBvdXRwdXQgdWludDgqIHRhcmdldAogCiAgIC8vIExpa2UgYWJvdmUsIGJ1dCB1c2Ugb25seSAqVG9BcnJheSBtZXRob2RzIG9mIENvZGVkT3V0cHV0U3RyZWFtLgotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXaXJlVHlwZSB0eXBlLCBvdXRwdXQpIElOTDsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV2lyZVR5cGUgdHlwZSwgb3V0cHV0KTsKIAogICAvLyBXcml0ZSBmaWVsZHMsIHdpdGhvdXQgdGFncy4KLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVJbnQzMk5vVGFnVG9BcnJheSAgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlSW50NjROb1RhZ1RvQXJyYXkgICAoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVVJbnQzMk5vVGFnVG9BcnJheSAgKHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlVUludDY0Tm9UYWdUb0FycmF5ICAodWludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ludDY0Tm9UYWdUb0FycmF5ICAoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUZpeGVkMzJOb1RhZ1RvQXJyYXkgKHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSAodWludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTRml4ZWQzMk5vVGFnVG9BcnJheShpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ZpeGVkNjROb1RhZ1RvQXJyYXkoaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5ICAgKGZsb2F0IHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVEb3VibGVOb1RhZ1RvQXJyYXkgIChkb3VibGUgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUJvb2xOb1RhZ1RvQXJyYXkgICAgKGJvb2wgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkgICAgKGludCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlSW50MzJOb1RhZ1RvQXJyYXkgICAoaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlSW50NjROb1RhZ1RvQXJyYXkgICAoaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlVUludDMyTm9UYWdUb0FycmF5ICAodWludDMyIHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVVJbnQ2NE5vVGFnVG9BcnJheSAgKHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVTSW50MzJOb1RhZ1RvQXJyYXkgIChpbnQzMiB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVTSW50NjROb1RhZ1RvQXJyYXkgIChpbnQ2NCB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVGaXhlZDMyTm9UYWdUb0FycmF5ICh1aW50MzIgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlRml4ZWQ2NE5vVGFnVG9BcnJheSAodWludDY0IHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVNGaXhlZDMyTm9UYWdUb0FycmF5KGludDMyIHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVNGaXhlZDY0Tm9UYWdUb0FycmF5KGludDY0IHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUZsb2F0Tm9UYWdUb0FycmF5ICAgKGZsb2F0IHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZURvdWJsZU5vVGFnVG9BcnJheSAgKGRvdWJsZSB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVCb29sTm9UYWdUb0FycmF5ICAgIChib29sIHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZUVudW1Ob1RhZ1RvQXJyYXkgICAgKGludCB2YWx1ZSwgb3V0cHV0KTsKIAogICAvLyBXcml0ZSBmaWVsZHMsIGluY2x1ZGluZyB0YWdzLgotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUludDMyVG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVJbnQ2NFRvQXJyYXkoCi0gICAgZmllbGRfbnVtYmVyLCBpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlVUludDMyVG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIHVpbnQzMiB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlVUludDY0VG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ludDMyVG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIGludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTSW50NjRUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUZpeGVkMzJUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgdWludDMyIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVGaXhlZDY0VG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIHVpbnQ2NCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlU0ZpeGVkMzJUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsIG91dHB1dCkgSU5MOwotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZVNGaXhlZDY0VG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIGludDY0IHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVGbG9hdFRvQXJyYXkoCi0gICAgZmllbGRfbnVtYmVyLCBmbG9hdCB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlRG91YmxlVG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIGRvdWJsZSB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlQm9vbFRvQXJyYXkoCi0gICAgZmllbGRfbnVtYmVyLCBib29sIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVFbnVtVG9BcnJheSgKLSAgICBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlSW50MzJUb0FycmF5KGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlSW50NjRUb0FycmF5KGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlVUludDMyVG9BcnJheShmaWVsZF9udW1iZXIsIHVpbnQzMiB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVVSW50NjRUb0FycmF5KGZpZWxkX251bWJlciwgdWludDY0IHZhbHVlLCBvdXRwdXQpOworICBJTkwgc3RhdGljIHVpbnQ4KiBXcml0ZVNJbnQzMlRvQXJyYXkoZmllbGRfbnVtYmVyLCBpbnQzMiB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVTSW50NjRUb0FycmF5KGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlRml4ZWQzMlRvQXJyYXkoZmllbGRfbnVtYmVyLCB1aW50MzIgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlRml4ZWQ2NFRvQXJyYXkoZmllbGRfbnVtYmVyLCB1aW50NjQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlU0ZpeGVkMzJUb0FycmF5KGZpZWxkX251bWJlciwgaW50MzIgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlU0ZpeGVkNjRUb0FycmF5KGZpZWxkX251bWJlciwgaW50NjQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlRmxvYXRUb0FycmF5KGZpZWxkX251bWJlciwgZmxvYXQgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlRG91YmxlVG9BcnJheShmaWVsZF9udW1iZXIsIGRvdWJsZSB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVCb29sVG9BcnJheShmaWVsZF9udW1iZXIsIGJvb2wgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlRW51bVRvQXJyYXkoZmllbGRfbnVtYmVyLCBpbnQgdmFsdWUsIG91dHB1dCk7CiAKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVTdHJpbmdUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgb3V0cHV0KSBJTkw7Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlQnl0ZXNUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgb3V0cHV0KSBJTkw7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlU3RyaW5nVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IHN0cmluZyYgdmFsdWUsIG91dHB1dCk7CisgIElOTCBzdGF0aWMgdWludDgqIFdyaXRlQnl0ZXNUb0FycmF5KAorICAgIGZpZWxkX251bWJlciwgY29uc3Qgc3RyaW5nJiB2YWx1ZSwgb3V0cHV0KTsKIAotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZUdyb3VwVG9BcnJheSgKLSAgICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpIElOTDsKLSAgc3RhdGljIGlubGluZSB1aW50OCogV3JpdGVNZXNzYWdlVG9BcnJheSgKLSAgICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVHcm91cFRvQXJyYXkoCisgICAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VMaXRlJiB2YWx1ZSwgb3V0cHV0KTsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVNZXNzYWdlVG9BcnJheSgKKyAgICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZUxpdGUmIHZhbHVlLCBvdXRwdXQpOwogCiAgIC8vIExpa2UgYWJvdmUsIGJ1dCBkZS12aXJ0dWFsaXplIHRoZSBjYWxsIHRvIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpLiAgVGhlCiAgIC8vIHBvaW50ZXIgbXVzdCBwb2ludCBhdCBhbiBpbnN0YW5jZSBvZiBNZXNzYWdlVHlwZSwgKm5vdCogYSBzdWJjbGFzcyAob3IKICAgLy8gdGhlIHN1YmNsYXNzIG11c3Qgbm90IG92ZXJyaWRlIFNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygpKS4KICAgdGVtcGxhdGU8dHlwZW5hbWUgTWVzc2FnZVR5cGU+Ci0gIHN0YXRpYyBpbmxpbmUgdWludDgqIFdyaXRlR3JvdXBOb1ZpcnR1YWxUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVHcm91cE5vVmlydHVhbFRvQXJyYXkoCisgICAgZmllbGRfbnVtYmVyLCBjb25zdCBNZXNzYWdlVHlwZSYgdmFsdWUsIG91dHB1dCk7CiAgIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlPgotICBzdGF0aWMgaW5saW5lIHVpbnQ4KiBXcml0ZU1lc3NhZ2VOb1ZpcnR1YWxUb0FycmF5KAotICAgIGZpZWxkX251bWJlciwgY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlLCBvdXRwdXQpIElOTDsKKyAgSU5MIHN0YXRpYyB1aW50OCogV3JpdGVNZXNzYWdlTm9WaXJ0dWFsVG9BcnJheSgKKyAgICBmaWVsZF9udW1iZXIsIGNvbnN0IE1lc3NhZ2VUeXBlJiB2YWx1ZSwgb3V0cHV0KTsKIAogI3VuZGVmIG91dHB1dAogI3VuZGVmIGlucHV0CkBAIC01MjUsMTYgKzUxMywyNSBAQAogICB0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZT4KICAgc3RhdGljIGlubGluZSBpbnQgTWVzc2FnZVNpemVOb1ZpcnR1YWwoY29uc3QgTWVzc2FnZVR5cGUmIHZhbHVlKTsKIAorICAvLyBHaXZlbiB0aGUgbGVuZ3RoIG9mIGRhdGEsIGNhbGN1bGF0ZSB0aGUgYnl0ZSBzaXplIG9mIHRoZSBkYXRhIG9uIHRoZQorICAvLyB3aXJlIGlmIHdlIGVuY29kZSB0aGUgZGF0YSBhcyBhIGxlbmd0aCBkZWxpbWl0ZWQgZmllbGQuCisgIHN0YXRpYyBpbmxpbmUgaW50IExlbmd0aERlbGltaXRlZFNpemUoaW50IGxlbmd0aCk7CisKICBwcml2YXRlOgogICAvLyBBIGhlbHBlciBtZXRob2QgZm9yIHRoZSByZXBlYXRlZCBwcmltaXRpdmUgcmVhZGVyLiBUaGlzIG1ldGhvZCBoYXMKICAgLy8gb3B0aW1pemF0aW9ucyBmb3IgcHJpbWl0aXZlIHR5cGVzIHRoYXQgaGF2ZSBmaXhlZCBzaXplIG9uIHRoZSB3aXJlLCBhbmQKICAgLy8gY2FuIGJlIHJlYWQgdXNpbmcgcG90ZW50aWFsbHkgZmFzdGVyIHBhdGhzLgotICB0ZW1wbGF0ZSA8dHlwZW5hbWUgQ1R5cGUsIGVudW0gRmllbGRUeXBlIERlY2xhcmVkVHlwZT4KLSAgc3RhdGljIGlubGluZSBib29sIFJlYWRSZXBlYXRlZEZpeGVkU2l6ZVByaW1pdGl2ZSgKKyAgdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIEZpZWxkVHlwZSBEZWNsYXJlZFR5cGU+IEdPT0dMRV9BVFRSSUJVVEVfQUxXQVlTX0lOTElORQorICBzdGF0aWMgYm9vbCBSZWFkUmVwZWF0ZWRGaXhlZFNpemVQcmltaXRpdmUoCiAgICAgICBpbnQgdGFnX3NpemUsCiAgICAgICB1aW50MzIgdGFnLAogICAgICAgZ29vZ2xlOjpwcm90b2J1Zjo6aW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAotICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKSBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkU7CisgICAgICBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWUpOworCisgIC8vIExpa2UgUmVhZFJlcGVhdGVkRml4ZWRTaXplUHJpbWl0aXZlIGJ1dCBmb3IgcGFja2VkIHByaW1pdGl2ZSBmaWVsZHMuCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPiBHT09HTEVfQVRUUklCVVRFX0FMV0FZU19JTkxJTkUKKyAgc3RhdGljIGJvb2wgUmVhZFBhY2tlZEZpeGVkU2l6ZVByaW1pdGl2ZShnb29nbGU6OnByb3RvYnVmOjppbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlKTsKIAogICBzdGF0aWMgY29uc3QgQ3BwVHlwZSBrRmllbGRUeXBlVG9DcHBUeXBlTWFwW107CiAgIHN0YXRpYyBjb25zdCBXaXJlRm9ybWF0TGl0ZTo6V2lyZVR5cGUga1dpcmVUeXBlRm9yRmllbGRUeXBlW107CkBAIC01NDIsMjggKzUzOSw0NiBAQAogICBHT09HTEVfRElTQUxMT1dfRVZJTF9DT05TVFJVQ1RPUlMoV2lyZUZvcm1hdExpdGUpOwogfTsKIAotLy8gQSBjbGFzcyB3aGljaCBkZWFscyB3aXRoIHVua25vd24gdmFsdWVzIGJ5IHNhdmluZyB0aGVtIHRvIGFuIFVua25vd25GaWVsZFNldC4KKy8vIEEgY2xhc3Mgd2hpY2ggZGVhbHMgd2l0aCB1bmtub3duIHZhbHVlcy4gIFRoZSBkZWZhdWx0IGltcGxlbWVudGF0aW9uIGp1c3QKKy8vIGRpc2NhcmRzIHRoZW0uICBXaXJlRm9ybWF0IGRlZmluZXMgYSBzdWJjbGFzcyB3aGljaCB3cml0ZXMgdG8gYW4KKy8vIFVua25vd25GaWVsZFNldC4gIFRoaXMgY2xhc3MgaXMgdXNlZCBieSBFeHRlbnNpb25TZXQ6OlBhcnNlRmllbGQoKSwgc2luY2UKKy8vIEV4dGVuc2lvblNldCBpcyBwYXJ0IG9mIHRoZSBsaXRlIGxpYnJhcnkgYnV0IFVua25vd25GaWVsZFNldCBpcyBub3QuCiBjbGFzcyBMSUJQUk9UT0JVRl9FWFBPUlQgRmllbGRTa2lwcGVyIHsKICBwdWJsaWM6Ci0gIEZpZWxkU2tpcHBlcihVbmtub3duRmllbGRTZXQqIHVua25vd25fZmllbGRzKQotICAgICAgOiB1bmtub3duX2ZpZWxkc18odW5rbm93bl9maWVsZHMpIHt9CisgIEZpZWxkU2tpcHBlcigpIHt9CisgIHZpcnR1YWwgfkZpZWxkU2tpcHBlcigpIHt9CiAKICAgLy8gU2tpcCBhIGZpZWxkIHdob3NlIHRhZyBoYXMgYWxyZWFkeSBiZWVuIGNvbnN1bWVkLgotICBib29sIFNraXBGaWVsZChpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsIHVpbnQzMiB0YWcpOworICB2aXJ0dWFsIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZyk7CiAKICAgLy8gU2tpcCBhbiBlbnRpcmUgbWVzc2FnZSBvciBncm91cCwgdXAgdG8gYW4gZW5kLWdyb3VwIHRhZyAod2hpY2ggaXMgY29uc3VtZWQpCiAgIC8vIG9yIGVuZC1vZi1zdHJlYW0uCi0gIGJvb2wgU2tpcE1lc3NhZ2UoaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0KTsKKyAgdmlydHVhbCBib29sIFNraXBNZXNzYWdlKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCk7CiAKICAgLy8gRGVhbCB3aXRoIGFuIGFscmVhZHktcGFyc2VkIHVucmVjb2duaXplZCBlbnVtIHZhbHVlLiAgVGhlIGRlZmF1bHQKICAgLy8gaW1wbGVtZW50YXRpb24gZG9lcyBub3RoaW5nLCBidXQgdGhlIFVua25vd25GaWVsZFNldC1iYXNlZCBpbXBsZW1lbnRhdGlvbgogICAvLyBzYXZlcyBpdCBhcyBhbiB1bmtub3duIHZhcmludC4KLSAgdm9pZCBTa2lwVW5rbm93bkVudW0oaW50IGZpZWxkX251bWJlciwgaW50IHZhbHVlKTsKLQotIHByaXZhdGU6Ci0gIFVua25vd25GaWVsZFNldCogdW5rbm93bl9maWVsZHNfOworICB2aXJ0dWFsIHZvaWQgU2tpcFVua25vd25FbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSk7CiB9OwogCisvLyBTdWJjbGFzcyBvZiBGaWVsZFNraXBwZXIgd2hpY2ggc2F2ZXMgc2tpcHBlZCBmaWVsZHMgdG8gYSBDb2RlZE91dHB1dFN0cmVhbS4KKworY2xhc3MgTElCUFJPVE9CVUZfRVhQT1JUIENvZGVkT3V0cHV0U3RyZWFtRmllbGRTa2lwcGVyIDogcHVibGljIEZpZWxkU2tpcHBlciB7CisgcHVibGljOgorICBleHBsaWNpdCBDb2RlZE91dHB1dFN0cmVhbUZpZWxkU2tpcHBlcihpbzo6Q29kZWRPdXRwdXRTdHJlYW0qIHVua25vd25fZmllbGRzKQorICAgICAgOiB1bmtub3duX2ZpZWxkc18odW5rbm93bl9maWVsZHMpIHt9CisgIHZpcnR1YWwgfkNvZGVkT3V0cHV0U3RyZWFtRmllbGRTa2lwcGVyKCkge30KKworICAvLyBpbXBsZW1lbnRzIEZpZWxkU2tpcHBlciAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICB2aXJ0dWFsIGJvb2wgU2tpcEZpZWxkKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgdWludDMyIHRhZyk7CisgIHZpcnR1YWwgYm9vbCBTa2lwTWVzc2FnZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQpOworICB2aXJ0dWFsIHZvaWQgU2tpcFVua25vd25FbnVtKGludCBmaWVsZF9udW1iZXIsIGludCB2YWx1ZSk7CisKKyBwcm90ZWN0ZWQ6CisgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogdW5rbm93bl9maWVsZHNfOworfTsKKworCiAvLyBpbmxpbmUgbWV0aG9kcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CiAKIGlubGluZSBXaXJlRm9ybWF0TGl0ZTo6Q3BwVHlwZQpAQCAtNTg2LDggKzYwMSw3IEBACiBpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpUYWdTaXplKGludCBmaWVsZF9udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgdHlwZSkgewogICBpbnQgcmVzdWx0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KGZpZWxkX251bWJlciA8PCBrVGFnVHlwZUJpdHMpKTsKLQorICAgIGZpZWxkX251bWJlciA8PCBrVGFnVHlwZUJpdHMpOwogICBpZiAodHlwZSA9PSBUWVBFX0dST1VQKSB7CiAgICAgLy8gR3JvdXBzIGhhdmUgYm90aCBhIHN0YXJ0IGFuZCBhbiBlbmQgdGFnLgogICAgIHJldHVybiByZXN1bHQgKiAyOwpAQCAtNjQ2LDIwICs2NjAsMzMgQEAKIAogaW5saW5lIHVpbnQzMiBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlMzIoaW50MzIgbikgewogICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYwotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDMyPigobiA8PCAxKSBeIChuID4+IDMxKSk7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDMyPihuKSA8PCAxKSBeIChuID4+IDMxKTsKIH0KIAogaW5saW5lIGludDMyIFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGUzMih1aW50MzIgbikgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50MzI+KChuID4+IDEpIF4gLXN0YXRpY19jYXN0PGludDMyPihuICYgMSkpOworICByZXR1cm4gKG4gPj4gMSkgXiAtc3RhdGljX2Nhc3Q8aW50MzI+KG4gJiAxKTsKIH0KIAogaW5saW5lIHVpbnQ2NCBXaXJlRm9ybWF0TGl0ZTo6WmlnWmFnRW5jb2RlNjQoaW50NjQgbikgewogICAvLyBOb3RlOiAgdGhlIHJpZ2h0LXNoaWZ0IG11c3QgYmUgYXJpdGhtZXRpYwotICByZXR1cm4gc3RhdGljX2Nhc3Q8dWludDY0PigobiA8PCAxKSBeIChuID4+IDYzKSk7CisgIHJldHVybiAoc3RhdGljX2Nhc3Q8dWludDY0PihuKSA8PCAxKSBeIChuID4+IDYzKTsKIH0KIAogaW5saW5lIGludDY0IFdpcmVGb3JtYXRMaXRlOjpaaWdaYWdEZWNvZGU2NCh1aW50NjQgbikgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50NjQ+KChuID4+IDEpIF4gLXN0YXRpY19jYXN0PGludDY0PihuICYgMSkpOworICByZXR1cm4gKG4gPj4gMSkgXiAtc3RhdGljX2Nhc3Q8aW50NjQ+KG4gJiAxKTsKK30KKworLy8gU3RyaW5nIGlzIGZvciBVVEYtOCB0ZXh0IG9ubHksIGJ1dCwgZXZlbiBzbywgUmVhZFN0cmluZygpIGNhbiBzaW1wbHkKKy8vIGNhbGwgUmVhZEJ5dGVzKCkuCisKK2lubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkU3RyaW5nKGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cmluZyogdmFsdWUpIHsKKyAgcmV0dXJuIFJlYWRCeXRlcyhpbnB1dCwgdmFsdWUpOworfQorCitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZFN0cmluZyhpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJpbmcqKiBwKSB7CisgIHJldHVybiBSZWFkQnl0ZXMoaW5wdXQsIHApOwogfQogCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlX2lubC5oCmluZGV4IDFlNjFhYmYuLjdiY2UyMWMgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X2xpdGVfaW5sLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd2lyZV9mb3JtYXRfbGl0ZV9pbmwuaApAQCAtMSw2ICsxLDYgQEAKIC8vIFByb3RvY29sIEJ1ZmZlcnMgLSBHb29nbGUncyBkYXRhIGludGVyY2hhbmdlIGZvcm1hdAogLy8gQ29weXJpZ2h0IDIwMDggR29vZ2xlIEluYy4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCi0vLyBodHRwOi8vY29kZS5nb29nbGUuY29tL3AvcHJvdG9idWYvCisvLyBodHRwczovL2RldmVsb3BlcnMuZ29vZ2xlLmNvbS9wcm90b2NvbC1idWZmZXJzLwogLy8KIC8vIFJlZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Igd2l0aG91dAogLy8gbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhlIGZvbGxvd2luZyBjb25kaXRpb25zIGFyZQpAQCAtMzYsMTMgKzM2LDE5IEBACiAjaWZuZGVmIEdPT0dMRV9QUk9UT0JVRl9XSVJFX0ZPUk1BVF9MSVRFX0lOTF9IX18KICNkZWZpbmUgR09PR0xFX1BST1RPQlVGX1dJUkVfRk9STUFUX0xJVEVfSU5MX0hfXwogCisjaWZkZWYgX01TQ19WRVIKKy8vIFRoaXMgaXMgcmVxdWlyZWQgZm9yIG1pbi9tYXggb24gVlMyMDEzIG9ubHkuCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2VuZGlmCisKICNpbmNsdWRlIDxzdHJpbmc+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2NvbW1vbi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9zdHVicy9sb2dnaW5nLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL21lc3NhZ2VfbGl0ZS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi9yZXBlYXRlZF9maWVsZC5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF9saXRlLmg+Ci0jaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2dlbmVyYXRlZF9tZXNzYWdlX3V0aWwuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vY29kZWRfc3RyZWFtLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2FyZW5hc3RyaW5nLmg+CiAKIAogbmFtZXNwYWNlIGdvb2dsZSB7CkBAIC0xNTEsOCArMTU3LDggQEAKIGlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkUHJpbWl0aXZlPGJvb2wsIFdpcmVGb3JtYXRMaXRlOjpUWVBFX0JPT0w+KAogICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKICAgICBib29sKiB2YWx1ZSkgewotICB1aW50MzIgdGVtcDsKLSAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOworICB1aW50NjQgdGVtcDsKKyAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDY0KCZ0ZW1wKSkgcmV0dXJuIGZhbHNlOwogICAqdmFsdWUgPSB0ZW1wICE9IDA7CiAgIHJldHVybiB0cnVlOwogfQpAQCAtMjIyLDEwICsyMjgsMTEgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgotaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZShpbnQsIC8vIHRhZ19zaXplLCB1bnVzZWQuCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMiB0YWcsCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwKLSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgeworaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRSZXBlYXRlZFByaW1pdGl2ZSgKKyAgICBpbnQsICAvLyB0YWdfc2l6ZSwgdW51c2VkLgorICAgIHVpbnQzMiB0YWcsCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAorICAgIFJlcGVhdGVkRmllbGQ8Q1R5cGU+KiB2YWx1ZXMpIHsKICAgQ1R5cGUgdmFsdWU7CiAgIGlmICghUmVhZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgJnZhbHVlKSkgcmV0dXJuIGZhbHNlOwogICB2YWx1ZXMtPkFkZCh2YWx1ZSk7CkBAIC0yNjUsMTAgKzI3MiwxMCBAQAogICBpZiAoc2l6ZSA+IDApIHsKICAgICBjb25zdCB1aW50OCogYnVmZmVyID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCB1aW50OCo+KHZvaWRfcG9pbnRlcik7CiAgICAgLy8gVGhlIG51bWJlciBvZiBieXRlcyBlYWNoIHR5cGUgb2NjdXBpZXMgb24gdGhlIHdpcmUuCi0gICAgY29uc3QgaW50IHBlcl92YWx1ZV9zaXplID0gc3RhdGljX2Nhc3Q8aW50Pih0YWdfc2l6ZSArIHNpemVvZih2YWx1ZSkpOworICAgIGNvbnN0IGludCBwZXJfdmFsdWVfc2l6ZSA9IHRhZ19zaXplICsgc2l6ZW9mKHZhbHVlKTsKIAotICAgIGludCBlbGVtZW50c19hdmFpbGFibGUgPSBtaW4odmFsdWVzLT5DYXBhY2l0eSgpIC0gdmFsdWVzLT5zaXplKCksCi0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplIC8gcGVyX3ZhbHVlX3NpemUpOworICAgIGludCBlbGVtZW50c19hdmFpbGFibGUgPQorICAgICAgICBzdGQ6Om1pbih2YWx1ZXMtPkNhcGFjaXR5KCkgLSB2YWx1ZXMtPnNpemUoKSwgc2l6ZSAvIHBlcl92YWx1ZV9zaXplKTsKICAgICBpbnQgbnVtX3JlYWQgPSAwOwogICAgIHdoaWxlIChudW1fcmVhZCA8IGVsZW1lbnRzX2F2YWlsYWJsZSAmJgogICAgICAgICAgICAoYnVmZmVyID0gaW86OkNvZGVkSW5wdXRTdHJlYW06OkV4cGVjdFRhZ0Zyb21BcnJheSgKQEAgLTI4NSw3ICsyOTIsNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIAotLy8gU3BlY2lhbGl6YXRpb25zIG9mIFJlYWRSZXBlYXRlZFByaW1pdGl2ZSBmb3IgdGhlIGZpeGVkIHNpemUgdHlwZXMsIHdoaWNoIHVzZSAKKy8vIFNwZWNpYWxpemF0aW9ucyBvZiBSZWFkUmVwZWF0ZWRQcmltaXRpdmUgZm9yIHRoZSBmaXhlZCBzaXplIHR5cGVzLCB3aGljaCB1c2UKIC8vIHRoZSBvcHRpbWl6ZWQgY29kZSBwYXRoLgogI2RlZmluZSBSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKENQUFRZUEUsIERFQ0xBUkVEX1RZUEUpICAgICAgICAgICAgIFwKIHRlbXBsYXRlIDw+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCkBAIC0zMDAsMTIgKzMwNywxMiBAQAogICAgICAgdGFnX3NpemUsIHRhZywgaW5wdXQsIHZhbHVlcyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKIH0KIAotUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRSh1aW50MzIsIFRZUEVfRklYRUQzMik7Ci1SRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQ2NCwgVFlQRV9GSVhFRDY0KTsKLVJFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoaW50MzIsIFRZUEVfU0ZJWEVEMzIpOwotUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShpbnQ2NCwgVFlQRV9TRklYRUQ2NCk7Ci1SRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGZsb2F0LCBUWVBFX0ZMT0FUKTsKLVJFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoZG91YmxlLCBUWVBFX0RPVUJMRSk7CitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQzMiwgVFlQRV9GSVhFRDMyKQorUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRSh1aW50NjQsIFRZUEVfRklYRUQ2NCkKK1JFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoaW50MzIsIFRZUEVfU0ZJWEVEMzIpCitSRUFEX1JFUEVBVEVEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGludDY0LCBUWVBFX1NGSVhFRDY0KQorUkVBRF9SRVBFQVRFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShmbG9hdCwgVFlQRV9GTE9BVCkKK1JFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUoZG91YmxlLCBUWVBFX0RPVUJMRSkKIAogI3VuZGVmIFJFQURfUkVQRUFURURfRklYRURfU0laRV9QUklNSVRJVkUKIApAQCAtMzM1LDEyICszNDIsOTMgQEAKIH0KIAogdGVtcGxhdGUgPHR5cGVuYW1lIENUeXBlLCBlbnVtIFdpcmVGb3JtYXRMaXRlOjpGaWVsZFR5cGUgRGVjbGFyZWRUeXBlPgoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRGaXhlZFNpemVQcmltaXRpdmUoCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCBSZXBlYXRlZEZpZWxkPENUeXBlPiogdmFsdWVzKSB7CisgIHVpbnQzMiBsZW5ndGg7CisgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOworICBjb25zdCB1aW50MzIgb2xkX2VudHJpZXMgPSB2YWx1ZXMtPnNpemUoKTsKKyAgY29uc3QgdWludDMyIG5ld19lbnRyaWVzID0gbGVuZ3RoIC8gc2l6ZW9mKENUeXBlKTsKKyAgY29uc3QgdWludDMyIG5ld19ieXRlcyA9IG5ld19lbnRyaWVzICogc2l6ZW9mKENUeXBlKTsKKyAgaWYgKG5ld19ieXRlcyAhPSBsZW5ndGgpIHJldHVybiBmYWxzZTsKKyAgLy8gV2Ugd291bGQgKmxpa2UqIHRvIHByZS1hbGxvY2F0ZSB0aGUgYnVmZmVyIHRvIHdyaXRlIGludG8gKGZvcgorICAvLyBzcGVlZCksIGJ1dCAqbXVzdCogYXZvaWQgcGVyZm9ybWluZyBhIHZlcnkgbGFyZ2UgYWxsb2NhdGlvbiBkdWUKKyAgLy8gdG8gYSBtYWxpY2lvdXMgdXNlci1zdXBwbGllZCAibGVuZ3RoIiBhYm92ZS4gIFNvIHdlIGhhdmUgYSBmYXN0CisgIC8vIHBhdGggdGhhdCBwcmUtYWxsb2NhdGVzIHdoZW4gdGhlICJsZW5ndGgiIGlzIGxlc3MgdGhhbiBhIGJvdW5kLgorICAvLyBXZSBkZXRlcm1pbmUgdGhlIGJvdW5kIGJ5IGNhbGxpbmcgQnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpIGFuZAorICAvLyBCeXRlc1VudGlsTGltaXQoKS4gIFRoZXNlIHJldHVybiAtMSB0byBtZWFuICJubyBsaW1pdCBzZXQiLgorICAvLyBUaGVyZSBhcmUgZm91ciBjYXNlczoKKyAgLy8gVG90YWxCeXRlc0xpbWl0ICBMaW1pdAorICAvLyAtMSAgICAgICAgICAgICAgIC0xICAgICBVc2Ugc2xvdyBwYXRoLgorICAvLyAtMSAgICAgICAgICAgICAgID49IDAgICBVc2UgZmFzdCBwYXRoIGlmIGxlbmd0aCA8PSBMaW1pdC4KKyAgLy8gPj0gMCAgICAgICAgICAgICAtMSAgICAgVXNlIHNsb3cgcGF0aC4KKyAgLy8gPj0gMCAgICAgICAgICAgICA+PSAwICAgVXNlIGZhc3QgcGF0aCBpZiBsZW5ndGggPD0gbWluKGJvdGggbGltaXRzKS4KKyAgaW50NjQgYnl0ZXNfbGltaXQgPSBpbnB1dC0+Qnl0ZXNVbnRpbFRvdGFsQnl0ZXNMaW1pdCgpOworICBpZiAoYnl0ZXNfbGltaXQgPT0gLTEpIHsKKyAgICBieXRlc19saW1pdCA9IGlucHV0LT5CeXRlc1VudGlsTGltaXQoKTsKKyAgfSBlbHNlIHsKKyAgICBieXRlc19saW1pdCA9CisgICAgICAgIHN0ZDo6bWluKGJ5dGVzX2xpbWl0LCBzdGF0aWNfY2FzdDxpbnQ2ND4oaW5wdXQtPkJ5dGVzVW50aWxMaW1pdCgpKSk7CisgIH0KKyAgaWYgKGJ5dGVzX2xpbWl0ID49IG5ld19ieXRlcykgeworICAgIC8vIEZhc3QtcGF0aCB0aGF0IHByZS1hbGxvY2F0ZXMgKnZhbHVlcyB0byB0aGUgZmluYWwgc2l6ZS4KKyNpZiBkZWZpbmVkKFBST1RPQlVGX0xJVFRMRV9FTkRJQU4pCisgICAgdmFsdWVzLT5SZXNpemUob2xkX2VudHJpZXMgKyBuZXdfZW50cmllcywgMCk7CisgICAgLy8gdmFsdWVzLT5tdXRhYmxlX2RhdGEoKSBtYXkgY2hhbmdlIGFmdGVyIFJlc2l6ZSgpLCBzbyBkbyB0aGlzIGFmdGVyOgorICAgIHZvaWQqIGRlc3QgPSByZWludGVycHJldF9jYXN0PHZvaWQqPih2YWx1ZXMtPm11dGFibGVfZGF0YSgpICsgb2xkX2VudHJpZXMpOworICAgIGlmICghaW5wdXQtPlJlYWRSYXcoZGVzdCwgbmV3X2J5dGVzKSkgeworICAgICAgdmFsdWVzLT5UcnVuY2F0ZShvbGRfZW50cmllcyk7CisgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorI2Vsc2UKKyAgICB2YWx1ZXMtPlJlc2VydmUob2xkX2VudHJpZXMgKyBuZXdfZW50cmllcyk7CisgICAgQ1R5cGUgdmFsdWU7CisgICAgZm9yICh1aW50MzIgaSA9IDA7IGkgPCBuZXdfZW50cmllczsgKytpKSB7CisgICAgICBpZiAoIVJlYWRQcmltaXRpdmU8Q1R5cGUsIERlY2xhcmVkVHlwZT4oaW5wdXQsICZ2YWx1ZSkpIHJldHVybiBmYWxzZTsKKyAgICAgIHZhbHVlcy0+QWRkQWxyZWFkeVJlc2VydmVkKHZhbHVlKTsKKyAgICB9CisjZW5kaWYKKyAgfSBlbHNlIHsKKyAgICAvLyBUaGlzIGlzIHRoZSBzbG93LXBhdGggY2FzZSB3aGVyZSAibGVuZ3RoIiBtYXkgYmUgdG9vIGxhcmdlIHRvCisgICAgLy8gc2FmZWx5IGFsbG9jYXRlLiAgV2UgcmVhZCBhcyBtdWNoIGFzIHdlIGNhbiBpbnRvICp2YWx1ZXMKKyAgICAvLyB3aXRob3V0IHByZS1hbGxvY2F0aW5nICJsZW5ndGgiIGJ5dGVzLgorICAgIENUeXBlIHZhbHVlOworICAgIGZvciAodWludDMyIGkgPSAwOyBpIDwgbmV3X2VudHJpZXM7ICsraSkgeworICAgICAgaWYgKCFSZWFkUHJpbWl0aXZlPENUeXBlLCBEZWNsYXJlZFR5cGU+KGlucHV0LCAmdmFsdWUpKSByZXR1cm4gZmFsc2U7CisgICAgICB2YWx1ZXMtPkFkZCh2YWx1ZSk7CisgICAgfQorICB9CisgIHJldHVybiB0cnVlOworfQorCisvLyBTcGVjaWFsaXphdGlvbnMgb2YgUmVhZFBhY2tlZFByaW1pdGl2ZSBmb3IgdGhlIGZpeGVkIHNpemUgdHlwZXMsIHdoaWNoIHVzZQorLy8gYW4gb3B0aW1pemVkIGNvZGUgcGF0aC4KKyNkZWZpbmUgUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUoQ1BQVFlQRSwgREVDTEFSRURfVFlQRSkgICAgICBcCit0ZW1wbGF0ZSA8PiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAoraW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgQ1BQVFlQRSwgV2lyZUZvcm1hdExpdGU6OkRFQ0xBUkVEX1RZUEU+KCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFJlcGVhdGVkRmllbGQ8Q1BQVFlQRT4qIHZhbHVlcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgcmV0dXJuIFJlYWRQYWNrZWRGaXhlZFNpemVQcmltaXRpdmU8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICBDUFBUWVBFLCBXaXJlRm9ybWF0TGl0ZTo6REVDTEFSRURfVFlQRT4oaW5wdXQsIHZhbHVlcyk7ICAgICAgICAgICAgICAgICAgXAorfQorCitSRUFEX1JFUEVBVEVEX1BBQ0tFRF9GSVhFRF9TSVpFX1BSSU1JVElWRSh1aW50MzIsIFRZUEVfRklYRUQzMikKK1JFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKHVpbnQ2NCwgVFlQRV9GSVhFRDY0KQorUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUoaW50MzIsIFRZUEVfU0ZJWEVEMzIpCitSRUFEX1JFUEVBVEVEX1BBQ0tFRF9GSVhFRF9TSVpFX1BSSU1JVElWRShpbnQ2NCwgVFlQRV9TRklYRUQ2NCkKK1JFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFKGZsb2F0LCBUWVBFX0ZMT0FUKQorUkVBRF9SRVBFQVRFRF9QQUNLRURfRklYRURfU0laRV9QUklNSVRJVkUoZG91YmxlLCBUWVBFX0RPVUJMRSkKKworI3VuZGVmIFJFQURfUkVQRUFURURfUEFDS0VEX0ZJWEVEX1NJWkVfUFJJTUlUSVZFCisKK3RlbXBsYXRlIDx0eXBlbmFtZSBDVHlwZSwgZW51bSBXaXJlRm9ybWF0TGl0ZTo6RmllbGRUeXBlIERlY2xhcmVkVHlwZT4KIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRQYWNrZWRQcmltaXRpdmVOb0lubGluZShpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgUmVwZWF0ZWRGaWVsZDxDVHlwZT4qIHZhbHVlcykgewogICByZXR1cm4gUmVhZFBhY2tlZFByaW1pdGl2ZTxDVHlwZSwgRGVjbGFyZWRUeXBlPihpbnB1dCwgdmFsdWVzKTsKIH0KIAogCisKIGlubGluZSBib29sIFdpcmVGb3JtYXRMaXRlOjpSZWFkR3JvdXAoaW50IGZpZWxkX251bWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0qIGlucHV0LAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNZXNzYWdlTGl0ZSogdmFsdWUpIHsKQEAgLTM1NywxNiArNDQ1LDEyIEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTWVzc2FnZUxpdGUqIHZhbHVlKSB7CiAgIHVpbnQzMiBsZW5ndGg7CiAgIGlmICghaW5wdXQtPlJlYWRWYXJpbnQzMigmbGVuZ3RoKSkgcmV0dXJuIGZhbHNlOwotICBpZiAoIWlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aCgpKSByZXR1cm4gZmFsc2U7Ci0gIGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCBsaW1pdCA9Ci0gICAgICBpbnB1dC0+UHVzaExpbWl0KHN0YXRpY19jYXN0PGludD4obGVuZ3RoKSk7Ci0gIGlmICghdmFsdWUtPk1lcmdlUGFydGlhbEZyb21Db2RlZFN0cmVhbShpbnB1dCkpIHJldHVybiBmYWxzZTsKKyAgc3RkOjpwYWlyPGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCwgaW50PiBwID0KKyAgICAgIGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aEFuZFB1c2hMaW1pdChsZW5ndGgpOworICBpZiAocC5zZWNvbmQgPCAwIHx8ICF2YWx1ZS0+TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkgcmV0dXJuIGZhbHNlOwogICAvLyBNYWtlIHN1cmUgdGhhdCBwYXJzaW5nIHN0b3BwZWQgd2hlbiB0aGUgbGltaXQgd2FzIGhpdCwgbm90IGF0IGFuIGVuZGdyb3VwCiAgIC8vIHRhZy4KLSAgaWYgKCFpbnB1dC0+Q29uc3VtZWRFbnRpcmVNZXNzYWdlKCkpIHJldHVybiBmYWxzZTsKLSAgaW5wdXQtPlBvcExpbWl0KGxpbWl0KTsKLSAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7Ci0gIHJldHVybiB0cnVlOworICByZXR1cm4gaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoQW5kUG9wTGltaXQocC5maXJzdCk7CiB9CiAKIC8vIFdlIG5hbWUgdGhlIHRlbXBsYXRlIHBhcmFtZXRlciBzb21ldGhpbmcgbG9uZyBhbmQgZXh0cmVtZWx5IHVubGlrZWx5IHRvIG9jY3VyCkBAIC0zODcsNyArNDcxLDcgQEAKICAgaWYgKCF2YWx1ZS0+CiAgICAgICBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKQogICAgIHJldHVybiBmYWxzZTsKLSAgaW5wdXQtPkRlY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCk7CisgIGlucHV0LT5VbnNhZmVEZWNyZW1lbnRSZWN1cnNpb25EZXB0aCgpOwogICAvLyBNYWtlIHN1cmUgdGhlIGxhc3QgdGhpbmcgcmVhZCB3YXMgYW4gZW5kIHRhZyBmb3IgdGhpcyBncm91cC4KICAgaWYgKCFpbnB1dC0+TGFzdFRhZ1dhcyhNYWtlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQKSkpIHsKICAgICByZXR1cm4gZmFsc2U7CkBAIC0zOTUsMjIgKzQ3OSwzNyBAQAogICByZXR1cm4gdHJ1ZTsKIH0KIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZEdyb3VwTm9WaXJ0dWFsTm9SZWN1cnNpb25EZXB0aCgKKyAgICBpbnQgZmllbGRfbnVtYmVyLCBpbzo6Q29kZWRJbnB1dFN0cmVhbSogaW5wdXQsCisgICAgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCogdmFsdWUpIHsKKyAgcmV0dXJuIHZhbHVlLT5NZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjoKKyAgICAgICAgICAgICBNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpICYmCisgICAgICAgICBpbnB1dC0+TGFzdFRhZ1dhcyhNYWtlVGFnKGZpZWxkX251bWJlciwgV0lSRVRZUEVfRU5EX0dST1VQKSk7Cit9Cit0ZW1wbGF0ZTx0eXBlbmFtZSBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0PgogaW5saW5lIGJvb2wgV2lyZUZvcm1hdExpdGU6OlJlYWRNZXNzYWdlTm9WaXJ0dWFsKAogICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCogdmFsdWUpIHsKICAgdWludDMyIGxlbmd0aDsKICAgaWYgKCFpbnB1dC0+UmVhZFZhcmludDMyKCZsZW5ndGgpKSByZXR1cm4gZmFsc2U7Ci0gIGlmICghaW5wdXQtPkluY3JlbWVudFJlY3Vyc2lvbkRlcHRoKCkpIHJldHVybiBmYWxzZTsKLSAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IGxpbWl0ID0KLSAgICAgIGlucHV0LT5QdXNoTGltaXQoc3RhdGljX2Nhc3Q8aW50PihsZW5ndGgpKTsKKyAgc3RkOjpwYWlyPGlvOjpDb2RlZElucHV0U3RyZWFtOjpMaW1pdCwgaW50PiBwID0KKyAgICAgIGlucHV0LT5JbmNyZW1lbnRSZWN1cnNpb25EZXB0aEFuZFB1c2hMaW1pdChsZW5ndGgpOworICBpZiAocC5zZWNvbmQgPCAwIHx8ICF2YWx1ZS0+CisgICAgICBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0OjpNZXJnZVBhcnRpYWxGcm9tQ29kZWRTdHJlYW0oaW5wdXQpKQorICAgIHJldHVybiBmYWxzZTsKKyAgLy8gTWFrZSBzdXJlIHRoYXQgcGFyc2luZyBzdG9wcGVkIHdoZW4gdGhlIGxpbWl0IHdhcyBoaXQsIG5vdCBhdCBhbiBlbmRncm91cAorICAvLyB0YWcuCisgIHJldHVybiBpbnB1dC0+RGVjcmVtZW50UmVjdXJzaW9uRGVwdGhBbmRQb3BMaW1pdChwLmZpcnN0KTsKK30KK3RlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CitpbmxpbmUgYm9vbCBXaXJlRm9ybWF0TGl0ZTo6UmVhZE1lc3NhZ2VOb1ZpcnR1YWxOb1JlY3Vyc2lvbkRlcHRoKAorICAgIGlvOjpDb2RlZElucHV0U3RyZWFtKiBpbnB1dCwgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdCogdmFsdWUpIHsKKyAgaW86OkNvZGVkSW5wdXRTdHJlYW06OkxpbWl0IG9sZF9saW1pdCA9IGlucHV0LT5SZWFkTGVuZ3RoQW5kUHVzaExpbWl0KCk7CiAgIGlmICghdmFsdWUtPgogICAgICAgTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6TWVyZ2VQYXJ0aWFsRnJvbUNvZGVkU3RyZWFtKGlucHV0KSkKICAgICByZXR1cm4gZmFsc2U7CiAgIC8vIE1ha2Ugc3VyZSB0aGF0IHBhcnNpbmcgc3RvcHBlZCB3aGVuIHRoZSBsaW1pdCB3YXMgaGl0LCBub3QgYXQgYW4gZW5kZ3JvdXAKICAgLy8gdGFnLgotICBpZiAoIWlucHV0LT5Db25zdW1lZEVudGlyZU1lc3NhZ2UoKSkgcmV0dXJuIGZhbHNlOwotICBpbnB1dC0+UG9wTGltaXQobGltaXQpOwotICBpbnB1dC0+RGVjcmVtZW50UmVjdXJzaW9uRGVwdGgoKTsKLSAgcmV0dXJuIHRydWU7CisgIHJldHVybiBpbnB1dC0+Q2hlY2tFbnRpcmVNZXNzYWdlQ29uc3VtZWRBbmRQb3BMaW1pdChvbGRfbGltaXQpOwogfQogCiAvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CkBAIC00NzAsNyArNTY5LDcgQEAKIH0KIGlubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUJvb2xOb1RhZyhib29sIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSogb3V0cHV0KSB7Ci0gIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZSA/IDEgOiAwdSk7CisgIG91dHB1dC0+V3JpdGVWYXJpbnQzMih2YWx1ZSA/IDEgOiAwKTsKIH0KIGlubGluZSB2b2lkIFdpcmVGb3JtYXRMaXRlOjpXcml0ZUVudW1Ob1RhZyhpbnQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtKiBvdXRwdXQpIHsKQEAgLTU2Myw3ICs2NjIsNyBAQAogfQogaW5saW5lIHVpbnQ4KiBXaXJlRm9ybWF0TGl0ZTo6V3JpdGVCb29sTm9UYWdUb0FycmF5KGJvb2wgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSh2YWx1ZSA/IDEgOiAwdSwgdGFyZ2V0KTsKKyAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkodmFsdWUgPyAxIDogMCwgdGFyZ2V0KTsKIH0KIGlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlRW51bU5vVGFnVG9BcnJheShpbnQgdmFsdWUsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewpAQCAtNjYzLDE3ICs3NjIsMTMgQEAKICAgLy8gICBXcml0ZVN0cmluZygpIHRvIGF2b2lkIGNvZGUgZHVwbGljYXRpb24uICBJZiB0aGUgaW1wbGVtZW50YXRpb25zIGJlY29tZQogICAvLyAgIGRpZmZlcmVudCwgeW91IHdpbGwgbmVlZCB0byB1cGRhdGUgdGhhdCB1c2FnZS4KICAgdGFyZ2V0ID0gV3JpdGVUYWdUb0FycmF5KGZpZWxkX251bWJlciwgV0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwgdGFyZ2V0KTsKLSAgdGFyZ2V0ID0gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVZhcmludDMyVG9BcnJheSgKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUuc2l6ZSgpKSwgdGFyZ2V0KTsKLSAgcmV0dXJuIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVTdHJpbmdUb0FycmF5KHZhbHVlLCB0YXJnZXQpOworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZ1dpdGhTaXplVG9BcnJheSh2YWx1ZSwgdGFyZ2V0KTsKIH0KIGlubGluZSB1aW50OCogV2lyZUZvcm1hdExpdGU6OldyaXRlQnl0ZXNUb0FycmF5KGludCBmaWVsZF9udW1iZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBzdHJpbmcmIHZhbHVlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDgqIHRhcmdldCkgewogICB0YXJnZXQgPSBXcml0ZVRhZ1RvQXJyYXkoZmllbGRfbnVtYmVyLCBXSVJFVFlQRV9MRU5HVEhfREVMSU1JVEVELCB0YXJnZXQpOwotICB0YXJnZXQgPSBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlVmFyaW50MzJUb0FycmF5KAotICAgICAgc3RhdGljX2Nhc3Q8dWludDMyPih2YWx1ZS5zaXplKCkpLCB0YXJnZXQpOwotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpXcml0ZVN0cmluZ1RvQXJyYXkodmFsdWUsIHRhcmdldCk7CisgIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OldyaXRlU3RyaW5nV2l0aFNpemVUb0FycmF5KHZhbHVlLCB0YXJnZXQpOwogfQogCiAKQEAgLTY4OSw3ICs3ODQsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OCogdGFyZ2V0KSB7CiAgIHRhcmdldCA9IFdyaXRlVGFnVG9BcnJheShmaWVsZF9udW1iZXIsIFdJUkVUWVBFX0xFTkdUSF9ERUxJTUlURUQsIHRhcmdldCk7CiAgIHRhcmdldCA9IGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6V3JpdGVWYXJpbnQzMlRvQXJyYXkoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlLkdldENhY2hlZFNpemUoKSksIHRhcmdldCk7CisgICAgdmFsdWUuR2V0Q2FjaGVkU2l6ZSgpLCB0YXJnZXQpOwogICByZXR1cm4gdmFsdWUuU2VyaWFsaXplV2l0aENhY2hlZFNpemVzVG9BcnJheSh0YXJnZXQpOwogfQogCkBAIC03NDAsMTIgKzgzNSwxNCBAQAogfQogCiBpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpTdHJpbmdTaXplKGNvbnN0IHN0cmluZyYgdmFsdWUpIHsKLSAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoCi0gICAgICBzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlLnNpemUoKSkpICsgdmFsdWUuc2l6ZSgpKTsKKyAgcmV0dXJuIHN0YXRpY19jYXN0PGludD4oCisgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihzdGF0aWNfY2FzdDx1aW50MzI+KHZhbHVlLnNpemUoKSkpICsKKyAgICAgIHZhbHVlLnNpemUoKSk7CiB9CiBpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpCeXRlc1NpemUoY29uc3Qgc3RyaW5nJiB2YWx1ZSkgewotICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50Pihpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMigKLSAgICAgIHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUuc2l6ZSgpKSkgKyB2YWx1ZS5zaXplKCkpOworICByZXR1cm4gc3RhdGljX2Nhc3Q8aW50PigKKyAgICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbTo6VmFyaW50U2l6ZTMyKHN0YXRpY19jYXN0PHVpbnQzMj4odmFsdWUuc2l6ZSgpKSkgKworICAgICAgdmFsdWUuc2l6ZSgpKTsKIH0KIAogCkBAIC03NTMsOCArODUwLDcgQEAKICAgcmV0dXJuIHZhbHVlLkJ5dGVTaXplKCk7CiB9CiBpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZShjb25zdCBNZXNzYWdlTGl0ZSYgdmFsdWUpIHsKLSAgaW50IHNpemUgPSB2YWx1ZS5CeXRlU2l6ZSgpOwotICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIoc3RhdGljX2Nhc3Q8dWludDMyPihzaXplKSkgKyBzaXplOworICByZXR1cm4gTGVuZ3RoRGVsaW1pdGVkU2l6ZSh2YWx1ZS5CeXRlU2l6ZSgpKTsKIH0KIAogLy8gU2VlIGNvbW1lbnQgb24gUmVhZEdyb3VwTm9WaXJ0dWFsIHRvIHVuZGVyc3RhbmQgdGhlIG5lZWQgZm9yIHRoaXMgdGVtcGxhdGUKQEAgLTc2Nyw4ICs4NjMsMTIgQEAKIHRlbXBsYXRlPHR5cGVuYW1lIE1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q+CiBpbmxpbmUgaW50IFdpcmVGb3JtYXRMaXRlOjpNZXNzYWdlU2l6ZU5vVmlydHVhbCgKICAgICBjb25zdCBNZXNzYWdlVHlwZV9Xb3JrQXJvdW5kQ3BwTG9va3VwRGVmZWN0JiB2YWx1ZSkgewotICBpbnQgc2l6ZSA9IHZhbHVlLk1lc3NhZ2VUeXBlX1dvcmtBcm91bmRDcHBMb29rdXBEZWZlY3Q6OkJ5dGVTaXplKCk7Ci0gIHJldHVybiBpbzo6Q29kZWRPdXRwdXRTdHJlYW06OlZhcmludFNpemUzMihzdGF0aWNfY2FzdDx1aW50MzI+KHNpemUpKSArIHNpemU7CisgIHJldHVybiBMZW5ndGhEZWxpbWl0ZWRTaXplKAorICAgICAgdmFsdWUuTWVzc2FnZVR5cGVfV29ya0Fyb3VuZENwcExvb2t1cERlZmVjdDo6Qnl0ZVNpemUoKSk7Cit9CisKK2lubGluZSBpbnQgV2lyZUZvcm1hdExpdGU6Okxlbmd0aERlbGltaXRlZFNpemUoaW50IGxlbmd0aCkgeworICByZXR1cm4gaW86OkNvZGVkT3V0cHV0U3RyZWFtOjpWYXJpbnRTaXplMzIobGVuZ3RoKSArIGxlbmd0aDsKIH0KIAogfSAgLy8gbmFtZXNwYWNlIGludGVybmFsCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93aXJlX2Zvcm1hdF91bml0dGVzdC5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCmluZGV4IDg2Nzk3MGMuLjRlNGFkZDYgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dpcmVfZm9ybWF0X3VuaXR0ZXN0LmNjCkBAIC0xLDYgKzEsNiBAQAogLy8gUHJvdG9jb2wgQnVmZmVycyAtIEdvb2dsZSdzIGRhdGEgaW50ZXJjaGFuZ2UgZm9ybWF0CiAvLyBDb3B5cmlnaHQgMjAwOCBHb29nbGUgSW5jLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KLS8vIGh0dHA6Ly9jb2RlLmdvb2dsZS5jb20vcC9wcm90b2J1Zi8KKy8vIGh0dHBzOi8vZGV2ZWxvcGVycy5nb29nbGUuY29tL3Byb3RvY29sLWJ1ZmZlcnMvCiAvLwogLy8gUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CiAvLyBtb2RpZmljYXRpb24sIGFyZSBwZXJtaXR0ZWQgcHJvdmlkZWQgdGhhdCB0aGUgZm9sbG93aW5nIGNvbmRpdGlvbnMgYXJlCkBAIC0zOCwxMyArMzgsMTcgQEAKICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvaW8vemVyb19jb3B5X3N0cmVhbV9pbXBsLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL2lvL2NvZGVkX3N0cmVhbS5oPgogI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9wcm90bzNfYXJlbmEucGIuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdW5pdHRlc3RfbXNldC5wYi5oPgorI2luY2x1ZGUgPGdvb2dsZS9wcm90b2J1Zi91bml0dGVzdF9tc2V0X3dpcmVfZm9ybWF0LnBiLmg+CiAjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3Rlc3RfdXRpbC5oPgogCisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvY29tbW9uLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL2xvZ2dpbmcuaD4KICNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvdGVzdGluZy9nb29nbGV0ZXN0Lmg+CiAjaW5jbHVkZSA8Z3Rlc3QvZ3Rlc3QuaD4KLSNpbmNsdWRlIDxnb29nbGUvcHJvdG9idWYvc3R1YnMvc3RsX3V0aWwtaW5sLmg+CisjaW5jbHVkZSA8Z29vZ2xlL3Byb3RvYnVmL3N0dWJzL3N0bF91dGlsLmg+CiAKIG5hbWVzcGFjZSBnb29nbGUgewogbmFtZXNwYWNlIHByb3RvYnVmIHsKQEAgLTE3NSw2ICsxNzksNDMgQEAKICAgVGVzdFV0aWw6OkV4cGVjdFBhY2tlZEV4dGVuc2lvbnNTZXQoZGVzdCk7CiB9CiAKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlT25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgc291cmNlLCBkZXN0OworICBzdHJpbmcgZGF0YTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICBUZXN0VXRpbDo6U2V0T25lb2YxKCZzb3VyY2UpOworICBzb3VyY2UuU2VyaWFsaXplVG9TdHJpbmcoJmRhdGEpOworCisgIC8vIFBhcnNlIHVzaW5nIFdpcmVGb3JtYXQuCisgIGlvOjpBcnJheUlucHV0U3RyZWFtIHJhd19pbnB1dChkYXRhLmRhdGEoKSwgZGF0YS5zaXplKCkpOworICBpbzo6Q29kZWRJbnB1dFN0cmVhbSBpbnB1dCgmcmF3X2lucHV0KTsKKyAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZGVzdCk7CisKKyAgLy8gQ2hlY2suCisgIFRlc3RVdGlsOjpFeHBlY3RPbmVvZlNldDEoZGVzdCk7Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIE9uZW9mT25seVNldExhc3QpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZkJhY2t3YXJkc0NvbXBhdGlibGUgc291cmNlOworICB1bml0dGVzdDo6VGVzdE9uZW9mIG9uZW9mX2Rlc3Q7CisgIHN0cmluZyBkYXRhOworCisgIC8vIFNldCB0d28gZmllbGRzCisgIHNvdXJjZS5zZXRfZm9vX2ludCgxMDApOworICBzb3VyY2Uuc2V0X2Zvb19zdHJpbmcoIjEwMSIpOworCisgIC8vIFNlcmlhbGl6ZSBhbmQgcGFyc2UgdG8gb25lb2YgbWVzc2FnZS4KKyAgc291cmNlLlNlcmlhbGl6ZVRvU3RyaW5nKCZkYXRhKTsKKyAgaW86OkFycmF5SW5wdXRTdHJlYW0gcmF3X2lucHV0KGRhdGEuZGF0YSgpLCBkYXRhLnNpemUoKSk7CisgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KCZyYXdfaW5wdXQpOworICBXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZvbmVvZl9kZXN0KTsKKworICAvLyBPbmx5IHRoZSBsYXN0IGZpZWxkIGlzIHNldC4KKyAgRVhQRUNUX0ZBTFNFKG9uZW9mX2Rlc3QuaGFzX2Zvb19pbnQoKSk7CisgIEVYUEVDVF9UUlVFKG9uZW9mX2Rlc3QuaGFzX2Zvb19zdHJpbmcoKSk7Cit9CisKIFRFU1QoV2lyZUZvcm1hdFRlc3QsIEJ5dGVTaXplKSB7CiAgIHVuaXR0ZXN0OjpUZXN0QWxsVHlwZXMgbWVzc2FnZTsKICAgVGVzdFV0aWw6OlNldEFsbEZpZWxkcygmbWVzc2FnZSk7CkBAIC0yMTcsNiArMjU4LDE4IEBACiAgIEVYUEVDVF9FUSgwLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7CiB9CiAKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIEJ5dGVTaXplT25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgVGVzdFV0aWw6OlNldE9uZW9mMSgmbWVzc2FnZSk7CisKKyAgRVhQRUNUX0VRKG1lc3NhZ2UuQnl0ZVNpemUoKSwKKyAgV2lyZUZvcm1hdDo6Qnl0ZVNpemUobWVzc2FnZSkpOworICBtZXNzYWdlLkNsZWFyKCk7CisKKyAgRVhQRUNUX0VRKDAsIG1lc3NhZ2UuQnl0ZVNpemUoKSk7CisgIEVYUEVDVF9FUSgwLCBXaXJlRm9ybWF0OjpCeXRlU2l6ZShtZXNzYWdlKSk7Cit9CisKIFRFU1QoV2lyZUZvcm1hdFRlc3QsIFNlcmlhbGl6ZSkgewogICB1bml0dGVzdDo6VGVzdEFsbFR5cGVzIG1lc3NhZ2U7CiAgIHN0cmluZyBnZW5lcmF0ZWRfZGF0YTsKQEAgLTMxMSw2ICszNjQsMzYgQEAKICAgVGVzdFV0aWw6OkV4cGVjdEFsbEZpZWxkc0FuZEV4dGVuc2lvbnNJbk9yZGVyKGdlbmVyYXRlZF9kYXRhKTsKIH0KIAorVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplT25lb2YpIHsKKyAgdW5pdHRlc3Q6OlRlc3RPbmVvZjIgbWVzc2FnZTsKKyAgc3RyaW5nIGdlbmVyYXRlZF9kYXRhOworICBzdHJpbmcgZHluYW1pY19kYXRhOworCisgIFRlc3RVdGlsOjpTZXRPbmVvZjEoJm1lc3NhZ2UpOworICBpbnQgc2l6ZSA9IG1lc3NhZ2UuQnl0ZVNpemUoKTsKKworICAvLyBTZXJpYWxpemUgdXNpbmcgdGhlIGdlbmVyYXRlZCBjb2RlLgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZnZW5lcmF0ZWRfZGF0YSk7CisgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgbWVzc2FnZS5TZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoJm91dHB1dCk7CisgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgfQorCisgIC8vIFNlcmlhbGl6ZSB1c2luZyBXaXJlRm9ybWF0LgorICB7CisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZkeW5hbWljX2RhdGEpOworICAgIGlvOjpDb2RlZE91dHB1dFN0cmVhbSBvdXRwdXQoJnJhd19vdXRwdXQpOworICAgIFdpcmVGb3JtYXQ6OlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcyhtZXNzYWdlLCBzaXplLCAmb3V0cHV0KTsKKyAgICBBU1NFUlRfRkFMU0Uob3V0cHV0LkhhZEVycm9yKCkpOworICB9CisKKyAgLy8gU2hvdWxkIGJlIHRoZSBzYW1lLgorICAvLyBEb24ndCB1c2UgRVhQRUNUX0VRIGhlcmUgYmVjYXVzZSB3ZSdyZSBjb21wYXJpbmcgcmF3IGJpbmFyeSBkYXRhIGFuZAorICAvLyB3ZSByZWFsbHkgZG9uJ3Qgd2FudCBpdCBkdW1wZWQgdG8gc3Rkb3V0IG9uIGZhaWx1cmUuCisgIEVYUEVDVF9UUlVFKGR5bmFtaWNfZGF0YSA9PSBnZW5lcmF0ZWRfZGF0YSk7Cit9CisKIFRFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlTXVsdGlwbGVFeHRlbnNpb25SYW5nZXMpIHsKICAgLy8gTWFrZSBzdXJlIHdlIGNhbiBwYXJzZSBhIG1lc3NhZ2UgdGhhdCBjb250YWlucyBtdWx0aXBsZSBleHRlbnNpb25zIHJhbmdlcy4KICAgdW5pdHRlc3Q6OlRlc3RGaWVsZE9yZGVyaW5ncyBzb3VyY2U7CkBAIC0zMzksNyArNDIyLDcgQEAKIAogVEVTVChXaXJlRm9ybWF0VGVzdCwgU2VyaWFsaXplTWVzc2FnZVNldCkgewogICAvLyBTZXQgdXAgYSBUZXN0TWVzc2FnZVNldCB3aXRoIHR3byBrbm93biBtZXNzYWdlcyBhbmQgYW4gdW5rbm93biBvbmUuCi0gIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKKyAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OwogICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKAogICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbiktPnNldF9pKDEyMyk7CiAgIG1lc3NhZ2Vfc2V0Lk11dGFibGVFeHRlbnNpb24oCkBAIC0zODIsNyArNDY1LDcgQEAKICAgLy8gU2V0IHVwIGEgVGVzdE1lc3NhZ2VTZXQgd2l0aCB0d28ga25vd24gbWVzc2FnZXMgYW5kIGFuIHVua25vd24gb25lLCBhcwogICAvLyBhYm92ZS4KIAotICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CisgIHByb3RvMl93aXJlZm9ybWF0X3VuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldCBtZXNzYWdlX3NldDsKICAgbWVzc2FnZV9zZXQuTXV0YWJsZUV4dGVuc2lvbigKICAgICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXRFeHRlbnNpb24xOjptZXNzYWdlX3NldF9leHRlbnNpb24pLT5zZXRfaSgxMjMpOwogICBtZXNzYWdlX3NldC5NdXRhYmxlRXh0ZW5zaW9uKApAQCAtNDU5LDcgKzU0Miw3IEBACiAgIEFTU0VSVF9UUlVFKHJhdy5TZXJpYWxpemVUb1N0cmluZygmZGF0YSkpOwogCiAgIC8vIFBhcnNlIGFzIGEgVGVzdE1lc3NhZ2VTZXQgYW5kIGNoZWNrIHRoZSBjb250ZW50cy4KLSAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CiAgIEFTU0VSVF9UUlVFKG1lc3NhZ2Vfc2V0LlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CiAKICAgRVhQRUNUX0VRKDEyMywgbWVzc2FnZV9zZXQuR2V0RXh0ZW5zaW9uKApAQCAtNDczLDEzICs1NTYsNjEgQEAKICAgRVhQRUNUX0VRKCJiYXIiLCBtZXNzYWdlX3NldC51bmtub3duX2ZpZWxkcygpLmZpZWxkKDApLmxlbmd0aF9kZWxpbWl0ZWQoKSk7CiAKICAgLy8gQWxzbyBwYXJzZSB1c2luZyBXaXJlRm9ybWF0LgotICB1bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgZHluYW1pY19tZXNzYWdlX3NldDsKKyAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IGR5bmFtaWNfbWVzc2FnZV9zZXQ7CiAgIGlvOjpDb2RlZElucHV0U3RyZWFtIGlucHV0KHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhLmRhdGEoKSksCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRhdGEuc2l6ZSgpKTsKICAgQVNTRVJUX1RSVUUoV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCAmZHluYW1pY19tZXNzYWdlX3NldCkpOwogICBFWFBFQ1RfRVEobWVzc2FnZV9zZXQuRGVidWdTdHJpbmcoKSwgZHluYW1pY19tZXNzYWdlX3NldC5EZWJ1Z1N0cmluZygpKTsKIH0KIAorVEVTVChXaXJlRm9ybWF0VGVzdCwgUGFyc2VNZXNzYWdlU2V0V2l0aFJldmVyc2VUYWdPcmRlcikgeworICBzdHJpbmcgZGF0YTsKKyAgeworICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjEgbWVzc2FnZTsKKyAgICBtZXNzYWdlLnNldF9pKDEyMyk7CisgICAgLy8gQnVpbGQgYSBNZXNzYWdlU2V0IG1hbnVhbGx5IHdpdGggaXRzIG1lc3NhZ2UgY29udGVudCBwdXQgYmVmb3JlIGl0cworICAgIC8vIHR5cGVfaWQuCisgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSBvdXRwdXRfc3RyZWFtKCZkYXRhKTsKKyAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gY29kZWRfb3V0cHV0KCZvdXRwdXRfc3RyZWFtKTsKKyAgICBjb2RlZF9vdXRwdXQuV3JpdGVUYWcoV2lyZUZvcm1hdExpdGU6OmtNZXNzYWdlU2V0SXRlbVN0YXJ0VGFnKTsKKyAgICAvLyBXcml0ZSB0aGUgbWVzc2FnZSBjb250ZW50IGZpcnN0LgorICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRNZXNzYWdlTnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBXaXJlRm9ybWF0TGl0ZTo6V0lSRVRZUEVfTEVOR1RIX0RFTElNSVRFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmNvZGVkX291dHB1dCk7CisgICAgY29kZWRfb3V0cHV0LldyaXRlVmFyaW50MzIobWVzc2FnZS5CeXRlU2l6ZSgpKTsKKyAgICBtZXNzYWdlLlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmY29kZWRfb3V0cHV0KTsKKyAgICAvLyBXcml0ZSB0aGUgdHlwZSBpZC4KKyAgICB1aW50MzIgdHlwZV9pZCA9IG1lc3NhZ2UuR2V0RGVzY3JpcHRvcigpLT5leHRlbnNpb24oMCktPm51bWJlcigpOworICAgIFdpcmVGb3JtYXRMaXRlOjpXcml0ZVVJbnQzMihXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRUeXBlSWROdW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfaWQsICZjb2RlZF9vdXRwdXQpOworICAgIGNvZGVkX291dHB1dC5Xcml0ZVRhZyhXaXJlRm9ybWF0TGl0ZTo6a01lc3NhZ2VTZXRJdGVtRW5kVGFnKTsKKyAgfQorICB7CisgICAgcHJvdG8yX3dpcmVmb3JtYXRfdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0IG1lc3NhZ2Vfc2V0OworICAgIEFTU0VSVF9UUlVFKG1lc3NhZ2Vfc2V0LlBhcnNlRnJvbVN0cmluZyhkYXRhKSk7CisKKyAgICBFWFBFQ1RfRVEoMTIzLCBtZXNzYWdlX3NldC5HZXRFeHRlbnNpb24oCisgICAgICAgIHVuaXR0ZXN0OjpUZXN0TWVzc2FnZVNldEV4dGVuc2lvbjE6Om1lc3NhZ2Vfc2V0X2V4dGVuc2lvbikuaSgpKTsKKyAgfQorICB7CisgICAgLy8gVGVzdCBwYXJzZSB0aGUgbWVzc2FnZSB2aWEgUmVmbGVjdGlvbi4KKyAgICBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihkYXRhLmRhdGEoKSksIGRhdGEuc2l6ZSgpKTsKKyAgICBFWFBFQ1RfVFJVRShXaXJlRm9ybWF0OjpQYXJzZUFuZE1lcmdlUGFydGlhbCgmaW5wdXQsICZtZXNzYWdlX3NldCkpOworICAgIEVYUEVDVF9UUlVFKGlucHV0LkNvbnN1bWVkRW50aXJlTWVzc2FnZSgpKTsKKworICAgIEVYUEVDVF9FUSgxMjMsIG1lc3NhZ2Vfc2V0LkdldEV4dGVuc2lvbigKKyAgICAgICAgdW5pdHRlc3Q6OlRlc3RNZXNzYWdlU2V0RXh0ZW5zaW9uMTo6bWVzc2FnZV9zZXRfZXh0ZW5zaW9uKS5pKCkpOworICB9Cit9CisKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIFBhcnNlQnJva2VuTWVzc2FnZVNldCkgeworICBwcm90bzJfd2lyZWZvcm1hdF91bml0dGVzdDo6VGVzdE1lc3NhZ2VTZXQgbWVzc2FnZV9zZXQ7CisgIHN0cmluZyBpbnB1dCgiZ29vZGJ5ZSIpOyAgLy8gSW52YWxpZCB3aXJlIGZvcm1hdCBkYXRhLgorICBFWFBFQ1RfRkFMU0UobWVzc2FnZV9zZXQuUGFyc2VGcm9tU3RyaW5nKGlucHV0KSk7Cit9CisKIFRFU1QoV2lyZUZvcm1hdFRlc3QsIFJlY3Vyc2lvbkxpbWl0KSB7CiAgIHVuaXR0ZXN0OjpUZXN0UmVjdXJzaXZlTWVzc2FnZSBtZXNzYWdlOwogICBtZXNzYWdlLm11dGFibGVfYSgpLT5tdXRhYmxlX2EoKS0+bXV0YWJsZV9hKCktPm11dGFibGVfYSgpLT5zZXRfaSgxKTsKQEAgLTYzOSw2ICs3NzAsMTk3IEBACiAgIEVYUEVDVF9FUShtc2cxLkRlYnVnU3RyaW5nKCksIG1zZzIuRGVidWdTdHJpbmcoKSk7CiB9CiAKK1RFU1QoV2lyZUZvcm1hdFRlc3QsIENvbXBhdGlibGVUeXBlcykgeworICBjb25zdCBpbnQ2NCBkYXRhID0gMHgxMDAwMDAwMDBMTDsKKyAgdW5pdHRlc3Q6OkludDY0TWVzc2FnZSBtc2cxOworICBtc2cxLnNldF9kYXRhKGRhdGEpOworICBzdHJpbmcgc2VyaWFsaXplZDsKKyAgbXNnMS5TZXJpYWxpemVUb1N0cmluZygmc2VyaWFsaXplZCk7CisKKyAgLy8gVGVzdCBpbnQ2NCBpcyBjb21wYXRpYmxlIHdpdGggYm9vbAorICB1bml0dGVzdDo6Qm9vbE1lc3NhZ2UgbXNnMjsKKyAgQVNTRVJUX1RSVUUobXNnMi5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8Ym9vbD4oZGF0YSksIG1zZzIuZGF0YSgpKTsKKworICAvLyBUZXN0IGludDY0IGlzIGNvbXBhdGlibGUgd2l0aCB1aW50NjQKKyAgdW5pdHRlc3Q6OlVpbnQ2NE1lc3NhZ2UgbXNnMzsKKyAgQVNTRVJUX1RSVUUobXNnMy5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8dWludDY0PihkYXRhKSwgbXNnMy5kYXRhKCkpOworCisgIC8vIFRlc3QgaW50NjQgaXMgY29tcGF0aWJsZSB3aXRoIGludDMyCisgIHVuaXR0ZXN0OjpJbnQzMk1lc3NhZ2UgbXNnNDsKKyAgQVNTRVJUX1RSVUUobXNnNC5QYXJzZUZyb21TdHJpbmcoc2VyaWFsaXplZCkpOworICBBU1NFUlRfRVEoc3RhdGljX2Nhc3Q8aW50MzI+KGRhdGEpLCBtc2c0LmRhdGEoKSk7CisKKyAgLy8gVGVzdCBpbnQ2NCBpcyBjb21wYXRpYmxlIHdpdGggdWludDMyCisgIHVuaXR0ZXN0OjpVaW50MzJNZXNzYWdlIG1zZzU7CisgIEFTU0VSVF9UUlVFKG1zZzUuUGFyc2VGcm9tU3RyaW5nKHNlcmlhbGl6ZWQpKTsKKyAgQVNTRVJUX0VRKHN0YXRpY19jYXN0PHVpbnQzMj4oZGF0YSksIG1zZzUuZGF0YSgpKTsKK30KKworY2xhc3MgUHJvdG8zUHJpbWl0aXZlUmVwZWF0ZWRXaXJlRm9ybWF0VGVzdCA6IHB1YmxpYyA6OnRlc3Rpbmc6OlRlc3QgeworIHByb3RlY3RlZDoKKyAgUHJvdG8zUHJpbWl0aXZlUmVwZWF0ZWRXaXJlRm9ybWF0VGVzdCgpCisgICAgICA6IHBhY2tlZFRlc3RBbGxUeXBlc18oCisgICAgICAgICAgICAiXHhGQVx4MDFceDAxXHgwMSIKKyAgICAgICAgICAgICJceDgyXHgwMlx4MDFceDAxIgorICAgICAgICAgICAgIlx4OEFceDAyXHgwMVx4MDEiCisgICAgICAgICAgICAiXHg5Mlx4MDJceDAxXHgwMSIKKyAgICAgICAgICAgICJceDlBXHgwMlx4MDFceDAyIgorICAgICAgICAgICAgIlx4QTJceDAyXHgwMVx4MDIiCisgICAgICAgICAgICAiXHhBQVx4MDJceDA0XHgwMVx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceEIyXHgwMlx4MDhceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceEJBXHgwMlx4MDRceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4QzJceDAyXHgwOFx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4Q0FceDAyXHgwNFx4MDBceDAwXHg4MFx4M2YiCisgICAgICAgICAgICAiXHhEMlx4MDJceDA4XHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhmMFx4M2YiCisgICAgICAgICAgICAiXHhEQVx4MDJceDAxXHgwMSIKKyAgICAgICAgICAgICJceDlBXHgwM1x4MDFceDAxIiwKKyAgICAgICAgICAgIDg2KSwKKyAgICAgICAgcGFja2VkVGVzdFVucGFja2VkVHlwZXNfKAorICAgICAgICAgICAgIlx4MEFceDAxXHgwMSIKKyAgICAgICAgICAgICJceDEyXHgwMVx4MDEiCisgICAgICAgICAgICAiXHgxQVx4MDFceDAxIgorICAgICAgICAgICAgIlx4MjJceDAxXHgwMSIKKyAgICAgICAgICAgICJceDJBXHgwMVx4MDIiCisgICAgICAgICAgICAiXHgzMlx4MDFceDAyIgorICAgICAgICAgICAgIlx4M0FceDA0XHgwMVx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceDQyXHgwOFx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4NEFceDA0XHgwMVx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceDUyXHgwOFx4MDFceDAwXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4NUFceDA0XHgwMFx4MDBceDgwXHgzZiIKKyAgICAgICAgICAgICJceDYyXHgwOFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZjBceDNmIgorICAgICAgICAgICAgIlx4NkFceDAxXHgwMSIKKyAgICAgICAgICAgICJceDcyXHgwMVx4MDEiLAorICAgICAgICAgICAgNzIpLAorICAgICAgICB1bnBhY2tlZFRlc3RBbGxUeXBlc18oCisgICAgICAgICAgICAiXHhGOFx4MDFceDAxIgorICAgICAgICAgICAgIlx4ODBceDAyXHgwMSIKKyAgICAgICAgICAgICJceDg4XHgwMlx4MDEiCisgICAgICAgICAgICAiXHg5MFx4MDJceDAxIgorICAgICAgICAgICAgIlx4OThceDAyXHgwMiIKKyAgICAgICAgICAgICJceEEwXHgwMlx4MDIiCisgICAgICAgICAgICAiXHhBRFx4MDJceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4QjFceDAyXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHhCRFx4MDJceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4QzFceDAyXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHhDRFx4MDJceDAwXHgwMFx4ODBceDNmIgorICAgICAgICAgICAgIlx4RDFceDAyXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHhmMFx4M2YiCisgICAgICAgICAgICAiXHhEOFx4MDJceDAxIgorICAgICAgICAgICAgIlx4OThceDAzXHgwMSIsCisgICAgICAgICAgICA3MiksCisgICAgICAgIHVucGFja2VkVGVzdFVucGFja2VkVHlwZXNfKAorICAgICAgICAgICAgIlx4MDhceDAxIgorICAgICAgICAgICAgIlx4MTBceDAxIgorICAgICAgICAgICAgIlx4MThceDAxIgorICAgICAgICAgICAgIlx4MjBceDAxIgorICAgICAgICAgICAgIlx4MjhceDAyIgorICAgICAgICAgICAgIlx4MzBceDAyIgorICAgICAgICAgICAgIlx4M0RceDAxXHgwMFx4MDBceDAwIgorICAgICAgICAgICAgIlx4NDFceDAxXHgwMFx4MDBceDAwXHgwMFx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceDREXHgwMVx4MDBceDAwXHgwMCIKKyAgICAgICAgICAgICJceDUxXHgwMVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4MDAiCisgICAgICAgICAgICAiXHg1RFx4MDBceDAwXHg4MFx4M2YiCisgICAgICAgICAgICAiXHg2MVx4MDBceDAwXHgwMFx4MDBceDAwXHgwMFx4ZjBceDNmIgorICAgICAgICAgICAgIlx4NjhceDAxIgorICAgICAgICAgICAgIlx4NzBceDAxIiwKKyAgICAgICAgICAgIDU4KSB7fQorICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG8+CisgIHZvaWQgU2V0UHJvdG8zUHJpbWl0aXZlUmVwZWF0ZWRGaWVsZHMoUHJvdG8qIG1lc3NhZ2UpIHsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfaW50MzIoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ludDY0KDEpOworICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF91aW50MzIoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3VpbnQ2NCgxKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfc2ludDMyKDEpOworICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zaW50NjQoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkMzIoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2ZpeGVkNjQoMSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX3NmaXhlZDMyKDEpOworICAgIG1lc3NhZ2UtPmFkZF9yZXBlYXRlZF9zZml4ZWQ2NCgxKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZmxvYXQoMS4wKTsKKyAgICBtZXNzYWdlLT5hZGRfcmVwZWF0ZWRfZG91YmxlKDEuMCk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX2Jvb2wodHJ1ZSk7CisgICAgbWVzc2FnZS0+YWRkX3JlcGVhdGVkX25lc3RlZF9lbnVtKAorICAgICAgICBwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OlRlc3RBbGxUeXBlc19OZXN0ZWRFbnVtX0ZPTyk7CisgIH0KKworICB0ZW1wbGF0ZSA8Y2xhc3MgUHJvdG8+CisgIHZvaWQgRXhwZWN0UHJvdG8zUHJpbWl0aXZlUmVwZWF0ZWRGaWVsZHNTZXQoY29uc3QgUHJvdG8mIG1lc3NhZ2UpIHsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9pbnQzMigwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfaW50NjQoMCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3VpbnQzMigwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfdWludDY0KDApKTsKKyAgICBFWFBFQ1RfRVEoMSwgbWVzc2FnZS5yZXBlYXRlZF9zaW50MzIoMCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NpbnQ2NCgwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQzMigwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfZml4ZWQ2NCgwKSk7CisgICAgRVhQRUNUX0VRKDEsIG1lc3NhZ2UucmVwZWF0ZWRfc2ZpeGVkMzIoMCkpOworICAgIEVYUEVDVF9FUSgxLCBtZXNzYWdlLnJlcGVhdGVkX3NmaXhlZDY0KDApKTsKKyAgICBFWFBFQ1RfRVEoMS4wLCBtZXNzYWdlLnJlcGVhdGVkX2Zsb2F0KDApKTsKKyAgICBFWFBFQ1RfRVEoMS4wLCBtZXNzYWdlLnJlcGVhdGVkX2RvdWJsZSgwKSk7CisgICAgRVhQRUNUX0VRKHRydWUsIG1lc3NhZ2UucmVwZWF0ZWRfYm9vbCgwKSk7CisgICAgRVhQRUNUX0VRKHByb3RvM19hcmVuYV91bml0dGVzdDo6VGVzdEFsbFR5cGVzX05lc3RlZEVudW1fRk9PLAorICAgICAgICAgICAgICBtZXNzYWdlLnJlcGVhdGVkX25lc3RlZF9lbnVtKDApKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBQcm90bz4KKyAgdm9pZCBUZXN0U2VyaWFsaXphdGlvbihQcm90byogbWVzc2FnZSwgY29uc3Qgc3RyaW5nJiBleHBlY3RlZCkgeworICAgIFNldFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkRmllbGRzKG1lc3NhZ2UpOworCisgICAgaW50IHNpemUgPSBtZXNzYWdlLT5CeXRlU2l6ZSgpOworCisgICAgLy8gU2VyaWFsaXplIHVzaW5nIHRoZSBnZW5lcmF0ZWQgY29kZS4KKyAgICBzdHJpbmcgZ2VuZXJhdGVkX2RhdGE7CisgICAgeworICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZnZW5lcmF0ZWRfZGF0YSk7CisgICAgICBpbzo6Q29kZWRPdXRwdXRTdHJlYW0gb3V0cHV0KCZyYXdfb3V0cHV0KTsKKyAgICAgIG1lc3NhZ2UtPlNlcmlhbGl6ZVdpdGhDYWNoZWRTaXplcygmb3V0cHV0KTsKKyAgICAgIEFTU0VSVF9GQUxTRShvdXRwdXQuSGFkRXJyb3IoKSk7CisgICAgfQorICAgIEVYUEVDVF9UUlVFKGV4cGVjdGVkID09IGdlbmVyYXRlZF9kYXRhKTsKKworICAgIC8vIFNlcmlhbGl6ZSB1c2luZyB0aGUgZHluYW1pYyBjb2RlLgorICAgIHN0cmluZyBkeW5hbWljX2RhdGE7CisgICAgeworICAgICAgaW86OlN0cmluZ091dHB1dFN0cmVhbSByYXdfb3V0cHV0KCZkeW5hbWljX2RhdGEpOworICAgICAgaW86OkNvZGVkT3V0cHV0U3RyZWFtIG91dHB1dCgmcmF3X291dHB1dCk7CisgICAgICBXaXJlRm9ybWF0OjpTZXJpYWxpemVXaXRoQ2FjaGVkU2l6ZXMoKm1lc3NhZ2UsIHNpemUsICZvdXRwdXQpOworICAgICAgQVNTRVJUX0ZBTFNFKG91dHB1dC5IYWRFcnJvcigpKTsKKyAgICB9CisgICAgRVhQRUNUX1RSVUUoZXhwZWN0ZWQgPT0gZHluYW1pY19kYXRhKTsKKyAgfQorCisgIHRlbXBsYXRlIDxjbGFzcyBQcm90bz4KKyAgdm9pZCBUZXN0UGFyc2luZyhQcm90byogbWVzc2FnZSwgY29uc3Qgc3RyaW5nJiBjb21wYXRpYmxlX2RhdGEpIHsKKyAgICBtZXNzYWdlLT5DbGVhcigpOworICAgIG1lc3NhZ2UtPlBhcnNlRnJvbVN0cmluZyhjb21wYXRpYmxlX2RhdGEpOworICAgIEV4cGVjdFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkRmllbGRzU2V0KCptZXNzYWdlKTsKKworICAgIG1lc3NhZ2UtPkNsZWFyKCk7CisgICAgaW86OkNvZGVkSW5wdXRTdHJlYW0gaW5wdXQoCisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgdWludDgqPihjb21wYXRpYmxlX2RhdGEuZGF0YSgpKSwKKyAgICAgICAgY29tcGF0aWJsZV9kYXRhLnNpemUoKSk7CisgICAgV2lyZUZvcm1hdDo6UGFyc2VBbmRNZXJnZVBhcnRpYWwoJmlucHV0LCBtZXNzYWdlKTsKKyAgICBFeHBlY3RQcm90bzNQcmltaXRpdmVSZXBlYXRlZEZpZWxkc1NldCgqbWVzc2FnZSk7CisgIH0KKworICBjb25zdCBzdHJpbmcgcGFja2VkVGVzdEFsbFR5cGVzXzsKKyAgY29uc3Qgc3RyaW5nIHBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXzsKKyAgY29uc3Qgc3RyaW5nIHVucGFja2VkVGVzdEFsbFR5cGVzXzsKKyAgY29uc3Qgc3RyaW5nIHVucGFja2VkVGVzdFVucGFja2VkVHlwZXNfOworfTsKKworVEVTVF9GKFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkV2lyZUZvcm1hdFRlc3QsIFByb3RvM1ByaW1pdGl2ZVJlcGVhdGVkKSB7CisgIHByb3RvM19hcmVuYV91bml0dGVzdDo6VGVzdEFsbFR5cGVzIHBhY2tlZF9tZXNzYWdlOworICBwcm90bzNfYXJlbmFfdW5pdHRlc3Q6OlRlc3RVbnBhY2tlZFR5cGVzIHVucGFja2VkX21lc3NhZ2U7CisgIFRlc3RTZXJpYWxpemF0aW9uKCZwYWNrZWRfbWVzc2FnZSwgcGFja2VkVGVzdEFsbFR5cGVzXyk7CisgIFRlc3RQYXJzaW5nKCZwYWNrZWRfbWVzc2FnZSwgcGFja2VkVGVzdEFsbFR5cGVzXyk7CisgIFRlc3RQYXJzaW5nKCZwYWNrZWRfbWVzc2FnZSwgdW5wYWNrZWRUZXN0QWxsVHlwZXNfKTsKKyAgVGVzdFNlcmlhbGl6YXRpb24oJnVucGFja2VkX21lc3NhZ2UsIHVucGFja2VkVGVzdFVucGFja2VkVHlwZXNfKTsKKyAgVGVzdFBhcnNpbmcoJnVucGFja2VkX21lc3NhZ2UsIHBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXyk7CisgIFRlc3RQYXJzaW5nKCZ1bnBhY2tlZF9tZXNzYWdlLCB1bnBhY2tlZFRlc3RVbnBhY2tlZFR5cGVzXyk7Cit9CisKIGNsYXNzIFdpcmVGb3JtYXRJbnZhbGlkSW5wdXRUZXN0IDogcHVibGljIHRlc3Rpbmc6OlRlc3QgewogIHByb3RlY3RlZDoKICAgLy8gTWFrZSBhIHNlcmlhbGl6ZWQgVGVzdEFsbFR5cGVzIGluIHdoaWNoIHRoZSBmaWVsZCBvcHRpb25hbF9uZXN0ZWRfbWVzc2FnZQpAQCAtODAwLDcgKzExMjIsMjAgQEAKICAgcmV0dXJuIG1lc3NhZ2UtPlBhcnNlRnJvbUFycmF5KHdpcmVfYnVmZmVyLmRhdGEoKSwgd2lyZV9idWZmZXIuc2l6ZSgpKTsKIH0KIAotVEVTVChVdGY4VmFsaWRhdGlvblRlc3QsIFdyaXRlSW52YWxpZFVURjhTdHJpbmcpIHsKK2Jvb2wgU3RhcnRzV2l0aChjb25zdCBzdHJpbmcmIHMsIGNvbnN0IHN0cmluZyYgcHJlZml4KSB7CisgIHJldHVybiBzLnN1YnN0cigwLCBwcmVmaXgubGVuZ3RoKCkpID09IHByZWZpeDsKK30KKworY2xhc3MgVXRmOFZhbGlkYXRpb25UZXN0IDogcHVibGljIDo6dGVzdGluZzo6VGVzdCB7CisgcHJvdGVjdGVkOgorICBVdGY4VmFsaWRhdGlvblRlc3QoKSB7fQorICB2aXJ0dWFsIH5VdGY4VmFsaWRhdGlvblRlc3QoKSB7fQorICB2aXJ0dWFsIHZvaWQgU2V0VXAoKSB7CisgIH0KKworfTsKKworVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgV3JpdGVJbnZhbGlkVVRGOFN0cmluZykgewogICBzdHJpbmcgd2lyZV9idWZmZXI7CiAgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgaW5wdXQ7CiAgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKQEAgLTgxMSwxNyArMTE0NiwxOCBAQAogICB9CiAjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECiAgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKLSAgRVhQRUNUX0VRKCJFbmNvdW50ZXJlZCBzdHJpbmcgY29udGFpbmluZyBpbnZhbGlkIFVURi04IGRhdGEgd2hpbGUgIgotICAgICAgICAgICAgInNlcmlhbGl6aW5nIHByb3RvY29sIGJ1ZmZlci4gU3RyaW5ncyBtdXN0IGNvbnRhaW4gb25seSBVVEYtODsgIgotICAgICAgICAgICAgInVzZSB0aGUgJ2J5dGVzJyB0eXBlIGZvciByYXcgYnl0ZXMuIiwKLSAgICAgICAgICAgIGVycm9yc1swXSk7Ci0KKyAgRVhQRUNUX1RSVUUoU3RhcnRzV2l0aChlcnJvcnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBmaWVsZCAncHJvdG9idWZfdW5pdHRlc3QuT25lU3RyaW5nLmRhdGEnICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiY29udGFpbnMgaW52YWxpZCBVVEYtOCBkYXRhIHdoZW4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICJzZXJpYWxpemluZyBhIHByb3RvY29sIGJ1ZmZlci4gVXNlIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIidieXRlcycgdHlwZSBpZiB5b3UgaW50ZW5kIHRvIHNlbmQgcmF3IGJ5dGVzLiIpKTsKICNlbHNlCiAgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKICNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECiB9CiAKLVRFU1QoVXRmOFZhbGlkYXRpb25UZXN0LCBSZWFkSW52YWxpZFVURjhTdHJpbmcpIHsKKworVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZEludmFsaWRVVEY4U3RyaW5nKSB7CiAgIHN0cmluZyB3aXJlX2J1ZmZlcjsKICAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZVN0cmluZyBpbnB1dDsKICAgV3JpdGVNZXNzYWdlKGtJbnZhbGlkVVRGOFN0cmluZywgJmlucHV0LCAmd2lyZV9idWZmZXIpOwpAQCAtODM0LDE3ICsxMTcwLDE5IEBACiAgIH0KICNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKICAgQVNTRVJUX0VRKDEsIGVycm9ycy5zaXplKCkpOwotICBFWFBFQ1RfRVEoIkVuY291bnRlcmVkIHN0cmluZyBjb250YWluaW5nIGludmFsaWQgVVRGLTggZGF0YSB3aGlsZSAiCi0gICAgICAgICAgICAicGFyc2luZyBwcm90b2NvbCBidWZmZXIuIFN0cmluZ3MgbXVzdCBjb250YWluIG9ubHkgVVRGLTg7ICIKLSAgICAgICAgICAgICJ1c2UgdGhlICdieXRlcycgdHlwZSBmb3IgcmF3IGJ5dGVzLiIsCi0gICAgICAgICAgICBlcnJvcnNbMF0pOworICBFWFBFQ1RfVFJVRShTdGFydHNXaXRoKGVycm9yc1swXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiU3RyaW5nIGZpZWxkICdwcm90b2J1Zl91bml0dGVzdC5PbmVTdHJpbmcuZGF0YScgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJjb250YWlucyBpbnZhbGlkIFVURi04IGRhdGEgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInBhcnNpbmcgYSBwcm90b2NvbCBidWZmZXIuIFVzZSB0aGUgIgorICAgICAgICAgICAgICAgICAgICAgICAgICInYnl0ZXMnIHR5cGUgaWYgeW91IGludGVuZCB0byBzZW5kIHJhdyBieXRlcy4iKSk7CiAKICNlbHNlCiAgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKICNlbmRpZiAgLy8gR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECiB9CiAKLVRFU1QoVXRmOFZhbGlkYXRpb25UZXN0LCBXcml0ZVZhbGlkVVRGOFN0cmluZykgeworCitURVNUX0YoVXRmOFZhbGlkYXRpb25UZXN0LCBXcml0ZVZhbGlkVVRGOFN0cmluZykgewogICBzdHJpbmcgd2lyZV9idWZmZXI7CiAgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgaW5wdXQ7CiAgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKQEAgLTg1Niw3ICsxMTk0LDcgQEAKICAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOwogfQogCi1URVNUKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZFZhbGlkVVRGOFN0cmluZykgeworVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZFZhbGlkVVRGOFN0cmluZykgewogICBzdHJpbmcgd2lyZV9idWZmZXI7CiAgIHByb3RvYnVmX3VuaXR0ZXN0OjpPbmVTdHJpbmcgaW5wdXQ7CiAgIFdyaXRlTWVzc2FnZShrVmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CkBAIC04NzIsNyArMTIxMCw3IEBACiB9CiAKIC8vIEJ5dGVzOiBhbnl0aGluZyBjYW4gcGFzcyBhcyBieXRlcywgdXNlIGludmFsaWQgVVRGLTggc3RyaW5nIHRvIHRlc3QKLVRFU1QoVXRmOFZhbGlkYXRpb25UZXN0LCBXcml0ZUFyYml0cmFyeUJ5dGVzKSB7CitURVNUX0YoVXRmOFZhbGlkYXRpb25UZXN0LCBXcml0ZUFyYml0cmFyeUJ5dGVzKSB7CiAgIHN0cmluZyB3aXJlX2J1ZmZlcjsKICAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZUJ5dGVzIGlucHV0OwogICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CkBAIC04ODQsNyArMTIyMiw3IEBACiAgIEFTU0VSVF9FUSgwLCBlcnJvcnMuc2l6ZSgpKTsKIH0KIAotVEVTVChVdGY4VmFsaWRhdGlvblRlc3QsIFJlYWRBcmJpdHJhcnlCeXRlcykgeworVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUmVhZEFyYml0cmFyeUJ5dGVzKSB7CiAgIHN0cmluZyB3aXJlX2J1ZmZlcjsKICAgcHJvdG9idWZfdW5pdHRlc3Q6Ok9uZUJ5dGVzIGlucHV0OwogICBXcml0ZU1lc3NhZ2Uoa0ludmFsaWRVVEY4U3RyaW5nLCAmaW5wdXQsICZ3aXJlX2J1ZmZlcik7CkBAIC04OTksNiArMTIzNyw1MiBAQAogICBFWFBFQ1RfRVEoaW5wdXQuZGF0YSgpLCBvdXRwdXQuZGF0YSgpKTsKIH0KIAorVEVTVF9GKFV0ZjhWYWxpZGF0aW9uVGVzdCwgUGFyc2VSZXBlYXRlZFN0cmluZykgeworICBwcm90b2J1Zl91bml0dGVzdDo6TW9yZUJ5dGVzIGlucHV0OworICBpbnB1dC5hZGRfZGF0YShrVmFsaWRVVEY4U3RyaW5nKTsKKyAgaW5wdXQuYWRkX2RhdGEoa0ludmFsaWRVVEY4U3RyaW5nKTsKKyAgaW5wdXQuYWRkX2RhdGEoa0ludmFsaWRVVEY4U3RyaW5nKTsKKyAgc3RyaW5nIHdpcmVfYnVmZmVyID0gaW5wdXQuU2VyaWFsaXplQXNTdHJpbmcoKTsKKworICBwcm90b2J1Zl91bml0dGVzdDo6TW9yZVN0cmluZyBvdXRwdXQ7CisgIHZlY3RvcjxzdHJpbmc+IGVycm9yczsKKyAgeworICAgIFNjb3BlZE1lbW9yeUxvZyBsb2c7CisgICAgUmVhZE1lc3NhZ2Uod2lyZV9idWZmZXIsICZvdXRwdXQpOworICAgIGVycm9ycyA9IGxvZy5HZXRNZXNzYWdlcyhFUlJPUik7CisgIH0KKyNpZmRlZiBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyAgQVNTRVJUX0VRKDIsIGVycm9ycy5zaXplKCkpOworI2Vsc2UKKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworI2VuZGlmICAvLyBHT09HTEVfUFJPVE9CVUZfVVRGOF9WQUxJREFUSU9OX0VOQUJMRUQKKyAgRVhQRUNUX0VRKHdpcmVfYnVmZmVyLCBvdXRwdXQuU2VyaWFsaXplQXNTdHJpbmcoKSk7Cit9CisKKy8vIFRlc3QgdGhlIG9sZCBWZXJpZnlVVEY4U3RyaW5nKCkgZnVuY3Rpb24sIHdoaWNoIG1heSBzdGlsbCBiZSBjYWxsZWQgYnkgb2xkCisvLyBnZW5lcmF0ZWQgY29kZS4KK1RFU1RfRihVdGY4VmFsaWRhdGlvblRlc3QsIE9sZFZlcmlmeVVURjhTdHJpbmcpIHsKKyAgc3RyaW5nIGRhdGEoa0ludmFsaWRVVEY4U3RyaW5nKTsKKworICB2ZWN0b3I8c3RyaW5nPiBlcnJvcnM7CisgIHsKKyAgICBTY29wZWRNZW1vcnlMb2cgbG9nOworICAgIFdpcmVGb3JtYXQ6OlZlcmlmeVVURjhTdHJpbmcoZGF0YS5kYXRhKCksIGRhdGEuc2l6ZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgV2lyZUZvcm1hdDo6U0VSSUFMSVpFKTsKKyAgICBlcnJvcnMgPSBsb2cuR2V0TWVzc2FnZXMoRVJST1IpOworICB9CisjaWZkZWYgR09PR0xFX1BST1RPQlVGX1VURjhfVkFMSURBVElPTl9FTkFCTEVECisgIEFTU0VSVF9FUSgxLCBlcnJvcnMuc2l6ZSgpKTsKKyAgRVhQRUNUX1RSVUUoU3RhcnRzV2l0aChlcnJvcnNbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgIlN0cmluZyBmaWVsZCBjb250YWlucyBpbnZhbGlkIFVURi04IGRhdGEgd2hlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgInNlcmlhbGl6aW5nIGEgcHJvdG9jb2wgYnVmZmVyLiBVc2UgdGhlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiJ2J5dGVzJyB0eXBlIGlmIHlvdSBpbnRlbmQgdG8gc2VuZCByYXcgYnl0ZXMuIikpOworI2Vsc2UKKyAgQVNTRVJUX0VRKDAsIGVycm9ycy5zaXplKCkpOworI2VuZGlmCit9CisKKwogfSAgLy8gbmFtZXNwYWNlCiB9ICAvLyBuYW1lc3BhY2UgaW50ZXJuYWwKIH0gIC8vIG5hbWVzcGFjZSBwcm90b2J1ZgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5jYyBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmNjCnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnBiLmNjCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5jYwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucGIuaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvc3JjL2dvb2dsZS9wcm90b2J1Zi93cmFwcGVycy5wYi5oCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8Kc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3NyYy9nb29nbGUvcHJvdG9idWYvd3JhcHBlcnMucHJvdG8KcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi9zcmMvZ29vZ2xlL3Byb3RvYnVmL3dyYXBwZXJzLnByb3RvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy90ZXN0cy5zaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi90ZXN0cy5zaApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvdGVzdHMuc2gKcmVuYW1lIHRvIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi90ZXN0cy5zaApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvdGhpcmRfcGFydHkvc2l4L3NpeC5weSBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi90aGlyZF9wYXJ0eS9zaXgvc2l4LnB5CnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy90aGlyZF9wYXJ0eS9zaXgvc2l4LnB5CnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdGhpcmRfcGFydHkvc2l4L3NpeC5weQpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmLTMvdXBkYXRlX2ZpbGVfbGlzdHMuc2ggYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdXBkYXRlX2ZpbGVfbGlzdHMuc2gKc2ltaWxhcml0eSBpbmRleCAxMDAlCnJlbmFtZSBmcm9tIHNyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3VwZGF0ZV9maWxlX2xpc3RzLnNoCnJlbmFtZSB0byBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdXBkYXRlX2ZpbGVfbGlzdHMuc2gKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi0zL3V0aWwvcHl0aG9uL0JVSUxEIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3V0aWwvcHl0aG9uL0JVSUxECnNpbWlsYXJpdHkgaW5kZXggMTAwJQpyZW5hbWUgZnJvbSBzcmMvdGhpcmRfcGFydHkvcHJvdG9idWYtMy91dGlsL3B5dGhvbi9CVUlMRApyZW5hbWUgdG8gc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3V0aWwvcHl0aG9uL0JVSUxECmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdnNwcm9qZWN0cy9jb25maWcuaCBiL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL2NvbmZpZy5oCmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyYzY0NDUwLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL2NvbmZpZy5oCisrKyAvZGV2L251bGwKQEAgLTEsMjkgKzAsMCBAQAotLyogcHJvdG9idWYgY29uZmlnLmggZm9yIE1TVkMuICBPbiBvdGhlciBwbGF0Zm9ybXMsIHRoaXMgaXMgZ2VuZXJhdGVkCi0gKiBhdXRvbWF0aWNhbGx5IGJ5IGF1dG9oZWFkZXIgLyBhdXRvY29uZiAvIGNvbmZpZ3VyZS4gKi8KLQotLyogdGhlIGxvY2F0aW9uIG9mIDxoYXNoX21hcD4gKi8KLSNkZWZpbmUgSEFTSF9NQVBfSCA8aGFzaF9tYXA+Ci0KLS8qIHRoZSBuYW1lc3BhY2Ugb2YgaGFzaF9tYXAvaGFzaF9zZXQgKi8KLS8vIEFwcGFyZW50bHkgTWljcm9zb2Z0IGRlY2lkZWQgdG8gbW92ZSBoYXNoX21hcCAqYmFjayogdG8gdGhlIHN0ZCBuYW1lc3BhY2UKLS8vIGluIE1TVkMgMjAxMDoKLS8vICAgaHR0cDovL2Jsb2dzLm1zZG4uY29tL3ZjYmxvZy9hcmNoaXZlLzIwMDkvMDUvMjUvc3RsLWJyZWFraW5nLWNoYW5nZXMtaW4tdmlzdWFsLXN0dWRpby0yMDEwLWJldGEtMS5hc3B4Ci0vLyBUT0RPKGtlbnRvbik6ICBVc2UgdW5vcmRlcmVkX21hcCBpbnN0ZWFkLCB3aGljaCBpcyBhdmFpbGFibGUgaW4gTVNWQyAyMDEwLgotI2lmIF9NU0NfVkVSIDwgMTMxMCB8fCBfTVNDX1ZFUiA+PSAxNjAwCi0jZGVmaW5lIEhBU0hfTkFNRVNQQUNFIHN0ZAotI2Vsc2UKLSNkZWZpbmUgSEFTSF9OQU1FU1BBQ0Ugc3RkZXh0Ci0jZW5kaWYKLQotLyogdGhlIGxvY2F0aW9uIG9mIDxoYXNoX3NldD4gKi8KLSNkZWZpbmUgSEFTSF9TRVRfSCA8aGFzaF9zZXQ+Ci0KLS8qIGRlZmluZSBpZiB0aGUgY29tcGlsZXIgaGFzIGhhc2hfbWFwICovCi0jZGVmaW5lIEhBVkVfSEFTSF9NQVAgMQotCi0vKiBkZWZpbmUgaWYgdGhlIGNvbXBpbGVyIGhhcyBoYXNoX3NldCAqLwotI2RlZmluZSBIQVZFX0hBU0hfU0VUIDEKLQotLyogZGVmaW5lIGlmIHlvdSB3YW50IHRvIHVzZSB6bGliLiAgU2VlIHJlYWRtZS50eHQgZm9yIGFkZGl0aW9uYWwKLSAqIHJlcXVpcmVtZW50cy4gKi8KLS8vICNkZWZpbmUgSEFWRV9aTElCIDEKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL2NvbnZlcnQyMDA4dG8yMDA1LnNoIGIvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3ZzcHJvamVjdHMvY29udmVydDIwMDh0bzIwMDUuc2gKZGVsZXRlZCBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDYwZWNjYWYuLjAwMDAwMDAKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3ZzcHJvamVjdHMvY29udmVydDIwMDh0bzIwMDUuc2gKKysrIC9kZXYvbnVsbApAQCAtMSwyMCArMCwwIEBACi0jISAvYmluL3NoIC1lCi0KLSMgVGhpcyBzY3JpcHQgZG93bmdyYWRlcyBNU1ZDIDIwMDggcHJvamVjdHMgdG8gTVNWQyAyMDA1IHByb2plY3RzLCBhbGxvd2luZwotIyBwZW9wbGUgd2l0aCBNU1ZDIDIwMDUgdG8gb3BlbiB0aGVtLiAgT3RoZXJ3aXNlLCBNU1ZDIDIwMDUgc2ltcGx5IHJlZnVzZXMgdG8KLSMgb3BlbiBwcm9qZWN0cyBjcmVhdGVkIHdpdGggMjAwOC4gIFdlIHJ1biB0aGlzIGFzIHBhcnQgb2Ygb3VyIHJlbGVhc2UgcHJvY2Vzcy4KLSMgSWYgeW91IG9idGFpbmVkIHRoZSBjb2RlIGRpcmVjdCBmcm9tIHZlcnNpb24gY29udHJvbCBhbmQgeW91IHdhbnQgdG8gdXNlCi0jIE1TVkMgMjAwNSwgeW91IG1heSBoYXZlIHRvIHJ1biB0aGlzIG1hbnVhbGx5LiAgKEhpbnQ6ICBVc2UgQ3lnd2luIG9yIE1TWVMuKQotCi1mb3IgZmlsZSBpbiAqLnNsbjsgZG8KLSAgZWNobyAiZG93bmdyYWRpbmcgJGZpbGUuLi4iCi0gIHNlZCAtaSAtcmUgJ3MvRm9ybWF0IFZlcnNpb24gMTAuMDAvRm9ybWF0IFZlcnNpb24gOS4wMC9nOwotICAgICAgICAgICAgICBzL1Zpc3VhbCBTdHVkaW8gMjAwOC9WaXN1YWwgU3R1ZGlvIDIwMDUvZzsnICRmaWxlCi1kb25lCi0KLWZvciBmaWxlIGluICoudmNwcm9qOyBkbwotICBlY2hvICJkb3duZ3JhZGluZyAkZmlsZS4uLiIKLSAgc2VkIC1pIC1yZSAncy9WZXJzaW9uPSI5LjAwIi9WZXJzaW9uPSI4LjAwIi9nOycgJGZpbGUKLWRvbmUKLQotIyBZZXMsIHJlYWxseSwgdGhhdCdzIGl0LgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3Byb3RvYnVmL3ZzcHJvamVjdHMvZXh0cmFjdF9pbmNsdWRlcy5iYXQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdnNwcm9qZWN0cy9leHRyYWN0X2luY2x1ZGVzLmJhdApkZWxldGVkIGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggNzBmZGY3My4uMDAwMDAwMAotLS0gYS9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdnNwcm9qZWN0cy9leHRyYWN0X2luY2x1ZGVzLmJhdAorKysgL2Rldi9udWxsCkBAIC0xLDQ2ICswLDAgQEAKLW1kIGluY2x1ZGUNCi1tZCBpbmNsdWRlXGdvb2dsZQ0KLW1kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmDQotbWQgaW5jbHVkZVxnb29nbGVccHJvdG9idWZcc3R1YnMNCi1tZCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxpbw0KLW1kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyDQotbWQgaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwDQotbWQgaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YQ0KLW1kIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHB5dGhvbg0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xhdG9taWNvcHMuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xhdG9taWNvcHMuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xhdG9taWNvcHNfaW50ZXJuYWxzX3g4Nl9tc3ZjLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcc3R1YnNcYXRvbWljb3BzX2ludGVybmFsc194ODZfbXN2Yy5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGNvbW1vbi5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXGNvbW1vbi5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHN0dWJzXG9uY2UuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzdHVic1xvbmNlLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcc3R1YnNccGxhdGZvcm1fbWFjcm9zLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcc3R1YnNccGxhdGZvcm1fbWFjcm9zLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvci5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3IuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yLnBiLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcZGVzY3JpcHRvci5wYi5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGRlc2NyaXB0b3JfZGF0YWJhc2UuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxkZXNjcmlwdG9yX2RhdGFiYXNlLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZHluYW1pY19tZXNzYWdlLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcZHluYW1pY19tZXNzYWdlLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcZXh0ZW5zaW9uX3NldC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGV4dGVuc2lvbl9zZXQuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfbWVzc2FnZV91dGlsLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcZ2VuZXJhdGVkX21lc3NhZ2VfdXRpbC5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGdlbmVyYXRlZF9tZXNzYWdlX3JlZmxlY3Rpb24uaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxnZW5lcmF0ZWRfbWVzc2FnZV9yZWZsZWN0aW9uLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcbWVzc2FnZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXG1lc3NhZ2UuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlX2xpdGUuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxtZXNzYWdlX2xpdGUuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1ZlxyZWZsZWN0aW9uX29wcy5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHJlZmxlY3Rpb25fb3BzLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZccmVwZWF0ZWRfZmllbGQuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxyZXBlYXRlZF9maWVsZC5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHNlcnZpY2UuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1ZlxzZXJ2aWNlLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcdGV4dF9mb3JtYXQuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlx0ZXh0X2Zvcm1hdC5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXHVua25vd25fZmllbGRfc2V0LmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcdW5rbm93bl9maWVsZF9zZXQuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHdpcmVfZm9ybWF0LmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcd2lyZV9mb3JtYXRfbGl0ZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHdpcmVfZm9ybWF0X2xpdGUuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlx3aXJlX2Zvcm1hdF9saXRlX2lubC5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXHdpcmVfZm9ybWF0X2xpdGVfaW5sLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cY29kZWRfc3RyZWFtLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cY29kZWRfc3RyZWFtLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cZ3ppcF9zdHJlYW0uaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxpb1xnemlwX3N0cmVhbS5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGlvXHByaW50ZXIuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxpb1xwcmludGVyLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cdG9rZW5pemVyLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcaW9cdG9rZW5pemVyLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcaW9cemVyb19jb3B5X3N0cmVhbS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW0uaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtX2ltcGwuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxpb1x6ZXJvX2NvcHlfc3RyZWFtX2ltcGxfbGl0ZS5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGlvXHplcm9fY29weV9zdHJlYW1faW1wbF9saXRlLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY29kZV9nZW5lcmF0b3IuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjb2RlX2dlbmVyYXRvci5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNvbW1hbmRfbGluZV9pbnRlcmZhY2UuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxjb21tYW5kX2xpbmVfaW50ZXJmYWNlLmgNCi1jb3B5IC4uXHNyY1xnb29nbGVccHJvdG9idWZcY29tcGlsZXJcaW1wb3J0ZXIuaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxpbXBvcnRlci5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBhcnNlci5oIGluY2x1ZGVcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHBhcnNlci5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXGNwcFxjcHBfZ2VuZXJhdG9yLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJcY3BwXGNwcF9nZW5lcmF0b3IuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxqYXZhXGphdmFfZ2VuZXJhdG9yLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJcamF2YVxqYXZhX2dlbmVyYXRvci5oDQotY29weSAuLlxzcmNcZ29vZ2xlXHByb3RvYnVmXGNvbXBpbGVyXHB5dGhvblxweXRob25fZ2VuZXJhdG9yLmggaW5jbHVkZVxnb29nbGVccHJvdG9idWZcY29tcGlsZXJccHl0aG9uXHB5dGhvbl9nZW5lcmF0b3IuaA0KLWNvcHkgLi5cc3JjXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxwbHVnaW4uaCBpbmNsdWRlXGdvb2dsZVxwcm90b2J1Zlxjb21waWxlclxwbHVnaW4uaA0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL3JlYWRtZS50eHQgYi9zcmMvdGhpcmRfcGFydHkvcHJvdG9idWYvdnNwcm9qZWN0cy9yZWFkbWUudHh0CmRlbGV0ZWQgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAyODgzNDVhLi4wMDAwMDAwCi0tLSBhL3NyYy90aGlyZF9wYXJ0eS9wcm90b2J1Zi92c3Byb2plY3RzL3JlYWRtZS50eHQKKysrIC9kZXYvbnVsbApAQCAtMSwxMTQgKzAsMCBAQAotVGhpcyBkaXJlY3RvcnkgY29udGFpbnMgcHJvamVjdCBmaWxlcyBmb3IgY29tcGlsaW5nIFByb3RvY29sIEJ1ZmZlcnMgdXNpbmcKLU1TVkMuICBUaGlzIGlzIG5vdCB0aGUgcmVjb21tZW5kZWQgd2F5IHRvIGRvIFByb3RvY29sIEJ1ZmZlciBkZXZlbG9wbWVudCAtLQotd2UgcHJlZmVyIHRvIGRldmVsb3AgdW5kZXIgYSBVbml4LWxpa2UgZW52aXJvbm1lbnQgLS0gYnV0IGl0IG1heSBiZSBtb3JlCi1hY2Nlc3NpYmxlIHRvIHRob3NlIHdobyBwcmltYXJpbHkgd29yayB3aXRoIE1TVkMuCi0KLUNvbXBpbGluZyBhbmQgSW5zdGFsbGluZwotPT09PT09PT09PT09PT09PT09PT09PT09Ci0KLTEpIE9wZW4gcHJvdG9idWYuc2xuIGluIE1pY3Jvc29mdCBWaXN1YWwgU3R1ZGlvLgotMikgQ2hvb3NlICJEZWJ1ZyIgb3IgIlJlbGVhc2UiIGNvbmZpZ3VyYXRpb24gYXMgZGVzaXJlZC4qCi0zKSBGcm9tIHRoZSBCdWlsZCBtZW51LCBjaG9vc2UgIkJ1aWxkIFNvbHV0aW9uIi4gIFdhaXQgZm9yIGNvbXBpbGluZyB0byBmaW5pc2guCi00KSBGcm9tIGEgY29tbWFuZCBzaGVsbCwgcnVuIHRlc3RzLmV4ZSBhbmQgbGl0ZS10ZXN0LmV4ZSBhbmQgY2hlY2sgdGhhdCBhbGwKLSAgIHRlc3RzIHBhc3MuCi01KSBSdW4gZXh0cmFjdF9pbmNsdWRlcy5iYXQgdG8gY29weSBhbGwgdGhlIHB1YmxpYyBoZWFkZXJzIGludG8gYSBzZXBhcmF0ZQotICAgImluY2x1ZGUiIGRpcmVjdG9yeSAodW5kZXIgdGhlIHRvcC1sZXZlbCBwYWNrYWdlIGRpcmVjdG9yeSkuCi02KSBDb3B5IHRoZSBjb250ZW50cyBvZiB0aGUgaW5jbHVkZSBkaXJlY3RvcnkgdG8gd2hlcmV2ZXIgeW91IHdhbnQgdG8gcHV0Ci0gICBoZWFkZXJzLgotNykgQ29weSBwcm90b2MuZXhlIHdoZXJldmVyIHlvdSBwdXQgYnVpbGQgdG9vbHMgKHByb2JhYmx5IHNvbWV3aGVyZSBpbiB5b3VyCi0gICBQQVRIKS4KLTgpIENvcHkgbGlicHJvdG9idWYubGliLCBsaWJwcm90b2J1Zi1saXRlLmxpYiwgYW5kIGxpYnByb3RvYy5saWIgd2hlcmV2ZXIgeW91Ci0gICBwdXQgbGlicmFyaWVzLgotCi0qIFRvIGF2b2lkIGNvbmZsaWN0cyBiZXR3ZWVuIHRoZSBNU1ZDIGRlYnVnIGFuZCByZWxlYXNlIHJ1bnRpbWUgbGlicmFyaWVzLCB3aGVuCi0gIGNvbXBpbGluZyBhIGRlYnVnIGJ1aWxkIG9mIHlvdXIgYXBwbGljYXRpb24sIHlvdSBtYXkgbmVlZCB0byBsaW5rIGFnYWluc3QgYQotICBkZWJ1ZyBidWlsZCBvZiBsaWJwcm90b2J1Zi5saWIuICBTaW1pbGFybHksIHJlbGVhc2UgYnVpbGRzIHNob3VsZCBsaW5rIGFnYWluc3QKLSAgcmVsZWFzZSBsaWJzLgotCi1ETExzIHZzLiBzdGF0aWMgbGlua2luZwotPT09PT09PT09PT09PT09PT09PT09PT0KLQotU3RhdGljIGxpbmtpbmcgaXMgbm93IHRoZSBkZWZhdWx0IGZvciB0aGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcmllcy4gIER1ZSB0bwotaXNzdWVzIHdpdGggV2luMzIncyB1c2Ugb2YgYSBzZXBhcmF0ZSBoZWFwIGZvciBlYWNoIERMTCwgYXMgd2VsbCBhcyBiaW5hcnkKLWNvbXBhdGliaWxpdHkgaXNzdWVzIGJldHdlZW4gZGlmZmVyZW50IHZlcnNpb25zIG9mIE1TVkMncyBTVEwgbGlicmFyeSwgaXQgaXMKLXJlY29tbWVuZGVkIHRoYXQgeW91IHVzZSBzdGF0aWMgbGlua2FnZSBvbmx5LiAgSG93ZXZlciwgaXQgaXMgcG9zc2libGUgdG8KLWJ1aWxkIGxpYnByb3RvYnVmIGFuZCBsaWJwcm90b2MgYXMgRExMcyBpZiB5b3UgcmVhbGx5IHdhbnQuICBUbyBkbyB0aGlzLAotZG8gdGhlIGZvbGxvd2luZzoKLQotICAxKSBPcGVuIHByb3RvYnVmLnNsbiBpbiBNU1ZDLgotICAyKSBGb3IgZWFjaCBvZiB0aGUgcHJvamVjdHMgbGlicHJvdG9idWYsIGxpYnByb3RvYnVmLWxpdGUsIGFuZCBsaWJwcm90b2MsIGRvCi0gICAgIHRoZSBmb2xsb3dpbmc6Ci0gICAgMmEpIFJpZ2h0LWNsaWNrIHRoZSBwcm9qZWN0IGFuZCBjaG9vc2UgInByb3BlcnRpZXMiLgotICAgIDJiKSBGcm9tIHRoZSBzaWRlIGJhciwgY2hvb3NlICJHZW5lcmFsIiwgdW5kZXIgIkNvbmZpZ3VyYXRpb24gUHJvcGVydGllcyIuCi0gICAgMmMpIENoYW5nZSB0aGUgIkNvbmZpZ3VyYXRpb24gVHlwZSIgdG8gIkR5bmFtaWMgTGlicmFyeSAoLmRsbCkiLgotICAgIDJkKSBGcm9tIHRoZSBzaWRlIGJhciwgY2hvb3NlICJQcmVwcm9jZXNzb3IiLCB1bmRlciAiQy9DKysiLgotICAgIDJlKSBBZGQgUFJPVE9CVUZfVVNFX0RMTFMgdG8gdGhlIGxpc3Qgb2YgcHJlcHJvY2Vzc29yIGRlZmluZXMuCi0gIDMpIFdoZW4gY29tcGlsaW5nIHlvdXIgcHJvamVjdCwgbWFrZSBzdXJlIHRvICNkZWZpbmUgUFJPVE9CVUZfVVNFX0RMTFMuCi0KLVdoZW4gZGlzdHJpYnV0aW5nIHlvdXIgc29mdHdhcmUgdG8gZW5kIHVzZXJzLCB3ZSBzdHJvbmdseSByZWNvbW1lbmQgdGhhdCB5b3UKLWRvIE5PVCBpbnN0YWxsIGxpYnByb3RvYnVmLmRsbCBvciBsaWJwcm90b2MuZGxsIHRvIGFueSBzaGFyZWQgbG9jYXRpb24uCi1JbnN0ZWFkLCBrZWVwIHRoZXNlIGxpYnJhcmllcyBuZXh0IHRvIHlvdXIgYmluYXJpZXMsIGluIHlvdXIgYXBwbGljYXRpb24ncwotb3duIGluc3RhbGwgZGlyZWN0b3J5LiAgQysrIG1ha2VzIGl0IHZlcnkgZGlmZmljdWx0IHRvIG1haW50YWluIGJpbmFyeQotY29tcGF0aWJpbGl0eSBiZXR3ZWVuIHJlbGVhc2VzLCBzbyBpdCBpcyBsaWtlbHkgdGhhdCBmdXR1cmUgdmVyc2lvbnMgb2YgdGhlc2UKLWxpYnJhcmllcyB3aWxsICpub3QqIGJlIHVzYWJsZSBhcyBkcm9wLWluIHJlcGxhY2VtZW50cy4KLQotSWYgeW91ciBwcm9qZWN0IGlzIGl0c2VsZiBhIERMTCBpbnRlbmRlZCBmb3IgdXNlIGJ5IHRoaXJkLXBhcnR5IHNvZnR3YXJlLCB3ZQotcmVjb21tZW5kIHRoYXQgeW91IGRvIE5PVCBleHBvc2UgcHJvdG9jb2wgYnVmZmVyIG9iamVjdHMgaW4geW91ciBsaWJyYXJ5J3MKLXB1YmxpYyBpbnRlcmZhY2UsIGFuZCB0aGF0IHlvdSBzdGF0aWNhbGx5IGxpbmsgcHJvdG9jb2wgYnVmZmVycyBpbnRvIHlvdXIKLWxpYnJhcnkuCi0KLVpMaWIgc3VwcG9ydAotPT09PT09PT09PT09Ci0KLUlmIHlvdSB3YW50IHRvIGluY2x1ZGUgR3ppcElucHV0U3RyZWFtIGFuZCBHemlwT3V0cHV0U3RyZWFtCi0oZ29vZ2xlL3Byb3RvYnVmL2lvL2d6aXBfc3RyZWFtLmgpIGluIGxpYnByb3RvYywgeW91IHdpbGwgbmVlZCB0byBkbyBhIGZldwotYWRkaXRpb25hbCBzdGVwczoKLQotMSkgT2J0YWluIGEgY29weSBvZiB0aGUgemxpYiBsaWJyYXJ5LiAgVGhlIHByZS1jb21waWxlZCBETEwgYXQgemxpYi5uZXQgd29ya3MuCi0yKSBNYWtlIHN1cmUgemxpYidzIHR3byBoZWFkZXJzIGFyZSBpbiB5b3VyIGluY2x1ZGUgcGF0aCBhbmQgdGhhdCB0aGUgLmxpYiBmaWxlCi0gICBpcyBpbiB5b3VyIGxpYnJhcnkgcGF0aC4gIFlvdSBjb3VsZCBwbGFjZSBhbGwgdGhyZWUgZmlsZXMgZGlyZWN0bHkgaW50byB0aGUKLSAgIHZzcHJvamVjdCBkaXJlY3RvcnkgdG8gY29tcGlsZSBsaWJwcm90b2J1ZiwgYnV0IHRoZXkgbmVlZCB0byBiZSB2aXNpYmxlIHRvCi0gICB5b3VyIG93biBwcm9qZWN0IGFzIHdlbGwsIHNvIHlvdSBzaG91bGQgcHJvYmFibHkganVzdCBwdXQgdGhlbSBpbnRvIHRoZQotICAgVkMgc2hhcmVkIGljbmx1ZGUgYW5kIGxpYnJhcnkgZGlyZWN0b3JpZXMuCi0zKSBSaWdodC1jbGljayBvbiB0aGUgInRlc3RzIiBwcm9qZWN0IGFuZCBjaG9vc2UgInByb3BlcnRpZXMiLiAgTmF2aWdhdGUgdGhlCi0gICBzaWRlYmFyIHRvICJDb25maWd1cmF0aW9uIFByb3BlcnRpZXMiIC0+ICJMaW5rZXIiIC0+ICJJbnB1dCIuCi00KSBVbmRlciAiQWRkaXRpb25hbCBEZXBlbmRlbmNpZXMiLCBhZGQgdGhlIG5hbWUgb2YgdGhlIHpsaWIgLmxpYiBmaWxlIChlLmcuCi0gICB6ZGxsLmxpYikuICBNYWtlIHN1cmUgdG8gdXBkYXRlIGJvdGggdGhlIERlYnVnIGFuZCBSZWxlYXNlIGNvbmZpZ3VyYXRpb25zLgotNSkgSWYgeW91IGFyZSBjb21waWxpbmcgbGlicHJvdG9idWYgYW5kIGxpYnByb3RvYyBhcyBETExzIChzZWUgcHJldmlvdXMKLSAgIHNlY3Rpb24pLCByZXBlYXQgc3RlcHMgMiBhbmQgMyBmb3IgdGhlIGxpYnByb3RvYnVmIGFuZCBsaWJwcm90b2MgcHJvamVjdHMuCi0gICBJZiB5b3UgYXJlIGNvbXBpbGluZyB0aGVtIGFzIHN0YXRpYyBsaWJyYXJpZXMsIHRoZW4geW91IHdpbGwgbmVlZCB0byBsaW5rCi0gICBhZ2FpbnN0IHRoZSB6bGliIGxpYnJhcnkgZGlyZWN0bHkgZnJvbSB5b3VyIG93biBhcHAuCi02KSBFZGl0IGNvbmZpZy5oIChpbiB0aGUgdnNwcm9qZWN0cyBkaXJlY3RvcnkpIGFuZCB1bi1jb21tZW50IHRoZSBsaW5lIHRoYXQKLSAgICNkZWZpbmVzIEhBVkVfWkxJQi4gIChPciwgYWx0ZXJuYXRpdmVseSwgZGVmaW5lIHRoaXMgbWFjcm8gdmlhIHRoZSBwcm9qZWN0Ci0gICBzZXR0aW5ncy4pCi0KLU5vdGVzIG9uIENvbXBpbGVyIFdhcm5pbmdzCi09PT09PT09PT09PT09PT09PT09PT09PT09PQotCi1UaGUgZm9sbG93aW5nIHdhcm5pbmdzIGhhdmUgYmVlbiBkaXNhYmxlZCB3aGlsZSBidWlsZGluZyB0aGUgcHJvdG9idWYgbGlicmFyaWVzCi1hbmQgY29tcGlsZXIuICBZb3UgbWF5IGhhdmUgdG8gZGlzYWJsZSBzb21lIG9mIHRoZW0gaW4geW91ciBvd24gcHJvamVjdCBhcwotd2VsbCwgb3IgbGl2ZSB3aXRoIHRoZW0uCi0KLUM0MDE4IC0gJ2V4cHJlc3Npb24nIDogc2lnbmVkL3Vuc2lnbmVkIG1pc21hdGNoCi1DNDE0NiAtIHVuYXJ5IG1pbnVzIG9wZXJhdG9yIGFwcGxpZWQgdG8gdW5zaWduZWQgdHlwZSwgcmVzdWx0IHN0aWxsIHVuc2lnbmVkCi1DNDI0NCAtIENvbnZlcnNpb24gZnJvbSAndHlwZTEnIHRvICd0eXBlMicsIHBvc3NpYmxlIGxvc3Mgb2YgZGF0YS4KLUM0MjUxIC0gJ2lkZW50aWZpZXInIDogY2xhc3MgJ3R5cGUnIG5lZWRzIHRvIGhhdmUgZGxsLWludGVyZmFjZSB0byBiZSB1c2VkIGJ5Ci0gICAgICAgIGNsaWVudHMgb2YgY2xhc3MgJ3R5cGUyJwotQzQyNjcgLSBDb252ZXJzaW9uIGZyb20gJ3NpemVfdCcgdG8gJ3R5cGUnLCBwb3NzaWJsZSBsb3NzIG9mIGRhdGEuCi1DNDMwNSAtICdpZGVudGlmaWVyJyA6IHRydW5jYXRpb24gZnJvbSAndHlwZTEnIHRvICd0eXBlMicKLUM0MzU1IC0gJ3RoaXMnIDogdXNlZCBpbiBiYXNlIG1lbWJlciBpbml0aWFsaXplciBsaXN0Ci1DNDgwMCAtICd0eXBlJyA6IGZvcmNpbmcgdmFsdWUgdG8gYm9vbCAndHJ1ZScgb3IgJ2ZhbHNlJyAocGVyZm9ybWFuY2Ugd2FybmluZykKLUM0OTk2IC0gJ2Z1bmN0aW9uJzogd2FzIGRlY2xhcmVkIGRlcHJlY2F0ZWQKLQotQzQyNTEgaXMgb2YgcGFydGljdWxhciBub3RlLCBpZiB5b3UgYXJlIGNvbXBpbGluZyB0aGUgUHJvdG9jb2wgQnVmZmVyIGxpYnJhcnkKLWFzIGEgRExMIChzZWUgcHJldmlvdXMgc2VjdGlvbikuICBUaGUgcHJvdG9jb2wgYnVmZmVyIGxpYnJhcnkgdXNlcyB0ZW1wbGF0ZXMgaW4KLWl0cyBwdWJsaWMgaW50ZXJmYWNlcy4gIE1TVkMgZG9lcyBub3QgcHJvdmlkZSBhbnkgcmVhc29uYWJsZSB3YXkgdG8gZXhwb3J0Ci10ZW1wbGF0ZSBjbGFzc2VzIGZyb20gYSBETEwuICBIb3dldmVyLCBpbiBwcmFjdGljZSwgaXQgYXBwZWFycyB0aGF0IGV4cG9ydGluZwotdGVtcGxhdGVzIGlzIG5vdCBuZWNlc3NhcnkgYW55d2F5LiAgU2luY2UgdGhlIGNvbXBsZXRlIGRlZmluaXRpb24gb2YgYW55Ci10ZW1wbGF0ZSBpcyBhdmFpbGFibGUgaW4gdGhlIGhlYWRlciBmaWxlcywgYW55b25lIGltcG9ydGluZyB0aGUgRExMIHdpbGwganVzdAotZW5kIHVwIGNvbXBpbGluZyBpbnN0YW5jZXMgb2YgdGhlIHRlbXBsYXRlcyBpbnRvIHRoZWlyIG93biBiaW5hcnkuICBUaGUKLVByb3RvY29sIEJ1ZmZlciBpbXBsZW1lbnRhdGlvbiBkb2VzIG5vdCByZWx5IG9uIHN0YXRpYyB0ZW1wbGF0ZSBtZW1iZXJzIGJlaW5nCi11bmlxdWUsIHNvIHRoZXJlIHNob3VsZCBiZSBubyBwcm9ibGVtIHdpdGggdGhpcywgYnV0IE1TVkMgcHJpbnRzIHdhcm5pbmcKLW5ldmVydGhlbGVzcy4gIFNvLCB3ZSBkaXNhYmxlIGl0LiAgVW5mb3J0dW5hdGVseSwgdGhpcyB3YXJuaW5nIHdpbGwgYWxzbyBiZQotcHJvZHVjZWQgd2hlbiBjb21waWxpbmcgY29kZSB3aGljaCBtZXJlbHkgdXNlcyBwcm90b2NvbCBidWZmZXJzLCBtZWFuaW5nIHlvdQotbWF5IGhhdmUgdG8gZGlzYWJsZSBpdCBpbiB5b3VyIGNvZGUgdG9vLgpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvZ3lwL2NvbW1vbl92YXJpYWJsZXMuZ3lwaSBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL2d5cC9jb21tb25fdmFyaWFibGVzLmd5cGkKaW5kZXggMDYyMmZiMy4uM2JmOTE3MiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvZ3lwL2NvbW1vbl92YXJpYWJsZXMuZ3lwaQorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9neXAvY29tbW9uX3ZhcmlhYmxlcy5neXBpCkBAIC00Nyw5ICs0Nyw5IEBACiAgICAgICAgICdza2lhX29zJSc6ICc8KE9TKScsCiAKICAgICAgICAgJ3NraWFfYW5kcm9pZF9mcmFtZXdvcmslJzogMCwKLSAgICAgICAgJ3NraWFfYXJjaF90eXBlJSc6ICd4ODYnLAotICAgICAgICAnYXJtX3ZlcnNpb24lJzogMCwKLSAgICAgICAgJ2FybV9uZW9uJSc6IDAsCisgICAgICAgICdza2lhX2FyY2hfdHlwZSUnOiAnPCh0YXJnZXRfYXJjaCknLAorICAgICAgICAnYXJtX3ZlcnNpb24lJzogJzwoYXJtX3ZlcnNpb24pJywKKyAgICAgICAgJ2FybV9uZW9uJSc6ICc8KGFybV9uZW9uKScsCiAgICAgICB9LAogCiAgICAgICAjIFJlLWRlZmluZSBhbGwgdmFyaWFibGVzIGRlZmluZWQgd2l0aGluIHRoZSBsZXZlbC0zICd2YXJpYWJsZXMnIGRpY3QsCkBAIC03MCw3ICs3MCw3IEBACiAgICAgICAgICAgJ3NraWFfY2hyb21lX3V0aWxzJSc6IDEsCiAgICAgICAgICAgJ3NraWFfdXNlX3N5c3RlbV9qc29uJSc6IDAsCiAgICAgICAgIH1dLAotICAgICAgICBbICdza2lhX29zID09ICJ3aW4iJywgeworICAgICAgICBbICdza2lhX29zIGluIFsic3RhcmJvYXJkIiwgIndpbiJdJywgewogICAgICAgICAgICdvc19wb3NpeCUnOiAwLAogICAgICAgICB9LCB7CiAgICAgICAgICAgJ29zX3Bvc2l4JSc6IDEsCkBAIC0yMzUsNyArMjM1LDcgQEAKICAgICAnc2tpYV9ydW5fcGRmdmlld2VyX2luX2dtJSc6IDAsCiAgICAgJ3NraWFfZGlzYWJsZV9pbmxpbmluZyUnOiAwLAogICAgICdza2lhX21vejJkJSc6IDAsCi0gICAgJ3NraWFfaXNfYm90JSc6ICc8IShweXRob24gLWMgImltcG9ydCBvczsgcHJpbnQgb3MuZW52aXJvbi5nZXQoXCdDSFJPTUVfSEVBRExFU1NcJywgMCkiKScsCisgICAgJ3NraWFfaXNfYm90JSc6ICcwJywKIAogICAgICMgVGhlc2UgYXJlIHJlZmVyZW5jZWQgYnkgb3VyIC5neXBpIGZpbGVzIHRoYXQgbGlzdCBmaWxlcyAoZS5nLiBjb3JlLmd5cGkpCiAgICAgIwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrVHlwZWZhY2UuaCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvY29yZS9Ta1R5cGVmYWNlLmgKaW5kZXggYTA4MGQ4NC4uZTRhMzA3NiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9jb3JlL1NrVHlwZWZhY2UuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL2NvcmUvU2tUeXBlZmFjZS5oCkBAIC0xOCw2ICsxOCw3IEBACiBjbGFzcyBTa1NjYWxlckNvbnRleHQ7CiBzdHJ1Y3QgU2tTY2FsZXJDb250ZXh0UmVjOwogY2xhc3MgU2tTdHJlYW07CitjbGFzcyBTa1N0cmVhbUFzc2V0OwogY2xhc3MgU2tBZHZhbmNlZFR5cGVmYWNlTWV0cmljczsKIGNsYXNzIFNrV1N0cmVhbTsKIApAQCAtMTIwLDcgKzEyMSw3IEBACiAgICAgICAgIG5vdCBhIHZhbGlkIGZvbnQgZmlsZSwgcmV0dXJucyBudWxsLiBPd25lcnNoaXAgb2YgdGhlIHN0cmVhbSBpcwogICAgICAgICB0cmFuc2ZlcnJlZCwgc28gdGhlIGNhbGxlciBtdXN0IG5vdCByZWZlcmVuY2UgaXQgYWdhaW4uCiAgICAgKi8KLSAgICBzdGF0aWMgU2tUeXBlZmFjZSogQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbSogc3RyZWFtLCBpbnQgaW5kZXggPSAwKTsKKyAgICBzdGF0aWMgU2tUeXBlZmFjZSogQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbUFzc2V0KiBzdHJlYW0sIGludCBpbmRleCA9IDApOwogCiAgICAgLyoqIFdyaXRlIGEgdW5pcXVlIHNpZ25hdHVyZSB0byBhIHN0cmVhbSwgc3VmZmljaWVudCB0byByZWNvbnN0cnVjdCBhCiAgICAgICAgIHR5cGVmYWNlIHJlZmVyZW5jaW5nIHRoZSBzYW1lIGZvbnQgd2hlbiBEZXNlcmlhbGl6ZSBpcyBjYWxsZWQuCkBAIC0yNjMsNyArMjY0LDcgQEAKICAgICAgKiAgb2YgdGhpcyB0eXBlZmFjZSB3aXRoaW4gdGhlIHN0cmVhbSwgb3IgMCBpZiB0aGUgc3RyZWFtIGlzIG5vdCBhCiAgICAgICogIGNvbGxlY3Rpb24uCiAgICAgICovCi0gICAgU2tTdHJlYW0qIG9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3Q7CisgICAgU2tTdHJlYW1Bc3NldCogb3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdDsKIAogICAgIC8qKgogICAgICAqICBSZXR1cm4gYSBzY2FsZXJjb250ZXh0IGZvciB0aGUgZ2l2ZW4gZGVzY3JpcHRvci4gSWYgdGhpcyBmYWlscywgdGhlbgpAQCAtMzAxLDcgKzMwMiw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogZ2x5cGhJRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnbHlwaElEc0NvdW50KSBjb25zdCA9IDA7CiAKLSAgICB2aXJ0dWFsIFNrU3RyZWFtKiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgU2tTdHJlYW1Bc3NldCogb25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIHZvaWQgb25HZXRGb250RGVzY3JpcHRvcihTa0ZvbnREZXNjcmlwdG9yKiwgYm9vbCogaXNMb2NhbCkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBpbnQgb25DaGFyc1RvR2x5cGhzKGNvbnN0IHZvaWQqIGNoYXJzLCBFbmNvZGluZywgdWludDE2X3QgZ2x5cGhzW10sCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL3BvcnRzL1NrRm9udENvbmZpZ0ludGVyZmFjZS5oIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9wb3J0cy9Ta0ZvbnRDb25maWdJbnRlcmZhY2UuaAppbmRleCBjNTk2MjY3Li41MmI5OTI0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL3BvcnRzL1NrRm9udENvbmZpZ0ludGVyZmFjZS5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvcG9ydHMvU2tGb250Q29uZmlnSW50ZXJmYWNlLmgKQEAgLTkyLDcgKzkyLDcgQEAKICAgICAgKiAgaWYgdGhlIEZvbnRSZWYncyBkYXRhIGlzIG5vdCBhdmFpbGFibGUuIFRoZSBjYWxsZXIgaXMgcmVzcG9uc2libGUgZm9yCiAgICAgICogIGNhbGxpbmcgc3RyZWFtLT51bnJlZigpIHdoZW4gaXQgaXMgZG9uZSBhY2Nlc3NpbmcgdGhlIGRhdGEuCiAgICAgICovCi0gICAgdmlydHVhbCBTa1N0cmVhbSogb3BlblN0cmVhbShjb25zdCBGb250SWRlbnRpdHkmKSA9IDA7CisgICAgdmlydHVhbCBTa1N0cmVhbUFzc2V0KiBvcGVuU3RyZWFtKGNvbnN0IEZvbnRJZGVudGl0eSYpID0gMDsKIAogICAgIC8qKgogICAgICAqICBSZXR1cm4gYSBzaW5nbGV0b24gaW5zdGFuY2Ugb2YgYSBkaXJlY3Qgc3ViY2xhc3MgdGhhdCBjYWxscyBpbnRvCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL3BvcnRzL1NrRm9udE1nci5oIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9wb3J0cy9Ta0ZvbnRNZ3IuaAppbmRleCAwZmZjYzI3Li4xYWNlYTMwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL3BvcnRzL1NrRm9udE1nci5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvcG9ydHMvU2tGb250TWdyLmgKQEAgLTEyLDcgKzEyLDcgQEAKICNpbmNsdWRlICJTa0ZvbnRTdHlsZS5oIgogCiBjbGFzcyBTa0RhdGE7Ci1jbGFzcyBTa1N0cmVhbTsKK2NsYXNzIFNrU3RyZWFtQXNzZXQ7CiBjbGFzcyBTa1N0cmluZzsKIGNsYXNzIFNrVHlwZWZhY2U7CiAKQEAgLTk3LDcgKzk3LDcgQEAKICAgICAgKiAgKHBhc3MgMCBmb3Igbm9uZSkgb3IgTlVMTCBpZiB0aGUgc3RyZWFtIGlzIG5vdCByZWNvZ25pemVkLiBUaGUgY2FsbGVyCiAgICAgICogIG11c3QgY2FsbCB1bnJlZigpIG9uIHRoZSByZXR1cm5lZCBvYmplY3QgaWYgaXQgaXMgbm90IG51bGwuCiAgICAgICovCi0gICAgU2tUeXBlZmFjZSogY3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbSosIGludCB0dGNJbmRleCA9IDApIGNvbnN0OworICAgIFNrVHlwZWZhY2UqIGNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW1Bc3NldCosIGludCB0dGNJbmRleCA9IDApIGNvbnN0OwogCiAgICAgLyoqCiAgICAgICogIENyZWF0ZSBhIHR5cGVmYWNlIGZvciB0aGUgc3BlY2lmaWVkIGZpbGVOYW1lIGFuZCBUVEMgaW5kZXgKQEAgLTE0MCw3ICsxNDAsNyBAQAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBTa0ZvbnRTdHlsZSYpIGNvbnN0ID0gMDsKIAogICAgIHZpcnR1YWwgU2tUeXBlZmFjZSogb25DcmVhdGVGcm9tRGF0YShTa0RhdGEqLCBpbnQgdHRjSW5kZXgpIGNvbnN0ID0gMDsKLSAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbSosIGludCB0dGNJbmRleCkgY29uc3QgPSAwOworICAgIHZpcnR1YWwgU2tUeXBlZmFjZSogb25DcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtQXNzZXQqLCBpbnQgdHRjSW5kZXgpIGNvbnN0ID0gMDsKICAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbUZpbGUoY29uc3QgY2hhciBwYXRoW10sIGludCB0dGNJbmRleCkgY29uc3QgPSAwOwogCiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkxlZ2FjeUNyZWF0ZVR5cGVmYWNlKGNvbnN0IGNoYXIgZmFtaWx5TmFtZVtdLApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9wb3J0cy9Ta0ZvbnRNZ3JfaW5kaXJlY3QuaCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL2luY2x1ZGUvcG9ydHMvU2tGb250TWdyX2luZGlyZWN0LmgKaW5kZXggOTVhMjM1NS4uOGQ3OTdkNSAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvaW5jbHVkZS9wb3J0cy9Ta0ZvbnRNZ3JfaW5kaXJlY3QuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9pbmNsdWRlL3BvcnRzL1NrRm9udE1ncl9pbmRpcmVjdC5oCkBAIC01NSw3ICs1NSw3IEBACiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbk1hdGNoRmFjZVN0eWxlKGNvbnN0IFNrVHlwZWZhY2UqIGZhbWlseU1lbWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tGb250U3R5bGUmIGZvbnRTdHlsZSkgY29uc3QgU0tfT1ZFUlJJREU7CiAKLSAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbSogc3RyZWFtLCBpbnQgdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFOworICAgIHZpcnR1YWwgU2tUeXBlZmFjZSogb25DcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtQXNzZXQqIHN0cmVhbSwgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERTsKICAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbUZpbGUoY29uc3QgY2hhciBwYXRoW10sIGludCB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21EYXRhKFNrRGF0YSogZGF0YSwgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERTsKIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tGb250RGVzY3JpcHRvci5oIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tGb250RGVzY3JpcHRvci5oCmluZGV4IDVhNmRkZDUuLjZkMTVlYTcgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9jb3JlL1NrRm9udERlc2NyaXB0b3IuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta0ZvbnREZXNjcmlwdG9yLmgKQEAgLTI4LDcgKzI4LDcgQEAKICAgICBjb25zdCBjaGFyKiBnZXRGdWxsTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZGdWxsTmFtZS5jX3N0cigpOyB9CiAgICAgY29uc3QgY2hhciogZ2V0UG9zdHNjcmlwdE5hbWUoKSBjb25zdCB7IHJldHVybiBmUG9zdHNjcmlwdE5hbWUuY19zdHIoKTsgfQogICAgIGNvbnN0IGNoYXIqIGdldEZvbnRGaWxlTmFtZSgpIGNvbnN0IHsgcmV0dXJuIGZGb250RmlsZU5hbWUuY19zdHIoKTsgfQotICAgIFNrU3RyZWFtKiBnZXRGb250RGF0YSgpIGNvbnN0IHsgcmV0dXJuIGZGb250RGF0YTsgfQorICAgIFNrU3RyZWFtQXNzZXQqIGdldEZvbnREYXRhKCkgY29uc3QgeyByZXR1cm4gZkZvbnREYXRhOyB9CiAgICAgaW50IGdldEZvbnRJbmRleCgpIGNvbnN0IHsgcmV0dXJuIGZGb250SW5kZXg7IH0KIAogICAgIHZvaWQgc2V0RmFtaWx5TmFtZShjb25zdCBjaGFyKiBuYW1lKSB7IGZGYW1pbHlOYW1lLnNldChuYW1lKTsgfQpAQCAtMzgsNyArMzgsNyBAQAogICAgIC8qKiBTZXQgdGhlIGZvbnQgZGF0YSBvbmx5IGlmIGl0IGlzIG5lY2Vzc2FyeSBmb3Igc2VyaWFsaXphdGlvbi4KICAgICAgKiAgVGhpcyBtZXRob2QgdGFrZXMgb3duZXJzaGlwIG9mIHRoZSBzdHJlYW0gKGJvdGggcmVmZXJlbmNlIGFuZCBjdXJzb3IpLgogICAgICAqLwotICAgIHZvaWQgc2V0Rm9udERhdGEoU2tTdHJlYW0qIHN0cmVhbSkgeyBmRm9udERhdGEucmVzZXQoc3RyZWFtKTsgfQorICAgIHZvaWQgc2V0Rm9udERhdGEoU2tTdHJlYW1Bc3NldCogc3RyZWFtKSB7IGZGb250RGF0YS5yZXNldChzdHJlYW0pOyB9CiAgICAgdm9pZCBzZXRGb250SW5kZXgoaW50IGluZGV4KSB7IGZGb250SW5kZXggPSBpbmRleDsgfQogCiBwcml2YXRlOgpAQCAtNDYsNyArNDYsNyBAQAogICAgIFNrU3RyaW5nIGZGdWxsTmFtZTsKICAgICBTa1N0cmluZyBmUG9zdHNjcmlwdE5hbWU7CiAgICAgU2tTdHJpbmcgZkZvbnRGaWxlTmFtZTsKLSAgICBTa0F1dG9UVW5yZWY8U2tTdHJlYW0+IGZGb250RGF0YTsKKyAgICBTa0F1dG9UVW5yZWY8U2tTdHJlYW1Bc3NldD4gZkZvbnREYXRhOwogICAgIGludCBmRm9udEluZGV4OwogCiAgICAgU2tUeXBlZmFjZTo6U3R5bGUgZlN0eWxlOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tGb250SG9zdC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta0ZvbnRIb3N0LmNwcAppbmRleCBlZjVkNDFmLi4xNTVlN2ExIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta0ZvbnRIb3N0LmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvY29yZS9Ta0ZvbnRIb3N0LmNwcApAQCAtMTMxLDcgKzEzMSw3IEBACiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21EYXRhKFNrRGF0YSosIGludCkgY29uc3QgU0tfT1ZFUlJJREUgewogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9Ci0gICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW0qLCBpbnQpIGNvbnN0IFNLX09WRVJSSURFIHsKKyAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbUFzc2V0KiwgaW50KSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KICAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbUZpbGUoY29uc3QgY2hhcltdLCBpbnQpIGNvbnN0IFNLX09WRVJSSURFIHsKQEAgLTE5NSw3ICsxOTUsNyBAQAogICAgIHJldHVybiB0aGlzLT5vbkNyZWF0ZUZyb21EYXRhKGRhdGEsIHR0Y0luZGV4KTsKIH0KIAotU2tUeXBlZmFjZSogU2tGb250TWdyOjpjcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtKiBzdHJlYW0sIGludCB0dGNJbmRleCkgY29uc3QgeworU2tUeXBlZmFjZSogU2tGb250TWdyOjpjcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtQXNzZXQqIHN0cmVhbSwgaW50IHR0Y0luZGV4KSBjb25zdCB7CiAgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9jb3JlL1NrVHlwZWZhY2UuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tUeXBlZmFjZS5jcHAKaW5kZXggZjk0ODc4Ny4uNDA3NzVlMiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tUeXBlZmFjZS5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2NvcmUvU2tUeXBlZmFjZS5jcHAKQEAgLTQ1LDcgKzQ1LDcgQEAKIHByb3RlY3RlZDoKICAgICBTa0VtcHR5VHlwZWZhY2UoKSA6IFNrVHlwZWZhY2UoU2tUeXBlZmFjZTo6a05vcm1hbCwgMCwgdHJ1ZSkgeyB9CiAKLSAgICB2aXJ0dWFsIFNrU3RyZWFtKiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgeyByZXR1cm4gTlVMTDsgfQorICAgIFNrU3RyZWFtQXNzZXQqIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7IHJldHVybiBOVUxMOyB9CiAgICAgdmlydHVhbCBTa1NjYWxlckNvbnRleHQqIG9uQ3JlYXRlU2NhbGVyQ29udGV4dChjb25zdCBTa0Rlc2NyaXB0b3IqKSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KQEAgLTE1Miw3ICsxNTIsNyBAQAogICAgIHJldHVybiBmbS0+bWF0Y2hGYWNlU3R5bGUoZmFtaWx5LCBuZXdTdHlsZSk7CiB9CiAKLVNrVHlwZWZhY2UqIFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwgaW50IGluZGV4KSB7CitTa1R5cGVmYWNlKiBTa1R5cGVmYWNlOjpDcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtQXNzZXQqIHN0cmVhbSwgaW50IGluZGV4KSB7CiAgICAgU2tBdXRvVFVucmVmPFNrRm9udE1ncj4gZm0oU2tGb250TWdyOjpSZWZEZWZhdWx0KCkpOwogICAgIHJldHVybiBmbS0+Y3JlYXRlRnJvbVN0cmVhbShzdHJlYW0sIGluZGV4KTsKIH0KQEAgLTE4MCw3ICsxODAsNyBAQAogCiBTa1R5cGVmYWNlKiBTa1R5cGVmYWNlOjpEZXNlcmlhbGl6ZShTa1N0cmVhbSogc3RyZWFtKSB7CiAgICAgU2tGb250RGVzY3JpcHRvciBkZXNjKHN0cmVhbSk7Ci0gICAgU2tTdHJlYW0qIGRhdGEgPSBkZXNjLmdldEZvbnREYXRhKCk7CisgICAgU2tTdHJlYW1Bc3NldCogZGF0YSA9IGRlc2MuZ2V0Rm9udERhdGEoKTsKICAgICBpZiAoZGF0YSkgewogICAgICAgICBTa1R5cGVmYWNlKiB0eXBlZmFjZSA9IFNrVHlwZWZhY2U6OkNyZWF0ZUZyb21TdHJlYW0oZGF0YSwgZGVzYy5nZXRGb250SW5kZXgoKSk7CiAgICAgICAgIGlmICh0eXBlZmFjZSkgewpAQCAtMjA5LDcgKzIwOSw3IEBACiAgICAgcmV0dXJuIHRoaXMtPm9uR2V0VGFibGVEYXRhKHRhZywgb2Zmc2V0LCBsZW5ndGgsIGRhdGEpOwogfQogCi1Ta1N0cmVhbSogU2tUeXBlZmFjZTo6b3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCB7CitTa1N0cmVhbUFzc2V0KiBTa1R5cGVmYWNlOjpvcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IHsKICAgICBpbnQgdHRjSW5kZXhTdG9yYWdlOwogICAgIGlmIChOVUxMID09IHR0Y0luZGV4KSB7CiAgICAgICAgIC8vIFNvIG91ciBzdWJjbGFzc2VzIGRvbid0IG5lZWQgdG8gY2hlY2sgZm9yIG51bGwgcGFyYW0KZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0ZvbnRNZ3JfZm9udGNvbmZpZy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvZm9udHMvU2tGb250TWdyX2ZvbnRjb25maWcuY3BwCmluZGV4IGE3ZjgxMjguLjFhNDJmNTUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0ZvbnRNZ3JfZm9udGNvbmZpZy5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ZvbnRzL1NrRm9udE1ncl9mb250Y29uZmlnLmNwcApAQCAtMjkwLDcgKzI5MCw3IEBACiAKICAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbURhdGEoU2tEYXRhKiwgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7IHJldHVybiBOVUxMOyB9CiAKLSAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbSogc3RyZWFtLCBpbnQgdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKKyAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbUFzc2V0KiBzdHJlYW0sIGludCB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgewogICAgICAgICBjb25zdCBzaXplX3QgbGVuZ3RoID0gc3RyZWFtLT5nZXRMZW5ndGgoKTsKICAgICAgICAgaWYgKCFsZW5ndGgpIHsKICAgICAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMzExLDcgKzMxMSw3IEBACiAgICAgfQogCiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21GaWxlKGNvbnN0IGNoYXIgcGF0aFtdLCBpbnQgdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKLSAgICAgICAgU2tBdXRvVFVucmVmPFNrU3RyZWFtPiBzdHJlYW0oU2tTdHJlYW06Ok5ld0Zyb21GaWxlKHBhdGgpKTsKKyAgICAgICAgU2tBdXRvVFVucmVmPFNrU3RyZWFtQXNzZXQ+IHN0cmVhbShTa1N0cmVhbTo6TmV3RnJvbUZpbGUocGF0aCkpOwogICAgICAgICByZXR1cm4gc3RyZWFtLmdldCgpID8gdGhpcy0+Y3JlYXRlRnJvbVN0cmVhbShzdHJlYW0sIHR0Y0luZGV4KSA6IE5VTEw7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvZm9udHMvU2tGb250TWdyX2luZGlyZWN0LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0ZvbnRNZ3JfaW5kaXJlY3QuY3BwCmluZGV4IGM5ZDMwMjUuLjVlZGRjMTEgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0ZvbnRNZ3JfaW5kaXJlY3QuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0ZvbnRNZ3JfaW5kaXJlY3QuY3BwCkBAIC0yMTMsNyArMjEzLDcgQEAKIAogICAgIC8vIE5vIGV4YWN0IG1hdGNoLCBidXQgZGlkIGZpbmQgYSBkYXRhIG1hdGNoLgogICAgIGlmIChkYXRhVHlwZWZhY2UuZ2V0KCkgIT0gTlVMTCkgewotICAgICAgICBTa0F1dG9UVW5yZWY8U2tTdHJlYW0+IHN0cmVhbShkYXRhVHlwZWZhY2UtPm9wZW5TdHJlYW0oTlVMTCkpOworICAgICAgICBTa0F1dG9UVW5yZWY8U2tTdHJlYW1Bc3NldD4gc3RyZWFtKGRhdGFUeXBlZmFjZS0+b3BlblN0cmVhbShOVUxMKSk7CiAgICAgICAgIGlmIChzdHJlYW0uZ2V0KCkgIT0gTlVMTCkgewogICAgICAgICAgICAgcmV0dXJuIGZJbXBsLT5jcmVhdGVGcm9tU3RyZWFtKHN0cmVhbS5nZXQoKSwgZGF0YVR5cGVmYWNlSW5kZXgpOwogICAgICAgICB9CkBAIC0yNzIsNyArMjcyLDcgQEAKICAgICByZXR1cm4gdGhpcy0+bWF0Y2hGYW1pbHlTdHlsZShmYW1pbHlOYW1lLmNfc3RyKCksIGZvbnRTdHlsZSk7CiB9CiAKLVNrVHlwZWZhY2UqIFNrRm9udE1ncl9JbmRpcmVjdDo6b25DcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtKiBzdHJlYW0sIGludCB0dGNJbmRleCkgY29uc3QgeworU2tUeXBlZmFjZSogU2tGb250TWdyX0luZGlyZWN0OjpvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW1Bc3NldCogc3RyZWFtLCBpbnQgdHRjSW5kZXgpIGNvbnN0IHsKICAgICByZXR1cm4gZkltcGwtPmNyZWF0ZUZyb21TdHJlYW0oc3RyZWFtLCB0dGNJbmRleCk7CiB9CiAKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0dTY2FsZXJDb250ZXh0LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0dTY2FsZXJDb250ZXh0LmNwcAppbmRleCAzNGE3ODhhLi5jZjE3MGJjIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvZm9udHMvU2tHU2NhbGVyQ29udGV4dC5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ZvbnRzL1NrR1NjYWxlckNvbnRleHQuY3BwCkBAIC0xODQsNyArMTg0LDcgQEAKICAgICByZXR1cm4gZlByb3h5LT5nZXRBZHZhbmNlZFR5cGVmYWNlTWV0cmljcyhpbmZvLCBnbHlwaElEcywgZ2x5cGhJRHNDb3VudCk7CiB9CiAKLVNrU3RyZWFtKiBTa0dUeXBlZmFjZTo6b25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IHsKK1NrU3RyZWFtQXNzZXQqIFNrR1R5cGVmYWNlOjpvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgewogICAgIHJldHVybiBmUHJveHktPm9wZW5TdHJlYW0odHRjSW5kZXgpOwogfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvZm9udHMvU2tHU2NhbGVyQ29udGV4dC5oIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ZvbnRzL1NrR1NjYWxlckNvbnRleHQuaAppbmRleCA4YWQyODE3Li5jODBmZmM5IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvZm9udHMvU2tHU2NhbGVyQ29udGV4dC5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta0dTY2FsZXJDb250ZXh0LmgKQEAgLTI2LDcgKzI2LDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrQWR2YW5jZWRUeXBlZmFjZU1ldHJpY3M6OlBlckdseXBoSW5mbywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQzMl90KiBnbHlwaElEcywKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90IGdseXBoSURzQ291bnQpIGNvbnN0IFNLX09WRVJSSURFOwotICAgIHZpcnR1YWwgU2tTdHJlYW0qIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERTsKKyAgICB2aXJ0dWFsIFNrU3RyZWFtQXNzZXQqIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERTsKICAgICB2aXJ0dWFsIHZvaWQgb25HZXRGb250RGVzY3JpcHRvcihTa0ZvbnREZXNjcmlwdG9yKiwgYm9vbCogaXNMb2NhbCkgY29uc3QgU0tfT1ZFUlJJREU7CiAKICAgICB2aXJ0dWFsIGludCBvbkNoYXJzVG9HbHlwaHMoY29uc3Qgdm9pZCogY2hhcnMsIEVuY29kaW5nIGVuY29kaW5nLApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ZvbnRzL1NrVGVzdFNjYWxlckNvbnRleHQuaCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9mb250cy9Ta1Rlc3RTY2FsZXJDb250ZXh0LmgKaW5kZXggNDJmNjA0OS4uZjkzZmU0YiAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL2ZvbnRzL1NrVGVzdFNjYWxlckNvbnRleHQuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvZm9udHMvU2tUZXN0U2NhbGVyQ29udGV4dC5oCkBAIC03Myw3ICs3Myw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50MzJfdCogZ2x5cGhJRHMsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCBnbHlwaElEc0NvdW50KSBjb25zdCBTS19PVkVSUklERTsKIAotICAgIHZpcnR1YWwgU2tTdHJlYW0qIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CisgICAgdmlydHVhbCBTa1N0cmVhbUFzc2V0KiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgewogICAgICAgICBTa0FTU0VSVCgwKTsgIC8vIGRvbid0IGV4cGVjdCB0byBnZXQgaGVyZQogICAgICAgICByZXR1cm4gTlVMTDsKICAgICB9CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvZ3B1L2dsL0dyR0xQYXRoUmVuZGVyaW5nLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9ncHUvZ2wvR3JHTFBhdGhSZW5kZXJpbmcuY3BwCmluZGV4IDI2NTg0YmMuLjFmNGZlODkgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9ncHUvZ2wvR3JHTFBhdGhSZW5kZXJpbmcuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9ncHUvZ2wvR3JHTFBhdGhSZW5kZXJpbmcuY3BwCkBAIC0xMTQsNyArMTE0LDcgQEAKICAgICB9CiAKICAgICBpbnQgZmFjZUluZGV4OwotICAgIFNrQXV0b1RVbnJlZjxTa1N0cmVhbT4gZm9udFN0cmVhbSh0eXBlZmFjZS0+b3BlblN0cmVhbSgmZmFjZUluZGV4KSk7CisgICAgU2tBdXRvVFVucmVmPFNrU3RyZWFtQXNzZXQ+IGZvbnRTdHJlYW0odHlwZWZhY2UtPm9wZW5TdHJlYW0oJmZhY2VJbmRleCkpOwogCiAgICAgY29uc3Qgc2l6ZV90IGZvbnREYXRhTGVuZ3RoID0gZm9udFN0cmVhbS0+Z2V0TGVuZ3RoKCk7CiAgICAgaWYgKDAgPT0gZm9udERhdGFMZW5ndGgpIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRDb25maWdJbnRlcmZhY2VfZGlyZWN0LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRDb25maWdJbnRlcmZhY2VfZGlyZWN0LmNwcAppbmRleCAwMzlkODY4Li41M2ViZGE2IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnSW50ZXJmYWNlX2RpcmVjdC5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udENvbmZpZ0ludGVyZmFjZV9kaXJlY3QuY3BwCkBAIC0xMTIsNyArMTEyLDcgQEAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZvbnRJZGVudGl0eSogb3V0Rm9udElkZW50aWZpZXIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBTa1N0cmluZyogb3V0RmFtaWx5TmFtZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFNrVHlwZWZhY2U6OlN0eWxlKiBvdXRTdHlsZSkgU0tfT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBTa1N0cmVhbSogb3BlblN0cmVhbShjb25zdCBGb250SWRlbnRpdHkmKSBTS19PVkVSUklERTsKKyAgICB2aXJ0dWFsIFNrU3RyZWFtQXNzZXQqIG9wZW5TdHJlYW0oY29uc3QgRm9udElkZW50aXR5JikgU0tfT1ZFUlJJREU7CiAKICAgICAvLyBuZXcgQVBJcwogICAgIHZpcnR1YWwgU2tEYXRhVGFibGUqIGdldEZhbWlseU5hbWVzKCkgU0tfT1ZFUlJJREU7CkBAIC01NTIsNyArNTUyLDcgQEAKICAgICByZXR1cm4gdHJ1ZTsKIH0KIAotU2tTdHJlYW0qIFNrRm9udENvbmZpZ0ludGVyZmFjZURpcmVjdDo6b3BlblN0cmVhbShjb25zdCBGb250SWRlbnRpdHkmIGlkZW50aXR5KSB7CitTa1N0cmVhbUFzc2V0KiBTa0ZvbnRDb25maWdJbnRlcmZhY2VEaXJlY3Q6Om9wZW5TdHJlYW0oY29uc3QgRm9udElkZW50aXR5JiBpZGVudGl0eSkgewogICAgIHJldHVybiBTa1N0cmVhbTo6TmV3RnJvbUZpbGUoaWRlbnRpdHkuZlN0cmluZy5jX3N0cigpKTsKIH0KIApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udENvbmZpZ1R5cGVmYWNlLmggYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnVHlwZWZhY2UuaAppbmRleCBmNjJkOTlkLi41YmU0NzY0IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnVHlwZWZhY2UuaAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250Q29uZmlnVHlwZWZhY2UuaApAQCAtMTUsNyArMTUsNyBAQAogY2xhc3MgRm9udENvbmZpZ1R5cGVmYWNlIDogcHVibGljIFNrVHlwZWZhY2VfRnJlZVR5cGUgewogICAgIFNrRm9udENvbmZpZ0ludGVyZmFjZTo6Rm9udElkZW50aXR5IGZJZGVudGl0eTsKICAgICBTa1N0cmluZyBmRmFtaWx5TmFtZTsKLSAgICBTa1N0cmVhbSogZkxvY2FsU3RyZWFtOworICAgIFNrU3RyZWFtQXNzZXQqIGZMb2NhbFN0cmVhbTsKIAogcHVibGljOgogICAgIHN0YXRpYyBGb250Q29uZmlnVHlwZWZhY2UqIENyZWF0ZShTdHlsZSBzdHlsZSwKQEAgLTI0LDcgKzI0LDcgQEAKICAgICAgICAgcmV0dXJuIFNrTkVXX0FSR1MoRm9udENvbmZpZ1R5cGVmYWNlLCAoc3R5bGUsIGZpLCBmYW1pbHlOYW1lKSk7CiAgICAgfQogCi0gICAgc3RhdGljIEZvbnRDb25maWdUeXBlZmFjZSogQ3JlYXRlKFN0eWxlIHN0eWxlLCBib29sIGZpeGVkV2lkdGgsIFNrU3RyZWFtKiBsb2NhbFN0cmVhbSkgeworICAgIHN0YXRpYyBGb250Q29uZmlnVHlwZWZhY2UqIENyZWF0ZShTdHlsZSBzdHlsZSwgYm9vbCBmaXhlZFdpZHRoLCBTa1N0cmVhbUFzc2V0KiBsb2NhbFN0cmVhbSkgewogICAgICAgICByZXR1cm4gU2tORVdfQVJHUyhGb250Q29uZmlnVHlwZWZhY2UsIChzdHlsZSwgZml4ZWRXaWR0aCwgbG9jYWxTdHJlYW0pKTsKICAgICB9CiAKQEAgLTM3LDcgKzM3LDcgQEAKICAgICB9CiAKICAgICBjb25zdCBjaGFyKiBnZXRGYW1pbHlOYW1lKCkgY29uc3QgeyByZXR1cm4gZkZhbWlseU5hbWUuY19zdHIoKTsgfQotICAgIFNrU3RyZWFtKiAgIGdldExvY2FsU3RyZWFtKCkgY29uc3QgeyByZXR1cm4gZkxvY2FsU3RyZWFtOyB9CisgICAgU2tTdHJlYW1Bc3NldCogICBnZXRMb2NhbFN0cmVhbSgpIGNvbnN0IHsgcmV0dXJuIGZMb2NhbFN0cmVhbTsgfQogCiAgICAgYm9vbCBpc0ZhbWlseU5hbWUoY29uc3QgY2hhciogbmFtZSkgY29uc3QgewogICAgICAgICByZXR1cm4gZkZhbWlseU5hbWUuZXF1YWxzKG5hbWUpOwpAQCAtNTgsNyArNTgsNyBAQAogICAgICAgICAgICAgLCBmRmFtaWx5TmFtZShmYW1pbHlOYW1lKQogICAgICAgICAgICAgLCBmTG9jYWxTdHJlYW0oTlVMTCkge30KIAotICAgIEZvbnRDb25maWdUeXBlZmFjZShTdHlsZSBzdHlsZSwgYm9vbCBmaXhlZFdpZHRoLCBTa1N0cmVhbSogbG9jYWxTdHJlYW0pCisgICAgRm9udENvbmZpZ1R5cGVmYWNlKFN0eWxlIHN0eWxlLCBib29sIGZpeGVkV2lkdGgsIFNrU3RyZWFtQXNzZXQqIGxvY2FsU3RyZWFtKQogICAgICAgICAgICAgOiBJTkhFUklURUQoc3R5bGUsIFNrVHlwZWZhY2VDYWNoZTo6TmV3Rm9udElEKCksIGZpeGVkV2lkdGgpIHsKICAgICAgICAgLy8gd2UgZGVmYXVsdCB0byBlbXB0eSBmRmFtaWx5TmFtZSBhbmQgZklkZW50aXR5CiAgICAgICAgIGZMb2NhbFN0cmVhbSA9IGxvY2FsU3RyZWFtOwpAQCAtNjcsNyArNjcsNyBAQAogCiAgICAgdmlydHVhbCB2b2lkIG9uR2V0RmFtaWx5TmFtZShTa1N0cmluZyogZmFtaWx5TmFtZSkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCB2b2lkIG9uR2V0Rm9udERlc2NyaXB0b3IoU2tGb250RGVzY3JpcHRvciosIGJvb2wqKSBjb25zdCBTS19PVkVSUklERTsKLSAgICB2aXJ0dWFsIFNrU3RyZWFtKiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CisgICAgdmlydHVhbCBTa1N0cmVhbUFzc2V0KiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CiAKIHByaXZhdGU6CiAgICAgdHlwZWRlZiBTa1R5cGVmYWNlX0ZyZWVUeXBlIElOSEVSSVRFRDsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRIb3N0X0ZyZWVUeXBlLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRIb3N0X0ZyZWVUeXBlLmNwcAppbmRleCA1ZTg0MzY1Li5iMGY4ZTEwIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250SG9zdF9GcmVlVHlwZS5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udEhvc3RfRnJlZVR5cGUuY3BwCkBAIC0yNDMsNDQgKzI0MywzMiBAQAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCiAKIHN0cnVjdCBTa0ZhY2VSZWMgewotICAgIFNrRmFjZVJlYyogICAgICBmTmV4dDsKLSAgICBGVF9GYWNlICAgICAgICAgZkZhY2U7Ci0gICAgRlRfU3RyZWFtUmVjICAgIGZGVFN0cmVhbTsKLSAgICBTa1N0cmVhbSogICAgICAgZlNrU3RyZWFtOwotICAgIHVpbnQzMl90ICAgICAgICBmUmVmQ250OwotICAgIHVpbnQzMl90ICAgICAgICBmRm9udElEOworICAgIFNrRmFjZVJlYyogZk5leHQ7CisgICAgRlRfRmFjZSBmRmFjZTsKKyAgICBGVF9TdHJlYW1SZWMgZkZUU3RyZWFtOworICAgIFNrU3RyZWFtQXNzZXQqICBmU2tTdHJlYW07CisgICAgdWludDMyX3QgZlJlZkNudDsKKyAgICB1aW50MzJfdCBmRm9udElEOwogCiAgICAgLy8gYXNzdW1lcyBvd25lcnNoaXAgb2YgdGhlIHN0cmVhbSwgd2lsbCBjYWxsIHVucmVmKCkgd2hlbiBpdHMgZG9uZQotICAgIFNrRmFjZVJlYyhTa1N0cmVhbSogc3RybSwgdWludDMyX3QgZm9udElEKTsKKyAgICBTa0ZhY2VSZWMoU2tTdHJlYW1Bc3NldCogc3RybSwgdWludDMyX3QgZm9udElEKTsKICAgICB+U2tGYWNlUmVjKCkgewogICAgICAgICBmU2tTdHJlYW0tPnVucmVmKCk7CiAgICAgfQogfTsKIAogZXh0ZXJuICJDIiB7Ci0gICAgc3RhdGljIHVuc2lnbmVkIGxvbmcgc2tfc3RyZWFtX3JlYWQoRlRfU3RyZWFtICAgICAgIHN0cmVhbSwKKyAgICBzdGF0aWMgdW5zaWduZWQgbG9uZyBza19mdF9zdHJlYW1faW8oRlRfU3RyZWFtIGZ0U3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgICBvZmZzZXQsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgY2hhciogIGJ1ZmZlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1bnNpZ25lZCBsb25nICAgY291bnQgKSB7Ci0gICAgICAgIFNrU3RyZWFtKiBzdHIgPSAoU2tTdHJlYW0qKXN0cmVhbS0+ZGVzY3JpcHRvci5wb2ludGVyOworICAgICAgICBTa1N0cmVhbUFzc2V0KiBzdHJlYW0gPSBzdGF0aWNfY2FzdDxTa1N0cmVhbUFzc2V0Kj4oZnRTdHJlYW0tPmRlc2NyaXB0b3IucG9pbnRlcik7CiAKICAgICAgICAgaWYgKGNvdW50KSB7Ci0gICAgICAgICAgICBpZiAoIXN0ci0+cmV3aW5kKCkpIHsKLSAgICAgICAgICAgICAgICByZXR1cm4gMDsKLSAgICAgICAgICAgIH0gZWxzZSB7Ci0gICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyByZXQ7Ci0gICAgICAgICAgICAgICAgaWYgKG9mZnNldCkgewotICAgICAgICAgICAgICAgICAgICByZXQgPSBzdHItPnJlYWQoTlVMTCwgb2Zmc2V0KTsKLSAgICAgICAgICAgICAgICAgICAgaWYgKHJldCAhPSBvZmZzZXQpIHsKLSAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgICAgICB9Ci0gICAgICAgICAgICAgICAgfQotICAgICAgICAgICAgICAgIHJldCA9IHN0ci0+cmVhZChidWZmZXIsIGNvdW50KTsKLSAgICAgICAgICAgICAgICBpZiAocmV0ICE9IGNvdW50KSB7Ci0gICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwotICAgICAgICAgICAgICAgIH0KLSAgICAgICAgICAgICAgICBjb3VudCA9IHJldDsKLSAgICAgICAgICAgIH0KKyAgICAgICAgICBpZiAoIXN0cmVhbS0+c2VlayhvZmZzZXQpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICB9CisgICAgICAgICAgY291bnQgPSBzdHJlYW0tPnJlYWQoYnVmZmVyLCBjb3VudCk7CiAgICAgICAgIH0KICAgICAgICAgcmV0dXJuIGNvdW50OwogICAgIH0KQEAgLTI4OCwxNCArMjc2LDEyIEBACiAgICAgc3RhdGljIHZvaWQgc2tfc3RyZWFtX2Nsb3NlKEZUX1N0cmVhbSkge30KIH0KIAotU2tGYWNlUmVjOjpTa0ZhY2VSZWMoU2tTdHJlYW0qIHN0cm0sIHVpbnQzMl90IGZvbnRJRCkKLSAgICAgICAgOiBmTmV4dChOVUxMKSwgZlNrU3RyZWFtKHN0cm0pLCBmUmVmQ250KDEpLCBmRm9udElEKGZvbnRJRCkgewotLy8gICAgU2tERUJVR0YoKCJTa0ZhY2VSZWM6IG9wZW5pbmcgJXMgKCVwKVxuIiwga2V5LmNfc3RyKCksIHN0cm0pKTsKLQorU2tGYWNlUmVjOjpTa0ZhY2VSZWMoU2tTdHJlYW1Bc3NldCogc3RyZWFtLCB1aW50MzJfdCBmb250SUQpCisgICAgICAgIDogZk5leHQoTlVMTCksIGZTa1N0cmVhbShzdHJlYW0pLCBmUmVmQ250KDEpLCBmRm9udElEKGZvbnRJRCkgewogICAgIHNrX2J6ZXJvKCZmRlRTdHJlYW0sIHNpemVvZihmRlRTdHJlYW0pKTsKICAgICBmRlRTdHJlYW0uc2l6ZSA9IGZTa1N0cmVhbS0+Z2V0TGVuZ3RoKCk7CiAgICAgZkZUU3RyZWFtLmRlc2NyaXB0b3IucG9pbnRlciA9IGZTa1N0cmVhbTsKLSAgICBmRlRTdHJlYW0ucmVhZCAgPSBza19zdHJlYW1fcmVhZDsKKyAgICBmRlRTdHJlYW0ucmVhZCAgPSBza19mdF9zdHJlYW1faW87CiAgICAgZkZUU3RyZWFtLmNsb3NlID0gc2tfc3RyZWFtX2Nsb3NlOwogfQogCkBAIC0zMTQsMjMgKzMwMCwyMiBAQAogICAgIH0KIAogICAgIGludCBmYWNlX2luZGV4OwotICAgIFNrU3RyZWFtKiBzdHJtID0gdHlwZWZhY2UtPm9wZW5TdHJlYW0oJmZhY2VfaW5kZXgpOwotICAgIGlmIChOVUxMID09IHN0cm0pIHsKKyAgICBTa1N0cmVhbUFzc2V0KiBzdHJlYW0gPSB0eXBlZmFjZS0+b3BlblN0cmVhbSgmZmFjZV9pbmRleCk7CisgICAgaWYgKE5VTEwgPT0gc3RyZWFtKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwogICAgIH0KIAotICAgIC8vIHRoaXMgcGFzc2VzIG93bmVyc2hpcCBvZiBzdHJtIHRvIHRoZSByZWMKLSAgICByZWMgPSBTa05FV19BUkdTKFNrRmFjZVJlYywgKHN0cm0sIGZvbnRJRCkpOworICAgIC8vIHRoaXMgcGFzc2VzIG93bmVyc2hpcCBvZiBzdHJlYW0gdG8gdGhlIHJlYworICAgIHJlYyA9IFNrTkVXX0FSR1MoU2tGYWNlUmVjLCAoc3RyZWFtLCBmb250SUQpKTsKIAogICAgIEZUX09wZW5fQXJncyAgICBhcmdzOwogICAgIG1lbXNldCgmYXJncywgMCwgc2l6ZW9mKGFyZ3MpKTsKLSAgICBjb25zdCB2b2lkKiBtZW1vcnlCYXNlID0gc3RybS0+Z2V0TWVtb3J5QmFzZSgpOwotCisgICAgY29uc3Qgdm9pZCogbWVtb3J5QmFzZSA9IHN0cmVhbS0+Z2V0TWVtb3J5QmFzZSgpOwogICAgIGlmIChtZW1vcnlCYXNlKSB7CiAvL3ByaW50ZigibW1hcCglcylcbiIsIGtleVN0cmluZy5jX3N0cigpKTsKICAgICAgICAgYXJncy5mbGFncyA9IEZUX09QRU5fTUVNT1JZOwogICAgICAgICBhcmdzLm1lbW9yeV9iYXNlID0gKGNvbnN0IEZUX0J5dGUqKW1lbW9yeUJhc2U7Ci0gICAgICAgIGFyZ3MubWVtb3J5X3NpemUgPSBzdHJtLT5nZXRMZW5ndGgoKTsKKyAgICAgICAgYXJncy5tZW1vcnlfc2l6ZSA9IHN0cmVhbS0+Z2V0TGVuZ3RoKCk7CiAgICAgfSBlbHNlIHsKIC8vcHJpbnRmKCJmb3BlbiglcylcbiIsIGtleVN0cmluZy5jX3N0cigpKTsKICAgICAgICAgYXJncy5mbGFncyA9IEZUX09QRU5fU1RSRUFNOwpAQCAtMTcwNSw3ICsxNjkwLDcgQEAKICAgICAgICAgbWVtc2V0KCZzdHJlYW1SZWMsIDAsIHNpemVvZihzdHJlYW1SZWMpKTsKICAgICAgICAgc3RyZWFtUmVjLnNpemUgPSBzdHJlYW0tPmdldExlbmd0aCgpOwogICAgICAgICBzdHJlYW1SZWMuZGVzY3JpcHRvci5wb2ludGVyID0gc3RyZWFtOwotICAgICAgICBzdHJlYW1SZWMucmVhZCAgPSBza19zdHJlYW1fcmVhZDsKKyAgICAgICAgc3RyZWFtUmVjLnJlYWQgID0gc2tfZnRfc3RyZWFtX2lvOwogICAgICAgICBzdHJlYW1SZWMuY2xvc2UgPSBza19zdHJlYW1fY2xvc2U7CiAKICAgICAgICAgYXJncy5mbGFncyA9IEZUX09QRU5fU1RSRUFNOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udEhvc3RfZm9udGNvbmZpZy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250SG9zdF9mb250Y29uZmlnLmNwcAppbmRleCBiM2E4OTNlLi4zNTNiNTVmIDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250SG9zdF9mb250Y29uZmlnLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250SG9zdF9mb250Y29uZmlnLmNwcApAQCAtMTIyLDQ0ICsxMjIsMjAgQEAKIAogLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwogCi1Ta1N0cmVhbSogRm9udENvbmZpZ1R5cGVmYWNlOjpvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgewotICAgIFNrU3RyZWFtKiBzdHJlYW0gPSB0aGlzLT5nZXRMb2NhbFN0cmVhbSgpOworU2tTdHJlYW1Bc3NldCogRm9udENvbmZpZ1R5cGVmYWNlOjpvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgeworICAgIFNrU3RyZWFtQXNzZXQqIHN0cmVhbSA9IHRoaXMtPmdldExvY2FsU3RyZWFtKCk7CiAgICAgaWYgKHN0cmVhbSkgewotICAgICAgICAvLyBzaG91bGQgaGF2ZSBiZWVuIHByb3ZpZGVkIGJ5IENyZWF0ZUZyb21TdHJlYW0oKQotICAgICAgICAqdHRjSW5kZXggPSAwOwotCi0gICAgICAgIFNrQXV0b1RVbnJlZjxTa1N0cmVhbT4gZHVwU3RyZWFtKHN0cmVhbS0+ZHVwbGljYXRlKCkpOwotICAgICAgICBpZiAoZHVwU3RyZWFtKSB7Ci0gICAgICAgICAgICByZXR1cm4gZHVwU3RyZWFtLmRldGFjaCgpOwotICAgICAgICB9Ci0KLSAgICAgICAgLy8gVE9ETzogdXBkYXRlIGludGVyZmFjZSB1c2UsIHJlbW92ZSB0aGUgZm9sbG93aW5nIGNvZGUgaW4gdGhpcyBibG9jay4KLSAgICAgICAgc2l6ZV90IGxlbmd0aCA9IHN0cmVhbS0+Z2V0TGVuZ3RoKCk7Ci0KLSAgICAgICAgY29uc3Qgdm9pZCogbWVtb3J5ID0gc3RyZWFtLT5nZXRNZW1vcnlCYXNlKCk7Ci0gICAgICAgIGlmIChtZW1vcnkpIHsKLSAgICAgICAgICAgIHJldHVybiBuZXcgU2tNZW1vcnlTdHJlYW0obWVtb3J5LCBsZW5ndGgsIHRydWUpOwotICAgICAgICB9Ci0KLSAgICAgICAgU2tBdXRvVE1hbGxvYzx1aW50OF90PiBhbGxvY01lbW9yeShsZW5ndGgpOwotICAgICAgICBzdHJlYW0tPnJld2luZCgpOwotICAgICAgICBpZiAobGVuZ3RoID09IHN0cmVhbS0+cmVhZChhbGxvY01lbW9yeS5nZXQoKSwgbGVuZ3RoKSkgewotICAgICAgICAgICAgU2tBdXRvVFVucmVmPFNrTWVtb3J5U3RyZWFtPiBjb3B5U3RyZWFtKG5ldyBTa01lbW9yeVN0cmVhbSgpKTsKLSAgICAgICAgICAgIGNvcHlTdHJlYW0tPnNldE1lbW9yeU93bmVkKGFsbG9jTWVtb3J5LmRldGFjaCgpLCBsZW5ndGgpOwotICAgICAgICAgICAgcmV0dXJuIGNvcHlTdHJlYW0uZGV0YWNoKCk7Ci0gICAgICAgIH0KLQotICAgICAgICBzdHJlYW0tPnJld2luZCgpOwotICAgICAgICBzdHJlYW0tPnJlZigpOwotICAgIH0gZWxzZSB7Ci0gICAgICAgIFNrQXV0b1RVbnJlZjxTa0ZvbnRDb25maWdJbnRlcmZhY2U+IGZjaShSZWZGQ0koKSk7Ci0gICAgICAgIGlmIChOVUxMID09IGZjaS5nZXQoKSkgewotICAgICAgICAgICAgcmV0dXJuIE5VTEw7Ci0gICAgICAgIH0KLSAgICAgICAgc3RyZWFtID0gZmNpLT5vcGVuU3RyZWFtKHRoaXMtPmdldElkZW50aXR5KCkpOwotICAgICAgICAqdHRjSW5kZXggPSB0aGlzLT5nZXRJZGVudGl0eSgpLmZUVENJbmRleDsKKyAgICAgICAgLy8gVE9ETzogc2hvdWxkIGhhdmUgYmVlbiBwcm92aWRlZCBieSBDcmVhdGVGcm9tU3RyZWFtKCkKKyAgICAgICAgcmV0dXJuIHN0cmVhbS0+ZHVwbGljYXRlKCk7CiAgICAgfQotICAgIHJldHVybiBzdHJlYW07CisKKyAgICBTa0F1dG9UVW5yZWY8U2tGb250Q29uZmlnSW50ZXJmYWNlPiBmY2koUmVmRkNJKCkpOworICAgIGlmIChOVUxMID09IGZjaS5nZXQoKSkgeworICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgKnR0Y0luZGV4ID0gdGhpcy0+Z2V0SWRlbnRpdHkoKS5mVFRDSW5kZXg7CisgICAgcmV0dXJuIGZjaS0+b3BlblN0cmVhbSh0aGlzLT5nZXRJZGVudGl0eSgpKTsKIH0KIAogdm9pZCBGb250Q29uZmlnVHlwZWZhY2U6Om9uR2V0RmFtaWx5TmFtZShTa1N0cmluZyogZmFtaWx5TmFtZSkgY29uc3QgewpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udEhvc3RfbWFjLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRIb3N0X21hYy5jcHAKaW5kZXggYWFlNzQ2NC4uYTAzNjI1ZiAxMDA3NTUKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udEhvc3RfbWFjLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250SG9zdF9tYWMuY3BwCkBAIC00NTEsNyArNDUxLDcgQEAKICAgICBmcmllbmQgY2xhc3MgU2tGb250SG9zdDsgICAgLy8gdG8gYWNjZXNzIG91ciBwcm90ZWN0ZWQgbWVtYmVycyBmb3IgZGVwcmVjYXRlZCBtZXRob2RzCiAKICAgICB2aXJ0dWFsIGludCBvbkdldFVQRU0oKSBjb25zdCBTS19PVkVSUklERTsKLSAgICB2aXJ0dWFsIFNrU3RyZWFtKiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CisgICAgdmlydHVhbCBTa1N0cmVhbUFzc2V0KiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCB2b2lkIG9uR2V0RmFtaWx5TmFtZShTa1N0cmluZyogZmFtaWx5TmFtZSkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCBTa1R5cGVmYWNlOjpMb2NhbGl6ZWRTdHJpbmdzKiBvbkNyZWF0ZUZhbWlseU5hbWVJdGVyYXRvcigpIGNvbnN0IFNLX09WRVJSSURFOwogICAgIHZpcnR1YWwgaW50IG9uR2V0VGFibGVUYWdzKFNrRm9udFRhYmxlVGFnIHRhZ3NbXSkgY29uc3QgU0tfT1ZFUlJJREU7CkBAIC0xNjY3LDcgKzE2NjcsNyBAQAogICAgIH0KIH0KIAotU2tTdHJlYW0qIFNrVHlwZWZhY2VfTWFjOjpvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgeworU2tTdHJlYW1Bc3NldCogU2tUeXBlZmFjZV9NYWM6Om9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCB7CiAgICAgU0tfU0ZOVF9VTE9ORyBmb250VHlwZSA9IGdldF9mb250X3R5cGVfdGFnKHRoaXMpOwogICAgIGlmICgwID09IGZvbnRUeXBlKSB7CiAgICAgICAgIHJldHVybiBOVUxMOwpAQCAtMjI4Niw3ICsyMjg2LDcgQEAKICAgICAgICAgcmV0dXJuIGNyZWF0ZV9mcm9tX2RhdGFQcm92aWRlcihwcik7CiAgICAgfQogCi0gICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwKKyAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbUFzc2V0KiBzdHJlYW0sCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgICAgIEF1dG9DRlJlbGVhc2U8Q0dEYXRhUHJvdmlkZXJSZWY+IHByKFNrQ3JlYXRlRGF0YVByb3ZpZGVyRnJvbVN0cmVhbShzdHJlYW0pKTsKICAgICAgICAgaWYgKE5VTEwgPT0gcHIpIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRIb3N0X3dpbi5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250SG9zdF93aW4uY3BwCmluZGV4IDEyOTBjMDAuLmI1NTNjYzkgMTAwNzU1Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRIb3N0X3dpbi5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udEhvc3Rfd2luLmNwcApAQCAtMjY1LDcgKzI2NSw3IEBACiAgICAgfQogCiBwcm90ZWN0ZWQ6Ci0gICAgdmlydHVhbCBTa1N0cmVhbSogb25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFOworICAgIHZpcnR1YWwgU2tTdHJlYW1Bc3NldCogb25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFOwogICAgIHZpcnR1YWwgU2tTY2FsZXJDb250ZXh0KiBvbkNyZWF0ZVNjYWxlckNvbnRleHQoY29uc3QgU2tEZXNjcmlwdG9yKikgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCB2b2lkIG9uRmlsdGVyUmVjKFNrU2NhbGVyQ29udGV4dFJlYyopIGNvbnN0IFNLX09WRVJSSURFOwogICAgIHZpcnR1YWwgU2tBZHZhbmNlZFR5cGVmYWNlTWV0cmljcyogb25HZXRBZHZhbmNlZFR5cGVmYWNlTWV0cmljcygKQEAgLTIwMDUsNyArMjAwNSw3IEBACiAgICAgcmV0dXJuIGZvbnRIYW5kbGU7CiB9CiAKLXN0YXRpYyBTa1R5cGVmYWNlKiBjcmVhdGVfZnJvbV9zdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSkgeworc3RhdGljIFNrVHlwZWZhY2UqIGNyZWF0ZV9mcm9tX3N0cmVhbShTa1N0cmVhbUFzc2V0KiBzdHJlYW0pIHsKICAgICAvLyBDcmVhdGUgYSB1bmlxdWUgYW5kIHVucHJlZGljdGFibGUgZm9udCBuYW1lLgogICAgIC8vIEF2b2lkcyBjb2xsaXNpb25zIGFuZCBhY2Nlc3MgZnJvbSBDU1MuCiAgICAgY2hhciBmYW1pbHlOYW1lW0JBU0U2NF9HVUlEX0lEX0xFTl07CkBAIC0yMDMzLDcgKzIwMzMsNyBAQAogICAgIHJldHVybiBTa0NyZWF0ZUZvbnRNZW1SZXNvdXJjZVR5cGVmYWNlRnJvbUxPR0ZPTlQobGYsIGZvbnRSZWZlcmVuY2UpOwogfQogCi1Ta1N0cmVhbSogTG9nRm9udFR5cGVmYWNlOjpvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgeworU2tTdHJlYW1Bc3NldCogTG9nRm9udFR5cGVmYWNlOjpvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgewogICAgICp0dGNJbmRleCA9IDA7CiAKICAgICBjb25zdCBEV09SRCBrVFRDVGFnID0KQEAgLTI1NjEsNyArMjU2MSw3IEBACiAgICAgICAgIHJldHVybiB0aGlzLT5tYXRjaEZhbWlseVN0eWxlKGZhbWlseU5hbWUuY19zdHIoKSwgZm9udHN0eWxlKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbSogc3RyZWFtLCBpbnQgdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKKyAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbUFzc2V0KiBzdHJlYW0sIGludCB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgewogICAgICAgICByZXR1cm4gY3JlYXRlX2Zyb21fc3RyZWFtKHN0cmVhbSk7CiAgICAgfQogCmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2FuZHJvaWQuY3BwIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9hbmRyb2lkLmNwcAppbmRleCAxMTI2Yjc1Li5lMTgzMDE1IDEwMDY0NAotLS0gYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2FuZHJvaWQuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfYW5kcm9pZC5jcHAKQEAgLTg0LDcgKzg0LDcgQEAKICAgICAgICAgZGVzYy0+c2V0Rm9udEluZGV4KGZJbmRleCk7CiAgICAgICAgICpzZXJpYWxpemUgPSBmYWxzZTsKICAgICB9Ci0gICAgdmlydHVhbCBTa1N0cmVhbSogb25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKKyAgICB2aXJ0dWFsIFNrU3RyZWFtQXNzZXQqIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgICAgICp0dGNJbmRleCA9IGZJbmRleDsKICAgICAgICAgcmV0dXJuIFNrU3RyZWFtOjpOZXdGcm9tRmlsZShmUGF0aE5hbWUuY19zdHIoKSk7CiAgICAgfQpAQCAtOTgsNyArOTgsNyBAQAogCiBjbGFzcyBTa1R5cGVmYWNlX0FuZHJvaWRTdHJlYW0gOiBwdWJsaWMgU2tUeXBlZmFjZV9BbmRyb2lkIHsKIHB1YmxpYzoKLSAgICBTa1R5cGVmYWNlX0FuZHJvaWRTdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwKKyAgICBTa1R5cGVmYWNlX0FuZHJvaWRTdHJlYW0oU2tTdHJlYW1Bc3NldCogc3RyZWFtLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgaW5kZXgsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFN0eWxlIHN0eWxlLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGlzRml4ZWRQaXRjaCwKQEAgLTExNSwxMyArMTE1LDEzIEBACiAgICAgICAgICpzZXJpYWxpemUgPSB0cnVlOwogICAgIH0KIAotICAgIHZpcnR1YWwgU2tTdHJlYW0qIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CisgICAgdmlydHVhbCBTa1N0cmVhbUFzc2V0KiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgewogICAgICAgICAqdHRjSW5kZXggPSBmSW5kZXg7CiAgICAgICAgIHJldHVybiBmU3RyZWFtLT5kdXBsaWNhdGUoKTsKICAgICB9CiAKIHByaXZhdGU6Ci0gICAgU2tBdXRvVFVucmVmPFNrU3RyZWFtPiBmU3RyZWFtOworICAgIFNrQXV0b1RVbnJlZjxTa1N0cmVhbUFzc2V0PiBmU3RyZWFtOwogCiAgICAgdHlwZWRlZiBTa1R5cGVmYWNlX0FuZHJvaWQgSU5IRVJJVEVEOwogfTsKQEAgLTQyNywxMSArNDI3LDExIEBACiAgICAgfQogCiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21GaWxlKGNvbnN0IGNoYXIgcGF0aFtdLCBpbnQgdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKLSAgICAgICAgU2tBdXRvVFVucmVmPFNrU3RyZWFtPiBzdHJlYW0oU2tTdHJlYW06Ok5ld0Zyb21GaWxlKHBhdGgpKTsKKyAgICAgICAgU2tBdXRvVFVucmVmPFNrU3RyZWFtQXNzZXQ+IHN0cmVhbShTa1N0cmVhbTo6TmV3RnJvbUZpbGUocGF0aCkpOwogICAgICAgICByZXR1cm4gc3RyZWFtLmdldCgpID8gdGhpcy0+Y3JlYXRlRnJvbVN0cmVhbShzdHJlYW0sIHR0Y0luZGV4KSA6IE5VTEw7CiAgICAgfQogCi0gICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CisgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW1Bc3NldCogc3RyZWFtLCBpbnQgdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKICAgICAgICAgYm9vbCBpc0ZpeGVkUGl0Y2g7CiAgICAgICAgIFNrVHlwZWZhY2U6OlN0eWxlIHN0eWxlOwogICAgICAgICBTa1N0cmluZyBuYW1lOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9mb250Y29uZmlnLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3JfZm9udGNvbmZpZy5jcHAKaW5kZXggMzhmMGUzYS4uYzM5MTVkMyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl9mb250Y29uZmlnLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX2ZvbnRjb25maWcuY3BwCkBAIC0zOTgsNyArMzk4LDcgQEAKICAgICAgICAgKnNlcmlhbGl6ZSA9IHRydWU7CiAgICAgfQogCi0gICAgdmlydHVhbCBTa1N0cmVhbSogb25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKKyAgICB2aXJ0dWFsIFNrU3RyZWFtQXNzZXQqIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgICAgICp0dGNJbmRleCA9IGZJbmRleDsKICAgICAgICAgcmV0dXJuIGZTdHJlYW0tPmR1cGxpY2F0ZSgpOwogICAgIH0KQEAgLTQzMiw3ICs0MzIsNyBAQAogICAgICAgICAqc2VyaWFsaXplID0gZmFsc2U7CiAgICAgfQogCi0gICAgdmlydHVhbCBTa1N0cmVhbSogb25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IFNLX09WRVJSSURFIHsKKyAgICB2aXJ0dWFsIFNrU3RyZWFtQXNzZXQqIG9uT3BlblN0cmVhbShpbnQqIHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgICAgIEZDTG9ja2VyIGxvY2s7CiAgICAgICAgICp0dGNJbmRleCA9IGdldF9pbnQoZlBhdHRlcm4sIEZDX0lOREVYLCAwKTsKICAgICAgICAgcmV0dXJuIFNrU3RyZWFtOjpOZXdGcm9tRmlsZShnZXRfc3RyaW5nKGZQYXR0ZXJuLCBGQ19GSUxFKSk7CkBAIC04MjYsNyArODI2LDcgQEAKICAgICB9CiAKICAgICAvKiogQHBhcmFtIHN0cmVhbSBkb2VzIG5vdCB0YWtlIG93bmVyc2hpcCBvZiB0aGUgcmVmZXJlbmNlLiAqLwotICAgIHZpcnR1YWwgU2tUeXBlZmFjZSogb25DcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtKiBzdHJlYW0sIGludCB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREUgeworICAgIHZpcnR1YWwgU2tUeXBlZmFjZSogb25DcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtQXNzZXQqIHN0cmVhbSwgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERSB7CiAgICAgICAgIGNvbnN0IHNpemVfdCBsZW5ndGggPSBzdHJlYW0tPmdldExlbmd0aCgpOwogICAgICAgICBpZiAobGVuZ3RoIDw9IDAgfHwgKDF1IDw8IDMwKSA8IGxlbmd0aCkgewogICAgICAgICAgICAgcmV0dXJuIE5VTEw7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX3dpbl9kdy5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tGb250TWdyX3dpbl9kdy5jcHAKaW5kZXggZWNjYTU3Zi4uY2E5MDY3MyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrRm9udE1ncl93aW5fZHcuY3BwCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta0ZvbnRNZ3Jfd2luX2R3LmNwcApAQCAtMjcyLDcgKzI3Miw3IEBACiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tGb250U3R5bGUmIGZvbnRzdHlsZSkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbk1hdGNoRmFjZVN0eWxlKGNvbnN0IFNrVHlwZWZhY2UqIGZhbWlseU1lbWJlciwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgU2tGb250U3R5bGUmIGZvbnRzdHlsZSkgY29uc3QgU0tfT1ZFUlJJREU7Ci0gICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21TdHJlYW0oU2tTdHJlYW0qIHN0cmVhbSwgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERTsKKyAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbUFzc2V0KiBzdHJlYW0sIGludCB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkNyZWF0ZUZyb21EYXRhKFNrRGF0YSogZGF0YSwgaW50IHR0Y0luZGV4KSBjb25zdCBTS19PVkVSUklERTsKICAgICB2aXJ0dWFsIFNrVHlwZWZhY2UqIG9uQ3JlYXRlRnJvbUZpbGUoY29uc3QgY2hhciBwYXRoW10sIGludCB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCBTa1R5cGVmYWNlKiBvbkxlZ2FjeUNyZWF0ZVR5cGVmYWNlKGNvbnN0IGNoYXIgZmFtaWx5TmFtZVtdLApAQCAtNTIzLDcgKzUyMyw3IEBACiAgICAgVCogZlVucmVnaXN0ZXI7CiB9OwogCi1Ta1R5cGVmYWNlKiBTa0ZvbnRNZ3JfRGlyZWN0V3JpdGU6Om9uQ3JlYXRlRnJvbVN0cmVhbShTa1N0cmVhbSogc3RyZWFtLCBpbnQgdHRjSW5kZXgpIGNvbnN0IHsKK1NrVHlwZWZhY2UqIFNrRm9udE1ncl9EaXJlY3RXcml0ZTo6b25DcmVhdGVGcm9tU3RyZWFtKFNrU3RyZWFtQXNzZXQqIHN0cmVhbSwgaW50IHR0Y0luZGV4KSBjb25zdCB7CiAgICAgU2tUU2NvcGVkQ29tUHRyPFN0cmVhbUZvbnRGaWxlTG9hZGVyPiBmb250RmlsZUxvYWRlcjsKICAgICBIUk4oU3RyZWFtRm9udEZpbGVMb2FkZXI6OkNyZWF0ZShzdHJlYW0sICZmb250RmlsZUxvYWRlcikpOwogICAgIEhSTihmRmFjdG9yeS0+UmVnaXN0ZXJGb250RmlsZUxvYWRlcihmb250RmlsZUxvYWRlci5nZXQoKSkpOwpkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrVHlwZWZhY2Vfd2luX2R3LmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta1R5cGVmYWNlX3dpbl9kdy5jcHAKaW5kZXggOGI5ZWQxNi4uMzcwNWQxNCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3BvcnRzL1NrVHlwZWZhY2Vfd2luX2R3LmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tUeXBlZmFjZV93aW5fZHcuY3BwCkBAIC0yMDksNyArMjA5LDcgQEAKICAgICByZXR1cm4gc2l6ZTsKIH0KIAotU2tTdHJlYW0qIERXcml0ZUZvbnRUeXBlZmFjZTo6b25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IHsKK1NrU3RyZWFtQXNzZXQqIERXcml0ZUZvbnRUeXBlZmFjZTo6b25PcGVuU3RyZWFtKGludCogdHRjSW5kZXgpIGNvbnN0IHsKICAgICAqdHRjSW5kZXggPSBmRFdyaXRlRm9udEZhY2UtPkdldEluZGV4KCk7CiAKICAgICBVSU5UMzIgbnVtRmlsZXM7CmRpZmYgLS1naXQgYS9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvcG9ydHMvU2tUeXBlZmFjZV93aW5fZHcuaCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta1R5cGVmYWNlX3dpbl9kdy5oCmluZGV4IDUzMWRjNTEuLjFiNWU2MWUgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta1R5cGVmYWNlX3dpbl9kdy5oCisrKyBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9wb3J0cy9Ta1R5cGVmYWNlX3dpbl9kdy5oCkBAIC0xMDAsNyArMTAwLDcgQEAKICAgICAgICAgSU5IRVJJVEVEOjp3ZWFrX2Rpc3Bvc2UoKTsKICAgICB9CiAKLSAgICB2aXJ0dWFsIFNrU3RyZWFtKiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CisgICAgdmlydHVhbCBTa1N0cmVhbUFzc2V0KiBvbk9wZW5TdHJlYW0oaW50KiB0dGNJbmRleCkgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCBTa1NjYWxlckNvbnRleHQqIG9uQ3JlYXRlU2NhbGVyQ29udGV4dChjb25zdCBTa0Rlc2NyaXB0b3IqKSBjb25zdCBTS19PVkVSUklERTsKICAgICB2aXJ0dWFsIHZvaWQgb25GaWx0ZXJSZWMoU2tTY2FsZXJDb250ZXh0UmVjKikgY29uc3QgU0tfT1ZFUlJJREU7CiAgICAgdmlydHVhbCBTa0FkdmFuY2VkVHlwZWZhY2VNZXRyaWNzKiBvbkdldEFkdmFuY2VkVHlwZWZhY2VNZXRyaWNzKApkaWZmIC0tZ2l0IGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3NmbnQvU2tPVFV0aWxzLmNwcCBiL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9zZm50L1NrT1RVdGlscy5jcHAKaW5kZXggMGUwMDk1Mi4uNzEyMzk3YyAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3NmbnQvU2tPVFV0aWxzLmNwcAorKysgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS9zcmMvc2ZudC9Ta09UVXRpbHMuY3BwCkBAIC0zMyw3ICszMyw3IEBACiAgICAgcmV0dXJuIHN1bTsKIH0KIAotU2tEYXRhKiBTa09UVXRpbHM6OlJlbmFtZUZvbnQoU2tTdHJlYW0qIGZvbnREYXRhLCBjb25zdCBjaGFyKiBmb250TmFtZSwgaW50IGZvbnROYW1lTGVuKSB7CitTa0RhdGEqIFNrT1RVdGlsczo6UmVuYW1lRm9udChTa1N0cmVhbUFzc2V0KiBmb250RGF0YSwgY29uc3QgY2hhciogZm9udE5hbWUsIGludCBmb250TmFtZUxlbikgewogCiAgICAgLy8gR2V0IHRoZSBzZm50IGhlYWRlci4KICAgICBTa1NGTlRIZWFkZXIgc2ZudEhlYWRlcjsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3NyYy9zZm50L1NrT1RVdGlscy5oIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3NmbnQvU2tPVFV0aWxzLmgKaW5kZXggNDgyNWZiZS4uZjdmMGI1MCAxMDA2NDQKLS0tIGEvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3NmbnQvU2tPVFV0aWxzLmgKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvc3JjL3NmbnQvU2tPVFV0aWxzLmgKQEAgLTM0LDcgKzM0LDcgQEAKICAgICAgICoKICAgICAgICogIGZvbnROYW1lIGFuZCBmb250TmFtZUxlbiBtdXN0IGJlIHNwZWNpZmllZCBpbiB0ZXJtcyBvZiBBU0NJSSBjaGFycy4KICAgICAgICovCi0gICAgc3RhdGljIFNrRGF0YSogUmVuYW1lRm9udChTa1N0cmVhbSogZm9udERhdGEsIGNvbnN0IGNoYXIqIGZvbnROYW1lLCBpbnQgZm9udE5hbWVMZW4pOworICAgIHN0YXRpYyBTa0RhdGEqIFJlbmFtZUZvbnQoU2tTdHJlYW1Bc3NldCogZm9udERhdGEsIGNvbnN0IGNoYXIqIGZvbnROYW1lLCBpbnQgZm9udE5hbWVMZW4pOwogCiAgICAgLyoqIEFuIGltcGxlbWVudGF0aW9uIG9mIExvY2FsaXplZFN0cmluZ3Mgd2hpY2ggb2J0YWlucyBpdCdzIGRhdGEgZnJvbSBhICduYW1lJyB0YWJsZS4gKi8KICAgICBjbGFzcyBMb2NhbGl6ZWRTdHJpbmdzX05hbWVUYWJsZSA6IHB1YmxpYyBTa1R5cGVmYWNlOjpMb2NhbGl6ZWRTdHJpbmdzIHsKZGlmZiAtLWdpdCBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3Rlc3RzL0ZvbnRIb3N0U3RyZWFtVGVzdC5jcHAgYi9zcmMvdGhpcmRfcGFydHkvc2tpYS90ZXN0cy9Gb250SG9zdFN0cmVhbVRlc3QuY3BwCmluZGV4IGEyMjU0ZmQuLmQ0YTQ5MjQgMTAwNjQ0Ci0tLSBhL3NyYy90aGlyZF9wYXJ0eS9za2lhL3Rlc3RzL0ZvbnRIb3N0U3RyZWFtVGVzdC5jcHAKKysrIGIvc3JjL3RoaXJkX3BhcnR5L3NraWEvdGVzdHMvRm9udEhvc3RTdHJlYW1UZXN0LmNwcApAQCAtOTcsNyArOTcsNyBAQAogICAgICAgICB9CiAKICAgICAgICAgaW50IHR0Y0luZGV4OwotICAgICAgICBTa0F1dG9UVW5yZWY8U2tTdHJlYW0+IGZvbnREYXRhKG9yaWdUeXBlZmFjZS0+b3BlblN0cmVhbSgmdHRjSW5kZXgpKTsKKyAgICAgICAgU2tBdXRvVFVucmVmPFNrU3RyZWFtQXNzZXQ+IGZvbnREYXRhKG9yaWdUeXBlZmFjZS0+b3BlblN0cmVhbSgmdHRjSW5kZXgpKTsKICAgICAgICAgU2tUeXBlZmFjZSogc3RyZWFtVHlwZWZhY2UgPSBTa1R5cGVmYWNlOjpDcmVhdGVGcm9tU3RyZWFtKGZvbnREYXRhKTsKIAogICAgICAgICBTa0ZvbnREZXNjcmlwdG9yIGRlc2M7Cg==